From 6643c210f9e9deb7eb1823c1f70ea0b996b0a916 Mon Sep 17 00:00:00 2001 From: sunerok Date: Sun, 31 Dec 2017 02:30:58 -0500 Subject: [PATCH 01/54] upload --- src/init.cpp | 120 +- src/init.h | 1 + src/net.cpp | 268 +- src/net.h | 5 +- src/tor/.gitignore | 235 - src/tor/.gitlab-ci.yml | 45 - src/tor/.gitmodules | 3 - src/tor/.travis.yml | 104 - src/tor/ChangeLog | 26375 --- src/tor/Doxyfile.in | 1395 - src/tor/INSTALL | 52 - src/tor/LICENSE | 211 +- src/tor/Makefile.am | 253 - src/tor/Makefile.nmake | 19 - src/tor/README | 32 - src/tor/ReleaseNotes | 17035 -- src/tor/acinclude.m4 | 288 - src/tor/{src/common => }/address.c | 802 +- src/tor/{src/common => }/address.h | 201 +- src/tor/{src/or => }/addressmap.c | 193 +- src/tor/{src/or => }/addressmap.h | 13 +- src/tor/{src/common => }/aes.c | 303 +- src/tor/{src/common => }/aes.h | 14 +- src/tor/anonymize.cpp | 60 + src/tor/anonymize.h | 36 + src/tor/autogen.sh | 23 - src/tor/{src/common => }/backtrace.c | 101 +- src/tor/backtrace.h | 12 + src/tor/buffers.c | 2584 + src/tor/buffers.h | 106 + src/tor/changes/.dummy | 37 - src/tor/changes/bug12062 | 16 - src/tor/changes/bug22605 | 5 - src/tor/changes/bug22907 | 3 - src/tor/changes/bug23100 | 7 - src/tor/changes/bug23114 | 6 - src/tor/changes/bug23571 | 3 - src/tor/changes/bug23826-23828 | 14 - src/tor/changes/bug23827 | 8 - src/tor/changes/bug23848 | 8 - src/tor/changes/bug23953 | 3 - src/tor/changes/bug24119 | 4 - src/tor/changes/bug24137 | 3 - src/tor/changes/bug24318 | 3 - src/tor/changes/bug24337 | 8 - src/tor/changes/bug24362 | 2 - src/tor/changes/bug24374 | 4 - src/tor/changes/bug24488 | 4 - src/tor/changes/bug24489 | 3 - src/tor/changes/bug24605 | 4 - src/tor/changes/bug24612 | 4 - src/tor/changes/bug24613 | 4 - src/tor/changes/cargo-build-problem | 3 - src/tor/changes/feature24427 | 5 - src/tor/changes/ticket13605 | 5 - src/tor/changes/ticket20020 | 4 - src/tor/changes/ticket20699 | 14 - src/tor/changes/ticket20895 | 6 - src/tor/changes/ticket22342 | 3 - src/tor/changes/ticket22703 | 6 - src/tor/changes/ticket22840 | 8 - src/tor/changes/ticket23271 | 6 - src/tor/changes/ticket23459 | 4 - src/tor/changes/ticket23577 | 7 - src/tor/changes/ticket23637 | 5 - src/tor/changes/ticket23709 | 11 - src/tor/changes/ticket23760 | 4 - src/tor/changes/ticket23845 | 9 - src/tor/changes/ticket23900 | 7 - src/tor/changes/ticket24363 | 2 - src/tor/changes/ticket24467 | 3 - src/tor/changes/ticket24518 | 4 - src/tor/{src/or => }/channel.c | 2078 +- src/tor/{src/or => }/channel.h | 392 +- src/tor/{src/or => }/channeltls.c | 964 +- src/tor/{src/or => }/channeltls.h | 30 +- src/tor/ciphers.inc | 182 + src/tor/{src/or => }/circpathbias.c | 358 +- src/tor/{src/or => }/circpathbias.h | 4 +- src/tor/{src/or => }/circuitbuild.c | 1633 +- src/tor/circuitbuild.h | 62 + src/tor/{src/or => }/circuitlist.c | 1323 +- src/tor/{src/or => }/circuitlist.h | 44 +- src/tor/{src/or => }/circuitmux.c | 280 +- src/tor/{src/or => }/circuitmux.h | 29 +- src/tor/{src/or => }/circuitmux_ewma.c | 107 +- src/tor/{src/or => }/circuitmux_ewma.h | 9 +- src/tor/{src/or => }/circuitstats.c | 379 +- src/tor/{src/or => }/circuitstats.h | 27 +- src/tor/{src/or => }/circuituse.c | 1202 +- src/tor/{src/or => }/circuituse.h | 31 +- src/tor/{src/or => }/command.c | 140 +- src/tor/{src/or => }/command.h | 4 +- src/tor/common_sha1.i | 26 + src/tor/{src/common => }/compat.c | 1825 +- src/tor/compat_libevent.c | 663 + src/tor/compat_libevent.h | 96 + src/tor/{src/or => }/config.c | 4559 +- src/tor/config.h | 144 + src/tor/config_codedigest.c | 13 + src/tor/configure.ac | 2219 - src/tor/{src/or => }/confparse.c | 247 +- src/tor/{src/or => }/confparse.h | 115 +- src/tor/{src/or => }/connection.c | 2367 +- src/tor/{src/or => }/connection.h | 184 +- src/tor/{src/or => }/connection_edge.c | 1821 +- src/tor/{src/or => }/connection_edge.h | 90 +- src/tor/{src/or => }/connection_or.c | 1450 +- src/tor/{src/or => }/connection_or.h | 70 +- src/tor/{src/common => }/container.c | 889 +- src/tor/{src/common => }/container.h | 195 +- src/tor/contrib/README | 68 - src/tor/contrib/clang/sanitize_blacklist.txt | 103 - src/tor/contrib/client-tools/tor-resolve.py | 153 - src/tor/contrib/client-tools/torify | 61 - src/tor/contrib/dirauth-tools/add-tor | 115 - .../nagios-check-tor-authority-cert | 86 - src/tor/contrib/dist/rc.subr | 43 - src/tor/contrib/dist/suse/tor.sh.in | 118 - src/tor/contrib/dist/tor.service.in | 35 - src/tor/contrib/dist/tor.sh.in | 123 - src/tor/contrib/dist/torctl.in | 195 - src/tor/contrib/include.am | 18 - .../contrib/operator-tools/linux-tor-prio.sh | 192 - .../operator-tools/tor-exit-notice.html | 144 - .../contrib/operator-tools/tor.logrotate.in | 14 - src/tor/contrib/or-tools/check-tor | 41 - src/tor/contrib/or-tools/checksocks.pl | 83 - src/tor/contrib/or-tools/exitlist | 323 - .../contrib/win32build/package_nsis-mingw.sh | 95 - src/tor/contrib/win32build/tor-mingw.nsi.in | 274 - src/tor/contrib/win32build/tor.ico | Bin 82726 -> 0 bytes src/tor/contrib/win32build/tor.nsi.in | 214 - src/tor/{src/or => }/control.c | 3363 +- src/tor/{src/or => }/control.h | 188 +- src/tor/cpuworker.c | 718 + src/tor/{src/or => }/cpuworker.h | 22 +- src/tor/{src/common => }/crypto.c | 2212 +- src/tor/{src/common => }/crypto.h | 179 +- src/tor/crypto_curve25519.c | 191 + src/tor/{src/common => }/crypto_curve25519.h | 27 +- src/tor/crypto_format.c | 45 + .../curve25519_donna => }/curve25519-donna.c | 291 +- src/tor/{src/common => }/di_ops.c | 58 +- src/tor/{src/common => }/di_ops.h | 14 +- src/tor/directory.c | 3894 + src/tor/directory.h | 127 + src/tor/{src/or => }/dirserv.c | 2766 +- src/tor/{src/or => }/dirserv.h | 133 +- src/tor/{src/or => }/dirvote.c | 1440 +- src/tor/dirvote.h | 148 + src/tor/{src/or => }/dns.c | 414 +- src/tor/dns.h | 32 + src/tor/{src/or => }/dnsserv.c | 98 +- src/tor/{src/or => }/dnsserv.h | 4 +- src/tor/doc/HACKING/CodingStandards.md | 419 - src/tor/doc/HACKING/CodingStandardsRust.md | 469 - src/tor/doc/HACKING/Fuzzing.md | 123 - src/tor/doc/HACKING/GettingStarted.md | 188 - src/tor/doc/HACKING/GettingStartedRust.md | 174 - src/tor/doc/HACKING/HelpfulTools.md | 349 - src/tor/doc/HACKING/HowToReview.md | 88 - src/tor/doc/HACKING/README.1st.md | 62 - src/tor/doc/HACKING/ReleasingTor.md | 206 - src/tor/doc/HACKING/Tracing.md | 91 - src/tor/doc/HACKING/WritingTests.md | 499 - src/tor/doc/HACKING/android/Simpleperf.md | 98 - src/tor/doc/TUNING | 86 - src/tor/doc/asciidoc-helper.sh | 68 - src/tor/doc/building-tor-msvc.txt | 122 - src/tor/doc/contrib/tor-rpm-creation.txt | 56 - src/tor/doc/include.am | 88 - src/tor/doc/state-contents.txt | 105 - src/tor/doc/tor-gencert.1.txt | 92 - src/tor/doc/tor-resolve.1.txt | 54 - src/tor/doc/tor.1.txt | 3196 - src/tor/doc/torify.1.txt | 40 - src/tor/doc/torrc_format.txt | 212 - src/tor/entrynodes.c | 2334 + src/tor/entrynodes.h | 133 + src/tor/eventdns.h | 337 + src/tor/eventdns_tor.h | 25 + src/tor/{src/or => }/ext_orport.c | 69 +- src/tor/{src/or => }/ext_orport.h | 12 +- src/tor/{src/or => }/fp_pair.c | 43 +- src/tor/{src/or => }/fp_pair.h | 11 +- src/tor/{src/or => }/geoip.c | 182 +- src/tor/{src/or => }/geoip.h | 16 +- src/tor/{src/or => }/hibernate.c | 214 +- src/tor/{src/or => }/hibernate.h | 16 +- src/tor/{src/ext => }/ht.h | 188 +- src/tor/{src/common => }/log.c | 634 +- src/tor/m4/ax_check_sign.m4 | 54 - src/tor/m4/pc_from_ucontext.m4 | 128 - src/tor/m4/pkg.m4 | 214 - src/tor/{src/common => }/memarea.c | 252 +- src/tor/{src/common => }/memarea.h | 12 +- src/tor/mempool.c | 628 + src/tor/mempool.h | 65 + src/tor/{src/or => }/microdesc.c | 361 +- src/tor/{src/or => }/microdesc.h | 20 +- src/tor/{src/or => }/networkstatus.c | 1326 +- src/tor/{src/or => }/networkstatus.h | 105 +- src/tor/{src/or => }/nodelist.c | 1363 +- src/tor/nodelist.h | 86 + src/tor/{src/or => }/ntmain.h | 14 +- src/tor/{src/or => }/onion.c | 478 +- src/tor/{src/or => }/onion.h | 17 +- src/tor/{src/or => }/onion_fast.c | 47 +- src/tor/{src/or => }/onion_fast.h | 11 +- src/tor/onion_main.c | 2908 + src/tor/{src/or/main.h => onion_main.h} | 64 +- src/tor/{src/or => }/onion_ntor.c | 56 +- src/tor/{src/or => }/onion_ntor.h | 16 +- src/tor/{src/or => }/onion_tap.c | 50 +- src/tor/{src/or => }/onion_tap.h | 7 +- src/tor/{src/or => }/or.h | 1831 +- src/tor/or_sha1.i | 167 + src/tor/orconfig.h | 12 + src/tor/orconfig_apple.h | 623 + src/tor/orconfig_linux.h | 621 + .../win32/orconfig.h => orconfig_win32.h} | 44 +- src/tor/policies.c | 1758 + src/tor/policies.h | 77 + src/tor/{src/common => }/procmon.c | 55 +- src/tor/{src/common => }/procmon.h | 10 +- src/tor/{src/or => }/reasons.c | 81 +- src/tor/{src/or => }/reasons.h | 5 +- src/tor/{src/or => }/relay.c | 1221 +- src/tor/{src/or => }/relay.h | 53 +- src/tor/{src/or => }/rendclient.c | 990 +- src/tor/{src/or => }/rendclient.h | 25 +- src/tor/rendcommon.c | 1487 + src/tor/rendcommon.h | 66 + src/tor/{src/or => }/rendmid.c | 104 +- src/tor/{src/or => }/rendmid.h | 12 +- src/tor/rendservice.c | 3396 + src/tor/rendservice.h | 108 + src/tor/{src/or => }/rephist.c | 1032 +- src/tor/{src/or => }/rephist.h | 53 +- src/tor/{src/or => }/replaycache.c | 44 +- src/tor/{src/or => }/replaycache.h | 14 +- src/tor/{src/or => }/router.c | 1532 +- src/tor/{src/or => }/router.h | 54 +- src/tor/{src/or => }/routerlist.c | 2527 +- src/tor/{src/or => }/routerlist.h | 122 +- src/tor/{src/or => }/routerparse.c | 2821 +- src/tor/{src/or => }/routerparse.h | 83 +- src/tor/{src/or => }/routerset.c | 154 +- src/tor/routerset.h | 49 + src/tor/sandbox.c | 1510 + src/tor/sandbox.h | 247 + src/tor/scripts/README | 63 - src/tor/scripts/coccinelle/calloc.cocci | 23 - src/tor/scripts/coccinelle/ceil_div.cocci | 6 - src/tor/scripts/coccinelle/malloc_cast.cocci | 38 - .../scripts/coccinelle/test-operator-cleanup | 11 - .../scripts/coccinelle/test_assert_int.cocci | 49 - .../scripts/coccinelle/test_assert_null.cocci | 11 - .../scripts/coccinelle/test_assert_zero.cocci | 5 - src/tor/scripts/coccinelle/uncalloc.cocci | 13 - src/tor/scripts/codegen/fuzzing_include_am.py | 160 - src/tor/scripts/codegen/gen_linux_syscalls.pl | 37 - src/tor/scripts/codegen/gen_server_ciphers.py | 131 - .../scripts/codegen/get_mozilla_ciphers.py | 213 - src/tor/scripts/codegen/makedesc.py | 351 - src/tor/scripts/codegen/run_trunnel.sh | 17 - .../scripts/maint/annotate_ifdef_directives | 74 - src/tor/scripts/maint/checkLogs.pl | 51 - src/tor/scripts/maint/checkOptionDocs.pl.in | 69 - src/tor/scripts/maint/checkSpace.pl | 203 - src/tor/scripts/maint/check_config_macros.pl | 20 - src/tor/scripts/maint/fallback.blacklist | 274 - src/tor/scripts/maint/fallback.whitelist | 829 - src/tor/scripts/maint/findMergedChanges.pl | 73 - src/tor/scripts/maint/format_changelog.py | 569 - src/tor/scripts/maint/lintChanges.py | 117 - src/tor/scripts/maint/locatemissingdoxygen.py | 74 - src/tor/scripts/maint/redox.py | 226 - src/tor/scripts/maint/run_calltool.sh | 29 - src/tor/scripts/maint/sortChanges.py | 108 - src/tor/scripts/maint/updateCopyright.pl | 7 - src/tor/scripts/maint/updateFallbackDirs.py | 2226 - src/tor/scripts/maint/updateVersions.pl.in | 59 - src/tor/scripts/test/cov-blame | 48 - src/tor/scripts/test/cov-diff | 21 - src/tor/scripts/test/cov-display | 81 - src/tor/scripts/test/cov-exclude | 34 - src/tor/scripts/test/coverage | 46 - src/tor/scripts/test/scan-build.sh | 80 - src/tor/src/common/Makefile.nmake | 28 - src/tor/src/common/backtrace.h | 21 - src/tor/src/common/buffers.c | 1146 - src/tor/src/common/buffers.h | 132 - src/tor/src/common/buffers_tls.c | 179 - src/tor/src/common/buffers_tls.h | 19 - src/tor/src/common/ciphers.inc | 81 - src/tor/src/common/compat_libevent.c | 295 - src/tor/src/common/compat_libevent.h | 81 - src/tor/src/common/compat_openssl.h | 47 - src/tor/src/common/compat_pthreads.c | 350 - src/tor/src/common/compat_threads.c | 407 - src/tor/src/common/compat_threads.h | 223 - src/tor/src/common/compat_time.c | 840 - src/tor/src/common/compat_time.h | 205 - src/tor/src/common/compat_winthreads.c | 252 - src/tor/src/common/compress.c | 665 - src/tor/src/common/compress.h | 92 - src/tor/src/common/compress_lzma.c | 361 - src/tor/src/common/compress_lzma.h | 46 - src/tor/src/common/compress_none.c | 53 - src/tor/src/common/compress_none.h | 20 - src/tor/src/common/compress_zlib.c | 304 - src/tor/src/common/compress_zlib.h | 46 - src/tor/src/common/compress_zstd.c | 442 - src/tor/src/common/compress_zstd.h | 46 - src/tor/src/common/confline.c | 538 - src/tor/src/common/confline.h | 61 - src/tor/src/common/crypto_curve25519.c | 357 - src/tor/src/common/crypto_ed25519.c | 816 - src/tor/src/common/crypto_ed25519.h | 145 - src/tor/src/common/crypto_format.c | 298 - src/tor/src/common/crypto_format.h | 47 - src/tor/src/common/crypto_pwbox.c | 212 - src/tor/src/common/crypto_pwbox.h | 23 - src/tor/src/common/crypto_s2k.c | 472 - src/tor/src/common/crypto_s2k.h | 73 - src/tor/src/common/handles.h | 153 - src/tor/src/common/include.am | 189 - src/tor/src/common/linux_syscalls.inc | 1153 - src/tor/src/common/pubsub.c | 129 - src/tor/src/common/pubsub.h | 179 - src/tor/src/common/sandbox.c | 1993 - src/tor/src/common/sandbox.h | 174 - src/tor/src/common/storagedir.c | 586 - src/tor/src/common/storagedir.h | 54 - src/tor/src/common/timers.c | 317 - src/tor/src/common/timers.h | 31 - src/tor/src/common/tortls.h | 295 - src/tor/src/common/util_bug.c | 119 - src/tor/src/common/util_bug.h | 202 - src/tor/src/common/util_format.c | 535 - src/tor/src/common/util_format.h | 52 - src/tor/src/common/util_process.c | 158 - src/tor/src/common/util_process.h | 26 - src/tor/src/common/workqueue.c | 645 - src/tor/src/common/workqueue.h | 63 - src/tor/src/config/README | 35 - src/tor/src/config/geoip | 161213 --------------- src/tor/src/config/geoip6 | 41219 ---- src/tor/src/config/include.am | 20 - src/tor/src/config/mmdb-convert.py | 466 - src/tor/src/config/torrc.minimal.in | 192 - src/tor/src/config/torrc.minimal.in-staging | 210 - src/tor/src/config/torrc.sample.in | 220 - src/tor/src/ext/Makefile.nmake | 12 - src/tor/src/ext/OpenBSD_malloc_Linux.c | 2047 - src/tor/src/ext/README | 79 - src/tor/src/ext/byteorder.h | 67 - src/tor/src/ext/csiphash.c | 125 - src/tor/src/ext/curve25519_donna/README | 44 - .../curve25519_donna/curve25519-donna-c64.c | 451 - src/tor/src/ext/ed25519/donna/README.md | 183 - src/tor/src/ext/ed25519/donna/README.tor | 46 - .../ed25519/donna/curve25519-donna-32bit.h | 579 - .../ed25519/donna/curve25519-donna-64bit.h | 413 - .../ed25519/donna/curve25519-donna-helpers.h | 84 - .../ext/ed25519/donna/curve25519-donna-sse2.h | 1105 - .../ed25519/donna/ed25519-donna-32bit-sse2.h | 513 - .../donna/ed25519-donna-32bit-tables.h | 61 - .../ed25519/donna/ed25519-donna-64bit-sse2.h | 436 - .../donna/ed25519-donna-64bit-tables.h | 53 - .../donna/ed25519-donna-64bit-x86-32bit.h | 435 - .../ed25519/donna/ed25519-donna-64bit-x86.h | 360 - .../donna/ed25519-donna-basepoint-table.h | 259 - .../ed25519/donna/ed25519-donna-batchverify.h | 275 - .../ed25519/donna/ed25519-donna-impl-base.h | 364 - .../ed25519/donna/ed25519-donna-impl-sse2.h | 390 - .../donna/ed25519-donna-portable-identify.h | 103 - .../ed25519/donna/ed25519-donna-portable.h | 174 - src/tor/src/ext/ed25519/donna/ed25519-donna.h | 126 - .../ext/ed25519/donna/ed25519-hash-custom.h | 42 - src/tor/src/ext/ed25519/donna/ed25519-hash.h | 219 - .../donna/ed25519-randombytes-custom.h | 17 - .../ext/ed25519/donna/ed25519-randombytes.h | 91 - src/tor/src/ext/ed25519/donna/ed25519.c | 150 - src/tor/src/ext/ed25519/donna/ed25519.h | 30 - .../src/ext/ed25519/donna/ed25519_donna_tor.h | 38 - src/tor/src/ext/ed25519/donna/ed25519_tor.c | 367 - src/tor/src/ext/ed25519/donna/fuzz/README.md | 173 - .../src/ext/ed25519/donna/fuzz/build-nix.php | 134 - .../ext/ed25519/donna/fuzz/curve25519-ref10.c | 1272 - .../ext/ed25519/donna/fuzz/curve25519-ref10.h | 8 - .../ed25519/donna/fuzz/ed25519-donna-sse2.c | 3 - .../ext/ed25519/donna/fuzz/ed25519-donna.c | 1 - .../ext/ed25519/donna/fuzz/ed25519-donna.h | 34 - .../ext/ed25519/donna/fuzz/ed25519-ref10.c | 4647 - .../ext/ed25519/donna/fuzz/ed25519-ref10.h | 9 - .../ext/ed25519/donna/fuzz/fuzz-curve25519.c | 172 - .../src/ext/ed25519/donna/fuzz/fuzz-ed25519.c | 219 - .../src/ext/ed25519/donna/modm-donna-32bit.h | 470 - .../src/ext/ed25519/donna/modm-donna-64bit.h | 366 - src/tor/src/ext/ed25519/donna/regression.h | 1024 - .../src/ext/ed25519/donna/test-internals.c | 190 - src/tor/src/ext/ed25519/donna/test-ticks.h | 50 - src/tor/src/ext/ed25519/donna/test.c | 260 - src/tor/src/ext/ed25519/ref10/README.tor | 23 - src/tor/src/ext/ed25519/ref10/api.h | 4 - src/tor/src/ext/ed25519/ref10/base.h | 1344 - src/tor/src/ext/ed25519/ref10/base.py | 65 - src/tor/src/ext/ed25519/ref10/base2.h | 40 - src/tor/src/ext/ed25519/ref10/base2.py | 60 - src/tor/src/ext/ed25519/ref10/blinding.c | 119 - .../ext/ed25519/ref10/crypto_hash_sha512.h | 32 - src/tor/src/ext/ed25519/ref10/crypto_int32.h | 25 - src/tor/src/ext/ed25519/ref10/crypto_int64.h | 23 - src/tor/src/ext/ed25519/ref10/crypto_sign.h | 9 - src/tor/src/ext/ed25519/ref10/crypto_uint32.h | 3 - src/tor/src/ext/ed25519/ref10/crypto_uint64.h | 3 - .../src/ext/ed25519/ref10/crypto_verify_32.h | 5 - src/tor/src/ext/ed25519/ref10/d.h | 1 - src/tor/src/ext/ed25519/ref10/d.py | 28 - src/tor/src/ext/ed25519/ref10/d2.h | 1 - src/tor/src/ext/ed25519/ref10/d2.py | 28 - src/tor/src/ext/ed25519/ref10/ed25519_ref10.h | 34 - src/tor/src/ext/ed25519/ref10/fe.h | 56 - src/tor/src/ext/ed25519/ref10/fe_0.c | 19 - src/tor/src/ext/ed25519/ref10/fe_1.c | 19 - src/tor/src/ext/ed25519/ref10/fe_add.c | 57 - src/tor/src/ext/ed25519/ref10/fe_cmov.c | 63 - src/tor/src/ext/ed25519/ref10/fe_copy.c | 29 - src/tor/src/ext/ed25519/ref10/fe_frombytes.c | 73 - src/tor/src/ext/ed25519/ref10/fe_invert.c | 14 - src/tor/src/ext/ed25519/ref10/fe_isnegative.c | 16 - src/tor/src/ext/ed25519/ref10/fe_isnonzero.c | 19 - src/tor/src/ext/ed25519/ref10/fe_mul.c | 253 - src/tor/src/ext/ed25519/ref10/fe_neg.c | 45 - src/tor/src/ext/ed25519/ref10/fe_pow22523.c | 13 - src/tor/src/ext/ed25519/ref10/fe_sq.c | 149 - src/tor/src/ext/ed25519/ref10/fe_sq2.c | 160 - src/tor/src/ext/ed25519/ref10/fe_sub.c | 57 - src/tor/src/ext/ed25519/ref10/fe_tobytes.c | 119 - src/tor/src/ext/ed25519/ref10/ge.h | 95 - src/tor/src/ext/ed25519/ref10/ge_add.c | 11 - src/tor/src/ext/ed25519/ref10/ge_add.h | 97 - src/tor/src/ext/ed25519/ref10/ge_add.q | 49 - .../ext/ed25519/ref10/ge_double_scalarmult.c | 96 - src/tor/src/ext/ed25519/ref10/ge_frombytes.c | 50 - src/tor/src/ext/ed25519/ref10/ge_madd.c | 11 - src/tor/src/ext/ed25519/ref10/ge_madd.h | 88 - src/tor/src/ext/ed25519/ref10/ge_madd.q | 46 - src/tor/src/ext/ed25519/ref10/ge_msub.c | 11 - src/tor/src/ext/ed25519/ref10/ge_msub.h | 88 - src/tor/src/ext/ed25519/ref10/ge_msub.q | 46 - src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p2.c | 12 - src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p3.c | 13 - src/tor/src/ext/ed25519/ref10/ge_p2_0.c | 8 - src/tor/src/ext/ed25519/ref10/ge_p2_dbl.c | 11 - src/tor/src/ext/ed25519/ref10/ge_p2_dbl.h | 73 - src/tor/src/ext/ed25519/ref10/ge_p2_dbl.q | 41 - src/tor/src/ext/ed25519/ref10/ge_p3_0.c | 9 - src/tor/src/ext/ed25519/ref10/ge_p3_dbl.c | 12 - .../src/ext/ed25519/ref10/ge_p3_to_cached.c | 17 - src/tor/src/ext/ed25519/ref10/ge_p3_to_p2.c | 12 - src/tor/src/ext/ed25519/ref10/ge_p3_tobytes.c | 14 - src/tor/src/ext/ed25519/ref10/ge_precomp_0.c | 8 - .../ext/ed25519/ref10/ge_scalarmult_base.c | 109 - src/tor/src/ext/ed25519/ref10/ge_sub.c | 11 - src/tor/src/ext/ed25519/ref10/ge_sub.h | 97 - src/tor/src/ext/ed25519/ref10/ge_sub.q | 49 - src/tor/src/ext/ed25519/ref10/ge_tobytes.c | 14 - src/tor/src/ext/ed25519/ref10/keyconv.c | 37 - src/tor/src/ext/ed25519/ref10/keypair.c | 52 - src/tor/src/ext/ed25519/ref10/open.c | 43 - src/tor/src/ext/ed25519/ref10/pow22523.h | 161 - src/tor/src/ext/ed25519/ref10/pow22523.q | 61 - src/tor/src/ext/ed25519/ref10/pow225521.h | 161 - src/tor/src/ext/ed25519/ref10/pow225521.q | 61 - src/tor/src/ext/ed25519/ref10/q2h.sh | 4 - src/tor/src/ext/ed25519/ref10/randombytes.h | 4 - src/tor/src/ext/ed25519/ref10/sc.h | 15 - src/tor/src/ext/ed25519/ref10/sc_muladd.c | 368 - src/tor/src/ext/ed25519/ref10/sc_reduce.c | 275 - src/tor/src/ext/ed25519/ref10/sign.c | 29 - src/tor/src/ext/ed25519/ref10/sqrtm1.h | 1 - src/tor/src/ext/ed25519/ref10/sqrtm1.py | 28 - src/tor/src/ext/include.am | 176 - src/tor/src/ext/keccak-tiny/README.markdown | 82 - src/tor/src/ext/keccak-tiny/do.sh | 5 - .../ext/keccak-tiny/keccak-tiny-unrolled.c | 391 - src/tor/src/ext/keccak-tiny/keccak-tiny.c | 163 - src/tor/src/ext/keccak-tiny/keccak-tiny.h | 66 - src/tor/src/ext/mulodi/LICENSE.TXT | 91 - src/tor/src/ext/mulodi/mulodi4.c | 67 - src/tor/src/ext/readpassphrase.c | 222 - src/tor/src/ext/rust/README | 5 - .../crates/libc-0.2.22/.cargo-checksum.json | 1 - .../src/ext/rust/crates/libc-0.2.22/.cargo-ok | 0 .../ext/rust/crates/libc-0.2.22/.gitignore | 3 - .../ext/rust/crates/libc-0.2.22/.travis.yml | 132 - .../ext/rust/crates/libc-0.2.22/Cargo.toml | 21 - .../rust/crates/libc-0.2.22/LICENSE-APACHE | 201 - .../ext/rust/crates/libc-0.2.22/LICENSE-MIT | 25 - .../src/ext/rust/crates/libc-0.2.22/README.md | 137 - .../ext/rust/crates/libc-0.2.22/appveyor.yml | 25 - .../ext/rust/crates/libc-0.2.22/ci/README.md | 203 - .../libc-0.2.22/ci/android-accept-licenses.sh | 15 - .../libc-0.2.22/ci/android-install-ndk.sh | 36 - .../libc-0.2.22/ci/android-install-sdk.sh | 57 - .../docker/aarch64-linux-android/Dockerfile | 32 - .../aarch64-unknown-linux-gnu/Dockerfile | 7 - .../docker/arm-linux-androideabi/Dockerfile | 32 - .../arm-unknown-linux-gnueabihf/Dockerfile | 7 - .../ci/docker/i686-linux-android/Dockerfile | 32 - .../docker/i686-unknown-linux-gnu/Dockerfile | 5 - .../docker/i686-unknown-linux-musl/Dockerfile | 23 - .../docker/mips-unknown-linux-gnu/Dockerfile | 10 - .../docker/mips-unknown-linux-musl/Dockerfile | 17 - .../mips64-unknown-linux-gnuabi64/Dockerfile | 11 - .../mipsel-unknown-linux-musl/Dockerfile | 17 - .../powerpc-unknown-linux-gnu/Dockerfile | 10 - .../powerpc64-unknown-linux-gnu/Dockerfile | 11 - .../ci/docker/x86_64-linux-android/Dockerfile | 32 - .../docker/x86_64-rumprun-netbsd/Dockerfile | 6 - .../docker/x86_64-unknown-freebsd/Dockerfile | 13 - .../x86_64-unknown-linux-gnu/Dockerfile | 5 - .../x86_64-unknown-linux-musl/Dockerfile | 13 - .../docker/x86_64-unknown-openbsd/Dockerfile | 8 - .../src/ext/rust/crates/libc-0.2.22/ci/dox.sh | 33 - .../ci/ios/deploy_and_run_on_ios_simulator.rs | 171 - .../libc-0.2.22/ci/landing-page-footer.html | 3 - .../libc-0.2.22/ci/landing-page-head.html | 7 - .../rust/crates/libc-0.2.22/ci/run-docker.sh | 36 - .../rust/crates/libc-0.2.22/ci/run-qemu.sh | 32 - .../src/ext/rust/crates/libc-0.2.22/ci/run.sh | 179 - .../ext/rust/crates/libc-0.2.22/ci/style.rs | 204 - .../ext/rust/crates/libc-0.2.22/src/dox.rs | 172 - .../ext/rust/crates/libc-0.2.22/src/lib.rs | 279 - .../ext/rust/crates/libc-0.2.22/src/macros.rs | 108 - .../ext/rust/crates/libc-0.2.22/src/redox.rs | 57 - .../libc-0.2.22/src/unix/bsd/apple/b32.rs | 19 - .../libc-0.2.22/src/unix/bsd/apple/b64.rs | 21 - .../libc-0.2.22/src/unix/bsd/apple/mod.rs | 1687 - .../src/unix/bsd/freebsdlike/dragonfly/mod.rs | 420 - .../unix/bsd/freebsdlike/freebsd/aarch64.rs | 30 - .../src/unix/bsd/freebsdlike/freebsd/mod.rs | 577 - .../src/unix/bsd/freebsdlike/freebsd/x86.rs | 31 - .../unix/bsd/freebsdlike/freebsd/x86_64.rs | 30 - .../src/unix/bsd/freebsdlike/mod.rs | 1041 - .../crates/libc-0.2.22/src/unix/bsd/mod.rs | 449 - .../src/unix/bsd/netbsdlike/mod.rs | 626 - .../src/unix/bsd/netbsdlike/netbsd/mod.rs | 725 - .../bsd/netbsdlike/netbsd/other/b32/mod.rs | 2 - .../bsd/netbsdlike/netbsd/other/b64/mod.rs | 2 - .../unix/bsd/netbsdlike/netbsd/other/mod.rs | 14 - .../unix/bsd/netbsdlike/openbsdlike/bitrig.rs | 75 - .../unix/bsd/netbsdlike/openbsdlike/mod.rs | 504 - .../bsd/netbsdlike/openbsdlike/openbsd.rs | 33 - .../netbsdlike/openbsdlike/other/b32/mod.rs | 2 - .../netbsdlike/openbsdlike/other/b64/mod.rs | 2 - .../bsd/netbsdlike/openbsdlike/other/mod.rs | 11 - .../crates/libc-0.2.22/src/unix/haiku/b32.rs | 2 - .../crates/libc-0.2.22/src/unix/haiku/b64.rs | 2 - .../crates/libc-0.2.22/src/unix/haiku/mod.rs | 817 - .../rust/crates/libc-0.2.22/src/unix/mod.rs | 873 - .../src/unix/notbsd/android/b32/arm.rs | 6 - .../src/unix/notbsd/android/b32/mod.rs | 199 - .../src/unix/notbsd/android/b32/x86.rs | 6 - .../src/unix/notbsd/android/b64/aarch64.rs | 56 - .../src/unix/notbsd/android/b64/mod.rs | 162 - .../src/unix/notbsd/android/b64/x86_64.rs | 50 - .../src/unix/notbsd/android/mod.rs | 806 - .../src/unix/notbsd/linux/mips/mips32.rs | 287 - .../src/unix/notbsd/linux/mips/mips64.rs | 225 - .../src/unix/notbsd/linux/mips/mod.rs | 509 - .../libc-0.2.22/src/unix/notbsd/linux/mod.rs | 978 - .../src/unix/notbsd/linux/musl/b32/arm.rs | 346 - .../src/unix/notbsd/linux/musl/b32/asmjs.rs | 336 - .../src/unix/notbsd/linux/musl/b32/mips.rs | 354 - .../src/unix/notbsd/linux/musl/b32/mod.rs | 56 - .../src/unix/notbsd/linux/musl/b32/x86.rs | 360 - .../src/unix/notbsd/linux/musl/b64/aarch64.rs | 3 - .../src/unix/notbsd/linux/musl/b64/mod.rs | 387 - .../unix/notbsd/linux/musl/b64/powerpc64.rs | 3 - .../src/unix/notbsd/linux/musl/b64/x86_64.rs | 20 - .../src/unix/notbsd/linux/musl/mod.rs | 337 - .../src/unix/notbsd/linux/other/b32/arm.rs | 203 - .../src/unix/notbsd/linux/other/b32/mod.rs | 284 - .../unix/notbsd/linux/other/b32/powerpc.rs | 207 - .../src/unix/notbsd/linux/other/b32/x86.rs | 254 - .../unix/notbsd/linux/other/b64/aarch64.rs | 447 - .../src/unix/notbsd/linux/other/b64/mod.rs | 67 - .../unix/notbsd/linux/other/b64/powerpc64.rs | 446 - .../unix/notbsd/linux/other/b64/sparc64.rs | 370 - .../src/unix/notbsd/linux/other/b64/x86_64.rs | 515 - .../src/unix/notbsd/linux/other/mod.rs | 521 - .../src/unix/notbsd/linux/s390x.rs | 738 - .../crates/libc-0.2.22/src/unix/notbsd/mod.rs | 998 - .../libc-0.2.22/src/unix/solaris/mod.rs | 1194 - .../rust/crates/libc-0.2.22/src/windows.rs | 235 - src/tor/src/ext/siphash.h | 13 - src/tor/src/ext/timeouts/Rules.shrc | 40 - src/tor/src/ext/timeouts/bench/Rules.mk | 49 - src/tor/src/ext/timeouts/bench/bench-add.lua | 30 - src/tor/src/ext/timeouts/bench/bench-aux.lua | 30 - src/tor/src/ext/timeouts/bench/bench-del.lua | 25 - .../src/ext/timeouts/bench/bench-expire.lua | 29 - src/tor/src/ext/timeouts/bench/bench-heap.c | 236 - src/tor/src/ext/timeouts/bench/bench-llrb.c | 425 - src/tor/src/ext/timeouts/bench/bench-wheel.c | 81 - src/tor/src/ext/timeouts/bench/bench.c | 293 - src/tor/src/ext/timeouts/bench/bench.h | 11 - src/tor/src/ext/timeouts/bench/bench.plt | 19 - src/tor/src/ext/timeouts/lua/Rules.mk | 20 - src/tor/src/ext/timeouts/lua/timeout-lua.c | 396 - src/tor/src/ext/timeouts/test-timeout.c | 530 - src/tor/src/ext/timeouts/timeout-bitops.c | 255 - src/tor/src/ext/timeouts/timeout-debug.h | 77 - src/tor/src/ext/timeouts/timeout.c | 754 - src/tor/src/ext/timeouts/timeout.h | 256 - src/tor/src/ext/tinytest.c | 501 - src/tor/src/ext/tinytest_demo.c | 264 - src/tor/src/ext/tor_queue.txt | 883 - src/tor/src/ext/tor_readpassphrase.h | 48 - src/tor/src/ext/trunnel/trunnel-impl.h | 311 - src/tor/src/ext/trunnel/trunnel.c | 247 - src/tor/src/ext/trunnel/trunnel.h | 64 - src/tor/src/include.am | 11 - src/tor/src/or/Makefile.nmake | 79 - src/tor/src/or/bridges.c | 891 - src/tor/src/or/bridges.h | 69 - src/tor/src/or/channelpadding.c | 797 - src/tor/src/or/channelpadding.h | 45 - src/tor/src/or/circuitbuild.h | 96 - src/tor/src/or/config.h | 263 - src/tor/src/or/conscache.c | 626 - src/tor/src/or/conscache.h | 67 - src/tor/src/or/consdiff.c | 1412 - src/tor/src/or/consdiff.h | 98 - src/tor/src/or/consdiffmgr.c | 1906 - src/tor/src/or/consdiffmgr.h | 74 - src/tor/src/or/cpuworker.c | 610 - src/tor/src/or/dircollate.c | 356 - src/tor/src/or/dircollate.h | 70 - src/tor/src/or/directory.c | 6011 - src/tor/src/or/directory.h | 305 - src/tor/src/or/dirvote.h | 264 - src/tor/src/or/dns.h | 70 - src/tor/src/or/dns_structs.h | 102 - src/tor/src/or/entrynodes.c | 3658 - src/tor/src/or/entrynodes.h | 634 - src/tor/src/or/fallback_dirs.inc | 370 - src/tor/src/or/git_revision.c | 17 - src/tor/src/or/git_revision.h | 12 - src/tor/src/or/hs_cache.c | 976 - src/tor/src/or/hs_cache.h | 129 - src/tor/src/or/hs_cell.c | 948 - src/tor/src/or/hs_cell.h | 122 - src/tor/src/or/hs_circuit.c | 1242 - src/tor/src/or/hs_circuit.h | 76 - src/tor/src/or/hs_circuitmap.c | 583 - src/tor/src/or/hs_circuitmap.h | 113 - src/tor/src/or/hs_client.c | 1615 - src/tor/src/or/hs_client.h | 92 - src/tor/src/or/hs_common.c | 1793 - src/tor/src/or/hs_common.h | 295 - src/tor/src/or/hs_config.c | 590 - src/tor/src/or/hs_config.h | 24 - src/tor/src/or/hs_control.c | 258 - src/tor/src/or/hs_control.h | 52 - src/tor/src/or/hs_descriptor.c | 2602 - src/tor/src/or/hs_descriptor.h | 284 - src/tor/src/or/hs_ident.c | 126 - src/tor/src/or/hs_ident.h | 147 - src/tor/src/or/hs_intropoint.c | 613 - src/tor/src/or/hs_intropoint.h | 79 - src/tor/src/or/hs_ntor.c | 618 - src/tor/src/or/hs_ntor.h | 67 - src/tor/src/or/hs_service.c | 3563 - src/tor/src/or/hs_service.h | 374 - src/tor/src/or/include.am | 280 - src/tor/src/or/keypin.c | 498 - src/tor/src/or/keypin.h | 47 - src/tor/src/or/main.c | 4049 - src/tor/src/or/nodelist.h | 160 - src/tor/src/or/ntmain.c | 782 - src/tor/src/or/parsecommon.c | 451 - src/tor/src/or/parsecommon.h | 322 - src/tor/src/or/periodic.c | 126 - src/tor/src/or/periodic.h | 37 - src/tor/src/or/policies.c | 3131 - src/tor/src/or/policies.h | 154 - src/tor/src/or/proto_cell.c | 84 - src/tor/src/or/proto_cell.h | 17 - src/tor/src/or/proto_control0.c | 26 - src/tor/src/or/proto_control0.h | 14 - src/tor/src/or/proto_ext_or.c | 40 - src/tor/src/or/proto_ext_or.h | 17 - src/tor/src/or/proto_http.c | 171 - src/tor/src/or/proto_http.h | 24 - src/tor/src/or/proto_socks.c | 710 - src/tor/src/or/proto_socks.h | 22 - src/tor/src/or/protover.c | 787 - src/tor/src/or/protover.h | 94 - src/tor/src/or/protover_rust.c | 19 - src/tor/src/or/rendcache.c | 1006 - src/tor/src/or/rendcache.h | 130 - src/tor/src/or/rendcommon.c | 1037 - src/tor/src/or/rendcommon.h | 82 - src/tor/src/or/rendservice.c | 4408 - src/tor/src/or/rendservice.h | 221 - src/tor/src/or/routerkeys.c | 1400 - src/tor/src/or/routerkeys.h | 85 - src/tor/src/or/routerset.h | 88 - src/tor/src/or/scheduler.c | 758 - src/tor/src/or/scheduler.h | 217 - src/tor/src/or/scheduler_kist.c | 842 - src/tor/src/or/scheduler_vanilla.c | 197 - src/tor/src/or/shared_random.c | 1445 - src/tor/src/or/shared_random.h | 173 - src/tor/src/or/shared_random_state.c | 1399 - src/tor/src/or/shared_random_state.h | 152 - src/tor/src/or/status.h | 18 - src/tor/src/or/tor_api.c | 88 - src/tor/src/or/tor_api.h | 102 - src/tor/src/or/tor_api_internal.h | 20 - src/tor/src/or/tor_main.c | 28 - src/tor/src/or/torcert.c | 706 - src/tor/src/or/torcert.h | 108 - src/tor/src/rust/.cargo/config.in | 8 - src/tor/src/rust/.rustfmt.toml | 2 - src/tor/src/rust/Cargo.lock | 55 - src/tor/src/rust/Cargo.toml | 7 - src/tor/src/rust/external/Cargo.toml | 13 - src/tor/src/rust/external/external.rs | 33 - src/tor/src/rust/external/lib.rs | 14 - src/tor/src/rust/include.am | 26 - src/tor/src/rust/protover/Cargo.toml | 25 - src/tor/src/rust/protover/ffi.rs | 219 - src/tor/src/rust/protover/lib.rs | 33 - src/tor/src/rust/protover/protover.rs | 906 - src/tor/src/rust/protover/tests/protover.rs | 291 - src/tor/src/rust/smartlist/Cargo.toml | 13 - src/tor/src/rust/smartlist/lib.rs | 8 - src/tor/src/rust/smartlist/smartlist.rs | 115 - src/tor/src/rust/tor_allocate/Cargo.toml | 13 - src/tor/src/rust/tor_allocate/lib.rs | 15 - src/tor/src/rust/tor_allocate/tor_allocate.rs | 97 - src/tor/src/rust/tor_rust/Cargo.toml | 16 - src/tor/src/rust/tor_rust/include.am | 30 - src/tor/src/rust/tor_rust/lib.rs | 5 - src/tor/src/rust/tor_util/Cargo.toml | 16 - src/tor/src/rust/tor_util/ffi.rs | 26 - src/tor/src/rust/tor_util/lib.rs | 11 - src/tor/src/test/Makefile.nmake | 37 - src/tor/src/test/bench.c | 738 - src/tor/src/test/bt_test.py | 53 - src/tor/src/test/ed25519_exts_ref.py | 262 - src/tor/src/test/ed25519_vectors.inc | 150 - src/tor/src/test/example_extrainfo.inc | 435 - src/tor/src/test/failing_routerdescs.inc | 1569 - src/tor/src/test/fakechans.h | 25 - src/tor/src/test/fuzz/dict/consensus | 52 - src/tor/src/test/fuzz/dict/descriptor | 41 - src/tor/src/test/fuzz/dict/extrainfo | 32 - src/tor/src/test/fuzz/dict/hsdescv2 | 8 - src/tor/src/test/fuzz/dict/hsdescv3 | 6 - src/tor/src/test/fuzz/dict/http | 24 - src/tor/src/test/fuzz/dict/iptsv2 | 6 - src/tor/src/test/fuzz/dict/microdesc | 7 - src/tor/src/test/fuzz/fixup_filenames.sh | 19 - src/tor/src/test/fuzz/fuzz_consensus.c | 78 - src/tor/src/test/fuzz/fuzz_descriptor.c | 79 - src/tor/src/test/fuzz/fuzz_diff.c | 69 - src/tor/src/test/fuzz/fuzz_diff_apply.c | 65 - src/tor/src/test/fuzz/fuzz_extrainfo.c | 65 - src/tor/src/test/fuzz/fuzz_hsdescv2.c | 52 - src/tor/src/test/fuzz/fuzz_hsdescv3.c | 99 - src/tor/src/test/fuzz/fuzz_http.c | 133 - src/tor/src/test/fuzz/fuzz_http_connect.c | 106 - src/tor/src/test/fuzz/fuzz_iptsv2.c | 46 - src/tor/src/test/fuzz/fuzz_microdesc.c | 47 - src/tor/src/test/fuzz/fuzz_multi.sh | 34 - src/tor/src/test/fuzz/fuzz_vrs.c | 82 - src/tor/src/test/fuzz/fuzzing.h | 13 - src/tor/src/test/fuzz/fuzzing_common.c | 189 - src/tor/src/test/fuzz/include.am | 351 - src/tor/src/test/fuzz/minimize.sh | 14 - src/tor/src/test/fuzz_static_testcases.sh | 27 - src/tor/src/test/hs_build_address.py | 38 - src/tor/src/test/hs_indexes.py | 70 - src/tor/src/test/hs_ntor_ref.py | 425 - src/tor/src/test/hs_test_helpers.c | 276 - src/tor/src/test/hs_test_helpers.h | 25 - src/tor/src/test/include.am | 359 - src/tor/src/test/log_test_helpers.c | 241 - src/tor/src/test/log_test_helpers.h | 105 - src/tor/src/test/ntor_ref.py | 405 - src/tor/src/test/rend_test_helpers.c | 89 - src/tor/src/test/rend_test_helpers.h | 16 - src/tor/src/test/slow_ed25519.py | 115 - src/tor/src/test/slownacl_curve25519.py | 117 - src/tor/src/test/sr_commit_calc_ref.py | 51 - src/tor/src/test/sr_srv_calc_ref.py | 71 - src/tor/src/test/test-child.c | 61 - src/tor/src/test/test-memwipe.c | 218 - src/tor/src/test/test-network.sh | 108 - src/tor/src/test/test-timers.c | 144 - src/tor/src/test/test.c | 1248 - src/tor/src/test/test.h | 276 - src/tor/src/test/test_accounting.c | 105 - src/tor/src/test/test_addr.c | 1105 - src/tor/src/test/test_address.c | 1175 - src/tor/src/test/test_bt.sh | 13 - src/tor/src/test/test_bt_cl.c | 121 - src/tor/src/test/test_buffers.c | 821 - src/tor/src/test/test_cell_formats.c | 1299 - src/tor/src/test/test_cell_queue.c | 142 - src/tor/src/test/test_channel.c | 1556 - src/tor/src/test/test_channelpadding.c | 1163 - src/tor/src/test/test_channeltls.c | 337 - src/tor/src/test/test_checkdir.c | 149 - src/tor/src/test/test_circuitbuild.c | 133 - src/tor/src/test/test_circuitlist.c | 469 - src/tor/src/test/test_circuitmux.c | 84 - src/tor/src/test/test_circuitstats.c | 199 - src/tor/src/test/test_circuituse.c | 307 - src/tor/src/test/test_compat_libevent.c | 131 - src/tor/src/test/test_config.c | 5649 - src/tor/src/test/test_connection.c | 797 - src/tor/src/test/test_connection.h | 13 - src/tor/src/test/test_conscache.c | 340 - src/tor/src/test/test_consdiff.c | 1185 - src/tor/src/test/test_consdiffmgr.c | 896 - src/tor/src/test/test_containers.c | 1297 - src/tor/src/test/test_controller.c | 1485 - src/tor/src/test/test_controller_events.c | 406 - src/tor/src/test/test_crypto.c | 3028 - src/tor/src/test/test_crypto_openssl.c | 107 - src/tor/src/test/test_crypto_slow.c | 617 - src/tor/src/test/test_data.c | 202 - src/tor/src/test/test_descriptors.inc | 305 - src/tor/src/test/test_dir.c | 6349 - src/tor/src/test/test_dir_common.c | 419 - src/tor/src/test/test_dir_common.h | 52 - src/tor/src/test/test_dir_handle_get.c | 2634 - src/tor/src/test/test_dns.c | 748 - src/tor/src/test/test_entryconn.c | 833 - src/tor/src/test/test_entrynodes.c | 2868 - src/tor/src/test/test_extorport.c | 609 - src/tor/src/test/test_guardfraction.c | 423 - src/tor/src/test/test_handles.c | 97 - src/tor/src/test/test_helpers.c | 279 - src/tor/src/test/test_helpers.h | 32 - src/tor/src/test/test_hs.c | 1054 - src/tor/src/test/test_hs_cache.c | 561 - src/tor/src/test/test_hs_cell.c | 130 - src/tor/src/test/test_hs_client.c | 599 - src/tor/src/test/test_hs_common.c | 1822 - src/tor/src/test/test_hs_config.c | 487 - src/tor/src/test/test_hs_control.c | 199 - src/tor/src/test/test_hs_descriptor.c | 895 - src/tor/src/test/test_hs_descriptor.inc | 224 - src/tor/src/test/test_hs_intropoint.c | 921 - src/tor/src/test/test_hs_ntor.c | 114 - src/tor/src/test/test_hs_ntor.sh | 11 - src/tor/src/test/test_hs_ntor_cl.c | 255 - src/tor/src/test/test_hs_service.c | 1620 - src/tor/src/test/test_introduce.c | 538 - src/tor/src/test/test_key_expiration.sh | 129 - src/tor/src/test/test_keygen.sh | 477 - src/tor/src/test/test_keypin.c | 257 - src/tor/src/test/test_link_handshake.c | 1579 - src/tor/src/test/test_logging.c | 173 - src/tor/src/test/test_microdesc.c | 857 - src/tor/src/test/test_nodelist.c | 216 - src/tor/src/test/test_ntor.sh | 9 - src/tor/src/test/test_ntor_cl.c | 170 - src/tor/src/test/test_oom.c | 356 - src/tor/src/test/test_oos.c | 456 - src/tor/src/test/test_options.c | 4301 - src/tor/src/test/test_policy.c | 2392 - src/tor/src/test/test_procmon.c | 58 - src/tor/src/test/test_proto_http.c | 213 - src/tor/src/test/test_proto_misc.c | 263 - src/tor/src/test/test_protover.c | 266 - src/tor/src/test/test_pt.c | 547 - src/tor/src/test/test_pubsub.c | 85 - src/tor/src/test/test_relay.c | 130 - src/tor/src/test/test_relaycell.c | 249 - src/tor/src/test/test_rendcache.c | 1242 - src/tor/src/test/test_replay.c | 391 - src/tor/src/test/test_router.c | 112 - src/tor/src/test/test_routerkeys.c | 698 - src/tor/src/test/test_routerlist.c | 615 - src/tor/src/test/test_routerset.c | 2224 - src/tor/src/test/test_rust.sh | 20 - src/tor/src/test/test_scheduler.c | 1072 - src/tor/src/test/test_shared_random.c | 1388 - src/tor/src/test/test_slow.c | 26 - src/tor/src/test/test_socks.c | 1031 - src/tor/src/test/test_status.c | 1086 - src/tor/src/test/test_storagedir.c | 375 - src/tor/src/test/test_switch_id.c | 192 - src/tor/src/test/test_switch_id.sh | 32 - src/tor/src/test/test_threads.c | 304 - src/tor/src/test/test_tortls.c | 2827 - src/tor/src/test/test_util.c | 6225 - src/tor/src/test/test_util_format.c | 419 - src/tor/src/test/test_util_process.c | 83 - src/tor/src/test/test_util_slow.c | 391 - src/tor/src/test/test_workqueue.c | 454 - src/tor/src/test/test_workqueue_cancel.sh | 4 - src/tor/src/test/test_workqueue_efd.sh | 4 - src/tor/src/test/test_workqueue_efd2.sh | 4 - src/tor/src/test/test_workqueue_pipe.sh | 4 - src/tor/src/test/test_workqueue_pipe2.sh | 4 - src/tor/src/test/test_workqueue_socketpair.sh | 4 - src/tor/src/test/test_zero_length_keys.sh | 10 - src/tor/src/test/testing_common.c | 330 - src/tor/src/test/testing_rsakeys.c | 546 - src/tor/src/test/vote_descriptors.inc | 94 - src/tor/src/test/zero_length_keys.sh | 126 - src/tor/src/tools/Makefile.nmake | 19 - src/tor/src/tools/include.am | 52 - src/tor/src/tools/tor-fw-helper/README | 10 - src/tor/src/tools/tor-gencert.c | 600 - src/tor/src/tools/tor-resolve.c | 452 - src/tor/src/tools/tor_runner.c | 101 - src/tor/src/trace/debug.h | 25 - src/tor/src/trace/events.h | 45 - src/tor/src/trace/include.am | 22 - src/tor/src/trace/trace.c | 11 - src/tor/src/trace/trace.h | 10 - src/tor/src/trunnel/README | 21 - .../src/trunnel/channelpadding_negotiation.c | 281 - .../src/trunnel/channelpadding_negotiation.h | 98 - .../channelpadding_negotiation.trunnel | 17 - src/tor/src/trunnel/ed25519_cert.c | 2713 - src/tor/src/trunnel/ed25519_cert.h | 942 - src/tor/src/trunnel/ed25519_cert.trunnel | 72 - src/tor/src/trunnel/hs/cell_common.c | 595 - src/tor/src/trunnel/hs/cell_common.h | 203 - src/tor/src/trunnel/hs/cell_common.trunnel | 12 - src/tor/src/trunnel/hs/cell_establish_intro.c | 735 - src/tor/src/trunnel/hs/cell_establish_intro.h | 276 - .../trunnel/hs/cell_establish_intro.trunnel | 41 - src/tor/src/trunnel/hs/cell_introduce1.c | 1357 - src/tor/src/trunnel/hs/cell_introduce1.h | 493 - .../src/trunnel/hs/cell_introduce1.trunnel | 60 - src/tor/src/trunnel/hs/cell_rendezvous.c | 470 - src/tor/src/trunnel/hs/cell_rendezvous.h | 187 - .../src/trunnel/hs/cell_rendezvous.trunnel | 29 - src/tor/src/trunnel/include.am | 52 - src/tor/src/trunnel/link_handshake.c | 2061 - src/tor/src/trunnel/link_handshake.h | 762 - src/tor/src/trunnel/link_handshake.trunnel | 57 - src/tor/src/trunnel/pwbox.c | 559 - src/tor/src/trunnel/pwbox.h | 199 - src/tor/src/trunnel/pwbox.trunnel | 14 - src/tor/src/trunnel/trunnel-local.h | 18 - src/tor/src/win32/include.am | 3 - src/tor/{src/or => }/statefile.c | 109 +- src/tor/{src/or => }/statefile.h | 7 +- src/tor/{src/or => }/status.c | 110 +- src/tor/status.h | 10 + src/tor/{src/ext => }/strlcat.c | 0 src/tor/{src/ext => }/strlcpy.c | 0 src/tor/{src/common => }/testsupport.h | 24 +- src/tor/{src/ext => }/tinytest.h | 19 +- src/tor/{src/ext => }/tinytest_macros.h | 27 +- src/tor/{src/common/compat.h => tor_compat.h} | 351 +- src/tor/{src/ext => }/tor_queue.h | 23 +- src/tor/{src/common/util.c => tor_util.c} | 2019 +- src/tor/{src/common/util.h => tor_util.h} | 204 +- src/tor/torgzip.c | 527 + src/tor/torgzip.h | 59 + src/tor/{src/common => }/torint.h | 112 +- src/tor/{src/common => }/torlog.h | 132 +- src/tor/{src/common => }/tortls.c | 1456 +- src/tor/tortls.h | 142 + src/tor/{src/or => }/transports.c | 254 +- src/tor/{src/or => }/transports.h | 29 +- src/tor/util_codedigest.c | 13 + 984 files changed, 47247 insertions(+), 551473 deletions(-) delete mode 100644 src/tor/.gitignore delete mode 100644 src/tor/.gitlab-ci.yml delete mode 100644 src/tor/.gitmodules delete mode 100644 src/tor/.travis.yml delete mode 100644 src/tor/ChangeLog delete mode 100644 src/tor/Doxyfile.in delete mode 100644 src/tor/INSTALL delete mode 100644 src/tor/Makefile.am delete mode 100644 src/tor/Makefile.nmake delete mode 100644 src/tor/README delete mode 100644 src/tor/ReleaseNotes delete mode 100644 src/tor/acinclude.m4 rename src/tor/{src/common => }/address.c (70%) rename src/tor/{src/common => }/address.h (50%) rename src/tor/{src/or => }/addressmap.c (86%) rename src/tor/{src/or => }/addressmap.h (88%) rename src/tor/{src/common => }/aes.c (56%) rename src/tor/{src/common => }/aes.h (58%) create mode 100644 src/tor/anonymize.cpp create mode 100644 src/tor/anonymize.h delete mode 100644 src/tor/autogen.sh rename src/tor/{src/common => }/backtrace.c (66%) create mode 100644 src/tor/backtrace.h create mode 100644 src/tor/buffers.c create mode 100644 src/tor/buffers.h delete mode 100644 src/tor/changes/.dummy delete mode 100644 src/tor/changes/bug12062 delete mode 100644 src/tor/changes/bug22605 delete mode 100644 src/tor/changes/bug22907 delete mode 100644 src/tor/changes/bug23100 delete mode 100644 src/tor/changes/bug23114 delete mode 100644 src/tor/changes/bug23571 delete mode 100644 src/tor/changes/bug23826-23828 delete mode 100644 src/tor/changes/bug23827 delete mode 100644 src/tor/changes/bug23848 delete mode 100644 src/tor/changes/bug23953 delete mode 100644 src/tor/changes/bug24119 delete mode 100644 src/tor/changes/bug24137 delete mode 100644 src/tor/changes/bug24318 delete mode 100644 src/tor/changes/bug24337 delete mode 100644 src/tor/changes/bug24362 delete mode 100644 src/tor/changes/bug24374 delete mode 100644 src/tor/changes/bug24488 delete mode 100644 src/tor/changes/bug24489 delete mode 100644 src/tor/changes/bug24605 delete mode 100644 src/tor/changes/bug24612 delete mode 100644 src/tor/changes/bug24613 delete mode 100644 src/tor/changes/cargo-build-problem delete mode 100644 src/tor/changes/feature24427 delete mode 100644 src/tor/changes/ticket13605 delete mode 100644 src/tor/changes/ticket20020 delete mode 100644 src/tor/changes/ticket20699 delete mode 100644 src/tor/changes/ticket20895 delete mode 100644 src/tor/changes/ticket22342 delete mode 100644 src/tor/changes/ticket22703 delete mode 100644 src/tor/changes/ticket22840 delete mode 100644 src/tor/changes/ticket23271 delete mode 100644 src/tor/changes/ticket23459 delete mode 100644 src/tor/changes/ticket23577 delete mode 100644 src/tor/changes/ticket23637 delete mode 100644 src/tor/changes/ticket23709 delete mode 100644 src/tor/changes/ticket23760 delete mode 100644 src/tor/changes/ticket23845 delete mode 100644 src/tor/changes/ticket23900 delete mode 100644 src/tor/changes/ticket24363 delete mode 100644 src/tor/changes/ticket24467 delete mode 100644 src/tor/changes/ticket24518 rename src/tor/{src/or => }/channel.c (65%) rename src/tor/{src/or => }/channel.h (52%) rename src/tor/{src/or => }/channeltls.c (68%) rename src/tor/{src/or => }/channeltls.h (54%) create mode 100644 src/tor/ciphers.inc rename src/tor/{src/or => }/circpathbias.c (84%) rename src/tor/{src/or => }/circpathbias.h (91%) rename src/tor/{src/or => }/circuitbuild.c (55%) create mode 100644 src/tor/circuitbuild.h rename src/tor/{src/or => }/circuitlist.c (57%) rename src/tor/{src/or => }/circuitlist.h (63%) rename src/tor/{src/or => }/circuitmux.c (91%) rename src/tor/{src/or => }/circuitmux.h (82%) rename src/tor/{src/or => }/circuitmux_ewma.c (86%) rename src/tor/{src/or => }/circuitmux_ewma.h (69%) rename src/tor/{src/or => }/circuitstats.c (79%) rename src/tor/{src/or => }/circuitstats.h (81%) rename src/tor/{src/or => }/circuituse.c (65%) rename src/tor/{src/or => }/circuituse.h (66%) rename src/tor/{src/or => }/command.c (84%) rename src/tor/{src/or => }/command.h (90%) create mode 100644 src/tor/common_sha1.i rename src/tor/{src/common => }/compat.c (71%) create mode 100644 src/tor/compat_libevent.c create mode 100644 src/tor/compat_libevent.h rename src/tor/{src/or => }/config.c (60%) create mode 100644 src/tor/config.h create mode 100644 src/tor/config_codedigest.c delete mode 100644 src/tor/configure.ac rename src/tor/{src/or => }/confparse.c (87%) rename src/tor/{src/or => }/confparse.h (62%) rename src/tor/{src/or => }/connection.c (73%) rename src/tor/{src/or => }/connection.h (56%) rename src/tor/{src/or => }/connection_edge.c (64%) rename src/tor/{src/or => }/connection_edge.h (59%) rename src/tor/{src/or => }/connection_or.c (65%) rename src/tor/{src/or => }/connection_or.h (57%) rename src/tor/{src/common => }/container.c (58%) rename src/tor/{src/common => }/container.h (80%) delete mode 100644 src/tor/contrib/README delete mode 100644 src/tor/contrib/clang/sanitize_blacklist.txt delete mode 100644 src/tor/contrib/client-tools/tor-resolve.py delete mode 100644 src/tor/contrib/client-tools/torify delete mode 100644 src/tor/contrib/dirauth-tools/add-tor delete mode 100644 src/tor/contrib/dirauth-tools/nagios-check-tor-authority-cert delete mode 100644 src/tor/contrib/dist/rc.subr delete mode 100644 src/tor/contrib/dist/suse/tor.sh.in delete mode 100644 src/tor/contrib/dist/tor.service.in delete mode 100644 src/tor/contrib/dist/tor.sh.in delete mode 100644 src/tor/contrib/dist/torctl.in delete mode 100644 src/tor/contrib/include.am delete mode 100644 src/tor/contrib/operator-tools/linux-tor-prio.sh delete mode 100644 src/tor/contrib/operator-tools/tor-exit-notice.html delete mode 100644 src/tor/contrib/operator-tools/tor.logrotate.in delete mode 100644 src/tor/contrib/or-tools/check-tor delete mode 100644 src/tor/contrib/or-tools/checksocks.pl delete mode 100644 src/tor/contrib/or-tools/exitlist delete mode 100644 src/tor/contrib/win32build/package_nsis-mingw.sh delete mode 100644 src/tor/contrib/win32build/tor-mingw.nsi.in delete mode 100644 src/tor/contrib/win32build/tor.ico delete mode 100644 src/tor/contrib/win32build/tor.nsi.in rename src/tor/{src/or => }/control.c (60%) rename src/tor/{src/or => }/control.h (51%) create mode 100644 src/tor/cpuworker.c rename src/tor/{src/or => }/cpuworker.h (54%) rename src/tor/{src/common => }/crypto.c (61%) rename src/tor/{src/common => }/crypto.h (62%) create mode 100644 src/tor/crypto_curve25519.c rename src/tor/{src/common => }/crypto_curve25519.h (77%) create mode 100644 src/tor/crypto_format.c rename src/tor/{src/ext/curve25519_donna => }/curve25519-donna.c (75%) rename src/tor/{src/common => }/di_ops.c (81%) rename src/tor/{src/common => }/di_ops.h (71%) create mode 100644 src/tor/directory.c create mode 100644 src/tor/directory.h rename src/tor/{src/or => }/dirserv.c (61%) rename src/tor/{src/or => }/dirserv.h (51%) rename src/tor/{src/or => }/dirvote.c (76%) create mode 100644 src/tor/dirvote.h rename src/tor/{src/or => }/dns.c (87%) create mode 100644 src/tor/dns.h rename src/tor/{src/or => }/dnsserv.c (79%) rename src/tor/{src/or => }/dnsserv.h (89%) delete mode 100644 src/tor/doc/HACKING/CodingStandards.md delete mode 100644 src/tor/doc/HACKING/CodingStandardsRust.md delete mode 100644 src/tor/doc/HACKING/Fuzzing.md delete mode 100644 src/tor/doc/HACKING/GettingStarted.md delete mode 100644 src/tor/doc/HACKING/GettingStartedRust.md delete mode 100644 src/tor/doc/HACKING/HelpfulTools.md delete mode 100644 src/tor/doc/HACKING/HowToReview.md delete mode 100644 src/tor/doc/HACKING/README.1st.md delete mode 100644 src/tor/doc/HACKING/ReleasingTor.md delete mode 100644 src/tor/doc/HACKING/Tracing.md delete mode 100644 src/tor/doc/HACKING/WritingTests.md delete mode 100644 src/tor/doc/HACKING/android/Simpleperf.md delete mode 100644 src/tor/doc/TUNING delete mode 100644 src/tor/doc/asciidoc-helper.sh delete mode 100644 src/tor/doc/building-tor-msvc.txt delete mode 100644 src/tor/doc/contrib/tor-rpm-creation.txt delete mode 100644 src/tor/doc/include.am delete mode 100644 src/tor/doc/state-contents.txt delete mode 100644 src/tor/doc/tor-gencert.1.txt delete mode 100644 src/tor/doc/tor-resolve.1.txt delete mode 100644 src/tor/doc/tor.1.txt delete mode 100644 src/tor/doc/torify.1.txt delete mode 100644 src/tor/doc/torrc_format.txt create mode 100644 src/tor/entrynodes.c create mode 100644 src/tor/entrynodes.h create mode 100644 src/tor/eventdns.h create mode 100644 src/tor/eventdns_tor.h rename src/tor/{src/or => }/ext_orport.c (91%) rename src/tor/{src/or => }/ext_orport.h (83%) rename src/tor/{src/or => }/fp_pair.c (85%) rename src/tor/{src/or => }/fp_pair.h (82%) rename src/tor/{src/or => }/geoip.c (92%) rename src/tor/{src/or => }/geoip.h (84%) rename src/tor/{src/or => }/hibernate.c (84%) rename src/tor/{src/or => }/hibernate.h (80%) rename src/tor/{src/ext => }/ht.h (80%) rename src/tor/{src/common => }/log.c (71%) delete mode 100644 src/tor/m4/ax_check_sign.m4 delete mode 100644 src/tor/m4/pc_from_ucontext.m4 delete mode 100644 src/tor/m4/pkg.m4 rename src/tor/{src/common => }/memarea.c (59%) rename src/tor/{src/common => }/memarea.h (68%) create mode 100644 src/tor/mempool.c create mode 100644 src/tor/mempool.h rename src/tor/{src/or => }/microdesc.c (68%) rename src/tor/{src/or => }/microdesc.h (76%) rename src/tor/{src/or => }/networkstatus.c (58%) rename src/tor/{src/or => }/networkstatus.h (51%) rename src/tor/{src/or => }/nodelist.c (50%) create mode 100644 src/tor/nodelist.h rename src/tor/{src/or => }/ntmain.h (76%) rename src/tor/{src/or => }/onion.c (73%) rename src/tor/{src/or => }/onion.h (90%) rename src/tor/{src/or => }/onion_fast.c (68%) rename src/tor/{src/or => }/onion_fast.h (72%) create mode 100644 src/tor/onion_main.c rename src/tor/{src/or/main.h => onion_main.h} (57%) rename src/tor/{src/or => }/onion_ntor.c (87%) rename src/tor/{src/or => }/onion_ntor.h (82%) rename src/tor/{src/or => }/onion_tap.c (81%) rename src/tor/{src/or => }/onion_tap.h (85%) rename src/tor/{src/or => }/or.h (78%) create mode 100644 src/tor/or_sha1.i create mode 100644 src/tor/orconfig.h create mode 100644 src/tor/orconfig_apple.h create mode 100644 src/tor/orconfig_linux.h rename src/tor/{src/win32/orconfig.h => orconfig_win32.h} (90%) create mode 100644 src/tor/policies.c create mode 100644 src/tor/policies.h rename src/tor/{src/common => }/procmon.c (90%) rename src/tor/{src/common => }/procmon.h (75%) rename src/tor/{src/or => }/reasons.c (82%) rename src/tor/{src/or => }/reasons.h (85%) rename src/tor/{src/or => }/relay.c (75%) rename src/tor/{src/or => }/relay.h (65%) rename src/tor/{src/or => }/rendclient.c (55%) rename src/tor/{src/or => }/rendclient.h (71%) create mode 100644 src/tor/rendcommon.c create mode 100644 src/tor/rendcommon.h rename src/tor/{src/or => }/rendmid.c (78%) rename src/tor/{src/or => }/rendmid.h (60%) create mode 100644 src/tor/rendservice.c create mode 100644 src/tor/rendservice.h rename src/tor/{src/or => }/rephist.c (77%) rename src/tor/{src/or => }/rephist.h (69%) rename src/tor/{src/or => }/replaycache.c (77%) rename src/tor/{src/or => }/replaycache.h (80%) rename src/tor/{src/or => }/router.c (67%) rename src/tor/{src/or => }/router.h (74%) rename src/tor/{src/or => }/routerlist.c (69%) rename src/tor/{src/or => }/routerlist.h (66%) rename src/tor/{src/or => }/routerparse.c (67%) rename src/tor/{src/or => }/routerparse.h (55%) rename src/tor/{src/or => }/routerset.c (78%) create mode 100644 src/tor/routerset.h create mode 100644 src/tor/sandbox.c create mode 100644 src/tor/sandbox.h delete mode 100644 src/tor/scripts/README delete mode 100644 src/tor/scripts/coccinelle/calloc.cocci delete mode 100644 src/tor/scripts/coccinelle/ceil_div.cocci delete mode 100644 src/tor/scripts/coccinelle/malloc_cast.cocci delete mode 100644 src/tor/scripts/coccinelle/test-operator-cleanup delete mode 100644 src/tor/scripts/coccinelle/test_assert_int.cocci delete mode 100644 src/tor/scripts/coccinelle/test_assert_null.cocci delete mode 100644 src/tor/scripts/coccinelle/test_assert_zero.cocci delete mode 100644 src/tor/scripts/coccinelle/uncalloc.cocci delete mode 100644 src/tor/scripts/codegen/fuzzing_include_am.py delete mode 100644 src/tor/scripts/codegen/gen_linux_syscalls.pl delete mode 100644 src/tor/scripts/codegen/gen_server_ciphers.py delete mode 100644 src/tor/scripts/codegen/get_mozilla_ciphers.py delete mode 100644 src/tor/scripts/codegen/makedesc.py delete mode 100644 src/tor/scripts/codegen/run_trunnel.sh delete mode 100644 src/tor/scripts/maint/annotate_ifdef_directives delete mode 100644 src/tor/scripts/maint/checkLogs.pl delete mode 100644 src/tor/scripts/maint/checkOptionDocs.pl.in delete mode 100644 src/tor/scripts/maint/checkSpace.pl delete mode 100644 src/tor/scripts/maint/check_config_macros.pl delete mode 100644 src/tor/scripts/maint/fallback.blacklist delete mode 100644 src/tor/scripts/maint/fallback.whitelist delete mode 100644 src/tor/scripts/maint/findMergedChanges.pl delete mode 100644 src/tor/scripts/maint/format_changelog.py delete mode 100644 src/tor/scripts/maint/lintChanges.py delete mode 100644 src/tor/scripts/maint/locatemissingdoxygen.py delete mode 100644 src/tor/scripts/maint/redox.py delete mode 100644 src/tor/scripts/maint/run_calltool.sh delete mode 100644 src/tor/scripts/maint/sortChanges.py delete mode 100644 src/tor/scripts/maint/updateCopyright.pl delete mode 100644 src/tor/scripts/maint/updateFallbackDirs.py delete mode 100644 src/tor/scripts/maint/updateVersions.pl.in delete mode 100644 src/tor/scripts/test/cov-blame delete mode 100644 src/tor/scripts/test/cov-diff delete mode 100644 src/tor/scripts/test/cov-display delete mode 100644 src/tor/scripts/test/cov-exclude delete mode 100644 src/tor/scripts/test/coverage delete mode 100644 src/tor/scripts/test/scan-build.sh delete mode 100644 src/tor/src/common/Makefile.nmake delete mode 100644 src/tor/src/common/backtrace.h delete mode 100644 src/tor/src/common/buffers.c delete mode 100644 src/tor/src/common/buffers.h delete mode 100644 src/tor/src/common/buffers_tls.c delete mode 100644 src/tor/src/common/buffers_tls.h delete mode 100644 src/tor/src/common/ciphers.inc delete mode 100644 src/tor/src/common/compat_libevent.c delete mode 100644 src/tor/src/common/compat_libevent.h delete mode 100644 src/tor/src/common/compat_openssl.h delete mode 100644 src/tor/src/common/compat_pthreads.c delete mode 100644 src/tor/src/common/compat_threads.c delete mode 100644 src/tor/src/common/compat_threads.h delete mode 100644 src/tor/src/common/compat_time.c delete mode 100644 src/tor/src/common/compat_time.h delete mode 100644 src/tor/src/common/compat_winthreads.c delete mode 100644 src/tor/src/common/compress.c delete mode 100644 src/tor/src/common/compress.h delete mode 100644 src/tor/src/common/compress_lzma.c delete mode 100644 src/tor/src/common/compress_lzma.h delete mode 100644 src/tor/src/common/compress_none.c delete mode 100644 src/tor/src/common/compress_none.h delete mode 100644 src/tor/src/common/compress_zlib.c delete mode 100644 src/tor/src/common/compress_zlib.h delete mode 100644 src/tor/src/common/compress_zstd.c delete mode 100644 src/tor/src/common/compress_zstd.h delete mode 100644 src/tor/src/common/confline.c delete mode 100644 src/tor/src/common/confline.h delete mode 100644 src/tor/src/common/crypto_curve25519.c delete mode 100644 src/tor/src/common/crypto_ed25519.c delete mode 100644 src/tor/src/common/crypto_ed25519.h delete mode 100644 src/tor/src/common/crypto_format.c delete mode 100644 src/tor/src/common/crypto_format.h delete mode 100644 src/tor/src/common/crypto_pwbox.c delete mode 100644 src/tor/src/common/crypto_pwbox.h delete mode 100644 src/tor/src/common/crypto_s2k.c delete mode 100644 src/tor/src/common/crypto_s2k.h delete mode 100644 src/tor/src/common/handles.h delete mode 100644 src/tor/src/common/include.am delete mode 100644 src/tor/src/common/linux_syscalls.inc delete mode 100644 src/tor/src/common/pubsub.c delete mode 100644 src/tor/src/common/pubsub.h delete mode 100644 src/tor/src/common/sandbox.c delete mode 100644 src/tor/src/common/sandbox.h delete mode 100644 src/tor/src/common/storagedir.c delete mode 100644 src/tor/src/common/storagedir.h delete mode 100644 src/tor/src/common/timers.c delete mode 100644 src/tor/src/common/timers.h delete mode 100644 src/tor/src/common/tortls.h delete mode 100644 src/tor/src/common/util_bug.c delete mode 100644 src/tor/src/common/util_bug.h delete mode 100644 src/tor/src/common/util_format.c delete mode 100644 src/tor/src/common/util_format.h delete mode 100644 src/tor/src/common/util_process.c delete mode 100644 src/tor/src/common/util_process.h delete mode 100644 src/tor/src/common/workqueue.c delete mode 100644 src/tor/src/common/workqueue.h delete mode 100644 src/tor/src/config/README delete mode 100644 src/tor/src/config/geoip delete mode 100644 src/tor/src/config/geoip6 delete mode 100644 src/tor/src/config/include.am delete mode 100644 src/tor/src/config/mmdb-convert.py delete mode 100644 src/tor/src/config/torrc.minimal.in delete mode 100644 src/tor/src/config/torrc.minimal.in-staging delete mode 100644 src/tor/src/config/torrc.sample.in delete mode 100644 src/tor/src/ext/Makefile.nmake delete mode 100644 src/tor/src/ext/OpenBSD_malloc_Linux.c delete mode 100644 src/tor/src/ext/README delete mode 100644 src/tor/src/ext/byteorder.h delete mode 100644 src/tor/src/ext/csiphash.c delete mode 100644 src/tor/src/ext/curve25519_donna/README delete mode 100644 src/tor/src/ext/curve25519_donna/curve25519-donna-c64.c delete mode 100644 src/tor/src/ext/ed25519/donna/README.md delete mode 100644 src/tor/src/ext/ed25519/donna/README.tor delete mode 100644 src/tor/src/ext/ed25519/donna/curve25519-donna-32bit.h delete mode 100644 src/tor/src/ext/ed25519/donna/curve25519-donna-64bit.h delete mode 100644 src/tor/src/ext/ed25519/donna/curve25519-donna-helpers.h delete mode 100644 src/tor/src/ext/ed25519/donna/curve25519-donna-sse2.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-batchverify.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-impl-base.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-portable-identify.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna-portable.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-donna.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-hash-custom.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-hash.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-randombytes-custom.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519-randombytes.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519.c delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519_donna_tor.h delete mode 100644 src/tor/src/ext/ed25519/donna/ed25519_tor.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/README.md delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/build-nix.php delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/curve25519-ref10.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/curve25519-ref10.h delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/ed25519-donna-sse2.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/ed25519-donna.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/ed25519-donna.h delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.h delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c delete mode 100644 src/tor/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c delete mode 100644 src/tor/src/ext/ed25519/donna/modm-donna-32bit.h delete mode 100644 src/tor/src/ext/ed25519/donna/modm-donna-64bit.h delete mode 100644 src/tor/src/ext/ed25519/donna/regression.h delete mode 100644 src/tor/src/ext/ed25519/donna/test-internals.c delete mode 100644 src/tor/src/ext/ed25519/donna/test-ticks.h delete mode 100644 src/tor/src/ext/ed25519/donna/test.c delete mode 100644 src/tor/src/ext/ed25519/ref10/README.tor delete mode 100644 src/tor/src/ext/ed25519/ref10/api.h delete mode 100644 src/tor/src/ext/ed25519/ref10/base.h delete mode 100644 src/tor/src/ext/ed25519/ref10/base.py delete mode 100644 src/tor/src/ext/ed25519/ref10/base2.h delete mode 100644 src/tor/src/ext/ed25519/ref10/base2.py delete mode 100644 src/tor/src/ext/ed25519/ref10/blinding.c delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_hash_sha512.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_int32.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_int64.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_sign.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_uint32.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_uint64.h delete mode 100644 src/tor/src/ext/ed25519/ref10/crypto_verify_32.h delete mode 100644 src/tor/src/ext/ed25519/ref10/d.h delete mode 100644 src/tor/src/ext/ed25519/ref10/d.py delete mode 100644 src/tor/src/ext/ed25519/ref10/d2.h delete mode 100644 src/tor/src/ext/ed25519/ref10/d2.py delete mode 100644 src/tor/src/ext/ed25519/ref10/ed25519_ref10.h delete mode 100644 src/tor/src/ext/ed25519/ref10/fe.h delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_0.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_1.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_add.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_cmov.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_copy.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_frombytes.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_invert.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_isnegative.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_isnonzero.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_mul.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_neg.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_pow22523.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_sq.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_sq2.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_sub.c delete mode 100644 src/tor/src/ext/ed25519/ref10/fe_tobytes.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_add.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_add.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_add.q delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_double_scalarmult.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_frombytes.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_madd.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_madd.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_madd.q delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_msub.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_msub.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_msub.q delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p2.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p3.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p2_0.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p2_dbl.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p2_dbl.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p2_dbl.q delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p3_0.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p3_dbl.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p3_to_cached.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p3_to_p2.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_p3_tobytes.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_precomp_0.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_scalarmult_base.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_sub.c delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_sub.h delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_sub.q delete mode 100644 src/tor/src/ext/ed25519/ref10/ge_tobytes.c delete mode 100644 src/tor/src/ext/ed25519/ref10/keyconv.c delete mode 100644 src/tor/src/ext/ed25519/ref10/keypair.c delete mode 100644 src/tor/src/ext/ed25519/ref10/open.c delete mode 100644 src/tor/src/ext/ed25519/ref10/pow22523.h delete mode 100644 src/tor/src/ext/ed25519/ref10/pow22523.q delete mode 100644 src/tor/src/ext/ed25519/ref10/pow225521.h delete mode 100644 src/tor/src/ext/ed25519/ref10/pow225521.q delete mode 100644 src/tor/src/ext/ed25519/ref10/q2h.sh delete mode 100644 src/tor/src/ext/ed25519/ref10/randombytes.h delete mode 100644 src/tor/src/ext/ed25519/ref10/sc.h delete mode 100644 src/tor/src/ext/ed25519/ref10/sc_muladd.c delete mode 100644 src/tor/src/ext/ed25519/ref10/sc_reduce.c delete mode 100644 src/tor/src/ext/ed25519/ref10/sign.c delete mode 100644 src/tor/src/ext/ed25519/ref10/sqrtm1.h delete mode 100644 src/tor/src/ext/ed25519/ref10/sqrtm1.py delete mode 100644 src/tor/src/ext/include.am delete mode 100644 src/tor/src/ext/keccak-tiny/README.markdown delete mode 100644 src/tor/src/ext/keccak-tiny/do.sh delete mode 100644 src/tor/src/ext/keccak-tiny/keccak-tiny-unrolled.c delete mode 100644 src/tor/src/ext/keccak-tiny/keccak-tiny.c delete mode 100644 src/tor/src/ext/keccak-tiny/keccak-tiny.h delete mode 100644 src/tor/src/ext/mulodi/LICENSE.TXT delete mode 100644 src/tor/src/ext/mulodi/mulodi4.c delete mode 100644 src/tor/src/ext/readpassphrase.c delete mode 100644 src/tor/src/ext/rust/README delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-ok delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/.gitignore delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/.travis.yml delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/Cargo.toml delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/README.md delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/appveyor.yml delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/README.md delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/dox.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/run.sh delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/ci/style.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/dox.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/lib.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/macros.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/redox.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs delete mode 100644 src/tor/src/ext/rust/crates/libc-0.2.22/src/windows.rs delete mode 100644 src/tor/src/ext/siphash.h delete mode 100644 src/tor/src/ext/timeouts/Rules.shrc delete mode 100644 src/tor/src/ext/timeouts/bench/Rules.mk delete mode 100644 src/tor/src/ext/timeouts/bench/bench-add.lua delete mode 100644 src/tor/src/ext/timeouts/bench/bench-aux.lua delete mode 100644 src/tor/src/ext/timeouts/bench/bench-del.lua delete mode 100644 src/tor/src/ext/timeouts/bench/bench-expire.lua delete mode 100644 src/tor/src/ext/timeouts/bench/bench-heap.c delete mode 100644 src/tor/src/ext/timeouts/bench/bench-llrb.c delete mode 100644 src/tor/src/ext/timeouts/bench/bench-wheel.c delete mode 100644 src/tor/src/ext/timeouts/bench/bench.c delete mode 100644 src/tor/src/ext/timeouts/bench/bench.h delete mode 100644 src/tor/src/ext/timeouts/bench/bench.plt delete mode 100644 src/tor/src/ext/timeouts/lua/Rules.mk delete mode 100644 src/tor/src/ext/timeouts/lua/timeout-lua.c delete mode 100644 src/tor/src/ext/timeouts/test-timeout.c delete mode 100644 src/tor/src/ext/timeouts/timeout-bitops.c delete mode 100644 src/tor/src/ext/timeouts/timeout-debug.h delete mode 100644 src/tor/src/ext/timeouts/timeout.c delete mode 100644 src/tor/src/ext/timeouts/timeout.h delete mode 100644 src/tor/src/ext/tinytest.c delete mode 100644 src/tor/src/ext/tinytest_demo.c delete mode 100644 src/tor/src/ext/tor_queue.txt delete mode 100644 src/tor/src/ext/tor_readpassphrase.h delete mode 100644 src/tor/src/ext/trunnel/trunnel-impl.h delete mode 100644 src/tor/src/ext/trunnel/trunnel.c delete mode 100644 src/tor/src/ext/trunnel/trunnel.h delete mode 100644 src/tor/src/include.am delete mode 100644 src/tor/src/or/Makefile.nmake delete mode 100644 src/tor/src/or/bridges.c delete mode 100644 src/tor/src/or/bridges.h delete mode 100644 src/tor/src/or/channelpadding.c delete mode 100644 src/tor/src/or/channelpadding.h delete mode 100644 src/tor/src/or/circuitbuild.h delete mode 100644 src/tor/src/or/config.h delete mode 100644 src/tor/src/or/conscache.c delete mode 100644 src/tor/src/or/conscache.h delete mode 100644 src/tor/src/or/consdiff.c delete mode 100644 src/tor/src/or/consdiff.h delete mode 100644 src/tor/src/or/consdiffmgr.c delete mode 100644 src/tor/src/or/consdiffmgr.h delete mode 100644 src/tor/src/or/cpuworker.c delete mode 100644 src/tor/src/or/dircollate.c delete mode 100644 src/tor/src/or/dircollate.h delete mode 100644 src/tor/src/or/directory.c delete mode 100644 src/tor/src/or/directory.h delete mode 100644 src/tor/src/or/dirvote.h delete mode 100644 src/tor/src/or/dns.h delete mode 100644 src/tor/src/or/dns_structs.h delete mode 100644 src/tor/src/or/entrynodes.c delete mode 100644 src/tor/src/or/entrynodes.h delete mode 100644 src/tor/src/or/fallback_dirs.inc delete mode 100644 src/tor/src/or/git_revision.c delete mode 100644 src/tor/src/or/git_revision.h delete mode 100644 src/tor/src/or/hs_cache.c delete mode 100644 src/tor/src/or/hs_cache.h delete mode 100644 src/tor/src/or/hs_cell.c delete mode 100644 src/tor/src/or/hs_cell.h delete mode 100644 src/tor/src/or/hs_circuit.c delete mode 100644 src/tor/src/or/hs_circuit.h delete mode 100644 src/tor/src/or/hs_circuitmap.c delete mode 100644 src/tor/src/or/hs_circuitmap.h delete mode 100644 src/tor/src/or/hs_client.c delete mode 100644 src/tor/src/or/hs_client.h delete mode 100644 src/tor/src/or/hs_common.c delete mode 100644 src/tor/src/or/hs_common.h delete mode 100644 src/tor/src/or/hs_config.c delete mode 100644 src/tor/src/or/hs_config.h delete mode 100644 src/tor/src/or/hs_control.c delete mode 100644 src/tor/src/or/hs_control.h delete mode 100644 src/tor/src/or/hs_descriptor.c delete mode 100644 src/tor/src/or/hs_descriptor.h delete mode 100644 src/tor/src/or/hs_ident.c delete mode 100644 src/tor/src/or/hs_ident.h delete mode 100644 src/tor/src/or/hs_intropoint.c delete mode 100644 src/tor/src/or/hs_intropoint.h delete mode 100644 src/tor/src/or/hs_ntor.c delete mode 100644 src/tor/src/or/hs_ntor.h delete mode 100644 src/tor/src/or/hs_service.c delete mode 100644 src/tor/src/or/hs_service.h delete mode 100644 src/tor/src/or/include.am delete mode 100644 src/tor/src/or/keypin.c delete mode 100644 src/tor/src/or/keypin.h delete mode 100644 src/tor/src/or/main.c delete mode 100644 src/tor/src/or/nodelist.h delete mode 100644 src/tor/src/or/ntmain.c delete mode 100644 src/tor/src/or/parsecommon.c delete mode 100644 src/tor/src/or/parsecommon.h delete mode 100644 src/tor/src/or/periodic.c delete mode 100644 src/tor/src/or/periodic.h delete mode 100644 src/tor/src/or/policies.c delete mode 100644 src/tor/src/or/policies.h delete mode 100644 src/tor/src/or/proto_cell.c delete mode 100644 src/tor/src/or/proto_cell.h delete mode 100644 src/tor/src/or/proto_control0.c delete mode 100644 src/tor/src/or/proto_control0.h delete mode 100644 src/tor/src/or/proto_ext_or.c delete mode 100644 src/tor/src/or/proto_ext_or.h delete mode 100644 src/tor/src/or/proto_http.c delete mode 100644 src/tor/src/or/proto_http.h delete mode 100644 src/tor/src/or/proto_socks.c delete mode 100644 src/tor/src/or/proto_socks.h delete mode 100644 src/tor/src/or/protover.c delete mode 100644 src/tor/src/or/protover.h delete mode 100644 src/tor/src/or/protover_rust.c delete mode 100644 src/tor/src/or/rendcache.c delete mode 100644 src/tor/src/or/rendcache.h delete mode 100644 src/tor/src/or/rendcommon.c delete mode 100644 src/tor/src/or/rendcommon.h delete mode 100644 src/tor/src/or/rendservice.c delete mode 100644 src/tor/src/or/rendservice.h delete mode 100644 src/tor/src/or/routerkeys.c delete mode 100644 src/tor/src/or/routerkeys.h delete mode 100644 src/tor/src/or/routerset.h delete mode 100644 src/tor/src/or/scheduler.c delete mode 100644 src/tor/src/or/scheduler.h delete mode 100644 src/tor/src/or/scheduler_kist.c delete mode 100644 src/tor/src/or/scheduler_vanilla.c delete mode 100644 src/tor/src/or/shared_random.c delete mode 100644 src/tor/src/or/shared_random.h delete mode 100644 src/tor/src/or/shared_random_state.c delete mode 100644 src/tor/src/or/shared_random_state.h delete mode 100644 src/tor/src/or/status.h delete mode 100644 src/tor/src/or/tor_api.c delete mode 100644 src/tor/src/or/tor_api.h delete mode 100644 src/tor/src/or/tor_api_internal.h delete mode 100644 src/tor/src/or/tor_main.c delete mode 100644 src/tor/src/or/torcert.c delete mode 100644 src/tor/src/or/torcert.h delete mode 100644 src/tor/src/rust/.cargo/config.in delete mode 100644 src/tor/src/rust/.rustfmt.toml delete mode 100644 src/tor/src/rust/Cargo.lock delete mode 100644 src/tor/src/rust/Cargo.toml delete mode 100644 src/tor/src/rust/external/Cargo.toml delete mode 100644 src/tor/src/rust/external/external.rs delete mode 100644 src/tor/src/rust/external/lib.rs delete mode 100644 src/tor/src/rust/include.am delete mode 100644 src/tor/src/rust/protover/Cargo.toml delete mode 100644 src/tor/src/rust/protover/ffi.rs delete mode 100644 src/tor/src/rust/protover/lib.rs delete mode 100644 src/tor/src/rust/protover/protover.rs delete mode 100644 src/tor/src/rust/protover/tests/protover.rs delete mode 100644 src/tor/src/rust/smartlist/Cargo.toml delete mode 100644 src/tor/src/rust/smartlist/lib.rs delete mode 100644 src/tor/src/rust/smartlist/smartlist.rs delete mode 100644 src/tor/src/rust/tor_allocate/Cargo.toml delete mode 100644 src/tor/src/rust/tor_allocate/lib.rs delete mode 100644 src/tor/src/rust/tor_allocate/tor_allocate.rs delete mode 100644 src/tor/src/rust/tor_rust/Cargo.toml delete mode 100644 src/tor/src/rust/tor_rust/include.am delete mode 100644 src/tor/src/rust/tor_rust/lib.rs delete mode 100644 src/tor/src/rust/tor_util/Cargo.toml delete mode 100644 src/tor/src/rust/tor_util/ffi.rs delete mode 100644 src/tor/src/rust/tor_util/lib.rs delete mode 100644 src/tor/src/test/Makefile.nmake delete mode 100644 src/tor/src/test/bench.c delete mode 100644 src/tor/src/test/bt_test.py delete mode 100644 src/tor/src/test/ed25519_exts_ref.py delete mode 100644 src/tor/src/test/ed25519_vectors.inc delete mode 100644 src/tor/src/test/example_extrainfo.inc delete mode 100644 src/tor/src/test/failing_routerdescs.inc delete mode 100644 src/tor/src/test/fakechans.h delete mode 100644 src/tor/src/test/fuzz/dict/consensus delete mode 100644 src/tor/src/test/fuzz/dict/descriptor delete mode 100644 src/tor/src/test/fuzz/dict/extrainfo delete mode 100644 src/tor/src/test/fuzz/dict/hsdescv2 delete mode 100644 src/tor/src/test/fuzz/dict/hsdescv3 delete mode 100644 src/tor/src/test/fuzz/dict/http delete mode 100644 src/tor/src/test/fuzz/dict/iptsv2 delete mode 100644 src/tor/src/test/fuzz/dict/microdesc delete mode 100644 src/tor/src/test/fuzz/fixup_filenames.sh delete mode 100644 src/tor/src/test/fuzz/fuzz_consensus.c delete mode 100644 src/tor/src/test/fuzz/fuzz_descriptor.c delete mode 100644 src/tor/src/test/fuzz/fuzz_diff.c delete mode 100644 src/tor/src/test/fuzz/fuzz_diff_apply.c delete mode 100644 src/tor/src/test/fuzz/fuzz_extrainfo.c delete mode 100644 src/tor/src/test/fuzz/fuzz_hsdescv2.c delete mode 100644 src/tor/src/test/fuzz/fuzz_hsdescv3.c delete mode 100644 src/tor/src/test/fuzz/fuzz_http.c delete mode 100644 src/tor/src/test/fuzz/fuzz_http_connect.c delete mode 100644 src/tor/src/test/fuzz/fuzz_iptsv2.c delete mode 100644 src/tor/src/test/fuzz/fuzz_microdesc.c delete mode 100644 src/tor/src/test/fuzz/fuzz_multi.sh delete mode 100644 src/tor/src/test/fuzz/fuzz_vrs.c delete mode 100644 src/tor/src/test/fuzz/fuzzing.h delete mode 100644 src/tor/src/test/fuzz/fuzzing_common.c delete mode 100644 src/tor/src/test/fuzz/include.am delete mode 100644 src/tor/src/test/fuzz/minimize.sh delete mode 100644 src/tor/src/test/fuzz_static_testcases.sh delete mode 100644 src/tor/src/test/hs_build_address.py delete mode 100644 src/tor/src/test/hs_indexes.py delete mode 100644 src/tor/src/test/hs_ntor_ref.py delete mode 100644 src/tor/src/test/hs_test_helpers.c delete mode 100644 src/tor/src/test/hs_test_helpers.h delete mode 100644 src/tor/src/test/include.am delete mode 100644 src/tor/src/test/log_test_helpers.c delete mode 100644 src/tor/src/test/log_test_helpers.h delete mode 100644 src/tor/src/test/ntor_ref.py delete mode 100644 src/tor/src/test/rend_test_helpers.c delete mode 100644 src/tor/src/test/rend_test_helpers.h delete mode 100644 src/tor/src/test/slow_ed25519.py delete mode 100644 src/tor/src/test/slownacl_curve25519.py delete mode 100644 src/tor/src/test/sr_commit_calc_ref.py delete mode 100644 src/tor/src/test/sr_srv_calc_ref.py delete mode 100644 src/tor/src/test/test-child.c delete mode 100644 src/tor/src/test/test-memwipe.c delete mode 100644 src/tor/src/test/test-network.sh delete mode 100644 src/tor/src/test/test-timers.c delete mode 100644 src/tor/src/test/test.c delete mode 100644 src/tor/src/test/test.h delete mode 100644 src/tor/src/test/test_accounting.c delete mode 100644 src/tor/src/test/test_addr.c delete mode 100644 src/tor/src/test/test_address.c delete mode 100644 src/tor/src/test/test_bt.sh delete mode 100644 src/tor/src/test/test_bt_cl.c delete mode 100644 src/tor/src/test/test_buffers.c delete mode 100644 src/tor/src/test/test_cell_formats.c delete mode 100644 src/tor/src/test/test_cell_queue.c delete mode 100644 src/tor/src/test/test_channel.c delete mode 100644 src/tor/src/test/test_channelpadding.c delete mode 100644 src/tor/src/test/test_channeltls.c delete mode 100644 src/tor/src/test/test_checkdir.c delete mode 100644 src/tor/src/test/test_circuitbuild.c delete mode 100644 src/tor/src/test/test_circuitlist.c delete mode 100644 src/tor/src/test/test_circuitmux.c delete mode 100644 src/tor/src/test/test_circuitstats.c delete mode 100644 src/tor/src/test/test_circuituse.c delete mode 100644 src/tor/src/test/test_compat_libevent.c delete mode 100644 src/tor/src/test/test_config.c delete mode 100644 src/tor/src/test/test_connection.c delete mode 100644 src/tor/src/test/test_connection.h delete mode 100644 src/tor/src/test/test_conscache.c delete mode 100644 src/tor/src/test/test_consdiff.c delete mode 100644 src/tor/src/test/test_consdiffmgr.c delete mode 100644 src/tor/src/test/test_containers.c delete mode 100644 src/tor/src/test/test_controller.c delete mode 100644 src/tor/src/test/test_controller_events.c delete mode 100644 src/tor/src/test/test_crypto.c delete mode 100644 src/tor/src/test/test_crypto_openssl.c delete mode 100644 src/tor/src/test/test_crypto_slow.c delete mode 100644 src/tor/src/test/test_data.c delete mode 100644 src/tor/src/test/test_descriptors.inc delete mode 100644 src/tor/src/test/test_dir.c delete mode 100644 src/tor/src/test/test_dir_common.c delete mode 100644 src/tor/src/test/test_dir_common.h delete mode 100644 src/tor/src/test/test_dir_handle_get.c delete mode 100644 src/tor/src/test/test_dns.c delete mode 100644 src/tor/src/test/test_entryconn.c delete mode 100644 src/tor/src/test/test_entrynodes.c delete mode 100644 src/tor/src/test/test_extorport.c delete mode 100644 src/tor/src/test/test_guardfraction.c delete mode 100644 src/tor/src/test/test_handles.c delete mode 100644 src/tor/src/test/test_helpers.c delete mode 100644 src/tor/src/test/test_helpers.h delete mode 100644 src/tor/src/test/test_hs.c delete mode 100644 src/tor/src/test/test_hs_cache.c delete mode 100644 src/tor/src/test/test_hs_cell.c delete mode 100644 src/tor/src/test/test_hs_client.c delete mode 100644 src/tor/src/test/test_hs_common.c delete mode 100644 src/tor/src/test/test_hs_config.c delete mode 100644 src/tor/src/test/test_hs_control.c delete mode 100644 src/tor/src/test/test_hs_descriptor.c delete mode 100644 src/tor/src/test/test_hs_descriptor.inc delete mode 100644 src/tor/src/test/test_hs_intropoint.c delete mode 100644 src/tor/src/test/test_hs_ntor.c delete mode 100644 src/tor/src/test/test_hs_ntor.sh delete mode 100644 src/tor/src/test/test_hs_ntor_cl.c delete mode 100644 src/tor/src/test/test_hs_service.c delete mode 100644 src/tor/src/test/test_introduce.c delete mode 100644 src/tor/src/test/test_key_expiration.sh delete mode 100644 src/tor/src/test/test_keygen.sh delete mode 100644 src/tor/src/test/test_keypin.c delete mode 100644 src/tor/src/test/test_link_handshake.c delete mode 100644 src/tor/src/test/test_logging.c delete mode 100644 src/tor/src/test/test_microdesc.c delete mode 100644 src/tor/src/test/test_nodelist.c delete mode 100644 src/tor/src/test/test_ntor.sh delete mode 100644 src/tor/src/test/test_ntor_cl.c delete mode 100644 src/tor/src/test/test_oom.c delete mode 100644 src/tor/src/test/test_oos.c delete mode 100644 src/tor/src/test/test_options.c delete mode 100644 src/tor/src/test/test_policy.c delete mode 100644 src/tor/src/test/test_procmon.c delete mode 100644 src/tor/src/test/test_proto_http.c delete mode 100644 src/tor/src/test/test_proto_misc.c delete mode 100644 src/tor/src/test/test_protover.c delete mode 100644 src/tor/src/test/test_pt.c delete mode 100644 src/tor/src/test/test_pubsub.c delete mode 100644 src/tor/src/test/test_relay.c delete mode 100644 src/tor/src/test/test_relaycell.c delete mode 100644 src/tor/src/test/test_rendcache.c delete mode 100644 src/tor/src/test/test_replay.c delete mode 100644 src/tor/src/test/test_router.c delete mode 100644 src/tor/src/test/test_routerkeys.c delete mode 100644 src/tor/src/test/test_routerlist.c delete mode 100644 src/tor/src/test/test_routerset.c delete mode 100644 src/tor/src/test/test_rust.sh delete mode 100644 src/tor/src/test/test_scheduler.c delete mode 100644 src/tor/src/test/test_shared_random.c delete mode 100644 src/tor/src/test/test_slow.c delete mode 100644 src/tor/src/test/test_socks.c delete mode 100644 src/tor/src/test/test_status.c delete mode 100644 src/tor/src/test/test_storagedir.c delete mode 100644 src/tor/src/test/test_switch_id.c delete mode 100644 src/tor/src/test/test_switch_id.sh delete mode 100644 src/tor/src/test/test_threads.c delete mode 100644 src/tor/src/test/test_tortls.c delete mode 100644 src/tor/src/test/test_util.c delete mode 100644 src/tor/src/test/test_util_format.c delete mode 100644 src/tor/src/test/test_util_process.c delete mode 100644 src/tor/src/test/test_util_slow.c delete mode 100644 src/tor/src/test/test_workqueue.c delete mode 100644 src/tor/src/test/test_workqueue_cancel.sh delete mode 100644 src/tor/src/test/test_workqueue_efd.sh delete mode 100644 src/tor/src/test/test_workqueue_efd2.sh delete mode 100644 src/tor/src/test/test_workqueue_pipe.sh delete mode 100644 src/tor/src/test/test_workqueue_pipe2.sh delete mode 100644 src/tor/src/test/test_workqueue_socketpair.sh delete mode 100644 src/tor/src/test/test_zero_length_keys.sh delete mode 100644 src/tor/src/test/testing_common.c delete mode 100644 src/tor/src/test/testing_rsakeys.c delete mode 100644 src/tor/src/test/vote_descriptors.inc delete mode 100644 src/tor/src/test/zero_length_keys.sh delete mode 100644 src/tor/src/tools/Makefile.nmake delete mode 100644 src/tor/src/tools/include.am delete mode 100644 src/tor/src/tools/tor-fw-helper/README delete mode 100644 src/tor/src/tools/tor-gencert.c delete mode 100644 src/tor/src/tools/tor-resolve.c delete mode 100644 src/tor/src/tools/tor_runner.c delete mode 100644 src/tor/src/trace/debug.h delete mode 100644 src/tor/src/trace/events.h delete mode 100644 src/tor/src/trace/include.am delete mode 100644 src/tor/src/trace/trace.c delete mode 100644 src/tor/src/trace/trace.h delete mode 100644 src/tor/src/trunnel/README delete mode 100644 src/tor/src/trunnel/channelpadding_negotiation.c delete mode 100644 src/tor/src/trunnel/channelpadding_negotiation.h delete mode 100644 src/tor/src/trunnel/channelpadding_negotiation.trunnel delete mode 100644 src/tor/src/trunnel/ed25519_cert.c delete mode 100644 src/tor/src/trunnel/ed25519_cert.h delete mode 100644 src/tor/src/trunnel/ed25519_cert.trunnel delete mode 100644 src/tor/src/trunnel/hs/cell_common.c delete mode 100644 src/tor/src/trunnel/hs/cell_common.h delete mode 100644 src/tor/src/trunnel/hs/cell_common.trunnel delete mode 100644 src/tor/src/trunnel/hs/cell_establish_intro.c delete mode 100644 src/tor/src/trunnel/hs/cell_establish_intro.h delete mode 100644 src/tor/src/trunnel/hs/cell_establish_intro.trunnel delete mode 100644 src/tor/src/trunnel/hs/cell_introduce1.c delete mode 100644 src/tor/src/trunnel/hs/cell_introduce1.h delete mode 100644 src/tor/src/trunnel/hs/cell_introduce1.trunnel delete mode 100644 src/tor/src/trunnel/hs/cell_rendezvous.c delete mode 100644 src/tor/src/trunnel/hs/cell_rendezvous.h delete mode 100644 src/tor/src/trunnel/hs/cell_rendezvous.trunnel delete mode 100644 src/tor/src/trunnel/include.am delete mode 100644 src/tor/src/trunnel/link_handshake.c delete mode 100644 src/tor/src/trunnel/link_handshake.h delete mode 100644 src/tor/src/trunnel/link_handshake.trunnel delete mode 100644 src/tor/src/trunnel/pwbox.c delete mode 100644 src/tor/src/trunnel/pwbox.h delete mode 100644 src/tor/src/trunnel/pwbox.trunnel delete mode 100644 src/tor/src/trunnel/trunnel-local.h delete mode 100644 src/tor/src/win32/include.am rename src/tor/{src/or => }/statefile.c (85%) rename src/tor/{src/or => }/statefile.h (74%) rename src/tor/{src/or => }/status.c (57%) create mode 100644 src/tor/status.h rename src/tor/{src/ext => }/strlcat.c (100%) rename src/tor/{src/ext => }/strlcpy.c (100%) rename src/tor/{src/common => }/testsupport.h (74%) rename src/tor/{src/ext => }/tinytest.h (87%) rename src/tor/{src/ext => }/tinytest_macros.h (86%) rename src/tor/{src/common/compat.h => tor_compat.h} (75%) rename src/tor/{src/ext => }/tor_queue.h (95%) rename src/tor/{src/common/util.c => tor_util.c} (73%) rename src/tor/{src/common/util.h => tor_util.h} (77%) create mode 100644 src/tor/torgzip.c create mode 100644 src/tor/torgzip.h rename src/tor/{src/common => }/torint.h (77%) rename src/tor/{src/common => }/torlog.h (66%) rename src/tor/{src/common => }/tortls.c (67%) create mode 100644 src/tor/tortls.h rename src/tor/{src/or => }/transports.c (86%) rename src/tor/{src/or => }/transports.h (82%) create mode 100644 src/tor/util_codedigest.c diff --git a/src/init.cpp b/src/init.cpp index d60ced1b9..83cda0fd1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -14,6 +14,7 @@ #include "ui_interface.h" #include "checkpoints.h" #include "scrypt.h" +#include "tor/anonymize.h" #include #include #include @@ -37,6 +38,8 @@ enum BindFlags { CWallet* pwalletMain; CClientUIInterface uiInterface; +CService addrOnion; +unsigned short const onion_port = 21102; ////////////////////////////////////////////////////////////////////////////// // @@ -243,6 +246,8 @@ std::string HelpMessage() " -maxreceivebuffer= " + _("Maximum per-connection receive buffer, *1000 bytes (default: 5000)") + "\n" + " -maxsendbuffer= " + _("Maximum per-connection send buffer, *1000 bytes (default: 1000)") + "\n" + " -bloomfilters " + _("Allow peers to set bloom filters (default: 1)") + "\n" + + " -onionseed " + _("Find peers using .onion seeds (default: 1 unless -connect)") + "\n" + + #ifdef USE_UPNP #if USE_UPNP " -upnp " + _("Use UPnP to map the listening port (default: 1 when listening)") + "\n" + @@ -350,33 +355,10 @@ bool AppInit2() if (fBloomFilters) { nLocalServices |= NODE_BLOOM; } - - if (mapArgs.count("-bind")) { - // when specifying an explicit binding address, you want to listen on it - // even when -connect or -proxy is specified - SoftSetBoolArg("-listen", true); - } if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0) { - // when only connecting to trusted nodes, do not seed via DNS, or listen by default - SoftSetBoolArg("-dnsseed", false); - SoftSetBoolArg("-listen", false); - } - - if (mapArgs.count("-proxy")) { - // to protect privacy, do not listen by default if a proxy server is specified - SoftSetBoolArg("-listen", false); - } - - if (!GetBoolArg("-listen", true)) { - // do not map ports or try to retrieve public IP when not listening (pointless) - SoftSetBoolArg("-upnp", false); - SoftSetBoolArg("-discover", false); - } - - if (mapArgs.count("-externalip")) { - // if an explicit public IP is specified, do not try to find others - SoftSetBoolArg("-discover", false); + // when only connecting to trusted nodes, do not seed via .onion, or listen by default + SoftSetBoolArg("-onionseed", false); } if (GetBoolArg("-salvagewallet")) { @@ -555,80 +537,65 @@ bool AppInit2() if (nSocksVersion != 4 && nSocksVersion != 5) return InitError(strprintf(_("Unknown -socks proxy version requested: %i"), nSocksVersion)); - if (mapArgs.count("-onlynet")) { + do { std::set nets; - BOOST_FOREACH(std::string snet, mapMultiArgs["-onlynet"]) { - enum Network net = ParseNetwork(snet); - if (net == NET_UNROUTABLE) - return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet.c_str())); - nets.insert(net); - } + nets.insert(NET_TOR); + for (int n = 0; n < NET_MAX; n++) { enum Network net = (enum Network)n; if (!nets.count(net)) SetLimited(net); } - } + } while (false); - CService addrProxy; - bool fProxy = false; - if (mapArgs.count("-proxy")) { - addrProxy = CService(mapArgs["-proxy"], 9050); - if (!addrProxy.IsValid()) - return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"].c_str())); + CService addrOnion; + unsigned short const onion_port = 9077; - if (!IsLimited(NET_IPV4)) - SetProxy(NET_IPV4, addrProxy, nSocksVersion); - if (nSocksVersion > 4) { - if (!IsLimited(NET_IPV6)) - SetProxy(NET_IPV6, addrProxy, nSocksVersion); - SetNameProxy(addrProxy, nSocksVersion); - } - fProxy = true; - } + if (mapArgs.count("-tor") && mapArgs["-tor"] != "0") { + addrOnion = CService(mapArgs["-tor"], onion_port); - // -tor can override normal proxy, -notor disables tor entirely - if (!(mapArgs.count("-tor") && mapArgs["-tor"] == "0") && (fProxy || mapArgs.count("-tor"))) { - CService addrOnion; - if (!mapArgs.count("-tor")) - addrOnion = addrProxy; - else - addrOnion = CService(mapArgs["-tor"], 9050); if (!addrOnion.IsValid()) return InitError(strprintf(_("Invalid -tor address: '%s'"), mapArgs["-tor"].c_str())); + } else { + addrOnion = CService("127.0.0.1", onion_port); + } + + if (true) { SetProxy(NET_TOR, addrOnion, 5); SetReachable(NET_TOR); } // see Step 2: parameter interactions for more information about these - fNoListen = !GetBoolArg("-listen", true); - fDiscover = GetBoolArg("-discover", true); + fNameLookup = GetBoolArg("-dns", true); #ifdef USE_UPNP fUseUPnP = GetBoolArg("-upnp", USE_UPNP); #endif bool fBound = false; - if (!fNoListen) - { - std::string strError; - if (mapArgs.count("-bind")) { - BOOST_FOREACH(std::string strBind, mapMultiArgs["-bind"]) { + + if (true) { + std::string strError; + + if (true) { + do { CService addrBind; - if (!Lookup(strBind.c_str(), addrBind, GetListenPort(), false)) - return InitError(strprintf(_("Cannot resolve -bind address: '%s'"), strBind.c_str())); + if (!Lookup("127.0.0.1", addrBind, GetListenPort(), false)) + return InitError(strprintf(_("Cannot resolve binding address: '%s'"), "127.0.0.1")); fBound |= Bind(addrBind); - } - } else { - struct in_addr inaddr_any; - inaddr_any.s_addr = INADDR_ANY; - fBound |= Bind(CService(in6addr_any, GetListenPort()), BF_NONE); - fBound |= Bind(CService(inaddr_any, GetListenPort()), !fBound ? BF_REPORT_ERROR : BF_NONE); + } while (false); } if (!fBound) - return InitError(_("Failed to listen on any port. Use -listen=0 if you want this.")); + return InitError(_("Failed to listen on any port.")); } + if (!(mapArgs.count("-tor") && mapArgs["-tor"] != "0")) { + if (!NewThread(StartTor, NULL)) + InitError(_("Error: could not start tor node")); + } + + wait_initialized(); + if (mapArgs.count("-externalip")) { BOOST_FOREACH(string strAddr, mapMultiArgs["-externalip"]) { @@ -637,6 +604,17 @@ bool AppInit2() return InitError(strprintf(_("Cannot resolve -externalip address: '%s'"), strAddr.c_str())); AddLocal(CService(strAddr, GetListenPort(), fNameLookup), LOCAL_MANUAL); } + } else { + string automatic_onion; + filesystem::path const hostname_path = GetDefaultDataDir() / "onion" / "hostname"; + + if (!filesystem::exists(hostname_path)) { + return InitError(_("No external address found.")); + } + + ifstream file(hostname_path.string().c_str()); + file >> automatic_onion; + AddLocal(CService(automatic_onion, GetListenPort(), fNameLookup), LOCAL_MANUAL); } if (mapArgs.count("-reservebalance")) // ppcoin: reserve balance amount diff --git a/src/init.h b/src/init.h index 8308ee648..479620dd3 100644 --- a/src/init.h +++ b/src/init.h @@ -6,6 +6,7 @@ #define BITCOIN_INIT_H #include "wallet.h" +#include "tor/anonymize.h" extern CWallet* pwalletMain; diff --git a/src/net.cpp b/src/net.cpp index 5d6d7faa0..12516e86c 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -28,7 +28,9 @@ using namespace std; using namespace boost; -static const int MAX_OUTBOUND_CONNECTIONS = 8; +extern "C" { int tor_main(int argc, char *argv[]); } + +static const int MAX_OUTBOUND_CONNECTIONS = 16; void ThreadMessageHandler2(void* parg); void ThreadSocketHandler2(void* parg); @@ -37,7 +39,8 @@ void ThreadOpenAddedConnections2(void* parg); #ifdef USE_UPNP void ThreadMapPort2(void* parg); #endif -void ThreadDNSAddressSeed2(void* parg); +void ThreadTorNet2(void* parg); +void ThreadOnionSeed2(void* parg); bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false); @@ -50,7 +53,6 @@ struct LocalServiceInfo { // Global state variables // bool fClient = false; -bool fDiscover = true; bool fUseUPnP = false; uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); static CCriticalSection cs_mapLocalHost; @@ -104,8 +106,6 @@ void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) // find 'best' local address for a particular peer bool GetLocal(CService& addr, const CNetAddr *paddrPeer) { - if (fNoListen) - return false; int nBestScore = -1; int nBestReachability = -1; @@ -224,7 +224,7 @@ bool AddLocal(const CService& addr, int nScore) if (!addr.IsRoutable()) return false; - if (!fDiscover && nScore < LOCAL_MANUAL) + if (nScore < LOCAL_MANUAL) return false; if (IsLimited(addr)) @@ -612,14 +612,40 @@ void CNode::copyStats(CNodeStats &stats) } #undef X +void ThreadTorNet(void* parg) +{ + // Make this thread recognisable as the connection opening thread + RenameThread("burnercoin-tornet"); + try + { + vnThreadsRunning[THREAD_TORNET]++; + ThreadTorNet2(parg); + vnThreadsRunning[THREAD_TORNET]--; + } + catch (std::exception& e) { + vnThreadsRunning[THREAD_TORNET]--; + PrintException(&e, "ThreadTorNet()"); + } catch (...) { + vnThreadsRunning[THREAD_TORNET]--; + PrintException(NULL, "ThreadTorNet()"); + } + printf("ThreadTorNet exited\n"); +} +void ThreadTorNet2(void* parg) { + std::string logDecl = "notice file " + GetDefaultDataDir().string() + "/tor/tor.log"; + char *argvLogDecl = (char*) logDecl.c_str(); + char* argv[] = { + "tor", + "--hush", + "--Log", + argvLogDecl + }; - - - - + tor_main(4, argv); +} void ThreadSocketHandler(void* parg) { @@ -712,7 +738,32 @@ void ThreadSocketHandler2(void* parg) } } } - } + // count secured connections + int unsecured = 0; + int secured = 0; + + vector vNodesUnsecure; + + BOOST_FOREACH(CNode* pnode, vNodesCopy) + { + if (GetTime() - pnode->nTimeConnected < 60) { + continue; + } + + if (!pnode->fInbound || pnode->fVerified) { + secured++; + } else { + unsecured++; + vNodesUnsecure.push_back(pnode); + } + } + + if (0 > 2 * secured - 3 * unsecured) { + random_shuffle(vNodesUnsecure.begin(), vNodesUnsecure.end(), GetRandInt); + printf("removing unsecured connection %s\n", (*vNodesUnsecure.begin())->addr.ToString().c_str()); + (*vNodesUnsecure.begin())->fDisconnect = true; + } + } if (vNodes.size() != nPrevNodeCount) { nPrevNodeCount = vNodes.size(); @@ -967,14 +1018,6 @@ void ThreadSocketHandler2(void* parg) } } - - - - - - - - #ifdef USE_UPNP void ThreadMapPort(void* parg) { @@ -1027,22 +1070,6 @@ void ThreadMapPort2(void* parg) r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); if (r == 1) { - if (fDiscover) { - char externalIPAddress[40]; - r = UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, externalIPAddress); - if(r != UPNPCOMMAND_SUCCESS) - printf("UPnP: GetExternalIPAddress() returned %d\n", r); - else - { - if(externalIPAddress[0]) - { - printf("UPnP: ExternalIPAddress = %s\n", externalIPAddress); - AddLocal(CNetAddr(externalIPAddress), LOCAL_UPNP); - } - else - printf("UPnP: GetExternalIPAddress failed.\n"); - } - } string strDesc = "VERGE " + FormatFullVersion(); #ifndef UPNPDISCOVER_SUCCESS @@ -1119,92 +1146,59 @@ void MapPort() } #endif - - - - - - - - -// DNS seeds -// Each pair gives a source name and a seed name. -// The first name is used as information source for addrman. -// The second name should resolve to a list of seed addresses. -static const char *strDNSSeed[][2] = { - {"185.162.9.97", "104.131.144.82"}, - {"192.241.187.222", "105.228.198.44"}, - {"46.127.57.167", "98.5.123.15"}, - {"81.147.68.236", "77.67.46.100"}, - {"95.46.99.96", "138.201.91.159"}, +// hidden service seeds +static const char *strMainNetOnionSeed[][1] = { + {"kw5bdikypbbxaf2g.onion"}, + {"n5ln6ke2vc47glpl.onion"}, + + {NULL} }; -void ThreadDNSAddressSeed(void* parg) +void ThreadOnionSeed(void* parg) { // Make this thread recognisable as the DNS seeding thread - RenameThread("bitcoin-dnsseed"); + RenameThread("verge-dnsseed"); try { - vnThreadsRunning[THREAD_DNSSEED]++; - ThreadDNSAddressSeed2(parg); - vnThreadsRunning[THREAD_DNSSEED]--; + vnThreadsRunning[THREAD_ONIONSEED]++; + ThreadOnionSeed2(parg); + vnThreadsRunning[THREAD_ONIONSEED]--; } catch (std::exception& e) { - vnThreadsRunning[THREAD_DNSSEED]--; - PrintException(&e, "ThreadDNSAddressSeed()"); + vnThreadsRunning[THREAD_ONIONSEED]--; + PrintException(&e, "ThreadOnionSeed()"); } catch (...) { - vnThreadsRunning[THREAD_DNSSEED]--; + vnThreadsRunning[THREAD_ONIONSEED]--; throw; // support pthread_cancel() } - printf("ThreadDNSAddressSeed exited\n"); + printf("ThreadOnionSeed exited\n"); } void ThreadDNSAddressSeed2(void* parg) { - printf("ThreadDNSAddressSeed started\n"); + printf("ThreadOnionSeed started\n"); + + static const char *(*strOnionSeed)[1] = strMainNetOnionSeed; int found = 0; - if (!fTestNet) - { - printf("Loading addresses from DNS seeds (could take a while)\n"); - - for (unsigned int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) { - if (HaveNameProxy()) { - AddOneShot(strDNSSeed[seed_idx][1]); - } else { - vector vaddr; - vector vAdd; - if (LookupHost(strDNSSeed[seed_idx][1], vaddr)) - { - BOOST_FOREACH(CNetAddr& ip, vaddr) - { - int nOneDay = 24*3600; - CAddress addr = CAddress(CService(ip, GetDefaultPort())); - addr.nTime = GetTime() - 3*nOneDay - GetRand(4*nOneDay); // use a random age between 3 and 7 days old - vAdd.push_back(addr); - found++; - } - } - addrman.Add(vAdd, CNetAddr(strDNSSeed[seed_idx][0], true)); - } } - } + printf("Loading addresses from .onion seeds\n"); - printf("%d addresses found from DNS seeds\n", found); + for (unsigned int seed_idx = 0; strOnionSeed[seed_idx][0] != NULL; seed_idx++) { + CNetAddr parsed; + if (!parsed.SetSpecial(strOnionSeed[seed_idx][0])) { + throw runtime_error("ThreadOnionSeed() : invalid .onion seed"); + } + int nOneDay = 24*3600; + CAddress addr = CAddress(CService(parsed, GetDefaultPort())); + addr.nTime = GetTime() - 3*nOneDay - GetRand(4*nOneDay); // use a random age between 3 and 7 days old + found++; + addrman.Add(addr, parsed); + printf("%d addresses found from .onion seeds\n", found); } - - - - - - - - - - unsigned int pnSeed[] = { 0x0c0cd0c2 // Remember: network byte order @@ -1745,64 +1739,16 @@ bool BindListenPort(const CService &addrBind, string& strError) vhListenSocket.push_back(hListenSocket); - if (addrBind.IsRoutable() && fDiscover) - AddLocal(addrBind, LOCAL_BIND); - return true; } void static Discover() { - if (!fDiscover) - return; - -#ifdef WIN32 - // Get local host IP - char pszHostName[1000] = ""; - if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR) - { - vector vaddr; - if (LookupHost(pszHostName, vaddr)) - { - BOOST_FOREACH (const CNetAddr &addr, vaddr) - { - AddLocal(addr, LOCAL_IF); - } - } - } -#else - // Get local host ip - struct ifaddrs* myaddrs; - if (getifaddrs(&myaddrs) == 0) - { - for (struct ifaddrs* ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next) - { - if (ifa->ifa_addr == NULL) continue; - if ((ifa->ifa_flags & IFF_UP) == 0) continue; - if (strcmp(ifa->ifa_name, "lo") == 0) continue; - if (strcmp(ifa->ifa_name, "lo0") == 0) continue; - if (ifa->ifa_addr->sa_family == AF_INET) - { - struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr); - CNetAddr addr(s4->sin_addr); - if (AddLocal(addr, LOCAL_IF)) - printf("IPv4 %s: %s\n", ifa->ifa_name, addr.ToString().c_str()); - } - else if (ifa->ifa_addr->sa_family == AF_INET6) - { - struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr); - CNetAddr addr(s6->sin6_addr); - if (AddLocal(addr, LOCAL_IF)) - printf("IPv6 %s: %s\n", ifa->ifa_name, addr.ToString().c_str()); - } - } - freeifaddrs(myaddrs); - } -#endif - - // Don't use external IPv4 discovery, when -onlynet="IPv6" - if (!IsLimited(NET_IPV4)) - NewThread(ThreadGetMyExternalIP, NULL); +} ++void StartTor(void* parg) +{ + if (!NewThread(ThreadTorNet, NULL)) + printf("Error: NewThread(ThreadTorNet) failed\n"); } void StartNode(void* parg) @@ -1826,18 +1772,11 @@ void StartNode(void* parg) // - if (!GetBoolArg("-dnsseed", true)) - printf("DNS seeding disabled\n"); + if (!GetBoolArg("-onionseed", true)) + printf(".onion seeding disabled\n"); else - if (!NewThread(ThreadDNSAddressSeed, NULL)) - printf("Error: NewThread(ThreadDNSAddressSeed) failed\n"); - - /* - if (!GetBoolArg("-dnsseed", false)) - printf("DNS seeding disabled\n"); - if (GetBoolArg("-dnsseed", false)) - printf("DNS seeding NYI\n"); - */ + if (!NewThread(ThreadOnionSeed, NULL)) + printf("Error: NewThread(ThreadOnionSeed) failed\n"); // Map ports with UPnP if (fUseUPnP) @@ -1891,6 +1830,7 @@ bool StopNode() break; MilliSleep(20); } while(true); + if (vnThreadsRunning[THREAD_TORNET] > 0) printf("ThreadTorNet still running\n"); if (vnThreadsRunning[THREAD_SOCKETHANDLER] > 0) printf("ThreadSocketHandler still running\n"); if (vnThreadsRunning[THREAD_OPENCONNECTIONS] > 0) printf("ThreadOpenConnections still running\n"); if (vnThreadsRunning[THREAD_MESSAGEHANDLER] > 0) printf("ThreadMessageHandler still running\n"); @@ -1900,12 +1840,12 @@ bool StopNode() #ifdef USE_UPNP if (vnThreadsRunning[THREAD_UPNP] > 0) printf("ThreadMapPort still running\n"); #endif - if (vnThreadsRunning[THREAD_DNSSEED] > 0) printf("ThreadDNSAddressSeed still running\n"); + if (vnThreadsRunning[THREAD_ONIONSEED] > 0) printf("ThreadOnionSeed still running\n"); if (vnThreadsRunning[THREAD_ADDEDCONNECTIONS] > 0) printf("ThreadOpenAddedConnections still running\n"); if (vnThreadsRunning[THREAD_DUMPADDRESS] > 0) printf("ThreadDumpAddresses still running\n"); if (vnThreadsRunning[THREAD_MINTER] > 0) printf("ThreadStakeMinter still running\n"); while (vnThreadsRunning[THREAD_MESSAGEHANDLER] > 0 || vnThreadsRunning[THREAD_RPCHANDLER] > 0) - MilliSleep(20); + MilliSleep(20); MilliSleep(50); DumpAddresses(); return true; diff --git a/src/net.h b/src/net.h index e03abfd53..ecf546ad4 100644 --- a/src/net.h +++ b/src/net.h @@ -40,6 +40,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *strDest = NULL, int64 nTime void MapPort(); unsigned short GetListenPort(); bool BindListenPort(const CService &bindAddr, std::string& strError=REF(std::string())); +void StartTor(void* parg); void StartNode(void* parg); bool StopNode(); @@ -105,7 +106,7 @@ enum threadId THREAD_MINER, THREAD_RPCLISTENER, THREAD_UPNP, - THREAD_DNSSEED, + THREAD_ONIONSEED, THREAD_ADDEDCONNECTIONS, THREAD_DUMPADDRESS, THREAD_RPCHANDLER, @@ -115,7 +116,6 @@ enum threadId }; extern bool fClient; -extern bool fDiscover; extern bool fUseUPnP; extern uint64 nLocalServices; extern uint64 nLocalHostNonce; @@ -167,6 +167,7 @@ class CNodeStats int nVersion; std::string strSubVer; bool fInbound; + bool fVerified; int64 nReleaseTime; int nStartingHeight; int nMisbehavior; diff --git a/src/tor/.gitignore b/src/tor/.gitignore deleted file mode 100644 index c00fbe97e..000000000 --- a/src/tor/.gitignore +++ /dev/null @@ -1,235 +0,0 @@ -# Editor droppings -\#*\# -.#* -*~ -*.swp -*.swo -# C stuff -*.o -*.obj -# Diff droppings -*.orig -*.rej -# gcov stuff -*.gcno -*.gcov -*.gcda -# Autotools stuff -.deps -.dirstamp -*.trs -*.log -# Calltool stuff -.*.graph -# Stuff made by our makefiles -*.bak -# Python droppings -*.pyc -*.pyo -# Cscope -cscope.* -# OSX junk -*.dSYM -.DS_Store -# updateFallbackDirs.py temp files -details-*.json -uptime-*.json -*.full_url -*.last_modified - -# / -/Makefile -/Makefile.in -/aclocal.m4 -/ar-lib -/autom4te.cache -/build-stamp -/compile -/configure -/Doxyfile -/orconfig.h -/orconfig.h.in -/config.cache -/config.log -/config.status -/config.guess -/config.sub -/conftest* -/micro-revision.* -/patch-stamp -/stamp-h -/stamp-h.in -/stamp-h1 -/TAGS -/test-driver -/tor.sh -/tor.spec -/depcomp -/install-sh -/missing -/mkinstalldirs -/Tor*Bundle.dmg -/tor-*-win32.exe -/coverage_html/ -/callgraph/ - -# /contrib/ -/contrib/dist/tor.sh -/contrib/dist/torctl -/contrib/dist/tor.service -/contrib/operator-tools/tor.logrotate -/contrib/dist/suse/tor.sh - -# /debian/ -/debian/files -/debian/micro-revision.i -/debian/patched -/debian/tor -/debian/tor.postinst.debhelper -/debian/tor.postrm.debhelper -/debian/tor.prerm.debhelper -/debian/tor.substvars - -# /doc/ -/doc/Makefile -/doc/Makefile.in -/doc/doxygen -/doc/tor.1 -/doc/tor.1.in -/doc/tor.html -/doc/tor.html.in -/doc/tor.1.xml -/doc/tor-gencert.1 -/doc/tor-gencert.1.in -/doc/tor-gencert.html -/doc/tor-gencert.html.in -/doc/tor-gencert.1.xml -/doc/tor-resolve.1 -/doc/tor-resolve.1.in -/doc/tor-resolve.html -/doc/tor-resolve.html.in -/doc/tor-resolve.1.xml -/doc/torify.1 -/doc/torify.1.in -/doc/torify.html -/doc/torify.html.in -/doc/torify.1.xml - -# /doc/spec/ -/doc/spec/Makefile -/doc/spec/Makefile.in - -# /scripts -/scripts/maint/checkOptionDocs.pl -/scripts/maint/updateVersions.pl - -# /src/ -/src/Makefile -/src/Makefile.in - -# /src/trace -/src/trace/libor-trace.a - -# /src/common/ -/src/common/Makefile -/src/common/Makefile.in -/src/common/libor.a -/src/common/libor-testing.a -/src/common/libor.lib -/src/common/libor-ctime.a -/src/common/libor-ctime-testing.a -/src/common/libor-ctime.lib -/src/common/libor-crypto.a -/src/common/libor-crypto-testing.a -/src/common/libor-crypto.lib -/src/common/libor-event.a -/src/common/libor-event-testing.a -/src/common/libor-event.lib -/src/common/libcurve25519_donna.a -/src/common/libcurve25519_donna.lib - -# /src/config/ -/src/config/Makefile -/src/config/Makefile.in -/src/config/sample-server-torrc -/src/config/torrc -/src/config/torrc.sample -/src/config/torrc.minimal - -# /src/ext/ -/src/ext/ed25519/ref10/libed25519_ref10.a -/src/ext/ed25519/ref10/libed25519_ref10.lib -/src/ext/ed25519/donna/libed25519_donna.a -/src/ext/ed25519/donna/libed25519_donna.lib -/src/ext/keccak-tiny/libkeccak-tiny.a -/src/ext/keccak-tiny/libkeccak-tiny.lib - -# /src/or/ -/src/or/Makefile -/src/or/Makefile.in -/src/or/tor -/src/or/tor.exe -/src/or/tor-cov -/src/or/tor-cov.exe -/src/or/libtor.a -/src/or/libtor-testing.a -/src/or/libtor.lib - -# /src/rust -/src/rust/.cargo/config -/src/rust/.cargo/registry -/src/rust/target -/src/rust/registry - -# /src/test -/src/test/Makefile -/src/test/Makefile.in -/src/test/bench -/src/test/bench.exe -/src/test/test -/src/test/test-slow -/src/test/test-bt-cl -/src/test/test-child -/src/test/test-memwipe -/src/test/test-ntor-cl -/src/test/test-hs-ntor-cl -/src/test/test-switch-id -/src/test/test-timers -/src/test/test_workqueue -/src/test/test.exe -/src/test/test-slow.exe -/src/test/test-bt-cl.exe -/src/test/test-child.exe -/src/test/test-ntor-cl.exe -/src/test/test-hs-ntor-cl.exe -/src/test/test-memwipe.exe -/src/test/test-switch-id.exe -/src/test/test-timers.exe -/src/test/test_workqueue.exe - -# /src/test/fuzz -/src/test/fuzz/fuzz-* -/src/test/fuzz/lf-fuzz-* - -# /src/tools/ -/src/tools/libtorrunner.a -/src/tools/tor-checkkey -/src/tools/tor-resolve -/src/tools/tor-cov-resolve -/src/tools/tor-gencert -/src/tools/tor-cov-gencert -/src/tools/tor-checkkey.exe -/src/tools/tor-resolve.exe -/src/tools/tor-cov-resolve.exe -/src/tools/tor-gencert.exe -/src/tools/tor-cov-gencert.exe -/src/tools/Makefile -/src/tools/Makefile.in - -# /src/trunnel/ -/src/trunnel/libor-trunnel-testing.a -/src/trunnel/libor-trunnel.a - -# /src/win32/ -/src/win32/Makefile -/src/win32/Makefile.in diff --git a/src/tor/.gitlab-ci.yml b/src/tor/.gitlab-ci.yml deleted file mode 100644 index ba981d5f1..000000000 --- a/src/tor/.gitlab-ci.yml +++ /dev/null @@ -1,45 +0,0 @@ -before_script: - - apt-get update -qq - - apt-get upgrade -qy - -build: - script: - - apt-get install -qy --fix-missing automake build-essential - libevent-dev libssl-dev zlib1g-dev - libseccomp-dev liblzma-dev libscrypt-dev - - ./autogen.sh - - ./configure --disable-asciidoc --enable-fatal-warnings - --disable-silent-rules - - make check || (e=$?; cat test-suite.log; exit $e) - - make install - -update: - only: - - schedules - script: - - "apt-get install -y --fix-missing git openssh-client" - - # Run ssh-agent (inside the build environment) - - eval $(ssh-agent -s) - - # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store - - ssh-add <(echo "$DEPLOY_KEY") - - # For Docker builds disable host key checking. Be aware that by adding that - # you are suspectible to man-in-the-middle attacks. - # WARNING: Use this only with the Docker executor, if you use it with shell - # you will overwrite your user's SSH config. - - mkdir -p ~/.ssh - - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - # In order to properly check the server's host key, assuming you created the - # SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines - # instead. - - mkdir -p ~/.ssh - - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts' - - echo "merging from torgit" - - git config --global user.email "labadmin@oniongit.eu" - - git config --global user.name "gitadmin" - - "mkdir tor" - - "cd tor" - - git clone --bare https://git.torproject.org/tor.git - - git push --mirror git@oniongit.eu:network/tor.git diff --git a/src/tor/.gitmodules b/src/tor/.gitmodules deleted file mode 100644 index 7074403c9..000000000 --- a/src/tor/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/ext/rust"] - path = src/ext/rust - url = https://git.torproject.org/user/sebastian/tor-rust-dependencies diff --git a/src/tor/.travis.yml b/src/tor/.travis.yml deleted file mode 100644 index d3918875d..000000000 --- a/src/tor/.travis.yml +++ /dev/null @@ -1,104 +0,0 @@ -language: c - -compiler: - - gcc - - clang - -notifications: - irc: - channels: - - "irc.oftc.net#tor-ci" - template: - - "%{repository} %{branch} %{commit} - %{author}: %{commit_subject}" - - "Build #%{build_number} %{result}. Details: %{build_url}" - on_success: change - on_failure: change - email: - on_success: never - on_failure: change - -os: - - linux - ## Uncomment the following line to also run the entire build matrix on OSX. - ## This will make your CI builds take roughly ten times longer to finish. - # - osx - -## Use the Ubuntu Trusty images. -dist: trusty - -## We don't need sudo. (The "apt:" stanza after this allows us to not need sudo; -## otherwise, we would need it for getting dependencies.) -sudo: false - -## (Linux only) Download our dependencies -addons: - apt: - packages: - ## Required dependencies - - libevent-dev - - libseccomp2 - - zlib1g-dev - ## Optional dependencies - - liblzma-dev - - libscrypt-dev - ## zstd doesn't exist in Ubuntu Trusty - #- libzstd - -## The build matrix in the following two stanzas expands into four builds (per OS): -## -## * with GCC, with Rust -## * with GCC, without Rust -## * with Clang, with Rust -## * with Clang, without Rust -env: - global: - ## The Travis CI environment allows us two cores, so let's use both. - - MAKEFLAGS="-j 2" - matrix: - - RUST_OPTIONS="--enable-rust --enable-cargo-online-mode" - - RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true - - RUST_OPTIONS="" - -matrix: - ## If one build in the matrix fails (e.g. if building withour Rust and Clang - ## fails, but building with Rust and GCC is still going), then cancel the - ## entire job early and call the whole thing a failure. - fast_finish: true - -before_install: - ## If we're on OSX, homebrew usually needs to updated first - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - ## Download rustup - - if [[ "$RUST_OPTIONS" != "" ]]; then curl -Ssf -o rustup.sh https://sh.rustup.rs; fi - -install: - ## If we're on OSX use brew to install required dependencies (for Linux, see the "apt:" section above) - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated openssl || brew upgrade openssl; }; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libevent || brew upgrade libevent; }; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated pkg-config || brew upgrade pkg-config; }; fi - ## If we're on OSX also install the optional dependencies - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated xz || brew upgrade xz; }; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libscrypt || brew upgrade libscrypt; }; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated zstd || brew upgrade zstd; }; fi - ## Install the nightly channels of rustc and cargo and setup our toolchain environment - - if [[ "$RUST_OPTIONS" != "" ]]; then sh rustup.sh -y --default-toolchain nightly; fi - - if [[ "$RUST_OPTIONS" != "" ]]; then source $HOME/.cargo/env; fi - ## Get some info about rustc and cargo - - if [[ "$RUST_OPTIONS" != "" ]]; then which rustc; fi - - if [[ "$RUST_OPTIONS" != "" ]]; then which cargo; fi - - if [[ "$RUST_OPTIONS" != "" ]]; then rustc --version; fi - - if [[ "$RUST_OPTIONS" != "" ]]; then cargo --version; fi - ## If we're testing rust builds in offline-mode, then set up our vendored dependencies - - if [[ "$RUST_OPTIONS" == "--enable-rust" ]]; then git submodule init ; fi - - if [[ "$RUST_OPTIONS" == "--enable-rust" ]]; then git submodule update; fi - - if [[ "$TOR_RUST_DEPENDENCIES" == "true" ]]; then export TOR_RUST_DEPENDENCIES=$PWD/src/ext/rust/crates; fi - -script: - - ./autogen.sh - - ./configure $RUST_OPTIONS --disable-asciidoc --enable-fatal-warnings --disable-silent-rules --enable-fragile-hardening - ## We run `make check` because that's what https://jenkins.torproject.org does. - - make check - -after_failure: - ## `make check` will leave a log file with more details of test failures. - - cat test-suite.log diff --git a/src/tor/ChangeLog b/src/tor/ChangeLog deleted file mode 100644 index d0fbbf01c..000000000 --- a/src/tor/ChangeLog +++ /dev/null @@ -1,26375 +0,0 @@ -Changes in version 0.3.2.8-rc - 2017-12-21 - Tor 0.3.2.8-rc fixes a pair of bugs in the KIST and KISTLite - schedulers that had led servers under heavy load to overload their - outgoing connections. All relay operators running earlier 0.3.2.x - versions should upgrade. This version also includes a mitigation for - over-full DESTROY queues leading to out-of-memory conditions: if it - works, we will soon backport it to earlier release series. - - This is the second release candidate in the 0.3.2 series. If we find - no new bugs or regression here, then the first stable 0.3.2 release - will be nearly identical to this. - - o Major bugfixes (KIST, scheduler): - - The KIST scheduler did not correctly account for data already - enqueued in each connection's send socket buffer, particularly in - cases when the TCP/IP congestion window was reduced between - scheduler calls. This situation lead to excessive per-connection - buffering in the kernel, and a potential memory DoS. Fixes bug - 24665; bugfix on 0.3.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the December 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (hidden service v3): - - Bump hsdir_spread_store parameter from 3 to 4 in order to increase - the probability of reaching a service for a client missing - microdescriptors. Fixes bug 24425; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (memory usage): - - When queuing DESTROY cells on a channel, only queue the circuit-id - and reason fields: not the entire 514-byte cell. This fix should - help mitigate any bugs or attacks that fill up these queues, and - free more RAM for other uses. Fixes bug 24666; bugfix - on 0.2.5.1-alpha. - - o Minor bugfixes (scheduler, KIST): - - Use a sane write limit for KISTLite when writing onto a connection - buffer instead of using INT_MAX and shoving as much as it can. - Because the OOM handler cleans up circuit queues, we are better - off at keeping them in that queue instead of the connection's - buffer. Fixes bug 24671; bugfix on 0.3.2.1-alpha. - - -Changes in version 0.3.2.7-rc - 2017-12-14 - Tor 0.3.2.7-rc fixes various bugs in earlier versions of Tor, - including some that could affect reliability or correctness. - - This is the first release candidate in the 0.3.2 series. If we find no - new bugs or regression here, then the first stable 0.3.2. release will - be nearly identical to this. - - o Major bugfixes (circuit prediction): - - Fix circuit prediction logic so that a client doesn't treat a port - as being "handled" by a circuit if that circuit already has - isolation settings on it. This change should make Tor clients more - responsive by improving their chances of having a pre-created - circuit ready for use when a request arrives. Fixes bug 18859; - bugfix on 0.2.3.3-alpha. - - o Minor features (logging): - - Provide better warnings when the getrandom() syscall fails. Closes - ticket 24500. - - o Minor features (portability): - - Tor now compiles correctly on arm64 with libseccomp-dev installed. - (It doesn't yet work with the sandbox enabled.) Closes - ticket 24424. - - o Minor bugfixes (bridge clients, bootstrap): - - Retry directory downloads when we get our first bridge descriptor - during bootstrap or while reconnecting to the network. Keep - retrying every time we get a bridge descriptor, until we have a - reachable bridge. Fixes part of bug 24367; bugfix on 0.2.0.3-alpha. - - Stop delaying bridge descriptor fetches when we have cached bridge - descriptors. Instead, only delay bridge descriptor fetches when we - have at least one reachable bridge. Fixes part of bug 24367; - bugfix on 0.2.0.3-alpha. - - Stop delaying directory fetches when we have cached bridge - descriptors. Instead, only delay bridge descriptor fetches when - all our bridges are definitely unreachable. Fixes part of bug - 24367; bugfix on 0.2.0.3-alpha. - - o Minor bugfixes (compilation): - - Fix a signed/unsigned comparison warning introduced by our fix to - TROVE-2017-009. Fixes bug 24480; bugfix on 0.2.5.16. - - o Minor bugfixes (correctness): - - Fix several places in our codebase where a C compiler would be - likely to eliminate a check, based on assuming that undefined - behavior had not happened elsewhere in the code. These cases are - usually a sign of redundant checking or dubious arithmetic. Found - by Georg Koppen using the "STACK" tool from Wang, Zeldovich, - Kaashoek, and Solar-Lezama. Fixes bug 24423; bugfix on various - Tor versions. - - o Minor bugfixes (onion service v3): - - Fix a race where an onion service would launch a new intro circuit - after closing an old one, but fail to register it before freeing - the previously closed circuit. This bug was making the service - unable to find the established intro circuit and thus not upload - its descriptor, thus making a service unavailable for up to 24 - hours. Fixes bug 23603; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (scheduler, KIST): - - Properly set the scheduler state of an unopened channel in the - KIST scheduler main loop. This prevents a harmless but annoying - log warning. Fixes bug 24502; bugfix on 0.3.2.4-alpha. - - Avoid a possible integer overflow when computing the available - space on the TCP buffer of a channel. This had no security - implications; but could make KIST allow too many cells on a - saturated connection. Fixes bug 24590; bugfix on 0.3.2.1-alpha. - - Downgrade to "info" a harmless warning about the monotonic time - moving backwards: This can happen on platform not supporting - monotonic time. Fixes bug 23696; bugfix on 0.3.2.1-alpha. - - -Changes in version 0.3.2.6-alpha - 2017-12-01 - This version of Tor is the latest in the 0.3.2 alpha series. It - includes fixes for several important security issues. All Tor users - should upgrade to this release, or to one of the other releases coming - out today. - - o Major bugfixes (security): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - Fix a denial of service issue where an attacker could crash a - directory authority using a malformed router descriptor. Fixes bug - 24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010 - and CVE-2017-8820. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, onion service v2): - - Fix a use-after-free error that could crash v2 Tor onion services - when they failed to open circuits while expiring introduction - points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is - also tracked as TROVE-2017-013 and CVE-2017-8823. - - o Major bugfixes (security, relay): - - When running as a relay, make sure that we never build a path - through ourselves, even in the case where we have somehow lost the - version of our descriptor appearing in the consensus. Fixes part - of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked - as TROVE-2017-012 and CVE-2017-8822. - - When running as a relay, make sure that we never choose ourselves - as a guard. Fixes part of bug 21534; bugfix on 0.3.0.1-alpha. This - issue is also tracked as TROVE-2017-012 and CVE-2017-8822. - - o Minor feature (relay statistics): - - Change relay bandwidth reporting stats interval from 4 hours to 24 - hours in order to reduce the efficiency of guard discovery - attacks. Fixes ticket 23856. - - o Minor features (directory authority): - - Add an IPv6 address for the "bastet" directory authority. Closes - ticket 24394. - - o Minor bugfixes (client): - - By default, do not enable storage of client-side DNS values. These - values were unused by default previously, but they should not have - been cached at all. Fixes bug 24050; bugfix on 0.2.6.3-alpha. - - -Changes in version 0.3.1.9 - 2017-12-01: - Tor 0.3.1.9 backports important security and stability fixes from the - 0.3.2 development series. All Tor users should upgrade to this - release, or to another of the releases coming out today. - - o Major bugfixes (security, backport from 0.3.2.6-alpha): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - Fix a denial of service issue where an attacker could crash a - directory authority using a malformed router descriptor. Fixes bug - 24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010 - and CVE-2017-8820. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha): - - Fix a use-after-free error that could crash v2 Tor onion services - when they failed to open circuits while expiring introduction - points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is - also tracked as TROVE-2017-013 and CVE-2017-8823. - - o Major bugfixes (security, relay, backport from 0.3.2.6-alpha): - - When running as a relay, make sure that we never build a path - through ourselves, even in the case where we have somehow lost the - version of our descriptor appearing in the consensus. Fixes part - of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked - as TROVE-2017-012 and CVE-2017-8822. - - When running as a relay, make sure that we never choose ourselves - as a guard. Fixes part of bug 21534; bugfix on 0.3.0.1-alpha. This - issue is also tracked as TROVE-2017-012 and CVE-2017-8822. - - o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha): - - Fix an issue causing DNS to fail on high-bandwidth exit nodes, - making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on - 0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for - identifying and finding a workaround to this bug and to Moritz, - Arthur Edelstein, and Roger for helping to track it down and - analyze it. - - o Minor features (bridge): - - Bridges now include notice in their descriptors that they are - bridges, and notice of their distribution status, based on their - publication settings. Implements ticket 18329. For more fine- - grained control of how a bridge is distributed, upgrade to 0.3.2.x - or later. - - o Minor features (directory authority, backport from 0.3.2.6-alpha): - - Add an IPv6 address for the "bastet" directory authority. Closes - ticket 24394. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha): - - Avoid unnecessary calls to directory_fetches_from_authorities() on - relays, to prevent spurious address resolutions and descriptor - rebuilds. This is a mitigation for bug 21789. Fixes bug 23470; - bugfix on in 0.2.8.1-alpha. - - o Minor bugfixes (compilation, backport from 0.3.2.1-alpha): - - Fix unused variable warnings in donna's Curve25519 SSE2 code. - Fixes bug 22895; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha): - - When a circuit is marked for close, do not attempt to package any - cells for channels on that circuit. Previously, we would detect - this condition lower in the call stack, when we noticed that the - circuit had no attached channel, and log an annoying message. - Fixes bug 8185; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (onion service, backport from 0.3.2.5-alpha): - - Rename the consensus parameter "hsdir-interval" to "hsdir_interval" - so it matches dir-spec.txt. Fixes bug 24262; bugfix - on 0.3.1.1-alpha. - - o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha): - - Avoid a crash when transitioning from client mode to bridge mode. - Previously, we would launch the worker threads whenever our - "public server" mode changed, but not when our "server" mode - changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha. - - -Changes in version 0.3.0.13 - 2017-12-01 - Tor 0.3.0.13 backports important security and stability bugfixes from - later Tor releases. All Tor users should upgrade to this release, or - to another of the releases coming out today. - - Note: the Tor 0.3.0 series will no longer be supported after 26 Jan - 2018. If you need a release with long-term support, please stick with - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Major bugfixes (security, backport from 0.3.2.6-alpha): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - Fix a denial of service issue where an attacker could crash a - directory authority using a malformed router descriptor. Fixes bug - 24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010 - and CVE-2017-8820. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha): - - Fix a use-after-free error that could crash v2 Tor onion services - when they failed to open circuits while expiring introduction - points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is - also tracked as TROVE-2017-013 and CVE-2017-8823. - - o Major bugfixes (security, relay, backport from 0.3.2.6-alpha): - - When running as a relay, make sure that we never build a path - through ourselves, even in the case where we have somehow lost the - version of our descriptor appearing in the consensus. Fixes part - of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked - as TROVE-2017-012 and CVE-2017-8822. - - When running as a relay, make sure that we never choose ourselves - as a guard. Fixes part of bug 21534; bugfix on 0.3.0.1-alpha. This - issue is also tracked as TROVE-2017-012 and CVE-2017-8822. - - o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha): - - Fix an issue causing DNS to fail on high-bandwidth exit nodes, - making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on - 0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for - identifying and finding a workaround to this bug and to Moritz, - Arthur Edelstein, and Roger for helping to track it down and - analyze it. - - o Minor features (security, windows, backport from 0.3.1.1-alpha): - - Enable a couple of pieces of Windows hardening: one - (HeapEnableTerminationOnCorruption) that has been on-by-default - since Windows 8, and unavailable before Windows 7; and one - (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't - affect us, but shouldn't do any harm. Closes ticket 21953. - - o Minor features (bridge, backport from 0.3.1.9): - - Bridges now include notice in their descriptors that they are - bridges, and notice of their distribution status, based on their - publication settings. Implements ticket 18329. For more fine- - grained control of how a bridge is distributed, upgrade to 0.3.2.x - or later. - - o Minor features (directory authority, backport from 0.3.2.6-alpha): - - Add an IPv6 address for the "bastet" directory authority. Closes - ticket 24394. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha): - - Avoid unnecessary calls to directory_fetches_from_authorities() on - relays, to prevent spurious address resolutions and descriptor - rebuilds. This is a mitigation for bug 21789. Fixes bug 23470; - bugfix on in 0.2.8.1-alpha. - - o Minor bugfixes (compilation, backport from 0.3.2.1-alpha): - - Fix unused variable warnings in donna's Curve25519 SSE2 code. - Fixes bug 22895; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha): - - When a circuit is marked for close, do not attempt to package any - cells for channels on that circuit. Previously, we would detect - this condition lower in the call stack, when we noticed that the - circuit had no attached channel, and log an annoying message. - Fixes bug 8185; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha): - - Avoid a crash when transitioning from client mode to bridge mode. - Previously, we would launch the worker threads whenever our - "public server" mode changed, but not when our "server" mode - changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha. - - o Minor bugfixes (testing, backport from 0.3.1.6-rc): - - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291; - bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij. - - -Changes in version 0.2.9.14 - 2017-12-01 - Tor 0.3.0.13 backports important security and stability bugfixes from - later Tor releases. All Tor users should upgrade to this release, or - to another of the releases coming out today. - - o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha): - - Fix an issue causing DNS to fail on high-bandwidth exit nodes, - making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on - 0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for - identifying and finding a workaround to this bug and to Moritz, - Arthur Edelstein, and Roger for helping to track it down and - analyze it. - - o Major bugfixes (security, backport from 0.3.2.6-alpha): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - Fix a denial of service issue where an attacker could crash a - directory authority using a malformed router descriptor. Fixes bug - 24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010 - and CVE-2017-8820. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha): - - Fix a use-after-free error that could crash v2 Tor onion services - when they failed to open circuits while expiring introduction - points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is - also tracked as TROVE-2017-013 and CVE-2017-8823. - - o Major bugfixes (security, relay, backport from 0.3.2.6-alpha): - - When running as a relay, make sure that we never build a path - through ourselves, even in the case where we have somehow lost the - version of our descriptor appearing in the consensus. Fixes part - of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked - as TROVE-2017-012 and CVE-2017-8822. - - o Minor features (bridge, backport from 0.3.1.9): - - Bridges now include notice in their descriptors that they are - bridges, and notice of their distribution status, based on their - publication settings. Implements ticket 18329. For more fine- - grained control of how a bridge is distributed, upgrade to 0.3.2.x - or later. - - o Minor features (directory authority, backport from 0.3.2.6-alpha): - - Add an IPv6 address for the "bastet" directory authority. Closes - ticket 24394. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - o Minor features (security, windows, backport from 0.3.1.1-alpha): - - Enable a couple of pieces of Windows hardening: one - (HeapEnableTerminationOnCorruption) that has been on-by-default - since Windows 8, and unavailable before Windows 7; and one - (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't - affect us, but shouldn't do any harm. Closes ticket 21953. - - o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha): - - Avoid unnecessary calls to directory_fetches_from_authorities() on - relays, to prevent spurious address resolutions and descriptor - rebuilds. This is a mitigation for bug 21789. Fixes bug 23470; - bugfix on in 0.2.8.1-alpha. - - o Minor bugfixes (compilation, backport from 0.3.2.1-alpha): - - Fix unused variable warnings in donna's Curve25519 SSE2 code. - Fixes bug 22895; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha): - - When a circuit is marked for close, do not attempt to package any - cells for channels on that circuit. Previously, we would detect - this condition lower in the call stack, when we noticed that the - circuit had no attached channel, and log an annoying message. - Fixes bug 8185; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha): - - Avoid a crash when transitioning from client mode to bridge mode. - Previously, we would launch the worker threads whenever our - "public server" mode changed, but not when our "server" mode - changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha. - - o Minor bugfixes (testing, backport from 0.3.1.6-rc): - - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291; - bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij. - - -Changes in version 0.2.8.17 - 2017-12-01 - Tor 0.2.8.17 backports important security and stability bugfixes from - later Tor releases. All Tor users should upgrade to this release, or - to another of the releases coming out today. - - Note: the Tor 0.2.8 series will no longer be supported after 1 Jan - 2018. If you need a release with long-term support, please upgrade with - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Major bugfixes (security, backport from 0.3.2.6-alpha): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha): - - Fix a use-after-free error that could crash v2 Tor onion services - when they failed to open circuits while expiring introduction - points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is - also tracked as TROVE-2017-013 and CVE-2017-8823. - - o Major bugfixes (security, relay, backport from 0.3.2.6-alpha): - - When running as a relay, make sure that we never build a path through - ourselves, even in the case where we have somehow lost the version of - our descriptor appearing in the consensus. Fixes part of bug 21534; - bugfix on 0.2.0.1-alpha. This issue is also tracked as TROVE-2017-012 - and CVE-2017-8822. - - o Minor features (bridge, backport from 0.3.1.9): - - Bridges now include notice in their descriptors that they are - bridges, and notice of their distribution status, based on their - publication settings. Implements ticket 18329. For more fine- - grained control of how a bridge is distributed, upgrade to 0.3.2.x - or later. - - o Minor features (directory authority, backport from 0.3.2.6-alpha): - - Add an IPv6 address for the "bastet" directory authority. Closes - ticket 24394. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (testing, backport from 0.3.1.6-rc): - - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291; - bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij. - - -Changes in version 0.2.5.16 - 2017-12-01 - Tor 0.2.5.13 backports important security and stability bugfixes from - later Tor releases. All Tor users should upgrade to this release, or - to another of the releases coming out today. - - Note: the Tor 0.2.5 series will no longer be supported after 1 May - 2018. If you need a release with long-term support, please upgrade to - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Major bugfixes (security, backport from 0.3.2.6-alpha): - - Fix a denial of service bug where an attacker could use a - malformed directory object to cause a Tor instance to pause while - OpenSSL would try to read a passphrase from the terminal. (Tor - instances run without a terminal, which is the case for most Tor - packages, are not impacted.) Fixes bug 24246; bugfix on every - version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821. - Found by OSS-Fuzz as testcase 6360145429790720. - - When checking for replays in the INTRODUCE1 cell data for a - (legacy) onion service, correctly detect replays in the RSA- - encrypted part of the cell. We were previously checking for - replays on the entire cell, but those can be circumvented due to - the malleability of Tor's legacy hybrid encryption. This fix helps - prevent a traffic confirmation attack. Fixes bug 24244; bugfix on - 0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009 - and CVE-2017-8819. - - o Major bugfixes (security, relay, backport from 0.3.2.6-alpha): - - When running as a relay, make sure that we never build a path - through ourselves, even in the case where we have somehow lost the - version of our descriptor appearing in the consensus. Fixes part - of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked - as TROVE-2017-012 and CVE-2017-8822. - - o Minor features (bridge, backport from 0.3.1.9): - - Bridges now include notice in their descriptors that they are - bridges, and notice of their distribution status, based on their - publication settings. Implements ticket 18329. For more fine- - grained control of how a bridge is distributed, upgrade to 0.3.2.x - or later. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - -Changes in version 0.3.2.5-alpha - 2017-11-22 - Tor 0.3.2.5-alpha is the fifth alpha release in the 0.3.2.x series. It - fixes several stability and reliability bugs, including a fix for - intermittent bootstrapping failures that some people have been seeing - since the 0.3.0.x series. - - Please test this alpha out -- many of these fixes will soon be - backported to stable Tor versions if no additional bugs are found - in them. - - o Major bugfixes (bootstrapping): - - Fetch descriptors aggressively whenever we lack enough to build - circuits, regardless of how many descriptors we are missing. - Previously, we would delay launching the fetch when we had fewer - than 15 missing descriptors, even if some of those descriptors - were blocking circuits from building. Fixes bug 23985; bugfix on - 0.1.1.11-alpha. The effects of this bug became worse in - 0.3.0.3-alpha, when we began treating missing descriptors from our - primary guards as a reason to delay circuits. - - Don't try fetching microdescriptors from relays that have failed - to deliver them in the past. Fixes bug 23817; bugfix - on 0.3.0.1-alpha. - - o Minor features (directory authority): - - Make the "Exit" flag assignment only depend on whether the exit - policy allows connections to ports 80 and 443. Previously relays - would get the Exit flag if they allowed connections to one of - these ports and also port 6667. Resolves ticket 23637. - - o Minor features (geoip): - - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2 - Country database. - - o Minor features (linux seccomp2 sandbox): - - Update the sandbox rules so that they should now work correctly - with Glibc 2.26. Closes ticket 24315. - - o Minor features (logging): - - Downgrade a pair of log messages that could occur when an exit's - resolver gave us an unusual (but not forbidden) response. Closes - ticket 24097. - - Improve the message we log when re-enabling circuit build timeouts - after having received a consensus. Closes ticket 20963. - - o Minor bugfixes (compilation): - - Fix a memory leak warning in one of the libevent-related - configuration tests that could occur when manually specifying - -fsanitize=address. Fixes bug 24279; bugfix on 0.3.0.2-alpha. - Found and patched by Alex Xu. - - When detecting OpenSSL on Windows from our configure script, make - sure to try linking with the ws2_32 library. Fixes bug 23783; - bugfix on 0.3.2.2-alpha. - - o Minor bugfixes (control port, linux seccomp2 sandbox): - - Avoid a crash when attempting to use the seccomp2 sandbox together - with the OwningControllerProcess feature. Fixes bug 24198; bugfix - on 0.2.5.1-alpha. - - o Minor bugfixes (control port, onion services): - - Report "FAILED" instead of "UPLOAD_FAILED" "FAILED" for the - HS_DESC event when a service is not able to upload a descriptor. - Fixes bug 24230; bugfix on 0.2.7.1-alpha. - - o Minor bugfixes (directory cache): - - Recover better from empty or corrupt files in the consensus cache - directory. Fixes bug 24099; bugfix on 0.3.1.1-alpha. - - When a consensus diff calculation is only partially successful, - only record the successful parts as having succeeded. Partial - success can happen if (for example) one compression method fails - but the others succeed. Previously we misrecorded all the - calculations as having succeeded, which would later cause a - nonfatal assertion failure. Fixes bug 24086; bugfix - on 0.3.1.1-alpha. - - o Minor bugfixes (logging): - - Only log once if we notice that KIST support is gone. Fixes bug - 24158; bugfix on 0.3.2.1-alpha. - - Suppress a log notice when relay descriptors arrive. We already - have a bootstrap progress for this so no need to log notice - everytime tor receives relay descriptors. Microdescriptors behave - the same. Fixes bug 23861; bugfix on 0.2.8.2-alpha. - - o Minor bugfixes (network layer): - - When closing a connection via close_connection_immediately(), we - mark it as "not blocked on bandwidth", to prevent later calls from - trying to unblock it, and give it permission to read. This fixes a - backtrace warning that can happen on relays under various - circumstances. Fixes bug 24167; bugfix on 0.1.0.1-rc. - - o Minor bugfixes (onion services): - - The introduction circuit was being timed out too quickly while - waiting for the rendezvous circuit to complete. Keep the intro - circuit around longer instead of timing out and reopening new ones - constantly. Fixes bug 23681; bugfix on 0.2.4.8-alpha. - - Rename the consensus parameter "hsdir-interval" to "hsdir_interval" - so it matches dir-spec.txt. Fixes bug 24262; bugfix - on 0.3.1.1-alpha. - - Silence a warning about failed v3 onion descriptor uploads that - can happen naturally under certain edge cases. Fixes part of bug - 23662; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (tests): - - Fix a memory leak in one of the bridge-distribution test cases. - Fixes bug 24345; bugfix on 0.3.2.3-alpha. - - Fix a bug in our fuzzing mock replacement for crypto_pk_checksig(), - to correctly handle cases where a caller gives it an RSA key of - under 160 bits. (This is not actually a bug in Tor itself, but - rather in our fuzzing code.) Fixes bug 24247; bugfix on - 0.3.0.3-alpha. Found by OSS-Fuzz as issue 4177. - - o Documentation: - - Add notes in man page regarding OS support for the various - scheduler types. Attempt to use less jargon in the scheduler - section. Closes ticket 24254. - - -Changes in version 0.3.2.4-alpha - 2017-11-08 - Tor 0.3.2.4-alpha is the fourth alpha release in the 0.3.2.x series. - It fixes several stability and reliability bugs, especially including - a major reliability issue that has been plaguing fast exit relays in - recent months. - - o Major bugfixes (exit relays, DNS): - - Fix an issue causing DNS to fail on high-bandwidth exit nodes, - making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on - 0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for - identifying and finding a workaround to this bug and to Moritz, - Arthur Edelstein, and Roger for helping to track it down and - analyze it. - - o Major bugfixes (scheduler, channel): - - Stop processing scheduled channels if they closed while flushing - cells. This can happen if the write on the connection fails - leading to the channel being closed while in the scheduler loop. - Fixes bug 23751; bugfix on 0.3.2.1-alpha. - - o Minor features (logging, scheduler): - - Introduce a SCHED_BUG() function to log extra information about - the scheduler state if we ever catch a bug in the scheduler. - Closes ticket 23753. - - o Minor features (removed deprecations): - - The ClientDNSRejectInternalAddresses flag can once again be set in - non-testing Tor networks, so long as they do not use the default - directory authorities. This change also removes the deprecation of - this flag from 0.2.9.2-alpha. Closes ticket 21031. - - o Minor features (testing): - - Our fuzzing tests now test the encrypted portions of v3 onion - service descriptors. Implements more of 21509. - - o Minor bugfixes (directory client): - - On failure to download directory information, delay retry attempts - by a random amount based on the "decorrelated jitter" algorithm. - Our previous delay algorithm tended to produce extra-long delays - too easily. Fixes bug 23816; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (IPv6, v3 single onion services): - - Remove buggy code for IPv6-only v3 single onion services, and - reject attempts to configure them. This release supports IPv4, - dual-stack, and IPv6-only v3 onion services; and IPv4 and dual- - stack v3 single onion services. Fixes bug 23820; bugfix - on 0.3.2.1-alpha. - - o Minor bugfixes (logging, relay): - - Give only a protocol warning when the ed25519 key is not - consistent between the descriptor and microdescriptor of a relay. - This can happen, for instance, if the relay has been flagged - NoEdConsensus. Fixes bug 24025; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (manpage, onion service): - - Document that the HiddenServiceNumIntroductionPoints option is - 0-10 for v2 services and 0-20 for v3 services. Fixes bug 24115; - bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (memory leaks): - - Fix a minor memory leak at exit in the KIST scheduler. This bug - should have no user-visible impact. Fixes bug 23774; bugfix - on 0.3.2.1-alpha. - - Fix a memory leak when decrypting a badly formatted v3 onion - service descriptor. Fixes bug 24150; bugfix on 0.3.2.1-alpha. - Found by OSS-Fuzz; this is OSS-Fuzz issue 3994. - - o Minor bugfixes (onion services): - - Cache some needed onion service client information instead of - constantly computing it over and over again. Fixes bug 23623; - bugfix on 0.3.2.1-alpha. - - Properly retry HSv3 descriptor fetches when missing required - directory information. Fixes bug 23762; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (path selection): - - When selecting relays by bandwidth, avoid a rounding error that - could sometimes cause load to be imbalanced incorrectly. - Previously, we would always round upwards; now, we round towards - the nearest integer. This had the biggest effect when a relay's - weight adjustments should have given it weight 0, but it got - weight 1 instead. Fixes bug 23318; bugfix on 0.2.4.3-alpha. - - When calculating the fraction of nodes that have descriptors, and - all nodes in the network have zero bandwidths, count the number of - nodes instead. Fixes bug 23318; bugfix on 0.2.4.10-alpha. - - Actually log the total bandwidth in compute_weighted_bandwidths(). - Fixes bug 24170; bugfix on 0.2.4.3-alpha. - - o Minor bugfixes (relay, crash): - - Avoid a crash when transitioning from client mode to bridge mode. - Previously, we would launch the worker threads whenever our - "public server" mode changed, but not when our "server" mode - changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha. - - o Minor bugfixes (testing): - - Fix a spurious fuzzing-only use of an uninitialized value. Found - by Brian Carpenter. Fixes bug 24082; bugfix on 0.3.0.3-alpha. - - Test that IPv6-only clients can use microdescriptors when running - "make test-network-all". Requires chutney master 61c28b9 or later. - Closes ticket 24109. - - -Changes in version 0.3.2.3-alpha - 2017-10-27 - Tor 0.3.2.3-alpha is the third release in the 0.3.2 series. It fixes - numerous small bugs in earlier versions of 0.3.2.x, and adds a new - directory authority, Bastet. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Minor features (bridge): - - Bridge relays can now set the BridgeDistribution config option to - add a "bridge-distribution-request" line to their bridge - descriptor, which tells BridgeDB how they'd like their bridge - address to be given out. (Note that as of Oct 2017, BridgeDB does - not yet implement this feature.) As a side benefit, this feature - provides a way to distinguish bridge descriptors from non-bridge - descriptors. Implements tickets 18329. - - o Minor features (client, entry guards): - - Improve log messages when missing descriptors for primary guards. - Resolves ticket 23670. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (bridge): - - Overwrite the bridge address earlier in the process of retrieving - its descriptor, to make sure we reach it on the configured - address. Fixes bug 20532; bugfix on 0.2.0.10-alpha. - - o Minor bugfixes (documentation): - - Document better how to read gcov, and what our gcov postprocessing - scripts do. Fixes bug 23739; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (entry guards): - - Tor now updates its guard state when it reads a consensus - regardless of whether it's missing descriptors. That makes tor use - its primary guards to fetch descriptors in some edge cases where - it would previously have used fallback directories. Fixes bug - 23862; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (hidden service client): - - When handling multiple SOCKS request for the same .onion address, - only fetch the service descriptor once. - - When a descriptor fetch fails with a non-recoverable error, close - all pending SOCKS requests for that .onion. Fixes bug 23653; - bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (hidden service): - - Always regenerate missing hidden service public key files. Prior - to this, if the public key was deleted from disk, it wouldn't get - recreated. Fixes bug 23748; bugfix on 0.3.2.2-alpha. Patch - from "cathugger". - - Make sure that we have a usable ed25519 key when the intro point - relay supports ed25519 link authentication. Fixes bug 24002; - bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (hidden service, v2): - - When reloading configured hidden services, copy all information - from the old service object. Previously, some data was omitted, - causing delays in descriptor upload, and other bugs. Fixes bug - 23790; bugfix on 0.2.1.9-alpha. - - o Minor bugfixes (memory safety, defensive programming): - - Clear the target address when node_get_prim_orport() returns - early. Fixes bug 23874; bugfix on 0.2.8.2-alpha. - - o Minor bugfixes (relay): - - Avoid a BUG warning when receiving a dubious CREATE cell while an - option transition is in progress. Fixes bug 23952; bugfix - on 0.3.2.1-alpha. - - o Minor bugfixes (testing): - - Adjust the GitLab CI configuration to more closely match that of - Travis CI. Fixes bug 23757; bugfix on 0.3.2.2-alpha. - - Prevent scripts/test/coverage from attempting to move gcov output - to the root directory. Fixes bug 23741; bugfix on 0.2.5.1-alpha. - - When running unit tests as root, skip a test that would fail - because it expects a permissions error. This affects some - continuous integration setups. Fixes bug 23758; bugfix - on 0.3.2.2-alpha. - - Stop unconditionally mirroring the tor repository in GitLab CI. - This prevented developers from enabling GitLab CI on master. Fixes - bug 23755; bugfix on 0.3.2.2-alpha. - - Fix the hidden service v3 descriptor decoding fuzzing to use the - latest decoding API correctly. Fixes bug 21509; bugfix - on 0.3.2.1-alpha. - - o Minor bugfixes (warnings): - - When we get an HTTP request on a SOCKS port, tell the user about - the new HTTPTunnelPort option. Previously, we would give a "Tor is - not an HTTP Proxy" message, which stopped being true when - HTTPTunnelPort was introduced. Fixes bug 23678; bugfix - on 0.3.2.1-alpha. - - -Changes in version 0.2.5.15 - 2017-10-25 - Tor 0.2.5.15 backports a collection of bugfixes from later Tor release - series. It also adds a new directory authority, Bastet. - - Note: the Tor 0.2.5 series will no longer be supported after 1 May - 2018. If you need a release with long-term support, please upgrade to - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha): - - Avoid an assertion failure bug affecting our implementation of - inet_pton(AF_INET6) on certain OpenBSD systems whose strtol() - handling of "0xx" differs from what we had expected. Fixes bug - 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha): - - Fix a memset() off the end of an array when packing cells. This - bug should be harmless in practice, since the corrupted bytes are - still in the same structure, and are always padding bytes, - ignored, or immediately overwritten, depending on compiler - behavior. Nevertheless, because the memset()'s purpose is to make - sure that any other cell-handling bugs can't expose bytes to the - network, we need to fix it. Fixes bug 22737; bugfix on - 0.2.4.11-alpha. Fixes CID 1401591. - - o Build features (backport from 0.3.1.5-alpha): - - Tor's repository now includes a Travis Continuous Integration (CI) - configuration file (.travis.yml). This is meant to help new - developers and contributors who fork Tor to a Github repository be - better able to test their changes, and understand what we expect - to pass. To use this new build feature, you must fork Tor to your - Github account, then go into the "Integrations" menu in the - repository settings for your fork and enable Travis, then push - your changes. Closes ticket 22636. - - -Changes in version 0.2.8.16 - 2017-10-25 - Tor 0.2.8.16 backports a collection of bugfixes from later Tor release - series, including a bugfix for a crash issue that had affected relays - under memory pressure. It also adds a new directory authority, Bastet. - - Note: the Tor 0.2.8 series will no longer be supported after 1 Jan - 2018. If you need a release with long-term support, please stick with - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha): - - Fix a timing-based assertion failure that could occur when the - circuit out-of-memory handler freed a connection's output buffer. - Fixes bug 23690; bugfix on 0.2.6.1-alpha. - - o Minor features (directory authorities, backport from 0.3.2.2-alpha): - - Remove longclaw's IPv6 address, as it will soon change. Authority - IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves - 3/8 directory authorities with IPv6 addresses, but there are also - 52 fallback directory mirrors with IPv6 addresses. Resolves 19760. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - -Changes in version 0.2.9.13 - 2017-10-25 - Tor 0.2.9.13 backports a collection of bugfixes from later Tor release - series, including a bugfix for a crash issue that had affected relays - under memory pressure. It also adds a new directory authority, Bastet. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha): - - Fix a timing-based assertion failure that could occur when the - circuit out-of-memory handler freed a connection's output buffer. - Fixes bug 23690; bugfix on 0.2.6.1-alpha. - - o Minor features (directory authorities, backport from 0.3.2.2-alpha): - - Remove longclaw's IPv6 address, as it will soon change. Authority - IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves - 3/8 directory authorities with IPv6 addresses, but there are also - 52 fallback directory mirrors with IPv6 addresses. Resolves 19760. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (directory authority, backport from 0.3.1.5-alpha): - - When a directory authority rejects a descriptor or extrainfo with - a given digest, mark that digest as undownloadable, so that we do - not attempt to download it again over and over. We previously - tried to avoid downloading such descriptors by other means, but we - didn't notice if we accidentally downloaded one anyway. This - behavior became problematic in 0.2.7.2-alpha, when authorities - began pinning Ed25519 keys. Fixes bug 22349; bugfix - on 0.2.1.19-alpha. - - o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha): - - Clear the address when node_get_prim_orport() returns early. - Fixes bug 23874; bugfix on 0.2.8.2-alpha. - - o Minor bugfixes (Windows service, backport from 0.3.1.6-rc): - - When running as a Windows service, set the ID of the main thread - correctly. Failure to do so made us fail to send log messages to - the controller in 0.2.1.16-rc, slowed down controller event - delivery in 0.2.7.3-rc and later, and crash with an assertion - failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha. - Patch and diagnosis from "Vort". - - -Changes in version 0.3.0.12 - 2017-10-25 - Tor 0.3.0.12 backports a collection of bugfixes from later Tor release - series, including a bugfix for a crash issue that had affected relays - under memory pressure. It also adds a new directory authority, Bastet. - - Note: the Tor 0.3.0 series will no longer be supported after 26 Jan - 2018. If you need a release with long-term support, please stick with - the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha): - - Fix a timing-based assertion failure that could occur when the - circuit out-of-memory handler freed a connection's output buffer. - Fixes bug 23690; bugfix on 0.2.6.1-alpha. - - o Minor features (directory authorities, backport from 0.3.2.2-alpha): - - Remove longclaw's IPv6 address, as it will soon change. Authority - IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves - 3/8 directory authorities with IPv6 addresses, but there are also - 52 fallback directory mirrors with IPv6 addresses. Resolves 19760. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (directory authority, backport from 0.3.1.5-alpha): - - When a directory authority rejects a descriptor or extrainfo with - a given digest, mark that digest as undownloadable, so that we do - not attempt to download it again over and over. We previously - tried to avoid downloading such descriptors by other means, but we - didn't notice if we accidentally downloaded one anyway. This - behavior became problematic in 0.2.7.2-alpha, when authorities - began pinning Ed25519 keys. Fixes bug 22349; bugfix - on 0.2.1.19-alpha. - - o Minor bugfixes (hidden service, relay, backport from 0.3.2.2-alpha): - - Avoid a possible double close of a circuit by the intro point on - error of sending the INTRO_ESTABLISHED cell. Fixes bug 23610; - bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha): - - Clear the address when node_get_prim_orport() returns early. - Fixes bug 23874; bugfix on 0.2.8.2-alpha. - - o Minor bugfixes (Windows service, backport from 0.3.1.6-rc): - - When running as a Windows service, set the ID of the main thread - correctly. Failure to do so made us fail to send log messages to - the controller in 0.2.1.16-rc, slowed down controller event - delivery in 0.2.7.3-rc and later, and crash with an assertion - failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha. - Patch and diagnosis from "Vort". - - -Changes in version 0.3.1.8 - 2017-10-25 - Tor 0.3.1.8 is the second stable release in the 0.3.1 series. - It includes several bugfixes, including a bugfix for a crash issue - that had affected relays under memory pressure. It also adds - a new directory authority, Bastet. - - o Directory authority changes: - - Add "Bastet" as a ninth directory authority to the default list. - Closes ticket 23910. - - The directory authority "Longclaw" has changed its IP address. - Closes ticket 23592. - - o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha): - - Fix a timing-based assertion failure that could occur when the - circuit out-of-memory handler freed a connection's output buffer. - Fixes bug 23690; bugfix on 0.2.6.1-alpha. - - o Minor features (directory authorities, backport from 0.3.2.2-alpha): - - Remove longclaw's IPv6 address, as it will soon change. Authority - IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves - 3/8 directory authorities with IPv6 addresses, but there are also - 52 fallback directory mirrors with IPv6 addresses. Resolves 19760. - - o Minor features (geoip): - - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, backport from 0.3.2.2-alpha): - - Fix a compilation warning when building with zstd support on - 32-bit platforms. Fixes bug 23568; bugfix on 0.3.1.1-alpha. Found - and fixed by Andreas Stieger. - - o Minor bugfixes (compression, backport from 0.3.2.2-alpha): - - Handle a pathological case when decompressing Zstandard data when - the output buffer size is zero. Fixes bug 23551; bugfix - on 0.3.1.1-alpha. - - o Minor bugfixes (directory authority, backport from 0.3.2.1-alpha): - - Remove the length limit on HTTP status lines that authorities can - send in their replies. Fixes bug 23499; bugfix on 0.3.1.6-rc. - - o Minor bugfixes (hidden service, relay, backport from 0.3.2.2-alpha): - - Avoid a possible double close of a circuit by the intro point on - error of sending the INTRO_ESTABLISHED cell. Fixes bug 23610; - bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha): - - Clear the address when node_get_prim_orport() returns early. - Fixes bug 23874; bugfix on 0.2.8.2-alpha. - - o Minor bugfixes (unit tests, backport from 0.3.2.2-alpha): - - Fix additional channelpadding unit test failures by using mocked - time instead of actual time for all tests. Fixes bug 23608; bugfix - on 0.3.1.1-alpha. - - -Changes in version 0.3.2.2-alpha - 2017-09-29 - Tor 0.3.2.2-alpha is the second release in the 0.3.2 series. This - release fixes several minor bugs in the new scheduler and next- - generation onion services; both features were newly added in the 0.3.2 - series. Other fixes in this alpha include several fixes for non-fatal - tracebacks which would appear in logs. - - With the aim to stabilise the 0.3.2 series by 15 December 2017, this - alpha does not contain any substantial new features. Minor features - include better testing and logging. - - The following comprises the complete list of changes included - in tor-0.3.2.2-alpha: - - o Major bugfixes (relay, crash, assertion failure): - - Fix a timing-based assertion failure that could occur when the - circuit out-of-memory handler freed a connection's output buffer. - Fixes bug 23690; bugfix on 0.2.6.1-alpha. - - o Major bugfixes (scheduler): - - If a channel is put into the scheduler's pending list, then it - starts closing, and then if the scheduler runs before it finishes - closing, the scheduler will get stuck trying to flush its cells - while the lower layers refuse to cooperate. Fix that race - condition by giving the scheduler an escape method. Fixes bug - 23676; bugfix on 0.3.2.1-alpha. - - o Minor features (build, compilation): - - The "check-changes" feature is now part of the "make check" tests; - we'll use it to try to prevent misformed changes files from - accumulating. Closes ticket 23564. - - Tor builds should now fail if there are any mismatches between the - C type representing a configuration variable and the C type the - data-driven parser uses to store a value there. Previously, we - needed to check these by hand, which sometimes led to mistakes. - Closes ticket 23643. - - o Minor features (directory authorities): - - Remove longclaw's IPv6 address, as it will soon change. Authority - IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves - 3/8 directory authorities with IPv6 addresses, but there are also - 52 fallback directory mirrors with IPv6 addresses. Resolves 19760. - - o Minor features (hidden service, circuit, logging): - - Improve logging of many callsite in the circuit subsystem to print - the circuit identifier(s). - - Log when we cleanup an intro point from a service so we know when - and for what reason it happened. Closes ticket 23604. - - o Minor features (logging): - - Log more circuit information whenever we are about to try to - package a relay cell on a circuit with a nonexistent n_chan. - Attempt to diagnose ticket 8185. - - Improve info-level log identification of particular circuits, to - help with debugging. Closes ticket 23645. - - o Minor features (relay): - - When choosing which circuits can be expired as unused, consider - circuits from clients even if those clients used regular CREATE - cells to make them; and do not consider circuits from relays even - if they were made with CREATE_FAST. Part of ticket 22805. - - o Minor features (robustness): - - Change several fatal assertions when flushing buffers into non- - fatal assertions, to prevent any recurrence of 23690. - - o Minor features (spec conformance, bridge, diagnostic): - - When handling the USERADDR command on an ExtOrPort, warn when the - transports provides a USERADDR with no port. In a future version, - USERADDR commands of this format may be rejected. Detects problems - related to ticket 23080. - - o Minor features (testing): - - Add a unit test to make sure that our own generated platform - string will be accepted by directory authorities. Closes - ticket 22109. - - o Minor bugfixes (bootstrapping): - - When warning about state file clock skew, report the correct - direction for the detected skew. Fixes bug 23606; bugfix - on 0.2.8.1-alpha. - - Avoid an assertion failure when logging a state file clock skew - very early in bootstrapping. Fixes bug 23607; bugfix - on 0.3.2.1-alpha. - - o Minor bugfixes (build, compilation): - - Fix a compilation warning when building with zstd support on - 32-bit platforms. Fixes bug 23568; bugfix on 0.3.1.1-alpha. Found - and fixed by Andreas Stieger. - - When searching for OpenSSL, don't accept any OpenSSL library that - lacks TLSv1_1_method(): Tor doesn't build with those versions. - Additionally, look in /usr/local/opt/openssl, if it's present. - These changes together repair the default build on OSX systems - with Homebrew installed. Fixes bug 23602; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (compression): - - Handle a pathological case when decompressing Zstandard data when - the output buffer size is zero. Fixes bug 23551; bugfix - on 0.3.1.1-alpha. - - o Minor bugfixes (documentation): - - Fix manpage to not refer to the obsolete (and misspelled) - UseEntryGuardsAsDirectoryGuards parameter in the description of - NumDirectoryGuards. Fixes bug 23611; bugfix on 0.2.4.8-alpha. - - o Minor bugfixes (hidden service v3): - - Don't log an assertion failure when we can't find the right - information to extend to an introduction point. In rare cases, - this could happen, causing a warning, even though tor would - recover gracefully. Fixes bug 23159; bugfix on 0.3.2.1-alpha. - - Pad RENDEZVOUS cell up to the size of the legacy cell which is - much bigger so the rendezvous point can't distinguish which hidden - service protocol is being used. Fixes bug 23420; bugfix - on 0.3.2.1-alpha. - - o Minor bugfixes (hidden service, relay): - - Avoid a possible double close of a circuit by the intro point on - error of sending the INTRO_ESTABLISHED cell. Fixes bug 23610; - bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (logging, relay shutdown, annoyance): - - When a circuit is marked for close, do not attempt to package any - cells for channels on that circuit. Previously, we would detect - this condition lower in the call stack, when we noticed that the - circuit had no attached channel, and log an annoying message. - Fixes bug 8185; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (scheduler): - - When switching schedulers due to a consensus change, we didn't - give the new scheduler a chance to react to the consensus. Fix - that. Fixes bug 23537; bugfix on 0.3.2.1-alpha. - - Make the KISTSchedRunInterval option a non negative value. With - this, the way to disable KIST through the consensus is to set it - to 0. Fixes bug 23539; bugfix on 0.3.2.1-alpha. - - Only notice log the selected scheduler when we switch scheduler - types. Fixes bug 23552; bugfix on 0.3.2.1-alpha. - - Avoid a compilation warning on macOS in scheduler_ev_add() caused - by a different tv_usec data type. Fixes bug 23575; bugfix - on 0.3.2.1-alpha. - - Make a hard exit if tor is unable to pick a scheduler which can - happen if the user specifies a scheduler type that is not - supported and not other types in Schedulers. Fixes bug 23581; - bugfix on 0.3.2.1-alpha. - - Properly initialize the scheduler last run time counter so it is - not 0 at the first tick. Fixes bug 23696; bugfix on 0.3.2.1-alpha. - - o Minor bugfixes (testing): - - Capture and detect several "Result does not fit" warnings in unit - tests on platforms with 32-bit time_t. Fixes bug 21800; bugfix - on 0.2.9.3-alpha. - - Fix additional channelpadding unit test failures by using mocked - time instead of actual time for all tests. Fixes bug 23608; bugfix - on 0.3.1.1-alpha. - - The removal of some old scheduler options caused some tests to - fail on BSD systems. Assume current behavior is correct and make - the tests pass again. Fixes bug 23566; bugfix on 0.3.2.1-alpha. - - o Code simplification and refactoring: - - Remove various ways of testing circuits and connections for - "clientness"; instead, favor channel_is_client(). Part of - ticket 22805. - - o Deprecated features: - - The ReachableDirAddresses and ClientPreferIPv6DirPort options are - now deprecated; they do not apply to relays, and they have had no - effect on clients since 0.2.8.x. Closes ticket 19704. - - o Documentation: - - HiddenServiceVersion man page entry wasn't mentioning the now - supported version 3. Fixes ticket 23580; bugfix on 0.3.2.1-alpha. - - Clarify that the Address option is entirely about setting an - advertised IPv4 address. Closes ticket 18891. - - Clarify the manpage's use of the term "address" to clarify what - kind of address is intended. Closes ticket 21405. - - Document that onion service subdomains are allowed, and ignored. - Closes ticket 18736. - - -Changes in version 0.3.2.1-alpha - 2017-09-18 - Tor 0.3.2.1-alpha is the first release in the 0.3.2.x series. It - includes support for our next-generation ("v3") onion service - protocol, and adds a new circuit scheduler for more responsive - forwarding decisions from relays. There are also numerous other small - features and bugfixes here. - - Below are the changes since Tor 0.3.1.7. - - o Major feature (scheduler, channel): - - Tor now uses new schedulers to decide which circuits should - deliver cells first, in order to improve congestion at relays. The - first type is called "KIST" ("Kernel Informed Socket Transport"), - and is only available on Linux-like systems: it uses feedback from - the kernel to prevent the kernel's TCP buffers from growing too - full. The second new scheduler type is called "KISTLite": it - behaves the same as KIST, but runs on systems without kernel - support for inspecting TCP implementation details. The old - scheduler is still available, under the name "Vanilla". To change - the default scheduler preference order, use the new "Schedulers" - option. (The default preference order is "KIST,KISTLite,Vanilla".) - - Matt Traudt implemented KIST, based on research by Rob Jansen, - John Geddes, Christ Wacek, Micah Sherr, and Paul Syverson. For - more information, see the design paper at - http://www.robgjansen.com/publications/kist-sec2014.pdf and the - followup implementation paper at https://arxiv.org/abs/1709.01044. - Closes ticket 12541. - - o Major features (next-generation onion services): - - Tor now supports the next-generation onion services protocol for - clients and services! As part of this release, the core of - proposal 224 has been implemented and is available for - experimentation and testing by our users. This newer version of - onion services ("v3") features many improvements over the legacy - system, including: - - a) Better crypto (replaced SHA1/DH/RSA1024 - with SHA3/ed25519/curve25519) - - b) Improved directory protocol, leaking much less information to - directory servers. - - c) Improved directory protocol, with smaller surface for - targeted attacks. - - d) Better onion address security against impersonation. - - e) More extensible introduction/rendezvous protocol. - - f) A cleaner and more modular codebase. - - You can identify a next-generation onion address by its length: - they are 56 characters long, as in - "4acth47i6kxnvkewtm6q7ib2s3ufpo5sqbsnzjpbi7utijcltosqemad.onion". - - In the future, we will release more options and features for v3 - onion services, but we first need a testing period, so that the - current codebase matures and becomes more robust. Planned features - include: offline keys, advanced client authorization, improved - guard algorithms, and statistics. For full details, see - proposal 224. - - Legacy ("v2") onion services will still work for the foreseeable - future, and will remain the default until this new codebase gets - tested and hardened. Service operators who want to experiment with - the new system can use the 'HiddenServiceVersion 3' torrc - directive along with the regular onion service configuration - options. We will publish a blog post about this new feature - soon! Enjoy! - - o Major bugfixes (usability, control port): - - Report trusted clock skew indications as bootstrap errors, so - controllers can more easily alert users when their clocks are - wrong. Fixes bug 23506; bugfix on 0.1.2.6-alpha. - - o Minor features (bug detection): - - Log a warning message with a stack trace for any attempt to call - get_options() during option validation. This pattern has caused - subtle bugs in the past. Closes ticket 22281. - - o Minor features (client): - - You can now use Tor as a tunneled HTTP proxy: use the new - HTTPTunnelPort option to open a port that accepts HTTP CONNECT - requests. Closes ticket 22407. - - Add an extra check to make sure that we always use the newer guard - selection code for picking our guards. Closes ticket 22779. - - When downloading (micro)descriptors, don't split the list into - multiple requests unless we want at least 32 descriptors. - Previously, we split at 4, not 32, which led to significant - overhead in HTTP request size and degradation in compression - performance. Closes ticket 23220. - - o Minor features (command line): - - Add a new commandline option, --key-expiration, which prints when - the current signing key is going to expire. Implements ticket - 17639; patch by Isis Lovecruft. - - o Minor features (control port): - - If an application tries to use the control port as an HTTP proxy, - respond with a meaningful "This is the Tor control port" message, - and log the event. Closes ticket 1667. Patch from Ravi - Chandra Padmala. - - Provide better error message for GETINFO desc/(id|name) when not - fetching router descriptors. Closes ticket 5847. Patch by - Kevin Butler. - - Add GETINFO "{desc,md}/download-enabled", to inform the controller - whether Tor will try to download router descriptors and - microdescriptors respectively. Closes ticket 22684. - - Added new GETINFO targets "ip-to-country/{ipv4,ipv6}-available", - so controllers can tell whether the geoip databases are loaded. - Closes ticket 23237. - - Adds a timestamp field to the CIRC_BW and STREAM_BW bandwidth - events. Closes ticket 19254. Patch by "DonnchaC". - - o Minor features (development support): - - Developers can now generate a call-graph for Tor using the - "calltool" python program, which post-processes object dumps. It - should work okay on many Linux and OSX platforms, and might work - elsewhere too. To run it, install calltool from - https://gitweb.torproject.org/user/nickm/calltool.git and run - "make callgraph". Closes ticket 19307. - - o Minor features (ed25519): - - Add validation function to checks for torsion components in - ed25519 public keys, used by prop224 client-side code. Closes - ticket 22006. Math help by Ian Goldberg. - - o Minor features (exit relay, DNS): - - Improve the clarity and safety of the log message from evdns when - receiving an apparently spoofed DNS reply. Closes ticket 3056. - - o Minor features (integration, hardening): - - Add a new NoExec option to prevent Tor from running other - programs. When this option is set to 1, Tor will never try to run - another program, regardless of the settings of - PortForwardingHelper, ClientTransportPlugin, or - ServerTransportPlugin. Once NoExec is set, it cannot be disabled - without restarting Tor. Closes ticket 22976. - - o Minor features (logging): - - Improve the warning message for specifying a relay by nickname. - The previous message implied that nickname registration was still - part of the Tor network design, which it isn't. Closes - ticket 20488. - - If the sandbox filter fails to load, suggest to the user that - their kernel might not support seccomp2. Closes ticket 23090. - - o Minor features (portability): - - Check at configure time whether uint8_t is the same type as - unsigned char. Lots of existing code already makes this - assumption, and there could be strict aliasing issues if the - assumption is violated. Closes ticket 22410. - - o Minor features (relay, configuration): - - Reject attempts to use relative file paths when RunAsDaemon is - set. Previously, Tor would accept these, but the directory- - changing step of RunAsDaemon would give strange and/or confusing - results. Closes ticket 22731. - - o Minor features (startup, safety): - - When configured to write a PID file, Tor now exits if it is unable - to do so. Previously, it would warn and continue. Closes - ticket 20119. - - o Minor features (static analysis): - - The BUG() macro has been changed slightly so that Coverity no - longer complains about dead code if the bug is impossible. Closes - ticket 23054. - - o Minor features (testing): - - The default chutney network tests now include tests for the v3 - hidden service design. Make sure you have the latest version of - chutney if you want to run these. Closes ticket 22437. - - Add a unit test to verify that we can parse a hardcoded v2 hidden - service descriptor. Closes ticket 15554. - - o Minor bugfixes (certificate handling): - - Fix a time handling bug in Tor certificates set to expire after - the year 2106. Fixes bug 23055; bugfix on 0.3.0.1-alpha. Found by - Coverity as CID 1415728. - - o Minor bugfixes (client, usability): - - Refrain from needlessly rejecting SOCKS5-with-hostnames and - SOCKS4a requests that contain IP address strings, even when - SafeSocks in enabled, as this prevents user from connecting to - known IP addresses without relying on DNS for resolving. SafeSocks - still rejects SOCKS connections that connect to IP addresses when - those addresses are _not_ encoded as hostnames. Fixes bug 22461; - bugfix on Tor 0.2.6.2-alpha. - - o Minor bugfixes (code correctness): - - Call htons() in extend_cell_format() for encoding a 16-bit value. - Previously we used ntohs(), which happens to behave the same on - all the platforms we support, but which isn't really correct. - Fixes bug 23106; bugfix on 0.2.4.8-alpha. - - For defense-in-depth, make the controller's write_escaped_data() - function robust to extremely long inputs. Fixes bug 19281; bugfix - on 0.1.1.1-alpha. Reported by Guido Vranken. - - o Minor bugfixes (compilation): - - Fix unused-variable warnings in donna's Curve25519 SSE2 code. - Fixes bug 22895; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (consensus expiry): - - Check for adequate directory information correctly. Previously, Tor - would reconsider whether it had sufficient directory information - every 2 minutes. Fixes bug 23091; bugfix on 0.2.0.19-alpha. - - o Minor bugfixes (directory protocol): - - Directory servers now include a "Date:" http header for response - codes other than 200. Clients starting with a skewed clock and a - recent consensus were getting "304 Not modified" responses from - directory authorities, so without the Date header, the client - would never hear about a wrong clock. Fixes bug 23499; bugfix - on 0.0.8rc1. - - Make clients wait for 6 seconds before trying to download a - consensus from an authority. Fixes bug 17750; bugfix - on 0.2.8.1-alpha. - - o Minor bugfixes (DoS-resistance): - - If future code asks if there are any running bridges, without - checking if bridges are enabled, log a BUG warning rather than - crashing. Fixes bug 23524; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (format strictness): - - Restrict several data formats to decimal. Previously, the - BuildTimeHistogram entries in the state file, the "bw=" entries in - the bandwidth authority file, and the process IDs passed to the - __OwningControllerProcess option could all be specified in hex or - octal as well as in decimal. This was not an intentional feature. - Fixes bug 22802; bugfixes on 0.2.2.1-alpha, 0.2.2.2-alpha, - and 0.2.2.28-beta. - - o Minor bugfixes (heartbeat): - - If we fail to write a heartbeat message, schedule a retry for the - minimum heartbeat interval number of seconds in the future. Fixes - bug 19476; bugfix on 0.2.3.1-alpha. - - o Minor bugfixes (linux seccomp2 sandbox, logging): - - Fix some messages on unexpected errors from the seccomp2 library. - Fixes bug 22750; bugfix on 0.2.5.1-alpha. Patch from "cypherpunks". - - o Minor bugfixes (logging): - - Remove duplicate log messages regarding opening non-local - SocksPorts upon parsing config and opening listeners at startup. - Fixes bug 4019; bugfix on 0.2.3.3-alpha. - - Use a more comprehensible log message when telling the user - they've excluded every running exit node. Fixes bug 7890; bugfix - on 0.2.2.25-alpha. - - When logging the number of descriptors we intend to download per - directory request, do not log a number higher than then the number - of descriptors we're fetching in total. Fixes bug 19648; bugfix - on 0.1.1.8-alpha. - - When warning about a directory owned by the wrong user, log the - actual name of the user owning the directory. Previously, we'd log - the name of the process owner twice. Fixes bug 23487; bugfix - on 0.2.9.1-alpha. - - The tor specification says hop counts are 1-based, so fix two log - messages that mistakenly logged 0-based hop counts. Fixes bug - 18982; bugfix on 0.2.6.2-alpha and 0.2.4.5-alpha. Patch by teor. - Credit to Xiaofan Li for reporting this issue. - - o Minor bugfixes (portability): - - Stop using the PATH_MAX variable, which is not defined on GNU - Hurd. Fixes bug 23098; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (relay): - - When uploading our descriptor for the first time after startup, - report the reason for uploading as "Tor just started" rather than - leaving it blank. Fixes bug 22885; bugfix on 0.2.3.4-alpha. - - Avoid unnecessary calls to directory_fetches_from_authorities() on - relays, to prevent spurious address resolutions and descriptor - rebuilds. This is a mitigation for bug 21789. Fixes bug 23470; - bugfix on in 0.2.8.1-alpha. - - o Minor bugfixes (tests): - - Fix a broken unit test for the OutboundAddress option: the parsing - function was never returning an error on failure. Fixes bug 23366; - bugfix on 0.3.0.3-alpha. - - Fix a signed-integer overflow in the unit tests for - dir/download_status_random_backoff, which was untriggered until we - fixed bug 17750. Fixes bug 22924; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (usability, control port): - - Stop making an unnecessary routerlist check in NETINFO clock skew - detection; this was preventing clients from reporting NETINFO clock - skew to controllers. Fixes bug 23532; bugfix on 0.2.4.4-alpha. - - o Code simplification and refactoring: - - Extract the code for handling newly-open channels into a separate - function from the general code to handle channel state - transitions. This change simplifies our callgraph, reducing the - size of the largest strongly connected component by roughly a - factor of two. Closes ticket 22608. - - Remove dead code for largely unused statistics on the number of - times we've attempted various public key operations. Fixes bug - 19871; bugfix on 0.1.2.4-alpha. Fix by Isis Lovecruft. - - Remove several now-obsolete functions for asking about old - variants directory authority status. Closes ticket 22311; patch - from "huyvq". - - Remove some of the code that once supported "Named" and "Unnamed" - routers. Authorities no longer vote for these flags. Closes - ticket 22215. - - Rename the obsolete malleable hybrid_encrypt functions used in TAP - and old hidden services, to indicate that they aren't suitable for - new protocols or formats. Closes ticket 23026. - - Replace our STRUCT_OFFSET() macro with offsetof(). Closes ticket - 22521. Patch from Neel Chauhan. - - Split the enormous circuit_send_next_onion_skin() function into - multiple subfunctions. Closes ticket 22804. - - Split the portions of the buffer.c module that handle particular - protocols into separate modules. Part of ticket 23149. - - Use our test macros more consistently, to produce more useful - error messages when our unit tests fail. Add coccinelle patches to - allow us to re-check for test macro uses. Closes ticket 22497. - - o Deprecated features: - - Deprecate HTTPProxy/HTTPProxyAuthenticator config options. They - only applies to direct unencrypted HTTP connections to your - directory server, which your Tor probably isn't using. Closes - ticket 20575. - - o Documentation: - - Clarify in the manual that "Sandbox 1" is only supported on Linux - kernels. Closes ticket 22677. - - Document all values of PublishServerDescriptor in the manpage. - Closes ticket 15645. - - Improve the documentation for the directory port part of the - DirAuthority line. Closes ticket 20152. - - Restore documentation for the authorities' "approved-routers" - file. Closes ticket 21148. - - o Removed features: - - The AllowDotExit option has been removed as unsafe. It has been - deprecated since 0.2.9.2-alpha. Closes ticket 23426. - - The ClientDNSRejectInternalAddresses flag can no longer be set on - non-testing networks. It has been deprecated since 0.2.9.2-alpha. - Closes ticket 21031. - - The controller API no longer includes an AUTHDIR_NEWDESCS event: - nobody was using it any longer. Closes ticket 22377. - - -Changes in version 0.2.8.15 - 2017-09-18 - Tor 0.2.8.15 backports a collection of bugfixes from later - Tor series. - - Most significantly, it includes a fix for TROVE-2017-008, a - security bug that affects hidden services running with the - SafeLogging option disabled. For more information, see - https://trac.torproject.org/projects/tor/ticket/23490 - - Note that Tor 0.2.8.x will no longer be supported after 1 Jan - 2018. We suggest that you upgrade to the latest stable release if - possible. If you can't, we recommend that you upgrade at least to - 0.2.9, which will be supported until 2020. - - o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha): - - Avoid an assertion failure bug affecting our implementation of - inet_pton(AF_INET6) on certain OpenBSD systems whose strtol() - handling of "0xx" differs from what we had expected. Fixes bug - 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007. - - o Minor features: - - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha): - - Backport a fix for an "unused variable" warning that appeared - in some versions of mingw. Fixes bug 22838; bugfix on - 0.2.8.1-alpha. - - o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha): - - Fix a memset() off the end of an array when packing cells. This - bug should be harmless in practice, since the corrupted bytes are - still in the same structure, and are always padding bytes, - ignored, or immediately overwritten, depending on compiler - behavior. Nevertheless, because the memset()'s purpose is to make - sure that any other cell-handling bugs can't expose bytes to the - network, we need to fix it. Fixes bug 22737; bugfix on - 0.2.4.11-alpha. Fixes CID 1401591. - - o Build features (backport from 0.3.1.5-alpha): - - Tor's repository now includes a Travis Continuous Integration (CI) - configuration file (.travis.yml). This is meant to help new - developers and contributors who fork Tor to a Github repository be - better able to test their changes, and understand what we expect - to pass. To use this new build feature, you must fork Tor to your - Github account, then go into the "Integrations" menu in the - repository settings for your fork and enable Travis, then push - your changes. Closes ticket 22636. - - -Changes in version 0.2.9.12 - 2017-09-18 - Tor 0.2.9.12 backports a collection of bugfixes from later - Tor series. - - Most significantly, it includes a fix for TROVE-2017-008, a - security bug that affects hidden services running with the - SafeLogging option disabled. For more information, see - https://trac.torproject.org/projects/tor/ticket/23490 - - o Major features (security, backport from 0.3.0.2-alpha): - - Change the algorithm used to decide DNS TTLs on client and server - side, to better resist DNS-based correlation attacks like the - DefecTor attack of Greschbach, Pulls, Roberts, Winter, and - Feamster. Now relays only return one of two possible DNS TTL - values, and clients are willing to believe DNS TTL values up to 3 - hours long. Closes ticket 19769. - - o Major bugfixes (crash, directory connections, backport from 0.3.0.5-rc): - - Fix a rare crash when sending a begin cell on a circuit whose - linked directory connection had already been closed. Fixes bug - 21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett. - - o Major bugfixes (DNS, backport from 0.3.0.2-alpha): - - Fix a bug that prevented exit nodes from caching DNS records for - more than 60 seconds. Fixes bug 19025; bugfix on 0.2.4.7-alpha. - - o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha): - - Fix a typo that had prevented TPROXY-based transparent proxying - from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha. - Patch from "d4fq0fQAgoJ". - - o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha): - - Avoid an assertion failure bug affecting our implementation of - inet_pton(AF_INET6) on certain OpenBSD systems whose strtol() - handling of "0xx" differs from what we had expected. Fixes bug - 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007. - - o Minor features (code style, backport from 0.3.1.3-alpha): - - Add "Falls through" comments to our codebase, in order to silence - GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas - Stieger. Closes ticket 22446. - - o Minor features (geoip): - - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (bandwidth accounting, backport from 0.3.1.1-alpha): - - Roll over monthly accounting at the configured hour and minute, - rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1. - Found by Andrey Karpov with PVS-Studio. - - o Minor bugfixes (compilation, backport from 0.3.1.5-alpha): - - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915; - bugfix on 0.2.8.1-alpha. - - Fix warnings when building with libscrypt and openssl scrypt support - on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha. - - When building with certain versions the mingw C header files, avoid - float-conversion warnings when calling the C functions isfinite(), - isnan(), and signbit(). Fixes bug 22801; bugfix on 0.2.8.1-alpha. - - o Minor bugfixes (compilation, backport from 0.3.1.7): - - Avoid compiler warnings in the unit tests for running tor_sscanf() - with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha. - - o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha): - - Backport a fix for an "unused variable" warning that appeared - in some versions of mingw. Fixes bug 22838; bugfix on - 0.2.8.1-alpha. - - o Minor bugfixes (controller, backport from 0.3.1.7): - - Do not crash when receiving a HSPOST command with an empty body. - Fixes part of bug 22644; bugfix on 0.2.7.1-alpha. - - Do not crash when receiving a POSTDESCRIPTOR command with an - empty body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha. - - o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha): - - Avoid Coverity build warnings related to our BUG() macro. By - default, Coverity treats BUG() as the Linux kernel does: an - instant abort(). We need to override that so our BUG() macro - doesn't prevent Coverity from analyzing functions that use it. - Fixes bug 23030; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha): - - Fix a memset() off the end of an array when packing cells. This - bug should be harmless in practice, since the corrupted bytes are - still in the same structure, and are always padding bytes, - ignored, or immediately overwritten, depending on compiler - behavior. Nevertheless, because the memset()'s purpose is to make - sure that any other cell-handling bugs can't expose bytes to the - network, we need to fix it. Fixes bug 22737; bugfix on - 0.2.4.11-alpha. Fixes CID 1401591. - - o Minor bugfixes (file limits, osx, backport from 0.3.1.5-alpha): - - When setting the maximum number of connections allowed by the OS, - always allow some extra file descriptors for other files. Fixes - bug 22797; bugfix on 0.2.0.10-alpha. - - o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha): - - Avoid a sandbox failure when trying to re-bind to a socket and - mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha. - - o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha): - - Permit the fchmod system call, to avoid crashing on startup when - starting with the seccomp2 sandbox and an unexpected set of - permissions on the data directory or its contents. Fixes bug - 22516; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (relay, backport from 0.3.0.5-rc): - - Avoid a double-marked-circuit warning that could happen when we - receive DESTROY cells under heavy load. Fixes bug 20059; bugfix - on 0.1.0.1-rc. - - o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha): - - Reject version numbers with non-numeric prefixes (such as +, -, or - whitespace). Disallowing whitespace prevents differential version - parsing between POSIX-based and Windows platforms. Fixes bug 21507 - and part of 21508; bugfix on 0.0.8pre1. - - o Build features (backport from 0.3.1.5-alpha): - - Tor's repository now includes a Travis Continuous Integration (CI) - configuration file (.travis.yml). This is meant to help new - developers and contributors who fork Tor to a Github repository be - better able to test their changes, and understand what we expect - to pass. To use this new build feature, you must fork Tor to your - Github account, then go into the "Integrations" menu in the - repository settings for your fork and enable Travis, then push - your changes. Closes ticket 22636. - - -Changes in version 0.3.0.11 - 2017-09-18 - Tor 0.3.0.11 backports a collection of bugfixes from Tor the 0.3.1 - series. - - Most significantly, it includes a fix for TROVE-2017-008, a - security bug that affects hidden services running with the - SafeLogging option disabled. For more information, see - https://trac.torproject.org/projects/tor/ticket/23490 - - o Minor features (code style, backport from 0.3.1.7): - - Add "Falls through" comments to our codebase, in order to silence - GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas - Stieger. Closes ticket 22446. - - o Minor features: - - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, backport from 0.3.1.7): - - Avoid compiler warnings in the unit tests for calling tor_sscanf() - with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha. - - o Minor bugfixes (controller, backport from 0.3.1.7): - - Do not crash when receiving a HSPOST command with an empty body. - Fixes part of bug 22644; bugfix on 0.2.7.1-alpha. - - Do not crash when receiving a POSTDESCRIPTOR command with an empty - body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha. - - o Minor bugfixes (file limits, osx, backport from 0.3.1.5-alpha): - - When setting the maximum number of connections allowed by the OS, - always allow some extra file descriptors for other files. Fixes - bug 22797; bugfix on 0.2.0.10-alpha. - - o Minor bugfixes (logging, relay, backport from 0.3.1.6-rc): - - Remove a forgotten debugging message when an introduction point - successfully establishes a hidden service prop224 circuit with - a client. - - Change three other log_warn() for an introduction point to - protocol warnings, because they can be failure from the network - and are not relevant to the operator. Fixes bug 23078; bugfix on - 0.3.0.1-alpha and 0.3.0.2-alpha. - - -Changes in version 0.3.1.7 - 2017-09-18 - Tor 0.3.1.7 is the first stable release in the 0.3.1 series. - - With the 0.3.1 series, Tor now serves and downloads directory - information in more compact formats, to save on bandwidth overhead. It - also contains a new padding system to resist netflow-based traffic - analysis, and experimental support for building parts of Tor in Rust - (though no parts of Tor are in Rust yet). There are also numerous - small features, bugfixes on earlier release series, and groundwork for - the hidden services revamp of 0.3.2. - - This release also includes a fix for TROVE-2017-008, a security bug - that affects hidden services running with the SafeLogging option - disabled. For more information, see - https://trac.torproject.org/projects/tor/ticket/23490 - - Per our stable release policy, we plan to support each stable release - series for at least the next nine months, or for three months after - the first stable release of the next series: whichever is longer. If - you need a release with long-term support, we recommend that you stay - with the 0.2.9 series. - - Below is a list of the changes since 0.3.1.6-rc. For a list of all - changes since 0.3.0, see the ReleaseNotes file. - - o Major bugfixes (security, hidden services, loggging): - - Fix a bug where we could log uninitialized stack when a certain - hidden service error occurred while SafeLogging was disabled. - Fixes bug #23490; bugfix on 0.2.7.2-alpha. This is also tracked as - TROVE-2017-008 and CVE-2017-0380. - - o Minor features (defensive programming): - - Create a pair of consensus parameters, nf_pad_tor2web and - nf_pad_single_onion, to disable netflow padding in the consensus - for non-anonymous connections in case the overhead is high. Closes - ticket 17857. - - o Minor features (diagnostic): - - Add a stack trace to the bug warnings that can be logged when - trying to send an outgoing relay cell with n_chan == 0. Diagnostic - attempt for bug 23105. - - o Minor features (geoip): - - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation): - - Avoid compiler warnings in the unit tests for calling tor_sscanf() - with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha. - - o Minor bugfixes (controller): - - Do not crash when receiving a HSPOST command with an empty body. - Fixes part of bug 22644; bugfix on 0.2.7.1-alpha. - - Do not crash when receiving a POSTDESCRIPTOR command with an empty - body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha. - - o Minor bugfixes (relay): - - Inform the geoip and rephist modules about all requests, even on - relays that are only fetching microdescriptors. Fixes a bug - related to 21585; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (unit tests): - - Fix a channelpadding unit test failure on slow systems by using - mocked time instead of actual time. Fixes bug 23077; bugfix - on 0.3.1.1-alpha. - - -Changes in version 0.3.1.6-rc - 2017-09-05 - Tor 0.3.1.6-rc fixes a few small bugs and annoyances in the 0.3.1 - release series, including a bug that produced weird behavior on - Windows directory caches. - - This is the first release candidate in the Tor 0.3.1 series. If we - find no new bugs or regressions here, the first stable 0.3.1 release - will be nearly identical to it. - - o Major bugfixes (windows, directory cache): - - On Windows, do not try to delete cached consensus documents and - diffs before they are unmapped from memory--Windows won't allow - that. Instead, allow the consensus cache directory to grow larger, - to hold files that might need to stay around longer. Fixes bug - 22752; bugfix on 0.3.1.1-alpha. - - o Minor features (directory authority): - - Improve the message that authorities report to relays that present - RSA/Ed25519 keypairs that conflict with previously pinned keys. - Closes ticket 22348. - - o Minor features (geoip): - - Update geoip and geoip6 to the August 3 2017 Maxmind GeoLite2 - Country database. - - o Minor features (testing): - - Add more tests for compression backend initialization. Closes - ticket 22286. - - o Minor bugfixes (directory cache): - - Fix a memory leak when recovering space in the consensus cache. - Fixes bug 23139; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (hidden service): - - Increase the number of circuits that a service is allowed to - open over a specific period of time. The value was lower than it - should be (8 vs 12) in the normal case of 3 introduction points. - Fixes bug 22159; bugfix on 0.3.0.5-rc. - - Fix a BUG warning during HSv3 descriptor decoding that could be - cause by a specially crafted descriptor. Fixes bug 23233; bugfix - on 0.3.0.1-alpha. Bug found by "haxxpop". - - Rate-limit the log messages if we exceed the maximum number of - allowed intro circuits. Fixes bug 22159; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (logging, relay): - - Remove a forgotten debugging message when an introduction point - successfully establishes a hidden service prop224 circuit with - a client. - - Change three other log_warn() for an introduction point to - protocol warnings, because they can be failure from the network - and are not relevant to the operator. Fixes bug 23078; bugfix on - 0.3.0.1-alpha and 0.3.0.2-alpha. - - o Minor bugfixes (relay): - - When a relay is not running as a directory cache, it will no - longer generate compressed consensuses and consensus diff - information. Previously, this was a waste of disk and CPU. Fixes - bug 23275; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (robustness, error handling): - - Improve our handling of the cases where OpenSSL encounters a - memory error while encoding keys and certificates. We haven't - observed these errors in the wild, but if they do happen, we now - detect and respond better. Fixes bug 19418; bugfix on all versions - of Tor. Reported by Guido Vranken. - - o Minor bugfixes (stability): - - Avoid crashing on a double-free when unable to load or process an - included file. Fixes bug 23155; bugfix on 0.3.1.1-alpha. Found - with the clang static analyzer. - - o Minor bugfixes (testing): - - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291; - bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij. - - Port the hs_ntor handshake test to work correctly with recent - versions of the pysha3 module. Fixes bug 23071; bugfix - on 0.3.1.1-alpha. - - o Minor bugfixes (Windows service): - - When running as a Windows service, set the ID of the main thread - correctly. Failure to do so made us fail to send log messages to - the controller in 0.2.1.16-rc, slowed down controller event - delivery in 0.2.7.3-rc and later, and crash with an assertion - failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha. - Patch and diagnosis from "Vort". - - -Changes in version 0.3.0.10 - 2017-08-02 - Tor 0.3.0.10 backports a collection of small-to-medium bugfixes - from the current Tor alpha series. OpenBSD users and TPROXY users - should upgrade; others are probably okay sticking with 0.3.0.9. - - o Major features (build system, continuous integration, backport from 0.3.1.5-alpha): - - Tor's repository now includes a Travis Continuous Integration (CI) - configuration file (.travis.yml). This is meant to help new - developers and contributors who fork Tor to a Github repository be - better able to test their changes, and understand what we expect - to pass. To use this new build feature, you must fork Tor to your - Github account, then go into the "Integrations" menu in the - repository settings for your fork and enable Travis, then push - your changes. Closes ticket 22636. - - o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha): - - Fix a typo that had prevented TPROXY-based transparent proxying - from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha. - Patch from "d4fq0fQAgoJ". - - o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha): - - Avoid an assertion failure bug affecting our implementation of - inet_pton(AF_INET6) on certain OpenBSD systems whose strtol() - handling of "0xbar" differs from what we had expected. Fixes bug - 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007. - - o Minor features (backport from 0.3.1.5-alpha): - - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (bandwidth accounting, backport from 0.3.1.2-alpha): - - Roll over monthly accounting at the configured hour and minute, - rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1. - Found by Andrey Karpov with PVS-Studio. - - o Minor bugfixes (compilation warnings, backport from 0.3.1.5-alpha): - - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915; - bugfix on 0.2.8.1-alpha. - - Fix warnings when building with libscrypt and openssl scrypt - support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha. - - When building with certain versions of the mingw C header files, - avoid float-conversion warnings when calling the C functions - isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix - on 0.2.8.1-alpha. - - o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha): - - Backport a fix for an "unused variable" warning that appeared - in some versions of mingw. Fixes bug 22838; bugfix on - 0.2.8.1-alpha. - - o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha): - - Avoid Coverity build warnings related to our BUG() macro. By - default, Coverity treats BUG() as the Linux kernel does: an - instant abort(). We need to override that so our BUG() macro - doesn't prevent Coverity from analyzing functions that use it. - Fixes bug 23030; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (directory authority, backport from 0.3.1.1-alpha): - - When rejecting a router descriptor for running an obsolete version - of Tor without ntor support, warn about the obsolete tor version, - not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha. - - o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha): - - Avoid a sandbox failure when trying to re-bind to a socket and - mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha. - - o Minor bugfixes (unit tests, backport from 0.3.1.5-alpha) - - Fix a memory leak in the link-handshake/certs_ok_ed25519 test. - Fixes bug 22803; bugfix on 0.3.0.1-alpha. - - -Changes in version 0.3.1.5-alpha - 2017-08-01 - Tor 0.3.1.5-alpha improves the performance of consensus diff - calculation, fixes a crash bug on older versions of OpenBSD, and fixes - several other bugs. If no serious bugs are found in this version, the - next version will be a release candidate. - - This release also marks the end of support for the Tor 0.2.4.x, - 0.2.6.x, and 0.2.7.x release series. Those releases will receive no - further bug or security fixes. Anyone still running or distributing - one of those versions should upgrade. - - o Major features (build system, continuous integration): - - Tor's repository now includes a Travis Continuous Integration (CI) - configuration file (.travis.yml). This is meant to help new - developers and contributors who fork Tor to a Github repository be - better able to test their changes, and understand what we expect - to pass. To use this new build feature, you must fork Tor to your - Github account, then go into the "Integrations" menu in the - repository settings for your fork and enable Travis, then push - your changes. Closes ticket 22636. - - o Major bugfixes (openbsd, denial-of-service): - - Avoid an assertion failure bug affecting our implementation of - inet_pton(AF_INET6) on certain OpenBSD systems whose strtol() - handling of "0xbar" differs from what we had expected. Fixes bug - 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007. - - o Major bugfixes (relay, performance): - - Perform circuit handshake operations at a higher priority than we - use for consensus diff creation and compression. This should - prevent circuits from starving when a relay or bridge receives a - new consensus, especially on lower-powered machines. Fixes bug - 22883; bugfix on 0.3.1.1-alpha. - - o Minor features (bridge authority): - - Add "fingerprint" lines to the networkstatus-bridges file produced - by bridge authorities. Closes ticket 22207. - - o Minor features (directory cache, consensus diff): - - Add a new MaxConsensusAgeForDiffs option to allow directory cache - operators with low-resource environments to adjust the number of - consensuses they'll store and generate diffs from. Most cache - operators should leave it unchanged. Helps to work around - bug 22883. - - o Minor features (geoip): - - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2 - Country database. - - o Minor features (relay, performance): - - Always start relays with at least two worker threads, to prevent - priority inversion on slow tasks. Part of the fix for bug 22883. - - Allow background work to be queued with different priorities, so - that a big pile of slow low-priority jobs will not starve out - higher priority jobs. This lays the groundwork for a fix for - bug 22883. - - o Minor bugfixes (build system, rust): - - Fix a problem where Rust toolchains were not being found when - building without --enable-cargo-online-mode, due to setting the - $HOME environment variable instead of $CARGO_HOME. Fixes bug - 22830; bugfix on 0.3.1.1-alpha. Fix by Chelsea Komlo. - - o Minor bugfixes (compatibility, zstd): - - Write zstd epilogues correctly when the epilogue requires - reallocation of the output buffer, even with zstd 1.3.0. - (Previously, we worked on 1.2.0 and failed with 1.3.0). Fixes bug - 22927; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (compilation warnings): - - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug - 22915; bugfix on 0.2.8.1-alpha. - - Fix warnings when building with libscrypt and openssl scrypt - support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha. - - Compile correctly when both openssl 1.1.0 and libscrypt are - detected. Previously this would cause an error. Fixes bug 22892; - bugfix on 0.3.1.1-alpha. - - When building with certain versions of the mingw C header files, - avoid float-conversion warnings when calling the C functions - isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix - on 0.2.8.1-alpha. - - o Minor bugfixes (coverity build support): - - Avoid Coverity build warnings related to our BUG() macro. By - default, Coverity treats BUG() as the Linux kernel does: an - instant abort(). We need to override that so our BUG() macro - doesn't prevent Coverity from analyzing functions that use it. - Fixes bug 23030; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (directory authority): - - When a directory authority rejects a descriptor or extrainfo with - a given digest, mark that digest as undownloadable, so that we do - not attempt to download it again over and over. We previously - tried to avoid downloading such descriptors by other means, but we - didn't notice if we accidentally downloaded one anyway. This - behavior became problematic in 0.2.7.2-alpha, when authorities - began pinning Ed25519 keys. Fixes bug 22349; bugfix - on 0.2.1.19-alpha. - - o Minor bugfixes (error reporting, windows): - - When formatting Windows error messages, use the English format to - avoid codepage issues. Fixes bug 22520; bugfix on 0.1.2.8-alpha. - Patch from "Vort". - - o Minor bugfixes (file limits, osx): - - When setting the maximum number of connections allowed by the OS, - always allow some extra file descriptors for other files. Fixes - bug 22797; bugfix on 0.2.0.10-alpha. - - o Minor bugfixes (linux seccomp2 sandbox): - - Avoid a sandbox failure when trying to re-bind to a socket and - mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha. - - o Minor bugfixes (memory leaks): - - Fix a small memory leak when validating a configuration that uses - two or more AF_UNIX sockets for the same port type. Fixes bug - 23053; bugfix on 0.2.6.3-alpha. This is CID 1415725. - - o Minor bugfixes (unit tests): - - test_consdiff_base64cmp would fail on OS X because while OS X - follows the standard of (less than zero/zero/greater than zero), - it doesn't follow the convention of (-1/0/+1). Make the test - comply with the standard. Fixes bug 22870; bugfix on 0.3.1.1-alpha. - - Fix a memory leak in the link-handshake/certs_ok_ed25519 test. - Fixes bug 22803; bugfix on 0.3.0.1-alpha. - - -Changes in version 0.3.1.4-alpha - 2017-06-29 - Tor 0.3.1.4-alpha fixes a path selection bug that would allow a client - to use a guard that was in the same network family as a chosen exit - relay. This is a security regression; all clients running earlier - versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9 - or 0.3.1.4-alpha. - - This release also fixes several other bugs introduced in 0.3.0.x - and 0.3.1.x, including others that can affect bandwidth usage - and correctness. - - o New dependencies: - - To build with zstd and lzma support, Tor now requires the - pkg-config tool at build time. (This requirement was new in - 0.3.1.1-alpha, but was not noted at the time. Noting it here to - close ticket 22623.) - - o Major bugfixes (path selection, security): - - When choosing which guard to use for a circuit, avoid the exit's - family along with the exit itself. Previously, the new guard - selection logic avoided the exit, but did not consider its family. - Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017- - 006 and CVE-2017-0377. - - o Major bugfixes (compression, zstd): - - Correctly detect a full buffer when decompressing a large zstd- - compressed input. Previously, we would sometimes treat a full - buffer as an error. Fixes bug 22628; bugfix on 0.3.1.1-alpha. - - o Major bugfixes (directory protocol): - - Ensure that we send "304 Not modified" as HTTP status code when a - client is attempting to fetch a consensus or consensus diff, and - the best one we can send them is one they already have. Fixes bug - 22702; bugfix on 0.3.1.1-alpha. - - o Major bugfixes (entry guards): - - When starting with an old consensus, do not add new entry guards - unless the consensus is "reasonably live" (under 1 day old). Fixes - one root cause of bug 22400; bugfix on 0.3.0.1-alpha. - - o Minor features (bug mitigation, diagnostics, logging): - - Avoid an assertion failure, and log a better error message, when - unable to remove a file from the consensus cache on Windows. - Attempts to mitigate and diagnose bug 22752. - - o Minor features (geoip): - - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compression): - - When compressing or decompressing a buffer, check for a failure to - create a compression object. Fixes bug 22626; bugfix - on 0.3.1.1-alpha. - - When decompressing a buffer, check for extra data after the end of - the compressed data. Fixes bug 22629; bugfix on 0.3.1.1-alpha. - - When decompressing an object received over an anonymous directory - connection, if we have already decompressed it using an acceptable - compression method, do not reject it for looking like an - unacceptable compression method. Fixes part of bug 22670; bugfix - on 0.3.1.1-alpha. - - When serving directory votes compressed with zlib, do not claim to - have compressed them with zstd. Fixes bug 22669; bugfix - on 0.3.1.1-alpha. - - When spooling compressed data to an output buffer, don't try to - spool more data when there is no more data to spool and we are not - trying to flush the input. Previously, we would sometimes launch - compression requests with nothing to do, which interferes with our - 22672 checks. Fixes bug 22719; bugfix on 0.2.0.16-alpha. - - o Minor bugfixes (defensive programming): - - Detect and break out of infinite loops in our compression code. We - don't think that any such loops exist now, but it's best to be - safe. Closes ticket 22672. - - Fix a memset() off the end of an array when packing cells. This - bug should be harmless in practice, since the corrupted bytes are - still in the same structure, and are always padding bytes, - ignored, or immediately overwritten, depending on compiler - behavior. Nevertheless, because the memset()'s purpose is to make - sure that any other cell-handling bugs can't expose bytes to the - network, we need to fix it. Fixes bug 22737; bugfix on - 0.2.4.11-alpha. Fixes CID 1401591. - - o Minor bugfixes (linux seccomp2 sandbox): - - Permit the fchmod system call, to avoid crashing on startup when - starting with the seccomp2 sandbox and an unexpected set of - permissions on the data directory or its contents. Fixes bug - 22516; bugfix on 0.2.5.4-alpha. - - Fix a crash in the LZMA module, when the sandbox was enabled, and - liblzma would allocate more than 16 MB of memory. We solve this by - bumping the mprotect() limit in the sandbox module from 16 MB to - 20 MB. Fixes bug 22751; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (logging): - - When decompressing, do not warn if we fail to decompress using a - compression method that we merely guessed. Fixes part of bug - 22670; bugfix on 0.1.1.14-alpha. - - When decompressing, treat mismatch between content-encoding and - actual compression type as a protocol warning. Fixes part of bug - 22670; bugfix on 0.1.1.9-alpha. - - Downgrade "assigned_to_cpuworker failed" message to info-level - severity. In every case that can reach it, either a better warning - has already been logged, or no warning is warranted. Fixes bug - 22356; bugfix on 0.2.6.3-alpha. - - Demote a warn that was caused by libevent delays to info if - netflow padding is less than 4.5 seconds late, or to notice - if it is more (4.5 seconds is the amount of time that a netflow - record might be emitted after, if we chose the maximum timeout). - Fixes bug 22212; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (process behavior): - - When exiting because of an error, always exit with a nonzero exit - status. Previously, we would fail to report an error in our exit - status in cases related to __OwningControllerProcess failure, - lockfile contention, and Ed25519 key initialization. Fixes bug - 22720; bugfix on versions 0.2.1.6-alpha, 0.2.2.28-beta, and - 0.2.7.2-alpha respectively. Reported by "f55jwk4f"; patch - from "huyvq". - - o Documentation: - - Add a manpage description for the key-pinning-journal file. Closes - ticket 22347. - - Correctly note that bandwidth accounting values are stored in the - state file, and the bw_accounting file is now obsolete. Closes - ticket 16082. - - Document more of the files in the Tor data directory, including - cached-extrainfo, secret_onion_key{,_ntor}.old, hidserv-stats, - approved-routers, sr-random, and diff-cache. Found while fixing - ticket 22347. - - -Changes in version 0.3.0.9 - 2017-06-29 - Tor 0.3.0.9 fixes a path selection bug that would allow a client - to use a guard that was in the same network family as a chosen exit - relay. This is a security regression; all clients running earlier - versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9 or - 0.3.1.4-alpha. - - This release also backports several other bugfixes from the 0.3.1.x - series. - - o Major bugfixes (path selection, security, backport from 0.3.1.4-alpha): - - When choosing which guard to use for a circuit, avoid the exit's - family along with the exit itself. Previously, the new guard - selection logic avoided the exit, but did not consider its family. - Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017- - 006 and CVE-2017-0377. - - o Major bugfixes (entry guards, backport from 0.3.1.1-alpha): - - Don't block bootstrapping when a primary bridge is offline and we - can't get its descriptor. Fixes bug 22325; fixes one case of bug - 21969; bugfix on 0.3.0.3-alpha. - - o Major bugfixes (entry guards, backport from 0.3.1.4-alpha): - - When starting with an old consensus, do not add new entry guards - unless the consensus is "reasonably live" (under 1 day old). Fixes - one root cause of bug 22400; bugfix on 0.3.0.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha): - - Reject version numbers with non-numeric prefixes (such as +, -, or - whitespace). Disallowing whitespace prevents differential version - parsing between POSIX-based and Windows platforms. Fixes bug 21507 - and part of 21508; bugfix on 0.0.8pre1. - - o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha): - - Permit the fchmod system call, to avoid crashing on startup when - starting with the seccomp2 sandbox and an unexpected set of - permissions on the data directory or its contents. Fixes bug - 22516; bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (defensive programming, backport from 0.3.1.4-alpha): - - Fix a memset() off the end of an array when packing cells. This - bug should be harmless in practice, since the corrupted bytes are - still in the same structure, and are always padding bytes, - ignored, or immediately overwritten, depending on compiler - behavior. Nevertheless, because the memset()'s purpose is to make - sure that any other cell-handling bugs can't expose bytes to the - network, we need to fix it. Fixes bug 22737; bugfix on - 0.2.4.11-alpha. Fixes CID 1401591. - - -Changes in version 0.3.1.3-alpha - 2017-06-08 - Tor 0.3.1.3-alpha fixes a pair of bugs that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-004 and TROVE-2017-005. - - Tor 0.3.1.3-alpha also includes fixes for several key management bugs - that sometimes made relays unreliable, as well as several other - bugfixes described below. - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure when a hidden service - handles a malformed BEGIN cell. Fixes bug 22493, tracked as - TROVE-2017-004 and as CVE-2017-0375; bugfix on 0.3.0.1-alpha. - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Major bugfixes (relay, link handshake): - - When performing the v3 link handshake on a TLS connection, report - that we have the x509 certificate that we actually used on that - connection, even if we have changed certificates since that - connection was first opened. Previously, we would claim to have - used our most recent x509 link certificate, which would sometimes - make the link handshake fail. Fixes one case of bug 22460; bugfix - on 0.2.3.6-alpha. - - o Major bugfixes (relays, key management): - - Regenerate link and authentication certificates whenever the key - that signs them changes; also, regenerate link certificates - whenever the signed key changes. Previously, these processes were - only weakly coupled, and we relays could (for minutes to hours) - wind up with an inconsistent set of keys and certificates, which - other relays would not accept. Fixes two cases of bug 22460; - bugfix on 0.3.0.1-alpha. - - When sending an Ed25519 signing->link certificate in a CERTS cell, - send the certificate that matches the x509 certificate that we - used on the TLS connection. Previously, there was a race condition - if the TLS context rotated after we began the TLS handshake but - before we sent the CERTS cell. Fixes a case of bug 22460; bugfix - on 0.3.0.1-alpha. - - o Major bugfixes (torrc, crash): - - Fix a crash bug when using %include in torrc. Fixes bug 22417; - bugfix on 0.3.1.1-alpha. Patch by Daniel Pinto. - - o Minor features (code style): - - Add "Falls through" comments to our codebase, in order to silence - GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas - Stieger. Closes ticket 22446. - - o Minor features (diagnostic): - - Add logging messages to try to diagnose a rare bug that seems to - generate RSA->Ed25519 cross-certificates dated in the 1970s. We - think this is happening because of incorrect system clocks, but - we'd like to know for certain. Diagnostic for bug 22466. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - - o Minor bugfixes (directory protocol): - - Check for libzstd >= 1.1, because older versions lack the - necessary streaming API. Fixes bug 22413; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (link handshake): - - Lower the lifetime of the RSA->Ed25519 cross-certificate to six - months, and regenerate it when it is within one month of expiring. - Previously, we had generated this certificate at startup with a - ten-year lifetime, but that could lead to weird behavior when Tor - was started with a grossly inaccurate clock. Mitigates bug 22466; - mitigation on 0.3.0.1-alpha. - - o Minor bugfixes (storage directories): - - Always check for underflows in the cached storage directory usage. - If the usage does underflow, re-calculate it. Also, avoid a - separate underflow when the usage is not known. Fixes bug 22424; - bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (unit tests): - - The unit tests now pass on systems where localhost is misconfigured - to some IPv4 address other than 127.0.0.1. Fixes bug 6298; bugfix - on 0.0.9pre2. - - o Documentation: - - Clarify the manpage for the (deprecated) torify script. Closes - ticket 6892. - -Changes in version 0.3.0.8 - 2017-06-08 - Tor 0.3.0.8 fixes a pair of bugs that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-004 and TROVE-2017-005. - - Tor 0.3.0.8 also includes fixes for several key management bugs - that sometimes made relays unreliable, as well as several other - bugfixes described below. - - o Major bugfixes (hidden service, relay, security, backport - from 0.3.1.3-alpha): - - Fix a remotely triggerable assertion failure when a hidden service - handles a malformed BEGIN cell. Fixes bug 22493, tracked as - TROVE-2017-004 and as CVE-2017-0375; bugfix on 0.3.0.1-alpha. - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Major bugfixes (relay, link handshake, backport from 0.3.1.3-alpha): - - When performing the v3 link handshake on a TLS connection, report - that we have the x509 certificate that we actually used on that - connection, even if we have changed certificates since that - connection was first opened. Previously, we would claim to have - used our most recent x509 link certificate, which would sometimes - make the link handshake fail. Fixes one case of bug 22460; bugfix - on 0.2.3.6-alpha. - - o Major bugfixes (relays, key management, backport from 0.3.1.3-alpha): - - Regenerate link and authentication certificates whenever the key - that signs them changes; also, regenerate link certificates - whenever the signed key changes. Previously, these processes were - only weakly coupled, and we relays could (for minutes to hours) - wind up with an inconsistent set of keys and certificates, which - other relays would not accept. Fixes two cases of bug 22460; - bugfix on 0.3.0.1-alpha. - - When sending an Ed25519 signing->link certificate in a CERTS cell, - send the certificate that matches the x509 certificate that we - used on the TLS connection. Previously, there was a race condition - if the TLS context rotated after we began the TLS handshake but - before we sent the CERTS cell. Fixes a case of bug 22460; bugfix - on 0.3.0.1-alpha. - - o Major bugfixes (hidden service v3, backport from 0.3.1.1-alpha): - - Stop rejecting v3 hidden service descriptors because their size - did not match an old padding rule. Fixes bug 22447; bugfix on - tor-0.3.0.1-alpha. - - o Minor features (fallback directory list, backport from 0.3.1.3-alpha): - - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in - December 2016 (of which ~126 were still functional) with a list of - 151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May - 2017. Resolves ticket 21564. - - o Minor bugfixes (configuration, backport from 0.3.1.1-alpha): - - Do not crash when starting with LearnCircuitBuildTimeout 0. Fixes - bug 22252; bugfix on 0.2.9.3-alpha. - - o Minor bugfixes (correctness, backport from 0.3.1.3-alpha): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - - o Minor bugfixes (link handshake, backport from 0.3.1.3-alpha): - - Lower the lifetime of the RSA->Ed25519 cross-certificate to six - months, and regenerate it when it is within one month of expiring. - Previously, we had generated this certificate at startup with a - ten-year lifetime, but that could lead to weird behavior when Tor - was started with a grossly inaccurate clock. Mitigates bug 22466; - mitigation on 0.3.0.1-alpha. - - o Minor bugfixes (memory leak, directory authority, backport from - 0.3.1.2-alpha): - - When directory authorities reject a router descriptor due to - keypinning, free the router descriptor rather than leaking the - memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha. - - -Changes in version 0.2.9.11 - 2017-06-08 - Tor 0.2.9.11 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - Tor 0.2.9.11 also backports fixes for several key management bugs - that sometimes made relays unreliable, as well as several other - bugfixes described below. - - o Major bugfixes (hidden service, relay, security, backport - from 0.3.1.3-alpha): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Major bugfixes (relay, link handshake, backport from 0.3.1.3-alpha): - - When performing the v3 link handshake on a TLS connection, report - that we have the x509 certificate that we actually used on that - connection, even if we have changed certificates since that - connection was first opened. Previously, we would claim to have - used our most recent x509 link certificate, which would sometimes - make the link handshake fail. Fixes one case of bug 22460; bugfix - on 0.2.3.6-alpha. - - o Minor features (fallback directory list, backport from 0.3.1.3-alpha): - - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in - December 2016 (of which ~126 were still functional) with a list of - 151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May - 2017. Resolves ticket 21564. - - o Minor features (future-proofing, backport from 0.3.0.7): - - Tor no longer refuses to download microdescriptors or descriptors if - they are listed as "published in the future". This change will - eventually allow us to stop listing meaningful "published" dates - in microdescriptor consensuses, and thereby allow us to reduce the - resources required to download consensus diffs by over 50%. - Implements part of ticket 21642; implements part of proposal 275. - - o Minor features (directory authorities, backport from 0.3.0.4-rc) - - Directory authorities now reject relays running versions - 0.2.9.1-alpha through 0.2.9.4-alpha, because those relays - suffer from bug 20499 and don't keep their consensus cache - up-to-date. Resolves ticket 20509. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (control port, backport from 0.3.0.6): - - The GETINFO extra-info/digest/ command was broken because - of a wrong base16 decode return value check, introduced when - refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (correctness, backport from 0.3.1.3-alpha): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - - o Minor bugfixes (Linux seccomp2 sandbox, backport from 0.3.0.7): - - The getpid() system call is now permitted under the Linux seccomp2 - sandbox, to avoid crashing with versions of OpenSSL (and other - libraries) that attempt to learn the process's PID by using the - syscall rather than the VDSO code. Fixes bug 21943; bugfix - on 0.2.5.1-alpha. - - o Minor bugfixes (memory leak, directory authority, backport - from 0.3.1.2-alpha): - - When directory authorities reject a router descriptor due to - keypinning, free the router descriptor rather than leaking the - memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha. - -Changes in version 0.2.8.14 - 2017-06-08 - Tor 0.2.7.8 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor features (fallback directory list, backport from 0.3.1.3-alpha): - - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in - December 2016 (of which ~126 were still functional) with a list of - 151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May - 2017. Resolves ticket 21564. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - -Changes in version 0.2.7.8 - 2017-06-08 - Tor 0.2.7.8 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - - -Changes in version 0.2.6.12 - 2017-06-08 - Tor 0.2.6.12 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - -Changes in version 0.2.5.14 - 2017-06-08 - Tor 0.2.5.14 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - -Changes in version 0.2.4.29 - 2017-06-08 - Tor 0.2.4.29 backports a fix for a bug that would allow an attacker to - remotely crash a hidden service with an assertion failure. Anyone - running a hidden service should upgrade to this version, or to some - other version with fixes for TROVE-2017-005. (Versions before 0.3.0 - are not affected by TROVE-2017-004.) - - o Major bugfixes (hidden service, relay, security): - - Fix a remotely triggerable assertion failure caused by receiving a - BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug - 22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix - on 0.2.2.1-alpha. - - o Minor features (geoip): - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (correctness): - - Avoid undefined behavior when parsing IPv6 entries from the geoip6 - file. Fixes bug 22490; bugfix on 0.2.4.6-alpha. - - -Changes in version 0.3.1.2-alpha - 2017-05-26 - Tor 0.3.1.2-alpha is the second release in the 0.3.1.x series. It - fixes a few bugs found while testing 0.3.1.1-alpha, including a - memory corruption bug that affected relay stability. - - o Major bugfixes (crash, relay): - - Fix a memory-corruption bug in relays that set MyFamily. - Previously, they would double-free MyFamily elements when making - the next descriptor or when changing their configuration. Fixes - bug 22368; bugfix on 0.3.1.1-alpha. - - o Minor bugfixes (logging): - - Log a better message when a directory authority replies to an - upload with an unexpected status code. Fixes bug 11121; bugfix - on 0.1.0.1-rc. - - o Minor bugfixes (memory leak, directory authority): - - When directory authorities reject a router descriptor due to - keypinning, free the router descriptor rather than leaking the - memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha. - - -Changes in version 0.3.1.1-alpha - 2017-05-22 - Tor 0.3.1.1-alpha is the first release in the 0.3.1.x series. It - reduces the bandwidth usage for Tor's directory protocol, adds some - basic padding to resist netflow-based traffic analysis and to serve as - the basis of other padding in the future, and adds rust support to the - build system. - - It also contains numerous other small features and improvements to - security, correctness, and performance. - - Below are the changes since 0.3.0.7. - - o Major features (directory protocol): - - Tor relays and authorities can now serve clients an abbreviated - version of the consensus document, containing only the changes - since an older consensus document that the client holds. Clients - now request these documents when available. When both client and - server use this new protocol, they will use far less bandwidth (up - to 94% less) to keep the client's consensus up-to-date. Implements - proposal 140; closes ticket 13339. Based on work by Daniel Martí. - - Tor can now compress directory traffic with lzma or with zstd - compression algorithms, which can deliver better bandwidth - performance. Because lzma is computationally expensive, it's only - used for documents that can be compressed once and served many - times. Support for these algorithms requires that tor is built - with the libzstd and/or liblzma libraries available. Implements - proposal 278; closes ticket 21662. - - Relays now perform the more expensive compression operations, and - consensus diff generation, in worker threads. This separation - avoids delaying the main thread when a new consensus arrives. - - o Major features (experimental): - - Tor can now build modules written in Rust. To turn this on, pass - the "--enable-rust" flag to the configure script. It's not time to - get excited yet: currently, there is no actual Rust functionality - beyond some simple glue code, and a notice at startup to tell you - that Rust is running. Still, we hope that programmers and - packagers will try building Tor with Rust support, so that we can - find issues and solve portability problems. Closes ticket 22106. - - o Major features (traffic analysis resistance): - - Connections between clients and relays now send a padding cell in - each direction every 1.5 to 9.5 seconds (tunable via consensus - parameters). This padding will not resist specialized - eavesdroppers, but it should be enough to make many ISPs' routine - network flow logging less useful in traffic analysis against - Tor users. - - Padding is negotiated using Tor's link protocol, so both relays - and clients must upgrade for this to take effect. Clients may - still send padding despite the relay's version by setting - ConnectionPadding 1 in torrc, and may disable padding by setting - ConnectionPadding 0 in torrc. Padding may be minimized for mobile - users with the torrc option ReducedConnectionPadding. Implements - Proposal 251 and Section 2 of Proposal 254; closes ticket 16861. - - Relays will publish 24 hour totals of padding and non-padding cell - counts to their extra-info descriptors, unless PaddingStatistics 0 - is set in torrc. These 24 hour totals are also rounded to - multiples of 10000. - - o Major bugfixes (connection usage): - - We use NETINFO cells to try to determine if both relays involved - in a connection will agree on the canonical status of that - connection. We prefer the connections where this is the case for - extend cells, and try to close connections where relays disagree - on their canonical status early. Also, we now prefer the oldest - valid connection for extend cells. These two changes should reduce - the number of long-term connections that are kept open between - relays. Fixes bug 17604; bugfix on 0.2.5.5-alpha. - - Relays now log hourly statistics (look for - "channel_check_for_duplicates" lines) on the total number of - connections to other relays. If the number of connections per - relay is unexpectedly large, this log message is at notice level. - Otherwise it is at info. - - o Major bugfixes (entry guards): - - Don't block bootstrapping when a primary bridge is offline and we - can't get its descriptor. Fixes bug 22325; fixes one case of bug - 21969; bugfix on 0.3.0.3-alpha. - - o Major bugfixes (linux TPROXY support): - - Fix a typo that had prevented TPROXY-based transparent proxying - from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha. - Patch from "d4fq0fQAgoJ". - - o Minor features (security, windows): - - Enable a couple of pieces of Windows hardening: one - (HeapEnableTerminationOnCorruption) that has been on-by-default - since Windows 8, and unavailable before Windows 7; and one - (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't - affect us, but shouldn't do any harm. Closes ticket 21953. - - o Minor features (config options): - - Allow "%include" directives in torrc configuration files. These - directives import the settings from other files, or from all the - files in a directory. Closes ticket 1922. Code by Daniel Pinto. - - Make SAVECONF return an error when overwriting a torrc that has - includes. Using SAVECONF with the FORCE option will allow it to - overwrite torrc even if includes are used. Related to ticket 1922. - - Add "GETINFO config-can-saveconf" to tell controllers if SAVECONF - will work without the FORCE option. Related to ticket 1922. - - o Minor features (controller): - - Warn the first time that a controller requests data in the long- - deprecated 'GETINFO network-status' format. Closes ticket 21703. - - o Minor features (defaults): - - The default value for UseCreateFast is now 0: clients which - haven't yet received a consensus document will now use a proper - ntor handshake to talk to their directory servers whenever they - can. Closes ticket 21407. - - Onion key rotation and expiry intervals are now defined as a - network consensus parameter, per proposal 274. The default - lifetime of an onion key is increased from 7 to 28 days. Old onion - keys will expire after 7 days by default. This change will make - consensus diffs much smaller, and save significant bandwidth. - Closes ticket 21641. - - o Minor features (fallback directory list): - - Update the fallback directory mirror whitelist and blacklist based - on operator emails. Closes task 21121. - - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in - December 2016 (of which ~126 were still functional) with a list of - 151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May - 2017. Resolves ticket 21564. - - o Minor features (hidden services, logging): - - Log a message when a hidden service descriptor has fewer - introduction points than specified in - HiddenServiceNumIntroductionPoints. Closes tickets 21598. - - Log a message when a hidden service reaches its introduction point - circuit limit, and when that limit is reset. Follow up to ticket - 21594; closes ticket 21622. - - Warn user if multiple entries in EntryNodes and at least one - HiddenService are used together. Pinning EntryNodes along with a - hidden service can be possibly harmful; for instance see ticket - 14917 or 21155. Closes ticket 21155. - - o Minor features (linux seccomp2 sandbox): - - We now have a document storage backend compatible with the Linux - seccomp2 sandbox. This backend is used for consensus documents and - diffs between them; in the long term, we'd like to use it for - unparseable directory material too. Closes ticket 21645 - - Increase the maximum allowed size passed to mprotect(PROT_WRITE) - from 1MB to 16MB. This was necessary with the glibc allocator in - order to allow worker threads to allocate more memory -- which in - turn is necessary because of our new use of worker threads for - compression. Closes ticket 22096. - - o Minor features (logging): - - Log files are no longer created world-readable by default. - (Previously, most distributors would store the logs in a non- - world-readable location to prevent inappropriate access. This - change is an extra precaution.) Closes ticket 21729; patch - from toralf. - - o Minor features (performance): - - Our Keccak (SHA-3) implementation now accesses memory more - efficiently, especially on little-endian systems. Closes - ticket 21737. - - Add an O(1) implementation of channel_find_by_global_id(), to - speed some controller functions. - - o Minor features (relay, configuration): - - The MyFamily option may now be repeated as many times as desired, - for relays that want to configure large families. Closes ticket - 4998; patch by Daniel Pinto. - - o Minor features (safety): - - Add an explicit check to extrainfo_parse_entry_from_string() for - NULL inputs. We don't believe this can actually happen, but it may - help silence a warning from the Clang analyzer. Closes - ticket 21496. - - o Minor features (testing): - - Add a "--disable-memory-sentinels" feature to help with fuzzing. - When Tor is compiled with this option, we disable a number of - redundant memory-safety failsafes that are intended to stop bugs - from becoming security issues. This makes it easier to hunt for - bugs that would be security issues without the failsafes turned - on. Closes ticket 21439. - - Add a general event-tracing instrumentation support to Tor. This - subsystem will enable developers and researchers to add fine- - grained instrumentation to their Tor instances, for use when - examining Tor network performance issues. There are no trace - events yet, and event-tracing is off by default unless enabled at - compile time. Implements ticket 13802. - - Improve our version parsing tests: add tests for typical version - components, add tests for invalid versions, including numeric - range and non-numeric prefixes. Unit tests 21278, 21450, and - 21507. Partially implements 21470. - - o Minor bugfixes (bandwidth accounting): - - Roll over monthly accounting at the configured hour and minute, - rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1. - Found by Andrey Karpov with PVS-Studio. - - o Minor bugfixes (code correctness): - - Accurately identify client connections by their lack of peer - authentication. This means that we bail out earlier if asked to - extend to a client. Follow-up to 21407. Fixes bug 21406; bugfix - on 0.2.4.23. - - o Minor bugfixes (configuration): - - Do not crash when starting with LearnCircuitBuildTimeout 0. Fixes - bug 22252; bugfix on 0.2.9.3-alpha. - - o Minor bugfixes (connection lifespan): - - Allow more control over how long TLS connections are kept open: - unify CircuitIdleTimeout and PredictedPortsRelevanceTime into a - single option called CircuitsAvailableTimeout. Also, allow the - consensus to control the default values for both this preference - and the lifespan of relay-to-relay connections. Fixes bug 17592; - bugfix on 0.2.5.5-alpha. - - Increase the initial circuit build timeout testing frequency, to - help ensure that ReducedConnectionPadding clients finish learning - a timeout before their orconn would expire. The initial testing - rate was set back in the days of TAP and before the Tor Browser - updater, when we had to be much more careful about new clients - making lots of circuits. With this change, a circuit build timeout - is learned in about 15-20 minutes, instead of 100-120 minutes. - - o Minor bugfixes (controller): - - GETINFO onions/current and onions/detached no longer respond with - 551 on empty lists. Fixes bug 21329; bugfix on 0.2.7.1-alpha. - - Trigger HS descriptor events on the control port when the client - fails to pick a hidden service directory for a hidden service. - This can happen if all the hidden service directories are in - ExcludeNodes, or they have all been queried within the last 15 - minutes. Fixes bug 22042; bugfix on 0.2.5.2-alpha. - - o Minor bugfixes (directory authority): - - When rejecting a router descriptor for running an obsolete version - of Tor without ntor support, warn about the obsolete tor version, - not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha. - - Prevent the shared randomness subsystem from asserting when - initialized by a bridge authority with an incomplete configuration - file. Fixes bug 21586; bugfix on 0.2.9.8. - - o Minor bugfixes (exit-side DNS): - - Fix an untriggerable assertion that checked the output of a - libevent DNS error, so that the assertion actually behaves as - expected. Fixes bug 22244; bugfix on 0.2.0.20-rc. Found by Andrey - Karpov using PVS-Studio. - - o Minor bugfixes (fallback directories): - - Make the usage example in updateFallbackDirs.py actually work, and - explain what it does. Fixes bug 22270; bugfix on 0.3.0.3-alpha. - - Decrease the guard flag average required to be a fallback. This - allows us to keep relays that have their guard flag removed when - they restart. Fixes bug 20913; bugfix on 0.2.8.1-alpha. - - Decrease the minimum number of fallbacks to 100. Fixes bug 20913; - bugfix on 0.2.8.1-alpha. - - Make sure fallback directory mirrors have the same address, port, - and relay identity key for at least 30 days before they are - selected. Fixes bug 20913; bugfix on 0.2.8.1-alpha. - - o Minor bugfixes (hidden services): - - Stop printing a cryptic warning when a hidden service gets a - request to connect to a virtual port that it hasn't configured. - Fixes bug 16706; bugfix on 0.2.6.3-alpha. - - Simplify hidden service descriptor creation by using an existing - flag to check if an introduction point is established. Fixes bug - 21599; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (memory leak): - - Fix a small memory leak at exit from the backtrace handler code. - Fixes bug 21788; bugfix on 0.2.5.2-alpha. Patch from Daniel Pinto. - - o Minor bugfixes (protocol, logging): - - Downgrade a log statement about unexpected relay cells from "bug" - to "protocol warning", because there is at least one use case - where it can be triggered by a buggy tor implementation. Fixes bug - 21293; bugfix on 0.1.1.14-alpha. - - o Minor bugfixes (testing): - - Use unbuffered I/O for utility functions around the - process_handle_t type. This fixes unit test failures reported on - OpenBSD and FreeBSD. Fixes bug 21654; bugfix on 0.2.3.1-alpha. - - Make display of captured unit test log messages consistent. Fixes - bug 21510; bugfix on 0.2.9.3-alpha. - - Make test-network.sh always call chutney's test-network.sh. - Previously, this only worked on systems which had bash installed, - due to some bash-specific code in the script. Fixes bug 19699; - bugfix on 0.3.0.4-rc. Follow-up to ticket 21581. - - o Minor bugfixes (voting consistency): - - Reject version numbers with non-numeric prefixes (such as +, -, or - whitespace). Disallowing whitespace prevents differential version - parsing between POSIX-based and Windows platforms. Fixes bug 21507 - and part of 21508; bugfix on 0.0.8pre1. - - o Minor bugfixes (windows, relay): - - Resolve "Failure from drain_fd: No error" warnings on Windows - relays. Fixes bug 21540; bugfix on 0.2.6.3-alpha. - - o Code simplification and refactoring: - - Break up the 630-line function connection_dir_client_reached_eof() - into a dozen smaller functions. This change should help - maintainability and readability of the client directory code. - - Isolate our use of the openssl headers so that they are only - included from our crypto wrapper modules, and from tests that - examine those modules' internals. Closes ticket 21841. - - Simplify our API to launch directory requests, making it more - extensible and less error-prone. Now it's easier to add extra - headers to directory requests. Closes ticket 21646. - - Our base64 decoding functions no longer overestimate the output - space that they need when parsing unpadded inputs. Closes - ticket 17868. - - Remove unused "ROUTER_ADDED_NOTIFY_GENERATOR" internal value. - Resolves ticket 22213. - - The logic that directory caches use to spool request to clients, - serving them one part at a time so as not to allocate too much - memory, has been refactored for consistency. Previously there was - a separate spooling implementation per type of spoolable data. Now - there is one common spooling implementation, with extensible data - types. Closes ticket 21651. - - Tor's compression module now supports multiple backends. Part of - the implementation for proposal 278; closes ticket 21663. - - o Documentation: - - Clarify the behavior of the KeepAliveIsolateSOCKSAuth sub-option. - Closes ticket 21873. - - Correct documentation about the default DataDirectory value. - Closes ticket 21151. - - Document the default behavior of NumEntryGuards and - NumDirectoryGuards correctly. Fixes bug 21715; bugfix - on 0.3.0.1-alpha. - - Document key=value pluggable transport arguments for Bridge lines - in torrc. Fixes bug 20341; bugfix on 0.2.5.1-alpha. - - Note that bandwidth-limiting options don't affect TCP headers or - DNS. Closes ticket 17170. - - o Removed features (configuration options, all in ticket 22060): - - These configuration options are now marked Obsolete, and no longer - have any effect: AllowInvalidNodes, AllowSingleHopCircuits, - AllowSingleHopExits, ExcludeSingleHopRelays, FastFirstHopPK, - TLSECGroup, WarnUnsafeSocks. They were first marked as deprecated - in 0.2.9.2-alpha and have now been removed. The previous default - behavior is now always chosen; the previous (less secure) non- - default behavior is now unavailable. - - CloseHSClientCircuitsImmediatelyOnTimeout and - CloseHSServiceRendCircuitsImmediatelyOnTimeout were deprecated in - 0.2.9.2-alpha and now have been removed. HS circuits never close - on circuit build timeout; they have a longer timeout period. - - {Control,DNS,Dir,Socks,Trans,NATD,OR}ListenAddress were deprecated - in 0.2.9.2-alpha and now have been removed. Use the ORPort option - (and others) to configure listen-only and advertise-only addresses. - - o Removed features (tools): - - We've removed the tor-checkkey tool from src/tools. Long ago, we - used it to help people detect RSA keys that were generated by - versions of Debian affected by CVE-2008-0166. But those keys have - been out of circulation for ages, and this tool is no longer - required. Closes ticket 21842. - - -Changes in version 0.3.0.7 - 2017-05-15 - Tor 0.3.0.7 fixes a medium-severity security bug in earlier versions - of Tor 0.3.0.x, where an attacker could cause a Tor relay process - to exit. Relays running earlier versions of Tor 0.3.0.x should upgrade; - clients are not affected. - - o Major bugfixes (hidden service directory, security): - - Fix an assertion failure in the hidden service directory code, which - could be used by an attacker to remotely cause a Tor relay process to - exit. Relays running earlier versions of Tor 0.3.0.x should upgrade. - should upgrade. This security issue is tracked as TROVE-2017-002. - Fixes bug 22246; bugfix on 0.3.0.1-alpha. - - o Minor features: - - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2 - Country database. - - o Minor features (future-proofing): - - Tor no longer refuses to download microdescriptors or descriptors - if they are listed as "published in the future". This change will - eventually allow us to stop listing meaningful "published" dates - in microdescriptor consensuses, and thereby allow us to reduce the - resources required to download consensus diffs by over 50%. - Implements part of ticket 21642; implements part of proposal 275. - - o Minor bugfixes (Linux seccomp2 sandbox): - - The getpid() system call is now permitted under the Linux seccomp2 - sandbox, to avoid crashing with versions of OpenSSL (and other - libraries) that attempt to learn the process's PID by using the - syscall rather than the VDSO code. Fixes bug 21943; bugfix - on 0.2.5.1-alpha. - - -Changes in version 0.3.0.6 - 2017-04-26 - Tor 0.3.0.6 is the first stable release of the Tor 0.3.0 series. - - With the 0.3.0 series, clients and relays now use Ed25519 keys to - authenticate their link connections to relays, rather than the old - RSA1024 keys that they used before. (Circuit crypto has been - Curve25519-authenticated since 0.2.4.8-alpha.) We have also replaced - the guard selection and replacement algorithm to behave more robustly - in the presence of unreliable networks, and to resist guard- - capture attacks. - - This series also includes numerous other small features and bugfixes, - along with more groundwork for the upcoming hidden-services revamp. - - Per our stable release policy, we plan to support the Tor 0.3.0 - release series for at least the next nine months, or for three months - after the first stable release of the 0.3.1 series: whichever is - longer. If you need a release with long-term support, we recommend - that you stay with the 0.2.9 series. - - Below are the changes since 0.3.0.5-rc. For a list of all changes - since 0.2.9, see the ReleaseNotes file. - - o Minor features (geoip): - - Update geoip and geoip6 to the April 4 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (control port): - - The GETINFO extra-info/digest/ command was broken because - of a wrong base16 decode return value check, introduced when - refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (crash prevention): - - Fix a (currently untriggerable, but potentially dangerous) crash - bug when base32-encoding inputs whose sizes are not a multiple of - 5. Fixes bug 21894; bugfix on 0.2.9.1-alpha. - - -Changes in version 0.3.0.5-rc - 2017-04-05 - Tor 0.3.0.5-rc fixes a few remaining bugs, large and small, in the - 0.3.0 release series. - - This is the second release candidate in the Tor 0.3.0 series, and has - much fewer changes than the first. If we find no new bugs or - regressions here, the first stable 0.3.0 release will be nearly - identical to it. - - o Major bugfixes (crash, directory connections): - - Fix a rare crash when sending a begin cell on a circuit whose - linked directory connection had already been closed. Fixes bug - 21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett. - - o Major bugfixes (guard selection): - - Fix a guard selection bug where Tor would refuse to bootstrap in - some cases if the user swapped a bridge for another bridge in - their configuration file. Fixes bug 21771; bugfix on 0.3.0.1-alpha. - Reported by "torvlnt33r". - - o Minor features (geoip): - - Update geoip and geoip6 to the March 7 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfix (compilation): - - Fix a warning when compiling hs_service.c. Previously, it had no - exported symbols when compiled for libor.a, resulting in a - compilation warning from clang. Fixes bug 21825; bugfix - on 0.3.0.1-alpha. - - o Minor bugfixes (hidden services): - - Make hidden services check for failed intro point connections, - even when they have exceeded their intro point creation limit. - Fixes bug 21596; bugfix on 0.2.7.2-alpha. Reported by Alec Muffett. - - Make hidden services with 8 to 10 introduction points check for - failed circuits immediately after startup. Previously, they would - wait for 5 minutes before performing their first checks. Fixes bug - 21594; bugfix on 0.2.3.9-alpha. Reported by Alec Muffett. - - o Minor bugfixes (memory leaks): - - Fix a memory leak when using GETCONF on a port option. Fixes bug - 21682; bugfix on 0.3.0.3-alpha. - - o Minor bugfixes (relay): - - Avoid a double-marked-circuit warning that could happen when we - receive DESTROY cells under heavy load. Fixes bug 20059; bugfix - on 0.1.0.1-rc. - - o Minor bugfixes (tests): - - Run the entry_guard_parse_from_state_full() test with the time set - to a specific date. (The guard state that this test was parsing - contained guards that had expired since the test was first - written.) Fixes bug 21799; bugfix on 0.3.0.1-alpha. - - o Documentation: - - Update the description of the directory server options in the - manual page, to clarify that a relay no longer needs to set - DirPort in order to be a directory cache. Closes ticket 21720. - - - -Changes in version 0.2.8.13 - 2017-03-03 - Tor 0.2.8.13 backports a security fix from later Tor - releases. Anybody running Tor 0.2.8.12 or earlier should upgrade to this - this release, if for some reason they cannot upgrade to a later - release series, and if they build Tor with the --enable-expensive-hardening - option. - - Note that support for Tor 0.2.8.x is ending next year: we will not issue - any fixes for the Tor 0.2.8.x series after 1 Jan 2018. If you need - a Tor release series with longer-term support, we recommend Tor 0.2.9.x. - - o Major bugfixes (parsing, backported from 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - -Changes in version 0.2.7.7 - 2017-03-03 - Tor 0.2.7.7 backports a number of security fixes from later Tor - releases. Anybody running Tor 0.2.7.6 or earlier should upgrade to - this release, if for some reason they cannot upgrade to a later - release series. - - Note that support for Tor 0.2.7.x is ending this year: we will not issue - any fixes for the Tor 0.2.7.x series after 1 August 2017. If you need - a Tor release series with longer-term support, we recommend Tor 0.2.9.x. - - o Directory authority changes (backport from 0.2.8.5-rc): - - Urras is no longer a directory authority. Closes ticket 19271. - - o Directory authority changes (backport from 0.2.9.2-alpha): - - The "Tonga" bridge authority has been retired; the new bridge - authority is "Bifroest". Closes tickets 19728 and 19690. - - o Directory authority key updates (backport from 0.2.8.1-alpha): - - Update the V3 identity key for the dannenberg directory authority: - it was changed on 18 November 2015. Closes task 17906. Patch - by "teor". - - o Major bugfixes (parsing, security, backport from 0.2.9.8): - - Fix a bug in parsing that could cause clients to read a single - byte past the end of an allocated region. This bug could be used - to cause hardened clients (built with --enable-expensive-hardening) - to crash if they tried to visit a hostile hidden service. Non- - hardened clients are only affected depending on the details of - their platform's memory allocator. Fixes bug 21018; bugfix on - 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- - 2016-12-002 and as CVE-2016-1254. - - o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): - - Stop a crash that could occur when a client running with DNSPort - received a query with multiple address types, and the first - address type was not supported. Found and fixed by Scott Dial. - Fixes bug 18710; bugfix on 0.2.5.4-alpha. - - Prevent a class of security bugs caused by treating the contents - of a buffer chunk as if they were a NUL-terminated string. At - least one such bug seems to be present in all currently used - versions of Tor, and would allow an attacker to remotely crash - most Tor instances, especially those compiled with extra compiler - hardening. With this defense in place, such bugs can't crash Tor, - though we should still fix them as they occur. Closes ticket - 20384 (TROVE-2016-10-001). - - o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): - - Avoid a difficult-to-trigger heap corruption attack when extending - a smartlist to contain over 16GB of pointers. Fixes bug 18162; - bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. - Reported by Guido Vranken. - - o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): - - Avoid crashing when running as a DNS proxy. Fixes bug 16248; - bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". - - o Major bugfixes (key management, backport from 0.2.8.3-alpha): - - If OpenSSL fails to generate an RSA key, do not retain a dangling - pointer to the previous (uninitialized) key value. The impact here - should be limited to a difficult-to-trigger crash, if OpenSSL is - running an engine that makes key generation failures possible, or - if OpenSSL runs out of memory. Fixes bug 19152; bugfix on - 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and - Baishakhi Ray. - - o Major bugfixes (parsing, backported from 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): - - Make memwipe() do nothing when passed a NULL pointer or buffer of - zero size. Check size argument to memwipe() for underflow. Fixes - bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", - patch by "teor". - - o Minor features (bug-resistance, backport from 0.2.8.2-alpha): - - Make Tor survive errors involving connections without a - corresponding event object. Previously we'd fail with an - assertion; now we produce a log message. Related to bug 16248. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - -Changes in version 0.2.6.11 - 2017-03-03 - Tor 0.2.6.11 backports a number of security fixes from later Tor - releases. Anybody running Tor 0.2.6.10 or earlier should upgrade to - this release, if for some reason they cannot upgrade to a later - release series. - - Note that support for Tor 0.2.6.x is ending this year: we will not issue - any fixes for the Tor 0.2.6.x series after 1 August 2017. If you need - a Tor release series with longer-term support, we recommend Tor 0.2.9.x. - - o Directory authority changes (backport from 0.2.8.5-rc): - - Urras is no longer a directory authority. Closes ticket 19271. - - o Directory authority changes (backport from 0.2.9.2-alpha): - - The "Tonga" bridge authority has been retired; the new bridge - authority is "Bifroest". Closes tickets 19728 and 19690. - - o Directory authority key updates (backport from 0.2.8.1-alpha): - - Update the V3 identity key for the dannenberg directory authority: - it was changed on 18 November 2015. Closes task 17906. Patch - by "teor". - - o Major features (security fixes, backport from 0.2.9.4-alpha): - - Prevent a class of security bugs caused by treating the contents - of a buffer chunk as if they were a NUL-terminated string. At - least one such bug seems to be present in all currently used - versions of Tor, and would allow an attacker to remotely crash - most Tor instances, especially those compiled with extra compiler - hardening. With this defense in place, such bugs can't crash Tor, - though we should still fix them as they occur. Closes ticket - 20384 (TROVE-2016-10-001). - - o Major bugfixes (parsing, security, backport from 0.2.9.8): - - Fix a bug in parsing that could cause clients to read a single - byte past the end of an allocated region. This bug could be used - to cause hardened clients (built with --enable-expensive-hardening) - to crash if they tried to visit a hostile hidden service. Non- - hardened clients are only affected depending on the details of - their platform's memory allocator. Fixes bug 21018; bugfix on - 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- - 2016-12-002 and as CVE-2016-1254. - - o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): - - Stop a crash that could occur when a client running with DNSPort - received a query with multiple address types, and the first - address type was not supported. Found and fixed by Scott Dial. - Fixes bug 18710; bugfix on 0.2.5.4-alpha. - - o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): - - Fix an error that could cause us to read 4 bytes before the - beginning of an openssl string. This bug could be used to cause - Tor to crash on systems with unusual malloc implementations, or - systems with unusual hardening installed. Fixes bug 17404; bugfix - on 0.2.3.6-alpha. - - o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): - - Avoid a difficult-to-trigger heap corruption attack when extending - a smartlist to contain over 16GB of pointers. Fixes bug 18162; - bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. - Reported by Guido Vranken. - - o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): - - Avoid crashing when running as a DNS proxy. Fixes bug 16248; - bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". - - o Major bugfixes (guard selection, backport from 0.2.7.6): - - Actually look at the Guard flag when selecting a new directory - guard. When we implemented the directory guard design, we - accidentally started treating all relays as if they have the Guard - flag during guard selection, leading to weaker anonymity and worse - performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered - by Mohsen Imani. - - o Major bugfixes (key management, backport from 0.2.8.3-alpha): - - If OpenSSL fails to generate an RSA key, do not retain a dangling - pointer to the previous (uninitialized) key value. The impact here - should be limited to a difficult-to-trigger crash, if OpenSSL is - running an engine that makes key generation failures possible, or - if OpenSSL runs out of memory. Fixes bug 19152; bugfix on - 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and - Baishakhi Ray. - - o Major bugfixes (parsing, backported from 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): - - Make memwipe() do nothing when passed a NULL pointer or buffer of - zero size. Check size argument to memwipe() for underflow. Fixes - bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", - patch by "teor". - - o Minor features (bug-resistance, backport from 0.2.8.2-alpha): - - Make Tor survive errors involving connections without a - corresponding event object. Previously we'd fail with an - assertion; now we produce a log message. Related to bug 16248. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, backport from 0.2.7.6): - - Fix a compilation warning with Clang 3.6: Do not check the - presence of an address which can never be NULL. Fixes bug 17781. - - -Changes in version 0.2.5.13 - 2017-03-03 - Tor 0.2.5.13 backports a number of security fixes from later Tor - releases. Anybody running Tor 0.2.5.13 or earlier should upgrade to - this release, if for some reason they cannot upgrade to a later - release series. - - Note that support for Tor 0.2.5.x is ending next year: we will not issue - any fixes for the Tor 0.2.5.x series after 1 May 2018. If you need - a Tor release series with longer-term support, we recommend Tor 0.2.9.x. - - o Directory authority changes (backport from 0.2.8.5-rc): - - Urras is no longer a directory authority. Closes ticket 19271. - - o Directory authority changes (backport from 0.2.9.2-alpha): - - The "Tonga" bridge authority has been retired; the new bridge - authority is "Bifroest". Closes tickets 19728 and 19690. - - o Directory authority key updates (backport from 0.2.8.1-alpha): - - Update the V3 identity key for the dannenberg directory authority: - it was changed on 18 November 2015. Closes task 17906. Patch - by "teor". - - o Major features (security fixes, backport from 0.2.9.4-alpha): - - Prevent a class of security bugs caused by treating the contents - of a buffer chunk as if they were a NUL-terminated string. At - least one such bug seems to be present in all currently used - versions of Tor, and would allow an attacker to remotely crash - most Tor instances, especially those compiled with extra compiler - hardening. With this defense in place, such bugs can't crash Tor, - though we should still fix them as they occur. Closes ticket - 20384 (TROVE-2016-10-001). - - o Major bugfixes (parsing, security, backport from 0.2.9.8): - - Fix a bug in parsing that could cause clients to read a single - byte past the end of an allocated region. This bug could be used - to cause hardened clients (built with --enable-expensive-hardening) - to crash if they tried to visit a hostile hidden service. Non- - hardened clients are only affected depending on the details of - their platform's memory allocator. Fixes bug 21018; bugfix on - 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- - 2016-12-002 and as CVE-2016-1254. - - o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): - - Stop a crash that could occur when a client running with DNSPort - received a query with multiple address types, and the first - address type was not supported. Found and fixed by Scott Dial. - Fixes bug 18710; bugfix on 0.2.5.4-alpha. - - o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): - - Fix an error that could cause us to read 4 bytes before the - beginning of an openssl string. This bug could be used to cause - Tor to crash on systems with unusual malloc implementations, or - systems with unusual hardening installed. Fixes bug 17404; bugfix - on 0.2.3.6-alpha. - - o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): - - Avoid a difficult-to-trigger heap corruption attack when extending - a smartlist to contain over 16GB of pointers. Fixes bug 18162; - bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. - Reported by Guido Vranken. - - o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): - - Avoid crashing when running as a DNS proxy. Fixes bug 16248; - bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". - - o Major bugfixes (guard selection, backport from 0.2.7.6): - - Actually look at the Guard flag when selecting a new directory - guard. When we implemented the directory guard design, we - accidentally started treating all relays as if they have the Guard - flag during guard selection, leading to weaker anonymity and worse - performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered - by Mohsen Imani. - - o Major bugfixes (key management, backport from 0.2.8.3-alpha): - - If OpenSSL fails to generate an RSA key, do not retain a dangling - pointer to the previous (uninitialized) key value. The impact here - should be limited to a difficult-to-trigger crash, if OpenSSL is - running an engine that makes key generation failures possible, or - if OpenSSL runs out of memory. Fixes bug 19152; bugfix on - 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and - Baishakhi Ray. - - o Major bugfixes (parsing, backported from 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): - - Make memwipe() do nothing when passed a NULL pointer or buffer of - zero size. Check size argument to memwipe() for underflow. Fixes - bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", - patch by "teor". - - o Minor features (bug-resistance, backport from 0.2.8.2-alpha): - - Make Tor survive errors involving connections without a - corresponding event object. Previously we'd fail with an - assertion; now we produce a log message. Related to bug 16248. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, backport from 0.2.7.6): - - Fix a compilation warning with Clang 3.6: Do not check the - presence of an address which can never be NULL. Fixes bug 17781. - - o Minor bugfixes (crypto error-handling, backport from 0.2.7.2-alpha): - - Check for failures from crypto_early_init, and refuse to continue. - A previous typo meant that we could keep going with an - uninitialized crypto library, and would have OpenSSL initialize - its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced - when implementing ticket 4900. Patch by "teor". - - o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): - - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on - a client authorized hidden service. Fixes bug 15823; bugfix - on 0.2.1.6-alpha. - - -Changes in version 0.2.4.28 - 2017-03-03 - Tor 0.2.4.28 backports a number of security fixes from later Tor - releases. Anybody running Tor 0.2.4.27 or earlier should upgrade to - this release, if for some reason they cannot upgrade to a later - release series. - - Note that support for Tor 0.2.4.x is ending soon: we will not issue - any fixes for the Tor 0.2.4.x series after 1 August 2017. If you need - a Tor release series with long-term support, we recommend Tor 0.2.9.x. - - o Directory authority changes (backport from 0.2.8.5-rc): - - Urras is no longer a directory authority. Closes ticket 19271. - - o Directory authority changes (backport from 0.2.9.2-alpha): - - The "Tonga" bridge authority has been retired; the new bridge - authority is "Bifroest". Closes tickets 19728 and 19690. - - o Directory authority key updates (backport from 0.2.8.1-alpha): - - Update the V3 identity key for the dannenberg directory authority: - it was changed on 18 November 2015. Closes task 17906. Patch - by "teor". - - o Major features (security fixes, backport from 0.2.9.4-alpha): - - Prevent a class of security bugs caused by treating the contents - of a buffer chunk as if they were a NUL-terminated string. At - least one such bug seems to be present in all currently used - versions of Tor, and would allow an attacker to remotely crash - most Tor instances, especially those compiled with extra compiler - hardening. With this defense in place, such bugs can't crash Tor, - though we should still fix them as they occur. Closes ticket - 20384 (TROVE-2016-10-001). - - o Major bugfixes (parsing, security, backport from 0.2.9.8): - - Fix a bug in parsing that could cause clients to read a single - byte past the end of an allocated region. This bug could be used - to cause hardened clients (built with --enable-expensive-hardening) - to crash if they tried to visit a hostile hidden service. Non- - hardened clients are only affected depending on the details of - their platform's memory allocator. Fixes bug 21018; bugfix on - 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- - 2016-12-002 and as CVE-2016-1254. - - o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): - - Fix an error that could cause us to read 4 bytes before the - beginning of an openssl string. This bug could be used to cause - Tor to crash on systems with unusual malloc implementations, or - systems with unusual hardening installed. Fixes bug 17404; bugfix - on 0.2.3.6-alpha. - - o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): - - Avoid a difficult-to-trigger heap corruption attack when extending - a smartlist to contain over 16GB of pointers. Fixes bug 18162; - bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. - Reported by Guido Vranken. - - o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): - - Avoid crashing when running as a DNS proxy. Fixes bug 16248; - bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". - - o Major bugfixes (guard selection, backport from 0.2.7.6): - - Actually look at the Guard flag when selecting a new directory - guard. When we implemented the directory guard design, we - accidentally started treating all relays as if they have the Guard - flag during guard selection, leading to weaker anonymity and worse - performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered - by Mohsen Imani. - - o Major bugfixes (key management, backport from 0.2.8.3-alpha): - - If OpenSSL fails to generate an RSA key, do not retain a dangling - pointer to the previous (uninitialized) key value. The impact here - should be limited to a difficult-to-trigger crash, if OpenSSL is - running an engine that makes key generation failures possible, or - if OpenSSL runs out of memory. Fixes bug 19152; bugfix on - 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and - Baishakhi Ray. - - o Major bugfixes (parsing, backported from 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): - - Make memwipe() do nothing when passed a NULL pointer or buffer of - zero size. Check size argument to memwipe() for underflow. Fixes - bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", - patch by "teor". - - o Minor features (bug-resistance, backport from 0.2.8.2-alpha): - - Make Tor survive errors involving connections without a - corresponding event object. Previously we'd fail with an - assertion; now we produce a log message. Related to bug 16248. - - o Minor features (DoS-resistance, backport from 0.2.7.1-alpha): - - Make it harder for attackers to overload hidden services with - introductions, by blocking multiple introduction requests on the - same circuit. Resolves ticket 15515. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - o Minor bugfixes (compilation, backport from 0.2.7.6): - - Fix a compilation warning with Clang 3.6: Do not check the - presence of an address which can never be NULL. Fixes bug 17781. - - o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): - - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on - a client authorized hidden service. Fixes bug 15823; bugfix - on 0.2.1.6-alpha. - - -Changes in version 0.3.0.4-rc - 2017-03-01 - Tor 0.3.0.4-rc fixes some remaining bugs, large and small, in the - 0.3.0 release series, and introduces a few reliability features to - keep them from coming back. - - This is the first release candidate in the Tor 0.3.0 series. If we - find no new bugs or regressions here, the first stable 0.3.0 release - will be nearly identical to it. - - o Major bugfixes (bridges): - - When the same bridge is configured multiple times with the same - identity, but at different address:port combinations, treat those - bridge instances as separate guards. This fix restores the ability - of clients to configure the same bridge with multiple pluggable - transports. Fixes bug 21027; bugfix on 0.3.0.1-alpha. - - o Major bugfixes (hidden service directory v3): - - Stop crashing on a failed v3 hidden service descriptor lookup - failure. Fixes bug 21471; bugfixes on tor-0.3.0.1-alpha. - - o Major bugfixes (parsing): - - When parsing a malformed content-length field from an HTTP - message, do not read off the end of the buffer. This bug was a - potential remote denial-of-service attack against Tor clients and - relays. A workaround was released in October 2016, to prevent this - bug from crashing Tor. This is a fix for the underlying issue, - which should no longer matter (if you applied the earlier patch). - Fixes bug 20894; bugfix on 0.2.0.16-alpha. Bug found by fuzzing - using AFL (http://lcamtuf.coredump.cx/afl/). - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor feature (protocol versioning): - - Add new protocol version for proposal 224. HSIntro now advertises - version "3-4" and HSDir version "1-2". Fixes ticket 20656. - - o Minor features (directory authorities): - - Directory authorities now reject descriptors that claim to be - malformed versions of Tor. Helps prevent exploitation of - bug 21278. - - Reject version numbers with components that exceed INT32_MAX. - Otherwise 32-bit and 64-bit platforms would behave inconsistently. - Fixes bug 21450; bugfix on 0.0.8pre1. - - Directory authorities now reject relays running versions - 0.2.9.1-alpha through 0.2.9.4-alpha, because those relays - suffer from bug 20499 and don't keep their consensus cache - up-to-date. Resolves ticket 20509. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - o Minor features (reliability, crash): - - Try better to detect problems in buffers where they might grow (or - think they have grown) over 2 GB in size. Diagnostic for - bug 21369. - - o Minor features (testing): - - During 'make test-network-all', if tor logs any warnings, ask - chutney to output them. Requires a recent version of chutney with - the 21572 patch. Implements 21570. - - o Minor bugfixes (certificate expiration time): - - Avoid using link certificates that don't become valid till some - time in the future. Fixes bug 21420; bugfix on 0.2.4.11-alpha - - o Minor bugfixes (code correctness): - - Repair a couple of (unreachable or harmless) cases of the risky - comparison-by-subtraction pattern that caused bug 21278. - - Remove a redundant check for the UseEntryGuards option from the - options_transition_affects_guards() function. Fixes bug 21492; - bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (directory mirrors): - - Allow relays to use directory mirrors without a DirPort: these - relays need to be contacted over their ORPorts using a begindir - connection. Fixes one case of bug 20711; bugfix on 0.2.8.2-alpha. - - Clarify the message logged when a remote relay is unexpectedly - missing an ORPort or DirPort: users were confusing this with a - local port. Fixes another case of bug 20711; bugfix - on 0.2.8.2-alpha. - - o Minor bugfixes (guards): - - Don't warn about a missing guard state on timeout-measurement - circuits: they aren't supposed to be using guards. Fixes an - instance of bug 21007; bugfix on 0.3.0.1-alpha. - - Silence a BUG() warning when attempting to use a guard whose - descriptor we don't know, and make this scenario less likely to - happen. Fixes bug 21415; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (hidden service): - - Pass correct buffer length when encoding legacy ESTABLISH_INTRO - cells. Previously, we were using sizeof() on a pointer, instead of - the real destination buffer. Fortunately, that value was only used - to double-check that there was enough room--which was already - enforced elsewhere. Fixes bug 21553; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (testing): - - Fix Raspbian build issues related to missing socket errno in - test_util.c. Fixes bug 21116; bugfix on tor-0.2.8.2. Patch - by "hein". - - Rename "make fuzz" to "make test-fuzz-corpora", since it doesn't - actually fuzz anything. Fixes bug 21447; bugfix on 0.3.0.3-alpha. - - Use bash in src/test/test-network.sh. This ensures we reliably - call chutney's newer tools/test-network.sh when available. Fixes - bug 21562; bugfix on 0.2.9.1-alpha. - - o Documentation: - - Small fixes to the fuzzing documentation. Closes ticket 21472. - - -Changes in version 0.2.9.10 - 2017-03-01 - Tor 0.2.9.10 backports a security fix from later Tor release. It also - includes fixes for some major issues affecting directory authorities, - LibreSSL compatibility, and IPv6 correctness. - - The Tor 0.2.9.x release series is now marked as a long-term-support - series. We intend to backport security fixes to 0.2.9.x until at - least January of 2020. - - o Major bugfixes (directory authority, 0.3.0.3-alpha): - - During voting, when marking a relay as a probable sybil, do not - clear its BadExit flag: sybils can still be bad in other ways - too. (We still clear the other flags.) Fixes bug 21108; bugfix - on 0.2.0.13-alpha. - - o Major bugfixes (IPv6 Exits, backport from 0.3.0.3-alpha): - - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects - any IPv6 addresses. Instead, only reject a port over IPv6 if the - exit policy rejects that port on more than an IPv6 /16 of - addresses. This bug was made worse by 17027 in 0.2.8.1-alpha, - which rejected a relay's own IPv6 address by default. Fixes bug - 21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha. - - o Major bugfixes (parsing, also in 0.3.0.4-rc): - - Fix an integer underflow bug when comparing malformed Tor - versions. This bug could crash Tor when built with - --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor - 0.2.9.8, which were built with -ftrapv by default. In other cases - it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix - on 0.0.8pre1. Found by OSS-Fuzz. - - o Minor features (directory authorities, also in 0.3.0.4-rc): - - Directory authorities now reject descriptors that claim to be - malformed versions of Tor. Helps prevent exploitation of - bug 21278. - - Reject version numbers with components that exceed INT32_MAX. - Otherwise 32-bit and 64-bit platforms would behave inconsistently. - Fixes bug 21450; bugfix on 0.0.8pre1. - - o Minor features (geoip): - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - - o Minor features (portability, compilation, backport from 0.3.0.3-alpha): - - Autoconf now checks to determine if OpenSSL structures are opaque, - instead of explicitly checking for OpenSSL version numbers. Part - of ticket 21359. - - Support building with recent LibreSSL code that uses opaque - structures. Closes ticket 21359. - - o Minor bugfixes (code correctness, also in 0.3.0.4-rc): - - Repair a couple of (unreachable or harmless) cases of the risky - comparison-by-subtraction pattern that caused bug 21278. - - o Minor bugfixes (tor-resolve, backport from 0.3.0.3-alpha): - - The tor-resolve command line tool now rejects hostnames over 255 - characters in length. Previously, it would silently truncate them, - which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5. - Patch by "junglefowl". - - -Changes in version 0.3.0.3-alpha - 2017-02-03 - Tor 0.3.0.3-alpha fixes a few significant bugs introduced over the - 0.3.0.x development series, including some that could cause - authorities to behave badly. There is also a fix for a longstanding - bug that could prevent IPv6 exits from working. Tor 0.3.0.3-alpha also - includes some smaller features and bugfixes. - - The Tor 0.3.0.x release series is now in patch-freeze: no additional - features will be considered for inclusion in 0.3.0.x. We suspect that - some bugs will probably remain, however, and we encourage people to - test this release. - - o Major bugfixes (directory authority): - - During voting, when marking a relay as a probable sybil, do not - clear its BadExit flag: sybils can still be bad in other ways - too. (We still clear the other flags.) Fixes bug 21108; bugfix - on 0.2.0.13-alpha. - - When deciding whether we have just found a router to be reachable, - do not penalize it for not having performed an Ed25519 link - handshake if it does not claim to support an Ed25519 handshake. - Previously, we would treat such relays as non-running. Fixes bug - 21107; bugfix on 0.3.0.1-alpha. - - o Major bugfixes (entry guards): - - Stop trying to build circuits through entry guards for which we - have no descriptor. Also, stop crashing in the case that we *do* - accidentally try to build a circuit in such a state. Fixes bug - 21242; bugfix on 0.3.0.1-alpha. - - o Major bugfixes (IPv6 Exits): - - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects - any IPv6 addresses. Instead, only reject a port over IPv6 if the - exit policy rejects that port on more than an IPv6 /16 of - addresses. This bug was made worse by 17027 in 0.2.8.1-alpha, - which rejected a relay's own IPv6 address by default. Fixes bug - 21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha. - - o Minor feature (client): - - Enable IPv6 traffic on the SocksPort by default. To disable this, - a user will have to specify "NoIPv6Traffic". Closes ticket 21269. - - o Minor feature (fallback scripts): - - Add a check_existing mode to updateFallbackDirs.py, which checks - if fallbacks in the hard-coded list are working. Closes ticket - 20174. Patch by haxxpop. - - o Minor features (ciphersuite selection): - - Clients now advertise a list of ciphersuites closer to the ones - preferred by Firefox. Closes part of ticket 15426. - - Allow relays to accept a wider range of ciphersuites, including - chacha20-poly1305 and AES-CCM. Closes the other part of 15426. - - o Minor features (controller, configuration): - - Each of the *Port options, such as SocksPort, ORPort, ControlPort, - and so on, now comes with a __*Port variant that will not be saved - to the torrc file by the controller's SAVECONF command. This - change allows TorBrowser to set up a single-use domain socket for - each time it launches Tor. Closes ticket 20956. - - The GETCONF command can now query options that may only be - meaningful in context-sensitive lists. This allows the controller - to query the mixed SocksPort/__SocksPort style options introduced - in feature 20956. Implements ticket 21300. - - o Minor features (portability, compilation): - - Autoconf now checks to determine if OpenSSL structures are opaque, - instead of explicitly checking for OpenSSL version numbers. Part - of ticket 21359. - - Support building with recent LibreSSL code that uses opaque - structures. Closes ticket 21359. - - o Minor features (relay): - - We now allow separation of exit and relay traffic to different - source IP addresses, using the OutboundBindAddressExit and - OutboundBindAddressOR options respectively. Closes ticket 17975. - Written by Michael Sonntag. - - o Minor bugfix (logging): - - Don't recommend the use of Tor2web in non-anonymous mode. - Recommending Tor2web is a bad idea because the client loses all - anonymity. Tor2web should only be used in specific cases by users - who *know* and understand the issues. Fixes bug 21294; bugfix - on 0.2.9.3-alpha. - - o Minor bugfixes (client): - - Always recover from failures in extend_info_from_node(), in an - attempt to prevent any recurrence of bug 21242. Fixes bug 21372; - bugfix on 0.2.3.1-alpha. - - o Minor bugfixes (client, entry guards): - - Fix a bug warning (with backtrace) when we fail a channel that - circuits to fallback directories on it. Fixes bug 21128; bugfix - on 0.3.0.1-alpha. - - Fix a spurious bug warning (with backtrace) when removing an - expired entry guard. Fixes bug 21129; bugfix on 0.3.0.1-alpha. - - Fix a bug of the new guard algorithm where tor could stall for up - to 10 minutes before retrying a guard after a long period of no - network. Fixes bug 21052; bugfix on 0.3.0.1-alpha. - - Do not try to build circuits until we have descriptors for our - primary entry guards. Related to fix for bug 21242. - - o Minor bugfixes (configure, autoconf): - - Rename the configure option --enable-expensive-hardening to - --enable-fragile-hardening. Expensive hardening makes the tor - daemon abort when some kinds of issues are detected. Thus, it - makes tor more at risk of remote crashes but safer against RCE or - heartbleed bug category. We now try to explain this issue in a - message from the configure script. Fixes bug 21290; bugfix - on 0.2.5.4-alpha. - - o Minor bugfixes (controller): - - Restore the (deprecated) DROPGUARDS controller command. Fixes bug - 20824; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (hidden service): - - Clean up the code for expiring intro points with no associated - circuits. It was causing, rarely, a service with some expiring - introduction points to not open enough additional introduction - points. Fixes part of bug 21302; bugfix on 0.2.7.2-alpha. - - Stop setting the torrc option HiddenServiceStatistics to "0" just - because we're not a bridge or relay. Instead, we preserve whatever - value the user set (or didn't set). Fixes bug 21150; bugfix - on 0.2.6.2-alpha. - - Resolve two possible underflows which could lead to creating and - closing a lot of introduction point circuits in a non-stop loop. - Fixes bug 21302; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (portability): - - Use "OpenBSD" compiler macro instead of "OPENBSD" or "__OpenBSD__". - It is supported by OpenBSD itself, and also by most OpenBSD - variants (such as Bitrig). Fixes bug 20980; bugfix - on 0.1.2.1-alpha. - - When mapping a file of length greater than SIZE_MAX, do not - silently truncate its contents. This issue could occur on 32 bit - systems with large file support and files which are larger than 4 - GB. Fixes bug 21134; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (tor-resolve): - - The tor-resolve command line tool now rejects hostnames over 255 - characters in length. Previously, it would silently truncate them, - which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5. - Patch by "junglefowl". - - o Minor bugfixes (Windows services): - - Be sure to initialize the monotonic time subsystem before using - it, even when running as an NT service. Fixes bug 21356; bugfix - on 0.2.9.1-alpha. - - -Changes in version 0.3.0.2-alpha - 2017-01-23 - Tor 0.3.0.2-alpha fixes a denial-of-service bug where an attacker could - cause relays and clients to crash, even if they were not built with - the --enable-expensive-hardening option. This bug affects all 0.2.9.x - versions, and also affects 0.3.0.1-alpha: all relays running an affected - version should upgrade. - - Tor 0.3.0.2-alpha also improves how exit relays and clients handle DNS - time-to-live values, makes directory authorities enforce the 1-to-1 - mapping of relay RSA identity keys to ED25519 identity keys, fixes a - client-side onion service reachability bug, does better at selecting - the set of fallback directories, and more. - - o Major bugfixes (security, also in 0.2.9.9): - - Downgrade the "-ftrapv" option from "always on" to "only on when - --enable-expensive-hardening is provided." This hardening option, like - others, can turn survivable bugs into crashes--and having it on by - default made a (relatively harmless) integer overflow bug into a - denial-of-service bug. Fixes bug 21278 (TROVE-2017-001); bugfix on - 0.2.9.1-alpha. - - o Major features (security): - - Change the algorithm used to decide DNS TTLs on client and server - side, to better resist DNS-based correlation attacks like the - DefecTor attack of Greschbach, Pulls, Roberts, Winter, and - Feamster. Now relays only return one of two possible DNS TTL - values, and clients are willing to believe DNS TTL values up to 3 - hours long. Closes ticket 19769. - - o Major features (directory authority, security): - - The default for AuthDirPinKeys is now 1: directory authorities - will reject relays where the RSA identity key matches a previously - seen value, but the Ed25519 key has changed. Closes ticket 18319. - - o Major bugfixes (client, guard, crash): - - In circuit_get_global_origin_list(), return the actual list of - origin circuits. The previous version of this code returned the - list of all the circuits, and could have caused strange bugs, - including possible crashes. Fixes bug 21118; bugfix - on 0.3.0.1-alpha. - - o Major bugfixes (client, onion service, also in 0.2.9.9): - - Fix a client-side onion service reachability bug, where multiple - socks requests to an onion service (or a single slow request) - could cause us to mistakenly mark some of the service's - introduction points as failed, and we cache that failure so - eventually we run out and can't reach the service. Also resolves a - mysterious "Remote server sent bogus reason code 65021" log - warning. The bug was introduced in ticket 17218, where we tried to - remember the circuit end reason as a uint16_t, which mangled - negative values. Partially fixes bug 21056 and fixes bug 20307; - bugfix on 0.2.8.1-alpha. - - o Major bugfixes (DNS): - - Fix a bug that prevented exit nodes from caching DNS records for - more than 60 seconds. Fixes bug 19025; bugfix on 0.2.4.7-alpha. - - o Minor features (controller): - - Add "GETINFO sr/current" and "GETINFO sr/previous" keys, to expose - shared-random values to the controller. Closes ticket 19925. - - o Minor features (entry guards): - - Add UseEntryGuards to TEST_OPTIONS_DEFAULT_VALUES in order to not - break regression tests. - - Require UseEntryGuards when UseBridges is set, in order to make - sure bridges aren't bypassed. Resolves ticket 20502. - - o Minor features (fallback directories): - - Select 200 fallback directories for each release. Closes - ticket 20881. - - Allow 3 fallback relays per operator, which is safe now that we - are choosing 200 fallback relays. Closes ticket 20912. - - Exclude relays affected by bug 20499 from the fallback list. - Exclude relays from the fallback list if they are running versions - known to be affected by bug 20499, or if in our tests they deliver - a stale consensus (i.e. one that expired more than 24 hours ago). - Closes ticket 20539. - - Reduce the minimum fallback bandwidth to 1 MByte/s. Part of - ticket 18828. - - Require fallback directories to have the same address and port for - 7 days (now that we have enough relays with this stability). - Relays whose OnionOO stability timer is reset on restart by bug - 18050 should upgrade to Tor 0.2.8.7 or later, which has a fix for - this issue. Closes ticket 20880; maintains short-term fix - in 0.2.8.2-alpha. - - Require fallbacks to have flags for 90% of the time (weighted - decaying average), rather than 95%. This allows at least 73% of - clients to bootstrap in the first 5 seconds without contacting an - authority. Part of ticket 18828. - - Annotate updateFallbackDirs.py with the bandwidth and consensus - weight for each candidate fallback. Closes ticket 20878. - - Make it easier to change the output sort order of fallbacks. - Closes ticket 20822. - - Display the relay fingerprint when downloading consensuses from - fallbacks. Closes ticket 20908. - - o Minor features (geoip, also in 0.2.9.9): - - Update geoip and geoip6 to the January 4 2017 Maxmind GeoLite2 - Country database. - - o Minor features (next-gen onion service directories): - - Remove the "EnableOnionServicesV3" consensus parameter that we - introduced in 0.3.0.1-alpha: relays are now always willing to act - as v3 onion service directories. Resolves ticket 19899. - - o Minor features (linting): - - Enhance the changes file linter to warn on Tor versions that are - prefixed with "tor-". Closes ticket 21096. - - o Minor features (logging): - - In several places, describe unset ed25519 keys as "", - rather than the scary "AAAAAAAA...AAA". Closes ticket 21037. - - o Minor bugfix (control protocol): - - The reply to a "GETINFO config/names" request via the control - protocol now spells the type "Dependent" correctly. This is a - breaking change in the control protocol. (The field seems to be - ignored by the most common known controllers.) Fixes bug 18146; - bugfix on 0.1.1.4-alpha. - - o Minor bugfixes (bug resilience): - - Fix an unreachable size_t overflow in base64_decode(). Fixes bug - 19222; bugfix on 0.2.0.9-alpha. Found by Guido Vranken; fixed by - Hans Jerry Illikainen. - - o Minor bugfixes (build): - - Replace obsolete Autoconf macros with their modern equivalent and - prevent similar issues in the future. Fixes bug 20990; bugfix - on 0.1.0.1-rc. - - o Minor bugfixes (client, guards): - - Fix bug where Tor would think that there are circuits waiting for - better guards even though those circuits have been freed. Fixes - bug 21142; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (config): - - Don't assert on startup when trying to get the options list and - LearnCircuitBuildTimeout is set to 0: we are currently parsing the - options so of course they aren't ready yet. Fixes bug 21062; - bugfix on 0.2.9.3-alpha. - - o Minor bugfixes (controller): - - Make the GETINFO interface for inquiring about entry guards - support the new guards backend. Fixes bug 20823; bugfix - on 0.3.0.1-alpha. - - o Minor bugfixes (dead code): - - Remove a redundant check for PidFile changes at runtime in - options_transition_allowed(): this check is already performed - regardless of whether the sandbox is active. Fixes bug 21123; - bugfix on 0.2.5.4-alpha. - - o Minor bugfixes (documentation): - - Update the tor manual page to document every option that can not - be changed while tor is running. Fixes bug 21122. - - o Minor bugfixes (fallback directories): - - Stop failing when a relay has no uptime data in - updateFallbackDirs.py. Fixes bug 20945; bugfix on 0.2.8.1-alpha. - - Avoid checking fallback candidates' DirPorts if they are down in - OnionOO. When a relay operator has multiple relays, this - prioritizes relays that are up over relays that are down. Fixes - bug 20926; bugfix on 0.2.8.3-alpha. - - Stop failing when OUTPUT_COMMENTS is True in updateFallbackDirs.py. - Fixes bug 20877; bugfix on 0.2.8.3-alpha. - - o Minor bugfixes (guards, bootstrapping): - - When connecting to a directory guard during bootstrap, do not mark - the guard as successful until we receive a good-looking directory - response from it. Fixes bug 20974; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (onion services): - - Fix the config reload pruning of old vs new services so it - actually works when both ephemeral and non-ephemeral services are - configured. Fixes bug 21054; bugfix on 0.3.0.1-alpha. - - Allow the number of introduction points to be as low as 0, rather - than as low as 3. Fixes bug 21033; bugfix on 0.2.7.2-alpha. - - o Minor bugfixes (IPv6): - - Make IPv6-using clients try harder to find an IPv6 directory - server. Fixes bug 20999; bugfix on 0.2.8.2-alpha. - - When IPv6 addresses have not been downloaded yet (microdesc - consensus documents don't list relay IPv6 addresses), use hard- - coded addresses for authorities, fallbacks, and configured - bridges. Now IPv6-only clients can use microdescriptors. Fixes bug - 20996; bugfix on b167e82 from 19608 in 0.2.8.5-alpha. - - o Minor bugfixes (memory leaks): - - Fix a memory leak when configuring hidden services. Fixes bug - 20987; bugfix on 0.3.0.1-alpha. - - o Minor bugfixes (portability, also in 0.2.9.9): - - Avoid crashing when Tor is built using headers that contain - CLOCK_MONOTONIC_COARSE, but then tries to run on an older kernel - without CLOCK_MONOTONIC_COARSE. Fixes bug 21035; bugfix - on 0.2.9.1-alpha. - - Fix Libevent detection on platforms without Libevent 1 headers - installed. Fixes bug 21051; bugfix on 0.2.9.1-alpha. - - o Minor bugfixes (relay): - - Honor DataDirectoryGroupReadable when tor is a relay. Previously, - initializing the keys would reset the DataDirectory to 0700 - instead of 0750 even if DataDirectoryGroupReadable was set to 1. - Fixes bug 19953; bugfix on 0.0.2pre16. Patch by "redfish". - - o Minor bugfixes (testing): - - Remove undefined behavior from the backtrace generator by removing - its signal handler. Fixes bug 21026; bugfix on 0.2.5.2-alpha. - - o Minor bugfixes (unit tests): - - Allow the unit tests to pass even when DNS lookups of bogus - addresses do not fail as expected. Fixes bug 20862 and 20863; - bugfix on unit tests introduced in 0.2.8.1-alpha - through 0.2.9.4-alpha. - - o Code simplification and refactoring: - - Refactor code to manipulate global_origin_circuit_list into - separate functions. Closes ticket 20921. - - o Documentation (formatting): - - Clean up formatting of tor.1 man page and HTML doc, where
-      blocks were incorrectly appearing. Closes ticket 20885.
-
-  o Documentation (man page):
-    - Clarify many options in tor.1 and add some min/max values for
-      HiddenService options. Closes ticket 21058.
-
-
-Changes in version 0.2.9.9 - 2017-01-23
-  Tor 0.2.9.9 fixes a denial-of-service bug where an attacker could
-  cause relays and clients to crash, even if they were not built with
-  the --enable-expensive-hardening option. This bug affects all 0.2.9.x
-  versions, and also affects 0.3.0.1-alpha: all relays running an affected
-  version should upgrade.
-
-  This release also resolves a client-side onion service reachability
-  bug, and resolves a pair of small portability issues.
-
-  o Major bugfixes (security):
-    - Downgrade the "-ftrapv" option from "always on" to "only on when
-      --enable-expensive-hardening is provided." This hardening option,
-      like others, can turn survivable bugs into crashes -- and having
-      it on by default made a (relatively harmless) integer overflow bug
-      into a denial-of-service bug. Fixes bug 21278 (TROVE-2017-001);
-      bugfix on 0.2.9.1-alpha.
-
-  o Major bugfixes (client, onion service):
-    - Fix a client-side onion service reachability bug, where multiple
-      socks requests to an onion service (or a single slow request)
-      could cause us to mistakenly mark some of the service's
-      introduction points as failed, and we cache that failure so
-      eventually we run out and can't reach the service. Also resolves a
-      mysterious "Remote server sent bogus reason code 65021" log
-      warning. The bug was introduced in ticket 17218, where we tried to
-      remember the circuit end reason as a uint16_t, which mangled
-      negative values. Partially fixes bug 21056 and fixes bug 20307;
-      bugfix on 0.2.8.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the January 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (portability):
-    - Avoid crashing when Tor is built using headers that contain
-      CLOCK_MONOTONIC_COARSE, but then tries to run on an older kernel
-      without CLOCK_MONOTONIC_COARSE. Fixes bug 21035; bugfix
-      on 0.2.9.1-alpha.
-    - Fix Libevent detection on platforms without Libevent 1 headers
-      installed. Fixes bug 21051; bugfix on 0.2.9.1-alpha.
-
-
-Changes in version 0.3.0.1-alpha - 2016-12-19
-  Tor 0.3.0.1-alpha is the first alpha release in the 0.3.0 development
-  series. It strengthens Tor's link and circuit handshakes by
-  identifying relays by their Ed25519 keys, improves the algorithm that
-  clients use to choose and maintain their list of guards, and includes
-  additional backend support for the next-generation hidden service
-  design. It also contains numerous other small features and
-  improvements to security, correctness, and performance.
-
-  Below are the changes since 0.2.9.8.
-
-  o Major features (guard selection algorithm):
-    - Tor's guard selection algorithm has been redesigned from the
-      ground up, to better support unreliable networks and restrictive
-      sets of entry nodes, and to better resist guard-capture attacks by
-      hostile local networks. Implements proposal 271; closes
-      ticket 19877.
-
-  o Major features (next-generation hidden services):
-    - Relays can now handle v3 ESTABLISH_INTRO cells as specified by
-      prop224 aka "Next Generation Hidden Services". Service and clients
-      don't use this functionality yet. Closes ticket 19043. Based on
-      initial code by Alec Heifetz.
-    - Relays now support the HSDir version 3 protocol, so that they can
-      can store and serve v3 descriptors. This is part of the next-
-      generation onion service work detailed in proposal 224. Closes
-      ticket 17238.
-
-  o Major features (protocol, ed25519 identity keys):
-    - Relays now use Ed25519 to prove their Ed25519 identities and to
-      one another, and to clients. This algorithm is faster and more
-      secure than the RSA-based handshake we've been doing until now.
-      Implements the second big part of proposal 220; Closes
-      ticket 15055.
-    - Clients now support including Ed25519 identity keys in the EXTEND2
-      cells they generate. By default, this is controlled by a consensus
-      parameter, currently disabled. You can turn this feature on for
-      testing by setting ExtendByEd25519ID in your configuration. This
-      might make your traffic appear different than the traffic
-      generated by other users, however. Implements part of ticket
-      15056; part of proposal 220.
-    - Relays now understand requests to extend to other relays by their
-      Ed25519 identity keys. When an Ed25519 identity key is included in
-      an EXTEND2 cell, the relay will only extend the circuit if the
-      other relay can prove ownership of that identity. Implements part
-      of ticket 15056; part of proposal 220.
-
-  o Major bugfixes (scheduler):
-    - Actually compare circuit policies in ewma_cmp_cmux(). This bug
-      caused the channel scheduler to behave more or less randomly,
-      rather than preferring channels with higher-priority circuits.
-      Fixes bug 20459; bugfix on 0.2.6.2-alpha.
-
-  o Minor features (controller):
-    - When HSFETCH arguments cannot be parsed, say "Invalid argument"
-      rather than "unrecognized." Closes ticket 20389; patch from
-      Ivan Markin.
-
-  o Minor features (diagnostic, directory client):
-    - Warn when we find an unexpected inconsistency in directory
-      download status objects. Prevents some negative consequences of
-      bug 20593.
-
-  o Minor features (directory authority):
-    - Add a new authority-only AuthDirTestEd25519LinkKeys option (on by
-      default) to control whether authorities should try to probe relays
-      by their Ed25519 link keys. This option will go away in a few
-      releases--unless we encounter major trouble in our ed25519 link
-      protocol rollout, in which case it will serve as a safety option.
-
-  o Minor features (directory cache):
-    - Relays and bridges will now refuse to serve the consensus they
-      have if they know it is too old for a client to use. Closes
-      ticket 20511.
-
-  o Minor features (ed25519 link handshake):
-    - Advertise support for the ed25519 link handshake using the
-      subprotocol-versions mechanism, so that clients can tell which
-      relays can identity themselves by Ed25519 ID. Closes ticket 20552.
-
-  o Minor features (fingerprinting resistance, authentication):
-    - Extend the length of RSA keys used for TLS link authentication to
-      2048 bits. (These weren't used for forward secrecy; for forward
-      secrecy, we used P256.) Closes ticket 13752.
-
-  o Minor features (infrastructure):
-    - Implement smartlist_add_strdup() function. Replaces the use of
-      smartlist_add(sl, tor_strdup(str)). Closes ticket 20048.
-
-  o Minor bugfixes (client):
-    - When clients that use bridges start up with a cached consensus on
-      disk, they were ignoring it and downloading a new one. Now they
-      use the cached one. Fixes bug 20269; bugfix on 0.2.3.12-alpha.
-
-  o Minor bugfixes (configuration):
-    - Accept non-space whitespace characters after the severity level in
-      the `Log` option. Fixes bug 19965; bugfix on 0.2.1.1-alpha.
-    - Support "TByte" and "TBytes" units in options given in bytes.
-      "TB", "terabyte(s)", "TBit(s)" and "terabit(s)" were already
-      supported. Fixes bug 20622; bugfix on 0.2.0.14-alpha.
-
-  o Minor bugfixes (consensus weight):
-    - Add new consensus method that initializes bw weights to 1 instead
-      of 0. This prevents a zero weight from making it all the way to
-      the end (happens in small testing networks) and causing an error.
-      Fixes bug 14881; bugfix on 0.2.2.17-alpha.
-
-  o Minor bugfixes (descriptors):
-    - Correctly recognise downloaded full descriptors as valid, even
-      when using microdescriptors as circuits. This affects clients with
-      FetchUselessDescriptors set, and may affect directory authorities.
-      Fixes bug 20839; bugfix on 0.2.3.2-alpha.
-
-  o Minor bugfixes (directory system):
-    - Download all consensus flavors, descriptors, and authority
-      certificates when FetchUselessDescriptors is set, regardless of
-      whether tor is a directory cache or not. Fixes bug 20667; bugfix
-      on all recent tor versions.
-    - Bridges and relays now use microdescriptors (like clients do)
-      rather than old-style router descriptors. Now bridges will blend
-      in with clients in terms of the circuits they build. Fixes bug
-      6769; bugfix on 0.2.3.2-alpha.
-
-  o Minor bugfixes (ed25519 certificates):
-    - Correctly interpret ed25519 certificates that would expire some
-      time after 19 Jan 2038. Fixes bug 20027; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Stop ignoring misconfigured hidden services. Instead, refuse to
-      start tor until the misconfigurations have been corrected. Fixes
-      bug 20559; bugfix on multiple commits in 0.2.7.1-alpha
-      and earlier.
-
-  o Minor bugfixes (memory leak at exit):
-    - Fix a small harmless memory leak at exit of the previously unused
-      RSA->Ed identity cross-certificate. Fixes bug 17779; bugfix
-      on 0.2.7.2-alpha.
-
-  o Minor bugfixes (util):
-    - When finishing writing a file to disk, if we were about to replace
-      the file with the temporary file created before and we fail to
-      replace it, remove the temporary file so it doesn't stay on disk.
-      Fixes bug 20646; bugfix on tor-0.2.0.7-alpha. Patch by fk.
-
-  o Minor bugfixes (Windows):
-    - Check for getpagesize before using it to mmap files. This fixes
-      compilation in some MinGW environments. Fixes bug 20530; bugfix on
-      0.1.2.1-alpha. Reported by "ice".
-
-  o Code simplification and refactoring:
-    - Abolish all global guard context in entrynodes.c; replace with new
-      guard_selection_t structure as preparation for proposal 271.
-      Closes ticket 19858.
-    - Introduce rend_service_is_ephemeral() that tells if given onion
-      service is ephemeral. Replace unclear NULL-checkings for service
-      directory with this function. Closes ticket 20526.
-    - Extract magic numbers in circuituse.c into defined variables.
-    - Refactor circuit_is_available_for_use to remove unnecessary check.
-    - Refactor circuit_predict_and_launch_new for readability and
-      testability. Closes ticket 18873.
-    - Refactor large if statement in purpose_needs_anonymity to use
-      switch statement instead. Closes part of ticket 20077.
-    - Refactor the hashing API to return negative values for errors, as
-      is done as throughout the codebase. Closes ticket 20717.
-    - Remove data structures that were used to index or_connection
-      objects by their RSA identity digests. These structures are fully
-      redundant with the similar structures used in the
-      channel abstraction.
-    - Remove duplicate code in the channel_write_*cell() functions.
-      Closes ticket 13827; patch from Pingl.
-    - Remove redundant behavior of is_sensitive_dir_purpose, refactor to
-      use only purpose_needs_anonymity. Closes part of ticket 20077.
-    - The code to generate and parse EXTEND and EXTEND2 cells has been
-      replaced with code automatically generated by the
-      "trunnel" utility.
-
-  o Documentation:
-    - Include the "TBits" unit in Tor's man page. Fixes part of bug
-      20622; bugfix on tor-0.2.5.1-alpha.
-    - Change '1' to 'weight_scale' in consensus bw weights calculation
-      comments, as that is reality. Closes ticket 20273. Patch
-      from pastly.
-    - Correct the value for AuthDirGuardBWGuarantee in the manpage, from
-      250 KBytes to 2 MBytes. Fixes bug 20435; bugfix
-      on tor-0.2.5.6-alpha.
-    - Stop the man page from incorrectly stating that HiddenServiceDir
-      must already exist. Fixes 20486.
-    - Clarify that when ClientRejectInternalAddresses is enabled (which
-      is the default), multicast DNS hostnames for machines on the local
-      network (of the form *.local) are also rejected. Closes
-      ticket 17070.
-
-  o Removed features:
-    - The AuthDirMaxServersPerAuthAddr option no longer exists: The same
-      limit for relays running on a single IP applies to authority IP
-      addresses as well as to non-authority IP addresses. Closes
-      ticket 20960.
-    - The UseDirectoryGuards torrc option no longer exists: all users
-      that use entry guards will also use directory guards. Related to
-      proposal 271; implements part of ticket 20831.
-
-  o Testing:
-    - New unit tests for tor_htonll(). Closes ticket 19563. Patch
-      from "overcaffeinated".
-    - Perform the coding style checks when running the tests and fail
-      when coding style violations are found. Closes ticket 5500.
-    - Add tests for networkstatus_compute_bw_weights_v10.
-    - Add unit tests circuit_predict_and_launch_new.
-    - Extract dummy_origin_circuit_new so it can be used by other
-      test functions.
-
-
-Changes in version 0.2.8.12 - 2016-12-19
-  Tor 0.2.8.12 backports a fix for a medium-severity issue (bug 21018
-  below) where Tor clients could crash when attempting to visit a
-  hostile hidden service. Clients are recommended to upgrade as packages
-  become available for their systems.
-
-  It also includes an updated list of fallback directories, backported
-  from 0.2.9.
-
-  Now that the Tor 0.2.9 series is stable, only major bugfixes will be
-  backported to 0.2.8 in the future.
-
-  o Major bugfixes (parsing, security, backported from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Minor features (fallback directory list, backported from 0.2.9.8):
-    - Replace the 81 remaining fallbacks of the 100 originally
-      introduced in Tor 0.2.8.3-alpha in March 2016, with a list of 177
-      fallbacks (123 new, 54 existing, 27 removed) generated in December
-      2016. Resolves ticket 20170.
-
-  o Minor features (geoip, backported from 0.2.9.7-rc):
-    - Update geoip and geoip6 to the December 7 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.9.8 - 2016-12-19
-  Tor 0.2.9.8 is the first stable release of the Tor 0.2.9 series.
-
-  The Tor 0.2.9 series makes mandatory a number of security features
-  that were formerly optional. It includes support for a new shared-
-  randomness protocol that will form the basis for next generation
-  hidden services, includes a single-hop hidden service mode for
-  optimizing .onion services that don't actually want to be hidden,
-  tries harder not to overload the directory authorities with excessive
-  downloads, and supports a better protocol versioning scheme for
-  improved compatibility with other implementations of the Tor protocol.
-
-  And of course, there are numerous other bugfixes and improvements.
-
-  This release also includes a fix for a medium-severity issue (bug
-  21018 below) where Tor clients could crash when attempting to visit a
-  hostile hidden service. Clients are recommended to upgrade as packages
-  become available for their systems.
-
-  Below are the changes since 0.2.9.7-rc. For a list of all changes
-  since 0.2.8, see the ReleaseNotes file.
-
-  o Major bugfixes (parsing, security):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Minor features (fallback directory list):
-    - Replace the 81 remaining fallbacks of the 100 originally
-      introduced in Tor 0.2.8.3-alpha in March 2016, with a list of 177
-      fallbacks (123 new, 54 existing, 27 removed) generated in December
-      2016. Resolves ticket 20170.
-
-
-Changes in version 0.2.9.7-rc - 2016-12-12
-  Tor 0.2.9.7-rc fixes a few small bugs remaining in Tor 0.2.9.6-rc,
-  including a few that had prevented tests from passing on
-  some platforms.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the December 7 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfix (build):
-    - The current Git revision when building from a local repository is
-      now detected correctly when using git worktrees. Fixes bug 20492;
-      bugfix on 0.2.3.9-alpha.
-
-  o Minor bugfixes (directory authority):
-    - When computing old Tor protocol line version in protover, we were
-      looking at 0.2.7.5 twice instead of a specific case for
-      0.2.9.1-alpha. Fixes bug 20810; bugfix on 0.2.9.4-alpha.
-
-  o Minor bugfixes (download scheduling):
-    - Resolve a "bug" warning when considering a download schedule whose
-      delay had approached INT_MAX. Fixes 20875; bugfix on 0.2.9.5-alpha.
-
-  o Minor bugfixes (logging):
-    - Downgrade a harmless log message about the
-      pending_entry_connections list from "warn" to "info". Mitigates
-      bug 19926.
-
-  o Minor bugfixes (memory leak):
-    - Fix a small memory leak when receiving AF_UNIX connections on a
-      SocksPort. Fixes bug 20716; bugfix on 0.2.6.3-alpha.
-    - When moving a signed descriptor object from a source to an
-      existing destination, free the allocated memory inside that
-      destination object. Fixes bug 20715; bugfix on 0.2.8.3-alpha.
-
-  o Minor bugfixes (memory leak, use-after-free, linux seccomp2 sandbox):
-    - Fix a memory leak and use-after-free error when removing entries
-      from the sandbox's getaddrinfo() cache. Fixes bug 20710; bugfix on
-      0.2.5.5-alpha. Patch from "cypherpunks".
-
-  o Minor bugfixes (portability):
-    - Use the correct spelling of MAC_OS_X_VERSION_10_12 on configure.ac
-      Fixes bug 20935; bugfix on 0.2.9.6-rc.
-
-  o Minor bugfixes (unit tests):
-    - Stop expecting NetBSD unit tests to report success for ipfw. Part
-      of a fix for bug 19960; bugfix on 0.2.9.5-alpha.
-    - Fix tolerances in unit tests for monotonic time comparisons
-      between nanoseconds and microseconds. Previously, we accepted a 10
-      us difference only, which is not realistic on every platform's
-      clock_gettime(). Fixes bug 19974; bugfix on 0.2.9.1-alpha.
-    - Remove a double-free in the single onion service unit test. Stop
-      ignoring a return value. Make future changes less error-prone.
-      Fixes bug 20864; bugfix on 0.2.9.6-rc.
-
-
-Changes in version 0.2.8.11 - 2016-12-08
-  Tor 0.2.8.11 backports fixes for additional portability issues that
-  could prevent Tor from building correctly on OSX Sierra, or with
-  OpenSSL 1.1. Affected users should upgrade; others can safely stay
-  with 0.2.8.10.
-
-  o Minor bugfixes (portability):
-    - Avoid compilation errors when building on OSX Sierra. Sierra began
-      to support the getentropy() and clock_gettime() APIs, but created
-      a few problems in doing so. Tor 0.2.9 has a more thorough set of
-      workarounds; in 0.2.8, we are just using the /dev/urandom and mach
-      monotonic time interfaces. Fixes bug 20865. Bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (portability, backport from 0.2.9.5-alpha):
-    - Fix compilation with OpenSSL 1.1 and less commonly-used CPU
-      architectures. Closes ticket 20588.
-
-
-Changes in version 0.2.8.10 - 2016-12-02
-  Tor 0.2.8.10 backports a fix for a bug that would sometimes make clients
-  unusable after they left standby mode. It also backports fixes for
-  a few portability issues and a small but problematic memory leak.
-
-  o Major bugfixes (client reliability, backport from 0.2.9.5-alpha):
-    - When Tor leaves standby because of a new application request, open
-      circuits as needed to serve that request. Previously, we would
-      potentially wait a very long time. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Major bugfixes (client performance, backport from 0.2.9.5-alpha):
-    - Clients now respond to new application stream requests immediately
-      when they arrive, rather than waiting up to one second before
-      starting to handle them. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (portability, backport from 0.2.9.6-rc):
-    - Work around a bug in the OSX 10.12 SDK that would prevent us from
-      successfully targeting earlier versions of OSX. Resolves
-      ticket 20235.
-
-  o Minor bugfixes (portability, backport from 0.2.9.5-alpha):
-    - Fix implicit conversion warnings under OpenSSL 1.1. Fixes bug
-      20551; bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (relay, backport from 0.2.9.5-alpha):
-    - Work around a memory leak in OpenSSL 1.1 when encoding public
-      keys. Fixes bug 20553; bugfix on 0.0.2pre8.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 3 2016 Maxmind GeoLite2
-      Country database.
-
-Changes in version 0.2.9.6-rc - 2016-12-02
-  Tor 0.2.9.6-rc fixes a few remaining bugs found in the previous alpha
-  version. We hope that it will be ready to become stable soon, and we
-  encourage everyone to test this release. If no showstopper bugs are
-  found here, the next 0.2.9 release will be stable.
-
-  o Major bugfixes (relay, resolver, logging):
-    - For relays that don't know their own address, avoid attempting a
-      local hostname resolve for each descriptor we download. This
-      will cut down on the number of "Success: chose address 'x.x.x.x'"
-      log lines, and also avoid confusing clock jumps if the resolver
-      is slow. Fixes bugs 20423 and 20610; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (client, fascistfirewall):
-    - Avoid spurious warnings when ReachableAddresses or FascistFirewall
-      is set. Fixes bug 20306; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Stop ignoring the anonymity status of saved keys for hidden
-      services and single onion services when first starting tor.
-      Instead, refuse to start tor if any hidden service key has been
-      used in a different hidden service anonymity mode. Fixes bug
-      20638; bugfix on 17178 in 0.2.9.3-alpha; reported by ahf.
-
-  o Minor bugfixes (portability):
-    - Work around a bug in the OSX 10.12 SDK that would prevent us from
-      successfully targeting earlier versions of OSX. Resolves
-      ticket 20235.
-    - Run correctly when built on Windows build environments that
-      require _vcsprintf(). Fixes bug 20560; bugfix on 0.2.2.11-alpha.
-
-  o Minor bugfixes (single onion services, Tor2web):
-    - Stop complaining about long-term one-hop circuits deliberately
-      created by single onion services and Tor2web. These log messages
-      are intended to diagnose issue 8387, which relates to circuits
-      hanging around forever for no reason. Fixes bug 20613; bugfix on
-      0.2.9.1-alpha. Reported by "pastly".
-
-  o Minor bugfixes (unit tests):
-    - Stop spurious failures in the local interface address discovery
-      unit tests. Fixes bug 20634; bugfix on 0.2.8.1-alpha; patch by
-      Neel Chauhan.
-
-  o Documentation:
-    - Correct the minimum bandwidth value in torrc.sample, and queue a
-      corresponding change for torrc.minimal. Closes ticket 20085.
-
-
-Changes in version 0.2.9.5-alpha - 2016-11-08
-  Tor 0.2.9.5-alpha fixes numerous bugs discovered in the previous alpha
-  version. We believe one or two probably remain, and we encourage
-  everyone to test this release.
-
-  o Major bugfixes (client performance):
-    - Clients now respond to new application stream requests immediately
-      when they arrive, rather than waiting up to one second before
-      starting to handle them. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Major bugfixes (client reliability):
-    - When Tor leaves standby because of a new application request, open
-      circuits as needed to serve that request. Previously, we would
-      potentially wait a very long time. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Major bugfixes (download scheduling):
-    - When using an exponential backoff schedule, do not give up on
-      downloading just because we have failed a bunch of times. Since
-      each delay is longer than the last, retrying indefinitely won't
-      hurt. Fixes bug 20536; bugfix on 0.2.9.1-alpha.
-    - If a consensus expires while we are waiting for certificates to
-      download, stop waiting for certificates.
-    - If we stop waiting for certificates less than a minute after we
-      started downloading them, do not consider the certificate download
-      failure a separate failure. Fixes bug 20533; bugfix
-      on 0.2.0.9-alpha.
-    - Remove the maximum delay on exponential-backoff scheduling. Since
-      we now allow an infinite number of failures (see ticket 20536), we
-      must now allow the time to grow longer on each failure. Fixes part
-      of bug 20534; bugfix on 0.2.9.1-alpha.
-    - Make our initial download delays closer to those from 0.2.8. Fixes
-      another part of bug 20534; bugfix on 0.2.9.1-alpha.
-    - When determining when to download a directory object, handle times
-      after 2038 if the operating system supports them. (Someday this
-      will be important!) Fixes bug 20587; bugfix on 0.2.8.1-alpha.
-    - When using exponential backoff in test networks, use a lower
-      exponent, so the delays do not vary as much. This helps test
-      networks bootstrap consistently. Fixes bug 20597; bugfix on 20499.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 3 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (client directory scheduling):
-    - Treat "relay too busy to answer request" as a failed request and a
-      reason to back off on our retry frequency. This is safe now that
-      exponential backoffs retry indefinitely, and avoids a bug where we
-      would reset our download schedule erroneously. Fixes bug 20593;
-      bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (client, logging):
-    - Remove a BUG warning in circuit_pick_extend_handshake(). Instead,
-      assume all nodes support EXTEND2. Use ntor whenever a key is
-      available. Fixes bug 20472; bugfix on 0.2.9.3-alpha.
-    - On DNSPort, stop logging a BUG warning on a failed hostname
-      lookup. Fixes bug 19869; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (hidden services):
-    - When configuring hidden services, check every hidden service
-      directory's permissions. Previously, we only checked the last
-      hidden service. Fixes bug 20529; bugfix the work to fix 13942
-      in 0.2.6.2-alpha.
-
-  o Minor bugfixes (portability):
-    - Fix compilation with OpenSSL 1.1 and less commonly-used CPU
-      architectures. Closes ticket 20588.
-    - Use ECDHE ciphers instead of ECDH in tortls tests. LibreSSL has
-      removed the ECDH ciphers which caused the tests to fail on
-      platforms which use it. Fixes bug 20460; bugfix on 0.2.8.1-alpha.
-    - Fix implicit conversion warnings under OpenSSL 1.1. Fixes bug
-      20551; bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (relay bootstrap):
-    - Ensure relays don't make multiple connections during bootstrap.
-      Fixes bug 20591; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (relay):
-    - Work around a memory leak in OpenSSL 1.1 when encoding public
-      keys. Fixes bug 20553; bugfix on 0.0.2pre8.
-    - Avoid a small memory leak when informing worker threads about
-      rotated onion keys. Fixes bug 20401; bugfix on 0.2.6.3-alpha.
-    - Do not try to parallelize workers more than 16x without the user
-      explicitly configuring us to do so, even if we do detect more than
-      16 CPU cores. Fixes bug 19968; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (single onion services):
-    - Start correctly when creating a single onion service in a
-      directory that did not previously exist. Fixes bug 20484; bugfix
-      on 0.2.9.3-alpha.
-
-  o Minor bugfixes (testing):
-    - Avoid a unit test failure on systems with over 16 detectable CPU
-      cores. Fixes bug 19968; bugfix on 0.2.3.1-alpha.
-
-  o Documentation:
-    - Clarify that setting HiddenServiceNonAnonymousMode requires you to
-      also set "SOCKSPort 0". Fixes bug 20487; bugfix on 0.2.9.3-alpha.
-    - Module-level documentation for several more modules. Closes
-      tickets 19287 and 19290.
-
-
-Changes in version 0.2.8.9 - 2016-10-17
-  Tor 0.2.8.9 backports a fix for a security hole in previous versions
-  of Tor that would allow a remote attacker to crash a Tor client,
-  hidden service, relay, or authority. All Tor users should upgrade to
-  this version, or to 0.2.9.4-alpha. Patches will be released for older
-  versions of Tor.
-
-  o Major features (security fixes, also in 0.2.9.4-alpha):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.9.4-alpha - 2016-10-17
-  Tor 0.2.9.4-alpha fixes a security hole in previous versions of Tor
-  that would allow a remote attacker to crash a Tor client, hidden
-  service, relay, or authority. All Tor users should upgrade to this
-  version, or to 0.2.8.9. Patches will be released for older versions
-  of Tor.
-
-  Tor 0.2.9.4-alpha also adds numerous small features and fix-ups to
-  previous versions of Tor, including the implementation of a feature to
-  future- proof the Tor ecosystem against protocol changes, some bug
-  fixes necessary for Tor Browser to use unix domain sockets correctly,
-  and several portability improvements. We anticipate that this will be
-  the last alpha in the Tor 0.2.9 series, and that the next release will
-  be a release candidate.
-
-  o Major features (security fixes):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Major features (subprotocol versions):
-    - Tor directory authorities now vote on a set of recommended
-      subprotocol versions, and on a set of required subprotocol
-      versions. Clients and relays that lack support for a _required_
-      subprotocol version will not start; those that lack support for a
-      _recommended_ subprotocol version will warn the user to upgrade.
-      Closes ticket 19958; implements part of proposal 264.
-    - Tor now uses "subprotocol versions" to indicate compatibility.
-      Previously, versions of Tor looked at the declared Tor version of
-      a relay to tell whether they could use a given feature. Now, they
-      should be able to rely on its declared subprotocol versions. This
-      change allows compatible implementations of the Tor protocol(s) to
-      exist without pretending to be 100% bug-compatible with particular
-      releases of Tor itself. Closes ticket 19958; implements part of
-      proposal 264.
-
-  o Minor feature (fallback directories):
-    - Remove broken fallbacks from the hard-coded fallback directory
-      list. Closes ticket 20190; patch by teor.
-
-  o Minor features (client, directory):
-    - Since authorities now omit all routers that lack the Running and
-      Valid flags, we assume that any relay listed in the consensus must
-      have those flags. Closes ticket 20001; implements part of
-      proposal 272.
-
-  o Minor features (compilation, portability):
-    - Compile correctly on MacOS 10.12 (aka "Sierra"). Closes
-      ticket 20241.
-
-  o Minor features (development tools, etags):
-    - Teach the "make tags" Makefile target how to correctly find
-      "MOCK_IMPL" function definitions. Patch from nherring; closes
-      ticket 16869.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (unix domain sockets):
-    - When configuring a unix domain socket for a SocksPort,
-      ControlPort, or Hidden service, you can now wrap the address in
-      quotes, using C-style escapes inside the quotes. This allows unix
-      domain socket paths to contain spaces.
-
-  o Minor features (virtual addresses):
-    - Increase the maximum number of bits for the IPv6 virtual network
-      prefix from 16 to 104. In this way, the condition for address
-      allocation is less restrictive. Closes ticket 20151; feature
-      on 0.2.4.7-alpha.
-
-  o Minor bugfixes (address discovery):
-    - Stop reordering IP addresses returned by the OS. This makes it
-      more likely that Tor will guess the same relay IP address every
-      time. Fixes issue 20163; bugfix on 0.2.7.1-alpha, ticket 17027.
-      Reported by René Mayrhofer, patch by "cypherpunks".
-
-  o Minor bugfixes (client, unix domain sockets):
-    - Disable IsolateClientAddr when using AF_UNIX backed SocksPorts as
-      the client address is meaningless. Fixes bug 20261; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (compilation, OpenBSD):
-    - Detect Libevent2 functions correctly on systems that provide
-      libevent2, but where libevent1 is linked with -levent. Fixes bug
-      19904; bugfix on 0.2.2.24-alpha. Patch from Rubiate.
-
-  o Minor bugfixes (configuration):
-    - When parsing quoted configuration values from the torrc file,
-      handle windows line endings correctly. Fixes bug 19167; bugfix on
-      0.2.0.16-alpha. Patch from "Pingl".
-
-  o Minor bugfixes (getpass):
-    - Defensively fix a non-triggerable heap corruption at do_getpass()
-      to protect ourselves from mistakes in the future. Fixes bug
-      19223; bugfix on 0.2.7.3-rc. Bug found by Guido Vranken, patch
-      by nherring.
-
-  o Minor bugfixes (hidden service):
-    - Allow hidden services to run on IPv6 addresses even when the
-      IPv6Exit option is not set. Fixes bug 18357; bugfix
-      on 0.2.4.7-alpha.
-
-  o Documentation:
-    - Add module-level internal documentation for 36 C files that
-      previously didn't have a high-level overview. Closes ticket #20385.
-
-  o Required libraries:
-    - When building with OpenSSL, Tor now requires version 1.0.1 or
-      later. OpenSSL 1.0.0 and earlier are no longer supported by the
-      OpenSSL team, and should not be used. Closes ticket 20303.
-
-
-Changes in version 0.2.9.3-alpha - 2016-09-23
-  Tor 0.2.9.3-alpha adds improved support for entities that want to make
-  high-performance services available through the Tor .onion mechanism
-  without themselves receiving anonymity as they host those services. It
-  also tries harder to ensure that all steps on a circuit are using the
-  strongest crypto possible, strengthens some TLS properties, and
-  resolves several bugs -- including a pair of crash bugs from the 0.2.8
-  series. Anybody running an earlier version of 0.2.9.x should upgrade.
-
-  o Major bugfixes (crash, also in 0.2.8.8):
-    - Fix a complicated crash bug that could affect Tor clients
-      configured to use bridges when replacing a networkstatus consensus
-      in which one of their bridges was mentioned. OpenBSD users saw
-      more crashes here, but all platforms were potentially affected.
-      Fixes bug 20103; bugfix on 0.2.8.2-alpha.
-
-  o Major bugfixes (relay, OOM handler, also in 0.2.8.8):
-    - Fix a timing-dependent assertion failure that could occur when we
-      tried to flush from a circuit after having freed its cells because
-      of an out-of-memory condition. Fixes bug 20203; bugfix on
-      0.2.8.1-alpha. Thanks to "cypherpunks" for help diagnosing
-      this one.
-
-  o Major features (circuit building, security):
-    - Authorities, relays and clients now require ntor keys in all
-      descriptors, for all hops (except for rare hidden service protocol
-      cases), for all circuits, and for all other roles. Part of
-      ticket 19163.
-    - Tor authorities, relays, and clients only use ntor, except for
-      rare cases in the hidden service protocol. Part of ticket 19163.
-
-  o Major features (single-hop "hidden" services):
-    - Add experimental HiddenServiceSingleHopMode and
-      HiddenServiceNonAnonymousMode options. When both are set to 1,
-      every hidden service on a Tor instance becomes a non-anonymous
-      Single Onion Service. Single Onions make one-hop (direct)
-      connections to their introduction and renzedvous points. One-hop
-      circuits make Single Onion servers easily locatable, but clients
-      remain location-anonymous. This is compatible with the existing
-      hidden service implementation, and works on the current tor
-      network without any changes to older relays or clients. Implements
-      proposal 260, completes ticket 17178. Patch by teor and asn.
-
-  o Major features (resource management):
-    - Tor can now notice it is about to run out of sockets, and
-      preemptively close connections of lower priority. (This feature is
-      off by default for now, since the current prioritizing method is
-      yet not mature enough. You can enable it by setting
-      "DisableOOSCheck 0", but watch out: it might close some sockets
-      you would rather have it keep.) Closes ticket 18640.
-
-  o Major bugfixes (circuit building):
-    - Hidden service client-to-intro-point and service-to-rendezvous-
-      point circuits use the TAP key supplied by the protocol, to avoid
-      epistemic attacks. Fixes bug 19163; bugfix on 0.2.4.18-rc.
-
-  o Major bugfixes (compilation, OpenBSD):
-    - Fix a Libevent-detection bug in our autoconf script that would
-      prevent Tor from linking successfully on OpenBSD. Patch from
-      rubiate. Fixes bug 19902; bugfix on 0.2.9.1-alpha.
-
-  o Major bugfixes (hidden services):
-    - Clients now require hidden services to include the TAP keys for
-      their intro points in the hidden service descriptor. This prevents
-      an inadvertent upgrade to ntor, which a malicious hidden service
-      could use to distinguish clients by consensus version. Fixes bug
-      20012; bugfix on 0.2.4.8-alpha. Patch by teor.
-
-  o Minor features (security, TLS):
-    - Servers no longer support clients that without AES ciphersuites.
-      (3DES is no longer considered an acceptable cipher.) We believe
-      that no such Tor clients currently exist, since Tor has required
-      OpenSSL 0.9.7 or later since 2009. Closes ticket 19998.
-
-  o Minor feature (fallback directories):
-    - Remove 8 fallbacks that are no longer suitable, leaving 81 of the
-      100 fallbacks originally introduced in Tor 0.2.8.2-alpha in March
-      2016. Closes ticket 20190; patch by teor.
-
-  o Minor features (geoip, also in 0.2.8.8):
-    - Update geoip and geoip6 to the September 6 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor feature (port flags):
-    - Add new flags to the *Port options to finer control over which
-      requests are allowed. The flags are NoDNSRequest, NoOnionTraffic,
-      and the synthetic flag OnionTrafficOnly, which is equivalent to
-      NoDNSRequest, NoIPv4Traffic, and NoIPv6Traffic. Closes enhancement
-      18693; patch by "teor".
-
-  o Minor features (directory authority):
-    - After voting, if the authorities decide that a relay is not
-      "Valid", they no longer include it in the consensus at all. Closes
-      ticket 20002; implements part of proposal 272.
-
-  o Minor features (testing):
-    - Disable memory protections on OpenBSD when performing our unit
-      tests for memwipe(). The test deliberately invokes undefined
-      behavior, and the OpenBSD protections interfere with this. Patch
-      from "rubiate". Closes ticket 20066.
-
-  o Minor features (testing, ipv6):
-    - Add the single-onion and single-onion-ipv6 chutney targets to
-      "make test-network-all". This requires a recent chutney version
-      with the single onion network flavours (git c72a652 or later).
-      Closes ticket 20072; patch by teor.
-    - Add the hs-ipv6 chutney target to make test-network-all's IPv6
-      tests. Remove bridges+hs, as it's somewhat redundant. This
-      requires a recent chutney version that supports IPv6 clients,
-      relays, and authorities. Closes ticket 20069; patch by teor.
-
-  o Minor features (Tor2web):
-    - Make Tor2web clients respect ReachableAddresses. This feature was
-      inadvertently enabled in 0.2.8.6, then removed by bugfix 19973 on
-      0.2.8.7. Implements feature 20034. Patch by teor.
-
-  o Minor features (unit tests):
-    - We've done significant work to make the unit tests run faster.
-    - Our link-handshake unit tests now check that when invalid
-      handshakes fail, they fail with the error messages we expected.
-    - Our unit testing code that captures log messages no longer
-      prevents them from being written out if the user asked for them
-      (by passing --debug or --info or or --notice --warn to the "test"
-      binary). This change prevents us from missing unexpected log
-      messages simply because we were looking for others. Related to
-      ticket 19999.
-    - The unit tests now log all warning messages with the "BUG" flag.
-      Previously, they only logged errors by default. This change will
-      help us make our testing code more correct, and make sure that we
-      only hit this code when we mean to. In the meantime, however,
-      there will be more warnings in the unit test logs than before.
-      This is preparatory work for ticket 19999.
-    - The unit tests now treat any failure of a "tor_assert_nonfatal()"
-      assertion as a test failure.
-
-  o Minor bug fixes (circuits):
-    - Use the CircuitBuildTimeout option whenever
-      LearnCircuitBuildTimeout is disabled. Previously, we would respect
-      the option when a user disabled it, but not when it was disabled
-      because some other option was set. Fixes bug 20073; bugfix on
-      0.2.4.12-alpha. Patch by teor.
-
-  o Minor bugfixes (allocation):
-    - Change how we allocate memory for large chunks on buffers, to
-      avoid a (currently impossible) integer overflow, and to waste less
-      space when allocating unusually large chunks. Fixes bug 20081;
-      bugfix on 0.2.0.16-alpha. Issue identified by Guido Vranken.
-    - Always include orconfig.h before including any other C headers.
-      Sometimes, it includes macros that affect the behavior of the
-      standard headers. Fixes bug 19767; bugfix on 0.2.9.1-alpha (the
-      first version to use AC_USE_SYSTEM_EXTENSIONS).
-    - Fix a syntax error in the IF_BUG_ONCE__() macro in non-GCC-
-      compatible compilers. Fixes bug 20141; bugfix on 0.2.9.1-alpha.
-      Patch from Gisle Vanem.
-    - Stop trying to build with Clang 4.0's -Wthread-safety warnings.
-      They apparently require a set of annotations that we aren't
-      currently using, and they create false positives in our pthreads
-      wrappers. Fixes bug 20110; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (directory authority):
-    - Die with a more useful error when the operator forgets to place
-      the authority_signing_key file into the keys directory. This
-      avoids an uninformative assert & traceback about having an invalid
-      key. Fixes bug 20065; bugfix on 0.2.0.1-alpha.
-    - When allowing private addresses, mark Exits that only exit to
-      private locations as such. Fixes bug 20064; bugfix
-      on 0.2.2.9-alpha.
-
-  o Minor bugfixes (documentation):
-    - Document the default PathsNeededToBuildCircuits value that's used
-      by clients when the directory authorities don't set
-      min_paths_for_circs_pct. Fixes bug 20117; bugfix on 02c320916e02
-      in 0.2.4.10-alpha. Patch by teor, reported by Jesse V.
-    - Fix manual for the User option: it takes a username, not a UID.
-      Fixes bug 19122; bugfix on 0.0.2pre16 (the first version to have
-      a manpage!).
-
-  o Minor bugfixes (hidden services):
-    - Stop logging intro point details to the client log on certain
-      error conditions. Fixed as part of bug 20012; bugfix on
-      0.2.4.8-alpha. Patch by teor.
-
-  o Minor bugfixes (IPv6, testing):
-    - Check for IPv6 correctly on Linux when running test networks.
-      Fixes bug 19905; bugfix on 0.2.7.3-rc; patch by teor.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Add permission to run the sched_yield() and sigaltstack() system
-      calls, in order to support versions of Tor compiled with asan or
-      ubsan code that use these calls. Now "sandbox 1" and
-      "--enable-expensive-hardening" should be compatible on more
-      systems. Fixes bug 20063; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (logging):
-    - When logging a message from the BUG() macro, be explicit about
-      what we were asserting. Previously we were confusing what we were
-      asserting with what the bug was. Fixes bug 20093; bugfix
-      on 0.2.9.1-alpha.
-    - When we are unable to remove the bw_accounting file, do not warn
-      if the reason we couldn't remove it was that it didn't exist.
-      Fixes bug 19964; bugfix on 0.2.5.4-alpha. Patch from 'pastly'.
-
-  o Minor bugfixes (option parsing):
-    - Count unix sockets when counting client listeners (SOCKS, Trans,
-      NATD, and DNS). This has no user-visible behaviour changes: these
-      options are set once, and never read. Required for correct
-      behaviour in ticket 17178. Fixes bug 19677; bugfix on
-      0.2.6.3-alpha. Patch by teor.
-
-  o Minor bugfixes (options):
-    - Check the consistency of UseEntryGuards and EntryNodes more
-      reliably. Fixes bug 20074; bugfix on 0.2.4.12-alpha. Patch
-      by teor.
-    - Stop changing the configured value of UseEntryGuards on
-      authorities and Tor2web clients. Fixes bug 20074; bugfix on
-      commits 51fc6799 in 0.1.1.16-rc and acda1735 in 0.2.4.3-alpha.
-      Patch by teor.
-
-  o Minor bugfixes (Tor2web):
-    - Prevent Tor2web clients running hidden services, these services
-      are not anonymous due to the one-hop client paths. Fixes bug
-      19678. Patch by teor.
-
-  o Minor bugfixes (unit tests):
-    - Fix a shared-random unit test that was failing on big endian
-      architectures due to internal representation of a integer copied
-      to a buffer. The test is changed to take a full 32 bytes of data
-      and use the output of a python script that make the COMMIT and
-      REVEAL calculation according to the spec. Fixes bug 19977; bugfix
-      on 0.2.9.1-alpha.
-    - The tor_tls_server_info_callback unit test no longer crashes when
-      debug-level logging is turned on. Fixes bug 20041; bugfix
-      on 0.2.8.1-alpha.
-
-
-Changes in version 0.2.8.8 - 2016-09-23
-  Tor 0.2.8.8 fixes two crash bugs present in previous versions of the
-  0.2.8.x series. Relays running 0.2.8.x should upgrade, as should users
-  who select public relays as their bridges.
-
-  o Major bugfixes (crash):
-    - Fix a complicated crash bug that could affect Tor clients
-      configured to use bridges when replacing a networkstatus consensus
-      in which one of their bridges was mentioned. OpenBSD users saw
-      more crashes here, but all platforms were potentially affected.
-      Fixes bug 20103; bugfix on 0.2.8.2-alpha.
-
-  o Major bugfixes (relay, OOM handler):
-    - Fix a timing-dependent assertion failure that could occur when we
-      tried to flush from a circuit after having freed its cells because
-      of an out-of-memory condition. Fixes bug 20203; bugfix on
-      0.2.8.1-alpha. Thanks to "cypherpunks" for help diagnosing
-      this one.
-
-  o Minor feature (fallback directories):
-    - Remove 8 fallbacks that are no longer suitable, leaving 81 of the
-      100 fallbacks originally introduced in Tor 0.2.8.2-alpha in March
-      2016. Closes ticket 20190; patch by teor.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the September 6 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.9.2-alpha - 2016-08-24
-  Tor 0.2.9.2-alpha continues development of the 0.2.9 series with
-  several new features and bugfixes. It also includes an important
-  authority update and an important bugfix from 0.2.8.7. Everyone who
-  sets the ReachableAddresses option, and all bridges, are strongly
-  encouraged to upgrade to 0.2.8.7, or to 0.2.9.2-alpha.
-
-  o Directory authority changes (also in 0.2.8.7):
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Major bugfixes (client, security, also in 0.2.8.7):
-    - Only use the ReachableAddresses option to restrict the first hop
-      in a path. In earlier versions of 0.2.8.x, it would apply to
-      every hop in the path, with a possible degradation in anonymity
-      for anyone using an uncommon ReachableAddress setting. Fixes bug
-      19973; bugfix on 0.2.8.2-alpha.
-
-  o Major features (user interface):
-    - Tor now supports the ability to declare options deprecated, so
-      that we can recommend that people stop using them. Previously,
-      this was done in an ad-hoc way. Closes ticket 19820.
-
-  o Major bugfixes (directory downloads):
-    - Avoid resetting download status for consensuses hourly, since we
-      already have another, smarter retry mechanism. Fixes bug 8625;
-      bugfix on 0.2.0.9-alpha.
-
-  o Minor features (config):
-    - Warn users when descriptor and port addresses are inconsistent.
-      Mitigates bug 13953; patch by teor.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 2 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (user interface):
-    - There is a new --list-deprecated-options command-line option to
-      list all of the deprecated options. Implemented as part of
-      ticket 19820.
-
-  o Minor bugfixes (code style):
-    - Fix an integer signedness conversion issue in the case conversion
-      tables. Fixes bug 19168; bugfix on 0.2.1.11-alpha.
-
-  o Minor bugfixes (compilation):
-    - Build correctly on versions of libevent2 without support for
-      evutil_secure_rng_add_bytes(). Fixes bug 19904; bugfix
-      on 0.2.5.4-alpha.
-    - Fix a compilation warning on GCC versions before 4.6. Our
-      ENABLE_GCC_WARNING macro used the word "warning" as an argument,
-      when it is also required as an argument to the compiler pragma.
-      Fixes bug 19901; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (compilation, also in 0.2.8.7):
-    - Remove an inappropriate "inline" in tortls.c that was causing
-      warnings on older versions of GCC. Fixes bug 19903; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (fallback directories, also in 0.2.8.7):
-    - Avoid logging a NULL string pointer when loading fallback
-      directory information. Fixes bug 19947; bugfix on 0.2.4.7-alpha
-      and 0.2.8.1-alpha. Report and patch by "rubiate".
-
-  o Minor bugfixes (logging):
-    - Log a more accurate message when we fail to dump a microdescriptor.
-      Fixes bug 17758; bugfix on 0.2.2.8-alpha. Patch from Daniel Pinto.
-
-  o Minor bugfixes (memory leak):
-    - Fix a series of slow memory leaks related to parsing torrc files
-      and options. Fixes bug 19466; bugfix on 0.2.1.6-alpha.
-
-  o Deprecated features:
-    - A number of DNS-cache-related sub-options for client ports are now
-      deprecated for security reasons, and may be removed in a future
-      version of Tor. (We believe that client-side DNS cacheing is a bad
-      idea for anonymity, and you should not turn it on.) The options
-      are: CacheDNS, CacheIPv4DNS, CacheIPv6DNS, UseDNSCache,
-      UseIPv4Cache, and UseIPv6Cache.
-    - A number of options are deprecated for security reasons, and may
-      be removed in a future version of Tor. The options are:
-      AllowDotExit, AllowInvalidNodes, AllowSingleHopCircuits,
-      AllowSingleHopExits, ClientDNSRejectInternalAddresses,
-      CloseHSClientCircuitsImmediatelyOnTimeout,
-      CloseHSServiceRendCircuitsImmediatelyOnTimeout,
-      ExcludeSingleHopRelays, FastFirstHopPK, TLSECGroup,
-      UseNTorHandshake, and WarnUnsafeSocks.
-    - The *ListenAddress options are now deprecated as unnecessary: the
-      corresponding *Port options should be used instead. These options
-      may someday be removed. The affected options are:
-      ControlListenAddress, DNSListenAddress, DirListenAddress,
-      NATDListenAddress, ORListenAddress, SocksListenAddress,
-      and TransListenAddress.
-
-  o Documentation:
-    - Correct the IPv6 syntax in our documentation for the
-      VirtualAddrNetworkIPv6 torrc option. Closes ticket 19743.
-
-  o Removed code:
-    - We no longer include the (dead, deprecated) bufferevent code in
-      Tor. Closes ticket 19450. Based on a patch from U+039b.
-
-
-Changes in version 0.2.8.7 - 2016-08-24
-  Tor 0.2.8.7 fixes an important bug related to the ReachableAddresses
-  option in 0.2.8.6, and replaces a retiring bridge authority. Everyone
-  who sets the ReachableAddresses option, and all bridges, are strongly
-  encouraged to upgrade.
-
-  o Directory authority changes:
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Major bugfixes (client, security):
-    - Only use the ReachableAddresses option to restrict the first hop
-      in a path. In earlier versions of 0.2.8.x, it would apply to
-      every hop in the path, with a possible degradation in anonymity
-      for anyone using an uncommon ReachableAddress setting. Fixes bug
-      19973; bugfix on 0.2.8.2-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 2 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - Remove an inappropriate "inline" in tortls.c that was causing
-      warnings on older versions of GCC. Fixes bug 19903; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (fallback directories):
-    - Avoid logging a NULL string pointer when loading fallback
-      directory information. Fixes bug 19947; bugfix on 0.2.4.7-alpha
-      and 0.2.8.1-alpha. Report and patch by "rubiate".
-
-
-Changes in version 0.2.9.1-alpha - 2016-08-08
-  Tor 0.2.9.1-alpha is the first alpha release in the 0.2.9 development
-  series. It improves our support for hardened builds and compiler
-  warnings, deploys some critical infrastructure for improvements to
-  hidden services, includes a new timing backend that we hope to use for
-  better support for traffic padding, makes it easier for programmers to
-  log unexpected events, and contains other small improvements to
-  security, correctness, and performance.
-
-  Below are the changes since 0.2.8.6.
-
-  o New system requirements:
-    - Tor now requires Libevent version 2.0.10-stable or later. Older
-      versions of Libevent have less efficient backends for several
-      platforms, and lack the DNS code that we use for our server-side
-      DNS support. This implements ticket 19554.
-    - Tor now requires zlib version 1.2 or later, for security,
-      efficiency, and (eventually) gzip support. (Back when we started,
-      zlib 1.1 and zlib 1.0 were still found in the wild. 1.2 was
-      released in 2003. We recommend the latest version.)
-
-  o Major features (build, hardening):
-    - Tor now builds with -ftrapv by default on compilers that support
-      it. This option detects signed integer overflow (which C forbids),
-      and turns it into a hard-failure. We do not apply this option to
-      code that needs to run in constant time to avoid side-channels;
-      instead, we use -fwrapv in that code. Closes ticket 17983.
-    - When --enable-expensive-hardening is selected, stop applying the
-      clang/gcc sanitizers to code that needs to run in constant time.
-      Although we are aware of no introduced side-channels, we are not
-      able to prove that there are none. Related to ticket 17983.
-
-  o Major features (compilation):
-    - Our big list of extra GCC warnings is now enabled by default when
-      building with GCC (or with anything like Clang that claims to be
-      GCC-compatible). To make all warnings into fatal compilation
-      errors, pass --enable-fatal-warnings to configure. Closes
-      ticket 19044.
-    - Use the Autoconf macro AC_USE_SYSTEM_EXTENSIONS to automatically
-      turn on C and POSIX extensions. (Previously, we attempted to do
-      this on an ad hoc basis.) Closes ticket 19139.
-
-  o Major features (directory authorities, hidden services):
-    - Directory authorities can now perform the shared randomness
-      protocol specified by proposal 250. Using this protocol, directory
-      authorities generate a global fresh random value every day. In the
-      future, this value will be used by hidden services to select
-      HSDirs. This release implements the directory authority feature;
-      the hidden service side will be implemented in the future as part
-      of proposal 224. Resolves ticket 16943; implements proposal 250.
-
-  o Major features (downloading, random exponential backoff):
-    - When we fail to download an object from a directory service, wait
-      for an (exponentially increasing) randomized amount of time before
-      retrying, rather than a fixed interval as we did before. This
-      prevents a group of Tor instances from becoming too synchronized,
-      or a single Tor instance from becoming too predictable, in its
-      download schedule. Closes ticket 15942.
-
-  o Major bugfixes (exit policies):
-    - Avoid disclosing exit outbound bind addresses, configured port
-      bind addresses, and local interface addresses in relay descriptors
-      by default under ExitPolicyRejectPrivate. Instead, only reject
-      these (otherwise unlisted) addresses if
-      ExitPolicyRejectLocalInterfaces is set. Fixes bug 18456; bugfix on
-      0.2.7.2-alpha. Patch by teor.
-
-  o Major bugfixes (hidden service client):
-    - Allow Tor clients with appropriate controllers to work with
-      FetchHidServDescriptors set to 0. Previously, this option also
-      disabled descriptor cache lookup, thus breaking hidden services
-      entirely. Fixes bug 18704; bugfix on 0.2.0.20-rc. Patch by "twim".
-
-  o Minor features (build, hardening):
-    - Detect and work around a libclang_rt problem that would prevent
-      clang from finding __mulodi4() on some 32-bit platforms, and thus
-      keep -ftrapv from linking on those systems. Closes ticket 19079.
-    - When building on a system without runtime support for the runtime
-      hardening options, try to log a useful warning at configuration
-      time, rather than an incomprehensible warning at link time. If
-      expensive hardening was requested, this warning becomes an error.
-      Closes ticket 18895.
-
-  o Minor features (code safety):
-    - In our integer-parsing functions, ensure that maxiumum value we
-      give is no smaller than the minimum value. Closes ticket 19063;
-      patch from U+039b.
-
-  o Minor features (controller):
-    - Implement new GETINFO queries for all downloads that use
-      download_status_t to schedule retries. This allows controllers to
-      examine the schedule for pending downloads. Closes ticket 19323.
-    - Allow controllers to configure basic client authorization on
-      hidden services when they create them with the ADD_ONION control
-      command. Implements ticket 15588. Patch by "special".
-    - Fire a STATUS_SERVER controller event whenever the hibernation
-      status changes between "awake"/"soft"/"hard". Closes ticket 18685.
-
-  o Minor features (directory authority):
-    - Directory authorities now only give the Guard flag to a relay if
-      they are also giving it the Stable flag. This change allows us to
-      simplify path selection for clients. It should have minimal effect
-      in practice, since >99% of Guards already have the Stable flag.
-      Implements ticket 18624.
-    - Directory authorities now write their v3-status-votes file out to
-      disk earlier in the consensus process, so we have a record of the
-      votes even if we abort the consensus process. Resolves
-      ticket 19036.
-
-  o Minor features (hidden service):
-    - Stop being so strict about the payload length of "rendezvous1"
-      cells. We used to be locked in to the "TAP" handshake length, and
-      now we can handle better handshakes like "ntor". Resolves
-      ticket 18998.
-
-  o Minor features (infrastructure, time):
-    - Tor now uses the operating system's monotonic timers (where
-      available) for internal fine-grained timing. Previously we would
-      look at the system clock, and then attempt to compensate for the
-      clock running backwards. Closes ticket 18908.
-    - Tor now includes an improved timer backend, so that we can
-      efficiently support tens or hundreds of thousands of concurrent
-      timers, as will be needed for some of our planned anti-traffic-
-      analysis work. This code is based on William Ahern's "timeout.c"
-      project, which implements a "tickless hierarchical timing wheel".
-      Closes ticket 18365.
-
-  o Minor features (logging):
-    - Provide a more useful warning message when configured with an
-      invalid Nickname. Closes ticket 18300; patch from "icanhasaccount".
-    - When dumping unparseable router descriptors, optionally store them
-      in separate files, named by digest, up to a configurable size
-      limit. You can change the size limit by setting the
-      MaxUnparseableDescSizeToLog option, and disable this feature by
-      setting that option to 0. Closes ticket 18322.
-    - Add a set of macros to check nonfatal assertions, for internal
-      use. Migrating more of our checks to these should help us avoid
-      needless crash bugs. Closes ticket 18613.
-
-  o Minor features (performance):
-    - Changer the "optimistic data" extension from "off by default" to
-      "on by default". The default was ordinarily overridden by a
-      consensus option, but when clients were bootstrapping for the
-      first time, they would not have a consensus to get the option
-      from. Changing this default When fetching a consensus for the
-      first time, use optimistic data. This saves a round-trip during
-      startup. Closes ticket 18815.
-
-  o Minor features (relay, usability):
-    - When the directory authorities refuse a bad relay's descriptor,
-      encourage the relay operator to contact us. Many relay operators
-      won't notice this line in their logs, but it's a win if even a few
-      learn why we don't like what their relay was doing. Resolves
-      ticket 18760.
-
-  o Minor features (testing):
-    - Let backtrace tests work correctly under AddressSanitizer. Fixes
-      part of bug 18934; bugfix on 0.2.5.2-alpha.
-    - Move the test-network.sh script to chutney, and modify tor's test-
-      network.sh to call the (newer) chutney version when available.
-      Resolves ticket 19116. Patch by teor.
-    - Use the lcov convention for marking lines as unreachable, so that
-      we don't count them when we're generating test coverage data.
-      Update our coverage tools to understand this convention. Closes
-      ticket 16792.
-
-  o Minor bugfixes (bootstrap):
-    - Remember the directory we fetched the consensus or previous
-      certificates from, and use it to fetch future authority
-      certificates. This change improves bootstrapping performance.
-      Fixes bug 18963; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (build):
-    - The test-stem and test-network makefile targets now depend only on
-      the tor binary that they are testing. Previously, they depended on
-      "make all". Fixes bug 18240; bugfix on 0.2.8.2-alpha. Based on a
-      patch from "cypherpunks".
-
-  o Minor bugfixes (circuits):
-    - Make sure extend_info_from_router() is only called on servers.
-      Fixes bug 19639; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation):
-    - When building with Clang, use a full set of GCC warnings.
-      (Previously, we included only a subset, because of the way we
-      detected them.) Fixes bug 19216; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (directory authority):
-    - Authorities now sort the "package" lines in their votes, for ease
-      of debugging. (They are already sorted in consensus documents.)
-      Fixes bug 18840; bugfix on 0.2.6.3-alpha.
-    - When parsing a detached signature, make sure we use the length of
-      the digest algorithm instead of an hardcoded DIGEST256_LEN in
-      order to avoid comparing bytes out-of-bounds with a smaller digest
-      length such as SHA1. Fixes bug 19066; bugfix on 0.2.2.6-alpha.
-
-  o Minor bugfixes (documentation):
-    - Document the --passphrase-fd option in the tor manpage. Fixes bug
-      19504; bugfix on 0.2.7.3-rc.
-    - Fix the description of the --passphrase-fd option in the
-      tor-gencert manpage. The option is used to pass the number of a
-      file descriptor to read the passphrase from, not to read the file
-      descriptor from. Fixes bug 19505; bugfix on 0.2.0.20-alpha.
-
-  o Minor bugfixes (ephemeral hidden service):
-    - When deleting an ephemeral hidden service, close its intro points
-      even if they are not completely open. Fixes bug 18604; bugfix
-      on 0.2.7.1-alpha.
-
-  o Minor bugfixes (guard selection):
-    - Use a single entry guard even if the NumEntryGuards consensus
-      parameter is not provided. Fixes bug 17688; bugfix
-      on 0.2.5.6-alpha.
-    - Don't mark guards as unreachable if connection_connect() fails.
-      That function fails for local reasons, so it shouldn't reveal
-      anything about the status of the guard. Fixes bug 14334; bugfix
-      on 0.2.3.10-alpha.
-
-  o Minor bugfixes (hidden service client):
-    - Increase the minimum number of internal circuits we preemptively
-      build from 2 to 3, so a circuit is available when a client
-      connects to another onion service. Fixes bug 13239; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor bugfixes (logging):
-    - When logging a directory ownership mismatch, log the owning
-      username correctly. Fixes bug 19578; bugfix on 0.2.2.29-beta.
-
-  o Minor bugfixes (memory leaks):
-    - Fix a small, uncommon memory leak that could occur when reading a
-      truncated ed25519 key file. Fixes bug 18956; bugfix
-      on 0.2.6.1-alpha.
-
-  o Minor bugfixes (testing):
-    - Allow clients to retry HSDirs much faster in test networks. Fixes
-      bug 19702; bugfix on 0.2.7.1-alpha. Patch by teor.
-    - Disable ASAN's detection of segmentation faults while running
-      test_bt.sh, so that we can make sure that our own backtrace
-      generation code works. Fixes another aspect of bug 18934; bugfix
-      on 0.2.5.2-alpha. Patch from "cypherpunks".
-    - Fix the test-network-all target on out-of-tree builds by using the
-      correct path to the test driver script. Fixes bug 19421; bugfix
-      on 0.2.7.3-rc.
-
-  o Minor bugfixes (time):
-    - Improve overflow checks in tv_udiff and tv_mdiff. Fixes bug 19483;
-      bugfix on all released tor versions.
-    - When computing the difference between two times in milliseconds,
-      we now round to the nearest millisecond correctly. Previously, we
-      could sometimes round in the wrong direction. Fixes bug 19428;
-      bugfix on 0.2.2.2-alpha.
-
-  o Minor bugfixes (user interface):
-    - Display a more accurate number of suppressed messages in the log
-      rate-limiter. Previously, there was a potential integer overflow
-      in the counter. Now, if the number of messages hits a maximum, the
-      rate-limiter doesn't count any further. Fixes bug 19435; bugfix
-      on 0.2.4.11-alpha.
-    - Fix a typo in the passphrase prompt for the ed25519 identity key.
-      Fixes bug 19503; bugfix on 0.2.7.2-alpha.
-
-  o Code simplification and refactoring:
-    - Remove redundant declarations of the MIN macro. Closes
-      ticket 18889.
-    - Rename tor_dup_addr() to tor_addr_to_str_dup() to avoid confusion.
-      Closes ticket 18462; patch from "icanhasaccount".
-    - Split the 600-line directory_handle_command_get function into
-      separate functions for different URL types. Closes ticket 16698.
-
-  o Documentation:
-    - Fix spelling of "--enable-tor2web-mode" in the manpage. Closes
-      ticket 19153. Patch from "U+039b".
-
-  o Removed features:
-    - Remove support for "GET /tor/bytes.txt" DirPort request, and
-      "GETINFO dir-usage" controller request, which were only available
-      via a compile-time option in Tor anyway. Feature was added in
-      0.2.2.1-alpha. Resolves ticket 19035.
-    - There is no longer a compile-time option to disable support for
-      TransPort. (If you don't want TransPort; just don't use it.) Patch
-      from "U+039b". Closes ticket 19449.
-
-  o Testing:
-    - Run more workqueue tests as part of "make check". These had
-      previously been implemented, but you needed to know special
-      command-line options to enable them.
-    - We now have unit tests for our code to reject zlib "compression
-      bombs". (Fortunately, the code works fine.)
-
-
-Changes in version 0.2.8.6 - 2016-08-02
-
-  Tor 0.2.8.6 is the first stable version of the Tor 0.2.8 series.
-
-  The Tor 0.2.8 series improves client bootstrapping performance,
-  completes the authority-side implementation of improved identity
-  keys for relays, and includes numerous bugfixes and performance
-  improvements throughout the program. This release continues to
-  improve the coverage of Tor's test suite.  For a full list of
-  changes since Tor 0.2.7, see the ReleaseNotes file.
-
-  Changes since 0.2.8.5-rc:
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the July 6 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - Fix a compilation warning in the unit tests on systems where char
-      is signed. Fixes bug 19682; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (fallback directories):
-    - Remove 1 fallback that was on the hardcoded list, then opted-out,
-      leaving 89 of the 100 fallbacks originally introduced in Tor
-      0.2.8.2-alpha in March 2016. Closes ticket 19782; patch by teor.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Allow more syscalls when running with "Sandbox 1" enabled:
-      sysinfo, getsockopt(SO_SNDBUF), and setsockopt(SO_SNDBUFFORCE). On
-      some systems, these are required for Tor to start. Fixes bug
-      18397; bugfix on 0.2.5.1-alpha. Patch from Daniel Pinto.
-    - Allow IPPROTO_UDP datagram sockets when running with "Sandbox 1",
-      so that get_interface_address6_via_udp_socket_hack() can work.
-      Fixes bug 19660; bugfix on 0.2.5.1-alpha.
-
-
-Changes in version 0.2.8.5-rc - 2016-07-07
-  Tor 0.2.8.5-rc is the second release candidate in the Tor 0.2.8
-  series. If we find no new bugs or regressions here, the first stable
-  0.2.8 release will be identical to it. It has a few small bugfixes
-  against previous versions.
-
-  o Directory authority changes:
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Major bugfixes (heartbeat):
-    - Fix a regression that would crash Tor when the periodic
-      "heartbeat" log messages were disabled. Fixes bug 19454; bugfix on
-      0.2.8.1-alpha. Reported by "kubaku".
-
-  o Minor features (build):
-    - Tor now again builds with the recent OpenSSL 1.1 development
-      branch (tested against 1.1.0-pre6-dev). Closes ticket 19499.
-    - When building manual pages, set the timezone to "UTC", so that the
-      output is reproducible. Fixes bug 19558; bugfix on 0.2.2.9-alpha.
-      Patch from intrigeri.
-
-  o Minor bugfixes (fallback directory selection):
-    - Avoid errors during fallback selection if there are no eligible
-      fallbacks. Fixes bug 19480; bugfix on 0.2.8.3-alpha. Patch
-      by teor.
-
-  o Minor bugfixes (IPv6, microdescriptors):
-    - Don't check node addresses when we only have a routerstatus. This
-      allows IPv6-only clients to bootstrap by fetching microdescriptors
-      from fallback directory mirrors. (The microdescriptor consensus
-      has no IPv6 addresses in it.) Fixes bug 19608; bugfix
-      on 0.2.8.2-alpha.
-
-  o Minor bugfixes (logging):
-    - Reduce pointlessly verbose log messages when directory servers
-      can't be found. Fixes bug 18849; bugfix on 0.2.8.3-alpha and
-      0.2.8.1-alpha. Patch by teor.
-    - When a fallback directory changes its fingerprint from the hard-
-      coded fingerprint, log a less severe, more explanatory log
-      message. Fixes bug 18812; bugfix on 0.2.8.1-alpha. Patch by teor.
-
-  o Minor bugfixes (Linux seccomp2 sandboxing):
-    - Allow statistics to be written to disk when "Sandbox 1" is
-      enabled. Fixes bugs 19556 and 19957; bugfix on 0.2.5.1-alpha and
-      0.2.6.1-alpha respectively.
-
-  o Minor bugfixes (user interface):
-    - Remove a warning message "Service [scrubbed] not found after
-      descriptor upload". This message appears when one uses HSPOST
-      control command to upload a service descriptor. Since there is
-      only a descriptor and no service, showing this message is
-      pointless and confusing. Fixes bug 19464; bugfix on 0.2.7.2-alpha.
-
-  o Fallback directory list:
-    - Add a comment to the generated fallback directory list that
-      explains how to comment out unsuitable fallbacks in a way that's
-      compatible with the stem fallback parser.
-    - Update fallback whitelist and blacklist based on relay operator
-      emails. Blacklist unsuitable (non-working, over-volatile)
-      fallbacks. Resolves ticket 19071. Patch by teor.
-    - Remove 10 unsuitable fallbacks, leaving 90 of the 100 fallbacks
-      originally introduced in Tor 0.2.8.2-alpha in March 2016. Closes
-      ticket 19071; patch by teor.
-
-
-Changes in version 0.2.8.4-rc - 2016-06-15
-  Tor 0.2.8.4-rc is the first release candidate in the Tor 0.2.8 series.
-  If we find no new bugs or regressions here, the first stable 0.2.8
-  release will be identical to it. It has a few small bugfixes against
-  previous versions.
-
-  o Major bugfixes (user interface):
-    - Correctly give a warning in the cases where a relay is specified
-      by nickname, and one such relay is found, but it is not officially
-      Named. Fixes bug 19203; bugfix on 0.2.3.1-alpha.
-
-  o Minor features (build):
-    - Tor now builds once again with the recent OpenSSL 1.1 development
-      branch (tested against 1.1.0-pre5 and 1.1.0-pre6-dev).
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the June 7 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - Cause the unit tests to compile correctly on mingw64 versions that
-      lack sscanf. Fixes bug 19213; bugfix on 0.2.7.1-alpha.
-
-  o Minor bugfixes (downloading):
-    - Predict more correctly whether we'll be downloading over HTTP when
-      we determine the maximum length of a URL. This should avoid a
-      "BUG" warning about the Squid HTTP proxy and its URL limits. Fixes
-      bug 19191.
-
-
-Changes in version 0.2.8.3-alpha - 2016-05-26
-  Tor 0.2.8.3-alpha resolves several bugs, most of them introduced over
-  the course of the 0.2.8 development cycle. It improves the behavior of
-  directory clients, fixes several crash bugs, fixes a gap in compiler
-  hardening, and allows the full integration test suite to run on
-  more platforms.
-
-  o Major bugfixes (security, client, DNS proxy):
-    - Stop a crash that could occur when a client running with DNSPort
-      received a query with multiple address types, and the first
-      address type was not supported. Found and fixed by Scott Dial.
-      Fixes bug 18710; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (security, compilation):
-    - Correctly detect compiler flags on systems where _FORTIFY_SOURCE
-      is predefined. Previously, our use of -D_FORTIFY_SOURCE would
-      cause a compiler warning, thereby making other checks fail, and
-      needlessly disabling compiler-hardening support. Fixes one case of
-      bug 18841; bugfix on 0.2.3.17-beta. Patch from "trudokal".
-
-  o Major bugfixes (security, directory authorities):
-    - Fix a crash and out-of-bounds write during authority voting, when
-      the list of relays includes duplicate ed25519 identity keys. Fixes
-      bug 19032; bugfix on 0.2.8.2-alpha.
-
-  o Major bugfixes (client, bootstrapping):
-    - Check if bootstrap consensus downloads are still needed when the
-      linked connection attaches. This prevents tor making unnecessary
-      begindir-style connections, which are the only directory
-      connections tor clients make since the fix for 18483 was merged.
-    - Fix some edge cases where consensus download connections may not
-      have been closed, even though they were not needed. Related to fix
-      for 18809.
-    - Make relays retry consensus downloads the correct number of times,
-      rather than the more aggressive client retry count. Fixes part of
-      ticket 18809.
-    - Stop downloading consensuses when we have a consensus, even if we
-      don't have all the certificates for it yet. Fixes bug 18809;
-      bugfix on 0.2.8.1-alpha. Patches by arma and teor.
-
-  o Major bugfixes (directory mirrors):
-    - Decide whether to advertise begindir support in the the same way
-      we decide whether to advertise our DirPort. Allowing these
-      decisions to become out-of-sync led to surprising behavior like
-      advertising begindir support when hibernation made us not
-      advertise a DirPort. Resolves bug 18616; bugfix on 0.2.8.1-alpha.
-      Patch by teor.
-
-  o Major bugfixes (IPv6 bridges, client):
-    - Actually use IPv6 addresses when selecting directory addresses for
-      IPv6 bridges. Fixes bug 18921; bugfix on 0.2.8.1-alpha. Patch
-      by "teor".
-
-  o Major bugfixes (key management):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (testing):
-    - Fix a bug that would block 'make test-network-all' on systems where
-      IPv6 packets were lost. Fixes bug 19008; bugfix on 0.2.7.3-rc.
-    - Avoid "WSANOTINITIALISED" warnings in the unit tests. Fixes bug 18668;
-      bugfix on 0.2.8.1-alpha.
-
-  o Minor features (clients):
-    - Make clients, onion services, and bridge relays always use an
-      encrypted begindir connection for directory requests. Resolves
-      ticket 18483. Patch by "teor".
-
-  o Minor features (fallback directory mirrors):
-    - Give each fallback the same weight for client selection; restrict
-      fallbacks to one per operator; report fallback directory detail
-      changes when rebuilding list; add new fallback directory mirrors
-      to the whitelist; and many other minor simplifications and fixes.
-      Closes tasks 17905, 18749, bug 18689, and fixes part of bug 18812 on
-      0.2.8.1-alpha; patch by "teor".
-    - Replace the 21 fallbacks generated in January 2016 and included in
-      Tor 0.2.8.1-alpha, with a list of 100 fallbacks generated in March
-      2016. Closes task 17158; patch by "teor".
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 4 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (assert, portability):
-    - Fix an assertion failure in memarea.c on systems where "long" is
-      shorter than the size of a pointer. Fixes bug 18716; bugfix
-      on 0.2.1.1-alpha.
-
-  o Minor bugfixes (bootstrap):
-    - Consistently use the consensus download schedule for authority
-      certificates. Fixes bug 18816; bugfix on 0.2.4.13-alpha.
-
-  o Minor bugfixes (build):
-    - Remove a pair of redundant AM_CONDITIONAL declarations from
-      configure.ac. Fixes one final case of bug 17744; bugfix
-      on 0.2.8.2-alpha.
-    - Resolve warnings when building on systems that are concerned with
-      signed char. Fixes bug 18728; bugfix on 0.2.7.2-alpha
-      and 0.2.6.1-alpha.
-    - When libscrypt.h is found, but no libscrypt library can be linked,
-      treat libscrypt as absent. Fixes bug 19161; bugfix
-      on 0.2.6.1-alpha.
-
-  o Minor bugfixes (client):
-    - Turn all TestingClientBootstrap* into non-testing torrc options.
-      This changes simply renames them by removing "Testing" in front of
-      them and they do not require TestingTorNetwork to be enabled
-      anymore. Fixes bug 18481; bugfix on 0.2.8.1-alpha.
-    - Make directory node selection more reliable, mainly for IPv6-only
-      clients and clients with few reachable addresses. Fixes bug 18929;
-      bugfix on 0.2.8.1-alpha. Patch by "teor".
-
-  o Minor bugfixes (controller, microdescriptors):
-    - Make GETINFO dir/status-vote/current/consensus conform to the
-      control specification by returning "551 Could not open cached
-      consensus..." when not caching consensuses. Fixes bug 18920;
-      bugfix on 0.2.2.6-alpha.
-
-  o Minor bugfixes (crypto, portability):
-    - The SHA3 and SHAKE routines now produce the correct output on Big
-      Endian systems. No code calls either algorithm yet, so this is
-      primarily a build fix. Fixes bug 18943; bugfix on 0.2.8.1-alpha.
-    - Tor now builds again with the recent OpenSSL 1.1 development
-      branch (tested against 1.1.0-pre4 and 1.1.0-pre5-dev). Closes
-      ticket 18286.
-
-  o Minor bugfixes (directories):
-    - When fetching extrainfo documents, compare their SHA256 digests
-      and Ed25519 signing key certificates with the routerinfo that led
-      us to fetch them, rather than with the most recent routerinfo.
-      Otherwise we generate many spurious warnings about mismatches.
-      Fixes bug 17150; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (logging):
-    - When we can't generate a signing key because OfflineMasterKey is
-      set, do not imply that we should have been able to load it. Fixes
-      bug 18133; bugfix on 0.2.7.2-alpha.
-    - Stop periodic_event_dispatch() from blasting twelve lines per
-      second at loglevel debug. Fixes bug 18729; fix on 0.2.8.1-alpha.
-    - When rejecting a misformed INTRODUCE2 cell, only log at
-      PROTOCOL_WARN severity. Fixes bug 18761; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (pluggable transports):
-    - Avoid reporting a spurious error when we decide that we don't need
-      to terminate a pluggable transport because it has already exited.
-      Fixes bug 18686; bugfix on 0.2.5.5-alpha.
-
-  o Minor bugfixes (pointer arithmetic):
-    - Fix a bug in memarea_alloc() that could have resulted in remote
-      heap write access, if Tor had ever passed an unchecked size to
-      memarea_alloc(). Fortunately, all the sizes we pass to
-      memarea_alloc() are pre-checked to be less than 128 kilobytes.
-      Fixes bug 19150; bugfix on 0.2.1.1-alpha. Bug found by
-      Guido Vranken.
-
-  o Minor bugfixes (relays):
-    - Consider more config options when relays decide whether to
-      regenerate their descriptor. Fixes more of bug 12538; bugfix
-      on 0.2.8.1-alpha.
-    - Resolve some edge cases where we might launch an ORPort
-      reachability check even when DisableNetwork is set. Noticed while
-      fixing bug 18616; bugfix on 0.2.3.9-alpha.
-
-  o Minor bugfixes (statistics):
-    - We now include consensus downloads via IPv6 in our directory-
-      request statistics. Fixes bug 18460; bugfix on 0.2.3.14-alpha.
-
-  o Minor bugfixes (testing):
-    - Allow directories in small networks to bootstrap by skipping
-      DirPort checks when the consensus has no exits. Fixes bug 19003;
-      bugfix on 0.2.8.1-alpha. Patch by teor.
-    - Fix a small memory leak that would occur when the
-      TestingEnableCellStatsEvent option was turned on. Fixes bug 18673;
-      bugfix on 0.2.5.2-alpha.
-
-  o Minor bugfixes (time handling):
-    - When correcting a corrupt 'struct tm' value, fill in the tm_wday
-      field. Otherwise, our unit tests crash on Windows. Fixes bug
-      18977; bugfix on 0.2.2.25-alpha.
-
-  o Documentation:
-    - Document the contents of the 'datadir/keys' subdirectory in the
-      manual page. Closes ticket 17621.
-    - Stop recommending use of nicknames to identify relays in our
-      MapAddress documentation. Closes ticket 18312.
-
-
-Changes in version 0.2.8.2-alpha - 2016-03-28
-  Tor 0.2.8.2-alpha is the second alpha in its series. It fixes numerous
-  bugs in earlier versions of Tor, including some that prevented
-  authorities using Tor 0.2.7.x from running correctly. IPv6 and
-  directory support should also be much improved.
-
-  o New system requirements:
-    - Tor no longer supports versions of OpenSSL with a broken
-      implementation of counter mode. (This bug was present in OpenSSL
-      1.0.0, and was fixed in OpenSSL 1.0.0a.) Tor still detects, but no
-      longer runs with, these versions.
-    - Tor no longer attempts to support platforms where the "time_t"
-      type is unsigned. (To the best of our knowledge, only OpenVMS does
-      this, and Tor has never actually built on OpenVMS.) Closes
-      ticket 18184.
-    - Tor now uses Autoconf version 2.63 or later, and Automake 1.11 or
-      later (released in 2008 and 2009 respectively). If you are
-      building Tor from the git repository instead of from the source
-      distribution, and your tools are older than this, you will need to
-      upgrade. Closes ticket 17732.
-
-  o Major bugfixes (security, pointers):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (bridges, pluggable transports):
-    - Modify the check for OR connections to private addresses. Allow
-      bridges on private addresses, including pluggable transports that
-      ignore the (potentially private) address in the bridge line. Fixes
-      bug 18517; bugfix on 0.2.8.1-alpha. Reported by gk, patch by teor.
-
-  o Major bugfixes (compilation):
-    - Repair hardened builds under the clang compiler. Previously, our
-      use of _FORTIFY_SOURCE would conflict with clang's address
-      sanitizer. Fixes bug 14821; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (crash on shutdown):
-    - Correctly handle detaching circuits from muxes when shutting down.
-      Fixes bug 18116; bugfix on 0.2.8.1-alpha.
-    - Fix an assert-on-exit bug related to counting memory usage in
-      rephist.c. Fixes bug 18651; bugfix on 0.2.8.1-alpha.
-
-  o Major bugfixes (crash on startup):
-    - Fix a segfault during startup: If a Unix domain socket was
-      configured as listener (such as a ControlSocket or a SocksPort
-      "unix:" socket), and tor was started as root but not configured to
-      switch to another user, tor would segfault while trying to string
-      compare a NULL value. Fixes bug 18261; bugfix on 0.2.8.1-alpha.
-      Patch by weasel.
-
-  o Major bugfixes (dns proxy mode, crash):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (relays, bridge clients):
-    - Ensure relays always allow IPv4 OR and Dir connections. Ensure
-      bridge clients use the address configured in the bridge line.
-      Fixes bug 18348; bugfix on 0.2.8.1-alpha. Reported by sysrqb,
-      patch by teor.
-
-  o Major bugfixes (voting):
-    - Actually enable support for authorities to match routers by their
-      Ed25519 identities. Previously, the code had been written, but
-      some debugging code that had accidentally been left in the
-      codebase made it stay turned off. Fixes bug 17702; bugfix
-      on 0.2.7.2-alpha.
-    - When collating votes by Ed25519 identities, authorities now
-      include a "NoEdConsensus" flag if the ed25519 value (or lack
-      thereof) for a server does not reflect the majority consensus.
-      Related to bug 17668; bugfix on 0.2.7.2-alpha.
-    - When generating a vote with keypinning disabled, never include two
-      entries for the same ed25519 identity. This bug was causing
-      authorities to generate votes that they could not parse when a
-      router violated key pinning by changing its RSA identity but
-      keeping its Ed25519 identity. Fixes bug 17668; fixes part of bug
-      18318. Bugfix on 0.2.7.2-alpha.
-
-  o Minor features (security, win32):
-    - Set SO_EXCLUSIVEADDRUSE on Win32 to avoid a local port-stealing
-      attack. Fixes bug 18123; bugfix on all tor versions. Patch
-      by teor.
-
-  o Minor features (bug-resistance):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-
-  o Minor features (build):
-    - Detect systems with FreeBSD-derived kernels (such as GNU/kFreeBSD)
-      as having possible IPFW support. Closes ticket 18448. Patch from
-      Steven Chamberlain.
-
-  o Minor features (code hardening):
-    - Use tor_snprintf() and tor_vsnprintf() even in external and low-
-      level code, to harden against accidental failures to NUL-
-      terminate. Part of ticket 17852. Patch from jsturgix. Found
-      with Flawfinder.
-
-  o Minor features (crypto):
-    - Validate the hard-coded Diffie-Hellman parameters and ensure that
-      p is a safe prime, and g is a suitable generator. Closes
-      ticket 18221.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the March 3 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden service directory):
-    - Streamline relay-side hsdir handling: when relays consider whether
-      to accept an uploaded hidden service descriptor, they no longer
-      check whether they are one of the relays in the network that is
-      "supposed" to handle that descriptor. Implements ticket 18332.
-
-  o Minor features (IPv6):
-    - Add ClientPreferIPv6DirPort, which is set to 0 by default. If set
-      to 1, tor prefers IPv6 directory addresses.
-    - Add ClientUseIPv4, which is set to 1 by default. If set to 0, tor
-      avoids using IPv4 for client OR and directory connections.
-    - Try harder to obey the IP version restrictions "ClientUseIPv4 0",
-      "ClientUseIPv6 0", "ClientPreferIPv6ORPort", and
-      "ClientPreferIPv6DirPort". Closes ticket 17840; patch by teor.
-
-  o Minor features (linux seccomp2 sandbox):
-    - Reject attempts to change our Address with "Sandbox 1" enabled.
-      Changing Address with Sandbox turned on would never actually work,
-      but previously it would fail in strange and confusing ways. Found
-      while fixing 18548.
-
-  o Minor features (robustness):
-    - Exit immediately with an error message if the code attempts to use
-      Libevent without having initialized it. This should resolve some
-      frequently-made mistakes in our unit tests. Closes ticket 18241.
-
-  o Minor features (unix domain sockets):
-    - Add a new per-socket option, RelaxDirModeCheck, to allow creating
-      Unix domain sockets without checking the permissions on the parent
-      directory. (Tor checks permissions by default because some
-      operating systems only check permissions on the parent directory.
-      However, some operating systems do look at permissions on the
-      socket, and tor's default check is unneeded.) Closes ticket 18458.
-      Patch by weasel.
-
-  o Minor bugfixes (exit policies, security):
-    - Refresh an exit relay's exit policy when interface addresses
-      change. Previously, tor only refreshed the exit policy when the
-      configured external address changed. Fixes bug 18208; bugfix on
-      0.2.7.3-rc. Patch by teor.
-
-  o Minor bugfixes (security, hidden services):
-    - Prevent hidden services connecting to client-supplied rendezvous
-      addresses that are reserved as internal or multicast. Fixes bug
-      8976; bugfix on 0.2.3.21-rc. Patch by dgoulet and teor.
-
-  o Minor bugfixes (build):
-    - Do not link the unit tests against both the testing and non-
-      testing versions of the static libraries. Fixes bug 18490; bugfix
-      on 0.2.7.1-alpha.
-    - Avoid spurious failures from configure files related to calling
-      exit(0) in TOR_SEARCH_LIBRARY. Fixes bug 18626; bugfix on
-      0.2.0.1-alpha. Patch from "cypherpunks".
-    - Silence spurious clang-scan warnings in the ed25519_donna code by
-      explicitly initializing some objects. Fixes bug 18384; bugfix on
-      0.2.7.2-alpha. Patch by teor.
-
-  o Minor bugfixes (client, bootstrap):
-    - Count receipt of new microdescriptors as progress towards
-      bootstrapping. Previously, with EntryNodes set, Tor might not
-      successfully repopulate the guard set on bootstrapping. Fixes bug
-      16825; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (code correctness):
-    - Update to the latest version of Trunnel, which tries harder to
-      avoid generating code that can invoke memcpy(p,NULL,0). Bug found
-      by clang address sanitizer. Fixes bug 18373; bugfix
-      on 0.2.7.2-alpha.
-
-  o Minor bugfixes (configuration):
-    - Fix a tiny memory leak when parsing a port configuration ending in
-      ":auto". Fixes bug 18374; bugfix on 0.2.3.3-alpha.
-
-  o Minor bugfixes (containers):
-    - If we somehow attempt to construct a heap with more than
-      1073741822 elements, avoid an integer overflow when maintaining
-      the heap property. Fixes bug 18296; bugfix on 0.1.2.1-alpha.
-
-  o Minor bugfixes (correctness):
-    - Fix a bad memory handling bug that would occur if we had queued a
-      cell on a channel's incoming queue. Fortunately, we can't actually
-      queue a cell like that as our code is constructed today, but it's
-      best to avoid this kind of error, even if there isn't any code
-      that triggers it today. Fixes bug 18570; bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (directory):
-    - When generating a URL for a directory server on an IPv6 address,
-      wrap the IPv6 address in square brackets. Fixes bug 18051; bugfix
-      on 0.2.3.9-alpha. Patch from Malek.
-
-  o Minor bugfixes (fallback directory mirrors):
-    - When requesting extrainfo descriptors from a trusted directory
-      server, check whether it is an authority or a fallback directory
-      which supports extrainfo descriptors. Fixes bug 18489; bugfix on
-      0.2.4.7-alpha. Reported by atagar, patch by teor.
-
-  o Minor bugfixes (hidden service, client):
-    - Handle the case where the user makes several fast consecutive
-      requests to the same .onion address. Previously, the first six
-      requests would each trigger a descriptor fetch, each picking a
-      directory (there are 6 overall) and the seventh one would fail
-      because no directories were left, thereby triggering a close on
-      all current directory connections asking for the hidden service.
-      The solution here is to not close the connections if we have
-      pending directory fetches. Fixes bug 15937; bugfix
-      on 0.2.7.1-alpha.
-
-  o Minor bugfixes (hidden service, control port):
-    - Add the onion address to the HS_DESC event for the UPLOADED action
-      both on success or failure. It was previously hardcoded with
-      UNKNOWN. Fixes bug 16023; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (hidden service, directory):
-    - Bridges now refuse "rendezvous2" (hidden service descriptor)
-      publish attempts. Suggested by ticket 18332.
-
-  o Minor bugfixes (linux seccomp2 sandbox):
-    - Allow the setrlimit syscall, and the prlimit and prlimit64
-      syscalls, which some libc implementations use under the hood.
-      Fixes bug 15221; bugfix on 0.2.5.1-alpha.
-    - Avoid a 10-second delay when starting as a client with "Sandbox 1"
-      enabled and no DNS resolvers configured. This should help TAILS
-      start up faster. Fixes bug 18548; bugfix on 0.2.5.1-alpha.
-    - Fix the sandbox's interoperability with unix domain sockets under
-      setuid. Fixes bug 18253; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (logging):
-    - When logging information about an unparsable networkstatus vote or
-      consensus, do not say "vote" when we mean consensus. Fixes bug
-      18368; bugfix on 0.2.0.8-alpha.
-    - Scrub service name in "unrecognized service ID" log messages.
-      Fixes bug 18600; bugfix on 0.2.4.11-alpha.
-    - Downgrade logs and backtraces about IP versions to info-level.
-      Only log backtraces once each time tor runs. Assists in diagnosing
-      bug 18351; bugfix on 0.2.8.1-alpha. Reported by sysrqb and
-      Christian, patch by teor.
-
-  o Minor bugfixes (memory safety):
-    - Avoid freeing an uninitialized pointer when opening a socket fails
-      in get_interface_addresses_ioctl(). Fixes bug 18454; bugfix on
-      0.2.3.11-alpha. Reported by toralf and "cypherpunks", patch
-      by teor.
-    - Correctly duplicate addresses in get_interface_address6_list().
-      Fixes bug 18454; bugfix on 0.2.8.1-alpha. Reported by toralf,
-      patch by "cypherpunks".
-    - Fix a memory leak in tor-gencert. Fixes part of bug 18672; bugfix
-      on 0.2.0.1-alpha.
-    - Fix a memory leak in "tor --list-fingerprint". Fixes part of bug
-      18672; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (private directory):
-    - Prevent a race condition when creating private directories. Fixes
-      part of bug 17852; bugfix on 0.0.2pre13. Part of ticket 17852.
-      Patch from jsturgix. Found with Flawfinder.
-
-  o Minor bugfixes (test networks, IPv6):
-    - Allow internal IPv6 addresses in descriptors in test networks.
-      Fixes bug 17153; bugfix on 0.2.3.16-alpha. Patch by teor, reported
-      by karsten.
-
-  o Minor bugfixes (testing):
-    - We no longer disable assertions in the unit tests when coverage is
-      enabled. Instead, we require you to say --disable-asserts-in-tests
-      to the configure script if you need assertions disabled in the
-      unit tests (for example, if you want to perform branch coverage).
-      Fixes bug 18242; bugfix on 0.2.7.1-alpha.
-
-  o Minor bugfixes (time parsing):
-    - Avoid overflow in tor_timegm when parsing dates in and after 2038
-      on platforms with 32-bit time_t. Fixes bug 18479; bugfix on
-      0.0.2pre14. Patch by teor.
-
-  o Minor bugfixes (tor-gencert):
-    - Correctly handle the case where an authority operator enters a
-      passphrase but sends an EOF before sending a newline. Fixes bug
-      17443; bugfix on 0.2.0.20-rc. Found by junglefowl.
-
-  o Code simplification and refactoring:
-    - Quote all the string interpolations in configure.ac -- even those
-      which we are pretty sure can't contain spaces. Closes ticket
-      17744. Patch from zerosion.
-    - Remove specialized code for non-inplace AES_CTR. 99% of our AES is
-      inplace, so there's no need to have a separate implementation for
-      the non-inplace code. Closes ticket 18258. Patch from Malek.
-    - Simplify return types for some crypto functions that can't
-      actually fail. Patch from Hassan Alsibyani. Closes ticket 18259.
-
-  o Documentation:
-    - Change build messages to refer to "Fedora" instead of "Fedora
-      Core", and "dnf" instead of "yum". Closes tickets 18459 and 18426.
-      Patches from "icanhasaccount" and "cypherpunks".
-
-  o Removed features:
-    - We no longer maintain an internal freelist in memarea.c.
-      Allocators should be good enough to make this code unnecessary,
-      and it's doubtful that it ever had any performance benefit.
-
-  o Testing:
-    - Fix several warnings from clang's address sanitizer produced in
-      the unit tests.
-    - Treat backtrace test failures as expected on FreeBSD until we
-      solve bug 17808. Closes ticket 18204.
-
-
-Changes in version 0.2.8.1-alpha - 2016-02-04
-  Tor 0.2.8.1-alpha is the first alpha release in its series. It
-  includes numerous small features and bugfixes against previous Tor
-  versions, and numerous small infrastructure improvements. The most
-  notable features are a set of improvements to the directory subsystem.
-
-  o Major features (security, Linux):
-    - When Tor starts as root on Linux and is told to switch user ID, it
-      can now retain the capability to bind to low ports. By default,
-      Tor will do this only when it's switching user ID and some low
-      ports have been configured. You can change this behavior with the
-      new option KeepBindCapabilities. Closes ticket 8195.
-
-  o Major features (directory system):
-    - When bootstrapping multiple consensus downloads at a time, use the
-      first one that starts downloading, and close the rest. This
-      reduces failures when authorities or fallback directories are slow
-      or down. Together with the code for feature 15775, this feature
-      should reduces failures due to fallback churn. Implements ticket
-      4483. Patch by "teor". Implements IPv4 portions of proposal 210 by
-      "mikeperry" and "teor".
-    - Include a trial list of 21 default fallback directories, generated
-      in January 2016, based on an opt-in survey of suitable relays.
-      Doing this should make clients bootstrap more quickly and reliably,
-      and reduce the load on the directory authorities. Closes ticket
-      15775. Patch by "teor".
-      Candidates identified using an OnionOO script by "weasel", "teor",
-      "gsathya", and "karsten".
-    - Previously only relays that explicitly opened a directory port
-      (DirPort) accepted directory requests from clients. Now all
-      relays, with and without a DirPort, accept and serve tunneled
-      directory requests that they receive through their ORPort. You can
-      disable this behavior using the new DirCache option. Closes
-      ticket 12538.
-
-  o Major key updates:
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by "teor".
-
-  o Minor features (security, clock):
-    - Warn when the system clock appears to move back in time (when the
-      state file was last written in the future). Tor doesn't know that
-      consensuses have expired if the clock is in the past. Patch by
-      "teor". Implements ticket 17188.
-
-  o Minor features (security, exit policies):
-    - ExitPolicyRejectPrivate now rejects more private addresses by
-      default. Specifically, it now rejects the relay's outbound bind
-      addresses (if configured), and the relay's configured port
-      addresses (such as ORPort and DirPort). Fixes bug 17027; bugfix on
-      0.2.0.11-alpha. Patch by "teor".
-
-  o Minor features (security, memory erasure):
-    - Set the unused entries in a smartlist to NULL. This helped catch
-      a (harmless) bug, and shouldn't affect performance too much.
-      Implements ticket 17026.
-    - Use SecureMemoryWipe() function to securely clean memory on
-      Windows. Previously we'd use OpenSSL's OPENSSL_cleanse() function.
-      Implements feature 17986.
-    - Use explicit_bzero or memset_s when present. Previously, we'd use
-      OpenSSL's OPENSSL_cleanse() function. Closes ticket 7419; patches
-      from  and .
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by "teor".
-
-  o Minor features (security, RNG):
-    - Adjust Tor's use of OpenSSL's RNG APIs so that they absolutely,
-      positively are not allowed to fail. Previously we depended on
-      internal details of OpenSSL's behavior. Closes ticket 17686.
-    - Never use the system entropy output directly for anything besides
-      seeding the PRNG. When we want to generate important keys, instead
-      of using system entropy directly, we now hash it with the PRNG
-      stream. This may help resist certain attacks based on broken OS
-      entropy implementations. Closes part of ticket 17694.
-    - Use modern system calls (like getentropy() or getrandom()) to
-      generate strong entropy on platforms that have them. Closes
-      ticket 13696.
-
-  o Minor features (accounting):
-    - Added two modes to the AccountingRule option: One for limiting
-      only the number of bytes sent ("AccountingRule out"), and one for
-      limiting only the number of bytes received ("AccountingRule in").
-      Closes ticket 15989; patch from "unixninja92".
-
-  o Minor features (build):
-    - Since our build process now uses "make distcheck", we no longer
-      force "make dist" to depend on "make check". Closes ticket 17893;
-      patch from "cypherpunks."
-    - Tor now builds successfully with the recent OpenSSL 1.1
-      development branch, and with the latest LibreSSL. Closes tickets
-      17549, 17921, and 17984.
-
-  o Minor features (controller):
-    - Adds the FallbackDir entries to 'GETINFO config/defaults'. Closes
-      tickets 16774 and 17817. Patch by George Tankersley.
-    - New 'GETINFO hs/service/desc/id/' command to retrieve a hidden
-      service descriptor from a service's local hidden service
-      descriptor cache. Closes ticket 14846.
-    - Add 'GETINFO exit-policy/reject-private/[default,relay]', so
-      controllers can examine the the reject rules added by
-      ExitPolicyRejectPrivate. This makes it easier for stem to display
-      exit policies.
-
-  o Minor features (crypto):
-    - Add SHA512 support to crypto.c. Closes ticket 17663; patch from
-      George Tankersley.
-    - Add SHA3 and SHAKE support to crypto.c. Closes ticket 17783.
-    - When allocating a digest state object, allocate no more space than
-      we actually need. Previously, we would allocate as much space as
-      the state for the largest algorithm would need. This change saves
-      up to 672 bytes per circuit. Closes ticket 17796.
-    - Improve performance when hashing non-multiple of 8 sized buffers,
-      based on Andrew Moon's public domain SipHash-2-4 implementation.
-      Fixes bug 17544; bugfix on 0.2.5.3-alpha.
-
-  o Minor features (directory downloads):
-    - Wait for busy authorities and fallback directories to become non-
-      busy when bootstrapping. (A similar change was made in 6c443e987d
-      for directory caches chosen from the consensus.) Closes ticket
-      17864; patch by "teor".
-    - Add UseDefaultFallbackDirs, which enables any hard-coded fallback
-      directory mirrors. The default is 1; set it to 0 to disable
-      fallbacks. Implements ticket 17576. Patch by "teor".
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the January 5 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (IPv6):
-    - Add an argument 'ipv6=address:orport' to the DirAuthority and
-      FallbackDir torrc options, to specify an IPv6 address for an
-      authority or fallback directory. Add hard-coded ipv6 addresses for
-      directory authorities that have them. Closes ticket 17327; patch
-      from Nick Mathewson and "teor".
-    - Add address policy assume_action support for IPv6 addresses.
-    - Limit IPv6 mask bits to 128.
-    - Warn when comparing against an AF_UNSPEC address in a policy, it's
-      almost always a bug. Closes ticket 17863; patch by "teor".
-    - Allow users to configure directory authorities and fallback
-      directory servers with IPv6 addresses and ORPorts. Resolves
-      ticket 6027.
-    - routerset_parse now accepts IPv6 literal addresses. Fixes bug
-      17060; bugfix on 0.2.1.3-alpha. Patch by "teor".
-    - Make tor_ersatz_socketpair work on IPv6-only systems. Fixes bug
-      17638; bugfix on 0.0.2pre8. Patch by "teor".
-
-  o Minor features (logging):
-    - When logging to syslog, allow a tag to be added to the syslog
-      identity (the string prepended to every log message). The tag can
-      be configured with SyslogIdentityTag and defaults to none. Setting
-      it to "foo" will cause logs to be tagged as "Tor-foo". Closes
-      ticket 17194.
-
-  o Minor features (portability):
-    - Use timingsafe_memcmp() where available. Closes ticket 17944;
-      patch from .
-
-  o Minor features (relay, address discovery):
-    - Add a family argument to get_interface_addresses_raw() and
-      subfunctions to make network interface address interogation more
-      efficient. Now Tor can specifically ask for IPv4, IPv6 or both
-      types of interfaces from the operating system. Resolves
-      ticket 17950.
-    - When get_interface_address6_list(.,AF_UNSPEC,.) is called and
-      fails to enumerate interface addresses using the platform-specific
-      API, have it rely on the UDP socket fallback technique to try and
-      find out what IP addresses (both IPv4 and IPv6) our machine has.
-      Resolves ticket 17951.
-
-  o Minor features (replay cache):
-    - The replay cache now uses SHA256 instead of SHA1. Implements
-      feature 8961. Patch by "teor", issue reported by "rransom".
-
-  o Minor features (unix file permissions):
-    - Defer creation of Unix sockets until after setuid. This avoids
-      needing CAP_CHOWN and CAP_FOWNER when using systemd's
-      CapabilityBoundingSet, or chown and fowner when using SELinux.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-    - If any directory created by Tor is marked as group readable, the
-      filesystem group is allowed to be either the default GID or the
-      root user. Allowing root to read the DataDirectory prevents the
-      need for CAP_READ_SEARCH when using systemd's
-      CapabilityBoundingSet, or dac_read_search when using SELinux.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-    - Introduce a new DataDirectoryGroupReadable option. If it is set to
-      1, the DataDirectory will be made readable by the default GID.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-
-  o Minor bugfixes (accounting):
-    - The max bandwidth when using 'AccountRule sum' is now correctly
-      logged. Fixes bug 18024; bugfix on 0.2.6.1-alpha. Patch
-      from "unixninja92".
-
-  o Minor bugfixes (code correctness):
-    - When closing an entry connection, generate a warning if we should
-      have sent an end cell for it but we haven't. Fixes bug 17876;
-      bugfix on 0.2.3.2-alpha.
-    - Assert that allocated memory held by the reputation code is freed
-      according to its internal counters. Fixes bug 17753; bugfix
-      on 0.1.1.1-alpha.
-    - Assert when the TLS contexts fail to initialize. Fixes bug 17683;
-      bugfix on 0.0.6.
-
-  o Minor bugfixes (compilation):
-    - Mark all object files that include micro-revision.i as depending
-      on it, so as to make parallel builds more reliable. Fixes bug
-      17826; bugfix on 0.2.5.1-alpha.
-    - Don't try to use the pthread_condattr_setclock() function unless
-      it actually exists. Fixes compilation on NetBSD-6.x. Fixes bug
-      17819; bugfix on 0.2.6.3-alpha.
-    - Fix backtrace compilation on FreeBSD. Fixes bug 17827; bugfix
-      on 0.2.5.2-alpha.
-    - Fix compilation of sandbox.c with musl-libc. Fixes bug 17347;
-      bugfix on 0.2.5.1-alpha. Patch from 'jamestk'.
-    - Fix search for libevent libraries on OpenBSD (and other systems
-      that install libevent 1 and libevent 2 in parallel). Fixes bug
-      16651; bugfix on 0.1.0.7-rc. Patch from "rubiate".
-    - Isolate environment variables meant for tests from the rest of the
-      build system. Fixes bug 17818; bugfix on 0.2.7.3-rc.
-    - Replace usage of 'INLINE' with 'inline'. Fixes bug 17804; bugfix
-      on 0.0.2pre8.
-    - Remove config.log only from make distclean, not from make clean.
-      Fixes bug 17924; bugfix on 0.2.4.1-alpha.
-
-  o Minor bugfixes (crypto):
-    - Check the return value of HMAC() and assert on failure. Fixes bug
-      17658; bugfix on 0.2.3.6-alpha. Patch by "teor".
-
-  o Minor bugfixes (fallback directories):
-    - Mark fallbacks as "too busy" when they return a 503 response,
-      rather than just marking authorities. Fixes bug 17572; bugfix on
-      0.2.4.7-alpha. Patch by "teor".
-
-  o Minor bugfixes (IPv6):
-    - Update the limits in max_dl_per_request for IPv6 address length.
-      Fixes bug 17573; bugfix on 0.2.1.5-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox):
-    - Fix a crash when using offline master ed25519 keys with the Linux
-      seccomp2 sandbox enabled. Fixes bug 17675; bugfix on 0.2.7.3-rc.
-
-  o Minor bugfixes (logging):
-    - In log messages that include a function name, use __FUNCTION__
-      instead of __PRETTY_FUNCTION__. In GCC, these are synonymous, but
-      with clang __PRETTY_FUNCTION__ has extra information we don't
-      need. Fixes bug 16563; bugfix on 0.0.2pre8. Fix by Tom van
-      der Woerdt.
-    - Remove needless quotes from a log message about unparseable
-      addresses. Fixes bug 17843; bugfix on 0.2.3.3-alpha.
-
-  o Minor bugfixes (portability):
-    - Remove an #endif from configure.ac so that we correctly detect the
-      presence of in6_addr.s6_addr32. Fixes bug 17923; bugfix
-      on 0.2.0.13-alpha.
-
-  o Minor bugfixes (relays):
-    - Check that both the ORPort and DirPort (if present) are reachable
-      before publishing a relay descriptor. Otherwise, relays publish a
-      descriptor with DirPort 0 when the DirPort reachability test takes
-      longer than the ORPort reachability test. Fixes bug 18050; bugfix
-      on 0.1.0.1-rc. Reported by "starlight", patch by "teor".
-
-  o Minor bugfixes (relays, hidden services):
-    - Refuse connection requests to private OR addresses unless
-      ExtendAllowPrivateAddresses is set. Previously, tor would connect,
-      then refuse to send any cells to a private address. Fixes bugs
-      17674 and 8976; bugfix on 0.2.3.21-rc. Patch by "teor".
-
-  o Minor bugfixes (safe logging):
-    - When logging a malformed hostname received through socks4, scrub
-      it if SafeLogging says we should. Fixes bug 17419; bugfix
-      on 0.1.1.16-rc.
-
-  o Minor bugfixes (statistics code):
-    - Consistently check for overflow in round_*_to_next_multiple_of
-      functions, and add unit tests with additional and maximal values.
-      Fixes part of bug 13192; bugfix on 0.2.2.1-alpha.
-    - Handle edge cases in the laplace functions: avoid division by
-      zero, avoid taking the log of zero, and silence clang type
-      conversion warnings using round and trunc. Add unit tests for edge
-      cases with maximal values. Fixes part of bug 13192; bugfix
-      on 0.2.6.2-alpha.
-
-  o Minor bugfixes (testing):
-    - The test for log_heartbeat was incorrectly failing in timezones
-      with non-integer offsets. Instead of comparing the end of the time
-      string against a constant, compare it to the output of
-      format_local_iso_time when given the correct input. Fixes bug
-      18039; bugfix on 0.2.5.4-alpha.
-    - Make unit tests pass on IPv6-only systems, and systems without
-      localhost addresses (like some FreeBSD jails). Fixes bug 17632;
-      bugfix on 0.2.7.3-rc. Patch by "teor".
-    - Fix a memory leak in the ntor test. Fixes bug 17778; bugfix
-      on 0.2.4.8-alpha.
-    - Check the full results of SHA256 and SHA512 digests in the unit
-      tests. Bugfix on 0.2.2.4-alpha. Patch by "teor".
-
-  o Code simplification and refactoring:
-    - Move logging of redundant policy entries in
-      policies_parse_exit_policy_internal into its own function. Closes
-      ticket 17608; patch from "juce".
-    - Extract the more complicated parts of circuit_mark_for_close()
-      into a new function that we run periodically before circuits are
-      freed. This change removes more than half of the functions
-      currently in the "blob". Closes ticket 17218.
-    - Clean up a little duplicated code in
-      crypto_expand_key_material_TAP(). Closes ticket 17587; patch
-      from "pfrankw".
-    - Decouple the list of streams waiting to be attached to circuits
-      from the overall connection list. This change makes it possible to
-      attach streams quickly while simplifying Tor's callgraph and
-      avoiding O(N) scans of the entire connection list. Closes
-      ticket 17590.
-    - When a direct directory request fails immediately on launch,
-      instead of relaunching that request from inside the code that
-      launches it, instead mark the connection for teardown. This change
-      simplifies Tor's callback and prevents the directory-request
-      launching code from invoking itself recursively. Closes
-      ticket 17589
-    - Remove code for configuring OpenSSL dynamic locks; OpenSSL doesn't
-      use them. Closes ticket 17926.
-
-  o Documentation:
-    - Add a description of the correct use of the '--keygen' command-
-      line option. Closes ticket 17583; based on text by 's7r'.
-    - Document the minimum HeartbeatPeriod value. Closes ticket 15638.
-    - Explain actual minima for BandwidthRate. Closes ticket 16382.
-    - Fix a minor formatting typo in the manpage. Closes ticket 17791.
-    - Mention torspec URL in the manpage and point the reader to it
-      whenever we mention a document that belongs in torspce. Fixes
-      issue 17392.
-
-  o Removed features:
-    - Remove client-side support for connecting to Tor relays running
-      versions of Tor before 0.2.3.6-alpha. These relays didn't support
-      the v3 TLS handshake protocol, and are no longer allowed on the
-      Tor network. Implements the client side of ticket 11150. Based on
-      patches by Tom van der Woerdt.
-
-  o Testing:
-    - Add unit tests to check for common RNG failure modes, such as
-      returning all zeroes, identical values, or incrementing values
-      (OpenSSL's rand_predictable feature). Patch by "teor".
-    - Log more information when the backtrace tests fail. Closes ticket
-      17892. Patch from "cypherpunks."
-    - Always test both ed25519 backends, so that we can be sure that our
-      batch-open replacement code works. Part of ticket 16794.
-    - Cover dns_resolve_impl() in dns.c with unit tests. Implements a
-      portion of ticket 16831.
-    - More unit tests for compat_libevent.c, procmon.c, tortls.c,
-      util_format.c, directory.c, and options_validate.c. Closes tickets
-      17075, 17082, 17084, 17003, and 17076 respectively. Patches from
-      Ola Bini.
-    - Unit tests for directory_handle_command_get. Closes ticket 17004.
-      Patch from Reinaldo de Souza Jr.
-
-
-Changes in version 0.2.7.6 - 2015-12-10
-  Tor version 0.2.7.6 fixes a major bug in entry guard selection, as
-  well as a minor bug in hidden service reliability.
-
-  o Major bugfixes (guard selection):
-    - Actually look at the Guard flag when selecting a new directory
-      guard. When we implemented the directory guard design, we
-      accidentally started treating all relays as if they have the Guard
-      flag during guard selection, leading to weaker anonymity and worse
-      performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered
-      by Mohsen Imani.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the December 1 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - When checking for net/pfvar.h, include netinet/in.h if possible.
-      This fixes transparent proxy detection on OpenBSD. Fixes bug
-      17551; bugfix on 0.1.2.1-alpha. Patch from "rubiate".
-    - Fix a compilation warning with Clang 3.6: Do not check the
-      presence of an address which can never be NULL. Fixes bug 17781.
-
-  o Minor bugfixes (correctness):
-    - When displaying an IPv6 exit policy, include the mask bits
-      correctly even when the number is greater than 31. Fixes bug
-      16056; bugfix on 0.2.4.7-alpha. Patch from "gturner".
-    - The wrong list was used when looking up expired intro points in a
-      rend service object, causing what we think could be reachability
-      issues for hidden services, and triggering a BUG log. Fixes bug
-      16702; bugfix on 0.2.7.2-alpha.
-    - Fix undefined behavior in the tor_cert_checksig function. Fixes
-      bug 17722; bugfix on 0.2.7.2-alpha.
-
-
-Changes in version 0.2.7.5 - 2015-11-20
-  The Tor 0.2.7 release series is dedicated to the memory of Tor user
-  and privacy advocate Caspar Bowden (1961-2015). Caspar worked
-  tirelessly to advocate human rights regardless of national borders,
-  and oppose the encroachments of mass surveillance. He opposed national
-  exceptionalism, he brought clarity to legal and policy debates, he
-  understood and predicted the impact of mass surveillance on the world,
-  and he laid the groundwork for resisting it. While serving on the Tor
-  Project's board of directors, he brought us his uncompromising focus
-  on technical excellence in the service of humankind. Caspar was an
-  inimitable force for good and a wonderful friend. He was kind,
-  humorous, generous, gallant, and believed we should protect one
-  another without exception. We honor him here for his ideals, his
-  efforts, and his accomplishments. Please honor his memory with works
-  that would make him proud.
-
-  Tor 0.2.7.5 is the first stable release in the Tor 0.2.7 series.
-
-  The 0.2.7 series adds a more secure identity key type for relays,
-  improves cryptography performance, resolves several longstanding
-  hidden-service performance issues, improves controller support for
-  hidden services, and includes small bugfixes and performance
-  improvements throughout the program. This release series also includes
-  more tests than before, and significant simplifications to which parts
-  of Tor invoke which others.
-
-  (This release contains no code changes since 0.2.7.4-rc.)
-
-
-Changes in version 0.2.7.4-rc - 2015-10-21
-  Tor 0.2.7.4-rc is the second release candidate in the 0.2.7 series. It
-  fixes some important memory leaks, and a scary-looking (but mostly
-  harmless in practice) invalid-read bug. It also has a few small
-  bugfixes, notably fixes for compilation and portability on different
-  platforms. If no further significant bounds are found, the next
-  release will the the official stable release.
-
-  o Major bugfixes (security, correctness):
-    - Fix an error that could cause us to read 4 bytes before the
-      beginning of an openssl string. This bug could be used to cause
-      Tor to crash on systems with unusual malloc implementations, or
-      systems with unusual hardening installed. Fixes bug 17404; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (correctness):
-    - Fix a use-after-free bug in validate_intro_point_failure(). Fixes
-      bug 17401; bugfix on 0.2.7.3-rc.
-
-  o Major bugfixes (memory leaks):
-    - Fix a memory leak in ed25519 batch signature checking. Fixes bug
-      17398; bugfix on 0.2.6.1-alpha.
-    - Fix a memory leak in rend_cache_failure_entry_free(). Fixes bug
-      17402; bugfix on 0.2.7.3-rc.
-    - Fix a memory leak when reading an expired signing key from disk.
-      Fixes bug 17403; bugfix on 0.2.7.2-rc.
-
-  o Minor features (geoIP):
-    - Update geoip and geoip6 to the October 9 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - Repair compilation with the most recent (unreleased, alpha)
-      vesions of OpenSSL 1.1. Fixes part of ticket 17237.
-    - Fix an integer overflow warning in test_crypto_slow.c. Fixes bug
-      17251; bugfix on 0.2.7.2-alpha.
-    - Fix compilation of sandbox.c with musl-libc. Fixes bug 17347;
-      bugfix on 0.2.5.1-alpha. Patch from 'jamestk'.
-
-  o Minor bugfixes (portability):
-    - Use libexecinfo on FreeBSD to enable backtrace support. Fixes
-      part of bug 17151; bugfix on 0.2.5.2-alpha. Patch from
-      Marcin Cieślak.
-
-  o Minor bugfixes (sandbox):
-    - Add the "hidserv-stats" filename to our sandbox filter for the
-      HiddenServiceStatistics option to work properly. Fixes bug 17354;
-      bugfix on 0.2.6.2-alpha. Patch from David Goulet.
-
-  o Minor bugfixes (testing):
-    - Add unit tests for get_interface_address* failure cases. Fixes bug
-      17173; bugfix on 0.2.7.3-rc. Patch by fk/teor.
-    - Fix breakage when running 'make check' with BSD make. Fixes bug
-      17154; bugfix on 0.2.7.3-rc. Patch by Marcin Cieślak.
-    - Make the get_ifaddrs_* unit tests more tolerant of different
-      network configurations. (Don't assume every test box has an IPv4
-      address, and don't assume every test box has a non-localhost
-      address.) Fixes bug 17255; bugfix on 0.2.7.3-rc. Patch by "teor".
-    - Skip backtrace tests when backtrace support is not compiled in.
-      Fixes part of bug 17151; bugfix on 0.2.7.1-alpha. Patch from
-      Marcin Cieślak.
-
-  o Documentation:
-    - Fix capitalization of SOCKS in sample torrc. Closes ticket 15609.
-    - Note that HiddenServicePorts can take a unix domain socket. Closes
-      ticket 17364.
-
-
-Changes in version 0.2.7.3-rc - 2015-09-25
-  Tor 0.2.7.3-rc is the first release candidate in the 0.2.7 series. It
-  contains numerous usability fixes for Ed25519 keys, safeguards against
-  several misconfiguration problems, significant simplifications to
-  Tor's callgraph, and numerous bugfixes and small features.
-
-  This is the most tested release of Tor to date. The unit tests cover
-  39.40% of the code, and the integration tests (accessible with "make
-  test-full-online", requiring stem and chutney and a network
-  connection) raise the coverage to 64.49%.
-
-  o Major features (security, hidden services):
-    - Hidden services, if using the EntryNodes option, are required to
-      use more than one EntryNode, in order to avoid a guard discovery
-      attack. (This would only affect people who had configured hidden
-      services and manually specified the EntryNodes option with a
-      single entry-node. The impact was that it would be easy to
-      remotely identify the guard node used by such a hidden service.
-      See ticket for more information.) Fixes ticket 14917.
-
-  o Major features (Ed25519 keys, keypinning):
-    - The key-pinning option on directory authorities is now advisory-
-      only by default. In a future version, or when the AuthDirPinKeys
-      option is set, pins are enforced again. Disabling key-pinning
-      seemed like a good idea so that we can survive the fallout of any
-      usability problems associated with Ed25519 keys. Closes
-      ticket 17135.
-
-  o Major features (Ed25519 performance):
-    - Improve the speed of Ed25519 operations and Curve25519 keypair
-      generation when built targeting 32 bit x86 platforms with SSE2
-      available. Implements ticket 16535.
-    - Improve the runtime speed of Ed25519 signature verification by
-      using Ed25519-donna's batch verification support. Implements
-      ticket 16533.
-
-  o Major features (performance testing):
-    - The test-network.sh script now supports performance testing.
-      Requires corresponding chutney performance testing changes. Patch
-      by "teor". Closes ticket 14175.
-
-  o Major features (relay, Ed25519):
-    - Significant usability improvements for Ed25519 key management. Log
-      messages are better, and the code can recover from far more
-      failure conditions. Thanks to "s7r" for reporting and diagnosing
-      so many of these!
-    - Add a new OfflineMasterKey option to tell Tor never to try loading
-      or generating a secret Ed25519 identity key. You can use this in
-      combination with tor --keygen to manage offline and/or encrypted
-      Ed25519 keys. Implements ticket 16944.
-    - Add a --newpass option to allow changing or removing the
-      passphrase of an encrypted key with tor --keygen. Implements part
-      of ticket 16769.
-    - On receiving a HUP signal, check to see whether the Ed25519
-      signing key has changed, and reload it if so. Closes ticket 16790.
-
-  o Major bugfixes (relay, Ed25519):
-    - Avoid crashing on 'tor --keygen'. Fixes bug 16679; bugfix on
-      0.2.7.2-alpha. Reported by "s7r".
-    - Improve handling of expired signing keys with offline master keys.
-      Fixes bug 16685; bugfix on 0.2.7.2-alpha. Reported by "s7r".
-
-  o Minor features (client-side privacy):
-    - New KeepAliveIsolateSOCKSAuth option to indefinitely extend circuit
-      lifespan when IsolateSOCKSAuth and streams with SOCKS
-      authentication are attached to the circuit. This allows
-      applications like TorBrowser to manage circuit lifetime on their
-      own. Implements feature 15482.
-    - When logging malformed hostnames from SOCKS5 requests, respect
-      SafeLogging configuration. Fixes bug 16891; bugfix on 0.1.1.16-rc.
-
-  o Minor features (compilation):
-    - Give a warning as early as possible when trying to build with an
-      unsupported OpenSSL version. Closes ticket 16901.
-    - Fail during configure if we're trying to build against an OpenSSL
-      built without ECC support. Fixes bug 17109, bugfix on 0.2.7.1-alpha
-      which started requiring ECC.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the September 3 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden services):
-    - Relays need to have the Fast flag to get the HSDir flag. As this
-      is being written, we'll go from 2745 HSDirs down to 2342, a ~14%
-      drop. This change should make some attacks against the hidden
-      service directory system harder. Fixes ticket 15963.
-    - Turn on hidden service statistics collection by setting the torrc
-      option HiddenServiceStatistics to "1" by default. (This keeps
-      track only of the fraction of traffic used by hidden services, and
-      the total number of hidden services in existence.) Closes
-      ticket 15254.
-    - Client now uses an introduction point failure cache to know when
-      to fetch or keep a descriptor in their cache. Previously, failures
-      were recorded implicitly, but not explicitly remembered. Closes
-      ticket 16389.
-
-  o Minor features (testing, authorities, documentation):
-    - New TestingDirAuthVote{Exit,Guard,HSDir}IsStrict flags to
-      explicitly manage consensus flags in testing networks. Patch by
-      "robgjansen", modified by "teor". Implements part of ticket 14882.
-
-  o Minor bugfixes (security, exit policies):
-    - ExitPolicyRejectPrivate now also rejects the relay's published
-      IPv6 address (if any), and any publicly routable IPv4 or IPv6
-      addresses on any local interfaces. ticket 17027. Patch by "teor".
-      Fixes bug 17027; bugfix on 0.2.0.11-alpha.
-
-  o Minor bug fixes (torrc exit policies):
-    - In torrc, "accept6 *" and "reject6 *" ExitPolicy lines now only
-      produce IPv6 wildcard addresses. Previously they would produce
-      both IPv4 and IPv6 wildcard addresses. Patch by "teor". Fixes part
-      of bug 16069; bugfix on 0.2.4.7-alpha.
-    - When parsing torrc ExitPolicies, we now warn for a number of cases
-      where the user's intent is likely to differ from Tor's actual
-      behavior. These include: using an IPv4 address with an accept6 or
-      reject6 line; using "private" on an accept6 or reject6 line; and
-      including any ExitPolicy lines after accept *:* or reject *:*.
-      Related to ticket 16069.
-    - When parsing torrc ExitPolicies, we now issue an info-level
-      message when expanding an "accept/reject *" line to include both
-      IPv4 and IPv6 wildcard addresses. Related to ticket 16069.
-    - In each instance above, usage advice is provided to avoid the
-      message. Resolves ticket 16069. Patch by "teor". Fixes part of bug
-      16069; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (authority):
-    - Don't assign "HSDir" to a router if it isn't Valid and Running.
-      Fixes bug 16524; bugfix on 0.2.7.2-alpha.
-    - Downgrade log messages about Ed25519 key issues if they are in old
-      cached router descriptors. Fixes part of bug 16286; bugfix
-      on 0.2.7.2-alpha.
-    - When we find an Ed25519 key issue in a cached descriptor, stop
-      saying the descriptor was just "uploaded". Fixes another part of
-      bug 16286; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (control port):
-    - Repair a warning and a spurious result when getting the maximum
-      number of file descriptors from the controller. Fixes bug 16697;
-      bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (correctness):
-    - When calling channel_free_list(), avoid calling smartlist_remove()
-      while inside a FOREACH loop. This partially reverts commit
-      17356fe7fd96af where the correct SMARTLIST_DEL_CURRENT was
-      incorrectly removed. Fixes bug 16924; bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (documentation):
-    - Advise users on how to configure separate IPv4 and IPv6 exit
-      policies in the manpage and sample torrcs. Related to ticket 16069.
-    - Fix the usage message of tor-resolve(1) so that it no longer lists
-      the removed -F option. Fixes bug 16913; bugfix on 0.2.2.28-beta.
-    - Fix an error in the manual page and comments for
-      TestingDirAuthVoteHSDir[IsStrict], which suggested that a HSDir
-      required "ORPort connectivity". While this is true, it is in no
-      way unique to the HSDir flag. Of all the flags, only HSDirs need a
-      DirPort configured in order for the authorities to assign that
-      particular flag. Patch by "teor". Fixed as part of 14882; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (Ed25519):
-    - Fix a memory leak when reading router descriptors with expired
-      Ed25519 certificates. Fixes bug 16539; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox):
-    - Allow bridge authorities to run correctly under the seccomp2
-      sandbox. Fixes bug 16964; bugfix on 0.2.5.1-alpha.
-    - Allow routers with ed25519 keys to run correctly under the
-      seccomp2 sandbox. Fixes bug 16965; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (open file limit):
-    - Fix set_max_file_descriptors() to set by default the max open file
-      limit to the current limit when setrlimit() fails. Fixes bug
-      16274; bugfix on 0.2.0.10-alpha. Patch by dgoulet.
-
-  o Minor bugfixes (portability):
-    - Try harder to normalize the exit status of the Tor process to the
-      standard-provided range. Fixes bug 16975; bugfix on every version
-      of Tor ever.
-    - Check correctly for Windows socket errors in the workqueue
-      backend. Fixes bug 16741; bugfix on 0.2.6.3-alpha.
-    - Fix the behavior of crypto_rand_time_range() when told to consider
-      times before 1970. (These times were possible when running in a
-      simulated network environment where time()'s output starts at
-      zero.) Fixes bug 16980; bugfix on 0.2.7.1-alpha.
-    - Restore correct operation of TLS client-cipher detection on
-      OpenSSL 1.1. Fixes bug 14047; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (relay):
-    - Ensure that worker threads actually exit when a fatal error or
-      shutdown is indicated. This fix doesn't currently affect the
-      behavior of Tor, because Tor workers never indicates fatal error
-      or shutdown except in the unit tests. Fixes bug 16868; bugfix
-      on 0.2.6.3-alpha.
-    - Unblock threads before releasing the work queue mutex to ensure
-      predictable scheduling behavior. Fixes bug 16644; bugfix
-      on 0.2.6.3-alpha.
-
-  o Code simplification and refactoring:
-    - Change the function that's called when we need to retry all
-      downloads so that it only reschedules the downloads to happen
-      immediately, rather than launching them all at once itself. This
-      further simplifies Tor's callgraph.
-    - Move some format-parsing functions out of crypto.c and
-      crypto_curve25519.c into crypto_format.c and/or util_format.c.
-    - Move the client-only parts of init_keys() into a separate
-      function. Closes ticket 16763.
-    - Simplify the microdesc_free() implementation so that it no longer
-      appears (to code analysis tools) to potentially invoke a huge
-      suite of other microdesc functions.
-    - Simply the control graph further by deferring the inner body of
-      directory_all_unreachable() into a callback. Closes ticket 16762.
-    - Treat the loss of an owning controller as equivalent to a SIGTERM
-      signal. This removes a tiny amount of duplicated code, and
-      simplifies our callgraph. Closes ticket 16788.
-    - When generating an event to send to the controller, we no longer
-      put the event over the network immediately. Instead, we queue
-      these events, and use a Libevent callback to deliver them. This
-      change simplifies Tor's callgraph by reducing the number of
-      functions from which all other Tor functions are reachable. Closes
-      ticket 16695.
-    - Wrap Windows-only C files inside '#ifdef _WIN32' so that tools
-      that try to scan or compile every file on Unix won't decide that
-      they are broken.
-    - Remove the unused "nulterminate" argument from buf_pullup().
-
-  o Documentation:
-    - Recommend a 40 GB example AccountingMax in torrc.sample rather
-      than a 4 GB max. Closes ticket 16742.
-    - Include the TUNING document in our source tarball. It is referred
-      to in the ChangeLog and an error message. Fixes bug 16929; bugfix
-      on 0.2.6.1-alpha.
-
-  o Removed code:
-    - The internal pure-C tor-fw-helper tool is now removed from the Tor
-      distribution, in favor of the pure-Go clone available from
-      https://gitweb.torproject.org/tor-fw-helper.git/ . The libraries
-      used by the C tor-fw-helper are not, in our opinion, very
-      confidence- inspiring in their secure-programming techniques.
-      Closes ticket 13338.
-    - Remove the code that would try to aggressively flush controller
-      connections while writing to them. This code was introduced in
-      0.1.2.7-alpha, in order to keep output buffers from exceeding
-      their limits. But there is no longer a maximum output buffer size,
-      and flushing data in this way caused some undesirable recursions
-      in our call graph. Closes ticket 16480.
-
-  o Testing:
-    - Make "bridges+hs" the default test network. This tests almost all
-      tor functionality during make test-network, while allowing tests
-      to succeed on non-IPv6 systems. Requires chutney commit 396da92 in
-      test-network-bridges-hs. Closes tickets 16945 (tor) and 16946
-      (chutney). Patches by "teor".
-    - Autodetect CHUTNEY_PATH if the chutney and Tor sources are side-
-      by-side in the same parent directory. Closes ticket 16903. Patch
-      by "teor".
-    - Use environment variables rather than autoconf substitutions to
-      send variables from the build system to the test scripts. This
-      change should be easier to maintain, and cause 'make distcheck' to
-      work better than before. Fixes bug 17148.
-    - Add a new set of callgraph analysis scripts that use clang to
-      produce a list of which Tor functions are reachable from which
-      other Tor functions. We're planning to use these to help simplify
-      our code structure by identifying illogical dependencies.
-    - Add new 'test-full' and 'test-full-online' targets to run all
-      tests, including integration tests with stem and chutney.
-    - Make the test-workqueue test work on Windows by initializing the
-      network before we begin.
-    - New make target (make test-network-all) to run multiple applicable
-      chutney test cases. Patch from Teor; closes 16953.
-    - Unit test dns_resolve(), dns_clip_ttl() and dns_get_expiry_ttl()
-      functions in dns.c. Implements a portion of ticket 16831.
-    - When building Tor with testing coverage enabled, run Chutney tests
-      (if any) using the 'tor-cov' coverage binary.
-    - When running test-network or test-stem, check for the absence of
-      stem/chutney before doing any build operations.
-
-
-Changes in version 0.2.7.2-alpha - 2015-07-27
-  This, the second alpha in the Tor 0.2.7 series, has a number of new
-  features, including a way to manually pick the number of introduction
-  points for hidden services, and the much stronger Ed25519 signing key
-  algorithm for regular Tor relays (including support for encrypted
-  offline identity keys in the new algorithm).
-
-  Support for Ed25519 on relays is currently limited to signing router
-  descriptors; later alphas in this series will extend Ed25519 key
-  support to more parts of the Tor protocol.
-
-  o Major features (Ed25519 identity keys, Proposal 220):
-    - All relays now maintain a stronger identity key, using the Ed25519
-      elliptic curve signature format. This master key is designed so
-      that it can be kept offline. Relays also generate an online
-      signing key, and a set of other Ed25519 keys and certificates.
-      These are all automatically regenerated and rotated as needed.
-      Implements part of ticket 12498.
-    - Directory authorities now vote on Ed25519 identity keys along with
-      RSA1024 keys. Implements part of ticket 12498.
-    - Directory authorities track which Ed25519 identity keys have been
-      used with which RSA1024 identity keys, and do not allow them to
-      vary freely. Implements part of ticket 12498.
-    - Microdescriptors now include Ed25519 identity keys. Implements
-      part of ticket 12498.
-    - Add support for offline encrypted Ed25519 master keys. To use this
-      feature on your tor relay, run "tor --keygen" to make a new master
-      key (or to make a new signing key if you already have a master
-      key). Closes ticket 13642.
-
-  o Major features (Hidden services):
-    - Add the torrc option HiddenServiceNumIntroductionPoints, to
-      specify a fixed number of introduction points. Its maximum value
-      is 10 and default is 3. Using this option can increase a hidden
-      service's reliability under load, at the cost of making it more
-      visible that the hidden service is facing extra load. Closes
-      ticket 4862.
-    - Remove the adaptive algorithm for choosing the number of
-      introduction points, which used to change the number of
-      introduction points (poorly) depending on the number of
-      connections the HS sees. Closes ticket 4862.
-
-  o Major features (onion key cross-certification):
-    - Relay descriptors now include signatures of their own identity
-      keys, made using the TAP and ntor onion keys. These signatures
-      allow relays to prove ownership of their own onion keys. Because
-      of this change, microdescriptors will no longer need to include
-      RSA identity keys. Implements proposal 228; closes ticket 12499.
-
-  o Major features (performance):
-    - Improve the runtime speed of Ed25519 operations by using the
-      public-domain Ed25519-donna by Andrew M. ("floodyberry").
-      Implements ticket 16467.
-    - Improve the runtime speed of the ntor handshake by using an
-      optimized curve25519 basepoint scalarmult implementation from the
-      public-domain Ed25519-donna by Andrew M. ("floodyberry"), based on
-      ideas by Adam Langley. Implements ticket 9663.
-
-  o Major bugfixes (client-side privacy, also in 0.2.6.9):
-    - Properly separate out each SOCKSPort when applying stream
-      isolation. The error occurred because each port's session group
-      was being overwritten by a default value when the listener
-      connection was initialized. Fixes bug 16247; bugfix on
-      0.2.6.3-alpha. Patch by "jojelino".
-
-  o Major bugfixes (hidden service clients, stability, also in 0.2.6.10):
-    - Stop refusing to store updated hidden service descriptors on a
-      client. This reverts commit 9407040c59218 (which indeed fixed bug
-      14219, but introduced a major hidden service reachability
-      regression detailed in bug 16381). This is a temporary fix since
-      we can live with the minor issue in bug 14219 (it just results in
-      some load on the network) but the regression of 16381 is too much
-      of a setback. First-round fix for bug 16381; bugfix
-      on 0.2.6.3-alpha.
-
-  o Major bugfixes (hidden services):
-    - When cannibalizing a circuit for an introduction point, always
-      extend to the chosen exit node (creating a 4 hop circuit).
-      Previously Tor would use the current circuit exit node, which
-      changed the original choice of introduction point, and could cause
-      the hidden service to skip excluded introduction points or
-      reconnect to a skipped introduction point. Fixes bug 16260; bugfix
-      on 0.1.0.1-rc.
-
-  o Major bugfixes (open file limit):
-    - The open file limit wasn't checked before calling
-      tor_accept_socket_nonblocking(), which would make Tor exceed the
-      limit. Now, before opening a new socket, Tor validates the open
-      file limit just before, and if the max has been reached, return an
-      error. Fixes bug 16288; bugfix on 0.1.1.1-alpha.
-
-  o Major bugfixes (stability, also in 0.2.6.10):
-    - Stop crashing with an assertion failure when parsing certain kinds
-      of malformed or truncated microdescriptors. Fixes bug 16400;
-      bugfix on 0.2.6.1-alpha. Found by "torkeln"; fix based on a patch
-      by "cypherpunks_backup".
-    - Stop random client-side assertion failures that could occur when
-      connecting to a busy hidden service, or connecting to a hidden
-      service while a NEWNYM is in progress. Fixes bug 16013; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor features (directory authorities, security, also in 0.2.6.9):
-    - The HSDir flag given by authorities now requires the Stable flag.
-      For the current network, this results in going from 2887 to 2806
-      HSDirs. Also, it makes it harder for an attacker to launch a sybil
-      attack by raising the effort for a relay to become Stable to
-      require at the very least 7 days, while maintaining the 96 hours
-      uptime requirement for HSDir. Implements ticket 8243.
-
-  o Minor features (client):
-    - Relax the validation of hostnames in SOCKS5 requests, allowing the
-      character '_' to appear, in order to cope with domains observed in
-      the wild that are serving non-RFC compliant records. Resolves
-      ticket 16430.
-    - Relax the validation done to hostnames in SOCKS5 requests, and
-      allow a single trailing '.' to cope with clients that pass FQDNs
-      using that syntax to explicitly indicate that the domain name is
-      fully-qualified. Fixes bug 16674; bugfix on 0.2.6.2-alpha.
-    - Add GroupWritable and WorldWritable options to unix-socket based
-      SocksPort and ControlPort options. These options apply to a single
-      socket, and override {Control,Socks}SocketsGroupWritable. Closes
-      ticket 15220.
-
-  o Minor features (control protocol):
-    - Support network-liveness GETINFO key and NETWORK_LIVENESS event in
-      the control protocol. Resolves ticket 15358.
-
-  o Minor features (directory authorities):
-    - Directory authorities no longer vote against the "Fast", "Stable",
-      and "HSDir" flags just because they were going to vote against
-      "Running": if the consensus turns out to be that the router was
-      running, then the authority's vote should count. Patch from Peter
-      Retzlaff; closes issue 8712.
-
-  o Minor features (geoip, also in 0.2.6.10):
-    - Update geoip to the June 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the June 3 2015 Maxmind GeoLite2 Country database.
-
-  o Minor features (hidden services):
-    - Add the new options "HiddenServiceMaxStreams" and
-      "HiddenServiceMaxStreamsCloseCircuit" to allow hidden services to
-      limit the maximum number of simultaneous streams per circuit, and
-      optionally tear down the circuit when the limit is exceeded. Part
-      of ticket 16052.
-
-  o Minor features (portability):
-    - Use C99 variadic macros when the compiler is not GCC. This avoids
-      failing compilations on MSVC, and fixes a log-file-based race
-      condition in our old workarounds. Original patch from Gisle Vanem.
-
-  o Minor bugfixes (compilation, also in 0.2.6.9):
-    - Build with --enable-systemd correctly when libsystemd is
-      installed, but systemd is not. Fixes bug 16164; bugfix on
-      0.2.6.3-alpha. Patch from Peter Palfrader.
-
-  o Minor bugfixes (controller):
-    - Add the descriptor ID in each HS_DESC control event. It was
-      missing, but specified in control-spec.txt. Fixes bug 15881;
-      bugfix on 0.2.5.2-alpha.
-
-  o Minor bugfixes (crypto error-handling, also in 0.2.6.10):
-    - Check for failures from crypto_early_init, and refuse to continue.
-      A previous typo meant that we could keep going with an
-      uninitialized crypto library, and would have OpenSSL initialize
-      its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced
-      when implementing ticket 4900. Patch by "teor".
-
-  o Minor bugfixes (hidden services):
-    - Fix a crash when reloading configuration while at least one
-      configured and one ephemeral hidden service exists. Fixes bug
-      16060; bugfix on 0.2.7.1-alpha.
-    - Avoid crashing with a double-free bug when we create an ephemeral
-      hidden service but adding it fails for some reason. Fixes bug
-      16228; bugfix on 0.2.7.1-alpha.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Use the sandbox in tor_open_cloexec whether or not O_CLOEXEC is
-      defined. Patch by "teor". Fixes bug 16515; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (Linux seccomp2 sandbox, also in 0.2.6.10):
-    - Allow pipe() and pipe2() syscalls in the seccomp2 sandbox: we need
-      these when eventfd2() support is missing. Fixes bug 16363; bugfix
-      on 0.2.6.3-alpha. Patch from "teor".
-
-  o Minor bugfixes (Linux seccomp2 sandbox, also in 0.2.6.9):
-    - Fix sandboxing to work when running as a relay, by allowing the
-      renaming of secret_id_key, and allowing the eventfd2 and futex
-      syscalls. Fixes bug 16244; bugfix on 0.2.6.1-alpha. Patch by
-      Peter Palfrader.
-    - Allow systemd connections to work with the Linux seccomp2 sandbox
-      code. Fixes bug 16212; bugfix on 0.2.6.2-alpha. Patch by
-      Peter Palfrader.
-
-  o Minor bugfixes (relay):
-    - Fix a rarely-encountered memory leak when failing to initialize
-      the thread pool. Fixes bug 16631; bugfix on 0.2.6.3-alpha. Patch
-      from "cypherpunks".
-
-  o Minor bugfixes (systemd):
-    - Fix an accidental formatting error that broke the systemd
-      configuration file. Fixes bug 16152; bugfix on 0.2.7.1-alpha.
-    - Tor's systemd unit file no longer contains extraneous spaces.
-      These spaces would sometimes confuse tools like deb-systemd-
-      helper. Fixes bug 16162; bugfix on 0.2.5.5-alpha.
-
-  o Minor bugfixes (tests):
-    - Use the configured Python executable when running test-stem-full.
-      Fixes bug 16470; bugfix on 0.2.7.1-alpha.
-
-  o Minor bugfixes (tests, also in 0.2.6.9):
-    - Fix a crash in the unit tests when built with MSVC2013. Fixes bug
-      16030; bugfix on 0.2.6.2-alpha. Patch from "NewEraCracker".
-
-  o Minor bugfixes (threads, comments):
-    - Always initialize return value in compute_desc_id in rendcommon.c
-      Patch by "teor". Fixes part of bug 16115; bugfix on 0.2.7.1-alpha.
-    - Check for NULL values in getinfo_helper_onions(). Patch by "teor".
-      Fixes part of bug 16115; bugfix on 0.2.7.1-alpha.
-    - Remove undefined directive-in-macro in test_util_writepid clang
-      3.7 complains that using a preprocessor directive inside a macro
-      invocation in test_util_writepid in test_util.c is undefined.
-      Patch by "teor". Fixes part of bug 16115; bugfix on 0.2.7.1-alpha.
-
-  o Code simplification and refactoring:
-    - Define WINVER and _WIN32_WINNT centrally, in orconfig.h, in order
-      to ensure they remain consistent and visible everywhere.
-    - Remove some vestigial workarounds for the MSVC6 compiler. We
-      haven't supported that in ages.
-    - The link authentication code has been refactored for better
-      testability and reliability. It now uses code generated with the
-      "trunnel" binary encoding generator, to reduce the risk of bugs
-      due to programmer error. Done as part of ticket 12498.
-
-  o Documentation:
-    - Include a specific and (hopefully) accurate documentation of the
-      torrc file's meta-format in doc/torrc_format.txt. This is mainly
-      of interest to people writing programs to parse or generate torrc
-      files. This document is not a commitment to long-term
-      compatibility; some aspects of the current format are a bit
-      ridiculous. Closes ticket 2325.
-
-  o Removed features:
-    - Tor no longer supports copies of OpenSSL that are missing support
-      for Elliptic Curve Cryptography. (We began using ECC when
-      available in 0.2.4.8-alpha, for more safe and efficient key
-      negotiation.) In particular, support for at least one of P256 or
-      P224 is now required, with manual configuration needed if only
-      P224 is available. Resolves ticket 16140.
-    - Tor no longer supports versions of OpenSSL before 1.0. (If you are
-      on an operating system that has not upgraded to OpenSSL 1.0 or
-      later, and you compile Tor from source, you will need to install a
-      more recent OpenSSL to link Tor against.) These versions of
-      OpenSSL are still supported by the OpenSSL, but the numerous
-      cryptographic improvements in later OpenSSL releases makes them a
-      clear choice. Resolves ticket 16034.
-    - Remove the HidServDirectoryV2 option. Now all relays offer to
-      store hidden service descriptors. Related to 16543.
-    - Remove the VoteOnHidServDirectoriesV2 option, since all
-      authorities have long set it to 1. Closes ticket 16543.
-
-  o Testing:
-    - Document use of coverity, clang static analyzer, and clang dynamic
-      undefined behavior and address sanitizers in doc/HACKING. Include
-      detailed usage instructions in the blacklist. Patch by "teor".
-      Closes ticket 15817.
-    - The link authentication protocol code now has extensive tests.
-    - The relay descriptor signature testing code now has
-      extensive tests.
-    - The test_workqueue program now runs faster, and is enabled by
-      default as a part of "make check".
-    - Now that OpenSSL has its own scrypt implementation, add an unit
-      test that checks for interoperability between libscrypt_scrypt()
-      and OpenSSL's EVP_PBE_scrypt() so that we could not use libscrypt
-      and rely on EVP_PBE_scrypt() whenever possible. Resolves
-      ticket 16189.
-
-
-Changes in version 0.2.6.10 - 2015-07-12
-  Tor version 0.2.6.10 fixes some significant stability and hidden
-  service client bugs, bulletproofs the cryptography init process, and
-  fixes a bug when using the sandbox code with some older versions of
-  Linux. Everyone running an older version, especially an older version
-  of 0.2.6, should upgrade.
-
-  o Major bugfixes (hidden service clients, stability):
-    - Stop refusing to store updated hidden service descriptors on a
-      client. This reverts commit 9407040c59218 (which indeed fixed bug
-      14219, but introduced a major hidden service reachability
-      regression detailed in bug 16381). This is a temporary fix since
-      we can live with the minor issue in bug 14219 (it just results in
-      some load on the network) but the regression of 16381 is too much
-      of a setback. First-round fix for bug 16381; bugfix
-      on 0.2.6.3-alpha.
-
-  o Major bugfixes (stability):
-    - Stop crashing with an assertion failure when parsing certain kinds
-      of malformed or truncated microdescriptors. Fixes bug 16400;
-      bugfix on 0.2.6.1-alpha. Found by "torkeln"; fix based on a patch
-      by "cypherpunks_backup".
-    - Stop random client-side assertion failures that could occur when
-      connecting to a busy hidden service, or connecting to a hidden
-      service while a NEWNYM is in progress. Fixes bug 16013; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor features (geoip):
-    - Update geoip to the June 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the June 3 2015 Maxmind GeoLite2 Country database.
-
-  o Minor bugfixes (crypto error-handling):
-    - Check for failures from crypto_early_init, and refuse to continue.
-      A previous typo meant that we could keep going with an
-      uninitialized crypto library, and would have OpenSSL initialize
-      its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced
-      when implementing ticket 4900. Patch by "teor".
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Allow pipe() and pipe2() syscalls in the seccomp2 sandbox: we need
-      these when eventfd2() support is missing. Fixes bug 16363; bugfix
-      on 0.2.6.3-alpha. Patch from "teor".
-
-
-Changes in version 0.2.6.9 - 2015-06-11
-  Tor 0.2.6.9 fixes a regression in the circuit isolation code, increases the
-  requirements for receiving an HSDir flag, and addresses some other small
-  bugs in the systemd and sandbox code. Clients using circuit isolation
-  should upgrade; all directory authorities should upgrade.
-
-  o Major bugfixes (client-side privacy):
-    - Properly separate out each SOCKSPort when applying stream
-      isolation. The error occurred because each port's session group was
-      being overwritten by a default value when the listener connection
-      was initialized. Fixes bug 16247; bugfix on 0.2.6.3-alpha. Patch
-      by "jojelino".
-
-  o Minor feature (directory authorities, security):
-    - The HSDir flag given by authorities now requires the Stable flag.
-      For the current network, this results in going from 2887 to 2806
-      HSDirs. Also, it makes it harder for an attacker to launch a sybil
-      attack by raising the effort for a relay to become Stable which
-      takes at the very least 7 days to do so and by keeping the 96
-      hours uptime requirement for HSDir. Implements ticket 8243.
-
-  o Minor bugfixes (compilation):
-    - Build with --enable-systemd correctly when libsystemd is
-      installed, but systemd is not. Fixes bug 16164; bugfix on
-      0.2.6.3-alpha. Patch from Peter Palfrader.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Fix sandboxing to work when running as a relaymby renaming of
-      secret_id_key, and allowing the eventfd2 and futex syscalls. Fixes
-      bug 16244; bugfix on 0.2.6.1-alpha. Patch by Peter Palfrader.
-    - Allow systemd connections to work with the Linux seccomp2 sandbox
-      code. Fixes bug 16212; bugfix on 0.2.6.2-alpha. Patch by
-      Peter Palfrader.
-
-  o Minor bugfixes (tests):
-    - Fix a crash in the unit tests when built with MSVC2013. Fixes bug
-      16030; bugfix on 0.2.6.2-alpha. Patch from "NewEraCracker".
-
-
-Changes in version 0.2.6.8 - 2015-05-21
-  Tor 0.2.6.8 fixes a bit of dodgy code in parsing INTRODUCE2 cells, and
-  fixes an authority-side bug in assigning the HSDir flag. All directory
-  authorities should upgrade.
-
-  o Major bugfixes (hidden services, backport from 0.2.7.1-alpha):
-    - Revert commit that made directory authorities assign the HSDir
-      flag to relays without a DirPort; this was bad because such relays
-      can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-
-  o Minor features (geoip):
-    - Update geoip to the April 8 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the April 8 2015 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.7.1-alpha - 2015-05-12
-  Tor 0.2.7.1-alpha is the first alpha release in its series. It
-  includes numerous small features and bugfixes against previous Tor
-  versions, and numerous small infrastructure improvements. The most
-  notable features are several new ways for controllers to interact with
-  the hidden services subsystem.
-
-  o New system requirements:
-    - Tor no longer includes workarounds to support Libevent versions
-      before 1.3e. Libevent 2.0 or later is recommended. Closes
-      ticket 15248.
-
-  o Major features (controller):
-    - Add the ADD_ONION and DEL_ONION commands that allow the creation
-      and management of hidden services via the controller. Closes
-      ticket 6411.
-    - New "GETINFO onions/current" and "GETINFO onions/detached"
-      commands to get information about hidden services created via the
-      controller. Part of ticket 6411.
-    - New HSFETCH command to launch a request for a hidden service
-      descriptor. Closes ticket 14847.
-    - New HSPOST command to upload a hidden service descriptor. Closes
-      ticket 3523. Patch by "DonnchaC".
-
-  o Major bugfixes (hidden services):
-    - Revert commit that made directory authorities assign the HSDir
-      flag to relays without a DirPort; this was bad because such relays
-      can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor features (clock-jump tolerance):
-    - Recover better when our clock jumps back many hours, like might
-      happen for Tails or Whonix users who start with a very wrong
-      hardware clock, use Tor to discover a more accurate time, and then
-      fix their clock. Resolves part of ticket 8766.
-
-  o Minor features (command-line interface):
-    - Make --hash-password imply --hush to prevent unnecessary noise.
-      Closes ticket 15542. Patch from "cypherpunks".
-    - Print a warning whenever we find a relative file path being used
-      as torrc option. Resolves issue 14018.
-
-  o Minor features (controller):
-    - Add DirAuthority lines for default directory authorities to the
-      output of the "GETINFO config/defaults" command if not already
-      present. Implements ticket 14840.
-    - Controllers can now use "GETINFO hs/client/desc/id/..." to
-      retrieve items from the client's hidden service descriptor cache.
-      Closes ticket 14845.
-    - Implement a new controller command "GETINFO status/fresh-relay-
-      descs" to fetch a descriptor/extrainfo pair that was generated on
-      demand just for the controller's use. Implements ticket 14784.
-
-  o Minor features (DoS-resistance):
-    - Make it harder for attackers to overload hidden services with
-      introductions, by blocking multiple introduction requests on the
-      same circuit. Resolves ticket 15515.
-
-  o Minor features (geoip):
-    - Update geoip to the April 8 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the April 8 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (HS popularity countermeasure):
-    - To avoid leaking HS popularity, don't cycle the introduction point
-      when we've handled a fixed number of INTRODUCE2 cells but instead
-      cycle it when a random number of introductions is reached, thus
-      making it more difficult for an attacker to find out the amount of
-      clients that have used the introduction point for a specific HS.
-      Closes ticket 15745.
-
-  o Minor features (logging):
-    - Include the Tor version in all LD_BUG log messages, since people
-      tend to cut and paste those into the bugtracker. Implements
-      ticket 15026.
-
-  o Minor features (pluggable transports):
-    - When launching managed pluggable transports on Linux systems,
-      attempt to have the kernel deliver a SIGTERM on tor exit if the
-      pluggable transport process is still running. Resolves
-      ticket 15471.
-    - When launching managed pluggable transports, setup a valid open
-      stdin in the child process that can be used to detect if tor has
-      terminated. The "TOR_PT_EXIT_ON_STDIN_CLOSE" environment variable
-      can be used by implementations to detect this new behavior.
-      Resolves ticket 15435.
-
-  o Minor features (testing):
-    - Add a test to verify that the compiler does not eliminate our
-      memwipe() implementation. Closes ticket 15377.
-    - Add make rule `check-changes` to verify the format of changes
-      files. Closes ticket 15180.
-    - Add unit tests for control_event_is_interesting(). Add a compile-
-      time check that the number of events doesn't exceed the capacity
-      of control_event_t.event_mask. Closes ticket 15431, checks for
-      bugs similar to 13085. Patch by "teor".
-    - Command-line argument tests moved to Stem. Resolves ticket 14806.
-    - Integrate the ntor, backtrace, and zero-length keys tests into the
-      automake test suite. Closes ticket 15344.
-    - Remove assertions during builds to determine Tor's test coverage.
-      We don't want to trigger these even in assertions, so including
-      them artificially makes our branch coverage look worse than it is.
-      This patch provides the new test-stem-full and coverage-html-full
-      configure options. Implements ticket 15400.
-
-  o Minor bugfixes (build):
-    - Improve out-of-tree builds by making non-standard rules work and
-      clean up additional files and directories. Fixes bug 15053; bugfix
-      on 0.2.7.0-alpha.
-
-  o Minor bugfixes (command-line interface):
-    - When "--quiet" is provided along with "--validate-config", do not
-      write anything to stdout on success. Fixes bug 14994; bugfix
-      on 0.2.3.3-alpha.
-    - When complaining about bad arguments to "--dump-config", use
-      stderr, not stdout.
-
-  o Minor bugfixes (configuration, unit tests):
-    - Only add the default fallback directories when the DirAuthorities,
-      AlternateDirAuthority, and FallbackDir directory config options
-      are set to their defaults. The default fallback directory list is
-      currently empty, this fix will only change tor's behavior when it
-      has default fallback directories. Includes unit tests for
-      consider_adding_dir_servers(). Fixes bug 15642; bugfix on
-      90f6071d8dc0 in 0.2.4.7-alpha. Patch by "teor".
-
-  o Minor bugfixes (correctness):
-    - For correctness, avoid modifying a constant string in
-      handle_control_postdescriptor. Fixes bug 15546; bugfix
-      on 0.1.1.16-rc.
-    - Remove side-effects from tor_assert() calls. This was harmless,
-      because we never disable assertions, but it is bad style and
-      unnecessary. Fixes bug 15211; bugfix on 0.2.5.5, 0.2.2.36,
-      and 0.2.0.10.
-
-  o Minor bugfixes (hidden service):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-    - Remove an extraneous newline character from the end of hidden
-      service descriptors. Fixes bug 15296; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (interface):
-    - Print usage information for --dump-config when it is used without
-      an argument. Also, fix the error message to use different wording
-      and add newline at the end. Fixes bug 15541; bugfix
-      on 0.2.5.1-alpha.
-
-  o Minor bugfixes (logs):
-    - When building Tor under Clang, do not include an extra set of
-      parentheses in log messages that include function names. Fixes bug
-      15269; bugfix on every released version of Tor when compiled with
-      recent enough Clang.
-
-  o Minor bugfixes (network):
-    - When attempting to use fallback technique for network interface
-      lookup, disregard loopback and multicast addresses since they are
-      unsuitable for public communications.
-
-  o Minor bugfixes (statistics):
-    - Disregard the ConnDirectionStatistics torrc options when Tor is
-      not a relay since in that mode of operation no sensible data is
-      being collected and because Tor might run into measurement hiccups
-      when running as a client for some time, then becoming a relay.
-      Fixes bug 15604; bugfix on 0.2.2.35.
-
-  o Minor bugfixes (test networks):
-    - When self-testing reachability, use ExtendAllowPrivateAddresses to
-      determine if local/private addresses imply reachability. The
-      previous fix used TestingTorNetwork, which implies
-      ExtendAllowPrivateAddresses, but this excluded rare configurations
-      where ExtendAllowPrivateAddresses is set but TestingTorNetwork is
-      not. Fixes bug 15771; bugfix on 0.2.6.1-alpha. Patch by "teor",
-      issue discovered by CJ Ess.
-
-  o Minor bugfixes (testing):
-    - Check for matching value in server response in ntor_ref.py. Fixes
-      bug 15591; bugfix on 0.2.4.8-alpha. Reported and fixed
-      by "joelanders".
-    - Set the severity correctly when testing
-      get_interface_addresses_ifaddrs() and
-      get_interface_addresses_win32(), so that the tests fail gracefully
-      instead of triggering an assertion. Fixes bug 15759; bugfix on
-      0.2.6.3-alpha. Reported by Nicolas Derive.
-
-  o Code simplification and refactoring:
-    - Move the hacky fallback code out of get_interface_address6() into
-      separate function and get it covered with unit-tests. Resolves
-      ticket 14710.
-    - Refactor hidden service client-side cache lookup to intelligently
-      report its various failure cases, and disentangle failure cases
-      involving a lack of introduction points. Closes ticket 14391.
-    - Use our own Base64 encoder instead of OpenSSL's, to allow more
-      control over the output. Part of ticket 15652.
-
-  o Documentation:
-    - Improve the descriptions of statistics-related torrc options in
-      the manpage to describe rationale and possible uses cases. Fixes
-      issue 15550.
-    - Improve the layout and formatting of ./configure --help messages.
-      Closes ticket 15024. Patch from "cypherpunks".
-    - Standardize on the term "server descriptor" in the manual page.
-      Previously, we had used "router descriptor", "server descriptor",
-      and "relay descriptor" interchangeably. Part of ticket 14987.
-
-  o Removed code:
-    - Remove `USE_OPENSSL_BASE64` and the corresponding fallback code
-      and always use the internal Base64 decoder. The internal decoder
-      has been part of tor since 0.2.0.10-alpha, and no one should
-      be using the OpenSSL one. Part of ticket 15652.
-    - Remove the 'tor_strclear()' function; use memwipe() instead.
-      Closes ticket 14922.
-
-  o Removed features:
-    - Remove the (seldom-used) DynamicDHGroups feature. For anti-
-      fingerprinting we now recommend pluggable transports; for forward-
-      secrecy in TLS, we now use the P-256 group. Closes ticket 13736.
-    - Remove the undocumented "--digests" command-line option. It
-      complicated our build process, caused subtle build issues on
-      multiple platforms, and is now redundant since we started
-      including git version identifiers. Closes ticket 14742.
-    - Tor no longer contains checks for ancient directory cache versions
-      that didn't know about microdescriptors.
-    - Tor no longer contains workarounds for stat files generated by
-      super-old versions of Tor that didn't choose guards sensibly.
-
-
-Changes in version 0.2.4.27 - 2015-04-06
-  Tor 0.2.4.27 backports two fixes from 0.2.6.7 for security issues that
-  could be used by an attacker to crash hidden services, or crash clients
-  visiting hidden services. Hidden services should upgrade as soon as
-  possible; clients should upgrade whenever packages become available.
-
-  This release also backports a simple improvement to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-
-
-Changes in version 0.2.5.12 - 2015-04-06
-  Tor 0.2.5.12 backports two fixes from 0.2.6.7 for security issues that
-  could be used by an attacker to crash hidden services, or crash clients
-  visiting hidden services. Hidden services should upgrade as soon as
-  possible; clients should upgrade whenever packages become available.
-
-  This release also backports a simple improvement to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-
-
-Changes in version 0.2.6.7 - 2015-04-06
-  Tor 0.2.6.7 fixes two security issues that could be used by an
-  attacker to crash hidden services, or crash clients visiting hidden
-  services. Hidden services should upgrade as soon as possible; clients
-  should upgrade whenever packages become available.
-
-  This release also contains two simple improvements to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-    - Decrease the amount of reattempts that a hidden service performs
-      when its rendezvous circuits fail. This reduces the computational
-      cost for running a hidden service under heavy load. Resolves
-      ticket 11447.
-
-
-Changes in version 0.2.6.6 - 2015-03-24
-  Tor 0.2.6.6 is the first stable release in the 0.2.6 series.
-
-  It adds numerous safety, security, correctness, and performance
-  improvements. Client programs can be configured to use more kinds of
-  sockets, AutomapHosts works better, the multithreading backend is
-  improved, cell transmission is refactored, test coverage is much
-  higher, more denial-of-service attacks are handled, guard selection is
-  improved to handle long-term guards better, pluggable transports
-  should work a bit better, and some annoying hidden service performance
-  bugs should be addressed.
-
-  o Minor bugfixes (portability):
-    - Use the correct datatype in the SipHash-2-4 function to prevent
-      compilers from assuming any sort of alignment. Fixes bug 15436;
-      bugfix on 0.2.5.3-alpha.
-
-Changes in version 0.2.6.5-rc - 2015-03-18
-  Tor 0.2.6.5-rc is the second and (hopefully) last release candidate in
-  the 0.2.6. It fixes a small number of bugs found in 0.2.6.4-rc.
-
-  o Major bugfixes (client):
-    - Avoid crashing when making certain configuration option changes on
-      clients. Fixes bug 15245; bugfix on 0.2.6.3-alpha. Reported
-      by "anonym".
-
-  o Major bugfixes (pluggable transports):
-    - Initialize the extended OR Port authentication cookie before
-      launching pluggable transports. This prevents a race condition
-      that occured when server-side pluggable transports would cache the
-      authentication cookie before it has been (re)generated. Fixes bug
-      15240; bugfix on 0.2.5.1-alpha.
-
-  o Major bugfixes (portability):
-    - Do not crash on startup when running on Solaris. Fixes a bug
-      related to our fix for 9495; bugfix on 0.2.6.1-alpha. Reported
-      by "ruebezahl".
-
-  o Minor features (heartbeat):
-    - On relays, report how many connections we negotiated using each
-      version of the Tor link protocols. This information will let us
-      know if removing support for very old versions of the Tor
-      protocols is harming the network. Closes ticket 15212.
-
-  o Code simplification and refactoring:
-    - Refactor main loop to extract the 'loop' part. This makes it
-      easier to run Tor under Shadow. Closes ticket 15176.
-
-
-Changes in version 0.2.5.11 - 2015-03-17
-  Tor 0.2.5.11 is the second stable release in the 0.2.5 series.
-
-  It backports several bugfixes from the 0.2.6 branch, including a
-  couple of medium-level security fixes for relays and exit nodes.
-  It also updates the list of directory authorities.
-
-  o Directory authority changes:
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-
-  o Major bugfixes (crash, OSX, security):
-    - Fix a remote denial-of-service opportunity caused by a bug in
-      OSX's _strlcat_chk() function. Fixes bug 15205; bug first appeared
-      in OSX 10.9.
-
-  o Major bugfixes (relay, stability, possible security):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout was passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from 'cypherpunks'.
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (exit node stability):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (Linux seccomp2 sandbox):
-    - Upon receiving sighup with the seccomp2 sandbox enabled, do not
-      crash during attempts to call wait4. Fixes bug 15088; bugfix on
-      0.2.5.1-alpha. Patch from "sanic".
-
-  o Minor features (controller):
-    - New "GETINFO bw-event-cache" to get information about recent
-      bandwidth events. Closes ticket 14128. Useful for controllers to
-      get recent bandwidth history after the fix for ticket 13988.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (client, automapping):
-    - Avoid crashing on torrc lines for VirtualAddrNetworkIPv[4|6] when
-      no value follows the option. Fixes bug 14142; bugfix on
-      0.2.4.7-alpha. Patch by "teor".
-    - Fix a memory leak when using AutomapHostsOnResolve. Fixes bug
-      14195; bugfix on 0.1.0.1-rc.
-
-  o Minor bugfixes (compilation):
-    - Build without warnings with the stock OpenSSL srtp.h header, which
-      has a duplicate declaration of SSL_get_selected_srtp_profile().
-      Fixes bug 14220; this is OpenSSL's bug, not ours.
-
-  o Minor bugfixes (directory authority):
-    - Allow directory authorities to fetch more data from one another if
-      they find themselves missing lots of votes. Previously, they had
-      been bumping against the 10 MB queued data limit. Fixes bug 14261;
-      bugfix on 0.1.2.5-alpha.
-    - Enlarge the buffer to read bwauth generated files to avoid an
-      issue when parsing the file in dirserv_read_measured_bandwidths().
-      Fixes bug 14125; bugfix on 0.2.2.1-alpha.
-
-  o Minor bugfixes (statistics):
-    - Increase period over which bandwidth observations are aggregated
-      from 15 minutes to 4 hours. Fixes bug 13988; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (preventative security, C safety):
-    - When reading a hexadecimal, base-32, or base-64 encoded value from
-      a string, always overwrite the whole output buffer. This prevents
-      some bugs where we would look at (but fortunately, not reveal)
-      uninitialized memory on the stack. Fixes bug 14013; bugfix on all
-      versions of Tor.
-
-
-Changes in version 0.2.4.26 - 2015-03-17
-  Tor 0.2.4.26 includes an updated list of directory authorities.  It
-  also backports a couple of stability and security bugfixes from 0.2.5
-  and beyond.
-
-  o Directory authority changes:
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-
-  o Major bugfixes (exit node stability, also in 0.2.6.3-alpha):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (relay, stability, possible security, also in 0.2.6.4-rc):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout was passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from 'cypherpunks'.
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-Changes in version 0.2.6.4-rc - 2015-03-09
-  Tor 0.2.6.4-alpha fixes an issue in the directory code that an
-  attacker might be able to use in order to crash certain Tor
-  directories. It also resolves some minor issues left over from, or
-  introduced in, Tor 0.2.6.3-alpha or earlier.
-
-  o Major bugfixes (crash, OSX, security):
-    - Fix a remote denial-of-service opportunity caused by a bug in
-      OSX's _strlcat_chk() function. Fixes bug 15205; bug first appeared
-      in OSX 10.9.
-
-  o Major bugfixes (relay, stability, possible security):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout is passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from "cypherpunks".
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (FreeBSD IPFW transparent proxy):
-    - Fix address detection with FreeBSD transparent proxies, when
-      "TransProxyType ipfw" is in use. Fixes bug 15064; bugfix
-      on 0.2.5.4-alpha.
-
-  o Major bugfixes (Linux seccomp2 sandbox):
-    - Pass IPPROTO_TCP rather than 0 to socket(), so that the Linux
-      seccomp2 sandbox doesn't fail. Fixes bug 14989; bugfix
-      on 0.2.6.3-alpha.
-    - Allow AF_UNIX hidden services to be used with the seccomp2
-      sandbox. Fixes bug 15003; bugfix on 0.2.6.3-alpha.
-    - Upon receiving sighup with the seccomp2 sandbox enabled, do not
-      crash during attempts to call wait4. Fixes bug 15088; bugfix on
-      0.2.5.1-alpha. Patch from "sanic".
-
-  o Minor features (controller):
-    - Messages about problems in the bootstrap process now include
-      information about the server we were trying to connect to when we
-      noticed the problem. Closes ticket 15006.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (logs):
-    - Quiet some log messages in the heartbeat and at startup. Closes
-      ticket 14950.
-
-  o Minor bugfixes (certificate handling):
-    - If an authority operator accidentally makes a signing certificate
-      with a future publication time, do not discard its real signing
-      certificates. Fixes bug 11457; bugfix on 0.2.0.3-alpha.
-    - Remove any old authority certificates that have been superseded
-      for at least two days. Previously, we would keep superseded
-      certificates until they expired, if they were published close in
-      time to the certificate that superseded them. Fixes bug 11454;
-      bugfix on 0.2.1.8-alpha.
-
-  o Minor bugfixes (compilation):
-    - Fix a compilation warning on s390. Fixes bug 14988; bugfix
-      on 0.2.5.2-alpha.
-    - Fix a compilation warning on FreeBSD. Fixes bug 15151; bugfix
-      on 0.2.6.2-alpha.
-
-  o Minor bugfixes (testing):
-    - Fix endianness issues in unit test for resolve_my_address() to
-      have it pass on big endian systems. Fixes bug 14980; bugfix on
-      Tor 0.2.6.3-alpha.
-    - Avoid a side-effect in a tor_assert() in the unit tests. Fixes bug
-      15188; bugfix on 0.1.2.3-alpha. Patch from Tom van der Woerdt.
-    - When running the new 'make test-stem' target, use the configured
-      python binary. Fixes bug 15037; bugfix on 0.2.6.3-alpha. Patch
-      from "cypherpunks".
-    - When running the zero-length-keys tests, do not use the default
-      torrc file. Fixes bug 15033; bugfix on 0.2.6.3-alpha. Reported
-      by "reezer".
-
-  o Directory authority IP change:
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-
-  o Removed code:
-    - Remove some lingering dead code that once supported mempools.
-      Mempools were disabled by default in 0.2.5, and removed entirely
-      in 0.2.6.3-alpha. Closes more of ticket 14848; patch
-      by "cypherpunks".
-
-
-Changes in version 0.2.6.3-alpha - 2015-02-19
-  Tor 0.2.6.3-alpha is the third (and hopefully final) alpha release in
-  the 0.2.6.x series. It introduces support for more kinds of sockets,
-  makes it harder to accidentally run an exit, improves our
-  multithreading backend, incorporates several fixes for the
-  AutomapHostsOnResolve option, and fixes numerous other bugs besides.
-
-  If no major regressions or security holes are found in this version,
-  the next version will be a release candidate.
-
-  o Deprecated versions:
-    - Tor relays older than 0.2.4.18-rc are no longer allowed to
-      advertise themselves on the network. Closes ticket 13555.
-
-  o Major features (security, unix domain sockets):
-    - Allow SocksPort to be an AF_UNIX Unix Domain Socket. Now high risk
-      applications can reach Tor without having to create AF_INET or
-      AF_INET6 sockets, meaning they can completely disable their
-      ability to make non-Tor network connections. To create a socket of
-      this type, use "SocksPort unix:/path/to/socket". Implements
-      ticket 12585.
-    - Support mapping hidden service virtual ports to AF_UNIX sockets.
-      The syntax is "HiddenServicePort 80 unix:/path/to/socket".
-      Implements ticket 11485.
-
-  o Major features (changed defaults):
-    - Prevent relay operators from unintentionally running exits: When a
-      relay is configured as an exit node, we now warn the user unless
-      the "ExitRelay" option is set to 1. We warn even more loudly if
-      the relay is configured with the default exit policy, since this
-      can indicate accidental misconfiguration. Setting "ExitRelay 0"
-      stops Tor from running as an exit relay. Closes ticket 10067.
-
-  o Major features (directory system):
-    - When downloading server- or microdescriptors from a directory
-      server, we no longer launch multiple simultaneous requests to the
-      same server. This reduces load on the directory servers,
-      especially when directory guards are in use. Closes ticket 9969.
-    - When downloading server- or microdescriptors over a tunneled
-      connection, do not limit the length of our requests to what the
-      Squid proxy is willing to handle. Part of ticket 9969.
-    - Authorities can now vote on the correct digests and latest
-      versions for different software packages. This allows packages
-      that include Tor to use the Tor authority system as a way to get
-      notified of updates and their correct digests. Implements proposal
-      227. Closes ticket 10395.
-
-  o Major features (guards):
-    - Introduce the Guardfraction feature to improves load balancing on
-      guard nodes. Specifically, it aims to reduce the traffic gap that
-      guard nodes experience when they first get the Guard flag. This is
-      a required step if we want to increase the guard lifetime to 9
-      months or greater.  Closes ticket 9321.
-
-  o Major features (performance):
-    - Make the CPU worker implementation more efficient by avoiding the
-      kernel and lengthening pipelines. The original implementation used
-      sockets to transfer data from the main thread to the workers, and
-      didn't allow any thread to be assigned more than a single piece of
-      work at once. The new implementation avoids communications
-      overhead by making requests in shared memory, avoiding kernel IO
-      where possible, and keeping more requests in flight at once.
-      Implements ticket 9682.
-
-  o Major features (relay):
-    - Raise the minimum acceptable configured bandwidth rate for bridges
-      to 50 KiB/sec and for relays to 75 KiB/sec. (The old values were
-      20 KiB/sec.) Closes ticket 13822.
-
-  o Major bugfixes (exit node stability):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (mixed relay-client operation):
-    - When running as a relay and client at the same time (not
-      recommended), if we decide not to use a new guard because we want
-      to retry older guards, only close the locally-originating circuits
-      passing through that guard. Previously we would close all the
-      circuits through that guard. Fixes bug 9819; bugfix on
-      0.2.1.1-alpha. Reported by "skruffy".
-
-  o Minor features (build):
-    - New --disable-system-torrc compile-time option to prevent Tor from
-      looking for the system-wide torrc or torrc-defaults files.
-      Resolves ticket 13037.
-
-  o Minor features (controller):
-    - Include SOCKS_USERNAME and SOCKS_PASSWORD values in controller
-      events so controllers can observe circuit isolation inputs. Closes
-      ticket 8405.
-    - ControlPort now supports the unix:/path/to/socket syntax as an
-      alternative to the ControlSocket option, for consistency with
-      SocksPort and HiddenServicePort. Closes ticket 14451.
-    - New "GETINFO bw-event-cache" to get information about recent
-      bandwidth events. Closes ticket 14128. Useful for controllers to
-      get recent bandwidth history after the fix for ticket 13988.
-
-  o Minor features (Denial of service resistance):
-    - Count the total number of bytes used storing hidden service
-      descriptors against the value of MaxMemInQueues. If we're low on
-      memory, and more than 20% of our memory is used holding hidden
-      service descriptors, free them until no more than 10% of our
-      memory holds hidden service descriptors. Free the least recently
-      fetched descriptors first. Resolves ticket 13806.
-    - When we have recently been under memory pressure (over 3/4 of
-      MaxMemInQueues is allocated), then allocate smaller zlib objects
-      for small requests. Closes ticket 11791.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 files to the January 7 2015 Maxmind
-      GeoLite2 Country database.
-
-  o Minor features (guard nodes):
-    - Reduce the time delay before saving guard status to disk from 10
-      minutes to 30 seconds (or from one hour to 10 minutes if
-      AvoidDiskWrites is set). Closes ticket 12485.
-
-  o Minor features (hidden service):
-    - Make Sybil attacks against hidden services harder by changing the
-      minimum time required to get the HSDir flag from 25 hours up to 96
-      hours. Addresses ticket 14149.
-    - New option "HiddenServiceAllowUnknownPorts" to allow hidden
-      services to disable the anti-scanning feature introduced in
-      0.2.6.2-alpha. With this option not set, a connection to an
-      unlisted port closes the circuit. With this option set, only a
-      RELAY_DONE cell is sent. Closes ticket 14084.
-
-  o Minor features (interface):
-    - Implement "-f -" command-line option to read torrc configuration
-      from standard input, if you don't want to store the torrc file in
-      the file system. Implements feature 13865.
-
-  o Minor features (logging):
-    - Add a count of unique clients to the bridge heartbeat message.
-      Resolves ticket 6852.
-    - Suppress "router info incompatible with extra info" message when
-      reading extrainfo documents from cache. (This message got loud
-      around when we closed bug 9812 in 0.2.6.2-alpha.) Closes
-      ticket 13762.
-    - Elevate hidden service authorized-client message from DEBUG to
-      INFO. Closes ticket 14015.
-
-  o Minor features (stability):
-    - Add assertions in our hash-table iteration code to check for
-      corrupted values that could cause infinite loops. Closes
-      ticket 11737.
-
-  o Minor features (systemd):
-    - Various improvements and modernizations in systemd hardening
-      support. Closes ticket 13805. Patch from Craig Andrews.
-
-  o Minor features (testing networks):
-    - Drop the minimum RendPostPeriod on a testing network to 5 seconds,
-      and the default on a testing network to 2 minutes. Drop the
-      MIN_REND_INITIAL_POST_DELAY on a testing network to 5 seconds, but
-      keep the default on a testing network at 30 seconds. This reduces
-      HS bootstrap time to around 25 seconds. Also, change the default
-      time in test-network.sh to match. Closes ticket 13401. Patch
-      by "teor".
-    - Create TestingDirAuthVoteHSDir to correspond to
-      TestingDirAuthVoteExit/Guard. Ensures that authorities vote the
-      HSDir flag for the listed relays regardless of uptime or ORPort
-      connectivity. Respects the value of VoteOnHidServDirectoriesV2.
-      Partial implementation for ticket 14067. Patch by "teor".
-
-  o Minor features (tor2web mode):
-    - Introduce the config option Tor2webRendezvousPoints, which allows
-      clients in Tor2webMode to select a specific Rendezvous Point to be
-      used in HS circuits. This might allow better performance for
-      Tor2Web nodes. Implements ticket 12844.
-
-  o Minor bugfixes (client DNS):
-    - Report the correct cached DNS expiration times on SOCKS port or in
-      DNS replies. Previously, we would report everything as "never
-      expires." Fixes bug 14193; bugfix on 0.2.3.17-beta.
-    - Avoid a small memory leak when we find a cached answer for a
-      reverse DNS lookup in a client-side DNS cache. (Remember, client-
-      side DNS caching is off by default, and is not recommended.) Fixes
-      bug 14259; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (client, automapping):
-    - Avoid crashing on torrc lines for VirtualAddrNetworkIPv[4|6] when
-      no value follows the option. Fixes bug 14142; bugfix on
-      0.2.4.7-alpha. Patch by "teor".
-    - Fix a memory leak when using AutomapHostsOnResolve. Fixes bug
-      14195; bugfix on 0.1.0.1-rc.
-    - Prevent changes to other options from removing the wildcard value
-      "." from "AutomapHostsSuffixes". Fixes bug 12509; bugfix
-      on 0.2.0.1-alpha.
-    - Allow MapAddress and AutomapHostsOnResolve to work together when
-      an address is mapped into another address type (like .onion) that
-      must be automapped at resolve time. Fixes bug 7555; bugfix
-      on 0.2.0.1-alpha.
-
-  o Minor bugfixes (client, bridges):
-    - When we are using bridges and we had a network connectivity
-      problem, only retry connecting to our currently configured
-      bridges, not all bridges we know about and remember using. Fixes
-      bug 14216; bugfix on 0.2.2.17-alpha.
-
-  o Minor bugfixes (client, IPv6):
-    - Reject socks requests to literal IPv6 addresses when IPv6Traffic
-      flag is not set; and not because the NoIPv4Traffic flag was set.
-      Previously we'd looked at the NoIPv4Traffic flag for both types of
-      literal addresses. Fixes bug 14280; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (compilation):
-    - The address of an array in the middle of a structure will always
-      be non-NULL. clang recognises this and complains. Disable the
-      tautologous and redundant check to silence this warning. Fixes bug
-      14001; bugfix on 0.2.1.2-alpha.
-    - Avoid warnings when building with systemd 209 or later. Fixes bug
-      14072; bugfix on 0.2.6.2-alpha. Patch from "h.venev".
-    - Compile correctly with (unreleased) OpenSSL 1.1.0 headers.
-      Addresses ticket 14188.
-    - Build without warnings with the stock OpenSSL srtp.h header, which
-      has a duplicate declaration of SSL_get_selected_srtp_profile().
-      Fixes bug 14220; this is OpenSSL's bug, not ours.
-    - Do not compile any code related to Tor2Web mode when Tor2Web mode
-      is not enabled at compile time. Previously, this code was included
-      in a disabled state. See discussion on ticket 12844.
-    - Remove the --disable-threads configure option again. It was
-      accidentally partially reintroduced in 29ac883606d6d. Fixes bug
-      14819; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (controller):
-    - Report "down" in response to the "GETINFO entry-guards" command
-      when relays are down with an unreachable_since value. Previously,
-      we would report "up". Fixes bug 14184; bugfix on 0.1.2.2-alpha.
-    - Avoid crashing on a malformed EXTENDCIRCUIT command. Fixes bug
-      14116; bugfix on 0.2.2.9-alpha.
-    - Add a code for the END_CIRC_REASON_IP_NOW_REDUNDANT circuit close
-      reason. Fixes bug 14207; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (directory authority):
-    - Allow directory authorities to fetch more data from one another if
-      they find themselves missing lots of votes. Previously, they had
-      been bumping against the 10 MB queued data limit. Fixes bug 14261;
-      bugfix on 0.1.2.5-alpha.
-    - Do not attempt to download extrainfo documents which we will be
-      unable to validate with a matching server descriptor. Fixes bug
-      13762; bugfix on 0.2.0.1-alpha.
-    - Fix a bug that was truncating AUTHDIR_NEWDESC events sent to the
-      control port. Fixes bug 14953; bugfix on 0.2.0.1-alpha.
-    - Enlarge the buffer to read bwauth generated files to avoid an
-      issue when parsing the file in dirserv_read_measured_bandwidths().
-      Fixes bug 14125; bugfix on 0.2.2.1-alpha.
-
-  o Minor bugfixes (file handling):
-    - Stop failing when key files are zero-length. Instead, generate new
-      keys, and overwrite the empty key files. Fixes bug 13111; bugfix
-      on all versions of Tor. Patch by "teor".
-    - Stop generating a fresh .old RSA onion key file when the .old file
-      is missing. Fixes part of 13111; bugfix on 0.0.6rc1.
-    - Avoid overwriting .old key files with empty key files.
-    - Skip loading zero-length extrainfo store, router store, stats,
-      state, and key files.
-    - Avoid crashing when trying to reload a torrc specified as a
-      relative path with RunAsDaemon turned on. Fixes bug 13397; bugfix
-      on 0.2.3.11-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Close the introduction circuit when we have no more usable intro
-      points, instead of waiting for it to time out. This also ensures
-      that no follow-up HS descriptor fetch is triggered when the
-      circuit eventually times out. Fixes bug 14224; bugfix on 0.0.6.
-    - When fetching a hidden service descriptor for a down service that
-      was recently up, do not keep refetching until we try the same
-      replica twice in a row. Fixes bug 14219; bugfix on 0.2.0.10-alpha.
-    - Successfully launch Tor with a nonexistent hidden service
-      directory. Our fix for bug 13942 didn't catch this case. Fixes bug
-      14106; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (logging):
-    - Avoid crashing when there are more log domains than entries in
-      domain_list. Bugfix on 0.2.3.1-alpha.
-    - Add a string representation for LD_SCHED. Fixes bug 14740; bugfix
-      on 0.2.6.1-alpha.
-    - Don't log messages to stdout twice when starting up. Fixes bug
-      13993; bugfix on 0.2.6.1-alpha.
-
-  o Minor bugfixes (parsing):
-    - Stop accepting milliseconds (or other junk) at the end of
-      descriptor publication times. Fixes bug 9286; bugfix on 0.0.2pre25.
-    - Support two-number and three-number version numbers correctly, in
-      case we change the Tor versioning system in the future. Fixes bug
-      13661; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (path counting):
-    - When deciding whether the consensus lists any exit nodes, count
-      the number listed in the consensus, not the number we have
-      descriptors for. Fixes part of bug 14918; bugfix on 0.2.6.2-alpha.
-    - When deciding whether we have any exit nodes, only examine
-      ExitNodes when the ExitNodes option is actually set. Fixes part of
-      bug 14918; bugfix on 0.2.6.2-alpha.
-    - Get rid of redundant and possibly scary warnings that we are
-      missing directory information while we bootstrap. Fixes part of
-      bug 14918; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (portability):
-    - Fix the ioctl()-based network interface lookup code so that it
-      will work on systems that have variable-length struct ifreq, for
-      example Mac OS X.
-    - Fix scheduler compilation on targets where char is unsigned. Fixes
-      bug 14764; bugfix on 0.2.6.2-alpha. Reported by Christian Kujau.
-
-  o Minor bugfixes (sandbox):
-    - Allow glibc fatal errors to be sent to stderr before Tor exits.
-      Previously, glibc would try to write them to /dev/tty, and the
-      sandbox would trap the call and make Tor exit prematurely. Fixes
-      bug 14759; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (shutdown):
-    - When shutting down, always call event_del() on lingering read or
-      write events before freeing them. Otherwise, we risk double-frees
-      or read-after-frees in event_base_free(). Fixes bug 12985; bugfix
-      on 0.1.0.2-rc.
-
-  o Minor bugfixes (small memory leaks):
-    - Avoid leaking memory when using IPv6 virtual address mappings.
-      Fixes bug 14123; bugfix on 0.2.4.7-alpha. Patch by Tom van
-      der Woerdt.
-
-  o Minor bugfixes (statistics):
-    - Increase period over which bandwidth observations are aggregated
-      from 15 minutes to 4 hours. Fixes bug 13988; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (systemd support):
-    - Fix detection and operation of systemd watchdog. Fixes part of bug
-      14141; bugfix on 0.2.6.2-alpha. Patch from Tomasz Torcz.
-    - Run correctly under systemd with the RunAsDaemon option set. Fixes
-      part of bug 14141; bugfix on 0.2.5.7-rc. Patch from Tomasz Torcz.
-    - Inform the systemd supervisor about more changes in the Tor
-      process status. Implements part of ticket 14141. Patch from
-      Tomasz Torcz.
-    - Cause the "--disable-systemd" option to actually disable systemd
-      support. Fixes bug 14350; bugfix on 0.2.6.2-alpha. Patch
-      from "blueness".
-
-  o Minor bugfixes (TLS):
-    - Check more thoroughly throughout the TLS code for possible
-      unlogged TLS errors. Possible diagnostic or fix for bug 13319.
-
-  o Minor bugfixes (transparent proxy):
-    - Use getsockname, not getsockopt, to retrieve the address for a
-      TPROXY-redirected connection. Fixes bug 13796; bugfix
-      on 0.2.5.2-alpha.
-
-  o Code simplification and refactoring:
-    - Move fields related to isolating and configuring client ports into
-      a shared structure. Previously, they were duplicated across
-      port_cfg_t, listener_connection_t, and edge_connection_t. Failure
-      to copy them correctly had been the cause of at least one bug in
-      the past. Closes ticket 8546.
-    - Refactor the get_interface_addresses_raw() doom-function into
-      multiple smaller and simpler subfunctions. Cover the resulting
-      subfunctions with unit-tests. Fixes a significant portion of
-      issue 12376.
-    - Remove workaround in dirserv_thinks_router_is_hs_dir() that was
-      only for version <= 0.2.2.24 which is now deprecated. Closes
-      ticket 14202.
-    - Remove a test for a long-defunct broken version-one
-      directory server.
-
-  o Documentation:
-    - Adding section on OpenBSD to our TUNING document. Thanks to mmcc
-      for writing the OpenBSD-specific tips. Resolves ticket 13702.
-    - Make the tor-resolve documentation match its help string and its
-      options. Resolves part of ticket 14325.
-    - Log a more useful error message from tor-resolve when failing to
-      look up a hidden service address. Resolves part of ticket 14325.
-
-  o Downgraded warnings:
-    - Don't warn when we've attempted to contact a relay using the wrong
-      ntor onion key. Closes ticket 9635.
-
-  o Removed features:
-    - To avoid confusion with the "ExitRelay" option, "ExitNode" is no
-      longer silently accepted as an alias for "ExitNodes".
-    - The --enable-mempool and --enable-buf-freelists options, which
-      were originally created to work around bad malloc implementations,
-      no longer exist. They were off-by-default in 0.2.5. Closes
-      ticket 14848.
-
-  o Testing:
-    - Make the checkdir/perms test complete successfully even if the
-      global umask is not 022. Fixes bug 14215; bugfix on 0.2.6.2-alpha.
-    - Test that tor does not fail when key files are zero-length. Check
-      that tor generates new keys, and overwrites the empty key files.
-    - Test that tor generates new keys when keys are missing
-      (existing behavior).
-    - Test that tor does not overwrite key files that already contain
-      data (existing behavior). Tests bug 13111. Patch by "teor".
-    - New "make test-stem" target to run stem integration tests.
-      Requires that the "STEM_SOURCE_DIR" environment variable be set.
-      Closes ticket 14107.
-    - Make the test_cmdline_args.py script work correctly on Windows.
-      Patch from Gisle Vanem.
-    - Move the slower unit tests into a new "./src/test/test-slow"
-      binary that can be run independently of the other tests. Closes
-      ticket 13243.
-    - Avoid undefined behavior when sampling huge values from the
-      Laplace distribution. This made unittests fail on Raspberry Pi.
-      Bug found by Device. Fixes bug 14090; bugfix on 0.2.6.2-alpha.
-
-
-Changes in version 0.2.6.2-alpha - 2014-12-31
-  Tor 0.2.6.2-alpha is the second alpha release in the 0.2.6.x series.
-  It introduces a major new backend for deciding when to send cells on
-  channels, which should lead down the road to big performance
-  increases. It contains security and statistics features for better
-  work on hidden services, and numerous bugfixes.
-
-  This release contains many new unit tests, along with major
-  performance improvements for running testing networks using Chutney.
-  Thanks to a series of patches contributed by "teor", testing networks
-  should now bootstrap in seconds, rather than minutes.
-
-  o Major features (relay, infrastructure):
-    - Complete revision of the code that relays use to decide which cell
-      to send next. Formerly, we selected the best circuit to write on
-      each channel, but we didn't select among channels in any
-      sophisticated way. Now, we choose the best circuits globally from
-      among those whose channels are ready to deliver traffic.
-
-      This patch implements a new inter-cmux comparison API, a global
-      high/low watermark mechanism and a global scheduler loop for
-      transmission prioritization across all channels as well as among
-      circuits on one channel. This schedule is currently tuned to
-      (tolerantly) avoid making changes in network performance, but it
-      should form the basis for major circuit performance increases in
-      the future. Code by Andrea; tuning by Rob Jansen; implements
-      ticket 9262.
-
-  o Major features (hidden services):
-    - Make HS port scanning more difficult by immediately closing the
-      circuit when a user attempts to connect to a nonexistent port.
-      Closes ticket 13667.
-    - Add a HiddenServiceStatistics option that allows Tor relays to
-      gather and publish statistics about the overall size and volume of
-      hidden service usage. Specifically, when this option is turned on,
-      an HSDir will publish an approximate number of hidden services
-      that have published descriptors to it the past 24 hours. Also, if
-      a relay has acted as a hidden service rendezvous point, it will
-      publish the approximate amount of rendezvous cells it has relayed
-      the past 24 hours. The statistics themselves are obfuscated so
-      that the exact values cannot be derived. For more details see
-      proposal 238, "Better hidden service stats from Tor relays". This
-      feature is currently disabled by default. Implements feature 13192.
-
-  o Major bugfixes (client, automap):
-    - Repair automapping with IPv6 addresses. This automapping should
-      have worked previously, but one piece of debugging code that we
-      inserted to detect a regression actually caused the regression to
-      manifest itself again. Fixes bug 13811 and bug 12831; bugfix on
-      0.2.4.7-alpha. Diagnosed and fixed by Francisco Blas
-      Izquierdo Riera.
-
-  o Major bugfixes (hidden services):
-    - When closing an introduction circuit that was opened in parallel
-      with others, don't mark the introduction point as unreachable.
-      Previously, the first successful connection to an introduction
-      point would make the other introduction points get marked as
-      having timed out. Fixes bug 13698; bugfix on 0.0.6rc2.
-
-  o Directory authority changes:
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-
-  o Major removed features:
-    - Tor clients no longer support connecting to hidden services
-      running on Tor 0.2.2.x and earlier; the Support022HiddenServices
-      option has been removed. (There shouldn't be any hidden services
-      running these versions on the network.) Closes ticket 7803.
-
-  o Minor features (client):
-    - Validate hostnames in SOCKS5 requests more strictly. If SafeSocks
-      is enabled, reject requests with IP addresses as hostnames.
-      Resolves ticket 13315.
-
-  o Minor features (controller):
-    - Add a "SIGNAL HEARTBEAT" controller command that tells Tor to
-      write an unscheduled heartbeat message to the log. Implements
-      feature 9503.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 15 2014 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden services):
-    - When re-enabling the network, don't try to build introduction
-      circuits until we have successfully built a circuit. This makes
-      hidden services come up faster when the network is re-enabled.
-      Patch from "akwizgran". Closes ticket 13447.
-    - When we fail to retrieve a hidden service descriptor, send the
-      controller an "HS_DESC FAILED" controller event. Implements
-      feature 13212.
-    - New HiddenServiceDirGroupReadable option to cause hidden service
-      directories and hostname files to be created group-readable. Patch
-      from "anon", David Stainton, and "meejah". Closes ticket 11291.
-
-  o Minor features (systemd):
-    - Where supported, when running with systemd, report successful
-      startup to systemd. Part of ticket 11016. Patch by Michael Scherer.
-    - When running with systemd, support systemd watchdog messages. Part
-      of ticket 11016. Patch by Michael Scherer.
-
-  o Minor features (transparent proxy):
-    - Update the transparent proxy option checks to allow for both ipfw
-      and pf on OS X. Closes ticket 14002.
-    - Use the correct option when using IPv6 with transparent proxy
-      support on Linux. Resolves 13808. Patch by Francisco Blas
-      Izquierdo Riera.
-
-  o Minor bugfixes (preventative security, C safety):
-    - When reading a hexadecimal, base-32, or base-64 encoded value from
-      a string, always overwrite the whole output buffer. This prevents
-      some bugs where we would look at (but fortunately, not reveal)
-      uninitialized memory on the stack. Fixes bug 14013; bugfix on all
-      versions of Tor.
-    - Clear all memory targetted by tor_addr_{to,from}_sockaddr(), not
-      just the part that's used. This makes it harder for data leak bugs
-      to occur in the event of other programming failures. Resolves
-      ticket 14041.
-
-  o Minor bugfixes (client, microdescriptors):
-    - Use a full 256 bits of the SHA256 digest of a microdescriptor when
-      computing which microdescriptors to download. This keeps us from
-      erroneous download behavior if two microdescriptor digests ever
-      have the same first 160 bits. Fixes part of bug 13399; bugfix
-      on 0.2.3.1-alpha.
-    - Reset a router's status if its microdescriptor digest changes,
-      even if the first 160 bits remain the same. Fixes part of bug
-      13399; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (compilation):
-    - Silence clang warnings under --enable-expensive-hardening,
-      including implicit truncation of 64 bit values to 32 bit, const
-      char assignment to self, tautological compare, and additional
-      parentheses around equality tests. Fixes bug 13577; bugfix
-      on 0.2.5.4-alpha.
-    - Fix a clang warning about checking whether an address in the
-      middle of a structure is NULL. Fixes bug 14001; bugfix
-      on 0.2.1.2-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Correctly send a controller event when we find that a rendezvous
-      circuit has finished. Fixes bug 13936; bugfix on 0.1.1.5-alpha.
-    - Pre-check directory permissions for new hidden-services to avoid
-      at least one case of "Bug: Acting on config options left us in a
-      broken state. Dying." Fixes bug 13942; bugfix on 0.0.6pre1.
-    - When adding a new hidden service (for example, via SETCONF), Tor
-      no longer congratulates the user for running a relay. Fixes bug
-      13941; bugfix on 0.2.6.1-alpha.
-    - When fetching hidden service descriptors, we now check not only
-      for whether we got the hidden service we had in mind, but also
-      whether we got the particular descriptors we wanted. This prevents
-      a class of inefficient but annoying DoS attacks by hidden service
-      directories. Fixes bug 13214; bugfix on 0.2.1.6-alpha. Reported
-      by "special".
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Make transparent proxy support work along with the seccomp2
-      sandbox. Fixes part of bug 13808; bugfix on 0.2.5.1-alpha. Patch
-      by Francisco Blas Izquierdo Riera.
-    - Fix a memory leak in tor-resolve when running with the sandbox
-      enabled. Fixes bug 14050; bugfix on 0.2.5.9-rc.
-
-  o Minor bugfixes (logging):
-    - Downgrade warnings about RSA signature failures to info log level.
-      Emit a warning when an extra info document is found incompatible
-      with a corresponding router descriptor. Fixes bug 9812; bugfix
-      on 0.0.6rc3.
-    - Make connection_ap_handshake_attach_circuit() log the circuit ID
-      correctly. Fixes bug 13701; bugfix on 0.0.6.
-
-  o Minor bugfixes (misc):
-    - Stop allowing invalid address patterns like "*/24" that contain
-      both a wildcard address and a bit prefix length. This affects all
-      our address-range parsing code. Fixes bug 7484; bugfix
-      on 0.0.2pre14.
-
-  o Minor bugfixes (testing networks, fast startup):
-    - Allow Tor to build circuits using a consensus with no exits. If
-      the consensus has no exits (typical of a bootstrapping test
-      network), allow Tor to build circuits once enough descriptors have
-      been downloaded. This assists in bootstrapping a testing Tor
-      network. Fixes bug 13718; bugfix on 0.2.4.10-alpha. Patch
-      by "teor".
-    - When V3AuthVotingInterval is low, give a lower If-Modified-Since
-      header to directory servers. This allows us to obtain consensuses
-      promptly when the consensus interval is very short. This assists
-      in bootstrapping a testing Tor network. Fixes parts of bugs 13718
-      and 13963; bugfix on 0.2.0.3-alpha. Patch by "teor".
-    - Stop assuming that private addresses are local when checking
-      reachability in a TestingTorNetwork. Instead, when testing, assume
-      all OR connections are remote. (This is necessary due to many test
-      scenarios running all relays on localhost.) This assists in
-      bootstrapping a testing Tor network. Fixes bug 13924; bugfix on
-      0.1.0.1-rc. Patch by "teor".
-    - Avoid building exit circuits from a consensus with no exits. Now
-      thanks to our fix for 13718, we accept a no-exit network as not
-      wholly lost, but we need to remember not to try to build exit
-      circuits on it. Closes ticket 13814; patch by "teor".
-    - Stop requiring exits to have non-zero bandwithcapacity in a
-      TestingTorNetwork. Instead, when TestingMinExitFlagThreshold is 0,
-      ignore exit bandwidthcapacity. This assists in bootstrapping a
-      testing Tor network. Fixes parts of bugs 13718 and 13839; bugfix
-      on 0.2.0.3-alpha. Patch by "teor".
-    - Add "internal" to some bootstrap statuses when no exits are
-      available. If the consensus does not contain Exits, Tor will only
-      build internal circuits. In this case, relevant statuses will
-      contain the word "internal" as indicated in the Tor control-
-       spec.txt. When bootstrap completes, Tor will be ready to build
-      internal circuits. If a future consensus contains Exits, exit
-      circuits may become available. Fixes part of bug 13718; bugfix on
-      0.2.4.10-alpha. Patch by "teor".
-    - Decrease minimum consensus interval to 10 seconds when
-      TestingTorNetwork is set, or 5 seconds for the first consensus.
-      Fix assumptions throughout the code that assume larger intervals.
-      Fixes bugs 13718 and 13823; bugfix on 0.2.0.3-alpha. Patch
-      by "teor".
-    - Avoid excluding guards from path building in minimal test
-      networks, when we're in a test network and excluding guards would
-      exclude all relays. This typically occurs in incredibly small tor
-      networks, and those using "TestingAuthVoteGuard *". Fixes part of
-      bug 13718; bugfix on 0.1.1.11-alpha. Patch by "teor".
-
-  o Code simplification and refactoring:
-    - Stop using can_complete_circuits as a global variable; access it
-      with a function instead.
-    - Avoid using operators directly as macro arguments: this lets us
-      apply coccinelle transformations to our codebase more directly.
-      Closes ticket 13172.
-    - Combine the functions used to parse ClientTransportPlugin and
-      ServerTransportPlugin into a single function. Closes ticket 6456.
-    - Add inline functions and convenience macros for inspecting channel
-      state. Refactor the code to use convenience macros instead of
-      checking channel state directly. Fixes issue 7356.
-    - Document all members of was_router_added_t and rename
-      ROUTER_WAS_NOT_NEW to ROUTER_IS_ALREADY_KNOWN to make it less
-      confusable with ROUTER_WAS_TOO_OLD. Fixes issue 13644.
-    - In connection_exit_begin_conn(), use END_CIRC_REASON_TORPROTOCOL
-      constant instead of hardcoded value. Fixes issue 13840.
-    - Refactor our generic strmap and digestmap types into a single
-      implementation, so that we can add a new digest256map
-      type trivially.
-
-  o Documentation:
-    - Document the bridge-authority-only 'networkstatus-bridges' file.
-      Closes ticket 13713; patch from "tom".
-    - Fix typo in PredictedPortsRelevanceTime option description in
-      manpage. Resolves issue 13707.
-    - Stop suggesting that users specify relays by nickname: it isn't a
-      good idea. Also, properly cross-reference how to specify relays in
-      all parts of manual documenting options that take a list of
-      relays. Closes ticket 13381.
-    - Clarify the HiddenServiceDir option description in manpage to make
-      it clear that relative paths are taken with respect to the current
-      working directory. Also clarify that this behavior is not
-      guaranteed to remain indefinitely. Fixes issue 13913.
-
-  o Testing:
-    - New tests for many parts of channel, relay, and circuitmux
-      functionality. Code by Andrea; part of 9262.
-    - New tests for parse_transport_line(). Part of ticket 6456.
-    - In the unit tests, use chgrp() to change the group of the unit
-      test temporary directory to the current user, so that the sticky
-      bit doesn't interfere with tests that check directory groups.
-      Closes 13678.
-    - Add unit tests for resolve_my_addr(). Part of ticket 12376; patch
-      by 'rl1987'.
-
-
-Changes in version 0.2.6.1-alpha - 2014-10-30
-  Tor 0.2.6.1-alpha is the first release in the Tor 0.2.6.x series. It
-  includes numerous code cleanups and new tests, and fixes a large
-  number of annoying bugs. Out-of-memory conditions are handled better
-  than in 0.2.5, pluggable transports have improved proxy support, and
-  clients now use optimistic data for contacting hidden services. Also,
-  we are now more robust to changes in what we consider a parseable
-  directory object, so that tightening restrictions does not have a risk
-  of introducing infinite download loops.
-
-  This is the first alpha release in a new series, so expect there to be
-  bugs. Users who would rather test out a more stable branch should stay
-  with 0.2.5.x for now.
-
-  o New compiler and system requirements:
-    - Tor 0.2.6.x requires that your compiler support more of the C99
-      language standard than before. The 'configure' script now detects
-      whether your compiler supports C99 mid-block declarations and
-      designated initializers. If it does not, Tor will not compile.
-
-      We may revisit this requirement if it turns out that a significant
-      number of people need to build Tor with compilers that don't
-      bother implementing a 15-year-old standard. Closes ticket 13233.
-    - Tor no longer supports systems without threading support. When we
-      began working on Tor, there were several systems that didn't have
-      threads, or where the thread support wasn't able to run the
-      threads of a single process on multiple CPUs. That no longer
-      holds: every system where Tor needs to run well now has threading
-      support. Resolves ticket 12439.
-
-  o Removed platform support:
-    - We no longer include special code to build on Windows CE; as far
-      as we know, nobody has used Tor on Windows CE in a very long time.
-      Closes ticket 11446.
-
-  o Major features (bridges):
-    - Expose the outgoing upstream HTTP/SOCKS proxy to pluggable
-      transports if they are configured via the "TOR_PT_PROXY"
-      environment variable. Implements proposal 232. Resolves
-      ticket 8402.
-
-  o Major features (client performance, hidden services):
-    - Allow clients to use optimistic data when connecting to a hidden
-      service, which should remove a round-trip from hidden service
-      initialization. See proposal 181 for details. Implements
-      ticket 13211.
-
-  o Major features (directory system):
-    - Upon receiving an unparseable directory object, if its digest
-      matches what we expected, then don't try to download it again.
-      Previously, when we got a descriptor we didn't like, we would keep
-      trying to download it over and over. Closes ticket 11243.
-
-  o Major features (sample torrc):
-    - Add a new, infrequently-changed "torrc.minimal". This file is
-      similar to torrc.sample, but it will change as infrequently as
-      possible, for the benefit of users whose systems prompt them for
-      intervention whenever a default configuration file is changed.
-      Making this change allows us to update torrc.sample to be a more
-      generally useful "sample torrc".
-
-  o Major bugfixes (directory authorities):
-    - Do not assign the HSDir flag to relays if they are not Valid, or
-      currently hibernating. Fixes 12573; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (directory bandwidth performance):
-    - Don't flush the zlib buffer aggressively when compressing
-      directory information for clients. This should save about 7% of
-      the bandwidth currently used for compressed descriptors and
-      microdescriptors. Fixes bug 11787; bugfix on 0.1.1.23.
-
-  o Minor features (security, memory wiping):
-    - Ensure we securely wipe keys from memory after
-      crypto_digest_get_digest and init_curve25519_keypair_from_file
-      have finished using them. Resolves ticket 13477.
-
-  o Minor features (security, out-of-memory handling):
-    - When handling an out-of-memory condition, allocate less memory for
-      temporary data structures. Fixes issue 10115.
-    - When handling an out-of-memory condition, consider more types of
-      buffers, including those on directory connections, and zlib
-      buffers. Resolves ticket 11792.
-
-  o Minor features:
-    - When identity keypair is generated for first time, log a
-      congratulatory message that links to the new relay lifecycle
-      document. Implements feature 10427.
-
-  o Minor features (client):
-    - Clients are now willing to send optimistic data (before they
-      receive a 'connected' cell) to relays of any version. (Relays
-      without support for optimistic data are no longer supported on the
-      Tor network.) Resolves ticket 13153.
-
-  o Minor features (directory authorities):
-    - Don't list relays with a bandwidth estimate of 0 in the consensus.
-      Implements a feature proposed during discussion of bug 13000.
-    - In tor-gencert, report an error if the user provides the same
-      argument more than once.
-    - If a directory authority can't find a best consensus method in the
-      votes that it holds, it now falls back to its favorite consensus
-      method. Previously, it fell back to method 1. Neither of these is
-      likely to get enough signatures, but "fall back to favorite"
-      doesn't require us to maintain support an obsolete consensus
-      method. Implements part of proposal 215.
-
-  o Minor features (logging):
-    - On Unix-like systems, you can now use named pipes as the target of
-      the Log option, and other options that try to append to files.
-      Closes ticket 12061. Patch from "carlo von lynX".
-    - When opening a log file at startup, send it every log message that
-      we generated between startup and opening it. Previously, log
-      messages that were generated before opening the log file were only
-      logged to stdout. Closes ticket 6938.
-    - Add a TruncateLogFile option to overwrite logs instead of
-      appending to them. Closes ticket 5583.
-
-  o Minor features (portability, Solaris):
-    - Threads are no longer disabled by default on Solaris; we believe
-      that the versions of Solaris with broken threading support are all
-      obsolete by now. Resolves ticket 9495.
-
-  o Minor features (relay):
-    - Re-check our address after we detect a changed IP address from
-      getsockname(). This ensures that the controller command "GETINFO
-      address" will report the correct value. Resolves ticket 11582.
-      Patch from "ra".
-    - A new AccountingRule option lets Relays set whether they'd like
-      AccountingMax to be applied separately to inbound and outbound
-      traffic, or applied to the sum of inbound and outbound traffic.
-      Resolves ticket 961. Patch by "chobe".
-
-  o Minor features (testing networks):
-    - Add the TestingDirAuthVoteExit option, which lists nodes to assign
-      the "Exit" flag regardless of their uptime, bandwidth, or exit
-      policy. TestingTorNetwork must be set for this option to have any
-      effect. Previously, authorities would take up to 35 minutes to
-      give nodes the Exit flag in a test network. Partially implements
-      ticket 13161.
-
-  o Minor features (validation):
-    - Check all date/time values passed to tor_timegm and
-      parse_rfc1123_time for validity, taking leap years into account.
-      Improves HTTP header validation. Implemented with bug 13476.
-    - In correct_tm(), limit the range of values returned by system
-      localtime(_r) and gmtime(_r) to be between the years 1 and 8099.
-      This means we don't have to deal with negative or too large dates,
-      even if a clock is wrong. Otherwise we might fail to read a file
-      written by us which includes such a date. Fixes bug 13476.
-
-  o Minor bugfixes (bridge clients):
-    - When configured to use a bridge without an identity digest (not
-      recommended), avoid launching an extra channel to it when
-      bootstrapping. Fixes bug 7733; bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (bridges):
-    - When DisableNetwork is set, do not launch pluggable transport
-      plugins, and if any are running, terminate them. Fixes bug 13213;
-      bugfix on 0.2.3.6-alpha.
-
-  o Minor bugfixes (C correctness):
-    - Fix several instances of possible integer overflow/underflow/NaN.
-      Fixes bug 13104; bugfix on 0.2.3.1-alpha and later. Patches
-      from "teor".
-    - In circuit_build_times_calculate_timeout() in circuitstats.c,
-      avoid dividing by zero in the pareto calculations. This traps
-      under clang's "undefined-trap" sanitizer. Fixes bug 13290; bugfix
-      on 0.2.2.2-alpha.
-    - Fix an integer overflow in format_time_interval(). Fixes bug
-      13393; bugfix on 0.2.0.10-alpha.
-    - Set the correct day of year value when the system's localtime(_r)
-      or gmtime(_r) functions fail to set struct tm. Not externally
-      visible. Fixes bug 13476; bugfix on 0.0.2pre14.
-    - Avoid unlikely signed integer overflow in tor_timegm on systems
-      with 32-bit time_t. Fixes bug 13476; bugfix on 0.0.2pre14.
-
-  o Minor bugfixes (client):
-    - Fix smartlist_choose_node_by_bandwidth() so that relays with the
-      BadExit flag are not considered worthy candidates. Fixes bug
-      13066; bugfix on 0.1.2.3-alpha.
-    - Use the consensus schedule for downloading consensuses, and not
-      the generic schedule. Fixes bug 11679; bugfix on 0.2.2.6-alpha.
-    - Handle unsupported or malformed SOCKS5 requests properly by
-      responding with the appropriate error message before closing the
-      connection. Fixes bugs 12971 and 13314; bugfix on 0.0.2pre13.
-
-  o Minor bugfixes (client, torrc):
-    - Stop modifying the value of our DirReqStatistics torrc option just
-      because we're not a bridge or relay. This bug was causing Tor
-      Browser users to write "DirReqStatistics 0" in their torrc files
-      as if they had chosen to change the config. Fixes bug 4244; bugfix
-      on 0.2.3.1-alpha.
-    - When GeoIPExcludeUnknown is enabled, do not incorrectly decide
-      that our options have changed every time we SIGHUP. Fixes bug
-      9801; bugfix on 0.2.4.10-alpha. Patch from "qwerty1".
-
-  o Minor bugfixes (controller):
-    - Return an error when the second or later arguments of the
-      "setevents" controller command are invalid events. Previously we
-      would return success while silently skipping invalid events. Fixes
-      bug 13205; bugfix on 0.2.3.2-alpha. Reported by "fpxnns".
-
-  o Minor bugfixes (directory system):
-    - Always believe that v3 directory authorities serve extra-info
-      documents, whether they advertise "caches-extra-info" or not.
-      Fixes part of bug 11683; bugfix on 0.2.0.1-alpha.
-    - When running as a v3 directory authority, advertise that you serve
-      extra-info documents so that clients who want them can find them
-      from you too. Fixes part of bug 11683; bugfix on 0.2.0.1-alpha.
-    - Check the BRIDGE_DIRINFO flag bitwise rather than using equality.
-      Previously, directories offering BRIDGE_DIRINFO and some other
-      flag (i.e. microdescriptors or extrainfo) would be ignored when
-      looking for bridges. Partially fixes bug 13163; bugfix
-      on 0.2.0.7-alpha.
-
-  o Minor bugfixes (networking):
-    - Check for orconns and use connection_or_close_for_error() rather
-      than connection_mark_for_close() directly in the getsockopt()
-      failure case of connection_handle_write_impl(). Fixes bug 11302;
-      bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (relay):
-    - When generating our family list, remove spaces from around the
-      entries. Fixes bug 12728; bugfix on 0.2.1.7-alpha.
-    - If our previous bandwidth estimate was 0 bytes, allow publishing a
-      new relay descriptor immediately. Fixes bug 13000; bugfix
-      on 0.1.1.6-alpha.
-
-  o Minor bugfixes (testing networks):
-    - Fix TestingDirAuthVoteGuard to properly give out Guard flags in a
-      testing network. Fixes bug 13064; bugfix on 0.2.5.2-alpha.
-    - Stop using the default authorities in networks which provide both
-      AlternateDirAuthority and AlternateBridgeAuthority. Partially
-      fixes bug 13163; bugfix on 0.2.0.13-alpha.
-
-  o Minor bugfixes (testing):
-    - Stop spawn test failures due to a race condition between the
-      SIGCHLD handler updating the process status, and the test reading
-      it. Fixes bug 13291; bugfix on 0.2.3.3-alpha.
-
-  o Minor bugfixes (testing, Windows):
-    - Avoid passing an extra backslash when creating a temporary
-      directory for running the unit tests on Windows. Fixes bug 12392;
-      bugfix on 0.2.2.25-alpha. Patch from Gisle Vanem.
-
-  o Minor bugfixes (windows):
-    - Remove code to special-case handling of NTE_BAD_KEYSET when
-      acquiring windows CryptoAPI context. This error can't actually
-      occur for the parameters we're providing. Fixes bug 10816; bugfix
-      on 0.0.2pre26.
-
-  o Minor bugfixes (zlib):
-    - Avoid truncating a zlib stream when trying to finalize it with an
-      empty output buffer. Fixes bug 11824; bugfix on 0.1.1.23.
-
-  o Build fixes:
-    - Allow our configure script to build correctly with autoconf 2.62
-      again. Fixes bug 12693; bugfix on 0.2.5.2-alpha.
-    - Improve the error message from ./configure to make it clear that
-      when asciidoc has not been found, the user will have to either add
-      --disable-asciidoc argument or install asciidoc. Resolves
-      ticket 13228.
-
-  o Code simplification and refactoring:
-    - Change the entry_is_live() function to take named bitfield
-      elements instead of an unnamed list of booleans. Closes
-      ticket 12202.
-    - Refactor and unit-test entry_is_time_to_retry() in entrynodes.c.
-      Resolves ticket 12205.
-    - Use calloc and reallocarray functions instead of multiply-
-      then-malloc. This makes it less likely for us to fall victim to an
-      integer overflow attack when allocating. Resolves ticket 12855.
-    - Use the standard macro name SIZE_MAX, instead of our
-      own SIZE_T_MAX.
-    - Document usage of the NO_DIRINFO and ALL_DIRINFO flags clearly in
-      functions which take them as arguments. Replace 0 with NO_DIRINFO
-      in a function call for clarity. Seeks to prevent future issues
-      like 13163.
-    - Avoid 4 null pointer errors under clang static analysis by using
-      tor_assert() to prove that the pointers aren't null. Fixes
-      bug 13284.
-    - Rework the API of policies_parse_exit_policy() to use a bitmask to
-      represent parsing options, instead of a confusing mess of
-      booleans. Resolves ticket 8197.
-    - Introduce a helper function to parse ExitPolicy in
-      or_options_t structure.
-
-  o Documentation:
-    - Add a doc/TUNING document with tips for handling large numbers of
-      TCP connections when running busy Tor relay. Update the warning
-      message to point to this file when running out of sockets
-      operating system is allowing to use simultaneously. Resolves
-      ticket 9708.
-
-  o Removed features:
-    - We no longer remind the user about configuration options that have
-      been obsolete since 0.2.3.x or earlier. Patch by Adrien Bak.
-    - Remove our old, non-weighted bandwidth-based node selection code.
-      Previously, we used it as a fallback when we couldn't perform
-      weighted bandwidth-based node selection. But that would only
-      happen in the cases where we had no consensus, or when we had a
-      consensus generated by buggy or ancient directory authorities. In
-      either case, it's better to use the more modern, better maintained
-      algorithm, with reasonable defaults for the weights. Closes
-      ticket 13126.
-    - Remove the --disable-curve25519 configure option. Relays and
-      clients now are required to support curve25519 and the
-      ntor handshake.
-    - The old "StrictEntryNodes" and "StrictExitNodes" options, which
-      used to be deprecated synonyms for "StrictNodes", are now marked
-      obsolete. Resolves ticket 12226.
-    - Clients don't understand the BadDirectory flag in the consensus
-      anymore, and ignore it.
-
-  o Testing:
-    - Refactor the function that chooses guard nodes so that it can more
-      easily be tested; write some tests for it.
-    - Fix and re-enable the fgets_eagain unit test. Fixes bug 12503;
-      bugfix on 0.2.3.1-alpha. Patch from "cypherpunks."
-    - Create unit tests for format_time_interval(). With bug 13393.
-    - Add unit tests for tor_timegm signed overflow, tor_timegm and
-      parse_rfc1123_time validity checks, correct_tm year clamping. Unit
-      tests (visible) fixes in bug 13476.
-    - Add a "coverage-html" make target to generate HTML-visualized
-      coverage results when building with --enable-coverage. (Requires
-      lcov.) Patch from Kevin Murray.
-    - Enable the backtrace handler (where supported) when running the
-      unit tests.
-    - Revise all unit tests that used the legacy test_* macros to
-      instead use the recommended tt_* macros. This patch was generated
-      with coccinelle, to avoid manual errors. Closes ticket 13119.
-
-  o Distribution (systemd):
-    - systemd unit file: only allow tor to write to /var/lib/tor and
-      /var/log/tor. The rest of the filesystem is accessible for reading
-      only. Patch by intrigeri; resolves ticket 12751.
-    - systemd unit file: ensure that the process and all its children
-      can never gain new privileges. Patch by intrigeri; resolves
-      ticket 12939.
-    - systemd unit file: set up /var/run/tor as writable for the Tor
-      service. Patch by intrigeri; resolves ticket 13196.
-
-  o Removed features (directory authorities):
-    - Remove code that prevented authorities from listing Tor relays
-      affected by CVE-2011-2769 as guards. These relays are already
-      rejected altogether due to the minimum version requirement of
-      0.2.3.16-alpha. Closes ticket 13152.
-    - The "AuthDirRejectUnlisted" option no longer has any effect, as
-      the fingerprints file (approved-routers) has been deprecated.
-    - Directory authorities do not support being Naming dirauths anymore.
-      The "NamingAuthoritativeDir" config option is now obsolete.
-    - Directory authorities do not support giving out the BadDirectory
-      flag anymore.
-    - Directory authorities no longer advertise or support consensus
-      methods 1 through 12 inclusive. These consensus methods were
-      obsolete and/or insecure: maintaining the ability to support them
-      served no good purpose. Implements part of proposal 215; closes
-      ticket 10163.
-
-  o Testing (test-network.sh):
-    - Stop using "echo -n", as some shells' built-in echo doesn't
-      support "-n". Instead, use "/bin/echo -n". Partially fixes
-      bug 13161.
-    - Stop an apparent test-network hang when used with make -j2. Fixes
-      bug 13331.
-    - Add a --delay option to test-network.sh, which configures the
-      delay before the chutney network tests for data transmission.
-      Partially implements ticket 13161.
-
-
-Changes in version 0.2.5.10 - 2014-10-24
-  Tor 0.2.5.10 is the first stable release in the 0.2.5 series.
-
-  It adds several new security features, including improved
-  denial-of-service resistance for relays, new compiler hardening
-  options, and a system-call sandbox for hardened installations on Linux
-  (requires seccomp2). The controller protocol has several new features,
-  resolving IPv6 addresses should work better than before, and relays
-  should be a little more CPU-efficient. We've added support for more
-  OpenBSD and FreeBSD transparent proxy types. We've improved the build
-  system and testing infrastructure to allow unit testing of more parts
-  of the Tor codebase. Finally, we've addressed several nagging pluggable
-  transport usability issues, and included numerous other small bugfixes
-  and features mentioned below.
-
-  This release marks end-of-life for Tor 0.2.3.x; those Tor versions
-  have accumulated many known flaws; everyone should upgrade.
-
-  o Deprecated versions:
-    - Tor 0.2.3.x has reached end-of-life; it has received no patches or
-      attention for some while.
-
-
-Changes in version 0.2.5.9-rc - 2014-10-20
-  Tor 0.2.5.9-rc is the third release candidate for the Tor 0.2.5.x
-  series. It disables SSL3 in response to the recent "POODLE" attack
-  (even though POODLE does not affect Tor). It also works around a crash
-  bug caused by some operating systems' response to the "POODLE" attack
-  (which does affect Tor). It also contains a few miscellaneous fixes.
-
-  o Major security fixes:
-    - Disable support for SSLv3. All versions of OpenSSL in use with Tor
-      today support TLS 1.0 or later, so we can safely turn off support
-      for this old (and insecure) protocol. Fixes bug 13426.
-
-  o Major bugfixes (openssl bug workaround):
-    - Avoid crashing when using OpenSSL version 0.9.8zc, 1.0.0o, or
-      1.0.1j, built with the 'no-ssl3' configuration option. Fixes bug
-      13471. This is a workaround for an OpenSSL bug.
-
-  o Minor bugfixes:
-    - Disable the sandbox name resolver cache when running tor-resolve:
-      tor-resolve doesn't use the sandbox code, and turning it on was
-      breaking attempts to do tor-resolve on a non-default server on
-      Linux. Fixes bug 13295; bugfix on 0.2.5.3-alpha.
-
-  o Compilation fixes:
-    - Build and run correctly on systems like OpenBSD-current that have
-      patched OpenSSL to remove get_cipher_by_char and/or its
-      implementations. Fixes issue 13325.
-
-  o Downgraded warnings:
-    - Downgrade the severity of the 'unexpected sendme cell from client'
-      from 'warn' to 'protocol warning'. Closes ticket 8093.
-
-
-Changes in version 0.2.4.25 - 2014-10-20
-  Tor 0.2.4.25 disables SSL3 in response to the recent "POODLE" attack
-  (even though POODLE does not affect Tor). It also works around a crash
-  bug caused by some operating systems' response to the "POODLE" attack
-  (which does affect Tor).
-
-  o Major security fixes (also in 0.2.5.9-rc):
-    - Disable support for SSLv3. All versions of OpenSSL in use with Tor
-      today support TLS 1.0 or later, so we can safely turn off support
-      for this old (and insecure) protocol. Fixes bug 13426.
-
-  o Major bugfixes (openssl bug workaround, also in 0.2.5.9-rc):
-    - Avoid crashing when using OpenSSL version 0.9.8zc, 1.0.0o, or
-      1.0.1j, built with the 'no-ssl3' configuration option. Fixes bug
-      13471. This is a workaround for an OpenSSL bug.
-
-
-Changes in version 0.2.5.8-rc - 2014-09-22
-  Tor 0.2.5.8-rc is the second release candidate for the Tor 0.2.5.x
-  series. It fixes a bug that affects consistency and speed when
-  connecting to hidden services, and it updates the location of one of
-  the directory authorities.
-
-  o Major bugfixes:
-    - Clients now send the correct address for their chosen rendezvous
-      point when trying to access a hidden service. They used to send
-      the wrong address, which would still work some of the time because
-      they also sent the identity digest of the rendezvous point, and if
-      the hidden service happened to try connecting to the rendezvous
-      point from a relay that already had a connection open to it,
-      the relay would reuse that connection. Now connections to hidden
-      services should be more robust and faster. Also, this bug meant
-      that clients were leaking to the hidden service whether they were
-      on a little-endian (common) or big-endian (rare) system, which for
-      some users might have reduced their anonymity. Fixes bug 13151;
-      bugfix on 0.2.1.5-alpha.
-
-  o Directory authority changes:
-    - Change IP address for gabelmoo (v3 directory authority).
-
-
-Changes in version 0.2.4.24 - 2014-09-22
-  Tor 0.2.4.24 fixes a bug that affects consistency and speed when
-  connecting to hidden services, and it updates the location of one of
-  the directory authorities.
-
-  o Major bugfixes:
-    - Clients now send the correct address for their chosen rendezvous
-      point when trying to access a hidden service. They used to send
-      the wrong address, which would still work some of the time because
-      they also sent the identity digest of the rendezvous point, and if
-      the hidden service happened to try connecting to the rendezvous
-      point from a relay that already had a connection open to it,
-      the relay would reuse that connection. Now connections to hidden
-      services should be more robust and faster. Also, this bug meant
-      that clients were leaking to the hidden service whether they were
-      on a little-endian (common) or big-endian (rare) system, which for
-      some users might have reduced their anonymity. Fixes bug 13151;
-      bugfix on 0.2.1.5-alpha.
-
-  o Directory authority changes:
-    - Change IP address for gabelmoo (v3 directory authority).
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 7 2014 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.5.7-rc - 2014-09-11
-  Tor 0.2.5.7-rc fixes several regressions from earlier in the 0.2.5.x
-  release series, and some long-standing bugs related to ORPort reachability
-  testing and failure to send CREATE cells. It is the first release
-  candidate for the Tor 0.2.5.x series.
-
-  o Major bugfixes (client, startup):
-    - Start making circuits as soon as DisabledNetwork is turned off.
-      When Tor started with DisabledNetwork set, it would correctly
-      conclude that it shouldn't build circuits, but it would mistakenly
-      cache this conclusion, and continue believing it even when
-      DisableNetwork is set to 0. Fixes the bug introduced by the fix
-      for bug 11200; bugfix on 0.2.5.4-alpha.
-    - Resume expanding abbreviations for command-line options. The fix
-      for bug 4647 accidentally removed our hack from bug 586 that
-      rewrote HashedControlPassword to __HashedControlSessionPassword
-      when it appears on the commandline (which allowed the user to set
-      her own HashedControlPassword in the torrc file while the
-      controller generates a fresh session password for each run). Fixes
-      bug 12948; bugfix on 0.2.5.1-alpha.
-    - Warn about attempts to run hidden services and relays in the same
-      process: that's probably not a good idea. Closes ticket 12908.
-
-  o Major bugfixes (relay):
-    - Avoid queuing or sending destroy cells for circuit ID zero when we
-      fail to send a CREATE cell. Fixes bug 12848; bugfix on 0.0.8pre1.
-      Found and fixed by "cypherpunks".
-    - Fix ORPort reachability detection on relays running behind a
-      proxy, by correctly updating the "local" mark on the controlling
-      channel when changing the address of an or_connection_t after the
-      handshake. Fixes bug 12160; bugfix on 0.2.4.4-alpha.
-
-  o Minor features (bridge):
-    - Add an ExtORPortCookieAuthFileGroupReadable option to make the
-      cookie file for the ExtORPort g+r by default.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 7 2014 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (logging):
-    - Reduce the log severity of the "Pluggable transport proxy does not
-      provide any needed transports and will not be launched." message,
-      since Tor Browser includes several ClientTransportPlugin lines in
-      its torrc-defaults file, leading every Tor Browser user who looks
-      at her logs to see these notices and wonder if they're dangerous.
-      Resolves bug 13124; bugfix on 0.2.5.3-alpha.
-    - Downgrade "Unexpected onionskin length after decryption" warning
-      to a protocol-warn, since there's nothing relay operators can do
-      about a client that sends them a malformed create cell. Resolves
-      bug 12996; bugfix on 0.0.6rc1.
-    - Log more specific warnings when we get an ESTABLISH_RENDEZVOUS
-      cell on a cannibalized or non-OR circuit. Resolves ticket 12997.
-    - When logging information about an EXTEND2 or EXTENDED2 cell, log
-      their names correctly. Fixes part of bug 12700; bugfix
-      on 0.2.4.8-alpha.
-    - When logging information about a relay cell whose command we don't
-      recognize, log its command as an integer. Fixes part of bug 12700;
-      bugfix on 0.2.1.10-alpha.
-    - Escape all strings from the directory connection before logging
-      them. Fixes bug 13071; bugfix on 0.1.1.15. Patch from "teor".
-
-  o Minor bugfixes (controller):
-    - Restore the functionality of CookieAuthFileGroupReadable. Fixes
-      bug 12864; bugfix on 0.2.5.1-alpha.
-    - Actually send TRANSPORT_LAUNCHED and HS_DESC events to
-      controllers. Fixes bug 13085; bugfix on 0.2.5.1-alpha. Patch
-      by "teor".
-
-  o Minor bugfixes (compilation):
-    - Fix compilation of test.h with MSVC. Patch from Gisle Vanem;
-      bugfix on 0.2.5.5-alpha.
-    - Make the nmake make files work again. Fixes bug 13081. Bugfix on
-      0.2.5.1-alpha. Patch from "NewEraCracker".
-    - In routerlist_assert_ok(), don't take the address of a
-      routerinfo's cache_info member unless that routerinfo is non-NULL.
-      Fixes bug 13096; bugfix on 0.1.1.9-alpha. Patch by "teor".
-    - Fix a large number of false positive warnings from the clang
-      analyzer static analysis tool. This should make real warnings
-      easier for clang analyzer to find. Patch from "teor". Closes
-      ticket 13036.
-
-  o Distribution (systemd):
-    - Verify configuration file via ExecStartPre in the systemd unit
-      file. Patch from intrigeri; resolves ticket 12730.
-    - Explicitly disable RunAsDaemon in the systemd unit file. Our
-      current systemd unit uses "Type = simple", so systemd does not
-      expect tor to fork. If the user has "RunAsDaemon 1" in their
-      torrc, then things won't work as expected. This is e.g. the case
-      on Debian (and derivatives), since there we pass "--defaults-torrc
-      /usr/share/tor/tor-service-defaults-torrc" (that contains
-      "RunAsDaemon 1") by default. Patch by intrigeri; resolves
-      ticket 12731.
-
-  o Documentation:
-    - Adjust the URLs in the README to refer to the new locations of
-      several documents on the website. Fixes bug 12830. Patch from
-      Matt Pagan.
-    - Document 'reject6' and 'accept6' ExitPolicy entries. Resolves
-      ticket 12878.
-
-
-Changes in version 0.2.5.6-alpha - 2014-07-28
-  Tor 0.2.5.6-alpha brings us a big step closer to slowing down the
-  risk from guard rotation, and fixes a variety of other issues to get
-  us closer to a release candidate.
-
-  o Major features (also in 0.2.4.23):
-    - Make the number of entry guards configurable via a new
-      NumEntryGuards consensus parameter, and the number of directory
-      guards configurable via a new NumDirectoryGuards consensus
-      parameter. Implements ticket 12688.
-
-  o Major bugfixes (also in 0.2.4.23):
-    - Fix a bug in the bounds-checking in the 32-bit curve25519-donna
-      implementation that caused incorrect results on 32-bit
-      implementations when certain malformed inputs were used along with
-      a small class of private ntor keys. This bug does not currently
-      appear to allow an attacker to learn private keys or impersonate a
-      Tor server, but it could provide a means to distinguish 32-bit Tor
-      implementations from 64-bit Tor implementations. Fixes bug 12694;
-      bugfix on 0.2.4.8-alpha. Bug found by Robert Ransom; fix from
-      Adam Langley.
-
-  o Major bugfixes:
-    - Perform circuit cleanup operations even when circuit
-      construction operations are disabled (because the network is
-      disabled, or because there isn't enough directory information).
-      Previously, when we were not building predictive circuits, we
-      were not closing expired circuits either. Fixes bug 8387; bugfix on
-      0.1.1.11-alpha. This bug became visible in 0.2.4.10-alpha when we
-      became more strict about when we have "enough directory information
-      to build circuits".
-
-  o Minor features:
-    - Authorities now assign the Guard flag to the fastest 25% of the
-      network (it used to be the fastest 50%). Also raise the consensus
-      weight that guarantees the Guard flag from 250 to 2000. For the
-      current network, this results in about 1100 guards, down from 2500.
-      This step paves the way for moving the number of entry guards
-      down to 1 (proposal 236) while still providing reasonable expected
-      performance for most users. Implements ticket 12690.
-    - Update geoip and geoip6 to the July 10 2014 Maxmind GeoLite2
-      Country database.
-    - Slightly enhance the diagnostic message for bug 12184.
-
-  o Minor bugfixes (also in 0.2.4.23):
-    - Warn and drop the circuit if we receive an inbound 'relay early'
-      cell. Those used to be normal to receive on hidden service circuits
-      due to bug 1038, but the buggy Tor versions are long gone from
-      the network so we can afford to resume watching for them. Resolves
-      the rest of bug 1038; bugfix on 0.2.1.19.
-    - Correct a confusing error message when trying to extend a circuit
-      via the control protocol but we don't know a descriptor or
-      microdescriptor for one of the specified relays. Fixes bug 12718;
-      bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes:
-    - Fix compilation when building with bufferevents enabled. (This
-      configuration is still not expected to work, however.)
-      Fixes bugs 12438, 12474, 11578; bugfixes on 0.2.5.1-alpha and
-      0.2.5.3-alpha. Patches from Anthony G. Basile and Sathyanarayanan
-      Gunasekaran.
-    - Compile correctly with builds and forks of OpenSSL (such as
-      LibreSSL) that disable compression. Fixes bug 12602; bugfix on
-      0.2.1.1-alpha. Patch from "dhill".
-
-
-Changes in version 0.2.4.23 - 2014-07-28
-  Tor 0.2.4.23 brings us a big step closer to slowing down the risk from
-  guard rotation, and also backports several important fixes from the
-  Tor 0.2.5 alpha release series.
-
-  o Major features:
-    - Clients now look at the "usecreatefast" consensus parameter to
-      decide whether to use CREATE_FAST or CREATE cells for the first hop
-      of their circuit. This approach can improve security on connections
-      where Tor's circuit handshake is stronger than the available TLS
-      connection security levels, but the tradeoff is more computational
-      load on guard relays. Implements proposal 221. Resolves ticket 9386.
-    - Make the number of entry guards configurable via a new
-      NumEntryGuards consensus parameter, and the number of directory
-      guards configurable via a new NumDirectoryGuards consensus
-      parameter. Implements ticket 12688.
-
-  o Major bugfixes:
-    - Fix a bug in the bounds-checking in the 32-bit curve25519-donna
-      implementation that caused incorrect results on 32-bit
-      implementations when certain malformed inputs were used along with
-      a small class of private ntor keys. This bug does not currently
-      appear to allow an attacker to learn private keys or impersonate a
-      Tor server, but it could provide a means to distinguish 32-bit Tor
-      implementations from 64-bit Tor implementations. Fixes bug 12694;
-      bugfix on 0.2.4.8-alpha. Bug found by Robert Ransom; fix from
-      Adam Langley.
-
-  o Minor bugfixes:
-    - Warn and drop the circuit if we receive an inbound 'relay early'
-      cell. Those used to be normal to receive on hidden service circuits
-      due to bug 1038, but the buggy Tor versions are long gone from
-      the network so we can afford to resume watching for them. Resolves
-      the rest of bug 1038; bugfix on 0.2.1.19.
-    - Correct a confusing error message when trying to extend a circuit
-      via the control protocol but we don't know a descriptor or
-      microdescriptor for one of the specified relays. Fixes bug 12718;
-      bugfix on 0.2.3.1-alpha.
-    - Avoid an illegal read from stack when initializing the TLS
-      module using a version of OpenSSL without all of the ciphers
-      used by the v2 link handshake. Fixes bug 12227; bugfix on
-      0.2.4.8-alpha.  Found by "starlight".
-
-  o Minor features:
-    - Update geoip and geoip6 to the July 10 2014 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.5.5-alpha - 2014-06-18
-  Tor 0.2.5.5-alpha fixes a wide variety of remaining issues in the Tor
-  0.2.5.x release series, including a couple of DoS issues, some
-  performance regressions, a large number of bugs affecting the Linux
-  seccomp2 sandbox code, and various other bugfixes. It also adds
-  diagnostic bugfixes for a few tricky issues that we're trying to
-  track down.
-
-  o Major features (security, traffic analysis resistance):
-    - Several major improvements to the algorithm used to decide when to
-      close TLS connections. Previous versions of Tor closed connections
-      at a fixed interval after the last time a non-padding cell was
-      sent over the connection, regardless of the target of the
-      connection. Now, we randomize the intervals by adding up to 50% of
-      their base value, we measure the length of time since connection
-      last had at least one circuit, and we allow connections to known
-      ORs to remain open a little longer (15 minutes instead of 3
-      minutes minimum). These changes should improve Tor's resistance
-      against some kinds of traffic analysis, and lower some overhead
-      from needlessly closed connections. Fixes ticket 6799.
-      Incidentally fixes ticket 12023; bugfix on 0.2.5.1-alpha.
-
-  o Major bugfixes (security, OOM, new since 0.2.5.4-alpha, also in 0.2.4.22):
-    - Fix a memory leak that could occur if a microdescriptor parse
-      fails during the tokenizing step. This bug could enable a memory
-      exhaustion attack by directory servers. Fixes bug 11649; bugfix
-      on 0.2.2.6-alpha.
-
-  o Major bugfixes (security, directory authorities):
-    - Directory authorities now include a digest of each relay's
-      identity key as a part of its microdescriptor.
-
-      This is a workaround for bug 11743 (reported by "cypherpunks"),
-      where Tor clients do not support receiving multiple
-      microdescriptors with the same SHA256 digest in the same
-      consensus. When clients receive a consensus like this, they only
-      use one of the relays. Without this fix, a hostile relay could
-      selectively disable some client use of target relays by
-      constructing a router descriptor with a different identity and the
-      same microdescriptor parameters and getting the authorities to
-      list it in a microdescriptor consensus. This fix prevents an
-      attacker from causing a microdescriptor collision, because the
-      router's identity is not forgeable.
-
-  o Major bugfixes (relay):
-    - Use a direct dirport connection when uploading non-anonymous
-      descriptors to the directory authorities. Previously, relays would
-      incorrectly use tunnel connections under a fairly wide variety of
-      circumstances. Fixes bug 11469; bugfix on 0.2.4.3-alpha.
-    - When a circuit accidentally has the same circuit ID for its
-      forward and reverse direction, correctly detect the direction of
-      cells using that circuit. Previously, this bug made roughly one
-      circuit in a million non-functional. Fixes bug 12195; this is a
-      bugfix on every version of Tor.
-
-  o Major bugfixes (client, pluggable transports):
-    - When managing pluggable transports, use OS notification facilities
-      to learn if they have crashed, and don't attempt to kill any
-      process that has already exited. Fixes bug 8746; bugfix
-      on 0.2.3.6-alpha.
-
-  o Minor features (diagnostic):
-    - When logging a warning because of bug 7164, additionally check the
-      hash table for consistency (as proposed on ticket 11737). This may
-      help diagnose bug 7164.
-    - When we log a heartbeat, log how many one-hop circuits we have
-      that are at least 30 minutes old, and log status information about
-      a few of them. This is an attempt to track down bug 8387.
-    - When encountering an unexpected CR while writing text to a file on
-      Windows, log the name of the file. Should help diagnosing
-      bug 11233.
-    - Give more specific warnings when a client notices that an onion
-      handshake has failed. Fixes ticket 9635.
-    - Add significant new logging code to attempt to diagnose bug 12184,
-      where relays seem to run out of available circuit IDs.
-    - Improve the diagnostic log message for bug 8387 even further to
-      try to improve our odds of figuring out why one-hop directory
-      circuits sometimes do not get closed.
-
-  o Minor features (security, memory management):
-    - Memory allocation tricks (mempools and buffer freelists) are now
-      disabled by default. You can turn them back on with
-      --enable-mempools and --enable-buf-freelists respectively. We're
-      disabling these features because malloc performance is good enough
-      on most platforms, and a similar feature in OpenSSL exacerbated
-      exploitation of the Heartbleed attack. Resolves ticket 11476.
-
-  o Minor features (security):
-    - Apply the secure SipHash-2-4 function to the hash table mapping
-      circuit IDs and channels to circuits. We missed this one when we
-      were converting all the other hash functions to use SipHash back
-      in 0.2.5.3-alpha. Resolves ticket 11750.
-
-  o Minor features (build):
-    - The configure script has a --disable-seccomp option to turn off
-      support for libseccomp on systems that have it, in case it (or
-      Tor's use of it) is broken. Resolves ticket 11628.
-
-  o Minor features (other):
-    - Update geoip and geoip6 to the June 4 2014 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (security, new since 0.2.5.4-alpha, also in 0.2.4.22):
-    - When running a hidden service, do not allow TunneledDirConns 0;
-      this will keep the hidden service from running, and also
-      make it publish its descriptors directly over HTTP. Fixes bug 10849;
-      bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (performance):
-    - Avoid a bug where every successful connection made us recompute
-      the flag telling us whether we have sufficient information to
-      build circuits. Previously, we would forget our cached value
-      whenever we successfully opened a channel (or marked a router as
-      running or not running for any other reason), regardless of
-      whether we had previously believed the router to be running. This
-      forced us to run an expensive update operation far too often.
-      Fixes bug 12170; bugfix on 0.1.2.1-alpha.
-    - Avoid using tor_memeq() for checking relay cell integrity. This
-      removes a possible performance bottleneck. Fixes part of bug
-      12169; bugfix on 0.2.1.31.
-
-  o Minor bugfixes (compilation):
-    - Fix compilation of test_status.c when building with MVSC. Bugfix
-      on 0.2.5.4-alpha. Patch from Gisle Vanem.
-    - Resolve GCC complaints on OpenBSD about discarding constness in
-      TO_{ORIGIN,OR}_CIRCUIT functions. Fixes part of bug 11633; bugfix
-      on 0.1.1.23. Patch from Dana Koch.
-    - Resolve clang complaints on OpenBSD with -Wshorten-64-to-32 due to
-      treatment of long and time_t as comparable types. Fixes part of
-      bug 11633. Patch from Dana Koch.
-    - Make Tor compile correctly with --disable-buf-freelists. Fixes bug
-      11623; bugfix on 0.2.5.3-alpha.
-    - When deciding whether to build the 64-bit curve25519
-      implementation, detect platforms where we can compile 128-bit
-      arithmetic but cannot link it. Fixes bug 11729; bugfix on
-      0.2.4.8-alpha. Patch from "conradev".
-    - Fix compilation when DNS_CACHE_DEBUG is enabled. Fixes bug 11761;
-      bugfix on 0.2.3.13-alpha. Found by "cypherpunks".
-    - Fix compilation with dmalloc. Fixes bug 11605; bugfix
-      on 0.2.4.10-alpha.
-
-  o Minor bugfixes (Directory server):
-    - When sending a compressed set of descriptors or microdescriptors,
-      make sure to finalize the zlib stream. Previously, we would write
-      all the compressed data, but if the last descriptor we wanted to
-      send was missing or too old, we would not mark the stream as
-      finished. This caused problems for decompression tools. Fixes bug
-      11648; bugfix on 0.1.1.23.
-
-  o Minor bugfixes (Linux seccomp sandbox):
-    - Make the seccomp sandbox code compile under ARM Linux. Fixes bug
-      11622; bugfix on 0.2.5.1-alpha.
-    - Avoid crashing when re-opening listener ports with the seccomp
-      sandbox active. Fixes bug 12115; bugfix on 0.2.5.1-alpha.
-    - Avoid crashing with the seccomp sandbox enabled along with
-      ConstrainedSockets. Fixes bug 12139; bugfix on 0.2.5.1-alpha.
-    - When we receive a SIGHUP with the sandbox enabled, correctly
-      support rotating our log files. Fixes bug 12032; bugfix
-      on 0.2.5.1-alpha.
-    - Avoid crash when running with sandboxing enabled and
-      DirReqStatistics not disabled. Fixes bug 12035; bugfix
-      on 0.2.5.1-alpha.
-    - Fix a "BUG" warning when trying to write bridge-stats files with
-      the Linux syscall sandbox filter enabled. Fixes bug 12041; bugfix
-      on 0.2.5.1-alpha.
-    - Prevent the sandbox from crashing on startup when run with the
-      --enable-expensive-hardening configuration option. Fixes bug
-      11477; bugfix on 0.2.5.4-alpha.
-    - When running with DirPortFrontPage and sandboxing both enabled,
-      reload the DirPortFrontPage correctly when restarting. Fixes bug
-      12028; bugfix on 0.2.5.1-alpha.
-    - Don't try to enable the sandbox when using the Tor binary to check
-      its configuration, hash a passphrase, or so on. Doing so was
-      crashing on startup for some users. Fixes bug 11609; bugfix
-      on 0.2.5.1-alpha.
-    - Avoid warnings when running with sandboxing and node statistics
-      enabled at the same time. Fixes part of 12064; bugfix on
-      0.2.5.1-alpha. Patch from Michael Wolf.
-    - Avoid warnings when running with sandboxing enabled at the same
-      time as cookie authentication, hidden services, or directory
-      authority voting. Fixes part of 12064; bugfix on 0.2.5.1-alpha.
-    - Do not allow options that require calls to exec to be enabled
-      alongside the seccomp2 sandbox: they will inevitably crash. Fixes
-      bug 12043; bugfix on 0.2.5.1-alpha.
-    - Handle failures in getpwnam()/getpwuid() when running with the
-      User option set and the Linux syscall sandbox enabled. Fixes bug
-      11946; bugfix on 0.2.5.1-alpha.
-    - Refactor the getaddrinfo workaround that the seccomp sandbox uses
-      to avoid calling getaddrinfo() after installing the sandbox
-      filters. Previously, it preloaded a cache with the IPv4 address
-      for our hostname, and nothing else. Now, it loads the cache with
-      every address that it used to initialize the Tor process. Fixes
-      bug 11970; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (pluggable transports):
-    - Enable the ExtORPortCookieAuthFile option, to allow changing the
-      default location of the authentication token for the extended OR
-      Port as used by sever-side pluggable transports. We had
-      implemented this option before, but the code to make it settable
-      had been omitted. Fixes bug 11635; bugfix on 0.2.5.1-alpha.
-    - Avoid another 60-second delay when starting Tor in a pluggable-
-      transport-using configuration when we already have cached
-      descriptors for our bridges. Fixes bug 11965; bugfix
-      on 0.2.3.6-alpha.
-
-  o Minor bugfixes (client):
-    - Avoid "Tried to open a socket with DisableNetwork set" warnings
-      when starting a client with bridges configured and DisableNetwork
-      set. (Tor launcher starts Tor with DisableNetwork set the first
-      time it runs.) Fixes bug 10405; bugfix on 0.2.3.9-alpha.
-
-  o Minor bugfixes (testing):
-    - The Python parts of the test scripts now work on Python 3 as well
-      as Python 2, so systems where '/usr/bin/python' is Python 3 will
-      no longer have the tests break. Fixes bug 11608; bugfix
-      on 0.2.5.2-alpha.
-    - When looking for versions of python that we could run the tests
-      with, check for "python2.7" and "python3.3"; previously we were
-      only looking for "python", "python2", and "python3". Patch from
-      Dana Koch. Fixes bug 11632; bugfix on 0.2.5.2-alpha.
-    - Fix all valgrind warnings produced by the unit tests. There were
-      over a thousand memory leak warnings previously, mostly produced
-      by forgetting to free things in the unit test code. Fixes bug
-      11618, bugfixes on many versions of Tor.
-
-  o Minor bugfixes (tor-fw-helper):
-    - Give a correct log message when tor-fw-helper fails to launch.
-      (Previously, we would say something like "tor-fw-helper sent us a
-      string we could not parse".) Fixes bug 9781; bugfix
-      on 0.2.4.2-alpha.
-
-  o Minor bugfixes (relay, threading):
-    - Check return code on spawn_func() in cpuworker code, so that we
-      don't think we've spawned a nonworking cpuworker and write junk to
-      it forever. Fix related to bug 4345; bugfix on all released Tor
-      versions. Found by "skruffy".
-    - Use a pthread_attr to make sure that spawn_func() cannot return an
-      error while at the same time launching a thread. Fix related to
-      bug 4345; bugfix on all released Tor versions. Reported
-      by "cypherpunks".
-
-  o Minor bugfixes (relay, oom prevention):
-    - Correctly detect the total available system memory. We tried to do
-      this in 0.2.5.4-alpha, but the code was set up to always return an
-      error value, even on success. Fixes bug 11805; bugfix
-      on 0.2.5.4-alpha.
-
-  o Minor bugfixes (relay, other):
-    - We now drop CREATE cells for already-existent circuit IDs and for
-      zero-valued circuit IDs, regardless of other factors that might
-      otherwise have called for DESTROY cells. Fixes bug 12191; bugfix
-      on 0.0.8pre1.
-    - Avoid an illegal read from stack when initializing the TLS module
-      using a version of OpenSSL without all of the ciphers used by the
-      v2 link handshake. Fixes bug 12227; bugfix on 0.2.4.8-alpha. Found
-      by "starlight".
-    - When rejecting DATA cells for stream_id zero, still count them
-      against the circuit's deliver window so that we don't fail to send
-      a SENDME. Fixes bug 11246; bugfix on 0.2.4.10-alpha.
-
-  o Minor bugfixes (logging):
-    - Fix a misformatted log message about delayed directory fetches.
-      Fixes bug 11654; bugfix on 0.2.5.3-alpha.
-    - Squelch a spurious LD_BUG message "No origin circuit for
-      successful SOCKS stream" in certain hidden service failure cases;
-      fixes bug 10616.
-
-  o Distribution:
-    - Include a tor.service file in contrib/dist for use with systemd.
-      Some distributions will be able to use this file unmodified;
-      others will need to tweak it, or write their own. Patch from Jamie
-      Nguyen; resolves ticket 8368.
-
-  o Documentation:
-    - Clean up several option names in the manpage to match their real
-      names, add the missing documentation for a couple of testing and
-      directory authority options, remove the documentation for a
-      V2-directory fetching option that no longer exists. Resolves
-      ticket 11634.
-    - Correct the documenation so that it lists the correct directory
-      for the stats files. (They are in a subdirectory called "stats",
-      not "status".)
-    - In the manpage, move more authority-only options into the
-      directory authority section so that operators of regular directory
-      caches don't get confused.
-
-  o Package cleanup:
-    - The contrib directory has been sorted and tidied. Before, it was
-      an unsorted dumping ground for useful and not-so-useful things.
-      Now, it is divided based on functionality, and the items which
-      seemed to be nonfunctional or useless have been removed. Resolves
-      ticket 8966; based on patches from "rl1987".
-
-  o Removed code:
-    - Remove /tor/dbg-stability.txt URL that was meant to help debug WFU
-      and MTBF calculations, but that nobody was using. Fixes ticket 11742.
-    - The TunnelDirConns and PreferTunnelledDirConns options no longer
-      exist; tunneled directory connections have been available since
-      0.1.2.5-alpha, and turning them off is not a good idea. This is a
-      brute-force fix for 10849, where "TunnelDirConns 0" would break
-      hidden services.
-
-
-Changes in version 0.2.4.22 - 2014-05-16
-  Tor 0.2.4.22 backports numerous high-priority fixes from the Tor 0.2.5
-  alpha release series. These include blocking all authority signing
-  keys that may have been affected by the OpenSSL "heartbleed" bug,
-  choosing a far more secure set of TLS ciphersuites by default, closing
-  a couple of memory leaks that could be used to run a target relay out
-  of RAM, and several others.
-
-  o Major features (security, backport from 0.2.5.4-alpha):
-    - Block authority signing keys that were used on authorities
-      vulnerable to the "heartbleed" bug in OpenSSL (CVE-2014-0160). (We
-      don't have any evidence that these keys _were_ compromised; we're
-      doing this to be prudent.) Resolves ticket 11464.
-
-  o Major bugfixes (security, OOM):
-    - Fix a memory leak that could occur if a microdescriptor parse
-      fails during the tokenizing step. This bug could enable a memory
-      exhaustion attack by directory servers. Fixes bug 11649; bugfix
-      on 0.2.2.6-alpha.
-
-  o Major bugfixes (TLS cipher selection, backport from 0.2.5.4-alpha):
-    - The relay ciphersuite list is now generated automatically based on
-      uniform criteria, and includes all OpenSSL ciphersuites with
-      acceptable strength and forward secrecy. Previously, we had left
-      some perfectly fine ciphersuites unsupported due to omission or
-      typo. Resolves bugs 11513, 11492, 11498, 11499. Bugs reported by
-      'cypherpunks'. Bugfix on 0.2.4.8-alpha.
-    - Relays now trust themselves to have a better view than clients of
-      which TLS ciphersuites are better than others. (Thanks to bug
-      11513, the relay list is now well-considered, whereas the client
-      list has been chosen mainly for anti-fingerprinting purposes.)
-      Relays prefer: AES over 3DES; then ECDHE over DHE; then GCM over
-      CBC; then SHA384 over SHA256 over SHA1; and last, AES256 over
-      AES128. Resolves ticket 11528.
-    - Clients now try to advertise the same list of ciphersuites as
-      Firefox 28. This change enables selection of (fast) GCM
-      ciphersuites, disables some strange old ciphers, and stops
-      advertising the ECDH (not to be confused with ECDHE) ciphersuites.
-      Resolves ticket 11438.
-
-  o Minor bugfixes (configuration, security):
-    - When running a hidden service, do not allow TunneledDirConns 0:
-      trying to set that option together with a hidden service would
-      otherwise prevent the hidden service from running, and also make
-      it publish its descriptors directly over HTTP. Fixes bug 10849;
-      bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (controller, backport from 0.2.5.4-alpha):
-    - Avoid sending a garbage value to the controller when a circuit is
-      cannibalized. Fixes bug 11519; bugfix on 0.2.3.11-alpha.
-
-  o Minor bugfixes (exit relay, backport from 0.2.5.4-alpha):
-    - Stop leaking memory when we successfully resolve a PTR record.
-      Fixes bug 11437; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (bridge client, backport from 0.2.5.4-alpha):
-    - Avoid 60-second delays in the bootstrapping process when Tor is
-      launching for a second time while using bridges. Fixes bug 9229;
-      bugfix on 0.2.0.3-alpha.
-
-  o Minor bugfixes (relays and bridges, backport from 0.2.5.4-alpha):
-    - Give the correct URL in the warning message when trying to run a
-      relay on an ancient version of Windows. Fixes bug 9393.
-
-  o Minor bugfixes (compilation):
-    - Fix a compilation error when compiling with --disable-curve25519.
-      Fixes bug 9700; bugfix on 0.2.4.17-rc.
-
-  o Minor bugfixes:
-    - Downgrade the warning severity for the the "md was still
-      referenced 1 node(s)" warning. Tor 0.2.5.4-alpha has better code
-      for trying to diagnose this bug, and the current warning in
-      earlier versions of tor achieves nothing useful. Addresses warning
-      from bug 7164.
-
-  o Minor features (log verbosity, backport from 0.2.5.4-alpha):
-    - When we run out of usable circuit IDs on a channel, log only one
-      warning for the whole channel, and describe how many circuits
-      there were on the channel. Fixes part of ticket 11553.
-
-  o Minor features (security, backport from 0.2.5.4-alpha):
-    - Decrease the lower limit of MaxMemInCellQueues to 256 MBytes (but
-      leave the default at 8GBytes), to better support Raspberry Pi
-      users. Fixes bug 9686; bugfix on 0.2.4.14-alpha.
-
-  o Documentation (backport from 0.2.5.4-alpha):
-    - Correctly document that we search for a system torrc file before
-      looking in ~/.torrc. Fixes documentation side of 9213; bugfix on
-      0.2.3.18-rc.
-
-
-Changes in version 0.2.5.4-alpha - 2014-04-25
-  Tor 0.2.5.4-alpha includes several security and performance
-  improvements for clients and relays, including blacklisting authority
-  signing keys that were used while susceptible to the OpenSSL
-  "heartbleed" bug, fixing two expensive functions on busy relays,
-  improved TLS ciphersuite preference lists, support for run-time
-  hardening on compilers that support AddressSanitizer, and more work on
-  the Linux sandbox code.
-
-  There are also several usability fixes for clients (especially clients
-  that use bridges), two new TransPort protocols supported (one on
-  OpenBSD, one on FreeBSD), and various other bugfixes.
-
-  This release marks end-of-life for Tor 0.2.2.x; those Tor versions
-  have accumulated many known flaws; everyone should upgrade.
-
-  o Major features (security):
-    - If you don't specify MaxMemInQueues yourself, Tor now tries to
-      pick a good value based on your total system memory. Previously,
-      the default was always 8 GB. You can still override the default by
-      setting MaxMemInQueues yourself. Resolves ticket 11396.
-    - Block authority signing keys that were used on authorities
-      vulnerable to the "heartbleed" bug in OpenSSL (CVE-2014-0160). (We
-      don't have any evidence that these keys _were_ compromised; we're
-      doing this to be prudent.) Resolves ticket 11464.
-
-  o Major features (relay performance):
-    - Speed up server-side lookups of rendezvous and introduction point
-      circuits by using hashtables instead of linear searches. These
-      functions previously accounted between 3 and 7% of CPU usage on
-      some busy relays. Resolves ticket 9841.
-    - Avoid wasting CPU when extending a circuit over a channel that is
-      nearly out of circuit IDs. Previously, we would do a linear scan
-      over possible circuit IDs before finding one or deciding that we
-      had exhausted our possibilities. Now, we try at most 64 random
-      circuit IDs before deciding that we probably won't succeed. Fixes
-      a possible root cause of ticket 11553.
-
-  o Major features (seccomp2 sandbox, Linux only):
-    - The seccomp2 sandbox can now run a test network for multiple hours
-      without crashing. The sandbox is still experimental, and more bugs
-      will probably turn up. To try it, enable "Sandbox 1" on a Linux
-      host. Resolves ticket 11351.
-    - Strengthen sandbox code: the sandbox can now test the arguments
-      for rename(), and blocks _sysctl() entirely. Resolves another part
-      of ticket 11351.
-    - When the sandbox blocks a system call, it now tries to log a stack
-      trace before exiting. Resolves ticket 11465.
-
-  o Major bugfixes (TLS cipher selection):
-    - The relay ciphersuite list is now generated automatically based on
-      uniform criteria, and includes all OpenSSL ciphersuites with
-      acceptable strength and forward secrecy. Previously, we had left
-      some perfectly fine ciphersuites unsupported due to omission or
-      typo. Resolves bugs 11513, 11492, 11498, 11499. Bugs reported by
-      'cypherpunks'. Bugfix on 0.2.4.8-alpha.
-    - Relays now trust themselves to have a better view than clients of
-      which TLS ciphersuites are better than others. (Thanks to bug
-      11513, the relay list is now well-considered, whereas the client
-      list has been chosen mainly for anti-fingerprinting purposes.)
-      Relays prefer: AES over 3DES; then ECDHE over DHE; then GCM over
-      CBC; then SHA384 over SHA256 over SHA1; and last, AES256 over
-      AES128. Resolves ticket 11528.
-    - Clients now try to advertise the same list of ciphersuites as
-      Firefox 28. This change enables selection of (fast) GCM
-      ciphersuites, disables some strange old ciphers, and stops
-      advertising the ECDH (not to be confused with ECDHE) ciphersuites.
-      Resolves ticket 11438.
-
-  o Major bugfixes (bridge client):
-    - Avoid 60-second delays in the bootstrapping process when Tor is
-      launching for a second time while using bridges. Fixes bug 9229;
-      bugfix on 0.2.0.3-alpha.
-
-  o Minor features (transparent proxy, *BSD):
-    - Support FreeBSD's ipfw firewall interface for TransPort ports on
-      FreeBSD. To enable it, set "TransProxyType ipfw". Resolves ticket
-      10267; patch from "yurivict".
-    - Support OpenBSD's divert-to rules with the pf firewall for
-      transparent proxy ports. To enable it, set "TransProxyType
-      pf-divert". This allows Tor to run a TransPort transparent proxy
-      port on OpenBSD 4.4 or later without root privileges. See the
-      pf.conf(5) manual page for information on configuring pf to use
-      divert-to rules. Closes ticket 10896; patch from Dana Koch.
-
-  o Minor features (security):
-    - New --enable-expensive-hardening option to enable security
-      hardening options that consume nontrivial amounts of CPU and
-      memory. Right now, this includes AddressSanitizer and UbSan, which
-      are supported in newer versions of GCC and Clang. Closes ticket
-      11477.
-
-  o Minor features (log verbosity):
-    - Demote the message that we give when a flushing connection times
-      out for too long from NOTICE to INFO. It was usually meaningless.
-      Resolves ticket 5286.
-    - Don't log so many notice-level bootstrapping messages at startup
-      about downloading descriptors. Previously, we'd log a notice
-      whenever we learned about more routers. Now, we only log a notice
-      at every 5% of progress. Fixes bug 9963.
-    - Warn less verbosely when receiving a malformed
-      ESTABLISH_RENDEZVOUS cell. Fixes ticket 11279.
-    - When we run out of usable circuit IDs on a channel, log only one
-      warning for the whole channel, and describe how many circuits
-      there were on the channel. Fixes part of ticket 11553.
-
-  o Minor features (relay):
-    - If a circuit timed out for at least 3 minutes, check if we have a
-      new external IP address, and publish a new descriptor with the new
-      IP address if it changed. Resolves ticket 2454.
-
-  o Minor features (controller):
-    - Make the entire exit policy available from the control port via
-      GETINFO exit-policy/*. Implements enhancement 7952. Patch from
-      "rl1987".
-    - Because of the fix for ticket 11396, the real limit for memory
-      usage may no longer match the configured MaxMemInQueues value. The
-      real limit is now exposed via GETINFO limits/max-mem-in-queues.
-
-  o Minor features (bridge client):
-    - Report a more useful failure message when we can't connect to a
-      bridge because we don't have the right pluggable transport
-      configured. Resolves ticket 9665. Patch from Fábio J. Bertinatto.
-
-  o Minor features (diagnostic):
-    - Add more log messages to diagnose bug 7164, which causes
-      intermittent "microdesc_free() called but md was still referenced"
-      warnings. We now include more information, to figure out why we
-      might be cleaning a microdescriptor for being too old if it's
-      still referenced by a live node_t object.
-
-  o Minor bugfixes (client, DNSPort):
-    - When using DNSPort, try to respond to AAAA requests with AAAA
-      answers. Previously, we hadn't looked at the request type when
-      deciding which answer type to prefer. Fixes bug 10468; bugfix on
-      0.2.4.7-alpha.
-    - When receiving a DNS query for an unsupported record type, reply
-      with no answer rather than with a NOTIMPL error. This behavior
-      isn't correct either, but it will break fewer client programs, we
-      hope. Fixes bug 10268; bugfix on 0.2.0.1-alpha. Original patch
-      from "epoch".
-
-  o Minor bugfixes (exit relay):
-    - Stop leaking memory when we successfully resolve a PTR record.
-      Fixes bug 11437; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (bridge client):
-    - Stop accepting bridge lines containing hostnames. Doing so would
-      cause clients to perform DNS requests on the hostnames, which was
-      not sensible behavior. Fixes bug 10801; bugfix on 0.2.0.1-alpha.
-    - Avoid a 60-second delay in the bootstrapping process when a Tor
-      client with pluggable transports re-reads its configuration at
-      just the wrong time. Re-fixes bug 11156; bugfix on 0.2.5.3-alpha.
-
-  o Minor bugfixes (client, logging during bootstrap):
-    - Warn only once if we start logging in an unsafe way. Previously,
-      we complain as many times as we had problems. Fixes bug 9870;
-      bugfix on 0.2.5.1-alpha.
-    - Only report the first fatal bootstrap error on a given OR
-      connection. This stops us from telling the controller bogus error
-      messages like "DONE". Fixes bug 10431; bugfix on 0.2.1.1-alpha.
-    - Be more helpful when trying to run sandboxed on Linux without
-      libseccomp. Instead of saying "Sandbox is not implemented on this
-      platform", we now explain that we need to be built with
-      libseccomp. Fixes bug 11543; bugfix on 0.2.5.1-alpha.
-    - Avoid generating spurious warnings when starting with
-      DisableNetwork enabled. Fixes bug 11200 and bug 10405; bugfix on
-      0.2.3.9-alpha.
-
-  o Minor bugfixes (closing OR connections):
-    - If write_to_buf() in connection_write_to_buf_impl_() ever fails,
-      check if it's an or_connection_t and correctly call
-      connection_or_close_for_error() rather than
-      connection_mark_for_close() directly. Fixes bug 11304; bugfix on
-      0.2.4.4-alpha.
-    - When closing all connections on setting DisableNetwork to 1, use
-      connection_or_close_normally() rather than closing OR connections
-      out from under the channel layer. Fixes bug 11306; bugfix on
-      0.2.4.4-alpha.
-
-  o Minor bugfixes (controller):
-    - Avoid sending a garbage value to the controller when a circuit is
-      cannibalized. Fixes bug 11519; bugfix on 0.2.3.11-alpha.
-
-  o Minor bugfixes (tor-fw-helper):
-    - Allow tor-fw-helper to build again by adding src/ext to its
-      CPPFLAGS. Fixes bug 11296; bugfix on 0.2.5.3-alpha.
-
-  o Minor bugfixes (bridges):
-    - Avoid potential crashes or bad behavior when launching a
-      server-side managed proxy with ORPort or ExtORPort temporarily
-      disabled. Fixes bug 9650; bugfix on 0.2.3.16-alpha.
-
-  o Minor bugfixes (platform-specific):
-    - Fix compilation on Solaris, which does not have . Fixes
-      bug 11426; bugfix on 0.2.5.3-alpha.
-    - When dumping a malformed directory object to disk, save it in
-      binary mode on Windows, not text mode. Fixes bug 11342; bugfix on
-      0.2.2.1-alpha.
-    - Don't report failures from make_socket_reuseable() on incoming
-      sockets on OSX: this can happen when incoming connections close
-      early. Fixes bug 10081.
-
-  o Minor bugfixes (trivial memory leaks):
-    - Fix a small memory leak when signing a directory object. Fixes bug
-      11275; bugfix on 0.2.4.13-alpha.
-    - Free placeholder entries in our circuit table at exit; fixes a
-      harmless memory leak. Fixes bug 11278; bugfix on 0.2.5.1-alpha.
-    - Don't re-initialize a second set of OpenSSL mutexes when starting
-      up. Previously, we'd make one set of mutexes, and then immediately
-      replace them with another. Fixes bug 11726; bugfix on
-      0.2.5.3-alpha.
-    - Resolve some memory leaks found by coverity in the unit tests, on
-      exit in tor-gencert, and on a failure to compute digests for our
-      own keys when generating a v3 networkstatus vote. These leaks
-      should never have affected anyone in practice.
-
-  o Minor bugfixes (hidden service):
-    - Only retry attempts to connect to a chosen rendezvous point 8
-      times, not 30. Fixes bug 4241; bugfix on 0.1.0.1-rc.
-
-  o Minor bugfixes (misc code correctness):
-    - Fix various instances of undefined behavior in channeltls.c,
-      tor_memmem(), and eventdns.c that would cause us to construct
-      pointers to memory outside an allocated object. (These invalid
-      pointers were not accessed, but C does not even allow them to
-      exist.) Fixes bug 10363; bugfixes on 0.1.1.1-alpha, 0.1.2.1-alpha,
-      0.2.0.10-alpha, and 0.2.3.6-alpha. Reported by "bobnomnom".
-    - Use the AddressSanitizer and Ubsan sanitizers (in clang-3.4) to
-      fix some miscellaneous errors in our tests and codebase. Fixes bug
-      11232. Bugfixes on versions back as far as 0.2.1.11-alpha.
-    - Always check return values for unlink, munmap, UnmapViewOfFile;
-      check strftime return values more often. In some cases all we can
-      do is report a warning, but this may help prevent deeper bugs from
-      going unnoticed. Closes ticket 8787; bugfixes on many, many tor
-      versions.
-    - Fix numerous warnings from the clang "scan-build" static analyzer.
-      Some of these are programming style issues; some of them are false
-      positives that indicated awkward code; some are undefined behavior
-      cases related to constructing (but not using) invalid pointers;
-      some are assumptions about API behavior; some are (harmlessly)
-      logging sizeof(ptr) bytes from a token when sizeof(*ptr) would be
-      correct; and one or two are genuine bugs that weren't reachable
-      from the rest of the program. Fixes bug 8793; bugfixes on many,
-      many tor versions.
-
-  o Documentation:
-    - Build the torify.1 manpage again. Previously, we were only trying
-      to build it when also building tor-fw-helper. That's why we didn't
-      notice that we'd broken the ability to build it. Fixes bug 11321;
-      bugfix on 0.2.5.1-alpha.
-    - Fix the layout of the SOCKSPort flags in the manpage. Fixes bug
-      11061; bugfix on 0.2.4.7-alpha.
-    - Correctly document that we search for a system torrc file before
-      looking in ~/.torrc. Fixes documentation side of 9213; bugfix on
-      0.2.3.18-rc.
-    - Resolve warnings from Doxygen.
-
-  o Code simplifications and refactoring:
-    - Remove is_internal_IP() function. Resolves ticket 4645.
-    - Remove unused function circuit_dump_by_chan from circuitlist.c.
-      Closes issue 9107; patch from "marek".
-    - Change our use of the ENUM_BF macro to avoid declarations that
-      confuse Doxygen.
-
-  o Deprecated versions:
-    - Tor 0.2.2.x has reached end-of-life; it has received no patches or
-      attention for some while. Directory authorities no longer accept
-      descriptors from relays running any version of Tor prior to Tor
-      0.2.3.16-alpha. Resolves ticket 11149.
-
-  o Testing:
-    - New macros in test.h to simplify writing mock-functions for unit
-      tests. Part of ticket 11507. Patch from Dana Koch.
-    - Complete tests for the status.c module. Resolves ticket 11507.
-      Patch from Dana Koch.
-
-  o Removed code:
-    - Remove all code for the long unused v1 directory protocol.
-      Resolves ticket 11070.
-
-
-Changes in version 0.2.5.3-alpha - 2014-03-22
-  Tor 0.2.5.3-alpha includes all the fixes from 0.2.4.21. It contains
-  two new anti-DoS features for Tor relays, resolves a bug that kept
-  SOCKS5 support for IPv6 from working, fixes several annoying usability
-  issues for bridge users, and removes more old code for unused
-  directory formats.
-
-  The Tor 0.2.5.x release series is now in patch-freeze: no feature
-  patches not already written will be considered for inclusion in 0.2.5.x.
-
-  o Major features (relay security, DoS-resistance):
-    - When deciding whether we have run out of memory and we need to
-      close circuits, also consider memory allocated in buffers for
-      streams attached to each circuit.
-
-      This change, which extends an anti-DoS feature introduced in
-      0.2.4.13-alpha and improved in 0.2.4.14-alpha, lets Tor exit relays
-      better resist more memory-based DoS attacks than before. Since the
-      MaxMemInCellQueues option now applies to all queues, it is renamed
-      to MaxMemInQueues. This feature fixes bug 10169.
-    - Avoid hash-flooding denial-of-service attacks by using the secure
-      SipHash-2-4 hash function for our hashtables. Without this
-      feature, an attacker could degrade performance of a targeted
-      client or server by flooding their data structures with a large
-      number of entries to be stored at the same hash table position,
-      thereby slowing down the Tor instance. With this feature, hash
-      table positions are derived from a randomized cryptographic key,
-      and an attacker cannot predict which entries will collide. Closes
-      ticket 4900.
-    - Decrease the lower limit of MaxMemInQueues to 256 MBytes (but leave
-      the default at 8GBytes), to better support Raspberry Pi users. Fixes
-      bug 9686; bugfix on 0.2.4.14-alpha.
-
-  o Minor features (bridges, pluggable transports):
-    - Bridges now write the SHA1 digest of their identity key
-      fingerprint (that is, a hash of a hash of their public key) to
-      notice-level logs, and to a new hashed-fingerprint file. This
-      information will help bridge operators look up their bridge in
-      Globe and similar tools. Resolves ticket 10884.
-    - Improve the message that Tor displays when running as a bridge
-      using pluggable transports without an Extended ORPort listener.
-      Also, log the message in the log file too. Resolves ticket 11043.
-
-  o Minor features (other):
-    - Add a new option, PredictedPortsRelevanceTime, to control how long
-      after having received a request to connect to a given port Tor
-      will try to keep circuits ready in anticipation of future requests
-      for that port. Patch from "unixninja92"; implements ticket 9176.
-    - Generate a warning if any ports are listed in the SocksPolicy,
-      DirPolicy, AuthDirReject, AuthDirInvalid, AuthDirBadDir, or
-      AuthDirBadExit options. (These options only support address
-      ranges.) Fixes part of ticket 11108.
-    - Update geoip and geoip6 to the February 7 2014 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (new since 0.2.5.2-alpha, also in 0.2.4.21):
-    - Build without warnings under clang 3.4. (We have some macros that
-      define static functions only some of which will get used later in
-      the module. Starting with clang 3.4, these give a warning unless the
-      unused attribute is set on them.) Resolves ticket 10904.
-    - Fix build warnings about missing "a2x" comment when building the
-      manpages from scratch on OpenBSD; OpenBSD calls it "a2x.py".
-      Fixes bug 10929; bugfix on 0.2.2.9-alpha. Patch from Dana Koch.
-
-  o Minor bugfixes (client):
-    - Improve the log message when we can't connect to a hidden service
-      because all of the hidden service directory nodes hosting its
-      descriptor are excluded. Improves on our fix for bug 10722, which
-      was a bugfix on 0.2.0.10-alpha.
-    - Raise a control port warning when we fail to connect to all of
-      our bridges. Previously, we didn't inform the controller, and
-      the bootstrap process would stall. Fixes bug 11069; bugfix on
-      0.2.1.2-alpha.
-    - Exit immediately when a process-owning controller exits.
-      Previously, tor relays would wait for a little while after their
-      controller exited, as if they had gotten an INT signal -- but this
-      was problematic, since there was no feedback for the user. To do a
-      clean shutdown, controllers should send an INT signal and give Tor
-      a chance to clean up. Fixes bug 10449; bugfix on 0.2.2.28-beta.
-    - Stop attempting to connect to bridges before our pluggable
-      transports are configured (harmless but resulted in some erroneous
-      log messages). Fixes bug 11156; bugfix on 0.2.3.2-alpha.
-    - Fix connections to IPv6 addresses over SOCKS5. Previously, we were
-      generating incorrect SOCKS5 responses, and confusing client
-      applications. Fixes bug 10987; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (relays and bridges):
-    - Avoid crashing on a malformed resolv.conf file when running a
-      relay using Libevent 1. Fixes bug 8788; bugfix on 0.1.1.23.
-    - Non-exit relays no longer launch mock DNS requests to check for
-      DNS hijacking. This has been unnecessary since 0.2.1.7-alpha, when
-      non-exit relays stopped servicing DNS requests. Fixes bug 965;
-      bugfix on 0.2.1.7-alpha. Patch from Matt Pagan.
-    - Bridges now report complete directory request statistics. Related
-      to bug 5824; bugfix on 0.2.2.1-alpha.
-    - Bridges now never collect statistics that were designed for
-      relays. Fixes bug 5824; bugfix on 0.2.3.8-alpha.
-    - Stop giving annoying warning messages when we decide not to launch
-      a pluggable transport proxy that we don't need (because there are
-      no bridges configured to use it). Resolves ticket 5018; bugfix
-      on 0.2.5.2-alpha.
-    - Give the correct URL in the warning message when trying to run a
-      relay on an ancient version of Windows. Fixes bug 9393.
-
-  o Minor bugfixes (backtrace support):
-    - Support automatic backtraces on more platforms by using the
-      "-fasynchronous-unwind-tables" compiler option. This option is
-      needed for platforms like 32-bit Intel where "-fomit-frame-pointer"
-      is on by default and table generation is not. This doesn't yet
-      add Windows support; only Linux, OSX, and some BSDs are affected.
-      Reported by 'cypherpunks'; fixes bug 11047; bugfix on 0.2.5.2-alpha.
-    - Avoid strange behavior if two threads hit failed assertions at the
-      same time and both try to log backtraces at once. (Previously, if
-      this had happened, both threads would have stored their intermediate
-      results in the same buffer, and generated junk outputs.) Reported by
-      "cypherpunks". Fixes bug 11048; bugfix on 0.2.5.2-alpha.
-    - Fix a compiler warning in format_number_sigsafe(). Bugfix on
-      0.2.5.2-alpha; patch from Nick Hopper.
-
-  o Minor bugfixes (unit tests):
-    - Fix a small bug in the unit tests that might have made the tests
-      call 'chmod' with an uninitialized bitmask. Fixes bug 10928;
-      bugfix on 0.2.5.1-alpha. Patch from Dana Koch.
-
-  o Removed code:
-    - Remove all remaining code related to version-0 hidden service
-      descriptors: they have not been in use since 0.2.2.1-alpha. Fixes
-      the rest of bug 10841.
-
-  o Documentation:
-    - Document in the manpage that "KBytes" may also be written as
-      "kilobytes" or "KB", that "Kbits" may also be written as
-      "kilobits", and so forth. Closes ticket 9222.
-    - Document that the ClientOnly config option overrides ORPort.
-      Our old explanation made ClientOnly sound as though it did
-      nothing at all. Resolves bug 9059.
-    - Explain that SocksPolicy, DirPolicy, and similar options don't
-      take port arguments. Fixes the other part of ticket 11108.
-    - Fix a comment about the rend_server_descriptor_t.protocols field
-      to more accurately describe its range. Also, make that field
-      unsigned, to more accurately reflect its usage. Fixes bug 9099;
-      bugfix on 0.2.1.5-alpha.
-    - Fix the manpage's description of HiddenServiceAuthorizeClient:
-      the maximum client name length is 16, not 19. Fixes bug 11118;
-      bugfix on 0.2.1.6-alpha.
-
-  o Code simplifications and refactoring:
-    - Get rid of router->address, since in all cases it was just the
-      string representation of router->addr. Resolves ticket 5528.
-
-  o Test infrastructure:
-    - Update to the latest version of tinytest.
-    - Improve the tinytest implementation of string operation tests so
-      that comparisons with NULL strings no longer crash the tests; they
-      now just fail, normally. Fixes bug 9004; bugfix on 0.2.2.4-alpha.
-
-
-Changes in version 0.2.4.21 - 2014-02-28
-  Tor 0.2.4.21 further improves security against potential adversaries who
-  find breaking 1024-bit crypto doable, and backports several stability
-  and robustness patches from the 0.2.5 branch.
-
-  o Major features (client security):
-    - When we choose a path for a 3-hop circuit, make sure it contains
-      at least one relay that supports the NTor circuit extension
-      handshake. Otherwise, there is a chance that we're building
-      a circuit that's worth attacking by an adversary who finds
-      breaking 1024-bit crypto doable, and that chance changes the game
-      theory. Implements ticket 9777.
-
-  o Major bugfixes:
-    - Do not treat streams that fail with reason
-      END_STREAM_REASON_INTERNAL as indicating a definite circuit failure,
-      since it could also indicate an ENETUNREACH connection error. Fixes
-      part of bug 10777; bugfix on 0.2.4.8-alpha.
-
-  o Code simplification and refactoring:
-    - Remove data structures which were introduced to implement the
-      CellStatistics option: they are now redundant with the new timestamp
-      field in the regular packed_cell_t data structure, which we did
-      in 0.2.4.18-rc in order to resolve bug 9093. Resolves ticket 10870.
-
-  o Minor features:
-    - Always clear OpenSSL bignums before freeing them -- even bignums
-      that don't contain secrets. Resolves ticket 10793. Patch by
-      Florent Daigniere.
-    - Build without warnings under clang 3.4. (We have some macros that
-      define static functions only some of which will get used later in
-      the module. Starting with clang 3.4, these give a warning unless the
-      unused attribute is set on them.) Resolves ticket 10904.
-    - Update geoip and geoip6 files to the February 7 2014 Maxmind
-      GeoLite2 Country database.
-
-  o Minor bugfixes:
-    - Set the listen() backlog limit to the largest actually supported
-      on the system, not to the value in a header file. Fixes bug 9716;
-      bugfix on every released Tor.
-    - Treat ENETUNREACH, EACCES, and EPERM connection failures at an
-      exit node as a NOROUTE error, not an INTERNAL error, since they
-      can apparently happen when trying to connect to the wrong sort
-      of netblocks. Fixes part of bug 10777; bugfix on 0.1.0.1-rc.
-    - Fix build warnings about missing "a2x" comment when building the
-      manpages from scratch on OpenBSD; OpenBSD calls it "a2x.py".
-      Fixes bug 10929; bugfix on 0.2.2.9-alpha. Patch from Dana Koch.
-    - Avoid a segfault on SIGUSR1, where we had freed a connection but did
-      not entirely remove it from the connection lists. Fixes bug 9602;
-      bugfix on 0.2.4.4-alpha.
-    - Fix a segmentation fault in our benchmark code when running with
-      Fedora's OpenSSL package, or any other OpenSSL that provides
-      ECDH but not P224. Fixes bug 10835; bugfix on 0.2.4.8-alpha.
-    - Turn "circuit handshake stats since last time" log messages into a
-      heartbeat message. Fixes bug 10485; bugfix on 0.2.4.17-rc.
-
-  o Documentation fixes:
-    - Document that all but one DirPort entry must have the NoAdvertise
-      flag set. Fixes bug 10470; bugfix on 0.2.3.3-alpha / 0.2.3.16-alpha.
-
-
-Changes in version 0.2.5.2-alpha - 2014-02-13
-  Tor 0.2.5.2-alpha includes all the fixes from 0.2.4.18-rc and 0.2.4.20,
-  like the "poor random number generation" fix and the "building too many
-  circuits" fix. It also further improves security against potential
-  adversaries who find breaking 1024-bit crypto doable, and launches
-  pluggable transports on demand (which gets us closer to integrating
-  pluggable transport support by default -- not to be confused with Tor
-  bundles enabling pluggable transports and bridges by default).
-
-  o Major features (client security):
-    - When we choose a path for a 3-hop circuit, make sure it contains
-      at least one relay that supports the NTor circuit extension
-      handshake. Otherwise, there is a chance that we're building
-      a circuit that's worth attacking by an adversary who finds
-      breaking 1024-bit crypto doable, and that chance changes the game
-      theory. Implements ticket 9777.
-    - Clients now look at the "usecreatefast" consensus parameter to
-      decide whether to use CREATE_FAST or CREATE cells for the first hop
-      of their circuit. This approach can improve security on connections
-      where Tor's circuit handshake is stronger than the available TLS
-      connection security levels, but the tradeoff is more computational
-      load on guard relays. Implements proposal 221. Resolves ticket 9386.
-
-  o Major features (bridges):
-    - Don't launch pluggable transport proxies if we don't have any
-      bridges configured that would use them. Now we can list many
-      pluggable transports, and Tor will dynamically start one when it
-      hears a bridge address that needs it. Resolves ticket 5018.
-    - The bridge directory authority now assigns status flags (Stable,
-      Guard, etc) to bridges based on thresholds calculated over all
-      Running bridges. Now bridgedb can finally make use of its features
-      to e.g. include at least one Stable bridge in its answers. Fixes
-      bug 9859.
-
-  o Major features (other):
-    - Extend ORCONN controller event to include an "ID" parameter,
-      and add four new controller event types CONN_BW, CIRC_BW,
-      CELL_STATS, and TB_EMPTY that show connection and circuit usage.
-      The new events are emitted in private Tor networks only, with the
-      goal of being able to better track performance and load during
-      full-network simulations. Implements proposal 218 and ticket 7359.
-    - On some platforms (currently: recent OSX versions, glibc-based
-      platforms that support the ELF format, and a few other
-      Unix-like operating systems), Tor can now dump stack traces
-      when a crash occurs or an assertion fails. By default, traces
-      are dumped to stderr (if possible) and to any logs that are
-      reporting errors. Implements ticket 9299.
-
-  o Major bugfixes:
-    - Avoid a segfault on SIGUSR1, where we had freed a connection but did
-      not entirely remove it from the connection lists. Fixes bug 9602;
-      bugfix on 0.2.4.4-alpha.
-    - Do not treat streams that fail with reason
-      END_STREAM_REASON_INTERNAL as indicating a definite circuit failure,
-      since it could also indicate an ENETUNREACH connection error. Fixes
-      part of bug 10777; bugfix on 0.2.4.8-alpha.
-
-  o Major bugfixes (new since 0.2.5.1-alpha, also in 0.2.4.20):
-    - Do not allow OpenSSL engines to replace the PRNG, even when
-      HardwareAccel is set. The only default builtin PRNG engine uses
-      the Intel RDRAND instruction to replace the entire PRNG, and
-      ignores all attempts to seed it with more entropy. That's
-      cryptographically stupid: the right response to a new alleged
-      entropy source is never to discard all previously used entropy
-      sources. Fixes bug 10402; works around behavior introduced in
-      OpenSSL 1.0.0. Diagnosis and investigation thanks to "coderman"
-      and "rl1987".
-    - Fix assertion failure when AutomapHostsOnResolve yields an IPv6
-      address. Fixes bug 10465; bugfix on 0.2.4.7-alpha.
-    - Avoid launching spurious extra circuits when a stream is pending.
-      This fixes a bug where any circuit that _wasn't_ unusable for new
-      streams would be treated as if it were, causing extra circuits to
-      be launched. Fixes bug 10456; bugfix on 0.2.4.12-alpha.
-
-  o Major bugfixes (new since 0.2.5.1-alpha, also in 0.2.4.18-rc):
-    - No longer stop reading or writing on cpuworker connections when
-      our rate limiting buckets go empty. Now we should handle circuit
-      handshake requests more promptly. Resolves bug 9731.
-    - Stop trying to bootstrap all our directory information from
-      only our first guard. Discovered while fixing bug 9946; bugfix
-      on 0.2.4.8-alpha.
-
-  o Minor features (bridges, pluggable transports):
-    - Add threshold cutoffs to the networkstatus document created by
-      the Bridge Authority. Fixes bug 1117.
-    - On Windows, spawn background processes using the CREATE_NO_WINDOW
-      flag. Now Tor Browser Bundle 3.5 with pluggable transports enabled
-      doesn't pop up a blank console window. (In Tor Browser Bundle 2.x,
-      Vidalia set this option for us.) Implements ticket 10297.
-
-  o Minor features (security):
-    - Always clear OpenSSL bignums before freeing them -- even bignums
-      that don't contain secrets. Resolves ticket 10793. Patch by
-      Florent Daignière.
-
-  o Minor features (config options and command line):
-    - Add an --allow-missing-torrc commandline option that tells Tor to
-      run even if the configuration file specified by -f is not available.
-      Implements ticket 10060.
-    - Add support for the TPROXY transparent proxying facility on Linux.
-      See documentation for the new TransProxyType option for more
-      details. Implementation by "thomo". Closes ticket 10582.
-
-  o Minor features (controller):
-    - Add a new "HS_DESC" controller event that reports activities
-      related to hidden service descriptors. Resolves ticket 8510.
-    - New "DROPGUARDS" controller command to forget all current entry
-      guards. Not recommended for ordinary use, since replacing guards
-      too frequently makes several attacks easier. Resolves ticket 9934;
-      patch from "ra".
-
-  o Minor features (build):
-    - Assume that a user using ./configure --host wants to cross-compile,
-      and give an error if we cannot find a properly named
-      tool-chain. Add a --disable-tool-name-check option to proceed
-      nevertheless. Addresses ticket 9869. Patch by Benedikt Gollatz.
-    - If we run ./configure and the compiler recognizes -fstack-protector
-      but the linker rejects it, warn the user about a potentially missing
-      libssp package. Addresses ticket 9948. Patch from Benedikt Gollatz.
-
-  o Minor features (testing):
-    - If Python is installed, "make check" now runs extra tests beyond
-      the unit test scripts.
-    - When bootstrapping a test network, sometimes very few relays get
-      the Guard flag. Now a new option "TestingDirAuthVoteGuard" can
-      specify a set of relays which should be voted Guard regardless of
-      their uptime or bandwidth. Addresses ticket 9206.
-
-  o Minor features (log messages):
-    - When ServerTransportPlugin is set on a bridge, Tor can write more
-      useful statistics about bridge use in its extrainfo descriptors,
-      but only if the Extended ORPort ("ExtORPort") is set too. Add a
-      log message to inform the user in this case. Resolves ticket 9651.
-    - When receiving a new controller connection, log the origin address.
-      Resolves ticket 9698; patch from "sigpipe".
-    - When logging OpenSSL engine status at startup, log the status of
-      more engines. Fixes ticket 10043; patch from Joshua Datko.
-    - Turn "circuit handshake stats since last time" log messages into a
-      heartbeat message. Fixes bug 10485; bugfix on 0.2.4.17-rc.
-
-  o Minor features (new since 0.2.5.1-alpha, also in 0.2.4.18-rc):
-    - Improve the circuit queue out-of-memory handler. Previously, when
-      we ran low on memory, we'd close whichever circuits had the most
-      queued cells. Now, we close those that have the *oldest* queued
-      cells, on the theory that those are most responsible for us
-      running low on memory. Based on analysis from a forthcoming paper
-      by Jansen, Tschorsch, Johnson, and Scheuermann. Fixes bug 9093.
-    - Generate bootstrapping status update events correctly when fetching
-      microdescriptors. Fixes bug 9927.
-    - Update to the October 2 2013 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (clients):
-    - When closing a channel that has already been open, do not close
-      pending circuits that were waiting to connect to the same relay.
-      Fixes bug 9880; bugfix on 0.2.5.1-alpha. Thanks to skruffy for
-      finding this bug.
-
-  o Minor bugfixes (relays):
-    - Treat ENETUNREACH, EACCES, and EPERM connection failures at an
-      exit node as a NOROUTE error, not an INTERNAL error, since they
-      can apparently happen when trying to connect to the wrong sort
-      of netblocks. Fixes part of bug 10777; bugfix on 0.1.0.1-rc.
-
-  o Minor bugfixes (bridges):
-    - Fix a bug where the first connection works to a bridge that uses a
-      pluggable transport with client-side parameters, but we don't send
-      the client-side parameters on subsequent connections. (We don't
-      use any pluggable transports with client-side parameters yet,
-      but ScrambleSuit will soon become the first one.) Fixes bug 9162;
-      bugfix on 0.2.0.3-alpha. Based on a patch from "rl1987".
-
-  o Minor bugfixes (node selection):
-    - If ExcludeNodes is set, consider non-excluded hidden service
-      directory servers before excluded ones. Do not consider excluded
-      hidden service directory servers at all if StrictNodes is
-      set. (Previously, we would sometimes decide to connect to those
-      servers, and then realize before we initiated a connection that
-      we had excluded them.) Fixes bug 10722; bugfix on 0.2.0.10-alpha.
-      Reported by "mr-4".
-    - If we set the ExitNodes option but it doesn't include any nodes
-      that have the Exit flag, we would choose not to bootstrap. Now we
-      bootstrap so long as ExitNodes includes nodes which can exit to
-      some port. Fixes bug 10543; bugfix on 0.2.4.10-alpha.
-
-  o Minor bugfixes (controller and command-line):
-    - If changing a config option via "setconf" fails in a recoverable
-      way, we used to nonetheless write our new control ports to the
-      file described by the "ControlPortWriteToFile" option. Now we only
-      write out that file if we successfully switch to the new config
-      option. Fixes bug 5605; bugfix on 0.2.2.26-beta. Patch from "Ryman".
-    - When a command-line option such as --version or --help that
-      ordinarily implies --hush appears on the command line along with
-      --quiet, then actually obey --quiet. Previously, we obeyed --quiet
-      only if it appeared later on the command line. Fixes bug 9578;
-      bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (code correctness):
-    - Previously we used two temporary files when writing descriptors to
-      disk; now we only use one. Fixes bug 1376.
-    - Remove an erroneous (but impossible and thus harmless) pointer
-      comparison that would have allowed compilers to skip a bounds
-      check in channeltls.c. Fixes bugs 10313 and 9980; bugfix on
-      0.2.0.10-alpha. Noticed by Jared L Wong and David Fifield.
-    - Fix an always-true assertion in pluggable transports code so it
-      actually checks what it was trying to check. Fixes bug 10046;
-      bugfix on 0.2.3.9-alpha. Found by "dcb".
-
-  o Minor bugfixes (protocol correctness):
-    - When receiving a VERSIONS cell with an odd number of bytes, close
-      the connection immediately since the cell is malformed. Fixes bug
-      10365; bugfix on 0.2.0.10-alpha. Spotted by "bobnomnom"; fix by
-      "rl1987".
-
-  o Minor bugfixes (build):
-    - Restore the ability to compile Tor with V2_HANDSHAKE_SERVER
-      turned off (that is, without support for v2 link handshakes). Fixes
-      bug 4677; bugfix on 0.2.3.2-alpha. Patch from "piet".
-    - Fix compilation warnings and startup issues when running with
-      "Sandbox 1" and libseccomp-2.1.0. Fixes bug 10563; bugfix on
-      0.2.5.1-alpha.
-    - Fix compilation on Solaris 9, which didn't like us having an
-      identifier named "sun". Fixes bug 10565; bugfix in 0.2.5.1-alpha.
-
-  o Minor bugfixes (testing):
-    - Fix a segmentation fault in our benchmark code when running with
-      Fedora's OpenSSL package, or any other OpenSSL that provides
-      ECDH but not P224. Fixes bug 10835; bugfix on 0.2.4.8-alpha.
-
-  o Minor bugfixes (log messages):
-    - Fix a bug where clients using bridges would report themselves
-      as 50% bootstrapped even without a live consensus document.
-      Fixes bug 9922; bugfix on 0.2.1.1-alpha.
-    - Suppress a warning where, if there's only one directory authority
-      in the network, we would complain that votes and signatures cannot
-      be uploaded to other directory authorities. Fixes bug 10842;
-      bugfix on 0.2.2.26-beta.
-    - Report bootstrapping progress correctly when we're downloading
-      microdescriptors. We had updated our "do we have enough microdescs
-      to begin building circuits?" logic most recently in 0.2.4.10-alpha
-      (see bug 5956), but we left the bootstrap status event logic at
-      "how far through getting 1/4 of them are we?" Fixes bug 9958;
-      bugfix on 0.2.2.36, which is where they diverged (see bug 5343).
-
-  o Minor bugfixes (new since 0.2.5.1-alpha, also in 0.2.4.20):
-    - Avoid a crash bug when starting with a corrupted microdescriptor
-      cache file. Fixes bug 10406; bugfix on 0.2.2.6-alpha.
-    - If we fail to dump a previously cached microdescriptor to disk, avoid
-      freeing duplicate data later on. Fixes bug 10423; bugfix on
-      0.2.4.13-alpha. Spotted by "bobnomnom".
-
-  o Minor bugfixes on 0.2.4.x (new since 0.2.5.1-alpha, also in 0.2.4.18-rc):
-    - Correctly log long IPv6 exit policies, instead of truncating them
-      or reporting an error. Fixes bug 9596; bugfix on 0.2.4.7-alpha.
-    - Our default TLS ecdhe groups were backwards: we meant to be using
-      P224 for relays (for performance win) and P256 for bridges (since
-      it is more common in the wild). Instead we had it backwards. After
-      reconsideration, we decided that the default should be P256 on all
-      hosts, since its security is probably better, and since P224 is
-      reportedly used quite little in the wild.  Found by "skruffy" on
-      IRC. Fix for bug 9780; bugfix on 0.2.4.8-alpha.
-    - Free directory authority certificate download statuses on exit
-      rather than leaking them. Fixes bug 9644; bugfix on 0.2.4.13-alpha.
-
-  o Minor bugfixes on 0.2.3.x (new since 0.2.5.1-alpha, also in 0.2.4.18-rc):
-    - If the guard we choose first doesn't answer, we would try the
-      second guard, but once we connected to the second guard we would
-      abandon it and retry the first one, slowing down bootstrapping.
-      The fix is to treat all our initially chosen guards as acceptable
-      to use. Fixes bug 9946; bugfix on 0.1.1.11-alpha.
-    - Fix an assertion failure that would occur when disabling the
-      ORPort setting on a running Tor process while accounting was
-      enabled. Fixes bug 6979; bugfix on 0.2.2.18-alpha.
-    - When examining the list of network interfaces to find our address,
-      do not consider non-running or disabled network interfaces. Fixes
-      bug 9904; bugfix on 0.2.3.11-alpha. Patch from "hantwister".
-    - Avoid an off-by-one error when checking buffer boundaries when
-      formatting the exit status of a pluggable transport helper.
-      This is probably not an exploitable bug, but better safe than
-      sorry. Fixes bug 9928; bugfix on 0.2.3.18-rc. Bug found by
-      Pedro Ribeiro.
-
-  o Removed code and features:
-    - Clients now reject any directory authority certificates lacking
-      a dir-key-crosscert element. These have been included since
-      0.2.1.9-alpha, so there's no real reason for them to be optional
-      any longer. Completes proposal 157. Resolves ticket 10162.
-    - Remove all code that existed to support the v2 directory system,
-      since there are no longer any v2 directory authorities. Resolves
-      ticket 10758.
-    - Remove the HSAuthoritativeDir and AlternateHSAuthority torrc
-      options, which were used for designating authorities as "Hidden
-      service authorities". There has been no use of hidden service
-      authorities since 0.2.2.1-alpha, when we stopped uploading or
-      downloading v0 hidden service descriptors. Fixes bug 10881; also
-      part of a fix for bug 10841.
-
-  o Code simplification and refactoring:
-    - Remove some old fallback code designed to keep Tor clients working
-      in a network with only two working relays. Elsewhere in the code we
-      have long since stopped supporting such networks, so there wasn't
-      much point in keeping it around. Addresses ticket 9926.
-    - Reject 0-length EXTEND2 cells more explicitly. Fixes bug 10536;
-      bugfix on 0.2.4.8-alpha. Reported by "cypherpunks".
-    - Remove data structures which were introduced to implement the
-      CellStatistics option: they are now redundant with the addition
-      of a timestamp to the regular packed_cell_t data structure, which
-      we did in 0.2.4.18-rc in order to resolve ticket 9093. Implements
-      ticket 10870.
-
-  o Documentation (man page) fixes:
-    - Update manpage to describe some of the files you can expect to
-      find in Tor's DataDirectory. Addresses ticket 9839.
-    - Document that all but one DirPort entry must have the NoAdvertise
-      flag set. Fixes bug 10470; bugfix on 0.2.3.3-alpha / 0.2.3.16-alpha.
-
-  o Documentation fixes (new since 0.2.5.1-alpha, also in 0.2.4.18-rc):
-    - Clarify the usage and risks of setting the ContactInfo torrc line
-      for your relay or bridge. Resolves ticket 9854.
-    - Add anchors to the manpage so we can link to the html version of
-      the documentation for specific options. Resolves ticket 9866.
-    - Replace remaining references to DirServer in man page and
-      log entries. Resolves ticket 10124.
-
-  o Tool changes:
-    - Make the "tor-gencert" tool used by directory authority operators
-      create 2048-bit signing keys by default (rather than 1024-bit, since
-      1024-bit is uncomfortably small these days). Addresses ticket 10324.
-
-
-Changes in version 0.2.4.20 - 2013-12-22
-  Tor 0.2.4.20 fixes potentially poor random number generation for users
-  who 1) use OpenSSL 1.0.0 or later, 2) set "HardwareAccel 1" in their
-  torrc file, 3) have "Sandy Bridge" or "Ivy Bridge" Intel processors,
-  and 4) have no state file in their DataDirectory (as would happen on
-  first start). Users who generated relay or hidden service identity
-  keys in such a situation should discard them and generate new ones.
-
-  This release also fixes a logic error that caused Tor clients to build
-  many more preemptive circuits than they actually need.
-
-  o Major bugfixes:
-    - Do not allow OpenSSL engines to replace the PRNG, even when
-      HardwareAccel is set. The only default builtin PRNG engine uses
-      the Intel RDRAND instruction to replace the entire PRNG, and
-      ignores all attempts to seed it with more entropy. That's
-      cryptographically stupid: the right response to a new alleged
-      entropy source is never to discard all previously used entropy
-      sources. Fixes bug 10402; works around behavior introduced in
-      OpenSSL 1.0.0. Diagnosis and investigation thanks to "coderman"
-      and "rl1987".
-    - Fix assertion failure when AutomapHostsOnResolve yields an IPv6
-      address. Fixes bug 10465; bugfix on 0.2.4.7-alpha.
-    - Avoid launching spurious extra circuits when a stream is pending.
-      This fixes a bug where any circuit that _wasn't_ unusable for new
-      streams would be treated as if it were, causing extra circuits to
-      be launched. Fixes bug 10456; bugfix on 0.2.4.12-alpha.
-
-  o Minor bugfixes:
-    - Avoid a crash bug when starting with a corrupted microdescriptor
-      cache file. Fixes bug 10406; bugfix on 0.2.2.6-alpha.
-    - If we fail to dump a previously cached microdescriptor to disk, avoid
-      freeing duplicate data later on. Fixes bug 10423; bugfix on
-      0.2.4.13-alpha. Spotted by "bobnomnom".
-
-
-Changes in version 0.2.4.19 - 2013-12-11
-  The Tor 0.2.4 release series is dedicated to the memory of Aaron Swartz
-  (1986-2013). Aaron worked on diverse projects including helping to guide
-  Creative Commons, playing a key role in stopping SOPA/PIPA, bringing
-  transparency to the U.S government's PACER documents, and contributing
-  design and development for Tor and Tor2Web. Aaron was one of the latest
-  martyrs in our collective fight for civil liberties and human rights,
-  and his death is all the more painful because he was one of us.
-
-  Tor 0.2.4.19, the first stable release in the 0.2.4 branch, features
-  a new circuit handshake and link encryption that use ECC to provide
-  better security and efficiency; makes relays better manage circuit
-  creation requests; uses "directory guards" to reduce client enumeration
-  risks; makes bridges collect and report statistics about the pluggable
-  transports they support; cleans up and improves our geoip database;
-  gets much closer to IPv6 support for clients, bridges, and relays; makes
-  directory authorities use measured bandwidths rather than advertised
-  ones when computing flags and thresholds; disables client-side DNS
-  caching to reduce tracking risks; and fixes a big bug in bridge
-  reachability testing. This release introduces two new design
-  abstractions in the code: a new "channel" abstraction between circuits
-  and or_connections to allow for implementing alternate relay-to-relay
-  transports, and a new "circuitmux" abstraction storing the queue of
-  circuits for a channel. The release also includes many stability,
-  security, and privacy fixes.
-
-
-Changes in version 0.2.4.18-rc - 2013-11-16
-  Tor 0.2.4.18-rc is the fourth release candidate for the Tor 0.2.4.x
-  series. It takes a variety of fixes from the 0.2.5.x branch to improve
-  stability, performance, and better handling of edge cases.
-
-  o Major features:
-    - Re-enable TLS 1.1 and 1.2 when built with OpenSSL 1.0.1e or later.
-      Resolves ticket 6055. (OpenSSL before 1.0.1 didn't have TLS 1.1 or
-      1.2, and OpenSSL from 1.0.1 through 1.0.1d had bugs that prevented
-      renegotiation from working with TLS 1.1 or 1.2, so we had disabled
-      them to solve bug 6033.)
-
-  o Major bugfixes:
-    - No longer stop reading or writing on cpuworker connections when
-      our rate limiting buckets go empty. Now we should handle circuit
-      handshake requests more promptly. Resolves bug 9731.
-    - If we are unable to save a microdescriptor to the journal, do not
-      drop it from memory and then reattempt downloading it. Fixes bug
-      9645; bugfix on 0.2.2.6-alpha.
-    - Stop trying to bootstrap all our directory information from
-      only our first guard. Discovered while fixing bug 9946; bugfix
-      on 0.2.4.8-alpha.
-    - The new channel code sometimes lost track of in-progress circuits,
-      causing long-running clients to stop building new circuits. The
-      fix is to always call circuit_n_chan_done(chan, 0) from
-      channel_closed(). Fixes bug 9776; bugfix on 0.2.4.17-rc.
-
-  o Minor bugfixes (on 0.2.4.x):
-    - Correctly log long IPv6 exit policies, instead of truncating them
-      or reporting an error. Fixes bug 9596; bugfix on 0.2.4.7-alpha.
-    - Our default TLS ecdhe groups were backwards: we meant to be using
-      P224 for relays (for performance win) and P256 for bridges (since
-      it is more common in the wild). Instead we had it backwards. After
-      reconsideration, we decided that the default should be P256 on all
-      hosts, since its security is probably better, and since P224 is
-      reportedly used quite little in the wild.  Found by "skruffy" on
-      IRC. Fix for bug 9780; bugfix on 0.2.4.8-alpha.
-    - Free directory authority certificate download statuses on exit
-      rather than leaking them. Fixes bug 9644; bugfix on 0.2.4.13-alpha.
-
-  o Minor bugfixes (on 0.2.3.x and earlier):
-    - If the guard we choose first doesn't answer, we would try the
-      second guard, but once we connected to the second guard we would
-      abandon it and retry the first one, slowing down bootstrapping.
-      The fix is to treat all our initially chosen guards as acceptable
-      to use. Fixes bug 9946; bugfix on 0.1.1.11-alpha.
-    - Fix an assertion failure that would occur when disabling the
-      ORPort setting on a running Tor process while accounting was
-      enabled. Fixes bug 6979; bugfix on 0.2.2.18-alpha.
-    - When examining the list of network interfaces to find our address,
-      do not consider non-running or disabled network interfaces. Fixes
-      bug 9904; bugfix on 0.2.3.11-alpha. Patch from "hantwister".
-    - Avoid an off-by-one error when checking buffer boundaries when
-      formatting the exit status of a pluggable transport helper.
-      This is probably not an exploitable bug, but better safe than
-      sorry. Fixes bug 9928; bugfix on 0.2.3.18-rc. Bug found by
-      Pedro Ribeiro.
-
-  o Minor features (protecting client timestamps):
-    - Clients no longer send timestamps in their NETINFO cells. These were
-      not used for anything, and they provided one small way for clients
-      to be distinguished from each other as they moved from network to
-      network or behind NAT. Implements part of proposal 222.
-    - Clients now round timestamps in INTRODUCE cells down to the nearest
-      10 minutes. If a new Support022HiddenServices option is set to 0, or
-      if it's set to "auto" and the feature is disabled in the consensus,
-      the timestamp is sent as 0 instead. Implements part of proposal 222.
-    - Stop sending timestamps in AUTHENTICATE cells. This is not such
-      a big deal from a security point of view, but it achieves no actual
-      good purpose, and isn't needed. Implements part of proposal 222.
-    - Reduce down accuracy of timestamps in hidden service descriptors.
-      Implements part of proposal 222.
-
-  o Minor features (other):
-    - Improve the circuit queue out-of-memory handler. Previously, when
-      we ran low on memory, we'd close whichever circuits had the most
-      queued cells. Now, we close those that have the *oldest* queued
-      cells, on the theory that those are most responsible for us
-      running low on memory. Based on analysis from a forthcoming paper
-      by Jansen, Tschorsch, Johnson, and Scheuermann. Fixes bug 9093.
-    - Generate bootstrapping status update events correctly when fetching
-      microdescriptors. Fixes bug 9927.
-    - Update to the October 2 2013 Maxmind GeoLite Country database.
-
-  o Documentation fixes:
-    - Clarify the usage and risks of setting the ContactInfo torrc line
-      for your relay or bridge. Resolves ticket 9854.
-    - Add anchors to the manpage so we can link to the html version of
-      the documentation for specific options. Resolves ticket 9866.
-    - Replace remaining references to DirServer in man page and
-      log entries. Resolves ticket 10124.
-
-
-Changes in version 0.2.5.1-alpha - 2013-10-02
-  Tor 0.2.5.1-alpha introduces experimental support for syscall sandboxing
-  on Linux, allows bridges that offer pluggable transports to report usage
-  statistics, fixes many issues to make testing easier, and provides
-  a pile of minor features and bugfixes that have been waiting for a
-  release of the new branch.
-
-  This is the first alpha release in a new series, so expect there to
-  be bugs. Users who would rather test out a more stable branch should
-  stay with 0.2.4.x for now.
-
-  o Major features (security):
-    - Use the seccomp2 syscall filtering facility on Linux to limit
-      which system calls Tor can invoke. This is an experimental,
-      Linux-only feature to provide defense-in-depth against unknown
-      attacks. To try turning it on, set "Sandbox 1" in your torrc
-      file. Please be ready to report bugs. We hope to add support
-      for better sandboxing in the future, including more fine-grained
-      filters, better division of responsibility, and support for more
-      platforms. This work has been done by Cristian-Matei Toader for
-      Google Summer of Code.
-    - Re-enable TLS 1.1 and 1.2 when built with OpenSSL 1.0.1e or later.
-      Resolves ticket 6055. (OpenSSL before 1.0.1 didn't have TLS 1.1 or
-      1.2, and OpenSSL from 1.0.1 through 1.0.1d had bugs that prevented
-      renegotiation from working with TLS 1.1 or 1.2, so we had disabled
-      them to solve bug 6033.)
-
-  o Major features (other):
-    - Add support for passing arguments to managed pluggable transport
-      proxies. Implements ticket 3594.
-    - Bridges now track GeoIP information and the number of their users
-      even when pluggable transports are in use, and report usage
-      statistics in their extra-info descriptors. Resolves tickets 4773
-      and 5040.
-    - Make testing Tor networks bootstrap better: lower directory fetch
-      retry schedules and maximum interval without directory requests,
-      and raise maximum download tries. Implements ticket 6752.
-    - Add make target 'test-network' to run tests on a Chutney network.
-      Implements ticket 8530.
-    - The ntor handshake is now on-by-default, no matter what the
-      directory authorities recommend. Implements ticket 8561.
-
-  o Major bugfixes:
-    - Instead of writing destroy cells directly to outgoing connection
-      buffers, queue them and intersperse them with other outgoing cells.
-      This can prevent a set of resource starvation conditions where too
-      many pending destroy cells prevent data cells from actually getting
-      delivered. Reported by "oftc_must_be_destroyed". Fixes bug 7912;
-      bugfix on 0.2.0.1-alpha.
-    - If we are unable to save a microdescriptor to the journal, do not
-      drop it from memory and then reattempt downloading it. Fixes bug
-      9645; bugfix on 0.2.2.6-alpha.
-    - The new channel code sometimes lost track of in-progress circuits,
-      causing long-running clients to stop building new circuits. The
-      fix is to always call circuit_n_chan_done(chan, 0) from
-      channel_closed(). Fixes bug 9776; bugfix on 0.2.4.17-rc.
-
-  o Build features:
-    - Tor now builds each source file in two modes: a mode that avoids
-      exposing identifiers needlessly, and another mode that exposes
-      more identifiers for testing. This lets the compiler do better at
-      optimizing the production code, while enabling us to take more
-      radical measures to let the unit tests test things.
-    - The production builds no longer include functions used only in
-      the unit tests; all functions exposed from a module only for
-      unit-testing are now static in production builds.
-    - Add an --enable-coverage configuration option to make the unit
-      tests (and a new src/or/tor-cov target) to build with gcov test
-      coverage support.
-
-  o Testing:
-    - We now have rudimentary function mocking support that our unit
-      tests can use to test functions in isolation. Function mocking
-      lets the tests temporarily replace a function's dependencies with
-      stub functions, so that the tests can check the function without
-      invoking the other functions it calls.
-    - Add more unit tests for the ->circuit map, and
-      the destroy-cell-tracking code to fix bug 7912.
-    - Unit tests for failing cases of the TAP onion handshake.
-    - More unit tests for address-manipulation functions.
-
-  o Minor features (protecting client timestamps):
-    - Clients no longer send timestamps in their NETINFO cells. These were
-      not used for anything, and they provided one small way for clients
-      to be distinguished from each other as they moved from network to
-      network or behind NAT. Implements part of proposal 222.
-    - Clients now round timestamps in INTRODUCE cells down to the nearest
-      10 minutes. If a new Support022HiddenServices option is set to 0, or
-      if it's set to "auto" and the feature is disabled in the consensus,
-      the timestamp is sent as 0 instead. Implements part of proposal 222.
-    - Stop sending timestamps in AUTHENTICATE cells. This is not such
-      a big deal from a security point of view, but it achieves no actual
-      good purpose, and isn't needed. Implements part of proposal 222.
-    - Reduce down accuracy of timestamps in hidden service descriptors.
-      Implements part of proposal 222.
-
-  o Minor features (config options):
-    - Config (torrc) lines now handle fingerprints which are missing
-      their initial '$'. Resolves ticket 4341; improvement over 0.0.9pre5.
-    - Support a --dump-config option to print some or all of the
-      configured options. Mainly useful for debugging the command-line
-      option parsing code. Helps resolve ticket 4647.
-    - Raise awareness of safer logging: notify user of potentially
-      unsafe config options, like logging more verbosely than severity
-      "notice" or setting SafeLogging to 0. Resolves ticket 5584.
-    - Add a new configuration option TestingV3AuthVotingStartOffset
-      that bootstraps a network faster by changing the timing for
-      consensus votes. Addresses ticket 8532.
-    - Add a new torrc option "ServerTransportOptions" that allows
-      bridge operators to pass configuration parameters to their
-      pluggable transports. Resolves ticket 8929.
-    - The config (torrc) file now accepts bandwidth and space limits in
-      bits as well as bytes. (Anywhere that you can say "2 Kilobytes",
-      you can now say "16 kilobits", and so on.) Resolves ticket 9214.
-      Patch by CharlieB.
-
-  o Minor features (build):
-    - Add support for `--library-versions` flag. Implements ticket 6384.
-    - Return the "unexpected sendme" warnings to a warn severity, but make
-      them rate limited, to help diagnose ticket 8093.
-    - Detect a missing asciidoc, and warn the user about it, during
-      configure rather than at build time. Fixes issue 6506. Patch from
-      Arlo Breault.
-
-  o Minor features (other):
-    - Use the SOCK_NONBLOCK socket type, if supported, to open nonblocking
-      sockets in a single system call. Implements ticket 5129.
-    - Log current accounting state (bytes sent and received + remaining
-      time for the current accounting period) in the relay's heartbeat
-      message. Implements ticket 5526; patch from Peter Retzlaff.
-    - Implement the TRANSPORT_LAUNCHED control port event that
-      notifies controllers about new launched pluggable
-      transports. Resolves ticket 5609.
-    - If we're using the pure-C 32-bit curve25519_donna implementation
-      of curve25519, build it with the -fomit-frame-pointer option to
-      make it go faster on register-starved hosts. This improves our
-      handshake performance by about 6% on i386 hosts without nacl.
-      Closes ticket 8109.
-    - Update to the September 4 2013 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Set the listen() backlog limit to the largest actually supported
-      on the system, not to the value in a header file. Fixes bug 9716;
-      bugfix on every released Tor.
-    - No longer accept malformed http headers when parsing urls from
-      headers. Now we reply with Bad Request ("400"). Fixes bug 2767;
-      bugfix on 0.0.6pre1.
-    - In munge_extrainfo_into_routerinfo(), check the return value of
-      memchr(). This would have been a serious issue if we ever passed
-      it a non-extrainfo. Fixes bug 8791; bugfix on 0.2.0.6-alpha. Patch
-      from Arlo Breault.
-    - On the chance that somebody manages to build Tor on a
-      platform where time_t is unsigned, correct the way that
-      microdesc_add_to_cache() handles negative time arguments.
-      Fixes bug 8042; bugfix on 0.2.3.1-alpha.
-    - Reject relative control socket paths and emit a warning. Previously,
-      single-component control socket paths would be rejected, but Tor
-      would not log why it could not validate the config. Fixes bug 9258;
-      bugfix on 0.2.3.16-alpha.
-
-  o Minor bugfixes (command line):
-    - Use a single command-line parser for parsing torrc options on the
-      command line and for finding special command-line options to avoid
-      inconsistent behavior for torrc option arguments that have the same
-      names as command-line options. Fixes bugs 4647 and 9578; bugfix on
-      0.0.9pre5.
-    - No longer allow 'tor --hash-password' with no arguments. Fixes bug
-      9573; bugfix on 0.0.9pre5.
-
-  o Minor fixes (build, auxiliary programs):
-    - Stop preprocessing the "torify" script with autoconf, since
-      it no longer refers to LOCALSTATEDIR. Fixes bug 5505; patch
-      from Guilhem.
-    - The tor-fw-helper program now follows the standard convention and
-      exits with status code "0" on success. Fixes bug 9030; bugfix on
-      0.2.3.1-alpha. Patch by Arlo Breault.
-    - Corrected ./configure advice for what openssl dev package you should
-      install on Debian. Fixes bug 9207; bugfix on 0.2.0.1-alpha.
-
-  o Minor code improvements:
-    - Remove constants and tests for PKCS1 padding; it's insecure and
-      shouldn't be used for anything new. Fixes bug 8792; patch
-      from Arlo Breault.
-    - Remove instances of strcpy() from the unit tests. They weren't
-      hurting anything, since they were only in the unit tests, but it's
-      embarassing to have strcpy() in the code at all, and some analysis
-      tools don't like it. Fixes bug 8790; bugfix on 0.2.3.6-alpha and
-      0.2.3.8-alpha. Patch from Arlo Breault.
-
-  o Removed features:
-    - Remove migration code from when we renamed the "cached-routers"
-      file to "cached-descriptors" back in 0.2.0.8-alpha. This
-      incidentally resolves ticket 6502 by cleaning up the related code
-      a bit. Patch from Akshay Hebbar.
-
-  o Code simplification and refactoring:
-    - Extract the common duplicated code for creating a subdirectory
-      of the data directory and writing to a file in it. Fixes ticket
-      4282; patch from Peter Retzlaff.
-    - Since OpenSSL 0.9.7, the i2d_*() functions support allocating output
-      buffer. Avoid calling twice: i2d_RSAPublicKey(), i2d_DHparams(),
-      i2d_X509(), and i2d_PublicKey(). Resolves ticket 5170.
-    - Add a set of accessor functions for the circuit timeout data
-      structure. Fixes ticket 6153; patch from "piet".
-    - Clean up exit paths from connection_listener_new(). Closes ticket
-      8789. Patch from Arlo Breault.
-    - Since we rely on OpenSSL 0.9.8 now, we can use EVP_PKEY_cmp()
-      and drop our own custom pkey_eq() implementation. Fixes bug 9043.
-    - Use a doubly-linked list to implement the global circuit list.
-      Resolves ticket 9108. Patch from Marek Majkowski.
-    - Remove contrib/id_to_fp.c since it wasn't used anywhere.
-
-
-Changes in version 0.2.4.17-rc - 2013-09-05
-  Tor 0.2.4.17-rc is the third release candidate for the Tor 0.2.4.x
-  series. It adds an emergency step to help us tolerate the massive
-  influx of users: 0.2.4 clients using the new (faster and safer) "NTor"
-  circuit-level handshakes now effectively jump the queue compared to
-  the 0.2.3 clients using "TAP" handshakes. This release also fixes a
-  big bug hindering bridge reachability tests.
-
-  o Major features:
-    - Relays now process the new "NTor" circuit-level handshake requests
-      with higher priority than the old "TAP" circuit-level handshake
-      requests. We still process some TAP requests to not totally starve
-      0.2.3 clients when NTor becomes popular. A new consensus parameter
-      "NumNTorsPerTAP" lets us tune the balance later if we need to.
-      Implements ticket 9574.
-
-  o Major bugfixes:
-    - If the circuit build timeout logic is disabled (via the consensus,
-      or because we are an authority), then don't build testing circuits.
-      Fixes bug 9657; bugfix on 0.2.2.14-alpha.
-    - Bridges now send AUTH_CHALLENGE cells during their v3 handshakes;
-      previously they did not, which prevented them from receiving
-      successful connections from relays for self-test or bandwidth
-      testing. Also, when a relay is extending a circuit to a bridge,
-      it needs to send a NETINFO cell, even when the bridge hasn't sent
-      an AUTH_CHALLENGE cell. Fixes bug 9546; bugfix on 0.2.3.6-alpha.
-    - If the time to download the next old-style networkstatus is in
-      the future, do not decline to consider whether to download the
-      next microdescriptor networkstatus. Fixes bug 9564; bugfix on
-      0.2.3.14-alpha.
-
-  o Minor bugfixes:
-    - Avoid double-closing the listener socket in our socketpair()
-      replacement (used on Windows) in the case where the addresses on
-      our opened sockets don't match what we expected. Fixes bug 9400;
-      bugfix on 0.0.2pre7. Found by Coverity.
-
-  o Minor fixes (config options):
-    - Avoid overflows when the user sets MaxCircuitDirtiness to a
-      ridiculously high value, by imposing a (ridiculously high) 30-day
-      maximum on MaxCircuitDirtiness.
-    - Fix the documentation of HeartbeatPeriod to say that the heartbeat
-      message is logged at notice, not at info.
-    - Warn and fail if a server is configured not to advertise any
-      ORPorts at all. (We need *something* to put in our descriptor,
-      or we just won't work.)
-
-  o Minor features:
-    - Track how many "TAP" and "NTor" circuit handshake requests we get,
-      and how many we complete, and log it every hour to help relay
-      operators follow trends in network load. Addresses ticket 9658.
-    - Update to the August 7 2013 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.4.16-rc - 2013-08-10
-  Tor 0.2.4.16-rc is the second release candidate for the Tor 0.2.4.x
-  series. It fixes several crash bugs in the 0.2.4 branch.
-
-  o Major bugfixes:
-    - Fix a bug in the voting algorithm that could yield incorrect results
-      when a non-naming authority declared too many flags. Fixes bug 9200;
-      bugfix on 0.2.0.3-alpha.
-    - Fix an uninitialized read that could in some cases lead to a remote
-      crash while parsing INTRODUCE2 cells. Bugfix on 0.2.4.1-alpha.
-      Anybody running a hidden service on the experimental 0.2.4.x
-      branch should upgrade. (This is, so far as we know, unrelated to
-      the recent news.)
-    - Avoid an assertion failure when processing DNS replies without the
-      answer types we expected. Fixes bug 9337; bugfix on 0.2.4.7-alpha.
-    - Avoid a crash when using --hash-password. Fixes bug 9295; bugfix on
-      0.2.4.15-rc. Found by stem integration tests.
-
-  o Minor bugfixes:
-    - Fix an invalid memory read that occured when a pluggable
-      transport proxy failed its configuration protocol.
-      Fixes bug 9288; bugfix on 0.2.4.1-alpha.
-    - When evaluating whether to use a connection that we haven't
-      decided is canonical using a recent link protocol version,
-      decide that it's canonical only if it used address _does_
-      match the desired address. Fixes bug 9309; bugfix on
-      0.2.4.4-alpha. Reported by skruffy.
-    - Make the default behavior of NumDirectoryGuards be to track
-      NumEntryGuards. Now a user who changes only NumEntryGuards will get
-      the behavior she expects. Fixes bug 9354; bugfix on 0.2.4.8-alpha.
-    - Fix a spurious compilation warning with some older versions of
-      GCC on FreeBSD. Fixes bug 9254; bugfix on 0.2.4.14-alpha.
-
-  o Minor features:
-    - Update to the July 3 2013 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.4.15-rc - 2013-07-01
-  Tor 0.2.4.15-rc is the first release candidate for the Tor 0.2.4.x
-  series. It fixes a few smaller bugs, but generally appears stable.
-  Please test it and let us know whether it is!
-
-  o Major bugfixes:
-    - When receiving a new configuration file via the control port's
-      LOADCONF command, do not treat the defaults file as absent.
-      Fixes bug 9122; bugfix on 0.2.3.9-alpha.
-
-  o Minor features:
-    - Issue a warning when running with the bufferevents backend enabled.
-      It's still not stable, and people should know that they're likely
-      to hit unexpected problems. Closes ticket 9147.
-
-
-Changes in version 0.2.4.14-alpha - 2013-06-18
-  Tor 0.2.4.14-alpha fixes a pair of client guard enumeration problems
-  present in 0.2.4.13-alpha.
-
-  o Major bugfixes:
-    - When we have too much memory queued in circuits (according to a new
-      MaxMemInCellQueues option), close the circuits consuming the most
-      memory. This prevents us from running out of memory as a relay if
-      circuits fill up faster than they can be drained. Fixes bug 9063;
-      bugfix on the 54th commit of Tor. This bug is a further fix beyond
-      bug 6252, whose fix was merged into 0.2.3.21-rc.
-
-      This change also fixes an earlier approach taken in 0.2.4.13-alpha,
-      where we tried to solve this issue simply by imposing an upper limit
-      on the number of queued cells for a single circuit. That approach
-      proved to be problematic, since there are ways to provoke clients to
-      send a number of cells in excess of any such reasonable limit. Fixes
-      bug 9072; bugfix on 0.2.4.13-alpha.
-
-    - Limit hidden service descriptors to at most ten introduction
-      points, to slow one kind of guard enumeration. Fixes bug 9002;
-      bugfix on 0.1.1.11-alpha.
-
-
-Changes in version 0.2.4.13-alpha - 2013-06-14
-  Tor 0.2.4.13-alpha fixes a variety of potential remote crash
-  vulnerabilities, makes socks5 username/password circuit isolation
-  actually actually work (this time for sure!), and cleans up a bunch
-  of other issues in preparation for a release candidate.
-
-  o Major bugfixes (robustness):
-    - Close any circuit that has too many cells queued on it. Fixes
-      bug 9063; bugfix on the 54th commit of Tor. This bug is a further
-      fix beyond bug 6252, whose fix was merged into 0.2.3.21-rc.
-    - Prevent the get_freelists() function from running off the end of
-      the list of freelists if it somehow gets an unrecognized
-      allocation. Fixes bug 8844; bugfix on 0.2.0.16-alpha. Reported by
-      eugenis.
-    - Avoid an assertion failure on OpenBSD (and perhaps other BSDs)
-      when an exit connection with optimistic data succeeds immediately
-      rather than returning EINPROGRESS. Fixes bug 9017; bugfix on
-      0.2.3.1-alpha.
-    - Fix a directory authority crash bug when building a consensus
-      using an older consensus as its basis. Fixes bug 8833. Bugfix
-      on 0.2.4.12-alpha.
-
-  o Major bugfixes:
-    - Avoid a memory leak where we would leak a consensus body when we
-      find that a consensus which we couldn't previously verify due to
-      missing certificates is now verifiable. Fixes bug 8719; bugfix
-      on 0.2.0.10-alpha.
-    - We used to always request authority certificates by identity digest,
-      meaning we'd get the newest one even when we wanted one with a
-      different signing key. Then we would complain about being given
-      a certificate we already had, and never get the one we really
-      wanted. Now we use the "fp-sk/" resource as well as the "fp/"
-      resource to request the one we want. Fixes bug 5595; bugfix on
-      0.2.0.8-alpha.
-    - Follow the socks5 protocol when offering username/password
-      authentication. The fix for bug 8117 exposed this bug, and it
-      turns out real-world applications like Pidgin do care. Bugfix on
-      0.2.3.2-alpha; fixes bug 8879.
-    - Prevent failures on Windows Vista and later when rebuilding the
-      microdescriptor cache. Diagnosed by Robert Ransom. Fixes bug 8822;
-      bugfix on 0.2.4.12-alpha.
-
-  o Minor bugfixes:
-    - Fix an impossible buffer overrun in the AES unit tests. Fixes
-      bug 8845; bugfix on 0.2.0.7-alpha. Found by eugenis.
-    - If for some reason we fail to write a microdescriptor while
-      rebuilding the cache, do not let the annotations from that
-      microdescriptor linger in the cache file, and do not let the
-      microdescriptor stay recorded as present in its old location.
-      Fixes bug 9047; bugfix on 0.2.2.6-alpha.
-    - Fix a memory leak that would occur whenever a configuration
-      option changed. Fixes bug 8718; bugfix on 0.2.3.3-alpha.
-    - Paste the description for PathBias parameters from the man
-      page into or.h, so the code documents them too. Fixes bug 7982;
-      bugfix on 0.2.3.17-beta and 0.2.4.8-alpha.
-    - Relays now treat a changed IPv6 ORPort as sufficient reason to
-      publish an updated descriptor. Fixes bug 6026; bugfix on
-      0.2.4.1-alpha.
-    - When launching a resolve request on behalf of an AF_UNIX control
-      socket, omit the address field of the new entry connection, used in
-      subsequent controller events, rather than letting tor_dup_addr()
-      set it to "". Fixes bug 8639; bugfix on
-      0.2.4.12-alpha.
-
-  o Minor bugfixes (log messages):
-    - Fix a scaling issue in the path bias accounting code that
-      resulted in "Bug:" log messages from either
-      pathbias_scale_close_rates() or pathbias_count_build_success().
-      This represents a bugfix on a previous bugfix: the original fix
-      attempted in 0.2.4.10-alpha was incomplete. Fixes bug 8235; bugfix
-      on 0.2.4.1-alpha.
-    - Give a less useless error message when the user asks for an IPv4
-      address on an IPv6-only port, or vice versa. Fixes bug 8846; bugfix
-      on 0.2.4.7-alpha.
-
-  o Minor features:
-    - Downgrade "unexpected SENDME" warnings to protocol-warn for 0.2.4.x,
-      to tolerate bug 8093 for now.
-    - Add an "ignoring-advertised-bws" boolean to the flag-threshold lines
-      in directory authority votes to describe whether they have enough
-      measured bandwidths to ignore advertised (relay descriptor)
-      bandwidth claims. Resolves ticket 8711.
-    - Update to the June 5 2013 Maxmind GeoLite Country database.
-
-  o Removed documentation:
-    - Remove some of the older contents of doc/ as obsolete; move others
-      to torspec.git. Fixes bug 8965.
-
-  o Code simplification and refactoring:
-    - Avoid using character buffers when constructing most directory
-      objects: this approach was unwieldy and error-prone. Instead,
-      build smartlists of strings, and concatenate them when done.
-
-
-Changes in version 0.2.4.12-alpha - 2013-04-18
-  Tor 0.2.4.12-alpha moves Tor forward on several fronts: it starts the
-  process for lengthening the guard rotation period, makes directory
-  authority opinions in the consensus a bit less gameable, makes socks5
-  username/password circuit isolation actually work, and fixes a wide
-  variety of other issues.
-
-  o Major features:
-    - Raise the default time that a client keeps an entry guard from
-      "1-2 months" to "2-3 months", as suggested by Tariq Elahi's WPES
-      2012 paper. (We would make it even longer, but we need better client
-      load balancing first.) Also, make the guard lifetime controllable
-      via a new GuardLifetime torrc option and a GuardLifetime consensus
-      parameter. Start of a fix for bug 8240; bugfix on 0.1.1.11-alpha.
-    - Directory authorities now prefer using measured bandwidths to
-      advertised ones when computing flags and thresholds. Resolves
-      ticket 8273.
-    - Directory authorities that have more than a threshold number
-      of relays with measured bandwidths now treat relays with unmeasured
-      bandwidths as having bandwidth 0. Resolves ticket 8435.
-
-  o Major bugfixes (assert / resource use):
-    - Avoid a bug where our response to TLS renegotiation under certain
-      network conditions could lead to a busy-loop, with 100% CPU
-      consumption. Fixes bug 5650; bugfix on 0.2.0.16-alpha.
-    - Avoid an assertion when we discover that we'd like to write a cell
-      onto a closing connection: just discard the cell. Fixes another
-      case of bug 7350; bugfix on 0.2.4.4-alpha.
-
-  o Major bugfixes (client-side privacy):
-    - When we mark a circuit as unusable for new circuits, have it
-      continue to be unusable for new circuits even if MaxCircuitDirtiness
-      is increased too much at the wrong time, or the system clock jumps
-      backwards. Fixes bug 6174; bugfix on 0.0.2pre26.
-    - If ClientDNSRejectInternalAddresses ("do not believe DNS queries
-      which have resolved to internal addresses") is set, apply that
-      rule to IPv6 as well. Fixes bug 8475; bugfix on 0.2.0.7-alpha.
-    - When an exit relay rejects a stream with reason "exit policy", but
-      we only know an exit policy summary (e.g. from the microdesc
-      consensus) for it, do not mark the relay as useless for all exiting.
-      Instead, mark just the circuit as unsuitable for that particular
-      address. Fixes part of bug 7582; bugfix on 0.2.3.2-alpha.
-    - Allow applications to get proper stream isolation with
-      IsolateSOCKSAuth. Many SOCKS5 clients that want to offer
-      username/password authentication also offer "no authentication". Tor
-      had previously preferred "no authentication", so the applications
-      never actually sent Tor their auth details. Now Tor selects
-      username/password authentication if it's offered. You can disable
-      this behavior on a per-SOCKSPort basis via PreferSOCKSNoAuth. Fixes
-      bug 8117; bugfix on 0.2.3.3-alpha.
-
-  o Major bugfixes (other):
-    - When unable to find any working directory nodes to use as a
-      directory guard, give up rather than adding the same non-working
-      nodes to the directory guard list over and over. Fixes bug 8231;
-      bugfix on 0.2.4.8-alpha.
-
-  o Minor features:
-    - Reject as invalid most directory objects containing a NUL.
-      Belt-and-suspender fix for bug 8037.
-    - In our testsuite, create temporary directories with a bit more
-      entropy in their name to make name collisions less likely. Fixes
-      bug 8638.
-    - Add CACHED keyword to ADDRMAP events in the control protocol
-      to indicate whether a DNS result will be cached or not. Resolves
-      ticket 8596.
-    - Update to the April 3 2013 Maxmind GeoLite Country database.
-
-  o Minor features (build):
-    - Detect and reject attempts to build Tor with threading support
-      when OpenSSL has been compiled without threading support.
-      Fixes bug 6673.
-    - Clarify that when autoconf is checking for nacl, it is checking
-      specifically for nacl with a fast curve25519 implementation.
-      Fixes bug 8014.
-    - Warn if building on a platform with an unsigned time_t: there
-      are too many places where Tor currently assumes that time_t can
-      hold negative values. We'd like to fix them all, but probably
-      some will remain.
-
-  o Minor bugfixes (build):
-    - Fix some bugs in tor-fw-helper-natpmp when trying to build and
-      run it on Windows. More bugs likely remain. Patch from Gisle Vanem.
-      Fixes bug 7280; bugfix on 0.2.3.1-alpha.
-    - Add the old src/or/micro-revision.i filename to CLEANFILES.
-      On the off chance that somebody has one, it will go away as soon
-      as they run "make clean". Fix for bug 7143; bugfix on 0.2.4.1-alpha.
-    - Build Tor correctly on 32-bit platforms where the compiler can build
-      but not run code using the "uint128_t" construction. Fixes bug 8587;
-      bugfix on 0.2.4.8-alpha.
-    - Fix compilation warning with some versions of clang that would
-      prefer the -Wswitch-enum compiler flag to warn about switch
-      statements with missing enum values, even if those switch
-      statements have a "default:" statement. Fixes bug 8598; bugfix
-      on 0.2.4.10-alpha.
-
-  o Minor bugfixes (protocol):
-    - Fix the handling of a TRUNCATE cell when it arrives while the
-      circuit extension is in progress. Fixes bug 7947; bugfix on 0.0.7.1.
-    - Fix a misframing issue when reading the version numbers in a
-      VERSIONS cell. Previously we would recognize [00 01 00 02] as
-      'version 1, version 2, and version 0x100', when it should have
-      only included versions 1 and 2. Fixes bug 8059; bugfix on
-      0.2.0.10-alpha. Reported pseudonymously.
-    - Make the format and order of STREAM events for DNS lookups
-      consistent among the various ways to launch DNS lookups. Fixes
-      bug 8203; bugfix on 0.2.0.24-rc. Patch by "Desoxy."
-    - Correct our check for which versions of Tor support the EXTEND2
-      cell. We had been willing to send it to Tor 0.2.4.7-alpha and
-      later, when support was really added in version 0.2.4.8-alpha.
-      Fixes bug 8464; bugfix on 0.2.4.8-alpha.
-
-  o Minor bugfixes (other):
-    - Correctly store microdescriptors and extrainfo descriptors with
-      an internal NUL byte. Fixes bug 8037; bugfix on 0.2.0.1-alpha.
-      Bug reported by "cypherpunks".
-    - Increase the width of the field used to remember a connection's
-      link protocol version to two bytes. Harmless for now, since the
-      only currently recognized versions are one byte long. Reported
-      pseudonymously. Fixes bug 8062; bugfix on 0.2.0.10-alpha.
-    - If the state file's path bias counts are invalid (presumably from a
-      buggy Tor prior to 0.2.4.10-alpha), make them correct. Also add
-      additional checks and log messages to the scaling of Path Bias
-      counts, in case there still are remaining issues with scaling.
-      Should help resolve bug 8235.
-    - Eliminate several instances where we use "Nickname=ID" to refer to
-      nodes in logs. Use "Nickname (ID)" instead. (Elsewhere, we still use
-      "$ID=Nickname", which is also acceptable.) Fixes bug 7065. Bugfix
-      on 0.2.3.21-rc, 0.2.4.5-alpha, 0.2.4.8-alpha, and 0.2.4.10-alpha.
-
-  o Minor bugfixes (syscalls):
-    - Always check the return values of functions fcntl() and
-      setsockopt(). We don't believe these are ever actually failing in
-      practice, but better safe than sorry. Also, checking these return
-      values should please analysis tools like Coverity. Patch from
-      'flupzor'. Fixes bug 8206; bugfix on all versions of Tor.
-    - Use direct writes rather than stdio when building microdescriptor
-      caches, in an attempt to mitigate bug 8031, or at least make it
-      less common.
-
-  o Minor bugfixes (config):
-    - When rejecting a configuration because we were unable to parse a
-      quoted string, log an actual error message. Fixes bug 7950; bugfix
-      on 0.2.0.16-alpha.
-    - Behave correctly when the user disables LearnCircuitBuildTimeout
-      but doesn't tell us what they would like the timeout to be. Fixes
-      bug 6304; bugfix on 0.2.2.14-alpha.
-    - When autodetecting the number of CPUs, use the number of available
-      CPUs in preference to the number of configured CPUs. Inform the
-      user if this reduces the number of available CPUs. Fixes bug 8002;
-      bugfix on 0.2.3.1-alpha.
-    - Make it an error when you set EntryNodes but disable UseGuardNodes,
-      since it will (surprisingly to some users) ignore EntryNodes. Fixes
-      bug 8180; bugfix on 0.2.3.11-alpha.
-    - Allow TestingTorNetworks to override the 4096-byte minimum for
-      the Fast threshold. Otherwise they can't bootstrap until they've
-      observed more traffic. Fixes bug 8508; bugfix on 0.2.4.10-alpha.
-    - Fix some logic errors when the user manually overrides the
-      PathsNeededToBuildCircuits option in torrc. Fixes bug 8599; bugfix
-      on 0.2.4.10-alpha.
-
-  o Minor bugfixes (log messages to help diagnose bugs):
-    - If we fail to free a microdescriptor because of bug 7164, log
-      the filename and line number from which we tried to free it.
-    - Add another diagnostic to the heartbeat message: track and log
-      overhead that TLS is adding to the data we write. If this is
-      high, we are sending too little data to SSL_write at a time.
-      Diagnostic for bug 7707.
-    - Add more detail to a log message about relaxed timeouts, to help
-      track bug 7799.
-    - Warn more aggressively when flushing microdescriptors to a
-      microdescriptor cache fails, in an attempt to mitigate bug 8031,
-      or at least make it more diagnosable.
-    - Improve debugging output to help track down bug 8185 ("Bug:
-      outgoing relay cell has n_chan==NULL. Dropping.")
-    - Log the purpose of a path-bias testing circuit correctly.
-      Improves a log message from bug 8477; bugfix on 0.2.4.8-alpha.
-
-  o Minor bugfixes (0.2.4.x log messages that were too noisy):
-    - Don't attempt to relax the timeout of already opened 1-hop circuits.
-      They might never timeout. This should eliminate some/all cases of
-      the relaxed timeout log message.
-    - Use circuit creation time for network liveness evaluation. This
-      should eliminate warning log messages about liveness caused
-      by changes in timeout evaluation. Fixes bug 6572; bugfix on
-      0.2.4.8-alpha.
-    - Reduce a path bias length check from notice to info. The message
-      is triggered when creating controller circuits. Fixes bug 8196;
-      bugfix on 0.2.4.8-alpha.
-    - Fix a path state issue that triggered a notice during relay startup.
-      Fixes bug 8320; bugfix on 0.2.4.10-alpha.
-    - Reduce occurrences of warns about circuit purpose in
-      connection_ap_expire_building(). Fixes bug 8477; bugfix on
-      0.2.4.11-alpha.
-
-  o Minor bugfixes (pre-0.2.4.x log messages that were too noisy):
-    - If we encounter a write failure on a SOCKS connection before we
-      finish our SOCKS handshake, don't warn that we closed the
-      connection before we could send a SOCKS reply. Fixes bug 8427;
-      bugfix on 0.1.0.1-rc.
-    - Correctly recognize that [::1] is a loopback address. Fixes
-      bug 8377; bugfix on 0.2.1.3-alpha.
-    - Fix a directory authority warn caused when we have a large amount
-      of badexit bandwidth. Fixes bug 8419; bugfix on 0.2.2.10-alpha.
-    - Don't log inappropriate heartbeat messages when hibernating: a
-      hibernating node is _expected_ to drop out of the consensus,
-      decide it isn't bootstrapped, and so forth. Fixes bug 7302;
-      bugfix on 0.2.3.1-alpha.
-    - Don't complain about bootstrapping problems while hibernating.
-      These complaints reflect a general code problem, but not one
-      with any problematic effects (no connections are actually
-      opened). Fixes part of bug 7302; bugfix on 0.2.3.2-alpha.
-
-  o Documentation fixes:
-    - Update tor-fw-helper.1.txt and tor-fw-helper.c to make option
-      names match. Fixes bug 7768.
-    - Make the torify manpage no longer refer to tsocks; torify hasn't
-      supported tsocks since 0.2.3.14-alpha.
-    - Make the tor manpage no longer reference tsocks.
-    - Fix the GeoIPExcludeUnknown documentation to refer to
-      ExcludeExitNodes rather than the currently nonexistent
-      ExcludeEntryNodes. Spotted by "hamahangi" on tor-talk.
-
-  o Removed files:
-    - The tor-tsocks.conf is no longer distributed or installed. We
-      recommend that tsocks users use torsocks instead. Resolves
-      ticket 8290.
-
-
-Changes in version 0.2.4.11-alpha - 2013-03-11
-  Tor 0.2.4.11-alpha makes relay measurement by directory authorities
-  more robust, makes hidden service authentication work again, and
-  resolves a DPI fingerprint for Tor's SSL transport.
-
-  o Major features (directory authorities):
-    - Directory authorities now support a new consensus method (17)
-      where they cap the published bandwidth of servers for which
-      insufficient bandwidth measurements exist. Fixes part of bug 2286.
-    - Directory authorities that set "DisableV2DirectoryInfo_ 1" no longer
-      serve any v2 directory information. Now we can test disabling the
-      old deprecated v2 directory format, and see whether doing so has
-      any effect on network load. Begins to fix bug 6783.
-    - Directory authorities now include inside each vote a statement of
-      the performance thresholds they used when assigning flags.
-      Implements ticket 8151.
-
-  o Major bugfixes (directory authorities):
-    - Stop marking every relay as having been down for one hour every
-      time we restart a directory authority. These artificial downtimes
-      were messing with our Stable and Guard flag calculations. Fixes
-      bug 8218 (introduced by the fix for 1035). Bugfix on 0.2.2.23-alpha.
-
-  o Major bugfixes (hidden services):
-    - Allow hidden service authentication to succeed again. When we
-      refactored the hidden service introduction code back
-      in 0.2.4.1-alpha, we didn't update the code that checks
-      whether authentication information is present, causing all
-      authentication checks to return "false". Fix for bug 8207; bugfix
-      on 0.2.4.1-alpha. Found by Coverity; this is CID 718615.
-
-  o Minor features (relays, bridges):
-    - Make bridge relays check once a minute for whether their IP
-      address has changed, rather than only every 15 minutes. Resolves
-      bugs 1913 and 1992.
-    - Refactor resolve_my_address() so it returns the method by which we
-      decided our public IP address (explicitly configured, resolved from
-      explicit hostname, guessed from interfaces, learned by gethostname).
-      Now we can provide more helpful log messages when a relay guesses
-      its IP address incorrectly (e.g. due to unexpected lines in
-      /etc/hosts). Resolves ticket 2267.
-    - Teach bridge-using clients to avoid 0.2.2 bridges when making
-      microdescriptor-related dir requests, and only fall back to normal
-      descriptors if none of their bridges can handle microdescriptors
-      (as opposed to the fix in ticket 4013, which caused them to fall
-      back to normal descriptors if *any* of their bridges preferred
-      them). Resolves ticket 4994.
-    - Randomize the lifetime of our SSL link certificate, so censors can't
-      use the static value for filtering Tor flows. Resolves ticket 8443;
-      related to ticket 4014 which was included in 0.2.2.33.
-    - Support a new version of the link protocol that allows 4-byte circuit
-      IDs. Previously, circuit IDs were limited to 2 bytes, which presented
-      a possible resource exhaustion issue. Closes ticket 7351; implements
-      proposal 214.
-
-  o Minor features (portability):
-    - Tweak the curve25519-donna*.c implementations to tolerate systems
-      that lack stdint.h. Fixes bug 3894; bugfix on 0.2.4.8-alpha.
-    - Use Ville Laurikari's implementation of AX_CHECK_SIGN() to determine
-      the signs of types during autoconf. This is better than our old
-      approach, which didn't work when cross-compiling.
-    - Detect the sign of enum values, rather than assuming that MSC is the
-      only compiler where enum types are all signed. Fixes bug 7727;
-      bugfix on 0.2.4.10-alpha.
-
-  o Minor features (other):
-    - Say "KBytes" rather than "KB" in the man page (for various values
-      of K), to further reduce confusion about whether Tor counts in
-      units of memory or fractions of units of memory. Resolves ticket 7054.
-    - Clear the high bit on curve25519 public keys before passing them to
-      our backend, in case we ever wind up using a backend that doesn't do
-      so itself. If we used such a backend, and *didn't* clear the high bit,
-      we could wind up in a situation where users with such backends would
-      be distinguishable from users without. Fixes bug 8121; bugfix on
-      0.2.4.8-alpha.
-    - Update to the March 6 2013 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (clients):
-    - When we receive a RELAY_END cell with the reason DONE, or with no
-      reason, before receiving a RELAY_CONNECTED cell, report the SOCKS
-      status as "connection refused". Previously we reported these cases
-      as success but then immediately closed the connection. Fixes bug
-      7902; bugfix on 0.1.0.1-rc. Reported by "oftc_must_be_destroyed".
-    - Downgrade an assertion in connection_ap_expire_beginning to an
-      LD_BUG message. The fix for bug 8024 should prevent this message
-      from displaying, but just in case, a warn that we can diagnose
-      is better than more assert crashes. Fixes bug 8065; bugfix on
-      0.2.4.8-alpha.
-    - Lower path use bias thresholds to .80 for notice and .60 for warn.
-      Also make the rate limiting flags for the path use bias log messages
-      independent from the original path bias flags. Fixes bug 8161;
-      bugfix on 0.2.4.10-alpha.
-
-  o Minor bugfixes (relays):
-    - Stop trying to resolve our hostname so often (e.g. every time we
-      think about doing a directory fetch). Now we reuse the cached
-      answer in some cases. Fixes bugs 1992 (bugfix on 0.2.0.20-rc)
-      and 2410 (bugfix on 0.1.2.2-alpha).
-    - Stop sending a stray "(null)" in some cases for the server status
-      "EXTERNAL_ADDRESS" controller event. Resolves bug 8200; bugfix
-      on 0.1.2.6-alpha.
-    - When choosing which stream on a formerly stalled circuit to wake
-      first, make better use of the platform's weak RNG. Previously,
-      we had been using the % ("modulo") operator to try to generate a
-      1/N chance of picking each stream, but this behaves badly with
-      many platforms' choice of weak RNG. Fixes bug 7801; bugfix on
-      0.2.2.20-alpha.
-    - Use our own weak RNG when we need a weak RNG. Windows's rand() and
-      Irix's random() only return 15 bits; Solaris's random() returns more
-      bits but its RAND_MAX says it only returns 15, and so on. Motivated
-      by the fix for bug 7801; bugfix on 0.2.2.20-alpha.
-
-  o Minor bugfixes (directory authorities):
-    - Directory authorities now use less space when formatting identical
-      microdescriptor lines in directory votes. Fixes bug 8158; bugfix
-      on 0.2.4.1-alpha.
-
-  o Minor bugfixes (memory leaks spotted by Coverity -- bug 7816):
-    - Avoid leaking memory if we fail to compute a consensus signature
-      or we generate a consensus we can't parse. Bugfix on 0.2.0.5-alpha.
-    - Fix a memory leak when receiving headers from an HTTPS proxy. Bugfix
-      on 0.2.1.1-alpha.
-    - Fix a memory leak during safe-cookie controller authentication.
-      Bugfix on 0.2.3.13-alpha.
-    - Avoid memory leak of IPv6 policy content if we fail to format it into
-      a router descriptor. Bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (other code correctness issues):
-    - Avoid a crash if we fail to generate an extrainfo descriptor.
-      Fixes bug 8208; bugfix on 0.2.3.16-alpha. Found by Coverity;
-      this is CID 718634.
-    - When detecting the largest possible file descriptor (in order to
-      close all file descriptors when launching a new program), actually
-      use _SC_OPEN_MAX. The old code for doing this was very, very broken.
-      Fixes bug 8209; bugfix on 0.2.3.1-alpha. Found by Coverity; this
-      is CID 743383.
-    - Fix a copy-and-paste error when adding a missing A1 to a routerset
-      because of GeoIPExcludeUnknown. Fix for Coverity CID 980650.
-      Bugfix on 0.2.4.10-alpha.
-    - Fix an impossible-to-trigger integer overflow when estimating how
-      long our onionskin queue would take. (This overflow would require us
-      to accept 4 million onionskins before processing 100 of them.) Fixes
-      bug 8210; bugfix on 0.2.4.10-alpha.
-
-  o Code simplification and refactoring:
-    - Add a wrapper function for the common "log a message with a
-      rate-limit" case.
-
-
-Changes in version 0.2.4.10-alpha - 2013-02-04
-  Tor 0.2.4.10-alpha adds defenses at the directory authority level from
-  certain attacks that flood the network with relays; changes the queue
-  for circuit create requests from a sized-based limit to a time-based
-  limit; resumes building with MSVC on Windows; and fixes a wide variety
-  of other issues.
-
-  o Major bugfixes (directory authority):
-    - When computing directory thresholds, ignore any rejected-as-sybil
-      nodes during the computation so that they can't influence Fast,
-      Guard, etc. (We should have done this for proposal 109.) Fixes
-      bug 8146.
-    - When marking a node as a likely sybil, reset its uptime metrics
-      to zero, so that it cannot time towards getting marked as Guard,
-      Stable, or HSDir. (We should have done this for proposal 109.) Fixes
-      bug 8147.
-
-  o Major bugfixes:
-    - When a TLS write is partially successful but incomplete, remember
-      that the flushed part has been flushed, and notice that bytes were
-      actually written. Reported and fixed pseudonymously. Fixes bug
-      7708; bugfix on Tor 0.1.0.5-rc.
-    - Reject bogus create and relay cells with 0 circuit ID or 0 stream
-      ID: these could be used to create unexpected streams and circuits
-      which would count as "present" to some parts of Tor but "absent"
-      to others, leading to zombie circuits and streams or to a bandwidth
-      denial-of-service. Fixes bug 7889; bugfix on every released version
-      of Tor. Reported by "oftc_must_be_destroyed".
-    - Rename all macros in our local copy of queue.h to begin with "TOR_".
-      This change seems the only good way to permanently prevent conflicts
-      with queue.h on various operating systems. Fixes bug 8107; bugfix
-      on 0.2.4.6-alpha.
-
-  o Major features (relay):
-    - Instead of limiting the number of queued onionskins (aka circuit
-      create requests) to a fixed, hard-to-configure number, we limit
-      the size of the queue based on how many we expect to be able to
-      process in a given amount of time. We estimate the time it will
-      take to process an onionskin based on average processing time
-      of previous onionskins. Closes ticket 7291. You'll never have to
-      configure MaxOnionsPending again.
-
-  o Major features (portability):
-    - Resume building correctly with MSVC and Makefile.nmake. This patch
-      resolves numerous bugs and fixes reported by ultramage, including
-      7305, 7308, 7309, 7310, 7312, 7313, 7315, 7316, and 7669.
-    - Make the ntor and curve25519 code build correctly with MSVC.
-      Fix on 0.2.4.8-alpha.
-
-  o Minor features:
-    - When directory authorities are computing thresholds for flags,
-      never let the threshold for the Fast flag fall below 4096
-      bytes. Also, do not consider nodes with extremely low bandwidths
-      when deciding thresholds for various directory flags. This change
-      should raise our threshold for Fast relays, possibly in turn
-      improving overall network performance; see ticket 1854. Resolves
-      ticket 8145.
-    - The Tor client now ignores sub-domain components of a .onion
-      address. This change makes HTTP "virtual" hosting
-      possible: http://foo.aaaaaaaaaaaaaaaa.onion/ and
-      http://bar.aaaaaaaaaaaaaaaa.onion/ can be two different websites
-      hosted on the same hidden service. Implements proposal 204.
-    - We compute the overhead from passing onionskins back and forth to
-      cpuworkers, and report it when dumping statistics in response to
-      SIGUSR1. Supports ticket 7291.
-
-  o Minor features (path selection):
-    - When deciding whether we have enough descriptors to build circuits,
-      instead of looking at raw relay counts, look at which fraction
-      of (bandwidth-weighted) paths we're able to build. This approach
-      keeps clients from building circuits if their paths are likely to
-      stand out statistically. The default fraction of paths needed is
-      taken from the consensus directory; you can override it with the
-      new PathsNeededToBuildCircuits option. Fixes ticket 5956.
-    - When any country code is listed in ExcludeNodes or ExcludeExitNodes,
-      and we have GeoIP information, also exclude all nodes with unknown
-      countries "??" and "A1". This behavior is controlled by the
-      new GeoIPExcludeUnknown option: you can make such nodes always
-      excluded with "GeoIPExcludeUnknown 1", and disable the feature
-      with "GeoIPExcludeUnknown 0". Setting "GeoIPExcludeUnknown auto"
-      gets you the default behavior. Implements feature 7706.
-    - Path Use Bias: Perform separate accounting for successful circuit
-      use. Keep separate statistics on stream attempt rates versus stream
-      success rates for each guard. Provide configurable thresholds to
-      determine when to emit log messages or disable use of guards that
-      fail too many stream attempts. Resolves ticket 7802.
-
-  o Minor features (log messages):
-    - When learning a fingerprint for a bridge, log its corresponding
-      transport type. Implements ticket 7896.
-    - Improve the log message when "Bug/attack: unexpected sendme cell
-      from client" occurs, to help us track bug 8093.
-
-  o Minor bugfixes:
-    - Remove a couple of extraneous semicolons that were upsetting the
-      cparser library. Patch by Christian Grothoff. Fixes bug 7115;
-      bugfix on 0.2.2.1-alpha.
-    - Remove a source of rounding error during path bias count scaling;
-      don't count cannibalized circuits as used for path bias until we
-      actually try to use them; and fix a circuit_package_relay_cell()
-      warning message about n_chan==NULL. Fixes bug 7802.
-    - Detect nacl when its headers are in a nacl/ subdirectory. Also,
-      actually link against nacl when we're configured to use it. Fixes
-      bug 7972; bugfix on 0.2.4.8-alpha.
-    - Compile correctly with the --disable-curve25519 option. Fixes
-      bug 8153; bugfix on 0.2.4.8-alpha.
-
-  o Build improvements:
-    - Do not report status verbosely from autogen.sh unless the -v flag
-      is specified. Fixes issue 4664. Patch from Onizuka.
-    - Replace all calls to snprintf() outside of src/ext with
-      tor_snprintf(). Also remove the #define to replace snprintf with
-      _snprintf on Windows; they have different semantics, and all of
-      our callers should be using tor_snprintf() anyway. Fixes bug 7304.
-    - Try to detect if we are ever building on a platform where
-      memset(...,0,...) does not set the value of a double to 0.0. Such
-      platforms are permitted by the C standard, though in practice
-      they're pretty rare (since IEEE 754 is nigh-ubiquitous). We don't
-      currently support them, but it's better to detect them and fail
-      than to perform erroneously.
-
-  o Removed features:
-    - Stop exporting estimates of v2 and v3 directory traffic shares
-      in extrainfo documents. They were unneeded and sometimes inaccurate.
-      Also stop exporting any v2 directory request statistics. Resolves
-      ticket 5823.
-    - Drop support for detecting and warning about versions of Libevent
-      before 1.3e. Nothing reasonable ships with them any longer;
-      warning the user about them shouldn't be needed. Resolves ticket
-      6826.
-
-  o Code simplifications and refactoring:
-    - Rename "isin" functions to "contains", for grammar. Resolves
-      ticket 5285.
-    - Rename Tor's logging function log() to tor_log(), to avoid conflicts
-      with the natural logarithm function from the system libm. Resolves
-      ticket 7599.
-
-
-Changes in version 0.2.4.9-alpha - 2013-01-15
-  Tor 0.2.4.9-alpha provides a quick fix to make the new ntor handshake
-  work more robustly.
-
-  o Major bugfixes:
-    - Fix backward compatibility logic when receiving an embedded ntor
-      handshake tunneled in a CREATE cell. This clears up the "Bug:
-      couldn't format CREATED cell" warning. Fixes bug 7959; bugfix
-      on 0.2.4.8-alpha.
-
-
-Changes in version 0.2.4.8-alpha - 2013-01-14
-  Tor 0.2.4.8-alpha introduces directory guards to reduce user enumeration
-  risks, adds a new stronger and faster circuit handshake, and offers
-  stronger and faster link encryption when both sides support it.
-
-  o Major features:
-    - Preliminary support for directory guards (proposal 207): when
-      possible, clients now use their entry guards for non-anonymous
-      directory requests. This can help prevent client enumeration. Note
-      that this behavior only works when we have a usable consensus
-      directory, and when options about what to download are more or less
-      standard. In the future we should re-bootstrap from our guards,
-      rather than re-bootstrapping from the preconfigured list of
-      directory sources that ships with Tor. Resolves ticket 6526.
-    - Tor relays and clients now support a better CREATE/EXTEND cell
-      format, allowing the sender to specify multiple address, identity,
-      and handshake types. Implements Robert Ransom's proposal 200;
-      closes ticket 7199.
-
-  o Major features (new circuit handshake):
-    - Tor now supports a new circuit extension handshake designed by Ian
-      Goldberg, Douglas Stebila, and Berkant Ustaoglu. Our original
-      circuit extension handshake, later called "TAP", was a bit slow
-      (especially on the relay side), had a fragile security proof, and
-      used weaker keys than we'd now prefer. The new circuit handshake
-      uses Dan Bernstein's "curve25519" elliptic-curve Diffie-Hellman
-      function, making it significantly more secure than the older
-      handshake, and significantly faster. Tor can use one of two built-in
-      pure-C curve25519-donna implementations by Adam Langley, or it
-      can link against the "nacl" library for a tuned version if present.
-
-      The built-in version is very fast for 64-bit systems when building
-      with GCC. The built-in 32-bit version is still faster than the
-      old TAP protocol, but using libnacl is better on most such hosts.
-
-      Clients don't currently use this protocol by default, since
-      comparatively few clients support it so far. To try it, set
-      UseNTorHandshake to 1.
-
-      Implements proposal 216; closes ticket 7202.
-
-  o Major features (better link encryption):
-    - Relays can now enable the ECDHE TLS ciphersuites when available
-      and appropriate. These ciphersuites let us negotiate forward-secure
-      TLS secret keys more safely and more efficiently than with our
-      previous use of Diffie-Hellman modulo a 1024-bit prime. By default,
-      public relays prefer the (faster) P224 group, and bridges prefer
-      the (more common) P256 group; you can override this with the
-      TLSECGroup option.
-
-      Enabling these ciphers was a little tricky, since for a long time,
-      clients had been claiming to support them without actually doing
-      so, in order to foil fingerprinting. But with the client-side
-      implementation of proposal 198 in 0.2.3.17-beta, clients can now
-      match the ciphers from recent Firefox versions *and* list the
-      ciphers they actually mean, so relays can believe such clients
-      when they advertise ECDHE support in their TLS ClientHello messages.
-
-      This feature requires clients running 0.2.3.17-beta or later,
-      and requires both sides to be running OpenSSL 1.0.0 or later
-      with ECC support. OpenSSL 1.0.1, with the compile-time option
-      "enable-ec_nistp_64_gcc_128", is highly recommended.
-
-      Implements the relay side of proposal 198; closes ticket 7200.
-
-  o Major bugfixes:
-    - Avoid crashing when, as a relay without IPv6-exit support, a
-      client insists on getting an IPv6 address or nothing. Fixes bug
-      7814; bugfix on 0.2.4.7-alpha.
-
-  o Minor features:
-    - Improve circuit build timeout handling for hidden services.
-      In particular: adjust build timeouts more accurately depending
-      upon the number of hop-RTTs that a particular circuit type
-      undergoes. Additionally, launch intro circuits in parallel
-      if they timeout, and take the first one to reply as valid.
-    - Work correctly on Unix systems where EAGAIN and EWOULDBLOCK are
-      separate error codes; or at least, don't break for that reason.
-      Fixes bug 7935. Reported by "oftc_must_be_destroyed".
-    - Update to the January 2 2013 Maxmind GeoLite Country database.
-
-  o Minor features (testing):
-    - Add benchmarks for DH (1024-bit multiplicative group) and ECDH
-      (P-256) Diffie-Hellman handshakes to src/or/bench.
-    - Add benchmark functions to test onion handshake performance.
-
-  o Minor features (path bias detection):
-    - Alter the Path Bias log messages to be more descriptive in terms
-      of reporting timeouts and other statistics.
-    - Create three levels of Path Bias log messages, as opposed to just
-      two. These are configurable via consensus as well as via the torrc
-      options PathBiasNoticeRate, PathBiasWarnRate, PathBiasExtremeRate.
-      The default values are 0.70, 0.50, and 0.30 respectively.
-    - Separate the log message levels from the decision to drop guards,
-      which also is available via torrc option PathBiasDropGuards.
-      PathBiasDropGuards still defaults to 0 (off).
-    - Deprecate PathBiasDisableRate in favor of PathBiasDropGuards
-      in combination with PathBiasExtremeRate.
-    - Increase the default values for PathBiasScaleThreshold and
-      PathBiasCircThreshold from (200, 20) to (300, 150).
-    - Add in circuit usage accounting to path bias. If we try to use a
-      built circuit but fail for any reason, it counts as path bias.
-      Certain classes of circuits where the adversary gets to pick your
-      destination node are exempt from this accounting. Usage accounting
-      can be specifically disabled via consensus parameter or torrc.
-    - Convert all internal path bias state to double-precision floating
-      point, to avoid roundoff error and other issues.
-    - Only record path bias information for circuits that have completed
-      *two* hops. Assuming end-to-end tagging is the attack vector, this
-      makes us more resilient to ambient circuit failure without any
-      detection capability loss.
-
-  o Minor bugfixes (log messages):
-    - Rate-limit the "No circuits are opened. Relaxed timeout for a
-      circuit with channel state open..." message to once per hour to
-      keep it from filling the notice logs. Mitigates bug 7799 but does
-      not fix the underlying cause. Bugfix on 0.2.4.7-alpha.
-    - Avoid spurious warnings when configuring multiple client ports of
-      which only some are nonlocal. Previously, we had claimed that some
-      were nonlocal when in fact they weren't. Fixes bug 7836; bugfix on
-      0.2.3.3-alpha.
-
-  o Code simplifications and refactoring:
-    - Get rid of a couple of harmless clang warnings, where we compared
-      enums to ints. These warnings are newly introduced in clang 3.2.
-    - Split the onion.c file into separate modules for the onion queue
-      and the different handshakes it supports.
-    - Remove the marshalling/unmarshalling code for sending requests to
-      cpuworkers over a socket, and instead just send structs. The
-      recipient will always be the same Tor binary as the sender, so
-      any encoding is overkill.
-
-
-Changes in version 0.2.4.7-alpha - 2012-12-24
-  Tor 0.2.4.7-alpha introduces a new approach to providing fallback
-  directory mirrors for more robust bootstrapping; fixes more issues where
-  clients with changing network conditions refuse to make any circuits;
-  adds initial support for exiting to IPv6 addresses; resumes being able
-  to update our GeoIP database, and includes the geoip6 file this time;
-  turns off the client-side DNS cache by default due to privacy risks;
-  and fixes a variety of other issues.
-
-  o Major features (client resilience):
-    - Add a new "FallbackDir" torrc option to use when we can't use
-      a directory mirror from the consensus (either because we lack a
-      consensus, or because they're all down). Currently, all authorities
-      are fallbacks by default, and there are no other default fallbacks,
-      but that will change. This option will allow us to give clients a
-      longer list of servers to try to get a consensus from when first
-      connecting to the Tor network, and thereby reduce load on the
-      directory authorities. Implements proposal 206, "Preconfigured
-      directory sources for bootstrapping". We also removed the old
-      "FallbackNetworkstatus" option, since we never got it working well
-      enough to use it. Closes bug 572.
-    - If we have no circuits open, use a relaxed timeout (the
-      95-percentile cutoff) until a circuit succeeds. This heuristic
-      should allow Tor to succeed at building circuits even when the
-      network connection drastically changes. Should help with bug 3443.
-
-  o Major features (IPv6):
-    - Relays can now exit to IPv6 addresses: make sure that you have IPv6
-      connectivity, then set the IPv6Exit flag to 1. Also make sure your
-      exit policy reads as you would like: the address * applies to all
-      address families, whereas *4 is IPv4 address only, and *6 is IPv6
-      addresses only. On the client side, you'll need to wait until the
-      authorities have upgraded, wait for enough exits to support IPv6,
-      apply the "IPv6Traffic" flag to a SocksPort, and use Socks5. Closes
-      ticket 5547, implements proposal 117 as revised in proposal 208.
-
-      We DO NOT recommend that clients with actual anonymity needs start
-      using IPv6 over Tor yet, since not enough exits support it yet.
-
-  o Major features (geoip database):
-    - Maxmind began labelling Tor relays as being in country "A1",
-      which breaks by-country node selection inside Tor. Now we use a
-      script to replace "A1" ("Anonymous Proxy") entries in our geoip
-      file with real country codes. This script fixes about 90% of "A1"
-      entries automatically and uses manual country code assignments to
-      fix the remaining 10%. See src/config/README.geoip for details.
-      Fixes bug 6266. Also update to the December 5 2012 Maxmind GeoLite
-      Country database, as modified above.
-
-  o Major bugfixes (client-side DNS):
-    - Turn off the client-side DNS cache by default. Updating and using
-      the DNS cache is now configurable on a per-client-port
-      level. SOCKSPort, DNSPort, etc lines may now contain
-      {No,}Cache{IPv4,IPv6,}DNS lines to indicate that we shouldn't
-      cache these types of DNS answers when we receive them from an
-      exit node in response to an application request on this port, and
-      {No,}UseCached{IPv4,IPv6,DNS} lines to indicate that if we have
-      cached DNS answers of these types, we shouldn't use them. It's
-      potentially risky to use cached DNS answers at the client, since
-      doing so can indicate to one exit what answers we've gotten
-      for DNS lookups in the past. With IPv6, this becomes especially
-      problematic. Using cached DNS answers for requests on the same
-      circuit would present less linkability risk, since all traffic
-      on a circuit is already linkable, but it would also provide
-      little performance benefit: the exit node caches DNS replies
-      too. Implements a simplified version of Proposal 205. Implements
-      ticket 7570.
-
-  o Major bugfixes (other):
-    - Alter circuit build timeout measurement to start at the point
-      where we begin the CREATE/CREATE_FAST step (as opposed to circuit
-      initialization). This should make our timeout measurements more
-      uniform. Previously, we were sometimes including ORconn setup time
-      in our circuit build time measurements. Should resolve bug 3443.
-    - Fix an assertion that could trigger in hibernate_go_dormant() when
-      closing an or_connection_t: call channel_mark_for_close() rather
-      than connection_mark_for_close(). Fixes bug 7267. Bugfix on
-      0.2.4.4-alpha.
-    - Include the geoip6 IPv6 GeoIP database in the tarball. Fixes bug
-      7655; bugfix on 0.2.4.6-alpha.
-
-  o Minor features:
-    - Add a new torrc option "ServerTransportListenAddr" to let bridge
-      operators select the address where their pluggable transports will
-      listen for connections. Resolves ticket 7013.
-    - Allow an optional $ before the node identity digest in the
-      controller command GETINFO ns/id/, for consistency with
-      md/id/ and desc/id/. Resolves ticket 7059.
-    - Log packaged cell fullness as part of the heartbeat message.
-      Diagnosis to try to determine the extent of bug 7743.
-
-  o Minor features (IPv6):
-    - AutomapHostsOnResolve now supports IPv6 addresses. By default, we
-      prefer to hand out virtual IPv6 addresses, since there are more of
-      them and we can't run out. To override this behavior and make IPv4
-      addresses preferred, set NoPreferIPv6Automap on whatever SOCKSPort
-      or DNSPort you're using for resolving. Implements ticket 7571.
-    - AutomapHostsOnResolve responses are now randomized, to avoid
-      annoying situations where Tor is restarted and applications
-      connect to the wrong addresses.
-    - Never try more than 1000 times to pick a new virtual address when
-      AutomapHostsOnResolve is set. That's good enough so long as we
-      aren't close to handing out our entire virtual address space;
-      if you're getting there, it's best to switch to IPv6 virtual
-      addresses anyway.
-
-  o Minor bugfixes:
-    - The ADDRMAP command can no longer generate an ill-formed error
-      code on a failed MAPADDRESS. It now says "internal" rather than
-      an English sentence fragment with spaces in the middle. Bugfix on
-      Tor 0.2.0.19-alpha.
-    - Fix log messages and comments to avoid saying "GMT" when we mean
-      "UTC". Fixes bug 6113.
-    - Compile on win64 using mingw64. Fixes bug 7260; patches from
-      "yayooo".
-    - Fix a crash when debugging unit tests on Windows: deallocate a
-      shared library with FreeLibrary, not CloseHandle. Fixes bug 7306;
-      bugfix on 0.2.2.17-alpha. Reported by "ultramage".
-
-  o Renamed options:
-    - The DirServer option is now DirAuthority, for consistency with
-      current naming patterns. You can still use the old DirServer form.
-
-  o Code simplification and refactoring:
-    - Move the client-side address-map/virtual-address/DNS-cache code
-      out of connection_edge.c into a new addressmap.c module.
-    - Remove unused code for parsing v1 directories and "running routers"
-      documents. Fixes bug 6887.
-
-
-Changes in version 0.2.3.25 - 2012-11-19
-  The Tor 0.2.3 release series is dedicated to the memory of Len "rabbi"
-  Sassaman (1980-2011), a long-time cypherpunk, anonymity researcher,
-  Mixmaster maintainer, Pynchon Gate co-designer, CodeCon organizer,
-  programmer, and friend. Unstinting in his dedication to the cause of
-  freedom, he inspired and helped many of us as we began our work on
-  anonymity, and inspires us still. Please honor his memory by writing
-  software to protect people's freedoms, and by helping others to do so.
-
-  Tor 0.2.3.25, the first stable release in the 0.2.3 branch, features
-  significantly reduced directory overhead (via microdescriptors),
-  enormous crypto performance improvements for fast relays on new
-  enough hardware, a new v3 TLS handshake protocol that can better
-  resist fingerprinting, support for protocol obfuscation plugins (aka
-  pluggable transports), better scalability for hidden services, IPv6
-  support for bridges, performance improvements like allowing clients
-  to skip the first round-trip on the circuit ("optimistic data") and
-  refilling token buckets more often, a new "stream isolation" design
-  to isolate different applications on different circuits, and many
-  stability, security, and privacy fixes.
-
-  o Major bugfixes:
-    - Tor tries to wipe potentially sensitive data after using it, so
-      that if some subsequent security failure exposes Tor's memory,
-      the damage will be limited. But we had a bug where the compiler
-      was eliminating these wipe operations when it decided that the
-      memory was no longer visible to a (correctly running) program,
-      hence defeating our attempt at defense in depth. We fix that
-      by using OpenSSL's OPENSSL_cleanse() operation, which a compiler
-      is unlikely to optimize away. Future versions of Tor may use
-      a less ridiculously heavy approach for this. Fixes bug 7352.
-      Reported in an article by Andrey Karpov.
-
-  o Minor bugfixes:
-    - Fix a harmless bug when opting against publishing a relay descriptor
-      because DisableNetwork is set. Fixes bug 7464; bugfix on
-      0.2.3.9-alpha.
-
-
-Changes in version 0.2.4.6-alpha - 2012-11-13
-  Tor 0.2.4.6-alpha fixes an assert bug that has been plaguing relays,
-  makes our defense-in-depth memory wiping more reliable, and begins to
-  count IPv6 addresses in bridge statistics,
-
-  o Major bugfixes:
-    - Fix an assertion failure that could occur when closing a connection
-      with a spliced rendezvous circuit. Fix for bug 7212; bugfix on
-      Tor 0.2.4.4-alpha.
-    - Tor tries to wipe potentially sensitive data after using it, so
-      that if some subsequent security failure exposes Tor's memory,
-      the damage will be limited. But we had a bug where the compiler
-      was eliminating these wipe operations when it decided that the
-      memory was no longer visible to a (correctly running) program,
-      hence defeating our attempt at defense in depth. We fix that
-      by using OpenSSL's OPENSSL_cleanse() operation, which a compiler
-      is unlikely to optimize away. Future versions of Tor may use
-      a less ridiculously heavy approach for this. Fixes bug 7352.
-      Reported in an article by Andrey Karpov.
-
-  o Minor features:
-    - Add GeoIP database for IPv6 addresses. The new config option
-      is GeoIPv6File.
-    - Bridge statistics now count bridge clients connecting over IPv6:
-      bridge statistics files now list "bridge-ip-versions" and
-      extra-info documents list "geoip6-db-digest". The control protocol
-      "CLIENTS_SEEN" and "ip-to-country" queries now support IPv6. Initial
-      implementation by "shkoo", addressing ticket 5055.
-
-  o Minor bugfixes:
-    - Warn when we are binding low ports when hibernation is enabled;
-      previously we had warned when we were _advertising_ low ports with
-      hibernation enabled. Fixes bug 7285; bugfix on 0.2.3.9-alpha.
-    - Fix a harmless bug when opting against publishing a relay descriptor
-      because DisableNetwork is set. Fixes bug 7464; bugfix on
-      0.2.3.9-alpha.
-    - Add warning message when a managed proxy dies during configuration.
-      Fixes bug 7195; bugfix on 0.2.4.2-alpha.
-    - Fix a linking error when building tor-fw-helper without miniupnp.
-      Fixes bug 7235; bugfix on 0.2.4.2-alpha. Fix by Anthony G. Basile.
-    - Check for closing an or_connection_t without going through correct
-      channel functions; emit a warning and then call
-      connection_or_close_for_error() so we don't assert as in bugs 7212
-      and 7267.
-    - Compile correctly on compilers without C99 designated initializer
-      support. Fixes bug 7286; bugfix on 0.2.4.4-alpha.
-    - Avoid a possible assert that can occur when channel_send_destroy() is
-      called on a channel in CHANNEL_STATE_CLOSING, CHANNEL_STATE_CLOSED,
-      or CHANNEL_STATE_ERROR when the Tor process is resumed after being
-      blocked for a long interval. Fixes bug 7350; bugfix on 0.2.4.4-alpha.
-    - Fix a memory leak on failing cases of channel_tls_process_certs_cell.
-      Fixes bug 7422; bugfix on 0.2.4.4-alpha.
-
-  o Code simplification and refactoring:
-    - Start using OpenBSD's implementation of queue.h, so that we don't
-      need to hand-roll our own pointer and list structures whenever we
-      need them. (We can't rely on a sys/queue.h, since some operating
-      systems don't have them, and the ones that do have them don't all
-      present the same extensions.)
-
-
-Changes in version 0.2.4.5-alpha - 2012-10-25
-  Tor 0.2.4.5-alpha comes hard at the heels of 0.2.4.4-alpha, to fix
-  two important security vulnerabilities that could lead to remotely
-  triggerable relay crashes, fix a major bug that was preventing clients
-  from choosing suitable exit nodes, and refactor some of our code.
-
-  o Major bugfixes (security, also in 0.2.3.24-rc):
-    - Fix a group of remotely triggerable assertion failures related to
-      incorrect link protocol negotiation. Found, diagnosed, and fixed
-      by "some guy from France". Fix for CVE-2012-2250; bugfix on
-      0.2.3.6-alpha.
-    - Fix a denial of service attack by which any directory authority
-      could crash all the others, or by which a single v2 directory
-      authority could crash everybody downloading v2 directory
-      information. Fixes bug 7191; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (also in 0.2.3.24-rc):
-    - When parsing exit policy summaries from microdescriptors, we had
-      previously been ignoring the last character in each one, so that
-      "accept 80,443,8080" would be treated by clients as indicating
-      a node that allows access to ports 80, 443, and 808. That would
-      lead to clients attempting connections that could never work,
-      and ignoring exit nodes that would support their connections. Now
-      clients parse these exit policy summaries correctly. Fixes bug 7192;
-      bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (also in 0.2.3.24-rc):
-    - Clients now consider the ClientRejectInternalAddresses config option
-      when using a microdescriptor consensus stanza to decide whether
-      an exit relay would allow exiting to an internal address. Fixes
-      bug 7190; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes:
-    - Only disable TLS session ticket support when running as a TLS
-      server. Now clients will blend better with regular Firefox
-      connections. Fixes bug 7189; bugfix on Tor 0.2.3.23-rc.
-
-  o Code simplification and refactoring:
-    - Start using OpenBSD's implementation of queue.h (originally by
-      Niels Provos).
-    - Move the entry node code from circuitbuild.c to its own file.
-    - Move the circuit build timeout tracking code from circuitbuild.c
-      to its own file.
-
-
-Changes in version 0.2.3.24-rc - 2012-10-25
-  Tor 0.2.3.24-rc fixes two important security vulnerabilities that
-  could lead to remotely triggerable relay crashes, and fixes
-  a major bug that was preventing clients from choosing suitable exit
-  nodes.
-
-  o Major bugfixes (security):
-    - Fix a group of remotely triggerable assertion failures related to
-      incorrect link protocol negotiation. Found, diagnosed, and fixed
-      by "some guy from France". Fix for CVE-2012-2250; bugfix on
-      0.2.3.6-alpha.
-    - Fix a denial of service attack by which any directory authority
-      could crash all the others, or by which a single v2 directory
-      authority could crash everybody downloading v2 directory
-      information. Fixes bug 7191; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes:
-    - When parsing exit policy summaries from microdescriptors, we had
-      previously been ignoring the last character in each one, so that
-      "accept 80,443,8080" would be treated by clients as indicating
-      a node that allows access to ports 80, 443, and 808. That would
-      lead to clients attempting connections that could never work,
-      and ignoring exit nodes that would support their connections. Now
-      clients parse these exit policy summaries correctly. Fixes bug 7192;
-      bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes:
-    - Clients now consider the ClientRejectInternalAddresses config option
-      when using a microdescriptor consensus stanza to decide whether
-      an exit relay would allow exiting to an internal address. Fixes
-      bug 7190; bugfix on 0.2.3.1-alpha.
-
-
-Changes in version 0.2.4.4-alpha - 2012-10-20
-  Tor 0.2.4.4-alpha adds a new v3 directory authority, fixes a privacy
-  vulnerability introduced by a change in OpenSSL, fixes a remotely
-  triggerable assert, and adds new channel_t and circuitmux_t abstractions
-  that will make it easier to test new connection transport and cell
-  scheduling algorithms.
-
-  o New directory authorities (also in 0.2.3.23-rc):
-    - Add Faravahar (run by Sina Rabbani) as the ninth v3 directory
-      authority. Closes ticket 5749.
-
-  o Major bugfixes (security/privacy, also in 0.2.3.23-rc):
-    - Disable TLS session tickets. OpenSSL's implementation was giving
-      our TLS session keys the lifetime of our TLS context objects, when
-      perfect forward secrecy would want us to discard anything that
-      could decrypt a link connection as soon as the link connection
-      was closed. Fixes bug 7139; bugfix on all versions of Tor linked
-      against OpenSSL 1.0.0 or later. Found by Florent Daignière.
-    - Discard extraneous renegotiation attempts once the V3 link
-      protocol has been initiated. Failure to do so left us open to
-      a remotely triggerable assertion failure. Fixes CVE-2012-2249;
-      bugfix on 0.2.3.6-alpha. Reported by "some guy from France".
-
-  o Internal abstraction features:
-    - Introduce new channel_t abstraction between circuits and
-      or_connection_t to allow for implementing alternate OR-to-OR
-      transports. A channel_t is an abstract object which can either be a
-      cell-bearing channel, which is responsible for authenticating and
-      handshaking with the remote OR and transmitting cells to and from
-      it, or a listening channel, which spawns new cell-bearing channels
-      at the request of remote ORs. Implements part of ticket 6465.
-    - Also new is the channel_tls_t subclass of channel_t, adapting it
-      to the existing or_connection_t code. The V2/V3 protocol handshaking
-      code which formerly resided in command.c has been moved below the
-      channel_t abstraction layer and may be found in channeltls.c now.
-      Implements the rest of ticket 6465.
-    - Introduce new circuitmux_t storing the queue of circuits for
-      a channel; this encapsulates and abstracts the queue logic and
-      circuit selection policy, and allows the latter to be overridden
-      easily by switching out a policy object. The existing EWMA behavior
-      is now implemented as a circuitmux_policy_t. Resolves ticket 6816.
-
-  o Required libraries:
-    - Tor now requires OpenSSL 0.9.8 or later. OpenSSL 1.0.0 or later is
-      strongly recommended.
-
-  o Minor features:
-    - Warn users who run hidden services on a Tor client with
-      UseEntryGuards disabled that their hidden services will be
-      vulnerable to http://freehaven.net/anonbib/#hs-attack06 (the
-      attack which motivated Tor to support entry guards in the first
-      place). Resolves ticket 6889.
-    - Tor now builds correctly on Bitrig, an OpenBSD fork. Patch from
-      dhill. Resolves ticket 6982.
-    - Option OutboundBindAddress can be specified multiple times and
-      accepts IPv6 addresses. Resolves ticket 6876.
-
-  o Minor bugfixes (also in 0.2.3.23-rc):
-    - Don't serve or accept v2 hidden service descriptors over a
-      relay's DirPort. It's never correct to do so, and disabling it
-      might make it more annoying to exploit any bugs that turn up in the
-      descriptor-parsing code. Fixes bug 7149.
-    - Fix two cases in src/or/transports.c where we were calling
-      fmt_addr() twice in a parameter list. Bug found by David
-      Fifield. Fixes bug 7014; bugfix on 0.2.3.9-alpha.
-    - Fix memory leaks whenever we logged any message about the "path
-      bias" detection. Fixes bug 7022; bugfix on 0.2.3.21-rc.
-    - When relays refuse a "create" cell because their queue of pending
-      create cells is too big (typically because their cpu can't keep up
-      with the arrival rate), send back reason "resource limit" rather
-      than reason "internal", so network measurement scripts can get a
-      more accurate picture. Fixes bug 7037; bugfix on 0.1.1.11-alpha.
-
-  o Minor bugfixes:
-    - Command-line option "--version" implies "--quiet". Fixes bug 6997.
-    - Free some more still-in-use memory at exit, to make hunting for
-      memory leaks easier. Resolves bug 7029.
-    - When a Tor client gets a "truncated" relay cell, the first byte of
-      its payload specifies why the circuit was truncated. We were
-      ignoring this 'reason' byte when tearing down the circuit, resulting
-      in the controller not being told why the circuit closed. Now we
-      pass the reason from the truncated cell to the controller. Bugfix
-      on 0.1.2.3-alpha; fixes bug 7039.
-    - Downgrade "Failed to hand off onionskin" messages to "debug"
-      severity, since they're typically redundant with the "Your computer
-      is too slow" messages. Fixes bug 7038; bugfix on 0.2.2.16-alpha.
-    - Make clients running with IPv6 bridges connect over IPv6 again,
-      even without setting new config options ClientUseIPv6 and
-      ClientPreferIPv6ORPort. Fixes bug 6757; bugfix on 0.2.4.1-alpha.
-    - Use square brackets around IPv6 addresses in numerous places
-      that needed them, including log messages, HTTPS CONNECT proxy
-      requests, TransportProxy statefile entries, and pluggable transport
-      extra-info lines. Fixes bug 7011; patch by David Fifield.
-
-  o Code refactoring and cleanup:
-    - Source files taken from other packages now reside in src/ext;
-      previously they were scattered around the rest of Tor.
-    - Avoid use of reserved identifiers in our C code. The C standard
-      doesn't like us declaring anything that starts with an
-      underscore, so let's knock it off before we get in trouble. Fix
-      for bug 1031; bugfix on the first Tor commit.
-
-
-Changes in version 0.2.3.23-rc - 2012-10-20
-  Tor 0.2.3.23-rc adds a new v3 directory authority, fixes a privacy
-  vulnerability introduced by a change in OpenSSL, and fixes a variety
-  of smaller bugs in preparation for the release.
-
-  o New directory authorities:
-    - Add Faravahar (run by Sina Rabbani) as the ninth v3 directory
-      authority. Closes ticket 5749.
-
-  o Major bugfixes (security/privacy):
-    - Disable TLS session tickets. OpenSSL's implementation was giving
-      our TLS session keys the lifetime of our TLS context objects, when
-      perfect forward secrecy would want us to discard anything that
-      could decrypt a link connection as soon as the link connection
-      was closed. Fixes bug 7139; bugfix on all versions of Tor linked
-      against OpenSSL 1.0.0 or later. Found by Florent Daignière.
-    - Discard extraneous renegotiation attempts once the V3 link
-      protocol has been initiated. Failure to do so left us open to
-      a remotely triggerable assertion failure. Fixes CVE-2012-2249;
-      bugfix on 0.2.3.6-alpha. Reported by "some guy from France".
-
-  o Major bugfixes:
-    - Fix a possible crash bug when checking for deactivated circuits
-      in connection_or_flush_from_first_active_circuit(). Fixes bug 6341;
-      bugfix on 0.2.2.7-alpha. Bug report and fix received pseudonymously.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - Fix two cases in src/or/transports.c where we were calling
-      fmt_addr() twice in a parameter list. Bug found by David
-      Fifield. Fixes bug 7014; bugfix on 0.2.3.9-alpha.
-    - Convert an assert in the pathbias code to a log message. The assert
-      appears to only be triggerable by Tor2Web mode. Fixes bug 6866;
-      bugfix on 0.2.3.17-beta.
-    - Fix memory leaks whenever we logged any message about the "path
-      bias" detection. Fixes bug 7022; bugfix on 0.2.3.21-rc.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Don't serve or accept v2 hidden service descriptors over a relay's
-      DirPort. It's never correct to do so, and disabling it might
-      make it more annoying to exploit any bugs that turn up in the
-      descriptor-parsing code. Fixes bug 7149.
-    - When relays refuse a "create" cell because their queue of pending
-      create cells is too big (typically because their cpu can't keep up
-      with the arrival rate), send back reason "resource limit" rather
-      than reason "internal", so network measurement scripts can get a
-      more accurate picture. Bugfix on 0.1.1.11-alpha; fixes bug 7037.
-    - Correct file sizes when reading binary files on Cygwin, to avoid
-      a bug where Tor would fail to read its state file. Fixes bug 6844;
-      bugfix on 0.1.2.7-alpha.
-    - Avoid undefined behavior when parsing the list of supported
-      rendezvous/introduction protocols in a hidden service descriptor.
-      Previously, Tor would have confused (as-yet-unused) protocol version
-      numbers greater than 32 with lower ones on many platforms. Fixes
-      bug 6827; bugfix on 0.2.0.10-alpha. Found by George Kadianakis.
-
-  o Documentation fixes:
-    - Clarify that hidden services are TCP only. Fixes bug 6024.
-
-
-Changes in version 0.2.4.3-alpha - 2012-09-22
-  Tor 0.2.4.3-alpha fixes another opportunity for a remotely triggerable
-  assertion, resumes letting relays test reachability of their DirPort,
-  and cleans up a bunch of smaller bugs.
-
-  o Security fixes:
-    - Fix an assertion failure in tor_timegm() that could be triggered
-      by a badly formatted directory object. Bug found by fuzzing with
-      Radamsa. Fixes bug 6811; bugfix on 0.2.0.20-rc.
-
-  o Major bugfixes:
-    - Fix a possible crash bug when checking for deactivated circuits
-      in connection_or_flush_from_first_active_circuit(). Fixes bug 6341;
-      bugfix on 0.2.2.7-alpha. Bug report and fix received pseudonymously.
-    - Allow routers to detect that their own DirPorts are running. When
-      we removed support for versions_supports_begindir, we also
-      accidentally removed the mechanism we used to self-test our
-      DirPort. Diagnosed with help from kargig. Fixes bugs 6814 and 6815;
-      bugfix on 0.2.4.2-alpha.
-
-  o Security features:
-    - Switch to a completely time-invariant approach for picking nodes
-      weighted by bandwidth. Our old approach would run through the
-      part of the loop after it had made its choice slightly slower
-      than it ran through the part of the loop before it had made its
-      choice. Addresses ticket 6538.
-    - Disable the use of Guard nodes when in Tor2WebMode. Guard usage
-      by tor2web clients allows hidden services to identify tor2web
-      clients through their repeated selection of the same rendezvous
-      and introduction point circuit endpoints (their guards). Resolves
-      ticket 6888.
-
-  o Minor features:
-    - Enable Tor to read configuration, state, and key information from
-      a FIFO. Previously Tor would only read from files with a positive
-      stat.st_size. Code from meejah; fixes bug 6044.
-
-  o Minor bugfixes:
-    - Correct file sizes when reading binary files on Cygwin, to avoid
-      a bug where Tor would fail to read its state file. Fixes bug 6844;
-      bugfix on 0.1.2.7-alpha.
-    - Correctly handle votes with more than 31 flags. Fixes bug 6853;
-      bugfix on 0.2.0.3-alpha.
-    - When complaining about a client port on a public address, log
-      which address we're complaining about. Fixes bug 4020; bugfix on
-      0.2.3.3-alpha. Patch by Tom Fitzhenry.
-    - Convert an assert in the pathbias code to a log message. The assert
-      appears to only be triggerable by Tor2Web mode. Fixes bug 6866;
-      bugfix on 0.2.3.17-beta.
-    - Our new buildsystem was overzealous about rebuilding manpages: it
-      would rebuild them all whenever any one of them changed. Now our
-      dependency checking should be correct. Fixes bug 6843; bugfix on
-      0.2.4.1-alpha.
-    - Don't do reachability testing over IPv6 unless AuthDirPublishIPv6
-      is set. Fixes bug 6880. Bugfix on 0.2.4.1-alpha.
-    - Correct log printout about which address family is preferred
-      when connecting to a bridge with both an IPv4 and IPv6 OR port.
-      Fixes bug 6884; bugfix on 0.2.4.1-alpha.
-
-  o Minor bugfixes (code cleanliness):
-    - Fix round_to_power_of_2() so it doesn't invoke undefined behavior
-      with large values. This situation was untriggered, but nevertheless
-      incorrect. Fixes bug 6831; bugfix on 0.2.0.1-alpha.
-    - Reject consensus votes with more than 64 known-flags. We aren't even
-      close to that limit yet, and our code doesn't handle it correctly.
-      Fixes bug 6833; bugfix on 0.2.0.1-alpha.
-    - Avoid undefined behavior when parsing the list of supported
-      rendezvous/introduction protocols in a hidden service descriptor.
-      Previously, Tor would have confused (as-yet-unused) protocol version
-      numbers greater than 32 with lower ones on many platforms. Fixes
-      bug 6827; bugfix on 0.2.0.10-alpha. Found by George Kadianakis.
-    - Fix handling of rendezvous client authorization types over 8.
-      Fixes bug 6861; bugfix on 0.2.1.5-alpha.
-    - Fix building with older versions of GCC (2.95, for one) that don't
-      like preprocessor directives inside macro arguments. Found by
-      grarpamp. Fixes bug 6842; bugfix on 0.2.4.2-alpha.
-    - Switch weighted node selection rule from using a list of doubles
-      to using a list of int64_t. This change should make the process
-      slightly easier to debug and maintain. Needed to finish ticket 6538.
-
-  o Code simplification and refactoring:
-    - Move the generic "config" code into a new file, and have "config.c"
-      hold only torrc- and state-related code. Resolves ticket 6823.
-    - Move the core of our "choose a weighted element at random" logic
-      into its own function, and give it unit tests. Now the logic is
-      testable, and a little less fragile too.
-    - Removed the testing_since field of node_t, which hasn't been used
-      for anything since 0.2.0.9-alpha.
-
-  o Documentation fixes:
-    - Clarify that hidden services are TCP only. Fixes bug 6024.
-    - Resolve a typo in torrc.sample.in. Fixes bug 6819; bugfix on
-      0.2.3.14-alpha.
-
-
-Changes in version 0.2.3.22-rc - 2012-09-11
-  Tor 0.2.3.22-rc fixes another opportunity for a remotely triggerable
-  assertion.
-
-  o Security fixes:
-    - Fix an assertion failure in tor_timegm() that could be triggered
-      by a badly formatted directory object. Bug found by fuzzing with
-      Radamsa. Fixes bug 6811; bugfix on 0.2.0.20-rc.
-
-  o Minor bugfixes:
-    - Avoid segfault when starting up having run with an extremely old
-      version of Tor and parsing its state file. Fixes bug 6801; bugfix
-      on 0.2.2.23-alpha.
-
-
-Changes in version 0.2.2.39 - 2012-09-11
-  Tor 0.2.2.39 fixes two more opportunities for remotely triggerable
-  assertions.
-
-  o Security fixes:
-    - Fix an assertion failure in tor_timegm() that could be triggered
-      by a badly formatted directory object. Bug found by fuzzing with
-      Radamsa. Fixes bug 6811; bugfix on 0.2.0.20-rc.
-    - Do not crash when comparing an address with port value 0 to an
-      address policy. This bug could have been used to cause a remote
-      assertion failure by or against directory authorities, or to
-      allow some applications to crash clients. Fixes bug 6690; bugfix
-      on 0.2.1.10-alpha.
-
-
-Changes in version 0.2.4.2-alpha - 2012-09-10
-  Tor 0.2.4.2-alpha enables port forwarding for pluggable transports,
-  raises the default rate limiting even more, and makes the bootstrapping
-  log messages less noisy.
-
-  o Major features:
-    - Automatically forward the TCP ports of pluggable transport
-      proxies using tor-fw-helper if PortForwarding is enabled. Implements
-      ticket 4567.
-
-  o Major bugfixes:
-    - Raise the default BandwidthRate/BandwidthBurst values from 5MB/10MB
-      to 1GB/1GB. The previous defaults were intended to be "basically
-      infinite", but it turns out they're now limiting our 100mbit+
-      relays and bridges. Fixes bug 6605; bugfix on 0.2.0.10-alpha (the
-      last time we raised it).
-
-  o Minor features:
-    - Detect when we're running with a version of OpenSSL other than the
-      one we compiled with. This has occasionally given people hard-to-
-      track-down errors.
-    - Log fewer lines at level "notice" about our OpenSSL and Libevent
-      versions and capabilities when everything is going right. Resolves
-      part of ticket 6736.
-    - Directory authorities no long accept descriptors for any version of
-      Tor before 0.2.2.35, or for any 0.2.3 release before 0.2.3.10-alpha.
-      These versions are insecure, unsupported, or both. Implements
-      ticket 6789.
-
-  o Minor bugfixes:
-    - Rename the (internal-use-only) UsingTestingNetworkDefaults option
-      to start with a triple-underscore so the controller won't touch it.
-      Patch by Meejah. Fixes bug 3155. Bugfix on 0.2.2.23-alpha.
-    - Avoid segfault when starting up having run with an extremely old
-      version of Tor and parsing its state file. Fixes bug 6801; bugfix
-      on 0.2.2.23-alpha.
-    - Rename the (testing-use-only) _UseFilteringSSLBufferevents option
-      so it doesn't start with _. Fixes bug 3155. Bugfix on 0.2.3.1-alpha.
-    - Don't follow the NULL pointer if microdescriptor generation fails.
-      (This does not appear to be triggerable, but it's best to be safe.)
-      Found by "f. tp.". Fixes bug 6797; bugfix on 0.2.4.1-alpha.
-    - Fix mis-declared dependencies on src/common/crypto.c and
-      src/or/tor_main.c that could break out-of-tree builds under some
-      circumstances. Fixes bug 6778; bugfix on 0.2.4.1-alpha.
-    - Avoid a warning when building common_sha1.i out of tree. Fixes bug
-      6778; bugfix on 0.2.4.1-alpha.
-    - Fix a harmless (in this case) build warning for implicitly
-      converting a strlen() to an int. Bugfix on 0.2.4.1-alpha.
-
-  o Removed features:
-    - Now that all versions before 0.2.2.x are disallowed, we no longer
-      need to work around their missing features. Thus we can remove a
-      bunch of compatibility code.
-
-  o Code refactoring:
-    - Tweak tor-fw-helper to accept an arbitrary amount of arbitrary
-      TCP ports to forward. In the past it only accepted two ports:
-      the ORPort and the DirPort.
-
-
-Changes in version 0.2.4.1-alpha - 2012-09-05
-  Tor 0.2.4.1-alpha lets bridges publish their pluggable transports to
-  bridgedb; lets relays use IPv6 addresses and directory authorities
-  advertise them; and switches to a cleaner build interface.
-
-  This is the first alpha release in a new series, so expect there to
-  be bugs. Users who would rather test out a more stable branch should
-  stay with 0.2.3.x for now.
-
-  o Major features (bridges):
-    - Bridges now report the pluggable transports they support to the
-      bridge authority, so it can pass the supported transports on to
-      bridgedb and/or eventually do reachability testing. Implements
-      ticket 3589.
-
-  o Major features (IPv6):
-    - Bridge authorities now accept IPv6 bridge addresses and include
-      them in network status documents. Implements ticket 5534.
-    - Clients who set "ClientUseIPv6 1" may connect to entry nodes over
-      IPv6. Set "ClientPreferIPv6ORPort 1" to make this even more likely
-      to happen. Implements ticket 5535.
-    - All kind of relays, not just bridges, can now advertise an IPv6
-      OR port. Implements ticket 6362.
-    - Directory authorities vote on IPv6 OR ports using the new consensus
-      method 14. Implements ticket 6363.
-
-  o Major features (build):
-    - Switch to a nonrecursive Makefile structure. Now instead of each
-      Makefile.am invoking other Makefile.am's, there is a master
-      Makefile.am that includes the others. This change makes our build
-      process slightly more maintainable, and improves parallelism for
-      building with make -j. Original patch by Stewart Smith; various
-      fixes by Jim Meyering.
-    - Where available, we now use automake's "silent" make rules by
-      default, so that warnings are easier to spot. You can get the old
-      behavior with "make V=1". Patch by Stewart Smith for ticket 6522.
-
-  o Minor features (code security and spec conformance):
-    - Clear keys and key-derived material left on the stack in
-      rendservice.c and rendclient.c. Check return value of
-      crypto_pk_write_private_key_to_string() in rend_service_load_keys().
-      These fixes should make us more forward-secure against cold-boot
-      attacks and the like. Fixes bug 2385.
-    - Reject EXTEND cells sent to nonexistent streams. According to the
-      spec, an EXTEND cell sent to _any_ nonzero stream ID is invalid, but
-      we were only checking for stream IDs that were currently in use.
-      Found while hunting for more instances of bug 6271. Bugfix on
-      0.0.2pre8, which introduced incremental circuit construction.
-
-  o Minor features (streamlining);
-    - No longer include the "opt" prefix when generating routerinfos
-      or v2 directories: it has been needless since Tor 0.1.2. Closes
-      ticket 5124.
-    - Remove some now-needless code that tried to aggressively flush
-      OR connections as data was added to them. Since 0.2.0.1-alpha, our
-      cell queue logic has saved us from the failure mode that this code
-      was supposed to prevent. Removing this code will limit the number
-      of baroque control flow paths through Tor's network logic. Reported
-      pseudonymously on IRC. Fixes bug 6468; bugfix on 0.2.0.1-alpha.
-
-  o Minor features (controller):
-    - Add a "GETINFO signal/names" control port command. Implements
-      ticket 3842.
-    - Provide default values for all options via "GETINFO config/defaults".
-      Implements ticket 4971.
-
-  o Minor features (IPv6):
-    - New config option "AuthDirHasIPv6Connectivity 1" that directory
-      authorities should set if they have IPv6 connectivity and want to
-      do reachability tests for IPv6 relays. Implements feature 5974.
-    - A relay with an IPv6 OR port now sends that address in NETINFO
-      cells (in addition to its other address). Implements ticket 6364.
-
-  o Minor features (log messages):
-    - Omit the first heartbeat log message, because it never has anything
-      useful to say, and it clutters up the bootstrapping messages.
-      Resolves ticket 6758.
-    - Don't log about reloading the microdescriptor cache at startup. Our
-      bootstrap warnings are supposed to tell the user when there's a
-      problem, and our bootstrap notices say when there isn't. Resolves
-      ticket 6759; bugfix on 0.2.2.6-alpha.
-    - Don't log "I learned some more directory information" when we're
-      reading cached directory information. Reserve it for when new
-      directory information arrives in response to a fetch. Resolves
-      ticket 6760.
-    - Prevent rounding error in path bias counts when scaling
-      them down, and use the correct scale factor default. Also demote
-      some path bias related log messages down a level and make others
-      less scary sounding. Fixes bug 6647. Bugfix against 0.2.3.17-beta.
-    - We no longer warn so much when generating manpages from their
-      asciidoc source.
-
-  o Code simplifications and refactoring:
-    - Enhance our internal sscanf replacement so that we can eliminate
-      the last remaining uses of the system sscanf. (Though those uses
-      of sscanf were safe, sscanf itself is generally error prone, so
-      we want to eliminate when we can.) Fixes ticket 4195 and Coverity
-      CID 448.
-    - Move ipv6_preferred from routerinfo_t to node_t. Addresses bug 4620.
-    - Move last_reachable and testing_since from routerinfo_t to node_t.
-      Implements ticket 5529.
-    - Add replaycache_t structure, functions and unit tests, then refactor
-      rend_service_introduce() to be more clear to read, improve, debug,
-      and test. Resolves bug 6177.
-    - Finally remove support for malloc_good_size and malloc_usable_size.
-      We had hoped that these functions would let us eke a little more
-      memory out of our malloc implementation. Unfortunately, the only
-      implementations that provided these functions are also ones that
-      are already efficient about not overallocation: they never got us
-      more than 7 or so bytes per allocation. Removing them saves us a
-      little code complexity and a nontrivial amount of build complexity.
-
-  o New requirements:
-    - Tor maintainers now require Automake version 1.9 or later to build
-      Tor from the Git repository. (Automake is not required when building
-      from a source distribution.)
-
-
-Changes in version 0.2.3.21-rc - 2012-09-05
-  Tor 0.2.3.21-rc is the fourth release candidate for the Tor 0.2.3.x
-  series. It fixes a trio of potential security bugs, fixes a bug where
-  we were leaving some of the fast relays out of the microdescriptor
-  consensus, resumes interpreting "ORPort 0" and "DirPort 0" correctly,
-  and cleans up other smaller issues.
-
-  o Major bugfixes (security):
-    - Tear down the circuit if we get an unexpected SENDME cell. Clients
-      could use this trick to make their circuits receive cells faster
-      than our flow control would have allowed, or to gum up the network,
-      or possibly to do targeted memory denial-of-service attacks on
-      entry nodes. Fixes bug 6252. Bugfix on the 54th commit on Tor --
-      from July 2002, before the release of Tor 0.0.0. We had committed
-      this patch previously, but we had to revert it because of bug 6271.
-      Now that 6271 is fixed, this patch appears to work.
-    - Reject any attempt to extend to an internal address. Without
-      this fix, a router could be used to probe addresses on an internal
-      network to see whether they were accepting connections. Fixes bug
-      6710; bugfix on 0.0.8pre1.
-    - Do not crash when comparing an address with port value 0 to an
-      address policy. This bug could have been used to cause a remote
-      assertion failure by or against directory authorities, or to
-      allow some applications to crash clients. Fixes bug 6690; bugfix
-      on 0.2.1.10-alpha.
-
-  o Major bugfixes:
-    - Remove the upper bound on microdescriptor length. We were hitting
-      the limit for routers with complex exit policies or family
-      declarations, causing clients to not use them. Fixes the first
-      piece of bug 6404; fix on 0.2.2.6-alpha.
-    - Detect "ORPort 0" as meaning, uniformly, that we're not running
-      as a relay. Previously, some of our code would treat the presence
-      of any ORPort line as meaning that we should act like a relay,
-      even though our new listener code would correctly not open any
-      ORPorts for ORPort 0. Similar bugs in other Port options are also
-      fixed. Fixes the first half of bug 6507; bugfix on 0.2.3.3-alpha.
-
-  o Minor bugfixes:
-    - Avoid a pair of double-free and use-after-mark bugs that can
-      occur with certain timings in canceled and re-received DNS
-      requests. Fixes bug 6472; bugfix on 0.0.7rc1.
-    - Fix build and 64-bit compile warnings from --enable-openbsd-malloc.
-      Fixes bug 6379. Bugfix on 0.2.0.20-rc.
-    - Allow one-hop directory fetching circuits the full "circuit build
-      timeout" period, rather than just half of it, before failing them
-      and marking the relay down. This fix should help reduce cases where
-      clients declare relays (or worse, bridges) unreachable because
-      the TLS handshake takes a few seconds to complete. Fixes bug 6743;
-      bugfix on 0.2.2.2-alpha, where we changed the timeout from a static
-      30 seconds.
-    - Authorities no longer include any router in their microdescriptor
-      consensuses for which they couldn't generate or agree on a
-      microdescriptor. Fixes the second piece of bug 6404; fix on
-      0.2.2.6-alpha.
-    - Detect and reject attempts to specify both "FooPort" and
-      "FooPort 0" in the same configuration domain. (It's still okay
-      to have a FooPort in your configuration file, and use "FooPort 0"
-      on the command line to disable it.) Fixes the second half of bug
-      6507; bugfix on 0.2.3.3-alpha.
-    - Make wildcarded addresses (that is, ones beginning with "*.") work
-      when provided via the controller's MapAddress command. Previously,
-      they were accepted, but we never actually noticed that they were
-      wildcards. Fixes bug 6244; bugfix on 0.2.3.9-alpha.
-    - Avoid crashing on a malformed state file where EntryGuardPathBias
-      precedes EntryGuard. Fix for bug 6774; bugfix on 0.2.3.17-beta.
-    - Add a (probably redundant) memory clear between iterations of
-      the router status voting loop, to prevent future coding errors
-      where data might leak between iterations of the loop. Resolves
-      ticket 6514.
-
-  o Minor bugfixes (log messages):
-    - Downgrade "set buildtimeout to low value" messages to "info"
-      severity; they were never an actual problem, there was never
-      anything reasonable to do about them, and they tended to spam logs
-      from time to time. Fixes bug 6251; bugfix on 0.2.2.2-alpha.
-    - Downgrade path-bias warning messages to "info". We'll try to get
-      them working better in 0.2.4. Add internal circuit construction
-      state to protect against the noisy warn message "Unexpectedly high
-      circuit_successes". Also add some additional rate-limited notice
-      messages to help determine the root cause of the warn. Fixes bug
-      6475. Bugfix against 0.2.3.17-beta.
-    - Move log message when unable to find a microdesc in a routerstatus
-      entry to parse time. Previously we'd spam this warning every time
-      we tried to figure out which microdescriptors to download. Fixes
-      the third piece of bug 6404; fix on 0.2.3.18-rc.
-
-  o Minor features:
-    - Consider new, removed or changed IPv6 OR ports a non-cosmetic
-      change when the authority is deciding whether to accept a newly
-      uploaded descriptor. Implements ticket 6423.
-    - Add missing documentation for consensus and microdesc files.
-      Resolves ticket 6732.
-
-
-Changes in version 0.2.2.38 - 2012-08-12
-  Tor 0.2.2.38 fixes a remotely triggerable crash bug, and fixes a timing
-  attack that could in theory leak path information.
-
-  o Security fixes:
-    - Avoid an uninitialized memory read when reading a vote or consensus
-      document that has an unrecognized flavor name. This read could
-      lead to a remote crash bug. Fixes bug 6530; bugfix on 0.2.2.6-alpha.
-    - Try to leak less information about what relays a client is
-      choosing to a side-channel attacker. Previously, a Tor client would
-      stop iterating through the list of available relays as soon as it
-      had chosen one, thus finishing a little earlier when it picked
-      a router earlier in the list. If an attacker can recover this
-      timing information (nontrivial but not proven to be impossible),
-      they could learn some coarse-grained information about which relays
-      a client was picking (middle nodes in particular are likelier to
-      be affected than exits). The timing attack might be mitigated by
-      other factors (see bug 6537 for some discussion), but it's best
-      not to take chances. Fixes bug 6537; bugfix on 0.0.8rc1.
-
-
-Changes in version 0.2.3.20-rc - 2012-08-05
-  Tor 0.2.3.20-rc is the third release candidate for the Tor 0.2.3.x
-  series. It fixes a pair of code security bugs and a potential anonymity
-  issue, updates our RPM spec files, and cleans up other smaller issues.
-
-  o Security fixes:
-    - Avoid read-from-freed-memory and double-free bugs that could occur
-      when a DNS request fails while launching it. Fixes bug 6480;
-      bugfix on 0.2.0.1-alpha.
-    - Avoid an uninitialized memory read when reading a vote or consensus
-      document that has an unrecognized flavor name. This read could
-      lead to a remote crash bug. Fixes bug 6530; bugfix on 0.2.2.6-alpha.
-    - Try to leak less information about what relays a client is
-      choosing to a side-channel attacker. Previously, a Tor client would
-      stop iterating through the list of available relays as soon as it
-      had chosen one, thus finishing a little earlier when it picked
-      a router earlier in the list. If an attacker can recover this
-      timing information (nontrivial but not proven to be impossible),
-      they could learn some coarse-grained information about which relays
-      a client was picking (middle nodes in particular are likelier to
-      be affected than exits). The timing attack might be mitigated by
-      other factors (see bug 6537 for some discussion), but it's best
-      not to take chances. Fixes bug 6537; bugfix on 0.0.8rc1.
-
-  o Minor features:
-    - Try to make the warning when giving an obsolete SOCKSListenAddress
-      a little more useful.
-    - Terminate active server managed proxies if Tor stops being a
-      relay. Addresses parts of bug 6274; bugfix on 0.2.3.6-alpha.
-    - Provide a better error message about possible OSX Asciidoc failure
-      reasons. Fixes bug 6436.
-    - Warn when Tor is configured to use accounting in a way that can
-      link a hidden service to some other hidden service or public
-      address. Resolves ticket 6490.
-
-  o Minor bugfixes:
-    - Check return value of fputs() when writing authority certificate
-      file. Fixes Coverity issue 709056; bugfix on 0.2.0.1-alpha.
-    - Ignore ServerTransportPlugin lines when Tor is not configured as
-      a relay. Fixes bug 6274; bugfix on 0.2.3.6-alpha.
-    - When disabling guards for having too high a proportion of failed
-      circuits, make sure to look at each guard. Fixes bug 6397; bugfix
-      on 0.2.3.17-beta.
-
-  o Packaging (RPM):
-    - Update our default RPM spec files to work with mock and rpmbuild
-      on RHEL/Fedora. They have an updated set of dependencies and
-      conflicts, a fix for an ancient typo when creating the "_tor"
-      user, and better instructions. Thanks to Ondrej Mikle for the
-      patch series. Fixes bug 6043.
-
-  o Testing:
-    - Make it possible to set the TestingTorNetwork configuration
-      option using AlternateDirAuthority and AlternateBridgeAuthority
-      as an alternative to setting DirServer. Addresses ticket 6377.
-
-  o Documentation:
-    - Clarify the documentation for the Alternate*Authority options.
-      Fixes bug 6387.
-    - Fix some typos in the manpages. Patch from A. Costa. Fixes bug 6500.
-
-  o Code simplification and refactoring:
-    - Do not use SMARTLIST_FOREACH for any loop whose body exceeds
-      10 lines. Also, don't nest them. Doing so in the past has
-      led to hard-to-debug code. The new style is to use the
-      SMARTLIST_FOREACH_{BEGIN,END} pair. Addresses issue 6400.
-
-
-Changes in version 0.2.3.19-rc - 2012-07-06
-  Tor 0.2.3.19-rc is the second release candidate for the Tor 0.2.3.x
-  series. It fixes the compile on Windows, reverts to a GeoIP database
-  that isn't as broken, and fixes a flow control bug that has been around
-  since the beginning of Tor.
-
-  o Major bugfixes:
-    - Fix a bug handling SENDME cells on nonexistent streams that could
-      result in bizarre window values. Report and patch contributed
-      pseudonymously. Fixes part of bug 6271. This bug was introduced
-      before the first Tor release, in svn commit r152.
-    - Revert to the May 1 2012 Maxmind GeoLite Country database. In the
-      June 2012 database, Maxmind marked many Tor relays as country "A1",
-      which will cause risky behavior for clients that set EntryNodes
-      or ExitNodes. Addresses bug 6334; bugfix on 0.2.3.17-beta.
-    - Instead of ENOBUFS on Windows, say WSAENOBUFS. Fixes compilation
-      on Windows. Fixes bug 6296; bugfix on 0.2.3.18-rc.
-
-  o Minor bugfixes:
-    - Fix wrong TCP port range in parse_port_range(). Fixes bug 6218;
-      bugfix on 0.2.1.10-alpha.
-
-
-Changes in version 0.2.3.18-rc - 2012-06-28
-  Tor 0.2.3.18-rc is the first release candidate for the Tor 0.2.3.x
-  series. It fixes a few smaller bugs, but generally appears stable.
-  Please test it and let us know whether it is!
-
-  o Major bugfixes:
-    - Allow wildcarded mapaddress targets to be specified on the
-      controlport. Partially fixes bug 6244; bugfix on 0.2.3.9-alpha.
-    - Make our linker option detection code more robust against linkers
-      such as on FreeBSD 8, where a bad combination of options completes
-      successfully but makes an unrunnable binary. Fixes bug 6173;
-      bugfix on 0.2.3.17-beta.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Avoid a false positive in the util/threads unit test by increasing
-      the maximum timeout time. Fixes bug 6227; bugfix on 0.2.0.4-alpha.
-    - Replace "Sending publish request" log messages with "Launching
-      upload", so that they no longer confusingly imply that we're
-      sending something to a directory we might not even be connected
-      to yet. Fixes bug 3311; bugfix on 0.2.0.10-alpha.
-    - Make sure to set *socket_error in all error cases in
-      connection_connect(), so it can't produce a warning about
-      errno being zero from errno_to_orconn_end_reason(). Bugfix on
-      0.2.1.1-alpha; resolves ticket 6028.
-    - Downgrade "Got a certificate, but we already have it" log messages
-      from warning to info, except when we're a dirauth. Fixes bug 5238;
-      bugfix on 0.2.1.7-alpha.
-    - When checking for requested signatures on the latest consensus
-      before serving it to a client, make sure to check the right
-      consensus flavor. Bugfix on 0.2.2.6-alpha.
-    - Downgrade "eventdns rejected address" message to LOG_PROTOCOL_WARN.
-      Fixes bug 5932; bugfix on 0.2.2.7-alpha.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - Make format_helper_exit_status() avoid unnecessary space padding
-      and stop confusing log_from_pipe(). Fixes ticket 5557; bugfix
-      on 0.2.3.1-alpha.
-    - Downgrade a message about cleaning the microdescriptor cache to
-      "info" from "notice". Fixes bug 6238; bugfix on 0.2.3.1-alpha.
-    - Log a BUG message at severity INFO if we have a networkstatus with
-      a missing entry for some microdescriptor. Continues on a patch
-      to 0.2.3.2-alpha.
-    - Improve the log message when a managed proxy fails to launch. Fixes
-      bug 5099; bugfix on 0.2.3.6-alpha.
-    - Don't do DNS lookups when parsing corrupted managed proxy protocol
-      messages. Fixes bug 6226; bugfix on 0.2.3.6-alpha.
-    - When formatting wildcarded address mappings for the controller,
-      be sure to include "*." as appropriate. Partially fixes bug 6244;
-      bugfix on 0.2.3.9-alpha.
-    - Avoid a warning caused by using strcspn() from glibc with clang 3.0.
-      Bugfix on 0.2.3.13-alpha.
-    - Stop logging messages about running with circuit timeout learning
-      enabled at severity LD_BUG. Fixes bug 6169; bugfix on 0.2.3.17-beta.
-    - Disable a spurious warning about reading on a marked and flushing
-      connection. We shouldn't be doing that, but apparently we
-      sometimes do. Fixes bug 6203; bugfix on 0.2.3.17-beta.
-    - Fix a bug that stopped AllowDotExit from working on addresses
-      that had an entry in the DNS cache. Fixes bug 6211; bugfix on
-      0.2.3.17-beta.
-
-  o Code simplification, refactoring, unit tests:
-    - Move tor_gettimeofday_cached() into compat_libevent.c, and use
-      Libevent's notion of cached time when possible.
-    - Remove duplicate code for invoking getrlimit() from control.c.
-    - Add a unit test for the environment_variable_names_equal function.
-
-  o Documentation:
-    - Document the --defaults-torrc option, and the new (in 0.2.3)
-      semantics for overriding, extending, and clearing lists of
-      options. Closes bug 4748.
-
-
-Changes in version 0.2.3.17-beta - 2012-06-15
-  Tor 0.2.3.17-beta enables compiler and linker hardening by default,
-  gets our TLS handshake back on track for being able to blend in with
-  Firefox, fixes a big bug in 0.2.3.16-alpha that broke Tor's interaction
-  with Vidalia, and otherwise continues to get us closer to a release
-  candidate.
-
-  o Major features:
-    - Enable gcc and ld hardening by default. Resolves ticket 5210.
-    - Update TLS cipher list to match Firefox 8 and later. Resolves
-      ticket 4744.
-    - Implement the client side of proposal 198: remove support for
-      clients falsely claiming to support standard ciphersuites that
-      they can actually provide. As of modern OpenSSL versions, it's not
-      necessary to fake any standard ciphersuite, and doing so prevents
-      us from using better ciphersuites in the future, since servers
-      can't know whether an advertised ciphersuite is really supported or
-      not. Some hosts -- notably, ones with very old versions of OpenSSL
-      or where OpenSSL has been built with ECC disabled -- will stand
-      out because of this change; TBB users should not be affected.
-
-  o Major bugfixes:
-    - Change the default value for DynamicDHGroups (introduced in
-      0.2.3.9-alpha) to 0. This feature can make Tor relays less
-      identifiable by their use of the mod_ssl DH group, but at
-      the cost of some usability (#4721) and bridge tracing (#6087)
-      regressions. Resolves ticket 5598.
-    - Send a CRLF at the end of each STATUS_* control protocol event. This
-      bug tickled a bug in Vidalia which would make it freeze. Fixes
-      bug 6094; bugfix on 0.2.3.16-alpha.
-
-  o Minor bugfixes:
-    - Disable writing on marked-for-close connections when they are
-      blocked on bandwidth, to prevent busy-looping in Libevent. Fixes
-      bug 5263; bugfix on 0.0.2pre13, where we first added a special
-      case for flushing marked connections.
-    - Detect SSL handshake even when the initial attempt to write the
-      server hello fails. Fixes bug 4592; bugfix on 0.2.0.13-alpha.
-    - Change the AllowDotExit rules so they should actually work.
-      We now enforce AllowDotExit only immediately after receiving an
-      address via SOCKS or DNSPort: other sources are free to provide
-      .exit addresses after the resolution occurs. Fixes bug 3940;
-      bugfix on 0.2.2.1-alpha.
-    - Fix a (harmless) integer overflow in cell statistics reported by
-      some fast relays. Fixes bug 5849; bugfix on 0.2.2.1-alpha.
-    - Make sure circuitbuild.c checks LearnCircuitBuildTimeout in all the
-      right places and never depends on the consensus parameters or
-      computes adaptive timeouts when it is disabled. Fixes bug 5049;
-      bugfix on 0.2.2.14-alpha.
-    - When building Tor on Windows with -DUNICODE (not default), ensure
-      that error messages, filenames, and DNS server names are always
-      NUL-terminated when we convert them to a single-byte encoding.
-      Fixes bug 5909; bugfix on 0.2.2.16-alpha.
-    - Make Tor build correctly again with -DUNICODE -D_UNICODE defined.
-      Fixes bug 6097; bugfix on 0.2.2.16-alpha.
-    - Fix an edge case where TestingTorNetwork is set but the authorities
-      and relays all have an uptime of zero, where the private Tor network
-      could briefly lack support for hidden services. Fixes bug 3886;
-      bugfix on 0.2.2.18-alpha.
-    - Correct the manpage's descriptions for the default values of
-      DirReqStatistics and ExtraInfoStatistics. Fixes bug 2865; bugfix
-      on 0.2.3.1-alpha.
-    - Fix the documentation for the --hush and --quiet command line
-      options, which changed their behavior back in 0.2.3.3-alpha.
-    - Fix compilation warning with clang 3.1. Fixes bug 6141; bugfix on
-      0.2.3.11-alpha.
-
-  o Minor features:
-    - Rate-limit the "Weighted bandwidth is 0.000000" message, and add
-      more information to it, so that we can track it down in case it
-      returns again. Mitigates bug 5235.
-    - Check CircuitBuildTimeout and LearnCircuitBuildTimeout in
-      options_validate(); warn if LearnCircuitBuildTimeout is disabled and
-      CircuitBuildTimeout is set unreasonably low. Resolves ticket 5452.
-    - Warn the user when HTTPProxy, but no other proxy type, is
-      configured. This can cause surprising behavior: it doesn't send
-      all of Tor's traffic over the HTTPProxy -- it sends unencrypted
-      directory traffic only. Resolves ticket 4663.
-    - Issue a notice if a guard completes less than 40% of your circuits.
-      Threshold is configurable by torrc option PathBiasNoticeRate and
-      consensus parameter pb_noticepct. There is additional, off-by-
-      default code to disable guards which fail too many circuits.
-      Addresses ticket 5458.
-    - Update to the June 6 2012 Maxmind GeoLite Country database.
-
-  o Code simplifications and refactoring:
-    - Remove validate_pluggable_transports_config(): its warning
-      message is now handled by connection_or_connect().
-
-
-Changes in version 0.2.2.37 - 2012-06-06
-  Tor 0.2.2.37 introduces a workaround for a critical renegotiation
-  bug in OpenSSL 1.0.1 (where 20% of the Tor network can't talk to itself
-  currently).
-
-  o Major bugfixes:
-    - Work around a bug in OpenSSL that broke renegotiation with TLS
-      1.1 and TLS 1.2. Without this workaround, all attempts to speak
-      the v2 Tor connection protocol when both sides were using OpenSSL
-      1.0.1 would fail. Resolves ticket 6033.
-    - When waiting for a client to renegotiate, don't allow it to add
-      any bytes to the input buffer. This fixes a potential DoS issue.
-      Fixes bugs 5934 and 6007; bugfix on 0.2.0.20-rc.
-    - Fix an edge case where if we fetch or publish a hidden service
-      descriptor, we might build a 4-hop circuit and then use that circuit
-      for exiting afterwards -- even if the new last hop doesn't obey our
-      ExitNodes config option. Fixes bug 5283; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes:
-    - Fix a build warning with Clang 3.1 related to our use of vasprintf.
-      Fixes bug 5969. Bugfix on 0.2.2.11-alpha.
-
-  o Minor features:
-    - Tell GCC and Clang to check for any errors in format strings passed
-      to the tor_v*(print|scan)f functions.
-
-
-Changes in version 0.2.3.16-alpha - 2012-06-05
-  Tor 0.2.3.16-alpha introduces a workaround for a critical renegotiation
-  bug in OpenSSL 1.0.1 (where 20% of the Tor network can't talk to itself
-  currently). It also fixes a variety of smaller bugs and other cleanups
-  that get us closer to a release candidate.
-
-  o Major bugfixes (general):
-    - Work around a bug in OpenSSL that broke renegotiation with TLS
-      1.1 and TLS 1.2. Without this workaround, all attempts to speak
-      the v2 Tor connection protocol when both sides were using OpenSSL
-      1.0.1 would fail. Resolves ticket 6033.
-    - When waiting for a client to renegotiate, don't allow it to add
-      any bytes to the input buffer. This fixes a potential DoS issue.
-      Fixes bugs 5934 and 6007; bugfix on 0.2.0.20-rc.
-    - Pass correct OR address to managed proxies (like obfsproxy),
-      even when ORListenAddress is used. Fixes bug 4865; bugfix on
-      0.2.3.9-alpha.
-    - The advertised platform of a router now includes only its operating
-      system's name (e.g., "Linux", "Darwin", "Windows 7"), and not its
-      service pack level (for Windows) or its CPU architecture (for Unix).
-      We also no longer include the "git-XYZ" tag in the version. Resolves
-      part of bug 2988.
-
-  o Major bugfixes (clients):
-    - If we are unable to find any exit that supports our predicted ports,
-      stop calling them predicted, so that we don't loop and build
-      hopeless circuits indefinitely. Fixes bug 3296; bugfix on 0.0.9pre6,
-      which introduced predicted ports.
-    - Fix an edge case where if we fetch or publish a hidden service
-      descriptor, we might build a 4-hop circuit and then use that circuit
-      for exiting afterwards -- even if the new last hop doesn't obey our
-      ExitNodes config option. Fixes bug 5283; bugfix on 0.2.0.10-alpha.
-    - Check at each new consensus whether our entry guards were picked
-      long enough ago that we should rotate them. Previously, we only
-      did this check at startup, which could lead to us holding a guard
-      indefinitely. Fixes bug 5380; bugfix on 0.2.1.14-rc.
-    - When fetching a bridge descriptor from a bridge authority,
-      always do so anonymously, whether we have been able to open
-      circuits or not. Partial fix for bug 1938; bugfix on 0.2.0.7-alpha.
-      This behavior makes it *safer* to use UpdateBridgesFromAuthority,
-      but we'll need to wait for bug 6010 before it's actually usable.
-
-  o Major bugfixes (directory authorities):
-    - When computing weight parameters, behave more robustly in the
-      presence of a bad bwweightscale value. Previously, the authorities
-      would crash if they agreed on a sufficiently broken weight_scale
-      value: now, they use a reasonable default and carry on. Partial
-      fix for 5786; bugfix on 0.2.2.17-alpha.
-    - Check more thoroughly to prevent a rogue authority from
-      double-voting on any consensus directory parameter. Previously,
-      authorities would crash in this case if the total number of
-      votes for any parameter exceeded the number of active voters,
-      but would let it pass otherwise. Partial fix for bug 5786; bugfix
-      on 0.2.2.2-alpha.
-
-  o Minor features:
-    - Rate-limit log messages when asked to connect anonymously to
-      a private address. When these hit, they tended to hit fast and
-      often. Also, don't bother trying to connect to addresses that we
-      are sure will resolve to 127.0.0.1: getting 127.0.0.1 in a directory
-      reply makes us think we have been lied to, even when the address the
-      client tried to connect to was "localhost." Resolves ticket 2822.
-    - Allow packagers to insert an extra string in server descriptor
-      platform lines by setting the preprocessor variable TOR_BUILD_TAG.
-      Resolves the rest of ticket 2988.
-    - Raise the threshold of server descriptors needed (75%) and exit
-      server descriptors needed (50%) before we will declare ourselves
-      bootstrapped. This will make clients start building circuits a
-      little later, but makes the initially constructed circuits less
-      skewed and less in conflict with further directory fetches. Fixes
-      ticket 3196.
-    - Close any connection that sends unrecognized junk before the
-      handshake. Solves an issue noted in bug 4369.
-    - Improve log messages about managed transports. Resolves ticket 5070.
-    - Tag a bridge's descriptor as "never to be sent unencrypted".
-      This shouldn't matter, since bridges don't open non-anonymous
-      connections to the bridge authority and don't allow unencrypted
-      directory connections from clients, but we might as well make
-      sure. Closes bug 5139.
-    - Expose our view of whether we have gone dormant to the controller,
-      via a new "GETINFO dormant" value. Torbutton and other controllers
-      can use this to avoid doing periodic requests through Tor while
-      it's dormant (bug 4718). Fixes bug 5954.
-    - Tell GCC and Clang to check for any errors in format strings passed
-      to the tor_v*(print|scan)f functions.
-    - Update to the May 1 2012 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (already included in 0.2.2.36):
-    - Reject out-of-range times like 23:59:61 in parse_rfc1123_time().
-      Fixes bug 5346; bugfix on 0.0.8pre3.
-    - Correct parsing of certain date types in parse_http_time().
-      Without this patch, If-Modified-Since would behave
-      incorrectly. Fixes bug 5346; bugfix on 0.2.0.2-alpha. Patch from
-      Esteban Manchado Velázques.
-    - Make our number-parsing functions always treat too-large values
-      as an error, even when those values exceed the width of the
-      underlying type. Previously, if the caller provided these
-      functions with minima or maxima set to the extreme values of the
-      underlying integer type, these functions would return those
-      values on overflow rather than treating overflow as an error.
-      Fixes part of bug 5786; bugfix on 0.0.9.
-    - If we hit the error case where routerlist_insert() replaces an
-      existing (old) server descriptor, make sure to remove that
-      server descriptor from the old_routers list. Fix related to bug
-      1776. Bugfix on 0.2.2.18-alpha.
-    - Clarify the behavior of MaxCircuitDirtiness with hidden service
-      circuits. Fixes issue 5259.
-
-  o Minor bugfixes (coding cleanup, on 0.2.2.x and earlier):
-    - Prevent a null-pointer dereference when receiving a data cell
-      for a nonexistent stream when the circuit in question has an
-      empty deliver window. We don't believe this is triggerable,
-      since we don't currently allow deliver windows to become empty,
-      but the logic is tricky enough that it's better to make the code
-      robust. Fixes bug 5541; bugfix on 0.0.2pre14.
-    - Fix a memory leak when trying to launch a DNS request when the
-      network is disabled or the nameservers are unconfigurable. Fixes
-      bug 5916; bugfix on Tor 0.1.2.1-alpha (for the unconfigurable
-      nameserver case) and on 0.2.3.9-alpha (for the DisableNetwork case).
-    - Don't hold a Windows file handle open for every file mapping;
-      the file mapping handle is sufficient. Fixes bug 5951; bugfix on
-      0.1.2.1-alpha.
-    - Avoid O(n^2) performance characteristics when parsing a large
-      extrainfo cache. Fixes bug 5828; bugfix on 0.2.0.1-alpha.
-    - Format more doubles with %f, not %lf. Patch from grarpamp to make
-      Tor build correctly on older BSDs again. Fixes bug 3894; bugfix on
-      Tor 0.2.0.8-alpha.
-    - Make our replacement implementation of strtok_r() compatible with
-      the standard behavior of strtok_r(). Patch by nils. Fixes bug 5091;
-      bugfix on 0.2.2.1-alpha.
-    - Fix a NULL-pointer dereference on a badly formed
-      SETCIRCUITPURPOSE command. Found by mikeyc. Fixes bug 5796;
-      bugfix on 0.2.2.9-alpha.
-    - Fix a build warning with Clang 3.1 related to our use of vasprintf.
-      Fixes bug 5969. Bugfix on 0.2.2.11-alpha.
-    - Defensively refactor rend_mid_rendezvous() so that protocol
-      violations and length checks happen in the beginning. Fixes
-      bug 5645.
-    - Set _WIN32_WINNT to 0x0501 consistently throughout the code, so
-      that IPv6 stuff will compile on MSVC, and compilation issues
-      will be easier to track down. Fixes bug 5861.
-
-  o Minor bugfixes (correctness, on 0.2.2.x and earlier):
-    - Exit nodes now correctly report EADDRINUSE and EADDRNOTAVAIL as
-      resource exhaustion, so that clients can adjust their load to
-      try other exits. Fixes bug 4710; bugfix on 0.1.0.1-rc, which
-      started using END_STREAM_REASON_RESOURCELIMIT.
-    - Don't check for whether the address we're using for outbound
-      connections has changed until after the outbound connection has
-      completed. On Windows, getsockname() doesn't succeed until the
-      connection is finished. Fixes bug 5374; bugfix on 0.1.1.14-alpha.
-    - If the configuration tries to set MyFamily on a bridge, refuse to
-      do so, and warn about the security implications. Fixes bug 4657;
-      bugfix on 0.2.0.3-alpha.
-    - If the client fails to set a reasonable set of ciphersuites
-      during its v2 handshake renegotiation, allow the renegotiation to
-      continue nevertheless (i.e. send all the required certificates).
-      Fixes bug 4591; bugfix on 0.2.0.20-rc.
-    - When we receive a SIGHUP and the controller __ReloadTorrcOnSIGHUP
-      option is set to 0 (which Vidalia version 0.2.16 now does when
-      a SAVECONF attempt fails), perform other actions that SIGHUP
-      usually causes (like reopening the logs). Fixes bug 5095; bugfix
-      on 0.2.1.9-alpha.
-    - If we fail to write a microdescriptor to the disk cache, do not
-      continue replacing the old microdescriptor file. Fixes bug 2954;
-      bugfix on 0.2.2.6-alpha.
-    - Exit nodes don't need to fetch certificates for authorities that
-      they don't recognize; only directory authorities, bridges,
-      and caches need to do that. Fixes part of bug 2297; bugfix on
-      0.2.2.11-alpha.
-    - Correctly handle checking the permissions on the parent
-      directory of a control socket in the root directory. Bug found
-      by Esteban Manchado Velázquez. Fixes bug 5089; bugfix on Tor
-      0.2.2.26-beta.
-    - When told to add a bridge with the same digest as a preexisting
-      bridge but a different addr:port, change the addr:port as
-      requested. Previously we would not notice the change. Fixes half
-      of bug 5603; fix on 0.2.2.26-beta.
-    - End AUTHCHALLENGE error messages (in the control protocol) with
-      a CRLF. Fixes bug 5760; bugfix on 0.2.2.36 and 0.2.3.13-alpha.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - Turn an assertion (that the number of handshakes received as a
-      server is not < 1) into a warning. Fixes bug 4873; bugfix on
-      0.2.3.1-alpha.
-    - Format IPv4 addresses correctly in ADDRMAP events. (Previously,
-      we had reversed them when the answer was cached.) Fixes bug
-      5723; bugfix on 0.2.3.1-alpha.
-    - Work correctly on Linux systems with accept4 support advertised in
-      their headers, but without accept4 support in the kernel. Fix
-      by murb. Fixes bug 5762; bugfix on 0.2.3.1-alpha.
-    - When told to add a bridge with the same addr:port as a preexisting
-      bridge but a different transport, change the transport as
-      requested. Previously we would not notice the change. Fixes half
-      of bug 5603; fix on 0.2.3.2-alpha.
-    - Avoid a "double-reply" warning when replying to a SOCKS request
-      with a parse error. Patch from Fabian Keil. Fixes bug 4108;
-      bugfix on 0.2.3.4-alpha.
-    - Fix a bug where a bridge authority crashes if it has seen no
-      directory requests when it's time to write statistics to disk.
-      Fixes bug 5891; bugfix on 0.2.3.6-alpha. Also fixes bug 5508 in
-      a better way.
-    - Don't try to open non-control listeners when DisableNetwork is set.
-      Previously, we'd open all listeners, then immediately close them.
-      Fixes bug 5604; bugfix on 0.2.3.9-alpha.
-    - Don't abort the managed proxy protocol if the managed proxy
-      sends us an unrecognized line; ignore it instead. Fixes bug
-      5910; bugfix on 0.2.3.9-alpha.
-    - Fix a compile warning in crypto.c when compiling with clang 3.1.
-      Fixes bug 5969, bugfix on 0.2.3.9-alpha.
-    - Fix a compilation issue on GNU Hurd, which doesn't have PATH_MAX.
-      Fixes bug 5355; bugfix on 0.2.3.11-alpha.
-    - Remove bogus definition of "_WIN32" from src/win32/orconfig.h, to
-      unbreak the MSVC build. Fixes bug 5858; bugfix on 0.2.3.12-alpha.
-    - Resolve numerous small warnings and build issues with MSVC. Resolves
-      bug 5859.
-
-  o Documentation fixes:
-    - Improve the manual's documentation for the NT Service command-line
-      options. Addresses ticket 3964.
-    - Clarify SessionGroup documentation slightly; resolves ticket 5437.
-    - Document the changes to the ORPort and DirPort options, and the
-      fact that {OR/Dir}ListenAddress is now unnecessary (and
-      therefore deprecated). Resolves ticket 5597.
-
-  o Removed files:
-    - Remove the torrc.bridge file: we don't use it for anything, and
-      it had become badly desynchronized from torrc.sample. Resolves
-      bug 5622.
-
-
-Changes in version 0.2.2.36 - 2012-05-24
-  Tor 0.2.2.36 updates the addresses for two of the eight directory
-  authorities, fixes some potential anonymity and security issues,
-  and fixes several crash bugs.
-
-  Tor 0.2.1.x has reached its end-of-life. Those Tor versions have many
-  known flaws, and nobody should be using them. You should upgrade. If
-  you're using a Linux or BSD and its packages are obsolete, stop using
-  those packages and upgrade anyway.
-
-  o Directory authority changes:
-    - Change IP address for maatuska (v3 directory authority).
-    - Change IP address for ides (v3 directory authority), and rename
-      it to turtles.
-
-  o Security fixes:
-    - When building or running with any version of OpenSSL earlier
-      than 0.9.8s or 1.0.0f, disable SSLv3 support. These OpenSSL
-      versions have a bug (CVE-2011-4576) in which their block cipher
-      padding includes uninitialized data, potentially leaking sensitive
-      information to any peer with whom they make a SSLv3 connection. Tor
-      does not use SSL v3 by default, but a hostile client or server
-      could force an SSLv3 connection in order to gain information that
-      they shouldn't have been able to get. The best solution here is to
-      upgrade to OpenSSL 0.9.8s or 1.0.0f (or later). But when building
-      or running with a non-upgraded OpenSSL, we disable SSLv3 entirely
-      to make sure that the bug can't happen.
-    - Never use a bridge or a controller-supplied node as an exit, even
-      if its exit policy allows it. Found by wanoskarnet. Fixes bug
-      5342. Bugfix on 0.1.1.15-rc (for controller-purpose descriptors)
-      and 0.2.0.3-alpha (for bridge-purpose descriptors).
-    - Only build circuits if we have a sufficient threshold of the total
-      descriptors that are marked in the consensus with the "Exit"
-      flag. This mitigates an attack proposed by wanoskarnet, in which
-      all of a client's bridges collude to restrict the exit nodes that
-      the client knows about. Fixes bug 5343.
-    - Provide controllers with a safer way to implement the cookie
-      authentication mechanism. With the old method, if another locally
-      running program could convince a controller that it was the Tor
-      process, then that program could trick the controller into telling
-      it the contents of an arbitrary 32-byte file. The new "SAFECOOKIE"
-      authentication method uses a challenge-response approach to prevent
-      this attack. Fixes bug 5185; implements proposal 193.
-
-  o Major bugfixes:
-    - Avoid logging uninitialized data when unable to decode a hidden
-      service descriptor cookie. Fixes bug 5647; bugfix on 0.2.1.5-alpha.
-    - Avoid a client-side assertion failure when receiving an INTRODUCE2
-      cell on a general purpose circuit. Fixes bug 5644; bugfix on
-      0.2.1.6-alpha.
-    - Fix builds when the path to sed, openssl, or sha1sum contains
-      spaces, which is pretty common on Windows. Fixes bug 5065; bugfix
-      on 0.2.2.1-alpha.
-    - Correct our replacements for the timeradd() and timersub() functions
-      on platforms that lack them (for example, Windows). The timersub()
-      function is used when expiring circuits, while timeradd() is
-      currently unused. Bug report and patch by Vektor. Fixes bug 4778;
-      bugfix on 0.2.2.24-alpha.
-    - Fix the SOCKET_OK test that we use to tell when socket
-      creation fails so that it works on Win64. Fixes part of bug 4533;
-      bugfix on 0.2.2.29-beta. Bug found by wanoskarnet.
-
-  o Minor bugfixes:
-    - Reject out-of-range times like 23:59:61 in parse_rfc1123_time().
-      Fixes bug 5346; bugfix on 0.0.8pre3.
-    - Make our number-parsing functions always treat too-large values
-      as an error, even when those values exceed the width of the
-      underlying type. Previously, if the caller provided these
-      functions with minima or maxima set to the extreme values of the
-      underlying integer type, these functions would return those
-      values on overflow rather than treating overflow as an error.
-      Fixes part of bug 5786; bugfix on 0.0.9.
-    - Older Linux kernels erroneously respond to strange nmap behavior
-      by having accept() return successfully with a zero-length
-      socket. When this happens, just close the connection. Previously,
-      we would try harder to learn the remote address: but there was
-      no such remote address to learn, and our method for trying to
-      learn it was incorrect. Fixes bugs 1240, 4745, and 4747. Bugfix
-      on 0.1.0.3-rc. Reported and diagnosed by "r1eo".
-    - Correct parsing of certain date types in parse_http_time().
-      Without this patch, If-Modified-Since would behave
-      incorrectly. Fixes bug 5346; bugfix on 0.2.0.2-alpha. Patch from
-      Esteban Manchado Velázques.
-    - Change the BridgePassword feature (part of the "bridge community"
-      design, which is not yet implemented) to use a time-independent
-      comparison. The old behavior might have allowed an adversary
-      to use timing to guess the BridgePassword value. Fixes bug 5543;
-      bugfix on 0.2.0.14-alpha.
-    - Detect and reject certain misformed escape sequences in
-      configuration values. Previously, these values would cause us
-      to crash if received in a torrc file or over an authenticated
-      control port. Bug found by Esteban Manchado Velázquez, and
-      independently by Robert Connolly from Matta Consulting who further
-      noted that it allows a post-authentication heap overflow. Patch
-      by Alexander Schrijver. Fixes bugs 5090 and 5402 (CVE 2012-1668);
-      bugfix on 0.2.0.16-alpha.
-    - Fix a compile warning when using the --enable-openbsd-malloc
-      configure option. Fixes bug 5340; bugfix on 0.2.0.20-rc.
-    - During configure, detect when we're building with clang version
-      3.0 or lower and disable the -Wnormalized=id and -Woverride-init
-      CFLAGS. clang doesn't support them yet.
-    - When sending an HTTP/1.1 proxy request, include a Host header.
-      Fixes bug 5593; bugfix on 0.2.2.1-alpha.
-    - Fix a NULL-pointer dereference on a badly formed SETCIRCUITPURPOSE
-      command. Found by mikeyc. Fixes bug 5796; bugfix on 0.2.2.9-alpha.
-    - If we hit the error case where routerlist_insert() replaces an
-      existing (old) server descriptor, make sure to remove that
-      server descriptor from the old_routers list. Fix related to bug
-      1776. Bugfix on 0.2.2.18-alpha.
-
-  o Minor bugfixes (documentation and log messages):
-    - Fix a typo in a log message in rend_service_rendezvous_has_opened().
-      Fixes bug 4856; bugfix on Tor 0.0.6.
-    - Update "ClientOnly" man page entry to explain that there isn't
-      really any point to messing with it. Resolves ticket 5005.
-    - Document the GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays
-      directory authority option (introduced in Tor 0.2.2.34).
-    - Downgrade the "We're missing a certificate" message from notice
-      to info: people kept mistaking it for a real problem, whereas it
-      is seldom the problem even when we are failing to bootstrap. Fixes
-      bug 5067; bugfix on 0.2.0.10-alpha.
-    - Correctly spell "connect" in a log message on failure to create a
-      controlsocket. Fixes bug 4803; bugfix on 0.2.2.26-beta.
-    - Clarify the behavior of MaxCircuitDirtiness with hidden service
-      circuits. Fixes issue 5259.
-
-  o Minor features:
-    - Directory authorities now reject versions of Tor older than
-      0.2.1.30, and Tor versions between 0.2.2.1-alpha and 0.2.2.20-alpha
-      inclusive. These versions accounted for only a small fraction of
-      the Tor network, and have numerous known security issues. Resolves
-      issue 4788.
-    - Update to the May 1 2012 Maxmind GeoLite Country database.
-
-  - Feature removal:
-    - When sending or relaying a RELAY_EARLY cell, we used to convert
-      it to a RELAY cell if the connection was using the v1 link
-      protocol. This was a workaround for older versions of Tor, which
-      didn't handle RELAY_EARLY cells properly. Now that all supported
-      versions can handle RELAY_EARLY cells, and now that we're enforcing
-      the "no RELAY_EXTEND commands except in RELAY_EARLY cells" rule,
-      remove this workaround. Addresses bug 4786.
-
-
-Changes in version 0.2.3.15-alpha - 2012-04-30
-  Tor 0.2.3.15-alpha fixes a variety of smaller bugs, including making
-  the development branch build on Windows again.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Make sure that there are no unhandled pending TLS errors before
-      reading from a TLS stream. We had checks in 0.1.0.3-rc, but
-      lost them in 0.1.0.5-rc when we refactored read_to_buf_tls().
-      Bugfix on 0.1.0.5-rc; fixes bug 4528.
-    - Fix an assert that directory authorities could trigger on sighup
-      during some configuration state transitions. We now don't treat
-      it as a fatal error when the new descriptor we just generated in
-      init_keys() isn't accepted. Fixes bug 4438; bugfix on 0.2.1.9-alpha.
-    - After we pick a directory mirror, we would refuse to use it if
-      it's in our ExcludeExitNodes list, resulting in mysterious failures
-      to bootstrap for people who just wanted to avoid exiting from
-      certain locations. Fixes bug 5623; bugfix on 0.2.2.25-alpha.
-    - When building with --enable-static-tor on OpenBSD, do not
-      erroneously attempt to link -lrt. Fixes bug 5103.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - When Tor is built with kernel headers from a recent (last few
-      years) Linux kernel, do not fail to run on older (pre-2.6.28
-      Linux kernels). Fixes bug 5112; bugfix on 0.2.3.1-alpha.
-    - Fix cross-compilation issues with mingw. Bugfixes on 0.2.3.6-alpha
-      and 0.2.3.12-alpha.
-    - Fix compilation with miniupnpc version 1.6; patch from
-      Anthony G. Basile. Fixes bug 5434; bugfix on 0.2.3.12-alpha.
-    - Fix compilation with MSVC, which had defined MS_WINDOWS. Bugfix
-      on 0.2.3.13-alpha; found and fixed by Gisle Vanem.
-    - Fix compilation on platforms without unistd.h, or where environ
-      is defined in stdlib.h. Fixes bug 5704; bugfix on 0.2.3.13-alpha.
-
-  o Minor features:
-    - Directory authorities are now a little more lenient at accepting
-      older router descriptors, or newer router descriptors that don't
-      make big changes. This should help ameliorate past and future
-      issues where routers think they have uploaded valid descriptors,
-      but the authorities don't think so. Fix for ticket 2479.
-    - Make the code that clients use to detect an address change be
-      IPv6-aware, so that it won't fill clients' logs with error
-      messages when trying to get the IPv4 address of an IPv6
-      connection. Implements ticket 5537.
-
-  o Removed features:
-    - Remove the GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays option;
-      authorities needed to use it for a while to keep the network working
-      as people upgraded to 0.2.1.31, 0.2.2.34, or 0.2.3.6-alpha, but
-      that was six months ago. As of now, it should no longer be needed
-      or used.
-
-
-Changes in version 0.2.3.14-alpha - 2012-04-23
-  Tor 0.2.3.14-alpha fixes yet more bugs to get us closer to a release
-  candidate. It also dramatically speeds up AES: fast relays should
-  consider switching to the newer OpenSSL library.
-
-  o Directory authority changes:
-    - Change IP address for ides (v3 directory authority), and rename
-      it to turtles.
-
-  o Major bugfixes:
-    - Avoid logging uninitialized data when unable to decode a hidden
-      service descriptor cookie. Fixes bug 5647; bugfix on 0.2.1.5-alpha.
-    - Avoid a client-side assertion failure when receiving an INTRODUCE2
-      cell on a general purpose circuit. Fixes bug 5644; bugfix on
-      0.2.1.6-alpha.
-    - If authorities are unable to get a v2 consensus document from other
-      directory authorities, they no longer fall back to fetching
-      them from regular directory caches. Fixes bug 5635; bugfix on
-      0.2.2.26-beta, where routers stopped downloading v2 consensus
-      documents entirely.
-    - When we start a Tor client with a normal consensus already cached,
-      be willing to download a microdescriptor consensus. Fixes bug 4011;
-      fix on 0.2.3.1-alpha.
-
-  o Major features (performance):
-    - When built to use OpenSSL 1.0.1, and built for an x86 or x86_64
-      instruction set, take advantage of OpenSSL's AESNI, bitsliced, or
-      vectorized AES implementations as appropriate. These can be much,
-      much faster than other AES implementations.
-
-  o Minor bugfixes (0.2.2.x and earlier):
-    - Don't launch more than 10 service-side introduction-point circuits
-      for a hidden service in five minutes. Previously, we would consider
-      launching more introduction-point circuits if at least one second
-      had passed without any introduction-point circuits failing. Fixes
-      bug 4607; bugfix on 0.0.7pre1.
-    - Change the BridgePassword feature (part of the "bridge community"
-      design, which is not yet implemented) to use a time-independent
-      comparison. The old behavior might have allowed an adversary
-      to use timing to guess the BridgePassword value. Fixes bug 5543;
-      bugfix on 0.2.0.14-alpha.
-    - Enforce correct return behavior of tor_vsscanf() when the '%%'
-      pattern is used. Fixes bug 5558. Bugfix on 0.2.1.13.
-    - When sending an HTTP/1.1 proxy request, include a Host header.
-      Fixes bug 5593; bugfix on 0.2.2.1-alpha.
-    - Don't log that we have "decided to publish new relay descriptor"
-      unless we are actually publishing a descriptor. Fixes bug 3942;
-      bugfix on 0.2.2.28-beta.
-
-  o Minor bugfixes (0.2.3.x):
-    - Fix a bug where a bridge authority crashes (on a failed assert)
-      if it has seen no directory requests when it's time to write
-      statistics to disk. Fixes bug 5508. Bugfix on 0.2.3.6-alpha.
-    - Fix bug stomping on ORPort option NoListen and ignoring option
-      NoAdvertise. Fixes bug 5151; bugfix on 0.2.3.9-alpha.
-    - In the testsuite, provide a large enough buffer in the tor_sscanf
-      unit test. Otherwise we'd overrun that buffer and crash during
-      the unit tests. Found by weasel. Fixes bug 5449; bugfix on
-      0.2.3.12-alpha.
-    - Make sure we create the keys directory if it doesn't exist and we're
-      about to store the dynamic Diffie-Hellman parameters. Fixes bug
-      5572; bugfix on 0.2.3.13-alpha.
-    - Fix a small memory leak when trying to decode incorrect base16
-      authenticator during SAFECOOKIE authentication. Found by
-      Coverity Scan. Fixes CID 507. Bugfix on 0.2.3.13-alpha.
-
-  o Minor features:
-    - Add more information to a log statement that might help track down
-      bug 4091. If you're seeing "Bug: tor_addr_is_internal() called with a
-      non-IP address" messages (or any Bug messages, for that matter!),
-      please let us know about it.
-    - Relays now understand an IPv6 address when they get one from a
-      directory server. Resolves ticket 4875.
-    - Resolve IPv6 addresses in bridge and entry statistics to country
-      code "??" which means we at least count them. Resolves ticket 5053;
-      improves on 0.2.3.9-alpha.
-    - Update to the April 3 2012 Maxmind GeoLite Country database.
-    - Begin a doc/state-contents.txt file to explain the contents of
-      the Tor state file. Fixes bug 2987.
-
-  o Default torrc changes:
-    - Stop listing "socksport 9050" in torrc.sample. We open a socks
-      port on 9050 by default anyway, so this should not change anything
-      in practice.
-    - Stop mentioning the deprecated *ListenAddress options in
-      torrc.sample. Fixes bug 5438.
-    - Document unit of bandwidth related options in sample torrc.
-      Fixes bug 5621.
-
-  o Removed features:
-    - The "torify" script no longer supports the "tsocks" socksifier
-      tool, since tsocks doesn't support DNS and UDP right for Tor.
-      Everyone should be using torsocks instead. Fixes bugs 3530 and
-      5180. Based on a patch by "ugh".
-
-  o Code refactoring:
-    - Change the symmetric cipher interface so that creating and
-      initializing a stream cipher are no longer separate functions.
-    - Remove all internal support for unpadded RSA. We never used it, and
-      it would be a bad idea to start.
-
-
-Changes in version 0.2.3.13-alpha - 2012-03-26
-  Tor 0.2.3.13-alpha fixes a variety of stability and correctness bugs
-  in managed pluggable transports, as well as providing other cleanups
-  that get us closer to a release candidate.
-
-  o Directory authority changes:
-    - Change IP address for maatuska (v3 directory authority).
-
-  o Security fixes:
-    - Provide controllers with a safer way to implement the cookie
-      authentication mechanism. With the old method, if another locally
-      running program could convince a controller that it was the Tor
-      process, then that program could trick the controller into telling
-      it the contents of an arbitrary 32-byte file. The new "SAFECOOKIE"
-      authentication method uses a challenge-response approach to prevent
-      this attack. Fixes bug 5185, implements proposal 193.
-    - Never use a bridge or a controller-supplied node as an exit, even
-      if its exit policy allows it. Found by wanoskarnet. Fixes bug
-      5342. Bugfix on 0.1.1.15-rc (for controller-purpose descriptors)
-      and 0.2.0.3-alpha (for bridge-purpose descriptors).
-    - Only build circuits if we have a sufficient threshold of the total
-      descriptors that are marked in the consensus with the "Exit"
-      flag. This mitigates an attack proposed by wanoskarnet, in which
-      all of a client's bridges collude to restrict the exit nodes that
-      the client knows about. Fixes bug 5343.
-
-  o Major bugfixes (on Tor 0.2.3.x):
-    - Avoid an assert when managed proxies like obfsproxy are configured,
-      and we receive HUP signals or setconf attempts too rapidly. This
-      situation happens most commonly when Vidalia tries to attach to
-      Tor or tries to configure the Tor it's attached to. Fixes bug 5084;
-      bugfix on 0.2.3.6-alpha.
-    - Fix a relay-side pluggable transports bug where managed proxies were
-      unreachable from the Internet, because Tor asked them to bind on
-      localhost. Fixes bug 4725; bugfix on 0.2.3.9-alpha.
-    - Stop discarding command-line arguments when TestingTorNetwork
-      is set. Discovered by Kevin Bauer. Fixes bug 5373; bugfix on
-      0.2.3.9-alpha, where task 4552 added support for two layers of
-      torrc files.
-    - Resume allowing the unit tests to run in gdb. This was accidentally
-      made impossible when the DisableDebuggerAttachment option was
-      introduced. Fixes bug 5448; bugfix on 0.2.3.9-alpha.
-    - Resume building with nat-pmp support. Fixes bug 4955; bugfix on
-      0.2.3.11-alpha. Reported by Anthony G. Basile.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Ensure we don't cannibalize circuits that are longer than three hops
-      already, so we don't end up making circuits with 5 or more
-      hops. Patch contributed by wanoskarnet. Fixes bug 5231; bugfix on
-      0.1.0.1-rc which introduced cannibalization.
-    - Detect and reject certain misformed escape sequences in
-      configuration values. Previously, these values would cause us
-      to crash if received in a torrc file or over an authenticated
-      control port. Bug found by Esteban Manchado Velázquez, and
-      independently by Robert Connolly from Matta Consulting who further
-      noted that it allows a post-authentication heap overflow. Patch
-      by Alexander Schrijver. Fixes bugs 5090 and 5402 (CVE 2012-1668);
-      bugfix on 0.2.0.16-alpha.
-    - Fix a compile warning when using the --enable-openbsd-malloc
-      configure option. Fixes bug 5340; bugfix on 0.2.0.20-rc.
-    - Directory caches no longer refuse to clean out descriptors because
-      of missing v2 networkstatus documents, unless they're configured
-      to retrieve v2 networkstatus documents. Fixes bug 4838; bugfix on
-      0.2.2.26-beta. Patch by Daniel Bryg.
-    - Update to the latest version of the tinytest unit testing framework.
-      This includes a couple of bugfixes that can be relevant for
-      running forked unit tests on Windows, and removes all reserved
-      identifiers.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - On a failed pipe() call, don't leak file descriptors. Fixes bug
-      4296; bugfix on 0.2.3.1-alpha.
-    - Spec conformance: on a v3 handshake, do not send a NETINFO cell
-      until after we have received a CERTS cell. Fixes bug 4361; bugfix
-      on 0.2.3.6-alpha. Patch by "frosty".
-    - When binding to an IPv6 address, set the IPV6_V6ONLY socket
-      option, so that the IP stack doesn't decide to use it for IPv4
-      too. Fixes bug 4760; bugfix on 0.2.3.9-alpha.
-    - Ensure that variables set in Tor's environment cannot override
-      environment variables that Tor passes to a managed
-      pluggable-transport proxy. Previously, Tor would pass every
-      variable in its environment to managed proxies along with the new
-      ones, in such a way that on many operating systems, the inherited
-      environment variables would override those which Tor tried to
-      explicitly set. Bugfix on 0.2.3.12-alpha for most Unixoid systems;
-      bugfix on 0.2.3.9-alpha for Windows.
-
-  o Minor features:
-    - A wide variety of new unit tests by Esteban Manchado Velázquez.
-    - Shorten links in the tor-exit-notice file. Patch by Christian Kujau.
-    - Update to the March 6 2012 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.3.12-alpha - 2012-02-13
-  Tor 0.2.3.12-alpha lets fast exit relays scale better, allows clients
-  to use bridges that run Tor 0.2.2.x, and resolves several big bugs
-  when Tor is configured to use a pluggable transport like obfsproxy.
-
-  o Major bugfixes:
-    - Fix builds when the path to sed, openssl, or sha1sum contains
-      spaces, which is pretty common on Windows. Fixes bug 5065; bugfix
-      on 0.2.2.1-alpha.
-    - Set the SO_REUSEADDR socket option before we call bind() on outgoing
-      connections. This change should allow busy exit relays to stop
-      running out of available sockets as quickly. Fixes bug 4950;
-      bugfix on 0.2.2.26-beta.
-    - Allow 0.2.3.x clients to use 0.2.2.x bridges. Previously the client
-      would ask the bridge for microdescriptors, which are only supported
-      in 0.2.3.x, and then fail to bootstrap when it didn't get the
-      answers it wanted. Fixes bug 4013; bugfix on 0.2.3.2-alpha.
-    - Properly set up obfsproxy's environment when in managed mode. The
-      Tor Browser Bundle needs LD_LIBRARY_PATH to be passed to obfsproxy,
-      and when you run your Tor as a daemon, there's no HOME. Fixes bugs
-      5076 and 5082; bugfix on 0.2.3.6-alpha.
-
-  o Minor features:
-    - Use the dead_strip option when building Tor on OS X. This reduces
-      binary size by almost 19% when linking openssl and libevent
-      statically, which we do for Tor Browser Bundle.
-    - Fix broken URLs in the sample torrc file, and tell readers about
-      the OutboundBindAddress, ExitPolicyRejectPrivate, and
-      PublishServerDescriptor options. Addresses bug 4652.
-    - Update to the February 7 2012 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Downgrade the "We're missing a certificate" message from notice
-      to info: people kept mistaking it for a real problem, whereas it
-      is seldom the problem even when we are failing to bootstrap. Fixes
-      bug 5067; bugfix on 0.2.0.10-alpha.
-    - Don't put "TOR_PT_EXTENDED_SERVER_PORT=127.0.0.1:4200" in a
-      managed pluggable transport server proxy's environment.
-      Previously, we would put it there, even though Tor doesn't
-      implement an 'extended server port' yet, and even though Tor
-      almost certainly isn't listening at that address. For now, we set
-      it to an empty string to avoid crashing older obfsproxies. Bugfix
-      on 0.2.3.6-alpha.
-    - Log the heartbeat message every HeartbeatPeriod seconds, not every
-      HeartbeatPeriod + 1 seconds. Fixes bug 4942; bugfix on
-      0.2.3.1-alpha. Bug reported by Scott Bennett.
-    - Calculate absolute paths correctly on Windows. Fixes bug 4973;
-      bugfix on 0.2.3.11-alpha.
-    - Update "ClientOnly" man page entry to explain that there isn't
-      really any point to messing with it. Resolves ticket 5005.
-    - Use the correct CVE number for CVE-2011-4576 in our comments and
-      log messages. Found by "fermenthor". Resolves bug 5066; bugfix on
-      0.2.3.11-alpha.
-
-  o Code simplifications and refactoring:
-    - Use the _WIN32 macro throughout our code to detect Windows.
-      (Previously we had used the obsolete 'WIN32' and the idiosyncratic
-      'MS_WINDOWS'.)
-
-
-Changes in version 0.2.3.11-alpha - 2012-01-22
-  Tor 0.2.3.11-alpha marks feature-freeze for the 0.2.3 tree. It deploys
-  the last step of the plan to limit maximum circuit length, includes
-  a wide variety of hidden service performance and correctness fixes,
-  works around an OpenSSL security flaw if your distro is too stubborn
-  to upgrade, and fixes a bunch of smaller issues.
-
-  o Major features:
-    - Now that Tor 0.2.0.x is completely deprecated, enable the final
-      part of "Proposal 110: Avoiding infinite length circuits" by
-      refusing all circuit-extend requests that do not use a relay_early
-      cell. This change helps Tor resist a class of denial-of-service
-      attacks by limiting the maximum circuit length.
-    - Adjust the number of introduction points that a hidden service
-      will try to maintain based on how long its introduction points
-      remain in use and how many introductions they handle. Fixes
-      part of bug 3825.
-    - Try to use system facilities for enumerating local interface
-      addresses, before falling back to our old approach (which was
-      binding a UDP socket, and calling getsockname() on it). That
-      approach was scaring OS X users whose draconian firewall
-      software warned about binding to UDP sockets, regardless of
-      whether packets were sent. Now we try to use getifaddrs(),
-      SIOCGIFCONF, or GetAdaptersAddresses(), depending on what the
-      system supports. Resolves ticket 1827.
-
-  o Major security workaround:
-    - When building or running with any version of OpenSSL earlier
-      than 0.9.8s or 1.0.0f, disable SSLv3 support. These OpenSSL
-      versions have a bug (CVE-2011-4576) in which their block cipher
-      padding includes uninitialized data, potentially leaking sensitive
-      information to any peer with whom they make a SSLv3 connection. Tor
-      does not use SSL v3 by default, but a hostile client or server
-      could force an SSLv3 connection in order to gain information that
-      they shouldn't have been able to get. The best solution here is to
-      upgrade to OpenSSL 0.9.8s or 1.0.0f (or later). But when building
-      or running with a non-upgraded OpenSSL, we disable SSLv3 entirely
-      to make sure that the bug can't happen.
-
-  o Major bugfixes:
-    - Fix the SOCKET_OK test that we use to tell when socket
-      creation fails so that it works on Win64. Fixes part of bug 4533;
-      bugfix on 0.2.2.29-beta. Bug found by wanoskarnet.
-    - Correct our replacements for the timeradd() and timersub() functions
-      on platforms that lack them (for example, Windows). The timersub()
-      function is used when expiring circuits, while timeradd() is
-      currently unused. Bug report and patch by Vektor. Fixes bug 4778;
-      bugfix on 0.2.2.24-alpha and 0.2.3.1-alpha.
-    - Do not use OpenSSL 1.0.0's counter mode: it has a critical bug
-      that was fixed in OpenSSL 1.0.0a. We test for the counter mode
-      bug at runtime, not compile time, because some distributions hack
-      their OpenSSL to mis-report its version. Fixes bug 4779; bugfix
-      on 0.2.3.9-alpha. Found by Pascal.
-
-  o Minor features (controller):
-    - Use absolute path names when reporting the torrc filename in the
-      control protocol, so a controller can more easily find the torrc
-      file. Resolves bug 1101.
-    - Extend the control protocol to report flags that control a circuit's
-      path selection in CIRC events and in replies to 'GETINFO
-      circuit-status'. Implements part of ticket 2411.
-    - Extend the control protocol to report the hidden service address
-      and current state of a hidden-service-related circuit in CIRC
-      events and in replies to 'GETINFO circuit-status'. Implements part
-      of ticket 2411.
-    - When reporting the path to the cookie file to the controller,
-      give an absolute path. Resolves ticket 4881.
-    - Allow controllers to request an event notification whenever a
-      circuit is cannibalized or its purpose is changed. Implements
-      part of ticket 3457.
-    - Include the creation time of a circuit in CIRC and CIRC2
-      control-port events and the list produced by the 'GETINFO
-      circuit-status' control-port command.
-
-  o Minor features (directory authorities):
-    - Directory authorities now reject versions of Tor older than
-      0.2.1.30, and Tor versions between 0.2.2.1-alpha and 0.2.2.20-alpha
-      inclusive. These versions accounted for only a small fraction of
-      the Tor network, and have numerous known security issues. Resolves
-      issue 4788.
-    - Authority operators can now vote for all relays in a given
-      set of countries to be BadDir/BadExit/Invalid/Rejected.
-    - Provide two consensus parameters (FastFlagMinThreshold and
-      FastFlagMaxThreshold) to control the range of allowable bandwidths
-      for the Fast directory flag. These allow authorities to run
-      experiments on appropriate requirements for being a "Fast" node.
-      The AuthDirFastGuarantee config value still applies. Implements
-      ticket 3946.
-    - Document the GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays
-      directory authority option (introduced in Tor 0.2.2.34).
-
-  o Minor features (other):
-    - Don't disable the DirPort when we cannot exceed our AccountingMax
-      limit during this interval because the effective bandwidthrate is
-      low enough. This is useful in a situation where AccountMax is only
-      used as an additional safeguard or to provide statistics.
-    - Prepend an informative header to generated dynamic_dh_params files.
-    - If EntryNodes are given, but UseEntryGuards is set to 0, warn that
-      EntryNodes will have no effect. Resolves issue 2571.
-    - Log more useful messages when we fail to disable debugger
-      attachment.
-    - Log which authority we're missing votes from when we go to fetch
-      them from the other auths.
-    - Log (at debug level) whenever a circuit's purpose is changed.
-    - Add missing documentation for the MaxClientCircuitsPending,
-      UseMicrodescriptors, UserspaceIOCPBuffers, and
-      _UseFilteringSSLBufferevents options, all introduced during
-      the 0.2.3.x series.
-    - Update to the January 3 2012 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (hidden services):
-    - Don't close hidden service client circuits which have almost
-      finished connecting to their destination when they reach
-      the normal circuit-build timeout. Previously, we would close
-      introduction circuits which are waiting for an acknowledgement
-      from the introduction point, and rendezvous circuits which have
-      been specified in an INTRODUCE1 cell sent to a hidden service,
-      after the normal CBT. Now, we mark them as 'timed out', and launch
-      another rendezvous attempt in parallel. This behavior change can
-      be disabled using the new CloseHSClientCircuitsImmediatelyOnTimeout
-      option. Fixes part of bug 1297; bugfix on 0.2.2.2-alpha.
-    - Don't close hidden-service-side rendezvous circuits when they
-      reach the normal circuit-build timeout. This behavior change can
-      be disabled using the new
-      CloseHSServiceRendCircuitsImmediatelyOnTimeout option. Fixes the
-      remaining part of bug 1297; bugfix on 0.2.2.2-alpha.
-    - Make sure we never mark the wrong rendezvous circuit as having
-      had its introduction cell acknowleged by the introduction-point
-      relay. Previously, when we received an INTRODUCE_ACK cell on a
-      client-side hidden-service introduction circuit, we might have
-      marked a rendezvous circuit other than the one we specified in
-      the INTRODUCE1 cell as INTRO_ACKED, which would have produced
-      a warning message and interfered with the hidden service
-      connection-establishment process. Fixes bug 4759; bugfix on
-      0.2.3.3-alpha, when we added the stream-isolation feature which
-      might cause Tor to open multiple rendezvous circuits for the same
-      hidden service.
-    - Don't trigger an assertion failure when we mark a new client-side
-      hidden-service introduction circuit for close during the process
-      of creating it. Fixes bug 4796; bugfix on 0.2.3.6-alpha. Reported
-      by murb.
-
-  o Minor bugfixes (log messages):
-    - Correctly spell "connect" in a log message on failure to create a
-      controlsocket. Fixes bug 4803; bugfix on 0.2.2.26-beta and
-      0.2.3.2-alpha.
-    - Fix a typo in a log message in rend_service_rendezvous_has_opened().
-      Fixes bug 4856; bugfix on Tor 0.0.6.
-    - Fix the log message describing how we work around discovering
-      that our version is the ill-fated OpenSSL 0.9.8l. Fixes bug
-      4837; bugfix on 0.2.2.9-alpha.
-    - When logging about a disallowed .exit name, do not also call it
-      an "invalid onion address". Fixes bug 3325; bugfix on 0.2.2.9-alpha.
-
-  o Minor bugfixes (build fixes):
-    - During configure, detect when we're building with clang version
-      3.0 or lower and disable the -Wnormalized=id and -Woverride-init
-      CFLAGS. clang doesn't support them yet.
-    - During configure, search for library containing cos function as
-      libm lives in libcore on some platforms (BeOS/Haiku). Linking
-      against libm was hard-coded before. Fixes the first part of bug
-      4727; bugfix on 0.2.2.2-alpha. Patch and analysis by Martin Hebnes
-      Pedersen.
-    - Detect attempts to build Tor on (as yet hypothetical) versions
-      of Windows where sizeof(intptr_t) != sizeof(SOCKET). Partial
-      fix for bug 4533. Bugfix on 0.2.2.28-beta.
-    - Preprocessor directives should not be put inside the arguments
-      of a macro. This would break compilation with GCC releases prior
-      to version 3.3. We would never recommend such an old GCC version,
-      but it is apparently required for binary compatibility on some
-      platforms (namely, certain builds of Haiku). Fixes the other part
-      of bug 4727; bugfix on 0.2.3.3-alpha. Patch and analysis by Martin
-      Hebnes Pedersen.
-
-  o Minor bugfixes (other):
-    - Older Linux kernels erroneously respond to strange nmap behavior
-      by having accept() return successfully with a zero-length
-      socket. When this happens, just close the connection. Previously,
-      we would try harder to learn the remote address: but there was
-      no such remote address to learn, and our method for trying to
-      learn it was incorrect. Fixes bugs 1240, 4745, and 4747. Bugfix
-      on 0.1.0.3-rc. Reported and diagnosed by "r1eo".
-    - Fix null-pointer access that could occur if TLS allocation failed.
-      Fixes bug 4531; bugfix on 0.2.0.20-rc. Found by "troll_un". This was
-      erroneously listed as fixed in 0.2.3.9-alpha, but the fix had
-      accidentally been reverted.
-    - Fix our implementation of crypto_random_hostname() so it can't
-      overflow on ridiculously large inputs. (No Tor version has ever
-      provided this kind of bad inputs, but let's be correct in depth.)
-      Fixes bug 4413; bugfix on 0.2.2.9-alpha. Fix by Stephen Palmateer.
-    - Find more places in the code that should have been testing for
-      invalid sockets using the SOCKET_OK macro. Required for a fix
-      for bug 4533. Bugfix on 0.2.2.28-beta.
-    - Fix an assertion failure when, while running with bufferevents, a
-      connection finishes connecting after it is marked for close, but
-      before it is closed. Fixes bug 4697; bugfix on 0.2.3.1-alpha.
-    - test_util_spawn_background_ok() hardcoded the expected value
-      for ENOENT to 2. This isn't portable as error numbers are
-      platform specific, and particularly the hurd has ENOENT at
-      0x40000002. Construct expected string at runtime, using the correct
-      value for ENOENT. Fixes bug 4733; bugfix on 0.2.3.1-alpha.
-    - Reject attempts to disable DisableDebuggerAttachment while Tor is
-      running. Fixes bug 4650; bugfix on 0.2.3.9-alpha.
-    - Use an appropriate-width type for sockets in tor-fw-helper on
-      win64. Fixes bug 1983 at last. Bugfix on 0.2.3.9-alpha.
-
-  o Feature removal:
-    - When sending or relaying a RELAY_EARLY cell, we used to convert
-      it to a RELAY cell if the connection was using the v1 link
-      protocol. This was a workaround for older versions of Tor, which
-      didn't handle RELAY_EARLY cells properly. Now that all supported
-      versions can handle RELAY_EARLY cells, and now that we're enforcing
-      the "no RELAY_EXTEND commands except in RELAY_EARLY cells" rule,
-      remove this workaround. Addresses bug 4786.
-
-  o Code simplifications and refactoring:
-    - Use OpenSSL's built-in SSL_state_string_long() instead of our
-      own homebrewed ssl_state_to_string() replacement. Patch from
-      Emile Snyder. Fixes bug 4653.
-    - Use macros to indicate OpenSSL versions, so we don't need to worry
-      about accidental hexadecimal bit shifts.
-    - Remove some workaround code for OpenSSL 0.9.6 (which is no longer
-      supported).
-    - Convert more instances of tor_snprintf+tor_strdup into tor_asprintf.
-    - Use the smartlist_add_asprintf() alias more consistently.
-    - Use a TOR_INVALID_SOCKET macro when initializing a socket to an
-      invalid value, rather than just -1.
-    - Rename a handful of old identifiers, mostly related to crypto
-      structures and crypto functions. By convention, our "create an
-      object" functions are called "type_new()", our "free an object"
-      functions are called "type_free()", and our types indicate that
-      they are types only with a final "_t". But a handful of older
-      types and functions broke these rules, with function names like
-      "type_create" or "subsystem_op_type", or with type names like
-      type_env_t.
-
-
-Changes in version 0.2.3.10-alpha - 2011-12-16
-  Tor 0.2.3.10-alpha fixes a critical heap-overflow security issue in
-  Tor's buffers code. Absolutely everybody should upgrade.
-
-  The bug relied on an incorrect calculation when making data continuous
-  in one of our IO buffers, if the first chunk of the buffer was
-  misaligned by just the wrong amount. The miscalculation would allow an
-  attacker to overflow a piece of heap-allocated memory. To mount this
-  attack, the attacker would need to either open a SOCKS connection to
-  Tor's SocksPort (usually restricted to localhost), or target a Tor
-  instance configured to make its connections through a SOCKS proxy
-  (which Tor does not do by default).
-
-  Good security practice requires that all heap-overflow bugs should be
-  presumed to be exploitable until proven otherwise, so we are treating
-  this as a potential code execution attack. Please upgrade immediately!
-  This bug does not affect bufferevents-based builds of Tor. Special
-  thanks to "Vektor" for reporting this issue to us!
-
-  This release also contains a few minor bugfixes for issues discovered
-  in 0.2.3.9-alpha.
-
-  o Major bugfixes:
-    - Fix a heap overflow bug that could occur when trying to pull
-      data into the first chunk of a buffer, when that chunk had
-      already had some data drained from it. Fixes CVE-2011-2778;
-      bugfix on 0.2.0.16-alpha. Reported by "Vektor".
-
-  o Minor bugfixes:
-    - If we can't attach streams to a rendezvous circuit when we
-      finish connecting to a hidden service, clear the rendezvous
-      circuit's stream-isolation state and try to attach streams
-      again. Previously, we cleared rendezvous circuits' isolation
-      state either too early (if they were freshly built) or not at all
-      (if they had been built earlier and were cannibalized). Bugfix on
-      0.2.3.3-alpha; fixes bug 4655.
-    - Fix compilation of the libnatpmp helper on non-Windows. Bugfix on
-      0.2.3.9-alpha; fixes bug 4691. Reported by Anthony G. Basile.
-    - Fix an assertion failure when a relay with accounting enabled
-      starts up while dormant. Fixes bug 4702; bugfix on 0.2.3.9-alpha.
-
-  o Minor features:
-    - Update to the December 6 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.2.35 - 2011-12-16
-  Tor 0.2.2.35 fixes a critical heap-overflow security issue in Tor's
-  buffers code. Absolutely everybody should upgrade.
-
-  The bug relied on an incorrect calculation when making data continuous
-  in one of our IO buffers, if the first chunk of the buffer was
-  misaligned by just the wrong amount. The miscalculation would allow an
-  attacker to overflow a piece of heap-allocated memory. To mount this
-  attack, the attacker would need to either open a SOCKS connection to
-  Tor's SocksPort (usually restricted to localhost), or target a Tor
-  instance configured to make its connections through a SOCKS proxy
-  (which Tor does not do by default).
-
-  Good security practice requires that all heap-overflow bugs should be
-  presumed to be exploitable until proven otherwise, so we are treating
-  this as a potential code execution attack. Please upgrade immediately!
-  This bug does not affect bufferevents-based builds of Tor. Special
-  thanks to "Vektor" for reporting this issue to us!
-
-  Tor 0.2.2.35 also fixes several bugs in previous versions, including
-  crash bugs for unusual configurations, and a long-term bug that
-  would prevent Tor from starting on Windows machines with draconian
-  AV software.
-
-  With this release, we remind everyone that 0.2.0.x has reached its
-  formal end-of-life. Those Tor versions have many known flaws, and
-  nobody should be using them. You should upgrade -- ideally to the
-  0.2.2.x series. If you're using a Linux or BSD and its packages are
-  obsolete, stop using those packages and upgrade anyway.
-
-  The Tor 0.2.1.x series is also approaching its end-of-life: it will no
-  longer receive support after some time in early 2012.
-
-  o Major bugfixes:
-    - Fix a heap overflow bug that could occur when trying to pull
-      data into the first chunk of a buffer, when that chunk had
-      already had some data drained from it. Fixes CVE-2011-2778;
-      bugfix on 0.2.0.16-alpha. Reported by "Vektor".
-    - Initialize Libevent with the EVENT_BASE_FLAG_NOLOCK flag enabled, so
-      that it doesn't attempt to allocate a socketpair. This could cause
-      some problems on Windows systems with overzealous firewalls. Fix for
-      bug 4457; workaround for Libevent versions 2.0.1-alpha through
-      2.0.15-stable.
-    - If we mark an OR connection for close based on a cell we process,
-      don't process any further cells on it. We already avoid further
-      reads on marked-for-close connections, but now we also discard the
-      cells we'd already read. Fixes bug 4299; bugfix on 0.2.0.10-alpha,
-      which was the first version where we might mark a connection for
-      close based on processing a cell on it.
-    - Correctly sanity-check that we don't underflow on a memory
-      allocation (and then assert) for hidden service introduction
-      point decryption. Bug discovered by Dan Rosenberg. Fixes bug 4410;
-      bugfix on 0.2.1.5-alpha.
-    - Fix a memory leak when we check whether a hidden service
-      descriptor has any usable introduction points left. Fixes bug
-      4424. Bugfix on 0.2.2.25-alpha.
-    - Don't crash when we're running as a relay and don't have a GeoIP
-      file. Bugfix on 0.2.2.34; fixes bug 4340. This backports a fix
-      we've had in the 0.2.3.x branch already.
-    - When running as a client, do not print a misleading (and plain
-      wrong) log message that we're collecting "directory request"
-      statistics: clients don't collect statistics. Also don't create a
-      useless (because empty) stats file in the stats/ directory. Fixes
-      bug 4353; bugfix on 0.2.2.34.
-
-  o Minor bugfixes:
-    - Detect failure to initialize Libevent. This fix provides better
-      detection for future instances of bug 4457.
-    - Avoid frequent calls to the fairly expensive cull_wedged_cpuworkers
-      function. This was eating up hideously large amounts of time on some
-      busy servers. Fixes bug 4518; bugfix on 0.0.9.8.
-    - Resolve an integer overflow bug in smartlist_ensure_capacity().
-      Fixes bug 4230; bugfix on Tor 0.1.0.1-rc. Based on a patch by
-      Mansour Moufid.
-    - Don't warn about unused log_mutex in log.c when building with
-      --disable-threads using a recent GCC. Fixes bug 4437; bugfix on
-      0.1.0.6-rc which introduced --disable-threads.
-    - When configuring, starting, or stopping an NT service, stop
-      immediately after the service configuration attempt has succeeded
-      or failed. Fixes bug 3963; bugfix on 0.2.0.7-alpha.
-    - When sending a NETINFO cell, include the original address
-      received for the other side, not its canonical address. Found
-      by "troll_un"; fixes bug 4349; bugfix on 0.2.0.10-alpha.
-    - Fix a typo in a hibernation-related log message. Fixes bug 4331;
-      bugfix on 0.2.2.23-alpha; found by "tmpname0901".
-    - Fix a memory leak in launch_direct_bridge_descriptor_fetch() that
-      occurred when a client tried to fetch a descriptor for a bridge
-      in ExcludeNodes. Fixes bug 4383; bugfix on 0.2.2.25-alpha.
-    - Backport fixes for a pair of compilation warnings on Windows.
-      Fixes bug 4521; bugfix on 0.2.2.28-beta and on 0.2.2.29-beta.
-    - If we had ever tried to call tor_addr_to_str on an address of
-      unknown type, we would have done a strdup on an uninitialized
-      buffer. Now we won't. Fixes bug 4529; bugfix on 0.2.1.3-alpha.
-      Reported by "troll_un".
-    - Correctly detect and handle transient lookup failures from
-      tor_addr_lookup. Fixes bug 4530; bugfix on 0.2.1.5-alpha.
-      Reported by "troll_un".
-    - Fix null-pointer access that could occur if TLS allocation failed.
-      Fixes bug 4531; bugfix on 0.2.0.20-rc. Found by "troll_un".
-    - Use tor_socket_t type for listener argument to accept(). Fixes bug
-      4535; bugfix on 0.2.2.28-beta. Found by "troll_un".
-
-  o Minor features:
-    - Add two new config options for directory authorities:
-      AuthDirFastGuarantee sets a bandwidth threshold for guaranteeing the
-      Fast flag, and AuthDirGuardBWGuarantee sets a bandwidth threshold
-      that is always sufficient to satisfy the bandwidth requirement for
-      the Guard flag. Now it will be easier for researchers to simulate
-      Tor networks with different values. Resolves ticket 4484.
-    - When Tor ignores a hidden service specified in its configuration,
-      include the hidden service's directory in the warning message.
-      Previously, we would only tell the user that some hidden service
-      was ignored. Bugfix on 0.0.6; fixes bug 4426.
-    - Update to the December 6 2011 Maxmind GeoLite Country database.
-
-  o Packaging changes:
-    - Make it easier to automate expert package builds on Windows,
-      by removing an absolute path from makensis.exe command.
-
-
-Changes in version 0.2.1.32 - 2011-12-16
-  Tor 0.2.1.32 backports important security and privacy fixes for
-  oldstable. This release is intended only for package maintainers and
-  others who cannot use the 0.2.2 stable series. All others should be
-  using Tor 0.2.2.x or newer.
-
-  The Tor 0.2.1.x series will reach formal end-of-life some time in
-  early 2012; we will stop releasing patches for it then.
-
-  o Major bugfixes (also included in 0.2.2.x):
-    - Correctly sanity-check that we don't underflow on a memory
-      allocation (and then assert) for hidden service introduction
-      point decryption. Bug discovered by Dan Rosenberg. Fixes bug 4410;
-      bugfix on 0.2.1.5-alpha.
-    - Fix a heap overflow bug that could occur when trying to pull
-      data into the first chunk of a buffer, when that chunk had
-      already had some data drained from it. Fixes CVE-2011-2778;
-      bugfix on 0.2.0.16-alpha. Reported by "Vektor".
-
-  o Minor features:
-    - Update to the December 6 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.3.9-alpha - 2011-12-08
-  Tor 0.2.3.9-alpha introduces initial IPv6 support for bridges, adds
-  a "DisableNetwork" security feature that bundles can use to avoid
-  touching the network until bridges are configured, moves forward on
-  the pluggable transport design, fixes a flaw in the hidden service
-  design that unnecessarily prevented clients with wrong clocks from
-  reaching hidden services, and fixes a wide variety of other issues.
-
-  o Major features:
-    - Clients can now connect to private bridges over IPv6. Bridges
-      still need at least one IPv4 address in order to connect to
-      other relays. Note that we don't yet handle the case where the
-      user has two bridge lines for the same bridge (one IPv4, one
-      IPv6). Implements parts of proposal 186.
-    - New "DisableNetwork" config option to prevent Tor from launching any
-      connections or accepting any connections except on a control port.
-      Bundles and controllers can set this option before letting Tor talk
-      to the rest of the network, for example to prevent any connections
-      to a non-bridge address. Packages like Orbot can also use this
-      option to instruct Tor to save power when the network is off.
-    - Clients and bridges can now be configured to use a separate
-      "transport" proxy. This approach makes the censorship arms race
-      easier by allowing bridges to use protocol obfuscation plugins. It
-      implements the "managed proxy" part of proposal 180 (ticket 3472).
-    - When using OpenSSL 1.0.0 or later, use OpenSSL's counter mode
-      implementation. It makes AES_CTR about 7% faster than our old one
-      (which was about 10% faster than the one OpenSSL used to provide).
-      Resolves ticket 4526.
-    - Add a "tor2web mode" for clients that want to connect to hidden
-      services non-anonymously (and possibly more quickly). As a safety
-      measure to try to keep users from turning this on without knowing
-      what they are doing, tor2web mode must be explicitly enabled at
-      compile time, and a copy of Tor compiled to run in tor2web mode
-      cannot be used as a normal Tor client. Implements feature 2553.
-    - Add experimental support for running on Windows with IOCP and no
-      kernel-space socket buffers. This feature is controlled by a new
-      "UserspaceIOCPBuffers" config option (off by default), which has
-      no effect unless Tor has been built with support for bufferevents,
-      is running on Windows, and has enabled IOCP. This may, in the long
-      run, help solve or mitigate bug 98.
-    - Use a more secure consensus parameter voting algorithm. Now at
-      least three directory authorities or a majority of them must
-      vote on a given parameter before it will be included in the
-      consensus. Implements proposal 178.
-
-  o Major bugfixes:
-    - Hidden services now ignore the timestamps on INTRODUCE2 cells.
-      They used to check that the timestamp was within 30 minutes
-      of their system clock, so they could cap the size of their
-      replay-detection cache, but that approach unnecessarily refused
-      service to clients with wrong clocks. Bugfix on 0.2.1.6-alpha, when
-      the v3 intro-point protocol (the first one which sent a timestamp
-      field in the INTRODUCE2 cell) was introduced; fixes bug 3460.
-    - Only use the EVP interface when AES acceleration is enabled,
-      to avoid a 5-7% performance regression. Resolves issue 4525;
-      bugfix on 0.2.3.8-alpha.
-
-  o Privacy/anonymity features (bridge detection):
-    - Make bridge SSL certificates a bit more stealthy by using random
-      serial numbers, in the same fashion as OpenSSL when generating
-      self-signed certificates. Implements ticket 4584.
-    - Introduce a new config option "DynamicDHGroups", enabled by
-      default, which provides each bridge with a unique prime DH modulus
-      to be used during SSL handshakes. This option attempts to help
-      against censors who might use the Apache DH modulus as a static
-      identifier for bridges. Addresses ticket 4548.
-
-  o Minor features (new/different config options):
-    - New configuration option "DisableDebuggerAttachment" (on by default)
-      to prevent basic debugging attachment attempts by other processes.
-      Supports Mac OS X and Gnu/Linux. Resolves ticket 3313.
-    - Allow MapAddress directives to specify matches against super-domains,
-      as in "MapAddress *.torproject.org *.torproject.org.torserver.exit".
-      Implements issue 933.
-    - Slightly change behavior of "list" options (that is, config
-      options that can appear more than once) when they appear both in
-      torrc and on the command line. Previously, the command-line options
-      would be appended to the ones from torrc. Now, the command-line
-      options override the torrc options entirely. This new behavior
-      allows the user to override list options (like exit policies and
-      ports to listen on) from the command line, rather than simply
-      appending to the list.
-    - You can get the old (appending) command-line behavior for "list"
-      options by prefixing the option name with a "+".
-    - You can remove all the values for a "list" option from the command
-      line without adding any new ones by prefixing the option name
-      with a "/".
-    - Add experimental support for a "defaults" torrc file to be parsed
-      before the regular torrc. Torrc options override the defaults file's
-      options in the same way that the command line overrides the torrc.
-      The SAVECONF controller command saves only those options which
-      differ between the current configuration and the defaults file. HUP
-      reloads both files. (Note: This is an experimental feature; its
-      behavior will probably be refined in future 0.2.3.x-alpha versions
-      to better meet packagers' needs.) Implements task 4552.
-
-  o Minor features:
-    - Try to make the introductory warning message that Tor prints on
-      startup more useful for actually finding help and information.
-      Resolves ticket 2474.
-    - Running "make version" now displays the version of Tor that
-      we're about to build. Idea from katmagic; resolves issue 4400.
-    - Expire old or over-used hidden service introduction points.
-      Required by fix for bug 3460.
-    - Move the replay-detection cache for the RSA-encrypted parts of
-      INTRODUCE2 cells to the introduction point data structures.
-      Previously, we would use one replay-detection cache per hidden
-      service. Required by fix for bug 3460.
-    - Reduce the lifetime of elements of hidden services' Diffie-Hellman
-      public key replay-detection cache from 60 minutes to 5 minutes. This
-      replay-detection cache is now used only to detect multiple
-      INTRODUCE2 cells specifying the same rendezvous point, so we can
-      avoid launching multiple simultaneous attempts to connect to it.
-
-  o Minor bugfixes (on Tor 0.2.2.x and earlier):
-    - Resolve an integer overflow bug in smartlist_ensure_capacity().
-      Fixes bug 4230; bugfix on Tor 0.1.0.1-rc. Based on a patch by
-      Mansour Moufid.
-    - Fix a minor formatting issue in one of tor-gencert's error messages.
-      Fixes bug 4574.
-    - Prevent a false positive from the check-spaces script, by disabling
-      the "whitespace between function name and (" check for functions
-      named 'op()'.
-    - Fix a log message suggesting that people contact a non-existent
-      email address. Fixes bug 3448.
-    - Fix null-pointer access that could occur if TLS allocation failed.
-      Fixes bug 4531; bugfix on 0.2.0.20-rc. Found by "troll_un".
-    - Report a real bootstrap problem to the controller on router
-      identity mismatch. Previously we just said "foo", which probably
-      made a lot of sense at the time. Fixes bug 4169; bugfix on
-      0.2.1.1-alpha.
-    - If we had ever tried to call tor_addr_to_str() on an address of
-      unknown type, we would have done a strdup() on an uninitialized
-      buffer. Now we won't. Fixes bug 4529; bugfix on 0.2.1.3-alpha.
-      Reported by "troll_un".
-    - Correctly detect and handle transient lookup failures from
-      tor_addr_lookup(). Fixes bug 4530; bugfix on 0.2.1.5-alpha.
-      Reported by "troll_un".
-    - Use tor_socket_t type for listener argument to accept(). Fixes bug
-      4535; bugfix on 0.2.2.28-beta. Found by "troll_un".
-    - Initialize conn->addr to a valid state in spawn_cpuworker(). Fixes
-      bug 4532; found by "troll_un".
-
-  o Minor bugfixes (on Tor 0.2.3.x):
-    - Fix a compile warning in tor_inet_pton(). Bugfix on 0.2.3.8-alpha;
-      fixes bug 4554.
-    - Don't send two ESTABLISH_RENDEZVOUS cells when opening a new
-      circuit for use as a hidden service client's rendezvous point.
-      Fixes bugs 4641 and 4171; bugfix on 0.2.3.3-alpha. Diagnosed
-      with help from wanoskarnet.
-    - Restore behavior of overriding SocksPort, ORPort, and similar
-      options from the command line. Bugfix on 0.2.3.3-alpha.
-
-  o Build fixes:
-    - Properly handle the case where the build-tree is not the same
-      as the source tree when generating src/common/common_sha1.i,
-      src/or/micro-revision.i, and src/or/or_sha1.i. Fixes bug 3953;
-      bugfix on 0.2.0.1-alpha.
-
-  o Code simplifications, cleanups, and refactorings:
-    - Remove the pure attribute from all functions that used it
-      previously. In many cases we assigned it incorrectly, because the
-      functions might assert or call impure functions, and we don't have
-      evidence that keeping the pure attribute is worthwhile. Implements
-      changes suggested in ticket 4421.
-    - Remove some dead code spotted by coverity. Fixes cid 432.
-      Bugfix on 0.2.3.1-alpha, closes bug 4637.
-
-
-Changes in version 0.2.3.8-alpha - 2011-11-22
-  Tor 0.2.3.8-alpha fixes some crash and assert bugs, including a
-  socketpair-related bug that has been bothering Windows users. It adds
-  support to serve microdescriptors to controllers, so Vidalia's network
-  map can resume listing relays (once Vidalia implements its side),
-  and adds better support for hardware AES acceleration. Finally, it
-  starts the process of adjusting the bandwidth cutoff for getting the
-  "Fast" flag from 20KB to (currently) 32KB -- preliminary results show
-  that tiny relays harm performance more than they help network capacity.
-
-  o Major bugfixes:
-    - Initialize Libevent with the EVENT_BASE_FLAG_NOLOCK flag enabled, so
-      that it doesn't attempt to allocate a socketpair. This could cause
-      some problems on Windows systems with overzealous firewalls. Fix for
-      bug 4457; workaround for Libevent versions 2.0.1-alpha through
-      2.0.15-stable.
-    - Correctly sanity-check that we don't underflow on a memory
-      allocation (and then assert) for hidden service introduction
-      point decryption. Bug discovered by Dan Rosenberg. Fixes bug 4410;
-      bugfix on 0.2.1.5-alpha.
-    - Remove the artificially low cutoff of 20KB to guarantee the Fast
-      flag. In the past few years the average relay speed has picked
-      up, and while the "top 7/8 of the network get the Fast flag" and
-      "all relays with 20KB or more of capacity get the Fast flag" rules
-      used to have the same result, now the top 7/8 of the network has
-      a capacity more like 32KB. Bugfix on 0.2.1.14-rc. Fixes bug 4489.
-    - Fix a rare assertion failure when checking whether a v0 hidden
-      service descriptor has any usable introduction points left, and
-      we don't have enough information to build a circuit to the first
-      intro point named in the descriptor. The HS client code in
-      0.2.3.x no longer uses v0 HS descriptors, but this assertion can
-      trigger on (and crash) v0 HS authorities. Fixes bug 4411.
-      Bugfix on 0.2.3.1-alpha; diagnosed by frosty_un.
-    - Make bridge authorities not crash when they are asked for their own
-      descriptor. Bugfix on 0.2.3.7-alpha, reported by Lucky Green.
-    - When running as a client, do not print a misleading (and plain
-      wrong) log message that we're collecting "directory request"
-      statistics: clients don't collect statistics. Also don't create a
-      useless (because empty) stats file in the stats/ directory. Fixes
-      bug 4353; bugfix on 0.2.2.34 and 0.2.3.7-alpha.
-
-  o Major features:
-    - Allow Tor controllers like Vidalia to obtain the microdescriptor
-      for a relay by identity digest or nickname. Previously,
-      microdescriptors were only available by their own digests, so a
-      controller would have to ask for and parse the whole microdescriptor
-      consensus in order to look up a single relay's microdesc. Fixes
-      bug 3832; bugfix on 0.2.3.1-alpha.
-    - Use OpenSSL's EVP interface for AES encryption, so that all AES
-      operations can use hardware acceleration (if present). Resolves
-      ticket 4442.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Detect failure to initialize Libevent. This fix provides better
-      detection for future instances of bug 4457.
-    - Avoid frequent calls to the fairly expensive cull_wedged_cpuworkers
-      function. This was eating up hideously large amounts of time on some
-      busy servers. Fixes bug 4518; bugfix on 0.0.9.8.
-    - Don't warn about unused log_mutex in log.c when building with
-      --disable-threads using a recent GCC. Fixes bug 4437; bugfix on
-      0.1.0.6-rc which introduced --disable-threads.
-    - Allow manual 'authenticate' commands to the controller interface
-      from netcat (nc) as well as telnet. We were rejecting them because
-      they didn't come with the expected whitespace at the end of the
-      command. Bugfix on 0.1.1.1-alpha; fixes bug 2893.
-    - Fix some (not actually triggerable) buffer size checks in usage of
-      tor_inet_ntop. Fixes bug 4434; bugfix on Tor 0.2.0.1-alpha. Patch
-      by Anders Sundman.
-    - Fix parsing of some corner-cases with tor_inet_pton(). Fixes
-      bug 4515; bugfix on 0.2.0.1-alpha; fix by Anders Sundman.
-    - When configuring, starting, or stopping an NT service, stop
-      immediately after the service configuration attempt has succeeded
-      or failed. Fixes bug 3963; bugfix on 0.2.0.7-alpha.
-    - When sending a NETINFO cell, include the original address
-      received for the other side, not its canonical address. Found
-      by "troll_un"; fixes bug 4349; bugfix on 0.2.0.10-alpha.
-    - Rename the bench_{aes,dmap} functions to test_*, so that tinytest
-      can pick them up when the tests aren't disabled. Bugfix on
-      0.2.2.4-alpha which introduced tinytest.
-    - Fix a memory leak when we check whether a hidden service
-      descriptor has any usable introduction points left. Fixes bug
-      4424. Bugfix on 0.2.2.25-alpha.
-    - Fix a memory leak in launch_direct_bridge_descriptor_fetch() that
-      occurred when a client tried to fetch a descriptor for a bridge
-      in ExcludeNodes. Fixes bug 4383; bugfix on 0.2.2.25-alpha.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - Make util unit tests build correctly with MSVC. Bugfix on
-      0.2.3.3-alpha. Patch by Gisle Vanem.
-    - Successfully detect AUTH_CHALLENGE cells with no recognized
-      authentication type listed. Fixes bug 4367; bugfix on 0.2.3.6-alpha.
-      Found by frosty_un.
-    - If a relay receives an AUTH_CHALLENGE cell it can't answer,
-      it should still send a NETINFO cell to allow the connection to
-      become open. Fixes bug 4368; fix on 0.2.3.6-alpha; bug found by
-      "frosty".
-    - Log less loudly when we get an invalid authentication certificate
-      from a source other than a directory authority: it's not unusual
-      to see invalid certs because of clock skew. Fixes bug 4370; bugfix
-      on 0.2.3.6-alpha.
-    - Tolerate servers with more clock skew in their authentication
-      certificates than previously. Fixes bug 4371; bugfix on
-      0.2.3.6-alpha.
-    - Fix a couple of compile warnings on Windows. Fixes bug 4469; bugfix
-      on 0.2.3.4-alpha and 0.2.3.6-alpha.
-
-  o Minor features:
-    - Add two new config options for directory authorities:
-      AuthDirFastGuarantee sets a bandwidth threshold for guaranteeing the
-      Fast flag, and AuthDirGuardBWGuarantee sets a bandwidth threshold
-      that is always sufficient to satisfy the bandwidth requirement for
-      the Guard flag. Now it will be easier for researchers to simulate
-      Tor networks with different values. Resolves ticket 4484.
-    - When Tor ignores a hidden service specified in its configuration,
-      include the hidden service's directory in the warning message.
-      Previously, we would only tell the user that some hidden service
-      was ignored. Bugfix on 0.0.6; fixes bug 4426.
-    - When we fail to initialize Libevent, retry with IOCP disabled so we
-      don't need to turn on multi-threading support in Libevent, which in
-      turn requires a working socketpair(). This is a workaround for bug
-      4457, which affects Libevent versions from 2.0.1-alpha through
-      2.0.15-stable.
-    - Detect when we try to build on a platform that doesn't define
-      AF_UNSPEC to 0. We don't work there, so refuse to compile.
-    - Update to the November 1 2011 Maxmind GeoLite Country database.
-
-  o Packaging changes:
-    - Make it easier to automate expert package builds on Windows,
-      by removing an absolute path from makensis.exe command.
-
-  o Code simplifications and refactoring:
-    - Remove some redundant #include directives throughout the code.
-      Patch from Andrea Gelmini.
-    - Unconditionally use OpenSSL's AES implementation instead of our
-      old built-in one. OpenSSL's AES has been better for a while, and
-      relatively few servers should still be on any version of OpenSSL
-      that doesn't have good optimized assembly AES.
-    - Use the name "CERTS" consistently to refer to the new cell type;
-      we were calling it CERT in some places and CERTS in others.
-
-  o Testing:
-    - Numerous new unit tests for functions in util.c and address.c by
-      Anders Sundman.
-    - The long-disabled benchmark tests are now split into their own
-      ./src/test/bench binary.
-    - The benchmark tests can now use more accurate timers than
-      gettimeofday() when such timers are available.
-
-
-Changes in version 0.2.3.7-alpha - 2011-10-30
-  Tor 0.2.3.7-alpha fixes a crash bug in 0.2.3.6-alpha introduced by
-  the new v3 handshake. It also resolves yet another bridge address
-  enumeration issue.
-
-  o Major bugfixes:
-    - If we mark an OR connection for close based on a cell we process,
-      don't process any further cells on it. We already avoid further
-      reads on marked-for-close connections, but now we also discard the
-      cells we'd already read. Fixes bug 4299; bugfix on 0.2.0.10-alpha,
-      which was the first version where we might mark a connection for
-      close based on processing a cell on it.
-    - Fix a double-free bug that would occur when we received an invalid
-      certificate in a CERT cell in the new v3 handshake. Fixes bug 4343;
-      bugfix on 0.2.3.6-alpha.
-    - Bridges no longer include their address in NETINFO cells on outgoing
-      OR connections, to allow them to blend in better with clients.
-      Removes another avenue for enumerating bridges. Reported by
-      "troll_un". Fixes bug 4348; bugfix on 0.2.0.10-alpha, when NETINFO
-      cells were introduced.
-
-  o Trivial fixes:
-    - Fixed a typo in a hibernation-related log message. Fixes bug 4331;
-      bugfix on 0.2.2.23-alpha; found by "tmpname0901".
-
-
-Changes in version 0.2.3.6-alpha - 2011-10-26
-  Tor 0.2.3.6-alpha includes the fix from 0.2.2.34 for a critical
-  anonymity vulnerability where an attacker can deanonymize Tor
-  users. Everybody should upgrade.
-
-  This release also features support for a new v3 connection handshake
-  protocol, and fixes to make hidden service connections more robust.
-
-  o Major features:
-    - Implement a new handshake protocol (v3) for authenticating Tors to
-      each other over TLS. It should be more resistant to fingerprinting
-      than previous protocols, and should require less TLS hacking for
-      future Tor implementations. Implements proposal 176.
-    - Allow variable-length padding cells to disguise the length of
-      Tor's TLS records. Implements part of proposal 184.
-
-  o Privacy/anonymity fixes (clients):
-    - Clients and bridges no longer send TLS certificate chains on
-      outgoing OR connections. Previously, each client or bridge would
-      use the same cert chain for all outgoing OR connections until
-      its IP address changes, which allowed any relay that the client
-      or bridge contacted to determine which entry guards it is using.
-      Fixes CVE-2011-2768. Bugfix on 0.0.9pre5; found by "frosty_un".
-    - If a relay receives a CREATE_FAST cell on a TLS connection, it
-      no longer considers that connection as suitable for satisfying a
-      circuit EXTEND request. Now relays can protect clients from the
-      CVE-2011-2768 issue even if the clients haven't upgraded yet.
-    - Directory authorities no longer assign the Guard flag to relays
-      that haven't upgraded to the above "refuse EXTEND requests
-      to client connections" fix. Now directory authorities can
-      protect clients from the CVE-2011-2768 issue even if neither
-      the clients nor the relays have upgraded yet. There's a new
-      "GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays" config option
-      to let us transition smoothly, else tomorrow there would be no
-      guard relays.
-
-  o Major bugfixes (hidden services):
-    - Improve hidden service robustness: when an attempt to connect to
-      a hidden service ends, be willing to refetch its hidden service
-      descriptors from each of the HSDir relays responsible for them
-      immediately. Previously, we would not consider refetching the
-      service's descriptors from each HSDir for 15 minutes after the last
-      fetch, which was inconvenient if the hidden service was not running
-      during the first attempt. Bugfix on 0.2.0.18-alpha; fixes bug 3335.
-    - When one of a hidden service's introduction points appears to be
-      unreachable, stop trying it. Previously, we would keep trying
-      to build circuits to the introduction point until we lost the
-      descriptor, usually because the user gave up and restarted Tor.
-      Partly fixes bug 3825.
-    - Don't launch a useless circuit after failing to use one of a
-      hidden service's introduction points. Previously, we would
-      launch a new introduction circuit, but not set the hidden service
-      which that circuit was intended to connect to, so it would never
-      actually be used. A different piece of code would then create a
-      new introduction circuit correctly. Bug reported by katmagic and
-      found by Sebastian Hahn. Bugfix on 0.2.1.13-alpha; fixes bug 4212.
-
-  o Major bugfixes (other):
-    - Bridges now refuse CREATE or CREATE_FAST cells on OR connections
-      that they initiated. Relays could distinguish incoming bridge
-      connections from client connections, creating another avenue for
-      enumerating bridges. Fixes CVE-2011-2769. Bugfix on 0.2.0.3-alpha.
-      Found by "frosty_un".
-    - Don't update the AccountingSoftLimitHitAt state file entry whenever
-      tor gets started. This prevents a wrong average bandwidth
-      estimate, which would cause relays to always start a new accounting
-      interval at the earliest possible moment. Fixes bug 2003; bugfix
-      on 0.2.2.7-alpha. Reported by BryonEldridge, who also helped
-      immensely in tracking this bug down.
-    - Fix a crash bug when changing node restrictions while a DNS lookup
-      is in-progress. Fixes bug 4259; bugfix on 0.2.2.25-alpha. Bugfix
-      by "Tey'".
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - When a hidden service turns an extra service-side introduction
-      circuit into a general-purpose circuit, free the rend_data and
-      intro_key fields first, so we won't leak memory if the circuit
-      is cannibalized for use as another service-side introduction
-      circuit. Bugfix on 0.2.1.7-alpha; fixes bug 4251.
-    - Rephrase the log message emitted if the TestSocks check is
-      successful. Patch from Fabian Keil; fixes bug 4094.
-    - Bridges now skip DNS self-tests, to act a little more stealthily.
-      Fixes bug 4201; bugfix on 0.2.0.3-alpha, which first introduced
-      bridges. Patch by "warms0x".
-    - Remove a confusing dollar sign from the example fingerprint in the
-      man page, and also make the example fingerprint a valid one. Fixes
-      bug 4309; bugfix on 0.2.1.3-alpha.
-    - Fix internal bug-checking logic that was supposed to catch
-      failures in digest generation so that it will fail more robustly
-      if we ask for a nonexistent algorithm. Found by Coverity Scan.
-      Bugfix on 0.2.2.1-alpha; fixes Coverity CID 479.
-    - Report any failure in init_keys() calls launched because our
-      IP address has changed. Spotted by Coverity Scan. Bugfix on
-      0.1.1.4-alpha; fixes CID 484.
-
-  o Minor bugfixes (on 0.2.3.x):
-    - Fix a bug in configure.in that kept it from building a configure
-      script with autoconf versions earlier than 2.61. Fixes bug 2430;
-      bugfix on 0.2.3.1-alpha.
-    - Don't warn users that they are exposing a client port to the
-      Internet if they have specified an RFC1918 address. Previously,
-      we would warn if the user had specified any non-loopback
-      address. Bugfix on 0.2.3.3-alpha. Fixes bug 4018; reported by Tas.
-    - Fix memory leaks in the failing cases of the new SocksPort and
-      ControlPort code. Found by Coverity Scan. Bugfix on 0.2.3.3-alpha;
-      fixes coverity CIDs 485, 486, and 487.
-
-  o Minor features:
-    - When a hidden service's introduction point times out, consider
-      trying it again during the next attempt to connect to the
-      HS. Previously, we would not try it again unless a newly fetched
-      descriptor contained it. Required by fixes for bugs 1297 and 3825.
-    - The next version of Windows will be called Windows 8, and it has
-      a major version of 6, minor version of 2. Correctly identify that
-      version instead of calling it "Very recent version". Resolves
-      ticket 4153; reported by funkstar.
-    - The Bridge Authority now writes statistics on how many bridge
-      descriptors it gave out in total, and how many unique descriptors
-      it gave out. It also lists how often the most and least commonly
-      fetched descriptors were given out, as well as the median and
-      25th/75th percentile. Implements tickets 4200 and 4294.
-    - Update to the October 4 2011 Maxmind GeoLite Country database.
-
-  o Code simplifications and refactoring:
-    - Remove some old code to remember statistics about which descriptors
-      we've served as a directory mirror. The feature wasn't used and
-      is outdated now that microdescriptors are around.
-    - Rename Tor functions that turn strings into addresses, so that
-      "parse" indicates that no hostname resolution occurs, and
-      "lookup" indicates that hostname resolution may occur. This
-      should help prevent mistakes in the future. Fixes bug 3512.
-
-
-Changes in version 0.2.2.34 - 2011-10-26
-  Tor 0.2.2.34 fixes a critical anonymity vulnerability where an attacker
-  can deanonymize Tor users. Everybody should upgrade.
-
-  The attack relies on four components: 1) Clients reuse their TLS cert
-  when talking to different relays, so relays can recognize a user by
-  the identity key in her cert. 2) An attacker who knows the client's
-  identity key can probe each guard relay to see if that identity key
-  is connected to that guard relay right now. 3) A variety of active
-  attacks in the literature (starting from "Low-Cost Traffic Analysis
-  of Tor" by Murdoch and Danezis in 2005) allow a malicious website to
-  discover the guard relays that a Tor user visiting the website is using.
-  4) Clients typically pick three guards at random, so the set of guards
-  for a given user could well be a unique fingerprint for her. This
-  release fixes components #1 and #2, which is enough to block the attack;
-  the other two remain as open research problems. Special thanks to
-  "frosty_un" for reporting the issue to us!
-
-  Clients should upgrade so they are no longer recognizable by the TLS
-  certs they present. Relays should upgrade so they no longer allow a
-  remote attacker to probe them to test whether unpatched clients are
-  currently connected to them.
-
-  This release also fixes several vulnerabilities that allow an attacker
-  to enumerate bridge relays. Some bridge enumeration attacks still
-  remain; see for example proposal 188.
-
-  o Privacy/anonymity fixes (clients):
-    - Clients and bridges no longer send TLS certificate chains on
-      outgoing OR connections. Previously, each client or bridge would
-      use the same cert chain for all outgoing OR connections until
-      its IP address changes, which allowed any relay that the client
-      or bridge contacted to determine which entry guards it is using.
-      Fixes CVE-2011-2768. Bugfix on 0.0.9pre5; found by "frosty_un".
-    - If a relay receives a CREATE_FAST cell on a TLS connection, it
-      no longer considers that connection as suitable for satisfying a
-      circuit EXTEND request. Now relays can protect clients from the
-      CVE-2011-2768 issue even if the clients haven't upgraded yet.
-    - Directory authorities no longer assign the Guard flag to relays
-      that haven't upgraded to the above "refuse EXTEND requests
-      to client connections" fix. Now directory authorities can
-      protect clients from the CVE-2011-2768 issue even if neither
-      the clients nor the relays have upgraded yet. There's a new
-      "GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays" config option
-      to let us transition smoothly, else tomorrow there would be no
-      guard relays.
-
-  o Privacy/anonymity fixes (bridge enumeration):
-    - Bridge relays now do their directory fetches inside Tor TLS
-      connections, like all the other clients do, rather than connecting
-      directly to the DirPort like public relays do. Removes another
-      avenue for enumerating bridges. Fixes bug 4115; bugfix on 0.2.0.35.
-    - Bridges relays now build circuits for themselves in a more similar
-      way to how clients build them. Removes another avenue for
-      enumerating bridges. Fixes bug 4124; bugfix on 0.2.0.3-alpha,
-      when bridges were introduced.
-    - Bridges now refuse CREATE or CREATE_FAST cells on OR connections
-      that they initiated. Relays could distinguish incoming bridge
-      connections from client connections, creating another avenue for
-      enumerating bridges. Fixes CVE-2011-2769. Bugfix on 0.2.0.3-alpha.
-      Found by "frosty_un".
-
-  o Major bugfixes:
-    - Fix a crash bug when changing node restrictions while a DNS lookup
-      is in-progress. Fixes bug 4259; bugfix on 0.2.2.25-alpha. Bugfix
-      by "Tey'".
-    - Don't launch a useless circuit after failing to use one of a
-      hidden service's introduction points. Previously, we would
-      launch a new introduction circuit, but not set the hidden service
-      which that circuit was intended to connect to, so it would never
-      actually be used. A different piece of code would then create a
-      new introduction circuit correctly. Bug reported by katmagic and
-      found by Sebastian Hahn. Bugfix on 0.2.1.13-alpha; fixes bug 4212.
-
-  o Minor bugfixes:
-    - Change an integer overflow check in the OpenBSD_Malloc code so
-      that GCC is less likely to eliminate it as impossible. Patch
-      from Mansour Moufid. Fixes bug 4059.
-    - When a hidden service turns an extra service-side introduction
-      circuit into a general-purpose circuit, free the rend_data and
-      intro_key fields first, so we won't leak memory if the circuit
-      is cannibalized for use as another service-side introduction
-      circuit. Bugfix on 0.2.1.7-alpha; fixes bug 4251.
-    - Bridges now skip DNS self-tests, to act a little more stealthily.
-      Fixes bug 4201; bugfix on 0.2.0.3-alpha, which first introduced
-      bridges. Patch by "warms0x".
-    - Fix internal bug-checking logic that was supposed to catch
-      failures in digest generation so that it will fail more robustly
-      if we ask for a nonexistent algorithm. Found by Coverity Scan.
-      Bugfix on 0.2.2.1-alpha; fixes Coverity CID 479.
-    - Report any failure in init_keys() calls launched because our
-      IP address has changed. Spotted by Coverity Scan. Bugfix on
-      0.1.1.4-alpha; fixes CID 484.
-
-  o Minor bugfixes (log messages and documentation):
-    - Remove a confusing dollar sign from the example fingerprint in the
-      man page, and also make the example fingerprint a valid one. Fixes
-      bug 4309; bugfix on 0.2.1.3-alpha.
-    - The next version of Windows will be called Windows 8, and it has
-      a major version of 6, minor version of 2. Correctly identify that
-      version instead of calling it "Very recent version". Resolves
-      ticket 4153; reported by funkstar.
-    - Downgrade log messages about circuit timeout calibration from
-      "notice" to "info": they don't require or suggest any human
-      intervention. Patch from Tom Lowenthal. Fixes bug 4063;
-      bugfix on 0.2.2.14-alpha.
-
-  o Minor features:
-    - Turn on directory request statistics by default and include them in
-      extra-info descriptors. Don't break if we have no GeoIP database.
-      Backported from 0.2.3.1-alpha; implements ticket 3951.
-    - Update to the October 4 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.1.31 - 2011-10-26
-  Tor 0.2.1.31 backports important security and privacy fixes for
-  oldstable. This release is intended only for package maintainers and
-  others who cannot use the 0.2.2 stable series. All others should be
-  using Tor 0.2.2.x or newer.
-
-  o Security fixes (also included in 0.2.2.x):
-    - Replace all potentially sensitive memory comparison operations
-      with versions whose runtime does not depend on the data being
-      compared. This will help resist a class of attacks where an
-      adversary can use variations in timing information to learn
-      sensitive data. Fix for one case of bug 3122. (Safe memcmp
-      implementation by Robert Ransom based partially on code by DJB.)
-    - Fix an assert in parsing router descriptors containing IPv6
-      addresses. This one took down the directory authorities when
-      somebody tried some experimental code. Bugfix on 0.2.1.3-alpha.
-
-  o Privacy/anonymity fixes (also included in 0.2.2.x):
-    - Clients and bridges no longer send TLS certificate chains on
-      outgoing OR connections. Previously, each client or bridge would
-      use the same cert chain for all outgoing OR connections until
-      its IP address changes, which allowed any relay that the client
-      or bridge contacted to determine which entry guards it is using.
-      Fixes CVE-2011-2768. Bugfix on 0.0.9pre5; found by "frosty_un".
-    - If a relay receives a CREATE_FAST cell on a TLS connection, it
-      no longer considers that connection as suitable for satisfying a
-      circuit EXTEND request. Now relays can protect clients from the
-      CVE-2011-2768 issue even if the clients haven't upgraded yet.
-    - Bridges now refuse CREATE or CREATE_FAST cells on OR connections
-      that they initiated. Relays could distinguish incoming bridge
-      connections from client connections, creating another avenue for
-      enumerating bridges. Fixes CVE-2011-2769. Bugfix on 0.2.0.3-alpha.
-      Found by "frosty_un".
-    - When receiving a hidden service descriptor, check that it is for
-      the hidden service we wanted. Previously, Tor would store any
-      hidden service descriptors that a directory gave it, whether it
-      wanted them or not. This wouldn't have let an attacker impersonate
-      a hidden service, but it did let directories pre-seed a client
-      with descriptors that it didn't want. Bugfix on 0.0.6.
-    - Avoid linkability based on cached hidden service descriptors: forget
-      all hidden service descriptors cached as a client when processing a
-      SIGNAL NEWNYM command. Fixes bug 3000; bugfix on 0.0.6.
-    - Make the bridge directory authority refuse to answer directory
-      requests for "all" descriptors. It used to include bridge
-      descriptors in its answer, which was a major information leak.
-      Found by "piebeer". Bugfix on 0.2.0.3-alpha.
-    - Don't attach new streams to old rendezvous circuits after SIGNAL
-      NEWNYM. Previously, we would keep using an existing rendezvous
-      circuit if it remained open (i.e. if it were kept open by a
-      long-lived stream, or if a new stream were attached to it before
-      Tor could notice that it was old and no longer in use). Bugfix on
-      0.1.1.15-rc; fixes bug 3375.
-
-  o Minor bugfixes (also included in 0.2.2.x):
-    - When we restart our relay, we might get a successful connection
-      from the outside before we've started our reachability tests,
-      triggering a warning: "ORPort found reachable, but I have no
-      routerinfo yet. Failing to inform controller of success." This
-      bug was harmless unless Tor is running under a controller
-      like Vidalia, in which case the controller would never get a
-      REACHABILITY_SUCCEEDED status event. Bugfix on 0.1.2.6-alpha;
-      fixes bug 1172.
-    - Build correctly on OSX with zlib 1.2.4 and higher with all warnings
-      enabled. Fixes bug 1526.
-    - Remove undocumented option "-F" from tor-resolve: it hasn't done
-      anything since 0.2.1.16-rc.
-    - Avoid signed/unsigned comparisons by making SIZE_T_CEILING unsigned.
-      None of the cases where we did this before were wrong, but by making
-      this change we avoid warnings. Fixes bug 2475; bugfix on 0.2.1.28.
-    - Fix a rare crash bug that could occur when a client was configured
-      with a large number of bridges. Fixes bug 2629; bugfix on
-      0.2.1.2-alpha. Bugfix by trac user "shitlei".
-    - Correct the warning displayed when a rendezvous descriptor exceeds
-      the maximum size. Fixes bug 2750; bugfix on 0.2.1.5-alpha. Found by
-      John Brooks.
-    - Fix an uncommon assertion failure when running with DNSPort under
-      heavy load. Fixes bug 2933; bugfix on 0.2.0.1-alpha.
-    - When warning about missing zlib development packages during compile,
-      give the correct package names. Bugfix on 0.2.0.1-alpha.
-    - Require that introduction point keys and onion keys have public
-      exponent 65537. Bugfix on 0.2.0.10-alpha.
-    - Do not crash when our configuration file becomes unreadable, for
-      example due to a permissions change, between when we start up
-      and when a controller calls SAVECONF. Fixes bug 3135; bugfix
-      on 0.0.9pre6.
-    - Fix warnings from GCC 4.6's "-Wunused-but-set-variable" option.
-      Fixes bug 3208.
-    - Always NUL-terminate the sun_path field of a sockaddr_un before
-      passing it to the kernel. (Not a security issue: kernels are
-      smart enough to reject bad sockaddr_uns.) Found by Coverity;
-      CID #428. Bugfix on Tor 0.2.0.3-alpha.
-    - Don't stack-allocate the list of supplementary GIDs when we're
-      about to log them. Stack-allocating NGROUPS_MAX gid_t elements
-      could take up to 256K, which is way too much stack. Found by
-      Coverity; CID #450. Bugfix on 0.2.1.7-alpha.
-
-  o Minor bugfixes (only in 0.2.1.x):
-    - Resume using micro-version numbers in 0.2.1.x: our Debian packages
-      rely on them. Bugfix on 0.2.1.30.
-    - Use git revisions instead of svn revisions when generating our
-      micro-version numbers. Bugfix on 0.2.1.15-rc; fixes bug 2402.
-
-  o Minor features (also included in 0.2.2.x):
-    - Adjust the expiration time on our SSL session certificates to
-      better match SSL certs seen in the wild. Resolves ticket 4014.
-    - Allow nameservers with IPv6 address. Resolves bug 2574.
-    - Update to the October 4 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.3.5-alpha - 2011-09-28
-  Tor 0.2.3.5-alpha fixes two bugs that make it possible to enumerate
-  bridge relays; fixes an assertion error that many users started hitting
-  today; and adds the ability to refill token buckets more often than
-  once per second, allowing significant performance improvements.
-
-  o Security fixes:
-    - Bridge relays now do their directory fetches inside Tor TLS
-      connections, like all the other clients do, rather than connecting
-      directly to the DirPort like public relays do. Removes another
-      avenue for enumerating bridges. Fixes bug 4115; bugfix on 0.2.0.35.
-    - Bridges relays now build circuits for themselves in a more similar
-      way to how clients build them. Removes another avenue for
-      enumerating bridges. Fixes bug 4124; bugfix on 0.2.0.3-alpha,
-      when bridges were introduced.
-
-  o Major bugfixes:
-    - Fix an "Assertion md->held_by_node == 1 failed" error that could
-      occur when the same microdescriptor was referenced by two node_t
-      objects at once. Fix for bug 4118; bugfix on Tor 0.2.3.1-alpha.
-
-  o Major features (networking):
-    - Add a new TokenBucketRefillInterval option to refill token buckets
-      more frequently than once per second. This should improve network
-      performance, alleviate queueing problems, and make traffic less
-      bursty. Implements proposal 183; closes ticket 3630. Design by
-      Florian Tschorsch and Björn Scheuermann; implementation by
-      Florian Tschorsch.
-
-  o Minor bugfixes:
-    - Change an integer overflow check in the OpenBSD_Malloc code so
-      that GCC is less likely to eliminate it as impossible. Patch
-      from Mansour Moufid. Fixes bug 4059.
-
-  o Minor bugfixes (usability):
-    - Downgrade log messages about circuit timeout calibration from
-      "notice" to "info": they don't require or suggest any human
-      intervention. Patch from Tom Lowenthal. Fixes bug 4063;
-      bugfix on 0.2.2.14-alpha.
-
-  o Minor features (diagnostics):
-    - When the system call to create a listener socket fails, log the
-      error message explaining why. This may help diagnose bug 4027.
-
-
-Changes in version 0.2.3.4-alpha - 2011-09-13
-  Tor 0.2.3.4-alpha includes the fixes from 0.2.2.33, including a slight
-  tweak to Tor's TLS handshake that makes relays and bridges that run
-  this new version reachable from Iran again. It also fixes a few new
-  bugs in 0.2.3.x, and teaches relays to recognize when they're not
-  listed in the network consensus and republish.
-
-  o Major bugfixes (also part of 0.2.2.33):
-    - Avoid an assertion failure when reloading a configuration with
-      TrackExitHosts changes. Found and fixed by 'laruldan'. Fixes bug
-      3923; bugfix on 0.2.2.25-alpha.
-
-  o Minor features (security, also part of 0.2.2.33):
-    - Check for replays of the public-key encrypted portion of an
-      INTRODUCE1 cell, in addition to the current check for replays of
-      the g^x value. This prevents a possible class of active attacks
-      by an attacker who controls both an introduction point and a
-      rendezvous point, and who uses the malleability of AES-CTR to
-      alter the encrypted g^x portion of the INTRODUCE1 cell. We think
-      that these attacks are infeasible (requiring the attacker to send
-      on the order of zettabytes of altered cells in a short interval),
-      but we'd rather block them off in case there are any classes of
-      this attack that we missed. Reported by Willem Pinckaers.
-
-  o Minor features (also part of 0.2.2.33):
-    - Adjust the expiration time on our SSL session certificates to
-      better match SSL certs seen in the wild. Resolves ticket 4014.
-    - Change the default required uptime for a relay to be accepted as
-      a HSDir (hidden service directory) from 24 hours to 25 hours.
-      Improves on 0.2.0.10-alpha; resolves ticket 2649.
-    - Add a VoteOnHidServDirectoriesV2 config option to allow directory
-      authorities to abstain from voting on assignment of the HSDir
-      consensus flag. Related to bug 2649.
-    - Update to the September 6 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (also part of 0.2.2.33):
-    - Demote the 'replay detected' log message emitted when a hidden
-      service receives the same Diffie-Hellman public key in two different
-      INTRODUCE2 cells to info level. A normal Tor client can cause that
-      log message during its normal operation. Bugfix on 0.2.1.6-alpha;
-      fixes part of bug 2442.
-    - Demote the 'INTRODUCE2 cell is too {old,new}' log message to info
-      level. There is nothing that a hidden service's operator can do
-      to fix its clients' clocks. Bugfix on 0.2.1.6-alpha; fixes part
-      of bug 2442.
-    - Clarify a log message specifying the characters permitted in
-      HiddenServiceAuthorizeClient client names. Previously, the log
-      message said that "[A-Za-z0-9+-_]" were permitted; that could have
-      given the impression that every ASCII character between "+" and "_"
-      was permitted. Now we say "[A-Za-z0-9+_-]". Bugfix on 0.2.1.5-alpha.
-
-  o Build fixes (also part of 0.2.2.33):
-    - Clean up some code issues that prevented Tor from building on older
-      BSDs. Fixes bug 3894; reported by "grarpamp".
-    - Search for a platform-specific version of "ar" when cross-compiling.
-      Should fix builds on iOS. Resolves bug 3909, found by Marco Bonetti.
-
-  o Major bugfixes:
-    - Fix a bug where the SocksPort option (for example) would get
-      ignored and replaced by the default if a SocksListenAddress
-      option was set. Bugfix on 0.2.3.3-alpha; fixes bug 3936. Fix by
-      Fabian Keil.
-
-  o Major features:
-    - Relays now try regenerating and uploading their descriptor more
-      frequently if they are not listed in the consensus, or if the
-      version of their descriptor listed in the consensus is too
-      old. This fix should prevent situations where a server declines
-      to re-publish itself because it has done so too recently, even
-      though the authorities decided not to list its recent-enough
-      descriptor. Fix for bug 3327.
-
-  o Minor features:
-    - Relays now include a reason for regenerating their descriptors
-      in an HTTP header when uploading to the authorities. This will
-      make it easier to debug descriptor-upload issues in the future.
-    - When starting as root and then changing our UID via the User
-      control option, and we have a ControlSocket configured, make sure
-      that the ControlSocket is owned by the same account that Tor will
-      run under. Implements ticket 3421; fix by Jérémy Bobbio.
-
-  o Minor bugfixes:
-    - Abort if tor_vasprintf fails in connection_printf_to_buf (a
-      utility function used in the control-port code). This shouldn't
-      ever happen unless Tor is completely out of memory, but if it did
-      happen and Tor somehow recovered from it, Tor could have sent a log
-      message to a control port in the middle of a reply to a controller
-      command. Fixes part of bug 3428; bugfix on 0.1.2.3-alpha.
-    - Make 'FetchUselessDescriptors' cause all descriptor types and
-      all consensus types (including microdescriptors) to get fetched.
-      Fixes bug 3851; bugfix on 0.2.3.1-alpha.
-
-  o Code refactoring:
-    - Make a new "entry connection" struct as an internal subtype of "edge
-      connection", to simplify the code and make exit connections smaller.
-
-
-Changes in version 0.2.2.33 - 2011-09-13
-  Tor 0.2.2.33 fixes several bugs, and includes a slight tweak to Tor's
-  TLS handshake that makes relays and bridges that run this new version
-  reachable from Iran again.
-
-  o Major bugfixes:
-    - Avoid an assertion failure when reloading a configuration with
-      TrackExitHosts changes. Found and fixed by 'laruldan'. Fixes bug
-      3923; bugfix on 0.2.2.25-alpha.
-
-  o Minor features (security):
-    - Check for replays of the public-key encrypted portion of an
-      INTRODUCE1 cell, in addition to the current check for replays of
-      the g^x value. This prevents a possible class of active attacks
-      by an attacker who controls both an introduction point and a
-      rendezvous point, and who uses the malleability of AES-CTR to
-      alter the encrypted g^x portion of the INTRODUCE1 cell. We think
-      that these attacks are infeasible (requiring the attacker to send
-      on the order of zettabytes of altered cells in a short interval),
-      but we'd rather block them off in case there are any classes of
-      this attack that we missed. Reported by Willem Pinckaers.
-
-  o Minor features:
-    - Adjust the expiration time on our SSL session certificates to
-      better match SSL certs seen in the wild. Resolves ticket 4014.
-    - Change the default required uptime for a relay to be accepted as
-      a HSDir (hidden service directory) from 24 hours to 25 hours.
-      Improves on 0.2.0.10-alpha; resolves ticket 2649.
-    - Add a VoteOnHidServDirectoriesV2 config option to allow directory
-      authorities to abstain from voting on assignment of the HSDir
-      consensus flag. Related to bug 2649.
-    - Update to the September 6 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (documentation and log messages):
-    - Correct the man page to explain that HashedControlPassword and
-      CookieAuthentication can both be set, in which case either method
-      is sufficient to authenticate to Tor. Bugfix on 0.2.0.7-alpha,
-      when we decided to allow these config options to both be set. Issue
-      raised by bug 3898.
-    - Demote the 'replay detected' log message emitted when a hidden
-      service receives the same Diffie-Hellman public key in two different
-      INTRODUCE2 cells to info level. A normal Tor client can cause that
-      log message during its normal operation. Bugfix on 0.2.1.6-alpha;
-      fixes part of bug 2442.
-    - Demote the 'INTRODUCE2 cell is too {old,new}' log message to info
-      level. There is nothing that a hidden service's operator can do
-      to fix its clients' clocks. Bugfix on 0.2.1.6-alpha; fixes part
-      of bug 2442.
-    - Clarify a log message specifying the characters permitted in
-      HiddenServiceAuthorizeClient client names. Previously, the log
-      message said that "[A-Za-z0-9+-_]" were permitted; that could have
-      given the impression that every ASCII character between "+" and "_"
-      was permitted. Now we say "[A-Za-z0-9+_-]". Bugfix on 0.2.1.5-alpha.
-
-  o Build fixes:
-    - Provide a substitute implementation of lround() for MSVC, which
-      apparently lacks it. Patch from Gisle Vanem.
-    - Clean up some code issues that prevented Tor from building on older
-      BSDs. Fixes bug 3894; reported by "grarpamp".
-    - Search for a platform-specific version of "ar" when cross-compiling.
-      Should fix builds on iOS. Resolves bug 3909, found by Marco Bonetti.
-
-
-Changes in version 0.2.3.3-alpha - 2011-09-01
-  Tor 0.2.3.3-alpha adds a new "stream isolation" feature to improve Tor's
-  security, and provides client-side support for the microdescriptor
-  and optimistic data features introduced earlier in the 0.2.3.x
-  series. It also includes numerous critical bugfixes in the (optional)
-  bufferevent-based networking backend.
-
-  o Major features (stream isolation):
-    - You can now configure Tor so that streams from different
-      applications are isolated on different circuits, to prevent an
-      attacker who sees your streams as they leave an exit node from
-      linking your sessions to one another. To do this, choose some way
-      to distinguish the applications: have them connect to different
-      SocksPorts, or have one of them use SOCKS4 while the other uses
-      SOCKS5, or have them pass different authentication strings to the
-      SOCKS proxy. Then, use the new SocksPort syntax to configure the
-      degree of isolation you need. This implements Proposal 171.
-    - There's a new syntax for specifying multiple client ports (such as
-      SOCKSPort, TransPort, DNSPort, NATDPort): you can now just declare
-      multiple *Port entries with full addr:port syntax on each.
-      The old *ListenAddress format is still supported, but you can't
-      mix it with the new *Port syntax.
-
-  o Major features (other):
-    - Enable microdescriptor fetching by default for clients. This allows
-      clients to download a much smaller amount of directory information.
-      To disable it (and go back to the old-style consensus and
-      descriptors), set "UseMicrodescriptors 0" in your torrc file.
-    - Tor's firewall-helper feature, introduced in 0.2.3.1-alpha (see the
-      "PortForwarding" config option), now supports Windows.
-    - When using an exit relay running 0.2.3.x, clients can now
-      "optimistically" send data before the exit relay reports that
-      the stream has opened. This saves a round trip when starting
-      connections where the client speaks first (such as web browsing).
-      This behavior is controlled by a consensus parameter (currently
-      disabled). To turn it on or off manually, use the "OptimisticData"
-      torrc option. Implements proposal 181; code by Ian Goldberg.
-
-  o Major bugfixes (bufferevents, fixes on 0.2.3.1-alpha):
-    - When using IOCP on Windows, we need to enable Libevent windows
-      threading support.
-    - The IOCP backend now works even when the user has not specified
-      the (internal, debugging-only) _UseFilteringSSLBufferevents option.
-      Fixes part of bug 3752.
-    - Correctly record the bytes we've read and written when using
-      bufferevents, so that we can include them in our bandwidth history
-      and advertised bandwidth. Fixes bug 3803.
-    - Apply rate-limiting only at the bottom of a chain of filtering
-      bufferevents. This prevents us from filling up internal read
-      buffers and violating rate-limits when filtering bufferevents
-      are enabled. Fixes part of bug 3804.
-    - Add high-watermarks to the output buffers for filtered
-      bufferevents. This prevents us from filling up internal write
-      buffers and wasting CPU cycles when filtering bufferevents are
-      enabled. Fixes part of bug 3804.
-    - Correctly notice when data has been written from a bufferevent
-      without flushing it completely. Fixes bug 3805.
-    - Fix a bug where server-side tunneled bufferevent-based directory
-      streams would get closed prematurely. Fixes bug 3814.
-    - Fix a use-after-free error with per-connection rate-limiting
-      buckets. Fixes bug 3888.
-
-  o Major bugfixes (also part of 0.2.2.31-rc):
-    - If we're configured to write our ControlPorts to disk, only write
-      them after switching UID and creating the data directory. This way,
-      we don't fail when starting up with a nonexistent DataDirectory
-      and a ControlPortWriteToFile setting based on that directory. Fixes
-      bug 3747; bugfix on Tor 0.2.2.26-beta.
-
-  o Minor features:
-    - Added a new CONF_CHANGED event so that controllers can be notified
-      of any configuration changes made by other controllers, or by the
-      user. Implements ticket 1692.
-    - Use evbuffer_copyout() in inspect_evbuffer(). This fixes a memory
-      leak when using bufferevents, and lets Libevent worry about how to
-      best copy data out of a buffer.
-    - Replace files in stats/ rather than appending to them. Now that we
-      include statistics in extra-info descriptors, it makes no sense to
-      keep old statistics forever. Implements ticket 2930.
-
-  o Minor features (build compatibility):
-    - Limited, experimental support for building with nmake and MSVC.
-    - Provide a substitute implementation of lround() for MSVC, which
-      apparently lacks it. Patch from Gisle Vanem.
-
-  o Minor features (also part of 0.2.2.31-rc):
-    - Update to the August 2 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (on 0.2.3.x-alpha):
-    - Fix a spurious warning when parsing SOCKS requests with
-      bufferevents enabled. Fixes bug 3615; bugfix on 0.2.3.2-alpha.
-    - Get rid of a harmless warning that could happen on relays running
-      with bufferevents. The warning was caused by someone doing an http
-      request to a relay's orport. Also don't warn for a few related
-      non-errors. Fixes bug 3700; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (on 2.2.x and earlier):
-    - Correct the man page to explain that HashedControlPassword and
-      CookieAuthentication can both be set, in which case either method
-      is sufficient to authenticate to Tor. Bugfix on 0.2.0.7-alpha,
-      when we decided to allow these config options to both be set. Issue
-      raised by bug 3898.
-    - The "--quiet" and "--hush" options now apply not only to Tor's
-      behavior before logs are configured, but also to Tor's behavior in
-      the absense of configured logs. Fixes bug 3550; bugfix on
-      0.2.0.10-alpha.
-
-  o Minor bugfixes (also part of 0.2.2.31-rc):
-    - Write several files in text mode, on OSes that distinguish text
-      mode from binary mode (namely, Windows). These files are:
-      'buffer-stats', 'dirreq-stats', and 'entry-stats' on relays
-      that collect those statistics; 'client_keys' and 'hostname' for
-      hidden services that use authentication; and (in the tor-gencert
-      utility) newly generated identity and signing keys. Previously,
-      we wouldn't specify text mode or binary mode, leading to an
-      assertion failure. Fixes bug 3607. Bugfix on 0.2.1.1-alpha (when
-      the DirRecordUsageByCountry option which would have triggered
-      the assertion failure was added), although this assertion failure
-      would have occurred in tor-gencert on Windows in 0.2.0.1-alpha.
-    - Selectively disable deprecation warnings on OS X because Lion
-      started deprecating the shipped copy of openssl. Fixes bug 3643.
-    - Remove an extra pair of quotation marks around the error
-      message in control-port STATUS_GENERAL BUG events. Bugfix on
-      0.1.2.6-alpha; fixes bug 3732.
-    - When unable to format an address as a string, report its value
-      as "???" rather than reusing the last formatted address. Bugfix
-      on 0.2.1.5-alpha.
-
-  o Code simplifications and refactoring:
-    - Rewrite the listener-selection logic so that parsing which ports
-      we want to listen on is now separate from binding to the ports
-      we want.
-
-  o Build changes:
-    - Building Tor with bufferevent support now requires Libevent
-      2.0.13-stable or later. Previous versions of Libevent had bugs in
-      SSL-related bufferevents and related issues that would make Tor
-      work badly with bufferevents. Requiring 2.0.13-stable also allows
-      Tor with bufferevents to take advantage of Libevent APIs
-      introduced after 2.0.8-rc.
-
-
-Changes in version 0.2.2.32 - 2011-08-27
-  The Tor 0.2.2 release series is dedicated to the memory of Andreas
-  Pfitzmann (1958-2010), a pioneer in anonymity and privacy research,
-  a founder of the PETS community, a leader in our field, a mentor,
-  and a friend. He left us with these words: "I had the possibility
-  to contribute to this world that is not as it should be. I hope I
-  could help in some areas to make the world a better place, and that
-  I could also encourage other people to be engaged in improving the
-  world. Please, stay engaged. This world needs you, your love, your
-  initiative -- now I cannot be part of that anymore."
-
-  Tor 0.2.2.32, the first stable release in the 0.2.2 branch, is finally
-  ready. More than two years in the making, this release features improved
-  client performance and hidden service reliability, better compatibility
-  for Android, correct behavior for bridges that listen on more than
-  one address, more extensible and flexible directory object handling,
-  better reporting of network statistics, improved code security, and
-  many many other features and bugfixes.
-
-
-Changes in version 0.2.2.31-rc - 2011-08-17
-  Tor 0.2.2.31-rc is the second and hopefully final release candidate
-  for the Tor 0.2.2.x series.
-
-  o Major bugfixes:
-    - Remove an extra pair of quotation marks around the error
-      message in control-port STATUS_GENERAL BUG events. Bugfix on
-      0.1.2.6-alpha; fixes bug 3732.
-    - If we're configured to write our ControlPorts to disk, only write
-      them after switching UID and creating the data directory. This way,
-      we don't fail when starting up with a nonexistent DataDirectory
-      and a ControlPortWriteToFile setting based on that directory. Fixes
-      bug 3747; bugfix on Tor 0.2.2.26-beta.
-
-  o Minor features:
-    - Update to the August 2 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Allow GETINFO fingerprint to return a fingerprint even when
-      we have not yet built a router descriptor. Fixes bug 3577;
-      bugfix on 0.2.0.1-alpha.
-    - Write several files in text mode, on OSes that distinguish text
-      mode from binary mode (namely, Windows). These files are:
-      'buffer-stats', 'dirreq-stats', and 'entry-stats' on relays
-      that collect those statistics; 'client_keys' and 'hostname' for
-      hidden services that use authentication; and (in the tor-gencert
-      utility) newly generated identity and signing keys. Previously,
-      we wouldn't specify text mode or binary mode, leading to an
-      assertion failure. Fixes bug 3607. Bugfix on 0.2.1.1-alpha (when
-      the DirRecordUsageByCountry option which would have triggered
-      the assertion failure was added), although this assertion failure
-      would have occurred in tor-gencert on Windows in 0.2.0.1-alpha.
-    - Selectively disable deprecation warnings on OS X because Lion
-      started deprecating the shipped copy of openssl. Fixes bug 3643.
-    - When unable to format an address as a string, report its value
-      as "???" rather than reusing the last formatted address. Bugfix
-      on 0.2.1.5-alpha.
-
-
-Changes in version 0.2.3.2-alpha - 2011-07-18
-  Tor 0.2.3.2-alpha introduces two new experimental features:
-  microdescriptors and pluggable transports. It also continues cleaning
-  up a variety of recently introduced features.
-
-  o Major features:
-    - Clients can now use microdescriptors instead of regular descriptors
-      to build circuits. Microdescriptors are authority-generated
-      summaries of regular descriptors' contents, designed to change
-      very rarely (see proposal 158 for details). This feature is
-      designed to save bandwidth, especially for clients on slow internet
-      connections. It's off by default for now, since nearly no caches
-      support it, but it will be on-by-default for clients in a future
-      version. You can use the UseMicrodescriptors option to turn it on.
-    - Tor clients using bridges can now be configured to use a separate
-      'transport' proxy for each bridge. This approach helps to resist
-      censorship by allowing bridges to use protocol obfuscation
-      plugins. It implements part of proposal 180. Implements ticket 2841.
-    - While we're trying to bootstrap, record how many TLS connections
-      fail in each state, and report which states saw the most failures
-      in response to any bootstrap failures. This feature may speed up
-      diagnosis of censorship events. Implements ticket 3116.
-
-  o Major bugfixes (on 0.2.3.1-alpha):
-    - When configuring a large set of nodes in EntryNodes (as with
-      'EntryNodes {cc}' or 'EntryNodes 1.1.1.1/16'), choose only a
-      random subset to be guards, and choose them in random
-      order. Fixes bug 2798.
-    - Tor could crash when remembering a consensus in a non-used consensus
-      flavor without having a current consensus set. Fixes bug 3361.
-    - Comparing an unknown address to a microdescriptor's shortened exit
-      policy would always give a "rejected" result. Fixes bug 3599.
-    - Using microdescriptors as a client no longer prevents Tor from
-      uploading and downloading hidden service descriptors. Fixes
-      bug 3601.
-
-  o Minor features:
-    - Allow nameservers with IPv6 address. Resolves bug 2574.
-    - Accept attempts to include a password authenticator in the
-      handshake, as supported by SOCKS5. This handles SOCKS clients that
-      don't know how to omit a password when authenticating. Resolves
-      bug 1666.
-    - When configuring a large set of nodes in EntryNodes, and there are
-      enough of them listed as Guard so that we don't need to consider
-      the non-guard entries, prefer the ones listed with the Guard flag.
-    - Check for and recover from inconsistency in the microdescriptor
-      cache. This will make it harder for us to accidentally free a
-      microdescriptor without removing it from the appropriate data
-      structures. Fixes issue 3135; issue noted by "wanoskarnet".
-    - Log SSL state transitions at log level DEBUG, log domain
-      HANDSHAKE. This can be useful for debugging censorship events.
-      Implements ticket 3264.
-    - Add port 6523 (Gobby) to LongLivedPorts. Patch by intrigeri;
-      implements ticket 3439.
-
-  o Minor bugfixes (on 0.2.3.1-alpha):
-    - Do not free all general-purpose regular descriptors just
-      because microdescriptor use is enabled. Fixes bug 3113.
-    - Correctly link libevent_openssl when --enable-static-libevent
-      is passed to configure. Fixes bug 3118.
-    - Bridges should not complain during their heartbeat log messages that
-      they are unlisted in the consensus: that's more or less the point
-      of being a bridge. Fixes bug 3183.
-    - Report a SIGNAL event to controllers when acting on a delayed
-      SIGNAL NEWNYM command. Previously, we would report a SIGNAL
-      event to the controller if we acted on a SIGNAL NEWNYM command
-      immediately, and otherwise not report a SIGNAL event for the
-      command at all. Fixes bug 3349.
-    - Fix a crash when handling the SIGNAL controller command or
-      reporting ERR-level status events with bufferevents enabled. Found
-      by Robert Ransom. Fixes bug 3367.
-    - Always ship the tor-fw-helper manpage in our release tarballs.
-      Fixes bug 3389. Reported by Stephen Walker.
-    - Fix a class of double-mark-for-close bugs when bufferevents
-      are enabled. Fixes bug 3403.
-    - Update tor-fw-helper to support libnatpmp-20110618. Fixes bug 3434.
-    - Add SIGNAL to the list returned by the 'GETINFO events/names'
-      control-port command. Fixes part of bug 3465.
-    - Prevent using negative indices during unit test runs when read_all()
-      fails. Spotted by coverity.
-    - Fix a rare memory leak when checking the nodelist without it being
-      present. Found by coverity.
-    - Only try to download a microdescriptor-flavored consensus from
-      a directory cache that provides them.
-
-  o Minor bugfixes (on 0.2.2.x and earlier):
-    - Assert that hidden-service-related operations are not performed
-      using single-hop circuits. Previously, Tor would assert that
-      client-side streams are not attached to single-hop circuits,
-      but not that other sensitive operations on the client and service
-      side are not performed using single-hop circuits. Fixes bug 3332;
-      bugfix on 0.0.6.
-    - Don't publish a new relay descriptor when we reload our onion key,
-      unless the onion key has actually changed. Fixes bug 3263 and
-      resolves another cause of bug 1810. Bugfix on 0.1.1.11-alpha.
-    - Allow GETINFO fingerprint to return a fingerprint even when
-      we have not yet built a router descriptor. Fixes bug 3577;
-      bugfix on 0.2.0.1-alpha.
-    - Make 'tor --digests' list hashes of all Tor source files. Bugfix
-      on 0.2.2.4-alpha; fixes bug 3427.
-
-  o Code simplification and refactoring:
-    - Use tor_sscanf() in place of scanf() in more places through the
-      code. This makes us a little more locale-independent, and
-      should help shut up code-analysis tools that can't tell
-      a safe sscanf string from a dangerous one.
-    - Use tt_assert(), not tor_assert(), for checking for test failures.
-      This makes the unit tests more able to go on in the event that
-      one of them fails.
-    - Split connection_about_to_close() into separate functions for each
-      connection type.
-
-  o Build changes:
-    - On Windows, we now define the _WIN32_WINNT macros only if they
-      are not already defined. This lets the person building Tor decide,
-      if they want, to require a later version of Windows.
-
-
-Changes in version 0.2.2.30-rc - 2011-07-07
-  Tor 0.2.2.30-rc is the first release candidate for the Tor 0.2.2.x
-  series. It fixes a few smaller bugs, but generally appears stable.
-  Please test it and let us know whether it is!
-
-  o Minor bugfixes:
-    - Send a SUCCEEDED stream event to the controller when a reverse
-      resolve succeeded. Fixes bug 3536; bugfix on 0.0.8pre1. Issue
-      discovered by katmagic.
-    - Always NUL-terminate the sun_path field of a sockaddr_un before
-      passing it to the kernel. (Not a security issue: kernels are
-      smart enough to reject bad sockaddr_uns.) Found by Coverity;
-      CID #428. Bugfix on Tor 0.2.0.3-alpha.
-    - Don't stack-allocate the list of supplementary GIDs when we're
-      about to log them. Stack-allocating NGROUPS_MAX gid_t elements
-      could take up to 256K, which is way too much stack. Found by
-      Coverity; CID #450. Bugfix on 0.2.1.7-alpha.
-    - Add BUILDTIMEOUT_SET to the list returned by the 'GETINFO
-      events/names' control-port command. Bugfix on 0.2.2.9-alpha;
-      fixes part of bug 3465.
-    - Fix a memory leak when receiving a descriptor for a hidden
-      service we didn't ask for. Found by Coverity; CID #30. Bugfix
-      on 0.2.2.26-beta.
-
-  o Minor features:
-    - Update to the July 1 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.2.29-beta - 2011-06-20
-  Tor 0.2.2.29-beta reverts an accidental behavior change for users who
-  have bridge lines in their torrc but don't want to use them; gets
-  us closer to having the control socket feature working on Debian;
-  and fixes a variety of smaller bugs.
-
-  o Major bugfixes:
-    - Revert the UseBridges option to its behavior before 0.2.2.28-beta.
-      When we changed the default behavior to "use bridges if any
-      are listed in the torrc", we surprised users who had bridges
-      in their torrc files but who didn't actually want to use them.
-      Partial resolution for bug 3354.
-
-  o Privacy fixes:
-    - Don't attach new streams to old rendezvous circuits after SIGNAL
-      NEWNYM. Previously, we would keep using an existing rendezvous
-      circuit if it remained open (i.e. if it were kept open by a
-      long-lived stream, or if a new stream were attached to it before
-      Tor could notice that it was old and no longer in use). Bugfix on
-      0.1.1.15-rc; fixes bug 3375.
-
-  o Minor bugfixes:
-    - Fix a bug when using ControlSocketsGroupWritable with User. The
-      directory's group would be checked against the current group, not
-      the configured group. Patch by Jérémy Bobbio. Fixes bug 3393;
-      bugfix on 0.2.2.26-beta.
-    - Make connection_printf_to_buf()'s behavior sane. Its callers
-      expect it to emit a CRLF iff the format string ends with CRLF;
-      it actually emitted a CRLF iff (a) the format string ended with
-      CRLF or (b) the resulting string was over 1023 characters long or
-      (c) the format string did not end with CRLF *and* the resulting
-      string was 1021 characters long or longer. Bugfix on 0.1.1.9-alpha;
-      fixes part of bug 3407.
-    - Make send_control_event_impl()'s behavior sane. Its callers
-      expect it to always emit a CRLF at the end of the string; it
-      might have emitted extra control characters as well. Bugfix on
-      0.1.1.9-alpha; fixes another part of bug 3407.
-    - Make crypto_rand_int() check the value of its input correctly.
-      Previously, it accepted values up to UINT_MAX, but could return a
-      negative number if given a value above INT_MAX+1. Found by George
-      Kadianakis. Fixes bug 3306; bugfix on 0.2.2pre14.
-    - Avoid a segfault when reading a malformed circuit build state
-      with more than INT_MAX entries. Found by wanoskarnet. Bugfix on
-      0.2.2.4-alpha.
-    - When asked about a DNS record type we don't support via a
-      client DNSPort, reply with NOTIMPL rather than an empty
-      reply. Patch by intrigeri. Fixes bug 3369; bugfix on 2.0.1-alpha.
-    - Fix a rare memory leak during stats writing. Found by coverity.
-
-  o Minor features:
-    - Update to the June 1 2011 Maxmind GeoLite Country database.
-
-  o Code simplifications and refactoring:
-    - Remove some dead code as indicated by coverity.
-    - Remove a few dead assignments during router parsing. Found by
-      coverity.
-    - Add some forgotten return value checks during unit tests. Found
-      by coverity.
-    - Don't use 1-bit wide signed bit fields. Found by coverity.
-
-
-Changes in version 0.2.2.28-beta - 2011-06-04
-  Tor 0.2.2.28-beta makes great progress towards a new stable release: we
-  fixed a big bug in whether relays stay in the consensus consistently,
-  we moved closer to handling bridges and hidden services correctly,
-  and we started the process of better handling the dreaded "my Vidalia
-  died, and now my Tor demands a password when I try to reconnect to it"
-  usability issue.
-
-  o Major bugfixes:
-    - Don't decide to make a new descriptor when receiving a HUP signal.
-      This bug has caused a lot of 0.2.2.x relays to disappear from the
-      consensus periodically. Fixes the most common case of triggering
-      bug 1810; bugfix on 0.2.2.7-alpha.
-    - Actually allow nameservers with IPv6 addresses. Fixes bug 2574.
-    - Don't try to build descriptors if "ORPort auto" is set and we
-      don't know our actual ORPort yet. Fix for bug 3216; bugfix on
-      0.2.2.26-beta.
-    - Resolve a crash that occurred when setting BridgeRelay to 1 with
-      accounting enabled. Fixes bug 3228; bugfix on 0.2.2.18-alpha.
-    - Apply circuit timeouts to opened hidden-service-related circuits
-      based on the correct start time. Previously, we would apply the
-      circuit build timeout based on time since the circuit's creation;
-      it was supposed to be applied based on time since the circuit
-      entered its current state. Bugfix on 0.0.6; fixes part of bug 1297.
-    - Use the same circuit timeout for client-side introduction
-      circuits as for other four-hop circuits, rather than the timeout
-      for single-hop directory-fetch circuits; the shorter timeout may
-      have been appropriate with the static circuit build timeout in
-      0.2.1.x and earlier, but caused many hidden service access attempts
-      to fail with the adaptive CBT introduced in 0.2.2.2-alpha. Bugfix
-      on 0.2.2.2-alpha; fixes another part of bug 1297.
-    - In ticket 2511 we fixed a case where you could use an unconfigured
-      bridge if you had configured it as a bridge the last time you ran
-      Tor. Now fix another edge case: if you had configured it as a bridge
-      but then switched to a different bridge via the controller, you
-      would still be willing to use the old one. Bugfix on 0.2.0.1-alpha;
-      fixes bug 3321.
-
-  o Major features:
-    - Add an __OwningControllerProcess configuration option and a
-      TAKEOWNERSHIP control-port command. Now a Tor controller can ensure
-      that when it exits, Tor will shut down. Implements feature 3049.
-    - If "UseBridges 1" is set and no bridges are configured, Tor will
-      now refuse to build any circuits until some bridges are set.
-      If "UseBridges auto" is set, Tor will use bridges if they are
-      configured and we are not running as a server, but otherwise will
-      make circuits as usual. The new default is "auto". Patch by anonym,
-      so the Tails LiveCD can stop automatically revealing you as a Tor
-      user on startup.
-
-  o Minor bugfixes:
-    - Fix warnings from GCC 4.6's "-Wunused-but-set-variable" option.
-    - Remove a trailing asterisk from "exit-policy/default" in the
-      output of the control port command "GETINFO info/names". Bugfix
-      on 0.1.2.5-alpha.
-    - Use a wide type to hold sockets when built for 64-bit Windows builds.
-      Fixes bug 3270.
-    - Warn when the user configures two HiddenServiceDir lines that point
-      to the same directory. Bugfix on 0.0.6 (the version introducing
-      HiddenServiceDir); fixes bug 3289.
-    - Remove dead code from rend_cache_lookup_v2_desc_as_dir. Fixes
-      part of bug 2748; bugfix on 0.2.0.10-alpha.
-    - Log malformed requests for rendezvous descriptors as protocol
-      warnings, not warnings. Also, use a more informative log message
-      in case someone sees it at log level warning without prior
-      info-level messages. Fixes the other part of bug 2748; bugfix
-      on 0.2.0.10-alpha.
-    - Clear the table recording the time of the last request for each
-      hidden service descriptor from each HS directory on SIGNAL NEWNYM.
-      Previously, we would clear our HS descriptor cache on SIGNAL
-      NEWNYM, but if we had previously retrieved a descriptor (or tried
-      to) from every directory responsible for it, we would refuse to
-      fetch it again for up to 15 minutes. Bugfix on 0.2.2.25-alpha;
-      fixes bug 3309.
-    - Fix a log message that said "bits" while displaying a value in
-      bytes. Found by wanoskarnet. Fixes bug 3318; bugfix on
-      0.2.0.1-alpha.
-    - When checking for 1024-bit keys, check for 1024 bits, not 128
-      bytes. This allows Tor to correctly discard keys of length 1017
-      through 1023. Bugfix on 0.0.9pre5.
-
-  o Minor features:
-    - Relays now log the reason for publishing a new relay descriptor,
-      so we have a better chance of hunting down instances of bug 1810.
-      Resolves ticket 3252.
-    - Revise most log messages that refer to nodes by nickname to
-      instead use the "$key=nickname at address" format. This should be
-      more useful, especially since nicknames are less and less likely
-      to be unique. Resolves ticket 3045.
-    - Log (at info level) when purging pieces of hidden-service-client
-      state because of SIGNAL NEWNYM.
-
-  o Removed options:
-    - Remove undocumented option "-F" from tor-resolve: it hasn't done
-      anything since 0.2.1.16-rc.
-
-
-Changes in version 0.2.2.27-beta - 2011-05-18
-  Tor 0.2.2.27-beta fixes a bridge-related stability bug in the previous
-  release, and also adds a few more general bugfixes.
-
-  o Major bugfixes:
-    - Fix a crash bug when changing bridges in a running Tor process.
-      Fixes bug 3213; bugfix on 0.2.2.26-beta.
-    - When the controller configures a new bridge, don't wait 10 to 60
-      seconds before trying to fetch its descriptor. Bugfix on
-      0.2.0.3-alpha; fixes bug 3198 (suggested by 2355).
-
-  o Minor bugfixes:
-    - Require that onion keys have exponent 65537 in microdescriptors too.
-      Fixes more of bug 3207; bugfix on 0.2.2.26-beta.
-    - Tor used to limit HttpProxyAuthenticator values to 48 characters.
-      Changed the limit to 512 characters by removing base64 newlines.
-      Fixes bug 2752. Fix by Michael Yakubovich.
-    - When a client starts or stops using bridges, never use a circuit
-      that was built before the configuration change. This behavior could
-      put at risk a user who uses bridges to ensure that her traffic
-      only goes to the chosen addresses. Bugfix on 0.2.0.3-alpha; fixes
-      bug 3200.
-
-
-Changes in version 0.2.2.26-beta - 2011-05-17
-  Tor 0.2.2.26-beta fixes a variety of potential privacy problems. It
-  also introduces a new "socksport auto" approach that should make it
-  easier to run multiple Tors on the same system, and does a lot of
-  cleanup to get us closer to a release candidate.
-
-  o Security/privacy fixes:
-    - Replace all potentially sensitive memory comparison operations
-      with versions whose runtime does not depend on the data being
-      compared. This will help resist a class of attacks where an
-      adversary can use variations in timing information to learn
-      sensitive data. Fix for one case of bug 3122. (Safe memcmp
-      implementation by Robert Ransom based partially on code by DJB.)
-    - When receiving a hidden service descriptor, check that it is for
-      the hidden service we wanted. Previously, Tor would store any
-      hidden service descriptors that a directory gave it, whether it
-      wanted them or not. This wouldn't have let an attacker impersonate
-      a hidden service, but it did let directories pre-seed a client
-      with descriptors that it didn't want. Bugfix on 0.0.6.
-    - On SIGHUP, do not clear out all TrackHostExits mappings, client
-      DNS cache entries, and virtual address mappings: that's what
-      NEWNYM is for. Fixes bug 1345; bugfix on 0.1.0.1-rc.
-
-  o Major features:
-    - The options SocksPort, ControlPort, and so on now all accept a
-      value "auto" that opens a socket on an OS-selected port. A
-      new ControlPortWriteToFile option tells Tor to write its
-      actual control port or ports to a chosen file. If the option
-      ControlPortFileGroupReadable is set, the file is created as
-      group-readable. Now users can run two Tor clients on the same
-      system without needing to manually mess with parameters. Resolves
-      part of ticket 3076.
-    - Set SO_REUSEADDR on all sockets, not just listeners. This should
-      help busy exit nodes avoid running out of useable ports just
-      because all the ports have been used in the near past. Resolves
-      issue 2850.
-
-  o Minor features:
-    - New "GETINFO net/listeners/(type)" controller command to return
-      a list of addresses and ports that are bound for listeners for a
-      given connection type. This is useful when the user has configured
-      "SocksPort auto" and the controller needs to know which port got
-      chosen. Resolves another part of ticket 3076.
-    - Add a new ControlSocketsGroupWritable configuration option: when
-      it is turned on, ControlSockets are group-writeable by the default
-      group of the current user. Patch by Jérémy Bobbio; implements
-      ticket 2972.
-    - Tor now refuses to create a ControlSocket in a directory that is
-      world-readable (or group-readable if ControlSocketsGroupWritable
-      is 0). This is necessary because some operating systems do not
-      enforce permissions on an AF_UNIX sockets. Permissions on the
-      directory holding the socket, however, seems to work everywhere.
-    - Rate-limit a warning about failures to download v2 networkstatus
-      documents. Resolves part of bug 1352.
-    - Backport code from 0.2.3.x that allows directory authorities to
-      clean their microdescriptor caches. Needed to resolve bug 2230.
-    - When an HTTPS proxy reports "403 Forbidden", we now explain
-      what it means rather than calling it an unexpected status code.
-      Closes bug 2503. Patch from Michael Yakubovich.
-    - Update to the May 1 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Authorities now clean their microdesc cache periodically and when
-      reading from disk initially, not only when adding new descriptors.
-      This prevents a bug where we could lose microdescriptors. Bugfix
-      on 0.2.2.6-alpha. Fixes bug 2230.
-    - Do not crash when our configuration file becomes unreadable, for
-      example due to a permissions change, between when we start up
-      and when a controller calls SAVECONF. Fixes bug 3135; bugfix
-      on 0.0.9pre6.
-    - Avoid a bug that would keep us from replacing a microdescriptor
-      cache on Windows. (We would try to replace the file while still
-      holding it open. That's fine on Unix, but Windows doesn't let us
-      do that.) Bugfix on 0.2.2.6-alpha; bug found by wanoskarnet.
-    - Add missing explanations for the authority-related torrc options
-      RephistTrackTime, BridgePassword, and V3AuthUseLegacyKey in the
-      man page. Resolves issue 2379.
-    - As an authority, do not upload our own vote or signature set to
-      ourself. It would tell us nothing new, and as of 0.2.2.24-alpha,
-      it would get flagged as a duplicate. Resolves bug 3026.
-    - Accept hidden service descriptors if we think we might be a hidden
-      service directory, regardless of what our consensus says. This
-      helps robustness, since clients and hidden services can sometimes
-      have a more up-to-date view of the network consensus than we do,
-      and if they think that the directory authorities list us a HSDir,
-      we might actually be one. Related to bug 2732; bugfix on
-      0.2.0.10-alpha.
-    - When a controller changes TrackHostExits, remove mappings for
-      hosts that should no longer have their exits tracked. Bugfix on
-      0.1.0.1-rc.
-    - When a controller changes VirtualAddrNetwork, remove any mappings
-      for hosts that were automapped to the old network. Bugfix on
-      0.1.1.19-rc.
-    - When a controller changes one of the AutomapHosts* options, remove
-      any mappings for hosts that should no longer be automapped. Bugfix
-      on 0.2.0.1-alpha.
-    - Do not reset the bridge descriptor download status every time we
-      re-parse our configuration or get a configuration change. Fixes
-      bug 3019; bugfix on 0.2.0.3-alpha.
-
-  o Minor bugfixes (code cleanup):
-    - When loading the microdesc journal, remember its current size.
-      In 0.2.2, this helps prevent the microdesc journal from growing
-      without limit on authorities (who are the only ones to use it in
-      0.2.2). Fixes a part of bug 2230; bugfix on 0.2.2.6-alpha.
-      Fix posted by "cypherpunks."
-    - The microdesc journal is supposed to get rebuilt only if it is
-      at least _half_ the length of the store, not _twice_ the length
-      of the store. Bugfix on 0.2.2.6-alpha; fixes part of bug 2230.
-    - Fix a potential null-pointer dereference while computing a
-      consensus. Bugfix on 0.2.0.3-alpha, found with the help of
-      clang's analyzer.
-    - Avoid a possible null-pointer dereference when rebuilding the mdesc
-      cache without actually having any descriptors to cache. Bugfix on
-      0.2.2.6-alpha. Issue discovered using clang's static analyzer.
-    - If we fail to compute the identity digest of a v3 legacy keypair,
-      warn, and don't use a buffer-full of junk instead. Bugfix on
-      0.2.1.1-alpha; fixes bug 3106.
-    - Resolve an untriggerable issue in smartlist_string_num_isin(),
-      where if the function had ever in the future been used to check
-      for the presence of a too-large number, it would have given an
-      incorrect result. (Fortunately, we only used it for 16-bit
-      values.) Fixes bug 3175; bugfix on 0.1.0.1-rc.
-    - Require that introduction point keys and onion handshake keys
-      have a public exponent of 65537. Starts to fix bug 3207; bugfix
-      on 0.2.0.10-alpha.
-
-  o Removed features:
-    - Caches no longer download and serve v2 networkstatus documents
-      unless FetchV2Networkstatus flag is set: these documents haven't
-      haven't been used by clients or relays since 0.2.0.x. Resolves
-      bug 3022.
-
-
-Changes in version 0.2.3.1-alpha - 2011-05-05
-  Tor 0.2.3.1-alpha adds some new experimental features, including support
-  for an improved network IO backend, IOCP networking on Windows,
-  microdescriptor caching, "fast-start" support for streams, and automatic
-  home router configuration. There are also numerous internal improvements
-  to try to make the code easier for developers to work with.
-
-  This is the first alpha release in a new series, so expect there to be
-  bugs. Users who would rather test out a more stable branch should
-  stay with 0.2.2.x for now.
-
-  o Major features:
-    - Tor can now optionally build with the "bufferevents" buffered IO
-      backend provided by Libevent 2. To use this feature, make sure you
-      have the latest possible version of Libevent, and pass the
-      --enable-bufferevents flag to configure when building Tor from
-      source. This feature will make our networking code more flexible,
-      let us stack layers on each other, and let us use more efficient
-      zero-copy transports where available.
-    - As an experimental feature, Tor can use IOCP for networking on Windows.
-      Once this code is tuned and optimized, it promises much better
-      performance than the select-based backend we've used in the past. To
-      try this feature, you must build Tor with Libevent 2, configure Tor
-      with the "bufferevents" buffered IO backend, and add "DisableIOCP 0" to
-      your torrc. There are known bugs here: only try this if you can help
-      debug it as it breaks.
-    - The EntryNodes option can now include country codes like {de} or IP
-      addresses or network masks. Previously we had disallowed these options
-      because we didn't have an efficient way to keep the list up to
-      date. Fixes bug 1982, but see bug 2798 for an unresolved issue here.
-    - Exit nodes now accept and queue data on not-yet-connected streams.
-      Previously, the client wasn't allowed to send data until the stream was
-      connected, which slowed down all connections. This change will enable
-      clients to perform a "fast-start" on streams and send data without
-      having to wait for a confirmation that the stream has opened. (Patch
-      from Ian Goldberg; implements the server side of Proposal 174.)
-    - Tor now has initial support for automatic port mapping on the many
-      home routers that support NAT-PMP or UPnP. (Not yet supported on
-      Windows). To build the support code, you'll need to have libnatpnp
-      library and/or the libminiupnpc library, and you'll need to enable the
-      feature specifically by passing "--enable-upnp" and/or
-      "--enable-natpnp" to configure. To turn it on, use the new
-      PortForwarding option.
-    - Caches now download, cache, and serve multiple "flavors" of the
-      consensus, including a flavor that describes microdescriptors.
-    - Caches now download, cache, and serve microdescriptors -- small
-      summaries of router descriptors that are authenticated by all of the
-      directory authorities. Once enough caches are running this code,
-      clients will be able to save significant amounts of directory bandwidth
-      by downloading microdescriptors instead of router descriptors.
-
-  o Minor features:
-    - Make logging resolution configurable with a new LogTimeGranularity
-      option, and change the default from 1 millisecond to 1 second.
-      Implements enhancement 1668.
-    - We log which torrc file we're using on startup. Implements ticket
-      2444.
-    - Ordinarily, Tor does not count traffic from private addresses (like
-      127.0.0.1 or 10.0.0.1) when calculating rate limits or accounting.
-      There is now a new option, CountPrivateBandwidth, to disable this
-      behavior. Patch from Daniel Cagara.
-    - New --enable-static-tor configure option for building Tor as
-      statically as possible. Idea, general hackery and thoughts from
-      Alexei Czeskis, John Gilmore, Jacob Appelbaum. Implements ticket
-      2702.
-    - If you set the NumCPUs option to 0, Tor will now try to detect how
-      many CPUs you have. This is the new default behavior.
-    - Turn on directory request statistics by default and include them in
-      extra-info descriptors. Don't break if we have no GeoIP database.
-    - Relays that set "ConnDirectionStatistics 1" write statistics on the
-      bidirectional use of connections to disk every 24 hours.
-    - Add a GeoIP file digest to the extra-info descriptor. Implements
-      enhancement 1883.
-    - The NodeFamily option -- which let you declare that you want to
-      consider nodes to be part of a family whether they list themselves
-      that way or not -- now allows IP address ranges and country codes.
-    - Add a new 'Heartbeat' log message type to periodically log a message
-      describing Tor's status at level Notice. This feature is meant for
-      operators who log at notice, and want to make sure that their Tor
-      server is still working. Implementation by George Kadianakis.
-
-  o Minor bugfixes (on 0.2.2.25-alpha):
-    - When loading the microdesc journal, remember its current size.
-      In 0.2.2, this helps prevent the microdesc journal from growing
-      without limit on authorities (who are the only ones to use it in
-      0.2.2). Fixes a part of bug 2230; bugfix on 0.2.2.6-alpha.
-      Fix posted by "cypherpunks."
-    - The microdesc journal is supposed to get rebuilt only if it is
-      at least _half_ the length of the store, not _twice_ the length
-      of the store. Bugfix on 0.2.2.6-alpha; fixes part of bug 2230.
-    - If as an authority we fail to compute the identity digest of a v3
-      legacy keypair, warn, and don't use a buffer-full of junk instead.
-      Bugfix on 0.2.1.1-alpha; fixes bug 3106.
-    - Authorities now clean their microdesc cache periodically and when
-      reading from disk initially, not only when adding new descriptors.
-      This prevents a bug where we could lose microdescriptors. Bugfix
-      on 0.2.2.6-alpha.
-
-  o Minor features (controller):
-    - Add a new SIGNAL event to the controller interface so that
-      controllers can be notified when Tor handles a signal. Resolves
-      issue 1955. Patch by John Brooks.
-    - Add a new GETINFO option to get total bytes read and written. Patch
-      from pipe, revised by atagar. Resolves ticket 2345.
-    - Implement some GETINFO controller fields to provide information about
-      the Tor process's pid, euid, username, and resource limits.
-
-  o Build changes:
-    - Our build system requires automake 1.6 or later to create the
-      Makefile.in files. Previously, you could have used 1.4.
-      This only affects developers and people building Tor from git;
-      people who build Tor from the source distribution without changing
-      the Makefile.am files should be fine.
-    - Our autogen.sh script uses autoreconf to launch autoconf, automake, and
-      so on. This is more robust against some of the failure modes
-      associated with running the autotools pieces on their own.
-
-  o Minor packaging issues:
-    - On OpenSUSE, create the /var/run/tor directory on startup if it is not
-      already created. Patch from Andreas Stieger. Fixes bug 2573.
-
-  o Code simplifications and refactoring:
-    - A major revision to our internal node-selecting and listing logic.
-      Tor already had at least two major ways to look at the question of
-      "which Tor servers do we know about": a list of router descriptors,
-      and a list of entries in the current consensus. With
-      microdescriptors, we're adding a third. Having so many systems
-      without an abstraction layer over them was hurting the codebase.
-      Now, we have a new "node_t" abstraction that presents a consistent
-      interface to a client's view of a Tor node, and holds (nearly) all
-      of the mutable state formerly in routerinfo_t and routerstatus_t.
-    - The helper programs tor-gencert, tor-resolve, and tor-checkkey
-      no longer link against Libevent: they never used it, but
-      our library structure used to force them to link it.
-
-  o Removed features:
-    - Remove some old code to work around even older versions of Tor that
-      used forked processes to handle DNS requests. Such versions of Tor
-      are no longer in use as servers.
-
-  o Documentation fixes:
-    - Correct a broken faq link in the INSTALL file. Fixes bug 2307.
-    - Add missing documentation for the authority-related torrc options
-      RephistTrackTime, BridgePassword, and V3AuthUseLegacyKey. Resolves
-      issue 2379.
-
-
-Changes in version 0.2.2.25-alpha - 2011-04-29
-  Tor 0.2.2.25-alpha fixes many bugs: hidden service clients are more
-  robust, routers no longer overreport their bandwidth, Win7 should crash
-  a little less, and NEWNYM (as used by Vidalia's "new identity" button)
-  now prevents hidden service-related activity from being linkable. It
-  provides more information to Vidalia so you can see if your bridge is
-  working. Also, 0.2.2.25-alpha revamps the Entry/Exit/ExcludeNodes and
-  StrictNodes configuration options to make them more reliable, more
-  understandable, and more regularly applied. If you use those options,
-  please see the revised documentation for them in the manual page.
-
-  o Major bugfixes:
-    - Relays were publishing grossly inflated bandwidth values because
-      they were writing their state files wrong--now they write the
-      correct value. Also, resume reading bandwidth history from the
-      state file correctly. Fixes bug 2704; bugfix on 0.2.2.23-alpha.
-    - Improve hidden service robustness: When we find that we have
-      extended a hidden service's introduction circuit to a relay not
-      listed as an introduction point in the HS descriptor we currently
-      have, retry with an introduction point from the current
-      descriptor. Previously we would just give up. Fixes bugs 1024 and
-      1930; bugfix on 0.2.0.10-alpha.
-    - Clients now stop trying to use an exit node associated with a given
-      destination by TrackHostExits if they fail to reach that exit node.
-      Fixes bug 2999. Bugfix on 0.2.0.20-rc.
-    - Fix crash bug on platforms where gmtime and localtime can return
-      NULL. Windows 7 users were running into this one. Fixes part of bug
-      2077. Bugfix on all versions of Tor. Found by boboper.
-
-  o Security and stability fixes:
-    - Don't double-free a parsable, but invalid, microdescriptor, even if
-      it is followed in the blob we're parsing by an unparsable
-      microdescriptor. Fixes an issue reported in a comment on bug 2954.
-      Bugfix on 0.2.2.6-alpha; fix by "cypherpunks".
-    - If the Nickname configuration option isn't given, Tor would pick a
-      nickname based on the local hostname as the nickname for a relay.
-      Because nicknames are not very important in today's Tor and the
-      "Unnamed" nickname has been implemented, this is now problematic
-      behavior: It leaks information about the hostname without being
-      useful at all. Fixes bug 2979; bugfix on 0.1.2.2-alpha, which
-      introduced the Unnamed nickname. Reported by tagnaq.
-    - Fix an uncommon assertion failure when running with DNSPort under
-      heavy load. Fixes bug 2933; bugfix on 0.2.0.1-alpha.
-    - Avoid linkability based on cached hidden service descriptors: forget
-      all hidden service descriptors cached as a client when processing a
-      SIGNAL NEWNYM command. Fixes bug 3000; bugfix on 0.0.6.
-
-  o Major features:
-    - Export GeoIP information on bridge usage to controllers even if we
-      have not yet been running for 24 hours. Now Vidalia bridge operators
-      can get more accurate and immediate feedback about their
-      contributions to the network.
-
-  o Major features and bugfixes (node selection):
-    - Revise and reconcile the meaning of the ExitNodes, EntryNodes,
-      ExcludeEntryNodes, ExcludeExitNodes, ExcludeNodes, and StrictNodes
-      options. Previously, we had been ambiguous in describing what
-      counted as an "exit" node, and what operations exactly "StrictNodes
-      0" would permit. This created confusion when people saw nodes built
-      through unexpected circuits, and made it hard to tell real bugs from
-      surprises. Now the intended behavior is:
-        . "Exit", in the context of ExitNodes and ExcludeExitNodes, means
-          a node that delivers user traffic outside the Tor network.
-        . "Entry", in the context of EntryNodes, means a node used as the
-          first hop of a multihop circuit. It doesn't include direct
-          connections to directory servers.
-        . "ExcludeNodes" applies to all nodes.
-        . "StrictNodes" changes the behavior of ExcludeNodes only. When
-          StrictNodes is set, Tor should avoid all nodes listed in
-          ExcludeNodes, even when it will make user requests fail. When
-          StrictNodes is *not* set, then Tor should follow ExcludeNodes
-          whenever it can, except when it must use an excluded node to
-          perform self-tests, connect to a hidden service, provide a
-          hidden service, fulfill a .exit request, upload directory
-          information, or fetch directory information.
-      Collectively, the changes to implement the behavior fix bug 1090.
-    - ExcludeNodes now takes precedence over EntryNodes and ExitNodes: if
-      a node is listed in both, it's treated as excluded.
-    - ExcludeNodes now applies to directory nodes -- as a preference if
-      StrictNodes is 0, or an absolute requirement if StrictNodes is 1.
-      Don't exclude all the directory authorities and set StrictNodes to 1
-      unless you really want your Tor to break.
-    - ExcludeNodes and ExcludeExitNodes now override exit enclaving.
-    - ExcludeExitNodes now overrides .exit requests.
-    - We don't use bridges listed in ExcludeNodes.
-    - When StrictNodes is 1:
-       . We now apply ExcludeNodes to hidden service introduction points
-         and to rendezvous points selected by hidden service users. This
-         can make your hidden service less reliable: use it with caution!
-       . If we have used ExcludeNodes on ourself, do not try relay
-         reachability self-tests.
-       . If we have excluded all the directory authorities, we will not
-         even try to upload our descriptor if we're a relay.
-       . Do not honor .exit requests to an excluded node.
-    - Remove a misfeature that caused us to ignore the Fast/Stable flags
-      when ExitNodes is set. Bugfix on 0.2.2.7-alpha.
-    - When the set of permitted nodes changes, we now remove any mappings
-      introduced via TrackExitHosts to now-excluded nodes. Bugfix on
-      0.1.0.1-rc.
-    - We never cannibalize a circuit that had excluded nodes on it, even
-      if StrictNodes is 0. Bugfix on 0.1.0.1-rc.
-    - Revert a change where we would be laxer about attaching streams to
-      circuits than when building the circuits. This was meant to prevent
-      a set of bugs where streams were never attachable, but our improved
-      code here should make this unnecessary. Bugfix on 0.2.2.7-alpha.
-    - Keep track of how many times we launch a new circuit to handle a
-      given stream. Too many launches could indicate an inconsistency
-      between our "launch a circuit to handle this stream" logic and our
-      "attach this stream to one of the available circuits" logic.
-    - Improve log messages related to excluded nodes.
-
-  o Minor bugfixes:
-    - Fix a spurious warning when moving from a short month to a long
-      month on relays with month-based BandwidthAccounting. Bugfix on
-      0.2.2.17-alpha; fixes bug 3020.
-    - When a client finds that an origin circuit has run out of 16-bit
-      stream IDs, we now mark it as unusable for new streams. Previously,
-      we would try to close the entire circuit. Bugfix on 0.0.6.
-    - Add a forgotten cast that caused a compile warning on OS X 10.6.
-      Bugfix on 0.2.2.24-alpha.
-    - Be more careful about reporting the correct error from a failed
-      connect() system call. Under some circumstances, it was possible to
-      look at an incorrect value for errno when sending the end reason.
-      Bugfix on 0.1.0.1-rc.
-    - Correctly handle an "impossible" overflow cases in connection byte
-      counting, where we write or read more than 4GB on an edge connection
-      in a single second. Bugfix on 0.1.2.8-beta.
-    - Correct the warning displayed when a rendezvous descriptor exceeds
-      the maximum size. Fixes bug 2750; bugfix on 0.2.1.5-alpha. Found by
-      John Brooks.
-    - Clients and hidden services now use HSDir-flagged relays for hidden
-      service descriptor downloads and uploads even if the relays have no
-      DirPort set and the client has disabled TunnelDirConns. This will
-      eventually allow us to give the HSDir flag to relays with no
-      DirPort. Fixes bug 2722; bugfix on 0.2.1.6-alpha.
-    - Downgrade "no current certificates known for authority" message from
-      Notice to Info. Fixes bug 2899; bugfix on 0.2.0.10-alpha.
-    - Make the SIGNAL DUMP control-port command work on FreeBSD. Fixes bug
-      2917. Bugfix on 0.1.1.1-alpha.
-    - Only limit the lengths of single HS descriptors, even when multiple
-      HS descriptors are published to an HSDir relay in a single POST
-      operation. Fixes bug 2948; bugfix on 0.2.1.5-alpha. Found by hsdir.
-    - Write the current time into the LastWritten line in our state file,
-      rather than the time from the previous write attempt. Also, stop
-      trying to use a time of -1 in our log statements. Fixes bug 3039;
-      bugfix on 0.2.2.14-alpha.
-    - Be more consistent in our treatment of file system paths. "~" should
-      get expanded to the user's home directory in the Log config option.
-      Fixes bug 2971; bugfix on 0.2.0.1-alpha, which introduced the
-      feature for the -f and --DataDirectory options.
-
-  o Minor features:
-    - Make sure every relay writes a state file at least every 12 hours.
-      Previously, a relay could go for weeks without writing its state
-      file, and on a crash could lose its bandwidth history, capacity
-      estimates, client country statistics, and so on. Addresses bug 3012.
-    - Send END_STREAM_REASON_NOROUTE in response to EHOSTUNREACH errors.
-      Clients before 0.2.1.27 didn't handle NOROUTE correctly, but such
-      clients are already deprecated because of security bugs.
-    - Don't allow v0 hidden service authorities to act as clients.
-      Required by fix for bug 3000.
-    - Ignore SIGNAL NEWNYM commands on relay-only Tor instances. Required
-      by fix for bug 3000.
-    - Ensure that no empty [dirreq-](read|write)-history lines are added
-      to an extrainfo document. Implements ticket 2497.
-
-  o Code simplification and refactoring:
-    - Remove workaround code to handle directory responses from servers
-      that had bug 539 (they would send HTTP status 503 responses _and_
-      send a body too). Since only server versions before
-      0.2.0.16-alpha/0.1.2.19 were affected, there is no longer reason to
-      keep the workaround in place.
-    - Remove the old 'fuzzy time' logic. It was supposed to be used for
-      handling calculations where we have a known amount of clock skew and
-      an allowed amount of unknown skew. But we only used it in three
-      places, and we never adjusted the known/unknown skew values. This is
-      still something we might want to do someday, but if we do, we'll
-      want to do it differently.
-    - Avoid signed/unsigned comparisons by making SIZE_T_CEILING unsigned.
-      None of the cases where we did this before were wrong, but by making
-      this change we avoid warnings. Fixes bug 2475; bugfix on 0.2.1.28.
-    - Use GetTempDir to find the proper temporary directory location on
-      Windows when generating temporary files for the unit tests. Patch by
-      Gisle Vanem.
-
-
-Changes in version 0.2.2.24-alpha - 2011-04-08
-  Tor 0.2.2.24-alpha fixes a variety of bugs, including a big bug that
-  prevented Tor clients from effectively using "multihomed" bridges,
-  that is, bridges that listen on multiple ports or IP addresses so users
-  can continue to use some of their addresses even if others get blocked.
-
-  o Major bugfixes:
-    - Fix a bug where bridge users who configure the non-canonical
-      address of a bridge automatically switch to its canonical
-      address. If a bridge listens at more than one address, it should be
-      able to advertise those addresses independently and any non-blocked
-      addresses should continue to work. Bugfix on Tor 0.2.0.x. Fixes
-      bug 2510.
-    - If you configured Tor to use bridge A, and then quit and
-      configured Tor to use bridge B instead, it would happily continue
-      to use bridge A if it's still reachable. While this behavior is
-      a feature if your goal is connectivity, in some scenarios it's a
-      dangerous bug. Bugfix on Tor 0.2.0.1-alpha; fixes bug 2511.
-    - Directory authorities now use data collected from their own
-      uptime observations when choosing whether to assign the HSDir flag
-      to relays, instead of trusting the uptime value the relay reports in
-      its descriptor. This change helps prevent an attack where a small
-      set of nodes with frequently-changing identity keys can blackhole
-      a hidden service. (Only authorities need upgrade; others will be
-      fine once they do.) Bugfix on 0.2.0.10-alpha; fixes bug 2709.
-
-  o Minor bugfixes:
-    - When we restart our relay, we might get a successful connection
-      from the outside before we've started our reachability tests,
-      triggering a warning: "ORPort found reachable, but I have no
-      routerinfo yet. Failing to inform controller of success." This
-      bug was harmless unless Tor is running under a controller
-      like Vidalia, in which case the controller would never get a
-      REACHABILITY_SUCCEEDED status event. Bugfix on 0.1.2.6-alpha;
-      fixes bug 1172.
-    - Make directory authorities more accurate at recording when
-      relays that have failed several reachability tests became
-      unreachable, so we can provide more accuracy at assigning Stable,
-      Guard, HSDir, etc flags. Bugfix on 0.2.0.6-alpha. Resolves bug 2716.
-    - Fix an issue that prevented static linking of libevent on
-      some platforms (notably Linux). Fixes bug 2698; bugfix on
-      versions 0.2.1.23/0.2.2.8-alpha (the versions introducing
-      the --with-static-libevent configure option).
-    - We now ask the other side of a stream (the client or the exit)
-      for more data on that stream when the amount of queued data on
-      that stream dips low enough. Previously, we wouldn't ask the
-      other side for more data until either it sent us more data (which
-      it wasn't supposed to do if it had exhausted its window!) or we
-      had completely flushed all our queued data. This flow control fix
-      should improve throughput. Fixes bug 2756; bugfix on the earliest
-      released versions of Tor (svn commit r152).
-    - Avoid a double-mark-for-free warning when failing to attach a
-      transparent proxy connection. (We thought we had fixed this in
-      0.2.2.23-alpha, but it turns out our fix was checking the wrong
-      connection.) Fixes bug 2757; bugfix on 0.1.2.1-alpha (the original
-      bug) and 0.2.2.23-alpha (the incorrect fix).
-    - When warning about missing zlib development packages during compile,
-      give the correct package names. Bugfix on 0.2.0.1-alpha.
-
-  o Minor features:
-    - Directory authorities now log the source of a rejected POSTed v3
-      networkstatus vote.
-    - Make compilation with clang possible when using
-      --enable-gcc-warnings by removing two warning options that clang
-      hasn't implemented yet and by fixing a few warnings. Implements
-      ticket 2696.
-    - When expiring circuits, use microsecond timers rather than
-      one-second timers. This can avoid an unpleasant situation where a
-      circuit is launched near the end of one second and expired right
-      near the beginning of the next, and prevent fluctuations in circuit
-      timeout values.
-    - Use computed circuit-build timeouts to decide when to launch
-      parallel introduction circuits for hidden services. (Previously,
-      we would retry after 15 seconds.)
-    - Update to the April 1 2011 Maxmind GeoLite Country database.
-
-  o Packaging fixes:
-    - Create the /var/run/tor directory on startup on OpenSUSE if it is
-      not already created. Patch from Andreas Stieger. Fixes bug 2573.
-
-  o Documentation changes:
-    - Modernize the doxygen configuration file slightly. Fixes bug 2707.
-    - Resolve all doxygen warnings except those for missing documentation.
-      Fixes bug 2705.
-    - Add doxygen documentation for more functions, fields, and types.
-
-
-Changes in version 0.2.2.23-alpha - 2011-03-08
-  Tor 0.2.2.23-alpha lets relays record their bandwidth history so when
-  they restart they don't lose their bandwidth capacity estimate. This
-  release also fixes a diverse set of user-facing bugs, ranging from
-  relays overrunning their rate limiting to clients falsely warning about
-  clock skew to bridge descriptor leaks by our bridge directory authority.
-
-  o Major bugfixes:
-    - Stop sending a CLOCK_SKEW controller status event whenever
-      we fetch directory information from a relay that has a wrong clock.
-      Instead, only inform the controller when it's a trusted authority
-      that claims our clock is wrong. Bugfix on 0.1.2.6-alpha; fixes
-      the rest of bug 1074.
-    - Fix an assert in parsing router descriptors containing IPv6
-      addresses. This one took down the directory authorities when
-      somebody tried some experimental code. Bugfix on 0.2.1.3-alpha.
-    - Make the bridge directory authority refuse to answer directory
-      requests for "all" descriptors. It used to include bridge
-      descriptors in its answer, which was a major information leak.
-      Found by "piebeer". Bugfix on 0.2.0.3-alpha.
-    - If relays set RelayBandwidthBurst but not RelayBandwidthRate,
-      Tor would ignore their RelayBandwidthBurst setting,
-      potentially using more bandwidth than expected. Bugfix on
-      0.2.0.1-alpha. Reported by Paul Wouters. Fixes bug 2470.
-    - Ignore and warn if the user mistakenly sets "PublishServerDescriptor
-      hidserv" in her torrc. The 'hidserv' argument never controlled
-      publication of hidden service descriptors. Bugfix on 0.2.0.1-alpha.
-
-  o Major features:
-    - Relays now save observed peak bandwidth throughput rates to their
-      state file (along with total usage, which was already saved)
-      so that they can determine their correct estimated bandwidth on
-      restart. Resolves bug 1863, where Tor relays would reset their
-      estimated bandwidth to 0 after restarting.
-    - Directory authorities now take changes in router IP address and
-      ORPort into account when determining router stability. Previously,
-      if a router changed its IP or ORPort, the authorities would not
-      treat it as having any downtime for the purposes of stability
-      calculation, whereas clients would experience downtime since the
-      change could take a while to propagate to them. Resolves issue 1035.
-    - Enable Address Space Layout Randomization (ASLR) and Data Execution
-      Prevention (DEP) by default on Windows to make it harder for
-      attackers to exploit vulnerabilities. Patch from John Brooks.
-
-  o Minor bugfixes (on 0.2.1.x and earlier):
-    - Fix a rare crash bug that could occur when a client was configured
-      with a large number of bridges. Fixes bug 2629; bugfix on
-      0.2.1.2-alpha. Bugfix by trac user "shitlei".
-    - Avoid a double mark-for-free warning when failing to attach a
-      transparent proxy connection. Bugfix on 0.1.2.1-alpha. Fixes
-      bug 2279.
-    - Correctly detect failure to allocate an OpenSSL BIO. Fixes bug 2378;
-      found by "cypherpunks". This bug was introduced before the first
-      Tor release, in svn commit r110.
-    - Country codes aren't supported in EntryNodes until 0.2.3.x, so
-      don't mention them in the manpage. Fixes bug 2450; issue
-      spotted by keb and G-Lo.
-    - Fix a bug in bandwidth history state parsing that could have been
-      triggered if a future version of Tor ever changed the timing
-      granularity at which bandwidth history is measured. Bugfix on
-      Tor 0.1.1.11-alpha.
-    - When a relay decides that its DNS is too broken for it to serve
-      as an exit server, it advertised itself as a non-exit, but
-      continued to act as an exit. This could create accidental
-      partitioning opportunities for users. Instead, if a relay is
-      going to advertise reject *:* as its exit policy, it should
-      really act with exit policy "reject *:*". Fixes bug 2366.
-      Bugfix on Tor 0.1.2.5-alpha. Bugfix by user "postman" on trac.
-    - In the special case where you configure a public exit relay as your
-      bridge, Tor would be willing to use that exit relay as the last
-      hop in your circuit as well. Now we fail that circuit instead.
-      Bugfix on 0.2.0.12-alpha. Fixes bug 2403. Reported by "piebeer".
-    - Fix a bug with our locking implementation on Windows that couldn't
-      correctly detect when a file was already locked. Fixes bug 2504,
-      bugfix on 0.2.1.6-alpha.
-    - Fix IPv6-related connect() failures on some platforms (BSD, OS X).
-      Bugfix on 0.2.0.3-alpha; fixes first part of bug 2660. Patch by
-      "piebeer".
-    - Set target port in get_interface_address6() correctly. Bugfix
-      on 0.1.1.4-alpha and 0.2.0.3-alpha; fixes second part of bug 2660.
-    - Directory authorities are now more robust to hops back in time
-      when calculating router stability. Previously, if a run of uptime
-      or downtime appeared to be negative, the calculation could give
-      incorrect results. Bugfix on 0.2.0.6-alpha; noticed when fixing
-      bug 1035.
-    - Fix an assert that got triggered when using the TestingTorNetwork
-      configuration option and then issuing a GETINFO config-text control
-      command. Fixes bug 2250; bugfix on 0.2.1.2-alpha.
-
-  o Minor bugfixes (on 0.2.2.x):
-    - Clients should not weight BadExit nodes as Exits in their node
-      selection. Similarly, directory authorities should not count BadExit
-      bandwidth as Exit bandwidth when computing bandwidth-weights.
-      Bugfix on 0.2.2.10-alpha; fixes bug 2203.
-    - Correctly clear our dir_read/dir_write history when there is an
-      error parsing any bw history value from the state file. Bugfix on
-      Tor 0.2.2.15-alpha.
-    - Resolve a bug in verifying signatures of directory objects
-      with digests longer than SHA1. Bugfix on 0.2.2.20-alpha.
-      Fixes bug 2409. Found by "piebeer".
-    - Bridge authorities no longer crash on SIGHUP when they try to
-      publish their relay descriptor to themselves. Fixes bug 2572. Bugfix
-      on 0.2.2.22-alpha.
-
-  o Minor features:
-    - Log less aggressively about circuit timeout changes, and improve
-      some other circuit timeout messages. Resolves bug 2004.
-    - Log a little more clearly about the times at which we're no longer
-      accepting new connections. Resolves bug 2181.
-    - Reject attempts at the client side to open connections to private
-      IP addresses (like 127.0.0.1, 10.0.0.1, and so on) with
-      a randomly chosen exit node. Attempts to do so are always
-      ill-defined, generally prevented by exit policies, and usually
-      in error. This will also help to detect loops in transparent
-      proxy configurations. You can disable this feature by setting
-      "ClientRejectInternalAddresses 0" in your torrc.
-    - Always treat failure to allocate an RSA key as an unrecoverable
-      allocation error.
-    - Update to the March 1 2011 Maxmind GeoLite Country database.
-
-  o Minor features (log subsystem):
-    - Add documentation for configuring logging at different severities in
-      different log domains. We've had this feature since 0.2.1.1-alpha,
-      but for some reason it never made it into the manpage. Fixes
-      bug 2215.
-    - Make it simpler to specify "All log domains except for A and B".
-      Previously you needed to say "[*,~A,~B]". Now you can just say
-      "[~A,~B]".
-    - Add a "LogMessageDomains 1" option to include the domains of log
-      messages along with the messages. Without this, there's no way
-      to use log domains without reading the source or doing a lot
-      of guessing.
-
-  o Packaging changes:
-    - Stop shipping the Tor specs files and development proposal documents
-      in the tarball. They are now in a separate git repository at
-      git://git.torproject.org/torspec.git
-
-
-Changes in version 0.2.1.30 - 2011-02-23
-  Tor 0.2.1.30 fixes a variety of less critical bugs. The main other
-  change is a slight tweak to Tor's TLS handshake that makes relays
-  and bridges that run this new version reachable from Iran again.
-  We don't expect this tweak will win the arms race long-term, but it
-  buys us time until we roll out a better solution.
-
-  o Major bugfixes:
-    - Stop sending a CLOCK_SKEW controller status event whenever
-      we fetch directory information from a relay that has a wrong clock.
-      Instead, only inform the controller when it's a trusted authority
-      that claims our clock is wrong. Bugfix on 0.1.2.6-alpha; fixes
-      the rest of bug 1074.
-    - Fix a bounds-checking error that could allow an attacker to
-      remotely crash a directory authority. Bugfix on 0.2.1.5-alpha.
-      Found by "piebeer".
-    - If relays set RelayBandwidthBurst but not RelayBandwidthRate,
-      Tor would ignore their RelayBandwidthBurst setting,
-      potentially using more bandwidth than expected. Bugfix on
-      0.2.0.1-alpha. Reported by Paul Wouters. Fixes bug 2470.
-    - Ignore and warn if the user mistakenly sets "PublishServerDescriptor
-      hidserv" in her torrc. The 'hidserv' argument never controlled
-      publication of hidden service descriptors. Bugfix on 0.2.0.1-alpha.
-
-  o Minor features:
-    - Adjust our TLS Diffie-Hellman parameters to match those used by
-      Apache's mod_ssl.
-    - Update to the February 1 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Check for and reject overly long directory certificates and
-      directory tokens before they have a chance to hit any assertions.
-      Bugfix on 0.2.1.28. Found by "doorss".
-    - Bring the logic that gathers routerinfos and assesses the
-      acceptability of circuits into line. This prevents a Tor OP from
-      getting locked in a cycle of choosing its local OR as an exit for a
-      path (due to a .exit request) and then rejecting the circuit because
-      its OR is not listed yet. It also prevents Tor clients from using an
-      OR running in the same instance as an exit (due to a .exit request)
-      if the OR does not meet the same requirements expected of an OR
-      running elsewhere. Fixes bug 1859; bugfix on 0.1.0.1-rc.
-
-  o Packaging changes:
-    - Stop shipping the Tor specs files and development proposal documents
-      in the tarball. They are now in a separate git repository at
-      git://git.torproject.org/torspec.git
-    - Do not include Git version tags as though they are SVN tags when
-      generating a tarball from inside a repository that has switched
-      between branches. Bugfix on 0.2.1.15-rc; fixes bug 2402.
-
-
-Changes in version 0.2.2.22-alpha - 2011-01-25
-  Tor 0.2.2.22-alpha fixes a few more less-critical security issues. The
-  main other change is a slight tweak to Tor's TLS handshake that makes
-  relays and bridges that run this new version reachable from Iran again.
-  We don't expect this tweak will win the arms race long-term, but it
-  will buy us a bit more time until we roll out a better solution.
-
-  o Major bugfixes:
-    - Fix a bounds-checking error that could allow an attacker to
-      remotely crash a directory authority. Bugfix on 0.2.1.5-alpha.
-      Found by "piebeer".
-    - Don't assert when changing from bridge to relay or vice versa
-      via the controller. The assert happened because we didn't properly
-      initialize our keys in this case. Bugfix on 0.2.2.18-alpha; fixes
-      bug 2433. Reported by bastik.
-
-  o Minor features:
-    - Adjust our TLS Diffie-Hellman parameters to match those used by
-      Apache's mod_ssl.
-    - Provide a log message stating which geoip file we're parsing
-      instead of just stating that we're parsing the geoip file.
-      Implements ticket 2432.
-
-  o Minor bugfixes:
-    - Check for and reject overly long directory certificates and
-      directory tokens before they have a chance to hit any assertions.
-      Bugfix on 0.2.1.28 / 0.2.2.20-alpha. Found by "doorss".
-
-
-Changes in version 0.2.2.21-alpha - 2011-01-15
-  Tor 0.2.2.21-alpha includes all the patches from Tor 0.2.1.29, which
-  continues our recent code security audit work. The main fix resolves
-  a remote heap overflow vulnerability that can allow remote code
-  execution (CVE-2011-0427). Other fixes address a variety of assert
-  and crash bugs, most of which we think are hard to exploit remotely.
-
-  o Major bugfixes (security), also included in 0.2.1.29:
-    - Fix a heap overflow bug where an adversary could cause heap
-      corruption. This bug probably allows remote code execution
-      attacks. Reported by "debuger". Fixes CVE-2011-0427. Bugfix on
-      0.1.2.10-rc.
-    - Prevent a denial-of-service attack by disallowing any
-      zlib-compressed data whose compression factor is implausibly
-      high. Fixes part of bug 2324; reported by "doorss".
-    - Zero out a few more keys in memory before freeing them. Fixes
-      bug 2384 and part of bug 2385. These key instances found by
-      "cypherpunks", based on Andrew Case's report about being able
-      to find sensitive data in Tor's memory space if you have enough
-      permissions. Bugfix on 0.0.2pre9.
-
-  o Major bugfixes (crashes), also included in 0.2.1.29:
-    - Prevent calls to Libevent from inside Libevent log handlers.
-      This had potential to cause a nasty set of crashes, especially
-      if running Libevent with debug logging enabled, and running
-      Tor with a controller watching for low-severity log messages.
-      Bugfix on 0.1.0.2-rc. Fixes bug 2190.
-    - Add a check for SIZE_T_MAX to tor_realloc() to try to avoid
-      underflow errors there too. Fixes the other part of bug 2324.
-    - Fix a bug where we would assert if we ever had a
-      cached-descriptors.new file (or another file read directly into
-      memory) of exactly SIZE_T_CEILING bytes. Fixes bug 2326; bugfix
-      on 0.2.1.25. Found by doorss.
-    - Fix some potential asserts and parsing issues with grossly
-      malformed router caches. Fixes bug 2352; bugfix on Tor 0.2.1.27.
-      Found by doorss.
-
-  o Minor bugfixes (other), also included in 0.2.1.29:
-    - Fix a bug with handling misformed replies to reverse DNS lookup
-      requests in DNSPort. Bugfix on Tor 0.2.0.1-alpha. Related to a
-      bug reported by doorss.
-    - Fix compilation on mingw when a pthreads compatibility library
-      has been installed. (We don't want to use it, so we shouldn't
-      be including pthread.h.) Fixes bug 2313; bugfix on 0.1.0.1-rc.
-    - Fix a bug where we would declare that we had run out of virtual
-      addresses when the address space was only half-exhausted. Bugfix
-      on 0.1.2.1-alpha.
-    - Correctly handle the case where AutomapHostsOnResolve is set but
-      no virtual addresses are available. Fixes bug 2328; bugfix on
-      0.1.2.1-alpha. Bug found by doorss.
-    - Correctly handle wrapping around when we run out of virtual
-      address space. Found by cypherpunks; bugfix on 0.2.0.5-alpha.
-
-  o Minor features, also included in 0.2.1.29:
-    - Update to the January 1 2011 Maxmind GeoLite Country database.
-    - Introduce output size checks on all of our decryption functions.
-
-  o Build changes, also included in 0.2.1.29:
-    - Tor does not build packages correctly with Automake 1.6 and earlier;
-      added a check to Makefile.am to make sure that we're building with
-      Automake 1.7 or later.
-    - The 0.2.1.28 tarball was missing src/common/OpenBSD_malloc_Linux.c
-      because we built it with a too-old version of automake. Thus that
-      release broke ./configure --enable-openbsd-malloc, which is popular
-      among really fast exit relays on Linux.
-
-  o Major bugfixes, new in 0.2.2.21-alpha:
-    - Prevent crash/heap corruption when the cbtnummodes consensus
-      parameter is set to 0 or large values. Fixes bug 2317; bugfix
-      on 0.2.2.14-alpha.
-
-  o Major features, new in 0.2.2.21-alpha:
-    - Introduce minimum/maximum values that clients will believe
-      from the consensus. Now we'll have a better chance to avoid crashes
-      or worse when a consensus param has a weird value.
-
-  o Minor features, new in 0.2.2.21-alpha:
-    - Make sure to disable DirPort if running as a bridge. DirPorts aren't
-      used on bridges, and it makes bridge scanning somewhat easier.
-    - If writing the state file to disk fails, wait up to an hour before
-      retrying again, rather than trying again each second. Fixes bug
-      2346; bugfix on Tor 0.1.1.3-alpha.
-    - Make Libevent log messages get delivered to controllers later,
-      and not from inside the Libevent log handler. This prevents unsafe
-      reentrant Libevent calls while still letting the log messages
-      get through.
-    - Detect platforms that brokenly use a signed size_t, and refuse to
-      build there. Found and analyzed by doorss and rransom.
-    - Fix a bunch of compile warnings revealed by mingw with gcc 4.5.
-      Resolves bug 2314.
-
-  o Minor bugfixes, new in 0.2.2.21-alpha:
-    - Handle SOCKS messages longer than 128 bytes long correctly, rather
-      than waiting forever for them to finish. Fixes bug 2330; bugfix
-      on 0.2.0.16-alpha. Found by doorss.
-    - Add assertions to check for overflow in arguments to
-      base32_encode() and base32_decode(); fix a signed-unsigned
-      comparison there too. These bugs are not actually reachable in Tor,
-      but it's good to prevent future errors too. Found by doorss.
-    - Correctly detect failures to create DNS requests when using Libevent
-      versions before v2. (Before Libevent 2, we used our own evdns
-      implementation. Its return values for Libevent's evdns_resolve_*()
-      functions are not consistent with those from Libevent.) Fixes bug
-      2363; bugfix on 0.2.2.6-alpha. Found by "lodger".
-
-  o Documentation, new in 0.2.2.21-alpha:
-    - Document the default socks host and port (127.0.0.1:9050) for
-      tor-resolve.
-
-
-Changes in version 0.2.1.29 - 2011-01-15
-  Tor 0.2.1.29 continues our recent code security audit work. The main
-  fix resolves a remote heap overflow vulnerability that can allow remote
-  code execution. Other fixes address a variety of assert and crash bugs,
-  most of which we think are hard to exploit remotely.
-
-  o Major bugfixes (security):
-    - Fix a heap overflow bug where an adversary could cause heap
-      corruption. This bug probably allows remote code execution
-      attacks. Reported by "debuger". Fixes CVE-2011-0427. Bugfix on
-      0.1.2.10-rc.
-    - Prevent a denial-of-service attack by disallowing any
-      zlib-compressed data whose compression factor is implausibly
-      high. Fixes part of bug 2324; reported by "doorss".
-    - Zero out a few more keys in memory before freeing them. Fixes
-      bug 2384 and part of bug 2385. These key instances found by
-      "cypherpunks", based on Andrew Case's report about being able
-      to find sensitive data in Tor's memory space if you have enough
-      permissions. Bugfix on 0.0.2pre9.
-
-  o Major bugfixes (crashes):
-    - Prevent calls to Libevent from inside Libevent log handlers.
-      This had potential to cause a nasty set of crashes, especially
-      if running Libevent with debug logging enabled, and running
-      Tor with a controller watching for low-severity log messages.
-      Bugfix on 0.1.0.2-rc. Fixes bug 2190.
-    - Add a check for SIZE_T_MAX to tor_realloc() to try to avoid
-      underflow errors there too. Fixes the other part of bug 2324.
-    - Fix a bug where we would assert if we ever had a
-      cached-descriptors.new file (or another file read directly into
-      memory) of exactly SIZE_T_CEILING bytes. Fixes bug 2326; bugfix
-      on 0.2.1.25. Found by doorss.
-    - Fix some potential asserts and parsing issues with grossly
-      malformed router caches. Fixes bug 2352; bugfix on Tor 0.2.1.27.
-      Found by doorss.
-
-  o Minor bugfixes (other):
-    - Fix a bug with handling misformed replies to reverse DNS lookup
-      requests in DNSPort. Bugfix on Tor 0.2.0.1-alpha. Related to a
-      bug reported by doorss.
-    - Fix compilation on mingw when a pthreads compatibility library
-      has been installed. (We don't want to use it, so we shouldn't
-      be including pthread.h.) Fixes bug 2313; bugfix on 0.1.0.1-rc.
-    - Fix a bug where we would declare that we had run out of virtual
-      addresses when the address space was only half-exhausted. Bugfix
-      on 0.1.2.1-alpha.
-    - Correctly handle the case where AutomapHostsOnResolve is set but
-      no virtual addresses are available. Fixes bug 2328; bugfix on
-      0.1.2.1-alpha. Bug found by doorss.
-    - Correctly handle wrapping around to when we run out of virtual
-      address space. Found by cypherpunks, bugfix on 0.2.0.5-alpha.
-    - The 0.2.1.28 tarball was missing src/common/OpenBSD_malloc_Linux.c
-      because we built it with a too-old version of automake. Thus that
-      release broke ./configure --enable-openbsd-malloc, which is popular
-      among really fast exit relays on Linux.
-
-  o Minor features:
-    - Update to the January 1 2011 Maxmind GeoLite Country database.
-    - Introduce output size checks on all of our decryption functions.
-
-  o Build changes:
-    - Tor does not build packages correctly with Automake 1.6 and earlier;
-      added a check to Makefile.am to make sure that we're building with
-      Automake 1.7 or later.
-
-
-Changes in version 0.2.2.20-alpha - 2010-12-17
-  Tor 0.2.2.20-alpha does some code cleanup to reduce the risk of remotely
-  exploitable bugs. We also fix a variety of other significant bugs,
-  change the IP address for one of our directory authorities, and update
-  the minimum version that Tor relays must run to join the network.
-
-  o Major bugfixes:
-    - Fix a remotely exploitable bug that could be used to crash instances
-      of Tor remotely by overflowing on the heap. Remote-code execution
-      hasn't been confirmed, but can't be ruled out. Everyone should
-      upgrade. Bugfix on the 0.1.1 series and later.
-    - Fix a bug that could break accounting on 64-bit systems with large
-      time_t values, making them hibernate for impossibly long intervals.
-      Fixes bug 2146. Bugfix on 0.0.9pre6; fix by boboper.
-    - Fix a logic error in directory_fetches_from_authorities() that
-      would cause all _non_-exits refusing single-hop-like circuits
-      to fetch from authorities, when we wanted to have _exits_ fetch
-      from authorities. Fixes more of 2097. Bugfix on 0.2.2.16-alpha;
-      fix by boboper.
-    - Fix a stream fairness bug that would cause newer streams on a given
-      circuit to get preference when reading bytes from the origin or
-      destination. Fixes bug 2210. Fix by Mashael AlSabah. This bug was
-      introduced before the first Tor release, in svn revision r152.
-
-  o Directory authority changes:
-    - Change IP address and ports for gabelmoo (v3 directory authority).
-
-  o Minor bugfixes:
-    - Avoid crashes when AccountingMax is set on clients. Fixes bug 2235.
-      Bugfix on 0.2.2.18-alpha. Diagnosed by boboper.
-    - Fix an off-by-one error in calculating some controller command
-      argument lengths. Fortunately, this mistake is harmless since
-      the controller code does redundant NUL termination too. Found by
-      boboper. Bugfix on 0.1.1.1-alpha.
-    - Do not dereference NULL if a bridge fails to build its
-      extra-info descriptor. Found by an anonymous commenter on
-      Trac. Bugfix on 0.2.2.19-alpha.
-
-  o Minor features:
-    - Update to the December 1 2010 Maxmind GeoLite Country database.
-    - Directory authorities now reject relays running any versions of
-      Tor between 0.2.1.3-alpha and 0.2.1.18 inclusive; they have
-      known bugs that keep RELAY_EARLY cells from working on rendezvous
-      circuits. Followup to fix for bug 2081.
-    - Directory authorities now reject relays running any version of Tor
-      older than 0.2.0.26-rc. That version is the earliest that fetches
-      current directory information correctly. Fixes bug 2156.
-    - Report only the top 10 ports in exit-port stats in order not to
-      exceed the maximum extra-info descriptor length of 50 KB. Implements
-      task 2196.
-
-
-Changes in version 0.2.1.28 - 2010-12-17
-  Tor 0.2.1.28 does some code cleanup to reduce the risk of remotely
-  exploitable bugs. We also took this opportunity to change the IP address
-  for one of our directory authorities, and to update the geoip database
-  we ship.
-
-  o Major bugfixes:
-    - Fix a remotely exploitable bug that could be used to crash instances
-      of Tor remotely by overflowing on the heap. Remote-code execution
-      hasn't been confirmed, but can't be ruled out. Everyone should
-      upgrade. Bugfix on the 0.1.1 series and later.
-
-  o Directory authority changes:
-    - Change IP address and ports for gabelmoo (v3 directory authority).
-
-  o Minor features:
-    - Update to the December 1 2010 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.1.27 - 2010-11-23
-  Yet another OpenSSL security patch broke its compatibility with Tor:
-  Tor 0.2.1.27 makes relays work with openssl 0.9.8p and 1.0.0.b. We
-  also took this opportunity to fix several crash bugs, integrate a new
-  directory authority, and update the bundled GeoIP database.
-
-  o Major bugfixes:
-    - Resolve an incompatibility with OpenSSL 0.9.8p and OpenSSL 1.0.0b:
-      No longer set the tlsext_host_name extension on server SSL objects;
-      but continue to set it on client SSL objects. Our goal in setting
-      it was to imitate a browser, not a vhosting server. Fixes bug 2204;
-      bugfix on 0.2.1.1-alpha.
-    - Do not log messages to the controller while shrinking buffer
-      freelists. Doing so would sometimes make the controller connection
-      try to allocate a buffer chunk, which would mess up the internals
-      of the freelist and cause an assertion failure. Fixes bug 1125;
-      fixed by Robert Ransom. Bugfix on 0.2.0.16-alpha.
-    - Learn our external IP address when we're a relay or bridge, even if
-      we set PublishServerDescriptor to 0. Bugfix on 0.2.0.3-alpha,
-      where we introduced bridge relays that don't need to publish to
-      be useful. Fixes bug 2050.
-    - Do even more to reject (and not just ignore) annotations on
-      router descriptors received anywhere but from the cache. Previously
-      we would ignore such annotations at first, but cache them to disk
-      anyway. Bugfix on 0.2.0.8-alpha. Found by piebeer.
-    - When you're using bridges and your network goes away and your
-      bridges get marked as down, recover when you attempt a new socks
-      connection (if the network is back), rather than waiting up to an
-      hour to try fetching new descriptors for your bridges. Bugfix on
-      0.2.0.3-alpha; fixes bug 1981.
-
-  o Major features:
-    - Move to the November 2010 Maxmind GeoLite country db (rather
-      than the June 2009 ip-to-country GeoIP db) for our statistics that
-      count how many users relays are seeing from each country. Now we'll
-      have more accurate data, especially for many African countries.
-
-  o New directory authorities:
-    - Set up maatuska (run by Linus Nordberg) as the eighth v3 directory
-      authority.
-
-  o Minor bugfixes:
-    - Fix an assertion failure that could occur in directory caches or
-      bridge users when using a very short voting interval on a testing
-      network. Diagnosed by Robert Hogan. Fixes bug 1141; bugfix on
-      0.2.0.8-alpha.
-    - Enforce multiplicity rules when parsing annotations. Bugfix on
-      0.2.0.8-alpha. Found by piebeer.
-    - Allow handshaking OR connections to take a full KeepalivePeriod
-      seconds to handshake. Previously, we would close them after
-      IDLE_OR_CONN_TIMEOUT (180) seconds, the same timeout as if they
-      were open. Bugfix on 0.2.1.26; fixes bug 1840. Thanks to mingw-san
-      for analysis help.
-    - When building with --enable-gcc-warnings on OpenBSD, disable
-      warnings in system headers. This makes --enable-gcc-warnings
-      pass on OpenBSD 4.8.
-
-  o Minor features:
-    - Exit nodes didn't recognize EHOSTUNREACH as a plausible error code,
-      and so sent back END_STREAM_REASON_MISC. Clients now recognize a new
-      stream ending reason for this case: END_STREAM_REASON_NOROUTE.
-      Servers can start sending this code when enough clients recognize
-      it. Bugfix on 0.1.0.1-rc; fixes part of bug 1793.
-    - Build correctly on mingw with more recent versions of OpenSSL 0.9.8.
-      Patch from mingw-san.
-
-  o Removed files:
-    - Remove the old debian/ directory from the main Tor distribution.
-      The official Tor-for-debian git repository lives at the URL
-      https://git.torproject.org/debian/tor.git
-    - Stop shipping the old doc/website/ directory in the tarball. We
-      changed the website format in late 2010, and what we shipped in
-      0.2.1.26 really wasn't that useful anyway.
-
-
-Changes in version 0.2.2.19-alpha - 2010-11-22
-  Yet another OpenSSL security patch broke its compatibility with Tor:
-  Tor 0.2.2.19-alpha makes relays work with OpenSSL 0.9.8p and 1.0.0.b.
-
-  o Major bugfixes:
-    - Resolve an incompatibility with OpenSSL 0.9.8p and OpenSSL 1.0.0b:
-      No longer set the tlsext_host_name extension on server SSL objects;
-      but continue to set it on client SSL objects. Our goal in setting
-      it was to imitate a browser, not a vhosting server. Fixes bug 2204;
-      bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes:
-    - Try harder not to exceed the maximum length of 50 KB when writing
-      statistics to extra-info descriptors. This bug was triggered by very
-      fast relays reporting exit-port, entry, and dirreq statistics.
-      Reported by Olaf Selke. Bugfix on 0.2.2.1-alpha. Fixes bug 2183.
-    - Publish a router descriptor even if generating an extra-info
-      descriptor fails. Previously we would not publish a router
-      descriptor without an extra-info descriptor; this can cause fast
-      exit relays collecting exit-port statistics to drop from the
-      consensus. Bugfix on 0.1.2.9-rc; fixes bug 2195.
-
-
-Changes in version 0.2.2.18-alpha - 2010-11-16
-  Tor 0.2.2.18-alpha fixes several crash bugs that have been nagging
-  us lately, makes unpublished bridge relays able to detect their IP
-  address, and fixes a wide variety of other bugs to get us much closer
-  to a stable release.
-
-  o Major bugfixes:
-    - Do even more to reject (and not just ignore) annotations on
-      router descriptors received anywhere but from the cache. Previously
-      we would ignore such annotations at first, but cache them to disk
-      anyway. Bugfix on 0.2.0.8-alpha. Found by piebeer.
-    - Do not log messages to the controller while shrinking buffer
-      freelists. Doing so would sometimes make the controller connection
-      try to allocate a buffer chunk, which would mess up the internals
-      of the freelist and cause an assertion failure. Fixes bug 1125;
-      fixed by Robert Ransom. Bugfix on 0.2.0.16-alpha.
-    - Learn our external IP address when we're a relay or bridge, even if
-      we set PublishServerDescriptor to 0. Bugfix on 0.2.0.3-alpha,
-      where we introduced bridge relays that don't need to publish to
-      be useful. Fixes bug 2050.
-    - Maintain separate TLS contexts and certificates for incoming and
-      outgoing connections in bridge relays. Previously we would use the
-      same TLS contexts and certs for incoming and outgoing connections.
-      Bugfix on 0.2.0.3-alpha; addresses bug 988.
-    - Maintain separate identity keys for incoming and outgoing TLS
-      contexts in bridge relays. Previously we would use the same
-      identity keys for incoming and outgoing TLS contexts. Bugfix on
-      0.2.0.3-alpha; addresses the other half of bug 988.
-    - Avoid an assertion failure when we as an authority receive a
-      duplicate upload of a router descriptor that we already have,
-      but which we previously considered an obsolete descriptor.
-      Fixes another case of bug 1776. Bugfix on 0.2.2.16-alpha.
-    - Avoid a crash bug triggered by looking at a dangling pointer while
-      setting the network status consensus. Found by Robert Ransom.
-      Bugfix on 0.2.2.17-alpha. Fixes bug 2097.
-    - Fix a logic error where servers that _didn't_ act as exits would
-      try to keep their server lists more aggressively up to date than
-      exits, when it was supposed to be the other way around. Bugfix
-      on 0.2.2.17-alpha.
-
-  o Minor bugfixes (on Tor 0.2.1.x and earlier):
-    - When we're trying to guess whether we know our IP address as
-      a relay, we would log various ways that we failed to guess
-      our address, but never log that we ended up guessing it
-      successfully. Now add a log line to help confused and anxious
-      relay operators. Bugfix on 0.1.2.1-alpha; fixes bug 1534.
-    - Bring the logic that gathers routerinfos and assesses the
-      acceptability of circuits into line. This prevents a Tor OP from
-      getting locked in a cycle of choosing its local OR as an exit for a
-      path (due to a .exit request) and then rejecting the circuit because
-      its OR is not listed yet. It also prevents Tor clients from using an
-      OR running in the same instance as an exit (due to a .exit request)
-      if the OR does not meet the same requirements expected of an OR
-      running elsewhere. Fixes bug 1859; bugfix on 0.1.0.1-rc.
-    - Correctly describe errors that occur when generating a TLS object.
-      Previously we would attribute them to a failure while generating a
-      TLS context. Patch by Robert Ransom. Bugfix on 0.1.0.4-rc; fixes
-      bug 1994.
-    - Enforce multiplicity rules when parsing annotations. Bugfix on
-      0.2.0.8-alpha. Found by piebeer.
-    - Fix warnings that newer versions of autoconf produced during
-      ./autogen.sh. These warnings appear to be harmless in our case,
-      but they were extremely verbose. Fixes bug 2020.
-
-  o Minor bugfixes (on Tor 0.2.2.x):
-    - Enable protection of small arrays whenever we build with gcc
-      hardening features, not only when also building with warnings
-      enabled. Fixes bug 2031; bugfix on 0.2.2.14-alpha. Reported by keb.
-
-  o Minor features:
-    - Make hidden services work better in private Tor networks by not
-      requiring any uptime to join the hidden service descriptor
-      DHT. Implements ticket 2088.
-    - Rate-limit the "your application is giving Tor only an IP address"
-      warning. Addresses bug 2000; bugfix on 0.0.8pre2.
-    - When AllowSingleHopExits is set, print a warning to explain to the
-      relay operator why most clients are avoiding her relay.
-    - Update to the November 1 2010 Maxmind GeoLite Country database.
-
-  o Code simplifications and refactoring:
-    - When we fixed bug 1038 we had to put in a restriction not to send
-      RELAY_EARLY cells on rend circuits. This was necessary as long
-      as relays using Tor 0.2.1.3-alpha through 0.2.1.18-alpha were
-      active. Now remove this obsolete check. Resolves bug 2081.
-    - Some options used different conventions for uppercasing of acronyms
-      when comparing manpage and source. Fix those in favor of the
-      manpage, as it makes sense to capitalize acronyms.
-    - Remove the torrc.complete file. It hasn't been kept up to date
-      and users will have better luck checking out the manpage.
-    - Remove the obsolete "NoPublish" option; it has been flagged
-      as obsolete and has produced a warning since 0.1.1.18-rc.
-    - Remove everything related to building the expert bundle for OS X.
-      It has confused many users, doesn't work right on OS X 10.6,
-      and is hard to get rid of once installed. Resolves bug 1274.
-
-
-Changes in version 0.2.2.17-alpha - 2010-09-30
-  Tor 0.2.2.17-alpha introduces a feature to make it harder for clients
-  to use one-hop circuits (which can put the exit relays at higher risk,
-  plus unbalance the network); fixes a big bug in bandwidth accounting
-  for relays that want to limit their monthly bandwidth use; fixes a
-  big pile of bugs in how clients tolerate temporary network failure;
-  and makes our adaptive circuit build timeout feature (which improves
-  client performance if your network is fast while not breaking things
-  if your network is slow) better handle bad networks.
-
-  o Major features:
-    - Exit relays now try harder to block exit attempts from unknown
-      relays, to make it harder for people to use them as one-hop proxies
-      a la tortunnel. Controlled by the refuseunknownexits consensus
-      parameter (currently enabled), or you can override it on your
-      relay with the RefuseUnknownExits torrc option. Resolves bug 1751.
-
-  o Major bugfixes (0.2.1.x and earlier):
-    - Fix a bug in bandwidth accounting that could make us use twice
-      the intended bandwidth when our interval start changes due to
-      daylight saving time. Now we tolerate skew in stored vs computed
-      interval starts: if the start of the period changes by no more than
-      50% of the period's duration, we remember bytes that we transferred
-      in the old period. Fixes bug 1511; bugfix on 0.0.9pre5.
-    - Always search the Windows system directory for system DLLs, and
-      nowhere else. Bugfix on 0.1.1.23; fixes bug 1954.
-    - When you're using bridges and your network goes away and your
-      bridges get marked as down, recover when you attempt a new socks
-      connection (if the network is back), rather than waiting up to an
-      hour to try fetching new descriptors for your bridges. Bugfix on
-      0.2.0.3-alpha; fixes bug 1981.
-
-  o Major bugfixes (on 0.2.2.x):
-    - Fix compilation on Windows. Bugfix on 0.2.2.16-alpha; related to
-      bug 1797.
-    - Fix a segfault that could happen when operating a bridge relay with
-      no GeoIP database set. Fixes bug 1964; bugfix on 0.2.2.15-alpha.
-    - The consensus bandwidth-weights (used by clients to choose fast
-      relays) entered an unexpected edge case in September where
-      Exits were much scarcer than Guards, resulting in bad weight
-      recommendations. Now we compute them using new constraints that
-      should succeed in all cases. Also alter directory authorities to
-      not include the bandwidth-weights line if they fail to produce
-      valid values. Fixes bug 1952; bugfix on 0.2.2.10-alpha.
-    - When weighting bridges during path selection, we used to trust
-      the bandwidths they provided in their descriptor, only capping them
-      at 10MB/s. This turned out to be problematic for two reasons:
-      Bridges could claim to handle a lot more traffic then they
-      actually would, thus making more clients pick them and have a
-      pretty effective DoS attack. The other issue is that new bridges
-      that might not have a good estimate for their bw capacity yet
-      would not get used at all unless no other bridges are available
-      to a client. Fixes bug 1912; bugfix on 0.2.2.7-alpha.
-
-  o Major bugfixes (on the circuit build timeout feature, 0.2.2.x):
-    - Ignore cannibalized circuits when recording circuit build times.
-      This should provide for a minor performance improvement for hidden
-      service users using 0.2.2.14-alpha, and should remove two spurious
-      notice log messages. Bugfix on 0.2.2.14-alpha; fixes bug 1740.
-    - Simplify the logic that causes us to decide if the network is
-      unavailable for purposes of recording circuit build times. If we
-      receive no cells whatsoever for the entire duration of a circuit's
-      full measured lifetime, the network is probably down. Also ignore
-      one-hop directory fetching circuit timeouts when calculating our
-      circuit build times. These changes should hopefully reduce the
-      cases where we see ridiculous circuit build timeouts for people
-      with spotty wireless connections. Fixes part of bug 1772; bugfix
-      on 0.2.2.2-alpha.
-    - Prevent the circuit build timeout from becoming larger than
-      the maximum build time we have ever seen. Also, prevent the time
-      period for measurement circuits from becoming larger than twice that
-      value. Fixes the other part of bug 1772; bugfix on 0.2.2.2-alpha.
-
-  o Minor features:
-    - When we run out of directory information such that we can't build
-      circuits, but then get enough that we can build circuits, log when
-      we actually construct a circuit, so the user has a better chance of
-      knowing what's going on. Fixes bug 1362.
-    - Be more generous with how much bandwidth we'd use up (with
-      accounting enabled) before entering "soft hibernation". Previously,
-      we'd refuse new connections and circuits once we'd used up 95% of
-      our allotment. Now, we use up 95% of our allotment, AND make sure
-      that we have no more than 500MB (or 3 hours of expected traffic,
-      whichever is lower) remaining before we enter soft hibernation.
-    - If we've configured EntryNodes and our network goes away and/or all
-      our entrynodes get marked down, optimistically retry them all when
-      a new socks application request appears. Fixes bug 1882.
-    - Add some more defensive programming for architectures that can't
-      handle unaligned integer accesses. We don't know of any actual bugs
-      right now, but that's the best time to fix them. Fixes bug 1943.
-    - Support line continuations in the torrc config file. If a line
-      ends with a single backslash character, the newline is ignored, and
-      the configuration value is treated as continuing on the next line.
-      Resolves bug 1929.
-
-  o Minor bugfixes (on 0.2.1.x and earlier):
-    - For bandwidth accounting, calculate our expected bandwidth rate
-      based on the time during which we were active and not in
-      soft-hibernation during the last interval. Previously, we were
-      also considering the time spent in soft-hibernation. If this
-      was a long time, we would wind up underestimating our bandwidth
-      by a lot, and skewing our wakeup time towards the start of the
-      accounting interval. Fixes bug 1789. Bugfix on 0.0.9pre5.
-
-  o Minor bugfixes (on 0.2.2.x):
-    - Resume generating CIRC FAILED REASON=TIMEOUT control port messages,
-      which were disabled by the circuit build timeout changes in
-      0.2.2.14-alpha. Bugfix on 0.2.2.14-alpha; fixes bug 1739.
-    - Make sure we don't warn about missing bandwidth weights when
-      choosing bridges or other relays not in the consensus. Bugfix on
-      0.2.2.10-alpha; fixes bug 1805.
-    - In our logs, do not double-report signatures from unrecognized
-      authorities both as "from unknown authority" and "not
-      present". Fixes bug 1956, bugfix on 0.2.2.16-alpha.
-
-
-Changes in version 0.2.2.16-alpha - 2010-09-17
-  Tor 0.2.2.16-alpha fixes a variety of old stream fairness bugs (most
-  evident at exit relays), and also continues to resolve all the little
-  bugs that have been filling up trac lately.
-
-  o Major bugfixes (stream-level fairness):
-    - When receiving a circuit-level SENDME for a blocked circuit, try
-      to package cells fairly from all the streams that had previously
-      been blocked on that circuit. Previously, we had started with the
-      oldest stream, and allowed each stream to potentially exhaust
-      the circuit's package window. This gave older streams on any
-      given circuit priority over newer ones. Fixes bug 1937. Detected
-      originally by Camilo Viecco. This bug was introduced before the
-      first Tor release, in svn commit r152: it is the new winner of
-      the longest-lived bug prize.
-    - When the exit relay got a circuit-level sendme cell, it started
-      reading on the exit streams, even if had 500 cells queued in the
-      circuit queue already, so the circuit queue just grew and grew in
-      some cases. We fix this by not re-enabling reading on receipt of a
-      sendme cell when the cell queue is blocked. Fixes bug 1653. Bugfix
-      on 0.2.0.1-alpha. Detected by Mashael AlSabah. Original patch by
-      "yetonetime".
-    - Newly created streams were allowed to read cells onto circuits,
-      even if the circuit's cell queue was blocked and waiting to drain.
-      This created potential unfairness, as older streams would be
-      blocked, but newer streams would gladly fill the queue completely.
-      We add code to detect this situation and prevent any stream from
-      getting more than one free cell. Bugfix on 0.2.0.1-alpha. Partially
-      fixes bug 1298.
-
-  o Minor features:
-    - Update to the September 1 2010 Maxmind GeoLite Country database.
-    - Warn when CookieAuthFileGroupReadable is set but CookieAuthFile is
-      not. This would lead to a cookie that is still not group readable.
-      Closes bug 1843. Suggested by katmagic.
-    - When logging a rate-limited warning, we now mention how many messages
-      got suppressed since the last warning.
-    - Add new "perconnbwrate" and "perconnbwburst" consensus params to
-      do individual connection-level rate limiting of clients. The torrc
-      config options with the same names trump the consensus params, if
-      both are present. Replaces the old "bwconnrate" and "bwconnburst"
-      consensus params which were broken from 0.2.2.7-alpha through
-      0.2.2.14-alpha. Closes bug 1947.
-    - When a router changes IP address or port, authorities now launch
-      a new reachability test for it. Implements ticket 1899.
-    - Make the formerly ugly "2 unknown, 7 missing key, 0 good, 0 bad,
-      2 no signature, 4 required" messages about consensus signatures
-      easier to read, and make sure they get logged at the same severity
-      as the messages explaining which keys are which. Fixes bug 1290.
-    - Don't warn when we have a consensus that we can't verify because
-      of missing certificates, unless those certificates are ones
-      that we have been trying and failing to download. Fixes bug 1145.
-    - If you configure your bridge with a known identity fingerprint,
-      and the bridge authority is unreachable (as it is in at least
-      one country now), fall back to directly requesting the descriptor
-      from the bridge. Finishes the feature started in 0.2.0.10-alpha;
-      closes bug 1138.
-    - When building with --enable-gcc-warnings on OpenBSD, disable
-      warnings in system headers. This makes --enable-gcc-warnings
-      pass on OpenBSD 4.8.
-
-  o Minor bugfixes (on 0.2.1.x and earlier):
-    - Authorities will now attempt to download consensuses if their
-      own efforts to make a live consensus have failed. This change
-      means authorities that restart will fetch a valid consensus, and
-      it means authorities that didn't agree with the current consensus
-      will still fetch and serve it if it has enough signatures. Bugfix
-      on 0.2.0.9-alpha; fixes bug 1300.
-    - Ensure DNS requests launched by "RESOLVE" commands from the
-      controller respect the __LeaveStreamsUnattached setconf options. The
-      same goes for requests launched via DNSPort or transparent
-      proxying. Bugfix on 0.2.0.1-alpha; fixes bug 1525.
-    - Allow handshaking OR connections to take a full KeepalivePeriod
-      seconds to handshake. Previously, we would close them after
-      IDLE_OR_CONN_TIMEOUT (180) seconds, the same timeout as if they
-      were open. Bugfix on 0.2.1.26; fixes bug 1840. Thanks to mingw-san
-      for analysis help.
-    - Rate-limit "Failed to hand off onionskin" warnings.
-    - Never relay a cell for a circuit we have already destroyed.
-      Between marking a circuit as closeable and finally closing it,
-      it may have been possible for a few queued cells to get relayed,
-      even though they would have been immediately dropped by the next
-      OR in the circuit. Fixes bug 1184; bugfix on 0.2.0.1-alpha.
-    - Never queue a cell for a circuit that's already been marked
-      for close.
-    - Never vote for a server as "Running" if we have a descriptor for
-      it claiming to be hibernating, and that descriptor was published
-      more recently than our last contact with the server. Bugfix on
-      0.2.0.3-alpha; fixes bug 911.
-    - Squash a compile warning on OpenBSD. Reported by Tas; fixes
-      bug 1848.
-
-  o Minor bugfixes (on 0.2.2.x):
-    - Fix a regression introduced in 0.2.2.7-alpha that marked relays
-      down if a directory fetch fails and you've configured either
-      bridges or EntryNodes. The intent was to mark the relay as down
-      _unless_ you're using bridges or EntryNodes, since if you are
-      then you could quickly run out of entry points.
-    - Fix the Windows directory-listing code. A bug introduced in
-      0.2.2.14-alpha could make Windows directory servers forget to load
-      some of their cached v2 networkstatus files.
-    - Really allow clients to use relays as bridges. Fixes bug 1776;
-      bugfix on 0.2.2.15-alpha.
-    - Demote a warn to info that happens when the CellStatistics option
-      was just enabled. Bugfix on 0.2.2.15-alpha; fixes bug 1921.
-      Reported by Moritz Bartl.
-    - On Windows, build correctly either with or without Unicode support.
-      This is necessary so that Tor can support fringe platforms like
-      Windows 98 (which has no Unicode), or Windows CE (which has no
-      non-Unicode). Bugfix on 0.2.2.14-alpha; fixes bug 1797.
-
-  o Testing
-    - Add a unit test for cross-platform directory-listing code.
-
-
-Changes in version 0.2.2.15-alpha - 2010-08-18
-  Tor 0.2.2.15-alpha fixes a big bug in hidden service availability,
-  fixes a variety of other bugs that were preventing performance
-  experiments from moving forward, fixes several bothersome memory leaks,
-  and generally closes a lot of smaller bugs that have been filling up
-  trac lately.
-
-  o Major bugfixes:
-    - Stop assigning the HSDir flag to relays that disable their
-      DirPort (and thus will refuse to answer directory requests). This
-      fix should dramatically improve the reachability of hidden services:
-      hidden services and hidden service clients pick six HSDir relays
-      to store and retrieve the hidden service descriptor, and currently
-      about half of the HSDir relays will refuse to work. Bugfix on
-      0.2.0.10-alpha; fixes part of bug 1693.
-    - The PerConnBWRate and Burst config options, along with the
-      bwconnrate and bwconnburst consensus params, initialized each conn's
-      token bucket values only when the connection is established. Now we
-      update them if the config options change, and update them every time
-      we get a new consensus. Otherwise we can encounter an ugly edge
-      case where we initialize an OR conn to client-level bandwidth,
-      but then later the relay joins the consensus and we leave it
-      throttled. Bugfix on 0.2.2.7-alpha; fixes bug 1830.
-    - Fix a regression that caused Tor to rebind its ports if it receives
-      SIGHUP while hibernating. Bugfix in 0.1.1.6-alpha; closes bug 919.
-
-  o Major features:
-    - Lower the maximum weighted-fractional-uptime cutoff to 98%. This
-      should give us approximately 40-50% more Guard-flagged nodes,
-      improving the anonymity the Tor network can provide and also
-      decreasing the dropoff in throughput that relays experience when
-      they first get the Guard flag.
-    - Allow enabling or disabling the *Statistics config options while
-      Tor is running.
-
-  o Minor features:
-    - Update to the August 1 2010 Maxmind GeoLite Country database.
-    - Have the controller interface give a more useful message than
-      "Internal Error" in response to failed GETINFO requests.
-    - Warn when the same option is provided more than once in a torrc
-      file, on the command line, or in a single SETCONF statement, and
-      the option is one that only accepts a single line. Closes bug 1384.
-    - Build correctly on mingw with more recent versions of OpenSSL 0.9.8.
-      Patch from mingw-san.
-    - Add support for the country code "{??}" in torrc options like
-      ExcludeNodes, to indicate all routers of unknown country. Closes
-      bug 1094.
-    - Relays report the number of bytes spent on answering directory
-      requests in extra-info descriptors similar to {read,write}-history.
-      Implements enhancement 1790.
-
-  o Minor bugfixes (on 0.2.1.x and earlier):
-    - Complain if PublishServerDescriptor is given multiple arguments that
-      include 0 or 1. This configuration will be rejected in the future.
-      Bugfix on 0.2.0.1-alpha; closes bug 1107.
-    - Disallow BridgeRelay 1 and ORPort 0 at once in the configuration.
-      Bugfix on 0.2.0.13-alpha; closes bug 928.
-    - Change "Application request when we're believed to be offline."
-      notice to "Application request when we haven't used client
-      functionality lately.", to clarify that it's not an error. Bugfix
-      on 0.0.9.3; fixes bug 1222.
-    - Fix a bug in the controller interface where "GETINFO ns/asdaskljkl"
-      would return "551 Internal error" rather than "552 Unrecognized key
-      ns/asdaskljkl". Bugfix on 0.1.2.3-alpha.
-    - Users can't configure a regular relay to be their bridge. It didn't
-      work because when Tor fetched the bridge descriptor, it found
-      that it already had it, and didn't realize that the purpose of the
-      descriptor had changed. Now we replace routers with a purpose other
-      than bridge with bridge descriptors when fetching them. Bugfix on
-      0.1.1.9-alpha. Bug 1776 not yet fixed because now we immediately
-      refetch the descriptor with router purpose 'general', disabling
-      it as a bridge.
-    - Fix a rare bug in rend_fn unit tests: we would fail a test when
-      a randomly generated port is 0. Diagnosed by Matt Edman. Bugfix
-      on 0.2.0.10-alpha; fixes bug 1808.
-    - Exit nodes didn't recognize EHOSTUNREACH as a plausible error code,
-      and so sent back END_STREAM_REASON_MISC. Clients now recognize a new
-      stream ending reason for this case: END_STREAM_REASON_NOROUTE.
-      Servers can start sending this code when enough clients recognize
-      it. Also update the spec to reflect this new reason. Bugfix on
-      0.1.0.1-rc; fixes part of bug 1793.
-    - Delay geoip stats collection by bridges for 6 hours, not 2 hours,
-      when we switch from being a public relay to a bridge. Otherwise
-      there will still be clients that see the relay in their consensus,
-      and the stats will end up wrong. Bugfix on 0.2.1.15-rc; fixes bug
-      932 even more.
-    - Instead of giving an assertion failure on an internal mismatch
-      on estimated freelist size, just log a BUG warning and try later.
-      Mitigates but does not fix bug 1125.
-    - Fix an assertion failure that could occur in caches or bridge users
-      when using a very short voting interval on a testing network.
-      Diagnosed by Robert Hogan. Fixes bug 1141; bugfix on 0.2.0.8-alpha.
-
-  o Minor bugfixes (on 0.2.2.x):
-    - Alter directory authorities to always consider Exit-flagged nodes
-      as potential Guard nodes in their votes. The actual decision to
-      use Exits as Guards is done in the consensus bandwidth weights.
-      Fixes bug 1294; bugfix on 0.2.2.10-alpha.
-    - When the controller is reporting the purpose of circuits that
-      didn't finish building before the circuit build timeout, it was
-      printing UNKNOWN_13. Now print EXPIRED. Bugfix on 0.2.2.14-alpha.
-    - Our libevent version parsing code couldn't handle versions like
-      1.4.14b-stable and incorrectly warned the user about using an
-      old and broken version of libevent. Treat 1.4.14b-stable like
-      1.4.14-stable when parsing the version. Fixes bug 1731; bugfix
-      on 0.2.2.1-alpha.
-    - Don't use substitution references like $(VAR:MOD) when
-      $(asciidoc_files) is empty -- make(1) on NetBSD transforms
-      '$(:x)' to 'x' rather than the empty string. This bites us in
-      doc/ when configured with --disable-asciidoc. Bugfix on
-      0.2.2.9-alpha; fixes bug 1773.
-    - Remove a spurious hidden service server-side log notice about
-      "Ancient non-dirty circuits". Bugfix on 0.2.2.14-alpha; fixes
-      bug 1741.
-    - Fix compilation with --with-dmalloc set. Bugfix on 0.2.2.6-alpha;
-      fixes bug 1832.
-    - Correctly report written bytes on linked connections. Found while
-      implementing 1790. Bugfix on 0.2.2.4-alpha.
-    - Fix three memory leaks: one in circuit_build_times_parse_state(),
-      one in dirvote_add_signatures_to_pending_consensus(), and one every
-      time we parse a v3 network consensus. Bugfixes on 0.2.2.14-alpha,
-      0.2.2.6-alpha, and 0.2.2.10-alpha respectively; fixes bug 1831.
-
-  o Code simplifications and refactoring:
-    - Take a first step towards making or.h smaller by splitting out
-      function definitions for all source files in src/or/. Leave
-      structures and defines in or.h for now.
-    - Remove a bunch of unused function declarations as well as a block of
-      #if 0'd code from the unit tests. Closes bug 1824.
-    - New unit tests for exit-port history statistics; refactored exit
-      statistics code to be more easily tested.
-    - Remove the old debian/ directory from the main Tor distribution.
-      The official Tor-for-debian git repository lives at the URL
-      https://git.torproject.org/debian/tor.git
-
-
-Changes in version 0.2.2.14-alpha - 2010-07-12
-  Tor 0.2.2.14-alpha greatly improves client-side handling of
-  circuit build timeouts, which are used to estimate speed and improve
-  performance. We also move to a much better GeoIP database, port Tor to
-  Windows CE, introduce new compile flags that improve code security,
-  add an eighth v3 directory authority, and address a lot of more
-  minor issues.
-
-  o Major bugfixes:
-    - Tor directory authorities no longer crash when started with a
-      cached-microdesc-consensus file in their data directory. Bugfix
-      on 0.2.2.6-alpha; fixes bug 1532.
-    - Treat an unset $HOME like an empty $HOME rather than triggering an
-      assert. Bugfix on 0.0.8pre1; fixes bug 1522.
-    - Ignore negative and large circuit build timeout values that can
-      happen during a suspend or hibernate. These values caused various
-      asserts to fire. Bugfix on 0.2.2.2-alpha; fixes bug 1245.
-    - Alter calculation of Pareto distribution parameter 'Xm' for
-      Circuit Build Timeout learning to use the weighted average of the
-      top N=3 modes (because we have three entry guards). Considering
-      multiple modes should improve the timeout calculation in some cases,
-      and prevent extremely high timeout values. Bugfix on 0.2.2.2-alpha;
-      fixes bug 1335.
-    - Alter calculation of Pareto distribution parameter 'Alpha' to use a
-      right censored distribution model. This approach improves over the
-      synthetic timeout generation approach that was producing insanely
-      high timeout values. Now we calculate build timeouts using truncated
-      times. Bugfix on 0.2.2.2-alpha; fixes bugs 1245 and 1335.
-    - Do not close circuits that are under construction when they reach
-      the circuit build timeout. Instead, leave them building (but do not
-      use them) for up until the time corresponding to the 95th percentile
-      on the Pareto CDF or 60 seconds, whichever is greater. This is done
-      to provide better data for the new Pareto model. This percentile
-      can be controlled by the consensus.
-
-  o Major features:
-    - Move to the June 2010 Maxmind GeoLite country db (rather than the
-      June 2009 ip-to-country GeoIP db) for our statistics that count
-      how many users relays are seeing from each country. Now we have
-      more accurate data for many African countries.
-    - Port Tor to build and run correctly on Windows CE systems, using
-      the wcecompat library. Contributed by Valerio Lupi.
-    - New "--enable-gcc-hardening" ./configure flag (off by default)
-      to turn on gcc compile time hardening options. It ensures
-      that signed ints have defined behavior (-fwrapv), enables
-      -D_FORTIFY_SOURCE=2 (requiring -O2), adds stack smashing protection
-      with canaries (-fstack-protector-all), turns on ASLR protection if
-      supported by the kernel (-fPIE, -pie), and adds additional security
-      related warnings. Verified to work on Mac OS X and Debian Lenny.
-    - New "--enable-linker-hardening" ./configure flag (off by default)
-      to turn on ELF specific hardening features (relro, now). This does
-      not work with Mac OS X or any other non-ELF binary format.
-
-  o New directory authorities:
-    - Set up maatuska (run by Linus Nordberg) as the eighth v3 directory
-      authority.
-
-  o Minor features:
-    - New config option "WarnUnsafeSocks 0" disables the warning that
-      occurs whenever Tor receives a socks handshake using a version of
-      the socks protocol that can only provide an IP address (rather
-      than a hostname). Setups that do DNS locally over Tor are fine,
-      and we shouldn't spam the logs in that case.
-    - Convert the HACKING file to asciidoc, and add a few new sections
-      to it, explaining how we use Git, how we make changelogs, and
-      what should go in a patch.
-    - Add a TIMEOUT_RATE keyword to the BUILDTIMEOUT_SET control port
-      event, to give information on the current rate of circuit timeouts
-      over our stored history.
-    - Add ability to disable circuit build time learning via consensus
-      parameter and via a LearnCircuitBuildTimeout config option. Also
-      automatically disable circuit build time calculation if we are
-      either a AuthoritativeDirectory, or if we fail to write our state
-      file. Fixes bug 1296.
-    - More gracefully handle corrupt state files, removing asserts
-      in favor of saving a backup and resetting state.
-    - Rename the "log.h" header to "torlog.h" so as to conflict with fewer
-      system headers.
-
-  o Minor bugfixes:
-    - Build correctly on OSX with zlib 1.2.4 and higher with all warnings
-      enabled.
-    - When a2x fails, mention that the user could disable manpages instead
-      of trying to fix their asciidoc installation.
-    - Where available, use Libevent 2.0's periodic timers so that our
-      once-per-second cleanup code gets called even more closely to
-      once per second than it would otherwise. Fixes bug 943.
-    - If you run a bridge that listens on multiple IP addresses, and
-      some user configures a bridge address that uses a different IP
-      address than your bridge writes in its router descriptor, and the
-      user doesn't specify an identity key, their Tor would discard the
-      descriptor because "it isn't one of our configured bridges", and
-      fail to bootstrap. Now believe the descriptor and bootstrap anyway.
-      Bugfix on 0.2.0.3-alpha.
-    - If OpenSSL fails to make a duplicate of a private or public key, log
-      an error message and try to exit cleanly. May help with debugging
-      if bug 1209 ever remanifests.
-    - Save a couple bytes in memory allocation every time we escape
-      certain characters in a string. Patch from Florian Zumbiehl.
-    - Make it explicit that we don't cannibalize one-hop circuits. This
-      happens in the wild, but doesn't turn out to be a problem because
-      we fortunately don't use those circuits. Many thanks to outofwords
-      for the initial analysis and to swissknife who confirmed that
-      two-hop circuits are actually created.
-    - Make directory mirrors report non-zero dirreq-v[23]-shares again.
-      Fixes bug 1564; bugfix on 0.2.2.9-alpha.
-    - Eliminate a case where a circuit build time warning was displayed
-      after network connectivity resumed. Bugfix on 0.2.2.2-alpha.
-
-
-Changes in version 0.2.1.26 - 2010-05-02
-  Tor 0.2.1.26 addresses the recent connection and memory overload
-  problems we've been seeing on relays, especially relays with their
-  DirPort open. If your relay has been crashing, or you turned it off
-  because it used too many resources, give this release a try.
-
-  This release also fixes yet another instance of broken OpenSSL libraries
-  that was causing some relays to drop out of the consensus.
-
-  o Major bugfixes:
-    - Teach relays to defend themselves from connection overload. Relays
-      now close idle circuits early if it looks like they were intended
-      for directory fetches. Relays are also more aggressive about closing
-      TLS connections that have no circuits on them. Such circuits are
-      unlikely to be re-used, and tens of thousands of them were piling
-      up at the fast relays, causing the relays to run out of sockets
-      and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling
-      their directory fetches over TLS).
-    - Fix SSL renegotiation behavior on OpenSSL versions like on Centos
-      that claim to be earlier than 0.9.8m, but which have in reality
-      backported huge swaths of 0.9.8m or 0.9.8n renegotiation
-      behavior. Possible fix for some cases of bug 1346.
-    - Directory mirrors were fetching relay descriptors only from v2
-      directory authorities, rather than v3 authorities like they should.
-      Only 2 v2 authorities remain (compared to 7 v3 authorities), leading
-      to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324.
-
-  o Minor bugfixes:
-    - Finally get rid of the deprecated and now harmful notion of "clique
-      mode", where directory authorities maintain TLS connections to
-      every other relay.
-
-  o Testsuite fixes:
-    - In the util/threads test, no longer free the test_mutex before all
-      worker threads have finished. Bugfix on 0.2.1.6-alpha.
-    - The master thread could starve the worker threads quite badly on
-      certain systems, causing them to run only partially in the allowed
-      window. This resulted in test failures. Now the master thread sleeps
-      occasionally for a few microseconds while the two worker-threads
-      compete for the mutex. Bugfix on 0.2.0.1-alpha.
-
-
-Changes in version 0.2.2.13-alpha - 2010-04-24
-  Tor 0.2.2.13-alpha addresses the recent connection and memory overload
-  problems we've been seeing on relays, especially relays with their
-  DirPort open. If your relay has been crashing, or you turned it off
-  because it used too many resources, give this release a try.
-
-  o Major bugfixes:
-    - Teach relays to defend themselves from connection overload. Relays
-      now close idle circuits early if it looks like they were intended
-      for directory fetches. Relays are also more aggressive about closing
-      TLS connections that have no circuits on them. Such circuits are
-      unlikely to be re-used, and tens of thousands of them were piling
-      up at the fast relays, causing the relays to run out of sockets
-      and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling
-      their directory fetches over TLS).
-
-  o Minor features:
-    - Finally get rid of the deprecated and now harmful notion of "clique
-      mode", where directory authorities maintain TLS connections to
-      every other relay.
-    - Directory authorities now do an immediate reachability check as soon
-      as they hear about a new relay. This change should slightly reduce
-      the time between setting up a relay and getting listed as running
-      in the consensus. It should also improve the time between setting
-      up a bridge and seeing use by bridge users.
-    - Directory authorities no longer launch a TLS connection to every
-      relay as they startup. Now that we have 2k+ descriptors cached,
-      the resulting network hiccup is becoming a burden. Besides,
-      authorities already avoid voting about Running for the first half
-      hour of their uptime.
-
-
-Changes in version 0.2.2.12-alpha - 2010-04-20
-  Tor 0.2.2.12-alpha fixes a critical bug in how directory authorities
-  handle and vote on descriptors. It was causing relays to drop out of
-  the consensus.
-
-  o Major bugfixes:
-    - Many relays have been falling out of the consensus lately because
-      not enough authorities know about their descriptor for them to get
-      a majority of votes. When we deprecated the v2 directory protocol,
-      we got rid of the only way that v3 authorities can hear from each
-      other about other descriptors. Now authorities examine every v3
-      vote for new descriptors, and fetch them from that authority. Bugfix
-      on 0.2.1.23.
-    - Fix two typos in tor_vasprintf() that broke the compile on Windows,
-      and a warning in or.h related to bandwidth_weight_rule_t that
-      prevented clean compile on OS X. Fixes bug 1363; bugfix on
-      0.2.2.11-alpha.
-    - Fix a segfault on relays when DirReqStatistics is enabled
-      and 24 hours pass. Bug found by keb. Fixes bug 1365; bugfix on
-      0.2.2.11-alpha.
-
-  o Minor bugfixes:
-    - Demote a confusing TLS warning that relay operators might get when
-      someone tries to talk to their OrPort. It is neither the operator's
-      fault nor can they do anything about it. Fixes bug 1364; bugfix
-      on 0.2.0.14-alpha.
-
-
-Changes in version 0.2.2.11-alpha - 2010-04-15
-  Tor 0.2.2.11-alpha fixes yet another instance of broken OpenSSL
-  libraries that was causing some relays to drop out of the consensus.
-
-  o Major bugfixes:
-    - Directory mirrors were fetching relay descriptors only from v2
-      directory authorities, rather than v3 authorities like they should.
-      Only 2 v2 authorities remain (compared to 7 v3 authorities), leading
-      to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324.
-    - Fix a parsing error that made every possible value of
-      CircPriorityHalflifeMsec get treated as "1 msec". Bugfix
-      on 0.2.2.7-alpha. Rename CircPriorityHalflifeMsec to
-      CircuitPriorityHalflifeMsec, so authorities can tell newer relays
-      about the option without breaking older ones.
-    - Fix SSL renegotiation behavior on OpenSSL versions like on Centos
-      that claim to be earlier than 0.9.8m, but which have in reality
-      backported huge swaths of 0.9.8m or 0.9.8n renegotiation
-      behavior. Possible fix for some cases of bug 1346.
-
-  o Minor features:
-    - Experiment with a more aggressive approach to preventing clients
-      from making one-hop exit streams. Exit relays who want to try it
-      out can set "RefuseUnknownExits 1" in their torrc, and then look
-      for "Attempt by %s to open a stream" log messages. Let us know
-      how it goes!
-    - Add support for statically linking zlib by specifying
-      --enable-static-zlib, to go with our support for statically linking
-      openssl and libevent. Resolves bug 1358.
-
-  o Minor bugfixes:
-    - Fix a segfault that happens whenever a Tor client that is using
-      libevent2's bufferevents gets a hup signal. Bugfix on 0.2.2.5-alpha;
-      fixes bug 1341.
-    - When we cleaned up the contrib/tor-exit-notice.html file, we left
-      out the first line. Fixes bug 1295.
-    - When building the manpage from a tarball, we required asciidoc, but
-      the asciidoc -> roff/html conversion was already done for the
-      tarball. Make 'make' complain only when we need asciidoc (either
-      because we're compiling directly from git, or because we altered
-      the asciidoc manpage in the tarball). Bugfix on 0.2.2.9-alpha.
-    - When none of the directory authorities vote on any params, Tor
-      segfaulted when trying to make the consensus from the votes. We
-      didn't trigger the bug in practice, because authorities do include
-      params in their votes. Bugfix on 0.2.2.10-alpha; fixes bug 1322.
-
-  o Testsuite fixes:
-    - In the util/threads test, no longer free the test_mutex before all
-      worker threads have finished. Bugfix on 0.2.1.6-alpha.
-    - The master thread could starve the worker threads quite badly on
-      certain systems, causing them to run only partially in the allowed
-      window. This resulted in test failures. Now the master thread sleeps
-      occasionally for a few microseconds while the two worker-threads
-      compete for the mutex. Bugfix on 0.2.0.1-alpha.
-
-
-Changes in version 0.2.2.10-alpha - 2010-03-07
-  Tor 0.2.2.10-alpha fixes a regression introduced in 0.2.2.9-alpha that
-  could prevent relays from guessing their IP address correctly. It also
-  starts the groundwork for another client-side performance boost, since
-  currently we're not making efficient use of relays that have both the
-  Guard flag and the Exit flag.
-
-  o Major bugfixes:
-    - Fix a regression from our patch for bug 1244 that caused relays
-      to guess their IP address incorrectly if they didn't set Address
-      in their torrc and/or their address fails to resolve. Bugfix on
-      0.2.2.9-alpha; fixes bug 1269.
-
-  o Major features (performance):
-    - Directory authorities now compute consensus weightings that instruct
-      clients how to weight relays flagged as Guard, Exit, Guard+Exit,
-      and no flag. Clients that use these weightings will distribute
-      network load more evenly across these different relay types. The
-      weightings are in the consensus so we can change them globally in
-      the future. Extra thanks to "outofwords" for finding some nasty
-      security bugs in the first implementation of this feature.
-
-  o Minor features (performance):
-    - Always perform router selections using weighted relay bandwidth,
-      even if we don't need a high capacity circuit at the time. Non-fast
-      circuits now only differ from fast ones in that they can use relays
-      not marked with the Fast flag. This "feature" could turn out to
-      be a horrible bug; we should investigate more before it goes into
-      a stable release.
-
-  o Minor features:
-    - Allow disabling building of the manpages. Skipping the manpage
-      speeds up the build considerably.
-
-  o Minor bugfixes (on 0.2.2.x):
-    - Fix a memleak in the EXTENDCIRCUIT logic. Spotted by coverity.
-      Bugfix on 0.2.2.9-alpha.
-    - Disallow values larger than INT32_MAX for PerConnBWRate|Burst
-      config option. Bugfix on 0.2.2.7-alpha.
-    - Ship the asciidoc-helper file in the tarball, so that people can
-      build from source if they want to, and touching the .1.txt files
-      doesn't break the build. Bugfix on 0.2.2.9-alpha.
-
-  o Minor bugfixes (on 0.2.1.x or earlier):
-    - Fix a dereference-then-NULL-check sequence when publishing
-      descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes
-      bug 1255.
-    - Fix another dereference-then-NULL-check sequence. Bugfix on
-      0.2.1.14-rc. Discovered by ekir; fixes bug 1256.
-    - Make sure we treat potentially not NUL-terminated strings correctly.
-      Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257.
-
-  o Code simplifications and refactoring:
-    - Fix some urls in the exit notice file and make it XHTML1.1 strict
-      compliant. Based on a patch from Christian Kujau.
-    - Don't use sed in asciidoc-helper anymore.
-    - Make the build process fail if asciidoc cannot be found and
-      building with asciidoc isn't disabled.
-
-
-Changes in version 0.2.2.9-alpha - 2010-02-22
-  Tor 0.2.2.9-alpha makes Tor work again on the latest OS X, updates the
-  location of a directory authority, and cleans up a bunch of small bugs.
-
-  o Directory authority changes:
-    - Change IP address for dannenberg (v3 directory authority), and
-      remove moria2 (obsolete v1, v2 directory authority and v0 hidden
-      service directory authority) from the list.
-
-  o Major bugfixes:
-    - Make Tor work again on the latest OS X: when deciding whether to
-      use strange flags to turn TLS renegotiation on, detect the OpenSSL
-      version at run-time, not compile time. We need to do this because
-      Apple doesn't update its dev-tools headers when it updates its
-      libraries in a security patch.
-    - Fix a potential buffer overflow in lookup_last_hid_serv_request()
-      that could happen on 32-bit platforms with 64-bit time_t. Also fix
-      a memory leak when requesting a hidden service descriptor we've
-      requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found
-      by aakova.
-    - Authorities could be tricked into giving out the Exit flag to relays
-      that didn't allow exiting to any ports. This bug could screw
-      with load balancing and stats. Bugfix on 0.1.1.6-alpha; fixes bug
-      1238. Bug discovered by Martin Kowalczyk.
-    - When freeing a session key, zero it out completely. We only zeroed
-      the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and
-      patched by ekir. Fixes bug 1254.
-
-  o Minor bugfixes:
-    - Fix static compilation by listing the openssl libraries in the right
-      order. Bugfix on Tor 0.2.2.8-alpha; fixes bug 1237.
-    - Resume handling .exit hostnames in a special way: originally we
-      stripped the .exit part and used the requested exit relay. In
-      0.2.2.1-alpha we stopped treating them in any special way, meaning
-      if you use a .exit address then Tor will pass it on to the exit
-      relay. Now we reject the .exit stream outright, since that behavior
-      might be more expected by the user. Found and diagnosed by Scott
-      Bennett and Downie on or-talk.
-    - Don't spam the controller with events when we have no file
-      descriptors available. Bugfix on 0.2.1.5-alpha. (Rate-limiting
-      for log messages was already solved from bug 748.)
-    - Avoid a bogus overlapped memcpy in tor_addr_copy(). Reported by
-      "memcpyfail".
-    - Make the DNSPort option work with libevent 2.x. Don't alter the
-      behavior for libevent 1.x. Fixes bug 1143. Found by SwissTorExit.
-    - Emit a GUARD DROPPED controller event for a case we missed.
-    - Make more fields in the controller protocol case-insensitive, since
-      control-spec.txt said they were.
-    - Refactor resolve_my_address() to not use gethostbyname() anymore.
-      Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik.
-    - Fix a spec conformance issue: the network-status-version token
-      must be the first token in a v3 consensus or vote. Discovered by
-      parakeep. Bugfix on 0.2.0.3-alpha.
-
-  o Code simplifications and refactoring:
-    - Generate our manpage and HTML documentation using Asciidoc. This
-      change should make it easier to maintain the documentation, and
-      produce nicer HTML.
-    - Remove the --enable-iphone option. According to reports from Marco
-      Bonetti, Tor builds fine without any special tweaking on recent
-      iPhone SDK versions.
-    - Removed some unnecessary files from the source distribution. The
-      AUTHORS file has now been merged into the people page on the
-      website. The roadmaps and design doc can now be found in the
-      projects directory in svn.
-    - Enabled various circuit build timeout constants to be controlled
-      by consensus parameters. Also set better defaults for these
-      parameters based on experimentation on broadband and simulated
-      high latency links.
-
-  o Minor features:
-    - The 'EXTENDCIRCUIT' control port command can now be used with
-      a circ id of 0 and no path. This feature will cause Tor to build
-      a new 'fast' general purpose circuit using its own path selection
-      algorithms.
-    - Added a BUILDTIMEOUT_SET controller event to describe changes
-      to the circuit build timeout.
-    - Future-proof the controller protocol a bit by ignoring keyword
-      arguments we do not recognize.
-    - Expand homedirs passed to tor-checkkey. This should silence a
-      coverity complaint about passing a user-supplied string into
-      open() without checking it.
-
-
-Changes in version 0.2.1.25 - 2010-03-16
-  Tor 0.2.1.25 fixes a regression introduced in 0.2.1.23 that could
-  prevent relays from guessing their IP address correctly. It also fixes
-  several minor potential security bugs.
-
-  o Major bugfixes:
-    - Fix a regression from our patch for bug 1244 that caused relays
-      to guess their IP address incorrectly if they didn't set Address
-      in their torrc and/or their address fails to resolve. Bugfix on
-      0.2.1.23; fixes bug 1269.
-    - When freeing a session key, zero it out completely. We only zeroed
-      the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and
-      patched by ekir. Fixes bug 1254.
-
-  o Minor bugfixes:
-    - Fix a dereference-then-NULL-check sequence when publishing
-      descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes
-      bug 1255.
-    - Fix another dereference-then-NULL-check sequence. Bugfix on
-      0.2.1.14-rc. Discovered by ekir; fixes bug 1256.
-    - Make sure we treat potentially not NUL-terminated strings correctly.
-      Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257.
-
-
-
-Changes in version 0.2.1.24 - 2010-02-21
-  Tor 0.2.1.24 makes Tor work again on the latest OS X -- this time
-  for sure!
-
-  o Minor bugfixes:
-    - Work correctly out-of-the-box with even more vendor-patched versions
-      of OpenSSL. In particular, make it so Debian and OS X don't need
-      customized patches to run/build.
-
-
-Changes in version 0.2.1.23 - 2010-02-13
-  Tor 0.2.1.23 fixes a huge client-side performance bug, makes Tor work
-  again on the latest OS X, and updates the location of a directory
-  authority.
-
-  o Major bugfixes (performance):
-    - We were selecting our guards uniformly at random, and then weighting
-      which of our guards we'd use uniformly at random. This imbalance
-      meant that Tor clients were severely limited on throughput (and
-      probably latency too) by the first hop in their circuit. Now we
-      select guards weighted by currently advertised bandwidth. We also
-      automatically discard guards picked using the old algorithm. Fixes
-      bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry.
-
-  o Major bugfixes:
-    - Make Tor work again on the latest OS X: when deciding whether to
-      use strange flags to turn TLS renegotiation on, detect the OpenSSL
-      version at run-time, not compile time. We need to do this because
-      Apple doesn't update its dev-tools headers when it updates its
-      libraries in a security patch.
-    - Fix a potential buffer overflow in lookup_last_hid_serv_request()
-      that could happen on 32-bit platforms with 64-bit time_t. Also fix
-      a memory leak when requesting a hidden service descriptor we've
-      requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found
-      by aakova.
-
-  o Directory authority changes:
-    - Change IP address for dannenberg (v3 directory authority), and
-      remove moria2 (obsolete v1, v2 directory authority and v0 hidden
-      service directory authority) from the list.
-
-  o Minor bugfixes:
-    - Refactor resolve_my_address() to not use gethostbyname() anymore.
-      Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik.
-
-  o Minor features:
-    - Avoid a mad rush at the beginning of each month when each client
-      rotates half of its guards. Instead we spread the rotation out
-      throughout the month, but we still avoid leaving a precise timestamp
-      in the state file about when we first picked the guard. Improves
-      over the behavior introduced in 0.1.2.17.
-
-
-Changes in version 0.2.2.8-alpha - 2010-01-26
-  Tor 0.2.2.8-alpha fixes a crash bug in 0.2.2.7-alpha that has been
-  causing bridge relays to disappear. If you're running a bridge,
-  please upgrade.
-
-  o Major bugfixes:
-    - Fix a memory corruption bug on bridges that occured during the
-      inclusion of stats data in extra-info descriptors. Also fix the
-      interface for geoip_get_bridge_stats* to prevent similar bugs in
-      the future. Diagnosis by Tas, patch by Karsten and Sebastian.
-      Fixes bug 1208; bugfix on 0.2.2.7-alpha.
-
-  o Minor bugfixes:
-    - Ignore OutboundBindAddress when connecting to localhost.
-      Connections to localhost need to come _from_ localhost, or else
-      local servers (like DNS and outgoing HTTP/SOCKS proxies) will often
-      refuse to listen.
-
-
-Changes in version 0.2.2.7-alpha - 2010-01-19
-  Tor 0.2.2.7-alpha fixes a huge client-side performance bug, as well
-  as laying the groundwork for further relay-side performance fixes. It
-  also starts cleaning up client behavior with respect to the EntryNodes,
-  ExitNodes, and StrictNodes config options.
-
-  This release also rotates two directory authority keys, due to a
-  security breach of some of the Torproject servers.
-
-  o Directory authority changes:
-    - Rotate keys (both v3 identity and relay identity) for moria1
-      and gabelmoo.
-
-  o Major features (performance):
-    - We were selecting our guards uniformly at random, and then weighting
-      which of our guards we'd use uniformly at random. This imbalance
-      meant that Tor clients were severely limited on throughput (and
-      probably latency too) by the first hop in their circuit. Now we
-      select guards weighted by currently advertised bandwidth. We also
-      automatically discard guards picked using the old algorithm. Fixes
-      bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry.
-    - When choosing which cells to relay first, relays can now favor
-      circuits that have been quiet recently, to provide lower latency
-      for low-volume circuits. By default, relays enable or disable this
-      feature based on a setting in the consensus. You can override
-      this default by using the new "CircuitPriorityHalflife" config
-      option. Design and code by Ian Goldberg, Can Tang, and Chris
-      Alexander.
-    - Add separate per-conn write limiting to go with the per-conn read
-      limiting. We added a global write limit in Tor 0.1.2.5-alpha,
-      but never per-conn write limits.
-    - New consensus params "bwconnrate" and "bwconnburst" to let us
-      rate-limit client connections as they enter the network. It's
-      controlled in the consensus so we can turn it on and off for
-      experiments. It's starting out off. Based on proposal 163.
-
-  o Major features (relay selection options):
-    - Switch to a StrictNodes config option, rather than the previous
-      "StrictEntryNodes" / "StrictExitNodes" separation that was missing a
-      "StrictExcludeNodes" option.
-    - If EntryNodes, ExitNodes, ExcludeNodes, or ExcludeExitNodes
-      change during a config reload, mark and discard all our origin
-      circuits. This fix should address edge cases where we change the
-      config options and but then choose a circuit that we created before
-      the change.
-    - If EntryNodes or ExitNodes are set, be more willing to use an
-      unsuitable (e.g. slow or unstable) circuit. The user asked for it,
-      they get it.
-    - Make EntryNodes config option much more aggressive even when
-      StrictNodes is not set. Before it would prepend your requested
-      entrynodes to your list of guard nodes, but feel free to use others
-      after that. Now it chooses only from your EntryNodes if any of
-      those are available, and only falls back to others if a) they're
-      all down and b) StrictNodes is not set.
-    - Now we refresh your entry guards from EntryNodes at each consensus
-      fetch -- rather than just at startup and then they slowly rot as
-      the network changes.
-
-  o Major bugfixes:
-    - Stop bridge directory authorities from answering dbg-stability.txt
-      directory queries, which would let people fetch a list of all
-      bridge identities they track. Bugfix on 0.2.1.6-alpha.
-
-  o Minor features:
-    - Log a notice when we get a new control connection. Now it's easier
-      for security-conscious users to recognize when a local application
-      is knocking on their controller door. Suggested by bug 1196.
-    - New config option "CircuitStreamTimeout" to override our internal
-      timeout schedule for how many seconds until we detach a stream from
-      a circuit and try a new circuit. If your network is particularly
-      slow, you might want to set this to a number like 60.
-    - New controller command "getinfo config-text". It returns the
-      contents that Tor would write if you send it a SAVECONF command,
-      so the controller can write the file to disk itself.
-    - New options for SafeLogging to allow scrubbing only log messages
-      generated while acting as a relay.
-    - Ship the bridges spec file in the tarball too.
-    - Avoid a mad rush at the beginning of each month when each client
-      rotates half of its guards. Instead we spread the rotation out
-      throughout the month, but we still avoid leaving a precise timestamp
-      in the state file about when we first picked the guard. Improves
-      over the behavior introduced in 0.1.2.17.
-
-  o Minor bugfixes (compiling):
-    - Fix compilation on OS X 10.3, which has a stub mlockall() but
-      hides it. Bugfix on 0.2.2.6-alpha.
-    - Fix compilation on Solaris by removing support for the
-      DisableAllSwap config option. Solaris doesn't have an rlimit for
-      mlockall, so we cannot use it safely. Fixes bug 1198; bugfix on
-      0.2.2.6-alpha.
-
-  o Minor bugfixes (crashes):
-    - Do not segfault when writing buffer stats when we haven't observed
-      a single circuit to report about. Found by Fabian Lanze. Bugfix on
-      0.2.2.1-alpha.
-    - If we're in the pathological case where there's no exit bandwidth
-      but there is non-exit bandwidth, or no guard bandwidth but there
-      is non-guard bandwidth, don't crash during path selection. Bugfix
-      on 0.2.0.3-alpha.
-    - Fix an impossible-to-actually-trigger buffer overflow in relay
-      descriptor generation. Bugfix on 0.1.0.15.
-
-  o Minor bugfixes (privacy):
-    - Fix an instance where a Tor directory mirror might accidentally
-      log the IP address of a misbehaving Tor client. Bugfix on
-      0.1.0.1-rc.
-    - Don't list Windows capabilities in relay descriptors. We never made
-      use of them, and maybe it's a bad idea to publish them. Bugfix
-      on 0.1.1.8-alpha.
-
-  o Minor bugfixes (other):
-    - Resolve an edge case in path weighting that could make us misweight
-      our relay selection. Fixes bug 1203; bugfix on 0.0.8rc1.
-    - Fix statistics on client numbers by country as seen by bridges that
-      were broken in 0.2.2.1-alpha. Also switch to reporting full 24-hour
-      intervals instead of variable 12-to-48-hour intervals.
-    - After we free an internal connection structure, overwrite it
-      with a different memory value than we use for overwriting a freed
-      internal circuit structure. Should help with debugging. Suggested
-      by bug 1055.
-    - Update our OpenSSL 0.9.8l fix so that it works with OpenSSL 0.9.8m
-      too.
-
-  o Removed features:
-    - Remove the HSAuthorityRecordStats option that version 0 hidden
-      service authorities could have used to track statistics of overall
-      hidden service usage.
-
-
-Changes in version 0.2.1.22 - 2010-01-19
-  Tor 0.2.1.22 fixes a critical privacy problem in bridge directory
-  authorities -- it would tell you its whole history of bridge descriptors
-  if you make the right directory request. This stable update also
-  rotates two of the seven v3 directory authority keys and locations.
-
-  o Directory authority changes:
-    - Rotate keys (both v3 identity and relay identity) for moria1
-      and gabelmoo.
-
-  o Major bugfixes:
-    - Stop bridge directory authorities from answering dbg-stability.txt
-      directory queries, which would let people fetch a list of all
-      bridge identities they track. Bugfix on 0.2.1.6-alpha.
-
-
-Changes in version 0.2.1.21 - 2009-12-21
-  Tor 0.2.1.21 fixes an incompatibility with the most recent OpenSSL
-  library. If you use Tor on Linux / Unix and you're getting SSL
-  renegotiation errors, upgrading should help. We also recommend an
-  upgrade if you're an exit relay.
-
-  o Major bugfixes:
-    - Work around a security feature in OpenSSL 0.9.8l that prevents our
-      handshake from working unless we explicitly tell OpenSSL that we
-      are using SSL renegotiation safely. We are, of course, but OpenSSL
-      0.9.8l won't work unless we say we are.
-    - Avoid crashing if the client is trying to upload many bytes and the
-      circuit gets torn down at the same time, or if the flip side
-      happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150.
-
-  o Minor bugfixes:
-    - Do not refuse to learn about authority certs and v2 networkstatus
-      documents that are older than the latest consensus. This bug might
-      have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha.
-      Spotted and fixed by xmux.
-    - Fix a couple of very-hard-to-trigger memory leaks, and one hard-to-
-      trigger platform-specific option misparsing case found by Coverity
-      Scan.
-    - Fix a compilation warning on Fedora 12 by removing an impossible-to-
-      trigger assert. Fixes bug 1173.
-
-
-Changes in version 0.2.2.6-alpha - 2009-11-19
-  Tor 0.2.2.6-alpha lays the groundwork for many upcoming features:
-  support for the new lower-footprint "microdescriptor" directory design,
-  future-proofing our consensus format against new hash functions or
-  other changes, and an Android port. It also makes Tor compatible with
-  the upcoming OpenSSL 0.9.8l release, and fixes a variety of bugs.
-
-  o Major features:
-    - Directory authorities can now create, vote on, and serve multiple
-      parallel formats of directory data as part of their voting process.
-      Partially implements Proposal 162: "Publish the consensus in
-      multiple flavors".
-    - Directory authorities can now agree on and publish small summaries
-      of router information that clients can use in place of regular
-      server descriptors. This transition will eventually allow clients
-      to use far less bandwidth for downloading information about the
-      network. Begins the implementation of Proposal 158: "Clients
-      download consensus + microdescriptors".
-    - The directory voting system is now extensible to use multiple hash
-      algorithms for signatures and resource selection. Newer formats
-      are signed with SHA256, with a possibility for moving to a better
-      hash algorithm in the future.
-    - New DisableAllSwap option. If set to 1, Tor will attempt to lock all
-      current and future memory pages via mlockall(). On supported
-      platforms (modern Linux and probably BSD but not Windows or OS X),
-      this should effectively disable any and all attempts to page out
-      memory. This option requires that you start your Tor as root --
-      if you use DisableAllSwap, please consider using the User option
-      to properly reduce the privileges of your Tor.
-    - Numerous changes, bugfixes, and workarounds from Nathan Freitas
-      to help Tor build correctly for Android phones.
-
-  o Major bugfixes:
-    - Work around a security feature in OpenSSL 0.9.8l that prevents our
-      handshake from working unless we explicitly tell OpenSSL that we
-      are using SSL renegotiation safely. We are, but OpenSSL 0.9.8l
-      won't work unless we say we are.
-
-  o Minor bugfixes:
-    - Fix a crash bug when trying to initialize the evdns module in
-      Libevent 2. Bugfix on 0.2.1.16-rc.
-    - Stop logging at severity 'warn' when some other Tor client tries
-      to establish a circuit with us using weak DH keys. It's a protocol
-      violation, but that doesn't mean ordinary users need to hear about
-      it. Fixes the bug part of bug 1114. Bugfix on 0.1.0.13.
-    - Do not refuse to learn about authority certs and v2 networkstatus
-      documents that are older than the latest consensus. This bug might
-      have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha.
-      Spotted and fixed by xmux.
-    - Fix numerous small code-flaws found by Coverity Scan Rung 3.
-    - If all authorities restart at once right before a consensus vote,
-      nobody will vote about "Running", and clients will get a consensus
-      with no usable relays. Instead, authorities refuse to build a
-      consensus if this happens. Bugfix on 0.2.0.10-alpha; fixes bug 1066.
-    - If your relay can't keep up with the number of incoming create
-      cells, it would log one warning per failure into your logs. Limit
-      warnings to 1 per minute. Bugfix on 0.0.2pre10; fixes bug 1042.
-    - Bridges now use "reject *:*" as their default exit policy. Bugfix
-      on 0.2.0.3-alpha; fixes bug 1113.
-    - Fix a memory leak on directory authorities during voting that was
-      introduced in 0.2.2.1-alpha. Found via valgrind.
-
-
-Changes in version 0.2.1.20 - 2009-10-15
-  Tor 0.2.1.20 fixes a crash bug when you're accessing many hidden
-  services at once, prepares for more performance improvements, and
-  fixes a bunch of smaller bugs.
-
-  The Windows and OS X bundles also include a more recent Vidalia,
-  and switch from Privoxy to Polipo.
-
-  The OS X installers are now drag and drop. It's best to un-install
-  Tor/Vidalia and then install this new bundle, rather than upgrade. If
-  you want to upgrade, you'll need to update the paths for Tor and Polipo
-  in the Vidalia Settings window.
-
-  o Major bugfixes:
-    - Send circuit or stream sendme cells when our window has decreased
-      by 100 cells, not when it has decreased by 101 cells. Bug uncovered
-      by Karsten when testing the "reduce circuit window" performance
-      patch. Bugfix on the 54th commit on Tor -- from July 2002,
-      before the release of Tor 0.0.0. This is the new winner of the
-      oldest-bug prize.
-    - Fix a remotely triggerable memory leak when a consensus document
-      contains more than one signature from the same voter. Bugfix on
-      0.2.0.3-alpha.
-    - Avoid segfault in rare cases when finishing an introduction circuit
-      as a client and finding out that we don't have an introduction key
-      for it. Fixes bug 1073. Reported by Aaron Swartz.
-
-  o Major features:
-    - Tor now reads the "circwindow" parameter out of the consensus,
-      and uses that value for its circuit package window rather than the
-      default of 1000 cells. Begins the implementation of proposal 168.
-
-  o New directory authorities:
-    - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory
-      authority.
-    - Move moria1 and tonga to alternate IP addresses.
-
-  o Minor bugfixes:
-    - Fix a signed/unsigned compile warning in 0.2.1.19.
-    - Fix possible segmentation fault on directory authorities. Bugfix on
-      0.2.1.14-rc.
-    - Fix an extremely rare infinite recursion bug that could occur if
-      we tried to log a message after shutting down the log subsystem.
-      Found by Matt Edman. Bugfix on 0.2.0.16-alpha.
-    - Fix an obscure bug where hidden services on 64-bit big-endian
-      systems might mis-read the timestamp in v3 introduce cells, and
-      refuse to connect back to the client. Discovered by "rotor".
-      Bugfix on 0.2.1.6-alpha.
-    - We were triggering a CLOCK_SKEW controller status event whenever
-      we connect via the v2 connection protocol to any relay that has
-      a wrong clock. Instead, we should only inform the controller when
-      it's a trusted authority that claims our clock is wrong. Bugfix
-      on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit.
-    - We were telling the controller about CHECKING_REACHABILITY and
-      REACHABILITY_FAILED status events whenever we launch a testing
-      circuit or notice that one has failed. Instead, only tell the
-      controller when we want to inform the user of overall success or
-      overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported
-      by SwissTorExit.
-    - Don't warn when we're using a circuit that ends with a node
-      excluded in ExcludeExitNodes, but the circuit is not used to access
-      the outside world. This should help fix bug 1090. Bugfix on
-      0.2.1.6-alpha.
-    - Work around a small memory leak in some versions of OpenSSL that
-      stopped the memory used by the hostname TLS extension from being
-      freed.
-
-  o Minor features:
-    - Add a "getinfo status/accepted-server-descriptor" controller
-      command, which is the recommended way for controllers to learn
-      whether our server descriptor has been successfully received by at
-      least on directory authority. Un-recommend good-server-descriptor
-      getinfo and status events until we have a better design for them.
-
-
-Changes in version 0.2.2.5-alpha - 2009-10-11
-  Tor 0.2.2.5-alpha fixes a few compile problems in 0.2.2.4-alpha.
-
-  o Major bugfixes:
-    - Make the tarball compile again. Oops. Bugfix on 0.2.2.4-alpha.
-
-  o Directory authorities:
-    - Temporarily (just for this release) move dizum to an alternate
-      IP address.
-
-
-Changes in version 0.2.2.4-alpha - 2009-10-10
-  Tor 0.2.2.4-alpha fixes more crash bugs in 0.2.2.2-alpha. It also
-  introduces a new unit test framework, shifts directry authority
-  addresses around to reduce the impact from recent blocking events,
-  and fixes a few smaller bugs.
-
-  o Major bugfixes:
-    - Fix several more asserts in the circuit_build_times code, for
-      example one that causes Tor to fail to start once we have
-      accumulated 5000 build times in the state file. Bugfixes on
-      0.2.2.2-alpha; fixes bug 1108.
-
-  o New directory authorities:
-    - Move moria1 and Tonga to alternate IP addresses.
-
-  o Minor features:
-    - Log SSL state transitions at debug level during handshake, and
-      include SSL states in error messages. This may help debug future
-      SSL handshake issues.
-    - Add a new "Handshake" log domain for activities that happen
-      during the TLS handshake.
-    - Revert to the "June 3 2009" ip-to-country file. The September one
-      seems to have removed most US IP addresses.
-    - Directory authorities now reject Tor relays with versions less than
-      0.1.2.14. This step cuts out four relays from the current network,
-      none of which are very big.
-
-  o Minor bugfixes:
-    - Fix a couple of smaller issues with gathering statistics. Bugfixes
-      on 0.2.2.1-alpha.
-    - Fix two memory leaks in the error case of
-      circuit_build_times_parse_state(). Bugfix on 0.2.2.2-alpha.
-    - Don't count one-hop circuits when we're estimating how long it
-      takes circuits to build on average. Otherwise we'll set our circuit
-      build timeout lower than we should. Bugfix on 0.2.2.2-alpha.
-    - Directory authorities no longer change their opinion of, or vote on,
-      whether a router is Running, unless they have themselves been
-      online long enough to have some idea. Bugfix on 0.2.0.6-alpha.
-      Fixes bug 1023.
-
-  o Code simplifications and refactoring:
-    - Revise our unit tests to use the "tinytest" framework, so we
-      can run tests in their own processes, have smarter setup/teardown
-      code, and so on. The unit test code has moved to its own
-      subdirectory, and has been split into multiple modules.
-
-
-Changes in version 0.2.2.3-alpha - 2009-09-23
-  Tor 0.2.2.3-alpha fixes a few crash bugs in 0.2.2.2-alpha.
-
-  o Major bugfixes:
-    - Fix an overzealous assert in our new circuit build timeout code.
-      Bugfix on 0.2.2.2-alpha; fixes bug 1103.
-
-  o Minor bugfixes:
-    - If the networkstatus consensus tells us that we should use a
-      negative circuit package window, ignore it. Otherwise we'll
-      believe it and then trigger an assert. Bugfix on 0.2.2.2-alpha.
-
-
-Changes in version 0.2.2.2-alpha - 2009-09-21
-  Tor 0.2.2.2-alpha introduces our latest performance improvement for
-  clients: Tor tracks the average time it takes to build a circuit, and
-  avoids using circuits that take too long to build. For fast connections,
-  this feature can cut your expected latency in half. For slow or flaky
-  connections, it could ruin your Tor experience. Let us know if it does!
-
-  o Major features:
-    - Tor now tracks how long it takes to build client-side circuits
-      over time, and adapts its timeout to local network performance.
-      Since a circuit that takes a long time to build will also provide
-      bad performance, we get significant latency improvements by
-      discarding the slowest 20% of circuits. Specifically, Tor creates
-      circuits more aggressively than usual until it has enough data
-      points for a good timeout estimate. Implements proposal 151.
-      We are especially looking for reports (good and bad) from users with
-      both EDGE and broadband connections that can move from broadband
-      to EDGE and find out if the build-time data in the .tor/state gets
-      reset without loss of Tor usability. You should also see a notice
-      log message telling you that Tor has reset its timeout.
-    - Directory authorities can now vote on arbitary integer values as
-      part of the consensus process. This is designed to help set
-      network-wide parameters. Implements proposal 167.
-    - Tor now reads the "circwindow" parameter out of the consensus,
-      and uses that value for its circuit package window rather than the
-      default of 1000 cells. Begins the implementation of proposal 168.
-
-  o Major bugfixes:
-    - Fix a remotely triggerable memory leak when a consensus document
-      contains more than one signature from the same voter. Bugfix on
-      0.2.0.3-alpha.
-
-  o Minor bugfixes:
-    - Fix an extremely rare infinite recursion bug that could occur if
-      we tried to log a message after shutting down the log subsystem.
-      Found by Matt Edman. Bugfix on 0.2.0.16-alpha.
-    - Fix parsing for memory or time units given without a space between
-      the number and the unit. Bugfix on 0.2.2.1-alpha; fixes bug 1076.
-    - A networkstatus vote must contain exactly one signature. Spec
-      conformance issue. Bugfix on 0.2.0.3-alpha.
-    - Fix an obscure bug where hidden services on 64-bit big-endian
-      systems might mis-read the timestamp in v3 introduce cells, and
-      refuse to connect back to the client. Discovered by "rotor".
-      Bugfix on 0.2.1.6-alpha.
-    - We were triggering a CLOCK_SKEW controller status event whenever
-      we connect via the v2 connection protocol to any relay that has
-      a wrong clock. Instead, we should only inform the controller when
-      it's a trusted authority that claims our clock is wrong. Bugfix
-      on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit.
-    - We were telling the controller about CHECKING_REACHABILITY and
-      REACHABILITY_FAILED status events whenever we launch a testing
-      circuit or notice that one has failed. Instead, only tell the
-      controller when we want to inform the user of overall success or
-      overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported
-      by SwissTorExit.
-    - Don't warn when we're using a circuit that ends with a node
-      excluded in ExcludeExitNodes, but the circuit is not used to access
-      the outside world. This should help fix bug 1090, but more problems
-      remain. Bugfix on 0.2.1.6-alpha.
-    - Work around a small memory leak in some versions of OpenSSL that
-      stopped the memory used by the hostname TLS extension from being
-      freed.
-    - Make our 'torify' script more portable; if we have only one of
-      'torsocks' or 'tsocks' installed, don't complain to the user;
-      and explain our warning about tsocks better.
-
-  o Minor features:
-    - Add a "getinfo status/accepted-server-descriptor" controller
-      command, which is the recommended way for controllers to learn
-      whether our server descriptor has been successfully received by at
-      least on directory authority. Un-recommend good-server-descriptor
-      getinfo and status events until we have a better design for them.
-    - Update to the "September 4 2009" ip-to-country file.
-
-
-Changes in version 0.2.2.1-alpha - 2009-08-26
-  Tor 0.2.2.1-alpha disables ".exit" address notation by default, allows
-  Tor clients to bootstrap on networks where only port 80 is reachable,
-  makes it more straightforward to support hardware crypto accelerators,
-  and starts the groundwork for gathering stats safely at relays.
-
-  o Security fixes:
-    - Start the process of disabling ".exit" address notation, since it
-      can be used for a variety of esoteric application-level attacks
-      on users. To reenable it, set "AllowDotExit 1" in your torrc. Fix
-      on 0.0.9rc5.
-
-  o New directory authorities:
-    - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory
-      authority.
-
-  o Major features:
-    - New AccelName and AccelDir options add support for dynamic OpenSSL
-      hardware crypto acceleration engines.
-    - Tor now supports tunneling all of its outgoing connections over
-      a SOCKS proxy, using the SOCKS4Proxy and/or SOCKS5Proxy
-      configuration options. Code by Christopher Davis.
-
-  o Major bugfixes:
-    - Send circuit or stream sendme cells when our window has decreased
-      by 100 cells, not when it has decreased by 101 cells. Bug uncovered
-      by Karsten when testing the "reduce circuit window" performance
-      patch. Bugfix on the 54th commit on Tor -- from July 2002,
-      before the release of Tor 0.0.0. This is the new winner of the
-      oldest-bug prize.
-
-  o New options for gathering stats safely:
-    - Directory mirrors that set "DirReqStatistics 1" write statistics
-      about directory requests to disk every 24 hours. As compared to the
-      --enable-geoip-stats flag in 0.2.1.x, there are a few improvements:
-      1) stats are written to disk exactly every 24 hours; 2) estimated
-      shares of v2 and v3 requests are determined as mean values, not at
-      the end of a measurement period; 3) unresolved requests are listed
-      with country code '??'; 4) directories also measure download times.
-    - Exit nodes that set "ExitPortStatistics 1" write statistics on the
-      number of exit streams and transferred bytes per port to disk every
-      24 hours.
-    - Relays that set "CellStatistics 1" write statistics on how long
-      cells spend in their circuit queues to disk every 24 hours.
-    - Entry nodes that set "EntryStatistics 1" write statistics on the
-      rough number and origins of connecting clients to disk every 24
-      hours.
-    - Relays that write any of the above statistics to disk and set
-      "ExtraInfoStatistics 1" include the past 24 hours of statistics in
-      their extra-info documents.
-
-  o Minor features:
-    - New --digests command-line switch to output the digests of the
-      source files Tor was built with.
-    - The "torify" script now uses torsocks where available.
-    - The memarea code now uses a sentinel value at the end of each area
-      to make sure nothing writes beyond the end of an area. This might
-      help debug some conceivable causes of bug 930.
-    - Time and memory units in the configuration file can now be set to
-      fractional units. For example, "2.5 GB" is now a valid value for
-      AccountingMax.
-    - Certain Tor clients (such as those behind check.torproject.org) may
-      want to fetch the consensus in an extra early manner. To enable this
-      a user may now set FetchDirInfoExtraEarly to 1. This also depends on
-      setting FetchDirInfoEarly to 1. Previous behavior will stay the same
-      as only certain clients who must have this information sooner should
-      set this option.
-    - Instead of adding the svn revision to the Tor version string, report
-      the git commit (when we're building from a git checkout).
-
-  o Minor bugfixes:
-    - If any of the v3 certs we download are unparseable, we should
-      actually notice the failure so we don't retry indefinitely. Bugfix
-      on 0.2.0.x; reported by "rotator".
-    - If the cached cert file is unparseable, warn but don't exit.
-    - Fix possible segmentation fault on directory authorities. Bugfix on
-      0.2.1.14-rc.
-    - When Tor fails to parse a descriptor of any kind, dump it to disk.
-      Might help diagnosing bug 1051.
-
-  o Deprecated and removed features:
-    - The controller no longer accepts the old obsolete "addr-mappings/"
-      or "unregistered-servers-" GETINFO values.
-    - Hidden services no longer publish version 0 descriptors, and clients
-      do not request or use version 0 descriptors. However, the old hidden
-      service authorities still accept and serve version 0 descriptors
-      when contacted by older hidden services/clients.
-    - The EXTENDED_EVENTS and VERBOSE_NAMES controller features are now
-      always on; using them is necessary for correct forward-compatible
-      controllers.
-    - Remove support for .noconnect style addresses. Nobody was using
-      them, and they provided another avenue for detecting Tor users
-      via application-level web tricks.
-
-  o Packaging changes:
-    - Upgrade Vidalia from 0.1.15 to 0.2.3 in the Windows and OS X
-      installer bundles. See
-      https://trac.vidalia-project.net/browser/vidalia/tags/vidalia-0.2.3/CHANGELOG
-      for details of what's new in Vidalia 0.2.3.
-    - Windows Vidalia Bundle: update Privoxy from 3.0.6 to 3.0.14-beta.
-    - OS X Vidalia Bundle: move to Polipo 1.0.4 with Tor specific
-      configuration file, rather than the old Privoxy.
-    - OS X Vidalia Bundle: Vidalia, Tor, and Polipo are compiled as
-      x86-only for better compatibility with OS X 10.6, aka Snow Leopard.
-    - OS X Tor Expert Bundle: Tor is compiled as x86-only for
-      better compatibility with OS X 10.6, aka Snow Leopard.
-    - OS X Vidalia Bundle: The multi-package installer is now replaced
-      by a simple drag and drop to the /Applications folder. This change
-      occurred with the upgrade to Vidalia 0.2.3.
-
-
-Changes in version 0.2.1.19 - 2009-07-28
-  Tor 0.2.1.19 fixes a major bug with accessing and providing hidden
-  services on Tor 0.2.1.3-alpha through 0.2.1.18.
-
-  o Major bugfixes:
-    - Make accessing hidden services on 0.2.1.x work right again.
-      Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and
-      part of patch provided by "optimist".
-
-  o Minor features:
-    - When a relay/bridge is writing out its identity key fingerprint to
-      the "fingerprint" file and to its logs, write it without spaces. Now
-      it will look like the fingerprints in our bridges documentation,
-      and confuse fewer users.
-
-  o Minor bugfixes:
-    - Relays no longer publish a new server descriptor if they change
-      their MaxAdvertisedBandwidth config option but it doesn't end up
-      changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc;
-      fixes bug 1026. Patch from Sebastian.
-    - Avoid leaking memory every time we get a create cell but we have
-      so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha;
-      fixes bug 1034. Reported by BarkerJr.
-
-
-Changes in version 0.2.1.18 - 2009-07-24
-  Tor 0.2.1.18 lays the foundations for performance improvements,
-  adds status events to help users diagnose bootstrap problems, adds
-  optional authentication/authorization for hidden services, fixes a
-  variety of potential anonymity problems, and includes a huge pile of
-  other features and bug fixes.
-
-  o Build fixes:
-    - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent.
-
-
-Changes in version 0.2.1.17-rc - 2009-07-07
-  Tor 0.2.1.17-rc marks the fourth -- and hopefully last -- release
-  candidate for the 0.2.1.x series. It lays the groundwork for further
-  client performance improvements, and also fixes a big bug with directory
-  authorities that were causing them to assign Guard and Stable flags
-  poorly.
-
-  The Windows bundles also finally include the geoip database that we
-  thought we'd been shipping since 0.2.0.x (oops), and the OS X bundles
-  should actually install Torbutton rather than giving you a cryptic
-  failure message (oops).
-
-  o Major features:
-    - Clients now use the bandwidth values in the consensus, rather than
-      the bandwidth values in each relay descriptor. This approach opens
-      the door to more accurate bandwidth estimates once the directory
-      authorities start doing active measurements. Implements more of
-      proposal 141.
-
-  o Major bugfixes:
-    - When Tor clients restart after 1-5 days, they discard all their
-      cached descriptors as too old, but they still use the cached
-      consensus document. This approach is good for robustness, but
-      bad for performance: since they don't know any bandwidths, they
-      end up choosing at random rather than weighting their choice by
-      speed. Fixed by the above feature of putting bandwidths in the
-      consensus. Bugfix on 0.2.0.x.
-    - Directory authorities were neglecting to mark relays down in their
-      internal histories if the relays fall off the routerlist without
-      ever being found unreachable. So there were relays in the histories
-      that haven't been seen for eight months, and are listed as being
-      up for eight months. This wreaked havoc on the "median wfu"
-      and "median mtbf" calculations, in turn making Guard and Stable
-      flags very wrong, hurting network performance. Fixes bugs 696 and
-      969. Bugfix on 0.2.0.6-alpha.
-
-  o Minor bugfixes:
-    - Serve the DirPortFrontPage page even when we have been approaching
-      our quotas recently. Fixes bug 1013; bugfix on 0.2.1.8-alpha.
-    - The control port would close the connection before flushing long
-      replies, such as the network consensus, if a QUIT command was issued
-      before the reply had completed. Now, the control port flushes all
-      pending replies before closing the connection. Also fixed a spurious
-      warning when a QUIT command is issued after a malformed or rejected
-      AUTHENTICATE command, but before the connection was closed. Patch
-      by Marcus Griep. Bugfix on 0.2.0.x; fixes bugs 1015 and 1016.
-    - When we can't find an intro key for a v2 hidden service descriptor,
-      fall back to the v0 hidden service descriptor and log a bug message.
-      Workaround for bug 1024.
-    - Fix a log message that did not respect the SafeLogging option.
-      Resolves bug 1027.
-
-  o Minor features:
-    - If we're a relay and we change our IP address, be more verbose
-      about the reason that made us change. Should help track down
-      further bugs for relays on dynamic IP addresses.
-
-
-Changes in version 0.2.0.35 - 2009-06-24
-  o Security fix:
-    - Avoid crashing in the presence of certain malformed descriptors.
-      Found by lark, and by automated fuzzing.
-    - Fix an edge case where a malicious exit relay could convince a
-      controller that the client's DNS question resolves to an internal IP
-      address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta.
-
-  o Major bugfixes:
-    - Finally fix the bug where dynamic-IP relays disappear when their
-      IP address changes: directory mirrors were mistakenly telling
-      them their old address if they asked via begin_dir, so they
-      never got an accurate answer about their new address, so they
-      just vanished after a day. For belt-and-suspenders, relays that
-      don't set Address in their config now avoid using begin_dir for
-      all direct connections. Should fix bugs 827, 883, and 900.
-    - Fix a timing-dependent, allocator-dependent, DNS-related crash bug
-      that would occur on some exit nodes when DNS failures and timeouts
-      occurred in certain patterns. Fix for bug 957.
-
-  o Minor bugfixes:
-    - When starting with a cache over a few days old, do not leak
-      memory for the obsolete router descriptors in it. Bugfix on
-      0.2.0.33; fixes bug 672.
-    - Hidden service clients didn't use a cached service descriptor that
-      was older than 15 minutes, but wouldn't fetch a new one either,
-      because there was already one in the cache. Now, fetch a v2
-      descriptor unless the same descriptor was added to the cache within
-      the last 15 minutes. Fixes bug 997; reported by Marcus Griep.
-
-
-Changes in version 0.2.1.16-rc - 2009-06-20
-  Tor 0.2.1.16-rc speeds up performance for fast exit relays, and fixes
-  a bunch of minor bugs.
-
-  o Security fixes:
-    - Fix an edge case where a malicious exit relay could convince a
-      controller that the client's DNS question resolves to an internal IP
-      address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta.
-
-  o Major performance improvements (on 0.2.0.x):
-    - Disable and refactor some debugging checks that forced a linear scan
-      over the whole server-side DNS cache. These accounted for over 50%
-      of CPU time on a relatively busy exit node's gprof profile. Found
-      by Jacob.
-    - Disable some debugging checks that appeared in exit node profile
-      data.
-
-  o Minor features:
-    - Update to the "June 3 2009" ip-to-country file.
-    - Do not have tor-resolve automatically refuse all .onion addresses;
-      if AutomapHostsOnResolve is set in your torrc, this will work fine.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - Log correct error messages for DNS-related network errors on
-      Windows.
-    - Fix a race condition that could cause crashes or memory corruption
-      when running as a server with a controller listening for log
-      messages.
-    - Avoid crashing when we have a policy specified in a DirPolicy or
-      SocksPolicy or ReachableAddresses option with ports set on it,
-      and we re-load the policy. May fix bug 996.
-    - Hidden service clients didn't use a cached service descriptor that
-      was older than 15 minutes, but wouldn't fetch a new one either,
-      because there was already one in the cache. Now, fetch a v2
-      descriptor unless the same descriptor was added to the cache within
-      the last 15 minutes. Fixes bug 997; reported by Marcus Griep.
-
-  o Minor bugfixes (on 0.2.1.x):
-    - Don't warn users about low port and hibernation mix when they
-      provide a *ListenAddress directive to fix that. Bugfix on
-      0.2.1.15-rc.
-    - When switching back and forth between bridge mode, do not start
-      gathering GeoIP data until two hours have passed.
-    - Do not complain that the user has requested an excluded node as
-      an exit when the node is not really an exit. This could happen
-      because the circuit was for testing, or an introduction point.
-      Fix for bug 984.
-
-
-Changes in version 0.2.1.15-rc - 2009-05-25
-  Tor 0.2.1.15-rc marks the second release candidate for the 0.2.1.x
-  series. It fixes a major bug on fast exit relays, as well as a variety
-  of more minor bugs.
-
-  o Major bugfixes (on 0.2.0.x):
-    - Fix a timing-dependent, allocator-dependent, DNS-related crash bug
-      that would occur on some exit nodes when DNS failures and timeouts
-      occurred in certain patterns. Fix for bug 957.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - Actually return -1 in the error case for read_bandwidth_usage().
-      Harmless bug, since we currently don't care about the return value
-      anywhere. Bugfix on 0.2.0.9-alpha.
-    - Provide a more useful log message if bug 977 (related to buffer
-      freelists) ever reappears, and do not crash right away.
-    - Fix an assertion failure on 64-bit platforms when we allocated
-      memory right up to the end of a memarea, then realigned the memory
-      one step beyond the end. Fixes a possible cause of bug 930.
-    - Protect the count of open sockets with a mutex, so we can't
-      corrupt it when two threads are closing or opening sockets at once.
-      Fix for bug 939. Bugfix on 0.2.0.1-alpha.
-    - Don't allow a bridge to publish its router descriptor to a
-      non-bridge directory authority. Fixes part of bug 932.
-    - When we change to or from being a bridge, reset our counts of
-      client usage by country. Fixes bug 932.
-    - Fix a bug that made stream bandwidth get misreported to the
-      controller.
-    - Stop using malloc_usable_size() to use more area than we had
-      actually allocated: it was safe, but made valgrind really unhappy.
-    - Fix a memory leak when v3 directory authorities load their keys
-      and cert from disk. Bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (on 0.2.1.x):
-    - Fix use of freed memory when deciding to mark a non-addable
-      descriptor as never-downloadable. Bugfix on 0.2.1.9-alpha.
-
-
-Changes in version 0.2.1.14-rc - 2009-04-12
-  Tor 0.2.1.14-rc marks the first release candidate for the 0.2.1.x
-  series. It begins fixing some major performance problems, and also
-  finally addresses the bug that was causing relays on dynamic IP
-  addresses to fall out of the directory.
-
-  o Major features:
-    - Clients replace entry guards that were chosen more than a few months
-      ago. This change should significantly improve client performance,
-      especially once more people upgrade, since relays that have been
-      a guard for a long time are currently overloaded.
-
-  o Major bugfixes (on 0.2.0):
-    - Finally fix the bug where dynamic-IP relays disappear when their
-      IP address changes: directory mirrors were mistakenly telling
-      them their old address if they asked via begin_dir, so they
-      never got an accurate answer about their new address, so they
-      just vanished after a day. For belt-and-suspenders, relays that
-      don't set Address in their config now avoid using begin_dir for
-      all direct connections. Should fix bugs 827, 883, and 900.
-    - Relays were falling out of the networkstatus consensus for
-      part of a day if they changed their local config but the
-      authorities discarded their new descriptor as "not sufficiently
-      different". Now directory authorities accept a descriptor as changed
-      if bandwidthrate or bandwidthburst changed. Partial fix for bug 962;
-      patch by Sebastian.
-    - Avoid crashing in the presence of certain malformed descriptors.
-      Found by lark, and by automated fuzzing.
-
-  o Minor features:
-    - When generating circuit events with verbose nicknames for
-      controllers, try harder to look up nicknames for routers on a
-      circuit. (Previously, we would look in the router descriptors we had
-      for nicknames, but not in the consensus.) Partial fix for bug 941.
-    - If the bridge config line doesn't specify a port, assume 443.
-      This makes bridge lines a bit smaller and easier for users to
-      understand.
-    - Raise the minimum bandwidth to be a relay from 20000 bytes to 20480
-      bytes (aka 20KB/s), to match our documentation. Also update
-      directory authorities so they always assign the Fast flag to relays
-      with 20KB/s of capacity. Now people running relays won't suddenly
-      find themselves not seeing any use, if the network gets faster
-      on average.
-    - Update to the "April 3 2009" ip-to-country file.
-
-  o Minor bugfixes:
-    - Avoid trying to print raw memory to the logs when we decide to
-      give up on downloading a given relay descriptor. Bugfix on
-      0.2.1.9-alpha.
-    - In tor-resolve, when the Tor client to use is specified by
-      :, actually use the specified port rather than
-      defaulting to 9050. Bugfix on 0.2.1.6-alpha.
-    - Make directory usage recording work again. Bugfix on 0.2.1.6-alpha.
-    - When starting with a cache over a few days old, do not leak
-      memory for the obsolete router descriptors in it. Bugfix on
-      0.2.0.33.
-    - Avoid double-free on list of successfully uploaded hidden
-      service discriptors. Fix for bug 948. Bugfix on 0.2.1.6-alpha.
-    - Change memarea_strndup() implementation to work even when
-      duplicating a string at the end of a page. This bug was
-      harmless for now, but could have meant crashes later. Fix by
-      lark. Bugfix on 0.2.1.1-alpha.
-    - Limit uploaded directory documents to be 16M rather than 500K.
-      The directory authorities were refusing v3 consensus votes from
-      other authorities, since the votes are now 504K. Fixes bug 959;
-      bugfix on 0.0.2pre17 (where we raised it from 50K to 500K ;).
-    - Directory authorities should never send a 503 "busy" response to
-      requests for votes or keys. Bugfix on 0.2.0.8-alpha; exposed by
-      bug 959.
-
-
-Changes in version 0.2.1.13-alpha - 2009-03-09
-  Tor 0.2.1.13-alpha includes another big pile of minor bugfixes and
-  cleanups. We're finally getting close to a release candidate.
-
-  o Major bugfixes:
-    - Correctly update the list of which countries we exclude as
-      exits, when the GeoIP file is loaded or reloaded. Diagnosed by
-      lark. Bugfix on 0.2.1.6-alpha.
-
-  o Minor bugfixes (on 0.2.0.x and earlier):
-    - Automatically detect MacOSX versions earlier than 10.4.0, and
-      disable kqueue from inside Tor when running with these versions.
-      We previously did this from the startup script, but that was no
-      help to people who didn't use the startup script. Resolves bug 863.
-    - When we had picked an exit node for a connection, but marked it as
-      "optional", and it turned out we had no onion key for the exit,
-      stop wanting that exit and try again. This situation may not
-      be possible now, but will probably become feasible with proposal
-      158. Spotted by rovv. Fixes another case of bug 752.
-    - Clients no longer cache certificates for authorities they do not
-      recognize. Bugfix on 0.2.0.9-alpha.
-    - When we can't transmit a DNS request due to a network error, retry
-      it after a while, and eventually transmit a failing response to
-      the RESOLVED cell. Bugfix on 0.1.2.5-alpha.
-    - If the controller claimed responsibility for a stream, but that
-      stream never finished making its connection, it would live
-      forever in circuit_wait state. Now we close it after SocksTimeout
-      seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry.
-    - Drop begin cells to a hidden service if they come from the middle
-      of a circuit. Patch from lark.
-    - When we erroneously receive two EXTEND cells for the same circuit
-      ID on the same connection, drop the second. Patch from lark.
-    - Fix a crash that occurs on exit nodes when a nameserver request
-      timed out. Bugfix on 0.1.2.1-alpha; our CLEAR debugging code had
-      been suppressing the bug since 0.1.2.10-alpha. Partial fix for
-      bug 929.
-    - Do not assume that a stack-allocated character array will be
-      64-bit aligned on platforms that demand that uint64_t access is
-      aligned. Possible fix for bug 604.
-    - Parse dates and IPv4 addresses in a locale- and libc-independent
-      manner, to avoid platform-dependent behavior on malformed input.
-    - Build correctly when configured to build outside the main source
-      path. Patch from Michael Gold.
-    - We were already rejecting relay begin cells with destination port
-      of 0. Now also reject extend cells with destination port or address
-      of 0. Suggested by lark.
-
-  o Minor bugfixes (on 0.2.1.x):
-    - Don't re-extend introduction circuits if we ran out of RELAY_EARLY
-      cells. Bugfix on 0.2.1.3-alpha. Fixes more of bug 878.
-    - If we're an exit node, scrub the IP address to which we are exiting
-      in the logs. Bugfix on 0.2.1.8-alpha.
-
-  o Minor features:
-    - On Linux, use the prctl call to re-enable core dumps when the user
-      is option is set.
-    - New controller event NEWCONSENSUS that lists the networkstatus
-      lines for every recommended relay. Now controllers like Torflow
-      can keep up-to-date on which relays they should be using.
-    - Update to the "February 26 2009" ip-to-country file.
-
-
-Changes in version 0.2.0.34 - 2009-02-08
-  Tor 0.2.0.34 features several more security-related fixes. You should
-  upgrade, especially if you run an exit relay (remote crash) or a
-  directory authority (remote infinite loop), or you're on an older
-  (pre-XP) or not-recently-patched Windows (remote exploit).
-
-  This release marks end-of-life for Tor 0.1.2.x. Those Tor versions
-  have many known flaws, and nobody should be using them. You should
-  upgrade. If you're using a Linux or BSD and its packages are obsolete,
-  stop using those packages and upgrade anyway.
-
-  o Security fixes:
-    - Fix an infinite-loop bug on handling corrupt votes under certain
-      circumstances. Bugfix on 0.2.0.8-alpha.
-    - Fix a temporary DoS vulnerability that could be performed by
-      a directory mirror. Bugfix on 0.2.0.9-alpha; reported by lark.
-    - Avoid a potential crash on exit nodes when processing malformed
-      input. Remote DoS opportunity. Bugfix on 0.2.0.33.
-    - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid.
-      Spec conformance issue. Bugfix on Tor 0.0.2pre27.
-
-  o Minor bugfixes:
-    - Fix compilation on systems where time_t is a 64-bit integer.
-      Patch from Matthias Drochner.
-    - Don't consider expiring already-closed client connections. Fixes
-      bug 893. Bugfix on 0.0.2pre20.
-
-
-Changes in version 0.2.1.12-alpha - 2009-02-08
-  Tor 0.2.1.12-alpha features several more security-related fixes. You
-  should upgrade, especially if you run an exit relay (remote crash) or
-  a directory authority (remote infinite loop), or you're on an older
-  (pre-XP) or not-recently-patched Windows (remote exploit). It also
-  includes a big pile of minor bugfixes and cleanups.
-
-  o Security fixes:
-    - Fix an infinite-loop bug on handling corrupt votes under certain
-      circumstances. Bugfix on 0.2.0.8-alpha.
-    - Fix a temporary DoS vulnerability that could be performed by
-      a directory mirror. Bugfix on 0.2.0.9-alpha; reported by lark.
-    - Avoid a potential crash on exit nodes when processing malformed
-      input. Remote DoS opportunity. Bugfix on 0.2.1.7-alpha.
-
-  o Minor bugfixes:
-    - Let controllers actually ask for the "clients_seen" event for
-      getting usage summaries on bridge relays. Bugfix on 0.2.1.10-alpha;
-      reported by Matt Edman.
-    - Fix a compile warning on OSX Panther. Fixes bug 913; bugfix against
-      0.2.1.11-alpha.
-    - Fix a bug in address parsing that was preventing bridges or hidden
-      service targets from being at IPv6 addresses.
-    - Solve a bug that kept hardware crypto acceleration from getting
-      enabled when accounting was turned on. Fixes bug 907. Bugfix on
-      0.0.9pre6.
-    - Remove a bash-ism from configure.in to build properly on non-Linux
-      platforms. Bugfix on 0.2.1.1-alpha.
-    - Fix code so authorities _actually_ send back X-Descriptor-Not-New
-      headers. Bugfix on 0.2.0.10-alpha.
-    - Don't consider expiring already-closed client connections. Fixes
-      bug 893. Bugfix on 0.0.2pre20.
-    - Fix another interesting corner-case of bug 891 spotted by rovv:
-      Previously, if two hosts had different amounts of clock drift, and
-      one of them created a new connection with just the wrong timing,
-      the other might decide to deprecate the new connection erroneously.
-      Bugfix on 0.1.1.13-alpha.
-    - Resolve a very rare crash bug that could occur when the user forced
-      a nameserver reconfiguration during the middle of a nameserver
-      probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha.
-    - Support changing value of ServerDNSRandomizeCase during SIGHUP.
-      Bugfix on 0.2.1.7-alpha.
-    - If we're using bridges and our network goes away, be more willing
-      to forgive our bridges and try again when we get an application
-      request. Bugfix on 0.2.0.x.
-
-  o Minor features:
-    - Support platforms where time_t is 64 bits long. (Congratulations,
-      NetBSD!) Patch from Matthias Drochner.
-    - Add a 'getinfo status/clients-seen' controller command, in case
-      controllers want to hear clients_seen events but connect late.
-
-  o Build changes:
-    - Disable GCC's strict alias optimization by default, to avoid the
-      likelihood of its introducing subtle bugs whenever our code violates
-      the letter of C99's alias rules.
-
-
-Changes in version 0.2.0.33 - 2009-01-21
-  Tor 0.2.0.33 fixes a variety of bugs that were making relays less
-  useful to users. It also finally fixes a bug where a relay or client
-  that's been off for many days would take a long time to bootstrap.
-
-  This update also fixes an important security-related bug reported by
-  Ilja van Sprundel. You should upgrade. (We'll send out more details
-  about the bug once people have had some time to upgrade.)
-
-  o Security fixes:
-    - Fix a heap-corruption bug that may be remotely triggerable on
-      some platforms. Reported by Ilja van Sprundel.
-
-  o Major bugfixes:
-    - When a stream at an exit relay is in state "resolving" or
-      "connecting" and it receives an "end" relay cell, the exit relay
-      would silently ignore the end cell and not close the stream. If
-      the client never closes the circuit, then the exit relay never
-      closes the TCP connection. Bug introduced in Tor 0.1.2.1-alpha;
-      reported by "wood".
-    - When sending CREATED cells back for a given circuit, use a 64-bit
-      connection ID to find the right connection, rather than an addr:port
-      combination. Now that we can have multiple OR connections between
-      the same ORs, it is no longer possible to use addr:port to uniquely
-      identify a connection.
-    - Bridge relays that had DirPort set to 0 would stop fetching
-      descriptors shortly after startup, and then briefly resume
-      after a new bandwidth test and/or after publishing a new bridge
-      descriptor. Bridge users that try to bootstrap from them would
-      get a recent networkstatus but would get descriptors from up to
-      18 hours earlier, meaning most of the descriptors were obsolete
-      already. Reported by Tas; bugfix on 0.2.0.13-alpha.
-    - Prevent bridge relays from serving their 'extrainfo' document
-      to anybody who asks, now that extrainfo docs include potentially
-      sensitive aggregated client geoip summaries. Bugfix on
-      0.2.0.13-alpha.
-    - If the cached networkstatus consensus is more than five days old,
-      discard it rather than trying to use it. In theory it could be
-      useful because it lists alternate directory mirrors, but in practice
-      it just means we spend many minutes trying directory mirrors that
-      are long gone from the network. Also discard router descriptors as
-      we load them if they are more than five days old, since the onion
-      key is probably wrong by now. Bugfix on 0.2.0.x. Fixes bug 887.
-
-  o Minor bugfixes:
-    - Do not mark smartlist_bsearch_idx() function as ATTR_PURE. This bug
-      could make gcc generate non-functional binary search code. Bugfix
-      on 0.2.0.10-alpha.
-    - Build correctly on platforms without socklen_t.
-    - Compile without warnings on solaris.
-    - Avoid potential crash on internal error during signature collection.
-      Fixes bug 864. Patch from rovv.
-    - Correct handling of possible malformed authority signing key
-      certificates with internal signature types. Fixes bug 880.
-      Bugfix on 0.2.0.3-alpha.
-    - Fix a hard-to-trigger resource leak when logging credential status.
-      CID 349.
-    - When we can't initialize DNS because the network is down, do not
-      automatically stop Tor from starting. Instead, we retry failed
-      dns_init() every 10 minutes, and change the exit policy to reject
-      *:* until one succeeds. Fixes bug 691.
-    - Use 64 bits instead of 32 bits for connection identifiers used with
-      the controller protocol, to greatly reduce risk of identifier reuse.
-    - When we're choosing an exit node for a circuit, and we have
-      no pending streams, choose a good general exit rather than one that
-      supports "all the pending streams". Bugfix on 0.1.1.x. Fix by rovv.
-    - Fix another case of assuming, when a specific exit is requested,
-      that we know more than the user about what hosts it allows.
-      Fixes one case of bug 752. Patch from rovv.
-    - Clip the MaxCircuitDirtiness config option to a minimum of 10
-      seconds. Warn the user if lower values are given in the
-      configuration. Bugfix on 0.1.0.1-rc. Patch by Sebastian.
-    - Clip the CircuitBuildTimeout to a minimum of 30 seconds. Warn the
-      user if lower values are given in the configuration. Bugfix on
-      0.1.1.17-rc. Patch by Sebastian.
-    - Fix a memory leak when we decline to add a v2 rendezvous descriptor to
-      the cache because we already had a v0 descriptor with the same ID.
-      Bugfix on 0.2.0.18-alpha.
-    - Fix a race condition when freeing keys shared between main thread
-      and CPU workers that could result in a memory leak. Bugfix on
-      0.1.0.1-rc. Fixes bug 889.
-    - Send a valid END cell back when a client tries to connect to a
-      nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug
-      840. Patch from rovv.
-    - Check which hops rendezvous stream cells are associated with to
-      prevent possible guess-the-streamid injection attacks from
-      intermediate hops. Fixes another case of bug 446. Based on patch
-      from rovv.
-    - If a broken client asks a non-exit router to connect somewhere,
-      do not even do the DNS lookup before rejecting the connection.
-      Fixes another case of bug 619. Patch from rovv.
-    - When a relay gets a create cell it can't decrypt (e.g. because it's
-      using the wrong onion key), we were dropping it and letting the
-      client time out. Now actually answer with a destroy cell. Fixes
-      bug 904. Bugfix on 0.0.2pre8.
-
-  o Minor bugfixes (hidden services):
-    - Do not throw away existing introduction points on SIGHUP. Bugfix on
-      0.0.6pre1. Patch by Karsten. Fixes bug 874.
-
-  o Minor features:
-    - Report the case where all signatures in a detached set are rejected
-      differently than the case where there is an error handling the
-      detached set.
-    - When we realize that another process has modified our cached
-      descriptors, print out a more useful error message rather than
-      triggering an assertion. Fixes bug 885. Patch from Karsten.
-    - Implement the 0x20 hack to better resist DNS poisoning: set the
-      case on outgoing DNS requests randomly, and reject responses that do
-      not match the case correctly. This logic can be disabled with the
-      ServerDNSRamdomizeCase setting, if you are using one of the 0.3%
-      of servers that do not reliably preserve case in replies. See
-      "Increased DNS Forgery Resistance through 0x20-Bit Encoding"
-      for more info.
-    - Check DNS replies for more matching fields to better resist DNS
-      poisoning.
-    - Never use OpenSSL compression: it wastes RAM and CPU trying to
-      compress cells, which are basically all encrypted, compressed, or
-      both.
-
-
-Changes in version 0.2.1.11-alpha - 2009-01-20
-  Tor 0.2.1.11-alpha finishes fixing the "if your Tor is off for a
-  week it will take a long time to bootstrap again" bug. It also fixes
-  an important security-related bug reported by Ilja van Sprundel. You
-  should upgrade. (We'll send out more details about the bug once people
-  have had some time to upgrade.)
-
-  o Security fixes:
-    - Fix a heap-corruption bug that may be remotely triggerable on
-      some platforms. Reported by Ilja van Sprundel.
-
-  o Major bugfixes:
-    - Discard router descriptors as we load them if they are more than
-      five days old. Otherwise if Tor is off for a long time and then
-      starts with cached descriptors, it will try to use the onion
-      keys in those obsolete descriptors when building circuits. Bugfix
-      on 0.2.0.x. Fixes bug 887.
-
-  o Minor features:
-    - Try to make sure that the version of Libevent we're running with
-      is binary-compatible with the one we built with. May address bug
-      897 and others.
-    - Make setting ServerDNSRandomizeCase to 0 actually work. Bugfix
-      for bug 905. Bugfix on 0.2.1.7-alpha.
-    - Add a new --enable-local-appdata configuration switch to change
-      the default location of the datadir on win32 from APPDATA to
-      LOCAL_APPDATA. In the future, we should migrate to LOCAL_APPDATA
-      entirely. Patch from coderman.
-
-  o Minor bugfixes:
-    - Make outbound DNS packets respect the OutboundBindAddress setting.
-      Fixes the bug part of bug 798. Bugfix on 0.1.2.2-alpha.
-    - When our circuit fails at the first hop (e.g. we get a destroy
-      cell back), avoid using that OR connection anymore, and also
-      tell all the one-hop directory requests waiting for it that they
-      should fail. Bugfix on 0.2.1.3-alpha.
-    - In the torify(1) manpage, mention that tsocks will leak your
-      DNS requests.
-
-
-Changes in version 0.2.1.10-alpha - 2009-01-06
-  Tor 0.2.1.10-alpha fixes two major bugs in bridge relays (one that
-  would make the bridge relay not so useful if it had DirPort set to 0,
-  and one that could let an attacker learn a little bit of information
-  about the bridge's users), and a bug that would cause your Tor relay
-  to ignore a circuit create request it can't decrypt (rather than reply
-  with an error). It also fixes a wide variety of other bugs.
-
-  o Major bugfixes:
-    - If the cached networkstatus consensus is more than five days old,
-      discard it rather than trying to use it. In theory it could
-      be useful because it lists alternate directory mirrors, but in
-      practice it just means we spend many minutes trying directory
-      mirrors that are long gone from the network. Helps bug 887 a bit;
-      bugfix on 0.2.0.x.
-    - Bridge relays that had DirPort set to 0 would stop fetching
-      descriptors shortly after startup, and then briefly resume
-      after a new bandwidth test and/or after publishing a new bridge
-      descriptor. Bridge users that try to bootstrap from them would
-      get a recent networkstatus but would get descriptors from up to
-      18 hours earlier, meaning most of the descriptors were obsolete
-      already. Reported by Tas; bugfix on 0.2.0.13-alpha.
-    - Prevent bridge relays from serving their 'extrainfo' document
-      to anybody who asks, now that extrainfo docs include potentially
-      sensitive aggregated client geoip summaries. Bugfix on
-      0.2.0.13-alpha.
-
-  o Minor features:
-    - New controller event "clients_seen" to report a geoip-based summary
-      of which countries we've seen clients from recently. Now controllers
-      like Vidalia can show bridge operators that they're actually making
-      a difference.
-    - Build correctly against versions of OpenSSL 0.9.8 or later built
-      without support for deprecated functions.
-    - Update to the "December 19 2008" ip-to-country file.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - Authorities now vote for the Stable flag for any router whose
-      weighted MTBF is at least 5 days, regardless of the mean MTBF.
-    - Do not remove routers as too old if we do not have any consensus
-      document. Bugfix on 0.2.0.7-alpha.
-    - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid.
-      Spec conformance issue. Bugfix on Tor 0.0.2pre27.
-    - When an exit relay resolves a stream address to a local IP address,
-      do not just keep retrying that same exit relay over and
-      over. Instead, just close the stream. Addresses bug 872. Bugfix
-      on 0.2.0.32. Patch from rovv.
-    - If a hidden service sends us an END cell, do not consider
-      retrying the connection; just close it. Patch from rovv.
-    - When we made bridge authorities stop serving bridge descriptors over
-      unencrypted links, we also broke DirPort reachability testing for
-      bridges. So bridges with a non-zero DirPort were printing spurious
-      warns to their logs. Bugfix on 0.2.0.16-alpha. Fixes bug 709.
-    - When a relay gets a create cell it can't decrypt (e.g. because it's
-      using the wrong onion key), we were dropping it and letting the
-      client time out. Now actually answer with a destroy cell. Fixes
-      bug 904. Bugfix on 0.0.2pre8.
-    - Squeeze 2-5% out of client performance (according to oprofile) by
-      improving the implementation of some policy-manipulation functions.
-
-  o Minor bugfixes (on 0.2.1.x):
-    - Make get_interface_address() function work properly again; stop
-      guessing the wrong parts of our address as our address.
-    - Do not cannibalize a circuit if we're out of RELAY_EARLY cells to
-      send on that circuit. Otherwise we might violate the proposal-110
-      limit. Bugfix on 0.2.1.3-alpha. Partial fix for bug 878. Diagnosis
-      thanks to Karsten.
-    - When we're sending non-EXTEND cells to the first hop in a circuit,
-      for example to use an encrypted directory connection, we don't need
-      to use RELAY_EARLY cells: the first hop knows what kind of cell
-      it is, and nobody else can even see the cell type. Conserving
-      RELAY_EARLY cells makes it easier to cannibalize circuits like
-      this later.
-    - Stop logging nameserver addresses in reverse order.
-    - If we are retrying a directory download slowly over and over, do
-      not automatically give up after the 254th failure. Bugfix on
-      0.2.1.9-alpha.
-    - Resume reporting accurate "stream end" reasons to the local control
-      port. They were lost in the changes for Proposal 148. Bugfix on
-      0.2.1.9-alpha.
-
-  o Deprecated and removed features:
-    - The old "tor --version --version" command, which would print out
-      the subversion "Id" of most of the source files, is now removed. It
-      turned out to be less useful than we'd expected, and harder to
-      maintain.
-
-  o Code simplifications and refactoring:
-    - Change our header file guard macros to be less likely to conflict
-      with system headers. Adam Langley noticed that we were conflicting
-      with log.h on Android.
-    - Tool-assisted documentation cleanup. Nearly every function or
-      static variable in Tor should have its own documentation now.
-
-
-Changes in version 0.2.1.9-alpha - 2008-12-25
-  Tor 0.2.1.9-alpha fixes many more bugs, some of them security-related.
-
-  o New directory authorities:
-    - gabelmoo (the authority run by Karsten Loesing) now has a new
-      IP address.
-
-  o Security fixes:
-    - Never use a connection with a mismatched address to extend a
-      circuit, unless that connection is canonical. A canonical
-      connection is one whose address is authenticated by the router's
-      identity key, either in a NETINFO cell or in a router descriptor.
-    - Avoid a possible memory corruption bug when receiving hidden service
-      descriptors. Bugfix on 0.2.1.6-alpha.
-
-  o Major bugfixes:
-    - Fix a logic error that would automatically reject all but the first
-      configured DNS server. Bugfix on 0.2.1.5-alpha. Possible fix for
-      part of bug 813/868. Bug spotted by coderman.
-    - When a stream at an exit relay is in state "resolving" or
-      "connecting" and it receives an "end" relay cell, the exit relay
-      would silently ignore the end cell and not close the stream. If
-      the client never closes the circuit, then the exit relay never
-      closes the TCP connection. Bug introduced in 0.1.2.1-alpha;
-      reported by "wood".
-    - When we can't initialize DNS because the network is down, do not
-      automatically stop Tor from starting. Instead, retry failed
-      dns_init() every 10 minutes, and change the exit policy to reject
-      *:* until one succeeds. Fixes bug 691.
-
-  o Minor features:
-    - Give a better error message when an overzealous init script says
-      "sudo -u username tor --user username". Makes Bug 882 easier for
-      users to diagnose.
-    - When a directory authority gives us a new guess for our IP address,
-      log which authority we used. Hopefully this will help us debug
-      the recent complaints about bad IP address guesses.
-    - Detect svn revision properly when we're using git-svn.
-    - Try not to open more than one descriptor-downloading connection
-      to an authority at once. This should reduce load on directory
-      authorities. Fixes bug 366.
-    - Add cross-certification to newly generated certificates, so that
-      a signing key is enough information to look up a certificate.
-      Partial implementation of proposal 157.
-    - Start serving certificates by 
-      pairs. Partial implementation of proposal 157.
-    - Clients now never report any stream end reason except 'MISC'.
-      Implements proposal 148.
-    - On platforms with a maximum syslog string length, truncate syslog
-      messages to that length ourselves, rather than relying on the
-      system to do it for us.
-    - Optimize out calls to time(NULL) that occur for every IO operation,
-      or for every cell. On systems where time() is a slow syscall,
-      this fix will be slightly helpful.
-    - Exit servers can now answer resolve requests for ip6.arpa addresses.
-    - When we download a descriptor that we then immediately (as
-      a directory authority) reject, do not retry downloading it right
-      away. Should save some bandwidth on authorities. Fix for bug
-      888. Patch by Sebastian Hahn.
-    - When a download gets us zero good descriptors, do not notify
-      Tor that new directory information has arrived.
-    - Avoid some nasty corner cases in the logic for marking connections
-      as too old or obsolete or noncanonical for circuits. Partial
-      bugfix on bug 891.
-
-  o Minor features (controller):
-    - New CONSENSUS_ARRIVED event to note when a new consensus has
-      been fetched and validated.
-    - When we realize that another process has modified our cached
-      descriptors file, print out a more useful error message rather
-      than triggering an assertion. Fixes bug 885. Patch from Karsten.
-    - Add an internal-use-only __ReloadTorrcOnSIGHUP option for
-      controllers to prevent SIGHUP from reloading the
-      configuration. Fixes bug 856.
-
-  o Minor bugfixes:
-    - Resume using the correct "REASON=" stream when telling the
-      controller why we closed a stream. Bugfix in 0.2.1.1-alpha.
-    - When a canonical connection appears later in our internal list
-      than a noncanonical one for a given OR ID, always use the
-      canonical one. Bugfix on 0.2.0.12-alpha. Fixes bug 805.
-      Spotted by rovv.
-    - Clip the MaxCircuitDirtiness config option to a minimum of 10
-      seconds. Warn the user if lower values are given in the
-      configuration. Bugfix on 0.1.0.1-rc. Patch by Sebastian.
-    - Clip the CircuitBuildTimeout to a minimum of 30 seconds. Warn the
-      user if lower values are given in the configuration. Bugfix on
-      0.1.1.17-rc. Patch by Sebastian.
-    - Fix a race condition when freeing keys shared between main thread
-      and CPU workers that could result in a memory leak. Bugfix on
-      0.1.0.1-rc. Fixes bug 889.
-
-  o Minor bugfixes (hidden services):
-    - Do not throw away existing introduction points on SIGHUP (bugfix on
-      0.0.6pre1); also, do not stall hidden services because we're
-      throwing away introduction points; bugfix on 0.2.1.7-alpha. Spotted
-      by John Brooks. Patch by Karsten. Fixes bug 874.
-    - Fix a memory leak when we decline to add a v2 rendezvous
-      descriptor to the cache because we already had a v0 descriptor
-      with the same ID. Bugfix on 0.2.0.18-alpha.
-
-  o Deprecated and removed features:
-    - RedirectExits has been removed. It was deprecated since
-      0.2.0.3-alpha.
-    - Finally remove deprecated "EXTENDED_FORMAT" controller feature. It
-      has been called EXTENDED_EVENTS since 0.1.2.4-alpha.
-    - Cell pools are now always enabled; --disable-cell-pools is ignored.
-
-  o Code simplifications and refactoring:
-    - Rename the confusing or_is_obsolete field to the more appropriate
-      is_bad_for_new_circs, and move it to or_connection_t where it
-      belongs.
-    - Move edge-only flags from connection_t to edge_connection_t: not
-      only is this better coding, but on machines of plausible alignment,
-      it should save 4-8 bytes per connection_t. "Every little bit helps."
-    - Rename ServerDNSAllowBrokenResolvConf to ServerDNSAllowBrokenConfig
-      for consistency; keep old option working for backward compatibility.
-    - Simplify the code for finding connections to use for a circuit.
-
-
-Changes in version 0.2.1.8-alpha - 2008-12-08
-  Tor 0.2.1.8-alpha fixes some crash bugs in earlier alpha releases,
-  builds better on unusual platforms like Solaris and old OS X, and
-  fixes a variety of other issues.
-
-  o Major features:
-    - New DirPortFrontPage option that takes an html file and publishes
-      it as "/" on the DirPort. Now relay operators can provide a
-      disclaimer without needing to set up a separate webserver. There's
-      a sample disclaimer in contrib/tor-exit-notice.html.
-
-  o Security fixes:
-    - When the client is choosing entry guards, now it selects at most
-      one guard from a given relay family. Otherwise we could end up with
-      all of our entry points into the network run by the same operator.
-      Suggested by Camilo Viecco. Fix on 0.1.1.11-alpha.
-
-  o Major bugfixes:
-    - Fix a DOS opportunity during the voting signature collection process
-      at directory authorities. Spotted by rovv. Bugfix on 0.2.0.x.
-    - Fix a possible segfault when establishing an exit connection. Bugfix
-      on 0.2.1.5-alpha.
-
-  o Minor bugfixes:
-    - Get file locking working on win32. Bugfix on 0.2.1.6-alpha. Fixes
-      bug 859.
-    - Made Tor a little less aggressive about deleting expired
-      certificates. Partial fix for bug 854.
-    - Stop doing unaligned memory access that generated bus errors on
-      sparc64. Bugfix on 0.2.0.10-alpha. Fix for bug 862.
-    - Fix a crash bug when changing EntryNodes from the controller. Bugfix
-      on 0.2.1.6-alpha. Fix for bug 867. Patched by Sebastian.
-    - Make USR2 log-level switch take effect immediately. Bugfix on
-      0.1.2.8-beta.
-    - If one win32 nameserver fails to get added, continue adding the
-      rest, and don't automatically fail.
-    - Use fcntl() for locking when flock() is not available. Should fix
-      compilation on Solaris. Should fix Bug 873. Bugfix on 0.2.1.6-alpha.
-    - Do not mark smartlist_bsearch_idx() function as ATTR_PURE. This bug
-      could make gcc generate non-functional binary search code. Bugfix
-      on 0.2.0.10-alpha.
-    - Build correctly on platforms without socklen_t.
-    - Avoid potential crash on internal error during signature collection.
-      Fixes bug 864. Patch from rovv.
-    - Do not use C's stdio library for writing to log files. This will
-      improve logging performance by a minute amount, and will stop
-      leaking fds when our disk is full. Fixes bug 861.
-    - Stop erroneous use of O_APPEND in cases where we did not in fact
-      want to re-seek to the end of a file before every last write().
-    - Correct handling of possible malformed authority signing key
-      certificates with internal signature types. Fixes bug 880. Bugfix
-      on 0.2.0.3-alpha.
-    - Fix a hard-to-trigger resource leak when logging credential status.
-      CID 349.
-
-  o Minor features:
-    - Directory mirrors no longer fetch the v1 directory or
-      running-routers files. They are obsolete, and nobody asks for them
-      anymore. This is the first step to making v1 authorities obsolete.
-
-  o Minor features (controller):
-    - Return circuit purposes in response to GETINFO circuit-status. Fixes
-      bug 858.
-
-
-Changes in version 0.2.0.32 - 2008-11-20
-  Tor 0.2.0.32 fixes a major security problem in Debian and Ubuntu
-  packages (and maybe other packages) noticed by Theo de Raadt, fixes
-  a smaller security flaw that might allow an attacker to access local
-  services, further improves hidden service performance, and fixes a
-  variety of other issues.
-
-  o Security fixes:
-    - The "User" and "Group" config options did not clear the
-      supplementary group entries for the Tor process. The "User" option
-      is now more robust, and we now set the groups to the specified
-      user's primary group. The "Group" option is now ignored. For more
-      detailed logging on credential switching, set CREDENTIAL_LOG_LEVEL
-      in common/compat.c to LOG_NOTICE or higher. Patch by Jacob Appelbaum
-      and Steven Murdoch. Bugfix on 0.0.2pre14. Fixes bug 848 and 857.
-    - The "ClientDNSRejectInternalAddresses" config option wasn't being
-      consistently obeyed: if an exit relay refuses a stream because its
-      exit policy doesn't allow it, we would remember what IP address
-      the relay said the destination address resolves to, even if it's
-      an internal IP address. Bugfix on 0.2.0.7-alpha; patch by rovv.
-
-  o Major bugfixes:
-    - Fix a DOS opportunity during the voting signature collection process
-      at directory authorities. Spotted by rovv. Bugfix on 0.2.0.x.
-
-  o Major bugfixes (hidden services):
-    - When fetching v0 and v2 rendezvous service descriptors in parallel,
-      we were failing the whole hidden service request when the v0
-      descriptor fetch fails, even if the v2 fetch is still pending and
-      might succeed. Similarly, if the last v2 fetch fails, we were
-      failing the whole hidden service request even if a v0 fetch is
-      still pending. Fixes bug 814. Bugfix on 0.2.0.10-alpha.
-    - When extending a circuit to a hidden service directory to upload a
-      rendezvous descriptor using a BEGIN_DIR cell, almost 1/6 of all
-      requests failed, because the router descriptor has not been
-      downloaded yet. In these cases, do not attempt to upload the
-      rendezvous descriptor, but wait until the router descriptor is
-      downloaded and retry. Likewise, do not attempt to fetch a rendezvous
-      descriptor from a hidden service directory for which the router
-      descriptor has not yet been downloaded. Fixes bug 767. Bugfix
-      on 0.2.0.10-alpha.
-
-  o Minor bugfixes:
-    - Fix several infrequent memory leaks spotted by Coverity.
-    - When testing for libevent functions, set the LDFLAGS variable
-      correctly. Found by Riastradh.
-    - Avoid a bug where the FastFirstHopPK 0 option would keep Tor from
-      bootstrapping with tunneled directory connections. Bugfix on
-      0.1.2.5-alpha. Fixes bug 797. Found by Erwin Lam.
-    - When asked to connect to A.B.exit:80, if we don't know the IP for A
-      and we know that server B rejects most-but-not all connections to
-      port 80, we would previously reject the connection. Now, we assume
-      the user knows what they were asking for. Fixes bug 752. Bugfix
-      on 0.0.9rc5. Diagnosed by BarkerJr.
-    - If we overrun our per-second write limits a little, count this as
-      having used up our write allocation for the second, and choke
-      outgoing directory writes. Previously, we had only counted this when
-      we had met our limits precisely. Fixes bug 824. Patch from by rovv.
-      Bugfix on 0.2.0.x (??).
-    - Remove the old v2 directory authority 'lefkada' from the default
-      list. It has been gone for many months.
-    - Stop doing unaligned memory access that generated bus errors on
-      sparc64. Bugfix on 0.2.0.10-alpha. Fixes bug 862.
-    - Make USR2 log-level switch take effect immediately. Bugfix on
-      0.1.2.8-beta.
-
-  o Minor bugfixes (controller):
-    - Make DNS resolved events into "CLOSED", not "FAILED". Bugfix on
-      0.1.2.5-alpha. Fix by Robert Hogan. Resolves bug 807.
-
-
-Changes in version 0.2.1.7-alpha - 2008-11-08
-  Tor 0.2.1.7-alpha fixes a major security problem in Debian and Ubuntu
-  packages (and maybe other packages) noticed by Theo de Raadt, fixes
-  a smaller security flaw that might allow an attacker to access local
-  services, adds better defense against DNS poisoning attacks on exit
-  relays, further improves hidden service performance, and fixes a
-  variety of other issues.
-
-  o Security fixes:
-    - The "ClientDNSRejectInternalAddresses" config option wasn't being
-      consistently obeyed: if an exit relay refuses a stream because its
-      exit policy doesn't allow it, we would remember what IP address
-      the relay said the destination address resolves to, even if it's
-      an internal IP address. Bugfix on 0.2.0.7-alpha; patch by rovv.
-    - The "User" and "Group" config options did not clear the
-      supplementary group entries for the Tor process. The "User" option
-      is now more robust, and we now set the groups to the specified
-      user's primary group. The "Group" option is now ignored. For more
-      detailed logging on credential switching, set CREDENTIAL_LOG_LEVEL
-      in common/compat.c to LOG_NOTICE or higher. Patch by Jacob Appelbaum
-      and Steven Murdoch. Bugfix on 0.0.2pre14. Fixes bug 848.
-    - Do not use or believe expired v3 authority certificates. Patch
-      from Karsten. Bugfix in 0.2.0.x. Fixes bug 851.
-
-  o Minor features:
-    - Now NodeFamily and MyFamily config options allow spaces in
-      identity fingerprints, so it's easier to paste them in.
-      Suggested by Lucky Green.
-    - Implement the 0x20 hack to better resist DNS poisoning: set the
-      case on outgoing DNS requests randomly, and reject responses that do
-      not match the case correctly. This logic can be disabled with the
-      ServerDNSRandomizeCase setting, if you are using one of the 0.3%
-      of servers that do not reliably preserve case in replies. See
-      "Increased DNS Forgery Resistance through 0x20-Bit Encoding"
-      for more info.
-    - Preserve case in replies to DNSPort requests in order to support
-      the 0x20 hack for resisting DNS poisoning attacks.
-
-  o Hidden service performance improvements:
-    - When the client launches an introduction circuit, retry with a
-      new circuit after 30 seconds rather than 60 seconds.
-    - Launch a second client-side introduction circuit in parallel
-      after a delay of 15 seconds (based on work by Christian Wilms).
-    - Hidden services start out building five intro circuits rather
-      than three, and when the first three finish they publish a service
-      descriptor using those. Now we publish our service descriptor much
-      faster after restart.
-
-  o Minor bugfixes:
-    - Minor fix in the warning messages when you're having problems
-      bootstrapping; also, be more forgiving of bootstrap problems when
-      we're still making incremental progress on a given bootstrap phase.
-    - When we're choosing an exit node for a circuit, and we have
-      no pending streams, choose a good general exit rather than one that
-      supports "all the pending streams". Bugfix on 0.1.1.x. Fix by rovv.
-    - Send a valid END cell back when a client tries to connect to a
-      nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug
-      840. Patch from rovv.
-    - If a broken client asks a non-exit router to connect somewhere,
-      do not even do the DNS lookup before rejecting the connection.
-      Fixes another case of bug 619. Patch from rovv.
-    - Fix another case of assuming, when a specific exit is requested,
-      that we know more than the user about what hosts it allows.
-      Fixes another case of bug 752. Patch from rovv.
-    - Check which hops rendezvous stream cells are associated with to
-      prevent possible guess-the-streamid injection attacks from
-      intermediate hops. Fixes another case of bug 446. Based on patch
-      from rovv.
-    - Avoid using a negative right-shift when comparing 32-bit
-      addresses. Possible fix for bug 845 and bug 811.
-    - Make the assert_circuit_ok() function work correctly on circuits that
-      have already been marked for close.
-    - Fix read-off-the-end-of-string error in unit tests when decoding
-      introduction points.
-    - Fix uninitialized size field for memory area allocation: may improve
-      memory performance during directory parsing.
-    - Treat duplicate certificate fetches as failures, so that we do
-      not try to re-fetch an expired certificate over and over and over.
-    - Do not say we're fetching a certificate when we'll in fact skip it
-      because of a pending download.
-
-
-Changes in version 0.2.1.6-alpha - 2008-09-30
-  Tor 0.2.1.6-alpha further improves performance and robustness of
-  hidden services, starts work on supporting per-country relay selection,
-  and fixes a variety of smaller issues.
-
-  o Major features:
-    - Implement proposal 121: make it possible to build hidden services
-      that only certain clients are allowed to connect to. This is
-      enforced at several points, so that unauthorized clients are unable
-      to send INTRODUCE cells to the service, or even (depending on the
-      type of authentication) to learn introduction points. This feature
-      raises the bar for certain kinds of active attacks against hidden
-      services. Code by Karsten Loesing.
-    - Relays now store and serve v2 hidden service descriptors by default,
-      i.e., the new default value for HidServDirectoryV2 is 1. This is
-      the last step in proposal 114, which aims to make hidden service
-      lookups more reliable.
-    - Start work to allow node restrictions to include country codes. The
-      syntax to exclude nodes in a country with country code XX is
-      "ExcludeNodes {XX}". Patch from Robert Hogan. It still needs some
-      refinement to decide what config options should take priority if
-      you ask to both use a particular node and exclude it.
-    - Allow ExitNodes list to include IP ranges and country codes, just
-      like the Exclude*Nodes lists. Patch from Robert Hogan.
-
-  o Major bugfixes:
-    - Fix a bug when parsing ports in tor_addr_port_parse() that caused
-      Tor to fail to start if you had it configured to use a bridge
-      relay. Fixes bug 809. Bugfix on 0.2.1.5-alpha.
-    - When extending a circuit to a hidden service directory to upload a
-      rendezvous descriptor using a BEGIN_DIR cell, almost 1/6 of all
-      requests failed, because the router descriptor had not been
-      downloaded yet. In these cases, we now wait until the router
-      descriptor is downloaded, and then retry. Likewise, clients
-      now skip over a hidden service directory if they don't yet have
-      its router descriptor, rather than futilely requesting it and
-      putting mysterious complaints in the logs. Fixes bug 767. Bugfix
-      on 0.2.0.10-alpha.
-    - When fetching v0 and v2 rendezvous service descriptors in parallel,
-      we were failing the whole hidden service request when the v0
-      descriptor fetch fails, even if the v2 fetch is still pending and
-      might succeed. Similarly, if the last v2 fetch fails, we were
-      failing the whole hidden service request even if a v0 fetch is
-      still pending. Fixes bug 814. Bugfix on 0.2.0.10-alpha.
-    - DNS replies need to have names matching their requests, but
-      these names should be in the questions section, not necessarily
-      in the answers section. Fixes bug 823. Bugfix on 0.2.1.5-alpha.
-
-  o Minor features:
-    - Update to the "September 1 2008" ip-to-country file.
-    - Allow ports 465 and 587 in the default exit policy again. We had
-      rejected them in 0.1.0.15, because back in 2005 they were commonly
-      misconfigured and ended up as spam targets. We hear they are better
-      locked down these days.
-    - Use a lockfile to make sure that two Tor processes are not
-      simultaneously running with the same datadir.
-    - Serve the latest v3 networkstatus consensus via the control
-      port. Use "getinfo dir/status-vote/current/consensus" to fetch it.
-    - Better logging about stability/reliability calculations on directory
-      servers.
-    - Drop the requirement to have an open dir port for storing and
-      serving v2 hidden service descriptors.
-    - Directory authorities now serve a /tor/dbg-stability.txt URL to
-      help debug WFU and MTBF calculations.
-    - Implement most of Proposal 152: allow specialized servers to permit
-      single-hop circuits, and clients to use those servers to build
-      single-hop circuits when using a specialized controller. Patch
-      from Josh Albrecht. Resolves feature request 768.
-    - Add a -p option to tor-resolve for specifying the SOCKS port: some
-      people find host:port too confusing.
-    - Make TrackHostExit mappings expire a while after their last use, not
-      after their creation. Patch from Robert Hogan.
-    - Provide circuit purposes along with circuit events to the controller.
-
-  o Minor bugfixes:
-    - Fix compile on OpenBSD 4.4-current. Bugfix on 0.2.1.5-alpha.
-      Reported by Tas.
-    - Fixed some memory leaks -- some quite frequent, some almost
-      impossible to trigger -- based on results from Coverity.
-    - When testing for libevent functions, set the LDFLAGS variable
-      correctly. Found by Riastradh.
-    - Fix an assertion bug in parsing policy-related options; possible fix
-      for bug 811.
-    - Catch and report a few more bootstrapping failure cases when Tor
-      fails to establish a TCP connection. Cleanup on 0.2.1.x.
-    - Avoid a bug where the FastFirstHopPK 0 option would keep Tor from
-      bootstrapping with tunneled directory connections. Bugfix on
-      0.1.2.5-alpha. Fixes bug 797. Found by Erwin Lam.
-    - When asked to connect to A.B.exit:80, if we don't know the IP for A
-      and we know that server B rejects most-but-not all connections to
-      port 80, we would previously reject the connection. Now, we assume
-      the user knows what they were asking for. Fixes bug 752. Bugfix
-      on 0.0.9rc5. Diagnosed by BarkerJr.
-    - If we are not using BEGIN_DIR cells, don't attempt to contact hidden
-      service directories if they have no advertised dir port. Bugfix
-      on 0.2.0.10-alpha.
-    - If we overrun our per-second write limits a little, count this as
-      having used up our write allocation for the second, and choke
-      outgoing directory writes. Previously, we had only counted this when
-      we had met our limits precisely. Fixes bug 824. Patch by rovv.
-      Bugfix on 0.2.0.x (??).
-    - Avoid a "0 divided by 0" calculation when calculating router uptime
-      at directory authorities. Bugfix on 0.2.0.8-alpha.
-    - Make DNS resolved controller events into "CLOSED", not
-      "FAILED". Bugfix on 0.1.2.5-alpha. Fix by Robert Hogan. Resolves
-      bug 807.
-    - Fix a bug where an unreachable relay would establish enough
-      reachability testing circuits to do a bandwidth test -- if
-      we already have a connection to the middle hop of the testing
-      circuit, then it could establish the last hop by using the existing
-      connection. Bugfix on 0.1.2.2-alpha, exposed when we made testing
-      circuits no longer use entry guards in 0.2.1.3-alpha.
-    - If we have correct permissions on $datadir, we complain to stdout
-      and fail to start. But dangerous permissions on
-      $datadir/cached-status/ would cause us to open a log and complain
-      there. Now complain to stdout and fail to start in both cases. Fixes
-      bug 820, reported by seeess.
-    - Remove the old v2 directory authority 'lefkada' from the default
-      list. It has been gone for many months.
-
-  o Code simplifications and refactoring:
-    - Revise the connection_new functions so that a more typesafe variant
-      exists. This will work better with Coverity, and let us find any
-      actual mistakes we're making here.
-    - Refactor unit testing logic so that dmalloc can be used sensibly
-      with unit tests to check for memory leaks.
-    - Move all hidden-service related fields from connection and circuit
-      structure to substructures: this way they won't eat so much memory.
-
-
-Changes in version 0.2.0.31 - 2008-09-03
-  Tor 0.2.0.31 addresses two potential anonymity issues, starts to fix
-  a big bug we're seeing where in rare cases traffic from one Tor stream
-  gets mixed into another stream, and fixes a variety of smaller issues.
-
-  o Major bugfixes:
-    - Make sure that two circuits can never exist on the same connection
-      with the same circuit ID, even if one is marked for close. This
-      is conceivably a bugfix for bug 779. Bugfix on 0.1.0.4-rc.
-    - Relays now reject risky extend cells: if the extend cell includes
-      a digest of all zeroes, or asks to extend back to the relay that
-      sent the extend cell, tear down the circuit. Ideas suggested
-      by rovv.
-    - If not enough of our entry guards are available so we add a new
-      one, we might use the new one even if it overlapped with the
-      current circuit's exit relay (or its family). Anonymity bugfix
-      pointed out by rovv.
-
-  o Minor bugfixes:
-    - Recover 3-7 bytes that were wasted per memory chunk. Fixes bug
-      794; bug spotted by rovv. Bugfix on 0.2.0.1-alpha.
-    - Correctly detect the presence of the linux/netfilter_ipv4.h header
-      when building against recent kernels. Bugfix on 0.1.2.1-alpha.
-    - Pick size of default geoip filename string correctly on windows.
-      Fixes bug 806. Bugfix on 0.2.0.30.
-    - Make the autoconf script accept the obsolete --with-ssl-dir
-      option as an alias for the actually-working --with-openssl-dir
-      option. Fix the help documentation to recommend --with-openssl-dir.
-      Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha.
-    - When using the TransPort option on OpenBSD, and using the User
-      option to change UID and drop privileges, make sure to open
-      /dev/pf before dropping privileges. Fixes bug 782. Patch from
-      Christopher Davis. Bugfix on 0.1.2.1-alpha.
-    - Try to attach connections immediately upon receiving a RENDEZVOUS2
-      or RENDEZVOUS_ESTABLISHED cell. This can save a second or two
-      on the client side when connecting to a hidden service. Bugfix
-      on 0.0.6pre1. Found and fixed by Christian Wilms; resolves bug 743.
-    - When closing an application-side connection because its circuit is
-      getting torn down, generate the stream event correctly. Bugfix on
-      0.1.2.x. Anonymous patch.
-
-
-Changes in version 0.2.1.5-alpha - 2008-08-31
-  Tor 0.2.1.5-alpha moves us closer to handling IPv6 destinations, puts
-  in a lot of the infrastructure for adding authorization to hidden
-  services, lays the groundwork for having clients read their load
-  balancing information out of the networkstatus consensus rather than
-  the individual router descriptors, addresses two potential anonymity
-  issues, and fixes a variety of smaller issues.
-
-  o Major features:
-    - Convert many internal address representations to optionally hold
-      IPv6 addresses.
-    - Generate and accept IPv6 addresses in many protocol elements.
-    - Make resolver code handle nameservers located at ipv6 addresses.
-    - Begin implementation of proposal 121 ("Client authorization for
-      hidden services"): configure hidden services with client
-      authorization, publish descriptors for them, and configure
-      authorization data for hidden services at clients. The next
-      step is to actually access hidden services that perform client
-      authorization.
-    - More progress toward proposal 141: Network status consensus
-      documents and votes now contain bandwidth information for each
-      router and a summary of that router's exit policy. Eventually this
-      will be used by clients so that they do not have to download every
-      known descriptor before building circuits.
-
-  o Major bugfixes (on 0.2.0.x and before):
-    - When sending CREATED cells back for a given circuit, use a 64-bit
-      connection ID to find the right connection, rather than an addr:port
-      combination. Now that we can have multiple OR connections between
-      the same ORs, it is no longer possible to use addr:port to uniquely
-      identify a connection.
-    - Relays now reject risky extend cells: if the extend cell includes
-      a digest of all zeroes, or asks to extend back to the relay that
-      sent the extend cell, tear down the circuit. Ideas suggested
-      by rovv.
-    - If not enough of our entry guards are available so we add a new
-      one, we might use the new one even if it overlapped with the
-      current circuit's exit relay (or its family). Anonymity bugfix
-      pointed out by rovv.
-
-  o Minor bugfixes:
-    - Recover 3-7 bytes that were wasted per memory chunk. Fixes bug
-      794; bug spotted by rovv. Bugfix on 0.2.0.1-alpha.
-    - When using the TransPort option on OpenBSD, and using the User
-      option to change UID and drop privileges, make sure to open /dev/pf
-      before dropping privileges. Fixes bug 782. Patch from Christopher
-      Davis. Bugfix on 0.1.2.1-alpha.
-    - Correctly detect the presence of the linux/netfilter_ipv4.h header
-      when building against recent kernels. Bugfix on 0.1.2.1-alpha.
-    - Add a missing safe_str() call for a debug log message.
-    - Use 64 bits instead of 32 bits for connection identifiers used with
-      the controller protocol, to greatly reduce risk of identifier reuse.
-    - Make the autoconf script accept the obsolete --with-ssl-dir
-      option as an alias for the actually-working --with-openssl-dir
-      option. Fix the help documentation to recommend --with-openssl-dir.
-      Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha.
-
-  o Minor features:
-    - Rate-limit too-many-sockets messages: when they happen, they happen
-      a lot. Resolves bug 748.
-    - Resist DNS poisoning a little better by making sure that names in
-      answer sections match.
-    - Print the SOCKS5 error message string as well as the error code
-      when a tor-resolve request fails. Patch from Jacob.
-
-
-Changes in version 0.2.1.4-alpha - 2008-08-04
-  Tor 0.2.1.4-alpha fixes a pair of crash bugs in 0.2.1.3-alpha.
-
-  o Major bugfixes:
-    - The address part of exit policies was not correctly written
-      to router descriptors. This generated router descriptors that failed
-      their self-checks. Noticed by phobos, fixed by Karsten. Bugfix
-      on 0.2.1.3-alpha.
-    - Tor triggered a false assert when extending a circuit to a relay
-      but we already have a connection open to that relay. Noticed by
-      phobos, fixed by Karsten. Bugfix on 0.2.1.3-alpha.
-
-  o Minor bugfixes:
-    - Fix a hidden service logging bug: in some edge cases, the router
-      descriptor of a previously picked introduction point becomes
-      obsolete and we need to give up on it rather than continually
-      complaining that it has become obsolete. Observed by xiando. Bugfix
-      on 0.2.1.3-alpha.
-
-  o Removed features:
-    - Take out the TestVia config option, since it was a workaround for
-      a bug that was fixed in Tor 0.1.1.21.
-
-
-Changes in version 0.2.1.3-alpha - 2008-08-03
-  Tor 0.2.1.3-alpha implements most of the pieces to prevent
-  infinite-length circuit attacks (see proposal 110); fixes a bug that
-  might cause exit relays to corrupt streams they send back; allows
-  address patterns (e.g. 255.128.0.0/16) to appear in ExcludeNodes and
-  ExcludeExitNodes config options; and fixes a big pile of bugs.
-
-  o Bootstrapping bugfixes (on 0.2.1.x-alpha):
-    - Send a bootstrap problem "warn" event on the first problem if the
-      reason is NO_ROUTE (that is, our network is down).
-
-  o Major features:
-    - Implement most of proposal 110: The first K cells to be sent
-      along a circuit are marked as special "early" cells; only K "early"
-      cells will be allowed. Once this code is universal, we can block
-      certain kinds of DOS attack by requiring that EXTEND commands must
-      be sent using an "early" cell.
-
-  o Major bugfixes:
-    - Try to attach connections immediately upon receiving a RENDEZVOUS2
-      or RENDEZVOUS_ESTABLISHED cell. This can save a second or two
-      on the client side when connecting to a hidden service. Bugfix
-      on 0.0.6pre1. Found and fixed by Christian Wilms; resolves bug 743.
-    - Ensure that two circuits can never exist on the same connection
-      with the same circuit ID, even if one is marked for close. This
-      is conceivably a bugfix for bug 779; fixes a bug on 0.1.0.4-rc.
-
-  o Minor features:
-    - When relays do their initial bandwidth measurement, don't limit
-      to just our entry guards for the test circuits. Otherwise we tend
-      to have multiple test circuits going through a single entry guard,
-      which makes our bandwidth test less accurate. Fixes part of bug 654;
-      patch contributed by Josh Albrecht.
-    - Add an ExcludeExitNodes option so users can list a set of nodes
-      that should be be excluded from the exit node position, but
-      allowed elsewhere. Implements proposal 151.
-    - Allow address patterns (e.g., 255.128.0.0/16) to appear in
-      ExcludeNodes and ExcludeExitNodes lists.
-    - Change the implementation of ExcludeNodes and ExcludeExitNodes to
-      be more efficient. Formerly it was quadratic in the number of
-      servers; now it should be linear. Fixes bug 509.
-    - Save 16-22 bytes per open circuit by moving the n_addr, n_port,
-      and n_conn_id_digest fields into a separate structure that's
-      only needed when the circuit has not yet attached to an n_conn.
-
-  o Minor bugfixes:
-    - Change the contrib/tor.logrotate script so it makes the new
-      logs as "_tor:_tor" rather than the default, which is generally
-      "root:wheel". Fixes bug 676, reported by Serge Koksharov.
-    - Stop using __attribute__((nonnull)) with GCC: it can give us useful
-      warnings (occasionally), but it can also cause the compiler to
-      eliminate error-checking code. Suggested by Peter Gutmann.
-    - When a hidden service is giving up on an introduction point candidate
-      that was not included in the last published rendezvous descriptor,
-      don't reschedule publication of the next descriptor. Fixes bug 763.
-      Bugfix on 0.0.9.3.
-    - Mark RendNodes, RendExcludeNodes, HiddenServiceNodes, and
-      HiddenServiceExcludeNodes as obsolete: they never worked properly,
-      and nobody claims to be using them. Fixes bug 754. Bugfix on
-      0.1.0.1-rc. Patch from Christian Wilms.
-    - Fix a small alignment and memory-wasting bug on buffer chunks.
-      Spotted by rovv.
-
-  o Minor bugfixes (controller):
-    - When closing an application-side connection because its circuit
-      is getting torn down, generate the stream event correctly.
-      Bugfix on 0.1.2.x. Anonymous patch.
-
-  o Removed features:
-    - Remove all backward-compatibility code to support relays running
-      versions of Tor so old that they no longer work at all on the
-      Tor network.
-
-
-Changes in version 0.2.0.30 - 2008-07-15
-  o Minor bugfixes:
-    - Stop using __attribute__((nonnull)) with GCC: it can give us useful
-      warnings (occasionally), but it can also cause the compiler to
-      eliminate error-checking code. Suggested by Peter Gutmann.
-
-
-Changes in version 0.2.0.29-rc - 2008-07-08
-  Tor 0.2.0.29-rc fixes two big bugs with using bridges, fixes more
-  hidden-service performance bugs, and fixes a bunch of smaller bugs.
-
-  o Major bugfixes:
-    - If you have more than one bridge but don't know their keys,
-      you would only launch a request for the descriptor of the first one
-      on your list. (Tor considered launching requests for the others, but
-      found that it already had a connection on the way for $0000...0000
-      so it didn't open another.) Bugfix on 0.2.0.x.
-    - If you have more than one bridge but don't know their keys, and the
-      connection to one of the bridges failed, you would cancel all
-      pending bridge connections. (After all, they all have the same
-      digest.) Bugfix on 0.2.0.x.
-    - When a hidden service was trying to establish an introduction point,
-      and Tor had built circuits preemptively for such purposes, we
-      were ignoring all the preemptive circuits and launching a new one
-      instead. Bugfix on 0.2.0.14-alpha.
-    - When a hidden service was trying to establish an introduction point,
-      and Tor *did* manage to reuse one of the preemptively built
-      circuits, it didn't correctly remember which one it used,
-      so it asked for another one soon after, until there were no
-      more preemptive circuits, at which point it launched one from
-      scratch. Bugfix on 0.0.9.x.
-    - Make directory servers include the X-Your-Address-Is: http header in
-      their responses even for begin_dir conns. Now clients who only
-      ever use begin_dir connections still have a way to learn their IP
-      address. Fixes bug 737; bugfix on 0.2.0.22-rc. Reported by goldy.
-
-  o Minor bugfixes:
-    - Fix a macro/CPP interaction that was confusing some compilers:
-      some GCCs don't like #if/#endif pairs inside macro arguments.
-      Fixes bug 707.
-    - Fix macro collision between OpenSSL 0.9.8h and Windows headers.
-      Fixes bug 704; fix from Steven Murdoch.
-    - When opening /dev/null in finish_daemonize(), do not pass the
-      O_CREAT flag. Fortify was complaining, and correctly so. Fixes
-      bug 742; fix from Michael Scherer. Bugfix on 0.0.2pre19.
-    - Correctly detect transparent proxy support on Linux hosts that
-      require in.h to be included before netfilter_ipv4.h. Patch
-      from coderman.
-    - Disallow session resumption attempts during the renegotiation
-      stage of the v2 handshake protocol. Clients should never be trying
-      session resumption at this point, but apparently some did, in
-      ways that caused the handshake to fail. Bugfix on 0.2.0.20-rc. Bug
-      found by Geoff Goodell.
-
-
-Changes in version 0.2.1.2-alpha - 2008-06-20
-  Tor 0.2.1.2-alpha includes a new "TestingTorNetwork" config option to
-  make it easier to set up your own private Tor network; fixes several
-  big bugs with using more than one bridge relay; fixes a big bug with
-  offering hidden services quickly after Tor starts; and uses a better
-  API for reporting potential bootstrapping problems to the controller.
-
-  o Major features:
-    - New TestingTorNetwork config option to allow adjustment of
-      previously constant values that, while reasonable, could slow
-      bootstrapping. Implements proposal 135. Patch from Karsten.
-
-  o Major bugfixes:
-    - If you have more than one bridge but don't know their digests,
-      you would only learn a request for the descriptor of the first one
-      on your list. (Tor considered launching requests for the others, but
-      found that it already had a connection on the way for $0000...0000
-      so it didn't open another.) Bugfix on 0.2.0.x.
-    - If you have more than one bridge but don't know their digests,
-      and the connection to one of the bridges failed, you would cancel
-      all pending bridge connections. (After all, they all have the
-      same digest.) Bugfix on 0.2.0.x.
-    - When establishing a hidden service, introduction points that
-      originate from cannibalized circuits are completely ignored and not
-      included in rendezvous service descriptors. This might be another
-      reason for delay in making a hidden service available. Bugfix
-      from long ago (0.0.9.x?)
-
-  o Minor features:
-    - Allow OpenSSL to use dynamic locks if it wants.
-    - When building a consensus, do not include routers that are down.
-      This will cut down 30% to 40% on consensus size. Implements
-      proposal 138.
-    - In directory authorities' approved-routers files, allow
-      fingerprints with or without space.
-    - Add a "GETINFO /status/bootstrap-phase" controller option, so the
-      controller can query our current bootstrap state in case it attaches
-      partway through and wants to catch up.
-    - Send an initial "Starting" bootstrap status event, so we have a
-      state to start out in.
-
-  o Minor bugfixes:
-    - Asking for a conditional consensus at .../consensus/
-      would crash a dirserver if it did not already have a
-      consensus. Bugfix on 0.2.1.1-alpha.
-    - Clean up some macro/CPP interactions: some GCC versions don't like
-      #if/#endif pairs inside macro arguments. Fixes bug 707. Bugfix on
-      0.2.0.x.
-
-  o Bootstrapping bugfixes (on 0.2.1.1-alpha):
-    - Directory authorities shouldn't complain about bootstrapping
-      problems just because they do a lot of reachability testing and
-      some of the connection attempts fail.
-    - Start sending "count" and "recommendation" key/value pairs in
-      bootstrap problem status events, so the controller can hear about
-      problems even before Tor decides they're worth reporting for sure.
-    - If you're using bridges, generate "bootstrap problem" warnings
-      as soon as you run out of working bridges, rather than waiting
-      for ten failures -- which will never happen if you have less than
-      ten bridges.
-    - If we close our OR connection because there's been a circuit
-      pending on it for too long, we were telling our bootstrap status
-      events "REASON=NONE". Now tell them "REASON=TIMEOUT".
-
-
-Changes in version 0.2.1.1-alpha - 2008-06-13
-  Tor 0.2.1.1-alpha fixes a lot of memory fragmentation problems that
-  were making the Tor process bloat especially on Linux; makes our TLS
-  handshake blend in better; sends "bootstrap phase" status events to
-  the controller, so it can keep the user informed of progress (and
-  problems) fetching directory information and establishing circuits;
-  and adds a variety of smaller features.
-
-  o Major features:
-    - More work on making our TLS handshake blend in: modify the list
-      of ciphers advertised by OpenSSL in client mode to even more
-      closely resemble a common web browser. We cheat a little so that
-      we can advertise ciphers that the locally installed OpenSSL doesn't
-      know about.
-    - Start sending "bootstrap phase" status events to the controller,
-      so it can keep the user informed of progress fetching directory
-      information and establishing circuits. Also inform the controller
-      if we think we're stuck at a particular bootstrap phase. Implements
-      proposal 137.
-    - Resume using OpenSSL's RAND_poll() for better (and more portable)
-      cross-platform entropy collection again. We used to use it, then
-      stopped using it because of a bug that could crash systems that
-      called RAND_poll when they had a lot of fds open. It looks like the
-      bug got fixed in late 2006. Our new behavior is to call RAND_poll()
-      at startup, and to call RAND_poll() when we reseed later only if
-      we have a non-buggy OpenSSL version.
-
-  o Major bugfixes:
-    - When we choose to abandon a new entry guard because we think our
-      older ones might be better, close any circuits pending on that
-      new entry guard connection. This fix should make us recover much
-      faster when our network is down and then comes back. Bugfix on
-      0.1.2.8-beta; found by lodger.
-
-  o Memory fixes and improvements:
-    - Add a malloc_good_size implementation to OpenBSD_malloc_linux.c,
-      to avoid unused RAM in buffer chunks and memory pools.
-    - Speed up parsing and cut down on memory fragmentation by using
-      stack-style allocations for parsing directory objects. Previously,
-      this accounted for over 40% of allocations from within Tor's code
-      on a typical directory cache.
-    - Use a Bloom filter rather than a digest-based set to track which
-      descriptors we need to keep around when we're cleaning out old
-      router descriptors. This speeds up the computation significantly,
-      and may reduce fragmentation.
-    - Reduce the default smartlist size from 32 to 16; it turns out that
-      most smartlists hold around 8-12 elements tops.
-    - Make dumpstats() log the fullness and size of openssl-internal
-      buffers.
-    - If the user has applied the experimental SSL_MODE_RELEASE_BUFFERS
-      patch to their OpenSSL, turn it on to save memory on servers. This
-      patch will (with any luck) get included in a mainline distribution
-      before too long.
-    - Never use OpenSSL compression: it wastes RAM and CPU trying to
-      compress cells, which are basically all encrypted, compressed,
-      or both.
-
-  o Minor bugfixes:
-    - Stop reloading the router list from disk for no reason when we
-      run out of reachable directory mirrors. Once upon a time reloading
-      it would set the 'is_running' flag back to 1 for them. It hasn't
-      done that for a long time.
-    - In very rare situations new hidden service descriptors were
-      published earlier than 30 seconds after the last change to the
-      service. (We currently think that a hidden service descriptor
-      that's been stable for 30 seconds is worth publishing.)
-
-  o Minor features:
-    - Allow separate log levels to be configured for different logging
-      domains. For example, this allows one to log all notices, warnings,
-      or errors, plus all memory management messages of level debug or
-      higher, with: Log [MM] debug-err [*] notice-err file /var/log/tor.
-    - Add a couple of extra warnings to --enable-gcc-warnings for GCC 4.3,
-      and stop using a warning that had become unfixably verbose under
-      GCC 4.3.
-    - New --hush command-line option similar to --quiet. While --quiet
-      disables all logging to the console on startup, --hush limits the
-      output to messages of warning and error severity.
-    - Servers support a new URL scheme for consensus downloads that
-      allows the client to specify which authorities are trusted.
-      The server then only sends the consensus if the client will trust
-      it. Otherwise a 404 error is sent back. Clients use this
-      new scheme when the server supports it (meaning it's running
-      0.2.1.1-alpha or later). Implements proposal 134.
-    - New configure/torrc options (--enable-geoip-stats,
-      DirRecordUsageByCountry) to record how many IPs we've served
-      directory info to in each country code, how many status documents
-      total we've sent to each country code, and what share of the total
-      directory requests we should expect to see.
-    - Use the TLS1 hostname extension to more closely resemble browser
-      behavior.
-    - Lots of new unit tests.
-    - Add a macro to implement the common pattern of iterating through
-      two parallel lists in lockstep.
-
-
-Changes in version 0.2.0.28-rc - 2008-06-13
-  Tor 0.2.0.28-rc fixes an anonymity-related bug, fixes a hidden-service
-  performance bug, and fixes a bunch of smaller bugs.
-
-  o Anonymity fixes:
-    - Fix a bug where, when we were choosing the 'end stream reason' to
-      put in our relay end cell that we send to the exit relay, Tor
-      clients on Windows were sometimes sending the wrong 'reason'. The
-      anonymity problem is that exit relays may be able to guess whether
-      the client is running Windows, thus helping partition the anonymity
-      set. Down the road we should stop sending reasons to exit relays,
-      or otherwise prevent future versions of this bug.
-
-  o Major bugfixes:
-    - While setting up a hidden service, some valid introduction circuits
-      were overlooked and abandoned. This might be the reason for
-      the long delay in making a hidden service available. Bugfix on
-      0.2.0.14-alpha.
-
-  o Minor features:
-    - Update to the "June 9 2008" ip-to-country file.
-    - Run 'make test' as part of 'make dist', so we stop releasing so
-      many development snapshots that fail their unit tests.
-
-  o Minor bugfixes:
-    - When we're checking if we have enough dir info for each relay
-      to begin establishing circuits, make sure that we actually have
-      the descriptor listed in the consensus, not just any descriptor.
-      Bugfix on 0.1.2.x.
-    - Bridge relays no longer print "xx=0" in their extrainfo document
-      for every single country code in the geoip db. Bugfix on
-      0.2.0.27-rc.
-    - Only warn when we fail to load the geoip file if we were planning to
-      include geoip stats in our extrainfo document. Bugfix on 0.2.0.27-rc.
-    - If we change our MaxAdvertisedBandwidth and then reload torrc,
-      Tor won't realize it should publish a new relay descriptor. Fixes
-      bug 688, reported by mfr. Bugfix on 0.1.2.x.
-    - When we haven't had any application requests lately, don't bother
-      logging that we have expired a bunch of descriptors. Bugfix
-      on 0.1.2.x.
-    - Make relay cells written on a connection count as non-padding when
-      tracking how long a connection has been in use. Bugfix on
-      0.2.0.1-alpha. Spotted by lodger.
-    - Fix unit tests in 0.2.0.27-rc.
-    - Fix compile on Windows.
-
-
-Changes in version 0.2.0.27-rc - 2008-06-03
-  Tor 0.2.0.27-rc adds a few features we left out of the earlier
-  release candidates. In particular, we now include an IP-to-country
-  GeoIP database, so controllers can easily look up what country a
-  given relay is in, and so bridge relays can give us some sanitized
-  summaries about which countries are making use of bridges. (See proposal
-  126-geoip-fetching.txt for details.)
-
-  o Major features:
-    - Include an IP-to-country GeoIP file in the tarball, so bridge
-      relays can report sanitized summaries of the usage they're seeing.
-
-  o Minor features:
-    - Add a "PURPOSE=" argument to "STREAM NEW" events, as suggested by
-      Robert Hogan. Fixes the first part of bug 681.
-    - Make bridge authorities never serve extrainfo docs.
-    - Add support to detect Libevent versions in the 1.4.x series
-      on mingw.
-    - Fix build on gcc 4.3 with --enable-gcc-warnings set.
-    - Include a new contrib/tor-exit-notice.html file that exit relay
-      operators can put on their website to help reduce abuse queries.
-
-  o Minor bugfixes:
-    - When tunneling an encrypted directory connection, and its first
-      circuit fails, do not leave it unattached and ask the controller
-      to deal. Fixes the second part of bug 681.
-    - Make bridge authorities correctly expire old extrainfo documents
-      from time to time.
-
-
-Changes in version 0.2.0.26-rc - 2008-05-13
-  Tor 0.2.0.26-rc fixes a major security vulnerability caused by a bug
-  in Debian's OpenSSL packages. All users running any 0.2.0.x version
-  should upgrade, whether they're running Debian or not.
-
-  o Major security fixes:
-    - Use new V3 directory authority keys on the tor26, gabelmoo, and
-      moria1 V3 directory authorities. The old keys were generated with
-      a vulnerable version of Debian's OpenSSL package, and must be
-      considered compromised. Other authorities' keys were not generated
-      with an affected version of OpenSSL.
-
-  o Major bugfixes:
-    - List authority signatures as "unrecognized" based on DirServer
-      lines, not on cert cache. Bugfix on 0.2.0.x.
-
-  o Minor features:
-    - Add a new V3AuthUseLegacyKey option to make it easier for
-      authorities to change their identity keys if they have to.
-
-
-Changes in version 0.2.0.25-rc - 2008-04-23
-  Tor 0.2.0.25-rc makes Tor work again on OS X and certain BSDs.
-
-  o Major bugfixes:
-    - Remember to initialize threading before initializing logging.
-      Otherwise, many BSD-family implementations will crash hard on
-      startup. Fixes bug 671. Bugfix on 0.2.0.24-rc.
-
-  o Minor bugfixes:
-    - Authorities correctly free policies on bad servers on
-      exit. Fixes bug 672. Bugfix on 0.2.0.x.
-
-
-Changes in version 0.2.0.24-rc - 2008-04-22
-  Tor 0.2.0.24-rc adds dizum (run by Alex de Joode) as the new sixth
-  v3 directory authority, makes relays with dynamic IP addresses and no
-  DirPort notice more quickly when their IP address changes, fixes a few
-  rare crashes and memory leaks, and fixes a few other miscellaneous bugs.
-
-  o New directory authorities:
-    - Take lefkada out of the list of v3 directory authorities, since
-      it has been down for months.
-    - Set up dizum (run by Alex de Joode) as the new sixth v3 directory
-      authority.
-
-  o Major bugfixes:
-    - Detect address changes more quickly on non-directory mirror
-      relays. Bugfix on 0.2.0.18-alpha; fixes bug 652.
-
-  o Minor features (security):
-    - Reject requests for reverse-dns lookup of names that are in
-      a private address space. Patch from lodger.
-    - Non-exit relays no longer allow DNS requests. Fixes bug 619. Patch
-      from lodger.
-
-  o Minor bugfixes (crashes):
-    - Avoid a rare assert that can trigger when Tor doesn't have much
-      directory information yet and it tries to fetch a v2 hidden
-      service descriptor. Fixes bug 651, reported by nwf.
-    - Initialize log mutex before initializing dmalloc. Otherwise,
-      running with dmalloc would crash. Bugfix on 0.2.0.x-alpha.
-    - Use recursive pthread mutexes in order to avoid deadlock when
-      logging debug-level messages to a controller. Bug spotted by nwf,
-      bugfix on 0.2.0.16-alpha.
-
-  o Minor bugfixes (resource management):
-    - Keep address policies from leaking memory: start their refcount
-      at 1, not 2. Bugfix on 0.2.0.16-alpha.
-    - Free authority certificates on exit, so they don't look like memory
-      leaks. Bugfix on 0.2.0.19-alpha.
-    - Free static hashtables for policy maps and for TLS connections on
-      shutdown, so they don't look like memory leaks. Bugfix on 0.2.0.x.
-    - Avoid allocating extra space when computing consensuses on 64-bit
-      platforms. Bug spotted by aakova.
-
-  o Minor bugfixes (misc):
-    - Do not read the configuration file when we've only been told to
-      generate a password hash. Fixes bug 643. Bugfix on 0.0.9pre5. Fix
-      based on patch from Sebastian Hahn.
-    - Exit relays that are used as a client can now reach themselves
-      using the .exit notation, rather than just launching an infinite
-      pile of circuits. Fixes bug 641. Reported by Sebastian Hahn.
-    - When attempting to open a logfile fails, tell us why.
-    - Fix a dumb bug that was preventing us from knowing that we should
-      preemptively build circuits to handle expected directory requests.
-      Fixes bug 660. Bugfix on 0.1.2.x.
-    - Warn less verbosely about clock skew from netinfo cells from
-      untrusted sources. Fixes bug 663.
-    - Make controller stream events for DNS requests more consistent,
-      by adding "new stream" events for DNS requests, and removing
-      spurious "stream closed" events" for cached reverse resolves.
-      Patch from mwenge. Fixes bug 646.
-    - Correctly notify one-hop connections when a circuit build has
-      failed. Possible fix for bug 669. Found by lodger.
-
-
-Changes in version 0.2.0.23-rc - 2008-03-24
-  Tor 0.2.0.23-rc is the fourth release candidate for the 0.2.0 series. It
-  makes bootstrapping faster if the first directory mirror you contact
-  is down. The bundles also include the new Vidalia 0.1.2 release.
-
-  o Major bugfixes:
-    - When a tunneled directory request is made to a directory server
-      that's down, notice after 30 seconds rather than 120 seconds. Also,
-      fail any begindir streams that are pending on it, so they can
-      retry elsewhere. This was causing multi-minute delays on bootstrap.
-
-
-Changes in version 0.2.0.22-rc - 2008-03-18
-  Tor 0.2.0.22-rc is the third release candidate for the 0.2.0 series. It
-  enables encrypted directory connections by default for non-relays, fixes
-  some broken TLS behavior we added in 0.2.0.20-rc, and resolves many
-  other bugs. The bundles also include Vidalia 0.1.1 and Torbutton 1.1.17.
-
-  o Major features:
-    - Enable encrypted directory connections by default for non-relays,
-      so censor tools that block Tor directory connections based on their
-      plaintext patterns will no longer work. This means Tor works in
-      certain censored countries by default again.
-
-  o Major bugfixes:
-    - Make sure servers always request certificates from clients during
-      TLS renegotiation. Reported by lodger; bugfix on 0.2.0.20-rc.
-    - Do not enter a CPU-eating loop when a connection is closed in
-      the middle of client-side TLS renegotiation. Fixes bug 622. Bug
-      diagnosed by lodger; bugfix on 0.2.0.20-rc.
-    - Fix assertion failure that could occur when a blocked circuit
-      became unblocked, and it had pending client DNS requests. Bugfix
-      on 0.2.0.1-alpha. Fixes bug 632.
-
-  o Minor bugfixes (on 0.1.2.x):
-    - Generate "STATUS_SERVER" events rather than misspelled
-      "STATUS_SEVER" events. Caught by mwenge.
-    - When counting the number of bytes written on a TLS connection,
-      look at the BIO actually used for writing to the network, not
-      at the BIO used (sometimes) to buffer data for the network.
-      Looking at different BIOs could result in write counts on the
-      order of ULONG_MAX. Fixes bug 614.
-    - On Windows, correctly detect errors when listing the contents of
-      a directory. Fix from lodger.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - Downgrade "sslv3 alert handshake failure" message to INFO.
-    - If we set RelayBandwidthRate and RelayBandwidthBurst very high but
-      left BandwidthRate and BandwidthBurst at the default, we would be
-      silently limited by those defaults. Now raise them to match the
-      RelayBandwidth* values.
-    - Fix the SVK version detection logic to work correctly on a branch.
-    - Make --enable-openbsd-malloc work correctly on Linux with alpha
-      CPUs. Fixes bug 625.
-    - Logging functions now check that the passed severity is sane.
-    - Use proper log levels in the testsuite call of
-      get_interface_address6().
-    - When using a nonstandard malloc, do not use the platform values for
-      HAVE_MALLOC_GOOD_SIZE or HAVE_MALLOC_USABLE_SIZE.
-    - Make the openbsd malloc code use 8k pages on alpha CPUs and
-      16k pages on ia64.
-    - Detect mismatched page sizes when using --enable-openbsd-malloc.
-    - Avoid double-marked-for-close warning when certain kinds of invalid
-      .in-addr.arpa addresses are passed to the DNSPort. Part of a fix
-      for bug 617. Bugfix on 0.2.0.1-alpha.
-    - Make sure that the "NULL-means-reject *:*" convention is followed by
-      all the policy manipulation functions, avoiding some possible crash
-      bugs. Bug found by lodger. Bugfix on 0.2.0.16-alpha.
-    - Fix the implementation of ClientDNSRejectInternalAddresses so that it
-      actually works, and doesn't warn about every single reverse lookup.
-      Fixes the other part of bug 617. Bugfix on 0.2.0.1-alpha.
-
-  o Minor features:
-    - Only log guard node status when guard node status has changed.
-    - Downgrade the 3 most common "INFO" messages to "DEBUG". This will
-      make "INFO" 75% less verbose.
-
-
-Changes in version 0.2.0.21-rc - 2008-03-02
-  Tor 0.2.0.21-rc is the second release candidate for the 0.2.0 series. It
-  makes Tor work well with Vidalia again, fixes a rare assert bug,
-  and fixes a pair of more minor bugs. The bundles also include Vidalia
-  0.1.0 and Torbutton 1.1.16.
-
-  o Major bugfixes:
-    - The control port should declare that it requires password auth
-      when HashedControlSessionPassword is set too. Patch from Matt Edman;
-      bugfix on 0.2.0.20-rc. Fixes bug 615.
-    - Downgrade assert in connection_buckets_decrement() to a log message.
-      This may help us solve bug 614, and in any case will make its
-      symptoms less severe. Bugfix on 0.2.0.20-rc. Reported by fredzupy.
-    - We were sometimes miscounting the number of bytes read from the
-      network, causing our rate limiting to not be followed exactly.
-      Bugfix on 0.2.0.16-alpha. Reported by lodger.
-
-  o Minor bugfixes:
-    - Fix compilation with OpenSSL 0.9.8 and 0.9.8a. All other supported
-      OpenSSL versions should have been working fine. Diagnosis and patch
-      from lodger, Karsten Loesing, and Sebastian Hahn. Fixes bug 616.
-      Bugfix on 0.2.0.20-rc.
-
-
-Changes in version 0.2.0.20-rc - 2008-02-24
-  Tor 0.2.0.20-rc is the first release candidate for the 0.2.0 series. It
-  makes more progress towards normalizing Tor's TLS handshake, makes
-  hidden services work better again, helps relays bootstrap if they don't
-  know their IP address, adds optional support for linking in openbsd's
-  allocator or tcmalloc, allows really fast relays to scale past 15000
-  sockets, and fixes a bunch of minor bugs reported by Veracode.
-
-  o Major features:
-    - Enable the revised TLS handshake based on the one designed by
-      Steven Murdoch in proposal 124, as revised in proposal 130. It
-      includes version negotiation for OR connections as described in
-      proposal 105. The new handshake is meant to be harder for censors
-      to fingerprint, and it adds the ability to detect certain kinds of
-      man-in-the-middle traffic analysis attacks. The version negotiation
-      feature will allow us to improve Tor's link protocol more safely
-      in the future.
-    - Choose which bridge to use proportional to its advertised bandwidth,
-      rather than uniformly at random. This should speed up Tor for
-      bridge users. Also do this for people who set StrictEntryNodes.
-    - When a TrackHostExits-chosen exit fails too many times in a row,
-      stop using it. Bugfix on 0.1.2.x; fixes bug 437.
-
-  o Major bugfixes:
-    - Resolved problems with (re-)fetching hidden service descriptors.
-      Patch from Karsten Loesing; fixes problems with 0.2.0.18-alpha
-      and 0.2.0.19-alpha.
-    - If we only ever used Tor for hidden service lookups or posts, we
-      would stop building circuits and start refusing connections after
-      24 hours, since we falsely believed that Tor was dormant. Reported
-      by nwf; bugfix on 0.1.2.x.
-    - Servers that don't know their own IP address should go to the
-      authorities for their first directory fetch, even if their DirPort
-      is off or if they don't know they're reachable yet. This will help
-      them bootstrap better. Bugfix on 0.2.0.18-alpha; fixes bug 609.
-    - When counting the number of open sockets, count not only the number
-      of sockets we have received from the socket() call, but also
-      the number we've gotten from accept() and socketpair(). This bug
-      made us fail to count all sockets that we were using for incoming
-      connections. Bugfix on 0.2.0.x.
-    - Fix code used to find strings within buffers, when those strings
-      are not in the first chunk of the buffer. Bugfix on 0.2.0.x.
-    - Fix potential segfault when parsing HTTP headers. Bugfix on 0.2.0.x.
-    - Add a new __HashedControlSessionPassword option for controllers
-      to use for one-off session password hashes that shouldn't get
-      saved to disk by SAVECONF --- Vidalia users were accumulating a
-      pile of HashedControlPassword lines in their torrc files, one for
-      each time they had restarted Tor and then clicked Save. Make Tor
-      automatically convert "HashedControlPassword" to this new option but
-      only when it's given on the command line. Partial fix for bug 586.
-
-  o Minor features (performance):
-    - Tune parameters for cell pool allocation to minimize amount of
-      RAM overhead used.
-    - Add OpenBSD malloc code from phk as an optional malloc
-      replacement on Linux: some glibc libraries do very poorly
-      with Tor's memory allocation patterns. Pass
-      --enable-openbsd-malloc to get the replacement malloc code.
-    - Add a --with-tcmalloc option to the configure script to link
-      against tcmalloc (if present). Does not yet search for
-      non-system include paths.
-    - Stop imposing an arbitrary maximum on the number of file descriptors
-      used for busy servers. Bug reported by Olaf Selke; patch from
-      Sebastian Hahn.
-
-  o Minor features (other):
-    - When SafeLogging is disabled, log addresses along with all TLS
-      errors.
-    - When building with --enable-gcc-warnings, check for whether Apple's
-      warning "-Wshorten-64-to-32" is available.
-    - Add a --passphrase-fd argument to the tor-gencert command for
-      scriptability.
-
-  o Minor bugfixes (memory leaks and code problems):
-    - We were leaking a file descriptor if Tor started with a zero-length
-      cached-descriptors file. Patch by freddy77; bugfix on 0.1.2.
-    - Detect size overflow in zlib code. Reported by Justin Ferguson and
-      Dan Kaminsky.
-    - We were comparing the raw BridgePassword entry with a base64'ed
-      version of it, when handling a "/tor/networkstatus-bridges"
-      directory request. Now compare correctly. Noticed by Veracode.
-    - Recover from bad tracked-since value in MTBF-history file.
-      Should fix bug 537.
-    - Alter the code that tries to recover from unhandled write
-      errors, to not try to flush onto a socket that's given us
-      unhandled errors. Bugfix on 0.1.2.x.
-    - Make Unix controlsockets work correctly on OpenBSD. Patch from
-      tup. Bugfix on 0.2.0.3-alpha.
-
-  o Minor bugfixes (other):
-    - If we have an extra-info document for our server, always make
-      it available on the control port, even if we haven't gotten
-      a copy of it from an authority yet. Patch from mwenge.
-    - Log the correct memory chunk sizes for empty RAM chunks in mempool.c.
-    - Directory mirrors no longer include a guess at the client's IP
-      address if the connection appears to be coming from the same /24
-      network; it was producing too many wrong guesses.
-    - Make the new hidden service code respect the SafeLogging setting.
-      Bugfix on 0.2.0.x. Patch from Karsten.
-    - When starting as an authority, do not overwrite all certificates
-      cached from other authorities. Bugfix on 0.2.0.x. Fixes bug 606.
-    - If we're trying to flush the last bytes on a connection (for
-      example, when answering a directory request), reset the
-      time-to-give-up timeout every time we manage to write something
-      on the socket. Bugfix on 0.1.2.x.
-    - Change the behavior of "getinfo status/good-server-descriptor"
-      so it doesn't return failure when any authority disappears.
-    - Even though the man page said that "TrackHostExits ." should
-      work, nobody had ever implemented it. Bugfix on 0.1.0.x.
-    - Report TLS "zero return" case as a "clean close" and "IO error"
-      as a "close". Stop calling closes "unexpected closes": existing
-      Tors don't use SSL_close(), so having a connection close without
-      the TLS shutdown handshake is hardly unexpected.
-    - Send NAMESERVER_STATUS messages for a single failed nameserver
-      correctly.
-
-  o Code simplifications and refactoring:
-    - Remove the tor_strpartition function: its logic was confused,
-      and it was only used for one thing that could be implemented far
-      more easily.
-
-
-Changes in version 0.2.0.19-alpha - 2008-02-09
-  Tor 0.2.0.19-alpha makes more progress towards normalizing Tor's TLS
-  handshake, makes path selection for relays more secure and IP address
-  guessing more robust, and generally fixes a lot of bugs in preparation
-  for calling the 0.2.0 branch stable.
-
-  o Major features:
-    - Do not include recognizeable strings in the commonname part of
-      Tor's x509 certificates.
-
-  o Major bugfixes:
-    - If we're a relay, avoid picking ourselves as an introduction point,
-      a rendezvous point, or as the final hop for internal circuits. Bug
-      reported by taranis and lodger. Bugfix on 0.1.2.x.
-    - Patch from "Andrew S. Lists" to catch when we contact a directory
-      mirror at IP address X and he says we look like we're coming from
-      IP address X. Bugfix on 0.1.2.x.
-
-  o Minor features (security):
-    - Be more paranoid about overwriting sensitive memory on free(),
-      as a defensive programming tactic to ensure forward secrecy.
-
-  o Minor features (directory authority):
-    - Actually validate the options passed to AuthDirReject,
-      AuthDirInvalid, AuthDirBadDir, and AuthDirBadExit.
-    - Reject router descriptors with out-of-range bandwidthcapacity or
-      bandwidthburst values.
-
-  o Minor features (controller):
-    - Reject controller commands over 1MB in length. This keeps rogue
-      processes from running us out of memory.
-
-  o Minor features (misc):
-    - Give more descriptive well-formedness errors for out-of-range
-      hidden service descriptor/protocol versions.
-    - Make memory debugging information describe more about history
-      of cell allocation, so we can help reduce our memory use.
-
-  o Deprecated features (controller):
-    - The status/version/num-versioning and status/version/num-concurring
-      GETINFO options are no longer useful in the v3 directory protocol:
-      treat them as deprecated, and warn when they're used.
-
-  o Minor bugfixes:
-    - When our consensus networkstatus has been expired for a while, stop
-      being willing to build circuits using it. Fixes bug 401. Bugfix
-      on 0.1.2.x.
-    - Directory caches now fetch certificates from all authorities
-      listed in a networkstatus consensus, even when they do not
-      recognize them. Fixes bug 571. Bugfix on 0.2.0.x.
-    - When connecting to a bridge without specifying its key, insert
-      the connection into the identity-to-connection map as soon as
-      a key is learned. Fixes bug 574. Bugfix on 0.2.0.x.
-    - Detect versions of OS X where malloc_good_size() is present in the
-      library but never actually declared. Resolves bug 587. Bugfix
-      on 0.2.0.x.
-    - Stop incorrectly truncating zlib responses to directory authority
-      signature download requests. Fixes bug 593. Bugfix on 0.2.0.x.
-    - Stop recommending that every server operator send mail to tor-ops.
-      Resolves bug 597. Bugfix on 0.1.2.x.
-    - Don't trigger an assert if we start a directory authority with a
-      private IP address (like 127.0.0.1).
-    - Avoid possible failures when generating a directory with routers
-      with over-long versions strings, or too many flags set. Bugfix
-      on 0.1.2.x.
-    - If an attempt to launch a DNS resolve request over the control
-      port fails because we have overrun the limit on the number of
-      connections, tell the controller that the request has failed.
-    - Avoid using too little bandwidth when our clock skips a few
-      seconds. Bugfix on 0.1.2.x.
-    - Fix shell error when warning about missing packages in configure
-      script, on Fedora or Red Hat machines. Bugfix on 0.2.0.x.
-    - Do not become confused when receiving a spurious VERSIONS-like
-      cell from a confused v1 client. Bugfix on 0.2.0.x.
-    - Re-fetch v2 (as well as v0) rendezvous descriptors when all
-      introduction points for a hidden service have failed. Patch from
-      Karsten Loesing. Bugfix on 0.2.0.x.
-
-  o Code simplifications and refactoring:
-    - Remove some needless generality from cpuworker code, for improved
-      type-safety.
-    - Stop overloading the circuit_t.onionskin field for both "onionskin
-      from a CREATE cell that we are waiting for a cpuworker to be
-      assigned" and "onionskin from an EXTEND cell that we are going to
-      send to an OR as soon as we are connected". Might help with bug 600.
-    - Add an in-place version of aes_crypt() so that we can avoid doing a
-      needless memcpy() call on each cell payload.
-
-
-Changes in version 0.2.0.18-alpha - 2008-01-25
-  Tor 0.2.0.18-alpha adds a sixth v3 directory authority run by CCC,
-  fixes a big memory leak in 0.2.0.17-alpha, and adds new config options
-  that can warn or reject connections to ports generally associated with
-  vulnerable-plaintext protocols.
-
-  o New directory authorities:
-    - Set up dannenberg (run by CCC) as the sixth v3 directory
-      authority.
-
-  o Major bugfixes:
-    - Fix a major memory leak when attempting to use the v2 TLS
-      handshake code. Bugfix on 0.2.0.x; fixes bug 589.
-    - We accidentally enabled the under-development v2 TLS handshake
-      code, which was causing log entries like "TLS error while
-      renegotiating handshake". Disable it again. Resolves bug 590.
-    - We were computing the wrong Content-Length: header for directory
-      responses that need to be compressed on the fly, causing clients
-      asking for those items to always fail. Bugfix on 0.2.0.x; partially
-      fixes bug 593.
-
-  o Major features:
-    - Avoid going directly to the directory authorities even if you're a
-      relay, if you haven't found yourself reachable yet or if you've
-      decided not to advertise your dirport yet. Addresses bug 556.
-    - If we've gone 12 hours since our last bandwidth check, and we
-      estimate we have less than 50KB bandwidth capacity but we could
-      handle more, do another bandwidth test.
-    - New config options WarnPlaintextPorts and RejectPlaintextPorts so
-      Tor can warn and/or refuse connections to ports commonly used with
-      vulnerable-plaintext protocols. Currently we warn on ports 23,
-      109, 110, and 143, but we don't reject any.
-
-  o Minor bugfixes:
-    - When we setconf ClientOnly to 1, close any current OR and Dir
-      listeners. Reported by mwenge.
-    - When we get a consensus that's been signed by more people than
-      we expect, don't log about it; it's not a big deal. Reported
-      by Kyle Williams.
-
-  o Minor features:
-    - Don't answer "/tor/networkstatus-bridges" directory requests if
-      the request isn't encrypted.
-    - Make "ClientOnly 1" config option disable directory ports too.
-    - Patches from Karsten Loesing to make v2 hidden services more
-      robust: work even when there aren't enough HSDir relays available;
-      retry when a v2 rend desc fetch fails; but don't retry if we
-      already have a usable v0 rend desc.
-
-
-Changes in version 0.2.0.17-alpha - 2008-01-17
-  Tor 0.2.0.17-alpha makes the tarball build cleanly again (whoops).
-
-  o Compile fixes:
-    - Make the tor-gencert man page get included correctly in the tarball.
-
-
-Changes in version 0.2.0.16-alpha - 2008-01-17
-  Tor 0.2.0.16-alpha adds a fifth v3 directory authority run by Karsten
-  Loesing, and generally cleans up a lot of features and minor bugs.
-
-  o New directory authorities:
-    - Set up gabelmoo (run by Karsten Loesing) as the fifth v3 directory
-      authority.
-
-  o Major performance improvements:
-    - Switch our old ring buffer implementation for one more like that
-      used by free Unix kernels. The wasted space in a buffer with 1mb
-      of data will now be more like 8k than 1mb. The new implementation
-      also avoids realloc();realloc(); patterns that can contribute to
-      memory fragmentation.
-
-  o Minor features:
-    - Configuration files now accept C-style strings as values. This
-      helps encode characters not allowed in the current configuration
-      file format, such as newline or #. Addresses bug 557.
-    - Although we fixed bug 539 (where servers would send HTTP status 503
-      responses _and_ send a body too), there are still servers out
-      there that haven't upgraded. Therefore, make clients parse such
-      bodies when they receive them.
-    - When we're not serving v2 directory information, there is no reason
-      to actually keep any around. Remove the obsolete files and directory
-      on startup if they are very old and we aren't going to serve them.
-
-  o Minor performance improvements:
-    - Reference-count and share copies of address policy entries; only 5%
-      of them were actually distinct.
-    - Never walk through the list of logs if we know that no log is
-      interested in a given message.
-
-  o Minor bugfixes:
-    - When an authority has not signed a consensus, do not try to
-      download a nonexistent "certificate with key 00000000". Bugfix
-      on 0.2.0.x. Fixes bug 569.
-    - Fix a rare assert error when we're closing one of our threads:
-      use a mutex to protect the list of logs, so we never write to the
-      list as it's being freed. Bugfix on 0.1.2.x. Fixes the very rare
-      bug 575, which is kind of the revenge of bug 222.
-    - Patch from Karsten Loesing to complain less at both the client
-      and the relay when a relay used to have the HSDir flag but doesn't
-      anymore, and we try to upload a hidden service descriptor.
-    - Stop leaking one cert per TLS context. Fixes bug 582. Bugfix on
-      0.2.0.15-alpha.
-    - Do not try to download missing certificates until we have tried
-      to check our fallback consensus. Fixes bug 583.
-    - Make bridges round reported GeoIP stats info up to the nearest
-      estimate, not down. Now we can distinguish between "0 people from
-      this country" and "1 person from this country".
-    - Avoid a spurious free on base64 failure. Bugfix on 0.1.2.
-    - Avoid possible segfault if key generation fails in
-      crypto_pk_hybrid_encrypt. Bugfix on 0.2.0.
-    - Avoid segfault in the case where a badly behaved v2 versioning
-      directory sends a signed networkstatus with missing client-versions.
-      Bugfix on 0.1.2.
-    - Avoid segfaults on certain complex invocations of
-      router_get_by_hexdigest(). Bugfix on 0.1.2.
-    - Correct bad index on array access in parse_http_time(). Bugfix
-      on 0.2.0.
-    - Fix possible bug in vote generation when server versions are present
-      but client versions are not.
-    - Fix rare bug on REDIRECTSTREAM control command when called with no
-      port set: it could erroneously report an error when none had
-      happened.
-    - Avoid bogus crash-prone, leak-prone tor_realloc when we're
-      compressing large objects and find ourselves with more than 4k
-      left over. Bugfix on 0.2.0.
-    - Fix a small memory leak when setting up a hidden service.
-    - Fix a few memory leaks that could in theory happen under bizarre
-      error conditions.
-    - Fix an assert if we post a general-purpose descriptor via the
-      control port but that descriptor isn't mentioned in our current
-      network consensus. Bug reported by Jon McLachlan; bugfix on
-      0.2.0.9-alpha.
-
-  o Minor features (controller):
-    - Get NS events working again. Patch from tup.
-    - The GETCONF command now escapes and quotes configuration values
-      that don't otherwise fit into the torrc file.
-    - The SETCONF command now handles quoted values correctly.
-
-  o Minor features (directory authorities):
-    - New configuration options to override default maximum number of
-      servers allowed on a single IP address. This is important for
-      running a test network on a single host.
-    - Actually implement the -s option to tor-gencert.
-    - Add a manual page for tor-gencert.
-
-  o Minor features (bridges):
-    - Bridge authorities no longer serve bridge descriptors over
-      unencrypted connections.
-
-  o Minor features (other):
-    - Add hidden services and DNSPorts to the list of things that make
-      Tor accept that it has running ports. Change starting Tor with no
-      ports from a fatal error to a warning; we might change it back if
-      this turns out to confuse anybody. Fixes bug 579.
-
-
-Changes in version 0.1.2.19 - 2008-01-17
-  Tor 0.1.2.19 fixes a huge memory leak on exit relays, makes the default
-  exit policy a little bit more conservative so it's safer to run an
-  exit relay on a home system, and fixes a variety of smaller issues.
-
-  o Security fixes:
-    - Exit policies now reject connections that are addressed to a
-      relay's public (external) IP address too, unless
-      ExitPolicyRejectPrivate is turned off. We do this because too
-      many relays are running nearby to services that trust them based
-      on network address.
-
-  o Major bugfixes:
-    - When the clock jumps forward a lot, do not allow the bandwidth
-      buckets to become negative. Fixes bug 544.
-    - Fix a memory leak on exit relays; we were leaking a cached_resolve_t
-      on every successful resolve. Reported by Mike Perry.
-    - Purge old entries from the "rephist" database and the hidden
-      service descriptor database even when DirPort is zero.
-    - Stop thinking that 0.1.2.x directory servers can handle "begin_dir"
-      requests. Should ease bugs 406 and 419 where 0.1.2.x relays are
-      crashing or mis-answering these requests.
-    - When we decide to send a 503 response to a request for servers, do
-      not then also send the server descriptors: this defeats the whole
-      purpose. Fixes bug 539.
-
-  o Minor bugfixes:
-    - Changing the ExitPolicyRejectPrivate setting should cause us to
-      rebuild our server descriptor.
-    - Fix handling of hex nicknames when answering controller requests for
-      networkstatus by name, or when deciding whether to warn about
-      unknown routers in a config option. (Patch from mwenge.)
-    - Fix a couple of hard-to-trigger autoconf problems that could result
-      in really weird results on platforms whose sys/types.h files define
-      nonstandard integer types.
-    - Don't try to create the datadir when running --verify-config or
-      --hash-password. Resolves bug 540.
-    - If we were having problems getting a particular descriptor from the
-      directory caches, and then we learned about a new descriptor for
-      that router, we weren't resetting our failure count. Reported
-      by lodger.
-    - Although we fixed bug 539 (where servers would send HTTP status 503
-      responses _and_ send a body too), there are still servers out there
-      that haven't upgraded. Therefore, make clients parse such bodies
-      when they receive them.
-    - Run correctly on systems where rlim_t is larger than unsigned long.
-      This includes some 64-bit systems.
-    - Run correctly on platforms (like some versions of OS X 10.5) where
-      the real limit for number of open files is OPEN_FILES, not rlim_max
-      from getrlimit(RLIMIT_NOFILES).
-    - Avoid a spurious free on base64 failure.
-    - Avoid segfaults on certain complex invocations of
-      router_get_by_hexdigest().
-    - Fix rare bug on REDIRECTSTREAM control command when called with no
-      port set: it could erroneously report an error when none had
-      happened.
-
-
-Changes in version 0.2.0.15-alpha - 2007-12-25
-  Tor 0.2.0.14-alpha and 0.2.0.15-alpha fix a bunch of bugs with the
-  features added in 0.2.0.13-alpha.
-
-  o Major bugfixes:
-    - Fix several remotely triggerable asserts based on DirPort requests
-      for a v2 or v3 networkstatus object before we were prepared. This
-      was particularly bad for 0.2.0.13 and later bridge relays, who
-      would never have a v2 networkstatus and would thus always crash
-      when used. Bugfixes on 0.2.0.x.
-    - Estimate the v3 networkstatus size more accurately, rather than
-      estimating it at zero bytes and giving it artificially high priority
-      compared to other directory requests. Bugfix on 0.2.0.x.
-
-  o Minor bugfixes:
-    - Fix configure.in logic for cross-compilation.
-    - When we load a bridge descriptor from the cache, and it was
-      previously unreachable, mark it as retriable so we won't just
-      ignore it. Also, try fetching a new copy immediately. Bugfixes
-      on 0.2.0.13-alpha.
-    - The bridge GeoIP stats were counting other relays, for example
-      self-reachability and authority-reachability tests.
-
-  o Minor features:
-    - Support compilation to target iPhone; patch from cjacker huang.
-      To build for iPhone, pass the --enable-iphone option to configure.
-
-
-Changes in version 0.2.0.14-alpha - 2007-12-23
-  o Major bugfixes:
-    - Fix a crash on startup if you install Tor 0.2.0.13-alpha fresh
-      without a datadirectory from a previous Tor install. Reported
-      by Zax.
-    - Fix a crash when we fetch a descriptor that turns out to be
-      unexpected (it used to be in our networkstatus when we started
-      fetching it, but it isn't in our current networkstatus), and we
-      aren't using bridges. Bugfix on 0.2.0.x.
-    - Fix a crash when accessing hidden services: it would work the first
-      time you use a given introduction point for your service, but
-      on subsequent requests we'd be using garbage memory. Fixed by
-      Karsten Loesing. Bugfix on 0.2.0.13-alpha.
-    - Fix a crash when we load a bridge descriptor from disk but we don't
-      currently have a Bridge line for it in our torrc. Bugfix on
-      0.2.0.13-alpha.
-
-  o Major features:
-    - If bridge authorities set BridgePassword, they will serve a
-      snapshot of known bridge routerstatuses from their DirPort to
-      anybody who knows that password. Unset by default.
-
-  o Minor bugfixes:
-    - Make the unit tests build again.
-    - Make "GETINFO/desc-annotations/id/" actually work.
-    - Make PublishServerDescriptor default to 1, so the default doesn't
-      have to change as we invent new directory protocol versions.
-    - Fix test for rlim_t on OSX 10.3: sys/resource.h doesn't want to
-      be included unless sys/time.h is already included. Fixes
-      bug 553. Bugfix on 0.2.0.x.
-    - If we receive a general-purpose descriptor and then receive an
-      identical bridge-purpose descriptor soon after, don't discard
-      the next one as a duplicate.
-
-  o Minor features:
-    - If BridgeRelay is set to 1, then the default for
-      PublishServerDescriptor is now "bridge" rather than "v2,v3".
-    - If the user sets RelayBandwidthRate but doesn't set
-      RelayBandwidthBurst, then make them equal rather than erroring out.
-
-
-Changes in version 0.2.0.13-alpha - 2007-12-21
-  Tor 0.2.0.13-alpha adds a fourth v3 directory authority run by Geoff
-  Goodell, fixes many more bugs, and adds a lot of infrastructure for
-  upcoming features.
-
-  o New directory authorities:
-    - Set up lefkada (run by Geoff Goodell) as the fourth v3 directory
-      authority.
-
-  o Major bugfixes:
-    - Only update guard status (usable / not usable) once we have
-      enough directory information. This was causing us to always pick
-      two new guards on startup (bugfix on 0.2.0.9-alpha), and it was
-      causing us to discard all our guards on startup if we hadn't been
-      running for a few weeks (bugfix on 0.1.2.x). Fixes bug 448.
-    - Purge old entries from the "rephist" database and the hidden
-      service descriptor databases even when DirPort is zero. Bugfix
-      on 0.1.2.x.
-    - We were ignoring our RelayBandwidthRate for the first 30 seconds
-      after opening a circuit -- even a relayed circuit. Bugfix on
-      0.2.0.3-alpha.
-    - Stop thinking that 0.1.2.x directory servers can handle "begin_dir"
-      requests. Should ease bugs 406 and 419 where 0.1.2.x relays are
-      crashing or mis-answering these types of requests.
-    - Relays were publishing their server descriptor to v1 and v2
-      directory authorities, but they didn't try publishing to v3-only
-      authorities. Fix this; and also stop publishing to v1 authorities.
-      Bugfix on 0.2.0.x.
-    - When we were reading router descriptors from cache, we were ignoring
-      the annotations -- so for example we were reading in bridge-purpose
-      descriptors as general-purpose descriptors. Bugfix on 0.2.0.8-alpha.
-    - When we decided to send a 503 response to a request for servers, we
-      were then also sending the server descriptors: this defeats the
-      whole purpose. Fixes bug 539; bugfix on 0.1.2.x.
-
-  o Major features:
-    - Bridge relays now behave like clients with respect to time
-      intervals for downloading new consensus documents -- otherwise they
-      stand out. Bridge users now wait until the end of the interval,
-      so their bridge relay will be sure to have a new consensus document.
-    - Three new config options (AlternateDirAuthority,
-      AlternateBridgeAuthority, and AlternateHSAuthority) that let the
-      user selectively replace the default directory authorities by type,
-      rather than the all-or-nothing replacement that DirServer offers.
-    - Tor can now be configured to read a GeoIP file from disk in one
-      of two formats. This can be used by controllers to map IP addresses
-      to countries. Eventually, it may support exit-by-country.
-    - When possible, bridge relays remember which countries users
-      are coming from, and report aggregate information in their
-      extra-info documents, so that the bridge authorities can learn
-      where Tor is blocked.
-    - Bridge directory authorities now do reachability testing on the
-      bridges they know. They provide router status summaries to the
-      controller via "getinfo ns/purpose/bridge", and also dump summaries
-      to a file periodically.
-    - Stop fetching directory info so aggressively if your DirPort is
-      on but your ORPort is off; stop fetching v2 dir info entirely.
-      You can override these choices with the new FetchDirInfoEarly
-      config option.
-
-  o Minor bugfixes:
-    - The fix in 0.2.0.12-alpha cleared the "hsdir" flag in v3 network
-      consensus documents when there are too many relays at a single
-      IP address. Now clear it in v2 network status documents too, and
-      also clear it in routerinfo_t when the relay is no longer listed
-      in the relevant networkstatus document.
-    - Don't crash if we get an unexpected value for the
-      PublishServerDescriptor config option. Reported by Matt Edman;
-      bugfix on 0.2.0.9-alpha.
-    - Our new v2 hidden service descriptor format allows descriptors
-      that have no introduction points. But Tor crashed when we tried
-      to build a descriptor with no intro points (and it would have
-      crashed if we had tried to parse one). Bugfix on 0.2.0.x; patch
-      by Karsten Loesing.
-    - Fix building with dmalloc 5.5.2 with glibc.
-    - Reject uploaded descriptors and extrainfo documents if they're
-      huge. Otherwise we'll cache them all over the network and it'll
-      clog everything up. Reported by Aljosha Judmayer.
-    - Check for presence of s6_addr16 and s6_addr32 fields in in6_addr
-      via autoconf. Should fix compile on solaris. Bugfix on 0.2.0.x.
-    - When the DANGEROUS_VERSION controller status event told us we're
-      running an obsolete version, it used the string "OLD" to describe
-      it. Yet the "getinfo" interface used the string "OBSOLETE". Now use
-      "OBSOLETE" in both cases. Bugfix on 0.1.2.x.
-    - If we can't expand our list of entry guards (e.g. because we're
-      using bridges or we have StrictEntryNodes set), don't mark relays
-      down when they fail a directory request. Otherwise we're too quick
-      to mark all our entry points down. Bugfix on 0.1.2.x.
-    - Fix handling of hex nicknames when answering controller requests for
-      networkstatus by name, or when deciding whether to warn about unknown
-      routers in a config option. Bugfix on 0.1.2.x. (Patch from mwenge.)
-    - Fix a couple of hard-to-trigger autoconf problems that could result
-      in really weird results on platforms whose sys/types.h files define
-      nonstandard integer types. Bugfix on 0.1.2.x.
-    - Fix compilation with --disable-threads set. Bugfix on 0.2.0.x.
-    - Don't crash on name lookup when we have no current consensus. Fixes
-      bug 538; bugfix on 0.2.0.x.
-    - Only Tors that want to mirror the v2 directory info should
-      create the "cached-status" directory in their datadir. (All Tors
-      used to create it.) Bugfix on 0.2.0.9-alpha.
-    - Directory authorities should only automatically download Extra Info
-      documents if they're v1, v2, or v3 authorities. Bugfix on 0.1.2.x.
-
-  o Minor features:
-    - On the USR1 signal, when dmalloc is in use, log the top 10 memory
-      consumers. (We already do this on HUP.)
-    - Authorities and caches fetch the v2 networkstatus documents
-      less often, now that v3 is encouraged.
-    - Add a new config option BridgeRelay that specifies you want to
-      be a bridge relay. Right now the only difference is that it makes
-      you answer begin_dir requests, and it makes you cache dir info,
-      even if your DirPort isn't on.
-    - Add "GETINFO/desc-annotations/id/" so controllers can
-      ask about source, timestamp of arrival, purpose, etc. We need
-      something like this to help Vidalia not do GeoIP lookups on bridge
-      addresses.
-    - Allow multiple HashedControlPassword config lines, to support
-      multiple controller passwords.
-    - Authorities now decide whether they're authoritative for a given
-      router based on the router's purpose.
-    - New config options AuthDirBadDir and AuthDirListBadDirs for
-      authorities to mark certain relays as "bad directories" in the
-      networkstatus documents. Also supports the "!baddir" directive in
-      the approved-routers file.
-
-
-Changes in version 0.2.0.12-alpha - 2007-11-16
-  This twelfth development snapshot fixes some more build problems as
-  well as a few minor bugs.
-
-  o Compile fixes:
-    - Make it build on OpenBSD again. Patch from tup.
-    - Substitute BINDIR and LOCALSTATEDIR in scripts. Fixes
-      package-building for Red Hat, OS X, etc.
-
-  o Minor bugfixes (on 0.1.2.x):
-    - Changing the ExitPolicyRejectPrivate setting should cause us to
-      rebuild our server descriptor.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - When we're lacking a consensus, don't try to perform rendezvous
-      operations. Reported by Karsten Loesing.
-    - Fix a small memory leak whenever we decide against using a
-      newly picked entry guard. Reported by Mike Perry.
-    - When authorities detected more than two relays running on the same
-      IP address, they were clearing all the status flags but forgetting
-      to clear the "hsdir" flag. So clients were being told that a
-      given relay was the right choice for a v2 hsdir lookup, yet they
-      never had its descriptor because it was marked as 'not running'
-      in the consensus.
-    - If we're trying to fetch a bridge descriptor and there's no way
-      the bridge authority could help us (for example, we don't know
-      a digest, or there is no bridge authority), don't be so eager to
-      fall back to asking the bridge authority.
-    - If we're using bridges or have strictentrynodes set, and our
-      chosen exit is in the same family as all our bridges/entry guards,
-      then be flexible about families.
-
-  o Minor features:
-    - When we negotiate a v2 link-layer connection (not yet implemented),
-      accept RELAY_EARLY cells and turn them into RELAY cells if we've
-      negotiated a v1 connection for their next step. Initial code for
-      proposal 110.
-
-
-Changes in version 0.2.0.11-alpha - 2007-11-12
-  This eleventh development snapshot fixes some build problems with
-  the previous snapshot. It also includes a more secure-by-default exit
-  policy for relays, fixes an enormous memory leak for exit relays, and
-  fixes another bug where servers were falling out of the directory list.
-
-  o Security fixes:
-    - Exit policies now reject connections that are addressed to a
-      relay's public (external) IP address too, unless
-      ExitPolicyRejectPrivate is turned off. We do this because too
-      many relays are running nearby to services that trust them based
-      on network address. Bugfix on 0.1.2.x.
-
-  o Major bugfixes:
-    - Fix a memory leak on exit relays; we were leaking a cached_resolve_t
-      on every successful resolve. Reported by Mike Perry; bugfix
-      on 0.1.2.x.
-    - On authorities, never downgrade to old router descriptors simply
-      because they're listed in the consensus. This created a catch-22
-      where we wouldn't list a new descriptor because there was an
-      old one in the consensus, and we couldn't get the new one in the
-      consensus because we wouldn't list it. Possible fix for bug 548.
-      Also, this might cause bug 543 to appear on authorities; if so,
-      we'll need a band-aid for that. Bugfix on 0.2.0.9-alpha.
-
-  o Packaging fixes on 0.2.0.10-alpha:
-    - We were including instructions about what to do with the
-      src/config/fallback-consensus file, but we weren't actually
-      including it in the tarball. Disable all of that for now.
-
-  o Minor features:
-    - Allow people to say PreferTunnelledDirConns rather than
-      PreferTunneledDirConns, for those alternate-spellers out there.
-
-  o Minor bugfixes:
-    - Don't reevaluate all the information from our consensus document
-      just because we've downloaded a v2 networkstatus that we intend
-      to cache. Fixes bug 545; bugfix on 0.2.0.x.
-
-
-Changes in version 0.2.0.10-alpha - 2007-11-10
-  This tenth development snapshot adds a third v3 directory authority
-  run by Mike Perry, adds most of Karsten Loesing's new hidden service
-  descriptor format, fixes a bad crash bug and new bridge bugs introduced
-  in 0.2.0.9-alpha, fixes many bugs with the v3 directory implementation,
-  fixes some minor memory leaks in previous 0.2.0.x snapshots, and
-  addresses many more minor issues.
-
-  o New directory authorities:
-    - Set up ides (run by Mike Perry) as the third v3 directory authority.
-
-  o Major features:
-    - Allow tunnelled directory connections to ask for an encrypted
-      "begin_dir" connection or an anonymized "uses a full Tor circuit"
-      connection independently. Now we can make anonymized begin_dir
-      connections for (e.g.) more secure hidden service posting and
-      fetching.
-    - More progress on proposal 114: code from Karsten Loesing to
-      implement new hidden service descriptor format.
-    - Raise the default BandwidthRate/BandwidthBurst to 5MB/10MB, to
-      accommodate the growing number of servers that use the default
-      and are reaching it.
-    - Directory authorities use a new formula for selecting which nodes
-      to advertise as Guards: they must be in the top 7/8 in terms of
-      how long we have known about them, and above the median of those
-      nodes in terms of weighted fractional uptime.
-    - Make "not enough dir info yet" warnings describe *why* Tor feels
-      it doesn't have enough directory info yet.
-
-  o Major bugfixes:
-    - Stop servers from crashing if they set a Family option (or
-      maybe in other situations too). Bugfix on 0.2.0.9-alpha; reported
-      by Fabian Keil.
-    - Make bridge users work again -- the move to v3 directories in
-      0.2.0.9-alpha had introduced a number of bugs that made bridges
-      no longer work for clients.
-    - When the clock jumps forward a lot, do not allow the bandwidth
-      buckets to become negative. Bugfix on 0.1.2.x; fixes bug 544.
-
-  o Major bugfixes (v3 dir, bugfixes on 0.2.0.9-alpha):
-    - When the consensus lists a router descriptor that we previously were
-      mirroring, but that we considered non-canonical, reload the
-      descriptor as canonical. This fixes bug 543 where Tor servers
-      would start complaining after a few days that they don't have
-      enough directory information to build a circuit.
-    - Consider replacing the current consensus when certificates arrive
-      that make the pending consensus valid. Previously, we were only
-      considering replacement when the new certs _didn't_ help.
-    - Fix an assert error on startup if we didn't already have the
-      consensus and certs cached in our datadirectory: we were caching
-      the consensus in consensus_waiting_for_certs but then free'ing it
-      right after.
-    - Avoid sending a request for "keys/fp" (for which we'll get a 400 Bad
-      Request) if we need more v3 certs but we've already got pending
-      requests for all of them.
-    - Correctly back off from failing certificate downloads. Fixes
-      bug 546.
-    - Authorities don't vote on the Running flag if they have been running
-      for less than 30 minutes themselves. Fixes bug 547, where a newly
-      started authority would vote that everyone was down.
-
-  o New requirements:
-    - Drop support for OpenSSL version 0.9.6. Just about nobody was using
-      it, it had no AES, and it hasn't seen any security patches since
-      2004.
-
-  o Minor features:
-    - Clients now hold circuitless TLS connections open for 1.5 times
-      MaxCircuitDirtiness (15 minutes), since it is likely that they'll
-      rebuild a new circuit over them within that timeframe. Previously,
-      they held them open only for KeepalivePeriod (5 minutes).
-    - Use "If-Modified-Since" to avoid retrieving consensus
-      networkstatuses that we already have.
-    - When we have no consensus, check FallbackNetworkstatusFile (defaults
-      to $PREFIX/share/tor/fallback-consensus) for a consensus. This way
-      we start knowing some directory caches.
-    - When we receive a consensus from the future, warn about skew.
-    - Improve skew reporting: try to give the user a better log message
-      about how skewed they are, and how much this matters.
-    - When we have a certificate for an authority, believe that
-      certificate's claims about the authority's IP address.
-    - New --quiet command-line option to suppress the default console log.
-      Good in combination with --hash-password.
-    - Authorities send back an X-Descriptor-Not-New header in response to
-      an accepted-but-discarded descriptor upload. Partially implements
-      fix for bug 535.
-    - Make the log message for "tls error. breaking." more useful.
-    - Better log messages about certificate downloads, to attempt to
-      track down the second incarnation of bug 546.
-
-  o Minor features (bridges):
-    - If bridge users set UpdateBridgesFromAuthority, but the digest
-      they ask for is a 404 from the bridge authority, they now fall
-      back to trying the bridge directly.
-    - Bridges now use begin_dir to publish their server descriptor to
-      the bridge authority, even when they haven't set TunnelDirConns.
-
-  o Minor features (controller):
-    - When reporting clock skew, and we know that the clock is _at least
-      as skewed_ as some value, but we don't know the actual value,
-      report the value as a "minimum skew."
-
-  o Utilities:
-    - Update linux-tor-prio.sh script to allow QoS based on the uid of
-      the Tor process. Patch from Marco Bonetti with tweaks from Mike
-      Perry.
-
-  o Minor bugfixes:
-    - Refuse to start if both ORPort and UseBridges are set. Bugfix
-      on 0.2.0.x, suggested by Matt Edman.
-    - Don't stop fetching descriptors when FetchUselessDescriptors is
-      set, even if we stop asking for circuits. Bugfix on 0.1.2.x;
-      reported by tup and ioerror.
-    - Better log message on vote from unknown authority.
-    - Don't log "Launching 0 request for 0 router" message.
-
-  o Minor bugfixes (memory leaks):
-    - Stop leaking memory every time we parse a v3 certificate. Bugfix
-      on 0.2.0.1-alpha.
-    - Stop leaking memory every time we load a v3 certificate. Bugfix
-      on 0.2.0.1-alpha. Fixes bug 536.
-    - Stop leaking a cached networkstatus on exit. Bugfix on
-      0.2.0.3-alpha.
-    - Stop leaking voter information every time we free a consensus.
-      Bugfix on 0.2.0.3-alpha.
-    - Stop leaking signed data every time we check a voter signature.
-      Bugfix on 0.2.0.3-alpha.
-    - Stop leaking a signature every time we fail to parse a consensus or
-      a vote. Bugfix on 0.2.0.3-alpha.
-    - Stop leaking v2_download_status_map on shutdown. Bugfix on
-      0.2.0.9-alpha.
-    - Stop leaking conn->nickname every time we make a connection to a
-      Tor relay without knowing its expected identity digest (e.g. when
-      using bridges). Bugfix on 0.2.0.3-alpha.
-
-  - Minor bugfixes (portability):
-    - Run correctly on platforms where rlim_t is larger than unsigned
-      long, and/or where the real limit for number of open files is
-      OPEN_FILES, not rlim_max from getrlimit(RLIMIT_NOFILES). In
-      particular, these may be needed for OS X 10.5.
-
-
-Changes in version 0.1.2.18 - 2007-10-28
-  Tor 0.1.2.18 fixes many problems including crash bugs, problems with
-  hidden service introduction that were causing huge delays, and a big
-  bug that was causing some servers to disappear from the network status
-  lists for a few hours each day.
-
-  o Major bugfixes (crashes):
-    - If a connection is shut down abruptly because of something that
-      happened inside connection_flushed_some(), do not call
-      connection_finished_flushing(). Should fix bug 451:
-      "connection_stop_writing: Assertion conn->write_event failed"
-      Bugfix on 0.1.2.7-alpha.
-    - Fix possible segfaults in functions called from
-      rend_process_relay_cell().
-
-  o Major bugfixes (hidden services):
-    - Hidden services were choosing introduction points uniquely by
-      hexdigest, but when constructing the hidden service descriptor
-      they merely wrote the (potentially ambiguous) nickname.
-    - Clients now use the v2 intro format for hidden service
-      connections: they specify their chosen rendezvous point by identity
-      digest rather than by (potentially ambiguous) nickname. These
-      changes could speed up hidden service connections dramatically.
-
-  o Major bugfixes (other):
-    - Stop publishing a new server descriptor just because we get a
-      HUP signal. This led (in a roundabout way) to some servers getting
-      dropped from the networkstatus lists for a few hours each day.
-    - When looking for a circuit to cannibalize, consider family as well
-      as identity. Fixes bug 438. Bugfix on 0.1.0.x (which introduced
-      circuit cannibalization).
-    - When a router wasn't listed in a new networkstatus, we were leaving
-      the flags for that router alone -- meaning it remained Named,
-      Running, etc -- even though absence from the networkstatus means
-      that it shouldn't be considered to exist at all anymore. Now we
-      clear all the flags for routers that fall out of the networkstatus
-      consensus. Fixes bug 529.
-
-  o Minor bugfixes:
-    - Don't try to access (or alter) the state file when running
-      --list-fingerprint or --verify-config or --hash-password. Resolves
-      bug 499.
-    - When generating information telling us how to extend to a given
-      router, do not try to include the nickname if it is
-      absent. Resolves bug 467.
-    - Fix a user-triggerable segfault in expand_filename(). (There isn't
-      a way to trigger this remotely.)
-    - When sending a status event to the controller telling it that an
-      OR address is reachable, set the port correctly. (Previously we
-      were reporting the dir port.)
-    - Fix a minor memory leak whenever a controller sends the PROTOCOLINFO
-      command. Bugfix on 0.1.2.17.
-    - When loading bandwidth history, do not believe any information in
-      the future. Fixes bug 434.
-    - When loading entry guard information, do not believe any information
-      in the future.
-    - When we have our clock set far in the future and generate an
-      onion key, then re-set our clock to be correct, we should not stop
-      the onion key from getting rotated.
-    - On some platforms, accept() can return a broken address. Detect
-      this more quietly, and deal accordingly. Fixes bug 483.
-    - It's not actually an error to find a non-pending entry in the DNS
-      cache when canceling a pending resolve. Don't log unless stuff
-      is fishy. Resolves bug 463.
-    - Don't reset trusted dir server list when we set a configuration
-      option. Patch from Robert Hogan.
-    - Don't try to create the datadir when running --verify-config or
-      --hash-password. Resolves bug 540.
-
-
-Changes in version 0.2.0.9-alpha - 2007-10-24
-  This ninth development snapshot switches clients to the new v3 directory
-  system; allows servers to be listed in the network status even when they
-  have the same nickname as a registered server; and fixes many other
-  bugs including a big one that was causing some servers to disappear
-  from the network status lists for a few hours each day.
-
-  o Major features (directory system):
-    - Clients now download v3 consensus networkstatus documents instead
-      of v2 networkstatus documents. Clients and caches now base their
-      opinions about routers on these consensus documents. Clients only
-      download router descriptors listed in the consensus.
-    - Authorities now list servers who have the same nickname as
-      a different named server, but list them with a new flag,
-      "Unnamed". Now we can list servers that happen to pick the same
-      nickname as a server that registered two years ago and then
-      disappeared. Partially implements proposal 122.
-    - If the consensus lists a router as "Unnamed", the name is assigned
-      to a different router: do not identify the router by that name.
-      Partially implements proposal 122.
-    - Authorities can now come to a consensus on which method to use to
-      compute the consensus. This gives us forward compatibility.
-
-  o Major bugfixes:
-    - Stop publishing a new server descriptor just because we HUP or
-      when we find our DirPort to be reachable but won't actually publish
-      it. New descriptors without any real changes are dropped by the
-      authorities, and can screw up our "publish every 18 hours" schedule.
-      Bugfix on 0.1.2.x.
-    - When a router wasn't listed in a new networkstatus, we were leaving
-      the flags for that router alone -- meaning it remained Named,
-      Running, etc -- even though absence from the networkstatus means
-      that it shouldn't be considered to exist at all anymore. Now we
-      clear all the flags for routers that fall out of the networkstatus
-      consensus. Fixes bug 529; bugfix on 0.1.2.x.
-    - Fix awful behavior in DownloadExtraInfo option where we'd fetch
-      extrainfo documents and then discard them immediately for not
-      matching the latest router. Bugfix on 0.2.0.1-alpha.
-
-  o Minor features (v3 directory protocol):
-    - Allow tor-gencert to generate a new certificate without replacing
-      the signing key.
-    - Allow certificates to include an address.
-    - When we change our directory-cache settings, reschedule all voting
-      and download operations.
-    - Reattempt certificate downloads immediately on failure, as long as
-      we haven't failed a threshold number of times yet.
-    - Delay retrying consensus downloads while we're downloading
-      certificates to verify the one we just got. Also, count getting a
-      consensus that we already have (or one that isn't valid) as a failure,
-      and count failing to get the certificates after 20 minutes as a
-      failure.
-    - Build circuits and download descriptors even if our consensus is a
-      little expired. (This feature will go away once authorities are
-      more reliable.)
-
-  o Minor features (router descriptor cache):
-    - If we find a cached-routers file that's been sitting around for more
-      than 28 days unmodified, then most likely it's a leftover from
-      when we upgraded to 0.2.0.8-alpha. Remove it. It has no good
-      routers anyway.
-    - When we (as a cache) download a descriptor because it was listed
-      in a consensus, remember when the consensus was supposed to expire,
-      and don't expire the descriptor until then.
-
-  o Minor features (performance):
-    - Call routerlist_remove_old_routers() much less often. This should
-      speed startup, especially on directory caches.
-    - Don't try to launch new descriptor downloads quite so often when we
-      already have enough directory information to build circuits.
-    - Base64 decoding was actually showing up on our profile when parsing
-      the initial descriptor file; switch to an in-process all-at-once
-      implementation that's about 3.5x times faster than calling out to
-      OpenSSL.
-
-  o Minor features (compilation):
-    - Detect non-ASCII platforms (if any still exist) and refuse to
-      build there: some of our code assumes that 'A' is 65 and so on.
-
-  o Minor bugfixes (v3 directory authorities, bugfixes on 0.2.0.x):
-    - Make the "next period" votes into "current period" votes immediately
-      after publishing the consensus; avoid a heisenbug that made them
-      stick around indefinitely.
-    - When we discard a vote as a duplicate, do not report this as
-      an error.
-    - Treat missing v3 keys or certificates as an error when running as a
-      v3 directory authority.
-    - When we're configured to be a v3 authority, but we're only listed
-      as a non-v3 authority in our DirServer line for ourself, correct
-      the listing.
-    - If an authority doesn't have a qualified hostname, just put
-      its address in the vote. This fixes the problem where we referred to
-      "moria on moria:9031."
-    - Distinguish between detached signatures for the wrong period, and
-      detached signatures for a divergent vote.
-    - Fix a small memory leak when computing a consensus.
-    - When there's no concensus, we were forming a vote every 30
-      minutes, but writing the "valid-after" line in our vote based
-      on our configured V3AuthVotingInterval: so unless the intervals
-      matched up, we immediately rejected our own vote because it didn't
-      start at the voting interval that caused us to construct a vote.
-
-  o Minor bugfixes (v3 directory protocol, bugfixes on 0.2.0.x):
-    - Delete unverified-consensus when the real consensus is set.
-    - Consider retrying a consensus networkstatus fetch immediately
-      after one fails: don't wait 60 seconds to notice.
-    - When fetching a consensus as a cache, wait until a newer consensus
-      should exist before trying to replace the current one.
-    - Use a more forgiving schedule for retrying failed consensus
-      downloads than for other types.
-
-  o Minor bugfixes (other directory issues):
-    - Correct the implementation of "download votes by digest." Bugfix on
-      0.2.0.8-alpha.
-    - Authorities no longer send back "400 you're unreachable please fix
-      it" errors to Tor servers that aren't online all the time. We're
-      supposed to tolerate these servers now. Bugfix on 0.1.2.x.
-
-  o Minor bugfixes (controller):
-    - Don't reset trusted dir server list when we set a configuration
-      option. Patch from Robert Hogan; bugfix on 0.1.2.x.
-    - Respond to INT and TERM SIGNAL commands before we execute the
-      signal, in case the signal shuts us down. We had a patch in
-      0.1.2.1-alpha that tried to do this by queueing the response on
-      the connection's buffer before shutting down, but that really
-      isn't the same thing at all. Bug located by Matt Edman.
-
-  o Minor bugfixes (misc):
-    - Correctly check for bad options to the "PublishServerDescriptor"
-      config option. Bugfix on 0.2.0.1-alpha; reported by Matt Edman.
-    - Stop leaking memory on failing case of base32_decode, and make
-      it accept upper-case letters. Bugfixes on 0.2.0.7-alpha.
-    - Don't try to download extrainfo documents when we're trying to
-      fetch enough directory info to build a circuit: having enough
-      info should get priority. Bugfix on 0.2.0.x.
-    - Don't complain that "your server has not managed to confirm that its
-      ports are reachable" if we haven't been able to build any circuits
-      yet. Bug found by spending four hours without a v3 consensus. Bugfix
-      on 0.1.2.x.
-    - Detect the reason for failing to mmap a descriptor file we just
-      wrote, and give a more useful log message. Fixes bug 533. Bugfix
-      on 0.1.2.x.
-
-  o Code simplifications and refactoring:
-    - Remove support for the old bw_accounting file: we've been storing
-      bandwidth accounting information in the state file since
-      0.1.2.5-alpha. This may result in bandwidth accounting errors
-      if you try to upgrade from 0.1.1.x or earlier, or if you try to
-      downgrade to 0.1.1.x or earlier.
-    - New convenience code to locate a file within the DataDirectory.
-    - Move non-authority functionality out of dirvote.c.
-    - Refactor the arguments for router_pick_{directory_|trusteddir}server
-      so that they all take the same named flags.
-
-  o Utilities
-    - Include the "tor-ctrl.sh" bash script by Stefan Behte to provide
-      Unix users an easy way to script their Tor process (e.g. by
-      adjusting bandwidth based on the time of the day).
-
-
-Changes in version 0.2.0.8-alpha - 2007-10-12
-  This eighth development snapshot fixes a crash bug that's been bothering
-  us since February 2007, lets bridge authorities store a list of bridge
-  descriptors they've seen, gets v3 directory voting closer to working,
-  starts caching v3 directory consensus documents on directory mirrors,
-  and fixes a variety of smaller issues including some minor memory leaks.
-
-  o Major features (router descriptor cache):
-    - Store routers in a file called cached-descriptors instead of in
-      cached-routers. Initialize cached-descriptors from cached-routers
-      if the old format is around. The new format allows us to store
-      annotations along with descriptors.
-    - Use annotations to record the time we received each descriptor, its
-      source, and its purpose.
-    - Disable the SETROUTERPURPOSE controller command: it is now
-      obsolete.
-    - Controllers should now specify cache=no or cache=yes when using
-      the +POSTDESCRIPTOR command.
-    - Bridge authorities now write bridge descriptors to disk, meaning
-      we can export them to other programs and begin distributing them
-      to blocked users.
-
-  o Major features (directory authorities):
-    - When a v3 authority is missing votes or signatures, it now tries
-      to fetch them.
-    - Directory authorities track weighted fractional uptime as well as
-      weighted mean-time-between failures. WFU is suitable for deciding
-      whether a node is "usually up", while MTBF is suitable for deciding
-      whether a node is "likely to stay up." We need both, because
-      "usually up" is a good requirement for guards, while "likely to
-      stay up" is a good requirement for long-lived connections.
-
-  o Major features (v3 directory system):
-    - Caches now download v3 network status documents as needed,
-      and download the descriptors listed in them.
-    - All hosts now attempt to download and keep fresh v3 authority
-      certificates, and re-attempt after failures.
-    - More internal-consistency checks for vote parsing.
-
-  o Major bugfixes (crashes):
-    - If a connection is shut down abruptly because of something that
-      happened inside connection_flushed_some(), do not call
-      connection_finished_flushing(). Should fix bug 451. Bugfix on
-      0.1.2.7-alpha.
-
-  o Major bugfixes (performance):
-    - Fix really bad O(n^2) performance when parsing a long list of
-      routers: Instead of searching the entire list for an "extra-info "
-      string which usually wasn't there, once for every routerinfo
-      we read, just scan lines forward until we find one we like.
-      Bugfix on 0.2.0.1.
-    - When we add data to a write buffer in response to the data on that
-      write buffer getting low because of a flush, do not consider the
-      newly added data as a candidate for immediate flushing, but rather
-      make it wait until the next round of writing. Otherwise, we flush
-      and refill recursively, and a single greedy TLS connection can
-      eat all of our bandwidth. Bugfix on 0.1.2.7-alpha.
-
-  o Minor features (v3 authority system):
-    - Add more ways for tools to download the votes that lead to the
-      current consensus.
-    - Send a 503 when low on bandwidth and a vote, consensus, or
-      certificate is requested.
-    - If-modified-since is now implemented properly for all kinds of
-      certificate requests.
-
-  o Minor bugfixes (network statuses):
-    - Tweak the implementation of proposal 109 slightly: allow at most
-      two Tor servers on the same IP address, except if it's the location
-      of a directory authority, in which case allow five. Bugfix on
-      0.2.0.3-alpha.
-
-  o Minor bugfixes (controller):
-    - When sending a status event to the controller telling it that an
-      OR address is reachable, set the port correctly. (Previously we
-      were reporting the dir port.) Bugfix on 0.1.2.x.
-
-  o Minor bugfixes (v3 directory system):
-    - Fix logic to look up a cert by its signing key digest. Bugfix on
-      0.2.0.7-alpha.
-    - Only change the reply to a vote to "OK" if it's not already
-      set. This gets rid of annoying "400 OK" log messages, which may
-      have been masking some deeper issue. Bugfix on 0.2.0.7-alpha.
-    - When we get a valid consensus, recompute the voting schedule.
-    - Base the valid-after time of a vote on the consensus voting
-      schedule, not on our preferred schedule.
-    - Make the return values and messages from signature uploads and
-      downloads more sensible.
-    - Fix a memory leak when serving votes and consensus documents, and
-      another when serving certificates.
-
-  o Minor bugfixes (performance):
-    - Use a slightly simpler string hashing algorithm (copying Python's
-      instead of Java's) and optimize our digest hashing algorithm to take
-      advantage of 64-bit platforms and to remove some possibly-costly
-      voodoo.
-    - Fix a minor memory leak whenever we parse guards from our state
-      file. Bugfix on 0.2.0.7-alpha.
-    - Fix a minor memory leak whenever we write out a file. Bugfix on
-      0.2.0.7-alpha.
-    - Fix a minor memory leak whenever a controller sends the PROTOCOLINFO
-      command. Bugfix on 0.2.0.5-alpha.
-
-  o Minor bugfixes (portability):
-    - On some platforms, accept() can return a broken address. Detect
-      this more quietly, and deal accordingly. Fixes bug 483.
-    - Stop calling tor_strlower() on uninitialized memory in some cases.
-      Bugfix in 0.2.0.7-alpha.
-
-  o Minor bugfixes (usability):
-    - Treat some 403 responses from directory servers as INFO rather than
-      WARN-severity events.
-    - It's not actually an error to find a non-pending entry in the DNS
-      cache when canceling a pending resolve. Don't log unless stuff is
-      fishy. Resolves bug 463.
-
-  o Minor bugfixes (anonymity):
-    - Never report that we've used more bandwidth than we're willing to
-      relay: it leaks how much non-relay traffic we're using. Resolves
-      bug 516.
-    - When looking for a circuit to cannibalize, consider family as well
-      as identity. Fixes bug 438. Bugfix on 0.1.0.x (which introduced
-      circuit cannibalization).
-
-  o Code simplifications and refactoring:
-    - Make a bunch of functions static. Remove some dead code.
-    - Pull out about a third of the really big routerlist.c; put it in a
-      new module, networkstatus.c.
-    - Merge the extra fields in local_routerstatus_t back into
-      routerstatus_t: we used to need one routerstatus_t for each
-      authority's opinion, plus a local_routerstatus_t for the locally
-      computed consensus opinion. To save space, we put the locally
-      modified fields into local_routerstatus_t, and only the common
-      stuff into routerstatus_t. But once v3 directories are in use,
-      clients and caches will no longer need to hold authority opinions;
-      thus, the rationale for keeping the types separate is now gone.
-    - Make the code used to reschedule and reattempt downloads more
-      uniform.
-    - Turn all 'Are we a directory server/mirror?' logic into a call to
-      dirserver_mode().
-    - Remove the code to generate the oldest (v1) directory format.
-      The code has been disabled since 0.2.0.5-alpha.
-
-
-Changes in version 0.2.0.7-alpha - 2007-09-21
-  This seventh development snapshot makes bridges work again, makes bridge
-  authorities work for the first time, fixes two huge performance flaws
-  in hidden services, and fixes a variety of minor issues.
-
-  o New directory authorities:
-    - Set up moria1 and tor26 as the first v3 directory authorities. See
-      doc/spec/dir-spec.txt for details on the new directory design.
-
-  o Major bugfixes (crashes):
-    - Fix possible segfaults in functions called from
-      rend_process_relay_cell(). Bugfix on 0.1.2.x.
-
-  o Major bugfixes (bridges):
-    - Fix a bug that made servers send a "404 Not found" in response to
-      attempts to fetch their server descriptor. This caused Tor servers
-      to take many minutes to establish reachability for their DirPort,
-      and it totally crippled bridges. Bugfix on 0.2.0.5-alpha.
-    - Make "UpdateBridgesFromAuthority" torrc option work: when bridge
-      users configure that and specify a bridge with an identity
-      fingerprint, now they will lookup the bridge descriptor at the
-      default bridge authority via a one-hop tunnel, but once circuits
-      are established they will switch to a three-hop tunnel for later
-      connections to the bridge authority. Bugfix in 0.2.0.3-alpha.
-
-  o Major bugfixes (hidden services):
-    - Hidden services were choosing introduction points uniquely by
-      hexdigest, but when constructing the hidden service descriptor
-      they merely wrote the (potentially ambiguous) nickname.
-    - Clients now use the v2 intro format for hidden service
-      connections: they specify their chosen rendezvous point by identity
-      digest rather than by (potentially ambiguous) nickname. Both
-      are bugfixes on 0.1.2.x, and they could speed up hidden service
-      connections dramatically. Thanks to Karsten Loesing.
-
-  o Minor features (security):
-    - As a client, do not believe any server that tells us that an
-      address maps to an internal address space.
-    - Make it possible to enable HashedControlPassword and
-      CookieAuthentication at the same time.
-
-  o Minor features (guard nodes):
-    - Tag every guard node in our state file with the version that
-      we believe added it, or with our own version if we add it. This way,
-      if a user temporarily runs an old version of Tor and then switches
-      back to a new one, she doesn't automatically lose her guards.
-
-  o Minor features (speed):
-    - When implementing AES counter mode, update only the portions of the
-      counter buffer that need to change, and don't keep separate
-      network-order and host-order counters when they are the same (i.e.,
-      on big-endian hosts.)
-
-  o Minor features (controller):
-    - Accept LF instead of CRLF on controller, since some software has a
-      hard time generating real Internet newlines.
-    - Add GETINFO values for the server status events
-      "REACHABILITY_SUCCEEDED" and "GOOD_SERVER_DESCRIPTOR". Patch from
-      Robert Hogan.
-
-  o Removed features:
-     - Routers no longer include bandwidth-history lines in their
-       descriptors; this information is already available in extra-info
-       documents, and including it in router descriptors took up 60%
-       (!) of compressed router descriptor downloads. Completes
-       implementation of proposal 104.
-     - Remove the contrib scripts ExerciseServer.py, PathDemo.py,
-       and TorControl.py, as they use the old v0 controller protocol,
-       and are obsoleted by TorFlow anyway.
-     - Drop support for v1 rendezvous descriptors, since we never used
-       them anyway, and the code has probably rotted by now. Based on
-       patch from Karsten Loesing.
-     - On OSX, stop warning the user that kqueue support in libevent is
-      "experimental", since it seems to have worked fine for ages.
-
-  o Minor bugfixes:
-    - When generating information telling us how to extend to a given
-      router, do not try to include the nickname if it is absent. Fixes
-      bug 467. Bugfix on 0.2.0.3-alpha.
-    - Fix a user-triggerable (but not remotely-triggerable) segfault
-      in expand_filename(). Bugfix on 0.1.2.x.
-    - Fix a memory leak when freeing incomplete requests from DNSPort.
-      Found by Niels Provos with valgrind. Bugfix on 0.2.0.1-alpha.
-    - Don't try to access (or alter) the state file when running
-      --list-fingerprint or --verify-config or --hash-password. (Resolves
-      bug 499.) Bugfix on 0.1.2.x.
-    - Servers used to decline to publish their DirPort if their
-      BandwidthRate, RelayBandwidthRate, or MaxAdvertisedBandwidth
-      were below a threshold. Now they only look at BandwidthRate and
-      RelayBandwidthRate. Bugfix on 0.1.2.x.
-    - Remove an optimization in the AES counter-mode code that assumed
-      that the counter never exceeded 2^68. When the counter can be set
-      arbitrarily as an IV (as it is by Karsten's new hidden services
-      code), this assumption no longer holds. Bugfix on 0.1.2.x.
-    - Resume listing "AUTHORITY" flag for authorities in network status.
-      Bugfix on 0.2.0.3-alpha; reported by Alex de Joode.
-
-  o Code simplifications and refactoring:
-    - Revamp file-writing logic so we don't need to have the entire
-      contents of a file in memory at once before we write to disk. Tor,
-      meet stdio.
-    - Turn "descriptor store" into a full-fledged type.
-    - Move all NT services code into a separate source file.
-    - Unify all code that computes medians, percentile elements, etc.
-    - Get rid of a needless malloc when parsing address policies.
-
-
-Changes in version 0.1.2.17 - 2007-08-30
-  Tor 0.1.2.17 features a new Vidalia version in the Windows and OS
-  X bundles. Vidalia 0.0.14 makes authentication required for the
-  ControlPort in the default configuration, which addresses important
-  security risks. Everybody who uses Vidalia (or another controller)
-  should upgrade.
-
-  In addition, this Tor update fixes major load balancing problems with
-  path selection, which should speed things up a lot once many people
-  have upgraded.
-
-  o Major bugfixes (security):
-    - We removed support for the old (v0) control protocol. It has been
-      deprecated since Tor 0.1.1.1-alpha, and keeping it secure has
-      become more of a headache than it's worth.
-
-  o Major bugfixes (load balancing):
-    - When choosing nodes for non-guard positions, weight guards
-      proportionally less, since they already have enough load. Patch
-      from Mike Perry.
-    - Raise the "max believable bandwidth" from 1.5MB/s to 10MB/s. This
-      will allow fast Tor servers to get more attention.
-    - When we're upgrading from an old Tor version, forget our current
-      guards and pick new ones according to the new weightings. These
-      three load balancing patches could raise effective network capacity
-      by a factor of four. Thanks to Mike Perry for measurements.
-
-  o Major bugfixes (stream expiration):
-    - Expire not-yet-successful application streams in all cases if
-      they've been around longer than SocksTimeout. Right now there are
-      some cases where the stream will live forever, demanding a new
-      circuit every 15 seconds. Fixes bug 454; reported by lodger.
-
-  o Minor features (controller):
-    - Add a PROTOCOLINFO controller command. Like AUTHENTICATE, it
-      is valid before any authentication has been received. It tells
-      a controller what kind of authentication is expected, and what
-      protocol is spoken. Implements proposal 119.
-
-  o Minor bugfixes (performance):
-    - Save on most routerlist_assert_ok() calls in routerlist.c, thus
-      greatly speeding up loading cached-routers from disk on startup.
-    - Disable sentinel-based debugging for buffer code: we squashed all
-      the bugs that this was supposed to detect a long time ago, and now
-      its only effect is to change our buffer sizes from nice powers of
-      two (which platform mallocs tend to like) to values slightly over
-      powers of two (which make some platform mallocs sad).
-
-  o Minor bugfixes (misc):
-    - If exit bandwidth ever exceeds one third of total bandwidth, then
-      use the correct formula to weight exit nodes when choosing paths.
-      Based on patch from Mike Perry.
-    - Choose perfectly fairly among routers when choosing by bandwidth and
-      weighting by fraction of bandwidth provided by exits. Previously, we
-      would choose with only approximate fairness, and correct ourselves
-      if we ran off the end of the list.
-    - If we require CookieAuthentication but we fail to write the
-      cookie file, we would warn but not exit, and end up in a state
-      where no controller could authenticate. Now we exit.
-    - If we require CookieAuthentication, stop generating a new cookie
-      every time we change any piece of our config.
-    - Refuse to start with certain directory authority keys, and
-      encourage people using them to stop.
-    - Terminate multi-line control events properly. Original patch
-      from tup.
-    - Fix a minor memory leak when we fail to find enough suitable
-      servers to choose a circuit.
-    - Stop leaking part of the descriptor when we run into a particularly
-      unparseable piece of it.
-
-
-Changes in version 0.2.0.6-alpha - 2007-08-26
-  This sixth development snapshot features a new Vidalia version in the
-  Windows and OS X bundles. Vidalia 0.0.14 makes authentication required for
-  the ControlPort in the default configuration, which addresses important
-  security risks.
-
-  In addition, this snapshot fixes major load balancing problems
-  with path selection, which should speed things up a lot once many
-  people have upgraded. The directory authorities also use a new
-  mean-time-between-failure approach to tracking which servers are stable,
-  rather than just looking at the most recent uptime.
-
-  o New directory authorities:
-    - Set up Tonga as the default bridge directory authority.
-
-  o Major features:
-    - Directory authorities now track servers by weighted
-      mean-times-between-failures. When we have 4 or more days of data,
-      use measured MTBF rather than declared uptime to decide whether
-      to call a router Stable. Implements proposal 108.
-
-  o Major bugfixes (load balancing):
-    - When choosing nodes for non-guard positions, weight guards
-      proportionally less, since they already have enough load. Patch
-      from Mike Perry.
-    - Raise the "max believable bandwidth" from 1.5MB/s to 10MB/s. This
-      will allow fast Tor servers to get more attention.
-    - When we're upgrading from an old Tor version, forget our current
-      guards and pick new ones according to the new weightings. These
-      three load balancing patches could raise effective network capacity
-      by a factor of four. Thanks to Mike Perry for measurements.
-
-  o Major bugfixes (descriptor parsing):
-    - Handle unexpected whitespace better in malformed descriptors. Bug
-      found using Benedikt Boss's new Tor fuzzer! Bugfix on 0.2.0.x.
-
-  o Minor features:
-    - There is now an ugly, temporary "desc/all-recent-extrainfo-hack"
-      GETINFO for Torstat to use until it can switch to using extrainfos.
-    - Optionally (if built with -DEXPORTMALLINFO) export the output
-      of mallinfo via http, as tor/mallinfo.txt. Only accessible
-      from localhost.
-
-  o Minor bugfixes:
-    - Do not intermix bridge routers with controller-added
-      routers. (Bugfix on 0.2.0.x)
-    - Do not fail with an assert when accept() returns an unexpected
-      address family. Addresses but does not wholly fix bug 483. (Bugfix
-      on 0.2.0.x)
-    - Let directory authorities startup even when they can't generate
-      a descriptor immediately, e.g. because they don't know their
-      address.
-    - Stop putting the authentication cookie in a file called "0"
-      in your working directory if you don't specify anything for the
-      new CookieAuthFile option. Reported by Matt Edman.
-    - Make it possible to read the PROTOCOLINFO response in a way that
-      conforms to our control-spec. Reported by Matt Edman.
-    - Fix a minor memory leak when we fail to find enough suitable
-      servers to choose a circuit. Bugfix on 0.1.2.x.
-    - Stop leaking part of the descriptor when we run into a particularly
-      unparseable piece of it. Bugfix on 0.1.2.x.
-    - Unmap the extrainfo cache file on exit.
-
-
-Changes in version 0.2.0.5-alpha - 2007-08-19
-  This fifth development snapshot fixes compilation on Windows again;
-  fixes an obnoxious client-side bug that slowed things down and put
-  extra load on the network; gets us closer to using the v3 directory
-  voting scheme; makes it easier for Tor controllers to use cookie-based
-  authentication; and fixes a variety of other bugs.
-
-  o Removed features:
-    - Version 1 directories are no longer generated in full. Instead,
-      authorities generate and serve "stub" v1 directories that list
-      no servers. This will stop Tor versions 0.1.0.x and earlier from
-      working, but (for security reasons) nobody should be running those
-      versions anyway.
-
-  o Major bugfixes (compilation, 0.2.0.x):
-    - Try to fix Win32 compilation again: improve checking for IPv6 types.
-    - Try to fix MSVC compilation: build correctly on platforms that do
-      not define s6_addr16 or s6_addr32.
-    - Fix compile on platforms without getaddrinfo: bug found by Li-Hui
-      Zhou.
-
-  o Major bugfixes (stream expiration):
-    - Expire not-yet-successful application streams in all cases if
-      they've been around longer than SocksTimeout. Right now there are
-      some cases where the stream will live forever, demanding a new
-      circuit every 15 seconds. Bugfix on 0.1.2.7-alpha; fixes bug 454;
-      reported by lodger.
-
-  o Minor features (directory servers):
-    - When somebody requests a list of statuses or servers, and we have
-      none of those, return a 404 rather than an empty 200.
-
-  o Minor features (directory voting):
-    - Store v3 consensus status consensuses on disk, and reload them
-      on startup.
-
-  o Minor features (security):
-    - Warn about unsafe ControlPort configurations.
-    - Refuse to start with certain directory authority keys, and
-      encourage people using them to stop.
-
-  o Minor features (controller):
-    - Add a PROTOCOLINFO controller command. Like AUTHENTICATE, it
-      is valid before any authentication has been received. It tells
-      a controller what kind of authentication is expected, and what
-      protocol is spoken. Implements proposal 119.
-    - New config option CookieAuthFile to choose a new location for the
-      cookie authentication file, and config option
-      CookieAuthFileGroupReadable to make it group-readable.
-
-  o Minor features (unit testing):
-    - Add command-line arguments to unit-test executable so that we can
-      invoke any chosen test from the command line rather than having
-      to run the whole test suite at once; and so that we can turn on
-      logging for the unit tests.
-
-  o Minor bugfixes (on 0.1.2.x):
-    - If we require CookieAuthentication but we fail to write the
-      cookie file, we would warn but not exit, and end up in a state
-      where no controller could authenticate. Now we exit.
-    - If we require CookieAuthentication, stop generating a new cookie
-      every time we change any piece of our config.
-    - When loading bandwidth history, do not believe any information in
-      the future. Fixes bug 434.
-    - When loading entry guard information, do not believe any information
-      in the future.
-    - When we have our clock set far in the future and generate an
-      onion key, then re-set our clock to be correct, we should not stop
-      the onion key from getting rotated.
-    - Clean up torrc sample config file.
-    - Do not automatically run configure from autogen.sh. This
-      non-standard behavior tended to annoy people who have built other
-      programs.
-
-  o Minor bugfixes (on 0.2.0.x):
-    - Fix a bug with AutomapHostsOnResolve that would always cause
-      the second request to fail. Bug reported by Kate. Bugfix on
-      0.2.0.3-alpha.
-    - Fix a bug in ADDRMAP controller replies that would sometimes
-      try to print a NULL. Patch from tup.
-    - Read v3 directory authority keys from the right location.
-    - Numerous bugfixes to directory voting code.
-
-
-Changes in version 0.1.2.16 - 2007-08-01
-  Tor 0.1.2.16 fixes a critical security vulnerability that allows a
-  remote attacker in certain situations to rewrite the user's torrc
-  configuration file. This can completely compromise anonymity of users
-  in most configurations, including those running the Vidalia bundles,
-  TorK, etc. Or worse.
-
-  o Major security fixes:
-    - Close immediately after missing authentication on control port;
-      do not allow multiple authentication attempts.
-
-
-Changes in version 0.2.0.4-alpha - 2007-08-01
-  This fourth development snapshot fixes a critical security vulnerability
-  for most users, specifically those running Vidalia, TorK, etc. Everybody
-  should upgrade to either 0.1.2.16 or 0.2.0.4-alpha.
-
-  o Major security fixes:
-    - Close immediately after missing authentication on control port;
-      do not allow multiple authentication attempts.
-
-  o Major bugfixes (compilation):
-    - Fix win32 compilation: apparently IN_ADDR and IN6_ADDR are already
-      defined there.
-
-  o Minor features (performance):
-    - Be even more aggressive about releasing RAM from small
-      empty buffers. Thanks to our free-list code, this shouldn't be too
-      performance-intensive.
-    - Disable sentinel-based debugging for buffer code: we squashed all
-      the bugs that this was supposed to detect a long time ago, and
-      now its only effect is to change our buffer sizes from nice
-      powers of two (which platform mallocs tend to like) to values
-      slightly over powers of two (which make some platform mallocs sad).
-    - Log malloc statistics from mallinfo() on platforms where it
-      exists.
-
-
-Changes in version 0.2.0.3-alpha - 2007-07-29
-  This third development snapshot introduces new experimental
-  blocking-resistance features and a preliminary version of the v3
-  directory voting design, and includes many other smaller features
-  and bugfixes.
-
-  o Major features:
-    - The first pieces of our "bridge" design for blocking-resistance
-      are implemented. People can run bridge directory authorities;
-      people can run bridges; and people can configure their Tor clients
-      with a set of bridges to use as the first hop into the Tor network.
-      See http://archives.seul.org/or/talk/Jul-2007/msg00249.html for
-      details.
-    - Create listener connections before we setuid to the configured
-      User and Group. Now non-Windows users can choose port values
-      under 1024, start Tor as root, and have Tor bind those ports
-      before it changes to another UID. (Windows users could already
-      pick these ports.)
-    - Added a new ConstrainedSockets config option to set SO_SNDBUF and
-      SO_RCVBUF on TCP sockets. Hopefully useful for Tor servers running
-      on "vserver" accounts. (Patch from coderman.)
-    - Be even more aggressive about separating local traffic from relayed
-      traffic when RelayBandwidthRate is set. (Refines proposal 111.)
-
-  o Major features (experimental):
-    - First cut of code for "v3 dir voting": directory authorities will
-      vote on a common network status document rather than each publishing
-      their own opinion. This code needs more testing and more corner-case
-      handling before it's ready for use.
-
-  o Security fixes:
-    - Directory authorities now call routers Fast if their bandwidth is
-      at least 100KB/s, and consider their bandwidth adequate to be a
-      Guard if it is at least 250KB/s, no matter the medians. This fix
-      complements proposal 107. [Bugfix on 0.1.2.x]
-    - Directory authorities now never mark more than 3 servers per IP as
-      Valid and Running. (Implements proposal 109, by Kevin Bauer and
-      Damon McCoy.)
-    - Minor change to organizationName and commonName generation
-      procedures in TLS certificates during Tor handshakes, to invalidate
-      some earlier censorware approaches. This is not a long-term
-      solution, but applying it will give us a bit of time to look into
-      the epidemiology of countermeasures as they spread.
-
-  o Major bugfixes (directory):
-    - Rewrite directory tokenization code to never run off the end of
-      a string. Fixes bug 455. Patch from croup. [Bugfix on 0.1.2.x]
-
-  o Minor features (controller):
-    - Add a SOURCE_ADDR field to STREAM NEW events so that controllers can
-      match requests to applications. (Patch from Robert Hogan.)
-    - Report address and port correctly on connections to DNSPort. (Patch
-      from Robert Hogan.)
-    - Add a RESOLVE command to launch hostname lookups. (Original patch
-      from Robert Hogan.)
-    - Add GETINFO status/enough-dir-info to let controllers tell whether
-      Tor has downloaded sufficient directory information. (Patch
-      from Tup.)
-    - You can now use the ControlSocket option to tell Tor to listen for
-      controller connections on Unix domain sockets on systems that
-      support them. (Patch from Peter Palfrader.)
-    - STREAM NEW events are generated for DNSPort requests and for
-      tunneled directory connections. (Patch from Robert Hogan.)
-    - New "GETINFO address-mappings/*" command to get address mappings
-      with expiry information. "addr-mappings/*" is now deprecated.
-      (Patch from Tup.)
-
-  o Minor features (misc):
-    - Merge in some (as-yet-unused) IPv6 address manipulation code. (Patch
-      from croup.)
-    - The tor-gencert tool for v3 directory authorities now creates all
-      files as readable to the file creator only, and write-protects
-      the authority identity key.
-    - When dumping memory usage, list bytes used in buffer memory
-      free-lists.
-    - When running with dmalloc, dump more stats on hup and on exit.
-    - Directory authorities now fail quickly and (relatively) harmlessly
-      if they generate a network status document that is somehow
-      malformed.
-
-  o Traffic load balancing improvements:
-    - If exit bandwidth ever exceeds one third of total bandwidth, then
-      use the correct formula to weight exit nodes when choosing paths.
-      (Based on patch from Mike Perry.)
-    - Choose perfectly fairly among routers when choosing by bandwidth and
-      weighting by fraction of bandwidth provided by exits. Previously, we
-      would choose with only approximate fairness, and correct ourselves
-      if we ran off the end of the list. [Bugfix on 0.1.2.x]
-
-  o Performance improvements:
-    - Be more aggressive with freeing buffer RAM or putting it on the
-      memory free lists.
-    - Use Critical Sections rather than Mutexes for synchronizing threads
-      on win32; Mutexes are heavier-weight, and designed for synchronizing
-      between processes.
-
-  o Deprecated and removed features:
-    - RedirectExits is now deprecated.
-    - Stop allowing address masks that do not correspond to bit prefixes.
-      We have warned about these for a really long time; now it's time
-      to reject them. (Patch from croup.)
-
-  o Minor bugfixes (directory):
-    - Fix another crash bug related to extra-info caching. (Bug found by
-      Peter Palfrader.) [Bugfix on 0.2.0.2-alpha]
-    - Directories no longer return a "304 not modified" when they don't
-      have the networkstatus the client asked for. Also fix a memory
-      leak when returning 304 not modified. [Bugfixes on 0.2.0.2-alpha]
-    - We had accidentally labelled 0.1.2.x directory servers as not
-      suitable for begin_dir requests, and had labelled no directory
-      servers as suitable for uploading extra-info documents. [Bugfix
-      on 0.2.0.1-alpha]
-
-  o Minor bugfixes (dns):
-    - Fix a crash when DNSPort is set more than once. (Patch from Robert
-      Hogan.) [Bugfix on 0.2.0.2-alpha]
-    - Add DNSPort connections to the global connection list, so that we
-      can time them out correctly. (Bug found by Robert Hogan.) [Bugfix
-      on 0.2.0.2-alpha]
-    - Fix a dangling reference that could lead to a crash when DNSPort is
-      changed or closed (Patch from Robert Hogan.) [Bugfix on
-      0.2.0.2-alpha]
-
-  o Minor bugfixes (controller):
-    - Provide DNS expiry times in GMT, not in local time. For backward
-      compatibility, ADDRMAP events only provide GMT expiry in an extended
-      field. "GETINFO address-mappings" always does the right thing.
-    - Use CRLF line endings properly in NS events.
-    - Terminate multi-line control events properly. (Original patch
-      from tup.) [Bugfix on 0.1.2.x-alpha]
-    - Do not include spaces in SOURCE_ADDR fields in STREAM
-      events. Resolves bug 472. [Bugfix on 0.2.0.x-alpha]
-
-
-Changes in version 0.1.2.15 - 2007-07-17
-  Tor 0.1.2.15 fixes several crash bugs, fixes some anonymity-related
-  problems, fixes compilation on BSD, and fixes a variety of other
-  bugs. Everybody should upgrade.
-
-  o Major bugfixes (compilation):
-    - Fix compile on FreeBSD/NetBSD/OpenBSD. Oops.
-
-  o Major bugfixes (crashes):
-    - Try even harder not to dereference the first character after
-      an mmap(). Reported by lodger.
-    - Fix a crash bug in directory authorities when we re-number the
-      routerlist while inserting a new router.
-    - When the cached-routers file is an even multiple of the page size,
-      don't run off the end and crash. (Fixes bug 455; based on idea
-      from croup.)
-    - Fix eventdns.c behavior on Solaris: It is critical to include
-      orconfig.h _before_ sys/types.h, so that we can get the expected
-      definition of _FILE_OFFSET_BITS.
-
-  o Major bugfixes (security):
-    - Fix a possible buffer overrun when using BSD natd support. Bug
-      found by croup.
-    - When sending destroy cells from a circuit's origin, don't include
-      the reason for tearing down the circuit. The spec says we didn't,
-      and now we actually don't. Reported by lodger.
-    - Keep streamids from different exits on a circuit separate. This
-      bug may have allowed other routers on a given circuit to inject
-      cells into streams. Reported by lodger; fixes bug 446.
-    - If there's a never-before-connected-to guard node in our list,
-      never choose any guards past it. This way we don't expand our
-      guard list unless we need to.
-
-  o Minor bugfixes (guard nodes):
-    - Weight guard selection by bandwidth, so that low-bandwidth nodes
-      don't get overused as guards.
-
-  o Minor bugfixes (directory):
-    - Correctly count the number of authorities that recommend each
-      version. Previously, we were under-counting by 1.
-    - Fix a potential crash bug when we load many server descriptors at
-      once and some of them make others of them obsolete. Fixes bug 458.
-
-  o Minor bugfixes (hidden services):
-    - Stop tearing down the whole circuit when the user asks for a
-      connection to a port that the hidden service didn't configure.
-      Resolves bug 444.
-
-  o Minor bugfixes (misc):
-    - On Windows, we were preventing other processes from reading
-      cached-routers while Tor was running. Reported by janbar.
-    - Fix a possible (but very unlikely) bug in picking routers by
-      bandwidth. Add a log message to confirm that it is in fact
-      unlikely. Patch from lodger.
-    - Backport a couple of memory leak fixes.
-    - Backport miscellaneous cosmetic bugfixes.
-
-
-Changes in version 0.2.0.2-alpha - 2007-06-02
-  o Major bugfixes on 0.2.0.1-alpha:
-    - Fix an assertion failure related to servers without extra-info digests.
-      Resolves bugs 441 and 442.
-
-  o Minor features (directory):
-    - Support "If-Modified-Since" when answering HTTP requests for
-      directories, running-routers documents, and network-status documents.
-      (There's no need to support it for router descriptors, since those
-      are downloaded by descriptor digest.)
-
-  o Minor build issues:
-    - Clear up some MIPSPro compiler warnings.
-    - When building from a tarball on a machine that happens to have SVK
-      installed, report the micro-revision as whatever version existed
-      in the tarball, not as "x".
-
-
-Changes in version 0.2.0.1-alpha - 2007-06-01
-  This early development snapshot provides new features for people running
-  Tor as both a client and a server (check out the new RelayBandwidth
-  config options); lets Tor run as a DNS proxy; and generally moves us
-  forward on a lot of fronts.
-
-  o Major features, server usability:
-    - New config options RelayBandwidthRate and RelayBandwidthBurst:
-      a separate set of token buckets for relayed traffic. Right now
-      relayed traffic is defined as answers to directory requests, and
-      OR connections that don't have any local circuits on them.
-
-  o Major features, client usability:
-    - A client-side DNS proxy feature to replace the need for
-      dns-proxy-tor: Just set "DNSPort 9999", and Tor will now listen
-      for DNS requests on port 9999, use the Tor network to resolve them
-      anonymously, and send the reply back like a regular DNS server.
-      The code still only implements a subset of DNS.
-    - Make PreferTunneledDirConns and TunnelDirConns work even when
-      we have no cached directory info. This means Tor clients can now
-      do all of their connections protected by TLS.
-
-  o Major features, performance and efficiency:
-    - Directory authorities accept and serve "extra info" documents for
-      routers. These documents contain fields from router descriptors
-      that aren't usually needed, and that use a lot of excess
-      bandwidth. Once these fields are removed from router descriptors,
-      the bandwidth savings should be about 60%. [Partially implements
-      proposal 104.]
-    - Servers upload extra-info documents to any authority that accepts
-      them. Authorities (and caches that have been configured to download
-      extra-info documents) download them as needed. [Partially implements
-      proposal 104.]
-    - Change the way that Tor buffers data that it is waiting to write.
-      Instead of queueing data cells in an enormous ring buffer for each
-      client->OR or OR->OR connection, we now queue cells on a separate
-      queue for each circuit. This lets us use less slack memory, and
-      will eventually let us be smarter about prioritizing different kinds
-      of traffic.
-    - Use memory pools to allocate cells with better speed and memory
-      efficiency, especially on platforms where malloc() is inefficient.
-    - Stop reading on edge connections when their corresponding circuit
-      buffers are full; start again as the circuits empty out.
-
-  o Major features, other:
-    - Add an HSAuthorityRecordStats option that hidden service authorities
-      can use to track statistics of overall hidden service usage without
-      logging information that would be very useful to an attacker.
-    - Start work implementing multi-level keys for directory authorities:
-      Add a standalone tool to generate key certificates. (Proposal 103.)
-
-  o Security fixes:
-    - Directory authorities now call routers Stable if they have an
-      uptime of at least 30 days, even if that's not the median uptime
-      in the network. Implements proposal 107, suggested by Kevin Bauer
-      and Damon McCoy.
-
-  o Minor fixes (resource management):
-    - Count the number of open sockets separately from the number
-      of active connection_t objects. This will let us avoid underusing
-      our allocated connection limit.
-    - We no longer use socket pairs to link an edge connection to an
-      anonymous directory connection or a DirPort test connection.
-      Instead, we track the link internally and transfer the data
-      in-process. This saves two sockets per "linked" connection (at the
-      client and at the server), and avoids the nasty Windows socketpair()
-      workaround.
-    - Keep unused 4k and 16k buffers on free lists, rather than wasting 8k
-      for every single inactive connection_t. Free items from the
-      4k/16k-buffer free lists when they haven't been used for a while.
-
-  o Minor features (build):
-    - Make autoconf search for libevent, openssl, and zlib consistently.
-    - Update deprecated macros in configure.in.
-    - When warning about missing headers, tell the user to let us
-      know if the compile succeeds anyway, so we can downgrade the
-      warning.
-    - Include the current subversion revision as part of the version
-      string: either fetch it directly if we're in an SVN checkout, do
-      some magic to guess it if we're in an SVK checkout, or use
-      the last-detected version if we're building from a .tar.gz.
-      Use this version consistently in log messages.
-
-  o Minor features (logging):
-    - Always prepend "Bug: " to any log message about a bug.
-    - Put a platform string (e.g. "Linux i686") in the startup log
-      message, so when people paste just their logs, we know if it's
-      OpenBSD or Windows or what.
-    - When logging memory usage, break down memory used in buffers by
-      buffer type.
-
-  o Minor features (directory system):
-    - New config option V2AuthoritativeDirectory that all directory
-      authorities should set. This will let future authorities choose
-      not to serve V2 directory information.
-    - Directory authorities allow multiple router descriptors and/or extra
-      info documents to be uploaded in a single go. This will make
-      implementing proposal 104 simpler.
-
-  o Minor features (controller):
-    - Add a new config option __DisablePredictedCircuits designed for
-      use by the controller, when we don't want Tor to build any circuits
-      preemptively.
-    - Let the controller specify HOP=%d as an argument to ATTACHSTREAM,
-      so we can exit from the middle of the circuit.
-    - Implement "getinfo status/circuit-established".
-    - Implement "getinfo status/version/..." so a controller can tell
-      whether the current version is recommended, and whether any versions
-      are good, and how many authorities agree. (Patch from shibz.)
-
-  o Minor features (hidden services):
-    - Allow multiple HiddenServicePort directives with the same virtual
-      port; when they occur, the user is sent round-robin to one
-      of the target ports chosen at random. Partially fixes bug 393 by
-      adding limited ad-hoc round-robining.
-
-  o Minor features (other):
-    - More unit tests.
-    - Add a new AutomapHostsOnResolve option: when it is enabled, any
-      resolve request for hosts matching a given pattern causes Tor to
-      generate an internal virtual address mapping for that host. This
-      allows DNSPort to work sensibly with hidden service users. By
-      default, .exit and .onion addresses are remapped; the list of
-      patterns can be reconfigured with AutomapHostsSuffixes.
-    - Add an "-F" option to tor-resolve to force a resolve for a .onion
-      address. Thanks to the AutomapHostsOnResolve option, this is no
-      longer a completely silly thing to do.
-    - If Tor is invoked from something that isn't a shell (e.g. Vidalia),
-      now we expand "-f ~/.tor/torrc" correctly. Suggested by Matt Edman.
-    - Treat "2gb" when given in torrc for a bandwidth as meaning 2gb,
-      minus 1 byte: the actual maximum declared bandwidth.
-
-  o Removed features:
-    - Removed support for the old binary "version 0" controller protocol.
-      This has been deprecated since 0.1.1, and warnings have been issued
-      since 0.1.2. When we encounter a v0 control message, we now send
-      back an error and close the connection.
-    - Remove the old "dns worker" server DNS code: it hasn't been default
-      since 0.1.2.2-alpha, and all the servers seem to be using the new
-      eventdns code.
-
-  o Minor bugfixes (portability):
-    - Even though Windows is equally happy with / and \ as path separators,
-      try to use \ consistently on Windows and / consistently on Unix: it
-      makes the log messages nicer.
-    - Correctly report platform name on Windows 95 OSR2 and Windows 98 SE.
-    - Read resolv.conf files correctly on platforms where read() returns
-      partial results on small file reads.
-
-  o Minor bugfixes (directory):
-    - Correctly enforce that elements of directory objects do not appear
-      more often than they are allowed to appear.
-    - When we are reporting the DirServer line we just parsed, we were
-      logging the second stanza of the key fingerprint, not the first.
-
-  o Minor bugfixes (logging):
-    - When we hit an EOF on a log (probably because we're shutting down),
-      don't try to remove the log from the list: just mark it as
-      unusable. (Bulletproofs against bug 222.)
-
-  o Minor bugfixes (other):
-    - In the exitlist script, only consider the most recently published
-      server descriptor for each server. Also, when the user requests
-      a list of servers that _reject_ connections to a given address,
-      explicitly exclude the IPs that also have servers that accept
-      connections to that address. (Resolves bug 405.)
-    - Stop allowing hibernating servers to be "stable" or "fast".
-    - On Windows, we were preventing other processes from reading
-      cached-routers while Tor was running. (Reported by janbar)
-    - Make the NodeFamilies config option work. (Reported by
-      lodger -- it has never actually worked, even though we added it
-      in Oct 2004.)
-    - Check return values from pthread_mutex functions.
-    - Don't save non-general-purpose router descriptors to the disk cache,
-      because we have no way of remembering what their purpose was when
-      we restart.
-    - Add even more asserts to hunt down bug 417.
-    - Build without verbose warnings even on (not-yet-released) gcc 4.2.
-    - Fix a possible (but very unlikely) bug in picking routers by bandwidth.
-      Add a log message to confirm that it is in fact unlikely.
-
-  o Minor bugfixes (controller):
-    - Make 'getinfo fingerprint' return a 551 error if we're not a
-      server, so we match what the control spec claims we do. Reported
-      by daejees.
-    - Fix a typo in an error message when extendcircuit fails that
-      caused us to not follow the \r\n-based delimiter protocol. Reported
-      by daejees.
-
-  o Code simplifications and refactoring:
-    - Stop passing around circuit_t and crypt_path_t pointers that are
-      implicit in other procedure arguments.
-    - Drop the old code to choke directory connections when the
-      corresponding OR connections got full: thanks to the cell queue
-      feature, OR conns don't get full any more.
-    - Make dns_resolve() handle attaching connections to circuits
-      properly, so the caller doesn't have to.
-    - Rename wants_to_read and wants_to_write to read/write_blocked_on_bw.
-    - Keep the connection array as a dynamic smartlist_t, rather than as
-      a fixed-sized array. This is important, as the number of connections
-      is becoming increasingly decoupled from the number of sockets.
-
-
-Changes in version 0.1.2.14 - 2007-05-25
-  Tor 0.1.2.14 changes the addresses of two directory authorities (this
-  change especially affects those who serve or use hidden services),
-  and fixes several other crash- and security-related bugs.
-
-  o Directory authority changes:
-    - Two directory authorities (moria1 and moria2) just moved to new
-      IP addresses. This change will particularly affect those who serve
-      or use hidden services.
-
-  o Major bugfixes (crashes):
-    - If a directory server runs out of space in the connection table
-      as it's processing a begin_dir request, it will free the exit stream
-      but leave it attached to the circuit, leading to unpredictable
-      behavior. (Reported by seeess, fixes bug 425.)
-    - Fix a bug in dirserv_remove_invalid() that would cause authorities
-      to corrupt memory under some really unlikely scenarios.
-    - Tighten router parsing rules. (Bugs reported by Benedikt Boss.)
-    - Avoid segfaults when reading from mmaped descriptor file. (Reported
-      by lodger.)
-
-  o Major bugfixes (security):
-    - When choosing an entry guard for a circuit, avoid using guards
-      that are in the same family as the chosen exit -- not just guards
-      that are exactly the chosen exit. (Reported by lodger.)
-
-  o Major bugfixes (resource management):
-    - If a directory authority is down, skip it when deciding where to get
-      networkstatus objects or descriptors. Otherwise we keep asking
-      every 10 seconds forever. Fixes bug 384.
-    - Count it as a failure if we fetch a valid network-status but we
-      don't want to keep it. Otherwise we'll keep fetching it and keep
-      not wanting to keep it. Fixes part of bug 422.
-    - If all of our dirservers have given us bad or no networkstatuses
-      lately, then stop hammering them once per minute even when we
-      think they're failed. Fixes another part of bug 422.
-
-  o Minor bugfixes:
-    - Actually set the purpose correctly for descriptors inserted with
-      purpose=controller.
-    - When we have k non-v2 authorities in our DirServer config,
-      we ignored the last k authorities in the list when updating our
-      network-statuses.
-    - Correctly back-off from requesting router descriptors that we are
-      having a hard time downloading.
-    - Read resolv.conf files correctly on platforms where read() returns
-      partial results on small file reads.
-    - Don't rebuild the entire router store every time we get 32K of
-      routers: rebuild it when the journal gets very large, or when
-      the gaps in the store get very large.
-
-  o Minor features:
-    - When routers publish SVN revisions in their router descriptors,
-      authorities now include those versions correctly in networkstatus
-      documents.
-    - Warn when using a version of libevent before 1.3b to run a server on
-      OSX or BSD: these versions interact badly with userspace threads.
-
-
-Changes in version 0.1.2.13 - 2007-04-24
-  This release features some major anonymity fixes, such as safer path
-  selection; better client performance; faster bootstrapping, better
-  address detection, and better DNS support for servers; write limiting as
-  well as read limiting to make servers easier to run; and a huge pile of
-  other features and bug fixes. The bundles also ship with Vidalia 0.0.11.
-
-  Tor 0.1.2.13 is released in memory of Rob Levin (1955-2006), aka lilo
-  of the Freenode IRC network, remembering his patience and vision for
-  free speech on the Internet.
-
-  o Minor fixes:
-    - Fix a memory leak when we ask for "all" networkstatuses and we
-      get one we don't recognize.
-    - Add more asserts to hunt down bug 417.
-    - Disable kqueue on OS X 10.3 and earlier, to fix bug 371.
-
-
-Changes in version 0.1.2.12-rc - 2007-03-16
-  o Major bugfixes:
-    - Fix an infinite loop introduced in 0.1.2.7-alpha when we serve
-      directory information requested inside Tor connections (i.e. via
-      begin_dir cells). It only triggered when the same connection was
-      serving other data at the same time. Reported by seeess.
-
-  o Minor bugfixes:
-    - When creating a circuit via the controller, send a 'launched'
-      event when we're done, so we follow the spec better.
-
-
-Changes in version 0.1.2.11-rc - 2007-03-15
-  o Minor bugfixes (controller), reported by daejees:
-    - Correct the control spec to match how the code actually responds
-      to 'getinfo addr-mappings/*'.
-    - The control spec described a GUARDS event, but the code
-      implemented a GUARD event. Standardize on GUARD, but let people
-      ask for GUARDS too.
-
-
-Changes in version 0.1.2.10-rc - 2007-03-07
-  o Major bugfixes (Windows):
-    - Do not load the NT services library functions (which may not exist)
-      just to detect if we're a service trying to shut down. Now we run
-      on Win98 and friends again.
-
-  o Minor bugfixes (other):
-    - Clarify a couple of log messages.
-    - Fix a misleading socks5 error number.
-
-
-Changes in version 0.1.2.9-rc - 2007-03-02
-  o Major bugfixes (Windows):
-    - On MinGW, use "%I64u" to printf/scanf 64-bit integers, instead
-      of the usual GCC "%llu". This prevents a bug when saving 64-bit
-      int configuration values: the high-order 32 bits would get
-      truncated. In particular, we were being bitten by the default
-      MaxAdvertisedBandwidth of 128 TB turning into 0. (Fixes bug 400
-      and maybe also bug 397.)
-
-  o Minor bugfixes (performance):
-    - Use OpenSSL's AES implementation on platforms where it's faster.
-      This could save us as much as 10% CPU usage.
-
-  o Minor bugfixes (server):
-    - Do not rotate onion key immediately after setting it for the first
-      time.
-
-  o Minor bugfixes (directory authorities):
-    - Stop calling servers that have been hibernating for a long time
-      "stable". Also, stop letting hibernating or obsolete servers affect
-      uptime and bandwidth cutoffs.
-    - Stop listing hibernating servers in the v1 directory.
-
-  o Minor bugfixes (hidden services):
-    - Upload hidden service descriptors slightly less often, to reduce
-      load on authorities.
-
-  o Minor bugfixes (other):
-    - Fix an assert that could trigger if a controller quickly set then
-      cleared EntryNodes. Bug found by Udo van den Heuvel.
-    - On architectures where sizeof(int)>4, still clamp declarable bandwidth
-      to INT32_MAX.
-    - Fix a potential race condition in the rpm installer. Found by
-      Stefan Nordhausen.
-    - Try to fix eventdns warnings once and for all: do not treat a dns rcode
-      of 2 as indicating that the server is completely bad; it sometimes
-      means that the server is just bad for the request in question. (may fix
-      the last of bug 326.)
-    - Disable encrypted directory connections when we don't have a server
-      descriptor for the destination. We'll get this working again in
-      the 0.2.0 branch.
-
-
-Changes in version 0.1.2.8-beta - 2007-02-26
-  o Major bugfixes (crashes):
-    - Stop crashing when the controller asks us to resetconf more than
-      one config option at once. (Vidalia 0.0.11 does this.)
-    - Fix a crash that happened on Win98 when we're given command-line
-      arguments: don't try to load NT service functions from advapi32.dll
-      except when we need them. (Bug introduced in 0.1.2.7-alpha;
-      resolves bug 389.)
-    - Fix a longstanding obscure crash bug that could occur when
-      we run out of DNS worker processes. (Resolves bug 390.)
-
-  o Major bugfixes (hidden services):
-    - Correctly detect whether hidden service descriptor downloads are
-      in-progress. (Suggested by Karsten Loesing; fixes bug 399.)
-
-  o Major bugfixes (accounting):
-    - When we start during an accounting interval before it's time to wake
-      up, remember to wake up at the correct time. (May fix bug 342.)
-
-  o Minor bugfixes (controller):
-    - Give the controller END_STREAM_REASON_DESTROY events _before_ we
-      clear the corresponding on_circuit variable, and remember later
-      that we don't need to send a redundant CLOSED event. Resolves part
-      3 of bug 367.
-    - Report events where a resolve succeeded or where we got a socks
-      protocol error correctly, rather than calling both of them
-      "INTERNAL".
-    - Change reported stream target addresses to IP consistently when
-      we finally get the IP from an exit node.
-    - Send log messages to the controller even if they happen to be very
-      long.
-
-  o Minor bugfixes (other):
-    - Display correct results when reporting which versions are
-      recommended, and how recommended they are. (Resolves bug 383.)
-    - Improve our estimates for directory bandwidth to be less random:
-      guess that an unrecognized directory will have the average bandwidth
-      from all known directories, not that it will have the average
-      bandwidth from those directories earlier than it on the list.
-    - If we start a server with ClientOnly 1, then set ClientOnly to 0
-      and hup, stop triggering an assert based on an empty onion_key.
-    - On platforms with no working mmap() equivalent, don't warn the
-      user when cached-routers doesn't exist.
-    - Warn the user when mmap() [or its equivalent] fails for some reason
-      other than file-not-found.
-    - Don't warn the user when cached-routers.new doesn't exist: that's
-      perfectly fine when starting up for the first time.
-    - When EntryNodes are configured, rebuild the guard list to contain,
-      in order: the EntryNodes that were guards before; the rest of the
-      EntryNodes; the nodes that were guards before.
-    - Mask out all signals in sub-threads; only the libevent signal
-      handler should be processing them. This should prevent some crashes
-      on some machines using pthreads. (Patch from coderman.)
-    - Fix switched arguments on memset in the implementation of
-      tor_munmap() for systems with no mmap() call.
-    - When Tor receives a router descriptor that it asked for, but
-      no longer wants (because it has received fresh networkstatuses
-      in the meantime), do not warn the user. Cache the descriptor if
-      we're a cache; drop it if we aren't.
-    - Make earlier entry guards _really_ get retried when the network
-      comes back online.
-    - On a malformed DNS reply, always give an error to the corresponding
-      DNS request.
-    - Build with recent libevents on platforms that do not define the
-      nonstandard types "u_int8_t" and friends.
-
-  o Minor features (controller):
-    - Warn the user when an application uses the obsolete binary v0
-      control protocol. We're planning to remove support for it during
-      the next development series, so it's good to give people some
-      advance warning.
-    - Add STREAM_BW events to report per-entry-stream bandwidth
-      use. (Patch from Robert Hogan.)
-    - Rate-limit SIGNEWNYM signals in response to controllers that
-      impolitely generate them for every single stream. (Patch from
-      mwenge; closes bug 394.)
-    - Make REMAP stream events have a SOURCE (cache or exit), and
-      make them generated in every case where we get a successful
-      connected or resolved cell.
-
-  o Minor bugfixes (performance):
-    - Call router_have_min_dir_info half as often. (This is showing up in
-      some profiles, but not others.)
-    - When using GCC, make log_debug never get called at all, and its
-      arguments never get evaluated, when no debug logs are configured.
-      (This is showing up in some profiles, but not others.)
-
-  o Minor features:
-    - Remove some never-implemented options. Mark PathlenCoinWeight as
-      obsolete.
-    - Implement proposal 106: Stop requiring clients to have well-formed
-      certificates; stop checking nicknames in certificates. (Clients
-      have certificates so that they can look like Tor servers, but in
-      the future we might want to allow them to look like regular TLS
-      clients instead. Nicknames in certificates serve no purpose other
-      than making our protocol easier to recognize on the wire.)
-    - Revise messages on handshake failure again to be even more clear about
-      which are incoming connections and which are outgoing.
-    - Discard any v1 directory info that's over 1 month old (for
-      directories) or over 1 week old (for running-routers lists).
-    - Do not warn when individual nodes in the configuration's EntryNodes,
-      ExitNodes, etc are down: warn only when all possible nodes
-      are down. (Fixes bug 348.)
-    - Always remove expired routers and networkstatus docs before checking
-      whether we have enough information to build circuits. (Fixes
-      bug 373.)
-    - Put a lower-bound on MaxAdvertisedBandwidth.
-
-
-Changes in version 0.1.2.7-alpha - 2007-02-06
-  o Major bugfixes (rate limiting):
-    - Servers decline directory requests much more aggressively when
-      they're low on bandwidth. Otherwise they end up queueing more and
-      more directory responses, which can't be good for latency.
-    - But never refuse directory requests from local addresses.
-    - Fix a memory leak when sending a 503 response for a networkstatus
-      request.
-    - Be willing to read or write on local connections (e.g. controller
-      connections) even when the global rate limiting buckets are empty.
-    - If our system clock jumps back in time, don't publish a negative
-      uptime in the descriptor. Also, don't let the global rate limiting
-      buckets go absurdly negative.
-    - Flush local controller connection buffers periodically as we're
-      writing to them, so we avoid queueing 4+ megabytes of data before
-      trying to flush.
-
-  o Major bugfixes (NT services):
-    - Install as NT_AUTHORITY\LocalService rather than as SYSTEM; add a
-      command-line flag so that admins can override the default by saying
-      "tor --service install --user "SomeUser"". This will not affect
-      existing installed services. Also, warn the user that the service
-      will look for its configuration file in the service user's
-      %appdata% directory. (We can't do the 'hardwire the user's appdata
-      directory' trick any more, since we may not have read access to that
-      directory.)
-
-  o Major bugfixes (other):
-    - Previously, we would cache up to 16 old networkstatus documents
-      indefinitely, if they came from nontrusted authorities. Now we
-      discard them if they are more than 10 days old.
-    - Fix a crash bug in the presence of DNS hijacking (reported by Andrew
-      Del Vecchio).
-    - Detect and reject malformed DNS responses containing circular
-      pointer loops.
-    - If exits are rare enough that we're not marking exits as guards,
-      ignore exit bandwidth when we're deciding the required bandwidth
-      to become a guard.
-    - When we're handling a directory connection tunneled over Tor,
-      don't fill up internal memory buffers with all the data we want
-      to tunnel; instead, only add it if the OR connection that will
-      eventually receive it has some room for it. (This can lead to
-      slowdowns in tunneled dir connections; a better solution will have
-      to wait for 0.2.0.)
-
-  o Minor bugfixes (dns):
-    - Add some defensive programming to eventdns.c in an attempt to catch
-      possible memory-stomping bugs.
-    - Detect and reject DNS replies containing IPv4 or IPv6 records with
-      an incorrect number of bytes. (Previously, we would ignore the
-      extra bytes.)
-    - Fix as-yet-unused reverse IPv6 lookup code so it sends nybbles
-      in the correct order, and doesn't crash.
-    - Free memory held in recently-completed DNS lookup attempts on exit.
-      This was not a memory leak, but may have been hiding memory leaks.
-    - Handle TTL values correctly on reverse DNS lookups.
-    - Treat failure to parse resolv.conf as an error.
-
-  o Minor bugfixes (other):
-    - Fix crash with "tor --list-fingerprint" (reported by seeess).
-    - When computing clock skew from directory HTTP headers, consider what
-      time it was when we finished asking for the directory, not what
-      time it is now.
-    - Expire socks connections if they spend too long waiting for the
-      handshake to finish. Previously we would let them sit around for
-      days, if the connecting application didn't close them either.
-    - And if the socks handshake hasn't started, don't send a
-      "DNS resolve socks failed" handshake reply; just close it.
-    - Stop using C functions that OpenBSD's linker doesn't like.
-    - Don't launch requests for descriptors unless we have networkstatuses
-      from at least half of the authorities. This delays the first
-      download slightly under pathological circumstances, but can prevent
-      us from downloading a bunch of descriptors we don't need.
-    - Do not log IPs with TLS failures for incoming TLS
-      connections. (Fixes bug 382.)
-    - If the user asks to use invalid exit nodes, be willing to use
-      unstable ones.
-    - Stop using the reserved ac_cv namespace in our configure script.
-    - Call stat() slightly less often; use fstat() when possible.
-    - Refactor the way we handle pending circuits when an OR connection
-      completes or fails, in an attempt to fix a rare crash bug.
-    - Only rewrite a conn's address based on X-Forwarded-For: headers
-      if it's a parseable public IP address; and stop adding extra quotes
-      to the resulting address.
-
-  o Major features:
-    - Weight directory requests by advertised bandwidth. Now we can
-      let servers enable write limiting but still allow most clients to
-      succeed at their directory requests. (We still ignore weights when
-      choosing a directory authority; I hope this is a feature.)
-
-  o Minor features:
-    - Create a new file ReleaseNotes which was the old ChangeLog. The
-      new ChangeLog file now includes the summaries for all development
-      versions too.
-    - Check for addresses with invalid characters at the exit as well
-      as at the client, and warn less verbosely when they fail. You can
-      override this by setting ServerDNSAllowNonRFC953Addresses to 1.
-    - Adapt a patch from goodell to let the contrib/exitlist script
-      take arguments rather than require direct editing.
-    - Inform the server operator when we decide not to advertise a
-      DirPort due to AccountingMax enabled or a low BandwidthRate. It
-      was confusing Zax, so now we're hopefully more helpful.
-    - Bring us one step closer to being able to establish an encrypted
-      directory tunnel without knowing a descriptor first. Still not
-      ready yet. As part of the change, now assume we can use a
-      create_fast cell if we don't know anything about a router.
-    - Allow exit nodes to use nameservers running on ports other than 53.
-    - Servers now cache reverse DNS replies.
-    - Add an --ignore-missing-torrc command-line option so that we can
-      get the "use sensible defaults if the configuration file doesn't
-      exist" behavior even when specifying a torrc location on the command
-      line.
-
-  o Minor features (controller):
-    - Track reasons for OR connection failure; make these reasons
-      available via the controller interface. (Patch from Mike Perry.)
-    - Add a SOCKS_BAD_HOSTNAME client status event so controllers
-      can learn when clients are sending malformed hostnames to Tor.
-    - Clean up documentation for controller status events.
-    - Add a REMAP status to stream events to note that a stream's
-      address has changed because of a cached address or a MapAddress
-      directive.
-
-
-Changes in version 0.1.2.6-alpha - 2007-01-09
-  o Major bugfixes:
-    - Fix an assert error introduced in 0.1.2.5-alpha: if a single TLS
-      connection handles more than 4 gigs in either direction, we crash.
-    - Fix an assert error introduced in 0.1.2.5-alpha: if we're an
-      advertised exit node, somebody might try to exit from us when
-      we're bootstrapping and before we've built our descriptor yet.
-      Refuse the connection rather than crashing.
-
-  o Minor bugfixes:
-    - Warn if we (as a server) find that we've resolved an address that we
-      weren't planning to resolve.
-    - Warn that using select() on any libevent version before 1.1 will be
-      unnecessarily slow (even for select()).
-    - Flush ERR-level controller status events just like we currently
-      flush ERR-level log events, so that a Tor shutdown doesn't prevent
-      the controller from learning about current events.
-
-  o Minor features (more controller status events):
-    - Implement EXTERNAL_ADDRESS server status event so controllers can
-      learn when our address changes.
-    - Implement BAD_SERVER_DESCRIPTOR server status event so controllers
-      can learn when directories reject our descriptor.
-    - Implement SOCKS_UNKNOWN_PROTOCOL client status event so controllers
-      can learn when a client application is speaking a non-socks protocol
-      to our SocksPort.
-    - Implement DANGEROUS_SOCKS client status event so controllers
-      can learn when a client application is leaking DNS addresses.
-    - Implement BUG general status event so controllers can learn when
-      Tor is unhappy about its internal invariants.
-    - Implement CLOCK_SKEW general status event so controllers can learn
-      when Tor thinks the system clock is set incorrectly.
-    - Implement GOOD_SERVER_DESCRIPTOR and ACCEPTED_SERVER_DESCRIPTOR
-      server status events so controllers can learn when their descriptors
-      are accepted by a directory.
-    - Implement CHECKING_REACHABILITY and REACHABILITY_{SUCCEEDED|FAILED}
-      server status events so controllers can learn about Tor's progress in
-      deciding whether it's reachable from the outside.
-    - Implement BAD_LIBEVENT general status event so controllers can learn
-      when we have a version/method combination in libevent that needs to
-      be changed.
-    - Implement NAMESERVER_STATUS, NAMESERVER_ALL_DOWN, DNS_HIJACKED,
-      and DNS_USELESS server status events so controllers can learn
-      about changes to DNS server status.
-
-  o Minor features (directory):
-    - Authorities no longer recommend exits as guards if this would shift
-      too much load to the exit nodes.
-
-
-Changes in version 0.1.2.5-alpha - 2007-01-06
-  o Major features:
-    - Enable write limiting as well as read limiting. Now we sacrifice
-      capacity if we're pushing out lots of directory traffic, rather
-      than overrunning the user's intended bandwidth limits.
-    - Include TLS overhead when counting bandwidth usage; previously, we
-      would count only the bytes sent over TLS, but not the bytes used
-      to send them.
-    - Support running the Tor service with a torrc not in the same
-      directory as tor.exe and default to using the torrc located in
-      the %appdata%\Tor\ of the user who installed the service. Patch
-      from Matt Edman.
-    - Servers now check for the case when common DNS requests are going to
-      wildcarded addresses (i.e. all getting the same answer), and change
-      their exit policy to reject *:* if it's happening.
-    - Implement BEGIN_DIR cells, so we can connect to the directory
-      server via TLS to do encrypted directory requests rather than
-      plaintext. Enable via the TunnelDirConns and PreferTunneledDirConns
-      config options if you like.
-
-  o Minor features (config and docs):
-    - Start using the state file to store bandwidth accounting data:
-      the bw_accounting file is now obsolete. We'll keep generating it
-      for a while for people who are still using 0.1.2.4-alpha.
-    - Try to batch changes to the state file so that we do as few
-      disk writes as possible while still storing important things in
-      a timely fashion.
-    - The state file and the bw_accounting file get saved less often when
-      the AvoidDiskWrites config option is set.
-    - Make PIDFile work on Windows (untested).
-    - Add internal descriptions for a bunch of configuration options:
-      accessible via controller interface and in comments in saved
-      options files.
-    - Reject *:563 (NNTPS) in the default exit policy. We already reject
-      NNTP by default, so this seems like a sensible addition.
-    - Clients now reject hostnames with invalid characters. This should
-      avoid some inadvertent info leaks. Add an option
-      AllowNonRFC953Hostnames to disable this behavior, in case somebody
-      is running a private network with hosts called @, !, and #.
-    - Add a maintainer script to tell us which options are missing
-      documentation: "make check-docs".
-    - Add a new address-spec.txt document to describe our special-case
-      addresses: .exit, .onion, and .noconnnect.
-
-  o Minor features (DNS):
-    - Ongoing work on eventdns infrastructure: now it has dns server
-      and ipv6 support. One day Tor will make use of it.
-    - Add client-side caching for reverse DNS lookups.
-    - Add support to tor-resolve tool for reverse lookups and SOCKS5.
-    - When we change nameservers or IP addresses, reset and re-launch
-      our tests for DNS hijacking.
-
-  o Minor features (directory):
-    - Authorities now specify server versions in networkstatus. This adds
-      about 2% to the size of compressed networkstatus docs, and allows
-      clients to tell which servers support BEGIN_DIR and which don't.
-      The implementation is forward-compatible with a proposed future
-      protocol version scheme not tied to Tor versions.
-    - DirServer configuration lines now have an orport= option so
-      clients can open encrypted tunnels to the authorities without
-      having downloaded their descriptors yet. Enabled for moria1,
-      moria2, tor26, and lefkada now in the default configuration.
-    - Directory servers are more willing to send a 503 "busy" if they
-      are near their write limit, especially for v1 directory requests.
-      Now they can use their limited bandwidth for actual Tor traffic.
-    - Clients track responses with status 503 from dirservers. After a
-      dirserver has given us a 503, we try not to use it until an hour has
-      gone by, or until we have no dirservers that haven't given us a 503.
-    - When we get a 503 from a directory, and we're not a server, we don't
-      count the failure against the total number of failures allowed
-      for the thing we're trying to download.
-    - Report X-Your-Address-Is correctly from tunneled directory
-      connections; don't report X-Your-Address-Is when it's an internal
-      address; and never believe reported remote addresses when they're
-      internal.
-    - Protect against an unlikely DoS attack on directory servers.
-    - Add a BadDirectory flag to network status docs so that authorities
-      can (eventually) tell clients about caches they believe to be
-      broken.
-
-  o Minor features (controller):
-    - Have GETINFO dir/status/* work on hosts with DirPort disabled.
-    - Reimplement GETINFO so that info/names stays in sync with the
-      actual keys.
-    - Implement "GETINFO fingerprint".
-    - Implement "SETEVENTS GUARD" so controllers can get updates on
-      entry guard status as it changes.
-
-  o Minor features (clean up obsolete pieces):
-    - Remove some options that have been deprecated since at least
-      0.1.0.x: AccountingMaxKB, LogFile, DebugLogFile, LogLevel, and
-      SysLog. Use AccountingMax instead of AccountingMaxKB, and use Log
-      to set log options.
-    - We no longer look for identity and onion keys in "identity.key" and
-      "onion.key" -- these were replaced by secret_id_key and
-      secret_onion_key in 0.0.8pre1.
-    - We no longer require unrecognized directory entries to be
-      preceded by "opt".
-
-  o Major bugfixes (security):
-    - Stop sending the HttpProxyAuthenticator string to directory
-      servers when directory connections are tunnelled through Tor.
-    - Clients no longer store bandwidth history in the state file.
-    - Do not log introduction points for hidden services if SafeLogging
-      is set.
-    - When generating bandwidth history, round down to the nearest
-      1k. When storing accounting data, round up to the nearest 1k.
-    - When we're running as a server, remember when we last rotated onion
-      keys, so that we will rotate keys once they're a week old even if
-      we never stay up for a week ourselves.
-
-  o Major bugfixes (other):
-    - Fix a longstanding bug in eventdns that prevented the count of
-      timed-out resolves from ever being reset. This bug caused us to
-      give up on a nameserver the third time it timed out, and try it
-      10 seconds later... and to give up on it every time it timed out
-      after that.
-    - Take out the '5 second' timeout from the connection retry
-      schedule. Now the first connect attempt will wait a full 10
-      seconds before switching to a new circuit. Perhaps this will help
-      a lot. Based on observations from Mike Perry.
-    - Fix a bug on the Windows implementation of tor_mmap_file() that
-      would prevent the cached-routers file from ever loading. Reported
-      by John Kimble.
-
-  o Minor bugfixes:
-    - Fix an assert failure when a directory authority sets
-      AuthDirRejectUnlisted and then receives a descriptor from an
-      unlisted router. Reported by seeess.
-    - Avoid a double-free when parsing malformed DirServer lines.
-    - Fix a bug when a BSD-style PF socket is first used. Patch from
-      Fabian Keil.
-    - Fix a bug in 0.1.2.2-alpha that prevented clients from asking
-      to resolve an address at a given exit node even when they ask for
-      it by name.
-    - Servers no longer ever list themselves in their "family" line,
-      even if configured to do so. This makes it easier to configure
-      family lists conveniently.
-    - When running as a server, don't fall back to 127.0.0.1 when no
-      nameservers are configured in /etc/resolv.conf; instead, make the
-      user fix resolv.conf or specify nameservers explicitly. (Resolves
-      bug 363.)
-    - Stop accepting certain malformed ports in configured exit policies.
-    - Don't re-write the fingerprint file every restart, unless it has
-      changed.
-    - Stop warning when a single nameserver fails: only warn when _all_ of
-      our nameservers have failed. Also, when we only have one nameserver,
-      raise the threshold for deciding that the nameserver is dead.
-    - Directory authorities now only decide that routers are reachable
-      if their identity keys are as expected.
-    - When the user uses bad syntax in the Log config line, stop
-      suggesting other bad syntax as a replacement.
-    - Correctly detect ipv6 DNS capability on OpenBSD.
-
-  o Minor bugfixes (controller):
-    - Report the circuit number correctly in STREAM CLOSED events. Bug
-      reported by Mike Perry.
-    - Do not report bizarre values for results of accounting GETINFOs
-      when the last second's write or read exceeds the allotted bandwidth.
-    - Report "unrecognized key" rather than an empty string when the
-      controller tries to fetch a networkstatus that doesn't exist.
-
-
-Changes in version 0.1.1.26 - 2006-12-14
-  o Security bugfixes:
-    - Stop sending the HttpProxyAuthenticator string to directory
-      servers when directory connections are tunnelled through Tor.
-    - Clients no longer store bandwidth history in the state file.
-    - Do not log introduction points for hidden services if SafeLogging
-      is set.
-
-  o Minor bugfixes:
-    - Fix an assert failure when a directory authority sets
-      AuthDirRejectUnlisted and then receives a descriptor from an
-      unlisted router (reported by seeess).
-
-
-Changes in version 0.1.2.4-alpha - 2006-12-03
-  o Major features:
-    - Add support for using natd; this allows FreeBSDs earlier than
-      5.1.2 to have ipfw send connections through Tor without using
-      SOCKS. (Patch from Zajcev Evgeny with tweaks from tup.)
-
-  o Minor features:
-    - Make all connections to addresses of the form ".noconnect"
-      immediately get closed. This lets application/controller combos
-      successfully test whether they're talking to the same Tor by
-      watching for STREAM events.
-    - Make cross.sh cross-compilation script work even when autogen.sh
-      hasn't been run. (Patch from Michael Mohr.)
-    - Statistics dumped by -USR2 now include a breakdown of public key
-      operations, for profiling.
-
-  o Major bugfixes:
-    - Fix a major leak when directory authorities parse their
-      approved-routers list, a minor memory leak when we fail to pick
-      an exit node, and a few rare leaks on errors.
-    - Handle TransPort connections even when the server sends data before
-      the client sends data. Previously, the connection would just hang
-      until the client sent data. (Patch from tup based on patch from
-      Zajcev Evgeny.)
-    - Avoid assert failure when our cached-routers file is empty on
-      startup.
-
-  o Minor bugfixes:
-    - Don't log spurious warnings when we see a circuit close reason we
-      don't recognize; it's probably just from a newer version of Tor.
-    - Have directory authorities allow larger amounts of drift in uptime
-      without replacing the server descriptor: previously, a server that
-      restarted every 30 minutes could have 48 "interesting" descriptors
-      per day.
-    - Start linking to the Tor specification and Tor reference manual
-      correctly in the Windows installer.
-    - Add Vidalia to the OS X uninstaller script, so when we uninstall
-      Tor/Privoxy we also uninstall Vidalia.
-    - Resume building on Irix64, and fix a lot of warnings from its
-      MIPSpro C compiler.
-    - Don't corrupt last_guessed_ip in router_new_address_suggestion()
-      when we're running as a client.
-
-
-Changes in version 0.1.1.25 - 2006-11-04
-  o Major bugfixes:
-    - When a client asks us to resolve (rather than connect to)
-      an address, and we have a cached answer, give them the cached
-      answer. Previously, we would give them no answer at all.
-    - We were building exactly the wrong circuits when we predict
-      hidden service requirements, meaning Tor would have to build all
-      its circuits on demand.
-    - If none of our live entry guards have a high uptime, but we
-      require a guard with a high uptime, try adding a new guard before
-      we give up on the requirement. This patch should make long-lived
-      connections more stable on average.
-    - When testing reachability of our DirPort, don't launch new
-      tests when there's already one in progress -- unreachable
-      servers were stacking up dozens of testing streams.
-
-  o Security bugfixes:
-    - When the user sends a NEWNYM signal, clear the client-side DNS
-      cache too. Otherwise we continue to act on previous information.
-
-  o Minor bugfixes:
-    - Avoid a memory corruption bug when creating a hash table for
-      the first time.
-    - Avoid possibility of controller-triggered crash when misusing
-      certain commands from a v0 controller on platforms that do not
-      handle printf("%s",NULL) gracefully.
-    - Avoid infinite loop on unexpected controller input.
-    - Don't log spurious warnings when we see a circuit close reason we
-      don't recognize; it's probably just from a newer version of Tor.
-    - Add Vidalia to the OS X uninstaller script, so when we uninstall
-      Tor/Privoxy we also uninstall Vidalia.
-
-
-Changes in version 0.1.2.3-alpha - 2006-10-29
-  o Minor features:
-    - Prepare for servers to publish descriptors less often: never
-      discard a descriptor simply for being too old until either it is
-      recommended by no authorities, or until we get a better one for
-      the same router. Make caches consider retaining old recommended
-      routers for even longer.
-    - If most authorities set a BadExit flag for a server, clients
-      don't think of it as a general-purpose exit. Clients only consider
-      authorities that advertise themselves as listing bad exits.
-    - Directory servers now provide 'Pragma: no-cache' and 'Expires'
-      headers for content, so that we can work better in the presence of
-      caching HTTP proxies.
-    - Allow authorities to list nodes as bad exits by fingerprint or by
-      address.
-
-  o Minor features, controller:
-    - Add a REASON field to CIRC events; for backward compatibility, this
-      field is sent only to controllers that have enabled the extended
-      event format. Also, add additional reason codes to explain why
-      a given circuit has been destroyed or truncated. (Patches from
-      Mike Perry)
-    - Add a REMOTE_REASON field to extended CIRC events to tell the
-      controller about why a remote OR told us to close a circuit.
-    - Stream events also now have REASON and REMOTE_REASON fields,
-      working much like those for circuit events.
-    - There's now a GETINFO ns/... field so that controllers can ask Tor
-      about the current status of a router.
-    - A new event type "NS" to inform a controller when our opinion of
-      a router's status has changed.
-    - Add a GETINFO events/names and GETINFO features/names so controllers
-      can tell which events and features are supported.
-    - A new CLEARDNSCACHE signal to allow controllers to clear the
-      client-side DNS cache without expiring circuits.
-
-  o Security bugfixes:
-    - When the user sends a NEWNYM signal, clear the client-side DNS
-      cache too. Otherwise we continue to act on previous information.
-
-  o Minor bugfixes:
-    - Avoid sending junk to controllers or segfaulting when a controller
-      uses EVENT_NEW_DESC with verbose nicknames.
-    - Stop triggering asserts if the controller tries to extend hidden
-      service circuits (reported by mwenge).
-    - Avoid infinite loop on unexpected controller input.
-    - When the controller does a "GETINFO network-status", tell it
-      about even those routers whose descriptors are very old, and use
-      long nicknames where appropriate.
-    - Change NT service functions to be loaded on demand. This lets us
-      build with MinGW without breaking Tor for Windows 98 users.
-    - Do DirPort reachability tests less often, since a single test
-      chews through many circuits before giving up.
-    - In the hidden service example in torrc.sample, stop recommending
-      esoteric and discouraged hidden service options.
-    - When stopping an NT service, wait up to 10 sec for it to actually
-      stop. Patch from Matt Edman; resolves bug 295.
-    - Fix handling of verbose nicknames with ORCONN controller events:
-      make them show up exactly when requested, rather than exactly when
-      not requested.
-    - When reporting verbose nicknames in entry_guards_getinfo(), avoid
-      printing a duplicate "$" in the keys we send (reported by mwenge).
-    - Correctly set maximum connection limit on Cygwin. (This time
-      for sure!)
-    - Try to detect Windows correctly when cross-compiling.
-    - Detect the size of the routers file correctly even if it is
-      corrupted (on systems without mmap) or not page-aligned (on systems
-      with mmap). This bug was harmless.
-    - Sometimes we didn't bother sending a RELAY_END cell when an attempt
-      to open a stream fails; now we do in more cases. This should
-      make clients able to find a good exit faster in some cases, since
-      unhandleable requests will now get an error rather than timing out.
-    - Resolve two memory leaks when rebuilding the on-disk router cache
-      (reported by fookoowa).
-    - Clean up minor code warnings suggested by the MIPSpro C compiler,
-      and reported by some Centos users.
-    - Controller signals now work on non-Unix platforms that don't define
-      SIGUSR1 and SIGUSR2 the way we expect.
-    - Patch from Michael Mohr to contrib/cross.sh, so it checks more
-      values before failing, and always enables eventdns.
-    - Libevent-1.2 exports, but does not define in its headers, strlcpy.
-      Try to fix this in configure.in by checking for most functions
-      before we check for libevent.
-
-
-Changes in version 0.1.2.2-alpha - 2006-10-07
-  o Major features:
-    - Make our async eventdns library on-by-default for Tor servers,
-      and plan to deprecate the separate dnsworker threads.
-    - Add server-side support for "reverse" DNS lookups (using PTR
-      records so clients can determine the canonical hostname for a given
-      IPv4 address). Only supported by servers using eventdns; servers
-      now announce in their descriptors whether they support eventdns.
-    - Specify and implement client-side SOCKS5 interface for reverse DNS
-      lookups (see doc/socks-extensions.txt).
-    - Add a BEGIN_DIR relay cell type for an easier in-protocol way to
-      connect to directory servers through Tor. Previously, clients needed
-      to find Tor exits to make private connections to directory servers.
-    - Avoid choosing Exit nodes for entry or middle hops when the
-      total bandwidth available from non-Exit nodes is much higher than
-      the total bandwidth available from Exit nodes.
-    - Workaround for name servers (like Earthlink's) that hijack failing
-      DNS requests and replace the no-such-server answer with a "helpful"
-      redirect to an advertising-driven search portal. Also work around
-      DNS hijackers who "helpfully" decline to hijack known-invalid
-      RFC2606 addresses. Config option "ServerDNSDetectHijacking 0"
-      lets you turn it off.
-    - Send out a burst of long-range padding cells once we've established
-      that we're reachable. Spread them over 4 circuits, so hopefully
-      a few will be fast. This exercises our bandwidth and bootstraps
-      us into the directory more quickly.
-
-  o New/improved config options:
-    - Add new config option "ResolvConf" to let the server operator
-      choose an alternate resolve.conf file when using eventdns.
-    - Add an "EnforceDistinctSubnets" option to control our "exclude
-      servers on the same /16" behavior. It's still on by default; this
-      is mostly for people who want to operate private test networks with
-      all the machines on the same subnet.
-    - If one of our entry guards is on the ExcludeNodes list, or the
-      directory authorities don't think it's a good guard, treat it as
-      if it were unlisted: stop using it as a guard, and throw it off
-      the guards list if it stays that way for a long time.
-    - Allow directory authorities to be marked separately as authorities
-      for the v1 directory protocol, the v2 directory protocol, and
-      as hidden service directories, to make it easier to retire old
-      authorities. V1 authorities should set "HSAuthoritativeDir 1"
-      to continue being hidden service authorities too.
-    - Remove 8888 as a LongLivedPort, and add 6697 (IRCS).
-
-  o Minor features, controller:
-    - Fix CIRC controller events so that controllers can learn the
-      identity digests of non-Named servers used in circuit paths.
-    - Let controllers ask for more useful identifiers for servers. Instead
-      of learning identity digests for un-Named servers and nicknames
-      for Named servers, the new identifiers include digest, nickname,
-      and indication of Named status. Off by default; see control-spec.txt
-      for more information.
-    - Add a "getinfo address" controller command so it can display Tor's
-      best guess to the user.
-    - New controller event to alert the controller when our server
-      descriptor has changed.
-    - Give more meaningful errors on controller authentication failure.
-
-  o Minor features, other:
-    - When asked to resolve a hostname, don't use non-exit servers unless
-      requested to do so. This allows servers with broken DNS to be
-      useful to the network.
-    - Divide eventdns log messages into warn and info messages.
-    - Reserve the nickname "Unnamed" for routers that can't pick
-      a hostname: any router can call itself Unnamed; directory
-      authorities will never allocate Unnamed to any particular router;
-      clients won't believe that any router is the canonical Unnamed.
-    - Only include function names in log messages for info/debug messages.
-      For notice/warn/err, the content of the message should be clear on
-      its own, and printing the function name only confuses users.
-    - Avoid some false positives during reachability testing: don't try
-      to test via a server that's on the same /24 as us.
-    - If we fail to build a circuit to an intended enclave, and it's
-      not mandatory that we use that enclave, stop wanting it.
-    - When eventdns is enabled, allow multithreaded builds on NetBSD and
-      OpenBSD. (We had previously disabled threads on these platforms
-      because they didn't have working thread-safe resolver functions.)
-
-  o Major bugfixes, anonymity/security:
-    - If a client asked for a server by name, and there's a named server
-      in our network-status but we don't have its descriptor yet, we
-      could return an unnamed server instead.
-    - Fix NetBSD bug that could allow someone to force uninitialized RAM
-      to be sent to a server's DNS resolver. This only affects NetBSD
-      and other platforms that do not bounds-check tolower().
-    - Reject (most) attempts to use Tor circuits with length one. (If
-      many people start using Tor as a one-hop proxy, exit nodes become
-      a more attractive target for compromise.)
-    - Just because your DirPort is open doesn't mean people should be
-      able to remotely teach you about hidden service descriptors. Now
-      only accept rendezvous posts if you've got HSAuthoritativeDir set.
-
-  o Major bugfixes, other:
-    - Don't crash on race condition in dns.c: tor_assert(!resolve->expire)
-    - When a client asks the server to resolve (not connect to)
-      an address, and it has a cached answer, give them the cached answer.
-      Previously, the server would give them no answer at all.
-    - Allow really slow clients to not hang up five minutes into their
-      directory downloads (suggested by Adam J. Richter).
-    - We were building exactly the wrong circuits when we anticipated
-      hidden service requirements, meaning Tor would have to build all
-      its circuits on demand.
-    - Avoid crashing when we mmap a router cache file of size 0.
-    - When testing reachability of our DirPort, don't launch new
-      tests when there's already one in progress -- unreachable
-      servers were stacking up dozens of testing streams.
-
-  o Minor bugfixes, correctness:
-    - If we're a directory mirror and we ask for "all" network status
-      documents, we would discard status documents from authorities
-      we don't recognize.
-    - Avoid a memory corruption bug when creating a hash table for
-      the first time.
-    - Avoid controller-triggered crash when misusing certain commands
-      from a v0 controller on platforms that do not handle
-      printf("%s",NULL) gracefully.
-    - Don't crash when a controller sends a third argument to an
-      "extendcircuit" request.
-    - Controller protocol fixes: fix encoding in "getinfo addr-mappings"
-      response; fix error code when "getinfo dir/status/" fails.
-    - Avoid crash when telling controller stream-status and a stream
-      is detached.
-    - Patch from Adam Langley to fix assert() in eventdns.c.
-    - Fix a debug log message in eventdns to say "X resolved to Y"
-      instead of "X resolved to X".
-    - Make eventdns give strings for DNS errors, not just error numbers.
-    - Track unreachable entry guards correctly: don't conflate
-      'unreachable by us right now' with 'listed as down by the directory
-      authorities'. With the old code, if a guard was unreachable by
-      us but listed as running, it would clog our guard list forever.
-    - Behave correctly in case we ever have a network with more than
-      2GB/s total advertised capacity.
-    - Make TrackExitHosts case-insensitive, and fix the behavior of
-      ".suffix" TrackExitHosts items to avoid matching in the middle of
-      an address.
-    - Finally fix the openssl warnings from newer gccs that believe that
-      ignoring a return value is okay, but casting a return value and
-      then ignoring it is a sign of madness.
-    - Prevent the contrib/exitlist script from printing the same
-      result more than once.
-    - Patch from Steve Hildrey: Generate network status correctly on
-      non-versioning dirservers.
-    - Don't listen to the X-Your-Address-Is hint if you did the lookup
-      via Tor; otherwise you'll think you're the exit node's IP address.
-
-  o Minor bugfixes, performance:
-    - Two small performance improvements on parsing descriptors.
-    - Major performance improvement on inserting descriptors: change
-      algorithm from O(n^2) to O(n).
-    - Make the common memory allocation path faster on machines where
-      malloc(0) returns a pointer.
-    - Start remembering X-Your-Address-Is directory hints even if you're
-      a client, so you can become a server more smoothly.
-    - Avoid duplicate entries on MyFamily line in server descriptor.
-
-  o Packaging, features:
-    - Remove architecture from OS X builds. The official builds are
-      now universal binaries.
-    - The Debian package now uses --verify-config when (re)starting,
-      to distinguish configuration errors from other errors.
-    - Update RPMs to require libevent 1.1b.
-
-  o Packaging, bugfixes:
-    - Patches so Tor builds with MinGW on Windows.
-    - Patches so Tor might run on Cygwin again.
-    - Resume building on non-gcc compilers and ancient gcc. Resume
-      building with the -O0 compile flag. Resume building cleanly on
-      Debian woody.
-    - Run correctly on OS X platforms with case-sensitive filesystems.
-    - Correct includes for net/if.h and net/pfvar.h on OpenBSD (from Tup).
-    - Add autoconf checks so Tor can build on Solaris x86 again.
-
-  o Documentation
-    - Documented (and renamed) ServerDNSSearchDomains and
-      ServerDNSResolvConfFile options.
-    - Be clearer that the *ListenAddress directives can be repeated
-      multiple times.
-
-
-Changes in version 0.1.1.24 - 2006-09-29
-  o Major bugfixes:
-    - Allow really slow clients to not hang up five minutes into their
-      directory downloads (suggested by Adam J. Richter).
-    - Fix major performance regression from 0.1.0.x: instead of checking
-      whether we have enough directory information every time we want to
-      do something, only check when the directory information has changed.
-      This should improve client CPU usage by 25-50%.
-    - Don't crash if, after a server has been running for a while,
-      it can't resolve its hostname.
-
-  o Minor bugfixes:
-    - Allow Tor to start when RunAsDaemon is set but no logs are set.
-    - Don't crash when the controller receives a third argument to an
-      "extendcircuit" request.
-    - Controller protocol fixes: fix encoding in "getinfo addr-mappings"
-      response; fix error code when "getinfo dir/status/" fails.
-    - Fix configure.in to not produce broken configure files with
-      more recent versions of autoconf. Thanks to Clint for his auto*
-      voodoo.
-    - Fix security bug on NetBSD that could allow someone to force
-      uninitialized RAM to be sent to a server's DNS resolver. This
-      only affects NetBSD and other platforms that do not bounds-check
-      tolower().
-    - Warn user when using libevent 1.1a or earlier with win32 or kqueue
-      methods: these are known to be buggy.
-    - If we're a directory mirror and we ask for "all" network status
-      documents, we would discard status documents from authorities
-      we don't recognize.
-
-
-Changes in version 0.1.2.1-alpha - 2006-08-27
-  o Major features:
-    - Add "eventdns" async dns library from Adam Langley, tweaked to
-      build on OSX and Windows. Only enabled if you pass the
-      --enable-eventdns argument to configure.
-    - Allow servers with no hostname or IP address to learn their
-      IP address by asking the directory authorities. This code only
-      kicks in when you would normally have exited with a "no address"
-      error. Nothing's authenticated, so use with care.
-    - Rather than waiting a fixed amount of time between retrying
-      application connections, we wait only 5 seconds for the first,
-      10 seconds for the second, and 15 seconds for each retry after
-      that. Hopefully this will improve the expected user experience.
-    - Patch from Tup to add support for transparent AP connections:
-      this basically bundles the functionality of trans-proxy-tor
-      into the Tor mainline. Now hosts with compliant pf/netfilter
-      implementations can redirect TCP connections straight to Tor
-      without diverting through SOCKS. Needs docs.
-    - Busy directory servers save lots of memory by spooling server
-      descriptors, v1 directories, and v2 networkstatus docs to buffers
-      as needed rather than en masse. Also mmap the cached-routers
-      files, so we don't need to keep the whole thing in memory too.
-    - Automatically avoid picking more than one node from the same
-      /16 network when constructing a circuit.
-    - Revise and clean up the torrc.sample that we ship with; add
-      a section for BandwidthRate and BandwidthBurst.
-
-  o Minor features:
-    - Split circuit_t into origin_circuit_t and or_circuit_t, and
-      split connection_t into edge, or, dir, control, and base structs.
-      These will save quite a bit of memory on busy servers, and they'll
-      also help us track down bugs in the code and bugs in the spec.
-    - Experimentally re-enable kqueue on OSX when using libevent 1.1b
-      or later. Log when we are doing this, so we can diagnose it when
-      it fails. (Also, recommend libevent 1.1b for kqueue and
-      win32 methods; deprecate libevent 1.0b harder; make libevent
-      recommendation system saner.)
-    - Start being able to build universal binaries on OS X (thanks
-      to Phobos).
-    - Export the default exit policy via the control port, so controllers
-      don't need to guess what it is / will be later.
-    - Add a man page entry for ProtocolWarnings.
-    - Add TestVia config option to the man page.
-    - Remove even more protocol-related warnings from Tor server logs,
-      such as bad TLS handshakes and malformed begin cells.
-    - Stop fetching descriptors if you're not a dir mirror and you
-      haven't tried to establish any circuits lately. [This currently
-      causes some dangerous behavior, because when you start up again
-      you'll use your ancient server descriptors.]
-    - New DirPort behavior: if you have your dirport set, you download
-      descriptors aggressively like a directory mirror, whether or not
-      your ORPort is set.
-    - Get rid of the router_retry_connections notion. Now routers
-      no longer try to rebuild long-term connections to directory
-      authorities, and directory authorities no longer try to rebuild
-      long-term connections to all servers. We still don't hang up
-      connections in these two cases though -- we need to look at it
-      more carefully to avoid flapping, and we likely need to wait til
-      0.1.1.x is obsolete.
-    - Drop compatibility with obsolete Tors that permit create cells
-      to have the wrong circ_id_type.
-    - Re-enable per-connection rate limiting. Get rid of the "OP
-      bandwidth" concept. Lay groundwork for "bandwidth classes" --
-      separate global buckets that apply depending on what sort of conn
-      it is.
-    - Start publishing one minute or so after we find our ORPort
-      to be reachable. This will help reduce the number of descriptors
-      we have for ourselves floating around, since it's quite likely
-      other things (e.g. DirPort) will change during that minute too.
-    - Fork the v1 directory protocol into its own spec document,
-      and mark dir-spec.txt as the currently correct (v2) spec.
-
-  o Major bugfixes:
-    - When we find our DirPort to be reachable, publish a new descriptor
-      so we'll tell the world (reported by pnx).
-    - Publish a new descriptor after we hup/reload. This is important
-      if our config has changed such that we'll want to start advertising
-      our DirPort now, etc.
-    - Allow Tor to start when RunAsDaemon is set but no logs are set.
-    - When we have a state file we cannot parse, tell the user and
-      move it aside. Now we avoid situations where the user starts
-      Tor in 1904, Tor writes a state file with that timestamp in it,
-      the user fixes her clock, and Tor refuses to start.
-    - Fix configure.in to not produce broken configure files with
-      more recent versions of autoconf. Thanks to Clint for his auto*
-      voodoo.
-    - "tor --verify-config" now exits with -1(255) or 0 depending on
-      whether the config options are bad or good.
-    - Resolve bug 321 when using dnsworkers: append a period to every
-      address we resolve at the exit node, so that we do not accidentally
-      pick up local addresses, and so that failing searches are retried
-      in the resolver search domains. (This is already solved for
-      eventdns.) (This breaks Blossom servers for now.)
-    - If we are using an exit enclave and we can't connect, e.g. because
-      its webserver is misconfigured to not listen on localhost, then
-      back off and try connecting from somewhere else before we fail.
-
-  o Minor bugfixes:
-    - Start compiling on MinGW on Windows (patches from Mike Chiussi).
-    - Start compiling on MSVC6 on Windows (patches from Frediano Ziglio).
-    - Fix bug 314: Tor clients issued "unsafe socks" warnings even
-      when the IP address is mapped through MapAddress to a hostname.
-    - Start passing "ipv4" hints to getaddrinfo(), so servers don't do
-      useless IPv6 DNS resolves.
-    - Patch suggested by Karsten Loesing: respond to SIGNAL command
-      before we execute the signal, in case the signal shuts us down.
-    - Clean up AllowInvalidNodes man page entry.
-    - Claim a commonname of Tor, rather than TOR, in TLS handshakes.
-    - Add more asserts to track down an assert error on a windows Tor
-      server with connection_add being called with socket == -1.
-    - Handle reporting OR_CONN_EVENT_NEW events to the controller.
-    - Fix misleading log messages: an entry guard that is "unlisted",
-      as well as not known to be "down" (because we've never heard
-      of it), is not therefore "up".
-    - Remove code to special-case "-cvs" ending, since it has not
-      actually mattered since 0.0.9.
-    - Make our socks5 handling more robust to broken socks clients:
-      throw out everything waiting on the buffer in between socks
-      handshake phases, since they can't possibly (so the theory
-      goes) have predicted what we plan to respond to them.
-
-
-Changes in version 0.1.1.23 - 2006-07-30
-  o Major bugfixes:
-    - Fast Tor servers, especially exit nodes, were triggering asserts
-      due to a bug in handling the list of pending DNS resolves. Some
-      bugs still remain here; we're hunting them.
-    - Entry guards could crash clients by sending unexpected input.
-    - More fixes on reachability testing: if you find yourself reachable,
-      then don't ever make any client requests (so you stop predicting
-      circuits), then hup or have your clock jump, then later your IP
-      changes, you won't think circuits are working, so you won't try to
-      test reachability, so you won't publish.
-
-  o Minor bugfixes:
-    - Avoid a crash if the controller does a resetconf firewallports
-      and then a setconf fascistfirewall=1.
-    - Avoid an integer underflow when the dir authority decides whether
-      a router is stable: we might wrongly label it stable, and compute
-      a slightly wrong median stability, when a descriptor is published
-      later than now.
-    - Fix a place where we might trigger an assert if we can't build our
-      own server descriptor yet.
-
-
-Changes in version 0.1.1.22 - 2006-07-05
-  o Major bugfixes:
-    - Fix a big bug that was causing servers to not find themselves
-      reachable if they changed IP addresses. Since only 0.1.1.22+
-      servers can do reachability testing correctly, now we automatically
-      make sure to test via one of these.
-    - Fix to allow clients and mirrors to learn directory info from
-      descriptor downloads that get cut off partway through.
-    - Directory authorities had a bug in deciding if a newly published
-      descriptor was novel enough to make everybody want a copy -- a few
-      servers seem to be publishing new descriptors many times a minute.
-  o Minor bugfixes:
-    - Fix a rare bug that was causing some servers to complain about
-      "closing wedged cpuworkers" and skip some circuit create requests.
-    - Make the Exit flag in directory status documents actually work.
-
-
-Changes in version 0.1.1.21 - 2006-06-10
-  o Crash and assert fixes from 0.1.1.20:
-    - Fix a rare crash on Tor servers that have enabled hibernation.
-    - Fix a seg fault on startup for Tor networks that use only one
-      directory authority.
-    - Fix an assert from a race condition that occurs on Tor servers
-      while exiting, where various threads are trying to log that they're
-      exiting, and delete the logs, at the same time.
-    - Make our unit tests pass again on certain obscure platforms.
-
-  o Other fixes:
-    - Add support for building SUSE RPM packages.
-    - Speed up initial bootstrapping for clients: if we are making our
-      first ever connection to any entry guard, then don't mark it down
-      right after that.
-    - When only one Tor server in the network is labelled as a guard,
-      and we've already picked him, we would cycle endlessly picking him
-      again, being unhappy about it, etc. Now we specifically exclude
-      current guards when picking a new guard.
-    - Servers send create cells more reliably after the TLS connection
-      is established: we were sometimes forgetting to send half of them
-      when we had more than one pending.
-    - If we get a create cell that asks us to extend somewhere, but the
-      Tor server there doesn't match the expected digest, we now send
-      a destroy cell back, rather than silently doing nothing.
-    - Make options->RedirectExit work again.
-    - Make cookie authentication for the controller work again.
-    - Stop being picky about unusual characters in the arguments to
-      mapaddress. It's none of our business.
-    - Add a new config option "TestVia" that lets you specify preferred
-      middle hops to use for test circuits. Perhaps this will let me
-      debug the reachability problems better.
-
-  o Log / documentation fixes:
-    - If we're a server and some peer has a broken TLS certificate, don't
-      log about it unless ProtocolWarnings is set, i.e., we want to hear
-      about protocol violations by others.
-    - Fix spelling of VirtualAddrNetwork in man page.
-    - Add a better explanation at the top of the autogenerated torrc file
-      about what happened to our old torrc.
-
-
-Changes in version 0.1.1.20 - 2006-05-23
-  o Bugfixes:
-    - Downgrade a log severity where servers complain that they're
-      invalid.
-    - Avoid a compile warning on FreeBSD.
-    - Remove string size limit on NEWDESC messages; solve bug 291.
-    - Correct the RunAsDaemon entry in the man page; ignore RunAsDaemon
-      more thoroughly when we're running on windows.
-
-
-Changes in version 0.1.1.19-rc - 2006-05-03
-  o Minor bugs:
-    - Regenerate our local descriptor if it's dirty and we try to use
-      it locally (e.g. if it changes during reachability detection).
-    - If we setconf our ORPort to 0, we continued to listen on the
-      old ORPort and receive connections.
-    - Avoid a second warning about machine/limits.h on Debian
-      GNU/kFreeBSD.
-    - Be willing to add our own routerinfo into the routerlist.
-      Now authorities will include themselves in their directories
-      and network-statuses.
-    - Stop trying to upload rendezvous descriptors to every
-      directory authority: only try the v1 authorities.
-    - Servers no longer complain when they think they're not
-      registered with the directory authorities. There were too many
-      false positives.
-    - Backport dist-rpm changes so rpms can be built without errors.
-
-  o Features:
-    - Implement an option, VirtualAddrMask, to set which addresses
-      get handed out in response to mapaddress requests. This works
-      around a bug in tsocks where 127.0.0.0/8 is never socksified.
-
-
-Changes in version 0.1.1.18-rc - 2006-04-10
-  o Major fixes:
-    - Work harder to download live network-statuses from all the
-      directory authorities we know about. Improve the threshold
-      decision logic so we're more robust to edge cases.
-    - When fetching rendezvous descriptors, we were willing to ask
-      v2 authorities too, which would always return 404.
-
-  o Minor fixes:
-    - Stop listing down or invalid nodes in the v1 directory. This will
-      reduce its bulk by about 1/3, and reduce load on directory
-      mirrors.
-    - When deciding whether a router is Fast or Guard-worthy, consider
-      his advertised BandwidthRate and not just the BandwidthCapacity.
-    - No longer ship INSTALL and README files -- they are useless now.
-    - Force rpmbuild to behave and honor target_cpu.
-    - Avoid warnings about machine/limits.h on Debian GNU/kFreeBSD.
-    - Start to include translated versions of the tor-doc-*.html
-      files, along with the screenshots. Still needs more work.
-    - Start sending back 512 and 451 errors if mapaddress fails,
-      rather than not sending anything back at all.
-    - When we fail to bind or listen on an incoming or outgoing
-      socket, we should close it before failing. otherwise we just
-      leak it. (thanks to weasel for finding.)
-    - Allow "getinfo dir/status/foo" to work, as long as your DirPort
-      is enabled. (This is a hack, and will be fixed in 0.1.2.x.)
-    - Make NoPublish (even though deprecated) work again.
-    - Fix a minor security flaw where a versioning auth dirserver
-      could list a recommended version many times in a row to make
-      clients more convinced that it's recommended.
-    - Fix crash bug if there are two unregistered servers running
-      with the same nickname, one of them is down, and you ask for
-      them by nickname in your EntryNodes or ExitNodes. Also, try
-      to pick the one that's running rather than an arbitrary one.
-    - Fix an infinite loop we could hit if we go offline for too long.
-    - Complain when we hit WSAENOBUFS on recv() or write() too.
-      Perhaps this will help us hunt the bug.
-    - If you're not a versioning dirserver, don't put the string
-      "client-versions \nserver-versions \n" in your network-status.
-    - Lower the minimum required number of file descriptors to 1000,
-      so we can have some overhead for Valgrind on Linux, where the
-      default ulimit -n is 1024.
-
-  o New features:
-    - Add tor.dizum.com as the fifth authoritative directory server.
-    - Add a new config option FetchUselessDescriptors, off by default,
-      for when you plan to run "exitlist" on your client and you want
-      to know about even the non-running descriptors.
-
-
-Changes in version 0.1.1.17-rc - 2006-03-28
-  o Major fixes:
-    - Clients and servers since 0.1.1.10-alpha have been expiring
-      connections whenever they are idle for 5 minutes and they *do*
-      have circuits on them. Oops. With this new version, clients will
-      discard their previous entry guard choices and avoid choosing
-      entry guards running these flawed versions.
-    - Fix memory leak when uncompressing concatenated zlib streams. This
-      was causing substantial leaks over time on Tor servers.
-    - The v1 directory was including servers as much as 48 hours old,
-      because that's how the new routerlist->routers works. Now only
-      include them if they're 20 hours old or less.
-
-  o Minor fixes:
-    - Resume building on irix64, netbsd 2.0, etc.
-    - On non-gcc compilers (e.g. solaris), use "-g -O" instead of
-      "-Wall -g -O2".
-    - Stop writing the "router.desc" file, ever. Nothing uses it anymore,
-      and it is confusing some users.
-    - Mirrors stop caching the v1 directory so often.
-    - Make the max number of old descriptors that a cache will hold
-      rise with the number of directory authorities, so we can scale.
-    - Change our win32 uname() hack to be more forgiving about what
-      win32 versions it thinks it's found.
-
-  o New features:
-    - Add lefkada.eecs.harvard.edu as a fourth authoritative directory
-      server.
-    - When the controller's *setconf commands fail, collect an error
-      message in a string and hand it back to the controller.
-    - Make the v2 dir's "Fast" flag based on relative capacity, just
-      like "Stable" is based on median uptime. Name everything in the
-      top 7/8 Fast, and only the top 1/2 gets to be a Guard.
-    - Log server fingerprint on startup, so new server operators don't
-      have to go hunting around their filesystem for it.
-    - Return a robots.txt on our dirport to discourage google indexing.
-    - Let the controller ask for GETINFO dir/status/foo so it can ask
-      directly rather than connecting to the dir port. Only works when
-      dirport is set for now.
-
-  o New config options rather than constants in the code:
-    - SocksTimeout: How long do we let a socks connection wait
-      unattached before we fail it?
-    - CircuitBuildTimeout: Cull non-open circuits that were born
-      at least this many seconds ago.
-    - CircuitIdleTimeout: Cull open clean circuits that were born
-      at least this many seconds ago.
-
-
-Changes in version 0.1.1.16-rc - 2006-03-18
-  o Bugfixes on 0.1.1.15-rc:
-    - Fix assert when the controller asks to attachstream a connect-wait
-      or resolve-wait stream.
-    - Now do address rewriting when the controller asks us to attach
-      to a particular circuit too. This will let Blossom specify
-      "moria2.exit" without having to learn what moria2's IP address is.
-    - Make the "tor --verify-config" command-line work again, so people
-      can automatically check if their torrc will parse.
-    - Authoritative dirservers no longer require an open connection from
-      a server to consider him "reachable". We need this change because
-      when we add new auth dirservers, old servers won't know not to
-      hang up on them.
-    - Let Tor build on Sun CC again.
-    - Fix an off-by-one buffer size in dirserv.c that magically never
-      hit our three authorities but broke sjmurdoch's own tor network.
-    - If we as a directory mirror don't know of any v1 directory
-      authorities, then don't try to cache any v1 directories.
-    - Stop warning about unknown servers in our family when they are
-      given as hex digests.
-    - Stop complaining as quickly to the server operator that he
-      hasn't registered his nickname/key binding.
-    - Various cleanups so we can add new V2 Auth Dirservers.
-    - Change "AllowUnverifiedNodes" to "AllowInvalidNodes", to
-      reflect the updated flags in our v2 dir protocol.
-    - Resume allowing non-printable characters for exit streams (both
-      for connecting and for resolving). Now we tolerate applications
-      that don't follow the RFCs. But continue to block malformed names
-      at the socks side.
-
-  o Bugfixes on 0.1.0.x:
-    - Fix assert bug in close_logs(): when we close and delete logs,
-      remove them all from the global "logfiles" list.
-    - Fix minor integer overflow in calculating when we expect to use up
-      our bandwidth allocation before hibernating.
-    - Fix a couple of bugs in OpenSSL detection. Also, deal better when
-      there are multiple SSLs installed with different versions.
-    - When we try to be a server and Address is not explicitly set and
-      our hostname resolves to a private IP address, try to use an
-      interface address if it has a public address. Now Windows machines
-      that think of themselves as localhost can work by default.
-
-  o New features:
-    - Let the controller ask for GETINFO dir/server/foo so it can ask
-      directly rather than connecting to the dir port.
-    - Let the controller tell us about certain router descriptors
-      that it doesn't want Tor to use in circuits. Implement
-      SETROUTERPURPOSE and modify +POSTDESCRIPTOR to do this.
-    - New config option SafeSocks to reject all application connections
-      using unsafe socks protocols. Defaults to off.
-
-
-Changes in version 0.1.1.15-rc - 2006-03-11
-  o Bugfixes and cleanups:
-    - When we're printing strings from the network, don't try to print
-      non-printable characters. This protects us against shell escape
-      sequence exploits, and also against attacks to fool humans into
-      misreading their logs.
-    - Fix a bug where Tor would fail to establish any connections if you
-      left it off for 24 hours and then started it: we were happy with
-      the obsolete network statuses, but they all referred to router
-      descriptors that were too old to fetch, so we ended up with no
-      valid router descriptors.
-    - Fix a seg fault in the controller's "getinfo orconn-status"
-      command while listing status on incoming handshaking connections.
-      Introduce a status name "NEW" for these connections.
-    - If we get a linelist or linelist_s config option from the torrc
-      (e.g. ExitPolicy) and it has no value, warn and skip rather than
-      silently resetting it to its default.
-    - Don't abandon entry guards until they've been down or gone for
-      a whole month.
-    - Cleaner and quieter log messages.
-
-  o New features:
-    - New controller signal NEWNYM that makes new application requests
-      use clean circuits.
-    - Add a new circuit purpose 'controller' to let the controller ask
-      for a circuit that Tor won't try to use. Extend the EXTENDCIRCUIT
-      controller command to let you specify the purpose if you're
-      starting a new circuit. Add a new SETCIRCUITPURPOSE controller
-      command to let you change a circuit's purpose after it's been
-      created.
-    - Accept "private:*" in routerdesc exit policies; not generated yet
-      because older Tors do not understand it.
-    - Add BSD-style contributed startup script "rc.subr" from Peter
-      Thoenen.
-
-
-Changes in version 0.1.1.14-alpha - 2006-02-20
-  o Bugfixes on 0.1.1.x:
-    - Don't die if we ask for a stdout or stderr log (even implicitly)
-      and we're set to RunAsDaemon -- just warn.
-    - We still had a few bugs in the OR connection rotation code that
-      caused directory servers to slowly aggregate connections to other
-      fast Tor servers. This time for sure!
-    - Make log entries on Win32 include the name of the function again.
-    - We were treating a pair of exit policies if they were equal even
-      if one said accept and the other said reject -- causing us to
-      not always publish a new descriptor since we thought nothing
-      had changed.
-    - Retry pending server downloads as well as pending networkstatus
-      downloads when we unexpectedly get a socks request.
-    - We were ignoring the IS_FAST flag in the directory status,
-      meaning we were willing to pick trivial-bandwidth nodes for "fast"
-      connections.
-    - If the controller's SAVECONF command fails (e.g. due to file
-      permissions), let the controller know that it failed.
-
-  o Features:
-    - If we're trying to be a Tor server and running Windows 95/98/ME
-      as a server, explain that we'll likely crash.
-    - When we're a server, a client asks for an old-style directory,
-      and our write bucket is empty, don't give it to him. This way
-      small servers can continue to serve the directory *sometimes*,
-      without getting overloaded.
-    - Compress exit policies even more -- look for duplicate lines
-      and remove them.
-    - Clients now honor the "guard" flag in the router status when
-      picking entry guards, rather than looking at is_fast or is_stable.
-    - Retain unrecognized lines in $DATADIR/state file, so that we can
-      be forward-compatible.
-    - Generate 18.0.0.0/8 address policy format in descs when we can;
-      warn when the mask is not reducible to a bit-prefix.
-    - Let the user set ControlListenAddress in the torrc. This can be
-      dangerous, but there are some cases (like a secured LAN) where it
-      makes sense.
-    - Split ReachableAddresses into ReachableDirAddresses and
-      ReachableORAddresses, so we can restrict Dir conns to port 80
-      and OR conns to port 443.
-    - Now we can target arch and OS in rpm builds (contributed by
-      Phobos). Also make the resulting dist-rpm filename match the
-      target arch.
-    - New config options to help controllers: FetchServerDescriptors
-      and FetchHidServDescriptors for whether to fetch server
-      info and hidserv info or let the controller do it, and
-      PublishServerDescriptor and PublishHidServDescriptors.
-    - Also let the controller set the __AllDirActionsPrivate config
-      option if you want all directory fetches/publishes to happen via
-      Tor (it assumes your controller bootstraps your circuits).
-
-
-Changes in version 0.1.0.17 - 2006-02-17
-  o Crash bugfixes on 0.1.0.x:
-    - When servers with a non-zero DirPort came out of hibernation,
-      sometimes they would trigger an assert.
-
-  o Other important bugfixes:
-    - On platforms that don't have getrlimit (like Windows), we were
-      artificially constraining ourselves to a max of 1024
-      connections. Now just assume that we can handle as many as 15000
-      connections. Hopefully this won't cause other problems.
-
-  o Backported features:
-    - When we're a server, a client asks for an old-style directory,
-      and our write bucket is empty, don't give it to him. This way
-      small servers can continue to serve the directory *sometimes*,
-      without getting overloaded.
-    - Whenever you get a 503 in response to a directory fetch, try
-      once more. This will become important once servers start sending
-      503's whenever they feel busy.
-    - Fetch a new directory every 120 minutes, not every 40 minutes.
-      Now that we have hundreds of thousands of users running the old
-      directory algorithm, it's starting to hurt a lot.
-    - Bump up the period for forcing a hidden service descriptor upload
-      from 20 minutes to 1 hour.
-
-
-Changes in version 0.1.1.13-alpha - 2006-02-09
-  o Crashes in 0.1.1.x:
-    - When you tried to setconf ORPort via the controller, Tor would
-      crash. So people using TorCP to become a server were sad.
-    - Solve (I hope) the stack-smashing bug that we were seeing on fast
-      servers. The problem appears to be something do with OpenSSL's
-      random number generation, or how we call it, or something. Let me
-      know if the crashes continue.
-    - Turn crypto hardware acceleration off by default, until we find
-      somebody smart who can test it for us. (It appears to produce
-      seg faults in at least some cases.)
-    - Fix a rare assert error when we've tried all intro points for
-      a hidden service and we try fetching the service descriptor again:
-      "Assertion conn->state != AP_CONN_STATE_RENDDESC_WAIT failed"
-
-  o Major fixes:
-    - Fix a major load balance bug: we were round-robining in 16 KB
-      chunks, and servers with bandwidthrate of 20 KB, while downloading
-      a 600 KB directory, would starve their other connections. Now we
-      try to be a bit more fair.
-    - Dir authorities and mirrors were never expiring the newest
-      descriptor for each server, causing memory and directory bloat.
-    - Fix memory-bloating and connection-bloating bug on servers: We
-      were never closing any connection that had ever had a circuit on
-      it, because we were checking conn->n_circuits == 0, yet we had a
-      bug that let it go negative.
-    - Make Tor work using squid as your http proxy again -- squid
-      returns an error if you ask for a URL that's too long, and it uses
-      a really generic error message. Plus, many people are behind a
-      transparent squid so they don't even realize it.
-    - On platforms that don't have getrlimit (like Windows), we were
-      artificially constraining ourselves to a max of 1024
-      connections. Now just assume that we can handle as many as 15000
-      connections. Hopefully this won't cause other problems.
-    - Add a new config option ExitPolicyRejectPrivate which defaults to
-      1. This means all exit policies will begin with rejecting private
-      addresses, unless the server operator explicitly turns it off.
-
-  o Major features:
-    - Clients no longer download descriptors for non-running
-      descriptors.
-    - Before we add new directory authorities, we should make it
-      clear that only v1 authorities should receive/publish hidden
-      service descriptors.
-
-  o Minor features:
-    - As soon as we've fetched some more directory info, immediately
-      try to download more server descriptors. This way we don't have
-      a 10 second pause during initial bootstrapping.
-    - Remove even more loud log messages that the server operator can't
-      do anything about.
-    - When we're running an obsolete or un-recommended version, make
-      the log message more clear about what the problem is and what
-      versions *are* still recommended.
-    - Provide a more useful warn message when our onion queue gets full:
-      the CPU is too slow or the exit policy is too liberal.
-    - Don't warn when we receive a 503 from a dirserver/cache -- this
-      will pave the way for them being able to refuse if they're busy.
-    - When we fail to bind a listener, try to provide a more useful
-      log message: e.g., "Is Tor already running?"
-    - Adjust tor-spec to parameterize cell and key lengths. Now Ian
-      Goldberg can prove things about our handshake protocol more
-      easily.
-    - MaxConn has been obsolete for a while now. Document the ConnLimit
-      config option, which is a *minimum* number of file descriptors
-      that must be available else Tor refuses to start.
-    - Apply Matt Ghali's --with-syslog-facility patch to ./configure
-      if you log to syslog and want something other than LOG_DAEMON.
-    - Make dirservers generate a separate "guard" flag to mean,
-      "would make a good entry guard". Make clients parse it and vote
-      on it. Not used by clients yet.
-    - Implement --with-libevent-dir option to ./configure. Also, improve
-      search techniques to find libevent, and use those for openssl too.
-    - Bump the default bandwidthrate to 3 MB, and burst to 6 MB
-    - Only start testing reachability once we've established a
-      circuit. This will make startup on dirservers less noisy.
-    - Don't try to upload hidden service descriptors until we have
-      established a circuit.
-    - Fix the controller's "attachstream 0" command to treat conn like
-      it just connected, doing address remapping, handling .exit and
-      .onion idioms, and so on. Now we're more uniform in making sure
-      that the controller hears about new and closing connections.
-
-
-Changes in version 0.1.1.12-alpha - 2006-01-11
-  o Bugfixes on 0.1.1.x:
-    - The fix to close duplicate server connections was closing all
-      Tor client connections if they didn't establish a circuit
-      quickly enough. Oops.
-    - Fix minor memory issue (double-free) that happened on exit.
-
-  o Bugfixes on 0.1.0.x:
-    - Tor didn't warn when it failed to open a log file.
-
-
-Changes in version 0.1.1.11-alpha - 2006-01-10
-  o Crashes in 0.1.1.x:
-    - Include all the assert/crash fixes from 0.1.0.16.
-    - If you start Tor and then quit very quickly, there were some
-      races that tried to free things that weren't allocated yet.
-    - Fix a rare memory stomp if you're running hidden services.
-    - Fix segfault when specifying DirServer in config without nickname.
-    - Fix a seg fault when you finish connecting to a server but at
-      that moment you dump his server descriptor.
-    - Extendcircuit and Attachstream controller commands would
-      assert/crash if you don't give them enough arguments.
-    - Fix an assert error when we're out of space in the connection_list
-      and we try to post a hidden service descriptor (reported by weasel).
-    - If you specify a relative torrc path and you set RunAsDaemon in
-      your torrc, then it chdir()'s to the new directory. If you HUP,
-      it tries to load the new torrc location, fails, and exits.
-      The fix: no longer allow a relative path to torrc using -f.
-
-  o Major features:
-    - Implement "entry guards": automatically choose a handful of entry
-      nodes and stick with them for all circuits. Only pick new guards
-      when the ones you have are unsuitable, and if the old guards
-      become suitable again, switch back. This will increase security
-      dramatically against certain end-point attacks. The EntryNodes
-      config option now provides some hints about which entry guards you
-      want to use most; and StrictEntryNodes means to only use those.
-    - New directory logic: download by descriptor digest, not by
-      fingerprint. Caches try to download all listed digests from
-      authorities; clients try to download "best" digests from caches.
-      This avoids partitioning and isolating attacks better.
-    - Make the "stable" router flag in network-status be the median of
-      the uptimes of running valid servers, and make clients pay
-      attention to the network-status flags. Thus the cutoff adapts
-      to the stability of the network as a whole, making IRC, IM, etc
-      connections more reliable.
-
-  o Major fixes:
-    - Tor servers with dynamic IP addresses were needing to wait 18
-      hours before they could start doing reachability testing using
-      the new IP address and ports. This is because they were using
-      the internal descriptor to learn what to test, yet they were only
-      rebuilding the descriptor once they decided they were reachable.
-    - Tor 0.1.1.9 and 0.1.1.10 had a serious bug that caused clients
-      to download certain server descriptors, throw them away, and then
-      fetch them again after 30 minutes. Now mirrors throw away these
-      server descriptors so clients can't get them.
-    - We were leaving duplicate connections to other ORs open for a week,
-      rather than closing them once we detect a duplicate. This only
-      really affected authdirservers, but it affected them a lot.
-    - Spread the authdirservers' reachability testing over the entire
-      testing interval, so we don't try to do 500 TLS's at once every
-      20 minutes.
-
-  o Minor fixes:
-    - If the network is down, and we try to connect to a conn because
-      we have a circuit in mind, and we timeout (30 seconds) because the
-      network never answers, we were expiring the circuit, but we weren't
-      obsoleting the connection or telling the entry_guards functions.
-    - Some Tor servers process billions of cells per day. These statistics
-      need to be uint64_t's.
-    - Check for integer overflows in more places, when adding elements
-      to smartlists. This could possibly prevent a buffer overflow
-      on malicious huge inputs. I don't see any, but I haven't looked
-      carefully.
-    - ReachableAddresses kept growing new "reject *:*" lines on every
-      setconf/reload.
-    - When you "setconf log" via the controller, it should remove all
-      logs. We were automatically adding back in a "log notice stdout".
-    - Newly bootstrapped Tor networks couldn't establish hidden service
-      circuits until they had nodes with high uptime. Be more tolerant.
-    - We were marking servers down when they could not answer every piece
-      of the directory request we sent them. This was far too harsh.
-    - Fix the torify (tsocks) config file to not use Tor for localhost
-      connections.
-    - Directory authorities now go to the proper authority when asking for
-      a networkstatus, even when they want a compressed one.
-    - Fix a harmless bug that was causing Tor servers to log
-      "Got an end because of misc error, but we're not an AP. Closing."
-    - Authorities were treating their own descriptor changes as cosmetic,
-      meaning the descriptor available in the network-status and the
-      descriptor that clients downloaded were different.
-    - The OS X installer was adding a symlink for tor_resolve but
-      the binary was called tor-resolve (reported by Thomas Hardly).
-    - Workaround a problem with some http proxies where they refuse GET
-      requests that specify "Content-Length: 0" (reported by Adrian).
-    - Fix wrong log message when you add a "HiddenServiceNodes" config
-      line without any HiddenServiceDir line (reported by Chris Thomas).
-
-  o Minor features:
-    - Write the TorVersion into the state file so we have a prayer of
-      keeping forward and backward compatibility.
-    - Revive the FascistFirewall config option rather than eliminating it:
-      now it's a synonym for ReachableAddresses *:80,*:443.
-    - Clients choose directory servers from the network status lists,
-      not from their internal list of router descriptors. Now they can
-      go to caches directly rather than needing to go to authorities
-      to bootstrap.
-    - Directory authorities ignore router descriptors that have only
-      cosmetic differences: do this for 0.1.0.x servers now too.
-    - Add a new flag to network-status indicating whether the server
-      can answer v2 directory requests too.
-    - Authdirs now stop whining so loudly about bad descriptors that
-      they fetch from other dirservers. So when there's a log complaint,
-      it's for sure from a freshly uploaded descriptor.
-    - Reduce memory requirements in our structs by changing the order
-      of fields.
-    - There used to be two ways to specify your listening ports in a
-      server descriptor: on the "router" line and with a separate "ports"
-      line. Remove support for the "ports" line.
-    - New config option "AuthDirRejectUnlisted" for auth dirservers as
-      a panic button: if we get flooded with unusable servers we can
-      revert to only listing servers in the approved-routers file.
-    - Auth dir servers can now mark a fingerprint as "!reject" or
-      "!invalid" in the approved-routers file (as its nickname), to
-      refuse descriptors outright or include them but marked as invalid.
-    - Servers store bandwidth history across restarts/crashes.
-    - Add reasons to DESTROY and RELAY_TRUNCATED cells, so clients can
-      get a better idea of why their circuits failed. Not used yet.
-    - Directory mirrors now cache up to 16 unrecognized network-status
-      docs. Now we can add new authdirservers and they'll be cached too.
-    - When picking a random directory, prefer non-authorities if any
-      are known.
-    - New controller option "getinfo desc/all-recent" to fetch the
-      latest server descriptor for every router that Tor knows about.
-
-
-Changes in version 0.1.0.16 - 2006-01-02
-  o Crash bugfixes on 0.1.0.x:
-    - On Windows, build with a libevent patch from "I-M Weasel" to avoid
-      corrupting the heap, losing FDs, or crashing when we need to resize
-      the fd_sets. (This affects the Win32 binaries, not Tor's sources.)
-    - It turns out sparc64 platforms crash on unaligned memory access
-      too -- so detect and avoid this.
-    - Handle truncated compressed data correctly (by detecting it and
-      giving an error).
-    - Fix possible-but-unlikely free(NULL) in control.c.
-    - When we were closing connections, there was a rare case that
-      stomped on memory, triggering seg faults and asserts.
-    - Avoid potential infinite recursion when building a descriptor. (We
-      don't know that it ever happened, but better to fix it anyway.)
-    - We were neglecting to unlink marked circuits from soon-to-close OR
-      connections, which caused some rare scribbling on freed memory.
-    - Fix a memory stomping race bug when closing the joining point of two
-      rendezvous circuits.
-    - Fix an assert in time parsing found by Steven Murdoch.
-
-  o Other bugfixes on 0.1.0.x:
-    - When we're doing reachability testing, provide more useful log
-      messages so the operator knows what to expect.
-    - Do not check whether DirPort is reachable when we are suppressing
-      advertising it because of hibernation.
-    - When building with -static or on Solaris, we sometimes needed -ldl.
-    - When we're deciding whether a stream has enough circuits around
-      that can handle it, count the freshly dirty ones and not the ones
-      that are so dirty they won't be able to handle it.
-    - When we're expiring old circuits, we had a logic error that caused
-      us to close new rendezvous circuits rather than old ones.
-    - Give a more helpful log message when you try to change ORPort via
-      the controller: you should upgrade Tor if you want that to work.
-    - We were failing to parse Tor versions that start with "Tor ".
-    - Tolerate faulty streams better: when a stream fails for reason
-      exitpolicy, stop assuming that the router is lying about his exit
-      policy. When a stream fails for reason misc, allow it to retry just
-      as if it was resolvefailed. When a stream has failed three times,
-      reset its failure count so we can try again and get all three tries.
-
-
-Changes in version 0.1.1.10-alpha - 2005-12-11
-  o Correctness bugfixes on 0.1.0.x:
-    - On Windows, build with a libevent patch from "I-M Weasel" to avoid
-      corrupting the heap, losing FDs, or crashing when we need to resize
-      the fd_sets. (This affects the Win32 binaries, not Tor's sources.)
-    - Stop doing the complex voodoo overkill checking for insecure
-      Diffie-Hellman keys. Just check if it's in [2,p-2] and be happy.
-    - When we were closing connections, there was a rare case that
-      stomped on memory, triggering seg faults and asserts.
-    - We were neglecting to unlink marked circuits from soon-to-close OR
-      connections, which caused some rare scribbling on freed memory.
-    - When we're deciding whether a stream has enough circuits around
-      that can handle it, count the freshly dirty ones and not the ones
-      that are so dirty they won't be able to handle it.
-    - Recover better from TCP connections to Tor servers that are
-      broken but don't tell you (it happens!); and rotate TLS
-      connections once a week.
-    - When we're expiring old circuits, we had a logic error that caused
-      us to close new rendezvous circuits rather than old ones.
-    - Fix a scary-looking but apparently harmless bug where circuits
-      would sometimes start out in state CIRCUIT_STATE_OR_WAIT at
-      servers, and never switch to state CIRCUIT_STATE_OPEN.
-    - When building with -static or on Solaris, we sometimes needed to
-      build with -ldl.
-    - Give a useful message when people run Tor as the wrong user,
-      rather than telling them to start chowning random directories.
-    - We were failing to inform the controller about new .onion streams.
-
-  o Security bugfixes on 0.1.0.x:
-    - Refuse server descriptors if the fingerprint line doesn't match
-      the included identity key. Tor doesn't care, but other apps (and
-      humans) might actually be trusting the fingerprint line.
-    - We used to kill the circuit when we receive a relay command we
-      don't recognize. Now we just drop it.
-    - Start obeying our firewall options more rigorously:
-      . If we can't get to a dirserver directly, try going via Tor.
-      . Don't ever try to connect (as a client) to a place our
-        firewall options forbid.
-      . If we specify a proxy and also firewall options, obey the
-        firewall options even when we're using the proxy: some proxies
-        can only proxy to certain destinations.
-    - Fix a bug found by Lasse Overlier: when we were making internal
-      circuits (intended to be cannibalized later for rendezvous and
-      introduction circuits), we were picking them so that they had
-      useful exit nodes. There was no need for this, and it actually
-      aids some statistical attacks.
-    - Start treating internal circuits and exit circuits separately.
-      It's important to keep them separate because internal circuits
-      have their last hops picked like middle hops, rather than like
-      exit hops. So exiting on them will break the user's expectations.
-
-  o Bugfixes on 0.1.1.x:
-    - Take out the mis-feature where we tried to detect IP address
-      flapping for people with DynDNS, and chose not to upload a new
-      server descriptor sometimes.
-    - Try to be compatible with OpenSSL 0.9.6 again.
-    - Log fix: when the controller is logging about .onion addresses,
-      sometimes it didn't include the ".onion" part of the address.
-    - Don't try to modify options->DirServers internally -- if the
-      user didn't specify any, just add the default ones directly to
-      the trusted dirserver list. This fixes a bug where people running
-      controllers would use SETCONF on some totally unrelated config
-      option, and Tor would start yelling at them about changing their
-      DirServer lines.
-    - Let the controller's redirectstream command specify a port, in
-      case the controller wants to change that too.
-    - When we requested a pile of server descriptors, we sometimes
-      accidentally launched a duplicate request for the first one.
-    - Bugfix for trackhostexits: write down the fingerprint of the
-      chosen exit, not its nickname, because the chosen exit might not
-      be verified.
-    - When parsing foo.exit, if foo is unknown, and we are leaving
-      circuits unattached, set the chosen_exit field and leave the
-      address empty. This matters because controllers got confused
-      otherwise.
-    - Directory authorities no longer try to download server
-      descriptors that they know they will reject.
-
-  o Features and updates:
-    - Replace balanced trees with hash tables: this should make stuff
-      significantly faster.
-    - Resume using the AES counter-mode implementation that we ship,
-      rather than OpenSSL's. Ours is significantly faster.
-    - Many other CPU and memory improvements.
-    - Add a new config option FastFirstHopPK (on by default) so clients
-      do a trivial crypto handshake for their first hop, since TLS has
-      already taken care of confidentiality and authentication.
-    - Add a new config option TestSocks so people can see if their
-      applications are using socks4, socks4a, socks5-with-ip, or
-      socks5-with-hostname. This way they don't have to keep mucking
-      with tcpdump and wondering if something got cached somewhere.
-    - Warn when listening on a public address for socks. I suspect a
-      lot of people are setting themselves up as open socks proxies,
-      and they have no idea that jerks on the Internet are using them,
-      since they simply proxy the traffic into the Tor network.
-    - Add "private:*" as an alias in configuration for policies. Now
-      you can simplify your exit policy rather than needing to list
-      every single internal or nonroutable network space.
-    - Add a new controller event type that allows controllers to get
-      all server descriptors that were uploaded to a router in its role
-      as authoritative dirserver.
-    - Start shipping socks-extensions.txt, tor-doc-unix.html,
-      tor-doc-server.html, and stylesheet.css in the tarball.
-    - Stop shipping tor-doc.html in the tarball.
-
-
-Changes in version 0.1.1.9-alpha - 2005-11-15
-  o Usability improvements:
-    - Start calling it FooListenAddress rather than FooBindAddress,
-      since few of our users know what it means to bind an address
-      or port.
-    - Reduce clutter in server logs. We're going to try to make
-      them actually usable now. New config option ProtocolWarnings that
-      lets you hear about how _other Tors_ are breaking the protocol. Off
-      by default.
-    - Divide log messages into logging domains. Once we put some sort
-      of interface on this, it will let people looking at more verbose
-      log levels specify the topics they want to hear more about.
-    - Make directory servers return better http 404 error messages
-      instead of a generic "Servers unavailable".
-    - Check for even more Windows version flags when writing the platform
-      string in server descriptors, and note any we don't recognize.
-    - Clean up more of the OpenSSL memory when exiting, so we can detect
-      memory leaks better.
-    - Make directory authorities be non-versioning, non-naming by
-      default. Now we can add new directory servers without requiring
-      their operators to pay close attention.
-    - When logging via syslog, include the pid whenever we provide
-      a log entry. Suggested by Todd Fries.
-
-  o Performance improvements:
-    - Directory servers now silently throw away new descriptors that
-      haven't changed much if the timestamps are similar. We do this to
-      tolerate older Tor servers that upload a new descriptor every 15
-      minutes. (It seemed like a good idea at the time.)
-    - Inline bottleneck smartlist functions; use fast versions by default.
-    - Add a "Map from digest to void*" abstraction digestmap_t so we
-      can do less hex encoding/decoding. Use it in router_get_by_digest()
-      to resolve a performance bottleneck.
-    - Allow tor_gzip_uncompress to extract as much as possible from
-      truncated compressed data. Try to extract as many
-      descriptors as possible from truncated http responses (when
-      DIR_PURPOSE_FETCH_ROUTERDESC).
-    - Make circ->onionskin a pointer, not a static array. moria2 was using
-      125000 circuit_t's after it had been up for a few weeks, which
-      translates to 20+ megs of wasted space.
-    - The private half of our EDH handshake keys are now chosen out
-      of 320 bits, not 1024 bits. (Suggested by Ian Goldberg.)
-
-  o Security improvements:
-    - Start making directory caches retain old routerinfos, so soon
-      clients can start asking by digest of descriptor rather than by
-      fingerprint of server.
-    - Add half our entropy from RAND_poll in OpenSSL. This knows how
-      to use egd (if present), openbsd weirdness (if present), vms/os2
-      weirdness (if we ever port there), and more in the future.
-
-  o Bugfixes on 0.1.0.x:
-    - Do round-robin writes of at most 16 kB per write. This might be
-      more fair on loaded Tor servers, and it might resolve our Windows
-      crash bug. It might also slow things down.
-    - Our TLS handshakes were generating a single public/private
-      keypair for the TLS context, rather than making a new one for
-      each new connections. Oops. (But we were still rotating them
-      periodically, so it's not so bad.)
-    - When we were cannibalizing a circuit with a particular exit
-      node in mind, we weren't checking to see if that exit node was
-      already present earlier in the circuit. Oops.
-    - When a Tor server's IP changes (e.g. from a dyndns address),
-      upload a new descriptor so clients will learn too.
-    - Really busy servers were keeping enough circuits open on stable
-      connections that they were wrapping around the circuit_id
-      space. (It's only two bytes.) This exposed a bug where we would
-      feel free to reuse a circuit_id even if it still exists but has
-      been marked for close. Try to fix this bug. Some bug remains.
-    - If we would close a stream early (e.g. it asks for a .exit that
-      we know would refuse it) but the LeaveStreamsUnattached config
-      option is set by the controller, then don't close it.
-
-  o Bugfixes on 0.1.1.8-alpha:
-    - Fix a big pile of memory leaks, some of them serious.
-    - Do not try to download a routerdesc if we would immediately reject
-      it as obsolete.
-    - Resume inserting a newline between all router descriptors when
-      generating (old style) signed directories, since our spec says
-      we do.
-    - When providing content-type application/octet-stream for
-      server descriptors using .z, we were leaving out the
-      content-encoding header. Oops. (Everything tolerated this just
-      fine, but that doesn't mean we need to be part of the problem.)
-    - Fix a potential seg fault in getconf and getinfo using version 1
-      of the controller protocol.
-    - Avoid crash: do not check whether DirPort is reachable when we
-      are suppressing it because of hibernation.
-    - Make --hash-password not crash on exit.
-
-
-Changes in version 0.1.1.8-alpha - 2005-10-07
-  o New features (major):
-    - Clients don't download or use the directory anymore. Now they
-      download and use network-statuses from the trusted dirservers,
-      and fetch individual server descriptors as needed from mirrors.
-      See dir-spec.txt for all the gory details.
-    - Be more conservative about whether to advertise our DirPort.
-      The main change is to not advertise if we're running at capacity
-      and either a) we could hibernate or b) our capacity is low and
-      we're using a default DirPort.
-    - Use OpenSSL's AES when OpenSSL has version 0.9.7 or later.
-
-  o New features (minor):
-    - Try to be smart about when to retry network-status and
-      server-descriptor fetches. Still needs some tuning.
-    - Stop parsing, storing, or using running-routers output (but
-      mirrors still cache and serve it).
-    - Consider a threshold of versioning dirservers (dirservers who have
-      an opinion about which Tor versions are still recommended) before
-      deciding whether to warn the user that he's obsolete.
-    - Dirservers can now reject/invalidate by key and IP, with the
-      config options "AuthDirInvalid" and "AuthDirReject". This is
-      useful since currently we automatically list servers as running
-      and usable even if we know they're jerks.
-    - Provide dire warnings to any users who set DirServer; move it out
-      of torrc.sample and into torrc.complete.
-    - Add MyFamily to torrc.sample in the server section.
-    - Add nicknames to the DirServer line, so we can refer to them
-      without requiring all our users to memorize their IP addresses.
-    - When we get an EOF or a timeout on a directory connection, note
-      how many bytes of serverdesc we are dropping. This will help
-      us determine whether it is smart to parse incomplete serverdesc
-      responses.
-    - Add a new function to "change pseudonyms" -- that is, to stop
-      using any currently-dirty circuits for new streams, so we don't
-      link new actions to old actions. Currently it's only called on
-      HUP (or SIGNAL RELOAD).
-    - On sighup, if UseHelperNodes changed to 1, use new circuits.
-    - Start using RAND_bytes rather than RAND_pseudo_bytes from
-      OpenSSL. Also, reseed our entropy every hour, not just at
-      startup. And entropy in 512-bit chunks, not 160-bit chunks.
-
-  o Fixes on 0.1.1.7-alpha:
-    - Nobody ever implemented EVENT_ADDRMAP for control protocol
-      version 0, so don't let version 0 controllers ask for it.
-    - If you requested something with too many newlines via the
-      v1 controller protocol, you could crash tor.
-    - Fix a number of memory leaks, including some pretty serious ones.
-    - Re-enable DirPort testing again, so Tor servers will be willing
-      to advertise their DirPort if it's reachable.
-    - On TLS handshake, only check the other router's nickname against
-      its expected nickname if is_named is set.
-
-  o Fixes forward-ported from 0.1.0.15:
-    - Don't crash when we don't have any spare file descriptors and we
-      try to spawn a dns or cpu worker.
-    - Make the numbers in read-history and write-history into uint64s,
-      so they don't overflow and publish negatives in the descriptor.
-
-  o Fixes on 0.1.0.x:
-    - For the OS X package's modified privoxy config file, comment
-      out the "logfile" line so we don't log everything passed
-      through privoxy.
-    - We were whining about using socks4 or socks5-with-local-lookup
-      even when it's an IP in the "virtual" range we designed exactly
-      for this case.
-    - We were leaking some memory every time the client changes IPs.
-    - Never call free() on tor_malloc()d memory. This will help us
-      use dmalloc to detect memory leaks.
-    - Check for named servers when looking them up by nickname;
-      warn when we'recalling a non-named server by its nickname;
-      don't warn twice about the same name.
-    - Try to list MyFamily elements by key, not by nickname, and warn
-      if we've not heard of the server.
-    - Make windows platform detection (uname equivalent) smarter.
-    - It turns out sparc64 doesn't like unaligned access either.
-
-
-Changes in version 0.1.0.15 - 2005-09-23
-  o Bugfixes on 0.1.0.x:
-    - Reject ports 465 and 587 (spam targets) in default exit policy.
-    - Don't crash when we don't have any spare file descriptors and we
-      try to spawn a dns or cpu worker.
-    - Get rid of IgnoreVersion undocumented config option, and make us
-      only warn, never exit, when we're running an obsolete version.
-    - Don't try to print a null string when your server finds itself to
-      be unreachable and the Address config option is empty.
-    - Make the numbers in read-history and write-history into uint64s,
-      so they don't overflow and publish negatives in the descriptor.
-    - Fix a minor memory leak in smartlist_string_remove().
-    - We were only allowing ourselves to upload a server descriptor at
-      most every 20 minutes, even if it changed earlier than that.
-    - Clean up log entries that pointed to old URLs.
-
-
-Changes in version 0.1.1.7-alpha - 2005-09-14
-  o Fixes on 0.1.1.6-alpha:
-    - Exit servers were crashing when people asked them to make a
-      connection to an address not in their exit policy.
-    - Looking up a non-existent stream for a v1 control connection would
-      cause a segfault.
-    - Fix a seg fault if we ask a dirserver for a descriptor by
-      fingerprint but he doesn't know about him.
-    - SETCONF was appending items to linelists, not clearing them.
-    - SETCONF SocksBindAddress killed Tor if it fails to bind. Now back
-      out and refuse the setconf if it would fail.
-    - Downgrade the dirserver log messages when whining about
-      unreachability.
-
-  o New features:
-    - Add Peter Palfrader's check-tor script to tor/contrib/
-      It lets you easily check whether a given server (referenced by
-      nickname) is reachable by you.
-    - Numerous changes to move towards client-side v2 directories. Not
-      enabled yet.
-
-  o Fixes on 0.1.0.x:
-    - If the user gave tor an odd number of command-line arguments,
-      we were silently ignoring the last one. Now we complain and fail.
-      [This wins the oldest-bug prize -- this bug has been present since
-       November 2002, as released in Tor 0.0.0.]
-    - Do not use unaligned memory access on alpha, mips, or mipsel.
-      It *works*, but is very slow, so we treat them as if it doesn't.
-    - Retry directory requests if we fail to get an answer we like
-      from a given dirserver (we were retrying before, but only if
-      we fail to connect).
-    - When writing the RecommendedVersions line, sort them first.
-    - When the client asked for a rendezvous port that the hidden
-      service didn't want to provide, we were sending an IP address
-      back along with the end cell. Fortunately, it was zero. But stop
-      that anyway.
-    - Correct "your server is reachable" log entries to indicate that
-      it was self-testing that told us so.
-
-
-Changes in version 0.1.1.6-alpha - 2005-09-09
-  o Fixes on 0.1.1.5-alpha:
-    - We broke fascistfirewall in 0.1.1.5-alpha. Oops.
-    - Fix segfault in unit tests in 0.1.1.5-alpha. Oops.
-    - Fix bug with tor_memmem finding a match at the end of the string.
-    - Make unit tests run without segfaulting.
-    - Resolve some solaris x86 compile warnings.
-    - Handle duplicate lines in approved-routers files without warning.
-    - Fix bug where as soon as a server refused any requests due to his
-      exit policy (e.g. when we ask for localhost and he tells us that's
-      127.0.0.1 and he won't do it), we decided he wasn't obeying his
-      exit policy using him for any exits.
-    - Only do openssl hardware accelerator stuff if openssl version is
-      at least 0.9.7.
-
-  o New controller features/fixes:
-    - Add a "RESETCONF" command so you can set config options like
-      AllowUnverifiedNodes and LongLivedPorts to "". Also, if you give
-      a config option in the torrc with no value, then it clears it
-      entirely (rather than setting it to its default).
-    - Add a "GETINFO config-file" to tell us where torrc is.
-    - Avoid sending blank lines when GETINFO replies should be empty.
-    - Add a QUIT command for the controller (for using it manually).
-    - Fix a bug in SAVECONF that was adding default dirservers and
-      other redundant entries to the torrc file.
-
-  o Start on the new directory design:
-    - Generate, publish, cache, serve new network-status format.
-    - Publish individual descriptors (by fingerprint, by "all", and by
-      "tell me yours").
-    - Publish client and server recommended versions separately.
-    - Allow tor_gzip_uncompress() to handle multiple concatenated
-      compressed strings. Serve compressed groups of router
-      descriptors. The compression logic here could be more
-      memory-efficient.
-    - Distinguish v1 authorities (all currently trusted directories)
-      from v2 authorities (all trusted directories).
-    - Change DirServers config line to note which dirs are v1 authorities.
-    - Add configuration option "V1AuthoritativeDirectory 1" which
-      moria1, moria2, and tor26 should set.
-    - Remove option when getting directory cache to see whether they
-      support running-routers; they all do now. Replace it with one
-      to see whether caches support v2 stuff.
-
-  o New features:
-    - Dirservers now do their own external reachability testing of each
-      Tor server, and only list them as running if they've been found to
-      be reachable. We also send back warnings to the server's logs if
-      it uploads a descriptor that we already believe is unreachable.
-    - Implement exit enclaves: if we know an IP address for the
-      destination, and there's a running Tor server at that address
-      which allows exit to the destination, then extend the circuit to
-      that exit first. This provides end-to-end encryption and end-to-end
-      authentication. Also, if the user wants a .exit address or enclave,
-      use 4 hops rather than 3, and cannibalize a general circ for it
-      if you can.
-    - Permit transitioning from ORPort=0 to ORPort!=0, and back, from the
-      controller. Also, rotate dns and cpu workers if the controller
-      changes options that will affect them; and initialize the dns
-      worker cache tree whether or not we start out as a server.
-    - Only upload a new server descriptor when options change, 18
-      hours have passed, uptime is reset, or bandwidth changes a lot.
-    - Check [X-]Forwarded-For headers in HTTP requests when generating
-      log messages. This lets people run dirservers (and caches) behind
-      Apache but still know which IP addresses are causing warnings.
-
-  o Config option changes:
-    - Replace (Fascist)Firewall* config options with a new
-      ReachableAddresses option that understands address policies.
-      For example, "ReachableAddresses *:80,*:443"
-    - Get rid of IgnoreVersion undocumented config option, and make us
-      only warn, never exit, when we're running an obsolete version.
-    - Make MonthlyAccountingStart config option truly obsolete now.
-
-  o Fixes on 0.1.0.x:
-    - Reject ports 465 and 587 in the default exit policy, since
-      people have started using them for spam too.
-    - It turns out we couldn't bootstrap a network since we added
-      reachability detection in 0.1.0.1-rc. Good thing the Tor network
-      has never gone down. Add an AssumeReachable config option to let
-      servers and dirservers bootstrap. When we're trying to build a
-      high-uptime or high-bandwidth circuit but there aren't enough
-      suitable servers, try being less picky rather than simply failing.
-    - Our logic to decide if the OR we connected to was the right guy
-      was brittle and maybe open to a mitm for unverified routers.
-    - We weren't cannibalizing circuits correctly for
-      CIRCUIT_PURPOSE_C_ESTABLISH_REND and
-      CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, so we were being forced to
-      build those from scratch. This should make hidden services faster.
-    - Predict required circuits better, with an eye toward making hidden
-      services faster on the service end.
-    - Retry streams if the exit node sends back a 'misc' failure. This
-      should result in fewer random failures. Also, after failing
-      from resolve failed or misc, reset the num failures, so we give
-      it a fair shake next time we try.
-    - Clean up the rendezvous warn log msgs, and downgrade some to info.
-    - Reduce severity on logs about dns worker spawning and culling.
-    - When we're shutting down and we do something like try to post a
-      server descriptor or rendezvous descriptor, don't complain that
-      we seem to be unreachable. Of course we are, we're shutting down.
-    - Add TTLs to RESOLVED, CONNECTED, and END_REASON_EXITPOLICY cells.
-      We don't use them yet, but maybe one day our DNS resolver will be
-      able to discover them.
-    - Make ContactInfo mandatory for authoritative directory servers.
-    - Require server descriptors to list IPv4 addresses -- hostnames
-      are no longer allowed. This also fixes some potential security
-      problems with people providing hostnames as their address and then
-      preferentially resolving them to partition users.
-    - Change log line for unreachability to explicitly suggest /etc/hosts
-      as the culprit. Also make it clearer what IP address and ports we're
-      testing for reachability.
-    - Put quotes around user-supplied strings when logging so users are
-      more likely to realize if they add bad characters (like quotes)
-      to the torrc.
-    - Let auth dir servers start without specifying an Address config
-      option.
-    - Make unit tests (and other invocations that aren't the real Tor)
-      run without launching listeners, creating subdirectories, and so on.
-
-
-Changes in version 0.1.1.5-alpha - 2005-08-08
-  o Bugfixes included in 0.1.0.14.
-
-  o Bugfixes on 0.1.0.x:
-    - If you write "HiddenServicePort 6667 127.0.0.1 6668" in your
-      torrc rather than "HiddenServicePort 6667 127.0.0.1:6668",
-      it would silently using ignore the 6668.
-
-
-Changes in version 0.1.0.14 - 2005-08-08
-  o Bugfixes on 0.1.0.x:
-      - Fix the other half of the bug with crypto handshakes
-        (CVE-2005-2643).
-      - Fix an assert trigger if you send a 'signal term' via the
-        controller when it's listening for 'event info' messages.
-
-
-Changes in version 0.1.1.4-alpha - 2005-08-04
-  o Bugfixes included in 0.1.0.13.
-
-  o Features:
-    - Improve tor_gettimeofday() granularity on windows.
-    - Make clients regenerate their keys when their IP address changes.
-    - Implement some more GETINFO goodness: expose helper nodes, config
-      options, getinfo keys.
-
-
-Changes in version 0.1.0.13 - 2005-08-04
-  o Bugfixes on 0.1.0.x:
-    - Fix a critical bug in the security of our crypto handshakes.
-    - Fix a size_t underflow in smartlist_join_strings2() that made
-      it do bad things when you hand it an empty smartlist.
-    - Fix Windows installer to ship Tor license (thanks to Aphex for
-      pointing out this oversight) and put a link to the doc directory
-      in the start menu.
-    - Explicitly set no-unaligned-access for sparc: it turns out the
-      new gcc's let you compile broken code, but that doesn't make it
-      not-broken.
-
-
-Changes in version 0.1.1.3-alpha - 2005-07-23
-  o Bugfixes on 0.1.1.2-alpha:
-    - Fix a bug in handling the controller's "post descriptor"
-      function.
-    - Fix several bugs in handling the controller's "extend circuit"
-      function.
-    - Fix a bug in handling the controller's "stream status" event.
-    - Fix an assert failure if we have a controller listening for
-      circuit events and we go offline.
-    - Re-allow hidden service descriptors to publish 0 intro points.
-    - Fix a crash when generating your hidden service descriptor if
-      you don't have enough intro points already.
-
-  o New features on 0.1.1.2-alpha:
-    - New controller function "getinfo accounting", to ask how
-      many bytes we've used in this time period.
-    - Experimental support for helper nodes: a lot of the risk from
-      a small static adversary comes because users pick new random
-      nodes every time they rebuild a circuit. Now users will try to
-      stick to the same small set of entry nodes if they can. Not
-      enabled by default yet.
-
-  o Bugfixes on 0.1.0.12:
-    - If you're an auth dir server, always publish your dirport,
-      even if you haven't yet found yourself to be reachable.
-    - Fix a size_t underflow in smartlist_join_strings2() that made
-      it do bad things when you hand it an empty smartlist.
-
-
-Changes in version 0.1.0.12 - 2005-07-18
-  o New directory servers:
-      - tor26 has changed IP address.
-
-  o Bugfixes on 0.1.0.x:
-    - Fix a possible double-free in tor_gzip_uncompress().
-    - When --disable-threads is set, do not search for or link against
-      pthreads libraries.
-    - Don't trigger an assert if an authoritative directory server
-      claims its dirport is 0.
-    - Fix bug with removing Tor as an NT service: some people were
-      getting "The service did not return an error." Thanks to Matt
-      Edman for the fix.
-
-
-Changes in version 0.1.1.2-alpha - 2005-07-15
-  o New directory servers:
-    - tor26 has changed IP address.
-
-  o Bugfixes on 0.1.0.x, crashes/leaks:
-    - Port the servers-not-obeying-their-exit-policies fix from
-      0.1.0.11.
-    - Fix an fd leak in start_daemon().
-    - On Windows, you can't always reopen a port right after you've
-      closed it. So change retry_listeners() to only close and re-open
-      ports that have changed.
-    - Fix a possible double-free in tor_gzip_uncompress().
-
-  o Bugfixes on 0.1.0.x, usability:
-    - When tor_socketpair() fails in Windows, give a reasonable
-      Windows-style errno back.
-    - Let people type "tor --install" as well as "tor -install" when
-      they
-      want to make it an NT service.
-    - NT service patch from Matt Edman to improve error messages.
-    - When the controller asks for a config option with an abbreviated
-      name, give the full name in our response.
-    - Correct the man page entry on TrackHostExitsExpire.
-    - Looks like we were never delivering deflated (i.e. compressed)
-      running-routers lists, even when asked. Oops.
-    - When --disable-threads is set, do not search for or link against
-      pthreads libraries.
-
-  o Bugfixes on 0.1.1.x:
-    - Fix a seg fault with autodetecting which controller version is
-      being used.
-
-  o Features:
-    - New hidden service descriptor format: put a version in it, and
-      let people specify introduction/rendezvous points that aren't
-      in "the directory" (which is subjective anyway).
-    - Allow the DEBUG controller event to work again. Mark certain log
-      entries as "don't tell this to controllers", so we avoid cycles.
-
-
-Changes in version 0.1.0.11 - 2005-06-30
-  o Bugfixes on 0.1.0.x:
-    - Fix major security bug: servers were disregarding their
-      exit policies if clients behaved unexpectedly.
-    - Make OS X init script check for missing argument, so we don't
-      confuse users who invoke it incorrectly.
-    - Fix a seg fault in "tor --hash-password foo".
-    - The MAPADDRESS control command was broken.
-
-
-Changes in version 0.1.1.1-alpha - 2005-06-29
-  o Bugfixes:
-    - Make OS X init script check for missing argument, so we don't
-      confuse users who invoke it incorrectly.
-    - Fix a seg fault in "tor --hash-password foo".
-    - Fix a possible way to DoS dirservers.
-    - When we complain that your exit policy implicitly allows local or
-      private address spaces, name them explicitly so operators can
-      fix it.
-    - Make the log message less scary when all the dirservers are
-      temporarily unreachable.
-    - We were printing the number of idle dns workers incorrectly when
-      culling them.
-
-  o Features:
-    - Revised controller protocol (version 1) that uses ascii rather
-      than binary. Add supporting libraries in python and java so you
-      can use the controller from your applications without caring how
-      our protocol works.
-    - Spiffy new support for crypto hardware accelerators. Can somebody
-      test this?
-
-
-Changes in version 0.0.9.10 - 2005-06-16
-  o Bugfixes on 0.0.9.x (backported from 0.1.0.10):
-    - Refuse relay cells that claim to have a length larger than the
-      maximum allowed. This prevents a potential attack that could read
-      arbitrary memory (e.g. keys) from an exit server's process
-      (CVE-2005-2050).
-
-
-Changes in version 0.1.0.10 - 2005-06-14
-  o Allow a few EINVALs from libevent before dying. Warn on kqueue with
-    libevent before 1.1a.
-
-
-Changes in version 0.1.0.9-rc - 2005-06-09
-  o Bugfixes:
-    - Reset buf->highwater every time buf_shrink() is called, not just on
-      a successful shrink. This was causing significant memory bloat.
-    - Fix buffer overflow when checking hashed passwords.
-    - Security fix: if seeding the RNG on Win32 fails, quit.
-    - Allow seeding the RNG on Win32 even when you're not running as
-      Administrator.
-    - Disable threading on Solaris too. Something is wonky with it,
-      cpuworkers, and reentrant libs.
-    - Reenable the part of the code that tries to flush as soon as an
-      OR outbuf has a full TLS record available. Perhaps this will make
-      OR outbufs not grow as huge except in rare cases, thus saving lots
-      of CPU time plus memory.
-    - Reject malformed .onion addresses rather then passing them on as
-      normal web requests.
-    - Adapt patch from Adam Langley: fix possible memory leak in
-      tor_lookup_hostname().
-    - Initialize libevent later in the startup process, so the logs are
-      already established by the time we start logging libevent warns.
-    - Use correct errno on win32 if libevent fails.
-    - Check and warn about known-bad/slow libevent versions.
-    - Pay more attention to the ClientOnly config option.
-    - Have torctl.in/tor.sh.in check for location of su binary (needed
-      on FreeBSD)
-    - Correct/add man page entries for LongLivedPorts, ExitPolicy,
-      KeepalivePeriod, ClientOnly, NoPublish, HttpProxy, HttpsProxy,
-      HttpProxyAuthenticator
-    - Stop warning about sigpipes in the logs. We're going to
-      pretend that getting these occassionally is normal and fine.
-    - Resolve OS X installer bugs: stop claiming to be 0.0.9.2 in
-      certain
-      installer screens; and don't put stuff into StartupItems unless
-      the user asks you to.
-    - Require servers that use the default dirservers to have public IP
-      addresses. We have too many servers that are configured with private
-      IPs and their admins never notice the log entries complaining that
-      their descriptors are being rejected.
-    - Add OSX uninstall instructions. An actual uninstall script will
-      come later.
-
-
-Changes in version 0.1.0.8-rc - 2005-05-23
-  o Bugfixes:
-    - It turns out that kqueue on OS X 10.3.9 was causing kernel
-      panics. Disable kqueue on all OS X Tors.
-    - Fix RPM: remove duplicate line accidentally added to the rpm
-      spec file.
-    - Disable threads on openbsd too, since its gethostaddr is not
-      reentrant either.
-    - Tolerate libevent 0.8 since it still works, even though it's
-      ancient.
-    - Enable building on Red Hat 9.0 again.
-    - Allow the middle hop of the testing circuit to be running any
-      version, now that most of them have the bugfix to let them connect
-      to unknown servers. This will allow reachability testing to work
-      even when 0.0.9.7-0.0.9.9 become obsolete.
-    - Handle relay cells with rh.length too large. This prevents
-      a potential attack that could read arbitrary memory (maybe even
-      keys) from the exit server's process.
-    - We screwed up the dirport reachability testing when we don't yet
-      have a cached version of the directory. Hopefully now fixed.
-    - Clean up router_load_single_router() (used by the controller),
-      so it doesn't seg fault on error.
-    - Fix a minor memory leak when somebody establishes an introduction
-      point at your Tor server.
-    - If a socks connection ends because read fails, don't warn that
-      you're not sending a socks reply back.
-
-  o Features:
-    - Add HttpProxyAuthenticator config option too, that works like
-      the HttpsProxyAuthenticator config option.
-    - Encode hashed controller passwords in hex instead of base64,
-      to make it easier to write controllers.
-
-
-Changes in version 0.1.0.7-rc - 2005-05-17
-  o Bugfixes:
-    - Fix a bug in the OS X package installer that prevented it from
-      installing on Tiger.
-    - Fix a script bug in the OS X package installer that made it
-      complain during installation.
-    - Find libevent even if it's hiding in /usr/local/ and your
-      CFLAGS and LDFLAGS don't tell you to look there.
-    - Be able to link with libevent as a shared library (the default
-      after 1.0d), even if it's hiding in /usr/local/lib and even
-      if you haven't added /usr/local/lib to your /etc/ld.so.conf,
-      assuming you're running gcc. Otherwise fail and give a useful
-      error message.
-    - Fix a bug in the RPM packager: set home directory for _tor to
-      something more reasonable when first installing.
-    - Free a minor amount of memory that is still reachable on exit.
-
-
-Changes in version 0.1.0.6-rc - 2005-05-14
-  o Bugfixes:
-    - Implement --disable-threads configure option. Disable threads on
-      netbsd by default, because it appears to have no reentrant resolver
-      functions.
-    - Apple's OS X 10.4.0 ships with a broken kqueue. The new libevent
-      release (1.1) detects and disables kqueue if it's broken.
-    - Append default exit policy before checking for implicit internal
-      addresses. Now we don't log a bunch of complaints on startup
-      when using the default exit policy.
-    - Some people were putting "Address  " in their torrc, and they had
-      a buggy resolver that resolved " " to 0.0.0.0. Oops.
-    - If DataDir is ~/.tor, and that expands to /.tor, then default to
-      LOCALSTATEDIR/tor instead.
-    - Fix fragmented-message bug in TorControl.py.
-    - Resolve a minor bug which would prevent unreachable dirports
-      from getting suppressed in the published descriptor.
-    - When the controller gave us a new descriptor, we weren't resolving
-      it immediately, so Tor would think its address was 0.0.0.0 until
-      we fetched a new directory.
-    - Fix an uppercase/lowercase case error in suppressing a bogus
-      libevent warning on some Linuxes.
-
-  o Features:
-    - Begin scrubbing sensitive strings from logs by default. Turn off
-      the config option SafeLogging if you need to do debugging.
-    - Switch to a new buffer management algorithm, which tries to avoid
-      reallocing and copying quite as much. In first tests it looks like
-      it uses *more* memory on average, but less cpu.
-    - First cut at support for "create-fast" cells. Clients can use
-      these when extending to their first hop, since the TLS already
-      provides forward secrecy and authentication. Not enabled on
-      clients yet.
-    - When dirservers refuse a router descriptor, we now log its
-      contactinfo, platform, and the poster's IP address.
-    - Call tor_free_all instead of connections_free_all after forking, to
-      save memory on systems that need to fork.
-    - Whine at you if you're a server and you don't set your contactinfo.
-    - Implement --verify-config command-line option to check if your torrc
-      is valid without actually launching Tor.
-    - Rewrite address "serifos.exit" to "localhost.serifos.exit"
-      rather than just rejecting it.
-
-
-Changes in version 0.1.0.5-rc - 2005-04-27
-  o Bugfixes:
-    - Stop trying to print a null pointer if an OR conn fails because
-      we didn't like its cert.
-  o Features:
-    - Switch our internal buffers implementation to use a ring buffer,
-      to hopefully improve performance for fast servers a lot.
-    - Add HttpsProxyAuthenticator support (basic auth only), based
-      on patch from Adam Langley.
-    - Bump the default BandwidthRate from 1 MB to 2 MB, to accommodate
-      the fast servers that have been joining lately.
-    - Give hidden service accesses extra time on the first attempt,
-      since 60 seconds is often only barely enough. This might improve
-      robustness more.
-    - Improve performance for dirservers: stop re-parsing the whole
-      directory every time you regenerate it.
-    - Add more debugging info to help us find the weird dns freebsd
-      pthreads bug; cleaner debug messages to help track future issues.
-
-
-Changes in version 0.0.9.9 - 2005-04-23
-  o Bugfixes on 0.0.9.x:
-    - If unofficial Tor clients connect and send weird TLS certs, our
-      Tor server triggers an assert. This release contains a minimal
-      backport from the broader fix that we put into 0.1.0.4-rc.
-
-
-Changes in version 0.1.0.4-rc - 2005-04-23
-  o Bugfixes:
-    - If unofficial Tor clients connect and send weird TLS certs, our
-      Tor server triggers an assert. Stop asserting, and start handling
-      TLS errors better in other situations too.
-    - When the controller asks us to tell it about all the debug-level
-      logs, it turns out we were generating debug-level logs while
-      telling it about them, which turns into a bad loop. Now keep
-      track of whether you're sending a debug log to the controller,
-      and don't log when you are.
-    - Fix the "postdescriptor" feature of the controller interface: on
-      non-complete success, only say "done" once.
-  o Features:
-    - Clients are now willing to load balance over up to 2mB, not 1mB,
-      of advertised bandwidth capacity.
-    - Add a NoPublish config option, so you can be a server (e.g. for
-      testing running Tor servers in other Tor networks) without
-      publishing your descriptor to the primary dirservers.
-
-
-Changes in version 0.1.0.3-rc - 2005-04-08
-  o Improvements on 0.1.0.2-rc:
-    - Client now retries when streams end early for 'hibernating' or
-      'resource limit' reasons, rather than failing them.
-    - More automated handling for dirserver operators:
-      - Automatically approve nodes running 0.1.0.2-rc or later,
-        now that the the reachability detection stuff is working.
-      - Now we allow two unverified servers with the same nickname
-        but different keys. But if a nickname is verified, only that
-        nickname+key are allowed.
-      - If you're an authdirserver connecting to an address:port,
-        and it's not the OR you were expecting, forget about that
-        descriptor. If he *was* the one you were expecting, then forget
-        about all other descriptors for that address:port.
-      - Allow servers to publish descriptors from 12 hours in the future.
-        Corollary: only whine about clock skew from the dirserver if
-        he's a trusted dirserver (since now even verified servers could
-        have quite wrong clocks).
-    - Adjust maximum skew and age for rendezvous descriptors: let skew
-      be 48 hours rather than 90 minutes.
-    - Efficiency improvements:
-      - Keep a big splay tree of (circid,orconn)->circuit mappings to make
-        it much faster to look up a circuit for each relay cell.
-      - Remove most calls to assert_all_pending_dns_resolves_ok(),
-        since they're eating our cpu on exit nodes.
-      - Stop wasting time doing a case insensitive comparison for every
-        dns name every time we do any lookup. Canonicalize the names to
-        lowercase and be done with it.
-    - Start sending 'truncated' cells back rather than destroy cells,
-      if the circuit closes in front of you. This means we won't have
-      to abandon partially built circuits.
-    - Only warn once per nickname from add_nickname_list_to_smartlist
-      per failure, so an entrynode or exitnode choice that's down won't
-      yell so much.
-    - Put a note in the torrc about abuse potential with the default
-      exit policy.
-    - Revise control spec and implementation to allow all log messages to
-      be sent to controller with their severities intact (suggested by
-      Matt Edman). Update TorControl to handle new log event types.
-    - Provide better explanation messages when controller's POSTDESCRIPTOR
-      fails.
-    - Stop putting nodename in the Platform string in server descriptors.
-      It doesn't actually help, and it is confusing/upsetting some people.
-
-  o Bugfixes on 0.1.0.2-rc:
-    - We were printing the host mask wrong in exit policies in server
-      descriptors. This isn't a critical bug though, since we were still
-      obeying the exit policy internally.
-    - Fix Tor when compiled with libevent but without pthreads: move
-      connection_unregister() from _connection_free() to
-      connection_free().
-    - Fix an assert trigger (already fixed in 0.0.9.x): when we have
-      the rare mysterious case of accepting a conn on 0.0.0.0:0, then
-      when we look through the connection array, we'll find any of the
-      cpu/dnsworkers. This is no good.
-
-  o Bugfixes on 0.0.9.8:
-    - Fix possible bug on threading platforms (e.g. win32) which was
-      leaking a file descriptor whenever a cpuworker or dnsworker died.
-    - When using preferred entry or exit nodes, ignore whether the
-      circuit wants uptime or capacity. They asked for the nodes, they
-      get the nodes.
-    - chdir() to your datadirectory at the *end* of the daemonize process,
-      not the beginning. This was a problem because the first time you
-      run tor, if your datadir isn't there, and you have runasdaemon set
-      to 1, it will try to chdir to it before it tries to create it. Oops.
-    - Handle changed router status correctly when dirserver reloads
-      fingerprint file. We used to be dropping all unverified descriptors
-      right then. The bug was hidden because we would immediately
-      fetch a directory from another dirserver, which would include the
-      descriptors we just dropped.
-    - When we're connecting to an OR and he's got a different nickname/key
-      than we were expecting, only complain loudly if we're an OP or a
-      dirserver. Complaining loudly to the OR admins just confuses them.
-    - Tie MAX_DIR_SIZE to MAX_BUF_SIZE, so now directory sizes won't get
-      artificially capped at 500kB.
-
-
-Changes in version 0.0.9.8 - 2005-04-07
-  o Bugfixes on 0.0.9.x:
-    - We have a bug that I haven't found yet. Sometimes, very rarely,
-      cpuworkers get stuck in the 'busy' state, even though the cpuworker
-      thinks of itself as idle. This meant that no new circuits ever got
-      established. Here's a workaround to kill any cpuworker that's been
-      busy for more than 100 seconds.
-
-
-Changes in version 0.1.0.2-rc - 2005-04-01
-  o Bugfixes on 0.1.0.1-rc:
-    - Fixes on reachability detection:
-      - Don't check for reachability while hibernating.
-      - If ORPort is reachable but DirPort isn't, still publish the
-        descriptor, but zero out DirPort until it's found reachable.
-      - When building testing circs for ORPort testing, use only
-        high-bandwidth nodes, so fewer circuits fail.
-      - Complain about unreachable ORPort separately from unreachable
-        DirPort, so the user knows what's going on.
-      - Make sure we only conclude ORPort reachability if we didn't
-        initiate the conn. Otherwise we could falsely conclude that
-        we're reachable just because we connected to the guy earlier
-        and he used that same pipe to extend to us.
-      - Authdirservers shouldn't do ORPort reachability detection,
-        since they're in clique mode, so it will be rare to find a
-        server not already connected to them.
-      - When building testing circuits, always pick middle hops running
-        Tor 0.0.9.7, so we avoid the "can't extend to unknown routers"
-        bug. (This is a kludge; it will go away when 0.0.9.x becomes
-        obsolete.)
-      - When we decide we're reachable, actually publish our descriptor
-        right then.
-    - Fix bug in redirectstream in the controller.
-    - Fix the state descriptor strings so logs don't claim edge streams
-      are in a different state than they actually are.
-    - Use recent libevent features when possible (this only really affects
-      win32 and osx right now, because the new libevent with these
-      features hasn't been released yet). Add code to suppress spurious
-      libevent log msgs.
-    - Prevent possible segfault in connection_close_unattached_ap().
-    - Fix newlines on torrc in win32.
-    - Improve error msgs when tor-resolve fails.
-
-  o Improvements on 0.0.9.x:
-    - New experimental script tor/contrib/ExerciseServer.py (needs more
-      work) that uses the controller interface to build circuits and
-      fetch pages over them. This will help us bootstrap servers that
-      have lots of capacity but haven't noticed it yet.
-    - New experimental script tor/contrib/PathDemo.py (needs more work)
-      that uses the controller interface to let you choose whole paths
-      via addresses like
-      "...path"
-    - When we've connected to an OR and handshaked but didn't like
-      the result, we were closing the conn without sending destroy
-      cells back for pending circuits. Now send those destroys.
-
-
-Changes in version 0.0.9.7 - 2005-04-01
-  o Bugfixes on 0.0.9.x:
-    - Fix another race crash bug (thanks to Glenn Fink for reporting).
-    - Compare identity to identity, not to nickname, when extending to
-      a router not already in the directory. This was preventing us from
-      extending to unknown routers. Oops.
-    - Make sure to create OS X Tor user in <500 range, so we aren't
-      creating actual system users.
-    - Note where connection-that-hasn't-sent-end was marked, and fix
-      a few really loud instances of this harmless bug (it's fixed more
-      in 0.1.0.x).
-
-
-Changes in version 0.1.0.1-rc - 2005-03-28
-  o New features:
-    - Add reachability testing. Your Tor server will automatically try
-      to see if its ORPort and DirPort are reachable from the outside,
-      and it won't upload its descriptor until it decides they are.
-    - Handle unavailable hidden services better. Handle slow or busy
-      hidden services better.
-    - Add support for CONNECTing through https proxies, with "HttpsProxy"
-      config option.
-    - New exit policy: accept most low-numbered ports, rather than
-      rejecting most low-numbered ports.
-    - More Tor controller support (still experimental). See
-      http://tor.eff.org/doc/control-spec.txt for all the new features,
-      including signals to emulate unix signals from any platform;
-      redirectstream; extendcircuit; mapaddress; getinfo; postdescriptor;
-      closestream; closecircuit; etc.
-    - Make nt services work and start on startup on win32 (based on
-      patch by Matt Edman).
-    - Add a new AddressMap config directive to rewrite incoming socks
-      addresses. This lets you, for example, declare an implicit
-      required exit node for certain sites.
-    - Add a new TrackHostExits config directive to trigger addressmaps
-      for certain incoming socks addresses -- for sites that break when
-      your exit keeps changing (based on patch by Mike Perry).
-    - Redo the client-side dns cache so it's just an addressmap too.
-    - Notice when our IP changes, and reset stats/uptime/reachability.
-    - When an application is using socks5, give him the whole variety of
-      potential socks5 responses (connect refused, host unreachable, etc),
-      rather than just "success" or "failure".
-    - A more sane version numbering system. See
-      http://tor.eff.org/cvs/tor/doc/version-spec.txt for details.
-    - New contributed script "exitlist": a simple python script to
-      parse directories and find Tor nodes that exit to listed
-      addresses/ports.
-    - New contributed script "privoxy-tor-toggle" to toggle whether
-      Privoxy uses Tor. Seems to be configured for Debian by default.
-    - Report HTTP reasons to client when getting a response from directory
-      servers -- so you can actually know what went wrong.
-    - New config option MaxAdvertisedBandwidth which lets you advertise
-      a low bandwidthrate (to not attract as many circuits) while still
-      allowing a higher bandwidthrate in reality.
-
-  o Robustness/stability fixes:
-    - Make Tor use Niels Provos's libevent instead of its current
-      poll-but-sometimes-select mess. This will let us use faster async
-      cores (like epoll, kpoll, and /dev/poll), and hopefully work better
-      on Windows too.
-    - pthread support now too. This was forced because when we forked,
-      we ended up wasting a lot of duplicate ram over time. Also switch
-      to foo_r versions of some library calls to allow reentry and
-      threadsafeness.
-    - Better handling for heterogeneous / unreliable nodes:
-      - Annotate circuits w/ whether they aim to contain high uptime nodes
-        and/or high capacity nodes. When building circuits, choose
-        appropriate nodes.
-      - This means that every single node in an intro rend circuit,
-        not just the last one, will have a minimum uptime.
-      - New config option LongLivedPorts to indicate application streams
-        that will want high uptime circuits.
-      - Servers reset uptime when a dir fetch entirely fails. This
-        hopefully reflects stability of the server's network connectivity.
-      - If somebody starts his tor server in Jan 2004 and then fixes his
-        clock, don't make his published uptime be a year.
-      - Reset published uptime when you wake up from hibernation.
-    - Introduce a notion of 'internal' circs, which are chosen without
-      regard to the exit policy of the last hop. Intro and rendezvous
-      circs must be internal circs, to avoid leaking information. Resolve
-      and connect streams can use internal circs if they want.
-    - New circuit pooling algorithm: make sure to have enough circs around
-      to satisfy any predicted ports, and also make sure to have 2 internal
-      circs around if we've required internal circs lately (and with high
-      uptime if we've seen that lately too).
-    - Split NewCircuitPeriod option into NewCircuitPeriod (30 secs),
-      which describes how often we retry making new circuits if current
-      ones are dirty, and MaxCircuitDirtiness (10 mins), which describes
-      how long we're willing to make use of an already-dirty circuit.
-    - Cannibalize GENERAL circs to be C_REND, C_INTRO, S_INTRO, and S_REND
-      circ as necessary, if there are any completed ones lying around
-      when we try to launch one.
-    - Make hidden services try to establish a rendezvous for 30 seconds,
-      rather than for n (where n=3) attempts to build a circuit.
-    - Change SHUTDOWN_WAIT_LENGTH from a fixed 30 secs to a config option
-      "ShutdownWaitLength".
-    - Try to be more zealous about calling connection_edge_end when
-      things go bad with edge conns in connection.c.
-    - Revise tor-spec to add more/better stream end reasons.
-    - Revise all calls to connection_edge_end to avoid sending "misc",
-      and to take errno into account where possible.
-
-  o Bug fixes:
-    - Fix a race condition that can trigger an assert, when we have a
-      pending create cell and an OR connection fails right then.
-    - Fix several double-mark-for-close bugs, e.g. where we were finding
-      a conn for a cell even if that conn is already marked for close.
-    - Make sequence of log messages when starting on win32 with no config
-      file more reasonable.
-    - When choosing an exit node for a new non-internal circ, don't take
-      into account whether it'll be useful for any pending x.onion
-      addresses -- it won't.
-    - Turn addr_policy_compare from a tristate to a quadstate; this should
-      help address our "Ah, you allow 1.2.3.4:80. You are a good choice
-      for google.com" problem.
-    - Make "platform" string in descriptor more accurate for Win32 servers,
-      so it's not just "unknown platform".
-    - Fix an edge case in parsing config options (thanks weasel).
-      If they say "--" on the commandline, it's not an option.
-    - Reject odd-looking addresses at the client (e.g. addresses that
-      contain a colon), rather than having the server drop them because
-      they're malformed.
-    - tor-resolve requests were ignoring .exit if there was a working circuit
-      they could use instead.
-    - REUSEADDR on normal platforms means you can rebind to the port
-      right after somebody else has let it go. But REUSEADDR on win32
-      means to let you bind to the port _even when somebody else
-      already has it bound_! So, don't do that on Win32.
-    - Change version parsing logic: a version is "obsolete" if it is not
-      recommended and (1) there is a newer recommended version in the
-      same series, or (2) there are no recommended versions in the same
-      series, but there are some recommended versions in a newer series.
-      A version is "new" if it is newer than any recommended version in
-      the same series.
-    - Stop most cases of hanging up on a socks connection without sending
-      the socks reject.
-
-  o Helpful fixes:
-    - Require BandwidthRate to be at least 20kB/s for servers.
-    - When a dirserver causes you to give a warn, mention which dirserver
-      it was.
-    - New config option DirAllowPrivateAddresses for authdirservers.
-      Now by default they refuse router descriptors that have non-IP or
-      private-IP addresses.
-    - Stop publishing socksport in the directory, since it's not
-      actually meant to be public. For compatibility, publish a 0 there
-      for now.
-    - Change DirFetchPeriod/StatusFetchPeriod to have a special "Be
-      smart" value, that is low for servers and high for clients.
-    - If our clock jumps forward by 100 seconds or more, assume something
-      has gone wrong with our network and abandon all not-yet-used circs.
-    - Warn when exit policy implicitly allows local addresses.
-    - If we get an incredibly skewed timestamp from a dirserver mirror
-      that isn't a verified OR, don't warn -- it's probably him that's
-      wrong.
-    - Since we ship our own Privoxy on OS X, tweak it so it doesn't write
-      cookies to disk and doesn't log each web request to disk. (Thanks
-      to Brett Carrington for pointing this out.)
-    - When a client asks us for a dir mirror and we don't have one,
-      launch an attempt to get a fresh one.
-    - If we're hibernating and we get a SIGINT, exit immediately.
-    - Add --with-dmalloc ./configure option, to track memory leaks.
-    - And try to free all memory on closing, so we can detect what
-      we're leaking.
-    - Cache local dns resolves correctly even when they're .exit
-      addresses.
-    - Give a better warning when some other server advertises an
-      ORPort that is actually an apache running ssl.
-    - Add "opt hibernating 1" to server descriptor to make it clearer
-      whether the server is hibernating.
-
-
-Changes in version 0.0.9.6 - 2005-03-24
-  o Bugfixes on 0.0.9.x (crashes and asserts):
-    - Add new end stream reasons to maintainance branch. Fix bug where
-      reason (8) could trigger an assert. Prevent bug from recurring.
-    - Apparently win32 stat wants paths to not end with a slash.
-    - Fix assert triggers in assert_cpath_layer_ok(), where we were
-      blowing away the circuit that conn->cpath_layer points to, then
-      checking to see if the circ is well-formed. Backport check to make
-      sure we dont use the cpath on a closed connection.
-    - Prevent circuit_resume_edge_reading_helper() from trying to package
-      inbufs for marked-for-close streams.
-    - Don't crash on hup if your options->address has become unresolvable.
-    - Some systems (like OS X) sometimes accept() a connection and tell
-      you the remote host is 0.0.0.0:0. If this happens, due to some
-      other mis-features, we get confused; so refuse the conn for now.
-
-  o Bugfixes on 0.0.9.x (other):
-    - Fix harmless but scary "Unrecognized content encoding" warn message.
-    - Add new stream error reason: TORPROTOCOL reason means "you are not
-      speaking a version of Tor I understand; say bye-bye to your stream."
-    - Be willing to cache directories from up to ROUTER_MAX_AGE seconds
-      into the future, now that we are more tolerant of skew. This
-      resolves a bug where a Tor server would refuse to cache a directory
-      because all the directories it gets are too far in the future;
-      yet the Tor server never logs any complaints about clock skew.
-    - Mac packaging magic: make man pages useable, and do not overwrite
-      existing torrc files.
-    - Make OS X log happily to /var/log/tor/tor.log
-
-
-Changes in version 0.0.9.5 - 2005-02-22
-  o Bugfixes on 0.0.9.x:
-    - Fix an assert race at exit nodes when resolve requests fail.
-    - Stop picking unverified dir mirrors--it only leads to misery.
-    - Patch from Matt Edman to make NT services work better. Service
-      support is still not compiled into the executable by default.
-    - Patch from Dmitri Bely so the Tor service runs better under
-      the win32 SYSTEM account.
-    - Make tor-resolve actually work (?) on Win32.
-    - Fix a sign bug when getrlimit claims to have 4+ billion
-      file descriptors available.
-    - Stop refusing to start when bandwidthburst == bandwidthrate.
-    - When create cells have been on the onion queue more than five
-      seconds, just send back a destroy and take them off the list.
-
-
-Changes in version 0.0.9.4 - 2005-02-03
-  o Bugfixes on 0.0.9:
-    - Fix an assert bug that took down most of our servers: when
-      a server claims to have 1 GB of bandwidthburst, don't
-      freak out.
-    - Don't crash as badly if we have spawned the max allowed number
-      of dnsworkers, or we're out of file descriptors.
-    - Block more file-sharing ports in the default exit policy.
-    - MaxConn is now automatically set to the hard limit of max
-      file descriptors we're allowed (ulimit -n), minus a few for
-      logs, etc.
-    - Give a clearer message when servers need to raise their
-      ulimit -n when they start running out of file descriptors.
-    - SGI Compatibility patches from Jan Schaumann.
-    - Tolerate a corrupt cached directory better.
-    - When a dirserver hasn't approved your server, list which one.
-    - Go into soft hibernation after 95% of the bandwidth is used,
-      not 99%. This is especially important for daily hibernators who
-      have a small accounting max. Hopefully it will result in fewer
-      cut connections when the hard hibernation starts.
-    - Load-balance better when using servers that claim more than
-      800kB/s of capacity.
-    - Make NT services work (experimental, only used if compiled in).
-
-
-Changes in version 0.0.9.3 - 2005-01-21
-  o Bugfixes on 0.0.9:
-    - Backport the cpu use fixes from main branch, so busy servers won't
-      need as much processor time.
-    - Work better when we go offline and then come back, or when we
-      run Tor at boot before the network is up. We do this by
-      optimistically trying to fetch a new directory whenever an
-      application request comes in and we think we're offline -- the
-      human is hopefully a good measure of when the network is back.
-    - Backport some minimal hidserv bugfixes: keep rend circuits open as
-      long as you keep using them; actually publish hidserv descriptors
-      shortly after they change, rather than waiting 20-40 minutes.
-    - Enable Mac startup script by default.
-    - Fix duplicate dns_cancel_pending_resolve reported by Giorgos Pallas.
-    - When you update AllowUnverifiedNodes or FirewallPorts via the
-      controller's setconf feature, we were always appending, never
-      resetting.
-    - When you update HiddenServiceDir via setconf, it was screwing up
-      the order of reading the lines, making it fail.
-    - Do not rewrite a cached directory back to the cache; otherwise we
-      will think it is recent and not fetch a newer one on startup.
-    - Workaround for webservers that lie about Content-Encoding: Tor
-      now tries to autodetect compressed directories and compression
-      itself. This lets us Proxypass dir fetches through apache.
-
-
-Changes in version 0.0.9.2 - 2005-01-04
-  o Bugfixes on 0.0.9 (crashes and asserts):
-    - Fix an assert on startup when the disk is full and you're logging
-      to a file.
-    - If you do socks4 with an IP of 0.0.0.x but *don't* provide a socks4a
-      style address, then we'd crash.
-    - Fix an assert trigger when the running-routers string we get from
-      a dirserver is broken.
-    - Make worker threads start and run on win32. Now win32 servers
-      may work better.
-    - Bandaid (not actually fix, but now it doesn't crash) an assert
-      where the dns worker dies mysteriously and the main Tor process
-      doesn't remember anything about the address it was resolving.
-
-  o Bugfixes on 0.0.9 (Win32):
-    - Workaround for brain-damaged __FILE__ handling on MSVC: keep Nick's
-      name out of the warning/assert messages.
-    - Fix a superficial "unhandled error on read" bug on win32.
-    - The win32 installer no longer requires a click-through for our
-      license, since our Free Software license grants rights but does not
-      take any away.
-    - Win32: When connecting to a dirserver fails, try another one
-      immediately. (This was already working for non-win32 Tors.)
-    - Stop trying to parse $HOME on win32 when hunting for default
-      DataDirectory.
-    - Make tor-resolve.c work on win32 by calling network_init().
-
-  o Bugfixes on 0.0.9 (other):
-    - Make 0.0.9.x build on Solaris again.
-    - Due to a fencepost error, we were blowing away the \n when reporting
-      confvalue items in the controller. So asking for multiple config
-      values at once couldn't work.
-    - When listing circuits that are pending on an opening OR connection,
-      if we're an OR we were listing circuits that *end* at us as
-      being pending on every listener, dns/cpu worker, etc. Stop that.
-    - Dirservers were failing to create 'running-routers' or 'directory'
-      strings if we had more than some threshold of routers. Fix them so
-      they can handle any number of routers.
-    - Fix a superficial "Duplicate mark for close" bug.
-    - Stop checking for clock skew for OR connections, even for servers.
-    - Fix a fencepost error that was chopping off the last letter of any
-      nickname that is the maximum allowed nickname length.
-    - Update URLs in log messages so they point to the new website.
-    - Fix a potential problem in mangling server private keys while
-      writing to disk (not triggered yet, as far as we know).
-    - Include the licenses for other free software we include in Tor,
-      now that we're shipping binary distributions more regularly.
-
-
-Changes in version 0.0.9.1 - 2004-12-15
-  o Bugfixes on 0.0.9:
-    - Make hibernation actually work.
-    - Make HashedControlPassword config option work.
-    - When we're reporting event circuit status to a controller,
-      don't use the stream status code.
-
-
-Changes in version 0.0.9 - 2004-12-12
-  o Cleanups:
-    - Clean up manpage and torrc.sample file.
-    - Clean up severities and text of log warnings.
-  o Mistakes:
-    - Make servers trigger an assert when they enter hibernation.
-
-
-Changes in version 0.0.9rc7 - 2004-12-08
-  o Bugfixes on 0.0.9rc:
-    - Fix a stack-trashing crash when an exit node begins hibernating.
-    - Avoid looking at unallocated memory while considering which
-      ports we need to build circuits to cover.
-    - Stop a sigpipe: when an 'end' cell races with eof from the app,
-      we shouldn't hold-open-until-flush if the eof arrived first.
-    - Fix a bug with init_cookie_authentication() in the controller.
-    - When recommending new-format log lines, if the upper bound is
-      LOG_ERR, leave it implicit.
-
-  o Bugfixes on 0.0.8.1:
-    - Fix a whole slew of memory leaks.
-    - Fix isspace() and friends so they still make Solaris happy
-      but also so they don't trigger asserts on win32.
-    - Fix parse_iso_time on platforms without strptime (eg win32).
-    - win32: tolerate extra "readable" events better.
-    - win32: when being multithreaded, leave parent fdarray open.
-    - Make unit tests work on win32.
-
-
-Changes in version 0.0.9rc6 - 2004-12-06
-  o Bugfixes on 0.0.9pre:
-    - Clean up some more integer underflow opportunities (not exploitable
-      we think).
-    - While hibernating, hup should not regrow our listeners.
-    - Send an end to the streams we close when we hibernate, rather
-      than just chopping them off.
-    - React to eof immediately on non-open edge connections.
-
-  o Bugfixes on 0.0.8.1:
-    - Calculate timeout for waiting for a connected cell from the time
-      we sent the begin cell, not from the time the stream started. If
-      it took a long time to establish the circuit, we would time out
-      right after sending the begin cell.
-    - Fix router_compare_addr_to_addr_policy: it was not treating a port
-      of * as always matching, so we were picking reject *:* nodes as
-      exit nodes too. Oops.
-
-  o Features:
-    - New circuit building strategy: keep a list of ports that we've
-      used in the past 6 hours, and always try to have 2 circuits open
-      or on the way that will handle each such port. Seed us with port
-      80 so web users won't complain that Tor is "slow to start up".
-    - Make kill -USR1 dump more useful stats about circuits.
-    - When warning about retrying or giving up, print the address, so
-      the user knows which one it's talking about.
-    - If you haven't used a clean circuit in an hour, throw it away,
-      just to be on the safe side. (This means after 6 hours a totally
-      unused Tor client will have no circuits open.)
-
-
-Changes in version 0.0.9rc5 - 2004-12-01
-  o Bugfixes on 0.0.8.1:
-    - Disallow NDEBUG. We don't ever want anybody to turn off debug.
-    - Let resolve conns retry/expire also, rather than sticking around
-      forever.
-    - If we are using select, make sure we stay within FD_SETSIZE.
-
-  o Bugfixes on 0.0.9pre:
-    - Fix integer underflow in tor_vsnprintf() that may be exploitable,
-      but doesn't seem to be currently; thanks to Ilja van Sprundel for
-      finding it.
-    - If anybody set DirFetchPostPeriod, give them StatusFetchPeriod
-      instead. Impose minima and maxima for all *Period options; impose
-      even tighter maxima for fetching if we are a caching dirserver.
-      Clip rather than rejecting.
-    - Fetch cached running-routers from servers that serve it (that is,
-      authdirservers and servers running 0.0.9rc5-cvs or later.)
-
-  o Features:
-    - Accept *:706 (silc) in default exit policy.
-    - Implement new versioning format for post 0.1.
-    - Support "foo.nickname.exit" addresses, to let Alice request the
-      address "foo" as viewed by exit node "nickname". Based on a patch
-      by Geoff Goodell.
-    - Make tor --version --version dump the cvs Id of every file.
-
-
-Changes in version 0.0.9rc4 - 2004-11-28
-  o Bugfixes on 0.0.8.1:
-    - Make windows sockets actually non-blocking (oops), and handle
-      win32 socket errors better.
-
-  o Bugfixes on 0.0.9rc1:
-    - Actually catch the -USR2 signal.
-
-
-Changes in version 0.0.9rc3 - 2004-11-25
-  o Bugfixes on 0.0.8.1:
-    - Flush the log file descriptor after we print "Tor opening log file",
-      so we don't see those messages days later.
-
-  o Bugfixes on 0.0.9rc1:
-    - Make tor-resolve work again.
-    - Avoid infinite loop in tor-resolve if tor hangs up on it.
-    - Fix an assert trigger for clients/servers handling resolves.
-
-
-Changes in version 0.0.9rc2 - 2004-11-24
-  o Bugfixes on 0.0.9rc1:
-    - I broke socks5 support while fixing the eof bug.
-    - Allow unitless bandwidths and intervals; they default to bytes
-      and seconds.
-    - New servers don't start out hibernating; they are active until
-      they run out of bytes, so they have a better estimate of how
-      long it takes, and so their operators can know they're working.
-
-
-Changes in version 0.0.9rc1 - 2004-11-23
-  o Bugfixes on 0.0.8.1:
-    - Finally fix a bug that's been plaguing us for a year:
-      With high load, circuit package window was reaching 0. Whenever
-      we got a circuit-level sendme, we were reading a lot on each
-      socket, but only writing out a bit. So we would eventually reach
-      eof. This would be noticed and acted on even when there were still
-      bytes sitting in the inbuf.
-    - When poll() is interrupted, we shouldn't believe the revents values.
-
-  o Bugfixes on 0.0.9pre6:
-    - Fix hibernate bug that caused pre6 to be broken.
-    - Don't keep rephist info for routers that haven't had activity for
-      24 hours. (This matters now that clients have keys, since we track
-      them too.)
-    - Never call close_temp_logs while validating log options.
-    - Fix backslash-escaping on tor.sh.in and torctl.in.
-
-  o Features:
-    - Implement weekly/monthly/daily accounting: now you specify your
-      hibernation properties by
-      AccountingMax N bytes|KB|MB|GB|TB
-      AccountingStart day|week|month [day] HH:MM
-        Defaults to "month 1 0:00".
-    - Let bandwidth and interval config options be specified as 5 bytes,
-      kb, kilobytes, etc; and as seconds, minutes, hours, days, weeks.
-    - kill -USR2 now moves all logs to loglevel debug (kill -HUP to
-      get back to normal.)
-    - If your requested entry or exit node has advertised bandwidth 0,
-      pick it anyway.
-    - Be more greedy about filling up relay cells -- we try reading again
-      once we've processed the stuff we read, in case enough has arrived
-      to fill the last cell completely.
-    - Apply NT service patch from Osamu Fujino. Still needs more work.
-
-
-Changes in version 0.0.9pre6 - 2004-11-15
-  o Bugfixes on 0.0.8.1:
-    - Fix assert failure on malformed socks4a requests.
-    - Use identity comparison, not nickname comparison, to choose which
-      half of circuit-ID-space each side gets to use. This is needed
-      because sometimes we think of a router as a nickname, and sometimes
-      as a hex ID, and we can't predict what the other side will do.
-    - Catch and ignore SIGXFSZ signals when log files exceed 2GB; our
-      write() call will fail and we handle it there.
-    - Add a FAST_SMARTLIST define to optionally inline smartlist_get
-      and smartlist_len, which are two major profiling offenders.
-
-  o Bugfixes on 0.0.9pre5:
-    - Fix a bug in read_all that was corrupting config files on windows.
-    - When we're raising the max number of open file descriptors to
-      'unlimited', don't log that we just raised it to '-1'.
-    - Include event code with events, as required by control-spec.txt.
-    - Don't give a fingerprint when clients do --list-fingerprint:
-      it's misleading, because it will never be the same again.
-    - Stop using strlcpy in tor_strndup, since it was slowing us
-      down a lot.
-    - Remove warn on startup about missing cached-directory file.
-    - Make kill -USR1 work again.
-    - Hibernate if we start tor during the "wait for wakeup-time" phase
-      of an accounting interval. Log our hibernation plans better.
-    - Authoritative dirservers now also cache their directory, so they
-      have it on start-up.
-
-  o Features:
-    - Fetch running-routers; cache running-routers; compress
-      running-routers; serve compressed running-routers.z
-    - Add NSI installer script contributed by J Doe.
-    - Commit VC6 and VC7 workspace/project files.
-    - Commit a tor.spec for making RPM files, with help from jbash.
-    - Add contrib/torctl.in contributed by Glenn Fink.
-    - Implement the control-spec's SAVECONF command, to write your
-      configuration to torrc.
-    - Get cookie authentication for the controller closer to working.
-    - Include control-spec.txt in the tarball.
-    - When set_conf changes our server descriptor, upload a new copy.
-      But don't upload it too often if there are frequent changes.
-    - Document authentication config in man page, and document signals
-      we catch.
-    - Clean up confusing parts of man page and torrc.sample.
-    - Make expand_filename handle ~ and ~username.
-    - Use autoconf to enable largefile support where necessary. Use
-      ftello where available, since ftell can fail at 2GB.
-    - Distinguish between TOR_TLS_CLOSE and TOR_TLS_ERROR, so we can
-      log more informatively.
-    - Give a slightly more useful output for "tor -h".
-    - Refuse application socks connections to port 0.
-    - Check clock skew for verified servers, but allow unverified
-      servers and clients to have any clock skew.
-    - Break DirFetchPostPeriod into:
-      - DirFetchPeriod for fetching full directory,
-      - StatusFetchPeriod for fetching running-routers,
-      - DirPostPeriod for posting server descriptor,
-      - RendPostPeriod for posting hidden service descriptors.
-    - Make sure the hidden service descriptors are at a random offset
-      from each other, to hinder linkability.
-
-
-Changes in version 0.0.9pre5 - 2004-11-09
-  o Bugfixes on 0.0.9pre4:
-    - Fix a seg fault in unit tests (doesn't affect main program).
-    - Fix an assert bug where a hidden service provider would fail if
-      the first hop of his rendezvous circuit was down.
-    - Hidden service operators now correctly handle version 1 style
-      INTRODUCE1 cells (nobody generates them still, so not a critical
-      bug).
-    - If do_hup fails, actually notice.
-    - Handle more errnos from accept() without closing the listener.
-      Some OpenBSD machines were closing their listeners because
-      they ran out of file descriptors.
-    - Send resolve cells to exit routers that are running a new
-      enough version of the resolve code to work right.
-    - Better handling of winsock includes on non-MSV win32 compilers.
-    - Some people had wrapped their tor client/server in a script
-      that would restart it whenever it died. This did not play well
-      with our "shut down if your version is obsolete" code. Now people
-      don't fetch a new directory if their local cached version is
-      recent enough.
-    - Make our autogen.sh work on ksh as well as bash.
-
-  o Major Features:
-    - Hibernation: New config option "AccountingMaxKB" lets you
-      set how many KBytes per month you want to allow your server to
-      consume. Rather than spreading those bytes out evenly over the
-      month, we instead hibernate for some of the month and pop up
-      at a deterministic time, work until the bytes are consumed, then
-      hibernate again. Config option "MonthlyAccountingStart" lets you
-      specify which day of the month your billing cycle starts on.
-    - Control interface: a separate program can now talk to your
-      client/server over a socket, and get/set config options, receive
-      notifications of circuits and streams starting/finishing/dying,
-      bandwidth used, etc. The next step is to get some GUIs working.
-      Let us know if you want to help out. See doc/control-spec.txt .
-    - Ship a contrib/tor-control.py as an example script to interact
-      with the control port.
-    - "tor --hash-password zzyxz" will output a salted password for
-      use in authenticating to the control interface.
-    - New log format in config:
-      "Log minsev[-maxsev] stdout|stderr|syslog" or
-      "Log minsev[-maxsev] file /var/foo"
-
-  o Minor Features:
-    - DirPolicy config option, to let people reject incoming addresses
-      from their dirserver.
-    - "tor --list-fingerprint" will list your identity key fingerprint
-      and then exit.
-    - Add "pass" target for RedirectExit, to make it easier to break
-      out of a sequence of RedirectExit rules.
-    - Clients now generate a TLS cert too, in preparation for having
-      them act more like real nodes.
-    - Ship src/win32/ in the tarball, so people can use it to build.
-    - Make old win32 fall back to CWD if SHGetSpecialFolderLocation
-      is broken.
-    - New "router-status" line in directory, to better bind each verified
-      nickname to its identity key.
-    - Deprecate unofficial config option abbreviations, and abbreviations
-      not on the command line.
-    - Add a pure-C tor-resolve implementation.
-    - Use getrlimit and friends to ensure we can reach MaxConn (currently
-      1024) file descriptors.
-
-  o Code security improvements, inspired by Ilja:
-    - Replace sprintf with snprintf. (I think they were all safe, but
-      hey.)
-    - Replace strcpy/strncpy with strlcpy in more places.
-    - Avoid strcat; use snprintf or strlcat instead.
-    - snprintf wrapper with consistent (though not C99) overflow behavior.
-
-
-Changes in version 0.0.9pre4 - 2004-10-17
-  o Bugfixes on 0.0.9pre3:
-    - If the server doesn't specify an exit policy, use the real default
-      exit policy, not reject *:*.
-    - Ignore fascistfirewall when uploading/downloading hidden service
-      descriptors, since we go through Tor for those; and when using
-      an HttpProxy, since we assume it can reach them all.
-    - When looking for an authoritative dirserver, use only the ones
-      configured at boot. Don't bother looking in the directory.
-    - The rest of the fix for get_default_conf_file() on older win32.
-    - Make 'Routerfile' config option obsolete.
-
-  o Features:
-    - New 'MyFamily nick1,...' config option for a server to
-      specify other servers that shouldn't be used in the same circuit
-      with it. Only believed if nick1 also specifies us.
-    - New 'NodeFamily nick1,nick2,...' config option for a client to
-      specify nodes that it doesn't want to use in the same circuit.
-    - New 'Redirectexit pattern address:port' config option for a
-      server to redirect exit connections, e.g. to a local squid.
-
-
-Changes in version 0.0.9pre3 - 2004-10-13
-  o Bugfixes on 0.0.8.1:
-    - Better torrc example lines for dirbindaddress and orbindaddress.
-    - Improved bounds checking on parsed ints (e.g. config options and
-      the ones we find in directories.)
-    - Better handling of size_t vs int, so we're more robust on 64
-      bit platforms.
-    - Fix the rest of the bug where a newly started OR would appear
-      as unverified even after we've added his fingerprint and hupped
-      the dirserver.
-    - Fix a bug from 0.0.7: when read() failed on a stream, we would
-      close it without sending back an end. So 'connection refused'
-      would simply be ignored and the user would get no response.
-
-  o Bugfixes on 0.0.9pre2:
-    - Serving the cached-on-disk directory to people is bad. We now
-      provide no directory until we've fetched a fresh one.
-    - Workaround for bug on windows where cached-directories get crlf
-      corruption.
-    - Make get_default_conf_file() work on older windows too.
-    - If we write a *:* exit policy line in the descriptor, don't write
-      any more exit policy lines.
-
-  o Features:
-    - Use only 0.0.9pre1 and later servers for resolve cells.
-    - Make the dirservers file obsolete.
-      - Include a dir-signing-key token in directories to tell the
-        parsing entity which key is being used to sign.
-      - Remove the built-in bulky default dirservers string.
-      - New config option "Dirserver %s:%d [fingerprint]", which can be
-        repeated as many times as needed. If no dirservers specified,
-        default to moria1,moria2,tor26.
-    - Make moria2 advertise a dirport of 80, so people behind firewalls
-      will be able to get a directory.
-    - Http proxy support
-      - Dirservers translate requests for http://%s:%d/x to /x
-      - You can specify "HttpProxy %s[:%d]" and all dir fetches will
-        be routed through this host.
-      - Clients ask for /tor/x rather than /x for new enough dirservers.
-        This way we can one day coexist peacefully with apache.
-      - Clients specify a "Host: %s%d" http header, to be compatible
-        with more proxies, and so running squid on an exit node can work.
-
-
-Changes in version 0.0.8.1 - 2004-10-13
-  o Bugfixes:
-    - Fix a seg fault that can be triggered remotely for Tor
-      clients/servers with an open dirport.
-    - Fix a rare assert trigger, where routerinfos for entries in
-      our cpath would expire while we're building the path.
-    - Fix a bug in OutboundBindAddress so it (hopefully) works.
-    - Fix a rare seg fault for people running hidden services on
-      intermittent connections.
-    - Fix a bug in parsing opt keywords with objects.
-    - Fix a stale pointer assert bug when a stream detaches and
-      reattaches.
-    - Fix a string format vulnerability (probably not exploitable)
-      in reporting stats locally.
-    - Fix an assert trigger: sometimes launching circuits can fail
-      immediately, e.g. because too many circuits have failed recently.
-    - Fix a compile warning on 64 bit platforms.
-
-
-Changes in version 0.0.9pre2 - 2004-10-03
-  o Bugfixes:
-    - Make fetching a cached directory work for 64-bit platforms too.
-    - Make zlib.h a required header, not an optional header.
-
-
-Changes in version 0.0.9pre1 - 2004-10-01
-  o Bugfixes:
-    - Stop using separate defaults for no-config-file and
-      empty-config-file. Now you have to explicitly turn off SocksPort,
-      if you don't want it open.
-    - Fix a bug in OutboundBindAddress so it (hopefully) works.
-    - Improve man page to mention more of the 0.0.8 features.
-    - Fix a rare seg fault for people running hidden services on
-      intermittent connections.
-    - Change our file IO stuff (especially wrt OpenSSL) so win32 is
-      happier.
-    - Fix more dns related bugs: send back resolve_failed and end cells
-      more reliably when the resolve fails, rather than closing the
-      circuit and then trying to send the cell. Also attach dummy resolve
-      connections to a circuit *before* calling dns_resolve(), to fix
-      a bug where cached answers would never be sent in RESOLVED cells.
-    - When we run out of disk space, or other log writing error, don't
-      crash. Just stop logging to that log and continue.
-    - We were starting to daemonize before we opened our logs, so if
-      there were any problems opening logs, we would complain to stderr,
-      which wouldn't work, and then mysteriously exit.
-    - Fix a rare bug where sometimes a verified OR would connect to us
-      before he'd uploaded his descriptor, which would cause us to
-      assign conn->nickname as though he's unverified. Now we look through
-      the fingerprint list to see if he's there.
-    - Fix a rare assert trigger, where routerinfos for entries in
-      our cpath would expire while we're building the path.
-
-  o Features:
-    - Clients can ask dirservers for /dir.z to get a compressed version
-      of the directory. Only works for servers running 0.0.9, of course.
-    - Make clients cache directories and use them to seed their router
-      lists at startup. This means clients have a datadir again.
-    - Configuration infrastructure support for warning on obsolete
-      options.
-    - Respond to content-encoding headers by trying to uncompress as
-      appropriate.
-    - Reply with a deflated directory when a client asks for "dir.z".
-      We could use allow-encodings instead, but allow-encodings isn't
-      specified in HTTP 1.0.
-    - Raise the max dns workers from 50 to 100.
-    - Discourage people from setting their dirfetchpostperiod more often
-      than once per minute.
-    - Protect dirservers from overzealous descriptor uploading -- wait
-      10 seconds after directory gets dirty, before regenerating.
-
-
-Changes in version 0.0.8 - 2004-08-25
-  o Port it to SunOS 5.9 / Athena
-
-
-Changes in version 0.0.8rc2 - 2004-08-20
-  o Make it compile on cygwin again.
-  o When picking unverified routers, skip those with low uptime and/or
-    low bandwidth, depending on what properties you care about.
-
-
-Changes in version 0.0.8rc1 - 2004-08-18
-  o Changes from 0.0.7.3:
-    - Bugfixes:
-      - Fix assert triggers: if the other side returns an address 0.0.0.0,
-        don't put it into the client dns cache.
-      - If a begin failed due to exit policy, but we believe the IP address
-        should have been allowed, switch that router to exitpolicy reject *:*
-        until we get our next directory.
-    - Features:
-      - Clients choose nodes proportional to advertised bandwidth.
-      - Avoid using nodes with low uptime as introduction points.
-      - Handle servers with dynamic IP addresses: don't replace
-        options->Address with the resolved one at startup, and
-        detect our address right before we make a routerinfo each time.
-      - 'FascistFirewall' option to pick dirservers and ORs on specific
-        ports; plus 'FirewallPorts' config option to tell FascistFirewall
-        which ports are open. (Defaults to 80,443)
-      - Be more aggressive about trying to make circuits when the network
-        has changed (e.g. when you unsuspend your laptop).
-      - Check for time skew on http headers; report date in response to
-        "GET /".
-      - If the entrynode config line has only one node, don't pick it as
-        an exitnode.
-      - Add strict{entry|exit}nodes config options. If set to 1, then
-        we refuse to build circuits that don't include the specified entry
-        or exit nodes.
-      - OutboundBindAddress config option, to bind to a specific
-        IP address for outgoing connect()s.
-      - End truncated log entries (e.g. directories) with "[truncated]".
-
-  o Patches to 0.0.8preX:
-    - Bugfixes:
-      - Patches to compile and run on win32 again (maybe)?
-      - Fix crash when looking for ~/.torrc with no $HOME set.
-      - Fix a race bug in the unit tests.
-      - Handle verified/unverified name collisions better when new
-        routerinfo's arrive in a directory.
-      - Sometimes routers were getting entered into the stats before
-        we'd assigned their identity_digest. Oops.
-      - Only pick and establish intro points after we've gotten a
-        directory.
-    - Features:
-      - AllowUnverifiedNodes config option to let circuits choose no-name
-        routers in entry,middle,exit,introduction,rendezvous positions.
-        Allow middle and rendezvous positions by default.
-      - Add a man page for tor-resolve.
-
-
-Changes in version 0.0.7.3 - 2004-08-12
-  o Stop dnsworkers from triggering an assert failure when you
-    ask them to resolve the host "".
-
-
-Changes in version 0.0.8pre3 - 2004-08-09
-  o Changes from 0.0.7.2:
-    - Allow multiple ORs with same nickname in routerlist -- now when
-      people give us one identity key for a nickname, then later
-      another, we don't constantly complain until the first expires.
-    - Remember used bandwidth (both in and out), and publish 15-minute
-      snapshots for the past day into our descriptor.
-    - You can now fetch $DIRURL/running-routers to get just the
-      running-routers line, not the whole descriptor list. (But
-      clients don't use this yet.)
-    - When people mistakenly use Tor as an http proxy, point them
-      at the tor-doc.html rather than the INSTALL.
-    - Remove our mostly unused -- and broken -- hex_encode()
-      function. Use base16_encode() instead. (Thanks to Timo Lindfors
-      for pointing out this bug.)
-    - Rotate onion keys every 12 hours, not every 2 hours, so we have
-      fewer problems with people using the wrong key.
-    - Change the default exit policy to reject the default edonkey,
-      kazaa, gnutella ports.
-    - Add replace_file() to util.[ch] to handle win32's rename().
-
-  o Changes from 0.0.8preX:
-    - Fix two bugs in saving onion keys to disk when rotating, so
-      hopefully we'll get fewer people using old onion keys.
-    - Fix an assert error that was making SocksPolicy not work.
-    - Be willing to expire routers that have an open dirport -- it's
-      just the authoritative dirservers we want to not forget.
-    - Reject tor-resolve requests for .onion addresses early, so we
-      don't build a whole rendezvous circuit and then fail.
-    - When you're warning a server that he's unverified, don't cry
-      wolf unpredictably.
-    - Fix a race condition: don't try to extend onto a connection
-      that's still handshaking.
-    - For servers in clique mode, require the conn to be open before
-      you'll choose it for your path.
-    - Fix some cosmetic bugs about duplicate mark-for-close, lack of
-      end relay cell, etc.
-    - Measure bandwidth capacity over the last 24 hours, not just 12
-    - Bugfix: authoritative dirservers were making and signing a new
-      directory for each client, rather than reusing the cached one.
-
-
-Changes in version 0.0.8pre2 - 2004-08-04
-  o Changes from 0.0.7.2:
-    - Security fixes:
-      - Check directory signature _before_ you decide whether you're
-        you're running an obsolete version and should exit.
-      - Check directory signature _before_ you parse the running-routers
-        list to decide who's running or verified.
-    - Bugfixes and features:
-      - Check return value of fclose while writing to disk, so we don't
-        end up with broken files when servers run out of disk space.
-      - Log a warning if the user uses an unsafe socks variant, so people
-        are more likely to learn about privoxy or socat.
-      - Dirservers now include RFC1123-style dates in the HTTP headers,
-        which one day we will use to better detect clock skew.
-
-  o Changes from 0.0.8pre1:
-    - Make it compile without warnings again on win32.
-    - Log a warning if you're running an unverified server, to let you
-      know you might want to get it verified.
-    - Only pick a default nickname if you plan to be a server.
-
-
-Changes in version 0.0.8pre1 - 2004-07-23
-  o Bugfixes:
-    - Made our unit tests compile again on OpenBSD 3.5, and tor
-      itself compile again on OpenBSD on a sparc64.
-    - We were neglecting milliseconds when logging on win32, so
-      everything appeared to happen at the beginning of each second.
-
-  o Protocol changes:
-    - 'Extend' relay cell payloads now include the digest of the
-      intended next hop's identity key. Now we can verify that we're
-      extending to the right router, and also extend to routers we
-      hadn't heard of before.
-
-  o Features:
-    - Tor nodes can now act as relays (with an advertised ORPort)
-      without being manually verified by the dirserver operators.
-      - Uploaded descriptors of unverified routers are now accepted
-        by the dirservers, and included in the directory.
-      - Verified routers are listed by nickname in the running-routers
-        list; unverified routers are listed as "$".
-      - We now use hash-of-identity-key in most places rather than
-        nickname or addr:port, for improved security/flexibility.
-      - To avoid Sybil attacks, paths still use only verified servers.
-        But now we have a chance to play around with hybrid approaches.
-      - Nodes track bandwidth usage to estimate capacity (not used yet).
-      - ClientOnly option for nodes that never want to become servers.
-    - Directory caching.
-      - "AuthoritativeDir 1" option for the official dirservers.
-      - Now other nodes (clients and servers) will cache the latest
-        directory they've pulled down.
-      - They can enable their DirPort to serve it to others.
-      - Clients will pull down a directory from any node with an open
-        DirPort, and check the signature/timestamp correctly.
-      - Authoritative dirservers now fetch directories from other
-        authdirservers, to stay better synced.
-      - Running-routers list tells who's down also, along with noting
-        if they're verified (listed by nickname) or unverified (listed
-        by hash-of-key).
-      - Allow dirservers to serve running-router list separately.
-        This isn't used yet.
-    - ORs connect-on-demand to other ORs
-      - If you get an extend cell to an OR you're not connected to,
-        connect, handshake, and forward the create cell.
-      - The authoritative dirservers stay connected to everybody,
-        and everybody stays connected to 0.0.7 servers, but otherwise
-        clients/servers expire unused connections after 5 minutes.
-    - When servers get a sigint, they delay 30 seconds (refusing new
-      connections) then exit. A second sigint causes immediate exit.
-    - File and name management:
-      - Look for .torrc if no CONFDIR "torrc" is found.
-      - If no datadir is defined, then choose, make, and secure ~/.tor
-        as datadir.
-      - If torrc not found, exitpolicy reject *:*.
-      - Expands ~/ in filenames to $HOME/ (but doesn't yet expand ~arma).
-      - If no nickname is defined, derive default from hostname.
-      - Rename secret key files, e.g. identity.key -> secret_id_key,
-        to discourage people from mailing their identity key to tor-ops.
-    - Refuse to build a circuit before the directory has arrived --
-      it won't work anyway, since you won't know the right onion keys
-      to use.
-    - Try other dirservers immediately if the one you try is down. This
-      should tolerate down dirservers better now.
-    - Parse tor version numbers so we can do an is-newer-than check
-      rather than an is-in-the-list check.
-    - New socks command 'resolve', to let us shim gethostbyname()
-      locally.
-      - A 'tor_resolve' script to access the socks resolve functionality.
-      - A new socks-extensions.txt doc file to describe our
-        interpretation and extensions to the socks protocols.
-    - Add a ContactInfo option, which gets published in descriptor.
-    - Publish OR uptime in descriptor (and thus in directory) too.
-    - Write tor version at the top of each log file
-    - New docs in the tarball:
-      - tor-doc.html.
-      - Document that you should proxy your SSL traffic too.
-
-
-Changes in version 0.0.7.2 - 2004-07-07
-  o A better fix for the 0.0.0.0 problem, that will hopefully
-    eliminate the remaining related assertion failures.
-
-
-Changes in version 0.0.7.1 - 2004-07-04
-  o When an address resolves to 0.0.0.0, treat it as a failed resolve,
-    since internally we use 0.0.0.0 to signify "not yet resolved".
-
-
-Changes in version 0.0.7 - 2004-06-07
-  o Updated the man page to reflect the new features.
-
-
-Changes in version 0.0.7rc2 - 2004-06-06
-  o Changes from 0.0.7rc1:
-    - Make it build on Win32 again.
-  o Changes from 0.0.6.2:
-    - Rotate dnsworkers and cpuworkers on SIGHUP, so they get new config
-      settings too.
-
-
-Changes in version 0.0.7rc1 - 2004-06-02
-  o Bugfixes:
-    - On sighup, we were adding another log without removing the first
-      one. So log messages would get duplicated n times for n sighups.
-    - Several cases of using a connection after we'd freed it. The
-      problem was that connections that are pending resolve are in both
-      the pending_resolve tree, and also the circuit's resolving_streams
-      list. When you want to remove one, you must remove it from both.
-    - Fix a double-mark-for-close where an end cell arrived for a
-      resolving stream, and then the resolve failed.
-    - Check directory signatures based on name of signer, not on whom
-      we got the directory from. This will let us cache directories more
-      easily.
-  o Features:
-    - Crank up some of our constants to handle more users.
-
-
-Changes in version 0.0.7pre1 - 2004-06-02
-  o Fixes for crashes and other obnoxious bugs:
-    - Fix an epipe bug: sometimes when directory connections failed
-      to connect, we would give them a chance to flush before closing
-      them.
-    - When we detached from a circuit because of resolvefailed, we
-      would immediately try the same circuit twice more, and then
-      give up on the resolve thinking we'd tried three different
-      exit nodes.
-    - Limit the number of intro circuits we'll attempt to build for a
-      hidden service per 15-minute period.
-    - Check recommended-software string *early*, before actually parsing
-      the directory. Thus we can detect an obsolete version and exit,
-      even if the new directory format doesn't parse.
-  o Fixes for security bugs:
-    - Remember which nodes are dirservers when you startup, and if a
-      random OR enables his dirport, don't automatically assume he's
-      a trusted dirserver.
-  o Other bugfixes:
-    - Directory connections were asking the wrong poll socket to
-      start writing, and not asking themselves to start writing.
-    - When we detached from a circuit because we sent a begin but
-      didn't get a connected, we would use it again the first time;
-      but after that we would correctly switch to a different one.
-    - Stop warning when the first onion decrypt attempt fails; they
-      will sometimes legitimately fail now that we rotate keys.
-    - Override unaligned-access-ok check when $host_cpu is ia64 or
-      arm. Apparently they allow it but the kernel whines.
-    - Dirservers try to reconnect periodically too, in case connections
-      have failed.
-    - Fix some memory leaks in directory servers.
-    - Allow backslash in Win32 filenames.
-    - Made Tor build complain-free on FreeBSD, hopefully without
-      breaking other BSD builds. We'll see.
-  o Features:
-    - Doxygen markup on all functions and global variables.
-    - Make directory functions update routerlist, not replace it. So
-      now directory disagreements are not so critical a problem.
-    - Remove the upper limit on number of descriptors in a dirserver's
-      directory (not that we were anywhere close).
-    - Allow multiple logfiles at different severity ranges.
-    - Allow *BindAddress to specify ":port" rather than setting *Port
-      separately. Allow multiple instances of each BindAddress config
-      option, so you can bind to multiple interfaces if you want.
-    - Allow multiple exit policy lines, which are processed in order.
-      Now we don't need that huge line with all the commas in it.
-    - Enable accept/reject policies on SOCKS connections, so you can bind
-      to 0.0.0.0 but still control who can use your OP.
-
-
-Changes in version 0.0.6.2 - 2004-05-16
-  o Our integrity-checking digest was checking only the most recent cell,
-    not the previous cells like we'd thought.
-    Thanks to Stefan Mark for finding the flaw!
-
-
-Changes in version 0.0.6.1 - 2004-05-06
-  o Fix two bugs in our AES counter-mode implementation (this affected
-    onion-level stream encryption, but not TLS-level). It turns
-    out we were doing something much more akin to a 16-character
-    polyalphabetic cipher. Oops.
-    Thanks to Stefan Mark for finding the flaw!
-  o Retire moria3 as a directory server, and add tor26 as a directory
-    server.
-
-
-Changes in version 0.0.6 - 2004-05-02
-  [version bump only]
-
-
-Changes in version 0.0.6rc4 - 2004-05-01
-  o Update the built-in dirservers list to use the new directory format
-  o Fix a rare seg fault: if a node offering a hidden service attempts
-    to build a circuit to Alice's rendezvous point and fails before it
-    reaches the last hop, it retries with a different circuit, but
-    then dies.
-  o Handle windows socket errors correctly.
-
-
-Changes in version 0.0.6rc3 - 2004-04-28
-  o Don't expire non-general excess circuits (if we had enough
-    circuits open, we were expiring rendezvous circuits -- even
-    when they had a stream attached. oops.)
-  o Fetch randomness from /dev/urandom better (not via fopen/fread)
-  o Better debugging for tls errors
-  o Some versions of openssl have an SSL_pending function that erroneously
-    returns bytes when there is a non-application record pending.
-  o Set Content-Type on the directory and hidserv descriptor.
-  o Remove IVs from cipher code, since AES-ctr has none.
-  o Win32 fixes. Tor now compiles on win32 with no warnings/errors.
-    o We were using an array of length zero in a few places.
-    o win32's gethostbyname can't resolve an IP to an IP.
-    o win32's close can't close a socket.
-
-
-Changes in version 0.0.6rc2 - 2004-04-26
-  o Fix a bug where we were closing tls connections intermittently.
-    It turns out openssl keeps its errors around -- so if an error
-    happens, and you don't ask about it, and then another openssl
-    operation happens and succeeds, and you ask if there was an error,
-    it tells you about the first error. Fun fun.
-  o Fix a bug that's been lurking since 27 may 03 (!)
-    When passing back a destroy cell, we would use the wrong circ id.
-    'Mostly harmless', but still worth fixing.
-  o Since we don't support truncateds much, don't bother sending them;
-    just close the circ.
-  o check for  so we build on NetBSD again (I hope).
-  o don't crash if a conn that sent a begin has suddenly lost its circuit
-    (this was quite rare).
-
-
-Changes in version 0.0.6rc1 - 2004-04-25
-  o We now rotate link (tls context) keys and onion keys.
-  o CREATE cells now include oaep padding, so you can tell
-    if you decrypted them correctly.
-  o Add bandwidthburst to server descriptor.
-  o Directories now say which dirserver signed them.
-  o Use a tor_assert macro that logs failed assertions too.
-
-
-Changes in version 0.0.6pre5 - 2004-04-18
-  o changes from 0.0.6pre4:
-    - make tor build on broken freebsd 5.2 installs
-    - fix a failed assert when you try an intro point, get a nack, and try
-      a second one and it works.
-    - when alice uses a port that the hidden service doesn't accept,
-      it now sends back an end cell (denied by exit policy). otherwise
-      alice would just have to wait to time out.
-    - fix another rare bug: when we had tried all the intro
-      points for a hidden service, we fetched the descriptor
-      again, but we left our introcirc thinking it had already
-      sent an intro, so it kept waiting for a response...
-    - bugfix: when you sleep your hidden-service laptop, as soon
-      as it wakes up it tries to upload a service descriptor, but
-      socketpair fails for some reason (localhost not up yet?).
-      now we simply give up on that upload, and we'll try again later.
-      i'd still like to find the bug though.
-    - if an intro circ waiting for an ack dies before getting one, then
-      count it as a nack
-    - we were reusing stale service descriptors and refetching usable
-      ones. oops.
-
-
-Changes in version 0.0.6pre4 - 2004-04-14
-  o changes from 0.0.6pre3:
-    - when bob fails to connect to the rendezvous point, and his
-      circ didn't fail because of the rendezvous point itself, then
-      he retries a couple of times
-    - we expire introduction and rendezvous circs more thoroughly
-      (sometimes they were hanging around forever)
-    - we expire unattached rendezvous streams that have been around
-      too long (they were sticking around forever).
-    - fix a measly fencepost error that was crashing everybody with
-      a strict glibc.
-
-
-Changes in version 0.0.6pre3 - 2004-04-14
-  o changes from 0.0.6pre2:
-    - make hup work again
-    - fix some memory leaks for dirservers
-    - allow more skew in rendezvous descriptor timestamps, to help
-      handle people like blanu who don't know what time it is
-    - normal circs are 3 hops, but some rend/intro circs are 4, if
-      the initiator doesn't get to choose the last hop
-    - send acks for introductions, so alice can know whether to try
-      again
-    - bob publishes intro points more correctly
-  o changes from 0.0.5:
-    - fix an assert trigger that's been plaguing us since the days
-      of 0.0.2prexx (thanks weasel!)
-    - retry stream correctly when we fail to connect because of
-      exit-policy-reject (should try another) or can't-resolve-address
-      (also should try another, because dns on random internet servers
-      is flaky).
-    - when we hup a dirserver and we've *removed* a server from the
-      approved-routers list, now we remove that server from the
-      in-memory directories too
-
-
-Changes in version 0.0.6pre2 - 2004-04-08
-  o We fixed our base32 implementation. Now it works on all architectures.
-
-
-Changes in version 0.0.6pre1 - 2004-04-08
-  o Features:
-    - Hidden services and rendezvous points are implemented. Go to
-      http://6sxoyfb3h2nvok2d.onion/ for an index of currently available
-      hidden services. (This only works via a socks4a proxy such as
-      Privoxy, and currently it's quite slow.)
-
-
-Changes in version 0.0.5 - 2004-03-30
-  [version bump only]
-
-
-Changes in version 0.0.5rc3 - 2004-03-29
-  o Install torrc as torrc.sample -- we no longer clobber your
-    torrc. (Woo!)
-  o Re-enable recommendedversion checking (we broke it in rc2, oops)
-  o Add in a 'notice' log level for things the operator should hear
-    but that aren't warnings
-
-
-Changes in version 0.0.5rc2 - 2004-03-29
-  o Hold socks connection open until reply is flushed (if possible)
-  o Make exit nodes resolve IPs to IPs immediately, rather than asking
-    the dns farm to do it.
-  o Fix c99 aliasing warnings in rephist.c
-  o Don't include server descriptors that are older than 24 hours in the
-    directory.
-  o Give socks 'reject' replies their whole 15s to attempt to flush,
-    rather than seeing the 60s timeout and assuming the flush had failed.
-  o Clean automake droppings from the cvs repository
-
-
-Changes in version 0.0.5rc1 - 2004-03-28
-  o Fix mangled-state bug in directory fetching (was causing sigpipes).
-  o Only build circuits after we've fetched the directory: clients were
-    using only the directory servers before they'd fetched a directory.
-    This also means longer startup time; so it goes.
-  o Fix an assert trigger where an OP would fail to handshake, and we'd
-    expect it to have a nickname.
-  o Work around a tsocks bug: do a socks reject when AP connection dies
-    early, else tsocks goes into an infinite loop.
-
-
-Changes in version 0.0.4 - 2004-03-26
-  o When connecting to a dirserver or OR and the network is down,
-    we would crash.
-
-
-Changes in version 0.0.3 - 2004-03-26
-  o Warn and fail if server chose a nickname with illegal characters
-  o Port to Solaris and Sparc:
-    - include missing header fcntl.h
-    - have autoconf find -lsocket -lnsl automatically
-    - deal with hardware word alignment
-    - make uname() work (solaris has a different return convention)
-    - switch from using signal() to sigaction()
-  o Preliminary work on reputation system:
-    - Keep statistics on success/fail of connect attempts; they're published
-      by kill -USR1 currently.
-    - Add a RunTesting option to try to learn link state by creating test
-      circuits, even when SocksPort is off.
-    - Remove unused open circuits when there are too many.
-
-
-Changes in version 0.0.2 - 2004-03-19
-    - Include strlcpy and strlcat for safer string ops
-    - define INADDR_NONE so we compile (but still not run) on solaris
-
-
-Changes in version 0.0.2pre27 - 2004-03-14
-  o Bugfixes:
-    - Allow internal tor networks (we were rejecting internal IPs,
-      now we allow them if they're set explicitly).
-    - And fix a few endian issues.
-
-
-Changes in version 0.0.2pre26 - 2004-03-14
-  o New features:
-    - If a stream times out after 15s without a connected cell, don't
-      try that circuit again: try a new one.
-    - Retry streams at most 4 times. Then give up.
-    - When a dirserver gets a descriptor from an unknown router, it
-      logs its fingerprint (so the dirserver operator can choose to
-      accept it even without mail from the server operator).
-    - Inform unapproved servers when we reject their descriptors.
-    - Make tor build on Windows again. It works as a client, who knows
-      about as a server.
-    - Clearer instructions in the torrc for how to set up a server.
-    - Be more efficient about reading fd's when our global token bucket
-      (used for rate limiting) becomes empty.
-  o Bugfixes:
-    - Stop asserting that computers always go forward in time. It's
-      simply not true.
-    - When we sent a cell (e.g. destroy) and then marked an OR connection
-      expired, we might close it before finishing a flush if the other
-      side isn't reading right then.
-    - Don't allow dirservers to start if they haven't defined
-      RecommendedVersions
-    - We were caching transient dns failures. Oops.
-    - Prevent servers from publishing an internal IP as their address.
-    - Address a strcat vulnerability in circuit.c
-
-
-Changes in version 0.0.2pre25 - 2004-03-04
-  o New features:
-    - Put the OR's IP in its router descriptor, not its fqdn. That way
-      we'll stop being stalled by gethostbyname for nodes with flaky dns,
-      e.g. poblano.
-  o Bugfixes:
-    - If the user typed in an address that didn't resolve, the server
-      crashed.
-
-
-Changes in version 0.0.2pre24 - 2004-03-03
-  o Bugfixes:
-    - Fix an assertion failure in dns.c, where we were trying to dequeue
-      a pending dns resolve even if it wasn't pending
-    - Fix a spurious socks5 warning about still trying to write after the
-      connection is finished.
-    - Hold certain marked_for_close connections open until they're finished
-      flushing, rather than losing bytes by closing them too early.
-    - Correctly report the reason for ending a stream
-    - Remove some duplicate calls to connection_mark_for_close
-    - Put switch_id and start_daemon earlier in the boot sequence, so it
-      will actually try to chdir() to options.DataDirectory
-    - Make 'make test' exit(1) if a test fails; fix some unit tests
-    - Make tor fail when you use a config option it doesn't know about,
-      rather than warn and continue.
-    - Make --version work
-    - Bugfixes on the rpm spec file and tor.sh, so it's more up to date
-
-
-Changes in version 0.0.2pre23 - 2004-02-29
-  o New features:
-    - Print a statement when the first circ is finished, so the user
-      knows it's working.
-    - If a relay cell is unrecognized at the end of the circuit,
-      send back a destroy. (So attacks to mutate cells are more
-      clearly thwarted.)
-    - New config option 'excludenodes' to avoid certain nodes for circuits.
-    - When it daemonizes, it chdir's to the DataDirectory rather than "/",
-      so you can collect coredumps there.
- o Bugfixes:
-    - Fix a bug in tls flushing where sometimes data got wedged and
-      didn't flush until more data got sent. Hopefully this bug was
-      a big factor in the random delays we were seeing.
-    - Make 'connected' cells include the resolved IP, so the client
-      dns cache actually gets populated.
-    - Disallow changing from ORPort=0 to ORPort>0 on hup.
-    - When we time-out on a stream and detach from the circuit, send an
-      end cell down it first.
-    - Only warn about an unknown router (in exitnodes, entrynodes,
-      excludenodes) after we've fetched a directory.
-
-
-Changes in version 0.0.2pre22 - 2004-02-26
-  o New features:
-    - Servers publish less revealing uname information in descriptors.
-    - More memory tracking and assertions, to crash more usefully when
-      errors happen.
-    - If the default torrc isn't there, just use some default defaults.
-      Plus provide an internal dirservers file if they don't have one.
-    - When the user tries to use Tor as an http proxy, give them an http
-      501 failure explaining that we're a socks proxy.
-    - Dump a new router.desc on hup, to help confused people who change
-      their exit policies and then wonder why router.desc doesn't reflect
-      it.
-    - Clean up the generic tor.sh init script that we ship with.
-  o Bugfixes:
-    - If the exit stream is pending on the resolve, and a destroy arrives,
-      then the stream wasn't getting removed from the pending list. I
-      think this was the one causing recent server crashes.
-    - Use a more robust poll on OSX 10.3, since their poll is flaky.
-    - When it couldn't resolve any dirservers, it was useless from then on.
-      Now it reloads the RouterFile (or default dirservers) if it has no
-      dirservers.
-    - Move the 'tor' binary back to /usr/local/bin/ -- it turns out
-      many users don't even *have* a /usr/local/sbin/.
-
-
-Changes in version 0.0.2pre21 - 2004-02-18
-  o New features:
-    - There's a ChangeLog file that actually reflects the changelog.
-    - There's a 'torify' wrapper script, with an accompanying
-      tor-tsocks.conf, that simplifies the process of using tsocks for
-      tor. It even has a man page.
-    - The tor binary gets installed to sbin rather than bin now.
-    - Retry streams where the connected cell hasn't arrived in 15 seconds
-    - Clean up exit policy handling -- get the default out of the torrc,
-      so we can update it without forcing each server operator to fix
-      his/her torrc.
-    - Allow imaps and pop3s in default exit policy
-  o Bugfixes:
-    - Prevent picking middleman nodes as the last node in the circuit
-
-
-Changes in version 0.0.2pre20 - 2004-01-30
-  o New features:
-    - We now have a deb package, and it's in debian unstable. Go to
-      it, apt-getters. :)
-    - I've split the TotalBandwidth option into BandwidthRate (how many
-      bytes per second you want to allow, long-term) and
-      BandwidthBurst (how many bytes you will allow at once before the cap
-      kicks in). This better token bucket approach lets you, say, set
-      BandwidthRate to 10KB/s and BandwidthBurst to 10MB, allowing good
-      performance while not exceeding your monthly bandwidth quota.
-    - Push out a tls record's worth of data once you've got it, rather
-      than waiting until you've read everything waiting to be read. This
-      may improve performance by pipelining better. We'll see.
-    - Add an AP_CONN_STATE_CONNECTING state, to allow streams to detach
-      from failed circuits (if they haven't been connected yet) and attach
-      to new ones.
-    - Expire old streams that haven't managed to connect. Some day we'll
-      have them reattach to new circuits instead.
-
-  o Bugfixes:
-    - Fix several memory leaks that were causing servers to become bloated
-      after a while.
-    - Fix a few very rare assert triggers. A few more remain.
-    - Setuid to User _before_ complaining about running as root.
-
-
-Changes in version 0.0.2pre19 - 2004-01-07
-  o Bugfixes:
-    - Fix deadlock condition in dns farm. We were telling a child to die by
-      closing the parent's file descriptor to him. But newer children were
-      inheriting the open file descriptor from the parent, and since they
-      weren't closing it, the socket never closed, so the child never read
-      eof, so he never knew to exit. Similarly, dns workers were holding
-      open other sockets, leading to all sorts of chaos.
-    - New cleaner daemon() code for forking and backgrounding.
-    - If you log to a file, it now prints an entry at the top of the
-      logfile so you know it's working.
-    - The onionskin challenge length was 30 bytes longer than necessary.
-    - Started to patch up the spec so it's not quite so out of date.
-
-
-Changes in version 0.0.2pre18 - 2004-01-02
-  o Bugfixes:
-    - Fix endian issues with the 'integrity' field in the relay header.
-    - Fix a potential bug where connections in state
-      AP_CONN_STATE_CIRCUIT_WAIT might unexpectedly ask to write.
-
-
-Changes in version 0.0.2pre17 - 2003-12-30
-  o Bugfixes:
-    - Made --debuglogfile (or any second log file, actually) work.
-    - Resolved an edge case in get_unique_circ_id_by_conn where a smart
-      adversary could force us into an infinite loop.
-
-  o Features:
-    - Each onionskin handshake now includes a hash of the computed key,
-      to prove the server's identity and help perfect forward secrecy.
-    - Changed cell size from 256 to 512 bytes (working toward compatibility
-      with MorphMix).
-    - Changed cell length to 2 bytes, and moved it to the relay header.
-    - Implemented end-to-end integrity checking for the payloads of
-      relay cells.
-    - Separated streamid from 'recognized' (otherwise circuits will get
-      messed up when we try to have streams exit from the middle). We
-      use the integrity-checking to confirm that a cell is addressed to
-      this hop.
-    - Randomize the initial circid and streamid values, so an adversary who
-      breaks into a node can't learn how many circuits or streams have
-      been made so far.
-
-
-Changes in version 0.0.2pre16 - 2003-12-14
-  o Bugfixes:
-    - Fixed a bug that made HUP trigger an assert
-    - Fixed a bug where a circuit that immediately failed wasn't being
-      counted as a failed circuit in counting retries.
-
-  o Features:
-    - Now we close the circuit when we get a truncated cell: otherwise we're
-      open to an anonymity attack where a bad node in the path truncates
-      the circuit and then we open streams at him.
-    - Add port ranges to exit policies
-    - Add a conservative default exit policy
-    - Warn if you're running tor as root
-    - on HUP, retry OR connections and close/rebind listeners
-    - options.EntryNodes: try these nodes first when picking the first node
-    - options.ExitNodes: if your best choices happen to include any of
-      your preferred exit nodes, you choose among just those preferred
-      exit nodes.
-    - options.ExcludedNodes: nodes that are never picked in path building
-
-
-Changes in version 0.0.2pre15 - 2003-12-03
-  o Robustness and bugfixes:
-    - Sometimes clients would cache incorrect DNS resolves, which would
-      really screw things up.
-    - An OP that goes offline would slowly leak all its sockets and stop
-      working.
-    - A wide variety of bugfixes in exit node selection, exit policy
-      handling, and processing pending streams when a new circuit is
-      established.
-    - Pick nodes for a path only from those the directory says are up
-    - Choose randomly from all running dirservers, not always the first one
-    - Increase allowed http header size for directory fetch.
-    - Stop writing to stderr (if we're daemonized it will be closed).
-    - Enable -g always, so cores will be more useful to me.
-    - Switch "-lcrypto -lssl" to "-lssl -lcrypto" for broken distributions.
-
-  o Documentation:
-    - Wrote a man page. It lists commonly used options.
-
-  o Configuration:
-    - Change default loglevel to warn.
-    - Make PidFile default to null rather than littering in your CWD.
-    - OnionRouter config option is now obsolete. Instead it just checks
-      ORPort>0.
-    - Moved to a single unified torrc file for both clients and servers.
-
-
-Changes in version 0.0.2pre14 - 2003-11-29
-  o Robustness and bugfixes:
-    - Force the admin to make the DataDirectory himself
-      - to get ownership/permissions right
-      - so clients no longer make a DataDirectory and then never use it
-    - fix bug where a client who was offline for 45 minutes would never
-      pull down a directory again
-    - fix (or at least hide really well) the dns assert bug that was
-      causing server crashes
-    - warnings and improved robustness wrt clockskew for certs
-    - use the native daemon(3) to daemonize, when available
-    - exit if bind() fails
-    - exit if neither socksport nor orport is defined
-    - include our own tor_timegm (Win32 doesn't have its own)
-    - bugfix for win32 with lots of connections
-    - fix minor bias in PRNG
-    - make dirserver more robust to corrupt cached directory
-
-  o Documentation:
-    - Wrote the design document (woo)
-
-  o Circuit building and exit policies:
-    - Circuits no longer try to use nodes that the directory has told them
-      are down.
-    - Exit policies now support bitmasks (18.0.0.0/255.0.0.0) and
-      bitcounts (18.0.0.0/8).
-    - Make AP connections standby for a circuit if no suitable circuit
-      exists, rather than failing
-    - Circuits choose exit node based on addr/port, exit policies, and
-      which AP connections are standing by
-    - Bump min pathlen from 2 to 3
-    - Relay end cells have a payload to describe why the stream ended.
-    - If the stream failed because of exit policy, try again with a new
-      circuit.
-    - Clients have a dns cache to remember resolved addresses.
-    - Notice more quickly when we have no working circuits
-
-  o Configuration:
-    - APPort is now called SocksPort
-    - SocksBindAddress, ORBindAddress, DirBindAddress let you configure
-      where to bind
-    - RecommendedVersions is now a config variable rather than
-      hardcoded (for dirservers)
-    - Reloads config on HUP
-    - Usage info on -h or --help
-    - If you set User and Group config vars, it'll setu/gid to them.
-
-
-Changes in version 0.0.2pre13 - 2003-10-19
-  o General stability:
-    - SSL_write no longer fails when it returns WANTWRITE and the number
-      of bytes in the buf has changed by the next SSL_write call.
-    - Fix segfault fetching directory when network is down
-    - Fix a variety of minor memory leaks
-    - Dirservers reload the fingerprints file on HUP, so I don't have
-      to take down the network when I approve a new router
-    - Default server config file has explicit Address line to specify fqdn
-
-  o Buffers:
-    - Buffers grow and shrink as needed (Cut process size from 20M to 2M)
-    - Make listener connections not ever alloc bufs
-
-  o Autoconf improvements:
-    - don't clobber an external CFLAGS in ./configure
-    - Make install now works
-    - create var/lib/tor on make install
-    - autocreate a tor.sh initscript to help distribs
-    - autocreate the torrc and sample-server-torrc with correct paths
-
-  o Log files and Daemonizing now work:
-    - If --DebugLogFile is specified, log to it at -l debug
-    - If --LogFile is specified, use it instead of commandline
-    - If --RunAsDaemon is set, tor forks and backgrounds on startup
-
diff --git a/src/tor/Doxyfile.in b/src/tor/Doxyfile.in
deleted file mode 100644
index 4cf9c30de..000000000
--- a/src/tor/Doxyfile.in
+++ /dev/null
@@ -1,1395 +0,0 @@
-# Doxyfile 1.5.6
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file 
-# that follow. The default is UTF-8 which is also the encoding used for all 
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-# iconv built into libc) for the transcoding. See 
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = tor
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = @top_builddir@/doc/doxygen
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
-# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
-# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
-# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, 
-# and Ukrainian.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = NO
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
-STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-# DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Java. For instance, namespaces will be presented as packages, qualified 
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-# sources. Doxygen will then generate output that is tailored for 
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-# to include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-# Doxygen will parse them like normal C++ but will assume all classes use public 
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter 
-# and setter methods for a property. Setting this option to YES (the default) 
-# will make doxygen to replace the get and set methods by a property in the 
-# documentation. This will only work if the methods are indeed getting or 
-# setting a simple type. If this is not the case, or you want to show the 
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT   = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-# is documented as struct, union, or enum with the name of the typedef. So 
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-# with name TypeT. When disabled the typedef will appear as a member of a file, 
-# namespace, or class. And the struct will be named TypeS. This can typically 
-# be useful for C code in case the coding convention dictates that all compound 
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT   = NO
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be 
-# extracted and appear in the documentation as a namespace called 
-# 'anonymous_namespace{file}', where file will be replaced with the base 
-# name of the file that contains the anonymous namespace. By default 
-# anonymous namespace are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-# hierarchy of group names into alphabetical order. If set to NO (the default) 
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the 
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from 
-# the version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command  , where  is the value of 
-# the FILE_VERSION_FILTER tag, and  is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
-WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = @top_srcdir@/src/common \
-                         @top_srcdir@/src/or
-
-# This tag can be used to specify the character encoding of the source files 
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-# the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
-
-FILE_PATTERNS          = *.c \
-                         *.h
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                = tree.h
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       = 
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the 
-# output. The symbol name can be a fully qualified name, a word, or if the 
-# wildcard * is used, a substring. Examples: ANamespace, AClass, 
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command  , where  
-# is the value of the INPUT_FILTER tag, and  is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
-INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
-FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.  Otherwise they will link to the documentstion.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files 
-# will be generated that can be used as input for Apple's Xcode 3 
-# integrated development environment, introduced with OSX 10.5 (Leopard). 
-# To create a documentation set, doxygen will generate a Makefile in the 
-# HTML output directory. Running make will produce the docset in that 
-# directory and running "make install" will install the docset in 
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-# it at startup.
-
-GENERATE_DOCSET        = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-# feed. A documentation feed provides an umbrella under which multiple 
-# documentation sets from a single provider (such as a company or product suite) 
-# can be grouped.
-
-DOCSET_FEEDNAME        = "Doxygen generated docs for Tor"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-# should uniquely identify the documentation set bundle. This should be a 
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID       = org.torproject.Tor
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
-# page has loaded. For this to work a browser that supports 
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS  = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-
-CHM_INDEX_ENCODING     = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to FRAME, a side panel will be generated
-# containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature. Other possible values 
-# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
-# and Class Hiererachy pages using a tree view instead of an ordered list;
-# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
-# disables this behavior completely. For backwards compatibility with previous
-# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
-# respectively.
-
-GENERATE_TREEVIEW      = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-# Use this tag to change the font size of Latex formulas included 
-# as images in the HTML documentation. The default is 10. Note that 
-# when you change the font size after a successful doxygen run you need 
-# to manually remove any form_*.png images from the HTML output directory 
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE       = 10
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = 
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = 
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references   
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see 
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-# the mscgen tool resides. If left empty the tool is assumed to be found in the 
-# default search path.
-
-MSCGEN_PATH            = 
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = NO
-
-# By default doxygen will write a font called FreeSans.ttf to the output 
-# directory and reference it in all dot files that doxygen generates. This 
-# font does not include all possible unicode characters however, so when you need 
-# these (or just want a differently looking font) you can specify the font name 
-# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
-# which can be done by putting it in a standard location or by setting the 
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
-# containing the font.
-
-DOT_FONTNAME           =
-
-# By default doxygen will tell dot to use the output directory to look for the 
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
-# different font using DOT_FONTNAME you can set the path where dot 
-# can find it using this tag.
-
-DOT_FONTPATH           = 
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-# doxygen will generate a call dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable call graphs 
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-# doxygen will generate a caller dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable caller 
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-DOTFILE_DIRS           = 
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the 
-# number of direct children of the root node in a graph is already larger than 
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is enabled by default, which results in a transparent 
-# background. Warning: Depending on the platform used, enabling this option 
-# may lead to badly anti-aliased labels on the edges of a graph (i.e. they 
-# become hard to read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/src/tor/INSTALL b/src/tor/INSTALL
deleted file mode 100644
index ddb790b0b..000000000
--- a/src/tor/INSTALL
+++ /dev/null
@@ -1,52 +0,0 @@
-
-Most users who realize that INSTALL files still exist should simply
-follow the directions at
-https://www.torproject.org/docs/tor-doc-unix
-
-If you got the source from git, run "./autogen.sh", which will
-run the various auto* programs. Then you can run ./configure, and
-refer to the above instructions.
-
-If it doesn't build for you:
-
-  If you have problems finding libraries, try
-    CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" \
-    ./configure
-  or
-    ./configure --with-libevent-dir=/usr/local
-  rather than simply ./configure.
-
-  If you have mysterious autoconf failures while linking openssl,
-  consider setting your LD_LIBRARY_PATH to the openssl lib directory.
-  For example, "setenv LD_LIBRARY_PATH /usr/athena/lib".
-
-  Lastly, check out
-  https://www.torproject.org/docs/faq#DoesntWork
-
-How to do static builds of tor:
-
-Tor supports linking each of the libraries it needs statically. Use the
---enable-static-X ./configure option in conjunction with the --with-X-dir
-option for libevent, zlib, and openssl. For this to work sanely, libevent
-should be built with --disable-shared --enable-static --with-pic, and
-OpenSSL should be built with no-shared no-dso.
-
-If you need to build tor so that system libraries are also statically linked,
-use the --enable-static-tor ./configure option. This won't work on OS X
-unless you build the required crt0.o yourself. It is also incompatible with
-the --enable-gcc-hardening option.
-
-An example of how to build a mostly static tor:
-./configure --enable-static-libevent \
-            --enable-static-openssl  \
-            --enable-static-zlib     \
-            --with-libevent-dir=/tmp/static-tor/libevent-1.4.14b-stable \
-            --with-openssl-dir=/tmp/static-tor/openssl-0.9.8r/ \
-            --with-zlib-dir=/tmp/static-tor/zlib-1.2.5
-
-An example of how to build an entirely static tor:
-./configure --enable-static-tor \
-            --with-libevent-dir=/tmp/static-tor/libevent-1.4.14b-stable \
-            --with-openssl-dir=/tmp/static-tor/openssl-0.9.8r/ \
-            --with-zlib-dir=/tmp/static-tor/zlib-1.2.5
-
diff --git a/src/tor/LICENSE b/src/tor/LICENSE
index 3d0f8c121..8a6fccaf4 100644
--- a/src/tor/LICENSE
+++ b/src/tor/LICENSE
@@ -13,7 +13,7 @@ Tor is distributed under this license:
 
 Copyright (c) 2001-2004, Roger Dingledine
 Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
-Copyright (c) 2007-2017, The Tor Project, Inc.
+Copyright (c) 2007-2013, The Tor Project, Inc.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -100,61 +100,6 @@ src/ext/tor_queue.h is licensed under the following license:
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
 
-===============================================================================
-src/ext/csiphash.c is licensed under the following license:
-
- Copyright (c) 2013  Marek Majkowski 
-
- 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.
-===============================================================================
-Trunnel is distributed under this license:
-
-Copyright 2014  The Tor Project, Inc.
-
-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 names of the copyright owners 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.
-
 ===============================================================================
 src/config/geoip is licensed under the following license:
 
@@ -191,7 +136,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ===============================================================================
 m4/pc_from_ucontext.m4 is available under the following license.  Note that
-it is *not* built into the Tor software.
+it is *not* built into the Tor license.
 
 Copyright (c) 2005, Google Inc.
 All rights reserved.
@@ -222,158 +167,6 @@ 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.
 
-===============================================================================
-m4/pkg.m4 is available under the following license.  Note that
-it is *not* built into the Tor software.
-
-pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
-serial 1 (pkg-config-0.24)
-
-Copyright © 2004 Scott James Remnant .
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-As a special exception to the GNU General Public License, if you
-distribute this file as part of a program that contains a
-configuration script generated by Autoconf, you may include it under
-the same distribution terms that you use for the rest of that program.
-===============================================================================
-src/ext/readpassphrase.[ch] are distributed under this license:
-
-  Copyright (c) 2000-2002, 2007 Todd C. Miller 
-
-  Permission to use, copy, modify, and distribute this software for any
-  purpose with or without fee is hereby granted, provided that the above
-  copyright notice and this permission notice appear in all copies.
-
-  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-  Sponsored in part by the Defense Advanced Research Projects
-  Agency (DARPA) and Air Force Research Laboratory, Air Force
-  Materiel Command, USAF, under agreement number F39502-99-1-0512.
-
-===============================================================================
-src/ext/mulodi4.c is distributed under this license:
-
-     =========================================================================
-     compiler_rt License
-     =========================================================================
-
-     The compiler_rt library is dual licensed under both the
-     University of Illinois "BSD-Like" license and the MIT license.
-     As a user of this code you may choose to use it under either
-     license.  As a contributor, you agree to allow your code to be
-     used under both.
-
-     Full text of the relevant licenses is included below.
-
-     =========================================================================
-
-     University of Illinois/NCSA
-     Open Source License
-
-     Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
-
-     All rights reserved.
-
-     Developed by:
-
-         LLVM Team
-
-         University of Illinois at Urbana-Champaign
-
-         http://llvm.org
-
-     Permission is hereby granted, free of charge, to any person
-     obtaining a copy of this software and associated documentation
-     files (the "Software"), to deal with 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:
-
-         * Redistributions of source code must retain the above
-           copyright notice, this list of conditions and the following
-           disclaimers.
-
-         * Redistributions in binary form must reproduce the above
-           copyright notice, this list of conditions and the following
-           disclaimers in the documentation and/or other materials
-           provided with the distribution.
-
-         * Neither the names of the LLVM Team, University of Illinois
-           at Urbana-Champaign, nor the names of its contributors may
-           be used to endorse or promote products derived from this
-           Software without specific prior written permission.
-
-     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 CONTRIBUTORS 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 WITH THE SOFTWARE.
-
-     =========================================================================
-
-     Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
-
-     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.
-
-     =========================================================================
-     Copyrights and Licenses for Third Party Software Distributed with LLVM:
-     =========================================================================
-
-     The LLVM software contains code written by third parties.  Such
-     software will have its own individual LICENSE.TXT file in the
-     directory in which it appears.  This file will describe the
-     copyrights, license, and restrictions which apply to that code.
-
-     The disclaimer of warranty in the University of Illinois Open
-     Source License applies to all code in the LLVM Distribution, and
-     nothing in any of the other licenses gives permission to use the
-     names of the LLVM Team or the University of Illinois to endorse
-     or promote products derived from this Software.
-
 ===============================================================================
 If you got Tor as a static binary with OpenSSL included, then you should know:
  "This product includes software developed by the OpenSSL Project
diff --git a/src/tor/Makefile.am b/src/tor/Makefile.am
deleted file mode 100644
index 3445fc064..000000000
--- a/src/tor/Makefile.am
+++ /dev/null
@@ -1,253 +0,0 @@
-# Copyright (c) 2001-2004, Roger Dingledine
-# Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
-# Copyright (c) 2007-2017, The Tor Project, Inc.
-# See LICENSE for licensing information
-
-ACLOCAL_AMFLAGS = -I m4
-
-noinst_LIBRARIES=
-EXTRA_DIST=
-noinst_HEADERS=
-bin_PROGRAMS=
-EXTRA_PROGRAMS=
-CLEANFILES=
-TESTS=
-noinst_PROGRAMS=
-DISTCLEANFILES=
-bin_SCRIPTS=
-AM_CPPFLAGS=
-AM_CFLAGS=@TOR_SYSTEMD_CFLAGS@ @CFLAGS_BUGTRAP@ @TOR_LZMA_CFLAGS@ @TOR_ZSTD_CFLAGS@
-SHELL=@SHELL@
-
-if COVERAGE_ENABLED
-TESTING_TOR_BINARY=$(top_builddir)/src/or/tor-cov$(EXEEXT)
-else
-TESTING_TOR_BINARY=$(top_builddir)/src/or/tor$(EXEEXT)
-endif
-
-if USE_RUST
-rust_ldadd=$(top_builddir)/src/rust/target/release/@TOR_RUST_STATIC_NAME@
-else
-rust_ldadd=
-endif
-
-include src/include.am
-include doc/include.am
-include contrib/include.am
-
-EXTRA_DIST+= \
-	ChangeLog					\
-	INSTALL						\
-	LICENSE						\
-	Makefile.nmake					\
-	README						\
-	ReleaseNotes					\
-	scripts/maint/checkSpace.pl
-
-## This tells etags how to find mockable function definitions.
-AM_ETAGSFLAGS=--regex='{c}/MOCK_IMPL([^,]+,\W*\([a-zA-Z0-9_]+\)\W*,/\1/s'
-
-if COVERAGE_ENABLED
-TEST_CFLAGS=-fno-inline -fprofile-arcs -ftest-coverage
-if DISABLE_ASSERTS_IN_UNIT_TESTS
-TEST_CPPFLAGS=-DTOR_UNIT_TESTS -DTOR_COVERAGE -DDISABLE_ASSERTS_IN_UNIT_TESTS
-else
-TEST_CPPFLAGS=-DTOR_UNIT_TESTS -DTOR_COVERAGE
-endif
-TEST_NETWORK_FLAGS=--coverage --hs-multi-client 1
-else
-TEST_CFLAGS=
-TEST_CPPFLAGS=-DTOR_UNIT_TESTS
-TEST_NETWORK_FLAGS=--hs-multi-client 1
-endif
-TEST_NETWORK_WARNING_FLAGS=--quiet --only-warnings
-
-if LIBFUZZER_ENABLED
-TEST_CFLAGS += -fsanitize-coverage=trace-pc-guard,trace-cmp,trace-div
-# not "edge"
-endif
-
-TEST_NETWORK_ALL_LOG_DIR=$(top_builddir)/test_network_log
-TEST_NETWORK_ALL_DRIVER_FLAGS=--color-tests yes
-
-#install-data-local:
-#	$(INSTALL) -m 755 -d $(LOCALSTATEDIR)/lib/tor
-
-# Allows to override rpmbuild with rpmbuild-md5 from fedora-packager so that
-# building for EL5 won't fail on https://bugzilla.redhat.com/show_bug.cgi?id=490613
-RPMBUILD ?= rpmbuild
-
-# Use automake's dist-gzip target to build the tarball
-dist-rpm: dist-gzip
-	TIMESTAMP=$$(date +"%Y-%m-%d_%H.%M.%S"); 				\
-	RPM_BUILD_DIR=$$(mktemp -d "/tmp/tor-rpm-build-$$TIMESTAMP-XXXX");	\
-	mkdir -p "$$RPM_BUILD_DIR"/{BUILD,RPMS,SOURCES/"tor-$(VERSION)",SPECS,SRPMS}; \
-	cp -fa "$(distdir).tar.gz" "$$RPM_BUILD_DIR"/SOURCES/;			\
-	LIBS=-lrt $(RPMBUILD) -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; 	\
-	cp -fa "$$RPM_BUILD_DIR"/SRPMS/* .;                           		\
-	cp -fa "$$RPM_BUILD_DIR"/RPMS/* .;                            		\
-	rm -rf "$$RPM_BUILD_DIR";						\
-	echo "RPM build finished";						\
-	#end of dist-rpm
-
-doxygen:
-	doxygen && cd doc/doxygen/latex && make
-
-test: all
-	$(top_builddir)/src/test/test
-
-check-local: check-spaces check-changes
-
-need-chutney-path:
-	@if test ! -d "$$CHUTNEY_PATH"; then \
-		echo '$$CHUTNEY_PATH was not set.'; \
-		if test -d $(top_srcdir)/../chutney -a -x $(top_srcdir)/../chutney/chutney; then \
-			echo "Assuming test-network.sh will find" $(top_srcdir)/../chutney; \
-		else \
-			echo; \
-			echo "To run these tests, git clone https://git.torproject.org/chutney.git ; export CHUTNEY_PATH=\`pwd\`/chutney"; \
-			exit 1; \
-		fi \
-	fi
-
-# Note that test-network requires a copy of Chutney in $CHUTNEY_PATH.
-# Chutney can be cloned from https://git.torproject.org/chutney.git .
-test-network: need-chutney-path $(TESTING_TOR_BINARY) src/tools/tor-gencert
-	$(top_srcdir)/src/test/test-network.sh $(TEST_NETWORK_FLAGS)
-
-# Run all available tests using automake's test-driver
-# only run IPv6 tests if we can ping6 ::1 (localhost)
-# some IPv6 tests will fail without an IPv6 DNS server (see #16971 and #17011)
-# only run mixed tests if we have a tor-stable binary
-# Try both the BSD and the Linux ping6 syntax, because they're incompatible
-test-network-all: need-chutney-path test-driver $(TESTING_TOR_BINARY) src/tools/tor-gencert
-	mkdir -p $(TEST_NETWORK_ALL_LOG_DIR)
-	@flavors="$(TEST_CHUTNEY_FLAVORS)"; \
-	if ping6 -q -c 1 -o ::1 >/dev/null 2>&1 || ping6 -q -c 1 -W 1 ::1 >/dev/null 2>&1; then \
-		echo "ping6 ::1 succeeded, running IPv6 flavors: $(TEST_CHUTNEY_FLAVORS_IPV6)."; \
-		flavors="$$flavors $(TEST_CHUTNEY_FLAVORS_IPV6)"; \
-	else \
-		echo "ping6 ::1 failed, skipping IPv6 flavors: $(TEST_CHUTNEY_FLAVORS_IPV6)."; \
-		skip_flavors="$$skip_flavors $(TEST_CHUTNEY_FLAVORS_IPV6)"; \
-	fi; \
-	if command -v tor-stable >/dev/null 2>&1; then \
-		echo "tor-stable found, running mixed flavors: $(TEST_CHUTNEY_FLAVORS_MIXED)."; \
-		flavors="$$flavors $(TEST_CHUTNEY_FLAVORS_MIXED)"; \
-	else \
-		echo "tor-stable not found, skipping mixed flavors: $(TEST_CHUTNEY_FLAVORS_MIXED)."; \
-		skip_flavors="$$skip_flavors $(TEST_CHUTNEY_FLAVORS_MIXED)"; \
-	fi; \
-	for f in $$skip_flavors; do \
-		echo "SKIP: $$f"; \
-	done; \
-	for f in $$flavors; do \
-		$(SHELL) $(top_srcdir)/test-driver --test-name $$f --log-file $(TEST_NETWORK_ALL_LOG_DIR)/$$f.log --trs-file $(TEST_NETWORK_ALL_LOG_DIR)/$$f.trs $(TEST_NETWORK_ALL_DRIVER_FLAGS) $(top_srcdir)/src/test/test-network.sh --flavor $$f $(TEST_NETWORK_FLAGS); \
-		$(top_srcdir)/src/test/test-network.sh $(TEST_NETWORK_WARNING_FLAGS); \
-	done; \
-	echo "Log and result files are available in $(TEST_NETWORK_ALL_LOG_DIR)."; \
-	! grep -q FAIL test_network_log/*.trs
-
-need-stem-path:
-	@if test ! -d "$$STEM_SOURCE_DIR"; then \
-		echo '$$STEM_SOURCE_DIR was not set.'; echo; \
-		echo "To run these tests, git clone https://git.torproject.org/stem.git/ ; export STEM_SOURCE_DIR=\`pwd\`/stem"; \
-		exit 1; \
-	fi
-
-test-stem: need-stem-path $(TESTING_TOR_BINARY)
-	@$(PYTHON) "$$STEM_SOURCE_DIR"/run_tests.py --tor "$(TESTING_TOR_BINARY)" --all --log notice --target RUN_ALL;
-
-test-stem-full: need-stem-path $(TESTING_TOR_BINARY)
-	@$(PYTHON) "$$STEM_SOURCE_DIR"/run_tests.py --tor "$(TESTING_TOR_BINARY)" --all --log notice --target RUN_ALL,ONLINE -v;
-
-test-full: need-stem-path need-chutney-path check test-network test-stem
-
-test-full-online: need-stem-path need-chutney-path check test-network test-stem-full
-
-reset-gcov:
-	rm -f $(top_builddir)/src/*/*.gcda $(top_builddir)/src/*/*/*.gcda
-
-HTML_COVER_DIR=$(top_builddir)/coverage_html
-coverage-html: all
-if COVERAGE_ENABLED
-	test -e "`which lcov`" || (echo "lcov must be installed. See ." && false)
-	test -d "$(HTML_COVER_DIR)" || $(MKDIR_P) "$(HTML_COVER_DIR)"
-	lcov --rc lcov_branch_coverage=1 --directory $(top_builddir)/src --zerocounters
-	$(MAKE) reset-gcov
-	$(MAKE) check
-	lcov --capture --rc lcov_branch_coverage=1 --no-external --directory $(top_builddir) --base-directory $(top_srcdir) --output-file "$(HTML_COVER_DIR)/lcov.tmp"
-	lcov --remove "$(HTML_COVER_DIR)/lcov.tmp" --rc lcov_branch_coverage=1 'test/*' 'ext/tinytest*' '/usr/*' --output-file "$(HTML_COVER_DIR)/lcov.info"
-	genhtml --branch-coverage -o "$(HTML_COVER_DIR)" "$(HTML_COVER_DIR)/lcov.info"
-else
-	@printf "Not configured with --enable-coverage, run ./configure --enable-coverage\n"
-endif
-
-coverage-html-full: all
-	test -e "`which lcov`" || (echo "lcov must be installed. See ." && false)
-	test -d "$(HTML_COVER_DIR)" || mkdir -p "$(HTML_COVER_DIR)"
-	lcov --rc lcov_branch_coverage=1 --directory ./src --zerocounters
-	$(MAKE) reset-gcov
-	$(MAKE) check
-	$(MAKE) test-stem-full
-	CHUTNEY_TOR=tor-cov CHUTNEY_TOR_GENCERT=tor-cov-gencert $(top_srcdir)/src/test/test-network.sh
-	CHUTNEY_TOR=tor-cov CHUTNEY_TOR_GENCERT=tor-cov-gencert $(top_srcdir)/src/test/test-network.sh --flavor hs
-	lcov --capture --rc lcov_branch_coverage=1 --no-external --directory . --output-file "$(HTML_COVER_DIR)/lcov.tmp"
-	lcov --remove "$(HTML_COVER_DIR)/lcov.tmp" --rc lcov_branch_coverage=1 'test/*' 'ext/tinytest*' '/usr/*' --output-file "$(HTML_COVER_DIR)/lcov.info"
-	genhtml --branch-coverage -o "$(HTML_COVER_DIR)" "$(HTML_COVER_DIR)/lcov.info"
-
-# Avoid strlcpy.c, strlcat.c, aes.c, OpenBSD_malloc_Linux.c, sha256.c,
-# tinytest*.[ch]
-check-spaces:
-if USE_PERL
-	$(PERL) $(top_srcdir)/scripts/maint/checkSpace.pl -C \
-		$(top_srcdir)/src/common/*.[ch] \
-		$(top_srcdir)/src/or/*.[ch] \
-		$(top_srcdir)/src/test/*.[ch] \
-		$(top_srcdir)/src/test/*/*.[ch] \
-		$(top_srcdir)/src/tools/*.[ch]
-endif
-
-check-docs: all
-	$(PERL) $(top_builddir)/scripts/maint/checkOptionDocs.pl
-
-check-logs:
-	$(top_srcdir)/scripts/maint/checkLogs.pl \
-		$(top_srcdir)/src/*/*.[ch] | sort -n
-
-.PHONY: check-changes
-check-changes:
-if USEPYTHON
-	@if test -d "$(top_srcdir)/changes"; then \
-		$(PYTHON) $(top_srcdir)/scripts/maint/lintChanges.py $(top_srcdir)/changes; \
-		fi
-endif
-
-.PHONY: update-versions
-update-versions:
-	$(PERL) $(top_builddir)/scripts/maint/updateVersions.pl
-
-.PHONY: callgraph
-callgraph:
-	$(top_builddir)/scripts/maint/run_calltool.sh
-
-version:
-	@echo "Tor @VERSION@"
-	@if test -d "$(top_srcdir)/.git" && test -x "`which git 2>&1;true`"; then \
-	   echo -n "git: " ;\
-	   (cd "$(top_srcdir)" && git rev-parse --short=16 HEAD); \
-	fi
-
-mostlyclean-local:
-	rm -f $(top_builddir)/src/*/*.gc{da,no} $(top_builddir)/src/*/*/*.gc{da,no}
-	rm -rf $(HTML_COVER_DIR)
-	rm -rf $(top_builddir)/doc/doxygen
-	rm -rf $(TEST_NETWORK_ALL_LOG_DIR)
-
-clean-local:
-	rm -rf $(top_builddir)/src/rust/target
-	rm -rf $(top_builddir)/src/rust/.cargo/registry
-
-if USE_RUST
-distclean-local: distclean-rust
-endif
-
diff --git a/src/tor/Makefile.nmake b/src/tor/Makefile.nmake
deleted file mode 100644
index a121f13bb..000000000
--- a/src/tor/Makefile.nmake
+++ /dev/null
@@ -1,19 +0,0 @@
-all:
-	cd src/common
-	$(MAKE) /F Makefile.nmake
-	cd ../../src/ext
-	$(MAKE) /F Makefile.nmake
-	cd ../../src/or
-	$(MAKE) /F Makefile.nmake
-	cd ../../src/test
-	$(MAKE) /F Makefile.nmake
-
-clean:
-	cd src/common
-	$(MAKE) /F Makefile.nmake clean
-	cd ../../src/ext
-	$(MAKE) /F Makefile.nmake clean
-	cd ../../src/or
-	$(MAKE) /F Makefile.nmake clean
-	cd ../../src/test
-	$(MAKE) /F Makefile.nmake clean
diff --git a/src/tor/README b/src/tor/README
deleted file mode 100644
index 9e0f4b824..000000000
--- a/src/tor/README
+++ /dev/null
@@ -1,32 +0,0 @@
-Tor protects your privacy on the internet by hiding the connection
-between your Internet address and the services you use. We believe Tor
-is reasonably secure, but please ensure you read the instructions and
-configure it properly.
-
-To build Tor from source:
-        ./configure && make && make install
-
-To build Tor from a just-cloned git repository:
-        sh autogen.sh && ./configure && make && make install
-
-Home page:
-        https://www.torproject.org/
-
-Download new versions:
-        https://www.torproject.org/download/download.html
-
-Documentation, including links to installation and setup instructions:
-        https://www.torproject.org/docs/documentation.html
-
-Making applications work with Tor:
-        https://wiki.torproject.org/projects/tor/wiki/doc/TorifyHOWTO
-
-Frequently Asked Questions:
-        https://www.torproject.org/docs/faq.html
-
-
-To get started working on Tor development:
-        See the doc/HACKING directory.
-
-Release timeline:
-         https://trac.torproject.org/projects/tor/wiki/org/teams/NetworkTeam/CoreTorReleases
diff --git a/src/tor/ReleaseNotes b/src/tor/ReleaseNotes
deleted file mode 100644
index e11eebee9..000000000
--- a/src/tor/ReleaseNotes
+++ /dev/null
@@ -1,17035 +0,0 @@
-This document summarizes new features and bugfixes in each stable release
-of Tor. If you want to see more detailed descriptions of the changes in
-each development snapshot, see the ChangeLog file.
-
-Changes in version 0.3.1.9 - 2017-12-01:
-  Tor 0.3.1.9 backports important security and stability fixes from the
-  0.3.2 development series. All Tor users should upgrade to this
-  release, or to another of the releases coming out today.
-
-  o Major bugfixes (security, backport from 0.3.2.6-alpha):
-    - Fix a denial of service bug where an attacker could use a
-      malformed directory object to cause a Tor instance to pause while
-      OpenSSL would try to read a passphrase from the terminal. (Tor
-      instances run without a terminal, which is the case for most Tor
-      packages, are not impacted.) Fixes bug 24246; bugfix on every
-      version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821.
-      Found by OSS-Fuzz as testcase 6360145429790720.
-    - Fix a denial of service issue where an attacker could crash a
-      directory authority using a malformed router descriptor. Fixes bug
-      24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010
-      and CVE-2017-8820.
-    - When checking for replays in the INTRODUCE1 cell data for a
-      (legacy) onion service, correctly detect replays in the RSA-
-      encrypted part of the cell. We were previously checking for
-      replays on the entire cell, but those can be circumvented due to
-      the malleability of Tor's legacy hybrid encryption. This fix helps
-      prevent a traffic confirmation attack. Fixes bug 24244; bugfix on
-      0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009
-      and CVE-2017-8819.
-
-  o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha):
-    - Fix a use-after-free error that could crash v2 Tor onion services
-      when they failed to open circuits while expiring introduction
-      points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is
-      also tracked as TROVE-2017-013 and CVE-2017-8823.
-
-  o Major bugfixes (security, relay, backport from 0.3.2.6-alpha):
-    - When running as a relay, make sure that we never build a path
-      through ourselves, even in the case where we have somehow lost the
-      version of our descriptor appearing in the consensus. Fixes part
-      of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked
-      as TROVE-2017-012 and CVE-2017-8822.
-    - When running as a relay, make sure that we never choose ourselves
-      as a guard. Fixes part of bug 21534; bugfix on 0.3.0.1-alpha. This
-      issue is also tracked as TROVE-2017-012 and CVE-2017-8822.
-
-  o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha):
-    - Fix an issue causing DNS to fail on high-bandwidth exit nodes,
-      making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on
-      0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for
-      identifying and finding a workaround to this bug and to Moritz,
-      Arthur Edelstein, and Roger for helping to track it down and
-      analyze it.
-
-  o Minor features (bridge):
-    - Bridges now include notice in their descriptors that they are
-      bridges, and notice of their distribution status, based on their
-      publication settings. Implements ticket 18329. For more fine-
-      grained control of how a bridge is distributed, upgrade to 0.3.2.x
-      or later.
-
-  o Minor features (directory authority, backport from 0.3.2.6-alpha):
-    - Add an IPv6 address for the "bastet" directory authority. Closes
-      ticket 24394.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha):
-    - Avoid unnecessary calls to directory_fetches_from_authorities() on
-      relays, to prevent spurious address resolutions and descriptor
-      rebuilds. This is a mitigation for bug 21789. Fixes bug 23470;
-      bugfix on in 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation, backport from 0.3.2.1-alpha):
-    - Fix unused variable warnings in donna's Curve25519 SSE2 code.
-      Fixes bug 22895; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha):
-    - When a circuit is marked for close, do not attempt to package any
-      cells for channels on that circuit. Previously, we would detect
-      this condition lower in the call stack, when we noticed that the
-      circuit had no attached channel, and log an annoying message.
-      Fixes bug 8185; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (onion service, backport from 0.3.2.5-alpha):
-    - Rename the consensus parameter "hsdir-interval" to "hsdir_interval"
-      so it matches dir-spec.txt. Fixes bug 24262; bugfix
-      on 0.3.1.1-alpha.
-
-  o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha):
-    - Avoid a crash when transitioning from client mode to bridge mode.
-      Previously, we would launch the worker threads whenever our
-      "public server" mode changed, but not when our "server" mode
-      changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha.
-
-
-Changes in version 0.3.0.13 - 2017-12-01
-  Tor 0.3.0.13 backports important security and stability bugfixes from
-  later Tor releases. All Tor users should upgrade to this release, or
-  to another of the releases coming out today.
-
-  Note: the Tor 0.3.0 series will no longer be supported after 26 Jan
-  2018. If you need a release with long-term support, please stick with
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Major bugfixes (security, backport from 0.3.2.6-alpha):
-    - Fix a denial of service bug where an attacker could use a
-      malformed directory object to cause a Tor instance to pause while
-      OpenSSL would try to read a passphrase from the terminal. (Tor
-      instances run without a terminal, which is the case for most Tor
-      packages, are not impacted.) Fixes bug 24246; bugfix on every
-      version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821.
-      Found by OSS-Fuzz as testcase 6360145429790720.
-    - Fix a denial of service issue where an attacker could crash a
-      directory authority using a malformed router descriptor. Fixes bug
-      24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010
-      and CVE-2017-8820.
-    - When checking for replays in the INTRODUCE1 cell data for a
-      (legacy) onion service, correctly detect replays in the RSA-
-      encrypted part of the cell. We were previously checking for
-      replays on the entire cell, but those can be circumvented due to
-      the malleability of Tor's legacy hybrid encryption. This fix helps
-      prevent a traffic confirmation attack. Fixes bug 24244; bugfix on
-      0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009
-      and CVE-2017-8819.
-
-  o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha):
-    - Fix a use-after-free error that could crash v2 Tor onion services
-      when they failed to open circuits while expiring introduction
-      points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is
-      also tracked as TROVE-2017-013 and CVE-2017-8823.
-
-  o Major bugfixes (security, relay, backport from 0.3.2.6-alpha):
-    - When running as a relay, make sure that we never build a path
-      through ourselves, even in the case where we have somehow lost the
-      version of our descriptor appearing in the consensus. Fixes part
-      of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked
-      as TROVE-2017-012 and CVE-2017-8822.
-    - When running as a relay, make sure that we never choose ourselves
-      as a guard. Fixes part of bug 21534; bugfix on 0.3.0.1-alpha. This
-      issue is also tracked as TROVE-2017-012 and CVE-2017-8822.
-
-  o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha):
-    - Fix an issue causing DNS to fail on high-bandwidth exit nodes,
-      making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on
-      0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for
-      identifying and finding a workaround to this bug and to Moritz,
-      Arthur Edelstein, and Roger for helping to track it down and
-      analyze it.
-
-  o Minor features (security, windows, backport from 0.3.1.1-alpha):
-    - Enable a couple of pieces of Windows hardening: one
-      (HeapEnableTerminationOnCorruption) that has been on-by-default
-      since Windows 8, and unavailable before Windows 7; and one
-      (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't
-      affect us, but shouldn't do any harm. Closes ticket 21953.
-
-  o Minor features (bridge, backport from 0.3.1.9):
-    - Bridges now include notice in their descriptors that they are
-      bridges, and notice of their distribution status, based on their
-      publication settings. Implements ticket 18329. For more fine-
-      grained control of how a bridge is distributed, upgrade to 0.3.2.x
-      or later.
-
-  o Minor features (directory authority, backport from 0.3.2.6-alpha):
-    - Add an IPv6 address for the "bastet" directory authority. Closes
-      ticket 24394.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha):
-    - Avoid unnecessary calls to directory_fetches_from_authorities() on
-      relays, to prevent spurious address resolutions and descriptor
-      rebuilds. This is a mitigation for bug 21789. Fixes bug 23470;
-      bugfix on in 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation, backport from 0.3.2.1-alpha):
-    - Fix unused variable warnings in donna's Curve25519 SSE2 code.
-      Fixes bug 22895; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha):
-    - When a circuit is marked for close, do not attempt to package any
-      cells for channels on that circuit. Previously, we would detect
-      this condition lower in the call stack, when we noticed that the
-      circuit had no attached channel, and log an annoying message.
-      Fixes bug 8185; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha):
-    - Avoid a crash when transitioning from client mode to bridge mode.
-      Previously, we would launch the worker threads whenever our
-      "public server" mode changed, but not when our "server" mode
-      changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha.
-
-  o Minor bugfixes (testing, backport from 0.3.1.6-rc):
-    - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291;
-      bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij.
-
-
-Changes in version 0.2.9.14 - 2017-12-01
-  Tor 0.3.0.13 backports important security and stability bugfixes from
-  later Tor releases. All Tor users should upgrade to this release, or
-  to another of the releases coming out today.
-
-  o Major bugfixes (exit relays, DNS, backport from 0.3.2.4-alpha):
-    - Fix an issue causing DNS to fail on high-bandwidth exit nodes,
-      making them nearly unusable. Fixes bugs 21394 and 18580; bugfix on
-      0.1.2.2-alpha, which introduced eventdns. Thanks to Dhalgren for
-      identifying and finding a workaround to this bug and to Moritz,
-      Arthur Edelstein, and Roger for helping to track it down and
-      analyze it.
-
-  o Major bugfixes (security, backport from 0.3.2.6-alpha):
-    - Fix a denial of service bug where an attacker could use a
-      malformed directory object to cause a Tor instance to pause while
-      OpenSSL would try to read a passphrase from the terminal. (Tor
-      instances run without a terminal, which is the case for most Tor
-      packages, are not impacted.) Fixes bug 24246; bugfix on every
-      version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821.
-      Found by OSS-Fuzz as testcase 6360145429790720.
-    - Fix a denial of service issue where an attacker could crash a
-      directory authority using a malformed router descriptor. Fixes bug
-      24245; bugfix on 0.2.9.4-alpha. Also tracked as TROVE-2017-010
-      and CVE-2017-8820.
-    - When checking for replays in the INTRODUCE1 cell data for a
-      (legacy) onion service, correctly detect replays in the RSA-
-      encrypted part of the cell. We were previously checking for
-      replays on the entire cell, but those can be circumvented due to
-      the malleability of Tor's legacy hybrid encryption. This fix helps
-      prevent a traffic confirmation attack. Fixes bug 24244; bugfix on
-      0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009
-      and CVE-2017-8819.
-
-  o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha):
-    - Fix a use-after-free error that could crash v2 Tor onion services
-      when they failed to open circuits while expiring introduction
-      points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is
-      also tracked as TROVE-2017-013 and CVE-2017-8823.
-
-  o Major bugfixes (security, relay, backport from 0.3.2.6-alpha):
-    - When running as a relay, make sure that we never build a path
-      through ourselves, even in the case where we have somehow lost the
-      version of our descriptor appearing in the consensus. Fixes part
-      of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked
-      as TROVE-2017-012 and CVE-2017-8822.
-
-  o Minor features (bridge, backport from 0.3.1.9):
-    - Bridges now include notice in their descriptors that they are
-      bridges, and notice of their distribution status, based on their
-      publication settings. Implements ticket 18329. For more fine-
-      grained control of how a bridge is distributed, upgrade to 0.3.2.x
-      or later.
-
-  o Minor features (directory authority, backport from 0.3.2.6-alpha):
-    - Add an IPv6 address for the "bastet" directory authority. Closes
-      ticket 24394.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (security, windows, backport from 0.3.1.1-alpha):
-    - Enable a couple of pieces of Windows hardening: one
-      (HeapEnableTerminationOnCorruption) that has been on-by-default
-      since Windows 8, and unavailable before Windows 7; and one
-      (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't
-      affect us, but shouldn't do any harm. Closes ticket 21953.
-
-  o Minor bugfix (relay address resolution, backport from 0.3.2.1-alpha):
-    - Avoid unnecessary calls to directory_fetches_from_authorities() on
-      relays, to prevent spurious address resolutions and descriptor
-      rebuilds. This is a mitigation for bug 21789. Fixes bug 23470;
-      bugfix on in 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation, backport from 0.3.2.1-alpha):
-    - Fix unused variable warnings in donna's Curve25519 SSE2 code.
-      Fixes bug 22895; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (logging, relay shutdown, annoyance, backport from 0.3.2.2-alpha):
-    - When a circuit is marked for close, do not attempt to package any
-      cells for channels on that circuit. Previously, we would detect
-      this condition lower in the call stack, when we noticed that the
-      circuit had no attached channel, and log an annoying message.
-      Fixes bug 8185; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (relay, crash, backport from 0.3.2.4-alpha):
-    - Avoid a crash when transitioning from client mode to bridge mode.
-      Previously, we would launch the worker threads whenever our
-      "public server" mode changed, but not when our "server" mode
-      changed. Fixes bug 23693; bugfix on 0.2.6.3-alpha.
-
-  o Minor bugfixes (testing, backport from 0.3.1.6-rc):
-    - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291;
-      bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij.
-
-
-Changes in version 0.2.8.17 - 2017-12-01
-  Tor 0.2.8.17 backports important security and stability bugfixes from
-  later Tor releases. All Tor users should upgrade to this release, or
-  to another of the releases coming out today.
-
-  Note: the Tor 0.2.8 series will no longer be supported after 1 Jan
-  2018. If you need a release with long-term support, please upgrade with
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Major bugfixes (security, backport from 0.3.2.6-alpha):
-    - Fix a denial of service bug where an attacker could use a
-      malformed directory object to cause a Tor instance to pause while
-      OpenSSL would try to read a passphrase from the terminal. (Tor
-      instances run without a terminal, which is the case for most Tor
-      packages, are not impacted.) Fixes bug 24246; bugfix on every
-      version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821.
-      Found by OSS-Fuzz as testcase 6360145429790720.
-    - When checking for replays in the INTRODUCE1 cell data for a
-      (legacy) onion service, correctly detect replays in the RSA-
-      encrypted part of the cell. We were previously checking for
-      replays on the entire cell, but those can be circumvented due to
-      the malleability of Tor's legacy hybrid encryption. This fix helps
-      prevent a traffic confirmation attack. Fixes bug 24244; bugfix on
-      0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009
-      and CVE-2017-8819.
-
-  o Major bugfixes (security, onion service v2, backport from 0.3.2.6-alpha):
-    - Fix a use-after-free error that could crash v2 Tor onion services
-      when they failed to open circuits while expiring introduction
-      points. Fixes bug 24313; bugfix on 0.2.7.2-alpha. This issue is
-      also tracked as TROVE-2017-013 and CVE-2017-8823.
-
-  o Major bugfixes (security, relay, backport from 0.3.2.6-alpha):
-    - When running as a relay, make sure that we never build a path through
-      ourselves, even in the case where we have somehow lost the version of
-      our descriptor appearing in the consensus. Fixes part of bug 21534;
-      bugfix on 0.2.0.1-alpha. This issue is also tracked as TROVE-2017-012
-      and CVE-2017-8822.
-
-  o Minor features (bridge, backport from 0.3.1.9):
-    - Bridges now include notice in their descriptors that they are
-      bridges, and notice of their distribution status, based on their
-      publication settings. Implements ticket 18329. For more fine-
-      grained control of how a bridge is distributed, upgrade to 0.3.2.x
-      or later.
-
-  o Minor features (directory authority, backport from 0.3.2.6-alpha):
-    - Add an IPv6 address for the "bastet" directory authority. Closes
-      ticket 24394.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (testing, backport from 0.3.1.6-rc):
-    - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291;
-      bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij.
-
-
-Changes in version 0.2.5.16 - 2017-12-01
-  Tor 0.2.5.13 backports important security and stability bugfixes from
-  later Tor releases. All Tor users should upgrade to this release, or
-  to another of the releases coming out today.
-
-  Note: the Tor 0.2.5 series will no longer be supported after 1 May
-  2018. If you need a release with long-term support, please upgrade to
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Major bugfixes (security, backport from 0.3.2.6-alpha):
-    - Fix a denial of service bug where an attacker could use a
-      malformed directory object to cause a Tor instance to pause while
-      OpenSSL would try to read a passphrase from the terminal. (Tor
-      instances run without a terminal, which is the case for most Tor
-      packages, are not impacted.) Fixes bug 24246; bugfix on every
-      version of Tor. Also tracked as TROVE-2017-011 and CVE-2017-8821.
-      Found by OSS-Fuzz as testcase 6360145429790720.
-    - When checking for replays in the INTRODUCE1 cell data for a
-      (legacy) onion service, correctly detect replays in the RSA-
-      encrypted part of the cell. We were previously checking for
-      replays on the entire cell, but those can be circumvented due to
-      the malleability of Tor's legacy hybrid encryption. This fix helps
-      prevent a traffic confirmation attack. Fixes bug 24244; bugfix on
-      0.2.4.1-alpha. This issue is also tracked as TROVE-2017-009
-      and CVE-2017-8819.
-
-  o Major bugfixes (security, relay, backport from 0.3.2.6-alpha):
-    - When running as a relay, make sure that we never build a path
-      through ourselves, even in the case where we have somehow lost the
-      version of our descriptor appearing in the consensus. Fixes part
-      of bug 21534; bugfix on 0.2.0.1-alpha. This issue is also tracked
-      as TROVE-2017-012 and CVE-2017-8822.
-
-  o Minor features (bridge, backport from 0.3.1.9):
-    - Bridges now include notice in their descriptors that they are
-      bridges, and notice of their distribution status, based on their
-      publication settings. Implements ticket 18329. For more fine-
-      grained control of how a bridge is distributed, upgrade to 0.3.2.x
-      or later.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 6 2017 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.5.15 - 2017-10-25
-  Tor 0.2.5.15 backports a collection of bugfixes from later Tor release
-  series. It also adds a new directory authority, Bastet.
-
-  Note: the Tor 0.2.5 series will no longer be supported after 1 May
-  2018. If you need a release with long-term support, please upgrade to
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Directory authority changes:
-    - Add "Bastet" as a ninth directory authority to the default list.
-      Closes ticket 23910.
-    - The directory authority "Longclaw" has changed its IP address.
-      Closes ticket 23592.
-
-  o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
-    - Avoid an assertion failure bug affecting our implementation of
-      inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
-      handling of "0xx" differs from what we had expected. Fixes bug
-      22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha):
-    - Fix a memset() off the end of an array when packing cells. This
-      bug should be harmless in practice, since the corrupted bytes are
-      still in the same structure, and are always padding bytes,
-      ignored, or immediately overwritten, depending on compiler
-      behavior. Nevertheless, because the memset()'s purpose is to make
-      sure that any other cell-handling bugs can't expose bytes to the
-      network, we need to fix it. Fixes bug 22737; bugfix on
-      0.2.4.11-alpha. Fixes CID 1401591.
-
-  o Build features (backport from 0.3.1.5-alpha):
-    - Tor's repository now includes a Travis Continuous Integration (CI)
-      configuration file (.travis.yml). This is meant to help new
-      developers and contributors who fork Tor to a Github repository be
-      better able to test their changes, and understand what we expect
-      to pass. To use this new build feature, you must fork Tor to your
-      Github account, then go into the "Integrations" menu in the
-      repository settings for your fork and enable Travis, then push
-      your changes. Closes ticket 22636.
-
-
-Changes in version 0.2.8.16 - 2017-10-25
-  Tor 0.2.8.16 backports a collection of bugfixes from later Tor release
-  series, including a bugfix for a crash issue that had affected relays
-  under memory pressure. It also adds a new directory authority, Bastet.
-
-  Note: the Tor 0.2.8 series will no longer be supported after 1 Jan
-  2018. If you need a release with long-term support, please stick with
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Directory authority changes:
-    - Add "Bastet" as a ninth directory authority to the default list.
-      Closes ticket 23910.
-    - The directory authority "Longclaw" has changed its IP address.
-      Closes ticket 23592.
-
-  o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha):
-    - Fix a timing-based assertion failure that could occur when the
-      circuit out-of-memory handler freed a connection's output buffer.
-      Fixes bug 23690; bugfix on 0.2.6.1-alpha.
-
-  o Minor features (directory authorities, backport from 0.3.2.2-alpha):
-    - Remove longclaw's IPv6 address, as it will soon change. Authority
-      IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves
-      3/8 directory authorities with IPv6 addresses, but there are also
-      52 fallback directory mirrors with IPv6 addresses. Resolves 19760.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.9.13 - 2017-10-25
-  Tor 0.2.9.13 backports a collection of bugfixes from later Tor release
-  series, including a bugfix for a crash issue that had affected relays
-  under memory pressure. It also adds a new directory authority, Bastet.
-
-  o Directory authority changes:
-    - Add "Bastet" as a ninth directory authority to the default list.
-      Closes ticket 23910.
-    - The directory authority "Longclaw" has changed its IP address.
-      Closes ticket 23592.
-
-  o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha):
-    - Fix a timing-based assertion failure that could occur when the
-      circuit out-of-memory handler freed a connection's output buffer.
-      Fixes bug 23690; bugfix on 0.2.6.1-alpha.
-
-  o Minor features (directory authorities, backport from 0.3.2.2-alpha):
-    - Remove longclaw's IPv6 address, as it will soon change. Authority
-      IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves
-      3/8 directory authorities with IPv6 addresses, but there are also
-      52 fallback directory mirrors with IPv6 addresses. Resolves 19760.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (directory authority, backport from 0.3.1.5-alpha):
-    - When a directory authority rejects a descriptor or extrainfo with
-      a given digest, mark that digest as undownloadable, so that we do
-      not attempt to download it again over and over. We previously
-      tried to avoid downloading such descriptors by other means, but we
-      didn't notice if we accidentally downloaded one anyway. This
-      behavior became problematic in 0.2.7.2-alpha, when authorities
-      began pinning Ed25519 keys. Fixes bug 22349; bugfix
-      on 0.2.1.19-alpha.
-
-  o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha):
-    - Clear the address when node_get_prim_orport() returns early.
-      Fixes bug 23874; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (Windows service, backport from 0.3.1.6-rc):
-    - When running as a Windows service, set the ID of the main thread
-      correctly. Failure to do so made us fail to send log messages to
-      the controller in 0.2.1.16-rc, slowed down controller event
-      delivery in 0.2.7.3-rc and later, and crash with an assertion
-      failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha.
-      Patch and diagnosis from "Vort".
-
-
-Changes in version 0.3.0.12 - 2017-10-25
-  Tor 0.3.0.12 backports a collection of bugfixes from later Tor release
-  series, including a bugfix for a crash issue that had affected relays
-  under memory pressure. It also adds a new directory authority, Bastet.
-
-  Note: the Tor 0.3.0 series will no longer be supported after 26 Jan
-  2018. If you need a release with long-term support, please stick with
-  the 0.2.9 series. Otherwise, please upgrade to 0.3.1 or later.
-
-  o Directory authority changes:
-    - Add "Bastet" as a ninth directory authority to the default list.
-      Closes ticket 23910.
-    - The directory authority "Longclaw" has changed its IP address.
-      Closes ticket 23592.
-
-  o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha):
-    - Fix a timing-based assertion failure that could occur when the
-      circuit out-of-memory handler freed a connection's output buffer.
-      Fixes bug 23690; bugfix on 0.2.6.1-alpha.
-
-  o Minor features (directory authorities, backport from 0.3.2.2-alpha):
-    - Remove longclaw's IPv6 address, as it will soon change. Authority
-      IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves
-      3/8 directory authorities with IPv6 addresses, but there are also
-      52 fallback directory mirrors with IPv6 addresses. Resolves 19760.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (directory authority, backport from 0.3.1.5-alpha):
-    - When a directory authority rejects a descriptor or extrainfo with
-      a given digest, mark that digest as undownloadable, so that we do
-      not attempt to download it again over and over. We previously
-      tried to avoid downloading such descriptors by other means, but we
-      didn't notice if we accidentally downloaded one anyway. This
-      behavior became problematic in 0.2.7.2-alpha, when authorities
-      began pinning Ed25519 keys. Fixes bug 22349; bugfix
-      on 0.2.1.19-alpha.
-
-  o Minor bugfixes (hidden service, relay, backport from 0.3.2.2-alpha):
-    - Avoid a possible double close of a circuit by the intro point on
-      error of sending the INTRO_ESTABLISHED cell. Fixes bug 23610;
-      bugfix on 0.3.0.1-alpha.
-
-  o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha):
-    - Clear the address when node_get_prim_orport() returns early.
-      Fixes bug 23874; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (Windows service, backport from 0.3.1.6-rc):
-    - When running as a Windows service, set the ID of the main thread
-      correctly. Failure to do so made us fail to send log messages to
-      the controller in 0.2.1.16-rc, slowed down controller event
-      delivery in 0.2.7.3-rc and later, and crash with an assertion
-      failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha.
-      Patch and diagnosis from "Vort".
-
-
-Changes in version 0.3.1.8 - 2017-10-25
-  Tor 0.3.1.8 is the second stable release in the 0.3.1 series.
-  It includes several bugfixes, including a bugfix for a crash issue
-  that had affected relays under memory pressure. It also adds
-  a new directory authority, Bastet.
-
-  o Directory authority changes:
-    - Add "Bastet" as a ninth directory authority to the default list.
-      Closes ticket 23910.
-    - The directory authority "Longclaw" has changed its IP address.
-      Closes ticket 23592.
-
-  o Major bugfixes (relay, crash, assertion failure, backport from 0.3.2.2-alpha):
-    - Fix a timing-based assertion failure that could occur when the
-      circuit out-of-memory handler freed a connection's output buffer.
-      Fixes bug 23690; bugfix on 0.2.6.1-alpha.
-
-  o Minor features (directory authorities, backport from 0.3.2.2-alpha):
-    - Remove longclaw's IPv6 address, as it will soon change. Authority
-      IPv6 addresses were originally added in 0.2.8.1-alpha. This leaves
-      3/8 directory authorities with IPv6 addresses, but there are also
-      52 fallback directory mirrors with IPv6 addresses. Resolves 19760.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, backport from 0.3.2.2-alpha):
-    - Fix a compilation warning when building with zstd support on
-      32-bit platforms. Fixes bug 23568; bugfix on 0.3.1.1-alpha. Found
-      and fixed by Andreas Stieger.
-
-  o Minor bugfixes (compression, backport from 0.3.2.2-alpha):
-    - Handle a pathological case when decompressing Zstandard data when
-      the output buffer size is zero. Fixes bug 23551; bugfix
-      on 0.3.1.1-alpha.
-
-  o Minor bugfixes (directory authority, backport from 0.3.2.1-alpha):
-    - Remove the length limit on HTTP status lines that authorities can
-      send in their replies. Fixes bug 23499; bugfix on 0.3.1.6-rc.
-
-  o Minor bugfixes (hidden service, relay, backport from 0.3.2.2-alpha):
-    - Avoid a possible double close of a circuit by the intro point on
-      error of sending the INTRO_ESTABLISHED cell. Fixes bug 23610;
-      bugfix on 0.3.0.1-alpha.
-
-  o Minor bugfixes (memory safety, backport from 0.3.2.3-alpha):
-    - Clear the address when node_get_prim_orport() returns early.
-      Fixes bug 23874; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (unit tests, backport from 0.3.2.2-alpha):
-    - Fix additional channelpadding unit test failures by using mocked
-      time instead of actual time for all tests. Fixes bug 23608; bugfix
-      on 0.3.1.1-alpha.
-
-
-Changes in version 0.2.8.15 - 2017-09-18
-  Tor 0.2.8.15 backports a collection of bugfixes from later
-  Tor series.
-
-  Most significantly, it includes a fix for TROVE-2017-008, a
-  security bug that affects hidden services running with the
-  SafeLogging option disabled. For more information, see
-  https://trac.torproject.org/projects/tor/ticket/23490
-
-  Note that Tor 0.2.8.x will no longer be supported after 1 Jan
-  2018.  We suggest that you upgrade to the latest stable release if
-  possible.  If you can't, we recommend that you upgrade at least to
-  0.2.9, which will be supported until 2020.
-
-  o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
-    - Avoid an assertion failure bug affecting our implementation of
-      inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
-      handling of "0xx" differs from what we had expected. Fixes bug
-      22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
-
-  o Minor features:
-    - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha):
-    - Backport a fix for an "unused variable" warning that appeared
-      in some versions of mingw. Fixes bug 22838; bugfix on
-      0.2.8.1-alpha.
-
-  o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha):
-    - Fix a memset() off the end of an array when packing cells. This
-      bug should be harmless in practice, since the corrupted bytes are
-      still in the same structure, and are always padding bytes,
-      ignored, or immediately overwritten, depending on compiler
-      behavior. Nevertheless, because the memset()'s purpose is to make
-      sure that any other cell-handling bugs can't expose bytes to the
-      network, we need to fix it. Fixes bug 22737; bugfix on
-      0.2.4.11-alpha. Fixes CID 1401591.
-
-  o Build features (backport from 0.3.1.5-alpha):
-    - Tor's repository now includes a Travis Continuous Integration (CI)
-      configuration file (.travis.yml). This is meant to help new
-      developers and contributors who fork Tor to a Github repository be
-      better able to test their changes, and understand what we expect
-      to pass. To use this new build feature, you must fork Tor to your
-      Github account, then go into the "Integrations" menu in the
-      repository settings for your fork and enable Travis, then push
-      your changes. Closes ticket 22636.
-
-
-Changes in version 0.2.9.12 - 2017-09-18
-  Tor 0.2.9.12 backports a collection of bugfixes from later
-  Tor series.
-
-  Most significantly, it includes a fix for TROVE-2017-008, a
-  security bug that affects hidden services running with the
-  SafeLogging option disabled. For more information, see
-  https://trac.torproject.org/projects/tor/ticket/23490
-
-  o Major features (security, backport from 0.3.0.2-alpha):
-    - Change the algorithm used to decide DNS TTLs on client and server
-      side, to better resist DNS-based correlation attacks like the
-      DefecTor attack of Greschbach, Pulls, Roberts, Winter, and
-      Feamster. Now relays only return one of two possible DNS TTL
-      values, and clients are willing to believe DNS TTL values up to 3
-      hours long. Closes ticket 19769.
-
-  o Major bugfixes (crash, directory connections, backport from 0.3.0.5-rc):
-    - Fix a rare crash when sending a begin cell on a circuit whose
-      linked directory connection had already been closed. Fixes bug
-      21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett.
-
-  o Major bugfixes (DNS, backport from 0.3.0.2-alpha):
-    - Fix a bug that prevented exit nodes from caching DNS records for
-      more than 60 seconds. Fixes bug 19025; bugfix on 0.2.4.7-alpha.
-
-  o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha):
-    - Fix a typo that had prevented TPROXY-based transparent proxying
-      from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha.
-      Patch from "d4fq0fQAgoJ".
-
-  o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
-    - Avoid an assertion failure bug affecting our implementation of
-      inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
-      handling of "0xx" differs from what we had expected. Fixes bug
-      22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
-
-  o Minor features (code style, backport from 0.3.1.3-alpha):
-    - Add "Falls through" comments to our codebase, in order to silence
-      GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas
-      Stieger. Closes ticket 22446.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (bandwidth accounting, backport from 0.3.1.1-alpha):
-    - Roll over monthly accounting at the configured hour and minute,
-      rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1.
-      Found by Andrey Karpov with PVS-Studio.
-
-  o Minor bugfixes (compilation, backport from 0.3.1.5-alpha):
-    - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915;
-      bugfix on 0.2.8.1-alpha.
-    - Fix warnings when building with libscrypt and openssl scrypt support
-      on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
-    - When building with certain versions the mingw C header files, avoid
-      float-conversion warnings when calling the C functions isfinite(),
-      isnan(), and signbit(). Fixes bug 22801; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation, backport from 0.3.1.7):
-    - Avoid compiler warnings in the unit tests for running tor_sscanf()
-      with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha):
-    - Backport a fix for an "unused variable" warning that appeared
-      in some versions of mingw. Fixes bug 22838; bugfix on
-      0.2.8.1-alpha.
-
-  o Minor bugfixes (controller, backport from 0.3.1.7):
-    - Do not crash when receiving a HSPOST command with an empty body.
-      Fixes part of bug 22644; bugfix on 0.2.7.1-alpha.
-    - Do not crash when receiving a POSTDESCRIPTOR command with an
-      empty body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha):
-    - Avoid Coverity build warnings related to our BUG() macro. By
-      default, Coverity treats BUG() as the Linux kernel does: an
-      instant abort(). We need to override that so our BUG() macro
-      doesn't prevent Coverity from analyzing functions that use it.
-      Fixes bug 23030; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (defensive programming, undefined behavior, backport from 0.3.1.4-alpha):
-    - Fix a memset() off the end of an array when packing cells. This
-      bug should be harmless in practice, since the corrupted bytes are
-      still in the same structure, and are always padding bytes,
-      ignored, or immediately overwritten, depending on compiler
-      behavior. Nevertheless, because the memset()'s purpose is to make
-      sure that any other cell-handling bugs can't expose bytes to the
-      network, we need to fix it. Fixes bug 22737; bugfix on
-      0.2.4.11-alpha. Fixes CID 1401591.
-
-  o Minor bugfixes (file limits, osx, backport from 0.3.1.5-alpha):
-    - When setting the maximum number of connections allowed by the OS,
-      always allow some extra file descriptors for other files. Fixes
-      bug 22797; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha):
-    - Avoid a sandbox failure when trying to re-bind to a socket and
-      mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha):
-    - Permit the fchmod system call, to avoid crashing on startup when
-      starting with the seccomp2 sandbox and an unexpected set of
-      permissions on the data directory or its contents. Fixes bug
-      22516; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (relay, backport from 0.3.0.5-rc):
-    - Avoid a double-marked-circuit warning that could happen when we
-      receive DESTROY cells under heavy load. Fixes bug 20059; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha):
-    - Reject version numbers with non-numeric prefixes (such as +, -, or
-      whitespace). Disallowing whitespace prevents differential version
-      parsing between POSIX-based and Windows platforms. Fixes bug 21507
-      and part of 21508; bugfix on 0.0.8pre1.
-
-  o Build features (backport from 0.3.1.5-alpha):
-    - Tor's repository now includes a Travis Continuous Integration (CI)
-      configuration file (.travis.yml). This is meant to help new
-      developers and contributors who fork Tor to a Github repository be
-      better able to test their changes, and understand what we expect
-      to pass. To use this new build feature, you must fork Tor to your
-      Github account, then go into the "Integrations" menu in the
-      repository settings for your fork and enable Travis, then push
-      your changes. Closes ticket 22636.
-
-
-Changes in version 0.3.0.11 - 2017-09-18
-  Tor 0.3.0.11 backports a collection of bugfixes from Tor the 0.3.1
-  series.
-
-  Most significantly, it includes a fix for TROVE-2017-008, a
-  security bug that affects hidden services running with the
-  SafeLogging option disabled. For more information, see
-  https://trac.torproject.org/projects/tor/ticket/23490
-
-  o Minor features (code style, backport from 0.3.1.7):
-    - Add "Falls through" comments to our codebase, in order to silence
-      GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas
-      Stieger. Closes ticket 22446.
-
-  o Minor features:
-    - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, backport from 0.3.1.7):
-    - Avoid compiler warnings in the unit tests for calling tor_sscanf()
-      with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (controller, backport from 0.3.1.7):
-    - Do not crash when receiving a HSPOST command with an empty body.
-      Fixes part of bug 22644; bugfix on 0.2.7.1-alpha.
-    - Do not crash when receiving a POSTDESCRIPTOR command with an empty
-      body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (file limits, osx, backport from 0.3.1.5-alpha):
-    - When setting the maximum number of connections allowed by the OS,
-      always allow some extra file descriptors for other files. Fixes
-      bug 22797; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (logging, relay, backport from 0.3.1.6-rc):
-    - Remove a forgotten debugging message when an introduction point
-      successfully establishes a hidden service prop224 circuit with
-      a client.
-    - Change three other log_warn() for an introduction point to
-      protocol warnings, because they can be failure from the network
-      and are not relevant to the operator. Fixes bug 23078; bugfix on
-      0.3.0.1-alpha and 0.3.0.2-alpha.
-
-
-Changes in version 0.3.1.7 - 2017-09-18
-  Tor 0.3.1.7 is the first stable release in the 0.3.1 series.
-
-  With the 0.3.1 series, Tor now serves and downloads directory
-  information in more compact formats, to save on bandwidth overhead. It
-  also contains a new padding system to resist netflow-based traffic
-  analysis, and experimental support for building parts of Tor in Rust
-  (though no parts of Tor are in Rust yet). There are also numerous
-  small features, bugfixes on earlier release series, and groundwork for
-  the hidden services revamp of 0.3.2.
-
-  This release also includes a fix for TROVE-2017-008, a security bug
-  that affects hidden services running with the SafeLogging option
-  disabled. For more information, see
-  https://trac.torproject.org/projects/tor/ticket/23490
-
-  Per our stable release policy, we plan to support each stable release
-  series for at least the next nine months, or for three months after
-  the first stable release of the next series: whichever is longer. If
-  you need a release with long-term support, we recommend that you stay
-  with the 0.2.9 series.
-
-  Below is a list of the changes since 0.3.0. For a list of all
-  changes since 0.3.1.6-rc, see the ChangeLog file.
-
-  o New dependencies:
-    - To build with zstd and lzma support, Tor now requires the
-      pkg-config tool at build time.
-
-  o Major bugfixes (security, hidden services, loggging):
-    - Fix a bug where we could log uninitialized stack when a certain
-      hidden service error occurred while SafeLogging was disabled.
-      Fixes bug #23490; bugfix on 0.2.7.2-alpha.
-      This is also tracked as TROVE-2017-008 and CVE-2017-0380.
-
-  o Major features (build system, continuous integration):
-    - Tor's repository now includes a Travis Continuous Integration (CI)
-      configuration file (.travis.yml). This is meant to help new
-      developers and contributors who fork Tor to a Github repository be
-      better able to test their changes, and understand what we expect
-      to pass. To use this new build feature, you must fork Tor to your
-      Github account, then go into the "Integrations" menu in the
-      repository settings for your fork and enable Travis, then push
-      your changes. Closes ticket 22636.
-
-  o Major features (directory protocol):
-    - Tor relays and authorities can now serve clients an abbreviated
-      version of the consensus document, containing only the changes
-      since an older consensus document that the client holds. Clients
-      now request these documents when available. When both client and
-      server use this new protocol, they will use far less bandwidth (up
-      to 94% less) to keep the client's consensus up-to-date. Implements
-      proposal 140; closes ticket 13339. Based on work by Daniel Martí.
-    - Tor can now compress directory traffic with lzma or with zstd
-      compression algorithms, which can deliver better bandwidth
-      performance. Because lzma is computationally expensive, it's only
-      used for documents that can be compressed once and served many
-      times. Support for these algorithms requires that tor is built
-      with the libzstd and/or liblzma libraries available. Implements
-      proposal 278; closes ticket 21662.
-    - Relays now perform the more expensive compression operations, and
-      consensus diff generation, in worker threads. This separation
-      avoids delaying the main thread when a new consensus arrives.
-
-  o Major features (experimental):
-    - Tor can now build modules written in Rust. To turn this on, pass
-      the "--enable-rust" flag to the configure script. It's not time to
-      get excited yet: currently, there is no actual Rust functionality
-      beyond some simple glue code, and a notice at startup to tell you
-      that Rust is running. Still, we hope that programmers and
-      packagers will try building Tor with Rust support, so that we can
-      find issues and solve portability problems. Closes ticket 22106.
-
-  o Major features (traffic analysis resistance):
-    - Connections between clients and relays now send a padding cell in
-      each direction every 1.5 to 9.5 seconds (tunable via consensus
-      parameters). This padding will not resist specialized
-      eavesdroppers, but it should be enough to make many ISPs' routine
-      network flow logging less useful in traffic analysis against
-      Tor users.
-
-      Padding is negotiated using Tor's link protocol, so both relays
-      and clients must upgrade for this to take effect. Clients may
-      still send padding despite the relay's version by setting
-      ConnectionPadding 1 in torrc, and may disable padding by setting
-      ConnectionPadding 0 in torrc. Padding may be minimized for mobile
-      users with the torrc option ReducedConnectionPadding. Implements
-      Proposal 251 and Section 2 of Proposal 254; closes ticket 16861.
-    - Relays will publish 24 hour totals of padding and non-padding cell
-      counts to their extra-info descriptors, unless PaddingStatistics 0
-      is set in torrc. These 24 hour totals are also rounded to
-      multiples of 10000.
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure when a hidden service
-      handles a malformed BEGIN cell. Fixes bug 22493, tracked as
-      TROVE-2017-004 and as CVE-2017-0375; bugfix on 0.3.0.1-alpha.
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Major bugfixes (path selection, security):
-    - When choosing which guard to use for a circuit, avoid the exit's
-      family along with the exit itself. Previously, the new guard
-      selection logic avoided the exit, but did not consider its family.
-      Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017-
-      006 and CVE-2017-0377.
-
-  o Major bugfixes (connection usage):
-    - We use NETINFO cells to try to determine if both relays involved
-      in a connection will agree on the canonical status of that
-      connection. We prefer the connections where this is the case for
-      extend cells, and try to close connections where relays disagree
-      on their canonical status early. Also, we now prefer the oldest
-      valid connection for extend cells. These two changes should reduce
-      the number of long-term connections that are kept open between
-      relays. Fixes bug 17604; bugfix on 0.2.5.5-alpha.
-    - Relays now log hourly statistics (look for
-      "channel_check_for_duplicates" lines) on the total number of
-      connections to other relays. If the number of connections per
-      relay is unexpectedly large, this log message is at notice level.
-      Otherwise it is at info.
-
-  o Major bugfixes (entry guards):
-    - When starting with an old consensus, do not add new entry guards
-      unless the consensus is "reasonably live" (under 1 day old). Fixes
-      one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
-    - Don't block bootstrapping when a primary bridge is offline and we
-      can't get its descriptor. Fixes bug 22325; fixes one case of bug
-      21969; bugfix on 0.3.0.3-alpha.
-
-  o Major bugfixes (linux TPROXY support):
-    - Fix a typo that had prevented TPROXY-based transparent proxying
-      from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha.
-      Patch from "d4fq0fQAgoJ".
-
-  o Major bugfixes (openbsd, denial-of-service):
-    - Avoid an assertion failure bug affecting our implementation of
-      inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
-      handling of "0xx" differs from what we had expected. Fixes bug
-      22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
-
-  o Major bugfixes (relay, link handshake):
-    - When performing the v3 link handshake on a TLS connection, report
-      that we have the x509 certificate that we actually used on that
-      connection, even if we have changed certificates since that
-      connection was first opened. Previously, we would claim to have
-      used our most recent x509 link certificate, which would sometimes
-      make the link handshake fail. Fixes one case of bug 22460; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (relays, key management):
-    - Regenerate link and authentication certificates whenever the key
-      that signs them changes; also, regenerate link certificates
-      whenever the signed key changes. Previously, these processes were
-      only weakly coupled, and we relays could (for minutes to hours)
-      wind up with an inconsistent set of keys and certificates, which
-      other relays would not accept. Fixes two cases of bug 22460;
-      bugfix on 0.3.0.1-alpha.
-    - When sending an Ed25519 signing->link certificate in a CERTS cell,
-      send the certificate that matches the x509 certificate that we
-      used on the TLS connection. Previously, there was a race condition
-      if the TLS context rotated after we began the TLS handshake but
-      before we sent the CERTS cell. Fixes a case of bug 22460; bugfix
-      on 0.3.0.1-alpha.
-
-  o Minor features (security, windows):
-    - Enable a couple of pieces of Windows hardening: one
-      (HeapEnableTerminationOnCorruption) that has been on-by-default
-      since Windows 8, and unavailable before Windows 7; and one
-      (PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION) which we believe doesn't
-      affect us, but shouldn't do any harm. Closes ticket 21953.
-
-  o Minor features (bridge authority):
-    - Add "fingerprint" lines to the networkstatus-bridges file produced
-      by bridge authorities. Closes ticket 22207.
-
-  o Minor features (code style):
-    - Add "Falls through" comments to our codebase, in order to silence
-      GCC 7's -Wimplicit-fallthrough warnings. Patch from Andreas
-      Stieger. Closes ticket 22446.
-
-  o Minor features (config options):
-    - Allow "%include" directives in torrc configuration files. These
-      directives import the settings from other files, or from all the
-      files in a directory. Closes ticket 1922. Code by Daniel Pinto.
-    - Make SAVECONF return an error when overwriting a torrc that has
-      includes. Using SAVECONF with the FORCE option will allow it to
-      overwrite torrc even if includes are used. Related to ticket 1922.
-    - Add "GETINFO config-can-saveconf" to tell controllers if SAVECONF
-      will work without the FORCE option. Related to ticket 1922.
-
-  o Minor features (controller):
-    - Warn the first time that a controller requests data in the long-
-      deprecated 'GETINFO network-status' format. Closes ticket 21703.
-
-  o Minor features (defaults):
-    - The default value for UseCreateFast is now 0: clients which
-      haven't yet received a consensus document will now use a proper
-      ntor handshake to talk to their directory servers whenever they
-      can. Closes ticket 21407.
-    - Onion key rotation and expiry intervals are now defined as a
-      network consensus parameter, per proposal 274. The default
-      lifetime of an onion key is increased from 7 to 28 days. Old onion
-      keys will expire after 7 days by default. This change will make
-      consensus diffs much smaller, and save significant bandwidth.
-      Closes ticket 21641.
-
-  o Minor features (defensive programming):
-    - Create a pair of consensus parameters, nf_pad_tor2web and
-      nf_pad_single_onion, to disable netflow padding in the consensus
-      for non-anonymous connections in case the overhead is high. Closes
-      ticket 17857.
-
-  o Minor features (diagnostic):
-    - Add a stack trace to the bug warnings that can be logged when
-      trying to send an outgoing relay cell with n_chan == 0. Diagnostic
-      attempt for bug 23105.
-    - Add logging messages to try to diagnose a rare bug that seems to
-      generate RSA->Ed25519 cross-certificates dated in the 1970s. We
-      think this is happening because of incorrect system clocks, but
-      we'd like to know for certain. Diagnostic for bug 22466.
-    - Avoid an assertion failure, and log a better error message, when
-      unable to remove a file from the consensus cache on Windows.
-      Attempts to mitigate and diagnose bug 22752.
-
-  o Minor features (directory authority):
-    - Improve the message that authorities report to relays that present
-      RSA/Ed25519 keypairs that conflict with previously pinned keys.
-      Closes ticket 22348.
-
-  o Minor features (directory cache, consensus diff):
-    - Add a new MaxConsensusAgeForDiffs option to allow directory cache
-      operators with low-resource environments to adjust the number of
-      consensuses they'll store and generate diffs from. Most cache
-      operators should leave it unchanged. Helps to work around
-      bug 22883.
-
-  o Minor features (fallback directory list):
-    - Update the fallback directory mirror whitelist and blacklist based
-      on operator emails. Closes task 21121.
-    - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in
-      December 2016 (of which ~126 were still functional) with a list of
-      151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May
-      2017. Resolves ticket 21564.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the September 6 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden services, logging):
-    - Log a message when a hidden service descriptor has fewer
-      introduction points than specified in
-      HiddenServiceNumIntroductionPoints. Closes tickets 21598.
-    - Log a message when a hidden service reaches its introduction point
-      circuit limit, and when that limit is reset. Follow up to ticket
-      21594; closes ticket 21622.
-    - Warn user if multiple entries in EntryNodes and at least one
-      HiddenService are used together. Pinning EntryNodes along with a
-      hidden service can be possibly harmful; for instance see ticket
-      14917 or 21155. Closes ticket 21155.
-
-  o Minor features (linux seccomp2 sandbox):
-    - We now have a document storage backend compatible with the Linux
-      seccomp2 sandbox. This backend is used for consensus documents and
-      diffs between them; in the long term, we'd like to use it for
-      unparseable directory material too. Closes ticket 21645
-    - Increase the maximum allowed size passed to mprotect(PROT_WRITE)
-      from 1MB to 16MB. This was necessary with the glibc allocator in
-      order to allow worker threads to allocate more memory -- which in
-      turn is necessary because of our new use of worker threads for
-      compression. Closes ticket 22096.
-
-  o Minor features (logging):
-    - Log files are no longer created world-readable by default.
-      (Previously, most distributors would store the logs in a non-
-      world-readable location to prevent inappropriate access. This
-      change is an extra precaution.) Closes ticket 21729; patch
-      from toralf.
-
-  o Minor features (performance):
-    - Our Keccak (SHA-3) implementation now accesses memory more
-      efficiently, especially on little-endian systems. Closes
-      ticket 21737.
-    - Add an O(1) implementation of channel_find_by_global_id(), to
-      speed some controller functions.
-
-  o Minor features (relay, configuration):
-    - The MyFamily option may now be repeated as many times as desired,
-      for relays that want to configure large families. Closes ticket
-      4998; patch by Daniel Pinto.
-
-  o Minor features (relay, performance):
-    - Always start relays with at least two worker threads, to prevent
-      priority inversion on slow tasks. Part of the fix for bug 22883.
-    - Allow background work to be queued with different priorities, so
-      that a big pile of slow low-priority jobs will not starve out
-      higher priority jobs. This lays the groundwork for a fix for
-      bug 22883.
-
-  o Minor features (safety):
-    - Add an explicit check to extrainfo_parse_entry_from_string() for
-      NULL inputs. We don't believe this can actually happen, but it may
-      help silence a warning from the Clang analyzer. Closes
-      ticket 21496.
-
-  o Minor features (testing):
-    - Add more tests for compression backend initialization. Closes
-      ticket 22286.
-    - Add a "--disable-memory-sentinels" feature to help with fuzzing.
-      When Tor is compiled with this option, we disable a number of
-      redundant memory-safety failsafes that are intended to stop bugs
-      from becoming security issues. This makes it easier to hunt for
-      bugs that would be security issues without the failsafes turned
-      on. Closes ticket 21439.
-    - Add a general event-tracing instrumentation support to Tor. This
-      subsystem will enable developers and researchers to add fine-
-      grained instrumentation to their Tor instances, for use when
-      examining Tor network performance issues. There are no trace
-      events yet, and event-tracing is off by default unless enabled at
-      compile time. Implements ticket 13802.
-    - Improve our version parsing tests: add tests for typical version
-      components, add tests for invalid versions, including numeric
-      range and non-numeric prefixes. Unit tests 21278, 21450, and
-      21507. Partially implements 21470.
-
-  o Minor bugfixes (bandwidth accounting):
-    - Roll over monthly accounting at the configured hour and minute,
-      rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1.
-      Found by Andrey Karpov with PVS-Studio.
-
-  o Minor bugfixes (code correctness):
-    - Accurately identify client connections by their lack of peer
-      authentication. This means that we bail out earlier if asked to
-      extend to a client. Follow-up to 21407. Fixes bug 21406; bugfix
-      on 0.2.4.23.
-
-  o Minor bugfixes (compilation warnings):
-    - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug
-      22915; bugfix on 0.2.8.1-alpha.
-    - Fix warnings when building with libscrypt and openssl scrypt
-      support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
-    - When building with certain versions of the mingw C header files,
-      avoid float-conversion warnings when calling the C functions
-      isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation):
-    - Avoid compiler warnings in the unit tests for calling tor_sscanf()
-      with wide string outputs. Fixes bug 15582; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (compression):
-    - When spooling compressed data to an output buffer, don't try to
-      spool more data when there is no more data to spool and we are not
-      trying to flush the input. Previously, we would sometimes launch
-      compression requests with nothing to do, which interferes with our
-      22672 checks. Fixes bug 22719; bugfix on 0.2.0.16-alpha.
-
-  o Minor bugfixes (configuration):
-    - Do not crash when starting with LearnCircuitBuildTimeout 0. Fixes
-      bug 22252; bugfix on 0.2.9.3-alpha.
-
-  o Minor bugfixes (connection lifespan):
-    - Allow more control over how long TLS connections are kept open:
-      unify CircuitIdleTimeout and PredictedPortsRelevanceTime into a
-      single option called CircuitsAvailableTimeout. Also, allow the
-      consensus to control the default values for both this preference
-      and the lifespan of relay-to-relay connections. Fixes bug 17592;
-      bugfix on 0.2.5.5-alpha.
-    - Increase the initial circuit build timeout testing frequency, to
-      help ensure that ReducedConnectionPadding clients finish learning
-      a timeout before their orconn would expire. The initial testing
-      rate was set back in the days of TAP and before the Tor Browser
-      updater, when we had to be much more careful about new clients
-      making lots of circuits. With this change, a circuit build timeout
-      is learned in about 15-20 minutes, instead of 100-120 minutes.
-
-  o Minor bugfixes (controller):
-    - Do not crash when receiving a HSPOST command with an empty body.
-      Fixes part of bug 22644; bugfix on 0.2.7.1-alpha.
-    - Do not crash when receiving a POSTDESCRIPTOR command with an empty
-      body. Fixes part of bug 22644; bugfix on 0.2.0.1-alpha.
-    - GETINFO onions/current and onions/detached no longer respond with
-      551 on empty lists. Fixes bug 21329; bugfix on 0.2.7.1-alpha.
-    - Trigger HS descriptor events on the control port when the client
-      fails to pick a hidden service directory for a hidden service.
-      This can happen if all the hidden service directories are in
-      ExcludeNodes, or they have all been queried within the last 15
-      minutes. Fixes bug 22042; bugfix on 0.2.5.2-alpha.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-  o Minor bugfixes (coverity build support):
-    - Avoid Coverity build warnings related to our BUG() macro. By
-      default, Coverity treats BUG() as the Linux kernel does: an
-      instant abort(). We need to override that so our BUG() macro
-      doesn't prevent Coverity from analyzing functions that use it.
-      Fixes bug 23030; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (defensive programming):
-    - Detect and break out of infinite loops in our compression code. We
-      don't think that any such loops exist now, but it's best to be
-      safe. Closes ticket 22672.
-    - Fix a memset() off the end of an array when packing cells. This
-      bug should be harmless in practice, since the corrupted bytes are
-      still in the same structure, and are always padding bytes,
-      ignored, or immediately overwritten, depending on compiler
-      behavior. Nevertheless, because the memset()'s purpose is to make
-      sure that any other cell-handling bugs can't expose bytes to the
-      network, we need to fix it. Fixes bug 22737; bugfix on
-      0.2.4.11-alpha. Fixes CID 1401591.
-
-  o Minor bugfixes (directory authority):
-    - When a directory authority rejects a descriptor or extrainfo with
-      a given digest, mark that digest as undownloadable, so that we do
-      not attempt to download it again over and over. We previously
-      tried to avoid downloading such descriptors by other means, but we
-      didn't notice if we accidentally downloaded one anyway. This
-      behavior became problematic in 0.2.7.2-alpha, when authorities
-      began pinning Ed25519 keys. Fixes bug 22349; bugfix
-      on 0.2.1.19-alpha.
-    - When rejecting a router descriptor for running an obsolete version
-      of Tor without ntor support, warn about the obsolete tor version,
-      not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha.
-    - Prevent the shared randomness subsystem from asserting when
-      initialized by a bridge authority with an incomplete configuration
-      file. Fixes bug 21586; bugfix on 0.2.9.8.
-
-  o Minor bugfixes (error reporting, windows):
-    - When formatting Windows error messages, use the English format to
-      avoid codepage issues. Fixes bug 22520; bugfix on 0.1.2.8-alpha.
-      Patch from "Vort".
-
-  o Minor bugfixes (exit-side DNS):
-    - Fix an untriggerable assertion that checked the output of a
-      libevent DNS error, so that the assertion actually behaves as
-      expected. Fixes bug 22244; bugfix on 0.2.0.20-rc. Found by Andrey
-      Karpov using PVS-Studio.
-
-  o Minor bugfixes (fallback directories):
-    - Make the usage example in updateFallbackDirs.py actually work, and
-      explain what it does. Fixes bug 22270; bugfix on 0.3.0.3-alpha.
-    - Decrease the guard flag average required to be a fallback. This
-      allows us to keep relays that have their guard flag removed when
-      they restart. Fixes bug 20913; bugfix on 0.2.8.1-alpha.
-    - Decrease the minimum number of fallbacks to 100. Fixes bug 20913;
-      bugfix on 0.2.8.1-alpha.
-    - Make sure fallback directory mirrors have the same address, port,
-      and relay identity key for at least 30 days before they are
-      selected. Fixes bug 20913; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (file limits, osx):
-    - When setting the maximum number of connections allowed by the OS,
-      always allow some extra file descriptors for other files. Fixes
-      bug 22797; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Increase the number of circuits that a service is allowed to
-      open over a specific period of time. The value was lower than it
-      should be (8 vs 12) in the normal case of 3 introduction points.
-      Fixes bug 22159; bugfix on 0.3.0.5-rc.
-    - Fix a BUG warning during HSv3 descriptor decoding that could be
-      cause by a specially crafted descriptor. Fixes bug 23233; bugfix
-      on 0.3.0.1-alpha. Bug found by "haxxpop".
-    - Stop printing a cryptic warning when a hidden service gets a
-      request to connect to a virtual port that it hasn't configured.
-      Fixes bug 16706; bugfix on 0.2.6.3-alpha.
-    - Simplify hidden service descriptor creation by using an existing
-      flag to check if an introduction point is established. Fixes bug
-      21599; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (link handshake):
-    - Lower the lifetime of the RSA->Ed25519 cross-certificate to six
-      months, and regenerate it when it is within one month of expiring.
-      Previously, we had generated this certificate at startup with a
-      ten-year lifetime, but that could lead to weird behavior when Tor
-      was started with a grossly inaccurate clock. Mitigates bug 22466;
-      mitigation on 0.3.0.1-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox):
-    - Avoid a sandbox failure when trying to re-bind to a socket and
-      mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
-    - Permit the fchmod system call, to avoid crashing on startup when
-      starting with the seccomp2 sandbox and an unexpected set of
-      permissions on the data directory or its contents. Fixes bug
-      22516; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (logging):
-    - When decompressing, do not warn if we fail to decompress using a
-      compression method that we merely guessed. Fixes part of bug
-      22670; bugfix on 0.1.1.14-alpha.
-    - When decompressing, treat mismatch between content-encoding and
-      actual compression type as a protocol warning. Fixes part of bug
-      22670; bugfix on 0.1.1.9-alpha.
-    - Downgrade "assigned_to_cpuworker failed" message to info-level
-      severity. In every case that can reach it, either a better warning
-      has already been logged, or no warning is warranted. Fixes bug
-      22356; bugfix on 0.2.6.3-alpha.
-    - Log a better message when a directory authority replies to an
-      upload with an unexpected status code. Fixes bug 11121; bugfix
-      on 0.1.0.1-rc.
-    - Downgrade a log statement about unexpected relay cells from "bug"
-      to "protocol warning", because there is at least one use case
-      where it can be triggered by a buggy tor implementation. Fixes bug
-      21293; bugfix on 0.1.1.14-alpha.
-
-  o Minor bugfixes (logging, relay):
-    - Remove a forgotten debugging message when an introduction point
-      successfully establishes a hidden service prop224 circuit with
-      a client.
-    - Change three other log_warn() for an introduction point to
-      protocol warnings, because they can be failure from the network
-      and are not relevant to the operator. Fixes bug 23078; bugfix on
-      0.3.0.1-alpha and 0.3.0.2-alpha.
-
-  o Minor bugfixes (relay):
-    - Inform the geoip and rephist modules about all requests, even on
-      relays that are only fetching microdescriptors. Fixes a bug
-      related to 21585; bugfix on 0.3.0.1-alpha.
-
-  o Minor bugfixes (memory leaks):
-    - Fix a small memory leak at exit from the backtrace handler code.
-      Fixes bug 21788; bugfix on 0.2.5.2-alpha. Patch from Daniel Pinto.
-    - When directory authorities reject a router descriptor due to
-      keypinning, free the router descriptor rather than leaking the
-      memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha.
-    - Fix a small memory leak when validating a configuration that uses
-      two or more AF_UNIX sockets for the same port type. Fixes bug
-      23053; bugfix on 0.2.6.3-alpha. This is CID 1415725.
-
-  o Minor bugfixes (process behavior):
-    - When exiting because of an error, always exit with a nonzero exit
-      status. Previously, we would fail to report an error in our exit
-      status in cases related to __OwningControllerProcess failure,
-      lockfile contention, and Ed25519 key initialization. Fixes bug
-      22720; bugfix on versions 0.2.1.6-alpha, 0.2.2.28-beta, and
-      0.2.7.2-alpha respectively. Reported by "f55jwk4f"; patch
-      from "huyvq".
-
-  o Minor bugfixes (robustness, error handling):
-    - Improve our handling of the cases where OpenSSL encounters a
-      memory error while encoding keys and certificates. We haven't
-      observed these errors in the wild, but if they do happen, we now
-      detect and respond better. Fixes bug 19418; bugfix on all versions
-      of Tor. Reported by Guido Vranken.
-
-  o Minor bugfixes (testing):
-    - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291;
-      bugfix on 0.2.7.2-alpha. Found and patched by Ties Stuij.
-    - Use unbuffered I/O for utility functions around the
-      process_handle_t type. This fixes unit test failures reported on
-      OpenBSD and FreeBSD. Fixes bug 21654; bugfix on 0.2.3.1-alpha.
-    - Make display of captured unit test log messages consistent. Fixes
-      bug 21510; bugfix on 0.2.9.3-alpha.
-    - Make test-network.sh always call chutney's test-network.sh.
-      Previously, this only worked on systems which had bash installed,
-      due to some bash-specific code in the script. Fixes bug 19699;
-      bugfix on 0.3.0.4-rc. Follow-up to ticket 21581.
-    - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
-      Fixes bug 22803; bugfix on 0.3.0.1-alpha.
-    - The unit tests now pass on systems where localhost is misconfigured
-      to some IPv4 address other than 127.0.0.1. Fixes bug 6298; bugfix
-      on 0.0.9pre2.
-
-  o Minor bugfixes (voting consistency):
-    - Reject version numbers with non-numeric prefixes (such as +, -, or
-      whitespace). Disallowing whitespace prevents differential version
-      parsing between POSIX-based and Windows platforms. Fixes bug 21507
-      and part of 21508; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (Windows service):
-    - When running as a Windows service, set the ID of the main thread
-      correctly. Failure to do so made us fail to send log messages to
-      the controller in 0.2.1.16-rc, slowed down controller event
-      delivery in 0.2.7.3-rc and later, and crash with an assertion
-      failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha.
-      Patch and diagnosis from "Vort".
-
-  o Minor bugfixes (windows, relay):
-    - Resolve "Failure from drain_fd: No error" warnings on Windows
-      relays. Fixes bug 21540; bugfix on 0.2.6.3-alpha.
-
-  o Code simplification and refactoring:
-    - Break up the 630-line function connection_dir_client_reached_eof()
-      into a dozen smaller functions. This change should help
-      maintainability and readability of the client directory code.
-    - Isolate our use of the openssl headers so that they are only
-      included from our crypto wrapper modules, and from tests that
-      examine those modules' internals. Closes ticket 21841.
-    - Simplify our API to launch directory requests, making it more
-      extensible and less error-prone. Now it's easier to add extra
-      headers to directory requests. Closes ticket 21646.
-    - Our base64 decoding functions no longer overestimate the output
-      space that they need when parsing unpadded inputs. Closes
-      ticket 17868.
-    - Remove unused "ROUTER_ADDED_NOTIFY_GENERATOR" internal value.
-      Resolves ticket 22213.
-    - The logic that directory caches use to spool request to clients,
-      serving them one part at a time so as not to allocate too much
-      memory, has been refactored for consistency. Previously there was
-      a separate spooling implementation per type of spoolable data. Now
-      there is one common spooling implementation, with extensible data
-      types. Closes ticket 21651.
-    - Tor's compression module now supports multiple backends. Part of
-      the implementation for proposal 278; closes ticket 21663.
-
-  o Documentation:
-    - Add a manpage description for the key-pinning-journal file. Closes
-      ticket 22347.
-    - Correctly note that bandwidth accounting values are stored in the
-      state file, and the bw_accounting file is now obsolete. Closes
-      ticket 16082.
-    - Document more of the files in the Tor data directory, including
-      cached-extrainfo, secret_onion_key{,_ntor}.old, hidserv-stats,
-      approved-routers, sr-random, and diff-cache. Found while fixing
-      ticket 22347.
-    - Clarify the manpage for the (deprecated) torify script. Closes
-      ticket 6892.
-    - Clarify the behavior of the KeepAliveIsolateSOCKSAuth sub-option.
-      Closes ticket 21873.
-    - Correct documentation about the default DataDirectory value.
-      Closes ticket 21151.
-    - Document the default behavior of NumEntryGuards and
-      NumDirectoryGuards correctly. Fixes bug 21715; bugfix
-      on 0.3.0.1-alpha.
-    - Document key=value pluggable transport arguments for Bridge lines
-      in torrc. Fixes bug 20341; bugfix on 0.2.5.1-alpha.
-    - Note that bandwidth-limiting options don't affect TCP headers or
-      DNS. Closes ticket 17170.
-
-  o Removed features (configuration options, all in ticket 22060):
-    - These configuration options are now marked Obsolete, and no longer
-      have any effect: AllowInvalidNodes, AllowSingleHopCircuits,
-      AllowSingleHopExits, ExcludeSingleHopRelays, FastFirstHopPK,
-      TLSECGroup, WarnUnsafeSocks. They were first marked as deprecated
-      in 0.2.9.2-alpha and have now been removed. The previous default
-      behavior is now always chosen; the previous (less secure) non-
-      default behavior is now unavailable.
-    - CloseHSClientCircuitsImmediatelyOnTimeout and
-      CloseHSServiceRendCircuitsImmediatelyOnTimeout were deprecated in
-      0.2.9.2-alpha and now have been removed. HS circuits never close
-      on circuit build timeout; they have a longer timeout period.
-    - {Control,DNS,Dir,Socks,Trans,NATD,OR}ListenAddress were deprecated
-      in 0.2.9.2-alpha and now have been removed. Use the ORPort option
-      (and others) to configure listen-only and advertise-only addresses.
-
-  o Removed features (tools):
-    - We've removed the tor-checkkey tool from src/tools. Long ago, we
-      used it to help people detect RSA keys that were generated by
-      versions of Debian affected by CVE-2008-0166. But those keys have
-      been out of circulation for ages, and this tool is no longer
-      required. Closes ticket 21842.
-
-
-Changes in version 0.3.0.10 - 2017-08-02
-   Tor 0.3.0.10 backports a collection of small-to-medium bugfixes
-   from the current Tor alpha series. OpenBSD users and TPROXY users
-   should upgrade; others are probably okay sticking with 0.3.0.9.
-
-  o Major features (build system, continuous integration, backport from 0.3.1.5-alpha):
-    - Tor's repository now includes a Travis Continuous Integration (CI)
-      configuration file (.travis.yml). This is meant to help new
-      developers and contributors who fork Tor to a Github repository be
-      better able to test their changes, and understand what we expect
-      to pass. To use this new build feature, you must fork Tor to your
-      Github account, then go into the "Integrations" menu in the
-      repository settings for your fork and enable Travis, then push
-      your changes. Closes ticket 22636.
-
-  o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha):
-    - Fix a typo that had prevented TPROXY-based transparent proxying
-      from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha.
-      Patch from "d4fq0fQAgoJ".
-
-  o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
-    - Avoid an assertion failure bug affecting our implementation of
-      inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
-      handling of "0xbar" differs from what we had expected. Fixes bug
-      22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
-
-  o Minor features (backport from 0.3.1.5-alpha):
-    - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (bandwidth accounting, backport from 0.3.1.2-alpha):
-    - Roll over monthly accounting at the configured hour and minute,
-      rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1.
-      Found by Andrey Karpov with PVS-Studio.
-
-  o Minor bugfixes (compilation warnings, backport from 0.3.1.5-alpha):
-    - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915;
-      bugfix on 0.2.8.1-alpha.
-    - Fix warnings when building with libscrypt and openssl scrypt
-      support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
-    - When building with certain versions of the mingw C header files,
-      avoid float-conversion warnings when calling the C functions
-      isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha):
-    - Backport a fix for an "unused variable" warning that appeared
-      in some versions of mingw. Fixes bug 22838; bugfix on
-      0.2.8.1-alpha.
-
-  o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha):
-    - Avoid Coverity build warnings related to our BUG() macro. By
-      default, Coverity treats BUG() as the Linux kernel does: an
-      instant abort(). We need to override that so our BUG() macro
-      doesn't prevent Coverity from analyzing functions that use it.
-      Fixes bug 23030; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (directory authority, backport from 0.3.1.1-alpha):
-    - When rejecting a router descriptor for running an obsolete version
-      of Tor without ntor support, warn about the obsolete tor version,
-      not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha.
-
-  o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha):
-    - Avoid a sandbox failure when trying to re-bind to a socket and
-      mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (unit tests, backport from 0.3.1.5-alpha)
-    - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
-      Fixes bug 22803; bugfix on 0.3.0.1-alpha.
-
-
-Changes in version 0.3.0.9 - 2017-06-29
-  Tor 0.3.0.9 fixes a path selection bug that would allow a client
-  to use a guard that was in the same network family as a chosen exit
-  relay. This is a security regression; all clients running earlier
-  versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9 or
-  0.3.1.4-alpha.
-
-  This release also backports several other bugfixes from the 0.3.1.x
-  series.
-
-  o Major bugfixes (path selection, security, backport from 0.3.1.4-alpha):
-    - When choosing which guard to use for a circuit, avoid the exit's
-      family along with the exit itself. Previously, the new guard
-      selection logic avoided the exit, but did not consider its family.
-      Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017-
-      006 and CVE-2017-0377.
-
-  o Major bugfixes (entry guards, backport from 0.3.1.1-alpha):
-    - Don't block bootstrapping when a primary bridge is offline and we
-      can't get its descriptor. Fixes bug 22325; fixes one case of bug
-      21969; bugfix on 0.3.0.3-alpha.
-
-  o Major bugfixes (entry guards, backport from 0.3.1.4-alpha):
-    - When starting with an old consensus, do not add new entry guards
-      unless the consensus is "reasonably live" (under 1 day old). Fixes
-      one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha):
-    - Reject version numbers with non-numeric prefixes (such as +, -, or
-      whitespace). Disallowing whitespace prevents differential version
-      parsing between POSIX-based and Windows platforms. Fixes bug 21507
-      and part of 21508; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha):
-    - Permit the fchmod system call, to avoid crashing on startup when
-      starting with the seccomp2 sandbox and an unexpected set of
-      permissions on the data directory or its contents. Fixes bug
-      22516; bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (defensive programming, backport from 0.3.1.4-alpha):
-    - Fix a memset() off the end of an array when packing cells. This
-      bug should be harmless in practice, since the corrupted bytes are
-      still in the same structure, and are always padding bytes,
-      ignored, or immediately overwritten, depending on compiler
-      behavior. Nevertheless, because the memset()'s purpose is to make
-      sure that any other cell-handling bugs can't expose bytes to the
-      network, we need to fix it. Fixes bug 22737; bugfix on
-      0.2.4.11-alpha. Fixes CID 1401591.
-
-
-Changes in version 0.3.0.8 - 2017-06-08
-  Tor 0.3.0.8 fixes a pair of bugs that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-004 and TROVE-2017-005.
-
-  Tor 0.3.0.8 also includes fixes for several key management bugs
-  that sometimes made relays unreliable, as well as several other
-  bugfixes described below.
-
-  o Major bugfixes (hidden service, relay, security, backport
-    from 0.3.1.3-alpha):
-    - Fix a remotely triggerable assertion failure when a hidden service
-      handles a malformed BEGIN cell. Fixes bug 22493, tracked as
-      TROVE-2017-004 and as CVE-2017-0375; bugfix on 0.3.0.1-alpha.
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Major bugfixes (relay, link handshake, backport from 0.3.1.3-alpha):
-    - When performing the v3 link handshake on a TLS connection, report
-      that we have the x509 certificate that we actually used on that
-      connection, even if we have changed certificates since that
-      connection was first opened. Previously, we would claim to have
-      used our most recent x509 link certificate, which would sometimes
-      make the link handshake fail. Fixes one case of bug 22460; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (relays, key management, backport from 0.3.1.3-alpha):
-    - Regenerate link and authentication certificates whenever the key
-      that signs them changes; also, regenerate link certificates
-      whenever the signed key changes. Previously, these processes were
-      only weakly coupled, and we relays could (for minutes to hours)
-      wind up with an inconsistent set of keys and certificates, which
-      other relays would not accept. Fixes two cases of bug 22460;
-      bugfix on 0.3.0.1-alpha.
-    - When sending an Ed25519 signing->link certificate in a CERTS cell,
-      send the certificate that matches the x509 certificate that we
-      used on the TLS connection. Previously, there was a race condition
-      if the TLS context rotated after we began the TLS handshake but
-      before we sent the CERTS cell. Fixes a case of bug 22460; bugfix
-      on 0.3.0.1-alpha.
-
-  o Major bugfixes (hidden service v3, backport from 0.3.1.1-alpha):
-    - Stop rejecting v3 hidden service descriptors because their size
-      did not match an old padding rule. Fixes bug 22447; bugfix on
-      tor-0.3.0.1-alpha.
-
-  o Minor features (fallback directory list, backport from 0.3.1.3-alpha):
-    - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in
-      December 2016 (of which ~126 were still functional) with a list of
-      151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May
-      2017. Resolves ticket 21564.
-
-  o Minor bugfixes (configuration, backport from 0.3.1.1-alpha):
-    - Do not crash when starting with LearnCircuitBuildTimeout 0. Fixes
-      bug 22252; bugfix on 0.2.9.3-alpha.
-
-  o Minor bugfixes (correctness, backport from 0.3.1.3-alpha):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-  o Minor bugfixes (link handshake, backport from 0.3.1.3-alpha):
-    - Lower the lifetime of the RSA->Ed25519 cross-certificate to six
-      months, and regenerate it when it is within one month of expiring.
-      Previously, we had generated this certificate at startup with a
-      ten-year lifetime, but that could lead to weird behavior when Tor
-      was started with a grossly inaccurate clock. Mitigates bug 22466;
-      mitigation on 0.3.0.1-alpha.
-
-  o Minor bugfixes (memory leak, directory authority, backport from
-    0.3.1.2-alpha):
-    - When directory authorities reject a router descriptor due to
-      keypinning, free the router descriptor rather than leaking the
-      memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha.
-
-
-Changes in version 0.2.9.11 - 2017-06-08
-  Tor 0.2.9.11 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005. (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  Tor 0.2.9.11 also backports fixes for several key management bugs
-  that sometimes made relays unreliable, as well as several other
-  bugfixes described below.
-
-  o Major bugfixes (hidden service, relay, security, backport
-    from 0.3.1.3-alpha):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Major bugfixes (relay, link handshake, backport from 0.3.1.3-alpha):
-    - When performing the v3 link handshake on a TLS connection, report
-      that we have the x509 certificate that we actually used on that
-      connection, even if we have changed certificates since that
-      connection was first opened. Previously, we would claim to have
-      used our most recent x509 link certificate, which would sometimes
-      make the link handshake fail. Fixes one case of bug 22460; bugfix
-      on 0.2.3.6-alpha.
-
-  o Minor features (fallback directory list, backport from 0.3.1.3-alpha):
-    - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in
-      December 2016 (of which ~126 were still functional) with a list of
-      151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May
-      2017. Resolves ticket 21564.
-
-  o Minor features (future-proofing, backport from 0.3.0.7):
-    - Tor no longer refuses to download microdescriptors or descriptors if
-      they are listed as "published in the future".  This change will
-      eventually allow us to stop listing meaningful "published" dates
-      in microdescriptor consensuses, and thereby allow us to reduce the
-      resources required to download consensus diffs by over 50%.
-      Implements part of ticket 21642; implements part of proposal 275.
-
-  o Minor features (directory authorities, backport from 0.3.0.4-rc)
-    - Directory authorities now reject relays running versions
-      0.2.9.1-alpha through 0.2.9.4-alpha, because those relays
-      suffer from bug 20499 and don't keep their consensus cache
-      up-to-date. Resolves ticket 20509.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (control port, backport from 0.3.0.6):
-    - The GETINFO extra-info/digest/ command was broken because
-      of a wrong base16 decode return value check, introduced when
-      refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (correctness, backport from 0.3.1.3-alpha):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-  o Minor bugfixes (Linux seccomp2 sandbox, backport from 0.3.0.7):
-    - The getpid() system call is now permitted under the Linux seccomp2
-      sandbox, to avoid crashing with versions of OpenSSL (and other
-      libraries) that attempt to learn the process's PID by using the
-      syscall rather than the VDSO code. Fixes bug 21943; bugfix
-      on 0.2.5.1-alpha.
-
-  o Minor bugfixes (memory leak, directory authority, backport
-    from 0.3.1.2-alpha):
-    - When directory authorities reject a router descriptor due to
-      keypinning, free the router descriptor rather than leaking the
-      memory. Fixes bug 22370; bugfix on 0.2.7.2-alpha.
-
-Changes in version 0.2.8.14 - 2017-06-08
-  Tor 0.2.7.8 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005.  (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (fallback directory list, backport from 0.3.1.3-alpha):
-    - Replace the 177 fallbacks originally introduced in Tor 0.2.9.8 in
-      December 2016 (of which ~126 were still functional) with a list of
-      151 fallbacks (32 new, 119 unchanged, 58 removed) generated in May
-      2017. Resolves ticket 21564.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-Changes in version 0.2.7.8 - 2017-06-08
-  Tor 0.2.7.8 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005.  (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-
-Changes in version 0.2.6.12 - 2017-06-08
-  Tor 0.2.6.12 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005.  (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-Changes in version 0.2.5.14 - 2017-06-08
-  Tor 0.2.5.14 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005.  (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-Changes in version 0.2.4.29 - 2017-06-08
-  Tor 0.2.4.29 backports a fix for a bug that would allow an attacker to
-  remotely crash a hidden service with an assertion failure. Anyone
-  running a hidden service should upgrade to this version, or to some
-  other version with fixes for TROVE-2017-005.  (Versions before 0.3.0
-  are not affected by TROVE-2017-004.)
-
-  o Major bugfixes (hidden service, relay, security):
-    - Fix a remotely triggerable assertion failure caused by receiving a
-      BEGIN_DIR cell on a hidden service rendezvous circuit. Fixes bug
-      22494, tracked as TROVE-2017-005 and CVE-2017-0376; bugfix
-      on 0.2.2.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (correctness):
-    - Avoid undefined behavior when parsing IPv6 entries from the geoip6
-      file. Fixes bug 22490; bugfix on 0.2.4.6-alpha.
-
-
-Changes in version 0.3.0.7 - 2017-05-15
-  Tor 0.3.0.7 fixes a medium-severity security bug in earlier versions
-  of Tor 0.3.0.x, where an attacker could cause a Tor relay process
-  to exit. Relays running earlier versions of Tor 0.3.0.x should upgrade;
-  clients are not affected.
-
-  o Major bugfixes (hidden service directory, security):
-    - Fix an assertion failure in the hidden service directory code, which
-      could be used by an attacker to remotely cause a Tor relay process to
-      exit. Relays running earlier versions of Tor 0.3.0.x should upgrade.
-      should upgrade. This security issue is tracked as TROVE-2017-002.
-      Fixes bug 22246; bugfix on 0.3.0.1-alpha.
-
-  o Minor features:
-    - Update geoip and geoip6 to the May 2 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (future-proofing):
-    - Tor no longer refuses to download microdescriptors or descriptors
-      if they are listed as "published in the future". This change will
-      eventually allow us to stop listing meaningful "published" dates
-      in microdescriptor consensuses, and thereby allow us to reduce the
-      resources required to download consensus diffs by over 50%.
-      Implements part of ticket 21642; implements part of proposal 275.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - The getpid() system call is now permitted under the Linux seccomp2
-      sandbox, to avoid crashing with versions of OpenSSL (and other
-      libraries) that attempt to learn the process's PID by using the
-      syscall rather than the VDSO code. Fixes bug 21943; bugfix
-      on 0.2.5.1-alpha.
-
-
-Changes in version 0.3.0.6 - 2017-04-26
-  Tor 0.3.0.6 is the first stable release of the Tor 0.3.0 series.
-
-  With the 0.3.0 series, clients and relays now use Ed25519 keys to
-  authenticate their link connections to relays, rather than the old
-  RSA1024 keys that they used before. (Circuit crypto has been
-  Curve25519-authenticated since 0.2.4.8-alpha.) We have also replaced
-  the guard selection and replacement algorithm to behave more robustly
-  in the presence of unreliable networks, and to resist guard-
-  capture attacks.
-
-  This series also includes numerous other small features and bugfixes,
-  along with more groundwork for the upcoming hidden-services revamp.
-
-  Per our stable release policy, we plan to support the Tor 0.3.0
-  release series for at least the next nine months, or for three months
-  after the first stable release of the 0.3.1 series: whichever is
-  longer. If you need a release with long-term support, we recommend
-  that you stay with the 0.2.9 series.
-
-  Below are the changes since 0.2.9.10. For a list of only the changes
-  since 0.3.0.5-rc, see the ChangeLog file.
-
-  o Major features (directory authority, security):
-    - The default for AuthDirPinKeys is now 1: directory authorities
-      will reject relays where the RSA identity key matches a previously
-      seen value, but the Ed25519 key has changed. Closes ticket 18319.
-
-  o Major features (guard selection algorithm):
-    - Tor's guard selection algorithm has been redesigned from the
-      ground up, to better support unreliable networks and restrictive
-      sets of entry nodes, and to better resist guard-capture attacks by
-      hostile local networks. Implements proposal 271; closes
-      ticket 19877.
-
-  o Major features (next-generation hidden services):
-    - Relays can now handle v3 ESTABLISH_INTRO cells as specified by
-      prop224 aka "Next Generation Hidden Services". Service and clients
-      don't use this functionality yet. Closes ticket 19043. Based on
-      initial code by Alec Heifetz.
-    - Relays now support the HSDir version 3 protocol, so that they can
-      can store and serve v3 descriptors. This is part of the next-
-      generation onion service work detailed in proposal 224. Closes
-      ticket 17238.
-
-  o Major features (protocol, ed25519 identity keys):
-    - Clients now support including Ed25519 identity keys in the EXTEND2
-      cells they generate. By default, this is controlled by a consensus
-      parameter, currently disabled. You can turn this feature on for
-      testing by setting ExtendByEd25519ID in your configuration. This
-      might make your traffic appear different than the traffic
-      generated by other users, however. Implements part of ticket
-      15056; part of proposal 220.
-    - Relays now understand requests to extend to other relays by their
-      Ed25519 identity keys. When an Ed25519 identity key is included in
-      an EXTEND2 cell, the relay will only extend the circuit if the
-      other relay can prove ownership of that identity. Implements part
-      of ticket 15056; part of proposal 220.
-    - Relays now use Ed25519 to prove their Ed25519 identities and to
-      one another, and to clients. This algorithm is faster and more
-      secure than the RSA-based handshake we've been doing until now.
-      Implements the second big part of proposal 220; Closes
-      ticket 15055.
-
-  o Major features (security):
-    - Change the algorithm used to decide DNS TTLs on client and server
-      side, to better resist DNS-based correlation attacks like the
-      DefecTor attack of Greschbach, Pulls, Roberts, Winter, and
-      Feamster. Now relays only return one of two possible DNS TTL
-      values, and clients are willing to believe DNS TTL values up to 3
-      hours long. Closes ticket 19769.
-
-  o Major bugfixes (client, onion service, also in 0.2.9.9):
-    - Fix a client-side onion service reachability bug, where multiple
-      socks requests to an onion service (or a single slow request)
-      could cause us to mistakenly mark some of the service's
-      introduction points as failed, and we cache that failure so
-      eventually we run out and can't reach the service. Also resolves a
-      mysterious "Remote server sent bogus reason code 65021" log
-      warning. The bug was introduced in ticket 17218, where we tried to
-      remember the circuit end reason as a uint16_t, which mangled
-      negative values. Partially fixes bug 21056 and fixes bug 20307;
-      bugfix on 0.2.8.1-alpha.
-
-  o Major bugfixes (crash, directory connections):
-    - Fix a rare crash when sending a begin cell on a circuit whose
-      linked directory connection had already been closed. Fixes bug
-      21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett.
-
-  o Major bugfixes (directory authority):
-    - During voting, when marking a relay as a probable sybil, do not
-      clear its BadExit flag: sybils can still be bad in other ways
-      too. (We still clear the other flags.) Fixes bug 21108; bugfix
-      on 0.2.0.13-alpha.
-
-  o Major bugfixes (DNS):
-    - Fix a bug that prevented exit nodes from caching DNS records for
-      more than 60 seconds. Fixes bug 19025; bugfix on 0.2.4.7-alpha.
-
-  o Major bugfixes (IPv6 Exits):
-    - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects
-      any IPv6 addresses. Instead, only reject a port over IPv6 if the
-      exit policy rejects that port on more than an IPv6 /16 of
-      addresses. This bug was made worse by 17027 in 0.2.8.1-alpha,
-      which rejected a relay's own IPv6 address by default. Fixes bug
-      21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha.
-
-  o Major bugfixes (parsing):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-    - When parsing a malformed content-length field from an HTTP
-      message, do not read off the end of the buffer. This bug was a
-      potential remote denial-of-service attack against Tor clients and
-      relays. A workaround was released in October 2016, to prevent this
-      bug from crashing Tor. This is a fix for the underlying issue,
-      which should no longer matter (if you applied the earlier patch).
-      Fixes bug 20894; bugfix on 0.2.0.16-alpha. Bug found by fuzzing
-      using AFL (http://lcamtuf.coredump.cx/afl/).
-
-  o Major bugfixes (scheduler):
-    - Actually compare circuit policies in ewma_cmp_cmux(). This bug
-      caused the channel scheduler to behave more or less randomly,
-      rather than preferring channels with higher-priority circuits.
-      Fixes bug 20459; bugfix on 0.2.6.2-alpha.
-
-  o Major bugfixes (security, also in 0.2.9.9):
-    - Downgrade the "-ftrapv" option from "always on" to "only on when
-      --enable-expensive-hardening is provided." This hardening option,
-      like others, can turn survivable bugs into crashes--and having it
-      on by default made a (relatively harmless) integer overflow bug
-      into a denial-of-service bug. Fixes bug 21278 (TROVE-2017-001);
-      bugfix on 0.2.9.1-alpha.
-
-  o Minor feature (client):
-    - Enable IPv6 traffic on the SocksPort by default. To disable this,
-      a user will have to specify "NoIPv6Traffic". Closes ticket 21269.
-
-  o Minor feature (fallback scripts):
-    - Add a check_existing mode to updateFallbackDirs.py, which checks
-      if fallbacks in the hard-coded list are working. Closes ticket
-      20174. Patch by haxxpop.
-
-  o Minor feature (protocol versioning):
-    - Add new protocol version for proposal 224. HSIntro now advertises
-      version "3-4" and HSDir version "1-2". Fixes ticket 20656.
-
-  o Minor features (ciphersuite selection):
-    - Allow relays to accept a wider range of ciphersuites, including
-      chacha20-poly1305 and AES-CCM. Closes the other part of 15426.
-    - Clients now advertise a list of ciphersuites closer to the ones
-      preferred by Firefox. Closes part of ticket 15426.
-
-  o Minor features (controller):
-    - Add "GETINFO sr/current" and "GETINFO sr/previous" keys, to expose
-      shared-random values to the controller. Closes ticket 19925.
-    - When HSFETCH arguments cannot be parsed, say "Invalid argument"
-      rather than "unrecognized." Closes ticket 20389; patch from
-      Ivan Markin.
-
-  o Minor features (controller, configuration):
-    - Each of the *Port options, such as SocksPort, ORPort, ControlPort,
-      and so on, now comes with a __*Port variant that will not be saved
-      to the torrc file by the controller's SAVECONF command. This
-      change allows TorBrowser to set up a single-use domain socket for
-      each time it launches Tor. Closes ticket 20956.
-    - The GETCONF command can now query options that may only be
-      meaningful in context-sensitive lists. This allows the controller
-      to query the mixed SocksPort/__SocksPort style options introduced
-      in feature 20956. Implements ticket 21300.
-
-  o Minor features (diagnostic, directory client):
-    - Warn when we find an unexpected inconsistency in directory
-      download status objects. Prevents some negative consequences of
-      bug 20593.
-
-  o Minor features (directory authorities):
-    - Directory authorities now reject descriptors that claim to be
-      malformed versions of Tor. Helps prevent exploitation of
-      bug 21278.
-    - Reject version numbers with components that exceed INT32_MAX.
-      Otherwise 32-bit and 64-bit platforms would behave inconsistently.
-      Fixes bug 21450; bugfix on 0.0.8pre1.
-
-  o Minor features (directory authority):
-    - Add a new authority-only AuthDirTestEd25519LinkKeys option (on by
-      default) to control whether authorities should try to probe relays
-      by their Ed25519 link keys. This option will go away in a few
-      releases--unless we encounter major trouble in our ed25519 link
-      protocol rollout, in which case it will serve as a safety option.
-
-  o Minor features (directory cache):
-    - Relays and bridges will now refuse to serve the consensus they
-      have if they know it is too old for a client to use. Closes
-      ticket 20511.
-
-  o Minor features (ed25519 link handshake):
-    - Advertise support for the ed25519 link handshake using the
-      subprotocol-versions mechanism, so that clients can tell which
-      relays can identity themselves by Ed25519 ID. Closes ticket 20552.
-
-  o Minor features (entry guards):
-    - Add UseEntryGuards to TEST_OPTIONS_DEFAULT_VALUES in order to not
-      break regression tests.
-    - Require UseEntryGuards when UseBridges is set, in order to make
-      sure bridges aren't bypassed. Resolves ticket 20502.
-
-  o Minor features (fallback directories):
-    - Allow 3 fallback relays per operator, which is safe now that we
-      are choosing 200 fallback relays. Closes ticket 20912.
-    - Annotate updateFallbackDirs.py with the bandwidth and consensus
-      weight for each candidate fallback. Closes ticket 20878.
-    - Display the relay fingerprint when downloading consensuses from
-      fallbacks. Closes ticket 20908.
-    - Exclude relays affected by bug 20499 from the fallback list.
-      Exclude relays from the fallback list if they are running versions
-      known to be affected by bug 20499, or if in our tests they deliver
-      a stale consensus (i.e. one that expired more than 24 hours ago).
-      Closes ticket 20539.
-    - Make it easier to change the output sort order of fallbacks.
-      Closes ticket 20822.
-    - Reduce the minimum fallback bandwidth to 1 MByte/s. Part of
-      ticket 18828.
-    - Require fallback directories to have the same address and port for
-      7 days (now that we have enough relays with this stability).
-      Relays whose OnionOO stability timer is reset on restart by bug
-      18050 should upgrade to Tor 0.2.8.7 or later, which has a fix for
-      this issue. Closes ticket 20880; maintains short-term fix
-      in 0.2.8.2-alpha.
-    - Require fallbacks to have flags for 90% of the time (weighted
-      decaying average), rather than 95%. This allows at least 73% of
-      clients to bootstrap in the first 5 seconds without contacting an
-      authority. Part of ticket 18828.
-    - Select 200 fallback directories for each release. Closes
-      ticket 20881.
-
-  o Minor features (fingerprinting resistance, authentication):
-    - Extend the length of RSA keys used for TLS link authentication to
-      2048 bits. (These weren't used for forward secrecy; for forward
-      secrecy, we used P256.) Closes ticket 13752.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the April 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (geoip, also in 0.2.9.9):
-    - Update geoip and geoip6 to the January 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (infrastructure):
-    - Implement smartlist_add_strdup() function. Replaces the use of
-      smartlist_add(sl, tor_strdup(str)). Closes ticket 20048.
-
-  o Minor features (linting):
-    - Enhance the changes file linter to warn on Tor versions that are
-      prefixed with "tor-". Closes ticket 21096.
-
-  o Minor features (logging):
-    - In several places, describe unset ed25519 keys as "",
-      rather than the scary "AAAAAAAA...AAA". Closes ticket 21037.
-
-  o Minor features (portability, compilation):
-    - Autoconf now checks to determine if OpenSSL structures are opaque,
-      instead of explicitly checking for OpenSSL version numbers. Part
-      of ticket 21359.
-    - Support building with recent LibreSSL code that uses opaque
-      structures. Closes ticket 21359.
-
-  o Minor features (relay):
-    - We now allow separation of exit and relay traffic to different
-      source IP addresses, using the OutboundBindAddressExit and
-      OutboundBindAddressOR options respectively. Closes ticket 17975.
-      Written by Michael Sonntag.
-
-  o Minor features (reliability, crash):
-    - Try better to detect problems in buffers where they might grow (or
-      think they have grown) over 2 GB in size. Diagnostic for
-      bug 21369.
-
-  o Minor features (testing):
-    - During 'make test-network-all', if tor logs any warnings, ask
-      chutney to output them. Requires a recent version of chutney with
-      the 21572 patch. Implements 21570.
-
-  o Minor bugfix (control protocol):
-    - The reply to a "GETINFO config/names" request via the control
-      protocol now spells the type "Dependent" correctly. This is a
-      breaking change in the control protocol. (The field seems to be
-      ignored by the most common known controllers.) Fixes bug 18146;
-      bugfix on 0.1.1.4-alpha.
-    - The GETINFO extra-info/digest/ command was broken because
-      of a wrong base16 decode return value check, introduced when
-      refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfix (logging):
-    - Don't recommend the use of Tor2web in non-anonymous mode.
-      Recommending Tor2web is a bad idea because the client loses all
-      anonymity. Tor2web should only be used in specific cases by users
-      who *know* and understand the issues. Fixes bug 21294; bugfix
-      on 0.2.9.3-alpha.
-
-  o Minor bugfixes (bug resilience):
-    - Fix an unreachable size_t overflow in base64_decode(). Fixes bug
-      19222; bugfix on 0.2.0.9-alpha. Found by Guido Vranken; fixed by
-      Hans Jerry Illikainen.
-
-  o Minor bugfixes (build):
-    - Replace obsolete Autoconf macros with their modern equivalent and
-      prevent similar issues in the future. Fixes bug 20990; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor bugfixes (certificate expiration time):
-    - Avoid using link certificates that don't become valid till some
-      time in the future. Fixes bug 21420; bugfix on 0.2.4.11-alpha
-
-  o Minor bugfixes (client):
-    - Always recover from failures in extend_info_from_node(), in an
-      attempt to prevent any recurrence of bug 21242. Fixes bug 21372;
-      bugfix on 0.2.3.1-alpha.
-    - When clients that use bridges start up with a cached consensus on
-      disk, they were ignoring it and downloading a new one. Now they
-      use the cached one. Fixes bug 20269; bugfix on 0.2.3.12-alpha.
-
-  o Minor bugfixes (code correctness):
-    - Repair a couple of (unreachable or harmless) cases of the risky
-      comparison-by-subtraction pattern that caused bug 21278.
-
-  o Minor bugfixes (config):
-    - Don't assert on startup when trying to get the options list and
-      LearnCircuitBuildTimeout is set to 0: we are currently parsing the
-      options so of course they aren't ready yet. Fixes bug 21062;
-      bugfix on 0.2.9.3-alpha.
-
-  o Minor bugfixes (configuration):
-    - Accept non-space whitespace characters after the severity level in
-      the `Log` option. Fixes bug 19965; bugfix on 0.2.1.1-alpha.
-    - Support "TByte" and "TBytes" units in options given in bytes.
-      "TB", "terabyte(s)", "TBit(s)" and "terabit(s)" were already
-      supported. Fixes bug 20622; bugfix on 0.2.0.14-alpha.
-
-  o Minor bugfixes (configure, autoconf):
-    - Rename the configure option --enable-expensive-hardening to
-      --enable-fragile-hardening. Expensive hardening makes the tor
-      daemon abort when some kinds of issues are detected. Thus, it
-      makes tor more at risk of remote crashes but safer against RCE or
-      heartbleed bug category. We now try to explain this issue in a
-      message from the configure script. Fixes bug 21290; bugfix
-      on 0.2.5.4-alpha.
-
-  o Minor bugfixes (consensus weight):
-    - Add new consensus method that initializes bw weights to 1 instead
-      of 0. This prevents a zero weight from making it all the way to
-      the end (happens in small testing networks) and causing an error.
-      Fixes bug 14881; bugfix on 0.2.2.17-alpha.
-
-  o Minor bugfixes (crash prevention):
-    - Fix an (currently untriggerable, but potentially dangerous) crash
-      bug when base32-encoding inputs whose sizes are not a multiple of
-      5. Fixes bug 21894; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (dead code):
-    - Remove a redundant check for PidFile changes at runtime in
-      options_transition_allowed(): this check is already performed
-      regardless of whether the sandbox is active. Fixes bug 21123;
-      bugfix on 0.2.5.4-alpha.
-
-  o Minor bugfixes (descriptors):
-    - Correctly recognise downloaded full descriptors as valid, even
-      when using microdescriptors as circuits. This affects clients with
-      FetchUselessDescriptors set, and may affect directory authorities.
-      Fixes bug 20839; bugfix on 0.2.3.2-alpha.
-
-  o Minor bugfixes (directory mirrors):
-    - Allow relays to use directory mirrors without a DirPort: these
-      relays need to be contacted over their ORPorts using a begindir
-      connection. Fixes one case of bug 20711; bugfix on 0.2.8.2-alpha.
-    - Clarify the message logged when a remote relay is unexpectedly
-      missing an ORPort or DirPort: users were confusing this with a
-      local port. Fixes another case of bug 20711; bugfix
-      on 0.2.8.2-alpha.
-
-  o Minor bugfixes (directory system):
-    - Bridges and relays now use microdescriptors (like clients do)
-      rather than old-style router descriptors. Now bridges will blend
-      in with clients in terms of the circuits they build. Fixes bug
-      6769; bugfix on 0.2.3.2-alpha.
-    - Download all consensus flavors, descriptors, and authority
-      certificates when FetchUselessDescriptors is set, regardless of
-      whether tor is a directory cache or not. Fixes bug 20667; bugfix
-      on all recent tor versions.
-
-  o Minor bugfixes (documentation):
-    - Update the tor manual page to document every option that can not
-      be changed while tor is running. Fixes bug 21122.
-
-  o Minor bugfixes (ed25519 certificates):
-    - Correctly interpret ed25519 certificates that would expire some
-      time after 19 Jan 2038. Fixes bug 20027; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (fallback directories):
-    - Avoid checking fallback candidates' DirPorts if they are down in
-      OnionOO. When a relay operator has multiple relays, this
-      prioritizes relays that are up over relays that are down. Fixes
-      bug 20926; bugfix on 0.2.8.3-alpha.
-    - Stop failing when OUTPUT_COMMENTS is True in updateFallbackDirs.py.
-      Fixes bug 20877; bugfix on 0.2.8.3-alpha.
-    - Stop failing when a relay has no uptime data in
-      updateFallbackDirs.py. Fixes bug 20945; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (hidden service):
-    - Clean up the code for expiring intro points with no associated
-      circuits. It was causing, rarely, a service with some expiring
-      introduction points to not open enough additional introduction
-      points. Fixes part of bug 21302; bugfix on 0.2.7.2-alpha.
-    - Resolve two possible underflows which could lead to creating and
-      closing a lot of introduction point circuits in a non-stop loop.
-      Fixes bug 21302; bugfix on 0.2.7.2-alpha.
-    - Stop setting the torrc option HiddenServiceStatistics to "0" just
-      because we're not a bridge or relay. Instead, we preserve whatever
-      value the user set (or didn't set). Fixes bug 21150; bugfix
-      on 0.2.6.2-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Make hidden services check for failed intro point connections,
-      even when they have exceeded their intro point creation limit.
-      Fixes bug 21596; bugfix on 0.2.7.2-alpha. Reported by Alec Muffett.
-    - Make hidden services with 8 to 10 introduction points check for
-      failed circuits immediately after startup. Previously, they would
-      wait for 5 minutes before performing their first checks. Fixes bug
-      21594; bugfix on 0.2.3.9-alpha. Reported by Alec Muffett.
-    - Stop ignoring misconfigured hidden services. Instead, refuse to
-      start tor until the misconfigurations have been corrected. Fixes
-      bug 20559; bugfix on multiple commits in 0.2.7.1-alpha
-      and earlier.
-
-  o Minor bugfixes (IPv6):
-    - Make IPv6-using clients try harder to find an IPv6 directory
-      server. Fixes bug 20999; bugfix on 0.2.8.2-alpha.
-    - When IPv6 addresses have not been downloaded yet (microdesc
-      consensus documents don't list relay IPv6 addresses), use hard-
-      coded addresses for authorities, fallbacks, and configured
-      bridges. Now IPv6-only clients can use microdescriptors. Fixes bug
-      20996; bugfix on b167e82 from 19608 in 0.2.8.5-alpha.
-
-  o Minor bugfixes (memory leak at exit):
-    - Fix a small harmless memory leak at exit of the previously unused
-      RSA->Ed identity cross-certificate. Fixes bug 17779; bugfix
-      on 0.2.7.2-alpha.
-
-  o Minor bugfixes (onion services):
-    - Allow the number of introduction points to be as low as 0, rather
-      than as low as 3. Fixes bug 21033; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (portability):
-    - Use "OpenBSD" compiler macro instead of "OPENBSD" or "__OpenBSD__".
-      It is supported by OpenBSD itself, and also by most OpenBSD
-      variants (such as Bitrig). Fixes bug 20980; bugfix
-      on 0.1.2.1-alpha.
-
-  o Minor bugfixes (portability, also in 0.2.9.9):
-    - Avoid crashing when Tor is built using headers that contain
-      CLOCK_MONOTONIC_COARSE, but then tries to run on an older kernel
-      without CLOCK_MONOTONIC_COARSE. Fixes bug 21035; bugfix
-      on 0.2.9.1-alpha.
-    - Fix Libevent detection on platforms without Libevent 1 headers
-      installed. Fixes bug 21051; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (relay):
-    - Avoid a double-marked-circuit warning that could happen when we
-      receive DESTROY cells under heavy load. Fixes bug 20059; bugfix
-      on 0.1.0.1-rc.
-    - Honor DataDirectoryGroupReadable when tor is a relay. Previously,
-      initializing the keys would reset the DataDirectory to 0700
-      instead of 0750 even if DataDirectoryGroupReadable was set to 1.
-      Fixes bug 19953; bugfix on 0.0.2pre16. Patch by "redfish".
-
-  o Minor bugfixes (testing):
-    - Fix Raspbian build issues related to missing socket errno in
-      test_util.c. Fixes bug 21116; bugfix on 0.2.8.2. Patch by "hein".
-    - Remove undefined behavior from the backtrace generator by removing
-      its signal handler. Fixes bug 21026; bugfix on 0.2.5.2-alpha.
-    - Use bash in src/test/test-network.sh. This ensures we reliably
-      call chutney's newer tools/test-network.sh when available. Fixes
-      bug 21562; bugfix on 0.2.9.1-alpha.
-
-  o Minor bugfixes (tor-resolve):
-    - The tor-resolve command line tool now rejects hostnames over 255
-      characters in length. Previously, it would silently truncate them,
-      which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5.
-      Patch by "junglefowl".
-
-  o Minor bugfixes (unit tests):
-    - Allow the unit tests to pass even when DNS lookups of bogus
-      addresses do not fail as expected. Fixes bug 20862 and 20863;
-      bugfix on unit tests introduced in 0.2.8.1-alpha
-      through 0.2.9.4-alpha.
-
-  o Minor bugfixes (util):
-    - When finishing writing a file to disk, if we were about to replace
-      the file with the temporary file created before and we fail to
-      replace it, remove the temporary file so it doesn't stay on disk.
-      Fixes bug 20646; bugfix on 0.2.0.7-alpha. Patch by fk.
-
-  o Minor bugfixes (Windows services):
-    - Be sure to initialize the monotonic time subsystem before using
-      it, even when running as an NT service. Fixes bug 21356; bugfix
-      on 0.2.9.1-alpha.
-
-  o Minor bugfixes (Windows):
-    - Check for getpagesize before using it to mmap files. This fixes
-      compilation in some MinGW environments. Fixes bug 20530; bugfix on
-      0.1.2.1-alpha. Reported by "ice".
-
-  o Code simplification and refactoring:
-    - Abolish all global guard context in entrynodes.c; replace with new
-      guard_selection_t structure as preparation for proposal 271.
-      Closes ticket 19858.
-    - Extract magic numbers in circuituse.c into defined variables.
-    - Introduce rend_service_is_ephemeral() that tells if given onion
-      service is ephemeral. Replace unclear NULL-checkings for service
-      directory with this function. Closes ticket 20526.
-    - Refactor circuit_is_available_for_use to remove unnecessary check.
-    - Refactor circuit_predict_and_launch_new for readability and
-      testability. Closes ticket 18873.
-    - Refactor code to manipulate global_origin_circuit_list into
-      separate functions. Closes ticket 20921.
-    - Refactor large if statement in purpose_needs_anonymity to use
-      switch statement instead. Closes part of ticket 20077.
-    - Refactor the hashing API to return negative values for errors, as
-      is done as throughout the codebase. Closes ticket 20717.
-    - Remove data structures that were used to index or_connection
-      objects by their RSA identity digests. These structures are fully
-      redundant with the similar structures used in the
-      channel abstraction.
-    - Remove duplicate code in the channel_write_*cell() functions.
-      Closes ticket 13827; patch from Pingl.
-    - Remove redundant behavior of is_sensitive_dir_purpose, refactor to
-      use only purpose_needs_anonymity. Closes part of ticket 20077.
-    - The code to generate and parse EXTEND and EXTEND2 cells has been
-      replaced with code automatically generated by the
-      "trunnel" utility.
-
-  o Documentation (formatting):
-    - Clean up formatting of tor.1 man page and HTML doc, where 
-      blocks were incorrectly appearing. Closes ticket 20885.
-
-  o Documentation (man page):
-    - Clarify many options in tor.1 and add some min/max values for
-      HiddenService options. Closes ticket 21058.
-
-  o Documentation:
-    - Change '1' to 'weight_scale' in consensus bw weights calculation
-      comments, as that is reality. Closes ticket 20273. Patch
-      from pastly.
-    - Clarify that when ClientRejectInternalAddresses is enabled (which
-      is the default), multicast DNS hostnames for machines on the local
-      network (of the form *.local) are also rejected. Closes
-      ticket 17070.
-    - Correct the value for AuthDirGuardBWGuarantee in the manpage, from
-      250 KBytes to 2 MBytes. Fixes bug 20435; bugfix on 0.2.5.6-alpha.
-    - Include the "TBits" unit in Tor's man page. Fixes part of bug
-      20622; bugfix on 0.2.5.1-alpha.
-    - Small fixes to the fuzzing documentation. Closes ticket 21472.
-    - Stop the man page from incorrectly stating that HiddenServiceDir
-      must already exist. Fixes 20486.
-    - Update the description of the directory server options in the
-      manual page, to clarify that a relay no longer needs to set
-      DirPort in order to be a directory cache. Closes ticket 21720.
-
-  o Removed features:
-    - The AuthDirMaxServersPerAuthAddr option no longer exists: The same
-      limit for relays running on a single IP applies to authority IP
-      addresses as well as to non-authority IP addresses. Closes
-      ticket 20960.
-    - The UseDirectoryGuards torrc option no longer exists: all users
-      that use entry guards will also use directory guards. Related to
-      proposal 271; implements part of ticket 20831.
-
-  o Testing:
-    - Add tests for networkstatus_compute_bw_weights_v10.
-    - Add unit tests circuit_predict_and_launch_new.
-    - Extract dummy_origin_circuit_new so it can be used by other
-      test functions.
-    - New unit tests for tor_htonll(). Closes ticket 19563. Patch
-      from "overcaffeinated".
-    - Perform the coding style checks when running the tests and fail
-      when coding style violations are found. Closes ticket 5500.
-
-
-Changes in version 0.2.8.13 - 2017-03-03
-  Tor 0.2.8.13 backports a security fix from later Tor
-  releases.  Anybody running Tor 0.2.8.12 or earlier should upgrade to this
-  this release, if for some reason they cannot upgrade to a later
-  release series, and if they build Tor with the --enable-expensive-hardening
-  option.
-
-  Note that support for Tor 0.2.8.x is ending next year: we will not issue
-  any fixes for the Tor 0.2.8.x series after 1 Jan 2018.  If you need
-  a Tor release series with longer-term support, we recommend Tor 0.2.9.x.
-
-  o Major bugfixes (parsing, backported from 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.7.7 - 2017-03-03
-  Tor 0.2.7.7 backports a number of security fixes from later Tor
-  releases.  Anybody running Tor 0.2.7.6 or earlier should upgrade to
-  this release, if for some reason they cannot upgrade to a later
-  release series.
-
-  Note that support for Tor 0.2.7.x is ending this year: we will not issue
-  any fixes for the Tor 0.2.7.x series after 1 August 2017.  If you need
-  a Tor release series with longer-term support, we recommend Tor 0.2.9.x.
-
-  o Directory authority changes (backport from 0.2.8.5-rc):
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Directory authority changes (backport from 0.2.9.2-alpha):
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Directory authority key updates (backport from 0.2.8.1-alpha):
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by "teor".
-
-  o Major bugfixes (parsing, security, backport from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha):
-    - Stop a crash that could occur when a client running with DNSPort
-      received a query with multiple address types, and the first
-      address type was not supported. Found and fixed by Scott Dial.
-      Fixes bug 18710; bugfix on 0.2.5.4-alpha.
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (key management, backport from 0.2.8.3-alpha):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (parsing, backported from 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (security, memory erasure, backport from 0.2.8.1-alpha):
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by "teor".
-
-  o Minor features (bug-resistance, backport from 0.2.8.2-alpha):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.6.11 - 2017-03-03
-  Tor 0.2.6.11 backports a number of security fixes from later Tor
-  releases.  Anybody running Tor 0.2.6.10 or earlier should upgrade to
-  this release, if for some reason they cannot upgrade to a later
-  release series.
-
-  Note that support for Tor 0.2.6.x is ending this year: we will not issue
-  any fixes for the Tor 0.2.6.x series after 1 August 2017.  If you need
-  a Tor release series with longer-term support, we recommend Tor 0.2.9.x.
-
-  o Directory authority changes (backport from 0.2.8.5-rc):
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Directory authority changes (backport from 0.2.9.2-alpha):
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Directory authority key updates (backport from 0.2.8.1-alpha):
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by "teor".
-
-  o Major features (security fixes, backport from 0.2.9.4-alpha):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Major bugfixes (parsing, security, backport from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha):
-    - Stop a crash that could occur when a client running with DNSPort
-      received a query with multiple address types, and the first
-      address type was not supported. Found and fixed by Scott Dial.
-      Fixes bug 18710; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (security, correctness, backport from 0.2.7.4-rc):
-    - Fix an error that could cause us to read 4 bytes before the
-      beginning of an openssl string. This bug could be used to cause
-      Tor to crash on systems with unusual malloc implementations, or
-      systems with unusual hardening installed. Fixes bug 17404; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (guard selection, backport from 0.2.7.6):
-    - Actually look at the Guard flag when selecting a new directory
-      guard. When we implemented the directory guard design, we
-      accidentally started treating all relays as if they have the Guard
-      flag during guard selection, leading to weaker anonymity and worse
-      performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered
-      by Mohsen Imani.
-
-  o Major bugfixes (key management, backport from 0.2.8.3-alpha):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (parsing, backported from 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (security, memory erasure, backport from 0.2.8.1-alpha):
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by "teor".
-
-  o Minor features (bug-resistance, backport from 0.2.8.2-alpha):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, backport from 0.2.7.6):
-    - Fix a compilation warning with Clang 3.6: Do not check the
-      presence of an address which can never be NULL. Fixes bug 17781.
-
-
-Changes in version 0.2.5.13 - 2017-03-03
-  Tor 0.2.5.13 backports a number of security fixes from later Tor
-  releases.  Anybody running Tor 0.2.5.13 or earlier should upgrade to
-  this release, if for some reason they cannot upgrade to a later
-  release series.
-
-  Note that support for Tor 0.2.5.x is ending next year: we will not issue
-  any fixes for the Tor 0.2.5.x series after 1 May 2018.  If you need
-  a Tor release series with longer-term support, we recommend Tor 0.2.9.x.
-
-  o Directory authority changes (backport from 0.2.8.5-rc):
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Directory authority changes (backport from 0.2.9.2-alpha):
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Directory authority key updates (backport from 0.2.8.1-alpha):
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by "teor".
-
-  o Major features (security fixes, backport from 0.2.9.4-alpha):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Major bugfixes (parsing, security, backport from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha):
-    - Stop a crash that could occur when a client running with DNSPort
-      received a query with multiple address types, and the first
-      address type was not supported. Found and fixed by Scott Dial.
-      Fixes bug 18710; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (security, correctness, backport from 0.2.7.4-rc):
-    - Fix an error that could cause us to read 4 bytes before the
-      beginning of an openssl string. This bug could be used to cause
-      Tor to crash on systems with unusual malloc implementations, or
-      systems with unusual hardening installed. Fixes bug 17404; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (guard selection, backport from 0.2.7.6):
-    - Actually look at the Guard flag when selecting a new directory
-      guard. When we implemented the directory guard design, we
-      accidentally started treating all relays as if they have the Guard
-      flag during guard selection, leading to weaker anonymity and worse
-      performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered
-      by Mohsen Imani.
-
-  o Major bugfixes (key management, backport from 0.2.8.3-alpha):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (parsing, backported from 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (security, memory erasure, backport from 0.2.8.1-alpha):
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by "teor".
-
-  o Minor features (bug-resistance, backport from 0.2.8.2-alpha):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, backport from 0.2.7.6):
-    - Fix a compilation warning with Clang 3.6: Do not check the
-      presence of an address which can never be NULL. Fixes bug 17781.
-
-  o Minor bugfixes (crypto error-handling, backport from 0.2.7.2-alpha):
-    - Check for failures from crypto_early_init, and refuse to continue.
-      A previous typo meant that we could keep going with an
-      uninitialized crypto library, and would have OpenSSL initialize
-      its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced
-      when implementing ticket 4900. Patch by "teor".
-
-  o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-
-
-Changes in version 0.2.4.28 - 2017-03-03
-  Tor 0.2.4.28 backports a number of security fixes from later Tor
-  releases.  Anybody running Tor 0.2.4.27 or earlier should upgrade to
-  this release, if for some reason they cannot upgrade to a later
-  release series.
-
-  Note that support for Tor 0.2.4.x is ending soon: we will not issue
-  any fixes for the Tor 0.2.4.x series after 1 August 2017.  If you need
-  a Tor release series with long-term support, we recommend Tor 0.2.9.x.
-
-  o Directory authority changes (backport from 0.2.8.5-rc):
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Directory authority changes (backport from 0.2.9.2-alpha):
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Directory authority key updates (backport from 0.2.8.1-alpha):
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by "teor".
-
-  o Major features (security fixes, backport from 0.2.9.4-alpha):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Major bugfixes (parsing, security, backport from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Major bugfixes (security, correctness, backport from 0.2.7.4-rc):
-    - Fix an error that could cause us to read 4 bytes before the
-      beginning of an openssl string. This bug could be used to cause
-      Tor to crash on systems with unusual malloc implementations, or
-      systems with unusual hardening installed. Fixes bug 17404; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (guard selection, backport from 0.2.7.6):
-    - Actually look at the Guard flag when selecting a new directory
-      guard. When we implemented the directory guard design, we
-      accidentally started treating all relays as if they have the Guard
-      flag during guard selection, leading to weaker anonymity and worse
-      performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered
-      by Mohsen Imani.
-
-  o Major bugfixes (key management, backport from 0.2.8.3-alpha):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (parsing, backported from 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (security, memory erasure, backport from 0.2.8.1-alpha):
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by "teor".
-
-  o Minor features (bug-resistance, backport from 0.2.8.2-alpha):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-
-  o Minor features (DoS-resistance, backport from 0.2.7.1-alpha):
-    - Make it harder for attackers to overload hidden services with
-      introductions, by blocking multiple introduction requests on the
-      same circuit. Resolves ticket 15515.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation, backport from 0.2.7.6):
-    - Fix a compilation warning with Clang 3.6: Do not check the
-      presence of an address which can never be NULL. Fixes bug 17781.
-
-  o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-
-
-Changes in version 0.2.9.10 - 2017-03-01
-  Tor 0.2.9.10 backports a security fix from later Tor release.  It also
-  includes fixes for some major issues affecting directory authorities,
-  LibreSSL compatibility, and IPv6 correctness.
-
-  The Tor 0.2.9.x release series is now marked as a long-term-support
-  series.  We intend to backport security fixes to 0.2.9.x until at
-  least January of 2020.
-
-  o Major bugfixes (directory authority, 0.3.0.3-alpha):
-    - During voting, when marking a relay as a probable sybil, do not
-      clear its BadExit flag: sybils can still be bad in other ways
-      too. (We still clear the other flags.) Fixes bug 21108; bugfix
-      on 0.2.0.13-alpha.
-
-  o Major bugfixes (IPv6 Exits, backport from 0.3.0.3-alpha):
-    - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects
-      any IPv6 addresses. Instead, only reject a port over IPv6 if the
-      exit policy rejects that port on more than an IPv6 /16 of
-      addresses. This bug was made worse by 17027 in 0.2.8.1-alpha,
-      which rejected a relay's own IPv6 address by default. Fixes bug
-      21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha.
-
-  o Major bugfixes (parsing, also in 0.3.0.4-rc):
-    - Fix an integer underflow bug when comparing malformed Tor
-      versions. This bug could crash Tor when built with
-      --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor
-      0.2.9.8, which were built with -ftrapv by default. In other cases
-      it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix
-      on 0.0.8pre1. Found by OSS-Fuzz.
-
-  o Minor features (directory authorities, also in 0.3.0.4-rc):
-    - Directory authorities now reject descriptors that claim to be
-      malformed versions of Tor. Helps prevent exploitation of
-      bug 21278.
-    - Reject version numbers with components that exceed INT32_MAX.
-      Otherwise 32-bit and 64-bit platforms would behave inconsistently.
-      Fixes bug 21450; bugfix on 0.0.8pre1.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (portability, compilation, backport from 0.3.0.3-alpha):
-    - Autoconf now checks to determine if OpenSSL structures are opaque,
-      instead of explicitly checking for OpenSSL version numbers. Part
-      of ticket 21359.
-    - Support building with recent LibreSSL code that uses opaque
-      structures. Closes ticket 21359.
-
-  o Minor bugfixes (code correctness, also in 0.3.0.4-rc):
-    - Repair a couple of (unreachable or harmless) cases of the risky
-      comparison-by-subtraction pattern that caused bug 21278.
-
-  o Minor bugfixes (tor-resolve, backport from 0.3.0.3-alpha):
-    - The tor-resolve command line tool now rejects hostnames over 255
-      characters in length. Previously, it would silently truncate them,
-      which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5.
-      Patch by "junglefowl".
-
-
-Changes in version 0.2.9.9 - 2017-01-23
-  Tor 0.2.9.9 fixes a denial-of-service bug where an attacker could
-  cause relays and clients to crash, even if they were not built with
-  the --enable-expensive-hardening option. This bug affects all 0.2.9.x
-  versions, and also affects 0.3.0.1-alpha: all relays running an affected
-  version should upgrade.
-
-  This release also resolves a client-side onion service reachability
-  bug, and resolves a pair of small portability issues.
-
-  o Major bugfixes (security):
-    - Downgrade the "-ftrapv" option from "always on" to "only on when
-      --enable-expensive-hardening is provided." This hardening option,
-      like others, can turn survivable bugs into crashes -- and having
-      it on by default made a (relatively harmless) integer overflow bug
-      into a denial-of-service bug. Fixes bug 21278 (TROVE-2017-001);
-      bugfix on 0.2.9.1-alpha.
-
-  o Major bugfixes (client, onion service):
-    - Fix a client-side onion service reachability bug, where multiple
-      socks requests to an onion service (or a single slow request)
-      could cause us to mistakenly mark some of the service's
-      introduction points as failed, and we cache that failure so
-      eventually we run out and can't reach the service. Also resolves a
-      mysterious "Remote server sent bogus reason code 65021" log
-      warning. The bug was introduced in ticket 17218, where we tried to
-      remember the circuit end reason as a uint16_t, which mangled
-      negative values. Partially fixes bug 21056 and fixes bug 20307;
-      bugfix on 0.2.8.1-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the January 4 2017 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (portability):
-    - Avoid crashing when Tor is built using headers that contain
-      CLOCK_MONOTONIC_COARSE, but then tries to run on an older kernel
-      without CLOCK_MONOTONIC_COARSE. Fixes bug 21035; bugfix
-      on 0.2.9.1-alpha.
-    - Fix Libevent detection on platforms without Libevent 1 headers
-      installed. Fixes bug 21051; bugfix on 0.2.9.1-alpha.
-
-
-Changes in version 0.2.8.12 - 2016-12-19
-  Tor 0.2.8.12 backports a fix for a medium-severity issue (bug 21018
-  below) where Tor clients could crash when attempting to visit a
-  hostile hidden service. Clients are recommended to upgrade as packages
-  become available for their systems.
-
-  It also includes an updated list of fallback directories, backported
-  from 0.2.9.
-
-  Now that the Tor 0.2.9 series is stable, only major bugfixes will be
-  backported to 0.2.8 in the future.
-
-  o Major bugfixes (parsing, security, backported from 0.2.9.8):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Minor features (fallback directory list, backported from 0.2.9.8):
-    - Replace the 81 remaining fallbacks of the 100 originally
-      introduced in Tor 0.2.8.3-alpha in March 2016, with a list of 177
-      fallbacks (123 new, 54 existing, 27 removed) generated in December
-      2016. Resolves ticket 20170.
-
-  o Minor features (geoip, backported from 0.2.9.7-rc):
-    - Update geoip and geoip6 to the December 7 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.9.8 - 2016-12-19
-  Tor 0.2.9.8 is the first stable release of the Tor 0.2.9 series.
-
-  The Tor 0.2.9 series makes mandatory a number of security features
-  that were formerly optional. It includes support for a new shared-
-  randomness protocol that will form the basis for next generation
-  hidden services, includes a single-hop hidden service mode for
-  optimizing .onion services that don't actually want to be hidden,
-  tries harder not to overload the directory authorities with excessive
-  downloads, and supports a better protocol versioning scheme for
-  improved compatibility with other implementations of the Tor protocol.
-
-  And of course, there are numerous other bugfixes and improvements.
-
-  This release also includes a fix for a medium-severity issue (bug
-  21018 below) where Tor clients could crash when attempting to visit a
-  hostile hidden service. Clients are recommended to upgrade as packages
-  become available for their systems.
-
-  Below are listed the changes since Tor 0.2.8.11.  For a list of
-  changes since 0.2.9.7-rc, see the ChangeLog file.
-
-  o New system requirements:
-    - When building with OpenSSL, Tor now requires version 1.0.1 or
-      later. OpenSSL 1.0.0 and earlier are no longer supported by the
-      OpenSSL team, and should not be used. Closes ticket 20303.
-    - Tor now requires Libevent version 2.0.10-stable or later. Older
-      versions of Libevent have less efficient backends for several
-      platforms, and lack the DNS code that we use for our server-side
-      DNS support. This implements ticket 19554.
-    - Tor now requires zlib version 1.2 or later, for security,
-      efficiency, and (eventually) gzip support. (Back when we started,
-      zlib 1.1 and zlib 1.0 were still found in the wild. 1.2 was
-      released in 2003. We recommend the latest version.)
-
-  o Deprecated features:
-    - A number of DNS-cache-related sub-options for client ports are now
-      deprecated for security reasons, and may be removed in a future
-      version of Tor. (We believe that client-side DNS caching is a bad
-      idea for anonymity, and you should not turn it on.) The options
-      are: CacheDNS, CacheIPv4DNS, CacheIPv6DNS, UseDNSCache,
-      UseIPv4Cache, and UseIPv6Cache.
-    - A number of options are deprecated for security reasons, and may
-      be removed in a future version of Tor. The options are:
-      AllowDotExit, AllowInvalidNodes, AllowSingleHopCircuits,
-      AllowSingleHopExits, ClientDNSRejectInternalAddresses,
-      CloseHSClientCircuitsImmediatelyOnTimeout,
-      CloseHSServiceRendCircuitsImmediatelyOnTimeout,
-      ExcludeSingleHopRelays, FastFirstHopPK, TLSECGroup,
-      UseNTorHandshake, and WarnUnsafeSocks.
-    - The *ListenAddress options are now deprecated as unnecessary: the
-      corresponding *Port options should be used instead. These options
-      may someday be removed. The affected options are:
-      ControlListenAddress, DNSListenAddress, DirListenAddress,
-      NATDListenAddress, ORListenAddress, SocksListenAddress,
-      and TransListenAddress.
-
-  o Major bugfixes (parsing, security, new since 0.2.9.7-rc):
-    - Fix a bug in parsing that could cause clients to read a single
-      byte past the end of an allocated region. This bug could be used
-      to cause hardened clients (built with --enable-expensive-hardening)
-      to crash if they tried to visit a hostile hidden service. Non-
-      hardened clients are only affected depending on the details of
-      their platform's memory allocator. Fixes bug 21018; bugfix on
-      0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE-
-      2016-12-002 and as CVE-2016-1254.
-
-  o Major features (build, hardening):
-    - Tor now builds with -ftrapv by default on compilers that support
-      it. This option detects signed integer overflow (which C forbids),
-      and turns it into a hard-failure. We do not apply this option to
-      code that needs to run in constant time to avoid side-channels;
-      instead, we use -fwrapv in that code. Closes ticket 17983.
-    - When --enable-expensive-hardening is selected, stop applying the
-      clang/gcc sanitizers to code that needs to run in constant time.
-      Although we are aware of no introduced side-channels, we are not
-      able to prove that there are none. Related to ticket 17983.
-
-  o Major features (circuit building, security):
-    - Authorities, relays, and clients now require ntor keys in all
-      descriptors, for all hops (except for rare hidden service protocol
-      cases), for all circuits, and for all other roles. Part of
-      ticket 19163.
-    - Authorities, relays, and clients only use ntor, except for
-      rare cases in the hidden service protocol. Part of ticket 19163.
-
-  o Major features (compilation):
-    - Our big list of extra GCC warnings is now enabled by default when
-      building with GCC (or with anything like Clang that claims to be
-      GCC-compatible). To make all warnings into fatal compilation
-      errors, pass --enable-fatal-warnings to configure. Closes
-      ticket 19044.
-    - Use the Autoconf macro AC_USE_SYSTEM_EXTENSIONS to automatically
-      turn on C and POSIX extensions. (Previously, we attempted to do
-      this on an ad hoc basis.) Closes ticket 19139.
-
-  o Major features (directory authorities, hidden services):
-    - Directory authorities can now perform the shared randomness
-      protocol specified by proposal 250. Using this protocol, directory
-      authorities generate a global fresh random value every day. In the
-      future, this value will be used by hidden services to select
-      HSDirs. This release implements the directory authority feature;
-      the hidden service side will be implemented in the future as part
-      of proposal 224. Resolves ticket 16943; implements proposal 250.
-
-  o Major features (downloading, random exponential backoff):
-    - When we fail to download an object from a directory service, wait
-      for an (exponentially increasing) randomized amount of time before
-      retrying, rather than a fixed interval as we did before. This
-      prevents a group of Tor instances from becoming too synchronized,
-      or a single Tor instance from becoming too predictable, in its
-      download schedule. Closes ticket 15942.
-
-  o Major features (resource management):
-    - Tor can now notice it is about to run out of sockets, and
-      preemptively close connections of lower priority. (This feature is
-      off by default for now, since the current prioritizing method is
-      yet not mature enough. You can enable it by setting
-      "DisableOOSCheck 0", but watch out: it might close some sockets
-      you would rather have it keep.) Closes ticket 18640.
-
-  o Major features (single-hop "hidden" services):
-    - Add experimental HiddenServiceSingleHopMode and
-      HiddenServiceNonAnonymousMode options. When both are set to 1,
-      every hidden service on that Tor instance becomes a non-anonymous
-      Single Onion Service. Single Onions make one-hop (direct)
-      connections to their introduction and rendezvous points. One-hop
-      circuits make Single Onion servers easily locatable, but clients
-      remain location-anonymous. This is compatible with the existing
-      hidden service implementation, and works on the current Tor
-      network without any changes to older relays or clients. Implements
-      proposal 260, completes ticket 17178. Patch by teor and asn.
-
-  o Major features (subprotocol versions):
-    - Tor directory authorities now vote on a set of recommended
-      "subprotocol versions", and on a set of required subprotocol
-      versions. Clients and relays that lack support for a _required_
-      subprotocol version will not start; those that lack support for a
-      _recommended_ subprotocol version will warn the user to upgrade.
-      This change allows compatible implementations of the Tor protocol(s)
-      to exist without pretending to be 100% bug-compatible with
-      particular releases of Tor itself. Closes ticket 19958; implements
-      part of proposal 264.
-
-  o Major bugfixes (circuit building):
-    - Hidden service client-to-intro-point and service-to-rendezvous-
-      point circuits use the TAP key supplied by the protocol, to avoid
-      epistemic attacks. Fixes bug 19163; bugfix on 0.2.4.18-rc.
-
-  o Major bugfixes (download scheduling):
-    - Avoid resetting download status for consensuses hourly, since we
-      already have another, smarter retry mechanism. Fixes bug 8625;
-      bugfix on 0.2.0.9-alpha.
-    - If a consensus expires while we are waiting for certificates to
-      download, stop waiting for certificates.
-    - If we stop waiting for certificates less than a minute after we
-      started downloading them, do not consider the certificate download
-      failure a separate failure. Fixes bug 20533; bugfix
-      on 0.2.0.9-alpha.
-    - When using exponential backoff in test networks, use a lower
-      exponent, so the delays do not vary as much. This helps test
-      networks bootstrap consistently. Fixes bug 20597; bugfix on 20499.
-
-  o Major bugfixes (exit policies):
-    - Avoid disclosing exit outbound bind addresses, configured port
-      bind addresses, and local interface addresses in relay descriptors
-      by default under ExitPolicyRejectPrivate. Instead, only reject
-      these (otherwise unlisted) addresses if
-      ExitPolicyRejectLocalInterfaces is set. Fixes bug 18456; bugfix on
-      0.2.7.2-alpha. Patch by teor.
-
-  o Major bugfixes (hidden services):
-    - Allow Tor clients with appropriate controllers to work with
-      FetchHidServDescriptors set to 0. Previously, this option also
-      disabled descriptor cache lookup, thus breaking hidden services
-      entirely. Fixes bug 18704; bugfix on 0.2.0.20-rc. Patch by "twim".
-    - Clients now require hidden services to include the TAP keys for
-      their intro points in the hidden service descriptor. This prevents
-      an inadvertent upgrade to ntor, which a malicious hidden service
-      could use to distinguish clients by consensus version. Fixes bug
-      20012; bugfix on 0.2.4.8-alpha. Patch by teor.
-
-  o Major bugfixes (relay, resolver, logging):
-    - For relays that don't know their own address, avoid attempting a
-      local hostname resolve for each descriptor we download. This
-      will cut down on the number of "Success: chose address 'x.x.x.x'"
-      log lines, and also avoid confusing clock jumps if the resolver
-      is slow. Fixes bugs 20423 and 20610; bugfix on 0.2.8.1-alpha.
-
-  o Minor features (port flags):
-    - Add new flags to the *Port options to give finer control over which
-      requests are allowed. The flags are NoDNSRequest, NoOnionTraffic,
-      and the synthetic flag OnionTrafficOnly, which is equivalent to
-      NoDNSRequest, NoIPv4Traffic, and NoIPv6Traffic. Closes enhancement
-      18693; patch by "teor".
-
-  o Minor features (build, hardening):
-    - Detect and work around a libclang_rt problem that would prevent
-      clang from finding __mulodi4() on some 32-bit platforms, and thus
-      keep -ftrapv from linking on those systems. Closes ticket 19079.
-    - When building on a system without runtime support for the runtime
-      hardening options, try to log a useful warning at configuration
-      time, rather than an incomprehensible warning at link time. If
-      expensive hardening was requested, this warning becomes an error.
-      Closes ticket 18895.
-
-  o Minor features (client, directory):
-    - Since authorities now omit all routers that lack the Running and
-      Valid flags, we assume that any relay listed in the consensus must
-      have those flags. Closes ticket 20001; implements part of
-      proposal 272.
-
-  o Minor features (code safety):
-    - In our integer-parsing functions, ensure that the maximum value we
-      allow is no smaller than the minimum value. Closes ticket 19063;
-      patch from "U+039b".
-
-  o Minor features (compilation, portability):
-    - Compile correctly on MacOS 10.12 (aka "Sierra"). Closes
-      ticket 20241.
-
-  o Minor features (config):
-    - Warn users when descriptor and port addresses are inconsistent.
-      Mitigates bug 13953; patch by teor.
-
-  o Minor features (controller):
-    - Allow controllers to configure basic client authorization on
-      hidden services when they create them with the ADD_ONION controller
-      command. Implements ticket 15588. Patch by "special".
-    - Fire a STATUS_SERVER controller event whenever the hibernation
-      status changes between "awake"/"soft"/"hard". Closes ticket 18685.
-    - Implement new GETINFO queries for all downloads that use
-      download_status_t to schedule retries. This allows controllers to
-      examine the schedule for pending downloads. Closes ticket 19323.
-
-  o Minor features (development tools, etags):
-    - Teach the "make tags" Makefile target how to correctly find
-      "MOCK_IMPL" function definitions. Patch from nherring; closes
-      ticket 16869.
-
-  o Minor features (directory authority):
-    - After voting, if the authorities decide that a relay is not
-      "Valid", they no longer include it in the consensus at all. Closes
-      ticket 20002; implements part of proposal 272.
-    - Directory authorities now only give the Guard flag to a relay if
-      they are also giving it the Stable flag. This change allows us to
-      simplify path selection for clients. It should have minimal effect
-      in practice, since >99% of Guards already have the Stable flag.
-      Implements ticket 18624.
-    - Directory authorities now write their v3-status-votes file out to
-      disk earlier in the consensus process, so we have a record of the
-      votes even if we abort the consensus process. Resolves
-      ticket 19036.
-
-  o Minor features (fallback directory list, new since 0.2.9.7-rc):
-    - Replace the 81 remaining fallbacks of the 100 originally
-      introduced in Tor 0.2.8.3-alpha in March 2016, with a list of 177
-      fallbacks (123 new, 54 existing, 27 removed) generated in December
-      2016. Resolves ticket 20170.
-
-  o Minor features (hidden service):
-    - Stop being so strict about the payload length of "rendezvous1"
-      cells. We used to be locked in to the "TAP" handshake length, and
-      now we can handle better handshakes like "ntor". Resolves
-      ticket 18998.
-
-  o Minor features (infrastructure, time):
-    - Tor now includes an improved timer backend, so that we can
-      efficiently support tens or hundreds of thousands of concurrent
-      timers, as will be needed for some of our planned anti-traffic-
-      analysis work. This code is based on William Ahern's "timeout.c"
-      project, which implements a "tickless hierarchical timing wheel".
-      Closes ticket 18365.
-    - Tor now uses the operating system's monotonic timers (where
-      available) for internal fine-grained timing. Previously we would
-      look at the system clock, and then attempt to compensate for the
-      clock running backwards. Closes ticket 18908.
-
-  o Minor features (logging):
-    - Add a set of macros to check nonfatal assertions, for internal
-      use. Migrating more of our checks to these should help us avoid
-      needless crash bugs. Closes ticket 18613.
-    - Provide a more useful warning message when configured with an
-      invalid Nickname. Closes ticket 18300; patch from "icanhasaccount".
-    - When dumping unparseable router descriptors, optionally store them
-      in separate files, named by digest, up to a configurable size
-      limit. You can change the size limit by setting the
-      MaxUnparseableDescSizeToLog option, and disable this feature by
-      setting that option to 0. Closes ticket 18322.
-
-  o Minor features (performance):
-    - Change the "optimistic data" extension from "off by default" to
-      "on by default". The default was ordinarily overridden by a
-      consensus option, but when clients were bootstrapping for the
-      first time, they would not have a consensus to get the option
-      from. Changing this default saves a round-trip during startup.
-      Closes ticket 18815.
-
-  o Minor features (relay, usability):
-    - When the directory authorities refuse a bad relay's descriptor,
-      encourage the relay operator to contact us. Many relay operators
-      won't notice this line in their logs, but it's a win if even a few
-      learn why we don't like what their relay was doing. Resolves
-      ticket 18760.
-
-  o Minor features (security, TLS):
-    - Servers no longer support clients that lack AES ciphersuites.
-      (3DES is no longer considered an acceptable cipher.) We believe
-      that no such Tor clients currently exist, since Tor has required
-      OpenSSL 0.9.7 or later since 2009. Closes ticket 19998.
-
-  o Minor features (testing):
-    - Disable memory protections on OpenBSD when performing our unit
-      tests for memwipe(). The test deliberately invokes undefined
-      behavior, and the OpenBSD protections interfere with this. Patch
-      from "rubiate". Closes ticket 20066.
-    - Move the test-network.sh script to chutney, and modify tor's test-
-      network.sh to call the (newer) chutney version when available.
-      Resolves ticket 19116. Patch by teor.
-    - Use the lcov convention for marking lines as unreachable, so that
-      we don't count them when we're generating test coverage data.
-      Update our coverage tools to understand this convention. Closes
-      ticket 16792.
-    - Our link-handshake unit tests now check that when invalid
-      handshakes fail, they fail with the error messages we expected.
-    - Our unit testing code that captures log messages no longer
-      prevents them from being written out if the user asked for them
-      (by passing --debug or --info or --notice or --warn to the "test"
-      binary). This change prevents us from missing unexpected log
-      messages simply because we were looking for others. Related to
-      ticket 19999.
-    - The unit tests now log all warning messages with the "BUG" flag.
-      Previously, they only logged errors by default. This change will
-      help us make our testing code more correct, and make sure that we
-      only hit this code when we mean to. In the meantime, however,
-      there will be more warnings in the unit test logs than before.
-      This is preparatory work for ticket 19999.
-    - The unit tests now treat any failure of a "tor_assert_nonfatal()"
-      assertion as a test failure.
-    - We've done significant work to make the unit tests run faster.
-
-  o Minor features (testing, ipv6):
-    - Add the hs-ipv6 chutney target to make test-network-all's IPv6
-      tests. Remove bridges+hs, as it's somewhat redundant. This
-      requires a recent chutney version that supports IPv6 clients,
-      relays, and authorities. Closes ticket 20069; patch by teor.
-    - Add the single-onion and single-onion-ipv6 chutney targets to
-      "make test-network-all". This requires a recent chutney version
-      with the single onion network flavors (git c72a652 or later).
-      Closes ticket 20072; patch by teor.
-
-  o Minor features (Tor2web):
-    - Make Tor2web clients respect ReachableAddresses. This feature was
-      inadvertently enabled in 0.2.8.6, then removed by bugfix 19973 on
-      0.2.8.7. Implements feature 20034. Patch by teor.
-
-  o Minor features (unix domain sockets):
-    - When configuring a unix domain socket for a SocksPort,
-      ControlPort, or Hidden service, you can now wrap the address in
-      quotes, using C-style escapes inside the quotes. This allows unix
-      domain socket paths to contain spaces. Resolves ticket 18753.
-
-  o Minor features (user interface):
-    - Tor now supports the ability to declare options deprecated, so
-      that we can recommend that people stop using them. Previously, this
-      was done in an ad-hoc way. There is a new --list-deprecated-options
-      command-line option to list all of the deprecated options. Closes
-      ticket 19820.
-
-  o Minor features (virtual addresses):
-    - Increase the maximum number of bits for the IPv6 virtual network
-      prefix from 16 to 104. In this way, the condition for address
-      allocation is less restrictive. Closes ticket 20151; feature
-      on 0.2.4.7-alpha.
-
-  o Minor bug fixes (circuits):
-    - Use the CircuitBuildTimeout option whenever
-      LearnCircuitBuildTimeout is disabled. Previously, we would respect
-      the option when a user disabled it, but not when it was disabled
-      because some other option was set. Fixes bug 20073; bugfix on
-      0.2.4.12-alpha. Patch by teor.
-
-  o Minor bugfixes (build):
-    - The current Git revision when building from a local repository is
-      now detected correctly when using git worktrees. Fixes bug 20492;
-      bugfix on 0.2.3.9-alpha.
-
-  o Minor bugfixes (relay address discovery):
-    - Stop reordering IP addresses returned by the OS. This makes it
-      more likely that Tor will guess the same relay IP address every
-      time. Fixes issue 20163; bugfix on 0.2.7.1-alpha, ticket 17027.
-      Reported by René Mayrhofer, patch by "cypherpunks".
-
-  o Minor bugfixes (memory allocation):
-    - Change how we allocate memory for large chunks on buffers, to
-      avoid a (currently impossible) integer overflow, and to waste less
-      space when allocating unusually large chunks. Fixes bug 20081;
-      bugfix on 0.2.0.16-alpha. Issue identified by Guido Vranken.
-
-  o Minor bugfixes (bootstrap):
-    - Remember the directory server we fetched the consensus or previous
-      certificates from, and use it to fetch future authority
-      certificates. This change improves bootstrapping performance.
-      Fixes bug 18963; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (circuits):
-    - Make sure extend_info_from_router() is only called on servers.
-      Fixes bug 19639; bugfix on 0.2.8.1-alpha.
-
-  o Minor bugfixes (client, fascistfirewall):
-    - Avoid spurious warnings when ReachableAddresses or FascistFirewall
-      is set. Fixes bug 20306; bugfix on 0.2.8.2-alpha.
-
-  o Minor bugfixes (client, unix domain sockets):
-    - Disable IsolateClientAddr when using AF_UNIX backed SocksPorts as
-      the client address is meaningless. Fixes bug 20261; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (code style):
-    - Fix an integer signedness conversion issue in the case conversion
-      tables. Fixes bug 19168; bugfix on 0.2.1.11-alpha.
-
-  o Minor bugfixes (compilation):
-    - Build correctly on versions of libevent2 without support for
-      evutil_secure_rng_add_bytes(). Fixes bug 19904; bugfix
-      on 0.2.5.4-alpha.
-    - When building with Clang, use a full set of GCC warnings.
-      (Previously, we included only a subset, because of the way we
-      detected them.) Fixes bug 19216; bugfix on 0.2.0.1-alpha.
-    - Detect Libevent2 functions correctly on systems that provide
-      libevent2, but where libevent1 is linked with -levent. Fixes bug
-      19904; bugfix on 0.2.2.24-alpha. Patch from Rubiate.
-    - Run correctly when built on Windows build environments that
-      require _vcsprintf(). Fixes bug 20560; bugfix on 0.2.2.11-alpha.
-
-  o Minor bugfixes (configuration):
-    - When parsing quoted configuration values from the torrc file,
-      handle Windows line endings correctly. Fixes bug 19167; bugfix on
-      0.2.0.16-alpha. Patch from "Pingl".
-
-  o Minor bugfixes (directory authority):
-    - Authorities now sort the "package" lines in their votes, for ease
-      of debugging. (They are already sorted in consensus documents.)
-      Fixes bug 18840; bugfix on 0.2.6.3-alpha.
-    - Die with a more useful error when the operator forgets to place
-      the authority_signing_key file into the keys directory. This
-      avoids an uninformative assert & traceback about having an invalid
-      key. Fixes bug 20065; bugfix on 0.2.0.1-alpha.
-    - When allowing private addresses, mark Exits that only exit to
-      private locations as such. Fixes bug 20064; bugfix
-      on 0.2.2.9-alpha.
-    - When parsing a detached signature, make sure we use the length of
-      the digest algorithm instead of a hardcoded DIGEST256_LEN in
-      order to avoid comparing bytes out-of-bounds with a smaller digest
-      length such as SHA1. Fixes bug 19066; bugfix on 0.2.2.6-alpha.
-
-  o Minor bugfixes (getpass):
-    - Defensively fix a non-triggerable heap corruption at do_getpass()
-      to protect ourselves from mistakes in the future. Fixes bug
-      19223; bugfix on 0.2.7.3-rc. Bug found by Guido Vranken, patch
-      by nherring.
-
-  o Minor bugfixes (guard selection):
-    - Don't mark guards as unreachable if connection_connect() fails.
-      That function fails for local reasons, so it shouldn't reveal
-      anything about the status of the guard. Fixes bug 14334; bugfix
-      on 0.2.3.10-alpha.
-    - Use a single entry guard even if the NumEntryGuards consensus
-      parameter is not provided. Fixes bug 17688; bugfix
-      on 0.2.5.6-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Increase the minimum number of internal circuits we preemptively
-      build from 2 to 3, so a circuit is available when a client
-      connects to another onion service. Fixes bug 13239; bugfix
-      on 0.1.0.1-rc.
-    - Allow hidden services to run on IPv6 addresses even when the
-      IPv6Exit option is not set. Fixes bug 18357; bugfix
-      on 0.2.4.7-alpha.
-    - Stop logging intro point details to the client log on certain
-      error conditions. Fixed as part of bug 20012; bugfix on
-      0.2.4.8-alpha. Patch by teor.
-    - When deleting an ephemeral hidden service, close its intro points
-      even if they are not completely open. Fixes bug 18604; bugfix
-      on 0.2.7.1-alpha.
-    - When configuring hidden services, check every hidden service
-      directory's permissions. Previously, we only checked the last
-      hidden service. Fixes bug 20529; bugfix on 0.2.6.2-alpha.
-
-  o Minor bugfixes (IPv6, testing):
-    - Check for IPv6 correctly on Linux when running test networks.
-      Fixes bug 19905; bugfix on 0.2.7.3-rc; patch by teor.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Add permission to run the sched_yield() and sigaltstack() system
-      calls, in order to support versions of Tor compiled with asan or
-      ubsan code that use these calls. Now "sandbox 1" and
-      "--enable-expensive-hardening" should be compatible on more
-      systems. Fixes bug 20063; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (logging):
-    - Downgrade a harmless log message about the
-      pending_entry_connections list from "warn" to "info". Mitigates
-      bug 19926.
-    - Log a more accurate message when we fail to dump a microdescriptor.
-      Fixes bug 17758; bugfix on 0.2.2.8-alpha. Patch from Daniel Pinto.
-    - When logging a directory ownership mismatch, log the owning
-      username correctly. Fixes bug 19578; bugfix on 0.2.2.29-beta.
-    - When we are unable to remove the bw_accounting file, do not warn
-      if the reason we couldn't remove it was that it didn't exist.
-      Fixes bug 19964; bugfix on 0.2.5.4-alpha. Patch from pastly.
-
-  o Minor bugfixes (memory leak):
-    - Fix a series of slow memory leaks related to parsing torrc files
-      and options. Fixes bug 19466; bugfix on 0.2.1.6-alpha.
-    - Avoid a small memory leak when informing worker threads about
-      rotated onion keys. Fixes bug 20401; bugfix on 0.2.6.3-alpha.
-    - Fix a small memory leak when receiving AF_UNIX connections on a
-      SocksPort. Fixes bug 20716; bugfix on 0.2.6.3-alpha.
-    - When moving a signed descriptor object from a source to an
-      existing destination, free the allocated memory inside that
-      destination object. Fixes bug 20715; bugfix on 0.2.8.3-alpha.
-    - Fix a memory leak and use-after-free error when removing entries
-      from the sandbox's getaddrinfo() cache. Fixes bug 20710; bugfix on
-      0.2.5.5-alpha. Patch from "cypherpunks".
-    - Fix a small, uncommon memory leak that could occur when reading a
-      truncated ed25519 key file. Fixes bug 18956; bugfix
-      on 0.2.6.1-alpha.
-
-  o Minor bugfixes (option parsing):
-    - Count unix sockets when counting client listeners (SOCKS, Trans,
-      NATD, and DNS). This has no user-visible behavior changes: these
-      options are set once, and never read. Required for correct
-      behavior in ticket 17178. Fixes bug 19677; bugfix on
-      0.2.6.3-alpha. Patch by teor.
-
-  o Minor bugfixes (options):
-    - Check the consistency of UseEntryGuards and EntryNodes more
-      reliably. Fixes bug 20074; bugfix on 0.2.4.12-alpha. Patch
-      by teor.
-    - Stop changing the configured value of UseEntryGuards on
-      authorities and Tor2web clients. Fixes bug 20074; bugfix on
-      commits 51fc6799 in 0.1.1.16-rc and acda1735 in 0.2.4.3-alpha.
-      Patch by teor.
-
-  o Minor bugfixes (relay):
-    - Ensure relays don't make multiple connections during bootstrap.
-      Fixes bug 20591; bugfix on 0.2.8.1-alpha.
-    - Do not try to parallelize workers more than 16x without the user
-      explicitly configuring us to do so, even if we do detect more than
-      16 CPU cores. Fixes bug 19968; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (testing):
-    - The test-stem and test-network makefile targets now depend only on
-      the tor binary that they are testing. Previously, they depended on
-      "make all". Fixes bug 18240; bugfix on 0.2.8.2-alpha. Based on a
-      patch from "cypherpunks".
-    - Allow clients to retry HSDirs much faster in test networks. Fixes
-      bug 19702; bugfix on 0.2.7.1-alpha. Patch by teor.
-    - Avoid a unit test failure on systems with over 16 detectable CPU
-      cores. Fixes bug 19968; bugfix on 0.2.3.1-alpha.
-    - Let backtrace tests work correctly under AddressSanitizer:
-      disable ASAN's detection of segmentation faults while running
-      test_bt.sh, so that we can make sure that our own backtrace
-      generation code works. Fixes bug 18934; bugfix
-      on 0.2.5.2-alpha. Patch from "cypherpunks".
-    - Fix the test-network-all target on out-of-tree builds by using the
-      correct path to the test driver script. Fixes bug 19421; bugfix
-      on 0.2.7.3-rc.
-    - Stop spurious failures in the local interface address discovery
-      unit tests. Fixes bug 20634; bugfix on 0.2.8.1-alpha; patch by
-      Neel Chauhan.
-    - Use ECDHE ciphers instead of ECDH in tortls tests. LibreSSL has
-      removed the ECDH ciphers which caused the tests to fail on
-      platforms which use it. Fixes bug 20460; bugfix on 0.2.8.1-alpha.
-    - The tor_tls_server_info_callback unit test no longer crashes when
-      debug-level logging is turned on. Fixes bug 20041; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (time):
-    - Improve overflow checks in tv_udiff and tv_mdiff. Fixes bug 19483;
-      bugfix on all released tor versions.
-    - When computing the difference between two times in milliseconds,
-      we now round to the nearest millisecond correctly. Previously, we
-      could sometimes round in the wrong direction. Fixes bug 19428;
-      bugfix on 0.2.2.2-alpha.
-
-  o Minor bugfixes (Tor2web):
-    - Prevent Tor2web clients from running hidden services: these services
-      are not anonymous due to the one-hop client paths. Fixes bug
-      19678. Patch by teor.
-
-  o Minor bugfixes (user interface):
-    - Display a more accurate number of suppressed messages in the log
-      rate-limiter. Previously, there was a potential integer overflow
-      in the counter. Now, if the number of messages hits a maximum, the
-      rate-limiter doesn't count any further. Fixes bug 19435; bugfix
-      on 0.2.4.11-alpha.
-    - Fix a typo in the passphrase prompt for the ed25519 identity key.
-      Fixes bug 19503; bugfix on 0.2.7.2-alpha.
-
-  o Code simplification and refactoring:
-    - Remove redundant declarations of the MIN macro. Closes
-      ticket 18889.
-    - Rename tor_dup_addr() to tor_addr_to_str_dup() to avoid confusion.
-      Closes ticket 18462; patch from "icanhasaccount".
-    - Split the 600-line directory_handle_command_get function into
-      separate functions for different URL types. Closes ticket 16698.
-
-  o Documentation:
-    - Add module-level internal documentation for 36 C files that
-      previously didn't have a high-level overview. Closes ticket 20385.
-    - Correct the IPv6 syntax in our documentation for the
-      VirtualAddrNetworkIPv6 torrc option. Closes ticket 19743.
-    - Correct the minimum bandwidth value in torrc.sample, and queue a
-      corresponding change for torrc.minimal. Closes ticket 20085.
-    - Fix spelling of "--enable-tor2web-mode" in the manpage. Closes
-      ticket 19153. Patch from "U+039b".
-    - Module-level documentation for several more modules. Closes
-      tickets 19287 and 19290.
-    - Document the --passphrase-fd option in the tor manpage. Fixes bug
-      19504; bugfix on 0.2.7.3-rc.
-    - Document the default PathsNeededToBuildCircuits value that's used
-      by clients when the directory authorities don't set
-      min_paths_for_circs_pct. Fixes bug 20117; bugfix on 0.2.4.10-alpha.
-      Patch by teor, reported by Jesse V.
-    - Fix manual for the User option: it takes a username, not a UID.
-      Fixes bug 19122; bugfix on 0.0.2pre16 (the first version to have
-      a manpage!).
-    - Fix the description of the --passphrase-fd option in the
-      tor-gencert manpage. The option is used to pass the number of a
-      file descriptor to read the passphrase from, not to read the file
-      descriptor from. Fixes bug 19505; bugfix on 0.2.0.20-alpha.
-
-  o Removed code:
-    - We no longer include the (dead, deprecated) bufferevent code in
-      Tor. Closes ticket 19450. Based on a patch from "U+039b".
-
-  o Removed features:
-    - Remove support for "GET /tor/bytes.txt" DirPort request, and
-      "GETINFO dir-usage" controller request, which were only available
-      via a compile-time option in Tor anyway. Feature was added in
-      0.2.2.1-alpha. Resolves ticket 19035.
-    - There is no longer a compile-time option to disable support for
-      TransPort. (If you don't want TransPort, just don't use it.) Patch
-      from "U+039b". Closes ticket 19449.
-
-  o Testing:
-    - Run more workqueue tests as part of "make check". These had
-      previously been implemented, but you needed to know special
-      command-line options to enable them.
-    - We now have unit tests for our code to reject zlib "compression
-      bombs". (Fortunately, the code works fine.)
-
-
-Changes in version 0.2.8.11 - 2016-12-08
-  Tor 0.2.8.11 backports fixes for additional portability issues that
-  could prevent Tor from building correctly on OSX Sierra, or with
-  OpenSSL 1.1. Affected users should upgrade; others can safely stay
-  with 0.2.8.10.
-
-  o Minor bugfixes (portability):
-    - Avoid compilation errors when building on OSX Sierra. Sierra began
-      to support the getentropy() and clock_gettime() APIs, but created
-      a few problems in doing so. Tor 0.2.9 has a more thorough set of
-      workarounds; in 0.2.8, we are just using the /dev/urandom and mach
-      monotonic time interfaces. Fixes bug 20865. Bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (portability, backport from 0.2.9.5-alpha):
-    - Fix compilation with OpenSSL 1.1 and less commonly-used CPU
-      architectures. Closes ticket 20588.
-
-
-Changes in version 0.2.8.10 - 2016-12-02
-  Tor 0.2.8.10 backports a fix for a bug that would sometimes make clients
-  unusable after they left standby mode. It also backports fixes for
-  a few portability issues and a small but problematic memory leak.
-
-  o Major bugfixes (client reliability, backport from 0.2.9.5-alpha):
-    - When Tor leaves standby because of a new application request, open
-      circuits as needed to serve that request. Previously, we would
-      potentially wait a very long time. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Major bugfixes (client performance, backport from 0.2.9.5-alpha):
-    - Clients now respond to new application stream requests immediately
-      when they arrive, rather than waiting up to one second before
-      starting to handle them. Fixes part of bug 19969; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (portability, backport from 0.2.9.6-rc):
-    - Work around a bug in the OSX 10.12 SDK that would prevent us from
-      successfully targeting earlier versions of OSX. Resolves
-      ticket 20235.
-
-  o Minor bugfixes (portability, backport from 0.2.9.5-alpha):
-    - Fix implicit conversion warnings under OpenSSL 1.1. Fixes bug
-      20551; bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (relay, backport from 0.2.9.5-alpha):
-    - Work around a memory leak in OpenSSL 1.1 when encoding public
-      keys. Fixes bug 20553; bugfix on 0.0.2pre8.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the November 3 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.8.9 - 2016-10-17
-  Tor 0.2.8.9 backports a fix for a security hole in previous versions
-  of Tor that would allow a remote attacker to crash a Tor client,
-  hidden service, relay, or authority. All Tor users should upgrade to
-  this version, or to 0.2.9.4-alpha. Patches will be released for older
-  versions of Tor.
-
-  o Major features (security fixes, also in 0.2.9.4-alpha):
-    - Prevent a class of security bugs caused by treating the contents
-      of a buffer chunk as if they were a NUL-terminated string. At
-      least one such bug seems to be present in all currently used
-      versions of Tor, and would allow an attacker to remotely crash
-      most Tor instances, especially those compiled with extra compiler
-      hardening. With this defense in place, such bugs can't crash Tor,
-      though we should still fix them as they occur. Closes ticket
-      20384 (TROVE-2016-10-001).
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 4 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.8.8 - 2016-09-23
-  Tor 0.2.8.8 fixes two crash bugs present in previous versions of the
-  0.2.8.x series. Relays running 0.2.8.x should upgrade, as should users
-  who select public relays as their bridges.
-
-  o Major bugfixes (crash):
-    - Fix a complicated crash bug that could affect Tor clients
-      configured to use bridges when replacing a networkstatus consensus
-      in which one of their bridges was mentioned. OpenBSD users saw
-      more crashes here, but all platforms were potentially affected.
-      Fixes bug 20103; bugfix on 0.2.8.2-alpha.
-
-  o Major bugfixes (relay, OOM handler):
-    - Fix a timing-dependent assertion failure that could occur when we
-      tried to flush from a circuit after having freed its cells because
-      of an out-of-memory condition. Fixes bug 20203; bugfix on
-      0.2.8.1-alpha. Thanks to "cypherpunks" for help diagnosing
-      this one.
-
-  o Minor feature (fallback directories):
-    - Remove broken fallbacks from the hard-coded fallback directory
-      list. Closes ticket 20190; patch by teor.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the September 6 2016 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.8.7 - 2016-08-24
-  Tor 0.2.8.7 fixes an important bug related to the ReachableAddresses
-  option in 0.2.8.6, and replaces a retiring bridge authority. Everyone
-  who sets the ReachableAddresses option, and all bridges, are strongly
-  encouraged to upgrade.
-
-  o Directory authority changes:
-    - The "Tonga" bridge authority has been retired; the new bridge
-      authority is "Bifroest". Closes tickets 19728 and 19690.
-
-  o Major bugfixes (client, security):
-    - Only use the ReachableAddresses option to restrict the first hop
-      in a path. In earlier versions of 0.2.8.x, it would apply to
-      every hop in the path, with a possible degradation in anonymity
-      for anyone using an uncommon ReachableAddress setting. Fixes bug
-      19973; bugfix on 0.2.8.2-alpha.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 2 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - Remove an inappropriate "inline" in tortls.c that was causing
-      warnings on older versions of GCC. Fixes bug 19903; bugfix
-      on 0.2.8.1-alpha.
-
-  o Minor bugfixes (fallback directories):
-    - Avoid logging a NULL string pointer when loading fallback
-      directory information. Fixes bug 19947; bugfix on 0.2.4.7-alpha
-      and 0.2.8.1-alpha. Report and patch by "rubiate".
-
-
-Changes in version 0.2.8.6 - 2016-08-02
-
-  Tor 0.2.8.6 is the first stable version of the Tor 0.2.8 series.
-
-  The Tor 0.2.8 series improves client bootstrapping performance,
-  completes the authority-side implementation of improved identity
-  keys for relays, and includes numerous bugfixes and performance
-  improvements throughout the program. This release continues to
-  improve the coverage of Tor's test suite.  For a full list of
-  changes since Tor 0.2.7, see the ReleaseNotes file.
-
-  Below is a list of the changes since Tor 0.2.7.
-
-  o New system requirements:
-    - Tor no longer attempts to support platforms where the "time_t"
-      type is unsigned. (To the best of our knowledge, only OpenVMS does
-      this, and Tor has never actually built on OpenVMS.) Closes
-      ticket 18184.
-    - Tor no longer supports versions of OpenSSL with a broken
-      implementation of counter mode. (This bug was present in OpenSSL
-      1.0.0, and was fixed in OpenSSL 1.0.0a.) Tor still detects, but no
-      longer runs with, these versions.
-    - Tor now uses Autoconf version 2.63 or later, and Automake 1.11 or
-      later (released in 2008 and 2009 respectively). If you are
-      building Tor from the git repository instead of from the source
-      distribution, and your tools are older than this, you will need to
-      upgrade. Closes ticket 17732.
-
-  o Directory authority changes:
-    - Update the V3 identity key for the dannenberg directory authority:
-      it was changed on 18 November 2015. Closes task 17906. Patch
-      by teor.
-    - Urras is no longer a directory authority. Closes ticket 19271.
-
-  o Major features (directory system):
-    - Include a trial list of default fallback directories, based on an
-      opt-in survey of suitable relays. Doing this should make clients
-      bootstrap more quickly and reliably, and reduce the load on the
-      directory authorities. Closes ticket 15775. Patch by teor.
-      Candidates identified using an OnionOO script by weasel, teor,
-      gsathya, and karsten.
-    - Previously only relays that explicitly opened a directory port
-      (DirPort) accepted directory requests from clients. Now all
-      relays, with and without a DirPort, accept and serve tunneled
-      directory requests that they receive through their ORPort. You can
-      disable this behavior using the new DirCache option. Closes
-      ticket 12538.
-    - When bootstrapping multiple consensus downloads at a time, use the
-      first one that starts downloading, and close the rest. This
-      reduces failures when authorities or fallback directories are slow
-      or down. Together with the code for feature 15775, this feature
-      should reduces failures due to fallback churn. Implements ticket
-      4483. Patch by teor. Implements IPv4 portions of proposal 210 by
-      mikeperry and teor.
-
-  o Major features (security, Linux):
-    - When Tor starts as root on Linux and is told to switch user ID, it
-      can now retain the capability to bind to low ports. By default,
-      Tor will do this only when it's switching user ID and some low
-      ports have been configured. You can change this behavior with the
-      new option KeepBindCapabilities. Closes ticket 8195.
-
-  o Major bugfixes (client, bootstrapping):
-    - Check if bootstrap consensus downloads are still needed when the
-      linked connection attaches. This prevents tor making unnecessary
-      begindir-style connections, which are the only directory
-      connections tor clients make since the fix for 18483 was merged.
-    - Fix some edge cases where consensus download connections may not
-      have been closed, even though they were not needed. Related to fix
-      for 18809.
-    - Make relays retry consensus downloads the correct number of times,
-      rather than the more aggressive client retry count. Fixes part of
-      ticket 18809.
-
-  o Major bugfixes (dns proxy mode, crash):
-    - Avoid crashing when running as a DNS proxy. Fixes bug 16248;
-      bugfix on 0.2.0.1-alpha. Patch from "cypherpunks".
-
-  o Major bugfixes (ed25519, voting):
-    - Actually enable support for authorities to match routers by their
-      Ed25519 identities. Previously, the code had been written, but
-      some debugging code that had accidentally been left in the
-      codebase made it stay turned off. Fixes bug 17702; bugfix
-      on 0.2.7.2-alpha.
-    - When collating votes by Ed25519 identities, authorities now
-      include a "NoEdConsensus" flag if the ed25519 value (or lack
-      thereof) for a server does not reflect the majority consensus.
-      Related to bug 17668; bugfix on 0.2.7.2-alpha.
-    - When generating a vote with keypinning disabled, never include two
-      entries for the same ed25519 identity. This bug was causing
-      authorities to generate votes that they could not parse when a
-      router violated key pinning by changing its RSA identity but
-      keeping its Ed25519 identity. Fixes bug 17668; fixes part of bug
-      18318. Bugfix on 0.2.7.2-alpha.
-
-  o Major bugfixes (key management):
-    - If OpenSSL fails to generate an RSA key, do not retain a dangling
-      pointer to the previous (uninitialized) key value. The impact here
-      should be limited to a difficult-to-trigger crash, if OpenSSL is
-      running an engine that makes key generation failures possible, or
-      if OpenSSL runs out of memory. Fixes bug 19152; bugfix on
-      0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and
-      Baishakhi Ray.
-
-  o Major bugfixes (security, client, DNS proxy):
-    - Stop a crash that could occur when a client running with DNSPort
-      received a query with multiple address types, and the first
-      address type was not supported. Found and fixed by Scott Dial.
-      Fixes bug 18710; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (security, compilation):
-    - Correctly detect compiler flags on systems where _FORTIFY_SOURCE
-      is predefined. Previously, our use of -D_FORTIFY_SOURCE would
-      cause a compiler warning, thereby making other checks fail, and
-      needlessly disabling compiler-hardening support. Fixes one case of
-      bug 18841; bugfix on 0.2.3.17-beta. Patch from "trudokal".
-    - Repair hardened builds under the clang compiler. Previously, our
-      use of _FORTIFY_SOURCE would conflict with clang's address
-      sanitizer. Fixes bug 14821; bugfix on 0.2.5.4-alpha.
-
-  o Major bugfixes (security, pointers):
-    - Avoid a difficult-to-trigger heap corruption attack when extending
-      a smartlist to contain over 16GB of pointers. Fixes bug 18162;
-      bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely.
-      Reported by Guido Vranken.
-
-  o Major bugfixes (testing):
-    - Fix a bug that would block 'make test-network-all' on systems where
-      IPv6 packets were lost. Fixes bug 19008; bugfix on 0.2.7.3-rc.
-
-  o Major bugfixes (user interface):
-    - Correctly give a warning in the cases where a relay is specified
-      by nickname, and one such relay is found, but it is not officially
-      Named. Fixes bug 19203; bugfix on 0.2.3.1-alpha.
-
-  o Minor features (accounting):
-    - Added two modes to the AccountingRule option: One for limiting
-      only the number of bytes sent ("AccountingRule out"), and one for
-      limiting only the number of bytes received ("AccountingRule in").
-      Closes ticket 15989; patch from "unixninja92".
-
-  o Minor features (bug-resistance):
-    - Make Tor survive errors involving connections without a
-      corresponding event object. Previously we'd fail with an
-      assertion; now we produce a log message. Related to bug 16248.
-    - Use tor_snprintf() and tor_vsnprintf() even in external and low-
-      level code, to harden against accidental failures to NUL-
-      terminate. Part of ticket 17852. Patch from jsturgix. Found
-      with Flawfinder.
-
-  o Minor features (build):
-    - Detect systems with FreeBSD-derived kernels (such as GNU/kFreeBSD)
-      as having possible IPFW support. Closes ticket 18448. Patch from
-      Steven Chamberlain.
-    - Since our build process now uses "make distcheck", we no longer
-      force "make dist" to depend on "make check". Closes ticket 17893;
-      patch from "cypherpunks".
-    - Tor now builds once again with the recent OpenSSL 1.1 development
-      branch (tested against 1.1.0-pre5 and 1.1.0-pre6-dev). We have been
-      tracking OpenSSL 1.1 development as it has progressed, and fixing
-      numerous compatibility issues as they arose. See tickets
-      17549, 17921, 17984, 19499, and 18286.
-    - When building manual pages, set the timezone to "UTC", so that the
-      output is reproducible. Fixes bug 19558; bugfix on 0.2.2.9-alpha.
-      Patch from intrigeri.
-
-  o Minor features (clients):
-    - Make clients, onion services, and bridge relays always use an
-      encrypted begindir connection for directory requests. Resolves
-      ticket 18483. Patch by teor.
-
-  o Minor features (controller):
-    - Add 'GETINFO exit-policy/reject-private/[default,relay]', so
-      controllers can examine the the reject rules added by
-      ExitPolicyRejectPrivate. This makes it easier for stem to display
-      exit policies.
-    - Adds the FallbackDir entries to 'GETINFO config/defaults'. Closes
-      tickets 16774 and 17817. Patch by George Tankersley.
-    - New 'GETINFO hs/service/desc/id/' command to retrieve a hidden
-      service descriptor from a service's local hidden service
-      descriptor cache. Closes ticket 14846.
-
-  o Minor features (crypto):
-    - Add SHA3 and SHAKE support to crypto.c. Closes ticket 17783.
-    - Add SHA512 support to crypto.c. Closes ticket 17663; patch from
-      George Tankersley.
-    - Improve performance when hashing non-multiple of 8 sized buffers,
-      based on Andrew Moon's public domain SipHash-2-4 implementation.
-      Fixes bug 17544; bugfix on 0.2.5.3-alpha.
-    - Validate the hard-coded Diffie-Hellman parameters and ensure that
-      p is a safe prime, and g is a suitable generator. Closes
-      ticket 18221.
-    - When allocating a digest state object, allocate no more space than
-      we actually need. Previously, we would allocate as much space as
-      the state for the largest algorithm would need. This change saves
-      up to 672 bytes per circuit. Closes ticket 17796.
-
-  o Minor features (directory downloads):
-    - Add UseDefaultFallbackDirs, which enables any hard-coded fallback
-      directory mirrors. The default is 1; set it to 0 to disable
-      fallbacks. Implements ticket 17576. Patch by teor.
-    - Wait for busy authorities and fallback directories to become non-
-      busy when bootstrapping. (A similar change was made in 6c443e987d
-      for directory caches chosen from the consensus.) Closes ticket
-      17864; patch by teor.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the July 6 2016 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden service directory):
-    - Streamline relay-side hsdir handling: when relays consider whether
-      to accept an uploaded hidden service descriptor, they no longer
-      check whether they are one of the relays in the network that is
-      "supposed" to handle that descriptor. Implements ticket 18332.
-
-  o Minor features (IPv6):
-    - Add ClientPreferIPv6DirPort, which is set to 0 by default. If set
-      to 1, tor prefers IPv6 directory addresses.
-    - Add ClientUseIPv4, which is set to 1 by default. If set to 0, tor
-      avoids using IPv4 for client OR and directory connections.
-    - Add address policy assume_action support for IPv6 addresses.
-    - Add an argument 'ipv6=address:orport' to the DirAuthority and
-      FallbackDir torrc options, to specify an IPv6 address for an
-      authority or fallback directory. Add hard-coded ipv6 addresses for
-      directory authorities that have them. Closes ticket 17327; patch
-      from Nick Mathewson and teor.
-    - Allow users to configure directory authorities and fallback
-      directory servers with IPv6 addresses and ORPorts. Resolves
-      ticket 6027.
-    - Limit IPv6 mask bits to 128.
-    - Make tor_ersatz_socketpair work on IPv6-only systems. Fixes bug
-      17638; bugfix on 0.0.2pre8. Patch by teor.
-    - Try harder to obey the IP version restrictions "ClientUseIPv4 0",
-      "ClientUseIPv6 0", "ClientPreferIPv6ORPort", and
-      "ClientPreferIPv6DirPort". Closes ticket 17840; patch by teor.
-    - Warn when comparing against an AF_UNSPEC address in a policy, it's
-      almost always a bug. Closes ticket 17863; patch by teor.
-    - routerset_parse now accepts IPv6 literal addresses. Fixes bug
-      17060; bugfix on 0.2.1.3-alpha. Patch by teor.
-
-  o Minor features (Linux seccomp2 sandbox):
-    - Reject attempts to change our Address with "Sandbox 1" enabled.
-      Changing Address with Sandbox turned on would never actually work,
-      but previously it would fail in strange and confusing ways. Found
-      while fixing 18548.
-
-  o Minor features (logging):
-    - When logging to syslog, allow a tag to be added to the syslog
-      identity (the string prepended to every log message). The tag can
-      be configured with SyslogIdentityTag and defaults to none. Setting
-      it to "foo" will cause logs to be tagged as "Tor-foo". Closes
-      ticket 17194.
-
-  o Minor features (portability):
-    - Use timingsafe_memcmp() where available. Closes ticket 17944;
-      patch from .
-
-  o Minor features (relay, address discovery):
-    - Add a family argument to get_interface_addresses_raw() and
-      subfunctions to make network interface address interogation more
-      efficient. Now Tor can specifically ask for IPv4, IPv6 or both
-      types of interfaces from the operating system. Resolves
-      ticket 17950.
-    - When get_interface_address6_list(.,AF_UNSPEC,.) is called and
-      fails to enumerate interface addresses using the platform-specific
-      API, have it rely on the UDP socket fallback technique to try and
-      find out what IP addresses (both IPv4 and IPv6) our machine has.
-      Resolves ticket 17951.
-
-  o Minor features (replay cache):
-    - The replay cache now uses SHA256 instead of SHA1. Implements
-      feature 8961. Patch by teor, issue reported by rransom.
-
-  o Minor features (robustness):
-    - Exit immediately with an error message if the code attempts to use
-      Libevent without having initialized it. This should resolve some
-      frequently-made mistakes in our unit tests. Closes ticket 18241.
-
-  o Minor features (security, clock):
-    - Warn when the system clock appears to move back in time (when the
-      state file was last written in the future). Tor doesn't know that
-      consensuses have expired if the clock is in the past. Patch by
-      teor. Implements ticket 17188.
-
-  o Minor features (security, exit policies):
-    - ExitPolicyRejectPrivate now rejects more private addresses by
-      default. Specifically, it now rejects the relay's outbound bind
-      addresses (if configured), and the relay's configured port
-      addresses (such as ORPort and DirPort). Fixes bug 17027; bugfix on
-      0.2.0.11-alpha. Patch by teor.
-
-  o Minor features (security, memory erasure):
-    - Make memwipe() do nothing when passed a NULL pointer or buffer of
-      zero size. Check size argument to memwipe() for underflow. Fixes
-      bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk",
-      patch by teor.
-    - Set the unused entries in a smartlist to NULL. This helped catch
-      a (harmless) bug, and shouldn't affect performance too much.
-      Implements ticket 17026.
-    - Use SecureMemoryWipe() function to securely clean memory on
-      Windows. Previously we'd use OpenSSL's OPENSSL_cleanse() function.
-      Implements feature 17986.
-    - Use explicit_bzero or memset_s when present. Previously, we'd use
-      OpenSSL's OPENSSL_cleanse() function. Closes ticket 7419; patches
-      from  and .
-
-  o Minor features (security, RNG):
-    - Adjust Tor's use of OpenSSL's RNG APIs so that they absolutely,
-      positively are not allowed to fail. Previously we depended on
-      internal details of OpenSSL's behavior. Closes ticket 17686.
-    - Never use the system entropy output directly for anything besides
-      seeding the PRNG. When we want to generate important keys, instead
-      of using system entropy directly, we now hash it with the PRNG
-      stream. This may help resist certain attacks based on broken OS
-      entropy implementations. Closes part of ticket 17694.
-    - Use modern system calls (like getentropy() or getrandom()) to
-      generate strong entropy on platforms that have them. Closes
-      ticket 13696.
-
-  o Minor features (security, win32):
-    - Set SO_EXCLUSIVEADDRUSE on Win32 to avoid a local port-stealing
-      attack. Fixes bug 18123; bugfix on all tor versions. Patch
-      by teor.
-
-  o Minor features (unix domain sockets):
-    - Add a new per-socket option, RelaxDirModeCheck, to allow creating
-      Unix domain sockets without checking the permissions on the parent
-      directory. (Tor checks permissions by default because some
-      operating systems only check permissions on the parent directory.
-      However, some operating systems do look at permissions on the
-      socket, and tor's default check is unneeded.) Closes ticket 18458.
-      Patch by weasel.
-
-  o Minor features (unix file permissions):
-    - Defer creation of Unix sockets until after setuid. This avoids
-      needing CAP_CHOWN and CAP_FOWNER when using systemd's
-      CapabilityBoundingSet, or chown and fowner when using SELinux.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-    - If any directory created by Tor is marked as group readable, the
-      filesystem group is allowed to be either the default GID or the
-      root user. Allowing root to read the DataDirectory prevents the
-      need for CAP_READ_SEARCH when using systemd's
-      CapabilityBoundingSet, or dac_read_search when using SELinux.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-    - Introduce a new DataDirectoryGroupReadable option. If it is set to
-      1, the DataDirectory will be made readable by the default GID.
-      Implements part of ticket 17562. Patch from Jamie Nguyen.
-
-  o Minor bugfixes (accounting):
-    - The max bandwidth when using 'AccountRule sum' is now correctly
-      logged. Fixes bug 18024; bugfix on 0.2.6.1-alpha. Patch
-      from "unixninja92".
-
-  o Minor bugfixes (assert, portability):
-    - Fix an assertion failure in memarea.c on systems where "long" is
-      shorter than the size of a pointer. Fixes bug 18716; bugfix
-      on 0.2.1.1-alpha.
-
-  o Minor bugfixes (bootstrap):
-    - Consistently use the consensus download schedule for authority
-      certificates. Fixes bug 18816; bugfix on 0.2.4.13-alpha.
-
-  o Minor bugfixes (build):
-    - Avoid spurious failures from configure files related to calling
-      exit(0) in TOR_SEARCH_LIBRARY. Fixes bug 18626; bugfix on
-      0.2.0.1-alpha. Patch from "cypherpunks".
-    - Do not link the unit tests against both the testing and non-
-      testing versions of the static libraries. Fixes bug 18490; bugfix
-      on 0.2.7.1-alpha.
-    - Resolve warnings when building on systems that are concerned with
-      signed char. Fixes bug 18728; bugfix on 0.2.7.2-alpha
-      and 0.2.6.1-alpha.
-    - Silence spurious clang-scan warnings in the ed25519_donna code by
-      explicitly initializing some objects. Fixes bug 18384; bugfix on
-      0.2.7.2-alpha. Patch by teor.
-    - When libscrypt.h is found, but no libscrypt library can be linked,
-      treat libscrypt as absent. Fixes bug 19161; bugfix
-      on 0.2.6.1-alpha.
-    - Cause the unit tests to compile correctly on mingw64 versions that
-      lack sscanf. Fixes bug 19213; bugfix on 0.2.7.1-alpha.
-    - Don't try to use the pthread_condattr_setclock() function unless
-      it actually exists. Fixes compilation on NetBSD-6.x. Fixes bug
-      17819; bugfix on 0.2.6.3-alpha.
-    - Fix backtrace compilation on FreeBSD. Fixes bug 17827; bugfix
-      on 0.2.5.2-alpha.
-    - Fix search for libevent libraries on OpenBSD (and other systems
-      that install libevent 1 and libevent 2 in parallel). Fixes bug
-      16651; bugfix on 0.1.0.7-rc. Patch from "rubiate".
-    - Isolate environment variables meant for tests from the rest of the
-      build system. Fixes bug 17818; bugfix on 0.2.7.3-rc.
-    - Mark all object files that include micro-revision.i as depending
-      on it, so as to make parallel builds more reliable. Fixes bug
-      17826; bugfix on 0.2.5.1-alpha.
-    - Remove config.log only from make distclean, not from make clean.
-      Fixes bug 17924; bugfix on 0.2.4.1-alpha.
-    - Replace usage of 'INLINE' with 'inline'. Fixes bug 17804; bugfix
-      on 0.0.2pre8.
-    - Remove an #endif from configure.ac so that we correctly detect the
-      presence of in6_addr.s6_addr32. Fixes bug 17923; bugfix
-      on 0.2.0.13-alpha.
-
-  o Minor bugfixes (client, bootstrap):
-    - Count receipt of new microdescriptors as progress towards
-      bootstrapping. Previously, with EntryNodes set, Tor might not
-      successfully repopulate the guard set on bootstrapping. Fixes bug
-      16825; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (code correctness):
-    - Fix a bad memory handling bug that would occur if we had queued a
-      cell on a channel's incoming queue. Fortunately, we can't actually
-      queue a cell like that as our code is constructed today, but it's
-      best to avoid this kind of error, even if there isn't any code
-      that triggers it today. Fixes bug 18570; bugfix on 0.2.4.4-alpha.
-    - Assert that allocated memory held by the reputation code is freed
-      according to its internal counters. Fixes bug 17753; bugfix
-      on 0.1.1.1-alpha.
-    - Assert when the TLS contexts fail to initialize. Fixes bug 17683;
-      bugfix on 0.0.6.
-    - Update to the latest version of Trunnel, which tries harder to
-      avoid generating code that can invoke memcpy(p,NULL,0). Bug found
-      by clang address sanitizer. Fixes bug 18373; bugfix
-      on 0.2.7.2-alpha.
-    - When closing an entry connection, generate a warning if we should
-      have sent an end cell for it but we haven't. Fixes bug 17876;
-      bugfix on 0.2.3.2-alpha.
-
-  o Minor bugfixes (configuration):
-    - Fix a tiny memory leak when parsing a port configuration ending in
-      ":auto". Fixes bug 18374; bugfix on 0.2.3.3-alpha.
-
-  o Minor bugfixes (containers):
-    - If we somehow attempt to construct a heap with more than
-      1073741822 elements, avoid an integer overflow when maintaining
-      the heap property. Fixes bug 18296; bugfix on 0.1.2.1-alpha.
-
-  o Minor bugfixes (controller, microdescriptors):
-    - Make GETINFO dir/status-vote/current/consensus conform to the
-      control specification by returning "551 Could not open cached
-      consensus..." when not caching consensuses. Fixes bug 18920;
-      bugfix on 0.2.2.6-alpha.
-
-  o Minor bugfixes (crypto):
-    - Check the return value of HMAC() and assert on failure. Fixes bug
-      17658; bugfix on 0.2.3.6-alpha. Patch by teor.
-
-  o Minor bugfixes (directories):
-    - When fetching extrainfo documents, compare their SHA256 digests
-      and Ed25519 signing key certificates with the routerinfo that led
-      us to fetch them, rather than with the most recent routerinfo.
-      Otherwise we generate many spurious warnings about mismatches.
-      Fixes bug 17150; bugfix on 0.2.7.2-alpha.
-    - When generating a URL for a directory server on an IPv6 address,
-      wrap the IPv6 address in square brackets. Fixes bug 18051; bugfix
-      on 0.2.3.9-alpha. Patch from Malek.
-
-  o Minor bugfixes (downloading):
-    - Predict more correctly whether we'll be downloading over HTTP when
-      we determine the maximum length of a URL. This should avoid a
-      "BUG" warning about the Squid HTTP proxy and its URL limits. Fixes
-      bug 19191.
-
-  o Minor bugfixes (exit policies, security):
-    - Refresh an exit relay's exit policy when interface addresses
-      change. Previously, tor only refreshed the exit policy when the
-      configured external address changed. Fixes bug 18208; bugfix on
-      0.2.7.3-rc. Patch by teor.
-
-  o Minor bugfixes (fallback directories):
-    - Mark fallbacks as "too busy" when they return a 503 response,
-      rather than just marking authorities. Fixes bug 17572; bugfix on
-      0.2.4.7-alpha. Patch by teor.
-    - When requesting extrainfo descriptors from a trusted directory
-      server, check whether it is an authority or a fallback directory
-      which supports extrainfo descriptors. Fixes bug 18489; bugfix on
-      0.2.4.7-alpha. Reported by atagar, patch by teor.
-
-  o Minor bugfixes (hidden service, client):
-    - Handle the case where the user makes several fast consecutive
-      requests to the same .onion address. Previously, the first six
-      requests would each trigger a descriptor fetch, each picking a
-      directory (there are 6 overall) and the seventh one would fail
-      because no directories were left, thereby triggering a close on
-      all current directory connections asking for the hidden service.
-      The solution here is to not close the connections if we have
-      pending directory fetches. Fixes bug 15937; bugfix
-      on 0.2.7.1-alpha.
-
-  o Minor bugfixes (hidden service, control port):
-    - Add the onion address to the HS_DESC event for the UPLOADED action
-      both on success or failure. It was previously hardcoded with
-      UNKNOWN. Fixes bug 16023; bugfix on 0.2.7.2-alpha.
-
-  o Minor bugfixes (hidden service, directory):
-    - Bridges now refuse "rendezvous2" (hidden service descriptor)
-      publish attempts. Suggested by ticket 18332.
-
-  o Minor bugfixes (IPv6):
-    - Update the limits in max_dl_per_request for IPv6 address length.
-      Fixes bug 17573; bugfix on 0.2.1.5-alpha.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Allow more syscalls when running with "Sandbox 1" enabled:
-      sysinfo, getsockopt(SO_SNDBUF), and setsockopt(SO_SNDBUFFORCE). On
-      some systems, these are required for Tor to start. Fixes bug
-      18397; bugfix on 0.2.5.1-alpha. Patch from Daniel Pinto.
-    - Allow IPPROTO_UDP datagram sockets when running with "Sandbox 1",
-      so that get_interface_address6_via_udp_socket_hack() can work.
-      Fixes bug 19660; bugfix on 0.2.5.1-alpha.
-    - Allow the setrlimit syscall, and the prlimit and prlimit64
-      syscalls, which some libc implementations use under the hood.
-      Fixes bug 15221; bugfix on 0.2.5.1-alpha.
-    - Avoid a 10-second delay when starting as a client with "Sandbox 1"
-      enabled and no DNS resolvers configured. This should help TAILS
-      start up faster. Fixes bug 18548; bugfix on 0.2.5.1-alpha.
-    - Fix a crash when using offline master ed25519 keys with the Linux
-      seccomp2 sandbox enabled. Fixes bug 17675; bugfix on 0.2.7.3-rc.
-    - Allow statistics to be written to disk when "Sandbox 1" is
-      enabled. Fixes bugs 19556 and 19957; bugfix on 0.2.5.1-alpha and
-      0.2.6.1-alpha respectively.
-
-  o Minor bugfixes (logging):
-    - In log messages that include a function name, use __FUNCTION__
-      instead of __PRETTY_FUNCTION__. In GCC, these are synonymous, but
-      with clang __PRETTY_FUNCTION__ has extra information we don't
-      need. Fixes bug 16563; bugfix on 0.0.2pre8. Fix by Tom van
-      der Woerdt.
-    - Remove needless quotes from a log message about unparseable
-      addresses. Fixes bug 17843; bugfix on 0.2.3.3-alpha.
-    - Scrub service name in "unrecognized service ID" log messages.
-      Fixes bug 18600; bugfix on 0.2.4.11-alpha.
-    - When logging information about an unparsable networkstatus vote or
-      consensus, do not say "vote" when we mean consensus. Fixes bug
-      18368; bugfix on 0.2.0.8-alpha.
-    - When we can't generate a signing key because OfflineMasterKey is
-      set, do not imply that we should have been able to load it. Fixes
-      bug 18133; bugfix on 0.2.7.2-alpha.
-    - When logging a malformed hostname received through socks4, scrub
-      it if SafeLogging says we should. Fixes bug 17419; bugfix
-      on 0.1.1.16-rc.
-
-  o Minor bugfixes (memory safety):
-    - Avoid freeing an uninitialized pointer when opening a socket fails
-      in get_interface_addresses_ioctl(). Fixes bug 18454; bugfix on
-      0.2.3.11-alpha. Reported by toralf and "cypherpunks", patch
-      by teor.
-    - Fix a memory leak in "tor --list-fingerprint". Fixes part of bug
-      18672; bugfix on 0.2.5.1-alpha.
-    - Fix a memory leak in tor-gencert. Fixes part of bug 18672; bugfix
-      on 0.2.0.1-alpha.
-
-  o Minor bugfixes (pluggable transports):
-    - Avoid reporting a spurious error when we decide that we don't need
-      to terminate a pluggable transport because it has already exited.
-      Fixes bug 18686; bugfix on 0.2.5.5-alpha.
-
-  o Minor bugfixes (pointer arithmetic):
-    - Fix a bug in memarea_alloc() that could have resulted in remote
-      heap write access, if Tor had ever passed an unchecked size to
-      memarea_alloc(). Fortunately, all the sizes we pass to
-      memarea_alloc() are pre-checked to be less than 128 kilobytes.
-      Fixes bug 19150; bugfix on 0.2.1.1-alpha. Bug found by
-      Guido Vranken.
-
-  o Minor bugfixes (private directory):
-    - Prevent a race condition when creating private directories. Fixes
-      part of bug 17852; bugfix on 0.0.2pre13. Part of ticket 17852.
-      Patch from jsturgix. Found with Flawfinder.
-
-  o Minor bugfixes (relays):
-    - Check that both the ORPort and DirPort (if present) are reachable
-      before publishing a relay descriptor. Otherwise, relays publish a
-      descriptor with DirPort 0 when the DirPort reachability test takes
-      longer than the ORPort reachability test. Fixes bug 18050; bugfix
-      on 0.1.0.1-rc. Reported by "starlight", patch by teor.
-    - Resolve some edge cases where we might launch an ORPort
-      reachability check even when DisableNetwork is set. Noticed while
-      fixing bug 18616; bugfix on 0.2.3.9-alpha.
-
-  o Minor bugfixes (relays, hidden services):
-    - Refuse connection requests to private OR addresses unless
-      ExtendAllowPrivateAddresses is set. Previously, tor would connect,
-      then refuse to send any cells to a private address. Fixes bugs
-      17674 and 8976; bugfix on 0.2.3.21-rc. Patch by teor.
-
-  o Minor bugfixes (security, hidden services):
-    - Prevent hidden services connecting to client-supplied rendezvous
-      addresses that are reserved as internal or multicast. Fixes bug
-      8976; bugfix on 0.2.3.21-rc. Patch by dgoulet and teor.
-
-  o Minor bugfixes (statistics):
-    - Consistently check for overflow in round_*_to_next_multiple_of
-      functions, and add unit tests with additional and maximal values.
-      Fixes part of bug 13192; bugfix on 0.2.2.1-alpha.
-    - Handle edge cases in the laplace functions: avoid division by
-      zero, avoid taking the log of zero, and silence clang type
-      conversion warnings using round and trunc. Add unit tests for edge
-      cases with maximal values. Fixes part of bug 13192; bugfix
-      on 0.2.6.2-alpha.
-    - We now include consensus downloads via IPv6 in our directory-
-      request statistics. Fixes bug 18460; bugfix on 0.2.3.14-alpha.
-
-  o Minor bugfixes (test networks, IPv6):
-    - Allow internal IPv6 addresses in descriptors in test networks.
-      Fixes bug 17153; bugfix on 0.2.3.16-alpha. Patch by teor, reported
-      by karsten.
-
-  o Minor bugfixes (testing):
-    - Check the full results of SHA256 and SHA512 digests in the unit
-      tests. Bugfix on 0.2.2.4-alpha. Patch by teor.
-    - Fix a memory leak in the ntor test. Fixes bug 17778; bugfix
-      on 0.2.4.8-alpha.
-    - Fix a small memory leak that would occur when the
-      TestingEnableCellStatsEvent option was turned on. Fixes bug 18673;
-      bugfix on 0.2.5.2-alpha.
-    - Make unit tests pass on IPv6-only systems, and systems without
-      localhost addresses (like some FreeBSD jails). Fixes bug 17632;
-      bugfix on 0.2.7.3-rc. Patch by teor.
-    - The test for log_heartbeat was incorrectly failing in timezones
-      with non-integer offsets. Instead of comparing the end of the time
-      string against a constant, compare it to the output of
-      format_local_iso_time when given the correct input. Fixes bug
-      18039; bugfix on 0.2.5.4-alpha.
-    - We no longer disable assertions in the unit tests when coverage is
-      enabled. Instead, we require you to say --disable-asserts-in-tests
-      to the configure script if you need assertions disabled in the
-      unit tests (for example, if you want to perform branch coverage).
-      Fixes bug 18242; bugfix on 0.2.7.1-alpha.
-
-  o Minor bugfixes (time handling):
-    - When correcting a corrupt 'struct tm' value, fill in the tm_wday
-      field. Otherwise, our unit tests crash on Windows. Fixes bug
-      18977; bugfix on 0.2.2.25-alpha.
-    - Avoid overflow in tor_timegm when parsing dates in and after 2038
-      on platforms with 32-bit time_t. Fixes bug 18479; bugfix on
-      0.0.2pre14. Patch by teor.
-
-  o Minor bugfixes (tor-gencert):
-    - Correctly handle the case where an authority operator enters a
-      passphrase but sends an EOF before sending a newline. Fixes bug
-      17443; bugfix on 0.2.0.20-rc. Found by junglefowl.
-
-  o Code simplification and refactoring:
-    - Clean up a little duplicated code in
-      crypto_expand_key_material_TAP(). Closes ticket 17587; patch
-      from "pfrankw".
-    - Decouple the list of streams waiting to be attached to circuits
-      from the overall connection list. This change makes it possible to
-      attach streams quickly while simplifying Tor's callgraph and
-      avoiding O(N) scans of the entire connection list. Closes
-      ticket 17590.
-    - Extract the more complicated parts of circuit_mark_for_close()
-      into a new function that we run periodically before circuits are
-      freed. This change removes more than half of the functions
-      currently in the "blob". Closes ticket 17218.
-    - Move logging of redundant policy entries in
-      policies_parse_exit_policy_internal into its own function. Closes
-      ticket 17608; patch from "juce".
-    - Quote all the string interpolations in configure.ac -- even those
-      which we are pretty sure can't contain spaces. Closes ticket
-      17744. Patch from zerosion.
-    - Remove code for configuring OpenSSL dynamic locks; OpenSSL doesn't
-      use them. Closes ticket 17926.
-    - Remove specialized code for non-inplace AES_CTR. 99% of our AES is
-      inplace, so there's no need to have a separate implementation for
-      the non-inplace code. Closes ticket 18258. Patch from Malek.
-    - Simplify return types for some crypto functions that can't
-      actually fail. Patch from Hassan Alsibyani. Closes ticket 18259.
-    - When a direct directory request fails immediately on launch,
-      instead of relaunching that request from inside the code that
-      launches it, instead mark the connection for teardown. This change
-      simplifies Tor's callback and prevents the directory-request
-      launching code from invoking itself recursively. Closes
-      ticket 17589.
-
-  o Documentation:
-    - Add a description of the correct use of the '--keygen' command-
-      line option. Closes ticket 17583; based on text by 's7r'.
-    - Change build messages to refer to "Fedora" instead of "Fedora
-      Core", and "dnf" instead of "yum". Closes tickets 18459 and 18426.
-      Patches from "icanhasaccount" and "cypherpunks".
-    - Document the contents of the 'datadir/keys' subdirectory in the
-      manual page. Closes ticket 17621.
-    - Document the minimum HeartbeatPeriod value. Closes ticket 15638.
-    - Explain actual minima for BandwidthRate. Closes ticket 16382.
-    - Fix a minor formatting typo in the manpage. Closes ticket 17791.
-    - Mention torspec URL in the manpage and point the reader to it
-      whenever we mention a document that belongs in torspce. Fixes
-      issue 17392.
-    - Stop recommending use of nicknames to identify relays in our
-      MapAddress documentation. Closes ticket 18312.
-
-  o Removed features:
-    - Remove client-side support for connecting to Tor relays running
-      versions of Tor before 0.2.3.6-alpha. These relays didn't support
-      the v3 TLS handshake protocol, and are no longer allowed on the
-      Tor network. Implements the client side of ticket 11150. Based on
-      patches by Tom van der Woerdt.
-    - We no longer maintain an internal freelist in memarea.c.
-      Allocators should be good enough to make this code unnecessary,
-      and it's doubtful that it ever had any performance benefit.
-
-  o Testing:
-    - Add unit tests to check for common RNG failure modes, such as
-      returning all zeroes, identical values, or incrementing values
-      (OpenSSL's rand_predictable feature). Patch by teor.
-    - Always test both ed25519 backends, so that we can be sure that our
-      batch-open replacement code works. Part of ticket 16794.
-    - Cover dns_resolve_impl() in dns.c with unit tests. Implements a
-      portion of ticket 16831.
-    - Fix several warnings from clang's address sanitizer produced in
-      the unit tests.
-    - Log more information when the backtrace tests fail. Closes ticket
-      17892. Patch from "cypherpunks."
-    - More unit tests for compat_libevent.c, procmon.c, tortls.c,
-      util_format.c, directory.c, and options_validate.c. Closes tickets
-      17075, 17082, 17084, 17003, and 17076 respectively. Patches from
-      Ola Bini.
-    - Treat backtrace test failures as expected on FreeBSD until we
-      solve bug 17808. Closes ticket 18204.
-    - Unit tests for directory_handle_command_get. Closes ticket 17004.
-      Patch from Reinaldo de Souza Jr.
-
-
-Changes in version 0.2.7.6 - 2015-12-10
-  Tor version 0.2.7.6 fixes a major bug in entry guard selection, as
-  well as a minor bug in hidden service reliability.
-
-  o Major bugfixes (guard selection):
-    - Actually look at the Guard flag when selecting a new directory
-      guard. When we implemented the directory guard design, we
-      accidentally started treating all relays as if they have the Guard
-      flag during guard selection, leading to weaker anonymity and worse
-      performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered
-      by Mohsen Imani.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the December 1 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (compilation):
-    - When checking for net/pfvar.h, include netinet/in.h if possible.
-      This fixes transparent proxy detection on OpenBSD. Fixes bug
-      17551; bugfix on 0.1.2.1-alpha. Patch from "rubiate".
-    - Fix a compilation warning with Clang 3.6: Do not check the
-      presence of an address which can never be NULL. Fixes bug 17781.
-
-  o Minor bugfixes (correctness):
-    - When displaying an IPv6 exit policy, include the mask bits
-      correctly even when the number is greater than 31. Fixes bug
-      16056; bugfix on 0.2.4.7-alpha. Patch from "gturner".
-    - The wrong list was used when looking up expired intro points in a
-      rend service object, causing what we think could be reachability
-      issues for hidden services, and triggering a BUG log. Fixes bug
-      16702; bugfix on 0.2.7.2-alpha.
-    - Fix undefined behavior in the tor_cert_checksig function. Fixes
-      bug 17722; bugfix on 0.2.7.2-alpha.
-
-
-Changes in version 0.2.7.5 - 2015-11-20
-  The Tor 0.2.7 release series is dedicated to the memory of Tor user
-  and privacy advocate Caspar Bowden (1961-2015). Caspar worked
-  tirelessly to advocate human rights regardless of national borders,
-  and oppose the encroachments of mass surveillance. He opposed national
-  exceptionalism, he brought clarity to legal and policy debates, he
-  understood and predicted the impact of mass surveillance on the world,
-  and he laid the groundwork for resisting it. While serving on the Tor
-  Project's board of directors, he brought us his uncompromising focus
-  on technical excellence in the service of humankind. Caspar was an
-  inimitable force for good and a wonderful friend. He was kind,
-  humorous, generous, gallant, and believed we should protect one
-  another without exception. We honor him here for his ideals, his
-  efforts, and his accomplishments. Please honor his memory with works
-  that would make him proud.
-
-  Tor 0.2.7.5 is the first stable release in the Tor 0.2.7 series.
-
-  The 0.2.7 series adds a more secure identity key type for relays,
-  improves cryptography performance, resolves several longstanding
-  hidden-service performance issues, improves controller support for
-  hidden services, and includes small bugfixes and performance
-  improvements throughout the program. This release series also includes
-  more tests than before, and significant simplifications to which parts
-  of Tor invoke which others. For a full list of changes, see below.
-
-  o New system requirements:
-    - Tor no longer includes workarounds to support Libevent versions
-      before 1.3e. Libevent 2.0 or later is recommended. Closes
-      ticket 15248.
-    - Tor no longer supports copies of OpenSSL that are missing support
-      for Elliptic Curve Cryptography. (We began using ECC when
-      available in 0.2.4.8-alpha, for more safe and efficient key
-      negotiation.) In particular, support for at least one of P256 or
-      P224 is now required, with manual configuration needed if only
-      P224 is available. Resolves ticket 16140.
-    - Tor no longer supports versions of OpenSSL before 1.0. (If you are
-      on an operating system that has not upgraded to OpenSSL 1.0 or
-      later, and you compile Tor from source, you will need to install a
-      more recent OpenSSL to link Tor against.) These versions of
-      OpenSSL are still supported by the OpenSSL, but the numerous
-      cryptographic improvements in later OpenSSL releases makes them a
-      clear choice. Resolves ticket 16034.
-
-  o Major features (controller):
-    - Add the ADD_ONION and DEL_ONION commands that allow the creation
-      and management of hidden services via the controller. Closes
-      ticket 6411.
-    - New "GETINFO onions/current" and "GETINFO onions/detached"
-      commands to get information about hidden services created via the
-      controller. Part of ticket 6411.
-    - New HSFETCH command to launch a request for a hidden service
-      descriptor. Closes ticket 14847.
-    - New HSPOST command to upload a hidden service descriptor. Closes
-      ticket 3523. Patch by "DonnchaC".
-
-  o Major features (Ed25519 identity keys, Proposal 220):
-    - Add support for offline encrypted Ed25519 master keys. To use this
-      feature on your tor relay, run "tor --keygen" to make a new master
-      key (or to make a new signing key if you already have a master
-      key). Closes ticket 13642.
-    - All relays now maintain a stronger identity key, using the Ed25519
-      elliptic curve signature format. This master key is designed so
-      that it can be kept offline. Relays also generate an online
-      signing key, and a set of other Ed25519 keys and certificates.
-      These are all automatically regenerated and rotated as needed.
-      Implements part of ticket 12498.
-    - Directory authorities now vote on Ed25519 identity keys along with
-      RSA1024 keys. Implements part of ticket 12498.
-    - Directory authorities track which Ed25519 identity keys have been
-      used with which RSA1024 identity keys, and do not allow them to
-      vary freely. Implements part of ticket 12498.
-    - Microdescriptors now include Ed25519 identity keys. Implements
-      part of ticket 12498.
-    - Add a --newpass option to allow changing or removing the
-      passphrase of an encrypted key with tor --keygen. Implements part
-      of ticket 16769.
-    - Add a new OfflineMasterKey option to tell Tor never to try loading
-      or generating a secret Ed25519 identity key. You can use this in
-      combination with tor --keygen to manage offline and/or encrypted
-      Ed25519 keys. Implements ticket 16944.
-    - On receiving a HUP signal, check to see whether the Ed25519
-      signing key has changed, and reload it if so. Closes ticket 16790.
-    - Significant usability improvements for Ed25519 key management. Log
-      messages are better, and the code can recover from far more
-      failure conditions. Thanks to "s7r" for reporting and diagnosing
-      so many of these!
-
-  o Major features (ECC performance):
-    - Improve the runtime speed of Ed25519 signature verification by
-      using Ed25519-donna's batch verification support. Implements
-      ticket 16533.
-    - Improve the speed of Ed25519 operations and Curve25519 keypair
-      generation when built targeting 32 bit x86 platforms with SSE2
-      available. Implements ticket 16535.
-    - Improve the runtime speed of Ed25519 operations by using the
-      public-domain Ed25519-donna by Andrew M. ("floodyberry").
-      Implements ticket 16467.
-    - Improve the runtime speed of the ntor handshake by using an
-      optimized curve25519 basepoint scalarmult implementation from the
-      public-domain Ed25519-donna by Andrew M. ("floodyberry"), based on
-      ideas by Adam Langley. Implements ticket 9663.
-
-  o Major features (Hidden services):
-    - Hidden services, if using the EntryNodes option, are required to
-      use more than one EntryNode, in order to avoid a guard discovery
-      attack. (This would only affect people who had configured hidden
-      services and manually specified the EntryNodes option with a
-      single entry-node. The impact was that it would be easy to
-      remotely identify the guard node used by such a hidden service.
-      See ticket for more information.) Fixes ticket 14917.
-    - Add the torrc option HiddenServiceNumIntroductionPoints, to
-      specify a fixed number of introduction points. Its maximum value
-      is 10 and default is 3. Using this option can increase a hidden
-      service's reliability under load, at the cost of making it more
-      visible that the hidden service is facing extra load. Closes
-      ticket 4862.
-    - Remove the adaptive algorithm for choosing the number of
-      introduction points, which used to change the number of
-      introduction points (poorly) depending on the number of
-      connections the HS sees. Closes ticket 4862.
-
-  o Major features (onion key cross-certification):
-    - Relay descriptors now include signatures of their own identity
-      keys, made using the TAP and ntor onion keys. These signatures
-      allow relays to prove ownership of their own onion keys. Because
-      of this change, microdescriptors will no longer need to include
-      RSA identity keys. Implements proposal 228; closes ticket 12499.
-
-  o Major bugfixes (client-side privacy, also in 0.2.6.9):
-    - Properly separate out each SOCKSPort when applying stream
-      isolation. The error occurred because each port's session group
-      was being overwritten by a default value when the listener
-      connection was initialized. Fixes bug 16247; bugfix on
-      0.2.6.3-alpha. Patch by "jojelino".
-
-  o Major bugfixes (hidden service clients, stability, also in 0.2.6.10):
-    - Stop refusing to store updated hidden service descriptors on a
-      client. This reverts commit 9407040c59218 (which indeed fixed bug
-      14219, but introduced a major hidden service reachability
-      regression detailed in bug 16381). This is a temporary fix since
-      we can live with the minor issue in bug 14219 (it just results in
-      some load on the network) but the regression of 16381 is too much
-      of a setback. First-round fix for bug 16381; bugfix
-      on 0.2.6.3-alpha.
-
-  o Major bugfixes (hidden services):
-    - Revert commit that made directory authorities assign the HSDir
-      flag to relays without a DirPort; this was bad because such relays
-      can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
-      on 0.2.6.3-alpha.
-    - When cannibalizing a circuit for an introduction point, always
-      extend to the chosen exit node (creating a 4 hop circuit).
-      Previously Tor would use the current circuit exit node, which
-      changed the original choice of introduction point, and could cause
-      the hidden service to skip excluded introduction points or
-      reconnect to a skipped introduction point. Fixes bug 16260; bugfix
-      on 0.1.0.1-rc.
-
-  o Major bugfixes (memory leaks):
-    - Fix a memory leak in ed25519 batch signature checking. Fixes bug
-      17398; bugfix on 0.2.6.1-alpha.
-
-  o Major bugfixes (open file limit):
-    - The open file limit wasn't checked before calling
-      tor_accept_socket_nonblocking(), which would make Tor exceed the
-      limit. Now, before opening a new socket, Tor validates the open
-      file limit just before, and if the max has been reached, return an
-      error. Fixes bug 16288; bugfix on 0.1.1.1-alpha.
-
-  o Major bugfixes (security, correctness):
-    - Fix an error that could cause us to read 4 bytes before the
-      beginning of an openssl string. This bug could be used to cause
-      Tor to crash on systems with unusual malloc implementations, or
-      systems with unusual hardening installed. Fixes bug 17404; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (stability, also in 0.2.6.10):
-    - Stop crashing with an assertion failure when parsing certain kinds
-      of malformed or truncated microdescriptors. Fixes bug 16400;
-      bugfix on 0.2.6.1-alpha. Found by "torkeln"; fix based on a patch
-      by "cypherpunks_backup".
-    - Stop random client-side assertion failures that could occur when
-      connecting to a busy hidden service, or connecting to a hidden
-      service while a NEWNYM is in progress. Fixes bug 16013; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor features (client, SOCKS):
-    - Add GroupWritable and WorldWritable options to unix-socket based
-      SocksPort and ControlPort options. These options apply to a single
-      socket, and override {Control,Socks}SocketsGroupWritable. Closes
-      ticket 15220.
-    - Relax the validation done to hostnames in SOCKS5 requests, and
-      allow a single trailing '.' to cope with clients that pass FQDNs
-      using that syntax to explicitly indicate that the domain name is
-      fully-qualified. Fixes bug 16674; bugfix on 0.2.6.2-alpha.
-    - Relax the validation of hostnames in SOCKS5 requests, allowing the
-      character '_' to appear, in order to cope with domains observed in
-      the wild that are serving non-RFC compliant records. Resolves
-      ticket 16430.
-
-  o Minor features (client-side privacy):
-    - New KeepAliveIsolateSOCKSAuth option to indefinitely extend circuit
-      lifespan when IsolateSOCKSAuth and streams with SOCKS
-      authentication are attached to the circuit. This allows
-      applications like TorBrowser to manage circuit lifetime on their
-      own. Implements feature 15482.
-    - When logging malformed hostnames from SOCKS5 requests, respect
-      SafeLogging configuration. Fixes bug 16891; bugfix on 0.1.1.16-rc.
-
-  o Minor features (clock-jump tolerance):
-    - Recover better when our clock jumps back many hours, like might
-      happen for Tails or Whonix users who start with a very wrong
-      hardware clock, use Tor to discover a more accurate time, and then
-      fix their clock. Resolves part of ticket 8766.
-
-  o Minor features (command-line interface):
-    - Make --hash-password imply --hush to prevent unnecessary noise.
-      Closes ticket 15542. Patch from "cypherpunks".
-    - Print a warning whenever we find a relative file path being used
-      as torrc option. Resolves issue 14018.
-
-  o Minor features (compilation):
-    - Give a warning as early as possible when trying to build with an
-      unsupported OpenSSL version. Closes ticket 16901.
-    - Use C99 variadic macros when the compiler is not GCC. This avoids
-      failing compilations on MSVC, and fixes a log-file-based race
-      condition in our old workarounds. Original patch from Gisle Vanem.
-
-  o Minor features (control protocol):
-    - Support network-liveness GETINFO key and NETWORK_LIVENESS event in
-      the control protocol. Resolves ticket 15358.
-
-  o Minor features (controller):
-    - Add DirAuthority lines for default directory authorities to the
-      output of the "GETINFO config/defaults" command if not already
-      present. Implements ticket 14840.
-    - Controllers can now use "GETINFO hs/client/desc/id/..." to
-      retrieve items from the client's hidden service descriptor cache.
-      Closes ticket 14845.
-    - Implement a new controller command "GETINFO status/fresh-relay-
-      descs" to fetch a descriptor/extrainfo pair that was generated on
-      demand just for the controller's use. Implements ticket 14784.
-
-  o Minor features (directory authorities):
-    - Directory authorities no longer vote against the "Fast", "Stable",
-      and "HSDir" flags just because they were going to vote against
-      "Running": if the consensus turns out to be that the router was
-      running, then the authority's vote should count. Patch from Peter
-      Retzlaff; closes issue 8712.
-
-  o Minor features (directory authorities, security, also in 0.2.6.9):
-    - The HSDir flag given by authorities now requires the Stable flag.
-      For the current network, this results in going from 2887 to 2806
-      HSDirs. Also, it makes it harder for an attacker to launch a sybil
-      attack by raising the effort for a relay to become Stable to
-      require at the very least 7 days, while maintaining the 96 hours
-      uptime requirement for HSDir. Implements ticket 8243.
-
-  o Minor features (DoS-resistance):
-    - Make it harder for attackers to overload hidden services with
-      introductions, by blocking multiple introduction requests on the
-      same circuit. Resolves ticket 15515.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the October 9 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (hidden services):
-    - Add the new options "HiddenServiceMaxStreams" and
-      "HiddenServiceMaxStreamsCloseCircuit" to allow hidden services to
-      limit the maximum number of simultaneous streams per circuit, and
-      optionally tear down the circuit when the limit is exceeded. Part
-      of ticket 16052.
-    - Client now uses an introduction point failure cache to know when
-      to fetch or keep a descriptor in their cache. Previously, failures
-      were recorded implicitly, but not explicitly remembered. Closes
-      ticket 16389.
-    - Relays need to have the Fast flag to get the HSDir flag. As this
-      is being written, we'll go from 2745 HSDirs down to 2342, a ~14%
-      drop. This change should make some attacks against the hidden
-      service directory system harder. Fixes ticket 15963.
-    - Turn on hidden service statistics collection by setting the torrc
-      option HiddenServiceStatistics to "1" by default. (This keeps
-      track only of the fraction of traffic used by hidden services, and
-      the total number of hidden services in existence.) Closes
-      ticket 15254.
-    - To avoid leaking HS popularity, don't cycle the introduction point
-      when we've handled a fixed number of INTRODUCE2 cells but instead
-      cycle it when a random number of introductions is reached, thus
-      making it more difficult for an attacker to find out the amount of
-      clients that have used the introduction point for a specific HS.
-      Closes ticket 15745.
-
-  o Minor features (logging):
-    - Include the Tor version in all LD_BUG log messages, since people
-      tend to cut and paste those into the bugtracker. Implements
-      ticket 15026.
-
-  o Minor features (pluggable transports):
-    - When launching managed pluggable transports on Linux systems,
-      attempt to have the kernel deliver a SIGTERM on tor exit if the
-      pluggable transport process is still running. Resolves
-      ticket 15471.
-    - When launching managed pluggable transports, setup a valid open
-      stdin in the child process that can be used to detect if tor has
-      terminated. The "TOR_PT_EXIT_ON_STDIN_CLOSE" environment variable
-      can be used by implementations to detect this new behavior.
-      Resolves ticket 15435.
-
-  o Minor bugfixes (torrc exit policies):
-    - In each instance above, usage advice is provided to avoid the
-      message. Resolves ticket 16069. Patch by "teor". Fixes part of bug
-      16069; bugfix on 0.2.4.7-alpha.
-    - In torrc, "accept6 *" and "reject6 *" ExitPolicy lines now only
-      produce IPv6 wildcard addresses. Previously they would produce
-      both IPv4 and IPv6 wildcard addresses. Patch by "teor". Fixes part
-      of bug 16069; bugfix on 0.2.4.7-alpha.
-    - When parsing torrc ExitPolicies, we now issue an info-level
-      message when expanding an "accept/reject *" line to include both
-      IPv4 and IPv6 wildcard addresses. Related to ticket 16069.
-    - When parsing torrc ExitPolicies, we now warn for a number of cases
-      where the user's intent is likely to differ from Tor's actual
-      behavior. These include: using an IPv4 address with an accept6 or
-      reject6 line; using "private" on an accept6 or reject6 line; and
-      including any ExitPolicy lines after accept *:* or reject *:*.
-      Related to ticket 16069.
-
-  o Minor bugfixes (command-line interface):
-    - When "--quiet" is provided along with "--validate-config", do not
-      write anything to stdout on success. Fixes bug 14994; bugfix
-      on 0.2.3.3-alpha.
-    - When complaining about bad arguments to "--dump-config", use
-      stderr, not stdout.
-    - Print usage information for --dump-config when it is used without
-      an argument. Also, fix the error message to use different wording
-      and add newline at the end. Fixes bug 15541; bugfix
-      on 0.2.5.1-alpha.
-
-  o Minor bugfixes (compilation):
-    - Fix compilation of sandbox.c with musl-libc. Fixes bug 17347;
-      bugfix on 0.2.5.1-alpha. Patch from 'jamestk'.
-    - Repair compilation with the most recent (unreleased, alpha)
-      vesions of OpenSSL 1.1. Fixes part of ticket 17237.
-
-  o Minor bugfixes (compilation, also in 0.2.6.9):
-    - Build with --enable-systemd correctly when libsystemd is
-      installed, but systemd is not. Fixes bug 16164; bugfix on
-      0.2.6.3-alpha. Patch from Peter Palfrader.
-
-  o Minor bugfixes (configuration, unit tests):
-    - Only add the default fallback directories when the DirAuthorities,
-      AlternateDirAuthority, and FallbackDir directory config options
-      are set to their defaults. The default fallback directory list is
-      currently empty, this fix will only change tor's behavior when it
-      has default fallback directories. Includes unit tests for
-      consider_adding_dir_servers(). Fixes bug 15642; bugfix on
-      90f6071d8dc0 in 0.2.4.7-alpha. Patch by "teor".
-
-  o Minor bugfixes (controller):
-    - Add the descriptor ID in each HS_DESC control event. It was
-      missing, but specified in control-spec.txt. Fixes bug 15881;
-      bugfix on 0.2.5.2-alpha.
-
-  o Minor bugfixes (correctness):
-    - For correctness, avoid modifying a constant string in
-      handle_control_postdescriptor. Fixes bug 15546; bugfix
-      on 0.1.1.16-rc.
-    - Remove side-effects from tor_assert() calls. This was harmless,
-      because we never disable assertions, but it is bad style and
-      unnecessary. Fixes bug 15211; bugfix on 0.2.5.5, 0.2.2.36,
-      and 0.2.0.10.
-    - When calling channel_free_list(), avoid calling smartlist_remove()
-      while inside a FOREACH loop. This partially reverts commit
-      17356fe7fd96af where the correct SMARTLIST_DEL_CURRENT was
-      incorrectly removed. Fixes bug 16924; bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (crypto error-handling, also in 0.2.6.10):
-    - Check for failures from crypto_early_init, and refuse to continue.
-      A previous typo meant that we could keep going with an
-      uninitialized crypto library, and would have OpenSSL initialize
-      its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced
-      when implementing ticket 4900. Patch by "teor".
-
-  o Minor bugfixes (hidden service):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-    - Remove an extraneous newline character from the end of hidden
-      service descriptors. Fixes bug 15296; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Use the sandbox in tor_open_cloexec whether or not O_CLOEXEC is
-      defined. Patch by "teor". Fixes bug 16515; bugfix on 0.2.3.1-alpha.
-    - Allow bridge authorities to run correctly under the seccomp2
-      sandbox. Fixes bug 16964; bugfix on 0.2.5.1-alpha.
-    - Add the "hidserv-stats" filename to our sandbox filter for the
-      HiddenServiceStatistics option to work properly. Fixes bug 17354;
-      bugfix on 0.2.6.2-alpha. Patch from David Goulet.
-
-  o Minor bugfixes (Linux seccomp2 sandbox, also in 0.2.6.10):
-    - Allow pipe() and pipe2() syscalls in the seccomp2 sandbox: we need
-      these when eventfd2() support is missing. Fixes bug 16363; bugfix
-      on 0.2.6.3-alpha. Patch from "teor".
-
-  o Minor bugfixes (Linux seccomp2 sandbox, also in 0.2.6.9):
-    - Allow systemd connections to work with the Linux seccomp2 sandbox
-      code. Fixes bug 16212; bugfix on 0.2.6.2-alpha. Patch by
-      Peter Palfrader.
-    - Fix sandboxing to work when running as a relay, by allowing the
-      renaming of secret_id_key, and allowing the eventfd2 and futex
-      syscalls. Fixes bug 16244; bugfix on 0.2.6.1-alpha. Patch by
-      Peter Palfrader.
-
-  o Minor bugfixes (logging):
-    - When building Tor under Clang, do not include an extra set of
-      parentheses in log messages that include function names. Fixes bug
-      15269; bugfix on every released version of Tor when compiled with
-      recent enough Clang.
-
-  o Minor bugfixes (network):
-    - When attempting to use fallback technique for network interface
-      lookup, disregard loopback and multicast addresses since they are
-      unsuitable for public communications.
-
-  o Minor bugfixes (open file limit):
-    - Fix set_max_file_descriptors() to set by default the max open file
-      limit to the current limit when setrlimit() fails. Fixes bug
-      16274; bugfix on tor- 0.2.0.10-alpha. Patch by dgoulet.
-
-  o Minor bugfixes (portability):
-    - Check correctly for Windows socket errors in the workqueue
-      backend. Fixes bug 16741; bugfix on 0.2.6.3-alpha.
-    - Try harder to normalize the exit status of the Tor process to the
-      standard-provided range. Fixes bug 16975; bugfix on every version
-      of Tor ever.
-    - Use libexecinfo on FreeBSD to enable backtrace support. Fixes part
-      of bug 17151; bugfix on 0.2.5.2-alpha. Patch from Marcin Cieślak.
-
-  o Minor bugfixes (relay):
-    - Ensure that worker threads actually exit when a fatal error or
-      shutdown is indicated. This fix doesn't currently affect the
-      behavior of Tor, because Tor workers never indicates fatal error
-      or shutdown except in the unit tests. Fixes bug 16868; bugfix
-      on 0.2.6.3-alpha.
-    - Fix a rarely-encountered memory leak when failing to initialize
-      the thread pool. Fixes bug 16631; bugfix on 0.2.6.3-alpha. Patch
-      from "cypherpunks".
-    - Unblock threads before releasing the work queue mutex to ensure
-      predictable scheduling behavior. Fixes bug 16644; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (security, exit policies):
-    - ExitPolicyRejectPrivate now also rejects the relay's published
-      IPv6 address (if any), and any publicly routable IPv4 or IPv6
-      addresses on any local interfaces. ticket 17027. Patch by "teor".
-      Fixes bug 17027; bugfix on 0.2.0.11-alpha.
-
-  o Minor bugfixes (statistics):
-    - Disregard the ConnDirectionStatistics torrc options when Tor is
-      not a relay since in that mode of operation no sensible data is
-      being collected and because Tor might run into measurement hiccups
-      when running as a client for some time, then becoming a relay.
-      Fixes bug 15604; bugfix on 0.2.2.35.
-
-  o Minor bugfixes (systemd):
-    - Tor's systemd unit file no longer contains extraneous spaces.
-      These spaces would sometimes confuse tools like deb-systemd-
-      helper. Fixes bug 16162; bugfix on 0.2.5.5-alpha.
-
-  o Minor bugfixes (test networks):
-    - When self-testing reachability, use ExtendAllowPrivateAddresses to
-      determine if local/private addresses imply reachability. The
-      previous fix used TestingTorNetwork, which implies
-      ExtendAllowPrivateAddresses, but this excluded rare configurations
-      where ExtendAllowPrivateAddresses is set but TestingTorNetwork is
-      not. Fixes bug 15771; bugfix on 0.2.6.1-alpha. Patch by "teor",
-      issue discovered by CJ Ess.
-
-  o Minor bugfixes (tests, also in 0.2.6.9):
-    - Fix a crash in the unit tests when built with MSVC2013. Fixes bug
-      16030; bugfix on 0.2.6.2-alpha. Patch from "NewEraCracker".
-
-  o Code simplification and refactoring:
-    - Change the function that's called when we need to retry all
-      downloads so that it only reschedules the downloads to happen
-      immediately, rather than launching them all at once itself. This
-      further simplifies Tor's callgraph.
-    - Define WINVER and _WIN32_WINNT centrally, in orconfig.h, in order
-      to ensure they remain consistent and visible everywhere.
-    - Move some format-parsing functions out of crypto.c and
-      crypto_curve25519.c into crypto_format.c and/or util_format.c.
-    - Move the client-only parts of init_keys() into a separate
-      function. Closes ticket 16763.
-    - Move the hacky fallback code out of get_interface_address6() into
-      separate function and get it covered with unit-tests. Resolves
-      ticket 14710.
-    - Refactor hidden service client-side cache lookup to intelligently
-      report its various failure cases, and disentangle failure cases
-      involving a lack of introduction points. Closes ticket 14391.
-    - Remove some vestigial workarounds for the MSVC6 compiler. We
-      haven't supported that in ages.
-    - Remove the unused "nulterminate" argument from buf_pullup().
-    - Simplify the microdesc_free() implementation so that it no longer
-      appears (to code analysis tools) to potentially invoke a huge
-      suite of other microdesc functions.
-    - Simply the control graph further by deferring the inner body of
-      directory_all_unreachable() into a callback. Closes ticket 16762.
-    - The link authentication code has been refactored for better
-      testability and reliability. It now uses code generated with the
-      "trunnel" binary encoding generator, to reduce the risk of bugs
-      due to programmer error. Done as part of ticket 12498.
-    - Treat the loss of an owning controller as equivalent to a SIGTERM
-      signal. This removes a tiny amount of duplicated code, and
-      simplifies our callgraph. Closes ticket 16788.
-    - Use our own Base64 encoder instead of OpenSSL's, to allow more
-      control over the output. Part of ticket 15652.
-    - When generating an event to send to the controller, we no longer
-      put the event over the network immediately. Instead, we queue
-      these events, and use a Libevent callback to deliver them. This
-      change simplifies Tor's callgraph by reducing the number of
-      functions from which all other Tor functions are reachable. Closes
-      ticket 16695.
-    - Wrap Windows-only C files inside '#ifdef _WIN32' so that tools
-      that try to scan or compile every file on Unix won't decide that
-      they are broken.
-
-  o Documentation:
-    - Fix capitalization of SOCKS in sample torrc. Closes ticket 15609.
-    - Improve the descriptions of statistics-related torrc options in
-      the manpage to describe rationale and possible uses cases. Fixes
-      issue 15550.
-    - Improve the layout and formatting of ./configure --help messages.
-      Closes ticket 15024. Patch from "cypherpunks".
-    - Include a specific and (hopefully) accurate documentation of the
-      torrc file's meta-format in doc/torrc_format.txt. This is mainly
-      of interest to people writing programs to parse or generate torrc
-      files. This document is not a commitment to long-term
-      compatibility; some aspects of the current format are a bit
-      ridiculous. Closes ticket 2325.
-    - Include the TUNING document in our source tarball. It is referred
-      to in the ChangeLog and an error message. Fixes bug 16929; bugfix
-      on 0.2.6.1-alpha.
-    - Note that HiddenServicePorts can take a unix domain socket. Closes
-      ticket 17364.
-    - Recommend a 40 GB example AccountingMax in torrc.sample rather
-      than a 4 GB max. Closes ticket 16742.
-    - Standardize on the term "server descriptor" in the manual page.
-      Previously, we had used "router descriptor", "server descriptor",
-      and "relay descriptor" interchangeably. Part of ticket 14987.
-    - Advise users on how to configure separate IPv4 and IPv6 exit
-      policies in the manpage and sample torrcs. Related to ticket 16069.
-    - Fix an error in the manual page and comments for
-      TestingDirAuthVoteHSDir[IsStrict], which suggested that a HSDir
-      required "ORPort connectivity". While this is true, it is in no
-      way unique to the HSDir flag. Of all the flags, only HSDirs need a
-      DirPort configured in order for the authorities to assign that
-      particular flag. Patch by "teor". Fixed as part of 14882; bugfix
-      on 0.2.6.3-alpha.
-    - Fix the usage message of tor-resolve(1) so that it no longer lists
-      the removed -F option. Fixes bug 16913; bugfix on 0.2.2.28-beta.
-
-  o Removed code:
-    - Remove `USE_OPENSSL_BASE64` and the corresponding fallback code
-      and always use the internal Base64 decoder. The internal decoder
-      has been part of tor since 0.2.0.10-alpha, and no one should
-      be using the OpenSSL one. Part of ticket 15652.
-    - Remove the 'tor_strclear()' function; use memwipe() instead.
-      Closes ticket 14922.
-    - Remove the code that would try to aggressively flush controller
-      connections while writing to them. This code was introduced in
-      0.1.2.7-alpha, in order to keep output buffers from exceeding
-      their limits. But there is no longer a maximum output buffer size,
-      and flushing data in this way caused some undesirable recursions
-      in our call graph. Closes ticket 16480.
-    - The internal pure-C tor-fw-helper tool is now removed from the Tor
-      distribution, in favor of the pure-Go clone available from
-      https://gitweb.torproject.org/tor-fw-helper.git/ . The libraries
-      used by the C tor-fw-helper are not, in our opinion, very
-      confidence- inspiring in their secure-programming techniques.
-      Closes ticket 13338.
-
-  o Removed features:
-    - Remove the (seldom-used) DynamicDHGroups feature. For anti-
-      fingerprinting we now recommend pluggable transports; for forward-
-      secrecy in TLS, we now use the P-256 group. Closes ticket 13736.
-    - Remove the HidServDirectoryV2 option. Now all relays offer to
-      store hidden service descriptors. Related to 16543.
-    - Remove the VoteOnHidServDirectoriesV2 option, since all
-      authorities have long set it to 1. Closes ticket 16543.
-    - Remove the undocumented "--digests" command-line option. It
-      complicated our build process, caused subtle build issues on
-      multiple platforms, and is now redundant since we started
-      including git version identifiers. Closes ticket 14742.
-    - Tor no longer contains checks for ancient directory cache versions
-      that didn't know about microdescriptors.
-    - Tor no longer contains workarounds for stat files generated by
-      super-old versions of Tor that didn't choose guards sensibly.
-
-  o Testing:
-    - The test-network.sh script now supports performance testing.
-      Requires corresponding chutney performance testing changes. Patch
-      by "teor". Closes ticket 14175.
-    - Add a new set of callgraph analysis scripts that use clang to
-      produce a list of which Tor functions are reachable from which
-      other Tor functions. We're planning to use these to help simplify
-      our code structure by identifying illogical dependencies.
-    - Add new 'test-full' and 'test-full-online' targets to run all
-      tests, including integration tests with stem and chutney.
-    - Autodetect CHUTNEY_PATH if the chutney and Tor sources are side-
-      by-side in the same parent directory. Closes ticket 16903. Patch
-      by "teor".
-    - Document use of coverity, clang static analyzer, and clang dynamic
-      undefined behavior and address sanitizers in doc/HACKING. Include
-      detailed usage instructions in the blacklist. Patch by "teor".
-      Closes ticket 15817.
-    - Make "bridges+hs" the default test network. This tests almost all
-      tor functionality during make test-network, while allowing tests
-      to succeed on non-IPv6 systems. Requires chutney commit 396da92 in
-      test-network-bridges-hs. Closes tickets 16945 (tor) and 16946
-      (chutney). Patches by "teor".
-    - Make the test-workqueue test work on Windows by initializing the
-      network before we begin.
-    - New make target (make test-network-all) to run multiple applicable
-      chutney test cases. Patch from Teor; closes 16953.
-    - Now that OpenSSL has its own scrypt implementation, add an unit
-      test that checks for interoperability between libscrypt_scrypt()
-      and OpenSSL's EVP_PBE_scrypt() so that we could not use libscrypt
-      and rely on EVP_PBE_scrypt() whenever possible. Resolves
-      ticket 16189.
-    - The link authentication protocol code now has extensive tests.
-    - The relay descriptor signature testing code now has
-      extensive tests.
-    - The test_workqueue program now runs faster, and is enabled by
-      default as a part of "make check".
-    - Unit test dns_resolve(), dns_clip_ttl() and dns_get_expiry_ttl()
-      functions in dns.c. Implements a portion of ticket 16831.
-    - Use environment variables rather than autoconf substitutions to
-      send variables from the build system to the test scripts. This
-      change should be easier to maintain, and cause 'make distcheck' to
-      work better than before. Fixes bug 17148.
-    - When building Tor with testing coverage enabled, run Chutney tests
-      (if any) using the 'tor-cov' coverage binary.
-    - When running test-network or test-stem, check for the absence of
-      stem/chutney before doing any build operations.
-    - Add a test to verify that the compiler does not eliminate our
-      memwipe() implementation. Closes ticket 15377.
-    - Add make rule `check-changes` to verify the format of changes
-      files. Closes ticket 15180.
-    - Add unit tests for control_event_is_interesting(). Add a compile-
-      time check that the number of events doesn't exceed the capacity
-      of control_event_t.event_mask. Closes ticket 15431, checks for
-      bugs similar to 13085. Patch by "teor".
-    - Command-line argument tests moved to Stem. Resolves ticket 14806.
-    - Integrate the ntor, backtrace, and zero-length keys tests into the
-      automake test suite. Closes ticket 15344.
-    - Remove assertions during builds to determine Tor's test coverage.
-      We don't want to trigger these even in assertions, so including
-      them artificially makes our branch coverage look worse than it is.
-      This patch provides the new test-stem-full and coverage-html-full
-      configure options. Implements ticket 15400.
-    - New TestingDirAuthVote{Exit,Guard,HSDir}IsStrict flags to
-      explicitly manage consensus flags in testing networks. Patch by
-      "robgjansen", modified by "teor". Implements part of ticket 14882.
-    - Check for matching value in server response in ntor_ref.py. Fixes
-      bug 15591; bugfix on 0.2.4.8-alpha. Reported and fixed
-      by "joelanders".
-    - Set the severity correctly when testing
-      get_interface_addresses_ifaddrs() and
-      get_interface_addresses_win32(), so that the tests fail gracefully
-      instead of triggering an assertion. Fixes bug 15759; bugfix on
-      0.2.6.3-alpha. Reported by Nicolas Derive.
-
-Changes in version 0.2.6.10 - 2015-07-12
-  Tor version 0.2.6.10 fixes some significant stability and hidden
-  service client bugs, bulletproofs the cryptography init process, and
-  fixes a bug when using the sandbox code with some older versions of
-  Linux. Everyone running an older version, especially an older version
-  of 0.2.6, should upgrade.
-
-  o Major bugfixes (hidden service clients, stability):
-    - Stop refusing to store updated hidden service descriptors on a
-      client. This reverts commit 9407040c59218 (which indeed fixed bug
-      14219, but introduced a major hidden service reachability
-      regression detailed in bug 16381). This is a temporary fix since
-      we can live with the minor issue in bug 14219 (it just results in
-      some load on the network) but the regression of 16381 is too much
-      of a setback. First-round fix for bug 16381; bugfix
-      on 0.2.6.3-alpha.
-
-  o Major bugfixes (stability):
-    - Stop crashing with an assertion failure when parsing certain kinds
-      of malformed or truncated microdescriptors. Fixes bug 16400;
-      bugfix on 0.2.6.1-alpha. Found by "torkeln"; fix based on a patch
-      by "cypherpunks_backup".
-    - Stop random client-side assertion failures that could occur when
-      connecting to a busy hidden service, or connecting to a hidden
-      service while a NEWNYM is in progress. Fixes bug 16013; bugfix
-      on 0.1.0.1-rc.
-
-  o Minor features (geoip):
-    - Update geoip to the June 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the June 3 2015 Maxmind GeoLite2 Country database.
-
-  o Minor bugfixes (crypto error-handling):
-    - Check for failures from crypto_early_init, and refuse to continue.
-      A previous typo meant that we could keep going with an
-      uninitialized crypto library, and would have OpenSSL initialize
-      its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced
-      when implementing ticket 4900. Patch by "teor".
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Allow pipe() and pipe2() syscalls in the seccomp2 sandbox: we need
-      these when eventfd2() support is missing. Fixes bug 16363; bugfix
-      on 0.2.6.3-alpha. Patch from "teor".
-
-
-Changes in version 0.2.6.9 - 2015-06-11
-  Tor 0.2.6.9 fixes a regression in the circuit isolation code, increases the
-  requirements for receiving an HSDir flag, and addresses some other small
-  bugs in the systemd and sandbox code. Clients using circuit isolation
-  should upgrade; all directory authorities should upgrade.
-
-  o Major bugfixes (client-side privacy):
-    - Properly separate out each SOCKSPort when applying stream
-      isolation. The error occurred because each port's session group was
-      being overwritten by a default value when the listener connection
-      was initialized. Fixes bug 16247; bugfix on 0.2.6.3-alpha. Patch
-      by "jojelino".
-
-  o Minor feature (directory authorities, security):
-    - The HSDir flag given by authorities now requires the Stable flag.
-      For the current network, this results in going from 2887 to 2806
-      HSDirs. Also, it makes it harder for an attacker to launch a sybil
-      attack by raising the effort for a relay to become Stable which
-      takes at the very least 7 days to do so and by keeping the 96
-      hours uptime requirement for HSDir. Implements ticket 8243.
-
-  o Minor bugfixes (compilation):
-    - Build with --enable-systemd correctly when libsystemd is
-      installed, but systemd is not. Fixes bug 16164; bugfix on
-      0.2.6.3-alpha. Patch from Peter Palfrader.
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Fix sandboxing to work when running as a relaymby renaming of
-      secret_id_key, and allowing the eventfd2 and futex syscalls. Fixes
-      bug 16244; bugfix on 0.2.6.1-alpha. Patch by Peter Palfrader.
-    - Allow systemd connections to work with the Linux seccomp2 sandbox
-      code. Fixes bug 16212; bugfix on 0.2.6.2-alpha. Patch by
-      Peter Palfrader.
-
-  o Minor bugfixes (tests):
-    - Fix a crash in the unit tests when built with MSVC2013. Fixes bug
-      16030; bugfix on 0.2.6.2-alpha. Patch from "NewEraCracker".
-
-
-Changes in version 0.2.6.8 - 2015-05-21
-  Tor 0.2.6.8 fixes a bit of dodgy code in parsing INTRODUCE2 cells, and
-  fixes an authority-side bug in assigning the HSDir flag. All directory
-  authorities should upgrade.
-
-  o Major bugfixes (hidden services, backport from 0.2.7.1-alpha):
-    - Revert commit that made directory authorities assign the HSDir
-      flag to relays without a DirPort; this was bad because such relays
-      can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
-      on 0.2.6.3-alpha.
-
-  o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha):
-    - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on
-      a client authorized hidden service. Fixes bug 15823; bugfix
-      on 0.2.1.6-alpha.
-
-  o Minor features (geoip):
-    - Update geoip to the April 8 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the April 8 2015 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.6.7 - 2015-04-06
-  Tor 0.2.6.7 fixes two security issues that could be used by an
-  attacker to crash hidden services, or crash clients visiting hidden
-  services. Hidden services should upgrade as soon as possible; clients
-  should upgrade whenever packages become available.
-
-  This release also contains two simple improvements to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-    - Decrease the amount of reattempts that a hidden service performs
-      when its rendezvous circuits fail. This reduces the computational
-      cost for running a hidden service under heavy load. Resolves
-      ticket 11447.
-
-
-Changes in version 0.2.5.12 - 2015-04-06
-  Tor 0.2.5.12 backports two fixes from 0.2.6.7 for security issues that
-  could be used by an attacker to crash hidden services, or crash clients
-  visiting hidden services. Hidden services should upgrade as soon as
-  possible; clients should upgrade whenever packages become available.
-
-  This release also backports a simple improvement to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-
-
-Changes in version 0.2.4.27 - 2015-04-06
-  Tor 0.2.4.27 backports two fixes from 0.2.6.7 for security issues that
-  could be used by an attacker to crash hidden services, or crash clients
-  visiting hidden services. Hidden services should upgrade as soon as
-  possible; clients should upgrade whenever packages become available.
-
-  This release also backports a simple improvement to make hidden
-  services a bit less vulnerable to denial-of-service attacks.
-
-  o Major bugfixes (security, hidden service):
-    - Fix an issue that would allow a malicious client to trigger an
-      assertion failure and halt a hidden service. Fixes bug 15600;
-      bugfix on 0.2.1.6-alpha. Reported by "disgleirio".
-    - Fix a bug that could cause a client to crash with an assertion
-      failure when parsing a malformed hidden service descriptor. Fixes
-      bug 15601; bugfix on 0.2.1.5-alpha. Found by "DonnchaC".
-
-  o Minor features (DoS-resistance, hidden service):
-    - Introduction points no longer allow multiple INTRODUCE1 cells to
-      arrive on the same circuit. This should make it more expensive for
-      attackers to overwhelm hidden services with introductions.
-      Resolves ticket 15515.
-
-
-Changes in version 0.2.6.6 - 2015-03-24
-  Tor 0.2.6.6 is the first stable release in the 0.2.6 series.
-
-  It adds numerous safety, security, correctness, and performance
-  improvements. Client programs can be configured to use more kinds of
-  sockets, AutomapHosts works better, the multithreading backend is
-  improved, cell transmission is refactored, test coverage is much
-  higher, more denial-of-service attacks are handled, guard selection is
-  improved to handle long-term guards better, pluggable transports
-  should work a bit better, and some annoying hidden service performance
-  bugs should be addressed.
-
-  o New compiler and system requirements:
-    - Tor 0.2.6.x requires that your compiler support more of the C99
-      language standard than before. The 'configure' script now detects
-      whether your compiler supports C99 mid-block declarations and
-      designated initializers. If it does not, Tor will not compile.
-
-      We may revisit this requirement if it turns out that a significant
-      number of people need to build Tor with compilers that don't
-      bother implementing a 15-year-old standard. Closes ticket 13233.
-    - Tor no longer supports systems without threading support. When we
-      began working on Tor, there were several systems that didn't have
-      threads, or where the thread support wasn't able to run the
-      threads of a single process on multiple CPUs. That no longer
-      holds: every system where Tor needs to run well now has threading
-      support. Resolves ticket 12439.
-
-  o Deprecated versions and removed support:
-    - Tor relays older than 0.2.4.18-rc are no longer allowed to
-      advertise themselves on the network. Closes ticket 13555.
-    - Tor clients no longer support connecting to hidden services
-      running on Tor 0.2.2.x and earlier; the Support022HiddenServices
-      option has been removed. (There shouldn't be any hidden services
-      running these versions on the network.) Closes ticket 7803.
-
-  o Directory authority changes:
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-
-  o Major features (bridges):
-    - Expose the outgoing upstream HTTP/SOCKS proxy to pluggable
-      transports if they are configured via the "TOR_PT_PROXY"
-      environment variable. Implements proposal 232. Resolves
-      ticket 8402.
-
-  o Major features (changed defaults):
-    - Prevent relay operators from unintentionally running exits: When a
-      relay is configured as an exit node, we now warn the user unless
-      the "ExitRelay" option is set to 1. We warn even more loudly if
-      the relay is configured with the default exit policy, since this
-      can indicate accidental misconfiguration. Setting "ExitRelay 0"
-      stops Tor from running as an exit relay. Closes ticket 10067.
-
-  o Major features (client performance, hidden services):
-    - Allow clients to use optimistic data when connecting to a hidden
-      service, which should remove a round-trip from hidden service
-      initialization. See proposal 181 for details. Implements
-      ticket 13211.
-
-  o Major features (directory system):
-    - Upon receiving an unparseable directory object, if its digest
-      matches what we expected, then don't try to download it again.
-      Previously, when we got a descriptor we didn't like, we would keep
-      trying to download it over and over. Closes ticket 11243.
-    - When downloading server- or microdescriptors from a directory
-      server, we no longer launch multiple simultaneous requests to the
-      same server. This reduces load on the directory servers,
-      especially when directory guards are in use. Closes ticket 9969.
-    - When downloading server- or microdescriptors over a tunneled
-      connection, do not limit the length of our requests to what the
-      Squid proxy is willing to handle. Part of ticket 9969.
-    - Authorities can now vote on the correct digests and latest
-      versions for different software packages. This allows packages
-      that include Tor to use the Tor authority system as a way to get
-      notified of updates and their correct digests. Implements proposal
-      227. Closes ticket 10395.
-
-  o Major features (guards):
-    - Introduce the Guardfraction feature to improves load balancing on
-      guard nodes. Specifically, it aims to reduce the traffic gap that
-      guard nodes experience when they first get the Guard flag. This is
-      a required step if we want to increase the guard lifetime to 9
-      months or greater.  Closes ticket 9321.
-
-  o Major features (hidden services):
-    - Make HS port scanning more difficult by immediately closing the
-      circuit when a user attempts to connect to a nonexistent port.
-      Closes ticket 13667.
-    - Add a HiddenServiceStatistics option that allows Tor relays to
-      gather and publish statistics about the overall size and volume of
-      hidden service usage. Specifically, when this option is turned on,
-      an HSDir will publish an approximate number of hidden services
-      that have published descriptors to it the past 24 hours. Also, if
-      a relay has acted as a hidden service rendezvous point, it will
-      publish the approximate amount of rendezvous cells it has relayed
-      the past 24 hours. The statistics themselves are obfuscated so
-      that the exact values cannot be derived. For more details see
-      proposal 238, "Better hidden service stats from Tor relays". This
-      feature is currently disabled by default. Implements feature 13192.
-
-  o Major features (performance):
-    - Make the CPU worker implementation more efficient by avoiding the
-      kernel and lengthening pipelines. The original implementation used
-      sockets to transfer data from the main thread to the workers, and
-      didn't allow any thread to be assigned more than a single piece of
-      work at once. The new implementation avoids communications
-      overhead by making requests in shared memory, avoiding kernel IO
-      where possible, and keeping more requests in flight at once.
-      Implements ticket 9682.
-
-  o Major features (relay):
-    - Raise the minimum acceptable configured bandwidth rate for bridges
-      to 50 KiB/sec and for relays to 75 KiB/sec. (The old values were
-      20 KiB/sec.) Closes ticket 13822.
-    - Complete revision of the code that relays use to decide which cell
-      to send next. Formerly, we selected the best circuit to write on
-      each channel, but we didn't select among channels in any
-      sophisticated way. Now, we choose the best circuits globally from
-      among those whose channels are ready to deliver traffic.
-
-      This patch implements a new inter-cmux comparison API, a global
-      high/low watermark mechanism and a global scheduler loop for
-      transmission prioritization across all channels as well as among
-      circuits on one channel. This schedule is currently tuned to
-      (tolerantly) avoid making changes in network performance, but it
-      should form the basis for major circuit performance increases in
-      the future. Code by Andrea; tuning by Rob Jansen; implements
-      ticket 9262.
-
-  o Major features (sample torrc):
-    - Add a new, infrequently-changed "torrc.minimal". This file is
-      similar to torrc.sample, but it will change as infrequently as
-      possible, for the benefit of users whose systems prompt them for
-      intervention whenever a default configuration file is changed.
-      Making this change allows us to update torrc.sample to be a more
-      generally useful "sample torrc".
-
-  o Major features (security, unix domain sockets):
-    - Allow SocksPort to be an AF_UNIX Unix Domain Socket. Now high risk
-      applications can reach Tor without having to create AF_INET or
-      AF_INET6 sockets, meaning they can completely disable their
-      ability to make non-Tor network connections. To create a socket of
-      this type, use "SocksPort unix:/path/to/socket". Implements
-      ticket 12585.
-    - Support mapping hidden service virtual ports to AF_UNIX sockets.
-      The syntax is "HiddenServicePort 80 unix:/path/to/socket".
-      Implements ticket 11485.
-
-  o Major bugfixes (client, automap):
-    - Repair automapping with IPv6 addresses. This automapping should
-      have worked previously, but one piece of debugging code that we
-      inserted to detect a regression actually caused the regression to
-      manifest itself again. Fixes bug 13811 and bug 12831; bugfix on
-      0.2.4.7-alpha. Diagnosed and fixed by Francisco Blas
-      Izquierdo Riera.
-
-  o Major bugfixes (crash, OSX, security):
-    - Fix a remote denial-of-service opportunity caused by a bug in
-      OSX's _strlcat_chk() function. Fixes bug 15205; bug first appeared
-      in OSX 10.9.
-
-  o Major bugfixes (directory authorities):
-    - Do not assign the HSDir flag to relays if they are not Valid, or
-      currently hibernating. Fixes 12573; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (directory bandwidth performance):
-    - Don't flush the zlib buffer aggressively when compressing
-      directory information for clients. This should save about 7% of
-      the bandwidth currently used for compressed descriptors and
-      microdescriptors. Fixes bug 11787; bugfix on 0.1.1.23.
-
-  o Major bugfixes (exit node stability):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (FreeBSD IPFW transparent proxy):
-    - Fix address detection with FreeBSD transparent proxies, when
-      "TransProxyType ipfw" is in use. Fixes bug 15064; bugfix
-      on 0.2.5.4-alpha.
-
-  o Major bugfixes (hidden services):
-    - When closing an introduction circuit that was opened in parallel
-      with others, don't mark the introduction point as unreachable.
-      Previously, the first successful connection to an introduction
-      point would make the other introduction points get marked as
-      having timed out. Fixes bug 13698; bugfix on 0.0.6rc2.
-
-  o Major bugfixes (Linux seccomp2 sandbox):
-    - Upon receiving sighup with the seccomp2 sandbox enabled, do not
-      crash during attempts to call wait4. Fixes bug 15088; bugfix on
-      0.2.5.1-alpha. Patch from "sanic".
-
-  o Major bugfixes (mixed relay-client operation):
-    - When running as a relay and client at the same time (not
-      recommended), if we decide not to use a new guard because we want
-      to retry older guards, only close the locally-originating circuits
-      passing through that guard. Previously we would close all the
-      circuits through that guard. Fixes bug 9819; bugfix on
-      0.2.1.1-alpha. Reported by "skruffy".
-
-  o Major bugfixes (pluggable transports):
-    - Initialize the extended OR Port authentication cookie before
-      launching pluggable transports. This prevents a race condition
-      that occured when server-side pluggable transports would cache the
-      authentication cookie before it has been (re)generated. Fixes bug
-      15240; bugfix on 0.2.5.1-alpha.
-
-  o Major bugfixes (relay, stability, possible security):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout is passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from "cypherpunks".
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Minor features (build):
-    - New --disable-system-torrc compile-time option to prevent Tor from
-      looking for the system-wide torrc or torrc-defaults files.
-      Resolves ticket 13037.
-
-  o Minor features (client):
-    - Clients are now willing to send optimistic data (before they
-      receive a 'connected' cell) to relays of any version. (Relays
-      without support for optimistic data are no longer supported on the
-      Tor network.) Resolves ticket 13153.
-
-  o Minor features (client):
-    - Validate hostnames in SOCKS5 requests more strictly. If SafeSocks
-      is enabled, reject requests with IP addresses as hostnames.
-      Resolves ticket 13315.
-
-  o Minor features (controller):
-    - Add a "SIGNAL HEARTBEAT" controller command that tells Tor to
-      write an unscheduled heartbeat message to the log. Implements
-      feature 9503.
-    - Include SOCKS_USERNAME and SOCKS_PASSWORD values in controller
-      events so controllers can observe circuit isolation inputs. Closes
-      ticket 8405.
-    - ControlPort now supports the unix:/path/to/socket syntax as an
-      alternative to the ControlSocket option, for consistency with
-      SocksPort and HiddenServicePort. Closes ticket 14451.
-    - New "GETINFO bw-event-cache" to get information about recent
-      bandwidth events. Closes ticket 14128. Useful for controllers to
-      get recent bandwidth history after the fix for ticket 13988.
-    - Messages about problems in the bootstrap process now include
-      information about the server we were trying to connect to when we
-      noticed the problem. Closes ticket 15006.
-
-  o Minor features (Denial of service resistance):
-    - Count the total number of bytes used storing hidden service
-      descriptors against the value of MaxMemInQueues. If we're low on
-      memory, and more than 20% of our memory is used holding hidden
-      service descriptors, free them until no more than 10% of our
-      memory holds hidden service descriptors. Free the least recently
-      fetched descriptors first. Resolves ticket 13806.
-    - When we have recently been under memory pressure (over 3/4 of
-      MaxMemInQueues is allocated), then allocate smaller zlib objects
-      for small requests. Closes ticket 11791.
-
-  o Minor features (directory authorities):
-    - Don't list relays with a bandwidth estimate of 0 in the consensus.
-      Implements a feature proposed during discussion of bug 13000.
-    - In tor-gencert, report an error if the user provides the same
-      argument more than once.
-    - If a directory authority can't find a best consensus method in the
-      votes that it holds, it now falls back to its favorite consensus
-      method. Previously, it fell back to method 1. Neither of these is
-      likely to get enough signatures, but "fall back to favorite"
-      doesn't require us to maintain support an obsolete consensus
-      method. Implements part of proposal 215.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (guard nodes):
-    - Reduce the time delay before saving guard status to disk from 10
-      minutes to 30 seconds (or from one hour to 10 minutes if
-      AvoidDiskWrites is set). Closes ticket 12485.
-
-  o Minor features (heartbeat):
-    - On relays, report how many connections we negotiated using each
-      version of the Tor link protocols. This information will let us
-      know if removing support for very old versions of the Tor
-      protocols is harming the network. Closes ticket 15212.
-
-  o Minor features (hidden service):
-    - Make Sybil attacks against hidden services harder by changing the
-      minimum time required to get the HSDir flag from 25 hours up to 96
-      hours. Addresses ticket 14149.
-    - New option "HiddenServiceAllowUnknownPorts" to allow hidden
-      services to disable the anti-scanning feature introduced in
-      0.2.6.2-alpha. With this option not set, a connection to an
-      unlisted port closes the circuit. With this option set, only a
-      RELAY_DONE cell is sent. Closes ticket 14084.
-    - When re-enabling the network, don't try to build introduction
-      circuits until we have successfully built a circuit. This makes
-      hidden services come up faster when the network is re-enabled.
-      Patch from "akwizgran". Closes ticket 13447.
-    - When we fail to retrieve a hidden service descriptor, send the
-      controller an "HS_DESC FAILED" controller event. Implements
-      feature 13212.
-    - New HiddenServiceDirGroupReadable option to cause hidden service
-      directories and hostname files to be created group-readable. Patch
-      from "anon", David Stainton, and "meejah". Closes ticket 11291.
-
-  o Minor features (interface):
-    - Implement "-f -" command-line option to read torrc configuration
-      from standard input, if you don't want to store the torrc file in
-      the file system. Implements feature 13865.
-
-  o Minor features (logging):
-    - Add a count of unique clients to the bridge heartbeat message.
-      Resolves ticket 6852.
-    - Suppress "router info incompatible with extra info" message when
-      reading extrainfo documents from cache. (This message got loud
-      around when we closed bug 9812 in 0.2.6.2-alpha.) Closes
-      ticket 13762.
-    - Elevate hidden service authorized-client message from DEBUG to
-      INFO. Closes ticket 14015.
-    - On Unix-like systems, you can now use named pipes as the target of
-      the Log option, and other options that try to append to files.
-      Closes ticket 12061. Patch from "carlo von lynX".
-    - When opening a log file at startup, send it every log message that
-      we generated between startup and opening it. Previously, log
-      messages that were generated before opening the log file were only
-      logged to stdout. Closes ticket 6938.
-    - Add a TruncateLogFile option to overwrite logs instead of
-      appending to them. Closes ticket 5583.
-    - Quiet some log messages in the heartbeat and at startup. Closes
-      ticket 14950.
-
-  o Minor features (portability, Solaris):
-    - Threads are no longer disabled by default on Solaris; we believe
-      that the versions of Solaris with broken threading support are all
-      obsolete by now. Resolves ticket 9495.
-
-  o Minor features (relay):
-    - Re-check our address after we detect a changed IP address from
-      getsockname(). This ensures that the controller command "GETINFO
-      address" will report the correct value. Resolves ticket 11582.
-      Patch from "ra".
-    - A new AccountingRule option lets Relays set whether they'd like
-      AccountingMax to be applied separately to inbound and outbound
-      traffic, or applied to the sum of inbound and outbound traffic.
-      Resolves ticket 961. Patch by "chobe".
-    - When identity keypair is generated for first time, log a
-      congratulatory message that links to the new relay lifecycle
-      document. Implements feature 10427.
-
-  o Minor features (security, memory wiping):
-    - Ensure we securely wipe keys from memory after
-      crypto_digest_get_digest and init_curve25519_keypair_from_file
-      have finished using them. Resolves ticket 13477.
-
-  o Minor features (security, out-of-memory handling):
-    - When handling an out-of-memory condition, allocate less memory for
-      temporary data structures. Fixes issue 10115.
-    - When handling an out-of-memory condition, consider more types of
-      buffers, including those on directory connections, and zlib
-      buffers. Resolves ticket 11792.
-
-  o Minor features (stability):
-    - Add assertions in our hash-table iteration code to check for
-      corrupted values that could cause infinite loops. Closes
-      ticket 11737.
-
-  o Minor features (systemd):
-    - Various improvements and modernizations in systemd hardening
-      support. Closes ticket 13805. Patch from Craig Andrews.
-    - Where supported, when running with systemd, report successful
-      startup to systemd. Part of ticket 11016. Patch by Michael Scherer.
-    - When running with systemd, support systemd watchdog messages. Part
-      of ticket 11016. Patch by Michael Scherer.
-
-  o Minor features (testing networks):
-    - Add the TestingDirAuthVoteExit option, which lists nodes to assign
-      the "Exit" flag regardless of their uptime, bandwidth, or exit
-      policy. TestingTorNetwork must be set for this option to have any
-      effect. Previously, authorities would take up to 35 minutes to
-      give nodes the Exit flag in a test network. Partially implements
-      ticket 13161.
-    - Drop the minimum RendPostPeriod on a testing network to 5 seconds,
-      and the default on a testing network to 2 minutes. Drop the
-      MIN_REND_INITIAL_POST_DELAY on a testing network to 5 seconds, but
-      keep the default on a testing network at 30 seconds. This reduces
-      HS bootstrap time to around 25 seconds. Also, change the default
-      time in test-network.sh to match. Closes ticket 13401. Patch
-      by "teor".
-    - Create TestingDirAuthVoteHSDir to correspond to
-      TestingDirAuthVoteExit/Guard. Ensures that authorities vote the
-      HSDir flag for the listed relays regardless of uptime or ORPort
-      connectivity. Respects the value of VoteOnHidServDirectoriesV2.
-      Partial implementation for ticket 14067. Patch by "teor".
-
-  o Minor features (tor2web mode):
-    - Introduce the config option Tor2webRendezvousPoints, which allows
-      clients in Tor2webMode to select a specific Rendezvous Point to be
-      used in HS circuits. This might allow better performance for
-      Tor2Web nodes. Implements ticket 12844.
-
-  o Minor features (transparent proxy):
-    - Update the transparent proxy option checks to allow for both ipfw
-      and pf on OS X. Closes ticket 14002.
-    - Use the correct option when using IPv6 with transparent proxy
-      support on Linux. Resolves 13808. Patch by Francisco Blas
-      Izquierdo Riera.
-
-  o Minor features (validation):
-    - Check all date/time values passed to tor_timegm and
-      parse_rfc1123_time for validity, taking leap years into account.
-      Improves HTTP header validation. Implemented with bug 13476.
-    - In correct_tm(), limit the range of values returned by system
-      localtime(_r) and gmtime(_r) to be between the years 1 and 8099.
-      This means we don't have to deal with negative or too large dates,
-      even if a clock is wrong. Otherwise we might fail to read a file
-      written by us which includes such a date. Fixes bug 13476.
-    - Stop allowing invalid address patterns like "*/24" that contain
-      both a wildcard address and a bit prefix length. This affects all
-      our address-range parsing code. Fixes bug 7484; bugfix
-      on 0.0.2pre14.
-
-  o Minor bugfixes (bridge clients):
-    - When configured to use a bridge without an identity digest (not
-      recommended), avoid launching an extra channel to it when
-      bootstrapping. Fixes bug 7733; bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (bridges):
-    - When DisableNetwork is set, do not launch pluggable transport
-      plugins, and if any are running, terminate them. Fixes bug 13213;
-      bugfix on 0.2.3.6-alpha.
-
-  o Minor bugfixes (C correctness):
-    - Fix several instances of possible integer overflow/underflow/NaN.
-      Fixes bug 13104; bugfix on 0.2.3.1-alpha and later. Patches
-      from "teor".
-    - In circuit_build_times_calculate_timeout() in circuitstats.c,
-      avoid dividing by zero in the pareto calculations. This traps
-      under clang's "undefined-trap" sanitizer. Fixes bug 13290; bugfix
-      on 0.2.2.2-alpha.
-    - Fix an integer overflow in format_time_interval(). Fixes bug
-      13393; bugfix on 0.2.0.10-alpha.
-    - Set the correct day of year value when the system's localtime(_r)
-      or gmtime(_r) functions fail to set struct tm. Not externally
-      visible. Fixes bug 13476; bugfix on 0.0.2pre14.
-    - Avoid unlikely signed integer overflow in tor_timegm on systems
-      with 32-bit time_t. Fixes bug 13476; bugfix on 0.0.2pre14.
-
-  o Minor bugfixes (certificate handling):
-    - If an authority operator accidentally makes a signing certificate
-      with a future publication time, do not discard its real signing
-      certificates. Fixes bug 11457; bugfix on 0.2.0.3-alpha.
-    - Remove any old authority certificates that have been superseded
-      for at least two days. Previously, we would keep superseded
-      certificates until they expired, if they were published close in
-      time to the certificate that superseded them. Fixes bug 11454;
-      bugfix on 0.2.1.8-alpha.
-
-  o Minor bugfixes (client):
-    - Fix smartlist_choose_node_by_bandwidth() so that relays with the
-      BadExit flag are not considered worthy candidates. Fixes bug
-      13066; bugfix on 0.1.2.3-alpha.
-    - Use the consensus schedule for downloading consensuses, and not
-      the generic schedule. Fixes bug 11679; bugfix on 0.2.2.6-alpha.
-    - Handle unsupported or malformed SOCKS5 requests properly by
-      responding with the appropriate error message before closing the
-      connection. Fixes bugs 12971 and 13314; bugfix on 0.0.2pre13.
-
-  o Minor bugfixes (client, automapping):
-    - Avoid crashing on torrc lines for VirtualAddrNetworkIPv[4|6] when
-      no value follows the option. Fixes bug 14142; bugfix on
-      0.2.4.7-alpha. Patch by "teor".
-    - Fix a memory leak when using AutomapHostsOnResolve. Fixes bug
-      14195; bugfix on 0.1.0.1-rc.
-    - Prevent changes to other options from removing the wildcard value
-      "." from "AutomapHostsSuffixes". Fixes bug 12509; bugfix
-      on 0.2.0.1-alpha.
-    - Allow MapAddress and AutomapHostsOnResolve to work together when
-      an address is mapped into another address type (like .onion) that
-      must be automapped at resolve time. Fixes bug 7555; bugfix
-      on 0.2.0.1-alpha.
-
-  o Minor bugfixes (client, bridges):
-    - When we are using bridges and we had a network connectivity
-      problem, only retry connecting to our currently configured
-      bridges, not all bridges we know about and remember using. Fixes
-      bug 14216; bugfix on 0.2.2.17-alpha.
-
-  o Minor bugfixes (client, DNS):
-    - Report the correct cached DNS expiration times on SOCKS port or in
-      DNS replies. Previously, we would report everything as "never
-      expires." Fixes bug 14193; bugfix on 0.2.3.17-beta.
-    - Avoid a small memory leak when we find a cached answer for a
-      reverse DNS lookup in a client-side DNS cache. (Remember, client-
-      side DNS caching is off by default, and is not recommended.) Fixes
-      bug 14259; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (client, IPv6):
-    - Reject socks requests to literal IPv6 addresses when IPv6Traffic
-      flag is not set; and not because the NoIPv4Traffic flag was set.
-      Previously we'd looked at the NoIPv4Traffic flag for both types of
-      literal addresses. Fixes bug 14280; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (client, microdescriptors):
-    - Use a full 256 bits of the SHA256 digest of a microdescriptor when
-      computing which microdescriptors to download. This keeps us from
-      erroneous download behavior if two microdescriptor digests ever
-      have the same first 160 bits. Fixes part of bug 13399; bugfix
-      on 0.2.3.1-alpha.
-    - Reset a router's status if its microdescriptor digest changes,
-      even if the first 160 bits remain the same. Fixes part of bug
-      13399; bugfix on 0.2.3.1-alpha.
-
-  o Minor bugfixes (client, torrc):
-    - Stop modifying the value of our DirReqStatistics torrc option just
-      because we're not a bridge or relay. This bug was causing Tor
-      Browser users to write "DirReqStatistics 0" in their torrc files
-      as if they had chosen to change the config. Fixes bug 4244; bugfix
-      on 0.2.3.1-alpha.
-    - When GeoIPExcludeUnknown is enabled, do not incorrectly decide
-      that our options have changed every time we SIGHUP. Fixes bug
-      9801; bugfix on 0.2.4.10-alpha. Patch from "qwerty1".
-
-  o Minor bugfixes (compilation):
-    - Fix a compilation warning on s390. Fixes bug 14988; bugfix
-      on 0.2.5.2-alpha.
-    - Silence clang warnings under --enable-expensive-hardening,
-      including implicit truncation of 64 bit values to 32 bit, const
-      char assignment to self, tautological compare, and additional
-      parentheses around equality tests. Fixes bug 13577; bugfix
-      on 0.2.5.4-alpha.
-    - Fix a clang warning about checking whether an address in the
-      middle of a structure is NULL. Fixes bug 14001; bugfix
-      on 0.2.1.2-alpha.
-    - The address of an array in the middle of a structure will always
-      be non-NULL. clang recognises this and complains. Disable the
-      tautologous and redundant check to silence this warning. Fixes bug
-      14001; bugfix on 0.2.1.2-alpha.
-    - Compile correctly with (unreleased) OpenSSL 1.1.0 headers.
-      Addresses ticket 14188.
-    - Build without warnings with the stock OpenSSL srtp.h header, which
-      has a duplicate declaration of SSL_get_selected_srtp_profile().
-      Fixes bug 14220; this is OpenSSL's bug, not ours.
-    - Do not compile any code related to Tor2Web mode when Tor2Web mode
-      is not enabled at compile time. Previously, this code was included
-      in a disabled state. See discussion on ticket 12844.
-    - Allow our configure script to build correctly with autoconf 2.62
-      again. Fixes bug 12693; bugfix on 0.2.5.2-alpha.
-    - Improve the error message from ./configure to make it clear that
-      when asciidoc has not been found, the user will have to either add
-      --disable-asciidoc argument or install asciidoc. Resolves
-      ticket 13228.
-
-  o Minor bugfixes (controller):
-    - Report "down" in response to the "GETINFO entry-guards" command
-      when relays are down with an unreachable_since value. Previously,
-      we would report "up". Fixes bug 14184; bugfix on 0.1.2.2-alpha.
-    - Avoid crashing on a malformed EXTENDCIRCUIT command. Fixes bug
-      14116; bugfix on 0.2.2.9-alpha.
-
-  o Minor bugfixes (controller):
-    - Return an error when the second or later arguments of the
-      "setevents" controller command are invalid events. Previously we
-      would return success while silently skipping invalid events. Fixes
-      bug 13205; bugfix on 0.2.3.2-alpha. Reported by "fpxnns".
-
-  o Minor bugfixes (directory authority):
-    - Allow directory authorities to fetch more data from one another if
-      they find themselves missing lots of votes. Previously, they had
-      been bumping against the 10 MB queued data limit. Fixes bug 14261;
-      bugfix on 0.1.2.5-alpha.
-    - Do not attempt to download extrainfo documents which we will be
-      unable to validate with a matching server descriptor. Fixes bug
-      13762; bugfix on 0.2.0.1-alpha.
-    - Fix a bug that was truncating AUTHDIR_NEWDESC events sent to the
-      control port. Fixes bug 14953; bugfix on 0.2.0.1-alpha.
-    - Enlarge the buffer to read bwauth generated files to avoid an
-      issue when parsing the file in dirserv_read_measured_bandwidths().
-      Fixes bug 14125; bugfix on 0.2.2.1-alpha.
-    - When running as a v3 directory authority, advertise that you serve
-      extra-info documents so that clients who want them can find them
-      from you too. Fixes part of bug 11683; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (directory system):
-    - Always believe that v3 directory authorities serve extra-info
-      documents, whether they advertise "caches-extra-info" or not.
-      Fixes part of bug 11683; bugfix on 0.2.0.1-alpha.
-    - Check the BRIDGE_DIRINFO flag bitwise rather than using equality.
-      Previously, directories offering BRIDGE_DIRINFO and some other
-      flag (i.e. microdescriptors or extrainfo) would be ignored when
-      looking for bridges. Partially fixes bug 13163; bugfix
-      on 0.2.0.7-alpha.
-
-  o Minor bugfixes (file handling):
-    - Stop failing when key files are zero-length. Instead, generate new
-      keys, and overwrite the empty key files. Fixes bug 13111; bugfix
-      on all versions of Tor. Patch by "teor".
-    - Stop generating a fresh .old RSA onion key file when the .old file
-      is missing. Fixes part of 13111; bugfix on 0.0.6rc1.
-    - Avoid overwriting .old key files with empty key files.
-    - Skip loading zero-length extrainfo store, router store, stats,
-      state, and key files.
-    - Avoid crashing when trying to reload a torrc specified as a
-      relative path with RunAsDaemon turned on. Fixes bug 13397; bugfix
-      on 0.2.3.11-alpha.
-
-  o Minor bugfixes (hidden services):
-    - Close the introduction circuit when we have no more usable intro
-      points, instead of waiting for it to time out. This also ensures
-      that no follow-up HS descriptor fetch is triggered when the
-      circuit eventually times out. Fixes bug 14224; bugfix on 0.0.6.
-    - When fetching a hidden service descriptor for a down service that
-      was recently up, do not keep refetching until we try the same
-      replica twice in a row. Fixes bug 14219; bugfix on 0.2.0.10-alpha.
-    - Correctly send a controller event when we find that a rendezvous
-      circuit has finished. Fixes bug 13936; bugfix on 0.1.1.5-alpha.
-    - Pre-check directory permissions for new hidden-services to avoid
-      at least one case of "Bug: Acting on config options left us in a
-      broken state. Dying." Fixes bug 13942; bugfix on 0.0.6pre1.
-    - When fetching hidden service descriptors, we now check not only
-      for whether we got the hidden service we had in mind, but also
-      whether we got the particular descriptors we wanted. This prevents
-      a class of inefficient but annoying DoS attacks by hidden service
-      directories. Fixes bug 13214; bugfix on 0.2.1.6-alpha. Reported
-      by "special".
-
-  o Minor bugfixes (Linux seccomp2 sandbox):
-    - Make transparent proxy support work along with the seccomp2
-      sandbox. Fixes part of bug 13808; bugfix on 0.2.5.1-alpha. Patch
-      by Francisco Blas Izquierdo Riera.
-    - Fix a memory leak in tor-resolve when running with the sandbox
-      enabled. Fixes bug 14050; bugfix on 0.2.5.9-rc.
-    - Allow glibc fatal errors to be sent to stderr before Tor exits.
-      Previously, glibc would try to write them to /dev/tty, and the
-      sandbox would trap the call and make Tor exit prematurely. Fixes
-      bug 14759; bugfix on 0.2.5.1-alpha.
-
-  o Minor bugfixes (logging):
-    - Avoid crashing when there are more log domains than entries in
-      domain_list. Bugfix on 0.2.3.1-alpha.
-    - Downgrade warnings about RSA signature failures to info log level.
-      Emit a warning when an extra info document is found incompatible
-      with a corresponding router descriptor. Fixes bug 9812; bugfix
-      on 0.0.6rc3.
-    - Make connection_ap_handshake_attach_circuit() log the circuit ID
-      correctly. Fixes bug 13701; bugfix on 0.0.6.
-
-  o Minor bugfixes (networking):
-    - Check for orconns and use connection_or_close_for_error() rather
-      than connection_mark_for_close() directly in the getsockopt()
-      failure case of connection_handle_write_impl(). Fixes bug 11302;
-      bugfix on 0.2.4.4-alpha.
-
-  o Minor bugfixes (parsing):
-    - Stop accepting milliseconds (or other junk) at the end of
-      descriptor publication times. Fixes bug 9286; bugfix on 0.0.2pre25.
-    - Support two-number and three-number version numbers correctly, in
-      case we change the Tor versioning system in the future. Fixes bug
-      13661; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (portability):
-    - Fix the ioctl()-based network interface lookup code so that it
-      will work on systems that have variable-length struct ifreq, for
-      example Mac OS X.
-    - Use the correct datatype in the SipHash-2-4 function to prevent
-      compilers from assuming any sort of alignment. Fixes bug 15436;
-      bugfix on 0.2.5.3-alpha.
-
-  o Minor bugfixes (preventative security, C safety):
-    - When reading a hexadecimal, base-32, or base-64 encoded value from
-      a string, always overwrite the whole output buffer. This prevents
-      some bugs where we would look at (but fortunately, not reveal)
-      uninitialized memory on the stack. Fixes bug 14013; bugfix on all
-      versions of Tor.
-    - Clear all memory targetted by tor_addr_{to,from}_sockaddr(), not
-      just the part that's used. This makes it harder for data leak bugs
-      to occur in the event of other programming failures. Resolves
-      ticket 14041.
-
-  o Minor bugfixes (relay):
-    - When generating our family list, remove spaces from around the
-      entries. Fixes bug 12728; bugfix on 0.2.1.7-alpha.
-    - If our previous bandwidth estimate was 0 bytes, allow publishing a
-      new relay descriptor immediately. Fixes bug 13000; bugfix
-      on 0.1.1.6-alpha.
-
-  o Minor bugfixes (shutdown):
-    - When shutting down, always call event_del() on lingering read or
-      write events before freeing them. Otherwise, we risk double-frees
-      or read-after-frees in event_base_free(). Fixes bug 12985; bugfix
-      on 0.1.0.2-rc.
-
-  o Minor bugfixes (small memory leaks):
-    - Avoid leaking memory when using IPv6 virtual address mappings.
-      Fixes bug 14123; bugfix on 0.2.4.7-alpha. Patch by Tom van
-      der Woerdt.
-
-  o Minor bugfixes (statistics):
-    - Increase period over which bandwidth observations are aggregated
-      from 15 minutes to 4 hours. Fixes bug 13988; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (systemd support):
-    - Run correctly under systemd with the RunAsDaemon option set. Fixes
-      part of bug 14141; bugfix on 0.2.5.7-rc. Patch from Tomasz Torcz.
-    - Inform the systemd supervisor about more changes in the Tor
-      process status. Implements part of ticket 14141. Patch from
-      Tomasz Torcz.
-
-  o Minor bugfixes (testing networks):
-    - Fix TestingDirAuthVoteGuard to properly give out Guard flags in a
-      testing network. Fixes bug 13064; bugfix on 0.2.5.2-alpha.
-    - Stop using the default authorities in networks which provide both
-      AlternateDirAuthority and AlternateBridgeAuthority. Partially
-      fixes bug 13163; bugfix on 0.2.0.13-alpha.
-
-  o Minor bugfixes (testing networks, fast startup):
-    - Allow Tor to build circuits using a consensus with no exits. If
-      the consensus has no exits (typical of a bootstrapping test
-      network), allow Tor to build circuits once enough descriptors have
-      been downloaded. This assists in bootstrapping a testing Tor
-      network. Fixes bug 13718; bugfix on 0.2.4.10-alpha. Patch
-      by "teor".
-    - When V3AuthVotingInterval is low, give a lower If-Modified-Since
-      header to directory servers. This allows us to obtain consensuses
-      promptly when the consensus interval is very short. This assists
-      in bootstrapping a testing Tor network. Fixes parts of bugs 13718
-      and 13963; bugfix on 0.2.0.3-alpha. Patch by "teor".
-    - Stop assuming that private addresses are local when checking
-      reachability in a TestingTorNetwork. Instead, when testing, assume
-      all OR connections are remote. (This is necessary due to many test
-      scenarios running all relays on localhost.) This assists in
-      bootstrapping a testing Tor network. Fixes bug 13924; bugfix on
-      0.1.0.1-rc. Patch by "teor".
-    - Avoid building exit circuits from a consensus with no exits. Now
-      thanks to our fix for 13718, we accept a no-exit network as not
-      wholly lost, but we need to remember not to try to build exit
-      circuits on it. Closes ticket 13814; patch by "teor".
-    - Stop requiring exits to have non-zero bandwithcapacity in a
-      TestingTorNetwork. Instead, when TestingMinExitFlagThreshold is 0,
-      ignore exit bandwidthcapacity. This assists in bootstrapping a
-      testing Tor network. Fixes parts of bugs 13718 and 13839; bugfix
-      on 0.2.0.3-alpha. Patch by "teor".
-    - Add "internal" to some bootstrap statuses when no exits are
-      available. If the consensus does not contain Exits, Tor will only
-      build internal circuits. In this case, relevant statuses will
-      contain the word "internal" as indicated in the Tor control-
-       spec.txt. When bootstrap completes, Tor will be ready to build
-      internal circuits. If a future consensus contains Exits, exit
-      circuits may become available. Fixes part of bug 13718; bugfix on
-      0.2.4.10-alpha. Patch by "teor".
-    - Decrease minimum consensus interval to 10 seconds when
-      TestingTorNetwork is set, or 5 seconds for the first consensus.
-      Fix assumptions throughout the code that assume larger intervals.
-      Fixes bugs 13718 and 13823; bugfix on 0.2.0.3-alpha. Patch
-      by "teor".
-    - Avoid excluding guards from path building in minimal test
-      networks, when we're in a test network and excluding guards would
-      exclude all relays. This typically occurs in incredibly small tor
-      networks, and those using "TestingAuthVoteGuard *". Fixes part of
-      bug 13718; bugfix on 0.1.1.11-alpha. Patch by "teor".
-
-  o Minor bugfixes (testing):
-    - Avoid a side-effect in a tor_assert() in the unit tests. Fixes bug
-      15188; bugfix on 0.1.2.3-alpha. Patch from Tom van der Woerdt.
-    - Stop spawn test failures due to a race condition between the
-      SIGCHLD handler updating the process status, and the test reading
-      it. Fixes bug 13291; bugfix on 0.2.3.3-alpha.
-    - Avoid passing an extra backslash when creating a temporary
-      directory for running the unit tests on Windows. Fixes bug 12392;
-      bugfix on 0.2.2.25-alpha. Patch from Gisle Vanem.
-
-  o Minor bugfixes (TLS):
-    - Check more thoroughly throughout the TLS code for possible
-      unlogged TLS errors. Possible diagnostic or fix for bug 13319.
-
-  o Minor bugfixes (transparent proxy):
-    - Use getsockname, not getsockopt, to retrieve the address for a
-      TPROXY-redirected connection. Fixes bug 13796; bugfix
-      on 0.2.5.2-alpha.
-
-  o Minor bugfixes (windows):
-    - Remove code to special-case handling of NTE_BAD_KEYSET when
-      acquiring windows CryptoAPI context. This error can't actually
-      occur for the parameters we're providing. Fixes bug 10816; bugfix
-      on 0.0.2pre26.
-
-  o Minor bugfixes (zlib):
-    - Avoid truncating a zlib stream when trying to finalize it with an
-      empty output buffer. Fixes bug 11824; bugfix on 0.1.1.23.
-
-  o Code simplification and refactoring:
-    - Change the entry_is_live() function to take named bitfield
-      elements instead of an unnamed list of booleans. Closes
-      ticket 12202.
-    - Refactor and unit-test entry_is_time_to_retry() in entrynodes.c.
-      Resolves ticket 12205.
-    - Use calloc and reallocarray functions instead of multiply-
-      then-malloc. This makes it less likely for us to fall victim to an
-      integer overflow attack when allocating. Resolves ticket 12855.
-    - Use the standard macro name SIZE_MAX, instead of our
-      own SIZE_T_MAX.
-    - Document usage of the NO_DIRINFO and ALL_DIRINFO flags clearly in
-      functions which take them as arguments. Replace 0 with NO_DIRINFO
-      in a function call for clarity. Seeks to prevent future issues
-      like 13163.
-    - Avoid 4 null pointer errors under clang static analysis by using
-      tor_assert() to prove that the pointers aren't null. Fixes
-      bug 13284.
-    - Rework the API of policies_parse_exit_policy() to use a bitmask to
-      represent parsing options, instead of a confusing mess of
-      booleans. Resolves ticket 8197.
-    - Introduce a helper function to parse ExitPolicy in
-      or_options_t structure.
-    - Move fields related to isolating and configuring client ports into
-      a shared structure. Previously, they were duplicated across
-      port_cfg_t, listener_connection_t, and edge_connection_t. Failure
-      to copy them correctly had been the cause of at least one bug in
-      the past. Closes ticket 8546.
-    - Refactor the get_interface_addresses_raw() doom-function into
-      multiple smaller and simpler subfunctions. Cover the resulting
-      subfunctions with unit-tests. Fixes a significant portion of
-      issue 12376.
-    - Remove workaround in dirserv_thinks_router_is_hs_dir() that was
-      only for version <= 0.2.2.24 which is now deprecated. Closes
-      ticket 14202.
-    - Remove a test for a long-defunct broken version-one
-      directory server.
-    - Refactor main loop to extract the 'loop' part. This makes it
-      easier to run Tor under Shadow. Closes ticket 15176.
-    - Stop using can_complete_circuits as a global variable; access it
-      with a function instead.
-    - Avoid using operators directly as macro arguments: this lets us
-      apply coccinelle transformations to our codebase more directly.
-      Closes ticket 13172.
-    - Combine the functions used to parse ClientTransportPlugin and
-      ServerTransportPlugin into a single function. Closes ticket 6456.
-    - Add inline functions and convenience macros for inspecting channel
-      state. Refactor the code to use convenience macros instead of
-      checking channel state directly. Fixes issue 7356.
-    - Document all members of was_router_added_t and rename
-      ROUTER_WAS_NOT_NEW to ROUTER_IS_ALREADY_KNOWN to make it less
-      confusable with ROUTER_WAS_TOO_OLD. Fixes issue 13644.
-    - In connection_exit_begin_conn(), use END_CIRC_REASON_TORPROTOCOL
-      constant instead of hardcoded value. Fixes issue 13840.
-    - Refactor our generic strmap and digestmap types into a single
-      implementation, so that we can add a new digest256map
-      type trivially.
-
-  o Documentation:
-    - Add a doc/TUNING document with tips for handling large numbers of
-      TCP connections when running busy Tor relay. Update the warning
-      message to point to this file when running out of sockets
-      operating system is allowing to use simultaneously. Resolves
-      ticket 9708.
-    - Adding section on OpenBSD to our TUNING document. Thanks to mmcc
-      for writing the OpenBSD-specific tips. Resolves ticket 13702.
-    - Make the tor-resolve documentation match its help string and its
-      options. Resolves part of ticket 14325.
-    - Log a more useful error message from tor-resolve when failing to
-      look up a hidden service address. Resolves part of ticket 14325.
-    - Document the bridge-authority-only 'networkstatus-bridges' file.
-      Closes ticket 13713; patch from "tom".
-    - Fix typo in PredictedPortsRelevanceTime option description in
-      manpage. Resolves issue 13707.
-    - Stop suggesting that users specify relays by nickname: it isn't a
-      good idea. Also, properly cross-reference how to specify relays in
-      all parts of manual documenting options that take a list of
-      relays. Closes ticket 13381.
-    - Clarify the HiddenServiceDir option description in manpage to make
-      it clear that relative paths are taken with respect to the current
-      working directory. Also clarify that this behavior is not
-      guaranteed to remain indefinitely. Fixes issue 13913.
-
-  o Distribution (systemd):
-    - systemd unit file: only allow tor to write to /var/lib/tor and
-      /var/log/tor. The rest of the filesystem is accessible for reading
-      only. Patch by intrigeri; resolves ticket 12751.
-    - systemd unit file: ensure that the process and all its children
-      can never gain new privileges. Patch by intrigeri; resolves
-      ticket 12939.
-    - systemd unit file: set up /var/run/tor as writable for the Tor
-      service. Patch by intrigeri; resolves ticket 13196.
-
-  o Downgraded warnings:
-    - Don't warn when we've attempted to contact a relay using the wrong
-      ntor onion key. Closes ticket 9635.
-
-  o Removed code:
-    - Remove some lingering dead code that once supported mempools.
-      Mempools were disabled by default in 0.2.5, and removed entirely
-      in 0.2.6.3-alpha. Closes more of ticket 14848; patch
-      by "cypherpunks".
-
-  o Removed features (directory authorities):
-    - Remove code that prevented authorities from listing Tor relays
-      affected by CVE-2011-2769 as guards. These relays are already
-      rejected altogether due to the minimum version requirement of
-      0.2.3.16-alpha. Closes ticket 13152.
-    - The "AuthDirRejectUnlisted" option no longer has any effect, as
-      the fingerprints file (approved-routers) has been deprecated.
-    - Directory authorities do not support being Naming dirauths anymore.
-      The "NamingAuthoritativeDir" config option is now obsolete.
-    - Directory authorities do not support giving out the BadDirectory
-      flag anymore.
-    - Directory authorities no longer advertise or support consensus
-      methods 1 through 12 inclusive. These consensus methods were
-      obsolete and/or insecure: maintaining the ability to support them
-      served no good purpose. Implements part of proposal 215; closes
-      ticket 10163.
-
-  o Removed features:
-    - To avoid confusion with the "ExitRelay" option, "ExitNode" is no
-      longer silently accepted as an alias for "ExitNodes".
-    - The --enable-mempool and --enable-buf-freelists options, which
-      were originally created to work around bad malloc implementations,
-      no longer exist. They were off-by-default in 0.2.5. Closes
-      ticket 14848.
-    - We no longer remind the user about configuration options that have
-      been obsolete since 0.2.3.x or earlier. Patch by Adrien Bak.
-    - Remove our old, non-weighted bandwidth-based node selection code.
-      Previously, we used it as a fallback when we couldn't perform
-      weighted bandwidth-based node selection. But that would only
-      happen in the cases where we had no consensus, or when we had a
-      consensus generated by buggy or ancient directory authorities. In
-      either case, it's better to use the more modern, better maintained
-      algorithm, with reasonable defaults for the weights. Closes
-      ticket 13126.
-    - Remove the --disable-curve25519 configure option. Relays and
-      clients now are required to support curve25519 and the
-      ntor handshake.
-    - The old "StrictEntryNodes" and "StrictExitNodes" options, which
-      used to be deprecated synonyms for "StrictNodes", are now marked
-      obsolete. Resolves ticket 12226.
-    - Clients don't understand the BadDirectory flag in the consensus
-      anymore, and ignore it.
-
-  o Removed platform support:
-    - We no longer include special code to build on Windows CE; as far
-      as we know, nobody has used Tor on Windows CE in a very long time.
-      Closes ticket 11446.
-
-  o Testing (test-network.sh):
-    - Stop using "echo -n", as some shells' built-in echo doesn't
-      support "-n". Instead, use "/bin/echo -n". Partially fixes
-      bug 13161.
-    - Stop an apparent test-network hang when used with make -j2. Fixes
-      bug 13331.
-    - Add a --delay option to test-network.sh, which configures the
-      delay before the chutney network tests for data transmission.
-      Partially implements ticket 13161.
-
-  o Testing:
-    - Test that tor does not fail when key files are zero-length. Check
-      that tor generates new keys, and overwrites the empty key files.
-    - Test that tor generates new keys when keys are missing
-      (existing behavior).
-    - Test that tor does not overwrite key files that already contain
-      data (existing behavior). Tests bug 13111. Patch by "teor".
-    - New "make test-stem" target to run stem integration tests.
-      Requires that the "STEM_SOURCE_DIR" environment variable be set.
-      Closes ticket 14107.
-    - Make the test_cmdline_args.py script work correctly on Windows.
-      Patch from Gisle Vanem.
-    - Move the slower unit tests into a new "./src/test/test-slow"
-      binary that can be run independently of the other tests. Closes
-      ticket 13243.
-    - New tests for many parts of channel, relay, and circuitmux
-      functionality. Code by Andrea; part of 9262.
-    - New tests for parse_transport_line(). Part of ticket 6456.
-    - In the unit tests, use chgrp() to change the group of the unit
-      test temporary directory to the current user, so that the sticky
-      bit doesn't interfere with tests that check directory groups.
-      Closes 13678.
-    - Add unit tests for resolve_my_addr(). Part of ticket 12376; patch
-      by 'rl1987'.
-    - Refactor the function that chooses guard nodes so that it can more
-      easily be tested; write some tests for it.
-    - Fix and re-enable the fgets_eagain unit test. Fixes bug 12503;
-      bugfix on 0.2.3.1-alpha. Patch from "cypherpunks."
-    - Create unit tests for format_time_interval(). With bug 13393.
-    - Add unit tests for tor_timegm signed overflow, tor_timegm and
-      parse_rfc1123_time validity checks, correct_tm year clamping. Unit
-      tests (visible) fixes in bug 13476.
-    - Add a "coverage-html" make target to generate HTML-visualized
-      coverage results when building with --enable-coverage. (Requires
-      lcov.) Patch from Kevin Murray.
-    - Enable the backtrace handler (where supported) when running the
-      unit tests.
-    - Revise all unit tests that used the legacy test_* macros to
-      instead use the recommended tt_* macros. This patch was generated
-      with coccinelle, to avoid manual errors. Closes ticket 13119.
-
-Changes in version 0.2.5.11 - 2015-03-17
-  Tor 0.2.5.11 is the second stable release in the 0.2.5 series.
-
-  It backports several bugfixes from the 0.2.6 branch, including a
-  couple of medium-level security fixes for relays and exit nodes.
-  It also updates the list of directory authorities.
-
-  o Directory authority changes:
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-
-  o Major bugfixes (crash, OSX, security):
-    - Fix a remote denial-of-service opportunity caused by a bug in
-      OSX's _strlcat_chk() function. Fixes bug 15205; bug first appeared
-      in OSX 10.9.
-
-  o Major bugfixes (relay, stability, possible security):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout was passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from 'cypherpunks'.
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Major bugfixes (exit node stability):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (Linux seccomp2 sandbox):
-    - Upon receiving sighup with the seccomp2 sandbox enabled, do not
-      crash during attempts to call wait4. Fixes bug 15088; bugfix on
-      0.2.5.1-alpha. Patch from "sanic".
-
-  o Minor features (controller):
-    - New "GETINFO bw-event-cache" to get information about recent
-      bandwidth events. Closes ticket 14128. Useful for controllers to
-      get recent bandwidth history after the fix for ticket 13988.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-  o Minor bugfixes (client, automapping):
-    - Avoid crashing on torrc lines for VirtualAddrNetworkIPv[4|6] when
-      no value follows the option. Fixes bug 14142; bugfix on
-      0.2.4.7-alpha. Patch by "teor".
-    - Fix a memory leak when using AutomapHostsOnResolve. Fixes bug
-      14195; bugfix on 0.1.0.1-rc.
-
-  o Minor bugfixes (compilation):
-    - Build without warnings with the stock OpenSSL srtp.h header, which
-      has a duplicate declaration of SSL_get_selected_srtp_profile().
-      Fixes bug 14220; this is OpenSSL's bug, not ours.
-
-  o Minor bugfixes (directory authority):
-    - Allow directory authorities to fetch more data from one another if
-      they find themselves missing lots of votes. Previously, they had
-      been bumping against the 10 MB queued data limit. Fixes bug 14261;
-      bugfix on 0.1.2.5-alpha.
-    - Enlarge the buffer to read bwauth generated files to avoid an
-      issue when parsing the file in dirserv_read_measured_bandwidths().
-      Fixes bug 14125; bugfix on 0.2.2.1-alpha.
-
-  o Minor bugfixes (statistics):
-    - Increase period over which bandwidth observations are aggregated
-      from 15 minutes to 4 hours. Fixes bug 13988; bugfix on 0.0.8pre1.
-
-  o Minor bugfixes (preventative security, C safety):
-    - When reading a hexadecimal, base-32, or base-64 encoded value from
-      a string, always overwrite the whole output buffer. This prevents
-      some bugs where we would look at (but fortunately, not reveal)
-      uninitialized memory on the stack. Fixes bug 14013; bugfix on all
-      versions of Tor.
-
-
-Changes in version 0.2.4.26 - 2015-03-17
-  Tor 0.2.4.26 includes an updated list of directory authorities.  It
-  also backports a couple of stability and security bugfixes from 0.2.5
-  and beyond.
-
-  o Directory authority changes:
-    - Remove turtles as a directory authority.
-    - Add longclaw as a new (v3) directory authority. This implements
-      ticket 13296. This keeps the directory authority count at 9.
-    - The directory authority Faravahar has a new IP address. This
-      closes ticket 14487.
-
-  o Major bugfixes (exit node stability, also in 0.2.6.3-alpha):
-    - Fix an assertion failure that could occur under high DNS load.
-      Fixes bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr";
-      diagnosed and fixed by "cypherpunks".
-
-  o Major bugfixes (relay, stability, possible security, also in 0.2.6.4-rc):
-    - Fix a bug that could lead to a relay crashing with an assertion
-      failure if a buffer of exactly the wrong layout was passed to
-      buf_pullup() at exactly the wrong time. Fixes bug 15083; bugfix on
-      0.2.0.10-alpha. Patch from 'cypherpunks'.
-    - Do not assert if the 'data' pointer on a buffer is advanced to the
-      very end of the buffer; log a BUG message instead. Only assert if
-      it is past that point. Fixes bug 15083; bugfix on 0.2.0.10-alpha.
-
-  o Minor features (geoip):
-    - Update geoip to the March 3 2015 Maxmind GeoLite2 Country database.
-    - Update geoip6 to the March 3 2015 Maxmind GeoLite2
-      Country database.
-
-Changes in version 0.2.5.10 - 2014-10-24
-  Tor 0.2.5.10 is the first stable release in the 0.2.5 series.
-
-  It adds several new security features, including improved
-  denial-of-service resistance for relays, new compiler hardening
-  options, and a system-call sandbox for hardened installations on Linux
-  (requires seccomp2). The controller protocol has several new features,
-  resolving IPv6 addresses should work better than before, and relays
-  should be a little more CPU-efficient. We've added support for more
-  OpenBSD and FreeBSD transparent proxy types. We've improved the build
-  system and testing infrastructure to allow unit testing of more parts
-  of the Tor codebase. Finally, we've addressed several nagging pluggable
-  transport usability issues, and included numerous other small bugfixes
-  and features mentioned below.
-
-  This release marks end-of-life for Tor 0.2.3.x; those Tor versions
-  have accumulated many known flaws; everyone should upgrade.
-
-  o Major features (security):
-    - The ntor handshake is now on-by-default, no matter what the
-      directory authorities recommend. Implements ticket 8561.
-    - Make the "tor-gencert" tool used by directory authority operators
-      create 2048-bit signing keys by default (rather than 1024-bit, since
-      1024-bit is uncomfortably small these days). Addresses ticket 10324.
-    - Warn about attempts to run hidden services and relays in the same
-      process: that's probably not a good idea. Closes ticket 12908.
-    - Disable support for SSLv3. All versions of OpenSSL in use with Tor
-      today support TLS 1.0 or later, so we can safely turn off support
-      for this old (and insecure) protocol. Fixes bug 13426.
-
-  o Major features (relay security, DoS-resistance):
-    - When deciding whether we have run out of memory and we need to
-      close circuits, also consider memory allocated in buffers for
-      streams attached to each circuit.
-
-      This change, which extends an anti-DoS feature introduced in
-      0.2.4.13-alpha and improved in 0.2.4.14-alpha, lets Tor exit relays
-      better resist more memory-based DoS attacks than before. Since the
-      MaxMemInCellQueues option now applies to all queues, it is renamed
-      to MaxMemInQueues. This feature fixes bug 10169.
-    - Avoid hash-flooding denial-of-service attacks by using the secure
-      SipHash-2-4 hash function for our hashtables. Without this
-      feature, an attacker could degrade performance of a targeted
-      client or server by flooding their data structures with a large
-      number of entries to be stored at the same hash table position,
-      thereby slowing down the Tor instance. With this feature, hash
-      table positions are derived from a randomized cryptographic key,
-      and an attacker cannot predict which entries will collide. Closes
-      ticket 4900.
-    - If you don't specify MaxMemInQueues yourself, Tor now tries to
-      pick a good value based on your total system memory. Previously,
-      the default was always 8 GB. You can still override the default by
-      setting MaxMemInQueues yourself. Resolves ticket 11396.
-
-  o Major features (bridges and pluggable transports):
-    - Add support for passing arguments to managed pluggable transport
-      proxies. Implements ticket 3594.
-    - Bridges now track GeoIP information and the number of their users
-      even when pluggable transports are in use, and report usage
-      statistics in their extra-info descriptors. Resolves tickets 4773
-      and 5040.
-    - Don't launch pluggable transport proxies if we don't have any
-      bridges configured that would use them. Now we can list many
-      pluggable transports, and Tor will dynamically start one when it
-      hears a bridge address that needs it. Resolves ticket 5018.
-    - The bridge directory authority now assigns status flags (Stable,
-      Guard, etc) to bridges based on thresholds calculated over all
-      Running bridges. Now bridgedb can finally make use of its features
-      to e.g. include at least one Stable bridge in its answers. Fixes
-      bug 9859.
-
-  o Major features (controller):
-    - Extend ORCONN controller event to include an "ID" parameter,
-      and add four new controller event types CONN_BW, CIRC_BW,
-      CELL_STATS, and TB_EMPTY that show connection and circuit usage.
-      The new events are emitted in private Tor networks only, with the
-      goal of being able to better track performance and load during
-      full-network simulations. Implements proposal 218 and ticket 7359.
-
-  o Major features (relay performance):
-    - Speed up server-side lookups of rendezvous and introduction point
-      circuits by using hashtables instead of linear searches. These
-      functions previously accounted between 3 and 7% of CPU usage on
-      some busy relays. Resolves ticket 9841.
-    - Avoid wasting CPU when extending a circuit over a channel that is
-      nearly out of circuit IDs. Previously, we would do a linear scan
-      over possible circuit IDs before finding one or deciding that we
-      had exhausted our possibilities. Now, we try at most 64 random
-      circuit IDs before deciding that we probably won't succeed. Fixes
-      a possible root cause of ticket 11553.
-
-  o Major features (seccomp2 sandbox, Linux only):
-    - Use the seccomp2 syscall filtering facility on Linux to limit
-      which system calls Tor can invoke. This is an experimental,
-      Linux-only feature to provide defense-in-depth against unknown
-      attacks. To try turning it on, set "Sandbox 1" in your torrc
-      file. Please be ready to report bugs. We hope to add support
-      for better sandboxing in the future, including more fine-grained
-      filters, better division of responsibility, and support for more
-      platforms. This work has been done by Cristian-Matei Toader for
-      Google Summer of Code. Resolves tickets 11351 and 11465.
-
-  o Major features (testing networks):
-    - Make testing Tor networks bootstrap better: lower directory fetch
-      retry schedules and maximum interval without directory requests,
-      and raise maximum download tries. Implements ticket 6752.
-    - Add make target 'test-network' to run tests on a Chutney network.
-      Implements ticket 8530.
-
-  o Major features (other):
-    - On some platforms (currently: recent OSX versions, glibc-based
-      platforms that support the ELF format, and a few other
-      Unix-like operating systems), Tor can now dump stack traces
-      when a crash occurs or an assertion fails. By default, traces
-      are dumped to stderr (if possible) and to any logs that are
-      reporting errors. Implements ticket 9299.
-
-  o Deprecated versions:
-    - Tor 0.2.3.x has reached end-of-life; it has received no patches or
-      attention for some while.
-
-  o Major bugfixes (security, directory authorities):
-    - Directory authorities now include a digest of each relay's
-      identity key as a part of its microdescriptor.
-
-      This is a workaround for bug 11743 (reported by "cypherpunks"),
-      where Tor clients do not support receiving multiple
-      microdescriptors with the same SHA256 digest in the same
-      consensus. When clients receive a consensus like this, they only
-      use one of the relays. Without this fix, a hostile relay could
-      selectively disable some client use of target relays by
-      constructing a router descriptor with a different identity and the
-      same microdescriptor parameters and getting the authorities to
-      list it in a microdescriptor consensus. This fix prevents an
-      attacker from causing a microdescriptor collision, because the
-      router's identity is not forgeable.
-
-  o Major bugfixes (openssl bug workaround):
-    - Avoid crashing when using OpenSSL version 0.9.8zc, 1.0.0o, or
-      1.0.1j, built with the 'no-ssl3' configuration option. Fixes
-      bug 13471. This is a workaround for an OpenSSL bug.
-
-  o Major bugfixes (client):
-    - Perform circuit cleanup operations even when circuit
-      construction operations are disabled (because the network is
-      disabled, or because there isn't enough directory information).
-      Previously, when we were not building predictive circuits, we
-      were not closing expired circuits either. Fixes bug 8387; bugfix on
-      0.1.1.11-alpha. This bug became visible in 0.2.4.10-alpha when we
-      became more strict about when we have "enough directory information
-      to build circuits".
-
-  o Major bugfixes (client, pluggable transports):
-    - When managing pluggable transports, use OS notification facilities
-      to learn if they have crashed, and don't attempt to kill any
-      process that has already exited. Fixes bug 8746; bugfix
-      on 0.2.3.6-alpha.
-
-  o Major bugfixes (relay denial of service):
-    - Instead of writing destroy cells directly to outgoing connection
-      buffers, queue them and intersperse them with other outgoing cells.
-      This can prevent a set of resource starvation conditions where too
-      many pending destroy cells prevent data cells from actually getting
-      delivered. Reported by "oftc_must_be_destroyed". Fixes bug 7912;
-      bugfix on 0.2.0.1-alpha.
-
-  o Major bugfixes (relay):
-    - Avoid queuing or sending destroy cells for circuit ID zero when we
-      fail to send a CREATE cell. Fixes bug 12848; bugfix on 0.0.8pre1.
-      Found and fixed by "cypherpunks".
-    - Fix ORPort reachability detection on relays running behind a
-      proxy, by correctly updating the "local" mark on the controlling
-      channel when changing the address of an or_connection_t after the
-      handshake. Fixes bug 12160; bugfix on 0.2.4.4-alpha.
-    - Use a direct dirport connection when uploading non-anonymous
-      descriptors to the directory authorities. Previously, relays would
-      incorrectly use tunnel connections under a fairly wide variety of
-      circumstances. Fixes bug 11469; bugfix on 0.2.4.3-alpha.
-    - When a circuit accidentally has the same circuit ID for its
-      forward and reverse direction, correctly detect the direction of
-      cells using that circuit. Previously, this bug made roughly one
-      circuit in a million non-functional. Fixes bug 12195; this is a
-      bugfix on every version of Tor.
-
-  o Minor features (security):
-    - New --enable-expensive-hardening option to enable security
-      hardening options that consume nontrivial amounts of CPU and
-      memory. Right now, this includes AddressSanitizer and UbSan, which
-      are supported in newer versions of GCC and Clang. Closes ticket
-      11477.
-    - Authorities now assign the Guard flag to the fastest 25% of the
-      network (it used to be the fastest 50%). Also raise the consensus
-      weight that guarantees the Guard flag from 250 to 2000. For the
-      current network, this results in about 1100 guards, down from 2500.
-      This step paves the way for moving the number of entry guards
-      down to 1 (proposal 236) while still providing reasonable expected
-      performance for most users. Implements ticket 12690.
-
-  o Minor features (security, memory management):
-    - Memory allocation tricks (mempools and buffer freelists) are now
-      disabled by default. You can turn them back on with
-      --enable-mempools and --enable-buf-freelists respectively. We're
-      disabling these features because malloc performance is good enough
-      on most platforms, and a similar feature in OpenSSL exacerbated
-      exploitation of the Heartbleed attack. Resolves ticket 11476.
-
-  o Minor features (bridge client):
-    - Report a more useful failure message when we can't connect to a
-      bridge because we don't have the right pluggable transport
-      configured. Resolves ticket 9665. Patch from Fábio J. Bertinatto.
-
-  o Minor features (bridge):
-    - Add an ExtORPortCookieAuthFileGroupReadable option to make the
-      cookie file for the ExtORPort g+r by default.
-
-  o Minor features (bridges, pluggable transports):
-    - Bridges now write the SHA1 digest of their identity key
-      fingerprint (that is, a hash of a hash of their public key) to
-      notice-level logs, and to a new hashed-fingerprint file. This
-      information will help bridge operators look up their bridge in
-      Globe and similar tools. Resolves ticket 10884.
-    - Improve the message that Tor displays when running as a bridge
-      using pluggable transports without an Extended ORPort listener.
-      Also, log the message in the log file too. Resolves ticket 11043.
-    - Add threshold cutoffs to the networkstatus document created by
-      the Bridge Authority. Fixes bug 1117.
-    - On Windows, spawn background processes using the CREATE_NO_WINDOW
-      flag. Now Tor Browser Bundle 3.5 with pluggable transports enabled
-      doesn't pop up a blank console window. (In Tor Browser Bundle 2.x,
-      Vidalia set this option for us.) Implements ticket 10297.
-
-  o Minor features (build):
-    - The configure script has a --disable-seccomp option to turn off
-      support for libseccomp on systems that have it, in case it (or
-      Tor's use of it) is broken. Resolves ticket 11628.
-    - Assume that a user using ./configure --host wants to cross-compile,
-      and give an error if we cannot find a properly named
-      tool-chain. Add a --disable-tool-name-check option to proceed
-      nevertheless. Addresses ticket 9869. Patch by Benedikt Gollatz.
-    - If we run ./configure and the compiler recognizes -fstack-protector
-      but the linker rejects it, warn the user about a potentially missing
-      libssp package. Addresses ticket 9948. Patch from Benedikt Gollatz.
-    - Add support for `--library-versions` flag. Implements ticket 6384.
-    - Return the "unexpected sendme" warnings to a warn severity, but make
-      them rate limited, to help diagnose ticket 8093.
-    - Detect a missing asciidoc, and warn the user about it, during
-      configure rather than at build time. Fixes issue 6506. Patch from
-      Arlo Breault.
-
-  o Minor features (client):
-    - Add a new option, PredictedPortsRelevanceTime, to control how long
-      after having received a request to connect to a given port Tor
-      will try to keep circuits ready in anticipation of future requests
-      for that port. Patch from "unixninja92"; implements ticket 9176.
-
-  o Minor features (config options and command line):
-    - Add an --allow-missing-torrc commandline option that tells Tor to
-      run even if the configuration file specified by -f is not available.
-      Implements ticket 10060.
-    - Add support for the TPROXY transparent proxying facility on Linux.
-      See documentation for the new TransProxyType option for more
-      details. Implementation by "thomo". Closes ticket 10582.
-
-  o Minor features (config options):
-    - Config (torrc) lines now handle fingerprints which are missing
-      their initial '$'. Resolves ticket 4341; improvement over 0.0.9pre5.
-    - Support a --dump-config option to print some or all of the
-      configured options. Mainly useful for debugging the command-line
-      option parsing code. Helps resolve ticket 4647.
-    - Raise awareness of safer logging: notify user of potentially
-      unsafe config options, like logging more verbosely than severity
-      "notice" or setting SafeLogging to 0. Resolves ticket 5584.
-    - Add a new configuration option TestingV3AuthVotingStartOffset
-      that bootstraps a network faster by changing the timing for
-      consensus votes. Addresses ticket 8532.
-    - Add a new torrc option "ServerTransportOptions" that allows
-      bridge operators to pass configuration parameters to their
-      pluggable transports. Resolves ticket 8929.
-    - The config (torrc) file now accepts bandwidth and space limits in
-      bits as well as bytes. (Anywhere that you can say "2 Kilobytes",
-      you can now say "16 kilobits", and so on.) Resolves ticket 9214.
-      Patch by CharlieB.
-
-  o Minor features (controller):
-    - Make the entire exit policy available from the control port via
-      GETINFO exit-policy/*. Implements enhancement 7952. Patch from
-      "rl1987".
-    - Because of the fix for ticket 11396, the real limit for memory
-      usage may no longer match the configured MaxMemInQueues value. The
-      real limit is now exposed via GETINFO limits/max-mem-in-queues.
-    - Add a new "HS_DESC" controller event that reports activities
-      related to hidden service descriptors. Resolves ticket 8510.
-    - New "DROPGUARDS" controller command to forget all current entry
-      guards. Not recommended for ordinary use, since replacing guards
-      too frequently makes several attacks easier. Resolves ticket 9934;
-      patch from "ra".
-    - Implement the TRANSPORT_LAUNCHED control port event that
-      notifies controllers about new launched pluggable
-      transports. Resolves ticket 5609.
-
-  o Minor features (diagnostic):
-    - When logging a warning because of bug 7164, additionally check the
-      hash table for consistency (as proposed on ticket 11737). This may
-      help diagnose bug 7164.
-    - When we log a heartbeat, log how many one-hop circuits we have
-      that are at least 30 minutes old, and log status information about
-      a few of them. This is an attempt to track down bug 8387.
-    - When encountering an unexpected CR while writing text to a file on
-      Windows, log the name of the file. Should help diagnosing
-      bug 11233.
-    - Give more specific warnings when a client notices that an onion
-      handshake has failed. Fixes ticket 9635.
-    - Add significant new logging code to attempt to diagnose bug 12184,
-      where relays seem to run out of available circuit IDs.
-    - Improve the diagnostic log message for bug 8387 even further to
-      try to improve our odds of figuring out why one-hop directory
-      circuits sometimes do not get closed.
-    - Add more log messages to diagnose bug 7164, which causes
-      intermittent "microdesc_free() called but md was still referenced"
-      warnings. We now include more information, to figure out why we
-      might be cleaning a microdescriptor for being too old if it's
-      still referenced by a live node_t object.
-    - Log current accounting state (bytes sent and received + remaining
-      time for the current accounting period) in the relay's heartbeat
-      message. Implements ticket 5526; patch from Peter Retzlaff.
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 7 2014 Maxmind GeoLite2
-      Country database.
-
-  o Minor features (interface):
-    - Generate a warning if any ports are listed in the SocksPolicy,
-      DirPolicy, AuthDirReject, AuthDirInvalid, AuthDirBadDir, or
-      AuthDirBadExit options. (These options only support address
-      ranges.) Fixes part of ticket 11108.
-
-  o Minor features (kernel API usage):
-    - Use the SOCK_NONBLOCK socket type, if supported, to open nonblocking
-      sockets in a single system call. Implements ticket 5129.
-
-  o Minor features (log messages):
-    - When ServerTransportPlugin is set on a bridge, Tor can write more
-      useful statistics about bridge use in its extrainfo descriptors,
-      but only if the Extended ORPort ("ExtORPort") is set too. Add a
-      log message to inform the user in this case. Resolves ticket 9651.
-    - When receiving a new controller connection, log the origin address.
-      Resolves ticket 9698; patch from "sigpipe".
-    - When logging OpenSSL engine status at startup, log the status of
-      more engines. Fixes ticket 10043; patch from Joshua Datko.
-
-  o Minor features (log verbosity):
-    - Demote the message that we give when a flushing connection times
-      out for too long from NOTICE to INFO. It was usually meaningless.
-      Resolves ticket 5286.
-    - Don't log so many notice-level bootstrapping messages at startup
-      about downloading descriptors. Previously, we'd log a notice
-      whenever we learned about more routers. Now, we only log a notice
-      at every 5% of progress. Fixes bug 9963.
-    - Warn less verbosely when receiving a malformed
-      ESTABLISH_RENDEZVOUS cell. Fixes ticket 11279.
-
-  o Minor features (performance):
-    - If we're using the pure-C 32-bit curve25519_donna implementation
-      of curve25519, build it with the -fomit-frame-pointer option to
-      make it go faster on register-starved hosts. This improves our
-      handshake performance by about 6% on i386 hosts without nacl.
-      Closes ticket 8109.
-
-  o Minor features (relay):
-    - If a circuit timed out for at least 3 minutes, check if we have a
-      new external IP address, and publish a new descriptor with the new
-      IP address if it changed. Resolves ticket 2454.
-
-  o Minor features (testing):
-    - If Python is installed, "make check" now runs extra tests beyond
-      the unit test scripts.
-    - When bootstrapping a test network, sometimes very few relays get
-      the Guard flag. Now a new option "TestingDirAuthVoteGuard" can
-      specify a set of relays which should be voted Guard regardless of
-      their uptime or bandwidth. Addresses ticket 9206.
-
-  o Minor features (transparent proxy, *BSD):
-    - Support FreeBSD's ipfw firewall interface for TransPort ports on
-      FreeBSD. To enable it, set "TransProxyType ipfw". Resolves ticket
-      10267; patch from "yurivict".
-    - Support OpenBSD's divert-to rules with the pf firewall for
-      transparent proxy ports. To enable it, set "TransProxyType
-      pf-divert". This allows Tor to run a TransPort transparent proxy
-      port on OpenBSD 4.4 or later without root privileges. See the
-      pf.conf(5) manual page for information on configuring pf to use
-      divert-to rules. Closes ticket 10896; patch from Dana Koch.
-
-  o Minor bugfixes (bridge client):
-    - Stop accepting bridge lines containing hostnames. Doing so would
-      cause clients to perform DNS requests on the hostnames, which was
-      not sensible behavior. Fixes bug 10801; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (bridges):
-    - Avoid potential crashes or bad behavior when launching a
-      server-side managed proxy with ORPort or ExtORPort temporarily
-      disabled. Fixes bug 9650; bugfix on 0.2.3.16-alpha.
-    - Fix a bug where the first connection works to a bridge that uses a
-      pluggable transport with client-side parameters, but we don't send
-      the client-side parameters on subsequent connections. (We don't
-      use any pluggable transports with client-side parameters yet,
-      but ScrambleSuit will soon become the first one.) Fixes bug 9162;
-      bugfix on 0.2.0.3-alpha. Based on a patch from "rl1987".
-
-  o Minor bugfixes (build, auxiliary programs):
-    - Stop preprocessing the "torify" script with autoconf, since
-      it no longer refers to LOCALSTATEDIR. Fixes bug 5505; patch
-      from Guilhem.
-    - The tor-fw-helper program now follows the standard convention and
-      exits with status code "0" on success. Fixes bug 9030; bugfix on
-      0.2.3.1-alpha. Patch by Arlo Breault.
-    - Corrected ./configure advice for what openssl dev package you should
-      install on Debian. Fixes bug 9207; bugfix on 0.2.0.1-alpha.
-
-  o Minor bugfixes (client):
-    - Avoid "Tried to open a socket with DisableNetwork set" warnings
-      when starting a client with bridges configured and DisableNetwork
-      set. (Tor launcher starts Tor with DisableNetwork set the first
-      time it runs.) Fixes bug 10405; bugfix on 0.2.3.9-alpha.
-    - Improve the log message when we can't connect to a hidden service
-      because all of the hidden service directory nodes hosting its
-      descriptor are excluded. Improves on our fix for bug 10722, which
-      was a bugfix on 0.2.0.10-alpha.
-    - Raise a control port warning when we fail to connect to all of
-      our bridges. Previously, we didn't inform the controller, and
-      the bootstrap process would stall. Fixes bug 11069; bugfix on
-      0.2.1.2-alpha.
-    - Exit immediately when a process-owning controller exits.
-      Previously, tor relays would wait for a little while after their
-      controller exited, as if they had gotten an INT signal -- but this
-      was problematic, since there was no feedback for the user. To do a
-      clean shutdown, controllers should send an INT signal and give Tor
-      a chance to clean up. Fixes bug 10449; bugfix on 0.2.2.28-beta.
-    - Stop attempting to connect to bridges before our pluggable
-      transports are configured (harmless but resulted in some erroneous
-      log messages). Fixes bug 11156; bugfix on 0.2.3.2-alpha.
-    - Fix connections to IPv6 addresses over SOCKS5. Previously, we were
-      generating incorrect SOCKS5 responses, and confusing client
-      applications. Fixes bug 10987; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (client, DNSPort):
-    - When using DNSPort, try to respond to AAAA requests with AAAA
-      answers. Previously, we hadn't looked at the request type when
-      deciding which answer type to prefer. Fixes bug 10468; bugfix on
-      0.2.4.7-alpha.
-    - When receiving a DNS query for an unsupported record type, reply
-      with no answer rather than with a NOTIMPL error. This behavior
-      isn't correct either, but it will break fewer client programs, we
-      hope. Fixes bug 10268; bugfix on 0.2.0.1-alpha. Original patch
-      from "epoch".
-
-  o Minor bugfixes (client, logging during bootstrap):
-    - Only report the first fatal bootstrap error on a given OR
-      connection. This stops us from telling the controller bogus error
-      messages like "DONE". Fixes bug 10431; bugfix on 0.2.1.1-alpha.
-    - Avoid generating spurious warnings when starting with
-      DisableNetwork enabled. Fixes bug 11200 and bug 10405; bugfix on
-      0.2.3.9-alpha.
-
-  o Minor bugfixes (closing OR connections):
-    - If write_to_buf() in connection_write_to_buf_impl_() ever fails,
-      check if it's an or_connection_t and correctly call
-      connection_or_close_for_error() rather than
-      connection_mark_for_close() directly. Fixes bug 11304; bugfix on
-      0.2.4.4-alpha.
-    - When closing all connections on setting DisableNetwork to 1, use
-      connection_or_close_normally() rather than closing OR connections
-      out from under the channel layer. Fixes bug 11306; bugfix on
-      0.2.4.4-alpha.
-
-  o Minor bugfixes (code correctness):
-    - Previously we used two temporary files when writing descriptors to
-      disk; now we only use one. Fixes bug 1376.
-    - Remove an erroneous (but impossible and thus harmless) pointer
-      comparison that would have allowed compilers to skip a bounds
-      check in channeltls.c. Fixes bugs 10313 and 9980; bugfix on
-      0.2.0.10-alpha. Noticed by Jared L Wong and David Fifield.
-    - Fix an always-true assertion in pluggable transports code so it
-      actually checks what it was trying to check. Fixes bug 10046;
-      bugfix on 0.2.3.9-alpha. Found by "dcb".
-
-  o Minor bugfixes (command line):
-    - Use a single command-line parser for parsing torrc options on the
-      command line and for finding special command-line options to avoid
-      inconsistent behavior for torrc option arguments that have the same
-      names as command-line options. Fixes bugs 4647 and 9578; bugfix on
-      0.0.9pre5.
-    - No longer allow 'tor --hash-password' with no arguments. Fixes bug
-      9573; bugfix on 0.0.9pre5.
-
-  o Minor bugfixes (compilation):
-    - Compile correctly with builds and forks of OpenSSL (such as
-      LibreSSL) that disable compression. Fixes bug 12602; bugfix on
-      0.2.1.1-alpha. Patch from "dhill".
-    - Restore the ability to compile Tor with V2_HANDSHAKE_SERVER
-      turned off (that is, without support for v2 link handshakes). Fixes
-      bug 4677; bugfix on 0.2.3.2-alpha. Patch from "piet".
-    - In routerlist_assert_ok(), don't take the address of a
-      routerinfo's cache_info member unless that routerinfo is non-NULL.
-      Fixes bug 13096; bugfix on 0.1.1.9-alpha. Patch by "teor".
-    - Fix a large number of false positive warnings from the clang
-      analyzer static analysis tool. This should make real warnings
-      easier for clang analyzer to find. Patch from "teor". Closes
-      ticket 13036.
-    - Resolve GCC complaints on OpenBSD about discarding constness in
-      TO_{ORIGIN,OR}_CIRCUIT functions. Fixes part of bug 11633; bugfix
-      on 0.1.1.23. Patch from Dana Koch.
-    - Resolve clang complaints on OpenBSD with -Wshorten-64-to-32 due to
-      treatment of long and time_t as comparable types. Fixes part of
-      bug 11633. Patch from Dana Koch.
-    - When deciding whether to build the 64-bit curve25519
-      implementation, detect platforms where we can compile 128-bit
-      arithmetic but cannot link it. Fixes bug 11729; bugfix on
-      0.2.4.8-alpha. Patch from "conradev".
-    - Fix compilation when DNS_CACHE_DEBUG is enabled. Fixes bug 11761;
-      bugfix on 0.2.3.13-alpha. Found by "cypherpunks".
-    - Fix compilation with dmalloc. Fixes bug 11605; bugfix
-      on 0.2.4.10-alpha.
-    - Build and run correctly on systems like OpenBSD-current that have
-      patched OpenSSL to remove get_cipher_by_char and/or its
-      implementations. Fixes issue 13325.
-
-  o Minor bugfixes (controller and command-line):
-    - If changing a config option via "setconf" fails in a recoverable
-      way, we used to nonetheless write our new control ports to the
-      file described by the "ControlPortWriteToFile" option. Now we only
-      write out that file if we successfully switch to the new config
-      option. Fixes bug 5605; bugfix on 0.2.2.26-beta. Patch from "Ryman".
-
-  o Minor bugfixes (directory server):
-    - No longer accept malformed http headers when parsing urls from
-      headers. Now we reply with Bad Request ("400"). Fixes bug 2767;
-      bugfix on 0.0.6pre1.
-    - When sending a compressed set of descriptors or microdescriptors,
-      make sure to finalize the zlib stream. Previously, we would write
-      all the compressed data, but if the last descriptor we wanted to
-      send was missing or too old, we would not mark the stream as
-      finished. This caused problems for decompression tools. Fixes bug
-      11648; bugfix on 0.1.1.23.
-
-  o Minor bugfixes (hidden service):
-    - Only retry attempts to connect to a chosen rendezvous point 8
-      times, not 30. Fixes bug 4241; bugfix on 0.1.0.1-rc.
-
-  o Minor bugfixes (interface):
-    - Reject relative control socket paths and emit a warning. Previously,
-      single-component control socket paths would be rejected, but Tor
-      would not log why it could not validate the config. Fixes bug 9258;
-      bugfix on 0.2.3.16-alpha.
-
-  o Minor bugfixes (log messages):
-    - Fix a bug where clients using bridges would report themselves
-      as 50% bootstrapped even without a live consensus document.
-      Fixes bug 9922; bugfix on 0.2.1.1-alpha.
-    - Suppress a warning where, if there's only one directory authority
-      in the network, we would complain that votes and signatures cannot
-      be uploaded to other directory authorities. Fixes bug 10842;
-      bugfix on 0.2.2.26-beta.
-    - Report bootstrapping progress correctly when we're downloading
-      microdescriptors. We had updated our "do we have enough microdescs
-      to begin building circuits?" logic most recently in 0.2.4.10-alpha
-      (see bug 5956), but we left the bootstrap status event logic at
-      "how far through getting 1/4 of them are we?" Fixes bug 9958;
-      bugfix on 0.2.2.36, which is where they diverged (see bug 5343).
-
-  o Minor bugfixes (logging):
-    - Downgrade "Unexpected onionskin length after decryption" warning
-      to a protocol-warn, since there's nothing relay operators can do
-      about a client that sends them a malformed create cell. Resolves
-      bug 12996; bugfix on 0.0.6rc1.
-    - Log more specific warnings when we get an ESTABLISH_RENDEZVOUS
-      cell on a cannibalized or non-OR circuit. Resolves ticket 12997.
-    - When logging information about an EXTEND2 or EXTENDED2 cell, log
-      their names correctly. Fixes part of bug 12700; bugfix
-      on 0.2.4.8-alpha.
-    - When logging information about a relay cell whose command we don't
-      recognize, log its command as an integer. Fixes part of bug 12700;
-      bugfix on 0.2.1.10-alpha.
-    - Escape all strings from the directory connection before logging
-      them. Fixes bug 13071; bugfix on 0.1.1.15. Patch from "teor".
-    - Squelch a spurious LD_BUG message "No origin circuit for
-      successful SOCKS stream" in certain hidden service failure cases;
-      fixes bug 10616.
-    - Downgrade the severity of the 'unexpected sendme cell from client'
-      from 'warn' to 'protocol warning'. Closes ticket 8093.
-
-  o Minor bugfixes (misc code correctness):
-    - In munge_extrainfo_into_routerinfo(), check the return value of
-      memchr(). This would have been a serious issue if we ever passed
-      it a non-extrainfo. Fixes bug 8791; bugfix on 0.2.0.6-alpha. Patch
-      from Arlo Breault.
-    - On the chance that somebody manages to build Tor on a
-      platform where time_t is unsigned, correct the way that
-      microdesc_add_to_cache() handles negative time arguments.
-      Fixes bug 8042; bugfix on 0.2.3.1-alpha.
-    - Fix various instances of undefined behavior in channeltls.c,
-      tor_memmem(), and eventdns.c that would cause us to construct
-      pointers to memory outside an allocated object. (These invalid
-      pointers were not accessed, but C does not even allow them to
-      exist.) Fixes bug 10363; bugfixes on 0.1.1.1-alpha, 0.1.2.1-alpha,
-      0.2.0.10-alpha, and 0.2.3.6-alpha. Reported by "bobnomnom".
-    - Use the AddressSanitizer and Ubsan sanitizers (in clang-3.4) to
-      fix some miscellaneous errors in our tests and codebase. Fixes bug
-      11232. Bugfixes on versions back as far as 0.2.1.11-alpha.
-    - Always check return values for unlink, munmap, UnmapViewOfFile;
-      check strftime return values more often. In some cases all we can
-      do is report a warning, but this may help prevent deeper bugs from
-      going unnoticed. Closes ticket 8787; bugfixes on many, many tor
-      versions.
-    - Fix numerous warnings from the clang "scan-build" static analyzer.
-      Some of these are programming style issues; some of them are false
-      positives that indicated awkward code; some are undefined behavior
-      cases related to constructing (but not using) invalid pointers;
-      some are assumptions about API behavior; some are (harmlessly)
-      logging sizeof(ptr) bytes from a token when sizeof(*ptr) would be
-      correct; and one or two are genuine bugs that weren't reachable
-      from the rest of the program. Fixes bug 8793; bugfixes on many,
-      many tor versions.
-
-  o Minor bugfixes (node selection):
-    - If ExcludeNodes is set, consider non-excluded hidden service
-      directory servers before excluded ones. Do not consider excluded
-      hidden service directory servers at all if StrictNodes is
-      set. (Previously, we would sometimes decide to connect to those
-      servers, and then realize before we initiated a connection that
-      we had excluded them.) Fixes bug 10722; bugfix on 0.2.0.10-alpha.
-      Reported by "mr-4".
-    - If we set the ExitNodes option but it doesn't include any nodes
-      that have the Exit flag, we would choose not to bootstrap. Now we
-      bootstrap so long as ExitNodes includes nodes which can exit to
-      some port. Fixes bug 10543; bugfix on 0.2.4.10-alpha.
-
-  o Minor bugfixes (performance):
-    - Avoid a bug where every successful connection made us recompute
-      the flag telling us whether we have sufficient information to
-      build circuits. Previously, we would forget our cached value
-      whenever we successfully opened a channel (or marked a router as
-      running or not running for any other reason), regardless of
-      whether we had previously believed the router to be running. This
-      forced us to run an expensive update operation far too often.
-      Fixes bug 12170; bugfix on 0.1.2.1-alpha.
-    - Avoid using tor_memeq() for checking relay cell integrity. This
-      removes a possible performance bottleneck. Fixes part of bug
-      12169; bugfix on 0.2.1.31.
-
-  o Minor bugfixes (platform-specific):
-    - When dumping a malformed directory object to disk, save it in
-      binary mode on Windows, not text mode. Fixes bug 11342; bugfix on
-      0.2.2.1-alpha.
-    - Don't report failures from make_socket_reuseable() on incoming
-      sockets on OSX: this can happen when incoming connections close
-      early. Fixes bug 10081.
-
-  o Minor bugfixes (pluggable transports):
-    - Avoid another 60-second delay when starting Tor in a pluggable-
-      transport-using configuration when we already have cached
-      descriptors for our bridges. Fixes bug 11965; bugfix
-      on 0.2.3.6-alpha.
-
-  o Minor bugfixes (protocol correctness):
-    - When receiving a VERSIONS cell with an odd number of bytes, close
-      the connection immediately since the cell is malformed. Fixes bug
-      10365; bugfix on 0.2.0.10-alpha. Spotted by "bobnomnom"; fix by
-      "rl1987".
-
-  o Minor bugfixes (relay, other):
-    - We now drop CREATE cells for already-existent circuit IDs and for
-      zero-valued circuit IDs, regardless of other factors that might
-      otherwise have called for DESTROY cells. Fixes bug 12191; bugfix
-      on 0.0.8pre1.
-    - When rejecting DATA cells for stream_id zero, still count them
-      against the circuit's deliver window so that we don't fail to send
-      a SENDME. Fixes bug 11246; bugfix on 0.2.4.10-alpha.
-
-  o Minor bugfixes (relay, threading):
-    - Check return code on spawn_func() in cpuworker code, so that we
-      don't think we've spawned a nonworking cpuworker and write junk to
-      it forever. Fix related to bug 4345; bugfix on all released Tor
-      versions. Found by "skruffy".
-    - Use a pthread_attr to make sure that spawn_func() cannot return an
-      error while at the same time launching a thread. Fix related to
-      bug 4345; bugfix on all released Tor versions. Reported
-      by "cypherpunks".
-
-  o Minor bugfixes (relays and bridges):
-    - Avoid crashing on a malformed resolv.conf file when running a
-      relay using Libevent 1. Fixes bug 8788; bugfix on 0.1.1.23.
-    - Non-exit relays no longer launch mock DNS requests to check for
-      DNS hijacking. This has been unnecessary since 0.2.1.7-alpha, when
-      non-exit relays stopped servicing DNS requests. Fixes bug 965;
-      bugfix on 0.2.1.7-alpha. Patch from Matt Pagan.
-    - Bridges now report complete directory request statistics. Related
-      to bug 5824; bugfix on 0.2.2.1-alpha.
-    - Bridges now never collect statistics that were designed for
-      relays. Fixes bug 5824; bugfix on 0.2.3.8-alpha.
-
-  o Minor bugfixes (testing):
-    - Fix all valgrind warnings produced by the unit tests. There were
-      over a thousand memory leak warnings previously, mostly produced
-      by forgetting to free things in the unit test code. Fixes bug
-      11618, bugfixes on many versions of Tor.
-
-  o Minor bugfixes (tor-fw-helper):
-    - Give a correct log message when tor-fw-helper fails to launch.
-      (Previously, we would say something like "tor-fw-helper sent us a
-      string we could not parse".) Fixes bug 9781; bugfix
-      on 0.2.4.2-alpha.
-
-  o Minor bugfixes (trivial memory leaks):
-    - Fix a small memory leak when signing a directory object. Fixes bug
-      11275; bugfix on 0.2.4.13-alpha.
-    - Resolve some memory leaks found by coverity in the unit tests, on
-      exit in tor-gencert, and on a failure to compute digests for our
-      own keys when generating a v3 networkstatus vote. These leaks
-      should never have affected anyone in practice.
-
-  o Code simplification and refactoring:
-    - Remove some old fallback code designed to keep Tor clients working
-      in a network with only two working relays. Elsewhere in the code we
-      have long since stopped supporting such networks, so there wasn't
-      much point in keeping it around. Addresses ticket 9926.
-    - Reject 0-length EXTEND2 cells more explicitly. Fixes bug 10536;
-      bugfix on 0.2.4.8-alpha. Reported by "cypherpunks".
-    - Extract the common duplicated code for creating a subdirectory
-      of the data directory and writing to a file in it. Fixes ticket
-      4282; patch from Peter Retzlaff.
-    - Since OpenSSL 0.9.7, the i2d_*() functions support allocating output
-      buffer. Avoid calling twice: i2d_RSAPublicKey(), i2d_DHparams(),
-      i2d_X509(), and i2d_PublicKey(). Resolves ticket 5170.
-    - Add a set of accessor functions for the circuit timeout data
-      structure. Fixes ticket 6153; patch from "piet".
-    - Clean up exit paths from connection_listener_new(). Closes ticket
-      8789. Patch from Arlo Breault.
-    - Since we rely on OpenSSL 0.9.8 now, we can use EVP_PKEY_cmp()
-      and drop our own custom pkey_eq() implementation. Fixes bug 9043.
-    - Use a doubly-linked list to implement the global circuit list.
-      Resolves ticket 9108. Patch from Marek Majkowski.
-    - Remove contrib/id_to_fp.c since it wasn't used anywhere.
-    - Remove constants and tests for PKCS1 padding; it's insecure and
-      shouldn't be used for anything new. Fixes bug 8792; patch
-      from Arlo Breault.
-    - Remove instances of strcpy() from the unit tests. They weren't
-      hurting anything, since they were only in the unit tests, but it's
-      embarassing to have strcpy() in the code at all, and some analysis
-      tools don't like it. Fixes bug 8790; bugfix on 0.2.3.6-alpha and
-      0.2.3.8-alpha. Patch from Arlo Breault.
-    - Remove is_internal_IP() function. Resolves ticket 4645.
-    - Remove unused function circuit_dump_by_chan from circuitlist.c.
-      Closes issue 9107; patch from "marek".
-    - Change our use of the ENUM_BF macro to avoid declarations that
-      confuse Doxygen.
-    - Get rid of router->address, since in all cases it was just the
-      string representation of router->addr. Resolves ticket 5528.
-
-  o Documentation:
-    - Adjust the URLs in the README to refer to the new locations of
-      several documents on the website. Fixes bug 12830. Patch from
-      Matt Pagan.
-    - Document 'reject6' and 'accept6' ExitPolicy entries. Resolves
-      ticket 12878.
-    - Update manpage to describe some of the files you can expect to
-      find in Tor's DataDirectory. Addresses ticket 9839.
-    - Clean up several option names in the manpage to match their real
-      names, add the missing documentation for a couple of testing and
-      directory authority options, remove the documentation for a
-      V2-directory fetching option that no longer exists. Resolves
-      ticket 11634.
-    - Correct the documenation so that it lists the correct directory
-      for the stats files. (They are in a subdirectory called "stats",
-      not "status".)
-    - In the manpage, move more authority-only options into the
-      directory authority section so that operators of regular directory
-      caches don't get confused.
-    - Fix the layout of the SOCKSPort flags in the manpage. Fixes bug
-      11061; bugfix on 0.2.4.7-alpha.
-    - Resolve warnings from Doxygen.
-    - Document in the manpage that "KBytes" may also be written as
-      "kilobytes" or "KB", that "Kbits" may also be written as
-      "kilobits", and so forth. Closes ticket 9222.
-    - Document that the ClientOnly config option overrides ORPort.
-      Our old explanation made ClientOnly sound as though it did
-      nothing at all. Resolves bug 9059.
-    - Explain that SocksPolicy, DirPolicy, and similar options don't
-      take port arguments. Fixes the other part of ticket 11108.
-    - Fix a comment about the rend_server_descriptor_t.protocols field
-      to more accurately describe its range. Also, make that field
-      unsigned, to more accurately reflect its usage. Fixes bug 9099;
-      bugfix on 0.2.1.5-alpha.
-    - Fix the manpage's description of HiddenServiceAuthorizeClient:
-      the maximum client name length is 16, not 19. Fixes bug 11118;
-      bugfix on 0.2.1.6-alpha.
-
-  o Package cleanup:
-    - The contrib directory has been sorted and tidied. Before, it was
-      an unsorted dumping ground for useful and not-so-useful things.
-      Now, it is divided based on functionality, and the items which
-      seemed to be nonfunctional or useless have been removed. Resolves
-      ticket 8966; based on patches from "rl1987".
-
-  o Removed code and features:
-    - Clients now reject any directory authority certificates lacking
-      a dir-key-crosscert element. These have been included since
-      0.2.1.9-alpha, so there's no real reason for them to be optional
-      any longer. Completes proposal 157. Resolves ticket 10162.
-    - Remove all code that existed to support the v2 directory system,
-      since there are no longer any v2 directory authorities. Resolves
-      ticket 10758.
-    - Remove the HSAuthoritativeDir and AlternateHSAuthority torrc
-      options, which were used for designating authorities as "Hidden
-      service authorities". There has been no use of hidden service
-      authorities since 0.2.2.1-alpha, when we stopped uploading or
-      downloading v0 hidden service descriptors. Fixes bug 10881; also
-      part of a fix for bug 10841.
-    - Remove /tor/dbg-stability.txt URL that was meant to help debug WFU
-      and MTBF calculations, but that nobody was using. Fixes bug 11742.
-    - The TunnelDirConns and PreferTunnelledDirConns options no longer
-      exist; tunneled directory connections have been available since
-      0.1.2.5-alpha, and turning them off is not a good idea. This is a
-      brute-force fix for 10849, where "TunnelDirConns 0" would break
-      hidden services.
-    - Remove all code for the long unused v1 directory protocol.
-      Resolves ticket 11070.
-    - Remove all remaining code related to version-0 hidden service
-      descriptors: they have not been in use since 0.2.2.1-alpha. Fixes
-      the rest of bug 10841.
-    - Remove migration code from when we renamed the "cached-routers"
-      file to "cached-descriptors" back in 0.2.0.8-alpha. This
-      incidentally resolves ticket 6502 by cleaning up the related code
-      a bit. Patch from Akshay Hebbar.
-
-  o Test infrastructure:
-    - Tor now builds each source file in two modes: a mode that avoids
-      exposing identifiers needlessly, and another mode that exposes
-      more identifiers for testing. This lets the compiler do better at
-      optimizing the production code, while enabling us to take more
-      radical measures to let the unit tests test things.
-    - The production builds no longer include functions used only in
-      the unit tests; all functions exposed from a module only for
-      unit-testing are now static in production builds.
-    - Add an --enable-coverage configuration option to make the unit
-      tests (and a new src/or/tor-cov target) to build with gcov test
-      coverage support.
-    - Update to the latest version of tinytest.
-    - Improve the tinytest implementation of string operation tests so
-      that comparisons with NULL strings no longer crash the tests; they
-      now just fail, normally. Fixes bug 9004; bugfix on 0.2.2.4-alpha.
-    - New macros in test.h to simplify writing mock-functions for unit
-      tests. Part of ticket 11507. Patch from Dana Koch.
-    - We now have rudimentary function mocking support that our unit
-      tests can use to test functions in isolation. Function mocking
-      lets the tests temporarily replace a function's dependencies with
-      stub functions, so that the tests can check the function without
-      invoking the other functions it calls.
-
-  o Testing:
-    - Complete tests for the status.c module. Resolves ticket 11507.
-      Patch from Dana Koch.
-    - Add more unit tests for the ->circuit map, and
-      the destroy-cell-tracking code to fix bug 7912.
-    - Unit tests for failing cases of the TAP onion handshake.
-    - More unit tests for address-manipulation functions.
-
-  o Distribution (systemd):
-    - Include a tor.service file in contrib/dist for use with systemd.
-      Some distributions will be able to use this file unmodified;
-      others will need to tweak it, or write their own. Patch from Jamie
-      Nguyen; resolves ticket 8368.
-    - Verify configuration file via ExecStartPre in the systemd unit
-      file. Patch from intrigeri; resolves ticket 12730.
-    - Explicitly disable RunAsDaemon in the systemd unit file. Our
-      current systemd unit uses "Type = simple", so systemd does not
-      expect tor to fork. If the user has "RunAsDaemon 1" in their
-      torrc, then things won't work as expected. This is e.g. the case
-      on Debian (and derivatives), since there we pass "--defaults-torrc
-      /usr/share/tor/tor-service-defaults-torrc" (that contains
-      "RunAsDaemon 1") by default. Patch by intrigeri; resolves
-      ticket 12731.
-
-
-Changes in version 0.2.4.25 - 2014-10-20
-  Tor 0.2.4.25 disables SSL3 in response to the recent "POODLE" attack
-  (even though POODLE does not affect Tor). It also works around a crash
-  bug caused by some operating systems' response to the "POODLE" attack
-  (which does affect Tor).
-
-  o Major security fixes (also in 0.2.5.9-rc):
-    - Disable support for SSLv3. All versions of OpenSSL in use with Tor
-      today support TLS 1.0 or later, so we can safely turn off support
-      for this old (and insecure) protocol. Fixes bug 13426.
-
-  o Major bugfixes (openssl bug workaround, also in 0.2.5.9-rc):
-    - Avoid crashing when using OpenSSL version 0.9.8zc, 1.0.0o, or
-      1.0.1j, built with the 'no-ssl3' configuration option. Fixes bug
-      13471. This is a workaround for an OpenSSL bug.
-
-
-Changes in version 0.2.4.24 - 2014-09-22
-  Tor 0.2.4.24 fixes a bug that affects consistency and speed when
-  connecting to hidden services, and it updates the location of one of
-  the directory authorities.
-
-  o Major bugfixes:
-    - Clients now send the correct address for their chosen rendezvous
-      point when trying to access a hidden service. They used to send
-      the wrong address, which would still work some of the time because
-      they also sent the identity digest of the rendezvous point, and if
-      the hidden service happened to try connecting to the rendezvous
-      point from a relay that already had a connection open to it,
-      the relay would reuse that connection. Now connections to hidden
-      services should be more robust and faster. Also, this bug meant
-      that clients were leaking to the hidden service whether they were
-      on a little-endian (common) or big-endian (rare) system, which for
-      some users might have reduced their anonymity. Fixes bug 13151;
-      bugfix on 0.2.1.5-alpha.
-
-  o Directory authority changes:
-    - Change IP address for gabelmoo (v3 directory authority).
-
-  o Minor features (geoip):
-    - Update geoip and geoip6 to the August 7 2014 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.4.23 - 2014-07-28
-  Tor 0.2.4.23 brings us a big step closer to slowing down the risk from
-  guard rotation, and also backports several important fixes from the
-  Tor 0.2.5 alpha release series.
-
-  o Major features:
-    - Clients now look at the "usecreatefast" consensus parameter to
-      decide whether to use CREATE_FAST or CREATE cells for the first hop
-      of their circuit. This approach can improve security on connections
-      where Tor's circuit handshake is stronger than the available TLS
-      connection security levels, but the tradeoff is more computational
-      load on guard relays. Implements proposal 221. Resolves ticket 9386.
-    - Make the number of entry guards configurable via a new
-      NumEntryGuards consensus parameter, and the number of directory
-      guards configurable via a new NumDirectoryGuards consensus
-      parameter. Implements ticket 12688.
-
-  o Major bugfixes:
-    - Fix a bug in the bounds-checking in the 32-bit curve25519-donna
-      implementation that caused incorrect results on 32-bit
-      implementations when certain malformed inputs were used along with
-      a small class of private ntor keys. This bug does not currently
-      appear to allow an attacker to learn private keys or impersonate a
-      Tor server, but it could provide a means to distinguish 32-bit Tor
-      implementations from 64-bit Tor implementations. Fixes bug 12694;
-      bugfix on 0.2.4.8-alpha. Bug found by Robert Ransom; fix from
-      Adam Langley.
-
-  o Minor bugfixes:
-    - Warn and drop the circuit if we receive an inbound 'relay early'
-      cell. Those used to be normal to receive on hidden service circuits
-      due to bug 1038, but the buggy Tor versions are long gone from
-      the network so we can afford to resume watching for them. Resolves
-      the rest of bug 1038; bugfix on 0.2.1.19.
-    - Correct a confusing error message when trying to extend a circuit
-      via the control protocol but we don't know a descriptor or
-      microdescriptor for one of the specified relays. Fixes bug 12718;
-      bugfix on 0.2.3.1-alpha.
-    - Avoid an illegal read from stack when initializing the TLS
-      module using a version of OpenSSL without all of the ciphers
-      used by the v2 link handshake. Fixes bug 12227; bugfix on
-      0.2.4.8-alpha.  Found by "starlight".
-
-  o Minor features:
-    - Update geoip and geoip6 to the July 10 2014 Maxmind GeoLite2
-      Country database.
-
-
-Changes in version 0.2.4.22 - 2014-05-16
-  Tor 0.2.4.22 backports numerous high-priority fixes from the Tor 0.2.5
-  alpha release series. These include blocking all authority signing
-  keys that may have been affected by the OpenSSL "heartbleed" bug,
-  choosing a far more secure set of TLS ciphersuites by default, closing
-  a couple of memory leaks that could be used to run a target relay out
-  of RAM, and several others.
-
-  o Major features (security, backport from 0.2.5.4-alpha):
-    - Block authority signing keys that were used on authorities
-      vulnerable to the "heartbleed" bug in OpenSSL (CVE-2014-0160). (We
-      don't have any evidence that these keys _were_ compromised; we're
-      doing this to be prudent.) Resolves ticket 11464.
-
-  o Major bugfixes (security, OOM):
-    - Fix a memory leak that could occur if a microdescriptor parse
-      fails during the tokenizing step. This bug could enable a memory
-      exhaustion attack by directory servers. Fixes bug 11649; bugfix
-      on 0.2.2.6-alpha.
-
-  o Major bugfixes (TLS cipher selection, backport from 0.2.5.4-alpha):
-    - The relay ciphersuite list is now generated automatically based on
-      uniform criteria, and includes all OpenSSL ciphersuites with
-      acceptable strength and forward secrecy. Previously, we had left
-      some perfectly fine ciphersuites unsupported due to omission or
-      typo. Resolves bugs 11513, 11492, 11498, 11499. Bugs reported by
-      'cypherpunks'. Bugfix on 0.2.4.8-alpha.
-    - Relays now trust themselves to have a better view than clients of
-      which TLS ciphersuites are better than others. (Thanks to bug
-      11513, the relay list is now well-considered, whereas the client
-      list has been chosen mainly for anti-fingerprinting purposes.)
-      Relays prefer: AES over 3DES; then ECDHE over DHE; then GCM over
-      CBC; then SHA384 over SHA256 over SHA1; and last, AES256 over
-      AES128. Resolves ticket 11528.
-    - Clients now try to advertise the same list of ciphersuites as
-      Firefox 28. This change enables selection of (fast) GCM
-      ciphersuites, disables some strange old ciphers, and stops
-      advertising the ECDH (not to be confused with ECDHE) ciphersuites.
-      Resolves ticket 11438.
-
-  o Minor bugfixes (configuration, security):
-    - When running a hidden service, do not allow TunneledDirConns 0:
-      trying to set that option together with a hidden service would
-      otherwise prevent the hidden service from running, and also make
-      it publish its descriptors directly over HTTP. Fixes bug 10849;
-      bugfix on 0.2.1.1-alpha.
-
-  o Minor bugfixes (controller, backport from 0.2.5.4-alpha):
-    - Avoid sending a garbage value to the controller when a circuit is
-      cannibalized. Fixes bug 11519; bugfix on 0.2.3.11-alpha.
-
-  o Minor bugfixes (exit relay, backport from 0.2.5.4-alpha):
-    - Stop leaking memory when we successfully resolve a PTR record.
-      Fixes bug 11437; bugfix on 0.2.4.7-alpha.
-
-  o Minor bugfixes (bridge client, backport from 0.2.5.4-alpha):
-    - Avoid 60-second delays in the bootstrapping process when Tor is
-      launching for a second time while using bridges. Fixes bug 9229;
-      bugfix on 0.2.0.3-alpha.
-
-  o Minor bugfixes (relays and bridges, backport from 0.2.5.4-alpha):
-    - Give the correct URL in the warning message when trying to run a
-      relay on an ancient version of Windows. Fixes bug 9393.
-
-  o Minor bugfixes (compilation):
-    - Fix a compilation error when compiling with --disable-curve25519.
-      Fixes bug 9700; bugfix on 0.2.4.17-rc.
-
-  o Minor bugfixes:
-    - Downgrade the warning severity for the the "md was still
-      referenced 1 node(s)" warning. Tor 0.2.5.4-alpha has better code
-      for trying to diagnose this bug, and the current warning in
-      earlier versions of tor achieves nothing useful. Addresses warning
-      from bug 7164.
-
-  o Minor features (log verbosity, backport from 0.2.5.4-alpha):
-    - When we run out of usable circuit IDs on a channel, log only one
-      warning for the whole channel, and describe how many circuits
-      there were on the channel. Fixes part of ticket 11553.
-
-  o Minor features (security, backport from 0.2.5.4-alpha):
-    - Decrease the lower limit of MaxMemInCellQueues to 256 MBytes (but
-      leave the default at 8GBytes), to better support Raspberry Pi
-      users. Fixes bug 9686; bugfix on 0.2.4.14-alpha.
-
-  o Documentation (backport from 0.2.5.4-alpha):
-    - Correctly document that we search for a system torrc file before
-      looking in ~/.torrc. Fixes documentation side of 9213; bugfix on
-      0.2.3.18-rc.
-
-
-Changes in version 0.2.4.21 - 2014-02-28
-  Tor 0.2.4.21 further improves security against potential adversaries who
-  find breaking 1024-bit crypto doable, and backports several stability
-  and robustness patches from the 0.2.5 branch.
-
-  o Major features (client security):
-    - When we choose a path for a 3-hop circuit, make sure it contains
-      at least one relay that supports the NTor circuit extension
-      handshake. Otherwise, there is a chance that we're building
-      a circuit that's worth attacking by an adversary who finds
-      breaking 1024-bit crypto doable, and that chance changes the game
-      theory. Implements ticket 9777.
-
-  o Major bugfixes:
-    - Do not treat streams that fail with reason
-      END_STREAM_REASON_INTERNAL as indicating a definite circuit failure,
-      since it could also indicate an ENETUNREACH connection error. Fixes
-      part of bug 10777; bugfix on 0.2.4.8-alpha.
-
-  o Code simplification and refactoring:
-    - Remove data structures which were introduced to implement the
-      CellStatistics option: they are now redundant with the new timestamp
-      field in the regular packed_cell_t data structure, which we did
-      in 0.2.4.18-rc in order to resolve bug 9093. Resolves ticket 10870.
-
-  o Minor features:
-    - Always clear OpenSSL bignums before freeing them -- even bignums
-      that don't contain secrets. Resolves ticket 10793. Patch by
-      Florent Daigniere.
-    - Build without warnings under clang 3.4. (We have some macros that
-      define static functions only some of which will get used later in
-      the module. Starting with clang 3.4, these give a warning unless the
-      unused attribute is set on them.) Resolves ticket 10904.
-    - Update geoip and geoip6 files to the February 7 2014 Maxmind
-      GeoLite2 Country database.
-
-  o Minor bugfixes:
-    - Set the listen() backlog limit to the largest actually supported
-      on the system, not to the value in a header file. Fixes bug 9716;
-      bugfix on every released Tor.
-    - Treat ENETUNREACH, EACCES, and EPERM connection failures at an
-      exit node as a NOROUTE error, not an INTERNAL error, since they
-      can apparently happen when trying to connect to the wrong sort
-      of netblocks. Fixes part of bug 10777; bugfix on 0.1.0.1-rc.
-    - Fix build warnings about missing "a2x" comment when building the
-      manpages from scratch on OpenBSD; OpenBSD calls it "a2x.py".
-      Fixes bug 10929; bugfix on 0.2.2.9-alpha. Patch from Dana Koch.
-    - Avoid a segfault on SIGUSR1, where we had freed a connection but did
-      not entirely remove it from the connection lists. Fixes bug 9602;
-      bugfix on 0.2.4.4-alpha.
-    - Fix a segmentation fault in our benchmark code when running with
-      Fedora's OpenSSL package, or any other OpenSSL that provides
-      ECDH but not P224. Fixes bug 10835; bugfix on 0.2.4.8-alpha.
-    - Turn "circuit handshake stats since last time" log messages into a
-      heartbeat message. Fixes bug 10485; bugfix on 0.2.4.17-rc.
-
-  o Documentation fixes:
-    - Document that all but one DirPort entry must have the NoAdvertise
-      flag set. Fixes bug 10470; bugfix on 0.2.3.3-alpha / 0.2.3.16-alpha.
-
-
-Changes in version 0.2.4.20 - 2013-12-22
-  Tor 0.2.4.20 fixes potentially poor random number generation for users
-  who 1) use OpenSSL 1.0.0 or later, 2) set "HardwareAccel 1" in their
-  torrc file, 3) have "Sandy Bridge" or "Ivy Bridge" Intel processors,
-  and 4) have no state file in their DataDirectory (as would happen on
-  first start). Users who generated relay or hidden service identity
-  keys in such a situation should discard them and generate new ones.
-
-  This release also fixes a logic error that caused Tor clients to build
-  many more preemptive circuits than they actually need.
-
-  o Major bugfixes:
-    - Do not allow OpenSSL engines to replace the PRNG, even when
-      HardwareAccel is set. The only default builtin PRNG engine uses
-      the Intel RDRAND instruction to replace the entire PRNG, and
-      ignores all attempts to seed it with more entropy. That's
-      cryptographically stupid: the right response to a new alleged
-      entropy source is never to discard all previously used entropy
-      sources. Fixes bug 10402; works around behavior introduced in
-      OpenSSL 1.0.0. Diagnosis and investigation thanks to "coderman"
-      and "rl1987".
-    - Fix assertion failure when AutomapHostsOnResolve yields an IPv6
-      address. Fixes bug 10465; bugfix on 0.2.4.7-alpha.
-    - Avoid launching spurious extra circuits when a stream is pending.
-      This fixes a bug where any circuit that _wasn't_ unusable for new
-      streams would be treated as if it were, causing extra circuits to
-      be launched. Fixes bug 10456; bugfix on 0.2.4.12-alpha.
-
-  o Minor bugfixes:
-    - Avoid a crash bug when starting with a corrupted microdescriptor
-      cache file. Fixes bug 10406; bugfix on 0.2.2.6-alpha.
-    - If we fail to dump a previously cached microdescriptor to disk, avoid
-      freeing duplicate data later on. Fixes bug 10423; bugfix on
-      0.2.4.13-alpha. Spotted by "bobnomnom".
-
-
-Changes in version 0.2.4.19 - 2013-12-11
-  The Tor 0.2.4 release series is dedicated to the memory of Aaron Swartz
-  (1986-2013). Aaron worked on diverse projects including helping to guide
-  Creative Commons, playing a key role in stopping SOPA/PIPA, bringing
-  transparency to the U.S government's PACER documents, and contributing
-  design and development for Tor and Tor2Web. Aaron was one of the latest
-  martyrs in our collective fight for civil liberties and human rights,
-  and his death is all the more painful because he was one of us.
-
-  Tor 0.2.4.19, the first stable release in the 0.2.4 branch, features
-  a new circuit handshake and link encryption that use ECC to provide
-  better security and efficiency; makes relays better manage circuit
-  creation requests; uses "directory guards" to reduce client enumeration
-  risks; makes bridges collect and report statistics about the pluggable
-  transports they support; cleans up and improves our geoip database;
-  gets much closer to IPv6 support for clients, bridges, and relays; makes
-  directory authorities use measured bandwidths rather than advertised
-  ones when computing flags and thresholds; disables client-side DNS
-  caching to reduce tracking risks; and fixes a big bug in bridge
-  reachability testing. This release introduces two new design
-  abstractions in the code: a new "channel" abstraction between circuits
-  and or_connections to allow for implementing alternate relay-to-relay
-  transports, and a new "circuitmux" abstraction storing the queue of
-  circuits for a channel. The release also includes many stability,
-  security, and privacy fixes.
-
-  o Major features (new circuit handshake):
-    - Tor now supports a new circuit extension handshake designed by Ian
-      Goldberg, Douglas Stebila, and Berkant Ustaoglu. Our original
-      circuit extension handshake, later called "TAP", was a bit slow
-      (especially on the relay side), had a fragile security proof, and
-      used weaker keys than we'd now prefer. The new circuit handshake
-      uses Dan Bernstein's "curve25519" elliptic-curve Diffie-Hellman
-      function, making it significantly more secure than the older
-      handshake, and significantly faster. Tor can use one of two built-in
-      pure-C curve25519-donna implementations by Adam Langley, or it
-      can link against the "nacl" library for a tuned version if present.
-
-      The built-in version is very fast for 64-bit systems when building
-      with GCC. The built-in 32-bit version is still faster than the
-      old TAP protocol, but using libnacl is better on most such hosts.
-
-      Implements proposal 216; closes ticket 7202.
-
-  o Major features (better link encryption):
-    - Relays can now enable the ECDHE TLS ciphersuites when available
-      and appropriate. These ciphersuites let us negotiate forward-secure
-      TLS secret keys more safely and more efficiently than with our
-      previous use of Diffie-Hellman modulo a 1024-bit prime. By default,
-      public relays prefer the (faster) P224 group, and bridges prefer
-      the (more common) P256 group; you can override this with the
-      TLSECGroup option.
-
-      This feature requires clients running 0.2.3.17-beta or later,
-      and requires both sides to be running OpenSSL 1.0.0 or later
-      with ECC support. OpenSSL 1.0.1, with the compile-time option
-      "enable-ec_nistp_64_gcc_128", is highly recommended.
-
-      Implements the relay side of proposal 198; closes ticket 7200.
-
-    - Re-enable TLS 1.1 and 1.2 when built with OpenSSL 1.0.1e or later.
-      Resolves ticket 6055. (OpenSSL before 1.0.1 didn't have TLS 1.1 or
-      1.2, and OpenSSL from 1.0.1 through 1.0.1d had bugs that prevented
-      renegotiation from working with TLS 1.1 or 1.2, so we had disabled
-      them to solve bug 6033.)
-
-  o Major features (relay performance):
-    - Instead of limiting the number of queued onionskins (aka circuit
-      create requests) to a fixed, hard-to-configure number, we limit
-      the size of the queue based on how many we expect to be able to
-      process in a given amount of time. We estimate the time it will
-      take to process an onionskin based on average processing time
-      of previous onionskins. Closes ticket 7291. You'll never have to
-      configure MaxOnionsPending again.
-    - Relays process the new "NTor" circuit-level handshake requests
-      with higher priority than the old "TAP" circuit-level handshake
-      requests. We still process some TAP requests to not totally starve
-      0.2.3 clients when NTor becomes popular. A new consensus parameter
-      "NumNTorsPerTAP" lets us tune the balance later if we need to.
-      Implements ticket 9574.
-
-  o Major features (client bootstrapping resilience):
-    - Add a new "FallbackDir" torrc option to use when we can't use
-      a directory mirror from the consensus (either because we lack a
-      consensus, or because they're all down). Currently, all authorities
-      are fallbacks by default, and there are no other default fallbacks,
-      but that will change. This option will allow us to give clients a
-      longer list of servers to try to get a consensus from when first
-      connecting to the Tor network, and thereby reduce load on the
-      directory authorities. Implements proposal 206, "Preconfigured
-      directory sources for bootstrapping". We also removed the old
-      "FallbackNetworkstatus" option, since we never got it working well
-      enough to use it. Closes bug 572.
-    - If we have no circuits open, use a relaxed timeout (the
-      95th-percentile cutoff) until a circuit succeeds. This heuristic
-      should allow Tor to succeed at building circuits even when the
-      network connection drastically changes. Should help with bug 3443.
-
-  o Major features (use of guards):
-    - Support directory guards (proposal 207): when possible, clients now
-      use their entry guards for non-anonymous directory requests. This
-      can help prevent client enumeration. Note that this behavior only
-      works when we have a usable consensus directory, and when options
-      about what to download are more or less standard. In the future we
-      should re-bootstrap from our guards, rather than re-bootstrapping
-      from the preconfigured list of directory sources that ships with
-      Tor. Resolves ticket 6526.
-    - Raise the default time that a client keeps an entry guard from
-      "1-2 months" to "2-3 months", as suggested by Tariq Elahi's WPES
-      2012 paper. (We would make it even longer, but we need better client
-      load balancing first.) Also, make the guard lifetime controllable
-      via a new GuardLifetime torrc option and a GuardLifetime consensus
-      parameter. Start of a fix for bug 8240; bugfix on 0.1.1.11-alpha.
-
-  o Major features (bridges with pluggable transports):
-    - Bridges now report the pluggable transports they support to the
-      bridge authority, so it can pass the supported transports on to
-      bridgedb and/or eventually do reachability testing. Implements
-      ticket 3589.
-    - Automatically forward the TCP ports of pluggable transport
-      proxies using tor-fw-helper if PortForwarding is enabled. Implements
-      ticket 4567.
-
-  o Major features (geoip database):
-    - Maxmind began labelling Tor relays as being in country "A1",
-      which breaks by-country node selection inside Tor. Now we use a
-      script to replace "A1" ("Anonymous Proxy") entries in our geoip
-      file with real country codes. This script fixes about 90% of "A1"
-      entries automatically and uses manual country code assignments to
-      fix the remaining 10%. See src/config/README.geoip for details.
-      Fixes bug 6266.
-    - Add GeoIP database for IPv6 addresses. The new config option
-      is GeoIPv6File.
-    - Update to the October 2 2013 Maxmind GeoLite Country database.
-
-  o Major features (IPv6):
-    - Clients who set "ClientUseIPv6 1" may connect to entry nodes over
-      IPv6. Set "ClientPreferIPv6ORPort 1" to make this even more likely
-      to happen. Implements ticket 5535.
-    - All kind of relays, not just bridges, can now advertise an IPv6
-      OR port. Implements ticket 6362.
-    - Relays can now exit to IPv6 addresses: make sure that you have IPv6
-      connectivity, then set the IPv6Exit flag to 1. Also make sure your
-      exit policy reads as you would like: the address * applies to all
-      address families, whereas *4 is IPv4 address only, and *6 is IPv6
-      addresses only. On the client side, you'll need to wait for enough
-      exits to support IPv6, apply the "IPv6Traffic" flag to a SocksPort,
-      and use Socks5. Closes ticket 5547, implements proposal 117 as
-      revised in proposal 208.
-    - Bridge authorities now accept IPv6 bridge addresses and include
-      them in network status documents. Implements ticket 5534.
-    - Directory authorities vote on IPv6 OR ports. Implements ticket 6363.
-
-  o Major features (directory authorities):
-    - Directory authorities now prefer using measured bandwidths to
-      advertised ones when computing flags and thresholds. Resolves
-      ticket 8273.
-    - Directory authorities that vote measured bandwidths about more
-      than a threshold number of relays now treat relays with
-      unmeasured bandwidths as having bandwidth 0 when computing their
-      flags. Resolves ticket 8435.
-    - Directory authorities now support a new consensus method (17)
-      where they cap the published bandwidth of relays for which
-      insufficient bandwidth measurements exist. Fixes part of bug 2286.
-    - Directory authorities that set "DisableV2DirectoryInfo_ 1" no longer
-      serve any v2 directory information. Now we can test disabling the
-      old deprecated v2 directory format, and see whether doing so has
-      any effect on network load. Begins to fix bug 6783.
-
-  o Major features (build and portability):
-    - Switch to a nonrecursive Makefile structure. Now instead of each
-      Makefile.am invoking other Makefile.am's, there is a master
-      Makefile.am that includes the others. This change makes our build
-      process slightly more maintainable, and improves parallelism for
-      building with make -j. Original patch by Stewart Smith; various
-      fixes by Jim Meyering.
-    - Where available, we now use automake's "silent" make rules by
-      default, so that warnings are easier to spot. You can get the old
-      behavior with "make V=1". Patch by Stewart Smith for ticket 6522.
-    - Resume building correctly with MSVC and Makefile.nmake. This patch
-      resolves numerous bugs and fixes reported by ultramage, including
-      7305, 7308, 7309, 7310, 7312, 7313, 7315, 7316, and 7669.
-
-  o Security features:
-    - Switch to a completely time-invariant approach for picking nodes
-      weighted by bandwidth. Our old approach would run through the
-      part of the loop after it had made its choice slightly slower
-      than it ran through the part of the loop before it had made its
-      choice. Addresses ticket 6538.
-    - Disable the use of Guard nodes when in Tor2WebMode. Guard usage
-      by tor2web clients allows hidden services to identify tor2web
-      clients through their repeated selection of the same rendezvous
-      and introduction point circuit endpoints (their guards). Resolves
-      ticket 6888.
-
-  o Major bugfixes (relay denial of service):
-    - When we have too much memory queued in circuits (according to a new
-      MaxMemInCellQueues option), close the circuits that have the oldest
-      queued cells, on the theory that those are most responsible for
-      us running low on memory. This prevents us from running out of
-      memory as a relay if circuits fill up faster than they can be
-      drained. Fixes bugs 9063 and 9093; bugfix on the 54th commit of
-      Tor. This bug is a further fix beyond bug 6252, whose fix was
-      merged into 0.2.3.21-rc.
-    - Reject bogus create and relay cells with 0 circuit ID or 0 stream
-      ID: these could be used to create unexpected streams and circuits
-      which would count as "present" to some parts of Tor but "absent"
-      to others, leading to zombie circuits and streams or to a bandwidth
-      denial-of-service. Fixes bug 7889; bugfix on every released version
-      of Tor. Reported by "oftc_must_be_destroyed".
-    - Avoid a bug where our response to TLS renegotiation under certain
-      network conditions could lead to a busy-loop, with 100% CPU
-      consumption. Fixes bug 5650; bugfix on 0.2.0.16-alpha.
-
-  o Major bugfixes (asserts, crashes, leaks):
-    - Prevent the get_freelists() function from running off the end of
-      the list of freelists if it somehow gets an unrecognized
-      allocation. Fixes bug 8844; bugfix on 0.2.0.16-alpha. Reported by
-      eugenis.
-    - Avoid a memory leak where we would leak a consensus body when we
-      find that a consensus which we couldn't previously verify due to
-      missing certificates is now verifiable. Fixes bug 8719; bugfix
-      on 0.2.0.10-alpha.
-    - If we are unable to save a microdescriptor to the journal, do not
-      drop it from memory and then reattempt downloading it. Fixes bug
-      9645; bugfix on 0.2.2.6-alpha.
-    - Fix an assertion failure that would occur when disabling the
-      ORPort setting on a running Tor process while accounting was
-      enabled. Fixes bug 6979; bugfix on 0.2.2.18-alpha.
-    - Avoid an assertion failure on OpenBSD (and perhaps other BSDs)
-      when an exit connection with optimistic data succeeds immediately
-      rather than returning EINPROGRESS. Fixes bug 9017; bugfix on
-      0.2.3.1-alpha.
-    - Fix a memory leak that would occur whenever a configuration
-      option changed. Fixes bug 8718; bugfix on 0.2.3.3-alpha.
-
-  o Major bugfixes (relay rate limiting):
-    - When a TLS write is partially successful but incomplete, remember
-      that the flushed part has been flushed, and notice that bytes were
-      actually written. Reported and fixed pseudonymously. Fixes bug 7708;
-      bugfix on Tor 0.1.0.5-rc.
-    - Raise the default BandwidthRate/BandwidthBurst values from 5MB/10MB
-      to 1GB/1GB. The previous defaults were intended to be "basically
-      infinite", but it turns out they're now limiting our 100mbit+
-      relays and bridges. Fixes bug 6605; bugfix on 0.2.0.10-alpha (the
-      last time we raised it).
-    - No longer stop reading or writing on cpuworker connections when
-      our rate limiting buckets go empty. Now we should handle circuit
-      handshake requests more promptly. Resolves bug 9731.
-
-  o Major bugfixes (client-side privacy):
-    - When we mark a circuit as unusable for new circuits, have it
-      continue to be unusable for new circuits even if MaxCircuitDirtiness
-      is increased too much at the wrong time, or the system clock jumps
-      backwards. Fixes bug 6174; bugfix on 0.0.2pre26.
-    - If ClientDNSRejectInternalAddresses ("do not believe DNS queries
-      which have resolved to internal addresses") is set, apply that
-      rule to IPv6 as well. Fixes bug 8475; bugfix on 0.2.0.7-alpha.
-    - When an exit relay rejects a stream with reason "exit policy", but
-      we only know an exit policy summary (e.g. from the microdesc
-      consensus) for it, do not mark the relay as useless for all exiting.
-      Instead, mark just the circuit as unsuitable for that particular
-      address. Fixes part of bug 7582; bugfix on 0.2.3.2-alpha.
-
-  o Major bugfixes (stream isolation):
-    - Allow applications to get proper stream isolation with
-      IsolateSOCKSAuth. Many SOCKS5 clients that want to offer
-      username/password authentication also offer "no authentication". Tor
-      had previously preferred "no authentication", so the applications
-      never actually sent Tor their auth details. Now Tor selects
-      username/password authentication if it's offered. You can disable
-      this behavior on a per-SOCKSPort basis via PreferSOCKSNoAuth. Fixes
-      bug 8117; bugfix on 0.2.3.3-alpha.
-    - Follow the socks5 protocol when offering username/password
-      authentication. The fix for bug 8117 exposed this bug, and it
-      turns out real-world applications like Pidgin do care. Bugfix on
-      0.2.3.2-alpha; fixes bug 8879.
-
-  o Major bugfixes (client circuit building):
-    - Alter circuit build timeout measurement to start at the point
-      where we begin the CREATE/CREATE_FAST step (as opposed to circuit
-      initialization). This should make our timeout measurements more
-      uniform. Previously, we were sometimes including ORconn setup time
-      in our circuit build time measurements. Should resolve bug 3443.
-    - If the circuit build timeout logic is disabled (via the consensus,
-      or because we are an authority), then don't build testing circuits.
-      Fixes bug 9657; bugfix on 0.2.2.14-alpha.
-
-  o Major bugfixes (client-side DNS):
-    - Turn off the client-side DNS cache by default. Updating and using
-      the DNS cache is now configurable on a per-client-port
-      level. SOCKSPort, DNSPort, etc lines may now contain
-      {No,}Cache{IPv4,IPv6,}DNS lines to indicate that we shouldn't
-      cache these types of DNS answers when we receive them from an
-      exit node in response to an application request on this port, and
-      {No,}UseCached{IPv4,IPv6,DNS} lines to indicate that if we have
-      cached DNS answers of these types, we shouldn't use them. It's
-      potentially risky to use cached DNS answers at the client, since
-      doing so can indicate to one exit what answers we've gotten
-      for DNS lookups in the past. With IPv6, this becomes especially
-      problematic. Using cached DNS answers for requests on the same
-      circuit would present less linkability risk, since all traffic
-      on a circuit is already linkable, but it would also provide
-      little performance benefit: the exit node caches DNS replies
-      too. Implements a simplified version of Proposal 205. Implements
-      ticket 7570.
-
-  o Major bugfixes (hidden service privacy):
-    - Limit hidden service descriptors to at most ten introduction
-      points, to slow one kind of guard enumeration. Fixes bug 9002;
-      bugfix on 0.1.1.11-alpha.
-
-  o Major bugfixes (directory fetching):
-    - If the time to download the next old-style networkstatus is in
-      the future, do not decline to consider whether to download the
-      next microdescriptor networkstatus. Fixes bug 9564; bugfix on
-      0.2.3.14-alpha.
-    - We used to always request authority certificates by identity digest,
-      meaning we'd get the newest one even when we wanted one with a
-      different signing key. Then we would complain about being given
-      a certificate we already had, and never get the one we really
-      wanted. Now we use the "fp-sk/" resource as well as the "fp/"
-      resource to request the one we want. Fixes bug 5595; bugfix on
-      0.2.0.8-alpha.
-
-  o Major bugfixes (bridge reachability):
-    - Bridges now send AUTH_CHALLENGE cells during their v3 handshakes;
-      previously they did not, which prevented them from receiving
-      successful connections from relays for self-test or bandwidth
-      testing. Also, when a relay is extending a circuit to a bridge,
-      it needs to send a NETINFO cell, even when the bridge hasn't sent
-      an AUTH_CHALLENGE cell. Fixes bug 9546; bugfix on 0.2.3.6-alpha.
-
-  o Major bugfixes (control interface):
-    - When receiving a new configuration file via the control port's
-      LOADCONF command, do not treat the defaults file as absent.
-      Fixes bug 9122; bugfix on 0.2.3.9-alpha.
-
-  o Major bugfixes (directory authorities):
-    - Stop marking every relay as having been down for one hour every
-      time we restart a directory authority. These artificial downtimes
-      were messing with our Stable and Guard flag calculations. Fixes
-      bug 8218 (introduced by the fix for 1035). Bugfix on 0.2.2.23-alpha.
-    - When computing directory thresholds, ignore any rejected-as-sybil
-      nodes during the computation so that they can't influence Fast,
-      Guard, etc. (We should have done this for proposal 109.) Fixes
-      bug 8146.
-    - When marking a node as a likely sybil, reset its uptime metrics
-      to zero, so that it cannot time towards getting marked as Guard,
-      Stable, or HSDir. (We should have done this for proposal 109.) Fixes
-      bug 8147.
-    - Fix a bug in the voting algorithm that could yield incorrect results
-      when a non-naming authority declared too many flags. Fixes bug 9200;
-      bugfix on 0.2.0.3-alpha.
-
-  o Internal abstraction features:
-    - Introduce new channel_t abstraction between circuits and
-      or_connection_t to allow for implementing alternate OR-to-OR
-      transports. A channel_t is an abstract object which can either be a
-      cell-bearing channel, which is responsible for authenticating and
-      handshaking with the remote OR and transmitting cells to and from
-      it, or a listening channel, which spawns new cell-bearing channels
-      at the request of remote ORs. Implements part of ticket 6465.
-    - Make a channel_tls_t subclass of channel_t, adapting it to the
-      existing or_connection_t code. The V2/V3 protocol handshaking
-      code which formerly resided in command.c has been moved below the
-      channel_t abstraction layer and may be found in channeltls.c now.
-      Implements the rest of ticket 6465.
-    - Introduce new circuitmux_t storing the queue of circuits for
-      a channel; this encapsulates and abstracts the queue logic and
-      circuit selection policy, and allows the latter to be overridden
-      easily by switching out a policy object. The existing EWMA behavior
-      is now implemented as a circuitmux_policy_t. Resolves ticket 6816.
-
-  o New build requirements:
-    - Tor now requires OpenSSL 0.9.8 or later. OpenSSL 1.0.0 or later is
-      strongly recommended.
-    - Tor maintainers now require Automake version 1.9 or later to build
-      Tor from the Git repository. (Automake is not required when building
-      from a source distribution.)
-
-  o Minor features (protocol):
-    - No longer include the "opt" prefix when generating routerinfos
-      or v2 directories: it has been needless since Tor 0.1.2. Closes
-      ticket 5124.
-    - Reject EXTEND cells sent to nonexistent streams. According to the
-      spec, an EXTEND cell sent to _any_ nonzero stream ID is invalid, but
-      we were only checking for stream IDs that were currently in use.
-      Found while hunting for more instances of bug 6271. Bugfix on
-      0.0.2pre8, which introduced incremental circuit construction.
-    - Tor relays and clients now support a better CREATE/EXTEND cell
-      format, allowing the sender to specify multiple address, identity,
-      and handshake types. Implements Robert Ransom's proposal 200;
-      closes ticket 7199.
-    - Reject as invalid most directory objects containing a NUL.
-      Belt-and-suspender fix for bug 8037.
-
-  o Minor features (security):
-    - Clear keys and key-derived material left on the stack in
-      rendservice.c and rendclient.c. Check return value of
-      crypto_pk_write_private_key_to_string() in rend_service_load_keys().
-      These fixes should make us more forward-secure against cold-boot
-      attacks and the like. Fixes bug 2385.
-    - Use our own weak RNG when we need a weak RNG. Windows's rand() and
-      Irix's random() only return 15 bits; Solaris's random() returns more
-      bits but its RAND_MAX says it only returns 15, and so on. Motivated
-      by the fix for bug 7801; bugfix on 0.2.2.20-alpha.
-
-  o Minor features (control protocol):
-    - Add a "GETINFO signal/names" control port command. Implements
-      ticket 3842.
-    - Provide default values for all options via "GETINFO config/defaults".
-      Implements ticket 4971.
-    - Allow an optional $ before the node identity digest in the
-      controller command GETINFO ns/id/, for consistency with
-      md/id/ and desc/id/. Resolves ticket 7059.
-    - Add CACHED keyword to ADDRMAP events in the control protocol
-      to indicate whether a DNS result will be cached or not. Resolves
-      ticket 8596.
-    - Generate bootstrapping status update events correctly when fetching
-      microdescriptors. Fixes bug 9927.
-
-  o Minor features (path selection):
-    - When deciding whether we have enough descriptors to build circuits,
-      instead of looking at raw relay counts, look at which fraction
-      of (bandwidth-weighted) paths we're able to build. This approach
-      keeps clients from building circuits if their paths are likely to
-      stand out statistically. The default fraction of paths needed is
-      taken from the consensus directory; you can override it with the
-      new PathsNeededToBuildCircuits option. Fixes ticket 5956.
-    - When any country code is listed in ExcludeNodes or ExcludeExitNodes,
-      and we have GeoIP information, also exclude all nodes with unknown
-      countries "??" and "A1". This behavior is controlled by the
-      new GeoIPExcludeUnknown option: you can make such nodes always
-      excluded with "GeoIPExcludeUnknown 1", and disable the feature
-      with "GeoIPExcludeUnknown 0". Setting "GeoIPExcludeUnknown auto"
-      gets you the default behavior. Implements feature 7706.
-
-  o Minor features (hidden services):
-    - Improve circuit build timeout handling for hidden services.
-      In particular: adjust build timeouts more accurately depending
-      upon the number of hop-RTTs that a particular circuit type
-      undergoes. Additionally, launch intro circuits in parallel
-      if they timeout, and take the first one to reply as valid.
-    - The Tor client now ignores sub-domain components of a .onion
-      address. This change makes HTTP "virtual" hosting
-      possible: http://foo.aaaaaaaaaaaaaaaa.onion/ and
-      http://bar.aaaaaaaaaaaaaaaa.onion/ can be two different websites
-      hosted on the same hidden service. Implements proposal 204.
-    - Enable Tor to read configuration, state, and key information from
-      a FIFO. Previously Tor would only read from files with a positive
-      stat.st_size. Code from meejah; fixes bug 6044.
-
-  o Minor features (clients):
-    - Teach bridge-using clients to avoid 0.2.2.x bridges when making
-      microdescriptor-related dir requests, and only fall back to normal
-      descriptors if none of their bridges can handle microdescriptors
-      (as opposed to the fix in ticket 4013, which caused them to fall
-      back to normal descriptors if *any* of their bridges preferred
-      them). Resolves ticket 4994.
-    - Tweak tor-fw-helper to accept an arbitrary amount of arbitrary
-      TCP ports to forward. In the past it only accepted two ports:
-      the ORPort and the DirPort.
-
-  o Minor features (protecting client timestamps):
-    - Clients no longer send timestamps in their NETINFO cells. These were
-      not used for anything, and they provided one small way for clients
-      to be distinguished from each other as they moved from network to
-      network or behind NAT. Implements part of proposal 222.
-    - Clients now round timestamps in INTRODUCE cells down to the nearest
-      10 minutes. If a new Support022HiddenServices option is set to 0, or
-      if it's set to "auto" and the feature is disabled in the consensus,
-      the timestamp is sent as 0 instead. Implements part of proposal 222.
-    - Stop sending timestamps in AUTHENTICATE cells. This is not such
-      a big deal from a security point of view, but it achieves no actual
-      good purpose, and isn't needed. Implements part of proposal 222.
-    - Reduce down accuracy of timestamps in hidden service descriptors.
-      Implements part of proposal 222.
-
-  o Minor features (bridges):
-    - Make bridge relays check once a minute for whether their IP
-      address has changed, rather than only every 15 minutes. Resolves
-      bugs 1913 and 1992.
-    - Bridge statistics now count bridge clients connecting over IPv6:
-      bridge statistics files now list "bridge-ip-versions" and
-      extra-info documents list "geoip6-db-digest". The control protocol
-      "CLIENTS_SEEN" and "ip-to-country" queries now support IPv6. Initial
-      implementation by "shkoo", addressing ticket 5055.
-    - Add a new torrc option "ServerTransportListenAddr" to let bridge
-      operators select the address where their pluggable transports will
-      listen for connections. Resolves ticket 7013.
-    - Randomize the lifetime of our SSL link certificate, so censors can't
-      use the static value for filtering Tor flows. Resolves ticket 8443;
-      related to ticket 4014 which was included in 0.2.2.33.
-
-  o Minor features (relays):
-    - Option OutboundBindAddress can be specified multiple times and
-      accepts IPv6 addresses. Resolves ticket 6876.
-
-  o Minor features (IPv6, client side):
-    - AutomapHostsOnResolve now supports IPv6 addresses. By default, we
-      prefer to hand out virtual IPv6 addresses, since there are more of
-      them and we can't run out. To override this behavior and make IPv4
-      addresses preferred, set NoPreferIPv6Automap on whatever SOCKSPort
-      or DNSPort you're using for resolving. Implements ticket 7571.
-    - AutomapHostsOnResolve responses are now randomized, to avoid
-      annoying situations where Tor is restarted and applications
-      connect to the wrong addresses.
-    - Never try more than 1000 times to pick a new virtual address when
-      AutomapHostsOnResolve is set. That's good enough so long as we
-      aren't close to handing out our entire virtual address space;
-      if you're getting there, it's best to switch to IPv6 virtual
-      addresses anyway.
-
-  o Minor features (IPv6, relay/authority side):
-    - New config option "AuthDirHasIPv6Connectivity 1" that directory
-      authorities should set if they have IPv6 connectivity and want to
-      do reachability tests for IPv6 relays. Implements feature 5974.
-    - A relay with an IPv6 OR port now sends that address in NETINFO
-      cells (in addition to its other address). Implements ticket 6364.
-
-  o Minor features (directory authorities):
-    - Directory authorities no long accept descriptors for any version of
-      Tor before 0.2.2.35, or for any 0.2.3 release before 0.2.3.10-alpha.
-      These versions are insecure, unsupported, or both. Implements
-      ticket 6789.
-    - When directory authorities are computing thresholds for flags,
-      never let the threshold for the Fast flag fall below 4096
-      bytes. Also, do not consider nodes with extremely low bandwidths
-      when deciding thresholds for various directory flags. This change
-      should raise our threshold for Fast relays, possibly in turn
-      improving overall network performance; see ticket 1854. Resolves
-      ticket 8145.
-    - Directory authorities now include inside each vote a statement of
-      the performance thresholds they used when assigning flags.
-      Implements ticket 8151.
-    - Add an "ignoring-advertised-bws" boolean to the flag-threshold lines
-      in directory authority votes to describe whether they have enough
-      measured bandwidths to ignore advertised (relay descriptor)
-      bandwidth claims. Resolves ticket 8711.
-
-  o Minor features (path bias detection):
-    - Path Use Bias: Perform separate accounting for successful circuit
-      use. Keep separate statistics on stream attempt rates versus stream
-      success rates for each guard. Provide configurable thresholds to
-      determine when to emit log messages or disable use of guards that
-      fail too many stream attempts. Resolves ticket 7802.
-    - Create three levels of Path Bias log messages, as opposed to just
-      two. These are configurable via consensus as well as via the torrc
-      options PathBiasNoticeRate, PathBiasWarnRate, PathBiasExtremeRate.
-      The default values are 0.70, 0.50, and 0.30 respectively.
-    - Separate the log message levels from the decision to drop guards,
-      which also is available via torrc option PathBiasDropGuards.
-      PathBiasDropGuards still defaults to 0 (off).
-    - Deprecate PathBiasDisableRate in favor of PathBiasDropGuards
-      in combination with PathBiasExtremeRate.
-    - Increase the default values for PathBiasScaleThreshold and
-      PathBiasCircThreshold from (200, 20) to (300, 150).
-    - Add in circuit usage accounting to path bias. If we try to use a
-      built circuit but fail for any reason, it counts as path bias.
-      Certain classes of circuits where the adversary gets to pick your
-      destination node are exempt from this accounting. Usage accounting
-      can be specifically disabled via consensus parameter or torrc.
-    - Convert all internal path bias state to double-precision floating
-      point, to avoid roundoff error and other issues.
-    - Only record path bias information for circuits that have completed
-      *two* hops. Assuming end-to-end tagging is the attack vector, this
-      makes us more resilient to ambient circuit failure without any
-      detection capability loss.
-
-  o Minor features (build):
-    - Tor now builds correctly on Bitrig, an OpenBSD fork. Patch from
-      dhill. Resolves ticket 6982.
-    - Compile on win64 using mingw64. Fixes bug 7260; patches from
-      "yayooo".
-    - Work correctly on Unix systems where EAGAIN and EWOULDBLOCK are
-      separate error codes; or at least, don't break for that reason.
-      Fixes bug 7935. Reported by "oftc_must_be_destroyed".
-
-  o Build improvements (autotools):
-    - Warn if building on a platform with an unsigned time_t: there
-      are too many places where Tor currently assumes that time_t can
-      hold negative values. We'd like to fix them all, but probably
-      some will remain.
-    - Do not report status verbosely from autogen.sh unless the -v flag
-      is specified. Fixes issue 4664. Patch from Onizuka.
-    - Detect and reject attempts to build Tor with threading support
-      when OpenSSL has been compiled without threading support.
-      Fixes bug 6673.
-    - Try to detect if we are ever building on a platform where
-      memset(...,0,...) does not set the value of a double to 0.0. Such
-      platforms are permitted by the C standard, though in practice
-      they're pretty rare (since IEEE 754 is nigh-ubiquitous). We don't
-      currently support them, but it's better to detect them and fail
-      than to perform erroneously.
-    - We no longer warn so much when generating manpages from their
-      asciidoc source.
-    - Use Ville Laurikari's implementation of AX_CHECK_SIGN() to determine
-      the signs of types during autoconf. This is better than our old
-      approach, which didn't work when cross-compiling.
-
-  o Minor features (log messages, warnings):
-    - Detect when we're running with a version of OpenSSL other than the
-      one we compiled with. This conflict has occasionally given people
-      hard-to-track-down errors.
-    - Warn users who run hidden services on a Tor client with
-      UseEntryGuards disabled that their hidden services will be
-      vulnerable to http://freehaven.net/anonbib/#hs-attack06 (the
-      attack which motivated Tor to support entry guards in the first
-      place). Resolves ticket 6889.
-    - Warn when we are binding low ports when hibernation is enabled;
-      previously we had warned when we were _advertising_ low ports with
-      hibernation enabled. Fixes bug 7285; bugfix on 0.2.3.9-alpha.
-    - Issue a warning when running with the bufferevents backend enabled.
-      It's still not stable, and people should know that they're likely
-      to hit unexpected problems. Closes ticket 9147.
-
-  o Minor features (log messages, notices):
-    - Refactor resolve_my_address() so it returns the method by which we
-      decided our public IP address (explicitly configured, resolved from
-      explicit hostname, guessed from interfaces, learned by gethostname).
-      Now we can provide more helpful log messages when a relay guesses
-      its IP address incorrectly (e.g. due to unexpected lines in
-      /etc/hosts). Resolves ticket 2267.
-    - Track how many "TAP" and "NTor" circuit handshake requests we get,
-      and how many we complete, and log it every hour to help relay
-      operators follow trends in network load. Addresses ticket 9658.
-
-  o Minor features (log messages, diagnostics):
-    - If we fail to free a microdescriptor because of bug 7164, log
-      the filename and line number from which we tried to free it.
-    - We compute the overhead from passing onionskins back and forth to
-      cpuworkers, and report it when dumping statistics in response to
-      SIGUSR1. Supports ticket 7291.
-    - Add another diagnostic to the heartbeat message: track and log
-      overhead that TLS is adding to the data we write. If this is
-      high, we are sending too little data to SSL_write at a time.
-      Diagnostic for bug 7707.
-    - Log packaged cell fullness as part of the heartbeat message.
-      Diagnosis to try to determine the extent of bug 7743.
-    - Add more detail to a log message about relaxed timeouts, to help
-      track bug 7799.
-    - When learning a fingerprint for a bridge, log its corresponding
-      transport type. Implements ticket 7896.
-    - Warn more aggressively when flushing microdescriptors to a
-      microdescriptor cache fails, in an attempt to mitigate bug 8031,
-      or at least make it more diagnosable.
-    - Improve the log message when "Bug/attack: unexpected sendme cell
-      from client" occurs, to help us track bug 8093.
-    - Improve debugging output to help track down bug 8185 ("Bug:
-      outgoing relay cell has n_chan==NULL. Dropping.")
-
-  o Minor features (log messages, quieter bootstrapping):
-    - Log fewer lines at level "notice" about our OpenSSL and Libevent
-      versions and capabilities when everything is going right. Resolves
-      part of ticket 6736.
-    - Omit the first heartbeat log message, because it never has anything
-      useful to say, and it clutters up the bootstrapping messages.
-      Resolves ticket 6758.
-    - Don't log about reloading the microdescriptor cache at startup. Our
-      bootstrap warnings are supposed to tell the user when there's a
-      problem, and our bootstrap notices say when there isn't. Resolves
-      ticket 6759; bugfix on 0.2.2.6-alpha.
-    - Don't log "I learned some more directory information" when we're
-      reading cached directory information. Reserve it for when new
-      directory information arrives in response to a fetch. Resolves
-      ticket 6760.
-    - Don't complain about bootstrapping problems while hibernating.
-      These complaints reflect a general code problem, but not one
-      with any problematic effects (no connections are actually
-      opened). Fixes part of bug 7302; bugfix on 0.2.3.2-alpha.
-
-  o Minor features (testing):
-    - In our testsuite, create temporary directories with a bit more
-      entropy in their name to make name collisions less likely. Fixes
-      bug 8638.
-    - Add benchmarks for DH (1024-bit multiplicative group) and ECDH
-      (P-256) Diffie-Hellman handshakes to src/or/bench.
-    - Add benchmark functions to test onion handshake performance.
-
-  o Renamed options:
-    - The DirServer option is now DirAuthority, for consistency with
-      current naming patterns. You can still use the old DirServer form.
-
-  o Minor bugfixes (protocol):
-    - Fix the handling of a TRUNCATE cell when it arrives while the
-      circuit extension is in progress. Fixes bug 7947; bugfix on 0.0.7.1.
-    - When a Tor client gets a "truncated" relay cell, the first byte of
-      its payload specifies why the circuit was truncated. We were
-      ignoring this 'reason' byte when tearing down the circuit, resulting
-      in the controller not being told why the circuit closed. Now we
-      pass the reason from the truncated cell to the controller. Bugfix
-      on 0.1.2.3-alpha; fixes bug 7039.
-    - Fix a misframing issue when reading the version numbers in a
-      VERSIONS cell. Previously we would recognize [00 01 00 02] as
-      'version 1, version 2, and version 0x100', when it should have
-      only included versions 1 and 2. Fixes bug 8059; bugfix on
-      0.2.0.10-alpha. Reported pseudonymously.
-    - Make the format and order of STREAM events for DNS lookups
-      consistent among the various ways to launch DNS lookups. Fixes
-      bug 8203; bugfix on 0.2.0.24-rc. Patch by "Desoxy".
-
-  o Minor bugfixes (syscalls and disk interaction):
-    - Always check the return values of functions fcntl() and
-      setsockopt(). We don't believe these are ever actually failing in
-      practice, but better safe than sorry. Also, checking these return
-      values should please analysis tools like Coverity. Patch from
-      'flupzor'. Fixes bug 8206; bugfix on all versions of Tor.
-    - Avoid double-closing the listener socket in our socketpair()
-      replacement (used on Windows) in the case where the addresses on
-      our opened sockets don't match what we expected. Fixes bug 9400;
-      bugfix on 0.0.2pre7. Found by Coverity.
-    - Correctly store microdescriptors and extrainfo descriptors that
-      include an internal NUL byte. Fixes bug 8037; bugfix on
-      0.2.0.1-alpha. Bug reported by "cypherpunks".
-    - If for some reason we fail to write a microdescriptor while
-      rebuilding the cache, do not let the annotations from that
-      microdescriptor linger in the cache file, and do not let the
-      microdescriptor stay recorded as present in its old location.
-      Fixes bug 9047; bugfix on 0.2.2.6-alpha.
-    - Use direct writes rather than stdio when building microdescriptor
-      caches, in an attempt to mitigate bug 8031, or at least make it
-      less common.
-
-  o Minor fixes (config options):
-    - Warn and fail if a server is configured not to advertise any
-      ORPorts at all. (We need *something* to put in our descriptor,
-      or we just won't work.)
-    - Behave correctly when the user disables LearnCircuitBuildTimeout
-      but doesn't tell us what they would like the timeout to be. Fixes
-      bug 6304; bugfix on 0.2.2.14-alpha.
-    - Rename the (internal-use-only) UsingTestingNetworkDefaults option
-      to start with a triple-underscore so the controller won't touch it.
-      Patch by Meejah. Fixes bug 3155. Bugfix on 0.2.2.23-alpha.
-    - Rename the (testing-use-only) _UseFilteringSSLBufferevents option
-      so it doesn't start with _. Fixes bug 3155. Bugfix on 0.2.3.1-alpha.
-    - When autodetecting the number of CPUs, use the number of available
-      CPUs in preference to the number of configured CPUs. Inform the
-      user if this reduces the number of available CPUs. Fixes bug 8002;
-      bugfix on 0.2.3.1-alpha.
-    - Command-line option "--version" implies "--quiet". Fixes bug 6997.
-    - Make it an error when you set EntryNodes but disable UseGuardNodes,
-      since it will (surprisingly to some users) ignore EntryNodes. Fixes
-      bug 8180; bugfix on 0.2.3.11-alpha.
-    - Avoid overflows when the user sets MaxCircuitDirtiness to a
-      ridiculously high value, by imposing a (ridiculously high) 30-day
-      maximum on MaxCircuitDirtiness.
-
-  o Minor bugfixes (control protocol):
-    - Stop sending a stray "(null)" in some cases for the server status
-      "EXTERNAL_ADDRESS" controller event. Resolves bug 8200; bugfix
-      on 0.1.2.6-alpha.
-    - The ADDRMAP command can no longer generate an ill-formed error
-      code on a failed MAPADDRESS. It now says "internal" rather than
-      an English sentence fragment with spaces in the middle. Bugfix on
-      Tor 0.2.0.19-alpha.
-
-  o Minor bugfixes (clients / edges):
-    - When we receive a RELAY_END cell with the reason DONE, or with no
-      reason, before receiving a RELAY_CONNECTED cell, report the SOCKS
-      status as "connection refused". Previously we reported these cases
-      as success but then immediately closed the connection. Fixes bug
-      7902; bugfix on 0.1.0.1-rc. Reported by "oftc_must_be_destroyed".
-    - If the guard we choose first doesn't answer, we would try the
-      second guard, but once we connected to the second guard we would
-      abandon it and retry the first one, slowing down bootstrapping.
-      The fix is to treat all our initially chosen guards as acceptable
-      to use. Fixes bug 9946; bugfix on 0.1.1.11-alpha.
-    - When choosing which stream on a formerly stalled circuit to wake
-      first, make better use of the platform's weak RNG. Previously,
-      we had been using the % ("modulo") operator to try to generate a
-      1/N chance of picking each stream, but this behaves badly with
-      many platforms' choice of weak RNG. Fixes bug 7801; bugfix on
-      0.2.2.20-alpha.
-
-  o Minor bugfixes (path bias detection):
-    - If the state file's path bias counts are invalid (presumably from a
-      buggy Tor prior to 0.2.4.10-alpha), make them correct. Also add
-      additional checks and log messages to the scaling of Path Bias
-      counts, in case there still are remaining issues with scaling.
-      Should help resolve bug 8235.
-    - Prevent rounding error in path bias counts when scaling
-      them down, and use the correct scale factor default. Also demote
-      some path bias related log messages down a level and make others
-      less scary sounding. Fixes bug 6647. Bugfix on 0.2.3.17-beta.
-    - Remove a source of rounding error during path bias count scaling;
-      don't count cannibalized circuits as used for path bias until we
-      actually try to use them; and fix a circuit_package_relay_cell()
-      warning message about n_chan==NULL. Fixes bug 7802.
-    - Paste the description for PathBias parameters from the man
-      page into or.h, so the code documents them too. Fixes bug 7982;
-      bugfix on 0.2.3.17-beta.
-
-  o Minor bugfixes (relays):
-    - Stop trying to resolve our hostname so often (e.g. every time we
-      think about doing a directory fetch). Now we reuse the cached
-      answer in some cases. Fixes bugs 1992 (bugfix on 0.2.0.20-rc)
-      and 2410 (bugfix on 0.1.2.2-alpha).
-    - When examining the list of network interfaces to find our address,
-      do not consider non-running or disabled network interfaces. Fixes
-      bug 9904; bugfix on 0.2.3.11-alpha. Patch from "hantwister".
-
-  o Minor bugfixes (blocking resistance):
-    - Only disable TLS session ticket support when running as a TLS
-      server. Now clients will blend better with regular Firefox
-      connections. Fixes bug 7189; bugfix on Tor 0.2.3.23-rc.
-
-  o Minor bugfixes (IPv6):
-    - Use square brackets around IPv6 addresses in numerous places
-      that needed them, including log messages, HTTPS CONNECT proxy
-      requests, TransportProxy statefile entries, and pluggable transport
-      extra-info lines. Fixes bug 7011; patch by David Fifield.
-
-  o Minor bugfixes (directory authorities):
-    - Reject consensus votes with more than 64 known-flags. We aren't even
-      close to that limit yet, and our code doesn't handle it correctly.
-      Fixes bug 6833; bugfix on 0.2.0.1-alpha.
-    - Correctly handle votes with more than 31 flags. Fixes bug 6853;
-      bugfix on 0.2.0.3-alpha.
-
-  o Minor bugfixes (memory leaks):
-    - Avoid leaking memory if we fail to compute a consensus signature
-      or we generate a consensus we can't parse. Bugfix on 0.2.0.5-alpha.
-    - Fix a memory leak when receiving headers from an HTTPS proxy. Bugfix
-      on 0.2.1.1-alpha; fixes bug 7816.
-    - Fix a memory leak during safe-cookie controller authentication.
-      Bugfix on 0.2.3.13-alpha; fixes bug 7816.
-    - Free some more still-in-use memory at exit, to make hunting for
-      memory leaks easier. Resolves bug 7029.
-
-  o Minor bugfixes (code correctness):
-    - Increase the width of the field used to remember a connection's
-      link protocol version to two bytes. Harmless for now, since the
-      only currently recognized versions are one byte long. Reported
-      pseudonymously. Fixes bug 8062; bugfix on 0.2.0.10-alpha.
-    - Fix a crash when debugging unit tests on Windows: deallocate a
-      shared library with FreeLibrary, not CloseHandle. Fixes bug 7306;
-      bugfix on 0.2.2.17-alpha. Reported by "ultramage".
-    - When detecting the largest possible file descriptor (in order to
-      close all file descriptors when launching a new program), actually
-      use _SC_OPEN_MAX. The old code for doing this was very, very broken.
-      Fixes bug 8209; bugfix on 0.2.3.1-alpha. Found by Coverity; this
-      is CID 743383.
-    - Avoid a crash if we fail to generate an extrainfo descriptor.
-      Fixes bug 8208; bugfix on 0.2.3.16-alpha. Found by Coverity;
-      this is CID 718634.
-    - Avoid an off-by-one error when checking buffer boundaries when
-      formatting the exit status of a pluggable transport helper.
-      This is probably not an exploitable bug, but better safe than
-      sorry. Fixes bug 9928; bugfix on 0.2.3.18-rc. Bug found by
-      Pedro Ribeiro.
-    - Get rid of a couple of harmless clang warnings, where we compared
-      enums to ints. These warnings are newly introduced in clang 3.2.
-
-  o Minor bugfixes (code cleanliness):
-    - Avoid use of reserved identifiers in our C code. The C standard
-      doesn't like us declaring anything that starts with an
-      underscore, so let's knock it off before we get in trouble. Fix
-      for bug 1031; bugfix on the first Tor commit.
-    - Fix round_to_power_of_2() so it doesn't invoke undefined behavior
-      with large values. This situation was untriggered, but nevertheless
-      incorrect. Fixes bug 6831; bugfix on 0.2.0.1-alpha.
-    - Fix an impossible buffer overrun in the AES unit tests. Fixes
-      bug 8845; bugfix on 0.2.0.7-alpha. Found by eugenis.
-    - Fix handling of rendezvous client authorization types over 8.
-      Fixes bug 6861; bugfix on 0.2.1.5-alpha.
-    - Remove a couple of extraneous semicolons that were upsetting the
-      cparser library. Patch by Christian Grothoff. Fixes bug 7115;
-      bugfix on 0.2.2.1-alpha.
-    - When complaining about a client port on a public address, log
-      which address we're complaining about. Fixes bug 4020; bugfix on
-      0.2.3.3-alpha. Patch by Tom Fitzhenry.
-
-  o Minor bugfixes (log messages, warnings):
-    - If we encounter a write failure on a SOCKS connection before we
-      finish our SOCKS handshake, don't warn that we closed the
-      connection before we could send a SOCKS reply. Fixes bug 8427;
-      bugfix on 0.1.0.1-rc.
-    - Fix a directory authority warn caused when we have a large amount
-      of badexit bandwidth. Fixes bug 8419; bugfix on 0.2.2.10-alpha.
-    - Downgrade "Failed to hand off onionskin" messages to "debug"
-      severity, since they're typically redundant with the "Your computer
-      is too slow" messages. Fixes bug 7038; bugfix on 0.2.2.16-alpha.
-    - Avoid spurious warnings when configuring multiple client ports of
-      which only some are nonlocal. Previously, we had claimed that some
-      were nonlocal when in fact they weren't. Fixes bug 7836; bugfix on
-      0.2.3.3-alpha.
-
-  o Minor bugfixes (log messages, other):
-    - Fix log messages and comments to avoid saying "GMT" when we mean
-      "UTC". Fixes bug 6113.
-    - When rejecting a configuration because we were unable to parse a
-      quoted string, log an actual error message. Fixes bug 7950; bugfix
-      on 0.2.0.16-alpha.
-    - Correctly recognize that [::1] is a loopback address. Fixes
-      bug 8377; bugfix on 0.2.1.3-alpha.
-    - Don't log inappropriate heartbeat messages when hibernating: a
-      hibernating node is _expected_ to drop out of the consensus,
-      decide it isn't bootstrapped, and so forth. Fixes bug 7302;
-      bugfix on 0.2.3.1-alpha.
-    - Eliminate several instances where we use "Nickname=ID" to refer to
-      nodes in logs. Use "Nickname (ID)" instead. (Elsewhere, we still use
-      "$ID=Nickname", which is also acceptable.) Fixes bug 7065. Bugfix
-      on 0.2.3.21-rc.
-
-  o Minor bugfixes (build):
-    - Fix some bugs in tor-fw-helper-natpmp when trying to build and
-      run it on Windows. More bugs likely remain. Patch from Gisle Vanem.
-      Fixes bug 7280; bugfix on 0.2.3.1-alpha.
-
-  o Documentation fixes:
-    - Make the torify manpage no longer refer to tsocks; torify hasn't
-      supported tsocks since 0.2.3.14-alpha.
-    - Make the tor manpage no longer reference tsocks.
-    - Fix the GeoIPExcludeUnknown documentation to refer to
-      ExcludeExitNodes rather than the currently nonexistent
-      ExcludeEntryNodes. Spotted by "hamahangi" on tor-talk.
-    - Resolve a typo in torrc.sample.in. Fixes bug 6819; bugfix on
-      0.2.3.14-alpha.
-    - Say "KBytes" rather than "KB" in the man page (for various values
-      of K), to further reduce confusion about whether Tor counts in
-      units of memory or fractions of units of memory. Resolves ticket 7054.
-    - Update tor-fw-helper.1.txt and tor-fw-helper.c to make option
-      names match. Fixes bug 7768.
-    - Fix the documentation of HeartbeatPeriod to say that the heartbeat
-      message is logged at notice, not at info.
-    - Clarify the usage and risks of setting the ContactInfo torrc line
-      for your relay or bridge. Resolves ticket 9854.
-    - Add anchors to the manpage so we can link to the html version of
-      the documentation for specific options. Resolves ticket 9866.
-    - Replace remaining references to DirServer in man page and
-      log entries. Resolves ticket 10124.
-
-  o Removed features:
-    - Stop exporting estimates of v2 and v3 directory traffic shares
-      in extrainfo documents. They were unneeded and sometimes inaccurate.
-      Also stop exporting any v2 directory request statistics. Resolves
-      ticket 5823.
-    - Drop support for detecting and warning about versions of Libevent
-      before 1.3e. Nothing reasonable ships with them any longer; warning
-      the user about them shouldn't be needed. Resolves ticket 6826.
-    - Now that all versions before 0.2.2.x are disallowed, we no longer
-      need to work around their missing features. Remove a bunch of
-      compatibility code.
-
-  o Removed files:
-    - The tor-tsocks.conf is no longer distributed or installed. We
-      recommend that tsocks users use torsocks instead. Resolves
-      ticket 8290.
-    - Remove some of the older contents of doc/ as obsolete; move others
-      to torspec.git. Fixes bug 8965.
-
-  o Code simplification:
-    - Avoid using character buffers when constructing most directory
-      objects: this approach was unwieldy and error-prone. Instead,
-      build smartlists of strings, and concatenate them when done.
-    - Rename "isin" functions to "contains", for grammar. Resolves
-      ticket 5285.
-    - Rename Tor's logging function log() to tor_log(), to avoid conflicts
-      with the natural logarithm function from the system libm. Resolves
-      ticket 7599.
-    - Start using OpenBSD's implementation of queue.h, so that we don't
-      need to hand-roll our own pointer and list structures whenever we
-      need them. (We can't rely on a sys/queue.h, since some operating
-      systems don't have them, and the ones that do have them don't all
-      present the same extensions.)
-    - Start using OpenBSD's implementation of queue.h (originally by
-      Niels Provos).
-    - Enhance our internal sscanf replacement so that we can eliminate
-      the last remaining uses of the system sscanf. (Though those uses
-      of sscanf were safe, sscanf itself is generally error prone, so
-      we want to eliminate when we can.) Fixes ticket 4195 and Coverity
-      CID 448.
-    - Replace all calls to snprintf() outside of src/ext with
-      tor_snprintf(). Also remove the #define to replace snprintf with
-      _snprintf on Windows; they have different semantics, and all of
-      our callers should be using tor_snprintf() anyway. Fixes bug 7304.
-
-  o Refactoring:
-    - Add a wrapper function for the common "log a message with a
-      rate-limit" case.
-    - Split the onion.c file into separate modules for the onion queue
-      and the different handshakes it supports.
-    - Move the client-side address-map/virtual-address/DNS-cache code
-      out of connection_edge.c into a new addressmap.c module.
-    - Move the entry node code from circuitbuild.c to its own file.
-    - Move the circuit build timeout tracking code from circuitbuild.c
-      to its own file.
-    - Source files taken from other packages now reside in src/ext;
-      previously they were scattered around the rest of Tor.
-    - Move the generic "config" code into a new file, and have "config.c"
-      hold only torrc- and state-related code. Resolves ticket 6823.
-    - Move the core of our "choose a weighted element at random" logic
-      into its own function, and give it unit tests. Now the logic is
-      testable, and a little less fragile too.
-    - Move ipv6_preferred from routerinfo_t to node_t. Addresses bug 4620.
-    - Move last_reachable and testing_since from routerinfo_t to node_t.
-      Implements ticket 5529.
-    - Add replaycache_t structure, functions and unit tests, then refactor
-      rend_service_introduce() to be more clear to read, improve, debug,
-      and test. Resolves bug 6177.
-
-  o Removed code:
-    - Remove some now-needless code that tried to aggressively flush
-      OR connections as data was added to them. Since 0.2.0.1-alpha, our
-      cell queue logic has saved us from the failure mode that this code
-      was supposed to prevent. Removing this code will limit the number
-      of baroque control flow paths through Tor's network logic. Reported
-      pseudonymously on IRC. Fixes bug 6468; bugfix on 0.2.0.1-alpha.
-    - Remove unused code for parsing v1 directories and "running routers"
-      documents. Fixes bug 6887.
-    - Remove the marshalling/unmarshalling code for sending requests to
-      cpuworkers over a socket, and instead just send structs. The
-      recipient will always be the same Tor binary as the sender, so
-      any encoding is overkill.
-    - Remove the testing_since field of node_t, which hasn't been used
-      for anything since 0.2.0.9-alpha.
-    - Finally remove support for malloc_good_size and malloc_usable_size.
-      We had hoped that these functions would let us eke a little more
-      memory out of our malloc implementation. Unfortunately, the only
-      implementations that provided these functions are also ones that
-      are already efficient about not overallocation: they never got us
-      more than 7 or so bytes per allocation. Removing them saves us a
-      little code complexity and a nontrivial amount of build complexity.
-
-
-Changes in version 0.2.3.25 - 2012-11-19
-  The Tor 0.2.3 release series is dedicated to the memory of Len "rabbi"
-  Sassaman (1980-2011), a long-time cypherpunk, anonymity researcher,
-  Mixmaster maintainer, Pynchon Gate co-designer, CodeCon organizer,
-  programmer, and friend. Unstinting in his dedication to the cause of
-  freedom, he inspired and helped many of us as we began our work on
-  anonymity, and inspires us still. Please honor his memory by writing
-  software to protect people's freedoms, and by helping others to do so.
-
-  Tor 0.2.3.25, the first stable release in the 0.2.3 branch, features
-  significantly reduced directory overhead (via microdescriptors),
-  enormous crypto performance improvements for fast relays on new
-  enough hardware, a new v3 TLS handshake protocol that can better
-  resist fingerprinting, support for protocol obfuscation plugins (aka
-  pluggable transports), better scalability for hidden services, IPv6
-  support for bridges, performance improvements like allowing clients
-  to skip the first round-trip on the circuit ("optimistic data") and
-  refilling token buckets more often, a new "stream isolation" design
-  to isolate different applications on different circuits, and many
-  stability, security, and privacy fixes.
-
-  Major features (v3 directory protocol):
-    - Clients now use microdescriptors instead of regular descriptors
-      to build circuits. Microdescriptors are authority-generated
-      summaries of regular descriptors' contents, designed to change very
-      rarely (see proposal 158 for details). This feature is designed
-      to save bandwidth, especially for clients on slow internet
-      connections. Use "UseMicrodescriptors 0" to disable it.
-    - Caches now download, cache, and serve microdescriptors, as well
-      as multiple "flavors" of the consensus, including a flavor that
-      describes microdescriptors.
-
-  o Major features (build hardening):
-    - Enable gcc and ld hardening by default. Resolves ticket 5210.
-
-  o Major features (relay scaling):
-    - When built to use OpenSSL 1.0.1, and built for an x86 or x86_64
-      instruction set, take advantage of OpenSSL's AESNI, bitsliced, or
-      vectorized AES implementations as appropriate. These can be much,
-      much faster than other AES implementations.
-    - When using OpenSSL 1.0.0 or later, use OpenSSL's counter mode
-      implementation. It makes AES_CTR about 7% faster than our old one
-      (which was about 10% faster than the one OpenSSL used to provide).
-      Resolves ticket 4526.
-    - Use OpenSSL's EVP interface for AES encryption, so that all AES
-      operations can use hardware acceleration (if present). Resolves
-      ticket 4442.
-    - Unconditionally use OpenSSL's AES implementation instead of our
-      old built-in one. OpenSSL's AES has been better for a while, and
-      relatively few servers should still be on any version of OpenSSL
-      that doesn't have good optimized assembly AES.
-
-  o Major features (blocking resistance):
-    - Update TLS cipher list to match Firefox 8 and later. Resolves
-      ticket 4744.
-    - Remove support for clients falsely claiming to support standard
-      ciphersuites that they can actually provide. As of modern OpenSSL
-      versions, it's not necessary to fake any standard ciphersuite,
-      and doing so prevents us from using better ciphersuites in the
-      future, since servers can't know whether an advertised ciphersuite
-      is really supported or not. Some hosts -- notably, ones with very
-      old versions of OpenSSL or where OpenSSL has been built with ECC
-      disabled -- will stand out because of this change; TBB users should
-      not be affected. Implements the client side of proposal 198.
-    - Implement a new handshake protocol (v3) for authenticating Tors to
-      each other over TLS. It should be more resistant to fingerprinting
-      than previous protocols, and should require less TLS hacking for
-      future Tor implementations. Implements proposal 176.
-    - Allow variable-length padding cells, to disguise the length of
-      Tor's TLS records. Implements part of proposal 184.
-    - While we're trying to bootstrap, record how many TLS connections
-      fail in each state, and report which states saw the most failures
-      in response to any bootstrap failures. This feature may speed up
-      diagnosis of censorship events. Implements ticket 3116.
-
-  o Major features (pluggable transports):
-    - Clients and bridges can now be configured to use a separate
-      "transport" proxy. This approach makes the censorship arms race
-      easier by allowing bridges to use protocol obfuscation plugins.
-      Implements proposal 180 (tickets 2841 and 3472).
-
-  o Major features (DoS resistance):
-    - Now that Tor 0.2.0.x is completely deprecated, enable the final
-      part of "Proposal 110: Avoiding infinite length circuits" by
-      refusing all circuit-extend requests that do not use a relay_early
-      cell. This change helps Tor resist a class of denial-of-service
-      attacks by limiting the maximum circuit length.
-    - Tear down the circuit if we get an unexpected SENDME cell. Clients
-      could use this trick to make their circuits receive cells faster
-      than our flow control would have allowed, or to gum up the network,
-      or possibly to do targeted memory denial-of-service attacks on
-      entry nodes. Fixes bug 6252. Bugfix on the 54th commit on Tor --
-      from July 2002, before the release of Tor 0.0.0.
-
-  o Major features (hidden services):
-    - Adjust the number of introduction points that a hidden service
-      will try to maintain based on how long its introduction points
-      remain in use and how many introductions they handle. Fixes
-      part of bug 3825.
-    - Add a "tor2web mode" for clients that want to connect to hidden
-      services non-anonymously (and possibly more quickly). As a safety
-      measure to try to keep users from turning this on without knowing
-      what they are doing, tor2web mode must be explicitly enabled at
-      compile time, and a copy of Tor compiled to run in tor2web mode
-      cannot be used as a normal Tor client. Implements feature 2553.
-
-  o Major features (IPv6):
-    - Clients can now connect to private bridges over IPv6. Bridges
-      still need at least one IPv4 address in order to connect to
-      other relays. Note that we don't yet handle the case where the
-      user has two bridge lines for the same bridge (one IPv4, one
-      IPv6). Implements parts of proposal 186.
-
-  o Major features (directory authorities):
-    - Use a more secure consensus parameter voting algorithm. Now at
-      least three directory authorities or a majority of them must
-      vote on a given parameter before it will be included in the
-      consensus. Implements proposal 178.
-    - Remove the artificially low cutoff of 20KB to guarantee the Fast
-      flag. In the past few years the average relay speed has picked
-      up, and while the "top 7/8 of the network get the Fast flag" and
-      "all relays with 20KB or more of capacity get the Fast flag" rules
-      used to have the same result, now the top 7/8 of the network has
-      a capacity more like 32KB. Bugfix on 0.2.1.14-rc. Fixes bug 4489.
-
-  o Major features (performance):
-    - Exit nodes now accept and queue data on not-yet-connected streams.
-      Previously, the client wasn't allowed to send data until the
-      stream was connected, which slowed down all connections. This
-      change will enable clients to perform a "fast-start" on streams
-      and send data without having to wait for a confirmation that the
-      stream has opened. Patch from Ian Goldberg; implements the server
-      side of Proposal 174.
-    - When using an exit relay running 0.2.3.x, clients can now
-      "optimistically" send data before the exit relay reports that
-      the stream has opened. This saves a round trip when starting
-      connections where the client speaks first (such as web browsing).
-      This behavior is controlled by a consensus parameter (currently
-      disabled). To turn it on or off manually, use the "OptimisticData"
-      torrc option. Implements proposal 181; code by Ian Goldberg.
-    - Add a new TokenBucketRefillInterval option to refill token buckets
-      more frequently than once per second. This should improve network
-      performance, alleviate queueing problems, and make traffic less
-      bursty. Implements proposal 183; closes ticket 3630. Design by
-      Florian Tschorsch and Björn Scheuermann; implementation by
-      Florian Tschorsch.
-    - Raise the threshold of server descriptors needed (75%) and exit
-      server descriptors needed (50%) before we will declare ourselves
-      bootstrapped. This will make clients start building circuits a
-      little later, but makes the initially constructed circuits less
-      skewed and less in conflict with further directory fetches. Fixes
-      ticket 3196.
-
-  o Major features (relays):
-    - Relays now try regenerating and uploading their descriptor more
-      frequently if they are not listed in the consensus, or if the
-      version of their descriptor listed in the consensus is too
-      old. This fix should prevent situations where a server declines
-      to re-publish itself because it has done so too recently, even
-      though the authorities decided not to list its recent-enough
-      descriptor. Fix for bug 3327.
-
-  o Major features (stream isolation):
-    - You can now configure Tor so that streams from different
-      applications are isolated on different circuits, to prevent an
-      attacker who sees your streams as they leave an exit node from
-      linking your sessions to one another. To do this, choose some way
-      to distinguish the applications: have them connect to different
-      SocksPorts, or have one of them use SOCKS4 while the other uses
-      SOCKS5, or have them pass different authentication strings to the
-      SOCKS proxy. Then, use the new SocksPort syntax to configure the
-      degree of isolation you need. This implements Proposal 171.
-    - There's a new syntax for specifying multiple client ports (such as
-      SOCKSPort, TransPort, DNSPort, NATDPort): you can now just declare
-      multiple *Port entries with full addr:port syntax on each.
-      The old *ListenAddress format is still supported, but you can't
-      mix it with the new *Port syntax.
-
-  o Major features (bufferevents):
-    - Tor can now optionally build with the "bufferevents" buffered IO
-      backend provided by Libevent 2. To use this feature, make sure you
-      have the latest possible version of Libevent, and pass the
-      --enable-bufferevents flag to configure when building Tor from
-      source. This feature will make our networking code more flexible,
-      let us stack layers on each other, and let us use more efficient
-      zero-copy transports where available.
-    - Add experimental support for running on Windows with IOCP and no
-      kernel-space socket buffers. This feature is controlled by a new
-      "UserspaceIOCPBuffers" config option (off by default), which has
-      no effect unless Tor has been built with bufferevents enabled,
-      you're running on Windows, and you've set "DisableIOCP 0". In the
-      long run, this may help solve or mitigate bug 98.
-
-  o Major features (path selection):
-    - The EntryNodes option can now include country codes like {de} or IP
-      addresses or network masks. Previously we had disallowed these
-      options because we didn't have an efficient way to keep the list up
-      to date. Addresses ticket 1982, but see bug 2798 for an unresolved
-      issue here.
-
-  o Major features (port forwarding):
-    - Add support for automatic port mapping on the many home routers
-      that support NAT-PMP or UPnP. To build the support code, you'll
-      need to have the libnatpnp library and/or the libminiupnpc library,
-      and you'll need to enable the feature specifically by passing
-      "--enable-upnp" and/or "--enable-natpnp" to ./configure. To turn
-      it on, use the new PortForwarding option.
-
-  o Major features (logging):
-    - Add a new 'Heartbeat' log message type to periodically log a message
-      describing Tor's status at level Notice. This feature is meant for
-      operators who log at notice, and want to make sure that their Tor
-      server is still working. Implementation by George Kadianakis.
-    - Make logging resolution configurable with a new LogTimeGranularity
-      option, and change the default from 1 millisecond to 1 second.
-      Implements enhancement 1668.
-
-  o Major features (other):
-    - New "DisableNetwork" config option to prevent Tor from launching any
-      connections or accepting any connections except on a control port.
-      Bundles and controllers can set this option before letting Tor talk
-      to the rest of the network, for example to prevent any connections
-      to a non-bridge address. Packages like Orbot can also use this
-      option to instruct Tor to save power when the network is off.
-    - Try to use system facilities for enumerating local interface
-      addresses, before falling back to our old approach (which was
-      binding a UDP socket, and calling getsockname() on it). That
-      approach was scaring OS X users whose draconian firewall
-      software warned about binding to UDP sockets regardless of
-      whether packets were sent. Now we try to use getifaddrs(),
-      SIOCGIFCONF, or GetAdaptersAddresses(), depending on what the
-      system supports. Resolves ticket 1827.
-    - Add experimental support for a "defaults" torrc file to be parsed
-      before the regular torrc. Torrc options override the defaults file's
-      options in the same way that the command line overrides the torrc.
-      The SAVECONF controller command saves only those options which
-      differ between the current configuration and the defaults file. HUP
-      reloads both files. Implements task 4552.
-
-  o New directory authorities:
-    - Add Faravahar (run by Sina Rabbani) as the ninth v3 directory
-      authority. Closes ticket 5749.
-
-  o Security/privacy fixes:
-    - Avoid read-from-freed-memory and double-free bugs that could occur
-      when a DNS request fails while launching it. Fixes bug 6480;
-      bugfix on 0.2.0.1-alpha.
-    - Reject any attempt to extend to an internal address. Without
-      this fix, a router could be used to probe addresses on an internal
-      network to see whether they were accepting connections. Fixes bug
-      6710; bugfix on 0.0.8pre1.
-    - Close any connection that sends unrecognized junk before the TLS
-      handshake. Solves an issue noted in bug 4369.
-    - The advertised platform of a relay now includes only its operating
-      system's name (e.g., "Linux", "Darwin", "Windows 7"), and not
-      its service pack level (for Windows) or its CPU architecture
-      (for Unix). Also drop the "git-XYZ" tag in the version. Packagers
-      can insert an extra string in the platform line by setting the
-      preprocessor variable TOR_BUILD_TAG. Resolves bug 2988.
-    - Disable TLS session tickets. OpenSSL's implementation was giving
-      our TLS session keys the lifetime of our TLS context objects, when
-      perfect forward secrecy would want us to discard anything that
-      could decrypt a link connection as soon as the link connection
-      was closed. Fixes bug 7139; bugfix on all versions of Tor linked
-      against OpenSSL 1.0.0 or later. Found by Florent Daignière.
-    - Tor tries to wipe potentially sensitive data after using it, so
-      that if some subsequent security failure exposes Tor's memory,
-      the damage will be limited. But we had a bug where the compiler
-      was eliminating these wipe operations when it decided that the
-      memory was no longer visible to a (correctly running) program,
-      hence defeating our attempt at defense in depth. We fix that
-      by using OpenSSL's OPENSSL_cleanse() operation, which a compiler
-      is unlikely to optimize away. Future versions of Tor may use
-      a less ridiculously heavy approach for this. Fixes bug 7352.
-      Reported in an article by Andrey Karpov.
-
-  o Major bugfixes (crashes and asserts):
-    - Avoid a pair of double-free and use-after-mark bugs that can
-      occur with certain timings in canceled and re-received DNS
-      requests. Fixes bug 6472; bugfix on 0.0.7rc1.
-    - Fix a denial of service attack by which any directory authority
-      could crash all the others, or by which a single v2 directory
-      authority could crash everybody downloading v2 directory
-      information. Fixes bug 7191; bugfix on 0.2.0.10-alpha.
-    - Fix an assert that directory authorities could trigger on sighup
-      during some configuration state transitions. We now don't treat
-      it as a fatal error when the new descriptor we just generated in
-      init_keys() isn't accepted. Fixes bug 4438; bugfix on 0.2.1.9-alpha.
-    - Avoid segfault when starting up having run with an extremely old
-      version of Tor and parsing its state file. Fixes bug 6801; bugfix
-      on 0.2.2.23-alpha.
-
-  o Major bugfixes (clients):
-    - If we are unable to find any exit that supports our predicted ports,
-      stop calling them predicted, so that we don't loop and build
-      hopeless circuits indefinitely. Fixes bug 3296; bugfix on 0.0.9pre6,
-      which introduced predicted ports.
-    - Check at each new consensus whether our entry guards were picked
-      long enough ago that we should rotate them. Previously, we only
-      did this check at startup, which could lead to us holding a guard
-      indefinitely. Fixes bug 5380; bugfix on 0.2.1.14-rc.
-    - When fetching a bridge descriptor from a bridge authority,
-      always do so anonymously, whether we have been able to open
-      circuits or not. Partial fix for bug 1938; bugfix on 0.2.0.7-alpha.
-      This behavior makes it *safer* to use UpdateBridgesFromAuthority,
-      but we'll need to wait for bug 6010 before it's actually usable.
-
-  o Major bugfixes (directory voting):
-    - Check more thoroughly to prevent a rogue authority from
-      double-voting on any consensus directory parameter. Previously,
-      authorities would crash in this case if the total number of
-      votes for any parameter exceeded the number of active voters,
-      but would let it pass otherwise. Partially fixes bug 5786; bugfix
-      on 0.2.2.2-alpha.
-    - When computing weight parameters, behave more robustly in the
-      presence of a bad bwweightscale value. Previously, the authorities
-      would crash if they agreed on a sufficiently broken weight_scale
-      value; now, they use a reasonable default and carry on. Fixes the
-      rest of bug 5786; bugfix on 0.2.2.17-alpha.
-    - If authorities are unable to get a v2 consensus document from other
-      directory authorities, they no longer fall back to fetching
-      them from regular directory caches. Fixes bug 5635; bugfix on
-      0.2.2.26-beta, where routers stopped downloading v2 consensus
-      documents entirely.
-
-  o Major bugfixes (relays):
-    - Fix a bug handling SENDME cells on nonexistent streams that could
-      result in bizarre window values. Report and patch contributed
-      pseudonymously. Fixes part of bug 6271. This bug was introduced
-      before the first Tor release, in svn commit r152.
-    - Don't update the AccountingSoftLimitHitAt state file entry whenever
-      tor gets started. This prevents a wrong average bandwidth
-      estimate, which would cause relays to always start a new accounting
-      interval at the earliest possible moment. Fixes bug 2003; bugfix
-      on 0.2.2.7-alpha. Reported by Bryon Eldridge, who also helped
-      immensely in tracking this bug down.
-    - Fix a possible crash bug when checking for deactivated circuits
-      in connection_or_flush_from_first_active_circuit(). Fixes bug 6341;
-      bugfix on 0.2.2.7-alpha. Bug report and fix received pseudonymously.
-    - Set the SO_REUSEADDR socket option before we call bind() on outgoing
-      connections. This change should allow busy exit relays to stop
-      running out of available sockets as quickly. Fixes bug 4950;
-      bugfix on 0.2.2.26-beta.
-
-  o Major bugfixes (blocking resistance):
-    - Bridges no longer include their address in NETINFO cells on outgoing
-      OR connections, to allow them to blend in better with clients.
-      Removes another avenue for enumerating bridges. Reported by
-      "troll_un". Fixes bug 4348; bugfix on 0.2.0.10-alpha, when NETINFO
-      cells were introduced.
-    - Warn the user when HTTPProxy, but no other proxy type, is
-      configured. This can cause surprising behavior: it doesn't send
-      all of Tor's traffic over the HTTPProxy -- it sends unencrypted
-      directory traffic only. Resolves ticket 4663.
-
-  o Major bugfixes (hidden services):
-    - Improve hidden service robustness: when an attempt to connect to
-      a hidden service ends, be willing to refetch its hidden service
-      descriptors from each of the HSDir relays responsible for them
-      immediately. Previously, we would not consider refetching the
-      service's descriptors from each HSDir for 15 minutes after the last
-      fetch, which was inconvenient if the hidden service was not running
-      during the first attempt. Bugfix on 0.2.0.18-alpha; fixes bug 3335.
-    - Hidden services now ignore the timestamps on INTRODUCE2 cells.
-      They used to check that the timestamp was within 30 minutes
-      of their system clock, so they could cap the size of their
-      replay-detection cache, but that approach unnecessarily refused
-      service to clients with wrong clocks. Bugfix on 0.2.1.6-alpha, when
-      the v3 intro-point protocol (the first one which sent a timestamp
-      field in the INTRODUCE2 cell) was introduced; fixes bug 3460.
-    - When one of a hidden service's introduction points appears to be
-      unreachable, stop trying it. Previously, we would keep trying
-      to build circuits to the introduction point until we lost the
-      descriptor, usually because the user gave up and restarted Tor.
-      Fixes part of bug 3825.
-
-  o Changes to default torrc file:
-    - Stop listing "socksport 9050" in torrc.sample. We open a socks
-      port on 9050 by default anyway, so this should not change anything
-      in practice.
-    - Stop mentioning the deprecated *ListenAddress options in
-      torrc.sample. Fixes bug 5438.
-    - Document unit of bandwidth-related options in sample torrc.
-      Fixes bug 5621.
-    - Fix broken URLs in the sample torrc file, and tell readers about
-      the OutboundBindAddress, ExitPolicyRejectPrivate, and
-      PublishServerDescriptor options. Addresses bug 4652.
-
-  o Minor features (directory authorities):
-    - Consider new, removed or changed IPv6 OR ports a non-cosmetic
-      change when the authority is deciding whether to accept a newly
-      uploaded descriptor. Implements ticket 6423.
-    - Directory authorities are now a little more lenient at accepting
-      older router descriptors, or newer router descriptors that don't
-      make big changes. This should help ameliorate past and future
-      issues where routers think they have uploaded valid descriptors,
-      but the authorities don't think so. Fix for ticket 2479.
-    - Authority operators can now vote for all relays in a given
-      set of countries to be BadDir/BadExit/Invalid/Rejected.
-    - Provide two consensus parameters (FastFlagMinThreshold and
-      FastFlagMaxThreshold) to control the range of allowable bandwidths
-      for the Fast directory flag. These allow authorities to run
-      experiments on appropriate requirements for being a "Fast" node.
-      The AuthDirFastGuarantee config value still applies. Implements
-      ticket 3946.
-
-  o Minor features (bridges / bridge authorities):
-    - Make bridge SSL certificates a bit more stealthy by using random
-      serial numbers, in the same fashion as OpenSSL when generating
-      self-signed certificates. Implements ticket 4584.
-    - Tag a bridge's descriptor as "never to be sent unencrypted".
-      This shouldn't matter, since bridges don't open non-anonymous
-      connections to the bridge authority and don't allow unencrypted
-      directory connections from clients, but we might as well make
-      sure. Closes bug 5139.
-    - The Bridge Authority now writes statistics on how many bridge
-      descriptors it gave out in total, and how many unique descriptors
-      it gave out. It also lists how often the most and least commonly
-      fetched descriptors were given out, as well as the median and
-      25th/75th percentile. Implements tickets 4200 and 4294.
-
-  o Minor features (IPv6):
-    - Make the code that clients use to detect an address change be
-      IPv6-aware, so that it won't fill clients' logs with error
-      messages when trying to get the IPv4 address of an IPv6
-      connection. Implements ticket 5537.
-    - Relays now understand an IPv6 address when they get one from a
-      directory server. Resolves ticket 4875.
-
-  o Minor features (hidden services):
-    - Expire old or over-used hidden service introduction points.
-      Required by fix for bug 3460.
-    - Reduce the lifetime of elements of hidden services' Diffie-Hellman
-      public key replay-detection cache from 60 minutes to 5 minutes. This
-      replay-detection cache is now used only to detect multiple
-      INTRODUCE2 cells specifying the same rendezvous point, so we can
-      avoid launching multiple simultaneous attempts to connect to it.
-    - When a hidden service's introduction point times out, consider
-      trying it again during the next attempt to connect to the
-      HS. Previously, we would not try it again unless a newly fetched
-      descriptor contained it. Required by fixes for bugs 1297 and 3825.
-
-  o Minor features (relays):
-    - Relays now include a reason for regenerating their descriptors
-      in an HTTP header when uploading to the authorities. This will
-      make it easier to debug descriptor-upload issues in the future.
-    - Turn on directory request statistics by default and include them in
-      extra-info descriptors. Don't break if we have no GeoIP database.
-    - Replace files in stats/ rather than appending to them. Now that we
-      include statistics in extra-info descriptors, it makes no sense to
-      keep old statistics forever. Implements ticket 2930.
-    - Relays that set "ConnDirectionStatistics 1" write statistics on the
-      bidirectional use of connections to disk every 24 hours.
-    - Add a GeoIP file digest to the extra-info descriptor. Implements
-      ticket 1883.
-
-  o Minor features (new config options):
-    - New config option "DynamicDHGroups" (disabled by default) provides
-      each bridge with a unique prime DH modulus to be used during
-      SSL handshakes. This option attempts to help against censors
-      who might use the Apache DH modulus as a static identifier for
-      bridges. Addresses ticket 4548.
-    - New config option "DisableDebuggerAttachment" (on by default)
-      to prevent basic debugging attachment attempts by other processes.
-      Supports Mac OS X and Gnu/Linux. Resolves ticket 3313.
-    - Ordinarily, Tor does not count traffic from private addresses (like
-      127.0.0.1 or 10.0.0.1) when calculating rate limits or accounting.
-      There is now a new option, CountPrivateBandwidth, to disable this
-      behavior. Patch from Daniel Cagara.
-
-  o Minor features (different behavior for old config options):
-    - Allow MapAddress directives to specify matches against super-domains,
-      as in "MapAddress *.torproject.org *.torproject.org.torserver.exit".
-      Implements issue 933.
-    - Don't disable the DirPort when we cannot exceed our AccountingMax
-      limit during this interval because the effective bandwidthrate is
-      low enough. This is useful in a situation where AccountMax is only
-      used as an additional safeguard or to provide statistics.
-    - Add port 6523 (Gobby) to LongLivedPorts. Patch by intrigeri;
-      implements ticket 3439.
-    - When configuring a large set of nodes in EntryNodes, and there are
-      enough of them listed as Guard so that we don't need to consider
-      the non-guard entries, prefer the ones listed with the Guard flag.
-    - If you set the NumCPUs option to 0, Tor will now try to detect how
-      many CPUs you have. This is the new default behavior.
-    - The NodeFamily option -- which let you declare that you want to
-      consider nodes to be part of a family whether they list themselves
-      that way or not -- now allows IP address ranges and country codes.
-
-  o Minor features (new command-line config behavior):
-    - Slightly change behavior of "list" options (that is, config
-      options that can appear more than once) when they appear both in
-      torrc and on the command line. Previously, the command-line options
-      would be appended to the ones from torrc. Now, the command-line
-      options override the torrc options entirely. This new behavior
-      allows the user to override list options (like exit policies and
-      ports to listen on) from the command line, rather than simply
-      appending to the list.
-    - You can get the old (appending) command-line behavior for "list"
-      options by prefixing the option name with a "+".
-    - You can remove all the values for a "list" option from the command
-      line without adding any new ones by prefixing the option name
-      with a "/".
-
-  o Minor features (controller, new events):
-    - Extend the control protocol to report flags that control a circuit's
-      path selection in CIRC events and in replies to 'GETINFO
-      circuit-status'. Implements part of ticket 2411.
-    - Extend the control protocol to report the hidden service address
-      and current state of a hidden-service-related circuit in CIRC
-      events and in replies to 'GETINFO circuit-status'. Implements part
-      of ticket 2411.
-    - Include the creation time of a circuit in CIRC and CIRC2
-      control-port events and the list produced by the 'GETINFO
-      circuit-status' control-port command.
-    - Add a new CONF_CHANGED event so that controllers can be notified
-      of any configuration changes made by other controllers, or by the
-      user. Implements ticket 1692.
-    - Add a new SIGNAL event to the controller interface so that
-      controllers can be notified when Tor handles a signal. Resolves
-      issue 1955. Patch by John Brooks.
-
-  o Minor features (controller, new getinfo options):
-    - Expose our view of whether we have gone dormant to the controller,
-      via a new "GETINFO dormant" value. Torbutton and other controllers
-      can use this to avoid doing periodic requests through Tor while
-      it's dormant (bug 4718). Resolves ticket 5954.
-    - Add a new GETINFO option to get total bytes read and written. Patch
-      from pipe, revised by atagar. Resolves ticket 2345.
-    - Implement new GETINFO controller fields to provide information about
-      the Tor process's pid, euid, username, and resource limits.
-
-  o Minor features (controller, other):
-    - Allow controllers to request an event notification whenever a
-      circuit is cannibalized or its purpose is changed. Implements
-      part of ticket 3457.
-    - Use absolute path names when reporting the torrc filename in the
-      control protocol, so a controller can more easily find the torrc
-      file. Resolves bug 1101.
-    - When reporting the path to the cookie file to the controller,
-      give an absolute path. Resolves ticket 4881.
-
-  o Minor features (log messages):
-    - Add more information to a log statement that might help track down
-      bug 4091. If you're seeing "Bug: tor_addr_is_internal() called with a
-      non-IP address" messages (or any Bug messages, for that matter!),
-      please let us know about it.
-    - If EntryNodes are given, but UseEntryGuards is set to 0, warn that
-      EntryNodes will have no effect. Resolves issue 2571.
-    - Try to make the introductory warning message that Tor prints on
-      startup more useful for actually finding help and information.
-      Resolves ticket 2474.
-    - When the system call to create a listener socket fails, log the
-      error message explaining why. This may help diagnose bug 4027.
-
-  o Minor features (other):
-    - When we fail to initialize Libevent, retry with IOCP disabled so we
-      don't need to turn on multi-threading support in Libevent, which in
-      turn requires a working socketpair(). This is a workaround for bug
-      4457, which affects Libevent versions from 2.0.1-alpha through
-      2.0.15-stable.
-    - When starting as root and then changing our UID via the User
-      control option, and we have a ControlSocket configured, make sure
-      that the ControlSocket is owned by the same account that Tor will
-      run under. Implements ticket 3421; fix by Jérémy Bobbio.
-    - Accept attempts to include a password authenticator in the
-      handshake, as supported by SOCKS5. This handles SOCKS clients that
-      don't know how to omit a password when authenticating. Resolves
-      bug 1666.
-    - Check for and recover from inconsistency in the microdescriptor
-      cache. This will make it harder for us to accidentally free a
-      microdescriptor without removing it from the appropriate data
-      structures. Fixes issue 3135; issue noted by "wanoskarnet".
-    - Shorten links in the tor-exit-notice file. Patch by Christian Kujau.
-
-  o Minor bugfixes (code security):
-    - Prevent a null-pointer dereference when receiving a data cell
-      for a nonexistent stream when the circuit in question has an
-      empty deliver window. We don't believe this is triggerable,
-      since we don't currently allow deliver windows to become empty,
-      but the logic is tricky enough that it's better to make the code
-      robust. Fixes bug 5541; bugfix on 0.0.2pre14.
-    - Fix a (harmless) integer overflow in cell statistics reported by
-      some fast relays. Fixes bug 5849; bugfix on 0.2.2.1-alpha.
-    - Fix our implementation of crypto_random_hostname() so it can't
-      overflow on ridiculously large inputs. (No Tor version has ever
-      provided this kind of bad inputs, but let's be correct in depth.)
-      Fixes bug 4413; bugfix on 0.2.2.9-alpha. Fix by Stephen Palmateer.
-    - Add a (probably redundant) memory clear between iterations of
-      the router status voting loop, to prevent future coding errors
-      where data might leak between iterations of the loop. Resolves
-      ticket 6514.
-
-  o Minor bugfixes (wrapper functions):
-    - Abort if tor_vasprintf() fails in connection_printf_to_buf() (a
-      utility function used in the control-port code). This shouldn't
-      ever happen unless Tor is completely out of memory, but if it did
-      happen and Tor somehow recovered from it, Tor could have sent a log
-      message to a control port in the middle of a reply to a controller
-      command. Fixes part of bug 3428; bugfix on 0.1.2.3-alpha.
-    - Fix some (not actually triggerable) buffer size checks in usage of
-      tor_inet_ntop(). Fixes bug 4434; bugfix on Tor 0.2.0.1-alpha. Patch
-      by Anders Sundman.
-    - Fix parsing of some corner-cases with tor_inet_pton(). Fixes
-      bug 4515; bugfix on 0.2.0.1-alpha; fix by Anders Sundman.
-    - Enforce correct return behavior of tor_vsscanf() when the '%%'
-      pattern is used. Fixes bug 5558. Bugfix on 0.2.1.13.
-    - Make our replacement implementation of strtok_r() compatible with
-      the standard behavior of strtok_r(). Patch by nils. Fixes bug 5091;
-      bugfix on 0.2.2.1-alpha.
-    - Find more places in the code that should have been testing for
-      invalid sockets using the SOCKET_OK macro. Required for a fix
-      for bug 4533. Bugfix on 0.2.2.28-beta.
-
-  o Minor bugfixes (code correctness):
-    - Check return value of fputs() when writing authority certificate
-      file. Fixes Coverity issue 709056; bugfix on 0.2.0.1-alpha.
-    - When building Tor on Windows with -DUNICODE (not default), ensure
-      that error messages, filenames, and DNS server names are always
-      NUL-terminated when we convert them to a single-byte encoding.
-      Fixes bug 5909; bugfix on 0.2.2.16-alpha.
-    - Fix a memory leak when trying to launch a DNS request when the
-      nameservers are unconfigurable. Fixes bug 5916; bugfix on Tor
-      0.1.2.1-alpha.
-    - Correct file sizes when reading binary files on Cygwin, to avoid
-      a bug where Tor would fail to read its state file. Fixes bug 6844;
-      bugfix on 0.1.2.7-alpha.
-    - Make sure to set *socket_error in all error cases in
-      connection_connect(), so it can't produce a warning about
-      errno being zero from errno_to_orconn_end_reason(). Bugfix on
-      0.2.1.1-alpha; resolves ticket 6028.
-    - Initialize conn->addr to a valid state in spawn_cpuworker(). Fixes
-      bug 4532; found by "troll_un".
-
-  o Minor bugfixes (clients):
-    - Allow one-hop directory-fetching circuits the full "circuit build
-      timeout" period, rather than just half of it, before failing them
-      and marking the relay down. This fix should help reduce cases where
-      clients declare relays (or worse, bridges) unreachable because
-      the TLS handshake takes a few seconds to complete. Fixes bug 6743;
-      bugfix on 0.2.2.2-alpha, where we changed the timeout from a static
-      30 seconds.
-    - Ensure we don't cannibalize circuits that are longer than three hops
-      already, so we don't end up making circuits with 5 or more
-      hops. Patch contributed by wanoskarnet. Fixes bug 5231; bugfix on
-      0.1.0.1-rc which introduced cannibalization.
-
-  o Minor bugfixes (relays):
-    - Don't publish a new relay descriptor when we reload our onion key,
-      unless the onion key has actually changed. Fixes bug 3263 and
-      resolves another cause of bug 1810. Bugfix on 0.1.1.11-alpha.
-    - When relays refuse a "create" cell because their queue of pending
-      create cells is too big (typically because their cpu can't keep up
-      with the arrival rate), send back reason "resource limit" rather
-      than reason "internal", so network measurement scripts can get a
-      more accurate picture. Bugfix on 0.1.1.11-alpha; fixes bug 7037.
-    - Exit nodes don't need to fetch certificates for authorities that
-      they don't recognize; only directory authorities, bridges,
-      and caches need to do that. Fixes part of bug 2297; bugfix on
-      0.2.2.11-alpha.
-
-  o Minor bugfixes (directory authority / mirrors):
-    - Avoid O(n^2) performance characteristics when parsing a large
-      extrainfo cache. Fixes bug 5828; bugfix on 0.2.0.1-alpha.
-    - Authorities no longer include any router in their microdescriptor
-      consensuses for which they couldn't generate or agree on a
-      microdescriptor. Fixes the second piece of bug 6404; fix on
-      0.2.2.6-alpha.
-    - When checking for requested signatures on the latest consensus
-      before serving it to a client, make sure to check the right
-      consensus flavor. Bugfix on 0.2.2.6-alpha.
-    - Fix an edge case where TestingTorNetwork is set but the authorities
-      and relays all have an uptime of zero, so the private Tor network
-      could briefly lack support for hidden services. Fixes bug 3886;
-      bugfix on 0.2.2.18-alpha.
-    - Directory caches no longer refuse to clean out descriptors because
-      of missing v2 networkstatus documents, unless they're configured
-      to retrieve v2 networkstatus documents. Fixes bug 4838; bugfix on
-      0.2.2.26-beta. Patch by Daniel Bryg.
-    - Don't serve or accept v2 hidden service descriptors over a relay's
-      DirPort. It's never correct to do so, and disabling it might
-      make it more annoying to exploit any bugs that turn up in the
-      descriptor-parsing code. Fixes bug 7149.
-
-  o Minor bugfixes (hidden services, client-side):
-    - Assert that hidden-service-related operations are not performed
-      using single-hop circuits. Previously, Tor would assert that
-      client-side streams are not attached to single-hop circuits,
-      but not that other sensitive operations on the client and service
-      side are not performed using single-hop circuits. Fixes bug 3332;
-      bugfix on 0.0.6.
-    - Avoid undefined behavior when parsing the list of supported
-      rendezvous/introduction protocols in a hidden service descriptor.
-      Previously, Tor would have confused (as-yet-unused) protocol version
-      numbers greater than 32 with lower ones on many platforms. Fixes
-      bug 6827; bugfix on 0.2.0.10-alpha. Found by George Kadianakis.
-    - Don't close hidden service client circuits which have almost
-      finished connecting to their destination when they reach
-      the normal circuit-build timeout. Previously, we would close
-      introduction circuits which are waiting for an acknowledgement
-      from the introduction point, and rendezvous circuits which have
-      been specified in an INTRODUCE1 cell sent to a hidden service,
-      after the normal CBT. Now, we mark them as 'timed out', and launch
-      another rendezvous attempt in parallel. This behavior change can
-      be disabled using the new CloseHSClientCircuitsImmediatelyOnTimeout
-      option. Fixes part of bug 1297; bugfix on 0.2.2.2-alpha.
-
-  o Minor bugfixes (hidden services, service-side):
-    - Don't close hidden-service-side rendezvous circuits when they
-      reach the normal circuit-build timeout. This behavior change can
-      be disabled using the new
-      CloseHSServiceRendCircuitsImmediatelyOnTimeout option. Fixes the
-      remaining part of bug 1297; bugfix on 0.2.2.2-alpha.
-    - Don't launch more than 10 service-side introduction-point circuits
-      for a hidden service in five minutes. Previously, we would consider
-      launching more introduction-point circuits if at least one second
-      had passed without any introduction-point circuits failing. Fixes
-      bug 4607; bugfix on 0.0.7pre1.
-
-  o Minor bugfixes (config option behavior):
-    - If the user tries to set MyFamily on a bridge, refuse to
-      do so, and warn about the security implications. Fixes bug 4657;
-      bugfix on 0.2.0.3-alpha.
-    - The "--quiet" and "--hush" options now apply not only to Tor's
-      behavior before logs are configured, but also to Tor's behavior in
-      the absense of configured logs. Fixes bug 3550; bugfix on
-      0.2.0.10-alpha.
-    - Change the AllowDotExit rules so they should actually work.
-      We now enforce AllowDotExit only immediately after receiving an
-      address via SOCKS or DNSPort: other sources are free to provide
-      .exit addresses after the resolution occurs. Fixes bug 3940;
-      bugfix on 0.2.2.1-alpha.
-    - Make "LearnCircuitBuildTimeout 0" work more reliably. Specifically,
-      don't depend on the consensus parameters or compute adaptive
-      timeouts when it is disabled. Fixes bug 5049; bugfix on
-      0.2.2.14-alpha.
-    - After we pick a directory mirror, we would refuse to use it if
-      it's in our ExcludeExitNodes list, resulting in mysterious failures
-      to bootstrap for people who just wanted to avoid exiting from
-      certain locations. Fixes bug 5623; bugfix on 0.2.2.25-alpha.
-    - When told to add a bridge with the same digest as a preexisting
-      bridge but a different addr:port, change the addr:port as
-      requested. Previously we would not notice the change. Fixes half
-      of bug 5603; fix on 0.2.2.26-beta.
-
-  o Minor bugfixes (controller):
-    - Allow manual 'authenticate' commands to the controller interface
-      from netcat (nc) as well as telnet. We were rejecting them because
-      they didn't come with the expected whitespace at the end of the
-      command. Bugfix on 0.1.1.1-alpha; fixes bug 2893.
-    - Report a real bootstrap problem to the controller on router
-      identity mismatch. Previously we just said "foo", which probably
-      made a lot of sense at the time. Fixes bug 4169; bugfix on
-      0.2.1.1-alpha.
-    - When we receive a SIGHUP and the controller __ReloadTorrcOnSIGHUP
-      option is set to 0 (which Vidalia version 0.2.16 now does when
-      a SAVECONF attempt fails), perform other actions that SIGHUP
-      usually causes (like reopening the logs). Fixes bug 5095; bugfix
-      on 0.2.1.9-alpha.
-    - Correctly handle checking the permissions on the parent
-      directory of a control socket in the root directory. Bug found
-      by Esteban Manchado Velázquez. Fixes bug 5089; bugfix on Tor
-      0.2.2.26-beta.
-    - End AUTHCHALLENGE error messages (in the control protocol) with
-      a CRLF. Fixes bug 5760; bugfix on 0.2.2.36.
-
-  o Minor bugfixes (network reading/writing):
-    - Disable writing on marked-for-close connections when they are
-      blocked on bandwidth, to prevent busy-looping in Libevent. Fixes
-      bug 5263; bugfix on 0.0.2pre13, where we first added a special
-      case for flushing marked connections.
-    - Make sure that there are no unhandled pending TLS errors before
-      reading from a TLS stream. We had checks in 0.1.0.3-rc, but
-      lost them in 0.1.0.5-rc when we refactored read_to_buf_tls().
-      Bugfix on 0.1.0.5-rc; fixes bug 4528.
-    - Detect SSL handshake even when the initial attempt to write the
-      server hello fails. Fixes bug 4592; bugfix on 0.2.0.13-alpha.
-    - If the client fails to set a reasonable set of ciphersuites
-      during its v2 handshake renegotiation, allow the renegotiation to
-      continue nevertheless (i.e. send all the required certificates).
-      Fixes bug 4591; bugfix on 0.2.0.20-rc.
-
-  o Minor bugfixes (other):
-    - Exit nodes now correctly report EADDRINUSE and EADDRNOTAVAIL as
-      resource exhaustion, so that clients can adjust their load to
-      try other exits. Fixes bug 4710; bugfix on 0.1.0.1-rc, which
-      started using END_STREAM_REASON_RESOURCELIMIT.
-    - Don't check for whether the address we're using for outbound
-      connections has changed until after the outbound connection has
-      completed. On Windows, getsockname() doesn't succeed until the
-      connection is finished. Fixes bug 5374; bugfix on 0.1.1.14-alpha.
-    - Don't hold a Windows file handle open for every file mapping;
-      the file mapping handle is sufficient. Fixes bug 5951; bugfix on
-      0.1.2.1-alpha.
-    - Fix wrong TCP port range in parse_port_range(). Fixes bug 6218;
-      bugfix on 0.2.1.10-alpha.
-    - If we fail to write a microdescriptor to the disk cache, do not
-      continue replacing the old microdescriptor file. Fixes bug 2954;
-      bugfix on 0.2.2.6-alpha.
-
-  o Minor bugfixes (log messages, path selection):
-    - Downgrade "set buildtimeout to low value" messages to "info"
-      severity; they were never an actual problem, there was never
-      anything reasonable to do about them, and they tended to spam logs
-      from time to time. Fixes bug 6251; bugfix on 0.2.2.2-alpha.
-    - Rate-limit the "Weighted bandwidth is 0.000000" message, and add
-      more information to it, so that we can track it down in case it
-      returns again. Mitigates bug 5235.
-    - Check CircuitBuildTimeout and LearnCircuitBuildTimeout in
-      options_validate(); warn if LearnCircuitBuildTimeout is disabled and
-      CircuitBuildTimeout is set unreasonably low. Resolves ticket 5452.
-    - Issue a log message if a guard completes less than 40% of your
-      circuits. Threshold is configurable by torrc option
-      PathBiasNoticeRate and consensus parameter pb_noticepct. There is
-      additional, off-by-default code to disable guards which fail too
-      many circuits. Addresses ticket 5458.
-
-  o Minor bugfixes (log messages, client):
-    - Downgrade "Got a certificate, but we already have it" log messages
-      from warning to info, except when we're a dirauth. Fixes bug 5238;
-      bugfix on 0.2.1.7-alpha.
-    - Fix the log message describing how we work around discovering
-      that our version is the ill-fated OpenSSL 0.9.8l. Fixes bug
-      4837; bugfix on 0.2.2.9-alpha.
-    - When logging about a disallowed .exit name, do not also call it
-      an "invalid onion address". Fixes bug 3325; bugfix on 0.2.2.9-alpha.
-    - Fix a log message suggesting that people contact a non-existent
-      email address. Fixes bug 3448.
-    - Rephrase the log message emitted if the TestSocks check is
-      successful. Patch from Fabian Keil; fixes bug 4094.
-    - Log (at debug level) whenever a circuit's purpose is changed.
-    - Log SSL state transitions at log level DEBUG, log domain
-      HANDSHAKE. This can be useful for debugging censorship events.
-      Implements ticket 3264.
-    - We now log which torrc file we're using on startup. Implements
-      ticket 2444.
-    - Rate-limit log messages when asked to connect anonymously to
-      a private address. When these hit, they tended to hit fast and
-      often. Also, don't bother trying to connect to addresses that we
-      are sure will resolve to 127.0.0.1: getting 127.0.0.1 in a directory
-      reply makes us think we have been lied to, even when the address the
-      client tried to connect to was "localhost." Resolves ticket 2822.
-
-  o Minor bugfixes (log messages, non-client):
-    - Downgrade "eventdns rejected address" message to LOG_PROTOCOL_WARN.
-      Fixes bug 5932; bugfix on 0.2.2.7-alpha.
-    - Don't log that we have "decided to publish new relay descriptor"
-      unless we are actually publishing a descriptor. Fixes bug 3942;
-      bugfix on 0.2.2.28-beta.
-    - Log which authority we're missing votes from when we go to fetch
-      them from the other auths.
-    - Replace "Sending publish request" log messages with "Launching
-      upload", so that they no longer confusingly imply that we're
-      sending something to a directory we might not even be connected
-      to yet. Fixes bug 3311; bugfix on 0.2.0.10-alpha.
-    - Warn when Tor is configured to use accounting in a way that can
-      link a hidden service to some other hidden service or public
-      address. Resolves ticket 6490.
-    - Fix a minor formatting issue in one of tor-gencert's error messages.
-      Fixes bug 4574.
-
-  o Testing:
-    - Update to the latest version of the tinytest unit testing framework.
-      This includes a couple of bugfixes that can be relevant for
-      running forked unit tests on Windows, and removes all reserved
-      identifiers.
-    - Avoid a false positive in the util/threads unit test by increasing
-      the maximum timeout time. Fixes bug 6227; bugfix on 0.2.0.4-alpha.
-    - Make it possible to set the TestingTorNetwork configuration
-      option using AlternateDirAuthority and AlternateBridgeAuthority
-      as an alternative to setting DirServer. Addresses ticket 6377.
-    - Add a unit test for the environment_variable_names_equal() function.
-    - A wide variety of new unit tests by Esteban Manchado Velázquez.
-    - Numerous new unit tests for functions in util.c and address.c by
-      Anders Sundman.
-    - The long-disabled benchmark tests are now split into their own
-      ./src/test/bench binary.
-    - The benchmark tests can now use more accurate timers than
-      gettimeofday() when such timers are available.
-    - Use tt_assert(), not tor_assert(), for checking for test failures.
-      This makes the unit tests more able to go on in the event that
-      one of them fails.
-
-  o Build improvements:
-    - Use the dead_strip option when building Tor on OS X. This reduces
-      binary size by almost 19% when linking openssl and libevent
-      statically, which we do for Tor Browser Bundle.
-    - Provide a better error message about possible OSX Asciidoc failure
-      reasons. Fixes bug 6436.
-    - Detect attempts to build Tor on (as yet hypothetical) versions
-      of Windows where sizeof(intptr_t) != sizeof(SOCKET). Partial
-      fix for bug 4533. Bugfix on 0.2.2.28-beta.
-    - On Windows, we now define the _WIN32_WINNT macros only if they
-      are not already defined. This lets the person building Tor decide,
-      if they want, to require a later version of Windows.
-    - Our autogen.sh script now uses autoreconf to launch autoconf,
-      automake, and so on. This is more robust against some of the failure
-      modes associated with running the autotools pieces on their own.
-    - Running "make version" now displays the version of Tor that
-      we're about to build. Idea from katmagic; resolves issue 4400.
-    - Make 'tor --digests' list hashes of all Tor source files. Bugfix
-      on 0.2.2.4-alpha; fixes bug 3427.
-    - New --enable-static-tor configure option for building Tor as
-      statically as possible. Idea, general hackery and thoughts from
-      Alexei Czeskis, John Gilmore, Jacob Appelbaum. Implements ticket
-      2702.
-    - Limited, experimental support for building with nmake and MSVC.
-
-  o Build requirements:
-    - Building Tor with bufferevent support now requires Libevent
-      2.0.13-stable or later. Previous versions of Libevent had bugs in
-      SSL-related bufferevents and related issues that would make Tor
-      work badly with bufferevents. Requiring 2.0.13-stable also allows
-      Tor with bufferevents to take advantage of Libevent APIs
-      introduced after 2.0.8-rc.
-    - Our build system requires automake 1.6 or later to create the
-      Makefile.in files. Previously, you could have used 1.4.
-      This only affects developers and people building Tor from git;
-      people who build Tor from the source distribution without changing
-      the Makefile.am files should be fine.
-    - Detect when we try to build on a platform that doesn't define
-      AF_UNSPEC to 0. We don't work there, so refuse to compile.
-
-  o Build fixes (compile/link):
-    - Format more doubles with %f, not %lf. Patch from grarpamp to make
-      Tor build correctly on older BSDs again. Fixes bug 3894; bugfix on
-      Tor 0.2.0.8-alpha.
-    - When building with --enable-static-tor on OpenBSD, do not
-      erroneously attempt to link -lrt. Fixes bug 5103.
-    - Set _WIN32_WINNT to 0x0501 consistently throughout the code, so
-      that IPv6 stuff will compile on MSVC, and compilation issues
-      will be easier to track down. Fixes bug 5861.
-    - Fix build and 64-bit compile warnings from --enable-openbsd-malloc.
-      Fixes bug 6379. Bugfix on 0.2.0.20-rc.
-    - Make Tor build correctly again with -DUNICODE -D_UNICODE defined.
-      Fixes bug 6097; bugfix on 0.2.2.16-alpha.
-
-  o Build fixes (other):
-    - Use the _WIN32 macro throughout our code to detect Windows.
-      (Previously we had used the obsolete 'WIN32' and the idiosyncratic
-      'MS_WINDOWS'.)
-    - Properly handle the case where the build-tree is not the same
-      as the source tree when generating src/common/common_sha1.i,
-      src/or/micro-revision.i, and src/or/or_sha1.i. Fixes bug 3953;
-      bugfix on 0.2.0.1-alpha.
-    - During configure, search for library containing cos function as
-      libm lives in libcore on some platforms (BeOS/Haiku). Linking
-      against libm was hard-coded before. Fixes the first part of bug
-      4727; bugfix on 0.2.2.2-alpha. Patch and analysis by Martin Hebnes
-      Pedersen.
-    - Prevent a false positive from the check-spaces script, by disabling
-      the "whitespace between function name and (" check for functions
-      named 'op()'.
-
-  o Packaging (RPM) changes:
-    - Update our default RPM spec files to work with mock and rpmbuild
-      on RHEL/Fedora. They have an updated set of dependencies and
-      conflicts, a fix for an ancient typo when creating the "_tor"
-      user, and better instructions. Thanks to Ondrej Mikle for the
-      patch series. Fixes bug 6043.
-    - On OpenSUSE, create the /var/run/tor directory on startup if it
-      is not already created. Patch from Andreas Stieger. Fixes bug 2573.
-
-  o Code refactoring (safety):
-    - Do not use SMARTLIST_FOREACH for any loop whose body exceeds
-      10 lines. Also, don't nest them. Doing so in the past has
-      led to hard-to-debug code. The new style is to use the
-      SMARTLIST_FOREACH_{BEGIN,END} pair. Addresses issue 6400.
-    - Use macros to indicate OpenSSL versions, so we don't need to worry
-      about accidental hexadecimal bit shifts.
-    - Use tor_sscanf() in place of scanf() in more places through the
-      code. This makes us a little more locale-independent, and
-      should help shut up code-analysis tools that can't tell
-      a safe sscanf string from a dangerous one.
-    - Convert more instances of tor_snprintf+tor_strdup into tor_asprintf.
-    - Use the smartlist_add_asprintf() alias more consistently.
-
-  o Code refactoring (consolidate):
-    - A major revision to our internal node-selecting and listing logic.
-      Tor already had at least two major ways to look at the question of
-      "which Tor servers do we know about": a list of router descriptors,
-      and a list of entries in the current consensus. With
-      microdescriptors, we're adding a third. Having so many systems
-      without an abstraction layer over them was hurting the codebase.
-      Now, we have a new "node_t" abstraction that presents a consistent
-      interface to a client's view of a Tor node, and holds (nearly) all
-      of the mutable state formerly in routerinfo_t and routerstatus_t.
-    - Move tor_gettimeofday_cached() into compat_libevent.c, and use
-      Libevent's notion of cached time when possible.
-    - Remove duplicate code for invoking getrlimit() from control.c.
-    - Use OpenSSL's built-in SSL_state_string_long() instead of our
-      own homebrewed ssl_state_to_string() replacement. Patch from
-      Emile Snyder. Fixes bug 4653.
-    - Change the symmetric cipher interface so that creating and
-      initializing a stream cipher are no longer separate functions.
-
-  o Code refactoring (separate):
-    - Make a new "entry connection" struct as an internal subtype of "edge
-      connection", to simplify the code and make exit connections smaller.
-    - Split connection_about_to_close() into separate functions for each
-      connection type.
-    - Rewrite the listener-selection logic so that parsing which ports
-      we want to listen on is now separate from binding to the ports
-      we want.
-
-  o Code refactoring (name changes):
-    - Rename a handful of old identifiers, mostly related to crypto
-      structures and crypto functions. By convention, our "create an
-      object" functions are called "type_new()", our "free an object"
-      functions are called "type_free()", and our types indicate that
-      they are types only with a final "_t". But a handful of older
-      types and functions broke these rules, with function names like
-      "type_create" or "subsystem_op_type", or with type names like
-      type_env_t.
-    - Rename Tor functions that turn strings into addresses, so that
-      "parse" indicates that no hostname resolution occurs, and
-      "lookup" indicates that hostname resolution may occur. This
-      should help prevent mistakes in the future. Fixes bug 3512.
-    - Use the name "CERTS" consistently to refer to the new cell type;
-      we were calling it CERT in some places and CERTS in others.
-    - Use a TOR_INVALID_SOCKET macro when initializing a socket to an
-      invalid value, rather than just -1.
-    - Rename the bench_{aes,dmap} functions to test_*, so that tinytest
-      can pick them up when the tests aren't disabled. Bugfix on
-      0.2.2.4-alpha which introduced tinytest.
-
-  o Code refactoring (other):
-    - Defensively refactor rend_mid_rendezvous() so that protocol
-      violations and length checks happen in the beginning. Fixes
-      bug 5645.
-    - Remove the pure attribute from all functions that used it
-      previously. In many cases we assigned it incorrectly, because the
-      functions might assert or call impure functions, and we don't have
-      evidence that keeping the pure attribute is worthwhile. Implements
-      changes suggested in ticket 4421.
-    - Move the replay-detection cache for the RSA-encrypted parts of
-      INTRODUCE2 cells to the introduction point data structures.
-      Previously, we would use one replay-detection cache per hidden
-      service. Required by fix for bug 3460.
-    - The helper programs tor-gencert, tor-resolve, and tor-checkkey
-      no longer link against Libevent: they never used it, but
-      our library structure used to force them to link it.
-
-  o Removed features and files:
-    - Remove all internal support for unpadded RSA. We never used it, and
-      it would be a bad idea to start.
-    - Remove some workaround code for OpenSSL 0.9.6 (which is no longer
-      supported).
-    - Remove some redundant #include directives throughout the code.
-      Patch from Andrea Gelmini.
-    - Remove some old code to remember statistics about which descriptors
-      we've served as a directory mirror. The feature wasn't used and
-      is outdated now that microdescriptors are around.
-    - Remove some old code to work around even older versions of Tor that
-      used forked processes to handle DNS requests. Such versions of Tor
-      are no longer in use as relays.
-    - The "torify" script no longer supports the "tsocks" socksifier
-      tool, since tsocks doesn't support DNS and UDP right for Tor.
-      Everyone should be using torsocks instead. Fixes bugs 3530 and
-      5180. Based on a patch by "ugh".
-    - Remove the torrc.bridge file: we don't use it for anything, and
-      it had become badly desynchronized from torrc.sample. Resolves
-      bug 5622.
-
-  o Documentation:
-    - Begin a doc/state-contents.txt file to explain the contents of
-      the Tor state file. Fixes bug 2987.
-    - Clarify the documentation for the Alternate*Authority options.
-      Fixes bug 6387.
-    - Document the --defaults-torrc option, and the new semantics for
-      overriding, extending, and clearing lists of options. Closes
-      bug 4748.
-    - Add missing man page documentation for consensus and microdesc
-      files. Resolves ticket 6732.
-    - Fix some typos in the manpages. Patch from A. Costa. Fixes bug 6500.
-
-  o Documentation fixes:
-    - Improve the manual's documentation for the NT Service command-line
-      options. Addresses ticket 3964.
-    - Clarify SessionGroup documentation slightly; resolves ticket 5437.
-    - Document the changes to the ORPort and DirPort options, and the
-      fact that {OR/Dir}ListenAddress is now unnecessary (and
-      therefore deprecated). Resolves ticket 5597.
-    - Correct a broken faq link in the INSTALL file. Fixes bug 2307.
-    - Clarify that hidden services are TCP only. Fixes bug 6024.
-
-
-Changes in version 0.2.2.39 - 2012-09-11
-  Tor 0.2.2.39 fixes two more opportunities for remotely triggerable
-  assertions.
-
-  o Security fixes:
-    - Fix an assertion failure in tor_timegm() that could be triggered
-      by a badly formatted directory object. Bug found by fuzzing with
-      Radamsa. Fixes bug 6811; bugfix on 0.2.0.20-rc.
-    - Do not crash when comparing an address with port value 0 to an
-      address policy. This bug could have been used to cause a remote
-      assertion failure by or against directory authorities, or to
-      allow some applications to crash clients. Fixes bug 6690; bugfix
-      on 0.2.1.10-alpha.
-
-
-Changes in version 0.2.2.38 - 2012-08-12
-  Tor 0.2.2.38 fixes a remotely triggerable crash bug, and fixes a timing
-  attack that could in theory leak path information.
-
-  o Security fixes:
-    - Avoid an uninitialized memory read when reading a vote or consensus
-      document that has an unrecognized flavor name. This read could
-      lead to a remote crash bug. Fixes bug 6530; bugfix on 0.2.2.6-alpha.
-    - Try to leak less information about what relays a client is
-      choosing to a side-channel attacker. Previously, a Tor client would
-      stop iterating through the list of available relays as soon as it
-      had chosen one, thus finishing a little earlier when it picked
-      a router earlier in the list. If an attacker can recover this
-      timing information (nontrivial but not proven to be impossible),
-      they could learn some coarse-grained information about which relays
-      a client was picking (middle nodes in particular are likelier to
-      be affected than exits). The timing attack might be mitigated by
-      other factors (see bug 6537 for some discussion), but it's best
-      not to take chances. Fixes bug 6537; bugfix on 0.0.8rc1.
-
-
-Changes in version 0.2.2.37 - 2012-06-06
-  Tor 0.2.2.37 introduces a workaround for a critical renegotiation
-  bug in OpenSSL 1.0.1 (where 20% of the Tor network can't talk to itself
-  currently).
-
-  o Major bugfixes:
-    - Work around a bug in OpenSSL that broke renegotiation with TLS
-      1.1 and TLS 1.2. Without this workaround, all attempts to speak
-      the v2 Tor connection protocol when both sides were using OpenSSL
-      1.0.1 would fail. Resolves ticket 6033.
-    - When waiting for a client to renegotiate, don't allow it to add
-      any bytes to the input buffer. This fixes a potential DoS issue.
-      Fixes bugs 5934 and 6007; bugfix on 0.2.0.20-rc.
-    - Fix an edge case where if we fetch or publish a hidden service
-      descriptor, we might build a 4-hop circuit and then use that circuit
-      for exiting afterwards -- even if the new last hop doesn't obey our
-      ExitNodes config option. Fixes bug 5283; bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes:
-    - Fix a build warning with Clang 3.1 related to our use of vasprintf.
-      Fixes bug 5969. Bugfix on 0.2.2.11-alpha.
-
-  o Minor features:
-    - Tell GCC and Clang to check for any errors in format strings passed
-      to the tor_v*(print|scan)f functions.
-
-
-Changes in version 0.2.2.36 - 2012-05-24
-  Tor 0.2.2.36 updates the addresses for two of the eight directory
-  authorities, fixes some potential anonymity and security issues,
-  and fixes several crash bugs.
-
-  Tor 0.2.1.x has reached its end-of-life. Those Tor versions have many
-  known flaws, and nobody should be using them. You should upgrade. If
-  you're using a Linux or BSD and its packages are obsolete, stop using
-  those packages and upgrade anyway.
-
-  o Directory authority changes:
-    - Change IP address for maatuska (v3 directory authority).
-    - Change IP address for ides (v3 directory authority), and rename
-      it to turtles.
-
-  o Security fixes:
-    - When building or running with any version of OpenSSL earlier
-      than 0.9.8s or 1.0.0f, disable SSLv3 support. These OpenSSL
-      versions have a bug (CVE-2011-4576) in which their block cipher
-      padding includes uninitialized data, potentially leaking sensitive
-      information to any peer with whom they make a SSLv3 connection. Tor
-      does not use SSL v3 by default, but a hostile client or server
-      could force an SSLv3 connection in order to gain information that
-      they shouldn't have been able to get. The best solution here is to
-      upgrade to OpenSSL 0.9.8s or 1.0.0f (or later). But when building
-      or running with a non-upgraded OpenSSL, we disable SSLv3 entirely
-      to make sure that the bug can't happen.
-    - Never use a bridge or a controller-supplied node as an exit, even
-      if its exit policy allows it. Found by wanoskarnet. Fixes bug
-      5342. Bugfix on 0.1.1.15-rc (for controller-purpose descriptors)
-      and 0.2.0.3-alpha (for bridge-purpose descriptors).
-    - Only build circuits if we have a sufficient threshold of the total
-      descriptors that are marked in the consensus with the "Exit"
-      flag. This mitigates an attack proposed by wanoskarnet, in which
-      all of a client's bridges collude to restrict the exit nodes that
-      the client knows about. Fixes bug 5343.
-    - Provide controllers with a safer way to implement the cookie
-      authentication mechanism. With the old method, if another locally
-      running program could convince a controller that it was the Tor
-      process, then that program could trick the controller into telling
-      it the contents of an arbitrary 32-byte file. The new "SAFECOOKIE"
-      authentication method uses a challenge-response approach to prevent
-      this attack. Fixes bug 5185; implements proposal 193.
-
-  o Major bugfixes:
-    - Avoid logging uninitialized data when unable to decode a hidden
-      service descriptor cookie. Fixes bug 5647; bugfix on 0.2.1.5-alpha.
-    - Avoid a client-side assertion failure when receiving an INTRODUCE2
-      cell on a general purpose circuit. Fixes bug 5644; bugfix on
-      0.2.1.6-alpha.
-    - Fix builds when the path to sed, openssl, or sha1sum contains
-      spaces, which is pretty common on Windows. Fixes bug 5065; bugfix
-      on 0.2.2.1-alpha.
-    - Correct our replacements for the timeradd() and timersub() functions
-      on platforms that lack them (for example, Windows). The timersub()
-      function is used when expiring circuits, while timeradd() is
-      currently unused. Bug report and patch by Vektor. Fixes bug 4778;
-      bugfix on 0.2.2.24-alpha.
-    - Fix the SOCKET_OK test that we use to tell when socket
-      creation fails so that it works on Win64. Fixes part of bug 4533;
-      bugfix on 0.2.2.29-beta. Bug found by wanoskarnet.
-
-  o Minor bugfixes:
-    - Reject out-of-range times like 23:59:61 in parse_rfc1123_time().
-      Fixes bug 5346; bugfix on 0.0.8pre3.
-    - Make our number-parsing functions always treat too-large values
-      as an error, even when those values exceed the width of the
-      underlying type. Previously, if the caller provided these
-      functions with minima or maxima set to the extreme values of the
-      underlying integer type, these functions would return those
-      values on overflow rather than treating overflow as an error.
-      Fixes part of bug 5786; bugfix on 0.0.9.
-    - Older Linux kernels erroneously respond to strange nmap behavior
-      by having accept() return successfully with a zero-length
-      socket. When this happens, just close the connection. Previously,
-      we would try harder to learn the remote address: but there was
-      no such remote address to learn, and our method for trying to
-      learn it was incorrect. Fixes bugs 1240, 4745, and 4747. Bugfix
-      on 0.1.0.3-rc. Reported and diagnosed by "r1eo".
-    - Correct parsing of certain date types in parse_http_time().
-      Without this patch, If-Modified-Since would behave
-      incorrectly. Fixes bug 5346; bugfix on 0.2.0.2-alpha. Patch from
-      Esteban Manchado Velázques.
-    - Change the BridgePassword feature (part of the "bridge community"
-      design, which is not yet implemented) to use a time-independent
-      comparison. The old behavior might have allowed an adversary
-      to use timing to guess the BridgePassword value. Fixes bug 5543;
-      bugfix on 0.2.0.14-alpha.
-    - Detect and reject certain misformed escape sequences in
-      configuration values. Previously, these values would cause us
-      to crash if received in a torrc file or over an authenticated
-      control port. Bug found by Esteban Manchado Velázquez, and
-      independently by Robert Connolly from Matta Consulting who further
-      noted that it allows a post-authentication heap overflow. Patch
-      by Alexander Schrijver. Fixes bugs 5090 and 5402 (CVE 2012-1668);
-      bugfix on 0.2.0.16-alpha.
-    - Fix a compile warning when using the --enable-openbsd-malloc
-      configure option. Fixes bug 5340; bugfix on 0.2.0.20-rc.
-    - During configure, detect when we're building with clang version
-      3.0 or lower and disable the -Wnormalized=id and -Woverride-init
-      CFLAGS. clang doesn't support them yet.
-    - When sending an HTTP/1.1 proxy request, include a Host header.
-      Fixes bug 5593; bugfix on 0.2.2.1-alpha.
-    - Fix a NULL-pointer dereference on a badly formed SETCIRCUITPURPOSE
-      command. Found by mikeyc. Fixes bug 5796; bugfix on 0.2.2.9-alpha.
-    - If we hit the error case where routerlist_insert() replaces an
-      existing (old) server descriptor, make sure to remove that
-      server descriptor from the old_routers list. Fix related to bug
-      1776. Bugfix on 0.2.2.18-alpha.
-
-  o Minor bugfixes (documentation and log messages):
-    - Fix a typo in a log message in rend_service_rendezvous_has_opened().
-      Fixes bug 4856; bugfix on Tor 0.0.6.
-    - Update "ClientOnly" man page entry to explain that there isn't
-      really any point to messing with it. Resolves ticket 5005.
-    - Document the GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays
-      directory authority option (introduced in Tor 0.2.2.34).
-    - Downgrade the "We're missing a certificate" message from notice
-      to info: people kept mistaking it for a real problem, whereas it
-      is seldom the problem even when we are failing to bootstrap. Fixes
-      bug 5067; bugfix on 0.2.0.10-alpha.
-    - Correctly spell "connect" in a log message on failure to create a
-      controlsocket. Fixes bug 4803; bugfix on 0.2.2.26-beta.
-    - Clarify the behavior of MaxCircuitDirtiness with hidden service
-      circuits. Fixes issue 5259.
-
-  o Minor features:
-    - Directory authorities now reject versions of Tor older than
-      0.2.1.30, and Tor versions between 0.2.2.1-alpha and 0.2.2.20-alpha
-      inclusive. These versions accounted for only a small fraction of
-      the Tor network, and have numerous known security issues. Resolves
-      issue 4788.
-    - Update to the May 1 2012 Maxmind GeoLite Country database.
-
-  - Feature removal:
-    - When sending or relaying a RELAY_EARLY cell, we used to convert
-      it to a RELAY cell if the connection was using the v1 link
-      protocol. This was a workaround for older versions of Tor, which
-      didn't handle RELAY_EARLY cells properly. Now that all supported
-      versions can handle RELAY_EARLY cells, and now that we're enforcing
-      the "no RELAY_EXTEND commands except in RELAY_EARLY cells" rule,
-      remove this workaround. Addresses bug 4786.
-
-
-Changes in version 0.2.2.35 - 2011-12-16
-  Tor 0.2.2.35 fixes a critical heap-overflow security issue in Tor's
-  buffers code. Absolutely everybody should upgrade.
-
-  The bug relied on an incorrect calculation when making data continuous
-  in one of our IO buffers, if the first chunk of the buffer was
-  misaligned by just the wrong amount. The miscalculation would allow an
-  attacker to overflow a piece of heap-allocated memory. To mount this
-  attack, the attacker would need to either open a SOCKS connection to
-  Tor's SocksPort (usually restricted to localhost), or target a Tor
-  instance configured to make its connections through a SOCKS proxy
-  (which Tor does not do by default).
-
-  Good security practice requires that all heap-overflow bugs should be
-  presumed to be exploitable until proven otherwise, so we are treating
-  this as a potential code execution attack. Please upgrade immediately!
-  This bug does not affect bufferevents-based builds of Tor. Special
-  thanks to "Vektor" for reporting this issue to us!
-
-  Tor 0.2.2.35 also fixes several bugs in previous versions, including
-  crash bugs for unusual configurations, and a long-term bug that
-  would prevent Tor from starting on Windows machines with draconian
-  AV software.
-
-  With this release, we remind everyone that 0.2.0.x has reached its
-  formal end-of-life. Those Tor versions have many known flaws, and
-  nobody should be using them. You should upgrade -- ideally to the
-  0.2.2.x series. If you're using a Linux or BSD and its packages are
-  obsolete, stop using those packages and upgrade anyway.
-
-  The Tor 0.2.1.x series is also approaching its end-of-life: it will no
-  longer receive support after some time in early 2012.
-
-  o Major bugfixes:
-    - Fix a heap overflow bug that could occur when trying to pull
-      data into the first chunk of a buffer, when that chunk had
-      already had some data drained from it. Fixes CVE-2011-2778;
-      bugfix on 0.2.0.16-alpha. Reported by "Vektor".
-    - Initialize Libevent with the EVENT_BASE_FLAG_NOLOCK flag enabled, so
-      that it doesn't attempt to allocate a socketpair. This could cause
-      some problems on Windows systems with overzealous firewalls. Fix for
-      bug 4457; workaround for Libevent versions 2.0.1-alpha through
-      2.0.15-stable.
-    - If we mark an OR connection for close based on a cell we process,
-      don't process any further cells on it. We already avoid further
-      reads on marked-for-close connections, but now we also discard the
-      cells we'd already read. Fixes bug 4299; bugfix on 0.2.0.10-alpha,
-      which was the first version where we might mark a connection for
-      close based on processing a cell on it.
-    - Correctly sanity-check that we don't underflow on a memory
-      allocation (and then assert) for hidden service introduction
-      point decryption. Bug discovered by Dan Rosenberg. Fixes bug 4410;
-      bugfix on 0.2.1.5-alpha.
-    - Fix a memory leak when we check whether a hidden service
-      descriptor has any usable introduction points left. Fixes bug
-      4424. Bugfix on 0.2.2.25-alpha.
-    - Don't crash when we're running as a relay and don't have a GeoIP
-      file. Bugfix on 0.2.2.34; fixes bug 4340. This backports a fix
-      we've had in the 0.2.3.x branch already.
-    - When running as a client, do not print a misleading (and plain
-      wrong) log message that we're collecting "directory request"
-      statistics: clients don't collect statistics. Also don't create a
-      useless (because empty) stats file in the stats/ directory. Fixes
-      bug 4353; bugfix on 0.2.2.34.
-
-  o Minor bugfixes:
-    - Detect failure to initialize Libevent. This fix provides better
-      detection for future instances of bug 4457.
-    - Avoid frequent calls to the fairly expensive cull_wedged_cpuworkers
-      function. This was eating up hideously large amounts of time on some
-      busy servers. Fixes bug 4518; bugfix on 0.0.9.8.
-    - Resolve an integer overflow bug in smartlist_ensure_capacity().
-      Fixes bug 4230; bugfix on Tor 0.1.0.1-rc. Based on a patch by
-      Mansour Moufid.
-    - Don't warn about unused log_mutex in log.c when building with
-      --disable-threads using a recent GCC. Fixes bug 4437; bugfix on
-      0.1.0.6-rc which introduced --disable-threads.
-    - When configuring, starting, or stopping an NT service, stop
-      immediately after the service configuration attempt has succeeded
-      or failed. Fixes bug 3963; bugfix on 0.2.0.7-alpha.
-    - When sending a NETINFO cell, include the original address
-      received for the other side, not its canonical address. Found
-      by "troll_un"; fixes bug 4349; bugfix on 0.2.0.10-alpha.
-    - Fix a typo in a hibernation-related log message. Fixes bug 4331;
-      bugfix on 0.2.2.23-alpha; found by "tmpname0901".
-    - Fix a memory leak in launch_direct_bridge_descriptor_fetch() that
-      occurred when a client tried to fetch a descriptor for a bridge
-      in ExcludeNodes. Fixes bug 4383; bugfix on 0.2.2.25-alpha.
-    - Backport fixes for a pair of compilation warnings on Windows.
-      Fixes bug 4521; bugfix on 0.2.2.28-beta and on 0.2.2.29-beta.
-    - If we had ever tried to call tor_addr_to_str on an address of
-      unknown type, we would have done a strdup on an uninitialized
-      buffer. Now we won't. Fixes bug 4529; bugfix on 0.2.1.3-alpha.
-      Reported by "troll_un".
-    - Correctly detect and handle transient lookup failures from
-      tor_addr_lookup. Fixes bug 4530; bugfix on 0.2.1.5-alpha.
-      Reported by "troll_un".
-    - Fix null-pointer access that could occur if TLS allocation failed.
-      Fixes bug 4531; bugfix on 0.2.0.20-rc. Found by "troll_un".
-    - Use tor_socket_t type for listener argument to accept(). Fixes bug
-      4535; bugfix on 0.2.2.28-beta. Found by "troll_un".
-
-  o Minor features:
-    - Add two new config options for directory authorities:
-      AuthDirFastGuarantee sets a bandwidth threshold for guaranteeing the
-      Fast flag, and AuthDirGuardBWGuarantee sets a bandwidth threshold
-      that is always sufficient to satisfy the bandwidth requirement for
-      the Guard flag. Now it will be easier for researchers to simulate
-      Tor networks with different values. Resolves ticket 4484.
-    - When Tor ignores a hidden service specified in its configuration,
-      include the hidden service's directory in the warning message.
-      Previously, we would only tell the user that some hidden service
-      was ignored. Bugfix on 0.0.6; fixes bug 4426.
-    - Update to the December 6 2011 Maxmind GeoLite Country database.
-
-  o Packaging changes:
-    - Make it easier to automate expert package builds on Windows,
-      by removing an absolute path from makensis.exe command.
-
-
-Changes in version 0.2.1.32 - 2011-12-16
-  Tor 0.2.1.32 backports important security and privacy fixes for
-  oldstable. This release is intended only for package maintainers and
-  others who cannot use the 0.2.2 stable series. All others should be
-  using Tor 0.2.2.x or newer.
-
-  The Tor 0.2.1.x series will reach formal end-of-life some time in
-  early 2012; we will stop releasing patches for it then.
-
-  o Major bugfixes (also included in 0.2.2.x):
-    - Correctly sanity-check that we don't underflow on a memory
-      allocation (and then assert) for hidden service introduction
-      point decryption. Bug discovered by Dan Rosenberg. Fixes bug 4410;
-      bugfix on 0.2.1.5-alpha.
-    - Fix a heap overflow bug that could occur when trying to pull
-      data into the first chunk of a buffer, when that chunk had
-      already had some data drained from it. Fixes CVE-2011-2778;
-      bugfix on 0.2.0.16-alpha. Reported by "Vektor".
-
-  o Minor features:
-    - Update to the December 6 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.2.34 - 2011-10-26
-  Tor 0.2.2.34 fixes a critical anonymity vulnerability where an attacker
-  can deanonymize Tor users. Everybody should upgrade.
-
-  The attack relies on four components: 1) Clients reuse their TLS cert
-  when talking to different relays, so relays can recognize a user by
-  the identity key in her cert. 2) An attacker who knows the client's
-  identity key can probe each guard relay to see if that identity key
-  is connected to that guard relay right now. 3) A variety of active
-  attacks in the literature (starting from "Low-Cost Traffic Analysis
-  of Tor" by Murdoch and Danezis in 2005) allow a malicious website to
-  discover the guard relays that a Tor user visiting the website is using.
-  4) Clients typically pick three guards at random, so the set of guards
-  for a given user could well be a unique fingerprint for her. This
-  release fixes components #1 and #2, which is enough to block the attack;
-  the other two remain as open research problems. Special thanks to
-  "frosty_un" for reporting the issue to us!
-
-  Clients should upgrade so they are no longer recognizable by the TLS
-  certs they present. Relays should upgrade so they no longer allow a
-  remote attacker to probe them to test whether unpatched clients are
-  currently connected to them.
-
-  This release also fixes several vulnerabilities that allow an attacker
-  to enumerate bridge relays. Some bridge enumeration attacks still
-  remain; see for example proposal 188.
-
-  o Privacy/anonymity fixes (clients):
-    - Clients and bridges no longer send TLS certificate chains on
-      outgoing OR connections. Previously, each client or bridge would
-      use the same cert chain for all outgoing OR connections until
-      its IP address changes, which allowed any relay that the client
-      or bridge contacted to determine which entry guards it is using.
-      Fixes CVE-2011-2768. Bugfix on 0.0.9pre5; found by "frosty_un".
-    - If a relay receives a CREATE_FAST cell on a TLS connection, it
-      no longer considers that connection as suitable for satisfying a
-      circuit EXTEND request. Now relays can protect clients from the
-      CVE-2011-2768 issue even if the clients haven't upgraded yet.
-    - Directory authorities no longer assign the Guard flag to relays
-      that haven't upgraded to the above "refuse EXTEND requests
-      to client connections" fix. Now directory authorities can
-      protect clients from the CVE-2011-2768 issue even if neither
-      the clients nor the relays have upgraded yet. There's a new
-      "GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays" config option
-      to let us transition smoothly, else tomorrow there would be no
-      guard relays.
-
-  o Privacy/anonymity fixes (bridge enumeration):
-    - Bridge relays now do their directory fetches inside Tor TLS
-      connections, like all the other clients do, rather than connecting
-      directly to the DirPort like public relays do. Removes another
-      avenue for enumerating bridges. Fixes bug 4115; bugfix on 0.2.0.35.
-    - Bridges relays now build circuits for themselves in a more similar
-      way to how clients build them. Removes another avenue for
-      enumerating bridges. Fixes bug 4124; bugfix on 0.2.0.3-alpha,
-      when bridges were introduced.
-    - Bridges now refuse CREATE or CREATE_FAST cells on OR connections
-      that they initiated. Relays could distinguish incoming bridge
-      connections from client connections, creating another avenue for
-      enumerating bridges. Fixes CVE-2011-2769. Bugfix on 0.2.0.3-alpha.
-      Found by "frosty_un".
-
-  o Major bugfixes:
-    - Fix a crash bug when changing node restrictions while a DNS lookup
-      is in-progress. Fixes bug 4259; bugfix on 0.2.2.25-alpha. Bugfix
-      by "Tey'".
-    - Don't launch a useless circuit after failing to use one of a
-      hidden service's introduction points. Previously, we would
-      launch a new introduction circuit, but not set the hidden service
-      which that circuit was intended to connect to, so it would never
-      actually be used. A different piece of code would then create a
-      new introduction circuit correctly. Bug reported by katmagic and
-      found by Sebastian Hahn. Bugfix on 0.2.1.13-alpha; fixes bug 4212.
-
-  o Minor bugfixes:
-    - Change an integer overflow check in the OpenBSD_Malloc code so
-      that GCC is less likely to eliminate it as impossible. Patch
-      from Mansour Moufid. Fixes bug 4059.
-    - When a hidden service turns an extra service-side introduction
-      circuit into a general-purpose circuit, free the rend_data and
-      intro_key fields first, so we won't leak memory if the circuit
-      is cannibalized for use as another service-side introduction
-      circuit. Bugfix on 0.2.1.7-alpha; fixes bug 4251.
-    - Bridges now skip DNS self-tests, to act a little more stealthily.
-      Fixes bug 4201; bugfix on 0.2.0.3-alpha, which first introduced
-      bridges. Patch by "warms0x".
-    - Fix internal bug-checking logic that was supposed to catch
-      failures in digest generation so that it will fail more robustly
-      if we ask for a nonexistent algorithm. Found by Coverity Scan.
-      Bugfix on 0.2.2.1-alpha; fixes Coverity CID 479.
-    - Report any failure in init_keys() calls launched because our
-      IP address has changed. Spotted by Coverity Scan. Bugfix on
-      0.1.1.4-alpha; fixes CID 484.
-
-  o Minor bugfixes (log messages and documentation):
-    - Remove a confusing dollar sign from the example fingerprint in the
-      man page, and also make the example fingerprint a valid one. Fixes
-      bug 4309; bugfix on 0.2.1.3-alpha.
-    - The next version of Windows will be called Windows 8, and it has
-      a major version of 6, minor version of 2. Correctly identify that
-      version instead of calling it "Very recent version". Resolves
-      ticket 4153; reported by funkstar.
-    - Downgrade log messages about circuit timeout calibration from
-      "notice" to "info": they don't require or suggest any human
-      intervention. Patch from Tom Lowenthal. Fixes bug 4063;
-      bugfix on 0.2.2.14-alpha.
-
-  o Minor features:
-    - Turn on directory request statistics by default and include them in
-      extra-info descriptors. Don't break if we have no GeoIP database.
-      Backported from 0.2.3.1-alpha; implements ticket 3951.
-    - Update to the October 4 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.1.31 - 2011-10-26
-  Tor 0.2.1.31 backports important security and privacy fixes for
-  oldstable. This release is intended only for package maintainers and
-  others who cannot use the 0.2.2 stable series. All others should be
-  using Tor 0.2.2.x or newer.
-
-  o Security fixes (also included in 0.2.2.x):
-    - Replace all potentially sensitive memory comparison operations
-      with versions whose runtime does not depend on the data being
-      compared. This will help resist a class of attacks where an
-      adversary can use variations in timing information to learn
-      sensitive data. Fix for one case of bug 3122. (Safe memcmp
-      implementation by Robert Ransom based partially on code by DJB.)
-    - Fix an assert in parsing router descriptors containing IPv6
-      addresses. This one took down the directory authorities when
-      somebody tried some experimental code. Bugfix on 0.2.1.3-alpha.
-
-  o Privacy/anonymity fixes (also included in 0.2.2.x):
-    - Clients and bridges no longer send TLS certificate chains on
-      outgoing OR connections. Previously, each client or bridge would
-      use the same cert chain for all outgoing OR connections until
-      its IP address changes, which allowed any relay that the client
-      or bridge contacted to determine which entry guards it is using.
-      Fixes CVE-2011-2768. Bugfix on 0.0.9pre5; found by "frosty_un".
-    - If a relay receives a CREATE_FAST cell on a TLS connection, it
-      no longer considers that connection as suitable for satisfying a
-      circuit EXTEND request. Now relays can protect clients from the
-      CVE-2011-2768 issue even if the clients haven't upgraded yet.
-    - Bridges now refuse CREATE or CREATE_FAST cells on OR connections
-      that they initiated. Relays could distinguish incoming bridge 
-      connections from client connections, creating another avenue for
-      enumerating bridges. Fixes CVE-2011-2769. Bugfix on 0.2.0.3-alpha.
-      Found by "frosty_un".
-    - When receiving a hidden service descriptor, check that it is for
-      the hidden service we wanted. Previously, Tor would store any
-      hidden service descriptors that a directory gave it, whether it
-      wanted them or not. This wouldn't have let an attacker impersonate
-      a hidden service, but it did let directories pre-seed a client
-      with descriptors that it didn't want. Bugfix on 0.0.6.
-    - Avoid linkability based on cached hidden service descriptors: forget
-      all hidden service descriptors cached as a client when processing a
-      SIGNAL NEWNYM command. Fixes bug 3000; bugfix on 0.0.6.
-    - Make the bridge directory authority refuse to answer directory
-      requests for "all" descriptors. It used to include bridge
-      descriptors in its answer, which was a major information leak.
-      Found by "piebeer". Bugfix on 0.2.0.3-alpha.
-    - Don't attach new streams to old rendezvous circuits after SIGNAL
-      NEWNYM. Previously, we would keep using an existing rendezvous
-      circuit if it remained open (i.e. if it were kept open by a
-      long-lived stream, or if a new stream were attached to it before
-      Tor could notice that it was old and no longer in use). Bugfix on
-      0.1.1.15-rc; fixes bug 3375.
-
-  o Minor bugfixes (also included in 0.2.2.x):
-    - When we restart our relay, we might get a successful connection
-      from the outside before we've started our reachability tests,
-      triggering a warning: "ORPort found reachable, but I have no
-      routerinfo yet. Failing to inform controller of success." This
-      bug was harmless unless Tor is running under a controller
-      like Vidalia, in which case the controller would never get a
-      REACHABILITY_SUCCEEDED status event. Bugfix on 0.1.2.6-alpha;
-      fixes bug 1172.
-    - Build correctly on OSX with zlib 1.2.4 and higher with all warnings
-      enabled. Fixes bug 1526.
-    - Remove undocumented option "-F" from tor-resolve: it hasn't done
-      anything since 0.2.1.16-rc.
-    - Avoid signed/unsigned comparisons by making SIZE_T_CEILING unsigned.
-      None of the cases where we did this before were wrong, but by making
-      this change we avoid warnings. Fixes bug 2475; bugfix on 0.2.1.28.
-    - Fix a rare crash bug that could occur when a client was configured
-      with a large number of bridges. Fixes bug 2629; bugfix on
-      0.2.1.2-alpha. Bugfix by trac user "shitlei".
-    - Correct the warning displayed when a rendezvous descriptor exceeds
-      the maximum size. Fixes bug 2750; bugfix on 0.2.1.5-alpha. Found by
-      John Brooks.
-    - Fix an uncommon assertion failure when running with DNSPort under
-      heavy load. Fixes bug 2933; bugfix on 0.2.0.1-alpha.
-    - When warning about missing zlib development packages during compile,
-      give the correct package names. Bugfix on 0.2.0.1-alpha.
-    - Require that introduction point keys and onion keys have public
-      exponent 65537. Bugfix on 0.2.0.10-alpha.
-    - Do not crash when our configuration file becomes unreadable, for
-      example due to a permissions change, between when we start up
-      and when a controller calls SAVECONF. Fixes bug 3135; bugfix
-      on 0.0.9pre6.
-    - Fix warnings from GCC 4.6's "-Wunused-but-set-variable" option.
-      Fixes bug 3208.
-    - Always NUL-terminate the sun_path field of a sockaddr_un before
-      passing it to the kernel. (Not a security issue: kernels are
-      smart enough to reject bad sockaddr_uns.) Found by Coverity;
-      CID #428. Bugfix on Tor 0.2.0.3-alpha.
-    - Don't stack-allocate the list of supplementary GIDs when we're
-      about to log them. Stack-allocating NGROUPS_MAX gid_t elements
-      could take up to 256K, which is way too much stack. Found by
-      Coverity; CID #450. Bugfix on 0.2.1.7-alpha.
-
-  o Minor bugfixes (only in 0.2.1.x):
-    - Resume using micro-version numbers in 0.2.1.x: our Debian packages
-      rely on them. Bugfix on 0.2.1.30.
-    - Use git revisions instead of svn revisions when generating our
-      micro-version numbers. Bugfix on 0.2.1.15-rc; fixes bug 2402.
-
-  o Minor features (also included in 0.2.2.x):
-    - Adjust the expiration time on our SSL session certificates to
-      better match SSL certs seen in the wild. Resolves ticket 4014.
-    - Allow nameservers with IPv6 address. Resolves bug 2574.
-    - Update to the October 4 2011 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.2.33 - 2011-09-13
-  Tor 0.2.2.33 fixes several bugs, and includes a slight tweak to Tor's
-  TLS handshake that makes relays and bridges that run this new version
-  reachable from Iran again.
-
-  o Major bugfixes:
-    - Avoid an assertion failure when reloading a configuration with
-      TrackExitHosts changes. Found and fixed by 'laruldan'. Fixes bug
-      3923; bugfix on 0.2.2.25-alpha.
-
-  o Minor features (security):
-    - Check for replays of the public-key encrypted portion of an
-      INTRODUCE1 cell, in addition to the current check for replays of
-      the g^x value. This prevents a possible class of active attacks
-      by an attacker who controls both an introduction point and a
-      rendezvous point, and who uses the malleability of AES-CTR to
-      alter the encrypted g^x portion of the INTRODUCE1 cell. We think
-      that these attacks are infeasible (requiring the attacker to send
-      on the order of zettabytes of altered cells in a short interval),
-      but we'd rather block them off in case there are any classes of
-      this attack that we missed. Reported by Willem Pinckaers.
-
-  o Minor features:
-    - Adjust the expiration time on our SSL session certificates to
-      better match SSL certs seen in the wild. Resolves ticket 4014.
-    - Change the default required uptime for a relay to be accepted as
-      a HSDir (hidden service directory) from 24 hours to 25 hours.
-      Improves on 0.2.0.10-alpha; resolves ticket 2649.
-    - Add a VoteOnHidServDirectoriesV2 config option to allow directory
-      authorities to abstain from voting on assignment of the HSDir
-      consensus flag. Related to bug 2649.
-    - Update to the September 6 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes (documentation and log messages):
-    - Correct the man page to explain that HashedControlPassword and
-      CookieAuthentication can both be set, in which case either method
-      is sufficient to authenticate to Tor. Bugfix on 0.2.0.7-alpha,
-      when we decided to allow these config options to both be set. Issue
-      raised by bug 3898.
-    - Demote the 'replay detected' log message emitted when a hidden
-      service receives the same Diffie-Hellman public key in two different
-      INTRODUCE2 cells to info level. A normal Tor client can cause that
-      log message during its normal operation. Bugfix on 0.2.1.6-alpha;
-      fixes part of bug 2442.
-    - Demote the 'INTRODUCE2 cell is too {old,new}' log message to info
-      level. There is nothing that a hidden service's operator can do
-      to fix its clients' clocks. Bugfix on 0.2.1.6-alpha; fixes part
-      of bug 2442.
-    - Clarify a log message specifying the characters permitted in
-      HiddenServiceAuthorizeClient client names. Previously, the log
-      message said that "[A-Za-z0-9+-_]" were permitted; that could have
-      given the impression that every ASCII character between "+" and "_"
-      was permitted. Now we say "[A-Za-z0-9+_-]". Bugfix on 0.2.1.5-alpha.
-
-  o Build fixes:
-    - Provide a substitute implementation of lround() for MSVC, which
-      apparently lacks it. Patch from Gisle Vanem.
-    - Clean up some code issues that prevented Tor from building on older
-      BSDs. Fixes bug 3894; reported by "grarpamp".
-    - Search for a platform-specific version of "ar" when cross-compiling.
-      Should fix builds on iOS. Resolves bug 3909, found by Marco Bonetti.
-
-
-Changes in version 0.2.2.32 - 2011-08-27
-  The Tor 0.2.2 release series is dedicated to the memory of Andreas
-  Pfitzmann (1958-2010), a pioneer in anonymity and privacy research,
-  a founder of the PETS community, a leader in our field, a mentor,
-  and a friend. He left us with these words: "I had the possibility
-  to contribute to this world that is not as it should be. I hope I
-  could help in some areas to make the world a better place, and that
-  I could also encourage other people to be engaged in improving the
-  world. Please, stay engaged. This world needs you, your love, your
-  initiative -- now I cannot be part of that anymore."
-
-  Tor 0.2.2.32, the first stable release in the 0.2.2 branch, is finally
-  ready. More than two years in the making, this release features improved
-  client performance and hidden service reliability, better compatibility
-  for Android, correct behavior for bridges that listen on more than
-  one address, more extensible and flexible directory object handling,
-  better reporting of network statistics, improved code security, and
-  many many other features and bugfixes.
-
-  o Major features (client performance):
-    - When choosing which cells to relay first, relays now favor circuits
-      that have been quiet recently, to provide lower latency for
-      low-volume circuits. By default, relays enable or disable this
-      feature based on a setting in the consensus. They can override
-      this default by using the new "CircuitPriorityHalflife" config
-      option. Design and code by Ian Goldberg, Can Tang, and Chris
-      Alexander.
-    - Directory authorities now compute consensus weightings that instruct
-      clients how to weight relays flagged as Guard, Exit, Guard+Exit,
-      and no flag. Clients use these weightings to distribute network load
-      more evenly across these different relay types. The weightings are
-      in the consensus so we can change them globally in the future. Extra
-      thanks to "outofwords" for finding some nasty security bugs in
-      the first implementation of this feature.
-
-  o Major features (client performance, circuit build timeout):
-    - Tor now tracks how long it takes to build client-side circuits
-      over time, and adapts its timeout to local network performance.
-      Since a circuit that takes a long time to build will also provide
-      bad performance, we get significant latency improvements by
-      discarding the slowest 20% of circuits. Specifically, Tor creates
-      circuits more aggressively than usual until it has enough data
-      points for a good timeout estimate. Implements proposal 151.
-    - Circuit build timeout constants can be controlled by consensus
-      parameters. We set good defaults for these parameters based on
-      experimentation on broadband and simulated high-latency links.
-    - Circuit build time learning can be disabled via consensus parameter
-      or by the client via a LearnCircuitBuildTimeout config option. We
-      also automatically disable circuit build time calculation if either
-      AuthoritativeDirectory is set, or if we fail to write our state
-      file. Implements ticket 1296.
-
-  o Major features (relays use their capacity better):
-    - Set SO_REUSEADDR socket option on all sockets, not just
-      listeners. This should help busy exit nodes avoid running out of
-      useable ports just because all the ports have been used in the
-      near past. Resolves issue 2850.
-    - Relays now save observed peak bandwidth throughput rates to their
-      state file (along with total usage, which was already saved),
-      so that they can determine their correct estimated bandwidth on
-      restart. Resolves bug 1863, where Tor relays would reset their
-      estimated bandwidth to 0 after restarting.
-    - Lower the maximum weighted-fractional-uptime cutoff to 98%. This
-      should give us approximately 40-50% more Guard-flagged nodes,
-      improving the anonymity the Tor network can provide and also
-      decreasing the dropoff in throughput that relays experience when
-      they first get the Guard flag.
-    - Directory authorities now take changes in router IP address and
-      ORPort into account when determining router stability. Previously,
-      if a router changed its IP or ORPort, the authorities would not
-      treat it as having any downtime for the purposes of stability
-      calculation, whereas clients would experience downtime since the
-      change would take a while to propagate to them. Resolves issue 1035.
-    - New AccelName and AccelDir options add support for dynamic OpenSSL
-      hardware crypto acceleration engines.
-
-  o Major features (relays control their load better):
-    - Exit relays now try harder to block exit attempts from unknown
-      relays, to make it harder for people to use them as one-hop proxies
-      a la tortunnel. Controlled by the refuseunknownexits consensus
-      parameter (currently enabled), or you can override it on your
-      relay with the RefuseUnknownExits torrc option. Resolves bug 1751;
-      based on a variant of proposal 163.
-    - Add separate per-conn write limiting to go with the per-conn read
-      limiting. We added a global write limit in Tor 0.1.2.5-alpha,
-      but never per-conn write limits.
-    - New consensus params "bwconnrate" and "bwconnburst" to let us
-      rate-limit client connections as they enter the network. It's
-      controlled in the consensus so we can turn it on and off for
-      experiments. It's starting out off. Based on proposal 163.
-
-  o Major features (controllers):
-    - Export GeoIP information on bridge usage to controllers even if we
-      have not yet been running for 24 hours. Now Vidalia bridge operators
-      can get more accurate and immediate feedback about their
-      contributions to the network.
-    - Add an __OwningControllerProcess configuration option and a
-      TAKEOWNERSHIP control-port command. Now a Tor controller can ensure
-      that when it exits, Tor will shut down. Implements feature 3049.
-
-  o Major features (directory authorities):
-    - Directory authorities now create, vote on, and serve multiple
-      parallel formats of directory data as part of their voting process.
-      Partially implements Proposal 162: "Publish the consensus in
-      multiple flavors".
-    - Directory authorities now agree on and publish small summaries
-      of router information that clients can use in place of regular
-      server descriptors. This transition will allow Tor 0.2.3 clients
-      to use far less bandwidth for downloading information about the
-      network. Begins the implementation of Proposal 158: "Clients
-      download consensus + microdescriptors".
-    - The directory voting system is now extensible to use multiple hash
-      algorithms for signatures and resource selection. Newer formats
-      are signed with SHA256, with a possibility for moving to a better
-      hash algorithm in the future.
-    - Directory authorities can now vote on arbitary integer values as
-      part of the consensus process. This is designed to help set
-      network-wide parameters. Implements proposal 167.
-
-  o Major features and bugfixes (node selection):
-    - Revise and reconcile the meaning of the ExitNodes, EntryNodes,
-      ExcludeEntryNodes, ExcludeExitNodes, ExcludeNodes, and Strict*Nodes
-      options. Previously, we had been ambiguous in describing what
-      counted as an "exit" node, and what operations exactly "StrictNodes
-      0" would permit. This created confusion when people saw nodes built
-      through unexpected circuits, and made it hard to tell real bugs from
-      surprises. Now the intended behavior is:
-        . "Exit", in the context of ExitNodes and ExcludeExitNodes, means
-          a node that delivers user traffic outside the Tor network.
-        . "Entry", in the context of EntryNodes, means a node used as the
-          first hop of a multihop circuit. It doesn't include direct
-          connections to directory servers.
-        . "ExcludeNodes" applies to all nodes.
-        . "StrictNodes" changes the behavior of ExcludeNodes only. When
-          StrictNodes is set, Tor should avoid all nodes listed in
-          ExcludeNodes, even when it will make user requests fail. When
-          StrictNodes is *not* set, then Tor should follow ExcludeNodes
-          whenever it can, except when it must use an excluded node to
-          perform self-tests, connect to a hidden service, provide a
-          hidden service, fulfill a .exit request, upload directory
-          information, or fetch directory information.
-      Collectively, the changes to implement the behavior fix bug 1090.
-    - If EntryNodes, ExitNodes, ExcludeNodes, or ExcludeExitNodes
-      change during a config reload, mark and discard all our origin
-      circuits. This fix should address edge cases where we change the
-      config options and but then choose a circuit that we created before
-      the change.
-    - Make EntryNodes config option much more aggressive even when
-      StrictNodes is not set. Before it would prepend your requested
-      entrynodes to your list of guard nodes, but feel free to use others
-      after that. Now it chooses only from your EntryNodes if any of
-      those are available, and only falls back to others if a) they're
-      all down and b) StrictNodes is not set.
-    - Now we refresh your entry guards from EntryNodes at each consensus
-      fetch -- rather than just at startup and then they slowly rot as
-      the network changes.
-    - Add support for the country code "{??}" in torrc options like
-      ExcludeNodes, to indicate all routers of unknown country. Closes
-      bug 1094.
-    - ExcludeNodes now takes precedence over EntryNodes and ExitNodes: if
-      a node is listed in both, it's treated as excluded.
-    - ExcludeNodes now applies to directory nodes -- as a preference if
-      StrictNodes is 0, or an absolute requirement if StrictNodes is 1.
-      Don't exclude all the directory authorities and set StrictNodes to 1
-      unless you really want your Tor to break.
-    - ExcludeNodes and ExcludeExitNodes now override exit enclaving.
-    - ExcludeExitNodes now overrides .exit requests.
-    - We don't use bridges listed in ExcludeNodes.
-    - When StrictNodes is 1:
-       . We now apply ExcludeNodes to hidden service introduction points
-         and to rendezvous points selected by hidden service users. This
-         can make your hidden service less reliable: use it with caution!
-       . If we have used ExcludeNodes on ourself, do not try relay
-         reachability self-tests.
-       . If we have excluded all the directory authorities, we will not
-         even try to upload our descriptor if we're a relay.
-       . Do not honor .exit requests to an excluded node.
-    - When the set of permitted nodes changes, we now remove any mappings
-      introduced via TrackExitHosts to now-excluded nodes. Bugfix on
-      0.1.0.1-rc.
-    - We never cannibalize a circuit that had excluded nodes on it, even
-      if StrictNodes is 0. Bugfix on 0.1.0.1-rc.
-    - Improve log messages related to excluded nodes.
-
-  o Major features (misc):
-    - Numerous changes, bugfixes, and workarounds from Nathan Freitas
-      to help Tor build correctly for Android phones.
-    - The options SocksPort, ControlPort, and so on now all accept a
-      value "auto" that opens a socket on an OS-selected port. A
-      new ControlPortWriteToFile option tells Tor to write its
-      actual control port or ports to a chosen file. If the option
-      ControlPortFileGroupReadable is set, the file is created as
-      group-readable. Now users can run two Tor clients on the same
-      system without needing to manually mess with parameters. Resolves
-      part of ticket 3076.
-    - Tor now supports tunneling all of its outgoing connections over
-      a SOCKS proxy, using the SOCKS4Proxy and/or SOCKS5Proxy
-      configuration options. Code by Christopher Davis.
-
-  o Code security improvements:
-    - Replace all potentially sensitive memory comparison operations
-      with versions whose runtime does not depend on the data being
-      compared. This will help resist a class of attacks where an
-      adversary can use variations in timing information to learn
-      sensitive data. Fix for one case of bug 3122. (Safe memcmp
-      implementation by Robert Ransom based partially on code by DJB.)
-    - Enable Address Space Layout Randomization (ASLR) and Data Execution
-      Prevention (DEP) by default on Windows to make it harder for
-      attackers to exploit vulnerabilities. Patch from John Brooks.
-    - New "--enable-gcc-hardening" ./configure flag (off by default)
-      to turn on gcc compile time hardening options. It ensures
-      that signed ints have defined behavior (-fwrapv), enables
-      -D_FORTIFY_SOURCE=2 (requiring -O2), adds stack smashing protection
-      with canaries (-fstack-protector-all), turns on ASLR protection if
-      supported by the kernel (-fPIE, -pie), and adds additional security
-      related warnings. Verified to work on Mac OS X and Debian Lenny.
-    - New "--enable-linker-hardening" ./configure flag (off by default)
-      to turn on ELF specific hardening features (relro, now). This does
-      not work with Mac OS X or any other non-ELF binary format.
-    - Always search the Windows system directory for system DLLs, and
-      nowhere else. Bugfix on 0.1.1.23; fixes bug 1954.
-    - New DisableAllSwap option. If set to 1, Tor will attempt to lock all
-      current and future memory pages via mlockall(). On supported
-      platforms (modern Linux and probably BSD but not Windows or OS X),
-      this should effectively disable any and all attempts to page out
-      memory. This option requires that you start your Tor as root --
-      if you use DisableAllSwap, please consider using the User option
-      to properly reduce the privileges of your Tor.
-
-  o Major bugfixes (crashes):
-    - Fix crash bug on platforms where gmtime and localtime can return
-      NULL. Windows 7 users were running into this one. Fixes part of bug
-      2077. Bugfix on all versions of Tor. Found by boboper.
-    - Introduce minimum/maximum values that clients will believe
-      from the consensus. Now we'll have a better chance to avoid crashes
-      or worse when a consensus param has a weird value.
-    - Fix a rare crash bug that could occur when a client was configured
-      with a large number of bridges. Fixes bug 2629; bugfix on
-      0.2.1.2-alpha. Bugfix by trac user "shitlei".
-    - Do not crash when our configuration file becomes unreadable, for
-      example due to a permissions change, between when we start up
-      and when a controller calls SAVECONF. Fixes bug 3135; bugfix
-      on 0.0.9pre6.
-    - If we're in the pathological case where there's no exit bandwidth
-      but there is non-exit bandwidth, or no guard bandwidth but there
-      is non-guard bandwidth, don't crash during path selection. Bugfix
-      on 0.2.0.3-alpha.
-    - Fix a crash bug when trying to initialize the evdns module in
-      Libevent 2. Bugfix on 0.2.1.16-rc.
-
-  o Major bugfixes (stability):
-    - Fix an assert in parsing router descriptors containing IPv6
-      addresses. This one took down the directory authorities when
-      somebody tried some experimental code. Bugfix on 0.2.1.3-alpha.
-    - Fix an uncommon assertion failure when running with DNSPort under
-      heavy load. Fixes bug 2933; bugfix on 0.2.0.1-alpha.
-    - Treat an unset $HOME like an empty $HOME rather than triggering an
-      assert. Bugfix on 0.0.8pre1; fixes bug 1522.
-    - More gracefully handle corrupt state files, removing asserts
-      in favor of saving a backup and resetting state.
-    - Instead of giving an assertion failure on an internal mismatch
-      on estimated freelist size, just log a BUG warning and try later.
-      Mitigates but does not fix bug 1125.
-    - Fix an assert that got triggered when using the TestingTorNetwork
-      configuration option and then issuing a GETINFO config-text control
-      command. Fixes bug 2250; bugfix on 0.2.1.2-alpha.
-    - If the cached cert file is unparseable, warn but don't exit.
-
-  o Privacy fixes (relays/bridges):
-    - Don't list Windows capabilities in relay descriptors. We never made
-      use of them, and maybe it's a bad idea to publish them. Bugfix
-      on 0.1.1.8-alpha.
-    - If the Nickname configuration option isn't given, Tor would pick a
-      nickname based on the local hostname as the nickname for a relay.
-      Because nicknames are not very important in today's Tor and the
-      "Unnamed" nickname has been implemented, this is now problematic
-      behavior: It leaks information about the hostname without being
-      useful at all. Fixes bug 2979; bugfix on 0.1.2.2-alpha, which
-      introduced the Unnamed nickname. Reported by tagnaq.
-    - Maintain separate TLS contexts and certificates for incoming and
-      outgoing connections in bridge relays. Previously we would use the
-      same TLS contexts and certs for incoming and outgoing connections.
-      Bugfix on 0.2.0.3-alpha; addresses bug 988.
-    - Maintain separate identity keys for incoming and outgoing TLS
-      contexts in bridge relays. Previously we would use the same
-      identity keys for incoming and outgoing TLS contexts. Bugfix on
-      0.2.0.3-alpha; addresses the other half of bug 988.
-    - Make the bridge directory authority refuse to answer directory
-      requests for "all descriptors". It used to include bridge
-      descriptors in its answer, which was a major information leak.
-      Found by "piebeer". Bugfix on 0.2.0.3-alpha.
-
-  o Privacy fixes (clients):
-    - When receiving a hidden service descriptor, check that it is for
-      the hidden service we wanted. Previously, Tor would store any
-      hidden service descriptors that a directory gave it, whether it
-      wanted them or not. This wouldn't have let an attacker impersonate
-      a hidden service, but it did let directories pre-seed a client
-      with descriptors that it didn't want. Bugfix on 0.0.6.
-    - Start the process of disabling ".exit" address notation, since it
-      can be used for a variety of esoteric application-level attacks
-      on users. To reenable it, set "AllowDotExit 1" in your torrc. Fix
-      on 0.0.9rc5.
-    - Reject attempts at the client side to open connections to private
-      IP addresses (like 127.0.0.1, 10.0.0.1, and so on) with
-      a randomly chosen exit node. Attempts to do so are always
-      ill-defined, generally prevented by exit policies, and usually
-      in error. This will also help to detect loops in transparent
-      proxy configurations. You can disable this feature by setting
-      "ClientRejectInternalAddresses 0" in your torrc.
-    - Log a notice when we get a new control connection. Now it's easier
-      for security-conscious users to recognize when a local application
-      is knocking on their controller door. Suggested by bug 1196.
-
-  o Privacy fixes (newnym):
-    - Avoid linkability based on cached hidden service descriptors: forget
-      all hidden service descriptors cached as a client when processing a
-      SIGNAL NEWNYM command. Fixes bug 3000; bugfix on 0.0.6.
-    - On SIGHUP, do not clear out all TrackHostExits mappings, client
-      DNS cache entries, and virtual address mappings: that's what
-      NEWNYM is for. Fixes bug 1345; bugfix on 0.1.0.1-rc.
-    - Don't attach new streams to old rendezvous circuits after SIGNAL
-      NEWNYM. Previously, we would keep using an existing rendezvous
-      circuit if it remained open (i.e. if it were kept open by a
-      long-lived stream, or if a new stream were attached to it before
-      Tor could notice that it was old and no longer in use). Bugfix on
-      0.1.1.15-rc; fixes bug 3375.
-
-  o Major bugfixes (relay bandwidth accounting):
-    - Fix a bug that could break accounting on 64-bit systems with large
-      time_t values, making them hibernate for impossibly long intervals.
-      Fixes bug 2146. Bugfix on 0.0.9pre6; fix by boboper.
-    - Fix a bug in bandwidth accounting that could make us use twice
-      the intended bandwidth when our interval start changes due to
-      daylight saving time. Now we tolerate skew in stored vs computed
-      interval starts: if the start of the period changes by no more than
-      50% of the period's duration, we remember bytes that we transferred
-      in the old period. Fixes bug 1511; bugfix on 0.0.9pre5.
-
-  o Major bugfixes (bridges):
-    - Bridges now use "reject *:*" as their default exit policy. Bugfix
-      on 0.2.0.3-alpha. Fixes bug 1113.
-    - If you configure your bridge with a known identity fingerprint,
-      and the bridge authority is unreachable (as it is in at least
-      one country now), fall back to directly requesting the descriptor
-      from the bridge. Finishes the feature started in 0.2.0.10-alpha;
-      closes bug 1138.
-    - Fix a bug where bridge users who configure the non-canonical
-      address of a bridge automatically switch to its canonical
-      address. If a bridge listens at more than one address, it
-      should be able to advertise those addresses independently and
-      any non-blocked addresses should continue to work. Bugfix on Tor
-      0.2.0.3-alpha. Fixes bug 2510.
-    - If you configure Tor to use bridge A, and then quit and
-      configure Tor to use bridge B instead (or if you change Tor
-      to use bridge B via the controller), it would happily continue
-      to use bridge A if it's still reachable. While this behavior is
-      a feature if your goal is connectivity, in some scenarios it's a
-      dangerous bug. Bugfix on Tor 0.2.0.1-alpha; fixes bug 2511.
-    - When the controller configures a new bridge, don't wait 10 to 60
-      seconds before trying to fetch its descriptor. Bugfix on
-      0.2.0.3-alpha; fixes bug 3198 (suggested by 2355).
-
-  o Major bugfixes (directory authorities):
-    - Many relays have been falling out of the consensus lately because
-      not enough authorities know about their descriptor for them to get
-      a majority of votes. When we deprecated the v2 directory protocol,
-      we got rid of the only way that v3 authorities can hear from each
-      other about other descriptors. Now authorities examine every v3
-      vote for new descriptors, and fetch them from that authority. Bugfix
-      on 0.2.1.23.
-    - Authorities could be tricked into giving out the Exit flag to relays
-      that didn't allow exiting to any ports. This bug could screw
-      with load balancing and stats. Bugfix on 0.1.1.6-alpha; fixes bug
-      1238. Bug discovered by Martin Kowalczyk.
-    - If all authorities restart at once right before a consensus vote,
-      nobody will vote about "Running", and clients will get a consensus
-      with no usable relays. Instead, authorities refuse to build a
-      consensus if this happens. Bugfix on 0.2.0.10-alpha; fixes bug 1066.
-
-  o Major bugfixes (stream-level fairness):
-    - When receiving a circuit-level SENDME for a blocked circuit, try
-      to package cells fairly from all the streams that had previously
-      been blocked on that circuit. Previously, we had started with the
-      oldest stream, and allowed each stream to potentially exhaust
-      the circuit's package window. This gave older streams on any
-      given circuit priority over newer ones. Fixes bug 1937. Detected
-      originally by Camilo Viecco. This bug was introduced before the
-      first Tor release, in svn commit r152: it is the new winner of
-      the longest-lived bug prize.
-    - Fix a stream fairness bug that would cause newer streams on a given
-      circuit to get preference when reading bytes from the origin or
-      destination. Fixes bug 2210. Fix by Mashael AlSabah. This bug was
-      introduced before the first Tor release, in svn revision r152.
-    - When the exit relay got a circuit-level sendme cell, it started
-      reading on the exit streams, even if had 500 cells queued in the
-      circuit queue already, so the circuit queue just grew and grew in
-      some cases. We fix this by not re-enabling reading on receipt of a
-      sendme cell when the cell queue is blocked. Fixes bug 1653. Bugfix
-      on 0.2.0.1-alpha. Detected by Mashael AlSabah. Original patch by
-      "yetonetime".
-    - Newly created streams were allowed to read cells onto circuits,
-      even if the circuit's cell queue was blocked and waiting to drain.
-      This created potential unfairness, as older streams would be
-      blocked, but newer streams would gladly fill the queue completely.
-      We add code to detect this situation and prevent any stream from
-      getting more than one free cell. Bugfix on 0.2.0.1-alpha. Partially
-      fixes bug 1298.
-
-  o Major bugfixes (hidden services):
-    - Apply circuit timeouts to opened hidden-service-related circuits
-      based on the correct start time. Previously, we would apply the
-      circuit build timeout based on time since the circuit's creation;
-      it was supposed to be applied based on time since the circuit
-      entered its current state. Bugfix on 0.0.6; fixes part of bug 1297.
-    - Improve hidden service robustness: When we find that we have
-      extended a hidden service's introduction circuit to a relay not
-      listed as an introduction point in the HS descriptor we currently
-      have, retry with an introduction point from the current
-      descriptor. Previously we would just give up. Fixes bugs 1024 and
-      1930; bugfix on 0.2.0.10-alpha.
-    - Directory authorities now use data collected from their own
-      uptime observations when choosing whether to assign the HSDir flag
-      to relays, instead of trusting the uptime value the relay reports in
-      its descriptor. This change helps prevent an attack where a small
-      set of nodes with frequently-changing identity keys can blackhole
-      a hidden service. (Only authorities need upgrade; others will be
-      fine once they do.) Bugfix on 0.2.0.10-alpha; fixes bug 2709.
-    - Stop assigning the HSDir flag to relays that disable their
-      DirPort (and thus will refuse to answer directory requests). This
-      fix should dramatically improve the reachability of hidden services:
-      hidden services and hidden service clients pick six HSDir relays
-      to store and retrieve the hidden service descriptor, and currently
-      about half of the HSDir relays will refuse to work. Bugfix on
-      0.2.0.10-alpha; fixes part of bug 1693.
-
-  o Major bugfixes (misc):
-    - Clients now stop trying to use an exit node associated with a given
-      destination by TrackHostExits if they fail to reach that exit node.
-      Fixes bug 2999. Bugfix on 0.2.0.20-rc.
-    - Fix a regression that caused Tor to rebind its ports if it receives
-      SIGHUP while hibernating. Bugfix in 0.1.1.6-alpha; closes bug 919.
-    - Remove an extra pair of quotation marks around the error
-      message in control-port STATUS_GENERAL BUG events. Bugfix on
-      0.1.2.6-alpha; fixes bug 3732.
-
-  o Minor features (relays):
-    - Ensure that no empty [dirreq-](read|write)-history lines are added
-      to an extrainfo document. Implements ticket 2497.
-    - When bandwidth accounting is enabled, be more generous with how
-      much bandwidth we'll use up before entering "soft hibernation".
-      Previously, we'd refuse new connections and circuits once we'd
-      used up 95% of our allotment. Now, we use up 95% of our allotment,
-      AND make sure that we have no more than 500MB (or 3 hours of
-      expected traffic, whichever is lower) remaining before we enter
-      soft hibernation.
-    - Relays now log the reason for publishing a new relay descriptor,
-      so we have a better chance of hunting down instances of bug 1810.
-      Resolves ticket 3252.
-    - Log a little more clearly about the times at which we're no longer
-      accepting new connections (e.g. due to hibernating). Resolves
-      bug 2181.
-    - When AllowSingleHopExits is set, print a warning to explain to the
-      relay operator why most clients are avoiding her relay.
-    - Send END_STREAM_REASON_NOROUTE in response to EHOSTUNREACH errors.
-      Clients before 0.2.1.27 didn't handle NOROUTE correctly, but such
-      clients are already deprecated because of security bugs.
-
-  o Minor features (network statistics):
-    - Directory mirrors that set "DirReqStatistics 1" write statistics
-      about directory requests to disk every 24 hours. As compared to the
-      "--enable-geoip-stats" ./configure flag in 0.2.1.x, there are a few
-      improvements: 1) stats are written to disk exactly every 24 hours;
-      2) estimated shares of v2 and v3 requests are determined as mean
-      values, not at the end of a measurement period; 3) unresolved
-      requests are listed with country code '??'; 4) directories also
-      measure download times.
-    - Exit nodes that set "ExitPortStatistics 1" write statistics on the
-      number of exit streams and transferred bytes per port to disk every
-      24 hours.
-    - Relays that set "CellStatistics 1" write statistics on how long
-      cells spend in their circuit queues to disk every 24 hours.
-    - Entry nodes that set "EntryStatistics 1" write statistics on the
-      rough number and origins of connecting clients to disk every 24
-      hours.
-    - Relays that write any of the above statistics to disk and set
-      "ExtraInfoStatistics 1" include the past 24 hours of statistics in
-      their extra-info documents. Implements proposal 166.
-
-  o Minor features (GeoIP and statistics):
-    - Provide a log message stating which geoip file we're parsing
-      instead of just stating that we're parsing the geoip file.
-      Implements ticket 2432.
-    - Make sure every relay writes a state file at least every 12 hours.
-      Previously, a relay could go for weeks without writing its state
-      file, and on a crash could lose its bandwidth history, capacity
-      estimates, client country statistics, and so on. Addresses bug 3012.
-    - Relays report the number of bytes spent on answering directory
-      requests in extra-info descriptors similar to {read,write}-history.
-      Implements enhancement 1790.
-    - Report only the top 10 ports in exit-port stats in order not to
-      exceed the maximum extra-info descriptor length of 50 KB. Implements
-      task 2196.
-    - If writing the state file to disk fails, wait up to an hour before
-      retrying again, rather than trying again each second. Fixes bug
-      2346; bugfix on Tor 0.1.1.3-alpha.
-    - Delay geoip stats collection by bridges for 6 hours, not 2 hours,
-      when we switch from being a public relay to a bridge. Otherwise
-      there will still be clients that see the relay in their consensus,
-      and the stats will end up wrong. Bugfix on 0.2.1.15-rc; fixes
-      bug 932.
-    - Update to the August 2 2011 Maxmind GeoLite Country database.
-
-  o Minor features (clients):
-    - When expiring circuits, use microsecond timers rather than
-      one-second timers. This can avoid an unpleasant situation where a
-      circuit is launched near the end of one second and expired right
-      near the beginning of the next, and prevent fluctuations in circuit
-      timeout values.
-    - If we've configured EntryNodes and our network goes away and/or all
-      our entrynodes get marked down, optimistically retry them all when
-      a new socks application request appears. Fixes bug 1882.
-    - Always perform router selections using weighted relay bandwidth,
-      even if we don't need a high capacity circuit at the time. Non-fast
-      circuits now only differ from fast ones in that they can use relays
-      not marked with the Fast flag. This "feature" could turn out to
-      be a horrible bug; we should investigate more before it goes into
-      a stable release.
-    - When we run out of directory information such that we can't build
-      circuits, but then get enough that we can build circuits, log when
-      we actually construct a circuit, so the user has a better chance of
-      knowing what's going on. Fixes bug 1362.
-    - Log SSL state transitions at debug level during handshake, and
-      include SSL states in error messages. This may help debug future
-      SSL handshake issues.
-
-  o Minor features (directory authorities):
-    - When a router changes IP address or port, authorities now launch
-      a new reachability test for it. Implements ticket 1899.
-    - Directory authorities now reject relays running any versions of
-      Tor between 0.2.1.3-alpha and 0.2.1.18 inclusive; they have
-      known bugs that keep RELAY_EARLY cells from working on rendezvous
-      circuits. Followup to fix for bug 2081.
-    - Directory authorities now reject relays running any version of Tor
-      older than 0.2.0.26-rc. That version is the earliest that fetches
-      current directory information correctly. Fixes bug 2156.
-    - Directory authorities now do an immediate reachability check as soon
-      as they hear about a new relay. This change should slightly reduce
-      the time between setting up a relay and getting listed as running
-      in the consensus. It should also improve the time between setting
-      up a bridge and seeing use by bridge users.
-    - Directory authorities no longer launch a TLS connection to every
-      relay as they startup. Now that we have 2k+ descriptors cached,
-      the resulting network hiccup is becoming a burden. Besides,
-      authorities already avoid voting about Running for the first half
-      hour of their uptime.
-    - Directory authorities now log the source of a rejected POSTed v3
-      networkstatus vote, so we can track failures better.
-    - Backport code from 0.2.3.x that allows directory authorities to
-      clean their microdescriptor caches. Needed to resolve bug 2230.
-
-  o Minor features (hidden services):
-    - Use computed circuit-build timeouts to decide when to launch
-      parallel introduction circuits for hidden services. (Previously,
-      we would retry after 15 seconds.)
-    - Don't allow v0 hidden service authorities to act as clients.
-      Required by fix for bug 3000.
-    - Ignore SIGNAL NEWNYM commands on relay-only Tor instances. Required
-      by fix for bug 3000.
-    - Make hidden services work better in private Tor networks by not
-      requiring any uptime to join the hidden service descriptor
-      DHT. Implements ticket 2088.
-    - Log (at info level) when purging pieces of hidden-service-client
-      state because of SIGNAL NEWNYM.
-
-  o Minor features (controller interface):
-    - New "GETINFO net/listeners/(type)" controller command to return
-      a list of addresses and ports that are bound for listeners for a
-      given connection type. This is useful when the user has configured
-      "SocksPort auto" and the controller needs to know which port got
-      chosen. Resolves another part of ticket 3076.
-    - Have the controller interface give a more useful message than
-      "Internal Error" in response to failed GETINFO requests.
-    - Add a TIMEOUT_RATE keyword to the BUILDTIMEOUT_SET control port
-      event, to give information on the current rate of circuit timeouts
-      over our stored history.
-    - The 'EXTENDCIRCUIT' control port command can now be used with
-      a circ id of 0 and no path. This feature will cause Tor to build
-      a new 'fast' general purpose circuit using its own path selection
-      algorithms.
-    - Added a BUILDTIMEOUT_SET controller event to describe changes
-      to the circuit build timeout.
-    - New controller command "getinfo config-text". It returns the
-      contents that Tor would write if you send it a SAVECONF command,
-      so the controller can write the file to disk itself.
-
-  o Minor features (controller protocol):
-    - Add a new ControlSocketsGroupWritable configuration option: when
-      it is turned on, ControlSockets are group-writeable by the default
-      group of the current user. Patch by Jérémy Bobbio; implements
-      ticket 2972.
-    - Tor now refuses to create a ControlSocket in a directory that is
-      world-readable (or group-readable if ControlSocketsGroupWritable
-      is 0). This is necessary because some operating systems do not
-      enforce permissions on an AF_UNIX sockets. Permissions on the
-      directory holding the socket, however, seems to work everywhere.
-    - Warn when CookieAuthFileGroupReadable is set but CookieAuthFile is
-      not. This would lead to a cookie that is still not group readable.
-      Closes bug 1843. Suggested by katmagic.
-    - Future-proof the controller protocol a bit by ignoring keyword
-      arguments we do not recognize.
-
-  o Minor features (more useful logging):
-    - Revise most log messages that refer to nodes by nickname to
-      instead use the "$key=nickname at address" format. This should be
-      more useful, especially since nicknames are less and less likely
-      to be unique. Resolves ticket 3045.
-    - When an HTTPS proxy reports "403 Forbidden", we now explain
-      what it means rather than calling it an unexpected status code.
-      Closes bug 2503. Patch from Michael Yakubovich.
-    - Rate-limit a warning about failures to download v2 networkstatus
-      documents. Resolves part of bug 1352.
-    - Rate-limit the "your application is giving Tor only an IP address"
-      warning. Addresses bug 2000; bugfix on 0.0.8pre2.
-    - Rate-limit "Failed to hand off onionskin" warnings.
-    - When logging a rate-limited warning, we now mention how many messages
-      got suppressed since the last warning.
-    - Make the formerly ugly "2 unknown, 7 missing key, 0 good, 0 bad,
-      2 no signature, 4 required" messages about consensus signatures
-      easier to read, and make sure they get logged at the same severity
-      as the messages explaining which keys are which. Fixes bug 1290.
-    - Don't warn when we have a consensus that we can't verify because
-      of missing certificates, unless those certificates are ones
-      that we have been trying and failing to download. Fixes bug 1145.
-
-  o Minor features (log domains):
-    - Add documentation for configuring logging at different severities in
-      different log domains. We've had this feature since 0.2.1.1-alpha,
-      but for some reason it never made it into the manpage. Fixes
-      bug 2215.
-    - Make it simpler to specify "All log domains except for A and B".
-      Previously you needed to say "[*,~A,~B]". Now you can just say
-      "[~A,~B]".
-    - Add a "LogMessageDomains 1" option to include the domains of log
-      messages along with the messages. Without this, there's no way
-      to use log domains without reading the source or doing a lot
-      of guessing.
-    - Add a new "Handshake" log domain for activities that happen
-      during the TLS handshake.
-
-  o Minor features (build process):
-    - Make compilation with clang possible when using
-      "--enable-gcc-warnings" by removing two warning options that clang
-      hasn't implemented yet and by fixing a few warnings. Resolves
-      ticket 2696.
-    - Detect platforms that brokenly use a signed size_t, and refuse to
-      build there. Found and analyzed by doorss and rransom.
-    - Fix a bunch of compile warnings revealed by mingw with gcc 4.5.
-      Resolves bug 2314.
-    - Add support for statically linking zlib by specifying
-      "--enable-static-zlib", to go with our support for statically
-      linking openssl and libevent. Resolves bug 1358.
-    - Instead of adding the svn revision to the Tor version string, report
-      the git commit (when we're building from a git checkout).
-    - Rename the "log.h" header to "torlog.h" so as to conflict with fewer
-      system headers.
-    - New --digests command-line switch to output the digests of the
-      source files Tor was built with.
-    - Generate our manpage and HTML documentation using Asciidoc. This
-      change should make it easier to maintain the documentation, and
-      produce nicer HTML. The build process fails if asciidoc cannot
-      be found and building with asciidoc isn't disabled (via the
-      "--disable-asciidoc" argument to ./configure. Skipping the manpage
-      speeds up the build considerably.
-
-  o Minor features (options / torrc):
-    - Warn when the same option is provided more than once in a torrc
-      file, on the command line, or in a single SETCONF statement, and
-      the option is one that only accepts a single line. Closes bug 1384.
-    - Warn when the user configures two HiddenServiceDir lines that point
-      to the same directory. Bugfix on 0.0.6 (the version introducing
-      HiddenServiceDir); fixes bug 3289.
-    - Add new "perconnbwrate" and "perconnbwburst" consensus params to
-      do individual connection-level rate limiting of clients. The torrc
-      config options with the same names trump the consensus params, if
-      both are present. Replaces the old "bwconnrate" and "bwconnburst"
-      consensus params which were broken from 0.2.2.7-alpha through
-      0.2.2.14-alpha. Closes bug 1947.
-    - New config option "WarnUnsafeSocks 0" disables the warning that
-      occurs whenever Tor receives a socks handshake using a version of
-      the socks protocol that can only provide an IP address (rather
-      than a hostname). Setups that do DNS locally over Tor are fine,
-      and we shouldn't spam the logs in that case.
-    - New config option "CircuitStreamTimeout" to override our internal
-      timeout schedule for how many seconds until we detach a stream from
-      a circuit and try a new circuit. If your network is particularly
-      slow, you might want to set this to a number like 60.
-    - New options for SafeLogging to allow scrubbing only log messages
-      generated while acting as a relay. Specify "SafeLogging relay" if
-      you want to ensure that only messages known to originate from
-      client use of the Tor process will be logged unsafely.
-    - Time and memory units in the configuration file can now be set to
-      fractional units. For example, "2.5 GB" is now a valid value for
-      AccountingMax.
-    - Support line continuations in the torrc config file. If a line
-      ends with a single backslash character, the newline is ignored, and
-      the configuration value is treated as continuing on the next line.
-      Resolves bug 1929.
-
-  o Minor features (unit tests):
-    - Revise our unit tests to use the "tinytest" framework, so we
-      can run tests in their own processes, have smarter setup/teardown
-      code, and so on. The unit test code has moved to its own
-      subdirectory, and has been split into multiple modules.
-    - Add a unit test for cross-platform directory-listing code.
-    - Add some forgotten return value checks during unit tests. Found
-      by coverity.
-    - Use GetTempDir to find the proper temporary directory location on
-      Windows when generating temporary files for the unit tests. Patch
-      by Gisle Vanem.
-
-  o Minor features (misc):
-    - The "torify" script now uses torsocks where available.
-    - Make Libevent log messages get delivered to controllers later,
-      and not from inside the Libevent log handler. This prevents unsafe
-      reentrant Libevent calls while still letting the log messages
-      get through.
-    - Certain Tor clients (such as those behind check.torproject.org) may
-      want to fetch the consensus in an extra early manner. To enable this
-      a user may now set FetchDirInfoExtraEarly to 1. This also depends on
-      setting FetchDirInfoEarly to 1. Previous behavior will stay the same
-      as only certain clients who must have this information sooner should
-      set this option.
-    - Expand homedirs passed to tor-checkkey. This should silence a
-      coverity complaint about passing a user-supplied string into
-      open() without checking it.
-    - Make sure to disable DirPort if running as a bridge. DirPorts aren't
-      used on bridges, and it makes bridge scanning somewhat easier.
-    - Create the /var/run/tor directory on startup on OpenSUSE if it is
-      not already created. Patch from Andreas Stieger. Fixes bug 2573.
-
-  o Minor bugfixes (relays):
-    - When a relay decides that its DNS is too broken for it to serve
-      as an exit server, it advertised itself as a non-exit, but
-      continued to act as an exit. This could create accidental
-      partitioning opportunities for users. Instead, if a relay is
-      going to advertise reject *:* as its exit policy, it should
-      really act with exit policy "reject *:*". Fixes bug 2366.
-      Bugfix on Tor 0.1.2.5-alpha. Bugfix by user "postman" on trac.
-    - Publish a router descriptor even if generating an extra-info
-      descriptor fails. Previously we would not publish a router
-      descriptor without an extra-info descriptor; this can cause fast
-      exit relays collecting exit-port statistics to drop from the
-      consensus. Bugfix on 0.1.2.9-rc; fixes bug 2195.
-    - When we're trying to guess whether we know our IP address as
-      a relay, we would log various ways that we failed to guess
-      our address, but never log that we ended up guessing it
-      successfully. Now add a log line to help confused and anxious
-      relay operators. Bugfix on 0.1.2.1-alpha; fixes bug 1534.
-    - For bandwidth accounting, calculate our expected bandwidth rate
-      based on the time during which we were active and not in
-      soft-hibernation during the last interval. Previously, we were
-      also considering the time spent in soft-hibernation. If this
-      was a long time, we would wind up underestimating our bandwidth
-      by a lot, and skewing our wakeup time towards the start of the
-      accounting interval. Fixes bug 1789. Bugfix on 0.0.9pre5.
-    - Demote a confusing TLS warning that relay operators might get when
-      someone tries to talk to their ORPort. It is not the operator's
-      fault, nor can they do anything about it. Fixes bug 1364; bugfix
-      on 0.2.0.14-alpha.
-    - Change "Application request when we're believed to be offline."
-      notice to "Application request when we haven't used client
-      functionality lately.", to clarify that it's not an error. Bugfix
-      on 0.0.9.3; fixes bug 1222.
-
-  o Minor bugfixes (bridges):
-    - When a client starts or stops using bridges, never use a circuit
-      that was built before the configuration change. This behavior could
-      put at risk a user who uses bridges to ensure that her traffic
-      only goes to the chosen addresses. Bugfix on 0.2.0.3-alpha; fixes
-      bug 3200.
-    - Do not reset the bridge descriptor download status every time we
-      re-parse our configuration or get a configuration change. Fixes
-      bug 3019; bugfix on 0.2.0.3-alpha.
-    - Users couldn't configure a regular relay to be their bridge. It
-      didn't work because when Tor fetched the bridge descriptor, it found
-      that it already had it, and didn't realize that the purpose of the
-      descriptor had changed. Now we replace routers with a purpose other
-      than bridge with bridge descriptors when fetching them. Bugfix on
-      0.1.1.9-alpha. Fixes bug 1776.
-    - In the special case where you configure a public exit relay as your
-      bridge, Tor would be willing to use that exit relay as the last
-      hop in your circuit as well. Now we fail that circuit instead.
-      Bugfix on 0.2.0.12-alpha. Fixes bug 2403. Reported by "piebeer".
-
-  o Minor bugfixes (clients):
-    - We now ask the other side of a stream (the client or the exit)
-      for more data on that stream when the amount of queued data on
-      that stream dips low enough. Previously, we wouldn't ask the
-      other side for more data until either it sent us more data (which
-      it wasn't supposed to do if it had exhausted its window!) or we
-      had completely flushed all our queued data. This flow control fix
-      should improve throughput. Fixes bug 2756; bugfix on the earliest
-      released versions of Tor (svn commit r152).
-    - When a client finds that an origin circuit has run out of 16-bit
-      stream IDs, we now mark it as unusable for new streams. Previously,
-      we would try to close the entire circuit. Bugfix on 0.0.6.
-    - Make it explicit that we don't cannibalize one-hop circuits. This
-      happens in the wild, but doesn't turn out to be a problem because
-      we fortunately don't use those circuits. Many thanks to outofwords
-      for the initial analysis and to swissknife who confirmed that
-      two-hop circuits are actually created.
-    - Resolve an edge case in path weighting that could make us misweight
-      our relay selection. Fixes bug 1203; bugfix on 0.0.8rc1.
-    - Make the DNSPort option work with libevent 2.x. Don't alter the
-      behavior for libevent 1.x. Fixes bug 1143. Found by SwissTorExit.
-
-  o Minor bugfixes (directory authorities):
-    - Make directory authorities more accurate at recording when
-      relays that have failed several reachability tests became
-      unreachable, so we can provide more accuracy at assigning Stable,
-      Guard, HSDir, etc flags. Bugfix on 0.2.0.6-alpha. Resolves bug 2716.
-    - Directory authorities are now more robust to hops back in time
-      when calculating router stability. Previously, if a run of uptime
-      or downtime appeared to be negative, the calculation could give
-      incorrect results. Bugfix on 0.2.0.6-alpha; noticed when fixing
-      bug 1035.
-    - Directory authorities will now attempt to download consensuses
-      if their own efforts to make a live consensus have failed. This
-      change means authorities that restart will fetch a valid
-      consensus, and it means authorities that didn't agree with the
-      current consensus will still fetch and serve it if it has enough
-      signatures. Bugfix on 0.2.0.9-alpha; fixes bug 1300.
-    - Never vote for a server as "Running" if we have a descriptor for
-      it claiming to be hibernating, and that descriptor was published
-      more recently than our last contact with the server. Bugfix on
-      0.2.0.3-alpha; fixes bug 911.
-    - Directory authorities no longer change their opinion of, or vote on,
-      whether a router is Running, unless they have themselves been
-      online long enough to have some idea. Bugfix on 0.2.0.6-alpha.
-      Fixes bug 1023.
-
-  o Minor bugfixes (hidden services):
-    - Log malformed requests for rendezvous descriptors as protocol
-      warnings, not warnings. Also, use a more informative log message
-      in case someone sees it at log level warning without prior
-      info-level messages. Fixes bug 2748; bugfix on 0.2.0.10-alpha.
-    - Accept hidden service descriptors if we think we might be a hidden
-      service directory, regardless of what our consensus says. This
-      helps robustness, since clients and hidden services can sometimes
-      have a more up-to-date view of the network consensus than we do,
-      and if they think that the directory authorities list us a HSDir,
-      we might actually be one. Related to bug 2732; bugfix on
-      0.2.0.10-alpha.
-    - Correct the warning displayed when a rendezvous descriptor exceeds
-      the maximum size. Fixes bug 2750; bugfix on 0.2.1.5-alpha. Found by
-      John Brooks.
-    - Clients and hidden services now use HSDir-flagged relays for hidden
-      service descriptor downloads and uploads even if the relays have no
-      DirPort set and the client has disabled TunnelDirConns. This will
-      eventually allow us to give the HSDir flag to relays with no
-      DirPort. Fixes bug 2722; bugfix on 0.2.1.6-alpha.
-    - Only limit the lengths of single HS descriptors, even when multiple
-      HS descriptors are published to an HSDir relay in a single POST
-      operation. Fixes bug 2948; bugfix on 0.2.1.5-alpha. Found by hsdir.
-
-  o Minor bugfixes (controllers):
-    - Allow GETINFO fingerprint to return a fingerprint even when
-      we have not yet built a router descriptor. Fixes bug 3577;
-      bugfix on 0.2.0.1-alpha.
-    - Send a SUCCEEDED stream event to the controller when a reverse
-      resolve succeeded. Fixes bug 3536; bugfix on 0.0.8pre1. Issue
-      discovered by katmagic.
-    - Remove a trailing asterisk from "exit-policy/default" in the
-      output of the control port command "GETINFO info/names". Bugfix
-      on 0.1.2.5-alpha.
-    - Make the SIGNAL DUMP controller command work on FreeBSD. Fixes bug
-      2917. Bugfix on 0.1.1.1-alpha.
-    - When we restart our relay, we might get a successful connection
-      from the outside before we've started our reachability tests,
-      triggering a warning: "ORPort found reachable, but I have no
-      routerinfo yet. Failing to inform controller of success." This
-      bug was harmless unless Tor is running under a controller
-      like Vidalia, in which case the controller would never get a
-      REACHABILITY_SUCCEEDED status event. Bugfix on 0.1.2.6-alpha;
-      fixes bug 1172.
-    - When a controller changes TrackHostExits, remove mappings for
-      hosts that should no longer have their exits tracked. Bugfix on
-      0.1.0.1-rc.
-    - When a controller changes VirtualAddrNetwork, remove any mappings
-      for hosts that were automapped to the old network. Bugfix on
-      0.1.1.19-rc.
-    - When a controller changes one of the AutomapHosts* options, remove
-      any mappings for hosts that should no longer be automapped. Bugfix
-      on 0.2.0.1-alpha.
-    - Fix an off-by-one error in calculating some controller command
-      argument lengths. Fortunately, this mistake is harmless since
-      the controller code does redundant NUL termination too. Found by
-      boboper. Bugfix on 0.1.1.1-alpha.
-    - Fix a bug in the controller interface where "GETINFO ns/asdaskljkl"
-      would return "551 Internal error" rather than "552 Unrecognized key
-      ns/asdaskljkl". Bugfix on 0.1.2.3-alpha.
-    - Don't spam the controller with events when we have no file
-      descriptors available. Bugfix on 0.2.1.5-alpha. (Rate-limiting
-      for log messages was already solved from bug 748.)
-    - Emit a GUARD DROPPED controller event for a case we missed.
-    - Ensure DNS requests launched by "RESOLVE" commands from the
-      controller respect the __LeaveStreamsUnattached setconf options. The
-      same goes for requests launched via DNSPort or transparent
-      proxying. Bugfix on 0.2.0.1-alpha; fixes bug 1525.
-
-  o Minor bugfixes (config options):
-    - Tor used to limit HttpProxyAuthenticator values to 48 characters.
-      Change the limit to 512 characters by removing base64 newlines.
-      Fixes bug 2752. Fix by Michael Yakubovich.
-    - Complain if PublishServerDescriptor is given multiple arguments that
-      include 0 or 1. This configuration will be rejected in the future.
-      Bugfix on 0.2.0.1-alpha; closes bug 1107.
-    - Disallow BridgeRelay 1 and ORPort 0 at once in the configuration.
-      Bugfix on 0.2.0.13-alpha; closes bug 928.
-
-  o Minor bugfixes (log subsystem fixes):
-    - When unable to format an address as a string, report its value
-      as "???" rather than reusing the last formatted address. Bugfix
-      on 0.2.1.5-alpha.
-    - Be more consistent in our treatment of file system paths. "~" should
-      get expanded to the user's home directory in the Log config option.
-      Fixes bug 2971; bugfix on 0.2.0.1-alpha, which introduced the
-      feature for the -f and --DataDirectory options.
-
-  o Minor bugfixes (memory management):
-    - Don't stack-allocate the list of supplementary GIDs when we're
-      about to log them. Stack-allocating NGROUPS_MAX gid_t elements
-      could take up to 256K, which is way too much stack. Found by
-      Coverity; CID #450. Bugfix on 0.2.1.7-alpha.
-    - Save a couple bytes in memory allocation every time we escape
-      certain characters in a string. Patch from Florian Zumbiehl.
-
-  o Minor bugfixes (protocol correctness):
-    - When checking for 1024-bit keys, check for 1024 bits, not 128
-      bytes. This allows Tor to correctly discard keys of length 1017
-      through 1023. Bugfix on 0.0.9pre5.
-    - Require that introduction point keys and onion handshake keys
-      have a public exponent of 65537. Starts to fix bug 3207; bugfix
-      on 0.2.0.10-alpha.
-    - Handle SOCKS messages longer than 128 bytes long correctly, rather
-      than waiting forever for them to finish. Fixes bug 2330; bugfix
-      on 0.2.0.16-alpha. Found by doorss.
-    - Never relay a cell for a circuit we have already destroyed.
-      Between marking a circuit as closeable and finally closing it,
-      it may have been possible for a few queued cells to get relayed,
-      even though they would have been immediately dropped by the next
-      OR in the circuit. Fixes bug 1184; bugfix on 0.2.0.1-alpha.
-    - Never queue a cell for a circuit that's already been marked
-      for close.
-    - Fix a spec conformance issue: the network-status-version token
-      must be the first token in a v3 consensus or vote. Discovered by
-      "parakeep". Bugfix on 0.2.0.3-alpha.
-    - A networkstatus vote must contain exactly one signature. Spec
-      conformance issue. Bugfix on 0.2.0.3-alpha.
-    - When asked about a DNS record type we don't support via a
-      client DNSPort, reply with NOTIMPL rather than an empty
-      reply. Patch by intrigeri. Fixes bug 3369; bugfix on 2.0.1-alpha.
-    - Make more fields in the controller protocol case-insensitive, since
-      control-spec.txt said they were.
-
-  o Minor bugfixes (log messages):
-    - Fix a log message that said "bits" while displaying a value in
-      bytes. Found by wanoskarnet. Fixes bug 3318; bugfix on
-      0.2.0.1-alpha.
-    - Downgrade "no current certificates known for authority" message from
-      Notice to Info. Fixes bug 2899; bugfix on 0.2.0.10-alpha.
-    - Correctly describe errors that occur when generating a TLS object.
-      Previously we would attribute them to a failure while generating a
-      TLS context. Patch by Robert Ransom. Bugfix on 0.1.0.4-rc; fixes
-      bug 1994.
-    - Fix an instance where a Tor directory mirror might accidentally
-      log the IP address of a misbehaving Tor client. Bugfix on
-      0.1.0.1-rc.
-    - Stop logging at severity 'warn' when some other Tor client tries
-      to establish a circuit with us using weak DH keys. It's a protocol
-      violation, but that doesn't mean ordinary users need to hear about
-      it. Fixes the bug part of bug 1114. Bugfix on 0.1.0.13.
-    - If your relay can't keep up with the number of incoming create
-      cells, it would log one warning per failure into your logs. Limit
-      warnings to 1 per minute. Bugfix on 0.0.2pre10; fixes bug 1042.
-
-  o Minor bugfixes (build fixes):
-    - Fix warnings from GCC 4.6's "-Wunused-but-set-variable" option.
-    - When warning about missing zlib development packages during compile,
-      give the correct package names. Bugfix on 0.2.0.1-alpha.
-    - Fix warnings that newer versions of autoconf produce during
-      ./autogen.sh. These warnings appear to be harmless in our case,
-      but they were extremely verbose. Fixes bug 2020.
-    - Squash a compile warning on OpenBSD. Reported by Tas; fixes
-      bug 1848.
-
-  o Minor bugfixes (portability):
-    - Write several files in text mode, on OSes that distinguish text
-      mode from binary mode (namely, Windows). These files are:
-      'buffer-stats', 'dirreq-stats', and 'entry-stats' on relays
-      that collect those statistics; 'client_keys' and 'hostname' for
-      hidden services that use authentication; and (in the tor-gencert
-      utility) newly generated identity and signing keys. Previously,
-      we wouldn't specify text mode or binary mode, leading to an
-      assertion failure. Fixes bug 3607. Bugfix on 0.2.1.1-alpha (when
-      the DirRecordUsageByCountry option which would have triggered
-      the assertion failure was added), although this assertion failure
-      would have occurred in tor-gencert on Windows in 0.2.0.1-alpha.
-    - Selectively disable deprecation warnings on OS X because Lion
-      started deprecating the shipped copy of openssl. Fixes bug 3643.
-    - Use a wide type to hold sockets when built for 64-bit Windows.
-      Fixes bug 3270.
-    - Fix an issue that prevented static linking of libevent on
-      some platforms (notably Linux). Fixes bug 2698; bugfix on 0.2.1.23,
-      where we introduced the "--with-static-libevent" configure option.
-    - Fix a bug with our locking implementation on Windows that couldn't
-      correctly detect when a file was already locked. Fixes bug 2504,
-      bugfix on 0.2.1.6-alpha.
-    - Build correctly on OSX with zlib 1.2.4 and higher with all warnings
-      enabled.
-    - Fix IPv6-related connect() failures on some platforms (BSD, OS X).
-      Bugfix on 0.2.0.3-alpha; fixes first part of bug 2660. Patch by
-      "piebeer".
-
-  o Minor bugfixes (code correctness):
-    - Always NUL-terminate the sun_path field of a sockaddr_un before
-      passing it to the kernel. (Not a security issue: kernels are
-      smart enough to reject bad sockaddr_uns.) Found by Coverity;
-      CID #428. Bugfix on Tor 0.2.0.3-alpha.
-    - Make connection_printf_to_buf()'s behavior sane. Its callers
-      expect it to emit a CRLF iff the format string ends with CRLF;
-      it actually emitted a CRLF iff (a) the format string ended with
-      CRLF or (b) the resulting string was over 1023 characters long or
-      (c) the format string did not end with CRLF *and* the resulting
-      string was 1021 characters long or longer. Bugfix on 0.1.1.9-alpha;
-      fixes part of bug 3407.
-    - Make send_control_event_impl()'s behavior sane. Its callers
-      expect it to always emit a CRLF at the end of the string; it
-      might have emitted extra control characters as well. Bugfix on
-      0.1.1.9-alpha; fixes another part of bug 3407.
-    - Make crypto_rand_int() check the value of its input correctly.
-      Previously, it accepted values up to UINT_MAX, but could return a
-      negative number if given a value above INT_MAX+1. Found by George
-      Kadianakis. Fixes bug 3306; bugfix on 0.2.2pre14.
-    - Fix a potential null-pointer dereference while computing a
-      consensus. Bugfix on 0.2.0.3-alpha, found with the help of
-      clang's analyzer.
-    - If we fail to compute the identity digest of a v3 legacy keypair,
-      warn, and don't use a buffer-full of junk instead. Bugfix on
-      0.2.1.1-alpha; fixes bug 3106.
-    - Resolve an untriggerable issue in smartlist_string_num_isin(),
-      where if the function had ever in the future been used to check
-      for the presence of a too-large number, it would have given an
-      incorrect result. (Fortunately, we only used it for 16-bit
-      values.) Fixes bug 3175; bugfix on 0.1.0.1-rc.
-    - Be more careful about reporting the correct error from a failed
-      connect() system call. Under some circumstances, it was possible to
-      look at an incorrect value for errno when sending the end reason.
-      Bugfix on 0.1.0.1-rc.
-    - Correctly handle an "impossible" overflow cases in connection byte
-      counting, where we write or read more than 4GB on an edge connection
-      in a single second. Bugfix on 0.1.2.8-beta.
-    - Avoid a double mark-for-free warning when failing to attach a
-      transparent proxy connection. Bugfix on 0.1.2.1-alpha. Fixes
-      bug 2279.
-    - Correctly detect failure to allocate an OpenSSL BIO. Fixes bug 2378;
-      found by "cypherpunks". This bug was introduced before the first
-      Tor release, in svn commit r110.
-    - Fix a bug in bandwidth history state parsing that could have been
-      triggered if a future version of Tor ever changed the timing
-      granularity at which bandwidth history is measured. Bugfix on
-      Tor 0.1.1.11-alpha.
-    - Add assertions to check for overflow in arguments to
-      base32_encode() and base32_decode(); fix a signed-unsigned
-      comparison there too. These bugs are not actually reachable in Tor,
-      but it's good to prevent future errors too. Found by doorss.
-    - Avoid a bogus overlapped memcpy in tor_addr_copy(). Reported by
-      "memcpyfail".
-    - Set target port in get_interface_address6() correctly. Bugfix
-      on 0.1.1.4-alpha and 0.2.0.3-alpha; fixes second part of bug 2660.
-    - Fix an impossible-to-actually-trigger buffer overflow in relay
-      descriptor generation. Bugfix on 0.1.0.15.
-    - Fix numerous small code-flaws found by Coverity Scan Rung 3.
-
-  o Minor bugfixes (code improvements):
-    - After we free an internal connection structure, overwrite it
-      with a different memory value than we use for overwriting a freed
-      internal circuit structure. Should help with debugging. Suggested
-      by bug 1055.
-    - If OpenSSL fails to make a duplicate of a private or public key, log
-      an error message and try to exit cleanly. May help with debugging
-      if bug 1209 ever remanifests.
-    - Some options used different conventions for uppercasing of acronyms
-      when comparing manpage and source. Fix those in favor of the
-      manpage, as it makes sense to capitalize acronyms.
-    - Take a first step towards making or.h smaller by splitting out
-      function definitions for all source files in src/or/. Leave
-      structures and defines in or.h for now.
-    - Remove a few dead assignments during router parsing. Found by
-      coverity.
-    - Don't use 1-bit wide signed bit fields. Found by coverity.
-    - Avoid signed/unsigned comparisons by making SIZE_T_CEILING unsigned.
-      None of the cases where we did this before were wrong, but by making
-      this change we avoid warnings. Fixes bug 2475; bugfix on 0.2.1.28.
-    - The memarea code now uses a sentinel value at the end of each area
-      to make sure nothing writes beyond the end of an area. This might
-      help debug some conceivable causes of bug 930.
-    - Always treat failure to allocate an RSA key as an unrecoverable
-      allocation error.
-    - Add some more defensive programming for architectures that can't
-      handle unaligned integer accesses. We don't know of any actual bugs
-      right now, but that's the best time to fix them. Fixes bug 1943.
-
-  o Minor bugfixes (misc):
-    - Fix a rare bug in rend_fn unit tests: we would fail a test when
-      a randomly generated port is 0. Diagnosed by Matt Edman. Bugfix
-      on 0.2.0.10-alpha; fixes bug 1808.
-    - Where available, use Libevent 2.0's periodic timers so that our
-      once-per-second cleanup code gets called even more closely to
-      once per second than it would otherwise. Fixes bug 943.
-    - Ignore OutboundBindAddress when connecting to localhost.
-      Connections to localhost need to come _from_ localhost, or else
-      local servers (like DNS and outgoing HTTP/SOCKS proxies) will often
-      refuse to listen.
-    - Update our OpenSSL 0.9.8l fix so that it works with OpenSSL 0.9.8m
-      too.
-    - If any of the v3 certs we download are unparseable, we should
-      actually notice the failure so we don't retry indefinitely. Bugfix
-      on 0.2.0.x; reported by "rotator".
-    - When Tor fails to parse a descriptor of any kind, dump it to disk.
-      Might help diagnosing bug 1051.
-    - Make our 'torify' script more portable; if we have only one of
-      'torsocks' or 'tsocks' installed, don't complain to the user;
-      and explain our warning about tsocks better.
-    - Fix some urls in the exit notice file and make it XHTML1.1 strict
-      compliant. Based on a patch from Christian Kujau.
-
-  o Documentation changes:
-    - Modernize the doxygen configuration file slightly. Fixes bug 2707.
-    - Resolve all doxygen warnings except those for missing documentation.
-      Fixes bug 2705.
-    - Add doxygen documentation for more functions, fields, and types.
-    - Convert the HACKING file to asciidoc, and add a few new sections
-      to it, explaining how we use Git, how we make changelogs, and
-      what should go in a patch.
-    - Document the default socks host and port (127.0.0.1:9050) for
-      tor-resolve.
-    - Removed some unnecessary files from the source distribution. The
-      AUTHORS file has now been merged into the people page on the
-      website. The roadmaps and design doc can now be found in the
-      projects directory in svn.
-
-  o Deprecated and removed features (config):
-    - Remove the torrc.complete file. It hasn't been kept up to date
-      and users will have better luck checking out the manpage.
-    - Remove the HSAuthorityRecordStats option that version 0 hidden
-      service authorities could use to track statistics of overall v0
-      hidden service usage.
-    - Remove the obsolete "NoPublish" option; it has been flagged
-      as obsolete and has produced a warning since 0.1.1.18-rc.
-    - Caches no longer download and serve v2 networkstatus documents
-      unless FetchV2Networkstatus flag is set: these documents haven't
-      haven't been used by clients or relays since 0.2.0.x. Resolves
-      bug 3022.
-
-  o Deprecated and removed features (controller):
-    - The controller no longer accepts the old obsolete "addr-mappings/"
-      or "unregistered-servers-" GETINFO values.
-    - The EXTENDED_EVENTS and VERBOSE_NAMES controller features are now
-      always on; using them is necessary for correct forward-compatible
-      controllers.
-
-  o Deprecated and removed features (misc):
-    - Hidden services no longer publish version 0 descriptors, and clients
-      do not request or use version 0 descriptors. However, the old hidden
-      service authorities still accept and serve version 0 descriptors
-      when contacted by older hidden services/clients.
-    - Remove undocumented option "-F" from tor-resolve: it hasn't done
-      anything since 0.2.1.16-rc.
-    - Remove everything related to building the expert bundle for OS X.
-      It has confused many users, doesn't work right on OS X 10.6,
-      and is hard to get rid of once installed. Resolves bug 1274.
-    - Remove support for .noconnect style addresses. Nobody was using
-      them, and they provided another avenue for detecting Tor users
-      via application-level web tricks.
-    - When we fixed bug 1038 we had to put in a restriction not to send
-      RELAY_EARLY cells on rend circuits. This was necessary as long
-      as relays using Tor 0.2.1.3-alpha through 0.2.1.18-alpha were
-      active. Now remove this obsolete check. Resolves bug 2081.
-    - Remove workaround code to handle directory responses from servers
-      that had bug 539 (they would send HTTP status 503 responses _and_
-      send a body too). Since only server versions before
-      0.2.0.16-alpha/0.1.2.19 were affected, there is no longer reason to
-      keep the workaround in place.
-    - Remove the old 'fuzzy time' logic. It was supposed to be used for
-      handling calculations where we have a known amount of clock skew and
-      an allowed amount of unknown skew. But we only used it in three
-      places, and we never adjusted the known/unknown skew values. This is
-      still something we might want to do someday, but if we do, we'll
-      want to do it differently.
-    - Remove the "--enable-iphone" option to ./configure. According to
-      reports from Marco Bonetti, Tor builds fine without any special
-      tweaking on recent iPhone SDK versions.
-
-
-Changes in version 0.2.1.30 - 2011-02-23
-  Tor 0.2.1.30 fixes a variety of less critical bugs. The main other
-  change is a slight tweak to Tor's TLS handshake that makes relays
-  and bridges that run this new version reachable from Iran again.
-  We don't expect this tweak will win the arms race long-term, but it
-  buys us time until we roll out a better solution.
-
-  o Major bugfixes:
-    - Stop sending a CLOCK_SKEW controller status event whenever
-      we fetch directory information from a relay that has a wrong clock.
-      Instead, only inform the controller when it's a trusted authority
-      that claims our clock is wrong. Bugfix on 0.1.2.6-alpha; fixes
-      the rest of bug 1074.
-    - Fix a bounds-checking error that could allow an attacker to
-      remotely crash a directory authority. Bugfix on 0.2.1.5-alpha.
-      Found by "piebeer".
-    - If relays set RelayBandwidthBurst but not RelayBandwidthRate,
-      Tor would ignore their RelayBandwidthBurst setting,
-      potentially using more bandwidth than expected. Bugfix on
-      0.2.0.1-alpha. Reported by Paul Wouters. Fixes bug 2470.
-    - Ignore and warn if the user mistakenly sets "PublishServerDescriptor
-      hidserv" in her torrc. The 'hidserv' argument never controlled
-      publication of hidden service descriptors. Bugfix on 0.2.0.1-alpha.
-
-  o Minor features:
-    - Adjust our TLS Diffie-Hellman parameters to match those used by
-      Apache's mod_ssl.
-    - Update to the February 1 2011 Maxmind GeoLite Country database.
-
-  o Minor bugfixes:
-    - Check for and reject overly long directory certificates and
-      directory tokens before they have a chance to hit any assertions.
-      Bugfix on 0.2.1.28. Found by "doorss".
-    - Bring the logic that gathers routerinfos and assesses the
-      acceptability of circuits into line. This prevents a Tor OP from
-      getting locked in a cycle of choosing its local OR as an exit for a
-      path (due to a .exit request) and then rejecting the circuit because
-      its OR is not listed yet. It also prevents Tor clients from using an
-      OR running in the same instance as an exit (due to a .exit request)
-      if the OR does not meet the same requirements expected of an OR
-      running elsewhere. Fixes bug 1859; bugfix on 0.1.0.1-rc.
-
-  o Packaging changes:
-    - Stop shipping the Tor specs files and development proposal documents
-      in the tarball. They are now in a separate git repository at
-      git://git.torproject.org/torspec.git
-    - Do not include Git version tags as though they are SVN tags when
-      generating a tarball from inside a repository that has switched
-      between branches. Bugfix on 0.2.1.15-rc; fixes bug 2402.
-
-
-Changes in version 0.2.1.29 - 2011-01-15
-  Tor 0.2.1.29 continues our recent code security audit work. The main
-  fix resolves a remote heap overflow vulnerability that can allow remote
-  code execution. Other fixes address a variety of assert and crash bugs,
-  most of which we think are hard to exploit remotely.
-
-  o Major bugfixes (security):
-    - Fix a heap overflow bug where an adversary could cause heap
-      corruption. This bug probably allows remote code execution
-      attacks. Reported by "debuger". Fixes CVE-2011-0427. Bugfix on
-      0.1.2.10-rc.
-    - Prevent a denial-of-service attack by disallowing any
-      zlib-compressed data whose compression factor is implausibly
-      high. Fixes part of bug 2324; reported by "doorss".
-    - Zero out a few more keys in memory before freeing them. Fixes
-      bug 2384 and part of bug 2385. These key instances found by
-      "cypherpunks", based on Andrew Case's report about being able
-      to find sensitive data in Tor's memory space if you have enough
-      permissions. Bugfix on 0.0.2pre9.
-
-  o Major bugfixes (crashes):
-    - Prevent calls to Libevent from inside Libevent log handlers.
-      This had potential to cause a nasty set of crashes, especially
-      if running Libevent with debug logging enabled, and running
-      Tor with a controller watching for low-severity log messages.
-      Bugfix on 0.1.0.2-rc. Fixes bug 2190.
-    - Add a check for SIZE_T_MAX to tor_realloc() to try to avoid
-      underflow errors there too. Fixes the other part of bug 2324.
-    - Fix a bug where we would assert if we ever had a
-      cached-descriptors.new file (or another file read directly into
-      memory) of exactly SIZE_T_CEILING bytes. Fixes bug 2326; bugfix
-      on 0.2.1.25. Found by doorss.
-    - Fix some potential asserts and parsing issues with grossly
-      malformed router caches. Fixes bug 2352; bugfix on Tor 0.2.1.27.
-      Found by doorss.
-
-  o Minor bugfixes (other):
-    - Fix a bug with handling misformed replies to reverse DNS lookup
-      requests in DNSPort. Bugfix on Tor 0.2.0.1-alpha. Related to a
-      bug reported by doorss.
-    - Fix compilation on mingw when a pthreads compatibility library
-      has been installed. (We don't want to use it, so we shouldn't
-      be including pthread.h.) Fixes bug 2313; bugfix on 0.1.0.1-rc.
-    - Fix a bug where we would declare that we had run out of virtual
-      addresses when the address space was only half-exhausted. Bugfix
-      on 0.1.2.1-alpha.
-    - Correctly handle the case where AutomapHostsOnResolve is set but
-      no virtual addresses are available. Fixes bug 2328; bugfix on
-      0.1.2.1-alpha. Bug found by doorss.
-    - Correctly handle wrapping around when we run out of virtual
-      address space. Found by cypherpunks; bugfix on 0.2.0.5-alpha.
-
-  o Minor features:
-    - Update to the January 1 2011 Maxmind GeoLite Country database.
-    - Introduce output size checks on all of our decryption functions.
-
-  o Build changes:
-    - Tor does not build packages correctly with Automake 1.6 and earlier;
-      added a check to Makefile.am to make sure that we're building with
-      Automake 1.7 or later.
-    - The 0.2.1.28 tarball was missing src/common/OpenBSD_malloc_Linux.c
-      because we built it with a too-old version of automake. Thus that
-      release broke ./configure --enable-openbsd-malloc, which is popular
-      among really fast exit relays on Linux.
-
-
-Changes in version 0.2.1.28 - 2010-12-17
-  Tor 0.2.1.28 does some code cleanup to reduce the risk of remotely
-  exploitable bugs. We also took this opportunity to change the IP address
-  for one of our directory authorities, and to update the geoip database
-  we ship.
-
-  o Major bugfixes:
-    - Fix a remotely exploitable bug that could be used to crash instances
-      of Tor remotely by overflowing on the heap. Remote-code execution
-      hasn't been confirmed, but can't be ruled out. Everyone should
-      upgrade. Bugfix on the 0.1.1 series and later.
-
-  o Directory authority changes:
-    - Change IP address and ports for gabelmoo (v3 directory authority).
-
-  o Minor features:
-    - Update to the December 1 2010 Maxmind GeoLite Country database.
-
-
-Changes in version 0.2.1.27 - 2010-11-23
-  Yet another OpenSSL security patch broke its compatibility with Tor:
-  Tor 0.2.1.27 makes relays work with openssl 0.9.8p and 1.0.0.b. We
-  also took this opportunity to fix several crash bugs, integrate a new
-  directory authority, and update the bundled GeoIP database.
-
-  o Major bugfixes:
-    - Resolve an incompatibility with OpenSSL 0.9.8p and OpenSSL 1.0.0b:
-      No longer set the tlsext_host_name extension on server SSL objects;
-      but continue to set it on client SSL objects. Our goal in setting
-      it was to imitate a browser, not a vhosting server. Fixes bug 2204;
-      bugfix on 0.2.1.1-alpha.
-    - Do not log messages to the controller while shrinking buffer
-      freelists. Doing so would sometimes make the controller connection
-      try to allocate a buffer chunk, which would mess up the internals
-      of the freelist and cause an assertion failure. Fixes bug 1125;
-      fixed by Robert Ransom. Bugfix on 0.2.0.16-alpha.
-    - Learn our external IP address when we're a relay or bridge, even if
-      we set PublishServerDescriptor to 0. Bugfix on 0.2.0.3-alpha,
-      where we introduced bridge relays that don't need to publish to
-      be useful. Fixes bug 2050.
-    - Do even more to reject (and not just ignore) annotations on
-      router descriptors received anywhere but from the cache. Previously
-      we would ignore such annotations at first, but cache them to disk
-      anyway. Bugfix on 0.2.0.8-alpha. Found by piebeer.
-    - When you're using bridges and your network goes away and your
-      bridges get marked as down, recover when you attempt a new socks
-      connection (if the network is back), rather than waiting up to an
-      hour to try fetching new descriptors for your bridges. Bugfix on
-      0.2.0.3-alpha; fixes bug 1981.
-
-  o Major features:
-    - Move to the November 2010 Maxmind GeoLite country db (rather
-      than the June 2009 ip-to-country GeoIP db) for our statistics that
-      count how many users relays are seeing from each country. Now we'll
-      have more accurate data, especially for many African countries.
-
-  o New directory authorities:
-    - Set up maatuska (run by Linus Nordberg) as the eighth v3 directory
-      authority.
-
-  o Minor bugfixes:
-    - Fix an assertion failure that could occur in directory caches or
-      bridge users when using a very short voting interval on a testing
-      network. Diagnosed by Robert Hogan. Fixes bug 1141; bugfix on
-      0.2.0.8-alpha.
-    - Enforce multiplicity rules when parsing annotations. Bugfix on
-      0.2.0.8-alpha. Found by piebeer.
-    - Allow handshaking OR connections to take a full KeepalivePeriod
-      seconds to handshake. Previously, we would close them after
-      IDLE_OR_CONN_TIMEOUT (180) seconds, the same timeout as if they
-      were open. Bugfix on 0.2.1.26; fixes bug 1840. Thanks to mingw-san
-      for analysis help.
-    - When building with --enable-gcc-warnings on OpenBSD, disable
-      warnings in system headers. This makes --enable-gcc-warnings
-      pass on OpenBSD 4.8.
-
-  o Minor features:
-    - Exit nodes didn't recognize EHOSTUNREACH as a plausible error code,
-      and so sent back END_STREAM_REASON_MISC. Clients now recognize a new
-      stream ending reason for this case: END_STREAM_REASON_NOROUTE.
-      Servers can start sending this code when enough clients recognize
-      it. Bugfix on 0.1.0.1-rc; fixes part of bug 1793.
-    - Build correctly on mingw with more recent versions of OpenSSL 0.9.8.
-      Patch from mingw-san.
-
-  o Removed files:
-    - Remove the old debian/ directory from the main Tor distribution.
-      The official Tor-for-debian git repository lives at the URL
-      https://git.torproject.org/debian/tor.git
-    - Stop shipping the old doc/website/ directory in the tarball. We
-      changed the website format in late 2010, and what we shipped in
-      0.2.1.26 really wasn't that useful anyway.
-
-
-Changes in version 0.2.1.26 - 2010-05-02
-  Tor 0.2.1.26 addresses the recent connection and memory overload
-  problems we've been seeing on relays, especially relays with their
-  DirPort open. If your relay has been crashing, or you turned it off
-  because it used too many resources, give this release a try.
-
-  This release also fixes yet another instance of broken OpenSSL libraries
-  that was causing some relays to drop out of the consensus.
-
-  o Major bugfixes:
-    - Teach relays to defend themselves from connection overload. Relays
-      now close idle circuits early if it looks like they were intended
-      for directory fetches. Relays are also more aggressive about closing
-      TLS connections that have no circuits on them. Such circuits are
-      unlikely to be re-used, and tens of thousands of them were piling
-      up at the fast relays, causing the relays to run out of sockets
-      and memory. Bugfix on 0.2.0.22-rc (where clients started tunneling
-      their directory fetches over TLS).
-    - Fix SSL renegotiation behavior on OpenSSL versions like on Centos
-      that claim to be earlier than 0.9.8m, but which have in reality
-      backported huge swaths of 0.9.8m or 0.9.8n renegotiation
-      behavior. Possible fix for some cases of bug 1346.
-    - Directory mirrors were fetching relay descriptors only from v2
-      directory authorities, rather than v3 authorities like they should.
-      Only 2 v2 authorities remain (compared to 7 v3 authorities), leading
-      to a serious bottleneck. Bugfix on 0.2.0.9-alpha. Fixes bug 1324.
-
-  o Minor bugfixes:
-    - Finally get rid of the deprecated and now harmful notion of "clique
-      mode", where directory authorities maintain TLS connections to
-      every other relay.
-
-  o Testsuite fixes:
-    - In the util/threads test, no longer free the test_mutex before all
-      worker threads have finished. Bugfix on 0.2.1.6-alpha.
-    - The master thread could starve the worker threads quite badly on
-      certain systems, causing them to run only partially in the allowed
-      window. This resulted in test failures. Now the master thread sleeps
-      occasionally for a few microseconds while the two worker-threads
-      compete for the mutex. Bugfix on 0.2.0.1-alpha.
-
-
-Changes in version 0.2.1.25 - 2010-03-16
-  Tor 0.2.1.25 fixes a regression introduced in 0.2.1.23 that could
-  prevent relays from guessing their IP address correctly. It also fixes
-  several minor potential security bugs.
-
-  o Major bugfixes:
-    - Fix a regression from our patch for bug 1244 that caused relays
-      to guess their IP address incorrectly if they didn't set Address
-      in their torrc and/or their address fails to resolve. Bugfix on
-      0.2.1.23; fixes bug 1269.
-    - When freeing a session key, zero it out completely. We only zeroed
-      the first ptrsize bytes. Bugfix on 0.0.2pre8. Discovered and
-      patched by ekir. Fixes bug 1254.
-
-  o Minor bugfixes:
-    - Fix a dereference-then-NULL-check sequence when publishing
-      descriptors. Bugfix on 0.2.1.5-alpha. Discovered by ekir; fixes
-      bug 1255.
-    - Fix another dereference-then-NULL-check sequence. Bugfix on
-      0.2.1.14-rc. Discovered by ekir; fixes bug 1256.
-    - Make sure we treat potentially not NUL-terminated strings correctly.
-      Bugfix on 0.1.1.13-alpha. Discovered by rieo; fixes bug 1257.
-
-
-Changes in version 0.2.1.24 - 2010-02-21
-  Tor 0.2.1.24 makes Tor work again on the latest OS X -- this time
-  for sure!
-
-  o Minor bugfixes:
-    - Work correctly out-of-the-box with even more vendor-patched versions
-      of OpenSSL. In particular, make it so Debian and OS X don't need
-      customized patches to run/build.
-
-
-Changes in version 0.2.1.23 - 2010-02-13
-  Tor 0.2.1.23 fixes a huge client-side performance bug, makes Tor work
-  again on the latest OS X, and updates the location of a directory
-  authority.
-
-  o Major bugfixes (performance):
-    - We were selecting our guards uniformly at random, and then weighting
-      which of our guards we'd use uniformly at random. This imbalance
-      meant that Tor clients were severely limited on throughput (and
-      probably latency too) by the first hop in their circuit. Now we
-      select guards weighted by currently advertised bandwidth. We also
-      automatically discard guards picked using the old algorithm. Fixes
-      bug 1217; bugfix on 0.2.1.3-alpha. Found by Mike Perry.
-
-  o Major bugfixes:
-    - Make Tor work again on the latest OS X: when deciding whether to
-      use strange flags to turn TLS renegotiation on, detect the OpenSSL
-      version at run-time, not compile time. We need to do this because
-      Apple doesn't update its dev-tools headers when it updates its
-      libraries in a security patch.
-    - Fix a potential buffer overflow in lookup_last_hid_serv_request()
-      that could happen on 32-bit platforms with 64-bit time_t. Also fix
-      a memory leak when requesting a hidden service descriptor we've
-      requested before. Fixes bug 1242, bugfix on 0.2.0.18-alpha. Found
-      by aakova.
-
-  o Minor bugfixes:
-    - Refactor resolve_my_address() to not use gethostbyname() anymore.
-      Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike Mestnik.
-
-  o Minor features:
-    - Avoid a mad rush at the beginning of each month when each client
-      rotates half of its guards. Instead we spread the rotation out
-      throughout the month, but we still avoid leaving a precise timestamp
-      in the state file about when we first picked the guard. Improves
-      over the behavior introduced in 0.1.2.17.
-
-
-Changes in version 0.2.1.22 - 2010-01-19
-  Tor 0.2.1.22 fixes a critical privacy problem in bridge directory
-  authorities -- it would tell you its whole history of bridge descriptors
-  if you make the right directory request. This stable update also
-  rotates two of the seven v3 directory authority keys and locations.
-
-  o Directory authority changes:
-    - Rotate keys (both v3 identity and relay identity) for moria1
-      and gabelmoo.
-
-  o Major bugfixes:
-    - Stop bridge directory authorities from answering dbg-stability.txt
-      directory queries, which would let people fetch a list of all
-      bridge identities they track. Bugfix on 0.2.1.6-alpha.
-
-
-Changes in version 0.2.1.21 - 2009-12-21
-  Tor 0.2.1.21 fixes an incompatibility with the most recent OpenSSL
-  library. If you use Tor on Linux / Unix and you're getting SSL
-  renegotiation errors, upgrading should help. We also recommend an
-  upgrade if you're an exit relay.
-
-  o Major bugfixes:
-    - Work around a security feature in OpenSSL 0.9.8l that prevents our
-      handshake from working unless we explicitly tell OpenSSL that we
-      are using SSL renegotiation safely. We are, of course, but OpenSSL
-      0.9.8l won't work unless we say we are.
-    - Avoid crashing if the client is trying to upload many bytes and the
-      circuit gets torn down at the same time, or if the flip side
-      happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150.
-
-  o Minor bugfixes:
-    - Do not refuse to learn about authority certs and v2 networkstatus
-      documents that are older than the latest consensus. This bug might
-      have degraded client bootstrapping. Bugfix on 0.2.0.10-alpha.
-      Spotted and fixed by xmux.
-    - Fix a couple of very-hard-to-trigger memory leaks, and one hard-to-
-      trigger platform-specific option misparsing case found by Coverity
-      Scan.
-    - Fix a compilation warning on Fedora 12 by removing an impossible-to-
-      trigger assert. Fixes bug 1173.
-
-
-Changes in version 0.2.1.20 - 2009-10-15
-  Tor 0.2.1.20 fixes a crash bug when you're accessing many hidden
-  services at once, prepares for more performance improvements, and
-  fixes a bunch of smaller bugs.
-
-  The Windows and OS X bundles also include a more recent Vidalia,
-  and switch from Privoxy to Polipo.
-
-  The OS X installers are now drag and drop. It's best to un-install
-  Tor/Vidalia and then install this new bundle, rather than upgrade. If
-  you want to upgrade, you'll need to update the paths for Tor and Polipo
-  in the Vidalia Settings window.
-
-  o Major bugfixes:
-    - Send circuit or stream sendme cells when our window has decreased
-      by 100 cells, not when it has decreased by 101 cells. Bug uncovered
-      by Karsten when testing the "reduce circuit window" performance
-      patch. Bugfix on the 54th commit on Tor -- from July 2002,
-      before the release of Tor 0.0.0. This is the new winner of the
-      oldest-bug prize.
-    - Fix a remotely triggerable memory leak when a consensus document
-      contains more than one signature from the same voter. Bugfix on
-      0.2.0.3-alpha.
-    - Avoid segfault in rare cases when finishing an introduction circuit
-      as a client and finding out that we don't have an introduction key
-      for it. Fixes bug 1073. Reported by Aaron Swartz.
-
-  o Major features:
-    - Tor now reads the "circwindow" parameter out of the consensus,
-      and uses that value for its circuit package window rather than the
-      default of 1000 cells. Begins the implementation of proposal 168.
-
-  o New directory authorities:
-    - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory
-      authority.
-    - Move moria1 and tonga to alternate IP addresses.
-
-  o Minor bugfixes:
-    - Fix a signed/unsigned compile warning in 0.2.1.19.
-    - Fix possible segmentation fault on directory authorities. Bugfix on
-      0.2.1.14-rc.
-    - Fix an extremely rare infinite recursion bug that could occur if
-      we tried to log a message after shutting down the log subsystem.
-      Found by Matt Edman. Bugfix on 0.2.0.16-alpha.
-    - Fix an obscure bug where hidden services on 64-bit big-endian
-      systems might mis-read the timestamp in v3 introduce cells, and
-      refuse to connect back to the client. Discovered by "rotor".
-      Bugfix on 0.2.1.6-alpha.
-    - We were triggering a CLOCK_SKEW controller status event whenever
-      we connect via the v2 connection protocol to any relay that has
-      a wrong clock. Instead, we should only inform the controller when
-      it's a trusted authority that claims our clock is wrong. Bugfix
-      on 0.2.0.20-rc; starts to fix bug 1074. Reported by SwissTorExit.
-    - We were telling the controller about CHECKING_REACHABILITY and
-      REACHABILITY_FAILED status events whenever we launch a testing
-      circuit or notice that one has failed. Instead, only tell the
-      controller when we want to inform the user of overall success or
-      overall failure. Bugfix on 0.1.2.6-alpha. Fixes bug 1075. Reported
-      by SwissTorExit.
-    - Don't warn when we're using a circuit that ends with a node
-      excluded in ExcludeExitNodes, but the circuit is not used to access
-      the outside world. This should help fix bug 1090. Bugfix on
-      0.2.1.6-alpha.
-    - Work around a small memory leak in some versions of OpenSSL that
-      stopped the memory used by the hostname TLS extension from being
-      freed.
-
-  o Minor features:
-    - Add a "getinfo status/accepted-server-descriptor" controller
-      command, which is the recommended way for controllers to learn
-      whether our server descriptor has been successfully received by at
-      least on directory authority. Un-recommend good-server-descriptor
-      getinfo and status events until we have a better design for them.
-
-
-Changes in version 0.2.1.19 - 2009-07-28
-  Tor 0.2.1.19 fixes a major bug with accessing and providing hidden
-  services.
-
-  o Major bugfixes:
-    - Make accessing hidden services on 0.2.1.x work right again.
-      Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and
-      part of patch provided by "optimist".
-
-  o Minor features:
-    - When a relay/bridge is writing out its identity key fingerprint to
-      the "fingerprint" file and to its logs, write it without spaces. Now
-      it will look like the fingerprints in our bridges documentation,
-      and confuse fewer users.
-
-  o Minor bugfixes:
-    - Relays no longer publish a new server descriptor if they change
-      their MaxAdvertisedBandwidth config option but it doesn't end up
-      changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc;
-      fixes bug 1026. Patch from Sebastian.
-    - Avoid leaking memory every time we get a create cell but we have
-      so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha;
-      fixes bug 1034. Reported by BarkerJr.
-
-
-Changes in version 0.2.1.18 - 2009-07-24
-  Tor 0.2.1.18 lays the foundations for performance improvements,
-  adds status events to help users diagnose bootstrap problems, adds
-  optional authentication/authorization for hidden services, fixes a
-  variety of potential anonymity problems, and includes a huge pile of
-  other features and bug fixes.
-
-  o Major features (clients):
-    - Start sending "bootstrap phase" status events to the controller,
-      so it can keep the user informed of progress fetching directory
-      information and establishing circuits. Also inform the controller
-      if we think we're stuck at a particular bootstrap phase. Implements
-      proposal 137.
-    - Clients replace entry guards that were chosen more than a few months
-      ago. This change should significantly improve client performance,
-      especially once more people upgrade, since relays that have been
-      a guard for a long time are currently overloaded.
-    - Network status consensus documents and votes now contain bandwidth
-      information for each relay. Clients use the bandwidth values
-      in the consensus, rather than the bandwidth values in each
-      relay descriptor. This approach opens the door to more accurate
-      bandwidth estimates once the directory authorities start doing
-      active measurements. Implements part of proposal 141.
-
-  o Major features (relays):
-    - Disable and refactor some debugging checks that forced a linear scan
-      over the whole server-side DNS cache. These accounted for over 50%
-      of CPU time on a relatively busy exit node's gprof profile. Also,
-      disable some debugging checks that appeared in exit node profile
-      data. Found by Jacob.
-    - New DirPortFrontPage option that takes an html file and publishes
-      it as "/" on the DirPort. Now relay operators can provide a
-      disclaimer without needing to set up a separate webserver. There's
-      a sample disclaimer in contrib/tor-exit-notice.html.
-
-  o Major features (hidden services):
-    - Make it possible to build hidden services that only certain clients
-      are allowed to connect to. This is enforced at several points,
-      so that unauthorized clients are unable to send INTRODUCE cells
-      to the service, or even (depending on the type of authentication)
-      to learn introduction points. This feature raises the bar for
-      certain kinds of active attacks against hidden services. Design
-      and code by Karsten Loesing. Implements proposal 121.
-    - Relays now store and serve v2 hidden service descriptors by default,
-      i.e., the new default value for HidServDirectoryV2 is 1. This is
-      the last step in proposal 114, which aims to make hidden service
-      lookups more reliable.
-
-  o Major features (path selection):
-    - ExitNodes and Exclude*Nodes config options now allow you to restrict
-      by country code ("{US}") or IP address or address pattern
-      ("255.128.0.0/16"). Patch from Robert Hogan. It still needs some
-      refinement to decide what config options should take priority if
-      you ask to both use a particular node and exclude it.
-
-  o Major features (misc):
-    - When building a consensus, do not include routers that are down.
-      This cuts down 30% to 40% on consensus size. Implements proposal
-      138.
-    - New TestingTorNetwork config option to allow adjustment of
-      previously constant values that could slow bootstrapping. Implements
-      proposal 135. Patch from Karsten.
-    - Convert many internal address representations to optionally hold
-      IPv6 addresses. Generate and accept IPv6 addresses in many protocol
-      elements. Make resolver code handle nameservers located at IPv6
-      addresses.
-    - More work on making our TLS handshake blend in: modify the list
-      of ciphers advertised by OpenSSL in client mode to even more
-      closely resemble a common web browser. We cheat a little so that
-      we can advertise ciphers that the locally installed OpenSSL doesn't
-      know about.
-    - Use the TLS1 hostname extension to more closely resemble browser
-      behavior.
-
-  o Security fixes (anonymity/entropy):
-    - Never use a connection with a mismatched address to extend a
-      circuit, unless that connection is canonical. A canonical
-      connection is one whose address is authenticated by the router's
-      identity key, either in a NETINFO cell or in a router descriptor.
-    - Implement most of proposal 110: The first K cells to be sent
-      along a circuit are marked as special "early" cells; only K "early"
-      cells will be allowed. Once this code is universal, we can block
-      certain kinds of denial-of-service attack by requiring that EXTEND
-      commands must be sent using an "early" cell.
-    - Resume using OpenSSL's RAND_poll() for better (and more portable)
-      cross-platform entropy collection again. We used to use it, then
-      stopped using it because of a bug that could crash systems that
-      called RAND_poll when they had a lot of fds open. It looks like the
-      bug got fixed in late 2006. Our new behavior is to call RAND_poll()
-      at startup, and to call RAND_poll() when we reseed later only if
-      we have a non-buggy OpenSSL version.
-    - When the client is choosing entry guards, now it selects at most
-      one guard from a given relay family. Otherwise we could end up with
-      all of our entry points into the network run by the same operator.
-      Suggested by Camilo Viecco. Fix on 0.1.1.11-alpha.
-    - Do not use or believe expired v3 authority certificates. Patch
-      from Karsten. Bugfix in 0.2.0.x. Fixes bug 851.
-    - Drop begin cells to a hidden service if they come from the middle
-      of a circuit. Patch from lark.
-    - When we erroneously receive two EXTEND cells for the same circuit
-      ID on the same connection, drop the second. Patch from lark.
-    - Authorities now vote for the Stable flag for any router whose
-      weighted MTBF is at least 5 days, regardless of the mean MTBF.
-    - Clients now never report any stream end reason except 'MISC'.
-      Implements proposal 148.
-
-  o Major bugfixes (crashes):
-    - Parse dates and IPv4 addresses in a locale- and libc-independent
-      manner, to avoid platform-dependent behavior on malformed input.
-    - Fix a crash that occurs on exit nodes when a nameserver request
-      timed out. Bugfix on 0.1.2.1-alpha; our CLEAR debugging code had
-      been suppressing the bug since 0.1.2.10-alpha. Partial fix for
-      bug 929.
-    - Do not assume that a stack-allocated character array will be
-      64-bit aligned on platforms that demand that uint64_t access is
-      aligned. Possible fix for bug 604.
-    - Resolve a very rare crash bug that could occur when the user forced
-      a nameserver reconfiguration during the middle of a nameserver
-      probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha.
-    - Avoid a "0 divided by 0" calculation when calculating router uptime
-      at directory authorities. Bugfix on 0.2.0.8-alpha.
-    - Fix an assertion bug in parsing policy-related options; possible fix
-      for bug 811.
-    - Rate-limit too-many-sockets messages: when they happen, they happen
-      a lot and end up filling up the disk. Resolves bug 748.
-    - Fix a race condition that could cause crashes or memory corruption
-      when running as a server with a controller listening for log
-      messages.
-    - Avoid crashing when we have a policy specified in a DirPolicy or
-      SocksPolicy or ReachableAddresses option with ports set on it,
-      and we re-load the policy. May fix bug 996.
-    - Fix an assertion failure on 64-bit platforms when we allocated
-      memory right up to the end of a memarea, then realigned the memory
-      one step beyond the end. Fixes a possible cause of bug 930.
-    - Protect the count of open sockets with a mutex, so we can't
-      corrupt it when two threads are closing or opening sockets at once.
-      Fix for bug 939. Bugfix on 0.2.0.1-alpha.
-
-  o Major bugfixes (clients):
-    - Discard router descriptors as we load them if they are more than
-      five days old. Otherwise if Tor is off for a long time and then
-      starts with cached descriptors, it will try to use the onion keys
-      in those obsolete descriptors when building circuits. Fixes bug 887.
-    - When we choose to abandon a new entry guard because we think our
-      older ones might be better, close any circuits pending on that
-      new entry guard connection. This fix should make us recover much
-      faster when our network is down and then comes back. Bugfix on
-      0.1.2.8-beta; found by lodger.
-    - When Tor clients restart after 1-5 days, they discard all their
-      cached descriptors as too old, but they still use the cached
-      consensus document. This approach is good for robustness, but
-      bad for performance: since they don't know any bandwidths, they
-      end up choosing at random rather than weighting their choice by
-      speed. Fixed by the above feature of putting bandwidths in the
-      consensus.
-
-  o Major bugfixes (relays):
-    - Relays were falling out of the networkstatus consensus for
-      part of a day if they changed their local config but the
-      authorities discarded their new descriptor as "not sufficiently
-      different". Now directory authorities accept a descriptor as changed
-      if BandwidthRate or BandwidthBurst changed. Partial fix for bug 962;
-      patch by Sebastian.
-    - Ensure that two circuits can never exist on the same connection
-      with the same circuit ID, even if one is marked for close. This
-      is conceivably a bugfix for bug 779; fixes a bug on 0.1.0.4-rc.
-    - Directory authorities were neglecting to mark relays down in their
-      internal histories if the relays fall off the routerlist without
-      ever being found unreachable. So there were relays in the histories
-      that haven't been seen for eight months, and are listed as being
-      up for eight months. This wreaked havoc on the "median wfu" and
-      "median mtbf" calculations, in turn making Guard and Stable flags
-      wrong, hurting network performance. Fixes bugs 696 and 969. Bugfix
-      on 0.2.0.6-alpha.
-
-  o Major bugfixes (hidden services):
-    - When establishing a hidden service, introduction points that
-      originate from cannibalized circuits were completely ignored
-      and not included in rendezvous service descriptors. This might
-      have been another reason for delay in making a hidden service
-      available. Bugfix from long ago (0.0.9.x?)
-
-  o Major bugfixes (memory and resource management):
-    - Fixed some memory leaks -- some quite frequent, some almost
-      impossible to trigger -- based on results from Coverity.
-    - Speed up parsing and cut down on memory fragmentation by using
-      stack-style allocations for parsing directory objects. Previously,
-      this accounted for over 40% of allocations from within Tor's code
-      on a typical directory cache.
-    - Use a Bloom filter rather than a digest-based set to track which
-      descriptors we need to keep around when we're cleaning out old
-      router descriptors. This speeds up the computation significantly,
-      and may reduce fragmentation.
-
-  o New/changed config options:
-    - Now NodeFamily and MyFamily config options allow spaces in
-      identity fingerprints, so it's easier to paste them in.
-      Suggested by Lucky Green.
-    - Allow ports 465 and 587 in the default exit policy again. We had
-      rejected them in 0.1.0.15, because back in 2005 they were commonly
-      misconfigured and ended up as spam targets. We hear they are better
-      locked down these days.
-    - Make TrackHostExit mappings expire a while after their last use, not
-      after their creation. Patch from Robert Hogan.
-    - Add an ExcludeExitNodes option so users can list a set of nodes
-      that should be be excluded from the exit node position, but
-      allowed elsewhere. Implements proposal 151.
-    - New --hush command-line option similar to --quiet. While --quiet
-      disables all logging to the console on startup, --hush limits the
-      output to messages of warning and error severity.
-    - New configure/torrc options (--enable-geoip-stats,
-      DirRecordUsageByCountry) to record how many IPs we've served
-      directory info to in each country code, how many status documents
-      total we've sent to each country code, and what share of the total
-      directory requests we should expect to see.
-    - Make outbound DNS packets respect the OutboundBindAddress setting.
-      Fixes the bug part of bug 798. Bugfix on 0.1.2.2-alpha.
-    - Allow separate log levels to be configured for different logging
-      domains. For example, this allows one to log all notices, warnings,
-      or errors, plus all memory management messages of level debug or
-      higher, with: Log [MM] debug-err [*] notice-err file /var/log/tor.
-    - Update to the "June 3 2009" ip-to-country file.
-
-  o Minor features (relays):
-    - Raise the minimum rate limiting to be a relay from 20000 bytes
-      to 20480 bytes (aka 20KB/s), to match our documentation. Also
-      update directory authorities so they always assign the Fast flag
-      to relays with 20KB/s of capacity. Now people running relays won't
-      suddenly find themselves not seeing any use, if the network gets
-      faster on average.
-    - If we're a relay and we change our IP address, be more verbose
-      about the reason that made us change. Should help track down
-      further bugs for relays on dynamic IP addresses.
-    - Exit servers can now answer resolve requests for ip6.arpa addresses.
-    - Implement most of Proposal 152: allow specialized servers to permit
-      single-hop circuits, and clients to use those servers to build
-      single-hop circuits when using a specialized controller. Patch
-      from Josh Albrecht. Resolves feature request 768.
-    - When relays do their initial bandwidth measurement, don't limit
-      to just our entry guards for the test circuits. Otherwise we tend
-      to have multiple test circuits going through a single entry guard,
-      which makes our bandwidth test less accurate. Fixes part of bug 654;
-      patch contributed by Josh Albrecht.
-
-  o Minor features (directory authorities):
-    - Try not to open more than one descriptor-downloading connection
-      to an authority at once. This should reduce load on directory
-      authorities. Fixes bug 366.
-    - Add cross-certification to newly generated certificates, so that
-      a signing key is enough information to look up a certificate. Start
-      serving certificates by 
-      pairs. Implements proposal 157.
-    - When a directory authority downloads a descriptor that it then
-      immediately rejects, do not retry downloading it right away. Should
-      save some bandwidth on authorities. Fix for bug 888. Patch by
-      Sebastian Hahn.
-    - Directory authorities now serve a /tor/dbg-stability.txt URL to
-      help debug WFU and MTBF calculations.
-    - In directory authorities' approved-routers files, allow
-      fingerprints with or without space.
-
-  o Minor features (directory mirrors):
-    - When a download gets us zero good descriptors, do not notify
-      Tor that new directory information has arrived.
-    - Servers support a new URL scheme for consensus downloads that
-      allows the client to specify which authorities are trusted.
-      The server then only sends the consensus if the client will trust
-      it. Otherwise a 404 error is sent back. Clients use this
-      new scheme when the server supports it (meaning it's running
-      0.2.1.1-alpha or later). Implements proposal 134.
-
-  o Minor features (bridges):
-    - If the bridge config line doesn't specify a port, assume 443.
-      This makes bridge lines a bit smaller and easier for users to
-      understand.
-    - If we're using bridges and our network goes away, be more willing
-      to forgive our bridges and try again when we get an application
-      request.
-
-  o Minor features (hidden services):
-    - When the client launches an introduction circuit, retry with a
-      new circuit after 30 seconds rather than 60 seconds.
-    - Launch a second client-side introduction circuit in parallel
-      after a delay of 15 seconds (based on work by Christian Wilms).
-    - Hidden services start out building five intro circuits rather
-      than three, and when the first three finish they publish a service
-      descriptor using those. Now we publish our service descriptor much
-      faster after restart.
-    - Drop the requirement to have an open dir port for storing and
-      serving v2 hidden service descriptors.
-
-  o Minor features (build and packaging):
-    - On Linux, use the prctl call to re-enable core dumps when the User
-      option is set.
-    - Try to make sure that the version of Libevent we're running with
-      is binary-compatible with the one we built with. May address bug
-      897 and others.
-    - Add a new --enable-local-appdata configuration switch to change
-      the default location of the datadir on win32 from APPDATA to
-      LOCAL_APPDATA. In the future, we should migrate to LOCAL_APPDATA
-      entirely. Patch from coderman.
-    - Build correctly against versions of OpenSSL 0.9.8 or later that
-      are built without support for deprecated functions.
-    - On platforms with a maximum syslog string length, truncate syslog
-      messages to that length ourselves, rather than relying on the
-      system to do it for us.
-    - Automatically detect MacOSX versions earlier than 10.4.0, and
-      disable kqueue from inside Tor when running with these versions.
-      We previously did this from the startup script, but that was no
-      help to people who didn't use the startup script. Resolves bug 863.
-    - Build correctly when configured to build outside the main source
-      path. Patch from Michael Gold.
-    - Disable GCC's strict alias optimization by default, to avoid the
-      likelihood of its introducing subtle bugs whenever our code violates
-      the letter of C99's alias rules.
-    - Change the contrib/tor.logrotate script so it makes the new
-      logs as "_tor:_tor" rather than the default, which is generally
-      "root:wheel". Fixes bug 676, reported by Serge Koksharov.
-    - Change our header file guard macros to be less likely to conflict
-      with system headers. Adam Langley noticed that we were conflicting
-      with log.h on Android.
-    - Add a couple of extra warnings to --enable-gcc-warnings for GCC 4.3,
-      and stop using a warning that had become unfixably verbose under
-      GCC 4.3.
-    - Use a lockfile to make sure that two Tor processes are not
-      simultaneously running with the same datadir.
-    - Allow OpenSSL to use dynamic locks if it wants.
-    - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent.
-
-  o Minor features (controllers):
-    - When generating circuit events with verbose nicknames for
-      controllers, try harder to look up nicknames for routers on a
-      circuit. (Previously, we would look in the router descriptors we had
-      for nicknames, but not in the consensus.) Partial fix for bug 941.
-    - New controller event NEWCONSENSUS that lists the networkstatus
-      lines for every recommended relay. Now controllers like Torflow
-      can keep up-to-date on which relays they should be using.
-    - New controller event "clients_seen" to report a geoip-based summary
-      of which countries we've seen clients from recently. Now controllers
-      like Vidalia can show bridge operators that they're actually making
-      a difference.
-    - Add a 'getinfo status/clients-seen' controller command, in case
-      controllers want to hear clients_seen events but connect late.
-    - New CONSENSUS_ARRIVED event to note when a new consensus has
-      been fetched and validated.
-    - Add an internal-use-only __ReloadTorrcOnSIGHUP option for
-      controllers to prevent SIGHUP from reloading the configuration.
-      Fixes bug 856.
-    - Return circuit purposes in response to GETINFO circuit-status.
-      Fixes bug 858.
-    - Serve the latest v3 networkstatus consensus via the control
-      port. Use "getinfo dir/status-vote/current/consensus" to fetch it.
-    - Add a "GETINFO /status/bootstrap-phase" controller option, so the
-      controller can query our current bootstrap state in case it attaches
-      partway through and wants to catch up.
-    - Provide circuit purposes along with circuit events to the controller.
-
-  o Minor features (tools):
-    - Do not have tor-resolve automatically refuse all .onion addresses;
-      if AutomapHostsOnResolve is set in your torrc, this will work fine.
-    - Add a -p option to tor-resolve for specifying the SOCKS port: some
-      people find host:port too confusing.
-    - Print the SOCKS5 error message string as well as the error code
-      when a tor-resolve request fails. Patch from Jacob.
-
-  o Minor bugfixes (memory and resource management):
-    - Clients no longer cache certificates for authorities they do not
-      recognize. Bugfix on 0.2.0.9-alpha.
-    - Do not use C's stdio library for writing to log files. This will
-      improve logging performance by a minute amount, and will stop
-      leaking fds when our disk is full. Fixes bug 861.
-    - Stop erroneous use of O_APPEND in cases where we did not in fact
-      want to re-seek to the end of a file before every last write().
-    - Fix a small alignment and memory-wasting bug on buffer chunks.
-      Spotted by rovv.
-    - Add a malloc_good_size implementation to OpenBSD_malloc_linux.c,
-      to avoid unused RAM in buffer chunks and memory pools.
-    - Reduce the default smartlist size from 32 to 16; it turns out that
-      most smartlists hold around 8-12 elements tops.
-    - Make dumpstats() log the fullness and size of openssl-internal
-      buffers.
-    - If the user has applied the experimental SSL_MODE_RELEASE_BUFFERS
-      patch to their OpenSSL, turn it on to save memory on servers. This
-      patch will (with any luck) get included in a mainline distribution
-      before too long.
-    - Fix a memory leak when v3 directory authorities load their keys
-      and cert from disk. Bugfix on 0.2.0.1-alpha.
-    - Stop using malloc_usable_size() to use more area than we had
-      actually allocated: it was safe, but made valgrind really unhappy.
-    - Make the assert_circuit_ok() function work correctly on circuits that
-      have already been marked for close.
-    - Fix uninitialized size field for memory area allocation: may improve
-      memory performance during directory parsing.
-
-  o Minor bugfixes (clients):
-    - Stop reloading the router list from disk for no reason when we
-      run out of reachable directory mirrors. Once upon a time reloading
-      it would set the 'is_running' flag back to 1 for them. It hasn't
-      done that for a long time.
-    - When we had picked an exit node for a connection, but marked it as
-      "optional", and it turned out we had no onion key for the exit,
-      stop wanting that exit and try again. This situation may not
-      be possible now, but will probably become feasible with proposal
-      158. Spotted by rovv. Fixes another case of bug 752.
-    - Fix a bug in address parsing that was preventing bridges or hidden
-      service targets from being at IPv6 addresses.
-    - Do not remove routers as too old if we do not have any consensus
-      document. Bugfix on 0.2.0.7-alpha.
-    - When an exit relay resolves a stream address to a local IP address,
-      do not just keep retrying that same exit relay over and
-      over. Instead, just close the stream. Addresses bug 872. Bugfix
-      on 0.2.0.32. Patch from rovv.
-    - Made Tor a little less aggressive about deleting expired
-      certificates. Partial fix for bug 854.
-    - Treat duplicate certificate fetches as failures, so that we do
-      not try to re-fetch an expired certificate over and over and over.
-    - Do not say we're fetching a certificate when we'll in fact skip it
-      because of a pending download.
-    - If we have correct permissions on $datadir, we complain to stdout
-      and fail to start. But dangerous permissions on
-      $datadir/cached-status/ would cause us to open a log and complain
-      there. Now complain to stdout and fail to start in both cases. Fixes
-      bug 820, reported by seeess.
-
-  o Minor bugfixes (bridges):
-    - When we made bridge authorities stop serving bridge descriptors over
-      unencrypted links, we also broke DirPort reachability testing for
-      bridges. So bridges with a non-zero DirPort were printing spurious
-      warns to their logs. Bugfix on 0.2.0.16-alpha. Fixes bug 709.
-    - Don't allow a bridge to publish its router descriptor to a
-      non-bridge directory authority. Fixes part of bug 932.
-    - When we change to or from being a bridge, reset our counts of
-      client usage by country. Fixes bug 932.
-
-  o Minor bugfixes (relays):
-    - Log correct error messages for DNS-related network errors on
-      Windows.
-    - Actually return -1 in the error case for read_bandwidth_usage().
-      Harmless bug, since we currently don't care about the return value
-      anywhere. Bugfix on 0.2.0.9-alpha.
-    - Provide a more useful log message if bug 977 (related to buffer
-      freelists) ever reappears, and do not crash right away.
-    - We were already rejecting relay begin cells with destination port
-      of 0. Now also reject extend cells with destination port or address
-      of 0. Suggested by lark.
-    - When we can't transmit a DNS request due to a network error, retry
-      it after a while, and eventually transmit a failing response to
-      the RESOLVED cell. Bugfix on 0.1.2.5-alpha.
-    - Solve a bug that kept hardware crypto acceleration from getting
-      enabled when accounting was turned on. Fixes bug 907. Bugfix on
-      0.0.9pre6.
-    - When a canonical connection appears later in our internal list
-      than a noncanonical one for a given OR ID, always use the
-      canonical one. Bugfix on 0.2.0.12-alpha. Fixes bug 805.
-      Spotted by rovv.
-    - Avoid some nasty corner cases in the logic for marking connections
-      as too old or obsolete or noncanonical for circuits. Partial
-      bugfix on bug 891.
-    - Fix another interesting corner-case of bug 891 spotted by rovv:
-      Previously, if two hosts had different amounts of clock drift, and
-      one of them created a new connection with just the wrong timing,
-      the other might decide to deprecate the new connection erroneously.
-      Bugfix on 0.1.1.13-alpha.
-    - If one win32 nameserver fails to get added, continue adding the
-      rest, and don't automatically fail.
-    - Fix a bug where an unreachable relay would establish enough
-      reachability testing circuits to do a bandwidth test -- if
-      we already have a connection to the middle hop of the testing
-      circuit, then it could establish the last hop by using the existing
-      connection. Bugfix on 0.1.2.2-alpha, exposed when we made testing
-      circuits no longer use entry guards in 0.2.1.3-alpha.
-
-  o Minor bugfixes (directory authorities):
-    - Limit uploaded directory documents to be 16M rather than 500K.
-      The directory authorities were refusing v3 consensus votes from
-      other authorities, since the votes are now 504K. Fixes bug 959;
-      bugfix on 0.0.2pre17 (where we raised it from 50K to 500K ;).
-    - Directory authorities should never send a 503 "busy" response to
-      requests for votes or keys. Bugfix on 0.2.0.8-alpha; exposed by
-      bug 959.
-    - Fix code so authorities _actually_ send back X-Descriptor-Not-New
-      headers. Bugfix on 0.2.0.10-alpha.
-
-  o Minor bugfixes (hidden services):
-    - When we can't find an intro key for a v2 hidden service descriptor,
-      fall back to the v0 hidden service descriptor and log a bug message.
-      Workaround for bug 1024.
-    - In very rare situations new hidden service descriptors were
-      published earlier than 30 seconds after the last change to the
-      service. (We currently think that a hidden service descriptor
-      that's been stable for 30 seconds is worth publishing.)
-    - If a hidden service sends us an END cell, do not consider
-      retrying the connection; just close it. Patch from rovv.
-    - If we are not using BEGIN_DIR cells, don't attempt to contact hidden
-      service directories if they have no advertised dir port. Bugfix
-      on 0.2.0.10-alpha.
-
-  o Minor bugfixes (tools):
-    - In the torify(1) manpage, mention that tsocks will leak your
-      DNS requests.
-
-  o Minor bugfixes (controllers):
-    - If the controller claimed responsibility for a stream, but that
-      stream never finished making its connection, it would live
-      forever in circuit_wait state. Now we close it after SocksTimeout
-      seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry.
-    - Make DNS resolved controller events into "CLOSED", not
-      "FAILED". Bugfix on 0.1.2.5-alpha. Fix by Robert Hogan. Resolves
-      bug 807.
-    - The control port would close the connection before flushing long
-      replies, such as the network consensus, if a QUIT command was issued
-      before the reply had completed. Now, the control port flushes all
-      pending replies before closing the connection. Also fix a spurious
-      warning when a QUIT command is issued after a malformed or rejected
-      AUTHENTICATE command, but before the connection was closed. Patch
-      by Marcus Griep. Fixes bugs 1015 and 1016.
-    - Fix a bug that made stream bandwidth get misreported to the
-      controller.
-
-  o Deprecated and removed features:
-    - The old "tor --version --version" command, which would print out
-      the subversion "Id" of most of the source files, is now removed. It
-      turned out to be less useful than we'd expected, and harder to
-      maintain.
-    - RedirectExits has been removed. It was deprecated since
-      0.2.0.3-alpha.
-    - Finally remove deprecated "EXTENDED_FORMAT" controller feature. It
-      has been called EXTENDED_EVENTS since 0.1.2.4-alpha.
-    - Cell pools are now always enabled; --disable-cell-pools is ignored.
-    - Directory mirrors no longer fetch the v1 directory or
-      running-routers files. They are obsolete, and nobody asks for them
-      anymore. This is the first step to making v1 authorities obsolete.
-    - Take out the TestVia config option, since it was a workaround for
-      a bug that was fixed in Tor 0.1.1.21.
-    - Mark RendNodes, RendExcludeNodes, HiddenServiceNodes, and
-      HiddenServiceExcludeNodes as obsolete: they never worked properly,
-      and nobody seems to be using them. Fixes bug 754. Bugfix on
-      0.1.0.1-rc. Patch from Christian Wilms.
-    - Remove all backward-compatibility code for relays running
-      versions of Tor so old that they no longer work at all on the
-      Tor network.
-
-  o Code simplifications and refactoring:
-    - Tool-assisted documentation cleanup. Nearly every function or
-      static variable in Tor should have its own documentation now.
-    - Rename the confusing or_is_obsolete field to the more appropriate
-      is_bad_for_new_circs, and move it to or_connection_t where it
-      belongs.
-    - Move edge-only flags from connection_t to edge_connection_t: not
-      only is this better coding, but on machines of plausible alignment,
-      it should save 4-8 bytes per connection_t. "Every little bit helps."
-    - Rename ServerDNSAllowBrokenResolvConf to ServerDNSAllowBrokenConfig
-      for consistency; keep old option working for backward compatibility.
-    - Simplify the code for finding connections to use for a circuit.
-    - Revise the connection_new functions so that a more typesafe variant
-      exists. This will work better with Coverity, and let us find any
-      actual mistakes we're making here.
-    - Refactor unit testing logic so that dmalloc can be used sensibly
-      with unit tests to check for memory leaks.
-    - Move all hidden-service related fields from connection and circuit
-      structure to substructures: this way they won't eat so much memory.
-    - Squeeze 2-5% out of client performance (according to oprofile) by
-      improving the implementation of some policy-manipulation functions.
-    - Change the implementation of ExcludeNodes and ExcludeExitNodes to
-      be more efficient. Formerly it was quadratic in the number of
-      servers; now it should be linear. Fixes bug 509.
-    - Save 16-22 bytes per open circuit by moving the n_addr, n_port,
-      and n_conn_id_digest fields into a separate structure that's
-      only needed when the circuit has not yet attached to an n_conn.
-    - Optimize out calls to time(NULL) that occur for every IO operation,
-      or for every cell. On systems like Windows where time() is a
-      slow syscall, this fix will be slightly helpful.
-
-
-Changes in version 0.2.0.35 - 2009-06-24
-  o Security fix:
-    - Avoid crashing in the presence of certain malformed descriptors.
-      Found by lark, and by automated fuzzing.
-    - Fix an edge case where a malicious exit relay could convince a
-      controller that the client's DNS question resolves to an internal IP
-      address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta.
-
-  o Major bugfixes:
-    - Finally fix the bug where dynamic-IP relays disappear when their
-      IP address changes: directory mirrors were mistakenly telling
-      them their old address if they asked via begin_dir, so they
-      never got an accurate answer about their new address, so they
-      just vanished after a day. For belt-and-suspenders, relays that
-      don't set Address in their config now avoid using begin_dir for
-      all direct connections. Should fix bugs 827, 883, and 900.
-    - Fix a timing-dependent, allocator-dependent, DNS-related crash bug
-      that would occur on some exit nodes when DNS failures and timeouts
-      occurred in certain patterns. Fix for bug 957.
-
-  o Minor bugfixes:
-    - When starting with a cache over a few days old, do not leak
-      memory for the obsolete router descriptors in it. Bugfix on
-      0.2.0.33; fixes bug 672.
-    - Hidden service clients didn't use a cached service descriptor that
-      was older than 15 minutes, but wouldn't fetch a new one either,
-      because there was already one in the cache. Now, fetch a v2
-      descriptor unless the same descriptor was added to the cache within
-      the last 15 minutes. Fixes bug 997; reported by Marcus Griep.
-
-
-Changes in version 0.2.0.34 - 2009-02-08
-  Tor 0.2.0.34 features several more security-related fixes. You should
-  upgrade, especially if you run an exit relay (remote crash) or a
-  directory authority (remote infinite loop), or you're on an older
-  (pre-XP) or not-recently-patched Windows (remote exploit).
-
-  This release marks end-of-life for Tor 0.1.2.x. Those Tor versions
-  have many known flaws, and nobody should be using them. You should
-  upgrade. If you're using a Linux or BSD and its packages are obsolete,
-  stop using those packages and upgrade anyway.
-
-  o Security fixes:
-    - Fix an infinite-loop bug on handling corrupt votes under certain
-      circumstances. Bugfix on 0.2.0.8-alpha.
-    - Fix a temporary DoS vulnerability that could be performed by
-      a directory mirror. Bugfix on 0.2.0.9-alpha; reported by lark.
-    - Avoid a potential crash on exit nodes when processing malformed
-      input. Remote DoS opportunity. Bugfix on 0.2.0.33.
-    - Do not accept incomplete ipv4 addresses (like 192.168.0) as valid.
-      Spec conformance issue. Bugfix on Tor 0.0.2pre27.
-
-  o Minor bugfixes:
-    - Fix compilation on systems where time_t is a 64-bit integer.
-      Patch from Matthias Drochner.
-    - Don't consider expiring already-closed client connections. Fixes
-      bug 893. Bugfix on 0.0.2pre20.
-
-
-Changes in version 0.2.0.33 - 2009-01-21
-  Tor 0.2.0.33 fixes a variety of bugs that were making relays less
-  useful to users. It also finally fixes a bug where a relay or client
-  that's been off for many days would take a long time to bootstrap.
-
-  This update also fixes an important security-related bug reported by
-  Ilja van Sprundel. You should upgrade. (We'll send out more details
-  about the bug once people have had some time to upgrade.)
-
-  o Security fixes:
-    - Fix a heap-corruption bug that may be remotely triggerable on
-      some platforms. Reported by Ilja van Sprundel.
-
-  o Major bugfixes:
-    - When a stream at an exit relay is in state "resolving" or
-      "connecting" and it receives an "end" relay cell, the exit relay
-      would silently ignore the end cell and not close the stream. If
-      the client never closes the circuit, then the exit relay never
-      closes the TCP connection. Bug introduced in Tor 0.1.2.1-alpha;
-      reported by "wood".
-    - When sending CREATED cells back for a given circuit, use a 64-bit
-      connection ID to find the right connection, rather than an addr:port
-      combination. Now that we can have multiple OR connections between
-      the same ORs, it is no longer possible to use addr:port to uniquely
-      identify a connection.
-    - Bridge relays that had DirPort set to 0 would stop fetching
-      descriptors shortly after startup, and then briefly resume
-      after a new bandwidth test and/or after publishing a new bridge
-      descriptor. Bridge users that try to bootstrap from them would
-      get a recent networkstatus but would get descriptors from up to
-      18 hours earlier, meaning most of the descriptors were obsolete
-      already. Reported by Tas; bugfix on 0.2.0.13-alpha.
-    - Prevent bridge relays from serving their 'extrainfo' document
-      to anybody who asks, now that extrainfo docs include potentially
-      sensitive aggregated client geoip summaries. Bugfix on
-      0.2.0.13-alpha.
-    - If the cached networkstatus consensus is more than five days old,
-      discard it rather than trying to use it. In theory it could be
-      useful because it lists alternate directory mirrors, but in practice
-      it just means we spend many minutes trying directory mirrors that
-      are long gone from the network. Also discard router descriptors as
-      we load them if they are more than five days old, since the onion
-      key is probably wrong by now. Bugfix on 0.2.0.x. Fixes bug 887.
-
-  o Minor bugfixes:
-    - Do not mark smartlist_bsearch_idx() function as ATTR_PURE. This bug
-      could make gcc generate non-functional binary search code. Bugfix
-      on 0.2.0.10-alpha.
-    - Build correctly on platforms without socklen_t.
-    - Compile without warnings on solaris.
-    - Avoid potential crash on internal error during signature collection.
-      Fixes bug 864. Patch from rovv.
-    - Correct handling of possible malformed authority signing key
-      certificates with internal signature types. Fixes bug 880.
-      Bugfix on 0.2.0.3-alpha.
-    - Fix a hard-to-trigger resource leak when logging credential status.
-      CID 349.
-    - When we can't initialize DNS because the network is down, do not
-      automatically stop Tor from starting. Instead, we retry failed
-      dns_init() every 10 minutes, and change the exit policy to reject
-      *:* until one succeeds. Fixes bug 691.
-    - Use 64 bits instead of 32 bits for connection identifiers used with
-      the controller protocol, to greatly reduce risk of identifier reuse.
-    - When we're choosing an exit node for a circuit, and we have
-      no pending streams, choose a good general exit rather than one that
-      supports "all the pending streams". Bugfix on 0.1.1.x. Fix by rovv.
-    - Fix another case of assuming, when a specific exit is requested,
-      that we know more than the user about what hosts it allows.
-      Fixes one case of bug 752. Patch from rovv.
-    - Clip the MaxCircuitDirtiness config option to a minimum of 10
-      seconds. Warn the user if lower values are given in the
-      configuration. Bugfix on 0.1.0.1-rc. Patch by Sebastian.
-    - Clip the CircuitBuildTimeout to a minimum of 30 seconds. Warn the
-      user if lower values are given in the configuration. Bugfix on
-      0.1.1.17-rc. Patch by Sebastian.
-    - Fix a memory leak when we decline to add a v2 rendezvous descriptor to
-      the cache because we already had a v0 descriptor with the same ID.
-      Bugfix on 0.2.0.18-alpha.
-    - Fix a race condition when freeing keys shared between main thread
-      and CPU workers that could result in a memory leak. Bugfix on
-      0.1.0.1-rc. Fixes bug 889.
-    - Send a valid END cell back when a client tries to connect to a
-      nonexistent hidden service port. Bugfix on 0.1.2.15. Fixes bug
-      840. Patch from rovv.
-    - Check which hops rendezvous stream cells are associated with to
-      prevent possible guess-the-streamid injection attacks from
-      intermediate hops. Fixes another case of bug 446. Based on patch
-      from rovv.
-    - If a broken client asks a non-exit router to connect somewhere,
-      do not even do the DNS lookup before rejecting the connection.
-      Fixes another case of bug 619. Patch from rovv.
-    - When a relay gets a create cell it can't decrypt (e.g. because it's
-      using the wrong onion key), we were dropping it and letting the
-      client time out. Now actually answer with a destroy cell. Fixes
-      bug 904. Bugfix on 0.0.2pre8.
-
-  o Minor bugfixes (hidden services):
-    - Do not throw away existing introduction points on SIGHUP. Bugfix on
-      0.0.6pre1. Patch by Karsten. Fixes bug 874.
-
-  o Minor features:
-    - Report the case where all signatures in a detached set are rejected
-      differently than the case where there is an error handling the
-      detached set.
-    - When we realize that another process has modified our cached
-      descriptors, print out a more useful error message rather than
-      triggering an assertion. Fixes bug 885. Patch from Karsten.
-    - Implement the 0x20 hack to better resist DNS poisoning: set the
-      case on outgoing DNS requests randomly, and reject responses that do
-      not match the case correctly. This logic can be disabled with the
-      ServerDNSRamdomizeCase setting, if you are using one of the 0.3%
-      of servers that do not reliably preserve case in replies. See
-      "Increased DNS Forgery Resistance through 0x20-Bit Encoding"
-      for more info.
-    - Check DNS replies for more matching fields to better resist DNS
-      poisoning.
-    - Never use OpenSSL compression: it wastes RAM and CPU trying to
-      compress cells, which are basically all encrypted, compressed, or
-      both.
-
-
-Changes in version 0.2.0.32 - 2008-11-20
-  Tor 0.2.0.32 fixes a major security problem in Debian and Ubuntu
-  packages (and maybe other packages) noticed by Theo de Raadt, fixes
-  a smaller security flaw that might allow an attacker to access local
-  services, further improves hidden service performance, and fixes a
-  variety of other issues.
-
-  o Security fixes:
-    - The "User" and "Group" config options did not clear the
-      supplementary group entries for the Tor process. The "User" option
-      is now more robust, and we now set the groups to the specified
-      user's primary group. The "Group" option is now ignored. For more
-      detailed logging on credential switching, set CREDENTIAL_LOG_LEVEL
-      in common/compat.c to LOG_NOTICE or higher. Patch by Jacob Appelbaum
-      and Steven Murdoch. Bugfix on 0.0.2pre14. Fixes bug 848 and 857.
-    - The "ClientDNSRejectInternalAddresses" config option wasn't being
-      consistently obeyed: if an exit relay refuses a stream because its
-      exit policy doesn't allow it, we would remember what IP address
-      the relay said the destination address resolves to, even if it's
-      an internal IP address. Bugfix on 0.2.0.7-alpha; patch by rovv.
-
-  o Major bugfixes:
-    - Fix a DOS opportunity during the voting signature collection process
-      at directory authorities. Spotted by rovv. Bugfix on 0.2.0.x.
-
-  o Major bugfixes (hidden services):
-    - When fetching v0 and v2 rendezvous service descriptors in parallel,
-      we were failing the whole hidden service request when the v0
-      descriptor fetch fails, even if the v2 fetch is still pending and
-      might succeed. Similarly, if the last v2 fetch fails, we were
-      failing the whole hidden service request even if a v0 fetch is
-      still pending. Fixes bug 814. Bugfix on 0.2.0.10-alpha.
-    - When extending a circuit to a hidden service directory to upload a
-      rendezvous descriptor using a BEGIN_DIR cell, almost 1/6 of all
-      requests failed, because the router descriptor has not been
-      downloaded yet. In these cases, do not attempt to upload the
-      rendezvous descriptor, but wait until the router descriptor is
-      downloaded and retry. Likewise, do not attempt to fetch a rendezvous
-      descriptor from a hidden service directory for which the router
-      descriptor has not yet been downloaded. Fixes bug 767. Bugfix
-      on 0.2.0.10-alpha.
-
-  o Minor bugfixes:
-    - Fix several infrequent memory leaks spotted by Coverity.
-    - When testing for libevent functions, set the LDFLAGS variable
-      correctly. Found by Riastradh.
-    - Avoid a bug where the FastFirstHopPK 0 option would keep Tor from
-      bootstrapping with tunneled directory connections. Bugfix on
-      0.1.2.5-alpha. Fixes bug 797. Found by Erwin Lam.
-    - When asked to connect to A.B.exit:80, if we don't know the IP for A
-      and we know that server B rejects most-but-not all connections to
-      port 80, we would previously reject the connection. Now, we assume
-      the user knows what they were asking for. Fixes bug 752. Bugfix
-      on 0.0.9rc5. Diagnosed by BarkerJr.
-    - If we overrun our per-second write limits a little, count this as
-      having used up our write allocation for the second, and choke
-      outgoing directory writes. Previously, we had only counted this when
-      we had met our limits precisely. Fixes bug 824. Patch from by rovv.
-      Bugfix on 0.2.0.x (??).
-    - Remove the old v2 directory authority 'lefkada' from the default
-      list. It has been gone for many months.
-    - Stop doing unaligned memory access that generated bus errors on
-      sparc64. Bugfix on 0.2.0.10-alpha. Fixes bug 862.
-    - Make USR2 log-level switch take effect immediately. Bugfix on
-      0.1.2.8-beta.
-
-  o Minor bugfixes (controller):
-    - Make DNS resolved events into "CLOSED", not "FAILED". Bugfix on
-      0.1.2.5-alpha. Fix by Robert Hogan. Resolves bug 807.
-
-
-Changes in version 0.2.0.31 - 2008-09-03
-  Tor 0.2.0.31 addresses two potential anonymity issues, starts to fix
-  a big bug we're seeing where in rare cases traffic from one Tor stream
-  gets mixed into another stream, and fixes a variety of smaller issues.
-
-  o Major bugfixes:
-    - Make sure that two circuits can never exist on the same connection
-      with the same circuit ID, even if one is marked for close. This
-      is conceivably a bugfix for bug 779. Bugfix on 0.1.0.4-rc.
-    - Relays now reject risky extend cells: if the extend cell includes
-      a digest of all zeroes, or asks to extend back to the relay that
-      sent the extend cell, tear down the circuit. Ideas suggested
-      by rovv.
-    - If not enough of our entry guards are available so we add a new
-      one, we might use the new one even if it overlapped with the
-      current circuit's exit relay (or its family). Anonymity bugfix
-      pointed out by rovv.
-
-  o Minor bugfixes:
-    - Recover 3-7 bytes that were wasted per memory chunk. Fixes bug
-      794; bug spotted by rovv. Bugfix on 0.2.0.1-alpha.
-    - Correctly detect the presence of the linux/netfilter_ipv4.h header
-      when building against recent kernels. Bugfix on 0.1.2.1-alpha.
-    - Pick size of default geoip filename string correctly on windows.
-      Fixes bug 806. Bugfix on 0.2.0.30.
-    - Make the autoconf script accept the obsolete --with-ssl-dir
-      option as an alias for the actually-working --with-openssl-dir
-      option. Fix the help documentation to recommend --with-openssl-dir.
-      Based on a patch by "Dave". Bugfix on 0.2.0.1-alpha.
-    - When using the TransPort option on OpenBSD, and using the User
-      option to change UID and drop privileges, make sure to open
-      /dev/pf before dropping privileges. Fixes bug 782. Patch from
-      Christopher Davis. Bugfix on 0.1.2.1-alpha.
-    - Try to attach connections immediately upon receiving a RENDEZVOUS2
-      or RENDEZVOUS_ESTABLISHED cell. This can save a second or two
-      on the client side when connecting to a hidden service. Bugfix
-      on 0.0.6pre1. Found and fixed by Christian Wilms; resolves bug 743.
-    - When closing an application-side connection because its circuit is
-      getting torn down, generate the stream event correctly. Bugfix on
-      0.1.2.x. Anonymous patch.
-
-
-Changes in version 0.2.0.30 - 2008-07-15
-  This new stable release switches to a more efficient directory
-  distribution design, adds features to make connections to the Tor
-  network harder to block, allows Tor to act as a DNS proxy, adds separate
-  rate limiting for relayed traffic to make it easier for clients to
-  become relays, fixes a variety of potential anonymity problems, and
-  includes the usual huge pile of other features and bug fixes.
-
-  o New v3 directory design:
-    - Tor now uses a new way to learn about and distribute information
-      about the network: the directory authorities vote on a common
-      network status document rather than each publishing their own
-      opinion. Now clients and caches download only one networkstatus
-      document to bootstrap, rather than downloading one for each
-      authority. Clients only download router descriptors listed in
-      the consensus. Implements proposal 101; see doc/spec/dir-spec.txt
-      for details.
-    - Set up moria1, tor26, and dizum as v3 directory authorities
-      in addition to being v2 authorities. Also add three new ones:
-      ides (run by Mike Perry), gabelmoo (run by Karsten Loesing), and
-      dannenberg (run by CCC).
-    - Switch to multi-level keys for directory authorities: now their
-      long-term identity key can be kept offline, and they periodically
-      generate a new signing key. Clients fetch the "key certificates"
-      to keep up to date on the right keys. Add a standalone tool
-      "tor-gencert" to generate key certificates. Implements proposal 103.
-    - Add a new V3AuthUseLegacyKey config option to make it easier for
-      v3 authorities to change their identity keys if another bug like
-      Debian's OpenSSL RNG flaw appears.
-    - Authorities and caches fetch the v2 networkstatus documents
-      less often, now that v3 is recommended.
-
-  o Make Tor connections stand out less on the wire:
-    - Use an improved TLS handshake designed by Steven Murdoch in proposal
-      124, as revised in proposal 130. The new handshake is meant to
-      be harder for censors to fingerprint, and it adds the ability
-      to detect certain kinds of man-in-the-middle traffic analysis
-      attacks. The new handshake format includes version negotiation for
-      OR connections as described in proposal 105, which will allow us
-      to improve Tor's link protocol more safely in the future.
-    - Enable encrypted directory connections by default for non-relays,
-      so censor tools that block Tor directory connections based on their
-      plaintext patterns will no longer work. This means Tor works in
-      certain censored countries by default again.
-    - Stop including recognizeable strings in the commonname part of
-      Tor's x509 certificates.
-
-  o Implement bridge relays:
-    - Bridge relays (or "bridges" for short) are Tor relays that aren't
-      listed in the main Tor directory. Since there is no complete public
-      list of them, even an ISP that is filtering connections to all the
-      known Tor relays probably won't be able to block all the bridges.
-      See doc/design-paper/blocking.pdf and proposal 125 for details.
-    - New config option BridgeRelay that specifies you want to be a
-      bridge relay rather than a normal relay. When BridgeRelay is set
-      to 1, then a) you cache dir info even if your DirPort ins't on,
-      and b) the default for PublishServerDescriptor is now "bridge"
-      rather than "v2,v3".
-    - New config option "UseBridges 1" for clients that want to use bridge
-      relays instead of ordinary entry guards. Clients then specify
-      bridge relays by adding "Bridge" lines to their config file. Users
-      can learn about a bridge relay either manually through word of
-      mouth, or by one of our rate-limited mechanisms for giving out
-      bridge addresses without letting an attacker easily enumerate them
-      all. See https://www.torproject.org/bridges for details.
-    - Bridge relays behave like clients with respect to time intervals
-      for downloading new v3 consensus documents -- otherwise they
-      stand out. Bridge users now wait until the end of the interval,
-      so their bridge relay will be sure to have a new consensus document.
-
-  o Implement bridge directory authorities:
-    - Bridge authorities are like normal directory authorities, except
-      they don't serve a list of known bridges. Therefore users that know
-      a bridge's fingerprint can fetch a relay descriptor for that bridge,
-      including fetching updates e.g. if the bridge changes IP address,
-      yet an attacker can't just fetch a list of all the bridges.
-    - Set up Tonga as the default bridge directory authority.
-    - Bridge authorities refuse to serve bridge descriptors or other
-      bridge information over unencrypted connections (that is, when
-      responding to direct DirPort requests rather than begin_dir cells.)
-    - Bridge directory authorities do reachability testing on the
-      bridges they know. They provide router status summaries to the
-      controller via "getinfo ns/purpose/bridge", and also dump summaries
-      to a file periodically, so we can keep internal stats about which
-      bridges are functioning.
-    - If bridge users set the UpdateBridgesFromAuthority config option,
-      but the digest they ask for is a 404 on the bridge authority,
-      they fall back to contacting the bridge directly.
-    - Bridges always use begin_dir to publish their server descriptor to
-      the bridge authority using an anonymous encrypted tunnel.
-    - Early work on a "bridge community" design: if bridge authorities set
-      the BridgePassword config option, they will serve a snapshot of
-      known bridge routerstatuses from their DirPort to anybody who
-      knows that password. Unset by default.
-    - Tor now includes an IP-to-country GeoIP file, so bridge relays can
-      report sanitized aggregated summaries in their extra-info documents
-      privately to the bridge authority, listing which countries are
-      able to reach them. We hope this mechanism will let us learn when
-      certain countries start trying to block bridges.
-    - Bridge authorities write bridge descriptors to disk, so they can
-      reload them after a reboot. They can also export the descriptors
-      to other programs, so we can distribute them to blocked users via
-      the BridgeDB interface, e.g. via https://bridges.torproject.org/
-      and bridges@torproject.org.
-
-  o Tor can be a DNS proxy:
-    - The new client-side DNS proxy feature replaces the need for
-      dns-proxy-tor: Just set "DNSPort 9999", and Tor will now listen
-      for DNS requests on port 9999, use the Tor network to resolve them
-      anonymously, and send the reply back like a regular DNS server.
-      The code still only implements a subset of DNS.
-    - Add a new AutomapHostsOnResolve option: when it is enabled, any
-      resolve request for hosts matching a given pattern causes Tor to
-      generate an internal virtual address mapping for that host. This
-      allows DNSPort to work sensibly with hidden service users. By
-      default, .exit and .onion addresses are remapped; the list of
-      patterns can be reconfigured with AutomapHostsSuffixes.
-    - Add an "-F" option to tor-resolve to force a resolve for a .onion
-      address. Thanks to the AutomapHostsOnResolve option, this is no
-      longer a completely silly thing to do.
-
-  o Major features (relay usability):
-    - New config options RelayBandwidthRate and RelayBandwidthBurst:
-      a separate set of token buckets for relayed traffic. Right now
-      relayed traffic is defined as answers to directory requests, and
-      OR connections that don't have any local circuits on them. See
-      proposal 111 for details.
-    - Create listener connections before we setuid to the configured
-      User and Group. Now non-Windows users can choose port values
-      under 1024, start Tor as root, and have Tor bind those ports
-      before it changes to another UID. (Windows users could already
-      pick these ports.)
-    - Added a new ConstrainedSockets config option to set SO_SNDBUF and
-      SO_RCVBUF on TCP sockets. Hopefully useful for Tor servers running
-      on "vserver" accounts. Patch from coderman.
-
-  o Major features (directory authorities):
-    - Directory authorities track weighted fractional uptime and weighted
-      mean-time-between failures for relays. WFU is suitable for deciding
-      whether a node is "usually up", while MTBF is suitable for deciding
-      whether a node is "likely to stay up." We need both, because
-      "usually up" is a good requirement for guards, while "likely to
-      stay up" is a good requirement for long-lived connections.
-    - Directory authorities use a new formula for selecting which relays
-      to advertise as Guards: they must be in the top 7/8 in terms of
-      how long we have known about them, and above the median of those
-      nodes in terms of weighted fractional uptime.
-    - Directory authorities use a new formula for selecting which relays
-      to advertise as Stable: when we have 4 or more days of data, use
-      median measured MTBF rather than median declared uptime. Implements
-      proposal 108.
-    - Directory authorities accept and serve "extra info" documents for
-      routers. Routers now publish their bandwidth-history lines in the
-      extra-info docs rather than the main descriptor. This step saves
-      60% (!) on compressed router descriptor downloads. Servers upload
-      extra-info docs to any authority that accepts them; directory
-      authorities now allow multiple router descriptors and/or extra
-      info documents to be uploaded in a single go. Authorities, and
-      caches that have been configured to download extra-info documents,
-      download them as needed. Implements proposal 104.
-    - Authorities now list relays who have the same nickname as
-      a different named relay, but list them with a new flag:
-      "Unnamed". Now we can make use of relays that happen to pick the
-      same nickname as a server that registered two years ago and then
-      disappeared. Implements proposal 122.
-    - Store routers in a file called cached-descriptors instead of in
-      cached-routers. Initialize cached-descriptors from cached-routers
-      if the old format is around. The new format allows us to store
-      annotations along with descriptors, to record the time we received
-      each descriptor, its source, and its purpose: currently one of
-      general, controller, or bridge.
-
-  o Major features (other):
-    - New config options WarnPlaintextPorts and RejectPlaintextPorts so
-      Tor can warn and/or refuse connections to ports commonly used with
-      vulnerable-plaintext protocols. Currently we warn on ports 23,
-      109, 110, and 143, but we don't reject any. Based on proposal 129
-      by Kevin Bauer and Damon McCoy.
-    - Integrate Karsten Loesing's Google Summer of Code project to publish
-      hidden service descriptors on a set of redundant relays that are a
-      function of the hidden service address. Now we don't have to rely
-      on three central hidden service authorities for publishing and
-      fetching every hidden service descriptor. Implements proposal 114.
-    - Allow tunnelled directory connections to ask for an encrypted
-      "begin_dir" connection or an anonymized "uses a full Tor circuit"
-      connection independently. Now we can make anonymized begin_dir
-      connections for (e.g.) more secure hidden service posting and
-      fetching.
-
-  o Major bugfixes (crashes and assert failures):
-    - Stop imposing an arbitrary maximum on the number of file descriptors
-      used for busy servers. Bug reported by Olaf Selke; patch from
-      Sebastian Hahn.
-    - Avoid possible failures when generating a directory with routers
-      with over-long versions strings, or too many flags set.
-    - Fix a rare assert error when we're closing one of our threads:
-      use a mutex to protect the list of logs, so we never write to the
-      list as it's being freed. Fixes the very rare bug 575, which is
-      kind of the revenge of bug 222.
-    - Avoid segfault in the case where a badly behaved v2 versioning
-      directory sends a signed networkstatus with missing client-versions.
-    - When we hit an EOF on a log (probably because we're shutting down),
-      don't try to remove the log from the list: just mark it as
-      unusable. (Bulletproofs against bug 222.)
-
-  o Major bugfixes (code security fixes):
-    - Detect size overflow in zlib code. Reported by Justin Ferguson and
-      Dan Kaminsky.
-    - Rewrite directory tokenization code to never run off the end of
-      a string. Fixes bug 455. Patch from croup.
-    - Be more paranoid about overwriting sensitive memory on free(),
-      as a defensive programming tactic to ensure forward secrecy.
-
-  o Major bugfixes (anonymity fixes):
-    - Reject requests for reverse-dns lookup of names that are in
-      a private address space. Patch from lodger.
-    - Never report that we've used more bandwidth than we're willing to
-      relay: it leaks how much non-relay traffic we're using. Resolves
-      bug 516.
-    - As a client, do not believe any server that tells us that an
-      address maps to an internal address space.
-    - Warn about unsafe ControlPort configurations.
-    - Directory authorities now call routers Fast if their bandwidth is
-      at least 100KB/s, and consider their bandwidth adequate to be a
-      Guard if it is at least 250KB/s, no matter the medians. This fix
-      complements proposal 107.
-    - Directory authorities now never mark more than 2 servers per IP as
-      Valid and Running (or 5 on addresses shared by authorities).
-      Implements proposal 109, by Kevin Bauer and Damon McCoy.
-    - If we're a relay, avoid picking ourselves as an introduction point,
-      a rendezvous point, or as the final hop for internal circuits. Bug
-      reported by taranis and lodger.
-    - Exit relays that are used as a client can now reach themselves
-      using the .exit notation, rather than just launching an infinite
-      pile of circuits. Fixes bug 641. Reported by Sebastian Hahn.
-    - Fix a bug where, when we were choosing the 'end stream reason' to
-      put in our relay end cell that we send to the exit relay, Tor
-      clients on Windows were sometimes sending the wrong 'reason'. The
-      anonymity problem is that exit relays may be able to guess whether
-      the client is running Windows, thus helping partition the anonymity
-      set. Down the road we should stop sending reasons to exit relays,
-      or otherwise prevent future versions of this bug.
-    - Only update guard status (usable / not usable) once we have
-      enough directory information. This was causing us to discard all our
-      guards on startup if we hadn't been running for a few weeks. Fixes
-      bug 448.
-    - When our directory information has been expired for a while, stop
-      being willing to build circuits using it. Fixes bug 401.
-
-  o Major bugfixes (peace of mind for relay operators)
-    - Non-exit relays no longer answer "resolve" relay cells, so they
-      can't be induced to do arbitrary DNS requests. (Tor clients already
-      avoid using non-exit relays for resolve cells, but now servers
-      enforce this too.) Fixes bug 619. Patch from lodger.
-    - When we setconf ClientOnly to 1, close any current OR and Dir
-      listeners. Reported by mwenge.
-
-  o Major bugfixes (other):
-    - If we only ever used Tor for hidden service lookups or posts, we
-      would stop building circuits and start refusing connections after
-      24 hours, since we falsely believed that Tor was dormant. Reported
-      by nwf.
-    - Add a new __HashedControlSessionPassword option for controllers
-      to use for one-off session password hashes that shouldn't get
-      saved to disk by SAVECONF --- Vidalia users were accumulating a
-      pile of HashedControlPassword lines in their torrc files, one for
-      each time they had restarted Tor and then clicked Save. Make Tor
-      automatically convert "HashedControlPassword" to this new option but
-      only when it's given on the command line. Partial fix for bug 586.
-    - Patch from "Andrew S. Lists" to catch when we contact a directory
-      mirror at IP address X and he says we look like we're coming from
-      IP address X. Otherwise this would screw up our address detection.
-    - Reject uploaded descriptors and extrainfo documents if they're
-      huge. Otherwise we'll cache them all over the network and it'll
-      clog everything up. Suggested by Aljosha Judmayer.
-    - When a hidden service was trying to establish an introduction point,
-      and Tor *did* manage to reuse one of the preemptively built
-      circuits, it didn't correctly remember which one it used,
-      so it asked for another one soon after, until there were no
-      more preemptive circuits, at which point it launched one from
-      scratch. Bugfix on 0.0.9.x.
-
-  o Rate limiting and load balancing improvements:
-    - When we add data to a write buffer in response to the data on that
-      write buffer getting low because of a flush, do not consider the
-      newly added data as a candidate for immediate flushing, but rather
-      make it wait until the next round of writing. Otherwise, we flush
-      and refill recursively, and a single greedy TLS connection can
-      eat all of our bandwidth.
-    - When counting the number of bytes written on a TLS connection,
-      look at the BIO actually used for writing to the network, not
-      at the BIO used (sometimes) to buffer data for the network.
-      Looking at different BIOs could result in write counts on the
-      order of ULONG_MAX. Fixes bug 614.
-    - If we change our MaxAdvertisedBandwidth and then reload torrc,
-      Tor won't realize it should publish a new relay descriptor. Fixes
-      bug 688, reported by mfr.
-    - Avoid using too little bandwidth when our clock skips a few seconds.
-    - Choose which bridge to use proportional to its advertised bandwidth,
-      rather than uniformly at random. This should speed up Tor for
-      bridge users. Also do this for people who set StrictEntryNodes.
-
-  o Bootstrapping faster and building circuits more intelligently:
-    - Fix bug 660 that was preventing us from knowing that we should
-      preemptively build circuits to handle expected directory requests.
-    - When we're checking if we have enough dir info for each relay
-      to begin establishing circuits, make sure that we actually have
-      the descriptor listed in the consensus, not just any descriptor.
-    - Correctly notify one-hop connections when a circuit build has
-      failed. Possible fix for bug 669. Found by lodger.
-    - Clients now hold circuitless TLS connections open for 1.5 times
-      MaxCircuitDirtiness (15 minutes), since it is likely that they'll
-      rebuild a new circuit over them within that timeframe. Previously,
-      they held them open only for KeepalivePeriod (5 minutes).
-
-  o Performance improvements (memory):
-    - Add OpenBSD malloc code from "phk" as an optional malloc
-      replacement on Linux: some glibc libraries do very poorly with
-      Tor's memory allocation patterns. Pass --enable-openbsd-malloc to
-      ./configure to get the replacement malloc code.
-    - Switch our old ring buffer implementation for one more like that
-      used by free Unix kernels. The wasted space in a buffer with 1mb
-      of data will now be more like 8k than 1mb. The new implementation
-      also avoids realloc();realloc(); patterns that can contribute to
-      memory fragmentation.
-    - Change the way that Tor buffers data that it is waiting to write.
-      Instead of queueing data cells in an enormous ring buffer for each
-      client->OR or OR->OR connection, we now queue cells on a separate
-      queue for each circuit. This lets us use less slack memory, and
-      will eventually let us be smarter about prioritizing different kinds
-      of traffic.
-    - Reference-count and share copies of address policy entries; only 5%
-      of them were actually distinct.
-    - Tune parameters for cell pool allocation to minimize amount of
-      RAM overhead used.
-    - Keep unused 4k and 16k buffers on free lists, rather than wasting 8k
-      for every single inactive connection_t. Free items from the
-      4k/16k-buffer free lists when they haven't been used for a while.
-    - Make memory debugging information describe more about history
-      of cell allocation, so we can help reduce our memory use.
-    - Be even more aggressive about releasing RAM from small
-      empty buffers. Thanks to our free-list code, this shouldn't be too
-      performance-intensive.
-    - Log malloc statistics from mallinfo() on platforms where it exists.
-    - Use memory pools to allocate cells with better speed and memory
-      efficiency, especially on platforms where malloc() is inefficient.
-    - Add a --with-tcmalloc option to the configure script to link
-      against tcmalloc (if present). Does not yet search for non-system
-      include paths.
-
-  o Performance improvements (socket management):
-    - Count the number of open sockets separately from the number of
-      active connection_t objects. This will let us avoid underusing
-      our allocated connection limit.
-    - We no longer use socket pairs to link an edge connection to an
-      anonymous directory connection or a DirPort test connection.
-      Instead, we track the link internally and transfer the data
-      in-process. This saves two sockets per "linked" connection (at the
-      client and at the server), and avoids the nasty Windows socketpair()
-      workaround.
-    - We were leaking a file descriptor if Tor started with a zero-length
-      cached-descriptors file. Patch by "freddy77".
-
-  o Performance improvements (CPU use):
-    - Never walk through the list of logs if we know that no log target
-      is interested in a given message.
-    - Call routerlist_remove_old_routers() much less often. This should
-      speed startup, especially on directory caches.
-    - Base64 decoding was actually showing up on our profile when parsing
-      the initial descriptor file; switch to an in-process all-at-once
-      implementation that's about 3.5x times faster than calling out to
-      OpenSSL.
-    - Use a slightly simpler string hashing algorithm (copying Python's
-      instead of Java's) and optimize our digest hashing algorithm to take
-      advantage of 64-bit platforms and to remove some possibly-costly
-      voodoo.
-    - When implementing AES counter mode, update only the portions of the
-      counter buffer that need to change, and don't keep separate
-      network-order and host-order counters on big-endian hosts (where
-      they are the same).
-    - Add an in-place version of aes_crypt() so that we can avoid doing a
-      needless memcpy() call on each cell payload.
-    - Use Critical Sections rather than Mutexes for synchronizing threads
-      on win32; Mutexes are heavier-weight, and designed for synchronizing
-      between processes.
-
-  o Performance improvements (bandwidth use):
-    - Don't try to launch new descriptor downloads quite so often when we
-      already have enough directory information to build circuits.
-    - Version 1 directories are no longer generated in full. Instead,
-      authorities generate and serve "stub" v1 directories that list
-      no servers. This will stop Tor versions 0.1.0.x and earlier from
-      working, but (for security reasons) nobody should be running those
-      versions anyway.
-    - Avoid going directly to the directory authorities even if you're a
-      relay, if you haven't found yourself reachable yet or if you've
-      decided not to advertise your dirport yet. Addresses bug 556.
-    - If we've gone 12 hours since our last bandwidth check, and we
-      estimate we have less than 50KB bandwidth capacity but we could
-      handle more, do another bandwidth test.
-    - Support "If-Modified-Since" when answering HTTP requests for
-      directories, running-routers documents, and v2 and v3 networkstatus
-      documents. (There's no need to support it for router descriptors,
-      since those are downloaded by descriptor digest.)
-    - Stop fetching directory info so aggressively if your DirPort is
-      on but your ORPort is off; stop fetching v2 dir info entirely.
-      You can override these choices with the new FetchDirInfoEarly
-      config option.
-
-  o Changed config option behavior (features):
-    - Configuration files now accept C-style strings as values. This
-      helps encode characters not allowed in the current configuration
-      file format, such as newline or #. Addresses bug 557.
-    - Add hidden services and DNSPorts to the list of things that make
-      Tor accept that it has running ports. Change starting Tor with no
-      ports from a fatal error to a warning; we might change it back if
-      this turns out to confuse anybody. Fixes bug 579.
-    - Make PublishServerDescriptor default to 1, so the default doesn't
-      have to change as we invent new directory protocol versions.
-    - Allow people to say PreferTunnelledDirConns rather than
-      PreferTunneledDirConns, for those alternate-spellers out there.
-    - Raise the default BandwidthRate/BandwidthBurst to 5MB/10MB, to
-      accommodate the growing number of servers that use the default
-      and are reaching it.
-    - Make it possible to enable HashedControlPassword and
-      CookieAuthentication at the same time.
-    - When a TrackHostExits-chosen exit fails too many times in a row,
-      stop using it. Fixes bug 437.
-
-  o Changed config option behavior (bugfixes):
-    - Do not read the configuration file when we've only been told to
-      generate a password hash. Fixes bug 643. Bugfix on 0.0.9pre5. Fix
-      based on patch from Sebastian Hahn.
-    - Actually validate the options passed to AuthDirReject,
-      AuthDirInvalid, AuthDirBadDir, and AuthDirBadExit.
-    - Make "ClientOnly 1" config option disable directory ports too.
-    - Don't stop fetching descriptors when FetchUselessDescriptors is
-      set, even if we stop asking for circuits. Bug reported by tup
-      and ioerror.
-    - Servers used to decline to publish their DirPort if their
-      BandwidthRate or MaxAdvertisedBandwidth were below a threshold. Now
-      they look only at BandwidthRate and RelayBandwidthRate.
-    - Treat "2gb" when given in torrc for a bandwidth as meaning 2gb,
-      minus 1 byte: the actual maximum declared bandwidth.
-    - Make "TrackHostExits ." actually work. Bugfix on 0.1.0.x.
-    - Make the NodeFamilies config option work. (Reported by
-      lodger -- it has never actually worked, even though we added it
-      in Oct 2004.)
-    - If Tor is invoked from something that isn't a shell (e.g. Vidalia),
-      now we expand "-f ~/.tor/torrc" correctly. Suggested by Matt Edman.
-
-  o New config options:
-    - New configuration options AuthDirMaxServersPerAddr and
-      AuthDirMaxServersperAuthAddr to override default maximum number
-      of servers allowed on a single IP address. This is important for
-      running a test network on a single host.
-    - Three new config options (AlternateDirAuthority,
-      AlternateBridgeAuthority, and AlternateHSAuthority) that let the
-      user selectively replace the default directory authorities by type,
-      rather than the all-or-nothing replacement that DirServer offers.
-    - New config options AuthDirBadDir and AuthDirListBadDirs for
-      authorities to mark certain relays as "bad directories" in the
-      networkstatus documents. Also supports the "!baddir" directive in
-      the approved-routers file.
-    - New config option V2AuthoritativeDirectory that all v2 directory
-      authorities must set. This lets v3 authorities choose not to serve
-      v2 directory information.
-
-  o Minor features (other):
-    - When we're not serving v2 directory information, there is no reason
-      to actually keep any around. Remove the obsolete files and directory
-      on startup if they are very old and we aren't going to serve them.
-    - When we negotiate a v2 link-layer connection (not yet implemented),
-      accept RELAY_EARLY cells and turn them into RELAY cells if we've
-      negotiated a v1 connection for their next step. Initial steps for
-      proposal 110.
-    - When we have no consensus, check FallbackNetworkstatusFile (defaults
-      to $PREFIX/share/tor/fallback-consensus) for a consensus. This way
-      we can start out knowing some directory caches. We don't ship with
-      a fallback consensus by default though, because it was making
-      bootstrapping take too long while we tried many down relays.
-    - Authorities send back an X-Descriptor-Not-New header in response to
-      an accepted-but-discarded descriptor upload. Partially implements
-      fix for bug 535.
-    - If we find a cached-routers file that's been sitting around for more
-      than 28 days unmodified, then most likely it's a leftover from
-      when we upgraded to 0.2.0.8-alpha. Remove it. It has no good
-      routers anyway.
-    - When we (as a cache) download a descriptor because it was listed
-      in a consensus, remember when the consensus was supposed to expire,
-      and don't expire the descriptor until then.
-    - Optionally (if built with -DEXPORTMALLINFO) export the output
-      of mallinfo via http, as tor/mallinfo.txt. Only accessible
-      from localhost.
-    - Tag every guard node in our state file with the version that
-      we believe added it, or with our own version if we add it. This way,
-      if a user temporarily runs an old version of Tor and then switches
-      back to a new one, she doesn't automatically lose her guards.
-    - When somebody requests a list of statuses or servers, and we have
-      none of those, return a 404 rather than an empty 200.
-    - Merge in some (as-yet-unused) IPv6 address manipulation code. (Patch
-      from croup.)
-    - Add an HSAuthorityRecordStats option that hidden service authorities
-      can use to track statistics of overall hidden service usage without
-      logging information that would be as useful to an attacker.
-    - Allow multiple HiddenServicePort directives with the same virtual
-      port; when they occur, the user is sent round-robin to one
-      of the target ports chosen at random.  Partially fixes bug 393 by
-      adding limited ad-hoc round-robining.
-    - Revamp file-writing logic so we don't need to have the entire
-      contents of a file in memory at once before we write to disk. Tor,
-      meet stdio.
-
-  o Minor bugfixes (other):
-    - Alter the code that tries to recover from unhandled write
-      errors, to not try to flush onto a socket that's given us
-      unhandled errors.
-    - Directory mirrors no longer include a guess at the client's IP
-      address if the connection appears to be coming from the same /24
-      network; it was producing too many wrong guesses.
-    - If we're trying to flush the last bytes on a connection (for
-      example, when answering a directory request), reset the
-      time-to-give-up timeout every time we manage to write something
-      on the socket.
-    - Reject router descriptors with out-of-range bandwidthcapacity or
-      bandwidthburst values.
-    - If we can't expand our list of entry guards (e.g. because we're
-      using bridges or we have StrictEntryNodes set), don't mark relays
-      down when they fail a directory request. Otherwise we're too quick
-      to mark all our entry points down.
-    - Authorities no longer send back "400 you're unreachable please fix
-      it" errors to Tor servers that aren't online all the time. We're
-      supposed to tolerate these servers now.
-    - Let directory authorities startup even when they can't generate
-      a descriptor immediately, e.g. because they don't know their
-      address.
-    - Correctly enforce that elements of directory objects do not appear
-      more often than they are allowed to appear.
-    - Stop allowing hibernating servers to be "stable" or "fast".
-    - On Windows, we were preventing other processes from reading
-      cached-routers while Tor was running. (Reported by janbar)
-    - Check return values from pthread_mutex functions.
-    - When opening /dev/null in finish_daemonize(), do not pass the
-      O_CREAT flag. Fortify was complaining, and correctly so. Fixes
-      bug 742; fix from Michael Scherer. Bugfix on 0.0.2pre19.
-
-  o Controller features:
-    - The GETCONF command now escapes and quotes configuration values
-      that don't otherwise fit into the torrc file.
-    - The SETCONF command now handles quoted values correctly.
-    - Add "GETINFO/desc-annotations/id/" so controllers can
-      ask about source, timestamp of arrival, purpose, etc. We need
-      something like this to help Vidalia not do GeoIP lookups on bridge
-      addresses.
-    - Allow multiple HashedControlPassword config lines, to support
-      multiple controller passwords.
-    - Accept LF instead of CRLF on controller, since some software has a
-      hard time generating real Internet newlines.
-    - Add GETINFO values for the server status events
-      "REACHABILITY_SUCCEEDED" and "GOOD_SERVER_DESCRIPTOR". Patch from
-      Robert Hogan.
-    - There is now an ugly, temporary "desc/all-recent-extrainfo-hack"
-      GETINFO for Torstat to use until it can switch to using extrainfos.
-    - New config option CookieAuthFile to choose a new location for the
-      cookie authentication file, and config option
-      CookieAuthFileGroupReadable to make it group-readable.
-    - Add a SOURCE_ADDR field to STREAM NEW events so that controllers can
-      match requests to applications. Patch from Robert Hogan.
-    - Add a RESOLVE command to launch hostname lookups. Original patch
-      from Robert Hogan.
-    - Add GETINFO status/enough-dir-info to let controllers tell whether
-      Tor has downloaded sufficient directory information. Patch from Tup.
-    - You can now use the ControlSocket option to tell Tor to listen for
-      controller connections on Unix domain sockets on systems that
-      support them. Patch from Peter Palfrader.
-    - New "GETINFO address-mappings/*" command to get address mappings
-      with expiry information. "addr-mappings/*" is now deprecated.
-      Patch from Tup.
-    - Add a new config option __DisablePredictedCircuits designed for
-      use by the controller, when we don't want Tor to build any circuits
-      preemptively.
-    - Let the controller specify HOP=%d as an argument to ATTACHSTREAM,
-      so we can exit from the middle of the circuit.
-    - Implement "getinfo status/circuit-established".
-    - Implement "getinfo status/version/..." so a controller can tell
-      whether the current version is recommended, and whether any versions
-      are good, and how many authorities agree. Patch from "shibz".
-    - Controllers should now specify cache=no or cache=yes when using
-      the +POSTDESCRIPTOR command.
-    - Add a "PURPOSE=" argument to "STREAM NEW" events, as suggested by
-      Robert Hogan. Fixes the first part of bug 681.
-    - When reporting clock skew, and we know that the clock is _at least
-      as skewed_ as some value, but we don't know the actual value,
-      report the value as a "minimum skew."
-
-  o Controller bugfixes:
-    - Generate "STATUS_SERVER" events rather than misspelled
-      "STATUS_SEVER" events. Caught by mwenge.
-    - Reject controller commands over 1MB in length, so rogue
-      processes can't run us out of memory.
-    - Change the behavior of "getinfo status/good-server-descriptor"
-      so it doesn't return failure when any authority disappears.
-    - Send NAMESERVER_STATUS messages for a single failed nameserver
-      correctly.
-    - When the DANGEROUS_VERSION controller status event told us we're
-      running an obsolete version, it used the string "OLD" to describe
-      it. Yet the "getinfo" interface used the string "OBSOLETE". Now use
-      "OBSOLETE" in both cases.
-    - Respond to INT and TERM SIGNAL commands before we execute the
-      signal, in case the signal shuts us down. We had a patch in
-      0.1.2.1-alpha that tried to do this by queueing the response on
-      the connection's buffer before shutting down, but that really
-      isn't the same thing at all. Bug located by Matt Edman.
-    - Provide DNS expiry times in GMT, not in local time. For backward
-      compatibility, ADDRMAP events only provide GMT expiry in an extended
-      field. "GETINFO address-mappings" always does the right thing.
-    - Use CRLF line endings properly in NS events.
-    - Make 'getinfo fingerprint' return a 551 error if we're not a
-      server, so we match what the control spec claims we do. Reported
-      by daejees.
-    - Fix a typo in an error message when extendcircuit fails that
-      caused us to not follow the \r\n-based delimiter protocol. Reported
-      by daejees.
-    - When tunneling an encrypted directory connection, and its first
-      circuit fails, do not leave it unattached and ask the controller
-      to deal. Fixes the second part of bug 681.
-    - Treat some 403 responses from directory servers as INFO rather than
-      WARN-severity events.
-
-  o Portability / building / compiling:
-    - When building with --enable-gcc-warnings, check for whether Apple's
-      warning "-Wshorten-64-to-32" is available.
-    - Support compilation to target iPhone; patch from cjacker huang.
-      To build for iPhone, pass the --enable-iphone option to configure.
-    - Port Tor to build and run correctly on Windows CE systems, using
-      the wcecompat library. Contributed by Valerio Lupi.
-    - Detect non-ASCII platforms (if any still exist) and refuse to
-      build there: some of our code assumes that 'A' is 65 and so on.
-    - Clear up some MIPSPro compiler warnings.
-    - Make autoconf search for libevent, openssl, and zlib consistently.
-    - Update deprecated macros in configure.in.
-    - When warning about missing headers, tell the user to let us
-      know if the compile succeeds anyway, so we can downgrade the
-      warning.
-    - Include the current subversion revision as part of the version
-      string: either fetch it directly if we're in an SVN checkout, do
-      some magic to guess it if we're in an SVK checkout, or use
-      the last-detected version if we're building from a .tar.gz.
-      Use this version consistently in log messages.
-    - Correctly report platform name on Windows 95 OSR2 and Windows 98 SE.
-    - Read resolv.conf files correctly on platforms where read() returns
-      partial results on small file reads.
-    - Build without verbose warnings even on gcc 4.2 and 4.3.
-    - On Windows, correctly detect errors when listing the contents of
-      a directory. Fix from lodger.
-    - Run 'make test' as part of 'make dist', so we stop releasing so
-      many development snapshots that fail their unit tests.
-    - Add support to detect Libevent versions in the 1.4.x series
-      on mingw.
-    - Add command-line arguments to unit-test executable so that we can
-      invoke any chosen test from the command line rather than having
-      to run the whole test suite at once; and so that we can turn on
-      logging for the unit tests.
-    - Do not automatically run configure from autogen.sh. This
-      non-standard behavior tended to annoy people who have built other
-      programs.
-    - Fix a macro/CPP interaction that was confusing some compilers:
-      some GCCs don't like #if/#endif pairs inside macro arguments.
-      Fixes bug 707.
-    - Fix macro collision between OpenSSL 0.9.8h and Windows headers.
-      Fixes bug 704; fix from Steven Murdoch.
-    - Correctly detect transparent proxy support on Linux hosts that
-      require in.h to be included before netfilter_ipv4.h.  Patch
-      from coderman.
-
-  o Logging improvements:
-    - When we haven't had any application requests lately, don't bother
-      logging that we have expired a bunch of descriptors.
-    - When attempting to open a logfile fails, tell us why.
-    - Only log guard node status when guard node status has changed.
-    - Downgrade the 3 most common "INFO" messages to "DEBUG". This will
-      make "INFO" 75% less verbose.
-    - When SafeLogging is disabled, log addresses along with all TLS
-      errors.
-    - Report TLS "zero return" case as a "clean close" and "IO error"
-      as a "close". Stop calling closes "unexpected closes": existing
-      Tors don't use SSL_close(), so having a connection close without
-      the TLS shutdown handshake is hardly unexpected.
-    - When we receive a consensus from the future, warn about skew.
-    - Make "not enough dir info yet" warnings describe *why* Tor feels
-      it doesn't have enough directory info yet.
-    - On the USR1 signal, when dmalloc is in use, log the top 10 memory
-      consumers. (We already do this on HUP.)
-    - Give more descriptive well-formedness errors for out-of-range
-      hidden service descriptor/protocol versions.
-    - Stop recommending that every server operator send mail to tor-ops.
-      Resolves bug 597. Bugfix on 0.1.2.x.
-    - Improve skew reporting: try to give the user a better log message
-      about how skewed they are, and how much this matters.
-    - New --quiet command-line option to suppress the default console log.
-      Good in combination with --hash-password.
-    - Don't complain that "your server has not managed to confirm that its
-      ports are reachable" if we haven't been able to build any circuits
-      yet.
-    - Detect the reason for failing to mmap a descriptor file we just
-      wrote, and give a more useful log message.  Fixes bug 533.
-    - Always prepend "Bug: " to any log message about a bug.
-    - When dumping memory usage, list bytes used in buffer memory
-      free-lists.
-    - When running with dmalloc, dump more stats on hup and on exit.
-    - Put a platform string (e.g. "Linux i686") in the startup log
-      message, so when people paste just their logs, we know if it's
-      OpenBSD or Windows or what.
-    - When logging memory usage, break down memory used in buffers by
-      buffer type.
-    - When we are reporting the DirServer line we just parsed, we were
-      logging the second stanza of the key fingerprint, not the first.
-    - Even though Windows is equally happy with / and \ as path separators,
-      try to use \ consistently on Windows and / consistently on Unix: it
-      makes the log messages nicer.
-     - On OSX, stop warning the user that kqueue support in libevent is
-      "experimental", since it seems to have worked fine for ages.
-
-  o Contributed scripts and tools:
-    - Update linux-tor-prio.sh script to allow QoS based on the uid of
-      the Tor process. Patch from Marco Bonetti with tweaks from Mike
-      Perry.
-    - Include the "tor-ctrl.sh" bash script by Stefan Behte to provide
-      Unix users an easy way to script their Tor process (e.g. by
-      adjusting bandwidth based on the time of the day).
-    - In the exitlist script, only consider the most recently published
-      server descriptor for each server. Also, when the user requests
-      a list of servers that _reject_ connections to a given address,
-      explicitly exclude the IPs that also have servers that accept
-      connections to that address. Resolves bug 405.
-    - Include a new contrib/tor-exit-notice.html file that exit relay
-      operators can put on their website to help reduce abuse queries.
-
-  o Newly deprecated features:
-    - The status/version/num-versioning and status/version/num-concurring
-      GETINFO controller options are no longer useful in the v3 directory
-      protocol: treat them as deprecated, and warn when they're used.
-    - The RedirectExits config option is now deprecated.
-
-  o Removed features:
-    - Drop the old code to choke directory connections when the
-      corresponding OR connections got full: thanks to the cell queue
-      feature, OR conns don't get full any more.
-    - Remove the old "dns worker" server DNS code: it hasn't been default
-      since 0.1.2.2-alpha, and all the servers are using the new
-      eventdns code.
-    - Remove the code to generate the oldest (v1) directory format.
-    - Remove support for the old bw_accounting file: we've been storing
-      bandwidth accounting information in the state file since
-      0.1.2.5-alpha. This may result in bandwidth accounting errors
-      if you try to upgrade from 0.1.1.x or earlier, or if you try to
-      downgrade to 0.1.1.x or earlier.
-    - Drop support for OpenSSL version 0.9.6. Just about nobody was using
-      it, it had no AES, and it hasn't seen any security patches since
-      2004.
-    - Stop overloading the circuit_t.onionskin field for both "onionskin
-      from a CREATE cell that we are waiting for a cpuworker to be
-      assigned" and "onionskin from an EXTEND cell that we are going to
-      send to an OR as soon as we are connected". Might help with bug 600.
-    - Remove the tor_strpartition() function: its logic was confused,
-      and it was only used for one thing that could be implemented far
-      more easily.
-    - Remove the contrib scripts ExerciseServer.py, PathDemo.py,
-      and TorControl.py, as they use the old v0 controller protocol,
-      and are obsoleted by TorFlow anyway.
-    - Drop support for v1 rendezvous descriptors, since we never used
-      them anyway, and the code has probably rotted by now. Based on
-      patch from Karsten Loesing.
-    - Stop allowing address masks that do not correspond to bit prefixes.
-      We have warned about these for a really long time; now it's time
-      to reject them. (Patch from croup.)
-    - Remove an optimization in the AES counter-mode code that assumed
-      that the counter never exceeded 2^68. When the counter can be set
-      arbitrarily as an IV (as it is by Karsten's new hidden services
-      code), this assumption no longer holds.
-    - Disable the SETROUTERPURPOSE controller command: it is now
-      obsolete.
-
-
-Changes in version 0.1.2.19 - 2008-01-17
-  Tor 0.1.2.19 fixes a huge memory leak on exit relays, makes the default
-  exit policy a little bit more conservative so it's safer to run an
-  exit relay on a home system, and fixes a variety of smaller issues.
-
-  o Security fixes:
-    - Exit policies now reject connections that are addressed to a
-      relay's public (external) IP address too, unless
-      ExitPolicyRejectPrivate is turned off. We do this because too
-      many relays are running nearby to services that trust them based
-      on network address.
-
-  o Major bugfixes:
-    - When the clock jumps forward a lot, do not allow the bandwidth
-      buckets to become negative. Fixes bug 544.
-    - Fix a memory leak on exit relays; we were leaking a cached_resolve_t
-      on every successful resolve. Reported by Mike Perry.
-    - Purge old entries from the "rephist" database and the hidden
-      service descriptor database even when DirPort is zero.
-    - Stop thinking that 0.1.2.x directory servers can handle "begin_dir"
-      requests. Should ease bugs 406 and 419 where 0.1.2.x relays are
-      crashing or mis-answering these requests.
-    - When we decide to send a 503 response to a request for servers, do
-      not then also send the server descriptors: this defeats the whole
-      purpose. Fixes bug 539.
-
-  o Minor bugfixes:
-    - Changing the ExitPolicyRejectPrivate setting should cause us to
-      rebuild our server descriptor.
-    - Fix handling of hex nicknames when answering controller requests for
-      networkstatus by name, or when deciding whether to warn about
-      unknown routers in a config option. (Patch from mwenge.)
-    - Fix a couple of hard-to-trigger autoconf problems that could result
-      in really weird results on platforms whose sys/types.h files define
-      nonstandard integer types.
-    - Don't try to create the datadir when running --verify-config or
-      --hash-password. Resolves bug 540.
-    - If we were having problems getting a particular descriptor from the
-      directory caches, and then we learned about a new descriptor for
-      that router, we weren't resetting our failure count. Reported
-      by lodger.
-    - Although we fixed bug 539 (where servers would send HTTP status 503
-      responses _and_ send a body too), there are still servers out there
-      that haven't upgraded. Therefore, make clients parse such bodies
-      when they receive them.
-    - Run correctly on systems where rlim_t is larger than unsigned long.
-      This includes some 64-bit systems.
-    - Run correctly on platforms (like some versions of OS X 10.5) where
-      the real limit for number of open files is OPEN_FILES, not rlim_max
-      from getrlimit(RLIMIT_NOFILES).
-    - Avoid a spurious free on base64 failure.
-    - Avoid segfaults on certain complex invocations of
-      router_get_by_hexdigest().
-    - Fix rare bug on REDIRECTSTREAM control command when called with no
-      port set: it could erroneously report an error when none had
-      happened.
-
-
-Changes in version 0.1.2.18 - 2007-10-28
-  Tor 0.1.2.18 fixes many problems including crash bugs, problems with
-  hidden service introduction that were causing huge delays, and a big
-  bug that was causing some servers to disappear from the network status
-  lists for a few hours each day.
-
-  o Major bugfixes (crashes):
-    - If a connection is shut down abruptly because of something that
-      happened inside connection_flushed_some(), do not call
-      connection_finished_flushing(). Should fix bug 451:
-      "connection_stop_writing: Assertion conn->write_event failed"
-      Bugfix on 0.1.2.7-alpha.
-    - Fix possible segfaults in functions called from
-      rend_process_relay_cell().
-
-  o Major bugfixes (hidden services):
-    - Hidden services were choosing introduction points uniquely by
-      hexdigest, but when constructing the hidden service descriptor
-      they merely wrote the (potentially ambiguous) nickname.
-    - Clients now use the v2 intro format for hidden service
-      connections: they specify their chosen rendezvous point by identity
-      digest rather than by (potentially ambiguous) nickname. These
-      changes could speed up hidden service connections dramatically.
-
-  o Major bugfixes (other):
-    - Stop publishing a new server descriptor just because we get a
-      HUP signal. This led (in a roundabout way) to some servers getting
-      dropped from the networkstatus lists for a few hours each day.
-    - When looking for a circuit to cannibalize, consider family as well
-      as identity. Fixes bug 438. Bugfix on 0.1.0.x (which introduced
-      circuit cannibalization).
-    - When a router wasn't listed in a new networkstatus, we were leaving
-      the flags for that router alone -- meaning it remained Named,
-      Running, etc -- even though absence from the networkstatus means
-      that it shouldn't be considered to exist at all anymore. Now we
-      clear all the flags for routers that fall out of the networkstatus
-      consensus. Fixes bug 529.
-
-  o Minor bugfixes:
-    - Don't try to access (or alter) the state file when running
-      --list-fingerprint or --verify-config or --hash-password. Resolves
-      bug 499.
-    - When generating information telling us how to extend to a given
-      router, do not try to include the nickname if it is
-      absent. Resolves bug 467.
-    - Fix a user-triggerable segfault in expand_filename(). (There isn't
-      a way to trigger this remotely.)
-    - When sending a status event to the controller telling it that an
-      OR address is reachable, set the port correctly. (Previously we
-      were reporting the dir port.)
-    - Fix a minor memory leak whenever a controller sends the PROTOCOLINFO
-      command. Bugfix on 0.1.2.17.
-    - When loading bandwidth history, do not believe any information in
-      the future. Fixes bug 434.
-    - When loading entry guard information, do not believe any information
-      in the future.
-    - When we have our clock set far in the future and generate an
-      onion key, then re-set our clock to be correct, we should not stop
-      the onion key from getting rotated.
-    - On some platforms, accept() can return a broken address. Detect
-      this more quietly, and deal accordingly. Fixes bug 483.
-    - It's not actually an error to find a non-pending entry in the DNS
-      cache when canceling a pending resolve. Don't log unless stuff
-      is fishy. Resolves bug 463.
-    - Don't reset trusted dir server list when we set a configuration
-      option. Patch from Robert Hogan.
-
-
-Changes in version 0.1.2.17 - 2007-08-30
-  Tor 0.1.2.17 features a new Vidalia version in the Windows and OS
-  X bundles. Vidalia 0.0.14 makes authentication required for the
-  ControlPort in the default configuration, which addresses important
-  security risks. Everybody who uses Vidalia (or another controller)
-  should upgrade.
-
-  In addition, this Tor update fixes major load balancing problems with
-  path selection, which should speed things up a lot once many people
-  have upgraded.
-
-  o Major bugfixes (security):
-    - We removed support for the old (v0) control protocol. It has been
-      deprecated since Tor 0.1.1.1-alpha, and keeping it secure has
-      become more of a headache than it's worth.
-
-  o Major bugfixes (load balancing):
-    - When choosing nodes for non-guard positions, weight guards
-      proportionally less, since they already have enough load. Patch
-      from Mike Perry.
-    - Raise the "max believable bandwidth" from 1.5MB/s to 10MB/s. This
-      will allow fast Tor servers to get more attention.
-    - When we're upgrading from an old Tor version, forget our current
-      guards and pick new ones according to the new weightings. These
-      three load balancing patches could raise effective network capacity
-      by a factor of four. Thanks to Mike Perry for measurements.
-
-  o Major bugfixes (stream expiration):
-    - Expire not-yet-successful application streams in all cases if
-      they've been around longer than SocksTimeout. Right now there are
-      some cases where the stream will live forever, demanding a new
-      circuit every 15 seconds. Fixes bug 454; reported by lodger.
-
-  o Minor features (controller):
-    - Add a PROTOCOLINFO controller command. Like AUTHENTICATE, it
-      is valid before any authentication has been received. It tells
-      a controller what kind of authentication is expected, and what
-      protocol is spoken. Implements proposal 119.
-
-  o Minor bugfixes (performance):
-    - Save on most routerlist_assert_ok() calls in routerlist.c, thus
-      greatly speeding up loading cached-routers from disk on startup.
-    - Disable sentinel-based debugging for buffer code: we squashed all
-      the bugs that this was supposed to detect a long time ago, and now
-      its only effect is to change our buffer sizes from nice powers of
-      two (which platform mallocs tend to like) to values slightly over
-      powers of two (which make some platform mallocs sad).
-
-  o Minor bugfixes (misc):
-    - If exit bandwidth ever exceeds one third of total bandwidth, then
-      use the correct formula to weight exit nodes when choosing paths.
-      Based on patch from Mike Perry.
-    - Choose perfectly fairly among routers when choosing by bandwidth and
-      weighting by fraction of bandwidth provided by exits. Previously, we
-      would choose with only approximate fairness, and correct ourselves
-      if we ran off the end of the list.
-    - If we require CookieAuthentication but we fail to write the
-      cookie file, we would warn but not exit, and end up in a state
-      where no controller could authenticate. Now we exit.
-    - If we require CookieAuthentication, stop generating a new cookie
-      every time we change any piece of our config.
-    - Refuse to start with certain directory authority keys, and
-      encourage people using them to stop.
-    - Terminate multi-line control events properly. Original patch
-      from tup.
-    - Fix a minor memory leak when we fail to find enough suitable
-      servers to choose a circuit.
-    - Stop leaking part of the descriptor when we run into a particularly
-      unparseable piece of it.
-
-
-Changes in version 0.1.2.16 - 2007-08-01
-  Tor 0.1.2.16 fixes a critical security vulnerability that allows a
-  remote attacker in certain situations to rewrite the user's torrc
-  configuration file. This can completely compromise anonymity of users
-  in most configurations, including those running the Vidalia bundles,
-  TorK, etc. Or worse.
-
-  o Major security fixes:
-    - Close immediately after missing authentication on control port;
-      do not allow multiple authentication attempts.
-
-
-Changes in version 0.1.2.15 - 2007-07-17
-  Tor 0.1.2.15 fixes several crash bugs, fixes some anonymity-related
-  problems, fixes compilation on BSD, and fixes a variety of other
-  bugs. Everybody should upgrade.
-
-  o Major bugfixes (compilation):
-    - Fix compile on FreeBSD/NetBSD/OpenBSD. Oops.
-
-  o Major bugfixes (crashes):
-    - Try even harder not to dereference the first character after
-      an mmap(). Reported by lodger.
-    - Fix a crash bug in directory authorities when we re-number the
-      routerlist while inserting a new router.
-    - When the cached-routers file is an even multiple of the page size,
-      don't run off the end and crash. (Fixes bug 455; based on idea
-      from croup.)
-    - Fix eventdns.c behavior on Solaris: It is critical to include
-      orconfig.h _before_ sys/types.h, so that we can get the expected
-      definition of _FILE_OFFSET_BITS.
-
-  o Major bugfixes (security):
-    - Fix a possible buffer overrun when using BSD natd support. Bug
-      found by croup.
-    - When sending destroy cells from a circuit's origin, don't include
-      the reason for tearing down the circuit. The spec says we didn't,
-      and now we actually don't. Reported by lodger.
-    - Keep streamids from different exits on a circuit separate. This
-      bug may have allowed other routers on a given circuit to inject
-      cells into streams. Reported by lodger; fixes bug 446.
-    - If there's a never-before-connected-to guard node in our list,
-      never choose any guards past it. This way we don't expand our
-      guard list unless we need to.
-
-  o Minor bugfixes (guard nodes):
-    - Weight guard selection by bandwidth, so that low-bandwidth nodes
-      don't get overused as guards.
-
-  o Minor bugfixes (directory):
-    - Correctly count the number of authorities that recommend each
-      version. Previously, we were under-counting by 1.
-    - Fix a potential crash bug when we load many server descriptors at
-      once and some of them make others of them obsolete. Fixes bug 458.
-
-  o Minor bugfixes (hidden services):
-    - Stop tearing down the whole circuit when the user asks for a
-      connection to a port that the hidden service didn't configure.
-      Resolves bug 444.
-
-  o Minor bugfixes (misc):
-    - On Windows, we were preventing other processes from reading
-      cached-routers while Tor was running. Reported by janbar.
-    - Fix a possible (but very unlikely) bug in picking routers by
-      bandwidth. Add a log message to confirm that it is in fact
-      unlikely. Patch from lodger.
-    - Backport a couple of memory leak fixes.
-    - Backport miscellaneous cosmetic bugfixes.
-
-
-Changes in version 0.1.2.14 - 2007-05-25
-  Tor 0.1.2.14 changes the addresses of two directory authorities (this
-  change especially affects those who serve or use hidden services),
-  and fixes several other crash- and security-related bugs.
-
-  o Directory authority changes:
-    - Two directory authorities (moria1 and moria2) just moved to new
-      IP addresses. This change will particularly affect those who serve
-      or use hidden services.
-
-  o Major bugfixes (crashes):
-    - If a directory server runs out of space in the connection table
-      as it's processing a begin_dir request, it will free the exit stream
-      but leave it attached to the circuit, leading to unpredictable
-      behavior. (Reported by seeess, fixes bug 425.)
-    - Fix a bug in dirserv_remove_invalid() that would cause authorities
-      to corrupt memory under some really unlikely scenarios.
-    - Tighten router parsing rules. (Bugs reported by Benedikt Boss.)
-    - Avoid segfaults when reading from mmaped descriptor file. (Reported
-      by lodger.)
-
-  o Major bugfixes (security):
-    - When choosing an entry guard for a circuit, avoid using guards
-      that are in the same family as the chosen exit -- not just guards
-      that are exactly the chosen exit. (Reported by lodger.)
-
-  o Major bugfixes (resource management):
-    - If a directory authority is down, skip it when deciding where to get
-      networkstatus objects or descriptors. Otherwise we keep asking
-      every 10 seconds forever. Fixes bug 384.
-    - Count it as a failure if we fetch a valid network-status but we
-      don't want to keep it. Otherwise we'll keep fetching it and keep
-      not wanting to keep it. Fixes part of bug 422.
-    - If all of our dirservers have given us bad or no networkstatuses
-      lately, then stop hammering them once per minute even when we
-      think they're failed. Fixes another part of bug 422.
-
-  o Minor bugfixes:
-    - Actually set the purpose correctly for descriptors inserted with
-      purpose=controller.
-    - When we have k non-v2 authorities in our DirServer config,
-      we ignored the last k authorities in the list when updating our
-      network-statuses.
-    - Correctly back-off from requesting router descriptors that we are
-      having a hard time downloading.
-    - Read resolv.conf files correctly on platforms where read() returns
-      partial results on small file reads.
-    - Don't rebuild the entire router store every time we get 32K of
-      routers: rebuild it when the journal gets very large, or when
-      the gaps in the store get very large.
-
-  o Minor features:
-    - When routers publish SVN revisions in their router descriptors,
-      authorities now include those versions correctly in networkstatus
-      documents.
-    - Warn when using a version of libevent before 1.3b to run a server on
-      OSX or BSD: these versions interact badly with userspace threads.
-
-
-Changes in version 0.1.2.13 - 2007-04-24
-  This release features some major anonymity fixes, such as safer path
-  selection; better client performance; faster bootstrapping, better
-  address detection, and better DNS support for servers; write limiting as
-  well as read limiting to make servers easier to run; and a huge pile of
-  other features and bug fixes. The bundles also ship with Vidalia 0.0.11.
-
-  Tor 0.1.2.13 is released in memory of Rob Levin (1955-2006), aka lilo
-  of the Freenode IRC network, remembering his patience and vision for
-  free speech on the Internet.
-
-  o Major features, client performance:
-    - Weight directory requests by advertised bandwidth. Now we can
-      let servers enable write limiting but still allow most clients to
-      succeed at their directory requests. (We still ignore weights when
-      choosing a directory authority; I hope this is a feature.)
-    - Stop overloading exit nodes -- avoid choosing them for entry or
-      middle hops when the total bandwidth available from non-exit nodes
-      is much higher than the total bandwidth available from exit nodes.
-    - Rather than waiting a fixed amount of time between retrying
-      application connections, we wait only 10 seconds for the first,
-      10 seconds for the second, and 15 seconds for each retry after
-      that. Hopefully this will improve the expected user experience.
-    - Sometimes we didn't bother sending a RELAY_END cell when an attempt
-      to open a stream fails; now we do in more cases. This should
-      make clients able to find a good exit faster in some cases, since
-      unhandleable requests will now get an error rather than timing out.
-
-  o Major features, client functionality:
-    - Implement BEGIN_DIR cells, so we can connect to a directory
-      server via TLS to do encrypted directory requests rather than
-      plaintext. Enable via the TunnelDirConns and PreferTunneledDirConns
-      config options if you like. For now, this feature only works if
-      you already have a descriptor for the destination dirserver.
-    - Add support for transparent application connections: this basically
-      bundles the functionality of trans-proxy-tor into the Tor
-      mainline. Now hosts with compliant pf/netfilter implementations
-      can redirect TCP connections straight to Tor without diverting
-      through SOCKS. (Based on patch from tup.)
-    - Add support for using natd; this allows FreeBSDs earlier than
-      5.1.2 to have ipfw send connections through Tor without using
-      SOCKS. (Patch from Zajcev Evgeny with tweaks from tup.)
-
-  o Major features, servers:
-    - Setting up a dyndns name for your server is now optional: servers
-      with no hostname or IP address will learn their IP address by
-      asking the directory authorities. This code only kicks in when you
-      would normally have exited with a "no address" error. Nothing's
-      authenticated, so use with care.
-    - Directory servers now spool server descriptors, v1 directories,
-      and v2 networkstatus objects to buffers as needed rather than en
-      masse. They also mmap the cached-routers files. These steps save
-      lots of memory.
-    - Stop requiring clients to have well-formed certificates, and stop
-      checking nicknames in certificates. (Clients have certificates so
-      that they can look like Tor servers, but in the future we might want
-      to allow them to look like regular TLS clients instead. Nicknames
-      in certificates serve no purpose other than making our protocol
-      easier to recognize on the wire.) Implements proposal 106.
-
-  o Improvements on DNS support:
-    - Add "eventdns" asynchronous dns library originally based on code
-      from Adam Langley. Now we can discard the old rickety dnsworker
-      concept, and support a wider variety of DNS functions. Allows
-      multithreaded builds on NetBSD and OpenBSD again.
-    - Add server-side support for "reverse" DNS lookups (using PTR
-      records so clients can determine the canonical hostname for a given
-      IPv4 address). Only supported by servers using eventdns; servers
-      now announce in their descriptors if they don't support eventdns.
-    - Workaround for name servers (like Earthlink's) that hijack failing
-      DNS requests and replace the no-such-server answer with a "helpful"
-      redirect to an advertising-driven search portal. Also work around
-      DNS hijackers who "helpfully" decline to hijack known-invalid
-      RFC2606 addresses. Config option "ServerDNSDetectHijacking 0"
-      lets you turn it off.
-    - Servers now check for the case when common DNS requests are going to
-      wildcarded addresses (i.e. all getting the same answer), and change
-      their exit policy to reject *:* if it's happening.
-    - When asked to resolve a hostname, don't use non-exit servers unless
-      requested to do so. This allows servers with broken DNS to be
-      useful to the network.
-    - Start passing "ipv4" hints to getaddrinfo(), so servers don't do
-      useless IPv6 DNS resolves.
-    - Specify and implement client-side SOCKS5 interface for reverse DNS
-      lookups (see doc/socks-extensions.txt). Also cache them.
-    - When we change nameservers or IP addresses, reset and re-launch
-      our tests for DNS hijacking.
-
-  o Improvements on reachability testing:
-    - Servers send out a burst of long-range padding cells once they've
-      established that they're reachable. Spread them over 4 circuits,
-      so hopefully a few will be fast. This exercises bandwidth and
-      bootstraps them into the directory more quickly.
-    - When we find our DirPort to be reachable, publish a new descriptor
-      so we'll tell the world (reported by pnx).
-    - Directory authorities now only decide that routers are reachable
-      if their identity keys are as expected.
-    - Do DirPort reachability tests less often, since a single test
-      chews through many circuits before giving up.
-    - Avoid some false positives during reachability testing: don't try
-      to test via a server that's on the same /24 network as us.
-    - Start publishing one minute or so after we find our ORPort
-      to be reachable. This will help reduce the number of descriptors
-      we have for ourselves floating around, since it's quite likely
-      other things (e.g. DirPort) will change during that minute too.
-    - Routers no longer try to rebuild long-term connections to directory
-      authorities, and directory authorities no longer try to rebuild
-      long-term connections to all servers. We still don't hang up
-      connections in these two cases though -- we need to look at it
-      more carefully to avoid flapping, and we likely need to wait til
-      0.1.1.x is obsolete.
-
-  o Improvements on rate limiting:
-    - Enable write limiting as well as read limiting. Now we sacrifice
-      capacity if we're pushing out lots of directory traffic, rather
-      than overrunning the user's intended bandwidth limits.
-    - Include TLS overhead when counting bandwidth usage; previously, we
-      would count only the bytes sent over TLS, but not the bytes used
-      to send them.
-    - Servers decline directory requests much more aggressively when
-      they're low on bandwidth. Otherwise they end up queueing more and
-      more directory responses, which can't be good for latency.
-    - But never refuse directory requests from local addresses.
-    - Be willing to read or write on local connections (e.g. controller
-      connections) even when the global rate limiting buckets are empty.
-    - Flush local controller connection buffers periodically as we're
-      writing to them, so we avoid queueing 4+ megabytes of data before
-      trying to flush.
-    - Revise and clean up the torrc.sample that we ship with; add
-      a section for BandwidthRate and BandwidthBurst.
-
-  o Major features, NT services:
-    - Install as NT_AUTHORITY\LocalService rather than as SYSTEM; add a
-      command-line flag so that admins can override the default by saying
-      "tor --service install --user "SomeUser"". This will not affect
-      existing installed services. Also, warn the user that the service
-      will look for its configuration file in the service user's
-      %appdata% directory. (We can't do the "hardwire the user's appdata
-      directory" trick any more, since we may not have read access to that
-      directory.)
-    - Support running the Tor service with a torrc not in the same
-      directory as tor.exe and default to using the torrc located in
-      the %appdata%\Tor\ of the user who installed the service. Patch
-      from Matt Edman.
-    - Add an --ignore-missing-torrc command-line option so that we can
-      get the "use sensible defaults if the configuration file doesn't
-      exist" behavior even when specifying a torrc location on the
-      command line.
-    - When stopping an NT service, wait up to 10 sec for it to actually
-      stop. (Patch from Matt Edman; resolves bug 295.)
-
-  o Directory authority improvements:
-    - Stop letting hibernating or obsolete servers affect uptime and
-      bandwidth cutoffs.
-    - Stop listing hibernating servers in the v1 directory.
-    - Authorities no longer recommend exits as guards if this would shift
-      too much load to the exit nodes.
-    - Authorities now specify server versions in networkstatus. This adds
-      about 2% to the size of compressed networkstatus docs, and allows
-      clients to tell which servers support BEGIN_DIR and which don't.
-      The implementation is forward-compatible with a proposed future
-      protocol version scheme not tied to Tor versions.
-    - DirServer configuration lines now have an orport= option so
-      clients can open encrypted tunnels to the authorities without
-      having downloaded their descriptors yet. Enabled for moria1,
-      moria2, tor26, and lefkada now in the default configuration.
-    - Add a BadDirectory flag to network status docs so that authorities
-      can (eventually) tell clients about caches they believe to be
-      broken. Not used yet.
-    - Allow authorities to list nodes as bad exits in their
-      approved-routers file by fingerprint or by address. If most
-      authorities set a BadExit flag for a server, clients don't think
-      of it as a general-purpose exit. Clients only consider authorities
-      that advertise themselves as listing bad exits.
-    - Patch from Steve Hildrey: Generate network status correctly on
-      non-versioning dirservers.
-    - Have directory authorities allow larger amounts of drift in uptime
-      without replacing the server descriptor: previously, a server that
-      restarted every 30 minutes could have 48 "interesting" descriptors
-      per day.
-    - Reserve the nickname "Unnamed" for routers that can't pick
-      a hostname: any router can call itself Unnamed; directory
-      authorities will never allocate Unnamed to any particular router;
-      clients won't believe that any router is the canonical Unnamed.
-
-  o Directory mirrors and clients:
-    - Discard any v1 directory info that's over 1 month old (for
-      directories) or over 1 week old (for running-routers lists).
-    - Clients track responses with status 503 from dirservers. After a
-      dirserver has given us a 503, we try not to use it until an hour has
-      gone by, or until we have no dirservers that haven't given us a 503.
-    - When we get a 503 from a directory, and we're not a server, we no
-      longer count the failure against the total number of failures
-      allowed for the object we're trying to download.
-    - Prepare for servers to publish descriptors less often: never
-      discard a descriptor simply for being too old until either it is
-      recommended by no authorities, or until we get a better one for
-      the same router. Make caches consider retaining old recommended
-      routers for even longer.
-    - Directory servers now provide 'Pragma: no-cache' and 'Expires'
-      headers for content, so that we can work better in the presence of
-      caching HTTP proxies.
-    - Stop fetching descriptors if you're not a dir mirror and you
-      haven't tried to establish any circuits lately. (This currently
-      causes some dangerous behavior, because when you start up again
-      you'll use your ancient server descriptors.)
-
-  o Major fixes, crashes:
-    - Stop crashing when the controller asks us to resetconf more than
-      one config option at once. (Vidalia 0.0.11 does this.)
-    - Fix a longstanding obscure crash bug that could occur when we run
-      out of DNS worker processes, if we're not using eventdns. (Resolves
-      bug 390.)
-    - Fix an assert that could trigger if a controller quickly set then
-      cleared EntryNodes. (Bug found by Udo van den Heuvel.)
-    - Avoid crash when telling controller about stream-status and a
-      stream is detached.
-    - Avoid sending junk to controllers or segfaulting when a controller
-      uses EVENT_NEW_DESC with verbose nicknames.
-    - Stop triggering asserts if the controller tries to extend hidden
-      service circuits (reported by mwenge).
-    - If we start a server with ClientOnly 1, then set ClientOnly to 0
-      and hup, stop triggering an assert based on an empty onion_key.
-    - Mask out all signals in sub-threads; only the libevent signal
-      handler should be processing them. This should prevent some crashes
-      on some machines using pthreads. (Patch from coderman.)
-    - Disable kqueue on OS X 10.3 and earlier, to fix bug 371.
-
-  o Major fixes, anonymity/security:
-    - Automatically avoid picking more than one node from the same
-      /16 network when constructing a circuit. Add an
-      "EnforceDistinctSubnets" option to let people disable it if they
-      want to operate private test networks on a single subnet.
-    - When generating bandwidth history, round down to the nearest
-      1k. When storing accounting data, round up to the nearest 1k.
-    - When we're running as a server, remember when we last rotated onion
-      keys, so that we will rotate keys once they're a week old even if
-      we never stay up for a week ourselves.
-    - If a client asked for a server by name, and there's a named server
-      in our network-status but we don't have its descriptor yet, we
-      could return an unnamed server instead.
-    - Reject (most) attempts to use Tor circuits with length one. (If
-      many people start using Tor as a one-hop proxy, exit nodes become
-      a more attractive target for compromise.)
-    - Just because your DirPort is open doesn't mean people should be
-      able to remotely teach you about hidden service descriptors. Now
-      only accept rendezvous posts if you've got HSAuthoritativeDir set.
-    - Fix a potential race condition in the rpm installer. Found by
-      Stefan Nordhausen.
-    - Do not log IPs with TLS failures for incoming TLS
-      connections. (Fixes bug 382.)
-
-  o Major fixes, other:
-    - If our system clock jumps back in time, don't publish a negative
-      uptime in the descriptor.
-    - When we start during an accounting interval before it's time to wake
-      up, remember to wake up at the correct time. (May fix bug 342.)
-    - Previously, we would cache up to 16 old networkstatus documents
-      indefinitely, if they came from nontrusted authorities. Now we
-      discard them if they are more than 10 days old.
-    - When we have a state file we cannot parse, tell the user and
-      move it aside. Now we avoid situations where the user starts
-      Tor in 1904, Tor writes a state file with that timestamp in it,
-      the user fixes her clock, and Tor refuses to start.
-    - Publish a new descriptor after we hup/reload. This is important
-      if our config has changed such that we'll want to start advertising
-      our DirPort now, etc.
-    - If we are using an exit enclave and we can't connect, e.g. because
-      its webserver is misconfigured to not listen on localhost, then
-      back off and try connecting from somewhere else before we fail.
-
-  o New config options or behaviors:
-    - When EntryNodes are configured, rebuild the guard list to contain,
-      in order: the EntryNodes that were guards before; the rest of the
-      EntryNodes; the nodes that were guards before.
-    - Do not warn when individual nodes in the configuration's EntryNodes,
-      ExitNodes, etc are down: warn only when all possible nodes
-      are down. (Fixes bug 348.)
-    - Put a lower-bound on MaxAdvertisedBandwidth.
-    - Start using the state file to store bandwidth accounting data:
-      the bw_accounting file is now obsolete. We'll keep generating it
-      for a while for people who are still using 0.1.2.4-alpha.
-    - Try to batch changes to the state file so that we do as few
-      disk writes as possible while still storing important things in
-      a timely fashion.
-    - The state file and the bw_accounting file get saved less often when
-      the AvoidDiskWrites config option is set.
-    - Make PIDFile work on Windows.
-    - Add internal descriptions for a bunch of configuration options:
-      accessible via controller interface and in comments in saved
-      options files.
-    - Reject *:563 (NNTPS) in the default exit policy. We already reject
-      NNTP by default, so this seems like a sensible addition.
-    - Clients now reject hostnames with invalid characters. This should
-      avoid some inadvertent info leaks. Add an option
-      AllowNonRFC953Hostnames to disable this behavior, in case somebody
-      is running a private network with hosts called @, !, and #.
-    - Check for addresses with invalid characters at the exit as well,
-      and warn less verbosely when they fail. You can override this by
-      setting ServerDNSAllowNonRFC953Addresses to 1.
-    - Remove some options that have been deprecated since at least
-      0.1.0.x: AccountingMaxKB, LogFile, DebugLogFile, LogLevel, and
-      SysLog. Use AccountingMax instead of AccountingMaxKB, and use Log
-      to set log options. Mark PathlenCoinWeight as obsolete.
-    - Stop accepting certain malformed ports in configured exit policies.
-    - When the user uses bad syntax in the Log config line, stop
-      suggesting other bad syntax as a replacement.
-    - Add new config option "ResolvConf" to let the server operator
-      choose an alternate resolve.conf file when using eventdns.
-    - If one of our entry guards is on the ExcludeNodes list, or the
-      directory authorities don't think it's a good guard, treat it as
-      if it were unlisted: stop using it as a guard, and throw it off
-      the guards list if it stays that way for a long time.
-    - Allow directory authorities to be marked separately as authorities
-      for the v1 directory protocol, the v2 directory protocol, and
-      as hidden service directories, to make it easier to retire old
-      authorities. V1 authorities should set "HSAuthoritativeDir 1"
-      to continue being hidden service authorities too.
-    - Remove 8888 as a LongLivedPort, and add 6697 (IRCS).
-    - Make TrackExitHosts case-insensitive, and fix the behavior of
-      ".suffix" TrackExitHosts items to avoid matching in the middle of
-      an address.
-    - New DirPort behavior: if you have your dirport set, you download
-      descriptors aggressively like a directory mirror, whether or not
-      your ORPort is set.
-
-  o Docs:
-    - Create a new file ReleaseNotes which was the old ChangeLog. The
-      new ChangeLog file now includes the notes for all development
-      versions too.
-    - Add a new address-spec.txt document to describe our special-case
-      addresses: .exit, .onion, and .noconnnect.
-    - Fork the v1 directory protocol into its own spec document,
-      and mark dir-spec.txt as the currently correct (v2) spec.
-
-  o Packaging, porting, and contrib
-    - "tor --verify-config" now exits with -1(255) or 0 depending on
-      whether the config options are bad or good.
-    - The Debian package now uses --verify-config when (re)starting,
-      to distinguish configuration errors from other errors.
-    - Adapt a patch from goodell to let the contrib/exitlist script
-      take arguments rather than require direct editing.
-    - Prevent the contrib/exitlist script from printing the same
-      result more than once.
-    - Add support to tor-resolve tool for reverse lookups and SOCKS5.
-    - In the hidden service example in torrc.sample, stop recommending
-      esoteric and discouraged hidden service options.
-    - Patch from Michael Mohr to contrib/cross.sh, so it checks more
-      values before failing, and always enables eventdns.
-    - Try to detect Windows correctly when cross-compiling.
-    - Libevent-1.2 exports, but does not define in its headers, strlcpy.
-      Try to fix this in configure.in by checking for most functions
-      before we check for libevent.
-    - Update RPMs to require libevent 1.2.
-    - Experimentally re-enable kqueue on OSX when using libevent 1.1b
-      or later. Log when we are doing this, so we can diagnose it when
-      it fails. (Also, recommend libevent 1.1b for kqueue and
-      win32 methods; deprecate libevent 1.0b harder; make libevent
-      recommendation system saner.)
-    - Build with recent (1.3+) libevents on platforms that do not
-      define the nonstandard types "u_int8_t" and friends.
-    - Remove architecture from OS X builds. The official builds are
-      now universal binaries.
-    - Run correctly on OS X platforms with case-sensitive filesystems.
-    - Correctly set maximum connection limit on Cygwin. (This time
-      for sure!)
-    - Start compiling on MinGW on Windows (patches from Mike Chiussi
-      and many others).
-    - Start compiling on MSVC6 on Windows (patches from Frediano Ziglio).
-    - Finally fix the openssl warnings from newer gccs that believe that
-      ignoring a return value is okay, but casting a return value and
-      then ignoring it is a sign of madness.
-    - On architectures where sizeof(int)>4, still clamp declarable
-      bandwidth to INT32_MAX.
-
-  o Minor features, controller:
-    - Warn the user when an application uses the obsolete binary v0
-      control protocol. We're planning to remove support for it during
-      the next development series, so it's good to give people some
-      advance warning.
-    - Add STREAM_BW events to report per-entry-stream bandwidth
-      use. (Patch from Robert Hogan.)
-    - Rate-limit SIGNEWNYM signals in response to controllers that
-      impolitely generate them for every single stream. (Patch from
-      mwenge; closes bug 394.)
-    - Add a REMAP status to stream events to note that a stream's
-      address has changed because of a cached address or a MapAddress
-      directive.
-    - Make REMAP stream events have a SOURCE (cache or exit), and
-      make them generated in every case where we get a successful
-      connected or resolved cell.
-    - Track reasons for OR connection failure; make these reasons
-      available via the controller interface. (Patch from Mike Perry.)
-    - Add a SOCKS_BAD_HOSTNAME client status event so controllers
-      can learn when clients are sending malformed hostnames to Tor.
-    - Specify and implement some of the controller status events.
-    - Have GETINFO dir/status/* work on hosts with DirPort disabled.
-    - Reimplement GETINFO so that info/names stays in sync with the
-      actual keys.
-    - Implement "GETINFO fingerprint".
-    - Implement "SETEVENTS GUARD" so controllers can get updates on
-      entry guard status as it changes.
-    - Make all connections to addresses of the form ".noconnect"
-      immediately get closed. This lets application/controller combos
-      successfully test whether they're talking to the same Tor by
-      watching for STREAM events.
-    - Add a REASON field to CIRC events; for backward compatibility, this
-      field is sent only to controllers that have enabled the extended
-      event format. Also, add additional reason codes to explain why
-      a given circuit has been destroyed or truncated. (Patches from
-      Mike Perry)
-    - Add a REMOTE_REASON field to extended CIRC events to tell the
-      controller why a remote OR told us to close a circuit.
-    - Stream events also now have REASON and REMOTE_REASON fields,
-      working much like those for circuit events.
-    - There's now a GETINFO ns/... field so that controllers can ask Tor
-      about the current status of a router.
-    - A new event type "NS" to inform a controller when our opinion of
-      a router's status has changed.
-    - Add a GETINFO events/names and GETINFO features/names so controllers
-      can tell which events and features are supported.
-    - A new CLEARDNSCACHE signal to allow controllers to clear the
-      client-side DNS cache without expiring circuits.
-    - Fix CIRC controller events so that controllers can learn the
-      identity digests of non-Named servers used in circuit paths.
-    - Let controllers ask for more useful identifiers for servers. Instead
-      of learning identity digests for un-Named servers and nicknames
-      for Named servers, the new identifiers include digest, nickname,
-      and indication of Named status. Off by default; see control-spec.txt
-      for more information.
-    - Add a "getinfo address" controller command so it can display Tor's
-      best guess to the user.
-    - New controller event to alert the controller when our server
-      descriptor has changed.
-    - Give more meaningful errors on controller authentication failure.
-    - Export the default exit policy via the control port, so controllers
-      don't need to guess what it is / will be later.
-
-  o Minor bugfixes, controller:
-    - When creating a circuit via the controller, send a 'launched'
-      event when we're done, so we follow the spec better.
-    - Correct the control spec to match how the code actually responds
-      to 'getinfo addr-mappings/*'. Reported by daejees.
-    - The control spec described a GUARDS event, but the code
-      implemented a GUARD event. Standardize on GUARD, but let people
-      ask for GUARDS too. Reported by daejees.
-    - Give the controller END_STREAM_REASON_DESTROY events _before_ we
-      clear the corresponding on_circuit variable, and remember later
-      that we don't need to send a redundant CLOSED event. (Resolves part
-      3 of bug 367.)
-    - Report events where a resolve succeeded or where we got a socks
-      protocol error correctly, rather than calling both of them
-      "INTERNAL".
-    - Change reported stream target addresses to IP consistently when
-      we finally get the IP from an exit node.
-    - Send log messages to the controller even if they happen to be very
-      long.
-    - Flush ERR-level controller status events just like we currently
-      flush ERR-level log events, so that a Tor shutdown doesn't prevent
-      the controller from learning about current events.
-    - Report the circuit number correctly in STREAM CLOSED events. Bug
-      reported by Mike Perry.
-    - Do not report bizarre values for results of accounting GETINFOs
-      when the last second's write or read exceeds the allotted bandwidth.
-    - Report "unrecognized key" rather than an empty string when the
-      controller tries to fetch a networkstatus that doesn't exist.
-    - When the controller does a "GETINFO network-status", tell it
-      about even those routers whose descriptors are very old, and use
-      long nicknames where appropriate.
-    - Fix handling of verbose nicknames with ORCONN controller events:
-      make them show up exactly when requested, rather than exactly when
-      not requested.
-    - Controller signals now work on non-Unix platforms that don't define
-      SIGUSR1 and SIGUSR2 the way we expect.
-    - Respond to SIGNAL command before we execute the signal, in case
-      the signal shuts us down. Suggested by Karsten Loesing.
-    - Handle reporting OR_CONN_EVENT_NEW events to the controller.
-
-  o Minor features, code performance:
-    - Major performance improvement on inserting descriptors: change
-      algorithm from O(n^2) to O(n).
-    - Do not rotate onion key immediately after setting it for the first
-      time.
-    - Call router_have_min_dir_info half as often. (This is showing up in
-      some profiles, but not others.)
-    - When using GCC, make log_debug never get called at all, and its
-      arguments never get evaluated, when no debug logs are configured.
-      (This is showing up in some profiles, but not others.)
-    - Statistics dumped by -USR2 now include a breakdown of public key
-      operations, for profiling.
-    - Make the common memory allocation path faster on machines where
-      malloc(0) returns a pointer.
-    - Split circuit_t into origin_circuit_t and or_circuit_t, and
-      split connection_t into edge, or, dir, control, and base structs.
-      These will save quite a bit of memory on busy servers, and they'll
-      also help us track down bugs in the code and bugs in the spec.
-    - Use OpenSSL's AES implementation on platforms where it's faster.
-      This could save us as much as 10% CPU usage.
-
-  o Minor features, descriptors and descriptor handling:
-    - Avoid duplicate entries on MyFamily line in server descriptor.
-    - When Tor receives a router descriptor that it asked for, but
-      no longer wants (because it has received fresh networkstatuses
-      in the meantime), do not warn the user. Cache the descriptor if
-      we're a cache; drop it if we aren't.
-    - Servers no longer ever list themselves in their "family" line,
-      even if configured to do so. This makes it easier to configure
-      family lists conveniently.
-
-  o Minor fixes, confusing/misleading log messages:
-    - Display correct results when reporting which versions are
-      recommended, and how recommended they are. (Resolves bug 383.)
-    - Inform the server operator when we decide not to advertise a
-      DirPort due to AccountingMax enabled or a low BandwidthRate.
-    - Only include function names in log messages for info/debug messages.
-      For notice/warn/err, the content of the message should be clear on
-      its own, and printing the function name only confuses users.
-    - Remove even more protocol-related warnings from Tor server logs,
-      such as bad TLS handshakes and malformed begin cells.
-    - Fix bug 314: Tor clients issued "unsafe socks" warnings even
-      when the IP address is mapped through MapAddress to a hostname.
-    - Fix misleading log messages: an entry guard that is "unlisted",
-      as well as not known to be "down" (because we've never heard
-      of it), is not therefore "up".
-
-  o Minor fixes, old/obsolete behavior:
-    - Start assuming we can use a create_fast cell if we don't know
-      what version a router is running.
-    - We no longer look for identity and onion keys in "identity.key" and
-      "onion.key" -- these were replaced by secret_id_key and
-      secret_onion_key in 0.0.8pre1.
-    - We no longer require unrecognized directory entries to be
-      preceded by "opt".
-    - Drop compatibility with obsolete Tors that permit create cells
-      to have the wrong circ_id_type.
-    - Remove code to special-case "-cvs" ending, since it has not
-      actually mattered since 0.0.9.
-    - Don't re-write the fingerprint file every restart, unless it has
-      changed.
-
-  o Minor fixes, misc client-side behavior:
-    - Always remove expired routers and networkstatus docs before checking
-      whether we have enough information to build circuits. (Fixes
-      bug 373.)
-    - When computing clock skew from directory HTTP headers, consider what
-      time it was when we finished asking for the directory, not what
-      time it is now.
-    - Make our socks5 handling more robust to broken socks clients:
-      throw out everything waiting on the buffer in between socks
-      handshake phases, since they can't possibly (so the theory
-      goes) have predicted what we plan to respond to them.
-    - Expire socks connections if they spend too long waiting for the
-      handshake to finish. Previously we would let them sit around for
-      days, if the connecting application didn't close them either.
-    - And if the socks handshake hasn't started, don't send a
-      "DNS resolve socks failed" handshake reply; just close it.
-    - If the user asks to use invalid exit nodes, be willing to use
-      unstable ones.
-    - Track unreachable entry guards correctly: don't conflate
-      'unreachable by us right now' with 'listed as down by the directory
-      authorities'. With the old code, if a guard was unreachable by us
-      but listed as running, it would clog our guard list forever.
-    - Behave correctly in case we ever have a network with more than
-      2GB/s total advertised capacity.
-    - Claim a commonname of Tor, rather than TOR, in TLS handshakes.
-    - Fix a memory leak when we ask for "all" networkstatuses and we
-      get one we don't recognize.
-
-
-Changes in version 0.1.1.26 - 2006-12-14
-  o Security bugfixes:
-    - Stop sending the HttpProxyAuthenticator string to directory
-      servers when directory connections are tunnelled through Tor.
-    - Clients no longer store bandwidth history in the state file.
-    - Do not log introduction points for hidden services if SafeLogging
-      is set.
-
-  o Minor bugfixes:
-    - Fix an assert failure when a directory authority sets
-      AuthDirRejectUnlisted and then receives a descriptor from an
-      unlisted router (reported by seeess).
-
-
-Changes in version 0.1.1.25 - 2006-11-04
-  o Major bugfixes:
-    - When a client asks us to resolve (rather than connect to)
-      an address, and we have a cached answer, give them the cached
-      answer. Previously, we would give them no answer at all.
-    - We were building exactly the wrong circuits when we predict
-      hidden service requirements, meaning Tor would have to build all
-      its circuits on demand.
-    - If none of our live entry guards have a high uptime, but we
-      require a guard with a high uptime, try adding a new guard before
-      we give up on the requirement. This patch should make long-lived
-      connections more stable on average.
-    - When testing reachability of our DirPort, don't launch new
-      tests when there's already one in progress -- unreachable
-      servers were stacking up dozens of testing streams.
-
-  o Security bugfixes:
-    - When the user sends a NEWNYM signal, clear the client-side DNS
-      cache too. Otherwise we continue to act on previous information.
-
-  o Minor bugfixes:
-    - Avoid a memory corruption bug when creating a hash table for
-      the first time.
-    - Avoid possibility of controller-triggered crash when misusing
-      certain commands from a v0 controller on platforms that do not
-      handle printf("%s",NULL) gracefully.
-    - Avoid infinite loop on unexpected controller input.
-    - Don't log spurious warnings when we see a circuit close reason we
-      don't recognize; it's probably just from a newer version of Tor.
-    - Add Vidalia to the OS X uninstaller script, so when we uninstall
-      Tor/Privoxy we also uninstall Vidalia.
-
-
-Changes in version 0.1.1.24 - 2006-09-29
-  o Major bugfixes:
-    - Allow really slow clients to not hang up five minutes into their
-      directory downloads (suggested by Adam J. Richter).
-    - Fix major performance regression from 0.1.0.x: instead of checking
-      whether we have enough directory information every time we want to
-      do something, only check when the directory information has changed.
-      This should improve client CPU usage by 25-50%.
-    - Don't crash if, after a server has been running for a while,
-      it can't resolve its hostname.
-    - When a client asks us to resolve (not connect to) an address,
-      and we have a cached answer, give them the cached answer.
-      Previously, we would give them no answer at all.
-
-  o Minor bugfixes:
-    - Allow Tor to start when RunAsDaemon is set but no logs are set.
-    - Don't crash when the controller receives a third argument to an
-      "extendcircuit" request.
-    - Controller protocol fixes: fix encoding in "getinfo addr-mappings"
-      response; fix error code when "getinfo dir/status/" fails.
-    - Fix configure.in to not produce broken configure files with
-      more recent versions of autoconf. Thanks to Clint for his auto*
-      voodoo.
-    - Fix security bug on NetBSD that could allow someone to force
-      uninitialized RAM to be sent to a server's DNS resolver. This
-      only affects NetBSD and other platforms that do not bounds-check
-      tolower().
-    - Warn user when using libevent 1.1a or earlier with win32 or kqueue
-      methods: these are known to be buggy.
-    - If we're a directory mirror and we ask for "all" network status
-      documents, we would discard status documents from authorities
-      we don't recognize.
-
-
-Changes in version 0.1.1.23 - 2006-07-30
-  o Major bugfixes:
-    - Fast Tor servers, especially exit nodes, were triggering asserts
-      due to a bug in handling the list of pending DNS resolves. Some
-      bugs still remain here; we're hunting them.
-    - Entry guards could crash clients by sending unexpected input.
-    - More fixes on reachability testing: if you find yourself reachable,
-      then don't ever make any client requests (so you stop predicting
-      circuits), then hup or have your clock jump, then later your IP
-      changes, you won't think circuits are working, so you won't try to
-      test reachability, so you won't publish.
-
-  o Minor bugfixes:
-    - Avoid a crash if the controller does a resetconf firewallports
-      and then a setconf fascistfirewall=1.
-    - Avoid an integer underflow when the dir authority decides whether
-      a router is stable: we might wrongly label it stable, and compute
-      a slightly wrong median stability, when a descriptor is published
-      later than now.
-    - Fix a place where we might trigger an assert if we can't build our
-      own server descriptor yet.
-
-
-Changes in version 0.1.1.22 - 2006-07-05
-  o Major bugfixes:
-    - Fix a big bug that was causing servers to not find themselves
-      reachable if they changed IP addresses. Since only 0.1.1.22+
-      servers can do reachability testing correctly, now we automatically
-      make sure to test via one of these.
-    - Fix to allow clients and mirrors to learn directory info from
-      descriptor downloads that get cut off partway through.
-    - Directory authorities had a bug in deciding if a newly published
-      descriptor was novel enough to make everybody want a copy -- a few
-      servers seem to be publishing new descriptors many times a minute.
-  o Minor bugfixes:
-    - Fix a rare bug that was causing some servers to complain about
-      "closing wedged cpuworkers" and skip some circuit create requests.
-    - Make the Exit flag in directory status documents actually work.
-
-
-Changes in version 0.1.1.21 - 2006-06-10
-  o Crash and assert fixes from 0.1.1.20:
-    - Fix a rare crash on Tor servers that have enabled hibernation.
-    - Fix a seg fault on startup for Tor networks that use only one
-      directory authority.
-    - Fix an assert from a race condition that occurs on Tor servers
-      while exiting, where various threads are trying to log that they're
-      exiting, and delete the logs, at the same time.
-    - Make our unit tests pass again on certain obscure platforms.
-
-  o Other fixes:
-    - Add support for building SUSE RPM packages.
-    - Speed up initial bootstrapping for clients: if we are making our
-      first ever connection to any entry guard, then don't mark it down
-      right after that.
-    - When only one Tor server in the network is labelled as a guard,
-      and we've already picked him, we would cycle endlessly picking him
-      again, being unhappy about it, etc. Now we specifically exclude
-      current guards when picking a new guard.
-    - Servers send create cells more reliably after the TLS connection
-      is established: we were sometimes forgetting to send half of them
-      when we had more than one pending.
-    - If we get a create cell that asks us to extend somewhere, but the
-      Tor server there doesn't match the expected digest, we now send
-      a destroy cell back, rather than silently doing nothing.
-    - Make options->RedirectExit work again.
-    - Make cookie authentication for the controller work again.
-    - Stop being picky about unusual characters in the arguments to
-      mapaddress. It's none of our business.
-    - Add a new config option "TestVia" that lets you specify preferred
-      middle hops to use for test circuits. Perhaps this will let me
-      debug the reachability problems better.
-
-  o Log / documentation fixes:
-    - If we're a server and some peer has a broken TLS certificate, don't
-      log about it unless ProtocolWarnings is set, i.e., we want to hear
-      about protocol violations by others.
-    - Fix spelling of VirtualAddrNetwork in man page.
-    - Add a better explanation at the top of the autogenerated torrc file
-      about what happened to our old torrc.
-
-
-Changes in version 0.1.1.20 - 2006-05-23
-  o Crash and assert fixes from 0.1.0.17:
-    - Fix assert bug in close_logs() on exit: when we close and delete
-      logs, remove them all from the global "logfiles" list.
-    - Fix an assert error when we're out of space in the connection_list
-      and we try to post a hidden service descriptor (reported by Peter
-      Palfrader).
-    - Fix a rare assert error when we've tried all intro points for
-      a hidden service and we try fetching the service descriptor again:
-      "Assertion conn->state != AP_CONN_STATE_RENDDESC_WAIT failed".
-    - Setconf SocksListenAddress kills Tor if it fails to bind. Now back
-      out and refuse the setconf if it would fail.
-    - If you specify a relative torrc path and you set RunAsDaemon in
-      your torrc, then it chdir()'s to the new directory. If you then
-      HUP, it tries to load the new torrc location, fails, and exits.
-      The fix: no longer allow a relative path to torrc when using -f.
-    - Check for integer overflows in more places, when adding elements
-      to smartlists. This could possibly prevent a buffer overflow
-      on malicious huge inputs.
-
-  o Security fixes, major:
-    - When we're printing strings from the network, don't try to print
-      non-printable characters. Now we're safer against shell escape
-      sequence exploits, and also against attacks to fool users into
-      misreading their logs.
-    - Implement entry guards: automatically choose a handful of entry
-      nodes and stick with them for all circuits. Only pick new guards
-      when the ones you have are unsuitable, and if the old guards
-      become suitable again, switch back. This will increase security
-      dramatically against certain end-point attacks. The EntryNodes
-      config option now provides some hints about which entry guards you
-      want to use most; and StrictEntryNodes means to only use those.
-      Fixes CVE-2006-0414.
-    - Implement exit enclaves: if we know an IP address for the
-      destination, and there's a running Tor server at that address
-      which allows exit to the destination, then extend the circuit to
-      that exit first. This provides end-to-end encryption and end-to-end
-      authentication. Also, if the user wants a .exit address or enclave,
-      use 4 hops rather than 3, and cannibalize a general circ for it
-      if you can.
-    - Obey our firewall options more faithfully:
-      . If we can't get to a dirserver directly, try going via Tor.
-      . Don't ever try to connect (as a client) to a place our
-        firewall options forbid.
-      . If we specify a proxy and also firewall options, obey the
-        firewall options even when we're using the proxy: some proxies
-        can only proxy to certain destinations.
-    - Make clients regenerate their keys when their IP address changes.
-    - For the OS X package's modified privoxy config file, comment
-      out the "logfile" line so we don't log everything passed
-      through privoxy.
-    - Our TLS handshakes were generating a single public/private
-      keypair for the TLS context, rather than making a new one for
-      each new connection. Oops. (But we were still rotating them
-      periodically, so it's not so bad.)
-    - When we were cannibalizing a circuit with a particular exit
-      node in mind, we weren't checking to see if that exit node was
-      already present earlier in the circuit. Now we are.
-    - Require server descriptors to list IPv4 addresses -- hostnames
-      are no longer allowed. This also fixes potential vulnerabilities
-      to servers providing hostnames as their address and then
-      preferentially resolving them so they can partition users.
-    - Our logic to decide if the OR we connected to was the right guy
-      was brittle and maybe open to a mitm for invalid routers.
-
-  o Security fixes, minor:
-    - Adjust tor-spec.txt to parameterize cell and key lengths. Now
-      Ian Goldberg can prove things about our handshake protocol more
-      easily.
-    - Make directory authorities generate a separate "guard" flag to
-      mean "would make a good entry guard". Clients now honor the
-      is_guard flag rather than looking at is_fast or is_stable.
-    - Try to list MyFamily elements by key, not by nickname, and warn
-      if we've not heard of a server.
-    - Start using RAND_bytes rather than RAND_pseudo_bytes from
-      OpenSSL. Also, reseed our entropy every hour, not just at
-      startup. And add entropy in 512-bit chunks, not 160-bit chunks.
-    - Refuse server descriptors where the fingerprint line doesn't match
-      the included identity key. Tor doesn't care, but other apps (and
-      humans) might actually be trusting the fingerprint line.
-    - We used to kill the circuit when we receive a relay command we
-      don't recognize. Now we just drop that cell.
-    - Fix a bug found by Lasse Overlier: when we were making internal
-      circuits (intended to be cannibalized later for rendezvous and
-      introduction circuits), we were picking them so that they had
-      useful exit nodes. There was no need for this, and it actually
-      aids some statistical attacks.
-    - Start treating internal circuits and exit circuits separately.
-      It's important to keep them separate because internal circuits
-      have their last hops picked like middle hops, rather than like
-      exit hops. So exiting on them will break the user's expectations.
-    - Fix a possible way to DoS dirservers.
-    - When the client asked for a rendezvous port that the hidden
-      service didn't want to provide, we were sending an IP address
-      back along with the end cell. Fortunately, it was zero. But stop
-      that anyway.
-
-  o Packaging improvements:
-    - Implement --with-libevent-dir option to ./configure. Improve
-      search techniques to find libevent, and use those for openssl too.
-    - Fix a couple of bugs in OpenSSL detection. Deal better when
-      there are multiple SSLs installed with different versions.
-    - Avoid warnings about machine/limits.h on Debian GNU/kFreeBSD.
-    - On non-gcc compilers (e.g. Solaris's cc), use "-g -O" instead of
-      "-Wall -g -O2".
-    - Make unit tests (and other invocations that aren't the real Tor)
-      run without launching listeners, creating subdirectories, and so on.
-    - The OS X installer was adding a symlink for tor_resolve but
-      the binary was called tor-resolve (reported by Thomas Hardly).
-    - Now we can target arch and OS in rpm builds (contributed by
-      Phobos). Also make the resulting dist-rpm filename match the
-      target arch.
-    - Apply Matt Ghali's --with-syslog-facility patch to ./configure
-      if you log to syslog and want something other than LOG_DAEMON.
-    - Fix the torify (tsocks) config file to not use Tor for localhost
-      connections.
-    - Start shipping socks-extensions.txt, tor-doc-unix.html,
-      tor-doc-server.html, and stylesheet.css in the tarball.
-    - Stop shipping tor-doc.html, INSTALL, and README in the tarball.
-      They are useless now.
-    - Add Peter Palfrader's contributed check-tor script. It lets you
-      easily check whether a given server (referenced by nickname)
-      is reachable by you.
-    - Add BSD-style contributed startup script "rc.subr" from Peter
-      Thoenen.
-
-  o Directory improvements -- new directory protocol:
-    - See tor/doc/dir-spec.txt for all the juicy details. Key points:
-    - Authorities and caches publish individual descriptors (by
-      digest, by fingerprint, by "all", and by "tell me yours").
-    - Clients don't download or use the old directory anymore. Now they
-      download network-statuses from the directory authorities, and
-      fetch individual server descriptors as needed from mirrors.
-    - Clients don't download descriptors of non-running servers.
-    - Download descriptors by digest, not by fingerprint. Caches try to
-      download all listed digests from authorities; clients try to
-      download "best" digests from caches. This avoids partitioning
-      and isolating attacks better.
-    - Only upload a new server descriptor when options change, 18
-      hours have passed, uptime is reset, or bandwidth changes a lot.
-    - Directory authorities silently throw away new descriptors that
-      haven't changed much if the timestamps are similar. We do this to
-      tolerate older Tor servers that upload a new descriptor every 15
-      minutes. (It seemed like a good idea at the time.)
-    - Clients choose directory servers from the network status lists,
-      not from their internal list of router descriptors. Now they can
-      go to caches directly rather than needing to go to authorities
-      to bootstrap the first set of descriptors.
-    - When picking a random directory, prefer non-authorities if any
-      are known.
-    - Add a new flag to network-status indicating whether the server
-      can answer v2 directory requests too.
-    - Directory mirrors now cache up to 16 unrecognized network-status
-      docs, so new directory authorities will be cached too.
-    - Stop parsing, storing, or using running-routers output (but
-      mirrors still cache and serve it).
-    - Clients consider a threshold of "versioning" directory authorities
-      before deciding whether to warn the user that he's obsolete.
-    - Authorities publish separate sorted lists of recommended versions
-      for clients and for servers.
-    - Change DirServers config line to note which dirs are v1 authorities.
-    - Put nicknames on the DirServer line, so we can refer to them
-      without requiring all our users to memorize their IP addresses.
-    - Remove option when getting directory cache to see whether they
-      support running-routers; they all do now. Replace it with one
-      to see whether caches support v2 stuff.
-    - Stop listing down or invalid nodes in the v1 directory. This
-      reduces its bulk by about 1/3, and reduces load on mirrors.
-    - Mirrors no longer cache the v1 directory as often.
-    - If we as a directory mirror don't know of any v1 directory
-      authorities, then don't try to cache any v1 directories.
-
-  o Other directory improvements:
-    - Add lefkada.eecs.harvard.edu and tor.dizum.com as fourth and
-      fifth authoritative directory servers.
-    - Directory authorities no longer require an open connection from
-      a server to consider him "reachable". We need this change because
-      when we add new directory authorities, old servers won't know not
-      to hang up on them.
-    - Dir authorities now do their own external reachability testing
-      of each server, and only list as running the ones they found to
-      be reachable. We also send back warnings to the server's logs if
-      it uploads a descriptor that we already believe is unreachable.
-    - Spread the directory authorities' reachability testing over the
-      entire testing interval, so we don't try to do 500 TLS's at once
-      every 20 minutes.
-    - Make the "stable" router flag in network-status be the median of
-      the uptimes of running valid servers, and make clients pay
-      attention to the network-status flags. Thus the cutoff adapts
-      to the stability of the network as a whole, making IRC, IM, etc
-      connections more reliable.
-    - Make the v2 dir's "Fast" flag based on relative capacity, just
-      like "Stable" is based on median uptime. Name everything in the
-      top 7/8 Fast, and only the top 1/2 gets to be a Guard.
-    - Retry directory requests if we fail to get an answer we like
-      from a given dirserver (we were retrying before, but only if
-      we fail to connect).
-    - Return a robots.txt on our dirport to discourage google indexing.
-
-  o Controller protocol improvements:
-    - Revised controller protocol (version 1) that uses ascii rather
-      than binary: tor/doc/control-spec.txt. Add supporting libraries
-      in python and java and c# so you can use the controller from your
-      applications without caring how our protocol works.
-    - Allow the DEBUG controller event to work again. Mark certain log
-      entries as "don't tell this to controllers", so we avoid cycles.
-    - New controller function "getinfo accounting", to ask how
-      many bytes we've used in this time period.
-    - Add a "resetconf" command so you can set config options like
-      AllowUnverifiedNodes and LongLivedPorts to "". Also, if you give
-      a config option in the torrc with no value, then it clears it
-      entirely (rather than setting it to its default).
-    - Add a "getinfo config-file" to tell us where torrc is. Also
-      expose guard nodes, config options/names.
-    - Add a "quit" command (when when using the controller manually).
-    - Add a new signal "newnym" to "change pseudonyms" -- that is, to
-      stop using any currently-dirty circuits for new streams, so we
-      don't link new actions to old actions. This also occurs on HUP
-      or "signal reload".
-    - If we would close a stream early (e.g. it asks for a .exit that
-      we know would refuse it) but the LeaveStreamsUnattached config
-      option is set by the controller, then don't close it.
-    - Add a new controller event type "authdir_newdescs" that allows
-      controllers to get all server descriptors that were uploaded to
-      a router in its role as directory authority.
-    - New controller option "getinfo desc/all-recent" to fetch the
-      latest server descriptor for every router that Tor knows about.
-    - Fix the controller's "attachstream 0" command to treat conn like
-      it just connected, doing address remapping, handling .exit and
-      .onion idioms, and so on. Now we're more uniform in making sure
-      that the controller hears about new and closing connections.
-    - Permit transitioning from ORPort==0 to ORPort!=0, and back, from
-      the controller. Also, rotate dns and cpu workers if the controller
-      changes options that will affect them; and initialize the dns
-      worker cache tree whether or not we start out as a server.
-    - Add a new circuit purpose 'controller' to let the controller ask
-      for a circuit that Tor won't try to use. Extend the "extendcircuit"
-      controller command to let you specify the purpose if you're starting
-      a new circuit.  Add a new "setcircuitpurpose" controller command to
-      let you change a circuit's purpose after it's been created.
-    - Let the controller ask for "getinfo dir/server/foo" so it can ask
-      directly rather than connecting to the dir port. "getinfo
-      dir/status/foo" also works, but currently only if your DirPort
-      is enabled.
-    - Let the controller tell us about certain router descriptors
-      that it doesn't want Tor to use in circuits. Implement
-      "setrouterpurpose" and modify "+postdescriptor" to do this.
-    - If the controller's *setconf commands fail, collect an error
-      message in a string and hand it back to the controller -- don't
-      just tell them to go read their logs.
-
-  o Scalability, resource management, and performance:
-    - Fix a major load balance bug: we were round-robin reading in 16 KB
-      chunks, and servers with bandwidthrate of 20 KB, while downloading
-      a 600 KB directory, would starve their other connections. Now we
-      try to be a bit more fair.
-    - Be more conservative about whether to advertise our DirPort.
-      The main change is to not advertise if we're running at capacity
-      and either a) we could hibernate ever or b) our capacity is low
-      and we're using a default DirPort.
-    - We weren't cannibalizing circuits correctly for
-      CIRCUIT_PURPOSE_C_ESTABLISH_REND and
-      CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, so we were being forced to
-      build those from scratch. This should make hidden services faster.
-    - Predict required circuits better, with an eye toward making hidden
-      services faster on the service end.
-    - Compress exit policies even more: look for duplicate lines and
-      remove them.
-    - Generate 18.0.0.0/8 address policy format in descs when we can;
-      warn when the mask is not reducible to a bit-prefix.
-    - There used to be two ways to specify your listening ports in a
-      server descriptor: on the "router" line and with a separate "ports"
-      line. Remove support for the "ports" line.
-    - Reduce memory requirements in our structs by changing the order
-      of fields. Replace balanced trees with hash tables. Inline
-      bottleneck smartlist functions. Add a "Map from digest to void*"
-      abstraction so we can do less hex encoding/decoding, and use it
-      in router_get_by_digest(). Many other CPU and memory improvements.
-    - Allow tor_gzip_uncompress to extract as much as possible from
-      truncated compressed data. Try to extract as many
-      descriptors as possible from truncated http responses (when
-      purpose is DIR_PURPOSE_FETCH_ROUTERDESC).
-    - Make circ->onionskin a pointer, not a static array. moria2 was using
-      125000 circuit_t's after it had been up for a few weeks, which
-      translates to 20+ megs of wasted space.
-    - The private half of our EDH handshake keys are now chosen out
-      of 320 bits, not 1024 bits. (Suggested by Ian Goldberg.)
-    - Stop doing the complex voodoo overkill checking for insecure
-      Diffie-Hellman keys. Just check if it's in [2,p-2] and be happy.
-    - Do round-robin writes for TLS of at most 16 kB per write. This
-      might be more fair on loaded Tor servers.
-    - Do not use unaligned memory access on alpha, mips, or mipsel.
-      It *works*, but is very slow, so we treat them as if it doesn't.
-
-  o Other bugfixes and improvements:
-    - Start storing useful information to $DATADIR/state, so we can
-      remember things across invocations of Tor. Retain unrecognized
-      lines so we can be forward-compatible, and write a TorVersion line
-      so we can be backward-compatible.
-    - If ORPort is set, Address is not explicitly set, and our hostname
-      resolves to a private IP address, try to use an interface address
-      if it has a public address. Now Windows machines that think of
-      themselves as localhost can guess their address.
-    - Regenerate our local descriptor if it's dirty and we try to use
-      it locally (e.g. if it changes during reachability detection).
-      This was causing some Tor servers to keep publishing the same
-      initial descriptor forever.
-    - Tor servers with dynamic IP addresses were needing to wait 18
-      hours before they could start doing reachability testing using
-      the new IP address and ports. This is because they were using
-      the internal descriptor to learn what to test, yet they were only
-      rebuilding the descriptor once they decided they were reachable.
-    - It turns out we couldn't bootstrap a network since we added
-      reachability detection in 0.1.0.1-rc. Good thing the Tor network
-      has never gone down. Add an AssumeReachable config option to let
-      servers and authorities bootstrap. When we're trying to build a
-      high-uptime or high-bandwidth circuit but there aren't enough
-      suitable servers, try being less picky rather than simply failing.
-    - Newly bootstrapped Tor networks couldn't establish hidden service
-      circuits until they had nodes with high uptime. Be more tolerant.
-    - Really busy servers were keeping enough circuits open on stable
-      connections that they were wrapping around the circuit_id
-      space. (It's only two bytes.) This exposed a bug where we would
-      feel free to reuse a circuit_id even if it still exists but has
-      been marked for close. Try to fix this bug. Some bug remains.
-    - When we fail to bind or listen on an incoming or outgoing
-      socket, we now close it before refusing, rather than just
-      leaking it. (Thanks to Peter Palfrader for finding.)
-    - Fix a file descriptor leak in start_daemon().
-    - On Windows, you can't always reopen a port right after you've
-      closed it. So change retry_listeners() to only close and re-open
-      ports that have changed.
-    - Workaround a problem with some http proxies that refuse GET
-      requests that specify "Content-Length: 0". Reported by Adrian.
-    - Recover better from TCP connections to Tor servers that are
-      broken but don't tell you (it happens!); and rotate TLS
-      connections once a week.
-    - Fix a scary-looking but apparently harmless bug where circuits
-      would sometimes start out in state CIRCUIT_STATE_OR_WAIT at
-      servers, and never switch to state CIRCUIT_STATE_OPEN.
-    - Check for even more Windows version flags when writing the platform
-      string in server descriptors, and note any we don't recognize.
-    - Add reasons to DESTROY and RELAY_TRUNCATED cells, so clients can
-      get a better idea of why their circuits failed. Not used yet.
-    - Add TTLs to RESOLVED, CONNECTED, and END_REASON_EXITPOLICY cells.
-      We don't use them yet, but maybe one day our DNS resolver will be
-      able to discover them.
-    - Let people type "tor --install" as well as "tor -install" when they
-      want to make it an NT service.
-    - Looks like we were never delivering deflated (i.e. compressed)
-      running-routers lists, even when asked. Oops.
-    - We were leaking some memory every time the client changed IPs.
-    - Clean up more of the OpenSSL memory when exiting, so we can detect
-      memory leaks better.
-    - Never call free() on tor_malloc()d memory. This will help us
-      use dmalloc to detect memory leaks.
-    - Some Tor servers process billions of cells per day. These
-      statistics are now uint64_t's.
-    - Check [X-]Forwarded-For headers in HTTP requests when generating
-      log messages. This lets people run dirservers (and caches) behind
-      Apache but still know which IP addresses are causing warnings.
-    - Fix minor integer overflow in calculating when we expect to use up
-      our bandwidth allocation before hibernating.
-    - Lower the minimum required number of file descriptors to 1000,
-      so we can have some overhead for Valgrind on Linux, where the
-      default ulimit -n is 1024.
-    - Stop writing the "router.desc" file, ever. Nothing uses it anymore,
-      and its existence is confusing some users.
-
-  o Config option fixes:
-    - Add a new config option ExitPolicyRejectPrivate which defaults
-      to on. Now all exit policies will begin with rejecting private
-      addresses, unless the server operator explicitly turns it off.
-    - Bump the default bandwidthrate to 3 MB, and burst to 6 MB.
-    - Add new ReachableORAddresses and ReachableDirAddresses options
-      that understand address policies. FascistFirewall is now a synonym
-      for "ReachableORAddresses *:443", "ReachableDirAddresses *:80".
-    - Start calling it FooListenAddress rather than FooBindAddress,
-      since few of our users know what it means to bind an address
-      or port.
-    - If the user gave Tor an odd number of command-line arguments,
-      we were silently ignoring the last one. Now we complain and fail.
-      This wins the oldest-bug prize -- this bug has been present since
-      November 2002, as released in Tor 0.0.0.
-    - If you write "HiddenServicePort 6667 127.0.0.1 6668" in your
-      torrc rather than "HiddenServicePort 6667 127.0.0.1:6668",
-      it would silently ignore the 6668.
-    - If we get a linelist or linelist_s config option from the torrc,
-      e.g. ExitPolicy, and it has no value, warn and skip rather than
-      silently resetting it to its default.
-    - Setconf was appending items to linelists, not clearing them.
-    - Add MyFamily to torrc.sample in the server section, so operators
-      will be more likely to learn that it exists.
-    - Make ContactInfo mandatory for authoritative directory servers.
-    - MaxConn has been obsolete for a while now. Document the ConnLimit
-      config option, which is a *minimum* number of file descriptors
-      that must be available else Tor refuses to start.
-    - Get rid of IgnoreVersion undocumented config option, and make us
-      only warn, never exit, when we're running an obsolete version.
-    - Make MonthlyAccountingStart config option truly obsolete now.
-    - Correct the man page entry on TrackHostExitsExpire.
-    - Let directory authorities start even if they don't specify an
-      Address config option.
-    - Change "AllowUnverifiedNodes" to "AllowInvalidNodes", to
-      reflect the updated flags in our v2 dir protocol.
-
-  o Config option features:
-    - Add a new config option FastFirstHopPK (on by default) so clients
-      do a trivial crypto handshake for their first hop, since TLS has
-      already taken care of confidentiality and authentication.
-    - Let the user set ControlListenAddress in the torrc. This can be
-      dangerous, but there are some cases (like a secured LAN) where it
-      makes sense.
-    - New config options to help controllers: FetchServerDescriptors
-      and FetchHidServDescriptors for whether to fetch server
-      info and hidserv info or let the controller do it, and
-      PublishServerDescriptor and PublishHidServDescriptors.
-    - Also let the controller set the __AllDirActionsPrivate config
-      option if you want all directory fetches/publishes to happen via
-      Tor (it assumes your controller bootstraps your circuits).
-    - Add "HardwareAccel" config option: support for crypto hardware
-      accelerators via OpenSSL. Off by default, until we find somebody
-      smart who can test it for us. (It appears to produce seg faults
-      in at least some cases.)
-    - New config option "AuthDirRejectUnlisted" for directory authorities
-      as a panic button: if we get flooded with unusable servers we can
-      revert to only listing servers in the approved-routers file.
-    - Directory authorities can now reject/invalidate by key and IP,
-      with the config options "AuthDirInvalid" and "AuthDirReject", or
-      by marking a fingerprint as "!reject" or "!invalid" (as its
-      nickname) in the approved-routers file. This is useful since
-      currently we automatically list servers as running and usable
-      even if we know they're jerks.
-    - Add a new config option TestSocks so people can see whether their
-      applications are using socks4, socks4a, socks5-with-ip, or
-      socks5-with-fqdn. This way they don't have to keep mucking
-      with tcpdump and wondering if something got cached somewhere.
-    - Add "private:*" as an alias in configuration for policies. Now
-      you can simplify your exit policy rather than needing to list
-      every single internal or nonroutable network space.
-    - Accept "private:*" in routerdesc exit policies; not generated yet
-      because older Tors do not understand it.
-    - Add configuration option "V1AuthoritativeDirectory 1" which
-      moria1, moria2, and tor26 have set.
-    - Implement an option, VirtualAddrMask, to set which addresses
-      get handed out in response to mapaddress requests. This works
-      around a bug in tsocks where 127.0.0.0/8 is never socksified.
-    - Add a new config option FetchUselessDescriptors, off by default,
-      for when you plan to run "exitlist" on your client and you want
-      to know about even the non-running descriptors.
-    - SocksTimeout: How long do we let a socks connection wait
-      unattached before we fail it?
-    - CircuitBuildTimeout: Cull non-open circuits that were born
-      at least this many seconds ago.
-    - CircuitIdleTimeout: Cull open clean circuits that were born
-      at least this many seconds ago.
-    - New config option SafeSocks to reject all application connections
-      using unsafe socks protocols. Defaults to off.
-
-  o Improved and clearer log messages:
-    - Reduce clutter in server logs. We're going to try to make
-      them actually usable now. New config option ProtocolWarnings that
-      lets you hear about how _other Tors_ are breaking the protocol. Off
-      by default.
-    - Divide log messages into logging domains. Once we put some sort
-      of interface on this, it will let people looking at more verbose
-      log levels specify the topics they want to hear more about.
-    - Log server fingerprint on startup, so new server operators don't
-      have to go hunting around their filesystem for it.
-    - Provide dire warnings to any users who set DirServer manually;
-      move it out of torrc.sample and into torrc.complete.
-    - Make the log message less scary when all the dirservers are
-      temporarily unreachable.
-    - When tor_socketpair() fails in Windows, give a reasonable
-      Windows-style errno back.
-    - Improve tor_gettimeofday() granularity on windows.
-    - We were printing the number of idle dns workers incorrectly when
-      culling them.
-    - Handle duplicate lines in approved-routers files without warning.
-    - We were whining about using socks4 or socks5-with-local-lookup
-      even when it's an IP address in the "virtual" range we designed
-      exactly for this case.
-    - Check for named servers when looking them up by nickname;
-      warn when we're calling a non-named server by its nickname;
-      don't warn twice about the same name.
-    - Downgrade the dirserver log messages when whining about
-      unreachability.
-    - Correct "your server is reachable" log entries to indicate that
-      it was self-testing that told us so.
-    - If we're trying to be a Tor server and running Windows 95/98/ME
-      as a server, explain that we'll likely crash.
-    - Provide a more useful warn message when our onion queue gets full:
-      the CPU is too slow or the exit policy is too liberal.
-    - Don't warn when we receive a 503 from a dirserver/cache -- this
-      will pave the way for them being able to refuse if they're busy.
-    - When we fail to bind a listener, try to provide a more useful
-      log message: e.g., "Is Tor already running?"
-    - Only start testing reachability once we've established a
-      circuit. This will make startup on dir authorities less noisy.
-    - Don't try to upload hidden service descriptors until we have
-      established a circuit.
-    - Tor didn't warn when it failed to open a log file.
-    - Warn when listening on a public address for socks. We suspect a
-      lot of people are setting themselves up as open socks proxies,
-      and they have no idea that jerks on the Internet are using them,
-      since they simply proxy the traffic into the Tor network.
-    - Give a useful message when people run Tor as the wrong user,
-      rather than telling them to start chowning random directories.
-    - Fix a harmless bug that was causing Tor servers to log
-      "Got an end because of misc error, but we're not an AP. Closing."
-    - Fix wrong log message when you add a "HiddenServiceNodes" config
-      line without any HiddenServiceDir line (reported by Chris Thomas).
-    - Directory authorities now stop whining so loudly about bad
-      descriptors that they fetch from other dirservers. So when there's
-      a log complaint, it's for sure from a freshly uploaded descriptor.
-    - When logging via syslog, include the pid whenever we provide
-      a log entry. Suggested by Todd Fries.
-    - When we're shutting down and we do something like try to post a
-      server descriptor or rendezvous descriptor, don't complain that
-      we seem to be unreachable. Of course we are, we're shutting down.
-    - Change log line for unreachability to explicitly suggest /etc/hosts
-      as the culprit. Also make it clearer what IP address and ports we're
-      testing for reachability.
-    - Put quotes around user-supplied strings when logging so users are
-      more likely to realize if they add bad characters (like quotes)
-      to the torrc.
-    - NT service patch from Matt Edman to improve error messages on Win32.
-
-
-Changes in version 0.1.0.17 - 2006-02-17
-  o Crash bugfixes on 0.1.0.x:
-    - When servers with a non-zero DirPort came out of hibernation,
-      sometimes they would trigger an assert.
-
-  o Other important bugfixes:
-    - On platforms that don't have getrlimit (like Windows), we were
-      artificially constraining ourselves to a max of 1024
-      connections. Now just assume that we can handle as many as 15000
-      connections. Hopefully this won't cause other problems.
-
-  o Backported features:
-    - When we're a server, a client asks for an old-style directory,
-      and our write bucket is empty, don't give it to him. This way
-      small servers can continue to serve the directory *sometimes*,
-      without getting overloaded.
-    - Whenever you get a 503 in response to a directory fetch, try
-      once more. This will become important once servers start sending
-      503's whenever they feel busy.
-    - Fetch a new directory every 120 minutes, not every 40 minutes.
-      Now that we have hundreds of thousands of users running the old
-      directory algorithm, it's starting to hurt a lot.
-    - Bump up the period for forcing a hidden service descriptor upload
-      from 20 minutes to 1 hour.
-
-
-Changes in version 0.1.0.16 - 2006-01-02
-  o Crash bugfixes on 0.1.0.x:
-    - On Windows, build with a libevent patch from "I-M Weasel" to avoid
-      corrupting the heap, losing FDs, or crashing when we need to resize
-      the fd_sets. (This affects the Win32 binaries, not Tor's sources.)
-    - It turns out sparc64 platforms crash on unaligned memory access
-      too -- so detect and avoid this.
-    - Handle truncated compressed data correctly (by detecting it and
-      giving an error).
-    - Fix possible-but-unlikely free(NULL) in control.c.
-    - When we were closing connections, there was a rare case that
-      stomped on memory, triggering seg faults and asserts.
-    - Avoid potential infinite recursion when building a descriptor. (We
-      don't know that it ever happened, but better to fix it anyway.)
-    - We were neglecting to unlink marked circuits from soon-to-close OR
-      connections, which caused some rare scribbling on freed memory.
-    - Fix a memory stomping race bug when closing the joining point of two
-      rendezvous circuits.
-    - Fix an assert in time parsing found by Steven Murdoch.
-
-  o Other bugfixes on 0.1.0.x:
-    - When we're doing reachability testing, provide more useful log
-      messages so the operator knows what to expect.
-    - Do not check whether DirPort is reachable when we are suppressing
-      advertising it because of hibernation.
-    - When building with -static or on Solaris, we sometimes needed -ldl.
-    - One of the dirservers (tor26) changed its IP address.
-    - When we're deciding whether a stream has enough circuits around
-      that can handle it, count the freshly dirty ones and not the ones
-      that are so dirty they won't be able to handle it.
-    - When we're expiring old circuits, we had a logic error that caused
-      us to close new rendezvous circuits rather than old ones.
-    - Give a more helpful log message when you try to change ORPort via
-      the controller: you should upgrade Tor if you want that to work.
-    - We were failing to parse Tor versions that start with "Tor ".
-    - Tolerate faulty streams better: when a stream fails for reason
-      exitpolicy, stop assuming that the router is lying about his exit
-      policy. When a stream fails for reason misc, allow it to retry just
-      as if it was resolvefailed. When a stream has failed three times,
-      reset its failure count so we can try again and get all three tries.
-
-
-Changes in version 0.1.0.15 - 2005-09-23
-  o Bugfixes on 0.1.0.x:
-    - Reject ports 465 and 587 (spam targets) in default exit policy.
-    - Don't crash when we don't have any spare file descriptors and we
-      try to spawn a dns or cpu worker.
-    - Get rid of IgnoreVersion undocumented config option, and make us
-      only warn, never exit, when we're running an obsolete version.
-    - Don't try to print a null string when your server finds itself to
-      be unreachable and the Address config option is empty.
-    - Make the numbers in read-history and write-history into uint64s,
-      so they don't overflow and publish negatives in the descriptor.
-    - Fix a minor memory leak in smartlist_string_remove().
-    - We were only allowing ourselves to upload a server descriptor at
-      most every 20 minutes, even if it changed earlier than that.
-    - Clean up log entries that pointed to old URLs.
-
-
-Changes in version 0.1.0.14 - 2005-08-08
-  o Bugfixes on 0.1.0.x:
-      - Fix the other half of the bug with crypto handshakes
-        (CVE-2005-2643).
-      - Fix an assert trigger if you send a 'signal term' via the
-        controller when it's listening for 'event info' messages.
-
-
-Changes in version 0.1.0.13 - 2005-08-04
-  o Bugfixes on 0.1.0.x:
-    - Fix a critical bug in the security of our crypto handshakes.
-    - Fix a size_t underflow in smartlist_join_strings2() that made
-      it do bad things when you hand it an empty smartlist.
-    - Fix Windows installer to ship Tor license (thanks to Aphex for
-      pointing out this oversight) and put a link to the doc directory
-      in the start menu.
-    - Explicitly set no-unaligned-access for sparc: it turns out the
-      new gcc's let you compile broken code, but that doesn't make it
-      not-broken.
-
-
-Changes in version 0.1.0.12 - 2005-07-18
-  o New directory servers:
-      - tor26 has changed IP address.
-
-  o Bugfixes on 0.1.0.x:
-    - Fix a possible double-free in tor_gzip_uncompress().
-    - When --disable-threads is set, do not search for or link against
-      pthreads libraries.
-    - Don't trigger an assert if an authoritative directory server
-      claims its dirport is 0.
-    - Fix bug with removing Tor as an NT service: some people were
-      getting "The service did not return an error." Thanks to Matt
-      Edman for the fix.
-
-
-Changes in version 0.1.0.11 - 2005-06-30
-  o Bugfixes on 0.1.0.x:
-    - Fix major security bug: servers were disregarding their
-      exit policies if clients behaved unexpectedly.
-    - Make OS X init script check for missing argument, so we don't
-      confuse users who invoke it incorrectly.
-    - Fix a seg fault in "tor --hash-password foo".
-    - The MAPADDRESS control command was broken.
-
-
-Changes in version 0.1.0.10 - 2005-06-14
-  o Fixes on Win32:
-    - Make NT services work and start on startup on Win32 (based on
-      patch by Matt Edman). See the FAQ entry for details.
-    - Make 'platform' string in descriptor more accurate for Win32
-      servers, so it's not just "unknown platform".
-    - REUSEADDR on normal platforms means you can rebind to the port
-      right after somebody else has let it go. But REUSEADDR on Win32
-      means you can bind to the port _even when somebody else already
-      has it bound_! So, don't do that on Win32.
-    - Clean up the log messages when starting on Win32 with no config
-      file.
-    - Allow seeding the RNG on Win32 even when you're not running as
-      Administrator. If seeding the RNG on Win32 fails, quit.
-
-  o Assert / crash bugs:
-    - Refuse relay cells that claim to have a length larger than the
-      maximum allowed. This prevents a potential attack that could read
-      arbitrary memory (e.g. keys) from an exit server's process
-      (CVE-2005-2050).
-    - If unofficial Tor clients connect and send weird TLS certs, our
-      Tor server triggers an assert. Stop asserting, and start handling
-      TLS errors better in other situations too.
-    - Fix a race condition that can trigger an assert when we have a
-      pending create cell and an OR connection attempt fails.
-
-  o Resource leaks:
-    - Use pthreads for worker processes rather than forking. This was
-      forced because when we forked, we ended up wasting a lot of
-      duplicate ram over time.
-      - Also switch to foo_r versions of some library calls to allow
-        reentry and threadsafeness.
-      - Implement --disable-threads configure option. Disable threads on
-        netbsd and openbsd by default, because they have no reentrant
-        resolver functions (!), and on solaris since it has other
-        threading issues.
-    - Fix possible bug on threading platforms (e.g. win32) which was
-      leaking a file descriptor whenever a cpuworker or dnsworker died.
-    - Fix a minor memory leak when somebody establishes an introduction
-      point at your Tor server.
-    - Fix possible memory leak in tor_lookup_hostname(). (Thanks to
-      Adam Langley.)
-    - Add ./configure --with-dmalloc option, to track memory leaks.
-    - And try to free all memory on closing, so we can detect what
-      we're leaking.
-
-  o Protocol correctness:
-    - When we've connected to an OR and handshaked but didn't like
-      the result, we were closing the conn without sending destroy
-      cells back for pending circuits. Now send those destroys.
-    - Start sending 'truncated' cells back rather than destroy cells
-      if the circuit closes in front of you. This means we won't have
-      to abandon partially built circuits.
-    - Handle changed router status correctly when dirserver reloads
-      fingerprint file. We used to be dropping all unverified descriptors
-      right then. The bug was hidden because we would immediately
-      fetch a directory from another dirserver, which would include the
-      descriptors we just dropped.
-    - Revise tor-spec to add more/better stream end reasons.
-    - Revise all calls to connection_edge_end to avoid sending 'misc',
-      and to take errno into account where possible.
-    - Client now retries when streams end early for 'hibernating' or
-      'resource limit' reasons, rather than failing them.
-    - Try to be more zealous about calling connection_edge_end when
-      things go bad with edge conns in connection.c.
-
-  o Robustness improvements:
-    - Better handling for heterogeneous / unreliable nodes:
-      - Annotate circuits with whether they aim to contain high uptime
-        nodes and/or high capacity nodes. When building circuits, choose
-        appropriate nodes.
-      - This means that every single node in an intro rend circuit,
-        not just the last one, will have a minimum uptime.
-      - New config option LongLivedPorts to indicate application streams
-        that will want high uptime circuits.
-      - Servers reset uptime when a dir fetch entirely fails. This
-        hopefully reflects stability of the server's network connectivity.
-      - If somebody starts his tor server in Jan 2004 and then fixes his
-        clock, don't make his published uptime be a year.
-      - Reset published uptime when we wake up from hibernation.
-    - Introduce a notion of 'internal' circs, which are chosen without
-      regard to the exit policy of the last hop. Intro and rendezvous
-      circs must be internal circs, to avoid leaking information. Resolve
-      and connect streams can use internal circs if they want.
-    - New circuit pooling algorithm: keep track of what destination ports
-      we've used recently (start out assuming we'll want to use 80), and
-      make sure to have enough circs around to satisfy these ports. Also
-      make sure to have 2 internal circs around if we've required internal
-      circs lately (and with high uptime if we've seen that lately too).
-    - Turn addr_policy_compare from a tristate to a quadstate; this should
-      help address our "Ah, you allow 1.2.3.4:80. You are a good choice
-      for google.com" problem.
-    - When a client asks us for a dir mirror and we don't have one,
-      launch an attempt to get a fresh one.
-    - First cut at support for "create-fast" cells. Clients can use
-      these when extending to their first hop, since the TLS already
-      provides forward secrecy and authentication. Not enabled on
-      clients yet.
-
-  o Reachability testing.
-    - Your Tor server will automatically try to see if its ORPort and
-      DirPort are reachable from the outside, and it won't upload its
-      descriptor until it decides at least ORPort is reachable (when
-      DirPort is not yet found reachable, publish it as zero).
-    - When building testing circs for ORPort testing, use only
-      high-bandwidth nodes, so fewer circuits fail.
-    - Notice when our IP changes, and reset stats/uptime/reachability.
-    - Authdirservers don't do ORPort reachability detection, since
-      they're in clique mode, so it will be rare to find a server not
-      already connected to them.
-    - Authdirservers now automatically approve nodes running 0.1.0.2-rc
-      or later.
-
-  o Dirserver fixes:
-    - Now we allow two unverified servers with the same nickname
-      but different keys. But if a nickname is verified, only that
-      nickname+key are allowed.
-    - If you're an authdirserver connecting to an address:port,
-      and it's not the OR you were expecting, forget about that
-      descriptor. If he *was* the one you were expecting, then forget
-      about all other descriptors for that address:port.
-    - Allow servers to publish descriptors from 12 hours in the future.
-      Corollary: only whine about clock skew from the dirserver if
-      he's a trusted dirserver (since now even verified servers could
-      have quite wrong clocks).
-    - Require servers that use the default dirservers to have public IP
-      addresses. We have too many servers that are configured with private
-      IPs and their admins never notice the log entries complaining that
-      their descriptors are being rejected.
-
-  o Efficiency improvements:
-    - Use libevent. Now we can use faster async cores (like epoll, kpoll,
-      and /dev/poll), and hopefully work better on Windows too.
-      - Apple's OS X 10.4.0 ships with a broken kqueue API, and using
-        kqueue on 10.3.9 causes kernel panics. Don't use kqueue on OS X.
-      - Find libevent even if it's hiding in /usr/local/ and your
-        CFLAGS and LDFLAGS don't tell you to look there.
-      - Be able to link with libevent as a shared library (the default
-        after 1.0d), even if it's hiding in /usr/local/lib and even
-        if you haven't added /usr/local/lib to your /etc/ld.so.conf,
-        assuming you're running gcc. Otherwise fail and give a useful
-        error message.
-    - Switch to a new buffer management algorithm, which tries to avoid
-      reallocing and copying quite as much. In first tests it looks like
-      it uses *more* memory on average, but less cpu.
-    - Switch our internal buffers implementation to use a ring buffer,
-      to hopefully improve performance for fast servers a lot.
-    - Reenable the part of the code that tries to flush as soon as an
-      OR outbuf has a full TLS record available. Perhaps this will make
-      OR outbufs not grow as huge except in rare cases, thus saving lots
-      of CPU time plus memory.
-    - Improve performance for dirservers: stop re-parsing the whole
-      directory every time you regenerate it.
-    - Keep a big splay tree of (circid,orconn)->circuit mappings to make
-      it much faster to look up a circuit for each relay cell.
-    - Remove most calls to assert_all_pending_dns_resolves_ok(),
-      since they're eating our cpu on exit nodes.
-    - Stop wasting time doing a case insensitive comparison for every
-      dns name every time we do any lookup. Canonicalize the names to
-      lowercase when you first see them.
-
-  o Hidden services:
-    - Handle unavailable hidden services better. Handle slow or busy
-      hidden services better.
-    - Cannibalize GENERAL circs to be C_REND, C_INTRO, S_INTRO, and S_REND
-      circ as necessary, if there are any completed ones lying around
-      when we try to launch one.
-    - Make hidden services try to establish a rendezvous for 30 seconds
-      after fetching the descriptor, rather than for n (where n=3)
-      attempts to build a circuit.
-    - Adjust maximum skew and age for rendezvous descriptors: let skew
-      be 48 hours rather than 90 minutes.
-    - Reject malformed .onion addresses rather then passing them on as
-      normal web requests.
-
-  o Controller:
-    - More Tor controller support. See
-      http://tor.eff.org/doc/control-spec.txt for all the new features,
-      including signals to emulate unix signals from any platform;
-      redirectstream; extendcircuit; mapaddress; getinfo; postdescriptor;
-      closestream; closecircuit; etc.
-    - Encode hashed controller passwords in hex instead of base64,
-      to make it easier to write controllers.
-    - Revise control spec and implementation to allow all log messages to
-      be sent to controller with their severities intact (suggested by
-      Matt Edman). Disable debug-level logs while delivering a debug-level
-      log to the controller, to prevent loop. Update TorControl to handle
-      new log event types.
-
-  o New config options/defaults:
-    - Begin scrubbing sensitive strings from logs by default. Turn off
-      the config option SafeLogging if you need to do debugging.
-    - New exit policy: accept most low-numbered ports, rather than
-      rejecting most low-numbered ports.
-    - Put a note in the torrc about abuse potential with the default
-      exit policy.
-    - Add support for CONNECTing through https proxies, with "HttpsProxy"
-      config option.
-    - Add HttpProxyAuthenticator and HttpsProxyAuthenticator support
-      based on patch from Adam Langley (basic auth only).
-    - Bump the default BandwidthRate from 1 MB to 2 MB, to accommodate
-      the fast servers that have been joining lately. (Clients are now
-      willing to load balance over up to 2 MB of advertised bandwidth
-      capacity too.)
-    - New config option MaxAdvertisedBandwidth which lets you advertise
-      a low bandwidthrate (to not attract as many circuits) while still
-      allowing a higher bandwidthrate in reality.
-    - Require BandwidthRate to be at least 20kB/s for servers.
-    - Add a NoPublish config option, so you can be a server (e.g. for
-      testing running Tor servers in other Tor networks) without
-      publishing your descriptor to the primary dirservers.
-    - Add a new AddressMap config directive to rewrite incoming socks
-      addresses. This lets you, for example, declare an implicit
-      required exit node for certain sites.
-    - Add a new TrackHostExits config directive to trigger addressmaps
-      for certain incoming socks addresses -- for sites that break when
-      your exit keeps changing (based on patch from Mike Perry).
-    - Split NewCircuitPeriod option into NewCircuitPeriod (30 secs),
-      which describes how often we retry making new circuits if current
-      ones are dirty, and MaxCircuitDirtiness (10 mins), which describes
-      how long we're willing to make use of an already-dirty circuit.
-    - Change compiled-in SHUTDOWN_WAIT_LENGTH from a fixed 30 secs to
-      a config option "ShutdownWaitLength" (when using kill -INT on
-      servers).
-    - Fix an edge case in parsing config options: if they say "--"
-      on the commandline, it's not a config option (thanks weasel).
-    - New config option DirAllowPrivateAddresses for authdirservers.
-      Now by default they refuse router descriptors that have non-IP or
-      private-IP addresses.
-    - Change DirFetchPeriod/StatusFetchPeriod to have a special "Be
-      smart" default value: low for servers and high for clients.
-    - Some people were putting "Address  " in their torrc, and they had
-      a buggy resolver that resolved " " to 0.0.0.0. Oops.
-    - If DataDir is ~/.tor, and that expands to /.tor, then default to
-      LOCALSTATEDIR/tor instead.
-    - Implement --verify-config command-line option to check if your torrc
-      is valid without actually launching Tor.
-
-  o Logging improvements:
-    - When dirservers refuse a server descriptor, we now log its
-      contactinfo, platform, and the poster's IP address.
-    - Only warn once per nickname from add_nickname_list_to_smartlist()
-      per failure, so an entrynode or exitnode choice that's down won't
-      yell so much.
-    - When we're connecting to an OR and he's got a different nickname/key
-      than we were expecting, only complain loudly if we're an OP or a
-      dirserver. Complaining loudly to the OR admins just confuses them.
-    - Whine at you if you're a server and you don't set your contactinfo.
-    - Warn when exit policy implicitly allows local addresses.
-    - Give a better warning when some other server advertises an
-      ORPort that is actually an apache running ssl.
-    - If we get an incredibly skewed timestamp from a dirserver mirror
-      that isn't a verified OR, don't warn -- it's probably him that's
-      wrong.
-    - When a dirserver causes you to give a warn, mention which dirserver
-      it was.
-    - Initialize libevent later in the startup process, so the logs are
-      already established by the time we start logging libevent warns.
-    - Use correct errno on win32 if libevent fails.
-    - Check and warn about known-bad/slow libevent versions.
-    - Stop warning about sigpipes in the logs. We're going to
-      pretend that getting these occassionally is normal and fine.
-
-  o New contrib scripts:
-    - New experimental script tor/contrib/exitlist: a simple python
-      script to parse directories and find Tor nodes that exit to listed
-      addresses/ports.
-    - New experimental script tor/contrib/ExerciseServer.py (needs more
-      work) that uses the controller interface to build circuits and
-      fetch pages over them. This will help us bootstrap servers that
-      have lots of capacity but haven't noticed it yet.
-    - New experimental script tor/contrib/PathDemo.py (needs more work)
-      that uses the controller interface to let you choose whole paths
-      via addresses like
-      "...path"
-    - New contributed script "privoxy-tor-toggle" to toggle whether
-      Privoxy uses Tor. Seems to be configured for Debian by default.
-    - Have torctl.in/tor.sh.in check for location of su binary (needed
-      on FreeBSD)
-
-  o Misc bugfixes:
-    - chdir() to your datadirectory at the *end* of the daemonize process,
-      not the beginning. This was a problem because the first time you
-      run tor, if your datadir isn't there, and you have runasdaemon set
-      to 1, it will try to chdir to it before it tries to create it. Oops.
-    - Fix several double-mark-for-close bugs, e.g. where we were finding
-      a conn for a cell even if that conn is already marked for close.
-    - Stop most cases of hanging up on a socks connection without sending
-      the socks reject.
-    - Fix a bug in the RPM package: set home directory for _tor to
-      something more reasonable when first installing.
-    - Stop putting nodename in the Platform string in server descriptors.
-      It doesn't actually help, and it is confusing/upsetting some people.
-    - When using preferred entry or exit nodes, ignore whether the
-      circuit wants uptime or capacity. They asked for the nodes, they
-      get the nodes.
-    - Tie MAX_DIR_SIZE to MAX_BUF_SIZE, so now directory sizes won't get
-      artificially capped at 500kB.
-    - Cache local dns resolves correctly even when they're .exit
-      addresses.
-    - If we're hibernating and we get a SIGINT, exit immediately.
-    - tor-resolve requests were ignoring .exit if there was a working circuit
-      they could use instead.
-    - Pay more attention to the ClientOnly config option.
-    - Resolve OS X installer bugs: stop claiming to be 0.0.9.2 in certain
-      installer screens; and don't put stuff into StartupItems unless
-      the user asks you to.
-
-  o Misc features:
-    - Rewrite address "serifos.exit" to "externalIP.serifos.exit"
-      rather than just rejecting it.
-    - If our clock jumps forward by 100 seconds or more, assume something
-      has gone wrong with our network and abandon all not-yet-used circs.
-    - When an application is using socks5, give him the whole variety of
-      potential socks5 responses (connect refused, host unreachable, etc),
-      rather than just "success" or "failure".
-    - A more sane version numbering system. See
-      http://tor.eff.org/cvs/tor/doc/version-spec.txt for details.
-    - Change version parsing logic: a version is "obsolete" if it is not
-      recommended and (1) there is a newer recommended version in the
-      same series, or (2) there are no recommended versions in the same
-      series, but there are some recommended versions in a newer series.
-      A version is "new" if it is newer than any recommended version in
-      the same series.
-    - Report HTTP reasons to client when getting a response from directory
-      servers -- so you can actually know what went wrong.
-    - Reject odd-looking addresses at the client (e.g. addresses that
-      contain a colon), rather than having the server drop them because
-      they're malformed.
-    - Stop publishing socksport in the directory, since it's not
-      actually meant to be public. For compatibility, publish a 0 there
-      for now.
-    - Since we ship our own Privoxy on OS X, tweak it so it doesn't write
-      cookies to disk and doesn't log each web request to disk. (Thanks
-      to Brett Carrington for pointing this out.)
-    - Add OSX uninstall instructions. An actual uninstall script will
-      come later.
-    - Add "opt hibernating 1" to server descriptor to make it clearer
-      whether the server is hibernating.
-
-
-Changes in version 0.0.9.10 - 2005-06-16
-  o Bugfixes on 0.0.9.x (backported from 0.1.0.10):
-    - Refuse relay cells that claim to have a length larger than the
-      maximum allowed. This prevents a potential attack that could read
-      arbitrary memory (e.g. keys) from an exit server's process
-      (CVE-2005-2050).
-
-
-Changes in version 0.0.9.9 - 2005-04-23
-  o Bugfixes on 0.0.9.x:
-    - If unofficial Tor clients connect and send weird TLS certs, our
-      Tor server triggers an assert. This release contains a minimal
-      backport from the broader fix that we put into 0.1.0.4-rc.
-
-
-Changes in version 0.0.9.8 - 2005-04-07
-  o Bugfixes on 0.0.9.x:
-    - We have a bug that I haven't found yet. Sometimes, very rarely,
-      cpuworkers get stuck in the 'busy' state, even though the cpuworker
-      thinks of itself as idle. This meant that no new circuits ever got
-      established. Here's a workaround to kill any cpuworker that's been
-      busy for more than 100 seconds.
-
-
-Changes in version 0.0.9.7 - 2005-04-01
-  o Bugfixes on 0.0.9.x:
-    - Fix another race crash bug (thanks to Glenn Fink for reporting).
-    - Compare identity to identity, not to nickname, when extending to
-      a router not already in the directory. This was preventing us from
-      extending to unknown routers. Oops.
-    - Make sure to create OS X Tor user in <500 range, so we aren't
-      creating actual system users.
-    - Note where connection-that-hasn't-sent-end was marked, and fix
-      a few really loud instances of this harmless bug (it's fixed more
-      in 0.1.0.x).
-
-
-Changes in version 0.0.9.6 - 2005-03-24
-  o Bugfixes on 0.0.9.x (crashes and asserts):
-    - Add new end stream reasons to maintainance branch. Fix bug where
-      reason (8) could trigger an assert.  Prevent bug from recurring.
-    - Apparently win32 stat wants paths to not end with a slash.
-    - Fix assert triggers in assert_cpath_layer_ok(), where we were
-      blowing away the circuit that conn->cpath_layer points to, then
-      checking to see if the circ is well-formed. Backport check to make
-      sure we dont use the cpath on a closed connection.
-    - Prevent circuit_resume_edge_reading_helper() from trying to package
-      inbufs for marked-for-close streams.
-    - Don't crash on hup if your options->address has become unresolvable.
-    - Some systems (like OS X) sometimes accept() a connection and tell
-      you the remote host is 0.0.0.0:0. If this happens, due to some
-      other mis-features, we get confused; so refuse the conn for now.
-
-  o Bugfixes on 0.0.9.x (other):
-    - Fix harmless but scary "Unrecognized content encoding" warn message.
-    - Add new stream error reason: TORPROTOCOL reason means "you are not
-      speaking a version of Tor I understand; say bye-bye to your stream."
-    - Be willing to cache directories from up to ROUTER_MAX_AGE seconds
-      into the future, now that we are more tolerant of skew. This
-      resolves a bug where a Tor server would refuse to cache a directory
-      because all the directories it gets are too far in the future;
-      yet the Tor server never logs any complaints about clock skew.
-    - Mac packaging magic: make man pages useable, and do not overwrite
-      existing torrc files.
-    - Make OS X log happily to /var/log/tor/tor.log
-
-
-Changes in version 0.0.9.5 - 2005-02-22
-  o Bugfixes on 0.0.9.x:
-    - Fix an assert race at exit nodes when resolve requests fail.
-    - Stop picking unverified dir mirrors--it only leads to misery.
-    - Patch from Matt Edman to make NT services work better. Service
-      support is still not compiled into the executable by default.
-    - Patch from Dmitri Bely so the Tor service runs better under
-      the win32 SYSTEM account.
-    - Make tor-resolve actually work (?) on Win32.
-    - Fix a sign bug when getrlimit claims to have 4+ billion
-      file descriptors available.
-    - Stop refusing to start when bandwidthburst == bandwidthrate.
-    - When create cells have been on the onion queue more than five
-      seconds, just send back a destroy and take them off the list.
-
-
-Changes in version 0.0.9.4 - 2005-02-03
-  o Bugfixes on 0.0.9:
-    - Fix an assert bug that took down most of our servers: when
-      a server claims to have 1 GB of bandwidthburst, don't
-      freak out.
-    - Don't crash as badly if we have spawned the max allowed number
-      of dnsworkers, or we're out of file descriptors.
-    - Block more file-sharing ports in the default exit policy.
-    - MaxConn is now automatically set to the hard limit of max
-      file descriptors we're allowed (ulimit -n), minus a few for
-      logs, etc.
-    - Give a clearer message when servers need to raise their
-      ulimit -n when they start running out of file descriptors.
-    - SGI Compatibility patches from Jan Schaumann.
-    - Tolerate a corrupt cached directory better.
-    - When a dirserver hasn't approved your server, list which one.
-    - Go into soft hibernation after 95% of the bandwidth is used,
-      not 99%. This is especially important for daily hibernators who
-      have a small accounting max. Hopefully it will result in fewer
-      cut connections when the hard hibernation starts.
-    - Load-balance better when using servers that claim more than
-      800kB/s of capacity.
-    - Make NT services work (experimental, only used if compiled in).
-
-
-Changes in version 0.0.9.3 - 2005-01-21
-  o Bugfixes on 0.0.9:
-    - Backport the cpu use fixes from main branch, so busy servers won't
-      need as much processor time.
-    - Work better when we go offline and then come back, or when we
-      run Tor at boot before the network is up. We do this by
-      optimistically trying to fetch a new directory whenever an
-      application request comes in and we think we're offline -- the
-      human is hopefully a good measure of when the network is back.
-    - Backport some minimal hidserv bugfixes: keep rend circuits open as
-      long as you keep using them; actually publish hidserv descriptors
-      shortly after they change, rather than waiting 20-40 minutes.
-    - Enable Mac startup script by default.
-    - Fix duplicate dns_cancel_pending_resolve reported by Giorgos Pallas.
-    - When you update AllowUnverifiedNodes or FirewallPorts via the
-      controller's setconf feature, we were always appending, never
-      resetting.
-    - When you update HiddenServiceDir via setconf, it was screwing up
-      the order of reading the lines, making it fail.
-    - Do not rewrite a cached directory back to the cache; otherwise we
-      will think it is recent and not fetch a newer one on startup.
-    - Workaround for webservers that lie about Content-Encoding: Tor
-      now tries to autodetect compressed directories and compression
-      itself. This lets us Proxypass dir fetches through apache.
-
-
-Changes in version 0.0.9.2 - 2005-01-04
-  o Bugfixes on 0.0.9 (crashes and asserts):
-    - Fix an assert on startup when the disk is full and you're logging
-      to a file.
-    - If you do socks4 with an IP of 0.0.0.x but *don't* provide a socks4a
-      style address, then we'd crash.
-    - Fix an assert trigger when the running-routers string we get from
-      a dirserver is broken.
-    - Make worker threads start and run on win32. Now win32 servers
-      may work better.
-    - Bandaid (not actually fix, but now it doesn't crash) an assert
-      where the dns worker dies mysteriously and the main Tor process
-      doesn't remember anything about the address it was resolving.
-
-  o Bugfixes on 0.0.9 (Win32):
-    - Workaround for brain-damaged __FILE__ handling on MSVC: keep Nick's
-      name out of the warning/assert messages.
-    - Fix a superficial "unhandled error on read" bug on win32.
-    - The win32 installer no longer requires a click-through for our
-      license, since our Free Software license grants rights but does not
-      take any away.
-    - Win32: When connecting to a dirserver fails, try another one
-      immediately. (This was already working for non-win32 Tors.)
-    - Stop trying to parse $HOME on win32 when hunting for default
-      DataDirectory.
-    - Make tor-resolve.c work on win32 by calling network_init().
-
-  o Bugfixes on 0.0.9 (other):
-    - Make 0.0.9.x build on Solaris again.
-    - Due to a fencepost error, we were blowing away the \n when reporting
-      confvalue items in the controller. So asking for multiple config
-      values at once couldn't work.
-    - When listing circuits that are pending on an opening OR connection,
-      if we're an OR we were listing circuits that *end* at us as
-      being pending on every listener, dns/cpu worker, etc. Stop that.
-    - Dirservers were failing to create 'running-routers' or 'directory'
-      strings if we had more than some threshold of routers. Fix them so
-      they can handle any number of routers.
-    - Fix a superficial "Duplicate mark for close" bug.
-    - Stop checking for clock skew for OR connections, even for servers.
-    - Fix a fencepost error that was chopping off the last letter of any
-      nickname that is the maximum allowed nickname length.
-    - Update URLs in log messages so they point to the new website.
-    - Fix a potential problem in mangling server private keys while
-      writing to disk (not triggered yet, as far as we know).
-    - Include the licenses for other free software we include in Tor,
-      now that we're shipping binary distributions more regularly.
-
-
-Changes in version 0.0.9.1 - 2004-12-15
-  o Bugfixes on 0.0.9:
-    - Make hibernation actually work.
-    - Make HashedControlPassword config option work.
-    - When we're reporting event circuit status to a controller,
-      don't use the stream status code.
-
-
-Changes in version 0.0.9 - 2004-12-12
-  o Bugfixes on 0.0.8.1 (Crashes and asserts):
-    - Catch and ignore SIGXFSZ signals when log files exceed 2GB; our
-      write() call will fail and we handle it there.
-    - When we run out of disk space, or other log writing error, don't
-      crash. Just stop logging to that log and continue.
-    - Fix isspace() and friends so they still make Solaris happy
-      but also so they don't trigger asserts on win32.
-    - Fix assert failure on malformed socks4a requests.
-    - Fix an assert bug where a hidden service provider would fail if
-      the first hop of his rendezvous circuit was down.
-    - Better handling of size_t vs int, so we're more robust on 64
-      bit platforms.
-
-  o Bugfixes on 0.0.8.1 (Win32):
-    - Make windows sockets actually non-blocking (oops), and handle
-      win32 socket errors better.
-    - Fix parse_iso_time on platforms without strptime (eg win32).
-    - win32: when being multithreaded, leave parent fdarray open.
-    - Better handling of winsock includes on non-MSV win32 compilers.
-    - Change our file IO stuff (especially wrt OpenSSL) so win32 is
-      happier.
-    - Make unit tests work on win32.
-
-  o Bugfixes on 0.0.8.1 (Path selection and streams):
-    - Calculate timeout for waiting for a connected cell from the time
-      we sent the begin cell, not from the time the stream started. If
-      it took a long time to establish the circuit, we would time out
-      right after sending the begin cell.
-    - Fix router_compare_addr_to_addr_policy: it was not treating a port
-      of * as always matching, so we were picking reject *:* nodes as
-      exit nodes too. Oops.
-    - When read() failed on a stream, we would close it without sending
-      back an end. So 'connection refused' would simply be ignored and
-      the user would get no response.
-    - Stop a sigpipe: when an 'end' cell races with eof from the app,
-      we shouldn't hold-open-until-flush if the eof arrived first.
-    - Let resolve conns retry/expire also, rather than sticking around
-      forever.
-    - Fix more dns related bugs: send back resolve_failed and end cells
-      more reliably when the resolve fails, rather than closing the
-      circuit and then trying to send the cell. Also attach dummy resolve
-      connections to a circuit *before* calling dns_resolve(), to fix
-      a bug where cached answers would never be sent in RESOLVED cells.
-
-  o Bugfixes on 0.0.8.1 (Circuits):
-    - Finally fix a bug that's been plaguing us for a year:
-      With high load, circuit package window was reaching 0. Whenever
-      we got a circuit-level sendme, we were reading a lot on each
-      socket, but only writing out a bit. So we would eventually reach
-      eof. This would be noticed and acted on even when there were still
-      bytes sitting in the inbuf.
-    - Use identity comparison, not nickname comparison, to choose which
-      half of circuit-ID-space each side gets to use. This is needed
-      because sometimes we think of a router as a nickname, and sometimes
-      as a hex ID, and we can't predict what the other side will do.
-
-  o Bugfixes on 0.0.8.1 (Other):
-    - Fix a whole slew of memory leaks.
-    - Disallow NDEBUG. We don't ever want anybody to turn off debug.
-    - If we are using select, make sure we stay within FD_SETSIZE.
-    - When poll() is interrupted, we shouldn't believe the revents values.
-    - Add a FAST_SMARTLIST define to optionally inline smartlist_get
-      and smartlist_len, which are two major profiling offenders.
-    - If do_hup fails, actually notice.
-    - Flush the log file descriptor after we print "Tor opening log file",
-      so we don't see those messages days later.
-    - Hidden service operators now correctly handle version 1 style
-      INTRODUCE1 cells (nobody generates them still, so not a critical
-      bug).
-    - Handle more errnos from accept() without closing the listener.
-      Some OpenBSD machines were closing their listeners because
-      they ran out of file descriptors.
-    - Some people had wrapped their tor client/server in a script
-      that would restart it whenever it died. This did not play well
-      with our "shut down if your version is obsolete" code. Now people
-      don't fetch a new directory if their local cached version is
-      recent enough.
-    - Make our autogen.sh work on ksh as well as bash.
-    - Better torrc example lines for dirbindaddress and orbindaddress.
-    - Improved bounds checking on parsed ints (e.g. config options and
-      the ones we find in directories.)
-    - Stop using separate defaults for no-config-file and
-      empty-config-file. Now you have to explicitly turn off SocksPort,
-      if you don't want it open.
-    - We were starting to daemonize before we opened our logs, so if
-      there were any problems opening logs, we would complain to stderr,
-      which wouldn't work, and then mysteriously exit.
-    - If a verified OR connects to us before he's uploaded his descriptor,
-      or we verify him and hup but he still has the original TLS
-      connection, then conn->nickname is still set like he's unverified.
-
-  o Code security improvements, inspired by Ilja:
-    - tor_snprintf wrapper over snprintf with consistent (though not C99)
-      overflow behavior.
-    - Replace sprintf with tor_snprintf. (I think they were all safe, but
-      hey.)
-    - Replace strcpy/strncpy with strlcpy in more places.
-    - Avoid strcat; use tor_snprintf or strlcat instead.
-
-  o Features (circuits and streams):
-    - New circuit building strategy: keep a list of ports that we've
-      used in the past 6 hours, and always try to have 2 circuits open
-      or on the way that will handle each such port. Seed us with port
-      80 so web users won't complain that Tor is "slow to start up".
-    - Make kill -USR1 dump more useful stats about circuits.
-    - When warning about retrying or giving up, print the address, so
-      the user knows which one it's talking about.
-    - If you haven't used a clean circuit in an hour, throw it away,
-      just to be on the safe side. (This means after 6 hours a totally
-      unused Tor client will have no circuits open.)
-    - Support "foo.nickname.exit" addresses, to let Alice request the
-      address "foo" as viewed by exit node "nickname". Based on a patch
-      from Geoff Goodell.
-    - If your requested entry or exit node has advertised bandwidth 0,
-      pick it anyway.
-    - Be more greedy about filling up relay cells -- we try reading again
-      once we've processed the stuff we read, in case enough has arrived
-      to fill the last cell completely.
-    - Refuse application socks connections to port 0.
-    - Use only 0.0.9pre1 and later servers for resolve cells.
-
-  o Features (bandwidth):
-    - Hibernation: New config option "AccountingMax" lets you
-      set how many bytes per month (in each direction) you want to
-      allow your server to consume. Rather than spreading those
-      bytes out evenly over the month, we instead hibernate for some
-      of the month and pop up at a deterministic time, work until
-      the bytes are consumed, then hibernate again. Config option
-      "MonthlyAccountingStart" lets you specify which day of the month
-      your billing cycle starts on.
-    - Implement weekly/monthly/daily accounting: now you specify your
-      hibernation properties by
-      AccountingMax N bytes|KB|MB|GB|TB
-      AccountingStart day|week|month [day] HH:MM
-        Defaults to "month 1 0:00".
-    - Let bandwidth and interval config options be specified as 5 bytes,
-      kb, kilobytes, etc; and as seconds, minutes, hours, days, weeks.
-
-  o Features (directories):
-    - New "router-status" line in directory, to better bind each verified
-      nickname to its identity key.
-    - Clients can ask dirservers for /dir.z to get a compressed version
-      of the directory. Only works for servers running 0.0.9, of course.
-    - Make clients cache directories and use them to seed their router
-      lists at startup. This means clients have a datadir again.
-    - Respond to content-encoding headers by trying to uncompress as
-      appropriate.
-    - Clients and servers now fetch running-routers; cache
-      running-routers; compress running-routers; serve compressed
-      running-routers.z
-    - Make moria2 advertise a dirport of 80, so people behind firewalls
-      will be able to get a directory.
-    - Http proxy support
-      - Dirservers translate requests for http://%s:%d/x to /x
-      - You can specify "HttpProxy %s[:%d]" and all dir fetches will
-        be routed through this host.
-      - Clients ask for /tor/x rather than /x for new enough dirservers.
-        This way we can one day coexist peacefully with apache.
-      - Clients specify a "Host: %s%d" http header, to be compatible
-        with more proxies, and so running squid on an exit node can work.
-    - Protect dirservers from overzealous descriptor uploading -- wait
-      10 seconds after directory gets dirty, before regenerating.
-
-  o Features (packages and install):
-    - Add NSI installer contributed by J Doe.
-    - Apply NT service patch from Osamu Fujino. Still needs more work.
-    - Commit VC6 and VC7 workspace/project files.
-    - Commit a tor.spec for making RPM files, with help from jbash.
-    - Add contrib/torctl.in contributed by Glenn Fink.
-    - Make expand_filename handle ~ and ~username.
-    - Use autoconf to enable largefile support where necessary. Use
-      ftello where available, since ftell can fail at 2GB.
-    - Ship src/win32/ in the tarball, so people can use it to build.
-    - Make old win32 fall back to CWD if SHGetSpecialFolderLocation
-      is broken.
-
-  o Features (ui controller):
-    - Control interface: a separate program can now talk to your
-      client/server over a socket, and get/set config options, receive
-      notifications of circuits and streams starting/finishing/dying,
-      bandwidth used, etc. The next step is to get some GUIs working.
-      Let us know if you want to help out. See doc/control-spec.txt .
-    - Ship a contrib/tor-control.py as an example script to interact
-      with the control port.
-    - "tor --hash-password zzyxz" will output a salted password for
-      use in authenticating to the control interface.
-    - Implement the control-spec's SAVECONF command, to write your
-      configuration to torrc.
-    - Get cookie authentication for the controller closer to working.
-    - When set_conf changes our server descriptor, upload a new copy.
-      But don't upload it too often if there are frequent changes.
-
-  o Features (config and command-line):
-    - Deprecate unofficial config option abbreviations, and abbreviations
-      not on the command line.
-    - Configuration infrastructure support for warning on obsolete
-      options.
-    - Give a slightly more useful output for "tor -h".
-    - Break DirFetchPostPeriod into:
-      - DirFetchPeriod for fetching full directory,
-      - StatusFetchPeriod for fetching running-routers,
-      - DirPostPeriod for posting server descriptor,
-      - RendPostPeriod for posting hidden service descriptors.
-    - New log format in config:
-      "Log minsev[-maxsev] stdout|stderr|syslog" or
-      "Log minsev[-maxsev] file /var/foo"
-    - DirPolicy config option, to let people reject incoming addresses
-      from their dirserver.
-    - "tor --list-fingerprint" will list your identity key fingerprint
-      and then exit.
-    - Make tor --version --version dump the cvs Id of every file.
-    - New 'MyFamily nick1,...' config option for a server to
-      specify other servers that shouldn't be used in the same circuit
-      with it. Only believed if nick1 also specifies us.
-    - New 'NodeFamily nick1,nick2,...' config option for a client to
-      specify nodes that it doesn't want to use in the same circuit.
-    - New 'Redirectexit pattern address:port' config option for a
-      server to redirect exit connections, e.g. to a local squid.
-    - Add "pass" target for RedirectExit, to make it easier to break
-      out of a sequence of RedirectExit rules.
-    - Make the dirservers file obsolete.
-      - Include a dir-signing-key token in directories to tell the
-        parsing entity which key is being used to sign.
-      - Remove the built-in bulky default dirservers string.
-      - New config option "Dirserver %s:%d [fingerprint]", which can be
-        repeated as many times as needed. If no dirservers specified,
-        default to moria1,moria2,tor26.
-      - Make 'Routerfile' config option obsolete.
-    - Discourage people from setting their dirfetchpostperiod more often
-      than once per minute.
-
-  o Features (other):
-    - kill -USR2 now moves all logs to loglevel debug (kill -HUP to
-      get back to normal.)
-    - Accept *:706 (silc) in default exit policy.
-    - Implement new versioning format for post 0.1.
-    - Distinguish between TOR_TLS_CLOSE and TOR_TLS_ERROR, so we can
-      log more informatively.
-    - Check clock skew for verified servers, but allow unverified
-      servers and clients to have any clock skew.
-    - Make sure the hidden service descriptors are at a random offset
-      from each other, to hinder linkability.
-    - Clients now generate a TLS cert too, in preparation for having
-      them act more like real nodes.
-    - Add a pure-C tor-resolve implementation.
-    - Use getrlimit and friends to ensure we can reach MaxConn (currently
-      1024) file descriptors.
-    - Raise the max dns workers from 50 to 100.
-
-
-Changes in version 0.0.8.1 - 2004-10-13
-  o Bugfixes:
-    - Fix a seg fault that can be triggered remotely for Tor
-      clients/servers with an open dirport.
-    - Fix a rare assert trigger, where routerinfos for entries in
-      our cpath would expire while we're building the path.
-    - Fix a bug in OutboundBindAddress so it (hopefully) works.
-    - Fix a rare seg fault for people running hidden services on
-      intermittent connections.
-    - Fix a bug in parsing opt keywords with objects.
-    - Fix a stale pointer assert bug when a stream detaches and
-      reattaches.
-    - Fix a string format vulnerability (probably not exploitable)
-      in reporting stats locally.
-    - Fix an assert trigger: sometimes launching circuits can fail
-      immediately, e.g. because too many circuits have failed recently.
-    - Fix a compile warning on 64 bit platforms.
-
-
-Changes in version 0.0.8 - 2004-08-25
-  o Bugfixes:
-    - Made our unit tests compile again on OpenBSD 3.5, and tor
-      itself compile again on OpenBSD on a sparc64.
-    - We were neglecting milliseconds when logging on win32, so
-      everything appeared to happen at the beginning of each second.
-    - Check directory signature _before_ you decide whether you're
-      you're running an obsolete version and should exit.
-    - Check directory signature _before_ you parse the running-routers
-      list to decide who's running.
-    - Check return value of fclose while writing to disk, so we don't
-      end up with broken files when servers run out of disk space.
-    - Port it to SunOS 5.9 / Athena
-    - Fix two bugs in saving onion keys to disk when rotating, so
-      hopefully we'll get fewer people using old onion keys.
-    - Remove our mostly unused -- and broken -- hex_encode()
-      function. Use base16_encode() instead. (Thanks to Timo Lindfors
-      for pointing out this bug.)
-    - Only pick and establish intro points after we've gotten a
-      directory.
-    - Fix assert triggers: if the other side returns an address 0.0.0.0,
-      don't put it into the client dns cache.
-    - If a begin failed due to exit policy, but we believe the IP
-      address should have been allowed, switch that router to exitpolicy
-      reject *:* until we get our next directory.
-
-  o Protocol changes:
-    - 'Extend' relay cell payloads now include the digest of the
-      intended next hop's identity key. Now we can verify that we're
-      extending to the right router, and also extend to routers we
-      hadn't heard of before.
-
-  o Features:
-    - Tor nodes can now act as relays (with an advertised ORPort)
-      without being manually verified by the dirserver operators.
-      - Uploaded descriptors of unverified routers are now accepted
-        by the dirservers, and included in the directory.
-      - Verified routers are listed by nickname in the running-routers
-        list; unverified routers are listed as "$".
-      - We now use hash-of-identity-key in most places rather than
-        nickname or addr:port, for improved security/flexibility.
-      - AllowUnverifiedNodes config option to let circuits choose no-name
-        routers in entry,middle,exit,introduction,rendezvous positions.
-        Allow middle and rendezvous positions by default.
-      - When picking unverified routers, skip those with low uptime and/or
-        low bandwidth, depending on what properties you care about.
-      - ClientOnly option for nodes that never want to become servers.
-    - Directory caching.
-      - "AuthoritativeDir 1" option for the official dirservers.
-      - Now other nodes (clients and servers) will cache the latest
-        directory they've pulled down.
-      - They can enable their DirPort to serve it to others.
-      - Clients will pull down a directory from any node with an open
-        DirPort, and check the signature/timestamp correctly.
-      - Authoritative dirservers now fetch directories from other
-        authdirservers, to stay better synced.
-      - Running-routers list tells who's down also, along with noting
-        if they're verified (listed by nickname) or unverified (listed
-        by hash-of-key).
-      - Allow dirservers to serve running-router list separately.
-        This isn't used yet.
-      - You can now fetch $DIRURL/running-routers to get just the
-        running-routers line, not the whole descriptor list. (But
-        clients don't use this yet.)
-    - Clients choose nodes proportional to advertised bandwidth.
-    - Clients avoid using nodes with low uptime as introduction points.
-    - Handle servers with dynamic IP addresses: don't just replace
-      options->Address with the resolved one at startup, and
-      detect our address right before we make a routerinfo each time.
-    - 'FascistFirewall' option to pick dirservers and ORs on specific
-      ports; plus 'FirewallPorts' config option to tell FascistFirewall
-      which ports are open. (Defaults to 80,443)
-    - Try other dirservers immediately if the one you try is down. This
-      should tolerate down dirservers better now.
-    - ORs connect-on-demand to other ORs
-      - If you get an extend cell to an OR you're not connected to,
-        connect, handshake, and forward the create cell.
-      - The authoritative dirservers stay connected to everybody,
-        and everybody stays connected to 0.0.7 servers, but otherwise
-        clients/servers expire unused connections after 5 minutes.
-    - When servers get a sigint, they delay 30 seconds (refusing new
-      connections) then exit. A second sigint causes immediate exit.
-    - File and name management:
-      - Look for .torrc if no CONFDIR "torrc" is found.
-      - If no datadir is defined, then choose, make, and secure ~/.tor
-        as datadir.
-      - If torrc not found, exitpolicy reject *:*.
-      - Expands ~/ in filenames to $HOME/ (but doesn't yet expand ~arma).
-      - If no nickname is defined, derive default from hostname.
-      - Rename secret key files, e.g. identity.key -> secret_id_key,
-        to discourage people from mailing their identity key to tor-ops.
-    - Refuse to build a circuit before the directory has arrived --
-      it won't work anyway, since you won't know the right onion keys
-      to use.
-    - Parse tor version numbers so we can do an is-newer-than check
-      rather than an is-in-the-list check.
-    - New socks command 'resolve', to let us shim gethostbyname()
-      locally.
-      - A 'tor_resolve' script to access the socks resolve functionality.
-      - A new socks-extensions.txt doc file to describe our
-        interpretation and extensions to the socks protocols.
-    - Add a ContactInfo option, which gets published in descriptor.
-    - Write tor version at the top of each log file
-    - New docs in the tarball:
-      - tor-doc.html.
-      - Document that you should proxy your SSL traffic too.
-    - Log a warning if the user uses an unsafe socks variant, so people
-      are more likely to learn about privoxy or socat.
-    - Log a warning if you're running an unverified server, to let you
-      know you might want to get it verified.
-    - Change the default exit policy to reject the default edonkey,
-      kazaa, gnutella ports.
-    - Add replace_file() to util.[ch] to handle win32's rename().
-    - Publish OR uptime in descriptor (and thus in directory) too.
-    - Remember used bandwidth (both in and out), and publish 15-minute
-      snapshots for the past day into our descriptor.
-    - Be more aggressive about trying to make circuits when the network
-      has changed (e.g. when you unsuspend your laptop).
-    - Check for time skew on http headers; report date in response to
-      "GET /".
-    - If the entrynode config line has only one node, don't pick it as
-      an exitnode.
-    - Add strict{entry|exit}nodes config options. If set to 1, then
-      we refuse to build circuits that don't include the specified entry
-      or exit nodes.
-    - OutboundBindAddress config option, to bind to a specific
-      IP address for outgoing connect()s.
-    - End truncated log entries (e.g. directories) with "[truncated]".
-
-
-Changes in version 0.0.7.3 - 2004-08-12
-  o Stop dnsworkers from triggering an assert failure when you
-    ask them to resolve the host "".
-
-
-Changes in version 0.0.7.2 - 2004-07-07
-  o A better fix for the 0.0.0.0 problem, that will hopefully
-    eliminate the remaining related assertion failures.
-
-
-Changes in version 0.0.7.1 - 2004-07-04
-  o When an address resolves to 0.0.0.0, treat it as a failed resolve,
-    since internally we use 0.0.0.0 to signify "not yet resolved".
-
-
-Changes in version 0.0.7 - 2004-06-07
-  o Fixes for crashes and other obnoxious bugs:
-    - Fix an epipe bug: sometimes when directory connections failed
-      to connect, we would give them a chance to flush before closing
-      them.
-    - When we detached from a circuit because of resolvefailed, we
-      would immediately try the same circuit twice more, and then
-      give up on the resolve thinking we'd tried three different
-      exit nodes.
-    - Limit the number of intro circuits we'll attempt to build for a
-      hidden service per 15-minute period.
-    - Check recommended-software string *early*, before actually parsing
-      the directory. Thus we can detect an obsolete version and exit,
-      even if the new directory format doesn't parse.
-  o Fixes for security bugs:
-    - Remember which nodes are dirservers when you startup, and if a
-      random OR enables his dirport, don't automatically assume he's
-      a trusted dirserver.
-  o Other bugfixes:
-    - Directory connections were asking the wrong poll socket to
-      start writing, and not asking themselves to start writing.
-    - When we detached from a circuit because we sent a begin but
-      didn't get a connected, we would use it again the first time;
-      but after that we would correctly switch to a different one.
-    - Stop warning when the first onion decrypt attempt fails; they
-      will sometimes legitimately fail now that we rotate keys.
-    - Override unaligned-access-ok check when $host_cpu is ia64 or
-      arm. Apparently they allow it but the kernel whines.
-    - Dirservers try to reconnect periodically too, in case connections
-      have failed.
-    - Fix some memory leaks in directory servers.
-    - Allow backslash in Win32 filenames.
-    - Made Tor build complain-free on FreeBSD, hopefully without
-      breaking other BSD builds. We'll see.
-    - Check directory signatures based on name of signer, not on whom
-      we got the directory from. This will let us cache directories more
-      easily.
-    - Rotate dnsworkers and cpuworkers on SIGHUP, so they get new config
-      settings too.
-  o Features:
-    - Doxygen markup on all functions and global variables.
-    - Make directory functions update routerlist, not replace it. So
-      now directory disagreements are not so critical a problem.
-    - Remove the upper limit on number of descriptors in a dirserver's
-      directory (not that we were anywhere close).
-    - Allow multiple logfiles at different severity ranges.
-    - Allow *BindAddress to specify ":port" rather than setting *Port
-      separately. Allow multiple instances of each BindAddress config
-      option, so you can bind to multiple interfaces if you want.
-    - Allow multiple exit policy lines, which are processed in order.
-      Now we don't need that huge line with all the commas in it.
-    - Enable accept/reject policies on SOCKS connections, so you can bind
-      to 0.0.0.0 but still control who can use your OP.
-    - Updated the man page to reflect these features.
-
-
-Changes in version 0.0.6.2 - 2004-05-16
-  o Our integrity-checking digest was checking only the most recent cell,
-    not the previous cells like we'd thought.
-    Thanks to Stefan Mark for finding the flaw!
-
-
-Changes in version 0.0.6.1 - 2004-05-06
-  o Fix two bugs in our AES counter-mode implementation (this affected
-    onion-level stream encryption, but not TLS-level). It turns
-    out we were doing something much more akin to a 16-character
-    polyalphabetic cipher. Oops.
-    Thanks to Stefan Mark for finding the flaw!
-  o Retire moria3 as a directory server, and add tor26 as a directory
-    server.
-
-
-Changes in version 0.0.6 - 2004-05-02
-  o Features:
-    - Hidden services and rendezvous points are implemented. Go to
-      http://6sxoyfb3h2nvok2d.onion/ for an index of currently available
-      hidden services. (This only works via a socks4a proxy such as
-      Privoxy, and currently it's quite slow.)
-    - We now rotate link (tls context) keys and onion keys.
-    - CREATE cells now include oaep padding, so you can tell
-      if you decrypted them correctly.
-    - Retry stream correctly when we fail to connect because of
-      exit-policy-reject (should try another) or can't-resolve-address.
-    - When we hup a dirserver and we've *removed* a server from the
-      approved-routers list, now we remove that server from the
-      in-memory directories too.
-    - Add bandwidthburst to server descriptor.
-    - Directories now say which dirserver signed them.
-    - Use a tor_assert macro that logs failed assertions too.
-    - Since we don't support truncateds much, don't bother sending them;
-      just close the circ.
-    - Fetch randomness from /dev/urandom better (not via fopen/fread)
-    - Better debugging for tls errors
-    - Set Content-Type on the directory and hidserv descriptor.
-    - Remove IVs from cipher code, since AES-ctr has none.
-  o Bugfixes:
-    - Fix an assert trigger for exit nodes that's been plaguing us since
-      the days of 0.0.2prexx (thanks weasel!)
-    - Fix a bug where we were closing tls connections intermittently.
-      It turns out openssl keeps its errors around -- so if an error
-      happens, and you don't ask about it, and then another openssl
-      operation happens and succeeds, and you ask if there was an error,
-      it tells you about the first error.
-    - Fix a bug that's been lurking since 27 may 03 (!)
-      When passing back a destroy cell, we would use the wrong circ id.
-    - Don't crash if a conn that sent a begin has suddenly lost its circuit.
-    - Some versions of openssl have an SSL_pending function that erroneously
-      returns bytes when there is a non-application record pending.
-    - Win32 fixes. Tor now compiles on win32 with no warnings/errors.
-      o We were using an array of length zero in a few places.
-      o Win32's gethostbyname can't resolve an IP to an IP.
-      o Win32's close can't close a socket.
-      o Handle windows socket errors correctly.
-  o Portability:
-    - check for  so we build on FreeBSD again, and
-       for NetBSD.
-
-
-Changes in version 0.0.5 - 2004-03-30
-  o Install torrc as torrc.sample -- we no longer clobber your
-    torrc. (Woo!)
-  o Fix mangled-state bug in directory fetching (was causing sigpipes).
-  o Only build circuits after we've fetched the directory: clients were
-    using only the directory servers before they'd fetched a directory.
-    This also means longer startup time; so it goes.
-  o Fix an assert trigger where an OP would fail to handshake, and we'd
-    expect it to have a nickname.
-  o Work around a tsocks bug: do a socks reject when AP connection dies
-    early, else tsocks goes into an infinite loop.
-  o Hold socks connection open until reply is flushed (if possible)
-  o Make exit nodes resolve IPs to IPs immediately, rather than asking
-    the dns farm to do it.
-  o Fix c99 aliasing warnings in rephist.c
-  o Don't include server descriptors that are older than 24 hours in the
-    directory.
-  o Give socks 'reject' replies their whole 15s to attempt to flush,
-    rather than seeing the 60s timeout and assuming the flush had failed.
-  o Clean automake droppings from the cvs repository
-  o Add in a 'notice' log level for things the operator should hear
-    but that aren't warnings
-
-
-Changes in version 0.0.4 - 2004-03-26
-  o When connecting to a dirserver or OR and the network is down,
-    we would crash.
-
-
-Changes in version 0.0.3 - 2004-03-26
-  o Warn and fail if server chose a nickname with illegal characters
-  o Port to Solaris and Sparc:
-    - include missing header fcntl.h
-    - have autoconf find -lsocket -lnsl automatically
-    - deal with hardware word alignment
-    - make uname() work (solaris has a different return convention)
-    - switch from using signal() to sigaction()
-  o Preliminary work on reputation system:
-    - Keep statistics on success/fail of connect attempts; they're published
-      by kill -USR1 currently.
-    - Add a RunTesting option to try to learn link state by creating test
-      circuits, even when SocksPort is off.
-    - Remove unused open circuits when there are too many.
-
-
-Changes in version 0.0.2 - 2004-03-19
-    - Include strlcpy and strlcat for safer string ops
-    - define INADDR_NONE so we compile (but still not run) on solaris
-
-
-Changes in version 0.0.2pre27 - 2004-03-14
-  o Bugfixes:
-    - Allow internal tor networks (we were rejecting internal IPs,
-      now we allow them if they're set explicitly).
-    - And fix a few endian issues.
-
-
-Changes in version 0.0.2pre26 - 2004-03-14
-  o New features:
-    - If a stream times out after 15s without a connected cell, don't
-      try that circuit again: try a new one.
-    - Retry streams at most 4 times. Then give up.
-    - When a dirserver gets a descriptor from an unknown router, it
-      logs its fingerprint (so the dirserver operator can choose to
-      accept it even without mail from the server operator).
-    - Inform unapproved servers when we reject their descriptors.
-    - Make tor build on Windows again. It works as a client, who knows
-      about as a server.
-    - Clearer instructions in the torrc for how to set up a server.
-    - Be more efficient about reading fd's when our global token bucket
-      (used for rate limiting) becomes empty.
-  o Bugfixes:
-    - Stop asserting that computers always go forward in time. It's
-      simply not true.
-    - When we sent a cell (e.g. destroy) and then marked an OR connection
-      expired, we might close it before finishing a flush if the other
-      side isn't reading right then.
-    - Don't allow dirservers to start if they haven't defined
-      RecommendedVersions
-    - We were caching transient dns failures. Oops.
-    - Prevent servers from publishing an internal IP as their address.
-    - Address a strcat vulnerability in circuit.c
-
-
-Changes in version 0.0.2pre25 - 2004-03-04
-  o New features:
-    - Put the OR's IP in its router descriptor, not its fqdn. That way
-      we'll stop being stalled by gethostbyname for nodes with flaky dns,
-      e.g. poblano.
-  o Bugfixes:
-    - If the user typed in an address that didn't resolve, the server
-      crashed.
-
-
-Changes in version 0.0.2pre24 - 2004-03-03
-  o Bugfixes:
-    - Fix an assertion failure in dns.c, where we were trying to dequeue
-      a pending dns resolve even if it wasn't pending
-    - Fix a spurious socks5 warning about still trying to write after the
-      connection is finished.
-    - Hold certain marked_for_close connections open until they're finished
-      flushing, rather than losing bytes by closing them too early.
-    - Correctly report the reason for ending a stream
-    - Remove some duplicate calls to connection_mark_for_close
-    - Put switch_id and start_daemon earlier in the boot sequence, so it
-      will actually try to chdir() to options.DataDirectory
-    - Make 'make test' exit(1) if a test fails; fix some unit tests
-    - Make tor fail when you use a config option it doesn't know about,
-      rather than warn and continue.
-    - Make --version work
-    - Bugfixes on the rpm spec file and tor.sh, so it's more up to date
-
-
-Changes in version 0.0.2pre23 - 2004-02-29
-  o New features:
-    - Print a statement when the first circ is finished, so the user
-      knows it's working.
-    - If a relay cell is unrecognized at the end of the circuit,
-      send back a destroy. (So attacks to mutate cells are more
-      clearly thwarted.)
-    - New config option 'excludenodes' to avoid certain nodes for circuits.
-    - When it daemonizes, it chdir's to the DataDirectory rather than "/",
-      so you can collect coredumps there.
- o Bugfixes:
-    - Fix a bug in tls flushing where sometimes data got wedged and
-      didn't flush until more data got sent. Hopefully this bug was
-      a big factor in the random delays we were seeing.
-    - Make 'connected' cells include the resolved IP, so the client
-      dns cache actually gets populated.
-    - Disallow changing from ORPort=0 to ORPort>0 on hup.
-    - When we time-out on a stream and detach from the circuit, send an
-      end cell down it first.
-    - Only warn about an unknown router (in exitnodes, entrynodes,
-      excludenodes) after we've fetched a directory.
-
-
-Changes in version 0.0.2pre22 - 2004-02-26
-  o New features:
-    - Servers publish less revealing uname information in descriptors.
-    - More memory tracking and assertions, to crash more usefully when
-      errors happen.
-    - If the default torrc isn't there, just use some default defaults.
-      Plus provide an internal dirservers file if they don't have one.
-    - When the user tries to use Tor as an http proxy, give them an http
-      501 failure explaining that we're a socks proxy.
-    - Dump a new router.desc on hup, to help confused people who change
-      their exit policies and then wonder why router.desc doesn't reflect
-      it.
-    - Clean up the generic tor.sh init script that we ship with.
-  o Bugfixes:
-    - If the exit stream is pending on the resolve, and a destroy arrives,
-      then the stream wasn't getting removed from the pending list. I
-      think this was the one causing recent server crashes.
-    - Use a more robust poll on OSX 10.3, since their poll is flaky.
-    - When it couldn't resolve any dirservers, it was useless from then on.
-      Now it reloads the RouterFile (or default dirservers) if it has no
-      dirservers.
-    - Move the 'tor' binary back to /usr/local/bin/ -- it turns out
-      many users don't even *have* a /usr/local/sbin/.
-
-
-Changes in version 0.0.2pre21 - 2004-02-18
-  o New features:
-    - There's a ChangeLog file that actually reflects the changelog.
-    - There's a 'torify' wrapper script, with an accompanying
-      tor-tsocks.conf, that simplifies the process of using tsocks for
-      tor. It even has a man page.
-    - The tor binary gets installed to sbin rather than bin now.
-    - Retry streams where the connected cell hasn't arrived in 15 seconds
-    - Clean up exit policy handling -- get the default out of the torrc,
-      so we can update it without forcing each server operator to fix
-      his/her torrc.
-    - Allow imaps and pop3s in default exit policy
-  o Bugfixes:
-    - Prevent picking middleman nodes as the last node in the circuit
-
-
-Changes in version 0.0.2pre20 - 2004-01-30
-  o New features:
-    - We now have a deb package, and it's in debian unstable. Go to
-      it, apt-getters. :)
-    - I've split the TotalBandwidth option into BandwidthRate (how many
-      bytes per second you want to allow, long-term) and
-      BandwidthBurst (how many bytes you will allow at once before the cap
-      kicks in).  This better token bucket approach lets you, say, set
-      BandwidthRate to 10KB/s and BandwidthBurst to 10MB, allowing good
-      performance while not exceeding your monthly bandwidth quota.
-    - Push out a tls record's worth of data once you've got it, rather
-      than waiting until you've read everything waiting to be read. This
-      may improve performance by pipelining better. We'll see.
-    - Add an AP_CONN_STATE_CONNECTING state, to allow streams to detach
-      from failed circuits (if they haven't been connected yet) and attach
-      to new ones.
-    - Expire old streams that haven't managed to connect. Some day we'll
-      have them reattach to new circuits instead.
-
-  o Bugfixes:
-    - Fix several memory leaks that were causing servers to become bloated
-      after a while.
-    - Fix a few very rare assert triggers. A few more remain.
-    - Setuid to User _before_ complaining about running as root.
-
-
-Changes in version 0.0.2pre19 - 2004-01-07
-  o Bugfixes:
-    - Fix deadlock condition in dns farm. We were telling a child to die by
-      closing the parent's file descriptor to him. But newer children were
-      inheriting the open file descriptor from the parent, and since they
-      weren't closing it, the socket never closed, so the child never read
-      eof, so he never knew to exit. Similarly, dns workers were holding
-      open other sockets, leading to all sorts of chaos.
-    - New cleaner daemon() code for forking and backgrounding.
-    - If you log to a file, it now prints an entry at the top of the
-      logfile so you know it's working.
-    - The onionskin challenge length was 30 bytes longer than necessary.
-    - Started to patch up the spec so it's not quite so out of date.
-
-
-Changes in version 0.0.2pre18 - 2004-01-02
-  o Bugfixes:
-    - Fix endian issues with the 'integrity' field in the relay header.
-    - Fix a potential bug where connections in state
-      AP_CONN_STATE_CIRCUIT_WAIT might unexpectedly ask to write.
-
-
-Changes in version 0.0.2pre17 - 2003-12-30
-  o Bugfixes:
-    - Made --debuglogfile (or any second log file, actually) work.
-    - Resolved an edge case in get_unique_circ_id_by_conn where a smart
-      adversary could force us into an infinite loop.
-
-  o Features:
-    - Each onionskin handshake now includes a hash of the computed key,
-      to prove the server's identity and help perfect forward secrecy.
-    - Changed cell size from 256 to 512 bytes (working toward compatibility
-      with MorphMix).
-    - Changed cell length to 2 bytes, and moved it to the relay header.
-    - Implemented end-to-end integrity checking for the payloads of
-      relay cells.
-    - Separated streamid from 'recognized' (otherwise circuits will get
-      messed up when we try to have streams exit from the middle). We
-      use the integrity-checking to confirm that a cell is addressed to
-      this hop.
-    - Randomize the initial circid and streamid values, so an adversary who
-      breaks into a node can't learn how many circuits or streams have
-      been made so far.
-
-
-Changes in version 0.0.2pre16 - 2003-12-14
-  o Bugfixes:
-    - Fixed a bug that made HUP trigger an assert
-    - Fixed a bug where a circuit that immediately failed wasn't being
-      counted as a failed circuit in counting retries.
-
-  o Features:
-    - Now we close the circuit when we get a truncated cell: otherwise we're
-      open to an anonymity attack where a bad node in the path truncates
-      the circuit and then we open streams at him.
-    - Add port ranges to exit policies
-    - Add a conservative default exit policy
-    - Warn if you're running tor as root
-    - on HUP, retry OR connections and close/rebind listeners
-    - options.EntryNodes: try these nodes first when picking the first node
-    - options.ExitNodes: if your best choices happen to include any of
-      your preferred exit nodes, you choose among just those preferred
-      exit nodes.
-    - options.ExcludedNodes: nodes that are never picked in path building
-
-
-Changes in version 0.0.2pre15 - 2003-12-03
-  o Robustness and bugfixes:
-    - Sometimes clients would cache incorrect DNS resolves, which would
-      really screw things up.
-    - An OP that goes offline would slowly leak all its sockets and stop
-      working.
-    - A wide variety of bugfixes in exit node selection, exit policy
-      handling, and processing pending streams when a new circuit is
-      established.
-    - Pick nodes for a path only from those the directory says are up
-    - Choose randomly from all running dirservers, not always the first one
-    - Increase allowed http header size for directory fetch.
-    - Stop writing to stderr (if we're daemonized it will be closed).
-    - Enable -g always, so cores will be more useful to me.
-    - Switch "-lcrypto -lssl" to "-lssl -lcrypto" for broken distributions.
-
-  o Documentation:
-    - Wrote a man page. It lists commonly used options.
-
-  o Configuration:
-    - Change default loglevel to warn.
-    - Make PidFile default to null rather than littering in your CWD.
-    - OnionRouter config option is now obsolete. Instead it just checks
-      ORPort>0.
-    - Moved to a single unified torrc file for both clients and servers.
-
-
-Changes in version 0.0.2pre14 - 2003-11-29
-  o Robustness and bugfixes:
-    - Force the admin to make the DataDirectory himself
-      - to get ownership/permissions right
-      - so clients no longer make a DataDirectory and then never use it
-    - fix bug where a client who was offline for 45 minutes would never
-      pull down a directory again
-    - fix (or at least hide really well) the dns assert bug that was
-      causing server crashes
-    - warnings and improved robustness wrt clockskew for certs
-    - use the native daemon(3) to daemonize, when available
-    - exit if bind() fails
-    - exit if neither socksport nor orport is defined
-    - include our own tor_timegm (Win32 doesn't have its own)
-    - bugfix for win32 with lots of connections
-    - fix minor bias in PRNG
-    - make dirserver more robust to corrupt cached directory
-
-  o Documentation:
-    - Wrote the design document (woo)
-
-  o Circuit building and exit policies:
-    - Circuits no longer try to use nodes that the directory has told them
-      are down.
-    - Exit policies now support bitmasks (18.0.0.0/255.0.0.0) and
-      bitcounts (18.0.0.0/8).
-    - Make AP connections standby for a circuit if no suitable circuit
-      exists, rather than failing
-    - Circuits choose exit node based on addr/port, exit policies, and
-      which AP connections are standing by
-    - Bump min pathlen from 2 to 3
-    - Relay end cells have a payload to describe why the stream ended.
-    - If the stream failed because of exit policy, try again with a new
-      circuit.
-    - Clients have a dns cache to remember resolved addresses.
-    - Notice more quickly when we have no working circuits
-
-  o Configuration:
-    - APPort is now called SocksPort
-    - SocksBindAddress, ORBindAddress, DirBindAddress let you configure
-      where to bind
-    - RecommendedVersions is now a config variable rather than
-      hardcoded (for dirservers)
-    - Reloads config on HUP
-    - Usage info on -h or --help
-    - If you set User and Group config vars, it'll setu/gid to them.
-
-Changes in version 0.0.2pre13 - 2003-10-19
-  o General stability:
-    - SSL_write no longer fails when it returns WANTWRITE and the number
-      of bytes in the buf has changed by the next SSL_write call.
-    - Fix segfault fetching directory when network is down
-    - Fix a variety of minor memory leaks
-    - Dirservers reload the fingerprints file on HUP, so I don't have
-      to take down the network when I approve a new router
-    - Default server config file has explicit Address line to specify fqdn
-
-  o Buffers:
-    - Buffers grow and shrink as needed (Cut process size from 20M to 2M)
-    - Make listener connections not ever alloc bufs
-
-  o Autoconf improvements:
-    - don't clobber an external CFLAGS in ./configure
-    - Make install now works
-    - create var/lib/tor on make install
-    - autocreate a tor.sh initscript to help distribs
-    - autocreate the torrc and sample-server-torrc with correct paths
-
-  o Log files and Daemonizing now work:
-    - If --DebugLogFile is specified, log to it at -l debug
-    - If --LogFile is specified, use it instead of commandline
-    - If --RunAsDaemon is set, tor forks and backgrounds on startup
-
diff --git a/src/tor/acinclude.m4 b/src/tor/acinclude.m4
deleted file mode 100644
index 49d4f1447..000000000
--- a/src/tor/acinclude.m4
+++ /dev/null
@@ -1,288 +0,0 @@
-dnl Helper macros for Tor configure.ac
-dnl Copyright (c) 2001-2004, Roger Dingledine
-dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
-dnl Copyright (c) 2007-2008, Roger Dingledine, Nick Mathewson
-dnl Copyright (c) 2007-2017, The Tor Project, Inc.
-dnl See LICENSE for licensing information
-
-AC_DEFUN([TOR_EXTEND_CODEPATH],
-[
-  if test -d "$1/lib"; then
-    LDFLAGS="-L$1/lib $LDFLAGS"
-  else
-    LDFLAGS="-L$1 $LDFLAGS"
-  fi
-  if test -d "$1/include"; then
-    CPPFLAGS="-I$1/include $CPPFLAGS"
-  else
-    CPPFLAGS="-I$1 $CPPFLAGS"
-  fi
-])
-
-AC_DEFUN([TOR_DEFINE_CODEPATH],
-[
-  if test x$1 = "x(system)"; then
-    TOR_LDFLAGS_$2=""
-    TOR_CPPFLAGS_$2=""
-  else
-   if test -d "$1/lib"; then
-     TOR_LDFLAGS_$2="-L$1/lib"
-     TOR_LIBDIR_$2="$1/lib"
-   else
-     TOR_LDFLAGS_$2="-L$1"
-     TOR_LIBDIR_$2="$1"
-   fi
-   if test -d "$1/include"; then
-     TOR_CPPFLAGS_$2="-I$1/include"
-   else
-     TOR_CPPFLAGS_$2="-I$1"
-   fi
-  fi
-  AC_SUBST(TOR_CPPFLAGS_$2)
-  AC_SUBST(TOR_LDFLAGS_$2)
-])
-
-dnl 1: flags
-dnl 2: try to link too if this is nonempty.
-dnl 3: what to do on success compiling
-dnl 4: what to do on failure compiling
-AC_DEFUN([TOR_TRY_COMPILE_WITH_CFLAGS], [
-  AS_VAR_PUSHDEF([VAR],[tor_cv_cflags_$1])
-  AC_CACHE_CHECK([whether the compiler accepts $1], VAR, [
-    tor_saved_CFLAGS="$CFLAGS"
-    CFLAGS="$CFLAGS -pedantic -Werror $1"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
-                   [AS_VAR_SET(VAR,yes)],
-                   [AS_VAR_SET(VAR,no)])
-    if test x$2 != x; then
-      AS_VAR_PUSHDEF([can_link],[tor_can_link_$1])
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
-                  [AS_VAR_SET(can_link,yes)],
-                  [AS_VAR_SET(can_link,no)])
-      AS_VAR_POPDEF([can_link])
-    fi
-    CFLAGS="$tor_saved_CFLAGS"
-  ])
-  if test x$VAR = xyes; then
-     $3
-  else
-     $4
-  fi
-  AS_VAR_POPDEF([VAR])
-])
-
-dnl 1:flags
-dnl 2:also try to link (yes: non-empty string)
-dnl   will set yes or no in $tor_can_link_$1 (as modified by AS_VAR_PUSHDEF)
-AC_DEFUN([TOR_CHECK_CFLAGS], [
-  TOR_TRY_COMPILE_WITH_CFLAGS($1, $2, CFLAGS="$CFLAGS $1", true)
-])
-
-dnl 1:flags
-dnl 2:extra ldflags
-dnl 3:extra libraries
-AC_DEFUN([TOR_CHECK_LDFLAGS], [
-  AS_VAR_PUSHDEF([VAR],[tor_cv_ldflags_$1])
-  AC_CACHE_CHECK([whether the linker accepts $1], VAR, [
-    tor_saved_CFLAGS="$CFLAGS"
-    tor_saved_LDFLAGS="$LDFLAGS"
-    tor_saved_LIBS="$LIBS"
-    CFLAGS="$CFLAGS -pedantic -Werror"
-    LDFLAGS="$LDFLAGS $2 $1"
-    LIBS="$LIBS $3"
-    AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [fputs("", stdout)])],
-                  [AS_VAR_SET(VAR,yes)],
-                  [AS_VAR_SET(VAR,no)],
-                  [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
-                                   [AS_VAR_SET(VAR,yes)],
-                                   [AS_VAR_SET(VAR,no)])])
-    CFLAGS="$tor_saved_CFLAGS"
-    LDFLAGS="$tor_saved_LDFLAGS"
-    LIBS="$tor_saved_LIBS"
-  ])
-  if test x$VAR = xyes; then
-    LDFLAGS="$LDFLAGS $1"
-  fi
-  AS_VAR_POPDEF([VAR])
-])
-
-dnl 1:libname
-AC_DEFUN([TOR_WARN_MISSING_LIB], [
-h=""
-if test x$2 = xdevpkg; then
-  h=" headers for"
-fi
-if test -f /etc/debian_version && test x"$tor_$1_$2_debian" != x; then
-  AC_MSG_WARN([On Debian, you can install$h $1 using "apt-get install $tor_$1_$2_debian"])
-  if test x"$tor_$1_$2_debian" != x"$tor_$1_devpkg_debian"; then 
-    AC_MSG_WARN([   You will probably need $tor_$1_devpkg_debian too.])
-  fi 
-fi
-if test -f /etc/fedora-release && test x"$tor_$1_$2_redhat" != x; then
-  AC_MSG_WARN([On Fedora, you can install$h $1 using "dnf install $tor_$1_$2_redhat"])
-  if test x"$tor_$1_$2_redhat" != x"$tor_$1_devpkg_redhat"; then 
-    AC_MSG_WARN([   You will probably need to install $tor_$1_devpkg_redhat too.])
-  fi 
-else
-  if test -f /etc/redhat-release && test x"$tor_$1_$2_redhat" != x; then
-    AC_MSG_WARN([On most Redhat-based systems, you can get$h $1 by installing the $tor_$1_$2_redhat RPM package])
-    if test x"$tor_$1_$2_redhat" != x"$tor_$1_devpkg_redhat"; then 
-      AC_MSG_WARN([   You will probably need to install $tor_$1_devpkg_redhat too.])
-    fi 
-  fi
-fi
-])
-
-dnl Look for a library, and its associated includes, and how to link
-dnl against it.
-dnl
-dnl TOR_SEARCH_LIBRARY(1:libname, 2:IGNORED, 3:linkargs, 4:headers,
-dnl                    5:prototype,
-dnl                    6:code, 7:IGNORED, 8:searchextra)
-dnl
-dnl Special variables:
-dnl   ALT_{libname}_WITHVAL -- another possible value for --with-$1-dir.
-dnl       Used to support renaming --with-ssl-dir to --with-openssl-dir
-dnl
-AC_DEFUN([TOR_SEARCH_LIBRARY], [
-try$1dir=""
-AC_ARG_WITH($1-dir,
-  AS_HELP_STRING(--with-$1-dir=PATH, [specify path to $1 installation]),
-  [
-     if test x$withval != xno ; then
-        try$1dir="$withval"
-     fi
-  ])
-if test "x$try$1dir" = x && test "x$ALT_$1_WITHVAL" != x ; then
-  try$1dir="$ALT_$1_WITHVAL"
-fi
-
-tor_saved_LIBS="$LIBS"
-tor_saved_LDFLAGS="$LDFLAGS"
-tor_saved_CPPFLAGS="$CPPFLAGS"
-AC_CACHE_CHECK([for $1 directory], tor_cv_library_$1_dir, [
-  tor_$1_dir_found=no
-  tor_$1_any_linkable=no
-
-  for tor_trydir in "$try$1dir" "(system)" "$prefix" /usr/local /usr/pkg $8; do
-    LDFLAGS="$tor_saved_LDFLAGS"
-    LIBS="$tor_saved_LIBS $3"
-    CPPFLAGS="$tor_saved_CPPFLAGS"
-
-    if test -z "$tor_trydir" ; then
-      continue;
-    fi
-
-    # Skip the directory if it isn't there.
-    if test ! -d "$tor_trydir" && test "$tor_trydir" != "(system)"; then
-      continue;
-    fi
-
-    # If this isn't blank, try adding the directory (or appropriate
-    # include/libs subdirectories) to the command line.
-    if test "$tor_trydir" != "(system)"; then
-      TOR_EXTEND_CODEPATH($tor_trydir)
-    fi
-
-    # Can we link against (but not necessarily run, or find the headers for)
-    # the binary?
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([$5], [$6])],
-                   [linkable=yes], [linkable=no])
-
-    if test "$linkable" = yes; then
-      tor_$1_any_linkable=yes
-      # Okay, we can link against it.  Can we find the headers?
-      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$4], [$6])],
-                        [buildable=yes], [buildable=no])
-      if test "$buildable" = yes; then
-         tor_cv_library_$1_dir=$tor_trydir
-         tor_$1_dir_found=yes
-         break
-      fi
-    fi
-  done
-
-  if test "$tor_$1_dir_found" = no; then
-    if test "$tor_$1_any_linkable" = no ; then
-      AC_MSG_WARN([Could not find a linkable $1.  If you have it installed somewhere unusual, you can specify an explicit path using --with-$1-dir])
-      TOR_WARN_MISSING_LIB($1, pkg)
-      AC_MSG_ERROR([Missing libraries; unable to proceed.])
-    else
-      AC_MSG_WARN([We found the libraries for $1, but we could not find the C header files.  You may need to install a devel package.])
-      TOR_WARN_MISSING_LIB($1, devpkg)
-      AC_MSG_ERROR([Missing headers; unable to proceed.])
-    fi
-  fi
-
-  LDFLAGS="$tor_saved_LDFLAGS"
-  LIBS="$tor_saved_LIBS"
-  CPPFLAGS="$tor_saved_CPPFLAGS"
-]) dnl end cache check
-
-LIBS="$LIBS $3"
-if test "$tor_cv_library_$1_dir" != "(system)"; then
-   TOR_EXTEND_CODEPATH($tor_cv_library_$1_dir)
-fi
-
-TOR_DEFINE_CODEPATH($tor_cv_library_$1_dir, $1)
-
-if test "$cross_compiling" != yes; then
-  AC_CACHE_CHECK([whether we need extra options to link $1],
-                 tor_cv_library_$1_linker_option, [
-   orig_LDFLAGS="$LDFLAGS"
-   runs=no
-   linked_with=nothing
-   if test -d "$tor_cv_library_$1_dir/lib"; then
-     tor_trydir="$tor_cv_library_$1_dir/lib"
-   else
-     tor_trydir="$tor_cv_library_$1_dir"
-   fi
-   for tor_tryextra in "(none)" "-Wl,-R$tor_trydir" "-R$tor_trydir" \
-                       "-Wl,-rpath,$tor_trydir" ; do
-     if test "$tor_tryextra" = "(none)"; then
-       LDFLAGS="$orig_LDFLAGS"
-     else
-       LDFLAGS="$tor_tryextra $orig_LDFLAGS"
-     fi
-     AC_RUN_IFELSE([AC_LANG_PROGRAM([$5], [$6])],
-                   [runnable=yes], [runnable=no],
-                   [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
-                                   [runnable=yes],
-                                   [runnable=no])])
-     if test "$runnable" = yes; then
-        tor_cv_library_$1_linker_option=$tor_tryextra
-        break
-     fi
-   done
-
-   if test "$runnable" = no; then
-     AC_MSG_ERROR([Found linkable $1 in $tor_cv_library_$1_dir, but it does not seem to run, even with -R. Maybe specify another using --with-$1-dir}])
-   fi
-   LDFLAGS="$orig_LDFLAGS"
-  ]) dnl end cache check check for extra options.
-
-  if test "$tor_cv_library_$1_linker_option" != "(none)" ; then
-    TOR_LDFLAGS_$1="$TOR_LDFLAGS_$1 $tor_cv_library_$1_linker_option"
-  fi
-fi # cross-compile
-
-LIBS="$tor_saved_LIBS"
-LDFLAGS="$tor_saved_LDFLAGS"
-CPPFLAGS="$tor_saved_CPPFLAGS"
-
-]) dnl end defun
-
-dnl Check whether the prototype for a function is present or missing.
-dnl Apple has a nasty habit of putting functions in their libraries (so that
-dnl AC_CHECK_FUNCS passes) but not actually declaring them in the headers.
-dnl
-dnl TOR_CHECK_PROTYPE(1:functionname, 2:macroname, 2: includes)
-AC_DEFUN([TOR_CHECK_PROTOTYPE], [
- AC_CACHE_CHECK([for declaration of $1], tor_cv_$1_declared, [
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$3],[void *ptr= $1 ;])],
-                     tor_cv_$1_declared=yes,tor_cv_$1_declared=no)])
-if test x$tor_cv_$1_declared != xno ; then
-  AC_DEFINE($2, 1,
-       [Defined if the prototype for $1 seems to be present.])
-fi
-])
diff --git a/src/tor/src/common/address.c b/src/tor/address.c
similarity index 70%
rename from src/tor/src/common/address.c
rename to src/tor/address.c
index 0c0ba782a..c30d2ab63 100644
--- a/src/tor/src/common/address.c
+++ b/src/tor/address.c
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -8,40 +8,23 @@
  * \brief Functions to use and manipulate the tor_addr_t structure.
  **/
 
-#define ADDRESS_PRIVATE
-
 #include "orconfig.h"
+#include "tor_compat.h"
+#include "tor_util.h"
+#include "address.h"
+#include "torlog.h"
+#include "container.h"
+#include "sandbox.h"
 
 #ifdef _WIN32
-/* For access to structs needed by GetAdaptersAddresses */
-#ifndef WIN32_LEAN_AND_MEAN
-#error "orconfig.h didn't define WIN32_LEAN_AND_MEAN"
-#endif
-#ifndef WINVER
-#error "orconfig.h didn't define WINVER"
-#endif
-#ifndef _WIN32_WINNT
-#error "orconfig.h didn't define _WIN32_WINNT"
-#endif
-#if WINVER < 0x0501
-#error "winver too low"
-#endif
-#if _WIN32_WINNT < 0x0501
-#error "winver too low"
-#endif
-#include 
 #include 
 #include 
+#include 
+/* For access to structs needed by GetAdaptersAddresses */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
 #include 
-#endif /* defined(_WIN32) */
-
-#include "compat.h"
-#include "util.h"
-#include "util_format.h"
-#include "address.h"
-#include "torlog.h"
-#include "container.h"
-#include "sandbox.h"
+#endif
 
 #ifdef HAVE_SYS_TIME_H
 #include 
@@ -106,14 +89,13 @@ tor_addr_to_sockaddr(const tor_addr_t *a,
                      struct sockaddr *sa_out,
                      socklen_t len)
 {
-  memset(sa_out, 0, len);
-
   sa_family_t family = tor_addr_family(a);
   if (family == AF_INET) {
     struct sockaddr_in *sin;
     if (len < (int)sizeof(struct sockaddr_in))
       return 0;
     sin = (struct sockaddr_in *)sa_out;
+    memset(sin, 0, sizeof(struct sockaddr_in));
 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
     sin->sin_len = sizeof(struct sockaddr_in);
 #endif
@@ -126,43 +108,27 @@ tor_addr_to_sockaddr(const tor_addr_t *a,
     if (len < (int)sizeof(struct sockaddr_in6))
       return 0;
     sin6 = (struct sockaddr_in6 *)sa_out;
+    memset(sin6, 0, sizeof(struct sockaddr_in6));
 #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
     sin6->sin6_len = sizeof(struct sockaddr_in6);
 #endif
     sin6->sin6_family = AF_INET6;
     sin6->sin6_port = htons(port);
-    memcpy(&sin6->sin6_addr, tor_addr_to_in6_assert(a),
-           sizeof(struct in6_addr));
+    memcpy(&sin6->sin6_addr, tor_addr_to_in6(a), sizeof(struct in6_addr));
     return sizeof(struct sockaddr_in6);
   } else {
     return 0;
   }
 }
 
-/** Set address a to zero.  This address belongs to
- * the AF_UNIX family. */
-static void
-tor_addr_make_af_unix(tor_addr_t *a)
-{
-  memset(a, 0, sizeof(*a));
-  a->family = AF_UNIX;
-}
-
 /** Set the tor_addr_t in a to contain the socket address contained in
- * sa.  IF port_out is non-NULL and sa contains a port,
- * set *port_out to that port. Return 0 on success and -1 on
- * failure. */
+ * sa. */
 int
 tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
                        uint16_t *port_out)
 {
   tor_assert(a);
   tor_assert(sa);
-
-  /* This memset is redundant; leaving it in to avoid any future accidents,
-     however. */
-  memset(a, 0, sizeof(*a));
-
   if (sa->sa_family == AF_INET) {
     struct sockaddr_in *sin = (struct sockaddr_in *) sa;
     tor_addr_from_ipv4n(a, sin->sin_addr.s_addr);
@@ -173,9 +139,6 @@ tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
     tor_addr_from_in6(a, &sin6->sin6_addr);
     if (port_out)
       *port_out = ntohs(sin6->sin6_port);
-  } else if (sa->sa_family == AF_UNIX) {
-    tor_addr_make_af_unix(a);
-    return 0;
   } else {
     tor_addr_make_unspec(a);
     return -1;
@@ -198,7 +161,7 @@ tor_sockaddr_to_str(const struct sockaddr *sa)
     tor_asprintf(&result, "unix:%s", s_un->sun_path);
     return result;
   }
-#endif /* defined(HAVE_SYS_UN_H) */
+#endif
   if (sa->sa_family == AF_UNSPEC)
     return tor_strdup("unspec");
 
@@ -219,7 +182,7 @@ tor_addr_make_unspec(tor_addr_t *a)
   a->family = AF_UNSPEC;
 }
 
-/** Set address a to the null address in address family family.
+/** Set address a to the null address in address family family.
  * The null address for AF_INET is 0.0.0.0.  The null address for AF_INET6 is
  * [::].  AF_UNSPEC is all null. */
 void
@@ -237,8 +200,8 @@ tor_addr_make_null(tor_addr_t *a, sa_family_t family)
  *
  * Return 0 on success, -1 on failure; 1 on transient failure.
  */
-MOCK_IMPL(int,
-tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr))
+int
+tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr)
 {
   /* Perhaps eventually this should be replaced by a tor_getaddrinfo or
    * something.
@@ -273,9 +236,7 @@ tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr))
     hints.ai_family = family;
     hints.ai_socktype = SOCK_STREAM;
     err = sandbox_getaddrinfo(name, NULL, &hints, &res);
-    /* The check for 'res' here shouldn't be necessary, but it makes static
-     * analysis tools happy. */
-    if (!err && res) {
+    if (!err) {
       best = NULL;
       for (res_p = res; res_p; res_p = res_p->ai_next) {
         if (family == AF_UNSPEC) {
@@ -301,11 +262,11 @@ tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr))
                           &((struct sockaddr_in6*)best->ai_addr)->sin6_addr);
         result = 0;
       }
-      sandbox_freeaddrinfo(res);
+      freeaddrinfo(res);
       return result;
     }
     return (err == EAI_AGAIN) ? 1 : -1;
-#else /* !(defined(HAVE_GETADDRINFO)) */
+#else
     struct hostent *ent;
     int err;
 #ifdef HAVE_GETHOSTBYNAME_R_6_ARG
@@ -330,14 +291,14 @@ tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr))
 #else
     err = h_errno;
 #endif
-#endif /* defined(HAVE_GETHOSTBYNAME_R_6_ARG) || ... */
+#endif /* endif HAVE_GETHOSTBYNAME_R_6_ARG. */
     if (ent) {
       if (ent->h_addrtype == AF_INET) {
         tor_addr_from_in(addr, (struct in_addr*) ent->h_addr);
       } else if (ent->h_addrtype == AF_INET6) {
         tor_addr_from_in6(addr, (struct in6_addr*) ent->h_addr);
       } else {
-        tor_assert(0); // LCOV_EXCL_LINE: gethostbyname() returned bizarre type
+        tor_assert(0); /* gethostbyname() returned a bizarre addrtype */
       }
       return 0;
     }
@@ -346,7 +307,7 @@ tor_addr_lookup,(const char *name, uint16_t family, tor_addr_t *addr))
 #else
     return (err == TRY_AGAIN) ? 1 : -1;
 #endif
-#endif /* defined(HAVE_GETADDRINFO) */
+#endif
   }
 }
 
@@ -360,23 +321,15 @@ tor_addr_is_internal_(const tor_addr_t *addr, int for_listening,
 {
   uint32_t iph4 = 0;
   uint32_t iph6[4];
-
-  tor_assert(addr);
-  sa_family_t v_family = tor_addr_family(addr);
+  sa_family_t v_family;
+  v_family = tor_addr_family(addr);
 
   if (v_family == AF_INET) {
     iph4 = tor_addr_to_ipv4h(addr);
   } else if (v_family == AF_INET6) {
     if (tor_addr_is_v4(addr)) { /* v4-mapped */
-      uint32_t *addr32 = NULL;
       v_family = AF_INET;
-      // Work around an incorrect NULL pointer dereference warning in
-      // "clang --analyze" due to limited analysis depth
-      addr32 = tor_addr_to_in6_addr32(addr);
-      // To improve performance, wrap this assertion in:
-      // #if !defined(__clang_analyzer__) || PARANOIA
-      tor_assert(addr32);
-      iph4 = ntohl(addr32[3]);
+      iph4 = ntohl(tor_addr_to_in6_addr32(addr)[3]);
     }
   }
 
@@ -455,10 +408,6 @@ tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate)
         ptr = dest;
       }
       break;
-    case AF_UNIX:
-      tor_snprintf(dest, len, "AF_UNIX");
-      ptr = dest;
-      break;
     default:
       return NULL;
   }
@@ -512,6 +461,7 @@ tor_addr_parse_PTR_name(tor_addr_t *result, const char *address,
 
   if (!strcasecmpend(address, ".ip6.arpa")) {
     const char *cp;
+    int i;
     int n0, n1;
     struct in6_addr in6;
 
@@ -519,7 +469,7 @@ tor_addr_parse_PTR_name(tor_addr_t *result, const char *address,
       return -1;
 
     cp = address;
-    for (int i = 0; i < 16; ++i) {
+    for (i = 0; i < 16; ++i) {
       n0 = hex_decode_digit(*cp++); /* The low-order nybble appears first. */
       if (*cp++ != '.') return -1;  /* Then a dot. */
       n1 = hex_decode_digit(*cp++); /* The high-order nybble appears first. */
@@ -564,8 +514,8 @@ tor_addr_parse_PTR_name(tor_addr_t *result, const char *address,
 
 /** Convert addr to an in-addr.arpa name or a .ip6.arpa name,
  * and store the result in the outlen-byte buffer at
- * out.  Returns a non-negative integer on success.
- * Returns -1 on failure. */
+ * out.  Return the number of chars written to out, not
+ * including the trailing \0, on success. Returns -1 on failure. */
 int
 tor_addr_to_PTR_name(char *out, size_t outlen,
                      const tor_addr_t *addr)
@@ -625,20 +575,13 @@ tor_addr_to_PTR_name(char *out, size_t outlen,
  *  yield an IPv4 wildcard.
  *
  *  If 'flags & TAPMP_EXTENDED_STAR' is true, then the wildcard address '*'
- *  yields an AF_UNSPEC wildcard address, which expands to corresponding
- *  wildcard IPv4 and IPv6 rules, and the following change is made
+ *  yields an AF_UNSPEC wildcard address, and the following change is made
  *  in the grammar above:
  *   Address ::= IPv4Address / "[" IPv6Address "]" / "*" / "*4" / "*6"
  *  with the new "*4" and "*6" productions creating a wildcard to match
  *  IPv4 or IPv6 addresses.
  *
- *  If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV4_ONLY' are
- *  both true, then the wildcard address '*' yields an IPv4 wildcard.
- *
- *  If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV6_ONLY' are
- *  both true, then the wildcard address '*' yields an IPv6 wildcard.
- *
- * TAPMP_STAR_IPV4_ONLY and TAPMP_STAR_IPV6_ONLY are mutually exclusive. */
+ */
 int
 tor_addr_parse_mask_ports(const char *s,
                           unsigned flags,
@@ -651,14 +594,10 @@ tor_addr_parse_mask_ports(const char *s,
   int any_flag=0, v4map=0;
   sa_family_t family;
   struct in6_addr in6_tmp;
-  struct in_addr in_tmp = { .s_addr = 0 };
+  struct in_addr in_tmp;
 
   tor_assert(s);
   tor_assert(addr_out);
-  /* We can either only want an IPv4 address or only want an IPv6 address,
-   * but we can't only want IPv4 & IPv6 at the same time. */
-  tor_assert(!((flags & TAPMP_STAR_IPV4_ONLY)
-               && (flags & TAPMP_STAR_IPV6_ONLY)));
 
   /** Longest possible length for an address, mask, and port-range combination.
    * Includes IP, [], /mask, :, ports */
@@ -704,21 +643,8 @@ tor_addr_parse_mask_ports(const char *s,
 
   if (!strcmp(address, "*")) {
     if (flags & TAPMP_EXTENDED_STAR) {
-      if (flags & TAPMP_STAR_IPV4_ONLY) {
-        family = AF_INET;
-        tor_addr_from_ipv4h(addr_out, 0);
-      } else if (flags & TAPMP_STAR_IPV6_ONLY) {
-        static char nil_bytes[16] = { [0]=0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
-        family = AF_INET6;
-        tor_addr_from_ipv6_bytes(addr_out, nil_bytes);
-      } else {
-        family = AF_UNSPEC;
-        tor_addr_make_unspec(addr_out);
-        log_info(LD_GENERAL,
-                 "'%s' expands into rules which apply to all IPv4 and IPv6 "
-                 "addresses. (Use accept/reject *4:* for IPv4 or "
-                 "accept[6]/reject[6] *6:* for IPv6.)", s);
-      }
+      family = AF_UNSPEC;
+      tor_addr_make_unspec(addr_out);
     } else {
       family = AF_INET;
       tor_addr_from_ipv4h(addr_out, 0);
@@ -729,7 +655,7 @@ tor_addr_parse_mask_ports(const char *s,
     tor_addr_from_ipv4h(addr_out, 0);
     any_flag = 1;
   } else if (!strcmp(address, "*6") && (flags & TAPMP_EXTENDED_STAR)) {
-    static char nil_bytes[16] = { [0]=0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
+    static char nil_bytes[16] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
     family = AF_INET6;
     tor_addr_from_ipv6_bytes(addr_out, nil_bytes);
     any_flag = 1;
@@ -788,11 +714,6 @@ tor_addr_parse_mask_ports(const char *s,
         /* XXXX_IP6 is this really what we want? */
         bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */
       }
-      if (any_flag) {
-        log_warn(LD_GENERAL,
-                 "Found bit prefix with wildcard address; rejecting");
-        goto err;
-      }
     } else { /* pick an appropriate mask, as none was given */
       if (any_flag)
         bits = 0;  /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */
@@ -878,8 +799,6 @@ tor_addr_is_null(const tor_addr_t *addr)
     }
     case AF_INET:
       return (tor_addr_to_ipv4n(addr) == 0);
-    case AF_UNIX:
-      return 1;
     case AF_UNSPEC:
       return 1;
     default:
@@ -907,65 +826,10 @@ tor_addr_is_loopback(const tor_addr_t *addr)
       return (tor_addr_to_ipv4h(addr) & 0xff000000) == 0x7f000000;
     case AF_UNSPEC:
       return 0;
-      /* LCOV_EXCL_START */
     default:
       tor_fragile_assert();
       return 0;
-      /* LCOV_EXCL_STOP */
-  }
-}
-
-/* Is addr valid?
- * Checks that addr is non-NULL and not tor_addr_is_null().
- * If for_listening is true, IPv4 addr 0.0.0.0 is allowed.
- * It means "bind to all addresses on the local machine". */
-int
-tor_addr_is_valid(const tor_addr_t *addr, int for_listening)
-{
-  /* NULL addresses are invalid regardless of for_listening */
-  if (addr == NULL) {
-    return 0;
-  }
-
-  /* Only allow IPv4 0.0.0.0 for_listening. */
-  if (for_listening && addr->family == AF_INET
-      && tor_addr_to_ipv4h(addr) == 0) {
-    return 1;
   }
-
-  /* Otherwise, the address is valid if it's not tor_addr_is_null() */
-  return !tor_addr_is_null(addr);
-}
-
-/* Is the network-order IPv4 address v4n_addr valid?
- * Checks that addr is not zero.
- * Except if for_listening is true, where IPv4 addr 0.0.0.0 is allowed. */
-int
-tor_addr_is_valid_ipv4n(uint32_t v4n_addr, int for_listening)
-{
-  /* Any IPv4 address is valid with for_listening. */
-  if (for_listening) {
-    return 1;
-  }
-
-  /* Otherwise, zero addresses are invalid. */
-  return v4n_addr != 0;
-}
-
-/* Is port valid?
- * Checks that port is not 0.
- * Except if for_listening is true, where port 0 is allowed.
- * It means "OS chooses a port". */
-int
-tor_port_is_valid(uint16_t port, int for_listening)
-{
-  /* Any port value is valid with for_listening. */
-  if (for_listening) {
-    return 1;
-  }
-
-  /* Otherwise, zero ports are invalid. */
-  return port != 0;
 }
 
 /** Set dest to equal the IPv4 address in v4addr (given in
@@ -1010,34 +874,6 @@ tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src)
   memcpy(dest, src, sizeof(tor_addr_t));
 }
 
-/** Copy a tor_addr_t from src to dest, taking extra care to
- * copy only the well-defined portions. Used for computing hashes of
- * addresses.
- */
-void
-tor_addr_copy_tight(tor_addr_t *dest, const tor_addr_t *src)
-{
-  tor_assert(src != dest);
-  tor_assert(src);
-  tor_assert(dest);
-  memset(dest, 0, sizeof(tor_addr_t));
-  dest->family = src->family;
-  switch (tor_addr_family(src))
-    {
-    case AF_INET:
-      dest->addr.in_addr.s_addr = src->addr.in_addr.s_addr;
-      break;
-    case AF_INET6:
-      memcpy(dest->addr.in6_addr.s6_addr, src->addr.in6_addr.s6_addr, 16);
-    case AF_UNSPEC:
-      break;
-      // LCOV_EXCL_START
-    default:
-      tor_fragile_assert();
-      // LCOV_EXCL_STOP
-    }
-}
-
 /** Given two addresses addr1 and addr2, return 0 if the two
  * addresses are equivalent under the mask mbits, less than 0 if addr1
  * precedes addr2, and greater than 0 otherwise.
@@ -1045,10 +881,6 @@ tor_addr_copy_tight(tor_addr_t *dest, const tor_addr_t *src)
  * Different address families (IPv4 vs IPv6) are always considered unequal if
  * how is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are
  * considered equivalent to their IPv4 equivalents.
- *
- * As a special case, all pointer-wise distinct AF_UNIX addresses are always
- * considered unequal since tor_addr_t currently does not contain the
- * information required to make the comparison.
  */
 int
 tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2,
@@ -1105,9 +937,6 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
         return r;
       }
       case AF_INET6: {
-        if (mbits > 128)
-          mbits = 128;
-
         const uint8_t *a1 = tor_addr_to_in6_addr8(addr1);
         const uint8_t *a2 = tor_addr_to_in6_addr8(addr2);
         const int bytes = mbits >> 3;
@@ -1122,29 +951,9 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
           return 0;
         }
       }
-      case AF_UNIX:
-        /* HACKHACKHACKHACKHACK:
-         * tor_addr_t doesn't contain a copy of sun_path, so it's not
-         * possible to comapre this at all.
-         *
-         * Since the only time we currently actually should be comparing
-         * 2 AF_UNIX addresses is when dealing with ISO_CLIENTADDR (which
-         * is disabled for AF_UNIX SocksPorts anyway), this just does
-         * a pointer comparison.
-         *
-         * See: #20261.
-         */
-        if (addr1 < addr2)
-          return -1;
-        else if (addr1 == addr2)
-          return 0;
-        else
-          return 1;
-        /* LCOV_EXCL_START */
       default:
         tor_fragile_assert();
         return 0;
-        /* LCOV_EXCL_STOP */
     }
   } else if (how == CMP_EXACT) {
     /* Unequal families and an exact comparison?  Stop now! */
@@ -1174,6 +983,7 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
     } else {
       a2 = tor_addr_to_ipv4h(addr2);
     }
+    if (mbits <= 0) return 0;
     if (mbits > 32) mbits = 32;
     a1 >>= (32-mbits);
     a2 >>= (32-mbits);
@@ -1185,28 +995,28 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
   }
 }
 
-/** Return a hash code based on the address addr. DOCDOC extra */
-uint64_t
+/** Return a hash code based on the address addr */
+unsigned int
 tor_addr_hash(const tor_addr_t *addr)
 {
   switch (tor_addr_family(addr)) {
   case AF_INET:
-    return siphash24g(&addr->addr.in_addr.s_addr, 4);
+    return tor_addr_to_ipv4h(addr);
   case AF_UNSPEC:
     return 0x4e4d5342;
-  case AF_INET6:
-    return siphash24g(&addr->addr.in6_addr.s6_addr, 16);
-    /* LCOV_EXCL_START */
+  case AF_INET6: {
+    const uint32_t *u = tor_addr_to_in6_addr32(addr);
+    return u[0] + u[1] + u[2] + u[3];
+    }
   default:
     tor_fragile_assert();
     return 0;
-    /* LCOV_EXCL_STOP */
   }
 }
 
 /** Return a newly allocated string with a representation of addr. */
 char *
-tor_addr_to_str_dup(const tor_addr_t *addr)
+tor_dup_addr(const tor_addr_t *addr)
 {
   char buf[TOR_ADDR_BUF_LEN];
   if (tor_addr_to_str(buf, addr, sizeof(buf), 0)) {
@@ -1271,8 +1081,7 @@ fmt_addr32(uint32_t addr)
 int
 tor_addr_parse(tor_addr_t *addr, const char *src)
 {
-  /* Holds substring of IPv6 address after removing square brackets */
-  char *tmp = NULL;
+  char *tmp = NULL; /* Holds substring if we got a dotted quad. */
   int result;
   struct in_addr in_tmp;
   struct in6_addr in6_tmp;
@@ -1357,17 +1166,26 @@ typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)(
               ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG);
 #endif
 
-#ifdef HAVE_IFADDRS_TO_SMARTLIST
-/*
- * Convert a linked list consisting of ifaddrs structures
- * into smartlist of tor_addr_t structures.
- */
-STATIC smartlist_t *
-ifaddrs_to_smartlist(const struct ifaddrs *ifa, sa_family_t family)
+/** Try to ask our network interfaces what addresses they are bound to.
+ * Return a new smartlist of tor_addr_t on success, and NULL on failure.
+ * (An empty smartlist indicates that we successfully learned that we have no
+ * addresses.)  Log failure messages at severity. */
+static smartlist_t *
+get_interface_addresses_raw(int severity)
 {
-  smartlist_t *result = smartlist_new();
+#if defined(HAVE_GETIFADDRS)
+  /* Most free Unixy systems provide getifaddrs, which gives us a linked list
+   * of struct ifaddrs. */
+  struct ifaddrs *ifa = NULL;
   const struct ifaddrs *i;
+  smartlist_t *result;
+  if (getifaddrs(&ifa) < 0) {
+    log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s",
+           strerror(errno));
+    return NULL;
+  }
 
+  result = smartlist_new();
   for (i = ifa; i; i = i->ifa_next) {
     tor_addr_t tmp;
     if ((i->ifa_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
@@ -1377,79 +1195,14 @@ ifaddrs_to_smartlist(const struct ifaddrs *ifa, sa_family_t family)
     if (i->ifa_addr->sa_family != AF_INET &&
         i->ifa_addr->sa_family != AF_INET6)
       continue;
-    if (family != AF_UNSPEC && i->ifa_addr->sa_family != family)
-      continue;
     if (tor_addr_from_sockaddr(&tmp, i->ifa_addr, NULL) < 0)
       continue;
     smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
   }
 
-  return result;
-}
-
-/** Use getiffaddrs() function to get list of current machine
- * network interface addresses. Represent the result by smartlist of
- * tor_addr_t structures.
- */
-STATIC smartlist_t *
-get_interface_addresses_ifaddrs(int severity, sa_family_t family)
-{
-
-  /* Most free Unixy systems provide getifaddrs, which gives us a linked list
-   * of struct ifaddrs. */
-  struct ifaddrs *ifa = NULL;
-  smartlist_t *result;
-  if (getifaddrs(&ifa) < 0) {
-    log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s",
-           strerror(errno));
-    return NULL;
-  }
-
-  result = ifaddrs_to_smartlist(ifa, family);
-
   freeifaddrs(ifa);
-
-  return result;
-}
-#endif /* defined(HAVE_IFADDRS_TO_SMARTLIST) */
-
-#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
-
-/** Convert a Windows-specific addresses linked list into smartlist
- * of tor_addr_t structures.
- */
-
-STATIC smartlist_t *
-ip_adapter_addresses_to_smartlist(const IP_ADAPTER_ADDRESSES *addresses)
-{
-  smartlist_t *result = smartlist_new();
-  const IP_ADAPTER_ADDRESSES *address;
-
-  for (address = addresses; address; address = address->Next) {
-    const IP_ADAPTER_UNICAST_ADDRESS *a;
-    for (a = address->FirstUnicastAddress; a; a = a->Next) {
-      /* Yes, it's a linked list inside a linked list */
-      const struct sockaddr *sa = a->Address.lpSockaddr;
-      tor_addr_t tmp;
-      if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
-        continue;
-      if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
-        continue;
-      smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
-    }
-  }
-
   return result;
-}
-
-/** Windows only: use GetAdaptersInfo() function to retrieve network interface
- * addresses of current machine and return them to caller as smartlist of
- * tor_addr_t  structures.
- */
-STATIC smartlist_t *
-get_interface_addresses_win32(int severity, sa_family_t family)
-{
-
+#elif defined(_WIN32)
   /* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a
      "GetAdaptersInfo", but that's deprecated; let's just try
      GetAdaptersAddresses and fall back to connect+getsockname.
@@ -1458,7 +1211,7 @@ get_interface_addresses_win32(int severity, sa_family_t family)
   smartlist_t *result = NULL;
   GetAdaptersAddresses_fn_t fn;
   ULONG size, res;
-  IP_ADAPTER_ADDRESSES *addresses = NULL;
+  IP_ADAPTER_ADDRESSES *addresses = NULL, *address;
 
   (void) severity;
 
@@ -1481,7 +1234,7 @@ get_interface_addresses_win32(int severity, sa_family_t family)
   /* Guess how much space we need. */
   size = 15*1024;
   addresses = tor_malloc(size);
-  res = fn(family, FLAGS, NULL, addresses, &size);
+  res = fn(AF_UNSPEC, FLAGS, NULL, addresses, &size);
   if (res == ERROR_BUFFER_OVERFLOW) {
     /* we didn't guess that we needed enough space; try again */
     tor_free(addresses);
@@ -1493,148 +1246,71 @@ get_interface_addresses_win32(int severity, sa_family_t family)
     goto done;
   }
 
-  result = ip_adapter_addresses_to_smartlist(addresses);
+  result = smartlist_new();
+  for (address = addresses; address; address = address->Next) {
+    IP_ADAPTER_UNICAST_ADDRESS *a;
+    for (a = address->FirstUnicastAddress; a; a = a->Next) {
+      /* Yes, it's a linked list inside a linked list */
+      struct sockaddr *sa = a->Address.lpSockaddr;
+      tor_addr_t tmp;
+      if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
+        continue;
+      if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
+        continue;
+      smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
+    }
+  }
 
  done:
   if (lib)
     FreeLibrary(lib);
   tor_free(addresses);
   return result;
-}
-
-#endif /* defined(HAVE_IP_ADAPTER_TO_SMARTLIST) */
-
-#ifdef HAVE_IFCONF_TO_SMARTLIST
-
-/* Guess how much space we need. There shouldn't be any struct ifreqs
- * larger than this, even on OS X where the struct's size is dynamic. */
-#define IFREQ_SIZE 4096
-
-/* This is defined on Mac OS X */
-#ifndef _SIZEOF_ADDR_IFREQ
-#define _SIZEOF_ADDR_IFREQ sizeof
-#endif
-
-/** Convert *buf, an ifreq structure array of size buflen,
- * into smartlist of tor_addr_t structures.
- */
-STATIC smartlist_t *
-ifreq_to_smartlist(char *buf, size_t buflen)
-{
-  smartlist_t *result = smartlist_new();
-  char *end = buf + buflen;
-
-  /* These acrobatics are due to alignment issues which trigger
-   * undefined behaviour traps on OSX. */
-  struct ifreq *r = tor_malloc(IFREQ_SIZE);
-
-  while (buf < end) {
-    /* Copy up to IFREQ_SIZE bytes into the struct ifreq, but don't overrun
-     * buf. */
-    memcpy(r, buf, end - buf < IFREQ_SIZE ? end - buf : IFREQ_SIZE);
-
-    const struct sockaddr *sa = &r->ifr_addr;
-    tor_addr_t tmp;
-    int valid_sa_family = (sa->sa_family == AF_INET ||
-                           sa->sa_family == AF_INET6);
-
-    int conversion_success = (tor_addr_from_sockaddr(&tmp, sa, NULL) == 0);
-
-    if (valid_sa_family && conversion_success)
-      smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
-
-    buf += _SIZEOF_ADDR_IFREQ(*r);
-  }
-
-  tor_free(r);
-  return result;
-}
-
-/** Use ioctl(.,SIOCGIFCONF,.) to get a list of current machine
- * network interface addresses. Represent the result by smartlist of
- * tor_addr_t structures.
- */
-STATIC smartlist_t *
-get_interface_addresses_ioctl(int severity, sa_family_t family)
-{
+#elif defined(SIOCGIFCONF) && defined(HAVE_IOCTL)
   /* Some older unixy systems make us use ioctl(SIOCGIFCONF) */
   struct ifconf ifc;
-  ifc.ifc_buf = NULL;
-  int fd;
+  int fd, i, sz, n;
   smartlist_t *result = NULL;
-
-  /* This interface, AFAICT, only supports AF_INET addresses,
-   * except on AIX. For Solaris, we could use SIOCGLIFCONF. */
-
-  /* Bail out if family is neither AF_INET nor AF_UNSPEC since
-   * ioctl() technique supports non-IPv4 interface addresses on
-   * a small number of niche systems only. If family is AF_UNSPEC,
-   * fall back to getting AF_INET addresses only. */
-  if (family == AF_UNSPEC)
-    family = AF_INET;
-  else if (family != AF_INET)
-    return NULL;
-
-  fd = socket(family, SOCK_DGRAM, 0);
+  /* This interface, AFAICT, only supports AF_INET addresses */
+  fd = socket(AF_INET, SOCK_DGRAM, 0);
   if (fd < 0) {
     tor_log(severity, LD_NET, "socket failed: %s", strerror(errno));
     goto done;
   }
-
-  int mult = 1;
-  do {
-    mult *= 2;
-    ifc.ifc_len = mult * IFREQ_SIZE;
-    ifc.ifc_buf = tor_realloc(ifc.ifc_buf, ifc.ifc_len);
-
-    tor_assert(ifc.ifc_buf);
-
-    if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
-      tor_log(severity, LD_NET, "ioctl failed: %s", strerror(errno));
-      goto done;
-    }
-    /* Ensure we have least IFREQ_SIZE bytes unused at the end. Otherwise, we
-     * don't know if we got everything during ioctl. */
-  } while (mult * IFREQ_SIZE - ifc.ifc_len <= IFREQ_SIZE);
-  result = ifreq_to_smartlist(ifc.ifc_buf, ifc.ifc_len);
-
- done:
-  if (fd >= 0)
+  /* Guess how much space we need. */
+  ifc.ifc_len = sz = 15*1024;
+  ifc.ifc_ifcu.ifcu_req = tor_malloc(sz);
+  if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
+    tor_log(severity, LD_NET, "ioctl failed: %s", strerror(errno));
     close(fd);
-  tor_free(ifc.ifc_buf);
+    goto done;
+  }
+  close(fd);
+  result = smartlist_new();
+  if (ifc.ifc_len < sz)
+    sz = ifc.ifc_len;
+  n = sz / sizeof(struct ifreq);
+  for (i = 0; i < n ; ++i) {
+    struct ifreq *r = &ifc.ifc_ifcu.ifcu_req[i];
+    struct sockaddr *sa = &r->ifr_addr;
+    tor_addr_t tmp;
+    if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
+      continue; /* should be impossible */
+    if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
+      continue;
+    smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
+  }
+ done:
+  tor_free(ifc.ifc_ifcu.ifcu_req);
   return result;
-}
-#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */
-
-/** Try to ask our network interfaces what addresses they are bound to.
- * Return a new smartlist of tor_addr_t on success, and NULL on failure.
- * (An empty smartlist indicates that we successfully learned that we have no
- * addresses.)  Log failure messages at severity. Only return the
- * interface addresses of requested family and ignore the addresses
- * of other address families. */
-MOCK_IMPL(smartlist_t *,
-get_interface_addresses_raw,(int severity, sa_family_t family))
-{
-  smartlist_t *result = NULL;
-#if defined(HAVE_IFADDRS_TO_SMARTLIST)
-  if ((result = get_interface_addresses_ifaddrs(severity, family)))
-    return result;
-#endif
-#if defined(HAVE_IP_ADAPTER_TO_SMARTLIST)
-  if ((result = get_interface_addresses_win32(severity, family)))
-    return result;
-#endif
-#if defined(HAVE_IFCONF_TO_SMARTLIST)
-  if ((result = get_interface_addresses_ioctl(severity, family)))
-    return result;
-#endif
+#else
   (void) severity;
-  (void) result;
   return NULL;
+#endif
 }
 
 /** Return true iff a is a multicast address.  */
-int
+static int
 tor_addr_is_multicast(const tor_addr_t *a)
 {
   sa_family_t family = tor_addr_family(a);
@@ -1650,23 +1326,47 @@ tor_addr_is_multicast(const tor_addr_t *a)
   return 0;
 }
 
-/** Attempt to retrieve IP address of current host by utilizing some
- * UDP socket trickery. Only look for address of given family
- * (only AF_INET and AF_INET6 are supported). Set result to *addr.
- * Return 0 on success, -1 on failure.
+/** Set *addr to the IP address (if any) of whatever interface
+ * connects to the Internet.  This address should only be used in checking
+ * whether our address has changed.  Return 0 on success, -1 on failure.
  */
-MOCK_IMPL(int,
-get_interface_address6_via_udp_socket_hack,(int severity,
-                                            sa_family_t family,
-                                            tor_addr_t *addr))
+int
+get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
 {
-  struct sockaddr_storage my_addr, target_addr;
+  /* XXX really, this function should yield a smartlist of addresses. */
+  smartlist_t *addrs;
   int sock=-1, r=-1;
+  struct sockaddr_storage my_addr, target_addr;
   socklen_t addr_len;
+  tor_assert(addr);
+
+  /* Try to do this the smart way if possible. */
+  if ((addrs = get_interface_addresses_raw(severity))) {
+    int rv = -1;
+    SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, a) {
+      if (family != AF_UNSPEC && family != tor_addr_family(a))
+        continue;
+      if (tor_addr_is_loopback(a) ||
+          tor_addr_is_multicast(a))
+        continue;
+
+      tor_addr_copy(addr, a);
+      rv = 0;
+
+      /* If we found a non-internal address, declare success.  Otherwise,
+       * keep looking. */
+      if (!tor_addr_is_internal(a, 0))
+        break;
+    } SMARTLIST_FOREACH_END(a);
 
+    SMARTLIST_FOREACH(addrs, tor_addr_t *, a, tor_free(a));
+    smartlist_free(addrs);
+    return rv;
+  }
+
+  /* Okay, the smart way is out. */
   memset(addr, 0, sizeof(tor_addr_t));
   memset(&target_addr, 0, sizeof(target_addr));
-
   /* Don't worry: no packets are sent. We just need to use a real address
    * on the actual Internet. */
   if (family == AF_INET6) {
@@ -1688,7 +1388,6 @@ get_interface_address6_via_udp_socket_hack,(int severity,
   } else {
     return -1;
   }
-
   if (sock < 0) {
     int e = tor_socket_errno(-1);
     log_fn(severity, LD_NET, "unable to create socket: %s",
@@ -1696,174 +1395,57 @@ get_interface_address6_via_udp_socket_hack,(int severity,
     goto err;
   }
 
-  if (tor_connect_socket(sock,(struct sockaddr *)&target_addr,
-                         addr_len) < 0) {
+  if (connect(sock,(struct sockaddr *)&target_addr, addr_len) < 0) {
     int e = tor_socket_errno(sock);
     log_fn(severity, LD_NET, "connect() failed: %s", tor_socket_strerror(e));
     goto err;
   }
 
-  if (tor_getsockname(sock,(struct sockaddr*)&my_addr, &addr_len)) {
+  if (getsockname(sock,(struct sockaddr*)&my_addr, &addr_len)) {
     int e = tor_socket_errno(sock);
     log_fn(severity, LD_NET, "getsockname() to determine interface failed: %s",
            tor_socket_strerror(e));
     goto err;
   }
 
- if (tor_addr_from_sockaddr(addr, (struct sockaddr*)&my_addr, NULL) == 0) {
-    if (tor_addr_is_loopback(addr) || tor_addr_is_multicast(addr)) {
-      log_fn(severity, LD_NET, "Address that we determined via UDP socket"
-                               " magic is unsuitable for public comms.");
-    } else {
-      r=0;
-    }
- }
-
+  tor_addr_from_sockaddr(addr, (struct sockaddr*)&my_addr, NULL);
+  r=0;
  err:
   if (sock >= 0)
     tor_close_socket(sock);
-  if (r == -1)
-    memset(addr, 0, sizeof(tor_addr_t));
   return r;
 }
 
-/** Set *addr to an arbitrary IP address (if any) of an interface that
- * connects to the Internet.  Prefer public IP addresses to internal IP
- * addresses.  This address should only be used in checking whether our
- * address has changed, as it may be an internal IP address.  Return 0 on
- * success, -1 on failure.
- * Prefer get_interface_address6_list for a list of all addresses on all
- * interfaces which connect to the Internet.
- */
-MOCK_IMPL(int,
-get_interface_address6,(int severity, sa_family_t family, tor_addr_t *addr))
-{
-  smartlist_t *addrs;
-  int rv = -1;
-  tor_assert(addr);
-
-  memset(addr, 0, sizeof(tor_addr_t));
-
-  /* Get a list of public or internal IPs in arbitrary order */
-  addrs = get_interface_address6_list(severity, family, 1);
-
-  /* Find the first non-internal address, or the last internal address
-   * Ideally, we want the default route, see #12377 for details */
-  SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, a) {
-    tor_addr_copy(addr, a);
-    rv = 0;
-
-    /* If we found a non-internal address, declare success.  Otherwise,
-     * keep looking. */
-    if (!tor_addr_is_internal(a, 0))
-      break;
-  } SMARTLIST_FOREACH_END(a);
-
-  interface_address6_list_free(addrs);
-  return rv;
-}
-
-/** Free a smartlist of IP addresses returned by get_interface_address6_list.
+/* ======
+ * IPv4 helpers
+ * XXXX024 IPv6 deprecate some of these.
  */
-void
-interface_address6_list_free_(smartlist_t *addrs)
-{
-  if (addrs != NULL) {
-    SMARTLIST_FOREACH(addrs, tor_addr_t *, a, tor_free(a));
-    smartlist_free(addrs);
-  }
-}
 
-/** Return a smartlist of the IP addresses of type family from all interfaces
- * on the server. Excludes loopback and multicast addresses. Only includes
- * internal addresses if include_internal is true. (Note that a relay behind
- * NAT may use an internal address to connect to the Internet.)
- * An empty smartlist means that there are no addresses of the selected type
- * matching these criteria.
- * Returns NULL on failure.
- * Use interface_address6_list_free to free the returned list.
+/** Return true iff ip (in host order) is an IP reserved to localhost,
+ * or reserved for local networks by RFC 1918.
  */
-MOCK_IMPL(smartlist_t *,
-get_interface_address6_list,(int severity,
-                             sa_family_t family,
-                             int include_internal))
+int
+is_internal_IP(uint32_t ip, int for_listening)
 {
-  smartlist_t *addrs;
-  tor_addr_t addr;
-
-  /* Try to do this the smart way if possible. */
-  if ((addrs = get_interface_addresses_raw(severity, family))) {
-    SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, a)
-    {
-      if (tor_addr_is_loopback(a) ||
-          tor_addr_is_multicast(a)) {
-        SMARTLIST_DEL_CURRENT_KEEPORDER(addrs, a);
-        tor_free(a);
-        continue;
-      }
+  tor_addr_t myaddr;
+  myaddr.family = AF_INET;
+  myaddr.addr.in_addr.s_addr = htonl(ip);
 
-      if (!include_internal && tor_addr_is_internal(a, 0)) {
-        SMARTLIST_DEL_CURRENT_KEEPORDER(addrs, a);
-        tor_free(a);
-        continue;
-      }
-    } SMARTLIST_FOREACH_END(a);
-  }
-
-  if (addrs && smartlist_len(addrs) > 0) {
-    return addrs;
-  }
-
-  /* if we removed all entries as unsuitable */
-  if (addrs) {
-    smartlist_free(addrs);
-  }
-
-  /* Okay, the smart way is out. */
-  addrs = smartlist_new();
-
-  if (family == AF_INET || family == AF_UNSPEC) {
-    if (get_interface_address6_via_udp_socket_hack(severity,AF_INET,
-                                                   &addr) == 0) {
-      if (include_internal || !tor_addr_is_internal(&addr, 0)) {
-        smartlist_add(addrs, tor_memdup(&addr, sizeof(addr)));
-      }
-    }
-  }
-
-  if (family == AF_INET6 || family == AF_UNSPEC) {
-    if (get_interface_address6_via_udp_socket_hack(severity,AF_INET6,
-                                                   &addr) == 0) {
-      if (include_internal || !tor_addr_is_internal(&addr, 0)) {
-        smartlist_add(addrs, tor_memdup(&addr, sizeof(addr)));
-      }
-    }
-  }
-
-  return addrs;
+  return tor_addr_is_internal(&myaddr, for_listening);
 }
 
-/* ======
- * IPv4 helpers
- * XXXX IPv6 deprecate some of these.
- */
-
 /** Given an address of the form "ip:port", try to divide it into its
  * ip and port portions, setting *address_out to a newly
  * allocated string holding the address portion and *port_out
  * to the port.
  *
- * Don't do DNS lookups and don't allow domain names in the "ip" field.
- *
- * If default_port is less than 0, don't accept addrport of the
- * form "ip" or "ip:0".  Otherwise, accept those forms, and set
- * *port_out to default_port.
+ * Don't do DNS lookups and don't allow domain names in the  field.
+ * Don't accept addrport of the form "" or ":0".
  *
  * Return 0 on success, -1 on failure. */
 int
 tor_addr_port_parse(int severity, const char *addrport,
-                    tor_addr_t *address_out, uint16_t *port_out,
-                    int default_port)
+                    tor_addr_t *address_out, uint16_t *port_out)
 {
   int retval = -1;
   int r;
@@ -1877,12 +1459,8 @@ tor_addr_port_parse(int severity, const char *addrport,
   if (r < 0)
     goto done;
 
-  if (!*port_out) {
-    if (default_port >= 0)
-      *port_out = default_port;
-    else
-      goto done;
-  }
+  if (!*port_out)
+    goto done;
 
   /* make sure that address_out is an IP address */
   if (tor_addr_parse(address_out, addr_tmp) < 0)
@@ -1896,25 +1474,16 @@ tor_addr_port_parse(int severity, const char *addrport,
 }
 
 /** Given an address of the form "host[:port]", try to divide it into its host
- * and port portions, setting *address_out to a newly allocated string
+ * ane port portions, setting *address_out to a newly allocated string
  * holding the address portion and *port_out to the port (or 0 if no
  * port is given).  Return 0 on success, -1 on failure. */
 int
 tor_addr_port_split(int severity, const char *addrport,
                     char **address_out, uint16_t *port_out)
 {
-  tor_addr_t a_tmp;
   tor_assert(addrport);
   tor_assert(address_out);
   tor_assert(port_out);
-  /* We need to check for IPv6 manually because addr_port_lookup() doesn't
-   * do a good job on IPv6 addresses that lack a port. */
-  if (tor_addr_parse(&a_tmp, addrport) == AF_INET6) {
-    *port_out = 0;
-    *address_out = tor_strdup(addrport);
-    return 0;
-  }
-
   return addr_port_lookup(severity, addrport, address_out, NULL, port_out);
 }
 
@@ -1992,7 +1561,7 @@ addr_mask_get_bits(uint32_t mask)
     return 0;
   if (mask == 0xFFFFFFFFu)
     return 32;
-  for (i=1; i<=32; ++i) {
+  for (i=0; i<=32; ++i) {
     if (mask == (uint32_t) ~((1u<<(32-i))-1)) {
       return i;
     }
@@ -2054,8 +1623,7 @@ parse_port_range(const char *port, uint16_t *port_min_out,
 
 /** Given an IPv4 in_addr struct *in (in network order, as usual),
  *  write it as a string into the buf_len-byte buffer in
- *  buf. Returns a non-negative integer on success.
- *  Returns -1 on failure.
+ *  buf.
  */
 int
 tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len)
@@ -2083,22 +1651,17 @@ tor_dup_ip(uint32_t addr)
 }
 
 /**
- * Set *addr to a host-order IPv4 address (if any) of an
- * interface that connects to the Internet.  Prefer public IP addresses to
- * internal IP addresses.  This address should only be used in checking
- * whether our address has changed, as it may be an internal IPv4 address.
- * Return 0 on success, -1 on failure.
- * Prefer get_interface_address_list6 for a list of all IPv4 and IPv6
- * addresses on all interfaces which connect to the Internet.
+ * Set *addr to the host-order IPv4 address (if any) of whatever
+ * interface connects to the Internet.  This address should only be used in
+ * checking whether our address has changed.  Return 0 on success, -1 on
+ * failure.
  */
-MOCK_IMPL(int,
-get_interface_address,(int severity, uint32_t *addr))
+int
+get_interface_address(int severity, uint32_t *addr)
 {
   tor_addr_t local_addr;
   int r;
 
-  memset(addr, 0, sizeof(uint32_t));
-
   r = get_interface_address6(severity, AF_INET, &local_addr);
   if (r>=0)
     *addr = tor_addr_to_ipv4h(&local_addr);
@@ -2106,8 +1669,7 @@ get_interface_address,(int severity, uint32_t *addr))
 }
 
 /** Return true if we can tell that name is a canonical name for the
- * loopback address.  Return true also for *.local hostnames, which are
- * multicast DNS names for hosts on the local network. */
+ * loopback address. */
 int
 tor_addr_hostname_is_local(const char *name)
 {
@@ -2128,11 +1690,3 @@ tor_addr_port_new(const tor_addr_t *addr, uint16_t port)
   return ap;
 }
 
-/** Return true iff a and b are the same address and port */
-int
-tor_addr_port_eq(const tor_addr_port_t *a,
-                 const tor_addr_port_t *b)
-{
-  return tor_addr_eq(&a->addr, &b->addr) && a->port == b->port;
-}
-
diff --git a/src/tor/src/common/address.h b/src/tor/address.h
similarity index 50%
rename from src/tor/src/common/address.h
rename to src/tor/address.h
index 7607c76ba..87909a32a 100644
--- a/src/tor/src/common/address.h
+++ b/src/tor/address.h
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -11,40 +11,9 @@
 #ifndef TOR_ADDRESS_H
 #define TOR_ADDRESS_H
 
-//#include 
 #include "orconfig.h"
 #include "torint.h"
-#include "compat.h"
-#include "container.h"
-
-#ifdef ADDRESS_PRIVATE
-
-#if defined(HAVE_SYS_IOCTL_H)
-#include 
-#endif
-
-#ifdef HAVE_GETIFADDRS
-#define HAVE_IFADDRS_TO_SMARTLIST
-#endif
-
-#ifdef _WIN32
-#define HAVE_IP_ADAPTER_TO_SMARTLIST
-#endif
-
-#if defined(SIOCGIFCONF) && defined(HAVE_IOCTL)
-#define HAVE_IFCONF_TO_SMARTLIST
-#endif
-
-#if defined(HAVE_NET_IF_H)
-#include  // for struct ifconf
-#endif
-
-#if defined(HAVE_IFADDRS_TO_SMARTLIST)
-#include 
-#endif
-
-// TODO win32 specific includes
-#endif /* defined(ADDRESS_PRIVATE) */
+#include "tor_compat.h"
 
 /** The number of bits from an address to consider while doing a masked
  * comparison. */
@@ -73,15 +42,13 @@ typedef struct tor_addr_port_t
 
 #define TOR_ADDR_NULL {AF_UNSPEC, {0}}
 
-static inline const struct in6_addr *tor_addr_to_in6(const tor_addr_t *a);
-static inline const struct in6_addr *tor_addr_to_in6_assert(
-    const tor_addr_t *a);
-static inline uint32_t tor_addr_to_ipv4n(const tor_addr_t *a);
-static inline uint32_t tor_addr_to_ipv4h(const tor_addr_t *a);
-static inline uint32_t tor_addr_to_mapped_ipv4h(const tor_addr_t *a);
-static inline sa_family_t tor_addr_family(const tor_addr_t *a);
-static inline const struct in_addr *tor_addr_to_in(const tor_addr_t *a);
-static inline int tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u);
+static INLINE const struct in6_addr *tor_addr_to_in6(const tor_addr_t *a);
+static INLINE uint32_t tor_addr_to_ipv4n(const tor_addr_t *a);
+static INLINE uint32_t tor_addr_to_ipv4h(const tor_addr_t *a);
+static INLINE uint32_t tor_addr_to_mapped_ipv4h(const tor_addr_t *a);
+static INLINE sa_family_t tor_addr_family(const tor_addr_t *a);
+static INLINE const struct in_addr *tor_addr_to_in(const tor_addr_t *a);
+static INLINE int tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u);
 
 socklen_t tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port,
                                struct sockaddr *sa_out, socklen_t len);
@@ -93,48 +60,38 @@ char *tor_sockaddr_to_str(const struct sockaddr *sa);
 
 /** Return an in6_addr* equivalent to a, or NULL if a is not
  * an IPv6 address. */
-static inline const struct in6_addr *
+static INLINE const struct in6_addr *
 tor_addr_to_in6(const tor_addr_t *a)
 {
   return a->family == AF_INET6 ? &a->addr.in6_addr : NULL;
 }
 
-/** As tor_addr_to_in6, but assert that the address truly is an IPv6
- * address. */
-static inline const struct in6_addr *
-tor_addr_to_in6_assert(const tor_addr_t *a)
-{
-  tor_assert(a->family == AF_INET6);
-  return &a->addr.in6_addr;
-}
-
 /** Given an IPv6 address x, yield it as an array of uint8_t.
  *
  * Requires that x is actually an IPv6 address.
  */
-#define tor_addr_to_in6_addr8(x) tor_addr_to_in6_assert(x)->s6_addr
-
+#define tor_addr_to_in6_addr8(x) tor_addr_to_in6(x)->s6_addr
 /** Given an IPv6 address x, yield it as an array of uint16_t.
  *
  * Requires that x is actually an IPv6 address.
  */
-#define tor_addr_to_in6_addr16(x) S6_ADDR16(*tor_addr_to_in6_assert(x))
+#define tor_addr_to_in6_addr16(x) S6_ADDR16(*tor_addr_to_in6(x))
 /** Given an IPv6 address x, yield it as an array of uint32_t.
  *
  * Requires that x is actually an IPv6 address.
  */
-#define tor_addr_to_in6_addr32(x) S6_ADDR32(*tor_addr_to_in6_assert(x))
+#define tor_addr_to_in6_addr32(x) S6_ADDR32(*tor_addr_to_in6(x))
 
 /** Return an IPv4 address in network order for a, or 0 if
  * a is not an IPv4 address. */
-static inline uint32_t
+static INLINE uint32_t
 tor_addr_to_ipv4n(const tor_addr_t *a)
 {
   return a->family == AF_INET ? a->addr.in_addr.s_addr : 0;
 }
 /** Return an IPv4 address in host order for a, or 0 if
  * a is not an IPv4 address. */
-static inline uint32_t
+static INLINE uint32_t
 tor_addr_to_ipv4h(const tor_addr_t *a)
 {
   return ntohl(tor_addr_to_ipv4n(a));
@@ -143,39 +100,28 @@ tor_addr_to_ipv4h(const tor_addr_t *a)
  * 0 if a is not an IPv6 address.
  *
  * (Does not check whether the address is really a mapped address */
-static inline uint32_t
+static INLINE uint32_t
 tor_addr_to_mapped_ipv4h(const tor_addr_t *a)
 {
-  if (a->family == AF_INET6) {
-    uint32_t *addr32 = NULL;
-    // Work around an incorrect NULL pointer dereference warning in
-    // "clang --analyze" due to limited analysis depth
-    addr32 = tor_addr_to_in6_addr32(a);
-    // To improve performance, wrap this assertion in:
-    // #if !defined(__clang_analyzer__) || PARANOIA
-    tor_assert(addr32);
-    return ntohl(addr32[3]);
-  } else {
-    return 0;
-  }
+  return a->family == AF_INET6 ? ntohl(tor_addr_to_in6_addr32(a)[3]) : 0;
 }
 /** Return the address family of a.  Possible values are:
  * AF_INET6, AF_INET, AF_UNSPEC. */
-static inline sa_family_t
+static INLINE sa_family_t
 tor_addr_family(const tor_addr_t *a)
 {
   return a->family;
 }
 /** Return an in_addr* equivalent to a, or NULL if a is not
  * an IPv4 address. */
-static inline const struct in_addr *
+static INLINE const struct in_addr *
 tor_addr_to_in(const tor_addr_t *a)
 {
   return a->family == AF_INET ? &a->addr.in_addr : NULL;
 }
 /** Return true iff a is an IPv4 address equal to the host-ordered
  * address in u. */
-static inline int
+static INLINE int
 tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u)
 {
   return a->family == AF_INET ? (tor_addr_to_ipv4h(a) == u) : 0;
@@ -190,9 +136,8 @@ tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u)
  */
 #define TOR_ADDR_BUF_LEN 48
 
-MOCK_DECL(int, tor_addr_lookup,(const char *name, uint16_t family,
-                                tor_addr_t *addr_out));
-char *tor_addr_to_str_dup(const tor_addr_t *addr) ATTR_MALLOC;
+int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out);
+char *tor_dup_addr(const tor_addr_t *addr) ATTR_MALLOC;
 
 /** Wrapper function of fmt_addr_impl(). It does not decorate IPv6
  *  addresses. */
@@ -203,15 +148,7 @@ char *tor_addr_to_str_dup(const tor_addr_t *addr) ATTR_MALLOC;
 const char *fmt_addr_impl(const tor_addr_t *addr, int decorate);
 const char *fmt_addrport(const tor_addr_t *addr, uint16_t port);
 const char * fmt_addr32(uint32_t addr);
-
-MOCK_DECL(int,get_interface_address6,(int severity, sa_family_t family,
-tor_addr_t *addr));
-void interface_address6_list_free_(smartlist_t * addrs);// XXXX
-#define interface_address6_list_free(addrs) \
-  FREE_AND_NULL(smartlist_t, interface_address6_list_free_, (addrs))
-MOCK_DECL(smartlist_t *,get_interface_address6_list,(int severity,
-                                                     sa_family_t family,
-                                                     int include_internal));
+int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr);
 
 /** Flag to specify how to do a comparison between addresses.  In an "exact"
  * comparison, addresses are equivalent only if they are in the same family
@@ -230,13 +167,12 @@ int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
  * "exactly". */
 #define tor_addr_eq(a,b) (0==tor_addr_compare((a),(b),CMP_EXACT))
 
-uint64_t tor_addr_hash(const tor_addr_t *addr);
+unsigned int tor_addr_hash(const tor_addr_t *addr);
 int tor_addr_is_v4(const tor_addr_t *addr);
 int tor_addr_is_internal_(const tor_addr_t *ip, int for_listening,
                           const char *filename, int lineno);
 #define tor_addr_is_internal(addr, for_listening) \
   tor_addr_is_internal_((addr), (for_listening), SHORT_FILE__, __LINE__)
-int tor_addr_is_multicast(const tor_addr_t *a);
 
 /** Longest length that can be required for a reverse lookup name. */
 /* 32 nybbles, 32 dots, 8 characters of "ip6.arpa", 1 NUL: 73 characters. */
@@ -248,19 +184,7 @@ int tor_addr_parse_PTR_name(tor_addr_t *result, const char *address,
 
 int tor_addr_port_lookup(const char *s, tor_addr_t *addr_out,
                         uint16_t *port_out);
-
-/* Does the address * yield an AF_UNSPEC wildcard address (1),
- * which expands to corresponding wildcard IPv4 and IPv6 rules, and do we
- * allow *4 and *6 for IPv4 and IPv6 wildcards, respectively;
- * or does the address * yield IPv4 wildcard address (0).  */
 #define TAPMP_EXTENDED_STAR 1
-/* Does the address * yield an IPv4 wildcard address rule (1);
- * or does it yield wildcard IPv4 and IPv6 rules (0) */
-#define TAPMP_STAR_IPV4_ONLY     (1 << 1)
-/* Does the address * yield an IPv6 wildcard address rule (1);
- * or does it yield wildcard IPv4 and IPv6 rules (0) */
-#define TAPMP_STAR_IPV6_ONLY     (1 << 2)
-/* TAPMP_STAR_IPV4_ONLY and TAPMP_STAR_IPV6_ONLY are mutually exclusive. */
 int tor_addr_parse_mask_ports(const char *s, unsigned flags,
                               tor_addr_t *addr_out, maskbits_t *mask_out,
                               uint16_t *port_min_out, uint16_t *port_max_out);
@@ -268,7 +192,6 @@ const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len,
                              int decorate);
 int tor_addr_parse(tor_addr_t *addr, const char *src);
 void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src);
-void tor_addr_copy_tight(tor_addr_t *dest, const tor_addr_t *src);
 void tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr);
 /** Set dest to the IPv4 address encoded in v4addr in host
  * order. */
@@ -282,37 +205,16 @@ void tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6);
 int tor_addr_is_null(const tor_addr_t *addr);
 int tor_addr_is_loopback(const tor_addr_t *addr);
 
-int tor_addr_is_valid(const tor_addr_t *addr, int for_listening);
-int tor_addr_is_valid_ipv4n(uint32_t v4n_addr, int for_listening);
-#define tor_addr_is_valid_ipv4h(v4h_addr, for_listening) \
-        tor_addr_is_valid_ipv4n(htonl(v4h_addr), (for_listening))
-int tor_port_is_valid(uint16_t port, int for_listening);
-/* Are addr and port both valid? */
-#define tor_addr_port_is_valid(addr, port, for_listening) \
-        (tor_addr_is_valid((addr), (for_listening)) &&    \
-         tor_port_is_valid((port), (for_listening)))
-/* Are ap->addr and ap->port both valid? */
-#define tor_addr_port_is_valid_ap(ap, for_listening) \
-        tor_addr_port_is_valid(&(ap)->addr, (ap)->port, (for_listening))
-/* Are the network-order v4addr and port both valid? */
-#define tor_addr_port_is_valid_ipv4n(v4n_addr, port, for_listening) \
-        (tor_addr_is_valid_ipv4n((v4n_addr), (for_listening)) &&    \
-         tor_port_is_valid((port), (for_listening)))
-/* Are the host-order v4addr and port both valid? */
-#define tor_addr_port_is_valid_ipv4h(v4h_addr, port, for_listening) \
-        (tor_addr_is_valid_ipv4h((v4h_addr), (for_listening)) &&    \
-         tor_port_is_valid((port), (for_listening)))
-
 int tor_addr_port_split(int severity, const char *addrport,
                         char **address_out, uint16_t *port_out);
 
 int tor_addr_port_parse(int severity, const char *addrport,
-                        tor_addr_t *address_out, uint16_t *port_out,
-                        int default_port);
+                        tor_addr_t *address_out, uint16_t *port_out);
 
 int tor_addr_hostname_is_local(const char *name);
 
 /* IPv4 helpers */
+int is_internal_IP(uint32_t ip, int for_listening);
 int addr_port_lookup(int severity, const char *addrport, char **address,
                     uint32_t *addr, uint16_t *port_out);
 int parse_port_range(const char *port, uint16_t *port_min_out,
@@ -322,56 +224,9 @@ int addr_mask_get_bits(uint32_t mask);
 #define INET_NTOA_BUF_LEN 16
 int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len);
 char *tor_dup_ip(uint32_t addr) ATTR_MALLOC;
-MOCK_DECL(int,get_interface_address,(int severity, uint32_t *addr));
-#define interface_address_list_free(lst)\
-  interface_address6_list_free(lst)
-/** Return a smartlist of the IPv4 addresses of all interfaces on the server.
- * Excludes loopback and multicast addresses. Only includes internal addresses
- * if include_internal is true. (Note that a relay behind NAT may use an
- * internal address to connect to the Internet.)
- * An empty smartlist means that there are no IPv4 addresses.
- * Returns NULL on failure.
- * Use free_interface_address_list to free the returned list.
- */
-static inline smartlist_t *
-get_interface_address_list(int severity, int include_internal)
-{
-  return get_interface_address6_list(severity, AF_INET, include_internal);
-}
+int get_interface_address(int severity, uint32_t *addr);
 
 tor_addr_port_t *tor_addr_port_new(const tor_addr_t *addr, uint16_t port);
-int tor_addr_port_eq(const tor_addr_port_t *a,
-                     const tor_addr_port_t *b);
-
-#ifdef ADDRESS_PRIVATE
-MOCK_DECL(smartlist_t *,get_interface_addresses_raw,(int severity,
-                                                     sa_family_t family));
-MOCK_DECL(int,get_interface_address6_via_udp_socket_hack,(int severity,
-                                                          sa_family_t family,
-                                                          tor_addr_t *addr));
-
-#ifdef HAVE_IFADDRS_TO_SMARTLIST
-STATIC smartlist_t *ifaddrs_to_smartlist(const struct ifaddrs *ifa,
-                                         sa_family_t family);
-STATIC smartlist_t *get_interface_addresses_ifaddrs(int severity,
-                                                    sa_family_t family);
-#endif /* defined(HAVE_IFADDRS_TO_SMARTLIST) */
-
-#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
-STATIC smartlist_t *ip_adapter_addresses_to_smartlist(
-                                        const IP_ADAPTER_ADDRESSES *addresses);
-STATIC smartlist_t *get_interface_addresses_win32(int severity,
-                                                  sa_family_t family);
-#endif /* defined(HAVE_IP_ADAPTER_TO_SMARTLIST) */
 
-#ifdef HAVE_IFCONF_TO_SMARTLIST
-STATIC smartlist_t *ifreq_to_smartlist(char *ifr,
-                                       size_t buflen);
-STATIC smartlist_t *get_interface_addresses_ioctl(int severity,
-                                                  sa_family_t family);
-#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */
-
-#endif /* defined(ADDRESS_PRIVATE) */
-
-#endif /* !defined(TOR_ADDRESS_H) */
+#endif
 
diff --git a/src/tor/src/or/addressmap.c b/src/tor/addressmap.c
similarity index 86%
rename from src/tor/src/or/addressmap.c
rename to src/tor/addressmap.c
index 96ce27557..9bc79bd84 100644
--- a/src/tor/src/or/addressmap.c
+++ b/src/tor/addressmap.c
@@ -1,18 +1,9 @@
 /* Copyright (c) 2001 Matej Pfajfar.
  * Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
-/**
- * \file addressmap.c
- *
- * \brief The addressmap module manages the processes by which we rewrite
- * addresses in client requess.  It handles the MapAddress controller and
- * torrc commands, and the TrackHostExits feature, and the client-side DNS
- * cache (deprecated).
- */
-
 #define ADDRESSMAP_PRIVATE
 
 #include "or.h"
@@ -54,7 +45,7 @@
 typedef struct {
   char *new_address;
   time_t expires;
-  addressmap_entry_source_bitfield_t source:3;
+  ENUM_BF(addressmap_entry_source_t) source:3;
   unsigned src_wildcard:1;
   unsigned dst_wildcard:1;
   short num_resolve_failures;
@@ -90,49 +81,34 @@ addressmap_init(void)
   virtaddress_reversemap = strmap_new();
 }
 
-#define addressmap_ent_free(ent)                                        \
-  FREE_AND_NULL(addressmap_entry_t, addressmap_ent_free_, (ent))
-
 /** Free the memory associated with the addressmap entry _ent. */
 static void
-addressmap_ent_free_(addressmap_entry_t *ent)
+addressmap_ent_free(void *_ent)
 {
-  if (!ent)
+  addressmap_entry_t *ent;
+  if (!_ent)
     return;
 
+  ent = _ent;
   tor_free(ent->new_address);
   tor_free(ent);
 }
 
+/** Free storage held by a virtaddress_entry_t* entry in ent. */
 static void
-addressmap_ent_free_void(void *ent)
+addressmap_virtaddress_ent_free(void *_ent)
 {
-  addressmap_ent_free_(ent);
-}
-
-#define addressmap_virtaddress_ent_free(ent)                            \
-  FREE_AND_NULL(virtaddress_entry_t, addressmap_virtaddress_ent_free_, (ent))
-
-/** Free storage held by a virtaddress_entry_t* entry in _ent. */
-static void
-addressmap_virtaddress_ent_free_(virtaddress_entry_t *ent)
-{
-  if (!ent)
+  virtaddress_entry_t *ent;
+  if (!_ent)
     return;
+
+  ent = _ent;
   tor_free(ent->ipv4_address);
-  tor_free(ent->ipv6_address);
   tor_free(ent->hostname_address);
   tor_free(ent);
 }
 
-static void
-addressmap_virtaddress_ent_free_void(void *ent)
-{
-  addressmap_virtaddress_ent_free_(ent);
-}
-
-/** Remove address (which must map to ent) from the
- * virtual address map. */
+/** Free storage held by a virtaddress_entry_t* entry in ent. */
 static void
 addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
 {
@@ -144,11 +120,9 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
     if (ve) {
       if (!strcmp(address, ve->ipv4_address))
         tor_free(ve->ipv4_address);
-      if (!strcmp(address, ve->ipv6_address))
-        tor_free(ve->ipv6_address);
       if (!strcmp(address, ve->hostname_address))
         tor_free(ve->hostname_address);
-      if (!ve->ipv4_address && !ve->ipv6_address && !ve->hostname_address) {
+      if (!ve->ipv4_address && !ve->hostname_address) {
         tor_free(ve);
         strmap_remove(virtaddress_reversemap, ent->new_address);
       }
@@ -157,7 +131,7 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
 }
 
 /** Remove ent (which must be mapped to by address) from the
- * client address maps, and then free it. */
+ * client address maps. */
 static void
 addressmap_ent_remove(const char *address, addressmap_entry_t *ent)
 {
@@ -226,8 +200,8 @@ addressmap_clear_excluded_trackexithosts(const or_options_t *options)
     while (dot > target && *dot != '.')
       dot--;
     if (*dot == '.') dot++;
-    nodename = tor_strndup(dot, len-5-(dot-target));
-    node = node_get_by_nickname(nodename, NNF_NO_WARN_UNNAMED);
+    nodename = tor_strndup(dot, len-5-(dot-target));;
+    node = node_get_by_nickname(nodename, 0);
     tor_free(nodename);
     if (!node ||
         (allow_nodes && !routerset_contains_node(allow_nodes, node)) ||
@@ -252,8 +226,6 @@ addressmap_address_should_automap(const char *address,
     return 0;
 
   SMARTLIST_FOREACH_BEGIN(suffix_list, const char *, suffix) {
-    if (!strcmp(suffix, "."))
-      return 1;
     if (!strcasecmpend(address, suffix))
       return 1;
   } SMARTLIST_FOREACH_END(suffix);
@@ -277,18 +249,18 @@ addressmap_clear_invalid_automaps(const or_options_t *options)
     clear_all = 1; /* This should be impossible, but let's be sure. */
 
   STRMAP_FOREACH_MODIFY(addressmap, src_address, addressmap_entry_t *, ent) {
-    int remove_this = clear_all;
+    int remove = clear_all;
     if (ent->source != ADDRMAPSRC_AUTOMAP)
       continue; /* not an automap mapping. */
 
-    if (!remove_this) {
-      remove_this = ! addressmap_address_should_automap(src_address, options);
+    if (!remove) {
+      remove = ! addressmap_address_should_automap(src_address, options);
     }
 
-    if (!remove_this && ! address_is_in_virtual_range(ent->new_address))
-      remove_this = 1;
+    if (!remove && ! address_is_in_virtual_range(ent->new_address))
+      remove = 1;
 
-    if (remove_this) {
+    if (remove) {
       addressmap_ent_remove(src_address, ent);
       MAP_DEL_CURRENT(src_address);
     }
@@ -324,10 +296,10 @@ addressmap_clean(time_t now)
 void
 addressmap_free_all(void)
 {
-  strmap_free(addressmap, addressmap_ent_free_void);
+  strmap_free(addressmap, addressmap_ent_free);
   addressmap = NULL;
 
-  strmap_free(virtaddress_reversemap, addressmap_virtaddress_ent_free_void);
+  strmap_free(virtaddress_reversemap, addressmap_virtaddress_ent_free);
   virtaddress_reversemap = NULL;
 }
 
@@ -389,72 +361,39 @@ addressmap_rewrite(char *address, size_t maxlen,
   char *addr_orig = tor_strdup(address);
   char *log_addr_orig = NULL;
 
-  /* We use a loop here to limit the total number of rewrites we do,
-   * so that we can't hit an infinite loop. */
   for (rewrites = 0; rewrites < 16; rewrites++) {
     int exact_match = 0;
     log_addr_orig = tor_strdup(escaped_safe_str_client(address));
 
-    /* First check to see if there's an exact match for this address */
     ent = strmap_get(addressmap, address);
 
     if (!ent || !ent->new_address) {
-      /* And if we don't have an exact match, try to check whether
-       * we have a pattern-based match.
-       */
       ent = addressmap_match_superdomains(address);
     } else {
       if (ent->src_wildcard && !ent->dst_wildcard &&
           !strcasecmp(address, ent->new_address)) {
-        /* This is a rule like "rewrite *.example.com to example.com", and we
-         * just got "example.com". Instead of calling it an infinite loop,
-         * call it complete. */
+        /* This is a rule like *.example.com example.com, and we just got
+         * "example.com" */
         goto done;
       }
+
       exact_match = 1;
     }
 
     if (!ent || !ent->new_address) {
-      /* We still have no match at all.  We're done! */
       goto done;
     }
 
-    /* Check wither the flags we were passed tell us not to use this
-     * mapping. */
-    switch (ent->source) {
-      case ADDRMAPSRC_DNS:
-        {
-          sa_family_t f;
-          tor_addr_t tmp;
-          f = tor_addr_parse(&tmp, ent->new_address);
-          if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
-            goto done;
-          else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
-            goto done;
-        }
-        break;
-      case ADDRMAPSRC_CONTROLLER:
-      case ADDRMAPSRC_TORRC:
-        if (!(flags & AMR_FLAG_USE_MAPADDRESS))
-          goto done;
-        break;
-      case ADDRMAPSRC_AUTOMAP:
-        if (!(flags & AMR_FLAG_USE_AUTOMAP))
-          goto done;
-        break;
-      case ADDRMAPSRC_TRACKEXIT:
-        if (!(flags & AMR_FLAG_USE_TRACKEXIT))
-          goto done;
-        break;
-      case ADDRMAPSRC_NONE:
-      default:
-        log_warn(LD_BUG, "Unknown addrmap source value %d. Ignoring it.",
-                 (int) ent->source);
+    if (ent && ent->source == ADDRMAPSRC_DNS) {
+      sa_family_t f;
+      tor_addr_t tmp;
+      f = tor_addr_parse(&tmp, ent->new_address);
+      if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
+        goto done;
+      else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
         goto done;
     }
 
-    /* Now fill in the address with the new address. That might be via
-     * appending some new stuff to the end, or via just replacing it. */
     if (ent->dst_wildcard && !exact_match) {
       strlcat(address, ".", maxlen);
       strlcat(address, ent->new_address, maxlen);
@@ -462,7 +401,6 @@ addressmap_rewrite(char *address, size_t maxlen,
       strlcpy(address, ent->new_address, maxlen);
     }
 
-    /* Is this now a .exit address?  If so, remember where we got it.*/
     if (!strcmpend(address, ".exit") &&
         strcmpend(addr_orig, ".exit") &&
         exit_source == ADDRMAPSRC_NONE) {
@@ -487,7 +425,7 @@ addressmap_rewrite(char *address, size_t maxlen,
   if (exit_source_out)
     *exit_source_out = exit_source;
   if (expires_out)
-    *expires_out = expires;
+    *expires_out = TIME_MAX;
   return (rewrites > 0);
 }
 
@@ -511,8 +449,6 @@ addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags,
       return 0;
     else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
       return 0;
-    /* FFFF we should reverse-map virtual addresses even if we haven't
-     * enabled DNS cacheing. */
   }
 
   tor_asprintf(&s, "REVERSE[%s]", address);
@@ -554,19 +490,20 @@ addressmap_have_mapping(const char *address, int update_expiry)
  * (virtual address mapping) from the controller.)
  *
  * new_address should be a newly dup'ed string, which we'll use or
- * free as appropriate. We will leave address alone.
+ * free as appropriate. We will leave address alone.
  *
  * If wildcard_addr is true, then the mapping will match any address
  * equal to address, or any address ending with a period followed by
  * address.  If wildcard_addr and wildcard_new_addr are
  * both true, the mapping will rewrite addresses that end with
- * ".address" into ones that end with ".new_address".
+ * ".address" into ones that end with ".new_address."
  *
  * If new_address is NULL, or new_address is equal to
  * address and wildcard_addr is equal to
  * wildcard_new_addr, remove any mappings that exist from
  * address.
  *
+ *
  * It is an error to set wildcard_new_addr if wildcard_addr is
  * not set. */
 void
@@ -598,9 +535,9 @@ addressmap_register(const char *address, char *new_address, time_t expires,
     if (expires > 1) {
       log_info(LD_APP,"Temporary addressmap ('%s' to '%s') not performed, "
                "since it's already mapped to '%s'",
-               safe_str_client(address),
-               safe_str_client(new_address),
-               safe_str_client(ent->new_address));
+      safe_str_client(address),
+      safe_str_client(new_address),
+      safe_str_client(ent->new_address));
       tor_free(new_address);
       return;
     }
@@ -733,10 +670,10 @@ client_dns_set_addressmap(entry_connection_t *for_conn,
     return; /* If address was an IP address already, don't add a mapping. */
 
   if (tor_addr_family(val) == AF_INET) {
-    if (! for_conn->entry_cfg.cache_ipv4_answers)
+    if (! for_conn->cache_ipv4_answers)
       return;
   } else if (tor_addr_family(val) == AF_INET6) {
-    if (! for_conn->entry_cfg.cache_ipv6_answers)
+    if (! for_conn->cache_ipv6_answers)
       return;
   }
 
@@ -765,8 +702,8 @@ client_dns_set_reverse_addressmap(entry_connection_t *for_conn,
   {
     tor_addr_t tmp_addr;
     sa_family_t f = tor_addr_parse(&tmp_addr, address);
-    if ((f == AF_INET && ! for_conn->entry_cfg.cache_ipv4_answers) ||
-        (f == AF_INET6 && ! for_conn->entry_cfg.cache_ipv6_answers))
+    if ((f == AF_INET && ! for_conn->cache_ipv4_answers) ||
+        (f == AF_INET6 && ! for_conn->cache_ipv6_answers))
       return;
   }
   tor_asprintf(&s, "REVERSE[%s]", address);
@@ -798,15 +735,9 @@ parse_virtual_addr_network(const char *val, sa_family_t family,
   const int ipv6 = (family == AF_INET6);
   tor_addr_t addr;
   maskbits_t bits;
-  const int max_prefix_bits = ipv6 ? 104 : 16;
+  const int max_bits = ipv6 ? 40 : 16;
   virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4;
 
-  if (!val || val[0] == '\0') {
-    if (msg)
-      tor_asprintf(msg, "Value not present (%s) after VirtualAddressNetwork%s",
-                   val?"Empty":"NULL", ipv6?"IPv6":"");
-    return -1;
-  }
   if (tor_addr_parse_mask_ports(val, 0, &addr, &bits, NULL, NULL) < 0) {
     if (msg)
       tor_asprintf(msg, "Error parsing VirtualAddressNetwork%s %s",
@@ -826,12 +757,12 @@ parse_virtual_addr_network(const char *val, sa_family_t family,
                    ipv6?"IPv6":"");
     return -1;
   }
-#endif /* 0 */
+#endif
 
-  if (bits > max_prefix_bits) {
+  if (bits > max_bits) {
     if (msg)
       tor_asprintf(msg, "VirtualAddressNetwork%s expects a /%d "
-                   "network or larger",ipv6?"IPv6":"", max_prefix_bits);
+                   "network or larger",ipv6?"IPv6":"", max_bits);
     return -1;
   }
 
@@ -908,8 +839,8 @@ get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out)
 }
 
 /** Return a newly allocated string holding an address of type
- * (one of RESOLVED_TYPE_{IPV4|IPV6|HOSTNAME}) that has not yet been
- * mapped, and that is very unlikely to be the address of any real host.
+ * (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped,
+ * and that is very unlikely to be the address of any real host.
  *
  * May return NULL if we have run out of virtual addresses.
  */
@@ -920,10 +851,10 @@ addressmap_get_virtual_address(int type)
   tor_assert(addressmap);
 
   if (type == RESOLVED_TYPE_HOSTNAME) {
-    char rand_bytes[10];
+    char rand[10];
     do {
-      crypto_rand(rand_bytes, sizeof(rand_bytes));
-      base32_encode(buf,sizeof(buf),rand_bytes,sizeof(rand_bytes));
+      crypto_rand(rand, sizeof(rand));
+      base32_encode(buf,sizeof(buf),rand,sizeof(rand));
       strlcat(buf, ".virtual", sizeof(buf));
     } while (strmap_get(addressmap, buf));
     return tor_strdup(buf);
@@ -957,7 +888,7 @@ addressmap_get_virtual_address(int type)
         /* XXXX This code is to make sure I didn't add an undecorated version
          * by mistake. I hope it's needless. */
         char tmp[TOR_ADDR_BUF_LEN];
-        tor_addr_to_str(tmp, &addr, sizeof(tmp), 0);
+        tor_addr_to_str(buf, &addr, sizeof(tmp), 0);
         if (strmap_get(addressmap, tmp)) {
           log_warn(LD_BUG, "%s wasn't in the addressmap, but %s was.",
                    buf, tmp);
@@ -1014,7 +945,7 @@ addressmap_register_virtual_address(int type, char *new_address)
         !strcasecmp(new_address, ent->new_address)) {
       tor_free(new_address);
       tor_assert(!vent_needs_to_be_added);
-      return *addrp;
+      return tor_strdup(*addrp);
     } else {
       log_warn(LD_BUG,
                "Internal confusion: I thought that '%s' was mapped to by "
@@ -1038,8 +969,6 @@ addressmap_register_virtual_address(int type, char *new_address)
     strmap_set(virtaddress_reversemap, new_address, vent);
   addressmap_register(*addrp, new_address, 2, ADDRMAPSRC_AUTOMAP, 0, 0);
 
-  /* FFFF register corresponding reverse mapping. */
-
 #if 0
   {
     /* Try to catch possible bugs */
@@ -1056,7 +985,7 @@ addressmap_register_virtual_address(int type, char *new_address)
              safe_str_client(*addrp),
              safe_str_client(new_address));
   }
-#endif /* 0 */
+#endif
 
   return *addrp;
 }
@@ -1131,11 +1060,11 @@ addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
              smartlist_add_asprintf(sl, "%s%s %s%s NEVER",
                                     src_wc, key, dst_wc, val->new_address);
            else {
-             char isotime[ISO_TIME_LEN+1];
-             format_iso_time(isotime, val->expires);
+             char time[ISO_TIME_LEN+1];
+             format_iso_time(time, val->expires);
              smartlist_add_asprintf(sl, "%s%s %s%s \"%s\"",
                                     src_wc, key, dst_wc, val->new_address,
-                                    isotime);
+                                    time);
            }
          } else {
            smartlist_add_asprintf(sl, "%s%s %s%s",
diff --git a/src/tor/src/or/addressmap.h b/src/tor/addressmap.h
similarity index 88%
rename from src/tor/src/or/addressmap.h
rename to src/tor/addressmap.h
index 1544b76e1..417832b31 100644
--- a/src/tor/src/or/addressmap.h
+++ b/src/tor/addressmap.h
@@ -1,7 +1,7 @@
 /* Copyright (c) 2001 Matej Pfajfar.
  * Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #ifndef TOR_ADDRESSMAP_H
@@ -16,11 +16,8 @@ void addressmap_clean(time_t now);
 void addressmap_clear_configured(void);
 void addressmap_clear_transient(void);
 void addressmap_free_all(void);
-#define AMR_FLAG_USE_IPV4_DNS   (1u<<0)
-#define AMR_FLAG_USE_IPV6_DNS   (1u<<1)
-#define AMR_FLAG_USE_MAPADDRESS (1u<<2)
-#define AMR_FLAG_USE_AUTOMAP    (1u<<3)
-#define AMR_FLAG_USE_TRACKEXIT  (1u<<4)
+#define AMR_FLAG_USE_IPV4_DNS (1u<<0)
+#define AMR_FLAG_USE_IPV6_DNS (1u<<1)
 int addressmap_rewrite(char *address, size_t maxlen, unsigned flags,
                        time_t *expires_out,
                        addressmap_entry_source_t *exit_source_out);
@@ -59,7 +56,7 @@ typedef struct virtual_addr_conf_t {
 
 STATIC void get_random_virtual_addr(const virtual_addr_conf_t *conf,
                                     tor_addr_t *addr_out);
-#endif /* defined(ADDRESSMAP_PRIVATE) */
+#endif
 
-#endif /* !defined(TOR_ADDRESSMAP_H) */
+#endif
 
diff --git a/src/tor/src/common/aes.c b/src/tor/aes.c
similarity index 56%
rename from src/tor/src/common/aes.c
rename to src/tor/aes.c
index 9b5b0197e..e4cfe9156 100644
--- a/src/tor/src/common/aes.c
+++ b/src/tor/aes.c
@@ -1,7 +1,7 @@
 /* Copyright (c) 2001, Matej Pfajfar.
  * Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -12,32 +12,34 @@
 #include "orconfig.h"
 
 #ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include "*/
-  #include 
-  #include 
+ #ifndef _WIN32_WINNT
+ #define _WIN32_WINNT 0x0501
+ #endif
+ #define WIN32_LEAN_AND_MEAN
+ #if defined(_MSC_VER) && (_MSC_VER < 1300)
+    #include 
+ #else
+    #include 
+    #include 
+ #endif
 #endif
 
 #include 
-#include "crypto.h"
-
-#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(1,0,0)
-#error "We require OpenSSL >= 1.0.0"
-#endif
-
-DISABLE_GCC_WARNING(redundant-decls)
-
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include "crypto.h"
+#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0)
+/* See comments about which counter mode implementation to use below. */
 #include 
-
-ENABLE_GCC_WARNING(redundant-decls)
-
-#include "compat.h"
+#define CAN_USE_OPENSSL_CTR
+#endif
+#include "tor_compat.h"
 #include "aes.h"
-#include "util.h"
+#include "tor_util.h"
 #include "torlog.h"
 #include "di_ops.h"
 
@@ -48,7 +50,7 @@ ENABLE_GCC_WARNING(redundant-decls)
 
 /* We have five strategies for implementing AES counter mode.
  *
- * Best with x86 and x86_64: Use EVP_aes_*_ctr() and EVP_EncryptUpdate().
+ * Best with x86 and x86_64: Use EVP_aes_ctr128() and EVP_EncryptUpdate().
  * This is possible with OpenSSL 1.0.1, where the counter-mode implementation
  * can use bit-sliced or vectorized AES or AESNI as appropriate.
  *
@@ -56,21 +58,14 @@ ENABLE_GCC_WARNING(redundant-decls)
  * gives us, and the best possible counter-mode implementation, and combine
  * them.
  */
-#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,1,0)
-
-/* With newer OpenSSL versions, the older fallback modes don't compile.  So
- * don't use them, even if we lack specific acceleration. */
-
-#define USE_EVP_AES_CTR
-
-#elif OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,0,1) &&               \
+#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,0,1) &&               \
   (defined(__i386) || defined(__i386__) || defined(_M_IX86) ||          \
    defined(__x86_64) || defined(__x86_64__) ||                          \
-   defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__))
+   defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__))          \
 
 #define USE_EVP_AES_CTR
 
-#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,1,0) || ... */
+#endif
 
 /* We have 2 strategies for getting the AES block cipher: Via OpenSSL's
  * AES_encrypt function, or via OpenSSL's EVP_EncryptUpdate function.
@@ -93,40 +88,47 @@ ENABLE_GCC_WARNING(redundant-decls)
 
 #ifdef USE_EVP_AES_CTR
 
-/* We don't actually define the struct here. */
+struct aes_cnt_cipher {
+  EVP_CIPHER_CTX evp;
+};
 
 aes_cnt_cipher_t *
-aes_new_cipher(const uint8_t *key, const uint8_t *iv, int key_bits)
+aes_new_cipher(const char *key, const char *iv)
 {
-  EVP_CIPHER_CTX *cipher = EVP_CIPHER_CTX_new();
-  const EVP_CIPHER *c;
-  switch (key_bits) {
-    case 128: c = EVP_aes_128_ctr(); break;
-    case 192: c = EVP_aes_192_ctr(); break;
-    case 256: c = EVP_aes_256_ctr(); break;
-    default: tor_assert(0); // LCOV_EXCL_LINE
-  }
-  EVP_EncryptInit(cipher, c, key, iv);
-  return (aes_cnt_cipher_t *) cipher;
+  aes_cnt_cipher_t *cipher;
+  cipher = tor_malloc_zero(sizeof(aes_cnt_cipher_t));
+  EVP_EncryptInit(&cipher->evp, EVP_aes_128_ctr(),
+                  (const unsigned char*)key, (const unsigned char *)iv);
+  return cipher;
 }
 void
-aes_cipher_free_(aes_cnt_cipher_t *cipher_)
+aes_cipher_free(aes_cnt_cipher_t *cipher)
 {
-  if (!cipher_)
+  if (!cipher)
     return;
-  EVP_CIPHER_CTX *cipher = (EVP_CIPHER_CTX *) cipher_;
-  EVP_CIPHER_CTX_cleanup(cipher);
-  EVP_CIPHER_CTX_free(cipher);
+  EVP_CIPHER_CTX_cleanup(&cipher->evp);
+  memwipe(cipher, 0, sizeof(aes_cnt_cipher_t));
+  tor_free(cipher);
 }
 void
-aes_crypt_inplace(aes_cnt_cipher_t *cipher_, char *data, size_t len)
+aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len,
+          char *output)
 {
   int outl;
-  EVP_CIPHER_CTX *cipher = (EVP_CIPHER_CTX *) cipher_;
 
   tor_assert(len < INT_MAX);
 
-  EVP_EncryptUpdate(cipher, (unsigned char*)data,
+  EVP_EncryptUpdate(&cipher->evp, (unsigned char*)output,
+                    &outl, (const unsigned char *)input, (int)len);
+}
+void
+aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len)
+{
+  int outl;
+
+  tor_assert(len < INT_MAX);
+
+  EVP_EncryptUpdate(&cipher->evp, (unsigned char*)data,
                     &outl, (unsigned char*)data, (int)len);
 }
 int
@@ -142,7 +144,7 @@ evaluate_ctr_for_aes(void)
 {
   return 0;
 }
-#else /* !(defined(USE_EVP_AES_CTR)) */
+#else
 
 /*======================================================================*/
 /* Interface to AES code, and counter implementation */
@@ -163,7 +165,7 @@ struct aes_cnt_cipher {
   uint32_t counter2;
   uint32_t counter1;
   uint32_t counter0;
-#endif /* !defined(WORDS_BIGENDIAN) */
+#endif
 
   union {
     /** The counter, in big-endian order, as bytes. */
@@ -187,6 +189,12 @@ struct aes_cnt_cipher {
  * we're testing it or because we have hardware acceleration configured */
 static int should_use_EVP = 0;
 
+#ifdef CAN_USE_OPENSSL_CTR
+/** True iff we have tested the counter-mode implementation and found that it
+ * doesn't have the counter-mode bug from OpenSSL 1.0.0. */
+static int should_use_openssl_CTR = 0;
+#endif
+
 /** Check whether we should use the EVP interface for AES. If force_val
  * is nonnegative, we use use EVP iff it is true.  Otherwise, we use EVP
  * if there is an engine enabled for aes-ecb. */
@@ -212,7 +220,7 @@ evaluate_evp_for_aes(int force_val)
     log_info(LD_CRYPTO, "No AES engine found; using AES_* functions.");
     should_use_EVP = 0;
   }
-#endif /* defined(DISABLE_ENGINES) */
+#endif
 
   return 0;
 }
@@ -227,6 +235,7 @@ evaluate_evp_for_aes(int force_val)
 int
 evaluate_ctr_for_aes(void)
 {
+#ifdef CAN_USE_OPENSSL_CTR
   /* Result of encrypting an all-zero block with an all-zero 128-bit AES key.
    * This should be the same as encrypting an all-zero block with an all-zero
    * 128-bit AES key in counter mode, starting at position 0 of the stream.
@@ -251,12 +260,18 @@ evaluate_ctr_for_aes(void)
 
   if (fast_memneq(output, encrypt_zero, 16)) {
     /* Counter mode is buggy */
-    /* LCOV_EXCL_START */
-    log_err(LD_CRYPTO, "This OpenSSL has a buggy version of counter mode; "
-                  "quitting tor.");
-    exit(1); // exit ok: openssl is broken.
-    /* LCOV_EXCL_STOP */
+    log_notice(LD_CRYPTO, "This OpenSSL has a buggy version of counter mode; "
+               "not using it.");
+  } else {
+    /* Counter mode is okay */
+    log_info(LD_CRYPTO, "This OpenSSL has a good implementation of counter "
+               "mode; using it.");
+    should_use_openssl_CTR = 1;
   }
+#else
+  log_info(LD_CRYPTO, "This version of OpenSSL has a slow implementation of "
+             "counter mode; not using it.");
+#endif
   return 0;
 }
 
@@ -266,20 +281,43 @@ evaluate_ctr_for_aes(void)
 #define COUNTER(c, n) ((c)->counter ## n)
 #endif
 
-static void aes_set_key(aes_cnt_cipher_t *cipher, const uint8_t *key,
+/**
+ * Helper function: set cipher's internal buffer to the encrypted
+ * value of the current counter.
+ */
+static INLINE void
+aes_fill_buf_(aes_cnt_cipher_t *cipher)
+{
+  /* We don't currently use OpenSSL's counter mode implementation because:
+   *  1) some versions have known bugs
+   *  2) its attitude towards IVs is not our own
+   *  3) changing the counter position was not trivial, last time I looked.
+   * None of these issues are insurmountable in principle.
+   */
+
+  if (cipher->using_evp) {
+    int outl=16, inl=16;
+    EVP_EncryptUpdate(&cipher->key.evp, cipher->buf, &outl,
+                      cipher->ctr_buf.buf, inl);
+  } else {
+    AES_encrypt(cipher->ctr_buf.buf, cipher->buf, &cipher->key.aes);
+  }
+}
+
+static void aes_set_key(aes_cnt_cipher_t *cipher, const char *key,
                         int key_bits);
-static void aes_set_iv(aes_cnt_cipher_t *cipher, const uint8_t *iv);
+static void aes_set_iv(aes_cnt_cipher_t *cipher, const char *iv);
 
 /**
  * Return a newly allocated counter-mode AES128 cipher implementation,
  * using the 128-bit key key and the 128-bit IV iv.
  */
 aes_cnt_cipher_t*
-aes_new_cipher(const uint8_t *key, const uint8_t *iv, int bits)
+aes_new_cipher(const char *key, const char *iv)
 {
   aes_cnt_cipher_t* result = tor_malloc_zero(sizeof(aes_cnt_cipher_t));
 
-  aes_set_key(result, key, bits);
+  aes_set_key(result, key, 128);
   aes_set_iv(result, iv);
 
   return result;
@@ -290,20 +328,20 @@ aes_new_cipher(const uint8_t *key, const uint8_t *iv, int bits)
  * the counter to 0.
  */
 static void
-aes_set_key(aes_cnt_cipher_t *cipher, const uint8_t *key, int key_bits)
+aes_set_key(aes_cnt_cipher_t *cipher, const char *key, int key_bits)
 {
   if (should_use_EVP) {
-    const EVP_CIPHER *c = 0;
+    const EVP_CIPHER *c;
     switch (key_bits) {
       case 128: c = EVP_aes_128_ecb(); break;
       case 192: c = EVP_aes_192_ecb(); break;
       case 256: c = EVP_aes_256_ecb(); break;
-      default: tor_assert(0); // LCOV_EXCL_LINE
+      default: tor_assert(0);
     }
-    EVP_EncryptInit(&cipher->key.evp, c, key, NULL);
+    EVP_EncryptInit(&cipher->key.evp, c, (const unsigned char*)key, NULL);
     cipher->using_evp = 1;
   } else {
-    AES_set_encrypt_key(key, key_bits,&cipher->key.aes);
+    AES_set_encrypt_key((const unsigned char *)key, key_bits,&cipher->key.aes);
     cipher->using_evp = 0;
   }
 
@@ -312,19 +350,24 @@ aes_set_key(aes_cnt_cipher_t *cipher, const uint8_t *key, int key_bits)
   cipher->counter1 = 0;
   cipher->counter2 = 0;
   cipher->counter3 = 0;
-#endif /* defined(USING_COUNTER_VARS) */
+#endif
 
   memset(cipher->ctr_buf.buf, 0, sizeof(cipher->ctr_buf.buf));
 
   cipher->pos = 0;
 
-  memset(cipher->buf, 0, sizeof(cipher->buf));
+#ifdef CAN_USE_OPENSSL_CTR
+  if (should_use_openssl_CTR)
+    memset(cipher->buf, 0, sizeof(cipher->buf));
+  else
+#endif
+    aes_fill_buf_(cipher);
 }
 
 /** Release storage held by cipher
  */
 void
-aes_cipher_free_(aes_cnt_cipher_t *cipher)
+aes_cipher_free(aes_cnt_cipher_t *cipher)
 {
   if (!cipher)
     return;
@@ -341,8 +384,9 @@ aes_cipher_free_(aes_cnt_cipher_t *cipher)
   STMT_END
 #else
 #define UPDATE_CTR_BUF(c, n)
-#endif /* defined(USING_COUNTER_VARS) */
+#endif
 
+#ifdef CAN_USE_OPENSSL_CTR
 /* Helper function to use EVP with openssl's counter-mode wrapper. */
 static void
 evp_block128_fn(const uint8_t in[16],
@@ -353,6 +397,67 @@ evp_block128_fn(const uint8_t in[16],
   int inl=16, outl=16;
   EVP_EncryptUpdate(ctx, out, &outl, in, inl);
 }
+#endif
+
+/** Encrypt len bytes from input, storing the result in
+ * output.  Uses the key in cipher, and advances the counter
+ * by len bytes as it encrypts.
+ */
+void
+aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len,
+          char *output)
+{
+#ifdef CAN_USE_OPENSSL_CTR
+  if (should_use_openssl_CTR) {
+    if (cipher->using_evp) {
+      /* In openssl 1.0.0, there's an if'd out EVP_aes_128_ctr in evp.h.  If
+       * it weren't disabled, it might be better just to use that.
+       */
+      CRYPTO_ctr128_encrypt((const unsigned char *)input,
+                            (unsigned char *)output,
+                            len,
+                            &cipher->key.evp,
+                            cipher->ctr_buf.buf,
+                            cipher->buf,
+                            &cipher->pos,
+                            evp_block128_fn);
+    } else {
+      AES_ctr128_encrypt((const unsigned char *)input,
+                         (unsigned char *)output,
+                         len,
+                         &cipher->key.aes,
+                         cipher->ctr_buf.buf,
+                         cipher->buf,
+                         &cipher->pos);
+    }
+    return;
+  } else
+#endif
+  {
+    int c = cipher->pos;
+    if (PREDICT_UNLIKELY(!len)) return;
+
+    while (1) {
+      do {
+        if (len-- == 0) { cipher->pos = c; return; }
+        *(output++) = *(input++) ^ cipher->buf[c];
+      } while (++c != 16);
+      cipher->pos = c = 0;
+      if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 0))) {
+        if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 1))) {
+          if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 2))) {
+            ++COUNTER(cipher, 3);
+            UPDATE_CTR_BUF(cipher, 3);
+          }
+          UPDATE_CTR_BUF(cipher, 2);
+        }
+        UPDATE_CTR_BUF(cipher, 1);
+      }
+      UPDATE_CTR_BUF(cipher, 0);
+      aes_fill_buf_(cipher);
+    }
+  }
+}
 
 /** Encrypt len bytes from input, storing the results in place.
  * Uses the key in cipher, and advances the counter by len bytes
@@ -361,45 +466,57 @@ evp_block128_fn(const uint8_t in[16],
 void
 aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len)
 {
-  /* Note that the "128" below refers to the length of the counter,
-   * not the length of the AES key. */
-  if (cipher->using_evp) {
-    /* In openssl 1.0.0, there's an if'd out EVP_aes_128_ctr in evp.h.  If
-     * it weren't disabled, it might be better just to use that.
-     */
-    CRYPTO_ctr128_encrypt((const unsigned char *)data,
-                          (unsigned char *)data,
-                          len,
-                          &cipher->key.evp,
-                          cipher->ctr_buf.buf,
-                          cipher->buf,
-                          &cipher->pos,
-                          evp_block128_fn);
-  } else {
-    AES_ctr128_encrypt((const unsigned char *)data,
-                       (unsigned char *)data,
-                       len,
-                       &cipher->key.aes,
-                       cipher->ctr_buf.buf,
-                       cipher->buf,
-                       &cipher->pos);
+#ifdef CAN_USE_OPENSSL_CTR
+  if (should_use_openssl_CTR) {
+    aes_crypt(cipher, data, len, data);
+    return;
+  } else
+#endif
+  {
+    int c = cipher->pos;
+    if (PREDICT_UNLIKELY(!len)) return;
+
+    while (1) {
+      do {
+        if (len-- == 0) { cipher->pos = c; return; }
+        *(data++) ^= cipher->buf[c];
+      } while (++c != 16);
+      cipher->pos = c = 0;
+      if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 0))) {
+        if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 1))) {
+          if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 2))) {
+            ++COUNTER(cipher, 3);
+            UPDATE_CTR_BUF(cipher, 3);
+          }
+          UPDATE_CTR_BUF(cipher, 2);
+        }
+        UPDATE_CTR_BUF(cipher, 1);
+      }
+      UPDATE_CTR_BUF(cipher, 0);
+      aes_fill_buf_(cipher);
+    }
   }
 }
 
 /** Reset the 128-bit counter of cipher to the 16-bit big-endian value
  * in iv. */
 static void
-aes_set_iv(aes_cnt_cipher_t *cipher, const uint8_t *iv)
+aes_set_iv(aes_cnt_cipher_t *cipher, const char *iv)
 {
 #ifdef USING_COUNTER_VARS
   cipher->counter3 = ntohl(get_uint32(iv));
   cipher->counter2 = ntohl(get_uint32(iv+4));
   cipher->counter1 = ntohl(get_uint32(iv+8));
   cipher->counter0 = ntohl(get_uint32(iv+12));
-#endif /* defined(USING_COUNTER_VARS) */
+#endif
   cipher->pos = 0;
   memcpy(cipher->ctr_buf.buf, iv, 16);
+
+#ifdef CAN_USE_OPENSSL_CTR
+  if (!should_use_openssl_CTR)
+#endif
+    aes_fill_buf_(cipher);
 }
 
-#endif /* defined(USE_EVP_AES_CTR) */
+#endif
 
diff --git a/src/tor/src/common/aes.h b/src/tor/aes.h
similarity index 58%
rename from src/tor/src/common/aes.h
rename to src/tor/aes.h
index 0b17cd55a..8ff28a762 100644
--- a/src/tor/src/common/aes.h
+++ b/src/tor/aes.h
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2017, The Tor Project, Inc. */
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /* Implements a minimal interface to counter-mode AES. */
@@ -13,17 +13,17 @@
  * \brief Headers for aes.c
  */
 
+struct aes_cnt_cipher;
 typedef struct aes_cnt_cipher aes_cnt_cipher_t;
 
-aes_cnt_cipher_t* aes_new_cipher(const uint8_t *key, const uint8_t *iv,
-                                 int key_bits);
-void aes_cipher_free_(aes_cnt_cipher_t *cipher);
-#define aes_cipher_free(cipher) \
-  FREE_AND_NULL(aes_cnt_cipher_t, aes_cipher_free_, (cipher))
+aes_cnt_cipher_t* aes_new_cipher(const char *key, const char *iv);
+void aes_cipher_free(aes_cnt_cipher_t *cipher);
+void aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len,
+               char *output);
 void aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len);
 
 int evaluate_evp_for_aes(int force_value);
 int evaluate_ctr_for_aes(void);
 
-#endif /* !defined(TOR_AES_H) */
+#endif
 
diff --git a/src/tor/anonymize.cpp b/src/tor/anonymize.cpp
new file mode 100644
index 000000000..77dae9567
--- /dev/null
+++ b/src/tor/anonymize.cpp
@@ -0,0 +1,60 @@
+/* Copyright (c) 2009-2010 Satoshi Nakamoto
+   Copyright (c) 2009-2012 The Bitcoin developers
+   Copyright (c) 2013-2014 The StealthCoin/StealthSend Developers */
+/* Copyright (c) 2014, BritCoin Developers */
+/* See LICENSE for licensing information */
+
+#include "anonymize.h"
+#include "util.h"
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char const* anonymize_tor_data_directory(
+) {
+    static std::string const retrieved = (
+        GetDefaultDataDir(
+        ) / "tor"
+    ).string(
+    );
+    return retrieved.c_str(
+    );
+}
+
+char const* anonymize_service_directory(
+) {
+    static std::string const retrieved = (
+        GetDefaultDataDir(
+        ) / "onion"
+    ).string(
+    );
+    return retrieved.c_str(
+    );
+}
+
+int check_interrupted(
+) {
+    return boost::this_thread::interruption_requested(
+    ) ? 1 : 0;
+}
+
+static boost::mutex initializing;
+
+static std::auto_ptr > uninitialized(
+    new boost::unique_lock(
+        initializing
+    )
+);
+
+void set_initialized(
+) {
+    uninitialized.reset();
+}
+
+void wait_initialized(
+) {
+    boost::unique_lock checking(initializing);
+}
diff --git a/src/tor/anonymize.h b/src/tor/anonymize.h
new file mode 100644
index 000000000..2c5573cce
--- /dev/null
+++ b/src/tor/anonymize.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 2014, BritCoin Developers */
+/* See LICENSE for licensing information */
+
+/**
+ * \file anonymize.h
+ * \brief Headers for anonymize.cpp
+ **/
+
+#ifndef TOR_ANONYMIZE_H
+#define TOR_ANONYMIZE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    char const* anonymize_tor_data_directory(
+    );
+
+    char const* anonymize_service_directory(
+    );
+
+    int check_interrupted(
+    );
+
+    void set_initialized(
+    );
+
+    void wait_initialized(
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/tor/autogen.sh b/src/tor/autogen.sh
deleted file mode 100644
index 276dd4047..000000000
--- a/src/tor/autogen.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-if [ -x "`which autoreconf 2>/dev/null`" ] ; then
-  opt="-i -f -W all,error"
-
-  for i in $@; do
-    case "$i" in
-      -v)
-        opt="${opt} -v"
-        ;;
-    esac
-  done
-
-  exec autoreconf $opt
-fi
-
-set -e
-
-# Run this to generate all the initial makefiles, etc.
-aclocal -I m4 && \
-	autoheader && \
-	autoconf && \
-	automake --add-missing --copy
diff --git a/src/tor/src/common/backtrace.c b/src/tor/backtrace.c
similarity index 66%
rename from src/tor/src/common/backtrace.c
rename to src/tor/backtrace.c
index f2498b2aa..e1452b067 100644
--- a/src/tor/src/common/backtrace.c
+++ b/src/tor/backtrace.c
@@ -1,21 +1,13 @@
-/* Copyright (c) 2013-2017, The Tor Project, Inc. */
+/* Copyright (c) 2013, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
-/**
- * \file backtrace.c
- *
- * \brief Functions to produce backtraces on bugs, crashes, or assertion
- * failures.
- *
- * Currently, we've only got an implementation here using the backtrace()
- * family of functions, which are sometimes provided by libc and sometimes
- * provided by libexecinfo.  We tie into the sigaction() backend in order to
- * detect crashes.
- */
+#define __USE_GNU
+#define _GNU_SOURCE 1
 
 #include "orconfig.h"
-#include "compat.h"
-#include "util.h"
+#include "backtrace.h"
+#include "tor_compat.h"
+#include "tor_util.h"
 #include "torlog.h"
 
 #ifdef HAVE_EXECINFO_H
@@ -37,10 +29,7 @@
 #include 
 #elif defined(HAVE_UCONTEXT_H)
 #include 
-#endif /* defined(HAVE_CYGWIN_SIGNAL_H) || ... */
-
-#define EXPOSE_CLEAN_BACKTRACE
-#include "backtrace.h"
+#endif
 
 #if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
   defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
@@ -60,8 +49,6 @@ static char *bt_version = NULL;
 /** Static allocation of stack to dump. This is static so we avoid stack
  * pressure. */
 static void *cb_buf[MAX_DEPTH];
-/** Protects cb_buf from concurrent access */
-static tor_mutex_t cb_buf_mutex;
 
 /** Change a stacktrace in stack of depth depth so that it will
  * log the correct function from which a signal was received with context
@@ -70,27 +57,26 @@ static tor_mutex_t cb_buf_mutex;
  * onto the stack.  Fortunately, we usually have the program counter in the
  * ucontext_t structure.
  */
-void
-clean_backtrace(void **stack, size_t depth, const ucontext_t *ctx)
+static void
+clean_backtrace(void **stack, int depth, const ucontext_t *ctx)
 {
 #ifdef PC_FROM_UCONTEXT
 #if defined(__linux__)
-  const size_t n = 1;
-#elif defined(__darwin__) || defined(__APPLE__) || defined(OpenBSD) \
+  const int n = 1;
+#elif defined(__darwin__) || defined(__APPLE__) || defined(__OpenBSD__) \
   || defined(__FreeBSD__)
-  const size_t n = 2;
+  const int n = 2;
 #else
-  const size_t n = 1;
-#endif /* defined(__linux__) || ... */
+  const int n = 1;
+#endif
   if (depth <= n)
     return;
 
   stack[n] = (void*) ctx->PC_FROM_UCONTEXT;
-#else /* !(defined(PC_FROM_UCONTEXT)) */
+#else
   (void) depth;
   (void) ctx;
-  (void) stack;
-#endif /* defined(PC_FROM_UCONTEXT) */
+#endif
 }
 
 /** Log a message msg at severity in domain, and follow
@@ -98,29 +84,18 @@ clean_backtrace(void **stack, size_t depth, const ucontext_t *ctx)
 void
 log_backtrace(int severity, int domain, const char *msg)
 {
-  size_t depth;
-  char **symbols;
-  size_t i;
-
-  tor_mutex_acquire(&cb_buf_mutex);
-
-  depth = backtrace(cb_buf, MAX_DEPTH);
-  symbols = backtrace_symbols(cb_buf, (int)depth);
-
+  int depth = backtrace(cb_buf, MAX_DEPTH);
+  char **symbols = backtrace_symbols(cb_buf, depth);
+  int i;
   tor_log(severity, domain, "%s. Stack trace:", msg);
   if (!symbols) {
-    /* LCOV_EXCL_START -- we can't provoke this. */
     tor_log(severity, domain, "    Unable to generate backtrace.");
-    goto done;
-    /* LCOV_EXCL_STOP */
+    return;
   }
   for (i=0; i < depth; ++i) {
     tor_log(severity, domain, "    %s", symbols[i]);
   }
-  raw_free(symbols);
-
- done:
-  tor_mutex_release(&cb_buf_mutex);
+  free(symbols);
 }
 
 static void crash_handler(int sig, siginfo_t *si, void *ctx_)
@@ -131,7 +106,7 @@ static void
 crash_handler(int sig, siginfo_t *si, void *ctx_)
 {
   char buf[40];
-  size_t depth;
+  int depth;
   ucontext_t *ctx = (ucontext_t *) ctx_;
   int n_fds, i;
   const int *fds = NULL;
@@ -150,7 +125,7 @@ crash_handler(int sig, siginfo_t *si, void *ctx_)
 
   n_fds = tor_log_get_sigsafe_err_fds(&fds);
   for (i=0; i < n_fds; ++i)
-    backtrace_symbols_fd(cb_buf, (int)depth, fds[i]);
+    backtrace_symbols_fd(cb_buf, depth, fds[i]);
 
   abort();
 }
@@ -165,9 +140,6 @@ install_bt_handler(void)
   int i, rv=0;
 
   struct sigaction sa;
-
-  tor_mutex_init(&cb_buf_mutex);
-
   memset(&sa, 0, sizeof(sa));
   sa.sa_sigaction = crash_handler;
   sa.sa_flags = SA_SIGINFO;
@@ -175,24 +147,10 @@ install_bt_handler(void)
 
   for (i = 0; trap_signals[i] >= 0; ++i) {
     if (sigaction(trap_signals[i], &sa, NULL) == -1) {
-      /* LCOV_EXCL_START */
       log_warn(LD_BUG, "Sigaction failed: %s", strerror(errno));
       rv = -1;
-      /* LCOV_EXCL_STOP */
     }
   }
-
-  {
-    /* Now, generate (but do not log) a backtrace.  This ensures that
-     * libc has pre-loaded the symbols we need to dump things, so that later
-     * reads won't be denied by the sandbox code */
-    char **symbols;
-    size_t depth = backtrace(cb_buf, MAX_DEPTH);
-    symbols = backtrace_symbols(cb_buf, (int) depth);
-    if (symbols)
-      raw_free(symbols);
-  }
-
   return rv;
 }
 
@@ -200,9 +158,9 @@ install_bt_handler(void)
 static void
 remove_bt_handler(void)
 {
-  tor_mutex_uninit(&cb_buf_mutex);
+  /* We don't need to actually free anything at exit here. */
 }
-#endif /* defined(USE_BACKTRACE) */
+#endif
 
 #ifdef NO_BACKTRACE_IMPL
 void
@@ -221,17 +179,16 @@ static void
 remove_bt_handler(void)
 {
 }
-#endif /* defined(NO_BACKTRACE_IMPL) */
+#endif
 
 /** Set up code to handle generating error messages on crashes. */
 int
 configure_backtrace_handler(const char *tor_version)
 {
   tor_free(bt_version);
-  if (tor_version)
-    tor_asprintf(&bt_version, "Tor %s", tor_version);
-  else
-    tor_asprintf(&bt_version, "Tor");
+  if (!tor_version)
+    tor_version = "";
+  tor_asprintf(&bt_version, "Tor %s", tor_version);
 
   return install_bt_handler();
 }
diff --git a/src/tor/backtrace.h b/src/tor/backtrace.h
new file mode 100644
index 000000000..765436fee
--- /dev/null
+++ b/src/tor/backtrace.h
@@ -0,0 +1,12 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_BACKTRACE_H
+#define TOR_BACKTRACE_H
+
+void log_backtrace(int severity, int domain, const char *msg);
+int configure_backtrace_handler(const char *tor_version);
+void clean_up_backtrace_handler(void);
+
+#endif
+
diff --git a/src/tor/buffers.c b/src/tor/buffers.c
new file mode 100644
index 000000000..40083e7d5
--- /dev/null
+++ b/src/tor/buffers.c
@@ -0,0 +1,2584 @@
+/* Copyright (c) 2001 Matej Pfajfar.
+ * Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file buffers.c
+ * \brief Implements a generic interface buffer.  Buffers are
+ * fairly opaque string holders that can read to or flush from:
+ * memory, file descriptors, or TLS connections.
+ **/
+#define BUFFERS_PRIVATE
+#include "or.h"
+#include "addressmap.h"
+#include "buffers.h"
+#include "config.h"
+#include "connection_edge.h"
+#include "connection_or.h"
+#include "control.h"
+#include "reasons.h"
+#include "ext_orport.h"
+#include "tor_util.h"
+#include "torlog.h"
+#ifdef HAVE_UNISTD_H
+#include 
+#endif
+
+//#define PARANOIA
+
+#ifdef PARANOIA
+/** Helper: If PARANOIA is defined, assert that the buffer in local variable
+ * buf is well-formed. */
+#define check() STMT_BEGIN assert_buf_ok(buf); STMT_END
+#else
+#define check() STMT_NIL
+#endif
+
+/* Implementation notes:
+ *
+ * After flirting with memmove, and dallying with ring-buffers, we're finally
+ * getting up to speed with the 1970s and implementing buffers as a linked
+ * list of small chunks.  Each buffer has such a list; data is removed from
+ * the head of the list, and added at the tail.  The list is singly linked,
+ * and the buffer keeps a pointer to the head and the tail.
+ *
+ * Every chunk, except the tail, contains at least one byte of data.  Data in
+ * each chunk is contiguous.
+ *
+ * When you need to treat the first N characters on a buffer as a contiguous
+ * string, use the buf_pullup function to make them so.  Don't do this more
+ * than necessary.
+ *
+ * The major free Unix kernels have handled buffers like this since, like,
+ * forever.
+ */
+
+static int parse_socks(const char *data, size_t datalen, socks_request_t *req,
+                       int log_sockstype, int safe_socks, ssize_t *drain_out,
+                       size_t *want_length_out);
+static int parse_socks_client(const uint8_t *data, size_t datalen,
+                              int state, char **reason,
+                              ssize_t *drain_out);
+
+/* Chunk manipulation functions */
+
+/** A single chunk on a buffer or in a freelist. */
+typedef struct chunk_t {
+  struct chunk_t *next; /**< The next chunk on the buffer or freelist. */
+  size_t datalen; /**< The number of bytes stored in this chunk */
+  size_t memlen; /**< The number of usable bytes of storage in mem. */
+  char *data; /**< A pointer to the first byte of data stored in mem. */
+  char mem[FLEXIBLE_ARRAY_MEMBER]; /**< The actual memory used for storage in
+                * this chunk. */
+} chunk_t;
+
+#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0])
+
+/** Return the number of bytes needed to allocate a chunk to hold
+ * memlen bytes. */
+#define CHUNK_ALLOC_SIZE(memlen) (CHUNK_HEADER_LEN + (memlen))
+/** Return the number of usable bytes in a chunk allocated with
+ * malloc(memlen). */
+#define CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - CHUNK_HEADER_LEN)
+
+/** Return the next character in chunk onto which data can be appended.
+ * If the chunk is full, this might be off the end of chunk->mem. */
+static INLINE char *
+CHUNK_WRITE_PTR(chunk_t *chunk)
+{
+  return chunk->data + chunk->datalen;
+}
+
+/** Return the number of bytes that can be written onto chunk without
+ * running out of space. */
+static INLINE size_t
+CHUNK_REMAINING_CAPACITY(const chunk_t *chunk)
+{
+  return (chunk->mem + chunk->memlen) - (chunk->data + chunk->datalen);
+}
+
+/** Move all bytes stored in chunk to the front of chunk->mem,
+ * to free up space at the end. */
+static INLINE void
+chunk_repack(chunk_t *chunk)
+{
+  if (chunk->datalen && chunk->data != &chunk->mem[0]) {
+    memmove(chunk->mem, chunk->data, chunk->datalen);
+  }
+  chunk->data = &chunk->mem[0];
+}
+
+#if defined(ENABLE_BUF_FREELISTS) || defined(RUNNING_DOXYGEN)
+/** A freelist of chunks. */
+typedef struct chunk_freelist_t {
+  size_t alloc_size; /**< What size chunks does this freelist hold? */
+  int max_length; /**< Never allow more than this number of chunks in the
+                   * freelist. */
+  int slack; /**< When trimming the freelist, leave this number of extra
+              * chunks beyond lowest_length.*/
+  int cur_length; /**< How many chunks on the freelist now? */
+  int lowest_length; /**< What's the smallest value of cur_length since the
+                      * last time we cleaned this freelist? */
+  uint64_t n_alloc;
+  uint64_t n_free;
+  uint64_t n_hit;
+  chunk_t *head; /**< First chunk on the freelist. */
+} chunk_freelist_t;
+
+/** Macro to help define freelists. */
+#define FL(a,m,s) { a, m, s, 0, 0, 0, 0, 0, NULL }
+
+/** Static array of freelists, sorted by alloc_len, terminated by an entry
+ * with alloc_size of 0. */
+static chunk_freelist_t freelists[] = {
+  FL(4096, 256, 8), FL(8192, 128, 4), FL(16384, 64, 4), FL(32768, 32, 2),
+  FL(0, 0, 0)
+};
+#undef FL
+/** How many times have we looked for a chunk of a size that no freelist
+ * could help with? */
+static uint64_t n_freelist_miss = 0;
+
+static void assert_freelist_ok(chunk_freelist_t *fl);
+
+/** Return the freelist to hold chunks of size alloc, or NULL if
+ * no freelist exists for that size. */
+static INLINE chunk_freelist_t *
+get_freelist(size_t alloc)
+{
+  int i;
+  for (i=0; (freelists[i].alloc_size <= alloc &&
+             freelists[i].alloc_size); ++i ) {
+    if (freelists[i].alloc_size == alloc) {
+      return &freelists[i];
+    }
+  }
+  return NULL;
+}
+
+/** Deallocate a chunk or put it on a freelist */
+static void
+chunk_free_unchecked(chunk_t *chunk)
+{
+  size_t alloc;
+  chunk_freelist_t *freelist;
+
+  alloc = CHUNK_ALLOC_SIZE(chunk->memlen);
+  freelist = get_freelist(alloc);
+  if (freelist && freelist->cur_length < freelist->max_length) {
+    chunk->next = freelist->head;
+    freelist->head = chunk;
+    ++freelist->cur_length;
+  } else {
+    if (freelist)
+      ++freelist->n_free;
+    tor_free(chunk);
+  }
+}
+
+/** Allocate a new chunk with a given allocation size, or get one from the
+ * freelist.  Note that a chunk with allocation size A can actually hold only
+ * CHUNK_SIZE_WITH_ALLOC(A) bytes in its mem field. */
+static INLINE chunk_t *
+chunk_new_with_alloc_size(size_t alloc)
+{
+  chunk_t *ch;
+  chunk_freelist_t *freelist;
+  tor_assert(alloc >= sizeof(chunk_t));
+  freelist = get_freelist(alloc);
+  if (freelist && freelist->head) {
+    ch = freelist->head;
+    freelist->head = ch->next;
+    if (--freelist->cur_length < freelist->lowest_length)
+      freelist->lowest_length = freelist->cur_length;
+    ++freelist->n_hit;
+  } else {
+    if (freelist)
+      ++freelist->n_alloc;
+    else
+      ++n_freelist_miss;
+    ch = tor_malloc(alloc);
+  }
+  ch->next = NULL;
+  ch->datalen = 0;
+  ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc);
+  ch->data = &ch->mem[0];
+  return ch;
+}
+#else
+static void
+chunk_free_unchecked(chunk_t *chunk)
+{
+  tor_free(chunk);
+}
+static INLINE chunk_t *
+chunk_new_with_alloc_size(size_t alloc)
+{
+  chunk_t *ch;
+  ch = tor_malloc(alloc);
+  ch->next = NULL;
+  ch->datalen = 0;
+  ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc);
+  ch->data = &ch->mem[0];
+  return ch;
+}
+#endif
+
+/** Expand chunk until it can hold sz bytes, and return a
+ * new pointer to chunk.  Old pointers are no longer valid. */
+static INLINE chunk_t *
+chunk_grow(chunk_t *chunk, size_t sz)
+{
+  off_t offset;
+  tor_assert(sz > chunk->memlen);
+  offset = chunk->data - chunk->mem;
+  chunk = tor_realloc(chunk, CHUNK_ALLOC_SIZE(sz));
+  chunk->memlen = sz;
+  chunk->data = chunk->mem + offset;
+  return chunk;
+}
+
+/** If a read onto the end of a chunk would be smaller than this number, then
+ * just start a new chunk. */
+#define MIN_READ_LEN 8
+/** Every chunk should take up at least this many bytes. */
+#define MIN_CHUNK_ALLOC 256
+/** No chunk should take up more than this many bytes. */
+#define MAX_CHUNK_ALLOC 65536
+
+/** Return the allocation size we'd like to use to hold target
+ * bytes. */
+static INLINE size_t
+preferred_chunk_size(size_t target)
+{
+  size_t sz = MIN_CHUNK_ALLOC;
+  while (CHUNK_SIZE_WITH_ALLOC(sz) < target) {
+    sz <<= 1;
+  }
+  return sz;
+}
+
+/** Remove from the freelists most chunks that have not been used since the
+ * last call to buf_shrink_freelists(). */
+void
+buf_shrink_freelists(int free_all)
+{
+#ifdef ENABLE_BUF_FREELISTS
+  int i;
+  disable_control_logging();
+  for (i = 0; freelists[i].alloc_size; ++i) {
+    int slack = freelists[i].slack;
+    assert_freelist_ok(&freelists[i]);
+    if (free_all || freelists[i].lowest_length > slack) {
+      int n_to_free = free_all ? freelists[i].cur_length :
+        (freelists[i].lowest_length - slack);
+      int n_to_skip = freelists[i].cur_length - n_to_free;
+      int orig_length = freelists[i].cur_length;
+      int orig_n_to_free = n_to_free, n_freed=0;
+      int orig_n_to_skip = n_to_skip;
+      int new_length = n_to_skip;
+      chunk_t **chp = &freelists[i].head;
+      chunk_t *chunk;
+      while (n_to_skip) {
+        if (! (*chp)->next) {
+          log_warn(LD_BUG, "I wanted to skip %d chunks in the freelist for "
+                   "%d-byte chunks, but only found %d. (Length %d)",
+                   orig_n_to_skip, (int)freelists[i].alloc_size,
+                   orig_n_to_skip-n_to_skip, freelists[i].cur_length);
+          assert_freelist_ok(&freelists[i]);
+          goto done;
+        }
+        // tor_assert((*chp)->next);
+        chp = &(*chp)->next;
+        --n_to_skip;
+      }
+      chunk = *chp;
+      *chp = NULL;
+      while (chunk) {
+        chunk_t *next = chunk->next;
+        tor_free(chunk);
+        chunk = next;
+        --n_to_free;
+        ++n_freed;
+        ++freelists[i].n_free;
+      }
+      if (n_to_free) {
+        log_warn(LD_BUG, "Freelist length for %d-byte chunks may have been "
+                 "messed up somehow.", (int)freelists[i].alloc_size);
+        log_warn(LD_BUG, "There were %d chunks at the start.  I decided to "
+                 "keep %d. I wanted to free %d.  I freed %d.  I somehow think "
+                 "I have %d left to free.",
+                 freelists[i].cur_length, n_to_skip, orig_n_to_free,
+                 n_freed, n_to_free);
+      }
+      // tor_assert(!n_to_free);
+      freelists[i].cur_length = new_length;
+      log_info(LD_MM, "Cleaned freelist for %d-byte chunks: original "
+               "length %d, kept %d, dropped %d.",
+               (int)freelists[i].alloc_size, orig_length,
+               orig_n_to_skip, orig_n_to_free);
+    }
+    freelists[i].lowest_length = freelists[i].cur_length;
+    assert_freelist_ok(&freelists[i]);
+  }
+ done:
+  enable_control_logging();
+#else
+  (void) free_all;
+#endif
+}
+
+/** Describe the current status of the freelists at log level severity.
+ */
+void
+buf_dump_freelist_sizes(int severity)
+{
+#ifdef ENABLE_BUF_FREELISTS
+  int i;
+  tor_log(severity, LD_MM, "====== Buffer freelists:");
+  for (i = 0; freelists[i].alloc_size; ++i) {
+    uint64_t total = ((uint64_t)freelists[i].cur_length) *
+      freelists[i].alloc_size;
+    tor_log(severity, LD_MM,
+        U64_FORMAT" bytes in %d %d-byte chunks ["U64_FORMAT
+        " misses; "U64_FORMAT" frees; "U64_FORMAT" hits]",
+        U64_PRINTF_ARG(total),
+        freelists[i].cur_length, (int)freelists[i].alloc_size,
+        U64_PRINTF_ARG(freelists[i].n_alloc),
+        U64_PRINTF_ARG(freelists[i].n_free),
+        U64_PRINTF_ARG(freelists[i].n_hit));
+  }
+  tor_log(severity, LD_MM, U64_FORMAT" allocations in non-freelist sizes",
+      U64_PRINTF_ARG(n_freelist_miss));
+#else
+  (void)severity;
+#endif
+}
+
+/** Magic value for buf_t.magic, to catch pointer errors. */
+#define BUFFER_MAGIC 0xB0FFF312u
+/** A resizeable buffer, optimized for reading and writing. */
+struct buf_t {
+  uint32_t magic; /**< Magic cookie for debugging: Must be set to
+                   *   BUFFER_MAGIC. */
+  size_t datalen; /**< How many bytes is this buffer holding right now? */
+  size_t default_chunk_size; /**< Don't allocate any chunks smaller than
+                              * this for this buffer. */
+  chunk_t *head; /**< First chunk in the list, or NULL for none. */
+  chunk_t *tail; /**< Last chunk in the list, or NULL for none. */
+};
+
+/** Collapse data from the first N chunks from buf into buf->head,
+ * growing it as necessary, until buf->head has the first bytes bytes
+ * of data from the buffer, or until buf->head has all the data in buf.
+ *
+ * If nulterminate is true, ensure that there is a 0 byte in
+ * buf->head->mem right after all the data. */
+static void
+buf_pullup(buf_t *buf, size_t bytes, int nulterminate)
+{
+  chunk_t *dest, *src;
+  size_t capacity;
+  if (!buf->head)
+    return;
+
+  check();
+  if (buf->datalen < bytes)
+    bytes = buf->datalen;
+
+  if (nulterminate) {
+    capacity = bytes + 1;
+    if (buf->head->datalen >= bytes && CHUNK_REMAINING_CAPACITY(buf->head)) {
+      *CHUNK_WRITE_PTR(buf->head) = '\0';
+      return;
+    }
+  } else {
+    capacity = bytes;
+    if (buf->head->datalen >= bytes)
+      return;
+  }
+
+  if (buf->head->memlen >= capacity) {
+    /* We don't need to grow the first chunk, but we might need to repack it.*/
+    size_t needed = capacity - buf->head->datalen;
+    if (CHUNK_REMAINING_CAPACITY(buf->head) < needed)
+      chunk_repack(buf->head);
+    tor_assert(CHUNK_REMAINING_CAPACITY(buf->head) >= needed);
+  } else {
+    chunk_t *newhead;
+    size_t newsize;
+    /* We need to grow the chunk. */
+    chunk_repack(buf->head);
+    newsize = CHUNK_SIZE_WITH_ALLOC(preferred_chunk_size(capacity));
+    newhead = chunk_grow(buf->head, newsize);
+    tor_assert(newhead->memlen >= capacity);
+    if (newhead != buf->head) {
+      if (buf->tail == buf->head)
+        buf->tail = newhead;
+      buf->head = newhead;
+    }
+  }
+
+  dest = buf->head;
+  while (dest->datalen < bytes) {
+    size_t n = bytes - dest->datalen;
+    src = dest->next;
+    tor_assert(src);
+    if (n > src->datalen) {
+      memcpy(CHUNK_WRITE_PTR(dest), src->data, src->datalen);
+      dest->datalen += src->datalen;
+      dest->next = src->next;
+      if (buf->tail == src)
+        buf->tail = dest;
+      chunk_free_unchecked(src);
+    } else {
+      memcpy(CHUNK_WRITE_PTR(dest), src->data, n);
+      dest->datalen += n;
+      src->data += n;
+      src->datalen -= n;
+      tor_assert(dest->datalen == bytes);
+    }
+  }
+
+  if (nulterminate) {
+    tor_assert(CHUNK_REMAINING_CAPACITY(buf->head));
+    *CHUNK_WRITE_PTR(buf->head) = '\0';
+  }
+
+  check();
+}
+
+/** Resize buf so it won't hold extra memory that we haven't been
+ * using lately.
+ */
+void
+buf_shrink(buf_t *buf)
+{
+  (void)buf;
+}
+
+/** Remove the first n bytes from buf. */
+static INLINE void
+buf_remove_from_front(buf_t *buf, size_t n)
+{
+  tor_assert(buf->datalen >= n);
+  while (n) {
+    tor_assert(buf->head);
+    if (buf->head->datalen > n) {
+      buf->head->datalen -= n;
+      buf->head->data += n;
+      buf->datalen -= n;
+      return;
+    } else {
+      chunk_t *victim = buf->head;
+      n -= victim->datalen;
+      buf->datalen -= victim->datalen;
+      buf->head = victim->next;
+      if (buf->tail == victim)
+        buf->tail = NULL;
+      chunk_free_unchecked(victim);
+    }
+  }
+  check();
+}
+
+/** Create and return a new buf with default chunk capacity size.
+ */
+buf_t *
+buf_new_with_capacity(size_t size)
+{
+  buf_t *b = buf_new();
+  b->default_chunk_size = preferred_chunk_size(size);
+  return b;
+}
+
+/** Allocate and return a new buffer with default capacity. */
+buf_t *
+buf_new(void)
+{
+  buf_t *buf = tor_malloc_zero(sizeof(buf_t));
+  buf->magic = BUFFER_MAGIC;
+  buf->default_chunk_size = 4096;
+  return buf;
+}
+
+/** Remove all data from buf. */
+void
+buf_clear(buf_t *buf)
+{
+  chunk_t *chunk, *next;
+  buf->datalen = 0;
+  for (chunk = buf->head; chunk; chunk = next) {
+    next = chunk->next;
+    chunk_free_unchecked(chunk);
+  }
+  buf->head = buf->tail = NULL;
+}
+
+/** Return the number of bytes stored in buf */
+size_t
+buf_datalen(const buf_t *buf)
+{
+  return buf->datalen;
+}
+
+/** Return the total length of all chunks used in buf. */
+size_t
+buf_allocation(const buf_t *buf)
+{
+  size_t total = 0;
+  const chunk_t *chunk;
+  for (chunk = buf->head; chunk; chunk = chunk->next) {
+    total += chunk->memlen;
+  }
+  return total;
+}
+
+/** Return the number of bytes that can be added to buf without
+ * performing any additional allocation. */
+size_t
+buf_slack(const buf_t *buf)
+{
+  if (!buf->tail)
+    return 0;
+  else
+    return CHUNK_REMAINING_CAPACITY(buf->tail);
+}
+
+/** Release storage held by buf. */
+void
+buf_free(buf_t *buf)
+{
+  if (!buf)
+    return;
+
+  buf_clear(buf);
+  buf->magic = 0xdeadbeef;
+  tor_free(buf);
+}
+
+/** Return a new copy of in_chunk */
+static chunk_t *
+chunk_copy(const chunk_t *in_chunk)
+{
+  chunk_t *newch = tor_memdup(in_chunk, CHUNK_ALLOC_SIZE(in_chunk->memlen));
+  newch->next = NULL;
+  if (in_chunk->data) {
+    off_t offset = in_chunk->data - in_chunk->mem;
+    newch->data = newch->mem + offset;
+  }
+  return newch;
+}
+
+/** Return a new copy of buf */
+buf_t *
+buf_copy(const buf_t *buf)
+{
+  chunk_t *ch;
+  buf_t *out = buf_new();
+  out->default_chunk_size = buf->default_chunk_size;
+  for (ch = buf->head; ch; ch = ch->next) {
+    chunk_t *newch = chunk_copy(ch);
+    if (out->tail) {
+      out->tail->next = newch;
+      out->tail = newch;
+    } else {
+      out->head = out->tail = newch;
+    }
+  }
+  out->datalen = buf->datalen;
+  return out;
+}
+
+/** Append a new chunk with enough capacity to hold capacity bytes to
+ * the tail of buf.  If capped, don't allocate a chunk bigger
+ * than MAX_CHUNK_ALLOC. */
+static chunk_t *
+buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped)
+{
+  chunk_t *chunk;
+  if (CHUNK_ALLOC_SIZE(capacity) < buf->default_chunk_size) {
+    chunk = chunk_new_with_alloc_size(buf->default_chunk_size);
+  } else if (capped && CHUNK_ALLOC_SIZE(capacity) > MAX_CHUNK_ALLOC) {
+    chunk = chunk_new_with_alloc_size(MAX_CHUNK_ALLOC);
+  } else {
+    chunk = chunk_new_with_alloc_size(preferred_chunk_size(capacity));
+  }
+  if (buf->tail) {
+    tor_assert(buf->head);
+    buf->tail->next = chunk;
+    buf->tail = chunk;
+  } else {
+    tor_assert(!buf->head);
+    buf->head = buf->tail = chunk;
+  }
+  check();
+  return chunk;
+}
+
+/** Read up to at_most bytes from the socket fd into
+ * chunk (which must be on buf). If we get an EOF, set
+ * *reached_eof to 1.  Return -1 on error, 0 on eof or blocking,
+ * and the number of bytes read otherwise. */
+static INLINE int
+read_to_chunk(buf_t *buf, chunk_t *chunk, tor_socket_t fd, size_t at_most,
+              int *reached_eof, int *socket_error)
+{
+  ssize_t read_result;
+  if (at_most > CHUNK_REMAINING_CAPACITY(chunk))
+    at_most = CHUNK_REMAINING_CAPACITY(chunk);
+  read_result = tor_socket_recv(fd, CHUNK_WRITE_PTR(chunk), at_most, 0);
+
+  if (read_result < 0) {
+    int e = tor_socket_errno(fd);
+    if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */
+#ifdef _WIN32
+      if (e == WSAENOBUFS)
+        log_warn(LD_NET,"recv() failed: WSAENOBUFS. Not enough ram?");
+#endif
+      *socket_error = e;
+      return -1;
+    }
+    return 0; /* would block. */
+  } else if (read_result == 0) {
+    log_debug(LD_NET,"Encountered eof on fd %d", (int)fd);
+    *reached_eof = 1;
+    return 0;
+  } else { /* actually got bytes. */
+    buf->datalen += read_result;
+    chunk->datalen += read_result;
+    log_debug(LD_NET,"Read %ld bytes. %d on inbuf.", (long)read_result,
+              (int)buf->datalen);
+    tor_assert(read_result < INT_MAX);
+    return (int)read_result;
+  }
+}
+
+/** As read_to_chunk(), but return (negative) error code on error, blocking,
+ * or TLS, and the number of bytes read otherwise. */
+static INLINE int
+read_to_chunk_tls(buf_t *buf, chunk_t *chunk, tor_tls_t *tls,
+                  size_t at_most)
+{
+  int read_result;
+
+  tor_assert(CHUNK_REMAINING_CAPACITY(chunk) >= at_most);
+  read_result = tor_tls_read(tls, CHUNK_WRITE_PTR(chunk), at_most);
+  if (read_result < 0)
+    return read_result;
+  buf->datalen += read_result;
+  chunk->datalen += read_result;
+  return read_result;
+}
+
+/** Read from socket s, writing onto end of buf.  Read at most
+ * at_most bytes, growing the buffer as necessary.  If recv() returns 0
+ * (because of EOF), set *reached_eof to 1 and return 0. Return -1 on
+ * error; else return the number of bytes read.
+ */
+/* XXXX024 indicate "read blocked" somehow? */
+int
+read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof,
+            int *socket_error)
+{
+  /* XXXX024 It's stupid to overload the return values for these functions:
+   * "error status" and "number of bytes read" are not mutually exclusive.
+   */
+  int r = 0;
+  size_t total_read = 0;
+
+  check();
+  tor_assert(reached_eof);
+  tor_assert(SOCKET_OK(s));
+
+  while (at_most > total_read) {
+    size_t readlen = at_most - total_read;
+    chunk_t *chunk;
+    if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) {
+      chunk = buf_add_chunk_with_capacity(buf, at_most, 1);
+      if (readlen > chunk->memlen)
+        readlen = chunk->memlen;
+    } else {
+      size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail);
+      chunk = buf->tail;
+      if (cap < readlen)
+        readlen = cap;
+    }
+
+    r = read_to_chunk(buf, chunk, s, readlen, reached_eof, socket_error);
+    check();
+    if (r < 0)
+      return r; /* Error */
+    tor_assert(total_read+r < INT_MAX);
+    total_read += r;
+    if ((size_t)r < readlen) { /* eof, block, or no more to read. */
+      break;
+    }
+  }
+  return (int)total_read;
+}
+
+/** As read_to_buf, but reads from a TLS connection, and returns a TLS
+ * status value rather than the number of bytes read.
+ *
+ * Using TLS on OR connections complicates matters in two ways.
+ *
+ * First, a TLS stream has its own read buffer independent of the
+ * connection's read buffer.  (TLS needs to read an entire frame from
+ * the network before it can decrypt any data.  Thus, trying to read 1
+ * byte from TLS can require that several KB be read from the network
+ * and decrypted.  The extra data is stored in TLS's decrypt buffer.)
+ * Because the data hasn't been read by Tor (it's still inside the TLS),
+ * this means that sometimes a connection "has stuff to read" even when
+ * poll() didn't return POLLIN. The tor_tls_get_pending_bytes function is
+ * used in connection.c to detect TLS objects with non-empty internal
+ * buffers and read from them again.
+ *
+ * Second, the TLS stream's events do not correspond directly to network
+ * events: sometimes, before a TLS stream can read, the network must be
+ * ready to write -- or vice versa.
+ */
+int
+read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf)
+{
+  int r = 0;
+  size_t total_read = 0;
+
+  check_no_tls_errors();
+
+  check();
+
+  while (at_most > total_read) {
+    size_t readlen = at_most - total_read;
+    chunk_t *chunk;
+    if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) {
+      chunk = buf_add_chunk_with_capacity(buf, at_most, 1);
+      if (readlen > chunk->memlen)
+        readlen = chunk->memlen;
+    } else {
+      size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail);
+      chunk = buf->tail;
+      if (cap < readlen)
+        readlen = cap;
+    }
+
+    r = read_to_chunk_tls(buf, chunk, tls, readlen);
+    check();
+    if (r < 0)
+      return r; /* Error */
+    tor_assert(total_read+r < INT_MAX);
+     total_read += r;
+    if ((size_t)r < readlen) /* eof, block, or no more to read. */
+      break;
+  }
+  return (int)total_read;
+}
+
+/** Helper for flush_buf(): try to write sz bytes from chunk
+ * chunk of buffer buf onto socket s.  On success, deduct
+ * the bytes written from *buf_flushlen.  Return the number of bytes
+ * written on success, 0 on blocking, -1 on failure.
+ */
+static INLINE int
+flush_chunk(tor_socket_t s, buf_t *buf, chunk_t *chunk, size_t sz,
+            size_t *buf_flushlen)
+{
+  ssize_t write_result;
+
+  if (sz > chunk->datalen)
+    sz = chunk->datalen;
+  write_result = tor_socket_send(s, chunk->data, sz, 0);
+
+  if (write_result < 0) {
+    int e = tor_socket_errno(s);
+    if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */
+#ifdef _WIN32
+      if (e == WSAENOBUFS)
+        log_warn(LD_NET,"write() failed: WSAENOBUFS. Not enough ram?");
+#endif
+      return -1;
+    }
+    log_debug(LD_NET,"write() would block, returning.");
+    return 0;
+  } else {
+    *buf_flushlen -= write_result;
+    buf_remove_from_front(buf, write_result);
+    tor_assert(write_result < INT_MAX);
+    return (int)write_result;
+  }
+}
+
+/** Helper for flush_buf_tls(): try to write sz bytes from chunk
+ * chunk of buffer buf onto socket s.  (Tries to write
+ * more if there is a forced pending write size.)  On success, deduct the
+ * bytes written from *buf_flushlen.  Return the number of bytes
+ * written on success, and a TOR_TLS error code on failure or blocking.
+ */
+static INLINE int
+flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk,
+                size_t sz, size_t *buf_flushlen)
+{
+  int r;
+  size_t forced;
+  char *data;
+
+  forced = tor_tls_get_forced_write_size(tls);
+  if (forced > sz)
+    sz = forced;
+  if (chunk) {
+    data = chunk->data;
+    tor_assert(sz <= chunk->datalen);
+  } else {
+    data = NULL;
+    tor_assert(sz == 0);
+  }
+  r = tor_tls_write(tls, data, sz);
+  if (r < 0)
+    return r;
+  if (*buf_flushlen > (size_t)r)
+    *buf_flushlen -= r;
+  else
+    *buf_flushlen = 0;
+  buf_remove_from_front(buf, r);
+  log_debug(LD_NET,"flushed %d bytes, %d ready to flush, %d remain.",
+            r,(int)*buf_flushlen,(int)buf->datalen);
+  return r;
+}
+
+/** Write data from buf to the socket s.  Write at most
+ * sz bytes, decrement *buf_flushlen by
+ * the number of bytes actually written, and remove the written bytes
+ * from the buffer.  Return the number of bytes written on success,
+ * -1 on failure.  Return 0 if write() would block.
+ */
+int
+flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen)
+{
+  /* XXXX024 It's stupid to overload the return values for these functions:
+   * "error status" and "number of bytes flushed" are not mutually exclusive.
+   */
+  int r;
+  size_t flushed = 0;
+  tor_assert(buf_flushlen);
+  tor_assert(SOCKET_OK(s));
+  tor_assert(*buf_flushlen <= buf->datalen);
+  tor_assert(sz <= *buf_flushlen);
+
+  check();
+  while (sz) {
+    size_t flushlen0;
+    tor_assert(buf->head);
+    if (buf->head->datalen >= sz)
+      flushlen0 = sz;
+    else
+      flushlen0 = buf->head->datalen;
+
+    r = flush_chunk(s, buf, buf->head, flushlen0, buf_flushlen);
+    check();
+    if (r < 0)
+      return r;
+    flushed += r;
+    sz -= r;
+    if (r == 0 || (size_t)r < flushlen0) /* can't flush any more now. */
+      break;
+  }
+  tor_assert(flushed < INT_MAX);
+  return (int)flushed;
+}
+
+/** As flush_buf(), but writes data to a TLS connection.  Can write more than
+ * flushlen bytes.
+ */
+int
+flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t flushlen,
+              size_t *buf_flushlen)
+{
+  int r;
+  size_t flushed = 0;
+  ssize_t sz;
+  tor_assert(buf_flushlen);
+  tor_assert(*buf_flushlen <= buf->datalen);
+  tor_assert(flushlen <= *buf_flushlen);
+  sz = (ssize_t) flushlen;
+
+  /* we want to let tls write even if flushlen is zero, because it might
+   * have a partial record pending */
+  check_no_tls_errors();
+
+  check();
+  do {
+    size_t flushlen0;
+    if (buf->head) {
+      if ((ssize_t)buf->head->datalen >= sz)
+        flushlen0 = sz;
+      else
+        flushlen0 = buf->head->datalen;
+    } else {
+      flushlen0 = 0;
+    }
+
+    r = flush_chunk_tls(tls, buf, buf->head, flushlen0, buf_flushlen);
+    check();
+    if (r < 0)
+      return r;
+    flushed += r;
+    sz -= r;
+    if (r == 0) /* Can't flush any more now. */
+      break;
+  } while (sz > 0);
+  tor_assert(flushed < INT_MAX);
+  return (int)flushed;
+}
+
+/** Append string_len bytes from string to the end of
+ * buf.
+ *
+ * Return the new length of the buffer on success, -1 on failure.
+ */
+int
+write_to_buf(const char *string, size_t string_len, buf_t *buf)
+{
+  if (!string_len)
+    return (int)buf->datalen;
+  check();
+
+  while (string_len) {
+    size_t copy;
+    if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail))
+      buf_add_chunk_with_capacity(buf, string_len, 1);
+
+    copy = CHUNK_REMAINING_CAPACITY(buf->tail);
+    if (copy > string_len)
+      copy = string_len;
+    memcpy(CHUNK_WRITE_PTR(buf->tail), string, copy);
+    string_len -= copy;
+    string += copy;
+    buf->datalen += copy;
+    buf->tail->datalen += copy;
+  }
+
+  check();
+  tor_assert(buf->datalen < INT_MAX);
+  return (int)buf->datalen;
+}
+
+/** Helper: copy the first string_len bytes from buf
+ * onto string.
+ */
+static INLINE void
+peek_from_buf(char *string, size_t string_len, const buf_t *buf)
+{
+  chunk_t *chunk;
+
+  tor_assert(string);
+  /* make sure we don't ask for too much */
+  tor_assert(string_len <= buf->datalen);
+  /* assert_buf_ok(buf); */
+
+  chunk = buf->head;
+  while (string_len) {
+    size_t copy = string_len;
+    tor_assert(chunk);
+    if (chunk->datalen < copy)
+      copy = chunk->datalen;
+    memcpy(string, chunk->data, copy);
+    string_len -= copy;
+    string += copy;
+    chunk = chunk->next;
+  }
+}
+
+/** Remove string_len bytes from the front of buf, and store
+ * them into string.  Return the new buffer size.  string_len
+ * must be \<= the number of bytes on the buffer.
+ */
+int
+fetch_from_buf(char *string, size_t string_len, buf_t *buf)
+{
+  /* There must be string_len bytes in buf; write them onto string,
+   * then memmove buf back (that is, remove them from buf).
+   *
+   * Return the number of bytes still on the buffer. */
+
+  check();
+  peek_from_buf(string, string_len, buf);
+  buf_remove_from_front(buf, string_len);
+  check();
+  tor_assert(buf->datalen < INT_MAX);
+  return (int)buf->datalen;
+}
+
+/** True iff the cell command command is one that implies a
+ * variable-length cell in Tor link protocol linkproto. */
+static INLINE int
+cell_command_is_var_length(uint8_t command, int linkproto)
+{
+  /* If linkproto is v2 (2), CELL_VERSIONS is the only variable-length cells
+   * work as implemented here. If it's 1, there are no variable-length cells.
+   * Tor does not support other versions right now, and so can't negotiate
+   * them.
+   */
+  switch (linkproto) {
+  case 1:
+    /* Link protocol version 1 has no variable-length cells. */
+    return 0;
+  case 2:
+    /* In link protocol version 2, VERSIONS is the only variable-length cell */
+    return command == CELL_VERSIONS;
+  case 0:
+  case 3:
+  default:
+    /* In link protocol version 3 and later, and in version "unknown",
+     * commands 128 and higher indicate variable-length. VERSIONS is
+     * grandfathered in. */
+    return command == CELL_VERSIONS || command >= 128;
+  }
+}
+
+/** Check buf for a variable-length cell according to the rules of link
+ * protocol version linkproto.  If one is found, pull it off the buffer
+ * and assign a newly allocated var_cell_t to *out, and return 1.
+ * Return 0 if whatever is on the start of buf_t is not a variable-length
+ * cell.  Return 1 and set *out to NULL if there seems to be the start
+ * of a variable-length cell on buf, but the whole thing isn't there
+ * yet. */
+int
+fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto)
+{
+  char hdr[VAR_CELL_MAX_HEADER_SIZE];
+  var_cell_t *result;
+  uint8_t command;
+  uint16_t length;
+  const int wide_circ_ids = linkproto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS;
+  const int circ_id_len = get_circ_id_size(wide_circ_ids);
+  const unsigned header_len = get_var_cell_header_size(wide_circ_ids);
+  check();
+  *out = NULL;
+  if (buf->datalen < header_len)
+    return 0;
+  peek_from_buf(hdr, header_len, buf);
+
+  command = get_uint8(hdr + circ_id_len);
+  if (!(cell_command_is_var_length(command, linkproto)))
+    return 0;
+
+  length = ntohs(get_uint16(hdr + circ_id_len + 1));
+  if (buf->datalen < (size_t)(header_len+length))
+    return 1;
+  result = var_cell_new(length);
+  result->command = command;
+  if (wide_circ_ids)
+    result->circ_id = ntohl(get_uint32(hdr));
+  else
+    result->circ_id = ntohs(get_uint16(hdr));
+
+  buf_remove_from_front(buf, header_len);
+  peek_from_buf((char*) result->payload, length, buf);
+  buf_remove_from_front(buf, length);
+  check();
+
+  *out = result;
+  return 1;
+}
+
+#ifdef USE_BUFFEREVENTS
+/** Try to read n bytes from buf at pos (which may be
+ * NULL for the start of the buffer), copying the data only if necessary.  Set
+ * *data_out to a pointer to the desired bytes.  Set free_out
+ * to 1 if we needed to malloc *data because the original bytes were
+ * noncontiguous; 0 otherwise.  Return the number of bytes actually available
+ * at *data_out.
+ */
+static ssize_t
+inspect_evbuffer(struct evbuffer *buf, char **data_out, size_t n,
+                 int *free_out, struct evbuffer_ptr *pos)
+{
+  int n_vecs, i;
+
+  if (evbuffer_get_length(buf) < n)
+    n = evbuffer_get_length(buf);
+  if (n == 0)
+    return 0;
+  n_vecs = evbuffer_peek(buf, n, pos, NULL, 0);
+  tor_assert(n_vecs > 0);
+  if (n_vecs == 1) {
+    struct evbuffer_iovec v;
+    i = evbuffer_peek(buf, n, pos, &v, 1);
+    tor_assert(i == 1);
+    *data_out = v.iov_base;
+    *free_out = 0;
+    return v.iov_len;
+  } else {
+    ev_ssize_t copied;
+    *data_out = tor_malloc(n);
+    *free_out = 1;
+    copied = evbuffer_copyout(buf, *data_out, n);
+    tor_assert(copied >= 0 && (size_t)copied == n);
+    return copied;
+  }
+}
+
+/** As fetch_var_cell_from_buf, buf works on an evbuffer. */
+int
+fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out,
+                             int linkproto)
+{
+  char *hdr = NULL;
+  int free_hdr = 0;
+  size_t n;
+  size_t buf_len;
+  uint8_t command;
+  uint16_t cell_length;
+  var_cell_t *cell;
+  int result = 0;
+  const int wide_circ_ids = linkproto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS;
+  const int circ_id_len = get_circ_id_size(wide_circ_ids);
+  const unsigned header_len = get_var_cell_header_size(wide_circ_ids);
+
+  *out = NULL;
+  buf_len = evbuffer_get_length(buf);
+  if (buf_len < header_len)
+    return 0;
+
+  n = inspect_evbuffer(buf, &hdr, header_len, &free_hdr, NULL);
+  tor_assert(n >= header_len);
+
+  command = get_uint8(hdr + circ_id_len);
+  if (!(cell_command_is_var_length(command, linkproto))) {
+    goto done;
+  }
+
+  cell_length = ntohs(get_uint16(hdr + circ_id_len + 1));
+  if (buf_len < (size_t)(header_len+cell_length)) {
+    result = 1; /* Not all here yet. */
+    goto done;
+  }
+
+  cell = var_cell_new(cell_length);
+  cell->command = command;
+  if (wide_circ_ids)
+    cell->circ_id = ntohl(get_uint32(hdr));
+  else
+    cell->circ_id = ntohs(get_uint16(hdr));
+  evbuffer_drain(buf, header_len);
+  evbuffer_remove(buf, cell->payload, cell_length);
+  *out = cell;
+  result = 1;
+
+ done:
+  if (free_hdr && hdr)
+    tor_free(hdr);
+  return result;
+}
+#endif
+
+/** Move up to *buf_flushlen bytes from buf_in to
+ * buf_out, and modify *buf_flushlen appropriately.
+ * Return the number of bytes actually copied.
+ */
+int
+move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen)
+{
+  /* We can do way better here, but this doesn't turn up in any profiles. */
+  char b[4096];
+  size_t cp, len;
+  len = *buf_flushlen;
+  if (len > buf_in->datalen)
+    len = buf_in->datalen;
+
+  cp = len; /* Remember the number of bytes we intend to copy. */
+  tor_assert(cp < INT_MAX);
+  while (len) {
+    /* This isn't the most efficient implementation one could imagine, since
+     * it does two copies instead of 1, but I kinda doubt that this will be
+     * critical path. */
+    size_t n = len > sizeof(b) ? sizeof(b) : len;
+    fetch_from_buf(b, n, buf_in);
+    write_to_buf(b, n, buf_out);
+    len -= n;
+  }
+  *buf_flushlen -= cp;
+  return (int)cp;
+}
+
+/** Internal structure: represents a position in a buffer. */
+typedef struct buf_pos_t {
+  const chunk_t *chunk; /**< Which chunk are we pointing to? */
+  int pos;/**< Which character inside the chunk's data are we pointing to? */
+  size_t chunk_pos; /**< Total length of all previous chunks. */
+} buf_pos_t;
+
+/** Initialize out to point to the first character of buf.*/
+static void
+buf_pos_init(const buf_t *buf, buf_pos_t *out)
+{
+  out->chunk = buf->head;
+  out->pos = 0;
+  out->chunk_pos = 0;
+}
+
+/** Advance out to the first appearance of ch at the current
+ * position of out, or later.  Return -1 if no instances are found;
+ * otherwise returns the absolute position of the character. */
+static off_t
+buf_find_pos_of_char(char ch, buf_pos_t *out)
+{
+  const chunk_t *chunk;
+  int pos;
+  tor_assert(out);
+  if (out->chunk) {
+    if (out->chunk->datalen) {
+      tor_assert(out->pos < (off_t)out->chunk->datalen);
+    } else {
+      tor_assert(out->pos == 0);
+    }
+  }
+  pos = out->pos;
+  for (chunk = out->chunk; chunk; chunk = chunk->next) {
+    char *cp = memchr(chunk->data+pos, ch, chunk->datalen - pos);
+    if (cp) {
+      out->chunk = chunk;
+      tor_assert(cp - chunk->data < INT_MAX);
+      out->pos = (int)(cp - chunk->data);
+      return out->chunk_pos + out->pos;
+    } else {
+      out->chunk_pos += chunk->datalen;
+      pos = 0;
+    }
+  }
+  return -1;
+}
+
+/** Advance pos by a single character, if there are any more characters
+ * in the buffer.  Returns 0 on success, -1 on failure. */
+static INLINE int
+buf_pos_inc(buf_pos_t *pos)
+{
+  ++pos->pos;
+  if (pos->pos == (off_t)pos->chunk->datalen) {
+    if (!pos->chunk->next)
+      return -1;
+    pos->chunk_pos += pos->chunk->datalen;
+    pos->chunk = pos->chunk->next;
+    pos->pos = 0;
+  }
+  return 0;
+}
+
+/** Return true iff the n-character string in s appears
+ * (verbatim) at pos. */
+static int
+buf_matches_at_pos(const buf_pos_t *pos, const char *s, size_t n)
+{
+  buf_pos_t p;
+  if (!n)
+    return 1;
+
+  memcpy(&p, pos, sizeof(p));
+
+  while (1) {
+    char ch = p.chunk->data[p.pos];
+    if (ch != *s)
+      return 0;
+    ++s;
+    /* If we're out of characters that don't match, we match.  Check this
+     * _before_ we test incrementing pos, in case we're at the end of the
+     * string. */
+    if (--n == 0)
+      return 1;
+    if (buf_pos_inc(&p)<0)
+      return 0;
+  }
+}
+
+/** Return the first position in buf at which the n-character
+ * string s occurs, or -1 if it does not occur. */
+STATIC int
+buf_find_string_offset(const buf_t *buf, const char *s, size_t n)
+{
+  buf_pos_t pos;
+  buf_pos_init(buf, &pos);
+  while (buf_find_pos_of_char(*s, &pos) >= 0) {
+    if (buf_matches_at_pos(&pos, s, n)) {
+      tor_assert(pos.chunk_pos + pos.pos < INT_MAX);
+      return (int)(pos.chunk_pos + pos.pos);
+    } else {
+      if (buf_pos_inc(&pos)<0)
+        return -1;
+    }
+  }
+  return -1;
+}
+
+/** There is a (possibly incomplete) http statement on buf, of the
+ * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain NULs.)
+ * If a) the headers include a Content-Length field and all bytes in
+ * the body are present, or b) there's no Content-Length field and
+ * all headers are present, then:
+ *
+ *  - strdup headers into *headers_out, and NUL-terminate it.
+ *  - memdup body into *body_out, and NUL-terminate it.
+ *  - Then remove them from buf, and return 1.
+ *
+ *  - If headers or body is NULL, discard that part of the buf.
+ *  - If a headers or body doesn't fit in the arg, return -1.
+ *  (We ensure that the headers or body don't exceed max len,
+ *   _even if_ we're planning to discard them.)
+ *  - If force_complete is true, then succeed even if not all of the
+ *    content has arrived.
+ *
+ * Else, change nothing and return 0.
+ */
+int
+fetch_from_buf_http(buf_t *buf,
+                    char **headers_out, size_t max_headerlen,
+                    char **body_out, size_t *body_used, size_t max_bodylen,
+                    int force_complete)
+{
+  char *headers, *p;
+  size_t headerlen, bodylen, contentlen;
+  int crlf_offset;
+
+  check();
+  if (!buf->head)
+    return 0;
+
+  crlf_offset = buf_find_string_offset(buf, "\r\n\r\n", 4);
+  if (crlf_offset > (int)max_headerlen ||
+      (crlf_offset < 0 && buf->datalen > max_headerlen)) {
+    log_debug(LD_HTTP,"headers too long.");
+    return -1;
+  } else if (crlf_offset < 0) {
+    log_debug(LD_HTTP,"headers not all here yet.");
+    return 0;
+  }
+  /* Okay, we have a full header.  Make sure it all appears in the first
+   * chunk. */
+  if ((int)buf->head->datalen < crlf_offset + 4)
+    buf_pullup(buf, crlf_offset+4, 0);
+  headerlen = crlf_offset + 4;
+
+  headers = buf->head->data;
+  bodylen = buf->datalen - headerlen;
+  log_debug(LD_HTTP,"headerlen %d, bodylen %d.", (int)headerlen, (int)bodylen);
+
+  if (max_headerlen <= headerlen) {
+    log_warn(LD_HTTP,"headerlen %d larger than %d. Failing.",
+             (int)headerlen, (int)max_headerlen-1);
+    return -1;
+  }
+  if (max_bodylen <= bodylen) {
+    log_warn(LD_HTTP,"bodylen %d larger than %d. Failing.",
+             (int)bodylen, (int)max_bodylen-1);
+    return -1;
+  }
+
+#define CONTENT_LENGTH "\r\nContent-Length: "
+  p = (char*) tor_memstr(headers, headerlen, CONTENT_LENGTH);
+  if (p) {
+    int i;
+    i = atoi(p+strlen(CONTENT_LENGTH));
+    if (i < 0) {
+      log_warn(LD_PROTOCOL, "Content-Length is less than zero; it looks like "
+               "someone is trying to crash us.");
+      return -1;
+    }
+    contentlen = i;
+    /* if content-length is malformed, then our body length is 0. fine. */
+    log_debug(LD_HTTP,"Got a contentlen of %d.",(int)contentlen);
+    if (bodylen < contentlen) {
+      if (!force_complete) {
+        log_debug(LD_HTTP,"body not all here yet.");
+        return 0; /* not all there yet */
+      }
+    }
+    if (bodylen > contentlen) {
+      bodylen = contentlen;
+      log_debug(LD_HTTP,"bodylen reduced to %d.",(int)bodylen);
+    }
+  }
+  /* all happy. copy into the appropriate places, and return 1 */
+  if (headers_out) {
+    *headers_out = tor_malloc(headerlen+1);
+    fetch_from_buf(*headers_out, headerlen, buf);
+    (*headers_out)[headerlen] = 0; /* NUL terminate it */
+  }
+  if (body_out) {
+    tor_assert(body_used);
+    *body_used = bodylen;
+    *body_out = tor_malloc(bodylen+1);
+    fetch_from_buf(*body_out, bodylen, buf);
+    (*body_out)[bodylen] = 0; /* NUL terminate it */
+  }
+  check();
+  return 1;
+}
+
+#ifdef USE_BUFFEREVENTS
+/** As fetch_from_buf_http, buf works on an evbuffer. */
+int
+fetch_from_evbuffer_http(struct evbuffer *buf,
+                    char **headers_out, size_t max_headerlen,
+                    char **body_out, size_t *body_used, size_t max_bodylen,
+                    int force_complete)
+{
+  struct evbuffer_ptr crlf, content_length;
+  size_t headerlen, bodylen, contentlen;
+
+  /* Find the first \r\n\r\n in the buffer */
+  crlf = evbuffer_search(buf, "\r\n\r\n", 4, NULL);
+  if (crlf.pos < 0) {
+    /* We didn't find one. */
+    if (evbuffer_get_length(buf) > max_headerlen)
+      return -1; /* Headers too long. */
+    return 0; /* Headers not here yet. */
+  } else if (crlf.pos > (int)max_headerlen) {
+    return -1; /* Headers too long. */
+  }
+
+  headerlen = crlf.pos + 4;  /* Skip over the \r\n\r\n */
+  bodylen = evbuffer_get_length(buf) - headerlen;
+  if (bodylen > max_bodylen)
+    return -1; /* body too long */
+
+  /* Look for the first occurrence of CONTENT_LENGTH insize buf before the
+   * crlfcrlf */
+  content_length = evbuffer_search_range(buf, CONTENT_LENGTH,
+                                         strlen(CONTENT_LENGTH), NULL, &crlf);
+
+  if (content_length.pos >= 0) {
+    /* We found a content_length: parse it and figure out if the body is here
+     * yet. */
+    struct evbuffer_ptr eol;
+    char *data = NULL;
+    int free_data = 0;
+    int n, i;
+    n = evbuffer_ptr_set(buf, &content_length, strlen(CONTENT_LENGTH),
+                         EVBUFFER_PTR_ADD);
+    tor_assert(n == 0);
+    eol = evbuffer_search_eol(buf, &content_length, NULL, EVBUFFER_EOL_CRLF);
+    tor_assert(eol.pos > content_length.pos);
+    tor_assert(eol.pos <= crlf.pos);
+    inspect_evbuffer(buf, &data, eol.pos - content_length.pos, &free_data,
+                         &content_length);
+
+    i = atoi(data);
+    if (free_data)
+      tor_free(data);
+    if (i < 0) {
+      log_warn(LD_PROTOCOL, "Content-Length is less than zero; it looks like "
+               "someone is trying to crash us.");
+      return -1;
+    }
+    contentlen = i;
+    /* if content-length is malformed, then our body length is 0. fine. */
+    log_debug(LD_HTTP,"Got a contentlen of %d.",(int)contentlen);
+    if (bodylen < contentlen) {
+      if (!force_complete) {
+        log_debug(LD_HTTP,"body not all here yet.");
+        return 0; /* not all there yet */
+      }
+    }
+    if (bodylen > contentlen) {
+      bodylen = contentlen;
+      log_debug(LD_HTTP,"bodylen reduced to %d.",(int)bodylen);
+    }
+  }
+
+  if (headers_out) {
+    *headers_out = tor_malloc(headerlen+1);
+    evbuffer_remove(buf, *headers_out, headerlen);
+    (*headers_out)[headerlen] = '\0';
+  }
+  if (body_out) {
+    tor_assert(headers_out);
+    tor_assert(body_used);
+    *body_used = bodylen;
+    *body_out = tor_malloc(bodylen+1);
+    evbuffer_remove(buf, *body_out, bodylen);
+    (*body_out)[bodylen] = '\0';
+  }
+  return 1;
+}
+#endif
+
+/**
+ * Wait this many seconds before warning the user about using SOCKS unsafely
+ * again (requires that WarnUnsafeSocks is turned on). */
+#define SOCKS_WARN_INTERVAL 5
+
+/** Warn that the user application has made an unsafe socks request using
+ * protocol socks_protocol on port port.  Don't warn more than
+ * once per SOCKS_WARN_INTERVAL, unless safe_socks is set. */
+static void
+log_unsafe_socks_warning(int socks_protocol, const char *address,
+                         uint16_t port, int safe_socks)
+{
+  static ratelim_t socks_ratelim = RATELIM_INIT(SOCKS_WARN_INTERVAL);
+
+  const or_options_t *options = get_options();
+  if (! options->WarnUnsafeSocks)
+    return;
+  if (safe_socks) {
+    log_fn_ratelim(&socks_ratelim, LOG_WARN, LD_APP,
+             "Your application (using socks%d to port %d) is giving "
+             "Tor only an IP address. Applications that do DNS resolves "
+             "themselves may leak information. Consider using Socks4A "
+             "(e.g. via privoxy or socat) instead. For more information, "
+             "please see https://wiki.torproject.org/TheOnionRouter/"
+             "TorFAQ#SOCKSAndDNS.%s",
+             socks_protocol,
+             (int)port,
+             safe_socks ? " Rejecting." : "");
+  }
+  control_event_client_status(LOG_WARN,
+                              "DANGEROUS_SOCKS PROTOCOL=SOCKS%d ADDRESS=%s:%d",
+                              socks_protocol, address, (int)port);
+}
+
+/** Do not attempt to parse socks messages longer than this.  This value is
+ * actually significantly higher than the longest possible socks message. */
+#define MAX_SOCKS_MESSAGE_LEN 512
+
+/** Return a new socks_request_t. */
+socks_request_t *
+socks_request_new(void)
+{
+  return tor_malloc_zero(sizeof(socks_request_t));
+}
+
+/** Free all storage held in the socks_request_t req. */
+void
+socks_request_free(socks_request_t *req)
+{
+  if (!req)
+    return;
+  if (req->username) {
+    memwipe(req->username, 0x10, req->usernamelen);
+    tor_free(req->username);
+  }
+  if (req->password) {
+    memwipe(req->password, 0x04, req->passwordlen);
+    tor_free(req->password);
+  }
+  memwipe(req, 0xCC, sizeof(socks_request_t));
+  tor_free(req);
+}
+
+/** There is a (possibly incomplete) socks handshake on buf, of one
+ * of the forms
+ *  - socks4: "socksheader username\\0"
+ *  - socks4a: "socksheader username\\0 destaddr\\0"
+ *  - socks5 phase one: "version #methods methods"
+ *  - socks5 phase two: "version command 0 addresstype..."
+ * If it's a complete and valid handshake, and destaddr fits in
+ *   MAX_SOCKS_ADDR_LEN bytes, then pull the handshake off the buf,
+ *   assign to req, and return 1.
+ *
+ * If it's invalid or too big, return -1.
+ *
+ * Else it's not all there yet, leave buf alone and return 0.
+ *
+ * If you want to specify the socks reply, write it into req->reply
+ *   and set req->replylen, else leave req->replylen alone.
+ *
+ * If log_sockstype is non-zero, then do a notice-level log of whether
+ * the connection is possibly leaking DNS requests locally or not.
+ *
+ * If safe_socks is true, then reject unsafe socks protocols.
+ *
+ * If returning 0 or -1, req->address and req->port are
+ * undefined.
+ */
+int
+fetch_from_buf_socks(buf_t *buf, socks_request_t *req,
+                     int log_sockstype, int safe_socks)
+{
+  int res;
+  ssize_t n_drain;
+  size_t want_length = 128;
+
+  if (buf->datalen < 2) /* version and another byte */
+    return 0;
+
+  do {
+    n_drain = 0;
+    buf_pullup(buf, want_length, 0);
+    tor_assert(buf->head && buf->head->datalen >= 2);
+    want_length = 0;
+
+    res = parse_socks(buf->head->data, buf->head->datalen, req, log_sockstype,
+                      safe_socks, &n_drain, &want_length);
+
+    if (n_drain < 0)
+      buf_clear(buf);
+    else if (n_drain > 0)
+      buf_remove_from_front(buf, n_drain);
+
+  } while (res == 0 && buf->head && want_length < buf->datalen &&
+           buf->datalen >= 2);
+
+  return res;
+}
+
+#ifdef USE_BUFFEREVENTS
+/* As fetch_from_buf_socks(), but targets an evbuffer instead. */
+int
+fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req,
+                          int log_sockstype, int safe_socks)
+{
+  char *data;
+  ssize_t n_drain;
+  size_t datalen, buflen, want_length;
+  int res;
+
+  buflen = evbuffer_get_length(buf);
+  if (buflen < 2)
+    return 0;
+
+  {
+    /* See if we can find the socks request in the first chunk of the buffer.
+     */
+    struct evbuffer_iovec v;
+    int i;
+    n_drain = 0;
+    i = evbuffer_peek(buf, -1, NULL, &v, 1);
+    tor_assert(i == 1);
+    data = v.iov_base;
+    datalen = v.iov_len;
+    want_length = 0;
+
+    res = parse_socks(data, datalen, req, log_sockstype,
+                      safe_socks, &n_drain, &want_length);
+
+    if (n_drain < 0)
+      evbuffer_drain(buf, evbuffer_get_length(buf));
+    else if (n_drain > 0)
+      evbuffer_drain(buf, n_drain);
+
+    if (res)
+      return res;
+  }
+
+  /* Okay, the first chunk of the buffer didn't have a complete socks request.
+   * That means that either we don't have a whole socks request at all, or
+   * it's gotten split up.  We're going to try passing parse_socks() bigger
+   * and bigger chunks until either it says "Okay, I got it", or it says it
+   * will need more data than we currently have. */
+
+  /* Loop while we have more data that we haven't given parse_socks() yet. */
+  do {
+    int free_data = 0;
+    const size_t last_wanted = want_length;
+    n_drain = 0;
+    data = NULL;
+    datalen = inspect_evbuffer(buf, &data, want_length, &free_data, NULL);
+
+    want_length = 0;
+    res = parse_socks(data, datalen, req, log_sockstype,
+                      safe_socks, &n_drain, &want_length);
+
+    if (free_data)
+      tor_free(data);
+
+    if (n_drain < 0)
+      evbuffer_drain(buf, evbuffer_get_length(buf));
+    else if (n_drain > 0)
+      evbuffer_drain(buf, n_drain);
+
+    if (res == 0 && n_drain == 0 && want_length <= last_wanted) {
+      /* If we drained nothing, and we didn't ask for more than last time,
+       * then we probably wanted more data than the buffer actually had,
+       * and we're finding out that we're not satisified with it. It's
+       * time to break until we have more data. */
+      break;
+    }
+
+    buflen = evbuffer_get_length(buf);
+  } while (res == 0 && want_length <= buflen && buflen >= 2);
+
+  return res;
+}
+#endif
+
+/** The size of the header of an Extended ORPort message: 2 bytes for
+ *  COMMAND, 2 bytes for BODYLEN */
+#define EXT_OR_CMD_HEADER_SIZE 4
+
+/** Read buf, which should contain an Extended ORPort message
+ *  from a transport proxy. If well-formed, create and populate
+ *  out with the Extended ORport message. Return 0 if the
+ *  buffer was incomplete, 1 if it was well-formed and -1 if we
+ *  encountered an error while parsing it.  */
+int
+fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out)
+{
+  char hdr[EXT_OR_CMD_HEADER_SIZE];
+  uint16_t len;
+
+  check();
+  if (buf->datalen < EXT_OR_CMD_HEADER_SIZE)
+    return 0;
+  peek_from_buf(hdr, sizeof(hdr), buf);
+  len = ntohs(get_uint16(hdr+2));
+  if (buf->datalen < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+    return 0;
+  *out = ext_or_cmd_new(len);
+  (*out)->cmd = ntohs(get_uint16(hdr));
+  (*out)->len = len;
+  buf_remove_from_front(buf, EXT_OR_CMD_HEADER_SIZE);
+  fetch_from_buf((*out)->body, len, buf);
+  return 1;
+}
+
+#ifdef USE_BUFFEREVENTS
+/** Read buf, which should contain an Extended ORPort message
+ *  from a transport proxy. If well-formed, create and populate
+ *  out with the Extended ORport message. Return 0 if the
+ *  buffer was incomplete, 1 if it was well-formed and -1 if we
+ *  encountered an error while parsing it.  */
+int
+fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, ext_or_cmd_t **out)
+{
+  char hdr[EXT_OR_CMD_HEADER_SIZE];
+  uint16_t len;
+  size_t buf_len = evbuffer_get_length(buf);
+
+  if (buf_len < EXT_OR_CMD_HEADER_SIZE)
+    return 0;
+  evbuffer_copyout(buf, hdr, EXT_OR_CMD_HEADER_SIZE);
+  len = ntohs(get_uint16(hdr+2));
+  if (buf_len < (unsigned)len + EXT_OR_CMD_HEADER_SIZE)
+    return 0;
+  *out = ext_or_cmd_new(len);
+  (*out)->cmd = ntohs(get_uint16(hdr));
+  (*out)->len = len;
+  evbuffer_drain(buf, EXT_OR_CMD_HEADER_SIZE);
+  evbuffer_remove(buf, (*out)->body, len);
+  return 1;
+}
+#endif
+
+/** Implementation helper to implement fetch_from_*_socks.  Instead of looking
+ * at a buffer's contents, we look at the datalen bytes of data in
+ * data. Instead of removing data from the buffer, we set
+ * drain_out to the amount of data that should be removed (or -1 if the
+ * buffer should be cleared).  Instead of pulling more data into the first
+ * chunk of the buffer, we set *want_length_out to the number of bytes
+ * we'd like to see in the input buffer, if they're available. */
+static int
+parse_socks(const char *data, size_t datalen, socks_request_t *req,
+            int log_sockstype, int safe_socks, ssize_t *drain_out,
+            size_t *want_length_out)
+{
+  unsigned int len;
+  char tmpbuf[TOR_ADDR_BUF_LEN+1];
+  tor_addr_t destaddr;
+  uint32_t destip;
+  uint8_t socksver;
+  char *next, *startaddr;
+  unsigned char usernamelen, passlen;
+  struct in_addr in;
+
+  if (datalen < 2) {
+    /* We always need at least 2 bytes. */
+    *want_length_out = 2;
+    return 0;
+  }
+
+  if (req->socks_version == 5 && !req->got_auth) {
+    /* See if we have received authentication.  Strictly speaking, we should
+       also check whether we actually negotiated username/password
+       authentication.  But some broken clients will send us authentication
+       even if we negotiated SOCKS_NO_AUTH. */
+    if (*data == 1) { /* username/pass version 1 */
+      /* Format is: authversion [1 byte] == 1
+                    usernamelen [1 byte]
+                    username    [usernamelen bytes]
+                    passlen     [1 byte]
+                    password    [passlen bytes] */
+      usernamelen = (unsigned char)*(data + 1);
+      if (datalen < 2u + usernamelen + 1u) {
+        *want_length_out = 2u + usernamelen + 1u;
+        return 0;
+      }
+      passlen = (unsigned char)*(data + 2u + usernamelen);
+      if (datalen < 2u + usernamelen + 1u + passlen) {
+        *want_length_out = 2u + usernamelen + 1u + passlen;
+        return 0;
+      }
+      req->replylen = 2; /* 2 bytes of response */
+      req->reply[0] = 1; /* authversion == 1 */
+      req->reply[1] = 0; /* authentication successful */
+      log_debug(LD_APP,
+               "socks5: Accepted username/password without checking.");
+      if (usernamelen) {
+        req->username = tor_memdup(data+2u, usernamelen);
+        req->usernamelen = usernamelen;
+      }
+      if (passlen) {
+        req->password = tor_memdup(data+3u+usernamelen, passlen);
+        req->passwordlen = passlen;
+      }
+      *drain_out = 2u + usernamelen + 1u + passlen;
+      req->got_auth = 1;
+      *want_length_out = 7; /* Minimal socks5 sommand. */
+      return 0;
+    } else if (req->auth_type == SOCKS_USER_PASS) {
+      /* unknown version byte */
+      log_warn(LD_APP, "Socks5 username/password version %d not recognized; "
+               "rejecting.", (int)*data);
+      return -1;
+    }
+  }
+
+  socksver = *data;
+
+  switch (socksver) { /* which version of socks? */
+    case 5: /* socks5 */
+
+      if (req->socks_version != 5) { /* we need to negotiate a method */
+        unsigned char nummethods = (unsigned char)*(data+1);
+        int have_user_pass, have_no_auth;
+        int r=0;
+        tor_assert(!req->socks_version);
+        if (datalen < 2u+nummethods) {
+          *want_length_out = 2u+nummethods;
+          return 0;
+        }
+        if (!nummethods)
+          return -1;
+        req->replylen = 2; /* 2 bytes of response */
+        req->reply[0] = 5; /* socks5 reply */
+        have_user_pass = (memchr(data+2, SOCKS_USER_PASS, nummethods) !=NULL);
+        have_no_auth   = (memchr(data+2, SOCKS_NO_AUTH,   nummethods) !=NULL);
+        if (have_user_pass && !(have_no_auth && req->socks_prefer_no_auth)) {
+          req->auth_type = SOCKS_USER_PASS;
+          req->reply[1] = SOCKS_USER_PASS; /* tell client to use "user/pass"
+                                              auth method */
+          req->socks_version = 5; /* remember we've already negotiated auth */
+          log_debug(LD_APP,"socks5: accepted method 2 (username/password)");
+          r=0;
+        } else if (have_no_auth) {
+          req->reply[1] = SOCKS_NO_AUTH; /* tell client to use "none" auth
+                                            method */
+          req->socks_version = 5; /* remember we've already negotiated auth */
+          log_debug(LD_APP,"socks5: accepted method 0 (no authentication)");
+          r=0;
+        } else {
+          log_warn(LD_APP,
+                    "socks5: offered methods don't include 'no auth' or "
+                    "username/password. Rejecting.");
+          req->reply[1] = '\xFF'; /* reject all methods */
+          r=-1;
+        }
+        /* Remove packet from buf. Some SOCKS clients will have sent extra
+         * junk at this point; let's hope it's an authentication message. */
+        *drain_out = 2u + nummethods;
+
+        return r;
+      }
+      if (req->auth_type != SOCKS_NO_AUTH && !req->got_auth) {
+        log_warn(LD_APP,
+                 "socks5: negotiated authentication, but none provided");
+        return -1;
+      }
+      /* we know the method; read in the request */
+      log_debug(LD_APP,"socks5: checking request");
+      if (datalen < 7) {/* basic info plus >=1 for addr plus 2 for port */
+        *want_length_out = 7;
+        return 0; /* not yet */
+      }
+      req->command = (unsigned char) *(data+1);
+      if (req->command != SOCKS_COMMAND_CONNECT &&
+          req->command != SOCKS_COMMAND_RESOLVE &&
+          req->command != SOCKS_COMMAND_RESOLVE_PTR) {
+        /* not a connect or resolve or a resolve_ptr? we don't support it. */
+        log_warn(LD_APP,"socks5: command %d not recognized. Rejecting.",
+                 req->command);
+        return -1;
+      }
+      switch (*(data+3)) { /* address type */
+        case 1: /* IPv4 address */
+        case 4: /* IPv6 address */ {
+          const int is_v6 = *(data+3) == 4;
+          const unsigned addrlen = is_v6 ? 16 : 4;
+          log_debug(LD_APP,"socks5: ipv4 address type");
+          if (datalen < 6+addrlen) {/* ip/port there? */
+            *want_length_out = 6+addrlen;
+            return 0; /* not yet */
+          }
+
+          if (is_v6)
+            tor_addr_from_ipv6_bytes(&destaddr, data+4);
+          else
+            tor_addr_from_ipv4n(&destaddr, get_uint32(data+4));
+
+          tor_addr_to_str(tmpbuf, &destaddr, sizeof(tmpbuf), 1);
+
+          if (strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN) {
+            log_warn(LD_APP,
+                     "socks5 IP takes %d bytes, which doesn't fit in %d. "
+                     "Rejecting.",
+                     (int)strlen(tmpbuf)+1,(int)MAX_SOCKS_ADDR_LEN);
+            return -1;
+          }
+          strlcpy(req->address,tmpbuf,sizeof(req->address));
+          req->port = ntohs(get_uint16(data+4+addrlen));
+          *drain_out = 6+addrlen;
+          if (req->command != SOCKS_COMMAND_RESOLVE_PTR &&
+              !addressmap_have_mapping(req->address,0)) {
+            log_unsafe_socks_warning(5, req->address, req->port, safe_socks);
+            if (safe_socks)
+              return -1;
+          }
+          return 1;
+        }
+        case 3: /* fqdn */
+          log_debug(LD_APP,"socks5: fqdn address type");
+          if (req->command == SOCKS_COMMAND_RESOLVE_PTR) {
+            log_warn(LD_APP, "socks5 received RESOLVE_PTR command with "
+                     "hostname type. Rejecting.");
+            return -1;
+          }
+          len = (unsigned char)*(data+4);
+          if (datalen < 7+len) { /* addr/port there? */
+            *want_length_out = 7+len;
+            return 0; /* not yet */
+          }
+          if (len+1 > MAX_SOCKS_ADDR_LEN) {
+            log_warn(LD_APP,
+                     "socks5 hostname is %d bytes, which doesn't fit in "
+                     "%d. Rejecting.", len+1,MAX_SOCKS_ADDR_LEN);
+            return -1;
+          }
+          memcpy(req->address,data+5,len);
+          req->address[len] = 0;
+          req->port = ntohs(get_uint16(data+5+len));
+          *drain_out = 5+len+2;
+          if (!tor_strisprint(req->address) || strchr(req->address,'\"')) {
+            log_warn(LD_PROTOCOL,
+                     "Your application (using socks5 to port %d) gave Tor "
+                     "a malformed hostname: %s. Rejecting the connection.",
+                     req->port, escaped(req->address));
+            return -1;
+          }
+          if (log_sockstype)
+            log_notice(LD_APP,
+                  "Your application (using socks5 to port %d) instructed "
+                  "Tor to take care of the DNS resolution itself if "
+                  "necessary. This is good.", req->port);
+          return 1;
+        default: /* unsupported */
+          log_warn(LD_APP,"socks5: unsupported address type %d. Rejecting.",
+                   (int) *(data+3));
+          return -1;
+      }
+      tor_assert(0);
+    case 4: { /* socks4 */
+      enum {socks4, socks4a} socks4_prot = socks4a;
+      const char *authstart, *authend;
+      /* http://ss5.sourceforge.net/socks4.protocol.txt */
+      /* http://ss5.sourceforge.net/socks4A.protocol.txt */
+
+      req->socks_version = 4;
+      if (datalen < SOCKS4_NETWORK_LEN) {/* basic info available? */
+        *want_length_out = SOCKS4_NETWORK_LEN;
+        return 0; /* not yet */
+      }
+      // buf_pullup(buf, 1280, 0);
+      req->command = (unsigned char) *(data+1);
+      if (req->command != SOCKS_COMMAND_CONNECT &&
+          req->command != SOCKS_COMMAND_RESOLVE) {
+        /* not a connect or resolve? we don't support it. (No resolve_ptr with
+         * socks4.) */
+        log_warn(LD_APP,"socks4: command %d not recognized. Rejecting.",
+                 req->command);
+        return -1;
+      }
+
+      req->port = ntohs(get_uint16(data+2));
+      destip = ntohl(get_uint32(data+4));
+      if ((!req->port && req->command!=SOCKS_COMMAND_RESOLVE) || !destip) {
+        log_warn(LD_APP,"socks4: Port or DestIP is zero. Rejecting.");
+        return -1;
+      }
+      if (destip >> 8) {
+        log_debug(LD_APP,"socks4: destip not in form 0.0.0.x.");
+        in.s_addr = htonl(destip);
+        tor_inet_ntoa(&in,tmpbuf,sizeof(tmpbuf));
+        if (strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN) {
+          log_debug(LD_APP,"socks4 addr (%d bytes) too long. Rejecting.",
+                    (int)strlen(tmpbuf));
+          return -1;
+        }
+        log_debug(LD_APP,
+                  "socks4: successfully read destip (%s)",
+                  safe_str_client(tmpbuf));
+        socks4_prot = socks4;
+      }
+
+      authstart = data + SOCKS4_NETWORK_LEN;
+      next = memchr(authstart, 0,
+                    datalen-SOCKS4_NETWORK_LEN);
+      if (!next) {
+        if (datalen >= 1024) {
+          log_debug(LD_APP, "Socks4 user name too long; rejecting.");
+          return -1;
+        }
+        log_debug(LD_APP,"socks4: Username not here yet.");
+        *want_length_out = datalen+1024; /* More than we need, but safe */
+        return 0;
+      }
+      authend = next;
+      tor_assert(next < data+datalen);
+
+      startaddr = NULL;
+      if (socks4_prot != socks4a &&
+          !addressmap_have_mapping(tmpbuf,0)) {
+        log_unsafe_socks_warning(4, tmpbuf, req->port, safe_socks);
+
+        if (safe_socks)
+          return -1;
+      }
+      if (socks4_prot == socks4a) {
+        if (next+1 == data+datalen) {
+          log_debug(LD_APP,"socks4: No part of destaddr here yet.");
+          *want_length_out = datalen + 1024; /* More than we need, but safe */
+          return 0;
+        }
+        startaddr = next+1;
+        next = memchr(startaddr, 0, data + datalen - startaddr);
+        if (!next) {
+          if (datalen >= 1024) {
+            log_debug(LD_APP,"socks4: Destaddr too long.");
+            return -1;
+          }
+          log_debug(LD_APP,"socks4: Destaddr not all here yet.");
+          *want_length_out = datalen + 1024; /* More than we need, but safe */
+          return 0;
+        }
+        if (MAX_SOCKS_ADDR_LEN <= next-startaddr) {
+          log_warn(LD_APP,"socks4: Destaddr too long. Rejecting.");
+          return -1;
+        }
+        // tor_assert(next < buf->cur+buf->datalen);
+
+        if (log_sockstype)
+          log_notice(LD_APP,
+                     "Your application (using socks4a to port %d) instructed "
+                     "Tor to take care of the DNS resolution itself if "
+                     "necessary. This is good.", req->port);
+      }
+      log_debug(LD_APP,"socks4: Everything is here. Success.");
+      strlcpy(req->address, startaddr ? startaddr : tmpbuf,
+              sizeof(req->address));
+      if (!tor_strisprint(req->address) || strchr(req->address,'\"')) {
+        log_warn(LD_PROTOCOL,
+                 "Your application (using socks4 to port %d) gave Tor "
+                 "a malformed hostname: %s. Rejecting the connection.",
+                 req->port, escaped(req->address));
+        return -1;
+      }
+      if (authend != authstart) {
+        req->got_auth = 1;
+        req->usernamelen = authend - authstart;
+        req->username = tor_memdup(authstart, authend - authstart);
+      }
+      /* next points to the final \0 on inbuf */
+      *drain_out = next - data + 1;
+      return 1;
+    }
+    case 'G': /* get */
+    case 'H': /* head */
+    case 'P': /* put/post */
+    case 'C': /* connect */
+      strlcpy((char*)req->reply,
+"HTTP/1.0 501 Tor is not an HTTP Proxy\r\n"
+"Content-Type: text/html; charset=iso-8859-1\r\n\r\n"
+"\n"
+"\n"
+"Tor is not an HTTP Proxy\n"
+"\n"
+"\n"
+"

Tor is not an HTTP Proxy

\n" +"

\n" +"It appears you have configured your web browser to use Tor as an HTTP proxy." +"\n" +"This is not correct: Tor is a SOCKS proxy, not an HTTP proxy.\n" +"Please configure your client accordingly.\n" +"

\n" +"

\n" +"See " + "https://www.torproject.org/documentation.html for more " + "information.\n" +"\n" +"

\n" +"\n" +"\n" + , MAX_SOCKS_REPLY_LEN); + req->replylen = strlen((char*)req->reply)+1; + /* fall through */ + default: /* version is not socks4 or socks5 */ + log_warn(LD_APP, + "Socks version %d not recognized. (Tor is not an http proxy.)", + *(data)); + { + /* Tell the controller the first 8 bytes. */ + char *tmp = tor_strndup(data, datalen < 8 ? datalen : 8); + control_event_client_status(LOG_WARN, + "SOCKS_UNKNOWN_PROTOCOL DATA=\"%s\"", + escaped(tmp)); + tor_free(tmp); + } + return -1; + } +} + +/** Inspect a reply from SOCKS server stored in buf according + * to state, removing the protocol data upon success. Return 0 on + * incomplete response, 1 on success and -1 on error, in which case + * reason is set to a descriptive message (free() when finished + * with it). + * + * As a special case, 2 is returned when user/pass is required + * during SOCKS5 handshake and user/pass is configured. + */ +int +fetch_from_buf_socks_client(buf_t *buf, int state, char **reason) +{ + ssize_t drain = 0; + int r; + if (buf->datalen < 2) + return 0; + + buf_pullup(buf, MAX_SOCKS_MESSAGE_LEN, 0); + tor_assert(buf->head && buf->head->datalen >= 2); + + r = parse_socks_client((uint8_t*)buf->head->data, buf->head->datalen, + state, reason, &drain); + if (drain > 0) + buf_remove_from_front(buf, drain); + else if (drain < 0) + buf_clear(buf); + + return r; +} + +#ifdef USE_BUFFEREVENTS +/** As fetch_from_buf_socks_client, buf works on an evbuffer */ +int +fetch_from_evbuffer_socks_client(struct evbuffer *buf, int state, + char **reason) +{ + ssize_t drain = 0; + uint8_t *data; + size_t datalen; + int r; + + /* Linearize the SOCKS response in the buffer, up to 128 bytes. + * (parse_socks_client shouldn't need to see anything beyond that.) */ + datalen = evbuffer_get_length(buf); + if (datalen > MAX_SOCKS_MESSAGE_LEN) + datalen = MAX_SOCKS_MESSAGE_LEN; + data = evbuffer_pullup(buf, datalen); + + r = parse_socks_client(data, datalen, state, reason, &drain); + if (drain > 0) + evbuffer_drain(buf, drain); + else if (drain < 0) + evbuffer_drain(buf, evbuffer_get_length(buf)); + + return r; +} +#endif + +/** Implementation logic for fetch_from_*_socks_client. */ +static int +parse_socks_client(const uint8_t *data, size_t datalen, + int state, char **reason, + ssize_t *drain_out) +{ + unsigned int addrlen; + *drain_out = 0; + if (datalen < 2) + return 0; + + switch (state) { + case PROXY_SOCKS4_WANT_CONNECT_OK: + /* Wait for the complete response */ + if (datalen < 8) + return 0; + + if (data[1] != 0x5a) { + *reason = tor_strdup(socks4_response_code_to_string(data[1])); + return -1; + } + + /* Success */ + *drain_out = 8; + return 1; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: + /* we don't have any credentials */ + if (data[1] != 0x00) { + *reason = tor_strdup("server doesn't support any of our " + "available authentication methods"); + return -1; + } + + log_info(LD_NET, "SOCKS 5 client: continuing without authentication"); + *drain_out = -1; + return 1; + + case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: + /* we have a username and password. return 1 if we can proceed without + * providing authentication, or 2 otherwise. */ + switch (data[1]) { + case 0x00: + log_info(LD_NET, "SOCKS 5 client: we have auth details but server " + "doesn't require authentication."); + *drain_out = -1; + return 1; + case 0x02: + log_info(LD_NET, "SOCKS 5 client: need authentication."); + *drain_out = -1; + return 2; + /* fall through */ + } + + *reason = tor_strdup("server doesn't support any of our available " + "authentication methods"); + return -1; + + case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: + /* handle server reply to rfc1929 authentication */ + if (data[1] != 0x00) { + *reason = tor_strdup("authentication failed"); + return -1; + } + + log_info(LD_NET, "SOCKS 5 client: authentication successful."); + *drain_out = -1; + return 1; + + case PROXY_SOCKS5_WANT_CONNECT_OK: + /* response is variable length. BND.ADDR, etc, isn't needed + * (don't bother with buf_pullup()), but make sure to eat all + * the data used */ + + /* wait for address type field to arrive */ + if (datalen < 4) + return 0; + + switch (data[3]) { + case 0x01: /* ip4 */ + addrlen = 4; + break; + case 0x04: /* ip6 */ + addrlen = 16; + break; + case 0x03: /* fqdn (can this happen here?) */ + if (datalen < 5) + return 0; + addrlen = 1 + data[4]; + break; + default: + *reason = tor_strdup("invalid response to connect request"); + return -1; + } + + /* wait for address and port */ + if (datalen < 6 + addrlen) + return 0; + + if (data[1] != 0x00) { + *reason = tor_strdup(socks5_response_code_to_string(data[1])); + return -1; + } + + *drain_out = 6 + addrlen; + return 1; + } + + /* shouldn't get here... */ + tor_assert(0); + + return -1; +} + +/** Return 1 iff buf looks more like it has an (obsolete) v0 controller + * command on it than any valid v1 controller command. */ +int +peek_buf_has_control0_command(buf_t *buf) +{ + if (buf->datalen >= 4) { + char header[4]; + uint16_t cmd; + peek_from_buf(header, sizeof(header), buf); + cmd = ntohs(get_uint16(header+2)); + if (cmd <= 0x14) + return 1; /* This is definitely not a v1 control command. */ + } + return 0; +} + +#ifdef USE_BUFFEREVENTS +int +peek_evbuffer_has_control0_command(struct evbuffer *buf) +{ + int result = 0; + if (evbuffer_get_length(buf) >= 4) { + int free_out = 0; + char *data = NULL; + size_t n = inspect_evbuffer(buf, &data, 4, &free_out, NULL); + uint16_t cmd; + tor_assert(n >= 4); + cmd = ntohs(get_uint16(data+2)); + if (cmd <= 0x14) + result = 1; + if (free_out) + tor_free(data); + } + return result; +} +#endif + +/** Return the index within buf at which ch first appears, + * or -1 if ch does not appear on buf. */ +static off_t +buf_find_offset_of_char(buf_t *buf, char ch) +{ + chunk_t *chunk; + off_t offset = 0; + for (chunk = buf->head; chunk; chunk = chunk->next) { + char *cp = memchr(chunk->data, ch, chunk->datalen); + if (cp) + return offset + (cp - chunk->data); + else + offset += chunk->datalen; + } + return -1; +} + +/** Try to read a single LF-terminated line from buf, and write it + * (including the LF), NUL-terminated, into the *data_len byte buffer + * at data_out. Set *data_len to the number of bytes in the + * line, not counting the terminating NUL. Return 1 if we read a whole line, + * return 0 if we don't have a whole line yet, and return -1 if the line + * length exceeds *data_len. + */ +int +fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len) +{ + size_t sz; + off_t offset; + + if (!buf->head) + return 0; + + offset = buf_find_offset_of_char(buf, '\n'); + if (offset < 0) + return 0; + sz = (size_t) offset; + if (sz+2 > *data_len) { + *data_len = sz + 2; + return -1; + } + fetch_from_buf(data_out, sz+1, buf); + data_out[sz+1] = '\0'; + *data_len = sz+1; + return 1; +} + +/** Compress on uncompress the data_len bytes in data using the + * zlib state state, appending the result to buf. If + * done is true, flush the data in the state and finish the + * compression/uncompression. Return -1 on failure, 0 on success. */ +int +write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, + const char *data, size_t data_len, + int done) +{ + char *next; + size_t old_avail, avail; + int over = 0; + do { + int need_new_chunk = 0; + if (!buf->tail || ! CHUNK_REMAINING_CAPACITY(buf->tail)) { + size_t cap = data_len / 4; + buf_add_chunk_with_capacity(buf, cap, 1); + } + next = CHUNK_WRITE_PTR(buf->tail); + avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail); + switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { + case TOR_ZLIB_DONE: + over = 1; + break; + case TOR_ZLIB_ERR: + return -1; + case TOR_ZLIB_OK: + if (data_len == 0) + over = 1; + break; + case TOR_ZLIB_BUF_FULL: + if (avail) { + /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk + * automatically, whether were going to or not. */ + need_new_chunk = 1; + } + break; + } + buf->datalen += old_avail - avail; + buf->tail->datalen += old_avail - avail; + if (need_new_chunk) { + buf_add_chunk_with_capacity(buf, data_len/4, 1); + } + + } while (!over); + check(); + return 0; +} + +#ifdef USE_BUFFEREVENTS +int +write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state, + const char *data, size_t data_len, + int done) +{ + char *next; + size_t old_avail, avail; + int over = 0, n; + struct evbuffer_iovec vec[1]; + do { + { + size_t cap = data_len / 4; + if (cap < 128) + cap = 128; + /* XXXX NM this strategy is fragmentation-prone. We should really have + * two iovecs, and write first into the one, and then into the + * second if the first gets full. */ + n = evbuffer_reserve_space(buf, cap, vec, 1); + tor_assert(n == 1); + } + + next = vec[0].iov_base; + avail = old_avail = vec[0].iov_len; + + switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { + case TOR_ZLIB_DONE: + over = 1; + break; + case TOR_ZLIB_ERR: + return -1; + case TOR_ZLIB_OK: + if (data_len == 0) + over = 1; + break; + case TOR_ZLIB_BUF_FULL: + if (avail) { + /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk + * automatically, whether were going to or not. */ + } + break; + } + + /* XXXX possible infinite loop on BUF_FULL. */ + vec[0].iov_len = old_avail - avail; + evbuffer_commit_space(buf, vec, 1); + + } while (!over); + check(); + return 0; +} +#endif + +/** Set *output to contain a copy of the data in *input */ +int +generic_buffer_set_to_copy(generic_buffer_t **output, + const generic_buffer_t *input) +{ +#ifdef USE_BUFFEREVENTS + struct evbuffer_ptr ptr; + size_t remaining = evbuffer_get_length(input); + if (*output) { + evbuffer_drain(*output, evbuffer_get_length(*output)); + } else { + if (!(*output = evbuffer_new())) + return -1; + } + evbuffer_ptr_set((struct evbuffer*)input, &ptr, 0, EVBUFFER_PTR_SET); + while (remaining) { + struct evbuffer_iovec v[4]; + int n_used, i; + n_used = evbuffer_peek((struct evbuffer*)input, -1, &ptr, v, 4); + if (n_used < 0) + return -1; + for (i=0;ibuf is corrupted. + */ +void +assert_buf_ok(buf_t *buf) +{ + tor_assert(buf); + tor_assert(buf->magic == BUFFER_MAGIC); + + if (! buf->head) { + tor_assert(!buf->tail); + tor_assert(buf->datalen == 0); + } else { + chunk_t *ch; + size_t total = 0; + tor_assert(buf->tail); + for (ch = buf->head; ch; ch = ch->next) { + total += ch->datalen; + tor_assert(ch->datalen <= ch->memlen); + tor_assert(ch->data >= &ch->mem[0]); + tor_assert(ch->data < &ch->mem[0]+ch->memlen); + tor_assert(ch->data+ch->datalen <= &ch->mem[0] + ch->memlen); + if (!ch->next) + tor_assert(ch == buf->tail); + } + tor_assert(buf->datalen == total); + } +} + +#ifdef ENABLE_BUF_FREELISTS +/** Log an error and exit if fl is corrupted. + */ +static void +assert_freelist_ok(chunk_freelist_t *fl) +{ + chunk_t *ch; + int n; + tor_assert(fl->alloc_size > 0); + n = 0; + for (ch = fl->head; ch; ch = ch->next) { + tor_assert(CHUNK_ALLOC_SIZE(ch->memlen) == fl->alloc_size); + ++n; + } + tor_assert(n == fl->cur_length); + tor_assert(n >= fl->lowest_length); + tor_assert(n <= fl->max_length); +} +#endif + diff --git a/src/tor/buffers.h b/src/tor/buffers.h new file mode 100644 index 000000000..48b118520 --- /dev/null +++ b/src/tor/buffers.h @@ -0,0 +1,106 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file buffers.h + * \brief Header file for buffers.c. + **/ + +#ifndef TOR_BUFFERS_H +#define TOR_BUFFERS_H + +#include "testsupport.h" + +buf_t *buf_new(void); +buf_t *buf_new_with_capacity(size_t size); +void buf_free(buf_t *buf); +void buf_clear(buf_t *buf); +buf_t *buf_copy(const buf_t *buf); +void buf_shrink(buf_t *buf); +void buf_shrink_freelists(int free_all); +void buf_dump_freelist_sizes(int severity); + +size_t buf_datalen(const buf_t *buf); +size_t buf_allocation(const buf_t *buf); +size_t buf_slack(const buf_t *buf); + +int read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof, + int *socket_error); +int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf); + +int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen); +int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen); + +int write_to_buf(const char *string, size_t string_len, buf_t *buf); +int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, + const char *data, size_t data_len, int done); +int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); +int fetch_from_buf(char *string, size_t string_len, buf_t *buf); +int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto); +int fetch_from_buf_http(buf_t *buf, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, size_t max_bodylen, + int force_complete); +socks_request_t *socks_request_new(void); +void socks_request_free(socks_request_t *req); +int fetch_from_buf_socks(buf_t *buf, socks_request_t *req, + int log_sockstype, int safe_socks); +int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason); +int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len); + +int peek_buf_has_control0_command(buf_t *buf); + +int fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out); + +#ifdef USE_BUFFEREVENTS +int fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out, + int linkproto); +int fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req, + int log_sockstype, int safe_socks); +int fetch_from_evbuffer_socks_client(struct evbuffer *buf, int state, + char **reason); +int fetch_from_evbuffer_http(struct evbuffer *buf, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, size_t max_bodylen, + int force_complete); +int peek_evbuffer_has_control0_command(struct evbuffer *buf); +int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state, + const char *data, size_t data_len, + int done); +int fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, + ext_or_cmd_t **out); +#endif + +#ifdef USE_BUFFEREVENTS +#define generic_buffer_new() evbuffer_new() +#define generic_buffer_len(b) evbuffer_get_length((b)) +#define generic_buffer_add(b,dat,len) evbuffer_add((b),(dat),(len)) +#define generic_buffer_get(b,buf,buflen) evbuffer_remove((b),(buf),(buflen)) +#define generic_buffer_clear(b) evbuffer_drain((b), evbuffer_get_length((b))) +#define generic_buffer_free(b) evbuffer_free((b)) +#define generic_buffer_fetch_ext_or_cmd(b, out) \ + fetch_ext_or_command_from_evbuffer((b), (out)) +#else +#define generic_buffer_new() buf_new() +#define generic_buffer_len(b) buf_datalen((b)) +#define generic_buffer_add(b,dat,len) write_to_buf((dat),(len),(b)) +#define generic_buffer_get(b,buf,buflen) fetch_from_buf((buf),(buflen),(b)) +#define generic_buffer_clear(b) buf_clear((b)) +#define generic_buffer_free(b) buf_free((b)) +#define generic_buffer_fetch_ext_or_cmd(b, out) \ + fetch_ext_or_command_from_buf((b), (out)) +#endif +int generic_buffer_set_to_copy(generic_buffer_t **output, + const generic_buffer_t *input); + +void assert_buf_ok(buf_t *buf); + +#ifdef BUFFERS_PRIVATE +STATIC int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); +#endif + +#endif + diff --git a/src/tor/changes/.dummy b/src/tor/changes/.dummy deleted file mode 100644 index dd9738feb..000000000 --- a/src/tor/changes/.dummy +++ /dev/null @@ -1,37 +0,0 @@ -This file is here to keep git from removing the changes directory when -all the changes files have been merged. - - - - - - - - - - - - - - - - - - - - - - - - -"I'm Nobody! Who are you? - Are you--Nobody--too? - Then there's a pair of us! - Don’t tell! they'd advertise--you know! - - How dreary--to be--Somebody! - How public--like a Frog-- - To tell one's name--the livelong June-- - To an admiring Bog!" - -- Emily Dickinson - diff --git a/src/tor/changes/bug12062 b/src/tor/changes/bug12062 deleted file mode 100644 index 8972929d8..000000000 --- a/src/tor/changes/bug12062 +++ /dev/null @@ -1,16 +0,0 @@ - o Minor bugfixes (hibernation, bandwidth accounting, shutdown): - - - When hibernating, do not attempt to launch DNS checks. Fixes a - case of bug 12062; bugfix on 0.1.2.2-alpha. - - - Resolve several bugs related to descriptor fetching on bridge - clients with bandwidth accounting enabled. (This combination is - not recommended!) Fixes a case of bug 12062; bugfix on - 0.2.0.3-alpha. - - - When hibernating, do not try to upload or download - descriptors. Fixes a case of bug 12062; bugfix on 0.0.9pre5. - - - Do not attempt to launch self-reachability tests when entering - hibernation. Fixes a base of bug 12062; bugfix on 0.0.9pre5. - diff --git a/src/tor/changes/bug22605 b/src/tor/changes/bug22605 deleted file mode 100644 index fdfe20202..000000000 --- a/src/tor/changes/bug22605 +++ /dev/null @@ -1,5 +0,0 @@ - o Minor bugfixes (linux seccomp2 sandbox): - - When running with the sandbox enabled, reload configuration files - correctly even when %include was used. Previously we - would crash. Fixes bug 22605; bugfix on 0.3.1. - Patch from Daniel Pinto. diff --git a/src/tor/changes/bug22907 b/src/tor/changes/bug22907 deleted file mode 100644 index ff6ab8375..000000000 --- a/src/tor/changes/bug22907 +++ /dev/null @@ -1,3 +0,0 @@ - o Documentation: - - Add documentation on how to build tor with Rust dependencies without - requiring being online. Closes ticket 22907; bugfix on tor-0.3.0.3-alpha. diff --git a/src/tor/changes/bug23100 b/src/tor/changes/bug23100 deleted file mode 100644 index 22e2485d6..000000000 --- a/src/tor/changes/bug23100 +++ /dev/null @@ -1,7 +0,0 @@ - o Minor bugfixes (Performance): - - Use hidden service circuits (and other circuits longer than 3 hops) - to calculate a circuit build timeout. Previously, Tor only calculated - its build timeout based on circuits that planned to be exactly 3 hops - long. With this change, we include measurements from all circuits at - the point where they complete their third hop. Fixes bug 23100; - bugfix on 0.2.2.2-alpha. diff --git a/src/tor/changes/bug23114 b/src/tor/changes/bug23114 deleted file mode 100644 index b67f75a5a..000000000 --- a/src/tor/changes/bug23114 +++ /dev/null @@ -1,6 +0,0 @@ - o Minor bugfixes (Performance): - - Consider circuits for timeout as soon as they complete a hop. This - is more accurate than applying the timeout in circuit_expire_building() - because that function is only called once per second, which is now - too slow for typical timeouts on the current network. Fixes bug 23114; - bugfix on 0.2.2.2-alpha. diff --git a/src/tor/changes/bug23571 b/src/tor/changes/bug23571 deleted file mode 100644 index f2efbdfb9..000000000 --- a/src/tor/changes/bug23571 +++ /dev/null @@ -1,3 +0,0 @@ - o Minor bugfixes (hibernation): - - When hibernating, close connections normally and allow them to flush. - Fixes bug 23571; bugfix on 0.2.4.7-alpha. Also fixes bug 7267. diff --git a/src/tor/changes/bug23826-23828 b/src/tor/changes/bug23826-23828 deleted file mode 100644 index 2b991e5c1..000000000 --- a/src/tor/changes/bug23826-23828 +++ /dev/null @@ -1,14 +0,0 @@ - o Major features (IPv6, directory documents): - - Add consensus method 27, which adds IPv6 ORPorts to the microdesc - consensus. This makes it easier for IPv6 clients to bootstrap and - choose reachable entry guards. - Implements 23826. - - Add consensus method 28, which removes IPv6 ORPorts from - microdescriptors. Now that there are IPv6 ORPorts in the microdesc - consensus, they are redundant in microdescs. This change is compatible - with tor clients on 0.2.8.x and later. (0.2.8.x introduced client IPv6 - bootstrap and guard support.) - Implements 23828. - - Expand the documentation for AuthDirHasIPv6Connectivity when it is set - by different numbers of authorities. - Fixes 23870 on 0.2.4.1-alpha. diff --git a/src/tor/changes/bug23827 b/src/tor/changes/bug23827 deleted file mode 100644 index 75279abb8..000000000 --- a/src/tor/changes/bug23827 +++ /dev/null @@ -1,8 +0,0 @@ - o Minor feature (IPv6): - - When a consensus has IPv6 ORPorts, make IPv6-only clients use them, - rather than waiting to download microdescriptors. - Implements 23827. - - Make IPv6-only clients wait for microdescs for relays, even if we were - previously using descriptors (or were using them as a bridge) and have - a cached descriptor for them. - Implements 23827. diff --git a/src/tor/changes/bug23848 b/src/tor/changes/bug23848 deleted file mode 100644 index e2aec687c..000000000 --- a/src/tor/changes/bug23848 +++ /dev/null @@ -1,8 +0,0 @@ - o Minor features (embedding): - - On most errors that would cause Tor to exit, it now tries to return - from the tor_main() function, rather than calling the system exit() - function. Most users won't notice a difference here, but it should - make a significant difference on platforms that try to run Tor inside - a separate thread: they should now be able to survive Tor's exit - conditions rather than having Tor shut down the entire process. - Closes ticket 23848. diff --git a/src/tor/changes/bug23953 b/src/tor/changes/bug23953 deleted file mode 100644 index 10d41a00d..000000000 --- a/src/tor/changes/bug23953 +++ /dev/null @@ -1,3 +0,0 @@ - o Minor features (performance): - - Use stdatomic.h where available, rather than mutexes, to implement - atomic_counter_t. Closes ticket 23953. diff --git a/src/tor/changes/bug24119 b/src/tor/changes/bug24119 deleted file mode 100644 index 501425760..000000000 --- a/src/tor/changes/bug24119 +++ /dev/null @@ -1,4 +0,0 @@ - o Code simplification and refactoring: - - Rewrite channel_rsa_id_group_set_badness to reduce temporary memory - allocations with large numbers of OR connections (e.g. relays). Closes - ticket 24119. diff --git a/src/tor/changes/bug24137 b/src/tor/changes/bug24137 deleted file mode 100644 index 588e68d19..000000000 --- a/src/tor/changes/bug24137 +++ /dev/null @@ -1,3 +0,0 @@ - o Minor bugfixes (Private Networks): - - Give out Exit flags in bootstrapping networks. Fixes bug 24137; - bugfix on 0.2.3.1-alpha. diff --git a/src/tor/changes/bug24318 b/src/tor/changes/bug24318 deleted file mode 100644 index c92f7209f..000000000 --- a/src/tor/changes/bug24318 +++ /dev/null @@ -1,3 +0,0 @@ - o Documentation: - - Clarify the behavior of RelayBandwidth{Rate,Burst} with client traffic. - Closes ticket 24318. diff --git a/src/tor/changes/bug24337 b/src/tor/changes/bug24337 deleted file mode 100644 index 82b430425..000000000 --- a/src/tor/changes/bug24337 +++ /dev/null @@ -1,8 +0,0 @@ - o Minor features (defensive programming): - - Most of the functions in Tor that free objects have been replaced - with macros that free the objects and set the corresponding pointers - to NULL. This change should help prevent a large class of dangling - pointer bugs. Closes ticket 24337. - - - Where possible, the tor_free() macro now only evaluates its input once. - Part of ticket 24337. diff --git a/src/tor/changes/bug24362 b/src/tor/changes/bug24362 deleted file mode 100644 index 15e393cf3..000000000 --- a/src/tor/changes/bug24362 +++ /dev/null @@ -1,2 +0,0 @@ - o Minor features (logging, android): - - Added support for the Android logging subsystem. Closes ticket 24362. diff --git a/src/tor/changes/bug24374 b/src/tor/changes/bug24374 deleted file mode 100644 index d0b07f12d..000000000 --- a/src/tor/changes/bug24374 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (performance, 32-bit): - - Improve performance on 32-bit systems by avoiding 64-bit division - when timestamping cells and buffer chunks for OOM calculations. - Implements ticket 24374. diff --git a/src/tor/changes/bug24488 b/src/tor/changes/bug24488 deleted file mode 100644 index b8094e29e..000000000 --- a/src/tor/changes/bug24488 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor bugfixes (directory authorities, IPv6): - - When creating a routerstatus (vote) from a routerinfo (descriptor), - set the IPv6 address to the unspecified IPv6 address, and explicitly - initialise the port to zero. Fixes bug 24488; bugfix on 0.2.4.1-alpha. diff --git a/src/tor/changes/bug24489 b/src/tor/changes/bug24489 deleted file mode 100644 index 6864ba6f5..000000000 --- a/src/tor/changes/bug24489 +++ /dev/null @@ -1,3 +0,0 @@ - o Code simplification and refactoring (controller): - - Make most of the variables in networkstatus_getinfo_by_purpose() const. - Implements ticket 24489. diff --git a/src/tor/changes/bug24605 b/src/tor/changes/bug24605 deleted file mode 100644 index 7ee292b27..000000000 --- a/src/tor/changes/bug24605 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (instrumentation): - - Add the MainloopStats option to Tor that allows developers to get - instrumentation information from the main event loop via the heartbeat - messages. Closes ticket 24605. diff --git a/src/tor/changes/bug24612 b/src/tor/changes/bug24612 deleted file mode 100644 index 83db7f1df..000000000 --- a/src/tor/changes/bug24612 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor bugfixes (build): - - Fix output of autoconf checks to display success messages for - Rust dependencies and a suitable rustc compiler version. Fixes - bug 24612; bugfix on 0.3.1.3-alpha. diff --git a/src/tor/changes/bug24613 b/src/tor/changes/bug24613 deleted file mode 100644 index d718f8f94..000000000 --- a/src/tor/changes/bug24613 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (performance, 32-bit): - - Improve performance on 32-bit systems by avoiding 64-bit division - to calculate the current timestamp in milliseconds for channel - padding computations. Implements ticket 24613. diff --git a/src/tor/changes/cargo-build-problem b/src/tor/changes/cargo-build-problem deleted file mode 100644 index 6691b0efc..000000000 --- a/src/tor/changes/cargo-build-problem +++ /dev/null @@ -1,3 +0,0 @@ - o Minor bugfixes (compilation, rust): - - Build correctly when building from outside Tor's source tree with the - TOR_RUST_DEPENDENCIES option set. Fixes bug 22768; bugfix on 0.3.1.7. diff --git a/src/tor/changes/feature24427 b/src/tor/changes/feature24427 deleted file mode 100644 index 8650c45d3..000000000 --- a/src/tor/changes/feature24427 +++ /dev/null @@ -1,5 +0,0 @@ - o Minor features (OSX, iOS, performance): - - Use the mach_approximate_time() function (when available) to - implement coarse monotonic time. Having a coarse time function - should avoid a large number of system calls, and improve - performance slightly, especially under load. Closes ticket 24427. diff --git a/src/tor/changes/ticket13605 b/src/tor/changes/ticket13605 deleted file mode 100644 index 0456881ff..000000000 --- a/src/tor/changes/ticket13605 +++ /dev/null @@ -1,5 +0,0 @@ - o Major features (relay): - - Implement an option, ReducedExitPolicy, to allow an Tor exit relay - operator to use a more reasonable ("reduced") exit policy, rather - than the default one. Closes ticket 13605. Patch from Neel Chauhan. - diff --git a/src/tor/changes/ticket20020 b/src/tor/changes/ticket20020 deleted file mode 100644 index 737fb9598..000000000 --- a/src/tor/changes/ticket20020 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (logging): - - Improve a warning message that happens when we fail to re-parse - an old router because of an expired certificate. Closes ticket - 20020. diff --git a/src/tor/changes/ticket20699 b/src/tor/changes/ticket20699 deleted file mode 100644 index a93236ba4..000000000 --- a/src/tor/changes/ticket20699 +++ /dev/null @@ -1,14 +0,0 @@ - o Major features (hidden service v3, control port): - - Control port now supports command and events for hidden service v3. See - proposal 284 for more information on what has been done exactly. Only - the HSFETCH command hasn't been implemented at this stage because of a - lack of use case with v3. - - It is now possible to create ephemeral v3 services using the ADD_ONION - command. Here is a summary of the events and commands that have been - modified to support v3: - - Events: HS_DESC, HS_DESC_CONTENT, CIRC and CIRC_MINOR The - Commands: GETINFO, HSPOST, ADD_ONION and DEL_ONION. - - This closes ticket 20699. diff --git a/src/tor/changes/ticket20895 b/src/tor/changes/ticket20895 deleted file mode 100644 index a1d820499..000000000 --- a/src/tor/changes/ticket20895 +++ /dev/null @@ -1,6 +0,0 @@ - o Minor features (forward-compatibility): - - If a relay supports some link authentication protocol that we do not - recognize, then include that relay's ed25519 key when telling other - relays to extend to it. Previously, we treated future versions as if - they were too old to support ed25519 link authentication. - Closes ticket 20895. diff --git a/src/tor/changes/ticket22342 b/src/tor/changes/ticket22342 deleted file mode 100644 index 53505509d..000000000 --- a/src/tor/changes/ticket22342 +++ /dev/null @@ -1,3 +0,0 @@ - o Code simplification and refactoring: - - Small changes to Tor's buf_t API to make it suitable for use as - a general-purpose safe string constructor. Closes ticket 22342. diff --git a/src/tor/changes/ticket22703 b/src/tor/changes/ticket22703 deleted file mode 100644 index c1eda615f..000000000 --- a/src/tor/changes/ticket22703 +++ /dev/null @@ -1,6 +0,0 @@ - o Major features (storage): - - Users can choose to store cached directory documents somewhere other - than the DataDirectory by using the CacheDirectory option. - Similarly, the storage location for relay's keys can be overridden - with the KeyDirectory option. - Closes ticket 22703. diff --git a/src/tor/changes/ticket22840 b/src/tor/changes/ticket22840 deleted file mode 100644 index 6d234fb0d..000000000 --- a/src/tor/changes/ticket22840 +++ /dev/null @@ -1,8 +0,0 @@ - o Major features (Rust experimentation): - - Tor now ships with an optional implementation of one of its smaller - modules (protover.c) in the Rust programming language. To try it - out, install a Rust build environment, and configure Tor with - "--enable-rust --enable-cargo-online-mode". This should not - cause any user-visible changes, but should help us gain more experience - with Rust, and plan future Rust integration work. - Implementation by Chelsea Komlo. Closes ticket 22840. diff --git a/src/tor/changes/ticket23271 b/src/tor/changes/ticket23271 deleted file mode 100644 index 42d5921a7..000000000 --- a/src/tor/changes/ticket23271 +++ /dev/null @@ -1,6 +0,0 @@ - o Code simplification and refactoring: - - Separate the function that deletes ephemeral files when Tor stops - gracefully. - o Minor features (cleanup): - - Tor now deletes the CookieAuthFile and ExtORPortCookieAuthFile when it - stops. Closes ticket 23271. diff --git a/src/tor/changes/ticket23459 b/src/tor/changes/ticket23459 deleted file mode 100644 index a6452e4ee..000000000 --- a/src/tor/changes/ticket23459 +++ /dev/null @@ -1,4 +0,0 @@ - o Code simplification and refactoring (circuit rendezvous): - - Split get rendezvous circuit on client side on two different functions. - One that returns only established circuits and another that returns all - kinds of circuits. Closes ticket 23459. diff --git a/src/tor/changes/ticket23577 b/src/tor/changes/ticket23577 deleted file mode 100644 index 7cd80bcb6..000000000 --- a/src/tor/changes/ticket23577 +++ /dev/null @@ -1,7 +0,0 @@ - o Major features (v3 onion services): - - When v3 onion service clients send introduce cells, include the IPv6 - address of the rendezvous point, if it has one. v3 onion services running - 0.3.2 ignore IPv6 addresses. In future Tor versions, IPv6-only v3 single - onion services can use IPv6 addresses to connect directly to the - rendezvous point. Closes ticket 23577. Patch by Neel Chauhan. - diff --git a/src/tor/changes/ticket23637 b/src/tor/changes/ticket23637 deleted file mode 100644 index 0c524f34c..000000000 --- a/src/tor/changes/ticket23637 +++ /dev/null @@ -1,5 +0,0 @@ - o Minor features (directory authority): - - Make the "Exit" flag assignment only depend on whether the exit - policy allows connections to ports 80 and 443. Previously relays - would get the Exit flag if they allowed connections to one of - these ports and also port 6667. Resolves ticket 23637. diff --git a/src/tor/changes/ticket23709 b/src/tor/changes/ticket23709 deleted file mode 100644 index 7948f9ae0..000000000 --- a/src/tor/changes/ticket23709 +++ /dev/null @@ -1,11 +0,0 @@ - o Major feature (channel): - - Remove the incoming and outgoing channel queues. The reason to do so was - due to the fact that they were always empty meaning never used but still - looked at in our fast path. Bottom line, it was an unused code path. - - We've simplify a lot the channel subsystem by removing those queues but - also by removing a lot of unused code or dead code around it. Overall - this is a cleanup removing more than 1500 lines of code overall and - adding very little except for unit test. - - The majority ot the channel unit tests have been rewritten and the code - coverage has now been raised to 83.6% for channel.c. - Closes ticket 23709. diff --git a/src/tor/changes/ticket23760 b/src/tor/changes/ticket23760 deleted file mode 100644 index 9213b1462..000000000 --- a/src/tor/changes/ticket23760 +++ /dev/null @@ -1,4 +0,0 @@ - o Code simplification and refactoring: - - We make extend_info_from_node() use node_get_curve25519_onion_key() - introduced in ticket 23577 to access the curve25519 public keys rather - than accessing it directly. Closes ticket 23760. Patch by Neel Chauhan. diff --git a/src/tor/changes/ticket23845 b/src/tor/changes/ticket23845 deleted file mode 100644 index 93c150bdb..000000000 --- a/src/tor/changes/ticket23845 +++ /dev/null @@ -1,9 +0,0 @@ - o Major features (embedding): - - There is now a documented stable API for programs that need to - embed Tor. See tor_api.h for full documentation and known bugs. - Closes ticket 23684. - - o Code simplification and refactoring: - - The tor_git_revision[] constant no longer needs to be redeclared - by everything that links against the rest of Tor. Done as part - of ticket 23845, to simplify our external API. diff --git a/src/tor/changes/ticket23900 b/src/tor/changes/ticket23900 deleted file mode 100644 index 0f949f4f4..000000000 --- a/src/tor/changes/ticket23900 +++ /dev/null @@ -1,7 +0,0 @@ - o Minor features (API, embedding): - - Tor can now start with a preauthenticated control connection - created by the process that launched it. This feature is meant - for use by programs that want to launch and manage a Tor process - without allowing other programs to manage it as well. - For more information, see the __OwningControllerFD option - documented in control-spec.txt. Closes ticket 23900. diff --git a/src/tor/changes/ticket24363 b/src/tor/changes/ticket24363 deleted file mode 100644 index 6f90fc066..000000000 --- a/src/tor/changes/ticket24363 +++ /dev/null @@ -1,2 +0,0 @@ - o Code simplification and refactoring: - - Remove /usr/athena from search path in configure.ac. Closes ticket 24363. diff --git a/src/tor/changes/ticket24467 b/src/tor/changes/ticket24467 deleted file mode 100644 index 1b1c223f5..000000000 --- a/src/tor/changes/ticket24467 +++ /dev/null @@ -1,3 +0,0 @@ - o Code simplification and refactoring: - - Switch -Wnormalized=id to -Wnormalized=nfkc in configure.ac to avoid - source code identifier confusion. Closes ticket 24467. diff --git a/src/tor/changes/ticket24518 b/src/tor/changes/ticket24518 deleted file mode 100644 index 28d40a3f2..000000000 --- a/src/tor/changes/ticket24518 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor bugfixes (build, rust): - - Don't pass the --quiet option to cargo: it seems to suppress some - errors, which is not what we want to do when building. - Fixes bug 24518; bugfix on 0.3.1.7. diff --git a/src/tor/src/or/channel.c b/src/tor/channel.c similarity index 65% rename from src/tor/src/or/channel.c rename to src/tor/channel.c index 845fc3cb4..62796d936 100644 --- a/src/tor/src/or/channel.c +++ b/src/tor/channel.c @@ -1,51 +1,9 @@ - -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file channel.c - * - * \brief OR/OP-to-OR channel abstraction layer. A channel's job is to - * transfer cells from Tor instance to Tor instance. Currently, there is only - * one implementation of the channel abstraction: in channeltls.c. - * - * Channels are a higher-level abstraction than or_connection_t: In general, - * any means that two Tor relays use to exchange cells, or any means that a - * relay and a client use to exchange cells, is a channel. - * - * Channels differ from pluggable transports in that they do not wrap an - * underlying protocol over which cells are transmitted: they are the - * underlying protocol. - * - * This module defines the generic parts of the channel_t interface, and - * provides the machinery necessary for specialized implementations to be - * created. At present, there is one specialized implementation in - * channeltls.c, which uses connection_or.c to send cells over a TLS - * connection. - * - * Every channel implementation is responsible for being able to transmit - * cells that are passed to it - * - * For *inbound* cells, the entry point is: channel_process_cell(). It takes a - * cell and will pass it to the cell handler set by - * channel_set_cell_handlers(). Currently, this is passed back to the command - * subsystem which is command_process_cell(). - * - * NOTE: For now, the seperation between channels and specialized channels - * (like channeltls) is not that well defined. So the channeltls layer calls - * channel_process_cell() which originally comes from the connection subsytem. - * This should be hopefully be fixed with #23993. - * - * For *outbound* cells, the entry point is: channel_write_packed_cell(). - * Only packed cells are dequeued from the circuit queue by the scheduler - * which uses channel_flush_from_first_active_circuit() to decide which cells - * to flush from which circuit on the channel. They are then passed down to - * the channel subsystem. This calls the low layer with the function pointer - * .write_packed_cell(). - * - * Each specialized channel (currently only channeltls_t) MUST implement a - * series of function found in channel_t. See channel.h for more - * documentation. + * \brief OR-to-OR channel abstraction layer **/ /* @@ -55,17 +13,12 @@ #define TOR_CHANNEL_INTERNAL_ -/* This one's for stuff only channel.c and the test suite should see */ -#define CHANNEL_PRIVATE_ - #include "or.h" #include "channel.h" #include "channeltls.h" -#include "channelpadding.h" #include "circuitbuild.h" #include "circuitlist.h" #include "circuitstats.h" -#include "config.h" #include "connection_or.h" /* For var_cell_free() */ #include "circuitmux.h" #include "entrynodes.h" @@ -75,10 +28,29 @@ #include "rephist.h" #include "router.h" #include "routerlist.h" -#include "scheduler.h" -#include "compat_time.h" -#include "networkstatus.h" -#include "rendservice.h" + +/* Cell queue structure */ + +typedef struct cell_queue_entry_s cell_queue_entry_t; +struct cell_queue_entry_s { + TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next; + enum { + CELL_QUEUE_FIXED, + CELL_QUEUE_VAR, + CELL_QUEUE_PACKED + } type; + union { + struct { + cell_t *cell; + } fixed; + struct { + var_cell_t *var_cell; + } var; + struct { + packed_cell_t *packed_cell; + } packed; + } u; +}; /* Global lists of channels */ @@ -100,28 +72,6 @@ static smartlist_t *active_listeners = NULL; /* All channel_listener_t instances in LISTENING state */ static smartlist_t *finished_listeners = NULL; -/** Map from channel->global_identifier to channel. Contains the same - * elements as all_channels. */ -static HT_HEAD(channel_gid_map, channel_s) channel_gid_map = HT_INITIALIZER(); - -static unsigned -channel_id_hash(const channel_t *chan) -{ - return (unsigned) chan->global_identifier; -} -static int -channel_id_eq(const channel_t *a, const channel_t *b) -{ - return a->global_identifier == b->global_identifier; -} -HT_PROTOTYPE(channel_gid_map, channel_s, gidmap_node, - channel_id_hash, channel_id_eq) -HT_GENERATE2(channel_gid_map, channel_s, gidmap_node, - channel_id_hash, channel_id_eq, - 0.6, tor_reallocarray_, tor_free_) - -HANDLE_IMPL(channel, channel_s,) - /* Counter for ID numbers */ static uint64_t n_channels_allocated = 0; @@ -133,7 +83,7 @@ static uint64_t n_channels_allocated = 0; * If more than one channel exists, follow the next_with_same_id pointer * as a linked list. */ -static HT_HEAD(channel_idmap, channel_idmap_entry_s) channel_identity_map = +HT_HEAD(channel_idmap, channel_idmap_entry_s) channel_identity_map = HT_INITIALIZER(); typedef struct channel_idmap_entry_s { @@ -142,13 +92,18 @@ typedef struct channel_idmap_entry_s { TOR_LIST_HEAD(channel_list_s, channel_s) channel_list; } channel_idmap_entry_t; -static inline unsigned +static INLINE unsigned channel_idmap_hash(const channel_idmap_entry_t *ent) { - return (unsigned) siphash24g(ent->digest, DIGEST_LEN); + const unsigned *a = (const unsigned *)ent->digest; +#if SIZEOF_INT == 4 + return a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4]; +#elif SIZEOF_INT == 8 + return a[0] ^ a[1]; +#endif } -static inline int +static INLINE int channel_idmap_eq(const channel_idmap_entry_t *a, const channel_idmap_entry_t *b) { @@ -156,19 +111,39 @@ channel_idmap_eq(const channel_idmap_entry_t *a, } HT_PROTOTYPE(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, - channel_idmap_eq) -HT_GENERATE2(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, - channel_idmap_eq, 0.5, tor_reallocarray_, tor_free_) + channel_idmap_eq); +HT_GENERATE(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, + channel_idmap_eq, 0.5, tor_malloc, tor_realloc, tor_free_); + +static cell_queue_entry_t * cell_queue_entry_dup(cell_queue_entry_t *q); +static void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off); +static int cell_queue_entry_is_padding(cell_queue_entry_t *q); +static cell_queue_entry_t * +cell_queue_entry_new_fixed(cell_t *cell); +static cell_queue_entry_t * +cell_queue_entry_new_var(var_cell_t *var_cell); +static int is_destroy_cell(channel_t *chan, + const cell_queue_entry_t *q, circid_t *circid_out); /* Functions to maintain the digest map */ +static void channel_add_to_digest_map(channel_t *chan); static void channel_remove_from_digest_map(channel_t *chan); -static void channel_force_xfree(channel_t *chan); -static void channel_free_list(smartlist_t *channels, - int mark_for_close); -static void channel_listener_free_list(smartlist_t *channels, - int mark_for_close); -static void channel_listener_force_xfree(channel_listener_t *chan_l); +/* + * Flush cells from just the outgoing queue without trying to get them + * from circuits; used internall by channel_flush_some_cells(). + */ +static ssize_t +channel_flush_some_cells_from_outgoing_queue(channel_t *chan, + ssize_t num_cells); +static void channel_force_free(channel_t *chan); +static void +channel_free_list(smartlist_t *channels, int mark_for_close); +static void +channel_listener_free_list(smartlist_t *channels, int mark_for_close); +static void channel_listener_force_free(channel_listener_t *chan_l); +static void +channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q); /*********************************** * Channel state utility functions * @@ -389,7 +364,6 @@ void channel_register(channel_t *chan) { tor_assert(chan); - tor_assert(chan->global_identifier); /* No-op if already registered */ if (chan->registered) return; @@ -404,11 +378,10 @@ channel_register(channel_t *chan) /* Make sure we have all_channels, then add it */ if (!all_channels) all_channels = smartlist_new(); smartlist_add(all_channels, chan); - channel_t *oldval = HT_REPLACE(channel_gid_map, &channel_gid_map, chan); - tor_assert(! oldval); /* Is it finished? */ - if (CHANNEL_FINISHED(chan)) { + if (chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) { /* Put it in the finished list, creating it if necessary */ if (!finished_channels) finished_channels = smartlist_new(); smartlist_add(finished_channels, chan); @@ -417,7 +390,7 @@ channel_register(channel_t *chan) if (!active_channels) active_channels = smartlist_new(); smartlist_add(active_channels, chan); - if (!CHANNEL_IS_CLOSING(chan)) { + if (chan->state != CHANNEL_STATE_CLOSING) { /* It should have a digest set */ if (!tor_digest_is_zero(chan->identity_digest)) { /* Yeah, we're good, add it to the map */ @@ -452,7 +425,8 @@ channel_unregister(channel_t *chan) if (!(chan->registered)) return; /* Is it finished? */ - if (CHANNEL_FINISHED(chan)) { + if (chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) { /* Get it out of the finished list */ if (finished_channels) smartlist_remove(finished_channels, chan); } else { @@ -461,16 +435,16 @@ channel_unregister(channel_t *chan) } /* Get it out of all_channels */ - if (all_channels) smartlist_remove(all_channels, chan); - channel_t *oldval = HT_REMOVE(channel_gid_map, &channel_gid_map, chan); - tor_assert(oldval == NULL || oldval == chan); + if (all_channels) smartlist_remove(all_channels, chan); /* Mark it as unregistered */ chan->registered = 0; /* Should it be in the digest map? */ if (!tor_digest_is_zero(chan->identity_digest) && - !(CHANNEL_CONDEMNED(chan))) { + !(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR)) { /* Remove it */ channel_remove_from_digest_map(chan); } @@ -498,7 +472,7 @@ channel_listener_register(channel_listener_t *chan_l) channel_listener_state_to_string(chan_l->state), chan_l->state); - /* Make sure we have all_listeners, then add it */ + /* Make sure we have all_channels, then add it */ if (!all_listeners) all_listeners = smartlist_new(); smartlist_add(all_listeners, chan_l); @@ -543,7 +517,7 @@ channel_listener_unregister(channel_listener_t *chan_l) if (active_listeners) smartlist_remove(active_listeners, chan_l); } - /* Get it out of all_listeners */ + /* Get it out of all_channels */ if (all_listeners) smartlist_remove(all_listeners, chan_l); /* Mark it as unregistered */ @@ -562,7 +536,7 @@ channel_listener_unregister(channel_listener_t *chan_l) * already exist. */ -STATIC void +static void channel_add_to_digest_map(channel_t *chan) { channel_idmap_entry_t *ent, search; @@ -570,7 +544,9 @@ channel_add_to_digest_map(channel_t *chan) tor_assert(chan); /* Assert that the state makes sense */ - tor_assert(!CHANNEL_CONDEMNED(chan)); + tor_assert(!(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR)); /* Assert that there is a digest */ tor_assert(!tor_digest_is_zero(chan->identity_digest)); @@ -610,6 +586,33 @@ channel_remove_from_digest_map(channel_t *chan) /* Assert that there is a digest */ tor_assert(!tor_digest_is_zero(chan->identity_digest)); +#if 0 + /* Make sure we have a map */ + if (!channel_identity_map) { + /* + * No identity map, so we can't find it by definition. This + * case is similar to digestmap_get() failing below. + */ + log_warn(LD_BUG, + "Trying to remove channel %p (global ID " U64_FORMAT ") " + "with digest %s from identity map, but didn't have any identity " + "map", + chan, U64_PRINTF_ARG(chan->global_identifier), + hex_str(chan->identity_digest, DIGEST_LEN)); + /* Clear out its next/prev pointers */ + if (chan->next_with_same_id) { + chan->next_with_same_id->prev_with_same_id = chan->prev_with_same_id; + } + if (chan->prev_with_same_id) { + chan->prev_with_same_id->next_with_same_id = chan->next_with_same_id; + } + chan->next_with_same_id = NULL; + chan->prev_with_same_id = NULL; + + return; + } +#endif + /* Pull it out of its list, wherever that list is */ TOR_LIST_REMOVE(chan, next_with_same_id); @@ -657,74 +660,41 @@ channel_remove_from_digest_map(channel_t *chan) channel_t * channel_find_by_global_id(uint64_t global_identifier) { - channel_t lookup; channel_t *rv = NULL; - lookup.global_identifier = global_identifier; - rv = HT_FIND(channel_gid_map, &channel_gid_map, &lookup); - if (rv) { - tor_assert(rv->global_identifier == global_identifier); + if (all_channels && smartlist_len(all_channels) > 0) { + SMARTLIST_FOREACH_BEGIN(all_channels, channel_t *, curr) { + if (curr->global_identifier == global_identifier) { + rv = curr; + break; + } + } SMARTLIST_FOREACH_END(curr); } return rv; } -/** Return true iff chan matches rsa_id_digest and ed_id. - * as its identity keys. If either is NULL, do not check for a match. */ -static int -channel_remote_identity_matches(const channel_t *chan, - const char *rsa_id_digest, - const ed25519_public_key_t *ed_id) -{ - if (BUG(!chan)) - return 0; - if (rsa_id_digest) { - if (tor_memneq(rsa_id_digest, chan->identity_digest, DIGEST_LEN)) - return 0; - } - if (ed_id) { - if (tor_memneq(ed_id->pubkey, chan->ed25519_identity.pubkey, - ED25519_PUBKEY_LEN)) - return 0; - } - return 1; -} - /** - * Find channel by RSA/Ed25519 identity of of the remote endpoint + * Find channel by digest of the remote endpoint * - * This function looks up a channel by the digest of its remote endpoint's RSA - * identity key. If ed_id is provided and nonzero, only a channel - * matching the ed_id will be returned. - * - * It's possible that more than one channel to a given endpoint exists. Use - * channel_next_with_rsa_identity() to walk the list of channels; make sure - * to test for Ed25519 identity match too (as appropriate) + * This function looks up a channel by the digest of its remote endpoint in + * the channel digest map. It's possible that more than one channel to a + * given endpoint exists. Use channel_next_with_digest() to walk the list. */ + channel_t * -channel_find_by_remote_identity(const char *rsa_id_digest, - const ed25519_public_key_t *ed_id) +channel_find_by_remote_digest(const char *identity_digest) { channel_t *rv = NULL; channel_idmap_entry_t *ent, search; - tor_assert(rsa_id_digest); /* For now, we require that every channel have - * an RSA identity, and that every lookup - * contain an RSA identity */ - if (ed_id && ed25519_public_key_is_zero(ed_id)) { - /* Treat zero as meaning "We don't care about the presence or absence of - * an Ed key", not "There must be no Ed key". */ - ed_id = NULL; - } + tor_assert(identity_digest); - memcpy(search.digest, rsa_id_digest, DIGEST_LEN); + memcpy(search.digest, identity_digest, DIGEST_LEN); ent = HT_FIND(channel_idmap, &channel_identity_map, &search); if (ent) { rv = TOR_LIST_FIRST(&ent->channel_list); } - while (rv && ! channel_remote_identity_matches(rv, rsa_id_digest, ed_id)) { - rv = channel_next_with_rsa_identity(rv); - } return rv; } @@ -737,90 +707,13 @@ channel_find_by_remote_identity(const char *rsa_id_digest, */ channel_t * -channel_next_with_rsa_identity(channel_t *chan) +channel_next_with_digest(channel_t *chan) { tor_assert(chan); return TOR_LIST_NEXT(chan, next_with_same_id); } -/** - * Relays run this once an hour to look over our list of channels to other - * relays. It prints out some statistics if there are multiple connections - * to many relays. - * - * This function is similar to connection_or_set_bad_connections(), - * and probably could be adapted to replace it, if it was modified to actually - * take action on any of these connections. - */ -void -channel_check_for_duplicates(void) -{ - channel_idmap_entry_t **iter; - channel_t *chan; - int total_relay_connections = 0, total_relays = 0, total_canonical = 0; - int total_half_canonical = 0; - int total_gt_one_connection = 0, total_gt_two_connections = 0; - int total_gt_four_connections = 0; - - HT_FOREACH(iter, channel_idmap, &channel_identity_map) { - int connections_to_relay = 0; - - /* Only consider relay connections */ - if (!connection_or_digest_is_known_relay((char*)(*iter)->digest)) - continue; - - total_relays++; - - for (chan = TOR_LIST_FIRST(&(*iter)->channel_list); chan; - chan = channel_next_with_rsa_identity(chan)) { - - if (CHANNEL_CONDEMNED(chan) || !CHANNEL_IS_OPEN(chan)) - continue; - - connections_to_relay++; - total_relay_connections++; - - if (chan->is_canonical(chan, 0)) total_canonical++; - - if (!chan->is_canonical_to_peer && chan->is_canonical(chan, 0) - && chan->is_canonical(chan, 1)) { - total_half_canonical++; - } - } - - if (connections_to_relay > 1) total_gt_one_connection++; - if (connections_to_relay > 2) total_gt_two_connections++; - if (connections_to_relay > 4) total_gt_four_connections++; - } - -#define MIN_RELAY_CONNECTIONS_TO_WARN 5 - - /* If we average 1.5 or more connections per relay, something is wrong */ - if (total_relays > MIN_RELAY_CONNECTIONS_TO_WARN && - total_relay_connections >= 1.5*total_relays) { - log_notice(LD_OR, - "Your relay has a very large number of connections to other relays. " - "Is your outbound address the same as your relay address? " - "Found %d connections to %d relays. Found %d current canonical " - "connections, in %d of which we were a non-canonical peer. " - "%d relays had more than 1 connection, %d had more than 2, and " - "%d had more than 4 connections.", - total_relay_connections, total_relays, total_canonical, - total_half_canonical, total_gt_one_connection, - total_gt_two_connections, total_gt_four_connections); - } else { - log_info(LD_OR, "Performed connection pruning. " - "Found %d connections to %d relays. Found %d current canonical " - "connections, in %d of which we were a non-canonical peer. " - "%d relays had more than 1 connection, %d had more than 2, and " - "%d had more than 4 connections.", - total_relay_connections, total_relays, total_canonical, - total_half_canonical, total_gt_one_connection, - total_gt_two_connections, total_gt_four_connections); - } -} - /** * Initialize a channel * @@ -835,13 +728,17 @@ channel_init(channel_t *chan) tor_assert(chan); /* Assign an ID and bump the counter */ - chan->global_identifier = ++n_channels_allocated; + chan->global_identifier = n_channels_allocated++; /* Init timestamp */ - chan->timestamp_last_had_circuits = time(NULL); + chan->timestamp_last_added_nonpadding = time(NULL); - /* Warn about exhausted circuit IDs no more than hourly. */ - chan->last_warned_circ_ids_exhausted.rate = 3600; + /* Init next_circ_id */ + chan->next_circ_id = crypto_rand_int(1 << 15); + + /* Initialize queues. */ + TOR_SIMPLEQ_INIT(&chan->incoming_queue); + TOR_SIMPLEQ_INIT(&chan->outgoing_queue); /* Initialize list entries. */ memset(&chan->next_with_same_id, 0, sizeof(chan->next_with_same_id)); @@ -851,9 +748,6 @@ channel_init(channel_t *chan) /* It hasn't been open yet. */ chan->has_been_open = 0; - - /* Scheduler state is idle */ - chan->scheduler_state = SCHED_CHAN_IDLE; } /** @@ -870,7 +764,7 @@ channel_init_listener(channel_listener_t *chan_l) tor_assert(chan_l); /* Assign an ID and bump the counter */ - chan_l->global_identifier = ++n_channels_allocated; + chan_l->global_identifier = n_channels_allocated++; /* Timestamp it */ channel_listener_timestamp_created(chan_l); @@ -882,13 +776,13 @@ channel_init_listener(channel_listener_t *chan_l) */ void -channel_free_(channel_t *chan) +channel_free(channel_t *chan) { if (!chan) return; /* It must be closed or errored */ - tor_assert(CHANNEL_FINISHED(chan)); - + tor_assert(chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); /* It must be deregistered */ tor_assert(!(chan->registered)); @@ -896,9 +790,6 @@ channel_free_(channel_t *chan) "Freeing channel " U64_FORMAT " at %p", U64_PRINTF_ARG(chan->global_identifier), chan); - /* Get this one out of the scheduler */ - scheduler_release_channel(chan); - /* * Get rid of cmux policy before we do anything, so cmux policies don't * see channels in weird half-freed states. @@ -907,24 +798,21 @@ channel_free_(channel_t *chan) circuitmux_set_policy(chan->cmux, NULL); } - /* Remove all timers and associated handle entries now */ - timer_free(chan->padding_timer); - channel_handle_free(chan->timer_handle); - channel_handles_clear(chan); - /* Call a free method if there is one */ - if (chan->free_fn) chan->free_fn(chan); + if (chan->free) chan->free(chan); channel_clear_remote_end(chan); /* Get rid of cmux */ if (chan->cmux) { - circuitmux_detach_all_circuits(chan->cmux, NULL); + circuitmux_detach_all_circuits(chan->cmux); circuitmux_mark_destroyed_circids_usable(chan->cmux, chan); circuitmux_free(chan->cmux); chan->cmux = NULL; } + /* We're in CLOSED or ERROR, so the cell queue is already empty */ + tor_free(chan); } @@ -935,7 +823,7 @@ channel_free_(channel_t *chan) */ void -channel_listener_free_(channel_listener_t *chan_l) +channel_listener_free(channel_listener_t *chan_l) { if (!chan_l) return; @@ -951,7 +839,12 @@ channel_listener_free_(channel_listener_t *chan_l) tor_assert(!(chan_l->registered)); /* Call a free method if there is one */ - if (chan_l->free_fn) chan_l->free_fn(chan_l); + if (chan_l->free) chan_l->free(chan_l); + + /* + * We're in CLOSED or ERROR, so the incoming channel queue is already + * empty. + */ tor_free(chan_l); } @@ -963,17 +856,15 @@ channel_listener_free_(channel_listener_t *chan_l) */ static void -channel_force_xfree(channel_t *chan) +channel_force_free(channel_t *chan) { + cell_queue_entry_t *cell, *cell_tmp; tor_assert(chan); log_debug(LD_CHANNEL, "Force-freeing channel " U64_FORMAT " at %p", U64_PRINTF_ARG(chan->global_identifier), chan); - /* Get this one out of the scheduler */ - scheduler_release_channel(chan); - /* * Get rid of cmux policy before we do anything, so cmux policies don't * see channels in weird half-freed states. @@ -982,13 +873,8 @@ channel_force_xfree(channel_t *chan) circuitmux_set_policy(chan->cmux, NULL); } - /* Remove all timers and associated handle entries now */ - timer_free(chan->padding_timer); - channel_handle_free(chan->timer_handle); - channel_handles_clear(chan); - /* Call a free method if there is one */ - if (chan->free_fn) chan->free_fn(chan); + if (chan->free) chan->free(chan); channel_clear_remote_end(chan); @@ -998,6 +884,18 @@ channel_force_xfree(channel_t *chan) chan->cmux = NULL; } + /* We might still have a cell queue; kill it */ + TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->incoming_queue, next, cell_tmp) { + cell_queue_entry_free(cell, 0); + } + TOR_SIMPLEQ_INIT(&chan->incoming_queue); + + /* Outgoing cell queue is similar, but we can have to free packed cells */ + TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->outgoing_queue, next, cell_tmp) { + cell_queue_entry_free(cell, 0); + } + TOR_SIMPLEQ_INIT(&chan->outgoing_queue); + tor_free(chan); } @@ -1008,7 +906,7 @@ channel_force_xfree(channel_t *chan) */ static void -channel_listener_force_xfree(channel_listener_t *chan_l) +channel_listener_force_free(channel_listener_t *chan_l) { tor_assert(chan_l); @@ -1018,7 +916,7 @@ channel_listener_force_xfree(channel_listener_t *chan_l) chan_l); /* Call a free method if there is one */ - if (chan_l->free_fn) chan_l->free_fn(chan_l); + if (chan_l->free) chan_l->free(chan_l); /* * The incoming list just gets emptied and freed; we request close on @@ -1038,6 +936,24 @@ channel_listener_force_xfree(channel_listener_t *chan_l) tor_free(chan_l); } +/** + * Return the current registered listener for a channel listener + * + * This function returns a function pointer to the current registered + * handler for new incoming channels on a channel listener. + */ + +channel_listener_fn_ptr +channel_listener_get_listener_fn(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + + if (chan_l->state == CHANNEL_LISTENER_STATE_LISTENING) + return chan_l->listener; + + return NULL; +} + /** * Set the listener for a channel listener * @@ -1074,7 +990,9 @@ channel_get_cell_handler(channel_t *chan) { tor_assert(chan); - if (CHANNEL_CAN_HANDLE_CELLS(chan)) + if (chan->state == CHANNEL_STATE_OPENING || + chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT) return chan->cell_handler; return NULL; @@ -1092,7 +1010,9 @@ channel_get_var_cell_handler(channel_t *chan) { tor_assert(chan); - if (CHANNEL_CAN_HANDLE_CELLS(chan)) + if (chan->state == CHANNEL_STATE_OPENING || + chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT) return chan->var_cell_handler; return NULL; @@ -1102,7 +1022,8 @@ channel_get_var_cell_handler(channel_t *chan) * Set both cell handlers for a channel * * This function sets both the fixed-length and variable length cell handlers - * for a channel. + * for a channel and processes any incoming cells that had been blocked in the + * queue because none were available. */ void @@ -1111,8 +1032,12 @@ channel_set_cell_handlers(channel_t *chan, channel_var_cell_handler_fn_ptr var_cell_handler) { + int try_again = 0; + tor_assert(chan); - tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan)); + tor_assert(chan->state == CHANNEL_STATE_OPENING || + chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT); log_debug(LD_CHANNEL, "Setting cell_handler callback for channel %p to %p", @@ -1121,9 +1046,21 @@ channel_set_cell_handlers(channel_t *chan, "Setting var_cell_handler callback for channel %p to %p", chan, var_cell_handler); + /* Should we try the queue? */ + if (cell_handler && + cell_handler != chan->cell_handler) try_again = 1; + if (var_cell_handler && + var_cell_handler != chan->var_cell_handler) try_again = 1; + /* Change them */ chan->cell_handler = cell_handler; chan->var_cell_handler = var_cell_handler; + + /* Re-run the queue if we have one and there's any reason to */ + if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue) && + try_again && + (chan->cell_handler || + chan->var_cell_handler)) channel_process_cells(chan); } /* @@ -1154,8 +1091,9 @@ channel_mark_for_close(channel_t *chan) tor_assert(chan->close != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (CHANNEL_CONDEMNED(chan)) - return; + if (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) return; log_debug(LD_CHANNEL, "Closing channel %p (global ID " U64_FORMAT ") " @@ -1234,8 +1172,9 @@ channel_close_from_lower_layer(channel_t *chan) tor_assert(chan != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (CHANNEL_CONDEMNED(chan)) - return; + if (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) return; log_debug(LD_CHANNEL, "Closing channel %p (global ID " U64_FORMAT ") " @@ -1249,6 +1188,36 @@ channel_close_from_lower_layer(channel_t *chan) channel_change_state(chan, CHANNEL_STATE_CLOSING); } +/** + * Close a channel listener from the lower layer + * + * Notify the channel code that the channel listener is being closed due to a + * non-error condition in the lower layer. This does not call the close() + * method, since the lower layer already knows. + */ + +void +channel_listener_close_from_lower_layer(channel_listener_t *chan_l) +{ + tor_assert(chan_l != NULL); + + /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ + if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || + chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || + chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; + + log_debug(LD_CHANNEL, + "Closing channel listener %p (global ID " U64_FORMAT ") " + "due to lower-layer event", + chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); + + /* Note closing by event from below */ + chan_l->reason_for_closing = CHANNEL_LISTENER_CLOSE_FROM_BELOW; + + /* Change state to CLOSING */ + channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); +} + /** * Notify that the channel is being closed due to an error condition * @@ -1263,8 +1232,9 @@ channel_close_for_error(channel_t *chan) tor_assert(chan != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (CHANNEL_CONDEMNED(chan)) - return; + if (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) return; log_debug(LD_CHANNEL, "Closing channel %p due to lower-layer error", @@ -1277,6 +1247,37 @@ channel_close_for_error(channel_t *chan) channel_change_state(chan, CHANNEL_STATE_CLOSING); } +/** + * Notify that the channel listener is being closed due to an error condition + * + * This function is called by the lower layer implementing the transport + * when a channel listener must be closed due to an error condition. This + * does not call the channel listener's close method, since the lower layer + * already knows. + */ + +void +channel_listener_close_for_error(channel_listener_t *chan_l) +{ + tor_assert(chan_l != NULL); + + /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ + if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || + chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || + chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; + + log_debug(LD_CHANNEL, + "Closing channel listener %p (global ID " U64_FORMAT ") " + "due to lower-layer error", + chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); + + /* Note closing by event from below */ + chan_l->reason_for_closing = CHANNEL_LISTENER_CLOSE_FOR_ERROR; + + /* Change state to CLOSING */ + channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); +} + /** * Notify that the lower layer is finished closing the channel * @@ -1289,16 +1290,18 @@ void channel_closed(channel_t *chan) { tor_assert(chan); - tor_assert(CHANNEL_CONDEMNED(chan)); + tor_assert(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); /* No-op if already inactive */ - if (CHANNEL_FINISHED(chan)) - return; + if (chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) return; /* Inform any pending (not attached) circs that they should * give up. */ if (! chan->has_been_open) - circuit_n_chan_done(chan, 0, 0); + circuit_n_chan_done(chan, 0); /* Now close all the attached circuits on it. */ circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED); @@ -1310,6 +1313,33 @@ channel_closed(channel_t *chan) } } +/** + * Notify that the lower layer is finished closing the channel listener + * + * This function should be called by the lower layer when a channel listener + * is finished closing and it should be regarded as inactive and + * freed by the channel code. + */ + +void +channel_listener_closed(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + tor_assert(chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || + chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || + chan_l->state == CHANNEL_LISTENER_STATE_ERROR); + + /* No-op if already inactive */ + if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || + chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; + + if (chan_l->reason_for_closing != CHANNEL_LISTENER_CLOSE_FOR_ERROR) { + channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSED); + } else { + channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_ERROR); + } +} + /** * Clear the identity_digest of a channel * @@ -1329,7 +1359,10 @@ channel_clear_identity_digest(channel_t *chan) "global ID " U64_FORMAT, chan, U64_PRINTF_ARG(chan->global_identifier)); - state_not_in_map = CHANNEL_CONDEMNED(chan); + state_not_in_map = + (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); if (!state_not_in_map && chan->registered && !tor_digest_is_zero(chan->identity_digest)) @@ -1346,10 +1379,10 @@ channel_clear_identity_digest(channel_t *chan) * This function sets the identity digest of the remote endpoint for a * channel; this is intended for use by the lower layer. */ + void channel_set_identity_digest(channel_t *chan, - const char *identity_digest, - const ed25519_public_key_t *ed_identity) + const char *identity_digest) { int was_in_digest_map, should_be_in_digest_map, state_not_in_map; @@ -1362,8 +1395,10 @@ channel_set_identity_digest(channel_t *chan, identity_digest ? hex_str(identity_digest, DIGEST_LEN) : "(null)"); - state_not_in_map = CHANNEL_CONDEMNED(chan); - + state_not_in_map = + (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); was_in_digest_map = !state_not_in_map && chan->registered && @@ -1388,11 +1423,6 @@ channel_set_identity_digest(channel_t *chan, memset(chan->identity_digest, 0, sizeof(chan->identity_digest)); } - if (ed_identity) { - memcpy(&chan->ed25519_identity, ed_identity, sizeof(*ed_identity)); - } else { - memset(&chan->ed25519_identity, 0, sizeof(*ed_identity)); - } /* Put it in the digest map if we should */ if (should_be_in_digest_map) @@ -1400,7 +1430,7 @@ channel_set_identity_digest(channel_t *chan, } /** - * Clear the remote end metadata (identity_digest) of a channel + * Clear the remote end metadata (identity_digest/nickname) of a channel * * This function clears all the remote end info from a channel; this is * intended for use by the lower layer. @@ -1418,7 +1448,10 @@ channel_clear_remote_end(channel_t *chan) "global ID " U64_FORMAT, chan, U64_PRINTF_ARG(chan->global_identifier)); - state_not_in_map = CHANNEL_CONDEMNED(chan); + state_not_in_map = + (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); if (!state_not_in_map && chan->registered && !tor_digest_is_zero(chan->identity_digest)) @@ -1427,57 +1460,326 @@ channel_clear_remote_end(channel_t *chan) memset(chan->identity_digest, 0, sizeof(chan->identity_digest)); + tor_free(chan->nickname); } /** - * Write to a channel the given packed cell. - * + * Set the remote end metadata (identity_digest/nickname) of a channel * - * Two possible errors can happen. Either the channel is not opened or the - * lower layer (specialized channel) failed to write it. In both cases, it is - * the caller responsability to free the cell. + * This function sets new remote end info on a channel; this is intended + * for use by the lower layer. */ -static int -write_packed_cell(channel_t *chan, packed_cell_t *cell) + +void +channel_set_remote_end(channel_t *chan, + const char *identity_digest, + const char *nickname) { - int ret = -1; - size_t cell_bytes; + int was_in_digest_map, should_be_in_digest_map, state_not_in_map; tor_assert(chan); + + log_debug(LD_CHANNEL, + "Setting remote endpoint identity on channel %p with " + "global ID " U64_FORMAT " to nickname %s, digest %s", + chan, U64_PRINTF_ARG(chan->global_identifier), + nickname ? nickname : "(null)", + identity_digest ? + hex_str(identity_digest, DIGEST_LEN) : "(null)"); + + state_not_in_map = + (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR); + was_in_digest_map = + !state_not_in_map && + chan->registered && + !tor_digest_is_zero(chan->identity_digest); + should_be_in_digest_map = + !state_not_in_map && + chan->registered && + (identity_digest && + !tor_digest_is_zero(identity_digest)); + + if (was_in_digest_map) + /* We should always remove it; we'll add it back if we're writing + * in a new digest. + */ + channel_remove_from_digest_map(chan); + + if (identity_digest) { + memcpy(chan->identity_digest, + identity_digest, + sizeof(chan->identity_digest)); + + } else { + memset(chan->identity_digest, 0, + sizeof(chan->identity_digest)); + } + + tor_free(chan->nickname); + if (nickname) + chan->nickname = tor_strdup(nickname); + + /* Put it in the digest map if we should */ + if (should_be_in_digest_map) + channel_add_to_digest_map(chan); +} + +/** + * Duplicate a cell queue entry; this is a shallow copy intended for use + * in channel_write_cell_queue_entry(). + */ + +static cell_queue_entry_t * +cell_queue_entry_dup(cell_queue_entry_t *q) +{ + cell_queue_entry_t *rv = NULL; + + tor_assert(q); + + rv = tor_malloc(sizeof(*rv)); + memcpy(rv, q, sizeof(*rv)); + + return rv; +} + +/** + * Free a cell_queue_entry_t; the handed_off parameter indicates whether + * the contents were passed to the lower layer (it is responsible for + * them) or not (we should free). + */ + +static void +cell_queue_entry_free(cell_queue_entry_t *q, int handed_off) +{ + if (!q) return; + + if (!handed_off) { + /* + * If we handed it off, the recipient becomes responsible (or + * with packed cells the channel_t subclass calls packed_cell + * free after writing out its contents; see, e.g., + * channel_tls_write_packed_cell_method(). Otherwise, we have + * to take care of it here if possible. + */ + switch (q->type) { + case CELL_QUEUE_FIXED: + if (q->u.fixed.cell) { + /* + * There doesn't seem to be a cell_free() function anywhere in the + * pre-channel code; just use tor_free() + */ + tor_free(q->u.fixed.cell); + } + break; + case CELL_QUEUE_PACKED: + if (q->u.packed.packed_cell) { + packed_cell_free(q->u.packed.packed_cell); + } + break; + case CELL_QUEUE_VAR: + if (q->u.var.var_cell) { + /* + * This one's in connection_or.c; it'd be nice to figure out the + * whole flow of cells from one end to the other and factor the + * cell memory management functions like this out of the specific + * TLS lower layer. + */ + var_cell_free(q->u.var.var_cell); + } + break; + default: + /* + * Nothing we can do if we don't know the type; this will + * have been warned about elsewhere. + */ + break; + } + } + tor_free(q); +} + +/** + * Check whether a cell queue entry is padding; this is a helper function + * for channel_write_cell_queue_entry() + */ + +static int +cell_queue_entry_is_padding(cell_queue_entry_t *q) +{ + tor_assert(q); + + if (q->type == CELL_QUEUE_FIXED) { + if (q->u.fixed.cell) { + if (q->u.fixed.cell->command == CELL_PADDING || + q->u.fixed.cell->command == CELL_VPADDING) { + return 1; + } + } + } else if (q->type == CELL_QUEUE_VAR) { + if (q->u.var.var_cell) { + if (q->u.var.var_cell->command == CELL_PADDING || + q->u.var.var_cell->command == CELL_VPADDING) { + return 1; + } + } + } + + return 0; +} + +/** + * Allocate a new cell queue entry for a fixed-size cell + */ + +static cell_queue_entry_t * +cell_queue_entry_new_fixed(cell_t *cell) +{ + cell_queue_entry_t *q = NULL; + tor_assert(cell); + q = tor_malloc(sizeof(*q)); + q->type = CELL_QUEUE_FIXED; + q->u.fixed.cell = cell; + + return q; +} + +/** + * Allocate a new cell queue entry for a variable-size cell + */ + +static cell_queue_entry_t * +cell_queue_entry_new_var(var_cell_t *var_cell) +{ + cell_queue_entry_t *q = NULL; + + tor_assert(var_cell); + + q = tor_malloc(sizeof(*q)); + q->type = CELL_QUEUE_VAR; + q->u.var.var_cell = var_cell; + + return q; +} + +/** + * Write to a channel based on a cell_queue_entry_t + * + * Given a cell_queue_entry_t filled out by the caller, try to send the cell + * and queue it if we can't. + */ + +static void +channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) +{ + int result = 0, sent = 0; + cell_queue_entry_t *tmp = NULL; + + tor_assert(chan); + tor_assert(q); + /* Assert that the state makes sense for a cell write */ - tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan)); + tor_assert(chan->state == CHANNEL_STATE_OPENING || + chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT); + + /* Increment the timestamp unless it's padding */ + if (!cell_queue_entry_is_padding(q)) { + chan->timestamp_last_added_nonpadding = approx_time(); + } { circid_t circ_id; - if (packed_cell_is_destroy(chan, cell, &circ_id)) { + if (is_destroy_cell(chan, q, &circ_id)) { channel_note_destroy_not_pending(chan, circ_id); } } - /* For statistical purposes, figure out how big this cell is */ - cell_bytes = get_cell_network_size(chan->wide_circ_ids); - /* Can we send it right out? If so, try */ - if (!CHANNEL_IS_OPEN(chan)) { - goto done; + if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) && + chan->state == CHANNEL_STATE_OPEN) { + /* Pick the right write function for this cell type and save the result */ + switch (q->type) { + case CELL_QUEUE_FIXED: + tor_assert(chan->write_cell); + tor_assert(q->u.fixed.cell); + result = chan->write_cell(chan, q->u.fixed.cell); + break; + case CELL_QUEUE_PACKED: + tor_assert(chan->write_packed_cell); + tor_assert(q->u.packed.packed_cell); + result = chan->write_packed_cell(chan, q->u.packed.packed_cell); + break; + case CELL_QUEUE_VAR: + tor_assert(chan->write_var_cell); + tor_assert(q->u.var.var_cell); + result = chan->write_var_cell(chan, q->u.var.var_cell); + break; + default: + tor_assert(1); + } + + /* Check if we got it out */ + if (result > 0) { + sent = 1; + /* Timestamp for transmission */ + channel_timestamp_xmit(chan); + /* If we're here the queue is empty, so it's drained too */ + channel_timestamp_drained(chan); + /* Update the counter */ + ++(chan->n_cells_xmitted); + } } - /* Write the cell on the connection's outbuf. */ - if (chan->write_packed_cell(chan, cell) < 0) { - goto done; + if (!sent) { + /* Not sent, queue it */ + /* + * We have to copy the queue entry passed in, since the caller probably + * used the stack. + */ + tmp = cell_queue_entry_dup(q); + TOR_SIMPLEQ_INSERT_TAIL(&chan->outgoing_queue, tmp, next); + /* Try to process the queue? */ + if (chan->state == CHANNEL_STATE_OPEN) channel_flush_cells(chan); } - /* Timestamp for transmission */ - channel_timestamp_xmit(chan); - /* Update the counter */ - ++(chan->n_cells_xmitted); - chan->n_bytes_xmitted += cell_bytes; - /* Successfully sent the cell. */ - ret = 0; +} - done: - return ret; +/** + * Write a cell to a channel + * + * Write a fixed-length cell to a channel using the write_cell() method. + * This is equivalent to the pre-channels connection_or_write_cell_to_buf(); + * it is called by the transport-independent code to deliver a cell to a + * channel for transmission. + */ + +void +channel_write_cell(channel_t *chan, cell_t *cell) +{ + cell_queue_entry_t q; + + tor_assert(chan); + tor_assert(cell); + + if (chan->state == CHANNEL_STATE_CLOSING) { + log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with " + "global ID "U64_FORMAT, cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + tor_free(cell); + return; + } + + log_debug(LD_CHANNEL, + "Writing cell_t %p to channel %p with global ID " + U64_FORMAT, + cell, chan, U64_PRINTF_ARG(chan->global_identifier)); + + q.type = CELL_QUEUE_FIXED; + q.u.fixed.cell = cell; + channel_write_cell_queue_entry(chan, &q); } /** @@ -1486,36 +1788,69 @@ write_packed_cell(channel_t *chan, packed_cell_t *cell) * Write a packed cell to a channel using the write_cell() method. This is * called by the transport-independent code to deliver a packed cell to a * channel for transmission. - * - * Return 0 on success else a negative value. In both cases, the caller should - * not access the cell anymore, it is freed both on success and error. */ -int -channel_write_packed_cell(channel_t *chan, packed_cell_t *cell) + +void +channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell) { - int ret = -1; + cell_queue_entry_t q; tor_assert(chan); - tor_assert(cell); + tor_assert(packed_cell); - if (CHANNEL_IS_CLOSING(chan)) { - log_debug(LD_CHANNEL, "Discarding %p on closing channel %p with " - "global ID "U64_FORMAT, cell, chan, + if (chan->state == CHANNEL_STATE_CLOSING) { + log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p " + "with global ID "U64_FORMAT, packed_cell, chan, U64_PRINTF_ARG(chan->global_identifier)); - goto end; + packed_cell_free(packed_cell); + return; } + log_debug(LD_CHANNEL, - "Writing %p to channel %p with global ID " - U64_FORMAT, cell, chan, U64_PRINTF_ARG(chan->global_identifier)); + "Writing packed_cell_t %p to channel %p with global ID " + U64_FORMAT, + packed_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + + q.type = CELL_QUEUE_PACKED; + q.u.packed.packed_cell = packed_cell; + channel_write_cell_queue_entry(chan, &q); +} + +/** + * Write a variable-length cell to a channel + * + * Write a variable-length cell to a channel using the write_cell() method. + * This is equivalent to the pre-channels + * connection_or_write_var_cell_to_buf(); it's called by the transport- + * independent code to deliver a var_cell to a channel for transmission. + */ + +void +channel_write_var_cell(channel_t *chan, var_cell_t *var_cell) +{ + cell_queue_entry_t q; - ret = write_packed_cell(chan, cell); + tor_assert(chan); + tor_assert(var_cell); + + if (chan->state == CHANNEL_STATE_CLOSING) { + log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p " + "with global ID "U64_FORMAT, var_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + var_cell_free(var_cell); + return; + } + + log_debug(LD_CHANNEL, + "Writing var_cell_t %p to channel %p with global ID " + U64_FORMAT, + var_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); - end: - /* Whatever happens, we free the cell. Either an error occured or the cell - * was put on the connection outbuf, both cases we have ownership of the - * cell and we free it. */ - packed_cell_free(cell); - return ret; + q.type = CELL_QUEUE_VAR; + q.u.var.var_cell = var_cell; + channel_write_cell_queue_entry(chan, &q); } /** @@ -1526,8 +1861,8 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *cell) * are appropriate to the state transition in question. */ -static void -channel_change_state_(channel_t *chan, channel_state_t to_state) +void +channel_change_state(channel_t *chan, channel_state_t to_state) { channel_state_t from_state; unsigned char was_active, is_active; @@ -1557,6 +1892,15 @@ channel_change_state_(channel_t *chan, channel_state_t to_state) tor_assert(chan->reason_for_closing != CHANNEL_NOT_CLOSING); } + /* + * We need to maintain the queues here for some transitions: + * when we enter CHANNEL_STATE_OPEN (especially from CHANNEL_STATE_MAINT) + * we may have a backlog of cells to transmit, so drain the queues in + * that case, and when going to CHANNEL_STATE_CLOSED the subclass + * should have made sure to finish sending things (or gone to + * CHANNEL_STATE_ERROR if not possible), so we assert for that here. + */ + log_debug(LD_CHANNEL, "Changing state of channel %p (global ID " U64_FORMAT ") from \"%s\" to \"%s\"", @@ -1602,40 +1946,22 @@ channel_change_state_(channel_t *chan, channel_state_t to_state) } } - /* - * If we're going to a closed/closing state, we don't need scheduling any - * more; in CHANNEL_STATE_MAINT we can't accept writes. - */ - if (to_state == CHANNEL_STATE_CLOSING || - to_state == CHANNEL_STATE_CLOSED || - to_state == CHANNEL_STATE_ERROR) { - scheduler_release_channel(chan); - } else if (to_state == CHANNEL_STATE_MAINT) { - scheduler_channel_doesnt_want_writes(chan); - } -} - -/** - * As channel_change_state_, but change the state to any state but open. - */ -void -channel_change_state(channel_t *chan, channel_state_t to_state) -{ - tor_assert(to_state != CHANNEL_STATE_OPEN); - channel_change_state_(chan, to_state); -} - -/** - * As channel_change_state, but change the state to open. - */ -void -channel_change_state_open(channel_t *chan) -{ - channel_change_state_(chan, CHANNEL_STATE_OPEN); - /* Tell circuits if we opened and stuff */ - channel_do_open_actions(chan); - chan->has_been_open = 1; + if (to_state == CHANNEL_STATE_OPEN) { + channel_do_open_actions(chan); + chan->has_been_open = 1; + + /* Check for queued cells to process */ + if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) + channel_process_cells(chan); + if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) + channel_flush_cells(chan); + } else if (to_state == CHANNEL_STATE_CLOSED || + to_state == CHANNEL_STATE_ERROR) { + /* Assert that all queues are empty */ + tor_assert(TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)); + tor_assert(TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)); + } } /** @@ -1677,6 +2003,15 @@ channel_listener_change_state(channel_listener_t *chan_l, tor_assert(chan_l->reason_for_closing != CHANNEL_LISTENER_NOT_CLOSING); } + /* + * We need to maintain the queues here for some transitions: + * when we enter CHANNEL_STATE_OPEN (especially from CHANNEL_STATE_MAINT) + * we may have a backlog of cells to transmit, so drain the queues in + * that case, and when going to CHANNEL_STATE_CLOSED the subclass + * should have made sure to finish sending things (or gone to + * CHANNEL_STATE_ERROR if not possible), so we assert for that here. + */ + log_debug(LD_CHANNEL, "Changing state of channel listener %p (global ID " U64_FORMAT "from \"%s\" to \"%s\"", @@ -1709,38 +2044,29 @@ channel_listener_change_state(channel_listener_t *chan_l, if (to_state == CHANNEL_LISTENER_STATE_CLOSED || to_state == CHANNEL_LISTENER_STATE_ERROR) { + /* Assert that the queue is empty */ tor_assert(!(chan_l->incoming_list) || smartlist_len(chan_l->incoming_list) == 0); } } -/* Maximum number of cells that is allowed to flush at once withing - * channel_flush_some_cells(). */ +/** + * Try to flush cells to the lower layer + * + * this is called by the lower layer to indicate that it wants more cells; + * it will try to write up to num_cells cells from the channel's cell queue or + * from circuits active on that channel, or as many as it has available if + * num_cells == -1. + */ + #define MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED 256 -/* Try to flush cells of the given channel chan up to a maximum of num_cells. - * - * This is called by the scheduler when it wants to flush cells from the - * channel's circuit queue(s) to the connection outbuf (not yet on the wire). - * - * If the channel is not in state CHANNEL_STATE_OPEN, this does nothing and - * will return 0 meaning no cells were flushed. - * - * If num_cells is -1, we'll try to flush up to the maximum cells allowed - * defined in MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED. - * - * On success, the number of flushed cells are returned and it can never be - * above num_cells. If 0 is returned, no cells were flushed either because the - * channel was not opened or we had no cells on the channel. A negative number - * can NOT be sent back. - * - * This function is part of the fast path. */ -MOCK_IMPL(ssize_t, -channel_flush_some_cells, (channel_t *chan, ssize_t num_cells)) +ssize_t +channel_flush_some_cells(channel_t *chan, ssize_t num_cells) { unsigned int unlimited = 0; ssize_t flushed = 0; - int clamped_num_cells; + int num_cells_from_circs, clamped_num_cells; tor_assert(chan); @@ -1748,7 +2074,12 @@ channel_flush_some_cells, (channel_t *chan, ssize_t num_cells)) if (!unlimited && num_cells <= flushed) goto done; /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ - if (CHANNEL_IS_OPEN(chan)) { + if (chan->state == CHANNEL_STATE_OPEN) { + /* Try to flush as much as we can that's already queued */ + flushed += channel_flush_some_cells_from_outgoing_queue(chan, + (unlimited ? -1 : num_cells - flushed)); + if (!unlimited && num_cells <= flushed) goto done; + if (circuitmux_num_cells(chan->cmux) > 0) { /* Calculate number of cells, including clamp */ if (unlimited) { @@ -1761,10 +2092,15 @@ channel_flush_some_cells, (channel_t *chan, ssize_t num_cells)) clamped_num_cells = (int)(num_cells - flushed); } } - /* Try to get more cells from any active circuits */ - flushed = channel_flush_from_first_active_circuit( + num_cells_from_circs = channel_flush_from_first_active_circuit( chan, clamped_num_cells); + + /* If it claims we got some, process the queue again */ + if (num_cells_from_circs > 0) { + flushed += channel_flush_some_cells_from_outgoing_queue(chan, + (unlimited ? -1 : num_cells - flushed)); + } } } @@ -1772,17 +2108,167 @@ channel_flush_some_cells, (channel_t *chan, ssize_t num_cells)) return flushed; } +/** + * Flush cells from just the channel's outgoing cell queue + * + * This gets called from channel_flush_some_cells() above to flush cells + * just from the queue without trying for active_circuits. + */ + +static ssize_t +channel_flush_some_cells_from_outgoing_queue(channel_t *chan, + ssize_t num_cells) +{ + unsigned int unlimited = 0; + ssize_t flushed = 0; + cell_queue_entry_t *q = NULL; + + tor_assert(chan); + tor_assert(chan->write_cell); + tor_assert(chan->write_packed_cell); + tor_assert(chan->write_var_cell); + + if (num_cells < 0) unlimited = 1; + if (!unlimited && num_cells <= flushed) return 0; + + /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ + if (chan->state == CHANNEL_STATE_OPEN) { + while ((unlimited || num_cells > flushed) && + NULL != (q = TOR_SIMPLEQ_FIRST(&chan->outgoing_queue))) { + + if (1) { + /* + * Okay, we have a good queue entry, try to give it to the lower + * layer. + */ + switch (q->type) { + case CELL_QUEUE_FIXED: + if (q->u.fixed.cell) { + if (chan->write_cell(chan, + q->u.fixed.cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + cell_queue_entry_free(q, 1); + q = NULL; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_FIXED " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + cell_queue_entry_free(q, 0); + q = NULL; + } + break; + case CELL_QUEUE_PACKED: + if (q->u.packed.packed_cell) { + if (chan->write_packed_cell(chan, + q->u.packed.packed_cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + cell_queue_entry_free(q, 1); + q = NULL; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_PACKED " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + cell_queue_entry_free(q, 0); + q = NULL; + } + break; + case CELL_QUEUE_VAR: + if (q->u.var.var_cell) { + if (chan->write_var_cell(chan, + q->u.var.var_cell)) { + ++flushed; + channel_timestamp_xmit(chan); + ++(chan->n_cells_xmitted); + cell_queue_entry_free(q, 1); + q = NULL; + } + /* Else couldn't write it; leave it on the queue */ + } else { + /* This shouldn't happen */ + log_info(LD_CHANNEL, + "Saw broken cell queue entry of type CELL_QUEUE_VAR " + "with no cell on channel %p " + "(global ID " U64_FORMAT ").", + chan, U64_PRINTF_ARG(chan->global_identifier)); + /* Throw it away */ + cell_queue_entry_free(q, 0); + q = NULL; + } + break; + default: + /* Unknown type, log and free it */ + log_info(LD_CHANNEL, + "Saw an unknown cell queue entry type %d on channel %p " + "(global ID " U64_FORMAT "; ignoring it." + " Someone should fix this.", + q->type, chan, U64_PRINTF_ARG(chan->global_identifier)); + cell_queue_entry_free(q, 0); + q = NULL; + } + + /* if q got NULLed out, we used it and should remove the queue entry */ + if (!q) TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); + /* No cell removed from list, so we can't go on any further */ + else break; + } + } + } + + /* Did we drain the queue? */ + if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) { + channel_timestamp_drained(chan); + } + + return flushed; +} + +/** + * Flush as many cells as we possibly can from the queue + * + * This tries to flush as many cells from the queue as the lower layer + * will take. It just calls channel_flush_some_cells_from_outgoing_queue() + * in unlimited mode. + */ + +void +channel_flush_cells(channel_t *chan) +{ + channel_flush_some_cells_from_outgoing_queue(chan, -1); +} + /** * Check if any cells are available * - * This is used by the scheduler to know if the channel has more to flush - * after a scheduling round. + * This gets used from the lower layer to check if any more cells are + * available. */ -MOCK_IMPL(int, -channel_more_to_flush, (channel_t *chan)) + +int +channel_more_to_flush(channel_t *chan) { tor_assert(chan); + /* Check if we have any queued */ + if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) + return 1; + + /* Check if any circuits would like to queue some */ if (circuitmux_num_cells(chan->cmux) > 0) return 1; /* Else no */ @@ -1871,9 +2357,8 @@ void channel_do_open_actions(channel_t *chan) { tor_addr_t remote_addr; - int started_here; + int started_here, not_using = 0; time_t now = time(NULL); - int close_origin_circuits = 0; tor_assert(chan); @@ -1882,10 +2367,21 @@ channel_do_open_actions(channel_t *chan) if (started_here) { circuit_build_times_network_is_live(get_circuit_build_times_mutable()); rep_hist_note_connect_succeeded(chan->identity_digest, now); + if (entry_guard_register_connect_status( + chan->identity_digest, 1, 0, now) < 0) { + /* Close any circuits pending on this channel. We leave it in state + * 'open' though, because it didn't actually *fail* -- we just + * chose not to use it. */ + log_debug(LD_OR, + "New entry guard was reachable, but closing this " + "connection so we can retry the earlier entry guards."); + circuit_n_chan_done(chan, 0); + not_using = 1; + } router_set_status(chan->identity_digest, 1); } else { /* only report it to the geoip module if it's not a known router */ - if (!connection_or_digest_is_known_relay(chan->identity_digest)) { + if (!router_get_by_id_digest(chan->identity_digest)) { if (channel_get_addr_if_possible(chan, &remote_addr)) { char *transport_name = NULL; if (chan->get_transport_name(chan, &transport_name) < 0) @@ -1900,33 +2396,7 @@ channel_do_open_actions(channel_t *chan) } } - /* Disable or reduce padding according to user prefs. */ - if (chan->padding_enabled || get_options()->ConnectionPadding == 1) { - if (!get_options()->ConnectionPadding) { - /* Disable if torrc disabled */ - channelpadding_disable_padding_on_channel(chan); - } else if (get_options()->Tor2webMode && - !networkstatus_get_param(NULL, - CHANNELPADDING_TOR2WEB_PARAM, - CHANNELPADDING_TOR2WEB_DEFAULT, 0, 1)) { - /* Disable if we're using tor2web and the consensus disabled padding - * for tor2web */ - channelpadding_disable_padding_on_channel(chan); - } else if (rend_service_allow_non_anonymous_connection(get_options()) && - !networkstatus_get_param(NULL, - CHANNELPADDING_SOS_PARAM, - CHANNELPADDING_SOS_DEFAULT, 0, 1)) { - /* Disable if we're using RSOS and the consensus disabled padding - * for RSOS*/ - channelpadding_disable_padding_on_channel(chan); - } else if (get_options()->ReducedConnectionPadding) { - /* Padding can be forced and/or reduced by clients, regardless of if - * the channel supports it */ - channelpadding_reduce_padding_on_channel(chan); - } - } - - circuit_n_chan_done(chan, 1, close_origin_circuits); + if (!not_using) circuit_n_chan_done(chan, 1); } /** @@ -1986,31 +2456,175 @@ channel_listener_queue_incoming(channel_listener_t *listener, } /** - * Process a cell from the given channel. + * Process queued incoming cells + * + * Process as many queued cells as we can from the incoming + * cell queue. + */ + +void +channel_process_cells(channel_t *chan) +{ + cell_queue_entry_t *q; + tor_assert(chan); + tor_assert(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_MAINT || + chan->state == CHANNEL_STATE_OPEN); + + log_debug(LD_CHANNEL, + "Processing as many incoming cells as we can for channel %p", + chan); + + /* Nothing we can do if we have no registered cell handlers */ + if (!(chan->cell_handler || + chan->var_cell_handler)) return; + /* Nothing we can do if we have no cells */ + if (TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) return; + + /* + * Process cells until we're done or find one we have no current handler + * for. + */ + while (NULL != (q = TOR_SIMPLEQ_FIRST(&chan->incoming_queue))) { + tor_assert(q); + tor_assert(q->type == CELL_QUEUE_FIXED || + q->type == CELL_QUEUE_VAR); + + if (q->type == CELL_QUEUE_FIXED && + chan->cell_handler) { + /* Handle a fixed-length cell */ + TOR_SIMPLEQ_REMOVE_HEAD(&chan->incoming_queue, next); + tor_assert(q->u.fixed.cell); + log_debug(LD_CHANNEL, + "Processing incoming cell_t %p for channel %p (global ID " + U64_FORMAT ")", + q->u.fixed.cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + chan->cell_handler(chan, q->u.fixed.cell); + tor_free(q); + } else if (q->type == CELL_QUEUE_VAR && + chan->var_cell_handler) { + /* Handle a variable-length cell */ + TOR_SIMPLEQ_REMOVE_HEAD(&chan->incoming_queue, next); + tor_assert(q->u.var.var_cell); + log_debug(LD_CHANNEL, + "Processing incoming var_cell_t %p for channel %p (global ID " + U64_FORMAT ")", + q->u.var.var_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + chan->var_cell_handler(chan, q->u.var.var_cell); + tor_free(q); + } else { + /* Can't handle this one */ + break; + } + } +} + +/** + * Queue incoming cell + * + * This should be called by a channel_t subclass to queue an incoming fixed- + * length cell for processing, and process it if possible. + */ + +void +channel_queue_cell(channel_t *chan, cell_t *cell) +{ + int need_to_queue = 0; + cell_queue_entry_t *q; + + tor_assert(chan); + tor_assert(cell); + tor_assert(chan->state == CHANNEL_STATE_OPEN); + + /* Do we need to queue it, or can we just call the handler right away? */ + if (!(chan->cell_handler)) need_to_queue = 1; + if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) + need_to_queue = 1; + + /* Timestamp for receiving */ + channel_timestamp_recv(chan); + + /* Update the counter */ + ++(chan->n_cells_recved); + + /* If we don't need to queue we can just call cell_handler */ + if (!need_to_queue) { + tor_assert(chan->cell_handler); + log_debug(LD_CHANNEL, + "Directly handling incoming cell_t %p for channel %p " + "(global ID " U64_FORMAT ")", + cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + chan->cell_handler(chan, cell); + } else { + /* Otherwise queue it and then process the queue if possible. */ + q = cell_queue_entry_new_fixed(cell); + log_debug(LD_CHANNEL, + "Queueing incoming cell_t %p for channel %p " + "(global ID " U64_FORMAT ")", + cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + TOR_SIMPLEQ_INSERT_TAIL(&chan->incoming_queue, q, next); + if (chan->cell_handler || + chan->var_cell_handler) { + channel_process_cells(chan); + } + } +} + +/** + * Queue incoming variable-length cell + * + * This should be called by a channel_t subclass to queue an incoming + * variable-length cell for processing, and process it if possible. */ + void -channel_process_cell(channel_t *chan, cell_t *cell) +channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell) { + int need_to_queue = 0; + cell_queue_entry_t *q; + tor_assert(chan); - tor_assert(CHANNEL_IS_CLOSING(chan) || CHANNEL_IS_MAINT(chan) || - CHANNEL_IS_OPEN(chan)); - tor_assert(cell); + tor_assert(var_cell); + tor_assert(chan->state == CHANNEL_STATE_OPEN); - /* Nothing we can do if we have no registered cell handlers */ - if (!chan->cell_handler) - return; + /* Do we need to queue it, or can we just call the handler right away? */ + if (!(chan->var_cell_handler)) need_to_queue = 1; + if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) + need_to_queue = 1; /* Timestamp for receiving */ channel_timestamp_recv(chan); - /* Update received counter. */ + + /* Update the counter */ ++(chan->n_cells_recved); - chan->n_bytes_recved += get_cell_network_size(chan->wide_circ_ids); - log_debug(LD_CHANNEL, - "Processing incoming cell_t %p for channel %p (global ID " - U64_FORMAT ")", cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - chan->cell_handler(chan, cell); + /* If we don't need to queue we can just call cell_handler */ + if (!need_to_queue) { + tor_assert(chan->var_cell_handler); + log_debug(LD_CHANNEL, + "Directly handling incoming var_cell_t %p for channel %p " + "(global ID " U64_FORMAT ")", + var_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + chan->var_cell_handler(chan, var_cell); + } else { + /* Otherwise queue it and then process the queue if possible. */ + q = cell_queue_entry_new_var(var_cell); + log_debug(LD_CHANNEL, + "Queueing incoming var_cell_t %p for channel %p " + "(global ID " U64_FORMAT ")", + var_cell, chan, + U64_PRINTF_ARG(chan->global_identifier)); + TOR_SIMPLEQ_INSERT_TAIL(&chan->incoming_queue, q, next); + if (chan->cell_handler || + chan->var_cell_handler) { + channel_process_cells(chan); + } + } } /** If packed_cell on chan is a destroy cell, then set @@ -2036,6 +2650,31 @@ packed_cell_is_destroy(channel_t *chan, return 0; } +/** DOCDOC */ +static int +is_destroy_cell(channel_t *chan, + const cell_queue_entry_t *q, circid_t *circid_out) +{ + *circid_out = 0; + switch (q->type) { + case CELL_QUEUE_FIXED: + if (q->u.fixed.cell->command == CELL_DESTROY) { + *circid_out = q->u.fixed.cell->circ_id; + return 1; + } + break; + case CELL_QUEUE_VAR: + if (q->u.var.var_cell->command == CELL_DESTROY) { + *circid_out = q->u.var.var_cell->circ_id; + return 1; + } + break; + case CELL_QUEUE_PACKED: + return packed_cell_is_destroy(chan, q->u.packed.packed_cell, circid_out); + } + return 0; +} + /** * Send destroy cell on a channel * @@ -2048,17 +2687,12 @@ int channel_send_destroy(circid_t circ_id, channel_t *chan, int reason) { tor_assert(chan); - if (circ_id == 0) { - log_warn(LD_BUG, "Attempted to send a destroy cell for circID 0 " - "on a channel " U64_FORMAT " at %p in state %s (%d)", - U64_PRINTF_ARG(chan->global_identifier), - chan, channel_state_to_string(chan->state), - chan->state); - return 0; - } /* Check to make sure we can send on this channel first */ - if (!CHANNEL_CONDEMNED(chan) && chan->cmux) { + if (!(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) && + chan->cmux) { channel_note_destroy_pending(chan, circ_id); circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason); log_debug(LD_OR, @@ -2081,7 +2715,7 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason) /** * Dump channel statistics to the log * - * This is called from dumpstats() in main.c and spams the log with + * This is called from dumpstats() in onion_main.c and spams the log with * statistics on channels. */ @@ -2113,7 +2747,7 @@ channel_dumpstats(int severity) /** * Dump channel listener statistics to the log * - * This is called from dumpstats() in main.c and spams the log with + * This is called from dumpstats() in onion_main.c and spams the log with * statistics on channel listeners. */ @@ -2161,7 +2795,7 @@ channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol) /** * Clean up channels * - * This gets called periodically from run_scheduled_events() in main.c; + * This gets called periodically from run_scheduled_events() in onion_main.c; * it cleans up after closed channels. */ @@ -2188,7 +2822,7 @@ channel_run_cleanup(void) /** * Clean up channel listeners * - * This gets called periodically from run_scheduled_events() in main.c; + * This gets called periodically from run_scheduled_events() in onion_main.c; * it cleans up after closed channel listeners. */ @@ -2231,15 +2865,16 @@ channel_free_list(smartlist_t *channels, int mark_for_close) channel_state_to_string(curr->state), curr->state); /* Detach circuits early so they can find the channel */ if (curr->cmux) { - circuitmux_detach_all_circuits(curr->cmux, NULL); + circuitmux_detach_all_circuits(curr->cmux); } - SMARTLIST_DEL_CURRENT(channels, curr); channel_unregister(curr); if (mark_for_close) { - if (!CHANNEL_CONDEMNED(curr)) { + if (!(curr->state == CHANNEL_STATE_CLOSING || + curr->state == CHANNEL_STATE_CLOSED || + curr->state == CHANNEL_STATE_ERROR)) { channel_mark_for_close(curr); } - channel_force_xfree(curr); + channel_force_free(curr); } else channel_free(curr); } SMARTLIST_FOREACH_END(curr); } @@ -2268,7 +2903,7 @@ channel_listener_free_list(smartlist_t *listeners, int mark_for_close) curr->state == CHANNEL_LISTENER_STATE_ERROR)) { channel_listener_mark_for_close(curr); } - channel_listener_force_xfree(curr); + channel_listener_force_free(curr); } else channel_listener_free(curr); } SMARTLIST_FOREACH_END(curr); } @@ -2276,7 +2911,7 @@ channel_listener_free_list(smartlist_t *listeners, int mark_for_close) /** * Close all channels and free everything * - * This gets called from tor_free_all() in main.c to clean up on exit. + * This gets called from tor_free_all() in onion_main.c to clean up on exit. * It will close all registered channels and free associated storage, * then free the all_channels, active_channels, listening_channels and * finished_channels lists and also channel_identity_map. @@ -2336,11 +2971,6 @@ channel_free_all(void) /* Geez, anything still left over just won't die ... let it leak then */ HT_CLEAR(channel_idmap, &channel_identity_map); - /* Same with channel_gid_map */ - log_debug(LD_CHANNEL, - "Freeing channel_gid_map"); - HT_CLEAR(channel_gid_map, &channel_gid_map); - log_debug(LD_CHANNEL, "Done cleaning up after channels"); } @@ -2358,10 +2988,9 @@ channel_free_all(void) channel_t * channel_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id) + const char *id_digest) { - return channel_tls_connect(addr, port, id_digest, ed_id); + return channel_tls_connect(addr, port, id_digest); } /** @@ -2376,20 +3005,22 @@ channel_connect(const tor_addr_t *addr, uint16_t port, */ int -channel_is_better(channel_t *a, channel_t *b) +channel_is_better(time_t now, channel_t *a, channel_t *b, + int forgive_new_connections) { + int a_grace, b_grace; int a_is_canonical, b_is_canonical; + int a_has_circs, b_has_circs; + + /* + * Do not definitively deprecate a new channel with no circuits on it + * until this much time has passed. + */ +#define NEW_CHAN_GRACE_PERIOD (15*60) tor_assert(a); tor_assert(b); - /* If one channel is bad for new circuits, and the other isn't, - * use the one that is still good. */ - if (!channel_is_bad_for_new_circs(a) && channel_is_bad_for_new_circs(b)) - return 1; - if (channel_is_bad_for_new_circs(a) && !channel_is_bad_for_new_circs(b)) - return 0; - /* Check if one is canonical and the other isn't first */ a_is_canonical = channel_is_canonical(a); b_is_canonical = channel_is_canonical(b); @@ -2397,31 +3028,26 @@ channel_is_better(channel_t *a, channel_t *b) if (a_is_canonical && !b_is_canonical) return 1; if (!a_is_canonical && b_is_canonical) return 0; - /* Check if we suspect that one of the channels will be preferred - * by the peer */ - if (a->is_canonical_to_peer && !b->is_canonical_to_peer) return 1; - if (!a->is_canonical_to_peer && b->is_canonical_to_peer) return 0; - /* - * Okay, if we're here they tied on canonicity, the prefer the older - * connection, so that the adversary can't create a new connection - * and try to switch us over to it (which will leak information - * about long-lived circuits). Additionally, switching connections - * too often makes us more vulnerable to attacks like Torscan and - * passive netflow-based equivalents. - * - * Connections will still only live for at most a week, due to - * the check in connection_or_group_set_badness() against - * TIME_BEFORE_OR_CONN_IS_TOO_OLD, which marks old connections as - * unusable for new circuits after 1 week. That check sets - * is_bad_for_new_circs, which is checked in channel_get_for_extend(). - * - * We check channel_is_bad_for_new_circs() above here anyway, for safety. + * Okay, if we're here they tied on canonicity. Next we check if + * they have any circuits, and if one does and the other doesn't, + * we prefer the one that does, unless we are forgiving and the + * one that has no circuits is in its grace period. */ - if (channel_when_created(a) < channel_when_created(b)) return 1; - else if (channel_when_created(a) > channel_when_created(b)) return 0; - if (channel_num_circuits(a) > channel_num_circuits(b)) return 1; + a_has_circs = (channel_num_circuits(a) > 0); + b_has_circs = (channel_num_circuits(b) > 0); + a_grace = (forgive_new_connections && + (now < channel_when_created(a) + NEW_CHAN_GRACE_PERIOD)); + b_grace = (forgive_new_connections && + (now < channel_when_created(b) + NEW_CHAN_GRACE_PERIOD)); + + if (a_has_circs && !b_has_circs && !b_grace) return 1; + if (!a_has_circs && b_has_circs && !a_grace) return 0; + + /* They tied on circuits too; just prefer whichever is newer */ + + if (channel_when_created(a) > channel_when_created(b)) return 1; else return 0; } @@ -2437,8 +3063,7 @@ channel_is_better(channel_t *a, channel_t *b) */ channel_t * -channel_get_for_extend(const char *rsa_id_digest, - const ed25519_public_key_t *ed_id, +channel_get_for_extend(const char *digest, const tor_addr_t *target_addr, const char **msg_out, int *launch_out) @@ -2446,20 +3071,23 @@ channel_get_for_extend(const char *rsa_id_digest, channel_t *chan, *best = NULL; int n_inprogress_goodaddr = 0, n_old = 0; int n_noncanonical = 0, n_possible = 0; + time_t now = approx_time(); tor_assert(msg_out); tor_assert(launch_out); - chan = channel_find_by_remote_identity(rsa_id_digest, ed_id); + chan = channel_find_by_remote_digest(digest); /* Walk the list, unrefing the old one and refing the new at each * iteration. */ - for (; chan; chan = channel_next_with_rsa_identity(chan)) { + for (; chan; chan = channel_next_with_digest(chan)) { tor_assert(tor_memeq(chan->identity_digest, - rsa_id_digest, DIGEST_LEN)); + digest, DIGEST_LEN)); - if (CHANNEL_CONDEMNED(chan)) + if (chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR) continue; /* Never return a channel on which the other end appears to be @@ -2468,13 +3096,8 @@ channel_get_for_extend(const char *rsa_id_digest, continue; } - /* The Ed25519 key has to match too */ - if (!channel_remote_identity_matches(chan, rsa_id_digest, ed_id)) { - continue; - } - /* Never return a non-open connection. */ - if (!CHANNEL_IS_OPEN(chan)) { + if (chan->state != CHANNEL_STATE_OPEN) { /* If the address matches, don't launch a new connection for this * circuit. */ if (channel_matches_target_addr_for_extend(chan, target_addr)) @@ -2515,7 +3138,7 @@ channel_get_for_extend(const char *rsa_id_digest, continue; } - if (channel_is_better(chan, best)) + if (channel_is_better(now, chan, best, 0)) best = chan; } @@ -2571,14 +3194,27 @@ channel_listener_describe_transport(channel_listener_t *chan_l) return chan_l->describe_transport(chan_l); } +/** + * Return the number of entries in queue + */ +static int +chan_cell_queue_len(const chan_cell_queue_t *queue) +{ + int r = 0; + cell_queue_entry_t *cell; + TOR_SIMPLEQ_FOREACH(cell, queue, next) + ++r; + return r; +} + /** * Dump channel statistics * * Dump statistics for one channel to the log */ -MOCK_IMPL(void, -channel_dump_statistics, (channel_t *chan, int severity)) +void +channel_dump_statistics(channel_t *chan, int severity) { double avg, interval, age; time_t now = time(NULL); @@ -2606,33 +3242,50 @@ channel_dump_statistics, (channel_t *chan, int severity)) U64_PRINTF_ARG(chan->timestamp_active), U64_PRINTF_ARG(now - chan->timestamp_active)); - /* Handle digest. */ + /* Handle digest and nickname */ if (!tor_digest_is_zero(chan->identity_digest)) { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " says it is connected " - "to an OR with digest %s", - U64_PRINTF_ARG(chan->global_identifier), - hex_str(chan->identity_digest, DIGEST_LEN)); + if (chan->nickname) { + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " says it is connected " + "to an OR with digest %s and nickname %s", + U64_PRINTF_ARG(chan->global_identifier), + hex_str(chan->identity_digest, DIGEST_LEN), + chan->nickname); + } else { + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " says it is connected " + "to an OR with digest %s and no known nickname", + U64_PRINTF_ARG(chan->global_identifier), + hex_str(chan->identity_digest, DIGEST_LEN)); + } } else { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " does not know the digest" - " of the OR it is connected to", - U64_PRINTF_ARG(chan->global_identifier)); + if (chan->nickname) { + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " does not know the digest" + " of the OR it is connected to, but reports its nickname is %s", + U64_PRINTF_ARG(chan->global_identifier), + chan->nickname); + } else { + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " does not know the digest" + " or the nickname of the OR it is connected to", + U64_PRINTF_ARG(chan->global_identifier)); + } } /* Handle remote address and descriptions */ have_remote_addr = channel_get_addr_if_possible(chan, &remote_addr); if (have_remote_addr) { char *actual = tor_strdup(channel_get_actual_remote_descr(chan)); - remote_addr_str = tor_addr_to_str_dup(&remote_addr); + remote_addr_str = tor_dup_addr(&remote_addr); tor_log(severity, LD_GENERAL, " * Channel " U64_FORMAT " says its remote address" " is %s, and gives a canonical description of \"%s\" and an " "actual description of \"%s\"", U64_PRINTF_ARG(chan->global_identifier), - safe_str(remote_addr_str), - safe_str(channel_get_canonical_remote_descr(chan)), - safe_str(actual)); + remote_addr_str, + channel_get_canonical_remote_descr(chan), + actual); tor_free(remote_addr_str); tor_free(actual); } else { @@ -2666,6 +3319,14 @@ channel_dump_statistics, (channel_t *chan, int severity)) channel_is_incoming(chan) ? "incoming" : "outgoing"); + /* Describe queues */ + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " has %d queued incoming cells" + " and %d queued outgoing cells", + U64_PRINTF_ARG(chan->global_identifier), + chan_cell_queue_len(&chan->incoming_queue), + chan_cell_queue_len(&chan->outgoing_queue)); + /* Describe circuits */ tor_log(severity, LD_GENERAL, " * Channel " U64_FORMAT " has %d active circuits out of" @@ -2683,6 +3344,12 @@ channel_dump_statistics, (channel_t *chan, int severity)) U64_PRINTF_ARG(chan->global_identifier), U64_PRINTF_ARG(chan->timestamp_client), U64_PRINTF_ARG(now - chan->timestamp_client)); + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " was last drained at " + U64_FORMAT " (" U64_FORMAT " seconds ago)", + U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(chan->timestamp_drained), + U64_PRINTF_ARG(now - chan->timestamp_drained)); tor_log(severity, LD_GENERAL, " * Channel " U64_FORMAT " last received a cell " "at " U64_FORMAT " (" U64_FORMAT " seconds ago)", @@ -2690,7 +3357,7 @@ channel_dump_statistics, (channel_t *chan, int severity)) U64_PRINTF_ARG(chan->timestamp_recv), U64_PRINTF_ARG(now - chan->timestamp_recv)); tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " last transmitted a cell " + " * Channel " U64_FORMAT " last trasmitted a cell " "at " U64_FORMAT " (" U64_FORMAT " seconds ago)", U64_PRINTF_ARG(chan->global_identifier), U64_PRINTF_ARG(chan->timestamp_xmit), @@ -2699,22 +3366,12 @@ channel_dump_statistics, (channel_t *chan, int severity)) /* Describe counters and rates */ tor_log(severity, LD_GENERAL, " * Channel " U64_FORMAT " has received " - U64_FORMAT " bytes in " U64_FORMAT " cells and transmitted " - U64_FORMAT " bytes in " U64_FORMAT " cells", + U64_FORMAT " cells and transmitted " U64_FORMAT, U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->n_bytes_recved), U64_PRINTF_ARG(chan->n_cells_recved), - U64_PRINTF_ARG(chan->n_bytes_xmitted), U64_PRINTF_ARG(chan->n_cells_xmitted)); if (now > chan->timestamp_created && chan->timestamp_created > 0) { - if (chan->n_bytes_recved > 0) { - avg = (double)(chan->n_bytes_recved) / age; - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "bytes received per second", - U64_PRINTF_ARG(chan->global_identifier), avg); - } if (chan->n_cells_recved > 0) { avg = (double)(chan->n_cells_recved) / age; if (avg >= 1.0) { @@ -2730,13 +3387,6 @@ channel_dump_statistics, (channel_t *chan, int severity)) U64_PRINTF_ARG(chan->global_identifier), interval); } } - if (chan->n_bytes_xmitted > 0) { - avg = (double)(chan->n_bytes_xmitted) / age; - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "bytes transmitted per second", - U64_PRINTF_ARG(chan->global_identifier), avg); - } if (chan->n_cells_xmitted > 0) { avg = (double)(chan->n_cells_xmitted) / age; if (avg >= 1.0) { @@ -2926,18 +3576,29 @@ channel_get_addr_if_possible(channel_t *chan, tor_addr_t *addr_out) else return 0; } -/* - * Return true iff the channel has any cells on the connection outbuf waiting - * to be sent onto the network. +/** + * Check if there are outgoing queue writes on this channel + * + * Indicate if either we have queued cells, or if not, whether the underlying + * lower-layer transport thinks it has an output queue. */ + int channel_has_queued_writes(channel_t *chan) { + int has_writes = 0; + tor_assert(chan); tor_assert(chan->has_queued_writes); - /* Check with the lower layer */ - return chan->has_queued_writes(chan); + if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) { + has_writes = 1; + } else { + /* Check with the lower layer */ + has_writes = chan->has_queued_writes(chan); + } + + return has_writes; } /** @@ -2978,7 +3639,7 @@ channel_mark_bad_for_new_circs(channel_t *chan) */ int -channel_is_client(const channel_t *chan) +channel_is_client(channel_t *chan) { tor_assert(chan); @@ -2999,20 +3660,6 @@ channel_mark_client(channel_t *chan) chan->is_client = 1; } -/** - * Clear the client flag - * - * Mark a channel as being _not_ from a client - */ - -void -channel_clear_client(channel_t *chan) -{ - tor_assert(chan); - - chan->is_client = 0; -} - /** * Get the canonical flag for a channel * @@ -3109,23 +3756,6 @@ channel_mark_local(channel_t *chan) chan->is_local = 1; } -/** - * Mark a channel as remote - * - * This internal-only function should be called by the lower layer if the - * channel is not to a local address but has previously been marked local. - * See channel_is_local() above or the description of the is_local bit in - * channel.h - */ - -void -channel_mark_remote(channel_t *chan) -{ - tor_assert(chan); - - chan->is_local = 0; -} - /** * Test outgoing flag * @@ -3157,35 +3787,6 @@ channel_mark_outgoing(channel_t *chan) chan->is_incoming = 0; } -/************************ - * Flow control queries * - ***********************/ - -/* - * Estimate the number of writeable cells - * - * Ask the lower layer for an estimate of how many cells it can accept. - */ -int -channel_num_cells_writeable(channel_t *chan) -{ - int result; - - tor_assert(chan); - tor_assert(chan->num_cells_writeable); - - if (chan->state == CHANNEL_STATE_OPEN) { - /* Query lower layer */ - result = chan->num_cells_writeable(chan); - if (result < 0) result = 0; - } else { - /* No cells are writeable in any other state */ - result = 0; - } - - return result; -} - /********************* * Timestamp updates * ********************/ @@ -3241,12 +3842,8 @@ channel_timestamp_active(channel_t *chan) time_t now = time(NULL); tor_assert(chan); - monotime_coarse_get(&chan->timestamp_xfer); chan->timestamp_active = now; - - /* Clear any potential netflow padding timer. We're active */ - monotime_coarse_zero(&chan->next_padding_time); } /** @@ -3299,6 +3896,25 @@ channel_timestamp_client(channel_t *chan) chan->timestamp_client = now; } +/** + * Update the last drained timestamp + * + * This is called whenever we transmit a cell which leaves the outgoing cell + * queue completely empty. It also updates the xmit time and the active time. + */ + +void +channel_timestamp_drained(channel_t *chan) +{ + time_t now = time(NULL); + + tor_assert(chan); + + chan->timestamp_active = now; + chan->timestamp_drained = now; + chan->timestamp_xmit = now; +} + /** * Update the recv timestamp * @@ -3310,14 +3926,11 @@ void channel_timestamp_recv(channel_t *chan) { time_t now = time(NULL); + tor_assert(chan); - monotime_coarse_get(&chan->timestamp_xfer); chan->timestamp_active = now; chan->timestamp_recv = now; - - /* Clear any potential netflow padding timer. We're active */ - monotime_coarse_zero(&chan->next_padding_time); } /** @@ -3330,15 +3943,11 @@ void channel_timestamp_xmit(channel_t *chan) { time_t now = time(NULL); - tor_assert(chan); - monotime_coarse_get(&chan->timestamp_xfer); + tor_assert(chan); chan->timestamp_active = now; chan->timestamp_xmit = now; - - /* Clear any potential netflow padding timer. We're active */ - monotime_coarse_zero(&chan->next_padding_time); } /*************************************************************** @@ -3357,6 +3966,54 @@ channel_when_created(channel_t *chan) return chan->timestamp_created; } +/** + * Query created timestamp for a channel listener + */ + +time_t +channel_listener_when_created(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + + return chan_l->timestamp_created; +} + +/** + * Query last active timestamp for a channel + */ + +time_t +channel_when_last_active(channel_t *chan) +{ + tor_assert(chan); + + return chan->timestamp_active; +} + +/** + * Query last active timestamp for a channel listener + */ + +time_t +channel_listener_when_last_active(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + + return chan_l->timestamp_active; +} + +/** + * Query last accepted timestamp for a channel listener + */ + +time_t +channel_listener_when_last_accepted(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + + return chan_l->timestamp_accepted; +} + /** * Query client timestamp */ @@ -3369,6 +4026,30 @@ channel_when_last_client(channel_t *chan) return chan->timestamp_client; } +/** + * Query drained timestamp + */ + +time_t +channel_when_last_drained(channel_t *chan) +{ + tor_assert(chan); + + return chan->timestamp_drained; +} + +/** + * Query recv timestamp + */ + +time_t +channel_when_last_recv(channel_t *chan) +{ + tor_assert(chan); + + return chan->timestamp_recv; +} + /** * Query xmit timestamp */ @@ -3381,6 +4062,42 @@ channel_when_last_xmit(channel_t *chan) return chan->timestamp_xmit; } +/** + * Query accepted counter + */ + +uint64_t +channel_listener_count_accepted(channel_listener_t *chan_l) +{ + tor_assert(chan_l); + + return chan_l->n_accepted; +} + +/** + * Query received cell counter + */ + +uint64_t +channel_count_recved(channel_t *chan) +{ + tor_assert(chan); + + return chan->n_cells_recved; +} + +/** + * Query transmitted cell counter + */ + +uint64_t +channel_count_xmitted(channel_t *chan) +{ + tor_assert(chan); + + return chan->n_cells_xmitted; +} + /** * Check if a channel matches an extend_info_t * @@ -3438,10 +4155,10 @@ channel_num_circuits(channel_t *chan) * This is called when setting up a channel and replaces the old * connection_or_set_circid_type() */ -MOCK_IMPL(void, -channel_set_circid_type,(channel_t *chan, - crypto_pk_t *identity_rcvd, - int consider_identity)) +void +channel_set_circid_type(channel_t *chan, + crypto_pk_t *identity_rcvd, + int consider_identity) { int started_here; crypto_pk_t *our_identity; @@ -3472,96 +4189,3 @@ channel_set_circid_type,(channel_t *chan, } } -static int -channel_sort_by_ed25519_identity(const void **a_, const void **b_) -{ - const channel_t *a = *a_, - *b = *b_; - return fast_memcmp(&a->ed25519_identity.pubkey, - &b->ed25519_identity.pubkey, - sizeof(a->ed25519_identity.pubkey)); -} - -/** Helper for channel_update_bad_for_new_circs(): Perform the - * channel_update_bad_for_new_circs operation on all channels in lst, - * all of which MUST have the same RSA ID. (They MAY have different - * Ed25519 IDs.) */ -static void -channel_rsa_id_group_set_badness(struct channel_list_s *lst, int force) -{ - /*XXXX This function should really be about channels. 15056 */ - channel_t *chan = TOR_LIST_FIRST(lst); - - if (!chan) - return; - - /* if there is only one channel, don't bother looping */ - if (PREDICT_LIKELY(!TOR_LIST_NEXT(chan, next_with_same_id))) { - connection_or_single_set_badness_( - time(NULL), BASE_CHAN_TO_TLS(chan)->conn, force); - return; - } - - smartlist_t *channels = smartlist_new(); - - TOR_LIST_FOREACH(chan, lst, next_with_same_id) { - if (BASE_CHAN_TO_TLS(chan)->conn) { - smartlist_add(channels, chan); - } - } - - smartlist_sort(channels, channel_sort_by_ed25519_identity); - - const ed25519_public_key_t *common_ed25519_identity = NULL; - /* it would be more efficient to do a slice, but this case is rare */ - smartlist_t *or_conns = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(channels, channel_t *, channel) { - if (!common_ed25519_identity) - common_ed25519_identity = &channel->ed25519_identity; - - if (! ed25519_pubkey_eq(&channel->ed25519_identity, - common_ed25519_identity)) { - connection_or_group_set_badness_(or_conns, force); - smartlist_clear(or_conns); - common_ed25519_identity = &channel->ed25519_identity; - } - - smartlist_add(or_conns, BASE_CHAN_TO_TLS(channel)->conn); - } SMARTLIST_FOREACH_END(channel); - - connection_or_group_set_badness_(or_conns, force); - - /* XXXX 15056 we may want to do something special with connections that have - * no set Ed25519 identity! */ - - smartlist_free(or_conns); - smartlist_free(channels); -} - -/** Go through all the channels (or if digest is non-NULL, just - * the OR connections with that digest), and set the is_bad_for_new_circs - * flag based on the rules in connection_or_group_set_badness() (or just - * always set it if force is true). - */ -void -channel_update_bad_for_new_circs(const char *digest, int force) -{ - if (digest) { - channel_idmap_entry_t *ent; - channel_idmap_entry_t search; - memset(&search, 0, sizeof(search)); - memcpy(search.digest, digest, DIGEST_LEN); - ent = HT_FIND(channel_idmap, &channel_identity_map, &search); - if (ent) { - channel_rsa_id_group_set_badness(&ent->channel_list, force); - } - return; - } - - /* no digest; just look at everything. */ - channel_idmap_entry_t **iter; - HT_FOREACH(iter, channel_idmap, &channel_identity_map) { - channel_rsa_id_group_set_badness(&(*iter)->channel_list, force); - } -} - diff --git a/src/tor/src/or/channel.h b/src/tor/channel.h similarity index 52% rename from src/tor/src/or/channel.h rename to src/tor/channel.h index 4b60b7a7d..a9ade3ff1 100644 --- a/src/tor/src/or/channel.h +++ b/src/tor/channel.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -11,26 +11,17 @@ #include "or.h" #include "circuitmux.h" -#include "timers.h" -#include "handles.h" /* Channel handler function pointer typedefs */ typedef void (*channel_listener_fn_ptr)(channel_listener_t *, channel_t *); typedef void (*channel_cell_handler_fn_ptr)(channel_t *, cell_t *); typedef void (*channel_var_cell_handler_fn_ptr)(channel_t *, var_cell_t *); -/** - * This enum is used by channelpadding to decide when to pad channels. - * Don't add values to it without updating the checks in - * channelpadding_decide_to_pad_channel(). - */ -typedef enum { - CHANNEL_USED_NOT_USED_FOR_FULL_CIRCS = 0, - CHANNEL_USED_FOR_FULL_CIRCS, - CHANNEL_USED_FOR_USER_TRAFFIC, -} channel_usage_info_t; +struct cell_queue_entry_s; +TOR_SIMPLEQ_HEAD(chan_cell_queue, cell_queue_entry_s) incoming_queue; +typedef struct chan_cell_queue chan_cell_queue_t; -/** +/* * Channel struct; see the channel_t typedef in or.h. A channel is an * abstract interface for the OR-to-OR connection, similar to connection_or_t, * but without the strong coupling to the underlying TLS implementation. They @@ -40,83 +31,23 @@ typedef enum { */ struct channel_s { - /** Magic number for type-checking cast macros */ + /* Magic number for type-checking cast macros */ uint32_t magic; - /** List entry for hashtable for global-identifier lookup. */ - HT_ENTRY(channel_s) gidmap_node; - - /** Handle entry for handle-based lookup */ - HANDLE_ENTRY(channel, channel_s); - - /** Current channel state */ + /* Current channel state */ channel_state_t state; - /** Globally unique ID number for a channel over the lifetime of a Tor - * process. This may not be 0. + /* Globally unique ID number for a channel over the lifetime of a Tor + * process. */ uint64_t global_identifier; - /** Should we expect to see this channel in the channel lists? */ + /* Should we expect to see this channel in the channel lists? */ unsigned char registered:1; /** has this channel ever been open? */ unsigned int has_been_open:1; - /** - * This field indicates if the other side has enabled or disabled - * padding via either the link protocol version or - * channelpadding_negotiate cells. - * - * Clients can override this with ConnectionPadding in torrc to - * disable or force padding to relays, but relays cannot override the - * client's request. - */ - unsigned int padding_enabled:1; - - /** Cached value of our decision to pad (to avoid expensive - * checks during critical path statistics counting). */ - unsigned int currently_padding:1; - - /** Is there a pending netflow padding callback? */ - unsigned int pending_padding_callback:1; - - /** Is our peer likely to consider this channel canonical? */ - unsigned int is_canonical_to_peer:1; - - /** Has this channel ever been used for non-directory traffic? - * Used to decide what channels to pad, and when. */ - channel_usage_info_t channel_usage; - - /** When should we send a cell for netflow padding? 0 means no padding is - * scheduled. */ - monotime_coarse_t next_padding_time; - - /** The callback pointer for the padding callbacks */ - tor_timer_t *padding_timer; - /** The handle to this channel (to free on canceled timers) */ - struct channel_handle_t *timer_handle; - - /** - * These two fields specify the minimum and maximum negotiated timeout - * values for inactivity (send or receive) before we decide to pad a - * channel. These fields can be set either via a PADDING_NEGOTIATE cell, - * or the torrc option ReducedConnectionPadding. The consensus parameters - * nf_ito_low and nf_ito_high are used to ensure that padding can only be - * negotiated to be less frequent than what is specified in the consensus. - * (This is done to prevent wingnut clients from requesting excessive - * padding). - * - * The actual timeout value is randomly chosen between these two values - * as per the table in channelpadding_get_netflow_inactive_timeout_ms(), - * after ensuring that these values do not specify lower timeouts than - * the consensus parameters. - * - * If these are 0, we have not negotiated or specified custom padding - * times, and instead use consensus defaults. */ - uint16_t padding_timeout_low_ms; - uint16_t padding_timeout_high_ms; - /** Why did we close? */ enum { @@ -126,70 +57,27 @@ struct channel_s { CHANNEL_CLOSE_FOR_ERROR } reason_for_closing; - /** State variable for use by the scheduler */ - enum { - /* - * The channel is not open, or it has a full output buffer but no queued - * cells. - */ - SCHED_CHAN_IDLE = 0, - /* - * The channel has space on its output buffer to write, but no queued - * cells. - */ - SCHED_CHAN_WAITING_FOR_CELLS, - /* - * The scheduler has queued cells but no output buffer space to write. - */ - SCHED_CHAN_WAITING_TO_WRITE, - /* - * The scheduler has both queued cells and output buffer space, and is - * eligible for the scheduler loop. - */ - SCHED_CHAN_PENDING - } scheduler_state; - - /** Heap index for use by the scheduler */ - int sched_heap_idx; - - /** Timestamps for both cell channels and listeners */ + /* Timestamps for both cell channels and listeners */ time_t timestamp_created; /* Channel created */ time_t timestamp_active; /* Any activity */ - /** - * This is a monotonic timestamp that marks when we - * believe the channel has actually sent or received data to/from - * the wire. Right now, it is used to determine when we should send - * a padding cell for channelpadding. - * - * XXX: Are we setting timestamp_xfer_ms in the right places to - * accurately reflect actual network data transfer? Or might this be - * very wrong wrt when bytes actually go on the wire? - */ - monotime_coarse_t timestamp_xfer; - /* Methods implemented by the lower layer */ - /** Free a channel */ - void (*free_fn)(channel_t *); - /** Close an open channel */ + /* Free a channel */ + void (*free)(channel_t *); + /* Close an open channel */ void (*close)(channel_t *); - /** Describe the transport subclass for this channel */ + /* Describe the transport subclass for this channel */ const char * (*describe_transport)(channel_t *); - /** Optional method to dump transport-specific statistics on the channel */ + /* Optional method to dump transport-specific statistics on the channel */ void (*dumpstats)(channel_t *, int); - /** Registered handlers for incoming cells */ + /* Registered handlers for incoming cells */ channel_cell_handler_fn_ptr cell_handler; channel_var_cell_handler_fn_ptr var_cell_handler; /* Methods implemented by the lower layer */ - /** - * Ask the lower layer for an estimate of the average overhead for - * transmissions on this channel. - */ - double (*get_overhead_estimate)(channel_t *); /* * Ask the underlying transport what the remote endpoint address is, in * a tor_addr_t. This is optional and subclasses may leave this NULL. @@ -202,81 +90,75 @@ struct channel_s { #define GRD_FLAG_ORIGINAL 1 #define GRD_FLAG_ADDR_ONLY 2 - /** + /* * Get a text description of the remote endpoint; canonicalized if the flag * GRD_FLAG_ORIGINAL is not set, or the one we originally connected * to/received from if it is. If GRD_FLAG_ADDR_ONLY is set, we return only * the original address. */ const char * (*get_remote_descr)(channel_t *, int); - /** Check if the lower layer has queued writes */ + /* Check if the lower layer has queued writes */ int (*has_queued_writes)(channel_t *); - /** + /* * If the second param is zero, ask the lower layer if this is * 'canonical', for a transport-specific definition of canonical; if * it is 1, ask if the answer to the preceding query is safe to rely * on. */ int (*is_canonical)(channel_t *, int); - /** Check if this channel matches a specified extend_info_t */ + /* Check if this channel matches a specified extend_info_t */ int (*matches_extend_info)(channel_t *, extend_info_t *); - /** Check if this channel matches a target address when extending */ + /* Check if this channel matches a target address when extending */ int (*matches_target)(channel_t *, const tor_addr_t *); - /* Ask the lower layer how many bytes it has queued but not yet sent */ - size_t (*num_bytes_queued)(channel_t *); - /* Ask the lower layer how many cells can be written */ - int (*num_cells_writeable)(channel_t *); /* Write a cell to an open channel */ int (*write_cell)(channel_t *, cell_t *); - /** Write a packed cell to an open channel */ + /* Write a packed cell to an open channel */ int (*write_packed_cell)(channel_t *, packed_cell_t *); - /** Write a variable-length cell to an open channel */ + /* Write a variable-length cell to an open channel */ int (*write_var_cell)(channel_t *, var_cell_t *); - /** - * Hash of the public RSA key for the other side's RSA identity key -- or - * zeroes if we don't have an RSA identity in mind for the other side, and - * it hasn't shown us one. - * - * Note that this is the RSA identity that we hope the other side has -- not - * necessarily its true identity. Don't believe this identity unless - * authentication has happened. + /* + * Hash of the public RSA key for the other side's identity key, or + * zeroes if the other side hasn't shown us a valid identity key. */ char identity_digest[DIGEST_LEN]; - /** - * Ed25519 key for the other side of this channel -- or zeroes if we don't - * have an Ed25519 identity in mind for the other side, and it hasn't shown - * us one. - * - * Note that this is the identity that we hope the other side has -- not - * necessarily its true identity. Don't believe this identity unless - * authentication has happened. - */ - ed25519_public_key_t ed25519_identity; + /* Nickname of the OR on the other side, or NULL if none. */ + char *nickname; - /** - * Linked list of channels with the same RSA identity digest, for use with - * the digest->channel map + /* + * Linked list of channels with the same identity digest, for the + * digest->channel map */ TOR_LIST_ENTRY(channel_s) next_with_same_id; - /** Circuit mux for circuits sending on this channel */ + /* List of incoming cells to handle */ + chan_cell_queue_t incoming_queue; + + /* List of queued outgoing cells */ + chan_cell_queue_t outgoing_queue; + + /* Circuit mux for circuits sending on this channel */ circuitmux_t *cmux; - /** Circuit ID generation stuff for use by circuitbuild.c */ + /* Circuit ID generation stuff for use by circuitbuild.c */ - /** + /* * When we send CREATE cells along this connection, which half of the * space should we use? */ - circ_id_type_bitfield_t circ_id_type:2; - /* DOCDOC */ + ENUM_BF(circ_id_type_t) circ_id_type:2; + /** DOCDOC*/ unsigned wide_circ_ids:1; + /* + * Which circ_id do we try to use next on this connection? This is + * always in the range 0..1<<15-1. + */ + circid_t next_circ_id; - /** For how many circuits are we n_chan? What about p_chan? */ + /* For how many circuits are we n_chan? What about p_chan? */ unsigned int num_n_circuits, num_p_circuits; - /** + /* * True iff this channel shouldn't get any new circs attached to it, * because the connection is too old, or because there's a better one. * More generally, this flag is used to note an unhealthy connection; @@ -286,8 +168,8 @@ struct channel_s { unsigned int is_bad_for_new_circs:1; /** True iff we have decided that the other end of this connection - * is a client or bridge relay. Connections with this flag set should never - * be used to satisfy an EXTEND request. */ + * is a client. Channels with this flag set should never be used + * to satisfy an EXTEND request. */ unsigned int is_client:1; /** Set if the channel was initiated remotely (came from a listener) */ @@ -300,19 +182,14 @@ struct channel_s { */ unsigned int is_local:1; - /** Have we logged a warning about circID exhaustion on this channel? - * If so, when? */ - ratelim_t last_warned_circ_ids_exhausted; - /** Channel timestamps for cell channels */ time_t timestamp_client; /* Client used this, according to relay.c */ + time_t timestamp_drained; /* Output queue empty */ time_t timestamp_recv; /* Cell received from lower layer */ time_t timestamp_xmit; /* Cell sent to lower layer */ - /** Timestamp for run_connection_housekeeping(). We update this once a - * second when we run housekeeping and find a circuit on this channel, and - * whenever we add a circuit to the channel. */ - time_t timestamp_last_had_circuits; + /* Timestamp for relay.c */ + time_t timestamp_last_added_nonpadding; /** Unique ID for measuring direct network status requests;vtunneled ones * come over a circuit_t, which has a dirreq_id field as well, but is a @@ -320,8 +197,8 @@ struct channel_s { uint64_t dirreq_id; /** Channel counters for cell channels */ - uint64_t n_cells_recved, n_bytes_recved; - uint64_t n_cells_xmitted, n_bytes_xmitted; + uint64_t n_cells_recved; + uint64_t n_cells_xmitted; }; struct channel_listener_s { @@ -333,7 +210,7 @@ struct channel_listener_s { */ uint64_t global_identifier; - /** Should we expect to see this channel in the channel lists? */ + /* Should we expect to see this channel in the channel lists? */ unsigned char registered:1; /** Why did we close? @@ -345,31 +222,31 @@ struct channel_listener_s { CHANNEL_LISTENER_CLOSE_FOR_ERROR } reason_for_closing; - /** Timestamps for both cell channels and listeners */ + /* Timestamps for both cell channels and listeners */ time_t timestamp_created; /* Channel created */ time_t timestamp_active; /* Any activity */ /* Methods implemented by the lower layer */ - /** Free a channel */ - void (*free_fn)(channel_listener_t *); - /** Close an open channel */ + /* Free a channel */ + void (*free)(channel_listener_t *); + /* Close an open channel */ void (*close)(channel_listener_t *); - /** Describe the transport subclass for this channel */ + /* Describe the transport subclass for this channel */ const char * (*describe_transport)(channel_listener_t *); - /** Optional method to dump transport-specific statistics on the channel */ + /* Optional method to dump transport-specific statistics on the channel */ void (*dumpstats)(channel_listener_t *, int); - /** Registered listen handler to call on incoming connection */ + /* Registered listen handler to call on incoming connection */ channel_listener_fn_ptr listener; - /** List of pending incoming connections */ + /* List of pending incoming connections */ smartlist_t *incoming_list; - /** Timestamps for listeners */ + /* Timestamps for listeners */ time_t timestamp_accepted; - /** Counters for listeners */ + /* Counters for listeners */ uint64_t n_accepted; }; @@ -389,13 +266,18 @@ channel_listener_state_to_string(channel_listener_state_t state); /* Abstract channel operations */ void channel_mark_for_close(channel_t *chan); -int channel_write_packed_cell(channel_t *chan, packed_cell_t *cell); +void channel_write_cell(channel_t *chan, cell_t *cell); +void channel_write_packed_cell(channel_t *chan, packed_cell_t *cell); +void channel_write_var_cell(channel_t *chan, var_cell_t *cell); void channel_listener_mark_for_close(channel_listener_t *chan_l); /* Channel callback registrations */ /* Listener callback */ +channel_listener_fn_ptr +channel_listener_get_listener_fn(channel_listener_t *chan); + void channel_listener_set_listener_fn(channel_listener_t *chan, channel_listener_fn_ptr listener); @@ -411,7 +293,7 @@ void channel_set_cell_handlers(channel_t *chan, var_cell_handler); /* Clean up closed channels and channel listeners periodically; these are - * called from run_scheduled_events() in main.c. + * called from run_scheduled_events() in onion_main.c. */ void channel_run_cleanup(void); void channel_listener_run_cleanup(void); @@ -428,12 +310,6 @@ void channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol); #ifdef TOR_CHANNEL_INTERNAL_ -#ifdef CHANNEL_PRIVATE_ - -STATIC void channel_add_to_digest_map(channel_t *chan); - -#endif /* defined(CHANNEL_PRIVATE_) */ - /* Channel operations for subclasses and internal use only */ /* Initialize a newly allocated channel - do this first in subclass @@ -456,26 +332,27 @@ void channel_close_from_lower_layer(channel_t *chan); void channel_close_for_error(channel_t *chan); void channel_closed(channel_t *chan); +void channel_listener_close_from_lower_layer(channel_listener_t *chan_l); +void channel_listener_close_for_error(channel_listener_t *chan_l); +void channel_listener_closed(channel_listener_t *chan_l); + /* Free a channel */ -void channel_free_(channel_t *chan); -#define channel_free(chan) FREE_AND_NULL(channel_t, channel_free_, (chan)) -void channel_listener_free_(channel_listener_t *chan_l); -#define channel_listener_free(chan_l) \ - FREE_AND_NULL(channel_listener_t, channel_listener_free_, (chan_l)) +void channel_free(channel_t *chan); +void channel_listener_free(channel_listener_t *chan_l); /* State/metadata setters */ void channel_change_state(channel_t *chan, channel_state_t to_state); -void channel_change_state_open(channel_t *chan); void channel_clear_identity_digest(channel_t *chan); void channel_clear_remote_end(channel_t *chan); void channel_mark_local(channel_t *chan); void channel_mark_incoming(channel_t *chan); void channel_mark_outgoing(channel_t *chan); -void channel_mark_remote(channel_t *chan); void channel_set_identity_digest(channel_t *chan, - const char *identity_digest, - const ed25519_public_key_t *ed_identity); + const char *identity_digest); +void channel_set_remote_end(channel_t *chan, + const char *identity_digest, + const char *nickname); void channel_listener_change_state(channel_listener_t *chan_l, channel_listener_state_t to_state); @@ -483,6 +360,7 @@ void channel_listener_change_state(channel_listener_t *chan_l, /* Timestamp updates */ void channel_timestamp_created(channel_t *chan); void channel_timestamp_active(channel_t *chan); +void channel_timestamp_drained(channel_t *chan); void channel_timestamp_recv(channel_t *chan); void channel_timestamp_xmit(channel_t *chan); @@ -496,14 +374,18 @@ void channel_listener_queue_incoming(channel_listener_t *listener, channel_t *incoming); /* Incoming cell handling */ -void channel_process_cell(channel_t *chan, cell_t *cell); +void channel_process_cells(channel_t *chan); +void channel_queue_cell(channel_t *chan, cell_t *cell); +void channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell); + +/* Outgoing cell handling */ +void channel_flush_cells(channel_t *chan); /* Request from lower layer for more cells if available */ -MOCK_DECL(ssize_t, channel_flush_some_cells, - (channel_t *chan, ssize_t num_cells)); +ssize_t channel_flush_some_cells(channel_t *chan, ssize_t num_cells); /* Query if data available on this channel */ -MOCK_DECL(int, channel_more_to_flush, (channel_t *chan)); +int channel_more_to_flush(channel_t *chan); /* Notify flushed outgoing for dirreq handling */ void channel_notify_flushed(channel_t *chan); @@ -511,7 +393,7 @@ void channel_notify_flushed(channel_t *chan); /* Handle stuff we need to do on open like notifying circuits */ void channel_do_open_actions(channel_t *chan); -#endif /* defined(TOR_CHANNEL_INTERNAL_) */ +#endif /* Helper functions to perform operations on channels */ @@ -524,69 +406,34 @@ int channel_send_destroy(circid_t circ_id, channel_t *chan, */ channel_t * channel_connect(const tor_addr_t *addr, uint16_t port, - const char *rsa_id_digest, - const ed25519_public_key_t *ed_id); + const char *id_digest); -channel_t * channel_get_for_extend(const char *rsa_id_digest, - const ed25519_public_key_t *ed_id, +channel_t * channel_get_for_extend(const char *digest, const tor_addr_t *target_addr, const char **msg_out, int *launch_out); /* Ask which of two channels is better for circuit-extension purposes */ -int channel_is_better(channel_t *a, channel_t *b); +int channel_is_better(time_t now, + channel_t *a, channel_t *b, + int forgive_new_connections); /** Channel lookups */ channel_t * channel_find_by_global_id(uint64_t global_identifier); -channel_t * channel_find_by_remote_identity(const char *rsa_id_digest, - const ed25519_public_key_t *ed_id); +channel_t * channel_find_by_remote_digest(const char *identity_digest); /** For things returned by channel_find_by_remote_digest(), walk the list. - * The RSA key will match for all returned elements; the Ed25519 key might not. */ -channel_t * channel_next_with_rsa_identity(channel_t *chan); - -/* - * Helper macros to lookup state of given channel. - */ - -#define CHANNEL_IS_CLOSED(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_CLOSED)) -#define CHANNEL_IS_OPENING(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_OPENING)) -#define CHANNEL_IS_OPEN(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_OPEN)) -#define CHANNEL_IS_MAINT(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_MAINT)) -#define CHANNEL_IS_CLOSING(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_CLOSING)) -#define CHANNEL_IS_ERROR(chan) (channel_is_in_state((chan), \ - CHANNEL_STATE_ERROR)) - -#define CHANNEL_FINISHED(chan) (CHANNEL_IS_CLOSED(chan) || \ - CHANNEL_IS_ERROR(chan)) - -#define CHANNEL_CONDEMNED(chan) (CHANNEL_IS_CLOSING(chan) || \ - CHANNEL_FINISHED(chan)) - -#define CHANNEL_CAN_HANDLE_CELLS(chan) (CHANNEL_IS_OPENING(chan) || \ - CHANNEL_IS_OPEN(chan) || \ - CHANNEL_IS_MAINT(chan)) - -static inline int -channel_is_in_state(channel_t *chan, channel_state_t state) -{ - return chan->state == state; -} +channel_t * channel_next_with_digest(channel_t *chan); /* * Metadata queries/updates */ const char * channel_describe_transport(channel_t *chan); -MOCK_DECL(void, channel_dump_statistics, (channel_t *chan, int severity)); +void channel_dump_statistics(channel_t *chan, int severity); void channel_dump_transport_statistics(channel_t *chan, int severity); const char * channel_get_actual_remote_descr(channel_t *chan); const char * channel_get_actual_remote_address(channel_t *chan); @@ -597,19 +444,17 @@ int channel_is_bad_for_new_circs(channel_t *chan); void channel_mark_bad_for_new_circs(channel_t *chan); int channel_is_canonical(channel_t *chan); int channel_is_canonical_is_reliable(channel_t *chan); -int channel_is_client(const channel_t *chan); +int channel_is_client(channel_t *chan); int channel_is_local(channel_t *chan); int channel_is_incoming(channel_t *chan); int channel_is_outgoing(channel_t *chan); void channel_mark_client(channel_t *chan); -void channel_clear_client(channel_t *chan); int channel_matches_extend_info(channel_t *chan, extend_info_t *extend_info); int channel_matches_target_addr_for_extend(channel_t *chan, const tor_addr_t *target); unsigned int channel_num_circuits(channel_t *chan); -MOCK_DECL(void,channel_set_circid_type,(channel_t *chan, - crypto_pk_t *identity_rcvd, - int consider_identity)); +void channel_set_circid_type(channel_t *chan, crypto_pk_t *identity_rcvd, + int consider_identity); void channel_timestamp_client(channel_t *chan); const char * channel_listener_describe_transport(channel_listener_t *chan_l); @@ -617,27 +462,28 @@ void channel_listener_dump_statistics(channel_listener_t *chan_l, int severity); void channel_listener_dump_transport_statistics(channel_listener_t *chan_l, int severity); -void channel_check_for_duplicates(void); - -void channel_update_bad_for_new_circs(const char *digest, int force); - -/* Flow control queries */ -int channel_num_cells_writeable(channel_t *chan); /* Timestamp queries */ time_t channel_when_created(channel_t *chan); +time_t channel_when_last_active(channel_t *chan); time_t channel_when_last_client(channel_t *chan); +time_t channel_when_last_drained(channel_t *chan); +time_t channel_when_last_recv(channel_t *chan); time_t channel_when_last_xmit(channel_t *chan); +time_t channel_listener_when_created(channel_listener_t *chan_l); +time_t channel_listener_when_last_active(channel_listener_t *chan_l); +time_t channel_listener_when_last_accepted(channel_listener_t *chan_l); + /* Counter queries */ +uint64_t channel_count_recved(channel_t *chan); +uint64_t channel_count_xmitted(channel_t *chan); + +uint64_t channel_listener_count_accepted(channel_listener_t *chan_l); + int packed_cell_is_destroy(channel_t *chan, const packed_cell_t *packed_cell, circid_t *circid_out); -/* Declare the handle helpers */ -HANDLE_DECL(channel, channel_s,) -#define channel_handle_free(h) \ - FREE_AND_NULL(channel_handle_t, channel_handle_free_, (h)) - -#endif /* !defined(TOR_CHANNEL_H) */ +#endif diff --git a/src/tor/src/or/channeltls.c b/src/tor/channeltls.c similarity index 68% rename from src/tor/src/or/channeltls.c rename to src/tor/channeltls.c index 023ccdefd..959ec4744 100644 --- a/src/tor/src/or/channeltls.c +++ b/src/tor/channeltls.c @@ -1,33 +1,9 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file channeltls.c - * - * \brief A concrete subclass of channel_t using or_connection_t to transfer - * cells between Tor instances. - * - * This module fills in the various function pointers in channel_t, to - * implement the channel_tls_t channels as used in Tor today. These channels - * are created from channel_tls_connect() and - * channel_tls_handle_incoming(). Each corresponds 1:1 to or_connection_t - * object, as implemented in connection_or.c. These channels transmit cells - * to the underlying or_connection_t by calling - * connection_or_write_*_cell_to_buf(), and receive cells from the underlying - * or_connection_t when connection_or_process_cells_from_inbuf() calls - * channel_tls_handle_*_cell(). - * - * Here we also implement the server (responder) side of the v3+ Tor link - * handshake, which uses CERTS and AUTHENTICATE cell to negotiate versions, - * exchange expected and observed IP and time information, and bootstrap a - * level of authentication higher than we have gotten on the raw TLS - * handshake. - * - * NOTE: Since there is currently only one type of channel, there are probably - * more than a few cases where functionality that is currently in - * channeltls.c, connection_or.c, and channel.c ought to be divided up - * differently. The right time to do this is probably whenever we introduce - * our next channel type. + * \brief channel_t concrete subclass using or_connection_t **/ /* @@ -37,29 +13,18 @@ #define TOR_CHANNEL_INTERNAL_ -#define CHANNELTLS_PRIVATE - #include "or.h" #include "channel.h" #include "channeltls.h" #include "circuitmux.h" #include "circuitmux_ewma.h" -#include "command.h" #include "config.h" #include "connection.h" #include "connection_or.h" #include "control.h" -#include "entrynodes.h" -#include "link_handshake.h" #include "relay.h" -#include "rephist.h" #include "router.h" #include "routerlist.h" -#include "scheduler.h" -#include "torcert.h" -#include "networkstatus.h" -#include "channelpadding_negotiation.h" -#include "channelpadding.h" /** How many CELL_PADDING cells have we received, ever? */ uint64_t stats_n_padding_cells_processed = 0; @@ -79,14 +44,16 @@ uint64_t stats_n_authenticate_cells_processed = 0; uint64_t stats_n_authorize_cells_processed = 0; /** Active listener, if any */ -static channel_listener_t *channel_tls_listener = NULL; +channel_listener_t *channel_tls_listener = NULL; + +/* Utility function declarations */ +static void channel_tls_common_init(channel_tls_t *tlschan); /* channel_tls_t method declarations */ static void channel_tls_close_method(channel_t *chan); static const char * channel_tls_describe_transport_method(channel_t *chan); static void channel_tls_free_method(channel_t *chan); -static double channel_tls_get_overhead_estimate_method(channel_t *chan); static int channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out); static int @@ -100,8 +67,6 @@ channel_tls_matches_extend_info_method(channel_t *chan, extend_info_t *extend_info); static int channel_tls_matches_target_method(channel_t *chan, const tor_addr_t *target); -static int channel_tls_num_cells_writeable_method(channel_t *chan); -static size_t channel_tls_num_bytes_queued_method(channel_t *chan); static int channel_tls_write_cell_method(channel_t *chan, cell_t *cell); static int channel_tls_write_packed_cell_method(channel_t *chan, @@ -122,18 +87,22 @@ static void channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *tlschan); static void channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *tlschan); +static void channel_tls_process_certs_cell(var_cell_t *cell, + channel_tls_t *tlschan); +static void channel_tls_process_auth_challenge_cell(var_cell_t *cell, + channel_tls_t *tlschan); +static void channel_tls_process_authenticate_cell(var_cell_t *cell, + channel_tls_t *tlschan); static int command_allowed_before_handshake(uint8_t command); static int enter_v3_handshake_with_cell(var_cell_t *cell, channel_tls_t *tlschan); -static void channel_tls_process_padding_negotiate_cell(cell_t *cell, - channel_tls_t *chan); /** * Do parts of channel_tls_t initialization common to channel_tls_connect() * and channel_tls_handle_incoming(). */ -STATIC void +static void channel_tls_common_init(channel_tls_t *tlschan) { channel_t *chan; @@ -146,8 +115,7 @@ channel_tls_common_init(channel_tls_t *tlschan) chan->state = CHANNEL_STATE_OPENING; chan->close = channel_tls_close_method; chan->describe_transport = channel_tls_describe_transport_method; - chan->free_fn = channel_tls_free_method; - chan->get_overhead_estimate = channel_tls_get_overhead_estimate_method; + chan->free = channel_tls_free_method; chan->get_remote_addr = channel_tls_get_remote_addr_method; chan->get_remote_descr = channel_tls_get_remote_descr_method; chan->get_transport_name = channel_tls_get_transport_name_method; @@ -155,8 +123,6 @@ channel_tls_common_init(channel_tls_t *tlschan) chan->is_canonical = channel_tls_is_canonical_method; chan->matches_extend_info = channel_tls_matches_extend_info_method; chan->matches_target = channel_tls_matches_target_method; - chan->num_bytes_queued = channel_tls_num_bytes_queued_method; - chan->num_cells_writeable = channel_tls_num_cells_writeable_method; chan->write_cell = channel_tls_write_cell_method; chan->write_packed_cell = channel_tls_write_packed_cell_method; chan->write_var_cell = channel_tls_write_var_cell_method; @@ -177,8 +143,7 @@ channel_tls_common_init(channel_tls_t *tlschan) channel_t * channel_tls_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id) + const char *id_digest) { channel_tls_t *tlschan = tor_malloc_zero(sizeof(*tlschan)); channel_t *chan = &(tlschan->base_); @@ -191,22 +156,11 @@ channel_tls_connect(const tor_addr_t *addr, uint16_t port, tlschan, U64_PRINTF_ARG(chan->global_identifier)); - if (is_local_addr(addr)) { - log_debug(LD_CHANNEL, - "Marking new outgoing channel " U64_FORMAT " at %p as local", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_local(chan); - } else { - log_debug(LD_CHANNEL, - "Marking new outgoing channel " U64_FORMAT " at %p as remote", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_remote(chan); - } - + if (is_local_addr(addr)) channel_mark_local(chan); channel_mark_outgoing(chan); /* Set up or_connection stuff */ - tlschan->conn = connection_or_connect(addr, port, id_digest, ed_id, tlschan); + tlschan->conn = connection_or_connect(addr, port, id_digest, tlschan); /* connection_or_connect() will fill in tlschan->conn */ if (!(tlschan->conn)) { chan->reason_for_closing = CHANNEL_CLOSE_FOR_ERROR; @@ -332,18 +286,7 @@ channel_tls_handle_incoming(or_connection_t *orconn) tlschan->conn = orconn; orconn->chan = tlschan; - if (is_local_addr(&(TO_CONN(orconn)->addr))) { - log_debug(LD_CHANNEL, - "Marking new incoming channel " U64_FORMAT " at %p as local", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_local(chan); - } else { - log_debug(LD_CHANNEL, - "Marking new incoming channel " U64_FORMAT " at %p as remote", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_remote(chan); - } - + if (is_local_addr(&(TO_CONN(orconn)->addr))) channel_mark_local(chan); channel_mark_incoming(chan); /* Register it */ @@ -469,41 +412,6 @@ channel_tls_free_method(channel_t *chan) } } -/** - * Get an estimate of the average TLS overhead for the upper layer - */ - -static double -channel_tls_get_overhead_estimate_method(channel_t *chan) -{ - double overhead = 1.0; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(tlschan->conn); - - /* Just return 1.0f if we don't have sensible data */ - if (tlschan->conn->bytes_xmitted > 0 && - tlschan->conn->bytes_xmitted_by_tls >= - tlschan->conn->bytes_xmitted) { - overhead = ((double)(tlschan->conn->bytes_xmitted_by_tls)) / - ((double)(tlschan->conn->bytes_xmitted)); - - /* - * Never estimate more than 2.0; otherwise we get silly large estimates - * at the very start of a new TLS connection. - */ - if (overhead > 2.0) - overhead = 2.0; - } - - log_debug(LD_CHANNEL, - "Estimated overhead ratio for TLS chan " U64_FORMAT " is %f", - U64_PRINTF_ARG(chan->global_identifier), overhead); - - return overhead; -} - /** * Get the remote address of a channel_tls_t * @@ -586,7 +494,7 @@ channel_tls_get_remote_descr_method(channel_t *chan, int flags) break; case GRD_FLAG_ORIGINAL: /* Actual address with port */ - addr_str = tor_addr_to_str_dup(&(tlschan->conn->real_addr)); + addr_str = tor_dup_addr(&(tlschan->conn->real_addr)); tor_snprintf(buf, MAX_DESCR_LEN + 1, "%s:%u", addr_str, conn->port); tor_free(addr_str); @@ -599,14 +507,14 @@ channel_tls_get_remote_descr_method(channel_t *chan, int flags) break; case GRD_FLAG_ORIGINAL|GRD_FLAG_ADDR_ONLY: /* Actual address, no port */ - addr_str = tor_addr_to_str_dup(&(tlschan->conn->real_addr)); + addr_str = tor_dup_addr(&(tlschan->conn->real_addr)); strlcpy(buf, addr_str, sizeof(buf)); tor_free(addr_str); answer = buf; break; default: /* Something's broken in channel.c */ - tor_assert_nonfatal_unreached_once(); + tor_assert(1); } } else { strlcpy(buf, "(No connection)", sizeof(buf)); @@ -675,7 +583,7 @@ channel_tls_is_canonical_method(channel_t *chan, int req) break; default: /* This shouldn't happen; channel.c is broken if it does */ - tor_assert_nonfatal_unreached_once(); + tor_assert(1); } } /* else return 0 for tlschan->conn == NULL */ @@ -739,65 +647,9 @@ channel_tls_matches_target_method(channel_t *chan, return 0; } - /* real_addr is the address this connection came from. - * base_.addr is updated by connection_or_init_conn_from_address() - * to be the address in the descriptor. It may be tempting to - * allow either address to be allowed, but if we did so, it would - * enable someone who steals a relay's keys to impersonate/MITM it - * from anywhere on the Internet! (Because they could make long-lived - * TLS connections from anywhere to all relays, and wait for them to - * be used for extends). - */ return tor_addr_eq(&(tlschan->conn->real_addr), target); } -/** - * Tell the upper layer how many bytes we have queued and not yet - * sent. - */ - -static size_t -channel_tls_num_bytes_queued_method(channel_t *chan) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(tlschan->conn); - - return connection_get_outbuf_len(TO_CONN(tlschan->conn)); -} - -/** - * Tell the upper layer how many cells we can accept to write - * - * This implements the num_cells_writeable method for channel_tls_t; it - * returns an estimate of the number of cells we can accept with - * channel_tls_write_*_cell(). - */ - -static int -channel_tls_num_cells_writeable_method(channel_t *chan) -{ - size_t outbuf_len; - ssize_t n; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - size_t cell_network_size; - - tor_assert(tlschan); - tor_assert(tlschan->conn); - - cell_network_size = get_cell_network_size(tlschan->conn->wide_circ_ids); - outbuf_len = connection_get_outbuf_len(TO_CONN(tlschan->conn)); - /* Get the number of cells */ - n = CEIL_DIV(OR_CONN_HIGHWATER - outbuf_len, cell_network_size); - if (n < 0) n = 0; -#if SIZEOF_SIZE_T > SIZEOF_INT - if (n > INT_MAX) n = INT_MAX; -#endif - - return (int)n; -} - /** * Write a cell to a channel_tls_t * @@ -832,34 +684,34 @@ channel_tls_write_cell_method(channel_t *chan, cell_t *cell) * * This implements the write_packed_cell method for channel_tls_t; given a * channel_tls_t and a packed_cell_t, transmit the packed_cell_t. - * - * Return 0 on success or negative value on error. The caller must free the - * packed cell. */ static int channel_tls_write_packed_cell_method(channel_t *chan, packed_cell_t *packed_cell) { - tor_assert(chan); channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); size_t cell_network_size = get_cell_network_size(chan->wide_circ_ids); + int written = 0; tor_assert(tlschan); tor_assert(packed_cell); if (tlschan->conn) { - connection_buf_add(packed_cell->body, cell_network_size, + connection_write_to_buf(packed_cell->body, cell_network_size, TO_CONN(tlschan->conn)); + + /* This is where the cell is finished; used to be done from relay.c */ + packed_cell_free(packed_cell); + ++written; } else { log_info(LD_CHANNEL, "something called write_packed_cell on a tlschan " "(%p with ID " U64_FORMAT " but no conn", chan, U64_PRINTF_ARG(chan->global_identifier)); - return -1; } - return 0; + return written; } /** @@ -973,18 +825,18 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, tor_assert(conn); tor_assert(conn->chan == chan); tor_assert(chan->conn == conn); - /* Shut the compiler up without triggering -Wtautological-compare */ - (void)old_state; + /* -Werror appeasement */ + tor_assert(old_state == old_state); base_chan = TLS_CHAN_TO_BASE(chan); - /* Make sure the base connection state makes sense - shouldn't be error - * or closed. */ + /* Make sure the base connection state makes sense - shouldn't be error, + * closed or listening. */ - tor_assert(CHANNEL_IS_OPENING(base_chan) || - CHANNEL_IS_OPEN(base_chan) || - CHANNEL_IS_MAINT(base_chan) || - CHANNEL_IS_CLOSING(base_chan)); + tor_assert(base_chan->state == CHANNEL_STATE_OPENING || + base_chan->state == CHANNEL_STATE_OPEN || + base_chan->state == CHANNEL_STATE_MAINT || + base_chan->state == CHANNEL_STATE_CLOSING); /* Did we just go to state open? */ if (state == OR_CONN_STATE_OPEN) { @@ -992,22 +844,70 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, * We can go to CHANNEL_STATE_OPEN from CHANNEL_STATE_OPENING or * CHANNEL_STATE_MAINT on this. */ - channel_change_state_open(base_chan); - /* We might have just become writeable; check and tell the scheduler */ - if (connection_or_num_cells_writeable(conn) > 0) { - scheduler_channel_wants_writes(base_chan); - } + channel_change_state(base_chan, CHANNEL_STATE_OPEN); } else { /* * Not open, so from CHANNEL_STATE_OPEN we go to CHANNEL_STATE_MAINT, * otherwise no change. */ - if (CHANNEL_IS_OPEN(base_chan)) { + if (base_chan->state == CHANNEL_STATE_OPEN) { channel_change_state(base_chan, CHANNEL_STATE_MAINT); } } } +/** + * Flush cells from a channel_tls_t + * + * Try to flush up to about num_cells cells, and return how many we flushed. + */ + +ssize_t +channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells) +{ + ssize_t flushed = 0; + + tor_assert(chan); + + if (flushed >= num_cells) goto done; + + /* + * If channel_tls_t ever buffers anything below the channel_t layer, flush + * that first here. + */ + + flushed += channel_flush_some_cells(TLS_CHAN_TO_BASE(chan), + num_cells - flushed); + + /* + * If channel_tls_t ever buffers anything below the channel_t layer, check + * how much we actually got and push it on down here. + */ + + done: + return flushed; +} + +/** + * Check if a channel_tls_t has anything to flush + * + * Return true if there is any more to flush on this channel (cells in queue + * or active circuits). + */ + +int +channel_tls_more_to_flush(channel_tls_t *chan) +{ + tor_assert(chan); + + /* + * If channel_tls_t ever buffers anything below channel_t, the + * check for that should go here first. + */ + + return channel_more_to_flush(TLS_CHAN_TO_BASE(chan)); +} + #ifdef KEEP_TIMING_STATS /** @@ -1043,7 +943,7 @@ channel_tls_time_process_cell(cell_t *cell, channel_tls_t *chan, int *time, *time += time_passed; } -#endif /* defined(KEEP_TIMING_STATS) */ +#endif /** * Handle an incoming cell on a channel_tls_t @@ -1052,11 +952,6 @@ channel_tls_time_process_cell(cell_t *cell, channel_tls_t *chan, int *time, * for cell types specific to the handshake for this transport protocol and * handles them, and queues all other cells to the channel_t layer, which * eventually will hand them off to command.c. - * - * The channel layer itself decides whether the cell should be queued or - * can be handed off immediately to the upper-layer code. It is responsible - * for copying in the case that it queues; we merely pass pointers through - * which we get from connection_or_process_cells_from_inbuf(). */ void @@ -1071,9 +966,9 @@ channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) channel_tls_time_process_cell(cl, cn, & tp ## time , \ channel_tls_process_ ## tp ## _cell); \ } STMT_END -#else /* !(defined(KEEP_TIMING_STATS)) */ +#else #define PROCESS_CELL(tp, cl, cn) channel_tls_process_ ## tp ## _cell(cl, cn) -#endif /* defined(KEEP_TIMING_STATS) */ +#endif tor_assert(cell); tor_assert(conn); @@ -1108,19 +1003,8 @@ channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) or_handshake_state_record_cell(conn, conn->handshake_state, cell, 1); - /* We note that we're on the internet whenever we read a cell. This is - * a fast operation. */ - entry_guards_note_internet_connectivity(get_guard_selection_info()); - rep_hist_padding_count_read(PADDING_TYPE_TOTAL); - - if (TLS_CHAN_TO_BASE(chan)->currently_padding) - rep_hist_padding_count_read(PADDING_TYPE_ENABLED_TOTAL); - switch (cell->command) { case CELL_PADDING: - rep_hist_padding_count_read(PADDING_TYPE_CELL); - if (TLS_CHAN_TO_BASE(chan)->currently_padding) - rep_hist_padding_count_read(PADDING_TYPE_ENABLED_CELL); ++stats_n_padding_cells_processed; /* do nothing */ break; @@ -1131,10 +1015,6 @@ channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) ++stats_n_netinfo_cells_processed; PROCESS_CELL(netinfo, cell, chan); break; - case CELL_PADDING_NEGOTIATE: - ++stats_n_netinfo_cells_processed; - PROCESS_CELL(padding_negotiate, cell, chan); - break; case CELL_CREATE: case CELL_CREATE_FAST: case CELL_CREATED: @@ -1148,7 +1028,7 @@ channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) * These are all transport independent and we pass them up through the * channel_t mechanism. They are ultimately handled in command.c. */ - channel_process_cell(TLS_CHAN_TO_BASE(chan), cell); + channel_queue_cell(TLS_CHAN_TO_BASE(chan), cell); break; default: log_fn(LOG_INFO, LD_PROTOCOL, @@ -1169,12 +1049,6 @@ channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) * related and live below the channel_t layer, so no variable-length * cells ever get delivered in the current implementation, but I've left * the mechanism in place for future use. - * - * If we were handing them off to the upper layer, the channel_t queueing - * code would be responsible for memory management, and we'd just be passing - * pointers through from connection_or_process_cells_from_inbuf(). That - * caller always frees them after this function returns, so this function - * should never free var_cell. */ void @@ -1203,7 +1077,7 @@ channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn) /* remember which second it is, for next time */ current_second = now; } -#endif /* defined(KEEP_TIMING_STATS) */ +#endif tor_assert(var_cell); tor_assert(conn); @@ -1245,8 +1119,6 @@ channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn) * notice "hey, data arrived!" before we notice "hey, the handshake * finished!" And we need to be accepting both at once to handle both * the v2 and v3 handshakes. */ - /* But that should be happening any longer've disabled bufferevents. */ - tor_assert_nonfatal_unreached_once(); /* fall through */ case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: @@ -1301,10 +1173,6 @@ channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn) return; } - /* We note that we're on the internet whenever we read a cell. This is - * a fast operation. */ - entry_guards_note_internet_connectivity(get_guard_selection_info()); - /* Now handle the cell */ switch (var_cell->command) { @@ -1340,44 +1208,6 @@ channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn) } } -/** - * Update channel marks after connection_or.c has changed an address - * - * This is called from connection_or_init_conn_from_address() after the - * connection's _base.addr or real_addr fields have potentially been changed - * so we can recalculate the local mark. Notably, this happens when incoming - * connections are reverse-proxied and we only learn the real address of the - * remote router by looking it up in the consensus after we finish the - * handshake and know an authenticated identity digest. - */ - -void -channel_tls_update_marks(or_connection_t *conn) -{ - channel_t *chan = NULL; - - tor_assert(conn); - tor_assert(conn->chan); - - chan = TLS_CHAN_TO_BASE(conn->chan); - - if (is_local_addr(&(TO_CONN(conn)->addr))) { - if (!channel_is_local(chan)) { - log_debug(LD_CHANNEL, - "Marking channel " U64_FORMAT " at %p as local", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_local(chan); - } - } else { - if (channel_is_local(chan)) { - log_debug(LD_CHANNEL, - "Marking channel " U64_FORMAT " at %p as remote", - U64_PRINTF_ARG(chan->global_identifier), chan); - channel_mark_remote(chan); - } - } -} - /** * Check if this cell type is allowed before the handshake is finished * @@ -1452,6 +1282,7 @@ static void channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) { int highest_supported_version = 0; + const uint8_t *cp, *end; int started_here = 0; tor_assert(cell); @@ -1491,15 +1322,11 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) } tor_assert(chan->conn->handshake_state); - - { - int i; - const uint8_t *cp = cell->payload; - for (i = 0; i < cell->payload_len / 2; ++i, cp += 2) { - uint16_t v = ntohs(get_uint16(cp)); - if (is_or_protocol_version_known(v) && v > highest_supported_version) - highest_supported_version = v; - } + end = cell->payload + cell->payload_len; + for (cp = cell->payload; cp+1 < end; cp += 2) { + uint16_t v = ntohs(get_uint16(cp)); + if (is_or_protocol_version_known(v) && v > highest_supported_version) + highest_supported_version = v; } if (!highest_supported_version) { log_fn(LOG_PROTOCOL_WARN, LD_OR, @@ -1533,8 +1360,6 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) return; } - rep_hist_note_negotiated_link_proto(highest_supported_version, started_here); - chan->conn->link_proto = highest_supported_version; chan->conn->handshake_state->received_versions = 1; @@ -1578,7 +1403,7 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) connection_or_close_normally(chan->conn, 1); return; } -#endif /* defined(DISABLE_V3_LINKPROTO_SERVERSIDE) */ +#endif if (send_versions) { if (connection_or_send_versions(chan->conn, 1) < 0) { @@ -1590,12 +1415,9 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) /* We set this after sending the verions cell. */ /*XXXXX symbolic const.*/ - TLS_CHAN_TO_BASE(chan)->wide_circ_ids = + chan->base_.wide_circ_ids = chan->conn->link_proto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS; - chan->conn->wide_circ_ids = TLS_CHAN_TO_BASE(chan)->wide_circ_ids; - - TLS_CHAN_TO_BASE(chan)->padding_enabled = - chan->conn->link_proto >= MIN_LINK_PROTO_FOR_CHANNEL_PADDING; + chan->conn->wide_circ_ids = chan->base_.wide_circ_ids; if (send_certs) { if (connection_or_send_certs_cell(chan->conn) < 0) { @@ -1621,43 +1443,6 @@ channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) } } -/** - * Process a 'padding_negotiate' cell - * - * This function is called to handle an incoming PADDING_NEGOTIATE cell; - * enable or disable padding accordingly, and read and act on its timeout - * value contents. - */ -static void -channel_tls_process_padding_negotiate_cell(cell_t *cell, channel_tls_t *chan) -{ - channelpadding_negotiate_t *negotiation; - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - - if (chan->conn->link_proto < MIN_LINK_PROTO_FOR_CHANNEL_PADDING) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a PADDING_NEGOTIATE cell on v%d connection; dropping.", - chan->conn->link_proto); - return; - } - - if (channelpadding_negotiate_parse(&negotiation, cell->payload, - CELL_PAYLOAD_SIZE) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received malformed PADDING_NEGOTIATE cell on v%d connection; " - "dropping.", chan->conn->link_proto); - - return; - } - - channelpadding_update_padding_for_channel(TLS_CHAN_TO_BASE(chan), - negotiation); - - channelpadding_negotiate_free(negotiation); -} - /** * Process a 'netinfo' cell * @@ -1675,12 +1460,9 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) const uint8_t *cp, *end; uint8_t n_other_addrs; time_t now = time(NULL); - const routerinfo_t *me = router_get_my_routerinfo(); long apparent_skew = 0; tor_addr_t my_apparent_addr = TOR_ADDR_NULL; - int started_here = 0; - const char *identity_digest = NULL; tor_assert(cell); tor_assert(chan); @@ -1700,12 +1482,10 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) } tor_assert(chan->conn->handshake_state && chan->conn->handshake_state->received_versions); - started_here = connection_or_nonopen_was_started_here(chan->conn); - identity_digest = chan->conn->identity_digest; if (chan->conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) { tor_assert(chan->conn->link_proto >= 3); - if (started_here) { + if (chan->conn->handshake_state->started_here) { if (!(chan->conn->handshake_state->authenticated)) { log_fn(LOG_PROTOCOL_WARN, LD_OR, "Got a NETINFO cell from server, " @@ -1719,24 +1499,15 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) if (!(chan->conn->handshake_state->authenticated)) { tor_assert(tor_digest_is_zero( (const char*)(chan->conn->handshake_state-> - authenticated_rsa_peer_id))); - tor_assert(tor_mem_is_zero( - (const char*)(chan->conn->handshake_state-> - authenticated_ed25519_peer_id.pubkey), 32)); - /* If the client never authenticated, it's a tor client or bridge - * relay, and we must not use it for EXTEND requests (nor could we, as - * there are no authenticated peer IDs) */ - channel_mark_client(TLS_CHAN_TO_BASE(chan)); + authenticated_peer_id))); channel_set_circid_type(TLS_CHAN_TO_BASE(chan), NULL, chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); connection_or_init_conn_from_address(chan->conn, &(chan->conn->base_.addr), chan->conn->base_.port, - /* zero, checked above */ (const char*)(chan->conn->handshake_state-> - authenticated_rsa_peer_id), - NULL, /* Ed25519 ID: Also checked as zero */ + authenticated_peer_id), 0); } } @@ -1762,20 +1533,8 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) if (my_addr_type == RESOLVED_TYPE_IPV4 && my_addr_len == 4) { tor_addr_from_ipv4n(&my_apparent_addr, get_uint32(my_addr_ptr)); - - if (!get_options()->BridgeRelay && me && - get_uint32(my_addr_ptr) == htonl(me->addr)) { - TLS_CHAN_TO_BASE(chan)->is_canonical_to_peer = 1; - } - } else if (my_addr_type == RESOLVED_TYPE_IPV6 && my_addr_len == 16) { tor_addr_from_ipv6_bytes(&my_apparent_addr, (const char *) my_addr_ptr); - - if (!get_options()->BridgeRelay && me && - !tor_addr_is_null(&me->ipv6_addr) && - tor_addr_eq(&my_apparent_addr, &me->ipv6_addr)) { - TLS_CHAN_TO_BASE(chan)->is_canonical_to_peer = 1; - } } n_other_addrs = (uint8_t) *cp++; @@ -1791,45 +1550,43 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) connection_or_close_for_error(chan->conn, 0); return; } - /* A relay can connect from anywhere and be canonical, so - * long as it tells you from where it came. This may sound a bit - * concerning... but that's what "canonical" means: that the - * address is one that the relay itself has claimed. The relay - * might be doing something funny, but nobody else is doing a MITM - * on the relay's TCP. - */ if (tor_addr_eq(&addr, &(chan->conn->real_addr))) { - connection_or_set_canonical(chan->conn, 1); + chan->conn->is_canonical = 1; break; } cp = next; --n_other_addrs; } - if (me && !TLS_CHAN_TO_BASE(chan)->is_canonical_to_peer && - channel_is_canonical(TLS_CHAN_TO_BASE(chan))) { - const char *descr = - TLS_CHAN_TO_BASE(chan)->get_remote_descr(TLS_CHAN_TO_BASE(chan), 0); - log_info(LD_OR, - "We made a connection to a relay at %s (fp=%s) but we think " - "they will not consider this connection canonical. They " - "think we are at %s, but we think its %s.", - safe_str(descr), - safe_str(hex_str(identity_digest, DIGEST_LEN)), - safe_str(tor_addr_is_null(&my_apparent_addr) ? - "" : fmt_and_decorate_addr(&my_apparent_addr)), - safe_str(fmt_addr32(me->addr))); - } - /* Act on apparent skew. */ /** Warn when we get a netinfo skew with at least this value. */ #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && - (started_here || - connection_or_digest_is_known_relay(chan->conn->identity_digest))) { - int trusted = router_digest_is_trusted_dir(chan->conn->identity_digest); - clock_skew_warning(TO_CONN(chan->conn), apparent_skew, trusted, LD_GENERAL, - "NETINFO cell", "OR"); + router_get_by_id_digest(chan->conn->identity_digest)) { + char dbuf[64]; + int severity; + /*XXXX be smarter about when everybody says we are skewed. */ + if (router_digest_is_trusted_dir(chan->conn->identity_digest)) + severity = LOG_WARN; + else + severity = LOG_INFO; + format_time_interval(dbuf, sizeof(dbuf), apparent_skew); + log_fn(severity, LD_GENERAL, + "Received NETINFO cell with skewed time from " + "server at %s:%d. It seems that our clock is %s by %s, or " + "that theirs is %s. Tor requires an accurate clock to work: " + "please check your time and date settings.", + chan->conn->base_.address, + (int)(chan->conn->base_.port), + apparent_skew > 0 ? "ahead" : "behind", + dbuf, + apparent_skew > 0 ? "behind" : "ahead"); + if (severity == LOG_WARN) /* only tell the controller if an authority */ + control_event_general_status(LOG_WARN, + "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", + apparent_skew, + chan->conn->base_.address, + chan->conn->base_.port); } /* XXX maybe act on my_apparent_addr, if the source is sufficiently @@ -1860,48 +1617,14 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) safe_str_client(chan->conn->base_.address), chan->conn->base_.port, (int)(chan->conn->link_proto), - hex_str(identity_digest, DIGEST_LEN), + hex_str(TLS_CHAN_TO_BASE(chan)->identity_digest, + DIGEST_LEN), tor_addr_is_null(&my_apparent_addr) ? "" : fmt_and_decorate_addr(&my_apparent_addr)); } assert_connection_ok(TO_CONN(chan->conn),time(NULL)); } -/** Types of certificates that we know how to parse from CERTS cells. Each - * type corresponds to a different encoding format. */ -typedef enum cert_encoding_t { - CERT_ENCODING_UNKNOWN, /**< We don't recognize this. */ - CERT_ENCODING_X509, /**< It's an RSA key, signed with RSA, encoded in x509. - * (Actually, it might not be RSA. We test that later.) */ - CERT_ENCODING_ED25519, /**< It's something signed with an Ed25519 key, - * encoded asa a tor_cert_t.*/ - CERT_ENCODING_RSA_CROSSCERT, /**< It's an Ed key signed with an RSA key. */ -} cert_encoding_t; - -/** - * Given one of the certificate type codes used in a CERTS cell, - * return the corresponding cert_encoding_t that we should use to parse - * the certificate. - */ -static cert_encoding_t -certs_cell_typenum_to_cert_type(int typenum) -{ - switch (typenum) { - case CERTTYPE_RSA1024_ID_LINK: - case CERTTYPE_RSA1024_ID_ID: - case CERTTYPE_RSA1024_ID_AUTH: - return CERT_ENCODING_X509; - case CERTTYPE_ED_ID_SIGN: - case CERTTYPE_ED_SIGN_LINK: - case CERTTYPE_ED_SIGN_AUTH: - return CERT_ENCODING_ED25519; - case CERTTYPE_RSA1024_ID_EDID: - return CERT_ENCODING_RSA_CROSSCERT; - default: - return CERT_ENCODING_UNKNOWN; - } -} - /** * Process a CERTS cell from a channel. * @@ -1917,24 +1640,17 @@ certs_cell_typenum_to_cert_type(int typenum) * of the connection, we then authenticate the server or mark the connection. * If it's the server side, wait for an AUTHENTICATE cell. */ -STATIC void + +static void channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) { -#define MAX_CERT_TYPE_WANTED CERTTYPE_RSA1024_ID_EDID - /* These arrays will be sparse, since a cert type can be at most one - * of ed/x509 */ - tor_x509_cert_t *x509_certs[MAX_CERT_TYPE_WANTED + 1]; - tor_cert_t *ed_certs[MAX_CERT_TYPE_WANTED + 1]; - uint8_t *rsa_ed_cc_cert = NULL; - size_t rsa_ed_cc_cert_len = 0; - + tor_cert_t *link_cert = NULL; + tor_cert_t *id_cert = NULL; + tor_cert_t *auth_cert = NULL; + uint8_t *ptr; int n_certs, i; - certs_cell_t *cc = NULL; - - int send_netinfo = 0, started_here = 0; + int send_netinfo = 0; - memset(x509_certs, 0, sizeof(x509_certs)); - memset(ed_certs, 0, sizeof(ed_certs)); tor_assert(cell); tor_assert(chan); tor_assert(chan->conn); @@ -1949,11 +1665,6 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) goto err; \ } while (0) - /* Can't use connection_or_nonopen_was_started_here(); its conn->tls - * check looks like it breaks - * test_link_handshake_recv_certs_ok_server(). */ - started_here = chan->conn->handshake_state->started_here; - if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) ERR("We're not doing a v3 handshake!"); if (chan->conn->link_proto < 3) @@ -1969,163 +1680,108 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) if (cell->circ_id) ERR("It had a nonzero circuit ID"); - if (certs_cell_parse(&cc, cell->payload, cell->payload_len) < 0) - ERR("It couldn't be parsed."); - - n_certs = cc->n_certs; - + n_certs = cell->payload[0]; + ptr = cell->payload + 1; for (i = 0; i < n_certs; ++i) { - certs_cell_cert_t *c = certs_cell_get_certs(cc, i); - - uint16_t cert_type = c->cert_type; - uint16_t cert_len = c->cert_len; - uint8_t *cert_body = certs_cell_cert_getarray_body(c); - - if (cert_type > MAX_CERT_TYPE_WANTED) - continue; - const cert_encoding_t ct = certs_cell_typenum_to_cert_type(cert_type); - switch (ct) { - default: - case CERT_ENCODING_UNKNOWN: - break; - case CERT_ENCODING_X509: { - tor_x509_cert_t *x509_cert = tor_x509_cert_decode(cert_body, cert_len); - if (!x509_cert) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received undecodable certificate in CERTS cell from %s:%d", - safe_str(chan->conn->base_.address), + uint8_t cert_type; + uint16_t cert_len; + if (ptr + 3 > cell->payload + cell->payload_len) { + goto truncated; + } + cert_type = *ptr; + cert_len = ntohs(get_uint16(ptr+1)); + if (ptr + 3 + cert_len > cell->payload + cell->payload_len) { + goto truncated; + } + if (cert_type == OR_CERT_TYPE_TLS_LINK || + cert_type == OR_CERT_TYPE_ID_1024 || + cert_type == OR_CERT_TYPE_AUTH_1024) { + tor_cert_t *cert = tor_cert_decode(ptr + 3, cert_len); + if (!cert) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Received undecodable certificate in CERTS cell from %s:%d", + safe_str(chan->conn->base_.address), chan->conn->base_.port); - } else { - if (x509_certs[cert_type]) { - tor_x509_cert_free(x509_cert); - ERR("Duplicate x509 certificate"); - } else { - x509_certs[cert_type] = x509_cert; + } else { + if (cert_type == OR_CERT_TYPE_TLS_LINK) { + if (link_cert) { + tor_cert_free(cert); + ERR("Too many TLS_LINK certificates"); } - } - break; - } - case CERT_ENCODING_ED25519: { - tor_cert_t *ed_cert = tor_cert_parse(cert_body, cert_len); - if (!ed_cert) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received undecodable Ed certificate " - "in CERTS cell from %s:%d", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - } else { - if (ed_certs[cert_type]) { - tor_cert_free(ed_cert); - ERR("Duplicate Ed25519 certificate"); - } else { - ed_certs[cert_type] = ed_cert; + link_cert = cert; + } else if (cert_type == OR_CERT_TYPE_ID_1024) { + if (id_cert) { + tor_cert_free(cert); + ERR("Too many ID_1024 certificates"); } - } - break; - } - - case CERT_ENCODING_RSA_CROSSCERT: { - if (rsa_ed_cc_cert) { - ERR("Duplicate RSA->Ed25519 crosscert"); + id_cert = cert; + } else if (cert_type == OR_CERT_TYPE_AUTH_1024) { + if (auth_cert) { + tor_cert_free(cert); + ERR("Too many AUTH_1024 certificates"); + } + auth_cert = cert; } else { - rsa_ed_cc_cert = tor_memdup(cert_body, cert_len); - rsa_ed_cc_cert_len = cert_len; + tor_cert_free(cert); } - break; } } - } + ptr += 3 + cert_len; + continue; - /* Move the certificates we (might) want into the handshake_state->certs - * structure. */ - tor_x509_cert_t *id_cert = x509_certs[CERTTYPE_RSA1024_ID_ID]; - tor_x509_cert_t *auth_cert = x509_certs[CERTTYPE_RSA1024_ID_AUTH]; - tor_x509_cert_t *link_cert = x509_certs[CERTTYPE_RSA1024_ID_LINK]; - chan->conn->handshake_state->certs->auth_cert = auth_cert; - chan->conn->handshake_state->certs->link_cert = link_cert; - chan->conn->handshake_state->certs->id_cert = id_cert; - x509_certs[CERTTYPE_RSA1024_ID_ID] = - x509_certs[CERTTYPE_RSA1024_ID_AUTH] = - x509_certs[CERTTYPE_RSA1024_ID_LINK] = NULL; - - tor_cert_t *ed_id_sign = ed_certs[CERTTYPE_ED_ID_SIGN]; - tor_cert_t *ed_sign_link = ed_certs[CERTTYPE_ED_SIGN_LINK]; - tor_cert_t *ed_sign_auth = ed_certs[CERTTYPE_ED_SIGN_AUTH]; - chan->conn->handshake_state->certs->ed_id_sign = ed_id_sign; - chan->conn->handshake_state->certs->ed_sign_link = ed_sign_link; - chan->conn->handshake_state->certs->ed_sign_auth = ed_sign_auth; - ed_certs[CERTTYPE_ED_ID_SIGN] = - ed_certs[CERTTYPE_ED_SIGN_LINK] = - ed_certs[CERTTYPE_ED_SIGN_AUTH] = NULL; - - chan->conn->handshake_state->certs->ed_rsa_crosscert = rsa_ed_cc_cert; - chan->conn->handshake_state->certs->ed_rsa_crosscert_len = - rsa_ed_cc_cert_len; - rsa_ed_cc_cert = NULL; - - int severity; - /* Note that this warns more loudly about time and validity if we were - * _trying_ to connect to an authority, not necessarily if we _did_ connect - * to one. */ - if (started_here && - router_digest_is_trusted_dir(TLS_CHAN_TO_BASE(chan)->identity_digest)) - severity = LOG_WARN; - else - severity = LOG_PROTOCOL_WARN; - - const ed25519_public_key_t *checked_ed_id = NULL; - const common_digests_t *checked_rsa_id = NULL; - or_handshake_certs_check_both(severity, - chan->conn->handshake_state->certs, - chan->conn->tls, - time(NULL), - &checked_ed_id, - &checked_rsa_id); - - if (!checked_rsa_id) - ERR("Invalid certificate chain!"); + truncated: + ERR("It ends in the middle of a certificate"); + } - if (started_here) { - /* No more information is needed. */ + if (chan->conn->handshake_state->started_here) { + int severity; + if (! (id_cert && link_cert)) + ERR("The certs we wanted were missing"); + /* Okay. We should be able to check the certificates now. */ + if (! tor_tls_cert_matches_key(chan->conn->tls, link_cert)) { + ERR("The link certificate didn't match the TLS public key"); + } + /* Note that this warns more loudly about time and validity if we were + * _trying_ to connect to an authority, not necessarily if we _did_ connect + * to one. */ + if (router_digest_is_trusted_dir( + TLS_CHAN_TO_BASE(chan)->identity_digest)) + severity = LOG_WARN; + else + severity = LOG_PROTOCOL_WARN; + + if (! tor_tls_cert_is_valid(severity, link_cert, id_cert, 0)) + ERR("The link certificate was not valid"); + if (! tor_tls_cert_is_valid(severity, id_cert, id_cert, 1)) + ERR("The ID certificate was not valid"); chan->conn->handshake_state->authenticated = 1; - chan->conn->handshake_state->authenticated_rsa = 1; { - const common_digests_t *id_digests = checked_rsa_id; + const digests_t *id_digests = tor_cert_get_id_digests(id_cert); crypto_pk_t *identity_rcvd; if (!id_digests) ERR("Couldn't compute digests for key in ID cert"); identity_rcvd = tor_tls_cert_get_key(id_cert); - if (!identity_rcvd) { - ERR("Couldn't get RSA key from ID cert."); - } - memcpy(chan->conn->handshake_state->authenticated_rsa_peer_id, + if (!identity_rcvd) + ERR("Internal error: Couldn't get RSA key from ID cert."); + memcpy(chan->conn->handshake_state->authenticated_peer_id, id_digests->d[DIGEST_SHA1], DIGEST_LEN); channel_set_circid_type(TLS_CHAN_TO_BASE(chan), identity_rcvd, chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); crypto_pk_free(identity_rcvd); } - if (checked_ed_id) { - chan->conn->handshake_state->authenticated_ed25519 = 1; - memcpy(&chan->conn->handshake_state->authenticated_ed25519_peer_id, - checked_ed_id, sizeof(ed25519_public_key_t)); - } - - log_debug(LD_HANDSHAKE, "calling client_learned_peer_id from " - "process_certs_cell"); - if (connection_or_client_learned_peer_id(chan->conn, - chan->conn->handshake_state->authenticated_rsa_peer_id, - checked_ed_id) < 0) + chan->conn->handshake_state->authenticated_peer_id) < 0) ERR("Problem setting or checking peer id"); - log_info(LD_HANDSHAKE, - "Got some good certificates from %s:%d: Authenticated it with " - "RSA%s", - safe_str(chan->conn->base_.address), chan->conn->base_.port, - checked_ed_id ? " and Ed25519" : ""); + log_info(LD_OR, + "Got some good certificates from %s:%d: Authenticated it.", + safe_str(chan->conn->base_.address), chan->conn->base_.port); + + chan->conn->handshake_state->id_cert = id_cert; + id_cert = NULL; if (!public_server_mode(get_options())) { /* If we initiated the connection and we are not a public server, we @@ -2134,14 +1790,25 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) send_netinfo = 1; } } else { - /* We can't call it authenticated till we see an AUTHENTICATE cell. */ + if (! (id_cert && auth_cert)) + ERR("The certs we wanted were missing"); + + /* Remember these certificates so we can check an AUTHENTICATE cell */ + if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, auth_cert, id_cert, 1)) + ERR("The authentication certificate was not valid"); + if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, id_cert, id_cert, 1)) + ERR("The ID certificate was not valid"); + log_info(LD_OR, - "Got some good RSA%s certificates from %s:%d. " + "Got some good certificates from %s:%d: " "Waiting for AUTHENTICATE.", - checked_ed_id ? " and Ed25519" : "", safe_str(chan->conn->base_.address), chan->conn->base_.port); /* XXXX check more stuff? */ + + chan->conn->handshake_state->id_cert = id_cert; + chan->conn->handshake_state->auth_cert = auth_cert; + id_cert = auth_cert = NULL; } chan->conn->handshake_state->received_certs_cell = 1; @@ -2155,14 +1822,9 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) } err: - for (unsigned u = 0; u < ARRAY_LENGTH(x509_certs); ++u) { - tor_x509_cert_free(x509_certs[u]); - } - for (unsigned u = 0; u < ARRAY_LENGTH(ed_certs); ++u) { - tor_cert_free(ed_certs[u]); - } - tor_free(rsa_ed_cc_cert); - certs_cell_free(cc); + tor_cert_free(id_cert); + tor_cert_free(link_cert); + tor_cert_free(auth_cert); #undef ERR } @@ -2177,11 +1839,11 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) * want to authenticate, send an AUTHENTICATE cell and then a NETINFO cell. */ -STATIC void +static void channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) { int n_types, i, use_type = -1; - auth_challenge_cell_t *ac = NULL; + uint8_t *cp; tor_assert(cell); tor_assert(chan); @@ -2194,7 +1856,7 @@ channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) safe_str(chan->conn->base_.address), \ chan->conn->base_.port, (s)); \ connection_or_close_for_error(chan->conn, 0); \ - goto done; \ + return; \ } while (0) if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) @@ -2207,23 +1869,21 @@ channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) ERR("We already received one"); if (!(chan->conn->handshake_state->received_certs_cell)) ERR("We haven't gotten a CERTS cell yet"); + if (cell->payload_len < OR_AUTH_CHALLENGE_LEN + 2) + ERR("It was too short"); if (cell->circ_id) ERR("It had a nonzero circuit ID"); - if (auth_challenge_cell_parse(&ac, cell->payload, cell->payload_len) < 0) - ERR("It was not well-formed."); - - n_types = ac->n_methods; + n_types = ntohs(get_uint16(cell->payload + OR_AUTH_CHALLENGE_LEN)); + if (cell->payload_len < OR_AUTH_CHALLENGE_LEN + 2 + 2*n_types) + ERR("It looks truncated"); /* Now see if there is an authentication type we can use */ - for (i = 0; i < n_types; ++i) { - uint16_t authtype = auth_challenge_cell_get_methods(ac, i); - if (authchallenge_type_is_supported(authtype)) { - if (use_type == -1 || - authchallenge_type_is_better(authtype, use_type)) { - use_type = authtype; - } - } + cp = cell->payload+OR_AUTH_CHALLENGE_LEN + 2; + for (i = 0; i < n_types; ++i, cp += 2) { + uint16_t authtype = ntohs(get_uint16(cp)); + if (authtype == AUTHTYPE_RSA_SHA256_TLSSECRET) + use_type = authtype; } chan->conn->handshake_state->received_auth_challenge = 1; @@ -2232,22 +1892,21 @@ channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) /* If we're not a public server then we don't want to authenticate on a connection we originated, and we already sent a NETINFO cell when we got the CERTS cell. We have nothing more to do. */ - goto done; + return; } if (use_type >= 0) { log_info(LD_OR, "Got an AUTH_CHALLENGE cell from %s:%d: Sending " - "authentication type %d", + "authentication", safe_str(chan->conn->base_.address), - chan->conn->base_.port, - use_type); + chan->conn->base_.port); if (connection_or_send_authenticate_cell(chan->conn, use_type) < 0) { log_warn(LD_OR, "Couldn't send authenticate cell"); connection_or_close_for_error(chan->conn, 0); - goto done; + return; } } else { log_info(LD_OR, @@ -2260,12 +1919,9 @@ channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) if (connection_or_send_netinfo(chan->conn) < 0) { log_warn(LD_OR, "Couldn't send netinfo cell"); connection_or_close_for_error(chan->conn, 0); - goto done; + return; } - done: - auth_challenge_cell_free(ac); - #undef ERR } @@ -2279,14 +1935,12 @@ channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) * the identity of the router on the other side of the connection. */ -STATIC void +static void channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) { - var_cell_t *expected_cell = NULL; + uint8_t expected[V3_AUTH_FIXED_PART_LEN]; const uint8_t *auth; int authlen; - int authtype; - int bodylen; tor_assert(cell); tor_assert(chan); @@ -2299,7 +1953,6 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) safe_str(chan->conn->base_.address), \ chan->conn->base_.port, (s)); \ connection_or_close_for_error(chan->conn, 0); \ - var_cell_free(expected_cell); \ return; \ } while (0) @@ -2317,7 +1970,9 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) } if (!(chan->conn->handshake_state->received_certs_cell)) ERR("We never got a certs cell"); - if (chan->conn->handshake_state->certs->id_cert == NULL) + if (chan->conn->handshake_state->auth_cert == NULL) + ERR("We never got an authentication certificate"); + if (chan->conn->handshake_state->id_cert == NULL) ERR("We never got an identity certificate"); if (cell->payload_len < 4) ERR("Cell was way too short"); @@ -2329,9 +1984,8 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) if (4 + len > cell->payload_len) ERR("Authenticator was truncated"); - if (! authchallenge_type_is_supported(type)) + if (type != AUTHTYPE_RSA_SHA256_TLSSECRET) ERR("Authenticator type was not recognized"); - authtype = type; auth += 4; authlen = len; @@ -2340,55 +1994,23 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) if (authlen < V3_AUTH_BODY_LEN + 1) ERR("Authenticator was too short"); - expected_cell = connection_or_compute_authenticate_cell_body( - chan->conn, authtype, NULL, NULL, 1); - if (! expected_cell) + if (connection_or_compute_authenticate_cell_body( + chan->conn, expected, sizeof(expected), NULL, 1) < 0) ERR("Couldn't compute expected AUTHENTICATE cell body"); - int sig_is_rsa; - if (authtype == AUTHTYPE_RSA_SHA256_TLSSECRET || - authtype == AUTHTYPE_RSA_SHA256_RFC5705) { - bodylen = V3_AUTH_BODY_LEN; - sig_is_rsa = 1; - } else { - tor_assert(authtype == AUTHTYPE_ED25519_SHA256_RFC5705); - /* Our earlier check had better have made sure we had room - * for an ed25519 sig (inadvertently) */ - tor_assert(V3_AUTH_BODY_LEN > ED25519_SIG_LEN); - bodylen = authlen - ED25519_SIG_LEN; - sig_is_rsa = 0; - } - if (expected_cell->payload_len != bodylen+4) { - ERR("Expected AUTHENTICATE cell body len not as expected."); - } - - /* Length of random part. */ - if (BUG(bodylen < 24)) { - // LCOV_EXCL_START - ERR("Bodylen is somehow less than 24, which should really be impossible"); - // LCOV_EXCL_STOP - } - - if (tor_memneq(expected_cell->payload+4, auth, bodylen-24)) + if (tor_memneq(expected, auth, sizeof(expected))) ERR("Some field in the AUTHENTICATE cell body was not as expected"); - if (sig_is_rsa) { - if (chan->conn->handshake_state->certs->ed_id_sign != NULL) - ERR("RSA-signed AUTHENTICATE response provided with an ED25519 cert"); - - if (chan->conn->handshake_state->certs->auth_cert == NULL) - ERR("We never got an RSA authentication certificate"); - + { crypto_pk_t *pk = tor_tls_cert_get_key( - chan->conn->handshake_state->certs->auth_cert); + chan->conn->handshake_state->auth_cert); char d[DIGEST256_LEN]; char *signed_data; size_t keysize; int signed_len; - if (! pk) { - ERR("Couldn't get RSA key from AUTH cert."); - } + if (!pk) + ERR("Internal error: couldn't get RSA key from AUTH cert."); crypto_digest256(d, (char*)auth, V3_AUTH_BODY_LEN, DIGEST_SHA256); keysize = crypto_pk_keysize(pk); @@ -2399,7 +2021,7 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) crypto_pk_free(pk); if (signed_len < 0) { tor_free(signed_data); - ERR("RSA signature wasn't valid"); + ERR("Signature wasn't valid"); } if (signed_len < DIGEST256_LEN) { tor_free(signed_data); @@ -2412,75 +2034,41 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) ERR("Signature did not match data to be signed."); } tor_free(signed_data); - } else { - if (chan->conn->handshake_state->certs->ed_id_sign == NULL) - ERR("We never got an Ed25519 identity certificate."); - if (chan->conn->handshake_state->certs->ed_sign_auth == NULL) - ERR("We never got an Ed25519 authentication certificate."); - - const ed25519_public_key_t *authkey = - &chan->conn->handshake_state->certs->ed_sign_auth->signed_key; - ed25519_signature_t sig; - tor_assert(authlen > ED25519_SIG_LEN); - memcpy(&sig.sig, auth + authlen - ED25519_SIG_LEN, ED25519_SIG_LEN); - if (ed25519_checksig(&sig, auth, authlen - ED25519_SIG_LEN, authkey)<0) { - ERR("Ed25519 signature wasn't valid."); - } } /* Okay, we are authenticated. */ chan->conn->handshake_state->received_authenticate = 1; chan->conn->handshake_state->authenticated = 1; - chan->conn->handshake_state->authenticated_rsa = 1; chan->conn->handshake_state->digest_received_data = 0; { - tor_x509_cert_t *id_cert = chan->conn->handshake_state->certs->id_cert; - crypto_pk_t *identity_rcvd = tor_tls_cert_get_key(id_cert); - const common_digests_t *id_digests = tor_x509_cert_get_id_digests(id_cert); - const ed25519_public_key_t *ed_identity_received = NULL; - - if (! sig_is_rsa) { - chan->conn->handshake_state->authenticated_ed25519 = 1; - ed_identity_received = - &chan->conn->handshake_state->certs->ed_id_sign->signing_key; - memcpy(&chan->conn->handshake_state->authenticated_ed25519_peer_id, - ed_identity_received, sizeof(ed25519_public_key_t)); - } + crypto_pk_t *identity_rcvd = + tor_tls_cert_get_key(chan->conn->handshake_state->id_cert); + const digests_t *id_digests = + tor_cert_get_id_digests(chan->conn->handshake_state->id_cert); /* This must exist; we checked key type when reading the cert. */ tor_assert(id_digests); - memcpy(chan->conn->handshake_state->authenticated_rsa_peer_id, + memcpy(chan->conn->handshake_state->authenticated_peer_id, id_digests->d[DIGEST_SHA1], DIGEST_LEN); channel_set_circid_type(TLS_CHAN_TO_BASE(chan), identity_rcvd, chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); crypto_pk_free(identity_rcvd); - log_debug(LD_HANDSHAKE, - "Calling connection_or_init_conn_from_address for %s " - " from %s, with%s ed25519 id.", - safe_str(chan->conn->base_.address), - __func__, - ed_identity_received ? "" : "out"); - connection_or_init_conn_from_address(chan->conn, &(chan->conn->base_.addr), chan->conn->base_.port, (const char*)(chan->conn->handshake_state-> - authenticated_rsa_peer_id), - ed_identity_received, + authenticated_peer_id), 0); - log_debug(LD_HANDSHAKE, - "Got an AUTHENTICATE cell from %s:%d, type %d: Looks good.", + log_info(LD_OR, + "Got an AUTHENTICATE cell from %s:%d: Looks good.", safe_str(chan->conn->base_.address), - chan->conn->base_.port, - authtype); + chan->conn->base_.port); } - var_cell_free(expected_cell); - #undef ERR } diff --git a/src/tor/src/or/channeltls.h b/src/tor/channeltls.h similarity index 54% rename from src/tor/src/or/channeltls.h rename to src/tor/channeltls.h index d9c4239c3..b4a7e2bea 100644 --- a/src/tor/src/or/channeltls.h +++ b/src/tor/channeltls.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -26,11 +26,10 @@ struct channel_tls_s { or_connection_t *conn; }; -#endif /* defined(TOR_CHANNEL_INTERNAL_) */ +#endif /* TOR_CHANNEL_INTERNAL_ */ channel_t * channel_tls_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id); + const char *id_digest); channel_listener_t * channel_tls_get_listener(void); channel_listener_t * channel_tls_start_listener(void); channel_t * channel_tls_handle_incoming(or_connection_t *orconn); @@ -41,6 +40,8 @@ channel_t * channel_tls_to_base(channel_tls_t *tlschan); channel_tls_t * channel_tls_from_base(channel_t *chan); /* Things for connection_or.c to call back into */ +ssize_t channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells); +int channel_tls_more_to_flush(channel_tls_t *chan); void channel_tls_handle_cell(cell_t *cell, or_connection_t *conn); void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, or_connection_t *conn, @@ -48,28 +49,9 @@ void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, uint8_t state); void channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn); -void channel_tls_update_marks(or_connection_t *conn); /* Cleanup at shutdown */ void channel_tls_free_all(void); -extern uint64_t stats_n_authorize_cells_processed; -extern uint64_t stats_n_authenticate_cells_processed; -extern uint64_t stats_n_versions_cells_processed; -extern uint64_t stats_n_netinfo_cells_processed; -extern uint64_t stats_n_vpadding_cells_processed; -extern uint64_t stats_n_certs_cells_processed; -extern uint64_t stats_n_auth_challenge_cells_processed; - -#ifdef CHANNELTLS_PRIVATE -STATIC void channel_tls_process_certs_cell(var_cell_t *cell, - channel_tls_t *tlschan); -STATIC void channel_tls_process_auth_challenge_cell(var_cell_t *cell, - channel_tls_t *tlschan); -STATIC void channel_tls_common_init(channel_tls_t *tlschan); -STATIC void channel_tls_process_authenticate_cell(var_cell_t *cell, - channel_tls_t *tlschan); -#endif /* defined(CHANNELTLS_PRIVATE) */ - -#endif /* !defined(TOR_CHANNELTLS_H) */ +#endif diff --git a/src/tor/ciphers.inc b/src/tor/ciphers.inc new file mode 100644 index 000000000..137d78b11 --- /dev/null +++ b/src/tor/ciphers.inc @@ -0,0 +1,182 @@ +/* This is an include file used to define the list of ciphers clients should + * advertise. Before including it, you should define the CIPHER and XCIPHER + * macros. + * + * This file was automatically generated by get_mozilla_ciphers.py. + */ +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA + CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + CIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA) +#else + XCIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA + CIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA) +#else + XCIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA + CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) +#else + XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA + CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) +#else + XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA + CIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA + CIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) +#else + XCIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA + CIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) +#else + XCIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA + CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) +#else + XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA + CIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA + CIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA + CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + CIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA) +#else + XCIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA + CIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA) +#else + XCIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA + CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) +#else + XCIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_DHE_DSS_WITH_AES_128_SHA + CIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) +#else + XCIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA + CIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA + CIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA + CIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) +#else + XCIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA + CIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) +#else + XCIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_SEED_SHA + CIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA) +#else + XCIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA + CIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) +#else + XCIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) +#endif +#ifdef SSL3_TXT_RSA_RC4_128_MD5 + CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) +#else + XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) +#endif +#ifdef SSL3_TXT_RSA_RC4_128_SHA + CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) +#else + XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) +#endif +#ifdef TLS1_TXT_RSA_WITH_AES_128_SHA + CIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) +#else + XCIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA + CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) +#else + XCIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) +#endif +#ifdef SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA + CIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) +#else + XCIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) +#endif +#ifdef TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA + CIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) +#else + XCIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) +#endif +/* No openssl macro found for 0xfeff */ +#ifdef SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA + CIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) +#else + XCIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) +#endif +#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA + CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) +#else + XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) +#endif diff --git a/src/tor/src/or/circpathbias.c b/src/tor/circpathbias.c similarity index 84% rename from src/tor/src/or/circpathbias.c rename to src/tor/circpathbias.c index f4bd5ea2f..51a75cf50 100644 --- a/src/tor/src/or/circpathbias.c +++ b/src/tor/circpathbias.c @@ -1,26 +1,9 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file circpathbias.c - * - * \brief Code to track success/failure rates of circuits built through - * different tor nodes, in an attempt to detect attacks where - * an attacker deliberately causes circuits to fail until the client - * choses a path they like. - * - * This code is currently configured in a warning-only mode, though false - * positives appear to be rare in practice. There is also support for - * disabling really bad guards, but it's quite experimental and may have bad - * anonymity effects. - * - * The information here is associated with the entry_guard_t object for - * each guard, and stored persistently in the state file. - */ - #include "or.h" #include "channel.h" #include "circpathbias.h" @@ -51,21 +34,19 @@ static int entry_guard_inc_circ_attempt_count(entry_guard_t *guard); static int entry_guard_inc_circ_attempt_count(entry_guard_t *guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - entry_guards_changed(); pathbias_measure_close_rate(guard); - if (pb->path_bias_disabled) + if (guard->path_bias_disabled) return -1; pathbias_scale_close_rates(guard); - pb->circ_attempts++; + guard->circ_attempts++; - log_info(LD_CIRC, "Got success count %f/%f for guard %s", - pb->circ_successes, pb->circ_attempts, - entry_guard_describe(guard)); + log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)", + guard->circ_successes, guard->circ_attempts, guard->nickname, + hex_str(guard->identity, DIGEST_LEN)); return 0; } @@ -95,6 +76,7 @@ pathbias_get_notice_rate(const or_options_t *options) DFLT_PATH_BIAS_NOTICE_PCT, 0, 100)/100.0; } +/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ /** The circuit success rate below which we issue a warn */ static double pathbias_get_warn_rate(const or_options_t *options) @@ -107,7 +89,7 @@ pathbias_get_warn_rate(const or_options_t *options) DFLT_PATH_BIAS_WARN_PCT, 0, 100)/100.0; } -/* XXXX I'd like to have this be static again, but entrynodes.c needs it. */ +/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ /** * The extreme rate is the rate at which we would drop the guard, * if pb_dropguard is also set. Otherwise we just warn. @@ -123,7 +105,7 @@ pathbias_get_extreme_rate(const or_options_t *options) DFLT_PATH_BIAS_EXTREME_PCT, 0, 100)/100.0; } -/* XXXX I'd like to have this be static again, but entrynodes.c needs it. */ +/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ /** * If 1, we actually disable use of guards that fall below * the extreme_pct. @@ -292,7 +274,7 @@ pathbias_is_new_circ_attempt(origin_circuit_t *circ) return circ->cpath && circ->cpath->next != circ->cpath && circ->cpath->next->state == CPATH_STATE_AWAITING_KEYS; -#else /* !(defined(N2N_TAGGING_IS_POSSIBLE)) */ +#else /* If tagging attacks are no longer possible, we probably want to * count bias from the first hop. However, one could argue that * timing-based tagging is still more useful than per-hop failure. @@ -300,7 +282,7 @@ pathbias_is_new_circ_attempt(origin_circuit_t *circ) */ return circ->cpath && circ->cpath->state == CPATH_STATE_AWAITING_KEYS; -#endif /* defined(N2N_TAGGING_IS_POSSIBLE) */ +#endif } /** @@ -515,16 +497,14 @@ pathbias_count_build_success(origin_circuit_t *circ) } if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - if (circ->path_state == PATH_STATE_BUILD_ATTEMPTED) { circ->path_state = PATH_STATE_BUILD_SUCCEEDED; - pb->circ_successes++; + guard->circ_successes++; entry_guards_changed(); - log_info(LD_CIRC, "Got success count %f/%f for guard %s", - pb->circ_successes, pb->circ_attempts, - entry_guard_describe(guard)); + log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)", + guard->circ_successes, guard->circ_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); } else { if ((rate_msg = rate_limit_log(&success_notice_limit, approx_time()))) { @@ -539,11 +519,11 @@ pathbias_count_build_success(origin_circuit_t *circ) } } - if (pb->circ_attempts < pb->circ_successes) { + if (guard->circ_attempts < guard->circ_successes) { log_notice(LD_BUG, "Unexpectedly high successes counts (%f/%f) " - "for guard %s", - pb->circ_successes, pb->circ_attempts, - entry_guard_describe(guard)); + "for guard %s ($%s)", + guard->circ_successes, guard->circ_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); } /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here. @@ -586,6 +566,8 @@ pathbias_count_build_success(origin_circuit_t *circ) void pathbias_count_use_attempt(origin_circuit_t *circ) { + entry_guard_t *guard; + if (!pathbias_should_count(circ)) { return; } @@ -598,21 +580,19 @@ pathbias_count_use_attempt(origin_circuit_t *circ) circuit_purpose_to_string(circ->base_.purpose), circuit_state_to_string(circ->base_.state)); } else if (circ->path_state < PATH_STATE_USE_ATTEMPTED) { - entry_guard_t *guard = entry_guard_get_by_id_digest( + guard = entry_guard_get_by_id_digest( circ->cpath->extend_info->identity_digest); if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - pathbias_measure_use_rate(guard); pathbias_scale_use_rates(guard); - pb->use_attempts++; + guard->use_attempts++; entry_guards_changed(); log_debug(LD_CIRC, - "Marked circuit %d (%f/%f) as used for guard %s.", + "Marked circuit %d (%f/%f) as used for guard %s ($%s).", circ->global_identifier, - pb->use_successes, pb->use_attempts, - entry_guard_describe(guard)); + guard->use_successes, guard->use_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); } circ->path_state = PATH_STATE_USE_ATTEMPTED; @@ -714,23 +694,22 @@ pathbias_count_use_success(origin_circuit_t *circ) guard = entry_guard_get_by_id_digest( circ->cpath->extend_info->identity_digest); if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - pb->use_successes++; + guard->use_successes++; entry_guards_changed(); - if (pb->use_attempts < pb->use_successes) { + if (guard->use_attempts < guard->use_successes) { log_notice(LD_BUG, "Unexpectedly high use successes counts (%f/%f) " - "for guard %s", - pb->use_successes, pb->use_attempts, - entry_guard_describe(guard)); + "for guard %s=%s", + guard->use_successes, guard->use_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); } log_debug(LD_CIRC, - "Marked circuit %d (%f/%f) as used successfully for guard %s", - circ->global_identifier, pb->use_successes, - pb->use_attempts, - entry_guard_describe(guard)); + "Marked circuit %d (%f/%f) as used successfully for guard " + "%s ($%s).", + circ->global_identifier, guard->use_successes, + guard->use_attempts, guard->nickname, + hex_str(guard->identity, DIGEST_LEN)); } } @@ -789,8 +768,8 @@ pathbias_send_usable_probe(circuit_t *circ) /* Can't probe if the channel isn't open */ if (circ->n_chan == NULL || - (!CHANNEL_IS_OPEN(circ->n_chan) - && !CHANNEL_IS_MAINT(circ->n_chan))) { + (circ->n_chan->state != CHANNEL_STATE_OPEN + && circ->n_chan->state != CHANNEL_STATE_MAINT)) { log_info(LD_CIRC, "Skipping pathbias probe for circuit %d: Channel is not open.", ocirc->global_identifier); @@ -1031,11 +1010,9 @@ pathbias_count_successful_close(origin_circuit_t *circ) } if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - /* In the long run: circuit_success ~= successful_circuit_close + * circ_failure + stream_failure */ - pb->successful_circuits_closed++; + guard->successful_circuits_closed++; entry_guards_changed(); } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to @@ -1072,9 +1049,7 @@ pathbias_count_collapse(origin_circuit_t *circ) } if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - pb->collapsed_circuits++; + guard->collapsed_circuits++; entry_guards_changed(); } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to @@ -1107,9 +1082,7 @@ pathbias_count_use_failed(origin_circuit_t *circ) } if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - pb->unusable_circuits++; + guard->unusable_circuits++; entry_guards_changed(); } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to @@ -1152,9 +1125,7 @@ pathbias_count_timeout(origin_circuit_t *circ) } if (guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - pb->timeouts++; + guard->timeouts++; entry_guards_changed(); } } @@ -1169,10 +1140,11 @@ pathbias_count_circs_in_states(entry_guard_t *guard, path_state_t from, path_state_t to) { + circuit_t *circ; int open_circuits = 0; /* Count currently open circuits. Give them the benefit of the doubt. */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { origin_circuit_t *ocirc = NULL; if (!CIRCUIT_IS_ORIGIN(circ) || /* didn't originate here */ circ->marked_for_close) /* already counted */ @@ -1186,7 +1158,7 @@ pathbias_count_circs_in_states(entry_guard_t *guard, if (ocirc->path_state >= from && ocirc->path_state <= to && pathbias_should_count(ocirc) && - fast_memeq(entry_guard_get_rsa_id_digest(guard), + fast_memeq(guard->identity, ocirc->cpath->extend_info->identity_digest, DIGEST_LEN)) { log_debug(LD_CIRC, "Found opened circuit %d in path_state %s", @@ -1195,7 +1167,6 @@ pathbias_count_circs_in_states(entry_guard_t *guard, open_circuits++; } } - SMARTLIST_FOREACH_END(circ); return open_circuits; } @@ -1210,9 +1181,7 @@ pathbias_count_circs_in_states(entry_guard_t *guard, double pathbias_get_close_success_count(entry_guard_t *guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - return pb->successful_circuits_closed + + return guard->successful_circuits_closed + pathbias_count_circs_in_states(guard, PATH_STATE_BUILD_SUCCEEDED, PATH_STATE_USE_SUCCEEDED); @@ -1228,9 +1197,7 @@ pathbias_get_close_success_count(entry_guard_t *guard) double pathbias_get_use_success_count(entry_guard_t *guard) { - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - - return pb->use_successes + + return guard->use_successes + pathbias_count_circs_in_states(guard, PATH_STATE_USE_ATTEMPTED, PATH_STATE_USE_SUCCEEDED); @@ -1248,19 +1215,18 @@ static void pathbias_measure_use_rate(entry_guard_t *guard) { const or_options_t *options = get_options(); - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - if (pb->use_attempts > pathbias_get_min_use(options)) { + if (guard->use_attempts > pathbias_get_min_use(options)) { /* Note: We rely on the < comparison here to allow us to set a 0 * rate and disable the feature entirely. If refactoring, don't * change to <= */ - if (pathbias_get_use_success_count(guard)/pb->use_attempts + if (pathbias_get_use_success_count(guard)/guard->use_attempts < pathbias_get_extreme_use_rate(options)) { /* Dropping is currently disabled by default. */ if (pathbias_get_dropguards(options)) { - if (!pb->path_bias_disabled) { + if (!guard->path_bias_disabled) { log_warn(LD_CIRC, - "Your Guard %s is failing to carry an extremely large " + "Your Guard %s ($%s) is failing to carry an extremely large " "amount of stream on its circuits. " "To avoid potential route manipulation attacks, Tor has " "disabled use of this guard. " @@ -1268,23 +1234,25 @@ pathbias_measure_use_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), + tor_lround(guard->use_attempts), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->circ_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); - pb->path_bias_disabled = 1; + guard->path_bias_disabled = 1; + guard->bad_since = approx_time(); + entry_guards_changed(); return; } - } else if (!pb->path_bias_use_extreme) { - pb->path_bias_use_extreme = 1; + } else if (!guard->path_bias_use_extreme) { + guard->path_bias_use_extreme = 1; log_warn(LD_CIRC, - "Your Guard %s is failing to carry an extremely large " + "Your Guard %s ($%s) is failing to carry an extremely large " "amount of streams on its circuits. " "This could indicate a route manipulation attack, network " "overload, bad local network connectivity, or a bug. " @@ -1292,23 +1260,23 @@ pathbias_measure_use_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), + tor_lround(guard->use_attempts), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->circ_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); } - } else if (pathbias_get_use_success_count(guard)/pb->use_attempts + } else if (pathbias_get_use_success_count(guard)/guard->use_attempts < pathbias_get_notice_use_rate(options)) { - if (!pb->path_bias_use_noticed) { - pb->path_bias_use_noticed = 1; + if (!guard->path_bias_use_noticed) { + guard->path_bias_use_noticed = 1; log_notice(LD_CIRC, - "Your Guard %s is failing to carry more streams on its " + "Your Guard %s ($%s) is failing to carry more streams on its " "circuits than usual. " "Most likely this means the Tor network is overloaded " "or your network connection is poor. " @@ -1316,15 +1284,15 @@ pathbias_measure_use_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), + tor_lround(guard->use_attempts), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->circ_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); } } @@ -1353,19 +1321,18 @@ static void pathbias_measure_close_rate(entry_guard_t *guard) { const or_options_t *options = get_options(); - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); - if (pb->circ_attempts > pathbias_get_min_circs(options)) { + if (guard->circ_attempts > pathbias_get_min_circs(options)) { /* Note: We rely on the < comparison here to allow us to set a 0 * rate and disable the feature entirely. If refactoring, don't * change to <= */ - if (pathbias_get_close_success_count(guard)/pb->circ_attempts + if (pathbias_get_close_success_count(guard)/guard->circ_attempts < pathbias_get_extreme_rate(options)) { /* Dropping is currently disabled by default. */ if (pathbias_get_dropguards(options)) { - if (!pb->path_bias_disabled) { + if (!guard->path_bias_disabled) { log_warn(LD_CIRC, - "Your Guard %s is failing an extremely large " + "Your Guard %s ($%s) is failing an extremely large " "amount of circuits. " "To avoid potential route manipulation attacks, Tor has " "disabled use of this guard. " @@ -1373,23 +1340,25 @@ pathbias_measure_close_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), + tor_lround(guard->circ_attempts), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->use_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); - pb->path_bias_disabled = 1; + guard->path_bias_disabled = 1; + guard->bad_since = approx_time(); + entry_guards_changed(); return; } - } else if (!pb->path_bias_extreme) { - pb->path_bias_extreme = 1; + } else if (!guard->path_bias_extreme) { + guard->path_bias_extreme = 1; log_warn(LD_CIRC, - "Your Guard %s is failing an extremely large " + "Your Guard %s ($%s) is failing an extremely large " "amount of circuits. " "This could indicate a route manipulation attack, " "extreme network overload, or a bug. " @@ -1397,23 +1366,23 @@ pathbias_measure_close_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), + tor_lround(guard->circ_attempts), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->use_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); } - } else if (pathbias_get_close_success_count(guard)/pb->circ_attempts + } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts < pathbias_get_warn_rate(options)) { - if (!pb->path_bias_warned) { - pb->path_bias_warned = 1; + if (!guard->path_bias_warned) { + guard->path_bias_warned = 1; log_warn(LD_CIRC, - "Your Guard %s is failing a very large " + "Your Guard %s ($%s) is failing a very large " "amount of circuits. " "Most likely this means the Tor network is " "overloaded, but it could also mean an attack against " @@ -1422,38 +1391,38 @@ pathbias_measure_close_rate(entry_guard_t *guard) "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), + tor_lround(guard->circ_attempts), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->use_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); } - } else if (pathbias_get_close_success_count(guard)/pb->circ_attempts + } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts < pathbias_get_notice_rate(options)) { - if (!pb->path_bias_noticed) { - pb->path_bias_noticed = 1; + if (!guard->path_bias_noticed) { + guard->path_bias_noticed = 1; log_notice(LD_CIRC, - "Your Guard %s is failing more circuits than " + "Your Guard %s ($%s) is failing more circuits than " "usual. " "Most likely this means the Tor network is overloaded. " "Success counts are %ld/%ld. Use counts are %ld/%ld. " "%ld circuits completed, %ld were unusable, %ld collapsed, " "and %ld timed out. " "For reference, your timeout cutoff is %ld seconds.", - entry_guard_describe(guard), + guard->nickname, hex_str(guard->identity, DIGEST_LEN), tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(pb->circ_attempts), + tor_lround(guard->circ_attempts), tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(pb->use_attempts), - tor_lround(pb->circ_successes), - tor_lround(pb->unusable_circuits), - tor_lround(pb->collapsed_circuits), - tor_lround(pb->timeouts), + tor_lround(guard->use_attempts), + tor_lround(guard->circ_successes), + tor_lround(guard->unusable_circuits), + tor_lround(guard->collapsed_circuits), + tor_lround(guard->timeouts), tor_lround(get_circuit_build_close_time_ms()/1000)); } } @@ -1473,10 +1442,9 @@ static void pathbias_scale_close_rates(entry_guard_t *guard) { const or_options_t *options = get_options(); - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); /* If we get a ton of circuits, just scale everything down */ - if (pb->circ_attempts > pathbias_get_scale_threshold(options)) { + if (guard->circ_attempts > pathbias_get_scale_threshold(options)) { double scale_ratio = pathbias_get_scale_ratio(options); int opened_attempts = pathbias_count_circs_in_states(guard, PATH_STATE_BUILD_ATTEMPTED, PATH_STATE_BUILD_ATTEMPTED); @@ -1484,38 +1452,38 @@ pathbias_scale_close_rates(entry_guard_t *guard) PATH_STATE_BUILD_SUCCEEDED, PATH_STATE_USE_FAILED); /* Verify that the counts are sane before and after scaling */ - int counts_are_sane = (pb->circ_attempts >= pb->circ_successes); + int counts_are_sane = (guard->circ_attempts >= guard->circ_successes); - pb->circ_attempts -= (opened_attempts+opened_built); - pb->circ_successes -= opened_built; + guard->circ_attempts -= (opened_attempts+opened_built); + guard->circ_successes -= opened_built; - pb->circ_attempts *= scale_ratio; - pb->circ_successes *= scale_ratio; - pb->timeouts *= scale_ratio; - pb->successful_circuits_closed *= scale_ratio; - pb->collapsed_circuits *= scale_ratio; - pb->unusable_circuits *= scale_ratio; + guard->circ_attempts *= scale_ratio; + guard->circ_successes *= scale_ratio; + guard->timeouts *= scale_ratio; + guard->successful_circuits_closed *= scale_ratio; + guard->collapsed_circuits *= scale_ratio; + guard->unusable_circuits *= scale_ratio; - pb->circ_attempts += (opened_attempts+opened_built); - pb->circ_successes += opened_built; + guard->circ_attempts += (opened_attempts+opened_built); + guard->circ_successes += opened_built; entry_guards_changed(); log_info(LD_CIRC, "Scaled pathbias counts to (%f,%f)/%f (%d/%d open) for guard " - "%s", - pb->circ_successes, pb->successful_circuits_closed, - pb->circ_attempts, opened_built, opened_attempts, - entry_guard_describe(guard)); + "%s ($%s)", + guard->circ_successes, guard->successful_circuits_closed, + guard->circ_attempts, opened_built, opened_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); /* Have the counts just become invalid by this scaling attempt? */ - if (counts_are_sane && pb->circ_attempts < pb->circ_successes) { + if (counts_are_sane && guard->circ_attempts < guard->circ_successes) { log_notice(LD_BUG, "Scaling has mangled pathbias counts to %f/%f (%d/%d open) " - "for guard %s", - pb->circ_successes, pb->circ_attempts, opened_built, - opened_attempts, - entry_guard_describe(guard)); + "for guard %s ($%s)", + guard->circ_successes, guard->circ_attempts, opened_built, + opened_attempts, guard->nickname, + hex_str(guard->identity, DIGEST_LEN)); } } } @@ -1533,35 +1501,35 @@ void pathbias_scale_use_rates(entry_guard_t *guard) { const or_options_t *options = get_options(); - guard_pathbias_t *pb = entry_guard_get_pathbias_state(guard); /* If we get a ton of circuits, just scale everything down */ - if (pb->use_attempts > pathbias_get_scale_use_threshold(options)) { + if (guard->use_attempts > pathbias_get_scale_use_threshold(options)) { double scale_ratio = pathbias_get_scale_ratio(options); int opened_attempts = pathbias_count_circs_in_states(guard, PATH_STATE_USE_ATTEMPTED, PATH_STATE_USE_SUCCEEDED); /* Verify that the counts are sane before and after scaling */ - int counts_are_sane = (pb->use_attempts >= pb->use_successes); + int counts_are_sane = (guard->use_attempts >= guard->use_successes); - pb->use_attempts -= opened_attempts; + guard->use_attempts -= opened_attempts; - pb->use_attempts *= scale_ratio; - pb->use_successes *= scale_ratio; + guard->use_attempts *= scale_ratio; + guard->use_successes *= scale_ratio; - pb->use_attempts += opened_attempts; + guard->use_attempts += opened_attempts; log_info(LD_CIRC, - "Scaled pathbias use counts to %f/%f (%d open) for guard %s", - pb->use_successes, pb->use_attempts, opened_attempts, - entry_guard_describe(guard)); + "Scaled pathbias use counts to %f/%f (%d open) for guard %s ($%s)", + guard->use_successes, guard->use_attempts, opened_attempts, + guard->nickname, hex_str(guard->identity, DIGEST_LEN)); /* Have the counts just become invalid by this scaling attempt? */ - if (counts_are_sane && pb->use_attempts < pb->use_successes) { + if (counts_are_sane && guard->use_attempts < guard->use_successes) { log_notice(LD_BUG, "Scaling has mangled pathbias usage counts to %f/%f " - "(%d open) for guard %s", - pb->circ_successes, pb->circ_attempts, - opened_attempts, entry_guard_describe(guard)); + "(%d open) for guard %s ($%s)", + guard->circ_successes, guard->circ_attempts, + opened_attempts, guard->nickname, + hex_str(guard->identity, DIGEST_LEN)); } entry_guards_changed(); diff --git a/src/tor/src/or/circpathbias.h b/src/tor/circpathbias.h similarity index 91% rename from src/tor/src/or/circpathbias.h rename to src/tor/circpathbias.h index c9e572d2a..c95d801a4 100644 --- a/src/tor/src/or/circpathbias.h +++ b/src/tor/circpathbias.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -25,5 +25,5 @@ void pathbias_mark_use_success(origin_circuit_t *circ); void pathbias_mark_use_rollback(origin_circuit_t *circ); const char *pathbias_state_to_string(path_state_t state); -#endif /* !defined(TOR_CIRCPATHBIAS_H) */ +#endif diff --git a/src/tor/src/or/circuitbuild.c b/src/tor/circuitbuild.c similarity index 55% rename from src/tor/src/or/circuitbuild.c rename to src/tor/circuitbuild.c index a350f6c14..aeeea47c2 100644 --- a/src/tor/src/or/circuitbuild.c +++ b/src/tor/circuitbuild.c @@ -1,37 +1,17 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file circuitbuild.c - * - * \brief Implements the details of building circuits (by chosing paths, - * constructing/sending create/extend cells, and so on). - * - * On the client side, this module handles launching circuits. Circuit - * launches are srtarted from circuit_establish_circuit(), called from - * circuit_launch_by_extend_info()). To choose the path the circuit will - * take, onion_extend_cpath() calls into a maze of node selection functions. - * - * Once the circuit is ready to be launched, the first hop is treated as a - * special case with circuit_handle_first_hop(), since it might need to open a - * channel. As the channel opens, and later as CREATED and RELAY_EXTENDED - * cells arrive, the client will invoke circuit_send_next_onion_skin() to send - * CREATE or RELAY_EXTEND cells. - * - * On the server side, this module also handles the logic of responding to - * RELAY_EXTEND requests, using circuit_extend(). + * \brief The actual details of building circuits. **/ -#define CIRCUITBUILD_PRIVATE - #include "or.h" -#include "bridges.h" #include "channel.h" #include "circpathbias.h" -#define CIRCUITBUILD_PRIVATE #include "circuitbuild.h" #include "circuitlist.h" #include "circuitstats.h" @@ -43,11 +23,9 @@ #include "connection_edge.h" #include "connection_or.h" #include "control.h" -#include "crypto.h" #include "directory.h" #include "entrynodes.h" -#include "hs_ntor.h" -#include "main.h" +#include "onion_main.h" #include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" @@ -55,31 +33,33 @@ #include "onion_tap.h" #include "onion_fast.h" #include "policies.h" +#include "transports.h" #include "relay.h" -#include "rendcommon.h" #include "rephist.h" #include "router.h" #include "routerlist.h" #include "routerparse.h" #include "routerset.h" -#include "transports.h" +#include "crypto.h" + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif static channel_t * channel_connect_for_circuit(const tor_addr_t *addr, - uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id); + uint16_t port, + const char *id_digest); static int circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, int relayed); -static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit, - int is_hs_v3_rp_circuit); +static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit); static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath); static int onion_extend_cpath(origin_circuit_t *circ); -STATIC int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); -static int circuit_send_first_onion_skin(origin_circuit_t *circ); -static int circuit_build_no_more_hops(origin_circuit_t *circ); -static int circuit_send_intermediate_onion_skin(origin_circuit_t *circ, - crypt_path_t *hop); +static int count_acceptable_nodes(smartlist_t *routers); +static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); +#ifdef CURVE25519_ENABLED +static int circuits_can_use_ntor(void); +#endif /** This function tries to get a channel to the specified endpoint, * and then calls command_setup_channel() to give it the right @@ -87,40 +67,28 @@ static int circuit_send_intermediate_onion_skin(origin_circuit_t *circ, */ static channel_t * channel_connect_for_circuit(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id) + const char *id_digest) { channel_t *chan; - chan = channel_connect(addr, port, id_digest, ed_id); + chan = channel_connect(addr, port, id_digest); if (chan) command_setup_channel(chan); return chan; } -/** Search for a value for circ_id that we can use on chan for an - * outbound circuit, until we get a circ_id that is not in use by any other - * circuit on that conn. +/** Iterate over values of circ_id, starting from conn-\>next_circ_id, + * and with the high bit specified by conn-\>circ_id_type, until we get + * a circ_id that is not in use by any other circuit on that conn. * * Return it, or 0 if can't get a unique circ_id. */ -STATIC circid_t +static circid_t get_unique_circ_id_by_chan(channel_t *chan) { -/* This number is chosen somewhat arbitrarily; see comment below for more - * info. When the space is 80% full, it gives a one-in-a-million failure - * chance; when the space is 90% full, it gives a one-in-850 chance; and when - * the space is 95% full, it gives a one-in-26 failure chance. That seems - * okay, though you could make a case IMO for anything between N=32 and - * N=256. */ -#define MAX_CIRCID_ATTEMPTS 64 - int in_use; - unsigned n_with_circ = 0, n_pending_destroy = 0, n_weird_pending_destroy = 0; circid_t test_circ_id; circid_t attempts=0; - circid_t high_bit, max_range, mask; - int64_t pending_destroy_time_total = 0; - int64_t pending_destroy_time_max = 0; + circid_t high_bit, max_range; tor_assert(chan); @@ -130,108 +98,25 @@ get_unique_circ_id_by_chan(channel_t *chan) "a client with no identity."); return 0; } - max_range = (chan->wide_circ_ids) ? (1u<<31) : (1u<<15); - mask = max_range - 1; + max_range = (chan->wide_circ_ids) ? (1u<<31) : (1u<<15); high_bit = (chan->circ_id_type == CIRC_ID_TYPE_HIGHER) ? max_range : 0; do { - if (++attempts > MAX_CIRCID_ATTEMPTS) { - /* Make sure we don't loop forever because all circuit IDs are used. - * - * Once, we would try until we had tried every possible circuit ID. But - * that's quite expensive. Instead, we try MAX_CIRCID_ATTEMPTS random - * circuit IDs, and then give up. - * - * This potentially causes us to give up early if our circuit ID space - * is nearly full. If we have N circuit IDs in use, then we will reject - * a new circuit with probability (N / max_range) ^ MAX_CIRCID_ATTEMPTS. - * This means that in practice, a few percent of our circuit ID capacity - * will go unused. - * - * The alternative here, though, is to do a linear search over the - * whole circuit ID space every time we extend a circuit, which is - * not so great either. + /* Sequentially iterate over test_circ_id=1...max_range until we find a + * circID such that (high_bit|test_circ_id) is not already used. */ + test_circ_id = chan->next_circ_id++; + if (test_circ_id == 0 || test_circ_id >= max_range) { + test_circ_id = 1; + chan->next_circ_id = 2; + } + if (++attempts > max_range) { + /* Make sure we don't loop forever if all circ_id's are used. This + * matters because it's an external DoS opportunity. */ - int64_t queued_destroys; - char *m = rate_limit_log(&chan->last_warned_circ_ids_exhausted, - approx_time()); - if (m == NULL) - return 0; /* This message has been rate-limited away. */ - if (n_pending_destroy) - pending_destroy_time_total /= n_pending_destroy; - log_warn(LD_CIRC,"No unused circIDs found on channel %s wide " - "circID support, with %u inbound and %u outbound circuits. " - "Found %u circuit IDs in use by circuits, and %u with " - "pending destroy cells. (%u of those were marked bogusly.) " - "The ones with pending destroy cells " - "have been marked unusable for an average of %ld seconds " - "and a maximum of %ld seconds. This channel is %ld seconds " - "old. Failing a circuit.%s", - chan->wide_circ_ids ? "with" : "without", - chan->num_p_circuits, chan->num_n_circuits, - n_with_circ, n_pending_destroy, n_weird_pending_destroy, - (long)pending_destroy_time_total, - (long)pending_destroy_time_max, - (long)(approx_time() - chan->timestamp_created), - m); - tor_free(m); - - if (!chan->cmux) { - /* This warning should be impossible. */ - log_warn(LD_BUG, " This channel somehow has no cmux on it!"); - return 0; - } - - /* analysis so far on 12184 suggests that we're running out of circuit - IDs because it looks like we have too many pending destroy - cells. Let's see how many we really have pending. - */ - queued_destroys = circuitmux_count_queued_destroy_cells(chan, - chan->cmux); - - log_warn(LD_CIRC, " Circuitmux on this channel has %u circuits, " - "of which %u are active. It says it has "I64_FORMAT - " destroy cells queued.", - circuitmux_num_circuits(chan->cmux), - circuitmux_num_active_circuits(chan->cmux), - I64_PRINTF_ARG(queued_destroys)); - - /* Change this into "if (1)" in order to get more information about - * possible failure modes here. You'll need to know how to use gdb with - * Tor: this will make Tor exit with an assertion failure if the cmux is - * corrupt. */ - if (0) - circuitmux_assert_okay(chan->cmux); - - channel_dump_statistics(chan, LOG_WARN); - + log_warn(LD_CIRC,"No unused circ IDs. Failing."); return 0; } - - do { - crypto_rand((char*) &test_circ_id, sizeof(test_circ_id)); - test_circ_id &= mask; - } while (test_circ_id == 0); - test_circ_id |= high_bit; - - in_use = circuit_id_in_use_on_channel(test_circ_id, chan); - if (in_use == 1) - ++n_with_circ; - else if (in_use == 2) { - time_t since_when; - ++n_pending_destroy; - since_when = - circuit_id_when_marked_unusable_on_channel(test_circ_id, chan); - if (since_when) { - time_t waiting = approx_time() - since_when; - pending_destroy_time_total += waiting; - if (waiting > pending_destroy_time_max) - pending_destroy_time_max = waiting; - } else { - ++n_weird_pending_destroy; - } - } - } while (in_use); + } while (circuit_id_in_use_on_channel(test_circ_id, chan)); return test_circ_id; } @@ -290,9 +175,14 @@ circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names) base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); } } else { /* ! verbose_names */ - elt = tor_malloc(HEX_DIGEST_LEN+2); - elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); + node = node_get_by_id(id); + if (node && node_is_named(node)) { + elt = tor_strdup(node_get_nickname(node)); + } else { + elt = tor_malloc(HEX_DIGEST_LEN+2); + elt[0] = '$'; + base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); + } } tor_assert(elt); if (verbose) { @@ -382,89 +272,74 @@ circuit_rep_hist_note_result(origin_circuit_t *circ) } while (hop!=circ->cpath); } -/** Return 1 iff every node in circ's cpath definitely supports ntor. */ +#ifdef CURVE25519_ENABLED +/** Return 1 iff at least one node in circ's cpath supports ntor. */ static int circuit_cpath_supports_ntor(const origin_circuit_t *circ) { - crypt_path_t *head, *cpath; + crypt_path_t *head = circ->cpath, *cpath = circ->cpath; - cpath = head = circ->cpath; + cpath = head; do { - /* if the extend_info is missing, we can't tell if it supports ntor */ - if (!cpath->extend_info) { - return 0; - } + if (cpath->extend_info && + !tor_mem_is_zero( + (const char*)cpath->extend_info->curve25519_onion_key.public_key, + CURVE25519_PUBKEY_LEN)) + return 1; - /* if the key is blank, it definitely doesn't support ntor */ - if (!extend_info_supports_ntor(cpath->extend_info)) { - return 0; - } cpath = cpath->next; } while (cpath != head); - return 1; + return 0; } +#else +#define circuit_cpath_supports_ntor(circ) 0 +#endif /** Pick all the entries in our cpath. Stop and return 0 when we're * happy, or return -1 if an error occurs. */ static int onion_populate_cpath(origin_circuit_t *circ) { - int r = 0; + int n_tries = 0; +#ifdef CURVE25519_ENABLED + const int using_ntor = circuits_can_use_ntor(); +#else + const int using_ntor = 0; +#endif - /* onion_extend_cpath assumes these are non-NULL */ - tor_assert(circ); - tor_assert(circ->build_state); +#define MAX_POPULATE_ATTEMPTS 32 - while (r == 0) { - r = onion_extend_cpath(circ); + while (1) { + int r = onion_extend_cpath(circ); if (r < 0) { log_info(LD_CIRC,"Generating cpath hop failed."); return -1; } - } - - /* The path is complete */ - tor_assert(r == 1); + if (r == 1) { + /* This circuit doesn't need/shouldn't be forced to have an ntor hop */ + if (circ->build_state->desired_path_len <= 1 || ! using_ntor) + return 0; - /* Does every node in this path support ntor? */ - int path_supports_ntor = circuit_cpath_supports_ntor(circ); + /* This circuit has an ntor hop. great! */ + if (circuit_cpath_supports_ntor(circ)) + return 0; - /* We would like every path to support ntor, but we have to allow for some - * edge cases. */ - tor_assert(circuit_get_cpath_len(circ)); - if (circuit_can_use_tap(circ)) { - /* Circuits from clients to intro points, and hidden services to - * rend points do not support ntor, because the hidden service protocol - * does not include ntor onion keys. This is also true for Tor2web clients - * and Single Onion Services. */ - return 0; - } + /* No node in the circuit supports ntor. Have we already tried too many + * times? */ + if (++n_tries >= MAX_POPULATE_ATTEMPTS) + break; - if (circuit_get_cpath_len(circ) == 1) { - /* Allow for bootstrapping: when we're fetching directly from a fallback, - * authority, or bridge, we have no way of knowing its ntor onion key - * before we connect to it. So instead, we try connecting, and end up using - * CREATE_FAST. */ - tor_assert(circ->cpath); - tor_assert(circ->cpath->extend_info); - const node_t *node = node_get_by_id( - circ->cpath->extend_info->identity_digest); - /* If we don't know the node and its descriptor, we must be bootstrapping. - */ - if (!node || !node_has_descriptor(node)) { - return 0; + /* Clear the path and retry */ + circuit_clear_cpath(circ); } } + log_warn(LD_CIRC, "I tried for %d times, but I couldn't build a %d-hop " + "circuit with at least one node that supports ntor.", + MAX_POPULATE_ATTEMPTS, + circ->build_state->desired_path_len); - if (BUG(!path_supports_ntor)) { - /* If we're building a multi-hop path, and it's not one of the HS or - * bootstrapping exceptions, and it doesn't support ntor, something has - * gone wrong. */ - return -1; - } - - return 0; + return -1; } /** Create and return a new origin circuit. Initialize its purpose and @@ -497,19 +372,14 @@ origin_circuit_init(uint8_t purpose, int flags) * it's not open already. */ origin_circuit_t * -circuit_establish_circuit(uint8_t purpose, extend_info_t *exit_ei, int flags) +circuit_establish_circuit(uint8_t purpose, extend_info_t *exit, int flags) { origin_circuit_t *circ; int err_reason = 0; - int is_hs_v3_rp_circuit = 0; - - if (flags & CIRCLAUNCH_IS_V3_RP) { - is_hs_v3_rp_circuit = 1; - } circ = origin_circuit_init(purpose, flags); - if (onion_pick_cpath_exit(circ, exit_ei, is_hs_v3_rp_circuit) < 0 || + if (onion_pick_cpath_exit(circ, exit) < 0 || onion_populate_cpath(circ) < 0) { circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOPATH); return NULL; @@ -524,13 +394,6 @@ circuit_establish_circuit(uint8_t purpose, extend_info_t *exit_ei, int flags) return circ; } -/** Return the guard state associated with circ, which may be NULL. */ -circuit_guard_state_t * -origin_circuit_get_guard_state(origin_circuit_t *circ) -{ - return circ->guard_state; -} - /** Start establishing the first hop of our circuit. Figure out what * OR we should connect to, and if necessary start the connection to * it. If we're already connected, then send the 'create' cell. @@ -543,33 +406,17 @@ circuit_handle_first_hop(origin_circuit_t *circ) int err_reason = 0; const char *msg = NULL; int should_launch = 0; - const or_options_t *options = get_options(); firsthop = onion_next_hop_in_cpath(circ->cpath); tor_assert(firsthop); tor_assert(firsthop->extend_info); - /* Some bridges are on private addresses. Others pass a dummy private - * address to the pluggable transport, which ignores it. - * Deny the connection if: - * - the address is internal, and - * - we're not connecting to a configured bridge, and - * - we're not configured to allow extends to private addresses. */ - if (tor_addr_is_internal(&firsthop->extend_info->addr, 0) && - !extend_info_is_a_configured_bridge(firsthop->extend_info) && - !options->ExtendAllowPrivateAddresses) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to connect directly to a private address"); - return -END_CIRC_REASON_TORPROTOCOL; - } - /* now see if we're already connected to the first OR in 'route' */ log_debug(LD_CIRC,"Looking for firsthop '%s'", fmt_addrport(&firsthop->extend_info->addr, firsthop->extend_info->port)); n_chan = channel_get_for_extend(firsthop->extend_info->identity_digest, - &firsthop->extend_info->ed_identity, &firsthop->extend_info->addr, &msg, &should_launch); @@ -587,8 +434,7 @@ circuit_handle_first_hop(origin_circuit_t *circ) n_chan = channel_connect_for_circuit( &firsthop->extend_info->addr, firsthop->extend_info->port, - firsthop->extend_info->identity_digest, - &firsthop->extend_info->ed_identity); + firsthop->extend_info->identity_digest); if (!n_chan) { /* connect failed, forget the whole thing */ log_info(LD_CIRC,"connect to firsthop failed. Closing."); return -END_CIRC_REASON_CONNECTFAILED; @@ -607,7 +453,6 @@ circuit_handle_first_hop(origin_circuit_t *circ) log_debug(LD_CIRC,"Conn open. Delivering first onion skin."); if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) { log_info(LD_CIRC,"circuit_send_next_onion_skin failed."); - circ->base_.n_chan = NULL; return err_reason; } } @@ -618,20 +463,17 @@ circuit_handle_first_hop(origin_circuit_t *circ) * open and get them to send their create cells forward. * * Status is 1 if connect succeeded, or 0 if connect failed. - * - * Close_origin_circuits is 1 if we should close all the origin circuits - * through this channel, or 0 otherwise. (This happens when we want to retry - * an older guard.) */ void -circuit_n_chan_done(channel_t *chan, int status, int close_origin_circuits) +circuit_n_chan_done(channel_t *chan, int status) { smartlist_t *pending_circs; int err_reason = 0; tor_assert(chan); - log_debug(LD_CIRC,"chan to %s, status=%d", + log_debug(LD_CIRC,"chan to %s/%s, status=%d", + chan->nickname ? chan->nickname : "NULL", channel_get_canonical_remote_descr(chan), status); pending_circs = smartlist_new(); @@ -661,11 +503,6 @@ circuit_n_chan_done(channel_t *chan, int status, int close_origin_circuits) circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED); continue; } - if (close_origin_circuits && CIRCUIT_IS_ORIGIN(circ)) { - log_info(LD_CIRC,"Channel deprecated for origin circs; closing circ."); - circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED); - continue; - } log_debug(LD_CIRC, "Found circ, sending create cell."); /* circuit_deliver_create_cell will set n_circ_id and add us to * chan_circuid_circuit_map, so we don't need to call @@ -724,21 +561,19 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, id = get_unique_circ_id_by_chan(circ->n_chan); if (!id) { - static ratelim_t circid_warning_limit = RATELIM_INIT(9600); - log_fn_ratelim(&circid_warning_limit, LOG_WARN, LD_CIRC, - "failed to get unique circID."); - goto error; + log_warn(LD_CIRC,"failed to get unique circID."); + return -1; } + log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id); + circuit_set_n_circid_chan(circ, id, circ->n_chan); memset(&cell, 0, sizeof(cell_t)); r = relayed ? create_cell_format_relayed(&cell, create_cell) : create_cell_format(&cell, create_cell); if (r < 0) { log_warn(LD_CIRC,"Couldn't format create cell"); - goto error; + return -1; } - log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id); - circuit_set_n_circid_chan(circ, id, circ->n_chan); cell.circ_id = circ->n_circ_id; append_cell_to_circuit_queue(circ, circ->n_chan, &cell, @@ -747,7 +582,7 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, if (CIRCUIT_IS_ORIGIN(circ)) { /* Update began timestamp for circuits starting their first hop */ if (TO_ORIGIN_CIRCUIT(circ)->cpath->state == CPATH_STATE_CLOSED) { - if (!CHANNEL_IS_OPEN(circ->n_chan)) { + if (circ->n_chan->state != CHANNEL_STATE_OPEN) { log_warn(LD_CIRC, "Got first hop for a circuit without an opened channel. " "State: %s.", channel_state_to_string(circ->n_chan->state)); @@ -762,9 +597,6 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, } return 0; - error: - circ->n_chan = NULL; - return -1; } /** We've decided to start our reachability testing. If all @@ -774,397 +606,328 @@ int inform_testing_reachability(void) { char dirbuf[128]; - char *address; const routerinfo_t *me = router_get_my_routerinfo(); if (!me) return 0; - address = tor_dup_ip(me->addr); control_event_server_status(LOG_NOTICE, "CHECKING_REACHABILITY ORADDRESS=%s:%d", - address, me->or_port); + me->address, me->or_port); if (me->dir_port) { tor_snprintf(dirbuf, sizeof(dirbuf), " and DirPort %s:%d", - address, me->dir_port); + me->address, me->dir_port); control_event_server_status(LOG_NOTICE, "CHECKING_REACHABILITY DIRADDRESS=%s:%d", - address, me->dir_port); + me->address, me->dir_port); } log_notice(LD_OR, "Now checking whether ORPort %s:%d%s %s reachable... " "(this may take up to %d minutes -- look for log " "messages indicating success)", - address, me->or_port, + me->address, me->or_port, me->dir_port ? dirbuf : "", me->dir_port ? "are" : "is", TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT/60); - tor_free(address); return 1; } /** Return true iff we should send a create_fast cell to start building a given * circuit */ -static inline int +static INLINE int should_use_create_fast_for_circuit(origin_circuit_t *circ) { const or_options_t *options = get_options(); tor_assert(circ->cpath); tor_assert(circ->cpath->extend_info); - if (!circuit_has_usable_onion_key(circ)) { - /* We don't have ntor, and we don't have or can't use TAP, - * so our hand is forced: only a create_fast will work. */ - return 1; - } + if (!circ->cpath->extend_info->onion_key) + return 1; /* our hand is forced: only a create_fast will work. */ if (public_server_mode(options)) { - /* We're a server, and we have a usable onion key. We can choose. + /* We're a server, and we know an onion key. We can choose. * Prefer to blend our circuit into the other circuits we are * creating on behalf of others. */ return 0; } - return networkstatus_get_param(NULL, "usecreatefast", 0, 0, 1); + if (options->FastFirstHopPK == -1) { + /* option is "auto", so look at the consensus. */ + return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1); + } + + return options->FastFirstHopPK; } -/** - * Return true if circ is the type of circuit we want to count - * timeouts from. - * - * In particular, we want to consider any circuit that plans to build - * at least 3 hops (but maybe more), but has 3 or fewer hops built - * so far. - * - * We still want to consider circuits before 3 hops, because we need - * to decide if we should convert them to a measurement circuit in - * circuit_build_times_handle_completed_hop(), rather than letting - * slow circuits get killed right away. +/** Return true if circ is the type of circuit we want to count + * timeouts from. In particular, we want it to have not completed yet + * (already completing indicates we cannibalized it), and we want it to + * have exactly three hops. */ int -circuit_timeout_want_to_count_circ(const origin_circuit_t *circ) +circuit_timeout_want_to_count_circ(origin_circuit_t *circ) { return !circ->has_opened - && circ->build_state->desired_path_len >= DEFAULT_ROUTE_LEN - && circuit_get_cpath_opened_len(circ) <= DEFAULT_ROUTE_LEN; + && circ->build_state->desired_path_len == DEFAULT_ROUTE_LEN; +} + +#ifdef CURVE25519_ENABLED +/** Return true if the ntor handshake is enabled in the configuration, or if + * it's been set to "auto" in the configuration and it's enabled in the + * consensus. */ +static int +circuits_can_use_ntor(void) +{ + const or_options_t *options = get_options(); + if (options->UseNTorHandshake != -1) + return options->UseNTorHandshake; + return networkstatus_get_param(NULL, "UseNTorHandshake", 0, 0, 1); } +#endif /** Decide whether to use a TAP or ntor handshake for connecting to ei * directly, and set *cell_type_out and *handshake_type_out - * accordingly. - * Note that TAP handshakes in CREATE cells are only used for direct - * connections: - * - from Tor2web to intro points not in the client's consensus, and - * - from Single Onions to rend points not in the service's consensus. - * This is checked in onion_populate_cpath. */ + * accordingly. */ static void circuit_pick_create_handshake(uint8_t *cell_type_out, uint16_t *handshake_type_out, const extend_info_t *ei) { - /* torspec says: In general, clients SHOULD use CREATE whenever they are - * using the TAP handshake, and CREATE2 otherwise. */ - if (extend_info_supports_ntor(ei)) { +#ifdef CURVE25519_ENABLED + if (!tor_mem_is_zero((const char*)ei->curve25519_onion_key.public_key, + CURVE25519_PUBKEY_LEN) && + circuits_can_use_ntor()) { *cell_type_out = CELL_CREATE2; *handshake_type_out = ONION_HANDSHAKE_TYPE_NTOR; - } else { - /* XXXX030 Remove support for deciding to use TAP and EXTEND. */ - *cell_type_out = CELL_CREATE; - *handshake_type_out = ONION_HANDSHAKE_TYPE_TAP; + return; } +#else + (void) ei; +#endif + + *cell_type_out = CELL_CREATE; + *handshake_type_out = ONION_HANDSHAKE_TYPE_TAP; } -/** Decide whether to use a TAP or ntor handshake for extending to ei - * and set *handshake_type_out accordingly. Decide whether we should - * use an EXTEND2 or an EXTEND cell to do so, and set *cell_type_out - * and *create_cell_type_out accordingly. - * Note that TAP handshakes in EXTEND cells are only used: - * - from clients to intro points, and - * - from hidden services to rend points. - * This is checked in onion_populate_cpath. - */ +/** Decide whether to use a TAP or ntor handshake for connecting to ei + * directly, and set *handshake_type_out accordingly. Decide whether, + * in extending through node to do so, we should use an EXTEND2 or an + * EXTEND cell to do so, and set *cell_type_out and + * *create_cell_type_out accordingly. */ static void circuit_pick_extend_handshake(uint8_t *cell_type_out, uint8_t *create_cell_type_out, uint16_t *handshake_type_out, + const node_t *node_prev, const extend_info_t *ei) { uint8_t t; circuit_pick_create_handshake(&t, handshake_type_out, ei); - - /* torspec says: Clients SHOULD use the EXTEND format whenever sending a TAP - * handshake... In other cases, clients SHOULD use EXTEND2. */ - if (*handshake_type_out != ONION_HANDSHAKE_TYPE_TAP) { + /* XXXX024 The check for whether the node has a curve25519 key is a bad + * proxy for whether it can do extend2 cells; once a version that + * handles extend2 cells is out, remove it. */ + if (node_prev && + *handshake_type_out != ONION_HANDSHAKE_TYPE_TAP && + (node_has_curve25519_onion_key(node_prev) || + (node_prev->rs && node_prev->rs->version_supports_extend2_cells))) { *cell_type_out = RELAY_COMMAND_EXTEND2; *create_cell_type_out = CELL_CREATE2; } else { - /* XXXX030 Remove support for deciding to use TAP and EXTEND. */ *cell_type_out = RELAY_COMMAND_EXTEND; *create_cell_type_out = CELL_CREATE; } } -/** - * Return true iff purpose is a purpose for a circuit which is - * allowed to have no guard configured, even if the circuit is multihop - * and guards are enabled. - */ -static int -circuit_purpose_may_omit_guard(int purpose) -{ - switch (purpose) { - case CIRCUIT_PURPOSE_TESTING: - case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: - /* Testing circuits may omit guards because they're measuring - * liveness or performance, and don't want guards to interfere. */ - return 1; - default: - /* All other multihop circuits should use guards if guards are - * enabled. */ - return 0; - } -} - /** This is the backbone function for building circuits. * * If circ's first hop is closed, then we need to build a create * cell and send it forward. * - * Otherwise, if circ's cpath still has any non-open hops, we need to - * build a relay extend cell and send it forward to the next non-open hop. - * - * If all hops on the cpath are open, we're done building the circuit - * and we should do housekeeping for the newly opened circuit. + * Otherwise, we need to build a relay extend cell and send it + * forward. * * Return -reason if we want to tear down circ, else return 0. */ int circuit_send_next_onion_skin(origin_circuit_t *circ) { + crypt_path_t *hop; + const node_t *node; + tor_assert(circ); if (circ->cpath->state == CPATH_STATE_CLOSED) { - /* Case one: we're on the first hop. */ - return circuit_send_first_onion_skin(circ); - } - - tor_assert(circ->cpath->state == CPATH_STATE_OPEN); - tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING); - - crypt_path_t *hop = onion_next_hop_in_cpath(circ->cpath); - circuit_build_times_handle_completed_hop(circ); - - if (hop) { - /* Case two: we're on a hop after the first. */ - return circuit_send_intermediate_onion_skin(circ, hop); - } - - /* Case three: the circuit is finished. Do housekeeping tasks on it. */ - return circuit_build_no_more_hops(circ); -} - -/** - * Called from circuit_send_next_onion_skin() when we find ourselves connected - * to the first hop in circ: Send a CREATE or CREATE2 or CREATE_FAST - * cell to that hop. Return 0 on success; -reason on failure (if the circuit - * should be torn down). - */ -static int -circuit_send_first_onion_skin(origin_circuit_t *circ) -{ - int fast; - int len; - const node_t *node; - create_cell_t cc; - memset(&cc, 0, sizeof(cc)); + /* This is the first hop. */ + create_cell_t cc; + int fast; + int len; + log_debug(LD_CIRC,"First skin; sending create cell."); + memset(&cc, 0, sizeof(cc)); + if (circ->build_state->onehop_tunnel) + control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0); + else + control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0); - log_debug(LD_CIRC,"First skin; sending create cell."); + node = node_get_by_id(circ->base_.n_chan->identity_digest); + fast = should_use_create_fast_for_circuit(circ); + if (!fast) { + /* We are an OR and we know the right onion key: we should + * send a create cell. + */ + circuit_pick_create_handshake(&cc.cell_type, &cc.handshake_type, + circ->cpath->extend_info); + note_request("cell: create", 1); + } else { + /* We are not an OR, and we're building the first hop of a circuit to a + * new OR: we can be speedy and use CREATE_FAST to save an RSA operation + * and a DH operation. */ + cc.cell_type = CELL_CREATE_FAST; + cc.handshake_type = ONION_HANDSHAKE_TYPE_FAST; + note_request("cell: create fast", 1); + } - if (circ->build_state->onehop_tunnel) { - control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0); - } else { - control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0); + len = onion_skin_create(cc.handshake_type, + circ->cpath->extend_info, + &circ->cpath->handshake_state, + cc.onionskin); + if (len < 0) { + log_warn(LD_CIRC,"onion_skin_create (first hop) failed."); + return - END_CIRC_REASON_INTERNAL; + } + cc.handshake_len = len; - /* If this is not a one-hop tunnel, the channel is being used - * for traffic that wants anonymity and protection from traffic - * analysis (such as netflow record retention). That means we want - * to pad it. - */ - if (circ->base_.n_chan->channel_usage < CHANNEL_USED_FOR_FULL_CIRCS) - circ->base_.n_chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; - } + if (circuit_deliver_create_cell(TO_CIRCUIT(circ), &cc, 0) < 0) + return - END_CIRC_REASON_RESOURCELIMIT; - node = node_get_by_id(circ->base_.n_chan->identity_digest); - fast = should_use_create_fast_for_circuit(circ); - if (!fast) { - /* We know the right onion key: we should send a create cell. */ - circuit_pick_create_handshake(&cc.cell_type, &cc.handshake_type, - circ->cpath->extend_info); + circ->cpath->state = CPATH_STATE_AWAITING_KEYS; + circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); + log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'", + fast ? "CREATE_FAST" : "CREATE", + node ? node_describe(node) : ""); } else { - /* We don't know an onion key, so we need to fall back to CREATE_FAST. */ - cc.cell_type = CELL_CREATE_FAST; - cc.handshake_type = ONION_HANDSHAKE_TYPE_FAST; - } - - len = onion_skin_create(cc.handshake_type, - circ->cpath->extend_info, - &circ->cpath->handshake_state, - cc.onionskin); - if (len < 0) { - log_warn(LD_CIRC,"onion_skin_create (first hop) failed."); - return - END_CIRC_REASON_INTERNAL; - } - cc.handshake_len = len; + extend_cell_t ec; + int len; + tor_assert(circ->cpath->state == CPATH_STATE_OPEN); + tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING); + log_debug(LD_CIRC,"starting to send subsequent skin."); + hop = onion_next_hop_in_cpath(circ->cpath); + memset(&ec, 0, sizeof(ec)); + if (!hop) { + /* done building the circuit. whew. */ + circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); + if (circuit_timeout_want_to_count_circ(circ)) { + struct timeval end; + long timediff; + tor_gettimeofday(&end); + timediff = tv_mdiff(&circ->base_.timestamp_began, &end); + + /* + * If the circuit build time is much greater than we would have cut + * it off at, we probably had a suspend event along this codepath, + * and we should discard the value. + */ + if (timediff < 0 || + timediff > 2*get_circuit_build_close_time_ms()+1000) { + log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. " + "Assuming clock jump. Purpose %d (%s)", timediff, + circ->base_.purpose, + circuit_purpose_to_string(circ->base_.purpose)); + } else if (!circuit_build_times_disabled()) { + /* Only count circuit times if the network is live */ + if (circuit_build_times_network_check_live( + get_circuit_build_times())) { + circuit_build_times_add_time(get_circuit_build_times_mutable(), + (build_time_t)timediff); + circuit_build_times_set_timeout(get_circuit_build_times_mutable()); + } + + if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { + circuit_build_times_network_circ_success( + get_circuit_build_times_mutable()); + } + } + } + log_info(LD_CIRC,"circuit built!"); + circuit_reset_failure_count(0); - if (circuit_deliver_create_cell(TO_CIRCUIT(circ), &cc, 0) < 0) - return - END_CIRC_REASON_RESOURCELIMIT; + if (circ->build_state->onehop_tunnel || circ->has_opened) { + control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0); + } - circ->cpath->state = CPATH_STATE_AWAITING_KEYS; - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); - log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'", - fast ? "CREATE_FAST" : "CREATE", - node ? node_describe(node) : ""); - return 0; -} + pathbias_count_build_success(circ); + circuit_rep_hist_note_result(circ); + circuit_has_opened(circ); /* do other actions as necessary */ + + if (!can_complete_circuit && !circ->build_state->onehop_tunnel) { + const or_options_t *options = get_options(); + can_complete_circuit=1; + /* FFFF Log a count of known routers here */ + log_notice(LD_GENERAL, + "Tor has successfully opened a circuit. " + "Looks like client functionality is working."); + control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0); + control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED"); + clear_broken_connection_map(1); + if (server_mode(options) && !check_whether_orport_reachable()) { + inform_testing_reachability(); + consider_testing_reachability(1, 1); + } + } -/** - * Called from circuit_send_next_onion_skin() when we find that we have no - * more hops: mark the circuit as finished, and perform the necessary - * bookkeeping. Return 0 on success; -reason on failure (if the circuit - * should be torn down). - */ -static int -circuit_build_no_more_hops(origin_circuit_t *circ) -{ - guard_usable_t r; - if (! circ->guard_state) { - if (circuit_get_cpath_len(circ) != 1 && - ! circuit_purpose_may_omit_guard(circ->base_.purpose) && - get_options()->UseEntryGuards) { - log_warn(LD_BUG, "%d-hop circuit %p with purpose %d has no " - "guard state", - circuit_get_cpath_len(circ), circ, circ->base_.purpose); + /* We're done with measurement circuits here. Just close them */ + if (circ->base_.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); + } + return 0; } - r = GUARD_USABLE_NOW; - } else { - r = entry_guard_succeeded(&circ->guard_state); - } - const int is_usable_for_streams = (r == GUARD_USABLE_NOW); - if (r == GUARD_USABLE_NOW) { - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); - } else if (r == GUARD_MAYBE_USABLE_LATER) { - // Wait till either a better guard succeeds, or till - // all better guards fail. - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_GUARD_WAIT); - } else { - tor_assert_nonfatal(r == GUARD_USABLE_NEVER); - return - END_CIRC_REASON_INTERNAL; - } - /* XXXX #21422 -- the rest of this branch needs careful thought! - * Some of the things here need to happen when a circuit becomes - * mechanically open; some need to happen when it is actually usable. - * I think I got them right, but more checking would be wise. -NM - */ - - log_info(LD_CIRC,"circuit built!"); - circuit_reset_failure_count(0); - - if (circ->build_state->onehop_tunnel || circ->has_opened) { - control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0); - } - - pathbias_count_build_success(circ); - circuit_rep_hist_note_result(circ); - if (is_usable_for_streams) - circuit_has_opened(circ); /* do other actions as necessary */ - - if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) { - const or_options_t *options = get_options(); - note_that_we_completed_a_circuit(); - /* FFFF Log a count of known routers here */ - log_notice(LD_GENERAL, - "Tor has successfully opened a circuit. " - "Looks like client functionality is working."); - if (control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0) == 0) { - log_notice(LD_GENERAL, - "Tor has successfully opened a circuit. " - "Looks like client functionality is working."); - } - control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED"); - clear_broken_connection_map(1); - if (server_mode(options) && !check_whether_orport_reachable(options)) { - inform_testing_reachability(); - consider_testing_reachability(1, 1); + if (tor_addr_family(&hop->extend_info->addr) != AF_INET) { + log_warn(LD_BUG, "Trying to extend to a non-IPv4 address."); + return - END_CIRC_REASON_INTERNAL; } - } - - /* We're done with measurement circuits here. Just close them */ - if (circ->base_.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); - } - return 0; -} -/** - * Called from circuit_send_next_onion_skin() when we find that we have a hop - * other than the first that we need to extend to: use hop's - * information to extend the circuit another step. Return 0 on success; - * -reason on failure (if the circuit should be torn down). - */ -static int -circuit_send_intermediate_onion_skin(origin_circuit_t *circ, - crypt_path_t *hop) -{ - int len; - extend_cell_t ec; - memset(&ec, 0, sizeof(ec)); - - log_debug(LD_CIRC,"starting to send subsequent skin."); + { + const node_t *prev_node; + prev_node = node_get_by_id(hop->prev->extend_info->identity_digest); + circuit_pick_extend_handshake(&ec.cell_type, + &ec.create_cell.cell_type, + &ec.create_cell.handshake_type, + prev_node, + hop->extend_info); + } - if (tor_addr_family(&hop->extend_info->addr) != AF_INET) { - log_warn(LD_BUG, "Trying to extend to a non-IPv4 address."); - return - END_CIRC_REASON_INTERNAL; - } + tor_addr_copy(&ec.orport_ipv4.addr, &hop->extend_info->addr); + ec.orport_ipv4.port = hop->extend_info->port; + tor_addr_make_unspec(&ec.orport_ipv6.addr); + memcpy(ec.node_id, hop->extend_info->identity_digest, DIGEST_LEN); + + len = onion_skin_create(ec.create_cell.handshake_type, + hop->extend_info, + &hop->handshake_state, + ec.create_cell.onionskin); + if (len < 0) { + log_warn(LD_CIRC,"onion_skin_create failed."); + return - END_CIRC_REASON_INTERNAL; + } + ec.create_cell.handshake_len = len; - circuit_pick_extend_handshake(&ec.cell_type, - &ec.create_cell.cell_type, - &ec.create_cell.handshake_type, - hop->extend_info); - - tor_addr_copy(&ec.orport_ipv4.addr, &hop->extend_info->addr); - ec.orport_ipv4.port = hop->extend_info->port; - tor_addr_make_unspec(&ec.orport_ipv6.addr); - memcpy(ec.node_id, hop->extend_info->identity_digest, DIGEST_LEN); - /* Set the ED25519 identity too -- it will only get included - * in the extend2 cell if we're configured to use it, though. */ - ed25519_pubkey_copy(&ec.ed_pubkey, &hop->extend_info->ed_identity); - - len = onion_skin_create(ec.create_cell.handshake_type, - hop->extend_info, - &hop->handshake_state, - ec.create_cell.onionskin); - if (len < 0) { - log_warn(LD_CIRC,"onion_skin_create failed."); - return - END_CIRC_REASON_INTERNAL; - } - ec.create_cell.handshake_len = len; + log_info(LD_CIRC,"Sending extend relay cell."); + note_request("cell: extend", 1); + { + uint8_t command = 0; + uint16_t payload_len=0; + uint8_t payload[RELAY_PAYLOAD_SIZE]; + if (extend_cell_format(&command, &payload_len, payload, &ec)<0) { + log_warn(LD_CIRC,"Couldn't format extend cell"); + return -END_CIRC_REASON_INTERNAL; + } - log_info(LD_CIRC,"Sending extend relay cell."); - { - uint8_t command = 0; - uint16_t payload_len=0; - uint8_t payload[RELAY_PAYLOAD_SIZE]; - if (extend_cell_format(&command, &payload_len, payload, &ec)<0) { - log_warn(LD_CIRC,"Couldn't format extend cell"); - return -END_CIRC_REASON_INTERNAL; + /* send it to hop->prev, because it will transfer + * it to a create cell and then send to hop */ + if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), + command, + (char*)payload, payload_len, + hop->prev) < 0) + return 0; /* circuit is closed */ } - - /* send it to hop->prev, because that relay will transfer - * it to a create cell and then send to hop */ - if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), - command, - (char*)payload, payload_len, - hop->prev) < 0) - return 0; /* circuit is closed */ + hop->state = CPATH_STATE_AWAITING_KEYS; } - hop->state = CPATH_STATE_AWAITING_KEYS; return 0; } @@ -1181,16 +944,11 @@ circuit_note_clock_jumped(int seconds_elapsed) seconds_elapsed >=0 ? "forward" : "backward"); control_event_general_status(LOG_WARN, "CLOCK_JUMPED TIME=%d", seconds_elapsed); - /* so we log when it works again */ - note_that_we_maybe_cant_complete_circuits(); + can_complete_circuit=0; /* so it'll log when it works again */ control_event_client_status(severity, "CIRCUIT_NOT_ESTABLISHED REASON=%s", "CLOCK_JUMPED"); circuit_mark_all_unused_circs(); circuit_mark_all_dirty_circs_as_unusable(); - if (seconds_elapsed < 0) { - /* Restart all the timers in case we jumped a long way into the past. */ - reset_all_main_loop_timers(); - } } /** Take the 'extend' cell, pull out addr/port plus the onion @@ -1252,7 +1010,7 @@ circuit_extend(cell_t *cell, circuit_t *circ) /* Check if they asked us for 0000..0000. We support using * an empty fingerprint for the first hop (e.g. for a bridge relay), - * but we don't want to let clients send us extend cells for empty + * but we don't want to let people send us extend cells for empty * fingerprints -- a) because it opens the user up to a mitm attack, * and b) because it lets an attacker force the relay to hold open a * new TLS connection for each extend request. */ @@ -1262,18 +1020,6 @@ circuit_extend(cell_t *cell, circuit_t *circ) return -1; } - /* Fill in ed_pubkey if it was not provided and we can infer it from - * our networkstatus */ - if (ed25519_public_key_is_zero(&ec.ed_pubkey)) { - const node_t *node = node_get_by_id((const char*)ec.node_id); - const ed25519_public_key_t *node_ed_id = NULL; - if (node && - node_supports_ed25519_link_authentication(node, 1) && - (node_ed_id = node_get_ed25519_id(node))) { - ed25519_pubkey_copy(&ec.ed_pubkey, node_ed_id); - } - } - /* Next, check if we're being asked to connect to the hop that the * extend cell came from. There isn't any reason for that, and it can * assist circular-path attacks. */ @@ -1285,17 +1031,7 @@ circuit_extend(cell_t *cell, circuit_t *circ) return -1; } - /* Check the previous hop Ed25519 ID too */ - if (! ed25519_public_key_is_zero(&ec.ed_pubkey) && - ed25519_pubkey_eq(&ec.ed_pubkey, - &TO_OR_CIRCUIT(circ)->p_chan->ed25519_identity)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to extend back to the previous hop " - "(by Ed25519 ID)."); - } - n_chan = channel_get_for_extend((const char*)ec.node_id, - &ec.ed_pubkey, &ec.orport_ipv4.addr, &msg, &should_launch); @@ -1307,9 +1043,8 @@ circuit_extend(cell_t *cell, circuit_t *circ) circ->n_hop = extend_info_new(NULL /*nickname*/, (const char*)ec.node_id, - &ec.ed_pubkey, - NULL, /*onion_key*/ - NULL, /*curve25519_key*/ + NULL /*onion_key*/, + NULL /*curve25519_key*/, &ec.orport_ipv4.addr, ec.orport_ipv4.port); @@ -1322,8 +1057,7 @@ circuit_extend(cell_t *cell, circuit_t *circ) /* we should try to open a connection */ n_chan = channel_connect_for_circuit(&ec.orport_ipv4.addr, ec.orport_ipv4.port, - (const char*)ec.node_id, - &ec.ed_pubkey); + (const char*)ec.node_id); if (!n_chan) { log_info(LD_CIRC,"Launching n_chan failed. Closing circuit."); circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); @@ -1350,77 +1084,40 @@ circuit_extend(cell_t *cell, circuit_t *circ) return 0; } -/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in key_data. - * - * If is_hs_v3 is set, this cpath will be used for next gen hidden - * service circuits and key_data must be at least - * HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN bytes in length. - * - * If is_hs_v3 is not set, key_data must contain CPATH_KEY_MATERIAL_LEN - * bytes, which are used as follows: +/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in + * key_data. key_data must contain CPATH_KEY_MATERIAL bytes, which are + * used as follows: * - 20 to initialize f_digest * - 20 to initialize b_digest * - 16 to key f_crypto * - 16 to key b_crypto * * (If 'reverse' is true, then f_XX and b_XX are swapped.) - * - * Return 0 if init was successful, else -1 if it failed. */ int -circuit_init_cpath_crypto(crypt_path_t *cpath, - const char *key_data, size_t key_data_len, - int reverse, int is_hs_v3) +circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, + int reverse) { crypto_digest_t *tmp_digest; crypto_cipher_t *tmp_crypto; - size_t digest_len = 0; - size_t cipher_key_len = 0; tor_assert(cpath); tor_assert(key_data); tor_assert(!(cpath->f_crypto || cpath->b_crypto || cpath->f_digest || cpath->b_digest)); - /* Basic key size validation */ - if (is_hs_v3 && BUG(key_data_len != HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN)) { - return -1; - } else if (!is_hs_v3 && BUG(key_data_len != CPATH_KEY_MATERIAL_LEN)) { - return -1; - } - - /* If we are using this cpath for next gen onion services use SHA3-256, - otherwise use good ol' SHA1 */ - if (is_hs_v3) { - digest_len = DIGEST256_LEN; - cipher_key_len = CIPHER256_KEY_LEN; - cpath->f_digest = crypto_digest256_new(DIGEST_SHA3_256); - cpath->b_digest = crypto_digest256_new(DIGEST_SHA3_256); - } else { - digest_len = DIGEST_LEN; - cipher_key_len = CIPHER_KEY_LEN; - cpath->f_digest = crypto_digest_new(); - cpath->b_digest = crypto_digest_new(); - } - - tor_assert(digest_len != 0); - tor_assert(cipher_key_len != 0); - const int cipher_key_bits = (int) cipher_key_len * 8; - - crypto_digest_add_bytes(cpath->f_digest, key_data, digest_len); - crypto_digest_add_bytes(cpath->b_digest, key_data+digest_len, digest_len); + cpath->f_digest = crypto_digest_new(); + crypto_digest_add_bytes(cpath->f_digest, key_data, DIGEST_LEN); + cpath->b_digest = crypto_digest_new(); + crypto_digest_add_bytes(cpath->b_digest, key_data+DIGEST_LEN, DIGEST_LEN); - cpath->f_crypto = crypto_cipher_new_with_bits(key_data+(2*digest_len), - cipher_key_bits); - if (!cpath->f_crypto) { + if (!(cpath->f_crypto = + crypto_cipher_new(key_data+(2*DIGEST_LEN)))) { log_warn(LD_BUG,"Forward cipher initialization failed."); return -1; } - - cpath->b_crypto = crypto_cipher_new_with_bits( - key_data+(2*digest_len)+cipher_key_len, - cipher_key_bits); - if (!cpath->b_crypto) { + if (!(cpath->b_crypto = + crypto_cipher_new(key_data+(2*DIGEST_LEN)+CIPHER_KEY_LEN))) { log_warn(LD_BUG,"Backward cipher initialization failed."); return -1; } @@ -1454,10 +1151,8 @@ circuit_finish_handshake(origin_circuit_t *circ, crypt_path_t *hop; int rv; - if ((rv = pathbias_count_build_attempt(circ)) < 0) { - log_warn(LD_CIRC, "pathbias_count_build_attempt failed: %d", rv); + if ((rv = pathbias_count_build_attempt(circ)) < 0) return rv; - } if (circ->cpath->state == CPATH_STATE_AWAITING_KEYS) { hop = circ->cpath; @@ -1471,22 +1166,19 @@ circuit_finish_handshake(origin_circuit_t *circ, tor_assert(hop->state == CPATH_STATE_AWAITING_KEYS); { - const char *msg = NULL; if (onion_skin_client_handshake(hop->handshake_state.tag, &hop->handshake_state, reply->reply, reply->handshake_len, (uint8_t*)keys, sizeof(keys), - (uint8_t*)hop->rend_circ_nonce, - &msg) < 0) { - if (msg) - log_warn(LD_CIRC,"onion_skin_client_handshake failed: %s", msg); + (uint8_t*)hop->rend_circ_nonce) < 0) { + log_warn(LD_CIRC,"onion_skin_client_handshake failed."); return -END_CIRC_REASON_TORPROTOCOL; } } onion_handshake_state_release(&hop->handshake_state); - if (circuit_init_cpath_crypto(hop, keys, sizeof(keys), 0, 0)<0) { + if (circuit_init_cpath_crypto(hop, keys, 0)<0) { return -END_CIRC_REASON_TORPROTOCOL; } @@ -1544,7 +1236,7 @@ circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, int reason) log_info(LD_CIRC, "finished"); return 0; -#endif /* 0 */ +#endif } /** Given a response payload and keys, initialize, then send a created @@ -1553,14 +1245,12 @@ circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, int reason) int onionskin_answer(or_circuit_t *circ, const created_cell_t *created_cell, - const char *keys, size_t keys_len, + const char *keys, const uint8_t *rend_circ_nonce) { cell_t cell; crypt_path_t *tmp_cpath; - tor_assert(keys_len == CPATH_KEY_MATERIAL_LEN); - if (created_cell_format(&cell, created_cell) < 0) { log_warn(LD_BUG,"couldn't format created cell (type=%d, len=%d)", (int)created_cell->cell_type, (int)created_cell->handshake_len); @@ -1576,7 +1266,7 @@ onionskin_answer(or_circuit_t *circ, log_debug(LD_CIRC,"init digest forward 0x%.8x, backward 0x%.8x.", (unsigned int)get_uint32(keys), (unsigned int)get_uint32(keys+20)); - if (circuit_init_cpath_crypto(tmp_cpath, keys, keys_len, 0, 0)<0) { + if (circuit_init_cpath_crypto(tmp_cpath, keys, 0)<0) { log_warn(LD_BUG,"Circuit initialization failed"); tor_free(tmp_cpath); return -1; @@ -1590,20 +1280,15 @@ onionskin_answer(or_circuit_t *circ, memcpy(circ->rend_circ_nonce, rend_circ_nonce, DIGEST_LEN); - int used_create_fast = (created_cell->cell_type == CELL_CREATED_FAST); + circ->is_first_hop = (created_cell->cell_type == CELL_CREATED_FAST); append_cell_to_circuit_queue(TO_CIRCUIT(circ), circ->p_chan, &cell, CELL_DIRECTION_IN, 0); log_debug(LD_CIRC,"Finished sending '%s' cell.", - used_create_fast ? "created_fast" : "created"); - - /* Ignore the local bit when ExtendAllowPrivateAddresses is set: - * it violates the assumption that private addresses are local. - * Also, many test networks run on local addresses, and - * TestingTorNetwork sets ExtendAllowPrivateAddresses. */ - if ((!channel_is_local(circ->p_chan) - || get_options()->ExtendAllowPrivateAddresses) - && !channel_is_outgoing(circ->p_chan)) { + circ->is_first_hop ? "created_fast" : "created"); + + if (!channel_is_local(circ->p_chan) && + !channel_is_outgoing(circ->p_chan)) { /* record that we could process create cells from a non-local conn * that we didn't initiate; presumably this means that create cells * can reach us too. */ @@ -1613,106 +1298,25 @@ onionskin_answer(or_circuit_t *circ, return 0; } -/** Helper for new_route_len(). Choose a circuit length for purpose - * purpose: DEFAULT_ROUTE_LEN (+ 1 if someone else chose the - * exit). If someone else chose the exit, they could be colluding - * with the exit, so add a randomly selected node to preserve - * anonymity. - * - * Here, "exit node" sometimes means an OR acting as an internal - * endpoint, rather than as a relay to an external endpoint. This - * means there need to be at least DEFAULT_ROUTE_LEN routers between - * us and the internal endpoint to preserve the same anonymity - * properties that we would get when connecting to an external - * endpoint. These internal endpoints can include: - * - * - Connections to a directory of hidden services - * (CIRCUIT_PURPOSE_C_GENERAL) - * - * - A client connecting to an introduction point, which the hidden - * service picked (CIRCUIT_PURPOSE_C_INTRODUCING, via - * circuit_get_open_circ_or_launch() which rewrites it from - * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) - * - * - A hidden service connecting to a rendezvous point, which the - * client picked (CIRCUIT_PURPOSE_S_CONNECT_REND, via - * rend_service_receive_introduction() and - * rend_service_relaunch_rendezvous) - * - * There are currently two situations where we picked the exit node - * ourselves, making DEFAULT_ROUTE_LEN a safe circuit length: - * - * - We are a hidden service connecting to an introduction point - * (CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, via - * rend_service_launch_establish_intro()) - * - * - We are a router testing its own reachabiity - * (CIRCUIT_PURPOSE_TESTING, via consider_testing_reachability()) - * - * onion_pick_cpath_exit() bypasses us (by not calling - * new_route_len()) in the one-hop tunnel case, so we don't need to - * handle that. - */ -static int -route_len_for_purpose(uint8_t purpose, extend_info_t *exit_ei) -{ - int routelen = DEFAULT_ROUTE_LEN; - int known_purpose = 0; - - if (!exit_ei) - return routelen; - - switch (purpose) { - /* These two purposes connect to a router that we chose, so - * DEFAULT_ROUTE_LEN is safe. */ - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* hidden service connecting to introduction point */ - case CIRCUIT_PURPOSE_TESTING: - /* router reachability testing */ - known_purpose = 1; - break; - - /* These three purposes connect to a router that someone else - * might have chosen, so add an extra hop to protect anonymity. */ - case CIRCUIT_PURPOSE_C_GENERAL: - /* connecting to hidden service directory */ - case CIRCUIT_PURPOSE_C_INTRODUCING: - /* client connecting to introduction point */ - case CIRCUIT_PURPOSE_S_CONNECT_REND: - /* hidden service connecting to rendezvous point */ - known_purpose = 1; - routelen++; - break; - - default: - /* Got a purpose not listed above along with a chosen exit. - * Increase the circuit length by one anyway for safety. */ - routelen++; - break; - } - - if (BUG(exit_ei && !known_purpose)) { - log_warn(LD_BUG, "Unhandled purpose %d with a chosen exit; " - "assuming routelen %d.", purpose, routelen); - } - return routelen; -} - -/** Choose a length for a circuit of purpose purpose and check - * if enough routers are available. +/** Choose a length for a circuit of purpose purpose: three + the + * number of endpoints that would give something away about our destination. * * If the routerlist nodes doesn't have enough routers * to handle the desired path length, return -1. */ -STATIC int -new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes) +static int +new_route_len(uint8_t purpose, extend_info_t *exit, smartlist_t *nodes) { int num_acceptable_routers; int routelen; tor_assert(nodes); - routelen = route_len_for_purpose(purpose, exit_ei); + routelen = DEFAULT_ROUTE_LEN; + if (exit && + purpose != CIRCUIT_PURPOSE_TESTING && + purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) + routelen++; num_acceptable_routers = count_acceptable_nodes(nodes); @@ -1745,9 +1349,9 @@ circuit_get_unhandled_ports(time_t now) * If we're returning 0, set need_uptime and need_capacity to * indicate any requirements that the unhandled ports have. */ -MOCK_IMPL(int, -circuit_all_predicted_ports_handled, (time_t now, int *need_uptime, - int *need_capacity)) +int +circuit_all_predicted_ports_handled(time_t now, int *need_uptime, + int *need_capacity) { int i, enough; uint16_t *port; @@ -1833,7 +1437,7 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) int n_best_support=0; const or_options_t *options = get_options(); const smartlist_t *the_nodes; - const node_t *selected_node=NULL; + const node_t *node=NULL; connections = get_connection_array(); @@ -1855,7 +1459,7 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) * -1 means "Don't use this router at all." */ the_nodes = nodelist_get_list(); - n_supported = tor_calloc(smartlist_len(the_nodes), sizeof(int)); + n_supported = tor_malloc(sizeof(int)*smartlist_len(the_nodes)); SMARTLIST_FOREACH_BEGIN(the_nodes, const node_t *, node) { const int i = node_sl_idx; if (router_digest_is_me(node->identity)) { @@ -1896,16 +1500,15 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) * we'll retry later in this function with need_update and * need_capacity set to 0. */ } - if (!(node->is_valid)) { + if (!(node->is_valid || options->AllowInvalid_ & ALLOW_INVALID_EXIT)) { /* if it's invalid and we don't want it */ n_supported[i] = -1; // log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- invalid router.", // router->nickname, i); continue; /* skip invalid routers */ } - /* We do not allow relays that allow single hop exits by default. Option - * was deprecated in 0.2.9.2-alpha and removed in 0.3.1.0-alpha. */ - if (node_allows_single_hop_exits(node)) { + if (options->ExcludeSingleHopRelays && + node_allows_single_hop_exits(node)) { n_supported[i] = -1; continue; } @@ -1961,7 +1564,7 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) smartlist_add(supporting, (void*)node); }); - selected_node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); + node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); smartlist_free(supporting); } else { /* Either there are no pending connections, or no routers even seem to @@ -1999,8 +1602,8 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) } } SMARTLIST_FOREACH_END(node); - selected_node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); - if (selected_node) + node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); + if (node) break; smartlist_clear(supporting); /* If we reach this point, we can't actually support any unhandled @@ -2014,115 +1617,19 @@ choose_good_exit_server_general(int need_uptime, int need_capacity) } tor_free(n_supported); - if (selected_node) { - log_info(LD_CIRC, "Chose exit server '%s'", node_describe(selected_node)); - return selected_node; + if (node) { + log_info(LD_CIRC, "Chose exit server '%s'", node_describe(node)); + return node; } if (options->ExitNodes) { log_warn(LD_CIRC, - "No exits in ExitNodes%s seem to be running: " + "No specified %sexit routers seem to be running: " "can't choose an exit.", - options->ExcludeExitNodesUnion_ ? - ", except possibly those excluded by your configuration, " : ""); + options->ExcludeExitNodesUnion_ ? "non-excluded " : ""); } return NULL; } -#if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) -/* The config option Tor2webRendezvousPoints has been set and we need - * to pick an RP out of that set. Make sure that the RP we choose is - * alive, and return it. Return NULL if no usable RP could be found in - * Tor2webRendezvousPoints. */ -STATIC const node_t * -pick_tor2web_rendezvous_node(router_crn_flags_t flags, - const or_options_t *options) -{ - const node_t *rp_node = NULL; - const int need_desc = (flags & CRN_NEED_DESC) != 0; - const int pref_addr = (flags & CRN_PREF_ADDR) != 0; - const int direct_conn = (flags & CRN_DIRECT_CONN) != 0; - - smartlist_t *whitelisted_live_rps = smartlist_new(); - smartlist_t *all_live_nodes = smartlist_new(); - - tor_assert(options->Tor2webRendezvousPoints); - - /* Add all running nodes to all_live_nodes */ - router_add_running_nodes_to_smartlist(all_live_nodes, - 0, 0, 0, - need_desc, - pref_addr, - direct_conn); - - /* Filter all_live_nodes to only add live *and* whitelisted RPs to - * the list whitelisted_live_rps. */ - SMARTLIST_FOREACH_BEGIN(all_live_nodes, node_t *, live_node) { - if (routerset_contains_node(options->Tor2webRendezvousPoints, live_node)) { - smartlist_add(whitelisted_live_rps, live_node); - } - } SMARTLIST_FOREACH_END(live_node); - - /* Honor ExcludeNodes */ - if (options->ExcludeNodes) { - routerset_subtract_nodes(whitelisted_live_rps, options->ExcludeNodes); - } - - /* Now pick randomly amongst the whitelisted RPs. No need to waste time - doing bandwidth load balancing, for most use cases - 'whitelisted_live_rps' contains a single OR anyway. */ - rp_node = smartlist_choose(whitelisted_live_rps); - - if (!rp_node) { - log_warn(LD_REND, "Could not find a Rendezvous Point that suits " - "the purposes of Tor2webRendezvousPoints. Choosing random one."); - } - - smartlist_free(whitelisted_live_rps); - smartlist_free(all_live_nodes); - - return rp_node; -} -#endif /* defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) */ - -/* Pick a Rendezvous Point for our HS circuits according to flags. */ -static const node_t * -pick_rendezvous_node(router_crn_flags_t flags) -{ - const or_options_t *options = get_options(); - -#ifdef ENABLE_TOR2WEB_MODE - /* We want to connect directly to the node if we can */ - router_crn_flags_t direct_flags = flags; - direct_flags |= CRN_PREF_ADDR; - direct_flags |= CRN_DIRECT_CONN; - - /* The user wants us to pick specific RPs. */ - if (options->Tor2webRendezvousPoints) { - const node_t *tor2web_rp = pick_tor2web_rendezvous_node(direct_flags, - options); - if (tor2web_rp) { - return tor2web_rp; - } - } - - /* Else, if no direct, preferred tor2web RP was found, fall back to choosing - * a random direct node */ - const node_t *node = router_choose_random_node(NULL, options->ExcludeNodes, - direct_flags); - /* Return the direct node (if found), or log a message and fall back to an - * indirect connection. */ - if (node) { - return node; - } else { - log_info(LD_REND, - "Unable to find a random rendezvous point that is reachable via " - "a direct connection, falling back to a 3-hop path."); - } -#endif /* defined(ENABLE_TOR2WEB_MODE) */ - - return router_choose_random_node(NULL, options->ExcludeNodes, flags); -} - /** Return a pointer to a suitable router to be the exit node for the * circuit of purpose purpose that we're about to build (or NULL * if no router is suitable). @@ -2135,8 +1642,7 @@ pick_rendezvous_node(router_crn_flags_t flags) */ static const node_t * choose_good_exit_server(uint8_t purpose, - int need_uptime, int need_capacity, int is_internal, - int need_hs_v3) + int need_uptime, int need_capacity, int is_internal) { const or_options_t *options = get_options(); router_crn_flags_t flags = CRN_NEED_DESC; @@ -2144,23 +1650,19 @@ choose_good_exit_server(uint8_t purpose, flags |= CRN_NEED_UPTIME; if (need_capacity) flags |= CRN_NEED_CAPACITY; - if (need_hs_v3) - flags |= CRN_RENDEZVOUS_V3; switch (purpose) { case CIRCUIT_PURPOSE_C_GENERAL: + if (options->AllowInvalid_ & ALLOW_INVALID_MIDDLE) + flags |= CRN_ALLOW_INVALID; if (is_internal) /* pick it like a middle hop */ return router_choose_random_node(NULL, options->ExcludeNodes, flags); else return choose_good_exit_server_general(need_uptime,need_capacity); case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - { - /* Pick a new RP */ - const node_t *rendezvous_node = pick_rendezvous_node(flags); - log_info(LD_REND, "Picked new RP: %s", - safe_str_client(node_describe(rendezvous_node))); - return rendezvous_node; - } + if (options->AllowInvalid_ & ALLOW_INVALID_RENDEZVOUS) + flags |= CRN_ALLOW_INVALID; + return router_choose_random_node(NULL, options->ExcludeNodes, flags); } log_warn(LD_BUG,"Unhandled purpose %d", purpose); tor_fragile_assert(); @@ -2170,8 +1672,7 @@ choose_good_exit_server(uint8_t purpose, /** Log a warning if the user specified an exit for the circuit that * has been excluded from use by ExcludeNodes or ExcludeExitNodes. */ static void -warn_if_last_router_excluded(origin_circuit_t *circ, - const extend_info_t *exit_ei) +warn_if_last_router_excluded(origin_circuit_t *circ, const extend_info_t *exit) { const or_options_t *options = get_options(); routerset_t *rs = options->ExcludeNodes; @@ -2218,13 +1719,13 @@ warn_if_last_router_excluded(origin_circuit_t *circ, break; } - if (routerset_contains_extendinfo(rs, exit_ei)) { + if (routerset_contains_extendinfo(rs, exit)) { /* We should never get here if StrictNodes is set to 1. */ if (options->StrictNodes) { log_warn(LD_BUG, "Using %s '%s' which is listed in ExcludeNodes%s, " "even though StrictNodes is set. Please report. " "(Circuit purpose: %s)", - description, extend_info_describe(exit_ei), + description, extend_info_describe(exit), rs==options->ExcludeNodes?"":" or ExcludeExitNodes", circuit_purpose_to_string(purpose)); } else { @@ -2233,7 +1734,7 @@ warn_if_last_router_excluded(origin_circuit_t *circ, "prevent this (and possibly break your Tor functionality), " "set the StrictNodes configuration option. " "(Circuit purpose: %s)", - description, extend_info_describe(exit_ei), + description, extend_info_describe(exit), rs==options->ExcludeNodes?"":" or ExcludeExitNodes", circuit_purpose_to_string(purpose)); } @@ -2245,49 +1746,39 @@ warn_if_last_router_excluded(origin_circuit_t *circ, /** Decide a suitable length for circ's cpath, and pick an exit * router (or use exit if provided). Store these in the - * cpath. - * - * If is_hs_v3_rp_circuit is set, then this exit should be suitable to - * be used as an HS v3 rendezvous point. - * - * Return 0 if ok, -1 if circuit should be closed. */ + * cpath. Return 0 if ok, -1 if circuit should be closed. */ static int -onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit_ei, - int is_hs_v3_rp_circuit) +onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) { cpath_build_state_t *state = circ->build_state; if (state->onehop_tunnel) { - log_debug(LD_CIRC, "Launching a one-hop circuit for dir tunnel%s.", - (rend_allow_non_anonymous_connection(get_options()) ? - ", or intro or rendezvous connection" : "")); + log_debug(LD_CIRC, "Launching a one-hop circuit for dir tunnel."); state->desired_path_len = 1; } else { - int r = new_route_len(circ->base_.purpose, exit_ei, nodelist_get_list()); + int r = new_route_len(circ->base_.purpose, exit, nodelist_get_list()); if (r < 1) /* must be at least 1 */ return -1; state->desired_path_len = r; } - if (exit_ei) { /* the circuit-builder pre-requested one */ - warn_if_last_router_excluded(circ, exit_ei); + if (exit) { /* the circuit-builder pre-requested one */ + warn_if_last_router_excluded(circ, exit); log_info(LD_CIRC,"Using requested exit node '%s'", - extend_info_describe(exit_ei)); - exit_ei = extend_info_dup(exit_ei); + extend_info_describe(exit)); + exit = extend_info_dup(exit); } else { /* we have to decide one */ const node_t *node = choose_good_exit_server(circ->base_.purpose, state->need_uptime, - state->need_capacity, state->is_internal, - is_hs_v3_rp_circuit); + state->need_capacity, state->is_internal); if (!node) { - log_warn(LD_CIRC,"Failed to choose an exit server"); + log_warn(LD_CIRC,"failed to choose an exit server"); return -1; } - exit_ei = extend_info_from_node(node, 0); - if (BUG(exit_ei == NULL)) - return -1; + exit = extend_info_from_node(node, 0); + tor_assert(exit); } - state->chosen_exit = exit_ei; + state->chosen_exit = exit; return 0; } @@ -2296,19 +1787,19 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit_ei, * the caller will do this if it wants to. */ int -circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) +circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit) { cpath_build_state_t *state; - tor_assert(exit_ei); + tor_assert(exit); tor_assert(circ); state = circ->build_state; tor_assert(state); extend_info_free(state->chosen_exit); - state->chosen_exit = extend_info_dup(exit_ei); + state->chosen_exit = extend_info_dup(exit); ++circ->build_state->desired_path_len; - onion_append_hop(&circ->cpath, exit_ei); + onion_append_hop(&circ->cpath, exit); return 0; } @@ -2317,18 +1808,18 @@ circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) * send the next extend cell to begin connecting to that hop. */ int -circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) +circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit) { int err_reason = 0; - warn_if_last_router_excluded(circ, exit_ei); + warn_if_last_router_excluded(circ, exit); tor_gettimeofday(&circ->base_.timestamp_began); - circuit_append_new_exit(circ, exit_ei); + circuit_append_new_exit(circ, exit); circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); if ((err_reason = circuit_send_next_onion_skin(circ))<0) { log_warn(LD_CIRC, "Couldn't extend circuit to new point %s.", - extend_info_describe(exit_ei)); + extend_info_describe(exit)); circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason); return -1; } @@ -2341,8 +1832,8 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) /** Return the number of routers in routers that are currently up * and available for building circuits through. */ -MOCK_IMPL(STATIC int, -count_acceptable_nodes, (smartlist_t *nodes)) +static int +count_acceptable_nodes(smartlist_t *nodes) { int num=0; @@ -2358,9 +1849,10 @@ count_acceptable_nodes, (smartlist_t *nodes)) continue; if (! node_has_descriptor(node)) continue; - /* The node has a descriptor, so we can just check the ntor key directly */ - if (!node_has_curve25519_onion_key(node)) - continue; + /* XXX This clause makes us count incorrectly: if AllowInvalidRouters + * allows this node in some places, then we're getting an inaccurate + * count. For now, be conservative and don't count it. But later we + * should try to be smarter. */ ++num; } SMARTLIST_FOREACH_END(node); @@ -2386,30 +1878,6 @@ onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop) } } -#ifdef TOR_UNIT_TESTS - -/** Unittest helper function: Count number of hops in cpath linked list. */ -unsigned int -cpath_get_n_hops(crypt_path_t **head_ptr) -{ - unsigned int n_hops = 0; - crypt_path_t *tmp; - - if (!*head_ptr) { - return 0; - } - - tmp = *head_ptr; - do { - n_hops++; - tmp = tmp->next; - } while (tmp != *head_ptr); - - return n_hops; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - /** A helper function used by onion_extend_cpath(). Use purpose * and state and the cpath head (currently populated only * to length cur_len to decide a suitable middle hop for a @@ -2431,8 +1899,7 @@ choose_good_middle_server(uint8_t purpose, tor_assert(CIRCUIT_PURPOSE_MIN_ <= purpose && purpose <= CIRCUIT_PURPOSE_MAX_); - log_debug(LD_CIRC, "Contemplating intermediate hop #%d: random choice.", - cur_len+1); + log_debug(LD_CIRC, "Contemplating intermediate hop: random choice."); excluded = smartlist_new(); if ((r = build_state_get_exit_node(state))) { nodelist_add_node_and_family(excluded, r); @@ -2447,6 +1914,8 @@ choose_good_middle_server(uint8_t purpose, flags |= CRN_NEED_UPTIME; if (state->need_capacity) flags |= CRN_NEED_CAPACITY; + if (options->AllowInvalid_ & ALLOW_INVALID_MIDDLE) + flags |= CRN_ALLOW_INVALID; choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); smartlist_free(excluded); return choice; @@ -2457,34 +1926,24 @@ choose_good_middle_server(uint8_t purpose, * router (if we're an OR), and respect firewall settings; if we're * configured to use entry guards, return one. * - * Set *guard_state_out to information about the guard that - * we're selecting, which we'll use later to remember whether the - * guard worked or not. + * If state is NULL, we're choosing a router to serve as an entry + * guard, not for any particular circuit. */ +/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ const node_t * -choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state, - circuit_guard_state_t **guard_state_out) +choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state) { const node_t *choice; smartlist_t *excluded; const or_options_t *options = get_options(); - /* If possible, choose an entry server with a preferred address, - * otherwise, choose one with an allowed address */ - router_crn_flags_t flags = (CRN_NEED_GUARD|CRN_NEED_DESC|CRN_PREF_ADDR| - CRN_DIRECT_CONN); + router_crn_flags_t flags = CRN_NEED_GUARD|CRN_NEED_DESC; const node_t *node; - /* Once we used this function to select a node to be a guard. We had - * 'state == NULL' be the signal for that. But we don't do that any more. - */ - tor_assert_nonfatal(state); - if (state && options->UseEntryGuards && (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) { /* This request is for an entry server to use for a regular circuit, * and we use entry guard nodes. Just return one of the guard nodes. */ - tor_assert(guard_state_out); - return guards_choose_guard(state, guard_state_out); + return choose_random_entry(state); } excluded = smartlist_new(); @@ -2494,6 +1953,24 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state, * family. */ nodelist_add_node_and_family(excluded, node); } + if (firewall_is_fascist_or()) { + /* Exclude all ORs that we can't reach through our firewall */ + smartlist_t *nodes = nodelist_get_list(); + SMARTLIST_FOREACH(nodes, const node_t *, node, { + if (!fascist_firewall_allows_node(node)) + smartlist_add(excluded, (void*)node); + }); + } + /* and exclude current entry guards and their families, if applicable */ + /*XXXX025 use the using_as_guard flag to accomplish this.*/ + if (options->UseEntryGuards) { + SMARTLIST_FOREACH(get_entry_guards(), const entry_guard_t *, entry, + { + if ((node = node_get_by_id(entry->identity))) { + nodelist_add_node_and_family(excluded, node); + } + }); + } if (state) { if (state->need_uptime) @@ -2501,6 +1978,8 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state, if (state->need_capacity) flags |= CRN_NEED_CAPACITY; } + if (options->AllowInvalid_ & ALLOW_INVALID_ENTRY) + flags |= CRN_ALLOW_INVALID; choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); smartlist_free(excluded); @@ -2547,33 +2026,30 @@ onion_extend_cpath(origin_circuit_t *circ) if (cur_len == state->desired_path_len - 1) { /* Picking last node */ info = extend_info_dup(state->chosen_exit); } else if (cur_len == 0) { /* picking first node */ - const node_t *r = choose_good_entry_server(purpose, state, - &circ->guard_state); + const node_t *r = choose_good_entry_server(purpose, state); if (r) { /* If we're a client, use the preferred address rather than the primary address, for potentially connecting to an IPv6 OR - port. Servers always want the primary (IPv4) address. */ - int client = (server_mode(get_options()) == 0); - info = extend_info_from_node(r, client); - /* Clients can fail to find an allowed address */ - tor_assert_nonfatal(info || client); + port. */ + info = extend_info_from_node(r, server_mode(get_options()) == 0); + tor_assert(info); } } else { const node_t *r = choose_good_middle_server(purpose, state, circ->cpath, cur_len); if (r) { info = extend_info_from_node(r, 0); - tor_assert_nonfatal(info); + tor_assert(info); } } if (!info) { - log_warn(LD_CIRC,"Failed to find node for hop #%d of our path. Discarding " - "this circuit.", cur_len+1); + log_warn(LD_CIRC,"Failed to find node for hop %d of our path. Discarding " + "this circuit.", cur_len); return -1; } - log_debug(LD_CIRC,"Chose router %s for hop #%d (exit is %s)", + log_debug(LD_CIRC,"Chose router %s for hop %d (exit is %s)", extend_info_describe(info), cur_len+1, build_state_get_exit_nickname(state)); @@ -2585,7 +2061,7 @@ onion_extend_cpath(origin_circuit_t *circ) /** Create a new hop, annotate it with information about its * corresponding router choice, and append it to the * end of the cpath head_ptr. */ -STATIC int +static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice) { crypt_path_t *hop = tor_malloc_zero(sizeof(crypt_path_t)); @@ -2606,24 +2082,24 @@ onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice) /** Allocate a new extend_info object based on the various arguments. */ extend_info_t * -extend_info_new(const char *nickname, - const char *rsa_id_digest, - const ed25519_public_key_t *ed_id, +extend_info_new(const char *nickname, const char *digest, crypto_pk_t *onion_key, - const curve25519_public_key_t *ntor_key, + const curve25519_public_key_t *curve25519_key, const tor_addr_t *addr, uint16_t port) { extend_info_t *info = tor_malloc_zero(sizeof(extend_info_t)); - memcpy(info->identity_digest, rsa_id_digest, DIGEST_LEN); - if (ed_id && !ed25519_public_key_is_zero(ed_id)) - memcpy(&info->ed_identity, ed_id, sizeof(ed25519_public_key_t)); + memcpy(info->identity_digest, digest, DIGEST_LEN); if (nickname) strlcpy(info->nickname, nickname, sizeof(info->nickname)); if (onion_key) info->onion_key = crypto_pk_dup_key(onion_key); - if (ntor_key) - memcpy(&info->curve25519_onion_key, ntor_key, +#ifdef CURVE25519_ENABLED + if (curve25519_key) + memcpy(&info->curve25519_onion_key, curve25519_key, sizeof(curve25519_public_key_t)); +#else + (void)curve25519_key; +#endif tor_addr_copy(&info->addr, addr); info->port = port; return info; @@ -2635,83 +2111,46 @@ extend_info_new(const char *nickname, * for_direct_connect is true, in which case the preferred * address is used instead. May return NULL if there is not enough * info about node to extend to it--for example, if there is no - * routerinfo_t or microdesc_t, or if for_direct_connect is true and none of - * the node's addresses are allowed by tor's firewall and IP version config. + * routerinfo_t or microdesc_t. **/ extend_info_t * extend_info_from_node(const node_t *node, int for_direct_connect) { tor_addr_port_t ap; - int valid_addr = 0; if (node->ri == NULL && (node->rs == NULL || node->md == NULL)) return NULL; - /* Choose a preferred address first, but fall back to an allowed address. - * choose_address returns 1 on success, but get_prim_orport returns 0. */ if (for_direct_connect) - valid_addr = fascist_firewall_choose_address_node(node, - FIREWALL_OR_CONNECTION, - 0, &ap); + node_get_pref_orport(node, &ap); else - valid_addr = !node_get_prim_orport(node, &ap); + node_get_prim_orport(node, &ap); - if (valid_addr) - log_debug(LD_CIRC, "using %s for %s", - fmt_addrport(&ap.addr, ap.port), - node->ri ? node->ri->nickname : node->rs->nickname); - else - log_warn(LD_CIRC, "Could not choose valid address for %s", - node->ri ? node->ri->nickname : node->rs->nickname); - - /* Every node we connect or extend to must support ntor */ - if (!node_has_curve25519_onion_key(node)) { - log_fn(LOG_PROTOCOL_WARN, LD_CIRC, - "Attempted to create extend_info for a node that does not support " - "ntor: %s", node_describe(node)); - return NULL; - } + log_debug(LD_CIRC, "using %s for %s", + fmt_addrport(&ap.addr, ap.port), + node->ri ? node->ri->nickname : node->rs->nickname); - const ed25519_public_key_t *ed_pubkey = NULL; - - /* Don't send the ed25519 pubkey unless the target node actually supports - * authenticating with it. */ - if (node_supports_ed25519_link_authentication(node, 0)) { - log_info(LD_CIRC, "Including Ed25519 ID for %s", node_describe(node)); - ed_pubkey = node_get_ed25519_id(node); - } else if (node_get_ed25519_id(node)) { - log_info(LD_CIRC, "Not including the ed25519 ID for %s, since it won't " - "be able to authenticate it.", - node_describe(node)); - } - - /* Retrieve the curve25519 pubkey. */ - const curve25519_public_key_t *curve_pubkey = - node_get_curve25519_onion_key(node); - - if (valid_addr && node->ri) + if (node->ri) return extend_info_new(node->ri->nickname, - node->identity, - ed_pubkey, - node->ri->onion_pkey, - curve_pubkey, - &ap.addr, - ap.port); - else if (valid_addr && node->rs && node->md) + node->identity, + node->ri->onion_pkey, + node->ri->onion_curve25519_pkey, + &ap.addr, + ap.port); + else if (node->rs && node->md) return extend_info_new(node->rs->nickname, - node->identity, - ed_pubkey, - node->md->onion_pkey, - curve_pubkey, - &ap.addr, - ap.port); + node->identity, + node->md->onion_pkey, + node->md->onion_curve25519_pkey, + &ap.addr, + ap.port); else return NULL; } /** Release storage held by an extend_info_t struct. */ void -extend_info_free_(extend_info_t *info) +extend_info_free(extend_info_t *info) { if (!info) return; @@ -2735,8 +2174,8 @@ extend_info_dup(extend_info_t *info) return newinfo; } -/** Return the node_t for the chosen exit router in state. - * If there is no chosen exit, or if we don't know the node_t for +/** Return the routerinfo_t for the chosen exit router in state. + * If there is no chosen exit, or if we don't know the routerinfo_t for * the chosen exit, return NULL. */ const node_t * @@ -2747,17 +2186,6 @@ build_state_get_exit_node(cpath_build_state_t *state) return node_get_by_id(state->chosen_exit->identity_digest); } -/** Return the RSA ID digest for the chosen exit router in state. - * If there is no chosen exit, return NULL. - */ -const uint8_t * -build_state_get_exit_rsa_id(cpath_build_state_t *state) -{ - if (!state || !state->chosen_exit) - return NULL; - return (const uint8_t *) state->chosen_exit->identity_digest; -} - /** Return the nickname for the chosen exit router in state. If * there is no chosen exit, or if we don't know the routerinfo_t for the * chosen exit, return NULL. @@ -2770,106 +2198,3 @@ build_state_get_exit_nickname(cpath_build_state_t *state) return state->chosen_exit->nickname; } -/** Return true iff the given address can be used to extend to. */ -int -extend_info_addr_is_allowed(const tor_addr_t *addr) -{ - tor_assert(addr); - - /* Check if we have a private address and if we can extend to it. */ - if ((tor_addr_is_internal(addr, 0) || tor_addr_is_multicast(addr)) && - !get_options()->ExtendAllowPrivateAddresses) { - goto disallow; - } - /* Allowed! */ - return 1; - disallow: - return 0; -} - -/* Does ei have a valid TAP key? */ -int -extend_info_supports_tap(const extend_info_t* ei) -{ - tor_assert(ei); - /* Valid TAP keys are not NULL */ - return ei->onion_key != NULL; -} - -/* Does ei have a valid ntor key? */ -int -extend_info_supports_ntor(const extend_info_t* ei) -{ - tor_assert(ei); - /* Valid ntor keys have at least one non-zero byte */ - return !tor_mem_is_zero( - (const char*)ei->curve25519_onion_key.public_key, - CURVE25519_PUBKEY_LEN); -} - -/* Is circuit purpose allowed to use the deprecated TAP encryption protocol? - * The hidden service protocol still uses TAP for some connections, because - * ntor onion keys aren't included in HS descriptors or INTRODUCE cells. */ -static int -circuit_purpose_can_use_tap_impl(uint8_t purpose) -{ - return (purpose == CIRCUIT_PURPOSE_S_CONNECT_REND || - purpose == CIRCUIT_PURPOSE_C_INTRODUCING); -} - -/* Is circ allowed to use the deprecated TAP encryption protocol? - * The hidden service protocol still uses TAP for some connections, because - * ntor onion keys aren't included in HS descriptors or INTRODUCE cells. */ -int -circuit_can_use_tap(const origin_circuit_t *circ) -{ - tor_assert(circ); - tor_assert(circ->cpath); - tor_assert(circ->cpath->extend_info); - return (circuit_purpose_can_use_tap_impl(circ->base_.purpose) && - extend_info_supports_tap(circ->cpath->extend_info)); -} - -/* Does circ have an onion key which it's allowed to use? */ -int -circuit_has_usable_onion_key(const origin_circuit_t *circ) -{ - tor_assert(circ); - tor_assert(circ->cpath); - tor_assert(circ->cpath->extend_info); - return (extend_info_supports_ntor(circ->cpath->extend_info) || - circuit_can_use_tap(circ)); -} - -/* Does ei have an onion key which it would prefer to use? - * Currently, we prefer ntor keys*/ -int -extend_info_has_preferred_onion_key(const extend_info_t* ei) -{ - tor_assert(ei); - return extend_info_supports_ntor(ei); -} - -/** Find the circuits that are waiting to find out whether their guards are - * usable, and if any are ready to become usable, mark them open and try - * attaching streams as appropriate. */ -void -circuit_upgrade_circuits_from_guard_wait(void) -{ - smartlist_t *to_upgrade = - circuit_find_circuits_to_upgrade_from_guard_wait(); - - if (to_upgrade == NULL) - return; - - log_info(LD_GUARD, "Upgrading %d circuits from 'waiting for better guard' " - "to 'open'.", smartlist_len(to_upgrade)); - - SMARTLIST_FOREACH_BEGIN(to_upgrade, origin_circuit_t *, circ) { - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); - circuit_has_opened(circ); - } SMARTLIST_FOREACH_END(circ); - - smartlist_free(to_upgrade); -} - diff --git a/src/tor/circuitbuild.h b/src/tor/circuitbuild.h new file mode 100644 index 000000000..ebcb22c45 --- /dev/null +++ b/src/tor/circuitbuild.h @@ -0,0 +1,62 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file circuitbuild.h + * \brief Header file for circuitbuild.c. + **/ + +#ifndef TOR_CIRCUITBUILD_H +#define TOR_CIRCUITBUILD_H + +char *circuit_list_path(origin_circuit_t *circ, int verbose); +char *circuit_list_path_for_controller(origin_circuit_t *circ); +void circuit_log_path(int severity, unsigned int domain, + origin_circuit_t *circ); +void circuit_rep_hist_note_result(origin_circuit_t *circ); +origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags); +origin_circuit_t *circuit_establish_circuit(uint8_t purpose, + extend_info_t *exit, + int flags); +int circuit_handle_first_hop(origin_circuit_t *circ); +void circuit_n_chan_done(channel_t *chan, int status); +int inform_testing_reachability(void); +int circuit_timeout_want_to_count_circ(origin_circuit_t *circ); +int circuit_send_next_onion_skin(origin_circuit_t *circ); +void circuit_note_clock_jumped(int seconds_elapsed); +int circuit_extend(cell_t *cell, circuit_t *circ); +int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, + int reverse); +struct created_cell_t; +int circuit_finish_handshake(origin_circuit_t *circ, + const struct created_cell_t *created_cell); +int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, + int reason); +int onionskin_answer(or_circuit_t *circ, + const struct created_cell_t *created_cell, + const char *keys, + const uint8_t *rend_circ_nonce); +int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, + int *need_capacity); + +int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info); +int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info); +void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); +extend_info_t *extend_info_new(const char *nickname, const char *digest, + crypto_pk_t *onion_key, + const curve25519_public_key_t *curve25519_key, + const tor_addr_t *addr, uint16_t port); +extend_info_t *extend_info_from_node(const node_t *r, int for_direct_connect); +extend_info_t *extend_info_dup(extend_info_t *info); +void extend_info_free(extend_info_t *info); +const node_t *build_state_get_exit_node(cpath_build_state_t *state); +const char *build_state_get_exit_nickname(cpath_build_state_t *state); + +const node_t *choose_good_entry_server(uint8_t purpose, + cpath_build_state_t *state); + +#endif + diff --git a/src/tor/src/or/circuitlist.c b/src/tor/circuitlist.c similarity index 57% rename from src/tor/src/or/circuitlist.c rename to src/tor/circuitlist.c index f074025a3..947489636 100644 --- a/src/tor/src/or/circuitlist.c +++ b/src/tor/circuitlist.c @@ -1,54 +1,12 @@ /* Copyright 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file circuitlist.c - * - * \brief Manage global structures that list and index circuits, and - * look up circuits within them. - * - * One of the most frequent operations in Tor occurs every time that - * a relay cell arrives on a channel. When that happens, we need to - * find which circuit it is associated with, based on the channel and the - * circuit ID in the relay cell. - * - * To handle that, we maintain a global list of circuits, and a hashtable - * mapping [channel,circID] pairs to circuits. Circuits are added to and - * removed from this mapping using circuit_set_p_circid_chan() and - * circuit_set_n_circid_chan(). To look up a circuit from this map, most - * callers should use circuit_get_by_circid_channel(), though - * circuit_get_by_circid_channel_even_if_marked() is appropriate under some - * circumstances. - * - * We also need to allow for the possibility that we have blocked use of a - * circuit ID (because we are waiting to send a DESTROY cell), but the - * circuit is not there any more. For that case, we allow placeholder - * entries in the table, using channel_mark_circid_unusable(). - * - * To efficiently handle a channel that has just opened, we also maintain a - * list of the circuits waiting for channels, so we can attach them as - * needed without iterating through the whole list of circuits, using - * circuit_get_all_pending_on_channel(). - * - * In this module, we also handle the list of circuits that have been - * marked for close elsewhere, and close them as needed. (We use this - * "mark now, close later" pattern here and elsewhere to avoid - * unpredictable recursion if we closed every circuit immediately upon - * realizing it needed to close.) See circuit_mark_for_close() for the - * mark function, and circuit_close_all_marked() for the close function. - * - * For hidden services, we need to be able to look up introduction point - * circuits and rendezvous circuits by cookie, key, etc. These are - * currently handled with linear searches in - * circuit_get_ready_rend_circuit_by_rend_data(), - * circuit_get_next_by_pk_and_purpose(), and with hash lookups in - * circuit_get_rendezvous() and circuit_get_intro_point(). - * - * This module is also the entry point for our out-of-memory handler - * logic, which was originally circuit-focused. + * \brief Manage the global circuit list. **/ #define CIRCUITLIST_PRIVATE #include "or.h" @@ -63,11 +21,6 @@ #include "connection_edge.h" #include "connection_or.h" #include "control.h" -#include "entrynodes.h" -#include "main.h" -#include "hs_circuit.h" -#include "hs_circuitmap.h" -#include "hs_ident.h" #include "networkstatus.h" #include "nodelist.h" #include "onion.h" @@ -79,42 +32,19 @@ #include "rephist.h" #include "routerlist.h" #include "routerset.h" -#include "channelpadding.h" - #include "ht.h" /********* START VARIABLES **********/ /** A global list of all circuits at this hop. */ -static smartlist_t *global_circuitlist = NULL; - -/** A global list of all origin circuits. Every element of this is also - * an element of global_circuitlist. */ -static smartlist_t *global_origin_circuit_list = NULL; +struct global_circuitlist_s global_circuitlist = + TOR_LIST_HEAD_INITIALIZER(global_circuitlist); /** A list of all the circuits in CIRCUIT_STATE_CHAN_WAIT. */ static smartlist_t *circuits_pending_chans = NULL; -/** List of all the (origin) circuits whose state is - * CIRCUIT_STATE_GUARD_WAIT. */ -static smartlist_t *circuits_pending_other_guards = NULL; - -/** A list of all the circuits that have been marked with - * circuit_mark_for_close and which are waiting for circuit_about_to_free. */ -static smartlist_t *circuits_pending_close = NULL; - static void circuit_free_cpath_node(crypt_path_t *victim); static void cpath_ref_decref(crypt_path_reference_t *cpath_ref); -static void circuit_about_to_free_atexit(circuit_t *circ); -static void circuit_about_to_free(circuit_t *circ); - -/** - * A cached value of the current state of the origin circuit list. Has the - * value 1 if we saw any opened circuits recently (since the last call to - * circuit_any_opened_circuits(), which gets called around once a second by - * circuit_expire_building). 0 otherwise. - */ -static int any_opened_circs_cached_val = 0; /********* END VARIABLES ************/ @@ -125,14 +55,12 @@ typedef struct chan_circid_circuit_map_t { channel_t *chan; circid_t circ_id; circuit_t *circuit; - /* For debugging 12184: when was this placeholder item added? */ - time_t made_placeholder_at; } chan_circid_circuit_map_t; /** Helper for hash tables: compare the channel and circuit ID for a and * b, and return less than, equal to, or greater than zero appropriately. */ -static inline int +static INLINE int chan_circid_entries_eq_(chan_circid_circuit_map_t *a, chan_circid_circuit_map_t *b) { @@ -141,18 +69,10 @@ chan_circid_entries_eq_(chan_circid_circuit_map_t *a, /** Helper: return a hash based on circuit ID and the pointer value of * chan in a. */ -static inline unsigned int +static INLINE unsigned int chan_circid_entry_hash_(chan_circid_circuit_map_t *a) { - /* Try to squeze the siphash input into 8 bytes to save any extra siphash - * rounds. This hash function is in the critical path. */ - uintptr_t chan = (uintptr_t) (void*) a->chan; - uint32_t array[2]; - array[0] = a->circ_id; - /* The low bits of the channel pointer are uninteresting, since the channel - * is a pretty big structure. */ - array[1] = (uint32_t) (chan >> 6); - return (unsigned) siphash24g(array, sizeof(array)); + return ((unsigned)a->circ_id) ^ (unsigned)(uintptr_t)(a->chan); } /** Map from [chan,circid] to circuit. */ @@ -160,15 +80,15 @@ static HT_HEAD(chan_circid_map, chan_circid_circuit_map_t) chan_circid_map = HT_INITIALIZER(); HT_PROTOTYPE(chan_circid_map, chan_circid_circuit_map_t, node, chan_circid_entry_hash_, chan_circid_entries_eq_) -HT_GENERATE2(chan_circid_map, chan_circid_circuit_map_t, node, - chan_circid_entry_hash_, chan_circid_entries_eq_, 0.6, - tor_reallocarray_, tor_free_) +HT_GENERATE(chan_circid_map, chan_circid_circuit_map_t, node, + chan_circid_entry_hash_, chan_circid_entries_eq_, 0.6, + malloc, realloc, free) /** The most recently returned entry from circuit_get_by_circid_chan; * used to improve performance when many cells arrive in a row from the * same circuit. */ -static chan_circid_circuit_map_t *_last_circid_chan_ent = NULL; +chan_circid_circuit_map_t *_last_circid_chan_ent = NULL; /** Implementation helper for circuit_set_{p,n}_circid_channel: A circuit ID * and/or channel for circ has just changed from old_chan, old_id @@ -252,7 +172,6 @@ circuit_set_circid_chan_helper(circuit_t *circ, int direction, found = HT_FIND(chan_circid_map, &chan_circid_map, &search); if (found) { found->circuit = circ; - found->made_placeholder_at = 0; } else { found = tor_malloc_zero(sizeof(chan_circid_circuit_map_t)); found->circ_id = id; @@ -310,14 +229,11 @@ channel_mark_circid_unusable(channel_t *chan, circid_t id) "a circuit there.", (unsigned)id, chan); } else if (ent) { /* It's already marked. */ - if (!ent->made_placeholder_at) - ent->made_placeholder_at = approx_time(); } else { ent = tor_malloc_zero(sizeof(chan_circid_circuit_map_t)); ent->chan = chan; ent->circ_id = id; - /* leave circuit at NULL. */ - ent->made_placeholder_at = approx_time(); + /* leave circuit at NULL */ HT_INSERT(chan_circid_map, &chan_circid_map, ent); } } @@ -368,8 +284,8 @@ channel_note_destroy_pending(channel_t *chan, circid_t id) /** Called to indicate that a DESTROY is no longer pending on chan with * circuit ID id -- typically, because it has been sent. */ -MOCK_IMPL(void, -channel_note_destroy_not_pending,(channel_t *chan, circid_t id)) +void +channel_note_destroy_not_pending(channel_t *chan, circid_t id) { circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan); if (circ) { @@ -400,13 +316,10 @@ circuit_set_p_circid_chan(or_circuit_t *or_circ, circid_t id, circuit_set_circid_chan_helper(circ, CELL_DIRECTION_IN, id, chan); - if (chan) { + if (chan) tor_assert(bool_eq(or_circ->p_chan_cells.n, or_circ->next_active_on_p_chan)); - chan->timestamp_last_had_circuits = approx_time(); - } - if (circ->p_delete_pending && old_chan) { channel_mark_circid_unusable(old_chan, old_id); circ->p_delete_pending = 0; @@ -425,12 +338,9 @@ circuit_set_n_circid_chan(circuit_t *circ, circid_t id, circuit_set_circid_chan_helper(circ, CELL_DIRECTION_OUT, id, chan); - if (chan) { + if (chan) tor_assert(bool_eq(circ->n_chan_cells.n, circ->next_active_on_n_chan)); - chan->timestamp_last_had_circuits = approx_time(); - } - if (circ->n_delete_pending && old_chan) { channel_mark_circid_unusable(old_chan, old_id); circ->n_delete_pending = 0; @@ -445,10 +355,8 @@ circuit_set_state(circuit_t *circ, uint8_t state) tor_assert(circ); if (state == circ->state) return; - if (PREDICT_UNLIKELY(!circuits_pending_chans)) + if (!circuits_pending_chans) circuits_pending_chans = smartlist_new(); - if (PREDICT_UNLIKELY(!circuits_pending_other_guards)) - circuits_pending_other_guards = smartlist_new(); if (circ->state == CIRCUIT_STATE_CHAN_WAIT) { /* remove from waiting-circuit list. */ smartlist_remove(circuits_pending_chans, circ); @@ -457,13 +365,7 @@ circuit_set_state(circuit_t *circ, uint8_t state) /* add to waiting-circuit list. */ smartlist_add(circuits_pending_chans, circ); } - if (circ->state == CIRCUIT_STATE_GUARD_WAIT) { - smartlist_remove(circuits_pending_other_guards, circ); - } - if (state == CIRCUIT_STATE_GUARD_WAIT) { - smartlist_add(circuits_pending_other_guards, circ); - } - if (state == CIRCUIT_STATE_GUARD_WAIT || state == CIRCUIT_STATE_OPEN) + if (state == CIRCUIT_STATE_OPEN) tor_assert(!circ->n_chan_create_cell); circ->state = state; } @@ -512,145 +414,30 @@ circuit_count_pending_on_channel(channel_t *chan) circuit_get_all_pending_on_channel(sl, chan); cnt = smartlist_len(sl); smartlist_free(sl); - log_debug(LD_CIRC,"or_conn to %s, %d pending circs", + log_debug(LD_CIRC,"or_conn to %s at %s, %d pending circs", + chan->nickname ? chan->nickname : "NULL", channel_get_canonical_remote_descr(chan), cnt); return cnt; } -/** Remove origin_circ from the global list of origin circuits. - * Called when we are freeing a circuit. - */ -static void -circuit_remove_from_origin_circuit_list(origin_circuit_t *origin_circ) -{ - int origin_idx = origin_circ->global_origin_circuit_list_idx; - if (origin_idx < 0) - return; - origin_circuit_t *c2; - tor_assert(origin_idx <= smartlist_len(global_origin_circuit_list)); - c2 = smartlist_get(global_origin_circuit_list, origin_idx); - tor_assert(origin_circ == c2); - smartlist_del(global_origin_circuit_list, origin_idx); - if (origin_idx < smartlist_len(global_origin_circuit_list)) { - origin_circuit_t *replacement = - smartlist_get(global_origin_circuit_list, origin_idx); - replacement->global_origin_circuit_list_idx = origin_idx; - } - origin_circ->global_origin_circuit_list_idx = -1; -} - -/** Add origin_circ to the global list of origin circuits. Called - * when creating the circuit. */ -static void -circuit_add_to_origin_circuit_list(origin_circuit_t *origin_circ) -{ - tor_assert(origin_circ->global_origin_circuit_list_idx == -1); - smartlist_t *lst = circuit_get_global_origin_circuit_list(); - smartlist_add(lst, origin_circ); - origin_circ->global_origin_circuit_list_idx = smartlist_len(lst) - 1; -} - /** Detach from the global circuit list, and deallocate, all * circuits that have been marked for close. */ void circuit_close_all_marked(void) { - if (circuits_pending_close == NULL) - return; - - smartlist_t *lst = circuit_get_global_list(); - SMARTLIST_FOREACH_BEGIN(circuits_pending_close, circuit_t *, circ) { - tor_assert(circ->marked_for_close); - - /* Remove it from the circuit list. */ - int idx = circ->global_circuitlist_idx; - smartlist_del(lst, idx); - if (idx < smartlist_len(lst)) { - circuit_t *replacement = smartlist_get(lst, idx); - replacement->global_circuitlist_idx = idx; - } - circ->global_circuitlist_idx = -1; - - /* Remove it from the origin circuit list, if appropriate. */ - if (CIRCUIT_IS_ORIGIN(circ)) { - circuit_remove_from_origin_circuit_list(TO_ORIGIN_CIRCUIT(circ)); - } - - circuit_about_to_free(circ); - circuit_free(circ); - } SMARTLIST_FOREACH_END(circ); - - smartlist_clear(circuits_pending_close); -} - -/** Return a pointer to the global list of circuits. */ -MOCK_IMPL(smartlist_t *, -circuit_get_global_list,(void)) -{ - if (NULL == global_circuitlist) - global_circuitlist = smartlist_new(); - return global_circuitlist; -} - -/** Return a pointer to the global list of origin circuits. */ -smartlist_t * -circuit_get_global_origin_circuit_list(void) -{ - if (NULL == global_origin_circuit_list) - global_origin_circuit_list = smartlist_new(); - return global_origin_circuit_list; -} - -/** - * Return true if we have any opened general-purpose 3 hop - * origin circuits. - * - * The result from this function is cached for use by - * circuit_any_opened_circuits_cached(). - */ -int -circuit_any_opened_circuits(void) -{ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_origin_circuit_list(), - const origin_circuit_t *, next_circ) { - if (!TO_CIRCUIT(next_circ)->marked_for_close && - next_circ->has_opened && - TO_CIRCUIT(next_circ)->state == CIRCUIT_STATE_OPEN && - TO_CIRCUIT(next_circ)->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT && - next_circ->build_state && - next_circ->build_state->desired_path_len == DEFAULT_ROUTE_LEN) { - circuit_cache_opened_circuit_state(1); - return 1; - } - } SMARTLIST_FOREACH_END(next_circ); - - circuit_cache_opened_circuit_state(0); - return 0; -} - -/** - * Cache the "any circuits opened" state, as specified in param - * circuits_are_opened. This is a helper function to update - * the circuit opened status whenever we happen to look at the - * circuit list. - */ -void -circuit_cache_opened_circuit_state(int circuits_are_opened) -{ - any_opened_circs_cached_val = circuits_are_opened; + circuit_t *circ, *tmp; + TOR_LIST_FOREACH_SAFE(circ, &global_circuitlist, head, tmp) + if (circ->marked_for_close) + circuit_free(circ); } -/** - * Return true if there were any opened circuits since the last call to - * circuit_any_opened_circuits(), or since circuit_expire_building() last - * ran (it runs roughly once per second). - */ -int -circuit_any_opened_circuits_cached(void) +/** Return the head of the global linked list of circuits. */ +struct global_circuitlist_s * +circuit_get_global_list(void) { - return any_opened_circs_cached_val; + return &global_circuitlist; } /** Function to make circ-\>state human-readable */ @@ -662,8 +449,6 @@ circuit_state_to_string(int state) case CIRCUIT_STATE_BUILDING: return "doing handshakes"; case CIRCUIT_STATE_ONIONSKIN_PENDING: return "processing the onion"; case CIRCUIT_STATE_CHAN_WAIT: return "connecting to server"; - case CIRCUIT_STATE_GUARD_WAIT: return "waiting to see how other " - "guards perform"; case CIRCUIT_STATE_OPEN: return "open"; default: log_warn(LD_BUG, "Unknown circuit state %d", state); @@ -869,15 +654,9 @@ init_circuit_base(circuit_t *circ) circ->deliver_window = CIRCWINDOW_START; cell_queue_init(&circ->n_chan_cells); - smartlist_add(circuit_get_global_list(), circ); - circ->global_circuitlist_idx = smartlist_len(circuit_get_global_list()) - 1; + TOR_LIST_INSERT_HEAD(&global_circuitlist, circ, head); } -/** If we haven't yet decided on a good timeout value for circuit - * building, we close idle circuits aggressively so we can get more - * data points. */ -#define IDLE_TIMEOUT_WHILE_LEARNING (1*60) - /** Allocate space for a new circuit, initializing with p_circ_id * and p_conn. Add it to the global circuit list. */ @@ -899,52 +678,13 @@ origin_circuit_new(void) init_circuit_base(TO_CIRCUIT(circ)); - /* Add to origin-list. */ - circ->global_origin_circuit_list_idx = -1; - circuit_add_to_origin_circuit_list(circ); - circuit_build_times_update_last_circ(get_circuit_build_times_mutable()); - if (! circuit_build_times_disabled(get_options()) && - circuit_build_times_needs_circuits(get_circuit_build_times())) { - /* Circuits should be shorter lived if we need more of them - * for learning a good build timeout */ - circ->circuit_idle_timeout = IDLE_TIMEOUT_WHILE_LEARNING; - } else { - // This should always be larger than the current port prediction time - // remaining, or else we'll end up with the case where a circuit times out - // and another one is built, effectively doubling the timeout window. - // - // We also randomize it by up to 5% more (ie 5% of 0 to 3600 seconds, - // depending on how much circuit prediction time is remaining) so that - // we don't close a bunch of unused circuits all at the same time. - int prediction_time_remaining = - predicted_ports_prediction_time_remaining(time(NULL)); - circ->circuit_idle_timeout = prediction_time_remaining+1+ - crypto_rand_int(1+prediction_time_remaining/20); - - if (circ->circuit_idle_timeout <= 0) { - log_warn(LD_BUG, - "Circuit chose a negative idle timeout of %d based on " - "%d seconds of predictive building remaining.", - circ->circuit_idle_timeout, - prediction_time_remaining); - circ->circuit_idle_timeout = IDLE_TIMEOUT_WHILE_LEARNING; - } - - log_info(LD_CIRC, - "Circuit " U64_FORMAT " chose an idle timeout of %d based on " - "%d seconds of predictive building remaining.", - U64_PRINTF_ARG(circ->global_identifier), - circ->circuit_idle_timeout, - prediction_time_remaining); - } - return circ; } -/** Allocate a new or_circuit_t, connected to p_chan as - * p_circ_id. If p_chan is NULL, the circuit is unattached. */ +/** Allocate a new or_circuit_t, connected to p_conn as + * p_circ_id. If p_conn is NULL, the circuit is unattached. */ or_circuit_t * or_circuit_new(circid_t p_circ_id, channel_t *p_chan) { @@ -965,49 +705,21 @@ or_circuit_new(circid_t p_circ_id, channel_t *p_chan) return circ; } -/** Free all storage held in circ->testing_cell_stats */ -void -circuit_clear_testing_cell_stats(circuit_t *circ) -{ - if (!circ || !circ->testing_cell_stats) - return; - SMARTLIST_FOREACH(circ->testing_cell_stats, testing_cell_stats_entry_t *, - ent, tor_free(ent)); - smartlist_free(circ->testing_cell_stats); - circ->testing_cell_stats = NULL; -} - /** Deallocate space associated with circ. */ STATIC void -circuit_free_(circuit_t *circ) +circuit_free(circuit_t *circ) { - circid_t n_circ_id = 0; void *mem; size_t memlen; - int should_free = 1; if (!circ) return; - /* We keep a copy of this so we can log its value before it gets unset. */ - n_circ_id = circ->n_circ_id; - - circuit_clear_testing_cell_stats(circ); - - /* Cleanup circuit from anything HS v3 related. We also do this when the - * circuit is closed. This is to avoid any code path that free registered - * circuits without closing them before. This needs to be done before the - * hs identifier is freed. */ - hs_circ_cleanup(circ); - if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); mem = ocirc; memlen = sizeof(origin_circuit_t); tor_assert(circ->magic == ORIGIN_CIRCUIT_MAGIC); - - circuit_remove_from_origin_circuit_list(ocirc); - if (ocirc->build_state) { extend_info_free(ocirc->build_state->chosen_exit); circuit_free_cpath_node(ocirc->build_state->pending_final_cpath); @@ -1015,22 +727,11 @@ circuit_free_(circuit_t *circ) } tor_free(ocirc->build_state); - /* Cancel before freeing, if we haven't already succeeded or failed. */ - if (ocirc->guard_state) { - entry_guard_cancel(ô->guard_state); - } - circuit_guard_state_free(ocirc->guard_state); - circuit_clear_cpath(ocirc); crypto_pk_free(ocirc->intro_key); rend_data_free(ocirc->rend_data); - /* Finally, free the identifier of the circuit and nullify it so multiple - * cleanup will work. */ - hs_ident_circuit_free(ocirc->hs_ident); - ocirc->hs_ident = NULL; - tor_free(ocirc->dest_address); if (ocirc->socks_username) { memwipe(ocirc->socks_username, 0x12, ocirc->socks_username_len); @@ -1050,8 +751,6 @@ circuit_free_(circuit_t *circ) memlen = sizeof(or_circuit_t); tor_assert(circ->magic == OR_CIRCUIT_MAGIC); - should_free = (ocirc->workqueue_entry == NULL); - crypto_cipher_free(ocirc->p_crypto); crypto_digest_free(ocirc->p_digest); crypto_cipher_free(ocirc->n_crypto); @@ -1074,16 +773,7 @@ circuit_free_(circuit_t *circ) extend_info_free(circ->n_hop); tor_free(circ->n_chan_create_cell); - if (circ->global_circuitlist_idx != -1) { - int idx = circ->global_circuitlist_idx; - circuit_t *c2 = smartlist_get(global_circuitlist, idx); - tor_assert(c2 == circ); - smartlist_del(global_circuitlist, idx); - if (idx < smartlist_len(global_circuitlist)) { - c2 = smartlist_get(global_circuitlist, idx); - c2->global_circuitlist_idx = idx; - } - } + TOR_LIST_REMOVE(circ, head); /* Remove from map. */ circuit_set_n_circid_chan(circ, 0, NULL); @@ -1092,23 +782,8 @@ circuit_free_(circuit_t *circ) * "active" checks will be violated. */ cell_queue_clear(&circ->n_chan_cells); - log_info(LD_CIRC, "Circuit %u (id: %" PRIu32 ") has been freed.", - n_circ_id, - CIRCUIT_IS_ORIGIN(circ) ? - TO_ORIGIN_CIRCUIT(circ)->global_identifier : 0); - - if (should_free) { - memwipe(mem, 0xAA, memlen); /* poison memory */ - tor_free(mem); - } else { - /* If we made it here, this is an or_circuit_t that still has a pending - * cpuworker request which we weren't able to cancel. Instead, set up - * the magic value so that when the reply comes back, we'll know to discard - * the reply and free this structure. - */ - memwipe(mem, 0xAA, memlen); - circ->magic = DEAD_CIRCUIT_MAGIC; - } + memwipe(mem, 0xAA, memlen); /* poison memory */ + tor_free(mem); } /** Deallocate the linked list circ->cpath, and remove the cpath from @@ -1140,51 +815,24 @@ circuit_clear_cpath(origin_circuit_t *circ) void circuit_free_all(void) { - smartlist_t *lst = circuit_get_global_list(); + circuit_t *tmp, *tmp2; - SMARTLIST_FOREACH_BEGIN(lst, circuit_t *, tmp) { + TOR_LIST_FOREACH_SAFE(tmp, &global_circuitlist, head, tmp2) { if (! CIRCUIT_IS_ORIGIN(tmp)) { or_circuit_t *or_circ = TO_OR_CIRCUIT(tmp); while (or_circ->resolving_streams) { edge_connection_t *next_conn; next_conn = or_circ->resolving_streams->next_stream; - connection_free_(TO_CONN(or_circ->resolving_streams)); + connection_free(TO_CONN(or_circ->resolving_streams)); or_circ->resolving_streams = next_conn; } } - tmp->global_circuitlist_idx = -1; - circuit_about_to_free_atexit(tmp); circuit_free(tmp); - SMARTLIST_DEL_CURRENT(lst, tmp); - } SMARTLIST_FOREACH_END(tmp); - - smartlist_free(lst); - global_circuitlist = NULL; - - smartlist_free(global_origin_circuit_list); - global_origin_circuit_list = NULL; + } smartlist_free(circuits_pending_chans); circuits_pending_chans = NULL; - smartlist_free(circuits_pending_close); - circuits_pending_close = NULL; - - smartlist_free(circuits_pending_other_guards); - circuits_pending_other_guards = NULL; - - { - chan_circid_circuit_map_t **elt, **next, *c; - for (elt = HT_START(chan_circid_map, &chan_circid_map); - elt; - elt = next) { - c = *elt; - next = HT_NEXT_RMV(chan_circid_map, &chan_circid_map, elt); - - tor_assert(c->circuit == NULL); - tor_free(c); - } - } HT_CLEAR(chan_circid_map, &chan_circid_map); } @@ -1246,9 +894,10 @@ circuit_dump_conn_details(int severity, void circuit_dump_by_conn(connection_t *conn, int severity) { + circuit_t *circ; edge_connection_t *tmpconn; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0; if (circ->marked_for_close) { @@ -1279,7 +928,72 @@ circuit_dump_by_conn(connection_t *conn, int severity) } } } - SMARTLIST_FOREACH_END(circ); +} + +/** A helper function for circuit_dump_by_chan() below. Log a bunch + * of information about circuit circ. + */ +static void +circuit_dump_chan_details(int severity, + circuit_t *circ, + channel_t *chan, + const char *type, + circid_t this_circid, + circid_t other_circid) +{ + tor_log(severity, LD_CIRC, "Conn %p has %s circuit: circID %u " + "(other side %u), state %d (%s), born %ld:", + chan, type, (unsigned)this_circid, (unsigned)other_circid, circ->state, + circuit_state_to_string(circ->state), + (long)circ->timestamp_began.tv_sec); + if (CIRCUIT_IS_ORIGIN(circ)) { /* circ starts at this node */ + circuit_log_path(severity, LD_CIRC, TO_ORIGIN_CIRCUIT(circ)); + } +} + +/** Log, at severity severity, information about each circuit + * that is connected to chan. + */ +void +circuit_dump_by_chan(channel_t *chan, int severity) +{ + circuit_t *circ; + + tor_assert(chan); + + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { + circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0; + + if (circ->marked_for_close) { + continue; + } + + if (!CIRCUIT_IS_ORIGIN(circ)) { + p_circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; + } + + if (! CIRCUIT_IS_ORIGIN(circ) && TO_OR_CIRCUIT(circ)->p_chan && + TO_OR_CIRCUIT(circ)->p_chan == chan) { + circuit_dump_chan_details(severity, circ, chan, "App-ward", + p_circ_id, n_circ_id); + } + + if (circ->n_chan && circ->n_chan == chan) { + circuit_dump_chan_details(severity, circ, chan, "Exit-ward", + n_circ_id, p_circ_id); + } + + if (!circ->n_chan && circ->n_hop && + channel_matches_extend_info(chan, circ->n_hop) && + tor_memeq(chan->identity_digest, + circ->n_hop->identity_digest, DIGEST_LEN)) { + circuit_dump_chan_details(severity, circ, chan, + (circ->state == CIRCUIT_STATE_OPEN && + !CIRCUIT_IS_ORIGIN(circ)) ? + "Endpoint" : "Pending", + n_circ_id, p_circ_id); + } + } } /** Return the circuit whose global ID is id, or NULL if no @@ -1287,7 +1001,8 @@ circuit_dump_by_conn(connection_t *conn, int severity) origin_circuit_t * circuit_get_by_global_id(uint32_t id) { - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + circuit_t *circ; + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { if (CIRCUIT_IS_ORIGIN(circ) && TO_ORIGIN_CIRCUIT(circ)->global_identifier == id) { if (circ->marked_for_close) @@ -1296,7 +1011,6 @@ circuit_get_by_global_id(uint32_t id) return TO_ORIGIN_CIRCUIT(circ); } } - SMARTLIST_FOREACH_END(circ); return NULL; } @@ -1308,7 +1022,7 @@ circuit_get_by_global_id(uint32_t id) * If found_entry_out is provided, set it to true if we have a * placeholder entry for circid/chan, and leave it unset otherwise. */ -static inline circuit_t * +static INLINE circuit_t * circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan, int *found_entry_out) { @@ -1399,41 +1113,13 @@ circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, } /** Return true iff the circuit ID circ_id is currently used by a - * circuit, marked or not, on chan, or if the circ ID is reserved until - * a queued destroy cell can be sent. - * - * (Return 1 if the circuit is present, marked or not; Return 2 - * if the circuit ID is pending a destroy.) - **/ + * circuit, marked or not, on chan. */ int circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan) { int found = 0; - if (circuit_get_by_circid_channel_impl(circ_id, chan, &found) != NULL) - return 1; - if (found) - return 2; - return 0; -} - -/** Helper for debugging 12184. Returns the time since which 'circ_id' has - * been marked unusable on 'chan'. */ -time_t -circuit_id_when_marked_unusable_on_channel(circid_t circ_id, channel_t *chan) -{ - chan_circid_circuit_map_t search; - chan_circid_circuit_map_t *found; - - memset(&search, 0, sizeof(search)); - search.circ_id = circ_id; - search.chan = chan; - - found = HT_FIND(chan_circid_map, &chan_circid_map, &search); - - if (! found || found->circuit) - return 0; - - return found->made_placeholder_at; + return circuit_get_by_circid_channel_impl(circ_id, chan, &found) != NULL + || found; } /** Return the circuit that a given edge connection is using. */ @@ -1457,59 +1143,13 @@ circuit_get_by_edge_conn(edge_connection_t *conn) void circuit_unlink_all_from_channel(channel_t *chan, int reason) { - smartlist_t *detached = smartlist_new(); - -/* #define DEBUG_CIRCUIT_UNLINK_ALL */ - - channel_unlink_all_circuits(chan, detached); - -#ifdef DEBUG_CIRCUIT_UNLINK_ALL - { - smartlist_t *detached_2 = smartlist_new(); - int mismatch = 0, badlen = 0; - - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - if (circ->n_chan == chan || - (!CIRCUIT_IS_ORIGIN(circ) && - TO_OR_CIRCUIT(circ)->p_chan == chan)) { - smartlist_add(detached_2, circ); - } - } - SMARTLIST_FOREACH_END(circ); - - if (smartlist_len(detached) != smartlist_len(detached_2)) { - log_warn(LD_BUG, "List of detached circuits had the wrong length! " - "(got %d, should have gotten %d)", - (int)smartlist_len(detached), - (int)smartlist_len(detached_2)); - badlen = 1; - } - smartlist_sort_pointers(detached); - smartlist_sort_pointers(detached_2); - - SMARTLIST_FOREACH(detached, circuit_t *, c, - if (c != smartlist_get(detached_2, c_sl_idx)) - mismatch = 1; - ); + circuit_t *circ; - if (mismatch) - log_warn(LD_BUG, "Mismatch in list of detached circuits."); + channel_unlink_all_circuits(chan); - if (badlen || mismatch) { - smartlist_free(detached); - detached = detached_2; - } else { - log_notice(LD_CIRC, "List of %d circuits was as expected.", - (int)smartlist_len(detached)); - smartlist_free(detached_2); - } - } -#endif /* defined(DEBUG_CIRCUIT_UNLINK_ALL) */ - - SMARTLIST_FOREACH_BEGIN(detached, circuit_t *, circ) { + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { int mark = 0; if (circ->n_chan == chan) { - circuit_set_n_circid_chan(circ, 0, NULL); mark = 1; @@ -1525,16 +1165,9 @@ circuit_unlink_all_from_channel(channel_t *chan, int reason) mark = 1; } } - if (!mark) { - log_warn(LD_BUG, "Circuit on detached list which I had no reason " - "to mark"); - continue; - } - if (!circ->marked_for_close) + if (mark && !circ->marked_for_close) circuit_mark_for_close(circ, reason); - } SMARTLIST_FOREACH_END(circ); - - smartlist_free(detached); + } } /** Return a circ such that @@ -1549,158 +1182,91 @@ circuit_unlink_all_from_channel(channel_t *chan, int reason) origin_circuit_t * circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data) { - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + circuit_t *circ; + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { if (!circ->marked_for_close && circ->purpose == CIRCUIT_PURPOSE_C_REND_READY) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - if (ocirc->rend_data == NULL) { - continue; - } - if (!rend_cmp_service_ids(rend_data_get_address(rend_data), - rend_data_get_address(ocirc->rend_data)) && + if (ocirc->rend_data && + !rend_cmp_service_ids(rend_data->onion_address, + ocirc->rend_data->onion_address) && tor_memeq(ocirc->rend_data->rend_cookie, rend_data->rend_cookie, REND_COOKIE_LEN)) return ocirc; } } - SMARTLIST_FOREACH_END(circ); - return NULL; -} - -/** Return the first service introduction circuit originating from the global - * circuit list after start or at the start of the list if start - * is NULL. Return NULL if no circuit is found. - * - * A service introduction point circuit has a purpose of either - * CIRCUIT_PURPOSE_S_ESTABLISH_INTRO or CIRCUIT_PURPOSE_S_INTRO. This does not - * return a circuit marked for close and its state must be open. */ -origin_circuit_t * -circuit_get_next_service_intro_circ(origin_circuit_t *start) -{ - int idx = 0; - smartlist_t *lst = circuit_get_global_list(); - - if (start) { - idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1; - } - - for ( ; idx < smartlist_len(lst); ++idx) { - circuit_t *circ = smartlist_get(lst, idx); - - /* Ignore a marked for close circuit or purpose not matching a service - * intro point or if the state is not open. */ - if (circ->marked_for_close || circ->state != CIRCUIT_STATE_OPEN || - (circ->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO && - circ->purpose != CIRCUIT_PURPOSE_S_INTRO)) { - continue; - } - /* The purposes we are looking for are only for origin circuits so the - * following is valid. */ - return TO_ORIGIN_CIRCUIT(circ); - } - /* Not found. */ - return NULL; -} - -/** Return the first service rendezvous circuit originating from the global - * circuit list after start or at the start of the list if start - * is NULL. Return NULL if no circuit is found. - * - * A service rendezvous point circuit has a purpose of either - * CIRCUIT_PURPOSE_S_CONNECT_REND or CIRCUIT_PURPOSE_S_REND_JOINED. This does - * not return a circuit marked for close and its state must be open. */ -origin_circuit_t * -circuit_get_next_service_rp_circ(origin_circuit_t *start) -{ - int idx = 0; - smartlist_t *lst = circuit_get_global_list(); - - if (start) { - idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1; - } - - for ( ; idx < smartlist_len(lst); ++idx) { - circuit_t *circ = smartlist_get(lst, idx); - - /* Ignore a marked for close circuit or purpose not matching a service - * intro point or if the state is not open. */ - if (circ->marked_for_close || circ->state != CIRCUIT_STATE_OPEN || - (circ->purpose != CIRCUIT_PURPOSE_S_CONNECT_REND && - circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED)) { - continue; - } - /* The purposes we are looking for are only for origin circuits so the - * following is valid. */ - return TO_ORIGIN_CIRCUIT(circ); - } - /* Not found. */ return NULL; } /** Return the first circuit originating here in global_circuitlist after - * start whose purpose is purpose, and where digest (if - * set) matches the private key digest of the rend data associated with the - * circuit. Return NULL if no circuit is found. If start is NULL, - * begin at the start of the list. + * start whose purpose is purpose, and where + * digest (if set) matches the rend_pk_digest field. Return NULL if no + * circuit is found. If start is NULL, begin at the start of the list. */ origin_circuit_t * circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, - const uint8_t *digest, uint8_t purpose) + const char *digest, uint8_t purpose) { - int idx; - smartlist_t *lst = circuit_get_global_list(); + circuit_t *circ; tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(purpose)); if (start == NULL) - idx = 0; + circ = TOR_LIST_FIRST(&global_circuitlist); else - idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1; - - for ( ; idx < smartlist_len(lst); ++idx) { - circuit_t *circ = smartlist_get(lst, idx); - origin_circuit_t *ocirc; + circ = TOR_LIST_NEXT(TO_CIRCUIT(start), head); + for ( ; circ; circ = TOR_LIST_NEXT(circ, head)) { if (circ->marked_for_close) continue; if (circ->purpose != purpose) continue; - /* At this point we should be able to get a valid origin circuit because - * the origin purpose we are looking for matches this circuit. */ - if (BUG(!CIRCUIT_PURPOSE_IS_ORIGIN(circ->purpose))) { - break; - } - ocirc = TO_ORIGIN_CIRCUIT(circ); if (!digest) - return ocirc; - if (rend_circuit_pk_digest_eq(ocirc, digest)) { - return ocirc; - } + return TO_ORIGIN_CIRCUIT(circ); + else if (TO_ORIGIN_CIRCUIT(circ)->rend_data && + tor_memeq(TO_ORIGIN_CIRCUIT(circ)->rend_data->rend_pk_digest, + digest, DIGEST_LEN)) + return TO_ORIGIN_CIRCUIT(circ); } return NULL; } -/** We might cannibalize this circuit: Return true if its last hop can be used - * as a v3 rendezvous point. */ -static int -circuit_can_be_cannibalized_for_v3_rp(const origin_circuit_t *circ) +/** Return the first OR circuit in the global list whose purpose is + * purpose, and whose rend_token is the len-byte + * token. */ +static or_circuit_t * +circuit_get_by_rend_token_and_purpose(uint8_t purpose, const char *token, + size_t len) { - if (!circ->build_state) { - return 0; - } - - extend_info_t *chosen_exit = circ->build_state->chosen_exit; - if (BUG(!chosen_exit)) { - return 0; + circuit_t *circ; + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { + if (! circ->marked_for_close && + circ->purpose == purpose && + tor_memeq(TO_OR_CIRCUIT(circ)->rend_token, token, len)) + return TO_OR_CIRCUIT(circ); } + return NULL; +} - const node_t *rp_node = node_get_by_id(chosen_exit->identity_digest); - if (rp_node) { - if (node_supports_v3_rendezvous_point(rp_node)) { - return 1; - } - } +/** Return the circuit waiting for a rendezvous with the provided cookie. + * Return NULL if no such circuit is found. + */ +or_circuit_t * +circuit_get_rendezvous(const char *cookie) +{ + return circuit_get_by_rend_token_and_purpose( + CIRCUIT_PURPOSE_REND_POINT_WAITING, + cookie, REND_COOKIE_LEN); +} - return 0; +/** Return the circuit waiting for intro cells of the given digest. + * Return NULL if no such circuit is found. + */ +or_circuit_t * +circuit_get_intro_point(const char *digest) +{ + return circuit_get_by_rend_token_and_purpose( + CIRCUIT_PURPOSE_INTRO_POINT, digest, + DIGEST_LEN); } /** Return a circuit that is open, is CIRCUIT_PURPOSE_C_GENERAL, @@ -1713,19 +1279,12 @@ circuit_can_be_cannibalized_for_v3_rp(const origin_circuit_t *circ) * cannibalize. * * If !CIRCLAUNCH_NEED_UPTIME, prefer returning non-uptime circuits. - * - * To "cannibalize" a circuit means to extend it an extra hop, and use it - * for some other purpose than we had originally intended. We do this when - * we want to perform some low-bandwidth task at a specific relay, and we - * would like the circuit to complete as soon as possible. (If we were going - * to use a lot of bandwidth, we wouldn't want a circuit with an extra hop. - * If we didn't care about circuit completion latency, we would just build - * a new circuit.) */ origin_circuit_t * circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, int flags) { + circuit_t *circ_; origin_circuit_t *best=NULL; int need_uptime = (flags & CIRCLAUNCH_NEED_UPTIME) != 0; int need_capacity = (flags & CIRCLAUNCH_NEED_CAPACITY) != 0; @@ -1741,7 +1300,7 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, "capacity %d, internal %d", purpose, need_uptime, need_capacity, internal); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ_) { + TOR_LIST_FOREACH(circ_, &global_circuitlist, head) { if (CIRCUIT_IS_ORIGIN(circ_) && circ_->state == CIRCUIT_STATE_OPEN && !circ_->marked_for_close && @@ -1763,7 +1322,7 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, do { const node_t *ri2; if (tor_memeq(hop->extend_info->identity_digest, - info->identity_digest, DIGEST_LEN)) + info->identity_digest, DIGEST_LEN)) goto next; if (ri1 && (ri2 = node_get_by_id(hop->extend_info->identity_digest)) @@ -1785,57 +1344,16 @@ circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, hop = hop->next; } while (hop != circ->cpath); } - - if ((flags & CIRCLAUNCH_IS_V3_RP) && - !circuit_can_be_cannibalized_for_v3_rp(circ)) { - log_debug(LD_GENERAL, "Skipping uncannibalizable circuit for v3 " - "rendezvous point."); - goto next; - } - if (!best || (best->build_state->need_uptime && !need_uptime)) best = circ; next: ; } } } - SMARTLIST_FOREACH_END(circ_); return best; } -/** - * Check whether any of the origin circuits that are waiting to see if - * their guard is good enough to use can be upgraded to "ready". If so, - * return a new smartlist containing them. Otherwise return NULL. - */ -smartlist_t * -circuit_find_circuits_to_upgrade_from_guard_wait(void) -{ - /* Only if some circuit is actually waiting on an upgrade should we - * run the algorithm. */ - if (! circuits_pending_other_guards || - smartlist_len(circuits_pending_other_guards)==0) - return NULL; - /* Only if we have some origin circuits should we run the algorithm. */ - if (!global_origin_circuit_list) - return NULL; - - /* Okay; we can pass our circuit list to entrynodes.c.*/ - smartlist_t *result = smartlist_new(); - int circuits_upgraded = entry_guards_upgrade_waiting_circuits( - get_guard_selection_info(), - global_origin_circuit_list, - result); - if (circuits_upgraded && smartlist_len(result)) { - return result; - } else { - smartlist_free(result); - return NULL; - } -} - -/** Return the number of hops in circuit's path. If circ has no entries, - * or is NULL, returns 0. */ +/** Return the number of hops in circuit's path. */ int circuit_get_cpath_len(origin_circuit_t *circ) { @@ -1850,28 +1368,8 @@ circuit_get_cpath_len(origin_circuit_t *circ) return n; } -/** Return the number of opened hops in circuit's path. - * If circ has no entries, or is NULL, returns 0. */ -int -circuit_get_cpath_opened_len(const origin_circuit_t *circ) -{ - int n = 0; - if (circ && circ->cpath) { - crypt_path_t *cpath, *cpath_next = NULL; - for (cpath = circ->cpath; - cpath->state == CPATH_STATE_OPEN - && cpath_next != circ->cpath; - cpath = cpath_next) { - cpath_next = cpath->next; - ++n; - } - } - return n; -} - /** Return the hopnumth hop in circ->cpath, or NULL if there - * aren't that many hops in the list. hopnum starts at 1. - * Returns NULL if hopnum is 0 or negative. */ + * aren't that many hops in the list. */ crypt_path_t * circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum) { @@ -1891,13 +1389,13 @@ circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum) void circuit_mark_all_unused_circs(void) { - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + circuit_t *circ; + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { if (CIRCUIT_IS_ORIGIN(circ) && !circ->marked_for_close && !circ->timestamp_dirty) circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } - SMARTLIST_FOREACH_END(circ); } /** Go through the circuitlist; for each circuit that starts at us @@ -1910,14 +1408,14 @@ circuit_mark_all_unused_circs(void) void circuit_mark_all_dirty_circs_as_unusable(void) { - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + circuit_t *circ; + TOR_LIST_FOREACH(circ, &global_circuitlist, head) { if (CIRCUIT_IS_ORIGIN(circ) && !circ->marked_for_close && circ->timestamp_dirty) { mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ)); } } - SMARTLIST_FOREACH_END(circ); } /** Mark circ to be closed next time we call @@ -1937,9 +1435,9 @@ circuit_mark_all_dirty_circs_as_unusable(void) * - If circ->rend_splice is set (we are the midpoint of a joined * rendezvous stream), then mark the other circuit to close as well. */ -MOCK_IMPL(void, -circuit_mark_for_close_, (circuit_t *circ, int reason, int line, - const char *file)) +void +circuit_mark_for_close_(circuit_t *circ, int reason, int line, + const char *file) { int orig_reason = reason; /* Passed to the controller */ assert_circuit_ok(circ); @@ -1981,75 +1479,6 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line, reason = END_CIRC_REASON_NONE; } - circ->marked_for_close = line; - circ->marked_for_close_file = file; - circ->marked_for_close_reason = reason; - circ->marked_for_close_orig_reason = orig_reason; - - if (!CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (or_circ->rend_splice) { - if (!or_circ->rend_splice->base_.marked_for_close) { - /* do this after marking this circuit, to avoid infinite recursion. */ - circuit_mark_for_close(TO_CIRCUIT(or_circ->rend_splice), reason); - } - or_circ->rend_splice = NULL; - } - } - - /* Notify the HS subsystem that this circuit is closing. */ - hs_circ_cleanup(circ); - - if (circuits_pending_close == NULL) - circuits_pending_close = smartlist_new(); - - smartlist_add(circuits_pending_close, circ); - - log_info(LD_GENERAL, "Circuit %u (id: %" PRIu32 ") marked for close at " - "%s:%d (orig reason: %d, new reason: %d)", - circ->n_circ_id, - CIRCUIT_IS_ORIGIN(circ) ? - TO_ORIGIN_CIRCUIT(circ)->global_identifier : 0, - file, line, orig_reason, reason); -} - -/** Called immediately before freeing a marked circuit circ from - * circuit_free_all() while shutting down Tor; this is a safe-at-shutdown - * version of circuit_about_to_free(). It's important that it at least - * do circuitmux_detach_circuit() when appropriate. - */ -static void -circuit_about_to_free_atexit(circuit_t *circ) -{ - - if (circ->n_chan) { - circuit_clear_cell_queue(circ, circ->n_chan); - circuitmux_detach_circuit(circ->n_chan->cmux, circ); - circuit_set_n_circid_chan(circ, 0, NULL); - } - - if (! CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - - if (or_circ->p_chan) { - circuit_clear_cell_queue(circ, or_circ->p_chan); - circuitmux_detach_circuit(or_circ->p_chan->cmux, circ); - circuit_set_p_circid_chan(or_circ, 0, NULL); - } - } -} - -/** Called immediately before freeing a marked circuit circ. - * Disconnects the circuit from other data structures, launches events - * as appropriate, and performs other housekeeping. - */ -static void -circuit_about_to_free(circuit_t *circ) -{ - - int reason = circ->marked_for_close_reason; - int orig_reason = circ->marked_for_close_orig_reason; - if (circ->state == CIRCUIT_STATE_ONIONSKIN_PENDING) { onion_pending_remove(TO_OR_CIRCUIT(circ)); } @@ -2057,8 +1486,7 @@ circuit_about_to_free(circuit_t *circ) * module then. If it isn't OPEN, we send it there now to remember which * links worked and which didn't. */ - if (circ->state != CIRCUIT_STATE_OPEN && - circ->state != CIRCUIT_STATE_GUARD_WAIT) { + if (circ->state != CIRCUIT_STATE_OPEN) { if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); circuit_build_failed(ocirc); /* take actions if necessary */ @@ -2069,62 +1497,50 @@ circuit_about_to_free(circuit_t *circ) if (circuits_pending_chans) smartlist_remove(circuits_pending_chans, circ); } - if (circuits_pending_other_guards) { - smartlist_remove(circuits_pending_other_guards, circ); - } if (CIRCUIT_IS_ORIGIN(circ)) { control_event_circuit_status(TO_ORIGIN_CIRCUIT(circ), - (circ->state == CIRCUIT_STATE_OPEN || - circ->state == CIRCUIT_STATE_GUARD_WAIT) ? - CIRC_EVENT_CLOSED:CIRC_EVENT_FAILED, + (circ->state == CIRCUIT_STATE_OPEN)?CIRC_EVENT_CLOSED:CIRC_EVENT_FAILED, orig_reason); } - if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); int timed_out = (reason == END_CIRC_REASON_TIMEOUT); tor_assert(circ->state == CIRCUIT_STATE_OPEN); tor_assert(ocirc->build_state->chosen_exit); - if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT && - ocirc->rend_data) { - /* treat this like getting a nack from it */ - log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", - safe_str_client(rend_data_get_address(ocirc->rend_data)), - safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), - timed_out ? "Recording timeout." : "Removing from descriptor."); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - timed_out ? - INTRO_POINT_FAILURE_TIMEOUT : - INTRO_POINT_FAILURE_GENERIC); - } + tor_assert(ocirc->rend_data); + /* treat this like getting a nack from it */ + log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", + safe_str_client(ocirc->rend_data->onion_address), + safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), + timed_out ? "Recording timeout." : "Removing from descriptor."); + rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, + ocirc->rend_data, + timed_out ? + INTRO_POINT_FAILURE_TIMEOUT : + INTRO_POINT_FAILURE_GENERIC); } else if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && reason != END_CIRC_REASON_TIMEOUT) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); if (ocirc->build_state->chosen_exit && ocirc->rend_data) { - if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT && - ocirc->rend_data) { - log_info(LD_REND, "Failed intro circ %s to %s " - "(building circuit to intro point). " - "Marking intro point as possibly unreachable.", - safe_str_client(rend_data_get_address(ocirc->rend_data)), - safe_str_client(build_state_get_exit_nickname( - ocirc->build_state))); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - INTRO_POINT_FAILURE_UNREACHABLE); - } + log_info(LD_REND, "Failed intro circ %s to %s " + "(building circuit to intro point). " + "Marking intro point as possibly unreachable.", + safe_str_client(ocirc->rend_data->onion_address), + safe_str_client(build_state_get_exit_nickname(ocirc->build_state))); + rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, + ocirc->rend_data, + INTRO_POINT_FAILURE_UNREACHABLE); } } - if (circ->n_chan) { circuit_clear_cell_queue(circ, circ->n_chan); /* Only send destroy if the channel isn't closing anyway */ - if (!CHANNEL_CONDEMNED(circ->n_chan)) { + if (!(circ->n_chan->state == CHANNEL_STATE_CLOSING || + circ->n_chan->state == CHANNEL_STATE_CLOSED || + circ->n_chan->state == CHANNEL_STATE_ERROR)) { channel_send_destroy(circ->n_circ_id, circ->n_chan, reason); } circuitmux_detach_circuit(circ->n_chan->cmux, circ); - circuit_set_n_circid_chan(circ, 0, NULL); } if (! CIRCUIT_IS_ORIGIN(circ)) { @@ -2152,11 +1568,12 @@ circuit_about_to_free(circuit_t *circ) if (or_circ->p_chan) { circuit_clear_cell_queue(circ, or_circ->p_chan); /* Only send destroy if the channel isn't closing anyway */ - if (!CHANNEL_CONDEMNED(or_circ->p_chan)) { + if (!(or_circ->p_chan->state == CHANNEL_STATE_CLOSING || + or_circ->p_chan->state == CHANNEL_STATE_CLOSED || + or_circ->p_chan->state == CHANNEL_STATE_ERROR)) { channel_send_destroy(or_circ->p_circ_id, or_circ->p_chan, reason); } circuitmux_detach_circuit(or_circ->p_chan->cmux, circ); - circuit_set_p_circid_chan(or_circ, 0, NULL); } } else { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); @@ -2165,6 +1582,20 @@ circuit_about_to_free(circuit_t *circ) connection_edge_destroy(circ->n_circ_id, conn); ocirc->p_streams = NULL; } + + circ->marked_for_close = line; + circ->marked_for_close_file = file; + + if (!CIRCUIT_IS_ORIGIN(circ)) { + or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); + if (or_circ->rend_splice) { + if (!or_circ->rend_splice->base_.marked_for_close) { + /* do this after marking this circuit, to avoid infinite recursion. */ + circuit_mark_for_close(TO_CIRCUIT(or_circ->rend_splice), reason); + } + or_circ->rend_splice = NULL; + } + } } /** Given a marked circuit circ, aggressively free its cell queues to @@ -2177,66 +1608,8 @@ marked_circuit_free_cells(circuit_t *circ) return; } cell_queue_clear(&circ->n_chan_cells); - if (circ->n_mux) - circuitmux_clear_num_cells(circ->n_mux, circ); - if (! CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); - cell_queue_clear(&orcirc->p_chan_cells); - if (orcirc->p_mux) - circuitmux_clear_num_cells(orcirc->p_mux, circ); - } -} - -static size_t -single_conn_free_bytes(connection_t *conn) -{ - size_t result = 0; - if (conn->inbuf) { - result += buf_allocation(conn->inbuf); - buf_clear(conn->inbuf); - } - if (conn->outbuf) { - result += buf_allocation(conn->outbuf); - buf_clear(conn->outbuf); - conn->outbuf_flushlen = 0; - } - if (conn->type == CONN_TYPE_DIR) { - dir_connection_t *dir_conn = TO_DIR_CONN(conn); - if (dir_conn->compress_state) { - result += tor_compress_state_size(dir_conn->compress_state); - tor_compress_free(dir_conn->compress_state); - dir_conn->compress_state = NULL; - } - } - return result; -} - -/** Aggressively free buffer contents on all the buffers of all streams in the - * list starting at stream. Return the number of bytes recovered. */ -static size_t -marked_circuit_streams_free_bytes(edge_connection_t *stream) -{ - size_t result = 0; - for ( ; stream; stream = stream->next_stream) { - connection_t *conn = TO_CONN(stream); - result += single_conn_free_bytes(conn); - if (conn->linked_conn) { - result += single_conn_free_bytes(conn->linked_conn); - } - } - return result; -} - -/** Aggressively free buffer contents on all the buffers of all streams on - * circuit c. Return the number of bytes recovered. */ -static size_t -marked_circuit_free_stream_bytes(circuit_t *c) -{ - if (CIRCUIT_IS_ORIGIN(c)) { - return marked_circuit_streams_free_bytes(TO_ORIGIN_CIRCUIT(c)->p_streams); - } else { - return marked_circuit_streams_free_bytes(TO_OR_CIRCUIT(c)->n_streams); - } + if (! CIRCUIT_IS_ORIGIN(circ)) + cell_queue_clear(& TO_OR_CIRCUIT(circ)->p_chan_cells); } /** Return the number of cells used by the circuit c's cell queues. */ @@ -2252,26 +1625,26 @@ n_cells_in_circ_queues(const circuit_t *c) } /** - * Return the age of the oldest cell queued on c, in timestamp units. + * Return the age of the oldest cell queued on c, in milliseconds. * Return 0 if there are no cells queued on c. Requires that now be - * the current coarse timestamp. + * the current time in milliseconds since the epoch, truncated. * * This function will return incorrect results if the oldest cell queued on - * the circuit is older than about 2**32 msec (about 49 days) old. + * the circuit is older than 2**32 msec (about 49 days) old. */ -STATIC uint32_t +static uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now) { uint32_t age = 0; packed_cell_t *cell; if (NULL != (cell = TOR_SIMPLEQ_FIRST(&c->n_chan_cells.head))) - age = now - cell->inserted_timestamp; + age = now - cell->inserted_time; if (! CIRCUIT_IS_ORIGIN(c)) { - const or_circuit_t *orcirc = CONST_TO_OR_CIRCUIT(c); + const or_circuit_t *orcirc = TO_OR_CIRCUIT((circuit_t*)c); if (NULL != (cell = TOR_SIMPLEQ_FIRST(&orcirc->p_chan_cells.head))) { - uint32_t age2 = now - cell->inserted_timestamp; + uint32_t age2 = now - cell->inserted_time; if (age2 > age) return age2; } @@ -2279,106 +1652,20 @@ circuit_max_queued_cell_age(const circuit_t *c, uint32_t now) return age; } -/** Return the age of the oldest buffer chunk on conn, where age is - * taken in timestamp units before the time now. If the connection has - * no data, treat it as having age zero. - **/ -static uint32_t -conn_get_buffer_age(const connection_t *conn, uint32_t now_ts) -{ - uint32_t age = 0, age2; - if (conn->outbuf) { - age2 = buf_get_oldest_chunk_timestamp(conn->outbuf, now_ts); - if (age2 > age) - age = age2; - } - if (conn->inbuf) { - age2 = buf_get_oldest_chunk_timestamp(conn->inbuf, now_ts); - if (age2 > age) - age = age2; - } - return age; -} +/** Temporary variable for circuits_compare_by_oldest_queued_cell_ This is a + * kludge to work around the fact that qsort doesn't provide a way for + * comparison functions to take an extra argument. */ +static uint32_t circcomp_now_tmp; -/** Return the age in timestamp units of the oldest buffer chunk on any stream - * in the linked list stream, where age is taken in timestamp units - * before the timestamp now. */ -static uint32_t -circuit_get_streams_max_data_age(const edge_connection_t *stream, uint32_t now) -{ - uint32_t age = 0, age2; - for (; stream; stream = stream->next_stream) { - const connection_t *conn = TO_CONN(stream); - age2 = conn_get_buffer_age(conn, now); - if (age2 > age) - age = age2; - if (conn->linked_conn) { - age2 = conn_get_buffer_age(conn->linked_conn, now); - if (age2 > age) - age = age2; - } - } - return age; -} - -/** Return the age in timestamp units of the oldest buffer chunk on any stream - * attached to the circuit c, where age is taken before the timestamp - * now. */ -STATIC uint32_t -circuit_max_queued_data_age(const circuit_t *c, uint32_t now) -{ - if (CIRCUIT_IS_ORIGIN(c)) { - return circuit_get_streams_max_data_age( - CONST_TO_ORIGIN_CIRCUIT(c)->p_streams, now); - } else { - return circuit_get_streams_max_data_age( - CONST_TO_OR_CIRCUIT(c)->n_streams, now); - } -} - -/** Return the age of the oldest cell or stream buffer chunk on the circuit - * c, where age is taken in timestamp units before the timestamp - * now */ -STATIC uint32_t -circuit_max_queued_item_age(const circuit_t *c, uint32_t now) -{ - uint32_t cell_age = circuit_max_queued_cell_age(c, now); - uint32_t data_age = circuit_max_queued_data_age(c, now); - if (cell_age > data_age) - return cell_age; - else - return data_age; -} - -/** Helper to sort a list of circuit_t by age of oldest item, in descending - * order. */ +/** Helper to sort a list of circuit_t by age of oldest cell, in descending + * order. Requires that circcomp_now_tmp is set correctly. */ static int -circuits_compare_by_oldest_queued_item_(const void **a_, const void **b_) +circuits_compare_by_oldest_queued_cell_(const void **a_, const void **b_) { const circuit_t *a = *a_; const circuit_t *b = *b_; - uint32_t age_a = a->age_tmp; - uint32_t age_b = b->age_tmp; - - if (age_a < age_b) - return 1; - else if (age_a == age_b) - return 0; - else - return -1; -} - -static uint32_t now_ts_for_buf_cmp; - -/** Helper to sort a list of circuit_t by age of oldest item, in descending - * order. */ -static int -conns_compare_by_buffer_age_(const void **a_, const void **b_) -{ - const connection_t *a = *a_; - const connection_t *b = *b_; - time_t age_a = conn_get_buffer_age(a, now_ts_for_buf_cmp); - time_t age_b = conn_get_buffer_age(b, now_ts_for_buf_cmp); + uint32_t age_a = circuit_max_queued_cell_age(a, circcomp_now_tmp); + uint32_t age_b = circuit_max_queued_cell_age(b, circcomp_now_tmp); if (age_a < age_b) return 1; @@ -2388,115 +1675,69 @@ conns_compare_by_buffer_age_(const void **a_, const void **b_) return -1; } -#define FRACTION_OF_DATA_TO_RETAIN_ON_OOM 0.90 +#define FRACTION_OF_CELLS_TO_RETAIN_ON_OOM 0.90 /** We're out of memory for cells, having allocated current_allocation * bytes' worth. Kill the 'worst' circuits until we're under - * FRACTION_OF_DATA_TO_RETAIN_ON_OOM of our maximum usage. */ + * FRACTION_OF_CIRCS_TO_RETAIN_ON_OOM of our maximum usage. */ void circuits_handle_oom(size_t current_allocation) { - smartlist_t *circlist; - smartlist_t *connection_array = get_connection_array(); - int conn_idx; - size_t mem_to_recover; - size_t mem_recovered=0; + /* Let's hope there's enough slack space for this allocation here... */ + smartlist_t *circlist = smartlist_new(); + circuit_t *circ; + size_t n_cells_removed=0, n_cells_to_remove; int n_circuits_killed=0; - int n_dirconns_killed=0; - uint32_t now_ts; + struct timeval now; log_notice(LD_GENERAL, "We're low on memory. Killing circuits with " "over-long queues. (This behavior is controlled by " - "MaxMemInQueues.)"); + "MaxMemInCellQueues.)"); { - size_t mem_target = (size_t)(get_options()->MaxMemInQueues * - FRACTION_OF_DATA_TO_RETAIN_ON_OOM); + size_t mem_target = (size_t)(get_options()->MaxMemInCellQueues * + FRACTION_OF_CELLS_TO_RETAIN_ON_OOM); + size_t mem_to_recover; if (current_allocation <= mem_target) return; mem_to_recover = current_allocation - mem_target; + n_cells_to_remove = CEIL_DIV(mem_to_recover, packed_cell_mem_cost()); } - now_ts = monotime_coarse_get_stamp(); + /* This algorithm itself assumes that you've got enough memory slack + * to actually run it. */ + TOR_LIST_FOREACH(circ, &global_circuitlist, head) + smartlist_add(circlist, circ); - circlist = circuit_get_global_list(); - SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) { - circ->age_tmp = circuit_max_queued_item_age(circ, now_ts); - } SMARTLIST_FOREACH_END(circ); + /* Set circcomp_now_tmp so that the sort can work. */ + tor_gettimeofday_cached(&now); + circcomp_now_tmp = (uint32_t)tv_to_msec(&now); /* This is O(n log n); there are faster algorithms we could use instead. * Let's hope this doesn't happen enough to be in the critical path. */ - smartlist_sort(circlist, circuits_compare_by_oldest_queued_item_); + smartlist_sort(circlist, circuits_compare_by_oldest_queued_cell_); - /* Fix up the indices before we run into trouble */ + /* Okay, now the worst circuits are at the front of the list. Let's mark + * them, and reclaim their storage aggressively. */ SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) { - circ->global_circuitlist_idx = circ_sl_idx; - } SMARTLIST_FOREACH_END(circ); - - /* Now sort the connection array ... */ - now_ts_for_buf_cmp = now_ts; - smartlist_sort(connection_array, conns_compare_by_buffer_age_); - now_ts_for_buf_cmp = 0; - - /* Fix up the connection array to its new order. */ - SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) { - conn->conn_array_index = conn_sl_idx; - } SMARTLIST_FOREACH_END(conn); - - /* Okay, now the worst circuits and connections are at the front of their - * respective lists. Let's mark them, and reclaim their storage - * aggressively. */ - conn_idx = 0; - SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) { - size_t n; - size_t freed; - - /* Free storage in any non-linked directory connections that have buffered - * data older than this circuit. */ - while (conn_idx < smartlist_len(connection_array)) { - connection_t *conn = smartlist_get(connection_array, conn_idx); - uint32_t conn_age = conn_get_buffer_age(conn, now_ts); - if (conn_age < circ->age_tmp) { - break; - } - if (conn->type == CONN_TYPE_DIR && conn->linked_conn == NULL) { - if (!conn->marked_for_close) - connection_mark_for_close(conn); - mem_recovered += single_conn_free_bytes(conn); - - ++n_dirconns_killed; - - if (mem_recovered >= mem_to_recover) - goto done_recovering_mem; - } - ++conn_idx; - } - - /* Now, kill the circuit. */ - n = n_cells_in_circ_queues(circ); + size_t n = n_cells_in_circ_queues(circ); if (! circ->marked_for_close) { circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT); } marked_circuit_free_cells(circ); - freed = marked_circuit_free_stream_bytes(circ); ++n_circuits_killed; - - mem_recovered += n * packed_cell_mem_cost(); - mem_recovered += freed; - - if (mem_recovered >= mem_to_recover) - goto done_recovering_mem; + n_cells_removed += n; + if (n_cells_removed >= n_cells_to_remove) + break; } SMARTLIST_FOREACH_END(circ); - done_recovering_mem: + clean_cell_pool(); /* In case this helps. */ + + log_notice(LD_GENERAL, "Removed "U64_FORMAT" bytes by killing %d circuits.", + U64_PRINTF_ARG(n_cells_removed * packed_cell_mem_cost()), + n_circuits_killed); - log_notice(LD_GENERAL, "Removed "U64_FORMAT" bytes by killing %d circuits; " - "%d circuits remain alive. Also killed %d non-linked directory " - "connections.", - U64_PRINTF_ARG(mem_recovered), - n_circuits_killed, - smartlist_len(circlist) - n_circuits_killed, - n_dirconns_killed); + smartlist_free(circlist); } /** Verify that cpath layer cp has all of its invariants @@ -2556,8 +1797,8 @@ assert_cpath_ok(const crypt_path_t *cp) /** Verify that circuit c has all of its invariants * correct. Trigger an assert if anything is invalid. */ -MOCK_IMPL(void, -assert_circuit_ok,(const circuit_t *c)) +void +assert_circuit_ok(const circuit_t *c) { edge_connection_t *conn; const or_circuit_t *or_circ = NULL; @@ -2568,10 +1809,15 @@ assert_circuit_ok,(const circuit_t *c)) tor_assert(c->purpose >= CIRCUIT_PURPOSE_MIN_ && c->purpose <= CIRCUIT_PURPOSE_MAX_); - if (CIRCUIT_IS_ORIGIN(c)) - origin_circ = CONST_TO_ORIGIN_CIRCUIT(c); - else - or_circ = CONST_TO_OR_CIRCUIT(c); + { + /* Having a separate variable for this pleases GCC 4.2 in ways I hope I + * never understand. -NM. */ + circuit_t *nonconst_circ = (circuit_t*) c; + if (CIRCUIT_IS_ORIGIN(c)) + origin_circ = TO_ORIGIN_CIRCUIT(nonconst_circ); + else + or_circ = TO_OR_CIRCUIT(nonconst_circ); + } if (c->n_chan) { tor_assert(!c->n_hop); @@ -2599,8 +1845,7 @@ assert_circuit_ok,(const circuit_t *c)) tor_assert(c->deliver_window >= 0); tor_assert(c->package_window >= 0); - if (c->state == CIRCUIT_STATE_OPEN || - c->state == CIRCUIT_STATE_GUARD_WAIT) { + if (c->state == CIRCUIT_STATE_OPEN) { tor_assert(!c->n_chan_create_cell); if (or_circ) { tor_assert(or_circ->n_crypto); diff --git a/src/tor/src/or/circuitlist.h b/src/tor/circuitlist.h similarity index 63% rename from src/tor/src/or/circuitlist.h rename to src/tor/circuitlist.h index 246f0c881..1c8cf7de2 100644 --- a/src/tor/src/or/circuitlist.h +++ b/src/tor/circuitlist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,27 +13,22 @@ #define TOR_CIRCUITLIST_H #include "testsupport.h" -#include "hs_ident.h" -MOCK_DECL(smartlist_t *, circuit_get_global_list, (void)); -smartlist_t *circuit_get_global_origin_circuit_list(void); -int circuit_any_opened_circuits(void); -int circuit_any_opened_circuits_cached(void); -void circuit_cache_opened_circuit_state(int circuits_are_opened); +TOR_LIST_HEAD(global_circuitlist_s, circuit_t); +struct global_circuitlist_s* circuit_get_global_list(void); const char *circuit_state_to_string(int state); const char *circuit_purpose_to_controller_string(uint8_t purpose); const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose); const char *circuit_purpose_to_string(uint8_t purpose); void circuit_dump_by_conn(connection_t *conn, int severity); +void circuit_dump_by_chan(channel_t *chan, int severity); void circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id, channel_t *chan); void circuit_set_n_circid_chan(circuit_t *circ, circid_t id, channel_t *chan); void channel_mark_circid_unusable(channel_t *chan, circid_t id); void channel_mark_circid_usable(channel_t *chan, circid_t id); -time_t circuit_id_when_marked_unusable_on_channel(circid_t circ_id, - channel_t *chan); void circuit_set_state(circuit_t *circ, uint8_t state); void circuit_close_all_marked(void); int32_t circuit_initial_package_window(void); @@ -51,18 +46,16 @@ origin_circuit_t *circuit_get_by_global_id(uint32_t id); origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data( const rend_data_t *rend_data); origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, - const uint8_t *digest, uint8_t purpose); -origin_circuit_t *circuit_get_next_service_intro_circ(origin_circuit_t *start); -origin_circuit_t *circuit_get_next_service_rp_circ(origin_circuit_t *start); -origin_circuit_t *circuit_get_next_service_hsdir_circ(origin_circuit_t *start); + const char *digest, uint8_t purpose); +or_circuit_t *circuit_get_rendezvous(const char *cookie); +or_circuit_t *circuit_get_intro_point(const char *digest); origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, int flags); void circuit_mark_all_unused_circs(void); void circuit_mark_all_dirty_circs_as_unusable(void); -MOCK_DECL(void, circuit_mark_for_close_, (circuit_t *circ, int reason, - int line, const char *file)); +void circuit_mark_for_close_(circuit_t *circ, int reason, + int line, const char *file); int circuit_get_cpath_len(origin_circuit_t *circ); -int circuit_get_cpath_opened_len(const origin_circuit_t *); void circuit_clear_cpath(origin_circuit_t *circ); crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum); void circuit_get_all_pending_on_channel(smartlist_t *out, @@ -73,26 +66,17 @@ int circuit_count_pending_on_channel(channel_t *chan); circuit_mark_for_close_((c), (reason), __LINE__, SHORT_FILE__) void assert_cpath_layer_ok(const crypt_path_t *cp); -MOCK_DECL(void, assert_circuit_ok,(const circuit_t *c)); +void assert_circuit_ok(const circuit_t *c); void circuit_free_all(void); void circuits_handle_oom(size_t current_allocation); -void circuit_clear_testing_cell_stats(circuit_t *circ); - void channel_note_destroy_pending(channel_t *chan, circid_t id); -MOCK_DECL(void, channel_note_destroy_not_pending, - (channel_t *chan, circid_t id)); - -smartlist_t *circuit_find_circuits_to_upgrade_from_guard_wait(void); +void channel_note_destroy_not_pending(channel_t *chan, circid_t id); #ifdef CIRCUITLIST_PRIVATE -STATIC void circuit_free_(circuit_t *circ); -#define circuit_free(circ) FREE_AND_NULL(circuit_t, circuit_free_, (circ)) +STATIC void circuit_free(circuit_t *circ); STATIC size_t n_cells_in_circ_queues(const circuit_t *c); -STATIC uint32_t circuit_max_queued_data_age(const circuit_t *c, uint32_t now); -STATIC uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now); -STATIC uint32_t circuit_max_queued_item_age(const circuit_t *c, uint32_t now); -#endif /* defined(CIRCUITLIST_PRIVATE) */ +#endif -#endif /* !defined(TOR_CIRCUITLIST_H) */ +#endif diff --git a/src/tor/src/or/circuitmux.c b/src/tor/circuitmux.c similarity index 91% rename from src/tor/src/or/circuitmux.c rename to src/tor/circuitmux.c index fe3d8f133..f2af94393 100644 --- a/src/tor/src/or/circuitmux.c +++ b/src/tor/circuitmux.c @@ -1,23 +1,52 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file circuitmux.c * \brief Circuit mux/cell selection abstraction - * - * A circuitmux is responsible for MUltipleXing all of the - * circuits that are writing on a single channel. It keeps track of which of - * these circuits has something to write (aka, "active" circuits), and which - * one should write next. A circuitmux corresponds 1:1 with a channel. - * - * There can be different implementations of the circuitmux's rules (which - * decide which circuit is next to write). - * - * A circuitmux exposes three distinct + **/ + +#include "or.h" +#include "channel.h" +#include "circuitlist.h" +#include "circuitmux.h" +#include "relay.h" + +/* + * Private typedefs for circuitmux.c + */ + +/* + * Map of muxinfos for circuitmux_t to use; struct is defined below (name + * of struct must match HT_HEAD line). + */ +typedef struct chanid_circid_muxinfo_map chanid_circid_muxinfo_map_t; + +/* + * Hash table entry (yeah, calling it chanid_circid_muxinfo_s seems to + * break the hash table code). + */ +typedef struct chanid_circid_muxinfo_t chanid_circid_muxinfo_t; + +/* + * Anything the mux wants to store per-circuit in the map; right now just + * a count of queued cells. + */ + +typedef struct circuit_muxinfo_s circuit_muxinfo_t; + +/* + * Structures for circuitmux.c + */ + +/* + * A circuitmux is a collection of circuits; it tracks which subset + * of the attached circuits are 'active' (i.e., have cells available + * to transmit) and how many cells on each. It expoes three distinct * interfaces to other components: * * To channels, which each have a circuitmux_t, the supported operations - * (invoked from relay.c) are: + * are: * * circuitmux_get_first_active_circuit(): * @@ -45,9 +74,7 @@ * * circuitmux_set_num_cells(): * - * Set the circuitmux's cell counter for this circuit. One of - * circuitmuc_clear_num_cells() or circuitmux_set_num_cells() MUST be - * called when the number of cells queued on a circuit changes. + * Set the circuitmux's cell counter for this circuit. * * See circuitmux.h for the circuitmux_policy_t data structure, which contains * a table of function pointers implementing a circuit selection policy, and @@ -67,39 +94,7 @@ * * Install a policy on a circuitmux_t; the appropriate callbacks will be * made to attach all existing circuits to the new policy. - **/ - -#include "or.h" -#include "channel.h" -#include "circuitlist.h" -#include "circuitmux.h" -#include "relay.h" - -/* - * Private typedefs for circuitmux.c - */ - -/* - * Map of muxinfos for circuitmux_t to use; struct is defined below (name - * of struct must match HT_HEAD line). - */ -typedef struct chanid_circid_muxinfo_map chanid_circid_muxinfo_map_t; - -/* - * Hash table entry (yeah, calling it chanid_circid_muxinfo_s seems to - * break the hash table code). - */ -typedef struct chanid_circid_muxinfo_t chanid_circid_muxinfo_t; - -/* - * Anything the mux wants to store per-circuit in the map; right now just - * a count of queued cells. - */ - -typedef struct circuit_muxinfo_s circuit_muxinfo_t; - -/* - * Structures for circuitmux.c + * */ struct circuitmux_s { @@ -122,7 +117,7 @@ struct circuitmux_s { struct circuit_t *active_circuits_head, *active_circuits_tail; /** List of queued destroy cells */ - destroy_cell_queue_t destroy_cell_queue; + cell_queue_t destroy_cell_queue; /** Boolean: True iff the last cell to circuitmux_get_first_active_circuit * returned the destroy queue. Used to force alternation between * destroy/non-destroy cells. @@ -185,16 +180,16 @@ struct chanid_circid_muxinfo_t { circuitmux_assert_okay(cmux) #else #define circuitmux_assert_okay_paranoid(cmux) -#endif /* defined(CMUX_PARANOIA) */ +#endif /* * Static function declarations */ -static inline int +static INLINE int chanid_circid_entries_eq(chanid_circid_muxinfo_t *a, chanid_circid_muxinfo_t *b); -static inline unsigned int +static INLINE unsigned int chanid_circid_entry_hash(chanid_circid_muxinfo_t *a); static chanid_circid_muxinfo_t * circuitmux_find_map_entry(circuitmux_t *cmux, circuit_t *circ); @@ -204,12 +199,12 @@ circuitmux_make_circuit_active(circuitmux_t *cmux, circuit_t *circ, static void circuitmux_make_circuit_inactive(circuitmux_t *cmux, circuit_t *circ, cell_direction_t direction); -static inline void +static INLINE void circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, cell_direction_t direction); -static inline circuit_t ** +static INLINE circuit_t ** circuitmux_next_active_circ_p(circuitmux_t *cmux, circuit_t *circ); -static inline circuit_t ** +static INLINE circuit_t ** circuitmux_prev_active_circ_p(circuitmux_t *cmux, circuit_t *circ); static void circuitmux_assert_okay_pass_one(circuitmux_t *cmux); static void circuitmux_assert_okay_pass_two(circuitmux_t *cmux); @@ -231,7 +226,7 @@ static int64_t global_destroy_ctr = 0; * used by circuitmux_notify_xmit_cells(). */ -static inline void +static INLINE void circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, cell_direction_t direction) { @@ -261,11 +256,13 @@ circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, if (circ->n_mux == cmux) { next_p = &(circ->next_active_on_n_chan); prev_p = &(circ->prev_active_on_n_chan); + direction = CELL_DIRECTION_OUT; } else { or_circ = TO_OR_CIRCUIT(circ); tor_assert(or_circ->p_mux == cmux); next_p = &(or_circ->next_active_on_p_chan); prev_p = &(or_circ->prev_active_on_p_chan); + direction = CELL_DIRECTION_IN; } } tor_assert(next_p); @@ -309,7 +306,7 @@ circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, circuitmux_assert_okay_paranoid(cmux); } -static inline circuit_t ** +static INLINE circuit_t ** circuitmux_next_active_circ_p(circuitmux_t *cmux, circuit_t *circ) { tor_assert(cmux); @@ -322,7 +319,7 @@ circuitmux_next_active_circ_p(circuitmux_t *cmux, circuit_t *circ) } } -static inline circuit_t ** +static INLINE circuit_t ** circuitmux_prev_active_circ_p(circuitmux_t *cmux, circuit_t *circ) { tor_assert(cmux); @@ -341,7 +338,7 @@ circuitmux_prev_active_circ_p(circuitmux_t *cmux, circuit_t *circ) * than zero appropriately. */ -static inline int +static INLINE int chanid_circid_entries_eq(chanid_circid_muxinfo_t *a, chanid_circid_muxinfo_t *b) { @@ -352,7 +349,7 @@ chanid_circid_entries_eq(chanid_circid_muxinfo_t *a, * Helper: return a hash based on circuit ID and channel ID in a. */ -static inline unsigned int +static INLINE unsigned int chanid_circid_entry_hash(chanid_circid_muxinfo_t *a) { return (((unsigned int)(a->circ_id) << 8) ^ @@ -365,10 +362,10 @@ HT_HEAD(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t); /* Emit a bunch of hash table stuff */ HT_PROTOTYPE(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, - chanid_circid_entry_hash, chanid_circid_entries_eq) -HT_GENERATE2(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, - chanid_circid_entry_hash, chanid_circid_entries_eq, 0.6, - tor_reallocarray_, tor_free_) + chanid_circid_entry_hash, chanid_circid_entries_eq); +HT_GENERATE(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, + chanid_circid_entry_hash, chanid_circid_entries_eq, 0.6, + malloc, realloc, free); /* * Circuitmux alloc/free functions @@ -386,20 +383,17 @@ circuitmux_alloc(void) rv = tor_malloc_zero(sizeof(*rv)); rv->chanid_circid_map = tor_malloc_zero(sizeof(*( rv->chanid_circid_map))); HT_INIT(chanid_circid_muxinfo_map, rv->chanid_circid_map); - destroy_cell_queue_init(&rv->destroy_cell_queue); + cell_queue_init(&rv->destroy_cell_queue); return rv; } /** * Detach all circuits from a circuitmux (use before circuitmux_free()) - * - * If detached_out is non-NULL, add every detached circuit_t to - * detached_out. */ void -circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out) +circuitmux_detach_all_circuits(circuitmux_t *cmux) { chanid_circid_muxinfo_t **i = NULL, *to_remove; channel_t *chan = NULL; @@ -415,11 +409,7 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out) i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); while (i) { to_remove = *i; - - if (! to_remove) { - log_warn(LD_BUG, "Somehow, an HT iterator gave us a NULL pointer."); - break; - } else { + if (to_remove) { /* Find a channel and circuit */ chan = channel_find_by_global_id(to_remove->chan_id); if (chan) { @@ -440,9 +430,6 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out) /* Clear n_mux */ circ->n_mux = NULL; - - if (detached_out) - smartlist_add(detached_out, circ); } else if (circ->magic == OR_CIRCUIT_MAGIC) { /* * Update active_circuits et al.; this does policy notifies, so @@ -458,9 +445,6 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out) * so clear p_mux. */ TO_OR_CIRCUIT(circ)->p_mux = NULL; - - if (detached_out) - smartlist_add(detached_out, circ); } else { /* Complain and move on */ log_warn(LD_CIRC, @@ -525,10 +509,19 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux, smartlist_t *detached_out) void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan) { - destroy_cell_t *cell; + packed_cell_t *cell; + int n_bad = 0; TOR_SIMPLEQ_FOREACH(cell, &cmux->destroy_cell_queue.head, next) { - channel_mark_circid_usable(chan, cell->circid); + circid_t circid = 0; + if (packed_cell_is_destroy(chan, cell, &circid)) { + channel_mark_circid_usable(chan, circid); + } else { + ++n_bad; + } } + if (n_bad) + log_warn(LD_BUG, "%d cell(s) on destroy queue did not look like a " + "DESTROY cell.", n_bad); } /** @@ -537,7 +530,7 @@ circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan) */ void -circuitmux_free_(circuitmux_t *cmux) +circuitmux_free(circuitmux_t *cmux) { if (!cmux) return; @@ -585,7 +578,7 @@ circuitmux_free_(circuitmux_t *cmux) I64_PRINTF_ARG(global_destroy_ctr)); } - destroy_cell_queue_clear(&cmux->destroy_cell_queue); + cell_queue_clear(&cmux->destroy_cell_queue); tor_free(cmux); } @@ -615,8 +608,8 @@ circuitmux_clear_policy(circuitmux_t *cmux) * Return the policy currently installed on a circuitmux_t */ -MOCK_IMPL(const circuitmux_policy_t *, -circuitmux_get_policy, (circuitmux_t *cmux)) +const circuitmux_policy_t * +circuitmux_get_policy(circuitmux_t *cmux) { tor_assert(cmux); @@ -890,8 +883,8 @@ circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ) * Query total number of available cells on a circuitmux */ -MOCK_IMPL(unsigned int, -circuitmux_num_cells, (circuitmux_t *cmux)) +unsigned int +circuitmux_num_cells(circuitmux_t *cmux) { tor_assert(cmux); @@ -1086,11 +1079,8 @@ circuitmux_detach_circuit,(circuitmux_t *cmux, circuit_t *circ)) /* * Use this to keep track of whether we found it for n_chan or * p_chan for consistency checking. - * - * The 0 initializer is not a valid cell_direction_t value. - * We assert that it has been replaced with a valid value before it is used. */ - cell_direction_t last_searched_direction = 0; + cell_direction_t last_searched_direction; tor_assert(cmux); tor_assert(cmux->chanid_circid_map); @@ -1120,9 +1110,6 @@ circuitmux_detach_circuit,(circuitmux_t *cmux, circuit_t *circ)) } } - tor_assert(last_searched_direction == CELL_DIRECTION_OUT - || last_searched_direction == CELL_DIRECTION_IN); - /* * If hashent isn't NULL, we have a circuit to detach; don't remove it from * the map until later of circuitmux_make_circuit_inactive() breaks. @@ -1463,7 +1450,7 @@ circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ, circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux, - destroy_cell_queue_t **destroy_queue_out) + cell_queue_t **destroy_queue_out) { circuit_t *circ = NULL; @@ -1644,6 +1631,7 @@ circuitmux_assert_okay_pass_one(circuitmux_t *cmux) circid_t circ_id; circuit_t *circ; or_circuit_t *or_circ; + unsigned int circ_is_active; circuit_t **next_p, **prev_p; unsigned int n_circuits, n_active_circuits, n_cells; @@ -1667,6 +1655,8 @@ circuitmux_assert_okay_pass_one(circuitmux_t *cmux) tor_assert(chan); circ = circuit_get_by_circid_channel_even_if_marked(circ_id, chan); tor_assert(circ); + /* Clear the circ_is_active bit to start */ + circ_is_active = 0; /* Assert that we know which direction this is going */ tor_assert((*i)->muxinfo.direction == CELL_DIRECTION_OUT || @@ -1693,7 +1683,7 @@ circuitmux_assert_okay_pass_one(circuitmux_t *cmux) * Should this circuit be active? I.e., does the mux know about > 0 * cells on it? */ - const int circ_is_active = ((*i)->muxinfo.cell_count > 0); + circ_is_active = ((*i)->muxinfo.cell_count > 0); /* It should be in the linked list iff it's active */ if (circ_is_active) { @@ -1745,6 +1735,7 @@ circuitmux_assert_okay_pass_two(circuitmux_t *cmux) circuit_t **next_p, **prev_p; channel_t *chan; unsigned int n_active_circuits = 0; + cell_direction_t direction; chanid_circid_muxinfo_t search, *hashent = NULL; tor_assert(cmux); @@ -1763,7 +1754,7 @@ circuitmux_assert_okay_pass_two(circuitmux_t *cmux) curr_or_circ = NULL; next_circ = NULL; next_p = prev_p = NULL; - cell_direction_t direction; + direction = 0; /* Figure out if this is n_mux or p_mux */ if (cmux == curr_circ->n_mux) { @@ -1875,7 +1866,14 @@ circuitmux_append_destroy_cell(channel_t *chan, circid_t circ_id, uint8_t reason) { - destroy_cell_queue_append(&cmux->destroy_cell_queue, circ_id, reason); + cell_t cell; + memset(&cell, 0, sizeof(cell_t)); + cell.circ_id = circ_id; + cell.command = CELL_DESTROY; + cell.payload[0] = (uint8_t) reason; + + cell_queue_append_packed_copy(NULL, &cmux->destroy_cell_queue, 0, &cell, + chan->wide_circ_ids, 0); /* Destroy entering the queue, update counters */ ++(cmux->destroy_ctr); @@ -1898,87 +1896,3 @@ circuitmux_append_destroy_cell(channel_t *chan, } } -/*DOCDOC; for debugging 12184. This runs slowly. */ -int64_t -circuitmux_count_queued_destroy_cells(const channel_t *chan, - const circuitmux_t *cmux) -{ - int64_t n_destroy_cells = cmux->destroy_ctr; - int64_t destroy_queue_size = cmux->destroy_cell_queue.n; - - int64_t manual_total = 0; - int64_t manual_total_in_map = 0; - destroy_cell_t *cell; - - TOR_SIMPLEQ_FOREACH(cell, &cmux->destroy_cell_queue.head, next) { - circid_t id; - ++manual_total; - - id = cell->circid; - if (circuit_id_in_use_on_channel(id, (channel_t*)chan)) - ++manual_total_in_map; - } - - if (n_destroy_cells != destroy_queue_size || - n_destroy_cells != manual_total || - n_destroy_cells != manual_total_in_map) { - log_warn(LD_BUG, " Discrepancy in counts for queued destroy cells on " - "circuitmux. n="I64_FORMAT". queue_size="I64_FORMAT". " - "manual_total="I64_FORMAT". manual_total_in_map="I64_FORMAT".", - I64_PRINTF_ARG(n_destroy_cells), - I64_PRINTF_ARG(destroy_queue_size), - I64_PRINTF_ARG(manual_total), - I64_PRINTF_ARG(manual_total_in_map)); - } - - return n_destroy_cells; -} - -/** - * Compare cmuxes to see which is more preferred; return < 0 if - * cmux_1 has higher priority (i.e., cmux_1 < cmux_2 in the scheduler's - * sort order), > 0 if cmux_2 has higher priority, or 0 if they are - * equally preferred. - * - * If the cmuxes have different cmux policies or the policy does not - * support the cmp_cmux method, return 0. - */ - -MOCK_IMPL(int, -circuitmux_compare_muxes, (circuitmux_t *cmux_1, circuitmux_t *cmux_2)) -{ - const circuitmux_policy_t *policy; - - tor_assert(cmux_1); - tor_assert(cmux_2); - - if (cmux_1 == cmux_2) { - /* Equivalent because they're the same cmux */ - return 0; - } - - if (cmux_1->policy && cmux_2->policy) { - if (cmux_1->policy == cmux_2->policy) { - policy = cmux_1->policy; - - if (policy->cmp_cmux) { - /* Okay, we can compare! */ - return policy->cmp_cmux(cmux_1, cmux_1->policy_data, - cmux_2, cmux_2->policy_data); - } else { - /* - * Equivalent because the policy doesn't know how to compare between - * muxes. - */ - return 0; - } - } else { - /* Equivalent because they have different policies */ - return 0; - } - } else { - /* Equivalent because one or both are missing a policy */ - return 0; - } -} - diff --git a/src/tor/src/or/circuitmux.h b/src/tor/circuitmux.h similarity index 82% rename from src/tor/src/or/circuitmux.h rename to src/tor/circuitmux.h index 336e128c7..ee2f5d153 100644 --- a/src/tor/src/or/circuitmux.h +++ b/src/tor/circuitmux.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -57,9 +57,6 @@ struct circuitmux_policy_s { /* Choose a circuit */ circuit_t * (*pick_active_circuit)(circuitmux_t *cmux, circuitmux_policy_data_t *pol_data); - /* Optional: channel comparator for use by the scheduler */ - int (*cmp_cmux)(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, - circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2); }; /* @@ -102,16 +99,12 @@ void circuitmux_assert_okay(circuitmux_t *cmux); /* Create/destroy */ circuitmux_t * circuitmux_alloc(void); -void circuitmux_detach_all_circuits(circuitmux_t *cmux, - smartlist_t *detached_out); -void circuitmux_free_(circuitmux_t *cmux); -#define circuitmux_free(cmux) \ - FREE_AND_NULL(circuitmux_t, circuitmux_free_, (cmux)) +void circuitmux_detach_all_circuits(circuitmux_t *cmux); +void circuitmux_free(circuitmux_t *cmux); /* Policy control */ void circuitmux_clear_policy(circuitmux_t *cmux); -MOCK_DECL(const circuitmux_policy_t *, - circuitmux_get_policy, (circuitmux_t *cmux)); +const circuitmux_policy_t * circuitmux_get_policy(circuitmux_t *cmux); void circuitmux_set_policy(circuitmux_t *cmux, const circuitmux_policy_t *pol); @@ -123,17 +116,13 @@ int circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ); int circuitmux_is_circuit_active(circuitmux_t *cmux, circuit_t *circ); unsigned int circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ); -MOCK_DECL(unsigned int, circuitmux_num_cells, (circuitmux_t *cmux)); +unsigned int circuitmux_num_cells(circuitmux_t *cmux); unsigned int circuitmux_num_circuits(circuitmux_t *cmux); unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux); -/* Debuging interface - slow. */ -int64_t circuitmux_count_queued_destroy_cells(const channel_t *chan, - const circuitmux_t *cmux); - /* Channel interface */ circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux, - destroy_cell_queue_t **destroy_queue_out); + cell_queue_t **destroy_queue_out); void circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ, unsigned int n_cells); void circuitmux_notify_xmit_destroy(circuitmux_t *cmux); @@ -154,9 +143,5 @@ void circuitmux_append_destroy_cell(channel_t *chan, void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan); -/* Optional interchannel comparisons for scheduling */ -MOCK_DECL(int, circuitmux_compare_muxes, - (circuitmux_t *cmux_1, circuitmux_t *cmux_2)); - -#endif /* !defined(TOR_CIRCUITMUX_H) */ +#endif /* TOR_CIRCUITMUX_H */ diff --git a/src/tor/src/or/circuitmux_ewma.c b/src/tor/circuitmux_ewma.c similarity index 86% rename from src/tor/src/or/circuitmux_ewma.c rename to src/tor/circuitmux_ewma.c index fde2d22a8..3f37d7b9a 100644 --- a/src/tor/src/or/circuitmux_ewma.c +++ b/src/tor/circuitmux_ewma.c @@ -1,37 +1,13 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file circuitmux_ewma.c * \brief EWMA circuit selection as a circuitmux_t policy - * - * The "EWMA" in this module stands for the "exponentially weighted moving - * average" of the number of cells sent on each circuit. The goal is to - * prioritize cells on circuits that have been quiet recently, by looking at - * those that have sent few cells over time, prioritizing recent times - * more than older ones. - * - * Specifically, a cell sent at time "now" has weight 1, but a time X ticks - * before now has weight ewma_scale_factor ^ X , where ewma_scale_factor is - * between 0.0 and 1.0. - * - * For efficiency, we do not re-scale these averages every time we send a - * cell: that would be horribly inefficient. Instead, we we keep the cell - * count on all circuits on the same circuitmux scaled relative to a single - * tick. When we add a new cell, we scale its weight depending on the time - * that has elapsed since the tick. We do re-scale the circuits on the - * circuitmux periodically, so that we don't overflow double. - * - * - * This module should be used through the interfaces in circuitmux.c, which it - * implements. - * **/ #define TOR_CIRCUITMUX_EWMA_C_ -#include "orconfig.h" - #include #include "or.h" @@ -50,10 +26,9 @@ /*** Some useful constant #defines ***/ -/** Any halflife smaller than this number of seconds is considered to be - * "disabled". */ +/*DOCDOC*/ #define EPSILON 0.00001 -/** The natural logarithm of 0.5. */ +/*DOCDOC*/ #define LOG_ONEHALF -0.69314718055994529 /*** EWMA structures ***/ @@ -140,7 +115,7 @@ TO_EWMA_POL_CIRC_DATA(circuitmux_policy_circ_data_t *); * if the cast is impossible. */ -static inline ewma_policy_data_t * +static INLINE ewma_policy_data_t * TO_EWMA_POL_DATA(circuitmux_policy_data_t *pol) { if (!pol) return NULL; @@ -155,7 +130,7 @@ TO_EWMA_POL_DATA(circuitmux_policy_data_t *pol) * and assert if the cast is impossible. */ -static inline ewma_policy_circ_data_t * +static INLINE ewma_policy_circ_data_t * TO_EWMA_POL_CIRC_DATA(circuitmux_policy_circ_data_t *pol) { if (!pol) return NULL; @@ -172,7 +147,7 @@ static int compare_cell_ewma_counts(const void *p1, const void *p2); static unsigned cell_ewma_tick_from_timeval(const struct timeval *now, double *remainder_out); static circuit_t * cell_ewma_to_circuit(cell_ewma_t *ewma); -static inline double get_scale_factor(unsigned from_tick, unsigned to_tick); +static INLINE double get_scale_factor(unsigned from_tick, unsigned to_tick); static cell_ewma_t * pop_first_cell_ewma(ewma_policy_data_t *pol); static void remove_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma); static void scale_single_cell_ewma(cell_ewma_t *ewma, unsigned cur_tick); @@ -212,9 +187,6 @@ ewma_notify_xmit_cells(circuitmux_t *cmux, static circuit_t * ewma_pick_active_circuit(circuitmux_t *cmux, circuitmux_policy_data_t *pol_data); -static int -ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, - circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2); /*** EWMA global variables ***/ @@ -237,8 +209,7 @@ circuitmux_policy_t ewma_policy = { /*.notify_circ_inactive =*/ ewma_notify_circ_inactive, /*.notify_set_n_cells =*/ NULL, /* EWMA doesn't need this */ /*.notify_xmit_cells =*/ ewma_notify_xmit_cells, - /*.pick_active_circuit =*/ ewma_pick_active_circuit, - /*.cmp_cmux =*/ ewma_cmp_cmux + /*.pick_active_circuit =*/ ewma_pick_active_circuit }; /*** EWMA method implementations using the below EWMA helper functions ***/ @@ -302,8 +273,8 @@ ewma_alloc_circ_data(circuitmux_t *cmux, tor_assert(circ); tor_assert(direction == CELL_DIRECTION_OUT || direction == CELL_DIRECTION_IN); - /* Shut the compiler up without triggering -Wtautological-compare */ - (void)cell_count; + /* Shut the compiler up */ + tor_assert(cell_count == cell_count); cdata = tor_malloc_zero(sizeof(*cdata)); cdata->base_.magic = EWMA_POL_CIRC_DATA_MAGIC; @@ -482,58 +453,6 @@ ewma_pick_active_circuit(circuitmux_t *cmux, return circ; } -/** - * Compare two EWMA cmuxes, and return -1, 0 or 1 to indicate which should - * be more preferred - see circuitmux_compare_muxes() of circuitmux.c. - */ - -static int -ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, - circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2) -{ - ewma_policy_data_t *p1 = NULL, *p2 = NULL; - cell_ewma_t *ce1 = NULL, *ce2 = NULL; - - tor_assert(cmux_1); - tor_assert(pol_data_1); - tor_assert(cmux_2); - tor_assert(pol_data_2); - - p1 = TO_EWMA_POL_DATA(pol_data_1); - p2 = TO_EWMA_POL_DATA(pol_data_2); - - if (p1 != p2) { - /* Get the head cell_ewma_t from each queue */ - if (smartlist_len(p1->active_circuit_pqueue) > 0) { - ce1 = smartlist_get(p1->active_circuit_pqueue, 0); - } - - if (smartlist_len(p2->active_circuit_pqueue) > 0) { - ce2 = smartlist_get(p2->active_circuit_pqueue, 0); - } - - /* Got both of them? */ - if (ce1 != NULL && ce2 != NULL) { - /* Pick whichever one has the better best circuit */ - return compare_cell_ewma_counts(ce1, ce2); - } else { - if (ce1 != NULL ) { - /* We only have a circuit on cmux_1, so prefer it */ - return -1; - } else if (ce2 != NULL) { - /* We only have a circuit on cmux_2, so prefer it */ - return 1; - } else { - /* No circuits at all; no preference */ - return 0; - } - } - } else { - /* We got identical params */ - return 0; - } -} - /** Helper for sorting cell_ewma_t values in their priority queue. */ static int compare_cell_ewma_counts(const void *p1, const void *p2) @@ -669,7 +588,7 @@ cell_ewma_set_scale_factor(const or_options_t *options, /** Return the multiplier necessary to convert the value of a cell sent in * 'from_tick' to one sent in 'to_tick'. */ -static inline double +static INLINE double get_scale_factor(unsigned from_tick, unsigned to_tick) { /* This math can wrap around, but that's okay: unsigned overflow is @@ -731,7 +650,7 @@ add_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma) smartlist_pqueue_add(pol->active_circuit_pqueue, compare_cell_ewma_counts, - offsetof(cell_ewma_t, heap_index), + STRUCT_OFFSET(cell_ewma_t, heap_index), ewma); } @@ -746,7 +665,7 @@ remove_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma) smartlist_pqueue_remove(pol->active_circuit_pqueue, compare_cell_ewma_counts, - offsetof(cell_ewma_t, heap_index), + STRUCT_OFFSET(cell_ewma_t, heap_index), ewma); } @@ -760,6 +679,6 @@ pop_first_cell_ewma(ewma_policy_data_t *pol) return smartlist_pqueue_pop(pol->active_circuit_pqueue, compare_cell_ewma_counts, - offsetof(cell_ewma_t, heap_index)); + STRUCT_OFFSET(cell_ewma_t, heap_index)); } diff --git a/src/tor/src/or/circuitmux_ewma.h b/src/tor/circuitmux_ewma.h similarity index 69% rename from src/tor/src/or/circuitmux_ewma.h rename to src/tor/circuitmux_ewma.h index 8f4e57865..a512745c7 100644 --- a/src/tor/src/or/circuitmux_ewma.h +++ b/src/tor/circuitmux_ewma.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,13 +12,18 @@ #include "or.h" #include "circuitmux.h" +/* Everything but circuitmux_ewma.c should see this extern */ +#ifndef TOR_CIRCUITMUX_EWMA_C_ + extern circuitmux_policy_t ewma_policy; +#endif /* !(TOR_CIRCUITMUX_EWMA_C_) */ + /* Externally visible EWMA functions */ int cell_ewma_enabled(void); unsigned int cell_ewma_get_tick(void); void cell_ewma_set_scale_factor(const or_options_t *options, const networkstatus_t *consensus); -#endif /* !defined(TOR_CIRCUITMUX_EWMA_H) */ +#endif /* TOR_CIRCUITMUX_EWMA_H */ diff --git a/src/tor/src/or/circuitstats.c b/src/tor/circuitstats.c similarity index 79% rename from src/tor/src/or/circuitstats.c rename to src/tor/circuitstats.c index f1df19eb2..eaefc9edd 100644 --- a/src/tor/src/or/circuitstats.c +++ b/src/tor/circuitstats.c @@ -1,28 +1,9 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file circuitstats.c - * - * \brief Maintains and analyzes statistics about circuit built times, so we - * can tell how long we may need to wait for a fast circuit to be constructed. - * - * By keeping these statistics, a client learns when it should time out a slow - * circuit for being too slow, and when it should keep a circuit open in order - * to wait for it to complete. - * - * The information here is kept in a circuit_built_times_t structure, which is - * currently a singleton, but doesn't need to be. It's updated by calls to - * circuit_build_times_count_timeout() from circuituse.c, - * circuit_build_times_count_close() from circuituse.c, and - * circuit_build_times_add_time() from circuitbuild.c, and inspected by other - * calls into this module, mostly from circuitlist.c. Observations are - * persisted to disk via the or_state_t-related calls. - */ - #define CIRCUITSTATS_PRIVATE #include "or.h" @@ -31,13 +12,8 @@ #include "config.h" #include "confparse.h" #include "control.h" -#include "main.h" #include "networkstatus.h" -#include "rendclient.h" -#include "rendservice.h" #include "statefile.h" -#include "circuitlist.h" -#include "circuituse.h" #undef log #include @@ -45,7 +21,6 @@ static void cbt_control_event_buildtimeout_set( const circuit_build_times_t *cbt, buildtimeout_set_event_t type); -static void circuit_build_times_scale_circ_counts(circuit_build_times_t *cbt); #define CBT_BIN_TO_MS(bin) ((bin)*CBT_BIN_WIDTH + (CBT_BIN_WIDTH/2)) @@ -63,7 +38,7 @@ static circuit_build_times_t circ_times; static int unit_tests = 0; #else #define unit_tests 0 -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /** Return a pointer to the data structure describing our current circuit * build time history and computations. */ @@ -98,69 +73,39 @@ get_circuit_build_timeout_ms(void) /** * This function decides if CBT learning should be disabled. It returns - * true if one or more of the following conditions are met: + * true if one or more of the following four conditions are met: * * 1. If the cbtdisabled consensus parameter is set. * 2. If the torrc option LearnCircuitBuildTimeout is false. * 3. If we are a directory authority * 4. If we fail to write circuit build time history to our state file. - * 5. If we are compiled or configured in Tor2web mode - * 6. If we are configured in Single Onion mode */ int -circuit_build_times_disabled(const or_options_t *options) -{ - return circuit_build_times_disabled_(options, 0); -} - -/** As circuit_build_times_disabled, but take options as an argument. */ -int -circuit_build_times_disabled_(const or_options_t *options, - int ignore_consensus) +circuit_build_times_disabled(void) { if (unit_tests) { return 0; } else { - int consensus_disabled = - ignore_consensus ? 0 : networkstatus_get_param(NULL, "cbtdisabled", + int consensus_disabled = networkstatus_get_param(NULL, "cbtdisabled", 0, 0, 1); - int config_disabled = !options->LearnCircuitBuildTimeout; - int dirauth_disabled = options->AuthoritativeDir; + int config_disabled = !get_options()->LearnCircuitBuildTimeout; + int dirauth_disabled = get_options()->AuthoritativeDir; int state_disabled = did_last_state_file_write_fail() ? 1 : 0; - /* LearnCircuitBuildTimeout and Tor2web/Single Onion Services are - * incompatible in two ways: - * - * - LearnCircuitBuildTimeout results in a low CBT, which - * Single Onion use of one-hop intro and rendezvous circuits lowers - * much further, producing *far* too many timeouts. - * - * - The adaptive CBT code does not update its timeout estimate - * using build times for single-hop circuits. - * - * If we fix both of these issues someday, we should test - * these modes with LearnCircuitBuildTimeout on again. */ - int tor2web_disabled = rend_client_allow_non_anonymous_connection(options); - int single_onion_disabled = rend_service_allow_non_anonymous_connection( - options); if (consensus_disabled || config_disabled || dirauth_disabled || - state_disabled || tor2web_disabled || single_onion_disabled) { -#if 0 + state_disabled) { log_debug(LD_CIRC, "CircuitBuildTime learning is disabled. " "Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d", consensus_disabled, config_disabled, dirauth_disabled, state_disabled); -#endif /* 0 */ return 1; } else { -#if 0 log_debug(LD_CIRC, "CircuitBuildTime learning is not disabled. " "Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d", consensus_disabled, config_disabled, dirauth_disabled, state_disabled); -#endif /* 0 */ return 0; } } @@ -352,6 +297,7 @@ circuit_build_times_min_timeout(void) "circuit_build_times_min_timeout() called, cbtmintimeout is %d", num); } + return num; } @@ -428,20 +374,15 @@ circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, * update if we aren't. */ - if (!circuit_build_times_disabled(get_options())) { + if (!circuit_build_times_disabled()) { num = circuit_build_times_recent_circuit_count(ns); if (num > 0) { if (num != cbt->liveness.num_recent_circs) { int8_t *recent_circs; - if (cbt->liveness.num_recent_circs > 0) { - log_notice(LD_CIRC, "The Tor Directory Consensus has changed how " - "many circuits we must track to detect network failures " - "from %d to %d.", cbt->liveness.num_recent_circs, num); - } else { - log_notice(LD_CIRC, "Upon receiving a consensus directory, " - "re-enabling circuit-based network failure detection."); - } + log_notice(LD_CIRC, "The Tor Directory Consensus has changed how many " + "circuits we must track to detect network failures from %d " + "to %d.", cbt->liveness.num_recent_circs, num); tor_assert(cbt->liveness.timeouts_after_firsthop || cbt->liveness.num_recent_circs == 0); @@ -458,7 +399,7 @@ circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, * distress anyway, so memory correctness here is paramount over * doing acrobatics to preserve the array. */ - recent_circs = tor_calloc(num, sizeof(int8_t)); + recent_circs = tor_malloc_zero(sizeof(int8_t)*num); if (cbt->liveness.timeouts_after_firsthop && cbt->liveness.num_recent_circs > 0) { memcpy(recent_circs, cbt->liveness.timeouts_after_firsthop, @@ -509,15 +450,14 @@ static double circuit_build_times_get_initial_timeout(void) { double timeout; - const or_options_t *options = get_options(); /* * Check if we have LearnCircuitBuildTimeout, and if we don't, * always use CircuitBuildTimeout, no questions asked. */ - if (!unit_tests && options->CircuitBuildTimeout) { - timeout = options->CircuitBuildTimeout*1000; - if (!circuit_build_times_disabled(options) && + if (!unit_tests && get_options()->CircuitBuildTimeout) { + timeout = get_options()->CircuitBuildTimeout*1000; + if (get_options()->LearnCircuitBuildTimeout && timeout < circuit_build_times_min_timeout()) { log_warn(LD_CIRC, "Config CircuitBuildTimeout too low. Setting to %ds", circuit_build_times_min_timeout()/1000); @@ -543,11 +483,6 @@ circuit_build_times_reset(circuit_build_times_t *cbt) cbt->total_build_times = 0; cbt->build_times_idx = 0; cbt->have_computed_timeout = 0; - - // Reset timeout and close counts - cbt->num_circ_succeeded = 0; - cbt->num_circ_closed = 0; - cbt->num_circ_timeouts = 0; } /** @@ -564,11 +499,11 @@ circuit_build_times_init(circuit_build_times_t *cbt) * Check if we really are using adaptive timeouts, and don't keep * track of this stuff if not. */ - if (!circuit_build_times_disabled(get_options())) { + if (!circuit_build_times_disabled()) { cbt->liveness.num_recent_circs = circuit_build_times_recent_circuit_count(NULL); cbt->liveness.timeouts_after_firsthop = - tor_calloc(cbt->liveness.num_recent_circs, sizeof(int8_t)); + tor_malloc_zero(sizeof(int8_t)*cbt->liveness.num_recent_circs); } else { cbt->liveness.num_recent_circs = 0; cbt->liveness.timeouts_after_firsthop = NULL; @@ -621,124 +556,7 @@ circuit_build_times_rewind_history(circuit_build_times_t *cbt, int n) "Rewound history by %d places. Current index: %d. " "Total: %d", n, cbt->build_times_idx, cbt->total_build_times); } -#endif /* 0 */ - -/** - * Mark this circuit as timed out, but change its purpose - * so that it continues to build, allowing us to measure - * its full build time. - */ -void -circuit_build_times_mark_circ_as_measurement_only(origin_circuit_t *circ) -{ - control_event_circuit_status(circ, - CIRC_EVENT_FAILED, - END_CIRC_REASON_TIMEOUT); - circuit_change_purpose(TO_CIRCUIT(circ), - CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); - /* Record this event to check for too many timeouts - * in a row. This function does not record a time value yet - * (we do that later); it only counts the fact that we did - * have a timeout. We also want to avoid double-counting - * already "relaxed" circuits, which are counted in - * circuit_expire_building(). */ - if (!circ->relaxed_timeout) { - int first_hop_succeeded = circ->cpath && - circ->cpath->state == CPATH_STATE_OPEN; - - circuit_build_times_count_timeout( - get_circuit_build_times_mutable(), - first_hop_succeeded); - } -} - -/** - * Perform the build time work that needs to be done when a circuit - * completes a hop. - * - * This function decides if we should record a circuit's build time - * in our histogram data and other statistics, and if so, records it. - * It also will mark circuits that have already timed out as - * measurement-only circuits, so they can continue to build but - * not get used. - * - * For this, we want to consider circuits that will eventually make - * it to the third hop. For circuits longer than 3 hops, we want to - * record their build time when they reach the third hop, but let - * them continue (and not count them later). For circuits that are - * exactly 3 hops, this will count them when they are completed. We - * do this so that CBT is always gathering statistics on circuits - * of the same length, regardless of their type. - */ -void -circuit_build_times_handle_completed_hop(origin_circuit_t *circ) -{ - struct timeval end; - long timediff; - - /* If circuit build times are disabled, let circuit_expire_building() - * handle it.. */ - if (circuit_build_times_disabled(get_options())) { - return; - } - - /* Is this a circuit for which the timeout applies in a straight-forward - * way? If so, handle it below. If not, just return (and let - * circuit_expire_building() eventually take care of it). - */ - if (!circuit_timeout_want_to_count_circ(circ)) { - return; - } - - tor_gettimeofday(&end); - timediff = tv_mdiff(&circ->base_.timestamp_began, &end); - - /* Check if we would have timed out already. If so, change the - * purpose here. But don't do any timeout handling here if there - * are no circuits opened yet. Save it for circuit_expire_building() - * (to allow it to handle timeout "relaxing" over there). */ - if (timediff > get_circuit_build_timeout_ms() && - circuit_any_opened_circuits_cached()) { - - /* Circuits are allowed to last longer for measurement. - * Switch their purpose and wait. */ - if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - log_info(LD_CIRC, - "Deciding to timeout circuit "U64_FORMAT"\n", - U64_PRINTF_ARG(circ->global_identifier)); - circuit_build_times_mark_circ_as_measurement_only(circ); - } - } - - /* If the circuit is built to exactly the DEFAULT_ROUTE_LEN, - * add it to our buildtimes. */ - if (circuit_get_cpath_opened_len(circ) == DEFAULT_ROUTE_LEN) { - /* If the circuit build time is much greater than we would have cut - * it off at, we probably had a suspend event along this codepath, - * and we should discard the value. - */ - if (timediff < 0 || - timediff > 2*get_circuit_build_close_time_ms()+1000) { - log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. " - "Assuming clock jump. Purpose %d (%s)", timediff, - circ->base_.purpose, - circuit_purpose_to_string(circ->base_.purpose)); - } else { - /* Only count circuit times if the network is live */ - if (circuit_build_times_network_check_live( - get_circuit_build_times())) { - circuit_build_times_add_time(get_circuit_build_times_mutable(), - (build_time_t)timediff); - circuit_build_times_set_timeout(get_circuit_build_times_mutable()); - } - - if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - circuit_build_times_network_circ_success( - get_circuit_build_times_mutable()); - } - } - } -} +#endif /** * Add a new build time value time to the set of build times. Time @@ -748,18 +566,18 @@ circuit_build_times_handle_completed_hop(origin_circuit_t *circ) * array is full. */ int -circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t btime) +circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time) { - if (btime <= 0 || btime > CBT_BUILD_TIME_MAX) { + if (time <= 0 || time > CBT_BUILD_TIME_MAX) { log_warn(LD_BUG, "Circuit build time is too large (%u)." - "This is probably a bug.", btime); + "This is probably a bug.", time); tor_fragile_assert(); return -1; } - log_debug(LD_CIRC, "Adding circuit build time %u", btime); + log_debug(LD_CIRC, "Adding circuit build time %u", time); - cbt->circuit_build_times[cbt->build_times_idx] = btime; + cbt->circuit_build_times[cbt->build_times_idx] = time; cbt->build_times_idx = (cbt->build_times_idx + 1) % CBT_NCIRCUITS_TO_OBSERVE; if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) cbt->total_build_times++; @@ -806,7 +624,7 @@ circuit_build_times_min(circuit_build_times_t *cbt) } return min_build_time; } -#endif /* 0 */ +#endif /** * Calculate and return a histogram for the set of build times. @@ -826,7 +644,7 @@ circuit_build_times_create_histogram(const circuit_build_times_t *cbt, int i, c; *nbins = 1 + (max_build_time / CBT_BIN_WIDTH); - histogram = tor_calloc(*nbins, sizeof(build_time_t)); + histogram = tor_malloc_zero(*nbins * sizeof(build_time_t)); // calculate histogram for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { @@ -868,7 +686,7 @@ circuit_build_times_get_xm(circuit_build_times_t *cbt) if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) num_modes = 1; - nth_max_bin = tor_calloc(num_modes, sizeof(build_time_t)); + nth_max_bin = (build_time_t*)tor_malloc_zero(num_modes*sizeof(build_time_t)); /* Determine the N most common build times */ for (i = 0; i < nbins; i++) { @@ -1040,17 +858,17 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, int tot_values = 0; uint32_t loaded_cnt = 0, N = 0; config_line_t *line; - int i; + unsigned int i; build_time_t *loaded_times; int err = 0; circuit_build_times_init(cbt); - if (circuit_build_times_disabled(get_options())) { + if (circuit_build_times_disabled()) { return 0; } /* build_time_t 0 means uninitialized */ - loaded_times = tor_calloc(state->TotalBuildTimes, sizeof(build_time_t)); + loaded_times = tor_malloc_zero(sizeof(build_time_t)*state->TotalBuildTimes); for (line = state->BuildtimeHistogram; line; line = line->next) { smartlist_t *args = smartlist_new(); @@ -1069,7 +887,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, uint32_t count, k; build_time_t ms; int ok; - ms = (build_time_t)tor_parse_ulong(ms_str, 10, 0, + ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0, CBT_BUILD_TIME_MAX, &ok, NULL); if (!ok) { log_warn(LD_GENERAL, "Unable to parse circuit build times: " @@ -1079,7 +897,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, smartlist_free(args); break; } - count = (uint32_t)tor_parse_ulong(count_str, 10, 0, + count = (uint32_t)tor_parse_ulong(count_str, 0, 0, UINT32_MAX, &ok, NULL); if (!ok) { log_warn(LD_GENERAL, "Unable to parse circuit build times: " @@ -1090,8 +908,8 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, break; } - if (loaded_cnt+count+ (unsigned)state->CircuitBuildAbandonedCount - > (unsigned) state->TotalBuildTimes) { + if (loaded_cnt+count+state->CircuitBuildAbandonedCount + > state->TotalBuildTimes) { log_warn(LD_CIRC, "Too many build times in state file. " "Stopping short before %d", @@ -1116,7 +934,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt, loaded_times[loaded_cnt++] = CBT_BUILD_ABANDONED; } - if (loaded_cnt != (unsigned)state->TotalBuildTimes) { + if (loaded_cnt != state->TotalBuildTimes) { log_warn(LD_CIRC, "Corrupt state file? Build times count mismatch. " "Read %d times, but file says %d", loaded_cnt, @@ -1251,7 +1069,7 @@ circuit_build_times_update_alpha(circuit_build_times_t *cbt) * random_sample_from_Pareto_distribution * That's right. I'll cite wikipedia all day long. * - * Return value is in milliseconds, clamped to INT32_MAX. + * Return value is in milliseconds. */ STATIC double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, @@ -1262,21 +1080,7 @@ circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, tor_assert(1.0-quantile > 0); tor_assert(cbt->Xm > 0); - /* If either alpha or p are 0, we would divide by zero, yielding an - * infinite (double) result; which would be clamped to INT32_MAX. - * Instead, initialise ret to INT32_MAX, and skip over these - * potentially illegal/trapping divides by zero. - */ - ret = INT32_MAX; - - if (cbt->alpha > 0) { - double p; - p = pow(1.0-quantile,1.0/cbt->alpha); - if (p > 0) { - ret = cbt->Xm/p; - } - } - + ret = cbt->Xm/pow(1.0-quantile,1.0/cbt->alpha); if (ret > INT32_MAX) { ret = INT32_MAX; } @@ -1295,7 +1099,7 @@ circuit_build_times_cdf(circuit_build_times_t *cbt, double x) tor_assert(0 <= ret && ret <= 1.0); return ret; } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif #ifdef TOR_UNIT_TESTS /** @@ -1330,7 +1134,7 @@ circuit_build_times_generate_sample(circuit_build_times_t *cbt, tor_assert(ret > 0); return ret; } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif #ifdef TOR_UNIT_TESTS /** @@ -1353,7 +1157,7 @@ circuit_build_times_initial_alpha(circuit_build_times_t *cbt, (tor_mathlog(cbt->Xm)-tor_mathlog(timeout_ms)); tor_assert(cbt->alpha > 0); } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /** * Returns true if we need circuits to be built @@ -1376,12 +1180,6 @@ circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt) approx_time()-cbt->last_circ_at > circuit_build_times_test_frequency(); } -/** - * How long should we be unreachable before we think we need to check if - * our published IP address has changed. - */ -#define CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP (60*3) - /** * Called to indicate that the network showed some signs of liveness, * i.e. we received a cell. @@ -1397,50 +1195,21 @@ circuit_build_times_network_is_live(circuit_build_times_t *cbt) { time_t now = approx_time(); if (cbt->liveness.nonlive_timeouts > 0) { - time_t time_since_live = now - cbt->liveness.network_last_live; log_notice(LD_CIRC, "Tor now sees network activity. Restoring circuit build " "timeout recording. Network was down for %d seconds " "during %d circuit attempts.", - (int)time_since_live, + (int)(now - cbt->liveness.network_last_live), cbt->liveness.nonlive_timeouts); - if (time_since_live > CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP) - reschedule_descriptor_update_check(); } cbt->liveness.network_last_live = now; cbt->liveness.nonlive_timeouts = 0; - - /* Tell control.c */ - control_event_network_liveness_update(1); } /** - * Non-destructively scale all of our circuit success, timeout, and close - * counts down by a factor of two. Scaling in this way preserves the - * ratios between succeeded vs timed out vs closed circuits, so that - * our statistics don't change when we scale. - * - * This is used only in the rare event that we build more than - * INT32_MAX circuits. Since the num_circ_* variables are - * uint32_t, we won't even be close to overflowing them. - */ -void -circuit_build_times_scale_circ_counts(circuit_build_times_t *cbt) -{ - cbt->num_circ_succeeded /= 2; - cbt->num_circ_timeouts /= 2; - cbt->num_circ_closed /= 2; -} - -/** - * Called to indicate that we "completed" a circuit. Because this circuit + * Called to indicate that we completed a circuit. Because this circuit * succeeded, it doesn't count as a timeout-after-the-first-hop. * - * (For the purposes of the cbt code, we consider a circuit "completed" if - * it has 3 hops, regardless of its final hop count. We do this because - * we're trying to answer the question, "how long should a circuit take to - * reach the 3-hop count".) - * * This is used by circuit_build_times_network_check_changed() to determine * if we had too many recent timeouts and need to reset our learned timeout * to something higher. @@ -1448,14 +1217,6 @@ circuit_build_times_scale_circ_counts(circuit_build_times_t *cbt) void circuit_build_times_network_circ_success(circuit_build_times_t *cbt) { - // Count circuit success - cbt->num_circ_succeeded++; - - // If we're going to wrap int32, scale everything - if (cbt->num_circ_succeeded >= INT32_MAX) { - circuit_build_times_scale_circ_counts(cbt); - } - /* Check for NULLness because we might not be using adaptive timeouts */ if (cbt->liveness.timeouts_after_firsthop && cbt->liveness.num_recent_circs > 0) { @@ -1478,14 +1239,6 @@ static void circuit_build_times_network_timeout(circuit_build_times_t *cbt, int did_onehop) { - // Count circuit timeout - cbt->num_circ_timeouts++; - - // If we're going to wrap int32, scale everything - if (cbt->num_circ_timeouts >= INT32_MAX) { - circuit_build_times_scale_circ_counts(cbt); - } - /* Check for NULLness because we might not be using adaptive timeouts */ if (cbt->liveness.timeouts_after_firsthop && cbt->liveness.num_recent_circs > 0) { @@ -1511,15 +1264,6 @@ circuit_build_times_network_close(circuit_build_times_t *cbt, int did_onehop, time_t start_time) { time_t now = time(NULL); - - // Count circuit close - cbt->num_circ_closed++; - - // If we're going to wrap int32, scale everything - if (cbt->num_circ_closed >= INT32_MAX) { - circuit_build_times_scale_circ_counts(cbt); - } - /* * Check if this is a timeout that was for a circuit that spent its * entire existence during a time where we have had no network activity. @@ -1544,9 +1288,6 @@ circuit_build_times_network_close(circuit_build_times_t *cbt, "Tor has not observed any network activity for the past %d " "seconds. Disabling circuit build timeout recording.", (int)(now - cbt->liveness.network_last_live)); - - /* Tell control.c */ - control_event_network_liveness_update(0); } else { log_info(LD_CIRC, "Got non-live timeout. Current count is: %d", @@ -1616,11 +1357,10 @@ circuit_build_times_network_check_changed(circuit_build_times_t *cbt) } cbt->liveness.after_firsthop_idx = 0; -#define MAX_TIMEOUT ((int32_t) (INT32_MAX/2)) /* Check to see if this has happened before. If so, double the timeout - * to give clients on abysmally bad network connections a shot at access */ + * to give people on abysmally bad network connections a shot at access */ if (cbt->timeout_ms >= circuit_build_times_get_initial_timeout()) { - if (cbt->timeout_ms > MAX_TIMEOUT || cbt->close_ms > MAX_TIMEOUT) { + if (cbt->timeout_ms > INT32_MAX/2 || cbt->close_ms > INT32_MAX/2) { log_warn(LD_CIRC, "Insanely large circuit build timeout value. " "(timeout = %fmsec, close = %fmsec)", cbt->timeout_ms, cbt->close_ms); @@ -1632,7 +1372,6 @@ circuit_build_times_network_check_changed(circuit_build_times_t *cbt) cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); } -#undef MAX_TIMEOUT cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET); @@ -1694,7 +1433,7 @@ circuit_build_times_count_close(circuit_build_times_t *cbt, int did_onehop, time_t start_time) { - if (circuit_build_times_disabled(get_options())) { + if (circuit_build_times_disabled()) { cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); return 0; @@ -1725,7 +1464,7 @@ void circuit_build_times_count_timeout(circuit_build_times_t *cbt, int did_onehop) { - if (circuit_build_times_disabled(get_options())) { + if (circuit_build_times_disabled()) { cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); return; @@ -1799,7 +1538,7 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt) /* * Just return if we aren't using adaptive timeouts */ - if (circuit_build_times_disabled(get_options())) + if (circuit_build_times_disabled()) return; if (!circuit_build_times_set_timeout_worker(cbt)) @@ -1860,7 +1599,7 @@ circuitbuild_running_unit_tests(void) { unit_tests = 1; } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif void circuit_build_times_update_last_circ(circuit_build_times_t *cbt) @@ -1874,8 +1613,6 @@ cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt, { char *args = NULL; double qnt; - double timeout_rate = 0.0; - double close_rate = 0.0; switch (type) { case BUILDTIMEOUT_SET_EVENT_RESET: @@ -1890,29 +1627,15 @@ cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt, break; } - /* The timeout rate is the ratio of the timeout count over - * the total number of circuits attempted. The total number of - * circuits is (timeouts+succeeded+closed), since a circuit can - * either timeout, close, or succeed. We cast the denominator - * to promote it to double before the addition, to avoid int32 - * overflow. */ - const double total_circuits = - ((double)cbt->num_circ_timeouts) + cbt->num_circ_succeeded - + cbt->num_circ_closed; - if (total_circuits >= 1.0) { - timeout_rate = cbt->num_circ_timeouts / total_circuits; - close_rate = cbt->num_circ_closed / total_circuits; - } - tor_asprintf(&args, "TOTAL_TIMES=%lu " "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f " "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f", (unsigned long)cbt->total_build_times, (unsigned long)cbt->timeout_ms, (unsigned long)cbt->Xm, cbt->alpha, qnt, - timeout_rate, + circuit_build_times_timeout_rate(cbt), (unsigned long)cbt->close_ms, - close_rate); + circuit_build_times_close_rate(cbt)); control_event_buildtimeout_set(type, args); diff --git a/src/tor/src/or/circuitstats.h b/src/tor/circuitstats.h similarity index 81% rename from src/tor/src/or/circuitstats.h rename to src/tor/circuitstats.h index 86116cb7f..3343310b8 100644 --- a/src/tor/src/or/circuitstats.h +++ b/src/tor/circuitstats.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,10 +17,7 @@ circuit_build_times_t *get_circuit_build_times_mutable(void); double get_circuit_build_close_time_ms(void); double get_circuit_build_timeout_ms(void); -int circuit_build_times_disabled(const or_options_t *options); -int circuit_build_times_disabled_(const or_options_t *options, - int ignore_consensus); - +int circuit_build_times_disabled(void); int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt); void circuit_build_times_update_state(const circuit_build_times_t *cbt, or_state_t *state); @@ -34,7 +31,6 @@ void circuit_build_times_set_timeout(circuit_build_times_t *cbt); int circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time); int circuit_build_times_needs_circuits(const circuit_build_times_t *cbt); -void circuit_build_times_handle_completed_hop(origin_circuit_t *circ); int circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt); void circuit_build_times_init(circuit_build_times_t *cbt); @@ -45,7 +41,6 @@ double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt); double circuit_build_times_close_rate(const circuit_build_times_t *cbt); void circuit_build_times_update_last_circ(circuit_build_times_t *cbt); -void circuit_build_times_mark_circ_as_measurement_only(origin_circuit_t *circ); #ifdef CIRCUITSTATS_PRIVATE STATIC double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, @@ -56,7 +51,7 @@ STATIC void circuit_build_times_reset(circuit_build_times_t *cbt); /* Network liveness functions */ STATIC int circuit_build_times_network_check_changed( circuit_build_times_t *cbt); -#endif /* defined(CIRCUITSTATS_PRIVATE) */ +#endif #ifdef TOR_UNIT_TESTS build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt, @@ -65,7 +60,7 @@ double circuit_build_times_cdf(circuit_build_times_t *cbt, double x); void circuit_build_times_initial_alpha(circuit_build_times_t *cbt, double quantile, double time_ms); void circuitbuild_running_unit_tests(void); -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /* Network liveness functions */ void circuit_build_times_network_is_live(circuit_build_times_t *cbt); @@ -96,18 +91,8 @@ struct circuit_build_times_s { double timeout_ms; /** How long we wait before actually closing the circuit. */ double close_ms; - /** Total succeeded counts. Old measurements may be scaled downward if - * we've seen a lot of circuits. */ - uint32_t num_circ_succeeded; - /** Total timeout counts. Old measurements may be scaled downward if - * we've seen a lot of circuits. */ - uint32_t num_circ_timeouts; - /** Total closed counts. Old measurements may be scaled downward if - * we've seen a lot of circuits.*/ - uint32_t num_circ_closed; - }; -#endif /* defined(CIRCUITSTATS_PRIVATE) */ +#endif -#endif /* !defined(TOR_CIRCUITSTATS_H) */ +#endif diff --git a/src/tor/src/or/circuituse.c b/src/tor/circuituse.c similarity index 65% rename from src/tor/src/or/circuituse.c rename to src/tor/circuituse.c index f04448ffc..8b82de0f9 100644 --- a/src/tor/src/or/circuituse.c +++ b/src/tor/circuituse.c @@ -1,35 +1,16 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file circuituse.c - * \brief Launch the right sort of circuits and attach the right streams to - * them. - * - * As distinct from circuitlist.c, which manages lookups to find circuits, and - * circuitbuild.c, which handles the logistics of circuit construction, this - * module keeps track of which streams can be attached to which circuits (in - * circuit_get_best()), and attaches streams to circuits (with - * circuit_try_attaching_streams(), connection_ap_handshake_attach_circuit(), - * and connection_ap_handshake_attach_chosen_circuit() ). - * - * This module also makes sure that we are building circuits for all of the - * predicted ports, using circuit_remove_handled_ports(), - * circuit_stream_is_being_handled(), and circuit_build_needed_cirs(). It - * handles launching circuits for specific targets using - * circuit_launch_by_extend_info(). - * - * This is also where we handle expiring circuits that have been around for - * too long without actually completing, along with the circuit_build_timeout - * logic in circuitstats.c. + * \brief Launch the right sort of circuits and attach streams to them. **/ #include "or.h" #include "addressmap.h" -#include "bridges.h" #include "channel.h" #include "circpathbias.h" #include "circuitbuild.h" @@ -41,10 +22,6 @@ #include "connection_edge.h" #include "control.h" #include "entrynodes.h" -#include "hs_common.h" -#include "hs_client.h" -#include "hs_circuit.h" -#include "hs_ident.h" #include "nodelist.h" #include "networkstatus.h" #include "policies.h" @@ -58,36 +35,6 @@ static void circuit_expire_old_circuits_clientside(void); static void circuit_increment_failure_count(void); -/** Check whether the hidden service destination of the stream at - * edge_conn is the same as the destination of the circuit at - * origin_circ. */ -static int -circuit_matches_with_rend_stream(const edge_connection_t *edge_conn, - const origin_circuit_t *origin_circ) -{ - /* Check if this is a v2 rendezvous circ/stream */ - if ((edge_conn->rend_data && !origin_circ->rend_data) || - (!edge_conn->rend_data && origin_circ->rend_data) || - (edge_conn->rend_data && origin_circ->rend_data && - rend_cmp_service_ids(rend_data_get_address(edge_conn->rend_data), - rend_data_get_address(origin_circ->rend_data)))) { - /* this circ is not for this conn */ - return 0; - } - - /* Check if this is a v3 rendezvous circ/stream */ - if ((edge_conn->hs_ident && !origin_circ->hs_ident) || - (!edge_conn->hs_ident && origin_circ->hs_ident) || - (edge_conn->hs_ident && origin_circ->hs_ident && - !ed25519_pubkey_eq(&edge_conn->hs_ident->identity_pk, - &origin_circ->hs_ident->identity_pk))) { - /* this circ is not for this conn */ - return 0; - } - - return 1; -} - /** Return 1 if circ could be returned by circuit_get_best(). * Else return 0. */ @@ -145,7 +92,7 @@ circuit_is_acceptable(const origin_circuit_t *origin_circ, /* decide if this circ is suitable for this conn */ /* for rend circs, circ->cpath->prev is not the last router in the - * circuit, it's the magical extra service hop. so just check the nickname + * circuit, it's the magical extra bob hop. so just check the nickname * of the one we meant to finish at. */ build_state = origin_circ->build_state; @@ -202,9 +149,14 @@ circuit_is_acceptable(const origin_circuit_t *origin_circ, /* can't exit from this router */ return 0; } - } else { /* not general: this might be a rend circuit */ + } else { /* not general */ const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - if (!circuit_matches_with_rend_stream(edge_conn, origin_circ)) { + if ((edge_conn->rend_data && !origin_circ->rend_data) || + (!edge_conn->rend_data && origin_circ->rend_data) || + (edge_conn->rend_data && origin_circ->rend_data && + rend_cmp_service_ids(edge_conn->rend_data->onion_address, + origin_circ->rend_data->onion_address))) { + /* this circ is not for this conn */ return 0; } } @@ -248,10 +200,10 @@ circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob, return 1; } else { if (a->timestamp_dirty || - timercmp(&a->timestamp_began, &b->timestamp_began, OP_GT)) + timercmp(&a->timestamp_began, &b->timestamp_began, >)) return 1; if (ob->build_state->is_internal) - /* XXXX++ what the heck is this internal thing doing here. I + /* XXX023 what the heck is this internal thing doing here. I * think we can get rid of it. circuit_is_acceptable() already * makes sure that is_internal is exactly what we need it to * be. -RD */ @@ -270,7 +222,7 @@ circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob, break; } - /* XXXX Maybe this check should get a higher priority to avoid + /* XXXX023 Maybe this check should get a higher priority to avoid * using up circuits too rapidly. */ a_bits = connection_edge_update_circuit_isolation(conn, @@ -316,6 +268,7 @@ circuit_get_best(const entry_connection_t *conn, int must_be_open, uint8_t purpose, int need_uptime, int need_internal) { + circuit_t *circ; origin_circuit_t *best=NULL; struct timeval now; int intro_going_on_but_too_old = 0; @@ -328,7 +281,7 @@ circuit_get_best(const entry_connection_t *conn, tor_gettimeofday(&now); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { origin_circuit_t *origin_circ; if (!CIRCUIT_IS_ORIGIN(circ)) continue; @@ -337,14 +290,13 @@ circuit_get_best(const entry_connection_t *conn, /* Log an info message if we're going to launch a new intro circ in * parallel */ if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && - !must_be_open && origin_circ->hs_circ_has_timed_out && - !circ->marked_for_close) { + !must_be_open && origin_circ->hs_circ_has_timed_out) { intro_going_on_but_too_old = 1; continue; } if (!circuit_is_acceptable(origin_circ,conn,must_be_open,purpose, - need_uptime,need_internal, (time_t)now.tv_sec)) + need_uptime,need_internal,now.tv_sec)) continue; /* now this is an acceptable circ to hand back. but that doesn't @@ -353,7 +305,6 @@ circuit_get_best(const entry_connection_t *conn, if (!best || circuit_is_better(origin_circ,best,conn)) best = origin_circ; } - SMARTLIST_FOREACH_END(circ); if (!best && intro_going_on_but_too_old) log_info(LD_REND|LD_CIRC, "There is an intro circuit being created " @@ -367,9 +318,11 @@ circuit_get_best(const entry_connection_t *conn, static int count_pending_general_client_circuits(void) { + const circuit_t *circ; + int count = 0; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (circ->marked_for_close || circ->state == CIRCUIT_STATE_OPEN || circ->purpose != CIRCUIT_PURPOSE_C_GENERAL || @@ -378,7 +331,6 @@ count_pending_general_client_circuits(void) ++count; } - SMARTLIST_FOREACH_END(circ); return count; } @@ -410,23 +362,15 @@ circuit_conforms_to_options(const origin_circuit_t *circ, return 1; } -#endif /* 0 */ +#endif -/** - * Close all circuits that start at us, aren't open, and were born +/** Close all circuits that start at us, aren't open, and were born * at least CircuitBuildTimeout seconds ago. - * - * TODO: This function is now partially redundant to - * circuit_build_times_handle_completed_hop(), but that function only - * covers circuits up to and including 3 hops that are still actually - * completing hops. However, circuit_expire_building() also handles longer - * circuits, as well as circuits that are completely stalled. - * In the future (after prop247/other path selection revamping), we probably - * want to eliminate this rats nest in favor of a simpler approach. */ void circuit_expire_building(void) { + circuit_t *victim, *next_circ; /* circ_times.timeout_ms and circ_times.close_ms are from * circuit_build_times_get_initial_timeout() if we haven't computed * custom timeouts yet */ @@ -444,7 +388,21 @@ circuit_expire_building(void) * we want to be more lenient with timeouts, in case the * user has relocated and/or changed network connections. * See bug #3443. */ - any_opened_circs = circuit_any_opened_circuits(); + TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) { + if (!CIRCUIT_IS_ORIGIN(next_circ) || /* didn't originate here */ + next_circ->marked_for_close) { /* don't mess with marked circs */ + continue; + } + + if (TO_ORIGIN_CIRCUIT(next_circ)->has_opened && + next_circ->state == CIRCUIT_STATE_OPEN && + TO_ORIGIN_CIRCUIT(next_circ)->build_state && + TO_ORIGIN_CIRCUIT(next_circ)->build_state->desired_path_len + == DEFAULT_ROUTE_LEN) { + any_opened_circs = 1; + break; + } + } #define SET_CUTOFF(target, msec) do { \ long ms = tor_lround(msec); \ @@ -488,10 +446,6 @@ circuit_expire_building(void) SET_CUTOFF(general_cutoff, get_circuit_build_timeout_ms()); SET_CUTOFF(begindir_cutoff, get_circuit_build_timeout_ms()); - // TODO: We should probably use route_len_for_purpose() here instead, - // except that does not count the extra round trip for things like server - // intros and rends. - /* > 3hop circs seem to have a 1.0 second delay on their cannibalized * 4th hop. */ SET_CUTOFF(fourhop_cutoff, get_circuit_build_timeout_ms() * (10/6.0) + 1000); @@ -519,8 +473,9 @@ circuit_expire_building(void) MAX(get_circuit_build_close_time_ms()*2 + 1000, options->SocksTimeout * 1000)); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *,victim) { + TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) { struct timeval cutoff; + victim = next_circ; if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */ victim->marked_for_close) /* don't mess with marked circs */ continue; @@ -542,7 +497,8 @@ circuit_expire_building(void) cutoff = begindir_cutoff; else if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) cutoff = close_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) + else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING || + victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) cutoff = c_intro_cutoff; else if (victim->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) cutoff = s_intro_cutoff; @@ -561,7 +517,7 @@ circuit_expire_building(void) if (TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) cutoff = hs_extremely_old_cutoff; - if (timercmp(&victim->timestamp_began, &cutoff, OP_GT)) + if (timercmp(&victim->timestamp_began, &cutoff, >)) continue; /* it's still young, leave it alone */ /* We need to double-check the opened state here because @@ -571,21 +527,20 @@ circuit_expire_building(void) * aren't either. */ if (!any_opened_circs && victim->state != CIRCUIT_STATE_OPEN) { /* It's still young enough that we wouldn't close it, right? */ - if (timercmp(&victim->timestamp_began, &close_cutoff, OP_GT)) { + if (timercmp(&victim->timestamp_began, &close_cutoff, >)) { if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) { int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_OPEN; log_info(LD_CIRC, "No circuits are opened. Relaxing timeout for circuit %d " - "(a %s %d-hop circuit in state %s with channel state %s).", + "(a %s %d-hop circuit in state %s with channel state %s). " + "%d guards are live.", TO_ORIGIN_CIRCUIT(victim)->global_identifier, circuit_purpose_to_string(victim->purpose), - TO_ORIGIN_CIRCUIT(victim)->build_state ? - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len : - -1, + TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len, circuit_state_to_string(victim->state), - victim->n_chan ? - channel_state_to_string(victim->n_chan->state) : "none"); + channel_state_to_string(victim->n_chan->state), + num_live_entry_guards(0)); /* We count the timeout here for CBT, because technically this * was a timeout, and the timeout value needs to reset if we @@ -603,16 +558,14 @@ circuit_expire_building(void) "No circuits are opened. Relaxed timeout for circuit %d " "(a %s %d-hop circuit in state %s with channel state %s) to " "%ldms. However, it appears the circuit has timed out " - "anyway.", + "anyway. %d guards are live.", TO_ORIGIN_CIRCUIT(victim)->global_identifier, circuit_purpose_to_string(victim->purpose), - TO_ORIGIN_CIRCUIT(victim)->build_state ? - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len : - -1, + TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len, circuit_state_to_string(victim->state), - victim->n_chan ? - channel_state_to_string(victim->n_chan->state) : "none", - (long)build_close_ms); + channel_state_to_string(victim->n_chan->state), + (long)build_close_ms, + num_live_entry_guards(0)); } } @@ -634,7 +587,7 @@ circuit_expire_building(void) victim->n_circ_id, (int)(now - victim->timestamp_dirty)); } -#endif /* 0 */ +#endif /* if circ is !open, or if it's open but purpose is a non-finished * intro or rend, then mark it for close */ @@ -651,7 +604,6 @@ circuit_expire_building(void) * because that's set when they switch purposes */ if (TO_ORIGIN_CIRCUIT(victim)->rend_data || - TO_ORIGIN_CIRCUIT(victim)->hs_ident || victim->timestamp_dirty > cutoff.tv_sec) continue; break; @@ -661,13 +613,12 @@ circuit_expire_building(void) TO_ORIGIN_CIRCUIT(victim)->path_state = PATH_STATE_USE_FAILED; break; case CIRCUIT_PURPOSE_C_INTRODUCING: - /* That purpose means that the intro point circuit has been opened - * succesfully but the INTRODUCE1 cell hasn't been sent yet because - * the client is waiting for the rendezvous point circuit to open. - * Keep this circuit open while waiting for the rendezvous circuit. - * We let the circuit idle timeout take care of cleaning this - * circuit if it never used. */ - continue; + /* We keep old introducing circuits around for + * a while in parallel, and they can end up "opened". + * We decide below if we're going to mark them timed + * out and eventually close them. + */ + break; case CIRCUIT_PURPOSE_C_ESTABLISH_REND: case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: @@ -695,17 +646,23 @@ circuit_expire_building(void) if (circuit_timeout_want_to_count_circ(TO_ORIGIN_CIRCUIT(victim)) && circuit_build_times_enough_to_compute(get_circuit_build_times())) { - - log_info(LD_CIRC, - "Deciding to count the timeout for circuit "U64_FORMAT"\n", - U64_PRINTF_ARG( - TO_ORIGIN_CIRCUIT(victim)->global_identifier)); - /* Circuits are allowed to last longer for measurement. * Switch their purpose and wait. */ if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - circuit_build_times_mark_circ_as_measurement_only(TO_ORIGIN_CIRCUIT( - victim)); + control_event_circuit_status(TO_ORIGIN_CIRCUIT(victim), + CIRC_EVENT_FAILED, + END_CIRC_REASON_TIMEOUT); + circuit_change_purpose(victim, CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); + /* Record this failure to check for too many timeouts + * in a row. This function does not record a time value yet + * (we do that later); it only counts the fact that we did + * have a timeout. We also want to avoid double-counting + * already "relaxed" circuits, which are counted above. */ + if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) { + circuit_build_times_count_timeout( + get_circuit_build_times_mutable(), + first_hop_succeeded); + } continue; } @@ -714,7 +671,7 @@ circuit_expire_building(void) * it off at, we probably had a suspend event along this codepath, * and we should discard the value. */ - if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, OP_LT)) { + if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, <)) { log_notice(LD_CIRC, "Extremely large value for circuit build timeout: %lds. " "Assuming clock jump. Purpose %d (%s)", @@ -722,23 +679,26 @@ circuit_expire_building(void) victim->purpose, circuit_purpose_to_string(victim->purpose)); } else if (circuit_build_times_count_close( - get_circuit_build_times_mutable(), - first_hop_succeeded, - (time_t)victim->timestamp_created.tv_sec)) { + get_circuit_build_times_mutable(), + first_hop_succeeded, + victim->timestamp_created.tv_sec)) { circuit_build_times_set_timeout(get_circuit_build_times_mutable()); } } } - /* If this is a hidden service client circuit which is far enough along in - * connecting to its destination, and we haven't already flagged it as - * 'timed out', flag it so we'll launch another intro or rend circ, but - * don't mark it for close yet. + /* If this is a hidden service client circuit which is far enough + * along in connecting to its destination, and we haven't already + * flagged it as 'timed out', and the user has not told us to + * close such circs immediately on timeout, flag it as 'timed out' + * so we'll launch another intro or rend circ, but don't mark it + * for close yet. * * (Circs flagged as 'timed out' are given a much longer timeout * period above, so we won't close them in the next call to * circuit_expire_building.) */ - if (!(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out)) { + if (!(options->CloseHSClientCircuitsImmediatelyOnTimeout) && + !(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out)) { switch (victim->purpose) { case CIRCUIT_PURPOSE_C_REND_READY: /* We only want to spare a rend circ if it has been specified in @@ -747,11 +707,12 @@ circuit_expire_building(void) * and we have tried to send an INTRODUCE1 cell specifying it. * Thus, if the pending_final_cpath field *is* NULL, then we * want to not spare it. */ - if (TO_ORIGIN_CIRCUIT(victim)->build_state && - TO_ORIGIN_CIRCUIT(victim)->build_state->pending_final_cpath == + if (TO_ORIGIN_CIRCUIT(victim)->build_state->pending_final_cpath == NULL) break; /* fallthrough! */ + case CIRCUIT_PURPOSE_C_INTRODUCING: + /* connection_ap_handshake_attach_circuit() will relaunch for us */ case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: /* If we have reached this line, we want to spare the circ for now. */ @@ -770,7 +731,8 @@ circuit_expire_building(void) /* If this is a service-side rendezvous circuit which is far * enough along in connecting to its destination, consider sparing * it. */ - if (!(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) && + if (!(options->CloseHSServiceRendCircuitsImmediatelyOnTimeout) && + !(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) && victim->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { log_info(LD_CIRC,"Marking circ %u (state %d:%s, purpose %d) " "as timed-out HS circ; relaunching rendezvous attempt.", @@ -778,7 +740,7 @@ circuit_expire_building(void) victim->state, circuit_state_to_string(victim->state), victim->purpose); TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out = 1; - hs_circ_retry_service_rendezvous_point(TO_ORIGIN_CIRCUIT(victim)); + rend_service_relaunch_rendezvous(TO_ORIGIN_CIRCUIT(victim)); continue; } @@ -791,9 +753,7 @@ circuit_expire_building(void) TO_ORIGIN_CIRCUIT(victim)->has_opened, victim->state, circuit_state_to_string(victim->state), victim->purpose, - TO_ORIGIN_CIRCUIT(victim)->build_state ? - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len : - -1); + TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len); else log_info(LD_CIRC, "Abandoning circ %u %u (state %d,%d:%s, purpose %d, len %d)", @@ -802,9 +762,7 @@ circuit_expire_building(void) TO_ORIGIN_CIRCUIT(victim)->has_opened, victim->state, circuit_state_to_string(victim->state), victim->purpose, - TO_ORIGIN_CIRCUIT(victim)->build_state ? - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len : - -1); + TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len); circuit_log_path(LOG_INFO,LD_CIRC,TO_ORIGIN_CIRCUIT(victim)); if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) @@ -813,173 +771,7 @@ circuit_expire_building(void) circuit_mark_for_close(victim, END_CIRC_REASON_TIMEOUT); pathbias_count_timeout(TO_ORIGIN_CIRCUIT(victim)); - } SMARTLIST_FOREACH_END(victim); -} - -/** - * Mark for close all circuits that start here, that were built through a - * guard we weren't sure if we wanted to use, and that have been waiting - * around for way too long. - */ -void -circuit_expire_waiting_for_better_guard(void) -{ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_origin_circuit_list(), - origin_circuit_t *, circ) { - if (TO_CIRCUIT(circ)->marked_for_close) - continue; - if (circ->guard_state == NULL) - continue; - if (entry_guard_state_should_expire(circ->guard_state)) - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NONE); - } SMARTLIST_FOREACH_END(circ); -} - -/** For debugging #8387: track when we last called - * circuit_expire_old_circuits_clientside. */ -static time_t last_expired_clientside_circuits = 0; - -/** - * As a diagnostic for bug 8387, log information about how many one-hop - * circuits we have around that have been there for at least age - * seconds. Log a few of them. - * Ignores Single Onion Service intro and Tor2web redezvous circuits, they are - * expected to be long-term one-hop circuits. - */ -void -circuit_log_ancient_one_hop_circuits(int age) -{ -#define MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG 10 - time_t now = time(NULL); - time_t cutoff = now - age; - int n_found = 0; - smartlist_t *log_these = smartlist_new(); - const or_options_t *options = get_options(); - - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - const origin_circuit_t *ocirc; - if (! CIRCUIT_IS_ORIGIN(circ)) - continue; - if (circ->timestamp_created.tv_sec >= cutoff) - continue; - /* Single Onion Services deliberately make long term one-hop intro - * connections. We only ignore active intro point connections, if we take - * a long time establishing, that's worth logging. */ - if (rend_service_allow_non_anonymous_connection(options) && - circ->purpose == CIRCUIT_PURPOSE_S_INTRO) - continue; - /* Tor2web deliberately makes long term one-hop rend connections, - * particularly when Tor2webRendezvousPoints is used. We only ignore - * active rend point connections, if we take a long time to rendezvous, - * that's worth logging. */ - if (rend_client_allow_non_anonymous_connection(options) && - circ->purpose == CIRCUIT_PURPOSE_C_REND_JOINED) - continue; - ocirc = CONST_TO_ORIGIN_CIRCUIT(circ); - - if (ocirc->build_state && ocirc->build_state->onehop_tunnel) { - ++n_found; - - if (smartlist_len(log_these) < MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG) - smartlist_add(log_these, (origin_circuit_t*) ocirc); - } } - SMARTLIST_FOREACH_END(circ); - - if (n_found == 0) - goto done; - - log_notice(LD_HEARTBEAT, - "Diagnostic for issue 8387: Found %d one-hop circuits more " - "than %d seconds old! Logging %d...", - n_found, age, smartlist_len(log_these)); - - SMARTLIST_FOREACH_BEGIN(log_these, const origin_circuit_t *, ocirc) { - char created[ISO_TIME_LEN+1]; - int stream_num; - const edge_connection_t *conn; - char *dirty = NULL; - const circuit_t *circ = TO_CIRCUIT(ocirc); - - format_local_iso_time(created, - (time_t)circ->timestamp_created.tv_sec); - - if (circ->timestamp_dirty) { - char dirty_since[ISO_TIME_LEN+1]; - format_local_iso_time(dirty_since, circ->timestamp_dirty); - - tor_asprintf(&dirty, "Dirty since %s (%ld seconds vs %ld-second cutoff)", - dirty_since, (long)(now - circ->timestamp_dirty), - (long) options->MaxCircuitDirtiness); - } else { - dirty = tor_strdup("Not marked dirty"); - } - - log_notice(LD_HEARTBEAT, " #%d created at %s. %s, %s. %s for close. " - "Package window: %d. " - "%s for new conns. %s.", - ocirc_sl_idx, - created, - circuit_state_to_string(circ->state), - circuit_purpose_to_string(circ->purpose), - circ->marked_for_close ? "Marked" : "Not marked", - circ->package_window, - ocirc->unusable_for_new_conns ? "Not usable" : "usable", - dirty); - tor_free(dirty); - - stream_num = 0; - for (conn = ocirc->p_streams; conn; conn = conn->next_stream) { - const connection_t *c = TO_CONN(conn); - char stream_created[ISO_TIME_LEN+1]; - if (++stream_num >= 5) - break; - - format_local_iso_time(stream_created, c->timestamp_created); - - log_notice(LD_HEARTBEAT, " Stream#%d created at %s. " - "%s conn in state %s. " - "It is %slinked and %sreading from a linked connection %p. " - "Package window %d. " - "%s for close (%s:%d). Hold-open is %sset. " - "Has %ssent RELAY_END. %s on circuit.", - stream_num, - stream_created, - conn_type_to_string(c->type), - conn_state_to_string(c->type, c->state), - c->linked ? "" : "not ", - c->reading_from_linked_conn ? "": "not", - c->linked_conn, - conn->package_window, - c->marked_for_close ? "Marked" : "Not marked", - c->marked_for_close_file ? c->marked_for_close_file : "--", - c->marked_for_close, - c->hold_open_until_flushed ? "" : "not ", - conn->edge_has_sent_end ? "" : "not ", - conn->edge_blocked_on_circ ? "Blocked" : "Not blocked"); - if (! c->linked_conn) - continue; - - c = c->linked_conn; - - log_notice(LD_HEARTBEAT, " Linked to %s connection in state %s " - "(Purpose %d). %s for close (%s:%d). Hold-open is %sset. ", - conn_type_to_string(c->type), - conn_state_to_string(c->type, c->state), - c->purpose, - c->marked_for_close ? "Marked" : "Not marked", - c->marked_for_close_file ? c->marked_for_close_file : "--", - c->marked_for_close, - c->hold_open_until_flushed ? "" : "not "); - } - } SMARTLIST_FOREACH_END(ocirc); - - log_notice(LD_HEARTBEAT, "It has been %ld seconds since I last called " - "circuit_expire_old_circuits_clientside().", - (long)(now - last_expired_clientside_circuits)); - - done: - smartlist_free(log_these); } /** Remove any elements in needed_ports that are handled by an @@ -996,7 +788,7 @@ circuit_remove_handled_ports(smartlist_t *needed_ports) tor_assert(*port); if (circuit_stream_is_being_handled(NULL, *port, MIN_CIRCUITS_HANDLING_STREAM)) { - log_debug(LD_CIRC,"Port %d is already being handled; removing.", *port); +// log_debug(LD_CIRC,"Port %d is already being handled; removing.", port); smartlist_del(needed_ports, i--); tor_free(port); } else { @@ -1014,6 +806,7 @@ int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port, int min) { + circuit_t *circ; const node_t *exitnode; int num=0; time_t now = time(NULL); @@ -1021,7 +814,7 @@ circuit_stream_is_being_handled(entry_connection_t *conn, get_options()->LongLivedPorts, conn ? conn->socks_request->port : port); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (CIRCUIT_IS_ORIGIN(circ) && !circ->marked_for_close && circ->purpose == CIRCUIT_PURPOSE_C_GENERAL && @@ -1033,10 +826,6 @@ circuit_stream_is_being_handled(entry_connection_t *conn, continue; if (origin_circ->unusable_for_new_conns) continue; - if (origin_circ->isolation_values_set && - (conn == NULL || - !connection_edge_compatible_with_circuit(conn, origin_circ))) - continue; exitnode = build_state_get_exit_node(build_state); if (exitnode && (!need_uptime || build_state->need_uptime)) { @@ -1055,181 +844,64 @@ circuit_stream_is_being_handled(entry_connection_t *conn, } } } - SMARTLIST_FOREACH_END(circ); return 0; } /** Don't keep more than this many unused open circuits around. */ #define MAX_UNUSED_OPEN_CIRCUITS 14 -/* Return true if a circuit is available for use, meaning that it is open, - * clean, usable for new multi-hop connections, and a general purpose origin - * circuit. - * Accept any kind of circuit, return false if the above conditions are not - * met. */ -STATIC int -circuit_is_available_for_use(const circuit_t *circ) -{ - const origin_circuit_t *origin_circ; - cpath_build_state_t *build_state; - - if (!CIRCUIT_IS_ORIGIN(circ)) - return 0; /* We first filter out only origin circuits before doing the - following checks. */ - if (circ->marked_for_close) - return 0; /* Don't mess with marked circs */ - if (circ->timestamp_dirty) - return 0; /* Only count clean circs */ - if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL) - return 0; /* We only pay attention to general purpose circuits. - General purpose circuits are always origin circuits. */ - - origin_circ = CONST_TO_ORIGIN_CIRCUIT(circ); - if (origin_circ->unusable_for_new_conns) - return 0; - - build_state = origin_circ->build_state; - if (build_state->onehop_tunnel) - return 0; - - return 1; -} - -/* Return true if we need any more exit circuits. - * needs_uptime and needs_capacity are set only if we need more exit circuits. - * Check if we know of a port that's been requested recently and no circuit - * is currently available that can handle it. */ -STATIC int -needs_exit_circuits(time_t now, int *needs_uptime, int *needs_capacity) -{ - return (!circuit_all_predicted_ports_handled(now, needs_uptime, - needs_capacity) && - router_have_consensus_path() == CONSENSUS_PATH_EXIT); -} - -/* Hidden services need at least this many internal circuits */ -#define SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS 3 - -/* Return true if we need any more hidden service server circuits. - * HS servers only need an internal circuit. */ -STATIC int -needs_hs_server_circuits(time_t now, int num_uptime_internal) -{ - if (!rend_num_services() && !hs_service_get_num_services()) { - /* No services, we don't need anything. */ - goto no_need; - } - - if (num_uptime_internal >= SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS) { - /* We have sufficient amount of internal circuit. */ - goto no_need; - } - - if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN) { - /* Consensus hasn't been checked or might be invalid so requesting - * internal circuits is not wise. */ - goto no_need; - } - - /* At this point, we need a certain amount of circuits and we will most - * likely use them for rendezvous so we note down the use of internal - * circuit for our prediction for circuit needing uptime and capacity. */ - rep_hist_note_used_internal(now, 1, 1); - - return 1; - no_need: - return 0; -} - -/* We need at least this many internal circuits for hidden service clients */ -#define SUFFICIENT_INTERNAL_HS_CLIENTS 3 - -/* We need at least this much uptime for internal circuits for hidden service - * clients */ -#define SUFFICIENT_UPTIME_INTERNAL_HS_CLIENTS 2 - -/* Return true if we need any more hidden service client circuits. - * HS clients only need an internal circuit. */ -STATIC int -needs_hs_client_circuits(time_t now, int *needs_uptime, int *needs_capacity, - int num_internal, int num_uptime_internal) -{ - int used_internal_recently = rep_hist_get_predicted_internal(now, - needs_uptime, - needs_capacity); - int requires_uptime = num_uptime_internal < - SUFFICIENT_UPTIME_INTERNAL_HS_CLIENTS && - needs_uptime; - - return (used_internal_recently && - (requires_uptime || num_internal < SUFFICIENT_INTERNAL_HS_CLIENTS) && - router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN); -} - -/* The minimum number of open slots we should keep in order to preemptively - * build circuits. */ -#define CBT_MIN_REMAINING_PREEMPTIVE_CIRCUITS 2 - -/* Check to see if we need more circuits to have a good build timeout. However, - * leave a couple slots open so that we can still build circuits preemptively - * as needed. */ -#define CBT_MAX_UNUSED_OPEN_CIRCUITS (MAX_UNUSED_OPEN_CIRCUITS - \ - CBT_MIN_REMAINING_PREEMPTIVE_CIRCUITS) - -/* Return true if we need more circuits for a good build timeout. - * XXXX make the assumption that build timeout streams should be - * created whenever we can build internal circuits. */ -STATIC int -needs_circuits_for_build(int num) -{ - if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) { - if (num < CBT_MAX_UNUSED_OPEN_CIRCUITS && - !circuit_build_times_disabled(get_options()) && - circuit_build_times_needs_circuits_now(get_circuit_build_times())) { - return 1; - } - } - return 0; -} - -/** Determine how many circuits we have open that are clean, - * Make sure it's enough for all the upcoming behaviors we predict we'll have. +/** Figure out how many circuits we have open that are clean. Make + * sure it's enough for all the upcoming behaviors we predict we'll have. * But put an upper bound on the total number of circuits. */ static void circuit_predict_and_launch_new(void) { + circuit_t *circ; int num=0, num_internal=0, num_uptime_internal=0; int hidserv_needs_uptime=0, hidserv_needs_capacity=1; int port_needs_uptime=0, port_needs_capacity=1; time_t now = time(NULL); int flags = 0; - /* Count how many of each type of circuit we currently have. */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - if (!circuit_is_available_for_use(circ)) + /* First, count how many of each type of circuit we have already. */ + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { + cpath_build_state_t *build_state; + origin_circuit_t *origin_circ; + if (!CIRCUIT_IS_ORIGIN(circ)) + continue; + if (circ->marked_for_close) + continue; /* don't mess with marked circs */ + if (circ->timestamp_dirty) + continue; /* only count clean circs */ + if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL) + continue; /* only pay attention to general-purpose circs */ + origin_circ = TO_ORIGIN_CIRCUIT(circ); + if (origin_circ->unusable_for_new_conns) + continue; + build_state = origin_circ->build_state; + if (build_state->onehop_tunnel) continue; - num++; - - cpath_build_state_t *build_state = TO_ORIGIN_CIRCUIT(circ)->build_state; if (build_state->is_internal) num_internal++; if (build_state->need_uptime && build_state->is_internal) num_uptime_internal++; } - SMARTLIST_FOREACH_END(circ); /* If that's enough, then stop now. */ if (num >= MAX_UNUSED_OPEN_CIRCUITS) - return; + return; /* we already have many, making more probably will hurt */ - if (needs_exit_circuits(now, &port_needs_uptime, &port_needs_capacity)) { + /* Second, see if we need any more exit circuits. */ + /* check if we know of a port that's been requested recently + * and no circuit is currently available that can handle it. */ + if (!circuit_all_predicted_ports_handled(now, &port_needs_uptime, + &port_needs_capacity)) { if (port_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; if (port_needs_capacity) flags |= CIRCLAUNCH_NEED_CAPACITY; - log_info(LD_CIRC, "Have %d clean circs (%d internal), need another exit circ.", num, num_internal); @@ -1237,10 +909,10 @@ circuit_predict_and_launch_new(void) return; } - if (needs_hs_server_circuits(now, num_uptime_internal)) { + /* Third, see if we need any more hidden service (server) circuits. */ + if (num_rend_services() && num_uptime_internal < 3) { flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL); - log_info(LD_CIRC, "Have %d clean circs (%d internal), need another internal " "circ for my hidden service.", @@ -1249,16 +921,16 @@ circuit_predict_and_launch_new(void) return; } - if (needs_hs_client_circuits(now, &hidserv_needs_uptime, - &hidserv_needs_capacity, - num_internal, num_uptime_internal)) - { + /* Fourth, see if we need any more hidden service (client) circuits. */ + if (rep_hist_get_predicted_internal(now, &hidserv_needs_uptime, + &hidserv_needs_capacity) && + ((num_uptime_internal<2 && hidserv_needs_uptime) || + num_internal<2)) { if (hidserv_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; if (hidserv_needs_capacity) flags |= CIRCLAUNCH_NEED_CAPACITY; flags |= CIRCLAUNCH_IS_INTERNAL; - log_info(LD_CIRC, "Have %d clean circs (%d uptime-internal, %d internal), need" " another hidden service circ.", @@ -1267,68 +939,49 @@ circuit_predict_and_launch_new(void) return; } - if (needs_circuits_for_build(num)) { + /* Finally, check to see if we still need more circuits to learn + * a good build timeout. But if we're close to our max number we + * want, don't do another -- we want to leave a few slots open so + * we can still build circuits preemptively as needed. */ + if (num < MAX_UNUSED_OPEN_CIRCUITS-2 && + ! circuit_build_times_disabled() && + circuit_build_times_needs_circuits_now(get_circuit_build_times())) { flags = CIRCLAUNCH_NEED_CAPACITY; - /* if there are no exits in the consensus, make timeout - * circuits internal */ - if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL) - flags |= CIRCLAUNCH_IS_INTERNAL; - - log_info(LD_CIRC, - "Have %d clean circs need another buildtime test circ.", num); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; + log_info(LD_CIRC, + "Have %d clean circs need another buildtime test circ.", num); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); + return; } } /** Build a new test circuit every 5 minutes */ #define TESTING_CIRCUIT_INTERVAL 300 -/** This function is called once a second, if router_have_minimum_dir_info() - * is true. Its job is to make sure all services we offer have enough circuits +/** This function is called once a second, if router_have_min_dir_info() is + * true. Its job is to make sure all services we offer have enough circuits * available. Some services just want enough circuits for current tasks, * whereas others want a minimum set of idle circuits hanging around. */ void circuit_build_needed_circs(time_t now) { + static time_t time_to_new_circuit = 0; const or_options_t *options = get_options(); - /* launch a new circ for any pending streams that need one - * XXXX make the assumption that (some) AP streams (i.e. HS clients) - * don't require an exit circuit, review in #13814. - * This allows HSs to function in a consensus without exits. */ - if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) - connection_ap_rescan_and_attach_pending(); - - circuit_expire_old_circs_as_needed(now); - - if (!options->DisablePredictedCircuits) - circuit_predict_and_launch_new(); -} + /* launch a new circ for any pending streams that need one */ + connection_ap_attach_pending(); -/** - * Called once a second either directly or from - * circuit_build_needed_circs(). As appropriate (once per NewCircuitPeriod) - * resets failure counts and expires old circuits. - */ -void -circuit_expire_old_circs_as_needed(time_t now) -{ - static time_t time_to_expire_and_reset = 0; + /* make sure any hidden services have enough intro points */ + rend_services_introduce(); - if (time_to_expire_and_reset < now) { + if (time_to_new_circuit < now) { circuit_reset_failure_count(1); - time_to_expire_and_reset = now + get_options()->NewCircuitPeriod; + time_to_new_circuit = now + options->NewCircuitPeriod; if (proxy_mode(get_options())) addressmap_clean(now); circuit_expire_old_circuits_clientside(); #if 0 /* disable for now, until predict-and-launch-new can cull leftovers */ - - /* If we ever re-enable, this has to move into - * circuit_build_needed_circs */ - circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL); if (get_options()->RunTesting && circ && @@ -1336,8 +989,10 @@ circuit_expire_old_circs_as_needed(time_t now) log_fn(LOG_INFO,"Creating a new testing circuit."); circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, 0); } -#endif /* 0 */ +#endif } + if (!options->DisablePredictedCircuits) + circuit_predict_and_launch_new(); } /** If the stream conn is a member of any of the linked @@ -1360,30 +1015,17 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn) if (CIRCUIT_IS_ORIGIN(circ)) { origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - int removed = 0; if (conn == origin_circ->p_streams) { origin_circ->p_streams = conn->next_stream; - removed = 1; - } else { - for (prevconn = origin_circ->p_streams; - prevconn && prevconn->next_stream && prevconn->next_stream != conn; - prevconn = prevconn->next_stream) - ; - if (prevconn && prevconn->next_stream) { - prevconn->next_stream = conn->next_stream; - removed = 1; - } + return; } - if (removed) { - log_debug(LD_APP, "Removing stream %d from circ %u", - conn->stream_id, (unsigned)circ->n_circ_id); - /* If the stream was removed, and it was a rend stream, decrement the - * number of streams on the circuit associated with the rend service. - */ - if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) { - hs_dec_rdv_stream_counter(origin_circ); - } + for (prevconn = origin_circ->p_streams; + prevconn && prevconn->next_stream && prevconn->next_stream != conn; + prevconn = prevconn->next_stream) + ; + if (prevconn && prevconn->next_stream) { + prevconn->next_stream = conn->next_stream; return; } } else { @@ -1421,24 +1063,35 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn) tor_fragile_assert(); } +/** If we haven't yet decided on a good timeout value for circuit + * building, we close idles circuits aggressively so we can get more + * data points. */ +#define IDLE_TIMEOUT_WHILE_LEARNING (10*60) + /** Find each circuit that has been unused for too long, or dirty * for too long and has no streams on it: mark it for close. */ static void circuit_expire_old_circuits_clientside(void) { + circuit_t *circ; struct timeval cutoff, now; tor_gettimeofday(&now); - last_expired_clientside_circuits = now.tv_sec; + cutoff = now; + + if (! circuit_build_times_disabled() && + circuit_build_times_needs_circuits(get_circuit_build_times())) { + /* Circuits should be shorter lived if we need more of them + * for learning a good build timeout */ + cutoff.tv_sec -= IDLE_TIMEOUT_WHILE_LEARNING; + } else { + cutoff.tv_sec -= get_options()->CircuitIdleTimeout; + } - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ)) continue; - - cutoff = now; - cutoff.tv_sec -= TO_ORIGIN_CIRCUIT(circ)->circuit_idle_timeout; - /* If the circuit has been dirty for too long, and there are no streams * on it, mark it for close. */ @@ -1456,7 +1109,7 @@ circuit_expire_old_circuits_clientside(void) if (circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) { - if (timercmp(&circ->timestamp_began, &cutoff, OP_LT)) { + if (timercmp(&circ->timestamp_began, &cutoff, <)) { if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL || circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT || circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || @@ -1464,10 +1117,8 @@ circuit_expire_old_circuits_clientside(void) (circ->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && circ->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) || circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { - log_info(LD_CIRC, - "Closing circuit "U64_FORMAT - " that has been unused for %ld msec.", - U64_PRINTF_ARG(TO_ORIGIN_CIRCUIT(circ)->global_identifier), + log_debug(LD_CIRC, + "Closing circuit that has been unused for %ld msec.", tv_mdiff(&circ->timestamp_began, &now)); circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) { @@ -1490,7 +1141,7 @@ circuit_expire_old_circuits_clientside(void) } } } - } SMARTLIST_FOREACH_END(circ); + } } /** How long do we wait before killing circuits with the properties @@ -1511,25 +1162,26 @@ circuit_expire_old_circuits_clientside(void) #define IDLE_ONE_HOP_CIRC_TIMEOUT 60 /** Find each non-origin circuit that has been unused for too long, - * has no streams on it, came from a client, and ends here: mark it + * has no streams on it, used a create_fast, and ends here: mark it * for close. */ void circuit_expire_old_circuits_serverside(time_t now) { + circuit_t *circ; or_circuit_t *or_circ; time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ)) continue; or_circ = TO_OR_CIRCUIT(circ); /* If the circuit has been idle for too long, and there are no streams * on it, and it ends here, and it used a create_fast, mark it for close. */ - if (or_circ->p_chan && channel_is_client(or_circ->p_chan) && - !circ->n_chan && + if (or_circ->is_first_hop && !circ->n_chan && !or_circ->n_streams && !or_circ->resolving_streams && + or_circ->p_chan && channel_when_last_xmit(or_circ->p_chan) <= cutoff) { log_info(LD_CIRC, "Closing circ_id %u (empty %d secs ago)", (unsigned)or_circ->p_circ_id, @@ -1537,7 +1189,6 @@ circuit_expire_old_circuits_serverside(time_t now) circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } } - SMARTLIST_FOREACH_END(circ); } /** Number of testing circuits we want open before testing our bandwidth. */ @@ -1562,18 +1213,18 @@ reset_bandwidth_test(void) int circuit_enough_testing_circs(void) { + circuit_t *circ; int num = 0; if (have_performed_bandwidth_test) return 1; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) && circ->purpose == CIRCUIT_PURPOSE_TESTING && circ->state == CIRCUIT_STATE_OPEN) num++; } - SMARTLIST_FOREACH_END(circ); return num >= NUM_PARALLEL_TESTING_CIRCS; } @@ -1587,7 +1238,7 @@ static void circuit_testing_opened(origin_circuit_t *circ) { if (have_performed_bandwidth_test || - !check_whether_orport_reachable(get_options())) { + !check_whether_orport_reachable()) { /* either we've already done everything we want with testing circuits, * or this testing circuit became open due to a fluke, e.g. we picked * a last hop where we already had the connection open due to an @@ -1604,8 +1255,7 @@ circuit_testing_opened(origin_circuit_t *circ) static void circuit_testing_failed(origin_circuit_t *circ, int at_last_hop) { - const or_options_t *options = get_options(); - if (server_mode(options) && check_whether_orport_reachable(options)) + if (server_mode(get_options()) && check_whether_orport_reachable()) return; log_info(LD_GENERAL, @@ -1635,9 +1285,9 @@ circuit_has_opened(origin_circuit_t *circ) switch (TO_CIRCUIT(circ)->purpose) { case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - hs_client_circuit_has_opened(circ); + rend_client_rendcirc_has_opened(circ); /* Start building an intro circ if we don't have one yet. */ - connection_ap_attach_pending(1); + connection_ap_attach_pending(); /* This isn't a call to circuit_try_attaching_streams because a * circuit in _C_ESTABLISH_REND state isn't connected to its * hidden service yet, thus we can't attach streams to it yet, @@ -1647,7 +1297,7 @@ circuit_has_opened(origin_circuit_t *circ) * state. */ break; case CIRCUIT_PURPOSE_C_INTRODUCING: - hs_client_circuit_has_opened(circ); + rend_client_introcirc_has_opened(circ); break; case CIRCUIT_PURPOSE_C_GENERAL: /* Tell any AP connections that have been waiting for a new @@ -1655,12 +1305,12 @@ circuit_has_opened(origin_circuit_t *circ) circuit_try_attaching_streams(circ); break; case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* at the service, waiting for introductions */ - hs_service_circuit_has_opened(circ); + /* at Bob, waiting for introductions */ + rend_service_intro_has_opened(circ); break; case CIRCUIT_PURPOSE_S_CONNECT_REND: - /* at the service, connecting to rend point */ - hs_service_circuit_has_opened(circ); + /* at Bob, connecting to rend point */ + rend_service_rendezvous_has_opened(circ); break; case CIRCUIT_PURPOSE_TESTING: circuit_testing_opened(circ); @@ -1699,14 +1349,14 @@ void circuit_try_attaching_streams(origin_circuit_t *circ) { /* Attach streams to this circuit if we can. */ - connection_ap_attach_pending(1); + connection_ap_attach_pending(); /* The call to circuit_try_clearing_isolation_state here will do * nothing and return 0 if we didn't attach any streams to circ * above. */ if (circuit_try_clearing_isolation_state(circ)) { /* Maybe *now* we can attach some streams to this circuit. */ - connection_ap_attach_pending(1); + connection_ap_attach_pending(); } } @@ -1749,22 +1399,16 @@ circuit_build_failed(origin_circuit_t *circ) already_marked = 1; } log_info(LD_OR, - "Our circuit %u (id: %" PRIu32 ") failed to get a response " - "from the first hop (%s). I'm going to try to rotate to a " - "better connection.", - TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier, + "Our circuit failed to get a response from the first hop " + "(%s). I'm going to try to rotate to a better connection.", channel_get_canonical_remote_descr(n_chan)); n_chan->is_bad_for_new_circs = 1; } else { log_info(LD_OR, - "Our circuit %u (id: %" PRIu32 ") died before the first hop " - "with no connection", - TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier); + "Our circuit died before the first hop with no connection"); } if (n_chan_id && !already_marked) { - /* New guard API: we failed. */ - if (circ->guard_state) - entry_guard_failed(&circ->guard_state); + entry_guard_register_connect_status(n_chan_id, 0, 1, time(NULL)); /* if there are any one-hop streams waiting on this circuit, fail * them now so they can retry elsewhere. */ connection_ap_fail_onehop(n_chan_id, circ->build_state); @@ -1785,36 +1429,36 @@ circuit_build_failed(origin_circuit_t *circ) circuit_testing_failed(circ, failed_at_last_hop); break; case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* at the service, waiting for introductions */ + /* at Bob, waiting for introductions */ if (circ->base_.state != CIRCUIT_STATE_OPEN) { circuit_increment_failure_count(); } - /* no need to care here, because the service will rebuild intro + /* no need to care here, because bob will rebuild intro * points periodically. */ break; case CIRCUIT_PURPOSE_C_INTRODUCING: - /* at the client, connecting to intro point */ - /* Don't increment failure count, since the service may have picked + /* at Alice, connecting to intro point */ + /* Don't increment failure count, since Bob may have picked * the introduction point maliciously */ - /* The client will pick a new intro point when this one dies, if + /* Alice will pick a new intro point when this one dies, if * the stream in question still cares. No need to act here. */ break; case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - /* at the client, waiting for the service */ + /* at Alice, waiting for Bob */ circuit_increment_failure_count(); - /* the client will pick a new rend point when this one dies, if + /* Alice will pick a new rend point when this one dies, if * the stream in question still cares. No need to act here. */ break; case CIRCUIT_PURPOSE_S_CONNECT_REND: - /* at the service, connecting to rend point */ - /* Don't increment failure count, since the client may have picked + /* at Bob, connecting to rend point */ + /* Don't increment failure count, since Alice may have picked * the rendezvous point maliciously */ log_info(LD_REND, - "Couldn't connect to the client's chosen rend point %s " + "Couldn't connect to Alice's chosen rend point %s " "(%s hop failed).", escaped(build_state_get_exit_nickname(circ->build_state)), failed_at_last_hop?"last":"non-last"); - hs_circ_retry_service_rendezvous_point(circ); + rend_service_relaunch_rendezvous(circ); break; /* default: * This won't happen in normal operation, but might happen if the @@ -1842,20 +1486,6 @@ circuit_launch(uint8_t purpose, int flags) return circuit_launch_by_extend_info(purpose, NULL, flags); } -/* Do we have enough descriptors to build paths? - * If need_exit is true, return 1 if we can build exit paths. - * (We need at least one Exit in the consensus to build exit paths.) - * If need_exit is false, return 1 if we can build internal paths. - */ -static int -have_enough_path_info(int need_exit) -{ - if (need_exit) - return router_have_consensus_path() == CONSENSUS_PATH_EXIT; - else - return router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN; -} - /** Launch a new circuit with purpose purpose and exit node * extend_info (or NULL to select a random exit node). If flags * contains CIRCLAUNCH_NEED_UPTIME, choose among routers with high uptime. If @@ -1870,40 +1500,25 @@ circuit_launch_by_extend_info(uint8_t purpose, { origin_circuit_t *circ; int onehop_tunnel = (flags & CIRCLAUNCH_ONEHOP_TUNNEL) != 0; - int have_path = have_enough_path_info(! (flags & CIRCLAUNCH_IS_INTERNAL) ); - int need_specific_rp = 0; - - if (!onehop_tunnel && (!router_have_minimum_dir_info() || !have_path)) { - log_debug(LD_CIRC,"Haven't %s yet; canceling " - "circuit launch.", - !router_have_minimum_dir_info() ? - "fetched enough directory info" : - "received a consensus with exits"); - return NULL; - } - /* If Tor2webRendezvousPoints is enabled and we are dealing with an - RP circuit, we want a specific RP node so we shouldn't canibalize - an already existing circuit. */ - if (get_options()->Tor2webRendezvousPoints && - purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND) { - need_specific_rp = 1; + if (!onehop_tunnel && !router_have_minimum_dir_info()) { + log_debug(LD_CIRC,"Haven't fetched enough directory info yet; canceling " + "circuit launch."); + return NULL; } if ((extend_info || purpose != CIRCUIT_PURPOSE_C_GENERAL) && - purpose != CIRCUIT_PURPOSE_TESTING && - !onehop_tunnel && !need_specific_rp) { + purpose != CIRCUIT_PURPOSE_TESTING && !onehop_tunnel) { /* see if there are appropriate circs available to cannibalize. */ /* XXX if we're planning to add a hop, perhaps we want to look for * internal circs rather than exit circs? -RD */ circ = circuit_find_to_cannibalize(purpose, extend_info, flags); if (circ) { uint8_t old_purpose = circ->base_.purpose; - struct timeval old_timestamp_began = circ->base_.timestamp_began; + struct timeval old_timestamp_began; - log_info(LD_CIRC, "Cannibalizing circ %u (id: %" PRIu32 ") for " - "purpose %d (%s)", - TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier, purpose, + log_info(LD_CIRC,"Cannibalizing circ '%s' for purpose %d (%s)", + build_state_get_exit_nickname(circ->build_state), purpose, circuit_purpose_to_string(purpose)); if ((purpose == CIRCUIT_PURPOSE_S_CONNECT_REND || @@ -1942,12 +1557,12 @@ circuit_launch_by_extend_info(uint8_t purpose, switch (purpose) { case CIRCUIT_PURPOSE_C_ESTABLISH_REND: + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: /* it's ready right now */ break; case CIRCUIT_PURPOSE_C_INTRODUCING: case CIRCUIT_PURPOSE_S_CONNECT_REND: case CIRCUIT_PURPOSE_C_GENERAL: - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: /* need to add a new hop */ tor_assert(extend_info); if (circuit_extend_to_new_exit(circ, extend_info) < 0) @@ -2019,29 +1634,17 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, tor_assert(conn); tor_assert(circp); - if (ENTRY_TO_CONN(conn)->state != AP_CONN_STATE_CIRCUIT_WAIT) { - connection_t *c = ENTRY_TO_CONN(conn); - log_err(LD_BUG, "Connection state mismatch: wanted " - "AP_CONN_STATE_CIRCUIT_WAIT, but got %d (%s)", - c->state, conn_state_to_string(c->type, c->state)); - } tor_assert(ENTRY_TO_CONN(conn)->state == AP_CONN_STATE_CIRCUIT_WAIT); - - /* Will the exit policy of the exit node apply to this stream? */ check_exit_policy = conn->socks_request->command == SOCKS_COMMAND_CONNECT && !conn->use_begindir && !connection_edge_is_rendezvous_stream(ENTRY_TO_EDGE_CONN(conn)); - - /* Does this connection want a one-hop circuit? */ want_onehop = conn->want_onehop; - /* Do we need a high-uptime circuit? */ need_uptime = !conn->want_onehop && !conn->use_begindir && smartlist_contains_int_as_string(options->LongLivedPorts, conn->socks_request->port); - /* Do we need an "internal" circuit? */ if (desired_circuit_purpose != CIRCUIT_PURPOSE_C_GENERAL) need_internal = 1; else if (conn->use_begindir || conn->want_onehop) @@ -2049,69 +1652,41 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, else need_internal = 0; - /* We now know what kind of circuit we need. See if there is an - * open circuit that we can use for this stream */ - circ = circuit_get_best(conn, 1 /* Insist on open circuits */, - desired_circuit_purpose, + circ = circuit_get_best(conn, 1, desired_circuit_purpose, need_uptime, need_internal); if (circ) { - /* We got a circuit that will work for this stream! We can return it. */ *circp = circ; return 1; /* we're happy */ } - /* Okay, there's no circuit open that will work for this stream. Let's - * see if there's an in-progress circuit or if we have to launch one */ - - /* Do we know enough directory info to build circuits at all? */ - int have_path = have_enough_path_info(!need_internal); - - if (!want_onehop && (!router_have_minimum_dir_info() || !have_path)) { - /* If we don't have enough directory information, we can't build - * multihop circuits. - */ + if (!want_onehop && !router_have_minimum_dir_info()) { if (!connection_get_by_type(CONN_TYPE_DIR)) { int severity = LOG_NOTICE; - /* Retry some stuff that might help the connection work. */ - /* If we are configured with EntryNodes or UseBridges */ - if (entry_list_is_constrained(options)) { - /* Retry all our guards / bridges. - * guards_retry_optimistic() always returns true here. */ - int rv = guards_retry_optimistic(options); - tor_assert_nonfatal_once(rv); + /* FFFF if this is a tunneled directory fetch, don't yell + * as loudly. the user doesn't even know it's happening. */ + if (entry_list_is_constrained(options) && + entries_known_but_down(options)) { log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't %s. " - "Optimistically trying known %s again.", - !router_have_minimum_dir_info() ? - "used client functionality lately" : - "received a consensus with exits", + "Application request when we haven't used client functionality " + "lately. Optimistically trying known %s again.", options->UseBridges ? "bridges" : "entrynodes"); - } else { - /* Getting directory documents doesn't help much if we have a limited - * number of guards */ - tor_assert_nonfatal(!options->UseBridges); - tor_assert_nonfatal(!options->EntryNodes); - /* Retry our directory fetches, so we have a fresh set of guard info */ + entries_retry_all(options); + } else if (!options->UseBridges || any_bridge_descriptors_known()) { log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't %s. " - "Optimistically trying directory fetches again.", - !router_have_minimum_dir_info() ? - "used client functionality lately" : - "received a consensus with exits"); + "Application request when we haven't used client functionality " + "lately. Optimistically trying directory fetches again."); routerlist_retry_directory_downloads(time(NULL)); } } - /* Since we didn't have enough directory info, we can't attach now. The - * stream will be dealt with when router_have_minimum_dir_info becomes 1, - * or when all directory attempts fail and directory_all_unreachable() + /* the stream will be dealt with when router_have_minimum_dir_info becomes + * 1, or when all directory attempts fail and directory_all_unreachable() * kills it. */ return 0; } - /* Check whether the exit policy of the chosen exit, or the exit policies - * of _all_ nodes, would forbid this node. */ + /* Do we need to check exit policy? */ if (check_exit_policy) { if (!conn->chosen_exit_name) { struct in_addr in; @@ -2130,9 +1705,9 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, return -1; } } else { - /* XXXX Duplicates checks in connection_ap_handshake_attach_circuit: - * refactor into a single function. */ - const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 0); + /* XXXX024 Duplicates checks in connection_ap_handshake_attach_circuit: + * refactor into a single function? */ + const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); int opt = conn->chosen_exit_optional; if (node && !connection_ap_can_use_exit(conn, node)) { log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, @@ -2152,25 +1727,16 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, } } - /* Now, check whether there already a circuit on the way that could handle - * this stream. This check matches the one above, but this time we - * do not require that the circuit will work. */ - circ = circuit_get_best(conn, 0 /* don't insist on open circuits */, - desired_circuit_purpose, + /* is one already on the way? */ + circ = circuit_get_best(conn, 0, desired_circuit_purpose, need_uptime, need_internal); if (circ) log_debug(LD_CIRC, "one on the way!"); - if (!circ) { - /* No open or in-progress circuit could handle this stream! We - * will have to launch one! - */ - - /* The chosen exit node, if there is one. */ extend_info_t *extend_info=NULL; + uint8_t new_circ_purpose; const int n_pending = count_pending_general_client_circuits(); - /* Do we have too many pending circuits? */ if (n_pending >= options->MaxClientCircuitsPending) { static ratelim_t delay_limit = RATELIM_INIT(10*60); char *m; @@ -2184,28 +1750,22 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, return 0; } - /* If this is a hidden service trying to start an introduction point, - * handle that case. */ if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); /* need to pick an intro point */ - extend_info = hs_client_get_random_intro_from_edge(edge_conn); + rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data; + tor_assert(rend_data); + extend_info = rend_client_get_random_intro(rend_data); if (!extend_info) { - log_info(LD_REND, "No intro points: re-fetching service descriptor."); - if (edge_conn->rend_data) { - rend_client_refetch_v2_renddesc(edge_conn->rend_data); - } else { - hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk); - } - connection_ap_mark_as_non_pending_circuit(conn); + log_info(LD_REND, + "No intro points for '%s': re-fetching service descriptor.", + safe_str_client(rend_data->onion_address)); + rend_client_refetch_v2_renddesc(rend_data); ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_RENDDESC_WAIT; return 0; } log_info(LD_REND,"Chose %s as intro point for '%s'.", extend_info_describe(extend_info), - (edge_conn->rend_data) ? - safe_str_client(rend_data_get_address(edge_conn->rend_data)) : - "service"); + safe_str_client(rend_data->onion_address)); } /* If we have specified a particular exit node for our @@ -2215,33 +1775,23 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, if (conn->chosen_exit_name) { const node_t *r; int opt = conn->chosen_exit_optional; - r = node_get_by_nickname(conn->chosen_exit_name, 0); + r = node_get_by_nickname(conn->chosen_exit_name, 1); if (r && node_has_descriptor(r)) { /* We might want to connect to an IPv6 bridge for loading descriptors so we use the preferred address rather than - the primary. */ + the primary. */ extend_info = extend_info_from_node(r, conn->want_onehop ? 1 : 0); - if (!extend_info) { - log_warn(LD_CIRC,"Could not make a one-hop connection to %s. " - "Discarding this circuit.", conn->chosen_exit_name); - return -1; - } - } else { /* ! (r && node_has_descriptor(r)) */ + } else { log_debug(LD_DIR, "considering %d, %s", want_onehop, conn->chosen_exit_name); if (want_onehop && conn->chosen_exit_name[0] == '$') { /* We're asking for a one-hop circuit to a router that * we don't have a routerinfo about. Make up an extend_info. */ - /* XXX prop220: we need to make chosen_exit_name able to - * encode both key formats. This is not absolutely critical - * since this is just for one-hop circuits, but we should - * still get it done */ char digest[DIGEST_LEN]; char *hexdigest = conn->chosen_exit_name+1; tor_addr_t addr; if (strlen(hexdigest) < HEX_DIGEST_LEN || - base16_decode(digest,DIGEST_LEN, - hexdigest,HEX_DIGEST_LEN) != DIGEST_LEN) { + base16_decode(digest,DIGEST_LEN,hexdigest,HEX_DIGEST_LEN)<0) { log_info(LD_DIR, "Broken exit digest on tunnel conn. Closing."); return -1; } @@ -2250,13 +1800,10 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, escaped_safe_str_client(conn->socks_request->address)); return -1; } - /* XXXX prop220 add a workaround for ed25519 ID below*/ extend_info = extend_info_new(conn->chosen_exit_name+1, - digest, - NULL, /* Ed25519 ID */ - NULL, NULL, /* onion keys */ - &addr, conn->socks_request->port); - } else { /* ! (want_onehop && conn->chosen_exit_name[0] == '$') */ + digest, NULL, NULL, &addr, + conn->socks_request->port); + } else { /* We will need an onion key for the router, and we * don't have one. Refuse or relax requirements. */ log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, @@ -2274,10 +1821,8 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, } } } - } /* Done checking for general circutis with chosen exits. */ + } - /* What purpose do we need to launch this circuit with? */ - uint8_t new_circ_purpose; if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_REND_JOINED) new_circ_purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND; else if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) @@ -2285,40 +1830,23 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, else new_circ_purpose = desired_circuit_purpose; -#ifdef ENABLE_TOR2WEB_MODE - /* If tor2Web is on, then hidden service requests should be one-hop. - */ if (options->Tor2webMode && (new_circ_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND || new_circ_purpose == CIRCUIT_PURPOSE_C_INTRODUCING)) { want_onehop = 1; } -#endif /* defined(ENABLE_TOR2WEB_MODE) */ - /* Determine what kind of a circuit to launch, and actually launch it. */ { int flags = CIRCLAUNCH_NEED_CAPACITY; if (want_onehop) flags |= CIRCLAUNCH_ONEHOP_TUNNEL; if (need_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; if (need_internal) flags |= CIRCLAUNCH_IS_INTERNAL; - - /* If we are about to pick a v3 RP right now, make sure we pick a - * rendezvous point that supports the v3 protocol! */ - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_REND_JOINED && - new_circ_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && - ENTRY_TO_EDGE_CONN(conn)->hs_ident) { - flags |= CIRCLAUNCH_IS_V3_RP; - log_info(LD_GENERAL, "Getting rendezvous circuit to v3 service!"); - } - circ = circuit_launch_by_extend_info(new_circ_purpose, extend_info, flags); } extend_info_free(extend_info); - /* Now trigger things that need to happen when we launch circuits */ - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL) { /* We just caused a circuit to get built because of this stream. * If this stream has caused a _lot_ of circuits to be built, that's @@ -2334,25 +1862,14 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, /* help predict this next time */ rep_hist_note_used_internal(time(NULL), need_uptime, 1); if (circ) { - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - if (edge_conn->rend_data) { - /* write the service_id into circ */ - circ->rend_data = rend_data_dup(edge_conn->rend_data); - } else if (edge_conn->hs_ident) { - circ->hs_ident = - hs_ident_circuit_new(&edge_conn->hs_ident->identity_pk, - HS_IDENT_CIRCUIT_INTRO); - } + /* write the service_id into circ */ + circ->rend_data = rend_data_dup(ENTRY_TO_EDGE_CONN(conn)->rend_data); if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && circ->base_.state == CIRCUIT_STATE_OPEN) - circuit_has_opened(circ); + rend_client_rendcirc_has_opened(circ); } } } /* endif (!circ) */ - - /* We either found a good circuit, or launched a new circuit, or failed to - * do so. Report success, and delay. */ - if (circ) { /* Mark the circuit with the isolation fields for this connection. * When the circuit arrives, we'll clear these flags: this is @@ -2390,11 +1907,10 @@ optimistic_data_enabled(void) { const or_options_t *options = get_options(); if (options->OptimisticData < 0) { - /* Note: this default was 0 before #18815 was merged. We can't take the - * parameter out of the consensus until versions before that are all - * obsolete. */ + /* XXX023 consider having auto default to 1 rather than 0 before + * the 0.2.3 branch goes stable. See bug 3617. -RD */ const int32_t enabled = - networkstatus_get_param(NULL, "UseOptimisticData", /*default*/ 1, 0, 1); + networkstatus_get_param(NULL, "UseOptimisticData", 0, 0, 1); return (int)enabled; } return options->OptimisticData; @@ -2408,7 +1924,7 @@ static void link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, crypt_path_t *cpath) { - const node_t *exitnode = NULL; + const node_t *exitnode; /* add it into the linked list of streams on this circuit */ log_debug(LD_APP|LD_CIRC, "attaching new conn to circ. n_circ_id %u.", @@ -2424,7 +1940,8 @@ link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, /* We are attaching a stream to a rendezvous circuit. That means * that an attempt to connect to a hidden service just * succeeded. Tell rendclient.c. */ - hs_client_note_connection_attempt_succeeded(ENTRY_TO_EDGE_CONN(apconn)); + rend_client_note_connection_attempt_ended( + ENTRY_TO_EDGE_CONN(apconn)->rend_data->onion_address); } if (cpath) { /* we were given one; use it */ @@ -2441,25 +1958,23 @@ link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, circ->isolation_any_streams_attached = 1; connection_edge_update_circuit_isolation(apconn, circ, 0); - /* Compute the exitnode if possible, for logging below */ - if (cpath->extend_info) - exitnode = node_get_by_id(cpath->extend_info->identity_digest); - /* See if we can use optimistic data on this circuit */ - if (optimistic_data_enabled() && - (circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL || - circ->base_.purpose == CIRCUIT_PURPOSE_C_REND_JOINED)) - apconn->may_use_optimistic_data = 1; - else - apconn->may_use_optimistic_data = 0; - log_info(LD_APP, "Looks like completed circuit to %s %s allow " - "optimistic data for connection to %s", - circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL ? - /* node_describe() does the right thing if exitnode is NULL */ - safe_str_client(node_describe(exitnode)) : - "hidden service", - apconn->may_use_optimistic_data ? "does" : "doesn't", - safe_str_client(apconn->socks_request->address)); + if (cpath->extend_info && + (exitnode = node_get_by_id(cpath->extend_info->identity_digest)) && + exitnode->rs) { + /* Okay; we know what exit node this is. */ + if (optimistic_data_enabled() && + circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL && + exitnode->rs->version_supports_optimistic_data) + apconn->may_use_optimistic_data = 1; + else + apconn->may_use_optimistic_data = 0; + log_info(LD_APP, "Looks like completed circuit to %s %s allow " + "optimistic data for connection to %s", + safe_str_client(node_describe(exitnode)), + apconn->may_use_optimistic_data ? "does" : "doesn't", + safe_str_client(apconn->socks_request->address)); + } } /** Return true iff address is matched by one of the entries in @@ -2495,7 +2010,7 @@ consider_recording_trackhost(const entry_connection_t *conn, char fp[HEX_DIGEST_LEN+1]; /* Search the addressmap for this conn's destination. */ - /* If they're not in the address map.. */ + /* If he's not in the address map.. */ if (!options->TrackHostExits || addressmap_have_mapping(conn->socks_request->address, options->TrackHostExitsExpire)) @@ -2539,21 +2054,12 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn, base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - if (!circ->base_.timestamp_dirty || - ((conn->entry_cfg.isolation_flags & ISO_SOCKSAUTH) && - (conn->entry_cfg.socks_iso_keep_alive) && - (conn->socks_request->usernamelen || - conn->socks_request->passwordlen))) { - /* When stream isolation is in use and controlled by an application - * we are willing to keep using the stream. */ - circ->base_.timestamp_dirty = approx_time(); - } + if (!circ->base_.timestamp_dirty) + circ->base_.timestamp_dirty = time(NULL); pathbias_count_use_attempt(circ); - /* Now, actually link the connection. */ link_apconn_to_circ(conn, circ, cpath); - tor_assert(conn->socks_request); if (conn->socks_request->command == SOCKS_COMMAND_CONNECT) { if (!conn->use_begindir) @@ -2568,11 +2074,12 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn, return 1; } -/** Try to find a safe live circuit for stream conn. If we find one, - * attach the stream, send appropriate cells, and return 1. Otherwise, - * try to launch new circuit(s) for the stream. If we can launch - * circuits, return 0. Otherwise, if we simply can't proceed with - * this stream, return -1. (conn needs to die, and is maybe already marked). +/** Try to find a safe live circuit for CONN_TYPE_AP connection conn. If + * we don't find one: if conn cannot be handled by any known nodes, + * warn and return -1 (conn needs to die, and is maybe already marked); + * else launch new circuit (if necessary) and return 0. + * Otherwise, associate conn with a safe live circuit, do the + * right next step, and return 1. */ /* XXXX this function should mark for close whenever it returns -1; * its callers shouldn't have to worry about that. */ @@ -2591,7 +2098,6 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) conn_age = (int)(time(NULL) - base_conn->timestamp_created); - /* Is this connection so old that we should give up on it? */ if (conn_age >= get_options()->SocksTimeout) { int severity = (tor_addr_is_null(&base_conn->addr) && !base_conn->port) ? LOG_INFO : LOG_NOTICE; @@ -2602,36 +2108,12 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) return -1; } - /* We handle "general" (non-onion) connections much more straightforwardly. - */ if (!connection_edge_is_rendezvous_stream(ENTRY_TO_EDGE_CONN(conn))) { /* we're a general conn */ origin_circuit_t *circ=NULL; - /* Are we linked to a dir conn that aims to fetch a consensus? - * We check here because the conn might no longer be needed. */ - if (base_conn->linked_conn && - base_conn->linked_conn->type == CONN_TYPE_DIR && - base_conn->linked_conn->purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - - /* Yes we are. Is there a consensus fetch farther along than us? */ - if (networkstatus_consensus_is_already_downloading( - TO_DIR_CONN(base_conn->linked_conn)->requested_resource)) { - /* We're doing the "multiple consensus fetch attempts" game from - * proposal 210, and we're late to the party. Just close this conn. - * The circuit and TLS conn that we made will time out after a while - * if nothing else wants to use them. */ - log_info(LD_DIR, "Closing extra consensus fetch (to %s) since one " - "is already downloading.", base_conn->linked_conn->address); - return -1; - } - } - - /* If we have a chosen exit, we need to use a circuit that's - * open to that exit. See what exit we meant, and whether we can use it. - */ if (conn->chosen_exit_name) { - const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 0); + const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); int opt = conn->chosen_exit_optional; if (!node && !want_onehop) { /* We ran into this warning when trying to extend a circuit to a @@ -2643,7 +2125,6 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) "Requested exit point '%s' is not known. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - /* If we are allowed to ignore the .exit request, do so */ conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); return 0; @@ -2656,7 +2137,6 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) "would refuse request. %s.", conn->chosen_exit_name, opt ? "Trying others" : "Closing"); if (opt) { - /* If we are allowed to ignore the .exit request, do so */ conn->chosen_exit_optional = 0; tor_free(conn->chosen_exit_name); return 0; @@ -2665,25 +2145,20 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) } } - /* Find the circuit that we should use, if there is one. Otherwise - * launch it. */ + /* find the circuit that we should use, if there is one. */ retval = circuit_get_open_circ_or_launch( conn, CIRCUIT_PURPOSE_C_GENERAL, &circ); - if (retval < 1) { - /* We were either told "-1" (complete failure) or 0 (circuit in - * progress); we can't attach this stream yet. */ + if (retval < 1) // XXX023 if we totally fail, this still returns 0 -RD return retval; - } log_debug(LD_APP|LD_CIRC, "Attaching apconn to circ %u (stream %d sec old).", (unsigned)circ->base_.n_circ_id, conn_age); - /* print the circ's path, so clients can figure out which circs are + /* print the circ's path, so people can figure out which circs are * sucking. */ circuit_log_path(LOG_INFO,LD_APP|LD_CIRC,circ); - /* We have found a suitable circuit for our conn. Hurray. Do - * the attachment. */ + /* We have found a suitable circuit for our conn. Hurray. */ return connection_ap_handshake_attach_chosen_circuit(conn, circ, NULL); } else { /* we're a rendezvous conn */ @@ -2701,10 +2176,9 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) tor_assert(rendcirc); /* one is already established, attach */ log_info(LD_REND, - "rend joined circ %u (id: %" PRIu32 ") already here. " - "Attaching. (stream %d sec old)", - (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id, - rendcirc->global_identifier, conn_age); + "rend joined circ %d already here. attaching. " + "(stream %d sec old)", + (unsigned)rendcirc->base_.n_circ_id, conn_age); /* Mark rendezvous circuits as 'newly dirty' every time you use * them, since the process of rebuilding a rendezvous circ is so * expensive. There is a tradeoff between linkability and @@ -2722,25 +2196,12 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) return 1; } - /* At this point we need to re-check the state, since it's possible that - * our call to circuit_get_open_circ_or_launch() changed the connection's - * state from "CIRCUIT_WAIT" to "RENDDESC_WAIT" because we decided to - * re-fetch the descriptor. - */ - if (ENTRY_TO_CONN(conn)->state != AP_CONN_STATE_CIRCUIT_WAIT) { - log_info(LD_REND, "This connection is no longer ready to attach; its " - "state changed." - "(We probably have to re-fetch its descriptor.)"); - return 0; - } - if (rendcirc && (rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED)) { log_info(LD_REND, - "pending-join circ %u (id: %" PRIu32 ") already here, with " - "intro ack. Stalling. (stream %d sec old)", - (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id, - rendcirc->global_identifier, conn_age); + "pending-join circ %u already here, with intro ack. " + "Stalling. (stream %d sec old)", + (unsigned)rendcirc->base_.n_circ_id, conn_age); return 0; } @@ -2752,13 +2213,10 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) if (retval > 0) { /* one has already sent the intro. keep waiting. */ tor_assert(introcirc); - log_info(LD_REND, "Intro circ %u (id: %" PRIu32 ") present and " - "awaiting ACK. Rend circuit %u (id: %" PRIu32 "). " - "Stalling. (stream %d sec old)", - (unsigned) TO_CIRCUIT(introcirc)->n_circ_id, - introcirc->global_identifier, - rendcirc ? (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id : 0, - rendcirc ? rendcirc->global_identifier : 0, + log_info(LD_REND, "Intro circ %u present and awaiting ack (rend %u). " + "Stalling. (stream %d sec old)", + (unsigned)introcirc->base_.n_circ_id, + rendcirc ? (unsigned)rendcirc->base_.n_circ_id : 0, conn_age); return 0; } @@ -2768,26 +2226,19 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) if (rendcirc && introcirc && rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY) { log_info(LD_REND, - "ready rend circ %u (id: %" PRIu32 ") already here. No" - "intro-ack yet on intro %u (id: %" PRIu32 "). " - "(stream %d sec old)", - (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id, - rendcirc->global_identifier, - (unsigned) TO_CIRCUIT(introcirc)->n_circ_id, - introcirc->global_identifier, conn_age); + "ready rend circ %u already here (no intro-ack yet on " + "intro %u). (stream %d sec old)", + (unsigned)rendcirc->base_.n_circ_id, + (unsigned)introcirc->base_.n_circ_id, conn_age); tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING); if (introcirc->base_.state == CIRCUIT_STATE_OPEN) { - int ret; - log_info(LD_REND, "Found open intro circ %u (id: %" PRIu32 "). " - "Rend circuit %u (id: %" PRIu32 "); Sending " - "introduction. (stream %d sec old)", - (unsigned) TO_CIRCUIT(introcirc)->n_circ_id, - introcirc->global_identifier, - (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id, - rendcirc->global_identifier, conn_age); - ret = hs_client_send_introduce1(introcirc, rendcirc); - switch (ret) { + log_info(LD_REND,"found open intro circ %u (rend %u); sending " + "introduction. (stream %d sec old)", + (unsigned)introcirc->base_.n_circ_id, + (unsigned)rendcirc->base_.n_circ_id, + conn_age); + switch (rend_client_send_introduction(introcirc, rendcirc)) { case 0: /* success */ rendcirc->base_.timestamp_dirty = time(NULL); introcirc->base_.timestamp_dirty = time(NULL); @@ -2809,13 +2260,10 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) } } - log_info(LD_REND, "Intro %u (id: %" PRIu32 ") and rend circuit %u " - "(id: %" PRIu32 ") circuits are not both ready. " - "Stalling conn. (%d sec old)", - introcirc ? (unsigned) TO_CIRCUIT(introcirc)->n_circ_id : 0, - introcirc ? introcirc->global_identifier : 0, - rendcirc ? (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id : 0, - rendcirc ? rendcirc->global_identifier : 0, conn_age); + log_info(LD_REND, "Intro (%u) and rend (%u) circs are not both ready. " + "Stalling conn. (%d sec old)", + introcirc ? (unsigned)introcirc->base_.n_circ_id : 0, + rendcirc ? (unsigned)rendcirc->base_.n_circ_id : 0, conn_age); return 0; } } @@ -2863,7 +2311,7 @@ mark_circuit_unusable_for_new_conns(origin_circuit_t *circ) const or_options_t *options = get_options(); tor_assert(circ); - /* XXXX This is a kludge; we're only keeping it around in case there's + /* XXXX025 This is a kludge; we're only keeping it around in case there's * something that doesn't check unusable_for_new_conns, and to avoid * deeper refactoring of our expiration logic. */ if (! circ->base_.timestamp_dirty) diff --git a/src/tor/src/or/circuituse.h b/src/tor/circuituse.h similarity index 66% rename from src/tor/src/or/circuituse.h rename to src/tor/circuituse.h index 2b0f983f1..11e5a6416 100644 --- a/src/tor/src/or/circuituse.h +++ b/src/tor/circuituse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,17 +13,14 @@ #define TOR_CIRCUITUSE_H void circuit_expire_building(void); -void circuit_expire_waiting_for_better_guard(void); void circuit_remove_handled_ports(smartlist_t *needed_ports); int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port, int min); -void circuit_log_ancient_one_hop_circuits(int age); #if 0 int circuit_conforms_to_options(const origin_circuit_t *circ, const or_options_t *options); #endif void circuit_build_needed_circs(time_t now); -void circuit_expire_old_circs_as_needed(time_t now); void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); void circuit_expire_old_circuits_serverside(time_t now); @@ -44,9 +41,6 @@ void circuit_build_failed(origin_circuit_t *circ); /** Flag to set when the last hop of a circuit doesn't need to be an * exit node. */ #define CIRCLAUNCH_IS_INTERNAL (1<<3) -/** Flag to set when we are trying to launch a v3 rendezvous circuit. We need - * to apply some additional filters on the node picked. */ -#define CIRCLAUNCH_IS_V3_RP (1<<4) origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose, extend_info_t *info, int flags); @@ -63,26 +57,5 @@ int hostname_in_track_host_exits(const or_options_t *options, const char *address); void mark_circuit_unusable_for_new_conns(origin_circuit_t *circ); -#ifdef TOR_UNIT_TESTS -/* Used only by circuituse.c and test_circuituse.c */ - -STATIC int circuit_is_available_for_use(const circuit_t *circ); - -STATIC int needs_exit_circuits(time_t now, - int *port_needs_uptime, - int *port_needs_capacity); -STATIC int needs_hs_server_circuits(time_t now, - int num_uptime_internal); - -STATIC int needs_hs_client_circuits(time_t now, - int *needs_uptime, - int *needs_capacity, - int num_internal, - int num_uptime_internal); - -STATIC int needs_circuits_for_build(int num); - -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* !defined(TOR_CIRCUITUSE_H) */ +#endif diff --git a/src/tor/src/or/command.c b/src/tor/command.c similarity index 84% rename from src/tor/src/or/command.c rename to src/tor/command.c index ae419ad06..9b3ff16f2 100644 --- a/src/tor/src/or/command.c +++ b/src/tor/command.c @@ -1,32 +1,12 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file command.c * \brief Functions for processing incoming cells. - * - * When we receive a cell from a client or a relay, it arrives on some - * channel, and tells us what to do with it. In this module, we dispatch based - * on the cell type using the functions command_process_cell() and - * command_process_var_cell(), and deal with the cell accordingly. (These - * handlers are installed on a channel with the command_setup_channel() - * function.) - * - * Channels have a chance to handle some cell types on their own before they - * are ever passed here --- typically, they do this for cells that are - * specific to a given channel type. For example, in channeltls.c, the cells - * for the initial connection handshake are handled before we get here. (Of - * course, the fact that there _is_ only one channel type for now means that - * we may have gotten the factoring wrong here.) - * - * Handling other cell types is mainly farmed off to other modules, after - * initial sanity-checking. CREATE* cells are handled ultimately in onion.c, - * CREATED* cells trigger circuit creation in circuitbuild.c, DESTROY cells - * are handled here (since they're simple), and RELAY cells, in all their - * complexity, are passed off to relay.c. **/ /* In-points to command.c: @@ -128,7 +108,7 @@ command_time_process_cell(cell_t *cell, channel_t *chan, int *time, } *time += time_passed; } -#endif /* defined(KEEP_TIMING_STATS) */ +#endif /** Process a cell that was just received on chan. Keep internal * statistics about how many of each cell we've processed so far @@ -165,7 +145,7 @@ command_process_cell(channel_t *chan, cell_t *cell) /* remember which second it is, for next time */ current_second = now; } -#endif /* defined(KEEP_TIMING_STATS) */ +#endif #ifdef KEEP_TIMING_STATS #define PROCESS_CELL(tp, cl, cn) STMT_BEGIN { \ @@ -173,9 +153,9 @@ command_process_cell(channel_t *chan, cell_t *cell) command_time_process_cell(cl, cn, & tp ## time , \ command_process_ ## tp ## _cell); \ } STMT_END -#else /* !(defined(KEEP_TIMING_STATS)) */ +#else #define PROCESS_CELL(tp, cl, cn) command_process_ ## tp ## _cell(cl, cn) -#endif /* defined(KEEP_TIMING_STATS) */ +#endif switch (cell->command) { case CELL_CREATE: @@ -247,34 +227,6 @@ command_process_create_cell(cell_t *cell, channel_t *chan) (unsigned)cell->circ_id, U64_PRINTF_ARG(chan->global_identifier), chan); - /* We check for the conditions that would make us drop the cell before - * we check for the conditions that would make us send a DESTROY back, - * since those conditions would make a DESTROY nonsensical. */ - if (cell->circ_id == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received a create cell (type %d) from %s with zero circID; " - " ignoring.", (int)cell->command, - channel_get_actual_remote_descr(chan)); - return; - } - - if (circuit_id_in_use_on_channel(cell->circ_id, chan)) { - const node_t *node = node_get_by_id(chan->identity_digest); - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received CREATE cell (circID %u) for known circ. " - "Dropping (age %d).", - (unsigned)cell->circ_id, - (int)(time(NULL) - channel_when_created(chan))); - if (node) { - char *p = esc_for_log(node_get_platform(node)); - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Details: router %s, platform %s.", - node_describe(node), p); - tor_free(p); - } - return; - } - if (we_are_hibernating()) { log_info(LD_OR, "Received create cell but we're shutting down. Sending back " @@ -296,6 +248,14 @@ command_process_create_cell(cell_t *cell, channel_t *chan) return; } + if (cell->circ_id == 0) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Received a create cell (type %d) from %s with zero circID; " + " ignoring.", (int)cell->command, + channel_get_actual_remote_descr(chan)); + return; + } + /* If the high bit of the circuit ID is not as expected, close the * circ. */ if (chan->wide_circ_ids) @@ -314,6 +274,23 @@ command_process_create_cell(cell_t *cell, channel_t *chan) return; } + if (circuit_id_in_use_on_channel(cell->circ_id, chan)) { + const node_t *node = node_get_by_id(chan->identity_digest); + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Received CREATE cell (circID %u) for known circ. " + "Dropping (age %d).", + (unsigned)cell->circ_id, + (int)(time(NULL) - channel_when_created(chan))); + if (node) { + char *p = esc_for_log(node_get_platform(node)); + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Details: router %s, platform %s.", + node_describe(node), p); + tor_free(p); + } + return; + } + circ = or_circuit_new(cell->circ_id, chan); circ->base_.purpose = CIRCUIT_PURPOSE_OR; circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_ONIONSKIN_PENDING); @@ -326,20 +303,11 @@ command_process_create_cell(cell_t *cell, channel_t *chan) return; } - if (connection_or_digest_is_known_relay(chan->identity_digest)) { - rep_hist_note_circuit_handshake_requested(create_cell->handshake_type); - // Needed for chutney: Sometimes relays aren't in the consensus yet, and - // get marked as clients. This resets their channels once they appear. - // Probably useful for normal operation wrt relay flapping, too. - channel_clear_client(chan); - } else { - channel_mark_client(chan); - } - if (create_cell->handshake_type != ONION_HANDSHAKE_TYPE_FAST) { /* hand it off to the cpuworkers, and then return. */ - - if (assign_onionskin_to_cpuworker(circ, create_cell) < 0) { + if (connection_or_digest_is_known_relay(chan->identity_digest)) + rep_hist_note_circuit_handshake_requested(create_cell->handshake_type); + if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) { log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); return; @@ -353,6 +321,10 @@ command_process_create_cell(cell_t *cell, channel_t *chan) int len; created_cell_t created_cell; + /* Make sure we never try to use the OR connection on which we + * received this cell to satisfy an EXTEND request, */ + channel_mark_client(chan); + memset(&created_cell, 0, sizeof(created_cell)); len = onion_skin_server_handshake(ONION_HANDSHAKE_TYPE_FAST, create_cell->onionskin, @@ -365,14 +337,14 @@ command_process_create_cell(cell_t *cell, channel_t *chan) if (len < 0) { log_warn(LD_OR,"Failed to generate key material. Closing."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); + tor_free(create_cell); return; } created_cell.cell_type = CELL_CREATED_FAST; created_cell.handshake_len = len; if (onionskin_answer(circ, &created_cell, - (const char *)keys, sizeof(keys), - rend_circ_nonce)<0) { + (const char *)keys, rend_circ_nonce)<0) { log_warn(LD_OR,"Failed to reply to CREATE_FAST cell. Closing."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); return; @@ -404,7 +376,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan) return; } - if (circ->n_circ_id != cell->circ_id || circ->n_chan != chan) { + if (circ->n_circ_id != cell->circ_id) { log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, "got created cell from Tor client? Closing."); circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); @@ -423,6 +395,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan) log_debug(LD_OR,"at OP. Finishing handshake."); if ((err_reason = circuit_finish_handshake(origin_circ, &extended_cell.created_cell)) < 0) { + log_warn(LD_OR,"circuit_finish_handshake failed."); circuit_mark_for_close(circ, -err_reason); return; } @@ -462,7 +435,6 @@ command_process_created_cell(cell_t *cell, channel_t *chan) static void command_process_relay_cell(cell_t *cell, channel_t *chan) { - const or_options_t *options = get_options(); circuit_t *circ; int reason, direction; @@ -489,7 +461,6 @@ command_process_relay_cell(cell_t *cell, channel_t *chan) } if (!CIRCUIT_IS_ORIGIN(circ) && - chan == TO_OR_CIRCUIT(circ)->p_chan && cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) direction = CELL_DIRECTION_OUT; else @@ -499,22 +470,10 @@ command_process_relay_cell(cell_t *cell, channel_t *chan) * gotten no more than MAX_RELAY_EARLY_CELLS_PER_CIRCUIT of them. */ if (cell->command == CELL_RELAY_EARLY) { if (direction == CELL_DIRECTION_IN) { - /* Inbound early cells could once be encountered as a result of - * bug 1038; but relays running versions before 0.2.1.19 are long - * gone from the network, so any such cells now are surprising. */ - log_warn(LD_OR, - "Received an inbound RELAY_EARLY cell on circuit %u." - " Closing circuit. Please report this event," - " along with the following message.", - (unsigned)cell->circ_id); - if (CIRCUIT_IS_ORIGIN(circ)) { - circuit_log_path(LOG_WARN, LD_OR, TO_ORIGIN_CIRCUIT(circ)); - } else if (circ->n_chan) { - log_warn(LD_OR, " upstream=%s", - channel_get_actual_remote_descr(circ->n_chan)); - } - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; + /* Allow an unlimited number of inbound relay_early cells, + * for hidden service compatibility. There isn't any way to make + * a long circuit through inbound relay_early cells anyway. See + * bug 1038. -RD */ } else { or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); if (or_circ->remaining_relay_early_cells == 0) { @@ -536,14 +495,6 @@ command_process_relay_cell(cell_t *cell, channel_t *chan) direction==CELL_DIRECTION_OUT?"forward":"backward"); circuit_mark_for_close(circ, -reason); } - - /* If this is a cell in an RP circuit, count it as part of the - hidden service stats */ - if (options->HiddenServiceStatistics && - !CIRCUIT_IS_ORIGIN(circ) && - TO_OR_CIRCUIT(circ)->circuit_carries_hs_traffic_stats) { - rep_hist_seen_new_rp_cell(); - } } /** Process a 'destroy' cell that just arrived from @@ -578,7 +529,6 @@ command_process_destroy_cell(cell_t *cell, channel_t *chan) circ->received_destroy = 1; if (!CIRCUIT_IS_ORIGIN(circ) && - chan == TO_OR_CIRCUIT(circ)->p_chan && cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) { /* the destroy came from behind */ circuit_set_p_circid_chan(TO_OR_CIRCUIT(circ), 0, NULL); diff --git a/src/tor/src/or/command.h b/src/tor/command.h similarity index 90% rename from src/tor/src/or/command.h rename to src/tor/command.h index c0d1996cb..adea6adea 100644 --- a/src/tor/src/or/command.h +++ b/src/tor/command.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,5 +27,5 @@ extern uint64_t stats_n_created_cells_processed; extern uint64_t stats_n_relay_cells_processed; extern uint64_t stats_n_destroy_cells_processed; -#endif /* !defined(TOR_COMMAND_H) */ +#endif diff --git a/src/tor/common_sha1.i b/src/tor/common_sha1.i new file mode 100644 index 000000000..80ea224a2 --- /dev/null +++ b/src/tor/common_sha1.i @@ -0,0 +1,26 @@ +"10e0ec8ee3318e6a5ebbedc35d45ad4ec2fe5bb2 src/common/aes.c\n" +"7fdacbf7fc104d4e118ce06cf823b2f3cb145291 src/common/crypto.c\n" +"401d6c1243b8d99ad8f64dba232e234e60a59eb7 src/common/crypto_format.c\n" +"64a20b8425300b0bf2373a4fe4eb74b47c4baf50 src/common/torgzip.c\n" +"f0e8fd88f7198ad4adbd5c28e4af909b2d553b5a src/common/tortls.c\n" +"05dc726d9d47888cc75a1c3bd31c8214dc2cb581 src/common/crypto_curve25519.c\n" +"d233965a57506745525c7a78ff2911d59f5e3743 src/common/address.h\n" +"ac6a50ceb318ed6907b5804034b98172ffc5ff83 src/common/backtrace.h\n" +"947ef902f15f556f176b1115f09d9966e377347d src/common/aes.h\n" +"6fb51902eea04b5c33a99a754845958fec43d912 src/common/ciphers.inc\n" +"4618a9860688c2cb12d37d8172317324c10f0a92 src/common/tor_compat.h\n" +"e427c754391f1282a98cbbb387bae2ae403cbde7 src/common/compat_libevent.h\n" +"faaa0bcfcc0cbc61f6d092b9b36e56cb89b090b7 src/common/container.h\n" +"7196fde86ec70bd579e8fcd546817d285d936b18 src/common/crypto.h\n" +"1260154e3b65f2586a54986deffec6963a4c7204 src/common/crypto_curve25519.h\n" +"9ed1bb165e8d0532cae5bfd17e27d037d2a05bf4 src/common/di_ops.h\n" +"697be45dc2e1ae6537b34dc72abf6394952a1b87 src/common/memarea.h\n" +"0b594bada47b6e23358fa924cffbf24e01180d60 src/common/mempool.h\n" +"2cd7af59a82d4e1ca2873d2801c44176605a545a src/common/procmon.h\n" +"ed8b5d4225ceaf11e29fe635a091e2b2f3fe3ae8 src/common/sandbox.h\n" +"ddfdca2f5d52acc27214a3c91c0ca73c81b526eb src/common/testsupport.h\n" +"13108dc9184a7ece65685e0724e7e8770acd576f src/common/torgzip.h\n" +"8d71f0488728c324a5aabfd92d209350973b490a src/common/torint.h\n" +"b86f76bfdfdc3bd841233c662761e857cb830c88 src/common/torlog.h\n" +"27209a8a0e9b8c61bbbb2d50241a2a4b4595ce19 src/common/tortls.h\n" +"e5cb074466d9f59f1988e8964fed1476c238ff14 src/common/tor_util.h\n" diff --git a/src/tor/src/common/compat.c b/src/tor/compat.c similarity index 71% rename from src/tor/src/common/compat.c rename to src/tor/compat.c index b4bd6eba0..541f8d2a9 100644 --- a/src/tor/src/common/compat.c +++ b/src/tor/compat.c @@ -1,22 +1,33 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file compat.c * \brief Wrappers to make calls more portable. This code defines - * functions such as tor_snprintf, get/set various data types, + * functions such as tor_malloc, tor_snprintf, get/set various data types, * renaming, setting socket options, switching user IDs. It is basically * where the non-portable items are conditionally included depending on * the platform. **/ +/* This is required on rh7 to make strptime not complain. + * We also need it to make memmem get defined (where available) + */ +/* XXXX024 We should just use AC_USE_SYSTEM_EXTENSIONS in our autoconf, + * and get this (and other important stuff!) automatically. Once we do that, + * make sure to also change the extern char **environ detection in + * configure.ac, because whether that is declared or not depends on whether + * we have _GNU_SOURCE defined! Maybe that means that once we take this out, + * we can also take out the configure check. */ +#define _GNU_SOURCE + #define COMPAT_PRIVATE -#include "compat.h" +#include "tor_compat.h" #ifdef _WIN32 -#include +#include #include #include #endif @@ -24,21 +35,6 @@ #ifdef HAVE_UNAME #include #endif -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SYSCTL_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_UTIME_H -#include -#endif -#ifdef HAVE_SYS_UTIME_H -#include -#endif #ifdef HAVE_UNISTD_H #include #endif @@ -63,46 +59,20 @@ #ifdef HAVE_CRT_EXTERNS_H #include #endif -#ifdef HAVE_SYS_STATVFS_H -#include + +#ifndef HAVE_GETTIMEOFDAY +#ifdef HAVE_FTIME +#include #endif -#ifdef HAVE_SYS_CAPABILITY_H -#include #endif -#ifdef _WIN32 -#include -#include -/* Some mingw headers lack these. :p */ -#if defined(HAVE_DECL__GETWCH) && !HAVE_DECL__GETWCH -wint_t _getwch(void); -#endif -#ifndef WEOF -#define WEOF (wchar_t)(0xFFFF) -#endif -#if defined(HAVE_DECL_SECUREZEROMEMORY) && !HAVE_DECL_SECUREZEROMEMORY -static inline void -SecureZeroMemory(PVOID ptr, SIZE_T cnt) -{ - volatile char *vcptr = (volatile char*)ptr; - while (cnt--) - *vcptr++ = 0; -} -#endif /* defined(HAVE_DECL_SECUREZEROMEMORY) && !HAVE_DECL_SECUREZEROMEMORY */ -#elif defined(HAVE_READPASSPHRASE_H) -#include -#else -#include "tor_readpassphrase.h" -#endif /* defined(_WIN32) || ... */ - /* Includes for the process attaching prevention */ #if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) -/* Only use the linux prctl; the IRIX prctl is totally different */ #include #elif defined(__APPLE__) #include #include -#endif /* defined(HAVE_SYS_PRCTL_H) && defined(__linux__) || ... */ +#endif #ifdef HAVE_NETDB_H #include @@ -116,6 +86,12 @@ SecureZeroMemory(PVOID ptr, SIZE_T cnt) #ifdef HAVE_SIGNAL_H #include #endif +#ifdef HAVE_UTIME_H +#include +#endif +#ifdef HAVE_SYS_UTIME_H +#include +#endif #ifdef HAVE_SYS_MMAN_H #include #endif @@ -125,9 +101,13 @@ SecureZeroMemory(PVOID ptr, SIZE_T cnt) #ifdef HAVE_SYS_FILE_H #include #endif +#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) +/* Only use the linux prctl; the IRIX prctl is totally different */ +#include +#endif #include "torlog.h" -#include "util.h" +#include "tor_util.h" #include "container.h" #include "address.h" #include "sandbox.h" @@ -140,20 +120,15 @@ SecureZeroMemory(PVOID ptr, SIZE_T cnt) #include "strlcat.c" #endif -/* When set_max_file_descriptors() is called, update this with the max file - * descriptor value so we can use it to check the limit when opening a new - * socket. Default value is what Debian sets as the default hard limit. */ -static int max_sockets = 1024; - /** As open(path, flags, mode), but return an fd with the close-on-exec mode * set. */ int tor_open_cloexec(const char *path, int flags, unsigned mode) { int fd; - const char *p = sandbox_intern_string(path); #ifdef O_CLOEXEC - fd = open(p, flags|O_CLOEXEC, mode); + path = sandbox_intern_string(path); + fd = open(path, flags|O_CLOEXEC, mode); if (fd >= 0) return fd; /* If we got an error, see if it is EINVAL. EINVAL might indicate that, @@ -161,10 +136,9 @@ tor_open_cloexec(const char *path, int flags, unsigned mode) * are running on one without. */ if (errno != EINVAL) return -1; -#endif /* defined(O_CLOEXEC) */ +#endif - log_debug(LD_FS, "Opening %s with flags %x", p, flags); - fd = open(p, flags, mode); + fd = open(path, flags, mode); #ifdef FD_CLOEXEC if (fd >= 0) { if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) { @@ -173,7 +147,7 @@ tor_open_cloexec(const char *path, int flags, unsigned mode) return -1; } } -#endif /* defined(FD_CLOEXEC) */ +#endif return fd; } @@ -191,29 +165,11 @@ tor_fopen_cloexec(const char *path, const char *mode) return NULL; } } -#endif /* defined(FD_CLOEXEC) */ +#endif return result; } -/** As rename(), but work correctly with the sandbox. */ -int -tor_rename(const char *path_old, const char *path_new) -{ - log_debug(LD_FS, "Renaming %s to %s", path_old, path_new); - return rename(sandbox_intern_string(path_old), - sandbox_intern_string(path_new)); -} - -/* Some MinGW builds have sys/mman.h, but not the corresponding symbols. - * Other configs rename the symbols using macros (including getpagesize). - * So check for sys/mman.h and unistd.h, and a getpagesize declaration. */ -#if (defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H) && \ - defined(HAVE_DECL_GETPAGESIZE)) -#define COMPAT_HAS_MMAN_AND_PAGESIZE -#endif - -#if defined(COMPAT_HAS_MMAN_AND_PAGESIZE) || \ - defined(RUNNING_DOXYGEN) +#if defined(HAVE_SYS_MMAN_H) || defined(RUNNING_DOXYGEN) /** Try to create a memory mapping for filename and return it. On * failure, return NULL. Sets errno properly, using ERANGE to mean * "empty file". */ @@ -222,10 +178,9 @@ tor_mmap_file(const char *filename) { int fd; /* router file */ char *string; - int page_size, result; + int page_size; tor_mmap_t *res; size_t size, filesize; - struct stat st; tor_assert(filename); @@ -239,32 +194,13 @@ tor_mmap_file(const char *filename) return NULL; } - /* Get the size of the file */ - result = fstat(fd, &st); - if (result != 0) { - int save_errno = errno; - log_warn(LD_FS, - "Couldn't fstat opened descriptor for \"%s\" during mmap: %s", - filename, strerror(errno)); - close(fd); - errno = save_errno; - return NULL; - } - size = filesize = (size_t)(st.st_size); - /* - * Should we check for weird crap like mmapping a named pipe here, - * or just wait for if (!size) below to fail? - */ + /* XXXX why not just do fstat here? */ + size = filesize = (size_t) lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_SET); /* ensure page alignment */ page_size = getpagesize(); size += (size%page_size) ? page_size-(size%page_size) : 0; - if (st.st_size > SSIZE_T_CEILING || (off_t)size < st.st_size) { - log_warn(LD_FS, "File \"%s\" is too large. Ignoring.",filename); - errno = EFBIG; - close(fd); - return NULL; - } if (!size) { /* Zero-length file. If we call mmap on it, it will succeed but * return NULL, and bad things will happen. So just fail. */ @@ -291,27 +227,12 @@ tor_mmap_file(const char *filename) return res; } -/** Release storage held for a memory mapping; returns 0 on success, - * or -1 on failure (and logs a warning). */ -int +/** Release storage held for a memory mapping. */ +void tor_munmap_file(tor_mmap_t *handle) { - int res; - - if (handle == NULL) - return 0; - - res = munmap((char*)handle->data, handle->mapping_size); - if (res == 0) { - /* munmap() succeeded */ - tor_free(handle); - } else { - log_warn(LD_FS, "Failed to munmap() in tor_munmap_file(): %s", - strerror(errno)); - res = -1; - } - - return res; + munmap((char*)handle->data, handle->mapping_size); + tor_free(handle); } #elif defined(_WIN32) tor_mmap_t * @@ -393,29 +314,17 @@ tor_mmap_file(const char *filename) tor_munmap_file(res); return NULL; } - -/* Unmap the file, and return 0 for success or -1 for failure */ -int +void tor_munmap_file(tor_mmap_t *handle) { - if (handle == NULL) - return 0; - - if (handle->data) { + if (handle->data) /* This is an ugly cast, but without it, "data" in struct tor_mmap_t would have to be redefined as non-const. */ - BOOL ok = UnmapViewOfFile( (LPVOID) handle->data); - if (!ok) { - log_warn(LD_FS, "Failed to UnmapViewOfFile() in tor_munmap_file(): %d", - (int)GetLastError()); - } - } + UnmapViewOfFile( (LPVOID) handle->data); if (handle->mmap_handle != NULL) CloseHandle(handle->mmap_handle); tor_free(handle); - - return 0; } #else tor_mmap_t * @@ -431,27 +340,15 @@ tor_mmap_file(const char *filename) handle->size = st.st_size; return handle; } - -/** Unmap the file mapped with tor_mmap_file(), and return 0 for success - * or -1 for failure. - */ - -int +void tor_munmap_file(tor_mmap_t *handle) { - char *d = NULL; - if (handle == NULL) - return 0; - - d = (char*)handle->data; + char *d = (char*)handle->data; tor_free(d); memwipe(handle, 0, sizeof(tor_mmap_t)); tor_free(handle); - - /* Can't fail in this mmap()/munmap()-free case */ - return 0; } -#endif /* defined(COMPAT_HAS_MMAN_AND_PAGESIZE) || ... || ... */ +#endif /** Replacement for snprintf. Differs from platform snprintf in two * ways: First, always NUL-terminates its output. Second, always @@ -517,10 +414,8 @@ tor_asprintf(char **strp, const char *fmt, ...) r = tor_vasprintf(strp, fmt, args); va_end(args); if (!*strp || r < 0) { - /* LCOV_EXCL_START */ log_err(LD_BUG, "Internal error in asprintf"); tor_assert(0); - /* LCOV_EXCL_STOP */ } return r; } @@ -547,10 +442,7 @@ tor_vasprintf(char **strp, const char *fmt, va_list args) /* On Windows, _vsnprintf won't tell us the length of the string if it * overflows, so we need to use _vcsprintf to tell how much to allocate */ int len, r; - va_list tmp_args; - va_copy(tmp_args, args); - len = _vscprintf(fmt, tmp_args); - va_end(tmp_args); + len = _vscprintf(fmt, args); if (len < 0) { *strp = NULL; return -1; @@ -573,17 +465,14 @@ tor_vasprintf(char **strp, const char *fmt, va_list args) int len, r; va_list tmp_args; va_copy(tmp_args, args); - /* vsnprintf() was properly checked but tor_vsnprintf() available so - * why not use it? */ - len = tor_vsnprintf(buf, sizeof(buf), fmt, tmp_args); + len = vsnprintf(buf, sizeof(buf), fmt, tmp_args); va_end(tmp_args); if (len < (int)sizeof(buf)) { *strp = tor_strdup(buf); return len; } strp_tmp = tor_malloc(len+1); - /* use of tor_vsnprintf() will ensure string is null terminated */ - r = tor_vsnprintf(strp_tmp, len+1, fmt, args); + r = vsnprintf(strp_tmp, len+1, fmt, args); if (r != len) { tor_free(strp_tmp); *strp = NULL; @@ -591,7 +480,7 @@ tor_vasprintf(char **strp, const char *fmt, va_list args) } *strp = strp_tmp; return len; -#endif /* defined(HAVE_VASPRINTF) || ... */ +#endif } /** Given hlen bytes at haystack and nlen bytes at @@ -606,38 +495,30 @@ const void * tor_memmem(const void *_haystack, size_t hlen, const void *_needle, size_t nlen) { -#if defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) +#if defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) && !defined(__APPLE__) tor_assert(nlen); return memmem(_haystack, hlen, _needle, nlen); #else /* This isn't as fast as the GLIBC implementation, but it doesn't need to * be. */ - const char *p, *last_possible_start; + const char *p, *end; const char *haystack = (const char*)_haystack; const char *needle = (const char*)_needle; char first; tor_assert(nlen); - if (nlen > hlen) - return NULL; - p = haystack; - /* Last position at which the needle could start. */ - last_possible_start = haystack + hlen - nlen; + end = haystack + hlen; first = *(const char*)needle; - while ((p = memchr(p, first, last_possible_start + 1 - p))) { + while ((p = memchr(p, first, end-p))) { + if (p+nlen > end) + return NULL; if (fast_memeq(p, needle, nlen)) return p; - if (++p > last_possible_start) { - /* This comparison shouldn't be necessary, since if p was previously - * equal to last_possible_start, the next memchr call would be - * "memchr(p, first, 0)", which will return NULL. But it clarifies the - * logic. */ - return NULL; - } + ++p; } return NULL; -#endif /* defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) */ +#endif } /** @@ -663,7 +544,7 @@ const uint32_t TOR_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; /** Upper-casing and lowercasing tables to map characters to upper/lowercase * equivalents. Used by tor_toupper() and tor_tolower(). */ /**@{*/ -const uint8_t TOR_TOUPPER_TABLE[256] = { +const char TOR_TOUPPER_TABLE[256] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, @@ -681,7 +562,7 @@ const uint8_t TOR_TOUPPER_TABLE[256] = { 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, }; -const uint8_t TOR_TOLOWER_TABLE[256] = { +const char TOR_TOLOWER_TABLE[256] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, @@ -717,8 +598,7 @@ strtok_helper(char *cp, const char *sep) } /** Implementation of strtok_r for platforms whose coders haven't figured out - * how to write one. Hey, retrograde libc developers! You can use this code - * here for free! */ + * how to write one. Hey guys! You can use this code here for free! */ char * tor_strtok_r_impl(char *str, const char *sep, char **lasts) { @@ -775,7 +655,7 @@ tor_fix_source_file(const char *fname) } return r; } -#endif /* defined(_WIN32) */ +#endif /** * Read a 16-bit value beginning at cp. Equivalent to @@ -852,14 +732,13 @@ int replace_file(const char *from, const char *to) { #ifndef _WIN32 - return tor_rename(from, to); + return rename(from,to); #else switch (file_status(to)) { case FN_NOENT: break; case FN_FILE: - case FN_EMPTY: if (unlink(to)) return -1; break; case FN_ERROR: @@ -868,8 +747,8 @@ replace_file(const char *from, const char *to) errno = EISDIR; return -1; } - return tor_rename(from,to); -#endif /* !defined(_WIN32) */ + return rename(from,to); +#endif } /** Change fname's modification time to now. */ @@ -955,7 +834,7 @@ tor_lockfile_lock(const char *filename, int blocking, int *locked_out) return NULL; } } -#endif /* defined(_WIN32) || ... */ +#endif result = tor_malloc(sizeof(tor_lockfile_t)); result->filename = tor_strdup(filename); @@ -983,7 +862,7 @@ tor_lockfile_unlock(tor_lockfile_t *lockfile) } #else /* Closing the lockfile is sufficient. */ -#endif /* defined(_WIN32) || ... */ +#endif close(lockfile->fd); lockfile->fd = -1; @@ -1016,24 +895,15 @@ tor_fd_getpos(int fd) #endif } -/** Move fd to the end of the file. Return -1 on error, 0 on success. - * If the file is a pipe, do nothing and succeed. - **/ +/** Move fd to the end of the file. Return -1 on error, 0 on success. */ int tor_fd_seekend(int fd) { #ifdef _WIN32 return _lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; #else - off_t rc = lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; -#ifdef ESPIPE - /* If we get an error and ESPIPE, then it's a pipe or a socket of a fifo: - * no need to worry. */ - if (rc < 0 && errno == ESPIPE) - rc = 0; -#endif /* defined(ESPIPE) */ - return (rc < 0) ? -1 : 0; -#endif /* defined(_WIN32) */ + return lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; +#endif } /** Move fd to position pos in the file. Return -1 on error, 0 @@ -1048,23 +918,6 @@ tor_fd_setpos(int fd, off_t pos) #endif } -/** Replacement for ftruncate(fd, 0): move to the front of the file and remove - * all the rest of the file. Return -1 on error, 0 on success. */ -int -tor_ftruncate(int fd) -{ - /* Rumor has it that some versions of ftruncate do not move the file pointer. - */ - if (tor_fd_setpos(fd, 0) < 0) - return -1; - -#ifdef _WIN32 - return _chsize(fd, 0); -#else - return ftruncate(fd, 0); -#endif -} - #undef DEBUG_SOCKET_COUNTING #ifdef DEBUG_SOCKET_COUNTING /** A bitarray of all fds that should be passed to tor_socket_close(). Only @@ -1072,7 +925,7 @@ tor_ftruncate(int fd) static bitarray_t *open_sockets = NULL; /** The size of open_sockets, in bits. */ static int max_socket = -1; -#endif /* defined(DEBUG_SOCKET_COUNTING) */ +#endif /** Count of number of sockets currently open. (Undercounts sockets opened by * eventdns and libevent.) */ @@ -1082,7 +935,7 @@ static int n_sockets_open = 0; static tor_mutex_t *socket_accounting_mutex = NULL; /** Helper: acquire the socket accounting lock. */ -static inline void +static INLINE void socket_accounting_lock(void) { if (PREDICT_UNLIKELY(!socket_accounting_mutex)) @@ -1091,7 +944,7 @@ socket_accounting_lock(void) } /** Helper: release the socket accounting lock. */ -static inline void +static INLINE void socket_accounting_unlock(void) { tor_mutex_release(socket_accounting_mutex); @@ -1128,8 +981,8 @@ tor_close_socket_simple(tor_socket_t s) /** As tor_close_socket_simple(), but keeps track of the number * of open sockets. Returns 0 on success, -1 on failure. */ -MOCK_IMPL(int, -tor_close_socket,(tor_socket_t s)) +int +tor_close_socket(tor_socket_t s) { int r = tor_close_socket_simple(s); @@ -1142,7 +995,7 @@ tor_close_socket,(tor_socket_t s)) tor_assert(open_sockets && s <= max_socket); bitarray_clear(open_sockets, s); } -#endif /* defined(DEBUG_SOCKET_COUNTING) */ +#endif if (r == 0) { --n_sockets_open; } else { @@ -1151,12 +1004,14 @@ tor_close_socket,(tor_socket_t s)) --n_sockets_open; #else if (r != EBADF) - --n_sockets_open; // LCOV_EXCL_LINE -- EIO and EINTR too hard to force. -#endif /* defined(_WIN32) */ + --n_sockets_open; +#endif r = -1; } - tor_assert_nonfatal(n_sockets_open >= 0); + if (n_sockets_open < 0) + log_warn(LD_BUG, "Our socket count is below zero: %d. Please submit a " + "bug report.", n_sockets_open); socket_accounting_unlock(); return r; } @@ -1165,7 +1020,7 @@ tor_close_socket,(tor_socket_t s)) #ifdef DEBUG_SOCKET_COUNTING /** Helper: if DEBUG_SOCKET_COUNTING is enabled, remember that s is * now an open socket. */ -static inline void +static INLINE void mark_socket_open(tor_socket_t s) { /* XXXX This bitarray business will NOT work on windows: sockets aren't @@ -1185,26 +1040,18 @@ mark_socket_open(tor_socket_t s) } bitarray_set(open_sockets, s); } -#else /* !(defined(DEBUG_SOCKET_COUNTING)) */ -#define mark_socket_open(s) ((void) (s)) -#endif /* defined(DEBUG_SOCKET_COUNTING) */ +#else +#define mark_socket_open(s) STMT_NIL +#endif /** @} */ /** As socket(), but counts the number of open sockets. */ -MOCK_IMPL(tor_socket_t, -tor_open_socket,(int domain, int type, int protocol)) +tor_socket_t +tor_open_socket(int domain, int type, int protocol) { return tor_open_socket_with_extensions(domain, type, protocol, 1, 0); } -/** Mockable wrapper for connect(). */ -MOCK_IMPL(tor_socket_t, -tor_connect_socket,(tor_socket_t sock, const struct sockaddr *address, - socklen_t address_len)) -{ - return connect(sock,address,address_len); -} - /** As socket(), but creates a nonblocking socket and * counts the number of open sockets. */ tor_socket_t @@ -1222,18 +1069,6 @@ tor_open_socket_with_extensions(int domain, int type, int protocol, int cloexec, int nonblock) { tor_socket_t s; - - /* We are about to create a new file descriptor so make sure we have - * enough of them. */ - if (get_n_open_sockets() >= max_sockets - 1) { -#ifdef _WIN32 - WSASetLastError(WSAEMFILE); -#else - errno = EMFILE; -#endif - return TOR_INVALID_SOCKET; - } - #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | (nonblock ? SOCK_NONBLOCK : 0); @@ -1245,7 +1080,7 @@ tor_open_socket_with_extensions(int domain, int type, int protocol, * support, we are running on one without. */ if (errno != EINVAL) return s; -#endif /* defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) */ +#endif /* SOCK_CLOEXEC && SOCK_NONBLOCK */ s = socket(domain, type, protocol); if (! SOCKET_OK(s)) @@ -1259,9 +1094,9 @@ tor_open_socket_with_extensions(int domain, int type, int protocol, return TOR_INVALID_SOCKET; } } -#else /* !(defined(FD_CLOEXEC)) */ +#else (void)cloexec; -#endif /* defined(FD_CLOEXEC) */ +#endif if (nonblock) { if (set_socket_nonblocking(s) == -1) { @@ -1273,22 +1108,11 @@ tor_open_socket_with_extensions(int domain, int type, int protocol, goto socket_ok; /* So that socket_ok will not be unused. */ socket_ok: - tor_take_socket_ownership(s); - return s; -} - -/** - * For socket accounting: remember that we are the owner of the socket - * s. This will prevent us from overallocating sockets, and prevent us - * from asserting later when we close the socket s. - */ -void -tor_take_socket_ownership(tor_socket_t s) -{ socket_accounting_lock(); ++n_sockets_open; mark_socket_open(s); socket_accounting_unlock(); + return s; } /** As accept(), but counts the number of open sockets. */ @@ -1316,20 +1140,7 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len, int cloexec, int nonblock) { tor_socket_t s; - - /* We are about to create a new file descriptor so make sure we have - * enough of them. */ - if (get_n_open_sockets() >= max_sockets - 1) { -#ifdef _WIN32 - WSASetLastError(WSAEMFILE); -#else - errno = EMFILE; -#endif - return TOR_INVALID_SOCKET; - } - -#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) \ - && defined(SOCK_NONBLOCK) +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | (nonblock ? SOCK_NONBLOCK : 0); s = accept4(sockfd, addr, len, ext_flags); @@ -1341,7 +1152,7 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, * we are missing SOCK_CLOEXEC/SOCK_NONBLOCK support. */ if (errno != EINVAL && errno != ENOSYS) return s; -#endif /* defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) ... */ +#endif s = accept(sockfd, addr, len); if (!SOCKET_OK(s)) @@ -1355,9 +1166,9 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, return TOR_INVALID_SOCKET; } } -#else /* !(defined(FD_CLOEXEC)) */ +#else (void)cloexec; -#endif /* defined(FD_CLOEXEC) */ +#endif if (nonblock) { if (set_socket_nonblocking(s) == -1) { @@ -1369,7 +1180,10 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, goto socket_ok; /* So that socket_ok will not be unused. */ socket_ok: - tor_take_socket_ownership(s); + socket_accounting_lock(); + ++n_sockets_open; + mark_socket_open(s); + socket_accounting_unlock(); return s; } @@ -1384,37 +1198,29 @@ get_n_open_sockets(void) return n; } -/** Mockable wrapper for getsockname(). */ -MOCK_IMPL(int, -tor_getsockname,(tor_socket_t sock, struct sockaddr *address, - socklen_t *address_len)) -{ - return getsockname(sock, address, address_len); -} - /** Turn socket into a nonblocking socket. Return 0 on success, -1 * on failure. */ int -set_socket_nonblocking(tor_socket_t sock) +set_socket_nonblocking(tor_socket_t socket) { #if defined(_WIN32) unsigned long nonblocking = 1; - ioctlsocket(sock, FIONBIO, (unsigned long*) &nonblocking); + ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking); #else int flags; - flags = fcntl(sock, F_GETFL, 0); + flags = fcntl(socket, F_GETFL, 0); if (flags == -1) { log_warn(LD_NET, "Couldn't get file status flags: %s", strerror(errno)); return -1; } flags |= O_NONBLOCK; - if (fcntl(sock, F_SETFL, flags) == -1) { + if (fcntl(socket, F_SETFL, flags) == -1) { log_warn(LD_NET, "Couldn't set file status flags: %s", strerror(errno)); return -1; } -#endif /* defined(_WIN32) */ +#endif return 0; } @@ -1452,7 +1258,7 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) * are running on one without. */ if (errno != EINVAL) return -errno; -#endif /* defined(SOCK_CLOEXEC) */ +#endif r = socketpair(family, type, protocol, fd); if (r < 0) @@ -1475,7 +1281,7 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) return -errno; } } -#endif /* defined(FD_CLOEXEC) */ +#endif goto sockets_ok; /* So that sockets_ok will not be unused. */ sockets_ok: @@ -1491,26 +1297,12 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) socket_accounting_unlock(); return 0; -#else /* !(defined(HAVE_SOCKETPAIR) && !defined(_WIN32)) */ +#else return tor_ersatz_socketpair(family, type, protocol, fd); -#endif /* defined(HAVE_SOCKETPAIR) && !defined(_WIN32) */ +#endif } #ifdef NEED_ERSATZ_SOCKETPAIR - -static inline socklen_t -SIZEOF_SOCKADDR(int domain) -{ - switch (domain) { - case AF_INET: - return sizeof(struct sockaddr_in); - case AF_INET6: - return sizeof(struct sockaddr_in6); - default: - return 0; - } -} - /** * Helper used to implement socketpair on systems that lack it, by * making a direct connection to localhost. @@ -1526,21 +1318,10 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) tor_socket_t listener = TOR_INVALID_SOCKET; tor_socket_t connector = TOR_INVALID_SOCKET; tor_socket_t acceptor = TOR_INVALID_SOCKET; - tor_addr_t listen_tor_addr; - struct sockaddr_storage connect_addr_ss, listen_addr_ss; - struct sockaddr *listen_addr = (struct sockaddr *) &listen_addr_ss; - uint16_t listen_port = 0; - tor_addr_t connect_tor_addr; - uint16_t connect_port = 0; - struct sockaddr *connect_addr = (struct sockaddr *) &connect_addr_ss; + struct sockaddr_in listen_addr; + struct sockaddr_in connect_addr; socklen_t size; int saved_errno = -1; - int ersatz_domain = AF_INET; - - memset(&connect_tor_addr, 0, sizeof(connect_tor_addr)); - memset(&connect_addr_ss, 0, sizeof(connect_addr_ss)); - memset(&listen_tor_addr, 0, sizeof(listen_tor_addr)); - memset(&listen_addr_ss, 0, sizeof(listen_addr_ss)); if (protocol #ifdef AF_UNIX @@ -1557,71 +1338,47 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) return -EINVAL; } - listener = tor_open_socket(ersatz_domain, type, 0); - if (!SOCKET_OK(listener)) { - int first_errno = tor_socket_errno(-1); - if (first_errno == SOCK_ERRNO(EPROTONOSUPPORT) - && ersatz_domain == AF_INET) { - /* Assume we're on an IPv6-only system */ - ersatz_domain = AF_INET6; - listener = tor_open_socket(ersatz_domain, type, 0); - if (!SOCKET_OK(listener)) { - /* Keep the previous behaviour, which was to return the IPv4 error. - * (This may be less informative on IPv6-only systems.) - * XX/teor - is there a better way to decide which errno to return? - * (I doubt we care much either way, once there is an error.) - */ - return -first_errno; - } - } - } - /* If there is no 127.0.0.1 or ::1, this will and must fail. Otherwise, we - * risk exposing a socketpair on a routable IP address. (Some BSD jails - * use a routable address for localhost. Fortunately, they have the real - * AF_UNIX socketpair.) */ - if (ersatz_domain == AF_INET) { - tor_addr_from_ipv4h(&listen_tor_addr, INADDR_LOOPBACK); - } else { - tor_addr_parse(&listen_tor_addr, "[::1]"); - } - tor_assert(tor_addr_is_loopback(&listen_tor_addr)); - size = tor_addr_to_sockaddr(&listen_tor_addr, - 0 /* kernel chooses port. */, - listen_addr, - sizeof(listen_addr_ss)); - if (bind(listener, listen_addr, size) == -1) + listener = tor_open_socket(AF_INET, type, 0); + if (!SOCKET_OK(listener)) + return -tor_socket_errno(-1); + memset(&listen_addr, 0, sizeof(listen_addr)); + listen_addr.sin_family = AF_INET; + listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + listen_addr.sin_port = 0; /* kernel chooses port. */ + if (bind(listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr)) + == -1) goto tidy_up_and_fail; if (listen(listener, 1) == -1) goto tidy_up_and_fail; - connector = tor_open_socket(ersatz_domain, type, 0); + connector = tor_open_socket(AF_INET, type, 0); if (!SOCKET_OK(connector)) goto tidy_up_and_fail; /* We want to find out the port number to connect to. */ - size = sizeof(connect_addr_ss); - if (getsockname(listener, connect_addr, &size) == -1) + size = sizeof(connect_addr); + if (getsockname(listener, (struct sockaddr *) &connect_addr, &size) == -1) goto tidy_up_and_fail; - if (size != SIZEOF_SOCKADDR (connect_addr->sa_family)) + if (size != sizeof (connect_addr)) goto abort_tidy_up_and_fail; - if (connect(connector, connect_addr, size) == -1) + if (connect(connector, (struct sockaddr *) &connect_addr, + sizeof(connect_addr)) == -1) goto tidy_up_and_fail; - size = sizeof(listen_addr_ss); - acceptor = tor_accept_socket(listener, listen_addr, &size); + size = sizeof(listen_addr); + acceptor = tor_accept_socket(listener, + (struct sockaddr *) &listen_addr, &size); if (!SOCKET_OK(acceptor)) goto tidy_up_and_fail; - if (size != SIZEOF_SOCKADDR(listen_addr->sa_family)) + if (size != sizeof(listen_addr)) goto abort_tidy_up_and_fail; /* Now check we are talking to ourself by matching port and host on the two sockets. */ - if (getsockname(connector, connect_addr, &size) == -1) + if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1) goto tidy_up_and_fail; - /* Set *_tor_addr and *_port to the address and port that was used */ - tor_addr_from_sockaddr(&listen_tor_addr, listen_addr, &listen_port); - tor_addr_from_sockaddr(&connect_tor_addr, connect_addr, &connect_port); - if (size != SIZEOF_SOCKADDR (connect_addr->sa_family) - || tor_addr_compare(&listen_tor_addr, &connect_tor_addr, CMP_SEMANTIC) - || listen_port != connect_port) { + if (size != sizeof (connect_addr) + || listen_addr.sin_family != connect_addr.sin_family + || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr + || listen_addr.sin_port != connect_addr.sin_port) { goto abort_tidy_up_and_fail; } tor_close_socket(listener); @@ -1647,48 +1404,26 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) tor_close_socket(acceptor); return -saved_errno; } - -#undef SIZEOF_SOCKADDR - -#endif /* defined(NEED_ERSATZ_SOCKETPAIR) */ - -/* Return the maximum number of allowed sockets. */ -int -get_max_sockets(void) -{ - return max_sockets; -} +#endif /** Number of extra file descriptors to keep in reserve beyond those that we * tell Tor it's allowed to use. */ #define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond ConnLimit_ */ -/** Learn the maximum allowed number of file descriptors, and tell the - * system we want to use up to that number. (Some systems have a low soft - * limit, and let us set it higher.) We compute this by finding the largest - * number that we can use. +/** Learn the maximum allowed number of file descriptors, and tell the system + * we want to use up to that number. (Some systems have a low soft limit, and + * let us set it higher.) * - * If the limit is below the reserved file descriptor value (ULIMIT_BUFFER), - * return -1 and max_out is untouched. + * We compute this by finding the largest number that we can use. + * If we can't find a number greater than or equal to limit, + * then we fail: return -1. * - * If we can't find a number greater than or equal to limit, then we - * fail by returning -1 and max_out is untouched. + * If limit is 0, then do not adjust the current maximum. * - * If we are unable to set the limit value because of setrlimit() failing, - * return -1 and max_out is set to the current maximum value returned - * by getrlimit(). - * - * Otherwise, return 0 and store the maximum we found inside max_out - * and set max_sockets with that value as well.*/ + * Otherwise, return 0 and store the maximum we found inside max_out.*/ int set_max_file_descriptors(rlim_t limit, int *max_out) { - if (limit < ULIMIT_BUFFER) { - log_warn(LD_CONFIG, - "ConnLimit must be at least %d. Failing.", ULIMIT_BUFFER); - return -1; - } - /* Define some maximum connections values for systems where we cannot * automatically determine a limit. Re Cygwin, see * http://archives.seul.org/or/talk/Aug-2006/msg00210.html @@ -1704,7 +1439,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out) #else const char *platform = "unknown platforms with no getrlimit()"; const unsigned long MAX_CONNECTIONS = 15000; -#endif /* defined(CYGWIN) || defined(__CYGWIN__) || ... */ +#endif log_fn(LOG_INFO, LD_NET, "This platform is missing getrlimit(). Proceeding."); if (limit > MAX_CONNECTIONS) { @@ -1715,7 +1450,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out) return -1; } limit = MAX_CONNECTIONS; -#else /* !(!defined(HAVE_GETRLIMIT)) */ +#else /* HAVE_GETRLIMIT */ struct rlimit rlim; if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { @@ -1723,6 +1458,14 @@ set_max_file_descriptors(rlim_t limit, int *max_out) strerror(errno)); return -1; } + if (limit == 0) { + /* If limit == 0, return the maximum value without setting it. */ + limit = rlim.rlim_max; + if (limit > INT_MAX) + limit = INT_MAX; + *max_out = (int)limit - ULIMIT_BUFFER; + return 0; + } if (rlim.rlim_max < limit) { log_warn(LD_CONFIG,"We need %lu file descriptors available, and we're " "limited to %lu. Please change your ulimit -n.", @@ -1734,37 +1477,29 @@ set_max_file_descriptors(rlim_t limit, int *max_out) log_info(LD_NET,"Raising max file descriptors from %lu to %lu.", (unsigned long)rlim.rlim_cur, (unsigned long)rlim.rlim_max); } - /* Set the current limit value so if the attempt to set the limit to the - * max fails at least we'll have a valid value of maximum sockets. */ - *max_out = max_sockets = (int)rlim.rlim_cur - ULIMIT_BUFFER; rlim.rlim_cur = rlim.rlim_max; if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) { int bad = 1; #ifdef OPEN_MAX - uint64_t try_limit = OPEN_MAX - ULIMIT_BUFFER; - if (errno == EINVAL && try_limit < (uint64_t) rlim.rlim_cur) { + if (errno == EINVAL && OPEN_MAX < rlim.rlim_cur) { /* On some platforms, OPEN_MAX is the real limit, and getrlimit() is * full of nasty lies. I'm looking at you, OSX 10.5.... */ - rlim.rlim_cur = try_limit; + rlim.rlim_cur = OPEN_MAX; if (setrlimit(RLIMIT_NOFILE, &rlim) == 0) { if (rlim.rlim_cur < (rlim_t)limit) { log_warn(LD_CONFIG, "We are limited to %lu file descriptors by " - "OPEN_MAX (%lu), and ConnLimit is %lu. Changing " - "ConnLimit; sorry.", - (unsigned long)try_limit, (unsigned long)OPEN_MAX, - (unsigned long)limit); + "OPEN_MAX, and ConnLimit is %lu. Changing ConnLimit; sorry.", + (unsigned long)OPEN_MAX, (unsigned long)limit); } else { - log_info(LD_CONFIG, "Dropped connection limit to %lu based on " - "OPEN_MAX (%lu); Apparently, %lu was too high and rlimit " - "lied to us.", - (unsigned long)try_limit, (unsigned long)OPEN_MAX, - (unsigned long)rlim.rlim_max); + log_info(LD_CONFIG, "Dropped connection limit to OPEN_MAX (%lu); " + "Apparently, %lu was too high and rlimit lied to us.", + (unsigned long)OPEN_MAX, (unsigned long)rlim.rlim_max); } bad = 0; } } -#endif /* defined(OPEN_MAX) */ +#endif /* OPEN_MAX */ if (bad) { log_warn(LD_CONFIG,"Couldn't set maximum number of file descriptors: %s", strerror(errno)); @@ -1773,12 +1508,17 @@ set_max_file_descriptors(rlim_t limit, int *max_out) } /* leave some overhead for logs, etc, */ limit = rlim.rlim_cur; -#endif /* !defined(HAVE_GETRLIMIT) */ +#endif /* HAVE_GETRLIMIT */ + if (limit < ULIMIT_BUFFER) { + log_warn(LD_CONFIG, + "ConnLimit must be at least %d. Failing.", ULIMIT_BUFFER); + return -1; + } if (limit > INT_MAX) limit = INT_MAX; tor_assert(max_out); - *max_out = max_sockets = (int)limit - ULIMIT_BUFFER; + *max_out = (int)limit - ULIMIT_BUFFER; return 0; } @@ -1811,7 +1551,7 @@ log_credential_status(void) "UID is %u (real), %u (effective), %u (saved)", (unsigned)ruid, (unsigned)euid, (unsigned)suid); } -#else /* !(defined(HAVE_GETRESUID)) */ +#else /* getresuid is not present on MacOS X, so we can't get the saved (E)UID */ ruid = getuid(); euid = geteuid(); @@ -1820,7 +1560,7 @@ log_credential_status(void) log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, "UID is %u (real), %u (effective), unknown (saved)", (unsigned)ruid, (unsigned)euid); -#endif /* defined(HAVE_GETRESUID) */ +#endif /* log GIDs */ #ifdef HAVE_GETRESGID @@ -1832,7 +1572,7 @@ log_credential_status(void) "GID is %u (real), %u (effective), %u (saved)", (unsigned)rgid, (unsigned)egid, (unsigned)sgid); } -#else /* !(defined(HAVE_GETRESGID)) */ +#else /* getresgid is not present on MacOS X, so we can't get the saved (E)GID */ rgid = getgid(); egid = getegid(); @@ -1840,16 +1580,16 @@ log_credential_status(void) log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, "GID is %u (real), %u (effective), unknown (saved)", (unsigned)rgid, (unsigned)egid); -#endif /* defined(HAVE_GETRESGID) */ +#endif /* log supplementary groups */ sup_gids_size = 64; - sup_gids = tor_calloc(64, sizeof(gid_t)); + sup_gids = tor_malloc(sizeof(gid_t) * 64); while ((ngids = getgroups(sup_gids_size, sup_gids)) < 0 && errno == EINVAL && sup_gids_size < NGROUPS_MAX) { sup_gids_size *= 2; - sup_gids = tor_reallocarray(sup_gids, sizeof(gid_t), sup_gids_size); + sup_gids = tor_realloc(sup_gids, sizeof(gid_t) * sup_gids_size); } if (ngids < 0) { @@ -1880,262 +1620,63 @@ log_credential_status(void) return 0; } -#endif /* !defined(_WIN32) */ - -#ifndef _WIN32 -/** Cached struct from the last getpwname() call we did successfully. */ -static struct passwd *passwd_cached = NULL; +#endif -/** Helper: copy a struct passwd object. - * - * We only copy the fields pw_uid, pw_gid, pw_name, pw_dir. Tor doesn't use - * any others, and I don't want to run into incompatibilities. +/** Call setuid and setgid to run as user and switch to their + * primary group. Return 0 on success. On failure, log and return -1. */ -static struct passwd * -tor_passwd_dup(const struct passwd *pw) +int +switch_id(const char *user) { - struct passwd *new_pw = tor_malloc_zero(sizeof(struct passwd)); - if (pw->pw_name) - new_pw->pw_name = tor_strdup(pw->pw_name); - if (pw->pw_dir) - new_pw->pw_dir = tor_strdup(pw->pw_dir); - new_pw->pw_uid = pw->pw_uid; - new_pw->pw_gid = pw->pw_gid; +#ifndef _WIN32 + struct passwd *pw = NULL; + uid_t old_uid; + gid_t old_gid; + static int have_already_switched_id = 0; - return new_pw; -} + tor_assert(user); -#define tor_passwd_free(pw) \ - FREE_AND_NULL(struct passwd, tor_passwd_free_, (pw)) + if (have_already_switched_id) + return 0; -/** Helper: free one of our cached 'struct passwd' values. */ -static void -tor_passwd_free_(struct passwd *pw) -{ - if (!pw) - return; + /* Log the initial credential state */ + if (log_credential_status()) + return -1; - tor_free(pw->pw_name); - tor_free(pw->pw_dir); - tor_free(pw); -} + log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, "Changing user and groups"); -/** Wrapper around getpwnam() that caches result. Used so that we don't need - * to give the sandbox access to /etc/passwd. - * - * The following fields alone will definitely be copied in the output: pw_uid, - * pw_gid, pw_name, pw_dir. Other fields are not present in cached values. - * - * When called with a NULL argument, this function clears storage associated - * with static variables it uses. - **/ -const struct passwd * -tor_getpwnam(const char *username) -{ - struct passwd *pw; + /* Get old UID/GID to check if we changed correctly */ + old_uid = getuid(); + old_gid = getgid(); - if (username == NULL) { - tor_passwd_free(passwd_cached); - passwd_cached = NULL; - return NULL; + /* Lookup the user and group information, if we have a problem, bail out. */ + pw = getpwnam(user); + if (pw == NULL) { + log_warn(LD_CONFIG, "Error setting configured user: %s not found", user); + return -1; } - if ((pw = getpwnam(username))) { - tor_passwd_free(passwd_cached); - passwd_cached = tor_passwd_dup(pw); - log_info(LD_GENERAL, "Caching new entry %s for %s", - passwd_cached->pw_name, username); - return pw; + /* Properly switch egid,gid,euid,uid here or bail out */ + if (setgroups(1, &pw->pw_gid)) { + log_warn(LD_GENERAL, "Error setting groups to gid %d: \"%s\".", + (int)pw->pw_gid, strerror(errno)); + if (old_uid == pw->pw_uid) { + log_warn(LD_GENERAL, "Tor is already running as %s. You do not need " + "the \"User\" option if you are already running as the user " + "you want to be. (If you did not set the User option in your " + "torrc, check whether it was specified on the command line " + "by a startup script.)", user); + } else { + log_warn(LD_GENERAL, "If you set the \"User\" option, you must start Tor" + " as root."); + } + return -1; } - /* Lookup failed */ - if (! passwd_cached || ! passwd_cached->pw_name) - return NULL; - - if (! strcmp(username, passwd_cached->pw_name)) - return passwd_cached; // LCOV_EXCL_LINE - would need to make getpwnam flaky - - return NULL; -} - -/** Wrapper around getpwnam() that can use cached result from - * tor_getpwnam(). Used so that we don't need to give the sandbox access to - * /etc/passwd. - * - * The following fields alone will definitely be copied in the output: pw_uid, - * pw_gid, pw_name, pw_dir. Other fields are not present in cached values. - */ -const struct passwd * -tor_getpwuid(uid_t uid) -{ - struct passwd *pw; - - if ((pw = getpwuid(uid))) { - return pw; - } - - /* Lookup failed */ - if (! passwd_cached) - return NULL; - - if (uid == passwd_cached->pw_uid) - return passwd_cached; // LCOV_EXCL_LINE - would need to make getpwnam flaky - - return NULL; -} -#endif /* !defined(_WIN32) */ - -/** Return true iff we were compiled with capability support, and capabilities - * seem to work. **/ -int -have_capability_support(void) -{ -#ifdef HAVE_LINUX_CAPABILITIES - cap_t caps = cap_get_proc(); - if (caps == NULL) - return 0; - cap_free(caps); - return 1; -#else /* !(defined(HAVE_LINUX_CAPABILITIES)) */ - return 0; -#endif /* defined(HAVE_LINUX_CAPABILITIES) */ -} - -#ifdef HAVE_LINUX_CAPABILITIES -/** Helper. Drop all capabilities but a small set, and set PR_KEEPCAPS as - * appropriate. - * - * If pre_setuid, retain only CAP_NET_BIND_SERVICE, CAP_SETUID, and - * CAP_SETGID, and use PR_KEEPCAPS to ensure that capabilities persist across - * setuid(). - * - * If not pre_setuid, retain only CAP_NET_BIND_SERVICE, and disable - * PR_KEEPCAPS. - * - * Return 0 on success, and -1 on failure. - */ -static int -drop_capabilities(int pre_setuid) -{ - /* We keep these three capabilities, and these only, as we setuid. - * After we setuid, we drop all but the first. */ - const cap_value_t caplist[] = { - CAP_NET_BIND_SERVICE, CAP_SETUID, CAP_SETGID - }; - const char *where = pre_setuid ? "pre-setuid" : "post-setuid"; - const int n_effective = pre_setuid ? 3 : 1; - const int n_permitted = pre_setuid ? 3 : 1; - const int n_inheritable = 1; - const int keepcaps = pre_setuid ? 1 : 0; - - /* Sets whether we keep capabilities across a setuid. */ - if (prctl(PR_SET_KEEPCAPS, keepcaps) < 0) { - log_warn(LD_CONFIG, "Unable to call prctl() %s: %s", - where, strerror(errno)); - return -1; - } - - cap_t caps = cap_get_proc(); - if (!caps) { - log_warn(LD_CONFIG, "Unable to call cap_get_proc() %s: %s", - where, strerror(errno)); - return -1; - } - cap_clear(caps); - - cap_set_flag(caps, CAP_EFFECTIVE, n_effective, caplist, CAP_SET); - cap_set_flag(caps, CAP_PERMITTED, n_permitted, caplist, CAP_SET); - cap_set_flag(caps, CAP_INHERITABLE, n_inheritable, caplist, CAP_SET); - - int r = cap_set_proc(caps); - cap_free(caps); - if (r < 0) { - log_warn(LD_CONFIG, "No permission to set capabilities %s: %s", - where, strerror(errno)); - return -1; - } - - return 0; -} -#endif /* defined(HAVE_LINUX_CAPABILITIES) */ - -/** Call setuid and setgid to run as user and switch to their - * primary group. Return 0 on success. On failure, log and return -1. - * - * If SWITCH_ID_KEEP_BINDLOW is set in 'flags', try to use the capability - * system to retain the abilitity to bind low ports. - * - * If SWITCH_ID_WARN_IF_NO_CAPS is set in flags, also warn if we have - * don't have capability support. - */ -int -switch_id(const char *user, const unsigned flags) -{ -#ifndef _WIN32 - const struct passwd *pw = NULL; - uid_t old_uid; - gid_t old_gid; - static int have_already_switched_id = 0; - const int keep_bindlow = !!(flags & SWITCH_ID_KEEP_BINDLOW); - const int warn_if_no_caps = !!(flags & SWITCH_ID_WARN_IF_NO_CAPS); - - tor_assert(user); - - if (have_already_switched_id) - return 0; - - /* Log the initial credential state */ - if (log_credential_status()) - return -1; - - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, "Changing user and groups"); - - /* Get old UID/GID to check if we changed correctly */ - old_uid = getuid(); - old_gid = getgid(); - - /* Lookup the user and group information, if we have a problem, bail out. */ - pw = tor_getpwnam(user); - if (pw == NULL) { - log_warn(LD_CONFIG, "Error setting configured user: %s not found", user); - return -1; - } - -#ifdef HAVE_LINUX_CAPABILITIES - (void) warn_if_no_caps; - if (keep_bindlow) { - if (drop_capabilities(1)) - return -1; - } -#else /* !(defined(HAVE_LINUX_CAPABILITIES)) */ - (void) keep_bindlow; - if (warn_if_no_caps) { - log_warn(LD_CONFIG, "KeepBindCapabilities set, but no capability support " - "on this system."); - } -#endif /* defined(HAVE_LINUX_CAPABILITIES) */ - - /* Properly switch egid,gid,euid,uid here or bail out */ - if (setgroups(1, &pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting groups to gid %d: \"%s\".", - (int)pw->pw_gid, strerror(errno)); - if (old_uid == pw->pw_uid) { - log_warn(LD_GENERAL, "Tor is already running as %s. You do not need " - "the \"User\" option if you are already running as the user " - "you want to be. (If you did not set the User option in your " - "torrc, check whether it was specified on the command line " - "by a startup script.)", user); - } else { - log_warn(LD_GENERAL, "If you set the \"User\" option, you must start Tor" - " as root."); - } - return -1; - } - - if (setegid(pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting egid to %d: %s", - (int)pw->pw_gid, strerror(errno)); - return -1; + if (setegid(pw->pw_gid)) { + log_warn(LD_GENERAL, "Error setting egid to %d: %s", + (int)pw->pw_gid, strerror(errno)); + return -1; } if (setgid(pw->pw_gid)) { @@ -2168,12 +1709,6 @@ switch_id(const char *user, const unsigned flags) /* We've properly switched egid, gid, euid, uid, and supplementary groups if * we're here. */ -#ifdef HAVE_LINUX_CAPABILITIES - if (keep_bindlow) { - if (drop_capabilities(0)) - return -1; - } -#endif /* defined(HAVE_LINUX_CAPABILITIES) */ #if !defined(CYGWIN) && !defined(__CYGWIN__) /* If we tried to drop privilege to a group/user other than root, attempt to @@ -2197,7 +1732,7 @@ switch_id(const char *user, const unsigned flags) return -1; } } -#endif /* !defined(CYGWIN) && !defined(__CYGWIN__) */ +#endif /* Check what really happened */ if (log_credential_status()) { @@ -2206,8 +1741,8 @@ switch_id(const char *user, const unsigned flags) have_already_switched_id = 1; /* mark success so we never try again */ -#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && \ - defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) +#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && defined(HAVE_PRCTL) +#ifdef PR_SET_DUMPABLE if (pw->pw_uid) { /* Re-enable core dumps if we're not running as root. */ log_info(LD_CONFIG, "Re-enabling coredumps"); @@ -2215,16 +1750,17 @@ switch_id(const char *user, const unsigned flags) log_warn(LD_CONFIG, "Unable to re-enable coredumps: %s",strerror(errno)); } } -#endif /* defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && ... */ +#endif +#endif return 0; -#else /* !(!defined(_WIN32)) */ +#else (void)user; - (void)flags; - log_warn(LD_CONFIG, "Switching users is unsupported on your OS."); + log_warn(LD_CONFIG, + "User specified but switching users is unsupported on your OS."); return -1; -#endif /* !defined(_WIN32) */ +#endif } /* We only use the linux prctl for now. There is no Win32 support; this may @@ -2247,32 +1783,35 @@ switch_id(const char *user, const unsigned flags) int tor_disable_debugger_attach(void) { - int r = -1; + int r, attempted; + r = -1; + attempted = 0; log_debug(LD_CONFIG, "Attemping to disable debugger attachment to Tor for " "unprivileged users."); -#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) \ - && defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) -#define TRIED_TO_DISABLE +#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && defined(HAVE_PRCTL) +#ifdef PR_SET_DUMPABLE + attempted = 1; r = prctl(PR_SET_DUMPABLE, 0); -#elif defined(__APPLE__) && defined(PT_DENY_ATTACH) -#define TRIED_TO_ATTACH - r = ptrace(PT_DENY_ATTACH, 0, 0, 0); -#endif /* defined(__linux__) && defined(HAVE_SYS_PRCTL_H) ... || ... */ +#endif +#endif +#if defined(__APPLE__) && defined(PT_DENY_ATTACH) + if (r < 0) { + attempted = 1; + r = ptrace(PT_DENY_ATTACH, 0, 0, 0); + } +#endif // XXX: TODO - Mac OS X has dtrace and this may be disabled. // XXX: TODO - Windows probably has something similar -#ifdef TRIED_TO_DISABLE - if (r == 0) { + if (r == 0 && attempted) { log_debug(LD_CONFIG,"Debugger attachment disabled for " "unprivileged users."); return 1; - } else { + } else if (attempted) { log_warn(LD_CONFIG, "Unable to disable debugger attaching: %s", strerror(errno)); } -#endif /* defined(TRIED_TO_DISABLE) */ -#undef TRIED_TO_DISABLE return r; } @@ -2282,16 +1821,16 @@ tor_disable_debugger_attach(void) char * get_user_homedir(const char *username) { - const struct passwd *pw; + struct passwd *pw; tor_assert(username); - if (!(pw = tor_getpwnam(username))) { + if (!(pw = getpwnam(username))) { log_err(LD_CONFIG,"User \"%s\" not found.", username); return NULL; } return tor_strdup(pw->pw_dir); } -#endif /* defined(HAVE_PWD_H) */ +#endif /** Modify fname to contain the name of its parent directory. Doesn't * actually examine the filesystem; does a purely syntactic modification. @@ -2319,7 +1858,7 @@ get_parent_directory(char *fname) if (fname[0] && fname[1] == ':') { fname += 2; } -#endif /* defined(_WIN32) */ +#endif /* Now we want to remove all path-separators at the end of the string, * and to remove the end of the string starting with the path separator * before the last non-path-separator. In perl, this would be @@ -2358,36 +1897,30 @@ get_parent_directory(char *fname) static char * alloc_getcwd(void) { -#ifdef HAVE_GET_CURRENT_DIR_NAME - /* Glibc makes this nice and simple for us. */ - char *cwd = get_current_dir_name(); - char *result = NULL; - if (cwd) { - /* We make a copy here, in case tor_malloc() is not malloc(). */ - result = tor_strdup(cwd); - raw_free(cwd); // alias for free to avoid tripping check-spaces. - } - return result; -#else /* !(defined(HAVE_GET_CURRENT_DIR_NAME)) */ - size_t size = 1024; - char *buf = NULL; - char *ptr = NULL; - - while (ptr == NULL) { - buf = tor_realloc(buf, size); - ptr = getcwd(buf, size); - - if (ptr == NULL && errno != ERANGE) { - tor_free(buf); - return NULL; + int saved_errno = errno; +/* We use this as a starting path length. Not too large seems sane. */ +#define START_PATH_LENGTH 128 +/* Nobody has a maxpath longer than this, as far as I know. And if they + * do, they shouldn't. */ +#define MAX_SANE_PATH_LENGTH 4096 + size_t path_length = START_PATH_LENGTH; + char *path = tor_malloc(path_length); + + errno = 0; + while (getcwd(path, path_length) == NULL) { + if (errno == ERANGE && path_length < MAX_SANE_PATH_LENGTH) { + path_length*=2; + path = tor_realloc(path, path_length); + } else { + tor_free(path); + path = NULL; + break; + } } - - size *= 2; - } - return buf; -#endif /* defined(HAVE_GET_CURRENT_DIR_NAME) */ + errno = saved_errno; + return path; } -#endif /* !defined(_WIN32) */ +#endif /** Expand possibly relative path fname to an absolute path. * Return a newly allocated string, possibly equal to fname. */ @@ -2400,10 +1933,10 @@ make_path_absolute(char *fname) /* We don't want to assume that tor_free can free a string allocated * with malloc. On failure, return fname (it's better than nothing). */ char *absfname = tor_strdup(absfname_malloced ? absfname_malloced : fname); - if (absfname_malloced) raw_free(absfname_malloced); + if (absfname_malloced) free(absfname_malloced); return absfname; -#else /* !(defined(_WIN32)) */ +#else char *absfname = NULL, *path = NULL; tor_assert(fname); @@ -2416,17 +1949,15 @@ make_path_absolute(char *fname) tor_asprintf(&absfname, "%s/%s", path, fname); tor_free(path); } else { - /* LCOV_EXCL_START Can't make getcwd fail. */ /* If getcwd failed, the best we can do here is keep using the * relative path. (Perhaps / isn't readable by this UID/GID.) */ log_warn(LD_GENERAL, "Unable to find current working directory: %s", strerror(errno)); absfname = tor_strdup(fname); - /* LCOV_EXCL_STOP */ } } return absfname; -#endif /* defined(_WIN32) */ +#endif } #ifndef HAVE__NSGETENVIRON @@ -2435,8 +1966,8 @@ make_path_absolute(char *fname) #ifndef RUNNING_DOXYGEN extern char **environ; #endif -#endif /* !defined(HAVE_EXTERN_ENVIRON_DECLARED) */ -#endif /* !defined(HAVE__NSGETENVIRON) */ +#endif +#endif /** Return the current environment. This is a portable replacement for * 'environ'. */ @@ -2448,25 +1979,14 @@ get_environment(void) * when we do a mostly-static build on OSX 10.7, the resulting binary won't * work on OSX 10.6. */ return *_NSGetEnviron(); -#else /* !(defined(HAVE__NSGETENVIRON)) */ +#else return environ; -#endif /* defined(HAVE__NSGETENVIRON) */ -} - -/** Get name of current host and write it to name array, whose - * length is specified by namelen argument. Return 0 upon - * successfull completion; otherwise return return -1. (Currently, - * this function is merely a mockable wrapper for POSIX gethostname().) - */ -MOCK_IMPL(int, -tor_gethostname,(char *name, size_t namelen)) -{ - return gethostname(name,namelen); +#endif } -/** Set *addr to the IP address (in dotted-quad notation) stored in *str. - * Return 1 on success, 0 if *str is badly formatted. - * (Like inet_aton(str,addr), but works on Windows and Solaris.) +/** Set *addr to the IP address (in dotted-quad notation) stored in c. + * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), + * but works on Windows and Solaris.) */ int tor_inet_aton(const char *str, struct in_addr* addr) @@ -2591,7 +2111,6 @@ tor_inet_pton(int af, const char *src, void *dst) int gapPos = -1, i, setWords=0; const char *dot = strchr(src, '.'); const char *eow; /* end of words. */ - memset(words, 0xf8, sizeof(words)); if (dot == src) return 0; else if (!dot) @@ -2599,10 +2118,8 @@ tor_inet_pton(int af, const char *src, void *dst) else { unsigned byte1,byte2,byte3,byte4; char more; - for (eow = dot-1; eow > src && TOR_ISDIGIT(*eow); --eow) + for (eow = dot-1; eow >= src && TOR_ISDIGIT(*eow); --eow) ; - if (*eow != ':') - return 0; ++eow; /* We use "scanf" because some platform inet_aton()s are too lax @@ -2627,12 +2144,8 @@ tor_inet_pton(int af, const char *src, void *dst) char *next; ssize_t len; long r = strtol(src, &next, 16); - if (next == NULL || next == src) { - /* The 'next == src' error case can happen on versions of openbsd - * which treat "0xfoo" as an error, rather than as "0" followed by - * "xfoo". */ - return 0; - } + tor_assert(next != NULL); + tor_assert(next != src); len = *next == '\0' ? eow - src : next - src; if (len > 4) @@ -2691,9 +2204,8 @@ tor_inet_pton(int af, const char *src, void *dst) * (This function exists because standard windows gethostbyname * doesn't treat raw IP addresses properly.) */ - -MOCK_IMPL(int, -tor_lookup_hostname,(const char *name, uint32_t *addr)) +int +tor_lookup_hostname(const char *name, uint32_t *addr) { tor_addr_t myaddr; int ret; @@ -2716,8 +2228,8 @@ static int uname_result_is_set = 0; /** Return a pointer to a description of our platform. */ -MOCK_IMPL(const char *, -get_uname,(void)) +const char * +get_uname(void) { #ifdef HAVE_UNAME struct utsname u; @@ -2728,7 +2240,7 @@ get_uname,(void)) /* (Linux says 0 is success, Solaris says 1 is success) */ strlcpy(uname_result, u.sysname, sizeof(uname_result)); } else -#endif /* defined(HAVE_UNAME) */ +#endif { #ifdef _WIN32 OSVERSIONINFOEX info; @@ -2785,17 +2297,17 @@ get_uname,(void)) "Unrecognized version of Windows [major=%d,minor=%d]", (int)info.dwMajorVersion,(int)info.dwMinorVersion); } +#if !defined (WINCE) #ifdef VER_NT_SERVER if (info.wProductType == VER_NT_SERVER || info.wProductType == VER_NT_DOMAIN_CONTROLLER) { strlcat(uname_result, " [server]", sizeof(uname_result)); } -#endif /* defined(VER_NT_SERVER) */ -#else /* !(defined(_WIN32)) */ - /* LCOV_EXCL_START -- can't provoke uname failure */ +#endif +#endif +#else strlcpy(uname_result, "Unknown platform", sizeof(uname_result)); - /* LCOV_EXCL_STOP */ -#endif /* defined(_WIN32) */ +#endif } uname_result_is_set = 1; } @@ -2806,6 +2318,103 @@ get_uname,(void)) * Process control */ +#if defined(USE_PTHREADS) +/** Wraps a void (*)(void*) function and its argument so we can + * invoke them in a way pthreads would expect. + */ +typedef struct tor_pthread_data_t { + void (*func)(void *); + void *data; +} tor_pthread_data_t; +/** Given a tor_pthread_data_t _data, call _data->func(d->data) + * and free _data. Used to make sure we can call functions the way pthread + * expects. */ +static void * +tor_pthread_helper_fn(void *_data) +{ + tor_pthread_data_t *data = _data; + void (*func)(void*); + void *arg; + /* mask signals to worker threads to avoid SIGPIPE, etc */ + sigset_t sigs; + /* We're in a subthread; don't handle any signals here. */ + sigfillset(&sigs); + pthread_sigmask(SIG_SETMASK, &sigs, NULL); + + func = data->func; + arg = data->data; + tor_free(_data); + func(arg); + return NULL; +} +#endif + +/** Minimalist interface to run a void function in the background. On + * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. + * func should not return, but rather should call spawn_exit. + * + * NOTE: if data is used, it should not be allocated on the stack, + * since in a multithreaded environment, there is no way to be sure that + * the caller's stack will still be around when the called function is + * running. + */ +int +spawn_func(void (*func)(void *), void *data) +{ +#if defined(USE_WIN32_THREADS) + int rv; + rv = (int)_beginthread(func, 0, data); + if (rv == (int)-1) + return -1; + return 0; +#elif defined(USE_PTHREADS) + pthread_t thread; + tor_pthread_data_t *d; + d = tor_malloc(sizeof(tor_pthread_data_t)); + d->data = data; + d->func = func; + if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d)) + return -1; + if (pthread_detach(thread)) + return -1; + return 0; +#else + pid_t pid; + pid = fork(); + if (pid<0) + return -1; + if (pid==0) { + /* Child */ + func(data); + tor_assert(0); /* Should never reach here. */ + return 0; /* suppress "control-reaches-end-of-non-void" warning. */ + } else { + /* Parent */ + return 0; + } +#endif +} + +/** End the current thread/process. + */ +void +spawn_exit(void) +{ +#if defined(USE_WIN32_THREADS) + _endthread(); + //we should never get here. my compiler thinks that _endthread returns, this + //is an attempt to fool it. + tor_assert(0); + _exit(0); +#elif defined(USE_PTHREADS) + pthread_exit(NULL); +#else + /* http://www.erlenstar.demon.co.uk/unix/faq_2.html says we should + * call _exit, not exit, from child processes. */ + _exit(0); +#endif +} + /** Implementation logic for compute_num_cpus(). */ static int compute_num_cpus_impl(void) @@ -2851,7 +2460,7 @@ compute_num_cpus_impl(void) return -1; #else return -1; -#endif /* defined(_WIN32) || ... */ +#endif } #define MAX_DETECTABLE_CPUS 16 @@ -2868,20 +2477,67 @@ compute_num_cpus(void) if (num_cpus == -2) { num_cpus = compute_num_cpus_impl(); tor_assert(num_cpus != -2); - if (num_cpus > MAX_DETECTABLE_CPUS) { - /* LCOV_EXCL_START */ + if (num_cpus > MAX_DETECTABLE_CPUS) log_notice(LD_GENERAL, "Wow! I detected that you have %d CPUs. I " "will not autodetect any more than %d, though. If you " "want to configure more, set NumCPUs in your torrc", num_cpus, MAX_DETECTABLE_CPUS); - num_cpus = MAX_DETECTABLE_CPUS; - /* LCOV_EXCL_STOP */ - } } return num_cpus; } -#if !defined(_WIN32) +/** Set *timeval to the current time of day. On error, log and terminate. + * (Same as gettimeofday(timeval,NULL), but never returns -1.) + */ +void +tor_gettimeofday(struct timeval *timeval) +{ +#ifdef _WIN32 + /* Epoch bias copied from perl: number of units between windows epoch and + * Unix epoch. */ +#define EPOCH_BIAS U64_LITERAL(116444736000000000) +#define UNITS_PER_SEC U64_LITERAL(10000000) +#define USEC_PER_SEC U64_LITERAL(1000000) +#define UNITS_PER_USEC U64_LITERAL(10) + union { + uint64_t ft_64; + FILETIME ft_ft; + } ft; +#if defined (WINCE) + /* wince do not have GetSystemTimeAsFileTime */ + SYSTEMTIME stime; + GetSystemTime(&stime); + SystemTimeToFileTime(&stime,&ft.ft_ft); +#else + /* number of 100-nsec units since Jan 1, 1601 */ + GetSystemTimeAsFileTime(&ft.ft_ft); +#endif + if (ft.ft_64 < EPOCH_BIAS) { + log_err(LD_GENERAL,"System time is before 1970; failing."); + exit(1); + } + ft.ft_64 -= EPOCH_BIAS; + timeval->tv_sec = (unsigned) (ft.ft_64 / UNITS_PER_SEC); + timeval->tv_usec = (unsigned) ((ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC); +#elif defined(HAVE_GETTIMEOFDAY) + if (gettimeofday(timeval, NULL)) { + log_err(LD_GENERAL,"gettimeofday failed."); + /* If gettimeofday dies, we have either given a bad timezone (we didn't), + or segfaulted.*/ + exit(1); + } +#elif defined(HAVE_FTIME) + struct timeb tb; + ftime(&tb); + timeval->tv_sec = tb.time; + timeval->tv_usec = tb.millitm * 1000; +#else +#error "No way to get time." +#endif + return; +} + +#if defined(TOR_IS_MULTITHREADED) && !defined(_WIN32) /** Defined iff we need to add locks when defining fake versions of reentrant * versions of time-related functions. */ #define TIME_FNS_NEED_LOCKS @@ -2900,26 +2556,14 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, const char *outcome; if (PREDICT_LIKELY(r)) { - /* We can't strftime dates after 9999 CE, and we want to avoid dates - * before 1 CE (avoiding the year 0 issue and negative years). */ - if (r->tm_year > 8099) { + if (r->tm_year > 8099) { /* We can't strftime dates after 9999 CE. */ r->tm_year = 8099; r->tm_mon = 11; r->tm_mday = 31; - r->tm_yday = 364; - r->tm_wday = 6; + r->tm_yday = 365; r->tm_hour = 23; r->tm_min = 59; r->tm_sec = 59; - } else if (r->tm_year < (1-1900)) { - r->tm_year = (1-1900); - r->tm_mon = 0; - r->tm_mday = 1; - r->tm_yday = 0; - r->tm_wday = 0; - r->tm_hour = 0; - r->tm_min = 0; - r->tm_sec = 0; } return r; } @@ -2933,8 +2577,7 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, r->tm_year = 70; /* 1970 CE */ r->tm_mon = 0; r->tm_mday = 1; - r->tm_yday = 0; - r->tm_wday = 0; + r->tm_yday = 1; r->tm_hour = 0; r->tm_min = 0 ; r->tm_sec = 0; @@ -2947,8 +2590,7 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, r->tm_year = 137; /* 2037 CE */ r->tm_mon = 11; r->tm_mday = 31; - r->tm_yday = 364; - r->tm_wday = 6; + r->tm_yday = 365; r->tm_hour = 23; r->tm_min = 59; r->tm_sec = 59; @@ -2959,12 +2601,11 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, /* If we get here, then gmtime/localtime failed without getting an extreme * value for *timep */ - /* LCOV_EXCL_START */ + tor_fragile_assert(); r = resultbuf; memset(resultbuf, 0, sizeof(struct tm)); outcome="can't recover"; - /* LCOV_EXCL_STOP */ done: log_warn(LD_BUG, "%s("I64_FORMAT") failed with error %s: %s", islocal?"localtime":"gmtime", @@ -3014,11 +2655,11 @@ tor_localtime_r(const time_t *timep, struct tm *result) memcpy(result, r, sizeof(struct tm)); return correct_tm(1, timep, result, r); } -#endif /* defined(HAVE_LOCALTIME_R) || ... */ +#endif /** @} */ /** @{ */ -/** As gmtime_r, but defined for platforms that don't have it: +/** As gmtimee_r, but defined for platforms that don't have it: * * Convert *timep to a struct tm in UTC, and store the value in * *result. Return the result on success, or NULL on failure. @@ -3057,13 +2698,285 @@ tor_gmtime_r(const time_t *timep, struct tm *result) memcpy(result, r, sizeof(struct tm)); return correct_tm(0, timep, result, r); } -#endif /* defined(HAVE_GMTIME_R) || ... */ +#endif -#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) -#define HAVE_UNIX_MLOCKALL +#if defined(USE_WIN32_THREADS) +void +tor_mutex_init(tor_mutex_t *m) +{ + InitializeCriticalSection(&m->mutex); +} +void +tor_mutex_uninit(tor_mutex_t *m) +{ + DeleteCriticalSection(&m->mutex); +} +void +tor_mutex_acquire(tor_mutex_t *m) +{ + tor_assert(m); + EnterCriticalSection(&m->mutex); +} +void +tor_mutex_release(tor_mutex_t *m) +{ + LeaveCriticalSection(&m->mutex); +} +unsigned long +tor_get_thread_id(void) +{ + return (unsigned long)GetCurrentThreadId(); +} +#elif defined(USE_PTHREADS) +/** A mutex attribute that we're going to use to tell pthreads that we want + * "reentrant" mutexes (i.e., once we can re-lock if we're already holding + * them.) */ +static pthread_mutexattr_t attr_reentrant; +/** True iff we've called tor_threads_init() */ +static int threads_initialized = 0; +/** Initialize mutex so it can be locked. Every mutex must be set + * up with tor_mutex_init() or tor_mutex_new(); not both. */ +void +tor_mutex_init(tor_mutex_t *mutex) +{ + int err; + if (PREDICT_UNLIKELY(!threads_initialized)) + tor_threads_init(); + err = pthread_mutex_init(&mutex->mutex, &attr_reentrant); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d creating a mutex.", err); + tor_fragile_assert(); + } +} +/** Wait until m is free, then acquire it. */ +void +tor_mutex_acquire(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_lock(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d locking a mutex.", err); + tor_fragile_assert(); + } +} +/** Release the lock m so another thread can have it. */ +void +tor_mutex_release(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_unlock(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d unlocking a mutex.", err); + tor_fragile_assert(); + } +} +/** Clean up the mutex m so that it no longer uses any system + * resources. Does not free m. This function must only be called on + * mutexes from tor_mutex_init(). */ +void +tor_mutex_uninit(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_destroy(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d destroying a mutex.", err); + tor_fragile_assert(); + } +} +/** Return an integer representing this thread. */ +unsigned long +tor_get_thread_id(void) +{ + union { + pthread_t thr; + unsigned long id; + } r; + r.thr = pthread_self(); + return r.id; +} +#endif + +#ifdef TOR_IS_MULTITHREADED +/** Return a newly allocated, ready-for-use mutex. */ +tor_mutex_t * +tor_mutex_new(void) +{ + tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); + tor_mutex_init(m); + return m; +} +/** Release all storage and system resources held by m. */ +void +tor_mutex_free(tor_mutex_t *m) +{ + if (!m) + return; + tor_mutex_uninit(m); + tor_free(m); +} +#endif + +/* Conditions. */ +#ifdef USE_PTHREADS +#if 0 +/** Cross-platform condition implementation. */ +struct tor_cond_t { + pthread_cond_t cond; +}; +/** Return a newly allocated condition, with nobody waiting on it. */ +tor_cond_t * +tor_cond_new(void) +{ + tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); + if (pthread_cond_init(&cond->cond, NULL)) { + tor_free(cond); + return NULL; + } + return cond; +} +/** Release all resources held by cond. */ +void +tor_cond_free(tor_cond_t *cond) +{ + if (!cond) + return; + if (pthread_cond_destroy(&cond->cond)) { + log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); + return; + } + tor_free(cond); +} +/** Wait until one of the tor_cond_signal functions is called on cond. + * All waiters on the condition must wait holding the same mutex. + * Returns 0 on success, negative on failure. */ +int +tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) +{ + return pthread_cond_wait(&cond->cond, &mutex->mutex) ? -1 : 0; +} +/** Wake up one of the waiters on cond. */ +void +tor_cond_signal_one(tor_cond_t *cond) +{ + pthread_cond_signal(&cond->cond); +} +/** Wake up all of the waiters on cond. */ +void +tor_cond_signal_all(tor_cond_t *cond) +{ + pthread_cond_broadcast(&cond->cond); +} +#endif +/** Set up common structures for use by threading. */ +void +tor_threads_init(void) +{ + if (!threads_initialized) { + pthread_mutexattr_init(&attr_reentrant); + pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); + threads_initialized = 1; + set_main_thread(); + } +} +#elif defined(USE_WIN32_THREADS) +#if 0 +static DWORD cond_event_tls_index; +struct tor_cond_t { + CRITICAL_SECTION mutex; + smartlist_t *events; +}; +tor_cond_t * +tor_cond_new(void) +{ + tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); + InitializeCriticalSection(&cond->mutex); + cond->events = smartlist_new(); + return cond; +} +void +tor_cond_free(tor_cond_t *cond) +{ + if (!cond) + return; + DeleteCriticalSection(&cond->mutex); + /* XXXX notify? */ + smartlist_free(cond->events); + tor_free(cond); +} +int +tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) +{ + HANDLE event; + int r; + tor_assert(cond); + tor_assert(mutex); + event = TlsGetValue(cond_event_tls_index); + if (!event) { + event = CreateEvent(0, FALSE, FALSE, NULL); + TlsSetValue(cond_event_tls_index, event); + } + EnterCriticalSection(&cond->mutex); + + tor_assert(WaitForSingleObject(event, 0) == WAIT_TIMEOUT); + tor_assert(!smartlist_contains(cond->events, event)); + smartlist_add(cond->events, event); + + LeaveCriticalSection(&cond->mutex); + + tor_mutex_release(mutex); + r = WaitForSingleObject(event, INFINITE); + tor_mutex_acquire(mutex); + + switch (r) { + case WAIT_OBJECT_0: /* we got the mutex normally. */ + break; + case WAIT_ABANDONED: /* holding thread exited. */ + case WAIT_TIMEOUT: /* Should never happen. */ + tor_assert(0); + break; + case WAIT_FAILED: + log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError()); + } + return 0; +} +void +tor_cond_signal_one(tor_cond_t *cond) +{ + HANDLE event; + tor_assert(cond); + + EnterCriticalSection(&cond->mutex); + + if ((event = smartlist_pop_last(cond->events))) + SetEvent(event); + + LeaveCriticalSection(&cond->mutex); +} +void +tor_cond_signal_all(tor_cond_t *cond) +{ + tor_assert(cond); + + EnterCriticalSection(&cond->mutex); + SMARTLIST_FOREACH(cond->events, HANDLE, event, SetEvent(event)); + smartlist_clear(cond->events); + LeaveCriticalSection(&cond->mutex); +} +#endif +void +tor_threads_init(void) +{ +#if 0 + cond_event_tls_index = TlsAlloc(); +#endif + set_main_thread(); +} #endif -#ifdef HAVE_UNIX_MLOCKALL +#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) /** Attempt to raise the current and max rlimit to infinity for our process. * This only needs to be done once and can probably only be done when we have * not already dropped privileges. @@ -3094,7 +3007,7 @@ tor_set_max_memlock(void) return 0; } -#endif /* defined(HAVE_UNIX_MLOCKALL) */ +#endif /** Attempt to lock all current and all future memory pages. * This should only be called once and while we're privileged. @@ -3119,7 +3032,7 @@ tor_mlockall(void) * http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx */ -#ifdef HAVE_UNIX_MLOCKALL +#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) if (tor_set_max_memlock() == 0) { log_debug(LD_GENERAL, "RLIMIT_MEMLOCK is now set to RLIM_INFINITY."); } @@ -3140,10 +3053,27 @@ tor_mlockall(void) "pages: %s", strerror(errno)); return -1; } -#else /* !(defined(HAVE_UNIX_MLOCKALL)) */ +#else log_warn(LD_GENERAL, "Unable to lock memory pages. mlockall() unsupported?"); return -1; -#endif /* defined(HAVE_UNIX_MLOCKALL) */ +#endif +} + +/** Identity of the "main" thread */ +static unsigned long main_thread_id = -1; + +/** Start considering the current thread to be the 'main thread'. This has + * no effect on anything besides in_main_thread(). */ +void +set_main_thread(void) +{ + main_thread_id = tor_get_thread_id(); +} +/** Return true iff called from the main thread. */ +int +in_main_thread(void) +{ + return main_thread_id == tor_get_thread_id(); } /** @@ -3171,7 +3101,7 @@ tor_socket_errno(tor_socket_t sock) } return err; } -#endif /* defined(_WIN32) */ +#endif #if defined(_WIN32) #define E(code, s) { code, (s " [" #code " ]") } @@ -3247,7 +3177,7 @@ tor_socket_strerror(int e) } return strerror(e); } -#endif /* defined(_WIN32) */ +#endif /** Called before we make any calls to network-related functions. * (Some operating systems require their network libraries to be @@ -3273,7 +3203,7 @@ network_init(void) /* WSAData.iMaxSockets might show the max sockets we're allowed to use. * We might use it to complain if we're trying to be a server but have * too few sockets available. */ -#endif /* defined(_WIN32) */ +#endif return 0; } @@ -3294,7 +3224,7 @@ format_win32_error(DWORD err) FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, - MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPVOID)&str, 0, NULL); @@ -3309,9 +3239,9 @@ format_win32_error(DWORD err) result = tor_malloc(len); wcstombs(result,str,len); result[len-1] = '\0'; -#else /* !(defined(UNICODE)) */ +#else result = tor_strdup(str); -#endif /* defined(UNICODE) */ +#endif } else { result = tor_strdup(""); } @@ -3320,242 +3250,5 @@ format_win32_error(DWORD err) } return result; } -#endif /* defined(_WIN32) */ - -#if defined(HW_PHYSMEM64) -/* This appears to be an OpenBSD thing */ -#define INT64_HW_MEM HW_PHYSMEM64 -#elif defined(HW_MEMSIZE) -/* OSX defines this one */ -#define INT64_HW_MEM HW_MEMSIZE -#endif /* defined(HW_PHYSMEM64) || ... */ - -/** - * Helper: try to detect the total system memory, and return it. On failure, - * return 0. - */ -static uint64_t -get_total_system_memory_impl(void) -{ -#if defined(__linux__) - /* On linux, sysctl is deprecated. Because proc is so awesome that you - * shouldn't _want_ to write portable code, I guess? */ - unsigned long long result=0; - int fd = -1; - char *s = NULL; - const char *cp; - size_t file_size=0; - if (-1 == (fd = tor_open_cloexec("/proc/meminfo",O_RDONLY,0))) - return 0; - s = read_file_to_str_until_eof(fd, 65536, &file_size); - if (!s) - goto err; - cp = strstr(s, "MemTotal:"); - if (!cp) - goto err; - /* Use the system sscanf so that space will match a wider number of space */ - if (sscanf(cp, "MemTotal: %llu kB\n", &result) != 1) - goto err; - - close(fd); - tor_free(s); - return result * 1024; - - /* LCOV_EXCL_START Can't reach this unless proc is broken. */ - err: - tor_free(s); - close(fd); - return 0; - /* LCOV_EXCL_STOP */ -#elif defined (_WIN32) - /* Windows has MEMORYSTATUSEX; pretty straightforward. */ - MEMORYSTATUSEX ms; - memset(&ms, 0, sizeof(ms)); - ms.dwLength = sizeof(ms); - if (! GlobalMemoryStatusEx(&ms)) - return 0; - - return ms.ullTotalPhys; - -#elif defined(HAVE_SYSCTL) && defined(INT64_HW_MEM) - /* On many systems, HW_PYHSMEM is clipped to 32 bits; let's use a better - * variant if we know about it. */ - uint64_t memsize = 0; - size_t len = sizeof(memsize); - int mib[2] = {CTL_HW, INT64_HW_MEM}; - if (sysctl(mib,2,&memsize,&len,NULL,0)) - return 0; - - return memsize; - -#elif defined(HAVE_SYSCTL) && defined(HW_PHYSMEM) - /* On some systems (like FreeBSD I hope) you can use a size_t with - * HW_PHYSMEM. */ - size_t memsize=0; - size_t len = sizeof(memsize); - int mib[2] = {CTL_HW, HW_USERMEM}; - if (sysctl(mib,2,&memsize,&len,NULL,0)) - return 0; - - return memsize; - -#else - /* I have no clue. */ - return 0; -#endif /* defined(__linux__) || ... */ -} - -/** - * Try to find out how much physical memory the system has. On success, - * return 0 and set *mem_out to that value. On failure, return -1. - */ -int -get_total_system_memory(size_t *mem_out) -{ - static size_t mem_cached=0; - uint64_t m = get_total_system_memory_impl(); - if (0 == m) { - /* LCOV_EXCL_START -- can't make this happen without mocking. */ - /* We couldn't find our memory total */ - if (0 == mem_cached) { - /* We have no cached value either */ - *mem_out = 0; - return -1; - } - - *mem_out = mem_cached; - return 0; - /* LCOV_EXCL_STOP */ - } - -#if SIZE_MAX != UINT64_MAX - if (m > SIZE_MAX) { - /* I think this could happen if we're a 32-bit Tor running on a 64-bit - * system: we could have more system memory than would fit in a - * size_t. */ - m = SIZE_MAX; - } -#endif /* SIZE_MAX != UINT64_MAX */ - - *mem_out = mem_cached = (size_t) m; - - return 0; -} - -/** Emit the password prompt prompt, then read up to buflen - * bytes of passphrase into output. Return the number of bytes in - * the passphrase, excluding terminating NUL. - */ -ssize_t -tor_getpass(const char *prompt, char *output, size_t buflen) -{ - tor_assert(buflen <= SSIZE_MAX); - tor_assert(buflen >= 1); -#if defined(HAVE_READPASSPHRASE) - char *pwd = readpassphrase(prompt, output, buflen, RPP_ECHO_OFF); - if (pwd == NULL) - return -1; - return strlen(pwd); -#elif defined(_WIN32) - int r = -1; - while (*prompt) { - _putch(*prompt++); - } - - tor_assert(buflen <= INT_MAX); - wchar_t *buf = tor_calloc(buflen, sizeof(wchar_t)); - - wchar_t *ptr = buf, *lastch = buf + buflen - 1; - while (ptr < lastch) { - wint_t ch = _getwch(); - switch (ch) { - case '\r': - case '\n': - case WEOF: - goto done_reading; - case 3: - goto done; /* Can't actually read ctrl-c this way. */ - case '\b': - if (ptr > buf) - --ptr; - continue; - case 0: - case 0xe0: - ch = _getwch(); /* Ignore; this is a function or arrow key */ - break; - default: - *ptr++ = ch; - break; - } - } - done_reading: - ; - -#ifndef WC_ERR_INVALID_CHARS -#define WC_ERR_INVALID_CHARS 0x80 #endif - /* Now convert it to UTF-8 */ - r = WideCharToMultiByte(CP_UTF8, - WC_NO_BEST_FIT_CHARS|WC_ERR_INVALID_CHARS, - buf, (int)(ptr-buf), - output, (int)(buflen-1), - NULL, NULL); - if (r <= 0) { - r = -1; - goto done; - } - - tor_assert(r < (int)buflen); - - output[r] = 0; - - done: - SecureZeroMemory(buf, sizeof(wchar_t)*buflen); - tor_free(buf); - return r; -#else -#error "No implementation for tor_getpass found!" -#endif /* defined(HAVE_READPASSPHRASE) || ... */ -} - -/** Return the amount of free disk space we have permission to use, in - * bytes. Return -1 if the amount of free space can't be determined. */ -int64_t -tor_get_avail_disk_space(const char *path) -{ -#ifdef HAVE_STATVFS - struct statvfs st; - int r; - memset(&st, 0, sizeof(st)); - - r = statvfs(path, &st); - if (r < 0) - return -1; - - int64_t result = st.f_bavail; - if (st.f_frsize) { - result *= st.f_frsize; - } else if (st.f_bsize) { - result *= st.f_bsize; - } else { - return -1; - } - - return result; -#elif defined(_WIN32) - ULARGE_INTEGER freeBytesAvail; - BOOL ok; - - ok = GetDiskFreeSpaceEx(path, &freeBytesAvail, NULL, NULL); - if (!ok) { - return -1; - } - return (int64_t)freeBytesAvail.QuadPart; -#else - (void)path; - errno = ENOSYS; - return -1; -#endif /* defined(HAVE_STATVFS) || ... */ -} - diff --git a/src/tor/compat_libevent.c b/src/tor/compat_libevent.c new file mode 100644 index 000000000..58ec08cf1 --- /dev/null +++ b/src/tor/compat_libevent.c @@ -0,0 +1,663 @@ +/* Copyright (c) 2009-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compat_libevent.c + * \brief Wrappers to handle porting between different versions of libevent. + * + * In an ideal world, we'd just use Libevent 2.0 from now on. But as of June + * 2012, Libevent 1.4 is still all over, and some poor souls are stuck on + * Libevent 1.3e. */ + +#include "orconfig.h" +#include "tor_compat.h" +#include "compat_libevent.h" + +#include "tor_util.h" +#include "torlog.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include +#include +#ifdef USE_BUFFEREVENTS +#include +#endif +#else +#include +#endif + +/** A number representing a version of Libevent. + + This is a 4-byte number, with the first three bytes representing the + major, minor, and patchlevel respectively of the library. The fourth + byte is unused. + + This is equivalent to the format of LIBEVENT_VERSION_NUMBER on Libevent + 2.0.1 or later. For versions of Libevent before 1.4.0, which followed the + format of "1.0, 1.0a, 1.0b", we define 1.0 to be equivalent to 1.0.0, 1.0a + to be equivalent to 1.0.1, and so on. +*/ +typedef uint32_t le_version_t; + +/** @{ */ +/** Macros: returns the number of a libevent version as a le_version_t */ +#define V(major, minor, patch) \ + (((major) << 24) | ((minor) << 16) | ((patch) << 8)) +#define V_OLD(major, minor, patch) \ + V((major), (minor), (patch)-'a'+1) +/** @} */ + +/** Represetns a version of libevent so old we can't figure out what version + * it is. */ +#define LE_OLD V(0,0,0) +/** Represents a version of libevent so weird we can't figure out what version + * it is. */ +#define LE_OTHER V(0,0,99) + +#if 0 +static le_version_t tor_get_libevent_version(const char **v_out); +#endif + +#if defined(HAVE_EVENT_SET_LOG_CALLBACK) || defined(RUNNING_DOXYGEN) +/** A string which, if it appears in a libevent log, should be ignored. */ +static const char *suppress_msg = NULL; +/** Callback function passed to event_set_log() so we can intercept + * log messages from libevent. */ +static void +libevent_logging_callback(int severity, const char *msg) +{ + char buf[1024]; + size_t n; + if (suppress_msg && strstr(msg, suppress_msg)) + return; + n = strlcpy(buf, msg, sizeof(buf)); + if (n && n < sizeof(buf) && buf[n-1] == '\n') { + buf[n-1] = '\0'; + } + switch (severity) { + case _EVENT_LOG_DEBUG: + log_debug(LD_NOCB|LD_NET, "Message from libevent: %s", buf); + break; + case _EVENT_LOG_MSG: + log_info(LD_NOCB|LD_NET, "Message from libevent: %s", buf); + break; + case _EVENT_LOG_WARN: + log_warn(LD_NOCB|LD_GENERAL, "Warning from libevent: %s", buf); + break; + case _EVENT_LOG_ERR: + log_err(LD_NOCB|LD_GENERAL, "Error from libevent: %s", buf); + break; + default: + log_warn(LD_NOCB|LD_GENERAL, "Message [%d] from libevent: %s", + severity, buf); + break; + } +} +/** Set hook to intercept log messages from libevent. */ +void +configure_libevent_logging(void) +{ + event_set_log_callback(libevent_logging_callback); +} +/** Ignore any libevent log message that contains msg. */ +void +suppress_libevent_log_msg(const char *msg) +{ + suppress_msg = msg; +} +#else +void +configure_libevent_logging(void) +{ +} +void +suppress_libevent_log_msg(const char *msg) +{ + (void)msg; +} +#endif + +#ifndef HAVE_EVENT2_EVENT_H +/** Work-alike replacement for event_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_event_new(struct event_base *base, int sock, short what, + void (*cb)(int, short, void *), void *arg) +{ + struct event *e = tor_malloc_zero(sizeof(struct event)); + event_set(e, sock, what, cb, arg); + if (! base) + base = tor_libevent_get_base(); + event_base_set(base, e); + return e; +} +/** Work-alike replacement for evtimer_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_evtimer_new(struct event_base *base, + void (*cb)(int, short, void *), void *arg) +{ + return tor_event_new(base, -1, 0, cb, arg); +} +/** Work-alike replacement for evsignal_new() on pre-Libevent-2.0 systems. */ +struct event * +tor_evsignal_new(struct event_base * base, int sig, + void (*cb)(int, short, void *), void *arg) +{ + return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg); +} +/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */ +void +tor_event_free(struct event *ev) +{ + event_del(ev); + tor_free(ev); +} +#endif + +/** Global event base for use by the main thread. */ +struct event_base *the_event_base = NULL; + +/* This is what passes for version detection on OSX. We set + * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before + * 10.4.0 (aka 1040). */ +#ifdef __APPLE__ +#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +#define MACOSX_KQUEUE_IS_BROKEN \ + (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040) +#else +#define MACOSX_KQUEUE_IS_BROKEN 0 +#endif +#endif + +#ifdef USE_BUFFEREVENTS +static int using_iocp_bufferevents = 0; +static void tor_libevent_set_tick_timeout(int msec_per_tick); + +int +tor_libevent_using_iocp_bufferevents(void) +{ + return using_iocp_bufferevents; +} +#endif + +/** Initialize the Libevent library and set up the event base. */ +void +tor_libevent_initialize(tor_libevent_cfg *torcfg) +{ + tor_assert(the_event_base == NULL); + /* some paths below don't use torcfg, so avoid unused variable warnings */ + (void)torcfg; + +#ifdef HAVE_EVENT2_EVENT_H + { + int attempts = 0; + int using_threads; + struct event_config *cfg; + + retry: + ++attempts; + using_threads = 0; + cfg = event_config_new(); + tor_assert(cfg); + +#if defined(_WIN32) && defined(USE_BUFFEREVENTS) + if (! torcfg->disable_iocp) { + evthread_use_windows_threads(); + event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP); + using_iocp_bufferevents = 1; + using_threads = 1; + } else { + using_iocp_bufferevents = 0; + } +#endif + + if (!using_threads) { + /* Telling Libevent not to try to turn locking on can avoid a needless + * socketpair() attempt. */ + event_config_set_flag(cfg, EVENT_BASE_FLAG_NOLOCK); + } + +#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,0,7) + if (torcfg->num_cpus > 0) + event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); +#endif + +#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) + /* We can enable changelist support with epoll, since we don't give + * Libevent any dup'd fds. This lets us avoid some syscalls. */ + event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); +#endif + + the_event_base = event_base_new_with_config(cfg); + + event_config_free(cfg); + + if (using_threads && the_event_base == NULL && attempts < 2) { + /* This could be a socketpair() failure, which can happen sometimes on + * windows boxes with obnoxious firewall rules. Downgrade and try + * again. */ +#if defined(_WIN32) && defined(USE_BUFFEREVENTS) + if (torcfg->disable_iocp == 0) { + log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again " + "with IOCP disabled."); + } else +#endif + { + log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again."); + } + + torcfg->disable_iocp = 1; + goto retry; + } + } +#else + the_event_base = event_init(); +#endif + + if (!the_event_base) { + log_err(LD_GENERAL, "Unable to initialize Libevent: cannot continue."); + exit(1); + } + +#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) + /* Making this a NOTICE for now so we can link bugs to a libevent versions + * or methods better. */ + log_info(LD_GENERAL, + "Initialized libevent version %s using method %s. Good.", + event_get_version(), tor_libevent_get_method()); +#else + log_notice(LD_GENERAL, + "Initialized old libevent (version 1.0b or earlier)."); + log_warn(LD_GENERAL, + "You have a *VERY* old version of libevent. It is likely to be buggy; " + "please build Tor with a more recent version."); +#endif + +#ifdef USE_BUFFEREVENTS + tor_libevent_set_tick_timeout(torcfg->msec_per_tick); +#endif +} + +/** Return the current Libevent event base that we're set up to use. */ +struct event_base * +tor_libevent_get_base(void) +{ + return the_event_base; +} + +#ifndef HAVE_EVENT_BASE_LOOPEXIT +/** Replacement for event_base_loopexit on some very old versions of Libevent + * that we are not yet brave enough to deprecate. */ +int +tor_event_base_loopexit(struct event_base *base, struct timeval *tv) +{ + tor_assert(base == the_event_base); + return event_loopexit(tv); +} +#endif + +/** Return the name of the Libevent backend we're using. */ +const char * +tor_libevent_get_method(void) +{ +#ifdef HAVE_EVENT2_EVENT_H + return event_base_get_method(the_event_base); +#elif defined(HAVE_EVENT_GET_METHOD) + return event_get_method(); +#else + return ""; +#endif +} + +/** Return the le_version_t for the version of libevent specified in the + * string v. If the version is very new or uses an unrecognized + * version, format, return LE_OTHER. */ +static le_version_t +tor_decode_libevent_version(const char *v) +{ + unsigned major, minor, patchlevel; + char c, e, extra; + int fields; + + /* Try the new preferred "1.4.11-stable" format. + * Also accept "1.4.14b-stable". */ + fields = tor_sscanf(v, "%u.%u.%u%c%c", &major, &minor, &patchlevel, &c, &e); + if (fields == 3 || + ((fields == 4 || fields == 5 ) && (c == '-' || c == '_')) || + (fields == 5 && TOR_ISALPHA(c) && (e == '-' || e == '_'))) { + return V(major,minor,patchlevel); + } + + /* Try the old "1.3e" format. */ + fields = tor_sscanf(v, "%u.%u%c%c", &major, &minor, &c, &extra); + if (fields == 3 && TOR_ISALPHA(c)) { + return V_OLD(major, minor, c); + } else if (fields == 2) { + return V(major, minor, 0); + } + + return LE_OTHER; +} + +/** Return an integer representing the binary interface of a Libevent library. + * Two different versions with different numbers are sure not to be binary + * compatible. Two different versions with the same numbers have a decent + * chance of binary compatibility.*/ +static int +le_versions_compatibility(le_version_t v) +{ + if (v == LE_OTHER) + return 0; + if (v < V_OLD(1,0,'c')) + return 1; + else if (v < V(1,4,0)) + return 2; + else if (v < V(1,4,99)) + return 3; + else if (v < V(2,0,1)) + return 4; + else /* Everything 2.0 and later should be compatible. */ + return 5; +} + +#if 0 +/** Return the version number of the currently running version of Libevent. + * See le_version_t for info on the format. + */ +static le_version_t +tor_get_libevent_version(const char **v_out) +{ + const char *v; + le_version_t r; +#if defined(HAVE_EVENT_GET_VERSION_NUMBER) + v = event_get_version(); + r = event_get_version_number(); +#elif defined (HAVE_EVENT_GET_VERSION) + v = event_get_version(); + r = tor_decode_libevent_version(v); +#else + v = "pre-1.0c"; + r = LE_OLD; +#endif + if (v_out) + *v_out = v; + return r; +} +#endif + +/** Return a string representation of the version of the currently running + * version of Libevent. */ +const char * +tor_libevent_get_version_str(void) +{ +#ifdef HAVE_EVENT_GET_VERSION + return event_get_version(); +#else + return "pre-1.0c"; +#endif +} + +/** + * Compare the current Libevent method and version to a list of versions + * which are known not to work. Warn the user as appropriate. + */ +void +tor_check_libevent_version(const char *m, int server, + const char **badness_out) +{ + (void) m; + (void) server; + *badness_out = NULL; +} + +#if defined(LIBEVENT_VERSION) +#define HEADER_VERSION LIBEVENT_VERSION +#elif defined(_EVENT_VERSION) +#define HEADER_VERSION _EVENT_VERSION +#endif + +/** Return a string representation of the version of Libevent that was used +* at compilation time. */ +const char * +tor_libevent_get_header_version_str(void) +{ + return HEADER_VERSION; +} + +/** See whether the headers we were built against differ from the library we + * linked against so much that we're likely to crash. If so, warn the + * user. */ +void +tor_check_libevent_header_compatibility(void) +{ + (void) le_versions_compatibility; + (void) tor_decode_libevent_version; + + /* In libevent versions before 2.0, it's hard to keep binary compatibility + * between upgrades, and unpleasant to detect when the version we compiled + * against is unlike the version we have linked against. Here's how. */ +#if defined(HEADER_VERSION) && defined(HAVE_EVENT_GET_VERSION) + /* We have a header-file version and a function-call version. Easy. */ + if (strcmp(HEADER_VERSION, event_get_version())) { + le_version_t v1, v2; + int compat1 = -1, compat2 = -1; + int verybad; + v1 = tor_decode_libevent_version(HEADER_VERSION); + v2 = tor_decode_libevent_version(event_get_version()); + compat1 = le_versions_compatibility(v1); + compat2 = le_versions_compatibility(v2); + + verybad = compat1 != compat2; + + tor_log(verybad ? LOG_WARN : LOG_NOTICE, + LD_GENERAL, "We were compiled with headers from version %s " + "of Libevent, but we're using a Libevent library that says it's " + "version %s.", HEADER_VERSION, event_get_version()); + if (verybad) + log_warn(LD_GENERAL, "This will almost certainly make Tor crash."); + else + log_info(LD_GENERAL, "I think these versions are binary-compatible."); + } +#elif defined(HAVE_EVENT_GET_VERSION) + /* event_get_version but no _EVENT_VERSION. We might be in 1.4.0-beta or + earlier, where that's normal. To see whether we were compiled with an + earlier version, let's see whether the struct event defines MIN_HEAP_IDX. + */ +#ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX + /* The header files are 1.4.0-beta or later. If the version is not + * 1.4.0-beta, we are incompatible. */ + { + if (strcmp(event_get_version(), "1.4.0-beta")) { + log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " + "Libevent 1.4.0-beta header files, whereas you have linked " + "against Libevent %s. This will probably make Tor crash.", + event_get_version()); + } + } +#else + /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or + later, we're probably fine. */ + { + const char *v = event_get_version(); + if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') { + log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " + "Libevent header file from 1.3e or earlier, whereas you have " + "linked against Libevent %s. This will probably make Tor " + "crash.", event_get_version()); + } + } +#endif + +#elif defined(HEADER_VERSION) +#warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd." +#else + /* Your libevent is ancient. */ +#endif +} + +/* + If possible, we're going to try to use Libevent's periodic timer support, + since it does a pretty good job of making sure that periodic events get + called exactly M seconds apart, rather than starting each one exactly M + seconds after the time that the last one was run. + */ +#ifdef HAVE_EVENT2_EVENT_H +#define HAVE_PERIODIC +#define PERIODIC_FLAGS EV_PERSIST +#else +#define PERIODIC_FLAGS 0 +#endif + +/** Represents a timer that's run every N microseconds by Libevent. */ +struct periodic_timer_t { + /** Underlying event used to implement this periodic event. */ + struct event *ev; + /** The callback we'll be invoking whenever the event triggers */ + void (*cb)(struct periodic_timer_t *, void *); + /** User-supplied data for the callback */ + void *data; +#ifndef HAVE_PERIODIC + /** If Libevent doesn't know how to invoke events every N microseconds, + * we'll need to remember the timeout interval here. */ + struct timeval tv; +#endif +}; + +/** Libevent callback to implement a periodic event. */ +static void +periodic_timer_cb(evutil_socket_t fd, short what, void *arg) +{ + periodic_timer_t *timer = arg; + (void) what; + (void) fd; +#ifndef HAVE_PERIODIC + /** reschedule the event as needed. */ + event_add(timer->ev, &timer->tv); +#endif + timer->cb(timer, timer->data); +} + +/** Create and schedule a new timer that will run every tv in + * the event loop of base. When the timer fires, it will + * run the timer in cb with the user-supplied data in data. */ +periodic_timer_t * +periodic_timer_new(struct event_base *base, + const struct timeval *tv, + void (*cb)(periodic_timer_t *timer, void *data), + void *data) +{ + periodic_timer_t *timer; + tor_assert(base); + tor_assert(tv); + tor_assert(cb); + timer = tor_malloc_zero(sizeof(periodic_timer_t)); + if (!(timer->ev = tor_event_new(base, -1, PERIODIC_FLAGS, + periodic_timer_cb, timer))) { + tor_free(timer); + return NULL; + } + timer->cb = cb; + timer->data = data; +#ifndef HAVE_PERIODIC + memcpy(&timer->tv, tv, sizeof(struct timeval)); +#endif + event_add(timer->ev, (struct timeval *)tv); /*drop const for old libevent*/ + return timer; +} + +/** Stop and free a periodic timer */ +void +periodic_timer_free(periodic_timer_t *timer) +{ + if (!timer) + return; + tor_event_free(timer->ev); + tor_free(timer); +} + +#ifdef USE_BUFFEREVENTS +static const struct timeval *one_tick = NULL; +/** + * Return a special timeout to be passed whenever libevent's O(1) timeout + * implementation should be used. Only use this when the timer is supposed + * to fire after msec_per_tick ticks have elapsed. +*/ +const struct timeval * +tor_libevent_get_one_tick_timeout(void) +{ + tor_assert(one_tick); + return one_tick; +} + +/** Initialize the common timeout that we'll use to refill the buckets every + * time a tick elapses. */ +static void +tor_libevent_set_tick_timeout(int msec_per_tick) +{ + struct event_base *base = tor_libevent_get_base(); + struct timeval tv; + + tor_assert(! one_tick); + tv.tv_sec = msec_per_tick / 1000; + tv.tv_usec = (msec_per_tick % 1000) * 1000; + one_tick = event_base_init_common_timeout(base, &tv); +} + +static struct bufferevent * +tor_get_root_bufferevent(struct bufferevent *bev) +{ + struct bufferevent *u; + while ((u = bufferevent_get_underlying(bev)) != NULL) + bev = u; + return bev; +} + +int +tor_set_bufferevent_rate_limit(struct bufferevent *bev, + struct ev_token_bucket_cfg *cfg) +{ + return bufferevent_set_rate_limit(tor_get_root_bufferevent(bev), cfg); +} + +int +tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev, + struct bufferevent_rate_limit_group *g) +{ + return bufferevent_add_to_rate_limit_group(tor_get_root_bufferevent(bev), g); +} +#endif + +#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,1,1) +void +tor_gettimeofday_cached(struct timeval *tv) +{ + event_base_gettimeofday_cached(the_event_base, tv); +} +void +tor_gettimeofday_cache_clear(void) +{ + event_base_update_cache_time(the_event_base); +} +#else +/** Cache the current hi-res time; the cache gets reset when libevent + * calls us. */ +static struct timeval cached_time_hires = {0, 0}; + +/** Return a fairly recent view of the current time. */ +void +tor_gettimeofday_cached(struct timeval *tv) +{ + if (cached_time_hires.tv_sec == 0) { + tor_gettimeofday(&cached_time_hires); + } + *tv = cached_time_hires; +} + +/** Reset the cached view of the current time, so that the next time we try + * to learn it, we will get an up-to-date value. */ +void +tor_gettimeofday_cache_clear(void) +{ + cached_time_hires.tv_sec = 0; +} +#endif + diff --git a/src/tor/compat_libevent.h b/src/tor/compat_libevent.h new file mode 100644 index 000000000..fda873359 --- /dev/null +++ b/src/tor/compat_libevent.h @@ -0,0 +1,96 @@ +/* Copyright (c) 2009-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_COMPAT_LIBEVENT_H +#define TOR_COMPAT_LIBEVENT_H + +#include "orconfig.h" + +struct event; +struct event_base; +#ifdef USE_BUFFEREVENTS +struct bufferevent; +struct ev_token_bucket_cfg; +struct bufferevent_rate_limit_group; +#endif + +#ifdef HAVE_EVENT2_EVENT_H +#include +#elif !defined(EVUTIL_SOCKET_DEFINED) +#define EVUTIL_SOCKET_DEFINED +#define evutil_socket_t int +#endif + +void configure_libevent_logging(void); +void suppress_libevent_log_msg(const char *msg); + +#ifdef HAVE_EVENT2_EVENT_H +#define tor_event_new event_new +#define tor_evtimer_new evtimer_new +#define tor_evsignal_new evsignal_new +#define tor_event_free event_free +#define tor_evdns_add_server_port(sock, tcp, cb, data) \ + evdns_add_server_port_with_base(tor_libevent_get_base(), \ + (sock),(tcp),(cb),(data)); + +#else +struct event *tor_event_new(struct event_base * base, evutil_socket_t sock, + short what, void (*cb)(evutil_socket_t, short, void *), void *arg); +struct event *tor_evtimer_new(struct event_base * base, + void (*cb)(evutil_socket_t, short, void *), void *arg); +struct event *tor_evsignal_new(struct event_base * base, int sig, + void (*cb)(evutil_socket_t, short, void *), void *arg); +void tor_event_free(struct event *ev); +#define tor_evdns_add_server_port evdns_add_server_port +#endif + +typedef struct periodic_timer_t periodic_timer_t; + +periodic_timer_t *periodic_timer_new(struct event_base *base, + const struct timeval *tv, + void (*cb)(periodic_timer_t *timer, void *data), + void *data); +void periodic_timer_free(periodic_timer_t *); + +#ifdef HAVE_EVENT_BASE_LOOPEXIT +#define tor_event_base_loopexit event_base_loopexit +#else +struct timeval; +int tor_event_base_loopexit(struct event_base *base, struct timeval *tv); +#endif + +/** Defines a configuration for using libevent with Tor: passed as an argument + * to tor_libevent_initialize() to describe how we want to set up. */ +typedef struct tor_libevent_cfg { + /** Flag: if true, disable IOCP (assuming that it could be enabled). */ + int disable_iocp; + /** How many CPUs should we use (relevant only with IOCP). */ + int num_cpus; + /** How many milliseconds should we allow between updating bandwidth limits? + * (relevant only with bufferevents). */ + int msec_per_tick; +} tor_libevent_cfg; + +void tor_libevent_initialize(tor_libevent_cfg *cfg); +struct event_base *tor_libevent_get_base(void); +const char *tor_libevent_get_method(void); +void tor_check_libevent_version(const char *m, int server, + const char **badness_out); +void tor_check_libevent_header_compatibility(void); +const char *tor_libevent_get_version_str(void); +const char *tor_libevent_get_header_version_str(void); + +#ifdef USE_BUFFEREVENTS +const struct timeval *tor_libevent_get_one_tick_timeout(void); +int tor_libevent_using_iocp_bufferevents(void); +int tor_set_bufferevent_rate_limit(struct bufferevent *bev, + struct ev_token_bucket_cfg *cfg); +int tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev, + struct bufferevent_rate_limit_group *g); +#endif + +void tor_gettimeofday_cached(struct timeval *tv); +void tor_gettimeofday_cache_clear(void); + +#endif + diff --git a/src/tor/src/or/config.c b/src/tor/config.c similarity index 60% rename from src/tor/src/or/config.c rename to src/tor/config.c index 3ae3af55a..60e35fd1c 100644 --- a/src/tor/src/or/config.c +++ b/src/tor/config.c @@ -1,80 +1,26 @@ -/* Copyright (c) 2001 Matej Pfajfar. + /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file config.c - * \brief Code to interpret the user's configuration of Tor. - * - * This module handles torrc configuration file, including parsing it, - * combining it with torrc.defaults and the command line, allowing - * user changes to it (via editing and SIGHUP or via the control port), - * writing it back to disk (because of SAVECONF from the control port), - * and -- most importantly, acting on it. - * - * The module additionally has some tools for manipulating and - * inspecting values that are calculated as a result of the - * configured options. - * - *

How to add new options

- * - * To add new items to the torrc, there are a minimum of three places to edit: - *
    - *
  • The or_options_t structure in or.h, where the options are stored. - *
  • The option_vars_ array below in this module, which configures - * the names of the torrc options, their types, their multiplicities, - * and their mappings to fields in or_options_t. - *
  • The manual in doc/tor.1.txt, to document what the new option - * is, and how it works. - *
- * - * Additionally, you might need to edit these places too: - *
    - *
  • options_validate() below, in case you want to reject some possible - * values of the new configuration option. - *
  • options_transition_allowed() below, in case you need to - * forbid some or all changes in the option while Tor is - * running. - *
  • options_transition_affects_workers(), in case changes in the option - * might require Tor to relaunch or reconfigure its worker threads. - *
  • options_transition_affects_descriptor(), in case changes in the - * option might require a Tor relay to build and publish a new server - * descriptor. - *
  • options_act() and/or options_act_reversible(), in case there's some - * action that needs to be taken immediately based on the option's - * value. - *
- * - *

Changing the value of an option

- * - * Because of the SAVECONF command from the control port, it's a bad - * idea to change the value of any user-configured option in the - * or_options_t. If you want to sometimes do this anyway, we recommend - * that you create a secondary field in or_options_t; that you have the - * user option linked only to the secondary field; that you use the - * secondary field to initialize the one that Tor actually looks at; and that - * you use the one Tor looks as the one that you modify. + * \brief Code to parse and interpret configuration files. **/ #define CONFIG_PRIVATE #include "or.h" -#include "bridges.h" -#include "compat.h" #include "addressmap.h" #include "channel.h" #include "circuitbuild.h" #include "circuitlist.h" #include "circuitmux.h" #include "circuitmux_ewma.h" -#include "circuitstats.h" -#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" -#include "consdiffmgr.h" #include "control.h" #include "confparse.h" #include "cpuworker.h" @@ -82,48 +28,34 @@ #include "dirvote.h" #include "dns.h" #include "entrynodes.h" -#include "git_revision.h" #include "geoip.h" #include "hibernate.h" -#include "main.h" +#include "onion_main.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" #include "relay.h" #include "rendclient.h" #include "rendservice.h" -#include "hs_config.h" #include "rephist.h" #include "router.h" #include "sandbox.h" -#include "util.h" +#include "tor_util.h" #include "routerlist.h" #include "routerset.h" -#include "scheduler.h" #include "statefile.h" #include "transports.h" #include "ext_orport.h" +#include "torgzip.h" +#include "anonymize.h" #ifdef _WIN32 #include #endif #include "procmon.h" -#ifdef HAVE_SYSTEMD -# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) -/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse - * Coverity. Here's a kludge to unconfuse it. - */ -# define __INCLUDE_LEVEL__ 2 -#endif /* defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) */ -#include -#endif /* defined(HAVE_SYSTEMD) */ - -/* Prefix used to indicate a Unix socket in a FooPort configuration. */ -static const char unix_socket_prefix[] = "unix:"; -/* Prefix used to indicate a Unix socket with spaces in it, in a FooPort - * configuration. */ -static const char unix_q_socket_prefix[] = "unix:\""; +/* From onion_main.c */ +extern int quiet_level; /** A list of abbreviations and aliases to map command-line options, obsolete * option names, or alternative option names, to their current values. */ @@ -132,16 +64,15 @@ static config_abbrev_t option_abbrevs_[] = { PLURAL(AuthDirBadExitCC), PLURAL(AuthDirInvalidCC), PLURAL(AuthDirRejectCC), + PLURAL(ExitNode), PLURAL(EntryNode), PLURAL(ExcludeNode), - PLURAL(Tor2webRendezvousPoint), PLURAL(FirewallPort), PLURAL(LongLivedPort), PLURAL(HiddenServiceNode), PLURAL(HiddenServiceExcludeNode), PLURAL(NumCPU), PLURAL(RendNode), - PLURAL(RecommendedPackage), PLURAL(RendExcludeNode), PLURAL(StrictEntryNode), PLURAL(StrictExitNode), @@ -153,9 +84,8 @@ static config_abbrev_t option_abbrevs_[] = { { "BandwidthRateBytes", "BandwidthRate", 0, 0}, { "BandwidthBurstBytes", "BandwidthBurst", 0, 0}, { "DirFetchPostPeriod", "StatusFetchPeriod", 0, 0}, - { "DirServer", "DirAuthority", 0, 0}, /* XXXX later, make this warn? */ + { "DirServer", "DirAuthority", 0, 0}, /* XXXX024 later, make this warn? */ { "MaxConn", "ConnLimit", 0, 1}, - { "MaxMemInCellQueues", "MaxMemInQueues", 0, 0}, { "ORBindAddress", "ORListenAddress", 0, 0}, { "DirBindAddress", "DirListenAddress", 0, 0}, { "SocksBindAddress", "SocksListenAddress", 0, 0}, @@ -169,77 +99,62 @@ static config_abbrev_t option_abbrevs_[] = { { "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0}, { "BridgeAuthoritativeDirectory", "BridgeAuthoritativeDir", 0, 0}, { "HashedControlPassword", "__HashedControlSessionPassword", 1, 0}, + { "StrictEntryNodes", "StrictNodes", 0, 1}, + { "StrictExitNodes", "StrictNodes", 0, 1}, { "VirtualAddrNetwork", "VirtualAddrNetworkIPv4", 0, 0}, + { "_UseFilteringSSLBufferevents", "UseFilteringSSLBufferevents", 0, 1}, { NULL, NULL, 0, 0}, }; -/** dummy instance of or_options_t, used for type-checking its - * members with CONF_CHECK_VAR_TYPE. */ -DUMMY_TYPECHECK_INSTANCE(or_options_t); - /** An entry for config_vars: "The option name has type * CONFIG_TYPE_conftype, and corresponds to * or_options_t.member" */ #define VAR(name,conftype,member,initvalue) \ - { name, CONFIG_TYPE_ ## conftype, offsetof(or_options_t, member), \ - initvalue CONF_TEST_MEMBERS(or_options_t, conftype, member) } + { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_options_t, member), \ + initvalue } /** As VAR, but the option name and member name are the same. */ #define V(member,conftype,initvalue) \ VAR(#member, conftype, member, initvalue) /** An entry for config_vars: "The option name is obsolete." */ -#ifdef TOR_UNIT_TESTS -#define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL, {.INT=NULL} } -#else #define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL } -#endif -/** - * Macro to declare *Port options. Each one comes in three entries. - * For example, most users should use "SocksPort" to configure the - * socks port, but TorBrowser wants to use __SocksPort so that it - * isn't stored by SAVECONF. The SocksPortLines virtual option is - * used to query both options from the controller. - */ -#define VPORT(member) \ - VAR(#member "Lines", LINELIST_V, member ## _lines, NULL), \ - VAR(#member, LINELIST_S, member ## _lines, NULL), \ - VAR("__" #member, LINELIST_S, member ## _lines, NULL) +#define VPORT(member,conftype,initvalue) \ + VAR(#member, conftype, member ## _lines, initvalue) /** Array of configuration options. Until we disallow nonstandard * abbreviations, order is significant, since the first matching option will * be chosen first. */ static config_var_t option_vars_[] = { + OBSOLETE("AccountingMaxKB"), V(AccountingMax, MEMUNIT, "0 bytes"), - VAR("AccountingRule", STRING, AccountingRule_option, "max"), V(AccountingStart, STRING, NULL), V(Address, STRING, NULL), - OBSOLETE("AllowDotExit"), - OBSOLETE("AllowInvalidNodes"), + V(AllowDotExit, BOOL, "0"), + V(AllowInvalidNodes, CSV, "middle,rendezvous"), V(AllowNonRFC953Hostnames, BOOL, "0"), - OBSOLETE("AllowSingleHopCircuits"), - OBSOLETE("AllowSingleHopExits"), + V(AllowSingleHopCircuits, BOOL, "0"), + V(AllowSingleHopExits, BOOL, "0"), V(AlternateBridgeAuthority, LINELIST, NULL), V(AlternateDirAuthority, LINELIST, NULL), - OBSOLETE("AlternateHSAuthority"), + V(AlternateHSAuthority, LINELIST, NULL), V(AssumeReachable, BOOL, "0"), - OBSOLETE("AuthDirBadDir"), - OBSOLETE("AuthDirBadDirCCs"), + V(AuthDirBadDir, LINELIST, NULL), + V(AuthDirBadDirCCs, CSV, ""), V(AuthDirBadExit, LINELIST, NULL), V(AuthDirBadExitCCs, CSV, ""), V(AuthDirInvalid, LINELIST, NULL), V(AuthDirInvalidCCs, CSV, ""), V(AuthDirFastGuarantee, MEMUNIT, "100 KB"), - V(AuthDirGuardBWGuarantee, MEMUNIT, "2 MB"), - V(AuthDirPinKeys, BOOL, "1"), + V(AuthDirGuardBWGuarantee, MEMUNIT, "250 KB"), V(AuthDirReject, LINELIST, NULL), V(AuthDirRejectCCs, CSV, ""), - OBSOLETE("AuthDirRejectUnlisted"), - OBSOLETE("AuthDirListBadDirs"), + V(AuthDirRejectUnlisted, BOOL, "0"), + V(AuthDirListBadDirs, BOOL, "0"), V(AuthDirListBadExits, BOOL, "0"), V(AuthDirMaxServersPerAddr, UINT, "2"), - OBSOLETE("AuthDirMaxServersPerAuthAddr"), + V(AuthDirMaxServersPerAuthAddr,UINT, "5"), V(AuthDirHasIPv6Connectivity, BOOL, "0"), VAR("AuthoritativeDirectory", BOOL, AuthoritativeDir, "0"), V(AutomapHostsOnResolve, BOOL, "0"), @@ -252,63 +167,59 @@ static config_var_t option_vars_[] = { V(BridgePassword, STRING, NULL), V(BridgeRecordUsageByCountry, BOOL, "1"), V(BridgeRelay, BOOL, "0"), - V(BridgeDistribution, STRING, NULL), - VAR("CacheDirectory", FILENAME, CacheDirectory_option, NULL), - V(CacheDirectoryGroupReadable, BOOL, "0"), V(CellStatistics, BOOL, "0"), - V(PaddingStatistics, BOOL, "1"), V(LearnCircuitBuildTimeout, BOOL, "1"), V(CircuitBuildTimeout, INTERVAL, "0"), - OBSOLETE("CircuitIdleTimeout"), - V(CircuitsAvailableTimeout, INTERVAL, "0"), + V(CircuitIdleTimeout, INTERVAL, "1 hour"), V(CircuitStreamTimeout, INTERVAL, "0"), V(CircuitPriorityHalflife, DOUBLE, "-100.0"), /*negative:'Use default'*/ V(ClientDNSRejectInternalAddresses, BOOL,"1"), V(ClientOnly, BOOL, "0"), - V(ClientPreferIPv6ORPort, AUTOBOOL, "auto"), - V(ClientPreferIPv6DirPort, AUTOBOOL, "auto"), + V(ClientPreferIPv6ORPort, BOOL, "0"), V(ClientRejectInternalAddresses, BOOL, "1"), V(ClientTransportPlugin, LINELIST, NULL), V(ClientUseIPv6, BOOL, "0"), - V(ClientUseIPv4, BOOL, "1"), V(ConsensusParams, STRING, NULL), V(ConnLimit, UINT, "1000"), V(ConnDirectionStatistics, BOOL, "0"), V(ConstrainedSockets, BOOL, "0"), V(ConstrainedSockSize, MEMUNIT, "8192"), V(ContactInfo, STRING, NULL), - OBSOLETE("ControlListenAddress"), - VPORT(ControlPort), + V(ControlListenAddress, LINELIST, NULL), + VPORT(ControlPort, LINELIST, NULL), V(ControlPortFileGroupReadable,BOOL, "0"), V(ControlPortWriteToFile, FILENAME, NULL), V(ControlSocket, LINELIST, NULL), V(ControlSocketsGroupWritable, BOOL, "0"), - V(SocksSocketsGroupWritable, BOOL, "0"), V(CookieAuthentication, BOOL, "0"), V(CookieAuthFileGroupReadable, BOOL, "0"), V(CookieAuthFile, STRING, NULL), V(CountPrivateBandwidth, BOOL, "0"), - VAR("DataDirectory", FILENAME, DataDirectory_option, NULL), - V(DataDirectoryGroupReadable, BOOL, "0"), - V(DisableOOSCheck, BOOL, "1"), + V(DataDirectory, FILENAME, NULL), + OBSOLETE("DebugLogFile"), V(DisableNetwork, BOOL, "0"), V(DirAllowPrivateAddresses, BOOL, "0"), V(TestingAuthDirTimeToLearnReachability, INTERVAL, "30 minutes"), - OBSOLETE("DirListenAddress"), + V(DirListenAddress, LINELIST, NULL), + OBSOLETE("DirFetchPeriod"), V(DirPolicy, LINELIST, NULL), - VPORT(DirPort), + VPORT(DirPort, LINELIST, NULL), V(DirPortFrontPage, FILENAME, NULL), - VAR("DirReqStatistics", BOOL, DirReqStatistics_option, "1"), + OBSOLETE("DirPostPeriod"), + OBSOLETE("DirRecordUsageByCountry"), + OBSOLETE("DirRecordUsageGranularity"), + OBSOLETE("DirRecordUsageRetainIPs"), + OBSOLETE("DirRecordUsageSaveInterval"), + V(DirReqStatistics, BOOL, "1"), VAR("DirAuthority", LINELIST, DirAuthorities, NULL), - V(DirCache, BOOL, "1"), V(DirAuthorityFallbackRate, DOUBLE, "1.0"), V(DisableAllSwap, BOOL, "0"), V(DisableDebuggerAttachment, BOOL, "1"), - OBSOLETE("DisableIOCP"), + V(DisableIOCP, BOOL, "1"), OBSOLETE("DisableV2DirectoryInfo_"), - OBSOLETE("DynamicDHGroups"), - VPORT(DNSPort), - OBSOLETE("DNSListenAddress"), + V(DynamicDHGroups, BOOL, "0"), + VPORT(DNSPort, LINELIST, NULL), + V(DNSListenAddress, LINELIST, NULL), V(DownloadExtraInfo, BOOL, "0"), V(TestingEnableConnBwEvent, BOOL, "0"), V(TestingEnableCellStatsEvent, BOOL, "0"), @@ -319,27 +230,20 @@ static config_var_t option_vars_[] = { V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"), V(ExcludeNodes, ROUTERSET, NULL), V(ExcludeExitNodes, ROUTERSET, NULL), - OBSOLETE("ExcludeSingleHopRelays"), + V(ExcludeSingleHopRelays, BOOL, "1"), V(ExitNodes, ROUTERSET, NULL), V(ExitPolicy, LINELIST, NULL), V(ExitPolicyRejectPrivate, BOOL, "1"), - V(ExitPolicyRejectLocalInterfaces, BOOL, "0"), V(ExitPortStatistics, BOOL, "0"), V(ExtendAllowPrivateAddresses, BOOL, "0"), - V(ExitRelay, AUTOBOOL, "auto"), - VPORT(ExtORPort), - V(ExtORPortCookieAuthFile, STRING, NULL), - V(ExtORPortCookieAuthFileGroupReadable, BOOL, "0"), + VPORT(ExtORPort, LINELIST, NULL), V(ExtraInfoStatistics, BOOL, "1"), - V(ExtendByEd25519ID, AUTOBOOL, "auto"), V(FallbackDir, LINELIST, NULL), - V(UseDefaultFallbackDirs, BOOL, "1"), - OBSOLETE("FallbackNetworkstatusFile"), V(FascistFirewall, BOOL, "0"), V(FirewallPorts, CSV, ""), - OBSOLETE("FastFirstHopPK"), + V(FastFirstHopPK, AUTOBOOL, "auto"), V(FetchDirInfoEarly, BOOL, "0"), V(FetchDirInfoExtraEarly, BOOL, "0"), V(FetchServerDescriptors, BOOL, "1"), @@ -352,90 +256,77 @@ static config_var_t option_vars_[] = { V(GeoIPv6File, FILENAME, ""), #else V(GeoIPFile, FILENAME, - SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip"), + "/usr/share" PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip"), V(GeoIPv6File, FILENAME, - SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip6"), -#endif /* defined(_WIN32) */ + "/usr/share" PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip6"), +#endif + OBSOLETE("GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays"), OBSOLETE("Group"), V(GuardLifetime, INTERVAL, "0 minutes"), V(HardwareAccel, BOOL, "0"), V(HeartbeatPeriod, INTERVAL, "6 hours"), - V(MainloopStats, BOOL, "0"), V(AccelName, STRING, NULL), V(AccelDir, FILENAME, NULL), V(HashedControlPassword, LINELIST, NULL), - OBSOLETE("HidServDirectoryV2"), + V(HidServDirectoryV2, BOOL, "1"), VAR("HiddenServiceDir", LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceDirGroupReadable", LINELIST_S, RendConfigLines, NULL), + OBSOLETE("HiddenServiceExcludeNodes"), + OBSOLETE("HiddenServiceNodes"), VAR("HiddenServiceOptions",LINELIST_V, RendConfigLines, NULL), VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL), - VAR("HiddenServiceAllowUnknownPorts",LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceMaxStreams",LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceMaxStreamsCloseCircuit",LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceNumIntroductionPoints", LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceStatistics", BOOL, HiddenServiceStatistics_option, "1"), V(HidServAuth, LINELIST, NULL), - OBSOLETE("CloseHSClientCircuitsImmediatelyOnTimeout"), - OBSOLETE("CloseHSServiceRendCircuitsImmediatelyOnTimeout"), - V(HiddenServiceSingleHopMode, BOOL, "0"), - V(HiddenServiceNonAnonymousMode,BOOL, "0"), + V(HSAuthoritativeDir, BOOL, "0"), + OBSOLETE("HSAuthorityRecordStats"), + V(CloseHSClientCircuitsImmediatelyOnTimeout, BOOL, "0"), + V(CloseHSServiceRendCircuitsImmediatelyOnTimeout, BOOL, "0"), V(HTTPProxy, STRING, NULL), V(HTTPProxyAuthenticator, STRING, NULL), V(HTTPSProxy, STRING, NULL), V(HTTPSProxyAuthenticator, STRING, NULL), - VPORT(HTTPTunnelPort), V(IPv6Exit, BOOL, "0"), VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL), V(ServerTransportListenAddr, LINELIST, NULL), V(ServerTransportOptions, LINELIST, NULL), - V(SigningKeyLifetime, INTERVAL, "30 days"), V(Socks4Proxy, STRING, NULL), V(Socks5Proxy, STRING, NULL), V(Socks5ProxyUsername, STRING, NULL), V(Socks5ProxyPassword, STRING, NULL), - VAR("KeyDirectory", FILENAME, KeyDirectory_option, NULL), - V(KeyDirectoryGroupReadable, BOOL, "0"), + OBSOLETE("IgnoreVersion"), V(KeepalivePeriod, INTERVAL, "5 minutes"), - V(KeepBindCapabilities, AUTOBOOL, "auto"), VAR("Log", LINELIST, Logs, NULL), V(LogMessageDomains, BOOL, "0"), + OBSOLETE("LinkPadding"), + OBSOLETE("LogLevel"), + OBSOLETE("LogFile"), V(LogTimeGranularity, MSEC_INTERVAL, "1 second"), - V(TruncateLogFile, BOOL, "0"), - V(SyslogIdentityTag, STRING, NULL), - V(AndroidIdentityTag, STRING, NULL), V(LongLivedPorts, CSV, "21,22,706,1863,5050,5190,5222,5223,6523,6667,6697,8300"), VAR("MapAddress", LINELIST, AddressMap, NULL), V(MaxAdvertisedBandwidth, MEMUNIT, "1 GB"), V(MaxCircuitDirtiness, INTERVAL, "10 minutes"), V(MaxClientCircuitsPending, UINT, "32"), - V(MaxConsensusAgeForDiffs, INTERVAL, "0 seconds"), - VAR("MaxMemInQueues", MEMUNIT, MaxMemInQueues_raw, "0"), + V(MaxMemInCellQueues, MEMUNIT, "8 GB"), OBSOLETE("MaxOnionsPending"), V(MaxOnionQueueDelay, MSEC_INTERVAL, "1750 msec"), - V(MaxUnparseableDescSizeToLog, MEMUNIT, "10 MB"), V(MinMeasuredBWsForAuthToIgnoreAdvertised, INT, "500"), - VAR("MyFamily", LINELIST, MyFamily_lines, NULL), + OBSOLETE("MonthlyAccountingStart"), + V(MyFamily, STRING, NULL), V(NewCircuitPeriod, INTERVAL, "30 seconds"), - OBSOLETE("NamingAuthoritativeDirectory"), - OBSOLETE("NATDListenAddress"), - VPORT(NATDPort), + VAR("NamingAuthoritativeDirectory",BOOL, NamingAuthoritativeDir, "0"), + V(NATDListenAddress, LINELIST, NULL), + VPORT(NATDPort, LINELIST, NULL), V(Nickname, STRING, NULL), - OBSOLETE("PredictedPortsRelevanceTime"), - OBSOLETE("WarnUnsafeSocks"), + V(WarnUnsafeSocks, BOOL, "1"), + OBSOLETE("NoPublish"), VAR("NodeFamily", LINELIST, NodeFamilies, NULL), - V(NoExec, BOOL, "0"), V(NumCPUs, UINT, "0"), V(NumDirectoryGuards, UINT, "0"), - V(NumEntryGuards, UINT, "0"), - V(OfflineMasterKey, BOOL, "0"), - OBSOLETE("ORListenAddress"), - VPORT(ORPort), + V(NumEntryGuards, UINT, "3"), + V(ORListenAddress, LINELIST, NULL), + VPORT(ORPort, LINELIST, NULL), V(OutboundBindAddress, LINELIST, NULL), - V(OutboundBindAddressOR, LINELIST, NULL), - V(OutboundBindAddressExit, LINELIST, NULL), OBSOLETE("PathBiasDisableRate"), V(PathBiasCircThreshold, INT, "-1"), @@ -454,23 +345,17 @@ static config_var_t option_vars_[] = { V(PathBiasScaleUseThreshold, INT, "-1"), V(PathsNeededToBuildCircuits, DOUBLE, "-1"), + OBSOLETE("PathlenCoinWeight"), V(PerConnBWBurst, MEMUNIT, "0"), V(PerConnBWRate, MEMUNIT, "0"), V(PidFile, STRING, NULL), V(TestingTorNetwork, BOOL, "0"), V(TestingMinExitFlagThreshold, MEMUNIT, "0"), V(TestingMinFastFlagThreshold, MEMUNIT, "0"), - - V(TestingLinkCertLifetime, INTERVAL, "2 days"), - V(TestingAuthKeyLifetime, INTERVAL, "2 days"), - V(TestingLinkKeySlop, INTERVAL, "3 hours"), - V(TestingAuthKeySlop, INTERVAL, "3 hours"), - V(TestingSigningKeySlop, INTERVAL, "1 day"), - V(OptimisticData, AUTOBOOL, "auto"), V(PortForwarding, BOOL, "0"), V(PortForwardingHelper, FILENAME, "tor-fw-helper"), - OBSOLETE("PreferTunneledDirConns"), + V(PreferTunneledDirConns, BOOL, "1"), V(ProtocolWarnings, BOOL, "0"), V(PublishServerDescriptor, CSV, "1"), V(PublishHidServDescriptors, BOOL, "1"), @@ -480,17 +365,18 @@ static config_var_t option_vars_[] = { V(RecommendedVersions, LINELIST, NULL), V(RecommendedClientVersions, LINELIST, NULL), V(RecommendedServerVersions, LINELIST, NULL), - V(RecommendedPackages, LINELIST, NULL), - V(ReducedConnectionPadding, BOOL, "0"), - V(ConnectionPadding, AUTOBOOL, "auto"), + OBSOLETE("RedirectExit"), V(RefuseUnknownExits, AUTOBOOL, "auto"), V(RejectPlaintextPorts, CSV, ""), V(RelayBandwidthBurst, MEMUNIT, "0"), V(RelayBandwidthRate, MEMUNIT, "0"), + OBSOLETE("RendExcludeNodes"), + OBSOLETE("RendNodes"), V(RendPostPeriod, INTERVAL, "1 hour"), V(RephistTrackTime, INTERVAL, "24 hours"), + OBSOLETE("RouterFile"), V(RunAsDaemon, BOOL, "0"), - V(ReducedExitPolicy, BOOL, "0"), +// V(RunTesting, BOOL, "0"), OBSOLETE("RunTesting"), // currently unused V(Sandbox, BOOL, "0"), V(SafeLogging, STRING, "1"), @@ -503,45 +389,37 @@ static config_var_t option_vars_[] = { V(ServerDNSSearchDomains, BOOL, "0"), V(ServerDNSTestAddresses, CSV, "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"), - OBSOLETE("SchedulerLowWaterMark__"), - OBSOLETE("SchedulerHighWaterMark__"), - OBSOLETE("SchedulerMaxFlushCells__"), - V(KISTSchedRunInterval, MSEC_INTERVAL, "0 msec"), - V(KISTSockBufSizeFactor, DOUBLE, "1.0"), - V(Schedulers, CSV, "KIST,KISTLite,Vanilla"), V(ShutdownWaitLength, INTERVAL, "30 seconds"), - OBSOLETE("SocksListenAddress"), + V(SocksListenAddress, LINELIST, NULL), V(SocksPolicy, LINELIST, NULL), - VPORT(SocksPort), + VPORT(SocksPort, LINELIST, NULL), V(SocksTimeout, INTERVAL, "2 minutes"), V(SSLKeyLifetime, INTERVAL, "0"), - OBSOLETE("StrictEntryNodes"), - OBSOLETE("StrictExitNodes"), + OBSOLETE("StatusFetchPeriod"), V(StrictNodes, BOOL, "0"), - OBSOLETE("Support022HiddenServices"), + V(Support022HiddenServices, AUTOBOOL, "auto"), + OBSOLETE("SysLog"), V(TestSocks, BOOL, "0"), + OBSOLETE("TestVia"), V(TokenBucketRefillInterval, MSEC_INTERVAL, "100 msec"), V(Tor2webMode, BOOL, "0"), - V(Tor2webRendezvousPoints, ROUTERSET, NULL), - OBSOLETE("TLSECGroup"), + V(TLSECGroup, STRING, NULL), V(TrackHostExits, CSV, NULL), V(TrackHostExitsExpire, INTERVAL, "30 minutes"), - OBSOLETE("TransListenAddress"), - VPORT(TransPort), + OBSOLETE("TrafficShaping"), + V(TransListenAddress, LINELIST, NULL), + VPORT(TransPort, LINELIST, NULL), V(TransProxyType, STRING, "default"), - OBSOLETE("TunnelDirConns"), + V(TunnelDirConns, BOOL, "1"), V(UpdateBridgesFromAuthority, BOOL, "0"), V(UseBridges, BOOL, "0"), - VAR("UseEntryGuards", BOOL, UseEntryGuards_option, "1"), - OBSOLETE("UseEntryGuardsAsDirGuards"), - V(UseGuardFraction, AUTOBOOL, "auto"), + V(UseEntryGuards, BOOL, "1"), + V(UseEntryGuardsAsDirGuards, BOOL, "1"), V(UseMicrodescriptors, AUTOBOOL, "auto"), - OBSOLETE("UseNTorHandshake"), + V(UseNTorHandshake, AUTOBOOL, "1"), V(User, STRING, NULL), - OBSOLETE("UserspaceIOCPBuffers"), - V(AuthDirSharedRandomness, BOOL, "1"), - V(AuthDirTestEd25519LinkKeys, BOOL, "1"), - OBSOLETE("V1AuthoritativeDirectory"), + V(UserspaceIOCPBuffers, BOOL, "0"), + VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir, "0"), OBSOLETE("V2AuthoritativeDirectory"), VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir, "0"), V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"), @@ -554,14 +432,11 @@ static config_var_t option_vars_[] = { V(V3AuthNIntervalsValid, UINT, "3"), V(V3AuthUseLegacyKey, BOOL, "0"), V(V3BandwidthsFile, FILENAME, NULL), - V(GuardfractionFile, FILENAME, NULL), VAR("VersioningAuthoritativeDirectory",BOOL,VersioningAuthoritativeDir, "0"), - OBSOLETE("VoteOnHidServDirectoriesV2"), V(VirtualAddrNetworkIPv4, STRING, "127.192.0.0/10"), V(VirtualAddrNetworkIPv6, STRING, "[FE80::]/10"), V(WarnPlaintextPorts, CSV, "23,109,110,143"), - OBSOLETE("UseFilteringSSLBufferevents"), - OBSOLETE("__UseFilteringSSLBufferevents"), + V(UseFilteringSSLBufferevents, BOOL, "0"), VAR("__ReloadTorrcOnSIGHUP", BOOL, ReloadTorrcOnSIGHUP, "1"), VAR("__AllDirActionsPrivate", BOOL, AllDirActionsPrivate, "0"), VAR("__DisablePredictedCircuits",BOOL,DisablePredictedCircuits, "0"), @@ -569,8 +444,8 @@ static config_var_t option_vars_[] = { VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword, NULL), VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL), - VAR("__OwningControllerFD",INT,OwningControllerFD, "-1"), - V(MinUptimeHidServDirectoryV2, INTERVAL, "96 hours"), + V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"), + V(VoteOnHidServDirectoriesV2, BOOL, "1"), V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, " "300, 900, 2147483647"), V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 60, 300, 600, " @@ -581,80 +456,28 @@ static config_var_t option_vars_[] = { V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, " "300, 600, 1800, 3600, 3600, 3600, " "10800, 21600, 43200"), - /* With the ClientBootstrapConsensus*Download* below: - * Clients with only authorities will try: - * - at least 3 authorities over 10 seconds, then exponentially backoff, - * with the next attempt 3-21 seconds later, - * Clients with authorities and fallbacks will try: - * - at least 2 authorities and 4 fallbacks over 21 seconds, then - * exponentially backoff, with the next attempts 4-33 seconds later, - * Clients will also retry when an application request arrives. - * After a number of failed requests, clients retry every 3 days + 1 hour. - * - * Clients used to try 2 authorities over 10 seconds, then wait for - * 60 minutes or an application request. - * - * When clients have authorities and fallbacks available, they use these - * schedules: (we stagger the times to avoid thundering herds) */ - V(ClientBootstrapConsensusAuthorityDownloadSchedule, CSV_INTERVAL, - "6, 11, 3600, 10800, 25200, 54000, 111600, 262800" /* 3 days + 1 hour */), - V(ClientBootstrapConsensusFallbackDownloadSchedule, CSV_INTERVAL, - "0, 1, 4, 11, 3600, 10800, 25200, 54000, 111600, 262800"), - /* When clients only have authorities available, they use this schedule: */ - V(ClientBootstrapConsensusAuthorityOnlyDownloadSchedule, CSV_INTERVAL, - "0, 3, 7, 3600, 10800, 25200, 54000, 111600, 262800"), - /* We don't want to overwhelm slow networks (or mirrors whose replies are - * blocked), but we also don't want to fail if only some mirrors are - * blackholed. Clients will try 3 directories simultaneously. - * (Relays never use simultaneous connections.) */ - V(ClientBootstrapConsensusMaxInProgressTries, UINT, "3"), - /* When a client has any running bridges, check each bridge occasionally, - * whether or not that bridge is actually up. */ - V(TestingBridgeDownloadSchedule, CSV_INTERVAL, - "10800, 25200, 54000, 111600, 262800"), - /* When a client is just starting, or has no running bridges, check each - * bridge a few times quickly, and then try again later. These schedules - * are much longer than the other schedules, because we try each and every - * configured bridge with this schedule. */ - V(TestingBridgeBootstrapDownloadSchedule, CSV_INTERVAL, - "0, 30, 90, 600, 3600, 10800, 25200, 54000, 111600, 262800"), + V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "3600, 900, 900, 3600"), V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "10 minutes"), V(TestingDirConnectionMaxStall, INTERVAL, "5 minutes"), V(TestingConsensusMaxDownloadTries, UINT, "8"), - /* Since we try connections rapidly and simultaneously, we can afford - * to give up earlier. (This protects against overloading directories.) */ - V(ClientBootstrapConsensusMaxDownloadTries, UINT, "7"), - /* We want to give up much earlier if we're only using authorities. */ - V(ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries, UINT, "4"), V(TestingDescriptorMaxDownloadTries, UINT, "8"), V(TestingMicrodescMaxDownloadTries, UINT, "8"), V(TestingCertMaxDownloadTries, UINT, "8"), - V(TestingDirAuthVoteExit, ROUTERSET, NULL), - V(TestingDirAuthVoteExitIsStrict, BOOL, "0"), V(TestingDirAuthVoteGuard, ROUTERSET, NULL), - V(TestingDirAuthVoteGuardIsStrict, BOOL, "0"), - V(TestingDirAuthVoteHSDir, ROUTERSET, NULL), - V(TestingDirAuthVoteHSDirIsStrict, BOOL, "0"), VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"), - END_OF_CONFIG_VARS + { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; /** Override default values with these if the user sets the TestingTorNetwork * option. */ static const config_var_t testing_tor_network_defaults[] = { + V(ServerDNSAllowBrokenConfig, BOOL, "1"), V(DirAllowPrivateAddresses, BOOL, "1"), V(EnforceDistinctSubnets, BOOL, "0"), V(AssumeReachable, BOOL, "1"), V(AuthDirMaxServersPerAddr, UINT, "0"), - V(ClientBootstrapConsensusAuthorityDownloadSchedule, CSV_INTERVAL, - "0, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 16, 32, 60"), - V(ClientBootstrapConsensusFallbackDownloadSchedule, CSV_INTERVAL, - "0, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 16, 32, 60"), - V(ClientBootstrapConsensusAuthorityOnlyDownloadSchedule, CSV_INTERVAL, - "0, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 16, 32, 60"), - V(ClientBootstrapConsensusMaxDownloadTries, UINT, "80"), - V(ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries, UINT, "80"), + V(AuthDirMaxServersPerAuthAddr,UINT, "0"), V(ClientDNSRejectInternalAddresses, BOOL,"0"), V(ClientRejectInternalAddresses, BOOL, "0"), V(CountPrivateBandwidth, BOOL, "1"), @@ -663,9 +486,10 @@ static const config_var_t testing_tor_network_defaults[] = { V(V3AuthVotingInterval, INTERVAL, "5 minutes"), V(V3AuthVoteDelay, INTERVAL, "20 seconds"), V(V3AuthDistDelay, INTERVAL, "20 seconds"), - V(TestingV3AuthInitialVotingInterval, INTERVAL, "150 seconds"), + V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"), V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"), V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"), + V(TestingV3AuthVotingStartOffset, INTERVAL, "0"), V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"), V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"), V(MinUptimeHidServDirectoryV2, INTERVAL, "0 minutes"), @@ -677,9 +501,7 @@ static const config_var_t testing_tor_network_defaults[] = { "15, 20, 30, 60"), V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, " "15, 20, 30, 60"), - V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "10, 30, 60"), - V(TestingBridgeBootstrapDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, " - "15, 20, 30, 60"), + V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "60, 30, 30, 60"), V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "5 seconds"), V(TestingDirConnectionMaxStall, INTERVAL, "30 seconds"), V(TestingConsensusMaxDownloadTries, UINT, "80"), @@ -690,37 +512,19 @@ static const config_var_t testing_tor_network_defaults[] = { V(TestingEnableCellStatsEvent, BOOL, "1"), V(TestingEnableTbEmptyEvent, BOOL, "1"), VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"), - V(RendPostPeriod, INTERVAL, "2 minutes"), - END_OF_CONFIG_VARS + { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; #undef VAR #undef V #undef OBSOLETE -static const config_deprecation_t option_deprecation_notes_[] = { - /* Deprecated since 0.3.2.0-alpha. */ - { "HTTPProxy", "It only applies to direct unencrypted HTTP connections " - "to your directory server, which your Tor probably wasn't using." }, - { "HTTPProxyAuthenticator", "HTTPProxy is deprecated in favor of HTTPSProxy " - "which should be used with HTTPSProxyAuthenticator." }, - /* End of options deprecated since 0.3.2.1-alpha */ - - /* Options deprecated since 0.3.2.2-alpha */ - { "ReachableDirAddresses", "It has no effect on relays, and has had no " - "effect on clients since 0.2.8." }, - { "ClientPreferIPv6DirPort", "It has no effect on relays, and has had no " - "effect on clients since 0.2.8." }, - /* End of options deprecated since 0.3.2.2-alpha. */ - - { NULL, NULL } -}; - #ifdef _WIN32 static char *get_windows_conf_root(void); #endif static int options_act_reversible(const or_options_t *old_options, char **msg); +static int options_act(const or_options_t *old_options); static int options_transition_allowed(const or_options_t *old, const or_options_t *new, char **msg); @@ -728,22 +532,28 @@ static int options_transition_affects_workers( const or_options_t *old_options, const or_options_t *new_options); static int options_transition_affects_descriptor( const or_options_t *old_options, const or_options_t *new_options); -static int normalize_nickname_list(config_line_t **normalized_out, - const config_line_t *lst, const char *name, - char **msg); +static int check_nickname_list(char **lst, const char *name, char **msg); + +static int parse_client_transport_line(const char *line, int validate_only); + +static int parse_server_transport_line(const char *line, int validate_only); static char *get_bindaddr_from_transport_listen_line(const char *line, const char *transport); +static int parse_dir_authority_line(const char *line, + dirinfo_type_t required_type, + int validate_only); +static int parse_dir_fallback_line(const char *line, + int validate_only); +static void port_cfg_free(port_cfg_t *port); static int parse_ports(or_options_t *options, int validate_only, - char **msg_out, int *n_ports_out, - int *world_writable_control_socket); + char **msg_out, int *n_ports_out); static int check_server_ports(const smartlist_t *ports, - const or_options_t *options, - int *num_low_ports_out); -static int validate_data_directories(or_options_t *options); + const or_options_t *options); + +static int validate_data_directory(or_options_t *options); static int write_configuration_file(const char *fname, const or_options_t *options); -static int options_init_logs(const or_options_t *old_options, - or_options_t *options, int validate_only); +static int options_init_logs(or_options_t *options, int validate_only); static void init_libevent(const or_options_t *options); static int opt_streq(const char *s1, const char *s2); @@ -754,8 +564,6 @@ static void config_maybe_load_geoip_files_(const or_options_t *options, static int options_validate_cb(void *old_options, void *options, void *default_options, int from_setconf, char **msg); -static uint64_t compute_real_max_mem_in_queues(const uint64_t val, - int log_guess); /** Magic value for or_options_t. */ #define OR_OPTIONS_MAGIC 9090909 @@ -764,9 +572,8 @@ static uint64_t compute_real_max_mem_in_queues(const uint64_t val, STATIC config_format_t options_format = { sizeof(or_options_t), OR_OPTIONS_MAGIC, - offsetof(or_options_t, magic_), + STRUCT_OFFSET(or_options_t, magic_), option_abbrevs_, - option_deprecation_notes_, option_vars_, options_validate_cb, NULL @@ -784,7 +591,7 @@ static or_options_t *global_default_options = NULL; /** Name of most recently read torrc file. */ static char *torrc_fname = NULL; /** Name of the most recently read torrc-defaults file.*/ -static char *torrc_defaults_fname = NULL; +static char *torrc_defaults_fname; /** Configuration options set by command line. */ static config_line_t *global_cmdline_options = NULL; /** Non-configuration options set by the command line */ @@ -795,29 +602,25 @@ static int have_parsed_cmdline = 0; static char *global_dirfrontpagecontents = NULL; /** List of port_cfg_t for all configured ports. */ static smartlist_t *configured_ports = NULL; -/** True iff we're currently validating options, and any calls to - * get_options() are likely to be bugs. */ -static int in_option_validation = 0; /** Return the contents of our frontpage string, or NULL if not configured. */ -MOCK_IMPL(const char*, -get_dirportfrontpage, (void)) +const char * +get_dirportfrontpage(void) { return global_dirfrontpagecontents; } -/** Returns the currently configured options. */ -MOCK_IMPL(or_options_t *, -get_options_mutable, (void)) +/** Return the currently configured options. */ +or_options_t * +get_options_mutable(void) { tor_assert(global_options); - tor_assert_nonfatal(! in_option_validation); return global_options; } /** Returns the currently configured options */ -MOCK_IMPL(const or_options_t *, -get_options,(void)) +const or_options_t * +get_options(void) { return get_options_mutable(); } @@ -842,12 +645,9 @@ set_options(or_options_t *new_val, char **msg) return -1; } if (options_act(old_options) < 0) { /* acting on the options failed. die. */ - if (! tor_event_loop_shutdown_is_pending()) { - log_err(LD_BUG, - "Acting on config options left us in a broken state. Dying."); - tor_shutdown_event_loop_and_exit(1); - } - return -1; + log_err(LD_BUG, + "Acting on config options left us in a broken state. Dying."); + exit(1); } /* Issues a CONF_CHANGED event to notify controller of the change. If Tor is * just starting up then the old_options will be undefined. */ @@ -873,7 +673,7 @@ set_options(or_options_t *new_val, char **msg) tor_free(line); } } else { - smartlist_add_strdup(elements, options_format.vars[i].name); + smartlist_add(elements, tor_strdup(options_format.vars[i].name)); smartlist_add(elements, NULL); } } @@ -884,11 +684,13 @@ set_options(or_options_t *new_val, char **msg) } if (old_options != global_options) - or_options_free(old_options); + config_free(&options_format, old_options); return 0; } +extern const char tor_git_revision[]; /* from tor_main.c */ + /** The version of this Tor process, as parsed. */ static char *the_tor_version = NULL; /** A shorter version of this Tor process's version, for export in our router @@ -928,7 +730,7 @@ get_short_version(void) /** Release additional memory allocated in options */ STATIC void -or_options_free_(or_options_t *options) +or_options_free(or_options_t *options) { if (!options) return; @@ -939,21 +741,8 @@ or_options_free_(or_options_t *options) rs, routerset_free(rs)); smartlist_free(options->NodeFamilySets); } - if (options->SchedulerTypes_) { - SMARTLIST_FOREACH(options->SchedulerTypes_, int *, i, tor_free(i)); - smartlist_free(options->SchedulerTypes_); - } - if (options->FilesOpenedByIncludes) { - SMARTLIST_FOREACH(options->FilesOpenedByIncludes, char *, f, tor_free(f)); - smartlist_free(options->FilesOpenedByIncludes); - } - tor_free(options->DataDirectory); - tor_free(options->CacheDirectory); - tor_free(options->KeyDirectory); tor_free(options->BridgePassword_AuthDigest_); tor_free(options->command_arg); - tor_free(options->master_key_fname); - config_free_lines(options->MyFamily); config_free(&options_format, options); } @@ -982,12 +771,11 @@ config_free_all(void) tor_free(torrc_fname); tor_free(torrc_defaults_fname); + tor_free(the_tor_version); tor_free(global_dirfrontpagecontents); tor_free(the_short_tor_version); tor_free(the_tor_version); - - have_parsed_cmdline = 0; } /** Make address -- a piece of information related to our operation as @@ -1047,96 +835,62 @@ escaped_safe_str(const char *address) return escaped(address); } -/** - * The severity level that should be used for warnings of severity - * LOG_PROTOCOL_WARN. - * - * We keep this outside the options, in case somebody needs to use - * LOG_PROTOCOL_WARN while an option transition is happening. - */ -static int protocol_warning_severity_level = LOG_WARN; - -/** Return the severity level that should be used for warnings of severity - * LOG_PROTOCOL_WARN. */ -int -get_protocol_warning_severity_level(void) -{ - return protocol_warning_severity_level; -} - -/** List of default directory authorities */ - -static const char *default_authorities[] = { - "moria1 orport=9101 " - "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " - "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", - "tor26 orport=443 " - "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " - "ipv6=[2001:858:2:2:aabb:0:563b:1526]:443 " - "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", - "dizum orport=443 " - "v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " - "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755", - "Bifroest orport=443 bridge " - "37.218.247.217:80 1D8F 3A91 C37C 5D1C 4C19 B1AD 1D0C FBE8 BF72 D8E1", - "gabelmoo orport=443 " - "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 " - "ipv6=[2001:638:a000:4140::ffff:189]:443 " - "131.188.40.189:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281", - "dannenberg orport=443 " - "v3ident=0232AF901C31A04EE9848595AF9BB7620D4C5B2E " - "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", - "maatuska orport=80 " - "v3ident=49015F787433103580E3B66A1707A00E60F2D15B " - "ipv6=[2001:67c:289c::9]:80 " - "171.25.193.9:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810", - "Faravahar orport=443 " - "v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 " - "154.35.175.225:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC", - "longclaw orport=443 " - "v3ident=23D15D965BC35114467363C165C4F724B64B4F66 " - "199.58.81.140:80 74A9 1064 6BCE EFBC D2E8 74FC 1DC9 9743 0F96 8145", - "bastet orport=443 " - "v3ident=27102BC123E7AF1D4741AE047E160C91ADC76B21 " - "ipv6=[2620:13:4000:6000::1000:118]:443 " - "204.13.164.118:80 24E2 F139 121D 4394 C54B 5BCC 368B 3B41 1857 C413", - NULL -}; - -/** List of fallback directory authorities. The list is generated by opt-in of - * relays that meet certain stability criteria. - */ -static const char *default_fallbacks[] = { -#include "fallback_dirs.inc" - NULL -}; - /** Add the default directory authorities directly into the trusted dir list, - * but only add them insofar as they share bits with type. - * Each authority's bits are restricted to the bits shared with type. - * If type is ALL_DIRINFO or NO_DIRINFO (zero), add all authorities. */ -STATIC void + * but only add them insofar as they share bits with type. */ +static void add_default_trusted_dir_authorities(dirinfo_type_t type) { int i; - for (i=0; default_authorities[i]; i++) { - if (parse_dir_authority_line(default_authorities[i], type, 0)<0) { + const char *authorities[] = { + "moria1 orport=9101 " + "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " + "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", + "tor26 v1 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " + "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", + "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " + "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755", + "Tonga orport=443 bridge 82.94.251.203:80 " + "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D", + "turtles orport=9090 " + "v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 " + "76.73.17.194:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B", + "gabelmoo orport=443 " + "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 " + "212.112.245.170:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281", + "dannenberg orport=443 " + "v3ident=585769C78764D58426B8B52B6651A5A71137189A " + "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", + "urras orport=80 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C " + "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417", + "maatuska orport=80 " + "v3ident=49015F787433103580E3B66A1707A00E60F2D15B " + "171.25.193.9:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810", + "Faravahar orport=443 " + "v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 " + "154.35.32.5:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC", + NULL + }; + for (i=0; authorities[i]; i++) { + if (parse_dir_authority_line(authorities[i], type, 0)<0) { log_err(LD_BUG, "Couldn't parse internal DirAuthority line %s", - default_authorities[i]); + authorities[i]); } } } /** Add the default fallback directory servers into the fallback directory * server list. */ -MOCK_IMPL(void, -add_default_fallback_dir_servers,(void)) +static void +add_default_fallback_dir_servers(void) { int i; - for (i=0; default_fallbacks[i]; i++) { - if (parse_dir_fallback_line(default_fallbacks[i], 0)<0) { + const char *fallback[] = { + NULL + }; + for (i=0; fallback[i]; i++) { + if (parse_dir_fallback_line(fallback[i], 0)<0) { log_err(LD_BUG, "Couldn't parse internal FallbackDir line %s", - default_fallbacks[i]); + fallback[i]); } } } @@ -1151,7 +905,8 @@ validate_dir_servers(or_options_t *options, or_options_t *old_options) config_line_t *cl; if (options->DirAuthorities && - (options->AlternateDirAuthority || options->AlternateBridgeAuthority)) { + (options->AlternateDirAuthority || options->AlternateBridgeAuthority || + options->AlternateHSAuthority)) { log_warn(LD_CONFIG, "You cannot set both DirAuthority and Alternate*Authority."); return -1; @@ -1187,6 +942,9 @@ validate_dir_servers(or_options_t *options, or_options_t *old_options) for (cl = options->AlternateDirAuthority; cl; cl = cl->next) if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) return -1; + for (cl = options->AlternateHSAuthority; cl; cl = cl->next) + if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) + return -1; for (cl = options->FallbackDir; cl; cl = cl->next) if (parse_dir_fallback_line(cl->value, 1)<0) return -1; @@ -1196,7 +954,7 @@ validate_dir_servers(or_options_t *options, or_options_t *old_options) /** Look at all the config options and assign new dir authorities * as appropriate. */ -int +static int consider_adding_dir_servers(const or_options_t *options, const or_options_t *old_options) { @@ -1206,45 +964,33 @@ consider_adding_dir_servers(const or_options_t *options, !smartlist_len(router_get_fallback_dir_servers()) || !old_options || !config_lines_eq(options->DirAuthorities, old_options->DirAuthorities) || !config_lines_eq(options->FallbackDir, old_options->FallbackDir) || - (options->UseDefaultFallbackDirs != old_options->UseDefaultFallbackDirs) || !config_lines_eq(options->AlternateBridgeAuthority, old_options->AlternateBridgeAuthority) || !config_lines_eq(options->AlternateDirAuthority, - old_options->AlternateDirAuthority); + old_options->AlternateDirAuthority) || + !config_lines_eq(options->AlternateHSAuthority, + old_options->AlternateHSAuthority); if (!need_to_update) return 0; /* all done */ - /* "You cannot set both DirAuthority and Alternate*Authority." - * Checking that this restriction holds allows us to simplify - * the unit tests. */ - tor_assert(!(options->DirAuthorities && - (options->AlternateDirAuthority - || options->AlternateBridgeAuthority))); - /* Start from a clean slate. */ clear_dir_servers(); if (!options->DirAuthorities) { /* then we may want some of the defaults */ dirinfo_type_t type = NO_DIRINFO; - if (!options->AlternateBridgeAuthority) { + if (!options->AlternateBridgeAuthority) type |= BRIDGE_DIRINFO; - } - if (!options->AlternateDirAuthority) { - type |= V3_DIRINFO | EXTRAINFO_DIRINFO | MICRODESC_DIRINFO; - /* Only add the default fallback directories when the DirAuthorities, - * AlternateDirAuthority, and FallbackDir directory config options - * are set to their defaults, and when UseDefaultFallbackDirs is 1. */ - if (!options->FallbackDir && options->UseDefaultFallbackDirs) { - add_default_fallback_dir_servers(); - } - } - /* if type == NO_DIRINFO, we don't want to add any of the - * default authorities, because we've replaced them all */ - if (type != NO_DIRINFO) - add_default_trusted_dir_authorities(type); + if (!options->AlternateDirAuthority) + type |= V1_DIRINFO | V3_DIRINFO | EXTRAINFO_DIRINFO | + MICRODESC_DIRINFO; + if (!options->AlternateHSAuthority) + type |= HIDSERV_DIRINFO; + add_default_trusted_dir_authorities(type); } + if (!options->FallbackDir) + add_default_fallback_dir_servers(); for (cl = options->DirAuthorities; cl; cl = cl->next) if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) @@ -1255,78 +1001,15 @@ consider_adding_dir_servers(const or_options_t *options, for (cl = options->AlternateDirAuthority; cl; cl = cl->next) if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) return -1; + for (cl = options->AlternateHSAuthority; cl; cl = cl->next) + if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) + return -1; for (cl = options->FallbackDir; cl; cl = cl->next) if (parse_dir_fallback_line(cl->value, 0)<0) return -1; return 0; } -/** - * Make sure that directory exists, with appropriate ownership and - * permissions (as modified by group_readable). If create, - * create the directory if it is missing. Return 0 on success. - * On failure, return -1 and set *msg_out. - */ -static int -check_and_create_data_directory(int create, - const char *directory, - int group_readable, - const char *owner, - char **msg_out) -{ - cpd_check_t cpd_opts = create ? CPD_CREATE : CPD_CHECK; - if (group_readable) - cpd_opts |= CPD_GROUP_READ; - if (check_private_dir(directory, - cpd_opts, - owner) < 0) { - tor_asprintf(msg_out, - "Couldn't %s private data directory \"%s\"", - create ? "create" : "access", - directory); - return -1; - } - -#ifndef _WIN32 - if (group_readable) { - /* Only new dirs created get new opts, also enforce group read. */ - if (chmod(directory, 0750)) { - log_warn(LD_FS,"Unable to make %s group-readable: %s", - directory, strerror(errno)); - } - } -#endif /* !defined(_WIN32) */ - - return 0; -} - -/** - * Ensure that our keys directory exists, with appropriate permissions. - * Return 0 on success, -1 on failure. - */ -int -create_keys_directory(const or_options_t *options) -{ - /* Make sure DataDirectory exists, and is private. */ - cpd_check_t cpd_opts = CPD_CREATE; - if (options->DataDirectoryGroupReadable) - cpd_opts |= CPD_GROUP_READ; - if (check_private_dir(options->DataDirectory, cpd_opts, options->User)) { - log_err(LD_OR, "Can't create/check datadirectory %s", - options->DataDirectory); - return -1; - } - - /* Check the key directory. */ - if (check_private_dir(options->KeyDirectory, CPD_CREATE, options->User)) { - return -1; - } - return 0; -} - -/* Helps determine flags to pass to switch_id. */ -static int have_low_ports = -1; - /** Fetch the active option list, and take actions based on it. All of the * things we do should survive being done repeatedly. If present, * old_options contains the previous value of the options. @@ -1343,7 +1026,7 @@ options_act_reversible(const or_options_t *old_options, char **msg) int running_tor = options->command == CMD_RUN_TOR; int set_conn_limit = 0; int r = -1; - int logs_marked = 0, logs_initialized = 0; + int logs_marked = 0; int old_min_log_level = get_min_log_level(); /* Daemonize _first_, since we only want to open most of this stuff in @@ -1354,61 +1037,39 @@ options_act_reversible(const or_options_t *old_options, char **msg) start_daemon(); } -#ifdef HAVE_SYSTEMD - /* Our PID may have changed, inform supervisor */ - sd_notifyf(0, "MAINPID=%ld\n", (long int)getpid()); -#endif - #ifndef HAVE_SYS_UN_H if (options->ControlSocket || options->ControlSocketsGroupWritable) { *msg = tor_strdup("Unix domain sockets (ControlSocket) not supported " "on this OS/with this build."); goto rollback; } -#else /* !(!defined(HAVE_SYS_UN_H)) */ +#else if (options->ControlSocketsGroupWritable && !options->ControlSocket) { *msg = tor_strdup("Setting ControlSocketGroupWritable without setting" "a ControlSocket makes no sense."); goto rollback; } -#endif /* !defined(HAVE_SYS_UN_H) */ +#endif if (running_tor) { int n_ports=0; /* We need to set the connection limit before we can open the listeners. */ - if (! sandbox_is_active()) { - if (set_max_file_descriptors((unsigned)options->ConnLimit, - &options->ConnLimit_) < 0) { - *msg = tor_strdup("Problem with ConnLimit value. " - "See logs for details."); - goto rollback; - } - set_conn_limit = 1; - } else { - tor_assert(old_options); - options->ConnLimit_ = old_options->ConnLimit_; + if (set_max_file_descriptors((unsigned)options->ConnLimit, + &options->ConnLimit_) < 0) { + *msg = tor_strdup("Problem with ConnLimit value. See logs for details."); + goto rollback; } + set_conn_limit = 1; /* Set up libevent. (We need to do this before we can register the * listeners as listeners.) */ if (running_tor && !libevent_initialized) { init_libevent(options); libevent_initialized = 1; - - /* This has to come up after libevent is initialized. */ - control_initialize_event_queue(); - - /* - * Initialize the scheduler - this has to come after - * options_init_from_torrc() sets up libevent - why yes, that seems - * completely sensible to hide the libevent setup in the option parsing - * code! It also needs to happen before init_keys(), so it needs to - * happen here too. How yucky. */ - scheduler_init(); } /* Adjust the port configuration so we can launch listeners. */ - if (parse_ports(options, 0, msg, &n_ports, NULL)) { + if (parse_ports(options, 0, msg, &n_ports)) { if (!*msg) *msg = tor_strdup("Unexpected problem parsing port config"); goto rollback; @@ -1434,21 +1095,18 @@ options_act_reversible(const or_options_t *old_options, char **msg) "non-control network connections. Shutting down all existing " "connections."); connection_mark_all_noncontrol_connections(); - /* We can't complete circuits until the network is re-enabled. */ - note_that_we_maybe_cant_complete_circuits(); } } #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) /* Open /dev/pf before dropping privileges. */ - if (options->TransPort_set && - options->TransProxyType_parsed == TPT_DEFAULT) { + if (options->TransPort_set) { if (get_pf_socket() < 0) { *msg = tor_strdup("Unable to open /dev/pf for transparent proxy."); goto rollback; } } -#endif /* defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) */ +#endif /* Attempt to lock all current and future memory with mlockall() only once */ if (options->DisableAllSwap) { @@ -1461,16 +1119,7 @@ options_act_reversible(const or_options_t *old_options, char **msg) /* Setuid/setgid as appropriate */ if (options->User) { - tor_assert(have_low_ports != -1); - unsigned switch_id_flags = 0; - if (options->KeepBindCapabilities == 1) { - switch_id_flags |= SWITCH_ID_KEEP_BINDLOW; - switch_id_flags |= SWITCH_ID_WARN_IF_NO_CAPS; - } - if (options->KeepBindCapabilities == -1 && have_low_ports) { - switch_id_flags |= SWITCH_ID_KEEP_BINDLOW; - } - if (switch_id(options->User, switch_id_flags) != 0) { + if (switch_id(options->User) != 0) { /* No need to roll back, since you can't change the value. */ *msg = tor_strdup("Problem with User value. See logs for details."); goto done; @@ -1478,29 +1127,14 @@ options_act_reversible(const or_options_t *old_options, char **msg) } /* Ensure data directory is private; create if possible. */ - /* It's okay to do this in "options_act_reversible()" even though it isn't - * actually reversible, since you can't change the DataDirectory while - * Tor is running. */ - if (check_and_create_data_directory(running_tor /* create */, - options->DataDirectory, - options->DataDirectoryGroupReadable, - options->User, - msg) < 0) { - goto done; - } - if (check_and_create_data_directory(running_tor /* create */, - options->KeyDirectory, - options->KeyDirectoryGroupReadable, - options->User, - msg) < 0) { - goto done; - } - if (check_and_create_data_directory(running_tor /* create */, - options->CacheDirectory, - options->CacheDirectoryGroupReadable, - options->User, - msg) < 0) { + if (check_private_dir(options->DataDirectory, + running_tor ? CPD_CREATE : CPD_CHECK, + options->User)<0) { + tor_asprintf(msg, + "Couldn't access/create private data directory \"%s\"", + options->DataDirectory); goto done; + /* No need to roll back, since you can't change the value. */ } /* Bail out at this point if we're not going to be a client or server: @@ -1510,12 +1144,10 @@ options_act_reversible(const or_options_t *old_options, char **msg) mark_logs_temp(); /* Close current logs once new logs are open. */ logs_marked = 1; - /* Configure the tor_log(s) */ - if (options_init_logs(old_options, options, 0)<0) { + if (options_init_logs(options, 0)<0) { /* Configure the tor_log(s) */ *msg = tor_strdup("Failed to init Log options. See logs for details."); goto rollback; } - logs_initialized = 1; commit: r = 0; @@ -1528,75 +1160,21 @@ options_act_reversible(const or_options_t *old_options, char **msg) tor_free(severity); tor_log_update_sigsafe_err_fds(); } - if (logs_initialized) { - flush_log_messages_from_startup(); - } - - { - const char *badness = NULL; - int bad_safelog = 0, bad_severity = 0, new_badness = 0; - if (options->SafeLogging_ != SAFELOG_SCRUB_ALL) { - bad_safelog = 1; - if (!old_options || old_options->SafeLogging_ != options->SafeLogging_) - new_badness = 1; - } - if (get_min_log_level() >= LOG_INFO) { - bad_severity = 1; - if (get_min_log_level() != old_min_log_level) - new_badness = 1; - } - if (bad_safelog && bad_severity) - badness = "you disabled SafeLogging, and " - "you're logging more than \"notice\""; - else if (bad_safelog) - badness = "you disabled SafeLogging"; - else - badness = "you're logging more than \"notice\""; - if (new_badness) - log_warn(LD_GENERAL, "Your log may contain sensitive information - %s. " - "Don't log unless it serves an important reason. " - "Overwrite the log afterwards.", badness); + if (get_min_log_level() >= LOG_INFO && + get_min_log_level() != old_min_log_level) { + log_warn(LD_GENERAL, "Your log may contain sensitive information: you're " + "logging more than \"notice\". Please log safely. Don't log " + "unless it serves an important reason, and overwrite the log " + "afterwards."); } SMARTLIST_FOREACH(replaced_listeners, connection_t *, conn, { - int marked = conn->marked_for_close; log_notice(LD_NET, "Closing old %s on %s:%d", conn_type_to_string(conn->type), conn->address, conn->port); connection_close_immediate(conn); - if (!marked) { - connection_mark_for_close(conn); - } + connection_mark_for_close(conn); }); - - if (set_conn_limit) { - /* - * If we adjusted the conn limit, recompute the OOS threshold too - * - * How many possible sockets to keep in reserve? If we have lots of - * possible sockets, keep this below a limit and set ConnLimit_high_thresh - * very close to ConnLimit_, but if ConnLimit_ is low, shrink it in - * proportion. - * - * Somewhat arbitrarily, set socks_in_reserve to 5% of ConnLimit_, but - * cap it at 64. - */ - int socks_in_reserve = options->ConnLimit_ / 20; - if (socks_in_reserve > 64) socks_in_reserve = 64; - - options->ConnLimit_high_thresh = options->ConnLimit_ - socks_in_reserve; - options->ConnLimit_low_thresh = (options->ConnLimit_ / 4) * 3; - log_info(LD_GENERAL, - "Recomputed OOS thresholds: ConnLimit %d, ConnLimit_ %d, " - "ConnLimit_high_thresh %d, ConnLimit_low_thresh %d", - options->ConnLimit, options->ConnLimit_, - options->ConnLimit_high_thresh, - options->ConnLimit_low_thresh); - - /* Give the OOS handler a chance with the new thresholds */ - connection_check_oos(get_n_open_sockets(), 0); - } - goto done; rollback: @@ -1637,8 +1215,7 @@ options_need_geoip_info(const or_options_t *options, const char **reason_out) routerset_needs_geoip(options->EntryNodes) || routerset_needs_geoip(options->ExitNodes) || routerset_needs_geoip(options->ExcludeExitNodes) || - routerset_needs_geoip(options->ExcludeNodes) || - routerset_needs_geoip(options->Tor2webRendezvousPoints); + routerset_needs_geoip(options->ExcludeNodes); if (routerset_usage && reason_out) { *reason_out = "We've been configured to use (or avoid) nodes in certain " @@ -1678,32 +1255,25 @@ get_effective_bwburst(const or_options_t *options) return (uint32_t)bw; } -/** - * Return true if changing the configuration from old to new - * affects the guard susbsystem. - */ +/** Return True if any changes from old_options to + * new_options needs us to refresh our TLS context. */ static int -options_transition_affects_guards(const or_options_t *old, - const or_options_t *new) +options_transition_requires_fresh_tls_context(const or_options_t *old_options, + const or_options_t *new_options) { - /* NOTE: Make sure this function stays in sync with - * node_passes_guard_filter */ - - tor_assert(old); - tor_assert(new); - - return - (old->UseEntryGuards != new->UseEntryGuards || - old->UseBridges != new->UseBridges || - old->ClientUseIPv4 != new->ClientUseIPv4 || - old->ClientUseIPv6 != new->ClientUseIPv6 || - old->FascistFirewall != new->FascistFirewall || - !routerset_equal(old->ExcludeNodes, new->ExcludeNodes) || - !routerset_equal(old->EntryNodes, new->EntryNodes) || - !smartlist_strings_eq(old->FirewallPorts, new->FirewallPorts) || - !config_lines_eq(old->Bridges, new->Bridges) || - !config_lines_eq(old->ReachableORAddresses, new->ReachableORAddresses) || - !config_lines_eq(old->ReachableDirAddresses, new->ReachableDirAddresses)); + tor_assert(new_options); + + if (!old_options) + return 0; + + if ((old_options->DynamicDHGroups != new_options->DynamicDHGroups)) { + return 1; + } + + if (!opt_streq(old_options->TLSECGroup, new_options->TLSECGroup)) + return 1; + + return 0; } /** Fetch the active option list, and take actions based on it. All of the @@ -1715,7 +1285,7 @@ options_transition_affects_guards(const or_options_t *old, * Note: We haven't moved all the "act on new configuration" logic * here yet. Some is still in do_hup() and other places. */ -STATIC int +static int options_act(const or_options_t *old_options) { config_line_t *cl; @@ -1725,12 +1295,6 @@ options_act(const or_options_t *old_options) const int transition_affects_workers = old_options && options_transition_affects_workers(old_options, options); int old_ewma_enabled; - const int transition_affects_guards = - old_options && options_transition_affects_guards(old_options, options); - - if (options->NoExec || options->Sandbox) { - tor_disable_spawning_background_processes(); - } /* disable ptrace and later, other basic debugging techniques */ { @@ -1743,12 +1307,10 @@ options_act(const or_options_t *old_options) if (options->DisableDebuggerAttachment && !disabled_debugger_attach && running_tor) { int ok = tor_disable_debugger_attach(); - /* LCOV_EXCL_START the warned_debugger_attach is 0 can't reach inside. */ if (warned_debugger_attach && ok == 1) { log_notice(LD_CONFIG, "Disabled attaching debuggers for unprivileged " "users."); } - /* LCOV_EXCL_STOP */ disabled_debugger_attach = (ok == 1); } else if (!options->DisableDebuggerAttachment && !warned_debugger_attach) { @@ -1766,54 +1328,36 @@ options_act(const or_options_t *old_options) return -1; } - if (options->ProtocolWarnings) - protocol_warning_severity_level = LOG_WARN; - else - protocol_warning_severity_level = LOG_INFO; - - if (consider_adding_dir_servers(options, old_options) < 0) { - // XXXX This should get validated earlier, and committed here, to - // XXXX lower opportunities for reaching an error case. + if (consider_adding_dir_servers(options, old_options) < 0) return -1; - } - if (rend_non_anonymous_mode_enabled(options)) { - log_warn(LD_GENERAL, "This copy of Tor was compiled or configured to run " - "in a non-anonymous mode. It will provide NO ANONYMITY."); - } +#ifdef NON_ANONYMOUS_MODE_ENABLED + log_warn(LD_GENERAL, "This copy of Tor was compiled to run in a " + "non-anonymous mode. It will provide NO ANONYMITY."); +#endif #ifdef ENABLE_TOR2WEB_MODE -/* LCOV_EXCL_START */ - // XXXX This should move into options_validate() if (!options->Tor2webMode) { log_err(LD_CONFIG, "This copy of Tor was compiled to run in " "'tor2web mode'. It can only be run with the Tor2webMode torrc " "option enabled."); return -1; } -/* LCOV_EXCL_STOP */ -#else /* !(defined(ENABLE_TOR2WEB_MODE)) */ - // XXXX This should move into options_validate() +#else if (options->Tor2webMode) { log_err(LD_CONFIG, "This copy of Tor was not compiled to run in " "'tor2web mode'. It cannot be run with the Tor2webMode torrc " "option enabled. To enable Tor2webMode recompile with the " - "--enable-tor2web-mode option."); + "--enable-tor2webmode option."); return -1; } -#endif /* defined(ENABLE_TOR2WEB_MODE) */ +#endif - /* If we are a bridge with a pluggable transport proxy but no - Extended ORPort, inform the user that they are missing out. */ - if (server_mode(options) && options->ServerTransportPlugin && - !options->ExtORPort_lines) { - log_notice(LD_CONFIG, "We use pluggable transports but the Extended " - "ORPort is disabled. Tor and your pluggable transports proxy " - "communicate with each other via the Extended ORPort so it " - "is suggested you enable it: it will also allow your Bridge " - "to collect statistics about its clients that use pluggable " - "transports. Please enable it using the ExtORPort torrc option " - "(e.g. set 'ExtORPort auto')."); + if (options->SafeLogging_ != SAFELOG_SCRUB_ALL && + (!old_options || old_options->SafeLogging_ != options->SafeLogging_)) { + log_warn(LD_GENERAL, "Your log may contain sensitive information - you " + "disabled SafeLogging. Please log safely. Don't log unless it " + "serves an important reason. Overwrite the log afterwards."); } if (options->Bridges) { @@ -1821,49 +1365,25 @@ options_act(const or_options_t *old_options) for (cl = options->Bridges; cl; cl = cl->next) { bridge_line_t *bridge_line = parse_bridge_line(cl->value); if (!bridge_line) { - // LCOV_EXCL_START log_warn(LD_BUG, "Previously validated Bridge line could not be added!"); return -1; - // LCOV_EXCL_STOP } bridge_add_from_config(bridge_line); } sweep_bridge_list(); } - if (running_tor && hs_config_service_all(options, 0)<0) { - // LCOV_EXCL_START + if (running_tor && rend_config_services(options, 0)<0) { log_warn(LD_BUG, "Previously validated hidden services line could not be added!"); return -1; - // LCOV_EXCL_STOP } if (running_tor && rend_parse_service_authorization(options, 0) < 0) { - // LCOV_EXCL_START log_warn(LD_BUG, "Previously validated client authorization for " "hidden services could not be added!"); return -1; - // LCOV_EXCL_STOP - } - - if (running_tor && !old_options && options->OwningControllerFD != -1) { -#ifdef _WIN32 - log_warn(LD_CONFIG, "OwningControllerFD is not supported on Windows. " - "If you need it, tell the Tor developers."); - return -1; -#else - const unsigned ctrl_flags = - CC_LOCAL_FD_IS_OWNER | - CC_LOCAL_FD_IS_AUTHENTICATED; - tor_socket_t ctrl_sock = (tor_socket_t)options->OwningControllerFD; - if (control_connection_add_local_fd(ctrl_sock, ctrl_flags) < 0) { - log_warn(LD_CONFIG, "Could not add local controller connection with " - "given FD."); - return -1; - } -#endif /* defined(_WIN32) */ } /* Load state */ @@ -1873,51 +1393,32 @@ options_act(const or_options_t *old_options) rep_hist_load_mtbf_data(time(NULL)); } - /* If we have an ExtORPort, initialize its auth cookie. */ - if (running_tor && - init_ext_or_cookie_authentication(!!options->ExtORPort_lines) < 0) { - log_warn(LD_CONFIG,"Error creating Extended ORPort cookie file."); - return -1; - } - mark_transport_list(); pt_prepare_proxy_list_for_config_read(); - if (!options->DisableNetwork) { - if (options->ClientTransportPlugin) { - for (cl = options->ClientTransportPlugin; cl; cl = cl->next) { - if (parse_transport_line(options, cl->value, 0, 0) < 0) { - // LCOV_EXCL_START - log_warn(LD_BUG, - "Previously validated ClientTransportPlugin line " - "could not be added!"); - return -1; - // LCOV_EXCL_STOP - } + if (options->ClientTransportPlugin) { + for (cl = options->ClientTransportPlugin; cl; cl = cl->next) { + if (parse_client_transport_line(cl->value, 0)<0) { + log_warn(LD_BUG, + "Previously validated ClientTransportPlugin line " + "could not be added!"); + return -1; } } + } - if (options->ServerTransportPlugin && server_mode(options)) { - for (cl = options->ServerTransportPlugin; cl; cl = cl->next) { - if (parse_transport_line(options, cl->value, 0, 1) < 0) { - // LCOV_EXCL_START - log_warn(LD_BUG, - "Previously validated ServerTransportPlugin line " - "could not be added!"); - return -1; - // LCOV_EXCL_STOP - } + if (options->ServerTransportPlugin && server_mode(options)) { + for (cl = options->ServerTransportPlugin; cl; cl = cl->next) { + if (parse_server_transport_line(cl->value, 0)<0) { + log_warn(LD_BUG, + "Previously validated ServerTransportPlugin line " + "could not be added!"); + return -1; } } } sweep_transport_list(); sweep_proxy_list(); - /* Start the PT proxy configuration. By doing this configuration - here, we also figure out which proxies need to be restarted and - which not. */ - if (pt_proxies_configuration_pending() && !net_is_disabled()) - pt_configure_remaining_proxies(); - /* Bail out at this point if we're not going to be a client or server: * we want to not fork, and to log stuff to stderr. */ if (!running_tor) @@ -1929,6 +1430,24 @@ options_act(const or_options_t *old_options) finish_daemon(options->DataDirectory); } + /* If needed, generate a new TLS DH prime according to the current torrc. */ + if (server_mode(options) && options->DynamicDHGroups) { + char *keydir = get_datadir_fname("keys"); + if (check_private_dir(keydir, CPD_CREATE, options->User)) { + tor_free(keydir); + return -1; + } + tor_free(keydir); + + if (!old_options || !old_options->DynamicDHGroups) { + char *fname = get_datadir_fname2("keys", "dynamic_dh_params"); + crypto_set_tls_dh_prime(fname); + tor_free(fname); + } + } else { /* clients don't need a dynamic DH prime. */ + crypto_set_tls_dh_prime(NULL); + } + /* We want to reinit keys as needed before we do much of anything else: keys are important, and other things can depend on them. */ if (transition_affects_workers || @@ -1938,18 +1457,20 @@ options_act(const or_options_t *old_options) log_warn(LD_BUG,"Error initializing keys; exiting"); return -1; } - } - - /* Write our PID to the PID file. If we do not have write permissions we - * will log a warning and exit. */ - if (options->PidFile && !sandbox_is_active()) { - if (write_pidfile(options->PidFile) < 0) { - log_err(LD_CONFIG, "Unable to write PIDFile %s", - escaped(options->PidFile)); + } else if (old_options && + options_transition_requires_fresh_tls_context(old_options, + options)) { + if (router_initialize_tls_context() < 0) { + log_warn(LD_BUG,"Error initializing TLS context."); return -1; } } + /* Write our PID to the PID file. If we do not have write permissions we + * will log a warning */ + if (options->PidFile) + write_pidfile(options->PidFile); + /* Register addressmap directives */ config_register_addressmaps(options); parse_virtual_addr_network(options->VirtualAddrNetworkIPv4, AF_INET,0,NULL); @@ -1962,42 +1483,44 @@ options_act(const or_options_t *old_options) return -1; } - if (server_mode(options)) { - static int cdm_initialized = 0; - if (cdm_initialized == 0) { - cdm_initialized = 1; - consdiffmgr_configure(NULL); - consdiffmgr_validate(); - } - } - if (init_control_cookie_authentication(options->CookieAuthentication) < 0) { log_warn(LD_CONFIG,"Error creating control cookie authentication file."); return -1; } + /* If we have an ExtORPort, initialize its auth cookie. */ + if (init_ext_or_cookie_authentication(!!options->ExtORPort_lines) < 0) { + log_warn(LD_CONFIG,"Error creating Extended ORPort cookie file."); + return -1; + } + monitor_owning_controller_process(options->OwningControllerProcess); /* reload keys as needed for rendezvous services. */ - if (hs_service_load_all_keys() < 0) { + if (rend_service_load_all_keys()<0) { log_warn(LD_GENERAL,"Error loading rendezvous service keys"); return -1; } - /* Inform the scheduler subsystem that a configuration changed happened. It - * might be a change of scheduler or parameter. */ - scheduler_conf_changed(); - /* Set up accounting */ if (accounting_parse_options(options, 0)<0) { - // LCOV_EXCL_START - log_warn(LD_BUG,"Error in previously validated accounting options"); + log_warn(LD_CONFIG,"Error in accounting options"); return -1; - // LCOV_EXCL_STOP } if (accounting_is_enabled(options)) configure_accounting(time(NULL)); +#ifdef USE_BUFFEREVENTS + /* If we're using the bufferevents implementation and our rate limits + * changed, we need to tell the rate-limiting system about it. */ + if (!old_options || + old_options->BandwidthRate != options->BandwidthRate || + old_options->BandwidthBurst != options->BandwidthBurst || + old_options->RelayBandwidthRate != options->RelayBandwidthRate || + old_options->RelayBandwidthBurst != options->RelayBandwidthBurst) + connection_bucket_init(); +#endif + old_ewma_enabled = cell_ewma_enabled(); /* Change the cell EWMA settings */ cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus()); @@ -2016,7 +1539,6 @@ options_act(const or_options_t *old_options) char *http_authenticator; http_authenticator = alloc_http_authenticator(options->BridgePassword); if (!http_authenticator) { - // XXXX This should get validated in options_validate(). log_warn(LD_BUG, "Unable to allocate HTTP authenticator. Not setting " "BridgePassword."); return -1; @@ -2029,33 +1551,15 @@ options_act(const or_options_t *old_options) } if (parse_outbound_addresses(options, 0, &msg) < 0) { - // LCOV_EXCL_START - log_warn(LD_BUG, "Failed parsing previously validated outbound " - "bind addresses: %s", msg); + log_warn(LD_BUG, "Failed parsing oubound bind addresses: %s", msg); tor_free(msg); return -1; - // LCOV_EXCL_STOP - } - - config_maybe_load_geoip_files_(options, old_options); - - if (geoip_is_loaded(AF_INET) && options->GeoIPExcludeUnknown) { - /* ExcludeUnknown is true or "auto" */ - const int is_auto = options->GeoIPExcludeUnknown == -1; - int changed; - - changed = routerset_add_unknown_ccs(&options->ExcludeNodes, is_auto); - changed += routerset_add_unknown_ccs(&options->ExcludeExitNodes, is_auto); - - if (changed) - routerset_add_unknown_ccs(&options->ExcludeExitNodesUnion_, is_auto); } /* Check for transitions that need action. */ if (old_options) { int revise_trackexithosts = 0; int revise_automap_entries = 0; - int abandon_circuits = 0; if ((options->UseEntryGuards && !old_options->UseEntryGuards) || options->UseBridges != old_options->UseBridges || (options->UseBridges && @@ -2065,23 +1569,11 @@ options_act(const or_options_t *old_options) options->ExcludeExitNodes) || !routerset_equal(old_options->EntryNodes, options->EntryNodes) || !routerset_equal(old_options->ExitNodes, options->ExitNodes) || - !routerset_equal(old_options->Tor2webRendezvousPoints, - options->Tor2webRendezvousPoints) || options->StrictNodes != old_options->StrictNodes) { log_info(LD_CIRC, "Changed to using entry guards or bridges, or changed " "preferred or excluded node lists. " "Abandoning previous circuits."); - abandon_circuits = 1; - } - - if (transition_affects_guards) { - if (guards_update_all()) { - abandon_circuits = 1; - } - } - - if (abandon_circuits) { circuit_mark_all_unused_circs(); circuit_mark_all_dirty_circs_as_unusable(); revise_trackexithosts = 1; @@ -2094,8 +1586,8 @@ options_act(const or_options_t *old_options) if (revise_trackexithosts) addressmap_clear_excluded_trackexithosts(options); - if (!options->AutomapHostsOnResolve && - old_options->AutomapHostsOnResolve) { + if (!options->AutomapHostsOnResolve) { + if (old_options->AutomapHostsOnResolve) revise_automap_entries = 1; } else { if (!smartlist_strings_eq(old_options->AutomapHostsSuffixes, @@ -2112,7 +1604,7 @@ options_act(const or_options_t *old_options) addressmap_clear_invalid_automaps(options); /* How long should we delay counting bridge stats after becoming a bridge? - * We use this so we don't count clients who used our bridge thinking it is + * We use this so we don't count people who used our bridge thinking it is * a relay. If you change this, don't forget to change the log message * below. It's 4 hours (the time it takes to stop being used by clients) * plus some extra time for clock skew. */ @@ -2142,12 +1634,11 @@ options_act(const or_options_t *old_options) "Worker-related options changed. Rotating workers."); if (server_mode(options) && !server_mode(old_options)) { - cpu_init(); ip_address_changed(0); - if (have_completed_a_circuit() || !any_predicted_circuits(time(NULL))) + if (can_complete_circuit || !any_predicted_circuits(time(NULL))) inform_testing_reachability(); } - cpuworkers_rotate_keyinfo(); + cpuworkers_rotate(); if (dns_reset()) return -1; } else { @@ -2158,31 +1649,34 @@ options_act(const or_options_t *old_options) if (options->PerConnBWRate != old_options->PerConnBWRate || options->PerConnBWBurst != old_options->PerConnBWBurst) connection_or_update_token_buckets(get_connection_array(), options); - - if (options->MainloopStats != old_options->MainloopStats) { - reset_main_loop_counters(); - } } - /* Only collect directory-request statistics on relays and bridges. */ - options->DirReqStatistics = options->DirReqStatistics_option && - server_mode(options); - options->HiddenServiceStatistics = - options->HiddenServiceStatistics_option && server_mode(options); + config_maybe_load_geoip_files_(options, old_options); + + if (geoip_is_loaded(AF_INET) && options->GeoIPExcludeUnknown) { + /* ExcludeUnknown is true or "auto" */ + const int is_auto = options->GeoIPExcludeUnknown == -1; + int changed; + + changed = routerset_add_unknown_ccs(&options->ExcludeNodes, is_auto); + changed += routerset_add_unknown_ccs(&options->ExcludeExitNodes, is_auto); + + if (changed) + routerset_add_unknown_ccs(&options->ExcludeExitNodesUnion_, is_auto); + } if (options->CellStatistics || options->DirReqStatistics || options->EntryStatistics || options->ExitPortStatistics || options->ConnDirectionStatistics || - options->HiddenServiceStatistics || options->BridgeAuthoritativeDir) { time_t now = time(NULL); int print_notice = 0; - /* Only collect other relay-only statistics on relays. */ - if (!public_server_mode(options)) { + /* If we aren't acting as a server, we can't collect stats anyway. */ + if (!server_mode(options)) { options->CellStatistics = 0; + options->DirReqStatistics = 0; options->EntryStatistics = 0; - options->ConnDirectionStatistics = 0; options->ExitPortStatistics = 0; } @@ -2197,8 +1691,8 @@ options_act(const or_options_t *old_options) geoip_dirreq_stats_init(now); print_notice = 1; } else { - /* disable statistics collection since we have no geoip file */ options->DirReqStatistics = 0; + /* Don't warn Tor clients, they don't use statistics */ if (options->ORPort_set) log_notice(LD_CONFIG, "Configured to measure directory request " "statistics, but no GeoIP database found. " @@ -2228,24 +1722,17 @@ options_act(const or_options_t *old_options) options->ConnDirectionStatistics) { rep_hist_conn_stats_init(now); } - if ((!old_options || !old_options->HiddenServiceStatistics) && - options->HiddenServiceStatistics) { - log_info(LD_CONFIG, "Configured to measure hidden service statistics."); - rep_hist_hs_stats_init(now); - } if ((!old_options || !old_options->BridgeAuthoritativeDir) && options->BridgeAuthoritativeDir) { rep_hist_desc_stats_init(now); print_notice = 1; } if (print_notice) - log_notice(LD_CONFIG, "Configured to measure statistics. Look for " - "the *-stats files that will first be written to the " + log_notice(LD_CONFIG, "Configured to measure statistics. Look for " + "the *-stats files that will first be written to the " "data directory in 24 hours from now."); } - /* If we used to have statistics enabled but we just disabled them, - stop gathering them. */ if (old_options && old_options->CellStatistics && !options->CellStatistics) rep_hist_buffer_stats_term(); @@ -2255,9 +1742,6 @@ options_act(const or_options_t *old_options) if (old_options && old_options->EntryStatistics && !options->EntryStatistics) geoip_entry_stats_term(); - if (old_options && old_options->HiddenServiceStatistics && - !options->HiddenServiceStatistics) - rep_hist_hs_stats_term(); if (old_options && old_options->ExitPortStatistics && !options->ExitPortStatistics) rep_hist_exit_stats_term(); @@ -2268,6 +1752,13 @@ options_act(const or_options_t *old_options) !options->BridgeAuthoritativeDir) rep_hist_desc_stats_term(); + /* Check if we need to parse and add the EntryNodes config option. */ + if (options->EntryNodes && + (!old_options || + !routerset_equal(old_options->EntryNodes,options->EntryNodes) || + !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes))) + entry_nodes_should_be_added(); + /* Since our options changed, we might need to regenerate and upload our * server descriptor. */ @@ -2283,7 +1774,7 @@ options_act(const or_options_t *old_options) directory_fetches_dir_info_early(old_options)) || !bool_eq(directory_fetches_dir_info_later(options), directory_fetches_dir_info_later(old_options))) { - /* Make sure update_router_have_minimum_dir_info() gets called. */ + /* Make sure update_router_have_min_dir_info gets called. */ router_dir_info_changed(); /* We might need to download a new consensus status later or sooner than * we had expected. */ @@ -2307,39 +1798,28 @@ options_act(const or_options_t *old_options) return 0; } -typedef enum { - TAKES_NO_ARGUMENT = 0, - ARGUMENT_NECESSARY = 1, - ARGUMENT_OPTIONAL = 2 -} takes_argument_t; - static const struct { const char *name; - takes_argument_t takes_argument; + int takes_argument; } CMDLINE_ONLY_OPTIONS[] = { - { "-f", ARGUMENT_NECESSARY }, - { "--allow-missing-torrc", TAKES_NO_ARGUMENT }, - { "--defaults-torrc", ARGUMENT_NECESSARY }, - { "--hash-password", ARGUMENT_NECESSARY }, - { "--dump-config", ARGUMENT_OPTIONAL }, - { "--list-fingerprint", TAKES_NO_ARGUMENT }, - { "--keygen", TAKES_NO_ARGUMENT }, - { "--key-expiration", ARGUMENT_OPTIONAL }, - { "--newpass", TAKES_NO_ARGUMENT }, - { "--no-passphrase", TAKES_NO_ARGUMENT }, - { "--passphrase-fd", ARGUMENT_NECESSARY }, - { "--verify-config", TAKES_NO_ARGUMENT }, - { "--ignore-missing-torrc", TAKES_NO_ARGUMENT }, - { "--quiet", TAKES_NO_ARGUMENT }, - { "--hush", TAKES_NO_ARGUMENT }, - { "--version", TAKES_NO_ARGUMENT }, - { "--library-versions", TAKES_NO_ARGUMENT }, - { "-h", TAKES_NO_ARGUMENT }, - { "--help", TAKES_NO_ARGUMENT }, - { "--list-torrc-options", TAKES_NO_ARGUMENT }, - { "--list-deprecated-options",TAKES_NO_ARGUMENT }, - { "--nt-service", TAKES_NO_ARGUMENT }, - { "-nt-service", TAKES_NO_ARGUMENT }, + { "-f", 1 }, + { "--allow-missing-torrc", 0 }, + { "--defaults-torrc", 1 }, + { "--hash-password", 1 }, + { "--dump-config", 1 }, + { "--list-fingerprint", 0 }, + { "--verify-config", 0 }, + { "--ignore-missing-torrc", 0 }, + { "--quiet", 0 }, + { "--hush", 0 }, + { "--version", 0 }, + { "--library-versions", 0 }, + { "-h", 0 }, + { "--help", 0 }, + { "--list-torrc-options", 0 }, + { "--digests", 0 }, + { "--nt-service", 0 }, + { "-nt-service", 0 }, { NULL, 0 }, }; @@ -2366,7 +1846,7 @@ config_parse_commandline(int argc, char **argv, int ignore_errors, while (i < argc) { unsigned command = CONFIG_LINE_NORMAL; - takes_argument_t want_arg = ARGUMENT_NECESSARY; + int want_arg = 1; int is_cmdline = 0; int j; @@ -2396,11 +1876,9 @@ config_parse_commandline(int argc, char **argv, int ignore_errors, want_arg = 0; } - const int is_last = (i == argc-1); - - if (want_arg == ARGUMENT_NECESSARY && is_last) { + if (want_arg && i == argc-1) { if (ignore_errors) { - arg = tor_strdup(""); + arg = strdup(""); } else { log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.", argv[i]); @@ -2408,16 +1886,12 @@ config_parse_commandline(int argc, char **argv, int ignore_errors, config_free_lines(front_cmdline); return -1; } - } else if (want_arg == ARGUMENT_OPTIONAL && is_last) { - arg = tor_strdup(""); } else { - arg = (want_arg != TAKES_NO_ARGUMENT) ? tor_strdup(argv[i+1]) : - tor_strdup(""); + arg = want_arg ? tor_strdup(argv[i+1]) : strdup(""); } param = tor_malloc_zero(sizeof(config_line_t)); - param->key = is_cmdline ? tor_strdup(argv[i]) : - tor_strdup(config_expand_abbrev(&options_format, s, 1, 1)); + param->key = is_cmdline ? tor_strdup(argv[i]) : tor_strdup(s); param->value = arg; param->command = command; param->next = NULL; @@ -2474,47 +1948,36 @@ option_get_assignment(const or_options_t *options, const char *key) * what went wrong. */ setopt_err_t -options_trial_assign(config_line_t *list, unsigned flags, char **msg) +options_trial_assign(config_line_t *list, int use_defaults, + int clear_first, char **msg) { int r; or_options_t *trial_options = config_dup(&options_format, get_options()); if ((r=config_assign(&options_format, trial_options, - list, flags, msg)) < 0) { - or_options_free(trial_options); + list, use_defaults, clear_first, msg)) < 0) { + config_free(&options_format, trial_options); return r; } - setopt_err_t rv; - or_options_t *cur_options = get_options_mutable(); - - in_option_validation = 1; - - if (options_validate(cur_options, trial_options, + if (options_validate(get_options_mutable(), trial_options, global_default_options, 1, msg) < 0) { - or_options_free(trial_options); - rv = SETOPT_ERR_PARSE; /*XXX make this a separate return value. */ - goto done; + config_free(&options_format, trial_options); + return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */ } - if (options_transition_allowed(cur_options, trial_options, msg) < 0) { - or_options_free(trial_options); - rv = SETOPT_ERR_TRANSITION; - goto done; + if (options_transition_allowed(get_options(), trial_options, msg) < 0) { + config_free(&options_format, trial_options); + return SETOPT_ERR_TRANSITION; } - in_option_validation = 0; if (set_options(trial_options, msg)<0) { - or_options_free(trial_options); - rv = SETOPT_ERR_SETTING; - goto done; + config_free(&options_format, trial_options); + return SETOPT_ERR_SETTING; } /* we liked it. put it in place. */ - rv = SETOPT_OK; - done: - in_option_validation = 0; - return rv; + return SETOPT_OK; } /** Print a usage message for tor. */ @@ -2524,7 +1987,7 @@ print_usage(void) printf( "Copyright (c) 2001-2004, Roger Dingledine\n" "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2017, The Tor Project, Inc.\n\n" +"Copyright (c) 2007-2013, The Tor Project, Inc.\n\n" "tor -f [args]\n" "See man page for options, or https://www.torproject.org/ for " "documentation.\n"); @@ -2535,6 +1998,7 @@ static void list_torrc_options(void) { int i; + smartlist_t *lines = smartlist_new(); for (i = 0; option_vars_[i].name; ++i) { const config_var_t *var = &option_vars_[i]; if (var->type == CONFIG_TYPE_OBSOLETE || @@ -2542,16 +2006,7 @@ list_torrc_options(void) continue; printf("%s\n", var->name); } -} - -/** Print all deprecated but non-obsolete torrc options. */ -static void -list_deprecated_options(void) -{ - const config_deprecation_t *d; - for (d = option_deprecation_notes_; d->name; ++d) { - printf("%s\n", d->name); - } + smartlist_free(lines); } /** Last value actually set by resolve_my_address. */ @@ -2564,49 +2019,8 @@ get_last_resolved_addr(void) return last_resolved_addr; } -/** Reset last_resolved_addr from outside this file. */ -void -reset_last_resolved_addr(void) -{ - last_resolved_addr = 0; -} - -/* Return true if options is using the default authorities, and false - * if any authority-related option has been overridden. */ -int -using_default_dir_authorities(const or_options_t *options) -{ - return (!options->DirAuthorities && !options->AlternateDirAuthority); -} - /** - * Attempt getting our non-local (as judged by tor_addr_is_internal() - * function) IP address using following techniques, listed in - * order from best (most desirable, try first) to worst (least - * desirable, try if everything else fails). - * - * First, attempt using options-\>Address to get our - * non-local IP address. - * - * If options-\>Address represents a non-local IP address, - * consider it ours. - * - * If options-\>Address is a DNS name that resolves to - * a non-local IP address, consider this IP address ours. - * - * If options-\>Address is NULL, fall back to getting local - * hostname and using it in above-described ways to try and - * get our IP address. - * - * In case local hostname cannot be resolved to a non-local IP - * address, try getting an IP address of network interface - * in hopes it will be non-local one. - * - * Fail if one or more of the following is true: - * - DNS name in options-\>Address cannot be resolved. - * - options-\>Address is a local host address. - * - Attempt at getting local hostname fails. - * - Attempt at getting network interface address fails. + * Use options-\>Address to guess our public IP address. * * Return 0 if all is well, or -1 if we can't find a suitable * public IP address. @@ -2615,11 +2029,6 @@ using_default_dir_authorities(const or_options_t *options) * - Put our public IP address (in host order) into *addr_out. * - If method_out is non-NULL, set *method_out to a static * string describing how we arrived at our answer. - * - "CONFIGURED" - parsed from IP address string in - * options-\>Address - * - "RESOLVED" - resolved from DNS name in options-\>Address - * - "GETHOSTNAME" - resolved from a local hostname. - * - "INTERFACE" - retrieved from a network interface. * - If hostname_out is non-NULL, and we resolved a hostname to * get our address, set *hostname_out to a newly allocated string * holding that hostname. (If we didn't get our address by resolving a @@ -2645,7 +2054,6 @@ resolve_my_address(int warn_severity, const or_options_t *options, int notice_severity = warn_severity <= LOG_NOTICE ? LOG_NOTICE : warn_severity; - tor_addr_t myaddr; tor_assert(addr_out); /* @@ -2658,7 +2066,7 @@ resolve_my_address(int warn_severity, const or_options_t *options, explicit_ip = 0; /* it's implicit */ explicit_hostname = 0; /* it's implicit */ - if (tor_gethostname(hostname, sizeof(hostname)) < 0) { + if (gethostname(hostname, sizeof(hostname)) < 0) { log_fn(warn_severity, LD_NET,"Error obtaining local hostname"); return -1; } @@ -2696,26 +2104,24 @@ resolve_my_address(int warn_severity, const or_options_t *options, "local interface. Using that.", fmt_addr32(addr)); strlcpy(hostname, "", sizeof(hostname)); } else { /* resolved hostname into addr */ - tor_addr_from_ipv4h(&myaddr, addr); - if (!explicit_hostname && - tor_addr_is_internal(&myaddr, 0)) { - tor_addr_t interface_ip; + is_internal_IP(addr, 0)) { + uint32_t interface_ip; log_fn(notice_severity, LD_CONFIG, "Guessed local hostname '%s' " "resolves to a private IP address (%s). Trying something " "else.", hostname, fmt_addr32(addr)); - if (get_interface_address6(warn_severity, AF_INET, &interface_ip)<0) { + if (get_interface_address(warn_severity, &interface_ip)) { log_fn(warn_severity, LD_CONFIG, "Could not get local interface IP address. Too bad."); - } else if (tor_addr_is_internal(&interface_ip, 0)) { + } else if (is_internal_IP(interface_ip, 0)) { log_fn(notice_severity, LD_CONFIG, "Interface IP address '%s' is a private address too. " - "Ignoring.", fmt_addr(&interface_ip)); + "Ignoring.", fmt_addr32(interface_ip)); } else { from_interface = 1; - addr = tor_addr_to_ipv4h(&interface_ip); + addr = interface_ip; log_fn(notice_severity, LD_CONFIG, "Learned IP address '%s' for local interface." " Using that.", fmt_addr32(addr)); @@ -2733,12 +2139,10 @@ resolve_my_address(int warn_severity, const or_options_t *options, * out if it is and we don't want that. */ - tor_addr_from_ipv4h(&myaddr,addr); - addr_string = tor_dup_ip(addr); - if (tor_addr_is_internal(&myaddr, 0)) { + if (is_internal_IP(addr, 0)) { /* make sure we're ok with publishing an internal IP */ - if (using_default_dir_authorities(options)) { + if (!options->DirAuthorities && !options->AlternateDirAuthority) { /* if they are using the default authorities, disallow internal IPs * always. */ log_fn(warn_severity, LD_CONFIG, @@ -2825,8 +2229,8 @@ resolve_my_address(int warn_severity, const or_options_t *options, /** Return true iff addr is judged to be on the same network as us, or * on a private network. */ -MOCK_IMPL(int, -is_local_addr, (const tor_addr_t *addr)) +int +is_local_addr(const tor_addr_t *addr) { if (tor_addr_is_internal(addr, 0)) return 1; @@ -2834,6 +2238,7 @@ is_local_addr, (const tor_addr_t *addr)) if (get_options()->EnforceDistinctSubnets == 0) return 0; if (tor_addr_family(addr) == AF_INET) { + /*XXXX023 IP6 what corresponds to an /24? */ uint32_t ip = tor_addr_to_ipv4h(addr); /* It's possible that this next check will hit before the first time @@ -2841,7 +2246,7 @@ is_local_addr, (const tor_addr_t *addr)) * resolve_my_address will never be called at all). In those cases, * last_resolved_addr will be 0, and so checking to see whether ip is on * the same /24 as last_resolved_addr will be the same as checking whether - * it was on net 0, which is already done by tor_addr_is_internal. + * it was on net 0, which is already done by is_internal_IP. */ if ((last_resolved_addr & (uint32_t)0xffffff00ul) == (ip & (uint32_t)0xffffff00ul)) @@ -2955,16 +2360,14 @@ compute_publishserverdescriptor(or_options_t *options) return 0; SMARTLIST_FOREACH_BEGIN(list, const char *, string) { if (!strcasecmp(string, "v1")) - log_warn(LD_CONFIG, "PublishServerDescriptor v1 has no effect, because " - "there are no v1 directory authorities anymore."); + *auth |= V1_DIRINFO; else if (!strcmp(string, "1")) if (options->BridgeRelay) *auth |= BRIDGE_DIRINFO; else *auth |= V3_DIRINFO; else if (!strcasecmp(string, "v2")) - log_warn(LD_CONFIG, "PublishServerDescriptor v2 has no effect, because " - "there are no v2 directory authorities anymore."); + /* obsolete */; else if (!strcasecmp(string, "v3")) *auth |= V3_DIRINFO; else if (!strcasecmp(string, "bridge")) @@ -2984,15 +2387,9 @@ compute_publishserverdescriptor(or_options_t *options) /** Lowest allowable value for RendPostPeriod; if this is too low, hidden * services can overload the directory system. */ #define MIN_REND_POST_PERIOD (10*60) -#define MIN_REND_POST_PERIOD_TESTING (5) - -/** Highest allowable value for CircuitsAvailableTimeout. - * If this is too large, client connections will stay open for too long, - * incurring extra padding overhead. */ -#define MAX_CIRCS_AVAILABLE_TIME (24*60*60) /** Highest allowable value for RendPostPeriod. */ -#define MAX_DIR_PERIOD ((7*24*60*60)/2) +#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) /** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor * will generate too many circuits and potentially overload the network. */ @@ -3006,6 +2403,10 @@ compute_publishserverdescriptor(or_options_t *options) * will generate too many circuits and potentially overload the network. */ #define MIN_CIRCUIT_STREAM_TIMEOUT 10 +/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might + * expose more information than we're comfortable with. */ +#define MIN_HEARTBEAT_PERIOD (30*60) + /** Lowest recommended value for CircuitBuildTimeout; if it is set too low * and LearnCircuitBuildTimeout is off, the failure rate for circuit * construction may be very high. In that case, if it is set below this @@ -3017,199 +2418,8 @@ static int options_validate_cb(void *old_options, void *options, void *default_options, int from_setconf, char **msg) { - in_option_validation = 1; - int rv = options_validate(old_options, options, default_options, + return options_validate(old_options, options, default_options, from_setconf, msg); - in_option_validation = 0; - return rv; -} - -#define REJECT(arg) \ - STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END -#if defined(__GNUC__) && __GNUC__ <= 3 -#define COMPLAIN(args...) \ - STMT_BEGIN log_warn(LD_CONFIG, args); STMT_END -#else -#define COMPLAIN(args, ...) \ - STMT_BEGIN log_warn(LD_CONFIG, args, ##__VA_ARGS__); STMT_END -#endif /* defined(__GNUC__) && __GNUC__ <= 3 */ - -/** Log a warning message iff filepath is not absolute. - * Warning message must contain option name option and - * an absolute path that filepath will resolve to. - * - * In case filepath is absolute, do nothing. - * - * Return 1 if there were relative paths; 0 otherwise. - */ -static int -warn_if_option_path_is_relative(const char *option, - char *filepath) -{ - if (filepath && path_is_relative(filepath)) { - char *abs_path = make_path_absolute(filepath); - COMPLAIN("Path for %s (%s) is relative and will resolve to %s." - " Is this what you wanted?", option, filepath, abs_path); - tor_free(abs_path); - return 1; - } - return 0; -} - -/** Scan options for occurances of relative file/directory - * path and log a warning whenever it is found. - * - * Return 1 if there were relative paths; 0 otherwise. - */ -static int -warn_about_relative_paths(or_options_t *options) -{ - tor_assert(options); - int n = 0; - - n += warn_if_option_path_is_relative("CookieAuthFile", - options->CookieAuthFile); - n += warn_if_option_path_is_relative("ExtORPortCookieAuthFile", - options->ExtORPortCookieAuthFile); - n += warn_if_option_path_is_relative("DirPortFrontPage", - options->DirPortFrontPage); - n += warn_if_option_path_is_relative("V3BandwidthsFile", - options->V3BandwidthsFile); - n += warn_if_option_path_is_relative("ControlPortWriteToFile", - options->ControlPortWriteToFile); - n += warn_if_option_path_is_relative("GeoIPFile",options->GeoIPFile); - n += warn_if_option_path_is_relative("GeoIPv6File",options->GeoIPv6File); - n += warn_if_option_path_is_relative("Log",options->DebugLogFile); - n += warn_if_option_path_is_relative("AccelDir",options->AccelDir); - n += warn_if_option_path_is_relative("DataDirectory",options->DataDirectory); - n += warn_if_option_path_is_relative("PidFile",options->PidFile); - - for (config_line_t *hs_line = options->RendConfigLines; hs_line; - hs_line = hs_line->next) { - if (!strcasecmp(hs_line->key, "HiddenServiceDir")) - n += warn_if_option_path_is_relative("HiddenServiceDir",hs_line->value); - } - return n != 0; -} - -/* Validate options related to the scheduler. From the Schedulers list, the - * SchedulerTypes_ list is created with int values so once we select the - * scheduler, which can happen anytime at runtime, we don't have to parse - * strings and thus be quick. - * - * Return 0 on success else -1 and msg is set with an error message. */ -static int -options_validate_scheduler(or_options_t *options, char **msg) -{ - tor_assert(options); - tor_assert(msg); - - if (!options->Schedulers || smartlist_len(options->Schedulers) == 0) { - REJECT("Empty Schedulers list. Either remove the option so the defaults " - "can be used or set at least one value."); - } - /* Ok, we do have scheduler types, validate them. */ - options->SchedulerTypes_ = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(options->Schedulers, const char *, type) { - int *sched_type; - if (!strcasecmp("KISTLite", type)) { - sched_type = tor_malloc_zero(sizeof(int)); - *sched_type = SCHEDULER_KIST_LITE; - smartlist_add(options->SchedulerTypes_, sched_type); - } else if (!strcasecmp("KIST", type)) { - sched_type = tor_malloc_zero(sizeof(int)); - *sched_type = SCHEDULER_KIST; - smartlist_add(options->SchedulerTypes_, sched_type); - } else if (!strcasecmp("Vanilla", type)) { - sched_type = tor_malloc_zero(sizeof(int)); - *sched_type = SCHEDULER_VANILLA; - smartlist_add(options->SchedulerTypes_, sched_type); - } else { - tor_asprintf(msg, "Unknown type %s in option Schedulers. " - "Possible values are KIST, KISTLite and Vanilla.", - escaped(type)); - return -1; - } - } SMARTLIST_FOREACH_END(type); - - if (options->KISTSockBufSizeFactor < 0) { - REJECT("KISTSockBufSizeFactor must be at least 0"); - } - - /* Don't need to validate that the Interval is less than anything because - * zero is valid and all negative values are valid. */ - if (options->KISTSchedRunInterval > KIST_SCHED_RUN_INTERVAL_MAX) { - tor_asprintf(msg, "KISTSchedRunInterval must not be more than %d (ms)", - KIST_SCHED_RUN_INTERVAL_MAX); - return -1; - } - - return 0; -} - -/* Validate options related to single onion services. - * Modifies some options that are incompatible with single onion services. - * On failure returns -1, and sets *msg to an error string. - * Returns 0 on success. */ -STATIC int -options_validate_single_onion(or_options_t *options, char **msg) -{ - /* The two single onion service options must have matching values. */ - if (options->HiddenServiceSingleHopMode && - !options->HiddenServiceNonAnonymousMode) { - REJECT("HiddenServiceSingleHopMode does not provide any server anonymity. " - "It must be used with HiddenServiceNonAnonymousMode set to 1."); - } - if (options->HiddenServiceNonAnonymousMode && - !options->HiddenServiceSingleHopMode) { - REJECT("HiddenServiceNonAnonymousMode does not provide any server " - "anonymity. It must be used with HiddenServiceSingleHopMode set to " - "1."); - } - - /* Now that we've checked that the two options are consistent, we can safely - * call the rend_service_* functions that abstract these options. */ - - /* If you run an anonymous client with an active Single Onion service, the - * client loses anonymity. */ - const int client_port_set = (options->SocksPort_set || - options->TransPort_set || - options->NATDPort_set || - options->DNSPort_set || - options->HTTPTunnelPort_set); - if (rend_service_non_anonymous_mode_enabled(options) && client_port_set && - !options->Tor2webMode) { - REJECT("HiddenServiceNonAnonymousMode is incompatible with using Tor as " - "an anonymous client. Please set Socks/Trans/NATD/DNSPort to 0, or " - "revert HiddenServiceNonAnonymousMode to 0."); - } - - /* If you run a hidden service in non-anonymous mode, the hidden service - * loses anonymity, even if SOCKSPort / Tor2web mode isn't used. */ - if (!rend_service_non_anonymous_mode_enabled(options) && - options->RendConfigLines && options->Tor2webMode) { - REJECT("Non-anonymous (Tor2web) mode is incompatible with using Tor as a " - "hidden service. Please remove all HiddenServiceDir lines, or use " - "a version of tor compiled without --enable-tor2web-mode, or use " - "HiddenServiceNonAnonymousMode."); - } - - if (rend_service_allow_non_anonymous_connection(options) - && options->UseEntryGuards) { - /* Single Onion services only use entry guards when uploading descriptors; - * all other connections are one-hop. Further, Single Onions causes the - * hidden service code to do things which break the path bias - * detector, and it's far easier to turn off entry guards (and - * thus the path bias detector with it) than to figure out how to - * make path bias compatible with single onions. - */ - log_notice(LD_CONFIG, - "HiddenServiceSingleHopMode is enabled; disabling " - "UseEntryGuards."); - options->UseEntryGuards = 0; - } - - return 0; } /** Return 0 if every setting in options is reasonable, is a @@ -3233,41 +2443,30 @@ options_validate(or_options_t *old_options, or_options_t *options, config_line_t *cl; const char *uname = get_uname(); int n_ports=0; - int world_writable_control_socket=0; +#define REJECT(arg) \ + STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END +#define COMPLAIN(arg) STMT_BEGIN log_warn(LD_CONFIG, arg); STMT_END tor_assert(msg); *msg = NULL; - if (parse_ports(options, 1, msg, &n_ports, - &world_writable_control_socket) < 0) - return -1; - - /* Set UseEntryGuards from the configured value, before we check it below. - * We change UseEntryGuards when it's incompatible with other options, - * but leave UseEntryGuards_option with the original value. - * Always use the value of UseEntryGuards, not UseEntryGuards_option. */ - options->UseEntryGuards = options->UseEntryGuards_option; - - if (warn_about_relative_paths(options) && options->RunAsDaemon) { - REJECT("You have specified at least one relative path (see above) " - "with the RunAsDaemon option. RunAsDaemon is not compatible " - "with relative paths."); - } - if (server_mode(options) && (!strcmpstart(uname, "Windows 95") || !strcmpstart(uname, "Windows 98") || !strcmpstart(uname, "Windows Me"))) { log_warn(LD_CONFIG, "Tor is running as a server, but you are " "running %s; this probably won't work. See " - "https://www.torproject.org/docs/faq.html#BestOSForRelay " + "https://wiki.torproject.org/TheOnionRouter/TorFAQ#ServerOS " "for details.", uname); } + if (parse_ports(options, 1, msg, &n_ports) < 0) + return -1; + if (parse_outbound_addresses(options, 1, msg) < 0) return -1; - if (validate_data_directories(options)<0) + if (validate_data_directory(options)<0) REJECT("Invalid DataDirectory"); if (options->Nickname == NULL) { @@ -3277,8 +2476,7 @@ options_validate(or_options_t *old_options, or_options_t *options, } else { if (!is_legal_nickname(options->Nickname)) { tor_asprintf(msg, - "Nickname '%s', nicknames must be between 1 and 19 characters " - "inclusive, and must contain only the characters [a-zA-Z0-9].", + "Nickname '%s' is wrong length or contains illegal characters.", options->Nickname); return -1; } @@ -3297,8 +2495,7 @@ options_validate(or_options_t *old_options, or_options_t *options, config_line_append(&options->Logs, "Log", "warn stdout"); } - /* Validate the tor_log(s) */ - if (options_init_logs(old_options, options, 1)<0) + if (options_init_logs(options, 1)<0) /* Validate the tor_log(s) */ REJECT("Failed to validate Log options. See logs for details."); if (authdir_mode(options)) { @@ -3308,12 +2505,10 @@ options_validate(or_options_t *old_options, or_options_t *options, REJECT("Failed to resolve/guess local address. See logs for details."); } - if (server_mode(options) && options->RendConfigLines) - log_warn(LD_CONFIG, - "Tor is currently configured as a relay and a hidden service. " - "That's not very secure: you should probably run your hidden service " - "in a separate Tor process, at least -- see " - "https://trac.torproject.org/8742"); +#ifndef _WIN32 + if (options->RunAsDaemon && torrc_fname && path_is_relative(torrc_fname)) + REJECT("Can't use a relative path to torrc when RunAsDaemon is set."); +#endif /* XXXX require that the only port not be DirPort? */ /* XXXX require that at least one port be listened-upon. */ @@ -3328,41 +2523,27 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->TransProxyType) { if (!strcasecmp(options->TransProxyType, "default")) { options->TransProxyType_parsed = TPT_DEFAULT; - } else if (!strcasecmp(options->TransProxyType, "pf-divert")) { -#if !defined(OpenBSD) && !defined( DARWIN ) - /* Later versions of OS X have pf */ - REJECT("pf-divert is a OpenBSD-specific " - "and OS X/Darwin-specific feature."); -#else - options->TransProxyType_parsed = TPT_PF_DIVERT; -#endif /* !defined(OpenBSD) && !defined( DARWIN ) */ } else if (!strcasecmp(options->TransProxyType, "tproxy")) { -#if !defined(__linux__) +#ifndef __linux__ REJECT("TPROXY is a Linux-specific feature."); #else options->TransProxyType_parsed = TPT_TPROXY; #endif - } else if (!strcasecmp(options->TransProxyType, "ipfw")) { -#ifndef KERNEL_MAY_SUPPORT_IPFW - /* Earlier versions of OS X have ipfw */ - REJECT("ipfw is a FreeBSD-specific " - "and OS X/Darwin-specific feature."); -#else - options->TransProxyType_parsed = TPT_IPFW; -#endif /* !defined(KERNEL_MAY_SUPPORT_IPFW) */ } else { REJECT("Unrecognized value for TransProxyType"); } if (strcasecmp(options->TransProxyType, "default") && !options->TransPort_set) { - REJECT("Cannot use TransProxyType without any valid TransPort."); + REJECT("Cannot use TransProxyType without any valid TransPort or " + "TransListenAddress."); } } -#else /* !(defined(USE_TRANSPARENT)) */ +#else if (options->TransPort_set) - REJECT("TransPort is disabled in this build."); -#endif /* defined(USE_TRANSPARENT) */ + REJECT("TransPort and TransListenAddress are disabled " + "in this build."); +#endif if (options->TokenBucketRefillInterval <= 0 || options->TokenBucketRefillInterval > 1000) { @@ -3387,22 +2568,23 @@ options_validate(or_options_t *old_options, or_options_t *options, } } + if (options->TLSECGroup && (strcasecmp(options->TLSECGroup, "P256") && + strcasecmp(options->TLSECGroup, "P224"))) { + COMPLAIN("Unrecognized TLSECGroup: Falling back to the default."); + tor_free(options->TLSECGroup); + } + if (options->ExcludeNodes && options->StrictNodes) { COMPLAIN("You have asked to exclude certain relays from all positions " "in your circuits. Expect hidden services and other Tor " "features to be broken in unpredictable ways."); } - for (cl = options->RecommendedPackages; cl; cl = cl->next) { - if (! validate_recommended_package_line(cl->value)) { - log_warn(LD_CONFIG, "Invalid RecommendedPackage line %s will be ignored", - escaped(cl->value)); - } - } - if (options->AuthoritativeDir) { if (!options->ContactInfo && !options->TestingTorNetwork) REJECT("Authoritative directory servers must set ContactInfo"); + if (options->V1AuthoritativeDir && !options->RecommendedVersions) + REJECT("V1 authoritative dir servers must set RecommendedVersions."); if (!options->RecommendedClientVersions) options->RecommendedClientVersions = config_lines_dup(options->RecommendedVersions); @@ -3419,23 +2601,20 @@ options_validate(or_options_t *old_options, or_options_t *options, "UseEntryGuards. Disabling."); options->UseEntryGuards = 0; } - if (!options->DownloadExtraInfo && authdir_mode_v3(options)) { + if (!options->DownloadExtraInfo && authdir_mode_any_main(options)) { log_info(LD_CONFIG, "Authoritative directories always try to download " "extra-info documents. Setting DownloadExtraInfo."); options->DownloadExtraInfo = 1; } - if (!(options->BridgeAuthoritativeDir || + if (!(options->BridgeAuthoritativeDir || options->HSAuthoritativeDir || + options->V1AuthoritativeDir || options->V3AuthoritativeDir)) REJECT("AuthoritativeDir is set, but none of " - "(Bridge/V3)AuthoritativeDir is set."); + "(Bridge/HS/V1/V3)AuthoritativeDir is set."); /* If we have a v3bandwidthsfile and it's broken, complain on startup */ if (options->V3BandwidthsFile && !old_options) { dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL); } - /* same for guardfraction file */ - if (options->GuardfractionFile && !old_options) { - dirserv_read_guardfraction_file(options->GuardfractionFile, NULL); - } } if (options->AuthoritativeDir && !options->DirPort_set) @@ -3451,6 +2630,10 @@ options_validate(or_options_t *old_options, or_options_t *options, REJECT("FetchDirInfoExtraEarly requires that you also set " "FetchDirInfoEarly"); + if (options->HSAuthoritativeDir && proxy_mode(options)) + REJECT("Running as authoritative v0 HS directory, but also configured " + "as a client."); + if (options->ConnLimit <= 0) { tor_asprintf(msg, "ConnLimit must be greater than 0, but was set to %d", @@ -3540,8 +2723,6 @@ options_validate(or_options_t *old_options, or_options_t *options, } } - /* Terminate Reachable*Addresses with reject * - */ for (i=0; i<3; i++) { config_line_t **linep = (i==0) ? &options->ReachableAddresses : @@ -3551,6 +2732,8 @@ options_validate(or_options_t *old_options, or_options_t *options, continue; /* We need to end with a reject *:*, not an implicit accept *:* */ for (;;) { + if (!strcmp((*linep)->value, "reject *:*")) /* already there */ + break; linep = &((*linep)->next); if (!*linep) { *linep = tor_malloc_zero(sizeof(config_line_t)); @@ -3566,12 +2749,11 @@ options_validate(or_options_t *old_options, or_options_t *options, if ((options->ReachableAddresses || options->ReachableORAddresses || - options->ReachableDirAddresses || - options->ClientUseIPv4 == 0) && + options->ReachableDirAddresses) && server_mode(options)) REJECT("Servers must be able to freely connect to the rest " "of the Internet, so they must not set Reachable*Addresses " - "or FascistFirewall or FirewallPorts or ClientUseIPv4 0."); + "or FascistFirewall."); if (options->UseBridges && server_mode(options)) @@ -3584,15 +2766,37 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->UseBridges && options->EntryNodes) REJECT("You cannot set both UseBridges and EntryNodes."); - /* If we have UseBridges as 1 and UseEntryGuards as 0, we end up bypassing - * the use of bridges */ - if (options->UseBridges && !options->UseEntryGuards) - REJECT("Setting UseBridges requires also setting UseEntryGuards."); + if (options->EntryNodes && !options->UseEntryGuards) { + REJECT("If EntryNodes is set, UseEntryGuards must be enabled."); + } - options->MaxMemInQueues = - compute_real_max_mem_in_queues(options->MaxMemInQueues_raw, - server_mode(options)); - options->MaxMemInQueues_low_threshold = (options->MaxMemInQueues / 4) * 3; + if (options->MaxMemInCellQueues < (500 << 20)) { + log_warn(LD_CONFIG, "MaxMemInCellQueues must be at least 500 MB for now. " + "Ideally, have it as large as you can afford."); + options->MaxMemInCellQueues = (500 << 20); + } + + options->AllowInvalid_ = 0; + + if (options->AllowInvalidNodes) { + SMARTLIST_FOREACH_BEGIN(options->AllowInvalidNodes, const char *, cp) { + if (!strcasecmp(cp, "entry")) + options->AllowInvalid_ |= ALLOW_INVALID_ENTRY; + else if (!strcasecmp(cp, "exit")) + options->AllowInvalid_ |= ALLOW_INVALID_EXIT; + else if (!strcasecmp(cp, "middle")) + options->AllowInvalid_ |= ALLOW_INVALID_MIDDLE; + else if (!strcasecmp(cp, "introduction")) + options->AllowInvalid_ |= ALLOW_INVALID_INTRODUCTION; + else if (!strcasecmp(cp, "rendezvous")) + options->AllowInvalid_ |= ALLOW_INVALID_RENDEZVOUS; + else { + tor_asprintf(msg, + "Unrecognized value '%s' in AllowInvalidNodes", cp); + return -1; + } + } SMARTLIST_FOREACH_END(cp); + } if (!options->SafeLogging || !strcasecmp(options->SafeLogging, "0")) { @@ -3615,7 +2819,8 @@ options_validate(or_options_t *old_options, or_options_t *options, if ((options->BridgeRelay || options->PublishServerDescriptor_ & BRIDGE_DIRINFO) - && (options->PublishServerDescriptor_ & V3_DIRINFO)) { + && (options->PublishServerDescriptor_ + & (V1_DIRINFO|V3_DIRINFO))) { REJECT("Bridges are not supposed to publish router descriptors to the " "directory authorities. Please correct your " "PublishServerDescriptor line."); @@ -3629,36 +2834,16 @@ options_validate(or_options_t *old_options, or_options_t *options, options->DirPort_set = 0; } - if (server_mode(options) && options->ConnectionPadding != -1) { - REJECT("Relays must use 'auto' for the ConnectionPadding setting."); - } - - if (server_mode(options) && options->ReducedConnectionPadding != 0) { - REJECT("Relays cannot set ReducedConnectionPadding. "); - } - - if (options->BridgeDistribution) { - if (!options->BridgeRelay) { - REJECT("You set BridgeDistribution, but you didn't set BridgeRelay!"); - } - if (check_bridge_distribution_setting(options->BridgeDistribution) < 0) { - REJECT("Invalid BridgeDistribution value."); - } - } - if (options->MinUptimeHidServDirectoryV2 < 0) { log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at " "least 0 seconds. Changing to 0."); options->MinUptimeHidServDirectoryV2 = 0; } - const int min_rendpostperiod = - options->TestingTorNetwork ? - MIN_REND_POST_PERIOD_TESTING : MIN_REND_POST_PERIOD; - if (options->RendPostPeriod < min_rendpostperiod) { + if (options->RendPostPeriod < MIN_REND_POST_PERIOD) { log_warn(LD_CONFIG, "RendPostPeriod option is too short; " - "raising to %d seconds.", min_rendpostperiod); - options->RendPostPeriod = min_rendpostperiod; + "raising to %d seconds.", MIN_REND_POST_PERIOD); + options->RendPostPeriod = MIN_REND_POST_PERIOD; } if (options->RendPostPeriod > MAX_DIR_PERIOD) { @@ -3667,18 +2852,24 @@ options_validate(or_options_t *old_options, or_options_t *options, options->RendPostPeriod = MAX_DIR_PERIOD; } - /* Check the Single Onion Service options */ - if (options_validate_single_onion(options, msg) < 0) - return -1; - - if (options->CircuitsAvailableTimeout > MAX_CIRCS_AVAILABLE_TIME) { - // options_t is immutable for new code (the above code is older), - // so just make the user fix the value themselves rather than - // silently keep a shadow value lower than what they asked for. - REJECT("CircuitsAvailableTimeout is too large. Max is 24 hours."); + if (options->Tor2webMode && options->LearnCircuitBuildTimeout) { + /* LearnCircuitBuildTimeout and Tor2webMode are incompatible in + * two ways: + * + * - LearnCircuitBuildTimeout results in a low CBT, which + * Tor2webMode's use of one-hop rendezvous circuits lowers + * much further, producing *far* too many timeouts. + * + * - The adaptive CBT code does not update its timeout estimate + * using build times for single-hop circuits. + * + * If we fix both of these issues someday, we should test + * Tor2webMode with LearnCircuitBuildTimeout on again. */ + log_notice(LD_CONFIG,"Tor2webMode is enabled; turning " + "LearnCircuitBuildTimeout off."); + options->LearnCircuitBuildTimeout = 0; } -#ifdef ENABLE_TOR2WEB_MODE if (options->Tor2webMode && options->UseEntryGuards) { /* tor2web mode clients do not (and should not) use entry guards * in any meaningful way. Further, tor2web mode causes the hidden @@ -3692,19 +2883,9 @@ options_validate(or_options_t *old_options, or_options_t *options, "Tor2WebMode is enabled; disabling UseEntryGuards."); options->UseEntryGuards = 0; } -#endif /* defined(ENABLE_TOR2WEB_MODE) */ - - if (options->Tor2webRendezvousPoints && !options->Tor2webMode) { - REJECT("Tor2webRendezvousPoints cannot be set without Tor2webMode."); - } - - if (options->EntryNodes && !options->UseEntryGuards) { - REJECT("If EntryNodes is set, UseEntryGuards must be enabled."); - } if (!(options->UseEntryGuards) && - (options->RendConfigLines != NULL) && - !rend_service_allow_non_anonymous_connection(options)) { + (options->RendConfigLines != NULL)) { log_warn(LD_CONFIG, "UseEntryGuards is disabled, but you have configured one or more " "hidden services on this Tor instance. Your hidden services " @@ -3712,46 +2893,6 @@ options_validate(or_options_t *old_options, or_options_t *options, "http://freehaven.net/anonbib/#hs-attack06 for details."); } - if (options->EntryNodes && - routerset_is_list(options->EntryNodes) && - (routerset_len(options->EntryNodes) == 1) && - (options->RendConfigLines != NULL)) { - tor_asprintf(msg, - "You have one single EntryNodes and at least one hidden service " - "configured. This is bad because it's very easy to locate your " - "entry guard which can then lead to the deanonymization of your " - "hidden service -- for more details, see " - "https://trac.torproject.org/projects/tor/ticket/14917. " - "For this reason, the use of one EntryNodes with an hidden " - "service is prohibited until a better solution is found."); - return -1; - } - - /* Inform the hidden service operator that pinning EntryNodes can possibly - * be harmful for the service anonymity. */ - if (options->EntryNodes && - routerset_is_list(options->EntryNodes) && - (options->RendConfigLines != NULL)) { - log_warn(LD_CONFIG, - "EntryNodes is set with multiple entries and at least one " - "hidden service is configured. Pinning entry nodes can possibly " - "be harmful to the service anonymity. Because of this, we " - "recommend you either don't do that or make sure you know what " - "you are doing. For more details, please look at " - "https://trac.torproject.org/projects/tor/ticket/21155."); - } - - /* Single Onion Services: non-anonymous hidden services */ - if (rend_service_non_anonymous_mode_enabled(options)) { - log_warn(LD_CONFIG, - "HiddenServiceNonAnonymousMode is set. Every hidden service on " - "this tor instance is NON-ANONYMOUS. If " - "the HiddenServiceNonAnonymousMode option is changed, Tor will " - "refuse to launch hidden services from the same directories, to " - "protect your anonymity against config errors. This setting is " - "for experimental use only."); - } - if (!options->LearnCircuitBuildTimeout && options->CircuitBuildTimeout && options->CircuitBuildTimeout < RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT) { log_warn(LD_CONFIG, @@ -3763,15 +2904,8 @@ options_validate(or_options_t *old_options, or_options_t *options, RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT ); } else if (!options->LearnCircuitBuildTimeout && !options->CircuitBuildTimeout) { - int severity = LOG_NOTICE; - /* Be a little quieter if we've deliberately disabled - * LearnCircuitBuildTimeout. */ - if (circuit_build_times_disabled_(options, 1)) { - severity = LOG_INFO; - } - log_fn(severity, LD_CONFIG, "You disabled LearnCircuitBuildTimeout, but " - "didn't specify a CircuitBuildTimeout. I'll pick a plausible " - "default."); + log_notice(LD_CONFIG, "You disabled LearnCircuitBuildTimeout, but didn't " + "a CircuitBuildTimeout. I'll pick a plausible default."); } if (options->PathBiasNoticeRate > 1.0) { @@ -3834,15 +2968,6 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->KeepalivePeriod < 1) REJECT("KeepalivePeriod option must be positive."); - if (options->PortForwarding && options->Sandbox) { - REJECT("PortForwarding is not compatible with Sandbox; at most one can " - "be set"); - } - if (options->PortForwarding && options->NoExec) { - COMPLAIN("Both PortForwarding and NoExec are set; PortForwarding will " - "be ignored."); - } - if (ensure_bandwidth_cap(&options->BandwidthRate, "BandwidthRate", msg) < 0) return -1; @@ -3877,34 +3002,29 @@ options_validate(or_options_t *old_options, or_options_t *options, options->RelayBandwidthRate = options->RelayBandwidthBurst; if (server_mode(options)) { - const unsigned required_min_bw = - public_server_mode(options) ? - RELAY_REQUIRED_MIN_BANDWIDTH : BRIDGE_REQUIRED_MIN_BANDWIDTH; - const char * const optbridge = - public_server_mode(options) ? "" : "bridge "; - if (options->BandwidthRate < required_min_bw) { + if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { tor_asprintf(msg, "BandwidthRate is set to %d bytes/second. " - "For %sservers, it must be at least %u.", - (int)options->BandwidthRate, optbridge, - required_min_bw); + "For servers, it must be at least %d.", + (int)options->BandwidthRate, + ROUTER_REQUIRED_MIN_BANDWIDTH); return -1; } else if (options->MaxAdvertisedBandwidth < - required_min_bw/2) { + ROUTER_REQUIRED_MIN_BANDWIDTH/2) { tor_asprintf(msg, "MaxAdvertisedBandwidth is set to %d bytes/second. " - "For %sservers, it must be at least %u.", - (int)options->MaxAdvertisedBandwidth, optbridge, - required_min_bw/2); + "For servers, it must be at least %d.", + (int)options->MaxAdvertisedBandwidth, + ROUTER_REQUIRED_MIN_BANDWIDTH/2); return -1; } if (options->RelayBandwidthRate && - options->RelayBandwidthRate < required_min_bw) { + options->RelayBandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { tor_asprintf(msg, "RelayBandwidthRate is set to %d bytes/second. " - "For %sservers, it must be at least %u.", - (int)options->RelayBandwidthRate, optbridge, - required_min_bw); + "For servers, it must be at least %d.", + (int)options->RelayBandwidthRate, + ROUTER_REQUIRED_MIN_BANDWIDTH); return -1; } } @@ -3940,38 +3060,6 @@ options_validate(or_options_t *old_options, or_options_t *options, } } - options->AccountingRule = ACCT_MAX; - if (options->AccountingRule_option) { - if (!strcmp(options->AccountingRule_option, "sum")) - options->AccountingRule = ACCT_SUM; - else if (!strcmp(options->AccountingRule_option, "max")) - options->AccountingRule = ACCT_MAX; - else if (!strcmp(options->AccountingRule_option, "in")) - options->AccountingRule = ACCT_IN; - else if (!strcmp(options->AccountingRule_option, "out")) - options->AccountingRule = ACCT_OUT; - else - REJECT("AccountingRule must be 'sum', 'max', 'in', or 'out'"); - } - - if (options->DirPort_set && !options->DirCache) { - REJECT("DirPort configured but DirCache disabled. DirPort requires " - "DirCache."); - } - - if (options->BridgeRelay && !options->DirCache) { - REJECT("We're a bridge but DirCache is disabled. BridgeRelay requires " - "DirCache."); - } - - if (server_mode(options)) { - char *dircache_msg = NULL; - if (have_enough_mem_for_dircache(options, 0, &dircache_msg)) { - log_warn(LD_CONFIG, "%s", dircache_msg); - tor_free(dircache_msg); - } - } - if (options->HTTPProxy) { /* parse it now */ if (tor_addr_port_lookup(options->HTTPProxy, &options->HTTPProxyAddr, &options->HTTPProxyPort) < 0) @@ -4020,11 +3108,11 @@ options_validate(or_options_t *old_options, or_options_t *options, } } - /* Check if more than one exclusive proxy type has been enabled. */ + /* Check if more than one proxy type has been enabled. */ if (!!options->Socks4Proxy + !!options->Socks5Proxy + - !!options->HTTPSProxy > 1) + !!options->HTTPSProxy + !!options->ClientTransportPlugin > 1) REJECT("You have configured more than one proxy type. " - "(Socks4Proxy|Socks5Proxy|HTTPSProxy)"); + "(Socks4Proxy|Socks5Proxy|HTTPSProxy|ClientTransportPlugin)"); /* Check if the proxies will give surprising behavior. */ if (options->HTTPProxy && !(options->Socks4Proxy || @@ -4082,16 +3170,13 @@ options_validate(or_options_t *old_options, or_options_t *options, } } - if ((options->ControlPort_set || world_writable_control_socket) && - !options->HashedControlPassword && + if (options->ControlPort_set && !options->HashedControlPassword && !options->HashedControlSessionPassword && !options->CookieAuthentication) { - log_warn(LD_CONFIG, "Control%s is %s, but no authentication method " + log_warn(LD_CONFIG, "ControlPort is open, but no authentication method " "has been configured. This means that any program on your " "computer can reconfigure your Tor. That's bad! You should " - "upgrade your Tor controller as soon as possible.", - options->ControlPort_set ? "Port" : "Socket", - options->ControlPort_set ? "open" : "world writable"); + "upgrade your Tor controller as soon as possible."); } if (options->CookieAuthFileGroupReadable && !options->CookieAuthFile) { @@ -4100,14 +3185,16 @@ options_validate(or_options_t *old_options, or_options_t *options, "have it group-readable."); } - if (options->MyFamily_lines && options->BridgeRelay) { + if (options->UseEntryGuards && ! options->NumEntryGuards) + REJECT("Cannot enable UseEntryGuards with NumEntryGuards set to 0"); + + if (options->MyFamily && options->BridgeRelay) { log_warn(LD_CONFIG, "Listing a family for a bridge relay is not " "supported: it can reveal bridge fingerprints to censors. " "You should also make sure you aren't listing this bridge's " "fingerprint in any other MyFamily."); } - if (normalize_nickname_list(&options->MyFamily, - options->MyFamily_lines, "MyFamily", msg)) + if (check_nickname_list(&options->MyFamily, "MyFamily", msg)) return -1; for (cl = options->NodeFamilies; cl; cl = cl->next) { routerset_t *rs = routerset_new(); @@ -4121,19 +3208,14 @@ options_validate(or_options_t *old_options, or_options_t *options, if (validate_addr_policies(options, msg) < 0) return -1; - /* If FallbackDir is set, we don't UseDefaultFallbackDirs */ - if (options->UseDefaultFallbackDirs && options->FallbackDir) { - log_info(LD_CONFIG, "You have set UseDefaultFallbackDirs 1 and " - "FallbackDir(s). Ignoring UseDefaultFallbackDirs, and " - "using the FallbackDir(s) you have set."); - } - if (validate_dir_servers(options, old_options) < 0) REJECT("Directory authority/fallback line did not parse. See logs " "for details."); if (options->UseBridges && !options->Bridges) REJECT("If you set UseBridges, you must specify at least one bridge."); + if (options->UseBridges && !options->TunnelDirConns) + REJECT("If you set UseBridges, you must set TunnelDirConns."); for (cl = options->Bridges; cl; cl = cl->next) { bridge_line_t *bridge_line = parse_bridge_line(cl->value); @@ -4143,13 +3225,13 @@ options_validate(or_options_t *old_options, or_options_t *options, } for (cl = options->ClientTransportPlugin; cl; cl = cl->next) { - if (parse_transport_line(options, cl->value, 1, 0) < 0) - REJECT("Invalid client transport line. See logs for details."); + if (parse_client_transport_line(cl->value, 1)<0) + REJECT("Transport line did not parse. See logs for details."); } for (cl = options->ServerTransportPlugin; cl; cl = cl->next) { - if (parse_transport_line(options, cl->value, 1, 1) < 0) - REJECT("Invalid server transport line. See logs for details."); + if (parse_server_transport_line(cl->value, 1)<0) + REJECT("Server transport line did not parse. See logs for details."); } if (options->ServerTransportPlugin && !server_mode(options)) { @@ -4188,6 +3270,17 @@ options_validate(or_options_t *old_options, or_options_t *options, smartlist_free(options_sl); } + /* If we are a bridge with a pluggable transport proxy but no + Extended ORPort, inform the user that she is missing out. */ + if (server_mode(options) && options->ServerTransportPlugin && + !options->ExtORPort_lines) { + log_notice(LD_CONFIG, "We are a bridge with a pluggable transport " + "proxy but the Extended ORPort is disabled. The " + "Extended ORPort helps Tor communicate with the pluggable " + "transport proxy. Please enable it using the ExtORPort " + "torrc option."); + } + if (options->ConstrainedSockets) { /* If the user wants to constrain socket buffer use, make sure the desired * limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */ @@ -4212,75 +3305,26 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= options->V3AuthVotingInterval/2) { - /* - This doesn't work, but it seems like it should: - what code is preventing the interval being less than twice the lead-up? - if (options->TestingTorNetwork) { - if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= - options->V3AuthVotingInterval) { - REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than " - "V3AuthVotingInterval"); - } else { - COMPLAIN("V3AuthVoteDelay plus V3AuthDistDelay is more than half " - "V3AuthVotingInterval. This may lead to " - "consensus instability, particularly if clocks drift."); - } - } else { - */ - REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " - "V3AuthVotingInterval"); - /* - } - */ - } - - if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) { - if (options->TestingTorNetwork) { - if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS_TESTING) { - REJECT("V3AuthVoteDelay is way too low."); - } else { - COMPLAIN("V3AuthVoteDelay is very low. " - "This may lead to failure to vote for a consensus."); - } - } else { - REJECT("V3AuthVoteDelay is way too low."); - } - } - - if (options->V3AuthDistDelay < MIN_DIST_SECONDS) { - if (options->TestingTorNetwork) { - if (options->V3AuthDistDelay < MIN_DIST_SECONDS_TESTING) { - REJECT("V3AuthDistDelay is way too low."); - } else { - COMPLAIN("V3AuthDistDelay is very low. " - "This may lead to missing votes in a consensus."); - } - } else { - REJECT("V3AuthDistDelay is way too low."); - } + REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " + "V3AuthVotingInterval"); } + if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) + REJECT("V3AuthVoteDelay is way too low."); + if (options->V3AuthDistDelay < MIN_DIST_SECONDS) + REJECT("V3AuthDistDelay is way too low."); if (options->V3AuthNIntervalsValid < 2) REJECT("V3AuthNIntervalsValid must be at least 2."); if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) { - if (options->TestingTorNetwork) { - if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL_TESTING) { - REJECT("V3AuthVotingInterval is insanely low."); - } else { - COMPLAIN("V3AuthVotingInterval is very low. " - "This may lead to failure to synchronise for a consensus."); - } - } else { - REJECT("V3AuthVotingInterval is insanely low."); - } + REJECT("V3AuthVotingInterval is insanely low."); } else if (options->V3AuthVotingInterval > 24*60*60) { REJECT("V3AuthVotingInterval is insanely high."); } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) { COMPLAIN("V3AuthVotingInterval does not divide evenly into 24 hours."); } - if (hs_config_service_all(options, 1) < 0) + if (rend_config_services(options, 1) < 0) REJECT("Failed to configure rendezvous options. See logs for details."); /* Parse client-side authorization for hidden services. */ @@ -4295,6 +3339,24 @@ options_validate(or_options_t *old_options, or_options_t *options, AF_INET6, 1, msg)<0) return -1; + if (options->PreferTunneledDirConns && !options->TunnelDirConns) + REJECT("Must set TunnelDirConns if PreferTunneledDirConns is set."); + + if ((options->Socks4Proxy || options->Socks5Proxy) && + !options->HTTPProxy && !options->PreferTunneledDirConns) + REJECT("When Socks4Proxy or Socks5Proxy is configured, " + "PreferTunneledDirConns and TunnelDirConns must both be " + "set to 1, or HTTPProxy must be configured."); + + if (options->AutomapHostsSuffixes) { + SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf, + { + size_t len = strlen(suf); + if (len && suf[len-1] == '.') + suf[len-1] = '\0'; + }); + } + if (options->TestingTorNetwork && !(options->DirAuthorities || (options->AlternateDirAuthority && @@ -4304,6 +3366,13 @@ options_validate(or_options_t *old_options, or_options_t *options, "AlternateDirAuthority and AlternateBridgeAuthority configured."); } + if (options->AllowSingleHopExits && !options->DirAuthorities) { + COMPLAIN("You have set AllowSingleHopExits; now your relay will allow " + "others to make one-hop exits. However, since by default most " + "clients avoid relays that set this option, most clients will " + "ignore you."); + } + #define CHECK_DEFAULT(arg) \ STMT_BEGIN \ if (!options->TestingTorNetwork && \ @@ -4324,52 +3393,34 @@ options_validate(or_options_t *old_options, or_options_t *options, CHECK_DEFAULT(TestingServerConsensusDownloadSchedule); CHECK_DEFAULT(TestingClientConsensusDownloadSchedule); CHECK_DEFAULT(TestingBridgeDownloadSchedule); - CHECK_DEFAULT(TestingBridgeBootstrapDownloadSchedule); CHECK_DEFAULT(TestingClientMaxIntervalWithoutRequest); CHECK_DEFAULT(TestingDirConnectionMaxStall); CHECK_DEFAULT(TestingConsensusMaxDownloadTries); CHECK_DEFAULT(TestingDescriptorMaxDownloadTries); CHECK_DEFAULT(TestingMicrodescMaxDownloadTries); CHECK_DEFAULT(TestingCertMaxDownloadTries); - CHECK_DEFAULT(TestingAuthKeyLifetime); - CHECK_DEFAULT(TestingLinkCertLifetime); - CHECK_DEFAULT(TestingSigningKeySlop); - CHECK_DEFAULT(TestingAuthKeySlop); - CHECK_DEFAULT(TestingLinkKeySlop); #undef CHECK_DEFAULT - if (!options->ClientDNSRejectInternalAddresses && - !(options->DirAuthorities || - (options->AlternateDirAuthority && options->AlternateBridgeAuthority))) - REJECT("ClientDNSRejectInternalAddresses used for default network."); - if (options->SigningKeyLifetime < options->TestingSigningKeySlop*2) - REJECT("SigningKeyLifetime is too short."); - if (options->TestingLinkCertLifetime < options->TestingAuthKeySlop*2) - REJECT("LinkCertLifetime is too short."); - if (options->TestingAuthKeyLifetime < options->TestingLinkKeySlop*2) - REJECT("TestingAuthKeyLifetime is too short."); - - if (options->TestingV3AuthInitialVotingInterval - < MIN_VOTE_INTERVAL_TESTING_INITIAL) { + if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) { REJECT("TestingV3AuthInitialVotingInterval is insanely low."); } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) { REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into " "30 minutes."); } - if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS_TESTING) { + if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) { REJECT("TestingV3AuthInitialVoteDelay is way too low."); } - if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS_TESTING) { + if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) { REJECT("TestingV3AuthInitialDistDelay is way too low."); } if (options->TestingV3AuthInitialVoteDelay + options->TestingV3AuthInitialDistDelay >= - options->TestingV3AuthInitialVotingInterval) { + options->TestingV3AuthInitialVotingInterval/2) { REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay " - "must be less than TestingV3AuthInitialVotingInterval"); + "must be less than half TestingV3AuthInitialVotingInterval"); } if (options->TestingV3AuthVotingStartOffset > @@ -4377,8 +3428,6 @@ options_validate(or_options_t *old_options, or_options_t *options, options->V3AuthVotingInterval)) { REJECT("TestingV3AuthVotingStartOffset is higher than the voting " "interval."); - } else if (options->TestingV3AuthVotingStartOffset < 0) { - REJECT("TestingV3AuthVotingStartOffset must be non-negative."); } if (options->TestingAuthDirTimeToLearnReachability < 0) { @@ -4406,41 +3455,11 @@ options_validate(or_options_t *old_options, or_options_t *options, } if (options->TestingConsensusMaxDownloadTries < 2) { - REJECT("TestingConsensusMaxDownloadTries must be greater than 2."); + REJECT("TestingConsensusMaxDownloadTries must be greater than 1."); } else if (options->TestingConsensusMaxDownloadTries > 800) { COMPLAIN("TestingConsensusMaxDownloadTries is insanely high."); } - if (options->ClientBootstrapConsensusMaxDownloadTries < 2) { - REJECT("ClientBootstrapConsensusMaxDownloadTries must be greater " - "than 2." - ); - } else if (options->ClientBootstrapConsensusMaxDownloadTries > 800) { - COMPLAIN("ClientBootstrapConsensusMaxDownloadTries is insanely " - "high."); - } - - if (options->ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries - < 2) { - REJECT("ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries must " - "be greater than 2." - ); - } else if ( - options->ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries - > 800) { - COMPLAIN("ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries is " - "insanely high."); - } - - if (options->ClientBootstrapConsensusMaxInProgressTries < 1) { - REJECT("ClientBootstrapConsensusMaxInProgressTries must be greater " - "than 0."); - } else if (options->ClientBootstrapConsensusMaxInProgressTries - > 100) { - COMPLAIN("ClientBootstrapConsensusMaxInProgressTries is insanely " - "high."); - } - if (options->TestingDescriptorMaxDownloadTries < 2) { REJECT("TestingDescriptorMaxDownloadTries must be greater than 1."); } else if (options->TestingDescriptorMaxDownloadTries > 800) { @@ -4505,123 +3524,10 @@ options_validate(or_options_t *old_options, or_options_t *options, REJECT("BridgeRelay is 1, ORPort is not set. This is an invalid " "combination."); - if (options_validate_scheduler(options, msg) < 0) { - return -1; - } - return 0; -} - #undef REJECT #undef COMPLAIN - -/* Given the value that the user has set for MaxMemInQueues, compute the - * actual maximum value. We clip this value if it's too low, and autodetect - * it if it's set to 0. */ -static uint64_t -compute_real_max_mem_in_queues(const uint64_t val, int log_guess) -{ - uint64_t result; - - if (val == 0) { -#define ONE_GIGABYTE (U64_LITERAL(1) << 30) -#define ONE_MEGABYTE (U64_LITERAL(1) << 20) -#if SIZEOF_VOID_P >= 8 -#define MAX_DEFAULT_MAXMEM (8*ONE_GIGABYTE) -#else -#define MAX_DEFAULT_MAXMEM (2*ONE_GIGABYTE) -#endif - /* The user didn't pick a memory limit. Choose a very large one - * that is still smaller than the system memory */ - static int notice_sent = 0; - size_t ram = 0; - if (get_total_system_memory(&ram) < 0) { - /* We couldn't determine our total system memory! */ -#if SIZEOF_VOID_P >= 8 - /* 64-bit system. Let's hope for 8 GB. */ - result = 8 * ONE_GIGABYTE; -#else - /* (presumably) 32-bit system. Let's hope for 1 GB. */ - result = ONE_GIGABYTE; -#endif /* SIZEOF_VOID_P >= 8 */ - } else { - /* We detected it, so let's pick 3/4 of the total RAM as our limit. */ - const uint64_t avail = (ram / 4) * 3; - - /* Make sure it's in range from 0.25 GB to 8 GB. */ - if (avail > MAX_DEFAULT_MAXMEM) { - /* If you want to use more than this much RAM, you need to configure - it yourself */ - result = MAX_DEFAULT_MAXMEM; - } else if (avail < ONE_GIGABYTE / 4) { - result = ONE_GIGABYTE / 4; - } else { - result = avail; - } - } - if (log_guess && ! notice_sent) { - log_notice(LD_CONFIG, "%sMaxMemInQueues is set to "U64_FORMAT" MB. " - "You can override this by setting MaxMemInQueues by hand.", - ram ? "Based on detected system memory, " : "", - U64_PRINTF_ARG(result / ONE_MEGABYTE)); - notice_sent = 1; - } - return result; - } else if (val < ONE_GIGABYTE / 4) { - log_warn(LD_CONFIG, "MaxMemInQueues must be at least 256 MB for now. " - "Ideally, have it as large as you can afford."); - return ONE_GIGABYTE / 4; - } else { - /* The value was fine all along */ - return val; - } -} - -/* If we have less than 300 MB suggest disabling dircache */ -#define DIRCACHE_MIN_MEM_MB 300 -#define DIRCACHE_MIN_MEM_BYTES (DIRCACHE_MIN_MEM_MB*ONE_MEGABYTE) -#define STRINGIFY(val) #val - -/** Create a warning message for emitting if we are a dircache but may not have - * enough system memory, or if we are not a dircache but probably should be. - * Return -1 when a message is returned in *msg*, else return 0. */ -STATIC int -have_enough_mem_for_dircache(const or_options_t *options, size_t total_mem, - char **msg) -{ - *msg = NULL; - /* XXX We should possibly be looking at MaxMemInQueues here - * unconditionally. Or we should believe total_mem unconditionally. */ - if (total_mem == 0) { - if (get_total_system_memory(&total_mem) < 0) { - total_mem = options->MaxMemInQueues >= SIZE_MAX ? - SIZE_MAX : (size_t)options->MaxMemInQueues; - } - } - if (options->DirCache) { - if (total_mem < DIRCACHE_MIN_MEM_BYTES) { - if (options->BridgeRelay) { - *msg = tor_strdup("Running a Bridge with less than " - STRINGIFY(DIRCACHE_MIN_MEM_MB) " MB of memory is not " - "recommended."); - } else { - *msg = tor_strdup("Being a directory cache (default) with less than " - STRINGIFY(DIRCACHE_MIN_MEM_MB) " MB of memory is not " - "recommended and may consume most of the available " - "resources, consider disabling this functionality by " - "setting the DirCache option to 0."); - } - } - } else { - if (total_mem >= DIRCACHE_MIN_MEM_BYTES) { - *msg = tor_strdup("DirCache is disabled and we are configured as a " - "relay. This may disqualify us from becoming a guard in the " - "future."); - } - } - return *msg == NULL ? 0 : -1; } -#undef STRINGIFY /** Helper: return true iff s1 and s2 are both NULL, or both non-NULL * equal strings. */ @@ -4651,12 +3557,6 @@ options_transition_allowed(const or_options_t *old, return -1; } - if (old->Sandbox != new_val->Sandbox) { - *msg = tor_strdup("While Tor is running, changing Sandbox " - "is not allowed."); - return -1; - } - if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) { tor_asprintf(msg, "While Tor is running, changing DataDirectory " @@ -4665,45 +3565,11 @@ options_transition_allowed(const or_options_t *old, return -1; } - if (!opt_streq(old->KeyDirectory, new_val->KeyDirectory)) { - tor_asprintf(msg, - "While Tor is running, changing KeyDirectory " - "(\"%s\"->\"%s\") is not allowed.", - old->KeyDirectory, new_val->KeyDirectory); - return -1; - } - - if (!opt_streq(old->CacheDirectory, new_val->CacheDirectory)) { - tor_asprintf(msg, - "While Tor is running, changing CacheDirectory " - "(\"%s\"->\"%s\") is not allowed.", - old->CacheDirectory, new_val->CacheDirectory); - return -1; - } - if (!opt_streq(old->User, new_val->User)) { *msg = tor_strdup("While Tor is running, changing User is not allowed."); return -1; } - if (old->KeepBindCapabilities != new_val->KeepBindCapabilities) { - *msg = tor_strdup("While Tor is running, changing KeepBindCapabilities is " - "not allowed."); - return -1; - } - - if (!opt_streq(old->SyslogIdentityTag, new_val->SyslogIdentityTag)) { - *msg = tor_strdup("While Tor is running, changing " - "SyslogIdentityTag is not allowed."); - return -1; - } - - if (!opt_streq(old->AndroidIdentityTag, new_val->AndroidIdentityTag)) { - *msg = tor_strdup("While Tor is running, changing " - "AndroidIdentityTag is not allowed."); - return -1; - } - if ((old->HardwareAccel != new_val->HardwareAccel) || !opt_streq(old->AccelName, new_val->AccelName) || !opt_streq(old->AccelDir, new_val->AccelDir)) { @@ -4730,16 +3596,9 @@ options_transition_allowed(const or_options_t *old, return -1; } - if (old->HiddenServiceSingleHopMode != new_val->HiddenServiceSingleHopMode) { - *msg = tor_strdup("While Tor is running, changing " - "HiddenServiceSingleHopMode is not allowed."); - return -1; - } - - if (old->HiddenServiceNonAnonymousMode != - new_val->HiddenServiceNonAnonymousMode) { - *msg = tor_strdup("While Tor is running, changing " - "HiddenServiceNonAnonymousMode is not allowed."); + if (old->DisableIOCP != new_val->DisableIOCP) { + *msg = tor_strdup("While Tor is running, changing DisableIOCP " + "is not allowed."); return -1; } @@ -4750,50 +3609,6 @@ options_transition_allowed(const or_options_t *old, return -1; } - if (old->NoExec && !new_val->NoExec) { - *msg = tor_strdup("While Tor is running, disabling " - "NoExec is not allowed."); - return -1; - } - - if (old->OwningControllerFD != new_val->OwningControllerFD) { - *msg = tor_strdup("While Tor is running, changing OwningControllerFD " - "is not allowed."); - return -1; - } - - if (sandbox_is_active()) { -#define SB_NOCHANGE_STR(opt) \ - do { \ - if (! opt_streq(old->opt, new_val->opt)) { \ - *msg = tor_strdup("Can't change " #opt " while Sandbox is active"); \ - return -1; \ - } \ - } while (0) - - SB_NOCHANGE_STR(Address); - SB_NOCHANGE_STR(ServerDNSResolvConfFile); - SB_NOCHANGE_STR(DirPortFrontPage); - SB_NOCHANGE_STR(CookieAuthFile); - SB_NOCHANGE_STR(ExtORPortCookieAuthFile); - -#undef SB_NOCHANGE_STR - - if (! config_lines_eq(old->Logs, new_val->Logs)) { - *msg = tor_strdup("Can't change Logs while Sandbox is active"); - return -1; - } - if (old->ConnLimit != new_val->ConnLimit) { - *msg = tor_strdup("Can't change ConnLimit while Sandbox is active"); - return -1; - } - if (server_mode(old) != server_mode(new_val)) { - *msg = tor_strdup("Can't start/stop being a server while " - "Sandbox is active"); - return -1; - } - } - return 0; } @@ -4810,7 +3625,6 @@ options_transition_affects_workers(const or_options_t *old_options, new_options->ServerDNSSearchDomains || old_options->SafeLogging_ != new_options->SafeLogging_ || old_options->ClientOnly != new_options->ClientOnly || - server_mode(old_options) != server_mode(new_options) || public_server_mode(old_options) != public_server_mode(new_options) || !config_lines_eq(old_options->Logs, new_options->Logs) || old_options->LogMessageDomains != new_options->LogMessageDomains) @@ -4834,11 +3648,8 @@ options_transition_affects_descriptor(const or_options_t *old_options, !opt_streq(old_options->Nickname,new_options->Nickname) || !opt_streq(old_options->Address,new_options->Address) || !config_lines_eq(old_options->ExitPolicy,new_options->ExitPolicy) || - old_options->ExitRelay != new_options->ExitRelay || old_options->ExitPolicyRejectPrivate != new_options->ExitPolicyRejectPrivate || - old_options->ExitPolicyRejectLocalInterfaces != - new_options->ExitPolicyRejectLocalInterfaces || old_options->IPv6Exit != new_options->IPv6Exit || !config_lines_eq(old_options->ORPort_lines, new_options->ORPort_lines) || @@ -4852,15 +3663,10 @@ options_transition_affects_descriptor(const or_options_t *old_options, get_effective_bwburst(old_options) != get_effective_bwburst(new_options) || !opt_streq(old_options->ContactInfo, new_options->ContactInfo) || - !opt_streq(old_options->BridgeDistribution, - new_options->BridgeDistribution) || - !config_lines_eq(old_options->MyFamily, new_options->MyFamily) || + !opt_streq(old_options->MyFamily, new_options->MyFamily) || !opt_streq(old_options->AccountingStart, new_options->AccountingStart) || old_options->AccountingMax != new_options->AccountingMax || - old_options->AccountingRule != new_options->AccountingRule || - public_server_mode(old_options) != public_server_mode(new_options) || - old_options->DirCache != new_options->DirCache || - old_options->AssumeReachable != new_options->AssumeReachable) + public_server_mode(old_options) != public_server_mode(new_options)) return 1; return 0; @@ -4907,7 +3713,7 @@ get_windows_conf_root(void) path[sizeof(path)-1] = '\0'; #else strlcpy(path,tpath,sizeof(path)); -#endif /* defined(UNICODE) */ +#endif /* Now we need to free the memory that the path-idl was stored in. In * typical Windows fashion, we can't just call 'free()' on it. */ @@ -4923,17 +3729,14 @@ get_windows_conf_root(void) is_set = 1; return path; } -#endif /* defined(_WIN32) */ +#endif /** Return the default location for our torrc file (if defaults_file is * false), or for the torrc-defaults file (if defaults_file is true). */ static const char * get_default_conf_file(int defaults_file) { -#ifdef DISABLE_SYSTEM_TORRC - (void) defaults_file; - return NULL; -#elif defined(_WIN32) +#ifdef _WIN32 if (defaults_file) { static char defaults_path[MAX_PATH+1]; tor_snprintf(defaults_path, MAX_PATH, "%s\\torrc-defaults", @@ -4947,39 +3750,30 @@ get_default_conf_file(int defaults_file) } #else return defaults_file ? CONFDIR "/torrc-defaults" : CONFDIR "/torrc"; -#endif /* defined(DISABLE_SYSTEM_TORRC) || ... */ +#endif } -/** Verify whether lst is a list of strings containing valid-looking - * comma-separated nicknames, or NULL. Will normalise lst to prefix '$' - * to any nickname or fingerprint that needs it. Also splits comma-separated - * list elements into multiple elements. Return 0 on success. +/** Verify whether lst is a string containing valid-looking comma-separated + * nicknames, or NULL. Will normalise lst to prefix '$' to any nickname + * or fingerprint that needs it. Return 0 on success. * Warn and return -1 on failure. */ static int -normalize_nickname_list(config_line_t **normalized_out, - const config_line_t *lst, const char *name, - char **msg) +check_nickname_list(char **lst, const char *name, char **msg) { - if (!lst) - return 0; + int r = 0; + smartlist_t *sl; + int changes = 0; - config_line_t *new_nicknames = NULL; - config_line_t **new_nicknames_next = &new_nicknames; + if (!*lst) + return 0; + sl = smartlist_new(); - const config_line_t *cl; - for (cl = lst; cl; cl = cl->next) { - const char *line = cl->value; - if (!line) - continue; + smartlist_split_string(sl, *lst, ",", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0); - int valid_line = 1; - smartlist_t *sl = smartlist_new(); - smartlist_split_string(sl, line, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0); - SMARTLIST_FOREACH_BEGIN(sl, char *, s) + SMARTLIST_FOREACH_BEGIN(sl, char *, s) { - char *normalized = NULL; if (!is_legal_nickname_or_hexdigest(s)) { // check if first char is dollar if (s[0] != '$') { @@ -4988,45 +3782,36 @@ normalize_nickname_list(config_line_t **normalized_out, tor_asprintf(&prepended, "$%s", s); if (is_legal_nickname_or_hexdigest(prepended)) { - // The nickname is valid when it's prepended, set it as the - // normalized version - normalized = prepended; - } else { - // Still not valid, free and fallback to error message - tor_free(prepended); + // The nickname is valid when it's prepended, swap the current + // version with a prepended one + tor_free(s); + SMARTLIST_REPLACE_CURRENT(sl, s, prepended); + changes = 1; + continue; } - } - if (!normalized) { - tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name); - valid_line = 0; - break; + // Still not valid, free and fallback to error message + tor_free(prepended); } - } else { - normalized = tor_strdup(s); - } - config_line_t *next = tor_malloc_zero(sizeof(*next)); - next->key = tor_strdup(cl->key); - next->value = normalized; - next->next = NULL; - - *new_nicknames_next = next; - new_nicknames_next = &next->next; - } SMARTLIST_FOREACH_END(s); - - SMARTLIST_FOREACH(sl, char *, s, tor_free(s)); - smartlist_free(sl); - - if (!valid_line) { - config_free_lines(new_nicknames); - return -1; + tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name); + r = -1; + break; + } } + SMARTLIST_FOREACH_END(s); + + // Replace the caller's nickname list with a fixed one + if (changes && r == 0) { + char *newNicknames = smartlist_join_strings(sl, ", ", 0, NULL); + tor_free(*lst); + *lst = newNicknames; } - *normalized_out = new_nicknames; + SMARTLIST_FOREACH(sl, char *, s, tor_free(s)); + smartlist_free(sl); - return 0; + return r; } /** Learn config file name from command line arguments, or use the default. @@ -5078,45 +3863,27 @@ find_torrc_filename(config_line_t *cmd_arg, if (*using_default_fname) { /* didn't find one, try CONFDIR */ const char *dflt = get_default_conf_file(defaults_file); - file_status_t st = file_status(dflt); - if (dflt && (st == FN_FILE || st == FN_EMPTY)) { + if (dflt && file_status(dflt) == FN_FILE) { fname = tor_strdup(dflt); } else { #ifndef _WIN32 char *fn = NULL; - if (!defaults_file) { + if (!defaults_file) fn = expand_filename("~/.torrc"); - } - if (fn) { - file_status_t hmst = file_status(fn); - if (hmst == FN_FILE || hmst == FN_EMPTY || dflt == NULL) { - fname = fn; - } else { - tor_free(fn); - fname = tor_strdup(dflt); - } + if (fn && file_status(fn) == FN_FILE) { + fname = fn; } else { - fname = dflt ? tor_strdup(dflt) : NULL; + tor_free(fn); + fname = tor_strdup(dflt); } -#else /* !(!defined(_WIN32)) */ - fname = dflt ? tor_strdup(dflt) : NULL; -#endif /* !defined(_WIN32) */ +#else + fname = tor_strdup(dflt); +#endif } } return fname; } -/** Read the torrc from standard input and return it as a string. - * Upon failure, return NULL. - */ -static char * -load_torrc_from_stdin(void) -{ - size_t sz_out; - - return read_file_to_str_until_eof(STDIN_FILENO,SIZE_MAX,&sz_out); -} - /** Load a configuration file from disk, setting torrc_fname or * torrc_defaults_fname if successful. * @@ -5133,20 +3900,16 @@ load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file) int ignore_missing_torrc = 0; char **fname_var = defaults_file ? &torrc_defaults_fname : &torrc_fname; - if (*fname_var == NULL) { - fname = find_torrc_filename(cmd_arg, defaults_file, - &using_default_torrc, &ignore_missing_torrc); - tor_free(*fname_var); - *fname_var = fname; - } else { - fname = *fname_var; - } - log_debug(LD_CONFIG, "Opening config file \"%s\"", fname?fname:""); + fname = find_torrc_filename(cmd_arg, defaults_file, + &using_default_torrc, &ignore_missing_torrc); + tor_assert(fname); + log_debug(LD_CONFIG, "Opening config file \"%s\"", fname); + + tor_free(*fname_var); + *fname_var = fname; /* Open config file */ - file_status_t st = fname ? file_status(fname) : FN_EMPTY; - if (fname == NULL || - !(st == FN_FILE || st == FN_EMPTY) || + if (file_status(fname) != FN_FILE || !(cf = read_file_to_str(fname,0,NULL))) { if (using_default_torrc == 1 || ignore_missing_torrc) { if (!defaults_file) @@ -5174,8 +3937,7 @@ load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file) /** Read a configuration file into options, finding the configuration * file location based on the command line. After loading the file * call options_init_from_string() to load the config. - * Return 0 if success, -1 if failure, and 1 if we succeeded but should exit - * anyway. */ + * Return 0 if success, -1 if failure. */ int options_init_from_torrc(int argc, char **argv) { @@ -5202,22 +3964,24 @@ options_init_from_torrc(int argc, char **argv) if (config_line_find(cmdline_only_options, "-h") || config_line_find(cmdline_only_options, "--help")) { print_usage(); - return 1; + exit(0); } if (config_line_find(cmdline_only_options, "--list-torrc-options")) { - /* For validating whether we've documented everything. */ + /* For documenting validating whether we've documented everything. */ list_torrc_options(); - return 1; - } - if (config_line_find(cmdline_only_options, "--list-deprecated-options")) { - /* For validating whether what we have deprecated really exists. */ - list_deprecated_options(); - return 1; + exit(0); } if (config_line_find(cmdline_only_options, "--version")) { printf("Tor version %s.\n",get_version()); - return 1; + exit(0); + } + + if (config_line_find(cmdline_only_options, "--digests")) { + printf("Tor version %s.\n",get_version()); + printf("%s", libor_get_digests()); + printf("%s", tor_get_digests()); + exit(0); } if (config_line_find(cmdline_only_options, "--library-versions")) { @@ -5229,33 +3993,16 @@ options_init_from_torrc(int argc, char **argv) printf("OpenSSL \t\t%-15s\t\t%s\n", crypto_openssl_get_header_version_str(), crypto_openssl_get_version_str()); - if (tor_compress_supports_method(ZLIB_METHOD)) { - printf("Zlib \t\t%-15s\t\t%s\n", - tor_compress_version_str(ZLIB_METHOD), - tor_compress_header_version_str(ZLIB_METHOD)); - } - if (tor_compress_supports_method(LZMA_METHOD)) { - printf("Liblzma \t\t%-15s\t\t%s\n", - tor_compress_version_str(LZMA_METHOD), - tor_compress_header_version_str(LZMA_METHOD)); - } - if (tor_compress_supports_method(ZSTD_METHOD)) { - printf("Libzstd \t\t%-15s\t\t%s\n", - tor_compress_version_str(ZSTD_METHOD), - tor_compress_header_version_str(ZSTD_METHOD)); - } + printf("Zlib \t\t%-15s\t\t%s\n", + tor_zlib_get_header_version_str(), + tor_zlib_get_version_str()); //TODO: Hex versions? - return 1; + exit(0); } command = CMD_RUN_TOR; for (p_index = cmdline_only_options; p_index; p_index = p_index->next) { - if (!strcmp(p_index->key,"--keygen")) { - command = CMD_KEYGEN; - } else if (!strcmp(p_index->key, "--key-expiration")) { - command = CMD_KEY_EXPIRATION; - command_arg = p_index->value; - } else if (!strcmp(p_index->key,"--list-fingerprint")) { + if (!strcmp(p_index->key,"--list-fingerprint")) { command = CMD_LIST_FINGERPRINT; } else if (!strcmp(p_index->key, "--hash-password")) { command = CMD_HASH_PASSWORD; @@ -5273,19 +4020,7 @@ options_init_from_torrc(int argc, char **argv) cf = tor_strdup(""); } else { cf_defaults = load_torrc_from_disk(cmdline_only_options, 1); - - const config_line_t *f_line = config_line_find(cmdline_only_options, - "-f"); - - const int read_torrc_from_stdin = - (f_line != NULL && strcmp(f_line->value, "-") == 0); - - if (read_torrc_from_stdin) { - cf = load_torrc_from_stdin(); - } else { - cf = load_torrc_from_disk(cmdline_only_options, 0); - } - + cf = load_torrc_from_disk(cmdline_only_options, 0); if (!cf) { if (config_line_find(cmdline_only_options, "--allow-missing-torrc")) { cf = tor_strdup(""); @@ -5298,71 +4033,6 @@ options_init_from_torrc(int argc, char **argv) retval = options_init_from_string(cf_defaults, cf, command, command_arg, &errmsg); - if (retval < 0) - goto err; - - if (config_line_find(cmdline_only_options, "--no-passphrase")) { - if (command == CMD_KEYGEN) { - get_options_mutable()->keygen_force_passphrase = FORCE_PASSPHRASE_OFF; - } else { - log_err(LD_CONFIG, "--no-passphrase specified without --keygen!"); - retval = -1; - goto err; - } - } - - if (config_line_find(cmdline_only_options, "--newpass")) { - if (command == CMD_KEYGEN) { - get_options_mutable()->change_key_passphrase = 1; - } else { - log_err(LD_CONFIG, "--newpass specified without --keygen!"); - retval = -1; - goto err; - } - } - - { - const config_line_t *fd_line = config_line_find(cmdline_only_options, - "--passphrase-fd"); - if (fd_line) { - if (get_options()->keygen_force_passphrase == FORCE_PASSPHRASE_OFF) { - log_err(LD_CONFIG, "--no-passphrase specified with --passphrase-fd!"); - retval = -1; - goto err; - } else if (command != CMD_KEYGEN) { - log_err(LD_CONFIG, "--passphrase-fd specified without --keygen!"); - retval = -1; - goto err; - } else { - const char *v = fd_line->value; - int ok = 1; - long fd = tor_parse_long(v, 10, 0, INT_MAX, &ok, NULL); - if (fd < 0 || ok == 0) { - log_err(LD_CONFIG, "Invalid --passphrase-fd value %s", escaped(v)); - retval = -1; - goto err; - } - get_options_mutable()->keygen_passphrase_fd = (int)fd; - get_options_mutable()->use_keygen_passphrase_fd = 1; - get_options_mutable()->keygen_force_passphrase = FORCE_PASSPHRASE_ON; - } - } - } - - { - const config_line_t *key_line = config_line_find(cmdline_only_options, - "--master-key"); - if (key_line) { - if (command != CMD_KEYGEN) { - log_err(LD_CONFIG, "--master-key without --keygen!"); - retval = -1; - goto err; - } else { - get_options_mutable()->master_key_fname = tor_strdup(key_line->value); - } - } - } - err: tor_free(cf); @@ -5390,9 +4060,8 @@ options_init_from_string(const char *cf_defaults, const char *cf, { or_options_t *oldoptions, *newoptions, *newdefaultoptions=NULL; config_line_t *cl; - int retval; + int retval, i; setopt_err_t err = SETOPT_ERR_MISC; - int cf_has_include = 0; tor_assert(msg); oldoptions = global_options; /* get_options unfortunately asserts if @@ -5404,22 +4073,17 @@ options_init_from_string(const char *cf_defaults, const char *cf, newoptions->command = command; newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL; - smartlist_t *opened_files = smartlist_new(); - for (int i = 0; i < 2; ++i) { + for (i = 0; i < 2; ++i) { const char *body = i==0 ? cf_defaults : cf; if (!body) continue; - /* get config lines, assign them */ - retval = config_get_lines_include(body, &cl, 1, - body == cf ? &cf_has_include : NULL, - opened_files); + retval = config_get_lines(body, &cl, 1); if (retval < 0) { err = SETOPT_ERR_PARSE; goto err; } - retval = config_assign(&options_format, newoptions, cl, - CAL_WARN_DEPRECATIONS, msg); + retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); config_free_lines(cl); if (retval < 0) { err = SETOPT_ERR_PARSE; @@ -5435,15 +4099,12 @@ options_init_from_string(const char *cf_defaults, const char *cf, /* Go through command-line variables too */ retval = config_assign(&options_format, newoptions, - global_cmdline_options, CAL_WARN_DEPRECATIONS, msg); + global_cmdline_options, 0, 0, msg); if (retval < 0) { err = SETOPT_ERR_PARSE; goto err; } - newoptions->IncludeUsed = cf_has_include; - newoptions->FilesOpenedByIncludes = opened_files; - /* If this is a testing network configuration, change defaults * for a list of dependent config options, re-initialize newoptions * with the new defaults, and assign all options to it second time. */ @@ -5456,24 +4117,19 @@ options_init_from_string(const char *cf_defaults, const char *cf, * let's clean it up. -NM */ /* Change defaults. */ - for (int i = 0; testing_tor_network_defaults[i].name; ++i) { + int i; + for (i = 0; testing_tor_network_defaults[i].name; ++i) { const config_var_t *new_var = &testing_tor_network_defaults[i]; config_var_t *old_var = config_find_option_mutable(&options_format, new_var->name); tor_assert(new_var); tor_assert(old_var); old_var->initvalue = new_var->initvalue; - - if ((config_find_deprecation(&options_format, new_var->name))) { - log_warn(LD_GENERAL, "Testing options override the deprecated " - "option %s. Is that intentional?", - new_var->name); - } } /* Clear newoptions and re-initialize them with new defaults. */ - or_options_free(newoptions); - or_options_free(newdefaultoptions); + config_free(&options_format, newoptions); + config_free(&options_format, newdefaultoptions); newdefaultoptions = NULL; newoptions = tor_malloc_zero(sizeof(or_options_t)); newoptions->magic_ = OR_OPTIONS_MAGIC; @@ -5482,21 +4138,17 @@ options_init_from_string(const char *cf_defaults, const char *cf, newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL; /* Assign all options a second time. */ - opened_files = smartlist_new(); - for (int i = 0; i < 2; ++i) { + for (i = 0; i < 2; ++i) { const char *body = i==0 ? cf_defaults : cf; if (!body) continue; - /* get config lines, assign them */ - retval = config_get_lines_include(body, &cl, 1, - body == cf ? &cf_has_include : NULL, - opened_files); + retval = config_get_lines(body, &cl, 1); if (retval < 0) { err = SETOPT_ERR_PARSE; goto err; } - retval = config_assign(&options_format, newoptions, cl, 0, msg); + retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); config_free_lines(cl); if (retval < 0) { err = SETOPT_ERR_PARSE; @@ -5507,17 +4159,13 @@ options_init_from_string(const char *cf_defaults, const char *cf, } /* Assign command-line variables a second time too */ retval = config_assign(&options_format, newoptions, - global_cmdline_options, 0, msg); + global_cmdline_options, 0, 0, msg); if (retval < 0) { err = SETOPT_ERR_PARSE; goto err; } } - newoptions->IncludeUsed = cf_has_include; - in_option_validation = 1; - newoptions->FilesOpenedByIncludes = opened_files; - /* Validate newoptions */ if (options_validate(oldoptions, newoptions, newdefaultoptions, 0, msg) < 0) { @@ -5529,28 +4177,19 @@ options_init_from_string(const char *cf_defaults, const char *cf, err = SETOPT_ERR_TRANSITION; goto err; } - in_option_validation = 0; if (set_options(newoptions, msg)) { err = SETOPT_ERR_SETTING; goto err; /* frees and replaces old options */ } - - or_options_free(global_default_options); + config_free(&options_format, global_default_options); global_default_options = newdefaultoptions; return SETOPT_OK; err: - in_option_validation = 0; - if (opened_files) { - SMARTLIST_FOREACH(opened_files, char *, f, tor_free(f)); - smartlist_free(opened_files); - } - // may have been set to opened_files, avoid double free - newoptions->FilesOpenedByIncludes = NULL; - or_options_free(newoptions); - or_options_free(newdefaultoptions); + config_free(&options_format, newoptions); + config_free(&options_format, newdefaultoptions); if (*msg) { char *old_msg = *msg; tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg); @@ -5559,7 +4198,7 @@ options_init_from_string(const char *cf_defaults, const char *cf, return err; } -/** Return the location for our configuration file. May return NULL. +/** Return the location for our configuration file. */ const char * get_torrc_fname(int defaults_fname) @@ -5620,7 +4259,7 @@ config_register_addressmaps(const or_options_t *options) /** As addressmap_register(), but detect the wildcarded status of "from" and * "to", and do not steal a reference to to. */ -/* XXXX move to connection_edge.c */ +/* XXXX024 move to connection_edge.c */ int addressmap_register_auto(const char *from, const char *to, time_t expires, @@ -5630,35 +4269,35 @@ addressmap_register_auto(const char *from, const char *to, int from_wildcard = 0, to_wildcard = 0; *msg = "whoops, forgot the error message"; + if (1) { + if (!strcmp(to, "*") || !strcmp(from, "*")) { + *msg = "can't remap from or to *"; + return -1; + } + /* Detect asterisks in expressions of type: '*.example.com' */ + if (!strncmp(from,"*.",2)) { + from += 2; + from_wildcard = 1; + } + if (!strncmp(to,"*.",2)) { + to += 2; + to_wildcard = 1; + } - if (!strcmp(to, "*") || !strcmp(from, "*")) { - *msg = "can't remap from or to *"; - return -1; - } - /* Detect asterisks in expressions of type: '*.example.com' */ - if (!strncmp(from,"*.",2)) { - from += 2; - from_wildcard = 1; - } - if (!strncmp(to,"*.",2)) { - to += 2; - to_wildcard = 1; - } + if (to_wildcard && !from_wildcard) { + *msg = "can only use wildcard (i.e. '*.') if 'from' address " + "uses wildcard also"; + return -1; + } - if (to_wildcard && !from_wildcard) { - *msg = "can only use wildcard (i.e. '*.') if 'from' address " - "uses wildcard also"; - return -1; - } + if (address_is_invalid_destination(to, 1)) { + *msg = "destination is invalid"; + return -1; + } - if (address_is_invalid_destination(to, 1)) { - *msg = "destination is invalid"; - return -1; + addressmap_register(from, tor_strdup(to), expires, addrmap_source, + from_wildcard, to_wildcard); } - - addressmap_register(from, tor_strdup(to), expires, addrmap_source, - from_wildcard, to_wildcard); - return 0; } @@ -5666,13 +4305,12 @@ addressmap_register_auto(const char *from, const char *to, * Initialize the logs based on the configuration file. */ static int -options_init_logs(const or_options_t *old_options, or_options_t *options, - int validate_only) +options_init_logs(or_options_t *options, int validate_only) { config_line_t *opt; int ok; smartlist_t *elts; - int run_as_daemon = + int daemon = #ifdef _WIN32 0; #else @@ -5725,7 +4363,7 @@ options_init_logs(const or_options_t *old_options, or_options_t *options, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); if (smartlist_len(elts) == 0) - smartlist_add_strdup(elts, "stdout"); + smartlist_add(elts, tor_strdup("stdout")); if (smartlist_len(elts) == 1 && (!strcasecmp(smartlist_get(elts,0), "stdout") || @@ -5733,7 +4371,7 @@ options_init_logs(const or_options_t *old_options, or_options_t *options, int err = smartlist_len(elts) && !strcasecmp(smartlist_get(elts,0), "stderr"); if (!validate_only) { - if (run_as_daemon) { + if (daemon) { log_warn(LD_CONFIG, "Can't log to %s with RunAsDaemon set; skipping stdout", err?"stderr":"stdout"); @@ -5744,50 +4382,23 @@ options_init_logs(const or_options_t *old_options, or_options_t *options, } goto cleanup; } - if (smartlist_len(elts) == 1) { - if (!strcasecmp(smartlist_get(elts,0), "syslog")) { + if (smartlist_len(elts) == 1 && + !strcasecmp(smartlist_get(elts,0), "syslog")) { #ifdef HAVE_SYSLOG_H - if (!validate_only) { - add_syslog_log(severity, options->SyslogIdentityTag); - } -#else - log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry."); -#endif /* defined(HAVE_SYSLOG_H) */ - goto cleanup; + if (!validate_only) { + add_syslog_log(severity); } - - if (!strcasecmp(smartlist_get(elts, 0), "android")) { -#ifdef HAVE_ANDROID_LOG_H - if (!validate_only) { - add_android_log(severity, options->AndroidIdentityTag); - } #else - log_warn(LD_CONFIG, "Android logging is not supported" - " on this system. Sorry."); -#endif // HAVE_ANDROID_LOG_H. - goto cleanup; - } + log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry."); +#endif + goto cleanup; } if (smartlist_len(elts) == 2 && !strcasecmp(smartlist_get(elts,0), "file")) { if (!validate_only) { char *fname = expand_filename(smartlist_get(elts, 1)); - /* Truncate if TruncateLogFile is set and we haven't seen this option - line before. */ - int truncate_log = 0; - if (options->TruncateLogFile) { - truncate_log = 1; - if (old_options) { - config_line_t *opt2; - for (opt2 = old_options->Logs; opt2; opt2 = opt2->next) - if (!strcmp(opt->value, opt2->value)) { - truncate_log = 0; - break; - } - } - } - if (add_file_log(severity, fname, truncate_log) < 0) { + if (add_file_log(severity, fname) < 0) { log_warn(LD_CONFIG, "Couldn't open file for 'Log %s': %s", opt->value, strerror(errno)); ok = 0; @@ -5852,7 +4463,7 @@ validate_transport_socks_arguments(const smartlist_t *args) /** Deallocate a bridge_line_t structure. */ /* private */ void -bridge_line_free_(bridge_line_t *bridge_line) +bridge_line_free(bridge_line_t *bridge_line) { if (!bridge_line) return; @@ -5865,14 +4476,10 @@ bridge_line_free_(bridge_line_t *bridge_line) tor_free(bridge_line); } -/** Parse the contents of a string, line, containing a Bridge line, - * into a bridge_line_t. - * - * Validates that the IP:PORT, fingerprint, and SOCKS arguments (given to the - * Pluggable Transport, if a one was specified) are well-formed. - * - * Returns NULL If the Bridge line could not be validated, and returns a - * bridge_line_t containing the parsed information otherwise. +/** Read the contents of a Bridge line from line. Return 0 + * if the line is well-formed, and -1 if it isn't. If + * validate_only is 0, and the line is well-formed, then add + * the bridge described in the line to our internal bridge list. * * Bridge line format: * Bridge [transport] IP:PORT [id-fingerprint] [k=v] [k=v] ... @@ -5910,11 +4517,18 @@ parse_bridge_line(const char *line) addrport = field; } - if (tor_addr_port_parse(LOG_INFO, addrport, - &bridge_line->addr, &bridge_line->port, 443)<0) { + /* Parse addrport. */ + if (tor_addr_port_lookup(addrport, + &bridge_line->addr, &bridge_line->port)<0) { log_warn(LD_CONFIG, "Error parsing Bridge address '%s'", addrport); goto err; } + if (!bridge_line->port) { + log_info(LD_CONFIG, + "Bridge address '%s' has no port; using default port 443.", + addrport); + bridge_line->port = 443; + } /* If transports are enabled, next field could be a fingerprint or a socks argument. If transports are disabled, next field must be @@ -5945,7 +4559,7 @@ parse_bridge_line(const char *line) goto err; } if (base16_decode(bridge_line->digest, DIGEST_LEN, - fingerprint, HEX_DIGEST_LEN) != DIGEST_LEN) { + fingerprint, HEX_DIGEST_LEN)<0) { log_warn(LD_CONFIG, "Unable to decode Bridge key digest."); goto err; } @@ -5984,52 +4598,45 @@ parse_bridge_line(const char *line) return bridge_line; } -/** Read the contents of a ClientTransportPlugin or ServerTransportPlugin - * line from line, depending on the value of server. Return 0 - * if the line is well-formed, and -1 if it isn't. +/** Read the contents of a ClientTransportPlugin line from + * line. Return 0 if the line is well-formed, and -1 if it + * isn't. * - * If validate_only is 0, the line is well-formed, and the transport is - * needed by some bridge: + * If validate_only is 0, the line is well-formed, and the + * transport is needed by some bridge: * - If it's an external proxy line, add the transport described in the line to * our internal transport list. - * - If it's a managed proxy line, launch the managed proxy. - */ - -STATIC int -parse_transport_line(const or_options_t *options, - const char *line, int validate_only, - int server) + * - If it's a managed proxy line, launch the managed proxy. */ +static int +parse_client_transport_line(const char *line, int validate_only) { - smartlist_t *items = NULL; int r; - const char *transports = NULL; - smartlist_t *transport_list = NULL; - char *type = NULL; - char *addrport = NULL; + char *field2=NULL; + + const char *transports=NULL; + smartlist_t *transport_list=NULL; + char *addrport=NULL; tor_addr_t addr; uint16_t port = 0; - int socks_ver = PROXY_NONE; + int socks_ver=PROXY_NONE; /* managed proxy options */ - int is_managed = 0; - char **proxy_argv = NULL; - char **tmp = NULL; + int is_managed=0; + char **proxy_argv=NULL; + char **tmp=NULL; int proxy_argc, i; - int is_useless_proxy = 1; + int is_useless_proxy=1; int line_length; - /* Split the line into space-separated tokens */ items = smartlist_new(); smartlist_split_string(items, line, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - line_length = smartlist_len(items); + line_length = smartlist_len(items); if (line_length < 3) { - log_warn(LD_CONFIG, - "Too few arguments on %sTransportPlugin line.", - server ? "Server" : "Client"); + log_warn(LD_CONFIG, "Too few arguments on ClientTransportPlugin line."); goto err; } @@ -6053,106 +4660,58 @@ parse_transport_line(const or_options_t *options, is_useless_proxy = 0; } SMARTLIST_FOREACH_END(transport_name); - type = smartlist_get(items, 1); - if (!strcmp(type, "exec")) { - is_managed = 1; - } else if (server && !strcmp(type, "proxy")) { - /* 'proxy' syntax only with ServerTransportPlugin */ - is_managed = 0; - } else if (!server && !strcmp(type, "socks4")) { - /* 'socks4' syntax only with ClientTransportPlugin */ - is_managed = 0; + /* field2 is either a SOCKS version or "exec" */ + field2 = smartlist_get(items, 1); + + if (!strcmp(field2,"socks4")) { socks_ver = PROXY_SOCKS4; - } else if (!server && !strcmp(type, "socks5")) { - /* 'socks5' syntax only with ClientTransportPlugin */ - is_managed = 0; + } else if (!strcmp(field2,"socks5")) { socks_ver = PROXY_SOCKS5; + } else if (!strcmp(field2,"exec")) { + is_managed=1; } else { - log_warn(LD_CONFIG, - "Strange %sTransportPlugin type '%s'", - server ? "Server" : "Client", type); - goto err; - } - - if (is_managed && options->Sandbox) { - log_warn(LD_CONFIG, - "Managed proxies are not compatible with Sandbox mode." - "(%sTransportPlugin line was %s)", - server ? "Server" : "Client", escaped(line)); + log_warn(LD_CONFIG, "Strange ClientTransportPlugin field '%s'.", + field2); goto err; } - if (is_managed && options->NoExec) { - log_warn(LD_CONFIG, - "Managed proxies are not compatible with NoExec mode; ignoring." - "(%sTransportPlugin line was %s)", - server ? "Server" : "Client", escaped(line)); - r = 0; - goto done; - } - - if (is_managed) { - /* managed */ - - if (!server && !validate_only && is_useless_proxy) { - log_info(LD_GENERAL, - "Pluggable transport proxy (%s) does not provide " - "any needed transports and will not be launched.", - line); + if (is_managed) { /* managed */ + if (!validate_only && is_useless_proxy) { + log_warn(LD_GENERAL, "Pluggable transport proxy (%s) does not provide " + "any needed transports and will not be launched.", line); } - /* - * If we are not just validating, use the rest of the line as the - * argv of the proxy to be launched. Also, make sure that we are - * only launching proxies that contribute useful transports. - */ - - if (!validate_only && (server || !is_useless_proxy)) { - proxy_argc = line_length - 2; + /* If we are not just validating, use the rest of the line as the + argv of the proxy to be launched. Also, make sure that we are + only launching proxies that contribute useful transports. */ + if (!validate_only && !is_useless_proxy) { + proxy_argc = line_length-2; tor_assert(proxy_argc > 0); - proxy_argv = tor_calloc((proxy_argc + 1), sizeof(char *)); + proxy_argv = tor_malloc_zero(sizeof(char*)*(proxy_argc+1)); tmp = proxy_argv; - - for (i = 0; i < proxy_argc; i++) { - /* store arguments */ + for (i=0;iSocks4Proxy || options->Socks5Proxy || - options->HTTPSProxy)) { - log_warn(LD_CONFIG, "You have configured an external proxy with another " - "proxy type. (Socks4Proxy|Socks5Proxy|HTTPSProxy)"); - goto err; + pt_kickstart_client_proxy(transport_list, proxy_argv); } - + } else { /* external */ if (smartlist_len(transport_list) != 1) { - log_warn(LD_CONFIG, - "You can't have an external proxy with more than " - "one transport."); + log_warn(LD_CONFIG, "You can't have an external proxy with " + "more than one transports."); goto err; } addrport = smartlist_get(items, 2); - if (tor_addr_port_lookup(addrport, &addr, &port) < 0) { - log_warn(LD_CONFIG, - "Error parsing transport address '%s'", addrport); + if (tor_addr_port_lookup(addrport, &addr, &port)<0) { + log_warn(LD_CONFIG, "Error parsing transport " + "address '%s'", addrport); goto err; } - if (!port) { log_warn(LD_CONFIG, "Transport address '%s' has no port.", addrport); @@ -6160,15 +4719,11 @@ parse_transport_line(const or_options_t *options, } if (!validate_only) { - log_info(LD_DIR, "%s '%s' at %s.", - server ? "Server transport" : "Transport", - transports, fmt_addrport(&addr, port)); + transport_add_from_config(&addr, port, smartlist_get(transport_list, 0), + socks_ver); - if (!server) { - transport_add_from_config(&addr, port, - smartlist_get(transport_list, 0), - socks_ver); - } + log_info(LD_DIR, "Transport '%s' found at %s", + transports, fmt_addrport(&addr, port)); } } @@ -6224,7 +4779,7 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport) goto err; /* Validate addrport */ - if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port, -1)<0) { + if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port)<0) { log_warn(LD_CONFIG, "Error parsing ServerTransportListenAddr " "address '%s'", addrport); goto err; @@ -6282,7 +4837,7 @@ get_options_from_transport_options_line(const char *line,const char *transport) } /* add it to the options smartlist */ - smartlist_add_strdup(options, option); + smartlist_add(options, tor_strdup(option)); log_debug(LD_CONFIG, "Added %s to the list of options", escaped(option)); } SMARTLIST_FOREACH_END(option); @@ -6340,94 +4895,198 @@ get_options_for_server_transport(const char *transport) return NULL; } -/** Read the contents of a DirAuthority line from line. If - * validate_only is 0, and the line is well-formed, and it - * shares any bits with required_type or required_type - * is NO_DIRINFO (zero), then add the dirserver described in the line - * (minus whatever bits it's missing) as a valid authority. - * Return 0 on success or filtering out by type, - * or -1 if the line isn't well-formed or if we can't add it. */ -STATIC int -parse_dir_authority_line(const char *line, dirinfo_type_t required_type, - int validate_only) +/** Read the contents of a ServerTransportPlugin line from + * line. Return 0 if the line is well-formed, and -1 if it + * isn't. + * If validate_only is 0, the line is well-formed, and it's a + * managed proxy line, launch the managed proxy. */ +static int +parse_server_transport_line(const char *line, int validate_only) { smartlist_t *items = NULL; int r; - char *addrport=NULL, *address=NULL, *nickname=NULL, *fingerprint=NULL; - tor_addr_port_t ipv6_addrport, *ipv6_addrport_ptr = NULL; - uint16_t dir_port = 0, or_port = 0; - char digest[DIGEST_LEN]; - char v3_digest[DIGEST_LEN]; - dirinfo_type_t type = 0; - double weight = 1.0; + const char *transports=NULL; + smartlist_t *transport_list=NULL; + char *type=NULL; + char *addrport=NULL; + tor_addr_t addr; + uint16_t port = 0; - memset(v3_digest, 0, sizeof(v3_digest)); + /* managed proxy options */ + int is_managed=0; + char **proxy_argv=NULL; + char **tmp=NULL; + int proxy_argc,i; + + int line_length; items = smartlist_new(); smartlist_split_string(items, line, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (smartlist_len(items) < 1) { - log_warn(LD_CONFIG, "No arguments on DirAuthority line."); + + line_length = smartlist_len(items); + if (line_length < 3) { + log_warn(LD_CONFIG, "Too few arguments on ServerTransportPlugin line."); goto err; } - if (is_legal_nickname(smartlist_get(items, 0))) { - nickname = smartlist_get(items, 0); - smartlist_del_keeporder(items, 0); + /* Get the first line element, split it to commas into + transport_list (in case it's multiple transports) and validate + the transport names. */ + transports = smartlist_get(items, 0); + transport_list = smartlist_new(); + smartlist_split_string(transport_list, transports, ",", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) { + if (!string_is_C_identifier(transport_name)) { + log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", + transport_name); + goto err; + } + } SMARTLIST_FOREACH_END(transport_name); + + type = smartlist_get(items, 1); + + if (!strcmp(type, "exec")) { + is_managed=1; + } else if (!strcmp(type, "proxy")) { + is_managed=0; + } else { + log_warn(LD_CONFIG, "Strange ServerTransportPlugin type '%s'", type); + goto err; } - while (smartlist_len(items)) { - char *flag = smartlist_get(items, 0); - if (TOR_ISDIGIT(flag[0])) - break; - if (!strcasecmp(flag, "hs") || - !strcasecmp(flag, "no-hs")) { - log_warn(LD_CONFIG, "The DirAuthority options 'hs' and 'no-hs' are " - "obsolete; you don't need them any more."); - } else if (!strcasecmp(flag, "bridge")) { - type |= BRIDGE_DIRINFO; - } else if (!strcasecmp(flag, "no-v2")) { - /* obsolete, but may still be contained in DirAuthority lines generated - by various tools */; - } else if (!strcasecmpstart(flag, "orport=")) { - int ok; - char *portstring = flag + strlen("orport="); - or_port = (uint16_t) tor_parse_long(portstring, 10, 1, 65535, &ok, NULL); - if (!ok) - log_warn(LD_CONFIG, "Invalid orport '%s' on DirAuthority line.", - portstring); - } else if (!strcmpstart(flag, "weight=")) { - int ok; - const char *wstring = flag + strlen("weight="); - weight = tor_parse_double(wstring, 0, (double)UINT64_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Invalid weight '%s' on DirAuthority line.",flag); - weight=1.0; - } - } else if (!strcasecmpstart(flag, "v3ident=")) { - char *idstr = flag + strlen("v3ident="); - if (strlen(idstr) != HEX_DIGEST_LEN || - base16_decode(v3_digest, DIGEST_LEN, - idstr, HEX_DIGEST_LEN) != DIGEST_LEN) { + if (is_managed) { /* managed */ + if (!validate_only) { + proxy_argc = line_length-2; + tor_assert(proxy_argc > 0); + proxy_argv = tor_malloc_zero(sizeof(char*)*(proxy_argc+1)); + tmp = proxy_argv; + + for (i=0;iline. If + * validate_only is 0, and the line is well-formed, and it + * shares any bits with required_type or required_type + * is 0, then add the dirserver described in the line (minus whatever + * bits it's missing) as a valid authority. Return 0 on success, + * or -1 if the line isn't well-formed or if we can't add it. */ +static int +parse_dir_authority_line(const char *line, dirinfo_type_t required_type, + int validate_only) +{ + smartlist_t *items = NULL; + int r; + char *addrport=NULL, *address=NULL, *nickname=NULL, *fingerprint=NULL; + uint16_t dir_port = 0, or_port = 0; + char digest[DIGEST_LEN]; + char v3_digest[DIGEST_LEN]; + dirinfo_type_t type = 0; + int is_not_hidserv_authority = 0; + double weight = 1.0; + + items = smartlist_new(); + smartlist_split_string(items, line, NULL, + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); + if (smartlist_len(items) < 1) { + log_warn(LD_CONFIG, "No arguments on DirAuthority line."); + goto err; + } + + if (is_legal_nickname(smartlist_get(items, 0))) { + nickname = smartlist_get(items, 0); + smartlist_del_keeporder(items, 0); + } + + while (smartlist_len(items)) { + char *flag = smartlist_get(items, 0); + if (TOR_ISDIGIT(flag[0])) + break; + if (!strcasecmp(flag, "v1")) { + type |= (V1_DIRINFO | HIDSERV_DIRINFO); + } else if (!strcasecmp(flag, "hs")) { + type |= HIDSERV_DIRINFO; + } else if (!strcasecmp(flag, "no-hs")) { + is_not_hidserv_authority = 1; + } else if (!strcasecmp(flag, "bridge")) { + type |= BRIDGE_DIRINFO; + } else if (!strcasecmp(flag, "no-v2")) { + /* obsolete, but may still be contained in DirAuthority lines generated + by various tools */; + } else if (!strcasecmpstart(flag, "orport=")) { + int ok; + char *portstring = flag + strlen("orport="); + or_port = (uint16_t) tor_parse_long(portstring, 10, 1, 65535, &ok, NULL); + if (!ok) + log_warn(LD_CONFIG, "Invalid orport '%s' on DirAuthority line.", + portstring); + } else if (!strcmpstart(flag, "weight=")) { + int ok; + const char *wstring = flag + strlen("weight="); + weight = tor_parse_double(wstring, 0, UINT64_MAX, &ok, NULL); + if (!ok) { + log_warn(LD_CONFIG, "Invalid weight '%s' on DirAuthority line.",flag); + weight=1.0; + } + } else if (!strcasecmpstart(flag, "v3ident=")) { + char *idstr = flag + strlen("v3ident="); + if (strlen(idstr) != HEX_DIGEST_LEN || + base16_decode(v3_digest, DIGEST_LEN, idstr, HEX_DIGEST_LEN)<0) { log_warn(LD_CONFIG, "Bad v3 identity digest '%s' on DirAuthority line", flag); } else { type |= V3_DIRINFO|EXTRAINFO_DIRINFO|MICRODESC_DIRINFO; } - } else if (!strcasecmpstart(flag, "ipv6=")) { - if (ipv6_addrport_ptr) { - log_warn(LD_CONFIG, "Redundant ipv6 addr/port on DirAuthority line"); - } else { - if (tor_addr_port_parse(LOG_WARN, flag+strlen("ipv6="), - &ipv6_addrport.addr, &ipv6_addrport.port, - -1) < 0 - || tor_addr_family(&ipv6_addrport.addr) != AF_INET6) { - log_warn(LD_CONFIG, "Bad ipv6 addr/port %s on DirAuthority line", - escaped(flag)); - goto err; - } - ipv6_addrport_ptr = &ipv6_addrport; - } } else { log_warn(LD_CONFIG, "Unrecognized flag '%s' on DirAuthority line", flag); @@ -6435,6 +5094,8 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type, tor_free(flag); smartlist_del_keeporder(items, 0); } + if (is_not_hidserv_authority) + type &= ~HIDSERV_DIRINFO; if (smartlist_len(items) < 2) { log_warn(LD_CONFIG, "Too few arguments to DirAuthority line."); @@ -6457,8 +5118,15 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type, fingerprint, (int)strlen(fingerprint)); goto err; } - if (base16_decode(digest, DIGEST_LEN, - fingerprint, HEX_DIGEST_LEN) != DIGEST_LEN) { + if (!strcmp(fingerprint, "E623F7625FBE0C87820F11EC5F6D5377ED816294")) { + /* a known bad fingerprint. refuse to use it. We can remove this + * clause once Tor 0.1.2.17 is obsolete. */ + log_warn(LD_CONFIG, "Dangerous dirserver line. To correct, erase your " + "torrc file (%s), or reinstall Tor and use the default torrc.", + get_torrc_fname(0)); + goto err; + } + if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) { log_warn(LD_CONFIG, "Unable to decode DirAuthority key digest."); goto err; } @@ -6471,7 +5139,6 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type, log_debug(LD_DIR, "Trusted %d dirserver at %s:%d (%s)", (int)type, address, (int)dir_port, (char*)smartlist_get(items,0)); if (!(ds = trusted_dir_server_new(nickname, address, dir_port, or_port, - ipv6_addrport_ptr, digest, v3_digest, type, weight))) goto err; dir_server_add(ds); @@ -6497,7 +5164,7 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type, * validate_only is 0, and the line is well-formed, then add the * dirserver described in the line as a fallback directory. Return 0 on * success, or -1 if the line isn't well-formed or if we can't add it. */ -int +static int parse_dir_fallback_line(const char *line, int validate_only) { @@ -6509,7 +5176,6 @@ parse_dir_fallback_line(const char *line, int ok; char id[DIGEST_LEN]; char *address=NULL; - tor_addr_port_t ipv6_addrport, *ipv6_addrport_ptr = NULL; double weight=1.0; memset(id, 0, sizeof(id)); @@ -6526,27 +5192,13 @@ parse_dir_fallback_line(const char *line, orport = (int)tor_parse_long(cp+strlen("orport="), 10, 1, 65535, &ok, NULL); } else if (!strcmpstart(cp, "id=")) { - ok = base16_decode(id, DIGEST_LEN, cp+strlen("id="), - strlen(cp)-strlen("id=")) == DIGEST_LEN; - } else if (!strcasecmpstart(cp, "ipv6=")) { - if (ipv6_addrport_ptr) { - log_warn(LD_CONFIG, "Redundant ipv6 addr/port on FallbackDir line"); - } else { - if (tor_addr_port_parse(LOG_WARN, cp+strlen("ipv6="), - &ipv6_addrport.addr, &ipv6_addrport.port, - -1) < 0 - || tor_addr_family(&ipv6_addrport.addr) != AF_INET6) { - log_warn(LD_CONFIG, "Bad ipv6 addr/port %s on FallbackDir line", - escaped(cp)); - goto end; - } - ipv6_addrport_ptr = &ipv6_addrport; - } + ok = !base16_decode(id, DIGEST_LEN, + cp+strlen("id="), strlen(cp)-strlen("id=")); } else if (!strcmpstart(cp, "weight=")) { - int num_ok; + int ok; const char *wstring = cp + strlen("weight="); - weight = tor_parse_double(wstring, 0, (double)UINT64_MAX, &num_ok, NULL); - if (!num_ok) { + weight = tor_parse_double(wstring, 0, UINT64_MAX, &ok, NULL); + if (!ok) { log_warn(LD_CONFIG, "Invalid weight '%s' on FallbackDir line.", cp); weight=1.0; } @@ -6583,8 +5235,7 @@ parse_dir_fallback_line(const char *line, if (!validate_only) { dir_server_t *ds; - ds = fallback_dir_server_new(&addr, dirport, orport, ipv6_addrport_ptr, - id, weight); + ds = fallback_dir_server_new(&addr, dirport, orport, id, weight); if (!ds) { log_warn(LD_CONFIG, "Couldn't create FallbackDir %s", escaped(line)); goto end; @@ -6603,22 +5254,19 @@ parse_dir_fallback_line(const char *line, } /** Allocate and return a new port_cfg_t with reasonable defaults. */ -STATIC port_cfg_t * -port_cfg_new(size_t namelen) +static port_cfg_t * +port_cfg_new(void) { - tor_assert(namelen <= SIZE_T_CEILING - sizeof(port_cfg_t) - 1); - port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t) + namelen + 1); - cfg->entry_cfg.ipv4_traffic = 1; - cfg->entry_cfg.ipv6_traffic = 1; - cfg->entry_cfg.dns_request = 1; - cfg->entry_cfg.onion_traffic = 1; - cfg->entry_cfg.prefer_ipv6_virtaddr = 1; + port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t)); + cfg->ipv4_traffic = 1; + cfg->cache_ipv4_answers = 1; + cfg->prefer_ipv6_virtaddr = 1; return cfg; } /** Free all storage held in port */ -STATIC void -port_cfg_free_(port_cfg_t *port) +static void +port_cfg_free(port_cfg_t *port) { tor_free(port); } @@ -6626,9 +5274,8 @@ port_cfg_free_(port_cfg_t *port) /** Warn for every port in ports of type listener_type that is * on a publicly routable address. */ static void -warn_nonlocal_client_ports(const smartlist_t *ports, - const char *portname, - const int listener_type) +warn_nonlocal_client_ports(const smartlist_t *ports, const char *portname, + int listener_type) { SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { if (port->type != listener_type) @@ -6672,12 +5319,12 @@ warn_nonlocal_ext_orports(const smartlist_t *ports, const char *portname) } SMARTLIST_FOREACH_END(port); } -/** Given a list of port_cfg_t in ports, warn if any controller port - * there is listening on any non-loopback address. If forbid_nonlocal - * is true, then emit a stronger warning and remove the port from the list. +/** Given a list of port_cfg_t in ports, warn any controller port there + * is listening on any non-loopback address. If forbid is true, + * then emit a stronger warning and remove the port from the list. */ static void -warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid_nonlocal) +warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid) { int warned = 0; SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) { @@ -6686,7 +5333,7 @@ warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid_nonlocal) if (port->is_unix_addr) continue; if (!tor_addr_is_loopback(&port->addr)) { - if (forbid_nonlocal) { + if (forbid) { if (!warned) log_warn(LD_CONFIG, "You have a ControlPort set to accept " @@ -6714,143 +5361,39 @@ warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid_nonlocal) } SMARTLIST_FOREACH_END(port); } -/** - * Take a string (line) that begins with either an address:port, a - * port, or an AF_UNIX address, optionally quoted, prefixed with - * "unix:". Parse that line, and on success, set addrport_out to a new - * string containing the beginning portion (without prefix). Iff there was a - * unix: prefix, set is_unix_out to true. On success, also set - * rest_out to point to the part of the line after the address portion. - * - * Return 0 on success, -1 on failure. - */ -int -port_cfg_line_extract_addrport(const char *line, - char **addrport_out, - int *is_unix_out, - const char **rest_out) -{ - tor_assert(line); - tor_assert(addrport_out); - tor_assert(is_unix_out); - tor_assert(rest_out); - - line = eat_whitespace(line); - - if (!strcmpstart(line, unix_q_socket_prefix)) { - // It starts with unix:" - size_t sz; - *is_unix_out = 1; - *addrport_out = NULL; - line += strlen(unix_socket_prefix); /*No q: Keep the quote */ - *rest_out = unescape_string(line, addrport_out, &sz); - if (!*rest_out || (*addrport_out && sz != strlen(*addrport_out))) { - tor_free(*addrport_out); - return -1; - } - *rest_out = eat_whitespace(*rest_out); - return 0; - } else { - // Is there a unix: prefix? - if (!strcmpstart(line, unix_socket_prefix)) { - line += strlen(unix_socket_prefix); - *is_unix_out = 1; - } else { - *is_unix_out = 0; - } - - const char *end = find_whitespace(line); - if (BUG(!end)) { - end = strchr(line, '\0'); // LCOV_EXCL_LINE -- this can't be NULL - } - tor_assert(end && end >= line); - *addrport_out = tor_strndup(line, end - line); - *rest_out = eat_whitespace(end); - return 0; - } -} - -static void -warn_client_dns_cache(const char *option, int disabling) -{ - if (disabling) - return; - - warn_deprecated_option(option, - "Client-side DNS cacheing enables a wide variety of route-" - "capture attacks. If a single bad exit node lies to you about " - "an IP address, cacheing that address would make you visit " - "an address of the attacker's choice every time you connected " - "to your destination."); -} - -/** - * Validate the configured bridge distribution method from a BridgeDistribution - * config line. - * - * The input bd, is a string taken from the BridgeDistribution config - * line (if present). If the option wasn't set, return 0 immediately. The - * BridgeDistribution option is then validated. Currently valid, recognised - * options are: - * - * - "none" - * - "any" - * - "https" - * - "email" - * - "moat" - * - "hyphae" - * - * If the option string is unrecognised, a warning will be logged and 0 is - * returned. If the option string contains an invalid character, -1 is - * returned. - **/ -STATIC int -check_bridge_distribution_setting(const char *bd) -{ - if (bd == NULL) - return 0; - - const char *RECOGNIZED[] = { - "none", "any", "https", "email", "moat", "hyphae" - }; - unsigned i; - for (i = 0; i < ARRAY_LENGTH(RECOGNIZED); ++i) { - if (!strcmp(bd, RECOGNIZED[i])) - return 0; - } - - const char *cp = bd; - // Method = (KeywordChar | "_") + - while (TOR_ISALNUM(*cp) || *cp == '-' || *cp == '_') - ++cp; - - if (*cp == 0) { - log_warn(LD_CONFIG, "Unrecognized BridgeDistribution value %s. I'll " - "assume you know what you are doing...", escaped(bd)); - return 0; // we reached the end of the string; all is well - } else { - return -1; // we found a bad character in the string. - } -} +#define CL_PORT_NO_OPTIONS (1u<<0) +#define CL_PORT_WARN_NONLOCAL (1u<<1) +#define CL_PORT_ALLOW_EXTRA_LISTENADDR (1u<<2) +#define CL_PORT_SERVER_OPTIONS (1u<<3) +#define CL_PORT_FORBID_NONLOCAL (1u<<4) +#define CL_PORT_TAKES_HOSTNAMES (1u<<5) /** * Parse port configuration for a single port type. * - * Read entries of the "FooPort" type from the list ports. Syntax is - * that FooPort can have any number of entries of the format - * "[Address:][Port] IsolationOptions". + * Read entries of the "FooPort" type from the list ports, and + * entries of the "FooListenAddress" type from the list + * listenaddrs. Two syntaxes are supported: a legacy syntax + * where FooPort is at most a single entry containing a port number and + * where FooListenAddress has any number of address:port combinations; + * and a new syntax where there are no FooListenAddress entries and + * where FooPort can have any number of entries of the format + * "[Address:][Port] IsolationOptions". * * In log messages, describe the port type as portname. * * If no address is specified, default to defaultaddr. If no * FooPort is given, default to defaultport (if 0, there is no default). * - * If CL_PORT_NO_STREAM_OPTIONS is set in flags, do not allow stream + * If CL_PORT_NO_OPTIONS is set in flags, do not allow stream * isolation options in the FooPort entries. * * If CL_PORT_WARN_NONLOCAL is set in flags, warn if any of the * ports are not on a local address. If CL_PORT_FORBID_NONLOCAL is set, - * this is a control port with no password set: don't even allow it. + * this is a contrl port with no password set: don't even allow it. + * + * Unless CL_PORT_ALLOW_EXTRA_LISTENADDR is set in flags, warn + * if FooListenAddress is set but FooPort is 0. * * If CL_PORT_SERVER_OPTIONS is set in flags, do not allow stream * isolation options in the FooPort entries; instead allow the @@ -6863,45 +5406,115 @@ check_bridge_distribution_setting(const char *bd) * out for every port that the client should listen on. Return 0 * on success, -1 on failure. */ -STATIC int +static int parse_port_config(smartlist_t *out, const config_line_t *ports, + const config_line_t *listenaddrs, const char *portname, int listener_type, const char *defaultaddr, int defaultport, - const unsigned flags) + unsigned flags) { smartlist_t *elts; int retval = -1; const unsigned is_control = (listener_type == CONN_TYPE_CONTROL_LISTENER); const unsigned is_ext_orport = (listener_type == CONN_TYPE_EXT_OR_LISTENER); - const unsigned allow_no_stream_options = flags & CL_PORT_NO_STREAM_OPTIONS; + const unsigned allow_no_options = flags & CL_PORT_NO_OPTIONS; const unsigned use_server_options = flags & CL_PORT_SERVER_OPTIONS; const unsigned warn_nonlocal = flags & CL_PORT_WARN_NONLOCAL; const unsigned forbid_nonlocal = flags & CL_PORT_FORBID_NONLOCAL; - const unsigned default_to_group_writable = - flags & CL_PORT_DFLT_GROUP_WRITABLE; + const unsigned allow_spurious_listenaddr = + flags & CL_PORT_ALLOW_EXTRA_LISTENADDR; const unsigned takes_hostnames = flags & CL_PORT_TAKES_HOSTNAMES; - const unsigned is_unix_socket = flags & CL_PORT_IS_UNIXSOCKET; int got_zero_port=0, got_nonzero_port=0; - char *unix_socket_path = NULL; - /* If there's no FooPort, then maybe make a default one. */ + /* FooListenAddress is deprecated; let's make it work like it used to work, + * though. */ + if (listenaddrs) { + int mainport = defaultport; + + if (ports && ports->next) { + log_warn(LD_CONFIG, "%sListenAddress can't be used when there are " + "multiple %sPort lines", portname, portname); + return -1; + } else if (ports) { + if (!strcmp(ports->value, "auto")) { + mainport = CFG_AUTO_PORT; + } else { + int ok; + mainport = (int)tor_parse_long(ports->value, 10, 0, 65535, &ok, NULL); + if (!ok) { + log_warn(LD_CONFIG, "%sListenAddress can only be used with a single " + "%sPort with value \"auto\" or 1-65535 and no options set.", + portname, portname); + return -1; + } + } + } + + if (mainport == 0) { + if (allow_spurious_listenaddr) + return 1; /*DOCDOC*/ + log_warn(LD_CONFIG, "%sPort must be defined if %sListenAddress is used", + portname, portname); + return -1; + } + + if (use_server_options && out) { + /* Add a no_listen port. */ + port_cfg_t *cfg = port_cfg_new(); + cfg->type = listener_type; + cfg->port = mainport; + tor_addr_make_unspec(&cfg->addr); /* Server ports default to 0.0.0.0 */ + cfg->no_listen = 1; + cfg->bind_ipv4_only = 1; + cfg->ipv4_traffic = 1; + cfg->prefer_ipv6_virtaddr = 1; + smartlist_add(out, cfg); + } + + for (; listenaddrs; listenaddrs = listenaddrs->next) { + tor_addr_t addr; + uint16_t port = 0; + if (tor_addr_port_lookup(listenaddrs->value, &addr, &port) < 0) { + log_warn(LD_CONFIG, "Unable to parse %sListenAddress '%s'", + portname, listenaddrs->value); + return -1; + } + if (out) { + port_cfg_t *cfg = port_cfg_new(); + cfg->type = listener_type; + cfg->port = port ? port : mainport; + tor_addr_copy(&cfg->addr, &addr); + cfg->session_group = SESSION_GROUP_UNSET; + cfg->isolation_flags = ISO_DEFAULT; + cfg->no_advertise = 1; + smartlist_add(out, cfg); + } + } + + if (warn_nonlocal && out) { + if (is_control) + warn_nonlocal_controller_ports(out, forbid_nonlocal); + else if (is_ext_orport) + warn_nonlocal_ext_orports(out, portname); + else + warn_nonlocal_client_ports(out, portname, listener_type); + } + return 0; + } /* end if (listenaddrs) */ + + /* No ListenAddress lines. If there's no FooPort, then maybe make a default + * one. */ if (! ports) { - if (defaultport && defaultaddr && out) { - port_cfg_t *cfg = port_cfg_new(is_unix_socket ? strlen(defaultaddr) : 0); + if (defaultport && out) { + port_cfg_t *cfg = port_cfg_new(); cfg->type = listener_type; - if (is_unix_socket) { - tor_addr_make_unspec(&cfg->addr); - memcpy(cfg->unix_addr, defaultaddr, strlen(defaultaddr) + 1); - cfg->is_unix_addr = 1; - } else { - cfg->port = defaultport; - tor_addr_parse(&cfg->addr, defaultaddr); - } - cfg->entry_cfg.session_group = SESSION_GROUP_UNSET; - cfg->entry_cfg.isolation_flags = ISO_DEFAULT; + cfg->port = defaultport; + tor_addr_parse(&cfg->addr, defaultaddr); + cfg->session_group = SESSION_GROUP_UNSET; + cfg->isolation_flags = ISO_DEFAULT; smartlist_add(out, cfg); } return 0; @@ -6910,7 +5523,6 @@ parse_port_config(smartlist_t *out, /* At last we can actually parse the FooPort lines. The syntax is: * [Addr:](Port|auto) [Options].*/ elts = smartlist_new(); - char *addrport = NULL; for (; ports; ports = ports->next) { tor_addr_t addr; @@ -6918,68 +5530,34 @@ parse_port_config(smartlist_t *out, int sessiongroup = SESSION_GROUP_UNSET; unsigned isolation = ISO_DEFAULT; int prefer_no_auth = 0; - int socks_iso_keep_alive = 0; + char *addrport; uint16_t ptmp=0; int ok; - /* This must be kept in sync with port_cfg_new's defaults */ int no_listen = 0, no_advertise = 0, all_addrs = 0, bind_ipv4_only = 0, bind_ipv6_only = 0, - ipv4_traffic = 1, ipv6_traffic = 1, prefer_ipv6 = 0, dns_request = 1, - onion_traffic = 1, - cache_ipv4 = 0, use_cached_ipv4 = 0, + ipv4_traffic = 1, ipv6_traffic = 0, prefer_ipv6 = 0, + cache_ipv4 = 1, use_cached_ipv4 = 0, cache_ipv6 = 0, use_cached_ipv6 = 0, - prefer_ipv6_automap = 1, world_writable = 0, group_writable = 0, - relax_dirmode_check = 0, - has_used_unix_socket_only_option = 0; - - int is_unix_tagged_addr = 0; - const char *rest_of_line = NULL; - if (port_cfg_line_extract_addrport(ports->value, - &addrport, &is_unix_tagged_addr, &rest_of_line)<0) { - log_warn(LD_CONFIG, "Invalid %sPort line with unparsable address", - portname); - goto err; - } - if (strlen(addrport) == 0) { - log_warn(LD_CONFIG, "Invalid %sPort line with no address", portname); - goto err; - } + prefer_ipv6_automap = 1; - /* Split the remainder... */ - smartlist_split_string(elts, rest_of_line, NULL, + smartlist_split_string(elts, ports->value, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - - /* Let's start to check if it's a Unix socket path. */ - if (is_unix_tagged_addr) { -#ifndef HAVE_SYS_UN_H - log_warn(LD_CONFIG, "Unix sockets not supported on this system."); + if (smartlist_len(elts) == 0) { + log_warn(LD_CONFIG, "Invalid %sPort line with no value", portname); goto err; -#endif - unix_socket_path = addrport; - addrport = NULL; } - if (unix_socket_path && - ! conn_listener_type_supports_af_unix(listener_type)) { - log_warn(LD_CONFIG, "%sPort does not support unix sockets", portname); + if (allow_no_options && smartlist_len(elts) > 1) { + log_warn(LD_CONFIG, "Too many options on %sPort line", portname); goto err; } - if (unix_socket_path) { - port = 1; - } else if (is_unix_socket) { - if (BUG(!addrport)) - goto err; // LCOV_EXCL_LINE unreachable, but coverity can't tell that - unix_socket_path = tor_strdup(addrport); - if (!strcmp(addrport, "0")) - port = 0; - else - port = 1; - } else if (!strcmp(addrport, "auto")) { + /* Now parse the addr/port value */ + addrport = smartlist_get(elts, 0); + if (!strcmp(addrport, "auto")) { port = CFG_AUTO_PORT; - int af = tor_addr_parse(&addr, defaultaddr); - tor_assert(af >= 0); + tor_addr_parse(&addr, defaultaddr); } else if (!strcasecmpend(addrport, ":auto")) { char *addrtmp = tor_strndup(addrport, strlen(addrport)-5); port = CFG_AUTO_PORT; @@ -6989,14 +5567,12 @@ parse_port_config(smartlist_t *out, tor_free(addrtmp); goto err; } - tor_free(addrtmp); } else { /* Try parsing integer port before address, because, who knows? - "9050" might be a valid address. */ + "21102" might be a valid address. */ port = (int) tor_parse_long(addrport, 10, 0, 65535, &ok, NULL); if (ok) { - int af = tor_addr_parse(&addr, defaultaddr); - tor_assert(af >= 0); + tor_addr_parse(&addr, defaultaddr); } else if (tor_addr_port_lookup(addrport, &addr, &ptmp) == 0) { if (ptmp == 0) { log_warn(LD_CONFIG, "%sPort line has address but no port", portname); @@ -7004,19 +5580,19 @@ parse_port_config(smartlist_t *out, } port = ptmp; } else { - log_warn(LD_CONFIG, "Couldn't parse address %s for %sPort", + log_warn(LD_CONFIG, "Couldn't parse address '%s' for %sPort", escaped(addrport), portname); goto err; } } - if (unix_socket_path && default_to_group_writable) - group_writable = 1; - /* Now parse the rest of the options, if any. */ if (use_server_options) { /* This is a server port; parse advertising options */ SMARTLIST_FOREACH_BEGIN(elts, char *, elt) { + if (elt_sl_idx == 0) + continue; /* Skip addr:port */ + if (!strcasecmp(elt, "NoAdvertise")) { no_advertise = 1; } else if (!strcasecmp(elt, "NoListen")) { @@ -7026,7 +5602,7 @@ parse_port_config(smartlist_t *out, } else if (!strcasecmp(elt, "AllAddrs")) { all_addrs = 1; -#endif /* 0 */ +#endif } else if (!strcasecmp(elt, "IPv4Only")) { bind_ipv4_only = 1; } else if (!strcasecmp(elt, "IPv6Only")) { @@ -7064,11 +5640,12 @@ parse_port_config(smartlist_t *out, SMARTLIST_FOREACH_BEGIN(elts, char *, elt) { int no = 0, isoflag = 0; const char *elt_orig = elt; - + if (elt_sl_idx == 0) + continue; /* Skip addr:port */ if (!strcasecmpstart(elt, "SessionGroup=")) { int group = (int)tor_parse_long(elt+strlen("SessionGroup="), 10, 0, INT_MAX, &ok, NULL); - if (!ok || !allow_no_stream_options) { + if (!ok) { log_warn(LD_CONFIG, "Invalid %sPort option '%s'", portname, escaped(elt)); goto err; @@ -7087,26 +5664,6 @@ parse_port_config(smartlist_t *out, elt += 2; } - if (!strcasecmp(elt, "GroupWritable")) { - group_writable = !no; - has_used_unix_socket_only_option = 1; - continue; - } else if (!strcasecmp(elt, "WorldWritable")) { - world_writable = !no; - has_used_unix_socket_only_option = 1; - continue; - } else if (!strcasecmp(elt, "RelaxDirModeCheck")) { - relax_dirmode_check = !no; - has_used_unix_socket_only_option = 1; - continue; - } - - if (allow_no_stream_options) { - log_warn(LD_CONFIG, "Unrecognized %sPort option '%s'", - portname, escaped(elt)); - continue; - } - if (takes_hostnames) { if (!strcasecmp(elt, "IPv4Traffic")) { ipv4_traffic = ! no; @@ -7117,48 +5674,24 @@ parse_port_config(smartlist_t *out, } else if (!strcasecmp(elt, "PreferIPv6")) { prefer_ipv6 = ! no; continue; - } else if (!strcasecmp(elt, "DNSRequest")) { - dns_request = ! no; - continue; - } else if (!strcasecmp(elt, "OnionTraffic")) { - onion_traffic = ! no; - continue; - } else if (!strcasecmp(elt, "OnionTrafficOnly")) { - /* Only connect to .onion addresses. Equivalent to - * NoDNSRequest, NoIPv4Traffic, NoIPv6Traffic. The option - * NoOnionTrafficOnly is not supported, it's too confusing. */ - if (no) { - log_warn(LD_CONFIG, "Unsupported %sPort option 'No%s'. Use " - "DNSRequest, IPv4Traffic, and/or IPv6Traffic instead.", - portname, escaped(elt)); - } else { - ipv4_traffic = ipv6_traffic = dns_request = 0; - } - continue; } } if (!strcasecmp(elt, "CacheIPv4DNS")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha cache_ipv4 = ! no; continue; } else if (!strcasecmp(elt, "CacheIPv6DNS")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha cache_ipv6 = ! no; continue; } else if (!strcasecmp(elt, "CacheDNS")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha cache_ipv4 = cache_ipv6 = ! no; continue; } else if (!strcasecmp(elt, "UseIPv4Cache")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha use_cached_ipv4 = ! no; continue; } else if (!strcasecmp(elt, "UseIPv6Cache")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha use_cached_ipv6 = ! no; continue; } else if (!strcasecmp(elt, "UseDNSCache")) { - warn_client_dns_cache(elt, no); // since 0.2.9.2-alpha use_cached_ipv4 = use_cached_ipv6 = ! no; continue; } else if (!strcasecmp(elt, "PreferIPv6Automap")) { @@ -7167,9 +5700,6 @@ parse_port_config(smartlist_t *out, } else if (!strcasecmp(elt, "PreferSOCKSNoAuth")) { prefer_no_auth = ! no; continue; - } else if (!strcasecmp(elt, "KeepAliveIsolateSOCKSAuth")) { - socks_iso_keep_alive = ! no; - continue; } if (!strcasecmpend(elt, "s")) @@ -7203,92 +5733,40 @@ parse_port_config(smartlist_t *out, else got_zero_port = 1; - if (dns_request == 0 && listener_type == CONN_TYPE_AP_DNS_LISTENER) { - log_warn(LD_CONFIG, "You have a %sPort entry with DNS disabled; that " - "won't work.", portname); - goto err; - } - - if (ipv4_traffic == 0 && ipv6_traffic == 0 && onion_traffic == 0 - && listener_type != CONN_TYPE_AP_DNS_LISTENER) { - log_warn(LD_CONFIG, "You have a %sPort entry with all of IPv4 and " - "IPv6 and .onion disabled; that won't work.", portname); - goto err; - } - - if (dns_request == 1 && ipv4_traffic == 0 && ipv6_traffic == 0 - && listener_type != CONN_TYPE_AP_DNS_LISTENER) { - log_warn(LD_CONFIG, "You have a %sPort entry with DNSRequest enabled, " - "but IPv4 and IPv6 disabled; DNS-based sites won't work.", - portname); + if (ipv4_traffic == 0 && ipv6_traffic == 0) { + log_warn(LD_CONFIG, "You have a %sPort entry with both IPv4 and " + "IPv6 disabled; that won't work.", portname); goto err; } - if ( has_used_unix_socket_only_option && ! unix_socket_path) { - log_warn(LD_CONFIG, "You have a %sPort entry with GroupWritable, " - "WorldWritable, or RelaxDirModeCheck, but it is not a " - "unix socket.", portname); - goto err; - } - - if (!(isolation & ISO_SOCKSAUTH) && socks_iso_keep_alive) { - log_warn(LD_CONFIG, "You have a %sPort entry with both " - "NoIsolateSOCKSAuth and KeepAliveIsolateSOCKSAuth set.", - portname); - goto err; - } - - if (unix_socket_path && (isolation & ISO_CLIENTADDR)) { - /* `IsolateClientAddr` is nonsensical in the context of AF_LOCAL. - * just silently remove the isolation flag. - */ - isolation &= ~ISO_CLIENTADDR; - } - if (out && port) { - size_t namelen = unix_socket_path ? strlen(unix_socket_path) : 0; - port_cfg_t *cfg = port_cfg_new(namelen); - if (unix_socket_path) { - tor_addr_make_unspec(&cfg->addr); - memcpy(cfg->unix_addr, unix_socket_path, namelen + 1); - cfg->is_unix_addr = 1; - tor_free(unix_socket_path); - } else { - tor_addr_copy(&cfg->addr, &addr); - cfg->port = port; - } + port_cfg_t *cfg = port_cfg_new(); + tor_addr_copy(&cfg->addr, &addr); + cfg->port = port; cfg->type = listener_type; - cfg->is_world_writable = world_writable; - cfg->is_group_writable = group_writable; - cfg->relax_dirmode_check = relax_dirmode_check; - cfg->entry_cfg.isolation_flags = isolation; - cfg->entry_cfg.session_group = sessiongroup; - cfg->server_cfg.no_advertise = no_advertise; - cfg->server_cfg.no_listen = no_listen; - cfg->server_cfg.all_addrs = all_addrs; - cfg->server_cfg.bind_ipv4_only = bind_ipv4_only; - cfg->server_cfg.bind_ipv6_only = bind_ipv6_only; - cfg->entry_cfg.ipv4_traffic = ipv4_traffic; - cfg->entry_cfg.ipv6_traffic = ipv6_traffic; - cfg->entry_cfg.prefer_ipv6 = prefer_ipv6; - cfg->entry_cfg.dns_request = dns_request; - cfg->entry_cfg.onion_traffic = onion_traffic; - cfg->entry_cfg.cache_ipv4_answers = cache_ipv4; - cfg->entry_cfg.cache_ipv6_answers = cache_ipv6; - cfg->entry_cfg.use_cached_ipv4_answers = use_cached_ipv4; - cfg->entry_cfg.use_cached_ipv6_answers = use_cached_ipv6; - cfg->entry_cfg.prefer_ipv6_virtaddr = prefer_ipv6_automap; - cfg->entry_cfg.socks_prefer_no_auth = prefer_no_auth; + cfg->isolation_flags = isolation; + cfg->session_group = sessiongroup; + cfg->no_advertise = no_advertise; + cfg->no_listen = no_listen; + cfg->all_addrs = all_addrs; + cfg->bind_ipv4_only = bind_ipv4_only; + cfg->bind_ipv6_only = bind_ipv6_only; + cfg->ipv4_traffic = ipv4_traffic; + cfg->ipv6_traffic = ipv6_traffic; + cfg->prefer_ipv6 = prefer_ipv6; + cfg->cache_ipv4_answers = cache_ipv4; + cfg->cache_ipv6_answers = cache_ipv6; + cfg->use_cached_ipv4_answers = use_cached_ipv4; + cfg->use_cached_ipv6_answers = use_cached_ipv6; + cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap; + cfg->socks_prefer_no_auth = prefer_no_auth; if (! (isolation & ISO_SOCKSAUTH)) - cfg->entry_cfg.socks_prefer_no_auth = 1; - cfg->entry_cfg.socks_iso_keep_alive = socks_iso_keep_alive; + cfg->socks_prefer_no_auth = 1; smartlist_add(out, cfg); } SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); smartlist_clear(elts); - tor_free(addrport); - tor_free(unix_socket_path); } if (warn_nonlocal && out) { @@ -7311,23 +5789,41 @@ parse_port_config(smartlist_t *out, err: SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); smartlist_free(elts); - tor_free(unix_socket_path); - tor_free(addrport); return retval; } +/** Parse a list of config_line_t for an AF_UNIX unix socket listener option + * from cfg and add them to out. No fancy options are + * supported: the line contains nothing but the path to the AF_UNIX socket. */ +static int +parse_unix_socket_config(smartlist_t *out, const config_line_t *cfg, + int listener_type) +{ + + if (!out) + return 0; + + for ( ; cfg; cfg = cfg->next) { + size_t len = strlen(cfg->value); + port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t) + len + 1); + port->is_unix_addr = 1; + memcpy(port->unix_addr, cfg->value, len+1); + port->type = listener_type; + smartlist_add(out, port); + } + + return 0; +} + /** Return the number of ports which are actually going to listen with type - * listenertype. Do not count no_listen ports. Only count unix - * sockets if count_sockets is true. */ + * listenertype. Do not count no_listen ports. Do not count unix + * sockets. */ static int -count_real_listeners(const smartlist_t *ports, int listenertype, - int count_sockets) +count_real_listeners(const smartlist_t *ports, int listenertype) { int n = 0; SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) { - if (port->server_cfg.no_listen) - continue; - if (!count_sockets && port->is_unix_addr) + if (port->no_listen || port->is_unix_addr) continue; if (port->type != listenertype) continue; @@ -7336,8 +5832,9 @@ count_real_listeners(const smartlist_t *ports, int listenertype, return n; } -/** Parse all ports from options. On success, set *n_ports_out - * to the number of ports that are listed, update the *Port_set values in +/** Parse all client port types (Socks, DNS, Trans, NATD) from + * options. On success, set *n_ports_out to the number + * of ports that are listed, update the *Port_set values in * options, and return 0. On failure, set *msg to a * description of the problem and return -1. * @@ -7346,8 +5843,7 @@ count_real_listeners(const smartlist_t *ports, int listenertype, **/ static int parse_ports(or_options_t *options, int validate_only, - char **msg, int *n_ports_out, - int *world_writable_control_socket) + char **msg, int *n_ports_out) { smartlist_t *ports; int retval = -1; @@ -7356,89 +5852,75 @@ parse_ports(or_options_t *options, int validate_only, *n_ports_out = 0; - const unsigned gw_flag = options->SocksSocketsGroupWritable ? - CL_PORT_DFLT_GROUP_WRITABLE : 0; if (parse_port_config(ports, - options->SocksPort_lines, + options->SocksPort_lines, options->SocksListenAddress, "Socks", CONN_TYPE_AP_LISTENER, - "127.0.0.1", 9050, - ((validate_only ? 0 : CL_PORT_WARN_NONLOCAL) - | CL_PORT_TAKES_HOSTNAMES | gw_flag)) < 0) { - *msg = tor_strdup("Invalid SocksPort configuration"); + "127.0.0.1", 21102, + CL_PORT_WARN_NONLOCAL|CL_PORT_ALLOW_EXTRA_LISTENADDR| + CL_PORT_TAKES_HOSTNAMES) < 0) { + *msg = tor_strdup("Invalid SocksPort/SocksListenAddress configuration"); goto err; } if (parse_port_config(ports, - options->DNSPort_lines, + options->DNSPort_lines, options->DNSListenAddress, "DNS", CONN_TYPE_AP_DNS_LISTENER, "127.0.0.1", 0, CL_PORT_WARN_NONLOCAL|CL_PORT_TAKES_HOSTNAMES) < 0) { - *msg = tor_strdup("Invalid DNSPort configuration"); + *msg = tor_strdup("Invalid DNSPort/DNSListenAddress configuration"); goto err; } if (parse_port_config(ports, - options->TransPort_lines, + options->TransPort_lines, options->TransListenAddress, "Trans", CONN_TYPE_AP_TRANS_LISTENER, "127.0.0.1", 0, CL_PORT_WARN_NONLOCAL) < 0) { - *msg = tor_strdup("Invalid TransPort configuration"); + *msg = tor_strdup("Invalid TransPort/TransListenAddress configuration"); goto err; } if (parse_port_config(ports, - options->NATDPort_lines, + options->NATDPort_lines, options->NATDListenAddress, "NATD", CONN_TYPE_AP_NATD_LISTENER, "127.0.0.1", 0, CL_PORT_WARN_NONLOCAL) < 0) { - *msg = tor_strdup("Invalid NatdPort configuration"); - goto err; - } - if (parse_port_config(ports, - options->HTTPTunnelPort_lines, - "HTTP Tunnel", CONN_TYPE_AP_HTTP_CONNECT_LISTENER, - "127.0.0.1", 0, - ((validate_only ? 0 : CL_PORT_WARN_NONLOCAL) - | CL_PORT_TAKES_HOSTNAMES | gw_flag)) < 0) { - *msg = tor_strdup("Invalid HTTPTunnelPort configuration"); + *msg = tor_strdup("Invalid NatdPort/NatdListenAddress configuration"); goto err; } { - unsigned control_port_flags = CL_PORT_NO_STREAM_OPTIONS | - CL_PORT_WARN_NONLOCAL; + unsigned control_port_flags = CL_PORT_NO_OPTIONS | CL_PORT_WARN_NONLOCAL; const int any_passwords = (options->HashedControlPassword || options->HashedControlSessionPassword || options->CookieAuthentication); if (! any_passwords) control_port_flags |= CL_PORT_FORBID_NONLOCAL; - if (options->ControlSocketsGroupWritable) - control_port_flags |= CL_PORT_DFLT_GROUP_WRITABLE; if (parse_port_config(ports, options->ControlPort_lines, + options->ControlListenAddress, "Control", CONN_TYPE_CONTROL_LISTENER, "127.0.0.1", 0, control_port_flags) < 0) { - *msg = tor_strdup("Invalid ControlPort configuration"); + *msg = tor_strdup("Invalid ControlPort/ControlListenAddress " + "configuration"); goto err; } - - if (parse_port_config(ports, options->ControlSocket, - "ControlSocket", - CONN_TYPE_CONTROL_LISTENER, NULL, 0, - control_port_flags | CL_PORT_IS_UNIXSOCKET) < 0) { + if (parse_unix_socket_config(ports, + options->ControlSocket, + CONN_TYPE_CONTROL_LISTENER) < 0) { *msg = tor_strdup("Invalid ControlSocket configuration"); goto err; } } if (! options->ClientOnly) { if (parse_port_config(ports, - options->ORPort_lines, + options->ORPort_lines, options->ORListenAddress, "OR", CONN_TYPE_OR_LISTENER, "0.0.0.0", 0, CL_PORT_SERVER_OPTIONS) < 0) { - *msg = tor_strdup("Invalid ORPort configuration"); + *msg = tor_strdup("Invalid ORPort/ORListenAddress configuration"); goto err; } if (parse_port_config(ports, - options->ExtORPort_lines, + options->ExtORPort_lines, NULL, "ExtOR", CONN_TYPE_EXT_OR_LISTENER, "127.0.0.1", 0, CL_PORT_SERVER_OPTIONS|CL_PORT_WARN_NONLOCAL) < 0) { @@ -7446,22 +5928,19 @@ parse_ports(or_options_t *options, int validate_only, goto err; } if (parse_port_config(ports, - options->DirPort_lines, + options->DirPort_lines, options->DirListenAddress, "Dir", CONN_TYPE_DIR_LISTENER, "0.0.0.0", 0, CL_PORT_SERVER_OPTIONS) < 0) { - *msg = tor_strdup("Invalid DirPort configuration"); + *msg = tor_strdup("Invalid DirPort/DirListenAddress configuration"); goto err; } } - int n_low_ports = 0; - if (check_server_ports(ports, options, &n_low_ports) < 0) { + if (check_server_ports(ports, options) < 0) { *msg = tor_strdup("Misconfigured server ports"); goto err; } - if (have_low_ports < 0) - have_low_ports = (n_low_ports > 0); *n_ports_out = smartlist_len(ports); @@ -7470,34 +5949,21 @@ parse_ports(or_options_t *options, int validate_only, /* Update the *Port_set options. The !! here is to force a boolean out of an integer. */ options->ORPort_set = - !! count_real_listeners(ports, CONN_TYPE_OR_LISTENER, 0); + !! count_real_listeners(ports, CONN_TYPE_OR_LISTENER); options->SocksPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER, 1); + !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER); options->TransPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_TRANS_LISTENER, 1); + !! count_real_listeners(ports, CONN_TYPE_AP_TRANS_LISTENER); options->NATDPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_NATD_LISTENER, 1); - options->HTTPTunnelPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_HTTP_CONNECT_LISTENER, 1); - /* Use options->ControlSocket to test if a control socket is set */ + !! count_real_listeners(ports, CONN_TYPE_AP_NATD_LISTENER); options->ControlPort_set = - !! count_real_listeners(ports, CONN_TYPE_CONTROL_LISTENER, 0); + !! count_real_listeners(ports, CONN_TYPE_CONTROL_LISTENER); options->DirPort_set = - !! count_real_listeners(ports, CONN_TYPE_DIR_LISTENER, 0); + !! count_real_listeners(ports, CONN_TYPE_DIR_LISTENER); options->DNSPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_DNS_LISTENER, 1); + !! count_real_listeners(ports, CONN_TYPE_AP_DNS_LISTENER); options->ExtORPort_set = - !! count_real_listeners(ports, CONN_TYPE_EXT_OR_LISTENER, 0); - - if (world_writable_control_socket) { - SMARTLIST_FOREACH(ports, port_cfg_t *, p, - if (p->type == CONN_TYPE_CONTROL_LISTENER && - p->is_unix_addr && - p->is_world_writable) { - *world_writable_control_socket = 1; - break; - }); - } + !! count_real_listeners(ports, CONN_TYPE_EXT_OR_LISTENER); if (!validate_only) { if (configured_ports) { @@ -7517,31 +5983,11 @@ parse_ports(or_options_t *options, int validate_only, return retval; } -/* Does port bind to IPv4? */ -static int -port_binds_ipv4(const port_cfg_t *port) -{ - return tor_addr_family(&port->addr) == AF_INET || - (tor_addr_family(&port->addr) == AF_UNSPEC - && !port->server_cfg.bind_ipv6_only); -} - -/* Does port bind to IPv6? */ -static int -port_binds_ipv6(const port_cfg_t *port) -{ - return tor_addr_family(&port->addr) == AF_INET6 || - (tor_addr_family(&port->addr) == AF_UNSPEC - && !port->server_cfg.bind_ipv4_only); -} - /** Given a list of port_cfg_t in ports, check them for internal - * consistency and warn as appropriate. Set *n_low_ports_out to the - * number of sub-1024 ports we will be binding. */ + * consistency and warn as appropriate. */ static int check_server_ports(const smartlist_t *ports, - const or_options_t *options, - int *n_low_ports_out) + const or_options_t *options) { int n_orport_advertised = 0; int n_orport_advertised_ipv4 = 0; @@ -7553,23 +5999,25 @@ check_server_ports(const smartlist_t *ports, SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { if (port->type == CONN_TYPE_DIR_LISTENER) { - if (! port->server_cfg.no_advertise) + if (! port->no_advertise) ++n_dirport_advertised; - if (! port->server_cfg.no_listen) + if (! port->no_listen) ++n_dirport_listeners; } else if (port->type == CONN_TYPE_OR_LISTENER) { - if (! port->server_cfg.no_advertise) { + if (! port->no_advertise) { ++n_orport_advertised; - if (port_binds_ipv4(port)) + if (tor_addr_family(&port->addr) == AF_INET || + (tor_addr_family(&port->addr) == AF_UNSPEC && + !port->bind_ipv6_only)) ++n_orport_advertised_ipv4; } - if (! port->server_cfg.no_listen) + if (! port->no_listen) ++n_orport_listeners; } else { continue; } #ifndef _WIN32 - if (!port->server_cfg.no_listen && port->port < 1024) + if (!port->no_listen && port->port < 1024) ++n_low_port; #endif } SMARTLIST_FOREACH_END(port); @@ -7602,31 +6050,23 @@ check_server_ports(const smartlist_t *ports, r = -1; } - if (n_low_port && options->AccountingMax && - (!have_capability_support() || options->KeepBindCapabilities == 0)) { - const char *extra = ""; - if (options->KeepBindCapabilities == 0 && have_capability_support()) - extra = ", and you have disabled KeepBindCapabilities."; + if (n_low_port && options->AccountingMax) { log_warn(LD_CONFIG, "You have set AccountingMax to use hibernation. You have also " - "chosen a low DirPort or OrPort%s." - "This combination can make Tor stop " + "chosen a low DirPort or OrPort. This combination can make Tor stop " "working when it tries to re-attach the port after a period of " "hibernation. Please choose a different port or turn off " "hibernation unless you know this combination will work on your " - "platform.", extra); + "platform."); } - if (n_low_ports_out) - *n_low_ports_out = n_low_port; - return r; } /** Return a list of port_cfg_t for client ports parsed from the * options. */ -MOCK_IMPL(const smartlist_t *, -get_configured_ports,(void)) +const smartlist_t * +get_configured_ports(void) { if (!configured_ports) configured_ports = smartlist_new(); @@ -7655,7 +6095,7 @@ get_first_listener_addrport_string(int listener_type) return NULL; SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->server_cfg.no_listen) + if (cfg->no_listen) continue; if (cfg->type == listener_type && @@ -7694,183 +6134,58 @@ get_first_listener_addrport_string(int listener_type) } /** Return the first advertised port of type listener_type in - * address_family. Returns 0 when no port is found, and when passed - * AF_UNSPEC. */ + address_family. */ int get_first_advertised_port_by_type_af(int listener_type, int address_family) { - if (address_family == AF_UNSPEC) - return 0; - - const smartlist_t *conf_ports = get_configured_ports(); - SMARTLIST_FOREACH_BEGIN(conf_ports, const port_cfg_t *, cfg) { - if (cfg->type == listener_type && - !cfg->server_cfg.no_advertise) { - if ((address_family == AF_INET && port_binds_ipv4(cfg)) || - (address_family == AF_INET6 && port_binds_ipv6(cfg))) { - return cfg->port; - } - } - } SMARTLIST_FOREACH_END(cfg); - return 0; -} - -/** Return the first advertised address of type listener_type in - * address_family. Returns NULL if there is no advertised address, - * and when passed AF_UNSPEC. */ -const tor_addr_t * -get_first_advertised_addr_by_type_af(int listener_type, int address_family) -{ - if (address_family == AF_UNSPEC) - return NULL; if (!configured_ports) - return NULL; - SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->type == listener_type && - !cfg->server_cfg.no_advertise) { - if ((address_family == AF_INET && port_binds_ipv4(cfg)) || - (address_family == AF_INET6 && port_binds_ipv6(cfg))) { - return &cfg->addr; - } - } - } SMARTLIST_FOREACH_END(cfg); - return NULL; -} - -/** Return 1 if a port exists of type listener_type on addr and - * port. If check_wildcard is true, INADDR[6]_ANY and AF_UNSPEC - * addresses match any address of the appropriate family; and port -1 matches - * any port. - * To match auto ports, pass CFG_PORT_AUTO. (Does not match on the actual - * automatically chosen listener ports.) */ -int -port_exists_by_type_addr_port(int listener_type, const tor_addr_t *addr, - int port, int check_wildcard) -{ - if (!configured_ports || !addr) return 0; SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->type == listener_type) { - if (cfg->port == port || (check_wildcard && port == -1)) { - /* Exact match */ - if (tor_addr_eq(&cfg->addr, addr)) { - return 1; - } - /* Skip wildcard matches if we're not doing them */ - if (!check_wildcard) { - continue; - } - /* Wildcard matches IPv4 */ - const int cfg_v4 = port_binds_ipv4(cfg); - const int cfg_any_v4 = tor_addr_is_null(&cfg->addr) && cfg_v4; - const int addr_v4 = tor_addr_family(addr) == AF_INET || - tor_addr_family(addr) == AF_UNSPEC; - const int addr_any_v4 = tor_addr_is_null(&cfg->addr) && addr_v4; - if ((cfg_any_v4 && addr_v4) || (cfg_v4 && addr_any_v4)) { - return 1; - } - /* Wildcard matches IPv6 */ - const int cfg_v6 = port_binds_ipv6(cfg); - const int cfg_any_v6 = tor_addr_is_null(&cfg->addr) && cfg_v6; - const int addr_v6 = tor_addr_family(addr) == AF_INET6 || - tor_addr_family(addr) == AF_UNSPEC; - const int addr_any_v6 = tor_addr_is_null(&cfg->addr) && addr_v6; - if ((cfg_any_v6 && addr_v6) || (cfg_v6 && addr_any_v6)) { - return 1; - } + if (cfg->type == listener_type && + !cfg->no_advertise && + (tor_addr_family(&cfg->addr) == address_family || + tor_addr_family(&cfg->addr) == AF_UNSPEC)) { + if (tor_addr_family(&cfg->addr) != AF_UNSPEC || + (address_family == AF_INET && !cfg->bind_ipv6_only) || + (address_family == AF_INET6 && !cfg->bind_ipv4_only)) { + return cfg->port; } } } SMARTLIST_FOREACH_END(cfg); return 0; } -/* Like port_exists_by_type_addr_port, but accepts a host-order IPv4 address - * instead. */ -int -port_exists_by_type_addr32h_port(int listener_type, uint32_t addr_ipv4h, - int port, int check_wildcard) -{ - tor_addr_t ipv4; - tor_addr_from_ipv4h(&ipv4, addr_ipv4h); - return port_exists_by_type_addr_port(listener_type, &ipv4, port, - check_wildcard); -} - -/** Allocate and return a good value for the DataDirectory based on - * val, which may be NULL. Return NULL on failure. */ -static char * -get_data_directory(const char *val) +/** Adjust the value of options->DataDirectory, or fill it in if it's + * absent. Return 0 on success, -1 on failure. */ +static int +normalize_data_directory(or_options_t *options) { + char *p; + if (options->DataDirectory) + return 0; /* all set */ #ifdef _WIN32 - if (val) { - return tor_strdup(val); - } else { - return tor_strdup(get_windows_conf_root()); - } -#else /* !(defined(_WIN32)) */ - const char *d = val; - if (!d) - d = "~/.tor"; - - if (!strcmpstart(d, "~/")) { - char *fn = expand_filename(d); - if (!fn) { - log_warn(LD_CONFIG,"Failed to expand filename \"%s\".", d); - return NULL; - } - if (!val && !strcmp(fn,"/.tor")) { - /* If our homedir is /, we probably don't want to use it. */ - /* Default to LOCALSTATEDIR/tor which is probably closer to what we - * want. */ - log_warn(LD_CONFIG, - "Default DataDirectory is \"~/.tor\". This expands to " - "\"%s\", which is probably not what you want. Using " - "\"%s"PATH_SEPARATOR"tor\" instead", fn, LOCALSTATEDIR); - tor_free(fn); - fn = tor_strdup(LOCALSTATEDIR PATH_SEPARATOR "tor"); - } - return fn; - } - return tor_strdup(d); -#endif /* defined(_WIN32) */ + p = tor_malloc(MAX_PATH); + strlcpy(p,anonymize_tor_data_directory(),MAX_PATH); +#else + p = tor_malloc(PATH_MAX); + strlcpy(p,anonymize_tor_data_directory(),PATH_MAX); +#endif + options->DataDirectory = p; + return 0; } -/** Check and normalize the values of options->{Key,Data,Cache}Directory; - * return 0 if it is sane, -1 otherwise. */ +/** Check and normalize the value of options->DataDirectory; return 0 if it + * is sane, -1 otherwise. */ static int -validate_data_directories(or_options_t *options) +validate_data_directory(or_options_t *options) { - tor_free(options->DataDirectory); - options->DataDirectory = get_data_directory(options->DataDirectory_option); - if (!options->DataDirectory) + if (normalize_data_directory(options) < 0) return -1; + tor_assert(options->DataDirectory); if (strlen(options->DataDirectory) > (512-128)) { log_warn(LD_CONFIG, "DataDirectory is too long."); return -1; } - - tor_free(options->KeyDirectory); - if (options->KeyDirectory_option) { - options->KeyDirectory = get_data_directory(options->KeyDirectory_option); - if (!options->KeyDirectory) - return -1; - } else { - /* Default to the data directory's keys subdir */ - tor_asprintf(&options->KeyDirectory, "%s"PATH_SEPARATOR"keys", - options->DataDirectory); - } - - tor_free(options->CacheDirectory); - if (options->CacheDirectory_option) { - options->CacheDirectory = get_data_directory( - options->CacheDirectory_option); - if (!options->CacheDirectory) - return -1; - } else { - /* Default to the data directory. */ - options->CacheDirectory = tor_strdup(options->DataDirectory); - } - return 0; } @@ -7893,13 +6208,10 @@ write_configuration_file(const char *fname, const or_options_t *options) char *old_val=NULL, *new_val=NULL, *new_conf=NULL; int rename_old = 0, r; - if (!fname) - return -1; + tor_assert(fname); switch (file_status(fname)) { - /* create backups of old config files, even if they're empty */ case FN_FILE: - case FN_EMPTY: old_val = read_file_to_str(fname, 0, NULL); if (!old_val || strcmpstart(old_val, GENERATED_FILE_PREFIX)) { rename_old = 1; @@ -7935,7 +6247,7 @@ write_configuration_file(const char *fname, const or_options_t *options) ++i; } log_notice(LD_CONFIG, "Renaming old configuration file to \"%s\"", fn_tmp); - if (tor_rename(fname, fn_tmp) < 0) {//XXXX sandbox doesn't allow + if (rename(fname, fn_tmp) < 0) { log_warn(LD_FS, "Couldn't rename configuration file \"%s\" to \"%s\": %s", fname, fn_tmp, strerror(errno)); @@ -7992,6 +6304,7 @@ get_num_cpus(const or_options_t *options) static void init_libevent(const or_options_t *options) { + const char *badness=NULL; tor_libevent_cfg cfg; tor_assert(options); @@ -8002,65 +6315,76 @@ init_libevent(const or_options_t *options) */ suppress_libevent_log_msg("Function not implemented"); + tor_check_libevent_header_compatibility(); + memset(&cfg, 0, sizeof(cfg)); + cfg.disable_iocp = options->DisableIOCP; cfg.num_cpus = get_num_cpus(options); cfg.msec_per_tick = options->TokenBucketRefillInterval; tor_libevent_initialize(&cfg); suppress_libevent_log_msg(NULL); + + tor_check_libevent_version(tor_libevent_get_method(), + server_mode(get_options()), + &badness); + if (badness) { + const char *v = tor_libevent_get_version_str(); + const char *m = tor_libevent_get_method(); + control_event_general_status(LOG_WARN, + "BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO", + v, m, badness); + } } -/** Return a newly allocated string holding a filename relative to the - * directory in options specified by roottype. - * If sub1 is present, it is the first path component after +/** Return a newly allocated string holding a filename relative to the data + * directory. If sub1 is present, it is the first path component after * the data directory. If sub2 is also present, it is the second path * component after the data directory. If suffix is present, it * is appended to the filename. * - * Note: Consider using macros in config.h that wrap this function; - * you should probably never need to call it as-is. + * Examples: + * get_datadir_fname2_suffix("a", NULL, NULL) -> $DATADIR/a + * get_datadir_fname2_suffix("a", NULL, ".tmp") -> $DATADIR/a.tmp + * get_datadir_fname2_suffix("a", "b", ".tmp") -> $DATADIR/a/b/.tmp + * get_datadir_fname2_suffix("a", "b", NULL) -> $DATADIR/a/b + * + * Note: Consider using the get_datadir_fname* macros in or.h. */ -MOCK_IMPL(char *, -options_get_dir_fname2_suffix,(const or_options_t *options, - directory_root_t roottype, - const char *sub1, const char *sub2, - const char *suffix)) +char * +options_get_datadir_fname2_suffix(const or_options_t *options, + const char *sub1, const char *sub2, + const char *suffix) { - tor_assert(options); - - const char *rootdir = NULL; - switch (roottype) { - case DIRROOT_DATADIR: - rootdir = options->DataDirectory; - break; - case DIRROOT_CACHEDIR: - rootdir = options->CacheDirectory; - break; - case DIRROOT_KEYDIR: - rootdir = options->KeyDirectory; - break; - default: - tor_assert_unreached(); - break; - } - tor_assert(rootdir); - - if (!suffix) - suffix = ""; - char *fname = NULL; - - if (sub1 == NULL) { - tor_asprintf(&fname, "%s%s", rootdir, suffix); - tor_assert(!sub2); /* If sub2 is present, sub1 must be present. */ - } else if (sub2 == NULL) { - tor_asprintf(&fname, "%s"PATH_SEPARATOR"%s%s", rootdir, sub1, suffix); + size_t len; + tor_assert(options); + tor_assert(options->DataDirectory); + tor_assert(sub1 || !sub2); /* If sub2 is present, sub1 must be present. */ + len = strlen(options->DataDirectory); + if (sub1) { + len += strlen(sub1)+1; + if (sub2) + len += strlen(sub2)+1; + } + if (suffix) + len += strlen(suffix); + len++; + fname = tor_malloc(len); + if (sub1) { + if (sub2) { + tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s"PATH_SEPARATOR"%s", + options->DataDirectory, sub1, sub2); + } else { + tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s", + options->DataDirectory, sub1); + } } else { - tor_asprintf(&fname, "%s"PATH_SEPARATOR"%s"PATH_SEPARATOR"%s%s", - rootdir, sub1, sub2, suffix); + strlcpy(fname, options->DataDirectory, len); } - + if (suffix) + strlcat(fname, suffix, len); return fname; } @@ -8101,6 +6425,24 @@ write_to_data_subdir(const char* subdir, const char* fname, return return_val; } +/** Given a file name check to see whether the file exists but has not been + * modified for a very long time. If so, remove it. */ +void +remove_file_if_very_old(const char *fname, time_t now) +{ +#define VERY_OLD_FILE_AGE (28*24*60*60) + struct stat st; + + if (stat(sandbox_intern_string(fname), &st)==0 && + st.st_mtime < now-VERY_OLD_FILE_AGE) { + char buf[ISO_TIME_LEN+1]; + format_local_iso_time(buf, st.st_mtime); + log_notice(LD_GENERAL, "Obsolete file %s hasn't been modified since %s. " + "Removing it.", fname, buf); + unlink(fname); + } +} + /** Return a smartlist of ports that must be forwarded by * tor-fw-helper. The smartlist contains the ports in a string format * that is understandable by tor-fw-helper. */ @@ -8175,7 +6517,7 @@ getinfo_helper_config(control_connection_t *conn, case CONFIG_TYPE_CSV: type = "CommaList"; break; case CONFIG_TYPE_CSV_INTERVAL: type = "TimeIntervalCommaList"; break; case CONFIG_TYPE_LINELIST: type = "LineList"; break; - case CONFIG_TYPE_LINELIST_S: type = "Dependent"; break; + case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break; case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break; default: case CONFIG_TYPE_OBSOLETE: @@ -8190,66 +6532,15 @@ getinfo_helper_config(control_connection_t *conn, smartlist_free(sl); } else if (!strcmp(question, "config/defaults")) { smartlist_t *sl = smartlist_new(); - int dirauth_lines_seen = 0, fallback_lines_seen = 0; - for (int i = 0; option_vars_[i].name; ++i) { + int i; + for (i = 0; option_vars_[i].name; ++i) { const config_var_t *var = &option_vars_[i]; if (var->initvalue != NULL) { - if (strcmp(option_vars_[i].name, "DirAuthority") == 0) { - /* - * Count dirauth lines we have a default for; we'll use the - * count later to decide whether to add the defaults manually - */ - ++dirauth_lines_seen; - } - if (strcmp(option_vars_[i].name, "FallbackDir") == 0) { - /* - * Similarly count fallback lines, so that we can decided later - * to add the defaults manually. - */ - ++fallback_lines_seen; - } - char *val = esc_for_log(var->initvalue); - smartlist_add_asprintf(sl, "%s %s\n",var->name,val); - tor_free(val); - } - } - - if (dirauth_lines_seen == 0) { - /* - * We didn't see any directory authorities with default values, - * so add the list of default authorities manually. - */ - - /* - * default_authorities is defined earlier in this file and - * is a const char ** NULL-terminated array of dirauth config - * lines. - */ - for (const char **i = default_authorities; *i != NULL; ++i) { - char *val = esc_for_log(*i); - smartlist_add_asprintf(sl, "DirAuthority %s\n", val); - tor_free(val); - } - } - - if (fallback_lines_seen == 0 && - get_options()->UseDefaultFallbackDirs == 1) { - /* - * We didn't see any explicitly configured fallback mirrors, - * so add the defaults to the list manually. - * - * default_fallbacks is included earlier in this file and - * is a const char ** NULL-terminated array of fallback config lines. - */ - const char **i; - - for (i = default_fallbacks; *i != NULL; ++i) { - char *val = esc_for_log(*i); - smartlist_add_asprintf(sl, "FallbackDir %s\n", val); - tor_free(val); + char *val = esc_for_log(var->initvalue); + smartlist_add_asprintf(sl, "%s %s\n",var->name,val); + tor_free(val); } } - *answer = smartlist_join_strings(sl, "", 0, NULL); SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); @@ -8257,98 +6548,60 @@ getinfo_helper_config(control_connection_t *conn, return 0; } -/* Check whether an address has already been set against the options - * depending on address family and destination type. Any exsting - * value will lead to a fail, even if it is the same value. If not - * set and not only validating, copy it into this location too. - * Returns 0 on success or -1 if this address is already set. - */ +/** Parse outbound bind address option lines. If validate_only + * is not 0 update OutboundBindAddressIPv4_ and + * OutboundBindAddressIPv6_ in options. On failure, set + * msg (if provided) to a newly allocated string containing a + * description of the problem and return -1. */ static int -verify_and_store_outbound_address(sa_family_t family, tor_addr_t *addr, - outbound_addr_t type, or_options_t *options, int validate_only) +parse_outbound_addresses(or_options_t *options, int validate_only, char **msg) { - if (type>=OUTBOUND_ADDR_MAX || (family!=AF_INET && family!=AF_INET6)) { - return -1; - } - int fam_index=0; - if (family==AF_INET6) { - fam_index=1; - } - tor_addr_t *dest=&options->OutboundBindAddresses[type][fam_index]; - if (!tor_addr_is_null(dest)) { - return -1; - } + const config_line_t *lines = options->OutboundBindAddress; + int found_v4 = 0, found_v6 = 0; + if (!validate_only) { - tor_addr_copy(dest, addr); + memset(&options->OutboundBindAddressIPv4_, 0, + sizeof(options->OutboundBindAddressIPv4_)); + memset(&options->OutboundBindAddressIPv6_, 0, + sizeof(options->OutboundBindAddressIPv6_)); } - return 0; -} - -/* Parse a list of address lines for a specific destination type. - * Will store them into the options if not validate_only. If a - * problem occurs, a suitable error message is store in msg. - * Returns 0 on success or -1 if any address is already set. - */ -static int -parse_outbound_address_lines(const config_line_t *lines, outbound_addr_t type, - or_options_t *options, int validate_only, char **msg) -{ - tor_addr_t addr; - sa_family_t family; while (lines) { - family = tor_addr_parse(&addr, lines->value); - if (verify_and_store_outbound_address(family, &addr, type, - options, validate_only)) { + tor_addr_t addr, *dst_addr = NULL; + int af = tor_addr_parse(&addr, lines->value); + switch (af) { + case AF_INET: + if (found_v4) { + if (msg) + tor_asprintf(msg, "Multiple IPv4 outbound bind addresses " + "configured: %s", lines->value); + return -1; + } + found_v4 = 1; + dst_addr = &options->OutboundBindAddressIPv4_; + break; + case AF_INET6: + if (found_v6) { + if (msg) + tor_asprintf(msg, "Multiple IPv6 outbound bind addresses " + "configured: %s", lines->value); + return -1; + } + found_v6 = 1; + dst_addr = &options->OutboundBindAddressIPv6_; + break; + default: if (msg) - tor_asprintf(msg, "Multiple%s%s outbound bind addresses " - "configured: %s", - family==AF_INET?" IPv4":(family==AF_INET6?" IPv6":""), - type==OUTBOUND_ADDR_OR?" OR": - (type==OUTBOUND_ADDR_EXIT?" exit":""), lines->value); + tor_asprintf(msg, "Outbound bind address '%s' didn't parse.", + lines->value); return -1; } + if (!validate_only) + tor_addr_copy(dst_addr, &addr); lines = lines->next; } return 0; } -/** Parse outbound bind address option lines. If validate_only - * is not 0 update OutboundBindAddresses in options. - * Only one address can be set for any of these values. - * On failure, set msg (if provided) to a newly allocated string - * containing a description of the problem and return -1. - */ -static int -parse_outbound_addresses(or_options_t *options, int validate_only, char **msg) -{ - if (!validate_only) { - memset(&options->OutboundBindAddresses, 0, - sizeof(options->OutboundBindAddresses)); - } - - if (parse_outbound_address_lines(options->OutboundBindAddress, - OUTBOUND_ADDR_EXIT_AND_OR, options, - validate_only, msg) < 0) { - goto err; - } - - if (parse_outbound_address_lines(options->OutboundBindAddressOR, - OUTBOUND_ADDR_OR, options, validate_only, - msg) < 0) { - goto err; - } - - if (parse_outbound_address_lines(options->OutboundBindAddressExit, - OUTBOUND_ADDR_EXIT, options, validate_only, - msg) < 0) { - goto err; - } - - return 0; - err: - return -1; -} - /** Load one of the geoip files, family determining which * one. default_fname is used if on Windows and * fname equals "". */ @@ -8368,10 +6621,10 @@ config_load_geoip_file_(sa_family_t family, } geoip_load_file(family, fname); tor_free(free_fname); -#else /* !(defined(_WIN32)) */ +#else (void)default_fname; geoip_load_file(family, fname); -#endif /* defined(_WIN32) */ +#endif } /** Load geoip files for IPv4 and IPv6 if options and @@ -8380,7 +6633,7 @@ static void config_maybe_load_geoip_files_(const or_options_t *options, const or_options_t *old_options) { - /* XXXX Reload GeoIPFile on SIGHUP. -NM */ + /* XXXX024 Reload GeoIPFile on SIGHUP. -NM */ if (options->GeoIPFile && ((!old_options || !opt_streq(old_options->GeoIPFile, @@ -8401,14 +6654,11 @@ config_maybe_load_geoip_files_(const or_options_t *options, * in cookie_out. * Then write it down to fname and prepend it with header. * - * If group_readable is set, set fname to be readable - * by the default GID. - * * If the whole procedure was successful, set * cookie_is_set_out to True. */ int init_cookie_authentication(const char *fname, const char *header, - int cookie_len, int group_readable, + int cookie_len, uint8_t **cookie_out, int *cookie_is_set_out) { char cookie_file_str_len = strlen(header) + cookie_len; @@ -8430,7 +6680,8 @@ init_cookie_authentication(const char *fname, const char *header, /* Generate the cookie */ *cookie_out = tor_malloc(cookie_len); - crypto_rand((char *)*cookie_out, cookie_len); + if (crypto_rand((char *)*cookie_out, cookie_len) < 0) + goto done; /* Create the string that should be written on the file. */ memcpy(cookie_file_str, header, strlen(header)); @@ -8440,16 +6691,6 @@ init_cookie_authentication(const char *fname, const char *header, goto done; } -#ifndef _WIN32 - if (group_readable) { - if (chmod(fname, 0640)) { - log_warn(LD_FS,"Unable to make %s group-readable.", escaped(fname)); - } - } -#else /* !(!defined(_WIN32)) */ - (void) group_readable; -#endif /* !defined(_WIN32) */ - /* Success! */ log_info(LD_GENERAL, "Generated auth cookie file in '%s'.", escaped(fname)); *cookie_is_set_out = 1; diff --git a/src/tor/config.h b/src/tor/config.h new file mode 100644 index 000000000..8ee2a4572 --- /dev/null +++ b/src/tor/config.h @@ -0,0 +1,144 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file config.h + * \brief Header file for config.c. + **/ + +#ifndef TOR_CONFIG_H +#define TOR_CONFIG_H + +const char *get_dirportfrontpage(void); +const or_options_t *get_options(void); +or_options_t *get_options_mutable(void); +int set_options(or_options_t *new_val, char **msg); +void config_free_all(void); +const char *safe_str_client(const char *address); +const char *safe_str(const char *address); +const char *escaped_safe_str_client(const char *address); +const char *escaped_safe_str(const char *address); +const char *get_version(void); +const char *get_short_version(void); +setopt_err_t options_trial_assign(config_line_t *list, int use_defaults, + int clear_first, char **msg); + +uint32_t get_last_resolved_addr(void); +int resolve_my_address(int warn_severity, const or_options_t *options, + uint32_t *addr_out, + const char **method_out, char **hostname_out); +int is_local_addr(const tor_addr_t *addr); +void options_init(or_options_t *options); + +#define OPTIONS_DUMP_MINIMAL 1 +#define OPTIONS_DUMP_DEFAULTS 2 +#define OPTIONS_DUMP_ALL 3 +char *options_dump(const or_options_t *options, int how_to_dump); +int options_init_from_torrc(int argc, char **argv); +setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf, + int command, const char *command_arg, char **msg); +int option_is_recognized(const char *key); +const char *option_get_canonical_name(const char *key); +config_line_t *option_get_assignment(const or_options_t *options, + const char *key); +int options_save_current(void); +const char *get_torrc_fname(int defaults_fname); +char *options_get_datadir_fname2_suffix(const or_options_t *options, + const char *sub1, const char *sub2, + const char *suffix); +#define get_datadir_fname2_suffix(sub1, sub2, suffix) \ + options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix)) +/** Return a newly allocated string containing datadir/sub1. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL) +/** Return a newly allocated string containing datadir/sub1/sub2. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname2(sub1,sub2) \ + get_datadir_fname2_suffix((sub1), (sub2), NULL) +/** Return a newly allocated string containing datadir/sub1suffix. See + * get_datadir_fname2_suffix. */ +#define get_datadir_fname_suffix(sub1, suffix) \ + get_datadir_fname2_suffix((sub1), NULL, (suffix)) + +int check_or_create_data_subdir(const char *subdir); +int write_to_data_subdir(const char* subdir, const char* fname, + const char* str, const char* descr); + +int get_num_cpus(const or_options_t *options); + +const smartlist_t *get_configured_ports(void); +int get_first_advertised_port_by_type_af(int listener_type, + int address_family); +#define get_primary_or_port() \ + (get_first_advertised_port_by_type_af(CONN_TYPE_OR_LISTENER, AF_INET)) +#define get_primary_dir_port() \ + (get_first_advertised_port_by_type_af(CONN_TYPE_DIR_LISTENER, AF_INET)) + +char *get_first_listener_addrport_string(int listener_type); + +int options_need_geoip_info(const or_options_t *options, + const char **reason_out); + +smartlist_t *get_list_of_ports_to_forward(void); + +int getinfo_helper_config(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); + +const char *tor_get_digests(void); +uint32_t get_effective_bwrate(const or_options_t *options); +uint32_t get_effective_bwburst(const or_options_t *options); + +char *get_transport_bindaddr_from_config(const char *transport); + +int init_cookie_authentication(const char *fname, const char *header, + int cookie_len, + uint8_t **cookie_out, int *cookie_is_set_out); + +or_options_t *options_new(void); + +int config_parse_commandline(int argc, char **argv, int ignore_errors, + config_line_t **result, + config_line_t **cmdline_result); + +void config_register_addressmaps(const or_options_t *options); +/* XXXX024 move to connection_edge.h */ +int addressmap_register_auto(const char *from, const char *to, + time_t expires, + addressmap_entry_source_t addrmap_source, + const char **msg); + +/** Represents the information stored in a torrc Bridge line. */ +typedef struct bridge_line_t { + tor_addr_t addr; /* The IP address of the bridge. */ + uint16_t port; /* The TCP port of the bridge. */ + char *transport_name; /* The name of the pluggable transport that + should be used to connect to the bridge. */ + char digest[DIGEST_LEN]; /* The bridge's identity key digest. */ + smartlist_t *socks_args; /* SOCKS arguments for the pluggable + transport proxy. */ +} bridge_line_t; + +void bridge_line_free(bridge_line_t *bridge_line); +bridge_line_t *parse_bridge_line(const char *line); +smartlist_t *get_options_from_transport_options_line(const char *line, + const char *transport); +smartlist_t *get_options_for_server_transport(const char *transport); + +#ifdef CONFIG_PRIVATE +#ifdef TOR_UNIT_TESTS +extern struct config_format_t options_format; +#endif + +STATIC void or_options_free(or_options_t *options); +STATIC int options_validate(or_options_t *old_options, + or_options_t *options, + or_options_t *default_options, + int from_setconf, char **msg); +#endif + +#endif + diff --git a/src/tor/config_codedigest.c b/src/tor/config_codedigest.c new file mode 100644 index 000000000..86d14bace --- /dev/null +++ b/src/tor/config_codedigest.c @@ -0,0 +1,13 @@ + +const char *tor_get_digests(void); + +/** Return a string describing the digest of the source files in src/or/ + */ +const char * +tor_get_digests(void) +{ + return "" +#include "or_sha1.i" + ; +} + diff --git a/src/tor/configure.ac b/src/tor/configure.ac deleted file mode 100644 index e471f8f91..000000000 --- a/src/tor/configure.ac +++ /dev/null @@ -1,2219 +0,0 @@ -dnl Copyright (c) 2001-2004, Roger Dingledine -dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -dnl Copyright (c) 2007-2017, The Tor Project, Inc. -dnl See LICENSE for licensing information - -AC_PREREQ([2.63]) -AC_INIT([tor],[0.3.3.0-alpha-dev]) -AC_CONFIG_SRCDIR([src/or/main.c]) -AC_CONFIG_MACRO_DIR([m4]) - -# "foreign" means we don't follow GNU package layout standards -# "1.11" means we require automake version 1.11 or newer -# "subdir-objects" means put .o files in the same directory as the .c files -AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects -Wall -Werror]) - -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -AC_CONFIG_HEADERS([orconfig.h]) - -AC_USE_SYSTEM_EXTENSIONS -AC_CANONICAL_HOST - -PKG_PROG_PKG_CONFIG - -if test -f "/etc/redhat-release"; then - if test -f "/usr/kerberos/include"; then - CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include" - fi -fi - -# Not a no-op; we want to make sure that CPPFLAGS is set before we use -# the += operator on it in src/or/Makefile.am -CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common" - -AC_ARG_ENABLE(openbsd-malloc, - AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD. Linux only])) -AC_ARG_ENABLE(static-openssl, - AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir])) -AC_ARG_ENABLE(static-libevent, - AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir])) -AC_ARG_ENABLE(static-zlib, - AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir])) -AC_ARG_ENABLE(static-tor, - AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir])) -AC_ARG_ENABLE(unittests, - AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!])) -AC_ARG_ENABLE(coverage, - AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build])) -AC_ARG_ENABLE(asserts-in-tests, - AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage])) -AC_ARG_ENABLE(system-torrc, - AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file])) -AC_ARG_ENABLE(libfuzzer, - AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer'])) -AC_ARG_ENABLE(oss-fuzz, - AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment])) -AC_ARG_ENABLE(memory-sentinels, - AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.])) -AC_ARG_ENABLE(rust, - AS_HELP_STRING(--enable-rust, [enable rust integration])) -AC_ARG_ENABLE(cargo-online-mode, - AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.])) - -if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then - AC_MSG_ERROR([Can't disable assertions outside of coverage build]) -fi - -AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno") -AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes") -AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno") -AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes") -AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes") -AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes") - -if test "$enable_static_tor" = "yes"; then - enable_static_libevent="yes"; - enable_static_openssl="yes"; - enable_static_zlib="yes"; - CFLAGS="$CFLAGS -static" -fi - -if test "$enable_system_torrc" = "no"; then - AC_DEFINE(DISABLE_SYSTEM_TORRC, 1, - [Defined if we're not going to look for a torrc in SYSCONF]) -fi - -if test "$enable_memory_sentinels" = "no"; then - AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1, - [Defined if we're turning off memory safety code to look for bugs]) -fi - -AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes") - -AC_ARG_ENABLE(asciidoc, - AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]), - [case "${enableval}" in - "yes") asciidoc=true ;; - "no") asciidoc=false ;; - *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;; - esac], [asciidoc=true]) - -# systemd notify support -AC_ARG_ENABLE(systemd, - AS_HELP_STRING(--enable-systemd, [enable systemd notification support]), - [case "${enableval}" in - "yes") systemd=true ;; - "no") systemd=false ;; - * ) AC_MSG_ERROR(bad value for --enable-systemd) ;; - esac], [systemd=auto]) - - - -# systemd support -if test "x$enable_systemd" = "xno"; then - have_systemd=no; -else - PKG_CHECK_MODULES(SYSTEMD, - [libsystemd-daemon], - have_systemd=yes, - have_systemd=no) - if test "x$have_systemd" = "xno"; then - AC_MSG_NOTICE([Okay, checking for systemd a different way...]) - PKG_CHECK_MODULES(SYSTEMD, - [libsystemd], - have_systemd=yes, - have_systemd=no) - fi -fi - -if test "x$have_systemd" = "xyes"; then - AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd]) - TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}" - TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}" - PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209], - [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], []) -fi -AC_SUBST(TOR_SYSTEMD_CFLAGS) -AC_SUBST(TOR_SYSTEMD_LIBS) - -if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then - AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found]) -fi - -case "$host" in - *-*-solaris* ) - AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h]) - ;; -esac - -AC_ARG_ENABLE(gcc-warnings, - AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings])) -AC_ARG_ENABLE(fatal-warnings, - AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.])) -AC_ARG_ENABLE(gcc-warnings-advisory, - AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings])) - -dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows -AC_ARG_ENABLE(gcc-hardening, - AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks])) - -dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat. -AC_ARG_ENABLE(expensive-hardening, - AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower])) -AC_ARG_ENABLE(fragile-hardening, - AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower])) -if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then - fragile_hardening="yes" -fi - -dnl Linker hardening options -dnl Currently these options are ELF specific - you can't use this with MacOSX -AC_ARG_ENABLE(linker-hardening, - AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups])) - -AC_ARG_ENABLE(local-appdata, - AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows])) -if test "$enable_local_appdata" = "yes"; then - AC_DEFINE(ENABLE_LOCAL_APPDATA, 1, - [Defined if we default to host local appdata paths on Windows]) -fi - -# Tor2web mode flag -AC_ARG_ENABLE(tor2web-mode, - AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]), -[if test "x$enableval" = "xyes"; then - CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1" -fi]) - -AC_ARG_ENABLE(tool-name-check, - AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling])) - -AC_ARG_ENABLE(seccomp, - AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp])) - -AC_ARG_ENABLE(libscrypt, - AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt])) - -dnl Enable event tracing which are transformed to debug log statement. -AC_ARG_ENABLE(event-tracing-debug, - AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log])) -AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"]) - -if test x$enable_event_tracing_debug = xyes; then - AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug]) - AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation]) -fi - -dnl Enable Android only features. -AC_ARG_ENABLE(android, - AS_HELP_STRING(--enable-android, [build with Android features enabled])) -AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"]) - -if test "x$enable_android" = "xyes"; then - AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled]) - - dnl Check if the Android log library is available. - AC_CHECK_HEADERS([android/log.h]) - AC_SEARCH_LIBS(__android_log_write, [log]) - -fi - -dnl check for the correct "ar" when cross-compiling. -dnl (AM_PROG_AR was new in automake 1.11.2, which we do not yet require, -dnl so kludge up a replacement for the case where it isn't there yet.) -m4_ifdef([AM_PROG_AR], - [AM_PROG_AR], - [AN_MAKEVAR([AR], [AC_PROG_AR]) - AN_PROGRAM([ar], [AC_PROG_AR]) - AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])]) - AC_PROG_AR]) - -dnl Check whether the above macro has settled for a simply named tool even -dnl though we're cross compiling. We must do this before running AC_PROG_CC, -dnl because that will find any cc on the system, not only the cross-compiler, -dnl and then verify that a binary built with this compiler runs on the -dnl build system. It will then come to the false conclusion that we're not -dnl cross-compiling. -if test "x$enable_tool_name_check" != "xno"; then - if test "x$ac_tool_warned" = "xyes"; then - AC_MSG_ERROR([We are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)]) - elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then - AC_MSG_ERROR([We think we are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)]) - fi -fi - -AC_PROG_CC -AC_PROG_CPP -AC_PROG_MAKE_SET -AC_PROG_RANLIB -AC_PROG_SED - -AC_ARG_VAR([PERL], [path to Perl binary]) -AC_CHECK_PROGS([PERL], [perl]) -AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"]) - -dnl check for asciidoc and a2x -AC_PATH_PROG([ASCIIDOC], [asciidoc], none) -AC_PATH_PROGS([A2X], [a2x a2x.py], none) - -AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue") - -AM_PROG_CC_C_O -AC_PROG_CC_C99 - -AC_ARG_VAR([PYTHON], [path to Python binary]) -AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3]) -if test "x$PYTHON" = "x"; then - AC_MSG_WARN([Python unavailable; some tests will not be run.]) -fi -AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"]) - -dnl List all external rust crates we depend on here. Include the version -rust_crates="libc-0.2.22" -AC_SUBST(rust_crates) - -ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [ -AC_C_FLEXIBLE_ARRAY_MEMBER -], [ - dnl Maybe we've got an old autoconf... - AC_CACHE_CHECK([for flexible array members], - tor_cv_c_flexarray, - [AC_COMPILE_IFELSE( - AC_LANG_PROGRAM([ - struct abc { int a; char b[]; }; -], [ - struct abc *def = malloc(sizeof(struct abc)+sizeof(char)); - def->b[0] = 33; -]), - [tor_cv_c_flexarray=yes], - [tor_cv_c_flexarray=no])]) - if test "$tor_cv_flexarray" = "yes"; then - AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.]) - else - AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.]) - fi -]) - -AC_CACHE_CHECK([for working C99 mid-block declaration syntax], - tor_cv_c_c99_decl, - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])], - [tor_cv_c_c99_decl=yes], - [tor_cv_c_c99_decl=no] )]) -if test "$tor_cv_c_c99_decl" != "yes"; then - AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x]) -fi - -AC_CACHE_CHECK([for working C99 designated initializers], - tor_cv_c_c99_designated_init, - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([struct s { int a; int b; };], - [[ struct s ss = { .b = 5, .a = 6 }; ]])], - [tor_cv_c_c99_designated_init=yes], - [tor_cv_c_c99_designated_init=no] )]) - -if test "$tor_cv_c_c99_designated_init" != "yes"; then - AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x]) -fi - -TORUSER=_tor -AC_ARG_WITH(tor-user, - AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]), - [ - TORUSER=$withval - ] -) -AC_SUBST(TORUSER) - -TORGROUP=_tor -AC_ARG_WITH(tor-group, - AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]), - [ - TORGROUP=$withval - ] -) -AC_SUBST(TORGROUP) - - -dnl If _WIN32 is defined and non-zero, we are building for win32 -AC_MSG_CHECKING([for win32]) -AC_RUN_IFELSE([AC_LANG_SOURCE([ -int main(int c, char **v) { -#ifdef _WIN32 -#if _WIN32 - return 0; -#else - return 1; -#endif -#else - return 2; -#endif -}])], -bwin32=true; AC_MSG_RESULT([yes]), -bwin32=false; AC_MSG_RESULT([no]), -bwin32=cross; AC_MSG_RESULT([cross]) -) - -if test "$bwin32" = "cross"; then -AC_MSG_CHECKING([for win32 (cross)]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#ifdef _WIN32 -int main(int c, char **v) {return 0;} -#else -#error -int main(int c, char **v) {return x(y);} -#endif -])], -bwin32=true; AC_MSG_RESULT([yes]), -bwin32=false; AC_MSG_RESULT([no])) -fi - -AH_BOTTOM([ -#ifdef _WIN32 -/* Defined to access windows functions and definitions for >=WinXP */ -# ifndef WINVER -# define WINVER 0x0501 -# endif - -/* Defined to access _other_ windows functions and definitions for >=WinXP */ -# ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0501 -# endif - -/* Defined to avoid including some windows headers as part of Windows.h */ -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -#endif -]) - - -AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue") -AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue") - -dnl Enable C99 when compiling with MIPSpro -AC_MSG_CHECKING([for MIPSpro compiler]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [ -#if (defined(__sgi) && defined(_COMPILER_VERSION)) -#error - return x(y); -#endif -])], -bmipspro=false; AC_MSG_RESULT(no), -bmipspro=true; AC_MSG_RESULT(yes)) - -if test "$bmipspro" = "true"; then - CFLAGS="$CFLAGS -c99" -fi - -AC_C_BIGENDIAN - -if test "x$enable_rust" = "xyes"; then - AC_ARG_VAR([RUSTC], [path to the rustc binary]) - AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no]) - if test "x$RUSTC" = "xno"; then - AC_MSG_ERROR([rustc unavailable but rust integration requested.]) - fi - - AC_ARG_VAR([CARGO], [path to the cargo binary]) - AC_CHECK_PROG([CARGO], [cargo], [cargo],[no]) - if test "x$CARGO" = "xno"; then - AC_MSG_ERROR([cargo unavailable but rust integration requested.]) - fi - - AC_DEFINE([HAVE_RUST], 1, [have Rust]) - if test "x$enable_cargo_online_mode" = "xyes"; then - CARGO_ONLINE= - RUST_DL=# - else - CARGO_ONLINE=--frozen - RUST_DL= - - dnl When we're not allowed to touch the network, we need crate dependencies - dnl locally available. - AC_MSG_CHECKING([rust crate dependencies]) - AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror]) - if test "x$TOR_RUST_DEPENDENCIES" = "x"; then - TOR_RUST_DEPENDENCIES="$srcdir/src/ext/rust/" - NEED_MOD=1 - fi - if test ! -d "$TOR_RUST_DEPENDENCIES"; then - AC_MSG_ERROR([Rust dependency directory $TOR_RUST_DEPENDENCIES does not exist. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.]) - ERRORED=1 - fi - for dep in $rust_crates; do - if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then - AC_MSG_ERROR([Failure to find rust dependency $TOR_RUST_DEPENDENCIES/$dep. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.]) - ERRORED=1 - fi - done - if test "x$NEED_MOD" = "x1"; then - dnl When looking for dependencies from cargo, pick right directory - TOR_RUST_DEPENDENCIES="../../src/ext/rust" - fi - if test "x$ERRORED" = "x"; then - AC_MSG_RESULT([yes]) - fi - fi - - dnl For now both MSVC and MinGW rust libraries will output static libs with - dnl the MSVC naming convention. - if test "$bwin32" = "true"; then - TOR_RUST_STATIC_NAME=tor_rust.lib - else - TOR_RUST_STATIC_NAME=libtor_rust.a - fi - - AC_SUBST(TOR_RUST_STATIC_NAME) - AC_SUBST(CARGO_ONLINE) - AC_SUBST(RUST_DL) - - dnl Let's check the rustc version, too - AC_MSG_CHECKING([rust version]) - RUSTC_VERSION=`$RUSTC --version` - RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1` - RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2` - if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then - AC_MSG_ERROR([rustc version couldn't be identified]) - fi - if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 14; then - AC_MSG_ERROR([rustc must be at least version 1.14]) - fi - AC_MSG_RESULT([$RUSTC_VERSION]) -fi - -AC_SEARCH_LIBS(socket, [socket network]) -AC_SEARCH_LIBS(gethostbyname, [nsl]) -AC_SEARCH_LIBS(dlopen, [dl]) -AC_SEARCH_LIBS(inet_aton, [resolv]) -AC_SEARCH_LIBS(backtrace, [execinfo]) -saved_LIBS="$LIBS" -AC_SEARCH_LIBS([clock_gettime], [rt]) -if test "$LIBS" != "$saved_LIBS"; then - # Looks like we need -lrt for clock_gettime(). - have_rt=yes -fi - -AC_SEARCH_LIBS(pthread_create, [pthread]) -AC_SEARCH_LIBS(pthread_detach, [pthread]) - -AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true") -AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false") - -AC_CHECK_FUNCS( - _NSGetEnviron \ - RtlSecureZeroMemory \ - SecureZeroMemory \ - accept4 \ - backtrace \ - backtrace_symbols_fd \ - eventfd \ - explicit_bzero \ - timingsafe_memcmp \ - flock \ - ftime \ - get_current_dir_name \ - getaddrinfo \ - getifaddrs \ - getpass \ - getrlimit \ - gettimeofday \ - gmtime_r \ - gnu_get_libc_version \ - htonll \ - inet_aton \ - ioctl \ - issetugid \ - llround \ - localtime_r \ - lround \ - mach_approximate_time \ - memmem \ - memset_s \ - pipe \ - pipe2 \ - prctl \ - readpassphrase \ - rint \ - sigaction \ - socketpair \ - statvfs \ - strlcat \ - strlcpy \ - strnlen \ - strptime \ - strtok_r \ - strtoull \ - sysconf \ - sysctl \ - truncate \ - uname \ - usleep \ - vasprintf \ - _vscprintf -) - -# Apple messed up when they added two functions functions in Sierra: they -# forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION -# checks. So we should only probe for those functions if we are sure that we -# are not targetting OSX 10.11 or earlier. -AC_MSG_CHECKING([for a pre-Sierra OSX build target]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#ifdef __APPLE__ -# include -# ifndef MAC_OS_X_VERSION_10_12 -# define MAC_OS_X_VERSION_10_12 101200 -# endif -# if defined(MAC_OS_X_VERSION_MIN_REQUIRED) -# if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 -# error "Running on Mac OSX 10.11 or earlier" -# endif -# endif -#endif -]], [[]])], - [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])], - [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])]) - -if test "$on_macos_pre_10_12" = "no"; then - AC_CHECK_FUNCS( - clock_gettime \ - getentropy \ - ) -fi - -if test "$bwin32" != "true"; then - AC_CHECK_HEADERS(pthread.h) - AC_CHECK_FUNCS(pthread_create) - AC_CHECK_FUNCS(pthread_condattr_setclock) -fi - -if test "$bwin32" = "true"; then - AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [ -#include -#include -#include - ]) -fi - -AM_CONDITIONAL(BUILD_READPASSPHRASE_C, - test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false") - -dnl ------------------------------------------------------ -dnl Where do you live, libevent? And how do we call you? - -if test "$bwin32" = "true"; then - TOR_LIB_WS32=-lws2_32 - TOR_LIB_IPHLPAPI=-liphlpapi - # Some of the cargo-cults recommend -lwsock32 as well, but I don't - # think it's actually necessary. - TOR_LIB_GDI=-lgdi32 - TOR_LIB_USERENV=-luserenv -else - TOR_LIB_WS32= - TOR_LIB_GDI= - TOR_LIB_USERENV= -fi -AC_SUBST(TOR_LIB_WS32) -AC_SUBST(TOR_LIB_GDI) -AC_SUBST(TOR_LIB_IPHLPAPI) -AC_SUBST(TOR_LIB_USERENV) - -tor_libevent_pkg_redhat="libevent" -tor_libevent_pkg_debian="libevent-dev" -tor_libevent_devpkg_redhat="libevent-devel" -tor_libevent_devpkg_debian="libevent-dev" - -dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent -dnl linking for static builds. -STATIC_LIBEVENT_FLAGS="" -if test "$enable_static_libevent" = "yes"; then - if test "$have_rt" = "yes"; then - STATIC_LIBEVENT_FLAGS=" -lrt " - fi -fi - -TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [ -#ifdef _WIN32 -#include -#endif -#include -#include -#include ], [ -#ifdef _WIN32 -#include -#endif -struct event_base; -struct event_base *event_base_new(void);], - [ -#ifdef _WIN32 -{WSADATA d; WSAStartup(0x101,&d); } -#endif -event_base_free(event_base_new()); -], [--with-libevent-dir], [/opt/libevent]) - -dnl Determine the incantation needed to link libevent. -save_LIBS="$LIBS" -save_LDFLAGS="$LDFLAGS" -save_CPPFLAGS="$CPPFLAGS" - -LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS" -LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS" -CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS" - -AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h) - -if test "$enable_static_libevent" = "yes"; then - if test "$tor_cv_library_libevent_dir" = "(system)"; then - AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent") - else - TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS" - fi -else - if test "x$ac_cv_header_event2_event_h" = "xyes"; then - AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new")) - AC_SEARCH_LIBS(evdns_base_new, [event event_extra], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for evdns_base_new")) - - if test "$ac_cv_search_event_new" != "none required"; then - TOR_LIBEVENT_LIBS="$ac_cv_search_event_new" - fi - if test "$ac_cv_search_evdns_base_new" != "none required"; then - TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS" - fi - else - AC_MSG_ERROR("libevent2 is required but the headers could not be found") - fi -fi - -dnl Now check for particular libevent functions. -AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \ - evutil_secure_rng_add_bytes \ -]) - -LIBS="$save_LIBS" -LDFLAGS="$save_LDFLAGS" -CPPFLAGS="$save_CPPFLAGS" - -dnl Check that libevent is at least at version 2.0.10, the first stable -dnl release of its series -CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent" -AC_MSG_CHECKING([whether Libevent is new enough]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#include -#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00 -#error -int x = y(zz); -#else -int x = 1; -#endif -])], [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] ) - -LIBS="$save_LIBS" -LDFLAGS="$save_LDFLAGS" -CPPFLAGS="$save_CPPFLAGS" - -AC_SUBST(TOR_LIBEVENT_LIBS) - -dnl ------------------------------------------------------ -dnl Where do you live, libm? - -dnl On some platforms (Haiku/BeOS) the math library is -dnl part of libroot. In which case don't link against lm -TOR_LIB_MATH="" -save_LIBS="$LIBS" -AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.])) -if test "$ac_cv_search_pow" != "none required"; then - TOR_LIB_MATH="$ac_cv_search_pow" -fi -LIBS="$save_LIBS" -AC_SUBST(TOR_LIB_MATH) - -dnl ------------------------------------------------------ -dnl Where do you live, openssl? And how do we call you? - -tor_openssl_pkg_redhat="openssl" -tor_openssl_pkg_debian="libssl-dev" -tor_openssl_devpkg_redhat="openssl-devel" -tor_openssl_devpkg_debian="libssl-dev" - -ALT_openssl_WITHVAL="" -AC_ARG_WITH(ssl-dir, - AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]), - [ - if test "x$withval" != "xno" && test "x$withval" != "x"; then - ALT_openssl_WITHVAL="$withval" - fi - ]) - -AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1]) -TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32], - [#include ], - [struct ssl_method_st; const struct ssl_method_st *TLSv1_1_method(void);], - [TLSv1_1_method();], [], - [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl]) - -dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay() - -if test "$enable_static_openssl" = "yes"; then - if test "$tor_cv_library_openssl_dir" = "(system)"; then - AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl") - else - TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a" - fi -else - TOR_OPENSSL_LIBS="-lssl -lcrypto" -fi -AC_SUBST(TOR_OPENSSL_LIBS) - -dnl Now check for particular openssl functions. -save_LIBS="$LIBS" -save_LDFLAGS="$LDFLAGS" -save_CPPFLAGS="$CPPFLAGS" -LIBS="$TOR_OPENSSL_LIBS $LIBS" -LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS" -CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS" - -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL -#error "too old" -#endif - ]], [[]])], - [ : ], - [ AC_MSG_ERROR([OpenSSL is too old. We require 1.0.1 or later. You can specify a path to a newer one with --with-openssl-dir.]) ]) - -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -#if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA) -#error "no ECC" -#endif -#if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1) -#error "curves unavailable" -#endif - ]], [[]])], - [ : ], - [ AC_MSG_ERROR([OpenSSL is built without full ECC support, including curves P256 and P224. You can specify a path to one with ECC support with --with-openssl-dir.]) ]) - -AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , , -[#include -]) - -AC_CHECK_FUNCS([ \ - SSL_SESSION_get_master_key \ - SSL_get_server_random \ - SSL_get_client_ciphers \ - SSL_get_client_random \ - SSL_CIPHER_find \ - TLS_method - ]) - -dnl Check if OpenSSL has scrypt implementation. -AC_CHECK_FUNCS([ EVP_PBE_scrypt ]) - -dnl Check if OpenSSL structures are opaque -AC_CHECK_MEMBERS([SSL.state], , , -[#include -]) - -dnl Define the set of checks for KIST scheduler support. -AC_DEFUN([CHECK_KIST_SUPPORT],[ - dnl KIST needs struct tcp_info and for certain members to exist. - AC_CHECK_MEMBERS( - [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss], - , ,[[#include ]]) - dnl KIST needs SIOCOUTQNSD to exist for an ioctl call. - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ - #include - #ifndef SIOCOUTQNSD - #error - #endif - ])], have_siocoutqnsd=yes, have_siocoutqnsd=no) - if test "x$have_siocoutqnsd" = "xyes"; then - if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then - if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then - have_kist_support=yes - fi - fi - fi -]) -dnl Now, trigger the check. -CHECK_KIST_SUPPORT -AS_IF([test "x$have_kist_support" = "xyes"], - [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported - on this system])], - [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])]) - -LIBS="$save_LIBS" -LDFLAGS="$save_LDFLAGS" -CPPFLAGS="$save_CPPFLAGS" - -dnl ------------------------------------------------------ -dnl Where do you live, zlib? And how do we call you? - -tor_zlib_pkg_redhat="zlib" -tor_zlib_pkg_debian="zlib1g" -tor_zlib_devpkg_redhat="zlib-devel" -tor_zlib_devpkg_debian="zlib1g-dev" - -TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz], - [#include ], - [const char * zlibVersion(void);], - [zlibVersion();], [--with-zlib-dir], - [/opt/zlib]) - -if test "$enable_static_zlib" = "yes"; then - if test "$tor_cv_library_zlib_dir" = "(system)"; then - AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when - using --enable-static-zlib") - else - TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a" - fi -else - TOR_ZLIB_LIBS="-lz" -fi -AC_SUBST(TOR_ZLIB_LIBS) - -dnl ------------------------------------------------------ -dnl Where we do we find lzma? - -AC_ARG_ENABLE(lzma, - AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]), - [case "${enableval}" in - "yes") lzma=true ;; - "no") lzma=false ;; - * ) AC_MSG_ERROR(bad value for --enable-lzma) ;; - esac], [lzma=auto]) - -if test "x$enable_lzma" = "xno"; then - have_lzma=no; -else - PKG_CHECK_MODULES([LZMA], - [liblzma], - have_lzma=yes, - have_lzma=no) - - if test "x$have_lzma" = "xno" ; then - AC_MSG_WARN([Unable to find liblzma.]) - fi -fi - -if test "x$have_lzma" = "xyes"; then - AC_DEFINE(HAVE_LZMA,1,[Have LZMA]) - TOR_LZMA_CFLAGS="${LZMA_CFLAGS}" - TOR_LZMA_LIBS="${LZMA_LIBS}" -fi -AC_SUBST(TOR_LZMA_CFLAGS) -AC_SUBST(TOR_LZMA_LIBS) - -dnl ------------------------------------------------------ -dnl Where we do we find zstd? - -AC_ARG_ENABLE(zstd, - AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]), - [case "${enableval}" in - "yes") zstd=true ;; - "no") zstd=false ;; - * ) AC_MSG_ERROR(bad value for --enable-zstd) ;; - esac], [zstd=auto]) - -if test "x$enable_zstd" = "xno"; then - have_zstd=no; -else - PKG_CHECK_MODULES([ZSTD], - [libzstd >= 1.1], - have_zstd=yes, - have_zstd=no) - - if test "x$have_zstd" = "xno" ; then - AC_MSG_WARN([Unable to find libzstd.]) - fi -fi - -if test "x$have_zstd" = "xyes"; then - AC_DEFINE(HAVE_ZSTD,1,[Have Zstd]) - TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}" - TOR_ZSTD_LIBS="${ZSTD_LIBS}" -fi -AC_SUBST(TOR_ZSTD_CFLAGS) -AC_SUBST(TOR_ZSTD_LIBS) - -dnl ---------------------------------------------------------------------- -dnl Check if libcap is available for capabilities. - -tor_cap_pkg_debian="libcap2" -tor_cap_pkg_redhat="libcap" -tor_cap_devpkg_debian="libcap-dev" -tor_cap_devpkg_redhat="libcap-devel" - -AC_CHECK_LIB([cap], [cap_init], [], - AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.]) -) -AC_CHECK_FUNCS(cap_set_proc) - -dnl --------------------------------------------------------------------- -dnl Now that we know about our major libraries, we can check for compiler -dnl and linker hardening options. We need to do this with the libraries known, -dnl since sometimes the linker will like an option but not be willing to -dnl use it with a build of a library. - -all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent" -all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_LIB_USERENV $TOR_CAP_LIBS" - -CFLAGS_FTRAPV= -CFLAGS_FWRAPV= -CFLAGS_ASAN= -CFLAGS_UBSAN= - - -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ -#if !defined(__clang__) -#error -#endif])], have_clang=yes, have_clang=no) - -if test "x$enable_gcc_hardening" != "xno"; then - CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" - if test "x$have_clang" = "xyes"; then - TOR_CHECK_CFLAGS(-Qunused-arguments) - fi - TOR_CHECK_CFLAGS(-fstack-protector-all, also_link) - AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all]) - AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all]) -m4_ifdef([AS_VAR_IF],[ - AS_VAR_IF(can_compile, [yes], - AS_VAR_IF(can_link, [yes], - [], - AC_MSG_ERROR([We tried to build with stack protection; it looks like your compiler supports it but your libc does not provide it. Are you missing libssp? (You can --disable-gcc-hardening to ignore this error.)])) - )]) - AS_VAR_POPDEF([can_link]) - AS_VAR_POPDEF([can_compile]) - TOR_CHECK_CFLAGS(-Wstack-protector) - TOR_CHECK_CFLAGS(--param ssp-buffer-size=1) - if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then - TOR_CHECK_CFLAGS(-fPIE) - TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check") - fi - TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true) -fi - -if test "$fragile_hardening" = "yes"; then - TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true) - if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then - AC_MSG_WARN([The compiler supports -ftrapv, but for some reason I was not able to link with -ftrapv. Are you missing run-time support? Run-time hardening will not work as well as it should.]) - fi - - if test "$tor_cv_cflags__ftrapv" != "yes"; then - AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.]) - fi - - TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true) - if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then - AC_MSG_ERROR([The compiler supports -fsanitize=address, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libubsan.*, and with Clang you need libclang_rt.ubsan*]) - fi - - TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true) - if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then - AC_MSG_ERROR([The compiler supports -fsanitize=undefined, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libasan.*, and with Clang you need libclang_rt.ubsan*]) - fi - -TOR_CHECK_CFLAGS([-fno-omit-frame-pointer]) -fi - -CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN" -CFLAGS_CONSTTIME="$CFLAGS_FWRAPV" - -mulodi_fixes_ftrapv=no -if test "$have_clang" = "yes"; then - saved_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $CFLAGS_FTRAPV" - AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply]) - AC_LINK_IFELSE([ - AC_LANG_SOURCE([[ - #include - #include - int main(int argc, char **argv) - { - int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2]) - * (int64_t)atoi(argv[3]); - return x == 9; - } ]])], - [ftrapv_can_link=yes; AC_MSG_RESULT([yes])], - [ftrapv_can_link=no; AC_MSG_RESULT([no])]) - if test "$ftrapv_can_link" = "no"; then - AC_MSG_CHECKING([whether defining __mulodi4 fixes that]) - AC_LINK_IFELSE([ - AC_LANG_SOURCE([[ - #include - #include - int64_t __mulodi4(int64_t a, int64_t b, int *overflow) { - *overflow=0; - return a; - } - int main(int argc, char **argv) - { - int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2]) - * (int64_t)atoi(argv[3]); - return x == 9; - } ]])], - [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])], - [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])]) - fi - CFLAGS="$saved_CFLAGS" -fi - -AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes") - -dnl These cflags add bunches of branches, and we haven't been able to -dnl persuade ourselves that they're suitable for code that needs to be -dnl constant time. -AC_SUBST(CFLAGS_BUGTRAP) -dnl These cflags are variant ones sutable for code that needs to be -dnl constant-time. -AC_SUBST(CFLAGS_CONSTTIME) - -if test "x$enable_linker_hardening" != "xno"; then - TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check") -fi - -# For backtrace support -TOR_CHECK_LDFLAGS(-rdynamic) - -dnl ------------------------------------------------------ -dnl Now see if we have a -fomit-frame-pointer compiler option. - -saved_CFLAGS="$CFLAGS" -TOR_CHECK_CFLAGS(-fomit-frame-pointer) -F_OMIT_FRAME_POINTER='' -if test "$saved_CFLAGS" != "$CFLAGS"; then - if test "$fragile_hardening" = "yes"; then - F_OMIT_FRAME_POINTER='-fomit-frame-pointer' - fi -fi -CFLAGS="$saved_CFLAGS" -AC_SUBST(F_OMIT_FRAME_POINTER) - -dnl ------------------------------------------------------ -dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it -dnl for us, as GCC 4.6 and later do at many optimization levels), then -dnl we should try to add -fasynchronous-unwind-tables so that our backtrace -dnl code will work. -TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables) - -dnl ============================================================ -dnl Check for libseccomp - -if test "x$enable_seccomp" != "xno"; then - AC_CHECK_HEADERS([seccomp.h]) - AC_SEARCH_LIBS(seccomp_init, [seccomp]) -fi - -dnl ============================================================ -dnl Check for libscrypt - -if test "x$enable_libscrypt" != "xno"; then - AC_CHECK_HEADERS([libscrypt.h]) - AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt]) - AC_CHECK_FUNCS([libscrypt_scrypt]) -fi - -dnl ============================================================ -dnl We need an implementation of curve25519. - -dnl set these defaults. -build_curve25519_donna=no -build_curve25519_donna_c64=no -use_curve25519_donna=no -use_curve25519_nacl=no -CURVE25519_LIBS= - -dnl The best choice is using curve25519-donna-c64, but that requires -dnl that we -AC_CACHE_CHECK([whether we can use curve25519-donna-c64], - tor_cv_can_use_curve25519_donna_c64, - [AC_RUN_IFELSE( - [AC_LANG_PROGRAM([dnl - #include - typedef unsigned uint128_t __attribute__((mode(TI))); - int func(uint64_t a, uint64_t b) { - uint128_t c = ((uint128_t)a) * b; - int ok = ((uint64_t)(c>>96)) == 522859 && - (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L && - (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L && - (((uint64_t)(c))&0xffffffffL) == 0; - return ok; - } - ], [dnl - int ok = func( ((uint64_t)2000000000) * 1000000000, - ((uint64_t)1234567890) << 24); - return !ok; - ])], - [tor_cv_can_use_curve25519_donna_c64=yes], - [tor_cv_can_use_curve25519_donna_c64=no], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM([dnl - #include - typedef unsigned uint128_t __attribute__((mode(TI))); - int func(uint64_t a, uint64_t b) { - uint128_t c = ((uint128_t)a) * b; - int ok = ((uint64_t)(c>>96)) == 522859 && - (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L && - (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L && - (((uint64_t)(c))&0xffffffffL) == 0; - return ok; - } - ], [dnl - int ok = func( ((uint64_t)2000000000) * 1000000000, - ((uint64_t)1234567890) << 24); - return !ok; - ])], - [tor_cv_can_use_curve25519_donna_c64=cross], - [tor_cv_can_use_curve25519_donna_c64=no])])]) - -AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \ - nacl/crypto_scalarmult_curve25519.h]) - -AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation], - tor_cv_can_use_curve25519_nacl, - [tor_saved_LIBS="$LIBS" - LIBS="$LIBS -lnacl" - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([dnl - #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H - #include - #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H) - #include - #endif - #ifdef crypto_scalarmult_curve25519_ref_BYTES - #error Hey, this is the reference implementation! That's not fast. - #endif - ], [ - unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c); - ])], [tor_cv_can_use_curve25519_nacl=yes], - [tor_cv_can_use_curve25519_nacl=no]) - LIBS="$tor_saved_LIBS" ]) - - dnl Okay, now we need to figure out which one to actually use. Fall back - dnl to curve25519-donna.c - - if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then - build_curve25519_donna_c64=yes - use_curve25519_donna=yes - elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then - use_curve25519_nacl=yes - CURVE25519_LIBS=-lnacl - else - build_curve25519_donna=yes - use_curve25519_donna=yes - fi - -if test "x$use_curve25519_donna" = "xyes"; then - AC_DEFINE(USE_CURVE25519_DONNA, 1, - [Defined if we should use an internal curve25519_donna{,_c64} implementation]) -fi -if test "x$use_curve25519_nacl" = "xyes"; then - AC_DEFINE(USE_CURVE25519_NACL, 1, - [Defined if we should use a curve25519 from nacl]) -fi -AM_CONDITIONAL(BUILD_CURVE25519_DONNA, - test "x$build_curve25519_donna" = "xyes") -AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, - test "x$build_curve25519_donna_c64" = "xyes") -AC_SUBST(CURVE25519_LIBS) - -dnl Make sure to enable support for large off_t if available. -AC_SYS_LARGEFILE - -AC_CHECK_HEADERS([assert.h \ - errno.h \ - fcntl.h \ - signal.h \ - string.h \ - sys/capability.h \ - sys/fcntl.h \ - sys/stat.h \ - sys/time.h \ - sys/types.h \ - time.h \ - unistd.h \ - arpa/inet.h \ - crt_externs.h \ - execinfo.h \ - gnu/libc-version.h \ - grp.h \ - ifaddrs.h \ - inttypes.h \ - limits.h \ - linux/types.h \ - machine/limits.h \ - malloc.h \ - malloc/malloc.h \ - malloc_np.h \ - netdb.h \ - netinet/in.h \ - netinet/in6.h \ - pwd.h \ - readpassphrase.h \ - stdint.h \ - stdatomic.h \ - sys/eventfd.h \ - sys/file.h \ - sys/ioctl.h \ - sys/limits.h \ - sys/mman.h \ - sys/param.h \ - sys/prctl.h \ - sys/random.h \ - sys/resource.h \ - sys/select.h \ - sys/socket.h \ - sys/statvfs.h \ - sys/syscall.h \ - sys/sysctl.h \ - sys/syslimits.h \ - sys/time.h \ - sys/types.h \ - sys/un.h \ - sys/utime.h \ - sys/wait.h \ - syslog.h \ - utime.h]) - -AC_CHECK_HEADERS(sys/param.h) - -AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0, -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif]) -AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0, -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NET_IF_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif]) - -AC_CHECK_HEADERS(linux/if.h,[],[], -[ -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -]) - -AC_CHECK_HEADERS(linux/netfilter_ipv4.h, - linux_netfilter_ipv4=1, linux_netfilter_ipv4=0, -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_LIMITS_H -#include -#endif -#ifdef HAVE_LINUX_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif]) - -AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h, - linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0, -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_LIMITS_H -#include -#endif -#ifdef HAVE_LINUX_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_LINUX_IF_H -#include -#endif]) - -transparent_ok=0 -if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then - transparent_ok=1 -fi -if test "x$linux_netfilter_ipv4" = "x1"; then - transparent_ok=1 -fi -if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then - transparent_ok=1 -fi -if test "x$transparent_ok" = "x1"; then - AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support") -else - AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.]) -fi - -AC_CHECK_MEMBERS([struct timeval.tv_sec], , , -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_TIME_H -#include -#endif]) - -dnl In case we aren't given a working stdint.h, we'll need to grow our own. -dnl Watch out. - -AC_CHECK_SIZEOF(int8_t) -AC_CHECK_SIZEOF(int16_t) -AC_CHECK_SIZEOF(int32_t) -AC_CHECK_SIZEOF(int64_t) -AC_CHECK_SIZEOF(uint8_t) -AC_CHECK_SIZEOF(uint16_t) -AC_CHECK_SIZEOF(uint32_t) -AC_CHECK_SIZEOF(uint64_t) -AC_CHECK_SIZEOF(intptr_t) -AC_CHECK_SIZEOF(uintptr_t) - -dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t]) - -AC_CHECK_SIZEOF(char) -AC_CHECK_SIZEOF(short) -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(long) -AC_CHECK_SIZEOF(long long) -AC_CHECK_SIZEOF(__int64) -AC_CHECK_SIZEOF(void *) -AC_CHECK_SIZEOF(time_t) -AC_CHECK_SIZEOF(size_t) -AC_CHECK_SIZEOF(pid_t) - -AC_CHECK_TYPES([uint, u_char, ssize_t]) - -AC_PC_FROM_UCONTEXT([:]) - -dnl used to include sockaddr_storage, but everybody has that. -AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , , -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef _WIN32 -#define _WIN32_WINNT 0x0501 -#define WIN32_LEAN_AND_MEAN -#include -#include -#endif -]) -AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , , -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef _WIN32 -#define _WIN32_WINNT 0x0501 -#define WIN32_LEAN_AND_MEAN -#include -#include -#endif -]) - -AC_CHECK_TYPES([rlim_t], , , -[#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -]) - -AX_CHECK_SIGN([time_t], - [ : ], - [ : ], [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_TIME_H -#include -#endif -]) - -if test "$ax_cv_decl_time_t_signed" = "no"; then - AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.]) -fi - -AX_CHECK_SIGN([size_t], - [ tor_cv_size_t_signed=yes ], - [ tor_cv_size_t_signed=no ], [ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -]) - -if test "$ax_cv_decl_size_t_signed" = "yes"; then - AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.]) -fi - -AX_CHECK_SIGN([enum always], - [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ], - [ : ], [ - enum always { AAA, BBB, CCC }; -]) - -AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT() -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -]) - -# We want to make sure that we _don't_ have a cell_t defined, like IRIX does. - -AC_CHECK_SIZEOF(cell_t) - -# Now make sure that NULL can be represented as zero bytes. -AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero, -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[[#include -#include -#include -#ifdef HAVE_STDDEF_H -#include -#endif -int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2)); -return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])], - [tor_cv_null_is_zero=yes], - [tor_cv_null_is_zero=no], - [tor_cv_null_is_zero=cross])]) - -if test "$tor_cv_null_is_zero" = "cross"; then - # Cross-compiling; let's hope that the target isn't raving mad. - AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.]) -fi - -if test "$tor_cv_null_is_zero" != "no"; then - AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1, - [Define to 1 iff memset(0) sets pointers to NULL]) -fi - -AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero, -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[[#include -#include -#include -#ifdef HAVE_STDDEF_H -#include -#endif -int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2)); -return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])], - [tor_cv_dbl0_is_zero=yes], - [tor_cv_dbl0_is_zero=no], - [tor_cv_dbl0_is_zero=cross])]) - -if test "$tor_cv_dbl0_is_zero" = "cross"; then - # Cross-compiling; let's hope that the target isn't raving mad. - AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.]) -fi - -if test "$tor_cv_dbl0_is_zero" != "no"; then - AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1, - [Define to 1 iff memset(0) sets doubles to 0.0]) -fi - -# And what happens when we malloc zero? -AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works, -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[[#include -#include -#include -#ifdef HAVE_STDDEF_H -#include -#endif -int main () { return malloc(0)?0:1; }]])], - [tor_cv_malloc_zero_works=yes], - [tor_cv_malloc_zero_works=no], - [tor_cv_malloc_zero_works=cross])]) - -if test "$tor_cv_malloc_zero_works" = "cross"; then - # Cross-compiling; let's hope that the target isn't raving mad. - AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.]) -fi - -if test "$tor_cv_malloc_zero_works" = "yes"; then - AC_DEFINE([MALLOC_ZERO_WORKS], 1, - [Define to 1 iff malloc(0) returns a pointer]) -fi - -# whether we seem to be in a 2s-complement world. -AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement, -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[[int main () { int problem = ((-99) != (~99)+1); -return problem ? 1 : 0; }]])], - [tor_cv_twos_complement=yes], - [tor_cv_twos_complement=no], - [tor_cv_twos_complement=cross])]) - -if test "$tor_cv_twos_complement" = "cross"; then - # Cross-compiling; let's hope that the target isn't raving mad. - AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.]) -fi - -if test "$tor_cv_twos_complement" != "no"; then - AC_DEFINE([USING_TWOS_COMPLEMENT], 1, - [Define to 1 iff we represent negative integers with - two's complement]) -fi - -# What does shifting a negative value do? -AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend, -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])], - [tor_cv_sign_extend=yes], - [tor_cv_sign_extend=no], - [tor_cv_sign_extend=cross])]) - -if test "$tor_cv_sign_extend" = "cross"; then - # Cross-compiling; let's hope that the target isn't raving mad. - AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension]) -fi - -if test "$tor_cv_sign_extend" != "no"; then - AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1, - [Define to 1 iff right-shifting a negative value performs sign-extension]) -fi - -# Is uint8_t the same type as unsigned char? -AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar, -[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -#include -extern uint8_t c; -unsigned char c;]])], - [tor_cv_uint8_uchar=yes], - [tor_cv_uint8_uchar=no], - [tor_cv_uint8_uchar=cross])]) - -if test "$tor_cv_uint8_uchar" = "cross"; then - AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char]) -fi - -if test "$tor_cv_uint8_uchar" = "no"; then - AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.]) -fi - -# Whether we should use the dmalloc memory allocation debugging library. -AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library)) -AC_ARG_WITH(dmalloc, -AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]), -[if [[ "$withval" = "yes" ]]; then - dmalloc=1 - AC_MSG_RESULT(yes) -else - dmalloc=1 - AC_MSG_RESULT(no) -fi], [ dmalloc=0; AC_MSG_RESULT(no) ] -) - -if [[ $dmalloc -eq 1 ]]; then - AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?)) - AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.)) - AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library]) - AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup) -fi - -AC_ARG_WITH(tcmalloc, -AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]), -[ tcmalloc=yes ], [ tcmalloc=no ]) - -if test "x$tcmalloc" = "xyes"; then - LDFLAGS="-ltcmalloc $LDFLAGS" -fi - -using_custom_malloc=no -if test "x$enable_openbsd_malloc" = "xyes"; then - using_custom_malloc=yes -fi -if test "x$tcmalloc" = "xyes"; then - using_custom_malloc=yes -fi -if test "$using_custom_malloc" = "no"; then - AC_CHECK_FUNCS(mallinfo) -fi - -# By default, we're going to assume we don't have mlockall() -# bionic and other platforms have various broken mlockall subsystems. -# Some systems don't have a working mlockall, some aren't linkable, -# and some have it but don't declare it. -AC_CHECK_FUNCS(mlockall) -AC_CHECK_DECLS([mlockall], , , [ -#ifdef HAVE_SYS_MMAN_H -#include -#endif]) - -# Some MinGW environments don't have getpagesize in unistd.h. We don't use -# AC_CHECK_FUNCS(getpagesize), because other environments rename getpagesize -# using macros -AC_CHECK_DECLS([getpagesize], , , [ -#ifdef HAVE_UNISTD_H -#include -#endif]) - -# Allow user to specify an alternate syslog facility -AC_ARG_WITH(syslog-facility, -AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]), -syslog_facility="$withval", syslog_facility="LOG_DAEMON") -AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility]) -AC_SUBST(LOGFACILITY) - -# Check if we have getresuid and getresgid -AC_CHECK_FUNCS(getresuid getresgid) - -# Check for gethostbyname_r in all its glorious incompatible versions. -# (This logic is based on that in Python's configure.in) -AH_TEMPLATE(HAVE_GETHOSTBYNAME_R, - [Define this if you have any gethostbyname_r()]) - -AC_CHECK_FUNC(gethostbyname_r, [ - AC_MSG_CHECKING([how many arguments gethostbyname_r() wants]) - OLD_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include - ]], [[ - char *cp1, *cp2; - struct hostent *h1, *h2; - int i1, i2; - (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2); - ]])],[ - AC_DEFINE(HAVE_GETHOSTBYNAME_R) - AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1, - [Define this if gethostbyname_r takes 6 arguments]) - AC_MSG_RESULT(6) - ], [ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include - ]], [[ - char *cp1, *cp2; - struct hostent *h1; - int i1, i2; - (void)gethostbyname_r(cp1,h1,cp2,i1,&i2); - ]])], [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R) - AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1, - [Define this if gethostbyname_r takes 5 arguments]) - AC_MSG_RESULT(5) - ], [ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include - ]], [[ - char *cp1; - struct hostent *h1; - struct hostent_data hd; - (void) gethostbyname_r(cp1,h1,&hd); - ]])], [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R) - AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1, - [Define this if gethostbyname_r takes 3 arguments]) - AC_MSG_RESULT(3) - ], [ - AC_MSG_RESULT(0) - ]) - ]) - ]) - CFLAGS=$OLD_CFLAGS -]) - -AC_CACHE_CHECK([whether the C compiler supports __func__], - tor_cv_have_func_macro, - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#include -int main(int c, char **v) { puts(__func__); }])], - tor_cv_have_func_macro=yes, - tor_cv_have_func_macro=no)) - -AC_CACHE_CHECK([whether the C compiler supports __FUNC__], - tor_cv_have_FUNC_macro, - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#include -int main(int c, char **v) { puts(__FUNC__); }])], - tor_cv_have_FUNC_macro=yes, - tor_cv_have_FUNC_macro=no)) - -AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__], - tor_cv_have_FUNCTION_macro, - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#include -int main(int c, char **v) { puts(__FUNCTION__); }])], - tor_cv_have_FUNCTION_macro=yes, - tor_cv_have_FUNCTION_macro=no)) - -AC_CACHE_CHECK([whether we have extern char **environ already declared], - tor_cv_have_environ_declared, - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -#ifdef HAVE_UNISTD_H -#include -#endif -#include -int main(int c, char **v) { char **t = environ; }])], - tor_cv_have_environ_declared=yes, - tor_cv_have_environ_declared=no)) - -if test "$tor_cv_have_func_macro" = "yes"; then - AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__]) -fi - -if test "$tor_cv_have_FUNC_macro" = "yes"; then - AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__]) -fi - -if test "$tor_cv_have_FUNCTION_macro" = "yes"; then - AC_DEFINE(HAVE_MACRO__FUNCTION__, 1, - [Defined if the compiler supports __FUNCTION__]) -fi - -if test "$tor_cv_have_environ_declared" = "yes"; then - AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1, - [Defined if we have extern char **environ already declared]) -fi - -# $prefix stores the value of the --prefix command line option, or -# NONE if the option wasn't set. In the case that it wasn't set, make -# it be the default, so that we can use it to expand directories now. -if test "x$prefix" = "xNONE"; then - prefix=$ac_default_prefix -fi - -# and similarly for $exec_prefix -if test "x$exec_prefix" = "xNONE"; then - exec_prefix=$prefix -fi - -if test "x$BUILDDIR" = "x"; then - BUILDDIR=`pwd` -fi -AC_SUBST(BUILDDIR) -AH_TEMPLATE([BUILDDIR],[tor's build directory]) -AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR") - -if test "x$CONFDIR" = "x"; then - CONFDIR=`eval echo $sysconfdir/tor` -fi -AC_SUBST(CONFDIR) -AH_TEMPLATE([CONFDIR],[tor's configuration directory]) -AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR") - -BINDIR=`eval echo $bindir` -AC_SUBST(BINDIR) -LOCALSTATEDIR=`eval echo $localstatedir` -AC_SUBST(LOCALSTATEDIR) - -if test "$bwin32" = "true"; then - # Test if the linker supports the --nxcompat and --dynamicbase options - # for Windows - save_LDFLAGS="$LDFLAGS" - LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase" - AC_MSG_CHECKING([whether the linker supports DllCharacteristics]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([])], - [AC_MSG_RESULT([yes])] - [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"], - [AC_MSG_RESULT([no])] - ) - LDFLAGS="$save_LDFLAGS" -fi - -# Set CFLAGS _after_ all the above checks, since our warnings are stricter -# than autoconf's macros like. -if test "$GCC" = "yes"; then - # Disable GCC's strict aliasing checks. They are an hours-to-debug - # accident waiting to happen. - CFLAGS="$CFLAGS -Wall -fno-strict-aliasing" -else - # Override optimization level for non-gcc compilers - CFLAGS="$CFLAGS -O" - enable_gcc_warnings=no - enable_gcc_warnings_advisory=no -fi - -# Warnings implies advisory-warnings and -Werror. -if test "$enable_gcc_warnings" = "yes"; then - enable_gcc_warnings_advisory=yes - enable_fatal_warnings=yes -fi - -# OS X Lion started deprecating the system openssl. Let's just disable -# all deprecation warnings on OS X. Also, to potentially make the binary -# a little smaller, let's enable dead_strip. -case "$host_os" in - - darwin*) - CFLAGS="$CFLAGS -Wno-deprecated-declarations" - LDFLAGS="$LDFLAGS -dead_strip" ;; -esac - -# Add some more warnings which we use in development but not in the -# released versions. (Some relevant gcc versions can't handle these.) -# -# Note that we have to do this near the end of the autoconf process, or -# else we may run into problems when these warnings hit on the testing C -# programs that autoconf wants to build. -if test "x$enable_gcc_warnings_advisory" != "xno"; then - - case "$host" in - *-*-openbsd* | *-*-bitrig*) - # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default. - # That's fine, except that the headers don't pass -Wredundant-decls. - # Therefore, let's disable -Wsystem-headers when we're building - # with maximal warnings on OpenBSD. - CFLAGS="$CFLAGS -Wno-system-headers" ;; - esac - - # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users - # have it work better. - # CFLAGS="$CFLAGS -Wstrict-overflow=1" - - # This warning was added in gcc 4.3, but it appears to generate - # spurious warnings in gcc 4.4. I don't know if it works in 4.5. - #CFLAGS="$CFLAGS -Wlogical-op" - - m4_foreach_w([warning_flag], [ - -Waddress - -Waddress-of-array-temporary - -Waddress-of-temporary - -Wambiguous-macro - -Wanonymous-pack-parens - -Warc - -Warc-abi - -Warc-bridge-casts-disallowed-in-nonarc - -Warc-maybe-repeated-use-of-weak - -Warc-performSelector-leaks - -Warc-repeated-use-of-weak - -Warray-bounds - -Warray-bounds-pointer-arithmetic - -Wasm - -Wasm-operand-widths - -Watomic-properties - -Watomic-property-with-user-defined-accessor - -Wauto-import - -Wauto-storage-class - -Wauto-var-id - -Wavailability - -Wbackslash-newline-escape - -Wbad-array-new-length - -Wbind-to-temporary-copy - -Wbitfield-constant-conversion - -Wbool-conversion - -Wbool-conversions - -Wbuiltin-requires-header - -Wchar-align - -Wcompare-distinct-pointer-types - -Wcomplex-component-init - -Wconditional-type-mismatch - -Wconfig-macros - -Wconstant-conversion - -Wconstant-logical-operand - -Wconstexpr-not-const - -Wcustom-atomic-properties - -Wdangling-field - -Wdangling-initializer-list - -Wdate-time - -Wdelegating-ctor-cycles - -Wdeprecated-implementations - -Wdeprecated-register - -Wdirect-ivar-access - -Wdiscard-qual - -Wdistributed-object-modifiers - -Wdivision-by-zero - -Wdollar-in-identifier-extension - -Wdouble-promotion - -Wduplicate-decl-specifier - -Wduplicate-enum - -Wduplicate-method-arg - -Wduplicate-method-match - -Wduplicated-cond - -Wdynamic-class-memaccess - -Wembedded-directive - -Wempty-translation-unit - -Wenum-conversion - -Wexit-time-destructors - -Wexplicit-ownership-type - -Wextern-initializer - -Wextra - -Wextra-semi - -Wextra-tokens - -Wflexible-array-extensions - -Wfloat-conversion - -Wformat-non-iso - -Wfour-char-constants - -Wgcc-compat - -Wglobal-constructors - -Wgnu-array-member-paren-init - -Wgnu-designator - -Wgnu-static-float-init - -Wheader-guard - -Wheader-hygiene - -Widiomatic-parentheses - -Wignored-attributes - -Wimplicit-atomic-properties - -Wimplicit-conversion-floating-point-to-bool - -Wimplicit-exception-spec-mismatch - -Wimplicit-fallthrough - -Wimplicit-fallthrough-per-function - -Wimplicit-retain-self - -Wimport-preprocessor-directive-pedantic - -Wincompatible-library-redeclaration - -Wincompatible-pointer-types-discards-qualifiers - -Wincomplete-implementation - -Wincomplete-module - -Wincomplete-umbrella - -Winit-self - -Wint-conversions - -Wint-to-void-pointer-cast - -Winteger-overflow - -Winvalid-constexpr - -Winvalid-iboutlet - -Winvalid-noreturn - -Winvalid-pp-token - -Winvalid-source-encoding - -Winvalid-token-paste - -Wknr-promoted-parameter - -Wlarge-by-value-copy - -Wliteral-conversion - -Wliteral-range - -Wlocal-type-template-args - -Wlogical-op - -Wloop-analysis - -Wmain-return-type - -Wmalformed-warning-check - -Wmethod-signatures - -Wmicrosoft - -Wmicrosoft-exists - -Wmismatched-parameter-types - -Wmismatched-return-types - -Wmissing-field-initializers - -Wmissing-format-attribute - -Wmissing-noreturn - -Wmissing-selector-name - -Wmissing-sysroot - -Wmissing-variable-declarations - -Wmodule-conflict - -Wnested-anon-types - -Wnewline-eof - -Wnon-literal-null-conversion - -Wnon-pod-varargs - -Wnonportable-cfstrings - -Wnormalized=nfkc - -Wnull-arithmetic - -Wnull-character - -Wnull-conversion - -Wnull-dereference - -Wout-of-line-declaration - -Wover-aligned - -Woverlength-strings - -Woverride-init - -Woverriding-method-mismatch - -Wpointer-type-mismatch - -Wpredefined-identifier-outside-function - -Wprotocol-property-synthesis-ambiguity - -Wreadonly-iboutlet-property - -Wreadonly-setter-attrs - -Wreceiver-expr - -Wreceiver-forward-class - -Wreceiver-is-weak - -Wreinterpret-base-class - -Wrequires-super-attribute - -Wreserved-user-defined-literal - -Wreturn-stack-address - -Wsection - -Wselector-type-mismatch - -Wsentinel - -Wserialized-diagnostics - -Wshadow - -Wshift-count-negative - -Wshift-count-overflow - -Wshift-negative-value - -Wshift-overflow=2 - -Wshift-sign-overflow - -Wshorten-64-to-32 - -Wsizeof-array-argument - -Wsource-uses-openmp - -Wstatic-float-init - -Wstatic-in-inline - -Wstatic-local-in-inline - -Wstrict-overflow=1 - -Wstring-compare - -Wstring-conversion - -Wstrlcpy-strlcat-size - -Wstrncat-size - -Wsuggest-attribute=format - -Wsuggest-attribute=noreturn - -Wsuper-class-method-mismatch - -Wswitch-bool - -Wsync-nand - -Wtautological-constant-out-of-range-compare - -Wtentative-definition-incomplete-type - -Wtrampolines - -Wtype-safety - -Wtypedef-redefinition - -Wtypename-missing - -Wundefined-inline - -Wundefined-internal - -Wundefined-reinterpret-cast - -Wunicode - -Wunicode-whitespace - -Wunknown-warning-option - -Wunnamed-type-template-args - -Wunneeded-member-function - -Wunsequenced - -Wunsupported-visibility - -Wunused-but-set-parameter - -Wunused-but-set-variable - -Wunused-command-line-argument - -Wunused-const-variable=2 - -Wunused-exception-parameter - -Wunused-local-typedefs - -Wunused-member-function - -Wunused-sanitize-argument - -Wunused-volatile-lvalue - -Wuser-defined-literals - -Wvariadic-macros - -Wvector-conversion - -Wvector-conversions - -Wvexing-parse - -Wvisibility - -Wvla-extension - -Wzero-length-array - ], [ TOR_CHECK_CFLAGS([warning_flag]) ]) - -dnl We should re-enable this in some later version. Clang doesn't -dnl mind, but it causes trouble with GCC. -dnl -Wstrict-overflow=2 - -dnl These seem to require annotations that we don't currently use, -dnl and they give false positives in our pthreads wrappers. (Clang 4) -dnl -Wthread-safety -dnl -Wthread-safety-analysis -dnl -Wthread-safety-attributes -dnl -Wthread-safety-beta -dnl -Wthread-safety-precise - - CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith" - CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings" - CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2" - CFLAGS="$CFLAGS -Wwrite-strings" - CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum" - CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused" - CFLAGS="$CFLAGS -Wunused-parameter " - # These interfere with building main() { return 0; }, which autoconf - # likes to use as its default program. - CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations" - - if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then - AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference]) - fi - if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then - AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings]) - fi - - if test "x$enable_fatal_warnings" = "xyes"; then - # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the - # default autoconf programs are full of errors. - CFLAGS="$CFLAGS -Werror" - fi - -fi - -if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then - case "$host_os" in - darwin*) - AC_MSG_WARN([Tried to enable coverage on OSX without using the clang compiler. This might not work! If coverage fails, use CC=clang when configuring with --enable-coverage.]) - esac -fi - -CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib" - -AC_CONFIG_FILES([ - Doxyfile - Makefile - contrib/dist/suse/tor.sh - contrib/operator-tools/tor.logrotate - contrib/dist/tor.sh - contrib/dist/torctl - contrib/dist/tor.service - src/config/torrc.sample - src/config/torrc.minimal - src/rust/.cargo/config - scripts/maint/checkOptionDocs.pl - scripts/maint/updateVersions.pl -]) - -if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then - regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify" - for file in $regular_mans ; do - if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then - echo "=================================="; - echo; - echo "Building Tor has failed since manpages cannot be built."; - echo; - echo "You need asciidoc installed to be able to build the manpages."; - echo "To build without manpages, use the --disable-asciidoc argument"; - echo "when calling configure."; - echo; - echo "=================================="; - exit 1; - fi - done -fi - -if test "$fragile_hardening" = "yes"; then - AC_MSG_WARN([ - -============ -Warning! Building Tor with --enable-fragile-hardening (also known as ---enable-expensive-hardening) makes some kinds of attacks harder, but makes -other kinds of attacks easier. A Tor instance build with this option will be -somewhat less vulnerable to remote code execution, arithmetic overflow, or -out-of-bounds read/writes... but at the cost of becoming more vulnerable to -denial of service attacks. For more information, see -https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening -============ - ]) -fi - -AC_OUTPUT diff --git a/src/tor/src/or/confparse.c b/src/tor/confparse.c similarity index 87% rename from src/tor/src/or/confparse.c rename to src/tor/confparse.c index 64ed9ee6b..c5400a651 100644 --- a/src/tor/src/or/confparse.c +++ b/src/tor/confparse.c @@ -1,27 +1,9 @@ - /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file confparse.c - * - * \brief Back-end for parsing and generating key-value files, used to - * implement the torrc file format and the state file. - * - * This module is used by config.c to parse and encode torrc - * configuration files, and by statefile.c to parse and encode the - * $DATADIR/state file. - * - * To use this module, its callers provide an instance of - * config_format_t to describe the mappings from a set of configuration - * options to a number of fields in a C structure. With this mapping, - * the functions here can convert back and forth between the C structure - * specified, and a linked list of key-value pairs. - */ - #include "or.h" #include "confparse.h" #include "routerset.h" @@ -78,26 +60,120 @@ config_expand_abbrev(const config_format_t *fmt, const char *option, return option; } -/** If key is a deprecated configuration option, return the message - * explaining why it is deprecated (which may be an empty string). Return NULL - * if it is not deprecated. The key field must be fully expanded. */ -const char * -config_find_deprecation(const config_format_t *fmt, const char *key) +/** Helper: allocate a new configuration option mapping 'key' to 'val', + * append it to *lst. */ +void +config_line_append(config_line_t **lst, + const char *key, + const char *val) { - if (BUG(fmt == NULL) || BUG(key == NULL)) - return NULL; - if (fmt->deprecations == NULL) - return NULL; + config_line_t *newline; - const config_deprecation_t *d; - for (d = fmt->deprecations; d->name; ++d) { - if (!strcasecmp(d->name, key)) { - return d->why_deprecated ? d->why_deprecated : ""; - } + newline = tor_malloc_zero(sizeof(config_line_t)); + newline->key = tor_strdup(key); + newline->value = tor_strdup(val); + newline->next = NULL; + while (*lst) + lst = &((*lst)->next); + + (*lst) = newline; +} + +/** Return the line in lines whose key is exactly key, or NULL + * if no such key exists. For handling commandline-only options only; other + * options should be looked up in the appropriate data structure. */ +const config_line_t * +config_line_find(const config_line_t *lines, + const char *key) +{ + const config_line_t *cl; + for (cl = lines; cl; cl = cl->next) { + if (!strcmp(cl->key, key)) + return cl; } return NULL; } +/** Helper: parse the config string and strdup into key/value + * strings. Set *result to the list, or NULL if parsing the string + * failed. Return 0 on success, -1 on failure. Warn and ignore any + * misformatted lines. + * + * If extended is set, then treat keys beginning with / and with + as + * indicating "clear" and "append" respectively. */ +int +config_get_lines(const char *string, config_line_t **result, int extended) +{ + config_line_t *list = NULL, **next; + char *k, *v; + const char *parse_err; + + next = &list; + do { + k = v = NULL; + string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); + if (!string) { + log_warn(LD_CONFIG, "Error while parsing configuration: %s", + parse_err?parse_err:""); + config_free_lines(list); + tor_free(k); + tor_free(v); + return -1; + } + if (k && v) { + unsigned command = CONFIG_LINE_NORMAL; + if (extended) { + if (k[0] == '+') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + command = CONFIG_LINE_APPEND; + } else if (k[0] == '/') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + tor_free(v); + v = tor_strdup(""); + command = CONFIG_LINE_CLEAR; + } + } + /* This list can get long, so we keep a pointer to the end of it + * rather than using config_line_append over and over and getting + * n^2 performance. */ + *next = tor_malloc_zero(sizeof(config_line_t)); + (*next)->key = k; + (*next)->value = v; + (*next)->next = NULL; + (*next)->command = command; + next = &((*next)->next); + } else { + tor_free(k); + tor_free(v); + } + } while (*string); + + *result = list; + return 0; +} + +/** + * Free all the configuration lines on the linked list front. + */ +void +config_free_lines(config_line_t *front) +{ + config_line_t *tmp; + + while (front) { + tmp = front; + front = tmp->next; + + tor_free(tmp->key); + tor_free(tmp->value); + tor_free(tmp); + } +} + /** As config_find_option, but return a non-const pointer. */ config_var_t * config_find_option_mutable(config_format_t *fmt, const char *key) @@ -380,16 +456,6 @@ config_mark_lists_fragile(const config_format_t *fmt, void *options) } } -void -warn_deprecated_option(const char *what, const char *why) -{ - const char *space = (why && strlen(why)) ? " " : ""; - log_warn(LD_CONFIG, "The %s option is deprecated, and will most likely " - "be removed in a future version of Tor.%s%s (If you think this is " - "a mistake, please let us know!)", - what, space, why); -} - /** If c is a syntactically valid configuration line, update * options with its value and return 0. Otherwise return -1 for bad * key, -2 for bad value. @@ -401,12 +467,9 @@ warn_deprecated_option(const char *what, const char *why) */ static int config_assign_line(const config_format_t *fmt, void *options, - config_line_t *c, unsigned flags, - bitarray_t *options_seen, char **msg) + config_line_t *c, int use_defaults, + int clear_first, bitarray_t *options_seen, char **msg) { - const unsigned use_defaults = flags & CAL_USE_DEFAULTS; - const unsigned clear_first = flags & CAL_CLEAR_FIRST; - const unsigned warn_deprecations = flags & CAL_WARN_DEPRECATIONS; const config_var_t *var; CONFIG_CHECK(fmt, options); @@ -432,12 +495,6 @@ config_assign_line(const config_format_t *fmt, void *options, c->key = tor_strdup(var->name); } - const char *deprecation_msg; - if (warn_deprecations && - (deprecation_msg = config_find_deprecation(fmt, var->name))) { - warn_deprecated_option(var->name, deprecation_msg); - } - if (!strlen(c->value)) { /* reset or clear it, then return */ if (!clear_first) { @@ -517,13 +574,30 @@ config_value_needs_escape(const char *value) return 0; } +/** Return a newly allocated deep copy of the lines in inp. */ +config_line_t * +config_lines_dup(const config_line_t *inp) +{ + config_line_t *result = NULL; + config_line_t **next_out = &result; + while (inp) { + *next_out = tor_malloc_zero(sizeof(config_line_t)); + (*next_out)->key = tor_strdup(inp->key); + (*next_out)->value = tor_strdup(inp->value); + inp = inp->next; + next_out = &((*next_out)->next); + } + (*next_out) = NULL; + return result; +} + /** Return newly allocated line or lines corresponding to key in the * configuration options. If escape_val is true and a * value needs to be quoted before it's put in a config file, quote and * escape that value. Return NULL if no such key exists. */ config_line_t * config_get_assigned_option(const config_format_t *fmt, const void *options, - const char *key, int escape_val) + const char *key, int escape_val) { const config_var_t *var; const void *value; @@ -633,11 +707,11 @@ config_get_assigned_option(const config_format_t *fmt, const void *options, tor_free(result); return NULL; case CONFIG_TYPE_LINELIST_S: + log_warn(LD_CONFIG, + "Can't return context-sensitive '%s' on its own", key); tor_free(result->key); tor_free(result); - result = config_lines_dup_and_filter(*(const config_line_t **)value, - key); - break; + return NULL; case CONFIG_TYPE_LINELIST: case CONFIG_TYPE_LINELIST_V: tor_free(result->key); @@ -723,13 +797,11 @@ options_trial_assign() calls config_assign(1, 1) */ int config_assign(const config_format_t *fmt, void *options, config_line_t *list, - unsigned config_assign_flags, char **msg) + int use_defaults, int clear_first, char **msg) { config_line_t *p; bitarray_t *options_seen; const int n_options = config_count_options(fmt); - const unsigned clear_first = config_assign_flags & CAL_CLEAR_FIRST; - const unsigned use_defaults = config_assign_flags & CAL_USE_DEFAULTS; CONFIG_CHECK(fmt, options); @@ -753,8 +825,8 @@ config_assign(const config_format_t *fmt, void *options, config_line_t *list, /* pass 3: assign. */ while (list) { int r; - if ((r=config_assign_line(fmt, options, list, config_assign_flags, - options_seen, msg))) { + if ((r=config_assign_line(fmt, options, list, use_defaults, + clear_first, options_seen, msg))) { bitarray_free(options_seen); return r; } @@ -863,7 +935,7 @@ config_reset(const config_format_t *fmt, void *options, /** Release storage held by options. */ void -config_free_(const config_format_t *fmt, void *options) +config_free(const config_format_t *fmt, void *options) { int i; @@ -882,6 +954,36 @@ config_free_(const config_format_t *fmt, void *options) tor_free(options); } +/** Return true iff a and b contain identical keys and values in identical + * order. */ +int +config_lines_eq(config_line_t *a, config_line_t *b) +{ + while (a && b) { + if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) + return 0; + a = a->next; + b = b->next; + } + if (a || b) + return 0; + return 1; +} + +/** Return the number of lines in a whose key is key. */ +int +config_count_key(const config_line_t *a, const char *key) +{ + int n = 0; + while (a) { + if (!strcasecmp(a->key, key)) { + ++n; + } + a = a->next; + } + return n; +} + /** Return true iff the option name has the same value in o1 * and o2. Must not be called for LINELIST_S or OBSOLETE options. */ @@ -920,7 +1022,7 @@ config_dup(const config_format_t *fmt, const void *old) line = config_get_assigned_option(fmt, old, fmt->vars[i].name, 0); if (line) { char *msg = NULL; - if (config_assign(fmt, newopts, line, 0, &msg) < 0) { + if (config_assign(fmt, newopts, line, 0, 0, &msg) < 0) { log_err(LD_BUG, "config_get_assigned_option() generated " "something we couldn't config_assign(): %s", msg); tor_free(msg); @@ -998,11 +1100,6 @@ config_dump(const config_format_t *fmt, const void *default_options, config_get_assigned_option(fmt, options, fmt->vars[i].name, 1); for (; line; line = line->next) { - if (!strcmpstart(line->key, "__")) { - /* This check detects "hidden" variables inside LINELIST_V structures. - */ - continue; - } smartlist_add_asprintf(elements, "%s%s %s\n", comment_option ? "# " : "", line->key, line->value); @@ -1068,8 +1165,6 @@ static struct unit_table_t memory_units[] = { { "gbits", 1<<27 }, { "gbit", 1<<27 }, { "tb", U64_LITERAL(1)<<40 }, - { "tbyte", U64_LITERAL(1)<<40 }, - { "tbytes", U64_LITERAL(1)<<40 }, { "terabyte", U64_LITERAL(1)<<40 }, { "terabytes", U64_LITERAL(1)<<40 }, { "terabits", U64_LITERAL(1)<<37 }, @@ -1136,7 +1231,7 @@ config_parse_units(const char *val, struct unit_table_t *u, int *ok) v = tor_parse_uint64(val, 10, 0, UINT64_MAX, ok, &cp); if (!*ok || (cp && *cp == '.')) { - d = tor_parse_double(val, 0, (double)UINT64_MAX, ok, &cp); + d = tor_parse_double(val, 0, UINT64_MAX, ok, &cp); if (!*ok) goto done; use_float = 1; @@ -1153,7 +1248,7 @@ config_parse_units(const char *val, struct unit_table_t *u, int *ok) for ( ;u->unit;++u) { if (!strcasecmp(u->unit, cp)) { if (use_float) - v = (uint64_t)(u->multiplier * d); + v = u->multiplier * d; else v *= u->multiplier; *ok = 1; @@ -1190,6 +1285,8 @@ config_parse_msec_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_msec_units, ok); + if (!ok) + return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Msec interval '%s' is too long", s); *ok = 0; @@ -1207,6 +1304,8 @@ config_parse_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_units, ok); + if (!ok) + return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Interval '%s' is too long", s); *ok = 0; diff --git a/src/tor/src/or/confparse.h b/src/tor/confparse.h similarity index 62% rename from src/tor/src/or/confparse.h rename to src/tor/confparse.h index fc4a7b2d0..2cd6c49a2 100644 --- a/src/tor/src/or/confparse.h +++ b/src/tor/confparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONFPARSE_H @@ -40,36 +40,6 @@ typedef enum config_type_t { CONFIG_TYPE_OBSOLETE, /**< Obsolete (ignored) option. */ } config_type_t; -#ifdef TOR_UNIT_TESTS -/** - * Union used when building in test mode typechecking the members of a type - * used with confparse.c. See CONF_CHECK_VAR_TYPE for a description of how - * it is used. */ -typedef union { - char **STRING; - char **FILENAME; - int *UINT; /* yes, really: Even though the confparse type is called - * "UINT", it still uses the C int type -- it just enforces that - * the values are in range [0,INT_MAX]. - */ - int *INT; - int *PORT; - int *INTERVAL; - int *MSEC_INTERVAL; - uint64_t *MEMUNIT; - double *DOUBLE; - int *BOOL; - int *AUTOBOOL; - time_t *ISOTIME; - smartlist_t **CSV; - smartlist_t **CSV_INTERVAL; - config_line_t **LINELIST; - config_line_t **LINELIST_S; - config_line_t **LINELIST_V; - routerset_t **ROUTERSET; -} confparse_dummy_values_t; -#endif /* defined(TOR_UNIT_TESTS) */ - /** An abbreviation for a configuration option allowed on the command line. */ typedef struct config_abbrev_t { const char *abbreviated; @@ -78,11 +48,6 @@ typedef struct config_abbrev_t { int warn; } config_abbrev_t; -typedef struct config_deprecation_t { - const char *name; - const char *why_deprecated; -} config_deprecation_t; - /* Handy macro for declaring "In the config file or on the command line, * you can abbreviate toks as tok". */ #define PLURAL(tok) { #tok, #tok "s", 0, 0 } @@ -94,51 +59,14 @@ typedef struct config_var_t { * value. */ off_t var_offset; /**< Offset of the corresponding member of or_options_t. */ const char *initvalue; /**< String (or null) describing initial value. */ - -#ifdef TOR_UNIT_TESTS - /** Used for compiler-magic to typecheck the corresponding field in the - * corresponding struct. Only used in unit test mode, at compile-time. */ - confparse_dummy_values_t var_ptr_dummy; -#endif } config_var_t; -/* Macros to define extra members inside config_var_t fields, and at the - * end of a list of them. - */ -#ifdef TOR_UNIT_TESTS -/* This is a somewhat magic type-checking macro for users of confparse.c. - * It initializes a union member "confparse_dummy_values_t.conftype" with - * the address of a static member "tp_dummy.member". This - * will give a compiler warning unless the member field is of the correct - * type. - * - * (This warning is mandatory, because a type mismatch here violates the type - * compatibility constraint for simple assignment, and requires a diagnostic, - * according to the C spec.) - * - * For example, suppose you say: - * "CONF_CHECK_VAR_TYPE(or_options_t, STRING, Address)". - * Then this macro will evaluate to: - * { .STRING = &or_options_t_dummy.Address } - * And since confparse_dummy_values_t.STRING has type "char **", that - * expression will create a warning unless or_options_t.Address also - * has type "char *". - */ -#define CONF_CHECK_VAR_TYPE(tp, conftype, member) \ - { . conftype = &tp ## _dummy . member } -#define CONF_TEST_MEMBERS(tp, conftype, member) \ - , CONF_CHECK_VAR_TYPE(tp, conftype, member) -#define END_OF_CONFIG_VARS \ - { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL, { .INT=NULL } } -#define DUMMY_TYPECHECK_INSTANCE(tp) \ - static tp tp ## _dummy -#else /* !(defined(TOR_UNIT_TESTS)) */ -#define CONF_TEST_MEMBERS(tp, conftype, member) -#define END_OF_CONFIG_VARS { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } -/* Repeatedly declarable incomplete struct to absorb redundant semicolons */ -#define DUMMY_TYPECHECK_INSTANCE(tp) \ - struct tor_semicolon_eater -#endif /* defined(TOR_UNIT_TESTS) */ +/** Represents an English description of a configuration variable; used when + * generating configuration file comments. */ +typedef struct config_var_description_t { + const char *name; + const char *description; +} config_var_description_t; /** Type of a callback to validate whether a given configuration is * well-formed and consistent. See options_trial_assign() for documentation @@ -155,7 +83,6 @@ typedef struct config_format_t { off_t magic_offset; /**< Offset of the magic value within the struct. */ config_abbrev_t *abbrevs; /**< List of abbreviations that we expand when * parsing this format. */ - const config_deprecation_t *deprecations; /** List of deprecated options */ config_var_t *vars; /**< List of variables we recognize, their default * values, and where we stick them in the structure. */ validate_fn_t validate_fn; /**< Function to validate config. */ @@ -172,17 +99,15 @@ typedef struct config_format_t { *(uint32_t*)STRUCT_VAR_P(cfg,fmt->magic_offset)); \ STMT_END -#define CAL_USE_DEFAULTS (1u<<0) -#define CAL_CLEAR_FIRST (1u<<1) -#define CAL_WARN_DEPRECATIONS (1u<<2) - void *config_new(const config_format_t *fmt); -void config_free_(const config_format_t *fmt, void *options); -#define config_free(fmt, options) do { \ - config_free_((fmt), (options)); \ - (options) = NULL; \ - } while (0) - +void config_line_append(config_line_t **lst, + const char *key, const char *val); +config_line_t *config_lines_dup(const config_line_t *inp); +const config_line_t *config_line_find(const config_line_t *lines, + const char *key); +void config_free(const config_format_t *fmt, void *options); +int config_lines_eq(config_line_t *a, config_line_t *b); +int config_count_key(const config_line_t *a, const char *key); config_line_t *config_get_assigned_option(const config_format_t *fmt, const void *options, const char *key, int escape_val); @@ -196,17 +121,17 @@ char *config_dump(const config_format_t *fmt, const void *default_options, int comment_defaults); int config_assign(const config_format_t *fmt, void *options, config_line_t *list, - unsigned flags, char **msg); + int use_defaults, int clear_first, char **msg); config_var_t *config_find_option_mutable(config_format_t *fmt, const char *key); -const char *config_find_deprecation(const config_format_t *fmt, - const char *key); const config_var_t *config_find_option(const config_format_t *fmt, const char *key); + +int config_get_lines(const char *string, config_line_t **result, int extended); +void config_free_lines(config_line_t *front); const char *config_expand_abbrev(const config_format_t *fmt, const char *option, int command_line, int warn_obsolete); -void warn_deprecated_option(const char *what, const char *why); -#endif /* !defined(TOR_CONFPARSE_H) */ +#endif diff --git a/src/tor/src/or/connection.c b/src/tor/connection.c similarity index 73% rename from src/tor/src/or/connection.c rename to src/tor/connection.c index 3c37c59b4..ebf679ede 100644 --- a/src/tor/src/or/connection.c +++ b/src/tor/connection.c @@ -1,71 +1,24 @@ - /* Copyright (c) 2001 Matej Pfajfar. +/* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file connection.c * \brief General high-level functions to handle reading and writing * on connections. - * - * Each connection (ideally) represents a TLS connection, a TCP socket, a unix - * socket, or a UDP socket on which reads and writes can occur. (But see - * connection_edge.c for cases where connections can also represent streams - * that do not have a corresponding socket.) - * - * The module implements the abstract type, connection_t. The subtypes are: - *
    - *
  • listener_connection_t, implemented here in connection.c - *
  • dir_connection_t, implemented in directory.c - *
  • or_connection_t, implemented in connection_or.c - *
  • edge_connection_t, implemented in connection_edge.c, along with - * its subtype(s): - *
    • entry_connection_t, also implemented in connection_edge.c - *
    - *
  • control_connection_t, implemented in control.c - *
- * - * The base type implemented in this module is responsible for basic - * rate limiting, flow control, and marshalling bytes onto and off of the - * network (either directly or via TLS). - * - * Connections are registered with the main loop with connection_add(). As - * they become able to read or write register the fact with the event main - * loop by calling connection_watch_events(), connection_start_reading(), or - * connection_start_writing(). When they no longer want to read or write, - * they call connection_stop_reading() or connection_stop_writing(). - * - * To queue data to be written on a connection, call - * connection_buf_add(). When data arrives, the - * connection_process_inbuf() callback is invoked, which dispatches to a - * type-specific function (such as connection_edge_process_inbuf() for - * example). Connection types that need notice of when data has been written - * receive notification via connection_flushed_some() and - * connection_finished_flushing(). These functions all delegate to - * type-specific implementations. - * - * Additionally, beyond the core of connection_t, this module also implements: - *
    - *
  • Listeners, which wait for incoming sockets and launch connections - *
  • Outgoing SOCKS proxy support - *
  • Outgoing HTTP proxy support - *
  • An out-of-sockets handler for dealing with socket exhaustion - *
**/ #define CONNECTION_PRIVATE #include "or.h" -#include "bridges.h" #include "buffers.h" -#include "buffers_tls.h" /* * Define this so we get channel internal functions, since we're implementing * part of a subclass (channel_tls_t). */ #define TOR_CHANNEL_INTERNAL_ #define CONNECTION_PRIVATE -#include "backtrace.h" #include "channel.h" #include "channeltls.h" #include "circuitbuild.h" @@ -76,6 +29,7 @@ #include "connection_edge.h" #include "connection_or.h" #include "control.h" +#include "cpuworker.h" #include "directory.h" #include "dirserv.h" #include "dns.h" @@ -83,12 +37,7 @@ #include "entrynodes.h" #include "ext_orport.h" #include "geoip.h" -#include "main.h" -#include "hs_common.h" -#include "hs_ident.h" -#include "nodelist.h" -#include "proto_http.h" -#include "proto_socks.h" +#include "onion_main.h" #include "policies.h" #include "reasons.h" #include "relay.h" @@ -96,19 +45,16 @@ #include "rendcommon.h" #include "rephist.h" #include "router.h" -#include "routerlist.h" #include "transports.h" #include "routerparse.h" -#include "sandbox.h" #include "transports.h" -#ifdef HAVE_PWD_H -#include +#ifdef USE_BUFFEREVENTS +#include #endif -#ifdef HAVE_SYS_UN_H -#include -#include +#ifdef HAVE_PWD_H +#include #endif static connection_t *connection_listener_new( @@ -118,16 +64,19 @@ static connection_t *connection_listener_new( const port_cfg_t *portcfg); static void connection_init(time_t now, connection_t *conn, int type, int socket_family); +static int connection_init_accepted_conn(connection_t *conn, + const listener_connection_t *listener); static int connection_handle_listener_read(connection_t *conn, int new_type); +#ifndef USE_BUFFEREVENTS static int connection_bucket_should_increase(int bucket, or_connection_t *conn); +#endif static int connection_finished_flushing(connection_t *conn); static int connection_flushed_some(connection_t *conn); static int connection_finished_connecting(connection_t *conn); static int connection_reached_eof(connection_t *conn); -static int connection_buf_read_from_socket(connection_t *conn, - ssize_t *max_to_read, - int *socket_error); +static int connection_read_to_buf(connection_t *conn, ssize_t *max_to_read, + int *socket_error); static int connection_process_inbuf(connection_t *conn, int package_partial); static void client_check_address_changed(tor_socket_t sock); static void set_constrained_socket_buffers(tor_socket_t sock, int size); @@ -137,13 +86,11 @@ static int connection_read_https_proxy_response(connection_t *conn); static void connection_send_socks5_connect(connection_t *conn); static const char *proxy_type_to_string(int proxy_type); static int get_proxy_type(void); -const tor_addr_t *conn_get_outbound_address(sa_family_t family, - const or_options_t *options, unsigned int conn_type); /** The last addresses that our network interface seemed to have been * binding to. We use this as one way to detect when our IP changes. * - * XXXX+ We should really use the entire list of interfaces here. + * XXX024 We should really use the entire list of interfaces here. **/ static tor_addr_t *last_interface_ipv4 = NULL; /* DOCDOC last_interface_ipv6 */ @@ -160,8 +107,7 @@ static smartlist_t *outgoing_addrs = NULL; case CONN_TYPE_CONTROL_LISTENER: \ case CONN_TYPE_AP_TRANS_LISTENER: \ case CONN_TYPE_AP_NATD_LISTENER: \ - case CONN_TYPE_AP_DNS_LISTENER: \ - case CONN_TYPE_AP_HTTP_CONNECT_LISTENER + case CONN_TYPE_AP_DNS_LISTENER /**************************************************************/ @@ -184,11 +130,11 @@ conn_type_to_string(int type) case CONN_TYPE_AP: return "Socks"; case CONN_TYPE_DIR_LISTENER: return "Directory listener"; case CONN_TYPE_DIR: return "Directory"; + case CONN_TYPE_CPUWORKER: return "CPU worker"; case CONN_TYPE_CONTROL_LISTENER: return "Control listener"; case CONN_TYPE_CONTROL: return "Control"; case CONN_TYPE_EXT_OR: return "Extended OR"; case CONN_TYPE_EXT_OR_LISTENER: return "Extended OR listener"; - case CONN_TYPE_AP_HTTP_CONNECT_LISTENER: return "HTTP tunnel listener"; default: log_warn(LD_BUG, "unknown connection type %d", type); tor_snprintf(buf, sizeof(buf), "unknown [%d]", type); @@ -267,6 +213,12 @@ conn_state_to_string(int type, int state) case DIR_CONN_STATE_SERVER_WRITING: return "writing"; } break; + case CONN_TYPE_CPUWORKER: + switch (state) { + case CPUWORKER_STATE_IDLE: return "idle"; + case CPUWORKER_STATE_BUSY_ONION: return "busy with onion"; + } + break; case CONN_TYPE_CONTROL: switch (state) { case CONTROL_CONN_STATE_OPEN: return "open (protocol v1)"; @@ -283,6 +235,27 @@ conn_state_to_string(int type, int state) return buf; } +#ifdef USE_BUFFEREVENTS +/** Return true iff the connection's type is one that can use a + bufferevent-based implementation. */ +int +connection_type_uses_bufferevent(connection_t *conn) +{ + switch (conn->type) { + case CONN_TYPE_AP: + case CONN_TYPE_EXIT: + case CONN_TYPE_DIR: + case CONN_TYPE_CONTROL: + case CONN_TYPE_OR: + case CONN_TYPE_EXT_OR: + case CONN_TYPE_CPUWORKER: + return 1; + default: + return 0; + } +} +#endif + /** Allocate and return a new dir_connection_t, initialized as by * connection_init(). */ dir_connection_t * @@ -296,6 +269,10 @@ dir_connection_new(int socket_family) /** Allocate and return a new or_connection_t, initialized as by * connection_init(). * + * Set timestamp_last_added_nonpadding to now. + * + * Assign a pseudorandom next_circ_id between 0 and 2**15. + * * Initialize active_circuit_pqueue. * * Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick. @@ -308,7 +285,7 @@ or_connection_new(int type, int socket_family) tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR); connection_init(now, TO_CONN(or_conn), type, socket_family); - connection_or_set_canonical(or_conn, 0); + or_conn->timestamp_last_added_nonpadding = time(NULL); if (type == CONN_TYPE_EXT_OR) connection_or_set_ext_or_identifier(or_conn); @@ -332,11 +309,9 @@ entry_connection_new(int type, int socket_family) * in a little while. Otherwise, we're doing this as a linked connection * of some kind, and we should set it up here based on the socket family */ if (socket_family == AF_INET) - entry_conn->entry_cfg.ipv4_traffic = 1; + entry_conn->ipv4_traffic_ok = 1; else if (socket_family == AF_INET6) - entry_conn->entry_cfg.ipv6_traffic = 1; - else if (socket_family == AF_UNIX) - entry_conn->is_socks_socket = 1; + entry_conn->ipv6_traffic_ok = 1; return entry_conn; } @@ -454,11 +429,13 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family) conn->type = type; conn->socket_family = socket_family; +#ifndef USE_BUFFEREVENTS if (!connection_is_listener(conn)) { /* listeners never use their buf */ conn->inbuf = buf_new(); conn->outbuf = buf_new(); } +#endif conn->timestamp_created = now; conn->timestamp_lastread = now; @@ -478,28 +455,12 @@ connection_link_connections(connection_t *conn_a, connection_t *conn_b) conn_b->linked_conn = conn_a; } -/** Return true iff the provided connection listener type supports AF_UNIX - * sockets. */ -int -conn_listener_type_supports_af_unix(int type) -{ - /* For now only control ports or SOCKS ports can be Unix domain sockets - * and listeners at the same time */ - switch (type) { - case CONN_TYPE_CONTROL_LISTENER: - case CONN_TYPE_AP_LISTENER: - return 1; - default: - return 0; - } -} - /** Deallocate memory used by conn. Deallocate its buffers if * necessary, close its socket if necessary, and mark the directory as dirty * if conn is an OR or OP connection. */ STATIC void -connection_free_minimal(connection_t *conn) +connection_free_(connection_t *conn) { void *mem; size_t memlen; @@ -559,9 +520,9 @@ connection_free_minimal(connection_t *conn) buf_free(conn->outbuf); } else { if (conn->socket_family == AF_UNIX) { - /* For now only control and SOCKS ports can be Unix domain sockets + /* For now only control ports can be Unix domain sockets * and listeners at the same time */ - tor_assert(conn_listener_type_supports_af_unix(conn->type)); + tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); if (unlink(conn->address) < 0 && errno != ENOENT) { log_warn(LD_NET, "Could not unlink %s: %s", conn->address, @@ -587,7 +548,8 @@ connection_free_minimal(connection_t *conn) or_conn, TLS_CHAN_TO_BASE(or_conn->chan), U64_PRINTF_ARG( TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier)); - if (!CHANNEL_FINISHED(TLS_CHAN_TO_BASE(or_conn->chan))) { + if (!(TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_CLOSED || + TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_ERROR)) { channel_close_for_error(TLS_CHAN_TO_BASE(or_conn->chan)); } @@ -602,52 +564,45 @@ connection_free_minimal(connection_t *conn) if (entry_conn->socks_request) socks_request_free(entry_conn->socks_request); if (entry_conn->pending_optimistic_data) { - buf_free(entry_conn->pending_optimistic_data); + generic_buffer_free(entry_conn->pending_optimistic_data); } if (entry_conn->sending_optimistic_data) { - buf_free(entry_conn->sending_optimistic_data); + generic_buffer_free(entry_conn->sending_optimistic_data); } } if (CONN_IS_EDGE(conn)) { rend_data_free(TO_EDGE_CONN(conn)->rend_data); - hs_ident_edge_conn_free(TO_EDGE_CONN(conn)->hs_ident); } if (conn->type == CONN_TYPE_CONTROL) { control_connection_t *control_conn = TO_CONTROL_CONN(conn); tor_free(control_conn->safecookie_client_hash); tor_free(control_conn->incoming_cmd); - if (control_conn->ephemeral_onion_services) { - SMARTLIST_FOREACH(control_conn->ephemeral_onion_services, char *, cp, { - memwipe(cp, 0, strlen(cp)); - tor_free(cp); - }); - smartlist_free(control_conn->ephemeral_onion_services); - } } - /* Probably already freed by connection_free. */ - tor_event_free(conn->read_event); - tor_event_free(conn->write_event); - conn->read_event = conn->write_event = NULL; + tor_free(conn->read_event); /* Probably already freed by connection_free. */ + tor_free(conn->write_event); /* Probably already freed by connection_free. */ + IF_HAS_BUFFEREVENT(conn, { + /* This was a workaround to handle bugs in some old versions of libevent + * where callbacks can occur after calling bufferevent_free(). Setting + * the callbacks to NULL prevented this. It shouldn't be necessary any + * more, but let's not tempt fate for now. */ + bufferevent_setcb(conn->bufev, NULL, NULL, NULL, NULL); + bufferevent_free(conn->bufev); + conn->bufev = NULL; + }); if (conn->type == CONN_TYPE_DIR) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); tor_free(dir_conn->requested_resource); - tor_compress_free(dir_conn->compress_state); - if (dir_conn->spool) { - SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled, - spooled_resource_free(spooled)); - smartlist_free(dir_conn->spool); + tor_zlib_free(dir_conn->zlib_state); + if (dir_conn->fingerprint_stack) { + SMARTLIST_FOREACH(dir_conn->fingerprint_stack, char *, cp, tor_free(cp)); + smartlist_free(dir_conn->fingerprint_stack); } + cached_dir_decref(dir_conn->cached_dir); rend_data_free(dir_conn->rend_data); - hs_ident_dir_conn_free(dir_conn->hs_ident); - if (dir_conn->guard_state) { - /* Cancel before freeing, if it's still there. */ - entry_guard_cancel(&dir_conn->guard_state); - } - circuit_guard_state_free(dir_conn->guard_state); } if (SOCKET_OK(conn->s)) { @@ -659,7 +614,7 @@ connection_free_minimal(connection_t *conn) if (conn->type == CONN_TYPE_OR && !tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) { log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest"); - connection_or_clear_identity(TO_OR_CONN(conn)); + connection_or_remove_from_identity_map(TO_OR_CONN(conn)); } if (conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR) { connection_or_remove_from_ext_or_id_map(TO_OR_CONN(conn)); @@ -668,20 +623,29 @@ connection_free_minimal(connection_t *conn) tor_free(TO_OR_CONN(conn)->ext_or_transport); } +#ifdef USE_BUFFEREVENTS + if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) { + ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg); + TO_OR_CONN(conn)->bucket_cfg = NULL; + } +#endif + memwipe(mem, 0xCC, memlen); /* poison memory */ tor_free(mem); } /** Make sure conn isn't in any of the global conn lists; then free it. */ -MOCK_IMPL(void, -connection_free_,(connection_t *conn)) +void +connection_free(connection_t *conn) { if (!conn) return; tor_assert(!connection_is_on_closeable_list(conn)); tor_assert(!connection_in_array(conn)); - if (BUG(conn->linked_conn)) { + if (conn->linked_conn) { + log_err(LD_BUG, "Called with conn->linked_conn still set."); + tor_fragile_assert(); conn->linked_conn->linked_conn = NULL; if (! conn->linked_conn->marked_for_close && conn->linked_conn->reading_from_linked_conn) @@ -690,21 +654,14 @@ connection_free_,(connection_t *conn)) } if (connection_speaks_cells(conn)) { if (!tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) { - connection_or_clear_identity(TO_OR_CONN(conn)); + connection_or_remove_from_identity_map(TO_OR_CONN(conn)); } } if (conn->type == CONN_TYPE_CONTROL) { connection_control_closed(TO_CONTROL_CONN(conn)); } -#if 1 - /* DEBUGGING */ - if (conn->type == CONN_TYPE_AP) { - connection_ap_warn_and_unmark_if_pending_circ(TO_ENTRY_CONN(conn), - "connection_free"); - } -#endif /* 1 */ connection_unregister_events(conn); - connection_free_minimal(conn); + connection_free_(conn); } /** @@ -768,10 +725,6 @@ connection_close_immediate(connection_t *conn) connection_unregister_events(conn); - /* Prevent the event from getting unblocked. */ - conn->read_blocked_on_bw = - conn->write_blocked_on_bw = 0; - if (SOCKET_OK(conn->s)) tor_close_socket(conn->s); conn->s = TOR_INVALID_SOCKET; @@ -783,7 +736,7 @@ connection_close_immediate(connection_t *conn) } /** Mark conn to be closed next time we loop through - * conn_close_if_marked() in main.c. */ + * conn_close_if_marked() in onion_main.c. */ void connection_mark_for_close_(connection_t *conn, int line, const char *file) { @@ -810,17 +763,17 @@ connection_mark_for_close_(connection_t *conn, int line, const char *file) } /** Mark conn to be closed next time we loop through - * conn_close_if_marked() in main.c; the _internal version bypasses the + * conn_close_if_marked() in onion_main.c; the _internal version bypasses the * CONN_TYPE_OR checks; this should be called when you either are sure that * if this is an or_connection_t the controlling channel has been notified * (e.g. with connection_or_notify_error()), or you actually are the - * connection_or_close_for_error() or connection_or_close_normally() function. + * connection_or_close_for_error() or connection_or_close_normally function. * For all other cases, use connection_mark_and_flush() instead, which * checks for or_connection_t properly, instead. See below. */ -MOCK_IMPL(void, -connection_mark_for_close_internal_, (connection_t *conn, - int line, const char *file)) +void +connection_mark_for_close_internal_(connection_t *conn, + int line, const char *file) { assert_connection_ok(conn,0); tor_assert(line); @@ -859,7 +812,7 @@ connection_mark_for_close_internal_, (connection_t *conn, /** Find each connection that has hold_open_until_flushed set to * 1 but hasn't written in the past 15 seconds, and set * hold_open_until_flushed to 0. This means it will get cleaned - * up in the next loop through close_if_marked() in main.c. + * up in the next loop through close_if_marked() in onion_main.c. */ void connection_expire_held_open(void) @@ -930,7 +883,7 @@ create_unix_sockaddr(const char *listenaddress, char **readable_address, *len_out = sizeof(struct sockaddr_un); return sockaddr; } -#else /* !(defined(HAVE_SYS_UN_H) || defined(RUNNING_DOXYGEN)) */ +#else static struct sockaddr * create_unix_sockaddr(const char *listenaddress, char **readable_address, socklen_t *len_out) @@ -943,11 +896,11 @@ create_unix_sockaddr(const char *listenaddress, char **readable_address, tor_fragile_assert(); return NULL; } -#endif /* defined(HAVE_SYS_UN_H) || defined(RUNNING_DOXYGEN) */ +#endif /* HAVE_SYS_UN_H */ -/** Warn that an accept or a connect has failed because we're running out of - * TCP sockets we can use on current system. Rate-limit these warnings so - * that we don't spam the log. */ +/** Warn that an accept or a connect has failed because we're running up + * against our ulimit. Rate-limit these warnings so that we don't spam + * the log. */ static void warn_too_many_conns(void) { @@ -957,7 +910,7 @@ warn_too_many_conns(void) if ((m = rate_limit_log(&last_warned, approx_time()))) { int n_conns = get_n_open_sockets(); log_warn(LD_NET,"Failing because we have %d connections already. Please " - "read doc/TUNING for guidance.%s", n_conns, m); + "raise your ulimit -n.%s", n_conns, m); tor_free(m); control_event_general_status(LOG_WARN, "TOO_MANY_CONNECTIONS CURRENT=%d", n_conns); @@ -965,57 +918,13 @@ warn_too_many_conns(void) } #ifdef HAVE_SYS_UN_H - -#define UNIX_SOCKET_PURPOSE_CONTROL_SOCKET 0 -#define UNIX_SOCKET_PURPOSE_SOCKS_SOCKET 1 - -/** Check if the purpose isn't one of the ones we know what to do with */ - -static int -is_valid_unix_socket_purpose(int purpose) -{ - int valid = 0; - - switch (purpose) { - case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET: - case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET: - valid = 1; - break; - } - - return valid; -} - -/** Return a string description of a unix socket purpose */ -static const char * -unix_socket_purpose_to_string(int purpose) -{ - const char *s = "unknown-purpose socket"; - - switch (purpose) { - case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET: - s = "control socket"; - break; - case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET: - s = "SOCKS socket"; - break; - } - - return s; -} - /** Check whether we should be willing to open an AF_UNIX socket in * path. Return 0 if we should go ahead and -1 if we shouldn't. */ static int -check_location_for_unix_socket(const or_options_t *options, const char *path, - int purpose, const port_cfg_t *port) +check_location_for_unix_socket(const or_options_t *options, const char *path) { int r = -1; - char *p = NULL; - - tor_assert(is_valid_unix_socket_purpose(purpose)); - - p = tor_strdup(path); + char *p = tor_strdup(path); cpd_check_t flags = CPD_CHECK_MODE_ONLY; if (get_parent_directory(p)<0 || p[0] != '/') { log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support " @@ -1023,31 +932,19 @@ check_location_for_unix_socket(const or_options_t *options, const char *path, goto done; } - if (port->is_world_writable) { - /* World-writable sockets can go anywhere. */ - r = 0; - goto done; - } - - if (port->is_group_writable) { + if (options->ControlSocketsGroupWritable) flags |= CPD_GROUP_OK; - } - - if (port->relax_dirmode_check) { - flags |= CPD_RELAX_DIRMODE_CHECK; - } if (check_private_dir(p, flags, options->User) < 0) { char *escpath, *escdir; escpath = esc_for_log(path); escdir = esc_for_log(p); - log_warn(LD_GENERAL, "Before Tor can create a %s in %s, the directory " - "%s needs to exist, and to be accessible only by the user%s " - "account that is running Tor. (On some Unix systems, anybody " - "who can list a socket can connect to it, so Tor is being " - "careful.)", - unix_socket_purpose_to_string(purpose), escpath, escdir, - port->is_group_writable ? " and group" : ""); + log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the " + "directory %s needs to exist, and to be accessible only by the " + "user%s account that is running Tor. (On some Unix systems, " + "anybody who can list a socket can connect to it, so Tor is " + "being careful.)", escpath, escdir, + options->ControlSocketsGroupWritable ? " and group" : ""); tor_free(escpath); tor_free(escdir); goto done; @@ -1058,17 +955,15 @@ check_location_for_unix_socket(const or_options_t *options, const char *path, tor_free(p); return r; } -#endif /* defined(HAVE_SYS_UN_H) */ +#endif /** Tell the TCP stack that it shouldn't wait for a long time after - * sock has closed before reusing its port. Return 0 on success, - * -1 on failure. */ -static int + * sock has closed before reusing its port. */ +static void make_socket_reuseable(tor_socket_t sock) { #ifdef _WIN32 (void) sock; - return 0; #else int one=1; @@ -1078,36 +973,11 @@ make_socket_reuseable(tor_socket_t sock) * already has it bound_. So, don't do that on Win32. */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one, (socklen_t)sizeof(one)) == -1) { - return -1; - } - return 0; -#endif /* defined(_WIN32) */ -} - -#ifdef _WIN32 -/** Tell the Windows TCP stack to prevent other applications from receiving - * traffic from tor's open ports. Return 0 on success, -1 on failure. */ -static int -make_win32_socket_exclusive(tor_socket_t sock) -{ -#ifdef SO_EXCLUSIVEADDRUSE - int one=1; - - /* Any socket that sets REUSEADDR on win32 can bind to a port _even when - * somebody else already has it bound_, and _even if the original socket - * didn't set REUSEADDR_. Use EXCLUSIVEADDRUSE to prevent this port-stealing - * on win32. */ - if (setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (void*) &one, - (socklen_t)sizeof(one))) { - return -1; + log_warn(LD_NET, "Error setting SO_REUSEADDR flag: %s", + tor_socket_strerror(errno)); } - return 0; -#else /* !(defined(SO_EXCLUSIVEADDRUSE)) */ - (void) sock; - return 0; -#endif /* defined(SO_EXCLUSIVEADDRUSE) */ +#endif } -#endif /* defined(_WIN32) */ /** Max backlog to pass to listen. We start at */ static int listen_limit = INT_MAX; @@ -1138,73 +1008,54 @@ tor_listen(tor_socket_t fd) */ static connection_t * connection_listener_new(const struct sockaddr *listensockaddr, - socklen_t socklen, - int type, const char *address, - const port_cfg_t *port_cfg) + socklen_t socklen, + int type, const char *address, + const port_cfg_t *port_cfg) { listener_connection_t *lis_conn; connection_t *conn = NULL; tor_socket_t s = TOR_INVALID_SOCKET; /* the socket we're going to make */ or_options_t const *options = get_options(); - (void) options; /* Windows doesn't use this. */ #if defined(HAVE_PWD_H) && defined(HAVE_SYS_UN_H) - const struct passwd *pw = NULL; + struct passwd *pw = NULL; #endif uint16_t usePort = 0, gotPort = 0; int start_reading = 0; static int global_next_session_group = SESSION_GROUP_FIRST_AUTO; tor_addr_t addr; - int exhaustion = 0; + + if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { + warn_too_many_conns(); + return NULL; + } if (listensockaddr->sa_family == AF_INET || listensockaddr->sa_family == AF_INET6) { - int is_stream = (type != CONN_TYPE_AP_DNS_LISTENER); - if (is_stream) + int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER); + if (is_tcp) start_reading = 1; tor_addr_from_sockaddr(&addr, listensockaddr, &usePort); + log_notice(LD_NET, "Opening %s on %s", conn_type_to_string(type), fmt_addrport(&addr, usePort)); s = tor_open_socket_nonblocking(tor_addr_family(&addr), - is_stream ? SOCK_STREAM : SOCK_DGRAM, - is_stream ? IPPROTO_TCP: IPPROTO_UDP); + is_tcp ? SOCK_STREAM : SOCK_DGRAM, + is_tcp ? IPPROTO_TCP: IPPROTO_UDP); if (!SOCKET_OK(s)) { - int e = tor_socket_errno(s); - if (ERRNO_IS_RESOURCE_LIMIT(e)) { - warn_too_many_conns(); - /* - * We'll call the OOS handler at the error exit, so set the - * exhaustion flag for it. - */ - exhaustion = 1; - } else { - log_warn(LD_NET, "Socket creation failed: %s", - tor_socket_strerror(e)); - } + log_warn(LD_NET,"Socket creation failed: %s", + tor_socket_strerror(tor_socket_errno(-1))); goto err; } - if (make_socket_reuseable(s) < 0) { - log_warn(LD_NET, "Error setting SO_REUSEADDR flag on %s: %s", - conn_type_to_string(type), - tor_socket_strerror(errno)); - } - -#ifdef _WIN32 - if (make_win32_socket_exclusive(s) < 0) { - log_warn(LD_NET, "Error setting SO_EXCLUSIVEADDRUSE flag on %s: %s", - conn_type_to_string(type), - tor_socket_strerror(errno)); - } -#endif /* defined(_WIN32) */ + make_socket_reuseable(s); -#if defined(USE_TRANSPARENT) && defined(IP_TRANSPARENT) +#if defined USE_TRANSPARENT && defined(IP_TRANSPARENT) if (options->TransProxyType_parsed == TPT_TPROXY && type == CONN_TYPE_AP_TRANS_LISTENER) { int one = 1; - if (setsockopt(s, SOL_IP, IP_TRANSPARENT, (void*)&one, - (socklen_t)sizeof(one)) < 0) { + if (setsockopt(s, SOL_IP, IP_TRANSPARENT, &one, sizeof(one)) < 0) { const char *extra = ""; int e = tor_socket_errno(s); if (e == EPERM) @@ -1214,22 +1065,27 @@ connection_listener_new(const struct sockaddr *listensockaddr, tor_socket_strerror(e), extra); } } -#endif /* defined(USE_TRANSPARENT) && defined(IP_TRANSPARENT) */ +#endif #ifdef IPV6_V6ONLY if (listensockaddr->sa_family == AF_INET6) { +#ifdef _WIN32 + /* In Redmond, this kind of thing passes for standards-conformance. */ + DWORD one = 1; +#else int one = 1; +#endif /* We need to set IPV6_V6ONLY so that this socket can't get used for * IPv4 connections. */ if (setsockopt(s,IPPROTO_IPV6, IPV6_V6ONLY, - (void*)&one, (socklen_t)sizeof(one)) < 0) { + (void*)&one, sizeof(one)) < 0) { int e = tor_socket_errno(s); log_warn(LD_NET, "Error setting IPV6_V6ONLY flag: %s", tor_socket_strerror(e)); /* Keep going; probably not harmful. */ } } -#endif /* defined(IPV6_V6ONLY) */ +#endif if (bind(s,listensockaddr,socklen) < 0) { const char *helpfulhint = ""; @@ -1241,7 +1097,7 @@ connection_listener_new(const struct sockaddr *listensockaddr, goto err; } - if (is_stream) { + if (is_tcp) { if (tor_listen(s) < 0) { log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort, tor_socket_strerror(tor_socket_errno(s))); @@ -1264,21 +1120,15 @@ connection_listener_new(const struct sockaddr *listensockaddr, tor_addr_from_sockaddr(&addr2, (struct sockaddr*)&ss, &gotPort); } #ifdef HAVE_SYS_UN_H - /* - * AF_UNIX generic setup stuff - */ } else if (listensockaddr->sa_family == AF_UNIX) { - /* We want to start reading for both AF_UNIX cases */ start_reading = 1; - tor_assert(conn_listener_type_supports_af_unix(type)); + /* For now only control ports can be Unix domain sockets + * and listeners at the same time */ + tor_assert(type == CONN_TYPE_CONTROL_LISTENER); - if (check_location_for_unix_socket(options, address, - (type == CONN_TYPE_CONTROL_LISTENER) ? - UNIX_SOCKET_PURPOSE_CONTROL_SOCKET : - UNIX_SOCKET_PURPOSE_SOCKS_SOCKET, port_cfg) < 0) { - goto err; - } + if (check_location_for_unix_socket(options, address) < 0) + goto err; log_notice(LD_NET, "Opening %s on %s", conn_type_to_string(type), address); @@ -1290,70 +1140,36 @@ connection_listener_new(const struct sockaddr *listensockaddr, strerror(errno)); goto err; } - s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0); if (! SOCKET_OK(s)) { - int e = tor_socket_errno(s); - if (ERRNO_IS_RESOURCE_LIMIT(e)) { - warn_too_many_conns(); - /* - * We'll call the OOS handler at the error exit, so set the - * exhaustion flag for it. - */ - exhaustion = 1; - } else { - log_warn(LD_NET,"Socket creation failed: %s.", strerror(e)); - } + log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno)); goto err; } - if (bind(s, listensockaddr, - (socklen_t)sizeof(struct sockaddr_un)) == -1) { + if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) { log_warn(LD_NET,"Bind to %s failed: %s.", address, tor_socket_strerror(tor_socket_errno(s))); goto err; } - #ifdef HAVE_PWD_H if (options->User) { - pw = tor_getpwnam(options->User); - struct stat st; + pw = getpwnam(options->User); if (pw == NULL) { log_warn(LD_NET,"Unable to chown() %s socket: user %s not found.", address, options->User); goto err; - } else if (fstat(s, &st) == 0 && - st.st_uid == pw->pw_uid && st.st_gid == pw->pw_gid) { - /* No change needed */ - } else if (chown(sandbox_intern_string(address), - pw->pw_uid, pw->pw_gid) < 0) { + } else if (chown(address, pw->pw_uid, pw->pw_gid) < 0) { log_warn(LD_NET,"Unable to chown() %s socket: %s.", address, strerror(errno)); goto err; } } -#endif /* defined(HAVE_PWD_H) */ - - { - unsigned mode; - const char *status; - struct stat st; - if (port_cfg->is_world_writable) { - mode = 0666; - status = "world-writable"; - } else if (port_cfg->is_group_writable) { - mode = 0660; - status = "group-writable"; - } else { - mode = 0600; - status = "private"; - } +#endif + if (options->ControlSocketsGroupWritable) { /* We need to use chmod; fchmod doesn't work on sockets on all * platforms. */ - if (fstat(s, &st) == 0 && (st.st_mode & 0777) == mode) { - /* no change needed */ - } else if (chmod(sandbox_intern_string(address), mode) < 0) { - log_warn(LD_FS,"Unable to make %s %s.", address, status); + if (chmod(address, 0660) < 0) { + log_warn(LD_FS,"Unable to make %s group-writable.", address); goto err; } } @@ -1363,7 +1179,9 @@ connection_listener_new(const struct sockaddr *listensockaddr, tor_socket_strerror(tor_socket_errno(s))); goto err; } -#endif /* defined(HAVE_SYS_UN_H) */ +#else + (void)options; +#endif /* HAVE_SYS_UN_H */ } else { log_err(LD_BUG, "Got unexpected address family %d.", listensockaddr->sa_family); @@ -1379,12 +1197,10 @@ connection_listener_new(const struct sockaddr *listensockaddr, conn->port = gotPort; tor_addr_copy(&conn->addr, &addr); - memcpy(&lis_conn->entry_cfg, &port_cfg->entry_cfg, sizeof(entry_port_cfg_t)); - - if (port_cfg->entry_cfg.isolation_flags) { - lis_conn->entry_cfg.isolation_flags = port_cfg->entry_cfg.isolation_flags; - if (port_cfg->entry_cfg.session_group >= 0) { - lis_conn->entry_cfg.session_group = port_cfg->entry_cfg.session_group; + if (port_cfg->isolation_flags) { + lis_conn->isolation_flags = port_cfg->isolation_flags; + if (port_cfg->session_group >= 0) { + lis_conn->session_group = port_cfg->session_group; } else { /* This can wrap after around INT_MAX listeners are opened. But I don't * believe that matters, since you would need to open a ridiculous @@ -1392,15 +1208,23 @@ connection_listener_new(const struct sockaddr *listensockaddr, * hit this. An OR with a dozen ports open, for example, would have to * close and re-open its listeners every second for 4 years nonstop. */ - lis_conn->entry_cfg.session_group = global_next_session_group--; + lis_conn->session_group = global_next_session_group--; } } - - if (type != CONN_TYPE_AP_LISTENER) { - lis_conn->entry_cfg.ipv4_traffic = 1; - lis_conn->entry_cfg.ipv6_traffic = 1; - lis_conn->entry_cfg.prefer_ipv6 = 0; + if (type == CONN_TYPE_AP_LISTENER) { + lis_conn->socks_ipv4_traffic = port_cfg->ipv4_traffic; + lis_conn->socks_ipv6_traffic = port_cfg->ipv6_traffic; + lis_conn->socks_prefer_ipv6 = port_cfg->prefer_ipv6; + } else { + lis_conn->socks_ipv4_traffic = 1; + lis_conn->socks_ipv6_traffic = 1; } + lis_conn->cache_ipv4_answers = port_cfg->cache_ipv4_answers; + lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers; + lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers; + lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers; + lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr; + lis_conn->socks_prefer_no_auth = port_cfg->socks_prefer_no_auth; if (connection_add(conn) < 0) { /* no space, forget it */ log_warn(LD_NET,"connection_add for listener failed. Giving up."); @@ -1419,12 +1243,6 @@ connection_listener_new(const struct sockaddr *listensockaddr, dnsserv_configure_listener(conn); } - /* - * Normal exit; call the OOS handler since connection count just changed; - * the exhaustion flag will always be zero here though. - */ - connection_check_oos(get_n_open_sockets(), 0); - return conn; err: @@ -1433,9 +1251,6 @@ connection_listener_new(const struct sockaddr *listensockaddr, if (conn) connection_free(conn); - /* Call the OOS handler, indicate if we saw an exhaustion-related error */ - connection_check_oos(get_n_open_sockets(), exhaustion); - return NULL; } @@ -1476,8 +1291,6 @@ check_sockaddr(const struct sockaddr *sa, int len, int level) "Address for new connection has address/port equal to zero."); ok = 0; } - } else if (sa->sa_family == AF_UNIX) { - ok = 1; } else { ok = 0; } @@ -1511,7 +1324,7 @@ static int connection_handle_listener_read(connection_t *conn, int new_type) { tor_socket_t news; /* the new socket */ - connection_t *newconn = 0; + connection_t *newconn; /* information about the remote peer when connecting to other routers */ struct sockaddr_storage addrbuf; struct sockaddr *remote = (struct sockaddr*)&addrbuf; @@ -1526,46 +1339,22 @@ connection_handle_listener_read(connection_t *conn, int new_type) if (!SOCKET_OK(news)) { /* accept() error */ int e = tor_socket_errno(conn->s); if (ERRNO_IS_ACCEPT_EAGAIN(e)) { - /* - * they hung up before we could accept(). that's fine. - * - * give the OOS handler a chance to run though - */ - connection_check_oos(get_n_open_sockets(), 0); - return 0; - } else if (ERRNO_IS_RESOURCE_LIMIT(e)) { + return 0; /* he hung up before we could accept(). that's fine. */ + } else if (ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e)) { warn_too_many_conns(); - /* Exhaustion; tell the OOS handler */ - connection_check_oos(get_n_open_sockets(), 1); return 0; } /* else there was a real error. */ log_warn(LD_NET,"accept() failed: %s. Closing listener.", tor_socket_strerror(e)); connection_mark_for_close(conn); - /* Tell the OOS handler about this too */ - connection_check_oos(get_n_open_sockets(), 0); return -1; } log_debug(LD_NET, "Connection accepted on socket %d (child of fd %d).", (int)news,(int)conn->s); - /* We accepted a new conn; run OOS handler */ - connection_check_oos(get_n_open_sockets(), 0); - - if (make_socket_reuseable(news) < 0) { - if (tor_socket_errno(news) == EINVAL) { - /* This can happen on OSX if we get a badly timed shutdown. */ - log_debug(LD_NET, "make_socket_reuseable returned EINVAL"); - } else { - log_warn(LD_NET, "Error setting SO_REUSEADDR flag on %s: %s", - conn_type_to_string(new_type), - tor_socket_strerror(errno)); - } - tor_close_socket(news); - return 0; - } + make_socket_reuseable(news); if (options->ConstrainedSockets) set_constrained_socket_buffers(news, (int)options->ConstrainedSockSize); @@ -1575,8 +1364,7 @@ connection_handle_listener_read(connection_t *conn, int new_type) return 0; } - if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6 || - (conn->socket_family == AF_UNIX && new_type == CONN_TYPE_AP)) { + if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6) { tor_addr_t addr; uint16_t port; if (check_sockaddr(remote, remotelen, LOG_INFO)<0) { @@ -1614,27 +1402,21 @@ connection_handle_listener_read(connection_t *conn, int new_type) /* remember the remote address */ tor_addr_copy(&newconn->addr, &addr); - if (new_type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) { - newconn->port = 0; - newconn->address = tor_strdup(conn->address); - } else { - newconn->port = port; - newconn->address = tor_addr_to_str_dup(&addr); - } + newconn->port = port; + newconn->address = tor_dup_addr(&addr); - if (new_type == CONN_TYPE_AP && conn->socket_family != AF_UNIX) { - log_info(LD_NET, "New SOCKS connection opened from %s.", - fmt_and_decorate_addr(&addr)); - } - if (new_type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) { - log_info(LD_NET, "New SOCKS AF_UNIX connection opened"); + if (new_type == CONN_TYPE_AP) { + TO_ENTRY_CONN(newconn)->socks_request->socks_prefer_no_auth = + TO_LISTENER_CONN(conn)->socks_prefer_no_auth; } if (new_type == CONN_TYPE_CONTROL) { log_notice(LD_CONTROL, "New control connection opened from %s.", fmt_and_decorate_addr(&addr)); } - } else if (conn->socket_family == AF_UNIX && conn->type != CONN_TYPE_AP) { + } else if (conn->socket_family == AF_UNIX) { + /* For now only control ports can be Unix domain sockets + * and listeners at the same time */ tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); tor_assert(new_type == CONN_TYPE_CONTROL); log_notice(LD_CONTROL, "New control connection opened."); @@ -1664,15 +1446,11 @@ connection_handle_listener_read(connection_t *conn, int new_type) } /** Initialize states for newly accepted connection conn. - * * If conn is an OR, start the TLS handshake. - * * If conn is a transparent AP, get its original destination * and place it in circuit_wait. - * - * The listener parameter is only used for AP connections. */ -int +static int connection_init_accepted_conn(connection_t *conn, const listener_connection_t *listener) { @@ -1693,29 +1471,34 @@ connection_init_accepted_conn(connection_t *conn, return rv; break; case CONN_TYPE_AP: - memcpy(&TO_ENTRY_CONN(conn)->entry_cfg, &listener->entry_cfg, - sizeof(entry_port_cfg_t)); + TO_ENTRY_CONN(conn)->isolation_flags = listener->isolation_flags; + TO_ENTRY_CONN(conn)->session_group = listener->session_group; TO_ENTRY_CONN(conn)->nym_epoch = get_signewnym_epoch(); TO_ENTRY_CONN(conn)->socks_request->listener_type = listener->base_.type; + TO_ENTRY_CONN(conn)->ipv4_traffic_ok = listener->socks_ipv4_traffic; + TO_ENTRY_CONN(conn)->ipv6_traffic_ok = listener->socks_ipv6_traffic; + TO_ENTRY_CONN(conn)->prefer_ipv6_traffic = listener->socks_prefer_ipv6; + TO_ENTRY_CONN(conn)->cache_ipv4_answers = listener->cache_ipv4_answers; + TO_ENTRY_CONN(conn)->cache_ipv6_answers = listener->cache_ipv6_answers; + TO_ENTRY_CONN(conn)->use_cached_ipv4_answers = + listener->use_cached_ipv4_answers; + TO_ENTRY_CONN(conn)->use_cached_ipv6_answers = + listener->use_cached_ipv6_answers; + TO_ENTRY_CONN(conn)->prefer_ipv6_virtaddr = + listener->prefer_ipv6_virtaddr; switch (TO_CONN(listener)->type) { case CONN_TYPE_AP_LISTENER: conn->state = AP_CONN_STATE_SOCKS_WAIT; - TO_ENTRY_CONN(conn)->socks_request->socks_prefer_no_auth = - listener->entry_cfg.socks_prefer_no_auth; break; case CONN_TYPE_AP_TRANS_LISTENER: TO_ENTRY_CONN(conn)->is_transparent_ap = 1; - /* XXXX028 -- is this correct still, with the addition of - * pending_entry_connections ? */ conn->state = AP_CONN_STATE_CIRCUIT_WAIT; return connection_ap_process_transparent(TO_ENTRY_CONN(conn)); case CONN_TYPE_AP_NATD_LISTENER: TO_ENTRY_CONN(conn)->is_transparent_ap = 1; conn->state = AP_CONN_STATE_NATD_WAIT; break; - case CONN_TYPE_AP_HTTP_CONNECT_LISTENER: - conn->state = AP_CONN_STATE_HTTP_CONNECT_WAIT; } break; case CONN_TYPE_DIR: @@ -1730,33 +1513,40 @@ connection_init_accepted_conn(connection_t *conn, } /** Take conn, make a nonblocking socket; try to connect to - * sa, binding to bindaddr if sa is not localhost. If fail, return -1 and if + * addr:port (they arrive in *host order*). If fail, return -1 and if * applicable put your best guess about errno into *socket_error. - * If connected return 1, if EAGAIN return 0. + * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. + * + * address is used to make the logs useful. + * + * On success, add conn to the list of polled connections. */ -MOCK_IMPL(STATIC int, -connection_connect_sockaddr,(connection_t *conn, - const struct sockaddr *sa, - socklen_t sa_len, - const struct sockaddr *bindaddr, - socklen_t bindaddr_len, - int *socket_error)) +int +connection_connect(connection_t *conn, const char *address, + const tor_addr_t *addr, uint16_t port, int *socket_error) { tor_socket_t s; int inprogress = 0; + struct sockaddr_storage addrbuf; + struct sockaddr *dest_addr; + int dest_addr_len; const or_options_t *options = get_options(); + int protocol_family; - tor_assert(conn); - tor_assert(sa); - tor_assert(socket_error); + if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { + warn_too_many_conns(); + *socket_error = SOCK_ERRNO(ENOBUFS); + return -1; + } + + if (tor_addr_family(addr) == AF_INET6) + protocol_family = PF_INET6; + else + protocol_family = PF_INET; if (get_options()->DisableNetwork) { /* We should never even try to connect anyplace if DisableNetwork is set. - * Warn if we do, and refuse to make the connection. - * - * We only check DisableNetwork here, not we_are_hibernating(), since - * we'll still try to fulfill client requests sometimes in the latter case - * (if it is soft hibernation) */ + * Warn if we do, and refuse to make the connection. */ static ratelim_t disablenet_violated = RATELIM_INIT(30*60); *socket_error = SOCK_ERRNO(ENETUNREACH); log_fn_ratelim(&disablenet_violated, LOG_WARN, LD_BUG, @@ -1765,60 +1555,68 @@ connection_connect_sockaddr,(connection_t *conn, return -1; } - const int protocol_family = sa->sa_family; - const int proto = (sa->sa_family == AF_INET6 || - sa->sa_family == AF_INET) ? IPPROTO_TCP : 0; - - s = tor_open_socket_nonblocking(protocol_family, SOCK_STREAM, proto); + s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP); if (! SOCKET_OK(s)) { - /* - * Early OOS handler calls; it matters if it's an exhaustion-related - * error or not. - */ - *socket_error = tor_socket_errno(s); - if (ERRNO_IS_RESOURCE_LIMIT(*socket_error)) { - warn_too_many_conns(); - connection_check_oos(get_n_open_sockets(), 1); - } else { - log_warn(LD_NET,"Error creating network socket: %s", - tor_socket_strerror(*socket_error)); - connection_check_oos(get_n_open_sockets(), 0); - } + *socket_error = tor_socket_errno(-1); + log_warn(LD_NET,"Error creating network socket: %s", + tor_socket_strerror(*socket_error)); return -1; } - if (make_socket_reuseable(s) < 0) { - log_warn(LD_NET, "Error setting SO_REUSEADDR flag on new connection: %s", - tor_socket_strerror(errno)); - } - - /* - * We've got the socket open; give the OOS handler a chance to check - * against configured maximum socket number, but tell it no exhaustion - * failure. - */ - connection_check_oos(get_n_open_sockets(), 0); + make_socket_reuseable(s); - if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) { - *socket_error = tor_socket_errno(s); - log_warn(LD_NET,"Error binding network socket: %s", - tor_socket_strerror(*socket_error)); - tor_close_socket(s); - return -1; + if (!tor_addr_is_loopback(addr)) { + const tor_addr_t *ext_addr = NULL; + if (protocol_family == AF_INET && + !tor_addr_is_null(&options->OutboundBindAddressIPv4_)) + ext_addr = &options->OutboundBindAddressIPv4_; + else if (protocol_family == AF_INET6 && + !tor_addr_is_null(&options->OutboundBindAddressIPv6_)) + ext_addr = &options->OutboundBindAddressIPv6_; + if (ext_addr) { + struct sockaddr_storage ext_addr_sa; + socklen_t ext_addr_len = 0; + memset(&ext_addr_sa, 0, sizeof(ext_addr_sa)); + ext_addr_len = tor_addr_to_sockaddr(ext_addr, 0, + (struct sockaddr *) &ext_addr_sa, + sizeof(ext_addr_sa)); + if (ext_addr_len == 0) { + log_warn(LD_NET, + "Error converting OutboundBindAddress %s into sockaddr. " + "Ignoring.", fmt_and_decorate_addr(ext_addr)); + } else { + if (bind(s, (struct sockaddr *) &ext_addr_sa, ext_addr_len) < 0) { + *socket_error = tor_socket_errno(s); + log_warn(LD_NET,"Error binding network socket to %s: %s", + fmt_and_decorate_addr(ext_addr), + tor_socket_strerror(*socket_error)); + tor_close_socket(s); + return -1; + } + } + } } - tor_assert(options); if (options->ConstrainedSockets) set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); - if (connect(s, sa, sa_len) < 0) { + memset(&addrbuf,0,sizeof(addrbuf)); + dest_addr = (struct sockaddr*) &addrbuf; + dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf)); + tor_assert(dest_addr_len > 0); + + log_debug(LD_NET, "Connecting to %s:%u.", + escaped_safe_str_client(address), port); + + if (connect(s, dest_addr, (socklen_t)dest_addr_len) < 0) { int e = tor_socket_errno(s); if (!ERRNO_IS_CONN_EINPROGRESS(e)) { /* yuck. kill it. */ *socket_error = e; log_info(LD_NET, - "connect() to socket failed: %s", - tor_socket_strerror(e)); + "connect() to %s:%u failed: %s", + escaped_safe_str_client(address), + port, tor_socket_strerror(e)); tor_close_socket(s); return -1; } else { @@ -1827,261 +1625,41 @@ connection_connect_sockaddr,(connection_t *conn, } /* it succeeded. we're connected. */ - log_fn(inprogress ? LOG_DEBUG : LOG_INFO, LD_NET, - "Connection to socket %s (sock "TOR_SOCKET_T_FORMAT").", - inprogress ? "in progress" : "established", s); + log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET, + "Connection to %s:%u %s (sock "TOR_SOCKET_T_FORMAT").", + escaped_safe_str_client(address), + port, inprogress?"in progress":"established", s); conn->s = s; if (connection_add_connecting(conn) < 0) { /* no space, forget it */ *socket_error = SOCK_ERRNO(ENOBUFS); return -1; } - return inprogress ? 0 : 1; } -/* Log a message if connection attempt is made when IPv4 or IPv6 is disabled. - * Log a less severe message if we couldn't conform to ClientPreferIPv6ORPort - * or ClientPreferIPv6ORPort. */ -static void -connection_connect_log_client_use_ip_version(const connection_t *conn) +/** Convert state number to string representation for logging purposes. + */ +static const char * +connection_proxy_state_to_string(int state) { - const or_options_t *options = get_options(); - - /* Only clients care about ClientUseIPv4/6, bail out early on servers, and - * on connections we don't care about */ - if (server_mode(options) || !conn || conn->type == CONN_TYPE_EXIT) { - return; - } - - /* We're only prepared to log OR and DIR connections here */ - if (conn->type != CONN_TYPE_OR && conn->type != CONN_TYPE_DIR) { - return; - } - - const int must_ipv4 = !fascist_firewall_use_ipv6(options); - const int must_ipv6 = (options->ClientUseIPv4 == 0); - const int pref_ipv6 = (conn->type == CONN_TYPE_OR - ? fascist_firewall_prefer_ipv6_orport(options) - : fascist_firewall_prefer_ipv6_dirport(options)); - tor_addr_t real_addr; - tor_addr_make_null(&real_addr, AF_UNSPEC); - - /* OR conns keep the original address in real_addr, as addr gets overwritten - * with the descriptor address */ - if (conn->type == CONN_TYPE_OR) { - const or_connection_t *or_conn = TO_OR_CONN((connection_t *)conn); - tor_addr_copy(&real_addr, &or_conn->real_addr); - } else if (conn->type == CONN_TYPE_DIR) { - tor_addr_copy(&real_addr, &conn->addr); - } - - /* Check if we broke a mandatory address family restriction */ - if ((must_ipv4 && tor_addr_family(&real_addr) == AF_INET6) - || (must_ipv6 && tor_addr_family(&real_addr) == AF_INET)) { - static int logged_backtrace = 0; - log_info(LD_BUG, "Outgoing %s connection to %s violated ClientUseIPv%s 0.", - conn->type == CONN_TYPE_OR ? "OR" : "Dir", - fmt_addr(&real_addr), - options->ClientUseIPv4 == 0 ? "4" : "6"); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Address came from"); - logged_backtrace = 1; - } - } + static const char *unknown = "???"; + static const char *states[] = { + "PROXY_NONE", + "PROXY_INFANT", + "PROXY_HTTPS_WANT_CONNECT_OK", + "PROXY_SOCKS4_WANT_CONNECT_OK", + "PROXY_SOCKS5_WANT_AUTH_METHOD_NONE", + "PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929", + "PROXY_SOCKS5_WANT_AUTH_RFC1929_OK", + "PROXY_SOCKS5_WANT_CONNECT_OK", + "PROXY_CONNECTED", + }; - /* Bridges are allowed to break IPv4/IPv6 ORPort preferences to connect to - * the node's configured address when ClientPreferIPv6ORPort is auto */ - if (options->UseBridges && conn->type == CONN_TYPE_OR - && options->ClientPreferIPv6ORPort == -1) { - return; - } + if (state < PROXY_NONE || state > PROXY_CONNECTED) + return unknown; - /* Check if we couldn't satisfy an address family preference */ - if ((!pref_ipv6 && tor_addr_family(&real_addr) == AF_INET6) - || (pref_ipv6 && tor_addr_family(&real_addr) == AF_INET)) { - log_info(LD_NET, "Outgoing connection to %s doesn't satisfy " - "ClientPreferIPv6%sPort %d, with ClientUseIPv4 %d, and " - "fascist_firewall_use_ipv6 %d (ClientUseIPv6 %d and UseBridges " - "%d).", - fmt_addr(&real_addr), - conn->type == CONN_TYPE_OR ? "OR" : "Dir", - conn->type == CONN_TYPE_OR ? options->ClientPreferIPv6ORPort - : options->ClientPreferIPv6DirPort, - options->ClientUseIPv4, fascist_firewall_use_ipv6(options), - options->ClientUseIPv6, options->UseBridges); - } -} - -/** Retrieve the outbound address depending on the protocol (IPv4 or IPv6) - * and the connection type (relay, exit, ...) - * Return a socket address or NULL in case nothing is configured. - **/ -const tor_addr_t * -conn_get_outbound_address(sa_family_t family, - const or_options_t *options, unsigned int conn_type) -{ - const tor_addr_t *ext_addr = NULL; - - int fam_index; - switch (family) { - case AF_INET: - fam_index = 0; - break; - case AF_INET6: - fam_index = 1; - break; - default: - return NULL; - } - - // If an exit connection, use the exit address (if present) - if (conn_type == CONN_TYPE_EXIT) { - if (!tor_addr_is_null( - &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT][fam_index])) { - ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT] - [fam_index]; - } else if (!tor_addr_is_null( - &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] - [fam_index])) { - ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] - [fam_index]; - } - } else { // All non-exit connections - if (!tor_addr_is_null( - &options->OutboundBindAddresses[OUTBOUND_ADDR_OR][fam_index])) { - ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_OR] - [fam_index]; - } else if (!tor_addr_is_null( - &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] - [fam_index])) { - ext_addr = &options->OutboundBindAddresses[OUTBOUND_ADDR_EXIT_AND_OR] - [fam_index]; - } - } - return ext_addr; -} - -/** Take conn, make a nonblocking socket; try to connect to - * addr:port (port arrives in *host order*). If fail, return -1 and if - * applicable put your best guess about errno into *socket_error. - * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. - * - * addr:port can be different to conn->addr:conn->port if connecting through - * a proxy. - * - * address is used to make the logs useful. - * - * On success, add conn to the list of polled connections. - */ -int -connection_connect(connection_t *conn, const char *address, - const tor_addr_t *addr, uint16_t port, int *socket_error) -{ - struct sockaddr_storage addrbuf; - struct sockaddr_storage bind_addr_ss; - struct sockaddr *bind_addr = NULL; - struct sockaddr *dest_addr; - int dest_addr_len, bind_addr_len = 0; - - /* Log if we didn't stick to ClientUseIPv4/6 or ClientPreferIPv6OR/DirPort - */ - connection_connect_log_client_use_ip_version(conn); - - if (!tor_addr_is_loopback(addr)) { - const tor_addr_t *ext_addr = NULL; - ext_addr = conn_get_outbound_address(tor_addr_family(addr), get_options(), - conn->type); - if (ext_addr) { - memset(&bind_addr_ss, 0, sizeof(bind_addr_ss)); - bind_addr_len = tor_addr_to_sockaddr(ext_addr, 0, - (struct sockaddr *) &bind_addr_ss, - sizeof(bind_addr_ss)); - if (bind_addr_len == 0) { - log_warn(LD_NET, - "Error converting OutboundBindAddress %s into sockaddr. " - "Ignoring.", fmt_and_decorate_addr(ext_addr)); - } else { - bind_addr = (struct sockaddr *)&bind_addr_ss; - } - } - } - - memset(&addrbuf,0,sizeof(addrbuf)); - dest_addr = (struct sockaddr*) &addrbuf; - dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf)); - tor_assert(dest_addr_len > 0); - - log_debug(LD_NET, "Connecting to %s:%u.", - escaped_safe_str_client(address), port); - - return connection_connect_sockaddr(conn, dest_addr, dest_addr_len, - bind_addr, bind_addr_len, socket_error); -} - -#ifdef HAVE_SYS_UN_H - -/** Take conn, make a nonblocking socket; try to connect to - * an AF_UNIX socket at socket_path. If fail, return -1 and if applicable - * put your best guess about errno into *socket_error. Else assign s - * to conn-\>s: if connected return 1, if EAGAIN return 0. - * - * On success, add conn to the list of polled connections. - */ -int -connection_connect_unix(connection_t *conn, const char *socket_path, - int *socket_error) -{ - struct sockaddr_un dest_addr; - - tor_assert(socket_path); - - /* Check that we'll be able to fit it into dest_addr later */ - if (strlen(socket_path) + 1 > sizeof(dest_addr.sun_path)) { - log_warn(LD_NET, - "Path %s is too long for an AF_UNIX socket\n", - escaped_safe_str_client(socket_path)); - *socket_error = SOCK_ERRNO(ENAMETOOLONG); - return -1; - } - - memset(&dest_addr, 0, sizeof(dest_addr)); - dest_addr.sun_family = AF_UNIX; - strlcpy(dest_addr.sun_path, socket_path, sizeof(dest_addr.sun_path)); - - log_debug(LD_NET, - "Connecting to AF_UNIX socket at %s.", - escaped_safe_str_client(socket_path)); - - return connection_connect_sockaddr(conn, - (struct sockaddr *)&dest_addr, sizeof(dest_addr), - NULL, 0, socket_error); -} - -#endif /* defined(HAVE_SYS_UN_H) */ - -/** Convert state number to string representation for logging purposes. - */ -static const char * -connection_proxy_state_to_string(int state) -{ - static const char *unknown = "???"; - static const char *states[] = { - "PROXY_NONE", - "PROXY_INFANT", - "PROXY_HTTPS_WANT_CONNECT_OK", - "PROXY_SOCKS4_WANT_CONNECT_OK", - "PROXY_SOCKS5_WANT_AUTH_METHOD_NONE", - "PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929", - "PROXY_SOCKS5_WANT_AUTH_RFC1929_OK", - "PROXY_SOCKS5_WANT_CONNECT_OK", - "PROXY_CONNECTED", - }; - - if (state < PROXY_NONE || state > PROXY_CONNECTED) - return unknown; - - return states[state]; + return states[state]; } /** Returns the global proxy type used by tor. Use this function for @@ -2093,14 +1671,14 @@ get_proxy_type(void) { const or_options_t *options = get_options(); - if (options->ClientTransportPlugin) - return PROXY_PLUGGABLE; - else if (options->HTTPSProxy) + if (options->HTTPSProxy) return PROXY_CONNECT; else if (options->Socks4Proxy) return PROXY_SOCKS4; else if (options->Socks5Proxy) return PROXY_SOCKS5; + else if (options->ClientTransportPlugin) + return PROXY_PLUGGABLE; else return PROXY_NONE; } @@ -2158,7 +1736,7 @@ connection_proxy_connect(connection_t *conn, int type) fmt_addrport(&conn->addr, conn->port)); } - connection_buf_add(buf, strlen(buf), conn); + connection_write_to_buf(buf, strlen(buf), conn); conn->proxy_state = PROXY_HTTPS_WANT_CONNECT_OK; break; } @@ -2224,7 +1802,7 @@ connection_proxy_connect(connection_t *conn, int type) buf[8] = 0; /* no userid */ } - connection_buf_add((char *)buf, buf_size, conn); + connection_write_to_buf((char *)buf, buf_size, conn); tor_free(buf); conn->proxy_state = PROXY_SOCKS4_WANT_CONNECT_OK; @@ -2255,7 +1833,7 @@ connection_proxy_connect(connection_t *conn, int type) conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_METHOD_NONE; } - connection_buf_add((char *)buf, 2 + buf[1], conn); + connection_write_to_buf((char *)buf, 2 + buf[1], conn); break; } @@ -2357,22 +1935,27 @@ connection_send_socks5_connect(connection_t *conn) } else { /* AF_INET6 */ buf[3] = 4; reqsize += 16; - memcpy(buf + 4, tor_addr_to_in6_addr8(&conn->addr), 16); + memcpy(buf + 4, tor_addr_to_in6(&conn->addr), 16); memcpy(buf + 20, &port, 2); } - connection_buf_add((char *)buf, reqsize, conn); + connection_write_to_buf((char *)buf, reqsize, conn); conn->proxy_state = PROXY_SOCKS5_WANT_CONNECT_OK; } -/** Wrapper around fetch_from_buf_socks_client: see that functions +/** Wrapper around fetch_from_(buf/evbuffer)_socks_client: see those functions * for documentation of its behavior. */ static int connection_fetch_from_buf_socks_client(connection_t *conn, int state, char **reason) { - return fetch_from_buf_socks_client(conn->inbuf, state, reason); + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_from_evbuffer_socks_client(input, state, reason); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_from_buf_socks_client(conn->inbuf, state, reason); + } } /** Call this from connection_*_process_inbuf() to advance the proxy @@ -2487,7 +2070,7 @@ connection_read_proxy_handshake(connection_t *conn) if (socks_args_string) tor_free(socks_args_string); - connection_buf_add((char *)buf, reqsize, conn); + connection_write_to_buf((char *)buf, reqsize, conn); conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_RFC1929_OK; ret = 0; @@ -2585,7 +2168,7 @@ retry_listener_ports(smartlist_t *old_conns, (conn->socket_family == AF_UNIX && ! wanted->is_unix_addr)) continue; - if (wanted->server_cfg.no_listen) + if (wanted->no_listen) continue; /* We don't want to open a listener for this one */ if (wanted->is_unix_addr) { @@ -2626,17 +2209,8 @@ retry_listener_ports(smartlist_t *old_conns, connection_t *conn; int real_port = port->port == CFG_AUTO_PORT ? 0 : port->port; tor_assert(real_port <= UINT16_MAX); - if (port->server_cfg.no_listen) - continue; - -#ifndef _WIN32 - /* We don't need to be root to create a UNIX socket, so defer until after - * setuid. */ - const or_options_t *options = get_options(); - if (port->is_unix_addr && !geteuid() && (options->User) && - strcmp(options->User, "root")) + if (port->no_listen) continue; -#endif /* !defined(_WIN32) */ if (port->is_unix_addr) { listensockaddr = (struct sockaddr *) @@ -2648,12 +2222,12 @@ retry_listener_ports(smartlist_t *old_conns, real_port, listensockaddr, sizeof(struct sockaddr_storage)); - address = tor_addr_to_str_dup(&port->addr); + address = tor_dup_addr(&port->addr); } if (listensockaddr) { conn = connection_listener_new(listensockaddr, listensocklen, - port->type, address, port); + port->type, address, port); tor_free(listensockaddr); tor_free(address); } else { @@ -2757,6 +2331,7 @@ connection_mark_all_noncontrol_connections(void) if (conn->marked_for_close) continue; switch (conn->type) { + case CONN_TYPE_CPUWORKER: case CONN_TYPE_CONTROL_LISTENER: case CONN_TYPE_CONTROL: break; @@ -2764,20 +2339,6 @@ connection_mark_all_noncontrol_connections(void) connection_mark_unattached_ap(TO_ENTRY_CONN(conn), END_STREAM_REASON_HIBERNATING); break; - case CONN_TYPE_OR: - { - or_connection_t *orconn = TO_OR_CONN(conn); - if (orconn->chan) { - connection_or_close_normally(orconn, 0); - } else { - /* - * There should have been one, but mark for close and hope - * for the best.. - */ - connection_mark_for_close(conn); - } - } - break; default: connection_mark_for_close(conn); break; @@ -2799,22 +2360,29 @@ connection_is_rate_limited(connection_t *conn) return 0; /* Internal connection */ else if (! options->CountPrivateBandwidth && (tor_addr_family(&conn->addr) == AF_UNSPEC || /* no address */ - tor_addr_family(&conn->addr) == AF_UNIX || /* no address */ tor_addr_is_internal(&conn->addr, 0))) return 0; /* Internal address */ else return 1; } +#ifdef USE_BUFFEREVENTS +static struct bufferevent_rate_limit_group *global_rate_limit = NULL; +#else +extern int global_read_bucket, global_write_bucket; +extern int global_relayed_read_bucket, global_relayed_write_bucket; + /** Did either global write bucket run dry last second? If so, * we are likely to run dry again this second, so be stingy with the * tokens we just put in. */ static int write_buckets_empty_last_second = 0; +#endif /** How many seconds of no active local circuits will make the * connection revert to the "relayed" bandwidth class? */ #define CLIENT_IDLE_TIME_FOR_PRIORITY 30 +#ifndef USE_BUFFEREVENTS /** Return 1 if conn should use tokens from the "relayed" * bandwidth rates, else 0. Currently, only OR conns with bandwidth * class 1, and directory conns that are serving data out, count. @@ -2926,13 +2494,28 @@ connection_bucket_write_limit(connection_t *conn, time_t now) return connection_bucket_round_robin(base, priority, global_bucket, conn_bucket); } +#else +static ssize_t +connection_bucket_read_limit(connection_t *conn, time_t now) +{ + (void) now; + return bufferevent_get_max_to_read(conn->bufev); +} +ssize_t +connection_bucket_write_limit(connection_t *conn, time_t now) +{ + (void) now; + return bufferevent_get_max_to_write(conn->bufev); +} +#endif /** Return 1 if the global write buckets are low enough that we * shouldn't send attempt bytes of low-priority directory stuff * out to conn. Else return 0. - * Priority was 1 for v1 requests (directories and running-routers), - * and 2 for v2 requests and later (statuses and descriptors). + * Priority is 1 for v1 requests (directories and running-routers), + * and 2 for v2 requests (statuses and descriptors). But see FFFF in + * directory_handle_command_get() for why we don't use priority 2 yet. * * There are a lot of parameters we could use here: * - global_relayed_write_bucket. Low is bad. @@ -2949,8 +2532,12 @@ connection_bucket_write_limit(connection_t *conn, time_t now) int global_write_bucket_low(connection_t *conn, size_t attempt, int priority) { +#ifdef USE_BUFFEREVENTS + ssize_t smaller_bucket = bufferevent_get_max_to_write(conn->bufev); +#else int smaller_bucket = global_write_bucket < global_relayed_write_bucket ? global_write_bucket : global_relayed_write_bucket; +#endif if (authdir_mode(get_options()) && priority>1) return 0; /* there's always room to answer v2 if we're an auth dir */ @@ -2960,8 +2547,10 @@ global_write_bucket_low(connection_t *conn, size_t attempt, int priority) if (smaller_bucket < (int)attempt) return 1; /* not enough space no matter the priority */ +#ifndef USE_BUFFEREVENTS if (write_buckets_empty_last_second) return 1; /* we're already hitting our limits, no more please */ +#endif if (priority == 1) { /* old-style v1 query */ /* Could we handle *two* of these requests within the next two seconds? */ @@ -3009,6 +2598,37 @@ record_num_bytes_transferred_impl(connection_t *conn, rep_hist_note_exit_bytes(conn->port, num_written, num_read); } +#ifdef USE_BUFFEREVENTS +/** Wrapper around fetch_from_(buf/evbuffer)_socks_client: see those functions + * for documentation of its behavior. */ +static void +record_num_bytes_transferred(connection_t *conn, + time_t now, size_t num_read, size_t num_written) +{ + /* XXX024 check if this is necessary */ + if (num_written >= INT_MAX || num_read >= INT_MAX) { + log_err(LD_BUG, "Value out of range. num_read=%lu, num_written=%lu, " + "connection type=%s, state=%s", + (unsigned long)num_read, (unsigned long)num_written, + conn_type_to_string(conn->type), + conn_state_to_string(conn->type, conn->state)); + if (num_written >= INT_MAX) num_written = 1; + if (num_read >= INT_MAX) num_read = 1; + tor_fragile_assert(); + } + + record_num_bytes_transferred_impl(conn,now,num_read,num_written); +} +#endif + +#ifndef USE_BUFFEREVENTS +/** Last time at which the global or relay buckets were emptied in msec + * since midnight. */ +static uint32_t global_relayed_read_emptied = 0, + global_relayed_write_emptied = 0, + global_read_emptied = 0, + global_write_emptied = 0; + /** Helper: convert given tvnow time value to milliseconds since * midnight. */ static uint32_t @@ -3018,28 +2638,6 @@ msec_since_midnight(const struct timeval *tvnow) ((uint32_t)tvnow->tv_usec / (uint32_t)1000L)); } -/** Helper: return the time in milliseconds since last_empty_time - * when a bucket ran empty that previously had tokens_before tokens - * now has tokens_after tokens after refilling at timestamp - * tvnow, capped at milliseconds_elapsed milliseconds since - * last refilling that bucket. Return 0 if the bucket has not been empty - * since the last refill or has not been refilled. */ -uint32_t -bucket_millis_empty(int tokens_before, uint32_t last_empty_time, - int tokens_after, int milliseconds_elapsed, - const struct timeval *tvnow) -{ - uint32_t result = 0, refilled; - if (tokens_before <= 0 && tokens_after > tokens_before) { - refilled = msec_since_midnight(tvnow); - result = (uint32_t)((refilled + 86400L * 1000L - last_empty_time) % - (86400L * 1000L)); - if (result > (uint32_t)milliseconds_elapsed) - result = (uint32_t)milliseconds_elapsed; - } - return result; -} - /** Check if a bucket which had tokens_before tokens and which got * tokens_removed tokens removed at timestamp tvnow has run * out of tokens, and if so, note the milliseconds since midnight in @@ -3053,13 +2651,6 @@ connection_buckets_note_empty_ts(uint32_t *timestamp_var, *timestamp_var = msec_since_midnight(tvnow); } -/** Last time at which the global or relay buckets were emptied in msec - * since midnight. */ -static uint32_t global_relayed_read_emptied = 0, - global_relayed_write_emptied = 0, - global_read_emptied = 0, - global_write_emptied = 0; - /** We just read num_read and wrote num_written bytes * onto conn. Decrement buckets appropriately. */ static void @@ -3072,11 +2663,9 @@ connection_buckets_decrement(connection_t *conn, time_t now, (unsigned long)num_read, (unsigned long)num_written, conn_type_to_string(conn->type), conn_state_to_string(conn->type, conn->state)); - tor_assert_nonfatal_unreached(); - if (num_written >= INT_MAX) - num_written = 1; - if (num_read >= INT_MAX) - num_read = 1; + if (num_written >= INT_MAX) num_written = 1; + if (num_read >= INT_MAX) num_read = 1; + tor_fragile_assert(); } record_num_bytes_transferred_impl(conn, now, num_read, num_written); @@ -3220,6 +2809,28 @@ connection_bucket_refill_helper(int *bucket, int rate, int burst, } } +/** Helper: return the time in milliseconds since last_empty_time + * when a bucket ran empty that previously had tokens_before tokens + * now has tokens_after tokens after refilling at timestamp + * tvnow, capped at milliseconds_elapsed milliseconds since + * last refilling that bucket. Return 0 if the bucket has not been empty + * since the last refill or has not been refilled. */ +uint32_t +bucket_millis_empty(int tokens_before, uint32_t last_empty_time, + int tokens_after, int milliseconds_elapsed, + const struct timeval *tvnow) +{ + uint32_t result = 0, refilled; + if (tokens_before <= 0 && tokens_after > tokens_before) { + refilled = msec_since_midnight(tvnow); + result = (uint32_t)((refilled + 86400L * 1000L - last_empty_time) % + (86400L * 1000L)); + if (result > (uint32_t)milliseconds_elapsed) + result = (uint32_t)milliseconds_elapsed; + } + return result; +} + /** Time has passed; increment buckets appropriately. */ void connection_bucket_refill(int milliseconds_elapsed, time_t now) @@ -3385,10 +2996,96 @@ connection_bucket_should_increase(int bucket, or_connection_t *conn) return 1; } +#else +static void +connection_buckets_decrement(connection_t *conn, time_t now, + size_t num_read, size_t num_written) +{ + (void) conn; + (void) now; + (void) num_read; + (void) num_written; + /* Libevent does this for us. */ +} + +void +connection_bucket_refill(int seconds_elapsed, time_t now) +{ + (void) seconds_elapsed; + (void) now; + /* Libevent does this for us. */ +} +void +connection_bucket_init(void) +{ + const or_options_t *options = get_options(); + const struct timeval *tick = tor_libevent_get_one_tick_timeout(); + struct ev_token_bucket_cfg *bucket_cfg; + + uint64_t rate, burst; + if (options->RelayBandwidthRate) { + rate = options->RelayBandwidthRate; + burst = options->RelayBandwidthBurst; + } else { + rate = options->BandwidthRate; + burst = options->BandwidthBurst; + } + + /* This can't overflow, since TokenBucketRefillInterval <= 1000, + * and rate started out less than INT32_MAX. */ + rate = (rate * options->TokenBucketRefillInterval) / 1000; + + bucket_cfg = ev_token_bucket_cfg_new((uint32_t)rate, (uint32_t)burst, + (uint32_t)rate, (uint32_t)burst, + tick); + + if (!global_rate_limit) { + global_rate_limit = + bufferevent_rate_limit_group_new(tor_libevent_get_base(), bucket_cfg); + } else { + bufferevent_rate_limit_group_set_cfg(global_rate_limit, bucket_cfg); + } + ev_token_bucket_cfg_free(bucket_cfg); +} + +void +connection_get_rate_limit_totals(uint64_t *read_out, uint64_t *written_out) +{ + if (global_rate_limit == NULL) { + *read_out = *written_out = 0; + } else { + bufferevent_rate_limit_group_get_totals( + global_rate_limit, read_out, written_out); + } +} + +/** Perform whatever operations are needed on conn to enable + * rate-limiting. */ +void +connection_enable_rate_limiting(connection_t *conn) +{ + if (conn->bufev) { + if (!global_rate_limit) + connection_bucket_init(); + tor_add_bufferevent_to_rate_limit_group(conn->bufev, global_rate_limit); + } +} + +static void +connection_consider_empty_write_buckets(connection_t *conn) +{ + (void) conn; +} +static void +connection_consider_empty_read_buckets(connection_t *conn) +{ + (void) conn; +} +#endif /** Read bytes from conn-\>s and process them. * - * It calls connection_buf_read_from_socket() to bring in any new bytes, + * It calls connection_read_to_buf() to bring in any new bytes, * and then calls connection_process_inbuf() to process them. * * Mark the connection and return -1 if you want to close it, else @@ -3414,7 +3111,6 @@ connection_handle_read_impl(connection_t *conn) case CONN_TYPE_AP_LISTENER: case CONN_TYPE_AP_TRANS_LISTENER: case CONN_TYPE_AP_NATD_LISTENER: - case CONN_TYPE_AP_HTTP_CONNECT_LISTENER: return connection_handle_listener_read(conn, CONN_TYPE_AP); case CONN_TYPE_DIR_LISTENER: return connection_handle_listener_read(conn, CONN_TYPE_DIR); @@ -3431,7 +3127,7 @@ connection_handle_read_impl(connection_t *conn) tor_assert(!conn->marked_for_close); before = buf_datalen(conn->inbuf); - if (connection_buf_read_from_socket(conn, &max_to_read, &socket_error) < 0) { + if (connection_read_to_buf(conn, &max_to_read, &socket_error) < 0) { /* There's a read error; kill the connection.*/ if (conn->type == CONN_TYPE_OR) { connection_or_notify_error(TO_OR_CONN(conn), @@ -3528,7 +3224,7 @@ connection_handle_read(connection_t *conn) * Return -1 if we want to break conn, else return 0. */ static int -connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, +connection_read_to_buf(connection_t *conn, ssize_t *max_to_read, int *socket_error) { int result; @@ -3569,7 +3265,7 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, initial_size = buf_datalen(conn->inbuf); /* else open, or closing */ - result = buf_read_from_tls(conn->inbuf, or_conn->tls, at_most); + result = read_to_buf_tls(or_conn->tls, at_most, conn->inbuf); if (TOR_TLS_IS_ERROR(result) || result == TOR_TLS_CLOSE) or_conn->tls_error = result; else @@ -3605,8 +3301,10 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, connection_start_reading(conn); } /* we're already reading, one hopes */ + result = 0; break; case TOR_TLS_DONE: /* no data read, so nothing to process */ + result = 0; break; /* so we call bucket_decrement below */ default: break; @@ -3616,8 +3314,8 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, /* If we have any pending bytes, we read them now. This *can* * take us over our read allotment, but really we shouldn't be * believing that SSL bytes are the same as TCP bytes anyway. */ - int r2 = buf_read_from_tls(conn->inbuf, or_conn->tls, pending); - if (BUG(r2<0)) { + int r2 = read_to_buf_tls(or_conn->tls, pending, conn->inbuf); + if (r2<0) { log_warn(LD_BUG, "apparently, reading pending bytes can fail."); return -1; } @@ -3628,7 +3326,7 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, result, (long)n_read, (long)n_written); } else if (conn->linked) { if (conn->linked_conn) { - result = buf_move_to_buf(conn->inbuf, conn->linked_conn->outbuf, + result = move_buf_to_buf(conn->inbuf, conn->linked_conn->outbuf, &conn->linked_conn->outbuf_flushlen); } else { result = 0; @@ -3646,10 +3344,8 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, /* !connection_speaks_cells, !conn->linked_conn. */ int reached_eof = 0; CONN_LOG_PROTECT(conn, - result = buf_read_from_socket(conn->inbuf, conn->s, - at_most, - &reached_eof, - socket_error)); + result = read_to_buf(conn->s, at_most, conn->inbuf, &reached_eof, + socket_error)); if (reached_eof) conn->inbuf_reached_eof = 1; @@ -3707,7 +3403,7 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, } /* Call even if result is 0, since the global read bucket may - * have reached 0 on a different conn, and this connection needs to + * have reached 0 on a different conn, and this guy needs to * know to stop reading. */ connection_consider_empty_read_buckets(conn); if (n_written > 0 && connection_is_writing(conn)) @@ -3716,31 +3412,215 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read, return 0; } -/** A pass-through to fetch_from_buf. */ -int -connection_buf_get_bytes(char *string, size_t len, connection_t *conn) -{ - return buf_get_bytes(conn->inbuf, string, len); -} +#ifdef USE_BUFFEREVENTS +/* XXXX These generic versions could be simplified by making them + type-specific */ -/** As buf_get_line(), but read from a connection's input buffer. */ -int -connection_buf_get_line(connection_t *conn, char *data, - size_t *data_len) +/** Callback: Invoked whenever bytes are added to or drained from an input + * evbuffer. Used to track the number of bytes read. */ +static void +evbuffer_inbuf_callback(struct evbuffer *buf, + const struct evbuffer_cb_info *info, void *arg) { - return buf_get_line(conn->inbuf, data, data_len); + connection_t *conn = arg; + (void) buf; + /* XXXX These need to get real counts on the non-nested TLS case. - NM */ + if (info->n_added) { + time_t now = approx_time(); + conn->timestamp_lastread = now; + record_num_bytes_transferred(conn, now, info->n_added, 0); + connection_consider_empty_read_buckets(conn); + if (conn->type == CONN_TYPE_AP) { + edge_connection_t *edge_conn = TO_EDGE_CONN(conn); + /*XXXX024 check for overflow*/ + edge_conn->n_read += (int)info->n_added; + } + } } -/** As fetch_from_buf_http, but fetches from a connection's input buffer_t as - * appropriate. */ -int -connection_fetch_from_buf_http(connection_t *conn, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, - size_t max_bodylen, int force_complete) +/** Callback: Invoked whenever bytes are added to or drained from an output + * evbuffer. Used to track the number of bytes written. */ +static void +evbuffer_outbuf_callback(struct evbuffer *buf, + const struct evbuffer_cb_info *info, void *arg) { - return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, - body_out, body_used, max_bodylen, force_complete); + connection_t *conn = arg; + (void)buf; + if (info->n_deleted) { + time_t now = approx_time(); + conn->timestamp_lastwritten = now; + record_num_bytes_transferred(conn, now, 0, info->n_deleted); + connection_consider_empty_write_buckets(conn); + if (conn->type == CONN_TYPE_AP) { + edge_connection_t *edge_conn = TO_EDGE_CONN(conn); + /*XXXX024 check for overflow*/ + edge_conn->n_written += (int)info->n_deleted; + } + } +} + +/** Callback: invoked whenever a bufferevent has read data. */ +void +connection_handle_read_cb(struct bufferevent *bufev, void *arg) +{ + connection_t *conn = arg; + (void) bufev; + if (!conn->marked_for_close) { + if (connection_process_inbuf(conn, 1)<0) /* XXXX Always 1? */ + if (!conn->marked_for_close) + connection_mark_for_close(conn); + } +} + +/** Callback: invoked whenever a bufferevent has written data. */ +void +connection_handle_write_cb(struct bufferevent *bufev, void *arg) +{ + connection_t *conn = arg; + struct evbuffer *output; + if (connection_flushed_some(conn)<0) { + if (!conn->marked_for_close) + connection_mark_for_close(conn); + return; + } + + output = bufferevent_get_output(bufev); + if (!evbuffer_get_length(output)) { + connection_finished_flushing(conn); + if (conn->marked_for_close && conn->hold_open_until_flushed) { + conn->hold_open_until_flushed = 0; + if (conn->linked) { + /* send eof */ + bufferevent_flush(conn->bufev, EV_WRITE, BEV_FINISHED); + } + } + } +} + +/** Callback: invoked whenever a bufferevent has had an event (like a + * connection, or an eof, or an error) occur. */ +void +connection_handle_event_cb(struct bufferevent *bufev, short event, void *arg) +{ + connection_t *conn = arg; + (void) bufev; + if (conn->marked_for_close) + return; + + if (event & BEV_EVENT_CONNECTED) { + tor_assert(connection_state_is_connecting(conn)); + if (connection_finished_connecting(conn)<0) + return; + } + if (event & BEV_EVENT_EOF) { + if (!conn->marked_for_close) { + conn->inbuf_reached_eof = 1; + if (connection_reached_eof(conn)<0) + return; + } + } + if (event & BEV_EVENT_ERROR) { + int socket_error = evutil_socket_geterror(conn->s); + if (conn->type == CONN_TYPE_OR && + conn->state == OR_CONN_STATE_CONNECTING) { + connection_or_connect_failed(TO_OR_CONN(conn), + errno_to_orconn_end_reason(socket_error), + tor_socket_strerror(socket_error)); + } else if (CONN_IS_EDGE(conn)) { + edge_connection_t *edge_conn = TO_EDGE_CONN(conn); + if (!edge_conn->edge_has_sent_end) + connection_edge_end_errno(edge_conn); + if (conn->type == CONN_TYPE_AP && TO_ENTRY_CONN(conn)->socks_request) { + /* broken, don't send a socks reply back */ + TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; + } + } + connection_close_immediate(conn); /* Connection is dead. */ + if (!conn->marked_for_close) + connection_mark_for_close(conn); + } +} + +/** Set up the generic callbacks for the bufferevent on conn. */ +void +connection_configure_bufferevent_callbacks(connection_t *conn) +{ + struct bufferevent *bufev; + struct evbuffer *input, *output; + tor_assert(conn->bufev); + bufev = conn->bufev; + bufferevent_setcb(bufev, + connection_handle_read_cb, + connection_handle_write_cb, + connection_handle_event_cb, + conn); + /* Set a fairly high write low-watermark so that we get the write callback + called whenever data is written to bring us under 128K. Leave the + high-watermark at 0. + */ + bufferevent_setwatermark(bufev, EV_WRITE, 128*1024, 0); + + input = bufferevent_get_input(bufev); + output = bufferevent_get_output(bufev); + evbuffer_add_cb(input, evbuffer_inbuf_callback, conn); + evbuffer_add_cb(output, evbuffer_outbuf_callback, conn); +} +#endif + +/** A pass-through to fetch_from_buf. */ +int +connection_fetch_from_buf(char *string, size_t len, connection_t *conn) +{ + IF_HAS_BUFFEREVENT(conn, { + /* XXX overflow -seb */ + return (int)bufferevent_read(conn->bufev, string, len); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_from_buf(string, len, conn->inbuf); + } +} + +/** As fetch_from_buf_line(), but read from a connection's input buffer. */ +int +connection_fetch_from_buf_line(connection_t *conn, char *data, + size_t *data_len) +{ + IF_HAS_BUFFEREVENT(conn, { + int r; + size_t eol_len=0; + struct evbuffer *input = bufferevent_get_input(conn->bufev); + struct evbuffer_ptr ptr = + evbuffer_search_eol(input, NULL, &eol_len, EVBUFFER_EOL_LF); + if (ptr.pos == -1) + return 0; /* No EOL found. */ + if ((size_t)ptr.pos+eol_len >= *data_len) { + return -1; /* Too long */ + } + *data_len = ptr.pos+eol_len; + r = evbuffer_remove(input, data, ptr.pos+eol_len); + tor_assert(r >= 0); + data[ptr.pos+eol_len] = '\0'; + return 1; + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_from_buf_line(conn->inbuf, data, data_len); + } +} + +/** As fetch_from_buf_http, but fetches from a conncetion's input buffer_t or + * its bufferevent as appropriate. */ +int +connection_fetch_from_buf_http(connection_t *conn, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, + size_t max_bodylen, int force_complete) +{ + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_from_evbuffer_http(input, headers_out, max_headerlen, + body_out, body_used, max_bodylen, force_complete); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, + body_out, body_used, max_bodylen, force_complete); + } } /** Return conn-\>outbuf_flushlen: how many bytes conn wants to flush @@ -3763,9 +3643,9 @@ connection_outbuf_too_full(connection_t *conn) /** Try to flush more bytes onto conn-\>s. * - * This function gets called either from conn_write_callback() in main.c + * This function gets called either from conn_write_callback() in onion_main.c * when libevent tells us that conn wants to write, or below - * from connection_buf_add() when an entire TLS record is ready. + * from connection_write_to_buf() when an entire TLS record is ready. * * Update conn-\>timestamp_lastwritten to now, and call flush_buf * or flush_buf_tls appropriately. If it succeeds and there are no more @@ -3806,15 +3686,9 @@ connection_handle_write_impl(connection_t *conn, int force) if (connection_state_is_connecting(conn)) { if (getsockopt(conn->s, SOL_SOCKET, SO_ERROR, (void*)&e, &len) < 0) { log_warn(LD_BUG, "getsockopt() syscall failed"); - if (conn->type == CONN_TYPE_OR) { - or_connection_t *orconn = TO_OR_CONN(conn); - connection_or_close_for_error(orconn, 0); - } else { - if (CONN_IS_EDGE(conn)) { - connection_edge_end_errno(TO_EDGE_CONN(conn)); - } - connection_mark_for_close(conn); - } + if (CONN_IS_EDGE(conn)) + connection_edge_end_errno(TO_EDGE_CONN(conn)); + connection_mark_for_close(conn); return -1; } if (e) { @@ -3876,7 +3750,7 @@ connection_handle_write_impl(connection_t *conn, int force) /* else open, or closing */ initial_size = buf_datalen(conn->outbuf); - result = buf_flush_to_tls(conn->outbuf, or_conn->tls, + result = flush_buf_tls(or_conn->tls, conn->outbuf, max_to_write, &conn->outbuf_flushlen); /* If we just flushed the last bytes, tell the channel on the @@ -3929,18 +3803,16 @@ connection_handle_write_impl(connection_t *conn, int force) tor_tls_get_n_raw_bytes(or_conn->tls, &n_read, &n_written); log_debug(LD_GENERAL, "After TLS write of %d: %ld read, %ld written", result, (long)n_read, (long)n_written); - or_conn->bytes_xmitted += result; - or_conn->bytes_xmitted_by_tls += n_written; /* So we notice bytes were written even on error */ - /* XXXX This cast is safe since we can never write INT_MAX bytes in a + /* XXXX024 This cast is safe since we can never write INT_MAX bytes in a * single set of TLS operations. But it looks kinda ugly. If we refactor * the *_buf_tls functions, we should make them return ssize_t or size_t * or something. */ result = (int)(initial_size-buf_datalen(conn->outbuf)); } else { CONN_LOG_PROTECT(conn, - result = buf_flush_to_socket(conn->outbuf, conn->s, - max_to_write, &conn->outbuf_flushlen)); + result = flush_buf(conn->s, conn->outbuf, + max_to_write, &conn->outbuf_flushlen)); if (result < 0) { if (CONN_IS_EDGE(conn)) connection_edge_end_errno(TO_EDGE_CONN(conn)); @@ -4019,7 +3891,7 @@ connection_handle_write_impl(connection_t *conn, int force) } /* Call even if result is 0, since the global write bucket may - * have reached 0 on a different conn, and this connection needs to + * have reached 0 on a different conn, and this guy needs to * know to stop writing. */ connection_consider_empty_write_buckets(conn); if (n_read > 0 && connection_is_reading(conn)) @@ -4044,7 +3916,7 @@ connection_handle_write(connection_t *conn, int force) * Try to flush data that's waiting for a write on conn. Return * -1 on failure, 0 on success. * - * Don't use this function for regular writing; the buffers + * Don't use this function for regular writing; the buffers/bufferevents * system should be good enough at scheduling writes there. Instead, this * function is for cases when we're about to exit or something and we want * to report it right away. @@ -4052,71 +3924,13 @@ connection_handle_write(connection_t *conn, int force) int connection_flush(connection_t *conn) { + IF_HAS_BUFFEREVENT(conn, { + int r = bufferevent_flush(conn->bufev, EV_WRITE, BEV_FLUSH); + return (r < 0) ? -1 : 0; + }); return connection_handle_write(conn, 1); } -/** Helper for connection_write_to_buf_impl and connection_write_buf_to_buf: - * - * Return true iff it is okay to queue bytes on conn's outbuf for - * writing. - */ -static int -connection_may_write_to_buf(connection_t *conn) -{ - /* if it's marked for close, only allow write if we mean to flush it */ - if (conn->marked_for_close && !conn->hold_open_until_flushed) - return 0; - - return 1; -} - -/** Helper for connection_write_to_buf_impl and connection_write_buf_to_buf: - * - * Called when an attempt to add bytes on conn's outbuf has failed; - * mark the connection and warn as appropriate. - */ -static void -connection_write_to_buf_failed(connection_t *conn) -{ - if (CONN_IS_EDGE(conn)) { - /* if it failed, it means we have our package/delivery windows set - wrong compared to our max outbuf size. close the whole circuit. */ - log_warn(LD_NET, - "write_to_buf failed. Closing circuit (fd %d).", (int)conn->s); - circuit_mark_for_close(circuit_get_by_edge_conn(TO_EDGE_CONN(conn)), - END_CIRC_REASON_INTERNAL); - } else if (conn->type == CONN_TYPE_OR) { - or_connection_t *orconn = TO_OR_CONN(conn); - log_warn(LD_NET, - "write_to_buf failed on an orconn; notifying of error " - "(fd %d)", (int)(conn->s)); - connection_or_close_for_error(orconn, 0); - } else { - log_warn(LD_NET, - "write_to_buf failed. Closing connection (fd %d).", - (int)conn->s); - connection_mark_for_close(conn); - } -} - -/** Helper for connection_write_to_buf_impl and connection_write_buf_to_buf: - * - * Called when an attempt to add bytes on conn's outbuf has succeeded: - * record the number of bytes added. - */ -static void -connection_write_to_buf_commit(connection_t *conn, size_t len) -{ - /* If we receive optimistic data in the EXIT_CONN_STATE_RESOLVING - * state, we don't want to try to write it right away, since - * conn->write_event won't be set yet. Otherwise, write data from - * this conn as the socket is available. */ - if (conn->write_event) { - connection_start_writing(conn); - } - conn->outbuf_flushlen += len; -} - /** Append len bytes of string onto conn's * outbuf, and ask it to start writing. * @@ -4124,6 +3938,10 @@ connection_write_to_buf_commit(connection_t *conn, size_t len) * its contents compressed or decompressed as they're written. If zlib is * negative, this is the last data to be compressed, and the connection's zlib * state should be flushed. + * + * If it's a local control connection and a 64k chunk is ready, try to flush + * it all, so we don't end up with many megabytes of controller info queued at + * once. */ MOCK_IMPL(void, connection_write_to_buf_impl_,(const char *string, size_t len, @@ -4131,112 +3949,116 @@ connection_write_to_buf_impl_,(const char *string, size_t len, { /* XXXX This function really needs to return -1 on failure. */ int r; + size_t old_datalen; if (!len && !(zlib<0)) return; - - if (!connection_may_write_to_buf(conn)) + /* if it's marked for close, only allow write if we mean to flush it */ + if (conn->marked_for_close && !conn->hold_open_until_flushed) return; - size_t written; + IF_HAS_BUFFEREVENT(conn, { + if (zlib) { + int done = zlib < 0; + r = write_to_evbuffer_zlib(bufferevent_get_output(conn->bufev), + TO_DIR_CONN(conn)->zlib_state, + string, len, done); + } else { + r = bufferevent_write(conn->bufev, string, len); + } + if (r < 0) { + /* XXXX mark for close? */ + log_warn(LD_NET, "bufferevent_write failed! That shouldn't happen."); + } + return; + }); + old_datalen = buf_datalen(conn->outbuf); if (zlib) { - size_t old_datalen = buf_datalen(conn->outbuf); dir_connection_t *dir_conn = TO_DIR_CONN(conn); int done = zlib < 0; - CONN_LOG_PROTECT(conn, r = buf_add_compress(conn->outbuf, - dir_conn->compress_state, - string, len, done)); - written = buf_datalen(conn->outbuf) - old_datalen; + CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf, + dir_conn->zlib_state, + string, len, done)); } else { - CONN_LOG_PROTECT(conn, r = buf_add(conn->outbuf, string, len)); - written = len; + CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf)); } if (r < 0) { - connection_write_to_buf_failed(conn); + if (CONN_IS_EDGE(conn)) { + /* if it failed, it means we have our package/delivery windows set + wrong compared to our max outbuf size. close the whole circuit. */ + log_warn(LD_NET, + "write_to_buf failed. Closing circuit (fd %d).", (int)conn->s); + circuit_mark_for_close(circuit_get_by_edge_conn(TO_EDGE_CONN(conn)), + END_CIRC_REASON_INTERNAL); + } else { + log_warn(LD_NET, + "write_to_buf failed. Closing connection (fd %d).", + (int)conn->s); + connection_mark_for_close(conn); + } return; } - connection_write_to_buf_commit(conn, written); -} - -/** - * Add all bytes from buf to conn's outbuf, draining them - * from buf. (If the connection is marked and will soon be closed, - * nothing is drained.) - */ -void -connection_buf_add_buf(connection_t *conn, buf_t *buf) -{ - tor_assert(conn); - tor_assert(buf); - size_t len = buf_datalen(buf); - if (len == 0) - return; - - if (!connection_may_write_to_buf(conn)) - return; - buf_move_all(conn->outbuf, buf); - connection_write_to_buf_commit(conn, len); -} + /* If we receive optimistic data in the EXIT_CONN_STATE_RESOLVING + * state, we don't want to try to write it right away, since + * conn->write_event won't be set yet. Otherwise, write data from + * this conn as the socket is available. */ + if (conn->write_event) { + connection_start_writing(conn); + } + if (zlib) { + conn->outbuf_flushlen += buf_datalen(conn->outbuf) - old_datalen; + } else { + conn->outbuf_flushlen += len; -#define CONN_GET_ALL_TEMPLATE(var, test) \ - STMT_BEGIN \ - smartlist_t *conns = get_connection_array(); \ - smartlist_t *ret_conns = smartlist_new(); \ - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, var) { \ - if (var && (test) && !var->marked_for_close) \ - smartlist_add(ret_conns, var); \ - } SMARTLIST_FOREACH_END(var); \ - return ret_conns; \ - STMT_END - -/* Return a list of connections that aren't close and matches the given type - * and state. The returned list can be empty and must be freed using - * smartlist_free(). The caller does NOT have owernship of the objects in the - * list so it must not free them nor reference them as they can disappear. */ -smartlist_t * -connection_list_by_type_state(int type, int state) -{ - CONN_GET_ALL_TEMPLATE(conn, (conn->type == type && conn->state == state)); -} + /* Should we try flushing the outbuf now? */ + if (conn->in_flushed_some) { + /* Don't flush the outbuf when the reason we're writing more stuff is + * _because_ we flushed the outbuf. That's unfair. */ + return; + } -/* Return a list of connections that aren't close and matches the given type - * and purpose. The returned list can be empty and must be freed using - * smartlist_free(). The caller does NOT have owernship of the objects in the - * list so it must not free them nor reference them as they can disappear. */ -smartlist_t * -connection_list_by_type_purpose(int type, int purpose) -{ - CONN_GET_ALL_TEMPLATE(conn, - (conn->type == type && conn->purpose == purpose)); + if (conn->type == CONN_TYPE_CONTROL && + !connection_is_rate_limited(conn) && + conn->outbuf_flushlen-len < 1<<16 && + conn->outbuf_flushlen >= 1<<16) { + /* just try to flush all of it */ + } else + return; /* no need to try flushing */ + + if (connection_handle_write(conn, 0) < 0) { + if (!conn->marked_for_close) { + /* this connection is broken. remove it. */ + log_warn(LD_BUG, "unhandled error on write for " + "conn (type %d, fd %d); removing", + conn->type, (int)conn->s); + tor_fragile_assert(); + /* do a close-immediate here, so we don't try to flush */ + connection_close_immediate(conn); + } + return; + } + } } -/** Return a connection_t * from get_connection_array() that satisfies test on - * var, and that is not marked for close. */ -#define CONN_GET_TEMPLATE(var, test) \ - STMT_BEGIN \ - smartlist_t *conns = get_connection_array(); \ - SMARTLIST_FOREACH(conns, connection_t *, var, \ - { \ - if (var && (test) && !var->marked_for_close) \ - return var; \ - }); \ - return NULL; \ - STMT_END - /** Return a connection with given type, address, port, and purpose; - * or NULL if no such connection exists (or if all such connections are marked - * for close). */ -MOCK_IMPL(connection_t *, -connection_get_by_type_addr_port_purpose,(int type, + * or NULL if no such connection exists. */ +connection_t * +connection_get_by_type_addr_port_purpose(int type, const tor_addr_t *addr, uint16_t port, - int purpose)) + int purpose) { - CONN_GET_TEMPLATE(conn, - (conn->type == type && + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->type == type && tor_addr_eq(&conn->addr, addr) && conn->port == port && - conn->purpose == purpose)); + conn->purpose == purpose && + !conn->marked_for_close) + return conn; + }); + return NULL; } /** Return the stream with id id if it is not already marked for @@ -4245,7 +4067,13 @@ connection_get_by_type_addr_port_purpose,(int type, connection_t * connection_get_by_global_id(uint64_t id) { - CONN_GET_TEMPLATE(conn, conn->global_identifier == id); + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->global_identifier == id) + return conn; + }); + return NULL; } /** Return a connection of type type that is not marked for close. @@ -4253,7 +4081,13 @@ connection_get_by_global_id(uint64_t id) connection_t * connection_get_by_type(int type) { - CONN_GET_TEMPLATE(conn, conn->type == type); + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->type == type && !conn->marked_for_close) + return conn; + }); + return NULL; } /** Return a connection of type type that is in state state, @@ -4262,7 +4096,13 @@ connection_get_by_type(int type) connection_t * connection_get_by_type_state(int type, int state) { - CONN_GET_TEMPLATE(conn, conn->type == type && conn->state == state); + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->type == type && conn->state == state && !conn->marked_for_close) + return conn; + }); + return NULL; } /** Return a connection of type type that has rendquery equal @@ -4273,118 +4113,73 @@ connection_t * connection_get_by_type_state_rendquery(int type, int state, const char *rendquery) { + smartlist_t *conns = get_connection_array(); + tor_assert(type == CONN_TYPE_DIR || type == CONN_TYPE_AP || type == CONN_TYPE_EXIT); tor_assert(rendquery); - CONN_GET_TEMPLATE(conn, - (conn->type == type && - (!state || state == conn->state)) && - ( - (type == CONN_TYPE_DIR && + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { + if (conn->type == type && + !conn->marked_for_close && + (!state || state == conn->state)) { + if (type == CONN_TYPE_DIR && TO_DIR_CONN(conn)->rend_data && !rend_cmp_service_ids(rendquery, - rend_data_get_address(TO_DIR_CONN(conn)->rend_data))) - || - (CONN_IS_EDGE(conn) && + TO_DIR_CONN(conn)->rend_data->onion_address)) + return conn; + else if (CONN_IS_EDGE(conn) && TO_EDGE_CONN(conn)->rend_data && !rend_cmp_service_ids(rendquery, - rend_data_get_address(TO_EDGE_CONN(conn)->rend_data))) - )); -} - -/** Return a new smartlist of dir_connection_t * from get_connection_array() - * that satisfy conn_test on connection_t *conn_var, and dirconn_test on - * dir_connection_t *dirconn_var. conn_var must be of CONN_TYPE_DIR and not - * marked for close to be included in the list. */ -#define DIR_CONN_LIST_TEMPLATE(conn_var, conn_test, \ - dirconn_var, dirconn_test) \ - STMT_BEGIN \ - smartlist_t *conns = get_connection_array(); \ - smartlist_t *dir_conns = smartlist_new(); \ - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn_var) { \ - if (conn_var && (conn_test) \ - && conn_var->type == CONN_TYPE_DIR \ - && !conn_var->marked_for_close) { \ - dir_connection_t *dirconn_var = TO_DIR_CONN(conn_var); \ - if (dirconn_var && (dirconn_test)) { \ - smartlist_add(dir_conns, dirconn_var); \ - } \ - } \ - } SMARTLIST_FOREACH_END(conn_var); \ - return dir_conns; \ - STMT_END - -/** Return a list of directory connections that are fetching the item - * described by purpose/resource. If there are none, - * return an empty list. This list must be freed using smartlist_free, - * but the pointers in it must not be freed. - * Note that this list should not be cached, as the pointers in it can be - * freed if their connections close. */ -smartlist_t * -connection_dir_list_by_purpose_and_resource( - int purpose, - const char *resource) -{ - DIR_CONN_LIST_TEMPLATE(conn, - conn->purpose == purpose, - dirconn, - 0 == strcmp_opt(resource, - dirconn->requested_resource)); + TO_EDGE_CONN(conn)->rend_data->onion_address)) + return conn; + } + } SMARTLIST_FOREACH_END(conn); + return NULL; } -/** Return a list of directory connections that are fetching the item - * described by purpose/resource/state. If there are - * none, return an empty list. This list must be freed using smartlist_free, - * but the pointers in it must not be freed. - * Note that this list should not be cached, as the pointers in it can be - * freed if their connections close. */ -smartlist_t * -connection_dir_list_by_purpose_resource_and_state( - int purpose, - const char *resource, - int state) +/** Return a directory connection (if any one exists) that is fetching + * the item described by state/resource */ +dir_connection_t * +connection_dir_get_by_purpose_and_resource(int purpose, + const char *resource) { - DIR_CONN_LIST_TEMPLATE(conn, - conn->purpose == purpose && conn->state == state, - dirconn, - 0 == strcmp_opt(resource, - dirconn->requested_resource)); -} + smartlist_t *conns = get_connection_array(); -#undef DIR_CONN_LIST_TEMPLATE + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { + dir_connection_t *dirconn; + if (conn->type != CONN_TYPE_DIR || conn->marked_for_close || + conn->purpose != purpose) + continue; + dirconn = TO_DIR_CONN(conn); + if (dirconn->requested_resource == NULL) { + if (resource == NULL) + return dirconn; + } else if (resource) { + if (0 == strcmp(resource, dirconn->requested_resource)) + return dirconn; + } + } SMARTLIST_FOREACH_END(conn); -/** Return an arbitrary active OR connection that isn't this_conn. - * - * We use this to guess if we should tell the controller that we - * didn't manage to connect to any of our bridges. */ -static connection_t * -connection_get_another_active_or_conn(const or_connection_t *this_conn) -{ - CONN_GET_TEMPLATE(conn, - conn != TO_CONN(this_conn) && conn->type == CONN_TYPE_OR); + return NULL; } -/** Return 1 if there are any active OR connections apart from - * this_conn. - * - * We use this to guess if we should tell the controller that we - * didn't manage to connect to any of our bridges. */ -int -any_other_active_or_conns(const or_connection_t *this_conn) +/** Return an open, non-marked connection of a given type and purpose, or NULL + * if no such connection exists. */ +connection_t * +connection_get_by_type_purpose(int type, int purpose) { - connection_t *conn = connection_get_another_active_or_conn(this_conn); - if (conn != NULL) { - log_debug(LD_DIR, "%s: Found an OR connection: %s", - __func__, conn->address); - return 1; - } - - return 0; + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH(conns, connection_t *, conn, + { + if (conn->type == type && + !conn->marked_for_close && + (purpose == conn->purpose)) + return conn; + }); + return NULL; } -#undef CONN_GET_TEMPLATE - /** Return 1 if conn is a listener conn, else return 0. */ int connection_is_listener(connection_t *conn) @@ -4395,7 +4190,6 @@ connection_is_listener(connection_t *conn) conn->type == CONN_TYPE_AP_TRANS_LISTENER || conn->type == CONN_TYPE_AP_DNS_LISTENER || conn->type == CONN_TYPE_AP_NATD_LISTENER || - conn->type == CONN_TYPE_AP_HTTP_CONNECT_LISTENER || conn->type == CONN_TYPE_DIR_LISTENER || conn->type == CONN_TYPE_CONTROL_LISTENER) return 1; @@ -4454,12 +4248,25 @@ alloc_http_authenticator(const char *authenticator) /* an authenticator in Basic authentication * is just the string "username:password" */ const size_t authenticator_length = strlen(authenticator); - const size_t base64_authenticator_length = - base64_encode_size(authenticator_length, 0) + 1; + /* The base64_encode function needs a minimum buffer length + * of 66 bytes. */ + const size_t base64_authenticator_length = (authenticator_length/48+1)*66; char *base64_authenticator = tor_malloc(base64_authenticator_length); if (base64_encode(base64_authenticator, base64_authenticator_length, - authenticator, authenticator_length, 0) < 0) { + authenticator, authenticator_length) < 0) { tor_free(base64_authenticator); /* free and set to null */ + } else { + int i = 0, j = 0; + ssize_t len = strlen(base64_authenticator); + + /* remove all newline occurrences within the string */ + for (i=0; i < len; ++i) { + if ('\n' != base64_authenticator[i]) { + base64_authenticator[j] = base64_authenticator[i]; + ++j; + } + } + base64_authenticator[j]='\0'; } return base64_authenticator; } @@ -4528,8 +4335,6 @@ client_check_address_changed(tor_socket_t sock) SMARTLIST_FOREACH(outgoing_addrs, tor_addr_t*, a_ptr, tor_free(a_ptr)); smartlist_clear(outgoing_addrs); smartlist_add(outgoing_addrs, tor_memdup(&out_addr, sizeof(tor_addr_t))); - /* We'll need to resolve ourselves again. */ - reset_last_resolved_addr(); /* Okay, now change our keys. */ ip_address_changed(1); } @@ -4581,6 +4386,8 @@ connection_process_inbuf(connection_t *conn, int package_partial) package_partial); case CONN_TYPE_DIR: return connection_dir_process_inbuf(TO_DIR_CONN(conn)); + case CONN_TYPE_CPUWORKER: + return connection_cpu_process_inbuf(conn); case CONN_TYPE_CONTROL: return connection_control_process_inbuf(TO_CONTROL_CONN(conn)); default: @@ -4610,7 +4417,7 @@ connection_flushed_some(connection_t *conn) } /** We just finished flushing bytes to the appropriately low network layer, - * and there are no more bytes remaining in conn-\>outbuf or + * and there are no more bytes remaining in conn-\>outbuf, conn-\>bev, or * conn-\>tls to be flushed. * * This function just passes conn to the connection-specific @@ -4627,7 +4434,8 @@ connection_finished_flushing(connection_t *conn) // log_fn(LOG_DEBUG,"entered. Socket %u.", conn->s); - connection_stop_writing(conn); + IF_HAS_NO_BUFFEREVENT(conn) + connection_stop_writing(conn); switch (conn->type) { case CONN_TYPE_OR: @@ -4639,6 +4447,8 @@ connection_finished_flushing(connection_t *conn) return connection_edge_finished_flushing(TO_EDGE_CONN(conn)); case CONN_TYPE_DIR: return connection_dir_finished_flushing(TO_DIR_CONN(conn)); + case CONN_TYPE_CPUWORKER: + return connection_cpu_finished_flushing(conn); case CONN_TYPE_CONTROL: return connection_control_finished_flushing(TO_CONTROL_CONN(conn)); default: @@ -4694,6 +4504,8 @@ connection_reached_eof(connection_t *conn) return connection_edge_reached_eof(TO_EDGE_CONN(conn)); case CONN_TYPE_DIR: return connection_dir_reached_eof(TO_DIR_CONN(conn)); + case CONN_TYPE_CPUWORKER: + return connection_cpu_reached_eof(conn); case CONN_TYPE_CONTROL: return connection_control_reached_eof(TO_CONTROL_CONN(conn)); default: @@ -4703,256 +4515,6 @@ connection_reached_eof(connection_t *conn) } } -/** Comparator for the two-orconn case in OOS victim sort */ -static int -oos_victim_comparator_for_orconns(or_connection_t *a, or_connection_t *b) -{ - int a_circs, b_circs; - /* Fewer circuits == higher priority for OOS kill, sort earlier */ - - a_circs = connection_or_get_num_circuits(a); - b_circs = connection_or_get_num_circuits(b); - - if (a_circs < b_circs) return 1; - else if (a_circs > b_circs) return -1; - else return 0; -} - -/** Sort comparator for OOS victims; better targets sort before worse - * ones. */ -static int -oos_victim_comparator(const void **a_v, const void **b_v) -{ - connection_t *a = NULL, *b = NULL; - - /* Get connection pointers out */ - - a = (connection_t *)(*a_v); - b = (connection_t *)(*b_v); - - tor_assert(a != NULL); - tor_assert(b != NULL); - - /* - * We always prefer orconns as victims currently; we won't even see - * these non-orconn cases, but if we do, sort them after orconns. - */ - if (a->type == CONN_TYPE_OR && b->type == CONN_TYPE_OR) { - return oos_victim_comparator_for_orconns(TO_OR_CONN(a), TO_OR_CONN(b)); - } else { - /* - * One isn't an orconn; if one is, it goes first. We currently have no - * opinions about cases where neither is an orconn. - */ - if (a->type == CONN_TYPE_OR) return -1; - else if (b->type == CONN_TYPE_OR) return 1; - else return 0; - } -} - -/** Pick n victim connections for the OOS handler and return them in a - * smartlist. - */ -MOCK_IMPL(STATIC smartlist_t *, -pick_oos_victims, (int n)) -{ - smartlist_t *eligible = NULL, *victims = NULL; - smartlist_t *conns; - int conn_counts_by_type[CONN_TYPE_MAX_ + 1], i; - - /* - * Big damn assumption (someone improve this someday!): - * - * Socket exhaustion normally happens on high-volume relays, and so - * most of the connections involved are orconns. We should pick victims - * by assembling a list of all orconns, and sorting them in order of - * how much 'damage' by some metric we'd be doing by dropping them. - * - * If we move on from orconns, we should probably think about incoming - * directory connections next, or exit connections. Things we should - * probably never kill are controller connections and listeners. - * - * This function will count how many connections of different types - * exist and log it for purposes of gathering data on typical OOS - * situations to guide future improvements. - */ - - /* First, get the connection array */ - conns = get_connection_array(); - /* - * Iterate it and pick out eligible connection types, and log some stats - * along the way. - */ - eligible = smartlist_new(); - memset(conn_counts_by_type, 0, sizeof(conn_counts_by_type)); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, c) { - /* Bump the counter */ - tor_assert(c->type <= CONN_TYPE_MAX_); - ++(conn_counts_by_type[c->type]); - - /* Skip anything without a socket we can free */ - if (!(SOCKET_OK(c->s))) { - continue; - } - - /* Skip anything we would count as moribund */ - if (connection_is_moribund(c)) { - continue; - } - - switch (c->type) { - case CONN_TYPE_OR: - /* We've got an orconn, it's eligible to be OOSed */ - smartlist_add(eligible, c); - break; - default: - /* We don't know what to do with it, ignore it */ - break; - } - } SMARTLIST_FOREACH_END(c); - - /* Log some stats */ - if (smartlist_len(conns) > 0) { - /* At least one counter must be non-zero */ - log_info(LD_NET, "Some stats on conn types seen during OOS follow"); - for (i = CONN_TYPE_MIN_; i <= CONN_TYPE_MAX_; ++i) { - /* Did we see any? */ - if (conn_counts_by_type[i] > 0) { - log_info(LD_NET, "%s: %d conns", - conn_type_to_string(i), - conn_counts_by_type[i]); - } - } - log_info(LD_NET, "Done with OOS conn type stats"); - } - - /* Did we find more eligible targets than we want to kill? */ - if (smartlist_len(eligible) > n) { - /* Sort the list in order of target preference */ - smartlist_sort(eligible, oos_victim_comparator); - /* Pick first n as victims */ - victims = smartlist_new(); - for (i = 0; i < n; ++i) { - smartlist_add(victims, smartlist_get(eligible, i)); - } - /* Free the original list */ - smartlist_free(eligible); - } else { - /* No, we can just call them all victims */ - victims = eligible; - } - - return victims; -} - -/** Kill a list of connections for the OOS handler. */ -MOCK_IMPL(STATIC void, -kill_conn_list_for_oos, (smartlist_t *conns)) -{ - if (!conns) return; - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, c) { - /* Make sure the channel layer gets told about orconns */ - if (c->type == CONN_TYPE_OR) { - connection_or_close_for_error(TO_OR_CONN(c), 1); - } else { - connection_mark_for_close(c); - } - } SMARTLIST_FOREACH_END(c); - - log_notice(LD_NET, - "OOS handler marked %d connections", - smartlist_len(conns)); -} - -/** Out-of-Sockets handler; n_socks is the current number of open - * sockets, and failed is non-zero if a socket exhaustion related - * error immediately preceded this call. This is where to do - * circuit-killing heuristics as needed. - */ -void -connection_check_oos(int n_socks, int failed) -{ - int target_n_socks = 0, moribund_socks, socks_to_kill; - smartlist_t *conns; - - /* Early exit: is OOS checking disabled? */ - if (get_options()->DisableOOSCheck) { - return; - } - - /* Sanity-check args */ - tor_assert(n_socks >= 0); - - /* - * Make some log noise; keep it at debug level since this gets a chance - * to run on every connection attempt. - */ - log_debug(LD_NET, - "Running the OOS handler (%d open sockets, %s)", - n_socks, (failed != 0) ? "exhaustion seen" : "no exhaustion"); - - /* - * Check if we're really handling an OOS condition, and if so decide how - * many sockets we want to get down to. Be sure we check if the threshold - * is distinct from zero first; it's possible for this to be called a few - * times before we've finished reading the config. - */ - if (n_socks >= get_options()->ConnLimit_high_thresh && - get_options()->ConnLimit_high_thresh != 0 && - get_options()->ConnLimit_ != 0) { - /* Try to get down to the low threshold */ - target_n_socks = get_options()->ConnLimit_low_thresh; - log_notice(LD_NET, - "Current number of sockets %d is greater than configured " - "limit %d; OOS handler trying to get down to %d", - n_socks, get_options()->ConnLimit_high_thresh, - target_n_socks); - } else if (failed) { - /* - * If we're not at the limit but we hit a socket exhaustion error, try to - * drop some (but not as aggressively as ConnLimit_low_threshold, which is - * 3/4 of ConnLimit_) - */ - target_n_socks = (n_socks * 9) / 10; - log_notice(LD_NET, - "We saw socket exhaustion at %d open sockets; OOS handler " - "trying to get down to %d", - n_socks, target_n_socks); - } - - if (target_n_socks > 0) { - /* - * It's an OOS! - * - * Count moribund sockets; it's be important that anything we decide - * to get rid of here but don't immediately close get counted as moribund - * on subsequent invocations so we don't try to kill too many things if - * connection_check_oos() gets called multiple times. - */ - moribund_socks = connection_count_moribund(); - - if (moribund_socks < n_socks - target_n_socks) { - socks_to_kill = n_socks - target_n_socks - moribund_socks; - - conns = pick_oos_victims(socks_to_kill); - if (conns) { - kill_conn_list_for_oos(conns); - log_notice(LD_NET, - "OOS handler killed %d conns", smartlist_len(conns)); - smartlist_free(conns); - } else { - log_notice(LD_NET, "OOS handler failed to pick any victim conns"); - } - } else { - log_notice(LD_NET, - "Not killing any sockets for OOS because there are %d " - "already moribund, and we only want to eliminate %d", - moribund_socks, n_socks - target_n_socks); - } - } -} - /** Log how many bytes are used by buffers of different kinds and sizes. */ void connection_dump_buffer_mem_stats(int severity) @@ -5011,6 +4573,15 @@ assert_connection_ok(connection_t *conn, time_t now) tor_assert(conn->type >= CONN_TYPE_MIN_); tor_assert(conn->type <= CONN_TYPE_MAX_); +#ifdef USE_BUFFEREVENTS + if (conn->bufev) { + tor_assert(conn->read_event == NULL); + tor_assert(conn->write_event == NULL); + tor_assert(conn->inbuf == NULL); + tor_assert(conn->outbuf == NULL); + } +#endif + switch (conn->type) { case CONN_TYPE_OR: case CONN_TYPE_EXT_OR: @@ -5063,9 +4634,9 @@ assert_connection_ok(connection_t *conn, time_t now) /* buffers */ if (conn->inbuf) - buf_assert_ok(conn->inbuf); + assert_buf_ok(conn->inbuf); if (conn->outbuf) - buf_assert_ok(conn->outbuf); + assert_buf_ok(conn->outbuf); if (conn->type == CONN_TYPE_OR) { or_connection_t *or_conn = TO_OR_CONN(conn); @@ -5140,6 +4711,10 @@ assert_connection_ok(connection_t *conn, time_t now) tor_assert(conn->purpose >= DIR_PURPOSE_MIN_); tor_assert(conn->purpose <= DIR_PURPOSE_MAX_); break; + case CONN_TYPE_CPUWORKER: + tor_assert(conn->state >= CPUWORKER_STATE_MIN_); + tor_assert(conn->state <= CPUWORKER_STATE_MAX_); + break; case CONN_TYPE_CONTROL: tor_assert(conn->state >= CONTROL_CONN_STATE_MIN_); tor_assert(conn->state <= CONTROL_CONN_STATE_MAX_); @@ -5161,27 +4736,6 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type, { const or_options_t *options = get_options(); - /* Client Transport Plugins can use another proxy, but that should be hidden - * from the rest of tor (as the plugin is responsible for dealing with the - * proxy), check it first, then check the rest of the proxy types to allow - * the config to have unused ClientTransportPlugin entries. - */ - if (options->ClientTransportPlugin) { - const transport_t *transport = NULL; - int r; - r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport); - if (r<0) - return -1; - if (transport) { /* transport found */ - tor_addr_copy(addr, &transport->addr); - *port = transport->port; - *proxy_type = transport->socks_version; - return 0; - } - - /* Unused ClientTransportPlugin. */ - } - if (options->HTTPSProxy) { tor_addr_copy(addr, &options->HTTPSProxyAddr); *port = options->HTTPSProxyPort; @@ -5197,10 +4751,21 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type, *port = options->Socks5ProxyPort; *proxy_type = PROXY_SOCKS5; return 0; + } else if (options->ClientTransportPlugin || + options->Bridges) { + const transport_t *transport = NULL; + int r; + r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport); + if (r<0) + return -1; + if (transport) { /* transport found */ + tor_addr_copy(addr, &transport->addr); + *port = transport->port; + *proxy_type = transport->socks_version; + return 0; + } } - tor_addr_make_unspec(addr); - *port = 0; *proxy_type = PROXY_NONE; return 0; } @@ -5220,7 +4785,7 @@ log_failed_proxy_connection(connection_t *conn) log_warn(LD_NET, "The connection to the %s proxy server at %s just failed. " "Make sure that the proxy server is up and running.", - proxy_type_to_string(proxy_type), + proxy_type_to_string(get_proxy_type()), fmt_addrport(&proxy_addr, proxy_port)); } @@ -5239,8 +4804,10 @@ proxy_type_to_string(int proxy_type) return NULL; /*Unreached*/ } -/** Call connection_free_minimal() on every connection in our array, and - * release all storage held by connection.c. +/** Call connection_free_() on every connection in our array, and release all + * storage held by connection.c. This is used by cpuworkers and dnsworkers + * when they fork, so they don't keep resources held open (especially + * sockets). * * Don't do the checks in connection_free(), because they will * fail. @@ -5264,8 +4831,7 @@ connection_free_all(void) /* Clear out our list of broken connections */ clear_broken_connection_map(0); - SMARTLIST_FOREACH(conns, connection_t *, conn, - connection_free_minimal(conn)); + SMARTLIST_FOREACH(conns, connection_t *, conn, connection_free_(conn)); if (outgoing_addrs) { SMARTLIST_FOREACH(outgoing_addrs, tor_addr_t *, addr, tor_free(addr)); @@ -5275,41 +4841,10 @@ connection_free_all(void) tor_free(last_interface_ipv4); tor_free(last_interface_ipv6); -} -/** Log a warning, and possibly emit a control event, that received came - * at a skewed time. trusted indicates that the source was one - * that we had more faith in and therefore the warning level should have higher - * severity. - */ -void -clock_skew_warning(const connection_t *conn, long apparent_skew, int trusted, - log_domain_mask_t domain, const char *received, - const char *source) -{ - char dbuf[64]; - char *ext_source = NULL, *warn = NULL; - format_time_interval(dbuf, sizeof(dbuf), apparent_skew); - if (conn) - tor_asprintf(&ext_source, "%s:%s:%d", source, conn->address, conn->port); - else - ext_source = tor_strdup(source); - log_fn(trusted ? LOG_WARN : LOG_INFO, domain, - "Received %s with skewed time (%s): " - "It seems that our clock is %s by %s, or that theirs is %s%s. " - "Tor requires an accurate clock to work: please check your time, " - "timezone, and date settings.", received, ext_source, - apparent_skew > 0 ? "ahead" : "behind", dbuf, - apparent_skew > 0 ? "behind" : "ahead", - (!conn || trusted) ? "" : ", or they are sending us the wrong time"); - if (trusted) { - control_event_general_status(LOG_WARN, "CLOCK_SKEW SKEW=%ld SOURCE=%s", - apparent_skew, ext_source); - tor_asprintf(&warn, "Clock skew %ld in %s from %s", apparent_skew, - received, source); - control_event_bootstrap_problem(warn, "CLOCK_SKEW", conn, 1); - } - tor_free(warn); - tor_free(ext_source); +#ifdef USE_BUFFEREVENTS + if (global_rate_limit) + bufferevent_rate_limit_group_free(global_rate_limit); +#endif } diff --git a/src/tor/src/or/connection.h b/src/tor/connection.h similarity index 56% rename from src/tor/src/or/connection.h rename to src/tor/connection.h index 6bc5a7cfd..4073d9fc9 100644 --- a/src/tor/src/or/connection.h +++ b/src/tor/connection.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,7 +17,6 @@ const char *conn_type_to_string(int type); const char *conn_state_to_string(int type, int state); -int conn_listener_type_supports_af_unix(int type); dir_connection_t *dir_connection_new(int socket_family); or_connection_t *or_connection_new(int type, int socket_family); @@ -26,19 +25,16 @@ entry_connection_t *entry_connection_new(int type, int socket_family); control_connection_t *control_connection_new(int socket_family); listener_connection_t *listener_connection_new(int type, int socket_family); connection_t *connection_new(int type, int socket_family); -int connection_init_accepted_conn(connection_t *conn, - const listener_connection_t *listener); + void connection_link_connections(connection_t *conn_a, connection_t *conn_b); -MOCK_DECL(void,connection_free_,(connection_t *conn)); -#define connection_free(conn) \ - FREE_AND_NULL(connection_t, connection_free_, (conn)) +void connection_free(connection_t *conn); void connection_free_all(void); void connection_about_to_close_connection(connection_t *conn); void connection_close_immediate(connection_t *conn); void connection_mark_for_close_(connection_t *conn, int line, const char *file); -MOCK_DECL(void, connection_mark_for_close_internal_, - (connection_t *conn, int line, const char *file)); +void connection_mark_for_close_internal_(connection_t *conn, + int line, const char *file); #define connection_mark_for_close(c) \ connection_mark_for_close_((c), __LINE__, SHORT_FILE__) @@ -55,11 +51,13 @@ MOCK_DECL(void, connection_mark_for_close_internal_, * For all other cases, use connection_mark_and_flush() instead, which * checks for or_connection_t properly, instead. See below. */ -#define connection_mark_and_flush_internal_(c,line,file) \ - do { \ - connection_t *tmp_conn__ = (c); \ - connection_mark_for_close_internal_(tmp_conn__, (line), (file)); \ - tmp_conn__->hold_open_until_flushed = 1; \ +#define connection_mark_and_flush_internal_(c,line,file) \ + do { \ + connection_t *tmp_conn_ = (c); \ + connection_mark_for_close_internal_(tmp_conn_, (line), (file)); \ + tmp_conn_->hold_open_until_flushed = 1; \ + IF_HAS_BUFFEREVENT(tmp_conn_, \ + connection_start_writing(tmp_conn_)); \ } while (0) #define connection_mark_and_flush_internal(c) \ @@ -91,13 +89,6 @@ int connection_connect(connection_t *conn, const char *address, const tor_addr_t *addr, uint16_t port, int *socket_error); -#ifdef HAVE_SYS_UN_H - -int connection_connect_unix(connection_t *conn, const char *socket_path, - int *socket_error); - -#endif /* defined(HAVE_SYS_UN_H) */ - /** Maximum size of information that we can fit into SOCKS5 username or password fields. */ #define MAX_SOCKS5_AUTH_FIELD_SIZE 255 @@ -126,8 +117,8 @@ void connection_bucket_refill(int seconds_elapsed, time_t now); int connection_handle_read(connection_t *conn); -int connection_buf_get_bytes(char *string, size_t len, connection_t *conn); -int connection_buf_get_line(connection_t *conn, char *data, +int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); +int connection_fetch_from_buf_line(connection_t *conn, char *data, size_t *data_len); int connection_fetch_from_buf_http(connection_t *conn, char **headers_out, size_t max_headerlen, @@ -142,102 +133,62 @@ int connection_flush(connection_t *conn); MOCK_DECL(void, connection_write_to_buf_impl_, (const char *string, size_t len, connection_t *conn, int zlib)); /* DOCDOC connection_write_to_buf */ -static void connection_buf_add(const char *string, size_t len, +static void connection_write_to_buf(const char *string, size_t len, connection_t *conn); -/* DOCDOC connection_write_to_buf_compress */ -static void connection_buf_add_compress(const char *string, size_t len, - dir_connection_t *conn, int done); -static inline void -connection_buf_add(const char *string, size_t len, connection_t *conn) +/* DOCDOC connection_write_to_buf_zlib */ +static void connection_write_to_buf_zlib(const char *string, size_t len, + dir_connection_t *conn, int done); +static INLINE void +connection_write_to_buf(const char *string, size_t len, connection_t *conn) { connection_write_to_buf_impl_(string, len, conn, 0); } -static inline void -connection_buf_add_compress(const char *string, size_t len, - dir_connection_t *conn, int done) +static INLINE void +connection_write_to_buf_zlib(const char *string, size_t len, + dir_connection_t *conn, int done) { connection_write_to_buf_impl_(string, len, TO_CONN(conn), done ? -1 : 1); } -void connection_buf_add_buf(connection_t *conn, buf_t *buf); /* DOCDOC connection_get_inbuf_len */ static size_t connection_get_inbuf_len(connection_t *conn); /* DOCDOC connection_get_outbuf_len */ static size_t connection_get_outbuf_len(connection_t *conn); -static inline size_t +static INLINE size_t connection_get_inbuf_len(connection_t *conn) { - return conn->inbuf ? buf_datalen(conn->inbuf) : 0; + IF_HAS_BUFFEREVENT(conn, { + return evbuffer_get_length(bufferevent_get_input(conn->bufev)); + }) ELSE_IF_NO_BUFFEREVENT { + return conn->inbuf ? buf_datalen(conn->inbuf) : 0; + } } -static inline size_t +static INLINE size_t connection_get_outbuf_len(connection_t *conn) { + IF_HAS_BUFFEREVENT(conn, { + return evbuffer_get_length(bufferevent_get_output(conn->bufev)); + }) ELSE_IF_NO_BUFFEREVENT { return conn->outbuf ? buf_datalen(conn->outbuf) : 0; + } } connection_t *connection_get_by_global_id(uint64_t id); connection_t *connection_get_by_type(int type); -MOCK_DECL(connection_t *,connection_get_by_type_addr_port_purpose,(int type, - const tor_addr_t *addr, - uint16_t port, int purpose)); +connection_t *connection_get_by_type_purpose(int type, int purpose); +connection_t *connection_get_by_type_addr_port_purpose(int type, + const tor_addr_t *addr, + uint16_t port, int purpose); connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_rendquery(int type, int state, const char *rendquery); -smartlist_t *connection_list_by_type_state(int type, int state); -smartlist_t *connection_list_by_type_purpose(int type, int purpose); -smartlist_t *connection_dir_list_by_purpose_and_resource( - int purpose, - const char *resource); -smartlist_t *connection_dir_list_by_purpose_resource_and_state( - int purpose, - const char *resource, - int state); - -#define CONN_LEN_AND_FREE_TEMPLATE(sl) \ - STMT_BEGIN \ - int len = smartlist_len(sl); \ - smartlist_free(sl); \ - return len; \ - STMT_END - -/** Return a count of directory connections that are fetching the item - * described by purpose/resource. */ -static inline int -connection_dir_count_by_purpose_and_resource( - int purpose, - const char *resource) -{ - smartlist_t *conns = connection_dir_list_by_purpose_and_resource( - purpose, - resource); - CONN_LEN_AND_FREE_TEMPLATE(conns); -} - -/** Return a count of directory connections that are fetching the item - * described by purpose/resource/state. */ -static inline int -connection_dir_count_by_purpose_resource_and_state( - int purpose, - const char *resource, - int state) -{ - smartlist_t *conns = - connection_dir_list_by_purpose_resource_and_state( - purpose, - resource, - state); - CONN_LEN_AND_FREE_TEMPLATE(conns); -} - -#undef CONN_LEN_AND_FREE_TEMPLATE +dir_connection_t *connection_dir_get_by_purpose_and_resource( + int state, const char *resource); -int any_other_active_or_conns(const or_connection_t *this_conn); - -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define connection_speaks_cells(conn) (((conn)->type == CONN_TYPE_OR) || 0) +#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) int connection_is_listener(connection_t *conn); int connection_state_is_open(connection_t *conn); int connection_state_is_connecting(connection_t *conn); @@ -247,29 +198,24 @@ char *alloc_http_authenticator(const char *authenticator); void assert_connection_ok(connection_t *conn, time_t now); int connection_or_nonopen_was_started_here(or_connection_t *conn); void connection_dump_buffer_mem_stats(int severity); - -void clock_skew_warning(const connection_t *conn, long apparent_skew, - int trusted, log_domain_mask_t domain, - const char *received, const char *source); - -/** Check if a connection is on the way out so the OOS handler doesn't try - * to kill more than it needs. */ -static inline int -connection_is_moribund(connection_t *conn) -{ - if (conn != NULL && - (conn->conn_array_index < 0 || - conn->marked_for_close)) { - return 1; - } else { - return 0; - } -} - -void connection_check_oos(int n_socks, int failed); +void remove_file_if_very_old(const char *fname, time_t now); + +#ifdef USE_BUFFEREVENTS +int connection_type_uses_bufferevent(connection_t *conn); +void connection_configure_bufferevent_callbacks(connection_t *conn); +void connection_handle_read_cb(struct bufferevent *bufev, void *arg); +void connection_handle_write_cb(struct bufferevent *bufev, void *arg); +void connection_handle_event_cb(struct bufferevent *bufev, short event, + void *arg); +void connection_get_rate_limit_totals(uint64_t *read_out, + uint64_t *written_out); +void connection_enable_rate_limiting(connection_t *conn); +#else +#define connection_type_uses_bufferevent(c) (0) +#endif #ifdef CONNECTION_PRIVATE -STATIC void connection_free_minimal(connection_t *conn); +STATIC void connection_free_(connection_t *conn); /* Used only by connection.c and test*.c */ uint32_t bucket_millis_empty(int tokens_before, uint32_t last_empty_time, @@ -279,17 +225,7 @@ void connection_buckets_note_empty_ts(uint32_t *timestamp_var, int tokens_before, size_t tokens_removed, const struct timeval *tvnow); -MOCK_DECL(STATIC int,connection_connect_sockaddr, - (connection_t *conn, - const struct sockaddr *sa, - socklen_t sa_len, - const struct sockaddr *bindaddr, - socklen_t bindaddr_len, - int *socket_error)); -MOCK_DECL(STATIC void, kill_conn_list_for_oos, (smartlist_t *conns)); -MOCK_DECL(STATIC smartlist_t *, pick_oos_victims, (int n)); - -#endif /* defined(CONNECTION_PRIVATE) */ - -#endif /* !defined(TOR_CONNECTION_H) */ +#endif + +#endif diff --git a/src/tor/src/or/connection_edge.c b/src/tor/connection_edge.c similarity index 64% rename from src/tor/src/or/connection_edge.c rename to src/tor/connection_edge.c index 0c4352ea1..a794f3791 100644 --- a/src/tor/src/or/connection_edge.c +++ b/src/tor/connection_edge.c @@ -1,64 +1,16 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file connection_edge.c * \brief Handle edge streams. - * - * An edge_connection_t is a subtype of a connection_t, and represents two - * critical concepts in Tor: a stream, and an edge connection. From the Tor - * protocol's point of view, a stream is a bi-directional channel that is - * multiplexed on a single circuit. Each stream on a circuit is identified - * with a separate 16-bit stream ID, local to the (circuit,exit) pair. - * Streams are created in response to client requests. - * - * An edge connection is one thing that can implement a stream: it is either a - * TCP application socket that has arrived via (e.g.) a SOCKS request, or an - * exit connection. - * - * Not every instance of edge_connection_t truly represents an edge connction, - * however. (Sorry!) We also create edge_connection_t objects for streams that - * we will not be handling with TCP. The types of these streams are: - *
    - *
  • DNS lookup streams, created on the client side in response to - * a UDP DNS request received on a DNSPort, or a RESOLVE command - * on a controller. - *
  • DNS lookup streams, created on the exit side in response to - * a RELAY_RESOLVE cell from a client. - *
  • Tunneled directory streams, created on the directory cache side - * in response to a RELAY_BEGIN_DIR cell. These streams attach directly - * to a dir_connection_t object without ever using TCP. - *
- * - * This module handles general-purpose functionality having to do with - * edge_connection_t. On the client side, it accepts various types of - * application requests on SocksPorts, TransPorts, and NATDPorts, and - * creates streams appropriately. - * - * This module is also responsible for implementing stream isolation: - * ensuring that streams that should not be linkable to one another are - * kept to different circuits. - * - * On the exit side, this module handles the various stream-creating - * type of RELAY cells by launching appropriate outgoing connections, - * DNS requests, or directory connection objects. - * - * And for all edge connections, this module is responsible for handling - * incoming and outdoing data as it arrives or leaves in the relay.c - * module. (Outgoing data will be packaged in - * connection_edge_process_inbuf() as it calls - * connection_edge_package_raw_inbuf(); incoming data from RELAY_DATA - * cells is applied in connection_edge_process_relay_cell().) **/ #define CONNECTION_EDGE_PRIVATE #include "or.h" - -#include "backtrace.h" - #include "addressmap.h" #include "buffers.h" #include "channel.h" @@ -72,19 +24,11 @@ #include "control.h" #include "dns.h" #include "dnsserv.h" -#include "directory.h" #include "dirserv.h" #include "hibernate.h" -#include "hs_common.h" -#include "hs_cache.h" -#include "hs_client.h" -#include "hs_circuit.h" -#include "main.h" -#include "networkstatus.h" +#include "onion_main.h" #include "nodelist.h" #include "policies.h" -#include "proto_http.h" -#include "proto_socks.h" #include "reasons.h" #include "relay.h" #include "rendclient.h" @@ -102,20 +46,7 @@ #ifdef HAVE_LINUX_NETFILTER_IPV4_H #include #define TRANS_NETFILTER -#define TRANS_NETFILTER_IPV4 -#endif - -#ifdef HAVE_LINUX_IF_H -#include -#endif - -#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H -#include -#if defined(IP6T_SO_ORIGINAL_DST) -#define TRANS_NETFILTER -#define TRANS_NETFILTER_IPV6 #endif -#endif /* defined(HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H) */ #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) #include @@ -123,10 +54,6 @@ #define TRANS_PF #endif -#ifdef IP_TRANSPARENT -#define TRANS_TPROXY -#endif - #define SOCKS4_GRANTED 90 #define SOCKS4_REJECT 91 @@ -135,14 +62,19 @@ static int connection_ap_process_natd(entry_connection_t *conn); static int connection_exit_connect_dir(edge_connection_t *exitconn); static int consider_plaintext_ports(entry_connection_t *conn, uint16_t port); static int connection_ap_supports_optimistic_data(const entry_connection_t *); +static void connection_ap_handshake_socks_resolved_addr( + entry_connection_t *conn, + const tor_addr_t *answer, + int ttl, + time_t expires); /** An AP stream has failed/finished. If it hasn't already sent back * a socks reply, send one now (based on endreason). Also set * has_sent_end to 1, and mark the conn. */ -MOCK_IMPL(void, -connection_mark_unattached_ap_,(entry_connection_t *conn, int endreason, - int line, const char *file)) +void +connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, + int line, const char *file) { connection_t *base_conn = ENTRY_TO_CONN(conn); edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); @@ -158,9 +90,8 @@ connection_mark_unattached_ap_,(entry_connection_t *conn, int endreason, * but we should fix it someday anyway. */ if ((edge_conn->on_circuit != NULL || edge_conn->edge_has_sent_end) && connection_edge_is_rendezvous_stream(edge_conn)) { - if (edge_conn->rend_data) { - rend_client_note_connection_attempt_ended(edge_conn->rend_data); - } + rend_client_note_connection_attempt_ended( + edge_conn->rend_data->onion_address); } if (base_conn->marked_for_close) { @@ -244,11 +175,6 @@ connection_edge_process_inbuf(edge_connection_t *conn, int package_partial) return -1; } return 0; - case AP_CONN_STATE_HTTP_CONNECT_WAIT: - if (connection_ap_process_http_connect(EDGE_TO_ENTRY_CONN(conn)) < 0) { - return -1; - } - return 0; case AP_CONN_STATE_OPEN: case EXIT_CONN_STATE_OPEN: if (connection_edge_package_raw_inbuf(conn, package_partial, NULL) < 0) { @@ -274,7 +200,6 @@ connection_edge_process_inbuf(edge_connection_t *conn, int package_partial) } /* Fall through if the connection is on a circuit without optimistic * data support. */ - /* Falls through. */ case EXIT_CONN_STATE_CONNECTING: case AP_CONN_STATE_RENDDESC_WAIT: case AP_CONN_STATE_CIRCUIT_WAIT: @@ -339,41 +264,10 @@ relay_send_end_cell_from_edge(streamid_t stream_id, circuit_t *circ, payload[0] = (char) reason; - /* Note: we have to use relay_send_command_from_edge here, not - * connection_edge_end or connection_edge_send_command, since those require - * that we have a stream connected to a circuit, and we don't connect to a - * circuit until we have a pending/successful resolve. */ return relay_send_command_from_edge(stream_id, circ, RELAY_COMMAND_END, payload, 1, cpath_layer); } -/* If the connection conn is attempting to connect to an external - * destination that is an hidden service and the reason is a connection - * refused or timeout, log it so the operator can take appropriate actions. - * The log statement is a rate limited warning. */ -static void -warn_if_hs_unreachable(const edge_connection_t *conn, uint8_t reason) -{ - tor_assert(conn); - - if (conn->base_.type == CONN_TYPE_EXIT && - connection_edge_is_rendezvous_stream(conn) && - (reason == END_STREAM_REASON_CONNECTREFUSED || - reason == END_STREAM_REASON_TIMEOUT)) { -#define WARN_FAILED_HS_CONNECTION 300 - static ratelim_t warn_limit = RATELIM_INIT(WARN_FAILED_HS_CONNECTION); - char *m; - if ((m = rate_limit_log(&warn_limit, approx_time()))) { - log_warn(LD_EDGE, "Onion service connection to %s failed (%s)", - (conn->base_.socket_family == AF_UNIX) ? - safe_str(conn->base_.address) : - safe_str(fmt_addrport(&conn->base_.addr, conn->base_.port)), - stream_end_reason_to_string(reason)); - tor_free(m); - } - } -} - /** Send a relay end cell from stream conn down conn's circuit, and * remember that we've done so. If this is not a client connection, set the * relay end cell's reason for closing as reason. @@ -431,9 +325,6 @@ connection_edge_end(edge_connection_t *conn, uint8_t reason) conn->base_.s); connection_edge_send_command(conn, RELAY_COMMAND_END, payload, payload_len); - /* We'll log warn if the connection was an hidden service and couldn't be - * made because the service wasn't available. */ - warn_if_hs_unreachable(conn, control_reason); } else { log_debug(LD_EDGE,"No circ to send end on conn " "(fd "TOR_SOCKET_T_FORMAT").", @@ -502,7 +393,6 @@ connection_edge_finished_flushing(edge_connection_t *conn) case AP_CONN_STATE_CONNECT_WAIT: case AP_CONN_STATE_CONTROLLER_WAIT: case AP_CONN_STATE_RESOLVE_WAIT: - case AP_CONN_STATE_HTTP_CONNECT_WAIT: return 0; default: log_warn(LD_BUG, "Called in unexpected state %d.",conn->base_.state); @@ -574,7 +464,8 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) rep_hist_note_exit_stream_opened(conn->port); conn->state = EXIT_CONN_STATE_OPEN; - connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */ + IF_HAS_NO_BUFFEREVENT(conn) + connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */ if (connection_get_outbuf_len(conn)) /* in case there are any queued relay * cells */ connection_start_writing(conn); @@ -601,16 +492,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) return connection_edge_process_inbuf(edge_conn, 1); } -/** A list of all the entry_connection_t * objects that are not marked - * for close, and are in AP_CONN_STATE_CIRCUIT_WAIT. - * - * (Right now, we check in several places to make sure that this list is - * correct. When it's incorrect, we'll fix it, and log a BUG message.) - */ -static smartlist_t *pending_entry_connections = NULL; - -static int untried_pending_connections = 0; - /** Common code to connection_(ap|exit)_about_to_close. */ static void connection_edge_about_to_close(edge_connection_t *edge_conn) @@ -633,8 +514,6 @@ connection_ap_about_to_close(entry_connection_t *entry_conn) edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(entry_conn); connection_t *conn = ENTRY_TO_CONN(entry_conn); - connection_edge_about_to_close(edge_conn); - if (entry_conn->socks_request->has_finished == 0) { /* since conn gets removed right after this function finishes, * there's no point trying to send back a reply at this point. */ @@ -653,20 +532,6 @@ connection_ap_about_to_close(entry_connection_t *entry_conn) conn->marked_for_close_file, conn->marked_for_close); dnsserv_reject_request(entry_conn); } - - if (TO_CONN(edge_conn)->state == AP_CONN_STATE_CIRCUIT_WAIT) { - smartlist_remove(pending_entry_connections, entry_conn); - } - -#if 1 - /* Check to make sure that this isn't in pending_entry_connections if it - * didn't actually belong there. */ - if (TO_CONN(edge_conn)->type == CONN_TYPE_AP) { - connection_ap_warn_and_unmark_if_pending_circ(entry_conn, - "about_to_close"); - } -#endif /* 1 */ - control_event_stream_bandwidth(edge_conn); control_event_stream_status(entry_conn, STREAM_EVENT_CLOSED, edge_conn->end_reason); @@ -835,203 +700,31 @@ connection_ap_expire_beginning(void) } SMARTLIST_FOREACH_END(base_conn); } -/** - * As connection_ap_attach_pending, but first scans the entire connection - * array to see if any elements are missing. +/** Tell any AP streams that are waiting for a new circuit to try again, + * either attaching to an available circ or launching a new one. */ void -connection_ap_rescan_and_attach_pending(void) +connection_ap_attach_pending(void) { entry_connection_t *entry_conn; smartlist_t *conns = get_connection_array(); - - if (PREDICT_UNLIKELY(NULL == pending_entry_connections)) - pending_entry_connections = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->marked_for_close || conn->type != CONN_TYPE_AP || conn->state != AP_CONN_STATE_CIRCUIT_WAIT) continue; - entry_conn = TO_ENTRY_CONN(conn); - tor_assert(entry_conn); - if (! smartlist_contains(pending_entry_connections, entry_conn)) { - log_warn(LD_BUG, "Found a connection %p that was supposed to be " - "in pending_entry_connections, but wasn't. No worries; " - "adding it.", - pending_entry_connections); - untried_pending_connections = 1; - connection_ap_mark_as_pending_circuit(entry_conn); - } - - } SMARTLIST_FOREACH_END(conn); - - connection_ap_attach_pending(1); -} - -#ifdef DEBUGGING_17659 -#define UNMARK() do { \ - entry_conn->marked_pending_circ_line = 0; \ - entry_conn->marked_pending_circ_file = 0; \ - } while (0) -#else /* !(defined(DEBUGGING_17659)) */ -#define UNMARK() do { } while (0) -#endif /* defined(DEBUGGING_17659) */ - -/** Tell any AP streams that are listed as waiting for a new circuit to try - * again. If there is an available circuit for a stream, attach it. Otherwise, - * launch a new circuit. - * - * If retry is false, only check the list if it contains at least one - * streams that we have not yet tried to attach to a circuit. - */ -void -connection_ap_attach_pending(int retry) -{ - if (PREDICT_UNLIKELY(!pending_entry_connections)) { - return; - } - - if (untried_pending_connections == 0 && !retry) - return; - - /* Don't allow any modifications to list while we are iterating over - * it. We'll put streams back on this list if we can't attach them - * immediately. */ - smartlist_t *pending = pending_entry_connections; - pending_entry_connections = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(pending, - entry_connection_t *, entry_conn) { - connection_t *conn = ENTRY_TO_CONN(entry_conn); - tor_assert(conn && entry_conn); - if (conn->marked_for_close) { - UNMARK(); - continue; - } - if (conn->magic != ENTRY_CONNECTION_MAGIC) { - log_warn(LD_BUG, "%p has impossible magic value %u.", - entry_conn, (unsigned)conn->magic); - UNMARK(); - continue; - } - if (conn->state != AP_CONN_STATE_CIRCUIT_WAIT) { - log_warn(LD_BUG, "%p is no longer in circuit_wait. Its current state " - "is %s. Why is it on pending_entry_connections?", - entry_conn, - conn_state_to_string(conn->type, conn->state)); - UNMARK(); - continue; - } - - /* Okay, we're through the sanity checks. Try to handle this stream. */ if (connection_ap_handshake_attach_circuit(entry_conn) < 0) { if (!conn->marked_for_close) connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_CANT_ATTACH); } - - if (! conn->marked_for_close && - conn->type == CONN_TYPE_AP && - conn->state == AP_CONN_STATE_CIRCUIT_WAIT) { - /* Is it still waiting for a circuit? If so, we didn't attach it, - * so it's still pending. Put it back on the list. - */ - if (!smartlist_contains(pending_entry_connections, entry_conn)) { - smartlist_add(pending_entry_connections, entry_conn); - continue; - } - } - - /* If we got here, then we either closed the connection, or - * we attached it. */ - UNMARK(); - } SMARTLIST_FOREACH_END(entry_conn); - - smartlist_free(pending); - untried_pending_connections = 0; -} - -/** Mark entry_conn as needing to get attached to a circuit. - * - * And entry_conn must be in AP_CONN_STATE_CIRCUIT_WAIT, - * should not already be pending a circuit. The circuit will get - * launched or the connection will get attached the next time we - * call connection_ap_attach_pending(). - */ -void -connection_ap_mark_as_pending_circuit_(entry_connection_t *entry_conn, - const char *fname, int lineno) -{ - connection_t *conn = ENTRY_TO_CONN(entry_conn); - tor_assert(conn->state == AP_CONN_STATE_CIRCUIT_WAIT); - tor_assert(conn->magic == ENTRY_CONNECTION_MAGIC); - if (conn->marked_for_close) - return; - - if (PREDICT_UNLIKELY(NULL == pending_entry_connections)) - pending_entry_connections = smartlist_new(); - - if (PREDICT_UNLIKELY(smartlist_contains(pending_entry_connections, - entry_conn))) { - log_warn(LD_BUG, "What?? pending_entry_connections already contains %p! " - "(Called from %s:%d.)", - entry_conn, fname, lineno); -#ifdef DEBUGGING_17659 - const char *f2 = entry_conn->marked_pending_circ_file; - log_warn(LD_BUG, "(Previously called from %s:%d.)\n", - f2 ? f2 : "", - entry_conn->marked_pending_circ_line); -#endif /* defined(DEBUGGING_17659) */ - log_backtrace(LOG_WARN, LD_BUG, "To debug, this may help"); - return; - } - -#ifdef DEBUGGING_17659 - entry_conn->marked_pending_circ_line = (uint16_t) lineno; - entry_conn->marked_pending_circ_file = fname; -#endif - - untried_pending_connections = 1; - smartlist_add(pending_entry_connections, entry_conn); - - /* Work-around for bug 19969: we handle pending_entry_connections at - * the end of run_main_loop_once(), but in many cases that function will - * take a very long time, if ever, to finish its call to event_base_loop(). - * - * So the fix is to tell it right now that it ought to finish its loop at - * its next available opportunity. - */ - tell_event_loop_to_run_external_code(); -} - -/** Mark entry_conn as no longer waiting for a circuit. */ -void -connection_ap_mark_as_non_pending_circuit(entry_connection_t *entry_conn) -{ - if (PREDICT_UNLIKELY(NULL == pending_entry_connections)) - return; - UNMARK(); - smartlist_remove(pending_entry_connections, entry_conn); -} - -/* DOCDOC */ -void -connection_ap_warn_and_unmark_if_pending_circ(entry_connection_t *entry_conn, - const char *where) -{ - if (pending_entry_connections && - smartlist_contains(pending_entry_connections, entry_conn)) { - log_warn(LD_BUG, "What was %p doing in pending_entry_connections in %s?", - entry_conn, where); - connection_ap_mark_as_non_pending_circuit(entry_conn); - } + } SMARTLIST_FOREACH_END(conn); } /** Tell any AP streams that are waiting for a one-hop tunnel to * failed_digest that they are going to fail. */ -/* XXXX We should get rid of this function, and instead attach +/* XXX024 We should get rid of this function, and instead attach * one-hop streams to circ->p_streams so they get marked in * circuit_mark_for_close like normal p_streams. */ void @@ -1056,9 +749,8 @@ connection_ap_fail_onehop(const char *failed_digest, /* we don't know the digest; have to compare addr:port */ tor_addr_t addr; if (!build_state || !build_state->chosen_exit || - !entry_conn->socks_request) { + !entry_conn->socks_request || !entry_conn->socks_request->address) continue; - } if (tor_addr_parse(&addr, entry_conn->socks_request->address)<0 || !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || build_state->chosen_exit->port != entry_conn->socks_request->port) @@ -1091,8 +783,7 @@ circuit_discard_optional_exit_enclaves(extend_info_t *info) if (!entry_conn->chosen_exit_optional && !entry_conn->chosen_exit_retries) continue; - r1 = node_get_by_nickname(entry_conn->chosen_exit_name, - NNF_NO_WARN_UNNAMED); + r1 = node_get_by_nickname(entry_conn->chosen_exit_name, 0); r2 = node_get_by_id(info->identity_digest); if (!r1 || !r2 || r1 != r2) continue; @@ -1139,8 +830,8 @@ connection_ap_detach_retriable(entry_connection_t *conn, pathbias_mark_use_rollback(circ); if (conn->pending_optimistic_data) { - buf_set_to_copy(&conn->sending_optimistic_data, - conn->pending_optimistic_data); + generic_buffer_set_to_copy(&conn->sending_optimistic_data, + conn->pending_optimistic_data); } if (!get_options()->LeaveStreamsUnattached || conn->use_begindir) { @@ -1148,13 +839,12 @@ connection_ap_detach_retriable(entry_connection_t *conn, * a tunneled directory connection, then just attach it. */ ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CIRCUIT_WAIT; circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); - connection_ap_mark_as_pending_circuit(conn); + return connection_ap_handshake_attach_circuit(conn); } else { - CONNECTION_AP_EXPECT_NONPENDING(conn); ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); + return 0; } - return 0; } /** Check if conn is using a dangerous port. Then warn and/or @@ -1195,121 +885,92 @@ consider_plaintext_ports(entry_connection_t *conn, uint16_t port) * See connection_ap_handshake_rewrite_and_attach()'s * documentation for arguments and return value. */ -MOCK_IMPL(int, -connection_ap_rewrite_and_attach_if_allowed,(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath)) +int +connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath) { const or_options_t *options = get_options(); if (options->LeaveStreamsUnattached) { - CONNECTION_AP_EXPECT_NONPENDING(conn); ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; return 0; } return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath); } -/* Try to perform any map-based rewriting of the target address in - * conn, filling in the fields of out as we go, and modifying - * conn->socks_request.address as appropriate. +/** Connection conn just finished its socks handshake, or the + * controller asked us to take care of it. If circ is defined, + * then that's where we'll want to attach it. Otherwise we have to + * figure it out ourselves. + * + * First, parse whether it's a .exit address, remap it, and so on. Then + * if it's for a general circuit, try to attach it to a circuit (or launch + * one as needed), else if it's for a rendezvous circuit, fetch a + * rendezvous descriptor first (or attach/launch a circuit if the + * rendezvous descriptor is already here and fresh enough). + * + * The stream will exit from the hop + * indicated by cpath, or from the last hop in circ's cpath if + * cpath is NULL. */ -STATIC void -connection_ap_handshake_rewrite(entry_connection_t *conn, - rewrite_result_t *out) +int +connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath) { socks_request_t *socks = conn->socks_request; + hostname_type_t addresstype; const or_options_t *options = get_options(); tor_addr_t addr_tmp; + /* We set this to true if this is an address we should automatically + * remap to a local address in VirtualAddrNetwork */ + int automap = 0; + char orig_address[MAX_SOCKS_ADDR_LEN]; + time_t map_expires = TIME_MAX; + time_t now = time(NULL); + connection_t *base_conn = ENTRY_TO_CONN(conn); + addressmap_entry_source_t exit_source = ADDRMAPSRC_NONE; - /* Initialize all the fields of 'out' to reasonable defaults */ - out->automap = 0; - out->exit_source = ADDRMAPSRC_NONE; - out->map_expires = TIME_MAX; - out->end_reason = 0; - out->should_close = 0; - out->orig_address[0] = 0; - - /* We convert all incoming addresses to lowercase. */ - tor_strlower(socks->address); - /* Remember the original address. */ - strlcpy(out->orig_address, socks->address, sizeof(out->orig_address)); + tor_strlower(socks->address); /* normalize it */ + strlcpy(orig_address, socks->address, sizeof(orig_address)); log_debug(LD_APP,"Client asked for %s:%d", safe_str_client(socks->address), socks->port); - /* Check for whether this is a .exit address. By default, those are - * disallowed when they're coming straight from the client, but you're - * allowed to have them in MapAddress commands and so forth. */ - if (!strcmpend(socks->address, ".exit")) { + if (!strcmpend(socks->address, ".exit") && !options->AllowDotExit) { log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to " - "security risks."); + "security risks. Set AllowDotExit in your torrc to enable " + "it (at your own risk)."); control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); - out->end_reason = END_STREAM_REASON_TORPROTOCOL; - out->should_close = 1; - return; + connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); + return -1; } - /* Remember the original address so we can tell the user about what - * they actually said, not just what it turned into. */ - /* XXX yes, this is the same as out->orig_address above. One is - * in the output, and one is in the connection. */ - if (! conn->original_dest_address) { - /* Is the 'if' necessary here? XXXX */ + if (! conn->original_dest_address) conn->original_dest_address = tor_strdup(conn->socks_request->address); - } - - /* First, apply MapAddress and MAPADDRESS mappings. We need to do - * these only for non-reverse lookups, since they don't exist for those. - * We also need to do this before we consider automapping, since we might - * e.g. resolve irc.oftc.net into irconionaddress.onion, at which point - * we'd need to automap it. */ - if (socks->command != SOCKS_COMMAND_RESOLVE_PTR) { - const unsigned rewrite_flags = AMR_FLAG_USE_MAPADDRESS; - if (addressmap_rewrite(socks->address, sizeof(socks->address), - rewrite_flags, &out->map_expires, &out->exit_source)) { - control_event_stream_status(conn, STREAM_EVENT_REMAP, - REMAP_STREAM_SOURCE_CACHE); - } - } - /* Now see if we need to create or return an existing Hostname->IP - * automapping. Automapping happens when we're asked to resolve a - * hostname, and AutomapHostsOnResolve is set, and the hostname has a - * suffix listed in AutomapHostsSuffixes. It's a handy feature - * that lets you have Tor assign e.g. IPv6 addresses for .onion - * names, and return them safely from DNSPort. - */ if (socks->command == SOCKS_COMMAND_RESOLVE && tor_addr_parse(&addr_tmp, socks->address)<0 && options->AutomapHostsOnResolve) { - /* Check the suffix... */ - out->automap = addressmap_address_should_automap(socks->address, options); - if (out->automap) { - /* If we get here, then we should apply an automapping for this. */ + automap = addressmap_address_should_automap(socks->address, options); + if (automap) { const char *new_addr; - /* We return an IPv4 address by default, or an IPv6 address if we - * are allowed to do so. */ int addr_type = RESOLVED_TYPE_IPV4; if (conn->socks_request->socks_version != 4) { - if (!conn->entry_cfg.ipv4_traffic || - (conn->entry_cfg.ipv6_traffic && conn->entry_cfg.prefer_ipv6) || - conn->entry_cfg.prefer_ipv6_virtaddr) + if (!conn->ipv4_traffic_ok || + (conn->ipv6_traffic_ok && conn->prefer_ipv6_traffic) || + conn->prefer_ipv6_virtaddr) addr_type = RESOLVED_TYPE_IPV6; } - /* Okay, register the target address as automapped, and find the new - * address we're supposed to give as a resolve answer. (Return a cached - * value if we've looked up this address before. - */ new_addr = addressmap_register_virtual_address( addr_type, tor_strdup(socks->address)); if (! new_addr) { log_warn(LD_APP, "Unable to automap address %s", escaped_safe_str(socks->address)); - out->end_reason = END_STREAM_REASON_INTERNAL; - out->should_close = 1; - return; + connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); + return -1; } log_info(LD_APP, "Automapping %s to %s", escaped_safe_str_client(socks->address), @@ -1318,38 +979,30 @@ connection_ap_handshake_rewrite(entry_connection_t *conn, } } - /* Now handle reverse lookups, if they're in the cache. This doesn't - * happen too often, since client-side DNS caching is off by default, - * and very deprecated. */ if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) { unsigned rewrite_flags = 0; - if (conn->entry_cfg.use_cached_ipv4_answers) + if (conn->use_cached_ipv4_answers) rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->entry_cfg.use_cached_ipv6_answers) + if (conn->use_cached_ipv6_answers) rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; if (addressmap_rewrite_reverse(socks->address, sizeof(socks->address), - rewrite_flags, &out->map_expires)) { + rewrite_flags, &map_expires)) { char *result = tor_strdup(socks->address); /* remember _what_ is supposed to have been resolved. */ tor_snprintf(socks->address, sizeof(socks->address), "REVERSE[%s]", - out->orig_address); + orig_address); connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_HOSTNAME, strlen(result), (uint8_t*)result, -1, - out->map_expires); - tor_free(result); - out->end_reason = END_STREAM_REASON_DONE | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED; - out->should_close = 1; - return; + map_expires); + connection_mark_unattached_ap(conn, + END_STREAM_REASON_DONE | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + return 0; } - - /* Hang on, did we find an answer saying that this is a reverse lookup for - * an internal address? If so, we should reject it if we're configured to - * do so. */ if (options->ClientDNSRejectInternalAddresses) { - /* Don't let clients try to do a reverse lookup on 10.0.0.1. */ + /* Don't let people try to do a reverse lookup on 10.0.0.1. */ tor_addr_t addr; int ok; ok = tor_addr_parse_PTR_name( @@ -1357,305 +1010,43 @@ connection_ap_handshake_rewrite(entry_connection_t *conn, if (ok == 1 && tor_addr_is_internal(&addr, 0)) { connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_ERROR, 0, NULL, -1, TIME_MAX); - out->end_reason = END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED; - out->should_close = 1; - return; + connection_mark_unattached_ap(conn, + END_STREAM_REASON_SOCKSPROTOCOL | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + return -1; } } - } - - /* If we didn't automap it before, then this is still the address that - * came straight from the user, mapped according to any - * MapAddress/MAPADDRESS commands. Now apply other mappings, - * including previously registered Automap entries (IP back to - * hostname), TrackHostExits entries, and client-side DNS cache - * entries (if they're turned on). - */ - if (socks->command != SOCKS_COMMAND_RESOLVE_PTR && - !out->automap) { - unsigned rewrite_flags = AMR_FLAG_USE_AUTOMAP | AMR_FLAG_USE_TRACKEXIT; - addressmap_entry_source_t exit_source2; - if (conn->entry_cfg.use_cached_ipv4_answers) + } else if (!automap) { + /* For address map controls, remap the address. */ + unsigned rewrite_flags = 0; + if (conn->use_cached_ipv4_answers) rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->entry_cfg.use_cached_ipv6_answers) + if (conn->use_cached_ipv6_answers) rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; if (addressmap_rewrite(socks->address, sizeof(socks->address), - rewrite_flags, &out->map_expires, &exit_source2)) { + rewrite_flags, &map_expires, &exit_source)) { control_event_stream_status(conn, STREAM_EVENT_REMAP, REMAP_STREAM_SOURCE_CACHE); } - if (out->exit_source == ADDRMAPSRC_NONE) { - /* If it wasn't a .exit before, maybe it turned into a .exit. Remember - * the original source of a .exit. */ - out->exit_source = exit_source2; - } } - /* Check to see whether we're about to use an address in the virtual - * range without actually having gotten it from an Automap. */ - if (!out->automap && address_is_in_virtual_range(socks->address)) { - /* This address was probably handed out by - * client_dns_get_unmapped_address, but the mapping was discarded for some - * reason. Or the user typed in a virtual address range manually. We - * *don't* want to send the address through Tor; that's likely to fail, - * and may leak information. + if (!automap && address_is_in_virtual_range(socks->address)) { + /* This address was probably handed out by client_dns_get_unmapped_address, + * but the mapping was discarded for some reason. We *don't* want to send + * the address through Tor; that's likely to fail, and may leak + * information. */ log_warn(LD_APP,"Missing mapping for virtual address '%s'. Refusing.", safe_str_client(socks->address)); - out->end_reason = END_STREAM_REASON_INTERNAL; - out->should_close = 1; - return; - } -} - -/** We just received a SOCKS request in conn to an onion address of type - * addresstype. Start connecting to the onion service. */ -static int -connection_ap_handle_onion(entry_connection_t *conn, - socks_request_t *socks, - origin_circuit_t *circ, - hostname_type_t addresstype) -{ - time_t now = approx_time(); - connection_t *base_conn = ENTRY_TO_CONN(conn); - - /* If .onion address requests are disabled, refuse the request */ - if (!conn->entry_cfg.onion_traffic) { - log_warn(LD_APP, "Onion address %s requested from a port with .onion " - "disabled", safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - - /* Check whether it's RESOLVE or RESOLVE_PTR. We don't handle those - * for hidden service addresses. */ - if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) { - /* if it's a resolve request, fail it right now, rather than - * building all the circuits and then realizing it won't work. */ - log_warn(LD_APP, - "Resolve requests to hidden services not allowed. Failing."); - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR, - 0,NULL,-1,TIME_MAX); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; - } - - /* If we were passed a circuit, then we need to fail. .onion addresses - * only work when we launch our own circuits for now. */ - if (circ) { - log_warn(LD_CONTROL, "Attachstream to a circuit is not " - "supported for .onion addresses currently. Failing."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); + connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); return -1; } - /* Interface: Regardless of HS version after the block below we should have - set onion_address, rend_cache_lookup_result, and descriptor_is_usable. */ - const char *onion_address = NULL; - int rend_cache_lookup_result = -ENOENT; - int descriptor_is_usable = 0; - - if (addresstype == ONION_V2_HOSTNAME) { /* it's a v2 hidden service */ - rend_cache_entry_t *entry = NULL; - /* Look up if we have client authorization configured for this hidden - * service. If we do, associate it with the rend_data. */ - rend_service_authorization_t *client_auth = - rend_client_lookup_service_authorization(socks->address); - - const uint8_t *cookie = NULL; - rend_auth_type_t auth_type = REND_NO_AUTH; - if (client_auth) { - log_info(LD_REND, "Using previously configured client authorization " - "for hidden service request."); - auth_type = client_auth->auth_type; - cookie = client_auth->descriptor_cookie; - } - - /* Fill in the rend_data field so we can start doing a connection to - * a hidden service. */ - rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data = - rend_data_client_create(socks->address, NULL, (char *) cookie, - auth_type); - if (rend_data == NULL) { - return -1; - } - onion_address = rend_data_get_address(rend_data); - log_info(LD_REND,"Got a hidden service request for ID '%s'", - safe_str_client(onion_address)); - - rend_cache_lookup_result = rend_cache_lookup_entry(onion_address,-1, - &entry); - if (!rend_cache_lookup_result && entry) { - descriptor_is_usable = rend_client_any_intro_points_usable(entry); - } - } else { /* it's a v3 hidden service */ - tor_assert(addresstype == ONION_V3_HOSTNAME); - const hs_descriptor_t *cached_desc = NULL; - int retval; - /* Create HS conn identifier with HS pubkey */ - hs_ident_edge_conn_t *hs_conn_ident = - tor_malloc_zero(sizeof(hs_ident_edge_conn_t)); - - retval = hs_parse_address(socks->address, &hs_conn_ident->identity_pk, - NULL, NULL); - if (retval < 0) { - log_warn(LD_GENERAL, "failed to parse hs address"); - tor_free(hs_conn_ident); - return -1; - } - ENTRY_TO_EDGE_CONN(conn)->hs_ident = hs_conn_ident; - - onion_address = socks->address; - - /* Check the v3 desc cache */ - cached_desc = hs_cache_lookup_as_client(&hs_conn_ident->identity_pk); - if (cached_desc) { - rend_cache_lookup_result = 0; - descriptor_is_usable = - hs_client_any_intro_points_usable(&hs_conn_ident->identity_pk, - cached_desc); - log_info(LD_GENERAL, "Found %s descriptor in cache for %s. %s.", - (descriptor_is_usable) ? "usable" : "unusable", - safe_str_client(onion_address), - (descriptor_is_usable) ? "Not fetching." : "Refecting."); - } else { - rend_cache_lookup_result = -ENOENT; - } - } - - /* Lookup the given onion address. If invalid, stop right now. - * Otherwise, we might have it in the cache or not. */ - unsigned int refetch_desc = 0; - if (rend_cache_lookup_result < 0) { - switch (-rend_cache_lookup_result) { - case EINVAL: - /* We should already have rejected this address! */ - log_warn(LD_BUG,"Invalid service name '%s'", - safe_str_client(onion_address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - case ENOENT: - /* We didn't have this; we should look it up. */ - log_info(LD_REND, "No descriptor found in our cache for %s. Fetching.", - safe_str_client(onion_address)); - refetch_desc = 1; - break; - default: - log_warn(LD_BUG, "Unknown cache lookup error %d", - rend_cache_lookup_result); - return -1; - } - } - - /* Help predict that we'll want to do hidden service circuits in the - * future. We're not sure if it will need a stable circuit yet, but - * we know we'll need *something*. */ - rep_hist_note_used_internal(now, 0, 1); - - /* Now we have a descriptor but is it usable or not? If not, refetch. - * Also, a fetch could have been requested if the onion address was not - * found in the cache previously. */ - if (refetch_desc || !descriptor_is_usable) { - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - connection_ap_mark_as_non_pending_circuit(conn); - base_conn->state = AP_CONN_STATE_RENDDESC_WAIT; - if (addresstype == ONION_V2_HOSTNAME) { - tor_assert(edge_conn->rend_data); - rend_client_refetch_v2_renddesc(edge_conn->rend_data); - /* Whatever the result of the refetch, we don't go further. */ - return 0; - } else { - tor_assert(addresstype == ONION_V3_HOSTNAME); - tor_assert(edge_conn->hs_ident); - /* Attempt to fetch the hsv3 descriptor. Check the retval to see how it - * went and act accordingly. */ - int ret = hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk); - switch (ret) { - case HS_CLIENT_FETCH_MISSING_INFO: - /* Keeping the connection in descriptor wait state is fine because - * once we get enough dirinfo or a new live consensus, the HS client - * subsystem is notified and every connection in that state will - * trigger a fetch for the service key. */ - case HS_CLIENT_FETCH_LAUNCHED: - case HS_CLIENT_FETCH_PENDING: - case HS_CLIENT_FETCH_HAVE_DESC: - return 0; - case HS_CLIENT_FETCH_ERROR: - case HS_CLIENT_FETCH_NO_HSDIRS: - case HS_CLIENT_FETCH_NOT_ALLOWED: - /* Can't proceed further and better close the SOCKS request. */ - return -1; - } - } - } - - /* We have the descriptor! So launch a connection to the HS. */ - log_info(LD_REND, "Descriptor is here. Great."); - - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - /* We'll try to attach it at the next event loop, or whenever - * we call connection_ap_attach_pending() */ - connection_ap_mark_as_pending_circuit(conn); - return 0; -} - -/** Connection conn just finished its socks handshake, or the - * controller asked us to take care of it. If circ is defined, - * then that's where we'll want to attach it. Otherwise we have to - * figure it out ourselves. - * - * First, parse whether it's a .exit address, remap it, and so on. Then - * if it's for a general circuit, try to attach it to a circuit (or launch - * one as needed), else if it's for a rendezvous circuit, fetch a - * rendezvous descriptor first (or attach/launch a circuit if the - * rendezvous descriptor is already here and fresh enough). - * - * The stream will exit from the hop - * indicated by cpath, or from the last hop in circ's cpath if - * cpath is NULL. - */ -int -connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) -{ - socks_request_t *socks = conn->socks_request; - const or_options_t *options = get_options(); - connection_t *base_conn = ENTRY_TO_CONN(conn); - time_t now = time(NULL); - rewrite_result_t rr; - - /* First we'll do the rewrite part. Let's see if we get a reasonable - * answer. - */ - memset(&rr, 0, sizeof(rr)); - connection_ap_handshake_rewrite(conn,&rr); - - if (rr.should_close) { - /* connection_ap_handshake_rewrite told us to close the connection: - * either because it sent back an answer, or because it sent back an - * error */ - connection_mark_unattached_ap(conn, rr.end_reason); - if (END_STREAM_REASON_DONE == (rr.end_reason & END_STREAM_REASON_MASK)) - return 0; - else - return -1; - } - - const time_t map_expires = rr.map_expires; - const int automap = rr.automap; - const addressmap_entry_source_t exit_source = rr.exit_source; - - /* Now, we parse the address to see if it's an .onion or .exit or - * other special address. + /* Parse the address provided by SOCKS. Modify it in-place if it + * specifies a hidden-service (.onion) or particular exit node (.exit). */ - const hostname_type_t addresstype = parse_extended_hostname(socks->address); + addresstype = parse_extended_hostname(socks->address); - /* Now see whether the hostname is bogus. This could happen because of an - * onion hostname whose format we don't recognize. */ if (addresstype == BAD_HOSTNAME) { control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); @@ -1663,37 +1054,30 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } - /* If this is a .exit hostname, strip off the .name.exit part, and - * see whether we're willing to connect there, and and otherwise handle the - * .exit address. - * - * We'll set chosen_exit_name and/or close the connection as appropriate. - */ if (addresstype == EXIT_HOSTNAME) { - /* If StrictNodes is not set, then .exit overrides ExcludeNodes but - * not ExcludeExitNodes. */ + /* foo.exit -- modify conn->chosen_exit_node to specify the exit + * node, and conn->address to hold only the address portion. */ + char *s = strrchr(socks->address,'.'); + + /* If StrictNodes is not set, then .exit overrides ExcludeNodes. */ routerset_t *excludeset = options->StrictNodes ? options->ExcludeExitNodesUnion_ : options->ExcludeExitNodes; - const node_t *node = NULL; - - /* If this .exit was added by an AUTOMAP, then it came straight from - * a user. That's not safe. */ - if (exit_source == ADDRMAPSRC_AUTOMAP) { - /* Whoops; this one is stale. It must have gotten added earlier? - * (Probably this is not possible, since AllowDotExit no longer - * exists.) */ - log_warn(LD_APP,"Stale automapped address for '%s.exit'. Refusing.", + const node_t *node; + + if (exit_source == ADDRMAPSRC_AUTOMAP && !options->AllowDotExit) { + /* Whoops; this one is stale. It must have gotten added earlier, + * when AllowDotExit was on. */ + log_warn(LD_APP,"Stale automapped address for '%s.exit', with " + "AllowDotExit disabled. Refusing.", safe_str_client(socks->address)); control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - tor_assert_nonfatal_unreached(); return -1; } - /* Double-check to make sure there are no .exits coming from - * impossible/weird sources. */ - if (exit_source == ADDRMAPSRC_DNS || exit_source == ADDRMAPSRC_NONE) { + if (exit_source == ADDRMAPSRC_DNS || + (exit_source == ADDRMAPSRC_NONE && !options->AllowDotExit)) { /* It shouldn't be possible to get a .exit address from any of these * sources. */ log_warn(LD_BUG,"Address '%s.exit', with impossible source for the " @@ -1706,19 +1090,11 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } tor_assert(!automap); - - /* Now, find the character before the .(name) part. - * (The ".exit" part got stripped off by "parse_extended_hostname"). - * - * We're going to put the exit name into conn->chosen_exit_name, and - * look up a node correspondingly. */ - char *s = strrchr(socks->address,'.'); if (s) { /* The address was of the form "(stuff).(name).exit */ if (s[1] != '\0') { - /* Looks like a real .exit one. */ conn->chosen_exit_name = tor_strdup(s+1); - node = node_get_by_nickname(conn->chosen_exit_name, 0); + node = node_get_by_nickname(conn->chosen_exit_name, 1); if (exit_source == ADDRMAPSRC_TRACKEXIT) { /* We 5 tries before it expires the addressmap */ @@ -1735,17 +1111,15 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } } else { - /* It looks like they just asked for "foo.exit". That's a special - * form that means (foo's address).foo.exit. */ + /* It looks like they just asked for "foo.exit". */ conn->chosen_exit_name = tor_strdup(socks->address); - node = node_get_by_nickname(conn->chosen_exit_name, 0); + node = node_get_by_nickname(conn->chosen_exit_name, 1); if (node) { *socks->address = 0; node_get_address_string(node, socks->address, sizeof(socks->address)); } } - /* Now make sure that the chosen exit exists... */ if (!node) { log_warn(LD_APP, @@ -1762,19 +1136,13 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } - /* XXXX-1090 Should we also allow foo.bar.exit if ExitNodes is set and + /* XXXX024-1090 Should we also allow foo.bar.exit if ExitNodes is set and Bar is not listed in it? I say yes, but our revised manpage branch implies no. */ } - /* Now, we handle everything that isn't a .onion address. */ - if (addresstype != ONION_V2_HOSTNAME && addresstype != ONION_V3_HOSTNAME) { - /* Not a hidden-service request. It's either a hostname or an IP, - * possibly with a .exit that we stripped off. We're going to check - * if we're allowed to connect/resolve there, and then launch the - * appropriate request. */ - - /* Check for funny characters in the address. */ + if (addresstype != ONION_HOSTNAME) { + /* not a hidden-service request (i.e. normal or .exit) */ if (address_is_invalid_destination(socks->address, 1)) { control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); @@ -1785,81 +1153,20 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } -#ifdef ENABLE_TOR2WEB_MODE - /* If we're running in Tor2webMode, we don't allow anything BUT .onion - * addresses. */ if (options->Tor2webMode) { - log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname " - "or IP address %s because tor2web mode is enabled.", + log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname %s " + "because tor2web mode is enabled.", safe_str_client(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; } -#endif /* defined(ENABLE_TOR2WEB_MODE) */ - - /* socks->address is a non-onion hostname or IP address. - * If we can't do any non-onion requests, refuse the connection. - * If we have a hostname but can't do DNS, refuse the connection. - * If we have an IP address, but we can't use that address family, - * refuse the connection. - * - * If we can do DNS requests, and we can use at least one address family, - * then we have to resolve the address first. Then we'll know if it - * resolves to a usable address family. */ - - /* First, check if all non-onion traffic is disabled */ - if (!conn->entry_cfg.dns_request && !conn->entry_cfg.ipv4_traffic - && !conn->entry_cfg.ipv6_traffic) { - log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname " - "or IP address %s because Port has OnionTrafficOnly set (or " - "NoDNSRequest, NoIPv4Traffic, and NoIPv6Traffic).", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - - /* Then check if we have a hostname or IP address, and whether DNS or - * the IP address family are permitted. Reject if not. */ - tor_addr_t dummy_addr; - int socks_family = tor_addr_parse(&dummy_addr, socks->address); - /* family will be -1 for a non-onion hostname that's not an IP */ - if (socks_family == -1) { - if (!conn->entry_cfg.dns_request) { - log_warn(LD_APP, "Refusing to connect to hostname %s " - "because Port has NoDNSRequest set.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - } else if (socks_family == AF_INET) { - if (!conn->entry_cfg.ipv4_traffic) { - log_warn(LD_APP, "Refusing to connect to IPv4 address %s because " - "Port has NoIPv4Traffic set.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - } else if (socks_family == AF_INET6) { - if (!conn->entry_cfg.ipv6_traffic) { - log_warn(LD_APP, "Refusing to connect to IPv6 address %s because " - "Port has NoIPv6Traffic set.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - } else { - tor_assert_nonfatal_unreached_once(); - } - /* See if this is a hostname lookup that we can answer immediately. - * (For example, an attempt to look up the IP address for an IP address.) - */ if (socks->command == SOCKS_COMMAND_RESOLVE) { tor_addr_t answer; /* Reply to resolves immediately if we can. */ if (tor_addr_parse(&answer, socks->address) >= 0) {/* is it an IP? */ /* remember _what_ is supposed to have been resolved. */ - strlcpy(socks->address, rr.orig_address, sizeof(socks->address)); + strlcpy(socks->address, orig_address, sizeof(socks->address)); connection_ap_handshake_socks_resolved_addr(conn, &answer, -1, map_expires); connection_mark_unattached_ap(conn, @@ -1870,23 +1177,14 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, tor_assert(!automap); rep_hist_note_used_resolve(now); /* help predict this next time */ } else if (socks->command == SOCKS_COMMAND_CONNECT) { - /* Now see if this is a connect request that we can reject immediately */ - tor_assert(!automap); - /* Don't allow connections to port 0. */ if (socks->port == 0) { log_notice(LD_APP,"Application asked to connect to port 0. Refusing."); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } - /* You can't make connections to internal addresses, by default. - * Exceptions are begindir requests (where the address is meaningless), - * or cases where you've hand-configured a particular exit, thereby - * making the local address meaningful. */ if (options->ClientRejectInternalAddresses && !conn->use_begindir && !conn->chosen_exit_name && !circ) { - /* If we reach this point then we don't want to allow internal - * addresses. Check if we got one. */ tor_addr_t addr; if (tor_addr_hostname_is_local(socks->address) || (tor_addr_parse(&addr, socks->address) >= 0 && @@ -1921,64 +1219,39 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, connection_mark_unattached_ap(conn, END_STREAM_REASON_PRIVATE_ADDR); return -1; } - } /* end "if we should check for internal addresses" */ + } - /* Okay. We're still doing a CONNECT, and it wasn't a private - * address. Here we do special handling for literal IP addresses, - * to see if we should reject this preemptively, and to set up - * fields in conn->entry_cfg to tell the exit what AF we want. */ { tor_addr_t addr; /* XXX Duplicate call to tor_addr_parse. */ if (tor_addr_parse(&addr, socks->address) >= 0) { - /* If we reach this point, it's an IPv4 or an IPv6 address. */ sa_family_t family = tor_addr_family(&addr); - - if ((family == AF_INET && ! conn->entry_cfg.ipv4_traffic) || - (family == AF_INET6 && ! conn->entry_cfg.ipv6_traffic)) { - /* You can't do an IPv4 address on a v6-only socks listener, - * or vice versa. */ + if ((family == AF_INET && ! conn->ipv4_traffic_ok) || + (family == AF_INET6 && ! conn->ipv4_traffic_ok)) { log_warn(LD_NET, "Rejecting SOCKS request for an IP address " "family that this listener does not support."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; } else if (family == AF_INET6 && socks->socks_version == 4) { - /* You can't make a socks4 request to an IPv6 address. Socks4 - * doesn't support that. */ log_warn(LD_NET, "Rejecting SOCKS4 request for an IPv6 address."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; - } else if (socks->socks_version == 4 && - !conn->entry_cfg.ipv4_traffic) { - /* You can't do any kind of Socks4 request when IPv4 is forbidden. - * - * XXX raise this check outside the enclosing block? */ + } else if (socks->socks_version == 4 && !conn->ipv4_traffic_ok) { log_warn(LD_NET, "Rejecting SOCKS4 request on a listener with " "no IPv4 traffic supported."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; } else if (family == AF_INET6) { - /* Tell the exit: we won't accept any ipv4 connection to an IPv6 - * address. */ - conn->entry_cfg.ipv4_traffic = 0; + conn->ipv4_traffic_ok = 0; } else if (family == AF_INET) { - /* Tell the exit: we won't accept any ipv6 connection to an IPv4 - * address. */ - conn->entry_cfg.ipv6_traffic = 0; + conn->ipv6_traffic_ok = 0; } } } - /* we never allow IPv6 answers on socks4. (TODO: Is this smart?) */ if (socks->socks_version == 4) - conn->entry_cfg.ipv6_traffic = 0; - - /* Still handling CONNECT. Now, check for exit enclaves. (Which we - * don't do on BEGIN_DIR, or when there is a chosen exit.) - * - * TODO: Should we remove this? Exit enclaves are nutty and don't - * work very well - */ + conn->ipv6_traffic_ok = 0; + if (!conn->use_begindir && !conn->chosen_exit_name && !circ) { /* see if we can find a suitable enclave exit */ const node_t *r = @@ -1995,14 +1268,11 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } } - /* Still handling CONNECT: warn or reject if it's using a dangerous - * port. */ + /* warn or reject if it's using a dangerous port */ if (!conn->use_begindir && !conn->chosen_exit_name && !circ) if (consider_plaintext_ports(conn, socks->port) < 0) return -1; - /* Remember the port so that we will predict that more requests - there will happen in the future. */ if (!conn->use_begindir) { /* help predict this next time */ rep_hist_note_used_port(now, socks->port); @@ -2011,47 +1281,90 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, rep_hist_note_used_resolve(now); /* help predict this next time */ /* no extra processing needed */ } else { - /* We should only be doing CONNECT, RESOLVE, or RESOLVE_PTR! */ tor_fragile_assert(); } - - /* Okay. At this point we've set chosen_exit_name if needed, rewritten the - * address, and decided not to reject it for any number of reasons. Now - * mark the connection as waiting for a circuit, and try to attach it! - */ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; + if ((circ && connection_ap_handshake_attach_chosen_circuit( + conn, circ, cpath) < 0) || + (!circ && + connection_ap_handshake_attach_circuit(conn) < 0)) { + if (!base_conn->marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + return -1; + } + return 0; + } else { + /* it's a hidden-service request */ + rend_cache_entry_t *entry; + int r; + rend_service_authorization_t *client_auth; + rend_data_t *rend_data; + tor_assert(!automap); + if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) { + /* if it's a resolve request, fail it right now, rather than + * building all the circuits and then realizing it won't work. */ + log_warn(LD_APP, + "Resolve requests to hidden services not allowed. Failing."); + connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR, + 0,NULL,-1,TIME_MAX); + connection_mark_unattached_ap(conn, + END_STREAM_REASON_SOCKSPROTOCOL | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + return -1; + } - /* If we were given a circuit to attach to, try to attach. Otherwise, - * try to find a good one and attach to that. */ - int rv; if (circ) { - rv = connection_ap_handshake_attach_chosen_circuit(conn, circ, cpath); - } else { - /* We'll try to attach it at the next event loop, or whenever - * we call connection_ap_attach_pending() */ - connection_ap_mark_as_pending_circuit(conn); - rv = 0; + log_warn(LD_CONTROL, "Attachstream to a circuit is not " + "supported for .onion addresses currently. Failing."); + connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); + return -1; } - /* If the above function returned 0 then we're waiting for a circuit. - * if it returned 1, we're attached. Both are okay. But if it returned - * -1, there was an error, so make sure the connection is marked, and - * return -1. */ - if (rv < 0) { - if (!base_conn->marked_for_close) - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + ENTRY_TO_EDGE_CONN(conn)->rend_data = rend_data = + tor_malloc_zero(sizeof(rend_data_t)); + strlcpy(rend_data->onion_address, socks->address, + sizeof(rend_data->onion_address)); + log_info(LD_REND,"Got a hidden service request for ID '%s'", + safe_str_client(rend_data->onion_address)); + /* see if we already have it cached */ + r = rend_cache_lookup_entry(rend_data->onion_address, -1, &entry); + if (r<0) { + log_warn(LD_BUG,"Invalid service name '%s'", + safe_str_client(rend_data->onion_address)); + connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } + /* Help predict this next time. We're not sure if it will need + * a stable circuit yet, but we know we'll need *something*. */ + rep_hist_note_used_internal(now, 0, 1); + + /* Look up if we have client authorization for it. */ + client_auth = rend_client_lookup_service_authorization( + rend_data->onion_address); + if (client_auth) { + log_info(LD_REND, "Using previously configured client authorization " + "for hidden service request."); + memcpy(rend_data->descriptor_cookie, + client_auth->descriptor_cookie, REND_DESC_COOKIE_LEN); + rend_data->auth_type = client_auth->auth_type; + } + if (r==0) { + base_conn->state = AP_CONN_STATE_RENDDESC_WAIT; + log_info(LD_REND, "Unknown descriptor %s. Fetching.", + safe_str_client(rend_data->onion_address)); + rend_client_refetch_v2_renddesc(rend_data); + } else { /* r > 0 */ + base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; + log_info(LD_REND, "Descriptor is here. Great."); + if (connection_ap_handshake_attach_circuit(conn) < 0) { + if (!base_conn->marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + return -1; + } + } return 0; - } else { - /* If we get here, it's a request for a .onion address! */ - tor_assert(addresstype == ONION_V2_HOSTNAME || - addresstype == ONION_V3_HOSTNAME); - tor_assert(!automap); - return connection_ap_handle_onion(conn, socks, circ, addresstype); } - return 0; /* unreached but keeps the compiler happy */ } @@ -2065,13 +1378,13 @@ get_pf_socket(void) if (pf_socket >= 0) return pf_socket; -#if defined(OpenBSD) +#ifdef OPENBSD /* only works on OpenBSD */ pf = tor_open_cloexec("/dev/pf", O_RDONLY, 0); #else /* works on NetBSD and FreeBSD */ pf = tor_open_cloexec("/dev/pf", O_RDWR, 0); -#endif /* defined(OpenBSD) */ +#endif if (pf < 0) { log_warn(LD_NET, "open(\"/dev/pf\") failed: %s", strerror(errno)); @@ -2081,85 +1394,37 @@ get_pf_socket(void) pf_socket = pf; return pf_socket; } -#endif /* defined(TRANS_PF) */ +#endif -#if defined(TRANS_NETFILTER) || defined(TRANS_PF) || \ - defined(TRANS_TPROXY) -/** Try fill in the address of req from the socket configured - * with conn. */ +/** Fetch the original destination address and port from a + * system-specific interface and put them into a + * socks_request_t as if they came from a socks request. + * + * Return -1 if an error prevents fetching the destination, + * else return 0. + */ static int -destination_from_socket(entry_connection_t *conn, socks_request_t *req) +connection_ap_get_original_destination(entry_connection_t *conn, + socks_request_t *req) { +#ifdef TRANS_NETFILTER + /* Linux 2.4+ */ struct sockaddr_storage orig_dst; socklen_t orig_dst_len = sizeof(orig_dst); tor_addr_t addr; -#ifdef TRANS_TPROXY - if (get_options()->TransProxyType_parsed == TPT_TPROXY) { - if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&orig_dst, - &orig_dst_len) < 0) { - int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); - log_warn(LD_NET, "getsockname() failed: %s", tor_socket_strerror(e)); - return -1; - } - goto done; - } -#endif /* defined(TRANS_TPROXY) */ - -#ifdef TRANS_NETFILTER - int rv = -1; - switch (ENTRY_TO_CONN(conn)->socket_family) { -#ifdef TRANS_NETFILTER_IPV4 - case AF_INET: - rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST, - (struct sockaddr*)&orig_dst, &orig_dst_len); - break; -#endif /* defined(TRANS_NETFILTER_IPV4) */ -#ifdef TRANS_NETFILTER_IPV6 - case AF_INET6: - rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IPV6, IP6T_SO_ORIGINAL_DST, - (struct sockaddr*)&orig_dst, &orig_dst_len); - break; -#endif /* defined(TRANS_NETFILTER_IPV6) */ - default: - log_warn(LD_BUG, - "Received transparent data from an unsuported socket family %d", - ENTRY_TO_CONN(conn)->socket_family); - return -1; - } - if (rv < 0) { + if (getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST, + (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) { int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e)); return -1; } - goto done; -#elif defined(TRANS_PF) - if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&orig_dst, - &orig_dst_len) < 0) { - int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); - log_warn(LD_NET, "getsockname() failed: %s", tor_socket_strerror(e)); - return -1; - } - goto done; -#else - (void)conn; - (void)req; - log_warn(LD_BUG, "Unable to determine destination from socket."); - return -1; -#endif /* defined(TRANS_NETFILTER) || ... */ - done: tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port); tor_addr_to_str(req->address, &addr, sizeof(req->address), 1); return 0; -} -#endif /* defined(TRANS_NETFILTER) || defined(TRANS_PF) || ... */ - -#ifdef TRANS_PF -static int -destination_from_pf(entry_connection_t *conn, socks_request_t *req) -{ +#elif defined(TRANS_PF) struct sockaddr_storage proxy_addr; socklen_t proxy_addr_len = sizeof(proxy_addr); struct sockaddr *proxy_sa = (struct sockaddr*) &proxy_addr; @@ -2175,21 +1440,6 @@ destination_from_pf(entry_connection_t *conn, socks_request_t *req) return -1; } -#ifdef __FreeBSD__ - if (get_options()->TransProxyType_parsed == TPT_IPFW) { - /* ipfw(8) is used and in this case getsockname returned the original - destination */ - if (tor_addr_from_sockaddr(&addr, proxy_sa, &req->port) < 0) { - tor_fragile_assert(); - return -1; - } - - tor_addr_to_str(req->address, &addr, sizeof(req->address), 0); - - return 0; - } -#endif /* defined(__FreeBSD__) */ - memset(&pnl, 0, sizeof(pnl)); pnl.proto = IPPROTO_TCP; pnl.direction = PF_OUT; @@ -2236,44 +1486,13 @@ destination_from_pf(entry_connection_t *conn, socks_request_t *req) req->port = ntohs(pnl.rdport); return 0; -} -#endif /* defined(TRANS_PF) */ - -/** Fetch the original destination address and port from a - * system-specific interface and put them into a - * socks_request_t as if they came from a socks request. - * - * Return -1 if an error prevents fetching the destination, - * else return 0. - */ -static int -connection_ap_get_original_destination(entry_connection_t *conn, - socks_request_t *req) -{ -#ifdef TRANS_NETFILTER - return destination_from_socket(conn, req); -#elif defined(TRANS_PF) - const or_options_t *options = get_options(); - - if (options->TransProxyType_parsed == TPT_PF_DIVERT) - return destination_from_socket(conn, req); - - if (options->TransProxyType_parsed == TPT_DEFAULT || - options->TransProxyType_parsed == TPT_IPFW) - return destination_from_pf(conn, req); - - (void)conn; - (void)req; - log_warn(LD_BUG, "Proxy destination determination mechanism %s unknown.", - options->TransProxyType); - return -1; #else (void)conn; (void)req; log_warn(LD_BUG, "Called connection_ap_get_original_destination, but no " "transparent proxy method was configured."); return -1; -#endif /* defined(TRANS_NETFILTER) || ... */ +#endif } /** connection_edge_process_inbuf() found a conn in state @@ -2303,12 +1522,18 @@ connection_ap_handshake_process_socks(entry_connection_t *conn) log_debug(LD_APP,"entered."); - sockshere = fetch_from_buf_socks(base_conn->inbuf, socks, - options->TestSocks, options->SafeSocks); + IF_HAS_BUFFEREVENT(base_conn, { + struct evbuffer *input = bufferevent_get_input(base_conn->bufev); + sockshere = fetch_from_evbuffer_socks(input, socks, + options->TestSocks, options->SafeSocks); + }) ELSE_IF_NO_BUFFEREVENT { + sockshere = fetch_from_buf_socks(base_conn->inbuf, socks, + options->TestSocks, options->SafeSocks); + }; if (socks->replylen) { had_reply = 1; - connection_buf_add((const char*)socks->reply, socks->replylen, + connection_write_to_buf((const char*)socks->reply, socks->replylen, base_conn); socks->replylen = 0; if (sockshere == -1) { @@ -2405,7 +1630,7 @@ connection_ap_process_natd(entry_connection_t *conn) /* look for LF-terminated "[DEST ip_addr port]" * where ip_addr is a dotted-quad and port is in string form */ - err = connection_buf_get_line(ENTRY_TO_CONN(conn), tmp_buf, &tlen); + err = connection_fetch_from_buf_line(ENTRY_TO_CONN(conn), tmp_buf, &tlen); if (err == 0) return 0; if (err < 0) { @@ -2454,108 +1679,6 @@ connection_ap_process_natd(entry_connection_t *conn) return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); } -/** Called on an HTTP CONNECT entry connection when some bytes have arrived, - * but we have not yet received a full HTTP CONNECT request. Try to parse an - * HTTP CONNECT request from the connection's inbuf. On success, set up the - * connection's socks_request field and try to attach the connection. On - * failure, send an HTTP reply, and mark the connection. - */ -STATIC int -connection_ap_process_http_connect(entry_connection_t *conn) -{ - if (BUG(ENTRY_TO_CONN(conn)->state != AP_CONN_STATE_HTTP_CONNECT_WAIT)) - return -1; - - char *headers = NULL, *body = NULL; - char *command = NULL, *addrport = NULL; - char *addr = NULL; - size_t bodylen = 0; - - const char *errmsg = NULL; - int rv = 0; - - const int http_status = - fetch_from_buf_http(ENTRY_TO_CONN(conn)->inbuf, &headers, 8192, - &body, &bodylen, 1024, 0); - if (http_status < 0) { - /* Bad http status */ - errmsg = "HTTP/1.0 400 Bad Request\r\n\r\n"; - goto err; - } else if (http_status == 0) { - /* no HTTP request yet. */ - goto done; - } - - const int cmd_status = parse_http_command(headers, &command, &addrport); - if (cmd_status < 0) { - errmsg = "HTTP/1.0 400 Bad Request\r\n\r\n"; - goto err; - } - tor_assert(command); - tor_assert(addrport); - if (strcasecmp(command, "connect")) { - errmsg = "HTTP/1.0 405 Method Not Allowed\r\n\r\n"; - goto err; - } - - tor_assert(conn->socks_request); - socks_request_t *socks = conn->socks_request; - uint16_t port; - if (tor_addr_port_split(LOG_WARN, addrport, &addr, &port) < 0) { - errmsg = "HTTP/1.0 400 Bad Request\r\n\r\n"; - goto err; - } - if (strlen(addr) >= MAX_SOCKS_ADDR_LEN) { - errmsg = "HTTP/1.0 414 Request-URI Too Long\r\n\r\n"; - goto err; - } - - /* Abuse the 'username' and 'password' fields here. They are already an - * abuse. */ - { - char *authorization = http_get_header(headers, "Proxy-Authorization: "); - if (authorization) { - socks->username = authorization; // steal reference - socks->usernamelen = strlen(authorization); - } - char *isolation = http_get_header(headers, "X-Tor-Stream-Isolation: "); - if (isolation) { - socks->password = isolation; // steal reference - socks->passwordlen = strlen(isolation); - } - } - - socks->command = SOCKS_COMMAND_CONNECT; - socks->listener_type = CONN_TYPE_AP_HTTP_CONNECT_LISTENER; - strlcpy(socks->address, addr, sizeof(socks->address)); - socks->port = port; - - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - - rv = connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); - - // XXXX send a "100 Continue" message? - - goto done; - - err: - if (BUG(errmsg == NULL)) - errmsg = "HTTP/1.0 400 Bad Request\r\n\r\n"; - log_warn(LD_EDGE, "Saying %s", escaped(errmsg)); - connection_buf_add(errmsg, strlen(errmsg), ENTRY_TO_CONN(conn)); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_HTTPPROTOCOL| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - - done: - tor_free(headers); - tor_free(body); - tor_free(command); - tor_free(addrport); - tor_free(addr); - return rv; -} - /** Iterate over the two bytes of stream_id until we get one that is not * already in use; return it. Return 0 if can't get a unique stream_id. */ @@ -2591,8 +1714,7 @@ connection_ap_supports_optimistic_data(const entry_connection_t *conn) general circuit. */ if (edge_conn->on_circuit == NULL || edge_conn->on_circuit->state != CIRCUIT_STATE_OPEN || - (edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL && - edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_REND_JOINED)) + edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL) return 0; return conn->may_use_optimistic_data; @@ -2617,19 +1739,19 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn) return 0; /* If only IPv4 is supported, no flags */ - if (ap_conn->entry_cfg.ipv4_traffic && !ap_conn->entry_cfg.ipv6_traffic) + if (ap_conn->ipv4_traffic_ok && !ap_conn->ipv6_traffic_ok) return 0; if (! cpath_layer || ! cpath_layer->extend_info) return 0; - if (!ap_conn->entry_cfg.ipv4_traffic) + if (!ap_conn->ipv4_traffic_ok) flags |= BEGIN_FLAG_IPV4_NOT_OK; exitnode = node_get_by_id(cpath_layer->extend_info->identity_digest); - if (ap_conn->entry_cfg.ipv6_traffic && exitnode) { + if (ap_conn->ipv6_traffic_ok && exitnode) { tor_addr_t a; tor_addr_make_null(&a, AF_INET6); if (compare_tor_addr_to_node_policy(&a, ap_conn->socks_request->port, @@ -2644,7 +1766,7 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn) if (flags == BEGIN_FLAG_IPV6_OK) { /* When IPv4 and IPv6 are both allowed, consider whether to say we * prefer IPv6. Otherwise there's no point in declaring a preference */ - if (ap_conn->entry_cfg.prefer_ipv6) + if (ap_conn->prefer_ipv6_traffic) flags |= BEGIN_FLAG_IPV6_PREFERRED; } @@ -2663,13 +1785,12 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn) * * If ap_conn is broken, mark it for close and return -1. Else return 0. */ -MOCK_IMPL(int, -connection_ap_handshake_send_begin,(entry_connection_t *ap_conn)) +int +connection_ap_handshake_send_begin(entry_connection_t *ap_conn) { char payload[CELL_PAYLOAD_SIZE]; int payload_len; int begin_type; - const or_options_t *options = get_options(); origin_circuit_t *circ; edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(ap_conn); connection_t *base_conn = TO_CONN(edge_conn); @@ -2683,7 +1804,7 @@ connection_ap_handshake_send_begin,(entry_connection_t *ap_conn)) edge_conn->stream_id = get_unique_stream_id_by_circ(circ); if (edge_conn->stream_id==0) { - /* XXXX+ Instead of closing this stream, we should make it get + /* XXXX024 Instead of closing this stream, we should make it get * retried on another circuit. */ connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); @@ -2706,46 +1827,16 @@ connection_ap_handshake_send_begin,(entry_connection_t *ap_conn)) } log_info(LD_APP, - "Sending relay cell %d on circ %u to begin stream %d.", + "Sending relay cell %d to begin stream %d.", (int)ap_conn->use_begindir, - (unsigned)circ->base_.n_circ_id, edge_conn->stream_id); begin_type = ap_conn->use_begindir ? RELAY_COMMAND_BEGIN_DIR : RELAY_COMMAND_BEGIN; - - /* Check that circuits are anonymised, based on their type. */ if (begin_type == RELAY_COMMAND_BEGIN) { - /* This connection is a standard OR connection. - * Make sure its path length is anonymous, or that we're in a - * non-anonymous mode. */ - assert_circ_anonymity_ok(circ, options); - } else if (begin_type == RELAY_COMMAND_BEGIN_DIR) { - /* This connection is a begindir directory connection. - * Look at the linked directory connection to access the directory purpose. - * If a BEGINDIR connection is ever not linked, that's a bug. */ - if (BUG(!base_conn->linked)) { - return -1; - } - connection_t *linked_dir_conn_base = base_conn->linked_conn; - /* If the linked connection has been unlinked by other code, we can't send - * a begin cell on it. */ - if (!linked_dir_conn_base) { - return -1; - } - /* Sensitive directory connections must have an anonymous path length. - * Otherwise, directory connections are typically one-hop. - * This matches the earlier check for directory connection path anonymity - * in directory_initiate_request(). */ - if (purpose_needs_anonymity(linked_dir_conn_base->purpose, - TO_DIR_CONN(linked_dir_conn_base)->router_purpose, - TO_DIR_CONN(linked_dir_conn_base)->requested_resource)) { - assert_circ_anonymity_ok(circ, options); - } - } else { - /* This code was written for the two connection types BEGIN and BEGIN_DIR - */ - tor_assert_unreached(); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(circ->build_state->onehop_tunnel == 0); +#endif } if (connection_edge_send_command(edge_conn, begin_type, @@ -2768,7 +1859,7 @@ connection_ap_handshake_send_begin,(entry_connection_t *ap_conn)) log_info(LD_APP, "Sending up to %ld + %ld bytes of queued-up data", (long)connection_get_inbuf_len(base_conn), ap_conn->sending_optimistic_data ? - (long)buf_datalen(ap_conn->sending_optimistic_data) : 0); + (long)generic_buffer_len(ap_conn->sending_optimistic_data) : 0); if (connection_edge_package_raw_inbuf(edge_conn, 1, NULL) < 0) { connection_mark_for_close(base_conn); } @@ -2804,7 +1895,7 @@ connection_ap_handshake_send_resolve(entry_connection_t *ap_conn) edge_conn->stream_id = get_unique_stream_id_by_circ(circ); if (edge_conn->stream_id==0) { - /* XXXX+ Instead of closing this stream, we should make it get + /* XXXX024 Instead of closing this stream, we should make it get * retried on another circuit. */ connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); @@ -2855,7 +1946,7 @@ connection_ap_handshake_send_resolve(entry_connection_t *ap_conn) if (!base_conn->address) { /* This might be unnecessary. XXXX */ - base_conn->address = tor_addr_to_str_dup(&base_conn->addr); + base_conn->address = tor_dup_addr(&base_conn->addr); } base_conn->state = AP_CONN_STATE_RESOLVE_WAIT; log_info(LD_APP,"Address sent for resolve, ap socket "TOR_SOCKET_T_FORMAT @@ -2912,8 +2003,8 @@ connection_ap_make_link(connection_t *partner, /* Populate isolation fields. */ conn->socks_request->listener_type = CONN_TYPE_DIR_LISTENER; conn->original_dest_address = tor_strdup(address); - conn->entry_cfg.session_group = session_group; - conn->entry_cfg.isolation_flags = isolation_flags; + conn->session_group = session_group; + conn->isolation_flags = isolation_flags; base_conn->address = tor_strdup("(Tor_internal)"); tor_addr_make_unspec(&base_conn->addr); @@ -2931,7 +2022,12 @@ connection_ap_make_link(connection_t *partner, control_event_stream_status(conn, STREAM_EVENT_NEW, 0); /* attaching to a dirty circuit is fine */ - connection_ap_mark_as_pending_circuit(conn); + if (connection_ap_handshake_attach_circuit(conn) < 0) { + if (!base_conn->marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + return NULL; + } + log_info(LD_APP,"... application connection created and linked."); return conn; } @@ -2969,7 +2065,7 @@ tell_controller_about_resolved_result(entry_connection_t *conn, * As connection_ap_handshake_socks_resolved, but take a tor_addr_t to send * as the answer. */ -void +static void connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn, const tor_addr_t *answer, int ttl, @@ -3002,13 +2098,13 @@ connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn, **/ /* XXXX the use of the ttl and expires fields is nutty. Let's make this * interface and those that use it less ugly. */ -MOCK_IMPL(void, -connection_ap_handshake_socks_resolved,(entry_connection_t *conn, +void +connection_ap_handshake_socks_resolved(entry_connection_t *conn, int answer_type, size_t answer_len, const uint8_t *answer, int ttl, - time_t expires)) + time_t expires) { char buf[384]; size_t replylen; @@ -3146,21 +2242,13 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, endreason == END_STREAM_REASON_RESOURCELIMIT) { if (!conn->edge_.on_circuit || !CIRCUIT_IS_ORIGIN(conn->edge_.on_circuit)) { - if (endreason != END_STREAM_REASON_RESOLVEFAILED) { - log_info(LD_BUG, - "No origin circuit for successful SOCKS stream "U64_FORMAT - ". Reason: %d", - U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier), - endreason); - } - /* - * Else DNS remaps and failed hidden service lookups can send us - * here with END_STREAM_REASON_RESOLVEFAILED; ignore it - * - * Perhaps we could make the test more precise; we can tell hidden - * services by conn->edge_.renddata != NULL; anything analogous for - * the DNS remap case? - */ + // DNS remaps can trigger this. So can failed hidden service + // lookups. + log_info(LD_BUG, + "No origin circuit for successful SOCKS stream "U64_FORMAT + ". Reason: %d", + U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier), + endreason); } else { // XXX: Hrmm. It looks like optimistic data can't go through this // codepath, but someone should probably test it and make sure. @@ -3175,41 +2263,23 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, return; } if (replylen) { /* we already have a reply in mind */ - connection_buf_add(reply, replylen, ENTRY_TO_CONN(conn)); + connection_write_to_buf(reply, replylen, ENTRY_TO_CONN(conn)); conn->socks_request->has_finished = 1; return; } - if (conn->socks_request->listener_type == - CONN_TYPE_AP_HTTP_CONNECT_LISTENER) { - const char *response = end_reason_to_http_connect_response_line(endreason); - if (!response) { - response = "HTTP/1.0 400 Bad Request\r\n\r\n"; - } - connection_buf_add(response, strlen(response), ENTRY_TO_CONN(conn)); - } else if (conn->socks_request->socks_version == 4) { + if (conn->socks_request->socks_version == 4) { memset(buf,0,SOCKS4_NETWORK_LEN); buf[1] = (status==SOCKS5_SUCCEEDED ? SOCKS4_GRANTED : SOCKS4_REJECT); /* leave version, destport, destip zero */ - connection_buf_add(buf, SOCKS4_NETWORK_LEN, ENTRY_TO_CONN(conn)); + connection_write_to_buf(buf, SOCKS4_NETWORK_LEN, ENTRY_TO_CONN(conn)); } else if (conn->socks_request->socks_version == 5) { - size_t buf_len; - memset(buf,0,sizeof(buf)); - if (tor_addr_family(&conn->edge_.base_.addr) == AF_INET) { - buf[0] = 5; /* version 5 */ - buf[1] = (char)status; - buf[2] = 0; - buf[3] = 1; /* ipv4 addr */ - /* 4 bytes for the header, 2 bytes for the port, 4 for the address. */ - buf_len = 10; - } else { /* AF_INET6. */ - buf[0] = 5; /* version 5 */ - buf[1] = (char)status; - buf[2] = 0; - buf[3] = 4; /* ipv6 addr */ - /* 4 bytes for the header, 2 bytes for the port, 16 for the address. */ - buf_len = 22; - } - connection_buf_add(buf,buf_len,ENTRY_TO_CONN(conn)); + buf[0] = 5; /* version 5 */ + buf[1] = (char)status; + buf[2] = 0; + buf[3] = 1; /* ipv4 addr */ + memset(buf+4,0,6); /* Set external addr/port to 0. + The spec doesn't seem to say what to do here. -RD */ + connection_write_to_buf(buf,10,ENTRY_TO_CONN(conn)); } /* If socks_version isn't 4 or 5, don't send anything. * This can happen in the case of AP bridges. */ @@ -3217,12 +2287,12 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, return; } -/** Read a RELAY_BEGIN or RELAY_BEGIN_DIR cell from cell, decode it, and +/** Read a RELAY_BEGIN or RELAY_BEGINDIR cell from cell, decode it, and * place the result in bcell. On success return 0; on failure return * <0 and set *end_reason_out to the end reason we should send back to * the client. * - * Return -1 in the case where we want to send a RELAY_END cell, and < -1 when + * Return -1 in the case where want to send a RELAY_END cell, and < -1 when * we don't. **/ STATIC int @@ -3281,88 +2351,6 @@ begin_cell_parse(const cell_t *cell, begin_cell_t *bcell, return 0; } -/** For the given circ and the edge connection conn, setup the - * connection, attach it to the circ and connect it. Return 0 on success - * or END_CIRC_AT_ORIGIN if we can't find the requested hidden service port - * where the caller should close the circuit. */ -static int -handle_hs_exit_conn(circuit_t *circ, edge_connection_t *conn) -{ - int ret; - origin_circuit_t *origin_circ; - - assert_circuit_ok(circ); - tor_assert(circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED); - tor_assert(conn); - - log_debug(LD_REND, "Connecting the hidden service rendezvous circuit " - "to the service destination."); - - origin_circ = TO_ORIGIN_CIRCUIT(circ); - conn->base_.address = tor_strdup("(rendezvous)"); - conn->base_.state = EXIT_CONN_STATE_CONNECTING; - - /* The circuit either has an hs identifier for v3+ or a rend_data for legacy - * service. */ - if (origin_circ->rend_data) { - conn->rend_data = rend_data_dup(origin_circ->rend_data); - tor_assert(connection_edge_is_rendezvous_stream(conn)); - ret = rend_service_set_connection_addr_port(conn, origin_circ); - } else if (origin_circ->hs_ident) { - /* Setup the identifier to be the one for the circuit service. */ - conn->hs_ident = - hs_ident_edge_conn_new(&origin_circ->hs_ident->identity_pk); - tor_assert(connection_edge_is_rendezvous_stream(conn)); - ret = hs_service_set_conn_addr_port(origin_circ, conn); - } else { - /* We should never get here if the circuit's purpose is rendezvous. */ - tor_assert_nonfatal_unreached(); - return -1; - } - if (ret < 0) { - log_info(LD_REND, "Didn't find rendezvous service (addr%s, port %d)", - fmt_addr(&TO_CONN(conn)->addr), TO_CONN(conn)->port); - /* Send back reason DONE because we want to make hidden service port - * scanning harder thus instead of returning that the exit policy - * didn't match, which makes it obvious that the port is closed, - * return DONE and kill the circuit. That way, a user (malicious or - * not) needs one circuit per bad port unless it matches the policy of - * the hidden service. */ - relay_send_end_cell_from_edge(conn->stream_id, circ, - END_STREAM_REASON_DONE, - origin_circ->cpath->prev); - connection_free_(TO_CONN(conn)); - - /* Drop the circuit here since it might be someone deliberately - * scanning the hidden service ports. Note that this mitigates port - * scanning by adding more work on the attacker side to successfully - * scan but does not fully solve it. */ - if (ret < -1) { - return END_CIRC_AT_ORIGIN; - } else { - return 0; - } - } - - /* Link the circuit and the connection crypt path. */ - conn->cpath_layer = origin_circ->cpath->prev; - - /* Add it into the linked list of p_streams on this circuit */ - conn->next_stream = origin_circ->p_streams; - origin_circ->p_streams = conn; - conn->on_circuit = circ; - assert_circuit_ok(circ); - - hs_inc_rdv_stream_counter(origin_circ); - - /* Connect tor to the hidden service destination. */ - connection_exit_connect(conn); - - /* For path bias: This circuit was used successfully */ - pathbias_mark_use_success(origin_circ); - return 0; -} - /** A relay 'begin' or 'begin_dir' cell has arrived, and either we are * an exit hop for the circuit, or we are the origin and it is a * rendezvous begin. @@ -3389,25 +2377,23 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) char *address = NULL; uint16_t port = 0; or_circuit_t *or_circ = NULL; - origin_circuit_t *origin_circ = NULL; - crypt_path_t *layer_hint = NULL; const or_options_t *options = get_options(); begin_cell_t bcell; - int rv; + int r; uint8_t end_reason=0; assert_circuit_ok(circ); - if (!CIRCUIT_IS_ORIGIN(circ)) { + if (!CIRCUIT_IS_ORIGIN(circ)) or_circ = TO_OR_CIRCUIT(circ); - } else { - tor_assert(circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED); - origin_circ = TO_ORIGIN_CIRCUIT(circ); - layer_hint = origin_circ->cpath->prev; - } relay_header_unpack(&rh, cell->payload); if (rh.length > RELAY_PAYLOAD_SIZE) - return -END_CIRC_REASON_TORPROTOCOL; + return -1; + + /* Note: we have to use relay_send_command_from_edge here, not + * connection_edge_end or connection_edge_send_command, since those require + * that we have a stream connected to a circuit, and we don't connect to a + * circuit until we have a pending/successful resolve. */ if (!server_mode(options) && circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED) { @@ -3418,12 +2404,12 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) return 0; } - rv = begin_cell_parse(cell, &bcell, &end_reason); - if (rv < -1) { - return -END_CIRC_REASON_TORPROTOCOL; - } else if (rv == -1) { + r = begin_cell_parse(cell, &bcell, &end_reason); + if (r < -1) { + return -1; + } else if (r == -1) { tor_free(bcell.address); - relay_send_end_cell_from_edge(rh.stream_id, circ, end_reason, layer_hint); + relay_send_end_cell_from_edge(rh.stream_id, circ, end_reason, NULL); return 0; } @@ -3433,21 +2419,22 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) port = bcell.port; if (or_circ && or_circ->p_chan) { - const int client_chan = channel_is_client(or_circ->p_chan); - if ((client_chan || - (!connection_or_digest_is_known_relay( + if (!options->AllowSingleHopExits && + (or_circ->is_first_hop || + (!connection_or_digest_is_known_relay( or_circ->p_chan->identity_digest) && should_refuse_unknown_exits(options)))) { - /* Don't let clients use us as a single-hop proxy. It attracts - * attackers and users who'd be better off with, well, single-hop - * proxies. */ + /* Don't let clients use us as a single-hop proxy, unless the user + * has explicitly allowed that in the config. It attracts attackers + * and users who'd be better off with, well, single-hop proxies. + */ log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Attempt by %s to open a stream %s. Closing.", safe_str(channel_get_canonical_remote_descr(or_circ->p_chan)), - client_chan ? "on first hop of circuit" : - "from unknown relay"); + or_circ->is_first_hop ? "on first hop of circuit" : + "from unknown relay"); relay_send_end_cell_from_edge(rh.stream_id, circ, - client_chan ? + or_circ->is_first_hop ? END_STREAM_REASON_TORPROTOCOL : END_STREAM_REASON_MISC, NULL); @@ -3459,12 +2446,12 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) if (!directory_permits_begindir_requests(options) || circ->purpose != CIRCUIT_PURPOSE_OR) { relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_NOTDIRECTORY, layer_hint); + END_STREAM_REASON_NOTDIRECTORY, NULL); return 0; } /* Make sure to get the 'real' address of the previous hop: the - * caller might want to know whether the remote IP address has changed, - * and we might already have corrected base_.addr[ess] for the relay's + * caller might want to know whether his IP address has changed, and + * we might already have corrected base_.addr[ess] for the relay's * canonical IP address. */ if (or_circ && or_circ->p_chan) address = tor_strdup(channel_get_actual_remote_address(or_circ->p_chan)); @@ -3476,7 +2463,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) } else { log_warn(LD_BUG, "Got an unexpected command %d", (int)rh.command); relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_INTERNAL, layer_hint); + END_STREAM_REASON_INTERNAL, NULL); return 0; } @@ -3487,7 +2474,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) if (bcell.flags & BEGIN_FLAG_IPV4_NOT_OK) { tor_free(address); relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_EXITPOLICY, layer_hint); + END_STREAM_REASON_EXITPOLICY, NULL); return 0; } } @@ -3510,10 +2497,40 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) n_stream->deliver_window = STREAMWINDOW_START; if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) { + origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); + log_info(LD_REND,"begin is for rendezvous. configuring stream."); + n_stream->base_.address = tor_strdup("(rendezvous)"); + n_stream->base_.state = EXIT_CONN_STATE_CONNECTING; + n_stream->rend_data = rend_data_dup(origin_circ->rend_data); + tor_assert(connection_edge_is_rendezvous_stream(n_stream)); + assert_circuit_ok(circ); + if (rend_service_set_connection_addr_port(n_stream, origin_circ) < 0) { + log_info(LD_REND,"Didn't find rendezvous service (port %d)", + n_stream->base_.port); + relay_send_end_cell_from_edge(rh.stream_id, circ, + END_STREAM_REASON_EXITPOLICY, + origin_circ->cpath->prev); + connection_free(TO_CONN(n_stream)); + tor_free(address); + return 0; + } + assert_circuit_ok(circ); + log_debug(LD_REND,"Finished assigning addr/port"); + n_stream->cpath_layer = origin_circ->cpath->prev; /* link it */ + + /* add it into the linked list of p_streams on this circuit */ + n_stream->next_stream = origin_circ->p_streams; + n_stream->on_circuit = circ; + origin_circ->p_streams = n_stream; + assert_circuit_ok(circ); + + connection_exit_connect(n_stream); + + /* For path bias: This circuit was used successfully */ + pathbias_mark_use_success(origin_circ); + tor_free(address); - /* We handle this circuit and stream in this function for all supported - * hidden service version. */ - return handle_hs_exit_conn(circ, n_stream); + return 0; } tor_strlower(address); n_stream->base_.address = address; @@ -3523,7 +2540,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) if (we_are_hibernating()) { relay_send_end_cell_from_edge(rh.stream_id, circ, END_STREAM_REASON_HIBERNATING, NULL); - connection_free_(TO_CONN(n_stream)); + connection_free(TO_CONN(n_stream)); return 0; } @@ -3601,7 +2618,7 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) return 0; case 1: /* The result was cached; a resolved cell was sent. */ if (!dummy_conn->base_.marked_for_close) - connection_free_(TO_CONN(dummy_conn)); + connection_free(TO_CONN(dummy_conn)); return 0; case 0: /* resolve added to pending list */ assert_circuit_ok(TO_CIRCUIT(circ)); @@ -3610,24 +2627,6 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) return 0; } -/** Helper: Return true and set *why_rejected to an optional clarifying - * message message iff we do not allow connections to addr:port. - */ -static int -my_exit_policy_rejects(const tor_addr_t *addr, - uint16_t port, - const char **why_rejected) -{ - if (router_compare_to_my_exit_policy(addr, port)) { - *why_rejected = ""; - return 1; - } else if (tor_addr_family(addr) == AF_INET6 && !get_options()->IPv6Exit) { - *why_rejected = " (IPv6 address without IPv6Exit configured)"; - return 1; - } - return 0; -} - /** Connect to conn's specified addr and port. If it worked, conn * has now been added to the connection_array. * @@ -3641,55 +2640,29 @@ connection_exit_connect(edge_connection_t *edge_conn) const tor_addr_t *addr; uint16_t port; connection_t *conn = TO_CONN(edge_conn); - int socket_error = 0, result; - const char *why_failed_exit_policy = NULL; - - /* Apply exit policy to non-rendezvous connections. */ - if (! connection_edge_is_rendezvous_stream(edge_conn) && - my_exit_policy_rejects(&edge_conn->base_.addr, - edge_conn->base_.port, - &why_failed_exit_policy)) { - if (BUG(!why_failed_exit_policy)) - why_failed_exit_policy = ""; - log_info(LD_EXIT,"%s:%d failed exit policy%s. Closing.", - escaped_safe_str_client(conn->address), conn->port, - why_failed_exit_policy); + int socket_error = 0; + + if ( (!connection_edge_is_rendezvous_stream(edge_conn) && + router_compare_to_my_exit_policy(&edge_conn->base_.addr, + edge_conn->base_.port)) || + (tor_addr_family(&conn->addr) == AF_INET6 && + ! get_options()->IPv6Exit)) { + log_info(LD_EXIT,"%s:%d failed exit policy. Closing.", + escaped_safe_str_client(conn->address), conn->port); connection_edge_end(edge_conn, END_STREAM_REASON_EXITPOLICY); circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); connection_free(conn); return; } -#ifdef HAVE_SYS_UN_H - if (conn->socket_family != AF_UNIX) { -#else - { -#endif /* defined(HAVE_SYS_UN_H) */ - addr = &conn->addr; - port = conn->port; - - if (tor_addr_family(addr) == AF_INET6) - conn->socket_family = AF_INET6; - - log_debug(LD_EXIT, "about to try connecting"); - result = connection_connect(conn, conn->address, - addr, port, &socket_error); -#ifdef HAVE_SYS_UN_H - } else { - /* - * In the AF_UNIX case, we expect to have already had conn->port = 1, - * tor_addr_make_unspec(conn->addr) (cf. the way we mark in the incoming - * case in connection_handle_listener_read()), and conn->address should - * have the socket path to connect to. - */ - tor_assert(conn->address && strlen(conn->address) > 0); + addr = &conn->addr; + port = conn->port; - log_debug(LD_EXIT, "about to try connecting"); - result = connection_connect_unix(conn, conn->address, &socket_error); -#endif /* defined(HAVE_SYS_UN_H) */ - } + if (tor_addr_family(addr) == AF_INET6) + conn->socket_family = AF_INET6; - switch (result) { + log_debug(LD_EXIT,"about to try connecting"); + switch (connection_connect(conn, conn->address, addr, port, &socket_error)) { case -1: { int reason = errno_to_stream_end_reason(socket_error); connection_edge_end(edge_conn, reason); @@ -3710,13 +2683,16 @@ connection_exit_connect(edge_connection_t *edge_conn) conn->state = EXIT_CONN_STATE_OPEN; if (connection_get_outbuf_len(conn)) { /* in case there are any queued data cells, from e.g. optimistic data */ - connection_watch_events(conn, READ_EVENT|WRITE_EVENT); + IF_HAS_NO_BUFFEREVENT(conn) + connection_watch_events(conn, READ_EVENT|WRITE_EVENT); } else { - connection_watch_events(conn, READ_EVENT); + IF_HAS_NO_BUFFEREVENT(conn) + connection_watch_events(conn, READ_EVENT); } /* also, deliver a 'connected' cell back through the circuit. */ if (connection_edge_is_rendezvous_stream(edge_conn)) { + /* rendezvous stream */ /* don't send an address back! */ connection_edge_send_command(edge_conn, RELAY_COMMAND_CONNECTED, @@ -3774,8 +2750,8 @@ connection_exit_connect_dir(edge_connection_t *exitconn) if (connection_add(TO_CONN(exitconn))<0) { connection_edge_end(exitconn, END_STREAM_REASON_RESOURCELIMIT); - connection_free_(TO_CONN(exitconn)); - connection_free_(TO_CONN(dirconn)); + connection_free(TO_CONN(exitconn)); + connection_free(TO_CONN(dirconn)); return 0; } @@ -3787,7 +2763,7 @@ connection_exit_connect_dir(edge_connection_t *exitconn) connection_edge_end(exitconn, END_STREAM_REASON_RESOURCELIMIT); connection_close_immediate(TO_CONN(exitconn)); connection_mark_for_close(TO_CONN(exitconn)); - connection_free_(TO_CONN(dirconn)); + connection_free(TO_CONN(dirconn)); return 0; } @@ -3808,41 +2784,36 @@ connection_exit_connect_dir(edge_connection_t *exitconn) * it is a general stream. */ int -connection_edge_is_rendezvous_stream(const edge_connection_t *conn) +connection_edge_is_rendezvous_stream(edge_connection_t *conn) { tor_assert(conn); - /* It should not be possible to set both of these structs */ - tor_assert_nonfatal(!(conn->rend_data && conn->hs_ident)); - - if (conn->rend_data || conn->hs_ident) { + if (conn->rend_data) return 1; - } return 0; } -/** Return 1 if router exit_node is likely to allow stream conn +/** Return 1 if router exit is likely to allow stream conn * to exit from it, or 0 if it probably will not allow it. * (We might be uncertain if conn's destination address has not yet been * resolved.) */ int -connection_ap_can_use_exit(const entry_connection_t *conn, - const node_t *exit_node) +connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit) { const or_options_t *options = get_options(); tor_assert(conn); tor_assert(conn->socks_request); - tor_assert(exit_node); + tor_assert(exit); /* If a particular exit node has been requested for the new connection, * make sure the exit node of the existing circuit matches exactly. */ if (conn->chosen_exit_name) { const node_t *chosen_exit = - node_get_by_nickname(conn->chosen_exit_name, 0); + node_get_by_nickname(conn->chosen_exit_name, 1); if (!chosen_exit || tor_memneq(chosen_exit->identity, - exit_node->identity, DIGEST_LEN)) { + exit->identity, DIGEST_LEN)) { /* doesn't match */ // log_debug(LD_APP,"Requested node '%s', considering node '%s'. No.", // conn->chosen_exit_name, exit->nickname); @@ -3860,15 +2831,14 @@ connection_ap_can_use_exit(const entry_connection_t *conn, addr_policy_result_t r; if (0 == tor_addr_parse(&addr, conn->socks_request->address)) { addrp = &addr; - } else if (!conn->entry_cfg.ipv4_traffic && conn->entry_cfg.ipv6_traffic) { + } else if (!conn->ipv4_traffic_ok && conn->ipv6_traffic_ok) { tor_addr_make_null(&addr, AF_INET6); addrp = &addr; - } else if (conn->entry_cfg.ipv4_traffic && !conn->entry_cfg.ipv6_traffic) { + } else if (conn->ipv4_traffic_ok && !conn->ipv6_traffic_ok) { tor_addr_make_null(&addr, AF_INET); addrp = &addr; } - r = compare_tor_addr_to_node_policy(addrp, conn->socks_request->port, - exit_node); + r = compare_tor_addr_to_node_policy(addrp, conn->socks_request->port,exit); if (r == ADDR_POLICY_REJECTED) return 0; /* We know the address, and the exit policy rejects it. */ if (r == ADDR_POLICY_PROBABLY_REJECTED && !conn->chosen_exit_name) @@ -3877,10 +2847,10 @@ connection_ap_can_use_exit(const entry_connection_t *conn, * this node, err on the side of caution. */ } else if (SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) { /* Don't send DNS requests to non-exit servers by default. */ - if (!conn->chosen_exit_name && node_exit_policy_rejects_all(exit_node)) + if (!conn->chosen_exit_name && node_exit_policy_rejects_all(exit)) return 0; } - if (routerset_contains_node(options->ExcludeExitNodesUnion_, exit_node)) { + if (routerset_contains_node(options->ExcludeExitNodesUnion_, exit)) { /* Not a suitable exit. Refuse it. */ return 0; } @@ -3889,12 +2859,10 @@ connection_ap_can_use_exit(const entry_connection_t *conn, } /** If address is of the form "y.onion" with a well-formed handle y: - * Put a NUL after y, lower-case it, and return ONION_V2_HOSTNAME or - * ONION_V3_HOSTNAME depending on the HS version. + * Put a NUL after y, lower-case it, and return ONION_HOSTNAME. * * If address is of the form "x.y.onion" with a well-formed handle x: - * Drop "x.", put a NUL after y, lower-case it, and return - * ONION_V2_HOSTNAME or ONION_V3_HOSTNAME depending on the HS version. + * Drop "x.", put a NUL after y, lower-case it, and return ONION_HOSTNAME. * * If address is of the form "y.onion" with a badly-formed handle y: * Return BAD_HOSTNAME and log a message. @@ -3910,7 +2878,7 @@ parse_extended_hostname(char *address) { char *s; char *q; - char query[HS_SERVICE_ADDR_LEN_BASE32+1]; + char query[REND_SERVICE_ID_LEN_BASE32+1]; s = strrchr(address,'.'); if (!s) @@ -3930,17 +2898,14 @@ parse_extended_hostname(char *address) goto failed; /* reject sub-domain, as DNS does */ } q = (NULL == q) ? address : q + 1; - if (strlcpy(query, q, HS_SERVICE_ADDR_LEN_BASE32+1) >= - HS_SERVICE_ADDR_LEN_BASE32+1) + if (strlcpy(query, q, REND_SERVICE_ID_LEN_BASE32+1) >= + REND_SERVICE_ID_LEN_BASE32+1) goto failed; if (q != address) { memmove(address, q, strlen(q) + 1 /* also get \0 */); } - if (rend_valid_v2_service_id(query)) { - return ONION_V2_HOSTNAME; /* success */ - } - if (hs_address_is_valid(query)) { - return ONION_V3_HOSTNAME; + if (rend_valid_service_id(query)) { + return ONION_HOSTNAME; /* success */ } failed: /* otherwise, return to previous state and return 0 */ @@ -3975,7 +2940,7 @@ int connection_edge_compatible_with_circuit(const entry_connection_t *conn, const origin_circuit_t *circ) { - const uint8_t iso = conn->entry_cfg.isolation_flags; + const uint8_t iso = conn->isolation_flags; const socks_request_t *sr = conn->socks_request; /* If circ has never been used for an isolated connection, we can @@ -4024,8 +2989,7 @@ connection_edge_compatible_with_circuit(const entry_connection_t *conn, if ((iso & ISO_CLIENTADDR) && !tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) return 0; - if ((iso & ISO_SESSIONGRP) && - conn->entry_cfg.session_group != circ->session_group) + if ((iso & ISO_SESSIONGRP) && conn->session_group != circ->session_group) return 0; if ((iso & ISO_NYM_EPOCH) && conn->nym_epoch != circ->nym_epoch) return 0; @@ -4064,7 +3028,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, circ->client_proto_type = conn->socks_request->listener_type; circ->client_proto_socksver = conn->socks_request->socks_version; tor_addr_copy(&circ->client_addr, &ENTRY_TO_CONN(conn)->addr); - circ->session_group = conn->entry_cfg.session_group; + circ->session_group = conn->session_group; circ->nym_epoch = conn->nym_epoch; circ->socks_username = sr->username ? tor_memdup(sr->username, sr->usernamelen) : NULL; @@ -4091,7 +3055,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, mixed |= ISO_CLIENTPROTO; if (!tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) mixed |= ISO_CLIENTADDR; - if (conn->entry_cfg.session_group != circ->session_group) + if (conn->session_group != circ->session_group) mixed |= ISO_SESSIONGRP; if (conn->nym_epoch != circ->nym_epoch) mixed |= ISO_NYM_EPOCH; @@ -4099,7 +3063,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, if (dry_run) return mixed; - if ((mixed & conn->entry_cfg.isolation_flags) != 0) { + if ((mixed & conn->isolation_flags) != 0) { log_warn(LD_BUG, "Updating a circuit with seemingly incompatible " "isolation flags."); } @@ -4153,12 +3117,3 @@ circuit_clear_isolation(origin_circuit_t *circ) circ->socks_username_len = circ->socks_password_len = 0; } -/** Free all storage held in module-scoped variables for connection_edge.c */ -void -connection_edge_free_all(void) -{ - untried_pending_connections = 0; - smartlist_free(pending_entry_connections); - pending_entry_connections = NULL; -} - diff --git a/src/tor/src/or/connection_edge.h b/src/tor/connection_edge.h similarity index 59% rename from src/tor/src/or/connection_edge.h rename to src/tor/connection_edge.h index c6583d384..e3a95ad9e 100644 --- a/src/tor/src/or/connection_edge.h +++ b/src/tor/connection_edge.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,9 +17,8 @@ #define connection_mark_unattached_ap(conn, endreason) \ connection_mark_unattached_ap_((conn), (endreason), __LINE__, SHORT_FILE__) -MOCK_DECL(void,connection_mark_unattached_ap_, - (entry_connection_t *conn, int endreason, - int line, const char *file)); +void connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, + int line, const char *file); int connection_edge_reached_eof(edge_connection_t *conn); int connection_edge_process_inbuf(edge_connection_t *conn, int package_partial); @@ -33,8 +32,7 @@ int connection_edge_finished_connecting(edge_connection_t *conn); void connection_ap_about_to_close(entry_connection_t *edge_conn); void connection_exit_about_to_close(edge_connection_t *edge_conn); -MOCK_DECL(int, - connection_ap_handshake_send_begin,(entry_connection_t *ap_conn)); +int connection_ap_handshake_send_begin(entry_connection_t *ap_conn); int connection_ap_handshake_send_resolve(entry_connection_t *ap_conn); entry_connection_t *connection_ap_make_link(connection_t *partner, @@ -46,39 +44,21 @@ entry_connection_t *connection_ap_make_link(connection_t *partner, void connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, size_t replylen, int endreason); -MOCK_DECL(void,connection_ap_handshake_socks_resolved, - (entry_connection_t *conn, - int answer_type, - size_t answer_len, - const uint8_t *answer, - int ttl, - time_t expires)); -void connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn, - const tor_addr_t *answer, - int ttl, - time_t expires); +void connection_ap_handshake_socks_resolved(entry_connection_t *conn, + int answer_type, + size_t answer_len, + const uint8_t *answer, + int ttl, + time_t expires); int connection_exit_begin_conn(cell_t *cell, circuit_t *circ); int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ); void connection_exit_connect(edge_connection_t *conn); -int connection_edge_is_rendezvous_stream(const edge_connection_t *conn); +int connection_edge_is_rendezvous_stream(edge_connection_t *conn); int connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit); void connection_ap_expire_beginning(void); -void connection_ap_rescan_and_attach_pending(void); -void connection_ap_attach_pending(int retry); -void connection_ap_mark_as_pending_circuit_(entry_connection_t *entry_conn, - const char *file, int line); -#define connection_ap_mark_as_pending_circuit(c) \ - connection_ap_mark_as_pending_circuit_((c), __FILE__, __LINE__) -void connection_ap_mark_as_non_pending_circuit(entry_connection_t *entry_conn); -#define CONNECTION_AP_EXPECT_NONPENDING(c) do { \ - if (ENTRY_TO_CONN(c)->state == AP_CONN_STATE_CIRCUIT_WAIT) { \ - log_warn(LD_BUG, "At %s:%d: %p was unexpectedly in circuit_wait.", \ - __FILE__, __LINE__, (c)); \ - connection_ap_mark_as_non_pending_circuit(c); \ - } \ - } while (0) +void connection_ap_attach_pending(void); void connection_ap_fail_onehop(const char *failed_digest, cpath_build_state_t *build_state); void circuit_discard_optional_exit_enclaves(extend_info_t *info); @@ -89,18 +69,16 @@ int connection_ap_process_transparent(entry_connection_t *conn); int address_is_invalid_destination(const char *address, int client); -MOCK_DECL(int, connection_ap_rewrite_and_attach_if_allowed, - (entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath)); +int connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath); int connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, origin_circuit_t *circ, crypt_path_t *cpath); /** Possible return values for parse_extended_hostname. */ typedef enum hostname_type_t { - NORMAL_HOSTNAME, ONION_V2_HOSTNAME, ONION_V3_HOSTNAME, - EXIT_HOSTNAME, BAD_HOSTNAME + NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME } hostname_type_t; hostname_type_t parse_extended_hostname(char *address); @@ -116,12 +94,6 @@ int connection_edge_update_circuit_isolation(const entry_connection_t *conn, void circuit_clear_isolation(origin_circuit_t *circ); streamid_t get_unique_stream_id_by_circ(origin_circuit_t *circ); -void connection_edge_free_all(void); - -void connection_ap_warn_and_unmark_if_pending_circ( - entry_connection_t *entry_conn, - const char *where); - /** @name Begin-cell flags * * These flags are used in RELAY_BEGIN cells to change the default behavior @@ -165,33 +137,7 @@ STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell, STATIC int connected_cell_format_payload(uint8_t *payload_out, const tor_addr_t *addr, uint32_t ttl); +#endif -typedef struct { - /** Original address, after we lowercased it but before we started - * mapping it. - */ - char orig_address[MAX_SOCKS_ADDR_LEN]; - /** True iff the address has been automatically remapped to a local - * address in VirtualAddrNetwork. (Only set true when we do a resolve - * and get a virtual address; not when we connect to the address.) */ - int automap; - /** If this connection has a .exit address, who put it there? */ - addressmap_entry_source_t exit_source; - /** If we've rewritten the address, when does this map expire? */ - time_t map_expires; - /** If we should close the connection, this is the end_reason to pass - * to connection_mark_unattached_ap */ - int end_reason; - /** True iff we should close the connection, either because of error or - * because of successful early RESOLVED reply. */ - int should_close; -} rewrite_result_t; - -STATIC void connection_ap_handshake_rewrite(entry_connection_t *conn, - rewrite_result_t *out); - -STATIC int connection_ap_process_http_connect(entry_connection_t *conn); -#endif /* defined(CONNECTION_EDGE_PRIVATE) */ - -#endif /* !defined(TOR_CONNECTION_EDGE_H) */ +#endif diff --git a/src/tor/src/or/connection_or.c b/src/tor/connection_or.c similarity index 65% rename from src/tor/src/or/connection_or.c rename to src/tor/connection_or.c index a87776149..b89f7bfca 100644 --- a/src/tor/src/or/connection_or.c +++ b/src/tor/connection_or.c @@ -1,27 +1,15 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file connection_or.c * \brief Functions to handle OR connections, TLS handshaking, and * cells on the network. - * - * An or_connection_t is a subtype of connection_t (as implemented in - * connection.c) that uses a TLS connection to send and receive cells on the - * Tor network. (By sending and receiving cells connection_or.c, it cooperates - * with channeltls.c to implement a the channel interface of channel.c.) - * - * Every OR connection has an underlying tortls_t object (as implemented in - * tortls.c) which it uses as its TLS stream. It is responsible for - * sending and receiving cells over that TLS. - * - * This module also implements the client side of the v3 Tor link handshake, **/ #include "or.h" -#include "bridges.h" #include "buffers.h" /* * Define this so we get channel internal functions, since we're implementing @@ -41,22 +29,18 @@ #include "dirserv.h" #include "entrynodes.h" #include "geoip.h" -#include "main.h" -#include "link_handshake.h" -#include "microdesc.h" +#include "onion_main.h" #include "networkstatus.h" #include "nodelist.h" -#include "proto_cell.h" #include "reasons.h" #include "relay.h" #include "rephist.h" #include "router.h" -#include "routerkeys.h" #include "routerlist.h" #include "ext_orport.h" -#include "scheduler.h" -#include "torcert.h" -#include "channelpadding.h" +#ifdef USE_BUFFEREVENTS +#include +#endif static int connection_tls_finish_handshake(or_connection_t *conn); static int connection_or_launch_v3_or_handshake(or_connection_t *conn); @@ -78,25 +62,62 @@ static void connection_or_mark_bad_for_new_circs(or_connection_t *or_conn); static void connection_or_change_state(or_connection_t *conn, uint8_t state); -static void connection_or_check_canonicity(or_connection_t *conn, - int started_here); +#ifdef USE_BUFFEREVENTS +static void connection_or_handle_event_cb(struct bufferevent *bufev, + short event, void *arg); +#include /*XXXX REMOVE */ +#endif /**************************************************************/ +/** Map from identity digest of connected OR or desired OR to a connection_t + * with that identity digest. If there is more than one such connection_t, + * they form a linked list, with next_with_same_id as the next pointer. */ +static digestmap_t *orconn_identity_map = NULL; + /** Global map between Extended ORPort identifiers and OR * connections. */ static digestmap_t *orconn_ext_or_id_map = NULL; -/** Clear clear conn->identity_digest and update other data - * structures as appropriate.*/ +/** If conn is listed in orconn_identity_map, remove it, and clear + * conn->identity_digest. Otherwise do nothing. */ void -connection_or_clear_identity(or_connection_t *conn) +connection_or_remove_from_identity_map(or_connection_t *conn) { + or_connection_t *tmp; tor_assert(conn); + if (!orconn_identity_map) + return; + tmp = digestmap_get(orconn_identity_map, conn->identity_digest); + if (!tmp) { + if (!tor_digest_is_zero(conn->identity_digest)) { + log_warn(LD_BUG, "Didn't find connection '%s' on identity map when " + "trying to remove it.", + conn->nickname ? conn->nickname : "NULL"); + } + return; + } + if (conn == tmp) { + if (conn->next_with_same_id) + digestmap_set(orconn_identity_map, conn->identity_digest, + conn->next_with_same_id); + else + digestmap_remove(orconn_identity_map, conn->identity_digest); + } else { + while (tmp->next_with_same_id) { + if (tmp->next_with_same_id == conn) { + tmp->next_with_same_id = conn->next_with_same_id; + break; + } + tmp = tmp->next_with_same_id; + } + } memset(conn->identity_digest, 0, DIGEST_LEN); + conn->next_with_same_id = NULL; } -/** Clear all identities in OR conns.*/ +/** Remove all entries from the identity-to-orconn map, and clear + * all identities in OR conns.*/ void connection_or_clear_identity_map(void) { @@ -104,72 +125,57 @@ connection_or_clear_identity_map(void) SMARTLIST_FOREACH(conns, connection_t *, conn, { if (conn->type == CONN_TYPE_OR) { - connection_or_clear_identity(TO_OR_CONN(conn)); + or_connection_t *or_conn = TO_OR_CONN(conn); + memset(or_conn->identity_digest, 0, DIGEST_LEN); + or_conn->next_with_same_id = NULL; } }); + + digestmap_free(orconn_identity_map, NULL); + orconn_identity_map = NULL; } /** Change conn->identity_digest to digest, and add conn into - * the appropriate digest maps. - * - * NOTE that this function only allows two kinds of transitions: from - * unset identity to set identity, and from idempotent re-settings - * of the same identity. It's not allowed to clear an identity or to - * change an identity. Return 0 on success, and -1 if the transition - * is not allowed. - **/ + * orconn_digest_map. */ static void -connection_or_set_identity_digest(or_connection_t *conn, - const char *rsa_digest, - const ed25519_public_key_t *ed_id) +connection_or_set_identity_digest(or_connection_t *conn, const char *digest) { - channel_t *chan = NULL; + or_connection_t *tmp; tor_assert(conn); - tor_assert(rsa_digest); + tor_assert(digest); - if (conn->chan) - chan = TLS_CHAN_TO_BASE(conn->chan); - - log_info(LD_HANDSHAKE, "Set identity digest for %p (%s): %s %s.", - conn, - escaped_safe_str(conn->base_.address), - hex_str(rsa_digest, DIGEST_LEN), - ed25519_fmt(ed_id)); - log_info(LD_HANDSHAKE, " (Previously: %s %s)", - hex_str(conn->identity_digest, DIGEST_LEN), - chan ? ed25519_fmt(&chan->ed25519_identity) : ""); - - const int rsa_id_was_set = ! tor_digest_is_zero(conn->identity_digest); - const int ed_id_was_set = - chan && !ed25519_public_key_is_zero(&chan->ed25519_identity); - const int rsa_changed = - tor_memneq(conn->identity_digest, rsa_digest, DIGEST_LEN); - const int ed_changed = ed_id_was_set && - (!ed_id || !ed25519_pubkey_eq(ed_id, &chan->ed25519_identity)); - - tor_assert(!rsa_changed || !rsa_id_was_set); - tor_assert(!ed_changed || !ed_id_was_set); - - if (!rsa_changed && !ed_changed) + if (!orconn_identity_map) + orconn_identity_map = digestmap_new(); + if (tor_memeq(conn->identity_digest, digest, DIGEST_LEN)) return; /* If the identity was set previously, remove the old mapping. */ - if (rsa_id_was_set) { - connection_or_clear_identity(conn); - if (chan) - channel_clear_identity_digest(chan); + if (! tor_digest_is_zero(conn->identity_digest)) { + connection_or_remove_from_identity_map(conn); + if (conn->chan) + channel_clear_identity_digest(TLS_CHAN_TO_BASE(conn->chan)); } - memcpy(conn->identity_digest, rsa_digest, DIGEST_LEN); + memcpy(conn->identity_digest, digest, DIGEST_LEN); - /* If we're initializing the IDs to zero, don't add a mapping yet. */ - if (tor_digest_is_zero(rsa_digest) && - (!ed_id || ed25519_public_key_is_zero(ed_id))) + /* If we're setting the ID to zero, don't add a mapping. */ + if (tor_digest_is_zero(digest)) return; + tmp = digestmap_set(orconn_identity_map, digest, conn); + conn->next_with_same_id = tmp; + /* Deal with channels */ - if (chan) - channel_set_identity_digest(chan, rsa_digest, ed_id); + if (conn->chan) + channel_set_identity_digest(TLS_CHAN_TO_BASE(conn->chan), digest); + +#if 1 + /* Testing code to check for bugs in representation. */ + for (; tmp; tmp = tmp->next_with_same_id) { + tor_assert(tor_memeq(tmp->identity_digest, digest, DIGEST_LEN)); + tor_assert(tmp != conn); + } +#endif } /** Remove the Extended ORPort identifier of conn from the @@ -209,7 +215,7 @@ connection_or_clear_ext_or_id_map(void) orconn_ext_or_id_map = NULL; } -/** Creates an Extended ORPort identifier for conn and deposits +/** Creates an Extended ORPort identifier for conn and deposits * it into the global list of identifiers. */ void connection_or_set_ext_or_identifier(or_connection_t *conn) @@ -394,8 +400,8 @@ connection_or_change_state(or_connection_t *conn, uint8_t state) * be an or_connection_t field, but it got moved to channel_t and we * shouldn't maintain two copies. */ -MOCK_IMPL(int, -connection_or_get_num_circuits, (or_connection_t *conn)) +int +connection_or_get_num_circuits(or_connection_t *conn) { tor_assert(conn); @@ -421,11 +427,9 @@ cell_pack(packed_cell_t *dst, const cell_t *src, int wide_circ_ids) set_uint32(dest, htonl(src->circ_id)); dest += 4; } else { - /* Clear the last two bytes of dest, in case we can accidentally - * send them to the network somehow. */ - memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2); set_uint16(dest, htons(src->circ_id)); dest += 2; + memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2); /*make sure it's clear */ } set_uint8(dest, src->command); memcpy(dest+1, src->payload, CELL_PAYLOAD_SIZE); @@ -473,7 +477,7 @@ var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids) var_cell_t * var_cell_new(uint16_t payload_len) { - size_t size = offsetof(var_cell_t, payload) + payload_len; + size_t size = STRUCT_OFFSET(var_cell_t, payload) + payload_len; var_cell_t *cell = tor_malloc_zero(size); cell->payload_len = payload_len; cell->command = 0; @@ -481,31 +485,9 @@ var_cell_new(uint16_t payload_len) return cell; } -/** - * Copy a var_cell_t - */ - -var_cell_t * -var_cell_copy(const var_cell_t *src) -{ - var_cell_t *copy = NULL; - size_t size = 0; - - if (src != NULL) { - size = offsetof(var_cell_t, payload) + src->payload_len; - copy = tor_malloc_zero(size); - copy->payload_len = src->payload_len; - copy->command = src->command; - copy->circ_id = src->circ_id; - memcpy(copy->payload, src->payload, copy->payload_len); - } - - return copy; -} - /** Release all space held by cell. */ void -var_cell_free_(var_cell_t *cell) +var_cell_free(var_cell_t *cell) { tor_free(cell); } @@ -557,6 +539,13 @@ connection_or_process_inbuf(or_connection_t *conn) return ret; case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: +#ifdef USE_BUFFEREVENTS + if (tor_tls_server_got_renegotiate(conn->tls)) + connection_or_tls_renegotiated_cb(conn->tls, conn); + if (conn->base_.marked_for_close) + return 0; + /* fall through. */ +#endif case OR_CONN_STATE_OPEN: case OR_CONN_STATE_OR_HANDSHAKING_V2: case OR_CONN_STATE_OR_HANDSHAKING_V3: @@ -569,7 +558,7 @@ connection_or_process_inbuf(or_connection_t *conn) * check would otherwise just let data accumulate. It serves no purpose * in 0.2.3. * - * XXXX Remove this check once we verify that the above paragraph is + * XXX024 Remove this check once we verify that the above paragraph is * 100% true. */ if (buf_datalen(conn->base_.inbuf) > MAX_OR_INBUF_WHEN_NONOPEN) { log_fn(LOG_PROTOCOL_WARN, LD_NET, "Accumulated too much data (%d bytes) " @@ -585,48 +574,48 @@ connection_or_process_inbuf(or_connection_t *conn) return ret; } +/** When adding cells to an OR connection's outbuf, keep adding until the + * outbuf is at least this long, or we run out of cells. */ +#define OR_CONN_HIGHWATER (32*1024) + +/** Add cells to an OR connection's outbuf whenever the outbuf's data length + * drops below this size. */ +#define OR_CONN_LOWWATER (16*1024) + /** Called whenever we have flushed some data on an or_conn: add more data * from active circuits. */ int connection_or_flushed_some(or_connection_t *conn) { - size_t datalen; + size_t datalen, temp; + ssize_t n, flushed; + size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); /* If we're under the low water mark, add cells until we're just over the * high water mark. */ datalen = connection_get_outbuf_len(TO_CONN(conn)); if (datalen < OR_CONN_LOWWATER) { - /* Let the scheduler know */ - scheduler_channel_wants_writes(TLS_CHAN_TO_BASE(conn->chan)); + while ((conn->chan) && channel_tls_more_to_flush(conn->chan)) { + /* Compute how many more cells we want at most */ + n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size); + /* Bail out if we don't want any more */ + if (n <= 0) break; + /* We're still here; try to flush some more cells */ + flushed = channel_tls_flush_some_cells(conn->chan, n); + /* Bail out if it says it didn't flush anything */ + if (flushed <= 0) break; + /* How much in the outbuf now? */ + temp = connection_get_outbuf_len(TO_CONN(conn)); + /* Bail out if we didn't actually increase the outbuf size */ + if (temp <= datalen) break; + /* Update datalen for the next iteration */ + datalen = temp; + } } return 0; } -/** This is for channeltls.c to ask how many cells we could accept if - * they were available. */ -ssize_t -connection_or_num_cells_writeable(or_connection_t *conn) -{ - size_t datalen, cell_network_size; - ssize_t n = 0; - - tor_assert(conn); - - /* - * If we're under the high water mark, we're potentially - * writeable; note this is different from the calculation above - * used to trigger when to start writing after we've stopped. - */ - datalen = connection_get_outbuf_len(TO_CONN(conn)); - if (datalen < OR_CONN_HIGHWATER) { - cell_network_size = get_cell_network_size(conn->wide_circ_ids); - n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size); - } - - return n; -} - /** Connection conn has finished writing and has no bytes left on * its outbuf. * @@ -717,16 +706,15 @@ connection_or_about_to_close(or_connection_t *or_conn) const or_options_t *options = get_options(); connection_or_note_state_when_broken(or_conn); rep_hist_note_connect_failed(or_conn->identity_digest, now); - /* Tell the new guard API about the channel failure */ - entry_guard_chan_failed(TLS_CHAN_TO_BASE(or_conn->chan)); + entry_guard_register_connect_status(or_conn->identity_digest,0, + !options->HTTPSProxy, now); if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) { int reason = tls_error_to_orconn_end_reason(or_conn->tls_error); control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, reason); if (!authdir_mode_tests_reachability(options)) - control_event_bootstrap_prob_or( - orconn_end_reason_to_control_string(reason), - reason, or_conn); + control_event_bootstrap_problem( + orconn_end_reason_to_control_string(reason), reason); } } } else if (conn->hold_open_until_flushed) { @@ -789,6 +777,27 @@ connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, conn->bandwidthrate = rate; conn->bandwidthburst = burst; +#ifdef USE_BUFFEREVENTS + { + const struct timeval *tick = tor_libevent_get_one_tick_timeout(); + struct ev_token_bucket_cfg *cfg, *old_cfg; + int64_t rate64 = (((int64_t)rate) * options->TokenBucketRefillInterval) + / 1000; + /* This can't overflow, since TokenBucketRefillInterval <= 1000, + * and rate started out less than INT_MAX. */ + int rate_per_tick = (int) rate64; + + cfg = ev_token_bucket_cfg_new(rate_per_tick, burst, rate_per_tick, + burst, tick); + old_cfg = conn->bucket_cfg; + if (conn->base_.bufev) + tor_set_bufferevent_rate_limit(conn->base_.bufev, cfg); + if (old_cfg) + ev_token_bucket_cfg_free(old_cfg); + conn->bucket_cfg = cfg; + (void) reset; /* No way to do this with libevent yet. */ + } +#else if (reset) { /* set up the token buckets to be full */ conn->read_bucket = conn->write_bucket = burst; return; @@ -799,6 +808,7 @@ connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, conn->read_bucket = burst; if (conn->write_bucket > burst) conn->write_bucket = burst; +#endif } /** Either our set of relays or our per-conn rate limits have changed. @@ -815,31 +825,6 @@ connection_or_update_token_buckets(smartlist_t *conns, }); } -/* Mark or_conn as canonical if is_canonical is set, and - * non-canonical otherwise. Adjust idle_timeout accordingly. - */ -void -connection_or_set_canonical(or_connection_t *or_conn, - int is_canonical) -{ - if (bool_eq(is_canonical, or_conn->is_canonical) && - or_conn->idle_timeout != 0) { - /* Don't recalculate an existing idle_timeout unless the canonical - * status changed. */ - return; - } - - or_conn->is_canonical = !! is_canonical; /* force to a 1-bit boolean */ - or_conn->idle_timeout = channelpadding_get_channel_idle_timeout( - TLS_CHAN_TO_BASE(or_conn->chan), is_canonical); - - log_info(LD_CIRC, - "Channel " U64_FORMAT " chose an idle timeout of %d.", - or_conn->chan ? - U64_PRINTF_ARG(TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier):0, - or_conn->idle_timeout); -} - /** If we don't necessarily know the router we're connecting to, but we * have an addr/port/id_digest, then fill in as much as we can. Start * by checking to see if this describes a router we know. @@ -849,54 +834,22 @@ void connection_or_init_conn_from_address(or_connection_t *conn, const tor_addr_t *addr, uint16_t port, const char *id_digest, - const ed25519_public_key_t *ed_id, int started_here) { - log_debug(LD_HANDSHAKE, "init conn from address %s: %s, %s (%d)", - fmt_addr(addr), - hex_str((const char*)id_digest, DIGEST_LEN), - ed25519_fmt(ed_id), - started_here); - - connection_or_set_identity_digest(conn, id_digest, ed_id); + const node_t *r = node_get_by_id(id_digest); + connection_or_set_identity_digest(conn, id_digest); connection_or_update_token_buckets_helper(conn, 1, get_options()); conn->base_.port = port; tor_addr_copy(&conn->base_.addr, addr); tor_addr_copy(&conn->real_addr, addr); - - connection_or_check_canonicity(conn, started_here); -} - -/** Check whether the identity of conn matches a known node. If it - * does, check whether the address of conn matches the expected address, and - * update the connection's is_canonical flag, nickname, and address fields as - * appropriate. */ -static void -connection_or_check_canonicity(or_connection_t *conn, int started_here) -{ - const char *id_digest = conn->identity_digest; - const ed25519_public_key_t *ed_id = NULL; - const tor_addr_t *addr = &conn->real_addr; - if (conn->chan) - ed_id = & TLS_CHAN_TO_BASE(conn->chan)->ed25519_identity; - - const node_t *r = node_get_by_id(id_digest); - if (r && - node_supports_ed25519_link_authentication(r, 1) && - ! node_ed25519_id_matches(r, ed_id)) { - /* If this node is capable of proving an ed25519 ID, - * we can't call this a canonical connection unless both IDs match. */ - r = NULL; - } - if (r) { tor_addr_port_t node_ap; node_get_pref_orport(r, &node_ap); /* XXXX proposal 186 is making this more complex. For now, a conn is canonical when it uses the _preferred_ address. */ if (tor_addr_eq(&conn->base_.addr, &node_ap.addr)) - connection_or_set_canonical(conn, 1); + conn->is_canonical = 1; if (!started_here) { /* Override the addr/port, so our log messages will make sense. * This is dangerous, since if we ever try looking up a conn by @@ -911,28 +864,24 @@ connection_or_check_canonicity(or_connection_t *conn, int started_here) tor_addr_copy(&conn->base_.addr, &node_ap.addr); conn->base_.port = node_ap.port; } - tor_free(conn->nickname); conn->nickname = tor_strdup(node_get_nickname(r)); tor_free(conn->base_.address); - conn->base_.address = tor_addr_to_str_dup(&node_ap.addr); + conn->base_.address = tor_dup_addr(&node_ap.addr); } else { - tor_free(conn->nickname); - conn->nickname = tor_malloc(HEX_DIGEST_LEN+2); - conn->nickname[0] = '$'; - base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1, - conn->identity_digest, DIGEST_LEN); - + const char *n; + /* If we're an authoritative directory server, we may know a + * nickname for this router. */ + n = dirserv_get_nickname_by_digest(id_digest); + if (n) { + conn->nickname = tor_strdup(n); + } else { + conn->nickname = tor_malloc(HEX_DIGEST_LEN+2); + conn->nickname[0] = '$'; + base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1, + conn->identity_digest, DIGEST_LEN); + } tor_free(conn->base_.address); - conn->base_.address = tor_addr_to_str_dup(addr); - } - - /* - * We have to tell channeltls.c to update the channel marks (local, in - * particular), since we may have changed the address. - */ - - if (conn->chan) { - channel_tls_update_marks(conn); + conn->base_.address = tor_dup_addr(addr); } } @@ -962,37 +911,7 @@ connection_or_mark_bad_for_new_circs(or_connection_t *or_conn) * too old for new circuits? */ #define TIME_BEFORE_OR_CONN_IS_TOO_OLD (60*60*24*7) -/** Expire an or_connection if it is too old. Helper for - * connection_or_group_set_badness_ and fast path for - * channel_rsa_id_group_set_badness. - * - * Returns 1 if the connection was already expired, else 0. - */ -int -connection_or_single_set_badness_(time_t now, - or_connection_t *or_conn, - int force) -{ - /* XXXX this function should also be about channels? */ - if (or_conn->base_.marked_for_close || - connection_or_is_bad_for_new_circs(or_conn)) - return 1; - - if (force || - or_conn->base_.timestamp_created + TIME_BEFORE_OR_CONN_IS_TOO_OLD - < now) { - log_info(LD_OR, - "Marking OR conn to %s:%d as too old for new circuits " - "(fd "TOR_SOCKET_T_FORMAT", %d secs old).", - or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, - (int)(now - or_conn->base_.timestamp_created)); - connection_or_mark_bad_for_new_circs(or_conn); - } - - return 0; -} - -/** Given a list of all the or_connections with a given +/** Given the head of the linked list for all the or_connections with a given * identity, set elements of that list as is_bad_for_new_circs as * appropriate. Helper for connection_or_set_bad_connections(). * @@ -1009,21 +928,29 @@ connection_or_single_set_badness_(time_t now, * See channel_is_better() in channel.c for our idea of what makes one OR * connection better than another. */ -void -connection_or_group_set_badness_(smartlist_t *group, int force) +static void +connection_or_group_set_badness(or_connection_t *head, int force) { - /* XXXX this function should be entirely about channels, not OR - * XXXX connections. */ - - or_connection_t *best = NULL; + or_connection_t *or_conn = NULL, *best = NULL; int n_old = 0, n_inprogress = 0, n_canonical = 0, n_other = 0; time_t now = time(NULL); /* Pass 1: expire everything that's old, and see what the status of * everything else is. */ - SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) { - if (connection_or_single_set_badness_(now, or_conn, force)) + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { + if (or_conn->base_.marked_for_close || + connection_or_is_bad_for_new_circs(or_conn)) continue; + if (force || + or_conn->base_.timestamp_created + TIME_BEFORE_OR_CONN_IS_TOO_OLD + < now) { + log_info(LD_OR, + "Marking OR conn to %s:%d as too old for new circuits " + "(fd "TOR_SOCKET_T_FORMAT", %d secs old).", + or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, + (int)(now - or_conn->base_.timestamp_created)); + connection_or_mark_bad_for_new_circs(or_conn); + } if (connection_or_is_bad_for_new_circs(or_conn)) { ++n_old; @@ -1034,11 +961,11 @@ connection_or_group_set_badness_(smartlist_t *group, int force) } else { ++n_other; } - } SMARTLIST_FOREACH_END(or_conn); + } /* Pass 2: We know how about how good the best connection is. * expire everything that's worse, and find the very best if we can. */ - SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) { + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { if (or_conn->base_.marked_for_close || connection_or_is_bad_for_new_circs(or_conn)) continue; /* This one doesn't need to be marked bad. */ @@ -1059,11 +986,13 @@ connection_or_group_set_badness_(smartlist_t *group, int force) } if (!best || - channel_is_better(TLS_CHAN_TO_BASE(or_conn->chan), - TLS_CHAN_TO_BASE(best->chan))) { + channel_is_better(now, + TLS_CHAN_TO_BASE(or_conn->chan), + TLS_CHAN_TO_BASE(best->chan), + 0)) { best = or_conn; } - } SMARTLIST_FOREACH_END(or_conn); + } if (!best) return; @@ -1082,15 +1011,17 @@ connection_or_group_set_badness_(smartlist_t *group, int force) * 0.1.2.x dies out, the first case will go away, and the second one is * "mostly harmless", so a fix can wait until somebody is bored. */ - SMARTLIST_FOREACH_BEGIN(group, or_connection_t *, or_conn) { + for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { if (or_conn->base_.marked_for_close || connection_or_is_bad_for_new_circs(or_conn) || or_conn->base_.state != OR_CONN_STATE_OPEN) continue; if (or_conn != best && - channel_is_better(TLS_CHAN_TO_BASE(best->chan), - TLS_CHAN_TO_BASE(or_conn->chan))) { - /* This isn't the best conn, _and_ the best conn is better than it */ + channel_is_better(now, + TLS_CHAN_TO_BASE(best->chan), + TLS_CHAN_TO_BASE(or_conn->chan), 1)) { + /* This isn't the best conn, _and_ the best conn is better than it, + even when we're being forgiving. */ if (best->is_canonical) { log_info(LD_OR, "Marking OR conn to %s:%d as unsuitable for new circuits: " @@ -1114,7 +1045,24 @@ connection_or_group_set_badness_(smartlist_t *group, int force) connection_or_mark_bad_for_new_circs(or_conn); } } - } SMARTLIST_FOREACH_END(or_conn); + } +} + +/** Go through all the OR connections (or if digest is non-NULL, just + * the OR connections with that digest), and set the is_bad_for_new_circs + * flag based on the rules in connection_or_group_set_badness() (or just + * always set it if force is true). + */ +void +connection_or_set_bad_connections(const char *digest, int force) +{ + if (!orconn_identity_map) + return; + + DIGESTMAP_FOREACH(orconn_identity_map, identity, or_connection_t *, conn) { + if (!digest || tor_memeq(digest, conn->identity_digest, DIGEST_LEN)) + connection_or_group_set_badness(conn, force); + } DIGESTMAP_FOREACH_END; } /** conn is in the 'connecting' state, and it failed to complete @@ -1129,7 +1077,7 @@ connection_or_connect_failed(or_connection_t *conn, { control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, reason); if (!authdir_mode_tests_reachability(get_options())) - control_event_bootstrap_prob_or(msg, reason, conn); + control_event_bootstrap_problem(msg, reason); } /** conn got an error in connection_handle_read_impl() or @@ -1154,7 +1102,9 @@ connection_or_notify_error(or_connection_t *conn, if (conn->chan) { chan = TLS_CHAN_TO_BASE(conn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!CHANNEL_CONDEMNED(chan)) { + if (!(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR)) { channel_close_for_error(chan); } } @@ -1177,12 +1127,10 @@ connection_or_notify_error(or_connection_t *conn, * * Return the launched conn, or NULL if it failed. */ - -MOCK_IMPL(or_connection_t *, -connection_or_connect, (const tor_addr_t *_addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id, - channel_tls_t *chan)) +or_connection_t * +connection_or_connect(const tor_addr_t *_addr, uint16_t port, + const char *id_digest, + channel_tls_t *chan) { or_connection_t *conn; const or_options_t *options = get_options(); @@ -1202,11 +1150,6 @@ connection_or_connect, (const tor_addr_t *_addr, uint16_t port, log_info(LD_PROTOCOL,"Client asked me to connect to myself. Refusing."); return NULL; } - if (server_mode(options) && router_ed25519_id_is_me(ed_id)) { - log_info(LD_PROTOCOL,"Client asked me to connect to myself by Ed25519 " - "identity. Refusing."); - return NULL; - } conn = or_connection_new(CONN_TYPE_OR, tor_addr_family(&addr)); @@ -1219,7 +1162,7 @@ connection_or_connect, (const tor_addr_t *_addr, uint16_t port, */ conn->chan = chan; chan->conn = conn; - connection_or_init_conn_from_address(conn, &addr, port, id_digest, ed_id, 1); + connection_or_init_conn_from_address(conn, &addr, port, id_digest, 1); connection_or_change_state(conn, OR_CONN_STATE_CONNECTING); control_event_or_conn_status(conn, OR_CONN_EVENT_LAUNCHED, 0); @@ -1251,32 +1194,28 @@ connection_or_connect, (const tor_addr_t *_addr, uint16_t port, "your pluggable transport proxy stopped running.", fmt_addrport(&TO_CONN(conn)->addr, TO_CONN(conn)->port), transport_name, transport_name); - - control_event_bootstrap_prob_or( - "Can't connect to bridge", - END_OR_CONN_REASON_PT_MISSING, - conn); - } else { log_warn(LD_GENERAL, "Tried to connect to '%s' through a proxy, but " "the proxy address could not be found.", fmt_addrport(&TO_CONN(conn)->addr, TO_CONN(conn)->port)); } - connection_free_(TO_CONN(conn)); + connection_free(TO_CONN(conn)); return NULL; } switch (connection_connect(TO_CONN(conn), conn->base_.address, &addr, port, &socket_error)) { case -1: - /* We failed to establish a connection probably because of a local - * error. No need to blame the guard in this case. Notify the networking - * system of this failure. */ + /* If the connection failed immediately, and we're using + * a proxy, our proxy is down. Don't blame the Tor server. */ + if (conn->base_.proxy_state == PROXY_INFANT) + entry_guard_register_connect_status(conn->identity_digest, + 0, 1, time(NULL)); connection_or_connect_failed(conn, errno_to_orconn_end_reason(socket_error), tor_socket_strerror(socket_error)); - connection_free_(TO_CONN(conn)); + connection_free(TO_CONN(conn)); return NULL; case 0: connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); @@ -1318,7 +1257,9 @@ connection_or_close_normally(or_connection_t *orconn, int flush) if (orconn->chan) { chan = TLS_CHAN_TO_BASE(orconn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!CHANNEL_CONDEMNED(chan)) { + if (!(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR)) { channel_close_from_lower_layer(chan); } } @@ -1328,8 +1269,8 @@ connection_or_close_normally(or_connection_t *orconn, int flush) * the error state. */ -MOCK_IMPL(void, -connection_or_close_for_error,(or_connection_t *orconn, int flush)) +void +connection_or_close_for_error(or_connection_t *orconn, int flush) { channel_t *chan = NULL; @@ -1339,7 +1280,9 @@ connection_or_close_for_error,(or_connection_t *orconn, int flush)) if (orconn->chan) { chan = TLS_CHAN_TO_BASE(orconn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!CHANNEL_CONDEMNED(chan)) { + if (!(chan->state == CHANNEL_STATE_CLOSING || + chan->state == CHANNEL_STATE_CLOSED || + chan->state == CHANNEL_STATE_ERROR)) { channel_close_for_error(chan); } } @@ -1383,13 +1326,40 @@ connection_tls_start_handshake,(or_connection_t *conn, int receiving)) tor_tls_set_logged_address(conn->tls, // XXX client and relay? escaped_safe_str(conn->base_.address)); +#ifdef USE_BUFFEREVENTS + if (connection_type_uses_bufferevent(TO_CONN(conn))) { + const int filtering = get_options()->UseFilteringSSLBufferevents; + struct bufferevent *b = + tor_tls_init_bufferevent(conn->tls, conn->base_.bufev, conn->base_.s, + receiving, filtering); + if (!b) { + log_warn(LD_BUG,"tor_tls_init_bufferevent failed. Closing."); + return -1; + } + conn->base_.bufev = b; + if (conn->bucket_cfg) + tor_set_bufferevent_rate_limit(conn->base_.bufev, conn->bucket_cfg); + connection_enable_rate_limiting(TO_CONN(conn)); + + connection_configure_bufferevent_callbacks(TO_CONN(conn)); + bufferevent_setcb(b, + connection_handle_read_cb, + connection_handle_write_cb, + connection_or_handle_event_cb,/* overriding this one*/ + TO_CONN(conn)); + } +#endif connection_start_reading(TO_CONN(conn)); log_debug(LD_HANDSHAKE,"starting TLS handshake on fd "TOR_SOCKET_T_FORMAT, conn->base_.s); + note_crypto_pk_op(receiving ? TLS_HANDSHAKE_S : TLS_HANDSHAKE_C); - if (connection_tls_continue_handshake(conn) < 0) - return -1; - + IF_HAS_BUFFEREVENT(TO_CONN(conn), { + /* ???? */; + }) ELSE_IF_NO_BUFFEREVENT { + if (connection_tls_continue_handshake(conn) < 0) + return -1; + } return 0; } @@ -1432,12 +1402,17 @@ connection_tls_continue_handshake(or_connection_t *conn) { int result; check_no_tls_errors(); - - tor_assert(conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING); - // log_notice(LD_OR, "Continue handshake with %p", conn->tls); - result = tor_tls_handshake(conn->tls); - // log_notice(LD_OR, "Result: %d", result); - + again: + if (conn->base_.state == OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING) { + // log_notice(LD_OR, "Renegotiate with %p", conn->tls); + result = tor_tls_renegotiate(conn->tls); + // log_notice(LD_OR, "Result: %d", result); + } else { + tor_assert(conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING); + // log_notice(LD_OR, "Continue handshake with %p", conn->tls); + result = tor_tls_handshake(conn->tls); + // log_notice(LD_OR, "Result: %d", result); + } switch (result) { CASE_TOR_TLS_ERROR_ANY: log_info(LD_OR,"tls error [%s]. breaking connection.", @@ -1446,10 +1421,23 @@ connection_tls_continue_handshake(or_connection_t *conn) case TOR_TLS_DONE: if (! tor_tls_used_v1_handshake(conn->tls)) { if (!tor_tls_is_server(conn->tls)) { - tor_assert(conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING); - return connection_or_launch_v3_or_handshake(conn); + if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { + if (tor_tls_received_v3_certificate(conn->tls)) { + log_info(LD_OR, "Client got a v3 cert! Moving on to v3 " + "handshake with ciphersuite %s", + tor_tls_get_ciphersuite_name(conn->tls)); + return connection_or_launch_v3_or_handshake(conn); + } else { + log_debug(LD_OR, "Done with initial SSL handshake (client-side)." + " Requesting renegotiation."); + connection_or_change_state(conn, + OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING); + goto again; + } + } + // log_notice(LD_OR,"Done. state was %d.", conn->base_.state); } else { - /* v2/v3 handshake, but we are not a client. */ + /* v2/v3 handshake, but not a client. */ log_debug(LD_OR, "Done with initial SSL handshake (server-side). " "Expecting renegotiation or VERSIONS cell"); tor_tls_set_renegotiate_callback(conn->tls, @@ -1462,7 +1450,6 @@ connection_tls_continue_handshake(or_connection_t *conn) return 0; } } - tor_assert(tor_tls_is_server(conn->tls)); return connection_tls_finish_handshake(conn); case TOR_TLS_WANTWRITE: connection_start_writing(TO_CONN(conn)); @@ -1478,6 +1465,89 @@ connection_tls_continue_handshake(or_connection_t *conn) return 0; } +#ifdef USE_BUFFEREVENTS +static void +connection_or_handle_event_cb(struct bufferevent *bufev, short event, + void *arg) +{ + struct or_connection_t *conn = TO_OR_CONN(arg); + + /* XXXX cut-and-paste code; should become a function. */ + if (event & BEV_EVENT_CONNECTED) { + if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { + if (tor_tls_finish_handshake(conn->tls) < 0) { + log_warn(LD_OR, "Problem finishing handshake"); + connection_or_close_for_error(conn, 0); + return; + } + } + + if (! tor_tls_used_v1_handshake(conn->tls)) { + if (!tor_tls_is_server(conn->tls)) { + if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { + if (tor_tls_received_v3_certificate(conn->tls)) { + log_info(LD_OR, "Client got a v3 cert!"); + if (connection_or_launch_v3_or_handshake(conn) < 0) + connection_or_close_for_error(conn, 0); + return; + } else { + connection_or_change_state(conn, + OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING); + tor_tls_unblock_renegotiation(conn->tls); + if (bufferevent_ssl_renegotiate(conn->base_.bufev)<0) { + log_warn(LD_OR, "Start_renegotiating went badly."); + connection_or_close_for_error(conn, 0); + } + tor_tls_unblock_renegotiation(conn->tls); + return; /* ???? */ + } + } + } else { + const int handshakes = tor_tls_get_num_server_handshakes(conn->tls); + + if (handshakes == 1) { + /* v2 or v3 handshake, as a server. Only got one handshake, so + * wait for the next one. */ + tor_tls_set_renegotiate_callback(conn->tls, + connection_or_tls_renegotiated_cb, + conn); + connection_or_change_state(conn, + OR_CONN_STATE_TLS_SERVER_RENEGOTIATING); + } else if (handshakes == 2) { + /* v2 handshake, as a server. Two handshakes happened already, + * so we treat renegotiation as done. + */ + connection_or_tls_renegotiated_cb(conn->tls, conn); + } else if (handshakes > 2) { + log_warn(LD_OR, "More than two handshakes done on connection. " + "Closing."); + connection_or_close_for_error(conn, 0); + } else { + log_warn(LD_BUG, "We were unexpectedly told that a connection " + "got %d handshakes. Closing.", handshakes); + connection_or_close_for_error(conn, 0); + } + return; + } + } + connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); + if (connection_tls_finish_handshake(conn) < 0) + connection_or_close_for_error(conn, 0); /* ???? */ + return; + } + + if (event & BEV_EVENT_ERROR) { + unsigned long err; + while ((err = bufferevent_get_openssl_error(bufev))) { + tor_tls_log_one_error(conn->tls, err, LOG_WARN, LD_OR, + "handshaking (with bufferevent)"); + } + } + + connection_handle_event_cb(bufev, event, arg); +} +#endif + /** Return 1 if we initiated this connection, or 0 if it started * out as an incoming connection. */ @@ -1494,11 +1564,11 @@ connection_or_nonopen_was_started_here(or_connection_t *conn) } /** Conn just completed its handshake. Return 0 if all is well, and - * return -1 if they are lying, broken, or otherwise something is wrong. + * return -1 if he is lying, broken, or otherwise something is wrong. * * If we initiated this connection (started_here is true), make sure * the other side sent a correctly formed certificate. If I initiated the - * connection, make sure it's the right relay by checking the certificate. + * connection, make sure it's the right guy. * * Otherwise (if we _didn't_ initiate this connection), it's okay for * the certificate to be weird or absent. @@ -1514,7 +1584,7 @@ connection_or_nonopen_was_started_here(or_connection_t *conn) * 1) Set conn->circ_id_type according to tor-spec.txt. * 2) If we're an authdirserver and we initiated the connection: drop all * descriptors that claim to be on that IP/port but that aren't - * this relay; and note that this relay is reachable. + * this guy; and note that this guy is reachable. * 3) If this is a bridge and we didn't configure its identity * fingerprint, remember the keyid we just learned. */ @@ -1565,10 +1635,7 @@ connection_or_check_valid_tls_handshake(or_connection_t *conn, } if (identity_rcvd) { - if (crypto_pk_get_digest(identity_rcvd, digest_rcvd_out) < 0) { - crypto_pk_free(identity_rcvd); - return -1; - } + crypto_pk_get_digest(identity_rcvd, digest_rcvd_out); } else { memset(digest_rcvd_out, 0, DIGEST_LEN); } @@ -1578,38 +1645,23 @@ connection_or_check_valid_tls_handshake(or_connection_t *conn, crypto_pk_free(identity_rcvd); - if (started_here) { - /* A TLS handshake can't teach us an Ed25519 ID, so we set it to NULL - * here. */ - log_debug(LD_HANDSHAKE, "Calling client_learned_peer_id from " - "check_valid_tls_handshake"); + if (started_here) return connection_or_client_learned_peer_id(conn, - (const uint8_t*)digest_rcvd_out, - NULL); - } + (const uint8_t*)digest_rcvd_out); return 0; } /** Called when we (as a connection initiator) have definitively, * authenticatedly, learned that ID of the Tor instance on the other - * side of conn is rsa_peer_id and optionally ed_peer_id. - * For v1 and v2 handshakes, + * side of conn is peer_id. For v1 and v2 handshakes, * this is right after we get a certificate chain in a TLS handshake - * or renegotiation. For v3+ handshakes, this is right after we get a + * or renegotiation. For v3 handshakes, this is right after we get a * certificate chain in a CERTS cell. * - * If we did not know the ID before, record the one we got. + * If we want any particular ID before, record the one we got. * - * If we wanted an ID, but we didn't get the one we expected, log a message - * and return -1. - * On relays: - * - log a protocol warning whenever the fingerprints don't match; - * On clients: - * - if a relay's fingerprint doesn't match, log a warning; - * - if we don't have updated relay fingerprints from a recent consensus, and - * a fallback directory mirror's hard-coded fingerprint has changed, log an - * info explaining that we will try another fallback. + * If we wanted an ID, but we didn't get it, log a warning and return -1. * * If we're testing reachability, remember what we learned. * @@ -1617,31 +1669,13 @@ connection_or_check_valid_tls_handshake(or_connection_t *conn, */ int connection_or_client_learned_peer_id(or_connection_t *conn, - const uint8_t *rsa_peer_id, - const ed25519_public_key_t *ed_peer_id) + const uint8_t *peer_id) { const or_options_t *options = get_options(); - channel_tls_t *chan_tls = conn->chan; - channel_t *chan = channel_tls_to_base(chan_tls); - int changed_identity = 0; - tor_assert(chan); - - const int expected_rsa_key = - ! tor_digest_is_zero(conn->identity_digest); - const int expected_ed_key = - ! ed25519_public_key_is_zero(&chan->ed25519_identity); - - log_info(LD_HANDSHAKE, "learned peer id for %p (%s): %s, %s", - conn, - safe_str_client(conn->base_.address), - hex_str((const char*)rsa_peer_id, DIGEST_LEN), - ed25519_fmt(ed_peer_id)); - - if (! expected_rsa_key && ! expected_ed_key) { - log_info(LD_HANDSHAKE, "(we had no ID in mind when we made this " - "connection."); - connection_or_set_identity_digest(conn, - (const char*)rsa_peer_id, ed_peer_id); + int severity = server_mode(options) ? LOG_PROTOCOL_WARN : LOG_WARN; + + if (tor_digest_is_zero(conn->identity_digest)) { + connection_or_set_identity_digest(conn, (const char*)peer_id); tor_free(conn->nickname); conn->nickname = tor_malloc(HEX_DIGEST_LEN+2); conn->nickname[0] = '$'; @@ -1653,115 +1687,40 @@ connection_or_client_learned_peer_id(or_connection_t *conn, /* if it's a bridge and we didn't know its identity fingerprint, now * we do -- remember it for future attempts. */ learned_router_identity(&conn->base_.addr, conn->base_.port, - (const char*)rsa_peer_id, ed_peer_id); - changed_identity = 1; + (const char*)peer_id); } - const int rsa_mismatch = expected_rsa_key && - tor_memneq(rsa_peer_id, conn->identity_digest, DIGEST_LEN); - /* It only counts as an ed25519 mismatch if we wanted an ed25519 identity - * and didn't get it. It's okay if we get one that we didn't ask for. */ - const int ed25519_mismatch = - expected_ed_key && - (ed_peer_id == NULL || - ! ed25519_pubkey_eq(&chan->ed25519_identity, ed_peer_id)); - - if (rsa_mismatch || ed25519_mismatch) { + if (tor_memneq(peer_id, conn->identity_digest, DIGEST_LEN)) { /* I was aiming for a particular digest. I didn't get it! */ - char seen_rsa[HEX_DIGEST_LEN+1]; - char expected_rsa[HEX_DIGEST_LEN+1]; - char seen_ed[ED25519_BASE64_LEN+1]; - char expected_ed[ED25519_BASE64_LEN+1]; - base16_encode(seen_rsa, sizeof(seen_rsa), - (const char*)rsa_peer_id, DIGEST_LEN); - base16_encode(expected_rsa, sizeof(expected_rsa), conn->identity_digest, + char seen[HEX_DIGEST_LEN+1]; + char expected[HEX_DIGEST_LEN+1]; + base16_encode(seen, sizeof(seen), (const char*)peer_id, DIGEST_LEN); + base16_encode(expected, sizeof(expected), conn->identity_digest, DIGEST_LEN); - if (ed_peer_id) { - ed25519_public_to_base64(seen_ed, ed_peer_id); - } else { - strlcpy(seen_ed, "no ed25519 key", sizeof(seen_ed)); - } - if (! ed25519_public_key_is_zero(&chan->ed25519_identity)) { - ed25519_public_to_base64(expected_ed, &chan->ed25519_identity); - } else { - strlcpy(expected_ed, "no ed25519 key", sizeof(expected_ed)); - } - const int using_hardcoded_fingerprints = - !networkstatus_get_reasonably_live_consensus(time(NULL), - usable_consensus_flavor()); - const int is_fallback_fingerprint = router_digest_is_fallback_dir( - conn->identity_digest); - const int is_authority_fingerprint = router_digest_is_trusted_dir( - conn->identity_digest); - int severity; - const char *extra_log = ""; - - if (server_mode(options)) { - severity = LOG_PROTOCOL_WARN; - } else { - if (using_hardcoded_fingerprints) { - /* We need to do the checks in this order, because the list of - * fallbacks includes the list of authorities */ - if (is_authority_fingerprint) { - severity = LOG_WARN; - } else if (is_fallback_fingerprint) { - /* we expect a small number of fallbacks to change from their - * hard-coded fingerprints over the life of a release */ - severity = LOG_INFO; - extra_log = " Tor will try a different fallback."; - } else { - /* it's a bridge, it's either a misconfiguration, or unexpected */ - severity = LOG_WARN; - } - } else { - /* a relay has changed its fingerprint from the one in the consensus */ - severity = LOG_WARN; - } - } - log_fn(severity, LD_HANDSHAKE, - "Tried connecting to router at %s:%d, but RSA identity key was not " - "as expected: wanted %s + %s but got %s + %s.%s", - conn->base_.address, conn->base_.port, - expected_rsa, expected_ed, seen_rsa, seen_ed, extra_log); - - /* Tell the new guard API about the channel failure */ - entry_guard_chan_failed(TLS_CHAN_TO_BASE(conn->chan)); + "Tried connecting to router at %s:%d, but identity key was not " + "as expected: wanted %s but got %s.", + conn->base_.address, conn->base_.port, expected, seen); + entry_guard_register_connect_status(conn->identity_digest, 0, 1, + time(NULL)); control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, END_OR_CONN_REASON_OR_IDENTITY); if (!authdir_mode_tests_reachability(options)) - control_event_bootstrap_prob_or( + control_event_bootstrap_problem( "Unexpected identity in router certificate", - END_OR_CONN_REASON_OR_IDENTITY, - conn); + END_OR_CONN_REASON_OR_IDENTITY); return -1; } - - if (!expected_ed_key && ed_peer_id) { - log_info(LD_HANDSHAKE, "(we had no Ed25519 ID in mind when we made this " - "connection."); - connection_or_set_identity_digest(conn, - (const char*)rsa_peer_id, ed_peer_id); - changed_identity = 1; - } - - if (changed_identity) { - /* If we learned an identity for this connection, then we might have - * just discovered it to be canonical. */ - connection_or_check_canonicity(conn, conn->handshake_state->started_here); - } - if (authdir_mode_tests_reachability(options)) { dirserv_orconn_tls_done(&conn->base_.addr, conn->base_.port, - (const char*)rsa_peer_id, ed_peer_id); + (const char*)peer_id); } return 0; } -/** Return when we last used this channel for client activity (origin - * circuits). This is called from connection.c, since client_used is now one - * of the timestamps in channel_t */ +/** Return when a client used this, for connection.c, since client_used + * is now one of the timestamps of channel_t */ time_t connection_or_client_used(or_connection_t *conn) @@ -1775,9 +1734,9 @@ connection_or_client_used(or_connection_t *conn) /** The v1/v2 TLS handshake is finished. * - * Make sure we are happy with the peer we just handshaked with. + * Make sure we are happy with the person we just handshaked with. * - * If they initiated the connection, make sure they're not already connected, + * If he initiated the connection, make sure he's not already connected, * then initialize conn from the information in router. * * If all is successful, call circuit_n_conn_done() to handle events @@ -1792,8 +1751,6 @@ connection_tls_finish_handshake(or_connection_t *conn) char digest_rcvd[DIGEST_LEN]; int started_here = connection_or_nonopen_was_started_here(conn); - tor_assert(!started_here); - log_debug(LD_HANDSHAKE,"%s tls handshake on %p with %s done, using " "ciphersuite %s. verifying.", started_here?"outgoing":"incoming", @@ -1801,6 +1758,8 @@ connection_tls_finish_handshake(or_connection_t *conn) safe_str_client(conn->base_.address), tor_tls_get_ciphersuite_name(conn->tls)); + directory_set_dirty(); + if (connection_or_check_valid_tls_handshake(conn, started_here, digest_rcvd) < 0) return -1; @@ -1809,19 +1768,20 @@ connection_tls_finish_handshake(or_connection_t *conn) if (tor_tls_used_v1_handshake(conn->tls)) { conn->link_proto = 1; - connection_or_init_conn_from_address(conn, &conn->base_.addr, - conn->base_.port, digest_rcvd, - NULL, 0); + if (!started_here) { + connection_or_init_conn_from_address(conn, &conn->base_.addr, + conn->base_.port, digest_rcvd, 0); + } tor_tls_block_renegotiation(conn->tls); - rep_hist_note_negotiated_link_proto(1, started_here); return connection_or_set_state_open(conn); } else { connection_or_change_state(conn, OR_CONN_STATE_OR_HANDSHAKING_V2); if (connection_init_or_handshake_state(conn, started_here) < 0) return -1; - connection_or_init_conn_from_address(conn, &conn->base_.addr, - conn->base_.port, digest_rcvd, - NULL, 0); + if (!started_here) { + connection_or_init_conn_from_address(conn, &conn->base_.addr, + conn->base_.port, digest_rcvd, 0); + } return connection_or_send_versions(conn, 0); } } @@ -1836,6 +1796,7 @@ static int connection_or_launch_v3_or_handshake(or_connection_t *conn) { tor_assert(connection_or_nonopen_was_started_here(conn)); + tor_assert(tor_tls_received_v3_certificate(conn->tls)); circuit_build_times_network_is_live(get_circuit_build_times_mutable()); @@ -1860,24 +1821,19 @@ connection_init_or_handshake_state(or_connection_t *conn, int started_here) s->started_here = started_here ? 1 : 0; s->digest_sent_data = 1; s->digest_received_data = 1; - if (! started_here && get_current_link_cert_cert()) { - s->own_link_cert = tor_cert_dup(get_current_link_cert_cert()); - } - s->certs = or_handshake_certs_new(); - s->certs->started_here = s->started_here; return 0; } /** Free all storage held by state. */ void -or_handshake_state_free_(or_handshake_state_t *state) +or_handshake_state_free(or_handshake_state_t *state) { if (!state) return; crypto_digest_free(state->digest_sent); crypto_digest_free(state->digest_received); - or_handshake_certs_free(state->certs); - tor_cert_free(state->own_link_cert); + tor_cert_free(state->auth_cert); + tor_cert_free(state->id_cert); memwipe(state, 0xBE, sizeof(or_handshake_state_t)); tor_free(state); } @@ -1972,7 +1928,11 @@ connection_or_set_state_open(or_connection_t *conn) or_handshake_state_free(conn->handshake_state); conn->handshake_state = NULL; - connection_start_reading(TO_CONN(conn)); + IF_HAS_BUFFEREVENT(TO_CONN(conn), { + connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); + }) ELSE_IF_NO_BUFFEREVENT { + connection_start_reading(TO_CONN(conn)); + } return 0; } @@ -1992,45 +1952,39 @@ connection_or_write_cell_to_buf(const cell_t *cell, or_connection_t *conn) cell_pack(&networkcell, cell, conn->wide_circ_ids); - rep_hist_padding_count_write(PADDING_TYPE_TOTAL); - if (cell->command == CELL_PADDING) - rep_hist_padding_count_write(PADDING_TYPE_CELL); - - connection_buf_add(networkcell.body, cell_network_size, TO_CONN(conn)); + connection_write_to_buf(networkcell.body, cell_network_size, TO_CONN(conn)); /* Touch the channel's active timestamp if there is one */ - if (conn->chan) { + if (conn->chan) channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); - if (TLS_CHAN_TO_BASE(conn->chan)->currently_padding) { - rep_hist_padding_count_write(PADDING_TYPE_ENABLED_TOTAL); - if (cell->command == CELL_PADDING) - rep_hist_padding_count_write(PADDING_TYPE_ENABLED_CELL); - } - } - if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) or_handshake_state_record_cell(conn, conn->handshake_state, cell, 0); + + if (cell->command != CELL_PADDING) + conn->timestamp_last_added_nonpadding = approx_time(); } /** Pack a variable-length cell into wire-format, and write it onto * conn's outbuf. Right now, this DOES NOT support cells that * affect a circuit. */ -MOCK_IMPL(void, -connection_or_write_var_cell_to_buf,(const var_cell_t *cell, - or_connection_t *conn)) +void +connection_or_write_var_cell_to_buf(const var_cell_t *cell, + or_connection_t *conn) { int n; char hdr[VAR_CELL_MAX_HEADER_SIZE]; tor_assert(cell); tor_assert(conn); n = var_cell_pack_header(cell, hdr, conn->wide_circ_ids); - connection_buf_add(hdr, n, TO_CONN(conn)); - connection_buf_add((char*)cell->payload, + connection_write_to_buf(hdr, n, TO_CONN(conn)); + connection_write_to_buf((char*)cell->payload, cell->payload_len, TO_CONN(conn)); if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) or_handshake_state_record_var_cell(conn, conn->handshake_state, cell, 0); + if (cell->command != CELL_PADDING) + conn->timestamp_last_added_nonpadding = approx_time(); /* Touch the channel's active timestamp if there is one */ if (conn->chan) @@ -2043,7 +1997,12 @@ static int connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out) { connection_t *conn = TO_CONN(or_conn); - return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_var_cell_from_evbuffer(input, out, or_conn->link_proto); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); + } } /** Process cells from conn's inbuf. @@ -2058,19 +2017,6 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn) { var_cell_t *var_cell; - /* - * Note on memory management for incoming cells: below the channel layer, - * we shouldn't need to consider its internal queueing/copying logic. It - * is safe to pass cells to it on the stack or on the heap, but in the - * latter case we must be sure we free them later. - * - * The incoming cell queue code in channel.c will (in the common case) - * decide it can pass them to the upper layer immediately, in which case - * those functions may run directly on the cell pointers we pass here, or - * it may decide to queue them, in which case it will allocate its own - * buffer and copy the cell. - */ - while (1) { log_debug(LD_OR, TOR_SOCKET_T_FORMAT": starting, inbuf_datalen %d " @@ -2102,7 +2048,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn) channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - connection_buf_get_bytes(buf, cell_network_size, TO_CONN(conn)); + connection_fetch_from_buf(buf, cell_network_size, TO_CONN(conn)); /* retrieve cell info from buf (create the host-order struct from the * network-order string) */ @@ -2114,7 +2060,7 @@ connection_or_process_cells_from_inbuf(or_connection_t *conn) } /** Array of recognized link protocol versions. */ -static const uint16_t or_protocol_versions[] = { 1, 2, 3, 4, 5 }; +static const uint16_t or_protocol_versions[] = { 1, 2, 3, 4 }; /** Number of versions in or_protocol_versions. */ static const int n_or_protocol_versions = (int)( sizeof(or_protocol_versions)/sizeof(uint16_t) ); @@ -2170,8 +2116,8 @@ connection_or_send_versions(or_connection_t *conn, int v3_plus) /** Send a NETINFO cell on conn, telling the other server what we know * about their address, our address, and the current time. */ -MOCK_IMPL(int, -connection_or_send_netinfo,(or_connection_t *conn)) +int +connection_or_send_netinfo(or_connection_t *conn) { cell_t cell; time_t now = time(NULL); @@ -2235,236 +2181,90 @@ connection_or_send_netinfo,(or_connection_t *conn)) return 0; } -/** Helper used to add an encoded certs to a cert cell */ -static void -add_certs_cell_cert_helper(certs_cell_t *certs_cell, - uint8_t cert_type, - const uint8_t *cert_encoded, - size_t cert_len) -{ - tor_assert(cert_len <= UINT16_MAX); - certs_cell_cert_t *ccc = certs_cell_cert_new(); - ccc->cert_type = cert_type; - ccc->cert_len = cert_len; - certs_cell_cert_setlen_body(ccc, cert_len); - memcpy(certs_cell_cert_getarray_body(ccc), cert_encoded, cert_len); - - certs_cell_add_certs(certs_cell, ccc); -} - -/** Add an encoded X509 cert (stored as cert_len bytes at - * cert_encoded) to the trunnel certs_cell_t object that we are - * building in certs_cell. Set its type field to cert_type. - * (If cert is NULL, take no action.) */ -static void -add_x509_cert(certs_cell_t *certs_cell, - uint8_t cert_type, - const tor_x509_cert_t *cert) -{ - if (NULL == cert) - return; - - const uint8_t *cert_encoded = NULL; - size_t cert_len; - tor_x509_cert_get_der(cert, &cert_encoded, &cert_len); - - add_certs_cell_cert_helper(certs_cell, cert_type, cert_encoded, cert_len); -} - -/** Add an Ed25519 cert from cert to the trunnel certs_cell_t object - * that we are building in certs_cell. Set its type field to - * cert_type. (If cert is NULL, take no action.) */ -static void -add_ed25519_cert(certs_cell_t *certs_cell, - uint8_t cert_type, - const tor_cert_t *cert) -{ - if (NULL == cert) - return; - - add_certs_cell_cert_helper(certs_cell, cert_type, - cert->encoded, cert->encoded_len); -} - -#ifdef TOR_UNIT_TESTS -int certs_cell_ed25519_disabled_for_testing = 0; -#else -#define certs_cell_ed25519_disabled_for_testing 0 -#endif - /** Send a CERTS cell on the connection conn. Return 0 on success, -1 * on failure. */ int connection_or_send_certs_cell(or_connection_t *conn) { - const tor_x509_cert_t *global_link_cert = NULL, *id_cert = NULL; - tor_x509_cert_t *own_link_cert = NULL; + const tor_cert_t *link_cert = NULL, *id_cert = NULL; + const uint8_t *link_encoded = NULL, *id_encoded = NULL; + size_t link_len, id_len; var_cell_t *cell; - - certs_cell_t *certs_cell = NULL; + size_t cell_len; + ssize_t pos; + int server_mode; tor_assert(conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3); if (! conn->handshake_state) return -1; - - const int conn_in_server_mode = ! conn->handshake_state->started_here; - - /* Get the encoded values of the X509 certificates */ - if (tor_tls_get_my_certs(conn_in_server_mode, - &global_link_cert, &id_cert) < 0) + server_mode = ! conn->handshake_state->started_here; + if (tor_tls_get_my_certs(server_mode, &link_cert, &id_cert) < 0) return -1; + tor_cert_get_der(link_cert, &link_encoded, &link_len); + tor_cert_get_der(id_cert, &id_encoded, &id_len); - if (conn_in_server_mode) { - own_link_cert = tor_tls_get_own_cert(conn->tls); - } - tor_assert(id_cert); - - certs_cell = certs_cell_new(); - - /* Start adding certs. First the link cert or auth1024 cert. */ - if (conn_in_server_mode) { - tor_assert_nonfatal(own_link_cert); - add_x509_cert(certs_cell, - OR_CERT_TYPE_TLS_LINK, own_link_cert); - } else { - tor_assert(global_link_cert); - add_x509_cert(certs_cell, - OR_CERT_TYPE_AUTH_1024, global_link_cert); - } - - /* Next the RSA->RSA ID cert */ - add_x509_cert(certs_cell, - OR_CERT_TYPE_ID_1024, id_cert); - - /* Next the Ed25519 certs */ - add_ed25519_cert(certs_cell, - CERTTYPE_ED_ID_SIGN, - get_master_signing_key_cert()); - if (conn_in_server_mode) { - tor_assert_nonfatal(conn->handshake_state->own_link_cert || - certs_cell_ed25519_disabled_for_testing); - add_ed25519_cert(certs_cell, - CERTTYPE_ED_SIGN_LINK, - conn->handshake_state->own_link_cert); - } else { - add_ed25519_cert(certs_cell, - CERTTYPE_ED_SIGN_AUTH, - get_current_auth_key_cert()); - } + cell_len = 1 /* 1 byte: num certs in cell */ + + 2 * ( 1 + 2 ) /* For each cert: 1 byte for type, 2 for length */ + + link_len + id_len; + cell = var_cell_new(cell_len); + cell->command = CELL_CERTS; + cell->payload[0] = 2; + pos = 1; - /* And finally the crosscert. */ - { - const uint8_t *crosscert=NULL; - size_t crosscert_len; - get_master_rsa_crosscert(&crosscert, &crosscert_len); - if (crosscert) { - add_certs_cell_cert_helper(certs_cell, - CERTTYPE_RSA1024_ID_EDID, - crosscert, crosscert_len); - } - } + if (server_mode) + cell->payload[pos] = OR_CERT_TYPE_TLS_LINK; /* Link cert */ + else + cell->payload[pos] = OR_CERT_TYPE_AUTH_1024; /* client authentication */ + set_uint16(&cell->payload[pos+1], htons(link_len)); + memcpy(&cell->payload[pos+3], link_encoded, link_len); + pos += 3 + link_len; - /* We've added all the certs; make the cell. */ - certs_cell->n_certs = certs_cell_getlen_certs(certs_cell); + cell->payload[pos] = OR_CERT_TYPE_ID_1024; /* ID cert */ + set_uint16(&cell->payload[pos+1], htons(id_len)); + memcpy(&cell->payload[pos+3], id_encoded, id_len); + pos += 3 + id_len; - ssize_t alloc_len = certs_cell_encoded_len(certs_cell); - tor_assert(alloc_len >= 0 && alloc_len <= UINT16_MAX); - cell = var_cell_new(alloc_len); - cell->command = CELL_CERTS; - ssize_t enc_len = certs_cell_encode(cell->payload, alloc_len, certs_cell); - tor_assert(enc_len > 0 && enc_len <= alloc_len); - cell->payload_len = enc_len; + tor_assert(pos == (int)cell_len); /* Otherwise we just smashed the heap */ connection_or_write_var_cell_to_buf(cell, conn); var_cell_free(cell); - certs_cell_free(certs_cell); - tor_x509_cert_free(own_link_cert); return 0; } -/** Return true iff challenge_type is an AUTHCHALLENGE type that - * we can send and receive. */ -int -authchallenge_type_is_supported(uint16_t challenge_type) -{ - switch (challenge_type) { - case AUTHTYPE_RSA_SHA256_TLSSECRET: - case AUTHTYPE_ED25519_SHA256_RFC5705: - return 1; - case AUTHTYPE_RSA_SHA256_RFC5705: - default: - return 0; - } -} - -/** Return true iff challenge_type_a is one that we would rather - * use than challenge_type_b. */ -int -authchallenge_type_is_better(uint16_t challenge_type_a, - uint16_t challenge_type_b) -{ - /* Any supported type is better than an unsupported one; - * all unsupported types are equally bad. */ - if (!authchallenge_type_is_supported(challenge_type_a)) - return 0; - if (!authchallenge_type_is_supported(challenge_type_b)) - return 1; - /* It happens that types are superior in numerically ascending order. - * If that ever changes, this must change too. */ - return (challenge_type_a > challenge_type_b); -} - /** Send an AUTH_CHALLENGE cell on the connection conn. Return 0 * on success, -1 on failure. */ int connection_or_send_auth_challenge_cell(or_connection_t *conn) { - var_cell_t *cell = NULL; - int r = -1; + var_cell_t *cell; + uint8_t *cp; + uint8_t challenge[OR_AUTH_CHALLENGE_LEN]; tor_assert(conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3); if (! conn->handshake_state) return -1; - auth_challenge_cell_t *ac = auth_challenge_cell_new(); - - tor_assert(sizeof(ac->challenge) == 32); - crypto_rand((char*)ac->challenge, sizeof(ac->challenge)); - - auth_challenge_cell_add_methods(ac, AUTHTYPE_RSA_SHA256_TLSSECRET); - /* Disabled, because everything that supports this method also supports - * the much-superior ED25519_SHA256_RFC5705 */ - /* auth_challenge_cell_add_methods(ac, AUTHTYPE_RSA_SHA256_RFC5705); */ - auth_challenge_cell_add_methods(ac, AUTHTYPE_ED25519_SHA256_RFC5705); - auth_challenge_cell_set_n_methods(ac, - auth_challenge_cell_getlen_methods(ac)); - - cell = var_cell_new(auth_challenge_cell_encoded_len(ac)); - ssize_t len = auth_challenge_cell_encode(cell->payload, cell->payload_len, - ac); - if (len != cell->payload_len) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Encoded auth challenge cell length not as expected"); - goto done; - /* LCOV_EXCL_STOP */ - } + if (crypto_rand((char*)challenge, OR_AUTH_CHALLENGE_LEN) < 0) + return -1; + cell = var_cell_new(OR_AUTH_CHALLENGE_LEN + 4); cell->command = CELL_AUTH_CHALLENGE; + memcpy(cell->payload, challenge, OR_AUTH_CHALLENGE_LEN); + cp = cell->payload + OR_AUTH_CHALLENGE_LEN; + set_uint16(cp, htons(1)); /* We recognize one authentication type. */ + set_uint16(cp+2, htons(AUTHTYPE_RSA_SHA256_TLSSECRET)); connection_or_write_var_cell_to_buf(cell, conn); - r = 0; - - done: var_cell_free(cell); - auth_challenge_cell_free(ac); + memwipe(challenge, 0, sizeof(challenge)); - return r; + return 0; } /** Compute the main body of an AUTHENTICATE cell that a client can use - * to authenticate itself on a v3 handshake for conn. Return it - * in a var_cell_t. + * to authenticate itself on a v3 handshake for conn. Write it to the + * outlen-byte buffer at out. * * If server is true, only calculate the first * V3_AUTH_FIXED_PART_LEN bytes -- the part of the authenticator that's @@ -2480,54 +2280,34 @@ connection_or_send_auth_challenge_cell(or_connection_t *conn) * * Return the length of the cell body on success, and -1 on failure. */ -var_cell_t * +int connection_or_compute_authenticate_cell_body(or_connection_t *conn, - const int authtype, + uint8_t *out, size_t outlen, crypto_pk_t *signing_key, - const ed25519_keypair_t *ed_signing_key, - int server) + int server) { - auth1_t *auth = NULL; - auth_ctx_t *ctx = auth_ctx_new(); - var_cell_t *result = NULL; - int old_tlssecrets_algorithm = 0; - const char *authtype_str = NULL; - - int is_ed = 0; + uint8_t *ptr; /* assert state is reasonable XXXX */ - switch (authtype) { - case AUTHTYPE_RSA_SHA256_TLSSECRET: - authtype_str = "AUTH0001"; - old_tlssecrets_algorithm = 1; - break; - case AUTHTYPE_RSA_SHA256_RFC5705: - authtype_str = "AUTH0002"; - break; - case AUTHTYPE_ED25519_SHA256_RFC5705: - authtype_str = "AUTH0003"; - is_ed = 1; - break; - default: - tor_assert(0); - break; - } - auth = auth1_new(); - ctx->is_ed = is_ed; + if (outlen < V3_AUTH_FIXED_PART_LEN || + (!server && outlen < V3_AUTH_BODY_LEN)) + return -1; + + ptr = out; /* Type: 8 bytes. */ - memcpy(auth1_getarray_type(auth), authtype_str, 8); + memcpy(ptr, "AUTH0001", 8); + ptr += 8; { - const tor_x509_cert_t *id_cert=NULL; - const common_digests_t *my_digests, *their_digests; + const tor_cert_t *id_cert=NULL, *link_cert=NULL; + const digests_t *my_digests, *their_digests; const uint8_t *my_id, *their_id, *client_id, *server_id; - if (tor_tls_get_my_certs(server, NULL, &id_cert)) - goto err; - my_digests = tor_x509_cert_get_id_digests(id_cert); - their_digests = - tor_x509_cert_get_id_digests(conn->handshake_state->certs->id_cert); + if (tor_tls_get_my_certs(server, &link_cert, &id_cert)) + return -1; + my_digests = tor_cert_get_id_digests(id_cert); + their_digests = tor_cert_get_id_digests(conn->handshake_state->id_cert); tor_assert(my_digests); tor_assert(their_digests); my_id = (uint8_t*)my_digests->d[DIGEST_SHA256]; @@ -2537,26 +2317,12 @@ connection_or_compute_authenticate_cell_body(or_connection_t *conn, server_id = server ? my_id : their_id; /* Client ID digest: 32 octets. */ - memcpy(auth->cid, client_id, 32); + memcpy(ptr, client_id, 32); + ptr += 32; /* Server ID digest: 32 octets. */ - memcpy(auth->sid, server_id, 32); - } - - if (is_ed) { - const ed25519_public_key_t *my_ed_id, *their_ed_id; - if (!conn->handshake_state->certs->ed_id_sign) { - log_warn(LD_OR, "Ed authenticate without Ed ID cert from peer."); - goto err; - } - my_ed_id = get_master_identity_key(); - their_ed_id = &conn->handshake_state->certs->ed_id_sign->signing_key; - - const uint8_t *cid_ed = (server ? their_ed_id : my_ed_id)->pubkey; - const uint8_t *sid_ed = (server ? my_ed_id : their_ed_id)->pubkey; - - memcpy(auth->u1_cid_ed, cid_ed, ED25519_PUBKEY_LEN); - memcpy(auth->u1_sid_ed, sid_ed, ED25519_PUBKEY_LEN); + memcpy(ptr, server_id, 32); + ptr += 32; } { @@ -2570,174 +2336,114 @@ connection_or_compute_authenticate_cell_body(or_connection_t *conn, } /* Server log digest : 32 octets */ - crypto_digest_get_digest(server_d, (char*)auth->slog, 32); + crypto_digest_get_digest(server_d, (char*)ptr, 32); + ptr += 32; /* Client log digest : 32 octets */ - crypto_digest_get_digest(client_d, (char*)auth->clog, 32); + crypto_digest_get_digest(client_d, (char*)ptr, 32); + ptr += 32; } { /* Digest of cert used on TLS link : 32 octets. */ - tor_x509_cert_t *cert = NULL; + const tor_cert_t *cert = NULL; + tor_cert_t *freecert = NULL; if (server) { - cert = tor_tls_get_own_cert(conn->tls); + tor_tls_get_my_certs(1, &cert, NULL); } else { - cert = tor_tls_get_peer_cert(conn->tls); - } - if (!cert) { - log_warn(LD_OR, "Unable to find cert when making %s data.", - authtype_str); - goto err; + freecert = tor_tls_get_peer_cert(conn->tls); + cert = freecert; } + if (!cert) + return -1; + memcpy(ptr, tor_cert_get_cert_digests(cert)->d[DIGEST_SHA256], 32); - memcpy(auth->scert, - tor_x509_cert_get_cert_digests(cert)->d[DIGEST_SHA256], 32); - - tor_x509_cert_free(cert); + if (freecert) + tor_cert_free(freecert); + ptr += 32; } /* HMAC of clientrandom and serverrandom using master key : 32 octets */ - if (old_tlssecrets_algorithm) { - tor_tls_get_tlssecrets(conn->tls, auth->tlssecrets); - } else { - char label[128]; - tor_snprintf(label, sizeof(label), - "EXPORTER FOR TOR TLS CLIENT BINDING %s", authtype_str); - tor_tls_export_key_material(conn->tls, auth->tlssecrets, - auth->cid, sizeof(auth->cid), - label); - } + tor_tls_get_tlssecrets(conn->tls, ptr); + ptr += 32; + + tor_assert(ptr - out == V3_AUTH_FIXED_PART_LEN); + + if (server) + return V3_AUTH_FIXED_PART_LEN; // ptr-out /* 8 octets were reserved for the current time, but we're trying to get out * of the habit of sending time around willynilly. Fortunately, nothing * checks it. That's followed by 16 bytes of nonce. */ - crypto_rand((char*)auth->rand, 24); - - ssize_t maxlen = auth1_encoded_len(auth, ctx); - if (ed_signing_key && is_ed) { - maxlen += ED25519_SIG_LEN; - } else if (signing_key && !is_ed) { - maxlen += crypto_pk_keysize(signing_key); - } + crypto_rand((char*)ptr, 24); + ptr += 24; - const int AUTH_CELL_HEADER_LEN = 4; /* 2 bytes of type, 2 bytes of length */ - result = var_cell_new(AUTH_CELL_HEADER_LEN + maxlen); - uint8_t *const out = result->payload + AUTH_CELL_HEADER_LEN; - const size_t outlen = maxlen; - ssize_t len; + tor_assert(ptr - out == V3_AUTH_BODY_LEN); - result->command = CELL_AUTHENTICATE; - set_uint16(result->payload, htons(authtype)); - - if ((len = auth1_encode(out, outlen, auth, ctx)) < 0) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Unable to encode signed part of AUTH1 data."); - goto err; - /* LCOV_EXCL_STOP */ - } - - if (server) { - auth1_t *tmp = NULL; - ssize_t len2 = auth1_parse(&tmp, out, len, ctx); - if (!tmp) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Unable to parse signed part of AUTH1 data that " - "we just encoded"); - goto err; - /* LCOV_EXCL_STOP */ - } - result->payload_len = (tmp->end_of_signed - result->payload); - - auth1_free(tmp); - if (len2 != len) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Mismatched length when re-parsing AUTH1 data."); - goto err; - /* LCOV_EXCL_STOP */ - } - goto done; - } - - if (ed_signing_key && is_ed) { - ed25519_signature_t sig; - if (ed25519_sign(&sig, out, len, ed_signing_key) < 0) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Unable to sign ed25519 authentication data"); - goto err; - /* LCOV_EXCL_STOP */ - } - auth1_setlen_sig(auth, ED25519_SIG_LEN); - memcpy(auth1_getarray_sig(auth), sig.sig, ED25519_SIG_LEN); - - } else if (signing_key && !is_ed) { - auth1_setlen_sig(auth, crypto_pk_keysize(signing_key)); + if (!signing_key) + return V3_AUTH_BODY_LEN; // ptr - out + { + int siglen; char d[32]; - crypto_digest256(d, (char*)out, len, DIGEST_SHA256); - int siglen = crypto_pk_private_sign(signing_key, - (char*)auth1_getarray_sig(auth), - auth1_getlen_sig(auth), + crypto_digest256(d, (char*)out, ptr-out, DIGEST_SHA256); + siglen = crypto_pk_private_sign(signing_key, + (char*)ptr, outlen - (ptr-out), d, 32); - if (siglen < 0) { - log_warn(LD_OR, "Unable to sign AUTH1 data."); - goto err; - } - - auth1_setlen_sig(auth, siglen); - } + if (siglen < 0) + return -1; - len = auth1_encode(out, outlen, auth, ctx); - if (len < 0) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Unable to encode signed AUTH1 data."); - goto err; - /* LCOV_EXCL_STOP */ + ptr += siglen; + tor_assert(ptr <= out+outlen); + return (int)(ptr - out); } - tor_assert(len + AUTH_CELL_HEADER_LEN <= result->payload_len); - result->payload_len = len + AUTH_CELL_HEADER_LEN; - set_uint16(result->payload+2, htons(len)); - - goto done; - - err: - var_cell_free(result); - result = NULL; - done: - auth1_free(auth); - auth_ctx_free(ctx); - return result; } /** Send an AUTHENTICATE cell on the connection conn. Return 0 on * success, -1 on failure */ -MOCK_IMPL(int, -connection_or_send_authenticate_cell,(or_connection_t *conn, int authtype)) +int +connection_or_send_authenticate_cell(or_connection_t *conn, int authtype) { var_cell_t *cell; crypto_pk_t *pk = tor_tls_get_my_client_auth_key(); + int authlen; + size_t cell_maxlen; /* XXXX make sure we're actually supposed to send this! */ if (!pk) { log_warn(LD_BUG, "Can't compute authenticate cell: no client auth key"); return -1; } - if (! authchallenge_type_is_supported(authtype)) { + if (authtype != AUTHTYPE_RSA_SHA256_TLSSECRET) { log_warn(LD_BUG, "Tried to send authenticate cell with unknown " "authentication type %d", authtype); return -1; } - cell = connection_or_compute_authenticate_cell_body(conn, - authtype, - pk, - get_current_auth_keypair(), - 0 /* not server */); - if (! cell) { - /* LCOV_EXCL_START */ + cell_maxlen = 4 + /* overhead */ + V3_AUTH_BODY_LEN + /* Authentication body */ + crypto_pk_keysize(pk) + /* Max signature length */ + 16 /* add a few extra bytes just in case. */; + + cell = var_cell_new(cell_maxlen); + cell->command = CELL_AUTHENTICATE; + set_uint16(cell->payload, htons(AUTHTYPE_RSA_SHA256_TLSSECRET)); + /* skip over length ; we don't know that yet. */ + + authlen = connection_or_compute_authenticate_cell_body(conn, + cell->payload+4, + cell_maxlen-4, + pk, + 0 /* not server */); + if (authlen < 0) { log_warn(LD_BUG, "Unable to compute authenticate cell!"); + var_cell_free(cell); return -1; - /* LCOV_EXCL_STOP */ } + tor_assert(authlen + 4 <= cell->payload_len); + set_uint16(cell->payload+2, htons(authlen)); + cell->payload_len = authlen + 4; + connection_or_write_var_cell_to_buf(cell, conn); var_cell_free(cell); diff --git a/src/tor/src/or/connection_or.h b/src/tor/connection_or.h similarity index 57% rename from src/tor/src/or/connection_or.h rename to src/tor/connection_or.h index 7c1dced63..8d9302893 100644 --- a/src/tor/src/or/connection_or.h +++ b/src/tor/connection_or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,18 +12,18 @@ #ifndef TOR_CONNECTION_OR_H #define TOR_CONNECTION_OR_H -void connection_or_clear_identity(or_connection_t *conn); +void connection_or_remove_from_identity_map(or_connection_t *conn); void connection_or_clear_identity_map(void); void clear_broken_connection_map(int disable); or_connection_t *connection_or_get_for_extend(const char *digest, const tor_addr_t *target_addr, const char **msg_out, int *launch_out); +void connection_or_set_bad_connections(const char *digest, int force); void connection_or_block_renegotiation(or_connection_t *conn); int connection_or_reached_eof(or_connection_t *conn); int connection_or_process_inbuf(or_connection_t *conn); -ssize_t connection_or_num_cells_writeable(or_connection_t *conn); int connection_or_flushed_some(or_connection_t *conn); int connection_or_finished_flushing(or_connection_t *conn); int connection_or_finished_connecting(or_connection_t *conn); @@ -36,41 +36,31 @@ void connection_or_connect_failed(or_connection_t *conn, int reason, const char *msg); void connection_or_notify_error(or_connection_t *conn, int reason, const char *msg); -MOCK_DECL(or_connection_t *, - connection_or_connect, - (const tor_addr_t *addr, uint16_t port, - const char *id_digest, - const ed25519_public_key_t *ed_id, - channel_tls_t *chan)); +or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port, + const char *id_digest, + channel_tls_t *chan); void connection_or_close_normally(or_connection_t *orconn, int flush); -MOCK_DECL(void,connection_or_close_for_error, - (or_connection_t *orconn, int flush)); +void connection_or_close_for_error(or_connection_t *orconn, int flush); void connection_or_report_broken_states(int severity, int domain); MOCK_DECL(int,connection_tls_start_handshake,(or_connection_t *conn, int receiving)); int connection_tls_continue_handshake(or_connection_t *conn); -void connection_or_set_canonical(or_connection_t *or_conn, - int is_canonical); int connection_init_or_handshake_state(or_connection_t *conn, int started_here); void connection_or_init_conn_from_address(or_connection_t *conn, const tor_addr_t *addr, uint16_t port, - const char *rsa_id_digest, - const ed25519_public_key_t *ed_id, + const char *id_digest, int started_here); int connection_or_client_learned_peer_id(or_connection_t *conn, - const uint8_t *rsa_peer_id, - const ed25519_public_key_t *ed_peer_id); + const uint8_t *peer_id); time_t connection_or_client_used(or_connection_t *conn); -MOCK_DECL(int, connection_or_get_num_circuits, (or_connection_t *conn)); -void or_handshake_state_free_(or_handshake_state_t *state); -#define or_handshake_state_free(state) \ - FREE_AND_NULL(or_handshake_state_t, or_handshake_state_free_, (state)) +int connection_or_get_num_circuits(or_connection_t *conn); +void or_handshake_state_free(or_handshake_state_t *state); void or_handshake_state_record_cell(or_connection_t *conn, or_handshake_state_t *state, const cell_t *cell, @@ -83,22 +73,17 @@ void or_handshake_state_record_var_cell(or_connection_t *conn, int connection_or_set_state_open(or_connection_t *conn); void connection_or_write_cell_to_buf(const cell_t *cell, or_connection_t *conn); -MOCK_DECL(void,connection_or_write_var_cell_to_buf,(const var_cell_t *cell, - or_connection_t *conn)); +void connection_or_write_var_cell_to_buf(const var_cell_t *cell, + or_connection_t *conn); int connection_or_send_versions(or_connection_t *conn, int v3_plus); -MOCK_DECL(int,connection_or_send_netinfo,(or_connection_t *conn)); +int connection_or_send_netinfo(or_connection_t *conn); int connection_or_send_certs_cell(or_connection_t *conn); int connection_or_send_auth_challenge_cell(or_connection_t *conn); -int authchallenge_type_is_supported(uint16_t challenge_type); -int authchallenge_type_is_better(uint16_t challenge_type_a, - uint16_t challenge_type_b); -var_cell_t *connection_or_compute_authenticate_cell_body(or_connection_t *conn, - const int authtype, - crypto_pk_t *signing_key, - const ed25519_keypair_t *ed_signing_key, - int server); -MOCK_DECL(int,connection_or_send_authenticate_cell, - (or_connection_t *conn, int type)); +int connection_or_compute_authenticate_cell_body(or_connection_t *conn, + uint8_t *out, size_t outlen, + crypto_pk_t *signing_key, + int server); +int connection_or_send_authenticate_cell(or_connection_t *conn, int type); int is_or_protocol_version_known(uint16_t version); @@ -106,23 +91,10 @@ void cell_pack(packed_cell_t *dest, const cell_t *src, int wide_circ_ids); int var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids); var_cell_t *var_cell_new(uint16_t payload_len); -var_cell_t *var_cell_copy(const var_cell_t *src); -void var_cell_free_(var_cell_t *cell); -#define var_cell_free(cell) FREE_AND_NULL(var_cell_t, var_cell_free_, (cell)) +void var_cell_free(var_cell_t *cell); -/* DOCDOC */ +/** DOCDOC */ #define MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS 4 -#define MIN_LINK_PROTO_FOR_CHANNEL_PADDING 5 -#define MAX_LINK_PROTO MIN_LINK_PROTO_FOR_CHANNEL_PADDING -int connection_or_single_set_badness_(time_t now, - or_connection_t *or_conn, - int force); -void connection_or_group_set_badness_(smartlist_t *group, int force); - -#ifdef TOR_UNIT_TESTS -extern int certs_cell_ed25519_disabled_for_testing; #endif -#endif /* !defined(TOR_CONNECTION_OR_H) */ - diff --git a/src/tor/src/common/container.c b/src/tor/container.c similarity index 58% rename from src/tor/src/common/container.c rename to src/tor/container.c index 54b0b2028..eee85919e 100644 --- a/src/tor/src/common/container.c +++ b/src/tor/container.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -11,8 +11,8 @@ * a digest-to-void* map. **/ -#include "compat.h" -#include "util.h" +#include "tor_compat.h" +#include "tor_util.h" #include "torlog.h" #include "container.h" #include "crypto.h" @@ -28,21 +28,21 @@ /** Allocate and return an empty smartlist. */ -MOCK_IMPL(smartlist_t *, -smartlist_new,(void)) +smartlist_t * +smartlist_new(void) { smartlist_t *sl = tor_malloc(sizeof(smartlist_t)); sl->num_used = 0; sl->capacity = SMARTLIST_DEFAULT_CAPACITY; - sl->list = tor_calloc(sizeof(void *), sl->capacity); + sl->list = tor_malloc(sizeof(void *) * sl->capacity); return sl; } /** Deallocate a smartlist. Does not release storage associated with the * list's elements. */ -MOCK_IMPL(void, -smartlist_free_,(smartlist_t *sl)) +void +smartlist_free(smartlist_t *sl) { if (!sl) return; @@ -55,50 +55,37 @@ smartlist_free_,(smartlist_t *sl)) void smartlist_clear(smartlist_t *sl) { - memset(sl->list, 0, sizeof(void *) * sl->num_used); sl->num_used = 0; } -#if SIZE_MAX < INT_MAX -#error "We don't support systems where size_t is smaller than int." -#endif - /** Make sure that sl can hold at least size entries. */ -static inline void -smartlist_ensure_capacity(smartlist_t *sl, size_t size) +static INLINE void +smartlist_ensure_capacity(smartlist_t *sl, int size) { - /* Set MAX_CAPACITY to MIN(INT_MAX, SIZE_MAX / sizeof(void*)) */ -#if (SIZE_MAX/SIZEOF_VOID_P) > INT_MAX +#if SIZEOF_SIZE_T > SIZEOF_INT #define MAX_CAPACITY (INT_MAX) #else #define MAX_CAPACITY (int)((SIZE_MAX / (sizeof(void*)))) #endif - - tor_assert(size <= MAX_CAPACITY); - - if (size > (size_t) sl->capacity) { - size_t higher = (size_t) sl->capacity; + if (size > sl->capacity) { + int higher = sl->capacity; if (PREDICT_UNLIKELY(size > MAX_CAPACITY/2)) { + tor_assert(size <= MAX_CAPACITY); higher = MAX_CAPACITY; } else { while (size > higher) higher *= 2; } - sl->list = tor_reallocarray(sl->list, sizeof(void *), - ((size_t)higher)); - memset(sl->list + sl->capacity, 0, - sizeof(void *) * (higher - sl->capacity)); - sl->capacity = (int) higher; + sl->capacity = higher; + sl->list = tor_realloc(sl->list, sizeof(void*)*((size_t)sl->capacity)); } -#undef ASSERT_CAPACITY -#undef MAX_CAPACITY } /** Append element to the end of the list. */ void smartlist_add(smartlist_t *sl, void *element) { - smartlist_ensure_capacity(sl, ((size_t) sl->num_used)+1); + smartlist_ensure_capacity(sl, sl->num_used+1); sl->list[sl->num_used++] = element; } @@ -106,12 +93,11 @@ smartlist_add(smartlist_t *sl, void *element) void smartlist_add_all(smartlist_t *s1, const smartlist_t *s2) { - size_t new_size = (size_t)s1->num_used + (size_t)s2->num_used; - tor_assert(new_size >= (size_t) s1->num_used); /* check for overflow. */ + int new_size = s1->num_used + s2->num_used; + tor_assert(new_size >= s1->num_used); /* check for overflow. */ smartlist_ensure_capacity(s1, new_size); memcpy(s1->list + s1->num_used, s2->list, s2->num_used*sizeof(void*)); - tor_assert(new_size <= INT_MAX); /* redundant. */ - s1->num_used = (int) new_size; + s1->num_used = new_size; } /** Remove all elements E from sl such that E==element. Preserve @@ -128,26 +114,7 @@ smartlist_remove(smartlist_t *sl, const void *element) if (sl->list[i] == element) { sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ i--; /* so we process the new i'th element */ - sl->list[sl->num_used] = NULL; - } -} - -/** As smartlist_remove, but do not change the order of - * any elements not removed */ -void -smartlist_remove_keeporder(smartlist_t *sl, const void *element) -{ - int i, j, num_used_orig = sl->num_used; - if (element == NULL) - return; - - for (i=j=0; j < num_used_orig; ++j) { - if (sl->list[j] == element) { - --sl->num_used; - } else { - sl->list[i++] = sl->list[j]; } - } } /** If sl is nonempty, remove and return the final element. Otherwise, @@ -156,11 +123,9 @@ void * smartlist_pop_last(smartlist_t *sl) { tor_assert(sl); - if (sl->num_used) { - void *tmp = sl->list[--sl->num_used]; - sl->list[sl->num_used] = NULL; - return tmp; - } else + if (sl->num_used) + return sl->list[--sl->num_used]; + else return NULL; } @@ -191,7 +156,6 @@ smartlist_string_remove(smartlist_t *sl, const char *element) tor_free(sl->list[i]); sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ i--; /* so we process the new i'th element */ - sl->list[sl->num_used] = NULL; } } } @@ -235,19 +199,6 @@ smartlist_string_pos(const smartlist_t *sl, const char *element) return -1; } -/** If element is the same pointer as an element of sl, return - * that element's index. Otherwise, return -1. */ -int -smartlist_pos(const smartlist_t *sl, const void *element) -{ - int i; - if (!sl) return -1; - for (i=0; i < sl->num_used; i++) - if (element == sl->list[i]) - return i; - return -1; -} - /** Return true iff sl has some element E such that * !strcasecmp(E,element) */ @@ -348,7 +299,6 @@ smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2) if (!smartlist_contains(sl2, sl1->list[i])) { sl1->list[i] = sl1->list[--sl1->num_used]; /* swap with the end */ i--; /* so we process the new i'th element */ - sl1->list[sl1->num_used] = NULL; } } @@ -373,7 +323,6 @@ smartlist_del(smartlist_t *sl, int idx) tor_assert(idx>=0); tor_assert(idx < sl->num_used); sl->list[idx] = sl->list[--sl->num_used]; - sl->list[sl->num_used] = NULL; } /** Remove the idxth element of sl; if idx is not the last element, @@ -389,7 +338,6 @@ smartlist_del_keeporder(smartlist_t *sl, int idx) --sl->num_used; if (idx < sl->num_used) memmove(sl->list+idx, sl->list+idx+1, sizeof(void*)*(sl->num_used-idx)); - sl->list[sl->num_used] = NULL; } /** Insert the value val as the new idxth element of @@ -405,7 +353,7 @@ smartlist_insert(smartlist_t *sl, int idx, void *val) if (idx == sl->num_used) { smartlist_add(sl, val); } else { - smartlist_ensure_capacity(sl, ((size_t) sl->num_used)+1); + smartlist_ensure_capacity(sl, sl->num_used+1); /* Move other elements away */ if (idx < sl->num_used) memmove(sl->list + idx + 1, sl->list + idx, @@ -561,13 +509,11 @@ smartlist_sort(smartlist_t *sl, int (*compare)(const void **a, const void **b)) /** Given a smartlist sl sorted with the function compare, * return the most frequent member in the list. Break ties in favor of - * later elements. If the list is empty, return NULL. If count_out is - * non-null, set it to the count of the most frequent member. + * later elements. If the list is empty, return NULL. */ void * -smartlist_get_most_frequent_(const smartlist_t *sl, - int (*compare)(const void **a, const void **b), - int *count_out) +smartlist_get_most_frequent(const smartlist_t *sl, + int (*compare)(const void **a, const void **b)) { const void *most_frequent = NULL; int most_frequent_count = 0; @@ -575,11 +521,8 @@ smartlist_get_most_frequent_(const smartlist_t *sl, const void *cur = NULL; int i, count=0; - if (!sl->num_used) { - if (count_out) - *count_out = 0; + if (!sl->num_used) return NULL; - } for (i = 0; i < sl->num_used; ++i) { const void *item = sl->list[i]; if (cur && 0 == compare(&cur, &item)) { @@ -597,8 +540,6 @@ smartlist_get_most_frequent_(const smartlist_t *sl, most_frequent = cur; most_frequent_count = count; } - if (count_out) - *count_out = most_frequent_count; return (void*)most_frequent; } @@ -772,22 +713,12 @@ smartlist_sort_strings(smartlist_t *sl) } /** Return the most frequent string in the sorted list sl */ -const char * +char * smartlist_get_most_frequent_string(smartlist_t *sl) { return smartlist_get_most_frequent(sl, compare_string_ptrs_); } -/** Return the most frequent string in the sorted list sl. - * If count_out is provided, set count_out to the - * number of times that string appears. - */ -const char * -smartlist_get_most_frequent_string_(smartlist_t *sl, int *count_out) -{ - return smartlist_get_most_frequent_(sl, compare_string_ptrs_, count_out); -} - /** Remove duplicate strings from a sorted list, and free them with tor_free(). */ void @@ -796,26 +727,6 @@ smartlist_uniq_strings(smartlist_t *sl) smartlist_uniq(sl, compare_string_ptrs_, tor_free_); } -/** Helper: compare two pointers. */ -static int -compare_ptrs_(const void **_a, const void **_b) -{ - const void *a = *_a, *b = *_b; - if (asl in ascending order of the pointers it contains. */ -void -smartlist_sort_pointers(smartlist_t *sl) -{ - smartlist_sort(sl, compare_ptrs_); -} - /* Heap-based priority queue implementation for O(lg N) insert and remove. * Recall that the heap property is that, for every index I, h[I] < * H[LEFT_CHILD[I]] and h[I] < H[RIGHT_CHILD[I]]. @@ -843,13 +754,13 @@ smartlist_sort_pointers(smartlist_t *sl) * } * * void timer_heap_insert(smartlist_t *heap, timer_t *timer) { - * smartlist_pqueue_add(heap, compare, offsetof(timer_t, heap_index), + * smartlist_pqueue_add(heap, compare, STRUCT_OFFSET(timer_t, heap_index), * timer); * } * * void timer_heap_pop(smartlist_t *heap) { * return smartlist_pqueue_pop(heap, compare, - * offsetof(timer_t, heap_index)); + * STRUCT_OFFSET(timer_t, heap_index)); * } */ @@ -858,17 +769,9 @@ smartlist_sort_pointers(smartlist_t *sl) * * For a 1-indexed array, we would use LEFT_CHILD[x] = 2*x and RIGHT_CHILD[x] * = 2*x + 1. But this is C, so we have to adjust a little. */ - -/* MAX_PARENT_IDX is the largest IDX in the smartlist which might have - * children whose indices fit inside an int. - * LEFT_CHILD(MAX_PARENT_IDX) == INT_MAX-2; - * RIGHT_CHILD(MAX_PARENT_IDX) == INT_MAX-1; - * LEFT_CHILD(MAX_PARENT_IDX + 1) == INT_MAX // impossible, see max list size. - */ -#define MAX_PARENT_IDX ((INT_MAX - 2) / 2) -/* If this is true, then i is small enough to potentially have children - * in the smartlist, and it is save to use LEFT_CHILD/RIGHT_CHILD on it. */ -#define IDX_MAY_HAVE_CHILDREN(i) ((i) <= MAX_PARENT_IDX) +//#define LEFT_CHILD(i) ( ((i)+1)*2 - 1) +//#define RIGHT_CHILD(i) ( ((i)+1)*2 ) +//#define PARENT(i) ( ((i)+1)/2 - 1) #define LEFT_CHILD(i) ( 2*(i) + 1 ) #define RIGHT_CHILD(i) ( 2*(i) + 2 ) #define PARENT(i) ( ((i)-1) / 2 ) @@ -895,21 +798,13 @@ smartlist_sort_pointers(smartlist_t *sl) /** Helper. sl may have at most one violation of the heap property: * the item at idx may be greater than one or both of its children. * Restore the heap property. */ -static inline void +static INLINE void smartlist_heapify(smartlist_t *sl, int (*compare)(const void *a, const void *b), int idx_field_offset, int idx) { while (1) { - if (! IDX_MAY_HAVE_CHILDREN(idx)) { - /* idx is so large that it cannot have any children, since doing so - * would mean the smartlist was over-capacity. Therefore it cannot - * violate the heap property by being greater than a child (since it - * doesn't have any). */ - return; - } - int left_idx = LEFT_CHILD(idx); int best_idx; @@ -983,11 +878,9 @@ smartlist_pqueue_pop(smartlist_t *sl, *IDXP(top)=-1; if (--sl->num_used) { sl->list[0] = sl->list[sl->num_used]; - sl->list[sl->num_used] = NULL; UPDATE_IDX(0); smartlist_heapify(sl, compare, idx_field_offset, 0); } - sl->list[sl->num_used] = NULL; return top; } @@ -1007,11 +900,9 @@ smartlist_pqueue_remove(smartlist_t *sl, --sl->num_used; *IDXP(item) = -1; if (idx == sl->num_used) { - sl->list[sl->num_used] = NULL; return; } else { sl->list[idx] = sl->list[sl->num_used]; - sl->list[sl->num_used] = NULL; UPDATE_IDX(idx); smartlist_heapify(sl, compare, idx_field_offset, idx); } @@ -1070,7 +961,7 @@ smartlist_sort_digests256(smartlist_t *sl) /** Return the most frequent member of the sorted list of DIGEST256_LEN * digests in sl */ -const uint8_t * +char * smartlist_get_most_frequent_digest256(smartlist_t *sl) { return smartlist_get_most_frequent(sl, compare_digests256_); @@ -1101,340 +992,239 @@ smartlist_uniq_digests256(smartlist_t *sl) DEFINE_MAP_STRUCTS(strmap_t, char *key, strmap_); DEFINE_MAP_STRUCTS(digestmap_t, char key[DIGEST_LEN], digestmap_); -DEFINE_MAP_STRUCTS(digest256map_t, uint8_t key[DIGEST256_LEN], digest256map_); /** Helper: compare strmap_entry_t objects by key value. */ -static inline int +static INLINE int strmap_entries_eq(const strmap_entry_t *a, const strmap_entry_t *b) { return !strcmp(a->key, b->key); } /** Helper: return a hash value for a strmap_entry_t. */ -static inline unsigned int +static INLINE unsigned int strmap_entry_hash(const strmap_entry_t *a) { - return (unsigned) siphash24g(a->key, strlen(a->key)); + return ht_string_hash(a->key); } /** Helper: compare digestmap_entry_t objects by key value. */ -static inline int +static INLINE int digestmap_entries_eq(const digestmap_entry_t *a, const digestmap_entry_t *b) { return tor_memeq(a->key, b->key, DIGEST_LEN); } /** Helper: return a hash value for a digest_map_t. */ -static inline unsigned int +static INLINE unsigned int digestmap_entry_hash(const digestmap_entry_t *a) { - return (unsigned) siphash24g(a->key, DIGEST_LEN); -} - -/** Helper: compare digestmap_entry_t objects by key value. */ -static inline int -digest256map_entries_eq(const digest256map_entry_t *a, - const digest256map_entry_t *b) -{ - return tor_memeq(a->key, b->key, DIGEST256_LEN); -} - -/** Helper: return a hash value for a digest_map_t. */ -static inline unsigned int -digest256map_entry_hash(const digest256map_entry_t *a) -{ - return (unsigned) siphash24g(a->key, DIGEST256_LEN); +#if SIZEOF_INT != 8 + const uint32_t *p = (const uint32_t*)a->key; + return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; +#else + const uint64_t *p = (const uint64_t*)a->key; + return p[0] ^ p[1]; +#endif } HT_PROTOTYPE(strmap_impl, strmap_entry_t, node, strmap_entry_hash, strmap_entries_eq) -HT_GENERATE2(strmap_impl, strmap_entry_t, node, strmap_entry_hash, - strmap_entries_eq, 0.6, tor_reallocarray_, tor_free_) +HT_GENERATE(strmap_impl, strmap_entry_t, node, strmap_entry_hash, + strmap_entries_eq, 0.6, malloc, realloc, free) HT_PROTOTYPE(digestmap_impl, digestmap_entry_t, node, digestmap_entry_hash, digestmap_entries_eq) -HT_GENERATE2(digestmap_impl, digestmap_entry_t, node, digestmap_entry_hash, - digestmap_entries_eq, 0.6, tor_reallocarray_, tor_free_) - -HT_PROTOTYPE(digest256map_impl, digest256map_entry_t, node, - digest256map_entry_hash, - digest256map_entries_eq) -HT_GENERATE2(digest256map_impl, digest256map_entry_t, node, - digest256map_entry_hash, - digest256map_entries_eq, 0.6, tor_reallocarray_, tor_free_) +HT_GENERATE(digestmap_impl, digestmap_entry_t, node, digestmap_entry_hash, + digestmap_entries_eq, 0.6, malloc, realloc, free) -#define strmap_entry_free(ent) \ - FREE_AND_NULL(strmap_entry_t, strmap_entry_free_, (ent)) -#define digestmap_entry_free(ent) \ - FREE_AND_NULL(digestmap_entry_t, digestmap_entry_free_, (ent)) -#define digest256map_entry_free(ent) \ - FREE_AND_NULL(digest256map_entry_t, digest256map_entry_free_, (ent)) - -static inline void -strmap_entry_free_(strmap_entry_t *ent) -{ - tor_free(ent->key); - tor_free(ent); -} -static inline void -digestmap_entry_free_(digestmap_entry_t *ent) -{ - tor_free(ent); -} -static inline void -digest256map_entry_free_(digest256map_entry_t *ent) +/** Constructor to create a new empty map from strings to void*'s. + */ +strmap_t * +strmap_new(void) { - tor_free(ent); + strmap_t *result; + result = tor_malloc(sizeof(strmap_t)); + HT_INIT(strmap_impl, &result->head); + return result; } -static inline void -strmap_assign_tmp_key(strmap_entry_t *ent, const char *key) -{ - ent->key = (char*)key; -} -static inline void -digestmap_assign_tmp_key(digestmap_entry_t *ent, const char *key) +/** Constructor to create a new empty map from digests to void*'s. + */ +digestmap_t * +digestmap_new(void) { - memcpy(ent->key, key, DIGEST_LEN); + digestmap_t *result; + result = tor_malloc(sizeof(digestmap_t)); + HT_INIT(digestmap_impl, &result->head); + return result; } -static inline void -digest256map_assign_tmp_key(digest256map_entry_t *ent, const uint8_t *key) -{ - memcpy(ent->key, key, DIGEST256_LEN); + +/** Set the current value for key to val. Returns the previous + * value for key if one was set, or NULL if one was not. + * + * This function makes a copy of key if necessary, but not of + * val. + */ +void * +strmap_set(strmap_t *map, const char *key, void *val) +{ + strmap_entry_t *resolve; + strmap_entry_t search; + void *oldval; + tor_assert(map); + tor_assert(key); + tor_assert(val); + search.key = (char*)key; + resolve = HT_FIND(strmap_impl, &map->head, &search); + if (resolve) { + oldval = resolve->val; + resolve->val = val; + return oldval; + } else { + resolve = tor_malloc_zero(sizeof(strmap_entry_t)); + resolve->key = tor_strdup(key); + resolve->val = val; + tor_assert(!HT_FIND(strmap_impl, &map->head, resolve)); + HT_INSERT(strmap_impl, &map->head, resolve); + return NULL; + } } -static inline void -strmap_assign_key(strmap_entry_t *ent, const char *key) + +#define OPTIMIZED_DIGESTMAP_SET + +/** Like strmap_set() above but for digestmaps. */ +void * +digestmap_set(digestmap_t *map, const char *key, void *val) { - ent->key = tor_strdup(key); +#ifndef OPTIMIZED_DIGESTMAP_SET + digestmap_entry_t *resolve; +#endif + digestmap_entry_t search; + void *oldval; + tor_assert(map); + tor_assert(key); + tor_assert(val); + memcpy(&search.key, key, DIGEST_LEN); +#ifndef OPTIMIZED_DIGESTMAP_SET + resolve = HT_FIND(digestmap_impl, &map->head, &search); + if (resolve) { + oldval = resolve->val; + resolve->val = val; + return oldval; + } else { + resolve = tor_malloc_zero(sizeof(digestmap_entry_t)); + memcpy(resolve->key, key, DIGEST_LEN); + resolve->val = val; + HT_INSERT(digestmap_impl, &map->head, resolve); + return NULL; + } +#else + /* We spend up to 5% of our time in this function, so the code below is + * meant to optimize the check/alloc/set cycle by avoiding the two trips to + * the hash table that we do in the unoptimized code above. (Each of + * HT_INSERT and HT_FIND calls HT_SET_HASH and HT_FIND_P.) + */ + HT_FIND_OR_INSERT_(digestmap_impl, node, digestmap_entry_hash, &(map->head), + digestmap_entry_t, &search, ptr, + { + /* we found an entry. */ + oldval = (*ptr)->val; + (*ptr)->val = val; + return oldval; + }, + { + /* We didn't find the entry. */ + digestmap_entry_t *newent = + tor_malloc_zero(sizeof(digestmap_entry_t)); + memcpy(newent->key, key, DIGEST_LEN); + newent->val = val; + HT_FOI_INSERT_(node, &(map->head), &search, newent, ptr); + return NULL; + }); +#endif } -static inline void -digestmap_assign_key(digestmap_entry_t *ent, const char *key) -{ - memcpy(ent->key, key, DIGEST_LEN); + +/** Return the current value associated with key, or NULL if no + * value is set. + */ +void * +strmap_get(const strmap_t *map, const char *key) +{ + strmap_entry_t *resolve; + strmap_entry_t search; + tor_assert(map); + tor_assert(key); + search.key = (char*)key; + resolve = HT_FIND(strmap_impl, &map->head, &search); + if (resolve) { + return resolve->val; + } else { + return NULL; + } } -static inline void -digest256map_assign_key(digest256map_entry_t *ent, const uint8_t *key) -{ - memcpy(ent->key, key, DIGEST256_LEN); + +/** Like strmap_get() above but for digestmaps. */ +void * +digestmap_get(const digestmap_t *map, const char *key) +{ + digestmap_entry_t *resolve; + digestmap_entry_t search; + tor_assert(map); + tor_assert(key); + memcpy(&search.key, key, DIGEST_LEN); + resolve = HT_FIND(digestmap_impl, &map->head, &search); + if (resolve) { + return resolve->val; + } else { + return NULL; + } } -/** - * Macro: implement all the functions for a map that are declared in - * container.h by the DECLARE_MAP_FNS() macro. You must additionally define a - * prefix_entry_free_() function to free entries (and their keys), a - * prefix_assign_tmp_key() function to temporarily set a stack-allocated - * entry to hold a key, and a prefix_assign_key() function to set a - * heap-allocated entry to hold a key. +/** Remove the value currently associated with key from the map. + * Return the value if one was set, or NULL if there was no entry for + * key. + * + * Note: you must free any storage associated with the returned value. */ -#define IMPLEMENT_MAP_FNS(maptype, keytype, prefix) \ - /** Create and return a new empty map. */ \ - MOCK_IMPL(maptype *, \ - prefix##_new,(void)) \ - { \ - maptype *result; \ - result = tor_malloc(sizeof(maptype)); \ - HT_INIT(prefix##_impl, &result->head); \ - return result; \ - } \ - \ - /** Return the item from map whose key matches key, or \ - * NULL if no such value exists. */ \ - void * \ - prefix##_get(const maptype *map, const keytype key) \ - { \ - prefix ##_entry_t *resolve; \ - prefix ##_entry_t search; \ - tor_assert(map); \ - tor_assert(key); \ - prefix ##_assign_tmp_key(&search, key); \ - resolve = HT_FIND(prefix ##_impl, &map->head, &search); \ - if (resolve) { \ - return resolve->val; \ - } else { \ - return NULL; \ - } \ - } \ - \ - /** Add an entry to map mapping key to val; \ - * return the previous value, or NULL if no such value existed. */ \ - void * \ - prefix##_set(maptype *map, const keytype key, void *val) \ - { \ - prefix##_entry_t search; \ - void *oldval; \ - tor_assert(map); \ - tor_assert(key); \ - tor_assert(val); \ - prefix##_assign_tmp_key(&search, key); \ - /* We a lot of our time in this function, so the code below is */ \ - /* meant to optimize the check/alloc/set cycle by avoiding the two */\ - /* trips to the hash table that we would do in the unoptimized */ \ - /* version of this code. (Each of HT_INSERT and HT_FIND calls */ \ - /* HT_SET_HASH and HT_FIND_P.) */ \ - HT_FIND_OR_INSERT_(prefix##_impl, node, prefix##_entry_hash, \ - &(map->head), \ - prefix##_entry_t, &search, ptr, \ - { \ - /* we found an entry. */ \ - oldval = (*ptr)->val; \ - (*ptr)->val = val; \ - return oldval; \ - }, \ - { \ - /* We didn't find the entry. */ \ - prefix##_entry_t *newent = \ - tor_malloc_zero(sizeof(prefix##_entry_t)); \ - prefix##_assign_key(newent, key); \ - newent->val = val; \ - HT_FOI_INSERT_(node, &(map->head), \ - &search, newent, ptr); \ - return NULL; \ - }); \ - } \ - \ - /** Remove the value currently associated with key from the map. \ - * Return the value if one was set, or NULL if there was no entry for \ - * key. \ - * \ - * Note: you must free any storage associated with the returned value. \ - */ \ - void * \ - prefix##_remove(maptype *map, const keytype key) \ - { \ - prefix##_entry_t *resolve; \ - prefix##_entry_t search; \ - void *oldval; \ - tor_assert(map); \ - tor_assert(key); \ - prefix##_assign_tmp_key(&search, key); \ - resolve = HT_REMOVE(prefix##_impl, &map->head, &search); \ - if (resolve) { \ - oldval = resolve->val; \ - prefix##_entry_free(resolve); \ - return oldval; \ - } else { \ - return NULL; \ - } \ - } \ - \ - /** Return the number of elements in map. */ \ - int \ - prefix##_size(const maptype *map) \ - { \ - return HT_SIZE(&map->head); \ - } \ - \ - /** Return true iff map has no entries. */ \ - int \ - prefix##_isempty(const maptype *map) \ - { \ - return HT_EMPTY(&map->head); \ - } \ - \ - /** Assert that map is not corrupt. */ \ - void \ - prefix##_assert_ok(const maptype *map) \ - { \ - tor_assert(!prefix##_impl_HT_REP_IS_BAD_(&map->head)); \ - } \ - \ - /** Remove all entries from map, and deallocate storage for \ - * those entries. If free_val is provided, invoked it every value in \ - * map. */ \ - MOCK_IMPL(void, \ - prefix##_free_, (maptype *map, void (*free_val)(void*))) \ - { \ - prefix##_entry_t **ent, **next, *this; \ - if (!map) \ - return; \ - for (ent = HT_START(prefix##_impl, &map->head); ent != NULL; \ - ent = next) { \ - this = *ent; \ - next = HT_NEXT_RMV(prefix##_impl, &map->head, ent); \ - if (free_val) \ - free_val(this->val); \ - prefix##_entry_free(this); \ - } \ - tor_assert(HT_EMPTY(&map->head)); \ - HT_CLEAR(prefix##_impl, &map->head); \ - tor_free(map); \ - } \ - \ - /** return an iterator pointer to the front of a map. \ - * \ - * Iterator example: \ - * \ - * \code \ - * // uppercase values in "map", removing empty values. \ - * \ - * strmap_iter_t *iter; \ - * const char *key; \ - * void *val; \ - * char *cp; \ - * \ - * for (iter = strmap_iter_init(map); !strmap_iter_done(iter); ) { \ - * strmap_iter_get(iter, &key, &val); \ - * cp = (char*)val; \ - * if (!*cp) { \ - * iter = strmap_iter_next_rmv(map,iter); \ - * free(val); \ - * } else { \ - * for (;*cp;cp++) *cp = TOR_TOUPPER(*cp); \ - */ \ - prefix##_iter_t * \ - prefix##_iter_init(maptype *map) \ - { \ - tor_assert(map); \ - return HT_START(prefix##_impl, &map->head); \ - } \ - \ - /** Advance iter a single step to the next entry, and return \ - * its new value. */ \ - prefix##_iter_t * \ - prefix##_iter_next(maptype *map, prefix##_iter_t *iter) \ - { \ - tor_assert(map); \ - tor_assert(iter); \ - return HT_NEXT(prefix##_impl, &map->head, iter); \ - } \ - /** Advance iter a single step to the next entry, removing the \ - * current entry, and return its new value. */ \ - prefix##_iter_t * \ - prefix##_iter_next_rmv(maptype *map, prefix##_iter_t *iter) \ - { \ - prefix##_entry_t *rmv; \ - tor_assert(map); \ - tor_assert(iter); \ - tor_assert(*iter); \ - rmv = *iter; \ - iter = HT_NEXT_RMV(prefix##_impl, &map->head, iter); \ - prefix##_entry_free(rmv); \ - return iter; \ - } \ - /** Set *keyp and *valp to the current entry pointed \ - * to by iter. */ \ - void \ - prefix##_iter_get(prefix##_iter_t *iter, const keytype *keyp, \ - void **valp) \ - { \ - tor_assert(iter); \ - tor_assert(*iter); \ - tor_assert(keyp); \ - tor_assert(valp); \ - *keyp = (*iter)->key; \ - *valp = (*iter)->val; \ - } \ - /** Return true iff iter has advanced past the last entry of \ - * map. */ \ - int \ - prefix##_iter_done(prefix##_iter_t *iter) \ - { \ - return iter == NULL; \ +void * +strmap_remove(strmap_t *map, const char *key) +{ + strmap_entry_t *resolve; + strmap_entry_t search; + void *oldval; + tor_assert(map); + tor_assert(key); + search.key = (char*)key; + resolve = HT_REMOVE(strmap_impl, &map->head, &search); + if (resolve) { + oldval = resolve->val; + tor_free(resolve->key); + tor_free(resolve); + return oldval; + } else { + return NULL; } +} -IMPLEMENT_MAP_FNS(strmap_t, char *, strmap) -IMPLEMENT_MAP_FNS(digestmap_t, char *, digestmap) -IMPLEMENT_MAP_FNS(digest256map_t, uint8_t *, digest256map) +/** Like strmap_remove() above but for digestmaps. */ +void * +digestmap_remove(digestmap_t *map, const char *key) +{ + digestmap_entry_t *resolve; + digestmap_entry_t search; + void *oldval; + tor_assert(map); + tor_assert(key); + memcpy(&search.key, key, DIGEST_LEN); + resolve = HT_REMOVE(digestmap_impl, &map->head, &search); + if (resolve) { + oldval = resolve->val; + tor_free(resolve); + return oldval; + } else { + return NULL; + } +} /** Same as strmap_set, but first converts key to lowercase. */ void * @@ -1474,6 +1264,231 @@ strmap_remove_lc(strmap_t *map, const char *key) return v; } +/** return an iterator pointer to the front of a map. + * + * Iterator example: + * + * \code + * // uppercase values in "map", removing empty values. + * + * strmap_iter_t *iter; + * const char *key; + * void *val; + * char *cp; + * + * for (iter = strmap_iter_init(map); !strmap_iter_done(iter); ) { + * strmap_iter_get(iter, &key, &val); + * cp = (char*)val; + * if (!*cp) { + * iter = strmap_iter_next_rmv(map,iter); + * free(val); + * } else { + * for (;*cp;cp++) *cp = TOR_TOUPPER(*cp); + * iter = strmap_iter_next(map,iter); + * } + * } + * \endcode + * + */ +strmap_iter_t * +strmap_iter_init(strmap_t *map) +{ + tor_assert(map); + return HT_START(strmap_impl, &map->head); +} + +/** Start iterating through map. See strmap_iter_init() for example. */ +digestmap_iter_t * +digestmap_iter_init(digestmap_t *map) +{ + tor_assert(map); + return HT_START(digestmap_impl, &map->head); +} + +/** Advance the iterator iter for map a single step to the next + * entry, and return its new value. */ +strmap_iter_t * +strmap_iter_next(strmap_t *map, strmap_iter_t *iter) +{ + tor_assert(map); + tor_assert(iter); + return HT_NEXT(strmap_impl, &map->head, iter); +} + +/** Advance the iterator iter for map a single step to the next entry, + * and return its new value. */ +digestmap_iter_t * +digestmap_iter_next(digestmap_t *map, digestmap_iter_t *iter) +{ + tor_assert(map); + tor_assert(iter); + return HT_NEXT(digestmap_impl, &map->head, iter); +} + +/** Advance the iterator iter a single step to the next entry, removing + * the current entry, and return its new value. + */ +strmap_iter_t * +strmap_iter_next_rmv(strmap_t *map, strmap_iter_t *iter) +{ + strmap_entry_t *rmv; + tor_assert(map); + tor_assert(iter); + tor_assert(*iter); + rmv = *iter; + iter = HT_NEXT_RMV(strmap_impl, &map->head, iter); + tor_free(rmv->key); + tor_free(rmv); + return iter; +} + +/** Advance the iterator iter a single step to the next entry, removing + * the current entry, and return its new value. + */ +digestmap_iter_t * +digestmap_iter_next_rmv(digestmap_t *map, digestmap_iter_t *iter) +{ + digestmap_entry_t *rmv; + tor_assert(map); + tor_assert(iter); + tor_assert(*iter); + rmv = *iter; + iter = HT_NEXT_RMV(digestmap_impl, &map->head, iter); + tor_free(rmv); + return iter; +} + +/** Set *keyp and *valp to the current entry pointed to by + * iter. */ +void +strmap_iter_get(strmap_iter_t *iter, const char **keyp, void **valp) +{ + tor_assert(iter); + tor_assert(*iter); + tor_assert(keyp); + tor_assert(valp); + *keyp = (*iter)->key; + *valp = (*iter)->val; +} + +/** Set *keyp and *valp to the current entry pointed to by + * iter. */ +void +digestmap_iter_get(digestmap_iter_t *iter, const char **keyp, void **valp) +{ + tor_assert(iter); + tor_assert(*iter); + tor_assert(keyp); + tor_assert(valp); + *keyp = (*iter)->key; + *valp = (*iter)->val; +} + +/** Return true iff iter has advanced past the last entry of + * map. */ +int +strmap_iter_done(strmap_iter_t *iter) +{ + return iter == NULL; +} + +/** Return true iff iter has advanced past the last entry of + * map. */ +int +digestmap_iter_done(digestmap_iter_t *iter) +{ + return iter == NULL; +} + +/** Remove all entries from map, and deallocate storage for those + * entries. If free_val is provided, it is invoked on every value in + * map. + */ +void +strmap_free(strmap_t *map, void (*free_val)(void*)) +{ + strmap_entry_t **ent, **next, *this; + if (!map) + return; + + for (ent = HT_START(strmap_impl, &map->head); ent != NULL; ent = next) { + this = *ent; + next = HT_NEXT_RMV(strmap_impl, &map->head, ent); + tor_free(this->key); + if (free_val) + free_val(this->val); + tor_free(this); + } + tor_assert(HT_EMPTY(&map->head)); + HT_CLEAR(strmap_impl, &map->head); + tor_free(map); +} + +/** Remove all entries from map, and deallocate storage for those + * entries. If free_val is provided, it is invoked on every value in + * map. + */ +void +digestmap_free(digestmap_t *map, void (*free_val)(void*)) +{ + digestmap_entry_t **ent, **next, *this; + if (!map) + return; + for (ent = HT_START(digestmap_impl, &map->head); ent != NULL; ent = next) { + this = *ent; + next = HT_NEXT_RMV(digestmap_impl, &map->head, ent); + if (free_val) + free_val(this->val); + tor_free(this); + } + tor_assert(HT_EMPTY(&map->head)); + HT_CLEAR(digestmap_impl, &map->head); + tor_free(map); +} + +/** Fail with an assertion error if anything has gone wrong with the internal + * representation of map. */ +void +strmap_assert_ok(const strmap_t *map) +{ + tor_assert(!strmap_impl_HT_REP_IS_BAD_(&map->head)); +} +/** Fail with an assertion error if anything has gone wrong with the internal + * representation of map. */ +void +digestmap_assert_ok(const digestmap_t *map) +{ + tor_assert(!digestmap_impl_HT_REP_IS_BAD_(&map->head)); +} + +/** Return true iff map has no entries. */ +int +strmap_isempty(const strmap_t *map) +{ + return HT_EMPTY(&map->head); +} + +/** Return true iff map has no entries. */ +int +digestmap_isempty(const digestmap_t *map) +{ + return HT_EMPTY(&map->head); +} + +/** Return the number of items in map. */ +int +strmap_size(const strmap_t *map) +{ + return HT_SIZE(&map->head); +} + +/** Return the number of items in map. */ +int +digestmap_size(const digestmap_t *map) +{ + return HT_SIZE(&map->head); +} + /** Declare a function called funcname that acts as a find_nth_FOO * function for an array of type elt_t*. * @@ -1532,7 +1547,7 @@ digestset_new(int max_elements) /** Free all storage held in set. */ void -digestset_free_(digestset_t *set) +digestset_free(digestset_t *set) { if (!set) return; diff --git a/src/tor/src/common/container.h b/src/tor/container.h similarity index 80% rename from src/tor/src/common/container.h rename to src/tor/container.h index 5d2dce541..9b92aaa33 100644 --- a/src/tor/src/common/container.h +++ b/src/tor/container.h @@ -1,13 +1,12 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONTAINER_H #define TOR_CONTAINER_H -#include "util.h" -#include "siphash.h" +#include "tor_util.h" /** A resizeable list of pointers, with associated helpful functionality. * @@ -27,21 +26,17 @@ typedef struct smartlist_t { /** @} */ } smartlist_t; -MOCK_DECL(smartlist_t *, smartlist_new, (void)); -MOCK_DECL(void, smartlist_free_, (smartlist_t *sl)); -#define smartlist_free(sl) FREE_AND_NULL(smartlist_t, smartlist_free_, (sl)) - +smartlist_t *smartlist_new(void); +void smartlist_free(smartlist_t *sl); void smartlist_clear(smartlist_t *sl); void smartlist_add(smartlist_t *sl, void *element); void smartlist_add_all(smartlist_t *sl, const smartlist_t *s2); void smartlist_remove(smartlist_t *sl, const void *element); -void smartlist_remove_keeporder(smartlist_t *sl, const void *element); void *smartlist_pop_last(smartlist_t *sl); void smartlist_reverse(smartlist_t *sl); void smartlist_string_remove(smartlist_t *sl, const char *element); int smartlist_contains(const smartlist_t *sl, const void *element); int smartlist_contains_string(const smartlist_t *sl, const char *element); -int smartlist_pos(const smartlist_t *sl, const void *element); int smartlist_string_pos(const smartlist_t *, const char *elt); int smartlist_contains_string_case(const smartlist_t *sl, const char *element); int smartlist_contains_int_as_string(const smartlist_t *sl, int num); @@ -56,35 +51,35 @@ void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2); #ifdef DEBUG_SMARTLIST /** Return the number of items in sl. */ -static inline int smartlist_len(const smartlist_t *sl); -static inline int smartlist_len(const smartlist_t *sl) { +static INLINE int smartlist_len(const smartlist_t *sl); +static INLINE int smartlist_len(const smartlist_t *sl) { tor_assert(sl); return (sl)->num_used; } /** Return the idxth element of sl. */ -static inline void *smartlist_get(const smartlist_t *sl, int idx); -static inline void *smartlist_get(const smartlist_t *sl, int idx) { +static INLINE void *smartlist_get(const smartlist_t *sl, int idx); +static INLINE void *smartlist_get(const smartlist_t *sl, int idx) { tor_assert(sl); tor_assert(idx>=0); tor_assert(sl->num_used > idx); return sl->list[idx]; } -static inline void smartlist_set(smartlist_t *sl, int idx, void *val) { +static INLINE void smartlist_set(smartlist_t *sl, int idx, void *val) { tor_assert(sl); tor_assert(idx>=0); tor_assert(sl->num_used > idx); sl->list[idx] = val; } -#else /* !(defined(DEBUG_SMARTLIST)) */ +#else #define smartlist_len(sl) ((sl)->num_used) #define smartlist_get(sl, idx) ((sl)->list[idx]) #define smartlist_set(sl, idx, val) ((sl)->list[idx] = (val)) -#endif /* defined(DEBUG_SMARTLIST) */ +#endif /** Exchange the elements at indices idx1 and idx2 of the * smartlist sl. */ -static inline void smartlist_swap(smartlist_t *sl, int idx1, int idx2) +static INLINE void smartlist_swap(smartlist_t *sl, int idx1, int idx2) { if (idx1 != idx2) { void *elt = smartlist_get(sl, idx1); @@ -98,11 +93,8 @@ void smartlist_del_keeporder(smartlist_t *sl, int idx); void smartlist_insert(smartlist_t *sl, int idx, void *val); void smartlist_sort(smartlist_t *sl, int (*compare)(const void **a, const void **b)); -void *smartlist_get_most_frequent_(const smartlist_t *sl, - int (*compare)(const void **a, const void **b), - int *count_out); -#define smartlist_get_most_frequent(sl, compare) \ - smartlist_get_most_frequent_((sl), (compare), NULL) +void *smartlist_get_most_frequent(const smartlist_t *sl, + int (*compare)(const void **a, const void **b)); void smartlist_uniq(smartlist_t *sl, int (*compare)(const void **a, const void **b), void (*free_fn)(void *elt)); @@ -110,12 +102,9 @@ void smartlist_uniq(smartlist_t *sl, void smartlist_sort_strings(smartlist_t *sl); void smartlist_sort_digests(smartlist_t *sl); void smartlist_sort_digests256(smartlist_t *sl); -void smartlist_sort_pointers(smartlist_t *sl); -const char *smartlist_get_most_frequent_string(smartlist_t *sl); -const char *smartlist_get_most_frequent_string_(smartlist_t *sl, - int *count_out); -const uint8_t *smartlist_get_most_frequent_digest256(smartlist_t *sl); +char *smartlist_get_most_frequent_string(smartlist_t *sl); +char *smartlist_get_most_frequent_digest256(smartlist_t *sl); void smartlist_uniq_strings(smartlist_t *sl); void smartlist_uniq_digests(smartlist_t *sl); @@ -226,7 +215,6 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, #define SMARTLIST_FOREACH_END(var) \ var = NULL; \ - (void) var ## _sl_idx; \ } STMT_END /** @@ -252,16 +240,6 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, --var ## _sl_len; \ STMT_END -/** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed - * with the variable var, remove the current element in a way that - * won't confuse the loop. */ -#define SMARTLIST_DEL_CURRENT_KEEPORDER(sl, var) \ - STMT_BEGIN \ - smartlist_del_keeporder(sl, var ## _sl_idx); \ - --var ## _sl_idx; \ - --var ## _sl_len; \ - STMT_END - /** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed * with the variable var, replace the current element with val. * Does not deallocate the current value of var. @@ -348,11 +326,11 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, #define DECLARE_MAP_FNS(maptype, keytype, prefix) \ typedef struct maptype maptype; \ typedef struct prefix##entry_t *prefix##iter_t; \ - MOCK_DECL(maptype*, prefix##new, (void)); \ + maptype* prefix##new(void); \ void* prefix##set(maptype *map, keytype key, void *val); \ void* prefix##get(const maptype *map, keytype key); \ void* prefix##remove(maptype *map, keytype key); \ - MOCK_DECL(void, prefix##free_, (maptype *map, void (*free_val)(void*))); \ + void prefix##free(maptype *map, void (*free_val)(void*)); \ int prefix##isempty(const maptype *map); \ int prefix##size(const maptype *map); \ prefix##iter_t *prefix##iter_init(maptype *map); \ @@ -366,19 +344,6 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, DECLARE_MAP_FNS(strmap_t, const char *, strmap_); /* Map from const char[DIGEST_LEN] to void *. Implemented with a hash table. */ DECLARE_MAP_FNS(digestmap_t, const char *, digestmap_); -/* Map from const uint8_t[DIGEST256_LEN] to void *. Implemented with a hash - * table. */ -DECLARE_MAP_FNS(digest256map_t, const uint8_t *, digest256map_); - -#define MAP_FREE_AND_NULL(maptype, map, fn) \ - do { \ - maptype ## _free_((map), (fn)); \ - (map) = NULL; \ - } while (0) - -#define strmap_free(map, fn) MAP_FREE_AND_NULL(strmap, (map), (fn)) -#define digestmap_free(map, fn) MAP_FREE_AND_NULL(digestmap, (map), (fn)) -#define digest256map_free(map, fn) MAP_FREE_AND_NULL(digest256map, (map), (fn)) #undef DECLARE_MAP_FNS @@ -494,13 +459,6 @@ DECLARE_MAP_FNS(digest256map_t, const uint8_t *, digest256map_); /** Used to end a DIGESTMAP_FOREACH() block. */ #define DIGESTMAP_FOREACH_END MAP_FOREACH_END -#define DIGEST256MAP_FOREACH(map, keyvar, valtype, valvar) \ - MAP_FOREACH(digest256map_, map, const uint8_t *, keyvar, valtype, valvar) -#define DIGEST256MAP_FOREACH_MODIFY(map, keyvar, valtype, valvar) \ - MAP_FOREACH_MODIFY(digest256map_, map, const uint8_t *, \ - keyvar, valtype, valvar) -#define DIGEST256MAP_FOREACH_END MAP_FOREACH_END - #define STRMAP_FOREACH(map, keyvar, valtype, valvar) \ MAP_FOREACH(strmap_, map, const char *, keyvar, valtype, valvar) #define STRMAP_FOREACH_MODIFY(map, keyvar, valtype, valvar) \ @@ -513,75 +471,65 @@ void* strmap_remove_lc(strmap_t *map, const char *key); #define DECLARE_TYPED_DIGESTMAP_FNS(prefix, maptype, valtype) \ typedef struct maptype maptype; \ - typedef struct prefix##iter_t *prefix##iter_t; \ - ATTR_UNUSED static inline maptype* \ - prefix##new(void) \ + typedef struct prefix##iter_t prefix##iter_t; \ + static INLINE maptype* prefix##new(void) \ { \ return (maptype*)digestmap_new(); \ } \ - ATTR_UNUSED static inline digestmap_t* \ - prefix##to_digestmap(maptype *map) \ + static INLINE digestmap_t* prefix##to_digestmap(maptype *map) \ { \ return (digestmap_t*)map; \ } \ - ATTR_UNUSED static inline valtype* \ - prefix##get(maptype *map, const char *key) \ + static INLINE valtype* prefix##get(maptype *map, const char *key) \ { \ return (valtype*)digestmap_get((digestmap_t*)map, key); \ } \ - ATTR_UNUSED static inline valtype* \ - prefix##set(maptype *map, const char *key, valtype *val) \ + static INLINE valtype* prefix##set(maptype *map, const char *key, \ + valtype *val) \ { \ return (valtype*)digestmap_set((digestmap_t*)map, key, val); \ } \ - ATTR_UNUSED static inline valtype* \ - prefix##remove(maptype *map, const char *key) \ + static INLINE valtype* prefix##remove(maptype *map, const char *key) \ { \ return (valtype*)digestmap_remove((digestmap_t*)map, key); \ } \ - ATTR_UNUSED static inline void \ - prefix##f##ree_(maptype *map, void (*free_val)(void*)) \ + static INLINE void prefix##free(maptype *map, void (*free_val)(void*)) \ { \ - digestmap_free_((digestmap_t*)map, free_val); \ + digestmap_free((digestmap_t*)map, free_val); \ } \ - ATTR_UNUSED static inline int \ - prefix##isempty(maptype *map) \ + static INLINE int prefix##isempty(maptype *map) \ { \ return digestmap_isempty((digestmap_t*)map); \ } \ - ATTR_UNUSED static inline int \ - prefix##size(maptype *map) \ + static INLINE int prefix##size(maptype *map) \ { \ return digestmap_size((digestmap_t*)map); \ } \ - ATTR_UNUSED static inline \ - prefix##iter_t *prefix##iter_init(maptype *map) \ + static INLINE prefix##iter_t *prefix##iter_init(maptype *map) \ { \ return (prefix##iter_t*) digestmap_iter_init((digestmap_t*)map); \ } \ - ATTR_UNUSED static inline \ - prefix##iter_t *prefix##iter_next(maptype *map, prefix##iter_t *iter) \ + static INLINE prefix##iter_t *prefix##iter_next(maptype *map, \ + prefix##iter_t *iter) \ { \ return (prefix##iter_t*) digestmap_iter_next( \ (digestmap_t*)map, (digestmap_iter_t*)iter); \ } \ - ATTR_UNUSED static inline prefix##iter_t* \ - prefix##iter_next_rmv(maptype *map, prefix##iter_t *iter) \ + static INLINE prefix##iter_t *prefix##iter_next_rmv(maptype *map, \ + prefix##iter_t *iter) \ { \ return (prefix##iter_t*) digestmap_iter_next_rmv( \ (digestmap_t*)map, (digestmap_iter_t*)iter); \ } \ - ATTR_UNUSED static inline void \ - prefix##iter_get(prefix##iter_t *iter, \ - const char **keyp, \ - valtype **valp) \ + static INLINE void prefix##iter_get(prefix##iter_t *iter, \ + const char **keyp, \ + valtype **valp) \ { \ void *v; \ digestmap_iter_get((digestmap_iter_t*) iter, keyp, &v); \ *valp = v; \ } \ - ATTR_UNUSED static inline int \ - prefix##iter_done(prefix##iter_t *iter) \ + static INLINE int prefix##iter_done(prefix##iter_t *iter) \ { \ return digestmap_iter_done((digestmap_iter_t*)iter); \ } @@ -592,23 +540,23 @@ void* strmap_remove_lc(strmap_t *map, const char *key); #define BITARRAY_SHIFT 6 #else #error "int is neither 4 nor 8 bytes. I can't deal with that." -#endif /* SIZEOF_INT == 4 || ... */ +#endif #define BITARRAY_MASK ((1u<n_bits bits. */ -static inline bitarray_t * +static INLINE bitarray_t * bitarray_init_zero(unsigned int n_bits) { /* round up to the next int. */ size_t sz = (n_bits+BITARRAY_MASK) >> BITARRAY_SHIFT; - return tor_calloc(sz, sizeof(unsigned int)); + return tor_malloc_zero(sz*sizeof(unsigned int)); } /** Expand ba from holding n_bits_old to n_bits_new, * clearing all new bits. Returns a possibly changed pointer to the * bitarray. */ -static inline bitarray_t * +static INLINE bitarray_t * bitarray_expand(bitarray_t *ba, unsigned int n_bits_old, unsigned int n_bits_new) { @@ -617,7 +565,7 @@ bitarray_expand(bitarray_t *ba, char *ptr; if (sz_new <= sz_old) return ba; - ptr = tor_reallocarray(ba, sz_new, sizeof(unsigned int)); + ptr = tor_realloc(ba, sz_new*sizeof(unsigned int)); /* This memset does nothing to the older excess bytes. But they were * already set to 0 by bitarry_init_zero. */ memset(ptr+sz_old*sizeof(unsigned int), 0, @@ -625,28 +573,26 @@ bitarray_expand(bitarray_t *ba, return (bitarray_t*) ptr; } /** Free the bit array ba. */ -static inline void -bitarray_free_(bitarray_t *ba) +static INLINE void +bitarray_free(bitarray_t *ba) { tor_free(ba); } -#define bitarray_free(ba) FREE_AND_NULL(bitarray_t, bitarray_free_, (ba)) - /** Set the bitth bit in b to 1. */ -static inline void +static INLINE void bitarray_set(bitarray_t *b, int bit) { b[bit >> BITARRAY_SHIFT] |= (1u << (bit & BITARRAY_MASK)); } /** Set the bitth bit in b to 0. */ -static inline void +static INLINE void bitarray_clear(bitarray_t *b, int bit) { b[bit >> BITARRAY_SHIFT] &= ~ (1u << (bit & BITARRAY_MASK)); } /** Return true iff bitth bit in b is nonzero. NOTE: does * not necessarily return 1 on true. */ -static inline unsigned int +static INLINE unsigned int bitarray_is_set(bitarray_t *b, int bit) { return b[bit >> BITARRAY_SHIFT] & (1u << (bit & BITARRAY_MASK)); @@ -661,14 +607,14 @@ typedef struct { #define BIT(n) ((n) & set->mask) /** Add the digest digest to set. */ -static inline void +static INLINE void digestset_add(digestset_t *set, const char *digest) { - const uint64_t x = siphash24g(digest, 20); - const uint32_t d1 = (uint32_t) x; - const uint32_t d2 = (uint32_t)( (x>>16) + x); - const uint32_t d3 = (uint32_t)( (x>>32) + x); - const uint32_t d4 = (uint32_t)( (x>>48) + x); + const uint32_t *p = (const uint32_t *)digest; + const uint32_t d1 = p[0] + (p[1]>>16); + const uint32_t d2 = p[1] + (p[2]>>16); + const uint32_t d3 = p[2] + (p[3]>>16); + const uint32_t d4 = p[3] + (p[0]>>16); bitarray_set(set->ba, BIT(d1)); bitarray_set(set->ba, BIT(d2)); bitarray_set(set->ba, BIT(d3)); @@ -677,14 +623,14 @@ digestset_add(digestset_t *set, const char *digest) /** If digest is in set, return nonzero. Otherwise, * probably return zero. */ -static inline int +static INLINE int digestset_contains(const digestset_t *set, const char *digest) { - const uint64_t x = siphash24g(digest, 20); - const uint32_t d1 = (uint32_t) x; - const uint32_t d2 = (uint32_t)( (x>>16) + x); - const uint32_t d3 = (uint32_t)( (x>>32) + x); - const uint32_t d4 = (uint32_t)( (x>>48) + x); + const uint32_t *p = (const uint32_t *)digest; + const uint32_t d1 = p[0] + (p[1]>>16); + const uint32_t d2 = p[1] + (p[2]>>16); + const uint32_t d3 = p[2] + (p[3]>>16); + const uint32_t d4 = p[3] + (p[0]>>16); return bitarray_is_set(set->ba, BIT(d1)) && bitarray_is_set(set->ba, BIT(d2)) && bitarray_is_set(set->ba, BIT(d3)) && @@ -693,8 +639,7 @@ digestset_contains(const digestset_t *set, const char *digest) #undef BIT digestset_t *digestset_new(int max_elements); -void digestset_free_(digestset_t* set); -#define digestset_free(set) FREE_AND_NULL(digestset_t, digestset_free_, (set)) +void digestset_free(digestset_t* set); /* These functions, given an array of n_elements, return the * nth lowest element. nth=0 gives the lowest element; @@ -706,37 +651,31 @@ double find_nth_double(double *array, int n_elements, int nth); int32_t find_nth_int32(int32_t *array, int n_elements, int nth); uint32_t find_nth_uint32(uint32_t *array, int n_elements, int nth); long find_nth_long(long *array, int n_elements, int nth); -static inline int +static INLINE int median_int(int *array, int n_elements) { return find_nth_int(array, n_elements, (n_elements-1)/2); } -static inline time_t +static INLINE time_t median_time(time_t *array, int n_elements) { return find_nth_time(array, n_elements, (n_elements-1)/2); } -static inline double +static INLINE double median_double(double *array, int n_elements) { return find_nth_double(array, n_elements, (n_elements-1)/2); } -static inline uint32_t +static INLINE uint32_t median_uint32(uint32_t *array, int n_elements) { return find_nth_uint32(array, n_elements, (n_elements-1)/2); } -static inline int32_t +static INLINE int32_t median_int32(int32_t *array, int n_elements) { return find_nth_int32(array, n_elements, (n_elements-1)/2); } -static inline uint32_t -third_quartile_uint32(uint32_t *array, int n_elements) -{ - return find_nth_uint32(array, n_elements, (n_elements*3)/4); -} - -#endif /* !defined(TOR_CONTAINER_H) */ +#endif diff --git a/src/tor/contrib/README b/src/tor/contrib/README deleted file mode 100644 index 3a94bb501..000000000 --- a/src/tor/contrib/README +++ /dev/null @@ -1,68 +0,0 @@ -The contrib/ directory contains small tools that might be useful for using -with Tor. A few of them are included in the Tor source distribution; you can -find the others in the main Tor repository. We don't guarantee that they're -particularly useful. - -dirauth-tools/ -- Tools useful for directory authority administrators ---------------------------------------------------------------------- - -add-tor is an old script to manipulate the approved-routers file. - -nagios-check-tor-authority-cert is a nagios script to check when Tor -authority certificates are expired or nearly expired. - -clang/ -- Files for use with the clang compiler ------------------------------------------------ - -sanitize_blacklist.txt is used to build Tor with clang's dynamic -AddressSanitizer and UndefinedBehaviorSanitizer. It contains detailed -instructions on configuration, build, and testing with clang's sanitizers. - -client-tools/ -- Tools for use with Tor clients ------------------------------------------------ - -torify is a small wrapper script around torsocks. - -tor-resolve.py uses Tor's SOCKS port extensions to perform DNS lookups. You -should probably use src/tools/tor-resolve instead. - -dist/ -- Scripts and files for use when packaging Tor ------------------------------------------------------ - -torctl, rc.subr, and tor.sh are init scripts for use with SysV-style init -tools. Everybody likes to write init scripts differently, it seems. - -tor.service is a sample service file for use with systemd. - -The suse/ subdirectory contains files used by the suse distribution. - -operator-tools/ -- Tools for Tor relay operators ------------------------------------------------- - -tor-exit-notice.html is an HTML file for use with the DirPortFrontPage -option. It tells visitors that your relay is a Tor exit node, and that they -shouldn't assume you're the origin for the traffic that you're delivering. - -tor.logrotate is a configuration file for use with the logrotate tool. You -may need to edit it to work for you. - -linux-tor-prio.sh uses Linux iptables tools to traffic-shape your Tor relay's -traffic. If it breaks, you get to keep both pieces. - -or-tools/ -- Tools for interacting with relays ----------------------------------------------- - -checksocks.pl is a tool to scan relays to see if any of them have advertised -public SOCKS ports, so we can tell them not to. - -check-tor is a quick shell script to try doing a TLS handshake with a router -or to try fetching a directory from it. - -exitlist is a precursor of check.torproject.org: it parses a bunch of cached -server descriptors to determine which can connect to a given address:port. - -win32build -- Old files for windows packaging ---------------------------------------------- - -You shouldn't need these unless you're building some of the older Windows -packages. diff --git a/src/tor/contrib/clang/sanitize_blacklist.txt b/src/tor/contrib/clang/sanitize_blacklist.txt deleted file mode 100644 index c71cc4d87..000000000 --- a/src/tor/contrib/clang/sanitize_blacklist.txt +++ /dev/null @@ -1,103 +0,0 @@ -# clang sanitizer special case list -# syntax specified in http://clang.llvm.org/docs/SanitizerSpecialCaseList.html -# for more info see http://clang.llvm.org/docs/AddressSanitizer.html - -# -# Tor notes: This file is obsolete! -# -# It was necessary in order to apply the sanitizers to all of tor. But -# we don't believe that's a good idea: some parts of tor need constant-time -# behavior that is hard to guarantee with these sanitizers. -# -# If you need this behavior, then please consider --enable-expensive-hardening, -# and report bugs as needed. -# - -# usage: -# 1. configure tor build: -# ./configure \ -# CC=clang \ -# CFLAGS="-fsanitize-blacklist=contrib/clang/sanitize_blacklist.txt -fsanitize=undefined -fsanitize=address -fno-sanitize-recover=all -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline" \ -# LDFLAGS="-fsanitize=address" \ -# --disable-gcc-hardening -# and any other flags required to build tor on your OS. -# -# 2. build tor: -# make -# -# 3. test tor: -# ASAN_OPTIONS=allow_user_segv_handler=1 make test -# ASAN_OPTIONS=allow_user_segv_handler=1 make check -# make test-network # requires chutney -# -# 4. the tor binary is now instrumented with clang sanitizers, -# and can be run just like a standard tor binary - -# Compatibility: -# This blacklist has been tested with clang 3.7's UndefinedBehaviorSanitizer -# and AddressSanitizer on OS X 10.10 Yosemite, with all tests passing -# on both x86_64 and i386 (using CC="clang -arch i386") -# It has not been tested with ThreadSanitizer or MemorySanitizer -# Success report and patches for other sanitizers or OSs are welcome - -# ccache and make don't account for the sanitizer blacklist as a dependency -# you might need to set CCACHE_DISABLE=1 and/or use make clean to workaround - -# Configuration Flags: -# -fno-sanitize-recover=all -# causes clang to crash on undefined behavior, rather than printing -# a warning and continuing (the AddressSanitizer always crashes) -# -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline -# make clang backtraces easier to read -# --disable-gcc-hardening -# disables warnings about the redefinition of _FORTIFY_SOURCE -# (it conflicts with the sanitizers) - -# Turning the sanitizers off for particular functions: -# (Unfortunately, exempting functions doesn't work for the blacklisted -# functions below, and we can't turn the code off because it's essential) -# -# #if defined(__has_feature) -# #if __has_feature(address_sanitizer) -# /* tell clang AddressSanitizer not to instrument this function */ -# #define NOASAN __attribute__((no_sanitize_address)) -# #define _CLANG_ASAN_ -# #else -# #define NOASAN -# #endif -# #else -# #define NOASAN -# #endif -# -# /* Telling AddressSanitizer to not instrument a function */ -# void func(void) NOASAN; -# -# /* Including or excluding sections of code */ -# #ifdef _CLANG_ASAN_ -# /* code that only runs under address sanitizer */ -# #else -# /* code that doesn't run under address sanitizer */ -# #endif - -# Blacklist Entries: - -# test-memwipe.c checks if a freed buffer was properly wiped -fun:vmemeq -fun:check_a_buffer - -# we need to allow the tor bt handler to catch SIGSEGV -# otherwise address sanitizer munges the expected output and the test fails -# we can do this by setting an environmental variable -# See https://code.google.com/p/address-sanitizer/wiki/Flags -# ASAN_OPTIONS=allow_user_segv_handler=1 - -# test_bt_cl.c stores to a NULL pointer to trigger a crash -fun:crash - -# curve25519-donna.c left-shifts 1 bits into and past the sign bit of signed -# integers. Until #13538 is resolved, we exempt functions that do left shifts. -# Note that x86_64 uses curve25519-donna-c64.c instead of curve25519-donna.c -fun:freduce_coefficients -fun:freduce_degree -fun:s32_eq -fun:fcontract diff --git a/src/tor/contrib/client-tools/tor-resolve.py b/src/tor/contrib/client-tools/tor-resolve.py deleted file mode 100644 index 47ae1a0c3..000000000 --- a/src/tor/contrib/client-tools/tor-resolve.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/python - -import socket -import struct -import sys - -def socks4AResolveRequest(hostname): - version = 4 - command = 0xF0 - port = 0 - addr = 0x0000001 - username = "" - reqheader = struct.pack("!BBHL", version, command, port, addr) - return "%s%s\x00%s\x00"%(reqheader,username,hostname) - -def socks4AParseResponse(response): - RESPONSE_LEN = 8 - if len(response) < RESPONSE_LEN: - return None - assert len(response) >= RESPONSE_LEN - version,status,port = struct.unpack("!BBH",response[:4]) - assert version == 0 - assert port == 0 - if status == 90: - return "%d.%d.%d.%d"%tuple(map(ord, response[4:])) - else: - return "ERROR (status %d)"%status - -def socks5Hello(): - return "\x05\x01\x00" -def socks5ParseHello(response): - if response != "\x05\x00": - raise ValueError("Bizarre socks5 response") -def socks5ResolveRequest(hostname, atype=0x03, command=0xF0): - version = 5 - rsv = 0 - port = 0 - reqheader = struct.pack("!BBBB",version, command, rsv, atype) - if atype == 0x03: - reqheader += struct.pack("!B", len(hostname)) - portstr = struct.pack("!H",port) - return "%s%s%s"%(reqheader,hostname,portstr) - -def socks5ParseResponse(r): - if len(r)<8: - return None - version, reply, rsv, atype = struct.unpack("!BBBB",r[:4]) - assert version==5 - assert rsv==0 - if reply != 0x00: - return "ERROR",reply - assert atype in (0x01,0x03,0x04) - if atype != 0x03: - expected_len = 4 + ({1:4,4:16}[atype]) + 2 - if len(r) < expected_len: - return None - elif len(r) > expected_len: - raise ValueError("Overlong socks5 reply!") - addr = r[4:-2] - if atype == 0x01: - return "%d.%d.%d.%d"%tuple(map(ord,addr)) - else: - # not really the right way to format IPv6 - return "IPv6: %s"%(":".join([hex(ord(c)) for c in addr])) - else: - hlen, = struct.unpack("!B", r[4]) - expected_len = 5 + hlen + 2 - if len(r) < expected_len: - return None - return r[5:-2] - -def socks5ResolvePTRRequest(hostname): - return socks5ResolveRequest(socket.inet_aton(hostname), - atype=1, command = 0xF1) - - -def parseHostAndPort(h): - host, port = "localhost", 9050 - if ":" in h: - i = h.index(":") - host = h[:i] - try: - port = int(h[i+1:]) - except ValueError: - print "Bad hostname %r"%h - sys.exit(1) - elif h: - try: - port = int(h) - except ValueError: - host = h - - return host, port - -def resolve(hostname, sockshost, socksport, socksver=4, reverse=0): - assert socksver in (4,5) - if socksver == 4: - fmt = socks4AResolveRequest - parse = socks4AParseResponse - elif not reverse: - fmt = socks5ResolveRequest - parse = socks5ParseResponse - else: - fmt = socks5ResolvePTRRequest - parse = socks5ParseResponse - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((sockshost,socksport)) - if socksver == 5: - s.send(socks5Hello()) - socks5ParseHello(s.recv(2)) - s.send(fmt(hostname)) - answer = s.recv(6) - result = parse(answer) - while result is None: - more = s.recv(1) - if not more: - return None - answer += more - result = parse(answer) - print "Got answer",result - m = s.recv(1) - if m: - print "Got extra data too: %r"%m - return result - -if __name__ == '__main__': - if len(sys.argv) not in (2,3,4): - print "Syntax: resolve.py [-4|-5] hostname [sockshost:socksport]" - sys.exit(0) - socksver = 4 - reverse = 0 - while sys.argv[1][0] == '-': - if sys.argv[1] in ("-4", "-5"): - socksver = int(sys.argv[1][1]) - del sys.argv[1] - elif sys.argv[1] == '-x': - reverse = 1 - del sys.argv[1] - elif sys.argv[1] == '--': - break - - if len(sys.argv) >= 4: - print "Syntax: resolve.py [-x] [-4|-5] hostname [sockshost:socksport]" - sys.exit(0) - if len(sys.argv) == 3: - sh,sp = parseHostAndPort(sys.argv[2]) - else: - sh,sp = parseHostAndPort("") - - if reverse and socksver == 4: - socksver = 5 - resolve(sys.argv[1], sh, sp, socksver, reverse) diff --git a/src/tor/contrib/client-tools/torify b/src/tor/contrib/client-tools/torify deleted file mode 100644 index 54acfed65..000000000 --- a/src/tor/contrib/client-tools/torify +++ /dev/null @@ -1,61 +0,0 @@ -#! /bin/sh - -# This script used to call (the now deprecated) tsocks as a fallback in case -# torsocks wasn't installed. -# Now, it's just a backwards compatible shim around torsocks with reasonable -# behavior if -v/--verbose or -h/--help arguments are passed. -# -# Copyright (c) 2004, 2006, 2009 Peter Palfrader -# Modified by Jacob Appelbaum April 16th 2006 -# Stripped of all the tsocks cruft by ugh on February 22nd 2012 -# May be distributed under the same terms as Tor itself - - -compat() { - echo "torify is now just a wrapper around torsocks(1) for backwards compatibility." -} - -usage() { - compat - echo "Usage: $0 [-hv] [...]" -} - -case $# in 0) - usage >&2 - exit 1 -esac - -case $# in 1) - case $1 in -h|--help) - usage - exit 0 - esac -esac - -case $1 in -v|--verbose) - compat >&2 - shift -esac - -# taken from Debian's Developer's Reference, 6.4 -pathfind() { - OLDIFS="$IFS" - IFS=: - for p in $PATH; do - if [ -x "$p/$*" ]; then - IFS="$OLDIFS" - return 0 - fi - done - IFS="$OLDIFS" - return 1 -} - -if pathfind torsocks; then - exec torsocks "$@" - echo "$0: Failed to exec torsocks $@" >&2 - exit 1 -else - echo "$0: torsocks not found in your PATH. Perhaps it isn't installed? (tsocks is no longer supported, for security reasons.)" >&2 -fi - diff --git a/src/tor/contrib/dirauth-tools/add-tor b/src/tor/contrib/dirauth-tools/add-tor deleted file mode 100644 index 5a12abca8..000000000 --- a/src/tor/contrib/dirauth-tools/add-tor +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/ruby - -# add-tor - Add a tor fingerprint line to the approved-routers file -# -# Tor's approved-routers file is expected to be versioned using RCS. -# This script checks for uncommitted changes, does a checkout of the -# file, adds the new fingerprint with a comment stating the server's -# operator, and commits the file to RCS again (using -u so that the -# working copy is not removed. -# -# Operator and fingerprint line are read from stdin. -# -# Before adding a fingerprint line, approved-routers is checked for -# rough syntactical correctness. This script also checks that the -# nickname and fingerprint to be added do not already exist in the -# binding list. - - -# Copyright (c) 2006 by Peter Palfrader -# -# 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. - -BINDING = '/etc/tor/approved-routers' - -def mysys(cmd) - unless system(cmd) - STDERR.puts "ERROR: #{cmd} failed" - exit 1 - end -end - -def check_nick(n) - n =~ /^[a-zA-Z0-9]+$/ -end - -def check_fpr(fpr) - fpr =~ /^([0-9A-F]{4} ){9}[0-9A-F]{4}$/ -end - -def parse_fprline(fprline) - n = fprline[0 ... fprline.index(' ')] - f = fprline[fprline.index(' ') + 1 .. -1 ] - unless check_nick(n) and check_fpr(f) - STDERR.puts "Invalid fpr syntax '#{fprline}'" - exit 1 - end - [n, f] -end - - - -unless system("rcsdiff -q -u #{BINDING}") - STDERR.puts "Uncommitted changes in #{BINDING}. Aborting." - exit 1 -end - -puts "Checking out #{BINDING}..." -mysys("co -l #{BINDING}") - -print "Operator: " -@operator = readline.chop -unless @operator.index('@') - STDERR.puts "ERROR: No @ found" - exit 1 -end - -print "FPR Line: " -@fprline = readline.chop -(@nickname, @fpr) = parse_fprline(@fprline) - -binding = File.new(BINDING, "r+") -binding.readlines.each do |line| - line.chop! - next if line[0..0] == "#" - (n,f) = parse_fprline(line) - if (n == @nickname) - STDERR.puts - STDERR.puts "ERROR: Nickname #{n} already exists in #{BINDING} (fpr: #{f})" - exit 1 - end - if (f == @fpr) - STDERR.puts - STDERR.puts "ERROR: Fpr #{f} already exists in #{BINDING} (nickname: #{n})" - exit 1 - end -end - -puts -puts '| # ' + @operator -puts '| ' + @fprline -puts - -binding.puts '# '+@operator -binding.puts @fprline -binding.close - -puts "Committing #{BINDING}..." -mysys("ci -u -m'Add #{@nickname}' #{BINDING}") diff --git a/src/tor/contrib/dirauth-tools/nagios-check-tor-authority-cert b/src/tor/contrib/dirauth-tools/nagios-check-tor-authority-cert deleted file mode 100644 index 46dc7284b..000000000 --- a/src/tor/contrib/dirauth-tools/nagios-check-tor-authority-cert +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -# nagios-check-tor-authority-cert - check certificate expiry time - -# A nagios check for Tor v3 directory authorities: -# - Checks the current certificate expiry time -# -# Usage: nagios-check-tor-authority-cert -# e.g.: nagios-check-tor-authority-cert A9AC67E64B200BBF2FA26DF194AC0469E2A948C6 - -# Copyright (c) 2008 Peter Palfrader -# -# 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. - - -set -e -set -u - -if [ -z "${1:-}" ]; then - echo "Usage: $0 " 2>&1 - exit 3 -fi - -identity="$1" - -DIRSERVERS="" -DIRSERVERS="$DIRSERVERS 86.59.21.38:80" # tor26 -DIRSERVERS="$DIRSERVERS 128.31.0.34:9031" # moria1 -DIRSERVERS="$DIRSERVERS 216.224.124.114:9030" # ides -DIRSERVERS="$DIRSERVERS 80.190.246.100:80" # gabelmoo -#DIRSERVERS="$DIRSERVERS 140.247.60.64:80" # lefkada -DIRSERVERS="$DIRSERVERS 194.109.206.212:80" # dizum -DIRSERVERS="$DIRSERVERS 213.73.91.31:80" # dannenberg - -TMPFILE="`tempfile`" -trap 'rm -f "$TMPFILE"' 0 - -for dirserver in $DIRSERVERS; do - wget -q -O "$TMPFILE" "http://$dirserver/tor/keys/fp/$identity" - if [ "$?" = 0 ]; then - break - else - cat /dev/null > "$TMPFILE" - continue - fi -done - -if ! [ -s "$TMPFILE" ] ; then - echo "UNKNOWN: Downloading certificate for $identity failed." - exit 3 -fi - -expirydate="$(awk '$1=="dir-key-expires" {printf "%s %s", $2, $3}' < "$TMPFILE")" -expiryunix=$(TZ=UTC date -d "$expirydate" +%s) -now=$(date +%s) - -if [ "$now" -ge "$expiryunix" ]; then - echo "CRITICAL: Certificate expired $expirydate (authority $identity)." - exit 2 -elif [ "$(( $now + 7*24*60*60 ))" -ge "$expiryunix" ]; then - echo "CRITICAL: Certificate expires $expirydate (authority $identity)." - exit 2 -elif [ "$(( $now + 30*24*60*60 ))" -ge "$expiryunix" ]; then - echo "WARNING: Certificate expires $expirydate (authority $identity)." - exit 1 -else - echo "OK: Certificate expires $expirydate (authority $identity)." - exit 0 -fi diff --git a/src/tor/contrib/dist/rc.subr b/src/tor/contrib/dist/rc.subr deleted file mode 100644 index d757e8952..000000000 --- a/src/tor/contrib/dist/rc.subr +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -# $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $ -# -# (rc.subr written by Peter Thoenen for Net/FreeBSD) -# -# REQUIRE: NETWORKING SERVERS USR -# BEFORE: LOGIN -# -# Add the following lines to /etc/rc.conf to enable tor -# -# tor_enable (bool): Set to "NO" by default -# Set it to "YES" to enable tor -# tor_conf (str): Points to your tor conf file -# Default: /usr/local/etc/tor/torrc -# tor_user (str): Tor Daemon user. Default _tor -# - -. /etc/rc.subr - -name="tor" -rcvar=${name}_enable - -load_rc_config ${name} - -: ${tor_enable="NO"} -: ${tor_conf="/usr/local/etc/tor/torrc"} -: ${tor_user="_tor"} -: ${tor_pidfile="/var/run/tor/tor.pid"} -: ${tor_logfile="/var/log/tor"} -: ${tor_datadir="/var/run/tor"} - -required_files=${tor_conf} -required_dirs=${tor_datadir} -command="/usr/local/bin/${name}" -command_args="-f ${tor_conf} --pidfile ${tor_pidfile} --runasdaemon 1 --datadirectory ${tor_datadir} --user ${tor_user}" -extra_commands="log" -log_cmd="${name}_log" - -tor_log() { - cat ${tor_logfile} -} - -run_rc_command "$1" diff --git a/src/tor/contrib/dist/suse/tor.sh.in b/src/tor/contrib/dist/suse/tor.sh.in deleted file mode 100644 index b7e9005eb..000000000 --- a/src/tor/contrib/dist/suse/tor.sh.in +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2006-2007 Andrew Lewman -# -# tor The Onion Router -# -# Startup/shutdown script for tor. This is a wrapper around torctl; -# torctl does the actual work in a relatively system-independent, or at least -# distribution-independent, way, and this script deals with fitting the -# whole thing into the conventions of the particular system at hand. -# -# These next couple of lines "declare" tor for the "chkconfig" program, -# originally from SGI, used on Red Hat/Fedora and probably elsewhere. -# -# chkconfig: 2345 90 10 -# description: Onion Router - A low-latency anonymous proxy -# - -### BEGIN INIT INFO -# Provides: tor -# Required-Start: $remote_fs $network -# Required-Stop: $remote_fs $network -# Default-Start: 3 5 -# Default-Stop: 0 1 2 6 -# Short-Description: Start the tor daemon -# Description: Start the tor daemon: the anon-proxy server -### END INIT INFO - -. /etc/rc.status - -# Shell functions sourced from /etc/rc.status: -# rc_check check and set local and overall rc status -# rc_status check and set local and overall rc status -# rc_status -v ditto but be verbose in local rc status -# rc_status -v -r ditto and clear the local rc status -# rc_failed set local and overall rc status to failed -# rc_reset clear local rc status (overall remains) -# rc_exit exit appropriate to overall rc status - -# First reset status of this service -rc_reset - -# Increase open file descriptors a reasonable amount -ulimit -n 8192 - -TORCTL=@BINDIR@/torctl - -# torctl will use these environment variables -TORUSER=@TORUSER@ -export TORUSER -TORGROUP=@TORGROUP@ -export TORGROUP - -TOR_DAEMON_PID_DIR="@LOCALSTATEDIR@/run/tor" - -if [ -x /bin/su ] ; then - SUPROG=/bin/su -elif [ -x /sbin/su ] ; then - SUPROG=/sbin/su -elif [ -x /usr/bin/su ] ; then - SUPROG=/usr/bin/su -elif [ -x /usr/sbin/su ] ; then - SUPROG=/usr/sbin/su -else - SUPROG=/bin/su -fi - -case "$1" in - - start) - echo "Starting tor daemon" - - if [ ! -d $TOR_DAEMON_PID_DIR ] ; then - mkdir -p $TOR_DAEMON_PID_DIR - chown $TORUSER:$TORGROUP $TOR_DAEMON_PID_DIR - fi - - ## Start daemon with startproc(8). If this fails - ## the echo return value is set appropriate. - - startproc -f $TORCTL start - # Remember status and be verbose - rc_status -v - ;; - - stop) - echo "Stopping tor daemon" - startproc -f $TORCTL stop - # Remember status and be verbose - rc_status -v - ;; - - restart) - echo "Restarting tor daemon" - startproc -f $TORCTL restart - # Remember status and be verbose - rc_status -v - ;; - - reload) - echo "Reloading tor daemon" - startproc -f $TORCTL reload - # Remember status and be verbose - rc_status -v - ;; - - status) - startproc -f $TORCTL status - # Remember status and be verbose - rc_status -v - ;; - - *) - echo "Usage: $0 (start|stop|restart|reload|status)" - RETVAL=1 -esac - -rc_exit diff --git a/src/tor/contrib/dist/tor.service.in b/src/tor/contrib/dist/tor.service.in deleted file mode 100644 index 9c1a255b2..000000000 --- a/src/tor/contrib/dist/tor.service.in +++ /dev/null @@ -1,35 +0,0 @@ -# tor.service -- this systemd configuration file for Tor sets up a -# relatively conservative, hardened Tor service. You may need to -# edit it if you are making changes to your Tor configuration that it -# does not allow. Package maintainers: this should be a starting point -# for your tor.service; it is not the last point. - -[Unit] -Description=Anonymizing overlay network for TCP -After=syslog.target network.target nss-lookup.target - -[Service] -Type=notify -NotifyAccess=all -ExecStartPre=@BINDIR@/tor -f @CONFDIR@/torrc --verify-config -ExecStart=@BINDIR@/tor -f @CONFDIR@/torrc -ExecReload=/bin/kill -HUP ${MAINPID} -KillSignal=SIGINT -TimeoutSec=30 -Restart=on-failure -WatchdogSec=1m -LimitNOFILE=32768 - -# Hardening -PrivateTmp=yes -PrivateDevices=yes -ProtectHome=yes -ProtectSystem=full -ReadOnlyDirectories=/ -ReadWriteDirectories=-@LOCALSTATEDIR@/lib/tor -ReadWriteDirectories=-@LOCALSTATEDIR@/log/tor -NoNewPrivileges=yes -CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE - -[Install] -WantedBy=multi-user.target diff --git a/src/tor/contrib/dist/tor.sh.in b/src/tor/contrib/dist/tor.sh.in deleted file mode 100644 index 92f890681..000000000 --- a/src/tor/contrib/dist/tor.sh.in +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/sh -# -# tor The Onion Router -# -# Startup/shutdown script for tor. This is a wrapper around torctl; -# torctl does the actual work in a relatively system-independent, or at least -# distribution-independent, way, and this script deals with fitting the -# whole thing into the conventions of the particular system at hand. -# This particular script is written for Red Hat/Fedora Linux, and may -# also work on Mandrake, but not SuSE. -# -# These next couple of lines "declare" tor for the "chkconfig" program, -# originally from SGI, used on Red Hat/Fedora and probably elsewhere. -# -# chkconfig: 2345 90 10 -# description: Onion Router - A low-latency anonymous proxy -# - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -DAEMON=/usr/sbin/tor -NAME=tor -DESC="tor daemon" -TORPIDDIR=/var/run/tor -TORPID=$TORPIDDIR/tor.pid -WAITFORDAEMON=60 -ARGS="" - -# Library functions -if [ -f /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -elif [ -f /etc/init.d/functions ]; then - . /etc/init.d/functions -fi - -TORCTL=@BINDIR@/torctl - -# torctl will use these environment variables -TORUSER=@TORUSER@ -export TORUSER - -if [ -x /bin/su ] ; then - SUPROG=/bin/su -elif [ -x /sbin/su ] ; then - SUPROG=/sbin/su -elif [ -x /usr/bin/su ] ; then - SUPROG=/usr/bin/su -elif [ -x /usr/sbin/su ] ; then - SUPROG=/usr/sbin/su -else - SUPROG=/bin/su -fi - -# Raise ulimit based on number of file descriptors available (thanks, Debian) - -if [ -r /proc/sys/fs/file-max ]; then - system_max=`cat /proc/sys/fs/file-max` - if [ "$system_max" -gt "80000" ] ; then - MAX_FILEDESCRIPTORS=32768 - elif [ "$system_max" -gt "40000" ] ; then - MAX_FILEDESCRIPTORS=16384 - elif [ "$system_max" -gt "10000" ] ; then - MAX_FILEDESCRIPTORS=8192 - else - MAX_FILEDESCRIPTORS=1024 - cat << EOF - -Warning: Your system has very few filedescriptors available in total. - -Maybe you should try raising that by adding 'fs.file-max=100000' to your -/etc/sysctl.conf file. Feel free to pick any number that you deem appropriate. -Then run 'sysctl -p'. See /proc/sys/fs/file-max for the current value, and -file-nr in the same directory for how many of those are used at the moment. - -EOF - fi -else - MAX_FILEDESCRIPTORS=8192 -fi - -NICE="" - -case "$1" in - - start) - if [ -n "$MAX_FILEDESCRIPTORS" ]; then - echo -n "Raising maximum number of filedescriptors (ulimit -n) to $MAX_FILEDESCRIPTORS" - if ulimit -n "$MAX_FILEDESCRIPTORS" ; then - echo "." - else - echo ": FAILED." - fi - fi - - action $"Starting tor:" $TORCTL start - RETVAL=$? - ;; - - stop) - action $"Stopping tor:" $TORCTL stop - RETVAL=$? - ;; - - restart) - action $"Restarting tor:" $TORCTL restart - RETVAL=$? - ;; - - reload) - action $"Reloading tor:" $TORCTL reload - RETVAL=$? - ;; - - status) - $TORCTL status - RETVAL=$? - ;; - - *) - echo "Usage: $0 (start|stop|restart|reload|status)" - RETVAL=1 -esac - -exit $RETVAL diff --git a/src/tor/contrib/dist/torctl.in b/src/tor/contrib/dist/torctl.in deleted file mode 100644 index 4cc137da4..000000000 --- a/src/tor/contrib/dist/torctl.in +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/sh -# -# TOR control script designed to allow an easy command line interface -# to controlling The Onion Router -# -# The exit codes returned are: -# 0 - operation completed successfully. For "status", tor running. -# 1 - For "status", tor not running. -# 2 - Command not supported -# 3 - Could not be started or reloaded -# 4 - Could not be stopped -# 5 - -# 6 - -# 7 - -# 8 - -# -# When multiple arguments are given, only the error from the _last_ -# one is reported. -# -# -# |||||||||||||||||||| START CONFIGURATION SECTION |||||||||||||||||||| -# -------------------- -------------------- -# Name of the executable -EXEC=tor -# -# the path to your binary, including options if necessary -TORBIN="@BINDIR@/$EXEC" -# -# the path to the configuration file -TORCONF="@CONFDIR@/torrc" -# -# the path to your PID file -PIDFILE="@LOCALSTATEDIR@/run/tor/tor.pid" -# -# The path to the log file -LOGFILE="@LOCALSTATEDIR@/log/tor/tor.log" -# -# The path to the datadirectory -TORDATA="@LOCALSTATEDIR@/lib/tor" -# -TORARGS="--pidfile $PIDFILE --log \"notice file $LOGFILE\" --runasdaemon 1" -TORARGS="$TORARGS --datadirectory $TORDATA" - -# If user name is set in the environment, then use it; -# otherwise run as the invoking user (or whatever user the config -# file says)... unless the invoking user is root. The idea here is to -# let an unprivileged user run tor for her own use using this script, -# while still providing for it to be used as a system daemon. -if [ "x`id -u`" = "x0" ]; then - TORUSER=@TORUSER@ -fi - -if [ "x$TORUSER" != "x" ]; then - TORARGS="$TORARGS --user $TORUSER" -fi - -# We no longer wrap the Tor daemon startup in an su when running as -# root, because it's too painful to make the use of su portable. -# Just let the daemon set the UID and GID. -START="$TORBIN -f $TORCONF $TORARGS" - -# -# -------------------- -------------------- -# |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| - -ERROR=0 -ARGV="$@" -if [ "x$ARGV" = "x" ] ; then - ARGS="help" -fi - -checkIfRunning ( ) { - # check for pidfile - PID=unknown - if [ -f $PIDFILE ] ; then - PID=`/bin/cat $PIDFILE` - if [ "x$PID" != "x" ] ; then - if kill -0 $PID 2>/dev/null ; then - STATUS="$EXEC (pid $PID) running" - RUNNING=1 - else - STATUS="PID file ($PIDFILE) present, but $EXEC ($PID) not running" - RUNNING=0 - fi - else - STATUS="$EXEC (pid $PID?) not running" - RUNNING=0 - fi - else - STATUS="$EXEC apparently not running (no pid file)" - RUNNING=0 - fi - return -} - -for ARG in $@ $ARGS -do - checkIfRunning - - case $ARG in - start) - if [ $RUNNING -eq 1 ]; then - echo "$0 $ARG: $EXEC (pid $PID) already running" - continue - fi - if eval "$START" ; then - echo "$0 $ARG: $EXEC started" - # Make sure it stayed up! - /bin/sleep 1 - checkIfRunning - if [ $RUNNING -eq 0 ]; then - echo "$0 $ARG: $EXEC (pid $PID) quit unexpectedly" - fi - else - echo "$0 $ARG: $EXEC could not be started" - ERROR=3 - fi - ;; - stop) - if [ $RUNNING -eq 0 ]; then - echo "$0 $ARG: $STATUS" - continue - fi - if kill -15 $PID ; then - echo "$0 $ARG: $EXEC stopped" - else - /bin/sleep 1 - if kill -9 $PID ; then - echo "$0 $ARG: $EXEC stopped" - else - echo "$0 $ARG: $EXEC could not be stopped" - ERROR=4 - fi - fi - # Make sure it really died! - /bin/sleep 1 - checkIfRunning - if [ $RUNNING -eq 1 ]; then - echo "$0 $ARG: $EXEC (pid $PID) unexpectedly still running" - ERROR=4 - fi - ;; - restart) - $0 stop start - ;; - reload) - if [ $RUNNING -eq 0 ]; then - echo "$0 $ARG: $STATUS" - continue - fi - if kill -1 $PID; then - /bin/sleep 1 - echo "$EXEC (PID $PID) reloaded" - else - echo "Can't reload $EXEC" - ERROR=3 - fi - ;; - status) - echo $STATUS - if [ $RUNNING -eq 1 ]; then - ERROR=0 - else - ERROR=1 - fi - ;; - log) - cat $LOGFILE - ;; - help) - echo "usage: $0 (start|stop|restart|status|help)" - /bin/cat < -# int main(int argc, char **argv) { -# if(initgroups("tor", GID) == -1) { perror("initgroups"); return 1; } -# if(setresgid(GID, GID, GID) == -1) { perror("setresgid"); return 1; } -# if(setresuid(UID, UID, UID) == -1) { perror("setresuid"); return 1; } -# execl("/bin/tor", "/bin/tor", "-f", "/etc/tor/torrc", NULL); -# perror("execl"); return 1; -# } - -# IP BASED PRIORITIZATION -# -# The IP setting requires that a separate IP address be dedicated to Tor. -# Your Torrc should be set to bind to this IP for "OutboundBindAddress", -# "ListenAddress", and "Address". - -# GENERAL USAGE -# -# You should also tune the individual connection rate parameters below -# to your individual connection. In particular, you should leave *some* -# minimum amount of bandwidth for Tor, so that Tor users are not -# completely choked out when you use your server's bandwidth. 30% is -# probably a reasonable choice. More is better of course. -# -# To start the shaping, run it as: -# ./linux-tor-prio.sh -# -# To get status information (useful to verify packets are getting marked -# and prioritized), run: -# ./linux-tor-prio.sh status -# -# And to stop prioritization: -# ./linux-tor-prio.sh stop -# -######################################################################## - -# BEGIN USER TUNABLE PARAMETERS - -DEV=eth0 - -# NOTE! You must START Tor under this UID. Using the Tor User -# config setting is NOT sufficient. See above. -TOR_UID=$(id -u tor) - -# If the UID mechanism doesn't work for you, you can set this parameter -# instead. If set, it will take precedence over the UID setting. Note that -# you need multiple IPs with one specifically devoted to Tor for this to -# work. -#TOR_IP="42.42.42.42" - -# Average ping to most places on the net, milliseconds -RTT_LATENCY=40 - -# RATE_UP must be less than your connection's upload capacity in -# kbits/sec. If it is larger, then the bottleneck will be at your -# router's queue, which you do not control. This will cause congestion -# and a revert to normal TCP fairness no matter what the queing -# priority is. -RATE_UP=5000 - -# RATE_UP_TOR is the minimum speed your Tor connections will have in -# kbits/sec. They will have at least this much bandwidth for upload. -# In general, you probably shouldn't set this too low, or else Tor -# users who use your node will be completely choked out whenever your -# machine does any other network activity. That is not very fun. -RATE_UP_TOR=1500 - -# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic in -# kbits/sec. -RATE_UP_TOR_CEIL=5000 - -CHAIN=OUTPUT -#CHAIN=PREROUTING -#CHAIN=POSTROUTING - -MTU=1500 -AVG_PKT=900 # should be more like 600 for non-exit nodes - -# END USER TUNABLE PARAMETERS - - - -# The queue size should be no larger than your bandwidth-delay -# product. This is RT latency*bandwidth/MTU/2 - -BDP=$(expr $RTT_LATENCY \* $RATE_UP / $AVG_PKT) - -# Further research indicates that the BDP calculations should use -# RTT/sqrt(n) where n is the expected number of active connections.. - -BDP=$(expr $BDP / 4) - -if [ "$1" = "status" ] -then - echo "[qdisc]" - tc -s qdisc show dev $DEV - tc -s qdisc show dev imq0 - echo "[class]" - tc -s class show dev $DEV - tc -s class show dev imq0 - echo "[filter]" - tc -s filter show dev $DEV - tc -s filter show dev imq0 - echo "[iptables]" - iptables -t mangle -L TORSHAPER-OUT -v -x 2> /dev/null - exit -fi - - -# Reset everything to a known state (cleared) -tc qdisc del dev $DEV root 2> /dev/null > /dev/null -tc qdisc del dev imq0 root 2> /dev/null > /dev/null -iptables -t mangle -D POSTROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null -iptables -t mangle -D PREROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null -iptables -t mangle -D OUTPUT -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null -iptables -t mangle -F TORSHAPER-OUT 2> /dev/null > /dev/null -iptables -t mangle -X TORSHAPER-OUT 2> /dev/null > /dev/null -ip link set imq0 down 2> /dev/null > /dev/null -rmmod imq 2> /dev/null > /dev/null - -if [ "$1" = "stop" ] -then - echo "Shaping removed on $DEV." - exit -fi - -# Outbound Shaping (limits total bandwidth to RATE_UP) - -ip link set dev $DEV qlen $BDP - -# Add HTB root qdisc, default is high prio -tc qdisc add dev $DEV root handle 1: htb default 20 - -# Add main rate limit class -tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATE_UP}kbit - -# Create the two classes, giving Tor at least RATE_UP_TOR kbit and capping -# total upstream at RATE_UP so the queue is under our control. -tc class add dev $DEV parent 1:1 classid 1:20 htb rate $(expr $RATE_UP - $RATE_UP_TOR)kbit ceil ${RATE_UP}kbit prio 0 -tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATE_UP_TOR]kbit ceil ${RATE_UP_TOR_CEIL}kbit prio 10 - -# Start up pfifo -tc qdisc add dev $DEV parent 1:20 handle 20: pfifo limit $BDP -tc qdisc add dev $DEV parent 1:21 handle 21: pfifo limit $BDP - -# filter traffic into classes by fwmark -tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20 -tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21 - -# add TORSHAPER-OUT chain to the mangle table in iptables -iptables -t mangle -N TORSHAPER-OUT -iptables -t mangle -I $CHAIN -o $DEV -j TORSHAPER-OUT - - -# Set firewall marks -# Low priority to Tor -if [ ""$TOR_IP == "" ] -then - echo "Using UID-based QoS. UID $TOR_UID marked as low priority." - iptables -t mangle -A TORSHAPER-OUT -m owner --uid-owner $TOR_UID -j MARK --set-mark 21 -else - echo "Using IP-based QoS. $TOR_IP marked as low priority." - iptables -t mangle -A TORSHAPER-OUT -s $TOR_IP -j MARK --set-mark 21 -fi - -# High prio for everything else -iptables -t mangle -A TORSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 20 - -echo "Outbound shaping added to $DEV. Rate for Tor upload at least: ${RATE_UP_TOR}Kbyte/sec." - diff --git a/src/tor/contrib/operator-tools/tor-exit-notice.html b/src/tor/contrib/operator-tools/tor-exit-notice.html deleted file mode 100644 index 8cf5c294f..000000000 --- a/src/tor/contrib/operator-tools/tor-exit-notice.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - -This is a Tor Exit Router - - - - - - -

This is a -Tor Exit Router

- -

-Most likely you are accessing this website because you had some issue with -the traffic coming from this IP. This router is part of the Tor Anonymity Network, which is -dedicated to providing -privacy to people who need it most: average computer users. This -router IP should be generating no other traffic, unless it has been -compromised.

- - - - -

- -How Tor works -

- -

-Tor sees use by many -important segments of the population, including whistle blowers, -journalists, Chinese dissidents skirting the Great Firewall and oppressive -censorship, abuse victims, stalker targets, the US military, and law -enforcement, just to name a few. While Tor is not designed for malicious -computer users, it is true that they can use the network for malicious ends. -In reality however, the actual amount of abuse is quite low. This -is largely because criminals and hackers have significantly better access to -privacy and anonymity than do the regular users whom they prey upon. Criminals -can and do build, -sell, and trade far larger and more -powerful networks than Tor on a daily basis. Thus, in the mind of this -operator, the social need for easily accessible censorship-resistant private, -anonymous communication trumps the risk of unskilled bad actors, who are -almost always more easily uncovered by traditional police work than by -extensive monitoring and surveillance anyway.

- -

-In terms of applicable law, the best way to understand Tor is to consider it a -network of routers operating as common carriers, much like the Internet -backbone. However, unlike the Internet backbone routers, Tor routers -explicitly do not contain identifiable routing information about the source of -a packet, and no single Tor node can determine both the origin and destination -of a given transmission.

- -

-As such, there is little the operator of this router can do to help you track -the connection further. This router maintains no logs of any of the Tor -traffic, so there is little that can be done to trace either legitimate or -illegitimate traffic (or to filter one from the other). Attempts to -seize this router will accomplish nothing.

- - - -

-Furthermore, this machine also serves as a carrier of email, which means that -its contents are further protected under the ECPA. 18 -USC 2707 explicitly allows for civil remedies ($1000/account -plus legal fees) -in the event of a seizure executed without good faith or probable cause (it -should be clear at this point that traffic with an originating IP address of -FIXME_DNS_NAME should not constitute probable cause to seize the -machine). Similar considerations exist for 1st amendment content on this -machine.

- - - -

-If you are a representative of a company who feels that this router is being -used to violate the DMCA, please be aware that this machine does not host or -contain any illegal content. Also be aware that network infrastructure -maintainers are not liable for the type of content that passes over their -equipment, in accordance with DMCA -"safe harbor" provisions. In other words, you will have just as much luck -sending a takedown notice to the Internet backbone providers. Please consult -EFF's prepared -response for more information on this matter.

- -

For more information, please consult the following documentation:

- -
    -
  1. Tor Overview
  2. -
  3. Tor Abuse FAQ
  4. -
  5. Tor Legal FAQ
  6. -
- -

-That being said, if you still have a complaint about the router, you may -email the maintainer. If -complaints are related to a particular service that is being abused, I will -consider removing that service from my exit policy, which would prevent my -router from allowing that traffic to exit through it. I can only do this on an -IP+destination port basis, however. Common P2P ports are -already blocked.

- -

-You also have the option of blocking this IP address and others on -the Tor network if you so desire. The Tor project provides a web service -to fetch a list of all IP addresses of Tor exit nodes that allow exiting to a -specified IP:port combination, and an official DNSRBL is also available to -determine if a given IP address is actually a Tor exit server. Please -be considerate -when using these options. It would be unfortunate to deny all Tor users access -to your site indefinitely simply because of a few bad apples.

- - - diff --git a/src/tor/contrib/operator-tools/tor.logrotate.in b/src/tor/contrib/operator-tools/tor.logrotate.in deleted file mode 100644 index 6e75f80bf..000000000 --- a/src/tor/contrib/operator-tools/tor.logrotate.in +++ /dev/null @@ -1,14 +0,0 @@ -@LOCALSTATEDIR@/log/tor/*log { - daily - rotate 5 - compress - delaycompress - missingok - notifempty - # you may need to change the username/groupname below - create 0640 _tor _tor - sharedscripts - postrotate - /etc/init.d/tor reload > /dev/null - endscript -} diff --git a/src/tor/contrib/or-tools/check-tor b/src/tor/contrib/or-tools/check-tor deleted file mode 100644 index e981a35fc..000000000 --- a/src/tor/contrib/or-tools/check-tor +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh - -## Originally written by Peter Palfrader. - -## This script lets you quickly check if a given router (by nickname) -## will let you do a TLS handshake, or will let you download a directory. - -## Usage: check-tor nickname - -#set -x - -router="$1" -dirserver="http://belegost.seul.org:80/tor/" - -lines=$( wget -q $dirserver --proxy=off -O - | grep -A5 '^router '"$router"' ' ) -line=$( echo "$lines" | head -n1 ) - -if [ -z "$line" ]; then - echo "Not found" >&2 - exit 1 -fi - -echo "$lines" -echo - -ipor=$( echo "$line" | awk '{printf "%s:%s", $3, $4}' ) - -op=$( echo "$line" | awk '{printf $6}' ) -ipop=$( echo "$line" | awk '{printf "%s:%s", $3, $6}' ) - -echo -echo ">>" openssl s_client -connect "$ipor" -timeout 5 openssl s_client -connect "$ipor" < /dev/null -if [ "$op" != "0" ]; then - echo - echo ">>" wget --proxy=off -O - http://$ipop/tor/ - timeout 5 wget --proxy=off -O - http://$ipop/tor/ | head -n3 -fi - -echo -echo -n "$router "; echo "$lines" | grep 'fingerprint' | sed -e 's/^opt //' -e 's/^fingerprint //'; diff --git a/src/tor/contrib/or-tools/checksocks.pl b/src/tor/contrib/or-tools/checksocks.pl deleted file mode 100644 index 3fcc0df14..000000000 --- a/src/tor/contrib/or-tools/checksocks.pl +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/perl -w - -require 5.005; -use strict; -use IO::Socket; -use Getopt::Std; - -# Checks routers for open socks-ports and socks5 -# Successful connects go to STDOUT, failed ones to STDERR. -# We only do one check per loop in -d mode, so it takes some time. - -# Contributed by Peter Kornherr , and -# cleaned up by Peter Palfrader . - -our($opt_i,$opt_p,$opt_d,$opt_h,$opt_l); -getopts('i:p:dhl:'); - -if ($opt_h || !($opt_d||$opt_i||$opt_l)) { - print "Usage: $0 -d < file_with_routers_in_it\n"; - print "or: $0 -i IP -p Port\n"; - print "or: $0 -l IP:Port\n"; - exit; -} - -if ($opt_d) { - open (IN,"<-") or die $!; - while () { - next unless /^router /; - (my $routername,my $checkip,my $checkport) = (split(" "))[1,2,4]; - &do_check($checkip,$checkport,$routername); - } -} elsif ($opt_i && $opt_p) { - &do_check($opt_i,$opt_p); -} elsif ($opt_l) { - &do_check(split(":",$opt_l)); -} - -sub do_check { - (my $checkip, my $checkport,my $routername) = @_; - # as socksports may not be published (therefore "0") here, - # let's try 9050, the default port: - if ($checkport == 0) { $checkport = 9050; } - # print "Checking $checkip:$checkport\n"; - my $s5socket = IO::Socket::INET->new(PeerAddr => $checkip, - PeerPort => $checkport, Proto => "tcp", Type => SOCK_STREAM, - Timeout => "20"); - if ($s5socket) { - my @got; - print $s5socket pack("CCC",'5','1','0'); - eval { - local $SIG{ALRM} = sub { die "alarm\n" }; - alarm 10; - read ($s5socket,$got[0],1); - read ($s5socket,$got[1],1); - alarm 0; - }; - if ($@) { - return; # die unless $@ eq "alarm\n"; - } - if ($got[0] eq pack('C','5')) { - if(defined($routername)) { - print "Found SOCKS5 at $routername ($checkip:$checkport)\n"; - } else { - print "Found SOCKS5 at $checkip:$checkport\n"; - } - } else { - if(defined($routername)) { - print "$routername ($checkip:$checkport) answers - " . - "but not SOCKS5.\n"; - } else { - print "$checkip:$checkport answers - but not SOCKS5.\n"; - } - } - } else { - if(defined($routername)) { - print STDERR "Can't connect to $routername " . - "($checkip:$checkport) ($!)\n"; - } else { - print STDERR "Can't connect to $checkip:$checkport ($!)\n"; - } - } -} - diff --git a/src/tor/contrib/or-tools/exitlist b/src/tor/contrib/or-tools/exitlist deleted file mode 100644 index 3fd26b516..000000000 --- a/src/tor/contrib/or-tools/exitlist +++ /dev/null @@ -1,323 +0,0 @@ -#!/usr/bin/python -# Copyright 2005-2006 Nick Mathewson -# See the LICENSE file in the Tor distribution for licensing information. - -# Requires Python 2.2 or later. - -""" - exitlist -- Given a Tor directory on stdin, lists the Tor servers - that accept connections to given addreses. - - example usage: - - cat ~/.tor/cached-descriptors* | python exitlist 18.244.0.188:80 - - You should look at the "FetchUselessDescriptors" and "FetchDirInfoEarly" - config options in the man page. - - Note that this script won't give you a perfect list of IP addresses - that might connect to you using Tor. - False negatives: - - Some Tor servers might exit from other addresses than the one they - publish in their descriptor. - False positives: - - This script just looks at the descriptor lists, so it counts relays - that were running a day in the past and aren't running now (or are - now running at a different address). - - See https://check.torproject.org/ for an alternative (more accurate!) - approach. - -""" - -# -# Change this to True if you want more verbose output. By default, we -# only print the IPs of the servers that accept any the listed -# addresses, one per line. -# -VERBOSE = False - -# -# Change this to True if you want to reverse the output, and list the -# servers that accept *none* of the listed addresses. -# -INVERSE = False - -# -# Change this list to contain all of the target services you are interested -# in. It must contain one entry per line, each consisting of an IPv4 address, -# a colon, and a port number. This default is only used if we don't learn -# about any addresses from the command-line. -# -ADDRESSES_OF_INTEREST = """ - 1.2.3.4:80 -""" - - -# -# YOU DO NOT NEED TO EDIT AFTER THIS POINT. -# - -import sys -import re -import getopt -import socket -import struct -import time - -assert sys.version_info >= (2,2) - - -def maskIP(ip,mask): - return "".join([chr(ord(a) & ord(b)) for a,b in zip(ip,mask)]) - -def maskFromLong(lng): - return struct.pack("!L", lng) - -def maskByBits(n): - return maskFromLong(0xffffffffl ^ ((1L<<(32-n))-1)) - -class Pattern: - """ - >>> import socket - >>> ip1 = socket.inet_aton("192.169.64.11") - >>> ip2 = socket.inet_aton("192.168.64.11") - >>> ip3 = socket.inet_aton("18.244.0.188") - - >>> print Pattern.parse("18.244.0.188") - 18.244.0.188/255.255.255.255:1-65535 - >>> print Pattern.parse("18.244.0.188/16:*") - 18.244.0.0/255.255.0.0:1-65535 - >>> print Pattern.parse("18.244.0.188/2.2.2.2:80") - 2.0.0.0/2.2.2.2:80-80 - >>> print Pattern.parse("192.168.0.1/255.255.00.0:22-25") - 192.168.0.0/255.255.0.0:22-25 - >>> p1 = Pattern.parse("192.168.0.1/255.255.00.0:22-25") - >>> import socket - >>> p1.appliesTo(ip1, 22) - False - >>> p1.appliesTo(ip2, 22) - True - >>> p1.appliesTo(ip2, 25) - True - >>> p1.appliesTo(ip2, 26) - False - """ - def __init__(self, ip, mask, portMin, portMax): - self.ip = maskIP(ip,mask) - self.mask = mask - self.portMin = portMin - self.portMax = portMax - - def __str__(self): - return "%s/%s:%s-%s"%(socket.inet_ntoa(self.ip), - socket.inet_ntoa(self.mask), - self.portMin, - self.portMax) - - def parse(s): - if ":" in s: - addrspec, portspec = s.split(":",1) - else: - addrspec, portspec = s, "*" - - if addrspec == '*': - ip,mask = "\x00\x00\x00\x00","\x00\x00\x00\x00" - elif '/' not in addrspec: - ip = socket.inet_aton(addrspec) - mask = "\xff\xff\xff\xff" - else: - ip,mask = addrspec.split("/",1) - ip = socket.inet_aton(ip) - if "." in mask: - mask = socket.inet_aton(mask) - else: - mask = maskByBits(int(mask)) - - if portspec == '*': - portMin = 1 - portMax = 65535 - elif '-' not in portspec: - portMin = portMax = int(portspec) - else: - portMin, portMax = map(int,portspec.split("-",1)) - - return Pattern(ip,mask,portMin,portMax) - - parse = staticmethod(parse) - - def appliesTo(self, ip, port): - return ((maskIP(ip,self.mask) == self.ip) and - (self.portMin <= port <= self.portMax)) - -class Policy: - """ - >>> import socket - >>> ip1 = socket.inet_aton("192.169.64.11") - >>> ip2 = socket.inet_aton("192.168.64.11") - >>> ip3 = socket.inet_aton("18.244.0.188") - - >>> pol = Policy.parseLines(["reject *:80","accept 18.244.0.188:*"]) - >>> print str(pol).strip() - reject 0.0.0.0/0.0.0.0:80-80 - accept 18.244.0.188/255.255.255.255:1-65535 - >>> pol.accepts(ip1,80) - False - >>> pol.accepts(ip3,80) - False - >>> pol.accepts(ip3,81) - True - """ - - def __init__(self, lst): - self.lst = lst - - def parseLines(lines): - r = [] - for item in lines: - a,p=item.split(" ",1) - if a == 'accept': - a = True - elif a == 'reject': - a = False - else: - raise ValueError("Unrecognized action %r",a) - p = Pattern.parse(p) - r.append((p,a)) - return Policy(r) - - parseLines = staticmethod(parseLines) - - def __str__(self): - r = [] - for pat, accept in self.lst: - rule = accept and "accept" or "reject" - r.append("%s %s\n"%(rule,pat)) - return "".join(r) - - def accepts(self, ip, port): - for pattern,accept in self.lst: - if pattern.appliesTo(ip,port): - return accept - return True - -class Server: - def __init__(self, name, ip, policy, published, fingerprint): - self.name = name - self.ip = ip - self.policy = policy - self.published = published - self.fingerprint = fingerprint - -def uniq_sort(lst): - d = {} - for item in lst: d[item] = 1 - lst = d.keys() - lst.sort() - return lst - -def run(): - global VERBOSE - global INVERSE - global ADDRESSES_OF_INTEREST - - if len(sys.argv) > 1: - try: - opts, pargs = getopt.getopt(sys.argv[1:], "vx") - except getopt.GetoptError, e: - print """ -usage: cat ~/.tor/cached-routers* | %s [-v] [-x] [host:port [host:port [...]]] - -v verbose output - -x invert results -""" % sys.argv[0] - sys.exit(0) - - for o, a in opts: - if o == "-v": - VERBOSE = True - if o == "-x": - INVERSE = True - if len(pargs): - ADDRESSES_OF_INTEREST = "\n".join(pargs) - - servers = [] - policy = [] - name = ip = None - published = 0 - fp = "" - for line in sys.stdin.xreadlines(): - if line.startswith('router '): - if name: - servers.append(Server(name, ip, Policy.parseLines(policy), - published, fp)) - _, name, ip, rest = line.split(" ", 3) - policy = [] - published = 0 - fp = "" - elif line.startswith('fingerprint') or \ - line.startswith('opt fingerprint'): - elts = line.strip().split() - if elts[0] == 'opt': del elts[0] - assert elts[0] == 'fingerprint' - del elts[0] - fp = "".join(elts) - elif line.startswith('accept ') or line.startswith('reject '): - policy.append(line.strip()) - elif line.startswith('published '): - date = time.strptime(line[len('published '):].strip(), - "%Y-%m-%d %H:%M:%S") - published = time.mktime(date) - - if name: - servers.append(Server(name, ip, Policy.parseLines(policy), published, - fp)) - - targets = [] - for line in ADDRESSES_OF_INTEREST.split("\n"): - line = line.strip() - if not line: continue - p = Pattern.parse(line) - targets.append((p.ip, p.portMin)) - - # remove all but the latest server of each IP/Nickname pair. - latest = {} - for s in servers: - if (not latest.has_key((s.fingerprint)) - or s.published > latest[(s.fingerprint)]): - latest[s.fingerprint] = s - servers = latest.values() - - accepters, rejecters = {}, {} - for s in servers: - for ip,port in targets: - if s.policy.accepts(ip,port): - accepters[s.ip] = s - break - else: - rejecters[s.ip] = s - - # If any server at IP foo accepts, the IP does not reject. - for k in accepters.keys(): - if rejecters.has_key(k): - del rejecters[k] - - if INVERSE: - printlist = rejecters.values() - else: - printlist = accepters.values() - - ents = [] - if VERBOSE: - ents = uniq_sort([ "%s\t%s"%(s.ip,s.name) for s in printlist ]) - else: - ents = uniq_sort([ s.ip for s in printlist ]) - for e in ents: - print e - -def _test(): - import doctest, exitparse - return doctest.testmod(exitparse) -#_test() - -run() - diff --git a/src/tor/contrib/win32build/package_nsis-mingw.sh b/src/tor/contrib/win32build/package_nsis-mingw.sh deleted file mode 100644 index cae862b91..000000000 --- a/src/tor/contrib/win32build/package_nsis-mingw.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -# -# =============================================================================== -# package_nsis-ming.sh is distributed under this license: - -# Copyright (c) 2006-2007 Andrew Lewman -# Copyright (c) 2008 The Tor Project, Inc. - -# 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 names of the copyright owners 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. -# =============================================================================== - -# Script to package a Tor installer on win32. This script assumes that -# you have already built Tor, that you are running msys/mingw, and that -# you know what you are doing. - -# Start in the tor source directory after you've compiled tor.exe -# This means start as ./contrib/win32build/package_nsis-mingw.sh - -rm -rf win_tmp -mkdir win_tmp -mkdir win_tmp/bin -mkdir win_tmp/contrib -mkdir win_tmp/doc -mkdir win_tmp/doc/spec -mkdir win_tmp/doc/design-paper -mkdir win_tmp/doc/contrib -mkdir win_tmp/src -mkdir win_tmp/src/config -mkdir win_tmp/tmp - -cp src/or/tor.exe win_tmp/bin/ -cp src/tools/tor-resolve.exe win_tmp/bin/ -cp contrib/win32build/tor.ico win_tmp/bin/ -cp src/config/geoip win_tmp/bin/ -strip win_tmp/bin/*.exe - -# There is no man2html in mingw. -# Maybe we should add this into make dist instead. -# One has to do this manually and cp it do the tor-source/doc dir -#man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html -#man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html - -clean_newlines() { - perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2 -} - -clean_localstatedir() { - perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2 -} - -for fn in address-spec.txt bridges-spec.txt control-spec.txt dir-spec.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do - clean_newlines doc/spec/$fn win_tmp/doc/spec/$fn -done - -for fn in HACKING tor-gencert.html tor.html torify.html tor-resolve.html; do - clean_newlines doc/$fn win_tmp/doc/$fn -done - -for fn in README ChangeLog LICENSE; do - clean_newlines $fn win_tmp/$fn -done - -clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample - -cp contrib/win32build/tor-mingw.nsi.in win_tmp/contrib/ - -cd win_tmp -makensis.exe contrib/tor-mingw.nsi.in - diff --git a/src/tor/contrib/win32build/tor-mingw.nsi.in b/src/tor/contrib/win32build/tor-mingw.nsi.in deleted file mode 100644 index f3c23ef33..000000000 --- a/src/tor/contrib/win32build/tor-mingw.nsi.in +++ /dev/null @@ -1,274 +0,0 @@ -;tor.nsi - A basic win32 installer for Tor -; Originally written by J Doe. -; Modified by Steve Topletz, Andrew Lewman -; See the Tor LICENSE for licensing information -;----------------------------------------- -; -!include "MUI.nsh" -!include "LogicLib.nsh" -!include "FileFunc.nsh" -!insertmacro GetParameters -!define VERSION "0.3.3.0-alpha-dev" -!define INSTALLER "tor-${VERSION}-win32.exe" -!define WEBSITE "https://www.torproject.org/" -!define LICENSE "LICENSE" -!define BIN "..\bin" ;BIN is where it expects to find tor.exe, tor-resolve.exe - - -SetCompressor /SOLID LZMA ;Tighter compression -RequestExecutionLevel user ;Updated for Vista compatibility -OutFile ${INSTALLER} -InstallDir $PROGRAMFILES\Tor -SetOverWrite ifnewer -Name "Tor" -Caption "Tor ${VERSION} Setup" -BrandingText "The Onion Router" -CRCCheck on -XPStyle on -VIProductVersion "${VERSION}" -VIAddVersionKey "ProductName" "The Onion Router: Tor" -VIAddVersionKey "Comments" "${WEBSITE}" -VIAddVersionKey "LegalTrademarks" "Three line BSD" -VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson. ©2009 The Tor Project, Inc. " -VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}" -VIAddVersionKey "FileVersion" "${VERSION}" - -!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor Setup Wizard" -!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK" -!define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico" -!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" -!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe" -!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates." -!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE} - -!insertmacro MUI_PAGE_WELCOME -; There's no point in having a clickthrough license: Our license adds -; certain rights, but doesn't remove them. -; !insertmacro MUI_PAGE_LICENSE "${LICENSE}" -!insertmacro MUI_PAGE_COMPONENTS -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH -!insertmacro MUI_UNPAGE_WELCOME -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH -!insertmacro MUI_LANGUAGE "English" - -Var CONFIGDIR -Var CONFIGFILE - -Function .onInit - Call ParseCmdLine -FunctionEnd - -;Sections -;-------- - -Section "Tor" Tor -;Files that have to be installed for tor to run and that the user -;cannot choose not to install - SectionIn RO - SetOutPath $INSTDIR - Call ExtractBinaries - Call ExtractIcon - WriteINIStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE} - - StrCpy $CONFIGFILE "torrc" - StrCpy $CONFIGDIR $APPDATA\Tor -; ;If $APPDATA isn't valid here (Early win95 releases with no updated -; ; shfolder.dll) then we put it in the program directory instead. -; StrCmp $APPDATA "" "" +2 -; StrCpy $CONFIGDIR $INSTDIR - SetOutPath $CONFIGDIR - ;If there's already a torrc config file, ask if they want to - ;overwrite it with the new one. - ${If} ${FileExists} "$CONFIGDIR\torrc" - MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDYES Yes IDNO No - Yes: - Delete $CONFIGDIR\torrc - Goto Next - No: - StrCpy $CONFIGFILE "torrc.sample" - Next: - ${EndIf} - File /oname=$CONFIGFILE "..\src\config\torrc.sample" - -; the geoip file needs to be included and stuffed into the right directory -; otherwise tor is unhappy - SetOutPath $APPDATA\Tor - Call ExtractGEOIP -SectionEnd - -Section "Documents" Docs - Call ExtractDocuments -SectionEnd - -SubSection /e "Shortcuts" Shortcuts - -Section "Start Menu" StartMenu - SetOutPath $INSTDIR - ${If} ${FileExists} "$SMPROGRAMS\Tor\*.*" - RMDir /r "$SMPROGRAMS\Tor" - ${EndIf} - Call CreateTorLinks - ${If} ${FileExists} "$INSTDIR\Documents\*.*" - Call CreateDocLinks - ${EndIf} -SectionEnd - -Section "Desktop" Desktop - SetOutPath $INSTDIR - CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" -SectionEnd - -Section /o "Run at startup" Startup - SetOutPath $INSTDIR - CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" "" SW_SHOWMINIMIZED -SectionEnd - -SubSectionEnd - -Section "Uninstall" - Call un.InstallPackage -SectionEnd - -Section -End - WriteUninstaller "$INSTDIR\Uninstall.exe" - ;The registry entries simply add the Tor uninstaller to the Windows - ;uninstall list. - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"' -SectionEnd - -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN -!insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run." -!insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor." -!insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor" -!insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu" -!insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop" -!insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window" -!insertmacro MUI_FUNCTION_DESCRIPTION_END - -;####################Functions######################### - -Function ExtractBinaries - File "${BIN}\tor.exe" - File "${BIN}\tor-resolve.exe" -FunctionEnd - -Function ExtractGEOIP - File "${BIN}\geoip" -FunctionEnd - -Function ExtractIcon - File "${BIN}\tor.ico" -FunctionEnd - -Function ExtractSpecs - File "..\doc\HACKING" - File "..\doc\spec\address-spec.txt" - File "..\doc\spec\bridges-spec.txt" - File "..\doc\spec\control-spec.txt" - File "..\doc\spec\dir-spec.txt" - File "..\doc\spec\path-spec.txt" - File "..\doc\spec\rend-spec.txt" - File "..\doc\spec\socks-extensions.txt" - File "..\doc\spec\tor-spec.txt" - File "..\doc\spec\version-spec.txt" -FunctionEnd - -Function ExtractHTML - File "..\doc\tor.html" - File "..\doc\torify.html" - File "..\doc\tor-resolve.html" - File "..\doc\tor-gencert.html" -FunctionEnd - -Function ExtractReleaseDocs - File "..\README" - File "..\ChangeLog" - File "..\LICENSE" -FunctionEnd - -Function ExtractDocuments - SetOutPath "$INSTDIR\Documents" - Call ExtractSpecs - Call ExtractHTML - Call ExtractReleaseDocs -FunctionEnd - -Function un.InstallFiles - Delete "$DESKTOP\Tor.lnk" - Delete "$INSTDIR\tor.exe" - Delete "$INSTDIR\tor-resolve.exe" - Delete "$INSTDIR\Tor Website.url" - Delete "$INSTDIR\torrc" - Delete "$INSTDIR\torrc.sample" - Delete "$INSTDIR\tor.ico" - Delete "$SMSTARTUP\Tor.lnk" - Delete "$INSTDIR\Uninstall.exe" - Delete "$INSTDIR\geoip" -FunctionEnd - -Function un.InstallDirectories - ${If} $CONFIGDIR == $INSTDIR - RMDir /r $CONFIGDIR - ${EndIf} - RMDir /r "$INSTDIR\Documents" - RMDir $INSTDIR - RMDir /r "$SMPROGRAMS\Tor" - RMDir /r "$APPDATA\Tor" -FunctionEnd - -Function un.WriteRegistry - DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor" -FunctionEnd - -Function un.InstallPackage - Call un.InstallFiles - Call un.InstallDirectories - Call un.WriteRegistry -FunctionEnd - -Function CreateTorLinks - CreateDirectory "$SMPROGRAMS\Tor" - CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" - CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$CONFIGDIR\torrc" - CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url" - CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe" -FunctionEnd - -Function CreateDocLinks - CreateDirectory "$SMPROGRAMS\Tor\Documents" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Address Specification.lnk" "$INSTDIR\Documents\address-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Bridges Specification.lnk" "$INSTDIR\Documents\bridges-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Control Specification.lnk" "$INSTDIR\Documents\control-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Directory Specification.lnk" "$INSTDIR\Documents\dir-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Path Specification.lnk" "$INSTDIR\Documents\path-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Rend Specification.lnk" "$INSTDIR\Documents\rend-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Version Specification.lnk" "$INSTDIR\Documents\version-spec.txt" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor SOCKS Extensions.lnk" "$INSTDIR\Documents\socks-extensions.txt" -FunctionEnd - -Function ParseCmdLine - ${GetParameters} $1 - ${If} $1 == "-x" ;Extract All Files - StrCpy $INSTDIR $EXEDIR - Call ExtractBinaries - Call ExtractDocuments - Quit - ${ElseIf} $1 == "-b" ;Extract Binaries Only - StrCpy $INSTDIR $EXEDIR - Call ExtractBinaries - Quit - ${ElseIf} $1 != "" - MessageBox MB_OK|MB_TOPMOST `${Installer} [-x|-b]$\r$\n$\r$\n -x Extract all files$\r$\n -b Extract binary files only` - Quit - ${EndIf} -FunctionEnd - diff --git a/src/tor/contrib/win32build/tor.ico b/src/tor/contrib/win32build/tor.ico deleted file mode 100644 index 0cac29704909962aa55677fa4b8b06c74a1401d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82726 zcmdSC2Ut~UmM&afId$b=4wyiYoO8}O=bUp85K)N=B8o&60}5geh@gT9idoD#RP5?7 z@y@-^{b%ORbXUFqyH2^QPdiq1_e|fJx#xM_XYX?kXNT`y>04`kn-^aA*$XefP+9o` zx3gZ*eEnxHxW4eh3;O!szuzUfRs)$uytzoCXVxv!45 z`2J6U@*DMI$-W$4Am>!S4rTupelC#fRlf(>f8M?R)c7dh@u&Y!zLe|#vF)?tp*~&; z-!hiU*vgoz^D7()mv0k4C*FCAce$lD{2RQ_&jcS3A3g{2x$-x%RX>ItQ-PdE&L`)U z^Q+5>A|Gv%>YW91Ab%JbuLYA3wz> z+Dx*jw{Dk&L!s+Ia1_Cu1jP@_2b3l+XC}fBTnmt%b3g93m*!f)3`sKm_f`WW)T|1 zoTr$}?YyU$&+URg6Y?ARy&Oj%$CcyHCT0kn`yfa&EZ> zxgL=hMNVdMUu06`Lu5l_R*?&lXR%*$&x)N8c@X;`vLIt5<0WJFyfNj+|E*rnyGHp; zu3zC@?n~}Z?o;f!*hm=z;akQ8BZ-j;aA38co0s6KXbx@uqJE>Tf&}jARGxN z!kKV=25x-sPIx?p>`f%5k*+!x3(<22EIIggyrhwvig8bp3XZbVib2t`ILxo<{@Y{)%{ zT!=i2Ow1)_6EX%O|B5Uqc0tDMRYJz`d2+yy|4U!$e5>y(+{?AgJ&27H-ajVfKE*DI zF31=te2Y$tK8sG-6HbJTr*N#!ukfI78o~Xjr- zCKDeLA_rnC#U8vuyhOZ6sE;+@{+GPeuR(oZu21AuxEEXY4k7m<_cW83Pssg>F31=N z-wuR~kHWQ#o$xH{Q5kZTp$6xk44A~Gv-;YWB8V!xaSMIKDK zuTLx_<`H5OCJ`SHKPTQG6d6z-Z)Klf|EIl_b3VHj?q4G0I^}wW`;Q2*^K%GoLS){O za3Ew1WGsYl(Hn(p(XDtwoo5+qgcShNawBhw`2B zx61G3SOPh&9A7z?oLA&XT~OND0{XBl@He|2sZP8A-@`Ta6AEa$$072H=x1>dVf{X6A1vQCrk+)LiA=b@jmeu@hTxYri{7z zmLLCLeW{=8dHce@y6%6%_p=CX!i;bvyb0l5Y-0i;`XRb4<0H0K_?EGImTPsM)j3vp z`hmMQ-+Z(7lTSWwm^o`^(}D#HS{E%^w87BOaI=YtNtd~~dAFsdMX!~W#cpeB%RM$W zR(ox1toK-3TkSG4H|^EY)$Z0e(A%c3ueW*OLahz+=FM%LIdjIkk3asn{*5=@sNr>q zyvVtf^Qy~-A{%n80+9=mRgnw1A4MkQK1H?_c}U`ZJRx==i0~pD2opk!m`Qw0{8!q5 z=kcw4CcFzoE=4}yB;F%LZbkRSuh|gpgxsIlK)Gkpa~TKG6VY$QcFVXuk8fqnW&DMQ z%9mbxsp|a?-mRN7<)d{oW>0NfpfzukyNB!E)U<@-D^@H$*WA4BMpxIiNBj2e`+8vD z=-&(v5B;yvv6KIF`pn3`j-MO-_QJ(8-<>}{{=4yWr~l>H@W4NA-m&R__U`Te>)zcv zzG`k+`(Wj&s%z!tOU6@Dk_KH|oOdl;xNzg#Idfa5PMzBL-h1z@dhx{g3q5e>s0)budg;eYBoeCXGkH*LOKSy6E&Dk|!Lrlw}clqplze(=Eu^{>AAYBjI(SvgQ-LGc-K zf9f_t( z$ao^5*nM^Vm$CUbGVt=tFIT+%^S5iKPMzFnXJ@sos5o!9vvcE}fx-U2J$rEs11Aq) z==5O>pYF%ldGdAXBraV!i7Qu6;p(+>xPI*_aUIvLT~p!4jqA8^qTx<=f<&D*zd>o&jR{?+RfxN-9uZgT(Dt()Ax&fiZESNNUC!7wgQ zj9}vGSzNj#c48dkm&S1J@_E{gaU4If_wO2-@~_7ydmoxTdrBj(dpYG`>Cb-l2l_7e zr}%%-d9i~@L>v)81QMeAc7!pZNz5R`|Gz`LPAK{>94LG|Z_BU$L$Bu@Q$ADYUiKC4 zU*^7CoA58!`VldW5Fa3NEHYqExD$RvFd=dv_ntt=Sco4~`Gt=@dVh(Vr}Kt{%;+;Y z%aec8wqrF0hxg&^#p5`0=@>3uKZ&b1$nnj~uNlPo8miONKx!5$(bGa{tbCG+w?`R^N z5SW3JA_k8#C6`***7?3n83mHp@OFW34WA#y7+ zFqhCFj0j7@fsh!-hX^1-36X`Ek3W4ccfQ_?4(CAY^Wo|Kf16*O`P-Ke(F5f0!H;G&1@ACC=oH(-&-3Oac-&TzBx*TloZo$nv zqU)D=tWo~vB4yw)=rPF)uHN=IPU?iwwjP;{Swmk$=$x ziHlqa(Rp*ifLKT<+<(Y@(Wf^Fv9JG~_*b}>tz4H}pU9|O>(2?1+fRt8gxrtVvqgm1 zHVZ=T*@xpG&*IAUGZ?#Y2s`>} zv2kY^V~sb*8!w!T9#|7%8-;h#`T4|5LgFW}p`u4`5sK}99{-|;&(l|a{O@`_?^yDgoJWDe zyC8Ek@)jD**>7yO;A`J_hkx`yH(!McA~b5hqR`#4+-Je7px|FPx-5xc0prxpkRbU&Mv$ zqd0uB7yAdc;>`J@xXtt3x!_!l{q>lGUy*Dm)U_aZVN^BB3mS+BhM zvZl7-Y;PSyjfU8?z-Q#z8RS8(TrJ9^?#KDs-*n7MM$IkA>g=^GVa&&{X z{_0J}URREy@62|z9;(NdL(MpQZG^mBQOSV#{9B9#Zr;2>A8?VjqZ@VGDp0v)2~um~ z5V<%QWvdGrzYUVJ5ypz+DjRU|`e}?`8^ZDP`_VVP6FZK!QC3!C+rD+!ceE3yFAP$y zzKozULo`H7$rWQ@x7GwR^Le#8HMrj5ArqmztX%7FI zkm~TafgvUnmX>p?O$=v?4;0>K5i%|^J~B=+UZOkd+{@Ui^Di8zb0YiC6Kg9TYn7VzMe)cpbZj90f>_q*>QY>DbjAdK)~1 z=&C|}XAO1@bd%Q+&gak5USB3I(O#dx;gMc!IoN{YHF-#05sSjQbgbK2h5h|q=o{?j z{B8)RuMA=I+HoAaa1cisHyl565JP7UU}s-Ds#=P$vbh{5PaUJ5V4O)?bBXcirakLW z*^+~>414$`SfIF;vOqaox;7n!weiR-4MlX46Jk>wk(%#~lw8m6(z3n&Pe`!IX8~S% zy$&{7Q7^yr;&hIS_(}2gVlNf$MTZpKe;)q|4+=Lw#vKpyC%>L|4CVN;RnDo{{6Cfd z_a{yMWO7Kjk41J-;4UT|13a z=lZFuThZ9F5((uo2+HwA$?9yZXembQ;xMF^L}JUHW^CQxLHXH1xjTlFX9m%=dlOo= ztVUaR9hR@lLujfGqBA0}s)@1a@Bsb61TNBk96Y{-v1KZ9%Om;sRXBWnJ2viGhZXBf zkXR6k&^QO=6#1cWX%G^#Tu`<=0=d~9zY7a7`ddFAgUj>heVRLe-X#6kUVB+|U$_^Y z5&cp47oAe<|FbsWSv&AN{`m7h>Gizd%4Z7ye=7HK-HQIp{k*H8F>7W)VW!Xa-R}Q%vqp;ojXlcyRX~?%!h!clRPrpFcvIJAje1eb~Hr4L0nm zSLx%a^UU>}--E$3-B`MAF`N@TP~A~W+uMWPN4Mc5?e`hRb^WJzt9Oz+jXSK0pg^XJVeTe>)Q;P~$Sd;7QkY6<6I z!AWk6&707;c_}vTXk-k36%QXgz{C3w@qpVKjL}b?+l{e{hnd^kkFEpjad2n{?K*wI z&GYpC$5GQ(hS2N?>T)^bh5a~qY&ZJoKTcgdgwZR9acHCmJx8{nZ^-;{RcjZ6{tPP`GO@3}9YbR~FnXpJ+jll0 zCdmUSS+2;)a6@pA4J?dj!(4YN%ycGyWvn~3d*+mP11JMBUlRVGX9Lt_K;ix`VFRAW z{U6hPxfZcYKj!z}VGV6TK~YZD&b^yY?Ks%_4|N-tA}rer%NlcO&s(sozeDBY@7=$R zM-LwokMQ8(J)FOO9LLXX$Ei!ZDF?mS!};HVk!_3(PN?Q)XD*+@(#BFOsV^ZG|E__0T$k7 zF!eG-a%l`Qm!~4TDhEr}E=3-<6>FDZ`@T)+=x#%PbvA84Ad-ud5SJH^n)FW0>#x2nbHG2wzv6=xIZ$-<$GGGnfAsad-zdlXvvvR7 zci(xJwN$O*vclpG+nXjT))oG98DpZ%sz`)nyP~nH60JMxag)CO(c}Ag`0zd+JtF^) z9^wAOyErPU-=1fkU>L*a22jzo94=vQF!nHq zo|8Ue3u3W)OCvh=ZleEQhQ+j1^_+`t+S!KsjvDwRxx(DX2%gbyC|R=q6NrSuP&9N@GA`JI%C)6%^*2ONh&e)o&Ef8(30IqW za4?wx2h-WG)}8uK=9-hoXMXzgl(%1hS>vS_ej~=M_?>@K*)f)=YzHcRtj_tkM*EyZwu$~C0Ihgy|S$YoA<0m8Dq@gbT0&@ z`5><*534qXQz;rYmeZ%zp?hyD)^Dk!??^|&;&7DKXJQ%S&X5=f zc=;J2Du#0ge`DC$&4Gih215Kz;p3tUYr`4enrcs)(46^x_J{AhKKJF9ex}R=l{iq{ z2Pm8<94VYB96q~!RtBE^UU{z^N4Cnb*-M{T|UF$NW zE(u4*@=&bWkcYYr+1T0NNI%TH-pD=`_fMWY!ef>0lmCYgaOeIF#(OQO=_tnjdF9RWq^L85679O zIWW2%TaLD(U_NGR-+Im+TCt+N6h-y9Wg(5K3A0b)ca0+)qSwjIjb~j+f+I)0uU&&g< zQO*xWv1xZJq6>oH9AbpPNGn9gyTCix0x5ZZh)i;Xi?=d5AxFseh-wuN+66dxd|+@5{9) zxgJ%#Z|`6+r>$enimu-F&q`}E5S{DE{HrgD8xm00nTwU}*(j?^=6op&hfnlyu6LcB z-=W=q@V)PU@DLIU?B_hJp>r8}4!3h2H;i-FPvF2<7uM~n#M<8F=;?1JHo!k45IYWc zF^6{s7q75R$9l|#D`)9H$S3pu?FUw2E9Gs&!8NGssYJ$BRL3Sv0vcqu%>6ZghgV zn+Y8JZ4sE@iOB3=I0Rd9-WQA>#;jd?nowMwiE!Er2XB3ZMA;#odB`}%29e1w@CYzL zFh5Jp34m{iB|N}_LRZaeo+PzIzfJHol&0krI0i^kqM^d9fRq0s|a zzq=VJHOa_YosNpmrD)x~7OOT_GiKOAS?a{T!EG2}zW6NTxIF{RGi|NI>aNv{1xpZ| z!~9)oI2PBWQGT-!nBt1yEOJP_&RUuVGbbb1(;p?|gd$@}9HJ=)i>tDbm>mKKH$8ax zn!t*B_2rjel>E?->A%9ix(ujus=lu-0P3GB`wIW+-2bHRzx?t`?`PzP<*eRN`gv>b z>hGFaBVE;1j*1Nh9KSTiK^|}oH9hgOTg3?JHyD#m-v;Dq<_+5w|3s@(>71 z4>R~gIlwc_7BN|oNXkuwv$rMm4W_`-Y!;l|7QsKt7HK7+NX++Ry|@gQZXZJy<;B!d z69LgS@TY%p_cexv)dHB9%!9j&34(mBzjdSqw0TON96ReRCDwshB^X~#;GGiF-WQG&Isk5;tgBZNBR z6>W>e;!t=eI?-oZFdnF-&fn#n{|#x@;GF1p16&*3u`}f7`ZG&TB#ql?XE*zQz<G1DhnSQA_=VU}cJ%)_ zKF)i*Y)O{yPw@Yz+5jHnhnK>;vi&js)ouSD`2GClk*+Hm<3{sV1pZ@LL(+F``>N49 zvIQHDbfRQ^8S?5gu&g~FsnxM?V=mM>&;nMz7I5&hVH`e;2ekd?t}(|;{gr->;qiW? zE{;GvePVSJ<8JcYKYEBc`~x_8az8FyK8bPmfgGhxAEnKg-mRk|HFK}GO)8OuVkl6I}*U^ANbGWJ2m@gvT~_OSM|pSjeFXx_3G9$^mDlN8jomUC_vh9#V5pBO!gv9m+e z^|Kf~H_W{LFiu_=LeHUI+63v*yTo2k(eDY$z!jXExPURng4>Vm#L~9qC}d2MvML*y zYZjxhZ3S`~Ik#)8Kw5PHsx~#C>sT-Mv*4W;0H5Rlq%gOT!MR&hQ7H2QK?sU>$07?& zxCGdvUds$+^*f%3D6`9OXPu5{zuLU}8NVQHjpq zZrob&>;C@kmL*FH=c>toqMLt7{{N`$fAzIjKFBNxs?J{Q^Ea8rUf}*xb}?2oRdBvG&iUUH`v04(pRT5zKFtXW3+iN!kRS596y#(F>d@2KBn<6{_Q-JoGx2aj2Wo}Xu~)r!9!f^vB@Ijht_6VxF71kk4-5>tB4y zIOrOC6Lwp|e8=&x}ZpRhduD<2Z zRWJ3=WMBE6avYHIoL>~Rm3Bw zE)$iTmSbsaDZ&auU>9kJz^owlPSvC9@HXb+Pch%aTpx2khlUQIj(K*m*9ZG{!zaQO z?jf9Sr3RyRZ6#W^wQ_D<#(1rRV|5${2lp|?8>LUb$bQTT)NX1*P(c!7_ye2=vfuma zWy**60QsIifw(krnSSGf3M${gp3xKZ{hhs?Sk<F@dgMP-RMxlsIoa3owQHbCJ~w$E}b@0FMO zcj~`+mj54Y{~K?<_O6MAwzWr~$v}95{dbG2;=fBQ3P60JFOn7qFgNbUZ5VB55>hIX z5zIV^Pr45Z>+@KLqmRGCIX~z7;`e)w?4y5eV*lg;T$nhGRm`V5`B)$%&Ihi6_OSM_ zKrnN1rPR%yqutnkU@La_^{^LokX&9;>3eQ%3G(ZihaY24=!EocGZuIXrRVz(xAMLC zi7V{kyhvF(%{bKivzBhf(HqX84)Bk0 zM^bhmbCi9!|M;p(@4xx_7x=|D-{6~HeuH2B>KpEVfiJ&$h|j)YFXF>%oR^-$k-;4p zI=Sn+v*%9zf32Gvce(mlYH{u*I{7UB!k@yYI>*ZXpTfT)Pjc)Z`2XO;_ogRhhObO3 zi2Qp8FMZax9T88P7nSCLaOO&)bA4&|f)L3$vlsJOo~)Z^*5+XQp)U6BT*2p`e~w%C zZln9qPWs7WbRFzrJ+20eSEMmka)PCU4&42$;L7;WzcvtoDUuXaJ9|imU*)M+W`c>wb&SPNYC~HX_^hNbp z)v+A;D^n4jAB@P{aON@+Soh1onpWnDSWg^dk3jQ|wXmhF@Q$V*aMGoX*JZrF2zG9| zaPXuYFvl0jTwiig1S-}q;heIHb|eOFu`X~4vB8>_3Osy#leqOg|G)T}Jl|!%<1u1@ z{cTt91#QAN-+WEm@CEJVJ=(k>43F-_>9favx4N_DS1HAz#q`6HA69I%qW}L9{?&C~ zj`suq?|<;#M*$(;AvLR)-s{@gfv`j$II?yYz!=yo$O2A5W{AlPMqFV8bEAF;&k4ga z%Kd?%L!94D;Qsx4w9#j&SF4c69;_PHRO*^n!_nIs`pkJ5a?WdPJQp^0izow(tDTIY zsW%%2mfCQSaAUtlJc?PHD_FgR`GvJu+_;>%fm77^YpQwO1m}Xn=T&ll?T2+9T<@VK z3%_6cA?pF8&!2zG-(0_OO%*$wV=l3$Z#%N9(-6mbNNr0MWA$C=Ki-EEC%MLCocx?R zjMiPP@JMiH|9~gl*%#p8Z3;`LMQ~y4;uT~Cw;*%aGr#8$VnO+dM9rouq%#-j$Q*%d zgf06Ew&3$GIQM-xfnWUMG41|i_8uKWHT#${IA18JDM0hq7L1)6!xvvZp-;F&IX%vL zRs-k4O<3Di{oBMs|Lg8P=Jv0@@v0&N&*T4jKH#VHU!8wNu3mlR3HGdaRSsR{B^&$8a_b%@)AemSY?4Onc&s z#Vw_1V*f@9=Z3NdL)LakZTABGx^Q`kc3|+-Fpiu!##oSRfNm)3eYoy}>p^}L{JZO1 z3v!Y$Scllaxy4Z&8DegNal5pUenPWw;*zhpnSML5GH$QEt^HZZr> zVH}_bH_C#00AoeUfKP%8R;(*w&+u0MrU<62H~X>=U<><=uHU=NxaSz|JwAg+U*5vW zt0x$ju0%vpFnl<-^iK*v&e9z0*t3~&PdB!*->hS26?5aosM}clU37-)Z_BFUTD*Mi zX1@LNHzgMM_wuj!3fVr(zsmN%{no2fbQVrccXT!Ta#{5f?Aq5&zr7c&tZ}truCYJv@#jzQ72}z^DxE*avFoE9tY+*Kj%3b->O0pWAvYfL^)xVV;S6ZZ zn*?(UZJ3&KzGJ1s+-WTBOCa>j=JWkR7~3p_iK`xaK7z3G82fyfvymLYIj+AEoxaGp zZ}*YCjOn_VSJ}<^SuIk^@)_T)#o@tzmA}7v^A@>(3e}nqS@-dKh+JH!{9IvP@f_C} zU7+lqV_)y4gPllOp2%8Y0eaapSixRE=P)PEQ>o2tPr5hKS0-~_a)@!uew@9^`2ULuJpA$w#xBzj?OH`& zm&=}nXm~`hP7vbEd~pcMsxz1$;XG#l8st<&!8gi^y`>S4>(>_rO_}&@5S(q1^r%F)U2kcqV}!V^MJRbP&_&CTdLx(}nL2XT&l zmUr%6z`ciDGecW1@mTMnee|czs9v{A+snQOR9@u#~4t@WG-U?Etq>4u#TFCorgP_2N+|le}?nCF~-TG zjNwjU&9)YVQl^3l*Mvamdsx9Lz!}-g7GuwmL#mkZ)-A3Pxk+#<>qXQd->KFBJzWPR z`Bg=b~^ z$M{#|Nag!y&73?fF*zVFza;e=4~}O-MijF0JU;K5!w|I{effU{UHFXEga9}V;i9o?PGXGCDuoR6?@{#0mbOoEBgTqI`%!HIR0 zMdZ79MK0Qz3rpmA?C1w9+>JRWbHHlOD_3u-WK2Pye5#+d+}&8YwVkZ4a zF2~Bk&kn|J7MNqE4Vz#Ol&xDyJ3dI>Z>i=7H&yF>e!tE~S?{B4MJ|MY$uFN^uUOBq zjm%%w(ypXq>B>b{Kh`cB?vL9_X?dD$Ax;t3ktZC0gVKs9Ou{?ILF+w<>jA7j< zh{tkw*TZ_|)q9zjc5-JfGSU%l&RSSn9{u^|?X{7bT63g#T+x5gV@0nO-j(f-@vpA? za-3J__up8kInz2PC#r94a|H@Z)8Oc80$0{Ot*MiXc+Wa|Ght*#+vi{ieQQ0;w^{@< z+N`9?Jl4}&X)mkUcN@dG`WkHA*G29lnHQT2O|8k$)tn05xs%{%ql?fmXPDC0>zmAG z{wE66%}cOsT^Y(7mm)TwIbp^Z)vZghZhIqY>2q54Z)D!K6M!UX>OuLY8iW-`VM$9NT6$Not`Nswi6G_;qIthw%qbevkLbaV{URPNybsGc z$Y*TbwW|SkE?V&9eAB^d7FI0fI+Vkkw|jfLE@Tsi=&Zuyf0+MIK78v_OCyaeA2-vl zVx!!Uz#N8OAnmHHHf$XY;UCI=2IfTlL!ICgVvoqwK-#quR5RDLqOA%g?9t0uk%PtS zDp9wk389Ihm`QzKs5ygna|#SJr^8Hp7WC&&gN`PlGYyuun)Ltv$S#jX=F&Jcu^zbN z@FwPyixIjw8a`Peh$)Ll^TBnf-Pwrco%QhMd3`wFOezV1Z@eo^T#TS?xd_^nE58(f zRjk;@*u9V3?>xr-{_$aQ&w4X)kA25K;2!tYAw9{&ZLSL(9PLMbO(r6;{ji!n1iJ>; zGOyT(;#CRo3A2U^a{xZR>F+7Gng$Z4({5+A_)!*#Cf zyu)17J@y>jC*Sw)-v1u=xV`^9q!;=A{RjLTz9+77J$Toljfh_s0>5lWtm#_9`A!Ob zRTM&{7sO%?^!290(3CMNa~G~&mI#V=M_6Vs;!C2CRu;uMPaTe&J%F|BPpH_k4BpJ| zHgSFP?MK&`!`zPEqgyaC(T|N>cM_c&3{U2mLOG}OrfqSg3^c4RLEENPFr_S*E}8{z z+J!{+5gqQ^hM}Rsb_)xO`F|n)U*Y=o*ED8)5aw(-`>u=SY-BK})wr&Jxr;IkoI1cU zJjeXRW8yPDH)EK+TjPwGPhidZ3idcL&k^8+H1LPg|X3mmA;#D z&S$DM6$a#8Z}udZQ7-Hm|9g4S?=iNGNpqy{b7nuK6LaD0zgZQ7;-(zbZe!mDdwq|v z7jSiVEyvIq7R^=Gc>_w5!6x?Hf>b(c|RQ*clCXTZYZ6i9l7Nv;wVh8p$Bou}qoxaJQ z{hYS;bJ^c%3l|sWE_i?QH5u2kc96+@XeRUHvZk%`NCP_h*J1NO8;`+t$y{r4hu1NB zna?xe`ojlbKcYX_2%l&V+I+?ntRdOx&Y+LfM14acO1OT(#%LDoj5Xk7J0FRO9vB$h zi_y`MD}1Jr9iN||_<%oV|CR5RtztJ+zJKbJcQqZX=63qgxB0TZ=}&(X#@?q~>SQ_V z;U^i#+_^7#`|Zr54qyl4oQN1#=0S9j&HQLB?SD}%`(QXeA*}fqEQ>%=x+^?fb>K$- z;l^0W%}NUvi>ASd@xLi;fsxKE%Ev4?uqGbB_%@P zM-%5|nXKPwa(<{|sYPhRz{Qk3TYjkAP=q7QpWkLZ(7Sf+{su(|7LD6pEXTut|v+78uUtZ9<0ZH=J6UC!*uQ6tXfyJ{lGS?WBfXPg}vlA zFQBrm9$sOt)Ok&~)6ToFCoq7vU~OX|BAGw3HJAZc_6j-J%tcjYHn~56Q)2^MTM$_@ zdGd#{)>gPwcva#)Wy`NrFXek>`v?5bnEIZ(z3HscFy=F>Xp8G>k`NYTj8yi+wXl!3 zcVIJ`cdlW*vKYQG``HJQ(rC7B#5%ud*v8*N%b!$@L=D{4V zn*m%|8}qhf-GqGG8_a?kZKs(r<(zutA8N+lIL5qwrm(PI2t&(xFy-9Zit{Sh04w&B z_`xaC8Ft~0tlv4n*w+-=F4_oVy>=t(B*T}EW8&r|@^nwNwm`){`ICIa18#5Mp&j5F z|A)`v{s%eWcOpBg_v}%6{NOPjJz(AH!Cm&QQx5n{kaatonIn!wP?S3=ncvII_GO&T z`MI+I|fKS?!){md;~VLi2jeM@1%HisvF z`mQP2{SWbPYNGkBw~Il6mF~1(I2ukzAjdWYn)47X+7KK5O<-OK zvZ~UV|7m64_c-;Pypy}fkEFl+_fWW%cu#a(^*3tYD}O6%Q6BU6PaZw_0rK5dK38ND z^MZ?+huE;U1?kI@;pk@xYtH*!9SvYbzie$X6Q1NhB*Y3)u}%mJw}vlcc^}RTTzzyA z5Mjw$u?3vH79lj+j<(SSmRuK*Tak*@8)`V;p|4Evg^LaCq`n3`^k>13c0Qi#1~L;| z;me*7n}t(gt^YB?n0GwS+($3hETnKA5*y|4#NI?B^24`ZmEJ5xuNA#lw%=?2@4r|6 z?g#z%@GxBzA8xb5(O~+&dYa9Kul)kV23sPJwl$0EU{$$CfyT3i-DjgWv>cT758@8;)d&Y1*Q3HGK=|hLP zu0#B~tS6Cm1=3%j;Iq#@g97C-JS|p>v?daPY7r2J1O0hYrkAjvnB_{6$z>y zpfJu+tZDx&EM~*q(~#>!6Icsv;9A23gfp+~!91A5qUrG9+}hJu}7prol}2V{B}#RXwjNojET@2TdeJ*#AqQz4n@^@4un(AK~A|O3ORk&v@KXpZ7xB z6X>LcF!m;TG6!qTyqAZYDQwI&VNM-hWT3%3ohi94WglKY`&cehPuO>Lmi_q5ogCx3 z?H=YVR@5gWI@u9nQPv2d{D;!UJ3G#2Tr(dQ2GkqF`LH)#2s8aT-`4?b^*H}!FC6FZ zP63Y4GUwdEav}T3yqG`D!!q^{9y)c9ydP)Z%pqLin%qa9JtohetLltWYZS!1bbPtukkF7Ft_RA zYys1SpTdKGf(B7x#C1A(C&0L>#5|6&RieLQZF?$(U^LfI#)5BXh&(FKK z?joDHsF0rrt@F!Qs3C;PTMqPb=-(waRE{>)==UXtvonyXmS#~aT3 z7>3Men$G_Sj`U}qR`ck~v>4|w9;D7%(dIe(nZZB89zjGnYlo2uUWj17ODIv(xD1V4 ze-a$z1{>sq`lhxPDL+-H6Av#;;q%U@Fee(@RWe&;aEwN^*D=5}Y_X4+@w zI@*_@wTo+O*&n>5GKu}}v~jHW8&F?#sXuz03+gbRuFIN`8FM%0%-@+ZpBNG!#NTlJ z)*0sfS*Mjc`L%mD(0O<_YPy=y%D#~CYZvf|yNu;;(`Q`fGe$06yTbXw13dZsGxnVJGiQ^<{E;W} zDpL5Yf=cADU)z&@(1z>wqJvrYV{XQB5!di8U=GuK0ir`38OInR(1USOs12f-7lP==W=FXhebyY81M4*@I{H{jR5nwfkvNHXD+iJX5Ipyt_<+&0+#lIpC zik(pTe_QJXR!Pwo$4j%_v4lMxVV*khvYi7r<^cRT$B7QJL1AGS)~s8`=Od2cn_qv4 zuYdUke)XHL@$0|(CHKE#kH-z>0@#aBA8`ECew<*w;1JhZUA{F=4o{(}Z5aYW*i*;x zOUn#LYFa4L(!&s+9LzP+5tOS8EMK)4wagptJlKmH%+oxeZl7gschAT$+Sxm_jP;&% zy|UhK2zSZfXXNaQFUkK`U$ST7EA~}A;X3aTbnM%PwYxSUZ)G{63X(ZzE5LsCBAsL3 z$Kx*_VT3(`+xm8KO;|muI_j~H>xEB@9%sJqC^~xABa=D1+Vv&qXU?``(@M&$uFB6l z8qJ0i;}r+`E}5hIGX6`A^M;SB0bJ}B!iP1$FvhTPF)oN^u0DtPh)nhmhtppKGQJJt zoW+Cl#e$+(l(J{opS3PK`g~WdN$}C03}5o>%NRezWEv6}PsZ^#?u?fl4X0rD)cV5x`_wa9StPz%<;W1Il^;>C?7KrfH zMKI@Vnelcg4o7wfqWy|M!1~-*EdG$MnGy=24$;O~>6c z%$*OhPJ0ZyXt(zd?Bz3)c5xn1gY<0niBMlUI_sF%C`0wCLe#TYW?lO-#bJ4fJ=N1BWrd+Mme97wnI@L46)(y|(|{DLy;s7!EPdw|Rdz z3LDFjz`AKfSppVujfR=@)tAPhYGVc0gRJ9vkDYve#7e}nHfbN`0w>0lQJG;#=Q{5t zjAiqdu>Xs>?XVb66mmZ|F9t5w+OX7S&SLIIFq{7gY`Jewf9%RQ$cyz0Hxmuo%Q*<3 z?GK@i^JPB3hxv|R7v_gK-}NQJ$-B&}quC3T810G#p2L^1tuv41N!uU5JgC1ub)WV> zjrJy+wj+vhzrEfR1iPEy{OA!r7iR(izKkE3J9l63DV*nifB?qPK76KtgT}ifGv0m0 z<!OR=5igguO7nObdbwuXl?Gu!&=rTV&ko`VcROMwd3=XsLz-A z?4-wE+{dqe{Y!Gq=O7&F=DPc>%-MHh!|v5wJIm)Z@i{6>*<+c_dY%IQ0 z?Pa8fB7*C%gJ=&@@&i$|nzg@8^{8H3gUFH`gjX*`&HmlkI&>VH`VQh0ZNO#L=e}XT z+}B@!jk~n%JJ_33-m?LD^r10)Mnl{(uGcS3KtKWKg$=B|G#0>)y?4&^wZW_r#^i-^ z4j#$%yzJrN+6}t^YnZUd#MEK|jL4k@^Q{i7A=pYS%U~|!+y%_APJ;bb^4Hn5xb{rADl-T2e5 z2hb0=(U;qE-eAXLxiW?fVLl{;aa^#S7Luc!kjzOYd9>yU1J5Tc2e?#oqy2{$!=k)PU7_(nyzscqkhf%$^3;7-E;9Hms zclKF$aX##q;f>Np)*-uUxehakbyY6}vj0~4wS2fb7I`$OdH@%`|C0PQ@GQ2yYn+Q&I4Sv zK7pt9Bm{Ck8_pa~An)08;UxGQ&O`#^!7y{$i$#;*!OuL%yDN|5t2-It<}(q){AXsI z3(`3j-mGWaa}JmgV2d4_8kxVoj>hJCI2bWc!rZAl?Sz*$WB>Ud!jH%DqKr9AfAjAb ze*Ajr&tHE<){QEDUfJ>^)k}G=`2QCz^rp`VaGci{;i>a&W;FZGS>uilGC}#0Fx0YV zWjXUzP3sGgnd5~LuInyh%_^%X45iG+rshW?kk3X4VcyzTd|a>{qN1JQ&$!o(>z_P1 zX9#jIfIH`n4u*^;ST}bz=6YA|+fxo4*+=8)Y|Of%J`9{pVHO<@=hEd!-PnbWvD0WB z9>V(J&YhHl6dvRr!o77r@GdIV4_-E1&(4o*Doba%^eD90adNu1T)Zf&GUr^zS~bNrv&+ z5Ang)aH5U1r#?IBOku1&6K>>A_;;u7d1+2j?Yn4v1UJ6-T{sn?`ZE#6-vkpu)a@X~ zaAC9$0gFB*rl@q+hw-B?ZGQlt1rlU771^QYC`$2Syk$uJn2Km}zqhBAJyj2}pK-6b zi5Bb@e28@R2o$jX;cYepF3bnS*lQt(^8kk#Z-48c@qWkrPv4QX!wS#J_9^{8eEtLf zrn=KCBm9g;6Bzdw=Z9b^ZDdTS1$;fUk)Gj&7RK;xZG~8z?~bL*0+GSzxj56$6_l{= zpFJ(r?EP=z`l&+xHkv&P5$uEWqp$O34%drwMNjs4x>E0*7~?y!-_OZ_&%Yq|uJnB# z?4@#&yoawf5|-tmU}Gy%J2oP2!xn_Lbs({g>o-qw?GO9@2PdwfY|nm_@7#rk!2zVT zH6gWS4gaPAPSk$~+8|f1y|Sadv1P5)iSzK-bbnMZrt}W5W8Os*PByHm5pLu^G{_E) z>}PPK-aD}u#fjXz8gUJ#fPFolv{?c43E?jK2%`V@p%3t7UOt4s7a4G+|8=52a3xpX zj0-)a-W_K@e?Q7=23s=k%Vm)n1w(BY?Ich~EW}`vA^;{Fp-uZ(|q&EXm#&XL2J&+=xi%GGop$C7z4j;SBH4`A-r zlltyX-re*$&Uy>@J;$7S@8N7j-^z6tK~C(g&%>5uhjE0@W!-(_CRPoPA-#JKI!90A z%EQO3jSj%2ybAh-T+`LL4dKmANN!n&UF_X$=J;I%cY$>TXU6be?Ai8aJ;8^0dLKvTnpmfCr=J(jU8(o3>`(Kgta`I2*@y6_U+@xJ zKrRCr_lH?%A&c>AET8%6%Y3%@`B={TN@=t6V%!i$o8eBo9ArKpS;2e`pqmL?7~6Z3 zb8pH<0DB!msPjRL`Td#K@!@U#qkV>6SqWaCV8vWNdkNia7V-Hfto5;%zMRik+O%ggMp$R>WxQWK zcod6=PNH;V4Bgjm;q?7SSh@QU<^;t>~TIrnp6eyJ?m6OFYISe)&E<9%yU%s9*2U^4v4zdz#+*E#ROZuUDDG(LFU z|IgvyOlQX8NFU2D)~sYrub~X7+&)TjZ^AfS#4>Dn1*ogBH);ogf z(?ZE{2z5D#eY}CJ;|DTtC-5i#Dw*Kedh`20dqd7E>{NCmfbq05*G*(_4&2EY^2FoY z80Ryg&T>A#pEa7svzM`M>>{>Zx`mRxr=Xj?60^e6QMr9LE`Iej>c>Wq+S3KE%4GSE)OmGe&(vY+4t$mJ|;irWPO;E z7klr_INqHxfiL4)|3%bm{;k*iN&Fj*73YZ|wDp11;h;rg117^ucN&s{9FUh91`qbo zB}KWTlYMR%`5ddypN!(nsa`B!91BS$7OHK9c8-D|TPm@*~wtdH;j`*PZ-UjfdWp-?$r7);W*$Wj!{~ zfc}X!Og{tqC_bwyk^KM}l!F9kP4Yb*QMPjt!F*>V{bB@b@Zm(LCF@`8;|?NxDG%-( zS2r^)_%NsE!@R!0m;GZtjBQunLi%jnwPCyyHP!I5#gJU z!LWD>G*eeYFQu4vU=PMP2gumI1sPj6q37IL_6PBqFh#kH{S#mp6##QTXFiv~77ngv z?3FWuFS!q7JQBrc{%z-TgeI;ZLpyT~f$SNP`MEd!vp-{i04r_UH%%4yNj`>%XWl!2 z>r?!x zfYvoJs4nBP0i32Ii~T2w>;(*9>=#A^YQ4|+|9!?7A0WwH=L;9}1zBWTooCrsUh1E# z{J(|v^kxsEng7Fva^z|@opTNoB>5Pqa*@82vB)4pgwq#z>Q5%evyi}N8iZNTr45{o zNape)_&ly)3q82A@79@p8J>*g1F2t8^uuwH?EPRrn>%}>yzIDkl6JtE@xG~@KKta0 zxaR35?)~c5s6Wz&yq+G^42~eXdjQrIJ7BV69~|rY5z=uC@m>27+qnU5OH0r_auT;V z2i$*l9GM+$2wPDG(-41Xx!A(U-GR^NvEg$U%$SEK|Fq2^5q6xLdScJu2IdwE5W_lL z0ArW{ejh?akdF|1T~&-1!Jd~m`iUejBP6lMBb>2bfRP4b=+~3%7a^H-ni#SD65rE* zhch+^=l4;J3u7ru5oYt4yVF24Yul;Rmvq{oM8+5?^y{7>{0lq7QPoHz5q{9RFI z6s~dI`rrQD-{8QZ9^_|-BA&ghk?bW7VQnv+wTBaf>)DgsgXVQP2ymK*FdGeoQZIex zQ};FBhyQ~2;4$YNIBWd>?7aneo#&b6pU%wg&dkmKe&O}Ag8F(!*OYt0IDCgxFR zr-rd&x=hJOEx_Upctk8UI4c9bK|RB4eu*6O`?Z^KPFrL?pV&doT@BgQb~7q;xfq);oB6o)Al zU4_^PbV{h5nt=7LBF0?${DWG~wUo7AP0iM51To-{hd&zp#J|Sex6X!j|MBDBtpAXK zk2M%A9Q|cRa)|N^=|ut$ok`5$iqGlpDh6*k`GaOBwTF#u`LcqewR{e?lGkU5eQn{t zI`W<-C%MB%Y5*ffPkl4B!IL||}q-P`oiowxJ~7~o0jcjw=DLq{&Y zq{y;D&2+Yw5gNTF-cFjn5`2_cV;Q)wDfpiyxqvNLrnCD}+0naZ2fu6$IJ_A(8#8!= z=A21$a3FK?Q8WD3YJ8R@@tE5xIH~5~z+kr)#EO>q2Xo>XGs9XE`>y8Ef^+YPZFj{E zx?vw&z!MzFF`VX&mL1#`W7d8-y$$9DAHQO%oR&PbAN0Ei*R$C7uJey;Z+N`->wV{c(W3FK&Mr&8&7`)ImJuamqiJw5pOrQ1oRt}@ zEA*YXg0FZOz##%L|nUJX~{PMn{LmYG}%WbBV6{k&WQ8*Ee>o^*qLDg0A*tkvB6&p1tG({6VA~n%xy=I1%YEEpk7G?Fy zvhkqSRBY3N#40UXUn<{?y(+`!hn1GfF+N`2Ia#t#jMZ#c2d$#-%PibibF7Uujksdb zsySM1yBOZmBF_9g@ay?nyLO=*u?4oAP0Quzabkj3m&cLTeIXc?~94qLug9)($AKI zrgT+Nk}~M=^ae|GT{=Y;#2%}`M=FbA;qtp_4Y>H)mHa(;uq(lXmVx>E^SaYx9EqcT zCwua-oLEz(GgrWM@o*2LJA%^n2F%-nIXq zt^Y4fSI^y)wBGM~Lv7F7*G9|0osIY#R^Fsyk&<7vgK(CvA z{G;{kgLqYxg{r8~Uuo&<)X`NyZRQlU^us!OzFSvr9n{OO9n_6CU(yF3zOD0@PU*mf zBPu;|LcX2*v^2RuGXi5Y(KA}(JyJBqzeqE}YcwaJNsF`EwJdX!79`YaZcLGuVgr_j zM{(9&HQCBSQ|;j71bAqstF0`fgTem2;0Glc^+IAp_JAcm%mUwT$v&`T?ad55Z_`KN2k>{)r45%gUt5cxvnPHv zoMkt&xpFk0uTU==xvinLPrm20e2OBdbtGfoQeuOYogM>D5-fjLOS!Mc58-dt!eO(( zSF9yx%uET8EA?Ts`6K1Bbi91nU^YsghT06i-(=9k zGQ|cM_5USy{|VV(%Z$J`XAget`+<-BOV-a>fAcl-+sn$6zpJXvm6wk#{&}>_;I7$Y zYb@aF*s^D1V||HF>frYn`Y+K`*%+s~nqU=Xx~Yt{-`Jk0#^y-1ccj6c-$hOMl&;>~ zr5ksS=<@5#WxKkMbH76wwd7iC}HrG?Q+ni&wPDc(_<>XWV+LB*OAS*f|P zRhko5rNzlj?2&rSi_F)o;6zRH4b^04H%+mz(L_tM7hP;LbFGyYINNHelNCBXmOPqk z30UB2H&a=_-?3hcCZ#>Sz?w7G`zg@dT7ItRpqNw7y);0OvVd2hYLXuTPOJeOUop_sb}! zTJwYBG>0{v?H3L1pP?mjZ)-VMcBbfY zW7{2;PY36kD!av#!0OOzoJZ`va0)oZTxyex!3`G4cq#G1!pX$l*a31_2kf_>y^#W3 z;4Q4CSI@A2=8lye+68OpPmuG%iE>&nfmols314D`-*6=7aa}q=;rQ`9c#-Ra)+jT< zOOZbG|A7AmVw1wqk_skv^Z*;NrygWIrJn*Vrz_HaF1g+#S_Ajf8BErcnBR23FJ&?K zA(;;Rl}zvj#@K{~*o3*y{OeaQJoJxgzd!%?+y4Kl{kO1QQd?S?`b8Igy#>W+c!j%g zS#VzHZvq3F3r0N;uER_;D(92GE}t?`7T7`ORrEU33+9Ghb2gdNXA9TSlNG_9PA`an zmz$!-4tTTC>*xb;(az(W6oO2MPIJK=MJ22r&(jU438t_MBeL&op<8B za>rjp(?hlaeZ(?!CVa?AlS6Hl5$UL4>SbQ!n*Lk?>=B;@qsSSb!(I$j40Wt1v;$TQ z=A4gsSnl)StT;lOZYXh=x=xp1IW#Z|As#LY5#}+G4bcD|B6-fic89~ zKknVqqoxgw%E*hSzsX6qF3Yf&3$&8@%wjl83*j2ApvGaqMQs;>c^cE>!n%9#KDzQg z+8G&m>Pv|k@VRy?tv^S z_Lf@2S}k&5{!SP?qVhyE{vyz9CGRwR&Ba8vtiJ<(z{L?wR{me^Hq2%K%U{d-yTGe- zTsT!0i>GU~*%Fx=d)?Z>hdU@c%2nPbv*b*^;7>jn zjtvN+m(7lN-kh@@?q;M&Ua!gUN6GQ90porn2QV0e9k7Hav~tL=WyGUB{Rd7f$AP)` zd;i%-{xR}@cJP1ywfp1$U(B92IXy2w^WE<5E^X@EsCslS3d+-|@n@^GqfS{_(Y$9X z=sOrfeT@1D`Hb}v{=clfm+2f{KYoFD+ld;Rr!6|^&Zcr$16E+RNY=LS7@XjJCPm5% ztZ!9hgq8;SYh`$djKk;?&CQZ)ahV)Tnq-mRrWNT;T(vUEs*rtAl~T5&?F-ju3tY1r z=D>M1)N4&@s;rZfWE2)6qtF2GKX)y6vuCX=SpPLL^K({UP9$2Sv9j`Yl(F3^_yxxF z%q@{4XMZi1D;h2V^ys;Rzq^trx*7KFQu2Zob7TgNXv)4?vCfr#b~`P%TMb_gZAN0f zbw;z~#9FV#o;zae*I_rjmQR%r`KITx8FE=LncQ!p))7~Dt(YNSes>5p=@jau$zhK2 zXV3Y8N%*avsW|V|3UOF258gKq@St#dS`v6}$SQ0R*s6gO;9)dg&hYQdM?Wr$(T{2M zh=*hYHgCuGEXIH(4*|35|7)4e93Ustv2aWJ-+uPd|8CHV`}aQn&H680J};`UIOk?Z z2Q#qIRbuwFwlnvt1KqW)^xN+`uoZsRdV2F#)8{+`e%ox>7}nZsf&48O$!`tyD|-Lj z*axoEyw<_%aj_ugGF>REHA~S0_mEd{zHCy^uqdF%EhlWps}ed|m9%x6 ze4D#vSJEt(>Q;HwH*?>hWO!YT7fz}7<@0K1wpSWFJ*UD9rSI9Sb?87@rzglf!e7Q- zPUxrD{BV&EnEN}UK@}+HNOyWt;dZ&3$kllToI~;_wEcXDSt3KxsitnX4xG{rTjogb zjm>KEMMw6Ko0E*)-L%xjL1wNt%y9COCw9zvCHOmep$li-b=h>*alQgf(3@cWomg|n zC2*Te_?pc!1==r_4?Hh#`jsN=m&u3N(1*Aq2yS2~{d-yA_6j5>i6l0OBnFJ;xv|8C zhV^%4&27P6ofm?yPNo*a*|!|?8}LSK{_uyX_xxI`N5Un*2h4r`SACo#2a|C!nmORg zxWWBg{=LP&=j(si2W!__d)3xfTs5qJ@0Kp~rr_3ZZBrIp`*3&@vGk_+N4YDrJQ;3Y zjWUZ8=?gWHkNpZoxY4`L9(E`H@nGG(dGuoK-7S}KUZ}-6td?hL5^G%}+r*^4^*2k; zQ0(rV3hnBUT~3D973CTWghpZePxhE;XMytQ@p? zOp?Qtv9DLrT@A8MjRyDO{ChZYULDYF<8rk}gTjU$D+jrTyQAOkOgzi$a9t%&Pc&5` zY?P7hL+@0yf~m2r11E4}-#V>?Z*H*yzh_Oqx0B4h-Pr?Z4EVaLq9IT5FMF(739sCK>HAIG$HtRB7E9Hjo_hV1^I2dW2 z^)h0C<#JqSC7;X;Ic4T(xv!fRczenwJx!q-n&p_2tyNKxvQ1--3N_r~6FXFXc8>~= z?NoeMi=1-P#!HJ8~sWkot`Y-Q_ZFBft&cQ-S6q3!A6W~@}Wf!&*#{kAbz35nhc53p7s{>>AggTI|10yQ1I4Z(^(3luPYe)8iu_H zUNeI{ak?VtAzD8AVVRAGH!}VSIe`6H&U_xO*iiD75%h{YMIJLAdplc;;ekvV^5}kx zmGhVUdy9VG*ZcOs@L|s`G&Y`l#2@{gd~9oeNv4v(0aNlKm0cE#hDw#HT9V~RPH69H z3^%(3eY8rI*XN;IL!VDek>cXK<%NH6b1;@S_(y;*bF(}x_^PHfM}Fwx1g=}7 zV&2cQ=b2*_vW{2@oPgLfnzfF^??+n9Q9K;QxV1|a3jfmwAFvh-&X)CFF@`$d#NUEH zJ&nDX42C#W>#U|J)Q32Qec-ZY7Tlbv^o`OVHt?Zt3!{0H?_1~p)$K3(J^nAFhd%qz zjxj@?`hLb__>kzQOabpSCr=KA`&U#IA%A8n&z?q)1~$kMJk7vg&nZlRkBlC`TbJnz zZ_)a+05I0o*wl5Z05gnD@t1qBn`*aoD%ueHfzM@hG%6Dv$l%&SIi$zQGSpiRu_1Cv zM=Jz;DRavPx#y$H&HGlwj2ExcY=zQST6=7lnwYK9_A>pw@88tjFF(~gpM0d-AHAnf zKL1ST;G-8a$0Mw@QZ5;>)Bzl26R?&(u2A%te16D5+}Fs**GiuFf^~3_J-PhhtOj|k zQ4n_9*9NrO9-jZCT28~UAN&;oHKu3blL6YfVZU=iAES)mFJ zbD|G;4RMA!`wKm2H_pJ?Rq`VbiUuFdrvIS6I+K2e)AAuF@x^w85ckIr4~DOqrwDq& z;)oZb;8KQQ54`CwwTD0H3>IWQxgRzk?%420;CbW!$;mC4Env5j8Ydi*h13{k!4H`- z}lw5lD94g z)11KGGSq|?!Z(^vZ6GpqZ6E(HHa)O!_Ri7s=;zVP=o)Jbd1>npM3V2zWDM>efs4W`t+;Mb^YD9v=6`3b?zAT#41^Zd&@4` z6J26I=1-(5A~gigs)Kxk?09X?yv{Z90u%7XW_dcGS7JlH%KAH6pws4VO@Diw!s!b! z$Cns8+cVqEk=YStYTjI-wP1^$N`~=EKFAKJvHUP96QbY>U;44Rd$@ zKY#rF-~Zj;EnYGw(aqiF-9^;RCyb;wn|ilFXJi(2ek<_6*eEAzlk|kle*tdz2>B34 z`})|ack3p-{ob2;?dB!s9p+$HnRDQbetU=$+Nx>HTB$)7C|$iT9#z?{E}eVzO5eKG zbx_Y|ZG*})mD5wFz*6+$+DnzXxlZ1t_?ol`e1)%U)-zM0DNkwL^n1N}PM?4El|Ezb z-}~@Gef-52{I0L`C0{dK?|ky1wq7`<2>OCu^Wx-|9wMiBPqg48Rn%6fKu`_&>TNq4k6iU6bg8s)d`t0)$sB_&^XD6{M_9nn)xgs1*!1z`ul>HKnZ3uEP zQ=+Gp;=re4$x9RI4~l~i5@oln?}{ZS2?2ZYWL{7Ra|0~E;*Dp5!47>0e(A&Xeo*fp z3=TX5zWKn1H47fVH1@%i(Z9V-zU3Yj6>0G6Kj-5Y3zy7UmzI%qIV&qwYr#v5z&M?V zi%p3wtX5A`T{SatqaFMDHxD1E(;i}i*cf*-AyVj_yP!`$`+%N0;&$wzmzO1W(oZD~ z*^0|z4r*?qj$fo6aOZX1{P11f`TSEwlJ|S2#;9V?Ce!&{g&SU^i$pa;>*5$@yVB;>lJG0 zO~-dDg!t7XD@+0Tk!aCGDY`g@eHgDmFnf2fd;cJEacUi2uEd4pGQqAE@GfoSLA)9Z z-chx?MQNP(0P5Dza?|$k;%_l z_#dCU%xK{;EjV?Ni03iNWD1&*u)Y;H1j7=4}L0gjx1)}Je${wF`yKge>aLbyV0mMWaH z9!Ea99zT@G`p1!*BoI5qlc&USA5Kl(#dw0Om%<@s&GR#YREIrHNb)4l@IyO;9+nq4 z_nd!25Ack!Pixx5=Xz{yO{V?0ra$L#?K;~L_AYBWS5ohoIejd9iFtHzN@mfgI|tsI zDR`d^{%j^Z2q$J@cJ$_|qo+jCVEul64hju*Q$oC-;(2cq<2;qj+J^)>qh02pVC;B0 zx}n#I*U!T7yY}uKUApy#&R$1bO{Mh96WqY=zefycumc}p4{m+*zIMM%zf4!H zincW=ds7K>KcdhMKyNQC2z@H>;UaR5^+9s?pnk{tga$e(JQ!Rayf7%nPuXZ)C)DJ~ zHOZg;!vdYWaz-C~^^q>W`3m!+h*7X3e%O)3lu&J`XkmUz{^@8yeEmo zK566)>Fl)_;=wR{Km@TsJbNx4+n?lRrW7AbWdzu1J-JDOJ9dCQkmzlxFsJ2x9IHj- z`!>dtRZ*Hi4;{MtE2q(4vp_cHGvS6lM_G3ozv*8Rul+BvOx z(A;KOvbV462kX|^p)olce?tEnG2aT}z-4e*7S0?--|I7)OKmbeV;x%hEox|hhmPJ; zWVo|pqut<-dnpOO5F5@J2zF5b=OZ$KI(U7dPTah#ZRgR6xc#bL{_u{roja~x^7^Fu zBE?i@s<@{?1-%VQXWcT%D-$=CYCUtivbWZ&^V}X?eeZ@o`T8rJd;3k@c;}AZ{P?aq z;7u7YfkQX0>Ky$+ue^0zZ+!ZJ&cjpKfIUfRDOF5$x-vHwsC;LA-wcrW5;Q%zQtNW4 zP5CJx&`rTXZp4M|N=yx6hBum=+4zn10cgHwu=Xc({>DY^C$_lp(VK9Njw%#vF*M$n zJh+y*h8tBtY@eDN376Ad5$vVxv=Eh`%~Og7d_trvwH{}M;|D_Rjg{nWqhufE5R!)^ zaMn}(?UWv9ul3|6Nxs%fWnYDY2bog;SwwzsL>}O{hJJE*>^^?B^((A(O2l|dK$XMgwwc>iMcnq~HDU94V=iYHd~0ZUyp8l4{c7{?Lw z6JO4Qt2z(AGl%t0NOEMxbq(C5Le-$hmX*akHAAeO97x}wkK&^}6on34FxsJ^oTtjJ z8g+A?H=W+E60pVmo@QlltWzs94r=#ys%%@cGB%d0aC5VokM2|<_i1g#YDMRx<;Zqb zU=y~yctr1W{_lMJv2MKkj^6s@6PV2h zou!EKBpy>$*jugcliRfI%r0f1Bbv)TODIZLAiN>J0OtHfd8@Xq9G+;S!V>+#ynLu# zH|xZuV`>El-?V?5-gxh}-u~!qHFoj(nN?FmzL}AOeov&g!pQ4`J?#{OPb|dGRH9*7 zM$C~++*wE-ni=DxKs)?DJ|@KteRy)tIP#B7aI`ey(e>E#oK;30xf4D-9%$351WCo(C!W@FJ{m{*LjGVpyvDK!Fmiqg9|J>N`4|~Pjbjgfa zGe&GR1=qI&$1_?yPLqZ{N6{=znLZcSnV4o6?n<5scmU z)A~4nCC2&?8+s}t3LT(O&J;6U4!?Xv`>!5T2k~=4eJ+?_w4%#0RKK%R`!Ao-hC^HN z)0s+S&PEgK-2fI;#U42H(kbmlSD*$Ac-Q4~x_$Q}ee=z?I(OT^7r(A!EOkg3I58(N92$X7NmtL+;t5xo|%$e@cUfxU}Y(swe{Xs z>;dY55$lv5;i7c3L^HDjiLY$vlY*19WL#gKXU6;uD{J~@;#|;Rnxn}RpGSx2x0*EZ z`9?=a%Ta$=%s=51bCZQnPZ;^z?8#%E{&*HWvNJjNQ^+&tfG?X7gRJIn&m;d|3@<&q z$d8$s1?t_~sPcv^`uGFr6ZQlb@KQK-Gz>c!#s57fC0xm9EF8beEQoi&iC#I#8Rz{i zU#}SI2`P1X;CFk}bf8ypH5u6IRMj5bq_#6VRJDhBZ)mRVdF6t7(BL}^m-OX#-_++{ ze@P$66%`-YraE*ST2Jg#HhQ}y`H>1Hy z%(CG`r%K2xwqP&Pt4kCDURc#!`Gdv?dNS?IIp|#C&qNEO|+NK7M^9w$9Iq{v3P71-dBS-vO-GfbVmz+5f3r2|>=p0q$BK=z#sV zRub4~0{LMQxl#(8yHviO9^$NQo>K^pT#y&2*rauG2Cp`Ti*CSpm!carlXzg|Vz}zY zlhD)~qgiu?phNb;hco633w3g_{>`7T?0@(XH&?s=x@gWQ`^h67zc^(mHiff4b0mGP zQ=gS#-x<+!Fc<7$+1!C(9xmv-hpPe}Xc^}@f&Cp0-W?MYp!lR*Uwmq#WhcgM@+*7Sea=emlbt>CYuZ^d+sQKhpmG4KBbF6*1t(S)tor9AvbA=vSbE2oJ6U)R11$5n=(IrAp= z;G=hS?DZFw*@3S*gr)#``mN-g=b5pw`@~Ug*tUtseY!-S?Nw?FuNi*kt*bgr-qE?I zQF)c?6&&r&|0iB&uAW1Os2vUH0%`}$WS}mXLX9aFn{QbA)JWnV;+|M9@KHW5CQeB3 zvsY4}qmumXl?pDB8|$TXFo;wz)WSG-6(xBqKb}|-?AUN+#JDMfnVIX{7Rm_>U^Jjfnn=hZt`gcxa{S6oO zB$=TBX1jU{y^?4aU<(X&CI?&QdzqsN6Shtn`H6}Hql?D=my)x0Y$q~8H_>oTx}&hrO#>CO#Z0T1pty+<7v znGeQ(Is4`{`iSA79oV3Pt!O8{az^jLOaAb)PxR`YSGAwI(}4@S_0k(>^!j_(i7&6| z^eacud+cHMK#}5!=Q4}X@!h#m8AWK^!Ie*8{gc@9aRJUs406S8dnql#TXEQeIN!Cb zYlteTqhxTV^N1DGBgm2110^Yessb~v%L!9kHFIW5qErMAG?REKgSaUIOu&V?seWGI z?990^lnh|NOLgmpm|)y8RQwSSQ3&_8S8fB(a7E_RPEo;f0J z+OWqzno2*}40^vz!5xgzEtx|sIve}HX4OQQtsXBU`h;A_SE4!ZDLJu9;k>uuS1;c} zU-{O{+Q*E~J*W2S!p-x<%{O#_xVdhBH+`P)2{u$QgOQmr&Be;3wpPBQ3EXC@YOvG! zJ2xnc-;>QcWo@ofPDiEop!2rxMKmAasBJ+9qkMBaXZwa4sZ}S{7b~wD|9_}kTP_{d z1!91!Z{O0XH?L^hE6j+*cD%%XXgS=i0_;mQvwW`Kg3J8=9i3+$&xy;&wE0jw{6yx) zzPwKdsL>pK>9DpR*{W7BsitoB7`b;rRf=-T5|xr0tpw~_axAeX9Wz08w5bUkw;64n z!xs*K&)oo%`$AvgtKTDUfA`b(^fr&X$f3IM_v`Bl6$k#`yt_yB)byL!6I;(8RR{Z} z^(6DSPj1JjQ-|K)qSj;E)Q;}%emEd!Z(QfxA6HsSt&YEj_7`i|ypR0^zSO|)*>qx$ z8uo2g7dGM|IPBZ}-A}&xjJ}Z@s@ad}|RkdNy@MUo+Vf1SRDS`T40`;xLAa~Z=L-9WJsKP@@ z^mFd>`)Q#b_g3YDzYL~N_?0Bb`osR zuR$}}$(EY#j2F;h9j%4*6;B=bkj8=c4SVh(&1C)UoR-MV$81|zM8KH8$in~rmpIy* z51caknY>9OfA_`QY4o&#HO!lZ?#OiNOq1#3pHDB}iqWzpKiS0lcm4G%dK29BMe4LC zUp}Rmz(Q}`xvj6jY7O<7n_zX<-hWH4g5Tcw;2m`m-}j!|r`|LB!2(~^i*Mf`FFVNn zG2;5ybd#Qui?^@!t$Y2kF73JmPH^&>Umvci#dhJVd;>OJ~XbUI**h3;tZatxJ2) zoy2~lOMdB`PLUV9_Q8945BvW1XCLbvdSzYAbJ%+RKwo@t9s6(yo6^l*s6e;KFas_c z9~P6$8t{2p3p3)oTG-EMhFv_VTI|3kbng$I+OM?iWa1oneAK9u;{(8G{pr*4Q6jwv z>*+ztVBK@63+F`n^zDOm;=jCD@bJtC*Xeq8yGMK?(>rZRGc0LUgS;v z6#l{5xmtvN@N8;(^Wa-9=KL?_EKVEoxW){H?+1<)8SDGGN05C?NO-`Lf64WCaP;4(99zR^jf!eBznt_Ys4bSS;19eLLw1d7GY)_jQ9cGo1U| z#Vv@p$~lbE!O@97~x%QK6X&8Xvnqi-Kt0o))Lf?6l(!9=0?6f_x40y8fac>zr%{Papq$ z*|bT|f4dr9k`Fme26dc{u6D)nf1eLmWhOkh()uc0rWg1958u~aaQL@5-&>CC?VJ5@ z_%gbR#8!>WSuE-ThehwapsiL1IiDLjzpcEV`RK#d631WQEZ<nk;xqbCFJ=Ir-t2pY_#!-umROb~D!@1MRmY;);f&yR_#z za|aFUkI&dkPInHh;119G1e^251;_?l#T%?kiZ?--WjHZCOBWMzA+Q+Q; zBfIq`J!`k$c~h6c8?L|e4%&kIREJ$K=yhMdMo$xa{P5W$s%fr3r#+6IpFnc{V0ylo zS;Kl~QwPgW3{U}IPsc7~u*uUu6|8Wzob+r8Nj{_5joB0n;C@DDGLNYwMf2e=6~cA8c=@8<;k|hSEx60P&j-+G?K!Yh=dNAk{NL2| zkKWMn8yAT8E13x!fi`1}c2lQsKd@QV*wr-rYg&Dwa@wl;&ROsAeQ5vfBtI;dFXypz zb3JE#J3f7jlIydT%=z4Sc!%C$zZq=B=d9_+-+ZY{_>S!tPG~dsdgJK>s$t*lf91Tc z5qBJU?PY39H*^UD$cK}Y&46)Z`V~(BcbrWAIhi>Zv%n!7 z!Ki(~Jm#&M4K5O@1IG^O8v2_@(QxV7y;*ySz0SV+vUZ(2s!gm@E7(rs?siphu9AtT z_R;^h_aaxbvo=EsSu&tPISzq_L3ruUT!(gij&ATTk70-?6>=o;5b?vG>57I}Yz=9tl3* zpv8Cj6uIL^I)3S_D%S&}(y2cbu*WyGmg(SuF8XH+sGWv@N0AqRS2=U;CKKz8CJ$c#1{1~X5DVv( zTC;XVQb>5vpN04Q?>3Exr^`Rjnmc0AqQ&D+E@RJ`Qg>QmJ_Ai#bn_OD)f{+1hB<`} z;9QY8F<|^voRJpw9NDaG6@$B*nfhbGXD9+hKnbHL{|kSo0P`CaTevmeo!ejER9;Dfx& zqaokxJ$;B;!EPPCdWl@&MKvDSt-S_4YWOKBGkP`uqIF z{rJc^HcbZrtRHe?zzlbN=8GP9E^N12OqH&%+`PbUw-o@xy6_I0^5I`TF>d*uc-Un z0rViY>Fl-3Kg19pexO^#CAU8PNGHL74EEsojaQTl|FERJPEBx^GMQZ%LvKn_3S1QS z!sgwb=tQ3e<9}P9QER$>`zCs^XwMSo)$iD-?7CvGty<>y6oLoWs->p|T%cH~h3S2` z;0a>Q-Ppf!^3mj+L^K^@ltOHo&UrWZfWp*B6{ByQ4mOkmZqm;0I!0aW_&F}}p%Z70 zYRAECs_H1`OoeGVoUjEZvzYrhPd?#J-zQ{7eP!cj72xUPVVL>#AO67}_%F_`c4J0O zd~Vy^B@^UC&2k$3iPIO3)^ZE9>>ZagvmGs;`DkC+uTmxP*Cpcl)7Q_a_vjXtP&>&1 z172USUWJWiN-D{srgIt&;QO4#D{z8dh0Ae6$6mXD?LV)Z?UR?6DMAI>rH+3)tCAf`}__zVb7%#s>gnoZ*Nr#y()LW8NgumIeW0NkiSFWN-RI`y; zlliIY06XY8($kkKRy39>1K!gn!};&5W&UNRN|}w;O&xQ~p&i<^6CT5X9h_xm${yRN z(sJfhCZnyE6hSQztz&w^v#5#X;zxE-=XwP$^Oft&r(rhL$x|n^|KL96o5P99S6%2oHFE*^_S(f?S-Gs(6cifJFFGdLpxyIV`S9`edT_|7r`OJyH|AA8>g4W$4rr`Q zf)lw~$$9J1*9_4TxbxFjOyj)9>NIEIHQwJ-mrtu5zh6(SrLw(Jsbv|8VIOQixlb?Q zlP_Z{?+{15`^86k4Q|M-yYH~3pX*JuaJC%U!z}DV>Wp#J7L$}qovsicP}Q>m&d*zV z@#Y)E|6kyj@9HKT;NxHphrk~U`Q%1wLM`MM8;>5;wu|R=jM%-GT;lM}*VJ%u2Q`TE zItcdj3LKPcx8SAj--E_Cc8dL$nMKT2o3AeN%q`#)Ipmz{bK}tk@6c5+O#{YpmYA}J zS;!U5W%Nnpsu1qNHgL_eS5Gs?ZFk?#9lLZ!N0=LPkXU#pb&FPPNNZ13A`q9o9H~aDd5(oKIRI{ z3{uB|9$kF>vM#(%4tDv7c3jw{O@}tAu%$pba4u@WY7e6Was9owIEQcQ4qToa@4VHA z6TQz_J^k`as@l*%Or8bDE*?!1X2xf&ryg5G?f~w`xqju%+xi$T$XnnJN5Owuc5NX( z*rqP>`i+M7``CUsU`N0bk7@S};y?OUy6GP*H(&?XUZn2a%S?$DZQQk4^&Ktv>1<_@ zzvYnw6p{-R!~LmY&o+Z;Hg?wOF#i13`>(?-x&_zxCUyayNFx@&XT53Sm@ zm;JMqx^-Qp+{qEvIIpIE!Rq_@E2n%gdffAg-o9=RbN2t_8voB(_j{ik5fT1h%q&)o zA2W5xUK9Hz-&nY#2MSJQA7&@d^g#LMg~>AqEsInyg;FoAC6?ZEVIRJoSpV{VZ9TJD zn~!#?V_&QC;nlY8YA3fp#Qjbk!dCBM@Aq)#w=>VZvAYeMPu#@0&tUB{iO({yGnx2~ z+}dItCAPbA`<6aq{XYX^K0>WGzrKPvAzLMF@Cupt*~T7dKDQLL{q#vVTljP0(>!c`ae20iiPcKW(o|lBJ%=|^PhQZyYopr9J+@;D-XNEK z>+T(1>u%;57ck?uK$ZMo+E~A1=MU-98`uY87z1DE*u@j*RK2X*;M1>@o4ks>dgtAD z!AU;U8@%?*uU*%E;>m308Tfy_pZrb`}1)2z>v|;S&g4D^1_sb6TY5L9$@0WLXPCAzWKrQ-MDJux@DRRf87r} zW6M!|;43GHr{pIfK;O;a!x#yU1czbT)N?49-?g zUJAOxhR0;yXWno6j7po!b(MVk=KJpw+r6hdpWW4qV7@ire+IlRtFA;<#C2`-4{kWR zpW5&~H4>Yrw;1L@l;IEHlVA_dvj$g~RljZD4wcjvsgU@zoW6q^^1!+crK;w!s=h$A z@K9^OCAydc`w}_r9`8) z$LWzdtyjP{kDWOIrm$b#J9_D<>LF$zH-tlwU7Vrjjo`~Y9cpN6qTi;JJTFdW_7<8r zbNpvxCk#0-dQ^X-zxI0H|Mw!{m9H>f^2neO{i9wO`TT36rw{*TB6;9)`d1y9mtpE- zqRDU-hs{Cf)z*|VSxNo$FxP(0I5PvT9@dr<)M)m%fv*;;ls!<_Rijq&omM!%1$9Nr zC`s$9!L)W)YXh9hN@D(+<`Qk(Ru3nG8X@(i6T}r)!I#gH%bjHH&)&MOoo5c?1Lz&? zY*Y!F^!0GHYWJa21vXI&&p01@UEI;29T!il`{lFnP+scG>n^evs_^CM?6o4+p|U!U zvzMph5^9q<#2xu5yoM5HpZ2N~ed4UFWMyZ>tCBrhf!!#rVE!%Ga7%X+dKV?kysBUg z%T-*F#k`9&6_=rrRau}Gu*qWLz{0W|<@2>Hu;WPTz&WKU>gsLR)@@tWu%TH|^uk%W z+cEoYu7-^2|JA^Ok6#!&@;M)qm5cvk^}YMo_2=F%S+QvFkTC;GhKwC}XUMo0z8g1Z zv}UiGt|ivDf9_-X!>Z?uL8v1gaMrwRb zTj71c1t_S?V{Sx=+O{`nTM{y6FPNJ?R>8ltfrbX*2?*>rH8zdwX59Lu1@wz*QJwi4feo0I*4sLMm*A@ zYjZnE;TS#x|&4){PeIbkl36|7kecBLRM6zUt+Xq^6+tk+Xs#6|Iy$v1HT_K z{soPkPVXQ(I#U)+VlL}24MQ_&zVSkOKm+0b!~di|Z!i3eL-dJs9_Z-n4Qi&wU*B6P z!#-%?Y&T#J8aVem;euSc1zhkHkjG_s%w#X*r^l&?tHiJ;*eB(zWpVC$6|rxM_`HmDt)aiG z8Z4=dx_yw%)>TipGT->Q!_PGu+i?^UcyW`e;hk60_g;amFD%N$4sd?4 z14V`ln_Pmhibs&5qe?L2o2&IGL?Dk)5mDa{He@`v7iqq zTG^$L!lt;;c7xHK~x; zE4MV4-;tw@JG#J&5Al6!iPUj-oOQ^)+i+eR4sM|~{36dgscm4rdx#shVhhWd`S(`C&X(Qy(ga4_ZdAc^N*T4BuXapU6*%CN_vs zAwIt}D_+&a12yE9rPzxkuo4S6+wy9@XU#<|5*0HXs%HjF=sq_ z@61A^w_ARYHaKWDTG8wU!}{`=V_0J}Veijq<-AntS;^klwS0`g+e#-Fij4;es2uC;P9z z2u1{t=*S^$I&+fR^07YLu|tzj)$$69Q873aD# zH%V3a_DXQ0a^kyk9xL$imBa$&#DC@ZimHOtKK~yF7sSzW0rQ>F%tse`26g-e@H^(v zPd9qNBi|42_sg%xu=eAJJTcGAc+p=K-}_5!GILMQf0$@xv2>)V@t$ETmV7s8(Of-0 zcefp52Q}1f5!7uPwM!haE%nc3yIhsoieGHndV+K8yzuo0zQx#5gq;C90CI;Pj_-H8EfNkdxE{A zCZN^)^ptTLHhZduF`r@J%t_38o2C^utK}03cRU|^UxB7mIagT`@g23^zKfUuZTGy2 zBI3m2A1-2neChz1*!?cB`)i!z*QovP!uPk3#M z>8E>KV+TH>5&eFt;ZOha#?UAKCEdo{c(?&y|M5NiTYog{0mtC5k+VJhV&-^ypPz${ z-f&Y>ja+T6@piTvXKAis%NJ>+5&h&=%)1CgV=gnDwJyOYl(G*>lvBZDbvfMYN**hy z1(tEK2dLHNSCwGAu*)hebAP*hu{YHUF>Jz5Q{bsId-y6xSn z=-mW1Ol}5uuL;b#dRMQicW;MZwv~PqIEw8(Drnh+MsKefedsMQ8`t6Pb@QZij zd&*RRK1O+78f*Q-nXe}wsjbQTu>=_j~ZfpvV6yfVCeG9v1eWX6=96yW!C>|J5Zd;<*)pAr31;!*-(g`rUNT z0L}0Y*23Tj&Ghuq*tO0Y7Fw0tcB(NJRMXL>1pxmB!pO_lPP2UE~QZLX=Ax=$_m zU^RW#e2=}6$9~AKDhDezta}apSZJ2kus-aK0``gFDy%M}UI0J0w?j4PTGsB^tfsx& z;U*n{FM2|os1Y_(`z_oAuG`W9@WR)$4XE(?o#b#Zu{ zjAD~yoUmT=(D9w@ABE__>=7Jg3?`2R+*p55v=vX4HL zQ`$j4QRj)H@XvOtY2SW01INi3j;V6jG1VMAr@CV=tLpH}syM*?it-ADNw73kd? z&U%)rh&^k;|0_!~!3d)i=7Z*#=>mA$qYVAn%oTl>SnoF)@+_E6|A)UGGos(iv!@L! zaJ01;>ttv3Am{$C#^Lxsxwj%?V*Zn=tgQIpY50C!bG(O>blZ0euIwoss zNV28`CTfZ&ymFriS;u9_C#zU7rSu4Hz%Fmv!P?Ppy=e=&FsUf4SS$3R`_xK@gb$?$mZiK3R=(?qQ=&|YpdF+32vl5+(Qkv3!ca(_C?c{ z&8q3_VlF(K!_F-#>!vo?y-UU2U`M@s;D7C-##0Z@ORW$ePy!b)hkQR4PRu&XWm++F z6nY8IX!PL6H5^|*27G7K3y*#`YT#oZGGn-B*|Hg~o*vEvqND$M+@1fE>wfRwj*5x- zJGY3)C!E6~XD<#6DOnsGdUk18^cM@m6IlNwP4JJ?c<%^J@`=>!p!Hf2nSFk^d`MDzEO~X}CiVeXR6_n#sD$1$JR#Jm* zphjE<-k;W2`-uzlMMKaG?bXTj=se#y7oK=tW5IPNjOhnw`g9#hg$0^}Pqs4>$;yW50^J52~c+fQmcWABH%An4z$S^=A(lVuQTC zeLy@xOqo+zf#0Z9HQbVhZJpE(y8EvB?v3;4i ze00C^i2HIfQmlZI+Cxc#_i!S9}WQ22I@8TRDIQ>G5OFn#*a z$_Zopo7-5g{*yF${xhxl{r?x+;D~=V^$8j`&eGXy$Qrke!yN)I548{ebl@644OkPX z;cju75uL^CpIpt3Enx0PwOq>E6uuG7Uu;3*#@))=w4c7O{qzu_Mb=19z9C+y$Idew zw!q*Ic+BJ6=CbzLT!l^bY6tUa+13m9r%h!I)qPhdys-}QfO_^p)uvYR$2K@&8{vL5 zf;-XMm5zQ)Y=r!L+|XSzW_GY)ChI_r8}Ot?JpG7V{ue-`2tzFI5(}Lmm9yrY+P5S~n0^G!tuds@6vh>< zxt_k7Xl1GXQzmG@sKFn2{mCe=SdH?I)d-I$yZ9C zYzyzdN-xHr`L_Pe{kVH@_P#IM!M(EJ@CNHpZvML`+fI5 zzn>I)?>#TzC-=O7d%w*Ky7%Qg@W9{ypR_ssk5W9~Iy{OX^5|5N+(zZ@SgPh;eHUyJ&Mbo>lY6^!@mza5Idmn;phHi z=t2GQGSo2*m!Xzz;4&EEjSWf{Kb=vBYlLCOc&}voo35 zNtwjtyWjVYH;?h3WHPh6|2@z1uq~SpRny)px1dEatuGG|?6jqnSf{i}p56^p5DZWwaHvl~0-YpLk8YNBH^0 zXWpc}P7~iH_Dy`Z*oN2_)wcQYpITI(7yT^yN^C>4Rcv3>is;geX;w6QnuI1aLELGc zG;f;EvizcV#ygX}Wnffxd9nQ{9JrUvI!^z2s z=hD(sE~lm?UkZ%~IpgK+e#FAUZ2$cE^S4Z&KE05iQP8q!GMd;wvG1ZELTE0ubu_VU z@%vDR1COsowJFm#x>mFYvbe$bsiO5m(A32*p1ARaKSeI zz{ps;Y5Mf%RqeLoHbmPO(q_`c?@zQx)jmG_(M9#Ts_hf`F46uOv{|&bo}V^l%?i!M zHIe|cf7?neg@Y$raEkQ{=dX@1x2+pD$hNz|_U>q_L2Pjtc6DvV1@Z;eLoFl(={~^XtTZP_EJStnt$VXs}^w=R3 z?aW0=X$)kgv1A;vzMd?oO*;z_mKs1-R;zMfHdd#hvata18Qw^gxgspo>`TqnZ*87F zZL*jz#CFB@Mf*j2ey;sbwq5M2_>Aa#F^9e2D6w~`*;V}OtcqCb9QWY<-Fp}#WA5L#5yB@ta4d7nRLxXWcK7BB+&&Pe#WqM(14rs zdaPS9_u9)ZOcm!maSX&*_^D%{YQJjSf8Y0Z5>v18hP*El3jGkCK|M}IAp3O$x0!pt zyJv@zAKrAZj@+0!)`GTh+zg_Vx%=BXwlGFRF2wF)=KoZp<46nn{M&d8(#V}j;_>i? zYm_q_$SDg=_Jx~|1)MxLAc8ttQ7N9VbzVnZqqnJRu=v{4DHFx~_vA59wU_@^E~@8G z_We|SlaiKO)q1;c#m>FPMteRogBdd z8lz4S^G%MCe@#t_25Oz;Hsm8Lm%QM*RBBXHPp>E%7UZj0v6k8+!VTuOI`E`cd6L4P zyooZ7t$Ku~c*DWn2#Lwwg9{eSo6VN~)bCi;elfnpF`Dx7tQY6RXS&^uQc$0-CJmwT z0Hl;tmy)$J$C(Q~z-Rj`rm`l&G_+W-C7;h3N96C|y7@iT#2h`I9n{nGt0bb65eI;iCJ1yNVYlq@O@ z)*feV%49A$^Fj7D;2hZ^SI5UO{)Am&-f&yrelkN8h|eQeZEGRAs5xZjY5)UE4Olp> zBiGKIb5$}mggtPd%%HpE%5_o`{l+cwg~<}$-@Efm&GqWWZ0C>t27b`~H|D-Fp z=dF$83^bSG82OkNu3RKXXgA`hlVR>)jFqbw!pvG1hL+@Mk-52L?`HBQMli%0mF>)J zF5h0QJpW$5euL)&GEJ|OsY}ku$k|~OZOen4`@DfHHa)|YFt^r1Adf*2`IBDMZ5uh; zkDIKME!(L;KmxS~%Tt*z#qpOQIq}-;S>hV?$$5xRmFG3(*rz_^)QBk0ArD`B*f<&@ zCNTuwae)ZSjzeN`I%3jdpuS`dtgWF$Z@rAH^lhxoNh9}IPr3oi3^W*z zZ^Bt}dER~Z-S2Ju+Ewztno+=WMNqU8boA6<>!i)v560(8<5<_R4RY%EZP}BD*c=bo zd+0$zCcP|&wH2;=x(L+$7qX@y`Z+L^3Ge4;mOsjt`7 z)iU-Y?H7Ij?8J%BO}7zofOV%_2@NX%Ej!;$+)t@8HH1}vQas<<{1 zZ5HEREXwxJer@J#djqxi+-z3EiyGAqPR4Ncv*(y5SBK}JJZf>fl5cNrq(-fQMbOt) zgS)>2xsnzzb)^nA&%a%)0lt6#F5Y|ZJvBy^*NBNn+G>)zd4&MM-O>1rmN?}cJ&+M(pQ}}>dY5lB&+I@gLt)0b4%Ls!9IiA765)^GpC8L-6rh`Yw zygNy)_j}Z1?C1HS1Y!9x@JaKBbA%Mp*Gpd& zY90#X*iVRcAamUxu}MydOZ7uwhyz^NH+DwLsDHeKx->LBK9-uor=$!8%;W7ne-4d9 z$EYdS$DHC+m~(Cqh;fEjpgpyXm&1|g3S+W1%-1Z0lznN>-;l%Fg|Jqe4M&a*JNC7Q z_994GyCr2Vuj8^e5J2q{XA2E9kP(|DqrR|@9z4v{sn7hzcj~XraCo}?^7P=FaY0t_ zAvZIS>|PiBMesCR1F8OUIB={x=%~R_ZzXJ)I~+mXzx~IlWpH{7+fJT?b50r3Iy#ZW zJVtMM5?n)_A?28`ruK&m=Oa7zw-wv(uyzqO!WY7hbtO`*MQ~cZ0KOKQaANI=yRJH% zmd%BPIjMd&I`Ea~<3Ky>CX160%z2|IQ-W}(wQyv#`Oh3rT4U?K_z{PL{e9c$E!(bUa+5ev07kBo(7srYhp9kuz!JoPGLF5dD zdRpT0<73%H+aDb+`D<9PBl0z{V2y{nF7^3rb>Yop>b+ha?%InH#A6dcZes}Rzhn{a2<2ESOry?Z zaxh%DUx|ShND8w+IJJ}|@64pW^IR-{b7n2uuUf=$m_R+ftwGhS@JHmGRPA2tZBxE#C(|LG%;_o1(rG0*bo&DqhMcHh55lYm^rIa zuJ8}ChA-J&{`UIRm!`h2*;?v4>%zlO17SR-Db$&aa5YB?&-cket_ZMPj}%_x7G#DX zhQGOZ+cgNXRENLOLb$T;otMmn3w0ruzViHbRpUk5h3#ml{BzaTA_N87z)I&G&IL;l zNp5r)P3WX&=20iCG6$}TY&gjCVWnWsRpoy8)$T#z$S@oWD_{~D0*fGT)(C}>GZjS+ zrV~N}tPtj5ju5*I@Nl*ygUT0vJ`M;l)qmCKR=x@^j_YOfezoa|_KSxTb~e<$KR7&qJv_%1S1LGHhEvns z9x)zPh~{}C(3c#<@=^p>*C4gE1@Z$u$m%}~8S@I;=zqxW+Kt$zt#FD9g;PWTLRbqN zNtSPNvL_T-!H94%gI}N|rigJhqXx7m_2gWT%yFL;;e>2z!sZ6r zLdJP4)Jh#5TC?G*@fswnW^;a3r)IZC#?$Tha<@5^L5^VIrWE9rL^79EM#fn!HgTOC z>r3s!7&7~c5WaaMymDp8BwtP5*$8<%`CB)rf%D)hE`EF;TX`M}BDW@pI#*FK)U{4# z{VvBt2Cun8{G{+prS4mq4AC4jS@Hg;Ckr?&DHw&+z9>i!<6JMNuDzL3=RV8ZoWBQZ ziLa%Oh0O|h+h}ku;Bz}8aUJ)A#ngCRm4(4-YEfz;z{?bo{$^yg%5jxEu>`h%(~d&c zatxEZ_db%zS5c7LsNnv^lDkt&2H|hWi2Kv$pOY2+M{GOVjhM1j6Kus?>Zj!L_r9$W8@(ln=kLg#=M)pe zmHVDcjp z569o7?~rVSljNk`Byaf~c_+POosW}`b%_4OKKe@A`Fc|)=Y^Vl6j7U^BqNr(bz!Jf zP~)Du&f7|o$vP^<_A+YwrTI{o)Cg8&Sgc?91|niyev^|Y7k;@PT@vD=W*F-&{xHDb z2L9BoQ54JYJF;J|KNJkUk1=@dJkGK$hsV#5<9nBy?*FN*-R{4@nyk?y+`r$kHg6cC z_im8u^&a)Sc;E8de?i-^K62EuS>spDdn>YlSo7UIZ~#4I01B4tCPgAPldDxtzSb6= zJ1gbX*W$f)T%-gRyv}wYf5Y3|oO%su!VmGYi;cBzq=Q8FkuRCY;hY06@P6+ES#!r| z?I-$JSF)cRv34}j_ji_T;U;p5_n%~~8GjeQ`|LmP0r|EkAKWB=Xk4j9G(bJ0X8Io* zTDM^bd1mkPH*)Kv56CZQz=KcT!+H9oyU8)!*RcbY)RL%UU1=5d#`d>ze&TOWQ4~j? zoHqQzr5~ndBnqG6&n~HHi8JX>x?sioAPZgtx^O-?e&sk?=;sk^^@C@I$gaJGiyvIW zEwX7hlFL)GhhyyiE&S(~UsAj08jg^cck`2vsJr$rI7H3WKGxq?vF82A=wV#Hcbmtf z2lbr4TKo2pnYjx?g2Tss+*GPS6}jiT${UYz2rfQ z--2KQ_usfo9b)Pc(r;A9+TFSxWO?=O!WgxQuhGv_*IdQNqqunQ619IBAGpVH`qBGj zO^l$K_rC+YrVU99g@uFus4O#G_(6a1qHDZXp>M16jbEle^jwU{z3ZmF6m>|*Hf$ts zcrVA%4vq<-DYUPz3CG!{JHP#eEcFxQ6Og4%w#D}T4zlj9k%M`g{^bhRq>*3C8q~f) za_YH1;3yG^hj$z!1YcH8k@4BxwmF>3M*-MvN@ z*AND%6V^U9fF?3v>sU9xl}x=_GL&|btI$lARs;8^ot*WZ;GLcxIq>9W2vPkN7)sZz+O@;vLz;?5a zkdJrnZziL#i`wOa8F!p~=@S^fb&;C%m&lrAJ@I*RWXQH_rnbqR`f@Ts$c7;wrjfiz z!2znOkV9g-j&lxmJQlzD`39{efvUFrv+IP6jOk_p{te5V9KKPvBp+OAjU4hLw~(8% zW&2}Z5^G=uE2ZsV2l=`K^gSIS`;2Vy(E;?a-CgA4c3ixG*5k*huftk**1zo}_pXur zid{R%IwI4el;>f4!{w}Fe+8P0U-?vOV=Vb++x+zB1Si5VDMg_l685=nNGSBkhDa(Z z!WP!+)$C^NmZ;n0z3;xh9-f=XZ{5>CRv@)8h7OVMM2$eQcxw+FMpauM8b{8f@z4l% zY$d0ukz6pgy{sS&R%B9&`g@Iqvu-=vnu?hA|M(ImSFD$0=U%W;6g|>o9jmLN40+A0 zJ7SG$O-CQ=PFaV-F~SMBX$OO3jBuxj2*U$0p7>QQfRi9R(X zgm3o$%Mza{pWzTA^I8`v8(bZu_*5&U7#rg0123#aO!-#EY_{^Ap$@r)auil?LT+s> zGIlh;H8Te$vB}@8c65BGW3pkVkB9SWSw_0>Vg8>iY1xWN!Ks-Gq{*2+W|7I2E4?E| zS2=sWzeIQKpOc1|wu=-RQ9e2|rI`N=)iY(nBGQlh%BU8kb|Jw`r4HNk1 zJMm3iD|3)?pLymh@!aT{XFe0_`H$C(9*m0Tsx_l(%I93?iT|sP{?qFxJx$_$|69+W z-Y%c#iS0eH9)0}$2kR&H<0J7ppDWkgPv!or*6asmzi_SWC-#r3zf}DPeq8h?^0-;C z<`+#7Yktv-V$Ba2i8c5(u9x!t3uwl)@AI_&u^B-0rWn5>HpP}JElu4mI; ze{8RDE$;n9PKC(J5%F>H8Sz>19jYV4hd;kO`|Pvgy`sm(cZlsQq^+ds(2QsnG+UbR zm5RI^VdAmK;SjGG(nMa3h%vuS6W<}?<)R(GWD)NZ`yf6qzEk)V!f3*`DXulsCQX`@ zHEr6o+!-@w6ilBnz2N!hpU-*jx#whjEtQr?i=lSudBkxJvtr%5rb_^|$~2?AV#FE?vI(?YRqQAB`Lz{JgDW_iyv^a;}(~8Sk4q zb#g90BYZicEx|O=Z{qlfefz04i2sY%#W556zldfqZTgf*ONr5`oo$={dg01x`amx; z=VcsKjnrY`{mD4>Nksn37dwk|7G3n-KJ^3B_w1u=8G;v&iZ2RJW z!o=$$o;!_w`l^woPL`r1`A;L%bsHID&HdpWsG#2UD6f~g$#PC*o|1KgGLNL6x@g-vDtOLp zU~UO@ih8%9bXNhkx04gxy`6EcC^DdfAYoi1DJL8Oyhja;vV(7!4SgF+zgaT>RWTlZ ztPfQCE{^+Dk08^!qK54666xy;O!37jYT=aDkU`#9POXDO%n=&G*$Zc>YjF@Q{d-VQ zzY+c!fr!lwf-mFTW|H-AqkqfZ)fiFKq2AX=7XI#XGMvr6_V85tC`2DTISy6FeUhg3 zN~vFz?W3Sncf>GObc`BE)nwvHy)5Au?ZdpKUA$JY900SzCERg9E}|6 z$k&&^gfT^H#_eL6N8!OfxJx~sQ{?xZzcPvghg<&rwK*@(f9e=0w?BRQ)R#gceD0Q1 zDbPxGZwt4RQ7(rT`3x3z`mk^`U|vfKj!r=fQ&d&53zINUBIg660$ojPrTLdNUVd6t{2P!tL9)aqHH*yjQA3Qm!AY z?ADSEAA{27JhI42dHu*bXB#bqaBM_{JAI+4xkl~rcE$Feoib(86l(*ui!t;mZK^9o zXq*pqnNsO%v4HWqg)m|a#WTnj=DhEB2zFwuw1T-d)LLUKSj2xHJb0jt0UsRhMN~#G zEKOIyiZQ0xbh6oEU9fR0{qnkMaI?{bToyrH;&r7@Zh!8a7nitMF8|7nV<#&o0XOen z;#fPt*lrwbtTZ`(H5hYq<@Nk_bPo67!FvyJgYom@jDOy`dz-o#ml-#gF*YZqk833? z^_Rkl@%_M1d-w&|!Od1567BhLBqzC~fOXg_=e|4fS>-$<_J6`E^*4MYd<>AI@J0WT zy<~WArxtw%qM1YEO8u(VfGA&M zzHco8qy}(g{KsBL9X4b^<&hCvbYuuwyV?-nvJ0VQxp4HcfTKhYj+R=CUoM6{<6aJo z;Yqo6B@{$`7}ttNer zzVNqRP18nJsy{MQL&@ECqbBYF1T+uAt!6)ZE}Vy7jtr)bCJ2diL|71GTE;8kW4a2S z+^)OUJMd-9Gm!oS2Cj62VVllm+yeEnCxs_pywId%jxo>tBH z$bkd3C@&6YE0|> zioSYx3oS%3b`r~DpF)j2kD@~OR@TA2dN0aGM&MOe4x6Z8_%jaU!}ml4*&$4740m4_ z>Y2MCh;gHE#xo37@MK^7j*L%;pwAC&&Ex`B3NGrvz62MKfI+$U$; zpBjj*ThQ7@rd@L-(u19$i1a{ym=u}8wg_|6W88WXj8@M1A}KLezPu8%r9{p4~KqEH@WcxE$poIBG+v&sWA3KPh)N`#nOzsnNV-H4op*D1F_7SI<+I_$J0ben@?b>x_NSf48@e z+}b159HM`K3~8YYTuI;cR{E=JIG(~8v$Zu?3STelzhq{oFZjX6`6N9(b*ig#OraT%mT`1s?yNbED+1le}rFx)aVmgR{H-Fqf%{Otj%qW3oX6PzqRvsq^=ZoppJLaXCyS- zc2Uc%1;;L(q)xzj>cY^MOCIbo`XgHy``<3KJNE1#+l>rQ`W^S|qyM$F0b9uS-MpomL3P!IklN`8j^Nj}=DOk@<`*q8xqOm!NJ!Nx zC%Z?MKCURLDkoEy`PhPo*iw(a6GwO+K8SY4Ryr9o+&^}PeA7Yt&<~SWEqs5QP`fz~ zPRvu$T=L4FTpi4Pe$j@Xc$470g=A%W*~;X!`%iz{F(3tn6%Yjs1%j z;WnTPVLt7}k9dDDO3ULtim+$?c5N!IPk)i|GZUV$=SKM*v?(9a#P^Hse8uf?o4F9K ziqYpF{1h{33ur1og|WCg{)uJIoH?Q`Q)#nl;vRJsP4lq{KfyaR;g6WAsi`U6`}89G z3YN6!IdfkxW}QlRRCMHt@bJ(PTRZFamuJ0{$Je507PP02pSW+C`tmC?Hv~s{pX(pq z|Lrj27CU(!I>vjWw*Dq;+Ajab)?xkNRXv;o-FI zk5$ZDD`CF8sR47AVtpBVug5jkz}&iXo9BUA##nUW>1T%UXm>bmP(!GX{T*)n*|+As zsuvq#i2~l2gph3;7$ikWXBRf^Z(%;R1MHdKWWRwqej;~~+*4P^=CgQx<7>9!+i8=Y zo3m))8_p@rdr>5LVlVS=V=8%HSlNcivW;-@w}r1GW8lWCnZL6J;moDVj`l#D*9N#U zzd~){n;PrZt+6R6PDUDYhT_vB5nNRXMQ<#6;d#as!YPutQ~hqByw6hyfr z&et6FCd)sIj*1lb-Oun^{ajvQqEi2{{q$kRs~H2OrjXE*Ie3P1=~2#Y)c2{N*27l5 zFWA!vfq{}%@maA%LKB_$b^--s$lUf$( zIq_d*WTvVA?bCnz>*(cF<{jhDI3#0I)GO+tj%*k2@q4L()4ZFyIpmSIG*vUdz~@_E zAGgRSKPw*RCZm- zJXR)GlcW_?dly#UkIc^cYf4f6mr?nJH(gyN#Yu^A-(MT5J~PVMNLZd2$-;hS5$_SE M{0w{kGkPum3!LS*x&QzG diff --git a/src/tor/contrib/win32build/tor.nsi.in b/src/tor/contrib/win32build/tor.nsi.in deleted file mode 100644 index dd24df454..000000000 --- a/src/tor/contrib/win32build/tor.nsi.in +++ /dev/null @@ -1,214 +0,0 @@ -;tor.nsi - A basic win32 installer for Tor -; Originally written by J Doe. -; See LICENSE for licensing information -;----------------------------------------- -; NOTE: This file might be obsolete. Look at tor-mingw.nsi.in instead. -;----------------------------------------- -; How to make an installer: -; Step 0. If you are a Tor maintainer, make sure that tor.nsi and -; src/win32/orconfig.h all have the correct version number. -; Step 1. Download and install OpenSSL. Make sure that the OpenSSL -; version listed below matches the one you downloaded. -; Step 2. Download and install NSIS (http://nsis.sourceforge.net) -; Step 3. Make a directory under the main tor directory called "bin". -; Step 4. Copy ssleay32.dll and libeay32.dll from OpenSSL into "bin". -; Step 5. Run man2html on tor.1.in; call the result tor-reference.html -; Run man2html on tor-resolve.1; call the result tor-resolve.html -; Step 6. Copy torrc.sample.in to torrc.sample. -; Step 7. Build tor.exe and tor_resolve.exe; save the result into bin. -; Step 8. cd into contrib and run "makensis tor.nsi". -; -; Problems: -; - Copying torrc.sample.in to torrc.sample and tor.1.in (implicitly) -; to tor.1 is a Bad Thing, and leaves us with @autoconf@ vars in the final -; result. -; - Building Tor requires too much windows C clue. -; - We should have actual makefiles for VC that do the right thing. -; - I need to learn more NSIS juju to solve these: -; - There should be a batteries-included installer that comes with -; privoxy too. (Check privoxy license on this; be sure to include -; all privoxy documents.) -; - The filename should probably have a revision number. - -!include "MUI.nsh" - -!define VERSION "0.1.2.3-alpha-dev" -!define INSTALLER "tor-${VERSION}-win32.exe" -!define WEBSITE "https://www.torproject.org/" - -!define LICENSE "..\LICENSE" -;BIN is where it expects to find tor.exe, tor_resolve.exe, libeay32.dll and -; ssleay32.dll -!define BIN "..\bin" - -SetCompressor lzma -;SetCompressor zlib -OutFile ${INSTALLER} -InstallDir $PROGRAMFILES\Tor -SetOverWrite ifnewer - -Name "Tor" -Caption "Tor ${VERSION} Setup" -BrandingText "The Onion Router" -CRCCheck on - -;Use upx on the installer header to shrink the size. -!packhdr header.dat "upx --best header.dat" - -!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor ${VERSION} Setup Wizard" -!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK" -!define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico" -!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" -!define MUI_HEADERIMAGE -!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe" -!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates." -!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE} - -!insertmacro MUI_PAGE_WELCOME -; There's no point in having a clickthrough license: Our license adds -; certain rights, but doesn't remove them. -; !insertmacro MUI_PAGE_LICENSE "${LICENSE}" -!insertmacro MUI_PAGE_COMPONENTS -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH -!insertmacro MUI_UNPAGE_WELCOME -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH -!insertmacro MUI_LANGUAGE "English" - -Var configdir -Var configfile - -;Sections -;-------- - -Section "Tor" Tor -;Files that have to be installed for tor to run and that the user -;cannot choose not to install - SectionIn RO - SetOutPath $INSTDIR - File "${BIN}\tor.exe" - File "${BIN}\tor_resolve.exe" - WriteIniStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE} - - StrCpy $configfile "torrc" - StrCpy $configdir $APPDATA\Tor -; ;If $APPDATA isn't valid here (Early win95 releases with no updated -; ; shfolder.dll) then we put it in the program directory instead. -; StrCmp $APPDATA "" "" +2 -; StrCpy $configdir $INSTDIR - SetOutPath $configdir - ;If there's already a torrc config file, ask if they want to - ;overwrite it with the new one. - IfFileExists "$configdir\torrc" "" endiftorrc - MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDNO yesreplace - Delete $configdir\torrc - Goto endiftorrc - yesreplace: - StrCpy $configfile "torrc.sample" - endiftorrc: - File /oname=$configfile "..\src\config\torrc.sample" -SectionEnd - -Section "OpenSSL 0.9.8a" OpenSSL - SetOutPath $INSTDIR - File "${BIN}\libeay32.dll" - File "${BIN}\ssleay32.dll" -SectionEnd - -Section "Documents" Docs - SetOutPath "$INSTDIR\Documents" - ;File "..\doc\FAQ" - File "..\doc\HACKING" - File "..\doc\spec\control-spec.txt" - File "..\doc\spec\dir-spec.txt" - File "..\doc\spec\rend-spec.txt" - File "..\doc\spec\socks-extensions.txt" - File "..\doc\spec\tor-spec.txt" - File "..\doc\spec\version-spec.txt" - ; - ; WEBSITE-FILES-HERE - ; - File "..\doc\tor-resolve.html" - File "..\doc\tor-reference.html" - ; - File "..\doc\design-paper\tor-design.pdf" - ; - File "..\README" - File "..\AUTHORS" - File "..\ChangeLog" - File "..\LICENSE" -SectionEnd - -SubSection /e "Shortcuts" Shortcuts - -Section "Start Menu" StartMenu - SetOutPath $INSTDIR - IfFileExists "$SMPROGRAMS\Tor\*.*" "" +2 - RMDir /r "$SMPROGRAMS\Tor" - CreateDirectory "$SMPROGRAMS\Tor" - CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" - CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$configdir\torrc" - CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url" - CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe" - IfFileExists "$INSTDIR\Documents\*.*" "" endifdocs - CreateDirectory "$SMPROGRAMS\Tor\Documents" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Manual.lnk" "$INSTDIR\Documents\tor-reference.html" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents" - CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt" - endifdocs: -SectionEnd - -Section "Desktop" Desktop - SetOutPath $INSTDIR - CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" -SectionEnd - -Section /o "Run at startup" Startup - SetOutPath $INSTDIR - CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "" 0 SW_SHOWMINIMIZED -SectionEnd - -SubSectionEnd - -Section "Uninstall" - Delete "$DESKTOP\Tor.lnk" - Delete "$INSTDIR\libeay32.dll" - Delete "$INSTDIR\ssleay32.dll" - Delete "$INSTDIR\tor.exe" - Delete "$INSTDIR\tor_resolve.exe" - Delete "$INSTDIR\Tor Website.url" - Delete "$INSTDIR\torrc" - Delete "$INSTDIR\torrc.sample" - StrCmp $configdir $INSTDIR +2 "" - RMDir /r $configdir - Delete "$INSTDIR\Uninstall.exe" - RMDir /r "$INSTDIR\Documents" - RMDir $INSTDIR - RMDir /r "$SMPROGRAMS\Tor" - Delete "$SMSTARTUP\Tor.lnk" - DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor" -SectionEnd - -Section -End - WriteUninstaller "$INSTDIR\Uninstall.exe" - ;The registry entries simply add the Tor uninstaller to the Windows - ;uninstall list. - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"' -SectionEnd - -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run." - !insertmacro MUI_DESCRIPTION_TEXT ${OpenSSL} "OpenSSL libraries required by Tor." - !insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor." - !insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor" - !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu" - !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop" - !insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window" -!insertmacro MUI_FUNCTION_DESCRIPTION_END - diff --git a/src/tor/src/or/control.c b/src/tor/control.c similarity index 60% rename from src/tor/src/or/control.c rename to src/tor/control.c index cce5c7953..cba8a6907 100644 --- a/src/tor/src/or/control.c +++ b/src/tor/control.c @@ -1,42 +1,17 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file control.c * \brief Implementation for Tor's control-socket interface. - * - * A "controller" is an external program that monitors and controls a Tor - * instance via a text-based protocol. It connects to Tor via a connection - * to a local socket. - * - * The protocol is line-driven. The controller sends commands terminated by a - * CRLF. Tor sends lines that are either replies to what the - * controller has said, or events that Tor sends to the controller - * asynchronously based on occurrences in the Tor network model. - * - * See the control-spec.txt file in the torspec.git repository for full - * details on protocol. - * - * This module generally has two kinds of entry points: those based on having - * received a command on a controller socket, which are handled in - * connection_control_process_inbuf(), and dispatched to individual functions - * with names like control_handle_COMMANDNAME(); and those based on events - * that occur elsewhere in Tor, which are handled by functions with names like - * control_event_EVENTTYPE(). - * - * Controller events are not sent immediately; rather, they are inserted into - * the queued_control_events array, and flushed later from - * flush_queued_events_cb(). Doing this simplifies our callgraph greatly, - * by limiting the number of places in Tor that can call back into the network - * stack. + * See doc/spec/control-spec.txt for full details on protocol. **/ #define CONTROL_PRIVATE #include "or.h" #include "addressmap.h" -#include "bridges.h" #include "buffers.h" #include "channel.h" #include "channeltls.h" @@ -45,7 +20,6 @@ #include "circuitstats.h" #include "circuituse.h" #include "command.h" -#include "compat_libevent.h" #include "config.h" #include "confparse.h" #include "connection.h" @@ -58,34 +32,21 @@ #include "entrynodes.h" #include "geoip.h" #include "hibernate.h" -#include "hs_cache.h" -#include "hs_common.h" -#include "hs_control.h" -#include "main.h" -#include "microdesc.h" +#include "onion_main.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" -#include "proto_control0.h" -#include "proto_http.h" #include "reasons.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" #include "rephist.h" #include "router.h" #include "routerlist.h" #include "routerparse.h" -#include "shared_random.h" #ifndef _WIN32 #include #include #endif -#include - -#include "crypto_s2k.h" #include "procmon.h" /** Yield true iff s is the state of a control_connection_t that has @@ -110,7 +71,7 @@ static int disable_log_messages = 0; /** Macro: true if any control connection is interested in events of type * e. */ #define EVENT_IS_INTERESTING(e) \ - (!! (global_event_mask & EVENT_MASK_(e))) + (!! (global_event_mask & (((uint64_t)1)<<(e)))) /** If we're using cookie-type authentication, how long should our cookies be? */ @@ -130,11 +91,6 @@ static uint8_t *authentication_cookie = NULL; "Tor safe cookie authentication controller-to-server hash" #define SAFECOOKIE_SERVER_NONCE_LEN DIGEST256_LEN -/** The list of onion services that have been added via ADD_ONION that do not - * belong to any particular control connection. - */ -static smartlist_t *detached_onion_services = NULL; - /** A sufficiently large size to record the last bootstrap phase string. */ #define BOOTSTRAP_MSG_LEN 1024 @@ -145,17 +101,17 @@ static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN]; static void connection_printf_to_buf(control_connection_t *conn, const char *format, ...) CHECK_PRINTF(2,3); -static void send_control_event_impl(uint16_t event, +static void send_control_event_impl(uint16_t event, event_format_t which, const char *format, va_list ap) - CHECK_PRINTF(2,0); + CHECK_PRINTF(3,0); static int control_event_status(int type, int severity, const char *format, va_list args) CHECK_PRINTF(3,0); static void send_control_done(control_connection_t *conn); -static void send_control_event(uint16_t event, +static void send_control_event(uint16_t event, event_format_t which, const char *format, ...) - CHECK_PRINTF(2,3); + CHECK_PRINTF(3,4); static int handle_control_setconf(control_connection_t *conn, uint32_t len, char *body); static int handle_control_resetconf(control_connection_t *conn, uint32_t len, @@ -200,29 +156,15 @@ static int handle_control_resolve(control_connection_t *conn, uint32_t len, static int handle_control_usefeature(control_connection_t *conn, uint32_t len, const char *body); -static int handle_control_hsfetch(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_hspost(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_add_onion(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_del_onion(control_connection_t *conn, uint32_t len, - const char *body); static int write_stream_target_to_buf(entry_connection_t *conn, char *buf, size_t len); static void orconn_target_get_name(char *buf, size_t len, or_connection_t *conn); - -static int get_cached_network_liveness(void); -static void set_cached_network_liveness(int liveness); - -static void flush_queued_events_cb(evutil_socket_t fd, short what, void *arg); - -static char * download_status_to_string(const download_status_t *dl); +static char *get_cookie_file(void); /** Given a control event code for a message event, return the corresponding * log severity. */ -static inline int +static INLINE int event_to_log_severity(int event) { switch (event) { @@ -236,7 +178,7 @@ event_to_log_severity(int event) } /** Given a log severity, return the corresponding control event code. */ -static inline int +static INLINE int log_severity_to_event(int severity) { switch (severity) { @@ -253,14 +195,14 @@ log_severity_to_event(int severity) static void clear_circ_bw_fields(void) { + circuit_t *circ; origin_circuit_t *ocirc; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (!CIRCUIT_IS_ORIGIN(circ)) continue; ocirc = TO_ORIGIN_CIRCUIT(circ); ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0; } - SMARTLIST_FOREACH_END(circ); } /** Set global_event_mask* to the bitwise OR of each live control @@ -355,11 +297,11 @@ control_event_is_interesting(int event) /** Append a NUL-terminated string s to the end of * conn-\>outbuf. */ -static inline void +static INLINE void connection_write_str_to_buf(const char *s, control_connection_t *conn) { size_t len = strlen(s); - connection_buf_add(s, len, TO_CONN(conn)); + connection_write_to_buf(s, len, TO_CONN(conn)); } /** Given a len-character string in data, made of lines @@ -372,23 +314,16 @@ connection_write_str_to_buf(const char *s, control_connection_t *conn) STATIC size_t write_escaped_data(const char *data, size_t len, char **out) { - tor_assert(len < SIZE_MAX - 9); - size_t sz_out = len+8+1; + size_t sz_out = len+8; char *outp; const char *start = data, *end; - size_t i; + int i; int start_of_line; - for (i=0; i < len; ++i) { - if (data[i] == '\n') { + for (i=0; i<(int)len; ++i) { + if (data[i]== '\n') sz_out += 2; /* Maybe add a CR; maybe add a dot. */ - if (sz_out >= SIZE_T_CEILING) { - log_warn(LD_BUG, "Input to write_escaped_data was too long"); - *out = tor_strdup(".\r\n"); - return 3; - } - } } - *out = outp = tor_malloc(sz_out); + *out = outp = tor_malloc(sz_out+1); end = data+len; start_of_line = 1; while (data < end) { @@ -414,8 +349,7 @@ write_escaped_data(const char *data, size_t len, char **out) *outp++ = '\r'; *outp++ = '\n'; *outp = '\0'; /* NUL-terminate just in case. */ - tor_assert(outp >= *out); - tor_assert((size_t)(outp - *out) <= sz_out); + tor_assert((outp - *out) <= (int)sz_out); return outp - *out; } @@ -466,7 +400,7 @@ read_escaped_data(const char *data, size_t len, char **out) /** If the first in_len_max characters in start contain a * double-quoted string with escaped characters, return the length of that * string (as encoded, including quotes). Otherwise return -1. */ -static inline int +static INLINE int get_escaped_string_length(const char *start, size_t in_len_max, int *chars_out) { @@ -551,49 +485,6 @@ decode_escaped_string(const char *start, size_t in_len_max, return end+1; } -/** Create and add a new controller connection on sock. If - * CC_LOCAL_FD_IS_OWNER is set in flags, this Tor process should - * exit when the connection closes. If CC_LOCAL_FD_IS_AUTHENTICATED - * is set, then the connection does not need to authenticate. - */ -int -control_connection_add_local_fd(tor_socket_t sock, unsigned flags) -{ - if (BUG(! SOCKET_OK(sock))) - return -1; - const int is_owner = !!(flags & CC_LOCAL_FD_IS_OWNER); - const int is_authenticated = !!(flags & CC_LOCAL_FD_IS_AUTHENTICATED); - control_connection_t *control_conn = control_connection_new(AF_UNSPEC); - connection_t *conn = TO_CONN(control_conn); - conn->s = sock; - tor_addr_make_unspec(&conn->addr); - conn->port = 1; - conn->address = tor_strdup(""); - - /* We take ownership of this socket so that later, when we close it, - * we don't freak out. */ - tor_take_socket_ownership(sock); - - if (set_socket_nonblocking(sock) < 0 || - connection_add(conn) < 0) { - connection_free(conn); - return -1; - } - - control_conn->is_owning_control_connection = is_owner; - - if (connection_init_accepted_conn(conn, NULL) < 0) { - connection_mark_for_close(conn); - return -1; - } - - if (is_authenticated) { - conn->state = CONTROL_CONN_STATE_OPEN; - } - - return 0; -} - /** Acts like sprintf, but writes its formatted string to the end of * conn-\>outbuf. */ static void @@ -612,7 +503,7 @@ connection_printf_to_buf(control_connection_t *conn, const char *format, ...) tor_assert(0); } - connection_buf_add(buf, (size_t)len, TO_CONN(conn)); + connection_write_to_buf(buf, (size_t)len, TO_CONN(conn)); tor_free(buf); } @@ -638,7 +529,7 @@ control_ports_write_to_file(void) smartlist_add_asprintf(lines, "UNIX_PORT=%s\n", conn->address); continue; } -#endif /* defined(AF_UNIX) */ +#endif smartlist_add_asprintf(lines, "PORT=%s:%d\n", conn->address, conn->port); } SMARTLIST_FOREACH_END(conn); @@ -655,7 +546,7 @@ control_ports_write_to_file(void) options->ControlPortWriteToFile); } } -#endif /* !defined(_WIN32) */ +#endif tor_free(joined); SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); smartlist_free(lines); @@ -668,220 +559,46 @@ send_control_done(control_connection_t *conn) connection_write_str_to_buf("250 OK\r\n", conn); } -/** Represents an event that's queued to be sent to one or more - * controllers. */ -typedef struct queued_event_s { - uint16_t event; - char *msg; -} queued_event_t; - -/** Pointer to int. If this is greater than 0, we don't allow new events to be - * queued. */ -static tor_threadlocal_t block_event_queue_flag; - -/** Holds a smartlist of queued_event_t objects that may need to be sent - * to one or more controllers */ -static smartlist_t *queued_control_events = NULL; - -/** True if the flush_queued_events_event is pending. */ -static int flush_queued_event_pending = 0; - -/** Lock to protect the above fields. */ -static tor_mutex_t *queued_control_events_lock = NULL; - -/** An event that should fire in order to flush the contents of - * queued_control_events. */ -static struct event *flush_queued_events_event = NULL; - -void -control_initialize_event_queue(void) -{ - if (queued_control_events == NULL) { - queued_control_events = smartlist_new(); - } - - if (flush_queued_events_event == NULL) { - struct event_base *b = tor_libevent_get_base(); - if (b) { - flush_queued_events_event = tor_event_new(b, - -1, 0, flush_queued_events_cb, - NULL); - tor_assert(flush_queued_events_event); - } - } - - if (queued_control_events_lock == NULL) { - queued_control_events_lock = tor_mutex_new(); - tor_threadlocal_init(&block_event_queue_flag); - } -} - -static int * -get_block_event_queue(void) -{ - int *val = tor_threadlocal_get(&block_event_queue_flag); - if (PREDICT_UNLIKELY(val == NULL)) { - val = tor_malloc_zero(sizeof(int)); - tor_threadlocal_set(&block_event_queue_flag, val); - } - return val; -} - -/** Helper: inserts an event on the list of events queued to be sent to - * one or more controllers, and schedules the events to be flushed if needed. +/** Send an event to all v1 controllers that are listening for code + * event. The event's body is given by msg. * - * This function takes ownership of msg, and may free it. + * If which & SHORT_NAMES, the event contains short-format names: send + * it to controllers that haven't enabled the VERBOSE_NAMES feature. If + * which & LONG_NAMES, the event contains long-format names: send it + * to controllers that have enabled VERBOSE_NAMES. * - * We queue these events rather than send them immediately in order to break - * the dependency in our callgraph from code that generates events for the - * controller, and the network layer at large. Otherwise, nearly every - * interesting part of Tor would potentially call every other interesting part - * of Tor. - */ + * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with + * respect to the EXTENDED_EVENTS feature. */ MOCK_IMPL(STATIC void, -queue_control_event_string,(uint16_t event, char *msg)) -{ - /* This is redundant with checks done elsewhere, but it's a last-ditch - * attempt to avoid queueing something we shouldn't have to queue. */ - if (PREDICT_UNLIKELY( ! EVENT_IS_INTERESTING(event) )) { - tor_free(msg); - return; - } - - int *block_event_queue = get_block_event_queue(); - if (*block_event_queue) { - tor_free(msg); - return; - } - - queued_event_t *ev = tor_malloc(sizeof(*ev)); - ev->event = event; - ev->msg = msg; - - /* No queueing an event while queueing an event */ - ++*block_event_queue; - - tor_mutex_acquire(queued_control_events_lock); - tor_assert(queued_control_events); - smartlist_add(queued_control_events, ev); - - int activate_event = 0; - if (! flush_queued_event_pending && in_main_thread()) { - activate_event = 1; - flush_queued_event_pending = 1; - } - - tor_mutex_release(queued_control_events_lock); - - --*block_event_queue; - - /* We just put an event on the queue; mark the queue to be - * flushed. We only do this from the main thread for now; otherwise, - * we'd need to incur locking overhead in Libevent or use a socket. - */ - if (activate_event) { - tor_assert(flush_queued_events_event); - event_active(flush_queued_events_event, EV_READ, 1); - } -} - -#define queued_event_free(ev) \ - FREE_AND_NULL(queued_event_t, queued_event_free_, (ev)) - -/** Release all storage held by ev. */ -static void -queued_event_free_(queued_event_t *ev) -{ - if (ev == NULL) - return; - - tor_free(ev->msg); - tor_free(ev); -} - -/** Send every queued event to every controller that's interested in it, - * and remove the events from the queue. If force is true, - * then make all controllers send their data out immediately, since we - * may be about to shut down. */ -static void -queued_events_flush_all(int force) +send_control_event_string,(uint16_t event, event_format_t which, + const char *msg)) { - if (PREDICT_UNLIKELY(queued_control_events == NULL)) { - return; - } - smartlist_t *all_conns = get_connection_array(); - smartlist_t *controllers = smartlist_new(); - smartlist_t *queued_events; - - int *block_event_queue = get_block_event_queue(); - ++*block_event_queue; - - tor_mutex_acquire(queued_control_events_lock); - /* No queueing an event while flushing events. */ - flush_queued_event_pending = 0; - queued_events = queued_control_events; - queued_control_events = smartlist_new(); - tor_mutex_release(queued_control_events_lock); + smartlist_t *conns = get_connection_array(); + (void)which; + tor_assert(event >= EVENT_MIN_ && event <= EVENT_MAX_); - /* Gather all the controllers that will care... */ - SMARTLIST_FOREACH_BEGIN(all_conns, connection_t *, conn) { + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->type == CONN_TYPE_CONTROL && !conn->marked_for_close && conn->state == CONTROL_CONN_STATE_OPEN) { control_connection_t *control_conn = TO_CONTROL_CONN(conn); - smartlist_add(controllers, control_conn); + if (control_conn->event_mask & (1<event; - const size_t msg_len = strlen(ev->msg); - SMARTLIST_FOREACH_BEGIN(controllers, control_connection_t *, - control_conn) { - if (control_conn->event_mask & bit) { - connection_buf_add(ev->msg, msg_len, TO_CONN(control_conn)); - } - } SMARTLIST_FOREACH_END(control_conn); - - queued_event_free(ev); - } SMARTLIST_FOREACH_END(ev); - - if (force) { - SMARTLIST_FOREACH_BEGIN(controllers, control_connection_t *, - control_conn) { - connection_flush(TO_CONN(control_conn)); - } SMARTLIST_FOREACH_END(control_conn); - } - - smartlist_free(queued_events); - smartlist_free(controllers); - - --*block_event_queue; -} - -/** Libevent callback: Flushes pending events to controllers that are - * interested in them. */ -static void -flush_queued_events_cb(evutil_socket_t fd, short what, void *arg) -{ - (void) fd; - (void) what; - (void) arg; - queued_events_flush_all(0); -} - -/** Send an event to all v1 controllers that are listening for code - * event. The event's body is given by msg. - * - * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with - * respect to the EXTENDED_EVENTS feature. */ -MOCK_IMPL(STATIC void, -send_control_event_string,(uint16_t event, - const char *msg)) -{ - tor_assert(event >= EVENT_MIN_ && event <= EVENT_MAX_); - queue_control_event_string(event, tor_strdup(msg)); } /** Helper for send_control_event and control_event_status: @@ -889,8 +606,8 @@ send_control_event_string,(uint16_t event, * event. The event's body is created by the printf-style format in * format, and other arguments as provided. */ static void -send_control_event_impl(uint16_t event, - const char *format, va_list ap) +send_control_event_impl(uint16_t event, event_format_t which, + const char *format, va_list ap) { char *buf = NULL; int len; @@ -901,19 +618,21 @@ send_control_event_impl(uint16_t event, return; } - queue_control_event_string(event, buf); + send_control_event_string(event, which|ALL_FORMATS, buf); + + tor_free(buf); } /** Send an event to all v1 controllers that are listening for code * event. The event's body is created by the printf-style format in * format, and other arguments as provided. */ static void -send_control_event(uint16_t event, +send_control_event(uint16_t event, event_format_t which, const char *format, ...) { va_list ap; va_start(ap, format); - send_control_event_impl(event, format, ap); + send_control_event_impl(event, which, format, ap); va_end(ap); } @@ -957,8 +676,7 @@ control_setconf_helper(control_connection_t *conn, uint32_t len, char *body, config_line_t *lines=NULL; char *start = body; char *errstring = NULL; - const unsigned flags = - CAL_CLEAR_FIRST | (use_defaults ? CAL_USE_DEFAULTS : 0); + const int clear_first = 1; char *config; smartlist_t *entries = smartlist_new(); @@ -1004,7 +722,7 @@ control_setconf_helper(control_connection_t *conn, uint32_t len, char *body, ++body; } - smartlist_add_strdup(entries, ""); + smartlist_add(entries, tor_strdup("")); config = smartlist_join_strings(entries, "\n", 0, NULL); SMARTLIST_FOREACH(entries, char *, cp, tor_free(cp)); smartlist_free(entries); @@ -1018,7 +736,7 @@ control_setconf_helper(control_connection_t *conn, uint32_t len, char *body, } tor_free(config); - opt_err = options_trial_assign(lines, flags, &errstring); + opt_err = options_trial_assign(lines, use_defaults, clear_first, &errstring); { const char *msg; switch (opt_err) { @@ -1122,7 +840,7 @@ handle_control_getconf(control_connection_t *conn, uint32_t body_len, tor_assert(strlen(tmp)>4); tmp[3] = ' '; msg = smartlist_join_strings(answers, "", 0, &msg_len); - connection_buf_add(msg, msg_len, TO_CONN(conn)); + connection_write_to_buf(msg, msg_len, TO_CONN(conn)); } else { connection_write_str_to_buf("250 OK\r\n", conn); } @@ -1204,6 +922,7 @@ static const struct control_event_t control_event_table[] = { { EVENT_ERR_MSG, "ERR" }, { EVENT_NEW_DESC, "NEWDESC" }, { EVENT_ADDRMAP, "ADDRMAP" }, + { EVENT_AUTHDIR_NEWDESCS, "AUTHDIR_NEWDESCS" }, { EVENT_DESCCHANGED, "DESCCHANGED" }, { EVENT_NS, "NS" }, { EVENT_STATUS_GENERAL, "STATUS_GENERAL" }, @@ -1214,7 +933,7 @@ static const struct control_event_t control_event_table[] = { { EVENT_CLIENTS_SEEN, "CLIENTS_SEEN" }, { EVENT_NEWCONSENSUS, "NEWCONSENSUS" }, { EVENT_BUILDTIMEOUT_SET, "BUILDTIMEOUT_SET" }, - { EVENT_GOT_SIGNAL, "SIGNAL" }, + { EVENT_SIGNAL, "SIGNAL" }, { EVENT_CONF_CHANGED, "CONF_CHANGED"}, { EVENT_CONN_BW, "CONN_BW" }, { EVENT_CELL_STATS, "CELL_STATS" }, @@ -1222,8 +941,6 @@ static const struct control_event_t control_event_table[] = { { EVENT_CIRC_BANDWIDTH_USED, "CIRC_BW" }, { EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" }, { EVENT_HS_DESC, "HS_DESC" }, - { EVENT_HS_DESC_CONTENT, "HS_DESC_CONTENT" }, - { EVENT_NETWORK_LIVENESS, "NETWORK_LIVENESS" }, { 0, NULL }, }; @@ -1233,8 +950,8 @@ static int handle_control_setevents(control_connection_t *conn, uint32_t len, const char *body) { - int event_code; - event_mask_t event_mask = 0; + int event_code = -1; + uint32_t event_mask = 0; smartlist_t *events = smartlist_new(); (void) len; @@ -1243,15 +960,10 @@ handle_control_setevents(control_connection_t *conn, uint32_t len, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); SMARTLIST_FOREACH_BEGIN(events, const char *, ev) { - if (!strcasecmp(ev, "EXTENDED") || - !strcasecmp(ev, "AUTHDIR_NEWDESCS")) { - log_warn(LD_CONTROL, "The \"%s\" SETEVENTS argument is no longer " - "supported.", ev); + if (!strcasecmp(ev, "EXTENDED")) { continue; } else { int i; - event_code = -1; - for (i = 0; control_event_table[i].event_name != NULL; ++i) { if (!strcasecmp(ev, control_event_table[i].event_name)) { event_code = control_event_table[i].event_code; @@ -1267,7 +979,7 @@ handle_control_setevents(control_connection_t *conn, uint32_t len, return 0; } } - event_mask |= (((event_mask_t)1) << event_code); + event_mask |= (1 << event_code); } SMARTLIST_FOREACH_END(ev); SMARTLIST_FOREACH(events, char *, e, tor_free(e)); @@ -1282,8 +994,7 @@ handle_control_setevents(control_connection_t *conn, uint32_t len, /** Decode the hashed, base64'd passwords stored in passwords. * Return a smartlist of acceptable passwords (unterminated strings of - * length S2K_RFC2440_SPECIFIER_LEN+DIGEST_LEN) on success, or NULL on - * failure. + * length S2K_SPECIFIER_LEN+DIGEST_LEN) on success, or NULL on failure. */ smartlist_t * decode_hashed_passwords(config_line_t *passwords) @@ -1298,19 +1009,17 @@ decode_hashed_passwords(config_line_t *passwords) const char *hashed = cl->value; if (!strcmpstart(hashed, "16:")) { - if (base16_decode(decoded, sizeof(decoded), hashed+3, strlen(hashed+3)) - != S2K_RFC2440_SPECIFIER_LEN + DIGEST_LEN - || strlen(hashed+3) != (S2K_RFC2440_SPECIFIER_LEN+DIGEST_LEN)*2) { + if (base16_decode(decoded, sizeof(decoded), hashed+3, strlen(hashed+3))<0 + || strlen(hashed+3) != (S2K_SPECIFIER_LEN+DIGEST_LEN)*2) { goto err; } } else { if (base64_decode(decoded, sizeof(decoded), hashed, strlen(hashed)) - != S2K_RFC2440_SPECIFIER_LEN+DIGEST_LEN) { + != S2K_SPECIFIER_LEN+DIGEST_LEN) { goto err; } } - smartlist_add(sl, - tor_memdup(decoded, S2K_RFC2440_SPECIFIER_LEN+DIGEST_LEN)); + smartlist_add(sl, tor_memdup(decoded, S2K_SPECIFIER_LEN+DIGEST_LEN)); } return sl; @@ -1331,7 +1040,7 @@ handle_control_authenticate(control_connection_t *conn, uint32_t len, { int used_quoted_string = 0; const or_options_t *options = get_options(); - const char *errstr = "Unknown error"; + const char *errstr = NULL; char *password; size_t password_len; const char *cp; @@ -1350,8 +1059,7 @@ handle_control_authenticate(control_connection_t *conn, uint32_t len, tor_assert(i>0); password_len = i/2; password = tor_malloc(password_len + 1); - if (base16_decode(password, password_len+1, body, i) - != (int) password_len) { + if (base16_decode(password, password_len+1, body, i)<0) { connection_write_str_to_buf( "551 Invalid hexadecimal encoding. Maybe you tried a plain text " "password? If so, the standard requires that you put it in " @@ -1453,27 +1161,22 @@ handle_control_authenticate(control_connection_t *conn, uint32_t len, } if (bad) { if (!also_cookie) { - log_warn(LD_BUG, + log_warn(LD_CONTROL, "Couldn't decode HashedControlPassword: invalid base16"); errstr="Couldn't decode HashedControlPassword value in configuration."; - goto err; } bad_password = 1; - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_free(sl); - sl = NULL; } else { SMARTLIST_FOREACH(sl, char *, expected, { - secret_to_key_rfc2440(received,DIGEST_LEN, - password,password_len,expected); - if (tor_memeq(expected + S2K_RFC2440_SPECIFIER_LEN, - received, DIGEST_LEN)) + secret_to_key(received,DIGEST_LEN,password,password_len,expected); + if (tor_memeq(expected+S2K_SPECIFIER_LEN, received, DIGEST_LEN)) goto ok; }); - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_free(sl); - sl = NULL; if (used_quoted_string) errstr = "Password did not match HashedControlPassword value from " @@ -1496,12 +1199,9 @@ handle_control_authenticate(control_connection_t *conn, uint32_t len, err: tor_free(password); - connection_printf_to_buf(conn, "515 Authentication failed: %s\r\n", errstr); + connection_printf_to_buf(conn, "515 Authentication failed: %s\r\n", + errstr ? errstr : "Unknown reason."); connection_mark_for_close(TO_CONN(conn)); - if (sl) { /* clean up */ - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); - } return 0; ok: log_info(LD_CONTROL, "Authenticated control connection ("TOR_SOCKET_T_FORMAT @@ -1510,7 +1210,7 @@ handle_control_authenticate(control_connection_t *conn, uint32_t len, conn->base_.state = CONTROL_CONN_STATE_OPEN; tor_free(password); if (sl) { /* clean up */ - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); + SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_free(sl); } return 0; @@ -1523,10 +1223,8 @@ handle_control_saveconf(control_connection_t *conn, uint32_t len, const char *body) { (void) len; - - int force = !strcmpstart(body, "FORCE"); - const or_options_t *options = get_options(); - if ((!force && options->IncludeUsed) || options_save_current() < 0) { + (void) body; + if (options_save_current()<0) { connection_write_str_to_buf( "551 Unable to write configuration to disk.\r\n", conn); } else { @@ -1553,7 +1251,6 @@ static const struct signal_t signal_table[] = { { SIGTERM, "INT" }, { SIGNEWNYM, "NEWNYM" }, { SIGCLEARDNSCACHE, "CLEARDNSCACHE"}, - { SIGHEARTBEAT, "HEARTBEAT"}, { 0, NULL }, }; @@ -1594,7 +1291,7 @@ handle_control_signal(control_connection_t *conn, uint32_t len, if (sig == SIGTERM || sig == SIGINT) connection_flush(TO_CONN(conn)); - activate_signal(sig); + process_signal(sig); return 0; } @@ -1706,12 +1403,12 @@ handle_control_mapaddress(control_connection_t *conn, uint32_t len, if (smartlist_len(reply)) { ((char*)smartlist_get(reply,smartlist_len(reply)-1))[3] = ' '; r = smartlist_join_strings(reply, "\r\n", 1, &sz); - connection_buf_add(r, sz, TO_CONN(conn)); + connection_write_to_buf(r, sz, TO_CONN(conn)); tor_free(r); } else { const char *response = "512 syntax error: not enough arguments to mapaddress.\r\n"; - connection_buf_add(response, strlen(response), TO_CONN(conn)); + connection_write_to_buf(response, strlen(response), TO_CONN(conn)); } SMARTLIST_FOREACH(reply, char *, cp, tor_free(cp)); @@ -1728,20 +1425,12 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, (void) conn; if (!strcmp(question, "version")) { *answer = tor_strdup(get_version()); - } else if (!strcmp(question, "bw-event-cache")) { - *answer = get_bw_samples(); } else if (!strcmp(question, "config-file")) { - const char *a = get_torrc_fname(0); - if (a) - *answer = tor_strdup(a); + *answer = tor_strdup(get_torrc_fname(0)); } else if (!strcmp(question, "config-defaults-file")) { - const char *a = get_torrc_fname(1); - if (a) - *answer = tor_strdup(a); + *answer = tor_strdup(get_torrc_fname(1)); } else if (!strcmp(question, "config-text")) { *answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL); - } else if (!strcmp(question, "config-can-saveconf")) { - *answer = tor_strdup(get_options()->IncludeUsed ? "0" : "1"); } else if (!strcmp(question, "info/names")) { *answer = list_getinfo_options(); } else if (!strcmp(question, "dormant")) { @@ -1772,7 +1461,7 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, *answer = tor_strdup("VERBOSE_NAMES EXTENDED_EVENTS"); } else if (!strcmp(question, "address")) { uint32_t addr; - if (router_pick_published_address(get_options(), &addr, 0) < 0) { + if (router_pick_published_address(get_options(), &addr) < 0) { *errmsg = "Address unknown"; return -1; } @@ -1797,26 +1486,26 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, #else int myUid = geteuid(); tor_asprintf(answer, "%d", myUid); -#endif /* defined(_WIN32) */ + #endif } else if (!strcmp(question, "process/user")) { #ifdef _WIN32 *answer = tor_strdup(""); #else int myUid = geteuid(); - const struct passwd *myPwEntry = tor_getpwuid(myUid); + struct passwd *myPwEntry = getpwuid(myUid); if (myPwEntry) { *answer = tor_strdup(myPwEntry->pw_name); } else { *answer = tor_strdup(""); } -#endif /* defined(_WIN32) */ + #endif } else if (!strcmp(question, "process/descriptor-limit")) { - int max_fds = get_max_sockets(); + int max_fds=-1; + set_max_file_descriptors(0, &max_fds); tor_asprintf(answer, "%d", max_fds); - } else if (!strcmp(question, "limits/max-mem-in-queues")) { - tor_asprintf(answer, U64_FORMAT, - U64_PRINTF_ARG(get_options()->MaxMemInQueues)); + } else if (!strcmp(question, "dir-usage")) { + *answer = directory_dump_request_log(); } else if (!strcmp(question, "fingerprint")) { crypto_pk_t *server_key; if (!server_mode(get_options())) { @@ -1938,50 +1627,34 @@ getinfo_helper_listeners(control_connection_t *control_conn, /** Implementation helper for GETINFO: knows the answers for questions about * directory information. */ -STATIC int +static int getinfo_helper_dir(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg) { + const node_t *node; + const routerinfo_t *ri = NULL; (void) control_conn; if (!strcmpstart(question, "desc/id/")) { - const routerinfo_t *ri = NULL; - const node_t *node = node_get_by_hex_id(question+strlen("desc/id/"), 0); + node = node_get_by_hex_id(question+strlen("desc/id/")); if (node) ri = node->ri; if (ri) { const char *body = signed_descriptor_get_body(&ri->cache_info); if (body) *answer = tor_strndup(body, ri->cache_info.signed_descriptor_len); - } else if (! we_fetch_router_descriptors(get_options())) { - /* Descriptors won't be available, provide proper error */ - *errmsg = "We fetch microdescriptors, not router " - "descriptors. You'll need to use md/id/* " - "instead of desc/id/*."; - return 0; } } else if (!strcmpstart(question, "desc/name/")) { - const routerinfo_t *ri = NULL; - /* XXX Setting 'warn_if_unnamed' here is a bit silly -- the + /* XXX023 Setting 'warn_if_unnamed' here is a bit silly -- the * warning goes to the user, not to the controller. */ - const node_t *node = - node_get_by_nickname(question+strlen("desc/name/"), 0); + node = node_get_by_nickname(question+strlen("desc/name/"), 1); if (node) ri = node->ri; if (ri) { const char *body = signed_descriptor_get_body(&ri->cache_info); if (body) *answer = tor_strndup(body, ri->cache_info.signed_descriptor_len); - } else if (! we_fetch_router_descriptors(get_options())) { - /* Descriptors won't be available, provide proper error */ - *errmsg = "We fetch microdescriptors, not router " - "descriptors. You'll need to use md/name/* " - "instead of desc/name/*."; - return 0; } - } else if (!strcmp(question, "desc/download-enabled")) { - int r = we_fetch_router_descriptors(get_options()); - tor_asprintf(answer, "%d", !!r); } else if (!strcmp(question, "desc/all-recent")) { routerlist_t *routerlist = router_get_routerlist(); smartlist_t *sl = smartlist_new(); @@ -2018,115 +1691,25 @@ getinfo_helper_dir(control_connection_t *control_conn, *answer = smartlist_join_strings(sl, "", 0, NULL); SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); - } else if (!strcmpstart(question, "hs/client/desc/id/")) { - hostname_type_t addr_type; - - question += strlen("hs/client/desc/id/"); - if (rend_valid_v2_service_id(question)) { - addr_type = ONION_V2_HOSTNAME; - } else if (hs_address_is_valid(question)) { - addr_type = ONION_V3_HOSTNAME; - } else { - *errmsg = "Invalid address"; - return -1; - } - - if (addr_type == ONION_V2_HOSTNAME) { - rend_cache_entry_t *e = NULL; - if (!rend_cache_lookup_entry(question, -1, &e)) { - /* Descriptor found in cache */ - *answer = tor_strdup(e->desc); - } else { - *errmsg = "Not found in cache"; - return -1; - } - } else { - ed25519_public_key_t service_pk; - const char *desc; - - /* The check before this if/else makes sure of this. */ - tor_assert(addr_type == ONION_V3_HOSTNAME); - - if (hs_parse_address(question, &service_pk, NULL, NULL) < 0) { - *errmsg = "Invalid v3 address"; - return -1; - } - - desc = hs_cache_lookup_encoded_as_client(&service_pk); - if (desc) { - *answer = tor_strdup(desc); - } else { - *errmsg = "Not found in cache"; - return -1; - } - } - } else if (!strcmpstart(question, "hs/service/desc/id/")) { - hostname_type_t addr_type; - - question += strlen("hs/service/desc/id/"); - if (rend_valid_v2_service_id(question)) { - addr_type = ONION_V2_HOSTNAME; - } else if (hs_address_is_valid(question)) { - addr_type = ONION_V3_HOSTNAME; - } else { - *errmsg = "Invalid address"; - return -1; - } - rend_cache_entry_t *e = NULL; - - if (addr_type == ONION_V2_HOSTNAME) { - if (!rend_cache_lookup_v2_desc_as_service(question, &e)) { - /* Descriptor found in cache */ - *answer = tor_strdup(e->desc); - } else { - *errmsg = "Not found in cache"; - return -1; - } - } else { - ed25519_public_key_t service_pk; - char *desc; - - /* The check before this if/else makes sure of this. */ - tor_assert(addr_type == ONION_V3_HOSTNAME); - - if (hs_parse_address(question, &service_pk, NULL, NULL) < 0) { - *errmsg = "Invalid v3 address"; - return -1; - } - - desc = hs_service_lookup_current_desc(&service_pk); - if (desc) { - /* Newly allocated string, we have ownership. */ - *answer = desc; - } else { - *errmsg = "Not found in cache"; - return -1; - } - } } else if (!strcmpstart(question, "md/id/")) { - const node_t *node = node_get_by_hex_id(question+strlen("md/id/"), 0); + const node_t *node = node_get_by_hex_id(question+strlen("md/id/")); const microdesc_t *md = NULL; if (node) md = node->md; if (md && md->body) { *answer = tor_strndup(md->body, md->bodylen); } } else if (!strcmpstart(question, "md/name/")) { - /* XXX Setting 'warn_if_unnamed' here is a bit silly -- the + /* XXX023 Setting 'warn_if_unnamed' here is a bit silly -- the * warning goes to the user, not to the controller. */ - const node_t *node = node_get_by_nickname(question+strlen("md/name/"), 0); + const node_t *node = node_get_by_nickname(question+strlen("md/name/"), 1); /* XXXX duplicated code */ const microdesc_t *md = NULL; if (node) md = node->md; if (md && md->body) { *answer = tor_strndup(md->body, md->bodylen); } - } else if (!strcmp(question, "md/download-enabled")) { - int r = we_fetch_microdescriptors(get_options()); - tor_asprintf(answer, "%d", !!r); } else if (!strcmpstart(question, "desc-annotations/id/")) { - const routerinfo_t *ri = NULL; - const node_t *node = - node_get_by_hex_id(question+strlen("desc-annotations/id/"), 0); + node = node_get_by_hex_id(question+strlen("desc-annotations/id/")); if (node) ri = node->ri; if (ri) { @@ -2167,28 +1750,17 @@ getinfo_helper_dir(control_connection_t *control_conn, } else if (!strcmpstart(question, "dir/status/")) { *answer = tor_strdup(""); } else if (!strcmp(question, "dir/status-vote/current/consensus")) { /* v3 */ - if (we_want_to_fetch_flavor(get_options(), FLAV_NS)) { + if (directory_caches_dir_info(get_options())) { const cached_dir_t *consensus = dirserv_get_consensus("ns"); if (consensus) *answer = tor_strdup(consensus->dir); } if (!*answer) { /* try loading it from disk */ - char *filename = get_cachedir_fname("cached-consensus"); + char *filename = get_datadir_fname("cached-consensus"); *answer = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); tor_free(filename); - if (!*answer) { /* generate an error */ - *errmsg = "Could not open cached consensus. " - "Make sure FetchUselessDescriptors is set to 1."; - return -1; - } } } else if (!strcmp(question, "network-status")) { /* v1 */ - static int network_status_warned = 0; - if (!network_status_warned) { - log_warn(LD_CONTROL, "GETINFO network-status is deprecated; it will " - "go away in a future version of Tor."); - network_status_warned = 1; - } routerlist_t *routerlist = router_get_routerlist(); if (!routerlist || !routerlist->routers || list_server_status_v1(routerlist->routers, answer, 1) < 0) { @@ -2199,8 +1771,7 @@ getinfo_helper_dir(control_connection_t *control_conn, if (strlen(question) == HEX_DIGEST_LEN) { char d[DIGEST_LEN]; signed_descriptor_t *sd = NULL; - if (base16_decode(d, sizeof(d), question, strlen(question)) - == sizeof(d)) { + if (base16_decode(d, sizeof(d), question, strlen(question))==0) { /* XXXX this test should move into extrainfo_get_by_descriptor_digest, * but I don't want to risk affecting other parts of the code, * especially since the rules for using our own extrainfo (including @@ -2222,501 +1793,73 @@ getinfo_helper_dir(control_connection_t *control_conn, return 0; } -/** Given a smartlist of 20-byte digests, return a newly allocated string - * containing each of those digests in order, formatted in HEX, and terminated - * with a newline. */ +/** Allocate and return a description of circ's current status, + * including its path (if any). */ static char * -digest_list_to_string(const smartlist_t *sl) +circuit_describe_status_for_controller(origin_circuit_t *circ) { - int len; - char *result, *s; + char *rv; + smartlist_t *descparts = smartlist_new(); + + { + char *vpath = circuit_list_path_for_controller(circ); + if (*vpath) { + smartlist_add(descparts, vpath); + } else { + tor_free(vpath); /* empty path; don't put an extra space in the result */ + } + } + + { + cpath_build_state_t *build_state = circ->build_state; + smartlist_t *flaglist = smartlist_new(); + char *flaglist_joined; - /* Allow for newlines, and a \0 at the end */ - len = smartlist_len(sl) * (HEX_DIGEST_LEN + 1) + 1; - result = tor_malloc_zero(len); + if (build_state->onehop_tunnel) + smartlist_add(flaglist, (void *)"ONEHOP_TUNNEL"); + if (build_state->is_internal) + smartlist_add(flaglist, (void *)"IS_INTERNAL"); + if (build_state->need_capacity) + smartlist_add(flaglist, (void *)"NEED_CAPACITY"); + if (build_state->need_uptime) + smartlist_add(flaglist, (void *)"NEED_UPTIME"); - s = result; - SMARTLIST_FOREACH_BEGIN(sl, const char *, digest) { - base16_encode(s, HEX_DIGEST_LEN + 1, digest, DIGEST_LEN); - s[HEX_DIGEST_LEN] = '\n'; - s += HEX_DIGEST_LEN + 1; - } SMARTLIST_FOREACH_END(digest); - *s = '\0'; + /* Only emit a BUILD_FLAGS argument if it will have a non-empty value. */ + if (smartlist_len(flaglist)) { + flaglist_joined = smartlist_join_strings(flaglist, ",", 0, NULL); - return result; -} + smartlist_add_asprintf(descparts, "BUILD_FLAGS=%s", flaglist_joined); -/** Turn a download_status_t into a human-readable description in a newly - * allocated string. The format is specified in control-spec.txt, under - * the documentation for "GETINFO download/..." . */ -static char * -download_status_to_string(const download_status_t *dl) -{ - char *rv = NULL, *tmp; - char tbuf[ISO_TIME_LEN+1]; - const char *schedule_str, *want_authority_str; - const char *increment_on_str, *backoff_str; - - if (dl) { - /* Get some substrings of the eventual output ready */ - format_iso_time(tbuf, download_status_get_next_attempt_at(dl)); - - switch (dl->schedule) { - case DL_SCHED_GENERIC: - schedule_str = "DL_SCHED_GENERIC"; - break; - case DL_SCHED_CONSENSUS: - schedule_str = "DL_SCHED_CONSENSUS"; - break; - case DL_SCHED_BRIDGE: - schedule_str = "DL_SCHED_BRIDGE"; - break; - default: - schedule_str = "unknown"; - break; + tor_free(flaglist_joined); } - switch (dl->want_authority) { - case DL_WANT_ANY_DIRSERVER: - want_authority_str = "DL_WANT_ANY_DIRSERVER"; - break; - case DL_WANT_AUTHORITY: - want_authority_str = "DL_WANT_AUTHORITY"; - break; - default: - want_authority_str = "unknown"; - break; - } + smartlist_free(flaglist); + } - switch (dl->increment_on) { - case DL_SCHED_INCREMENT_FAILURE: - increment_on_str = "DL_SCHED_INCREMENT_FAILURE"; - break; - case DL_SCHED_INCREMENT_ATTEMPT: - increment_on_str = "DL_SCHED_INCREMENT_ATTEMPT"; - break; - default: - increment_on_str = "unknown"; - break; - } + smartlist_add_asprintf(descparts, "PURPOSE=%s", + circuit_purpose_to_controller_string(circ->base_.purpose)); - switch (dl->backoff) { - case DL_SCHED_DETERMINISTIC: - backoff_str = "DL_SCHED_DETERMINISTIC"; - break; - case DL_SCHED_RANDOM_EXPONENTIAL: - backoff_str = "DL_SCHED_RANDOM_EXPONENTIAL"; - break; - default: - backoff_str = "unknown"; - break; - } + { + const char *hs_state = + circuit_purpose_to_controller_hs_state_string(circ->base_.purpose); - /* Now assemble them */ - tor_asprintf(&tmp, - "next-attempt-at %s\n" - "n-download-failures %u\n" - "n-download-attempts %u\n" - "schedule %s\n" - "want-authority %s\n" - "increment-on %s\n" - "backoff %s\n", - tbuf, - dl->n_download_failures, - dl->n_download_attempts, - schedule_str, - want_authority_str, - increment_on_str, - backoff_str); - - if (dl->backoff == DL_SCHED_RANDOM_EXPONENTIAL) { - /* Additional fields become relevant in random-exponential mode */ - tor_asprintf(&rv, - "%s" - "last-backoff-position %u\n" - "last-delay-used %d\n", - tmp, - dl->last_backoff_position, - dl->last_delay_used); - tor_free(tmp); - } else { - /* That was it */ - rv = tmp; + if (hs_state != NULL) { + smartlist_add_asprintf(descparts, "HS_STATE=%s", hs_state); } } - return rv; -} - -/** Handle the consensus download cases for getinfo_helper_downloads() */ -STATIC void -getinfo_helper_downloads_networkstatus(const char *flavor, - download_status_t **dl_to_emit, - const char **errmsg) -{ - /* - * We get the one for the current bootstrapped status by default, or - * take an extra /bootstrap or /running suffix - */ - if (strcmp(flavor, "ns") == 0) { - *dl_to_emit = networkstatus_get_dl_status_by_flavor(FLAV_NS); - } else if (strcmp(flavor, "ns/bootstrap") == 0) { - *dl_to_emit = networkstatus_get_dl_status_by_flavor_bootstrap(FLAV_NS); - } else if (strcmp(flavor, "ns/running") == 0 ) { - *dl_to_emit = networkstatus_get_dl_status_by_flavor_running(FLAV_NS); - } else if (strcmp(flavor, "microdesc") == 0) { - *dl_to_emit = networkstatus_get_dl_status_by_flavor(FLAV_MICRODESC); - } else if (strcmp(flavor, "microdesc/bootstrap") == 0) { - *dl_to_emit = - networkstatus_get_dl_status_by_flavor_bootstrap(FLAV_MICRODESC); - } else if (strcmp(flavor, "microdesc/running") == 0) { - *dl_to_emit = - networkstatus_get_dl_status_by_flavor_running(FLAV_MICRODESC); - } else { - *errmsg = "Unknown flavor"; + if (circ->rend_data != NULL) { + smartlist_add_asprintf(descparts, "REND_QUERY=%s", + circ->rend_data->onion_address); } -} -/** Handle the cert download cases for getinfo_helper_downloads() */ -STATIC void -getinfo_helper_downloads_cert(const char *fp_sk_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg) -{ - const char *sk_req; - char id_digest[DIGEST_LEN]; - char sk_digest[DIGEST_LEN]; - - /* - * We have to handle four cases; fp_sk_req is the request with - * a prefix of "downloads/cert/" snipped off. - * - * Case 1: fp_sk_req = "fps" - * - We should emit a digest_list with a list of all the identity - * fingerprints that can be queried for certificate download status; - * get it by calling list_authority_ids_with_downloads(). - * - * Case 2: fp_sk_req = "fp/" for some fingerprint fp - * - We want the default certificate for this identity fingerprint's - * download status; this is the download we get from URLs starting - * in /fp/ on the directory server. We can get it with - * id_only_download_status_for_authority_id(). - * - * Case 3: fp_sk_req = "fp//sks" for some fingerprint fp - * - We want a list of all signing key digests for this identity - * fingerprint which can be queried for certificate download status. - * Get it with list_sk_digests_for_authority_id(). - * - * Case 4: fp_sk_req = "fp//" for some fingerprint fp and - * signing key digest sk - * - We want the download status for the certificate for this specific - * signing key and fingerprint. These correspond to the ones we get - * from URLs starting in /fp-sk/ on the directory server. Get it with - * list_sk_digests_for_authority_id(). - */ - - if (strcmp(fp_sk_req, "fps") == 0) { - *digest_list = list_authority_ids_with_downloads(); - if (!(*digest_list)) { - *errmsg = "Failed to get list of authority identity digests (!)"; - } - } else if (!strcmpstart(fp_sk_req, "fp/")) { - fp_sk_req += strlen("fp/"); - /* Okay, look for another / to tell the fp from fp-sk cases */ - sk_req = strchr(fp_sk_req, '/'); - if (sk_req) { - /* okay, split it here and try to parse */ - if (base16_decode(id_digest, DIGEST_LEN, - fp_sk_req, sk_req - fp_sk_req) == DIGEST_LEN) { - /* Skip past the '/' */ - ++sk_req; - if (strcmp(sk_req, "sks") == 0) { - /* We're asking for the list of signing key fingerprints */ - *digest_list = list_sk_digests_for_authority_id(id_digest); - if (!(*digest_list)) { - *errmsg = "Failed to get list of signing key digests for this " - "authority identity digest"; - } - } else { - /* We've got a signing key digest */ - if (base16_decode(sk_digest, DIGEST_LEN, - sk_req, strlen(sk_req)) == DIGEST_LEN) { - *dl_to_emit = - download_status_for_authority_id_and_sk(id_digest, sk_digest); - if (!(*dl_to_emit)) { - *errmsg = "Failed to get download status for this identity/" - "signing key digest pair"; - } - } else { - *errmsg = "That didn't look like a signing key digest"; - } - } - } else { - *errmsg = "That didn't look like an identity digest"; - } - } else { - /* We're either in downloads/certs/fp/, or we can't parse */ - if (strlen(fp_sk_req) == HEX_DIGEST_LEN) { - if (base16_decode(id_digest, DIGEST_LEN, - fp_sk_req, strlen(fp_sk_req)) == DIGEST_LEN) { - *dl_to_emit = id_only_download_status_for_authority_id(id_digest); - if (!(*dl_to_emit)) { - *errmsg = "Failed to get download status for this authority " - "identity digest"; - } - } else { - *errmsg = "That didn't look like a digest"; - } - } else { - *errmsg = "That didn't look like a digest"; - } - } - } else { - *errmsg = "Unknown certificate download status query"; - } -} - -/** Handle the routerdesc download cases for getinfo_helper_downloads() */ -STATIC void -getinfo_helper_downloads_desc(const char *desc_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg) -{ - char desc_digest[DIGEST_LEN]; - /* - * Two cases to handle here: - * - * Case 1: desc_req = "descs" - * - Emit a list of all router descriptor digests, which we get by - * calling router_get_descriptor_digests(); this can return NULL - * if we have no current ns-flavor consensus. - * - * Case 2: desc_req = - * - Check on the specified fingerprint and emit its download_status_t - * using router_get_dl_status_by_descriptor_digest(). - */ - - if (strcmp(desc_req, "descs") == 0) { - *digest_list = router_get_descriptor_digests(); - if (!(*digest_list)) { - *errmsg = "We don't seem to have a networkstatus-flavored consensus"; - } - /* - * Microdescs don't use the download_status_t mechanism, so we don't - * answer queries about their downloads here; see microdesc.c. - */ - } else if (strlen(desc_req) == HEX_DIGEST_LEN) { - if (base16_decode(desc_digest, DIGEST_LEN, - desc_req, strlen(desc_req)) == DIGEST_LEN) { - /* Okay we got a digest-shaped thing; try asking for it */ - *dl_to_emit = router_get_dl_status_by_descriptor_digest(desc_digest); - if (!(*dl_to_emit)) { - *errmsg = "No such descriptor digest found"; - } - } else { - *errmsg = "That didn't look like a digest"; - } - } else { - *errmsg = "Unknown router descriptor download status query"; - } -} - -/** Handle the bridge download cases for getinfo_helper_downloads() */ -STATIC void -getinfo_helper_downloads_bridge(const char *bridge_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg) -{ - char bridge_digest[DIGEST_LEN]; - /* - * Two cases to handle here: - * - * Case 1: bridge_req = "bridges" - * - Emit a list of all bridge identity digests, which we get by - * calling list_bridge_identities(); this can return NULL if we are - * not using bridges. - * - * Case 2: bridge_req = - * - Check on the specified fingerprint and emit its download_status_t - * using get_bridge_dl_status_by_id(). - */ - - if (strcmp(bridge_req, "bridges") == 0) { - *digest_list = list_bridge_identities(); - if (!(*digest_list)) { - *errmsg = "We don't seem to be using bridges"; - } - } else if (strlen(bridge_req) == HEX_DIGEST_LEN) { - if (base16_decode(bridge_digest, DIGEST_LEN, - bridge_req, strlen(bridge_req)) == DIGEST_LEN) { - /* Okay we got a digest-shaped thing; try asking for it */ - *dl_to_emit = get_bridge_dl_status_by_id(bridge_digest); - if (!(*dl_to_emit)) { - *errmsg = "No such bridge identity digest found"; - } - } else { - *errmsg = "That didn't look like a digest"; - } - } else { - *errmsg = "Unknown bridge descriptor download status query"; - } -} - -/** Implementation helper for GETINFO: knows the answers for questions about - * download status information. */ -STATIC int -getinfo_helper_downloads(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - download_status_t *dl_to_emit = NULL; - smartlist_t *digest_list = NULL; - - /* Assert args are sane */ - tor_assert(control_conn != NULL); - tor_assert(question != NULL); - tor_assert(answer != NULL); - tor_assert(errmsg != NULL); - - /* We check for this later to see if we should supply a default */ - *errmsg = NULL; - - /* Are we after networkstatus downloads? */ - if (!strcmpstart(question, "downloads/networkstatus/")) { - getinfo_helper_downloads_networkstatus( - question + strlen("downloads/networkstatus/"), - &dl_to_emit, errmsg); - /* Certificates? */ - } else if (!strcmpstart(question, "downloads/cert/")) { - getinfo_helper_downloads_cert( - question + strlen("downloads/cert/"), - &dl_to_emit, &digest_list, errmsg); - /* Router descriptors? */ - } else if (!strcmpstart(question, "downloads/desc/")) { - getinfo_helper_downloads_desc( - question + strlen("downloads/desc/"), - &dl_to_emit, &digest_list, errmsg); - /* Bridge descriptors? */ - } else if (!strcmpstart(question, "downloads/bridge/")) { - getinfo_helper_downloads_bridge( - question + strlen("downloads/bridge/"), - &dl_to_emit, &digest_list, errmsg); - } else { - *errmsg = "Unknown download status query"; - } - - if (dl_to_emit) { - *answer = download_status_to_string(dl_to_emit); - - return 0; - } else if (digest_list) { - *answer = digest_list_to_string(digest_list); - SMARTLIST_FOREACH(digest_list, void *, s, tor_free(s)); - smartlist_free(digest_list); - - return 0; - } else { - if (!(*errmsg)) { - *errmsg = "Unknown error"; - } - - return -1; - } -} - -/** Allocate and return a description of circ's current status, - * including its path (if any). */ -static char * -circuit_describe_status_for_controller(origin_circuit_t *circ) -{ - char *rv; - smartlist_t *descparts = smartlist_new(); - - { - char *vpath = circuit_list_path_for_controller(circ); - if (*vpath) { - smartlist_add(descparts, vpath); - } else { - tor_free(vpath); /* empty path; don't put an extra space in the result */ - } - } - - { - cpath_build_state_t *build_state = circ->build_state; - smartlist_t *flaglist = smartlist_new(); - char *flaglist_joined; - - if (build_state->onehop_tunnel) - smartlist_add(flaglist, (void *)"ONEHOP_TUNNEL"); - if (build_state->is_internal) - smartlist_add(flaglist, (void *)"IS_INTERNAL"); - if (build_state->need_capacity) - smartlist_add(flaglist, (void *)"NEED_CAPACITY"); - if (build_state->need_uptime) - smartlist_add(flaglist, (void *)"NEED_UPTIME"); - - /* Only emit a BUILD_FLAGS argument if it will have a non-empty value. */ - if (smartlist_len(flaglist)) { - flaglist_joined = smartlist_join_strings(flaglist, ",", 0, NULL); - - smartlist_add_asprintf(descparts, "BUILD_FLAGS=%s", flaglist_joined); - - tor_free(flaglist_joined); - } - - smartlist_free(flaglist); - } - - smartlist_add_asprintf(descparts, "PURPOSE=%s", - circuit_purpose_to_controller_string(circ->base_.purpose)); - - { - const char *hs_state = - circuit_purpose_to_controller_hs_state_string(circ->base_.purpose); - - if (hs_state != NULL) { - smartlist_add_asprintf(descparts, "HS_STATE=%s", hs_state); - } - } - - if (circ->rend_data != NULL || circ->hs_ident != NULL) { - char addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - const char *onion_address; - if (circ->rend_data) { - onion_address = rend_data_get_address(circ->rend_data); - } else { - hs_build_address(&circ->hs_ident->identity_pk, HS_VERSION_THREE, addr); - onion_address = addr; - } - smartlist_add_asprintf(descparts, "REND_QUERY=%s", onion_address); - } - - { - char tbuf[ISO_TIME_USEC_LEN+1]; - format_iso_time_nospace_usec(tbuf, &circ->base_.timestamp_created); + { + char tbuf[ISO_TIME_USEC_LEN+1]; + format_iso_time_nospace_usec(tbuf, &circ->base_.timestamp_created); smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf); } - // Show username and/or password if available. - if (circ->socks_username_len > 0) { - char* socks_username_escaped = esc_for_log_len(circ->socks_username, - (size_t) circ->socks_username_len); - smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", - socks_username_escaped); - tor_free(socks_username_escaped); - } - if (circ->socks_password_len > 0) { - char* socks_password_escaped = esc_for_log_len(circ->socks_password, - (size_t) circ->socks_password_len); - smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", - socks_password_escaped); - tor_free(socks_password_escaped); - } - rv = smartlist_join_strings(descparts, " ", 0, NULL); SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp)); @@ -2732,11 +1875,11 @@ getinfo_helper_events(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg) { - const or_options_t *options = get_options(); (void) control_conn; if (!strcmp(question, "circuit-status")) { + circuit_t *circ_; smartlist_t *status = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ_) { + TOR_LIST_FOREACH(circ_, circuit_get_global_list(), head) { origin_circuit_t *circ; char *circdesc; const char *state; @@ -2746,8 +1889,6 @@ getinfo_helper_events(control_connection_t *control_conn, if (circ->base_.state == CIRCUIT_STATE_OPEN) state = "BUILT"; - else if (circ->base_.state == CIRCUIT_STATE_GUARD_WAIT) - state = "GUARD_WAIT"; else if (circ->cpath) state = "EXTENDED"; else @@ -2760,7 +1901,6 @@ getinfo_helper_events(control_connection_t *control_conn, state, *circdesc ? " " : "", circdesc); tor_free(circdesc); } - SMARTLIST_FOREACH_END(circ_); *answer = smartlist_join_strings(status, "\r\n", 0, NULL); SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); smartlist_free(status); @@ -2860,7 +2000,7 @@ getinfo_helper_events(control_connection_t *control_conn, /* Note that status/ is not a catch-all for events; there's only supposed * to be a status GETINFO if there's a corresponding STATUS event. */ if (!strcmp(question, "status/circuit-established")) { - *answer = tor_strdup(have_completed_a_circuit() ? "1" : "0"); + *answer = tor_strdup(can_complete_circuit ? "1" : "0"); } else if (!strcmp(question, "status/enough-dir-info")) { *answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0"); } else if (!strcmp(question, "status/good-server-descriptor") || @@ -2871,19 +2011,17 @@ getinfo_helper_events(control_connection_t *control_conn, *answer = tor_strdup(directories_have_accepted_server_descriptor() ? "1" : "0"); } else if (!strcmp(question, "status/reachability-succeeded/or")) { - *answer = tor_strdup(check_whether_orport_reachable(options) ? - "1" : "0"); + *answer = tor_strdup(check_whether_orport_reachable() ? "1" : "0"); } else if (!strcmp(question, "status/reachability-succeeded/dir")) { - *answer = tor_strdup(check_whether_dirport_reachable(options) ? - "1" : "0"); + *answer = tor_strdup(check_whether_dirport_reachable() ? "1" : "0"); } else if (!strcmp(question, "status/reachability-succeeded")) { tor_asprintf(answer, "OR=%d DIR=%d", - check_whether_orport_reachable(options) ? 1 : 0, - check_whether_dirport_reachable(options) ? 1 : 0); + check_whether_orport_reachable() ? 1 : 0, + check_whether_dirport_reachable() ? 1 : 0); } else if (!strcmp(question, "status/bootstrap-phase")) { *answer = tor_strdup(last_sent_bootstrap_message); } else if (!strcmpstart(question, "status/version/")) { - int is_server = server_mode(options); + int is_server = server_mode(get_options()); networkstatus_t *c = networkstatus_get_latest_consensus(); version_status_t status; const char *recommended; @@ -2924,46 +2062,6 @@ getinfo_helper_events(control_connection_t *control_conn, return -1; } *answer = bridge_stats; - } else if (!strcmp(question, "status/fresh-relay-descs")) { - if (!server_mode(options)) { - *errmsg = "Only relays have descriptors"; - return -1; - } - routerinfo_t *r; - extrainfo_t *e; - if (router_build_fresh_descriptor(&r, &e) < 0) { - *errmsg = "Error generating descriptor"; - return -1; - } - size_t size = r->cache_info.signed_descriptor_len + 1; - if (e) { - size += e->cache_info.signed_descriptor_len + 1; - } - tor_assert(r->cache_info.signed_descriptor_len); - char *descs = tor_malloc(size); - char *cp = descs; - memcpy(cp, signed_descriptor_get_body(&r->cache_info), - r->cache_info.signed_descriptor_len); - cp += r->cache_info.signed_descriptor_len - 1; - if (e) { - if (cp[0] == '\0') { - cp[0] = '\n'; - } else if (cp[0] != '\n') { - cp[1] = '\n'; - cp++; - } - memcpy(cp, signed_descriptor_get_body(&e->cache_info), - e->cache_info.signed_descriptor_len); - cp += e->cache_info.signed_descriptor_len - 1; - } - if (cp[0] == '\n') { - cp[0] = '\0'; - } else if (cp[0] != '\0') { - cp[1] = '\0'; - } - *answer = descs; - routerinfo_free(r); - extrainfo_free(e); } else { return 0; } @@ -2971,83 +2069,12 @@ getinfo_helper_events(control_connection_t *control_conn, return 0; } -/** Implementation helper for GETINFO: knows how to enumerate hidden services - * created via the control port. */ -STATIC int -getinfo_helper_onions(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - smartlist_t *onion_list = NULL; - (void) errmsg; /* no errors from this method */ - - if (control_conn && !strcmp(question, "onions/current")) { - onion_list = control_conn->ephemeral_onion_services; - } else if (!strcmp(question, "onions/detached")) { - onion_list = detached_onion_services; - } else { - return 0; - } - if (!onion_list || smartlist_len(onion_list) == 0) { - if (answer) { - *answer = tor_strdup(""); - } - } else { - if (answer) { - *answer = smartlist_join_strings(onion_list, "\r\n", 0, NULL); - } - } - - return 0; -} - -/** Implementation helper for GETINFO: answers queries about network - * liveness. */ -static int -getinfo_helper_liveness(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - (void)control_conn; - (void)errmsg; - if (strcmp(question, "network-liveness") == 0) { - if (get_cached_network_liveness()) { - *answer = tor_strdup("up"); - } else { - *answer = tor_strdup("down"); - } - } - - return 0; -} - -/** Implementation helper for GETINFO: answers queries about shared random - * value. */ -static int -getinfo_helper_sr(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) control_conn; - (void) errmsg; - - if (!strcmp(question, "sr/current")) { - *answer = sr_get_current_for_control(); - } else if (!strcmp(question, "sr/previous")) { - *answer = sr_get_previous_for_control(); - } - /* Else statement here is unrecognized key so do nothing. */ - - return 0; -} - /** Callback function for GETINFO: on a given control connection, try to * answer the question q and store the newly-allocated answer in * *a. If an internal error occurs, return -1 and optionally set * *error_out to point to an error message to be delivered to the * controller. On success, _or if the key is not recognized_, return 0. Do not - * set a if the key is not recognized but you may set error_out - * to improve the error message. + * set a if the key is not recognized. */ typedef int (*getinfo_helper_t)(control_connection_t *, const char *q, char **a, @@ -3070,13 +2097,10 @@ typedef struct getinfo_item_t { * to answer them. */ static const getinfo_item_t getinfo_items[] = { ITEM("version", misc, "The current version of Tor."), - ITEM("bw-event-cache", misc, "Cached BW events for a short interval."), ITEM("config-file", misc, "Current location of the \"torrc\" file."), ITEM("config-defaults-file", misc, "Current location of the defaults file."), ITEM("config-text", misc, "Return the string that would be written by a saveconf command."), - ITEM("config-can-saveconf", misc, - "Is it possible to save the configuration to the \"torrc\" file?"), ITEM("accounting/bytes", accounting, "Number of bytes read/written so far in the accounting interval."), ITEM("accounting/bytes-left", accounting, @@ -3099,49 +2123,6 @@ static const getinfo_item_t getinfo_items[] = { DOC("config/defaults", "List of default values for configuration options. " "See also config/names"), - PREFIX("downloads/networkstatus/", downloads, - "Download statuses for networkstatus objects"), - DOC("downloads/networkstatus/ns", - "Download status for current-mode networkstatus download"), - DOC("downloads/networkstatus/ns/bootstrap", - "Download status for bootstrap-time networkstatus download"), - DOC("downloads/networkstatus/ns/running", - "Download status for run-time networkstatus download"), - DOC("downloads/networkstatus/microdesc", - "Download status for current-mode microdesc download"), - DOC("downloads/networkstatus/microdesc/bootstrap", - "Download status for bootstrap-time microdesc download"), - DOC("downloads/networkstatus/microdesc/running", - "Download status for run-time microdesc download"), - PREFIX("downloads/cert/", downloads, - "Download statuses for certificates, by id fingerprint and " - "signing key"), - DOC("downloads/cert/fps", - "List of authority fingerprints for which any download statuses " - "exist"), - DOC("downloads/cert/fp/", - "Download status for with the default signing key; corresponds " - "to /fp/ URLs on directory server."), - DOC("downloads/cert/fp//sks", - "List of signing keys for which specific download statuses are " - "available for this id fingerprint"), - DOC("downloads/cert/fp//", - "Download status for with signing key ; corresponds " - "to /fp-sk/ URLs on directory server."), - PREFIX("downloads/desc/", downloads, - "Download statuses for router descriptors, by descriptor digest"), - DOC("downloads/desc/descs", - "Return a list of known router descriptor digests"), - DOC("downloads/desc/", - "Return a download status for a given descriptor digest"), - PREFIX("downloads/bridge/", downloads, - "Download statuses for bridge descriptors, by bridge identity " - "digest"), - DOC("downloads/bridge/bridges", - "Return a list of configured bridge identity digests with download " - "statuses"), - DOC("downloads/bridge/", - "Return a download status for a given bridge identity digest"), ITEM("info/names", misc, "List of GETINFO options, types, and documentation."), ITEM("events/names", misc, @@ -3152,18 +2133,10 @@ static const getinfo_item_t getinfo_items[] = { PREFIX("desc/name/", dir, "Router descriptors by nickname."), ITEM("desc/all-recent", dir, "All non-expired, non-superseded router descriptors."), - ITEM("desc/download-enabled", dir, - "Do we try to download router descriptors?"), ITEM("desc/all-recent-extrainfo-hack", dir, NULL), /* Hack. */ PREFIX("md/id/", dir, "Microdescriptors by ID"), PREFIX("md/name/", dir, "Microdescriptors by name"), - ITEM("md/download-enabled", dir, - "Do we try to download microdescriptors?"), PREFIX("extra-info/digest/", dir, "Extra-info documents by digest."), - PREFIX("hs/client/desc/id", dir, - "Hidden Service descriptor in client's cache by onion."), - PREFIX("hs/service/desc/id/", dir, - "Hidden Service descriptor in services's cache by onion."), PREFIX("net/listeners/", listeners, "Bound addresses by type"), ITEM("ns/all", networkstatus, "Brief summary of router status (v2 directory format)"), @@ -3173,12 +2146,8 @@ static const getinfo_item_t getinfo_items[] = { "Brief summary of router status by nickname (v2 directory format)."), PREFIX("ns/purpose/", networkstatus, "Brief summary of router status by purpose (v2 directory format)."), - PREFIX("consensus/", networkstatus, - "Information about and from the ns consensus."), ITEM("network-status", dir, "Brief summary of router status (v1 directory format)"), - ITEM("network-liveness", liveness, - "Current opinion on whether the network is live"), ITEM("circuit-status", events, "List of current circuits originating here."), ITEM("stream-status", events,"List of current streams."), ITEM("orconn-status", events, "A list of current OR connections."), @@ -3200,8 +2169,6 @@ static const getinfo_item_t getinfo_items[] = { "The last bootstrap phase status event that Tor sent."), DOC("status/clients-seen", "Breakdown of client countries seen by a bridge."), - DOC("status/fresh-relay-descs", - "A fresh relay/ei descriptor pair for Tor's current state. Not stored."), DOC("status/version/recommended", "List of currently recommended versions."), DOC("status/version/current", "Status of the current version."), DOC("status/version/num-versioning", "Number of versioning authorities."), @@ -3217,7 +2184,7 @@ static const getinfo_item_t getinfo_items[] = { ITEM("process/user", misc, "Username under which the tor process is running."), ITEM("process/descriptor-limit", misc, "File descriptor limit."), - ITEM("limits/max-mem-in-queues", misc, "Actual limit on memory in queues"), + ITEM("dir-usage", misc, "Breakdown of bytes transferred over DirPort."), PREFIX("desc-annotations/id/", dir, "Router annotations by hexdigest."), PREFIX("dir/server/", dir,"Router descriptors as retrieved from a DirPort."), PREFIX("dir/status/", dir, @@ -3226,22 +2193,7 @@ static const getinfo_item_t getinfo_items[] = { "v3 Networkstatus consensus as retrieved from a DirPort."), ITEM("exit-policy/default", policies, "The default value appended to the configured exit policy."), - ITEM("exit-policy/reject-private/default", policies, - "The default rules appended to the configured exit policy by" - " ExitPolicyRejectPrivate."), - ITEM("exit-policy/reject-private/relay", policies, - "The relay-specific rules appended to the configured exit policy by" - " ExitPolicyRejectPrivate and/or ExitPolicyRejectLocalInterfaces."), - ITEM("exit-policy/full", policies, "The entire exit policy of onion router"), - ITEM("exit-policy/ipv4", policies, "IPv4 parts of exit policy"), - ITEM("exit-policy/ipv6", policies, "IPv6 parts of exit policy"), PREFIX("ip-to-country/", geoip, "Perform a GEOIP lookup"), - ITEM("onions/current", onions, - "Onion services owned by the current control connection."), - ITEM("onions/detached", onions, - "Onion services detached from the control connection."), - ITEM("sr/current", sr, "Get current shared random value."), - ITEM("sr/previous", sr, "Get previous shared random value."), { NULL, NULL, NULL, 0 } }; @@ -3306,7 +2258,7 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len, smartlist_t *questions = smartlist_new(); smartlist_t *answers = smartlist_new(); smartlist_t *unrecognized = smartlist_new(); - char *ans = NULL; + char *msg = NULL, *ans = NULL; int i; (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ @@ -3321,26 +2273,20 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len, goto done; } if (!ans) { - if (errmsg) /* use provided error message */ - smartlist_add_strdup(unrecognized, errmsg); - else /* use default error message */ - smartlist_add_asprintf(unrecognized, "Unrecognized key \"%s\"", q); + smartlist_add(unrecognized, (char*)q); } else { - smartlist_add_strdup(answers, q); + smartlist_add(answers, tor_strdup(q)); smartlist_add(answers, ans); } } SMARTLIST_FOREACH_END(q); - if (smartlist_len(unrecognized)) { - /* control-spec section 2.3, mid-reply '-' or end of reply ' ' */ for (i=0; i < smartlist_len(unrecognized)-1; ++i) connection_printf_to_buf(conn, - "552-%s\r\n", - (char *)smartlist_get(unrecognized, i)); - + "552-Unrecognized key \"%s\"\r\n", + (char*)smartlist_get(unrecognized, i)); connection_printf_to_buf(conn, - "552 %s\r\n", - (char *)smartlist_get(unrecognized, i)); + "552 Unrecognized key \"%s\"\r\n", + (char*)smartlist_get(unrecognized, i)); goto done; } @@ -3356,7 +2302,7 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len, size_t esc_len; esc_len = write_escaped_data(v, strlen(v), &esc); connection_printf_to_buf(conn, "250+%s=\r\n", k); - connection_buf_add(esc, esc_len, TO_CONN(conn)); + connection_write_to_buf(esc, esc_len, TO_CONN(conn)); tor_free(esc); } } @@ -3367,8 +2313,8 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len, smartlist_free(answers); SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); smartlist_free(questions); - SMARTLIST_FOREACH(unrecognized, char *, cp, tor_free(cp)); smartlist_free(unrecognized); + tor_free(msg); return 0; } @@ -3499,14 +2445,6 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, goto done; } - if (smartlist_len(args) < 2) { - connection_printf_to_buf(conn, - "512 syntax error: not enough arguments.\r\n"); - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - goto done; - } - smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); @@ -3514,13 +2452,13 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, nodes = smartlist_new(); SMARTLIST_FOREACH_BEGIN(router_nicknames, const char *, n) { - const node_t *node = node_get_by_nickname(n, 0); + const node_t *node = node_get_by_nickname(n, 1); if (!node) { connection_printf_to_buf(conn, "552 No such router \"%s\"\r\n", n); goto done; } if (!node_has_descriptor(node)) { - connection_printf_to_buf(conn, "552 No descriptor for \"%s\"\r\n", n); + connection_printf_to_buf(conn, "552 descriptor for \"%s\"\r\n", n); goto done; } smartlist_add(nodes, (void*)node); @@ -3536,23 +2474,12 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, } /* now circ refers to something that is ready to be extended */ - int first_node = zero_circ; SMARTLIST_FOREACH(nodes, const node_t *, node, { - extend_info_t *info = extend_info_from_node(node, first_node); - if (!info) { - tor_assert_nonfatal(first_node); - log_warn(LD_CONTROL, - "controller tried to connect to a node that doesn't have any " - "addresses that are allowed by the firewall configuration; " - "circuit marked for closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), -END_CIRC_REASON_CONNECTFAILED); - connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn); - goto done; - } + extend_info_t *info = extend_info_from_node(node, 0); + tor_assert(info); /* True, since node_has_descriptor(node) == true */ circuit_append_new_exit(circ, info); extend_info_free(info); - first_node = 0; }); /* now that we've populated the cpath, start extending */ @@ -3564,8 +2491,7 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, goto done; } } else { - if (circ->base_.state == CIRCUIT_STATE_OPEN || - circ->base_.state == CIRCUIT_STATE_GUARD_WAIT) { + if (circ->base_.state == CIRCUIT_STATE_OPEN) { int err_reason = 0; circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) { @@ -3695,7 +2621,6 @@ handle_control_attachstream(control_connection_t *conn, uint32_t len, edge_conn->end_reason = 0; if (tmpcirc) circuit_detach_stream(tmpcirc, edge_conn); - CONNECTION_AP_EXPECT_NONPENDING(ap_conn); TO_CONN(edge_conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; } @@ -3707,9 +2632,23 @@ handle_control_attachstream(control_connection_t *conn, uint32_t len, } /* Is this a single hop circuit? */ if (circ && (circuit_get_cpath_len(circ)<2 || hop==1)) { - connection_write_str_to_buf( - "551 Can't attach stream to this one-hop circuit.\r\n", conn); - return 0; + const node_t *node = NULL; + char *exit_digest; + if (circ->build_state && + circ->build_state->chosen_exit && + !tor_digest_is_zero(circ->build_state->chosen_exit->identity_digest)) { + exit_digest = circ->build_state->chosen_exit->identity_digest; + node = node_get_by_id(exit_digest); + } + /* Do both the client and relay allow one-hop exit circuits? */ + if (!node || + !node_allows_single_hop_exits(node) || + !get_options()->AllowSingleHopCircuits) { + connection_write_str_to_buf( + "551 Can't attach stream to this one-hop circuit.\r\n", conn); + return 0; + } + ap_conn->chosen_exit_name = tor_strdup(hex_str(exit_digest, DIGEST_LEN)); } if (circ && hop>0) { @@ -3740,17 +2679,12 @@ handle_control_postdescriptor(control_connection_t *conn, uint32_t len, uint8_t purpose = ROUTER_PURPOSE_GENERAL; int cache = 0; /* eventually, we may switch this to 1 */ - const char *cp = memchr(body, '\n', len); - - if (cp == NULL) { - connection_printf_to_buf(conn, "251 Empty body\r\n"); - return 0; - } - ++cp; - - char *cmdline = tor_memdup_nulterm(body, cp-body); + char *cp = memchr(body, '\n', len); smartlist_t *args = smartlist_new(); - smartlist_split_string(args, cmdline, " ", + tor_assert(cp); + *cp++ = '\0'; + + smartlist_split_string(args, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); SMARTLIST_FOREACH_BEGIN(args, char *, option) { if (!strcasecmpstart(option, "purpose=")) { @@ -3799,7 +2733,6 @@ handle_control_postdescriptor(control_connection_t *conn, uint32_t len, done: SMARTLIST_FOREACH(args, char *, arg, tor_free(arg)); smartlist_free(args); - tor_free(cmdline); return 0; } @@ -3940,7 +2873,7 @@ handle_control_resolve(control_connection_t *conn, uint32_t len, int is_reverse = 0; (void) len; /* body is nul-terminated; it's safe to ignore the length */ - if (!(conn->event_mask & (((event_mask_t)1)<event_mask & ((uint32_t)1L<CookieAuthentication; - char *cfile = get_controller_cookie_file_name(); + char *cfile = get_cookie_file(); char *abs_cfile; char *esc_cfile; char *methods; @@ -4095,8 +3028,7 @@ handle_control_authchallenge(control_connection_t *conn, uint32_t len, client_nonce = tor_malloc_zero(client_nonce_len); if (base16_decode(client_nonce, client_nonce_len, - cp, client_nonce_encoded_len) - != (int) client_nonce_len) { + cp, client_nonce_encoded_len) < 0) { connection_write_str_to_buf("513 Invalid base16 client nonce\r\n", conn); connection_mark_for_close(TO_CONN(conn)); @@ -4116,7 +3048,8 @@ handle_control_authchallenge(control_connection_t *conn, uint32_t len, tor_free(client_nonce); return -1; } - crypto_rand(server_nonce, SAFECOOKIE_SERVER_NONCE_LEN); + + tor_assert(!crypto_rand(server_nonce, SAFECOOKIE_SERVER_NONCE_LEN)); /* Now compute and send the server-to-controller response, and the * server's nonce. */ @@ -4212,14 +3145,6 @@ handle_control_dropguards(control_connection_t *conn, smartlist_split_string(args, body, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - static int have_warned = 0; - if (! have_warned) { - log_warn(LD_CONTROL, "DROPGUARDS is dangerous; make sure you understand " - "the risks before using it. It may be removed in a future " - "version of Tor."); - have_warned = 1; - } - if (smartlist_len(args)) { connection_printf_to_buf(conn, "512 Too many arguments to DROPGUARDS\r\n"); } else { @@ -4232,851 +3157,6 @@ handle_control_dropguards(control_connection_t *conn, return 0; } -/** Implementation for the HSFETCH command. */ -static int -handle_control_hsfetch(control_connection_t *conn, uint32_t len, - const char *body) -{ - int i; - char digest[DIGEST_LEN], *hsaddress = NULL, *arg1 = NULL, *desc_id = NULL; - smartlist_t *args = NULL, *hsdirs = NULL; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - static const char *hsfetch_command = "HSFETCH"; - static const char *v2_str = "v2-"; - const size_t v2_str_len = strlen(v2_str); - rend_data_t *rend_query = NULL; - - /* Make sure we have at least one argument, the HSAddress. */ - args = getargs_helper(hsfetch_command, conn, body, 1, -1); - if (!args) { - goto exit; - } - - /* Extract the first argument (either HSAddress or DescID). */ - arg1 = smartlist_get(args, 0); - /* Test if it's an HS address without the .onion part. */ - if (rend_valid_v2_service_id(arg1)) { - hsaddress = arg1; - } else if (strcmpstart(arg1, v2_str) == 0 && - rend_valid_descriptor_id(arg1 + v2_str_len) && - base32_decode(digest, sizeof(digest), arg1 + v2_str_len, - REND_DESC_ID_V2_LEN_BASE32) == 0) { - /* We have a well formed version 2 descriptor ID. Keep the decoded value - * of the id. */ - desc_id = digest; - } else { - connection_printf_to_buf(conn, "513 Invalid argument \"%s\"\r\n", - arg1); - goto done; - } - - static const char *opt_server = "SERVER="; - - /* Skip first argument because it's the HSAddress or DescID. */ - for (i = 1; i < smartlist_len(args); ++i) { - const char *arg = smartlist_get(args, i); - const node_t *node; - - if (!strcasecmpstart(arg, opt_server)) { - const char *server; - - server = arg + strlen(opt_server); - node = node_get_by_hex_id(server, 0); - if (!node) { - connection_printf_to_buf(conn, "552 Server \"%s\" not found\r\n", - server); - goto done; - } - if (!hsdirs) { - /* Stores routerstatus_t object for each specified server. */ - hsdirs = smartlist_new(); - } - /* Valid server, add it to our local list. */ - smartlist_add(hsdirs, node->rs); - } else { - connection_printf_to_buf(conn, "513 Unexpected argument \"%s\"\r\n", - arg); - goto done; - } - } - - rend_query = rend_data_client_create(hsaddress, desc_id, NULL, - REND_NO_AUTH); - if (rend_query == NULL) { - connection_printf_to_buf(conn, "551 Error creating the HS query\r\n"); - goto done; - } - - /* Using a descriptor ID, we force the user to provide at least one - * hsdir server using the SERVER= option. */ - if (desc_id && (!hsdirs || !smartlist_len(hsdirs))) { - connection_printf_to_buf(conn, "512 %s option is required\r\n", - opt_server); - goto done; - } - - /* We are about to trigger HSDir fetch so send the OK now because after - * that 650 event(s) are possible so better to have the 250 OK before them - * to avoid out of order replies. */ - send_control_done(conn); - - /* Trigger the fetch using the built rend query and possibly a list of HS - * directory to use. This function ignores the client cache thus this will - * always send a fetch command. */ - rend_client_fetch_v2_desc(rend_query, hsdirs); - - done: - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - /* Contains data pointer that we don't own thus no cleanup. */ - smartlist_free(hsdirs); - rend_data_free(rend_query); - exit: - return 0; -} - -/** Implementation for the HSPOST command. */ -static int -handle_control_hspost(control_connection_t *conn, - uint32_t len, - const char *body) -{ - static const char *opt_server = "SERVER="; - static const char *opt_hsaddress = "HSADDRESS="; - smartlist_t *hs_dirs = NULL; - const char *encoded_desc = body; - size_t encoded_desc_len = len; - const char *onion_address = NULL; - - char *cp = memchr(body, '\n', len); - if (cp == NULL) { - connection_printf_to_buf(conn, "251 Empty body\r\n"); - return 0; - } - char *argline = tor_strndup(body, cp-body); - - smartlist_t *args = smartlist_new(); - - /* If any SERVER= options were specified, try parse the options line */ - if (!strcasecmpstart(argline, opt_server)) { - /* encoded_desc begins after a newline character */ - cp = cp + 1; - encoded_desc = cp; - encoded_desc_len = len-(cp-body); - - smartlist_split_string(args, argline, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(args, const char *, arg) { - if (!strcasecmpstart(arg, opt_server)) { - const char *server = arg + strlen(opt_server); - const node_t *node = node_get_by_hex_id(server, 0); - - if (!node || !node->rs) { - connection_printf_to_buf(conn, "552 Server \"%s\" not found\r\n", - server); - goto done; - } - /* Valid server, add it to our local list. */ - if (!hs_dirs) - hs_dirs = smartlist_new(); - smartlist_add(hs_dirs, node->rs); - } else if (!strcasecmpstart(arg, opt_hsaddress)) { - if (!hs_address_is_valid(arg)) { - connection_printf_to_buf(conn, "512 Malformed onion address\r\n"); - goto done; - } - onion_address = arg; - } else { - connection_printf_to_buf(conn, "512 Unexpected argument \"%s\"\r\n", - arg); - goto done; - } - } SMARTLIST_FOREACH_END(arg); - } - - /* Handle the v3 case. */ - if (onion_address) { - char *desc_str = NULL; - read_escaped_data(encoded_desc, encoded_desc_len, &desc_str); - if (hs_control_hspost_command(desc_str, onion_address, hs_dirs) < 0) { - connection_printf_to_buf(conn, "554 Invalid descriptor\r\n"); - } - tor_free(desc_str); - goto done; - } - - /* From this point on, it is only v2. */ - - /* Read the dot encoded descriptor, and parse it. */ - rend_encoded_v2_service_descriptor_t *desc = - tor_malloc_zero(sizeof(rend_encoded_v2_service_descriptor_t)); - read_escaped_data(encoded_desc, encoded_desc_len, &desc->desc_str); - - rend_service_descriptor_t *parsed = NULL; - char *intro_content = NULL; - size_t intro_size; - size_t encoded_size; - const char *next_desc; - if (!rend_parse_v2_service_descriptor(&parsed, desc->desc_id, &intro_content, - &intro_size, &encoded_size, - &next_desc, desc->desc_str, 1)) { - /* Post the descriptor. */ - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - if (!rend_get_service_id(parsed->pk, serviceid)) { - smartlist_t *descs = smartlist_new(); - smartlist_add(descs, desc); - - /* We are about to trigger HS descriptor upload so send the OK now - * because after that 650 event(s) are possible so better to have the - * 250 OK before them to avoid out of order replies. */ - send_control_done(conn); - - /* Trigger the descriptor upload */ - directory_post_to_hs_dir(parsed, descs, hs_dirs, serviceid, 0); - smartlist_free(descs); - } - - rend_service_descriptor_free(parsed); - } else { - connection_printf_to_buf(conn, "554 Invalid descriptor\r\n"); - } - - tor_free(intro_content); - rend_encoded_v2_service_descriptor_free(desc); - done: - tor_free(argline); - smartlist_free(hs_dirs); /* Contents belong to the rend service code. */ - SMARTLIST_FOREACH(args, char *, arg, tor_free(arg)); - smartlist_free(args); - return 0; -} - -/* Helper function for ADD_ONION that adds an ephemeral service depending on - * the given hs_version. - * - * The secret key in pk depends on the hs_version. The ownership of the key - * used in pk is given to the HS subsystem so the caller must stop accessing - * it after. - * - * The port_cfgs is a list of service port. Ownership transfered to service. - * The max_streams refers to the MaxStreams= key. - * The max_streams_close_circuit refers to the MaxStreamsCloseCircuit key. - * The auth_type is the authentication type of the clients in auth_clients. - * The ownership of that list is transfered to the service. - * - * On success (RSAE_OKAY), the address_out points to a newly allocated string - * containing the onion address without the .onion part. On error, address_out - * is untouched. */ -static hs_service_add_ephemeral_status_t -add_onion_helper_add_service(int hs_version, - add_onion_secret_key_t *pk, - smartlist_t *port_cfgs, int max_streams, - int max_streams_close_circuit, int auth_type, - smartlist_t *auth_clients, char **address_out) -{ - hs_service_add_ephemeral_status_t ret; - - tor_assert(pk); - tor_assert(port_cfgs); - tor_assert(address_out); - - switch (hs_version) { - case HS_VERSION_TWO: - ret = rend_service_add_ephemeral(pk->v2, port_cfgs, max_streams, - max_streams_close_circuit, auth_type, - auth_clients, address_out); - break; - case HS_VERSION_THREE: - ret = hs_service_add_ephemeral(pk->v3, port_cfgs, max_streams, - max_streams_close_circuit, address_out); - break; - default: - tor_assert_unreached(); - } - - return ret; -} - -/** Called when we get a ADD_ONION command; parse the body, and set up - * the new ephemeral Onion Service. */ -static int -handle_control_add_onion(control_connection_t *conn, - uint32_t len, - const char *body) -{ - smartlist_t *args; - size_t arg_len; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - args = getargs_helper("ADD_ONION", conn, body, 2, -1); - if (!args) - return 0; - arg_len = smartlist_len(args); - - /* Parse all of the arguments that do not involve handling cryptographic - * material first, since there's no reason to touch that at all if any of - * the other arguments are malformed. - */ - smartlist_t *port_cfgs = smartlist_new(); - smartlist_t *auth_clients = NULL; - smartlist_t *auth_created_clients = NULL; - int discard_pk = 0; - int detach = 0; - int max_streams = 0; - int max_streams_close_circuit = 0; - rend_auth_type_t auth_type = REND_NO_AUTH; - /* Default to adding an anonymous hidden service if no flag is given */ - int non_anonymous = 0; - for (size_t i = 1; i < arg_len; i++) { - static const char *port_prefix = "Port="; - static const char *flags_prefix = "Flags="; - static const char *max_s_prefix = "MaxStreams="; - static const char *auth_prefix = "ClientAuth="; - - const char *arg = smartlist_get(args, i); - if (!strcasecmpstart(arg, port_prefix)) { - /* "Port=VIRTPORT[,TARGET]". */ - const char *port_str = arg + strlen(port_prefix); - - rend_service_port_config_t *cfg = - rend_service_parse_port_config(port_str, ",", NULL); - if (!cfg) { - connection_printf_to_buf(conn, "512 Invalid VIRTPORT/TARGET\r\n"); - goto out; - } - smartlist_add(port_cfgs, cfg); - } else if (!strcasecmpstart(arg, max_s_prefix)) { - /* "MaxStreams=[0..65535]". */ - const char *max_s_str = arg + strlen(max_s_prefix); - int ok = 0; - max_streams = (int)tor_parse_long(max_s_str, 10, 0, 65535, &ok, NULL); - if (!ok) { - connection_printf_to_buf(conn, "512 Invalid MaxStreams\r\n"); - goto out; - } - } else if (!strcasecmpstart(arg, flags_prefix)) { - /* "Flags=Flag[,Flag]", where Flag can be: - * * 'DiscardPK' - If tor generates the keypair, do not include it in - * the response. - * * 'Detach' - Do not tie this onion service to any particular control - * connection. - * * 'MaxStreamsCloseCircuit' - Close the circuit if MaxStreams is - * exceeded. - * * 'BasicAuth' - Client authorization using the 'basic' method. - * * 'NonAnonymous' - Add a non-anonymous Single Onion Service. If this - * flag is present, tor must be in non-anonymous - * hidden service mode. If this flag is absent, - * tor must be in anonymous hidden service mode. - */ - static const char *discard_flag = "DiscardPK"; - static const char *detach_flag = "Detach"; - static const char *max_s_close_flag = "MaxStreamsCloseCircuit"; - static const char *basicauth_flag = "BasicAuth"; - static const char *non_anonymous_flag = "NonAnonymous"; - - smartlist_t *flags = smartlist_new(); - int bad = 0; - - smartlist_split_string(flags, arg + strlen(flags_prefix), ",", - SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(flags) < 1) { - connection_printf_to_buf(conn, "512 Invalid 'Flags' argument\r\n"); - bad = 1; - } - SMARTLIST_FOREACH_BEGIN(flags, const char *, flag) - { - if (!strcasecmp(flag, discard_flag)) { - discard_pk = 1; - } else if (!strcasecmp(flag, detach_flag)) { - detach = 1; - } else if (!strcasecmp(flag, max_s_close_flag)) { - max_streams_close_circuit = 1; - } else if (!strcasecmp(flag, basicauth_flag)) { - auth_type = REND_BASIC_AUTH; - } else if (!strcasecmp(flag, non_anonymous_flag)) { - non_anonymous = 1; - } else { - connection_printf_to_buf(conn, - "512 Invalid 'Flags' argument: %s\r\n", - escaped(flag)); - bad = 1; - break; - } - } SMARTLIST_FOREACH_END(flag); - SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp)); - smartlist_free(flags); - if (bad) - goto out; - } else if (!strcasecmpstart(arg, auth_prefix)) { - char *err_msg = NULL; - int created = 0; - rend_authorized_client_t *client = - add_onion_helper_clientauth(arg + strlen(auth_prefix), - &created, &err_msg); - if (!client) { - if (err_msg) { - connection_write_str_to_buf(err_msg, conn); - tor_free(err_msg); - } - goto out; - } - - if (auth_clients != NULL) { - int bad = 0; - SMARTLIST_FOREACH_BEGIN(auth_clients, rend_authorized_client_t *, ac) { - if (strcmp(ac->client_name, client->client_name) == 0) { - bad = 1; - break; - } - } SMARTLIST_FOREACH_END(ac); - if (bad) { - connection_printf_to_buf(conn, - "512 Duplicate name in ClientAuth\r\n"); - rend_authorized_client_free(client); - goto out; - } - } else { - auth_clients = smartlist_new(); - auth_created_clients = smartlist_new(); - } - smartlist_add(auth_clients, client); - if (created) { - smartlist_add(auth_created_clients, client); - } - } else { - connection_printf_to_buf(conn, "513 Invalid argument\r\n"); - goto out; - } - } - if (smartlist_len(port_cfgs) == 0) { - connection_printf_to_buf(conn, "512 Missing 'Port' argument\r\n"); - goto out; - } else if (auth_type == REND_NO_AUTH && auth_clients != NULL) { - connection_printf_to_buf(conn, "512 No auth type specified\r\n"); - goto out; - } else if (auth_type != REND_NO_AUTH && auth_clients == NULL) { - connection_printf_to_buf(conn, "512 No auth clients specified\r\n"); - goto out; - } else if ((auth_type == REND_BASIC_AUTH && - smartlist_len(auth_clients) > 512) || - (auth_type == REND_STEALTH_AUTH && - smartlist_len(auth_clients) > 16)) { - connection_printf_to_buf(conn, "512 Too many auth clients\r\n"); - goto out; - } else if (non_anonymous != rend_service_non_anonymous_mode_enabled( - get_options())) { - /* If we failed, and the non-anonymous flag is set, Tor must be in - * anonymous hidden service mode. - * The error message changes based on the current Tor config: - * 512 Tor is in anonymous hidden service mode - * 512 Tor is in non-anonymous hidden service mode - * (I've deliberately written them out in full here to aid searchability.) - */ - connection_printf_to_buf(conn, "512 Tor is in %sanonymous hidden service " - "mode\r\n", - non_anonymous ? "" : "non-"); - goto out; - } - - /* Parse the "keytype:keyblob" argument. */ - int hs_version = 0; - add_onion_secret_key_t pk = { NULL }; - const char *key_new_alg = NULL; - char *key_new_blob = NULL; - char *err_msg = NULL; - - if (add_onion_helper_keyarg(smartlist_get(args, 0), discard_pk, - &key_new_alg, &key_new_blob, &pk, &hs_version, - &err_msg) < 0) { - if (err_msg) { - connection_write_str_to_buf(err_msg, conn); - tor_free(err_msg); - } - goto out; - } - tor_assert(!err_msg); - - /* Hidden service version 3 don't have client authentication support so if - * ClientAuth was given, send back an error. */ - if (hs_version == HS_VERSION_THREE && auth_clients) { - connection_printf_to_buf(conn, "513 ClientAuth not supported\r\n"); - goto out; - } - - /* Create the HS, using private key pk, client authentication auth_type, - * the list of auth_clients, and port config port_cfg. - * rend_service_add_ephemeral() will take ownership of pk and port_cfg, - * regardless of success/failure. - */ - char *service_id = NULL; - int ret = add_onion_helper_add_service(hs_version, &pk, port_cfgs, - max_streams, - max_streams_close_circuit, auth_type, - auth_clients, &service_id); - port_cfgs = NULL; /* port_cfgs is now owned by the rendservice code. */ - auth_clients = NULL; /* so is auth_clients */ - switch (ret) { - case RSAE_OKAY: - { - if (detach) { - if (!detached_onion_services) - detached_onion_services = smartlist_new(); - smartlist_add(detached_onion_services, service_id); - } else { - if (!conn->ephemeral_onion_services) - conn->ephemeral_onion_services = smartlist_new(); - smartlist_add(conn->ephemeral_onion_services, service_id); - } - - tor_assert(service_id); - connection_printf_to_buf(conn, "250-ServiceID=%s\r\n", service_id); - if (key_new_alg) { - tor_assert(key_new_blob); - connection_printf_to_buf(conn, "250-PrivateKey=%s:%s\r\n", - key_new_alg, key_new_blob); - } - if (auth_created_clients) { - SMARTLIST_FOREACH(auth_created_clients, rend_authorized_client_t *, ac, { - char *encoded = rend_auth_encode_cookie(ac->descriptor_cookie, - auth_type); - tor_assert(encoded); - connection_printf_to_buf(conn, "250-ClientAuth=%s:%s\r\n", - ac->client_name, encoded); - memwipe(encoded, 0, strlen(encoded)); - tor_free(encoded); - }); - } - - connection_printf_to_buf(conn, "250 OK\r\n"); - break; - } - case RSAE_BADPRIVKEY: - connection_printf_to_buf(conn, "551 Failed to generate onion address\r\n"); - break; - case RSAE_ADDREXISTS: - connection_printf_to_buf(conn, "550 Onion address collision\r\n"); - break; - case RSAE_BADVIRTPORT: - connection_printf_to_buf(conn, "512 Invalid VIRTPORT/TARGET\r\n"); - break; - case RSAE_BADAUTH: - connection_printf_to_buf(conn, "512 Invalid client authorization\r\n"); - break; - case RSAE_INTERNAL: /* FALLSTHROUGH */ - default: - connection_printf_to_buf(conn, "551 Failed to add Onion Service\r\n"); - } - if (key_new_blob) { - memwipe(key_new_blob, 0, strlen(key_new_blob)); - tor_free(key_new_blob); - } - - out: - if (port_cfgs) { - SMARTLIST_FOREACH(port_cfgs, rend_service_port_config_t*, p, - rend_service_port_config_free(p)); - smartlist_free(port_cfgs); - } - - if (auth_clients) { - SMARTLIST_FOREACH(auth_clients, rend_authorized_client_t *, ac, - rend_authorized_client_free(ac)); - smartlist_free(auth_clients); - } - if (auth_created_clients) { - // Do not free entries; they are the same as auth_clients - smartlist_free(auth_created_clients); - } - - SMARTLIST_FOREACH(args, char *, cp, { - memwipe(cp, 0, strlen(cp)); - tor_free(cp); - }); - smartlist_free(args); - return 0; -} - -/** Helper function to handle parsing the KeyType:KeyBlob argument to the - * ADD_ONION command. Return a new crypto_pk_t and if a new key was generated - * and the private key not discarded, the algorithm and serialized private key, - * or NULL and an optional control protocol error message on failure. The - * caller is responsible for freeing the returned key_new_blob and err_msg. - * - * Note: The error messages returned are deliberately vague to avoid echoing - * key material. - */ -STATIC int -add_onion_helper_keyarg(const char *arg, int discard_pk, - const char **key_new_alg_out, char **key_new_blob_out, - add_onion_secret_key_t *decoded_key, int *hs_version, - char **err_msg_out) -{ - smartlist_t *key_args = smartlist_new(); - crypto_pk_t *pk = NULL; - const char *key_new_alg = NULL; - char *key_new_blob = NULL; - char *err_msg = NULL; - int ret = -1; - - smartlist_split_string(key_args, arg, ":", SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(key_args) != 2) { - err_msg = tor_strdup("512 Invalid key type/blob\r\n"); - goto err; - } - - /* The format is "KeyType:KeyBlob". */ - static const char *key_type_new = "NEW"; - static const char *key_type_best = "BEST"; - static const char *key_type_rsa1024 = "RSA1024"; - static const char *key_type_ed25519_v3 = "ED25519-V3"; - - const char *key_type = smartlist_get(key_args, 0); - const char *key_blob = smartlist_get(key_args, 1); - - if (!strcasecmp(key_type_rsa1024, key_type)) { - /* "RSA:" - Loading a pre-existing RSA1024 key. */ - pk = crypto_pk_base64_decode(key_blob, strlen(key_blob)); - if (!pk) { - err_msg = tor_strdup("512 Failed to decode RSA key\r\n"); - goto err; - } - if (crypto_pk_num_bits(pk) != PK_BYTES*8) { - crypto_pk_free(pk); - err_msg = tor_strdup("512 Invalid RSA key size\r\n"); - goto err; - } - decoded_key->v2 = pk; - *hs_version = HS_VERSION_TWO; - } else if (!strcasecmp(key_type_ed25519_v3, key_type)) { - /* "ED25519-V3:" - Loading a pre-existing ed25519 key. */ - ed25519_secret_key_t *sk = tor_malloc_zero(sizeof(*sk)); - if (base64_decode((char *) sk->seckey, sizeof(sk->seckey), key_blob, - strlen(key_blob)) != sizeof(sk->seckey)) { - tor_free(sk); - err_msg = tor_strdup("512 Failed to decode ED25519-V3 key\r\n"); - goto err; - } - decoded_key->v3 = sk; - *hs_version = HS_VERSION_THREE; - } else if (!strcasecmp(key_type_new, key_type)) { - /* "NEW:" - Generating a new key, blob as algorithm. */ - if (!strcasecmp(key_type_rsa1024, key_blob) || - !strcasecmp(key_type_best, key_blob)) { - /* "RSA1024", RSA 1024 bit, also currently "BEST" by default. */ - pk = crypto_pk_new(); - if (crypto_pk_generate_key(pk)) { - tor_asprintf(&err_msg, "551 Failed to generate %s key\r\n", - key_type_rsa1024); - goto err; - } - if (!discard_pk) { - if (crypto_pk_base64_encode(pk, &key_new_blob)) { - crypto_pk_free(pk); - tor_asprintf(&err_msg, "551 Failed to encode %s key\r\n", - key_type_rsa1024); - goto err; - } - key_new_alg = key_type_rsa1024; - } - decoded_key->v2 = pk; - *hs_version = HS_VERSION_TWO; - } else if (!strcasecmp(key_type_ed25519_v3, key_blob)) { - ed25519_secret_key_t *sk = tor_malloc_zero(sizeof(*sk)); - if (ed25519_secret_key_generate(sk, 1) < 0) { - tor_free(sk); - tor_asprintf(&err_msg, "551 Failed to generate %s key\r\n", - key_type_ed25519_v3); - goto err; - } - if (!discard_pk) { - ssize_t len = base64_encode_size(sizeof(sk->seckey), 0) + 1; - key_new_blob = tor_malloc_zero(len); - if (base64_encode(key_new_blob, len, (const char *) sk->seckey, - sizeof(sk->seckey), 0) != (len - 1)) { - tor_free(sk); - tor_free(key_new_blob); - tor_asprintf(&err_msg, "551 Failed to encode %s key\r\n", - key_type_ed25519_v3); - goto err; - } - key_new_alg = key_type_ed25519_v3; - } - decoded_key->v3 = sk; - *hs_version = HS_VERSION_THREE; - } else { - err_msg = tor_strdup("513 Invalid key type\r\n"); - goto err; - } - } else { - err_msg = tor_strdup("513 Invalid key type\r\n"); - goto err; - } - - /* Succeded in loading or generating a private key. */ - ret = 0; - - err: - SMARTLIST_FOREACH(key_args, char *, cp, { - memwipe(cp, 0, strlen(cp)); - tor_free(cp); - }); - smartlist_free(key_args); - - if (err_msg_out) { - *err_msg_out = err_msg; - } else { - tor_free(err_msg); - } - *key_new_alg_out = key_new_alg; - *key_new_blob_out = key_new_blob; - - return ret; -} - -/** Helper function to handle parsing a ClientAuth argument to the - * ADD_ONION command. Return a new rend_authorized_client_t, or NULL - * and an optional control protocol error message on failure. The - * caller is responsible for freeing the returned auth_client and err_msg. - * - * If 'created' is specified, it will be set to 1 when a new cookie has - * been generated. - */ -STATIC rend_authorized_client_t * -add_onion_helper_clientauth(const char *arg, int *created, char **err_msg) -{ - int ok = 0; - - tor_assert(arg); - tor_assert(created); - tor_assert(err_msg); - *err_msg = NULL; - - smartlist_t *auth_args = smartlist_new(); - rend_authorized_client_t *client = - tor_malloc_zero(sizeof(rend_authorized_client_t)); - smartlist_split_string(auth_args, arg, ":", 0, 0); - if (smartlist_len(auth_args) < 1 || smartlist_len(auth_args) > 2) { - *err_msg = tor_strdup("512 Invalid ClientAuth syntax\r\n"); - goto err; - } - client->client_name = tor_strdup(smartlist_get(auth_args, 0)); - if (smartlist_len(auth_args) == 2) { - char *decode_err_msg = NULL; - if (rend_auth_decode_cookie(smartlist_get(auth_args, 1), - client->descriptor_cookie, - NULL, &decode_err_msg) < 0) { - tor_assert(decode_err_msg); - tor_asprintf(err_msg, "512 %s\r\n", decode_err_msg); - tor_free(decode_err_msg); - goto err; - } - *created = 0; - } else { - crypto_rand((char *) client->descriptor_cookie, REND_DESC_COOKIE_LEN); - *created = 1; - } - - if (!rend_valid_client_name(client->client_name)) { - *err_msg = tor_strdup("512 Invalid name in ClientAuth\r\n"); - goto err; - } - - ok = 1; - err: - SMARTLIST_FOREACH(auth_args, char *, item, tor_free(item)); - smartlist_free(auth_args); - if (!ok) { - rend_authorized_client_free(client); - client = NULL; - } - return client; -} - -/** Called when we get a DEL_ONION command; parse the body, and remove - * the existing ephemeral Onion Service. */ -static int -handle_control_del_onion(control_connection_t *conn, - uint32_t len, - const char *body) -{ - int hs_version = 0; - smartlist_t *args; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - args = getargs_helper("DEL_ONION", conn, body, 1, 1); - if (!args) - return 0; - - const char *service_id = smartlist_get(args, 0); - if (rend_valid_v2_service_id(service_id)) { - hs_version = HS_VERSION_TWO; - } else if (hs_address_is_valid(service_id)) { - hs_version = HS_VERSION_THREE; - } else { - connection_printf_to_buf(conn, "512 Malformed Onion Service id\r\n"); - goto out; - } - - /* Determine if the onion service belongs to this particular control - * connection, or if it is in the global list of detached services. If it - * is in neither, either the service ID is invalid in some way, or it - * explicitly belongs to a different control connection, and an error - * should be returned. - */ - smartlist_t *services[2] = { - conn->ephemeral_onion_services, - detached_onion_services - }; - smartlist_t *onion_services = NULL; - int idx = -1; - for (size_t i = 0; i < ARRAY_LENGTH(services); i++) { - idx = smartlist_string_pos(services[i], service_id); - if (idx != -1) { - onion_services = services[i]; - break; - } - } - if (onion_services == NULL) { - connection_printf_to_buf(conn, "552 Unknown Onion Service id\r\n"); - } else { - int ret = -1; - switch (hs_version) { - case HS_VERSION_TWO: - ret = rend_service_del_ephemeral(service_id); - break; - case HS_VERSION_THREE: - ret = hs_service_del_ephemeral(service_id); - break; - default: - /* The ret value will be -1 thus hitting the warning below. This should - * never happen because of the check at the start of the function. */ - break; - } - if (ret < 0) { - /* This should *NEVER* fail, since the service is on either the - * per-control connection list, or the global one. - */ - log_warn(LD_BUG, "Failed to remove Onion Service %s.", - escaped(service_id)); - tor_fragile_assert(); - } - - /* Remove/scrub the service_id from the appropriate list. */ - char *cp = smartlist_get(onion_services, idx); - smartlist_del(onion_services, idx); - memwipe(cp, 0, strlen(cp)); - tor_free(cp); - - send_control_done(conn); - } - - out: - SMARTLIST_FOREACH(args, char *, cp, { - memwipe(cp, 0, strlen(cp)); - tor_free(cp); - }); - smartlist_free(args); - return 0; -} - /** Called when conn has no more bytes left on its outbuf. */ int connection_control_finished_flushing(control_connection_t *conn) @@ -5101,10 +3181,22 @@ connection_control_reached_eof(control_connection_t *conn) static void lost_owning_controller(const char *owner_type, const char *loss_manner) { - log_notice(LD_CONTROL, "Owning controller %s has %s -- exiting now.", - owner_type, loss_manner); + int shutdown_slowly = server_mode(get_options()); - activate_signal(SIGTERM); + log_notice(LD_CONTROL, "Owning controller %s has %s -- %s.", + owner_type, loss_manner, + shutdown_slowly ? "shutting down" : "exiting now"); + + /* XXXX Perhaps this chunk of code should be a separate function, + * called here and by process_signal(SIGINT). */ + + if (!shutdown_slowly) { + tor_cleanup(); + exit(0); + } + /* XXXX This will close all listening sockets except control-port + * listeners. Perhaps we should close those too. */ + hibernate_begin_shutdown(); } /** Called when conn is being freed. */ @@ -5116,22 +3208,6 @@ connection_control_closed(control_connection_t *conn) conn->event_mask = 0; control_update_global_event_mask(); - /* Close all ephemeral Onion Services if any. - * The list and it's contents are scrubbed/freed in connection_free_. - */ - if (conn->ephemeral_onion_services) { - SMARTLIST_FOREACH_BEGIN(conn->ephemeral_onion_services, char *, cp) { - if (rend_valid_v2_service_id(cp)) { - rend_service_del_ephemeral(cp); - } else if (hs_address_is_valid(cp)) { - hs_service_del_ephemeral(cp); - } else { - /* An invalid .onion in our list should NEVER happen */ - tor_fragile_assert(); - } - } SMARTLIST_FOREACH_END(cp); - } - if (conn->is_owning_control_connection) { lost_owning_controller("connection", "closed"); } @@ -5160,48 +3236,21 @@ is_valid_initial_command(control_connection_t *conn, const char *cmd) * interfaces is broken. */ #define MAX_COMMAND_LINE_LENGTH (1024*1024) -/** Wrapper around peek_buf_has_control0 command: presents the same - * interface as that underlying functions, but takes a connection_t intead of - * a buf_t. +/** Wrapper around peek_(evbuffer|buf)_has_control0 command: presents the same + * interface as those underlying functions, but takes a connection_t intead of + * an evbuffer or a buf_t. */ static int peek_connection_has_control0_command(connection_t *conn) { - return peek_buf_has_control0_command(conn->inbuf); -} - -static int -peek_connection_has_http_command(connection_t *conn) -{ - return peek_buf_has_http_command(conn->inbuf); + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return peek_evbuffer_has_control0_command(input); + }) ELSE_IF_NO_BUFFEREVENT { + return peek_buf_has_control0_command(conn->inbuf); + } } -static const char CONTROLPORT_IS_NOT_AN_HTTP_PROXY_MSG[] = - "HTTP/1.0 501 Tor ControlPort is not an HTTP proxy" - "\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n" - "\n" - "\n" - "Tor's ControlPort is not an HTTP proxy\n" - "\n" - "\n" - "

Tor's ControlPort is not an HTTP proxy

\n" - "

\n" - "It appears you have configured your web browser to use Tor's control port" - " as an HTTP proxy.\n" - "This is not correct: Tor's default SOCKS proxy port is 9050.\n" - "Please configure your client accordingly.\n" - "

\n" - "

\n" - "See " - "https://www.torproject.org/documentation.html for more " - "information.\n" - "\n" - "

\n" - "\n" - "\n"; - /** Called when data has arrived on a v1 control connection: Try to fetch * commands from conn->inbuf, and execute them. */ @@ -5235,21 +3284,12 @@ connection_control_process_inbuf(control_connection_t *conn) sizeof(buf)-6); body_len = 2+strlen(buf+6)+2; /* code, msg, nul. */ set_uint16(buf+0, htons(body_len)); - connection_buf_add(buf, 4+body_len, TO_CONN(conn)); + connection_write_to_buf(buf, 4+body_len, TO_CONN(conn)); connection_mark_and_flush(TO_CONN(conn)); return 0; } - /* If the user has the HTTP proxy port and the control port confused. */ - if (conn->base_.state == CONTROL_CONN_STATE_NEEDAUTH && - peek_connection_has_http_command(TO_CONN(conn))) { - connection_write_str_to_buf(CONTROLPORT_IS_NOT_AN_HTTP_PROXY_MSG, conn); - log_notice(LD_CONTROL, "Received HTTP request on ControlPort"); - connection_mark_and_flush(TO_CONN(conn)); - return 0; - } - again: while (1) { size_t last_idx; @@ -5257,7 +3297,7 @@ connection_control_process_inbuf(control_connection_t *conn) /* First, fetch a line. */ do { data_len = conn->incoming_cmd_len - conn->incoming_cmd_cur_len; - r = connection_buf_get_line(TO_CONN(conn), + r = connection_fetch_from_buf_line(TO_CONN(conn), conn->incoming_cmd+conn->incoming_cmd_cur_len, &data_len); if (r == 0) @@ -5419,22 +3459,6 @@ connection_control_process_inbuf(control_connection_t *conn) } else if (!strcasecmp(conn->incoming_cmd, "DROPGUARDS")) { if (handle_control_dropguards(conn, cmd_data_len, args)) return -1; - } else if (!strcasecmp(conn->incoming_cmd, "HSFETCH")) { - if (handle_control_hsfetch(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "+HSPOST")) { - if (handle_control_hspost(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "ADD_ONION")) { - int ret = handle_control_add_onion(conn, cmd_data_len, args); - memwipe(args, 0, cmd_data_len); /* Scrub the private key. */ - if (ret) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "DEL_ONION")) { - int ret = handle_control_del_onion(conn, cmd_data_len, args); - memwipe(args, 0, cmd_data_len); /* Scrub the service id/pk. */ - if (ret) - return -1; } else { connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n", conn->incoming_cmd); @@ -5488,7 +3512,7 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, { char *circdesc = circuit_describe_status_for_controller(circ); const char *sp = strlen(circdesc) ? " " : ""; - send_control_event(EVENT_CIRCUIT_STATUS, + send_control_event(EVENT_CIRCUIT_STATUS, ALL_FORMATS, "650 CIRC %lu %s%s%s%s\r\n", (unsigned long)circ->global_identifier, status, sp, @@ -5559,7 +3583,7 @@ control_event_circuit_status_minor(origin_circuit_t *circ, { char *circdesc = circuit_describe_status_for_controller(circ); const char *sp = strlen(circdesc) ? " " : ""; - send_control_event(EVENT_CIRCUIT_STATUS_MINOR, + send_control_event(EVENT_CIRCUIT_STATUS_MINOR, ALL_FORMATS, "650 CIRC_MINOR %lu %s%s%s%s\r\n", (unsigned long)circ->global_identifier, event_desc, sp, @@ -5734,7 +3758,7 @@ control_event_stream_status(entry_connection_t *conn, stream_status_event_t tp, circ = circuit_get_by_edge_conn(ENTRY_TO_EDGE_CONN(conn)); if (circ && CIRCUIT_IS_ORIGIN(circ)) origin_circ = TO_ORIGIN_CIRCUIT(circ); - send_control_event(EVENT_STREAM_STATUS, + send_control_event(EVENT_STREAM_STATUS, ALL_FORMATS, "650 STREAM "U64_FORMAT" %s %lu %s%s%s%s\r\n", U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier), status, @@ -5806,7 +3830,7 @@ control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp, } orconn_target_get_name(name, sizeof(name), conn); - send_control_event(EVENT_OR_CONN_STATUS, + send_control_event(EVENT_OR_CONN_STATUS, ALL_FORMATS, "650 ORCONN %s %s%s%s%s ID="U64_FORMAT"\r\n", name, status, reason ? " REASON=" : "", @@ -5825,20 +3849,15 @@ control_event_stream_bandwidth(edge_connection_t *edge_conn) { circuit_t *circ; origin_circuit_t *ocirc; - struct timeval now; - char tbuf[ISO_TIME_USEC_LEN+1]; if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) { if (!edge_conn->n_read && !edge_conn->n_written) return 0; - tor_gettimeofday(&now); - format_iso_time_nospace_usec(tbuf, &now); - send_control_event(EVENT_STREAM_BANDWIDTH_USED, - "650 STREAM_BW "U64_FORMAT" %lu %lu %s\r\n", + send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, + "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", U64_PRINTF_ARG(edge_conn->base_.global_identifier), (unsigned long)edge_conn->n_read, - (unsigned long)edge_conn->n_written, - tbuf); + (unsigned long)edge_conn->n_written); circ = circuit_get_by_edge_conn(edge_conn); if (circ && CIRCUIT_IS_ORIGIN(circ)) { @@ -5860,8 +3879,6 @@ control_event_stream_bandwidth_used(void) if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) { smartlist_t *conns = get_connection_array(); edge_connection_t *edge_conn; - struct timeval now; - char tbuf[ISO_TIME_USEC_LEN+1]; SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { @@ -5871,14 +3888,11 @@ control_event_stream_bandwidth_used(void) if (!edge_conn->n_read && !edge_conn->n_written) continue; - tor_gettimeofday(&now); - format_iso_time_nospace_usec(tbuf, &now); - send_control_event(EVENT_STREAM_BANDWIDTH_USED, - "650 STREAM_BW "U64_FORMAT" %lu %lu %s\r\n", + send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, + "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", U64_PRINTF_ARG(edge_conn->base_.global_identifier), (unsigned long)edge_conn->n_read, - (unsigned long)edge_conn->n_written, - tbuf); + (unsigned long)edge_conn->n_written); edge_conn->n_written = edge_conn->n_read = 0; } @@ -5893,30 +3907,24 @@ control_event_stream_bandwidth_used(void) int control_event_circ_bandwidth_used(void) { + circuit_t *circ; origin_circuit_t *ocirc; - struct timeval now; - char tbuf[ISO_TIME_USEC_LEN+1]; if (!EVENT_IS_INTERESTING(EVENT_CIRC_BANDWIDTH_USED)) return 0; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (!CIRCUIT_IS_ORIGIN(circ)) continue; ocirc = TO_ORIGIN_CIRCUIT(circ); if (!ocirc->n_read_circ_bw && !ocirc->n_written_circ_bw) continue; - tor_gettimeofday(&now); - format_iso_time_nospace_usec(tbuf, &now); - send_control_event(EVENT_CIRC_BANDWIDTH_USED, - "650 CIRC_BW ID=%d READ=%lu WRITTEN=%lu " - "TIME=%s\r\n", + send_control_event(EVENT_CIRC_BANDWIDTH_USED, ALL_FORMATS, + "650 CIRC_BW ID=%d READ=%lu WRITTEN=%lu\r\n", ocirc->global_identifier, (unsigned long)ocirc->n_read_circ_bw, - (unsigned long)ocirc->n_written_circ_bw, - tbuf); + (unsigned long)ocirc->n_written_circ_bw); ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0; } - SMARTLIST_FOREACH_END(circ); return 0; } @@ -5945,7 +3953,7 @@ control_event_conn_bandwidth(connection_t *conn) default: return 0; } - send_control_event(EVENT_CONN_BW, + send_control_event(EVENT_CONN_BW, ALL_FORMATS, "650 CONN_BW ID="U64_FORMAT" TYPE=%s " "READ=%lu WRITTEN=%lu\r\n", U64_PRINTF_ARG(conn->global_identifier), @@ -5978,7 +3986,7 @@ sum_up_cell_stats_by_command(circuit_t *circ, cell_stats_t *cell_stats) { memset(cell_stats, 0, sizeof(cell_stats_t)); SMARTLIST_FOREACH_BEGIN(circ->testing_cell_stats, - const testing_cell_stats_entry_t *, ent) { + testing_cell_stats_entry_t *, ent) { tor_assert(ent->command <= CELL_COMMAND_MAX_); if (!ent->removed && !ent->exitward) { cell_stats->added_cells_appward[ent->command] += 1; @@ -5991,8 +3999,10 @@ sum_up_cell_stats_by_command(circuit_t *circ, cell_stats_t *cell_stats) cell_stats->removed_cells_exitward[ent->command] += 1; cell_stats->total_time_exitward[ent->command] += ent->waiting_time * 10; } + tor_free(ent); } SMARTLIST_FOREACH_END(ent); - circuit_clear_testing_cell_stats(circ); + smartlist_free(circ->testing_cell_stats); + circ->testing_cell_stats = NULL; } /** Helper: append a cell statistics string to event_parts, @@ -6079,22 +4089,22 @@ format_cell_stats(char **event_string, circuit_t *circ, int control_event_circuit_cell_stats(void) { + circuit_t *circ; cell_stats_t *cell_stats; char *event_string; if (!get_options()->TestingEnableCellStatsEvent || !EVENT_IS_INTERESTING(EVENT_CELL_STATS)) return 0; - cell_stats = tor_malloc(sizeof(cell_stats_t)); - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + cell_stats = tor_malloc(sizeof(cell_stats_t));; + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { if (!circ->testing_cell_stats) continue; sum_up_cell_stats_by_command(circ, cell_stats); format_cell_stats(&event_string, circ, cell_stats); - send_control_event(EVENT_CELL_STATS, + send_control_event(EVENT_CELL_STATS, ALL_FORMATS, "650 CELL_STATS %s\r\n", event_string); tor_free(event_string); } - SMARTLIST_FOREACH_END(circ); tor_free(cell_stats); return 0; } @@ -6112,7 +4122,7 @@ control_event_tb_empty(const char *bucket, uint32_t read_empty_time, if (get_options()->TestingEnableTbEmptyEvent && EVENT_IS_INTERESTING(EVENT_TB_EMPTY) && (read_empty_time > 0 || write_empty_time > 0)) { - send_control_event(EVENT_TB_EMPTY, + send_control_event(EVENT_TB_EMPTY, ALL_FORMATS, "650 TB_EMPTY %s READ=%d WRITTEN=%d " "LAST=%d\r\n", bucket, read_empty_time, write_empty_time, @@ -6121,31 +4131,13 @@ control_event_tb_empty(const char *bucket, uint32_t read_empty_time, return 0; } -/* about 5 minutes worth. */ -#define N_BW_EVENTS_TO_CACHE 300 -/* Index into cached_bw_events to next write. */ -static int next_measurement_idx = 0; -/* number of entries set in n_measurements */ -static int n_measurements = 0; -static struct cached_bw_event_s { - uint32_t n_read; - uint32_t n_written; -} cached_bw_events[N_BW_EVENTS_TO_CACHE]; - /** A second or more has elapsed: tell any interested control * connections how much bandwidth we used. */ int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) { - cached_bw_events[next_measurement_idx].n_read = n_read; - cached_bw_events[next_measurement_idx].n_written = n_written; - if (++next_measurement_idx == N_BW_EVENTS_TO_CACHE) - next_measurement_idx = 0; - if (n_measurements < N_BW_EVENTS_TO_CACHE) - ++n_measurements; - if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) { - send_control_event(EVENT_BANDWIDTH_USED, + send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS, "650 BW %lu %lu\r\n", (unsigned long)n_read, (unsigned long)n_written); @@ -6154,35 +4146,6 @@ control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) return 0; } -STATIC char * -get_bw_samples(void) -{ - int i; - int idx = (next_measurement_idx + N_BW_EVENTS_TO_CACHE - n_measurements) - % N_BW_EVENTS_TO_CACHE; - tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE); - - smartlist_t *elements = smartlist_new(); - - for (i = 0; i < n_measurements; ++i) { - tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE); - const struct cached_bw_event_s *bwe = &cached_bw_events[idx]; - - smartlist_add_asprintf(elements, "%u,%u", - (unsigned)bwe->n_read, - (unsigned)bwe->n_written); - - idx = (idx + 1) % N_BW_EVENTS_TO_CACHE; - } - - char *result = smartlist_join_strings(elements, " ", 0, NULL); - - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - - return result; -} - /** Called when we are sending a log message to the controllers: suspend * sending further log messages to the controllers until we're done. Used by * CONN_LOG_PROTECT. */ @@ -6244,11 +4207,7 @@ control_event_logmsg(int severity, uint32_t domain, const char *msg) default: s = "UnknownLogSeverity"; break; } ++disable_log_messages; - send_control_event(event, "650 %s %s\r\n", s, b?b:msg); - if (severity == LOG_ERR) { - /* Force a flush, since we may be about to die horribly */ - queued_events_flush_all(1); - } + send_control_event(event, ALL_FORMATS, "650 %s %s\r\n", s, b?b:msg); --disable_log_messages; tor_free(b); } @@ -6276,7 +4235,7 @@ control_event_descriptors_changed(smartlist_t *routers) }); ids = smartlist_join_strings(names, " ", 0, NULL); tor_asprintf(&msg, "650 NEWDESC %s\r\n", ids); - send_control_event_string(EVENT_NEW_DESC, msg); + send_control_event_string(EVENT_NEW_DESC, ALL_FORMATS, msg); tor_free(ids); tor_free(msg); SMARTLIST_FOREACH(names, char *, cp, tor_free(cp)); @@ -6298,7 +4257,7 @@ control_event_address_mapped(const char *from, const char *to, time_t expires, return 0; if (expires < 3 || expires == TIME_MAX) - send_control_event(EVENT_ADDRMAP, + send_control_event(EVENT_ADDRMAP, ALL_FORMATS, "650 ADDRMAP %s %s NEVER %s%s" "CACHED=\"%s\"\r\n", from, to, error?error:"", error?" ":"", @@ -6308,7 +4267,7 @@ control_event_address_mapped(const char *from, const char *to, time_t expires, char buf2[ISO_TIME_LEN+1]; format_local_iso_time(buf,expires); format_iso_time(buf2,expires); - send_control_event(EVENT_ADDRMAP, + send_control_event(EVENT_ADDRMAP, ALL_FORMATS, "650 ADDRMAP %s %s \"%s\"" " %s%sEXPIRES=\"%s\" CACHED=\"%s\"\r\n", from, to, buf, @@ -6319,48 +4278,43 @@ control_event_address_mapped(const char *from, const char *to, time_t expires, return 0; } -/** Cached liveness for network liveness events and GETINFO - */ - -static int network_is_live = 0; - -static int -get_cached_network_liveness(void) +/** The authoritative dirserver has received a new descriptor that + * has passed basic syntax checks and is properly self-signed. + * + * Notify any interested party of the new descriptor and what has + * been done with it, and also optionally give an explanation/reason. */ +int +control_event_or_authdir_new_descriptor(const char *action, + const char *desc, size_t desclen, + const char *msg) { - return network_is_live; -} + char firstline[1024]; + char *buf; + size_t totallen; + char *esc = NULL; + size_t esclen; -static void -set_cached_network_liveness(int liveness) -{ - network_is_live = liveness; -} + if (!EVENT_IS_INTERESTING(EVENT_AUTHDIR_NEWDESCS)) + return 0; -/** The network liveness has changed; this is called from circuitstats.c - * whenever we receive a cell, or when timeout expires and we assume the - * network is down. */ -int -control_event_network_liveness_update(int liveness) -{ - if (liveness > 0) { - if (get_cached_network_liveness() <= 0) { - /* Update cached liveness */ - set_cached_network_liveness(1); - log_debug(LD_CONTROL, "Sending NETWORK_LIVENESS UP"); - send_control_event_string(EVENT_NETWORK_LIVENESS, - "650 NETWORK_LIVENESS UP\r\n"); - } - /* else was already live, no-op */ - } else { - if (get_cached_network_liveness() > 0) { - /* Update cached liveness */ - set_cached_network_liveness(0); - log_debug(LD_CONTROL, "Sending NETWORK_LIVENESS DOWN"); - send_control_event_string(EVENT_NETWORK_LIVENESS, - "650 NETWORK_LIVENESS DOWN\r\n"); - } - /* else was already dead, no-op */ - } + tor_snprintf(firstline, sizeof(firstline), + "650+AUTHDIR_NEWDESC=\r\n%s\r\n%s\r\n", + action, + msg ? msg : ""); + + /* Escape the server descriptor properly */ + esclen = write_escaped_data(desc, desclen, &esc); + + totallen = strlen(firstline) + esclen + 1; + buf = tor_malloc(totallen); + strlcpy(buf, firstline, totallen); + strlcpy(buf+strlen(firstline), esc, totallen); + send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, + buf); + send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, + "650 OK\r\n"); + tor_free(esc); + tor_free(buf); return 0; } @@ -6380,9 +4334,9 @@ control_event_networkstatus_changed_helper(smartlist_t *statuses, return 0; strs = smartlist_new(); - smartlist_add_strdup(strs, "650+"); - smartlist_add_strdup(strs, event_string); - smartlist_add_strdup(strs, "\r\n"); + smartlist_add(strs, tor_strdup("650+")); + smartlist_add(strs, tor_strdup(event_string)); + smartlist_add(strs, tor_strdup("\r\n")); SMARTLIST_FOREACH(statuses, const routerstatus_t *, rs, { s = networkstatus_getinfo_helper_single(rs); @@ -6395,8 +4349,8 @@ control_event_networkstatus_changed_helper(smartlist_t *statuses, SMARTLIST_FOREACH(strs, char *, cp, tor_free(cp)); smartlist_free(strs); tor_free(s); - send_control_event_string(event, esc); - send_control_event_string(event, + send_control_event_string(event, ALL_FORMATS, esc); + send_control_event_string(event, ALL_FORMATS, "650 OK\r\n"); tor_free(esc); @@ -6453,7 +4407,7 @@ control_event_buildtimeout_set(buildtimeout_set_event_t type, break; } - send_control_event(EVENT_BUILDTIMEOUT_SET, + send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS, "650 BUILDTIMEOUT_SET %s %s\r\n", type_string, args); @@ -6462,14 +4416,14 @@ control_event_buildtimeout_set(buildtimeout_set_event_t type, /** Called when a signal has been processed from signal_callback */ int -control_event_signal(uintptr_t signal_num) +control_event_signal(uintptr_t signal) { const char *signal_string = NULL; - if (!control_event_is_interesting(EVENT_GOT_SIGNAL)) + if (!control_event_is_interesting(EVENT_SIGNAL)) return 0; - switch (signal_num) { + switch (signal) { case SIGHUP: signal_string = "RELOAD"; break; @@ -6485,16 +4439,13 @@ control_event_signal(uintptr_t signal_num) case SIGCLEARDNSCACHE: signal_string = "CLEARDNSCACHE"; break; - case SIGHEARTBEAT: - signal_string = "HEARTBEAT"; - break; default: log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal", - (unsigned long)signal_num); + (unsigned long)signal); return -1; } - send_control_event(EVENT_GOT_SIGNAL, "650 SIGNAL %s\r\n", + send_control_event(EVENT_SIGNAL, ALL_FORMATS, "650 SIGNAL %s\r\n", signal_string); return 0; } @@ -6522,7 +4473,7 @@ control_event_networkstatus_changed_single(const routerstatus_t *rs) int control_event_my_descriptor_changed(void) { - send_control_event(EVENT_DESCCHANGED, "650 DESCCHANGED\r\n"); + send_control_event(EVENT_DESCCHANGED, ALL_FORMATS, "650 DESCCHANGED\r\n"); return 0; } @@ -6572,40 +4523,24 @@ control_event_status(int type, int severity, const char *format, va_list args) } tor_vasprintf(&user_buf, format, args); - send_control_event(type, "%s %s\r\n", format_buf, user_buf); + send_control_event(type, ALL_FORMATS, "%s %s\r\n", format_buf, user_buf); tor_free(user_buf); return 0; } -#define CONTROL_EVENT_STATUS_BODY(event, sev) \ - int r; \ - do { \ - va_list ap; \ - if (!EVENT_IS_INTERESTING(event)) \ - return 0; \ - \ - va_start(ap, format); \ - r = control_event_status((event), (sev), format, ap); \ - va_end(ap); \ - } while (0) - /** Format and send an EVENT_STATUS_GENERAL event whose main text is obtained * by formatting the arguments using the printf-style format. */ int control_event_general_status(int severity, const char *format, ...) { - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_GENERAL, severity); - return r; -} + va_list ap; + int r; + if (!EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL)) + return 0; -/** Format and send an EVENT_STATUS_GENERAL LOG_ERR event, and flush it to the - * controller(s) immediately. */ -int -control_event_general_error(const char *format, ...) -{ - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_GENERAL, LOG_ERR); - /* Force a flush, since we may be about to die horribly */ - queued_events_flush_all(1); + va_start(ap, format); + r = control_event_status(EVENT_STATUS_GENERAL, severity, format, ap); + va_end(ap); return r; } @@ -6614,18 +4549,14 @@ control_event_general_error(const char *format, ...) int control_event_client_status(int severity, const char *format, ...) { - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_CLIENT, severity); - return r; -} + va_list ap; + int r; + if (!EVENT_IS_INTERESTING(EVENT_STATUS_CLIENT)) + return 0; -/** Format and send an EVENT_STATUS_CLIENT LOG_ERR event, and flush it to the - * controller(s) immediately. */ -int -control_event_client_error(const char *format, ...) -{ - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_CLIENT, LOG_ERR); - /* Force a flush, since we may be about to die horribly */ - queued_events_flush_all(1); + va_start(ap, format); + r = control_event_status(EVENT_STATUS_CLIENT, severity, format, ap); + va_end(ap); return r; } @@ -6634,18 +4565,14 @@ control_event_client_error(const char *format, ...) int control_event_server_status(int severity, const char *format, ...) { - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_SERVER, severity); - return r; -} + va_list ap; + int r; + if (!EVENT_IS_INTERESTING(EVENT_STATUS_SERVER)) + return 0; -/** Format and send an EVENT_STATUS_SERVER LOG_ERR event, and flush it to the - * controller(s) immediately. */ -int -control_event_server_error(const char *format, ...) -{ - CONTROL_EVENT_STATUS_BODY(EVENT_STATUS_SERVER, LOG_ERR); - /* Force a flush, since we may be about to die horribly */ - queued_events_flush_all(1); + va_start(ap, format); + r = control_event_status(EVENT_STATUS_SERVER, severity, format, ap); + va_end(ap); return r; } @@ -6669,7 +4596,7 @@ control_event_guard(const char *nickname, const char *digest, } else { tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname); } - send_control_event(EVENT_GUARD, + send_control_event(EVENT_GUARD, ALL_FORMATS, "650 GUARD ENTRY %s %s\r\n", buf, status); } return 0; @@ -6700,7 +4627,7 @@ control_event_conf_changed(const smartlist_t *elements) } } result = smartlist_join_strings(lines, "\r\n", 0, NULL); - send_control_event(EVENT_CONF_CHANGED, + send_control_event(EVENT_CONF_CHANGED, 0, "650-CONF_CHANGED\r\n%s\r\n650 OK\r\n", result); tor_free(result); SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); @@ -6710,8 +4637,8 @@ control_event_conf_changed(const smartlist_t *elements) /** Helper: Return a newly allocated string containing a path to the * file where we store our authentication cookie. */ -char * -get_controller_cookie_file_name(void) +static char * +get_cookie_file(void) { const or_options_t *options = get_options(); if (options->CookieAuthFile && strlen(options->CookieAuthFile)) { @@ -6735,10 +4662,9 @@ init_control_cookie_authentication(int enabled) return 0; } - fname = get_controller_cookie_file_name(); + fname = get_cookie_file(); retval = init_cookie_authentication(fname, "", /* no header */ AUTHENTICATION_COOKIE_LEN, - get_options()->CookieAuthFileGroupReadable, &authentication_cookie, &authentication_cookie_is_set); tor_free(fname); @@ -6809,7 +4735,8 @@ monitor_owning_controller_process(const char *process_spec) "owning controller: %s. Exiting.", msg); owning_controller_process_spec = NULL; - tor_shutdown_event_loop_and_exit(1); + tor_cleanup(); + exit(0); } } @@ -6858,43 +4785,23 @@ bootstrap_status_to_string(bootstrap_status_t s, const char **tag, break; case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS: *tag = "requesting_descriptors"; - /* XXXX this appears to incorrectly report internal on most loads */ - *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? - "Asking for relay descriptors for internal paths" : - "Asking for relay descriptors"; + *summary = "Asking for relay descriptors"; break; - /* If we're sure there are no exits in the consensus, - * inform the controller by adding "internal" - * to the status summaries. - * (We only check this while loading descriptors, - * so we may not know in the earlier stages.) - * But if there are exits, we can't be sure whether - * we're creating internal or exit paths/circuits. - * XXXX Or should be use different tags or statuses - * for internal and exit/all? */ case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS: *tag = "loading_descriptors"; - *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? - "Loading relay descriptors for internal paths" : - "Loading relay descriptors"; + *summary = "Loading relay descriptors"; break; case BOOTSTRAP_STATUS_CONN_OR: *tag = "conn_or"; - *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? - "Connecting to the Tor network internally" : - "Connecting to the Tor network"; + *summary = "Connecting to the Tor network"; break; case BOOTSTRAP_STATUS_HANDSHAKE_OR: *tag = "handshake_or"; - *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? - "Finishing handshake with first hop of internal circuit" : - "Finishing handshake with first hop"; + *summary = "Finishing handshake with first hop"; break; case BOOTSTRAP_STATUS_CIRCUIT_CREATE: *tag = "circuit_create"; - *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? - "Establishing an internal Tor circuit" : - "Establishing a Tor circuit"; + *summary = "Establishing a Tor circuit"; break; case BOOTSTRAP_STATUS_DONE: *tag = "done"; @@ -6915,51 +4822,36 @@ bootstrap_status_to_string(bootstrap_status_t s, const char **tag, * Tor initializes. */ static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF; -/** As bootstrap_percent, but holds the bootstrapping level at which we last - * logged a NOTICE-level message. We use this, plus BOOTSTRAP_PCT_INCREMENT, - * to avoid flooding the log with a new message every time we get a few more - * microdescriptors */ -static int notice_bootstrap_percent = 0; - /** How many problems have we had getting to the next bootstrapping phase? * These include failure to establish a connection to a Tor relay, * failures to finish the TLS handshake, failures to validate the * consensus document, etc. */ static int bootstrap_problems = 0; -/** We only tell the controller once we've hit a threshold of problems +/* We only tell the controller once we've hit a threshold of problems * for the current phase. */ #define BOOTSTRAP_PROBLEM_THRESHOLD 10 -/** When our bootstrapping progress level changes, but our bootstrapping - * status has not advanced, we only log at NOTICE when we have made at least - * this much progress. - */ -#define BOOTSTRAP_PCT_INCREMENT 5 - /** Called when Tor has made progress at bootstrapping its directory * information and initial circuits. * * status is the new status, that is, what task we will be doing * next. progress is zero if we just started this task, else it - * represents progress on the task. - * - * Return true if we logged a message at level NOTICE, and false otherwise. - */ -int + * represents progress on the task. */ +void control_event_bootstrap(bootstrap_status_t status, int progress) { const char *tag, *summary; char buf[BOOTSTRAP_MSG_LEN]; if (bootstrap_percent == BOOTSTRAP_STATUS_DONE) - return 0; /* already bootstrapped; nothing to be done here. */ + return; /* already bootstrapped; nothing to be done here. */ /* special case for handshaking status, since our TLS handshaking code * can't distinguish what the connection is going to be for. */ if (status == BOOTSTRAP_STATUS_HANDSHAKE) { if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) { - status = BOOTSTRAP_STATUS_HANDSHAKE_DIR; + status = BOOTSTRAP_STATUS_HANDSHAKE_DIR; } else { status = BOOTSTRAP_STATUS_HANDSHAKE_OR; } @@ -6967,19 +4859,9 @@ control_event_bootstrap(bootstrap_status_t status, int progress) if (status > bootstrap_percent || (progress && progress > bootstrap_percent)) { - int loglevel = LOG_NOTICE; bootstrap_status_to_string(status, &tag, &summary); - - if (status <= bootstrap_percent && - (progress < notice_bootstrap_percent + BOOTSTRAP_PCT_INCREMENT)) { - /* We log the message at info if the status hasn't advanced, and if less - * than BOOTSTRAP_PCT_INCREMENT progress has been made. - */ - loglevel = LOG_INFO; - } - - tor_log(loglevel, LD_CONTROL, - "Bootstrapped %d%%: %s", progress ? progress : status, summary); + tor_log(status ? LOG_NOTICE : LOG_INFO, LD_CONTROL, + "Bootstrapped %d%%: %s.", progress ? progress : status, summary); tor_snprintf(buf, sizeof(buf), "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\"", progress ? progress : status, tag, summary); @@ -6995,34 +4877,21 @@ control_event_bootstrap(bootstrap_status_t status, int progress) bootstrap_percent = progress; bootstrap_problems = 0; /* Progress! Reset our problem counter. */ } - if (loglevel == LOG_NOTICE && - bootstrap_percent > notice_bootstrap_percent) { - /* Remember that we gave a notice at this level. */ - notice_bootstrap_percent = bootstrap_percent; - } - return loglevel == LOG_NOTICE; } - - return 0; } /** Called when Tor has failed to make bootstrapping progress in a way - * that indicates a problem. warn gives a human-readable hint - * as to why, and reason provides a controller-facing short - * tag. conn is the connection that caused this problem and - * can be NULL if a connection cannot be easily identified. + * that indicates a problem. warn gives a hint as to why, and + * reason provides an "or_conn_end_reason" tag. */ -void -control_event_bootstrap_problem(const char *warn, const char *reason, - const connection_t *conn, int dowarn) +MOCK_IMPL(void, +control_event_bootstrap_problem, (const char *warn, int reason)) { int status = bootstrap_percent; - const char *tag = "", *summary = ""; + const char *tag, *summary; char buf[BOOTSTRAP_MSG_LEN]; const char *recommendation = "ignore"; int severity; - char *or_id = NULL, *hostaddr = NULL; - or_connection_t *or_conn = NULL; /* bootstrap_percent must not be in "undefined" state here. */ tor_assert(status >= 0); @@ -7033,86 +4902,44 @@ control_event_bootstrap_problem(const char *warn, const char *reason, bootstrap_problems++; if (bootstrap_problems >= BOOTSTRAP_PROBLEM_THRESHOLD) - dowarn = 1; + recommendation = "warn"; + + if (reason == END_OR_CONN_REASON_NO_ROUTE) + recommendation = "warn"; + + if (get_options()->UseBridges && + !any_bridge_descriptors_known() && + !any_pending_bridge_descriptor_fetches()) + recommendation = "warn"; if (we_are_hibernating()) - dowarn = 0; + recommendation = "ignore"; while (status>=0 && bootstrap_status_to_string(status, &tag, &summary) < 0) status--; /* find a recognized status string based on current progress */ status = bootstrap_percent; /* set status back to the actual number */ - severity = dowarn ? LOG_WARN : LOG_INFO; - - if (dowarn) - recommendation = "warn"; - - if (conn && conn->type == CONN_TYPE_OR) { - /* XXX TO_OR_CONN can't deal with const */ - or_conn = TO_OR_CONN((connection_t *)conn); - or_id = tor_strdup(hex_str(or_conn->identity_digest, DIGEST_LEN)); - } else { - or_id = tor_strdup("?"); - } - - if (conn) - tor_asprintf(&hostaddr, "%s:%d", conn->address, (int)conn->port); - else - hostaddr = tor_strdup("?"); + severity = !strcmp(recommendation, "warn") ? LOG_WARN : LOG_INFO; log_fn(severity, LD_CONTROL, "Problem bootstrapping. Stuck at %d%%: %s. (%s; %s; " - "count %d; recommendation %s; host %s at %s)", - status, summary, warn, reason, - bootstrap_problems, recommendation, - or_id, hostaddr); + "count %d; recommendation %s)", + status, summary, warn, + orconn_end_reason_to_control_string(reason), + bootstrap_problems, recommendation); connection_or_report_broken_states(severity, LD_HANDSHAKE); tor_snprintf(buf, sizeof(buf), "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\" WARNING=\"%s\" REASON=%s " - "COUNT=%d RECOMMENDATION=%s HOSTID=\"%s\" HOSTADDR=\"%s\"", - bootstrap_percent, tag, summary, warn, reason, bootstrap_problems, - recommendation, - or_id, hostaddr); - + "COUNT=%d RECOMMENDATION=%s", + bootstrap_percent, tag, summary, warn, + orconn_end_reason_to_control_string(reason), bootstrap_problems, + recommendation); tor_snprintf(last_sent_bootstrap_message, sizeof(last_sent_bootstrap_message), "WARN %s", buf); control_event_client_status(LOG_WARN, "%s", buf); - - tor_free(hostaddr); - tor_free(or_id); -} - -/** Called when Tor has failed to make bootstrapping progress in a way - * that indicates a problem. warn gives a hint as to why, and - * reason provides an "or_conn_end_reason" tag. or_conn - * is the connection that caused this problem. - */ -MOCK_IMPL(void, -control_event_bootstrap_prob_or, (const char *warn, int reason, - or_connection_t *or_conn)) -{ - int dowarn = 0; - - if (or_conn->have_noted_bootstrap_problem) - return; - - or_conn->have_noted_bootstrap_problem = 1; - - if (reason == END_OR_CONN_REASON_NO_ROUTE) - dowarn = 1; - - /* If we are using bridges and all our OR connections are now - closed, it means that we totally failed to connect to our - bridges. Throw a warning. */ - if (get_options()->UseBridges && !any_other_active_or_conns(or_conn)) - dowarn = 1; - - control_event_bootstrap_problem(warn, - orconn_end_reason_to_control_string(reason), - TO_CONN(or_conn), dowarn); } /** We just generated a new summary of which countries we've seen clients @@ -7121,7 +4948,7 @@ control_event_bootstrap_prob_or, (const char *warn, int reason, void control_event_clients_seen(const char *controller_str) { - send_control_event(EVENT_CLIENTS_SEEN, + send_control_event(EVENT_CLIENTS_SEEN, 0, "650 CLIENTS_SEEN %s\r\n", controller_str); } @@ -7135,7 +4962,7 @@ void control_event_transport_launched(const char *mode, const char *transport_name, tor_addr_t *addr, uint16_t port) { - send_control_event(EVENT_TRANSPORT_LAUNCHED, + send_control_event(EVENT_TRANSPORT_LAUNCHED, ALL_FORMATS, "650 TRANSPORT_LAUNCHED %s %s %s %u\r\n", mode, transport_name, fmt_addr(addr), port); } @@ -7179,425 +5006,89 @@ node_describe_longname_by_id,(const char *id_digest)) return longname; } -/** Return either the onion address if the given pointer is a non empty - * string else the unknown string. */ -static const char * -rend_hsaddress_str_or_unknown(const char *onion_address) -{ - static const char *str_unknown = "UNKNOWN"; - const char *str_ret = str_unknown; - - /* No valid pointer, unknown it is. */ - if (!onion_address) { - goto end; - } - /* Empty onion address thus we don't know, unknown it is. */ - if (onion_address[0] == '\0') { - goto end; - } - /* All checks are good so return the given onion address. */ - str_ret = onion_address; - - end: - return str_ret; -} - /** send HS_DESC requested event. * * rend_query is used to fetch requested onion address and auth type. * hs_dir is the description of contacting hs directory. * desc_id_base32 is the ID of requested hs descriptor. - * hsdir_index is the HSDir fetch index value for v3, an hex string. */ void -control_event_hs_descriptor_requested(const char *onion_address, - rend_auth_type_t auth_type, +control_event_hs_descriptor_requested(const rend_data_t *rend_query, const char *id_digest, - const char *desc_id, - const char *hsdir_index) -{ - char *hsdir_index_field = NULL; - - if (BUG(!id_digest || !desc_id)) { - return; - } - - if (hsdir_index) { - tor_asprintf(&hsdir_index_field, " HSDIR_INDEX=%s", hsdir_index); - } - - send_control_event(EVENT_HS_DESC, - "650 HS_DESC REQUESTED %s %s %s %s%s\r\n", - rend_hsaddress_str_or_unknown(onion_address), - rend_auth_type_to_string(auth_type), - node_describe_longname_by_id(id_digest), - desc_id, - hsdir_index_field ? hsdir_index_field : ""); - tor_free(hsdir_index_field); -} - -/** For an HS descriptor query rend_data, using the - * onion_address and HSDir fingerprint hsdir_fp, find out - * which descriptor ID in the query is the right one. - * - * Return a pointer of the binary descriptor ID found in the query's object - * or NULL if not found. */ -static const char * -get_desc_id_from_query(const rend_data_t *rend_data, const char *hsdir_fp) -{ - int replica; - const char *desc_id = NULL; - const rend_data_v2_t *rend_data_v2 = TO_REND_DATA_V2(rend_data); - - /* Possible if the fetch was done using a descriptor ID. This means that - * the HSFETCH command was used. */ - if (!tor_digest_is_zero(rend_data_v2->desc_id_fetch)) { - desc_id = rend_data_v2->desc_id_fetch; - goto end; - } - - /* Without a directory fingerprint at this stage, we can't do much. */ - if (hsdir_fp == NULL) { - goto end; - } - - /* OK, we have an onion address so now let's find which descriptor ID - * is the one associated with the HSDir fingerprint. */ - for (replica = 0; replica < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; - replica++) { - const char *digest = rend_data_get_desc_id(rend_data, replica, NULL); - - SMARTLIST_FOREACH_BEGIN(rend_data->hsdirs_fp, char *, fingerprint) { - if (tor_memcmp(fingerprint, hsdir_fp, DIGEST_LEN) == 0) { - /* Found it! This descriptor ID is the right one. */ - desc_id = digest; - goto end; - } - } SMARTLIST_FOREACH_END(fingerprint); - } - - end: - return desc_id; -} - -/** send HS_DESC CREATED event when a local service generates a descriptor. - * - * onion_address is service address. - * desc_id is the descriptor ID. - * replica is the the descriptor replica number. If it is negative, it - * is ignored. - */ -void -control_event_hs_descriptor_created(const char *onion_address, - const char *desc_id, - int replica) + const char *desc_id_base32) { - char *replica_field = NULL; - - if (BUG(!onion_address || !desc_id)) { - return; - } - - if (replica >= 0) { - tor_asprintf(&replica_field, " REPLICA=%d", replica); - } - - send_control_event(EVENT_HS_DESC, - "650 HS_DESC CREATED %s UNKNOWN UNKNOWN %s%s\r\n", - onion_address, desc_id, - replica_field ? replica_field : ""); - tor_free(replica_field); -} - -/** send HS_DESC upload event. - * - * onion_address is service address. - * hs_dir is the description of contacting hs directory. - * desc_id is the ID of requested hs descriptor. - */ -void -control_event_hs_descriptor_upload(const char *onion_address, - const char *id_digest, - const char *desc_id, - const char *hsdir_index) -{ - char *hsdir_index_field = NULL; - - if (BUG(!onion_address || !id_digest || !desc_id)) { + if (!id_digest || !rend_query || !desc_id_base32) { + log_warn(LD_BUG, "Called with rend_query==%p, " + "id_digest==%p, desc_id_base32==%p", + rend_query, id_digest, desc_id_base32); return; } - if (hsdir_index) { - tor_asprintf(&hsdir_index_field, " HSDIR_INDEX=%s", hsdir_index); - } - - send_control_event(EVENT_HS_DESC, - "650 HS_DESC UPLOAD %s UNKNOWN %s %s%s\r\n", - onion_address, + send_control_event(EVENT_HS_DESC, ALL_FORMATS, + "650 HS_DESC REQUESTED %s %s %s %s\r\n", + rend_query->onion_address, + rend_auth_type_to_string(rend_query->auth_type), node_describe_longname_by_id(id_digest), - desc_id, - hsdir_index_field ? hsdir_index_field : ""); - tor_free(hsdir_index_field); -} - -/** send HS_DESC event after got response from hs directory. - * - * NOTE: this is an internal function used by following functions: - * control_event_hsv2_descriptor_received - * control_event_hsv2_descriptor_failed - * control_event_hsv3_descriptor_failed - * - * So do not call this function directly. - */ -static void -event_hs_descriptor_receive_end(const char *action, - const char *onion_address, - const char *desc_id, - rend_auth_type_t auth_type, - const char *hsdir_id_digest, - const char *reason) -{ - char *reason_field = NULL; - - if (BUG(!action || !onion_address)) { - return; - } - - if (reason) { - tor_asprintf(&reason_field, " REASON=%s", reason); - } - - send_control_event(EVENT_HS_DESC, - "650 HS_DESC %s %s %s %s%s%s\r\n", - action, - rend_hsaddress_str_or_unknown(onion_address), - rend_auth_type_to_string(auth_type), - hsdir_id_digest ? - node_describe_longname_by_id(hsdir_id_digest) : - "UNKNOWN", - desc_id ? desc_id : "", - reason_field ? reason_field : ""); - - tor_free(reason_field); + desc_id_base32); } /** send HS_DESC event after got response from hs directory. * * NOTE: this is an internal function used by following functions: - * control_event_hs_descriptor_uploaded - * control_event_hs_descriptor_upload_failed + * control_event_hs_descriptor_received + * control_event_hs_descriptor_failed * * So do not call this function directly. */ void -control_event_hs_descriptor_upload_end(const char *action, - const char *onion_address, - const char *id_digest, - const char *reason) +control_event_hs_descriptor_receive_end(const char *action, + const rend_data_t *rend_query, + const char *id_digest) { - char *reason_field = NULL; - - if (BUG(!action || !id_digest)) { + if (!action || !rend_query || !id_digest) { + log_warn(LD_BUG, "Called with action==%p, rend_query==%p, " + "id_digest==%p", action, rend_query, id_digest); return; } - if (reason) { - tor_asprintf(&reason_field, " REASON=%s", reason); - } - - send_control_event(EVENT_HS_DESC, - "650 HS_DESC %s %s UNKNOWN %s%s\r\n", + send_control_event(EVENT_HS_DESC, ALL_FORMATS, + "650 HS_DESC %s %s %s %s\r\n", action, - rend_hsaddress_str_or_unknown(onion_address), - node_describe_longname_by_id(id_digest), - reason_field ? reason_field : ""); - - tor_free(reason_field); + rend_query->onion_address, + rend_auth_type_to_string(rend_query->auth_type), + node_describe_longname_by_id(id_digest)); } /** send HS_DESC RECEIVED event * - * called when we successfully received a hidden service descriptor. + * called when a we successfully received a hidden service descriptor. */ void -control_event_hsv2_descriptor_received(const char *onion_address, - const rend_data_t *rend_data, - const char *hsdir_id_digest) -{ - char *desc_id_field = NULL; - const char *desc_id; - - if (BUG(!rend_data || !hsdir_id_digest || !onion_address)) { - return; - } - - desc_id = get_desc_id_from_query(rend_data, hsdir_id_digest); - if (desc_id != NULL) { - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - /* Set the descriptor ID digest to base32 so we can send it. */ - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id, - DIGEST_LEN); - /* Extra whitespace is needed before the value. */ - tor_asprintf(&desc_id_field, " %s", desc_id_base32); - } - - event_hs_descriptor_receive_end("RECEIVED", onion_address, desc_id_field, - TO_REND_DATA_V2(rend_data)->auth_type, - hsdir_id_digest, NULL); - tor_free(desc_id_field); -} - -/* Send HS_DESC RECEIVED event - * - * Called when we successfully received a hidden service descriptor. */ -void -control_event_hsv3_descriptor_received(const char *onion_address, - const char *desc_id, - const char *hsdir_id_digest) +control_event_hs_descriptor_received(const rend_data_t *rend_query, + const char *id_digest) { - char *desc_id_field = NULL; - - if (BUG(!onion_address || !desc_id || !hsdir_id_digest)) { + if (!rend_query || !id_digest) { + log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p", + rend_query, id_digest); return; } - - /* Because DescriptorID is an optional positional value, we need to add a - * whitespace before in order to not be next to the HsDir value. */ - tor_asprintf(&desc_id_field, " %s", desc_id); - - event_hs_descriptor_receive_end("RECEIVED", onion_address, desc_id_field, - REND_NO_AUTH, hsdir_id_digest, NULL); - tor_free(desc_id_field); + control_event_hs_descriptor_receive_end("RECEIVED", rend_query, id_digest); } -/** send HS_DESC UPLOADED event +/** send HS_DESC FAILED event * - * called when we successfully uploaded a hidden service descriptor. - */ -void -control_event_hs_descriptor_uploaded(const char *id_digest, - const char *onion_address) -{ - if (BUG(!id_digest)) { - return; - } - - control_event_hs_descriptor_upload_end("UPLOADED", onion_address, - id_digest, NULL); -} - -/** Send HS_DESC event to inform controller that query rend_data - * failed to retrieve hidden service descriptor from directory identified by - * id_digest. If NULL, "UNKNOWN" is used. If reason is not NULL, - * add it to REASON= field. - */ -void -control_event_hsv2_descriptor_failed(const rend_data_t *rend_data, - const char *hsdir_id_digest, - const char *reason) -{ - char *desc_id_field = NULL; - const char *desc_id; - - if (BUG(!rend_data)) { - return; - } - - desc_id = get_desc_id_from_query(rend_data, hsdir_id_digest); - if (desc_id != NULL) { - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - /* Set the descriptor ID digest to base32 so we can send it. */ - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id, - DIGEST_LEN); - /* Extra whitespace is needed before the value. */ - tor_asprintf(&desc_id_field, " %s", desc_id_base32); - } - - event_hs_descriptor_receive_end("FAILED", rend_data_get_address(rend_data), - desc_id_field, - TO_REND_DATA_V2(rend_data)->auth_type, - hsdir_id_digest, reason); - tor_free(desc_id_field); -} - -/** Send HS_DESC event to inform controller that the query to - * onion_address failed to retrieve hidden service descriptor - * desc_id from directory identified by hsdir_id_digest. If - * NULL, "UNKNOWN" is used. If reason is not NULL, add it to REASON= - * field. */ -void -control_event_hsv3_descriptor_failed(const char *onion_address, - const char *desc_id, - const char *hsdir_id_digest, - const char *reason) -{ - char *desc_id_field = NULL; - - if (BUG(!onion_address || !desc_id || !reason)) { - return; - } - - /* Because DescriptorID is an optional positional value, we need to add a - * whitespace before in order to not be next to the HsDir value. */ - tor_asprintf(&desc_id_field, " %s", desc_id); - - event_hs_descriptor_receive_end("FAILED", onion_address, desc_id_field, - REND_NO_AUTH, hsdir_id_digest, reason); - tor_free(desc_id_field); -} - -/** Send HS_DESC_CONTENT event after completion of a successful fetch from hs - * directory. If hsdir_id_digest is NULL, it is replaced by "UNKNOWN". - * If content is NULL, it is replaced by an empty string. The - * onion_address or desc_id set to NULL will no trigger the - * control event. */ -void -control_event_hs_descriptor_content(const char *onion_address, - const char *desc_id, - const char *hsdir_id_digest, - const char *content) -{ - static const char *event_name = "HS_DESC_CONTENT"; - char *esc_content = NULL; - - if (!onion_address || !desc_id) { - log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, ", - onion_address, desc_id); - return; - } - - if (content == NULL) { - /* Point it to empty content so it can still be escaped. */ - content = ""; - } - write_escaped_data(content, strlen(content), &esc_content); - - send_control_event(EVENT_HS_DESC_CONTENT, - "650+%s %s %s %s\r\n%s650 OK\r\n", - event_name, - rend_hsaddress_str_or_unknown(onion_address), - desc_id, - hsdir_id_digest ? - node_describe_longname_by_id(hsdir_id_digest) : - "UNKNOWN", - esc_content); - tor_free(esc_content); -} - -/** Send HS_DESC event to inform controller upload of hidden service - * descriptor identified by id_digest failed. If reason - * is not NULL, add it to REASON= field. + * called when request for hidden service descriptor returned failure. */ void -control_event_hs_descriptor_upload_failed(const char *id_digest, - const char *onion_address, - const char *reason) +control_event_hs_descriptor_failed(const rend_data_t *rend_query, + const char *id_digest) { - if (BUG(!id_digest)) { + if (!rend_query || !id_digest) { + log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p", + rend_query, id_digest); return; } - control_event_hs_descriptor_upload_end("FAILED", onion_address, - id_digest, reason); + control_event_hs_descriptor_receive_end("FAILED", rend_query, id_digest); } /** Free any leftover allocated memory of the control.c subsystem. */ @@ -7606,20 +5097,6 @@ control_free_all(void) { if (authentication_cookie) /* Free the auth cookie */ tor_free(authentication_cookie); - if (detached_onion_services) { /* Free the detached onion services */ - SMARTLIST_FOREACH(detached_onion_services, char *, cp, tor_free(cp)); - smartlist_free(detached_onion_services); - } - if (queued_control_events) { - SMARTLIST_FOREACH(queued_control_events, queued_event_t *, ev, - queued_event_free(ev)); - smartlist_free(queued_control_events); - queued_control_events = NULL; - } - if (flush_queued_events_event) { - tor_event_free(flush_queued_events_event); - flush_queued_events_event = NULL; - } } #ifdef TOR_UNIT_TESTS @@ -7629,5 +5106,5 @@ control_testing_set_global_event_mask(uint64_t mask) { global_event_mask = mask; } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif diff --git a/src/tor/src/or/control.h b/src/tor/control.h similarity index 51% rename from src/tor/src/or/control.h rename to src/tor/control.h index 28ffeaed8..0466de17f 100644 --- a/src/tor/src/or/control.h +++ b/src/tor/control.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,8 +12,6 @@ #ifndef TOR_CONTROL_H #define TOR_CONTROL_H -void control_initialize_event_queue(void); - void control_update_global_event_mask(void); void control_adjust_event_log_severity(void); @@ -27,16 +25,13 @@ void control_ports_write_to_file(void); #define LOG_FN_CONN(conn, args) \ CONN_LOG_PROTECT(conn, log_fn args) -#define CC_LOCAL_FD_IS_OWNER (1u<<0) -#define CC_LOCAL_FD_IS_AUTHENTICATED (1u<<1) -int control_connection_add_local_fd(tor_socket_t sock, unsigned flags); - int connection_control_finished_flushing(control_connection_t *conn); int connection_control_reached_eof(control_connection_t *conn); void connection_control_closed(control_connection_t *conn); int connection_control_process_inbuf(control_connection_t *conn); +#define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_NS 0x000F int control_event_is_interesting(int event); @@ -67,8 +62,11 @@ int control_event_descriptors_changed(smartlist_t *routers); int control_event_address_mapped(const char *from, const char *to, time_t expires, const char *error, const int cached); +int control_event_or_authdir_new_descriptor(const char *action, + const char *desc, + size_t desclen, + const char *msg); int control_event_my_descriptor_changed(void); -int control_event_network_liveness_update(int liveness); int control_event_networkstatus_changed(smartlist_t *statuses); int control_event_newconsensus(const networkstatus_t *consensus); @@ -79,14 +77,6 @@ int control_event_client_status(int severity, const char *format, ...) CHECK_PRINTF(2,3); int control_event_server_status(int severity, const char *format, ...) CHECK_PRINTF(2,3); - -int control_event_general_error(const char *format, ...) - CHECK_PRINTF(1,2); -int control_event_client_error(const char *format, ...) - CHECK_PRINTF(1,2); -int control_event_server_error(const char *format, ...) - CHECK_PRINTF(1,2); - int control_event_guard(const char *nickname, const char *digest, const char *status); int control_event_conf_changed(const smartlist_t *elements); @@ -95,19 +85,15 @@ int control_event_buildtimeout_set(buildtimeout_set_event_t type, int control_event_signal(uintptr_t signal); int init_control_cookie_authentication(int enabled); -char *get_controller_cookie_file_name(void); smartlist_t *decode_hashed_passwords(config_line_t *passwords); void disable_control_logging(void); void enable_control_logging(void); void monitor_owning_controller_process(const char *process_spec); -int control_event_bootstrap(bootstrap_status_t status, int progress); -MOCK_DECL(void, control_event_bootstrap_prob_or,(const char *warn, - int reason, - or_connection_t *or_conn)); -void control_event_bootstrap_problem(const char *warn, const char *reason, - const connection_t *conn, int dowarn); +void control_event_bootstrap(bootstrap_status_t status, int progress); +MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn, + int reason)); void control_event_clients_seen(const char *controller_str); void control_event_transport_launched(const char *mode, @@ -115,46 +101,16 @@ void control_event_transport_launched(const char *mode, tor_addr_t *addr, uint16_t port); const char *rend_auth_type_to_string(rend_auth_type_t auth_type); MOCK_DECL(const char *, node_describe_longname_by_id,(const char *id_digest)); -void control_event_hs_descriptor_requested(const char *onion_address, - rend_auth_type_t auth_type, - const char *id_digest, - const char *desc_id, - const char *hsdir_index); -void control_event_hs_descriptor_created(const char *onion_address, - const char *desc_id, - int replica); -void control_event_hs_descriptor_upload(const char *onion_address, - const char *desc_id, - const char *hs_dir, - const char *hsdir_index); -void control_event_hs_descriptor_upload_end(const char *action, - const char *onion_address, - const char *hs_dir, - const char *reason); -void control_event_hs_descriptor_uploaded(const char *hs_dir, - const char *onion_address); -/* Hidden service v2 HS_DESC specific. */ -void control_event_hsv2_descriptor_failed(const rend_data_t *rend_data, - const char *id_digest, - const char *reason); -void control_event_hsv2_descriptor_received(const char *onion_address, - const rend_data_t *rend_data, - const char *id_digest); -/* Hidden service v3 HS_DESC specific. */ -void control_event_hsv3_descriptor_failed(const char *onion_address, - const char *desc_id, - const char *hsdir_id_digest, - const char *reason); -void control_event_hsv3_descriptor_received(const char *onion_address, - const char *desc_id, - const char *hsdir_id_digest); -void control_event_hs_descriptor_upload_failed(const char *hs_dir, - const char *onion_address, - const char *reason); -void control_event_hs_descriptor_content(const char *onion_address, - const char *desc_id, - const char *hsdir_fp, - const char *content); +void control_event_hs_descriptor_requested(const rend_data_t *rend_query, + const char *desc_id_base32, + const char *hs_dir); +void control_event_hs_descriptor_receive_end(const char *action, + const rend_data_t *rend_query, + const char *hs_dir); +void control_event_hs_descriptor_received(const rend_data_t *rend_query, + const char *hs_dir); +void control_event_hs_descriptor_failed(const rend_data_t *rend_query, + const char *hs_dir); void control_free_all(void); @@ -163,7 +119,6 @@ void control_free_all(void); * because it is used both as a list of v0 event types, and as indices * into the bitfield to determine which controllers want which events. */ -/* This bitfield has no event zero 0x0000 */ #define EVENT_MIN_ 0x0001 #define EVENT_CIRCUIT_STATUS 0x0001 #define EVENT_STREAM_STATUS 0x0002 @@ -177,8 +132,8 @@ void control_free_all(void); #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C -/* There was an AUTHDIR_NEWDESCS event, but it no longer exists. We - can reclaim 0x000D. */ +/* Exposed above */ +// #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E /* Exposed above */ // #define EVENT_NS 0x000F @@ -190,7 +145,7 @@ void control_free_all(void); #define EVENT_CLIENTS_SEEN 0x0015 #define EVENT_NEWCONSENSUS 0x0016 #define EVENT_BUILDTIMEOUT_SET 0x0017 -#define EVENT_GOT_SIGNAL 0x0018 +#define EVENT_SIGNAL 0x0018 #define EVENT_CONF_CHANGED 0x0019 #define EVENT_CONN_BW 0x001A #define EVENT_CELL_STATS 0x001B @@ -198,45 +153,28 @@ void control_free_all(void); #define EVENT_CIRC_BANDWIDTH_USED 0x001D #define EVENT_TRANSPORT_LAUNCHED 0x0020 #define EVENT_HS_DESC 0x0021 -#define EVENT_HS_DESC_CONTENT 0x0022 -#define EVENT_NETWORK_LIVENESS 0x0023 -#define EVENT_MAX_ 0x0023 - -/* sizeof(control_connection_t.event_mask) in bits, currently a uint64_t */ -#define EVENT_CAPACITY_ 0x0040 - +#define EVENT_MAX_ 0x0021 /* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a - * different structure, as it can only handle a maximum left shift of 1<<63. */ - -#if EVENT_MAX_ >= EVENT_CAPACITY_ -#error control_connection_t.event_mask has an event greater than its capacity -#endif - -#define EVENT_MASK_(e) (((uint64_t)1)<<(e)) - -#define EVENT_MASK_NONE_ ((uint64_t)0x0) - -#define EVENT_MASK_ABOVE_MIN_ ((~((uint64_t)0x0)) << EVENT_MIN_) -#define EVENT_MASK_BELOW_MAX_ ((~((uint64_t)0x0)) \ - >> (EVENT_CAPACITY_ - EVENT_MAX_ \ - - EVENT_MIN_)) - -#define EVENT_MASK_ALL_ (EVENT_MASK_ABOVE_MIN_ \ - & EVENT_MASK_BELOW_MAX_) + * different structure. */ /* Used only by control.c and test.c */ STATIC size_t write_escaped_data(const char *data, size_t len, char **out); STATIC size_t read_escaped_data(const char *data, size_t len, char **out); +/** Flag for event_format_t. Indicates that we should use the one standard + format. (Other formats previous existed, and are now deprecated) + */ +#define ALL_FORMATS 1 +/** Bit field of flags to select how to format a controller event. Recognized + * flag is ALL_FORMATS. */ +typedef int event_format_t; #ifdef TOR_UNIT_TESTS MOCK_DECL(STATIC void, - send_control_event_string,(uint16_t event, const char *msg)); - -MOCK_DECL(STATIC void, - queue_control_event_string,(uint16_t event, char *msg)); +send_control_event_string,(uint16_t event, event_format_t which, + const char *msg)); void control_testing_set_global_event_mask(uint64_t mask); -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /** Helper structure: temporarily stores cell statistics for a circuit. */ typedef struct cell_stats_t { @@ -261,61 +199,7 @@ void append_cell_stats_by_command(smartlist_t *event_parts, const uint64_t *number_to_include); void format_cell_stats(char **event_string, circuit_t *circ, cell_stats_t *cell_stats); -STATIC char *get_bw_samples(void); - -/* ADD_ONION secret key to create an ephemeral service. The command supports - * multiple versions so this union stores the key and passes it to the HS - * subsystem depending on the requested version. */ -typedef union add_onion_secret_key_t { - /* Hidden service v2 secret key. */ - crypto_pk_t *v2; - /* Hidden service v3 secret key. */ - ed25519_secret_key_t *v3; -} add_onion_secret_key_t; - -STATIC int add_onion_helper_keyarg(const char *arg, int discard_pk, - const char **key_new_alg_out, - char **key_new_blob_out, - add_onion_secret_key_t *decoded_key, - int *hs_version, char **err_msg_out); - -STATIC rend_authorized_client_t * -add_onion_helper_clientauth(const char *arg, int *created, char **err_msg_out); - -STATIC int getinfo_helper_onions( - control_connection_t *control_conn, - const char *question, - char **answer, - const char **errmsg); -STATIC void getinfo_helper_downloads_networkstatus( - const char *flavor, - download_status_t **dl_to_emit, - const char **errmsg); -STATIC void getinfo_helper_downloads_cert( - const char *fp_sk_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg); -STATIC void getinfo_helper_downloads_desc( - const char *desc_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg); -STATIC void getinfo_helper_downloads_bridge( - const char *bridge_req, - download_status_t **dl_to_emit, - smartlist_t **digest_list, - const char **errmsg); -STATIC int getinfo_helper_downloads( - control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg); -STATIC int getinfo_helper_dir( - control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg); - -#endif /* defined(CONTROL_PRIVATE) */ +#endif -#endif /* !defined(TOR_CONTROL_H) */ +#endif diff --git a/src/tor/cpuworker.c b/src/tor/cpuworker.c new file mode 100644 index 000000000..9611c3bdf --- /dev/null +++ b/src/tor/cpuworker.c @@ -0,0 +1,718 @@ +/* Copyright (c) 2003-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file cpuworker.c + * \brief Implements a farm of 'CPU worker' processes to perform + * CPU-intensive tasks in another thread or process, to not + * interrupt the main thread. + * + * Right now, we only use this for processing onionskins. + **/ +#include "or.h" +#include "buffers.h" +#include "channel.h" +#include "channeltls.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "config.h" +#include "connection.h" +#include "connection_or.h" +#include "cpuworker.h" +#include "onion_main.h" +#include "onion.h" +#include "rephist.h" +#include "router.h" + +/** The maximum number of cpuworker processes we will keep around. */ +#define MAX_CPUWORKERS 16 +/** The minimum number of cpuworker processes we will keep around. */ +#define MIN_CPUWORKERS 1 + +/** The tag specifies which circuit this onionskin was from. */ +#define TAG_LEN 12 + +/** How many cpuworkers we have running right now. */ +static int num_cpuworkers=0; +/** How many of the running cpuworkers have an assigned task right now. */ +static int num_cpuworkers_busy=0; +/** We need to spawn new cpuworkers whenever we rotate the onion keys + * on platforms where execution contexts==processes. This variable stores + * the last time we got a key rotation event. */ +static time_t last_rotation_time=0; + +static void cpuworker_main(void *data) ATTR_NORETURN; +static int spawn_cpuworker(void); +static void spawn_enough_cpuworkers(void); +static void process_pending_task(connection_t *cpuworker); + +/** Initialize the cpuworker subsystem. + */ +void +cpu_init(void) +{ + cpuworkers_rotate(); +} + +/** Called when we're done sending a request to a cpuworker. */ +int +connection_cpu_finished_flushing(connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->type == CONN_TYPE_CPUWORKER); + return 0; +} + +/** Pack global_id and circ_id; set *tag to the result. (See note on + * cpuworker_main for wire format.) */ +static void +tag_pack(uint8_t *tag, uint64_t chan_id, circid_t circ_id) +{ + /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/ + /*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/ + set_uint64(tag, chan_id); + set_uint32(tag+8, circ_id); +} + +/** Unpack tag into addr, port, and circ_id. + */ +static void +tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id) +{ + *chan_id = get_uint64(tag); + *circ_id = get_uint32(tag+8); +} + +/** Magic numbers to make sure our cpuworker_requests don't grow any + * mis-framing bugs. */ +#define CPUWORKER_REQUEST_MAGIC 0xda4afeed +#define CPUWORKER_REPLY_MAGIC 0x5eedf00d + +/** A request sent to a cpuworker. */ +typedef struct cpuworker_request_t { + /** Magic number; must be CPUWORKER_REQUEST_MAGIC. */ + uint32_t magic; + /** Opaque tag to identify the job */ + uint8_t tag[TAG_LEN]; + /** Task code. Must be one of CPUWORKER_TASK_* */ + uint8_t task; + + /** Flag: Are we timing this request? */ + unsigned timed : 1; + /** If we're timing this request, when was it sent to the cpuworker? */ + struct timeval started_at; + + /** A create cell for the cpuworker to process. */ + create_cell_t create_cell; + + /* Turn the above into a tagged union if needed. */ +} cpuworker_request_t; + +/** A reply sent by a cpuworker. */ +typedef struct cpuworker_reply_t { + /** Magic number; must be CPUWORKER_REPLY_MAGIC. */ + uint32_t magic; + /** Opaque tag to identify the job; matches the request's tag.*/ + uint8_t tag[TAG_LEN]; + /** True iff we got a successful request. */ + uint8_t success; + + /** Are we timing this request? */ + unsigned int timed : 1; + /** What handshake type was the request? (Used for timing) */ + uint16_t handshake_type; + /** When did we send the request to the cpuworker? */ + struct timeval started_at; + /** Once the cpuworker received the request, how many microseconds did it + * take? (This shouldn't overflow; 4 billion micoseconds is over an hour, + * and we'll never have an onion handshake that takes so long.) */ + uint32_t n_usec; + + /** Output of processing a create cell + * + * @{ + */ + /** The created cell to send back. */ + created_cell_t created_cell; + /** The keys to use on this circuit. */ + uint8_t keys[CPATH_KEY_MATERIAL_LEN]; + /** Input to use for authenticating introduce1 cells. */ + uint8_t rend_auth_material[DIGEST_LEN]; +} cpuworker_reply_t; + +/** Called when the onion key has changed and we need to spawn new + * cpuworkers. Close all currently idle cpuworkers, and mark the last + * rotation time as now. + */ +void +cpuworkers_rotate(void) +{ + connection_t *cpuworker; + while ((cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, + CPUWORKER_STATE_IDLE))) { + connection_mark_for_close(cpuworker); + --num_cpuworkers; + } + last_rotation_time = time(NULL); + if (server_mode(get_options())) + spawn_enough_cpuworkers(); +} + +/** If the cpuworker closes the connection, + * mark it as closed and spawn a new one as needed. */ +int +connection_cpu_reached_eof(connection_t *conn) +{ + log_warn(LD_GENERAL,"Read eof. CPU worker died unexpectedly."); + if (conn->state != CPUWORKER_STATE_IDLE) { + /* the circ associated with this cpuworker will have to wait until + * it gets culled in run_connection_housekeeping(), since we have + * no way to find out which circ it was. */ + log_warn(LD_GENERAL,"...and it left a circuit queued; abandoning circ."); + num_cpuworkers_busy--; + } + num_cpuworkers--; + spawn_enough_cpuworkers(); /* try to regrow. hope we don't end up + spinning. */ + connection_mark_for_close(conn); + return 0; +} + +/** Indexed by handshake type: how many onionskins have we processed and + * counted of that type? */ +static uint64_t onionskins_n_processed[MAX_ONION_HANDSHAKE_TYPE+1]; +/** Indexed by handshake type, corresponding to the onionskins counted in + * onionskins_n_processed: how many microseconds have we spent in cpuworkers + * processing that kind of onionskin? */ +static uint64_t onionskins_usec_internal[MAX_ONION_HANDSHAKE_TYPE+1]; +/** Indexed by handshake type, corresponding to onionskins counted in + * onionskins_n_processed: how many microseconds have we spent waiting for + * cpuworkers to give us answers for that kind of onionskin? + */ +static uint64_t onionskins_usec_roundtrip[MAX_ONION_HANDSHAKE_TYPE+1]; + +/** If any onionskin takes longer than this, we clip them to this + * time. (microseconds) */ +#define MAX_BELIEVABLE_ONIONSKIN_DELAY (2*1000*1000) + +static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT; + +/** Return true iff we'd like to measure a handshake of type + * onionskin_type. Call only from the main thread. */ +static int +should_time_request(uint16_t onionskin_type) +{ + /* If we've never heard of this type, we shouldn't even be here. */ + if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) + return 0; + /* Measure the first N handshakes of each type, to ensure we have a + * sample */ + if (onionskins_n_processed[onionskin_type] < 4096) + return 1; + /** Otherwise, measure with P=1/128. We avoid doing this for every + * handshake, since the measurement itself can take a little time. */ + return tor_weak_random_one_in_n(&request_sample_rng, 128); +} + +/** Return an estimate of how many microseconds we will need for a single + * cpuworker to to process n_requests onionskins of type + * onionskin_type. */ +uint64_t +estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type) +{ + if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ + return 1000 * (uint64_t)n_requests; + if (PREDICT_UNLIKELY(onionskins_n_processed[onionskin_type] < 100)) { + /* Until we have 100 data points, just asssume everything takes 1 msec. */ + return 1000 * (uint64_t)n_requests; + } else { + /* This can't overflow: we'll never have more than 500000 onionskins + * measured in onionskin_usec_internal, and they won't take anything near + * 1 sec each, and we won't have anything like 1 million queued + * onionskins. But that's 5e5 * 1e6 * 1e6, which is still less than + * UINT64_MAX. */ + return (onionskins_usec_internal[onionskin_type] * n_requests) / + onionskins_n_processed[onionskin_type]; + } +} + +/** Compute the absolute and relative overhead of using the cpuworker + * framework for onionskins of type onionskin_type.*/ +static int +get_overhead_for_onionskins(uint32_t *usec_out, double *frac_out, + uint16_t onionskin_type) +{ + uint64_t overhead; + + *usec_out = 0; + *frac_out = 0.0; + + if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ + return -1; + if (onionskins_n_processed[onionskin_type] == 0 || + onionskins_usec_internal[onionskin_type] == 0 || + onionskins_usec_roundtrip[onionskin_type] == 0) + return -1; + + overhead = onionskins_usec_roundtrip[onionskin_type] - + onionskins_usec_internal[onionskin_type]; + + *usec_out = (uint32_t)(overhead / onionskins_n_processed[onionskin_type]); + *frac_out = U64_TO_DBL(overhead) / onionskins_usec_internal[onionskin_type]; + + return 0; +} + +/** If we've measured overhead for onionskins of type onionskin_type, + * log it. */ +void +cpuworker_log_onionskin_overhead(int severity, int onionskin_type, + const char *onionskin_type_name) +{ + uint32_t overhead; + double relative_overhead; + int r; + + r = get_overhead_for_onionskins(&overhead, &relative_overhead, + onionskin_type); + if (!overhead || r<0) + return; + + log_fn(severity, LD_OR, + "%s onionskins have averaged %u usec overhead (%.2f%%) in " + "cpuworker code ", + onionskin_type_name, (unsigned)overhead, relative_overhead*100); +} + +/** Called when we get data from a cpuworker. If the answer is not complete, + * wait for a complete answer. If the answer is complete, + * process it as appropriate. + */ +int +connection_cpu_process_inbuf(connection_t *conn) +{ + uint64_t chan_id; + circid_t circ_id; + channel_t *p_chan = NULL; + circuit_t *circ; + + tor_assert(conn); + tor_assert(conn->type == CONN_TYPE_CPUWORKER); + + if (!connection_get_inbuf_len(conn)) + return 0; + + if (conn->state == CPUWORKER_STATE_BUSY_ONION) { + cpuworker_reply_t rpl; + if (connection_get_inbuf_len(conn) < sizeof(cpuworker_reply_t)) + return 0; /* not yet */ + tor_assert(connection_get_inbuf_len(conn) == sizeof(cpuworker_reply_t)); + + connection_fetch_from_buf((void*)&rpl,sizeof(cpuworker_reply_t),conn); + + tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC); + + if (rpl.timed && rpl.success && + rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) { + /* Time how long this request took. The handshake_type check should be + needless, but let's leave it in to be safe. */ + struct timeval tv_end, tv_diff; + int64_t usec_roundtrip; + tor_gettimeofday(&tv_end); + timersub(&tv_end, &rpl.started_at, &tv_diff); + usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; + if (usec_roundtrip >= 0 && + usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) { + ++onionskins_n_processed[rpl.handshake_type]; + onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec; + onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip; + if (onionskins_n_processed[rpl.handshake_type] >= 500000) { + /* Scale down every 500000 handshakes. On a busy server, that's + * less impressive than it sounds. */ + onionskins_n_processed[rpl.handshake_type] /= 2; + onionskins_usec_internal[rpl.handshake_type] /= 2; + onionskins_usec_roundtrip[rpl.handshake_type] /= 2; + } + } + } + /* parse out the circ it was talking about */ + tag_unpack(rpl.tag, &chan_id, &circ_id); + circ = NULL; + log_debug(LD_OR, + "Unpacking cpuworker reply, chan_id is " U64_FORMAT + ", circ_id is %u", + U64_PRINTF_ARG(chan_id), (unsigned)circ_id); + p_chan = channel_find_by_global_id(chan_id); + + if (p_chan) + circ = circuit_get_by_circid_channel(circ_id, p_chan); + + if (rpl.success == 0) { + log_debug(LD_OR, + "decoding onionskin failed. " + "(Old key or bad software.) Closing."); + if (circ) + circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); + goto done_processing; + } + if (!circ) { + /* This happens because somebody sends us a destroy cell and the + * circuit goes away, while the cpuworker is working. This is also + * why our tag doesn't include a pointer to the circ, because we'd + * never know if it's still valid. + */ + log_debug(LD_OR,"processed onion for a circ that's gone. Dropping."); + goto done_processing; + } + tor_assert(! CIRCUIT_IS_ORIGIN(circ)); + if (onionskin_answer(TO_OR_CIRCUIT(circ), + &rpl.created_cell, + (const char*)rpl.keys, + rpl.rend_auth_material) < 0) { + log_warn(LD_OR,"onionskin_answer failed. Closing."); + circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL); + goto done_processing; + } + log_debug(LD_OR,"onionskin_answer succeeded. Yay."); + } else { + tor_assert(0); /* don't ask me to do handshakes yet */ + } + + done_processing: + conn->state = CPUWORKER_STATE_IDLE; + num_cpuworkers_busy--; + if (conn->timestamp_created < last_rotation_time) { + connection_mark_for_close(conn); + num_cpuworkers--; + spawn_enough_cpuworkers(); + } else { + process_pending_task(conn); + } + return 0; +} + +/** Implement a cpuworker. 'data' is an fdarray as returned by socketpair. + * Read and writes from fdarray[1]. Reads requests, writes answers. + * + * Request format: + * cpuworker_request_t. + * Response format: + * cpuworker_reply_t + */ +static void +cpuworker_main(void *data) +{ + /* For talking to the parent thread/process */ + tor_socket_t *fdarray = data; + tor_socket_t fd; + + /* variables for onion processing */ + server_onion_keys_t onion_keys; + cpuworker_request_t req; + cpuworker_reply_t rpl; + + fd = fdarray[1]; /* this side is ours */ +#ifndef TOR_IS_MULTITHREADED + tor_close_socket(fdarray[0]); /* this is the side of the socketpair the + * parent uses */ + tor_free_all(1); /* so the child doesn't hold the parent's fd's open */ + handle_signals(0); /* ignore interrupts from the keyboard, etc */ +#endif + tor_free(data); + + setup_server_onion_keys(&onion_keys); + + for (;;) { + if (read_all(fd, (void *)&req, sizeof(req), 1) != sizeof(req)) { + log_info(LD_OR, "read request failed. Exiting."); + goto end; + } + tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC); + + memset(&rpl, 0, sizeof(rpl)); + + if (req.task == CPUWORKER_TASK_ONION) { + const create_cell_t *cc = &req.create_cell; + created_cell_t *cell_out = &rpl.created_cell; + struct timeval tv_start, tv_end; + int n; + rpl.timed = req.timed; + rpl.started_at = req.started_at; + rpl.handshake_type = cc->handshake_type; + if (req.timed) + tor_gettimeofday(&tv_start); + n = onion_skin_server_handshake(cc->handshake_type, + cc->onionskin, cc->handshake_len, + &onion_keys, + cell_out->reply, + rpl.keys, CPATH_KEY_MATERIAL_LEN, + rpl.rend_auth_material); + if (n < 0) { + /* failure */ + log_debug(LD_OR,"onion_skin_server_handshake failed."); + memset(&rpl, 0, sizeof(rpl)); + memcpy(rpl.tag, req.tag, TAG_LEN); + rpl.success = 0; + } else { + /* success */ + log_debug(LD_OR,"onion_skin_server_handshake succeeded."); + memcpy(rpl.tag, req.tag, TAG_LEN); + cell_out->handshake_len = n; + switch (cc->cell_type) { + case CELL_CREATE: + cell_out->cell_type = CELL_CREATED; break; + case CELL_CREATE2: + cell_out->cell_type = CELL_CREATED2; break; + case CELL_CREATE_FAST: + cell_out->cell_type = CELL_CREATED_FAST; break; + default: + tor_assert(0); + goto end; + } + rpl.success = 1; + } + rpl.magic = CPUWORKER_REPLY_MAGIC; + if (req.timed) { + struct timeval tv_diff; + int64_t usec; + tor_gettimeofday(&tv_end); + timersub(&tv_end, &tv_start, &tv_diff); + usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; + if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY) + rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY; + else + rpl.n_usec = (uint32_t) usec; + } + if (write_all(fd, (void*)&rpl, sizeof(rpl), 1) != sizeof(rpl)) { + log_err(LD_BUG,"writing response buf failed. Exiting."); + goto end; + } + log_debug(LD_OR,"finished writing response."); + } else if (req.task == CPUWORKER_TASK_SHUTDOWN) { + log_info(LD_OR,"Clean shutdown: exiting"); + goto end; + } + memwipe(&req, 0, sizeof(req)); + memwipe(&rpl, 0, sizeof(req)); + } + end: + memwipe(&req, 0, sizeof(req)); + memwipe(&rpl, 0, sizeof(req)); + release_server_onion_keys(&onion_keys); + tor_close_socket(fd); + crypto_thread_cleanup(); + spawn_exit(); +} + +/** Launch a new cpuworker. Return 0 if we're happy, -1 if we failed. + */ +static int +spawn_cpuworker(void) +{ + tor_socket_t *fdarray; + tor_socket_t fd; + connection_t *conn; + int err; + + fdarray = tor_malloc(sizeof(tor_socket_t)*2); + if ((err = tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fdarray)) < 0) { + log_warn(LD_NET, "Couldn't construct socketpair for cpuworker: %s", + tor_socket_strerror(-err)); + tor_free(fdarray); + return -1; + } + + tor_assert(SOCKET_OK(fdarray[0])); + tor_assert(SOCKET_OK(fdarray[1])); + + fd = fdarray[0]; + spawn_func(cpuworker_main, (void*)fdarray); + log_debug(LD_OR,"just spawned a cpu worker."); +#ifndef TOR_IS_MULTITHREADED + tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */ + tor_free(fdarray); +#endif + + conn = connection_new(CONN_TYPE_CPUWORKER, AF_UNIX); + + /* set up conn so it's got all the data we need to remember */ + conn->s = fd; + conn->address = tor_strdup("localhost"); + tor_addr_make_unspec(&conn->addr); + + if (set_socket_nonblocking(fd) == -1) { + connection_free(conn); /* this closes fd */ + return -1; + } + + if (connection_add(conn) < 0) { /* no space, forget it */ + log_warn(LD_NET,"connection_add for cpuworker failed. Giving up."); + connection_free(conn); /* this closes fd */ + return -1; + } + + conn->state = CPUWORKER_STATE_IDLE; + connection_start_reading(conn); + + return 0; /* success */ +} + +/** If we have too few or too many active cpuworkers, try to spawn new ones + * or kill idle ones. + */ +static void +spawn_enough_cpuworkers(void) +{ + int num_cpuworkers_needed = get_num_cpus(get_options()); + int reseed = 0; + + if (num_cpuworkers_needed < MIN_CPUWORKERS) + num_cpuworkers_needed = MIN_CPUWORKERS; + if (num_cpuworkers_needed > MAX_CPUWORKERS) + num_cpuworkers_needed = MAX_CPUWORKERS; + + while (num_cpuworkers < num_cpuworkers_needed) { + if (spawn_cpuworker() < 0) { + log_warn(LD_GENERAL,"Cpuworker spawn failed. Will try again later."); + return; + } + num_cpuworkers++; + reseed++; + } + + if (reseed) + crypto_seed_weak_rng(&request_sample_rng); +} + +/** Take a pending task from the queue and assign it to 'cpuworker'. */ +static void +process_pending_task(connection_t *cpuworker) +{ + or_circuit_t *circ; + create_cell_t *onionskin = NULL; + + tor_assert(cpuworker); + + /* for now only process onion tasks */ + + circ = onion_next_task(&onionskin); + if (!circ) + return; + if (assign_onionskin_to_cpuworker(cpuworker, circ, onionskin)) + log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring."); +} + +/** How long should we let a cpuworker stay busy before we give + * up on it and decide that we have a bug or infinite loop? + * This value is high because some servers with low memory/cpu + * sometimes spend an hour or more swapping, and Tor starves. */ +#define CPUWORKER_BUSY_TIMEOUT (60*60*12) + +/** We have a bug that I can't find. Sometimes, very rarely, cpuworkers get + * stuck in the 'busy' state, even though the cpuworker process thinks of + * itself as idle. I don't know why. But here's a workaround to kill any + * cpuworker that's been busy for more than CPUWORKER_BUSY_TIMEOUT. + */ +static void +cull_wedged_cpuworkers(void) +{ + time_t now = time(NULL); + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { + if (!conn->marked_for_close && + conn->type == CONN_TYPE_CPUWORKER && + conn->state == CPUWORKER_STATE_BUSY_ONION && + conn->timestamp_lastwritten + CPUWORKER_BUSY_TIMEOUT < now) { + log_notice(LD_BUG, + "closing wedged cpuworker. Can somebody find the bug?"); + num_cpuworkers_busy--; + num_cpuworkers--; + connection_mark_for_close(conn); + } + } SMARTLIST_FOREACH_END(conn); +} + +/** Try to tell a cpuworker to perform the public key operations necessary to + * respond to onionskin for the circuit circ. + * + * If cpuworker is defined, assert that he's idle, and use him. Else, + * look for an idle cpuworker and use him. If none idle, queue task onto the + * pending onion list and return. Return 0 if we successfully assign the + * task, or -1 on failure. + */ +int +assign_onionskin_to_cpuworker(connection_t *cpuworker, + or_circuit_t *circ, + create_cell_t *onionskin) +{ + cpuworker_request_t req; + time_t now = approx_time(); + static time_t last_culled_cpuworkers = 0; + int should_time; + + /* Checking for wedged cpuworkers requires a linear search over all + * connections, so let's do it only once a minute. + */ +#define CULL_CPUWORKERS_INTERVAL 60 + + if (last_culled_cpuworkers + CULL_CPUWORKERS_INTERVAL <= now) { + cull_wedged_cpuworkers(); + spawn_enough_cpuworkers(); + last_culled_cpuworkers = now; + } + + if (1) { + if (num_cpuworkers_busy == num_cpuworkers) { + log_debug(LD_OR,"No idle cpuworkers. Queuing."); + if (onion_pending_add(circ, onionskin) < 0) { + tor_free(onionskin); + return -1; + } + return 0; + } + + if (!cpuworker) + cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, + CPUWORKER_STATE_IDLE); + + tor_assert(cpuworker); + + if (!circ->p_chan) { + log_info(LD_OR,"circ->p_chan gone. Failing circ."); + tor_free(onionskin); + return -1; + } + + if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest)) + rep_hist_note_circuit_handshake_completed(onionskin->handshake_type); + + should_time = should_time_request(onionskin->handshake_type); + memset(&req, 0, sizeof(req)); + req.magic = CPUWORKER_REQUEST_MAGIC; + tag_pack(req.tag, circ->p_chan->global_identifier, + circ->p_circ_id); + req.timed = should_time; + + cpuworker->state = CPUWORKER_STATE_BUSY_ONION; + /* touch the lastwritten timestamp, since that's how we check to + * see how long it's been since we asked the question, and sometimes + * we check before the first call to connection_handle_write(). */ + cpuworker->timestamp_lastwritten = now; + num_cpuworkers_busy++; + + req.task = CPUWORKER_TASK_ONION; + memcpy(&req.create_cell, onionskin, sizeof(create_cell_t)); + + tor_free(onionskin); + + if (should_time) + tor_gettimeofday(&req.started_at); + + connection_write_to_buf((void*)&req, sizeof(req), cpuworker); + memwipe(&req, 0, sizeof(req)); + } + return 0; +} + diff --git a/src/tor/src/or/cpuworker.h b/src/tor/cpuworker.h similarity index 54% rename from src/tor/src/or/cpuworker.h rename to src/tor/cpuworker.h index d39851325..317cef43b 100644 --- a/src/tor/src/or/cpuworker.h +++ b/src/tor/cpuworker.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,25 +13,19 @@ #define TOR_CPUWORKER_H void cpu_init(void); -void cpuworkers_rotate_keyinfo(void); -struct workqueue_entry_s; -enum workqueue_reply_t; -enum workqueue_priority_t; -MOCK_DECL(struct workqueue_entry_s *, cpuworker_queue_work, ( - enum workqueue_priority_t priority, - enum workqueue_reply_t (*fn)(void *, void *), - void (*reply_fn)(void *), - void *arg)); - +void cpuworkers_rotate(void); +int connection_cpu_finished_flushing(connection_t *conn); +int connection_cpu_reached_eof(connection_t *conn); +int connection_cpu_process_inbuf(connection_t *conn); struct create_cell_t; -int assign_onionskin_to_cpuworker(or_circuit_t *circ, +int assign_onionskin_to_cpuworker(connection_t *cpuworker, + or_circuit_t *circ, struct create_cell_t *onionskin); uint64_t estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type); void cpuworker_log_onionskin_overhead(int severity, int onionskin_type, const char *onionskin_type_name); -void cpuworker_cancel_circ_handshake(or_circuit_t *circ); -#endif /* !defined(TOR_CPUWORKER_H) */ +#endif diff --git a/src/tor/src/common/crypto.c b/src/tor/crypto.c similarity index 61% rename from src/tor/src/common/crypto.c rename to src/tor/crypto.c index 575bfd0c0..044e151c3 100644 --- a/src/tor/src/common/crypto.c +++ b/src/tor/crypto.c @@ -1,35 +1,28 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file crypto.c * \brief Wrapper functions to present a consistent interface to - * public-key and symmetric cryptography operations from OpenSSL and - * other places. + * public-key and symmetric cryptography operations from OpenSSL. **/ #include "orconfig.h" #ifdef _WIN32 -#include +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#define WIN32_LEAN_AND_MEAN #include #include /* Windows defines this; so does OpenSSL 0.9.8h and later. We don't actually * use either definition. */ #undef OCSP_RESPONSE -#endif /* defined(_WIN32) */ - -#define CRYPTO_PRIVATE -#include "crypto.h" -#include "compat_openssl.h" -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "crypto_format.h" - -DISABLE_GCC_WARNING(redundant-decls) +#endif #include #include @@ -37,21 +30,12 @@ DISABLE_GCC_WARNING(redundant-decls) #include #include #include +#include #include #include #include #include -ENABLE_GCC_WARNING(redundant-decls) - -#if __GNUC__ && GCC_VERSION >= 402 -#if GCC_VERSION >= 406 -#pragma GCC diagnostic pop -#else -#pragma GCC diagnostic warning "-Wredundant-decls" -#endif -#endif /* __GNUC__ && GCC_VERSION >= 402 */ - #ifdef HAVE_CTYPE_H #include #endif @@ -64,57 +48,39 @@ ENABLE_GCC_WARNING(redundant-decls) #ifdef HAVE_SYS_FCNTL_H #include #endif -#ifdef HAVE_SYS_SYSCALL_H -#include -#endif -#ifdef HAVE_SYS_RANDOM_H -#include -#endif +#define CRYPTO_PRIVATE +#include "crypto.h" #include "torlog.h" -#include "torint.h" #include "aes.h" -#include "util.h" +#include "tor_util.h" #include "container.h" -#include "compat.h" +#include "tor_compat.h" #include "sandbox.h" -#include "util_format.h" -#include "keccak-tiny/keccak-tiny.h" +#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(0,9,8) +#error "We require OpenSSL >= 0.9.8" +#endif #ifdef ANDROID /* Android's OpenSSL seems to have removed all of its Engine support. */ #define DISABLE_ENGINES #endif -#if OPENSSL_VERSION_NUMBER >= OPENSSL_VER(1,1,0,0,5) && \ - !defined(LIBRESSL_VERSION_NUMBER) -/* OpenSSL as of 1.1.0pre4 has an "new" thread API, which doesn't require - * seting up various callbacks. - * - * OpenSSL 1.1.0pre4 has a messed up `ERR_remove_thread_state()` prototype, - * while the previous one was restored in pre5, and the function made a no-op - * (along with a deprecated annotation, which produces a compiler warning). - * - * While it is possible to support all three versions of the thread API, - * a version that existed only for one snapshot pre-release is kind of - * pointless, so let's not. - */ -#define NEW_THREAD_API -#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_VER(1,1,0,0,5) && ... */ - /** Longest recognized */ #define MAX_DNS_LABEL_SIZE 63 -/** Largest strong entropy request */ -#define MAX_STRONGEST_RAND_SIZE 256 +/** Macro: is k a valid RSA public or private key? */ +#define PUBLIC_KEY_OK(k) ((k) && (k)->key && (k)->key->n) +/** Macro: is k a valid RSA private key? */ +#define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p) -#ifndef NEW_THREAD_API +#ifdef TOR_IS_MULTITHREADED /** A number of preallocated mutexes for use by OpenSSL. */ static tor_mutex_t **openssl_mutexes_ = NULL; /** How many mutexes have we allocated for use by OpenSSL? */ static int n_openssl_mutexes_ = 0; -#endif /* !defined(NEW_THREAD_API) */ +#endif /** A public key, or a public/private key-pair. */ struct crypto_pk_t @@ -123,6 +89,15 @@ struct crypto_pk_t RSA *key; /**< The key itself */ }; +/** Key and stream information for a stream cipher. */ +struct crypto_cipher_t +{ + char key[CIPHER_KEY_LEN]; /**< The raw key. */ + char iv[CIPHER_IV_LEN]; /**< The initial IV. */ + aes_cnt_cipher_t *cipher; /**< The key in format usable for counter-mode AES + * encryption */ +}; + /** A structure to hold the first half (x, g^x) of a Diffie-Hellman handshake * while we're waiting for the second.*/ struct crypto_dh_t { @@ -130,35 +105,32 @@ struct crypto_dh_t { }; static int setup_openssl_threading(void); -static int tor_check_dh_key(int severity, const BIGNUM *bn); +static int tor_check_dh_key(int severity, BIGNUM *bn); /** Return the number of bytes added by padding method padding. */ -static inline int +static INLINE int crypto_get_rsa_padding_overhead(int padding) { switch (padding) { case RSA_PKCS1_OAEP_PADDING: return PKCS1_OAEP_PADDING_OVERHEAD; - default: tor_assert(0); return -1; // LCOV_EXCL_LINE + default: tor_assert(0); return -1; } } /** Given a padding method padding, return the correct OpenSSL constant. */ -static inline int +static INLINE int crypto_get_rsa_padding(int padding) { switch (padding) { case PK_PKCS1_OAEP_PADDING: return RSA_PKCS1_OAEP_PADDING; - default: tor_assert(0); return -1; // LCOV_EXCL_LINE + default: tor_assert(0); return -1; } } -/** Boolean: has OpenSSL's crypto been initialized? */ -static int crypto_early_initialized_ = 0; - /** Boolean: has OpenSSL's crypto been initialized? */ static int crypto_global_initialized_ = 0; @@ -177,9 +149,13 @@ crypto_log_errors(int severity, const char *doing) if (!msg) msg = "(null)"; if (!lib) lib = "(null)"; if (!func) func = "(null)"; - if (BUG(!doing)) doing = "(null)"; - tor_log(severity, LD_CRYPTO, "crypto error while %s: %s (in %s:%s)", + if (doing) { + tor_log(severity, LD_CRYPTO, "crypto error while %s: %s (in %s:%s)", doing, msg, lib, func); + } else { + tor_log(severity, LD_CRYPTO, "crypto error: %s (in %s:%s)", + msg, lib, func); + } } } @@ -198,7 +174,7 @@ log_engine(const char *fn, ENGINE *e) log_info(LD_CRYPTO, "Using default implementation for %s", fn); } } -#endif /* !defined(DISABLE_ENGINES) */ +#endif #ifndef DISABLE_ENGINES /** Try to load an engine in a shared library via fully qualified path. @@ -218,7 +194,7 @@ try_load_engine(const char *path, const char *engine) } return e; } -#endif /* !defined(DISABLE_ENGINES) */ +#endif /* Returns a trimmed and human-readable version of an openssl version string * raw_version. They are usually in the form of 'OpenSSL 1.0.0b 10 @@ -247,7 +223,7 @@ const char * crypto_openssl_get_version_str(void) { if (crypto_openssl_version_str == NULL) { - const char *raw_version = OpenSSL_version(OPENSSL_VERSION); + const char *raw_version = SSLeay_version(SSLEAY_VERSION); crypto_openssl_version_str = parse_openssl_version_str(raw_version); } return crypto_openssl_version_str; @@ -266,89 +242,35 @@ crypto_openssl_get_header_version_str(void) return crypto_openssl_header_version_str; } -/** Make sure that openssl is using its default PRNG. Return 1 if we had to - * adjust it; 0 otherwise. */ -STATIC int -crypto_force_rand_ssleay(void) -{ - RAND_METHOD *default_method; - default_method = RAND_OpenSSL(); - if (RAND_get_rand_method() != default_method) { - log_notice(LD_CRYPTO, "It appears that one of our engines has provided " - "a replacement the OpenSSL RNG. Resetting it to the default " - "implementation."); - RAND_set_rand_method(default_method); - return 1; - } - return 0; -} - -/** Set up the siphash key if we haven't already done so. */ -int -crypto_init_siphash_key(void) -{ - static int have_seeded_siphash = 0; - struct sipkey key; - if (have_seeded_siphash) - return 0; - - crypto_rand((char*) &key, sizeof(key)); - siphash_set_global_key(&key); - have_seeded_siphash = 1; - return 0; -} - /** Initialize the crypto library. Return 0 on success, -1 on failure. */ int -crypto_early_init(void) +crypto_global_init(int useAccel, const char *accelName, const char *accelDir) { - if (!crypto_early_initialized_) { - - crypto_early_initialized_ = 1; - + if (!crypto_global_initialized_) { ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); - + crypto_global_initialized_ = 1; setup_openssl_threading(); - unsigned long version_num = OpenSSL_version_num(); - const char *version_str = OpenSSL_version(OPENSSL_VERSION); - if (version_num == OPENSSL_VERSION_NUMBER && - !strcmp(version_str, OPENSSL_VERSION_TEXT)) { + if (SSLeay() == OPENSSL_VERSION_NUMBER && + !strcmp(SSLeay_version(SSLEAY_VERSION), OPENSSL_VERSION_TEXT)) { log_info(LD_CRYPTO, "OpenSSL version matches version from headers " - "(%lx: %s).", version_num, version_str); + "(%lx: %s).", SSLeay(), SSLeay_version(SSLEAY_VERSION)); } else { log_warn(LD_CRYPTO, "OpenSSL version from headers does not match the " "version we're running with. If you get weird crashes, that " "might be why. (Compiled with %lx: %s; running with %lx: %s).", (unsigned long)OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT, - version_num, version_str); + SSLeay(), SSLeay_version(SSLEAY_VERSION)); } - crypto_force_rand_ssleay(); - - if (crypto_seed_rng() < 0) - return -1; - if (crypto_init_siphash_key() < 0) - return -1; - - curve25519_init(); - ed25519_init(); - } - return 0; -} - -/** Initialize the crypto library. Return 0 on success, -1 on failure. - */ -int -crypto_global_init(int useAccel, const char *accelName, const char *accelDir) -{ - if (!crypto_global_initialized_) { - if (crypto_early_init() < 0) - return -1; - - crypto_global_initialized_ = 1; + if (SSLeay() < OPENSSL_V_SERIES(1,0,0)) { + log_notice(LD_CRYPTO, + "Your OpenSSL version seems to be %s. We recommend 1.0.0 " + "or later.", + crypto_openssl_get_version_str()); + } if (useAccel > 0) { #ifdef DISABLE_ENGINES @@ -389,12 +311,8 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir) used by Tor and the set of algorithms available in the engine */ log_engine("RSA", ENGINE_get_default_RSA()); log_engine("DH", ENGINE_get_default_DH()); -#ifdef OPENSSL_1_1_API - log_engine("EC", ENGINE_get_default_EC()); -#else log_engine("ECDH", ENGINE_get_default_ECDH()); log_engine("ECDSA", ENGINE_get_default_ECDSA()); -#endif /* defined(OPENSSL_1_1_API) */ log_engine("RAND", ENGINE_get_default_RAND()); log_engine("RAND (which we will not use)", ENGINE_get_default_RAND()); log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1)); @@ -412,18 +330,22 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir) log_engine("AES-256-GCM", ENGINE_get_cipher_engine(NID_aes_256_gcm)); #endif -#endif /* defined(DISABLE_ENGINES) */ +#endif } else { log_info(LD_CRYPTO, "NOT using OpenSSL engine support."); } - if (crypto_force_rand_ssleay()) { - if (crypto_seed_rng() < 0) - return -1; + if (RAND_get_rand_method() != RAND_SSLeay()) { + log_notice(LD_CRYPTO, "It appears that one of our engines has provided " + "a replacement the OpenSSL RNG. Resetting it to the default " + "implementation."); + RAND_set_rand_method(RAND_SSLeay()); } evaluate_evp_for_aes(-1); evaluate_ctr_for_aes(); + + return crypto_seed_rng(1); } return 0; } @@ -432,27 +354,7 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir) void crypto_thread_cleanup(void) { -#ifndef NEW_THREAD_API - ERR_remove_thread_state(NULL); -#endif -} - -/** used internally: quicly validate a crypto_pk_t object as a private key. - * Return 1 iff the public key is valid, 0 if obviously invalid. - */ -static int -crypto_pk_private_ok(const crypto_pk_t *k) -{ -#ifdef OPENSSL_1_1_API - if (!k || !k->key) - return 0; - - const BIGNUM *p, *q; - RSA_get0_factors(k->key, &p, &q); - return p != NULL; /* XXX/yawning: Should we check q? */ -#else /* !(defined(OPENSSL_1_1_API)) */ - return k && k->key && k->key->p; -#endif /* defined(OPENSSL_1_1_API) */ + ERR_remove_state(0); } /** used by tortls.c: wrap an RSA* in a crypto_pk_t. */ @@ -467,7 +369,7 @@ crypto_new_pk_from_rsa_(RSA *rsa) return env; } -/** Helper, used by tor-gencert.c. Return the RSA from a +/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a * crypto_pk_t. */ RSA * crypto_pk_get_rsa_(crypto_pk_t *env) @@ -476,10 +378,9 @@ crypto_pk_get_rsa_(crypto_pk_t *env) } /** used by tortls.c: get an equivalent EVP_PKEY* for a crypto_pk_t. Iff - * private is set, include the private-key portion of the key. Return a valid - * pointer on success, and NULL on failure. */ -MOCK_IMPL(EVP_PKEY *, -crypto_pk_get_evp_pkey_,(crypto_pk_t *env, int private)) + * private is set, include the private-key portion of the key. */ +EVP_PKEY * +crypto_pk_get_evp_pkey_(crypto_pk_t *env, int private) { RSA *key = NULL; EVP_PKEY *pkey = NULL; @@ -515,8 +416,8 @@ crypto_dh_get_dh_(crypto_dh_t *dh) /** Allocate and return storage for a public key. The key itself will not yet * be set. */ -MOCK_IMPL(crypto_pk_t *, -crypto_pk_new,(void)) +crypto_pk_t * +crypto_pk_new(void) { RSA *rsa; @@ -529,7 +430,7 @@ crypto_pk_new,(void)) * are released, free the key. */ void -crypto_pk_free_(crypto_pk_t *env) +crypto_pk_free(crypto_pk_t *env) { if (!env) return; @@ -545,59 +446,52 @@ crypto_pk_free_(crypto_pk_t *env) } /** Allocate and return a new symmetric cipher using the provided key and iv. - * The key is bits bits long; the IV is CIPHER_IV_LEN bytes. Both - * must be provided. Key length must be 128, 192, or 256 */ -crypto_cipher_t * -crypto_cipher_new_with_iv_and_bits(const uint8_t *key, - const uint8_t *iv, - int bits) -{ - tor_assert(key); - tor_assert(iv); - - return aes_new_cipher((const uint8_t*)key, (const uint8_t*)iv, bits); -} - -/** Allocate and return a new symmetric cipher using the provided key and iv. - * The key is CIPHER_KEY_LEN bytes; the IV is CIPHER_IV_LEN bytes. Both - * must be provided. + * The key is CIPHER_KEY_LEN bytes; the IV is CIPHER_IV_LEN bytes. If you + * provide NULL in place of either one, it is generated at random. */ crypto_cipher_t * crypto_cipher_new_with_iv(const char *key, const char *iv) { - return crypto_cipher_new_with_iv_and_bits((uint8_t*)key, (uint8_t*)iv, - 128); + crypto_cipher_t *env; + + env = tor_malloc_zero(sizeof(crypto_cipher_t)); + + if (key == NULL) + crypto_rand(env->key, CIPHER_KEY_LEN); + else + memcpy(env->key, key, CIPHER_KEY_LEN); + if (iv == NULL) + crypto_rand(env->iv, CIPHER_IV_LEN); + else + memcpy(env->iv, iv, CIPHER_IV_LEN); + + env->cipher = aes_new_cipher(env->key, env->iv); + + return env; } /** Return a new crypto_cipher_t with the provided key and an IV of all - * zero bytes and key length bits. Key length must be 128, 192, or - * 256. */ + * zero bytes. */ crypto_cipher_t * -crypto_cipher_new_with_bits(const char *key, int bits) +crypto_cipher_new(const char *key) { char zeroiv[CIPHER_IV_LEN]; memset(zeroiv, 0, sizeof(zeroiv)); - return crypto_cipher_new_with_iv_and_bits((uint8_t*)key, (uint8_t*)zeroiv, - bits); -} - -/** Return a new crypto_cipher_t with the provided key (of - * CIPHER_KEY_LEN bytes) and an IV of all zero bytes. */ -crypto_cipher_t * -crypto_cipher_new(const char *key) -{ - return crypto_cipher_new_with_bits(key, 128); + return crypto_cipher_new_with_iv(key, zeroiv); } /** Free a symmetric cipher. */ void -crypto_cipher_free_(crypto_cipher_t *env) +crypto_cipher_free(crypto_cipher_t *env) { if (!env) return; - aes_cipher_free(env); + tor_assert(env->cipher); + aes_cipher_free(env->cipher); + memwipe(env, 0, sizeof(crypto_cipher_t)); + tor_free(env); } /* public key crypto */ @@ -605,15 +499,13 @@ crypto_cipher_free_(crypto_cipher_t *env) /** Generate a bits-bit new public/private keypair in env. * Return 0 on success, -1 on failure. */ -MOCK_IMPL(int, -crypto_pk_generate_key_with_bits,(crypto_pk_t *env, int bits)) +int +crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits) { tor_assert(env); - if (env->key) { + if (env->key) RSA_free(env->key); - env->key = NULL; - } { BIGNUM *e = BN_new(); @@ -645,21 +537,11 @@ crypto_pk_generate_key_with_bits,(crypto_pk_t *env, int bits)) return 0; } -/** A PEM callback that always reports a failure to get a password */ -static int -pem_no_password_cb(char *buf, int size, int rwflag, void *u) -{ - (void)buf; - (void)size; - (void)rwflag; - (void)u; - return 0; -} - /** Read a PEM-encoded private key from the len-byte string s * into env. Return 0 on success, -1 on failure. If len is -1, * the string is nul-terminated. */ +/* Used here, and used for testing. */ int crypto_pk_read_private_key_from_string(crypto_pk_t *env, const char *s, ssize_t len) @@ -678,7 +560,7 @@ crypto_pk_read_private_key_from_string(crypto_pk_t *env, if (env->key) RSA_free(env->key); - env->key = PEM_read_bio_RSAPrivateKey(b,NULL,pem_no_password_cb,NULL); + env->key = PEM_read_bio_RSAPrivateKey(b,NULL,NULL,NULL); BIO_free(b); @@ -720,8 +602,7 @@ crypto_pk_read_private_key_from_filename(crypto_pk_t *env, return 0; } -/** Helper function to implement crypto_pk_write_*_key_to_string. Return 0 on - * success, -1 on failure. */ +/** Helper function to implement crypto_pk_write_*_key_to_string. */ static int crypto_pk_write_key_to_string_impl(crypto_pk_t *env, char **dest, size_t *len, int is_public) @@ -753,13 +634,14 @@ crypto_pk_write_key_to_string_impl(crypto_pk_t *env, char **dest, } BIO_get_mem_ptr(b, &buf); + (void)BIO_set_close(b, BIO_NOCLOSE); /* so BIO_free doesn't free buf */ + BIO_free(b); *dest = tor_malloc(buf->length+1); memcpy(*dest, buf->data, buf->length); (*dest)[buf->length] = 0; /* nul terminate it */ *len = buf->length; - - BIO_free(b); + BUF_MEM_free(buf); return 0; } @@ -810,7 +692,7 @@ crypto_pk_read_public_key_from_string(crypto_pk_t *env, const char *src, if (env->key) RSA_free(env->key); - env->key = PEM_read_bio_RSAPublicKey(b, NULL, pem_no_password_cb, NULL); + env->key = PEM_read_bio_RSAPublicKey(b, NULL, NULL, NULL); BIO_free(b); if (!env->key) { crypto_log_errors(LOG_WARN, "reading public key from string"); @@ -833,7 +715,7 @@ crypto_pk_write_private_key_to_filename(crypto_pk_t *env, char *s; int r; - tor_assert(crypto_pk_private_ok(env)); + tor_assert(PRIVATE_KEY_OK(env)); if (!(bio = BIO_new(BIO_s_mem()))) return -1; @@ -875,7 +757,7 @@ int crypto_pk_key_is_private(const crypto_pk_t *key) { tor_assert(key); - return crypto_pk_private_ok(key); + return PRIVATE_KEY_OK(key); } /** Return true iff env contains a public key whose public exponent @@ -887,15 +769,7 @@ crypto_pk_public_exponent_ok(crypto_pk_t *env) tor_assert(env); tor_assert(env->key); - const BIGNUM *e; - -#ifdef OPENSSL_1_1_API - const BIGNUM *n, *d; - RSA_get0_key(env->key, &n, &e, &d); -#else - e = env->key->e; -#endif /* defined(OPENSSL_1_1_API) */ - return BN_is_word(e, 65537); + return BN_is_word(env->key->e, 65537); } /** Compare the public-key components of a and b. Return less than 0 @@ -905,7 +779,7 @@ crypto_pk_public_exponent_ok(crypto_pk_t *env) * Note that this may leak information about the keys through timing. */ int -crypto_pk_cmp_keys(const crypto_pk_t *a, const crypto_pk_t *b) +crypto_pk_cmp_keys(crypto_pk_t *a, crypto_pk_t *b) { int result; char a_is_non_null = (a != NULL) && (a->key != NULL); @@ -916,27 +790,12 @@ crypto_pk_cmp_keys(const crypto_pk_t *a, const crypto_pk_t *b) if (an_argument_is_null) return result; - const BIGNUM *a_n, *a_e; - const BIGNUM *b_n, *b_e; - -#ifdef OPENSSL_1_1_API - const BIGNUM *a_d, *b_d; - RSA_get0_key(a->key, &a_n, &a_e, &a_d); - RSA_get0_key(b->key, &b_n, &b_e, &b_d); -#else - a_n = a->key->n; - a_e = a->key->e; - b_n = b->key->n; - b_e = b->key->e; -#endif /* defined(OPENSSL_1_1_API) */ - - tor_assert(a_n != NULL && a_e != NULL); - tor_assert(b_n != NULL && b_e != NULL); - - result = BN_cmp(a_n, b_n); + tor_assert(PUBLIC_KEY_OK(a)); + tor_assert(PUBLIC_KEY_OK(b)); + result = BN_cmp((a->key)->n, (b->key)->n); if (result) return result; - return BN_cmp(a_e, b_e); + return BN_cmp((a->key)->e, (b->key)->e); } /** Compare the public-key components of a and b. Return non-zero iff @@ -946,19 +805,19 @@ crypto_pk_cmp_keys(const crypto_pk_t *a, const crypto_pk_t *b) * Note that this may leak information about the keys through timing. */ int -crypto_pk_eq_keys(const crypto_pk_t *a, const crypto_pk_t *b) +crypto_pk_eq_keys(crypto_pk_t *a, crypto_pk_t *b) { return (crypto_pk_cmp_keys(a, b) == 0); } /** Return the size of the public key modulus in env, in bytes. */ size_t -crypto_pk_keysize(const crypto_pk_t *env) +crypto_pk_keysize(crypto_pk_t *env) { tor_assert(env); tor_assert(env->key); - return (size_t) RSA_size((RSA*)env->key); + return (size_t) RSA_size(env->key); } /** Return the size of the public key modulus of env, in bits. */ @@ -967,20 +826,9 @@ crypto_pk_num_bits(crypto_pk_t *env) { tor_assert(env); tor_assert(env->key); - -#ifdef OPENSSL_1_1_API - /* It's so stupid that there's no other way to check that n is valid - * before calling RSA_bits(). - */ - const BIGNUM *n, *e, *d; - RSA_get0_key(env->key, &n, &e, &d); - tor_assert(n != NULL); - - return RSA_bits(env->key); -#else /* !(defined(OPENSSL_1_1_API)) */ tor_assert(env->key->n); + return BN_num_bits(env->key->n); -#endif /* defined(OPENSSL_1_1_API) */ } /** Increase the reference count of env, and return it. @@ -995,22 +843,7 @@ crypto_pk_dup_key(crypto_pk_t *env) return env; } -#ifdef TOR_UNIT_TESTS -/** For testing: replace dest with src. (Dest must have a refcount - * of 1) */ -void -crypto_pk_assign_(crypto_pk_t *dest, const crypto_pk_t *src) -{ - tor_assert(dest); - tor_assert(dest->refs == 1); - tor_assert(src); - RSA_free(dest->key); - dest->key = RSAPrivateKey_dup(src->key); -} -#endif /* defined(TOR_UNIT_TESTS) */ - -/** Make a real honest-to-goodness copy of env, and return it. - * Returns NULL on failure. */ +/** Make a real honest-to-goodness copy of env, and return it. */ crypto_pk_t * crypto_pk_copy_full(crypto_pk_t *env) { @@ -1019,17 +852,13 @@ crypto_pk_copy_full(crypto_pk_t *env) tor_assert(env); tor_assert(env->key); - if (crypto_pk_private_ok(env)) { + if (PRIVATE_KEY_OK(env)) { new_key = RSAPrivateKey_dup(env->key); privatekey = 1; } else { new_key = RSAPublicKey_dup(env->key); } if (!new_key) { - /* LCOV_EXCL_START - * - * We can't cause RSA*Key_dup() to fail, so we can't really test this. - */ log_err(LD_CRYPTO, "Unable to duplicate a %s key: openssl failed.", privatekey?"private":"public"); crypto_log_errors(LOG_ERR, @@ -1037,7 +866,6 @@ crypto_pk_copy_full(crypto_pk_t *env) "Duplicating a public key"); tor_fragile_assert(); return NULL; - /* LCOV_EXCL_STOP */ } return crypto_new_pk_from_rsa_(new_key); @@ -1093,7 +921,7 @@ crypto_pk_private_decrypt(crypto_pk_t *env, char *to, tor_assert(env->key); tor_assert(fromlen= crypto_pk_keysize(env)); - if (!crypto_pk_key_is_private(env)) + if (!env->key->p) /* Not a private key */ return -1; @@ -1117,10 +945,10 @@ crypto_pk_private_decrypt(crypto_pk_t *env, char *to, * tolen is the number of writable bytes in to, and must be * at least the length of the modulus of env. */ -MOCK_IMPL(int, -crypto_pk_public_checksig,(const crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen)) +int +crypto_pk_public_checksig(crypto_pk_t *env, char *to, + size_t tolen, + const char *from, size_t fromlen) { int r; tor_assert(env); @@ -1133,7 +961,7 @@ crypto_pk_public_checksig,(const crypto_pk_t *env, char *to, env->key, RSA_PKCS1_PADDING); if (r<0) { - crypto_log_errors(LOG_INFO, "checking RSA signature"); + crypto_log_errors(LOG_WARN, "checking RSA signature"); return -1; } return r; @@ -1144,10 +972,9 @@ crypto_pk_public_checksig,(const crypto_pk_t *env, char *to, * in env. Return 0 if sig is a correct signature for * SHA1(data). Else return -1. */ -MOCK_IMPL(int, -crypto_pk_public_checksig_digest,(crypto_pk_t *env, const char *data, - size_t datalen, const char *sig, - size_t siglen)) +int +crypto_pk_public_checksig_digest(crypto_pk_t *env, const char *data, + size_t datalen, const char *sig, size_t siglen) { char digest[DIGEST_LEN]; char *buf; @@ -1191,7 +1018,7 @@ crypto_pk_public_checksig_digest,(crypto_pk_t *env, const char *data, * at least the length of the modulus of env. */ int -crypto_pk_private_sign(const crypto_pk_t *env, char *to, size_t tolen, +crypto_pk_private_sign(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen) { int r; @@ -1200,13 +1027,13 @@ crypto_pk_private_sign(const crypto_pk_t *env, char *to, size_t tolen, tor_assert(to); tor_assert(fromlen < INT_MAX); tor_assert(tolen >= crypto_pk_keysize(env)); - if (!crypto_pk_key_is_private(env)) + if (!env->key->p) /* Not a private key */ return -1; r = RSA_private_encrypt((int)fromlen, (unsigned char*)from, (unsigned char*)to, - (RSA*)env->key, RSA_PKCS1_PADDING); + env->key, RSA_PKCS1_PADDING); if (r<0) { crypto_log_errors(LOG_WARN, "generating RSA signature"); return -1; @@ -1248,12 +1075,9 @@ crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen, * - The beginning of the source data prefixed with a 16-byte symmetric key, * padded and encrypted with the public key; followed by the rest of * the source data encrypted in AES-CTR mode with the symmetric key. - * - * NOTE that this format does not authenticate the symmetrically encrypted - * part of the data, and SHOULD NOT BE USED for new protocols. */ int -crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, +crypto_pk_public_hybrid_encrypt(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen, @@ -1281,12 +1105,10 @@ crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, tor_assert(tolen >= fromlen + overhead + CIPHER_KEY_LEN); tor_assert(tolen >= pkeylen); - char key[CIPHER_KEY_LEN]; - crypto_rand(key, sizeof(key)); /* generate a new key. */ - cipher = crypto_cipher_new(key); + cipher = crypto_cipher_new(NULL); /* generate a new key. */ buf = tor_malloc(pkeylen+1); - memcpy(buf, key, CIPHER_KEY_LEN); + memcpy(buf, cipher->key, CIPHER_KEY_LEN); memcpy(buf+CIPHER_KEY_LEN, from, pkeylen-overhead-CIPHER_KEY_LEN); /* Length of symmetrically encrypted data. */ @@ -1301,7 +1123,6 @@ crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, if (r<0) goto err; memwipe(buf, 0, pkeylen); - memwipe(key, 0, sizeof(key)); tor_free(buf); crypto_cipher_free(cipher); tor_assert(outlen+symlen < INT_MAX); @@ -1309,20 +1130,14 @@ crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, err: memwipe(buf, 0, pkeylen); - memwipe(key, 0, sizeof(key)); tor_free(buf); crypto_cipher_free(cipher); return -1; } -/** Invert crypto_pk_obsolete_public_hybrid_encrypt. Returns the number of - * bytes written on success, -1 on failure. - * - * NOTE that this format does not authenticate the symmetrically encrypted - * part of the data, and SHOULD NOT BE USED for new protocols. - */ +/** Invert crypto_pk_public_hybrid_encrypt. */ int -crypto_pk_obsolete_private_hybrid_decrypt(crypto_pk_t *env, +crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to, size_t tolen, const char *from, @@ -1427,12 +1242,12 @@ crypto_pk_asn1_decode(const char *str, size_t len) * Return 0 on success, -1 on failure. */ int -crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out) +crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out) { unsigned char *buf = NULL; int len; - len = i2d_RSAPublicKey((RSA*)pk->key, &buf); + len = i2d_RSAPublicKey(pk->key, &buf); if (len < 0 || buf == NULL) return -1; if (crypto_digest(digest_out, (char*)buf, len) < 0) { @@ -1446,7 +1261,7 @@ crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out) /** Compute all digests of the DER encoding of pk, and store them * in digests_out. Return 0 on success, -1 on failure. */ int -crypto_pk_get_common_digests(crypto_pk_t *pk, common_digests_t *digests_out) +crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out) { unsigned char *buf = NULL; int len; @@ -1454,7 +1269,7 @@ crypto_pk_get_common_digests(crypto_pk_t *pk, common_digests_t *digests_out) len = i2d_RSAPublicKey(pk->key, &buf); if (len < 0 || buf == NULL) return -1; - if (crypto_common_digests(digests_out, (char*)buf, len) < 0) { + if (crypto_digest_all(digests_out, (char*)buf, len) < 0) { OPENSSL_free(buf); return -1; } @@ -1463,7 +1278,7 @@ crypto_pk_get_common_digests(crypto_pk_t *pk, common_digests_t *digests_out) } /** Copy in to the outlen-byte buffer out, adding spaces - * every four characters. */ + * every four spaces. */ void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in) { @@ -1509,125 +1324,38 @@ crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space) return 0; } -/** Given a private or public key pk, put a hashed fingerprint of - * the public key into fp_out (must have at least FINGERPRINT_LEN+1 - * bytes of space). Return 0 on success, -1 on failure. - * - * Hashed fingerprints are computed as the SHA1 digest of the SHA1 digest - * of the ASN.1 encoding of the public key, converted to hexadecimal, in - * upper case. - */ -int -crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out) -{ - char digest[DIGEST_LEN], hashed_digest[DIGEST_LEN]; - if (crypto_pk_get_digest(pk, digest)) { - return -1; - } - if (crypto_digest(hashed_digest, digest, DIGEST_LEN) < 0) { - return -1; - } - base16_encode(fp_out, FINGERPRINT_LEN + 1, hashed_digest, DIGEST_LEN); - return 0; -} - -/** Given a crypto_pk_t pk, allocate a new buffer containing the - * Base64 encoding of the DER representation of the private key as a NUL - * terminated string, and return it via priv_out. Return 0 on - * sucess, -1 on failure. - * - * It is the caller's responsibility to sanitize and free the resulting buffer. - */ -int -crypto_pk_base64_encode(const crypto_pk_t *pk, char **priv_out) -{ - unsigned char *der = NULL; - int der_len; - int ret = -1; - - *priv_out = NULL; - - der_len = i2d_RSAPrivateKey(pk->key, &der); - if (der_len < 0 || der == NULL) - return ret; - - size_t priv_len = base64_encode_size(der_len, 0) + 1; - char *priv = tor_malloc_zero(priv_len); - if (base64_encode(priv, priv_len, (char *)der, der_len, 0) >= 0) { - *priv_out = priv; - ret = 0; - } else { - tor_free(priv); - } - - memwipe(der, 0, der_len); - OPENSSL_free(der); - return ret; -} +/* symmetric crypto */ -/** Given a string containing the Base64 encoded DER representation of the - * private key str, decode and return the result on success, or NULL - * on failure. +/** Return a pointer to the key set for the cipher in env. */ -crypto_pk_t * -crypto_pk_base64_decode(const char *str, size_t len) +const char * +crypto_cipher_get_key(crypto_cipher_t *env) { - crypto_pk_t *pk = NULL; - - char *der = tor_malloc_zero(len + 1); - int der_len = base64_decode(der, len, str, len); - if (der_len <= 0) { - log_warn(LD_CRYPTO, "Stored RSA private key seems corrupted (base64)."); - goto out; - } - - const unsigned char *dp = (unsigned char*)der; /* Shut the compiler up. */ - RSA *rsa = d2i_RSAPrivateKey(NULL, &dp, der_len); - if (!rsa) { - crypto_log_errors(LOG_WARN, "decoding private key"); - goto out; - } - - pk = crypto_new_pk_from_rsa_(rsa); - - /* Make sure it's valid. */ - if (crypto_pk_check_key(pk) <= 0) { - crypto_pk_free(pk); - pk = NULL; - goto out; - } - - out: - memwipe(der, 0, len + 1); - tor_free(der); - return pk; + return env->key; } -/* symmetric crypto */ - /** Encrypt fromlen bytes from from using the cipher * env; on success, store the result to to and return 0. - * Does not check for failure. + * On failure, return -1. */ int crypto_cipher_encrypt(crypto_cipher_t *env, char *to, const char *from, size_t fromlen) { tor_assert(env); - tor_assert(env); + tor_assert(env->cipher); tor_assert(from); tor_assert(fromlen); tor_assert(to); tor_assert(fromlen < SIZE_T_CEILING); - memcpy(to, from, fromlen); - aes_crypt_inplace(env, to, fromlen); + aes_crypt(env->cipher, from, fromlen, to); return 0; } /** Decrypt fromlen bytes from from using the cipher * env; on success, store the result to to and return 0. - * Does not check for failure. + * On failure, return -1. */ int crypto_cipher_decrypt(crypto_cipher_t *env, char *to, @@ -1638,19 +1366,19 @@ crypto_cipher_decrypt(crypto_cipher_t *env, char *to, tor_assert(to); tor_assert(fromlen < SIZE_T_CEILING); - memcpy(to, from, fromlen); - aes_crypt_inplace(env, to, fromlen); + aes_crypt(env->cipher, from, fromlen, to); return 0; } /** Encrypt len bytes on from using the cipher in env; - * on success. Does not check for failure. + * on success, return 0. On failure, return -1. */ -void +int crypto_cipher_crypt_inplace(crypto_cipher_t *env, char *buf, size_t len) { tor_assert(len < SIZE_T_CEILING); - aes_crypt_inplace(env, buf, len); + aes_crypt_inplace(env->cipher, buf, len); + return 0; } /** Encrypt fromlen bytes (at least 1) from from with the key in @@ -1674,14 +1402,11 @@ crypto_cipher_encrypt_with_iv(const char *key, if (tolen < fromlen + CIPHER_IV_LEN) return -1; - char iv[CIPHER_IV_LEN]; - crypto_rand(iv, sizeof(iv)); - cipher = crypto_cipher_new_with_iv(key, iv); + cipher = crypto_cipher_new_with_iv(key, NULL); - memcpy(to, iv, CIPHER_IV_LEN); + memcpy(to, cipher->iv, CIPHER_IV_LEN); crypto_cipher_encrypt(cipher, to+CIPHER_IV_LEN, from, fromlen); crypto_cipher_free(cipher); - memwipe(iv, 0, sizeof(iv)); return (int)(fromlen + CIPHER_IV_LEN); } @@ -1725,9 +1450,7 @@ crypto_digest(char *digest, const char *m, size_t len) { tor_assert(m); tor_assert(digest); - if (SHA1((const unsigned char*)m,len,(unsigned char*)digest) == NULL) - return -1; - return 0; + return (SHA1((const unsigned char*)m,len,(unsigned char*)digest) == NULL); } /** Compute a 256-bit digest of len bytes in data stored in m, @@ -1739,57 +1462,25 @@ crypto_digest256(char *digest, const char *m, size_t len, { tor_assert(m); tor_assert(digest); - tor_assert(algorithm == DIGEST_SHA256 || algorithm == DIGEST_SHA3_256); - - int ret = 0; - if (algorithm == DIGEST_SHA256) - ret = (SHA256((const uint8_t*)m,len,(uint8_t*)digest) != NULL); - else - ret = (sha3_256((uint8_t *)digest, DIGEST256_LEN,(const uint8_t *)m, len) - > -1); - - if (!ret) - return -1; - return 0; -} - -/** Compute a 512-bit digest of len bytes in data stored in m, - * using the algorithm algorithm. Write the DIGEST_LEN512-byte result - * into digest. Return 0 on success, -1 on failure. */ -int -crypto_digest512(char *digest, const char *m, size_t len, - digest_algorithm_t algorithm) -{ - tor_assert(m); - tor_assert(digest); - tor_assert(algorithm == DIGEST_SHA512 || algorithm == DIGEST_SHA3_512); - - int ret = 0; - if (algorithm == DIGEST_SHA512) - ret = (SHA512((const unsigned char*)m,len,(unsigned char*)digest) - != NULL); - else - ret = (sha3_512((uint8_t*)digest, DIGEST512_LEN, (const uint8_t*)m, len) - > -1); - - if (!ret) - return -1; - return 0; + tor_assert(algorithm == DIGEST_SHA256); + return (SHA256((const unsigned char*)m,len,(unsigned char*)digest) == NULL); } -/** Set the common_digests_t in ds_out to contain every digest on the +/** Set the digests_t in ds_out to contain every digest on the * len bytes in m that we know how to compute. Return 0 on * success, -1 on failure. */ int -crypto_common_digests(common_digests_t *ds_out, const char *m, size_t len) +crypto_digest_all(digests_t *ds_out, const char *m, size_t len) { + int i; tor_assert(ds_out); memset(ds_out, 0, sizeof(*ds_out)); if (crypto_digest(ds_out->d[DIGEST_SHA1], m, len) < 0) return -1; - if (crypto_digest256(ds_out->d[DIGEST_SHA256], m, len, DIGEST_SHA256) < 0) - return -1; - + for (i = DIGEST_SHA256; i < N_DIGEST_ALGORITHMS; ++i) { + if (crypto_digest256(ds_out->d[i], m, len, i) < 0) + return -1; + } return 0; } @@ -1802,17 +1493,9 @@ crypto_digest_algorithm_get_name(digest_algorithm_t alg) return "sha1"; case DIGEST_SHA256: return "sha256"; - case DIGEST_SHA512: - return "sha512"; - case DIGEST_SHA3_256: - return "sha3-256"; - case DIGEST_SHA3_512: - return "sha3-512"; - // LCOV_EXCL_START default: tor_fragile_assert(); return "??unknown_digest??"; - // LCOV_EXCL_STOP } } @@ -1825,135 +1508,30 @@ crypto_digest_algorithm_parse_name(const char *name) return DIGEST_SHA1; else if (!strcmp(name, "sha256")) return DIGEST_SHA256; - else if (!strcmp(name, "sha512")) - return DIGEST_SHA512; - else if (!strcmp(name, "sha3-256")) - return DIGEST_SHA3_256; - else if (!strcmp(name, "sha3-512")) - return DIGEST_SHA3_512; else return -1; } -/** Given an algorithm, return the digest length in bytes. */ -size_t -crypto_digest_algorithm_get_length(digest_algorithm_t alg) -{ - switch (alg) { - case DIGEST_SHA1: - return DIGEST_LEN; - case DIGEST_SHA256: - return DIGEST256_LEN; - case DIGEST_SHA512: - return DIGEST512_LEN; - case DIGEST_SHA3_256: - return DIGEST256_LEN; - case DIGEST_SHA3_512: - return DIGEST512_LEN; - default: - tor_assert(0); // LCOV_EXCL_LINE - return 0; /* Unreachable */ // LCOV_EXCL_LINE - } -} - /** Intermediate information about the digest of a stream of data. */ struct crypto_digest_t { - digest_algorithm_t algorithm; /**< Which algorithm is in use? */ - /** State for the digest we're using. Only one member of the - * union is usable, depending on the value of algorithm. Note also - * that space for other members might not even be allocated! - */ union { SHA_CTX sha1; /**< state for SHA1 */ SHA256_CTX sha2; /**< state for SHA256 */ - SHA512_CTX sha512; /**< state for SHA512 */ - keccak_state sha3; /**< state for SHA3-[256,512] */ - } d; + } d; /**< State for the digest we're using. Only one member of the + * union is usable, depending on the value of algorithm. */ + ENUM_BF(digest_algorithm_t) algorithm : 8; /**< Which algorithm is in use? */ }; -#ifdef TOR_UNIT_TESTS - -digest_algorithm_t -crypto_digest_get_algorithm(crypto_digest_t *digest) -{ - tor_assert(digest); - - return digest->algorithm; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - -/** - * Return the number of bytes we need to malloc in order to get a - * crypto_digest_t for alg, or the number of bytes we need to wipe - * when we free one. - */ -static size_t -crypto_digest_alloc_bytes(digest_algorithm_t alg) -{ - /* Helper: returns the number of bytes in the 'f' field of 'st' */ -#define STRUCT_FIELD_SIZE(st, f) (sizeof( ((st*)0)->f )) - /* Gives the length of crypto_digest_t through the end of the field 'd' */ -#define END_OF_FIELD(f) (offsetof(crypto_digest_t, f) + \ - STRUCT_FIELD_SIZE(crypto_digest_t, f)) - switch (alg) { - case DIGEST_SHA1: - return END_OF_FIELD(d.sha1); - case DIGEST_SHA256: - return END_OF_FIELD(d.sha2); - case DIGEST_SHA512: - return END_OF_FIELD(d.sha512); - case DIGEST_SHA3_256: - case DIGEST_SHA3_512: - return END_OF_FIELD(d.sha3); - default: - tor_assert(0); // LCOV_EXCL_LINE - return 0; // LCOV_EXCL_LINE - } -#undef END_OF_FIELD -#undef STRUCT_FIELD_SIZE -} - -/** - * Internal function: create and return a new digest object for 'algorithm'. - * Does not typecheck the algorithm. - */ -static crypto_digest_t * -crypto_digest_new_internal(digest_algorithm_t algorithm) -{ - crypto_digest_t *r = tor_malloc(crypto_digest_alloc_bytes(algorithm)); - r->algorithm = algorithm; - - switch (algorithm) - { - case DIGEST_SHA1: - SHA1_Init(&r->d.sha1); - break; - case DIGEST_SHA256: - SHA256_Init(&r->d.sha2); - break; - case DIGEST_SHA512: - SHA512_Init(&r->d.sha512); - break; - case DIGEST_SHA3_256: - keccak_digest_init(&r->d.sha3, 256); - break; - case DIGEST_SHA3_512: - keccak_digest_init(&r->d.sha3, 512); - break; - default: - tor_assert_unreached(); - } - - return r; -} - /** Allocate and return a new digest object to compute SHA1 digests. */ crypto_digest_t * crypto_digest_new(void) { - return crypto_digest_new_internal(DIGEST_SHA1); + crypto_digest_t *r; + r = tor_malloc(sizeof(crypto_digest_t)); + SHA1_Init(&r->d.sha1); + r->algorithm = DIGEST_SHA1; + return r; } /** Allocate and return a new digest object to compute 256-bit digests @@ -1961,28 +1539,22 @@ crypto_digest_new(void) crypto_digest_t * crypto_digest256_new(digest_algorithm_t algorithm) { - tor_assert(algorithm == DIGEST_SHA256 || algorithm == DIGEST_SHA3_256); - return crypto_digest_new_internal(algorithm); -} - -/** Allocate and return a new digest object to compute 512-bit digests - * using algorithm. */ -crypto_digest_t * -crypto_digest512_new(digest_algorithm_t algorithm) -{ - tor_assert(algorithm == DIGEST_SHA512 || algorithm == DIGEST_SHA3_512); - return crypto_digest_new_internal(algorithm); + crypto_digest_t *r; + tor_assert(algorithm == DIGEST_SHA256); + r = tor_malloc(sizeof(crypto_digest_t)); + SHA256_Init(&r->d.sha2); + r->algorithm = algorithm; + return r; } /** Deallocate a digest object. */ void -crypto_digest_free_(crypto_digest_t *digest) +crypto_digest_free(crypto_digest_t *digest) { if (!digest) return; - size_t bytes = crypto_digest_alloc_bytes(digest->algorithm); - memwipe(digest, 0, bytes); + memwipe(digest, 0, sizeof(crypto_digest_t)); tor_free(digest); } @@ -2006,65 +1578,42 @@ crypto_digest_add_bytes(crypto_digest_t *digest, const char *data, case DIGEST_SHA256: SHA256_Update(&digest->d.sha2, (void*)data, len); break; - case DIGEST_SHA512: - SHA512_Update(&digest->d.sha512, (void*)data, len); - break; - case DIGEST_SHA3_256: /* FALLSTHROUGH */ - case DIGEST_SHA3_512: - keccak_digest_update(&digest->d.sha3, (const uint8_t *)data, len); - break; default: - /* LCOV_EXCL_START */ tor_fragile_assert(); break; - /* LCOV_EXCL_STOP */ } } /** Compute the hash of the data that has been passed to the digest * object; write the first out_len bytes of the result to out. - * out_len must be \<= DIGEST512_LEN. + * out_len must be \<= DIGEST256_LEN. */ void crypto_digest_get_digest(crypto_digest_t *digest, char *out, size_t out_len) { - unsigned char r[DIGEST512_LEN]; + unsigned char r[DIGEST256_LEN]; crypto_digest_t tmpenv; tor_assert(digest); tor_assert(out); - tor_assert(out_len <= crypto_digest_algorithm_get_length(digest->algorithm)); - - /* The SHA-3 code handles copying into a temporary ctx, and also can handle - * short output buffers by truncating appropriately. */ - if (digest->algorithm == DIGEST_SHA3_256 || - digest->algorithm == DIGEST_SHA3_512) { - keccak_digest_sum(&digest->d.sha3, (uint8_t *)out, out_len); - return; - } - - const size_t alloc_bytes = crypto_digest_alloc_bytes(digest->algorithm); /* memcpy into a temporary ctx, since SHA*_Final clears the context */ - memcpy(&tmpenv, digest, alloc_bytes); + memcpy(&tmpenv, digest, sizeof(crypto_digest_t)); switch (digest->algorithm) { case DIGEST_SHA1: + tor_assert(out_len <= DIGEST_LEN); SHA1_Final(r, &tmpenv.d.sha1); break; case DIGEST_SHA256: + tor_assert(out_len <= DIGEST256_LEN); SHA256_Final(r, &tmpenv.d.sha2); break; - case DIGEST_SHA512: - SHA512_Final(r, &tmpenv.d.sha512); - break; -//LCOV_EXCL_START - case DIGEST_SHA3_256: /* FALLSTHROUGH */ - case DIGEST_SHA3_512: default: - log_warn(LD_BUG, "Handling unexpected algorithm %d", digest->algorithm); - /* This is fatal, because it should never happen. */ - tor_assert_unreached(); + log_warn(LD_BUG, "Called with unknown algorithm %d", digest->algorithm); + /* If fragile_assert is not enabled, then we should at least not + * leak anything. */ + memset(r, 0xff, sizeof(r)); + tor_fragile_assert(); break; -//LCOV_EXCL_STOP } memcpy(out, r, out_len); memwipe(r, 0, sizeof(r)); @@ -2076,14 +1625,15 @@ crypto_digest_get_digest(crypto_digest_t *digest, crypto_digest_t * crypto_digest_dup(const crypto_digest_t *digest) { + crypto_digest_t *r; tor_assert(digest); - const size_t alloc_bytes = crypto_digest_alloc_bytes(digest->algorithm); - return tor_memdup(digest, alloc_bytes); + r = tor_malloc(sizeof(crypto_digest_t)); + memcpy(r,digest,sizeof(crypto_digest_t)); + return r; } /** Replace the state of the digest object into with the state - * of the digest object from. Requires that 'into' and 'from' - * have the same digest type. + * of the digest object from. */ void crypto_digest_assign(crypto_digest_t *into, @@ -2091,41 +1641,24 @@ crypto_digest_assign(crypto_digest_t *into, { tor_assert(into); tor_assert(from); - tor_assert(into->algorithm == from->algorithm); - const size_t alloc_bytes = crypto_digest_alloc_bytes(from->algorithm); - memcpy(into,from,alloc_bytes); + memcpy(into,from,sizeof(crypto_digest_t)); } /** Given a list of strings in lst, set the len_out-byte digest * at digest_out to the hash of the concatenation of those strings, * plus the optional string append, computed with the algorithm * alg. - * out_len must be \<= DIGEST512_LEN. */ + * out_len must be \<= DIGEST256_LEN. */ void crypto_digest_smartlist(char *digest_out, size_t len_out, - const smartlist_t *lst, - const char *append, + const smartlist_t *lst, const char *append, digest_algorithm_t alg) { - crypto_digest_smartlist_prefix(digest_out, len_out, NULL, lst, append, alg); -} - -/** Given a list of strings in lst, set the len_out-byte digest - * at digest_out to the hash of the concatenation of: the - * optional string prepend, those strings, - * and the optional string append, computed with the algorithm - * alg. - * len_out must be \<= DIGEST512_LEN. */ -void -crypto_digest_smartlist_prefix(char *digest_out, size_t len_out, - const char *prepend, - const smartlist_t *lst, - const char *append, - digest_algorithm_t alg) -{ - crypto_digest_t *d = crypto_digest_new_internal(alg); - if (prepend) - crypto_digest_add_bytes(d, prepend, strlen(prepend)); + crypto_digest_t *d; + if (alg == DIGEST_SHA1) + d = crypto_digest_new(); + else + d = crypto_digest256_new(alg); SMARTLIST_FOREACH(lst, const char *, cp, crypto_digest_add_bytes(d, cp, strlen(cp))); if (append) @@ -2136,100 +1669,18 @@ crypto_digest_smartlist_prefix(char *digest_out, size_t len_out, /** Compute the HMAC-SHA-256 of the msg_len bytes in msg, using * the key of length key_len. Store the DIGEST256_LEN-byte - * result in hmac_out. Asserts on failure. + * result in hmac_out. */ void crypto_hmac_sha256(char *hmac_out, const char *key, size_t key_len, const char *msg, size_t msg_len) { - unsigned char *rv = NULL; /* If we've got OpenSSL >=0.9.8 we can use its hmac implementation. */ tor_assert(key_len < INT_MAX); tor_assert(msg_len < INT_MAX); - tor_assert(hmac_out); - rv = HMAC(EVP_sha256(), key, (int)key_len, (unsigned char*)msg, (int)msg_len, - (unsigned char*)hmac_out, NULL); - tor_assert(rv); -} - -/** Compute a MAC using SHA3-256 of msg_len bytes in msg using a - * key of length key_len and a salt of length - * salt_len. Store the result of len_out bytes in in - * mac_out. This function can't fail. */ -void -crypto_mac_sha3_256(uint8_t *mac_out, size_t len_out, - const uint8_t *key, size_t key_len, - const uint8_t *msg, size_t msg_len) -{ - crypto_digest_t *digest; - - const uint64_t key_len_netorder = tor_htonll(key_len); - - tor_assert(mac_out); - tor_assert(key); - tor_assert(msg); - - digest = crypto_digest256_new(DIGEST_SHA3_256); - - /* Order matters here that is any subsystem using this function should - * expect this very precise ordering in the MAC construction. */ - crypto_digest_add_bytes(digest, (const char *) &key_len_netorder, - sizeof(key_len_netorder)); - crypto_digest_add_bytes(digest, (const char *) key, key_len); - crypto_digest_add_bytes(digest, (const char *) msg, msg_len); - crypto_digest_get_digest(digest, (char *) mac_out, len_out); - crypto_digest_free(digest); -} - -/** Internal state for a eXtendable-Output Function (XOF). */ -struct crypto_xof_t { - keccak_state s; -}; - -/** Allocate a new XOF object backed by SHAKE-256. The security level - * provided is a function of the length of the output used. Read and - * understand FIPS-202 A.2 "Additional Consideration for Extendable-Output - * Functions" before using this construct. - */ -crypto_xof_t * -crypto_xof_new(void) -{ - crypto_xof_t *xof; - xof = tor_malloc(sizeof(crypto_xof_t)); - keccak_xof_init(&xof->s, 256); - return xof; -} - -/** Absorb bytes into a XOF object. Must not be called after a call to - * crypto_xof_squeeze_bytes() for the same instance, and will assert - * if attempted. - */ -void -crypto_xof_add_bytes(crypto_xof_t *xof, const uint8_t *data, size_t len) -{ - int i = keccak_xof_absorb(&xof->s, data, len); - tor_assert(i == 0); -} - -/** Squeeze bytes out of a XOF object. Calling this routine will render - * the XOF instance ineligible to absorb further data. - */ -void -crypto_xof_squeeze_bytes(crypto_xof_t *xof, uint8_t *out, size_t len) -{ - int i = keccak_xof_squeeze(&xof->s, out, len); - tor_assert(i == 0); -} - -/** Cleanse and deallocate a XOF object. */ -void -crypto_xof_free_(crypto_xof_t *xof) -{ - if (!xof) - return; - memwipe(xof, 0, sizeof(crypto_xof_t)); - tor_free(xof); + HMAC(EVP_sha256(), key, (int)key_len, (unsigned char*)msg, (int)msg_len, + (unsigned char*)hmac_out, NULL); } /* DH */ @@ -2244,120 +1695,277 @@ static BIGNUM *dh_param_p_tls = NULL; /** Shared G parameter for our DH key exchanges. */ static BIGNUM *dh_param_g = NULL; -/** Validate a given set of Diffie-Hellman parameters. This is moderately - * computationally expensive (milliseconds), so should only be called when - * the DH parameters change. Returns 0 on success, * -1 on failure. - */ +/** Generate and return a reasonable and safe DH parameter p. */ +static BIGNUM * +crypto_generate_dynamic_dh_modulus(void) +{ + BIGNUM *dynamic_dh_modulus; + DH *dh_parameters; + int r, dh_codes; + char *s; + + dynamic_dh_modulus = BN_new(); + tor_assert(dynamic_dh_modulus); + + dh_parameters = DH_generate_parameters(DH_BYTES*8, DH_GENERATOR, NULL, NULL); + tor_assert(dh_parameters); + + r = DH_check(dh_parameters, &dh_codes); + tor_assert(r && !dh_codes); + + BN_copy(dynamic_dh_modulus, dh_parameters->p); + tor_assert(dynamic_dh_modulus); + + DH_free(dh_parameters); + + { /* log the dynamic DH modulus: */ + s = BN_bn2hex(dynamic_dh_modulus); + tor_assert(s); + log_info(LD_OR, "Dynamic DH modulus generated: [%s]", s); + OPENSSL_free(s); + } + + return dynamic_dh_modulus; +} + +/** Store our dynamic DH modulus (and its group parameters) to + fname for future use. */ static int -crypto_validate_dh_params(const BIGNUM *p, const BIGNUM *g) +crypto_store_dynamic_dh_modulus(const char *fname) { + int len, new_len; DH *dh = NULL; - int ret = -1; + unsigned char *dh_string_repr = NULL; + char *base64_encoded_dh = NULL; + char *file_string = NULL; + int retval = -1; + static const char file_header[] = "# This file contains stored Diffie-" + "Hellman parameters for future use.\n# You *do not* need to edit this " + "file.\n\n"; + + tor_assert(fname); + + if (!dh_param_p_tls) { + log_info(LD_CRYPTO, "Tried to store a DH modulus that does not exist."); + goto done; + } - /* Copy into a temporary DH object, just so that DH_check() can be called. */ if (!(dh = DH_new())) - goto out; -#ifdef OPENSSL_1_1_API - BIGNUM *dh_p, *dh_g; - if (!(dh_p = BN_dup(p))) - goto out; - if (!(dh_g = BN_dup(g))) - goto out; - if (!DH_set0_pqg(dh, dh_p, NULL, dh_g)) - goto out; -#else /* !(defined(OPENSSL_1_1_API)) */ - if (!(dh->p = BN_dup(p))) - goto out; - if (!(dh->g = BN_dup(g))) - goto out; -#endif /* defined(OPENSSL_1_1_API) */ - - /* Perform the validation. */ - int codes = 0; - if (!DH_check(dh, &codes)) - goto out; - if (BN_is_word(g, DH_GENERATOR_2)) { - /* Per https://wiki.openssl.org/index.php/Diffie-Hellman_parameters - * - * OpenSSL checks the prime is congruent to 11 when g = 2; while the - * IETF's primes are congruent to 23 when g = 2. - */ - BN_ULONG residue = BN_mod_word(p, 24); - if (residue == 11 || residue == 23) - codes &= ~DH_NOT_SUITABLE_GENERATOR; + goto done; + if (!(dh->p = BN_dup(dh_param_p_tls))) + goto done; + if (!(dh->g = BN_new())) + goto done; + if (!BN_set_word(dh->g, DH_GENERATOR)) + goto done; + + len = i2d_DHparams(dh, &dh_string_repr); + if ((len < 0) || (dh_string_repr == NULL)) { + log_warn(LD_CRYPTO, "Error occured while DER encoding DH modulus (2)."); + goto done; + } + + base64_encoded_dh = tor_malloc_zero(len * 2); /* should be enough */ + new_len = base64_encode(base64_encoded_dh, len * 2, + (char *)dh_string_repr, len); + if (new_len < 0) { + log_warn(LD_CRYPTO, "Error occured while base64-encoding DH modulus."); + goto done; } - if (codes != 0) /* Specifics on why the params suck is irrelevant. */ - goto out; - /* Things are probably not evil. */ - ret = 0; + /* concatenate file header and the dh parameters blob */ + new_len = tor_asprintf(&file_string, "%s%s", file_header, base64_encoded_dh); - out: + /* write to file */ + if (write_bytes_to_new_file(fname, file_string, new_len, 0) < 0) { + log_info(LD_CRYPTO, "'%s' was already occupied.", fname); + goto done; + } + + retval = 0; + + done: if (dh) DH_free(dh); - return ret; + if (dh_string_repr) + OPENSSL_free(dh_string_repr); + tor_free(base64_encoded_dh); + tor_free(file_string); + + return retval; } -/** Set the global Diffie-Hellman generator, used for both TLS and internal - * DH stuff. - */ -static void -crypto_set_dh_generator(void) +/** Return the dynamic DH modulus stored in fname. If there is no + dynamic DH modulus stored in fname, return NULL. */ +static BIGNUM * +crypto_get_stored_dynamic_dh_modulus(const char *fname) { - BIGNUM *generator; - int r; + int retval; + char *contents = NULL; + const char *contents_tmp = NULL; + int dh_codes; + DH *stored_dh = NULL; + BIGNUM *dynamic_dh_modulus = NULL; + int length = 0; + unsigned char *base64_decoded_dh = NULL; + const unsigned char *cp = NULL; - if (dh_param_g) - return; + tor_assert(fname); - generator = BN_new(); - tor_assert(generator); + contents = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); + if (!contents) { + log_info(LD_CRYPTO, "Could not open file '%s'", fname); + goto done; /*usually means that ENOENT. don't try to move file to broken.*/ + } - r = BN_set_word(generator, DH_GENERATOR); - tor_assert(r); + /* skip the file header */ + contents_tmp = eat_whitespace(contents); + if (!*contents_tmp) { + log_warn(LD_CRYPTO, "Stored dynamic DH modulus file " + "seems corrupted (eat_whitespace)."); + goto err; + } - dh_param_g = generator; + /* 'fname' contains the DH parameters stored in base64-ed DER + * format. We are only interested in the DH modulus. + * NOTE: We allocate more storage here than we need. Since we're already + * doing that, we can also add 1 byte extra to appease Coverity's + * scanner. */ + + cp = base64_decoded_dh = tor_malloc_zero(strlen(contents_tmp) + 1); + length = base64_decode((char *)base64_decoded_dh, strlen(contents_tmp), + contents_tmp, strlen(contents_tmp)); + if (length < 0) { + log_warn(LD_CRYPTO, "Stored dynamic DH modulus seems corrupted (base64)."); + goto err; + } + + stored_dh = d2i_DHparams(NULL, &cp, length); + if ((!stored_dh) || (cp - base64_decoded_dh != length)) { + log_warn(LD_CRYPTO, "Stored dynamic DH modulus seems corrupted (d2i)."); + goto err; + } + + { /* check the cryptographic qualities of the stored dynamic DH modulus: */ + retval = DH_check(stored_dh, &dh_codes); + if (!retval || dh_codes) { + log_warn(LD_CRYPTO, "Stored dynamic DH modulus is not a safe prime."); + goto err; + } + + retval = DH_size(stored_dh); + if (retval < DH_BYTES) { + log_warn(LD_CRYPTO, "Stored dynamic DH modulus is smaller " + "than '%d' bits.", DH_BYTES*8); + goto err; + } + + if (!BN_is_word(stored_dh->g, 2)) { + log_warn(LD_CRYPTO, "Stored dynamic DH parameters do not use '2' " + "as the group generator."); + goto err; + } + } + + { /* log the dynamic DH modulus: */ + char *s = BN_bn2hex(stored_dh->p); + tor_assert(s); + log_info(LD_OR, "Found stored dynamic DH modulus: [%s]", s); + OPENSSL_free(s); + } + + goto done; + + err: + + { + /* move broken prime to $filename.broken */ + char *fname_new=NULL; + tor_asprintf(&fname_new, "%s.broken", fname); + + log_warn(LD_CRYPTO, "Moving broken dynamic DH prime to '%s'.", fname_new); + + if (replace_file(fname, fname_new)) + log_notice(LD_CRYPTO, "Error while moving '%s' to '%s'.", + fname, fname_new); + + tor_free(fname_new); + } + + if (stored_dh) { + DH_free(stored_dh); + stored_dh = NULL; + } + + done: + tor_free(contents); + tor_free(base64_decoded_dh); + + if (stored_dh) { + dynamic_dh_modulus = BN_dup(stored_dh->p); + DH_free(stored_dh); + } + + return dynamic_dh_modulus; } -/** Set the global TLS Diffie-Hellman modulus. Use the Apache mod_ssl DH +/** Set the global TLS Diffie-Hellman modulus. + * If dynamic_dh_modulus_fname is set, try to read a dynamic DH modulus + * off it and use it as the DH modulus. If that's not possible, + * generate a new dynamic DH modulus. + * If dynamic_dh_modulus_fname is NULL, use the Apache mod_ssl DH * modulus. */ void -crypto_set_tls_dh_prime(void) +crypto_set_tls_dh_prime(const char *dynamic_dh_modulus_fname) { BIGNUM *tls_prime = NULL; + int store_dh_prime_afterwards = 0; int r; /* If the space is occupied, free the previous TLS DH prime */ - if (BUG(dh_param_p_tls)) { - /* LCOV_EXCL_START - * - * We shouldn't be calling this twice. - */ + if (dh_param_p_tls) { BN_clear_free(dh_param_p_tls); dh_param_p_tls = NULL; - /* LCOV_EXCL_STOP */ } - tls_prime = BN_new(); - tor_assert(tls_prime); + if (dynamic_dh_modulus_fname) { /* use dynamic DH modulus: */ + log_info(LD_OR, "Using stored dynamic DH modulus."); + tls_prime = crypto_get_stored_dynamic_dh_modulus(dynamic_dh_modulus_fname); - /* This is the 1024-bit safe prime that Apache uses for its DH stuff; see - * modules/ssl/ssl_engine_dh.c; Apache also uses a generator of 2 with this - * prime. - */ - r = BN_hex2bn(&tls_prime, - "D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98" - "BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A" - "467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7" - "DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68" - "B0E7393E0F24218EB3"); - tor_assert(r); + if (!tls_prime) { + log_notice(LD_OR, "Generating fresh dynamic DH modulus. " + "This might take a while..."); + tls_prime = crypto_generate_dynamic_dh_modulus(); + + store_dh_prime_afterwards++; + } + } else { /* use the static DH prime modulus used by Apache in mod_ssl: */ + tls_prime = BN_new(); + tor_assert(tls_prime); + + /* This is the 1024-bit safe prime that Apache uses for its DH stuff; see + * modules/ssl/ssl_engine_dh.c; Apache also uses a generator of 2 with this + * prime. + */ + r =BN_hex2bn(&tls_prime, + "D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98" + "BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A" + "467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7" + "DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68" + "B0E7393E0F24218EB3"); + tor_assert(r); + } tor_assert(tls_prime); dh_param_p_tls = tls_prime; - crypto_set_dh_generator(); - tor_assert(0 == crypto_validate_dh_params(dh_param_p_tls, dh_param_g)); + + if (store_dh_prime_afterwards) + /* save the new dynamic DH modulus to disk. */ + if (crypto_store_dynamic_dh_modulus(dynamic_dh_modulus_fname)) { + log_notice(LD_CRYPTO, "Failed while storing dynamic DH modulus. " + "Make sure your data directory is sane."); + } } /** Initialize dh_param_p and dh_param_g if they are not already @@ -2365,13 +1973,18 @@ crypto_set_tls_dh_prime(void) static void init_dh_param(void) { - BIGNUM *circuit_dh_prime; + BIGNUM *circuit_dh_prime, *generator; int r; - if (BUG(dh_param_p && dh_param_g)) - return; // LCOV_EXCL_LINE This function isn't supposed to be called twice. + if (dh_param_p && dh_param_g) + return; circuit_dh_prime = BN_new(); - tor_assert(circuit_dh_prime); + generator = BN_new(); + tor_assert(circuit_dh_prime && generator); + + /* Set our generator for all DH parameters */ + r = BN_set_word(generator, DH_GENERATOR); + tor_assert(r); /* This is from rfc2409, section 6.2. It's a safe prime, and supposedly it equals: @@ -2387,11 +2000,12 @@ init_dh_param(void) /* Set the new values as the global DH parameters. */ dh_param_p = circuit_dh_prime; - crypto_set_dh_generator(); - tor_assert(0 == crypto_validate_dh_params(dh_param_p, dh_param_g)); + dh_param_g = generator; + /* Ensure that we have TLS DH parameters set up, too, even if we're + going to change them soon. */ if (!dh_param_p_tls) { - crypto_set_tls_dh_prime(); + crypto_set_tls_dh_prime(NULL); } } @@ -2401,8 +2015,7 @@ init_dh_param(void) */ #define DH_PRIVATE_KEY_BITS 320 -/** Allocate and return a new DH object for a key exchange. Returns NULL on - * failure. +/** Allocate and return a new DH object for a key exchange. */ crypto_dh_t * crypto_dh_new(int dh_type) @@ -2418,30 +2031,6 @@ crypto_dh_new(int dh_type) if (!(res->dh = DH_new())) goto err; -#ifdef OPENSSL_1_1_API - BIGNUM *dh_p = NULL, *dh_g = NULL; - - if (dh_type == DH_TYPE_TLS) { - dh_p = BN_dup(dh_param_p_tls); - } else { - dh_p = BN_dup(dh_param_p); - } - if (!dh_p) - goto err; - - dh_g = BN_dup(dh_param_g); - if (!dh_g) { - BN_free(dh_p); - goto err; - } - - if (!DH_set0_pqg(res->dh, dh_p, NULL, dh_g)) { - goto err; - } - - if (!DH_set_length(res->dh, DH_PRIVATE_KEY_BITS)) - goto err; -#else /* !(defined(OPENSSL_1_1_API)) */ if (dh_type == DH_TYPE_TLS) { if (!(res->dh->p = BN_dup(dh_param_p_tls))) goto err; @@ -2454,18 +2043,13 @@ crypto_dh_new(int dh_type) goto err; res->dh->length = DH_PRIVATE_KEY_BITS; -#endif /* defined(OPENSSL_1_1_API) */ return res; - - /* LCOV_EXCL_START - * This error condition is only reached when an allocation fails */ err: crypto_log_errors(LOG_WARN, "creating DH object"); if (res->dh) DH_free(res->dh); /* frees p and g too */ tor_free(res); return NULL; - /* LCOV_EXCL_STOP */ } /** Return a copy of dh, sharing its internal state. */ @@ -2473,8 +2057,6 @@ crypto_dh_t * crypto_dh_dup(const crypto_dh_t *dh) { crypto_dh_t *dh_new = tor_malloc_zero(sizeof(crypto_dh_t)); - tor_assert(dh); - tor_assert(dh->dh); dh_new->dh = dh->dh; DH_up_ref(dh->dh); return dh_new; @@ -2495,32 +2077,12 @@ crypto_dh_get_bytes(crypto_dh_t *dh) int crypto_dh_generate_public(crypto_dh_t *dh) { -#ifndef OPENSSL_1_1_API again: -#endif if (!DH_generate_key(dh->dh)) { - /* LCOV_EXCL_START - * To test this we would need some way to tell openssl to break DH. */ crypto_log_errors(LOG_WARN, "generating DH key"); return -1; - /* LCOV_EXCL_STOP */ - } -#ifdef OPENSSL_1_1_API - /* OpenSSL 1.1.x doesn't appear to let you regenerate a DH key, without - * recreating the DH object. I have no idea what sort of aliasing madness - * can occur here, so do the check, and just bail on failure. - */ - const BIGNUM *pub_key, *priv_key; - DH_get0_key(dh->dh, &pub_key, &priv_key); - if (tor_check_dh_key(LOG_WARN, pub_key)<0) { - log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid. I guess once-in-" - "the-universe chances really do happen. Treating as a failure."); - return -1; } -#else /* !(defined(OPENSSL_1_1_API)) */ if (tor_check_dh_key(LOG_WARN, dh->dh->pub_key)<0) { - /* LCOV_EXCL_START - * If this happens, then openssl's DH implementation is busted. */ log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid. I guess once-in-" "the-universe chances really do happen. Trying again."); /* Free and clear the keys, so OpenSSL will actually try again. */ @@ -2528,9 +2090,7 @@ crypto_dh_generate_public(crypto_dh_t *dh) BN_clear_free(dh->dh->priv_key); dh->dh->pub_key = dh->dh->priv_key = NULL; goto again; - /* LCOV_EXCL_STOP */ } -#endif /* defined(OPENSSL_1_1_API) */ return 0; } @@ -2543,30 +2103,13 @@ crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len) { int bytes; tor_assert(dh); - - const BIGNUM *dh_pub; - -#ifdef OPENSSL_1_1_API - const BIGNUM *dh_priv; - DH_get0_key(dh->dh, &dh_pub, &dh_priv); -#else - dh_pub = dh->dh->pub_key; -#endif /* defined(OPENSSL_1_1_API) */ - - if (!dh_pub) { + if (!dh->dh->pub_key) { if (crypto_dh_generate_public(dh)<0) return -1; - else { -#ifdef OPENSSL_1_1_API - DH_get0_key(dh->dh, &dh_pub, &dh_priv); -#else - dh_pub = dh->dh->pub_key; -#endif - } } - tor_assert(dh_pub); - bytes = BN_num_bytes(dh_pub); + tor_assert(dh->dh->pub_key); + bytes = BN_num_bytes(dh->dh->pub_key); tor_assert(bytes >= 0); if (pubkey_len < (size_t)bytes) { log_warn(LD_CRYPTO, @@ -2576,7 +2119,7 @@ crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len) } memset(pubkey, 0, pubkey_len); - BN_bn2bin(dh_pub, (unsigned char*)(pubkey+(pubkey_len-bytes))); + BN_bn2bin(dh->dh->pub_key, (unsigned char*)(pubkey+(pubkey_len-bytes))); return 0; } @@ -2586,15 +2129,15 @@ crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len) * See http://www.cl.cam.ac.uk/ftp/users/rja14/psandqs.ps.gz for some tips. */ static int -tor_check_dh_key(int severity, const BIGNUM *bn) +tor_check_dh_key(int severity, BIGNUM *bn) { BIGNUM *x; char *s; tor_assert(bn); x = BN_new(); tor_assert(x); - if (BUG(!dh_param_p)) - init_dh_param(); //LCOV_EXCL_LINE we already checked whether we did this. + if (!dh_param_p) + init_dh_param(); BN_set_word(x, 1); if (BN_cmp(bn,x)<=0) { log_fn(severity, LD_CRYPTO, "DH key must be at least 2."); @@ -2616,6 +2159,8 @@ tor_check_dh_key(int severity, const BIGNUM *bn) return -1; } +#undef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) /** Given a DH key exchange object, and our peer's value of g^y (as a * pubkey_len-byte value in pubkey) generate * secret_bytes_out bytes of shared key material and write them @@ -2691,7 +2236,7 @@ int crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, uint8_t *key_out, size_t key_out_len) { - int i, r = -1; + int i; uint8_t *cp, *tmp = tor_malloc(key_in_len+1); uint8_t digest[DIGEST_LEN]; @@ -2702,17 +2247,20 @@ crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, for (cp = key_out, i=0; cp < key_out+key_out_len; ++i, cp += DIGEST_LEN) { tmp[key_in_len] = i; - if (crypto_digest((char*)digest, (const char *)tmp, key_in_len+1) < 0) - goto exit; + if (crypto_digest((char*)digest, (const char *)tmp, key_in_len+1)) + goto err; memcpy(cp, digest, MIN(DIGEST_LEN, key_out_len-(cp-key_out))); } + memwipe(tmp, 0, key_in_len+1); + tor_free(tmp); + memwipe(digest, 0, sizeof(digest)); + return 0; - r = 0; - exit: + err: memwipe(tmp, 0, key_in_len+1); tor_free(tmp); memwipe(digest, 0, sizeof(digest)); - return r; + return -1; } /** Expand some secret key material according to RFC5869, using SHA256 as the @@ -2720,7 +2268,7 @@ crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, * secret key material; the salt_in_len bytes at salt_in and the * info_in_len bytes in info_in_len are the algorithm's "salt" * and "info" parameters respectively. On success, write key_out_len - * bytes to key_out and return 0. Assert on failure. + * bytes to key_out and return 0. On failure, return -1. */ int crypto_expand_key_material_rfc5869_sha256( @@ -2777,7 +2325,7 @@ crypto_expand_key_material_rfc5869_sha256( /** Free a DH key exchange object. */ void -crypto_dh_free_(crypto_dh_t *dh) +crypto_dh_free(crypto_dh_t *dh) { if (!dh) return; @@ -2794,6 +2342,15 @@ crypto_dh_free_(crypto_dh_t *dh) * work for us too. */ #define ADD_ENTROPY 32 +/** True iff it's safe to use RAND_poll after setup. + * + * Versions of OpenSSL prior to 0.9.7k and 0.9.8c had a bug where RAND_poll + * would allocate an fd_set on the stack, open a new file, and try to FD_SET + * that fd without checking whether it fit in the fd_set. Thus, if the + * system has not just been started up, it is unsafe to call */ +#define RAND_POLL_IS_SAFE \ + (OPENSSL_VERSION_NUMBER >= OPENSSL_V(0,9,8,'c')) + /** Set the seed of the weak RNG to a random value. */ void crypto_seed_weak_rng(tor_weak_rng_t *rng) @@ -2803,34 +2360,31 @@ crypto_seed_weak_rng(tor_weak_rng_t *rng) tor_init_weak_random(rng, seed); } -#ifdef TOR_UNIT_TESTS -int break_strongest_rng_syscall = 0; -int break_strongest_rng_fallback = 0; -#endif - /** Try to get out_len bytes of the strongest entropy we can generate, - * via system calls, storing it into out. Return 0 on success, -1 on - * failure. A maximum request size of 256 bytes is imposed. + * storing it into out. */ -static int -crypto_strongest_rand_syscall(uint8_t *out, size_t out_len) +int +crypto_strongest_rand(uint8_t *out, size_t out_len) { - tor_assert(out_len <= MAX_STRONGEST_RAND_SIZE); - -#ifdef TOR_UNIT_TESTS - if (break_strongest_rng_syscall) - return -1; -#endif - -#if defined(_WIN32) +#ifdef _WIN32 static int provider_set = 0; static HCRYPTPROV provider; +#else + static const char *filenames[] = { + "/dev/srandom", "/dev/urandom", "/dev/random", NULL + }; + int fd, i; + size_t n; +#endif +#ifdef _WIN32 if (!provider_set) { if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { - log_warn(LD_CRYPTO, "Can't get CryptoAPI provider [1]"); - return -1; + if ((unsigned long)GetLastError() != (unsigned long)NTE_BAD_KEYSET) { + log_warn(LD_CRYPTO, "Can't get CryptoAPI provider [1]"); + return -1; + } } provider_set = 1; } @@ -2840,218 +2394,34 @@ crypto_strongest_rand_syscall(uint8_t *out, size_t out_len) } return 0; -#elif defined(__linux__) && defined(SYS_getrandom) - static int getrandom_works = 1; /* Be optimitic about our chances... */ - - /* getrandom() isn't as straight foward as getentropy(), and has - * no glibc wrapper. - * - * As far as I can tell from getrandom(2) and the source code, the - * requests we issue will always succeed (though it will block on the - * call if /dev/urandom isn't seeded yet), since we are NOT specifying - * GRND_NONBLOCK and the request is <= 256 bytes. - * - * The manpage is unclear on what happens if a signal interrupts the call - * while the request is blocked due to lack of entropy.... - * - * We optimistically assume that getrandom() is available and functional - * because it is the way of the future, and 2 branch mispredicts pale in - * comparision to the overheads involved with failing to open - * /dev/srandom followed by opening and reading from /dev/urandom. - */ - if (PREDICT_LIKELY(getrandom_works)) { - long ret; - /* A flag of '0' here means to read from '/dev/urandom', and to - * block if insufficient entropy is available to service the - * request. - */ - const unsigned int flags = 0; - do { - ret = syscall(SYS_getrandom, out, out_len, flags); - } while (ret == -1 && ((errno == EINTR) ||(errno == EAGAIN))); - - if (PREDICT_UNLIKELY(ret == -1)) { - /* LCOV_EXCL_START we can't actually make the syscall fail in testing. */ - tor_assert(errno != EAGAIN); - tor_assert(errno != EINTR); - - /* Useful log message for errno. */ - if (errno == ENOSYS) { - log_warn(LD_CRYPTO, "Can't get entropy from getrandom(). " - " You are running a version of Tor built to support" - " getrandom(), but the kernel doesn't implement this" - " implement this function--probably because it is too old?"); - } else { - log_warn(LD_CRYPTO, "Can't get entropy from getrandom(): %s.", - strerror(errno)); - } - - getrandom_works = 0; /* Don't bother trying again. */ - return -1; - /* LCOV_EXCL_STOP */ - } - - tor_assert(ret == (long)out_len); - return 0; - } - - return -1; /* getrandom() previously failed unexpectedly. */ -#elif defined(HAVE_GETENTROPY) - /* getentropy() is what Linux's getrandom() wants to be when it grows up. - * the only gotcha is that requests are limited to 256 bytes. - */ - return getentropy(out, out_len); #else - (void) out; -#endif /* defined(_WIN32) || ... */ - - /* This platform doesn't have a supported syscall based random. */ - return -1; -} - -/** Try to get out_len bytes of the strongest entropy we can generate, - * via the per-platform fallback mechanism, storing it into out. - * Return 0 on success, -1 on failure. A maximum request size of 256 bytes - * is imposed. - */ -static int -crypto_strongest_rand_fallback(uint8_t *out, size_t out_len) -{ -#ifdef TOR_UNIT_TESTS - if (break_strongest_rng_fallback) - return -1; -#endif - -#ifdef _WIN32 - /* Windows exclusively uses crypto_strongest_rand_syscall(). */ - (void)out; - (void)out_len; - return -1; -#else /* !(defined(_WIN32)) */ - static const char *filenames[] = { - "/dev/srandom", "/dev/urandom", "/dev/random", NULL - }; - int fd, i; - size_t n; - for (i = 0; filenames[i]; ++i) { - log_debug(LD_FS, "Considering %s for entropy", filenames[i]); fd = open(sandbox_intern_string(filenames[i]), O_RDONLY, 0); if (fd<0) continue; log_info(LD_CRYPTO, "Reading entropy from \"%s\"", filenames[i]); n = read_all(fd, (char*)out, out_len, 0); close(fd); if (n != out_len) { - /* LCOV_EXCL_START - * We can't make /dev/foorandom actually fail. */ log_warn(LD_CRYPTO, "Error reading from entropy source (read only %lu bytes).", (unsigned long)n); return -1; - /* LCOV_EXCL_STOP */ } return 0; } + log_warn(LD_CRYPTO, "Cannot get strong entropy: no entropy source found."); return -1; -#endif /* defined(_WIN32) */ -} - -/** Try to get out_len bytes of the strongest entropy we can generate, - * storing it into out. Return 0 on success, -1 on failure. A maximum - * request size of 256 bytes is imposed. - */ -STATIC int -crypto_strongest_rand_raw(uint8_t *out, size_t out_len) -{ - static const size_t sanity_min_size = 16; - static const int max_attempts = 3; - tor_assert(out_len <= MAX_STRONGEST_RAND_SIZE); - - /* For buffers >= 16 bytes (128 bits), we sanity check the output by - * zero filling the buffer and ensuring that it actually was at least - * partially modified. - * - * Checking that any individual byte is non-zero seems like it would - * fail too often (p = out_len * 1/256) for comfort, but this is an - * "adjust according to taste" sort of check. - */ - memwipe(out, 0, out_len); - for (int i = 0; i < max_attempts; i++) { - /* Try to use the syscall/OS favored mechanism to get strong entropy. */ - if (crypto_strongest_rand_syscall(out, out_len) != 0) { - /* Try to use the less-favored mechanism to get strong entropy. */ - if (crypto_strongest_rand_fallback(out, out_len) != 0) { - /* Welp, we tried. Hopefully the calling code terminates the process - * since we're basically boned without good entropy. - */ - log_warn(LD_CRYPTO, - "Cannot get strong entropy: no entropy source found."); - return -1; - } - } - - if ((out_len < sanity_min_size) || !tor_mem_is_zero((char*)out, out_len)) - return 0; - } - - /* LCOV_EXCL_START - * - * We tried max_attempts times to fill a buffer >= 128 bits long, - * and each time it returned all '0's. Either the system entropy - * source is busted, or the user should go out and buy a ticket to - * every lottery on the planet. - */ - log_warn(LD_CRYPTO, "Strong OS entropy returned all zero buffer."); - - return -1; - /* LCOV_EXCL_STOP */ -} - -/** Try to get out_len bytes of the strongest entropy we can generate, - * storing it into out. - */ -void -crypto_strongest_rand(uint8_t *out, size_t out_len) -{ -#define DLEN SHA512_DIGEST_LENGTH - /* We're going to hash DLEN bytes from the system RNG together with some - * bytes from the openssl PRNG, in order to yield DLEN bytes. - */ - uint8_t inp[DLEN*2]; - uint8_t tmp[DLEN]; - tor_assert(out); - while (out_len) { - crypto_rand((char*) inp, DLEN); - if (crypto_strongest_rand_raw(inp+DLEN, DLEN) < 0) { - // LCOV_EXCL_START - log_err(LD_CRYPTO, "Failed to load strong entropy when generating an " - "important key. Exiting."); - /* Die with an assertion so we get a stack trace. */ - tor_assert(0); - // LCOV_EXCL_STOP - } - if (out_len >= DLEN) { - SHA512(inp, sizeof(inp), out); - out += DLEN; - out_len -= DLEN; - } else { - SHA512(inp, sizeof(inp), tmp); - memcpy(out, tmp, out_len); - break; - } - } - memwipe(tmp, 0, sizeof(tmp)); - memwipe(inp, 0, sizeof(inp)); -#undef DLEN +#endif } /** Seed OpenSSL's random number generator with bytes from the operating - * system. Return 0 on success, -1 on failure. + * system. startup should be true iff we have just started Tor and + * have not yet allocated a bunch of fds. Return 0 on success, -1 on failure. */ int -crypto_seed_rng(void) +crypto_seed_rng(int startup) { int rand_poll_ok = 0, load_entropy_ok = 0; uint8_t buf[ADD_ENTROPY]; @@ -3059,55 +2429,38 @@ crypto_seed_rng(void) /* OpenSSL has a RAND_poll function that knows about more kinds of * entropy than we do. We'll try calling that, *and* calling our own entropy * functions. If one succeeds, we'll accept the RNG as seeded. */ - rand_poll_ok = RAND_poll(); - if (rand_poll_ok == 0) - log_warn(LD_CRYPTO, "RAND_poll() failed."); // LCOV_EXCL_LINE + if (startup || RAND_POLL_IS_SAFE) { + rand_poll_ok = RAND_poll(); + if (rand_poll_ok == 0) + log_warn(LD_CRYPTO, "RAND_poll() failed."); + } - load_entropy_ok = !crypto_strongest_rand_raw(buf, sizeof(buf)); + load_entropy_ok = !crypto_strongest_rand(buf, sizeof(buf)); if (load_entropy_ok) { RAND_seed(buf, sizeof(buf)); } memwipe(buf, 0, sizeof(buf)); - if ((rand_poll_ok || load_entropy_ok) && RAND_status() == 1) + if (rand_poll_ok || load_entropy_ok) return 0; else return -1; } -/** Write n bytes of strong random data to to. Supports mocking - * for unit tests. - * - * This function is not allowed to fail; if it would fail to generate strong - * entropy, it must terminate the process instead. +/** Write n bytes of strong random data to to. Return 0 on + * success, -1 on failure. */ -MOCK_IMPL(void, +MOCK_IMPL(int, crypto_rand, (char *to, size_t n)) -{ - crypto_rand_unmocked(to, n); -} - -/** Write n bytes of strong random data to to. Most callers - * will want crypto_rand instead. - * - * This function is not allowed to fail; if it would fail to generate strong - * entropy, it must terminate the process instead. - */ -void -crypto_rand_unmocked(char *to, size_t n) { int r; - if (n == 0) - return; - tor_assert(n < INT_MAX); tor_assert(to); r = RAND_bytes((unsigned char*)to, (int)n); - /* We consider a PRNG failure non-survivable. Let's assert so that we get a - * stack trace about where it happened. - */ - tor_assert(r >= 0); + if (r == 0) + crypto_log_errors(LOG_WARN, "generating random data"); + return (r == 1) ? 0 : -1; } /** Return a pseudorandom integer, chosen uniformly from the values @@ -3133,41 +2486,8 @@ crypto_rand_int(unsigned int max) } } -/** Return a pseudorandom integer, chosen uniformly from the values i such - * that min <= i < max. - * - * min MUST be in range [0, max). - * max MUST be in range (min, INT_MAX]. - */ -int -crypto_rand_int_range(unsigned int min, unsigned int max) -{ - tor_assert(min < max); - tor_assert(max <= INT_MAX); - - /* The overflow is avoided here because crypto_rand_int() returns a value - * between 0 and (max - min) inclusive. */ - return min + crypto_rand_int(max - min); -} - -/** As crypto_rand_int_range, but supports uint64_t. */ -uint64_t -crypto_rand_uint64_range(uint64_t min, uint64_t max) -{ - tor_assert(min < max); - return min + crypto_rand_uint64(max - min); -} - -/** As crypto_rand_int_range, but supports time_t. */ -time_t -crypto_rand_time_range(time_t min, time_t max) -{ - tor_assert(min < max); - return min + (time_t)crypto_rand_uint64(max - min); -} - /** Return a pseudorandom 64-bit integer, chosen uniformly from the values - * between 0 and max-1 inclusive. */ + * between 0 and max-1. */ uint64_t crypto_rand_uint64(uint64_t max) { @@ -3196,22 +2516,22 @@ crypto_rand_double(void) { /* We just use an unsigned int here; we don't really care about getting * more than 32 bits of resolution */ - unsigned int u; - crypto_rand((char*)&u, sizeof(u)); + unsigned int uint; + crypto_rand((char*)&uint, sizeof(uint)); #if SIZEOF_INT == 4 #define UINT_MAX_AS_DOUBLE 4294967296.0 #elif SIZEOF_INT == 8 #define UINT_MAX_AS_DOUBLE 1.8446744073709552e+19 #else #error SIZEOF_INT is neither 4 nor 8 -#endif /* SIZEOF_INT == 4 || ... */ - return ((double)u) / UINT_MAX_AS_DOUBLE; +#endif + return ((double)uint) / UINT_MAX_AS_DOUBLE; } /** Generate and return a new random hostname starting with prefix, * ending with suffix, and containing no fewer than * min_rand_len and no more than max_rand_len random base32 - * characters. Does not check for failure. + * characters between. * * Clip max_rand_len to MAX_DNS_LABEL_SIZE. **/ @@ -3228,7 +2548,7 @@ crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, if (min_rand_len > max_rand_len) min_rand_len = max_rand_len; - randlen = crypto_rand_int_range(min_rand_len, max_rand_len+1); + randlen = min_rand_len + crypto_rand_int(max_rand_len - min_rand_len + 1); prefixlen = strlen(prefix); resultlen = prefixlen + strlen(suffix) + randlen + 16; @@ -3275,10 +2595,385 @@ smartlist_shuffle(smartlist_t *sl) } } +/** Base64 encode srclen bytes of data from src. Write + * the result into dest, if it will fit within destlen + * bytes. Return the number of bytes written on success; -1 if + * destlen is too short, or other failure. + */ +int +base64_encode(char *dest, size_t destlen, const char *src, size_t srclen) +{ + /* FFFF we might want to rewrite this along the lines of base64_decode, if + * it ever shows up in the profile. */ + EVP_ENCODE_CTX ctx; + int len, ret; + tor_assert(srclen < INT_MAX); + + /* 48 bytes of input -> 64 bytes of output plus newline. + Plus one more byte, in case I'm wrong. + */ + if (destlen < ((srclen/48)+1)*66) + return -1; + if (destlen > SIZE_T_CEILING) + return -1; + + EVP_EncodeInit(&ctx); + EVP_EncodeUpdate(&ctx, (unsigned char*)dest, &len, + (unsigned char*)src, (int)srclen); + EVP_EncodeFinal(&ctx, (unsigned char*)(dest+len), &ret); + ret += len; + return ret; +} + +/** @{ */ +/** Special values used for the base64_decode_table */ +#define X 255 +#define SP 64 +#define PAD 65 +/** @} */ +/** Internal table mapping byte values to what they represent in base64. + * Numbers 0..63 are 6-bit integers. SPs are spaces, and should be + * skipped. Xs are invalid and must not appear in base64. PAD indicates + * end-of-string. */ +static const uint8_t base64_decode_table[256] = { + X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, /* */ + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, + X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, + X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, +}; + +/** Base64 decode srclen bytes of data from src. Write + * the result into dest, if it will fit within destlen + * bytes. Return the number of bytes written on success; -1 if + * destlen is too short, or other failure. + * + * NOTE 1: destlen is checked conservatively, as though srclen contained no + * spaces or padding. + * + * NOTE 2: This implementation does not check for the correct number of + * padding "=" characters at the end of the string, and does not check + * for internal padding characters. + */ +int +base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) +{ +#ifdef USE_OPENSSL_BASE64 + EVP_ENCODE_CTX ctx; + int len, ret; + /* 64 bytes of input -> *up to* 48 bytes of output. + Plus one more byte, in case I'm wrong. + */ + if (destlen < ((srclen/64)+1)*49) + return -1; + if (destlen > SIZE_T_CEILING) + return -1; + + EVP_DecodeInit(&ctx); + EVP_DecodeUpdate(&ctx, (unsigned char*)dest, &len, + (unsigned char*)src, srclen); + EVP_DecodeFinal(&ctx, (unsigned char*)dest, &ret); + ret += len; + return ret; +#else + const char *eos = src+srclen; + uint32_t n=0; + int n_idx=0; + char *dest_orig = dest; + + /* Max number of bits == srclen*6. + * Number of bytes required to hold all bits == (srclen*6)/8. + * Yes, we want to round down: anything that hangs over the end of a + * byte is padding. */ + if (destlen < (srclen*3)/4) + return -1; + if (destlen > SIZE_T_CEILING) + return -1; + + /* Iterate over all the bytes in src. Each one will add 0 or 6 bits to the + * value we're decoding. Accumulate bits in n, and whenever we have + * 24 bits, batch them into 3 bytes and flush those bytes to dest. + */ + for ( ; src < eos; ++src) { + unsigned char c = (unsigned char) *src; + uint8_t v = base64_decode_table[c]; + switch (v) { + case X: + /* This character isn't allowed in base64. */ + return -1; + case SP: + /* This character is whitespace, and has no effect. */ + continue; + case PAD: + /* We've hit an = character: the data is over. */ + goto end_of_loop; + default: + /* We have an actual 6-bit value. Append it to the bits in n. */ + n = (n<<6) | v; + if ((++n_idx) == 4) { + /* We've accumulated 24 bits in n. Flush them. */ + *dest++ = (n>>16); + *dest++ = (n>>8) & 0xff; + *dest++ = (n) & 0xff; + n_idx = 0; + n = 0; + } + } + } + end_of_loop: + /* If we have leftover bits, we need to cope. */ + switch (n_idx) { + case 0: + default: + /* No leftover bits. We win. */ + break; + case 1: + /* 6 leftover bits. That's invalid; we can't form a byte out of that. */ + return -1; + case 2: + /* 12 leftover bits: The last 4 are padding and the first 8 are data. */ + *dest++ = n >> 4; + break; + case 3: + /* 18 leftover bits: The last 2 are padding and the first 16 are data. */ + *dest++ = n >> 10; + *dest++ = n >> 2; + } + + tor_assert((dest-dest_orig) <= (ssize_t)destlen); + tor_assert((dest-dest_orig) <= INT_MAX); + + return (int)(dest-dest_orig); +#endif +} +#undef X +#undef SP +#undef PAD + +/** Base64 encode DIGEST_LINE bytes from digest, remove the trailing = + * and newline characters, and store the nul-terminated result in the first + * BASE64_DIGEST_LEN+1 bytes of d64. */ +int +digest_to_base64(char *d64, const char *digest) +{ + char buf[256]; + base64_encode(buf, sizeof(buf), digest, DIGEST_LEN); + buf[BASE64_DIGEST_LEN] = '\0'; + memcpy(d64, buf, BASE64_DIGEST_LEN+1); + return 0; +} + +/** Given a base64 encoded, nul-terminated digest in d64 (without + * trailing newline or = characters), decode it and store the result in the + * first DIGEST_LEN bytes at digest. */ +int +digest_from_base64(char *digest, const char *d64) +{ +#ifdef USE_OPENSSL_BASE64 + char buf_in[BASE64_DIGEST_LEN+3]; + char buf[256]; + if (strlen(d64) != BASE64_DIGEST_LEN) + return -1; + memcpy(buf_in, d64, BASE64_DIGEST_LEN); + memcpy(buf_in+BASE64_DIGEST_LEN, "=\n\0", 3); + if (base64_decode(buf, sizeof(buf), buf_in, strlen(buf_in)) != DIGEST_LEN) + return -1; + memcpy(digest, buf, DIGEST_LEN); + return 0; +#else + if (base64_decode(digest, DIGEST_LEN, d64, strlen(d64)) == DIGEST_LEN) + return 0; + else + return -1; +#endif +} + +/** Base64 encode DIGEST256_LINE bytes from digest, remove the + * trailing = and newline characters, and store the nul-terminated result in + * the first BASE64_DIGEST256_LEN+1 bytes of d64. */ +int +digest256_to_base64(char *d64, const char *digest) +{ + char buf[256]; + base64_encode(buf, sizeof(buf), digest, DIGEST256_LEN); + buf[BASE64_DIGEST256_LEN] = '\0'; + memcpy(d64, buf, BASE64_DIGEST256_LEN+1); + return 0; +} + +/** Given a base64 encoded, nul-terminated digest in d64 (without + * trailing newline or = characters), decode it and store the result in the + * first DIGEST256_LEN bytes at digest. */ +int +digest256_from_base64(char *digest, const char *d64) +{ +#ifdef USE_OPENSSL_BASE64 + char buf_in[BASE64_DIGEST256_LEN+3]; + char buf[256]; + if (strlen(d64) != BASE64_DIGEST256_LEN) + return -1; + memcpy(buf_in, d64, BASE64_DIGEST256_LEN); + memcpy(buf_in+BASE64_DIGEST256_LEN, "=\n\0", 3); + if (base64_decode(buf, sizeof(buf), buf_in, strlen(buf_in)) != DIGEST256_LEN) + return -1; + memcpy(digest, buf, DIGEST256_LEN); + return 0; +#else + if (base64_decode(digest, DIGEST256_LEN, d64, strlen(d64)) == DIGEST256_LEN) + return 0; + else + return -1; +#endif +} + +/** Implements base32 encoding as in RFC 4648. Limitation: Requires + * that srclen*8 is a multiple of 5. + */ +void +base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) +{ + unsigned int i, v, u; + size_t nbits = srclen * 8, bit; + + tor_assert(srclen < SIZE_T_CEILING/8); + tor_assert((nbits%5) == 0); /* We need an even multiple of 5 bits. */ + tor_assert((nbits/5)+1 <= destlen); /* We need enough space. */ + tor_assert(destlen < SIZE_T_CEILING); + + for (i=0,bit=0; bit < nbits; ++i, bit+=5) { + /* set v to the 16-bit value starting at src[bits/8], 0-padded. */ + v = ((uint8_t)src[bit/8]) << 8; + if (bit+5> (11-(bit%8))) & 0x1F; + dest[i] = BASE32_CHARS[u]; + } + dest[i] = '\0'; +} + +/** Implements base32 decoding as in RFC 4648. Limitation: Requires + * that srclen*5 is a multiple of 8. Returns 0 if successful, -1 otherwise. + */ +int +base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) +{ + /* XXXX we might want to rewrite this along the lines of base64_decode, if + * it ever shows up in the profile. */ + unsigned int i; + size_t nbits, j, bit; + char *tmp; + nbits = srclen * 5; + + tor_assert(srclen < SIZE_T_CEILING / 5); + tor_assert((nbits%8) == 0); /* We need an even multiple of 8 bits. */ + tor_assert((nbits/8) <= destlen); /* We need enough space. */ + tor_assert(destlen < SIZE_T_CEILING); + + /* Convert base32 encoded chars to the 5-bit values that they represent. */ + tmp = tor_malloc_zero(srclen); + for (j = 0; j < srclen; ++j) { + if (src[j] > 0x60 && src[j] < 0x7B) tmp[j] = src[j] - 0x61; + else if (src[j] > 0x31 && src[j] < 0x38) tmp[j] = src[j] - 0x18; + else if (src[j] > 0x40 && src[j] < 0x5B) tmp[j] = src[j] - 0x41; + else { + log_warn(LD_BUG, "illegal character in base32 encoded string"); + tor_free(tmp); + return -1; + } + } + + /* Assemble result byte-wise by applying five possible cases. */ + for (i = 0, bit = 0; bit < nbits; ++i, bit += 8) { + switch (bit % 40) { + case 0: + dest[i] = (((uint8_t)tmp[(bit/5)]) << 3) + + (((uint8_t)tmp[(bit/5)+1]) >> 2); + break; + case 8: + dest[i] = (((uint8_t)tmp[(bit/5)]) << 6) + + (((uint8_t)tmp[(bit/5)+1]) << 1) + + (((uint8_t)tmp[(bit/5)+2]) >> 4); + break; + case 16: + dest[i] = (((uint8_t)tmp[(bit/5)]) << 4) + + (((uint8_t)tmp[(bit/5)+1]) >> 1); + break; + case 24: + dest[i] = (((uint8_t)tmp[(bit/5)]) << 7) + + (((uint8_t)tmp[(bit/5)+1]) << 2) + + (((uint8_t)tmp[(bit/5)+2]) >> 3); + break; + case 32: + dest[i] = (((uint8_t)tmp[(bit/5)]) << 5) + + ((uint8_t)tmp[(bit/5)+1]); + break; + } + } + + memwipe(tmp, 0, srclen); + tor_free(tmp); + tmp = NULL; + return 0; +} + +/** Implement RFC2440-style iterated-salted S2K conversion: convert the + * secret_len-byte secret into a key_out_len byte + * key_out. As in RFC2440, the first 8 bytes of s2k_specifier + * are a salt; the 9th byte describes how much iteration to do. + * Does not support key_out_len > DIGEST_LEN. + */ +void +secret_to_key(char *key_out, size_t key_out_len, const char *secret, + size_t secret_len, const char *s2k_specifier) +{ + crypto_digest_t *d; + uint8_t c; + size_t count, tmplen; + char *tmp; + tor_assert(key_out_len < SIZE_T_CEILING); + +#define EXPBIAS 6 + c = s2k_specifier[8]; + count = ((uint32_t)16 + (c & 15)) << ((c >> 4) + EXPBIAS); +#undef EXPBIAS + + tor_assert(key_out_len <= DIGEST_LEN); + + d = crypto_digest_new(); + tmplen = 8+secret_len; + tmp = tor_malloc(tmplen); + memcpy(tmp,s2k_specifier,8); + memcpy(tmp+8,secret,secret_len); + secret_len += 8; + while (count) { + if (count >= secret_len) { + crypto_digest_add_bytes(d, tmp, secret_len); + count -= secret_len; + } else { + crypto_digest_add_bytes(d, tmp, count); + count = 0; + } + } + crypto_digest_get_digest(d, key_out, key_out_len); + memwipe(tmp, 0, tmplen); + tor_free(tmp); + crypto_digest_free(d); +} + /** * Destroy the sz bytes of data stored at mem, setting them to * the value byte. - * If mem is NULL or sz is zero, nothing happens. * * This function is preferable to memset, since many compilers will happily * optimize out memset() when they can convince themselves that the data being @@ -3296,45 +2991,17 @@ smartlist_shuffle(smartlist_t *sl) void memwipe(void *mem, uint8_t byte, size_t sz) { - if (sz == 0) { - return; - } - /* If sz is nonzero, then mem must not be NULL. */ - tor_assert(mem != NULL); - - /* Data this large is likely to be an underflow. */ - tor_assert(sz < SIZE_T_CEILING); - /* Because whole-program-optimization exists, we may not be able to just * have this function call "memset". A smart compiler could inline it, then * eliminate dead memsets, and declare itself to be clever. */ -#if defined(SecureZeroMemory) || defined(HAVE_SECUREZEROMEMORY) - /* Here's what you do on windows. */ - SecureZeroMemory(mem,sz); -#elif defined(HAVE_RTLSECUREZEROMEMORY) - RtlSecureZeroMemory(mem,sz); -#elif defined(HAVE_EXPLICIT_BZERO) - /* The BSDs provide this. */ - explicit_bzero(mem, sz); -#elif defined(HAVE_MEMSET_S) - /* This is in the C99 standard. */ - memset_s(mem, sz, 0, sz); -#else /* This is a slow and ugly function from OpenSSL that fills 'mem' with junk * based on the pointer value, then uses that junk to update a global * variable. It's an elaborate ruse to trick the compiler into not * optimizing out the "wipe this memory" code. Read it if you like zany * programming tricks! In later versions of Tor, we should look for better - * not-optimized-out memory wiping stuff... - * - * ...or maybe not. In practice, there are pure-asm implementations of - * OPENSSL_cleanse() on most platforms, which ought to do the job. - **/ - + * not-optimized-out memory wiping stuff. */ OPENSSL_cleanse(mem, sz); -#endif /* defined(SecureZeroMemory) || defined(HAVE_SECUREZEROMEMORY) || ... */ - /* Just in case some caller of memwipe() is relying on getting a buffer * filled with a particular value, fill the buffer. * @@ -3347,12 +3014,13 @@ memwipe(void *mem, uint8_t byte, size_t sz) memset(mem, byte, sz); } +#ifdef TOR_IS_MULTITHREADED + #ifndef OPENSSL_THREADS #error OpenSSL has been built without thread support. Tor requires an \ OpenSSL library with thread support enabled. #endif -#ifndef NEW_THREAD_API /** Helper: OpenSSL uses this callback to manipulate mutexes. */ static void openssl_locking_cb_(int mode, int n, const char *file, int line) @@ -3360,7 +3028,7 @@ openssl_locking_cb_(int mode, int n, const char *file, int line) (void)file; (void)line; if (!openssl_mutexes_) - /* This is not a really good fix for the + /* This is not a really good fix for the * "release-freed-lock-from-separate-thread-on-shutdown" problem, but * it can't hurt. */ return; @@ -3370,17 +3038,6 @@ openssl_locking_cb_(int mode, int n, const char *file, int line) tor_mutex_release(openssl_mutexes_[n]); } -static void -tor_set_openssl_thread_id(CRYPTO_THREADID *threadid) -{ - CRYPTO_THREADID_set_numeric(threadid, tor_get_thread_id()); -} -#endif /* !defined(NEW_THREAD_API) */ - -#if 0 -/* This code is disabled, because OpenSSL never actually uses these callbacks. - */ - /** OpenSSL helper type: wraps a Tor mutex so that OpenSSL can use it * as a lock. */ struct CRYPTO_dynlock_value { @@ -3425,42 +3082,41 @@ openssl_dynlock_destroy_cb_(struct CRYPTO_dynlock_value *v, tor_mutex_free(v->lock); tor_free(v); } -#endif /* 0 */ /** @{ */ /** Helper: Construct mutexes, and set callbacks to help OpenSSL handle being - * multithreaded. Returns 0. */ + * multithreaded. */ static int setup_openssl_threading(void) { -#ifndef NEW_THREAD_API int i; int n = CRYPTO_num_locks(); n_openssl_mutexes_ = n; - openssl_mutexes_ = tor_calloc(n, sizeof(tor_mutex_t *)); + openssl_mutexes_ = tor_malloc(n*sizeof(tor_mutex_t *)); for (i=0; i < n; ++i) openssl_mutexes_[i] = tor_mutex_new(); CRYPTO_set_locking_callback(openssl_locking_cb_); - CRYPTO_THREADID_set_callback(tor_set_openssl_thread_id); -#endif /* !defined(NEW_THREAD_API) */ -#if 0 + CRYPTO_set_id_callback(tor_get_thread_id); CRYPTO_set_dynlock_create_callback(openssl_dynlock_create_cb_); CRYPTO_set_dynlock_lock_callback(openssl_dynlock_lock_cb_); CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy_cb_); -#endif return 0; } +#else +static int +setup_openssl_threading(void) +{ + return 0; +} +#endif -/** Uninitialize the crypto library. Return 0 on success. Does not detect - * failure. +/** Uninitialize the crypto library. Return 0 on success, -1 on failure. */ int crypto_global_cleanup(void) { EVP_cleanup(); -#ifndef NEW_THREAD_API - ERR_remove_thread_state(NULL); -#endif + ERR_remove_state(0); ERR_free_strings(); if (dh_param_p) @@ -3476,8 +3132,7 @@ crypto_global_cleanup(void) CONF_modules_unload(1); CRYPTO_cleanup_all_ex_data(); - -#ifndef NEW_THREAD_API +#ifdef TOR_IS_MULTITHREADED if (n_openssl_mutexes_) { int n = n_openssl_mutexes_; tor_mutex_t **ms = openssl_mutexes_; @@ -3489,8 +3144,7 @@ crypto_global_cleanup(void) } tor_free(ms); } -#endif /* !defined(NEW_THREAD_API) */ - +#endif tor_free(crypto_openssl_version_str); tor_free(crypto_openssl_header_version_str); return 0; @@ -3498,15 +3152,3 @@ crypto_global_cleanup(void) /** @} */ -#ifdef USE_DMALLOC -/** Tell the crypto library to use Tor's allocation functions rather than - * calling libc's allocation functions directly. Return 0 on success, -1 - * on failure. */ -int -crypto_use_tor_alloc_functions(void) -{ - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - return r ? 0 : -1; -} -#endif /* defined(USE_DMALLOC) */ - diff --git a/src/tor/src/common/crypto.h b/src/tor/crypto.h similarity index 62% rename from src/tor/src/common/crypto.h rename to src/tor/crypto.h index eca115fa7..6ce3697c9 100644 --- a/src/tor/src/common/crypto.h +++ b/src/tor/crypto.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,16 +13,9 @@ #ifndef TOR_CRYPTO_H #define TOR_CRYPTO_H -#include "orconfig.h" - #include #include "torint.h" #include "testsupport.h" -#include "compat.h" -#include "util.h" - -#include -#include "keccak-tiny/keccak-tiny.h" /* Macro to create an arbitrary OpenSSL version number as used by @@ -61,31 +54,21 @@ /** Length of the output of our second (improved) message digests. (For now * this is just sha256, but it could be any other 256-bit digest.) */ #define DIGEST256_LEN 32 -/** Length of the output of our 64-bit optimized message digests (SHA512). */ -#define DIGEST512_LEN 64 -/** Length of our symmetric cipher's keys of 128-bit. */ +/** Length of our symmetric cipher's keys. */ #define CIPHER_KEY_LEN 16 -/** Length of our symmetric cipher's IV of 128-bit. */ +/** Length of our symmetric cipher's IV. */ #define CIPHER_IV_LEN 16 -/** Length of our symmetric cipher's keys of 256-bit. */ -#define CIPHER256_KEY_LEN 32 /** Length of our public keys. */ #define PK_BYTES (1024/8) /** Length of our DH keys. */ #define DH_BYTES (1024/8) -/** Length of a sha1 message digest when encoded in base32 with trailing = - * signs removed. */ -#define BASE32_DIGEST_LEN 32 /** Length of a sha1 message digest when encoded in base64 with trailing = * signs removed. */ #define BASE64_DIGEST_LEN 27 /** Length of a sha256 message digest when encoded in base64 with trailing = * signs removed. */ #define BASE64_DIGEST256_LEN 43 -/** Length of a sha512 message digest when encoded in base64 with trailing = - * signs removed. */ -#define BASE64_DIGEST512_LEN 86 /** Constant used to indicate OAEP padding for public-key encryption */ #define PK_PKCS1_OAEP_PADDING 60002 @@ -100,69 +83,51 @@ #define HEX_DIGEST_LEN 40 /** Length of hex encoding of SHA256 digest, not including final NUL. */ #define HEX_DIGEST256_LEN 64 -/** Length of hex encoding of SHA512 digest, not including final NUL. */ -#define HEX_DIGEST512_LEN 128 typedef enum { DIGEST_SHA1 = 0, DIGEST_SHA256 = 1, - DIGEST_SHA512 = 2, - DIGEST_SHA3_256 = 3, - DIGEST_SHA3_512 = 4, } digest_algorithm_t; -#define N_DIGEST_ALGORITHMS (DIGEST_SHA3_512+1) -#define N_COMMON_DIGEST_ALGORITHMS (DIGEST_SHA256+1) +#define N_DIGEST_ALGORITHMS (DIGEST_SHA256+1) -/** A set of all the digests we commonly compute, taken on a single - * string. Any digests that are shorter than 512 bits are right-padded +/** A set of all the digests we know how to compute, taken on a single + * string. Any digests that are shorter than 256 bits are right-padded * with 0 bits. * - * Note that this representation wastes 44 bytes for the SHA1 case, so + * Note that this representation wastes 12 bytes for the SHA1 case, so * don't use it for anything where we need to allocate a whole bunch at * once. **/ typedef struct { - char d[N_COMMON_DIGEST_ALGORITHMS][DIGEST256_LEN]; -} common_digests_t; + char d[N_DIGEST_ALGORITHMS][DIGEST256_LEN]; +} digests_t; typedef struct crypto_pk_t crypto_pk_t; -typedef struct aes_cnt_cipher crypto_cipher_t; +typedef struct crypto_cipher_t crypto_cipher_t; typedef struct crypto_digest_t crypto_digest_t; -typedef struct crypto_xof_t crypto_xof_t; typedef struct crypto_dh_t crypto_dh_t; /* global state */ const char * crypto_openssl_get_version_str(void); const char * crypto_openssl_get_header_version_str(void); -int crypto_early_init(void) ATTR_WUR; int crypto_global_init(int hardwareAccel, const char *accelName, - const char *accelPath) ATTR_WUR; -#ifdef USE_DMALLOC -int crypto_use_tor_alloc_functions(void); -#endif - + const char *accelPath); void crypto_thread_cleanup(void); int crypto_global_cleanup(void); /* environment setup */ -MOCK_DECL(crypto_pk_t *,crypto_pk_new,(void)); -void crypto_pk_free_(crypto_pk_t *env); -#define crypto_pk_free(pk) FREE_AND_NULL(crypto_pk_t, crypto_pk_free_, (pk)) +crypto_pk_t *crypto_pk_new(void); +void crypto_pk_free(crypto_pk_t *env); + +void crypto_set_tls_dh_prime(const char *dynamic_dh_modulus_fname); -void crypto_set_tls_dh_prime(void); crypto_cipher_t *crypto_cipher_new(const char *key); -crypto_cipher_t *crypto_cipher_new_with_bits(const char *key, int bits); crypto_cipher_t *crypto_cipher_new_with_iv(const char *key, const char *iv); -crypto_cipher_t *crypto_cipher_new_with_iv_and_bits(const uint8_t *key, - const uint8_t *iv, - int bits); -void crypto_cipher_free_(crypto_cipher_t *env); -#define crypto_cipher_free(c) \ - FREE_AND_NULL(crypto_cipher_t, crypto_cipher_free_, (c)) +void crypto_cipher_free(crypto_cipher_t *env); /* public key crypto */ -MOCK_DECL(int, crypto_pk_generate_key_with_bits,(crypto_pk_t *env, int bits)); +int crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits); #define crypto_pk_generate_key(env) \ crypto_pk_generate_key_with_bits((env), (PK_BYTES*8)) @@ -180,9 +145,9 @@ int crypto_pk_write_private_key_to_filename(crypto_pk_t *env, const char *fname); int crypto_pk_check_key(crypto_pk_t *env); -int crypto_pk_cmp_keys(const crypto_pk_t *a, const crypto_pk_t *b); -int crypto_pk_eq_keys(const crypto_pk_t *a, const crypto_pk_t *b); -size_t crypto_pk_keysize(const crypto_pk_t *env); +int crypto_pk_cmp_keys(crypto_pk_t *a, crypto_pk_t *b); +int crypto_pk_eq_keys(crypto_pk_t *a, crypto_pk_t *b); +size_t crypto_pk_keysize(crypto_pk_t *env); int crypto_pk_num_bits(crypto_pk_t *env); crypto_pk_t *crypto_pk_dup_key(crypto_pk_t *orig); crypto_pk_t *crypto_pk_copy_full(crypto_pk_t *orig); @@ -194,35 +159,28 @@ int crypto_pk_public_encrypt(crypto_pk_t *env, char *to, size_t tolen, int crypto_pk_private_decrypt(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen, int padding, int warnOnFailure); -MOCK_DECL(int, crypto_pk_public_checksig,(const crypto_pk_t *env, - char *to, size_t tolen, - const char *from, size_t fromlen)); -MOCK_DECL(int, crypto_pk_public_checksig_digest,(crypto_pk_t *env, - const char *data, size_t datalen, - const char *sig, size_t siglen)); -int crypto_pk_private_sign(const crypto_pk_t *env, char *to, size_t tolen, +int crypto_pk_public_checksig(crypto_pk_t *env, char *to, size_t tolen, + const char *from, size_t fromlen); +int crypto_pk_public_checksig_digest(crypto_pk_t *env, const char *data, + size_t datalen, const char *sig, size_t siglen); +int crypto_pk_private_sign(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen); int crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen); -int crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, char *to, +int crypto_pk_public_hybrid_encrypt(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen, int padding, int force); -int crypto_pk_obsolete_private_hybrid_decrypt(crypto_pk_t *env, char *to, +int crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to, size_t tolen, const char *from, size_t fromlen, int padding, int warnOnFailure); int crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len); crypto_pk_t *crypto_pk_asn1_decode(const char *str, size_t len); -int crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out); -int crypto_pk_get_common_digests(crypto_pk_t *pk, - common_digests_t *digests_out); +int crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out); +int crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out); int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out,int add_space); -int crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out); - -int crypto_pk_base64_encode(const crypto_pk_t *pk, char **priv_out); -crypto_pk_t *crypto_pk_base64_decode(const char *str, size_t len); /* symmetric crypto */ const char *crypto_cipher_get_key(crypto_cipher_t *env); @@ -231,7 +189,7 @@ int crypto_cipher_encrypt(crypto_cipher_t *env, char *to, const char *from, size_t fromlen); int crypto_cipher_decrypt(crypto_cipher_t *env, char *to, const char *from, size_t fromlen); -void crypto_cipher_crypt_inplace(crypto_cipher_t *env, char *d, size_t len); +int crypto_cipher_crypt_inplace(crypto_cipher_t *env, char *d, size_t len); int crypto_cipher_encrypt_with_iv(const char *key, char *to, size_t tolen, @@ -244,27 +202,16 @@ int crypto_cipher_decrypt_with_iv(const char *key, int crypto_digest(char *digest, const char *m, size_t len); int crypto_digest256(char *digest, const char *m, size_t len, digest_algorithm_t algorithm); -int crypto_digest512(char *digest, const char *m, size_t len, - digest_algorithm_t algorithm); -int crypto_common_digests(common_digests_t *ds_out, const char *m, size_t len); +int crypto_digest_all(digests_t *ds_out, const char *m, size_t len); struct smartlist_t; -void crypto_digest_smartlist_prefix(char *digest_out, size_t len_out, - const char *prepend, - const struct smartlist_t *lst, - const char *append, - digest_algorithm_t alg); void crypto_digest_smartlist(char *digest_out, size_t len_out, const struct smartlist_t *lst, const char *append, digest_algorithm_t alg); const char *crypto_digest_algorithm_get_name(digest_algorithm_t alg); -size_t crypto_digest_algorithm_get_length(digest_algorithm_t alg); int crypto_digest_algorithm_parse_name(const char *name); crypto_digest_t *crypto_digest_new(void); crypto_digest_t *crypto_digest256_new(digest_algorithm_t algorithm); -crypto_digest_t *crypto_digest512_new(digest_algorithm_t algorithm); -void crypto_digest_free_(crypto_digest_t *digest); -#define crypto_digest_free(d) \ - FREE_AND_NULL(crypto_digest_t, crypto_digest_free_, (d)) +void crypto_digest_free(crypto_digest_t *digest); void crypto_digest_add_bytes(crypto_digest_t *digest, const char *data, size_t len); void crypto_digest_get_digest(crypto_digest_t *digest, @@ -275,16 +222,6 @@ void crypto_digest_assign(crypto_digest_t *into, void crypto_hmac_sha256(char *hmac_out, const char *key, size_t key_len, const char *msg, size_t msg_len); -void crypto_mac_sha3_256(uint8_t *mac_out, size_t len_out, - const uint8_t *key, size_t key_len, - const uint8_t *msg, size_t msg_len); - -crypto_xof_t *crypto_xof_new(void); -void crypto_xof_add_bytes(crypto_xof_t *xof, const uint8_t *data, size_t len); -void crypto_xof_squeeze_bytes(crypto_xof_t *xof, uint8_t *out, size_t len); -void crypto_xof_free_(crypto_xof_t *xof); -#define crypto_xof_free(xof) \ - FREE_AND_NULL(crypto_xof_t, crypto_xof_free_, (xof)) /* Key negotiation */ #define DH_TYPE_CIRCUIT 1 @@ -299,8 +236,7 @@ int crypto_dh_get_public(crypto_dh_t *dh, char *pubkey_out, ssize_t crypto_dh_compute_secret(int severity, crypto_dh_t *dh, const char *pubkey, size_t pubkey_len, char *secret_out, size_t secret_out_len); -void crypto_dh_free_(crypto_dh_t *dh); -#define crypto_dh_free(dh) FREE_AND_NULL(crypto_dh_t, crypto_dh_free_, (dh)) +void crypto_dh_free(crypto_dh_t *dh); int crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, @@ -312,19 +248,14 @@ int crypto_expand_key_material_rfc5869_sha256( uint8_t *key_out, size_t key_out_len); /* random numbers */ -int crypto_seed_rng(void) ATTR_WUR; -MOCK_DECL(void,crypto_rand,(char *to, size_t n)); -void crypto_rand_unmocked(char *to, size_t n); -void crypto_strongest_rand(uint8_t *out, size_t out_len); +int crypto_seed_rng(int startup); +MOCK_DECL(int,crypto_rand,(char *to, size_t n)); +int crypto_strongest_rand(uint8_t *out, size_t out_len); int crypto_rand_int(unsigned int max); -int crypto_rand_int_range(unsigned int min, unsigned int max); -uint64_t crypto_rand_uint64_range(uint64_t min, uint64_t max); -time_t crypto_rand_time_range(time_t min, time_t max); uint64_t crypto_rand_uint64(uint64_t max); double crypto_rand_double(void); struct tor_weak_rng_t; void crypto_seed_weak_rng(struct tor_weak_rng_t *rng); -int crypto_init_siphash_key(void); char *crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, const char *suffix); @@ -333,6 +264,24 @@ struct smartlist_t; void *smartlist_choose(const struct smartlist_t *sl); void smartlist_shuffle(struct smartlist_t *sl); +int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen); +int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen); +/** Characters that can appear (case-insensitively) in a base32 encoding. */ +#define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567" +void base32_encode(char *dest, size_t destlen, const char *src, size_t srclen); +int base32_decode(char *dest, size_t destlen, const char *src, size_t srclen); + +int digest_to_base64(char *d64, const char *digest); +int digest_from_base64(char *digest, const char *d64); +int digest256_to_base64(char *d64, const char *digest); +int digest256_from_base64(char *digest, const char *d64); + +/** Length of RFC2440-style S2K specifier: the first 8 bytes are a salt, the + * 9th describes how much iteration to do. */ +#define S2K_SPECIFIER_LEN 9 +void secret_to_key(char *key_out, size_t key_out_len, const char *secret, + size_t secret_len, const char *s2k_specifier); + /** OpenSSL-based utility functions. */ void memwipe(void *mem, uint8_t byte, size_t sz); @@ -343,27 +292,11 @@ struct evp_pkey_st; struct dh_st; struct rsa_st *crypto_pk_get_rsa_(crypto_pk_t *env); crypto_pk_t *crypto_new_pk_from_rsa_(struct rsa_st *rsa); -MOCK_DECL(struct evp_pkey_st *, crypto_pk_get_evp_pkey_,(crypto_pk_t *env, - int private)); +struct evp_pkey_st *crypto_pk_get_evp_pkey_(crypto_pk_t *env, + int private); struct dh_st *crypto_dh_get_dh_(crypto_dh_t *dh); void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in); -#ifdef CRYPTO_PRIVATE - -STATIC int crypto_force_rand_ssleay(void); -STATIC int crypto_strongest_rand_raw(uint8_t *out, size_t out_len); - -#ifdef TOR_UNIT_TESTS -extern int break_strongest_rng_syscall; -extern int break_strongest_rng_fallback; -#endif -#endif /* defined(CRYPTO_PRIVATE) */ - -#ifdef TOR_UNIT_TESTS -void crypto_pk_assign_(crypto_pk_t *dest, const crypto_pk_t *src); -digest_algorithm_t crypto_digest_get_algorithm(crypto_digest_t *digest); #endif -#endif /* !defined(TOR_CRYPTO_H) */ - diff --git a/src/tor/crypto_curve25519.c b/src/tor/crypto_curve25519.c new file mode 100644 index 000000000..8fe1e1b94 --- /dev/null +++ b/src/tor/crypto_curve25519.c @@ -0,0 +1,191 @@ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Wrapper code for a curve25519 implementation. */ + +#define CRYPTO_CURVE25519_PRIVATE +#include "orconfig.h" +#ifdef HAVE_SYS_STAT_H +#include +#endif +#include "crypto.h" +#include "crypto_curve25519.h" +#include "tor_util.h" +#include "torlog.h" + +/* ============================== + Part 1: wrap a suitable curve25519 implementation as curve25519_impl + ============================== */ + +#ifdef USE_CURVE25519_DONNA +int curve25519_donna(uint8_t *mypublic, + const uint8_t *secret, const uint8_t *basepoint); +#endif +#ifdef USE_CURVE25519_NACL +#ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H +#include +#elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H) +#include +#endif +#endif + +STATIC int +curve25519_impl(uint8_t *output, const uint8_t *secret, + const uint8_t *basepoint) +{ + uint8_t bp[CURVE25519_PUBKEY_LEN]; + int r; + memcpy(bp, basepoint, CURVE25519_PUBKEY_LEN); + /* Clear the high bit, in case our backend foolishly looks at it. */ + bp[31] &= 0x7f; +#ifdef USE_CURVE25519_DONNA + r = curve25519_donna(output, secret, bp); +#elif defined(USE_CURVE25519_NACL) + r = crypto_scalarmult_curve25519(output, secret, bp); +#else +#error "No implementation of curve25519 is available." +#endif + memwipe(bp, 0, sizeof(bp)); + return r; +} + +/* ============================== + Part 2: Wrap curve25519_impl with some convenience types and functions. + ============================== */ + +/** + * Return true iff a curve25519_public_key_t seems valid. (It's not necessary + * to see if the point is on the curve, since the twist is also secure, but we + * do need to make sure that it isn't the point at infinity.) */ +int +curve25519_public_key_is_ok(const curve25519_public_key_t *key) +{ + return !safe_mem_is_zero(key->public_key, CURVE25519_PUBKEY_LEN); +} + +/** Generate a new keypair and return the secret key. If extra_strong + * is true, this key is possibly going to get used more than once, so + * use a better-than-usual RNG. Return 0 on success, -1 on failure. */ +int +curve25519_secret_key_generate(curve25519_secret_key_t *key_out, + int extra_strong) +{ + uint8_t k_tmp[CURVE25519_SECKEY_LEN]; + + if (crypto_rand((char*)key_out->secret_key, CURVE25519_SECKEY_LEN) < 0) + return -1; + if (extra_strong && !crypto_strongest_rand(k_tmp, CURVE25519_SECKEY_LEN)) { + /* If they asked for extra-strong entropy and we have some, use it as an + * HMAC key to improve not-so-good entropy rather than using it directly, + * just in case the extra-strong entropy is less amazing than we hoped. */ + crypto_hmac_sha256((char *)key_out->secret_key, + (const char *)k_tmp, sizeof(k_tmp), + (const char *)key_out->secret_key, CURVE25519_SECKEY_LEN); + } + memwipe(k_tmp, 0, sizeof(k_tmp)); + key_out->secret_key[0] &= 248; + key_out->secret_key[31] &= 127; + key_out->secret_key[31] |= 64; + + return 0; +} + +void +curve25519_public_key_generate(curve25519_public_key_t *key_out, + const curve25519_secret_key_t *seckey) +{ + static const uint8_t basepoint[32] = {9}; + + curve25519_impl(key_out->public_key, seckey->secret_key, basepoint); +} + +int +curve25519_keypair_generate(curve25519_keypair_t *keypair_out, + int extra_strong) +{ + if (curve25519_secret_key_generate(&keypair_out->seckey, extra_strong) < 0) + return -1; + curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); + return 0; +} + +int +curve25519_keypair_write_to_file(const curve25519_keypair_t *keypair, + const char *fname, + const char *tag) +{ + char contents[32 + CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN]; + int r; + + memset(contents, 0, sizeof(contents)); + tor_snprintf(contents, sizeof(contents), "== c25519v1: %s ==", tag); + tor_assert(strlen(contents) <= 32); + memcpy(contents+32, keypair->seckey.secret_key, CURVE25519_SECKEY_LEN); + memcpy(contents+32+CURVE25519_SECKEY_LEN, + keypair->pubkey.public_key, CURVE25519_PUBKEY_LEN); + + r = write_bytes_to_file(fname, contents, sizeof(contents), 1); + + memwipe(contents, 0, sizeof(contents)); + return r; +} + +int +curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out, + char **tag_out, + const char *fname) +{ + char prefix[33]; + char *content; + struct stat st; + int r = -1; + + *tag_out = NULL; + + st.st_size = 0; + content = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); + if (! content) + goto end; + if (st.st_size != 32 + CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN) + goto end; + + memcpy(prefix, content, 32); + prefix[32] = '\0'; + if (strcmpstart(prefix, "== c25519v1: ") || + strcmpend(prefix, " ==")) + goto end; + + *tag_out = tor_strndup(prefix+strlen("== c25519v1: "), + strlen(prefix) - strlen("== c25519v1: ==")); + + memcpy(keypair_out->seckey.secret_key, content+32, CURVE25519_SECKEY_LEN); + curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); + if (tor_memneq(keypair_out->pubkey.public_key, + content + 32 + CURVE25519_SECKEY_LEN, + CURVE25519_PUBKEY_LEN)) + goto end; + + r = 0; + + end: + if (content) { + memwipe(content, 0, (size_t) st.st_size); + tor_free(content); + } + if (r != 0) { + memset(keypair_out, 0, sizeof(*keypair_out)); + tor_free(*tag_out); + } + return r; +} + +/** Perform the curve25519 ECDH handshake with skey and pkey, + * writing CURVE25519_OUTPUT_LEN bytes of output into output. */ +void +curve25519_handshake(uint8_t *output, + const curve25519_secret_key_t *skey, + const curve25519_public_key_t *pkey) +{ + curve25519_impl(output, skey->secret_key, pkey->public_key); +} + diff --git a/src/tor/src/common/crypto_curve25519.h b/src/tor/crypto_curve25519.h similarity index 77% rename from src/tor/src/common/crypto_curve25519.h rename to src/tor/crypto_curve25519.h index d024ab79f..57018ac2f 100644 --- a/src/tor/src/common/crypto_curve25519.h +++ b/src/tor/crypto_curve25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_CURVE25519_H @@ -14,20 +14,12 @@ /** Length of the result of a curve25519 handshake. */ #define CURVE25519_OUTPUT_LEN 32 -/** Wrapper type for a curve25519 public key. - * - * (We define a separate type for these to make it less likely that we'll - * mistake them for secret keys.) - * */ +/** Wrapper type for a curve25519 public key */ typedef struct curve25519_public_key_t { uint8_t public_key[CURVE25519_PUBKEY_LEN]; } curve25519_public_key_t; -/** Wrapper type for a curve25519 secret key - * - * (We define a separate type for these to make it less likely that we'll - * mistake them for public keys.) - **/ +/** Wrapper type for a curve25519 secret key */ typedef struct curve25519_secret_key_t { uint8_t secret_key[CURVE25519_SECKEY_LEN]; } curve25519_secret_key_t; @@ -38,6 +30,7 @@ typedef struct curve25519_keypair_t { curve25519_secret_key_t seckey; } curve25519_keypair_t; +#ifdef CURVE25519_ENABLED /* These functions require that we actually know how to use curve25519 keys. * The other data structures and functions in this header let us parse them, * store them, and move them around. @@ -64,14 +57,11 @@ int curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out, char **tag_out, const char *fname); -int curve25519_rand_seckey_bytes(uint8_t *out, int extra_strong); - #ifdef CRYPTO_CURVE25519_PRIVATE STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret, const uint8_t *basepoint); - -STATIC int curve25519_basepoint_impl(uint8_t *output, const uint8_t *secret); -#endif /* defined(CRYPTO_CURVE25519_PRIVATE) */ +#endif +#endif #define CURVE25519_BASE64_PADDED_LEN 44 @@ -80,8 +70,5 @@ int curve25519_public_from_base64(curve25519_public_key_t *pkey, int curve25519_public_to_base64(char *output, const curve25519_public_key_t *pkey); -void curve25519_set_impl_params(int use_ed); -void curve25519_init(void); - -#endif /* !defined(TOR_CRYPTO_CURVE25519_H) */ +#endif diff --git a/src/tor/crypto_format.c b/src/tor/crypto_format.c new file mode 100644 index 000000000..acb3463b4 --- /dev/null +++ b/src/tor/crypto_format.c @@ -0,0 +1,45 @@ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Formatting and parsing code for crypto-related data structures. */ + +#include "orconfig.h" +#ifdef HAVE_SYS_STAT_H +#include +#endif +#include "crypto.h" +#include "crypto_curve25519.h" +#include "tor_util.h" +#include "torlog.h" + +int +curve25519_public_to_base64(char *output, + const curve25519_public_key_t *pkey) +{ + char buf[128]; + base64_encode(buf, sizeof(buf), + (const char*)pkey->public_key, CURVE25519_PUBKEY_LEN); + buf[CURVE25519_BASE64_PADDED_LEN] = '\0'; + memcpy(output, buf, CURVE25519_BASE64_PADDED_LEN+1); + return 0; +} + +int +curve25519_public_from_base64(curve25519_public_key_t *pkey, + const char *input) +{ + size_t len = strlen(input); + if (len == CURVE25519_BASE64_PADDED_LEN - 1) { + /* not padded */ + return digest256_from_base64((char*)pkey->public_key, input); + } else if (len == CURVE25519_BASE64_PADDED_LEN) { + char buf[128]; + if (base64_decode(buf, sizeof(buf), input, len) != CURVE25519_PUBKEY_LEN) + return -1; + memcpy(pkey->public_key, buf, CURVE25519_PUBKEY_LEN); + return 0; + } else { + return -1; + } +} + diff --git a/src/tor/src/ext/curve25519_donna/curve25519-donna.c b/src/tor/curve25519-donna.c similarity index 75% rename from src/tor/src/ext/curve25519_donna/curve25519-donna.c rename to src/tor/curve25519-donna.c index 1c5a27ab8..5c6821ccd 100644 --- a/src/tor/src/ext/curve25519_donna/curve25519-donna.c +++ b/src/tor/curve25519-donna.c @@ -43,7 +43,8 @@ * * This is, almost, a clean room reimplementation from the curve25519 paper. It * uses many of the tricks described therein. Only the crecip function is taken - * from the sample implementation. */ + * from the sample implementation. + */ #include "orconfig.h" @@ -60,23 +61,25 @@ typedef int64_t limb; * significant first. The value of the field element is: * x[0] + 2^26·x[1] + x^51·x[2] + 2^102·x[3] + ... * - * i.e. the limbs are 26, 25, 26, 25, ... bits wide. */ + * i.e. the limbs are 26, 25, 26, 25, ... bits wide. + */ /* Sum two numbers: output += in */ static void fsum(limb *output, const limb *in) { unsigned i; for (i = 0; i < 10; i += 2) { - output[0+i] = output[0+i] + in[0+i]; - output[1+i] = output[1+i] + in[1+i]; + output[0+i] = (output[0+i] + in[0+i]); + output[1+i] = (output[1+i] + in[1+i]); } } /* Find the difference of two numbers: output = in - output - * (note the order of the arguments!). */ + * (note the order of the arguments!) + */ static void fdifference(limb *output, const limb *in) { unsigned i; for (i = 0; i < 10; ++i) { - output[i] = in[i] - output[i]; + output[i] = (in[i] - output[i]); } } @@ -92,8 +95,7 @@ static void fscalar_product(limb *output, const limb *in, const limb scalar) { * * output must be distinct to both inputs. The inputs are reduced coefficient * form, the output is not. - * - * output[x] <= 14 * the largest product of the input limbs. */ + */ static void fproduct(limb *output, const limb *in2, const limb *in) { output[0] = ((limb) ((s32) in2[0])) * ((s32) in[0]); output[1] = ((limb) ((s32) in2[0])) * ((s32) in[1]) + @@ -197,15 +199,9 @@ static void fproduct(limb *output, const limb *in2, const limb *in) { output[18] = 2 * ((limb) ((s32) in2[9])) * ((s32) in[9]); } -/* Reduce a long form to a short form by taking the input mod 2^255 - 19. - * - * On entry: |output[i]| < 14*2^54 - * On exit: |output[0..8]| < 280*2^54 */ +/* Reduce a long form to a short form by taking the input mod 2^255 - 19. */ static void freduce_degree(limb *output) { - /* Each of these shifts and adds ends up multiplying the value by 19. - * - * For output[0..8], the absolute entry value is < 14*2^54 and we add, at - * most, 19*14*2^54 thus, on exit, |output[0..8]| < 280*2^54. */ + /* Each of these shifts and adds ends up multiplying the value by 19. */ output[8] += output[18] << 4; output[8] += output[18] << 1; output[8] += output[18]; @@ -239,13 +235,11 @@ static void freduce_degree(limb *output) { #error "This code only works on a two's complement system" #endif -/* return v / 2^26, using only shifts and adds. - * - * On entry: v can take any value. */ +/* return v / 2^26, using only shifts and adds. */ static inline limb div_by_2_26(const limb v) { - /* High word of v; no shift needed. */ + /* High word of v; no shift needed*/ const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32); /* Set to all 1s if v was negative; else set to 0s. */ const int32_t sign = ((int32_t) highword) >> 31; @@ -255,9 +249,7 @@ div_by_2_26(const limb v) return (v + roundoff) >> 26; } -/* return v / (2^25), using only shifts and adds. - * - * On entry: v can take any value. */ +/* return v / (2^25), using only shifts and adds. */ static inline limb div_by_2_25(const limb v) { @@ -271,21 +263,17 @@ div_by_2_25(const limb v) return (v + roundoff) >> 25; } -#if 0 -/* return v / (2^25), using only shifts and adds. - * - * On entry: v can take any value. */ static inline s32 div_s32_by_2_25(const s32 v) { const s32 roundoff = ((uint32_t)(v >> 31)) >> 7; return (v + roundoff) >> 25; } -#endif /* Reduce all coefficients of the short form input so that |x| < 2^26. * - * On entry: |output[i]| < 280*2^54 */ + * On entry: |output[i]| < 2^62 + */ static void freduce_coefficients(limb *output) { unsigned i; @@ -293,65 +281,56 @@ static void freduce_coefficients(limb *output) { for (i = 0; i < 10; i += 2) { limb over = div_by_2_26(output[i]); - /* The entry condition (that |output[i]| < 280*2^54) means that over is, at - * most, 280*2^28 in the first iteration of this loop. This is added to the - * next limb and we can approximate the resulting bound of that limb by - * 281*2^54. */ output[i] -= over << 26; output[i+1] += over; - /* For the first iteration, |output[i+1]| < 281*2^54, thus |over| < - * 281*2^29. When this is added to the next limb, the resulting bound can - * be approximated as 281*2^54. - * - * For subsequent iterations of the loop, 281*2^54 remains a conservative - * bound and no overflow occurs. */ over = div_by_2_25(output[i+1]); output[i+1] -= over << 25; output[i+2] += over; } - /* Now |output[10]| < 281*2^29 and all other coefficients are reduced. */ + /* Now |output[10]| < 2 ^ 38 and all other coefficients are reduced. */ output[0] += output[10] << 4; output[0] += output[10] << 1; output[0] += output[10]; output[10] = 0; - /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29 - * So |over| will be no more than 2^16. */ + /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19 * 2^38 + * So |over| will be no more than 77825 */ { limb over = div_by_2_26(output[0]); output[0] -= over << 26; output[1] += over; } - /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The - * bound on |output[1]| is sufficient to meet our needs. */ + /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 77825 + * So |over| will be no more than 1. */ + { + /* output[1] fits in 32 bits, so we can use div_s32_by_2_25 here. */ + s32 over32 = div_s32_by_2_25((s32) output[1]); + output[1] -= over32 << 25; + output[2] += over32; + } + + /* Finally, output[0,1,3..9] are reduced, and output[2] is "nearly reduced": + * we have |output[2]| <= 2^26. This is good enough for all of our math, + * but it will require an extra freduce_coefficients before fcontract. */ } /* A helpful wrapper around fproduct: output = in * in2. * - * On entry: |in[i]| < 2^27 and |in2[i]| < 2^27. - * - * output must be distinct to both inputs. The output is reduced degree - * (indeed, one need only provide storage for 10 limbs) and |output[i]| < 2^26. */ + * output must be distinct to both inputs. The output is reduced degree and + * reduced coefficient. + */ static void fmul(limb *output, const limb *in, const limb *in2) { limb t[19]; fproduct(t, in, in2); - /* |t[i]| < 14*2^54 */ freduce_degree(t); freduce_coefficients(t); - /* |t[i]| < 2^26 */ memcpy(output, t, sizeof(limb) * 10); } -/* Square a number: output = in**2 - * - * output must be distinct from the input. The inputs are reduced coefficient - * form, the output is not. - * - * output[x] <= 14 * the largest product of the input limbs. */ static void fsquare_inner(limb *output, const limb *in) { output[0] = ((limb) ((s32) in[0])) * ((s32) in[0]); output[1] = 2 * ((limb) ((s32) in[0])) * ((s32) in[1]); @@ -410,23 +389,12 @@ static void fsquare_inner(limb *output, const limb *in) { output[18] = 2 * ((limb) ((s32) in[9])) * ((s32) in[9]); } -/* fsquare sets output = in^2. - * - * On entry: The |in| argument is in reduced coefficients form and |in[i]| < - * 2^27. - * - * On exit: The |output| argument is in reduced coefficients form (indeed, one - * need only provide storage for 10 limbs) and |out[i]| < 2^26. */ static void fsquare(limb *output, const limb *in) { limb t[19]; fsquare_inner(t, in); - /* |t[i]| < 14*2^54 because the largest product of two limbs will be < - * 2^(27+27) and fsquare_inner adds together, at most, 14 of those - * products. */ freduce_degree(t); freduce_coefficients(t); - /* |t[i]| < 2^26 */ memcpy(output, t, sizeof(limb) * 10); } @@ -455,142 +423,60 @@ fexpand(limb *output, const u8 *input) { #error "This code only works when >> does sign-extension on negative numbers" #endif -/* s32_eq returns 0xffffffff iff a == b and zero otherwise. */ -static s32 s32_eq(s32 a, s32 b) { - a = ~(a ^ b); - a &= a << 16; - a &= a << 8; - a &= a << 4; - a &= a << 2; - a &= a << 1; - return a >> 31; -} - -/* s32_gte returns 0xffffffff if a >= b and zero otherwise, where a and b are - * both non-negative. */ -static s32 s32_gte(s32 a, s32 b) { - a -= b; - /* a >= 0 iff a >= b. */ - return ~(a >> 31); -} - /* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array. - * - * On entry: |input_limbs[i]| < 2^26 */ + * little-endian, 32-byte array + */ static void -fcontract(u8 *output, limb *input_limbs) { +fcontract(u8 *output, limb *input) { int i; int j; - s32 input[10]; - - /* |input_limbs[i]| < 2^26, so it's valid to convert to an s32. */ - for (i = 0; i < 10; i++) { - input[i] = (s32) input_limbs[i]; - } for (j = 0; j < 2; ++j) { for (i = 0; i < 9; ++i) { if ((i & 1) == 1) { - /* This calculation is a time-invariant way to make input[i] - * non-negative by borrowing from the next-larger limb. */ - const s32 mask = input[i] >> 31; - const s32 carry = -((input[i] & mask) >> 25); - input[i] = input[i] + (carry << 25); - input[i+1] = input[i+1] - carry; + /* This calculation is a time-invariant way to make input[i] positive + by borrowing from the next-larger limb. + */ + const s32 mask = (s32)(input[i]) >> 31; + const s32 carry = -(((s32)(input[i]) & mask) >> 25); + input[i] = (s32)(input[i]) + (carry << 25); + input[i+1] = (s32)(input[i+1]) - carry; } else { - const s32 mask = input[i] >> 31; - const s32 carry = -((input[i] & mask) >> 26); - input[i] = input[i] + (carry << 26); - input[i+1] = input[i+1] - carry; + const s32 mask = (s32)(input[i]) >> 31; + const s32 carry = -(((s32)(input[i]) & mask) >> 26); + input[i] = (s32)(input[i]) + (carry << 26); + input[i+1] = (s32)(input[i+1]) - carry; } } - - /* There's no greater limb for input[9] to borrow from, but we can multiply - * by 19 and borrow from input[0], which is valid mod 2^255-19. */ { - const s32 mask = input[9] >> 31; - const s32 carry = -((input[9] & mask) >> 25); - input[9] = input[9] + (carry << 25); - input[0] = input[0] - (carry * 19); + const s32 mask = (s32)(input[9]) >> 31; + const s32 carry = -(((s32)(input[9]) & mask) >> 25); + input[9] = (s32)(input[9]) + (carry << 25); + input[0] = (s32)(input[0]) - (carry * 19); } - - /* After the first iteration, input[1..9] are non-negative and fit within - * 25 or 26 bits, depending on position. However, input[0] may be - * negative. */ } /* The first borrow-propagation pass above ended with every limb except (possibly) input[0] non-negative. - If input[0] was negative after the first pass, then it was because of a - carry from input[9]. On entry, input[9] < 2^26 so the carry was, at most, - one, since (2**26-1) >> 25 = 1. Thus input[0] >= -19. - - In the second pass, each limb is decreased by at most one. Thus the second - borrow-propagation pass could only have wrapped around to decrease - input[0] again if the first pass left input[0] negative *and* input[1] - through input[9] were all zero. In that case, input[1] is now 2^25 - 1, - and this last borrow-propagation step will leave input[1] non-negative. */ + Since each input limb except input[0] is decreased by at most 1 + by a borrow-propagation pass, the second borrow-propagation pass + could only have wrapped around to decrease input[0] again if the + first pass left input[0] negative *and* input[1] through input[9] + were all zero. In that case, input[1] is now 2^25 - 1, and this + last borrow-propagation step will leave input[1] non-negative. + */ { - const s32 mask = input[0] >> 31; - const s32 carry = -((input[0] & mask) >> 26); - input[0] = input[0] + (carry << 26); - input[1] = input[1] - carry; + const s32 mask = (s32)(input[0]) >> 31; + const s32 carry = -(((s32)(input[0]) & mask) >> 26); + input[0] = (s32)(input[0]) + (carry << 26); + input[1] = (s32)(input[1]) - carry; } - /* All input[i] are now non-negative. However, there might be values between - * 2^25 and 2^26 in a limb which is, nominally, 25 bits wide. */ - for (j = 0; j < 2; j++) { - for (i = 0; i < 9; i++) { - if ((i & 1) == 1) { - const s32 carry = input[i] >> 25; - input[i] &= 0x1ffffff; - input[i+1] += carry; - } else { - const s32 carry = input[i] >> 26; - input[i] &= 0x3ffffff; - input[i+1] += carry; - } - } - - { - const s32 carry = input[9] >> 25; - input[9] &= 0x1ffffff; - input[0] += 19*carry; - } - } - - /* If the first carry-chain pass, just above, ended up with a carry from - * input[9], and that caused input[0] to be out-of-bounds, then input[0] was - * < 2^26 + 2*19, because the carry was, at most, two. - * - * If the second pass carried from input[9] again then input[0] is < 2*19 and - * the input[9] -> input[0] carry didn't push input[0] out of bounds. */ - - /* It still remains the case that input might be between 2^255-19 and 2^255. - * In this case, input[1..9] must take their maximum value and input[0] must - * be >= (2^255-19) & 0x3ffffff, which is 0x3ffffed. */ - s32 mask = s32_gte(input[0], 0x3ffffed); - for (i = 1; i < 10; i++) { - if ((i & 1) == 1) { - mask &= s32_eq(input[i], 0x1ffffff); - } else { - mask &= s32_eq(input[i], 0x3ffffff); - } - } - - /* mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus - * this conditionally subtracts 2^255-19. */ - input[0] -= mask & 0x3ffffed; - - for (i = 1; i < 10; i++) { - if ((i & 1) == 1) { - input[i] -= mask & 0x1ffffff; - } else { - input[i] -= mask & 0x3ffffff; - } - } + /* Both passes through the above loop, plus the last 0-to-1 step, are + necessary: if input[9] is -1 and input[0] through input[8] are 0, + negative values will remain in the array until the end. + */ input[1] <<= 2; input[2] <<= 3; @@ -628,9 +514,7 @@ fcontract(u8 *output, limb *input_limbs) { * x z: short form, destroyed * xprime zprime: short form, destroyed * qmqp: short form, preserved - * - * On entry and exit, the absolute value of the limbs of all inputs and outputs - * are < 2^26. */ + */ static void fmonty(limb *x2, limb *z2, /* output 2Q */ limb *x3, limb *z3, /* output Q + Q' */ limb *x, limb *z, /* input Q */ @@ -641,69 +525,43 @@ static void fmonty(limb *x2, limb *z2, /* output 2Q */ memcpy(origx, x, 10 * sizeof(limb)); fsum(x, z); - /* |x[i]| < 2^27 */ - fdifference(z, origx); /* does x - z */ - /* |z[i]| < 2^27 */ + fdifference(z, origx); // does x - z memcpy(origxprime, xprime, sizeof(limb) * 10); fsum(xprime, zprime); - /* |xprime[i]| < 2^27 */ fdifference(zprime, origxprime); - /* |zprime[i]| < 2^27 */ fproduct(xxprime, xprime, z); - /* |xxprime[i]| < 14*2^54: the largest product of two limbs will be < - * 2^(27+27) and fproduct adds together, at most, 14 of those products. - * (Approximating that to 2^58 doesn't work out.) */ fproduct(zzprime, x, zprime); - /* |zzprime[i]| < 14*2^54 */ freduce_degree(xxprime); freduce_coefficients(xxprime); - /* |xxprime[i]| < 2^26 */ freduce_degree(zzprime); freduce_coefficients(zzprime); - /* |zzprime[i]| < 2^26 */ memcpy(origxprime, xxprime, sizeof(limb) * 10); fsum(xxprime, zzprime); - /* |xxprime[i]| < 2^27 */ fdifference(zzprime, origxprime); - /* |zzprime[i]| < 2^27 */ fsquare(xxxprime, xxprime); - /* |xxxprime[i]| < 2^26 */ fsquare(zzzprime, zzprime); - /* |zzzprime[i]| < 2^26 */ fproduct(zzprime, zzzprime, qmqp); - /* |zzprime[i]| < 14*2^52 */ freduce_degree(zzprime); freduce_coefficients(zzprime); - /* |zzprime[i]| < 2^26 */ memcpy(x3, xxxprime, sizeof(limb) * 10); memcpy(z3, zzprime, sizeof(limb) * 10); fsquare(xx, x); - /* |xx[i]| < 2^26 */ fsquare(zz, z); - /* |zz[i]| < 2^26 */ fproduct(x2, xx, zz); - /* |x2[i]| < 14*2^52 */ freduce_degree(x2); freduce_coefficients(x2); - /* |x2[i]| < 2^26 */ fdifference(zz, xx); // does zz = xx - zz - /* |zz[i]| < 2^27 */ memset(zzz + 10, 0, sizeof(limb) * 9); fscalar_product(zzz, zz, 121665); - /* |zzz[i]| < 2^(27+17) */ /* No need to call freduce_degree here: fscalar_product doesn't increase the degree of its input. */ freduce_coefficients(zzz); - /* |zzz[i]| < 2^26 */ fsum(zzz, xx); - /* |zzz[i]| < 2^27 */ fproduct(z2, zz, zzz); - /* |z2[i]| < 14*2^(26+27) */ freduce_degree(z2); freduce_coefficients(z2); - /* |z2|i| < 2^26 */ } /* Conditionally swap two reduced-form limb arrays if 'iswap' is 1, but leave @@ -714,7 +572,8 @@ static void fmonty(limb *x2, limb *z2, /* output 2Q */ * wrong results. Also, the two limb arrays must be in reduced-coefficient, * reduced-degree form: the values in a[10..19] or b[10..19] aren't swapped, * and all all values in a[0..9],b[0..9] must have magnitude less than - * INT32_MAX. */ + * INT32_MAX. + */ static void swap_conditional(limb a[19], limb b[19], limb iswap) { unsigned i; @@ -731,7 +590,8 @@ swap_conditional(limb a[19], limb b[19], limb iswap) { * * resultx/resultz: the x coordinate of the resulting curve point (short form) * n: a little endian, 32-byte number - * q: a point of the curve (short form) */ + * q: a point of the curve (short form) + */ static void cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { limb a[19] = {0}, b[19] = {1}, c[19] = {1}, d[19] = {0}; @@ -849,7 +709,7 @@ crecip(limb *out, const limb *z) { /* 2^255 - 21 */ fmul(out,t1,z11); } -int curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint); +int curve25519_donna(u8 *, const u8 *, const u8 *); int curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { @@ -866,6 +726,7 @@ curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { cmult(x, z, e, bp); crecip(zmone, z); fmul(z, x, zmone); + freduce_coefficients(z); fcontract(mypublic, z); return 0; } diff --git a/src/tor/src/common/di_ops.c b/src/tor/di_ops.c similarity index 81% rename from src/tor/src/common/di_ops.c rename to src/tor/di_ops.c index 90e9357c8..eeb7a16eb 100644 --- a/src/tor/src/common/di_ops.c +++ b/src/tor/di_ops.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ +/* Copyright (c) 2011-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,7 +9,7 @@ #include "orconfig.h" #include "di_ops.h" #include "torlog.h" -#include "util.h" +#include "tor_util.h" /** * Timing-safe version of memcmp. As memcmp, compare the sz bytes at @@ -25,9 +25,6 @@ int tor_memcmp(const void *a, const void *b, size_t len) { -#ifdef HAVE_TIMINGSAFE_MEMCMP - return timingsafe_memcmp(a, b, len); -#else const uint8_t *x = a; const uint8_t *y = b; size_t i = len; @@ -86,7 +83,6 @@ tor_memcmp(const void *a, const void *b, size_t len) } return retval; -#endif /* defined(HAVE_TIMINGSAFE_MEMCMP) */ } /** @@ -134,7 +130,6 @@ tor_memeq(const void *a, const void *b, size_t sz) * 1 & ((any_difference - 1) >> 8) == 0 */ - /*coverity[overflow]*/ return 1 & ((any_difference - 1) >> 8); } @@ -148,7 +143,7 @@ struct di_digest256_map_t { /** Release all storage held in map, calling free_fn on each value * as we go. */ void -dimap_free_(di_digest256_map_t *map, dimap_free_fn free_fn) +dimap_free(di_digest256_map_t *map, dimap_free_fn free_fn) { while (map) { di_digest256_map_t *victim = map; @@ -222,53 +217,6 @@ safe_mem_is_zero(const void *mem, size_t sz) total |= *ptr++; } - /*coverity[overflow]*/ return 1 & ((total - 1) >> 8); } -/** Time-invariant 64-bit greater-than; works on two integers in the range - * (0,INT64_MAX). */ -#if SIZEOF_VOID_P == 8 -#define gt_i64_timei(a,b) ((a) > (b)) -#else -static inline int -gt_i64_timei(uint64_t a, uint64_t b) -{ - int64_t diff = (int64_t) (b - a); - int res = diff >> 63; - return res & 1; -} -#endif /* SIZEOF_VOID_P == 8 */ - -/** - * Given an array of list of n_entries uint64_t values, whose sum is - * total, find the first i such that the total of all elements 0...i is - * greater than rand_val. - * - * Try to perform this operation in a constant-time way. - */ -int -select_array_member_cumulative_timei(const uint64_t *entries, int n_entries, - uint64_t total, uint64_t rand_val) -{ - int i, i_chosen=-1, n_chosen=0; - uint64_t total_so_far = 0; - - for (i = 0; i < n_entries; ++i) { - total_so_far += entries[i]; - if (gt_i64_timei(total_so_far, rand_val)) { - i_chosen = i; - n_chosen++; - /* Set rand_val to INT64_MAX rather than stopping the loop. This way, - * the time we spend in the loop does not leak which element we chose. */ - rand_val = INT64_MAX; - } - } - tor_assert(total_so_far == total); - tor_assert(n_chosen == 1); - tor_assert(i_chosen >= 0); - tor_assert(i_chosen < n_entries); - - return i_chosen; -} - diff --git a/src/tor/src/common/di_ops.h b/src/tor/di_ops.h similarity index 71% rename from src/tor/src/common/di_ops.h rename to src/tor/di_ops.h index 67d9c9f0d..d93534b69 100644 --- a/src/tor/src/common/di_ops.h +++ b/src/tor/di_ops.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -37,19 +37,11 @@ int safe_mem_is_zero(const void *mem, size_t sz); typedef struct di_digest256_map_t di_digest256_map_t; typedef void (*dimap_free_fn)(void *); -void dimap_free_(di_digest256_map_t *map, dimap_free_fn free_fn); -#define dimap_free(map, free_fn) \ - do { \ - dimap_free_((map), (free_fn)); \ - (map) = NULL; \ - } while (0) +void dimap_free(di_digest256_map_t *map, dimap_free_fn free_fn); void dimap_add_entry(di_digest256_map_t **map, const uint8_t *key, void *val); void *dimap_search(const di_digest256_map_t *map, const uint8_t *key, void *dflt_val); -int select_array_member_cumulative_timei(const uint64_t *entries, - int n_entries, - uint64_t total, uint64_t rand_val); -#endif /* !defined(TOR_DI_OPS_H) */ +#endif diff --git a/src/tor/directory.c b/src/tor/directory.c new file mode 100644 index 000000000..4c4fd7b88 --- /dev/null +++ b/src/tor/directory.c @@ -0,0 +1,3894 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "buffers.h" +#include "circuitbuild.h" +#include "config.h" +#include "connection.h" +#include "connection_edge.h" +#include "control.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "entrynodes.h" +#include "geoip.h" +#include "onion_main.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" +#include "routerset.h" + +#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) +#ifndef OPENBSD +#include +#endif +#endif + +/** + * \file directory.c + * \brief Code to send and fetch directories and router + * descriptors via HTTP. Directories use dirserv.c to generate the + * results; clients use routers.c to parse them. + **/ + +/* In-points to directory.c: + * + * - directory_post_to_dirservers(), called from + * router_upload_dir_desc_to_dirservers() in router.c + * upload_service_descriptor() in rendservice.c + * - directory_get_from_dirserver(), called from + * rend_client_refetch_renddesc() in rendclient.c + * run_scheduled_events() in onion_main.c + * do_hup() in onion_main.c + * - connection_dir_process_inbuf(), called from + * connection_process_inbuf() in connection.c + * - connection_dir_finished_flushing(), called from + * connection_finished_flushing() in connection.c + * - connection_dir_finished_connecting(), called from + * connection_finished_connecting() in connection.c + */ +static void directory_send_command(dir_connection_t *conn, + int purpose, int direct, const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since); +static int directory_handle_command(dir_connection_t *conn); +static int body_is_plausible(const char *body, size_t body_len, int purpose); +static int purpose_needs_anonymity(uint8_t dir_purpose, + uint8_t router_purpose); +static char *http_get_header(const char *headers, const char *which); +static void http_set_address_origin(const char *headers, connection_t *conn); +static void connection_dir_download_routerdesc_failed(dir_connection_t *conn); +static void connection_dir_bridge_routerdesc_failed(dir_connection_t *conn); +static void connection_dir_download_cert_failed( + dir_connection_t *conn, int status_code); +static void connection_dir_retry_bridges(smartlist_t *descs); +static void dir_routerdesc_download_failed(smartlist_t *failed, + int status_code, + int router_purpose, + int was_extrainfo, + int was_descriptor_digests); +static void dir_microdesc_download_failed(smartlist_t *failed, + int status_code); +static void note_client_request(int purpose, int compressed, size_t bytes); +static int client_likes_consensus(networkstatus_t *v, const char *want_url); + +static void directory_initiate_command_rend(const char *address, + const tor_addr_t *addr, + uint16_t or_port, + uint16_t dir_port, + const char *digest, + uint8_t dir_purpose, + uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query); + +/********* START VARIABLES **********/ + +/** How far in the future do we allow a directory server to tell us it is + * before deciding that one of us has the wrong time? */ +#define ALLOW_DIRECTORY_TIME_SKEW (30*60) + +#define X_ADDRESS_HEADER "X-Your-Address-Is: " + +/** HTTP cache control: how long do we tell proxies they can cache each + * kind of document we serve? */ +#define FULL_DIR_CACHE_LIFETIME (60*60) +#define RUNNINGROUTERS_CACHE_LIFETIME (20*60) +#define DIRPORTFRONTPAGE_CACHE_LIFETIME (20*60) +#define NETWORKSTATUS_CACHE_LIFETIME (5*60) +#define ROUTERDESC_CACHE_LIFETIME (30*60) +#define ROUTERDESC_BY_DIGEST_CACHE_LIFETIME (48*60*60) +#define ROBOTS_CACHE_LIFETIME (24*60*60) +#define MICRODESC_CACHE_LIFETIME (48*60*60) + +/********* END VARIABLES ************/ + +/** Return true iff the directory purpose dir_purpose (and if it's + * fetching descriptors, it's fetching them for router_purpose) + * must use an anonymous connection to a directory. */ +static int +purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose) +{ + if (get_options()->AllDirActionsPrivate) + return 1; + if (router_purpose == ROUTER_PURPOSE_BRIDGE) + return 1; /* if no circuits yet, this might break bootstrapping, but it's + * needed to be safe. */ + if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR || + dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || + dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES || + dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || + dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES || + dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS || + dir_purpose == DIR_PURPOSE_FETCH_CERTIFICATE || + dir_purpose == DIR_PURPOSE_FETCH_SERVERDESC || + dir_purpose == DIR_PURPOSE_FETCH_EXTRAINFO || + dir_purpose == DIR_PURPOSE_FETCH_MICRODESC) + return 0; + return 1; +} + +/** Return a newly allocated string describing auth. Only describes + * authority features. */ +static char * +authdir_type_to_string(dirinfo_type_t auth) +{ + char *result; + smartlist_t *lst = smartlist_new(); + if (auth & V1_DIRINFO) + smartlist_add(lst, (void*)"V1"); + if (auth & V3_DIRINFO) + smartlist_add(lst, (void*)"V3"); + if (auth & BRIDGE_DIRINFO) + smartlist_add(lst, (void*)"Bridge"); + if (auth & HIDSERV_DIRINFO) + smartlist_add(lst, (void*)"Hidden service"); + if (smartlist_len(lst)) { + result = smartlist_join_strings(lst, ", ", 0, NULL); + } else { + result = tor_strdup("[Not an authority]"); + } + smartlist_free(lst); + return result; +} + +/** Return a string describing a given directory connection purpose. */ +static const char * +dir_conn_purpose_to_string(int purpose) +{ + switch (purpose) + { + case DIR_PURPOSE_FETCH_RENDDESC: + return "hidden-service descriptor fetch"; + case DIR_PURPOSE_UPLOAD_DIR: + return "server descriptor upload"; + case DIR_PURPOSE_UPLOAD_RENDDESC: + return "hidden-service descriptor upload"; + case DIR_PURPOSE_UPLOAD_VOTE: + return "server vote upload"; + case DIR_PURPOSE_UPLOAD_SIGNATURES: + return "consensus signature upload"; + case DIR_PURPOSE_FETCH_SERVERDESC: + return "server descriptor fetch"; + case DIR_PURPOSE_FETCH_EXTRAINFO: + return "extra-info fetch"; + case DIR_PURPOSE_FETCH_CONSENSUS: + return "consensus network-status fetch"; + case DIR_PURPOSE_FETCH_CERTIFICATE: + return "authority cert fetch"; + case DIR_PURPOSE_FETCH_STATUS_VOTE: + return "status vote fetch"; + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: + return "consensus signature fetch"; + case DIR_PURPOSE_FETCH_RENDDESC_V2: + return "hidden-service v2 descriptor fetch"; + case DIR_PURPOSE_UPLOAD_RENDDESC_V2: + return "hidden-service v2 descriptor upload"; + case DIR_PURPOSE_FETCH_MICRODESC: + return "microdescriptor fetch"; + } + + log_warn(LD_BUG, "Called with unknown purpose %d", purpose); + return "(unknown)"; +} + +/** Return true iff identity_digest is the digest of a router we + * believe to support extrainfo downloads. (If is_authority we do + * additional checking that's only valid for authorities.) */ +int +router_supports_extrainfo(const char *identity_digest, int is_authority) +{ + const node_t *node = node_get_by_id(identity_digest); + + if (node && node->ri) { + if (node->ri->caches_extra_info) + return 1; + } + if (is_authority) { + return 1; + } + return 0; +} + +/** Return true iff any trusted directory authority has accepted our + * server descriptor. + * + * We consider any authority sufficient because waiting for all of + * them means it never happens while any authority is down; we don't + * go for something more complex in the middle (like \>1/3 or \>1/2 or + * \>=1/2) because that doesn't seem necessary yet. + */ +int +directories_have_accepted_server_descriptor(void) +{ + const smartlist_t *servers = router_get_trusted_dir_servers(); + const or_options_t *options = get_options(); + SMARTLIST_FOREACH(servers, dir_server_t *, d, { + if ((d->type & options->PublishServerDescriptor_) && + d->has_accepted_serverdesc) { + return 1; + } + }); + return 0; +} + +/** Start a connection to every suitable directory authority, using + * connection purpose dir_purpose and uploading payload + * (of length payload_len). The dir_purpose should be one of + * 'DIR_PURPOSE_UPLOAD_DIR' or 'DIR_PURPOSE_UPLOAD_RENDDESC'. + * + * router_purpose describes the type of descriptor we're + * publishing, if we're publishing a descriptor -- e.g. general or bridge. + * + * type specifies what sort of dir authorities (V1, V3, + * HIDSERV, BRIDGE, etc) we should upload to. + * + * If extrainfo_len is nonzero, the first payload_len bytes of + * payload hold a router descriptor, and the next extrainfo_len + * bytes of payload hold an extra-info document. Upload the descriptor + * to all authorities, and the extra-info document to all authorities that + * support it. + */ +void +directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, + dirinfo_type_t type, + const char *payload, + size_t payload_len, size_t extrainfo_len) +{ + const or_options_t *options = get_options(); + int post_via_tor; + const smartlist_t *dirservers = router_get_trusted_dir_servers(); + int found = 0; + const int exclude_self = (dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || + dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES); + tor_assert(dirservers); + /* This tries dirservers which we believe to be down, but ultimately, that's + * harmless, and we may as well err on the side of getting things uploaded. + */ + SMARTLIST_FOREACH_BEGIN(dirservers, dir_server_t *, ds) { + routerstatus_t *rs = &(ds->fake_status); + size_t upload_len = payload_len; + tor_addr_t ds_addr; + + if ((type & ds->type) == 0) + continue; + + if (exclude_self && router_digest_is_me(ds->digest)) + continue; + + if (options->StrictNodes && + routerset_contains_routerstatus(options->ExcludeNodes, rs, -1)) { + log_warn(LD_DIR, "Wanted to contact authority '%s' for %s, but " + "it's in our ExcludedNodes list and StrictNodes is set. " + "Skipping.", + ds->nickname, + dir_conn_purpose_to_string(dir_purpose)); + continue; + } + + found = 1; /* at least one authority of this type was listed */ + if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR) + ds->has_accepted_serverdesc = 0; + + if (extrainfo_len && router_supports_extrainfo(ds->digest, 1)) { + upload_len += extrainfo_len; + log_info(LD_DIR, "Uploading an extrainfo too (length %d)", + (int) extrainfo_len); + } + tor_addr_from_ipv4h(&ds_addr, ds->addr); + post_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose) || + !fascist_firewall_allows_address_dir(&ds_addr, ds->dir_port); + directory_initiate_command_routerstatus(rs, dir_purpose, + router_purpose, + post_via_tor, + NULL, payload, upload_len, 0); + } SMARTLIST_FOREACH_END(ds); + if (!found) { + char *s = authdir_type_to_string(type); + log_warn(LD_DIR, "Publishing server descriptor to directory authorities " + "of type '%s', but no authorities of that type listed!", s); + tor_free(s); + } +} + +/** Return true iff, according to the values in options, we should be + * using directory guards for direct downloads of directory information. */ +static int +should_use_directory_guards(const or_options_t *options) +{ + /* Public (non-bridge) servers never use directory guards. */ + if (public_server_mode(options)) + return 0; + /* If guards are disabled, or directory guards are disabled, we can't + * use directory guards. + */ + if (!options->UseEntryGuards || !options->UseEntryGuardsAsDirGuards) + return 0; + /* If we're configured to fetch directory info aggressively or of a + * nonstandard type, don't use directory guards. */ + if (options->DownloadExtraInfo || options->FetchDirInfoEarly || + options->FetchDirInfoExtraEarly || options->FetchUselessDescriptors) + return 0; + if (! options->PreferTunneledDirConns) + return 0; + return 1; +} + +/** Pick an unconsetrained directory server from among our guards, the latest + * networkstatus, or the fallback dirservers, for use in downloading + * information of type type, and return its routerstatus. */ +static const routerstatus_t * +directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, + uint8_t dir_purpose) +{ + const routerstatus_t *rs = NULL; + const or_options_t *options = get_options(); + + if (options->UseBridges) + log_warn(LD_BUG, "Called when we have UseBridges set."); + + if (should_use_directory_guards(options)) { + const node_t *node = choose_random_dirguard(type); + if (node) + rs = node->rs; + } else { + /* anybody with a non-zero dirport will do */ + rs = router_pick_directory_server(type, pds_flags); + } + if (!rs) { + log_info(LD_DIR, "No router found for %s; falling back to " + "dirserver list.", dir_conn_purpose_to_string(dir_purpose)); + rs = router_pick_fallback_dirserver(type, pds_flags); + } + + return rs; +} + +/** Start a connection to a random running directory server, using + * connection purpose dir_purpose, intending to fetch descriptors + * of purpose router_purpose, and requesting resource. + * Use pds_flags as arguments to router_pick_directory_server() + * or router_pick_trusteddirserver(). + */ +void +directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, + const char *resource, int pds_flags) +{ + const routerstatus_t *rs = NULL; + const or_options_t *options = get_options(); + int prefer_authority = directory_fetches_from_authorities(options); + int require_authority = 0; + int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose); + dirinfo_type_t type; + time_t if_modified_since = 0; + + /* FFFF we could break this switch into its own function, and call + * it elsewhere in directory.c. -RD */ + switch (dir_purpose) { + case DIR_PURPOSE_FETCH_EXTRAINFO: + type = EXTRAINFO_DIRINFO | + (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : + V3_DIRINFO); + break; + case DIR_PURPOSE_FETCH_SERVERDESC: + type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : + V3_DIRINFO); + break; + case DIR_PURPOSE_FETCH_RENDDESC: + type = HIDSERV_DIRINFO; + break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: + case DIR_PURPOSE_FETCH_CERTIFICATE: + type = V3_DIRINFO; + break; + case DIR_PURPOSE_FETCH_CONSENSUS: + type = V3_DIRINFO; + if (resource && !strcmp(resource,"microdesc")) + type |= MICRODESC_DIRINFO; + break; + case DIR_PURPOSE_FETCH_MICRODESC: + type = MICRODESC_DIRINFO; + break; + default: + log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose); + return; + } + + if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) { + int flav = FLAV_NS; + networkstatus_t *v; + if (resource) + flav = networkstatus_parse_flavor_name(resource); + + if (flav != -1) { + /* IF we have a parsed consensus of this type, we can do an + * if-modified-time based on it. */ + v = networkstatus_get_latest_consensus_by_flavor(flav); + if (v) + if_modified_since = v->valid_after + 180; + } else { + /* Otherwise it might be a consensus we don't parse, but which we + * do cache. Look at the cached copy, perhaps. */ + cached_dir_t *cd = dirserv_get_consensus(resource); + if (cd) + if_modified_since = cd->published + 180; + } + } + + if (!options->FetchServerDescriptors && type != HIDSERV_DIRINFO) + return; + + if (!get_via_tor) { + if (options->UseBridges && type != BRIDGE_DIRINFO) { + /* We want to ask a running bridge for which we have a descriptor. + * + * When we ask choose_random_entry() for a bridge, we specify what + * sort of dir fetch we'll be doing, so it won't return a bridge + * that can't answer our question. + */ + /* XXX024 Not all bridges handle conditional consensus downloading, + * so, for now, never assume the server supports that. -PP */ + const node_t *node = choose_random_dirguard(type); + if (node && node->ri) { + /* every bridge has a routerinfo. */ + tor_addr_t addr; + routerinfo_t *ri = node->ri; + node_get_addr(node, &addr); + directory_initiate_command(ri->address, &addr, + ri->or_port, 0/*no dirport*/, + ri->cache_info.identity_digest, + dir_purpose, + router_purpose, + DIRIND_ONEHOP, + resource, NULL, 0, if_modified_since); + } else + log_notice(LD_DIR, "Ignoring directory request, since no bridge " + "nodes are available yet."); + return; + } else { + if (prefer_authority || type == BRIDGE_DIRINFO) { + /* only ask authdirservers, and don't ask myself */ + rs = router_pick_trusteddirserver(type, pds_flags); + if (rs == NULL && (pds_flags & (PDS_NO_EXISTING_SERVERDESC_FETCH| + PDS_NO_EXISTING_MICRODESC_FETCH))) { + /* We don't want to fetch from any authorities that we're currently + * fetching server descriptors from, and we got no match. Did we + * get no match because all the authorities have connections + * fetching server descriptors (in which case we should just + * return,) or because all the authorities are down or on fire or + * unreachable or something (in which case we should go on with + * our fallback code)? */ + pds_flags &= ~(PDS_NO_EXISTING_SERVERDESC_FETCH| + PDS_NO_EXISTING_MICRODESC_FETCH); + rs = router_pick_trusteddirserver(type, pds_flags); + if (rs) { + log_debug(LD_DIR, "Deferring serverdesc fetch: all authorities " + "are in use."); + return; + } + } + if (rs == NULL && require_authority) { + log_info(LD_DIR, "No authorities were available for %s: will try " + "later.", dir_conn_purpose_to_string(dir_purpose)); + return; + } + } + if (!rs && type != BRIDGE_DIRINFO) { + /* */ + rs = directory_pick_generic_dirserver(type, pds_flags, + dir_purpose); + if (!rs) { + /*XXXX024 I'm pretty sure this can never do any good, since + * rs isn't set. */ + get_via_tor = 1; /* last resort: try routing it via Tor */ + } + } + } + } else { /* get_via_tor */ + /* Never use fascistfirewall; we're going via Tor. */ + if (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) { + /* only ask hidserv authorities, any of them will do */ + pds_flags |= PDS_IGNORE_FASCISTFIREWALL|PDS_ALLOW_SELF; + rs = router_pick_trusteddirserver(HIDSERV_DIRINFO, pds_flags); + } else { + /* anybody with a non-zero dirport will do. Disregard firewalls. */ + pds_flags |= PDS_IGNORE_FASCISTFIREWALL; + rs = router_pick_directory_server(type, pds_flags); + /* If we have any hope of building an indirect conn, we know some router + * descriptors. If (rs==NULL), we can't build circuits anyway, so + * there's no point in falling back to the authorities in this case. */ + } + } + + if (rs) { + const dir_indirection_t indirection = + get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; + directory_initiate_command_routerstatus(rs, dir_purpose, + router_purpose, + indirection, + resource, NULL, 0, + if_modified_since); + } else { + log_notice(LD_DIR, + "While fetching directory info, " + "no running dirservers known. Will try again later. " + "(purpose %d)", dir_purpose); + if (!purpose_needs_anonymity(dir_purpose, router_purpose)) { + /* remember we tried them all and failed. */ + directory_all_unreachable(time(NULL)); + } + } +} + +/** As directory_get_from_dirserver, but initiates a request to every + * directory authority other than ourself. Only for use by authorities when + * searching for missing information while voting. */ +void +directory_get_from_all_authorities(uint8_t dir_purpose, + uint8_t router_purpose, + const char *resource) +{ + tor_assert(dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || + dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES); + + SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), + dir_server_t *, ds) { + routerstatus_t *rs; + if (router_digest_is_me(ds->digest)) + continue; + if (!(ds->type & V3_DIRINFO)) + continue; + rs = &ds->fake_status; + directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose, + DIRIND_ONEHOP, resource, NULL, + 0, 0); + } SMARTLIST_FOREACH_END(ds); +} + +/** Return true iff ind requires a multihop circuit. */ +static int +dirind_is_anon(dir_indirection_t ind) +{ + return ind == DIRIND_ANON_DIRPORT || ind == DIRIND_ANONYMOUS; +} + +/** Same as directory_initiate_command_routerstatus(), but accepts + * rendezvous data to fetch a hidden service descriptor. */ +void +directory_initiate_command_routerstatus_rend(const routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query) +{ + const or_options_t *options = get_options(); + const node_t *node; + char address_buf[INET_NTOA_BUF_LEN+1]; + struct in_addr in; + const char *address; + tor_addr_t addr; + const int anonymized_connection = dirind_is_anon(indirection); + node = node_get_by_id(status->identity_digest); + + if (!node && anonymized_connection) { + log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " + "don't have its router descriptor.", + routerstatus_describe(status)); + return; + } else if (node) { + node_get_address_string(node, address_buf, sizeof(address_buf)); + address = address_buf; + } else { + in.s_addr = htonl(status->addr); + tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); + address = address_buf; + } + tor_addr_from_ipv4h(&addr, status->addr); + + if (options->ExcludeNodes && options->StrictNodes && + routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { + log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " + "it's in our ExcludedNodes list and StrictNodes is set. " + "Skipping. This choice might make your Tor not work.", + routerstatus_describe(status), + dir_conn_purpose_to_string(dir_purpose)); + return; + } + + directory_initiate_command_rend(address, &addr, + status->or_port, status->dir_port, + status->identity_digest, + dir_purpose, router_purpose, + indirection, resource, + payload, payload_len, if_modified_since, + rend_query); +} + +/** Launch a new connection to the directory server status to + * upload or download a server or rendezvous + * descriptor. dir_purpose determines what + * kind of directory connection we're launching, and must be one of + * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC|RENDDESC_V2}. router_purpose + * specifies the descriptor purposes we have in mind (currently only + * used for FETCH_DIR). + * + * When uploading, payload and payload_len determine the content + * of the HTTP post. Otherwise, payload should be NULL. + * + * When fetching a rendezvous descriptor, resource is the service ID we + * want to fetch. + */ +void +directory_initiate_command_routerstatus(const routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since) +{ + directory_initiate_command_routerstatus_rend(status, dir_purpose, + router_purpose, + indirection, resource, + payload, payload_len, + if_modified_since, NULL); +} + +/** Return true iff conn is the client side of a directory connection + * we launched to ourself in order to determine the reachability of our + * dir_port. */ +static int +directory_conn_is_self_reachability_test(dir_connection_t *conn) +{ + if (conn->requested_resource && + !strcmpstart(conn->requested_resource,"authority")) { + const routerinfo_t *me = router_get_my_routerinfo(); + if (me && + router_digest_is_me(conn->identity_digest) && + tor_addr_eq_ipv4h(&conn->base_.addr, me->addr) && /*XXXX prop 118*/ + me->dir_port == conn->base_.port) + return 1; + } + return 0; +} + +/** Called when we are unable to complete the client's request to a directory + * server due to a network error: Mark the router as down and try again if + * possible. + */ +static void +connection_dir_request_failed(dir_connection_t *conn) +{ + if (directory_conn_is_self_reachability_test(conn)) { + return; /* this was a test fetch. don't retry. */ + } + if (!entry_list_is_constrained(get_options())) + router_set_status(conn->identity_digest, 0); /* don't try him again */ + if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || + conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { + log_info(LD_DIR, "Giving up on serverdesc/extrainfo fetch from " + "directory server at '%s'; retrying", + conn->base_.address); + if (conn->router_purpose == ROUTER_PURPOSE_BRIDGE) + connection_dir_bridge_routerdesc_failed(conn); + connection_dir_download_routerdesc_failed(conn); + } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { + if (conn->requested_resource) + networkstatus_consensus_download_failed(0, conn->requested_resource); + } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { + log_info(LD_DIR, "Giving up on certificate fetch from directory server " + "at '%s'; retrying", + conn->base_.address); + connection_dir_download_cert_failed(conn, 0); + } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { + log_info(LD_DIR, "Giving up downloading detached signatures from '%s'", + conn->base_.address); + } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { + log_info(LD_DIR, "Giving up downloading votes from '%s'", + conn->base_.address); + } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { + log_info(LD_DIR, "Giving up on downloading microdescriptors from " + "directory server at '%s'; will retry", conn->base_.address); + connection_dir_download_routerdesc_failed(conn); + } +} + +/** Helper: Attempt to fetch directly the descriptors of each bridge + * listed in failed. + */ +static void +connection_dir_retry_bridges(smartlist_t *descs) +{ + char digest[DIGEST_LEN]; + SMARTLIST_FOREACH(descs, const char *, cp, + { + if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp))<0) { + log_warn(LD_BUG, "Malformed fingerprint in list: %s", + escaped(cp)); + continue; + } + retry_bridge_descriptor_fetch_directly(digest); + }); +} + +/** Called when an attempt to download one or more router descriptors + * or extra-info documents on connection conn failed. + */ +static void +connection_dir_download_routerdesc_failed(dir_connection_t *conn) +{ + /* No need to increment the failure count for routerdescs, since + * it's not their fault. */ + + /* No need to relaunch descriptor downloads here: we already do it + * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in onion_main.c. */ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || + conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || + conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); + + (void) conn; +} + +/** Called when an attempt to download a bridge's routerdesc from + * one of the authorities failed due to a network error. If + * possible attempt to download descriptors from the bridge directly. + */ +static void +connection_dir_bridge_routerdesc_failed(dir_connection_t *conn) +{ + smartlist_t *which = NULL; + + /* Requests for bridge descriptors are in the form 'fp/', so ignore + anything else. */ + if (!conn->requested_resource || strcmpstart(conn->requested_resource,"fp/")) + return; + + which = smartlist_new(); + dir_split_resource_into_fingerprints(conn->requested_resource + + strlen("fp/"), + which, NULL, 0); + + tor_assert(conn->base_.purpose != DIR_PURPOSE_FETCH_EXTRAINFO); + if (smartlist_len(which)) { + connection_dir_retry_bridges(which); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + } + smartlist_free(which); +} + +/** Called when an attempt to fetch a certificate fails. */ +static void +connection_dir_download_cert_failed(dir_connection_t *conn, int status) +{ + const char *fp_pfx = "fp/"; + const char *fpsk_pfx = "fp-sk/"; + smartlist_t *failed; + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE); + + if (!conn->requested_resource) + return; + failed = smartlist_new(); + /* + * We have two cases download by fingerprint (resource starts + * with "fp/") or download by fingerprint/signing key pair + * (resource starts with "fp-sk/"). + */ + if (!strcmpstart(conn->requested_resource, fp_pfx)) { + /* Download by fingerprint case */ + dir_split_resource_into_fingerprints(conn->requested_resource + + strlen(fp_pfx), + failed, NULL, DSR_HEX); + SMARTLIST_FOREACH_BEGIN(failed, char *, cp) { + /* Null signing key digest indicates download by fp only */ + authority_cert_dl_failed(cp, NULL, status); + tor_free(cp); + } SMARTLIST_FOREACH_END(cp); + } else if (!strcmpstart(conn->requested_resource, fpsk_pfx)) { + /* Download by (fp,sk) pairs */ + dir_split_resource_into_fingerprint_pairs(conn->requested_resource + + strlen(fpsk_pfx), failed); + SMARTLIST_FOREACH_BEGIN(failed, fp_pair_t *, cp) { + authority_cert_dl_failed(cp->first, cp->second, status); + tor_free(cp); + } SMARTLIST_FOREACH_END(cp); + } else { + log_warn(LD_DIR, + "Don't know what to do with failure for cert fetch %s", + conn->requested_resource); + } + + smartlist_free(failed); + + update_certificate_downloads(time(NULL)); +} + +/** Evaluate the situation and decide if we should use an encrypted + * "begindir-style" connection for this directory request. + * 1) If or_port is 0, or it's a direct conn and or_port is firewalled + * or we're a dir mirror, no. + * 2) If we prefer to avoid begindir conns, and we're not fetching or + * publishing a bridge relay descriptor, no. + * 3) Else yes. + */ +static int +directory_command_should_use_begindir(const or_options_t *options, + const tor_addr_t *addr, + int or_port, uint8_t router_purpose, + dir_indirection_t indirection) +{ + if (!or_port) + return 0; /* We don't know an ORPort -- no chance. */ + if (indirection == DIRIND_DIRECT_CONN || indirection == DIRIND_ANON_DIRPORT) + return 0; + if (indirection == DIRIND_ONEHOP) + if (!fascist_firewall_allows_address_or(addr, or_port) || + directory_fetches_from_authorities(options)) + return 0; /* We're firewalled or are acting like a relay -- also no. */ + if (!options->TunnelDirConns && + router_purpose != ROUTER_PURPOSE_BRIDGE) + return 0; /* We prefer to avoid using begindir conns. Fine. */ + return 1; +} + +/** Helper for directory_initiate_command_routerstatus: send the + * command to a server whose address is address, whose IP is + * addr, whose directory port is dir_port, whose tor version + * supports_begindir, and whose identity key digest is + * digest. */ +void +directory_initiate_command(const char *address, const tor_addr_t *_addr, + uint16_t or_port, uint16_t dir_port, + const char *digest, + uint8_t dir_purpose, uint8_t router_purpose, + dir_indirection_t indirection, const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since) +{ + directory_initiate_command_rend(address, _addr, or_port, dir_port, + digest, dir_purpose, + router_purpose, indirection, + resource, payload, payload_len, + if_modified_since, NULL); +} + +/** Return non-zero iff a directory connection with purpose + * dir_purpose reveals sensitive information about a Tor + * instance's client activities. (Such connections must be performed + * through normal three-hop Tor circuits.) */ +static int +is_sensitive_dir_purpose(uint8_t dir_purpose) +{ + return ((dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) || + (dir_purpose == DIR_PURPOSE_HAS_FETCHED_RENDDESC) || + (dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC) || + (dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) || + (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2)); +} + +/** Same as directory_initiate_command(), but accepts rendezvous data to + * fetch a hidden service descriptor. */ +static void +directory_initiate_command_rend(const char *address, const tor_addr_t *_addr, + uint16_t or_port, uint16_t dir_port, + const char *digest, + uint8_t dir_purpose, uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query) +{ + dir_connection_t *conn; + const or_options_t *options = get_options(); + int socket_error = 0; + int use_begindir = directory_command_should_use_begindir(options, _addr, + or_port, router_purpose, indirection); + const int anonymized_connection = dirind_is_anon(indirection); + tor_addr_t addr; + + tor_assert(address); + tor_assert(_addr); + tor_assert(or_port || dir_port); + tor_assert(digest); + + tor_addr_copy(&addr, _addr); + + log_debug(LD_DIR, "anonymized %d, use_begindir %d.", + anonymized_connection, use_begindir); + + log_debug(LD_DIR, "Initiating %s", dir_conn_purpose_to_string(dir_purpose)); + +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(is_sensitive_dir_purpose(dir_purpose) && + !anonymized_connection)); +#else + (void)is_sensitive_dir_purpose; +#endif + + /* ensure that we don't make direct connections when a SOCKS server is + * configured. */ + if (!anonymized_connection && !use_begindir && !options->HTTPProxy && + (options->Socks4Proxy || options->Socks5Proxy)) { + log_warn(LD_DIR, "Cannot connect to a directory server through a " + "SOCKS proxy!"); + return; + } + + conn = dir_connection_new(tor_addr_family(&addr)); + + /* set up conn so it's got all the data we need to remember */ + tor_addr_copy(&conn->base_.addr, &addr); + conn->base_.port = use_begindir ? or_port : dir_port; + conn->base_.address = tor_strdup(address); + memcpy(conn->identity_digest, digest, DIGEST_LEN); + + conn->base_.purpose = dir_purpose; + conn->router_purpose = router_purpose; + + /* give it an initial state */ + conn->base_.state = DIR_CONN_STATE_CONNECTING; + + /* decide whether we can learn our IP address from this conn */ + /* XXXX This is a bad name for this field now. */ + conn->dirconn_direct = !anonymized_connection; + + /* copy rendezvous data, if any */ + if (rend_query) + conn->rend_data = rend_data_dup(rend_query); + + if (!anonymized_connection && !use_begindir) { + /* then we want to connect to dirport directly */ + + if (options->HTTPProxy) { + tor_addr_copy(&addr, &options->HTTPProxyAddr); + dir_port = options->HTTPProxyPort; + } + + switch (connection_connect(TO_CONN(conn), conn->base_.address, &addr, + dir_port, &socket_error)) { + case -1: + connection_dir_request_failed(conn); /* retry if we want */ + /* XXX we only pass 'conn' above, not 'resource', 'payload', + * etc. So in many situations it can't retry! -RD */ + connection_free(TO_CONN(conn)); + return; + case 1: + /* start flushing conn */ + conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; + /* fall through */ + case 0: + /* queue the command on the outbuf */ + directory_send_command(conn, dir_purpose, 1, resource, + payload, payload_len, + if_modified_since); + connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); + /* writable indicates finish, readable indicates broken link, + error indicates broken link in windowsland. */ + } + } else { /* we want to connect via a tor connection */ + entry_connection_t *linked_conn; + /* Anonymized tunneled connections can never share a circuit. + * One-hop directory connections can share circuits with each other + * but nothing else. */ + int iso_flags = anonymized_connection ? ISO_STREAM : ISO_SESSIONGRP; + + /* If it's an anonymized connection, remember the fact that we + * wanted it for later: maybe we'll want it again soon. */ + if (anonymized_connection && use_begindir) + rep_hist_note_used_internal(time(NULL), 0, 1); + else if (anonymized_connection && !use_begindir) + rep_hist_note_used_port(time(NULL), conn->base_.port); + + /* make an AP connection + * populate it and add it at the right state + * hook up both sides + */ + linked_conn = + connection_ap_make_link(TO_CONN(conn), + conn->base_.address, conn->base_.port, + digest, + SESSION_GROUP_DIRCONN, iso_flags, + use_begindir, conn->dirconn_direct); + if (!linked_conn) { + log_warn(LD_NET,"Making tunnel to dirserver failed."); + connection_mark_for_close(TO_CONN(conn)); + return; + } + + if (connection_add(TO_CONN(conn)) < 0) { + log_warn(LD_NET,"Unable to add connection for link to dirserver."); + connection_mark_for_close(TO_CONN(conn)); + return; + } + conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; + /* queue the command on the outbuf */ + directory_send_command(conn, dir_purpose, 0, resource, + payload, payload_len, + if_modified_since); + + connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); + IF_HAS_BUFFEREVENT(ENTRY_TO_CONN(linked_conn), { + connection_watch_events(ENTRY_TO_CONN(linked_conn), + READ_EVENT|WRITE_EVENT); + }) ELSE_IF_NO_BUFFEREVENT + connection_start_reading(ENTRY_TO_CONN(linked_conn)); + } +} + +/** Return true iff anything we say on conn is being encrypted before + * we send it to the client/server. */ +int +connection_dir_is_encrypted(dir_connection_t *conn) +{ + /* Right now it's sufficient to see if conn is or has been linked, since + * the only thing it could be linked to is an edge connection on a + * circuit, and the only way it could have been unlinked is at the edge + * connection getting closed. + */ + return TO_CONN(conn)->linked; +} + +/** Helper for sorting + * + * sort strings alphabetically + */ +static int +compare_strs_(const void **a, const void **b) +{ + const char *s1 = *a, *s2 = *b; + return strcmp(s1, s2); +} + +#define CONDITIONAL_CONSENSUS_FPR_LEN 3 +#if (CONDITIONAL_CONSENSUS_FPR_LEN > DIGEST_LEN) +#error "conditional consensus fingerprint length is larger than digest length" +#endif + +/** Return the URL we should use for a consensus download. + * + * This url depends on whether or not the server we go to + * is sufficiently new to support conditional consensus downloading, + * i.e. GET .../consensus/fpr+fpr+fpr + * + * If 'resource' is provided, it is the name of a consensus flavor to request. + */ +static char * +directory_get_consensus_url(const char *resource) +{ + char *url = NULL; + const char *hyphen, *flavor; + if (resource==NULL || strcmp(resource, "ns")==0) { + flavor = ""; /* Request ns consensuses as "", so older servers will work*/ + hyphen = ""; + } else { + flavor = resource; + hyphen = "-"; + } + + { + char *authority_id_list; + smartlist_t *authority_digests = smartlist_new(); + + SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), + dir_server_t *, ds) { + char *hex; + if (!(ds->type & V3_DIRINFO)) + continue; + + hex = tor_malloc(2*CONDITIONAL_CONSENSUS_FPR_LEN+1); + base16_encode(hex, 2*CONDITIONAL_CONSENSUS_FPR_LEN+1, + ds->v3_identity_digest, CONDITIONAL_CONSENSUS_FPR_LEN); + smartlist_add(authority_digests, hex); + } SMARTLIST_FOREACH_END(ds); + smartlist_sort(authority_digests, compare_strs_); + authority_id_list = smartlist_join_strings(authority_digests, + "+", 0, NULL); + + tor_asprintf(&url, "/tor/status-vote/current/consensus%s%s/%s.z", + hyphen, flavor, authority_id_list); + + SMARTLIST_FOREACH(authority_digests, char *, cp, tor_free(cp)); + smartlist_free(authority_digests); + tor_free(authority_id_list); + } + return url; +} + +/** Queue an appropriate HTTP command on conn-\>outbuf. The other args + * are as in directory_initiate_command(). + */ +static void +directory_send_command(dir_connection_t *conn, + int purpose, int direct, const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since) +{ + char proxystring[256]; + char hoststring[128]; + smartlist_t *headers = smartlist_new(); + char *url; + char request[8192]; + const char *httpcommand = NULL; + + tor_assert(conn); + tor_assert(conn->base_.type == CONN_TYPE_DIR); + + tor_free(conn->requested_resource); + if (resource) + conn->requested_resource = tor_strdup(resource); + + /* come up with a string for which Host: we want */ + if (conn->base_.port == 80) { + strlcpy(hoststring, conn->base_.address, sizeof(hoststring)); + } else { + tor_snprintf(hoststring, sizeof(hoststring),"%s:%d", + conn->base_.address, conn->base_.port); + } + + /* Format if-modified-since */ + if (if_modified_since) { + char b[RFC1123_TIME_LEN+1]; + format_rfc1123_time(b, if_modified_since); + smartlist_add_asprintf(headers, "If-Modified-Since: %s\r\n", b); + } + + /* come up with some proxy lines, if we're using one. */ + if (direct && get_options()->HTTPProxy) { + char *base64_authenticator=NULL; + const char *authenticator = get_options()->HTTPProxyAuthenticator; + + tor_snprintf(proxystring, sizeof(proxystring),"http://%s", hoststring); + if (authenticator) { + base64_authenticator = alloc_http_authenticator(authenticator); + if (!base64_authenticator) + log_warn(LD_BUG, "Encoding http authenticator failed"); + } + if (base64_authenticator) { + smartlist_add_asprintf(headers, + "Proxy-Authorization: Basic %s\r\n", + base64_authenticator); + tor_free(base64_authenticator); + } + } else { + proxystring[0] = 0; + } + + switch (purpose) { + case DIR_PURPOSE_FETCH_CONSENSUS: + /* resource is optional. If present, it's a flavor name */ + tor_assert(!payload); + httpcommand = "GET"; + url = directory_get_consensus_url(resource); + log_info(LD_DIR, "Downloading consensus from %s using %s", + hoststring, url); + break; + case DIR_PURPOSE_FETCH_CERTIFICATE: + tor_assert(resource); + tor_assert(!payload); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/keys/%s", resource); + break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: + tor_assert(resource); + tor_assert(!payload); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/status-vote/next/%s.z", resource); + break; + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: + tor_assert(!resource); + tor_assert(!payload); + httpcommand = "GET"; + url = tor_strdup("/tor/status-vote/next/consensus-signatures.z"); + break; + case DIR_PURPOSE_FETCH_SERVERDESC: + tor_assert(resource); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/server/%s", resource); + break; + case DIR_PURPOSE_FETCH_EXTRAINFO: + tor_assert(resource); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/extra/%s", resource); + break; + case DIR_PURPOSE_FETCH_MICRODESC: + tor_assert(resource); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/micro/%s", resource); + break; + case DIR_PURPOSE_UPLOAD_DIR: { + const char *why = router_get_descriptor_gen_reason(); + tor_assert(!resource); + tor_assert(payload); + httpcommand = "POST"; + url = tor_strdup("/tor/"); + if (why) { + smartlist_add_asprintf(headers, "X-Desc-Gen-Reason: %s\r\n", why); + } + break; + } + case DIR_PURPOSE_UPLOAD_VOTE: + tor_assert(!resource); + tor_assert(payload); + httpcommand = "POST"; + url = tor_strdup("/tor/post/vote"); + break; + case DIR_PURPOSE_UPLOAD_SIGNATURES: + tor_assert(!resource); + tor_assert(payload); + httpcommand = "POST"; + url = tor_strdup("/tor/post/consensus-signature"); + break; + case DIR_PURPOSE_FETCH_RENDDESC_V2: + tor_assert(resource); + tor_assert(strlen(resource) <= REND_DESC_ID_V2_LEN_BASE32); + tor_assert(!payload); + httpcommand = "GET"; + tor_asprintf(&url, "/tor/rendezvous2/%s", resource); + break; + case DIR_PURPOSE_UPLOAD_RENDDESC: + tor_assert(!resource); + tor_assert(payload); + httpcommand = "POST"; + url = tor_strdup("/tor/rendezvous/publish"); + break; + case DIR_PURPOSE_UPLOAD_RENDDESC_V2: + tor_assert(!resource); + tor_assert(payload); + httpcommand = "POST"; + url = tor_strdup("/tor/rendezvous2/publish"); + break; + default: + tor_assert(0); + return; + } + + if (strlen(proxystring) + strlen(url) >= 4096) { + log_warn(LD_BUG, + "Squid does not like URLs longer than 4095 bytes, and this " + "one is %d bytes long: %s%s", + (int)(strlen(proxystring) + strlen(url)), proxystring, url); + } + + tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring); + connection_write_to_buf(request, strlen(request), TO_CONN(conn)); + connection_write_to_buf(url, strlen(url), TO_CONN(conn)); + tor_free(url); + + if (!strcmp(httpcommand, "POST") || payload) { + smartlist_add_asprintf(headers, "Content-Length: %lu\r\n", + payload ? (unsigned long)payload_len : 0); + } + + { + char *header = smartlist_join_strings(headers, "", 0, NULL); + tor_snprintf(request, sizeof(request), " HTTP/1.0\r\nHost: %s\r\n%s\r\n", + hoststring, header); + tor_free(header); + } + + connection_write_to_buf(request, strlen(request), TO_CONN(conn)); + + if (payload) { + /* then send the payload afterwards too */ + connection_write_to_buf(payload, payload_len, TO_CONN(conn)); + } + + SMARTLIST_FOREACH(headers, char *, h, tor_free(h)); + smartlist_free(headers); +} + +/** Parse an HTTP request string headers of the form + * \verbatim + * "\%s [http[s]://]\%s HTTP/1..." + * \endverbatim + * If it's well-formed, strdup the second \%s into *url, and + * nul-terminate it. If the url doesn't start with "/tor/", rewrite it + * so it does. Return 0. + * Otherwise, return -1. + */ +STATIC int +parse_http_url(const char *headers, char **url) +{ + char *s, *start, *tmp; + + s = (char *)eat_whitespace_no_nl(headers); + if (!*s) return -1; + s = (char *)find_whitespace(s); /* get past GET/POST */ + if (!*s) return -1; + s = (char *)eat_whitespace_no_nl(s); + if (!*s) return -1; + start = s; /* this is it, assuming it's valid */ + s = (char *)find_whitespace(start); + if (!*s) return -1; + + /* tolerate the http[s] proxy style of putting the hostname in the url */ + if (s-start >= 4 && !strcmpstart(start,"http")) { + tmp = start + 4; + if (*tmp == 's') + tmp++; + if (s-tmp >= 3 && !strcmpstart(tmp,"://")) { + tmp = strchr(tmp+3, '/'); + if (tmp && tmp < s) { + log_debug(LD_DIR,"Skipping over 'http[s]://hostname/' string"); + start = tmp; + } + } + } + + /* Check if the header is well formed (next sequence + * should be HTTP/1.X\r\n). Assumes we're supporting 1.0? */ + { + unsigned minor_ver; + char ch; + char *e = (char *)eat_whitespace_no_nl(s); + if (2 != tor_sscanf(e, "HTTP/1.%u%c", &minor_ver, &ch)) { + return -1; + } + if (ch != '\r') + return -1; + } + + if (s-start < 5 || strcmpstart(start,"/tor/")) { /* need to rewrite it */ + *url = tor_malloc(s - start + 5); + strlcpy(*url,"/tor", s-start+5); + strlcat((*url)+4, start, s-start+1); + } else { + *url = tor_strndup(start, s-start); + } + return 0; +} + +/** Return a copy of the first HTTP header in headers whose key is + * which. The key should be given with a terminating colon and space; + * this function copies everything after, up to but not including the + * following \\r\\n. */ +static char * +http_get_header(const char *headers, const char *which) +{ + const char *cp = headers; + while (cp) { + if (!strcasecmpstart(cp, which)) { + char *eos; + cp += strlen(which); + if ((eos = strchr(cp,'\r'))) + return tor_strndup(cp, eos-cp); + else + return tor_strdup(cp); + } + cp = strchr(cp, '\n'); + if (cp) + ++cp; + } + return NULL; +} + +/** If headers indicates that a proxy was involved, then rewrite + * conn-\>address to describe our best guess of the address that + * originated this HTTP request. */ +static void +http_set_address_origin(const char *headers, connection_t *conn) +{ + char *fwd; + + fwd = http_get_header(headers, "Forwarded-For: "); + if (!fwd) + fwd = http_get_header(headers, "X-Forwarded-For: "); + if (fwd) { + struct in_addr in; + if (!tor_inet_aton(fwd, &in) || is_internal_IP(ntohl(in.s_addr), 0)) { + log_debug(LD_DIR, "Ignoring unrecognized or internal IP %s", + escaped(fwd)); + tor_free(fwd); + return; + } + tor_free(conn->address); + conn->address = tor_strdup(fwd); + tor_free(fwd); + } +} + +/** Parse an HTTP response string headers of the form + * \verbatim + * "HTTP/1.\%d \%d\%s\r\n...". + * \endverbatim + * + * If it's well-formed, assign the status code to *code and + * return 0. Otherwise, return -1. + * + * On success: If date is provided, set *date to the Date + * header in the http headers, or 0 if no such header is found. If + * compression is provided, set *compression to the + * compression method given in the Content-Encoding header, or 0 if no + * such header is found, or -1 if the value of the header is not + * recognized. If reason is provided, strdup the reason string + * into it. + */ +int +parse_http_response(const char *headers, int *code, time_t *date, + compress_method_t *compression, char **reason) +{ + unsigned n1, n2; + char datestr[RFC1123_TIME_LEN+1]; + smartlist_t *parsed_headers; + tor_assert(headers); + tor_assert(code); + + while (TOR_ISSPACE(*headers)) headers++; /* tolerate leading whitespace */ + + if (tor_sscanf(headers, "HTTP/1.%u %u", &n1, &n2) < 2 || + (n1 != 0 && n1 != 1) || + (n2 < 100 || n2 >= 600)) { + log_warn(LD_HTTP,"Failed to parse header %s",escaped(headers)); + return -1; + } + *code = n2; + + parsed_headers = smartlist_new(); + smartlist_split_string(parsed_headers, headers, "\n", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); + if (reason) { + smartlist_t *status_line_elements = smartlist_new(); + tor_assert(smartlist_len(parsed_headers)); + smartlist_split_string(status_line_elements, + smartlist_get(parsed_headers, 0), + " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); + tor_assert(smartlist_len(status_line_elements) <= 3); + if (smartlist_len(status_line_elements) == 3) { + *reason = smartlist_get(status_line_elements, 2); + smartlist_set(status_line_elements, 2, NULL); /* Prevent free */ + } + SMARTLIST_FOREACH(status_line_elements, char *, cp, tor_free(cp)); + smartlist_free(status_line_elements); + } + if (date) { + *date = 0; + SMARTLIST_FOREACH(parsed_headers, const char *, s, + if (!strcmpstart(s, "Date: ")) { + strlcpy(datestr, s+6, sizeof(datestr)); + /* This will do nothing on failure, so we don't need to check + the result. We shouldn't warn, since there are many other valid + date formats besides the one we use. */ + parse_rfc1123_time(datestr, date); + break; + }); + } + if (compression) { + const char *enc = NULL; + SMARTLIST_FOREACH(parsed_headers, const char *, s, + if (!strcmpstart(s, "Content-Encoding: ")) { + enc = s+18; break; + }); + if (!enc || !strcmp(enc, "identity")) { + *compression = NO_METHOD; + } else if (!strcmp(enc, "deflate") || !strcmp(enc, "x-deflate")) { + *compression = ZLIB_METHOD; + } else if (!strcmp(enc, "gzip") || !strcmp(enc, "x-gzip")) { + *compression = GZIP_METHOD; + } else { + log_info(LD_HTTP, "Unrecognized content encoding: %s. Trying to deal.", + escaped(enc)); + *compression = UNKNOWN_METHOD; + } + } + SMARTLIST_FOREACH(parsed_headers, char *, s, tor_free(s)); + smartlist_free(parsed_headers); + + return 0; +} + +/** Return true iff body doesn't start with a plausible router or + * running-list or directory opening. This is a sign of possible compression. + **/ +static int +body_is_plausible(const char *body, size_t len, int purpose) +{ + int i; + if (len == 0) + return 1; /* empty bodies don't need decompression */ + if (len < 32) + return 0; + if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { + return (!strcmpstart(body,"onion-key")); + } + if (purpose != DIR_PURPOSE_FETCH_RENDDESC) { + if (!strcmpstart(body,"router") || + !strcmpstart(body,"signed-directory") || + !strcmpstart(body,"network-status") || + !strcmpstart(body,"running-routers")) + return 1; + for (i=0;i<32;++i) { + if (!TOR_ISPRINT(body[i]) && !TOR_ISSPACE(body[i])) + return 0; + } + return 1; + } else { + return 1; + } +} + +/** Called when we've just fetched a bunch of router descriptors in + * body. The list which, if present, holds digests for + * descriptors we requested: descriptor digests if descriptor_digests + * is true, or identity digests otherwise. Parse the descriptors, validate + * them, and annotate them as having purpose purpose and as having been + * downloaded from source. + * + * Return the number of routers actually added. */ +static int +load_downloaded_routers(const char *body, smartlist_t *which, + int descriptor_digests, + int router_purpose, + const char *source) +{ + char buf[256]; + char time_buf[ISO_TIME_LEN+1]; + int added = 0; + int general = router_purpose == ROUTER_PURPOSE_GENERAL; + format_iso_time(time_buf, time(NULL)); + tor_assert(source); + + if (tor_snprintf(buf, sizeof(buf), + "@downloaded-at %s\n" + "@source %s\n" + "%s%s%s", time_buf, escaped(source), + !general ? "@purpose " : "", + !general ? router_purpose_to_string(router_purpose) : "", + !general ? "\n" : "")<0) + return added; + + added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, + descriptor_digests, buf); + if (general) + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); + return added; +} + +/** We are a client, and we've finished reading the server's + * response. Parse it and act appropriately. + * + * If we're still happy with using this directory server in the future, return + * 0. Otherwise return -1; and the caller should consider trying the request + * again. + * + * The caller will take care of marking the connection for close. + */ +static int +connection_dir_client_reached_eof(dir_connection_t *conn) +{ + char *body; + char *headers; + char *reason = NULL; + size_t body_len = 0, orig_len = 0; + int status_code; + time_t date_header = 0; + long delta; + compress_method_t compression; + int plausible; + int skewed = 0; + int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || + conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || + conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); + int was_compressed = 0; + time_t now = time(NULL); + int src_code; + + switch (connection_fetch_from_buf_http(TO_CONN(conn), + &headers, MAX_HEADERS_SIZE, + &body, &body_len, MAX_DIR_DL_SIZE, + allow_partial)) { + case -1: /* overflow */ + log_warn(LD_PROTOCOL, + "'fetch' response too large (server '%s:%d'). Closing.", + conn->base_.address, conn->base_.port); + return -1; + case 0: + log_info(LD_HTTP, + "'fetch' response not all here, but we're at eof. Closing."); + return -1; + /* case 1, fall through */ + } + orig_len = body_len; + + if (parse_http_response(headers, &status_code, &date_header, + &compression, &reason) < 0) { + log_warn(LD_HTTP,"Unparseable headers (server '%s:%d'). Closing.", + conn->base_.address, conn->base_.port); + tor_free(body); tor_free(headers); + return -1; + } + if (!reason) reason = tor_strdup("[no reason given]"); + + log_debug(LD_DIR, + "Received response from directory server '%s:%d': %d %s " + "(purpose: %d)", + conn->base_.address, conn->base_.port, status_code, + escaped(reason), + conn->base_.purpose); + + /* now check if it's got any hints for us about our IP address. */ + if (conn->dirconn_direct) { + char *guess = http_get_header(headers, X_ADDRESS_HEADER); + if (guess) { + router_new_address_suggestion(guess, conn); + tor_free(guess); + } + } + + if (date_header > 0) { + /* The date header was written very soon after we sent our request, + * so compute the skew as the difference between sending the request + * and the date header. (We used to check now-date_header, but that's + * inaccurate if we spend a lot of time downloading.) + */ + delta = conn->base_.timestamp_lastwritten - date_header; + if (labs(delta)>ALLOW_DIRECTORY_TIME_SKEW) { + char dbuf[64]; + int trusted = router_digest_is_trusted_dir(conn->identity_digest); + format_time_interval(dbuf, sizeof(dbuf), delta); + log_fn(trusted ? LOG_WARN : LOG_INFO, + LD_HTTP, + "Received directory with skewed time (server '%s:%d'): " + "It seems that our clock is %s by %s, or that theirs is %s. " + "Tor requires an accurate clock to work: please check your time, " + "timezone, and date settings.", + conn->base_.address, conn->base_.port, + delta>0 ? "ahead" : "behind", dbuf, + delta>0 ? "behind" : "ahead"); + skewed = 1; /* don't check the recommended-versions line */ + if (trusted) + control_event_general_status(LOG_WARN, + "CLOCK_SKEW SKEW=%ld SOURCE=DIRSERV:%s:%d", + delta, conn->base_.address, conn->base_.port); + } else { + log_debug(LD_HTTP, "Time on received directory is within tolerance; " + "we are %ld seconds skewed. (That's okay.)", delta); + } + } + (void) skewed; /* skewed isn't used yet. */ + + if (status_code == 503) { + routerstatus_t *rs; + dir_server_t *ds; + const char *id_digest = conn->identity_digest; + log_info(LD_DIR,"Received http status code %d (%s) from server " + "'%s:%d'. I'll try again soon.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + if ((rs = router_get_mutable_consensus_status_by_id(id_digest))) + rs->last_dir_503_at = now; + if ((ds = router_get_fallback_dirserver_by_digest(id_digest))) + ds->fake_status.last_dir_503_at = now; + + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } + + plausible = body_is_plausible(body, body_len, conn->base_.purpose); + if (compression != NO_METHOD || !plausible) { + char *new_body = NULL; + size_t new_len = 0; + compress_method_t guessed = detect_compression_method(body, body_len); + if (compression == UNKNOWN_METHOD || guessed != compression) { + /* Tell the user if we don't believe what we're told about compression.*/ + const char *description1, *description2; + if (compression == ZLIB_METHOD) + description1 = "as deflated"; + else if (compression == GZIP_METHOD) + description1 = "as gzipped"; + else if (compression == NO_METHOD) + description1 = "as uncompressed"; + else + description1 = "with an unknown Content-Encoding"; + if (guessed == ZLIB_METHOD) + description2 = "deflated"; + else if (guessed == GZIP_METHOD) + description2 = "gzipped"; + else if (!plausible) + description2 = "confusing binary junk"; + else + description2 = "uncompressed"; + + log_info(LD_HTTP, "HTTP body from server '%s:%d' was labeled %s, " + "but it seems to be %s.%s", + conn->base_.address, conn->base_.port, description1, + description2, + (compression>0 && guessed>0)?" Trying both.":""); + } + /* Try declared compression first if we can. */ + if (compression == GZIP_METHOD || compression == ZLIB_METHOD) + tor_gzip_uncompress(&new_body, &new_len, body, body_len, compression, + !allow_partial, LOG_PROTOCOL_WARN); + /* Okay, if that didn't work, and we think that it was compressed + * differently, try that. */ + if (!new_body && + (guessed == GZIP_METHOD || guessed == ZLIB_METHOD) && + compression != guessed) + tor_gzip_uncompress(&new_body, &new_len, body, body_len, guessed, + !allow_partial, LOG_PROTOCOL_WARN); + /* If we're pretty sure that we have a compressed directory, and + * we didn't manage to uncompress it, then warn and bail. */ + if (!plausible && !new_body) { + log_fn(LOG_PROTOCOL_WARN, LD_HTTP, + "Unable to decompress HTTP body (server '%s:%d').", + conn->base_.address, conn->base_.port); + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } + if (new_body) { + tor_free(body); + body = new_body; + body_len = new_len; + was_compressed = 1; + } + } + + if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { + int r; + const char *flavname = conn->requested_resource; + if (status_code != 200) { + int severity = (status_code == 304) ? LOG_INFO : LOG_WARN; + tor_log(severity, LD_DIR, + "Received http status code %d (%s) from server " + "'%s:%d' while fetching consensus directory.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + tor_free(body); tor_free(headers); tor_free(reason); + networkstatus_consensus_download_failed(status_code, flavname); + return -1; + } + log_info(LD_DIR,"Received consensus directory (size %d) from server " + "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); + if ((r=networkstatus_set_current_consensus(body, flavname, 0))<0) { + log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, + "Unable to load %s consensus directory downloaded from " + "server '%s:%d'. I'll try again soon.", + flavname, conn->base_.address, conn->base_.port); + tor_free(body); tor_free(headers); tor_free(reason); + networkstatus_consensus_download_failed(0, flavname); + return -1; + } + /* launches router downloads as needed */ + routers_update_all_from_networkstatus(now, 3); + update_microdescs_from_networkstatus(now); + update_microdesc_downloads(now); + directory_info_has_arrived(now, 0); + log_info(LD_DIR, "Successfully loaded consensus."); + } + + if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { + if (status_code != 200) { + log_warn(LD_DIR, + "Received http status code %d (%s) from server " + "'%s:%d' while fetching \"/tor/keys/%s\".", + status_code, escaped(reason), conn->base_.address, + conn->base_.port, conn->requested_resource); + connection_dir_download_cert_failed(conn, status_code); + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } + log_info(LD_DIR,"Received authority certificates (size %d) from server " + "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); + + /* + * Tell trusted_dirs_load_certs_from_string() whether it was by fp + * or fp-sk pair. + */ + src_code = -1; + if (!strcmpstart(conn->requested_resource, "fp/")) { + src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST; + } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) { + src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST; + } + + if (src_code != -1) { + if (trusted_dirs_load_certs_from_string(body, src_code, 1)<0) { + log_warn(LD_DIR, "Unable to parse fetched certificates"); + /* if we fetched more than one and only some failed, the successful + * ones got flushed to disk so it's safe to call this on them */ + connection_dir_download_cert_failed(conn, status_code); + } else { + directory_info_has_arrived(now, 0); + log_info(LD_DIR, "Successfully loaded certificates from fetch."); + } + } else { + log_warn(LD_DIR, + "Couldn't figure out what to do with fetched certificates for " + "unknown resource %s", + conn->requested_resource); + connection_dir_download_cert_failed(conn, status_code); + } + } + if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { + const char *msg; + int st; + log_info(LD_DIR,"Got votes (size %d) from server %s:%d", + (int)body_len, conn->base_.address, conn->base_.port); + if (status_code != 200) { + log_warn(LD_DIR, + "Received http status code %d (%s) from server " + "'%s:%d' while fetching \"/tor/status-vote/next/%s.z\".", + status_code, escaped(reason), conn->base_.address, + conn->base_.port, conn->requested_resource); + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } + dirvote_add_vote(body, &msg, &st); + if (st > 299) { + log_warn(LD_DIR, "Error adding retrieved vote: %s", msg); + } else { + log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg); + } + } + if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { + const char *msg = NULL; + log_info(LD_DIR,"Got detached signatures (size %d) from server %s:%d", + (int)body_len, conn->base_.address, conn->base_.port); + if (status_code != 200) { + log_warn(LD_DIR, + "Received http status code %d (%s) from server '%s:%d' while fetching " + "\"/tor/status-vote/next/consensus-signatures.z\".", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + tor_free(body); tor_free(headers); tor_free(reason); + return -1; + } + if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) { + log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s", + conn->base_.address, conn->base_.port, msg?msg:"???"); + } + } + + if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || + conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { + int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO; + smartlist_t *which = NULL; + int n_asked_for = 0; + int descriptor_digests = conn->requested_resource && + !strcmpstart(conn->requested_resource,"d/"); + log_info(LD_DIR,"Received %s (size %d) from server '%s:%d'", + was_ei ? "extra server info" : "server info", + (int)body_len, conn->base_.address, conn->base_.port); + if (conn->requested_resource && + (!strcmpstart(conn->requested_resource,"d/") || + !strcmpstart(conn->requested_resource,"fp/"))) { + which = smartlist_new(); + dir_split_resource_into_fingerprints(conn->requested_resource + + (descriptor_digests ? 2 : 3), + which, NULL, 0); + n_asked_for = smartlist_len(which); + } + if (status_code != 200) { + int dir_okay = status_code == 404 || + (status_code == 400 && !strcmp(reason, "Servers unavailable.")); + /* 404 means that it didn't have them; no big deal. + * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */ + log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR, + "Received http status code %d (%s) from server '%s:%d' " + "while fetching \"/tor/server/%s\". I'll try again soon.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port, conn->requested_resource); + if (!which) { + connection_dir_download_routerdesc_failed(conn); + } else { + dir_routerdesc_download_failed(which, status_code, + conn->router_purpose, + was_ei, descriptor_digests); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + } + tor_free(body); tor_free(headers); tor_free(reason); + return dir_okay ? 0 : -1; + } + /* Learn the routers, assuming we requested by fingerprint or "all" + * or "authority". + * + * We use "authority" to fetch our own descriptor for + * testing, and to fetch bridge descriptors for bootstrapping. Ignore + * the output of "authority" requests unless we are using bridges, + * since otherwise they'll be the response from reachability tests, + * and we don't really want to add that to our routerlist. */ + if (which || (conn->requested_resource && + (!strcmpstart(conn->requested_resource, "all") || + (!strcmpstart(conn->requested_resource, "authority") && + get_options()->UseBridges)))) { + /* as we learn from them, we remove them from 'which' */ + if (was_ei) { + router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which, + descriptor_digests); + } else { + //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, + // descriptor_digests, conn->router_purpose); + if (load_downloaded_routers(body, which, descriptor_digests, + conn->router_purpose, + conn->base_.address)) + directory_info_has_arrived(now, 0); + } + } + if (which) { /* mark remaining ones as failed */ + log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", + n_asked_for-smartlist_len(which), n_asked_for, + was_ei ? "extra-info documents" : "router descriptors", + conn->base_.address, (int)conn->base_.port); + if (smartlist_len(which)) { + dir_routerdesc_download_failed(which, status_code, + conn->router_purpose, + was_ei, descriptor_digests); + } + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + } + if (directory_conn_is_self_reachability_test(conn)) + router_dirport_found_reachable(); + } + if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { + smartlist_t *which = NULL; + log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " + "size %d) from server '%s:%d'", + status_code, (int)body_len, conn->base_.address, + conn->base_.port); + tor_assert(conn->requested_resource && + !strcmpstart(conn->requested_resource, "d/")); + which = smartlist_new(); + dir_split_resource_into_fingerprints(conn->requested_resource+2, + which, NULL, + DSR_DIGEST256|DSR_BASE64); + if (status_code != 200) { + log_info(LD_DIR, "Received status code %d (%s) from server " + "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again " + "soon.", + status_code, escaped(reason), conn->base_.address, + (int)conn->base_.port, conn->requested_resource); + dir_microdesc_download_failed(which, status_code); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + tor_free(body); tor_free(headers); tor_free(reason); + return 0; + } else { + smartlist_t *mds; + mds = microdescs_add_to_cache(get_microdesc_cache(), + body, body+body_len, SAVED_NOWHERE, 0, + now, which); + if (smartlist_len(which)) { + /* Mark remaining ones as failed. */ + dir_microdesc_download_failed(which, status_code); + } + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + smartlist_free(mds); + } + } + + if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR) { + switch (status_code) { + case 200: { + dir_server_t *ds = + router_get_trusteddirserver_by_digest(conn->identity_digest); + char *rejected_hdr = http_get_header(headers, + "X-Descriptor-Not-New: "); + if (rejected_hdr) { + if (!strcmp(rejected_hdr, "Yes")) { + log_info(LD_GENERAL, + "Authority '%s' declined our descriptor (not new)", + ds->nickname); + /* XXXX use this information; be sure to upload next one + * sooner. -NM */ + /* XXXX023 On further thought, the task above implies that we're + * basing our regenerate-descriptor time on when we uploaded the + * last descriptor, not on the published time of the last + * descriptor. If those are different, that's a bad thing to + * do. -NM */ + } + tor_free(rejected_hdr); + } + log_info(LD_GENERAL,"eof (status 200) after uploading server " + "descriptor: finished."); + control_event_server_status( + LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d", + conn->base_.address, conn->base_.port); + + ds->has_accepted_serverdesc = 1; + if (directories_have_accepted_server_descriptor()) + control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR"); + } + break; + case 400: + log_warn(LD_GENERAL,"http status 400 (%s) response from " + "dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + control_event_server_status(LOG_WARN, + "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"", + conn->base_.address, conn->base_.port, escaped(reason)); + break; + default: + log_warn(LD_GENERAL, + "http status %d (%s) reason unexpected while uploading " + "descriptor to server '%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + break; + } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ + } + + if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE) { + switch (status_code) { + case 200: { + log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d", + conn->base_.address, conn->base_.port); + } + break; + case 400: + log_warn(LD_DIR,"http status 400 (%s) response after uploading " + "vote to dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + break; + default: + log_warn(LD_GENERAL, + "http status %d (%s) reason unexpected while uploading " + "vote to server '%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + break; + } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ + } + + if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES) { + switch (status_code) { + case 200: { + log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d", + conn->base_.address, conn->base_.port); + } + break; + case 400: + log_warn(LD_DIR,"http status 400 (%s) response after uploading " + "signatures to dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + break; + default: + log_warn(LD_GENERAL, + "http status %d (%s) reason unexpected while uploading " + "signatures to server '%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + break; + } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ + } + + if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC) { + tor_assert(conn->rend_data); + log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " + "(%s))", + (int)body_len, status_code, escaped(reason)); + switch (status_code) { + case 200: + if (rend_cache_store(body, body_len, 0, + conn->rend_data->onion_address) < -1) { + log_warn(LD_REND,"Failed to parse rendezvous descriptor."); + /* Any pending rendezvous attempts will notice when + * connection_about_to_close_connection() + * cleans this dir conn up. */ + /* We could retry. But since v0 descriptors are going out of + * style, it isn't worth the hassle. We'll do better in v2. */ + } else { + /* Success, or at least there's a v2 descriptor already + * present. Notify pending connections about this. */ + conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; + rend_client_desc_trynow(conn->rend_data->onion_address); + } + break; + case 404: + /* Not there. Pending connections will be notified when + * connection_about_to_close_connection() cleans this conn up. */ + break; + case 400: + log_warn(LD_REND, + "http status 400 (%s). Dirserver didn't like our " + "rendezvous query?", escaped(reason)); + break; + default: + log_warn(LD_REND,"http status %d (%s) response unexpected while " + "fetching hidden service descriptor (server '%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + break; + } + } + + if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { + #define SEND_HS_DESC_FAILED_EVENT() ( \ + control_event_hs_descriptor_failed(conn->rend_data, \ + conn->identity_digest) ) + tor_assert(conn->rend_data); + log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " + "(%s))", + (int)body_len, status_code, escaped(reason)); + switch (status_code) { + case 200: + switch (rend_cache_store_v2_desc_as_client(body, conn->rend_data)) { + case -2: + log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " + "Retrying at another directory."); + /* We'll retry when connection_about_to_close_connection() + * cleans this dir conn up. */ + SEND_HS_DESC_FAILED_EVENT(); + break; + case -1: + /* We already have a v0 descriptor here. Ignoring this one + * and _not_ performing another request. */ + log_info(LD_REND, "Successfully fetched v2 rendezvous " + "descriptor, but we already have a v0 descriptor."); + conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; + break; + default: + /* success. notify pending connections about this. */ + log_info(LD_REND, "Successfully fetched v2 rendezvous " + "descriptor."); + control_event_hs_descriptor_received(conn->rend_data, + conn->identity_digest); + conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; + rend_client_desc_trynow(conn->rend_data->onion_address); + break; + } + break; + case 404: + /* Not there. We'll retry when + * connection_about_to_close_connection() cleans this conn up. */ + log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " + "Retrying at another directory."); + SEND_HS_DESC_FAILED_EVENT(); + break; + case 400: + log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " + "http status 400 (%s). Dirserver didn't like our " + "v2 rendezvous query? Retrying at another directory.", + escaped(reason)); + SEND_HS_DESC_FAILED_EVENT(); + break; + default: + log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " + "http status %d (%s) response unexpected while " + "fetching v2 hidden service descriptor (server '%s:%d'). " + "Retrying at another directory.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + SEND_HS_DESC_FAILED_EVENT(); + break; + } + } + + if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC || + conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) { + log_info(LD_REND,"Uploaded rendezvous descriptor (status %d " + "(%s))", + status_code, escaped(reason)); + switch (status_code) { + case 200: + log_info(LD_REND, + "Uploading rendezvous descriptor: finished with status " + "200 (%s)", escaped(reason)); + break; + case 400: + log_warn(LD_REND,"http status 400 (%s) response from dirserver " + "'%s:%d'. Malformed rendezvous descriptor?", + escaped(reason), conn->base_.address, conn->base_.port); + break; + default: + log_warn(LD_REND,"http status %d (%s) response unexpected (server " + "'%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + break; + } + } + note_client_request(conn->base_.purpose, was_compressed, orig_len); + tor_free(body); tor_free(headers); tor_free(reason); + return 0; +} + +/** Called when a directory connection reaches EOF. */ +int +connection_dir_reached_eof(dir_connection_t *conn) +{ + int retval; + if (conn->base_.state != DIR_CONN_STATE_CLIENT_READING) { + log_info(LD_HTTP,"conn reached eof, not reading. [state=%d] Closing.", + conn->base_.state); + connection_close_immediate(TO_CONN(conn)); /* error: give up on flushing */ + connection_mark_for_close(TO_CONN(conn)); + return -1; + } + + retval = connection_dir_client_reached_eof(conn); + if (retval == 0) /* success */ + conn->base_.state = DIR_CONN_STATE_CLIENT_FINISHED; + connection_mark_for_close(TO_CONN(conn)); + return retval; +} + +/** If any directory object is arriving, and it's over 10MB large, we're + * getting DoS'd. (As of 0.1.2.x, raw directories are about 1MB, and we never + * ask for more than 96 router descriptors at a time.) + */ +#define MAX_DIRECTORY_OBJECT_SIZE (10*(1<<20)) + +/** Read handler for directory connections. (That's connections to + * directory servers and connections at directory servers.) + */ +int +connection_dir_process_inbuf(dir_connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->base_.type == CONN_TYPE_DIR); + + /* Directory clients write, then read data until they receive EOF; + * directory servers read data until they get an HTTP command, then + * write their response (when it's finished flushing, they mark for + * close). + */ + + /* If we're on the dirserver side, look for a command. */ + if (conn->base_.state == DIR_CONN_STATE_SERVER_COMMAND_WAIT) { + if (directory_handle_command(conn) < 0) { + connection_mark_for_close(TO_CONN(conn)); + return -1; + } + return 0; + } + + if (connection_get_inbuf_len(TO_CONN(conn)) > MAX_DIRECTORY_OBJECT_SIZE) { + log_warn(LD_HTTP, "Too much data received from directory connection: " + "denial of service attempt, or you need to upgrade?"); + connection_mark_for_close(TO_CONN(conn)); + return -1; + } + + if (!conn->base_.inbuf_reached_eof) + log_debug(LD_HTTP,"Got data, not eof. Leaving on inbuf."); + return 0; +} + +/** Called when we're about to finally unlink and free a directory connection: + * perform necessary accounting and cleanup */ +void +connection_dir_about_to_close(dir_connection_t *dir_conn) +{ + connection_t *conn = TO_CONN(dir_conn); + + if (conn->state < DIR_CONN_STATE_CLIENT_FINISHED) { + /* It's a directory connection and connecting or fetching + * failed: forget about this router, and maybe try again. */ + connection_dir_request_failed(dir_conn); + } + /* If we were trying to fetch a v2 rend desc and did not succeed, + * retry as needed. (If a fetch is successful, the connection state + * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that + * refetching is unnecessary.) */ + if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 && + dir_conn->rend_data && + strlen(dir_conn->rend_data->onion_address) == REND_SERVICE_ID_LEN_BASE32) + rend_client_refetch_v2_renddesc(dir_conn->rend_data); +} + +/** Create an http response for the client conn out of + * status and reason_phrase. Write it to conn. + */ +static void +write_http_status_line(dir_connection_t *conn, int status, + const char *reason_phrase) +{ + char buf[256]; + if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n\r\n", + status, reason_phrase ? reason_phrase : "OK") < 0) { + log_warn(LD_BUG,"status line too long."); + return; + } + connection_write_to_buf(buf, strlen(buf), TO_CONN(conn)); +} + +/** Write the header for an HTTP/1.0 response onto conn-\>outbuf, + * with type as the Content-Type. + * + * If length is nonnegative, it is the Content-Length. + * If encoding is provided, it is the Content-Encoding. + * If cache_lifetime is greater than 0, the content may be cached for + * up to cache_lifetime seconds. Otherwise, the content may not be cached. */ +static void +write_http_response_header_impl(dir_connection_t *conn, ssize_t length, + const char *type, const char *encoding, + const char *extra_headers, + long cache_lifetime) +{ + char date[RFC1123_TIME_LEN+1]; + char tmp[1024]; + char *cp; + time_t now = time(NULL); + + tor_assert(conn); + + format_rfc1123_time(date, now); + cp = tmp; + tor_snprintf(cp, sizeof(tmp), + "HTTP/1.0 200 OK\r\nDate: %s\r\n", + date); + cp += strlen(tmp); + if (type) { + tor_snprintf(cp, sizeof(tmp)-(cp-tmp), "Content-Type: %s\r\n", type); + cp += strlen(cp); + } + if (!is_local_addr(&conn->base_.addr)) { + /* Don't report the source address for a nearby/private connection. + * Otherwise we tend to mis-report in cases where incoming ports are + * being forwarded to a Tor server running behind the firewall. */ + tor_snprintf(cp, sizeof(tmp)-(cp-tmp), + X_ADDRESS_HEADER "%s\r\n", conn->base_.address); + cp += strlen(cp); + } + if (encoding) { + tor_snprintf(cp, sizeof(tmp)-(cp-tmp), + "Content-Encoding: %s\r\n", encoding); + cp += strlen(cp); + } + if (length >= 0) { + tor_snprintf(cp, sizeof(tmp)-(cp-tmp), + "Content-Length: %ld\r\n", (long)length); + cp += strlen(cp); + } + if (cache_lifetime > 0) { + char expbuf[RFC1123_TIME_LEN+1]; + format_rfc1123_time(expbuf, now + cache_lifetime); + /* We could say 'Cache-control: max-age=%d' here if we start doing + * http/1.1 */ + tor_snprintf(cp, sizeof(tmp)-(cp-tmp), + "Expires: %s\r\n", expbuf); + cp += strlen(cp); + } else if (cache_lifetime == 0) { + /* We could say 'Cache-control: no-cache' here if we start doing + * http/1.1 */ + strlcpy(cp, "Pragma: no-cache\r\n", sizeof(tmp)-(cp-tmp)); + cp += strlen(cp); + } + if (extra_headers) { + strlcpy(cp, extra_headers, sizeof(tmp)-(cp-tmp)); + cp += strlen(cp); + } + if (sizeof(tmp)-(cp-tmp) > 3) + memcpy(cp, "\r\n", 3); + else + tor_assert(0); + connection_write_to_buf(tmp, strlen(tmp), TO_CONN(conn)); +} + +/** As write_http_response_header_impl, but sets encoding and content-typed + * based on whether the response will be compressed or not. */ +static void +write_http_response_header(dir_connection_t *conn, ssize_t length, + int compressed, long cache_lifetime) +{ + write_http_response_header_impl(conn, length, + compressed?"application/octet-stream":"text/plain", + compressed?"deflate":"identity", + NULL, + cache_lifetime); +} + +#if defined(INSTRUMENT_DOWNLOADS) || defined(RUNNING_DOXYGEN) +/* DOCDOC */ +typedef struct request_t { + uint64_t bytes; /**< How many bytes have we transferred? */ + uint64_t count; /**< How many requests have we made? */ +} request_t; + +/** Map used to keep track of how much data we've up/downloaded in what kind + * of request. Maps from request type to pointer to request_t. */ +static strmap_t *request_map = NULL; + +/** Record that a client request of purpose was made, and that + * bytes bytes of possibly compressed data were sent/received. + * Used to keep track of how much we've up/downloaded in what kind of + * request. */ +static void +note_client_request(int purpose, int compressed, size_t bytes) +{ + char *key; + const char *kind = NULL; + switch (purpose) { + case DIR_PURPOSE_FETCH_CONSENSUS: kind = "dl/consensus"; break; + case DIR_PURPOSE_FETCH_CERTIFICATE: kind = "dl/cert"; break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: kind = "dl/vote"; break; + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: kind = "dl/detached_sig"; + break; + case DIR_PURPOSE_FETCH_SERVERDESC: kind = "dl/server"; break; + case DIR_PURPOSE_FETCH_EXTRAINFO: kind = "dl/extra"; break; + case DIR_PURPOSE_UPLOAD_DIR: kind = "dl/ul-dir"; break; + case DIR_PURPOSE_UPLOAD_VOTE: kind = "dl/ul-vote"; break; + case DIR_PURPOSE_UPLOAD_SIGNATURES: kind = "dl/ul-sig"; break; + case DIR_PURPOSE_FETCH_RENDDESC: kind = "dl/rend"; break; + case DIR_PURPOSE_FETCH_RENDDESC_V2: kind = "dl/rend2"; break; + case DIR_PURPOSE_UPLOAD_RENDDESC: kind = "dl/ul-rend"; break; + case DIR_PURPOSE_UPLOAD_RENDDESC_V2: kind = "dl/ul-rend2"; break; + } + if (kind) { + tor_asprintf(&key, "%s%s", kind, compressed?".z":""); + } else { + tor_asprintf(&key, "unknown purpose (%d)%s", + purpose, compressed?".z":""); + } + note_request(key, bytes); + tor_free(key); +} + +/** Helper: initialize the request map to instrument downloads. */ +static void +ensure_request_map_initialized(void) +{ + if (!request_map) + request_map = strmap_new(); +} + +/** Called when we just transmitted or received bytes worth of data + * because of a request of type key (an arbitrary identifier): adds + * bytes to the total associated with key. */ +void +note_request(const char *key, size_t bytes) +{ + request_t *r; + ensure_request_map_initialized(); + + r = strmap_get(request_map, key); + if (!r) { + r = tor_malloc_zero(sizeof(request_t)); + strmap_set(request_map, key, r); + } + r->bytes += bytes; + r->count++; +} + +/** Return a newly allocated string holding a summary of bytes used per + * request type. */ +char * +directory_dump_request_log(void) +{ + smartlist_t *lines; + char *result; + strmap_iter_t *iter; + + ensure_request_map_initialized(); + + lines = smartlist_new(); + + for (iter = strmap_iter_init(request_map); + !strmap_iter_done(iter); + iter = strmap_iter_next(request_map, iter)) { + const char *key; + void *val; + request_t *r; + strmap_iter_get(iter, &key, &val); + r = val; + smartlist_add_asprintf(lines, "%s "U64_FORMAT" "U64_FORMAT"\n", + key, U64_PRINTF_ARG(r->bytes), U64_PRINTF_ARG(r->count)); + } + smartlist_sort_strings(lines); + result = smartlist_join_strings(lines, "", 0, NULL); + SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); + smartlist_free(lines); + return result; +} +#else +static void +note_client_request(int purpose, int compressed, size_t bytes) +{ + (void)purpose; + (void)compressed; + (void)bytes; +} + +void +note_request(const char *key, size_t bytes) +{ + (void)key; + (void)bytes; +} + +char * +directory_dump_request_log(void) +{ + return tor_strdup("Not supported."); +} +#endif + +/** Decide whether a client would accept the consensus we have. + * + * Clients can say they only want a consensus if it's signed by more + * than half the authorities in a list. They pass this list in + * the url as "...consensus/fpr+fpr+fpr". + * + * fpr may be an abbreviated fingerprint, i.e. only a left substring + * of the full authority identity digest. (Only strings of even length, + * i.e. encodings of full bytes, are handled correctly. In the case + * of an odd number of hex digits the last one is silently ignored.) + * + * Returns 1 if more than half of the requested authorities signed the + * consensus, 0 otherwise. + */ +int +client_likes_consensus(networkstatus_t *v, const char *want_url) +{ + smartlist_t *want_authorities = smartlist_new(); + int need_at_least; + int have = 0; + + dir_split_resource_into_fingerprints(want_url, want_authorities, NULL, 0); + need_at_least = smartlist_len(want_authorities)/2+1; + SMARTLIST_FOREACH_BEGIN(want_authorities, const char *, d) { + char want_digest[DIGEST_LEN]; + size_t want_len = strlen(d)/2; + if (want_len > DIGEST_LEN) + want_len = DIGEST_LEN; + + if (base16_decode(want_digest, DIGEST_LEN, d, want_len*2) < 0) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Failed to decode requested authority digest %s.", d); + continue; + }; + + SMARTLIST_FOREACH_BEGIN(v->voters, networkstatus_voter_info_t *, vi) { + if (smartlist_len(vi->sigs) && + tor_memeq(vi->identity_digest, want_digest, want_len)) { + have++; + break; + }; + } SMARTLIST_FOREACH_END(vi); + + /* early exit, if we already have enough */ + if (have >= need_at_least) + break; + } SMARTLIST_FOREACH_END(d); + + SMARTLIST_FOREACH(want_authorities, char *, d, tor_free(d)); + smartlist_free(want_authorities); + return (have >= need_at_least); +} + +/** Helper function: called when a dirserver gets a complete HTTP GET + * request. Look for a request for a directory or for a rendezvous + * service descriptor. On finding one, write a response into + * conn-\>outbuf. If the request is unrecognized, send a 400. + * Always return 0. */ +static int +directory_handle_command_get(dir_connection_t *conn, const char *headers, + const char *req_body, size_t req_body_len) +{ + size_t dlen; + char *url, *url_mem, *header; + const or_options_t *options = get_options(); + time_t if_modified_since = 0; + int compressed; + size_t url_len; + + /* We ignore the body of a GET request. */ + (void)req_body; + (void)req_body_len; + + log_debug(LD_DIRSERV,"Received GET command."); + + conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; + + if (parse_http_url(headers, &url) < 0) { + write_http_status_line(conn, 400, "Bad request"); + return 0; + } + if ((header = http_get_header(headers, "If-Modified-Since: "))) { + struct tm tm; + if (parse_http_time(header, &tm) == 0) { + if (tor_timegm(&tm, &if_modified_since)<0) + if_modified_since = 0; + } + /* The correct behavior on a malformed If-Modified-Since header is to + * act as if no If-Modified-Since header had been given. */ + tor_free(header); + } + log_debug(LD_DIRSERV,"rewritten url as '%s'.", url); + + url_mem = url; + url_len = strlen(url); + compressed = url_len > 2 && !strcmp(url+url_len-2, ".z"); + if (compressed) { + url[url_len-2] = '\0'; + url_len -= 2; + } + + if (!strcmp(url,"/tor/")) { + const char *frontpage = get_dirportfrontpage(); + + if (frontpage) { + dlen = strlen(frontpage); + /* Let's return a disclaimer page (users shouldn't use V1 anymore, + and caches don't fetch '/', so this is safe). */ + + /* [We don't check for write_bucket_low here, since we want to serve + * this page no matter what.] */ + note_request(url, dlen); + write_http_response_header_impl(conn, dlen, "text/html", "identity", + NULL, DIRPORTFRONTPAGE_CACHE_LIFETIME); + connection_write_to_buf(frontpage, dlen, TO_CONN(conn)); + goto done; + } + /* if no disclaimer file, fall through and continue */ + } + + if (!strcmp(url,"/tor/") || !strcmp(url,"/tor/dir")) { /* v1 dir fetch */ + cached_dir_t *d = dirserv_get_directory(); + + if (!d) { + log_info(LD_DIRSERV,"Client asked for the mirrored directory, but we " + "don't have a good one yet. Sending 503 Dir not available."); + write_http_status_line(conn, 503, "Directory unavailable"); + goto done; + } + if (d->published < if_modified_since) { + write_http_status_line(conn, 304, "Not modified"); + goto done; + } + + dlen = compressed ? d->dir_z_len : d->dir_len; + + if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) { + log_debug(LD_DIRSERV, + "Client asked for the mirrored directory, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + goto done; + } + + note_request(url, dlen); + + log_debug(LD_DIRSERV,"Dumping %sdirectory to client.", + compressed?"compressed ":""); + write_http_response_header(conn, dlen, compressed, + FULL_DIR_CACHE_LIFETIME); + conn->cached_dir = d; + conn->cached_dir_offset = 0; + if (!compressed) + conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); + ++d->refcnt; + + /* Prime the connection with some data. */ + conn->dir_spool_src = DIR_SPOOL_CACHED_DIR; + connection_dirserv_flushed_some(conn); + goto done; + } + + if (!strcmp(url,"/tor/running-routers")) { /* running-routers fetch */ + cached_dir_t *d = dirserv_get_runningrouters(); + if (!d) { + write_http_status_line(conn, 503, "Directory unavailable"); + goto done; + } + if (d->published < if_modified_since) { + write_http_status_line(conn, 304, "Not modified"); + goto done; + } + dlen = compressed ? d->dir_z_len : d->dir_len; + + if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) { + log_info(LD_DIRSERV, + "Client asked for running-routers, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + goto done; + } + note_request(url, dlen); + write_http_response_header(conn, dlen, compressed, + RUNNINGROUTERS_CACHE_LIFETIME); + connection_write_to_buf(compressed ? d->dir_z : d->dir, dlen, + TO_CONN(conn)); + goto done; + } + + if (!strcmpstart(url, "/tor/status-vote/current/consensus")) { + /* v3 network status fetch. */ + smartlist_t *dir_fps = smartlist_new(); + const char *request_type = NULL; + long lifetime = NETWORKSTATUS_CACHE_LIFETIME; + + if (1) { + networkstatus_t *v; + time_t now = time(NULL); + const char *want_fps = NULL; + char *flavor = NULL; + int flav = FLAV_NS; + #define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/" + #define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-" + /* figure out the flavor if any, and who we wanted to sign the thing */ + if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { + const char *f, *cp; + f = url + strlen(CONSENSUS_FLAVORED_PREFIX); + cp = strchr(f, '/'); + if (cp) { + want_fps = cp+1; + flavor = tor_strndup(f, cp-f); + } else { + flavor = tor_strdup(f); + } + flav = networkstatus_parse_flavor_name(flavor); + if (flav < 0) + flav = FLAV_NS; + } else { + if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) + want_fps = url+strlen(CONSENSUS_URL_PREFIX); + } + + v = networkstatus_get_latest_consensus_by_flavor(flav); + + if (v && want_fps && + !client_likes_consensus(v, want_fps)) { + write_http_status_line(conn, 404, "Consensus not signed by sufficient " + "number of requested authorities"); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); + tor_free(flavor); + goto done; + } + + { + char *fp = tor_malloc_zero(DIGEST_LEN); + if (flavor) + strlcpy(fp, flavor, DIGEST_LEN); + tor_free(flavor); + smartlist_add(dir_fps, fp); + } + request_type = compressed?"v3.z":"v3"; + lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; + } + + if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */ + write_http_status_line(conn, 503, "Network status object unavailable"); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE); + goto done; + } + + if (!dirserv_remove_old_statuses(dir_fps, if_modified_since)) { + write_http_status_line(conn, 404, "Not found"); + SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); + goto done; + } else if (!smartlist_len(dir_fps)) { + write_http_status_line(conn, 304, "Not modified"); + SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); + smartlist_free(dir_fps); + geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); + goto done; + } + + dlen = dirserv_estimate_data_size(dir_fps, 0, compressed); + if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + log_debug(LD_DIRSERV, + "Client asked for network status lists, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp)); + smartlist_free(dir_fps); + + geoip_note_ns_response(GEOIP_REJECT_BUSY); + goto done; + } + + if (1) { + struct in_addr in; + tor_addr_t addr; + if (tor_inet_aton((TO_CONN(conn))->address, &in)) { + tor_addr_from_ipv4h(&addr, ntohl(in.s_addr)); + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, + &addr, NULL, + time(NULL)); + geoip_note_ns_response(GEOIP_SUCCESS); + /* Note that a request for a network status has started, so that we + * can measure the download time later on. */ + if (conn->dirreq_id) + geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); + else + geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, + DIRREQ_DIRECT); + } + } + + // note_request(request_type,dlen); + (void) request_type; + write_http_response_header(conn, -1, compressed, + smartlist_len(dir_fps) == 1 ? lifetime : 0); + conn->fingerprint_stack = dir_fps; + if (! compressed) + conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); + + /* Prime the connection with some data. */ + conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; + connection_dirserv_flushed_some(conn); + goto done; + } + + if (!strcmpstart(url,"/tor/status-vote/current/") || + !strcmpstart(url,"/tor/status-vote/next/")) { + /* XXXX If-modified-since is only implemented for the current + * consensus: that's probably fine, since it's the only vote document + * people fetch much. */ + int current; + ssize_t body_len = 0; + ssize_t estimated_len = 0; + smartlist_t *items = smartlist_new(); + smartlist_t *dir_items = smartlist_new(); + int lifetime = 60; /* XXXX023 should actually use vote intervals. */ + url += strlen("/tor/status-vote/"); + current = !strcmpstart(url, "current/"); + url = strchr(url, '/'); + tor_assert(url); + ++url; + if (!strcmp(url, "consensus")) { + const char *item; + tor_assert(!current); /* we handle current consensus specially above, + * since it wants to be spooled. */ + if ((item = dirvote_get_pending_consensus(FLAV_NS))) + smartlist_add(items, (char*)item); + } else if (!current && !strcmp(url, "consensus-signatures")) { + /* XXXX the spec says that we should implement + * current/consensus-signatures too. It doesn't seem to be needed, + * though. */ + const char *item; + if ((item=dirvote_get_pending_detached_signatures())) + smartlist_add(items, (char*)item); + } else if (!strcmp(url, "authority")) { + const cached_dir_t *d; + int flags = DGV_BY_ID | + (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); + if ((d=dirvote_get_vote(NULL, flags))) + smartlist_add(dir_items, (cached_dir_t*)d); + } else { + const cached_dir_t *d; + smartlist_t *fps = smartlist_new(); + int flags; + if (!strcmpstart(url, "d/")) { + url += 2; + flags = DGV_INCLUDE_PENDING | DGV_INCLUDE_PREVIOUS; + } else { + flags = DGV_BY_ID | + (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); + } + dir_split_resource_into_fingerprints(url, fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); + SMARTLIST_FOREACH(fps, char *, fp, { + if ((d = dirvote_get_vote(fp, flags))) + smartlist_add(dir_items, (cached_dir_t*)d); + tor_free(fp); + }); + smartlist_free(fps); + } + if (!smartlist_len(dir_items) && !smartlist_len(items)) { + write_http_status_line(conn, 404, "Not found"); + goto vote_done; + } + SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, + body_len += compressed ? d->dir_z_len : d->dir_len); + estimated_len += body_len; + SMARTLIST_FOREACH(items, const char *, item, { + size_t ln = strlen(item); + if (compressed) { + estimated_len += ln/2; + } else { + body_len += ln; estimated_len += ln; + } + }); + + if (global_write_bucket_low(TO_CONN(conn), estimated_len, 2)) { + write_http_status_line(conn, 503, "Directory busy, try again later."); + goto vote_done; + } + write_http_response_header(conn, body_len ? body_len : -1, compressed, + lifetime); + + if (smartlist_len(items)) { + if (compressed) { + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + SMARTLIST_FOREACH(items, const char *, c, + connection_write_to_buf_zlib(c, strlen(c), conn, 0)); + connection_write_to_buf_zlib("", 0, conn, 1); + } else { + SMARTLIST_FOREACH(items, const char *, c, + connection_write_to_buf(c, strlen(c), TO_CONN(conn))); + } + } else { + SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, + connection_write_to_buf(compressed ? d->dir_z : d->dir, + compressed ? d->dir_z_len : d->dir_len, + TO_CONN(conn))); + } + vote_done: + smartlist_free(items); + smartlist_free(dir_items); + goto done; + } + + if (!strcmpstart(url, "/tor/micro/d/")) { + smartlist_t *fps = smartlist_new(); + + dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"), + fps, NULL, + DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); + + if (!dirserv_have_any_microdesc(fps)) { + write_http_status_line(conn, 404, "Not found"); + SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); + smartlist_free(fps); + goto done; + } + dlen = dirserv_estimate_microdesc_size(fps, compressed); + if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + log_info(LD_DIRSERV, + "Client asked for server descriptors, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); + smartlist_free(fps); + goto done; + } + + write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME); + conn->dir_spool_src = DIR_SPOOL_MICRODESC; + conn->fingerprint_stack = fps; + + if (compressed) + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + + connection_dirserv_flushed_some(conn); + goto done; + } + + if (!strcmpstart(url,"/tor/server/") || + (!options->BridgeAuthoritativeDir && + !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { + int res; + const char *msg; + const char *request_type = NULL; + int cache_lifetime = 0; + int is_extra = !strcmpstart(url,"/tor/extra/"); + url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/"); + conn->fingerprint_stack = smartlist_new(); + res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url, + &msg, + !connection_dir_is_encrypted(conn), + is_extra); + + if (!strcmpstart(url, "fp/")) { + request_type = compressed?"/tor/server/fp.z":"/tor/server/fp"; + if (smartlist_len(conn->fingerprint_stack) == 1) + cache_lifetime = ROUTERDESC_CACHE_LIFETIME; + } else if (!strcmpstart(url, "authority")) { + request_type = compressed?"/tor/server/authority.z": + "/tor/server/authority"; + cache_lifetime = ROUTERDESC_CACHE_LIFETIME; + } else if (!strcmpstart(url, "all")) { + request_type = compressed?"/tor/server/all.z":"/tor/server/all"; + cache_lifetime = FULL_DIR_CACHE_LIFETIME; + } else if (!strcmpstart(url, "d/")) { + request_type = compressed?"/tor/server/d.z":"/tor/server/d"; + if (smartlist_len(conn->fingerprint_stack) == 1) + cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; + } else { + request_type = "/tor/server/?"; + } + (void) request_type; /* usable for note_request. */ + if (!strcmpstart(url, "d/")) + conn->dir_spool_src = + is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST; + else + conn->dir_spool_src = + is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP; + + if (!dirserv_have_any_serverdesc(conn->fingerprint_stack, + conn->dir_spool_src)) { + res = -1; + msg = "Not found"; + } + + if (res < 0) + write_http_status_line(conn, 404, msg); + else { + dlen = dirserv_estimate_data_size(conn->fingerprint_stack, + 1, compressed); + if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + log_info(LD_DIRSERV, + "Client asked for server descriptors, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + conn->dir_spool_src = DIR_SPOOL_NONE; + goto done; + } + write_http_response_header(conn, -1, compressed, cache_lifetime); + if (compressed) + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + /* Prime the connection with some data. */ + connection_dirserv_flushed_some(conn); + } + goto done; + } + + if (!strcmpstart(url,"/tor/keys/")) { + smartlist_t *certs = smartlist_new(); + ssize_t len = -1; + if (!strcmp(url, "/tor/keys/all")) { + authority_cert_get_all(certs); + } else if (!strcmp(url, "/tor/keys/authority")) { + authority_cert_t *cert = get_my_v3_authority_cert(); + if (cert) + smartlist_add(certs, cert); + } else if (!strcmpstart(url, "/tor/keys/fp/")) { + smartlist_t *fps = smartlist_new(); + dir_split_resource_into_fingerprints(url+strlen("/tor/keys/fp/"), + fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); + SMARTLIST_FOREACH(fps, char *, d, { + authority_cert_t *c = authority_cert_get_newest_by_id(d); + if (c) smartlist_add(certs, c); + tor_free(d); + }); + smartlist_free(fps); + } else if (!strcmpstart(url, "/tor/keys/sk/")) { + smartlist_t *fps = smartlist_new(); + dir_split_resource_into_fingerprints(url+strlen("/tor/keys/sk/"), + fps, NULL, + DSR_HEX|DSR_SORT_UNIQ); + SMARTLIST_FOREACH(fps, char *, d, { + authority_cert_t *c = authority_cert_get_by_sk_digest(d); + if (c) smartlist_add(certs, c); + tor_free(d); + }); + smartlist_free(fps); + } else if (!strcmpstart(url, "/tor/keys/fp-sk/")) { + smartlist_t *fp_sks = smartlist_new(); + dir_split_resource_into_fingerprint_pairs(url+strlen("/tor/keys/fp-sk/"), + fp_sks); + SMARTLIST_FOREACH(fp_sks, fp_pair_t *, pair, { + authority_cert_t *c = authority_cert_get_by_digests(pair->first, + pair->second); + if (c) smartlist_add(certs, c); + tor_free(pair); + }); + smartlist_free(fp_sks); + } else { + write_http_status_line(conn, 400, "Bad request"); + goto keys_done; + } + if (!smartlist_len(certs)) { + write_http_status_line(conn, 404, "Not found"); + goto keys_done; + } + SMARTLIST_FOREACH(certs, authority_cert_t *, c, + if (c->cache_info.published_on < if_modified_since) + SMARTLIST_DEL_CURRENT(certs, c)); + if (!smartlist_len(certs)) { + write_http_status_line(conn, 304, "Not modified"); + goto keys_done; + } + len = 0; + SMARTLIST_FOREACH(certs, authority_cert_t *, c, + len += c->cache_info.signed_descriptor_len); + + if (global_write_bucket_low(TO_CONN(conn), compressed?len/2:len, 2)) { + write_http_status_line(conn, 503, "Directory busy, try again later."); + goto keys_done; + } + + write_http_response_header(conn, compressed?-1:len, compressed, 60*60); + if (compressed) { + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + SMARTLIST_FOREACH(certs, authority_cert_t *, c, + connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body, + c->cache_info.signed_descriptor_len, + conn, 0)); + connection_write_to_buf_zlib("", 0, conn, 1); + } else { + SMARTLIST_FOREACH(certs, authority_cert_t *, c, + connection_write_to_buf(c->cache_info.signed_descriptor_body, + c->cache_info.signed_descriptor_len, + TO_CONN(conn))); + } + keys_done: + smartlist_free(certs); + goto done; + } + + if (options->HidServDirectoryV2 && + connection_dir_is_encrypted(conn) && + !strcmpstart(url,"/tor/rendezvous2/")) { + /* Handle v2 rendezvous descriptor fetch request. */ + const char *descp; + const char *query = url + strlen("/tor/rendezvous2/"); + if (strlen(query) == REND_DESC_ID_V2_LEN_BASE32) { + log_info(LD_REND, "Got a v2 rendezvous descriptor request for ID '%s'", + safe_str(query)); + switch (rend_cache_lookup_v2_desc_as_dir(query, &descp)) { + case 1: /* valid */ + write_http_response_header(conn, strlen(descp), 0, 0); + connection_write_to_buf(descp, strlen(descp), TO_CONN(conn)); + break; + case 0: /* well-formed but not present */ + write_http_status_line(conn, 404, "Not found"); + break; + case -1: /* not well-formed */ + write_http_status_line(conn, 400, "Bad request"); + break; + } + } else { /* not well-formed */ + write_http_status_line(conn, 400, "Bad request"); + } + goto done; + } + + if (options->HSAuthoritativeDir && !strcmpstart(url,"/tor/rendezvous/")) { + /* rendezvous descriptor fetch */ + const char *descp; + size_t desc_len; + const char *query = url+strlen("/tor/rendezvous/"); + + log_info(LD_REND, "Handling rendezvous descriptor get"); + switch (rend_cache_lookup_desc(query, 0, &descp, &desc_len)) { + case 1: /* valid */ + write_http_response_header_impl(conn, desc_len, + "application/octet-stream", + NULL, NULL, 0); + note_request("/tor/rendezvous?/", desc_len); + /* need to send descp separately, because it may include NULs */ + connection_write_to_buf(descp, desc_len, TO_CONN(conn)); + break; + case 0: /* well-formed but not present */ + write_http_status_line(conn, 404, "Not found"); + break; + case -1: /* not well-formed */ + write_http_status_line(conn, 400, "Bad request"); + break; + } + goto done; + } + + if (options->BridgeAuthoritativeDir && + options->BridgePassword_AuthDigest_ && + connection_dir_is_encrypted(conn) && + !strcmp(url,"/tor/networkstatus-bridges")) { + char *status; + char digest[DIGEST256_LEN]; + + header = http_get_header(headers, "Authorization: Basic "); + if (header) + crypto_digest256(digest, header, strlen(header), DIGEST_SHA256); + + /* now make sure the password is there and right */ + if (!header || + tor_memneq(digest, + options->BridgePassword_AuthDigest_, DIGEST256_LEN)) { + write_http_status_line(conn, 404, "Not found"); + tor_free(header); + goto done; + } + tor_free(header); + + /* all happy now. send an answer. */ + status = networkstatus_getinfo_by_purpose("bridge", time(NULL)); + dlen = strlen(status); + write_http_response_header(conn, dlen, 0, 0); + connection_write_to_buf(status, dlen, TO_CONN(conn)); + tor_free(status); + goto done; + } + + if (!strcmpstart(url,"/tor/bytes.txt")) { + char *bytes = directory_dump_request_log(); + size_t len = strlen(bytes); + write_http_response_header(conn, len, 0, 0); + connection_write_to_buf(bytes, len, TO_CONN(conn)); + tor_free(bytes); + goto done; + } + + if (!strcmp(url,"/tor/robots.txt")) { /* /robots.txt will have been + rewritten to /tor/robots.txt */ + char robots[] = "User-agent: *\r\nDisallow: /\r\n"; + size_t len = strlen(robots); + write_http_response_header(conn, len, 0, ROBOTS_CACHE_LIFETIME); + connection_write_to_buf(robots, len, TO_CONN(conn)); + goto done; + } + + if (!strcmp(url,"/tor/dbg-stability.txt")) { + const char *stability; + size_t len; + if (options->BridgeAuthoritativeDir || + ! authdir_mode_tests_reachability(options) || + ! (stability = rep_hist_get_router_stability_doc(time(NULL)))) { + write_http_status_line(conn, 404, "Not found."); + goto done; + } + + len = strlen(stability); + write_http_response_header(conn, len, 0, 0); + connection_write_to_buf(stability, len, TO_CONN(conn)); + goto done; + } + +#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) +#define ADD_MALLINFO_LINE(x) do { \ + smartlist_add_asprintf(lines, "%s %d\n", #x, mi.x); \ + }while(0); + + if (!strcmp(url,"/tor/mallinfo.txt") && + (tor_addr_eq_ipv4h(&conn->base_.addr, 0x7f000001ul))) { + char *result; + size_t len; + struct mallinfo mi; + smartlist_t *lines; + + memset(&mi, 0, sizeof(mi)); + mi = mallinfo(); + lines = smartlist_new(); + + ADD_MALLINFO_LINE(arena) + ADD_MALLINFO_LINE(ordblks) + ADD_MALLINFO_LINE(smblks) + ADD_MALLINFO_LINE(hblks) + ADD_MALLINFO_LINE(hblkhd) + ADD_MALLINFO_LINE(usmblks) + ADD_MALLINFO_LINE(fsmblks) + ADD_MALLINFO_LINE(uordblks) + ADD_MALLINFO_LINE(fordblks) + ADD_MALLINFO_LINE(keepcost) + + result = smartlist_join_strings(lines, "", 0, NULL); + SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); + smartlist_free(lines); + + len = strlen(result); + write_http_response_header(conn, len, 0, 0); + connection_write_to_buf(result, len, TO_CONN(conn)); + tor_free(result); + goto done; + } +#endif + + /* we didn't recognize the url */ + write_http_status_line(conn, 404, "Not found"); + + done: + tor_free(url_mem); + return 0; +} + +/** Helper function: called when a dirserver gets a complete HTTP POST + * request. Look for an uploaded server descriptor or rendezvous + * service descriptor. On finding one, process it and write a + * response into conn-\>outbuf. If the request is unrecognized, send a + * 400. Always return 0. */ +static int +directory_handle_command_post(dir_connection_t *conn, const char *headers, + const char *body, size_t body_len) +{ + char *url = NULL; + const or_options_t *options = get_options(); + + log_debug(LD_DIRSERV,"Received POST command."); + + conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; + + if (parse_http_url(headers, &url) < 0) { + write_http_status_line(conn, 400, "Bad request"); + return 0; + } + log_debug(LD_DIRSERV,"rewritten url as '%s'.", url); + + /* Handle v2 rendezvous service publish request. */ + if (options->HidServDirectoryV2 && + connection_dir_is_encrypted(conn) && + !strcmpstart(url,"/tor/rendezvous2/publish")) { + switch (rend_cache_store_v2_desc_as_dir(body)) { + case -2: + log_info(LD_REND, "Rejected v2 rend descriptor (length %d) from %s " + "since we're not currently a hidden service directory.", + (int)body_len, conn->base_.address); + write_http_status_line(conn, 503, "Currently not acting as v2 " + "hidden service directory"); + break; + case -1: + log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.", + (int)body_len, conn->base_.address); + write_http_status_line(conn, 400, + "Invalid v2 service descriptor rejected"); + break; + default: + write_http_status_line(conn, 200, "Service descriptor (v2) stored"); + log_info(LD_REND, "Handled v2 rendezvous descriptor post: accepted"); + } + goto done; + } + + if (!authdir_mode(options)) { + /* we just provide cached directories; we don't want to + * receive anything. */ + write_http_status_line(conn, 400, "Nonauthoritative directory does not " + "accept posted server descriptors"); + goto done; + } + + if (authdir_mode_handles_descs(options, -1) && + !strcmp(url,"/tor/")) { /* server descriptor post */ + const char *msg = "[None]"; + uint8_t purpose = authdir_mode_bridge(options) ? + ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; + was_router_added_t r = dirserv_add_multiple_descriptors(body, purpose, + conn->base_.address, &msg); + tor_assert(msg); + if (WRA_WAS_ADDED(r)) + dirserv_get_directory(); /* rebuild and write to disk */ + + if (r == ROUTER_ADDED_NOTIFY_GENERATOR) { + /* Accepted with a message. */ + log_info(LD_DIRSERV, + "Problematic router descriptor or extra-info from %s " + "(\"%s\").", + conn->base_.address, msg); + write_http_status_line(conn, 400, msg); + } else if (r == ROUTER_ADDED_SUCCESSFULLY) { + write_http_status_line(conn, 200, msg); + } else if (WRA_WAS_OUTDATED(r)) { + write_http_response_header_impl(conn, -1, NULL, NULL, + "X-Descriptor-Not-New: Yes\r\n", -1); + } else { + log_info(LD_DIRSERV, + "Rejected router descriptor or extra-info from %s " + "(\"%s\").", + conn->base_.address, msg); + write_http_status_line(conn, 400, msg); + } + goto done; + } + + if (options->HSAuthoritativeDir && + !strcmpstart(url,"/tor/rendezvous/publish")) { + /* rendezvous descriptor post */ + log_info(LD_REND, "Handling rendezvous descriptor post."); + if (rend_cache_store(body, body_len, 1, NULL) < 0) { + log_fn(LOG_PROTOCOL_WARN, LD_DIRSERV, + "Rejected rend descriptor (length %d) from %s.", + (int)body_len, conn->base_.address); + write_http_status_line(conn, 400, + "Invalid v0 service descriptor rejected"); + } else { + write_http_status_line(conn, 200, "Service descriptor (v0) stored"); + } + goto done; + } + + if (authdir_mode_v3(options) && + !strcmp(url,"/tor/post/vote")) { /* v3 networkstatus vote */ + const char *msg = "OK"; + int status; + if (dirvote_add_vote(body, &msg, &status)) { + write_http_status_line(conn, status, "Vote stored"); + } else { + tor_assert(msg); + log_warn(LD_DIRSERV, "Rejected vote from %s (\"%s\").", + conn->base_.address, msg); + write_http_status_line(conn, status, msg); + } + goto done; + } + + if (authdir_mode_v3(options) && + !strcmp(url,"/tor/post/consensus-signature")) { /* sigs on consensus. */ + const char *msg = NULL; + if (dirvote_add_signatures(body, conn->base_.address, &msg)>=0) { + write_http_status_line(conn, 200, msg?msg:"Signatures stored"); + } else { + log_warn(LD_DIR, "Unable to store signatures posted by %s: %s", + conn->base_.address, msg?msg:"???"); + write_http_status_line(conn, 400, msg?msg:"Unable to store signatures"); + } + goto done; + } + + /* we didn't recognize the url */ + write_http_status_line(conn, 404, "Not found"); + + done: + tor_free(url); + return 0; +} + +/** Called when a dirserver receives data on a directory connection; + * looks for an HTTP request. If the request is complete, remove it + * from the inbuf, try to process it; otherwise, leave it on the + * buffer. Return a 0 on success, or -1 on error. + */ +static int +directory_handle_command(dir_connection_t *conn) +{ + char *headers=NULL, *body=NULL; + size_t body_len=0; + int r; + + tor_assert(conn); + tor_assert(conn->base_.type == CONN_TYPE_DIR); + + switch (connection_fetch_from_buf_http(TO_CONN(conn), + &headers, MAX_HEADERS_SIZE, + &body, &body_len, MAX_DIR_UL_SIZE, 0)) { + case -1: /* overflow */ + log_warn(LD_DIRSERV, + "Request too large from address '%s' to DirPort. Closing.", + safe_str(conn->base_.address)); + return -1; + case 0: + log_debug(LD_DIRSERV,"command not all here yet."); + return 0; + /* case 1, fall through */ + } + + http_set_address_origin(headers, TO_CONN(conn)); + //log_debug(LD_DIRSERV,"headers %s, body %s.", headers, body); + + if (!strncasecmp(headers,"GET",3)) + r = directory_handle_command_get(conn, headers, body, body_len); + else if (!strncasecmp(headers,"POST",4)) + r = directory_handle_command_post(conn, headers, body, body_len); + else { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Got headers %s with unknown command. Closing.", + escaped(headers)); + r = -1; + } + + tor_free(headers); tor_free(body); + return r; +} + +/** Write handler for directory connections; called when all data has + * been flushed. Close the connection or wait for a response as + * appropriate. + */ +int +connection_dir_finished_flushing(dir_connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->base_.type == CONN_TYPE_DIR); + + /* Note that we have finished writing the directory response. For direct + * connections this means we're done, for tunneled connections its only + * an intermediate step. */ + if (conn->dirreq_id) + geoip_change_dirreq_state(conn->dirreq_id, DIRREQ_TUNNELED, + DIRREQ_FLUSHING_DIR_CONN_FINISHED); + else + geoip_change_dirreq_state(TO_CONN(conn)->global_identifier, + DIRREQ_DIRECT, + DIRREQ_FLUSHING_DIR_CONN_FINISHED); + switch (conn->base_.state) { + case DIR_CONN_STATE_CONNECTING: + case DIR_CONN_STATE_CLIENT_SENDING: + log_debug(LD_DIR,"client finished sending command."); + conn->base_.state = DIR_CONN_STATE_CLIENT_READING; + return 0; + case DIR_CONN_STATE_SERVER_WRITING: + if (conn->dir_spool_src != DIR_SPOOL_NONE) { +#ifdef USE_BUFFEREVENTS + /* This can happen with paired bufferevents, since a paired connection + * can flush immediately when you write to it, making the subsequent + * check in connection_handle_write_cb() decide that the connection + * is flushed. */ + log_debug(LD_DIRSERV, "Emptied a dirserv buffer, but still spooling."); +#else + log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!"); + connection_mark_for_close(TO_CONN(conn)); +#endif + } else { + log_debug(LD_DIRSERV, "Finished writing server response. Closing."); + connection_mark_for_close(TO_CONN(conn)); + } + return 0; + default: + log_warn(LD_BUG,"called in unexpected state %d.", + conn->base_.state); + tor_fragile_assert(); + return -1; + } + return 0; +} + +/** Connected handler for directory connections: begin sending data to the + * server */ +int +connection_dir_finished_connecting(dir_connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->base_.type == CONN_TYPE_DIR); + tor_assert(conn->base_.state == DIR_CONN_STATE_CONNECTING); + + log_debug(LD_HTTP,"Dir connection to router %s:%u established.", + conn->base_.address,conn->base_.port); + + conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; /* start flushing conn */ + return 0; +} + +/** Decide which download schedule we want to use based on descriptor type + * in dls and whether we are acting as directory server, and + * then return a list of int pointers defining download delays in seconds. + * Helper function for download_status_increment_failure() and + * download_status_reset(). */ +static const smartlist_t * +find_dl_schedule_and_len(download_status_t *dls, int server) +{ + switch (dls->schedule) { + case DL_SCHED_GENERIC: + if (server) + return get_options()->TestingServerDownloadSchedule; + else + return get_options()->TestingClientDownloadSchedule; + case DL_SCHED_CONSENSUS: + if (server) + return get_options()->TestingServerConsensusDownloadSchedule; + else + return get_options()->TestingClientConsensusDownloadSchedule; + case DL_SCHED_BRIDGE: + return get_options()->TestingBridgeDownloadSchedule; + default: + tor_assert(0); + } +} + +/** Called when an attempt to download dls has failed with HTTP status + * status_code. Increment the failure count (if the code indicates a + * real failure) and set dls-\>next_attempt_at to an appropriate time + * in the future. */ +time_t +download_status_increment_failure(download_status_t *dls, int status_code, + const char *item, int server, time_t now) +{ + const smartlist_t *schedule; + int increment; + tor_assert(dls); + if (status_code != 503 || server) { + if (dls->n_download_failures < IMPOSSIBLE_TO_DOWNLOAD-1) + ++dls->n_download_failures; + } + + schedule = find_dl_schedule_and_len(dls, server); + + if (dls->n_download_failures < smartlist_len(schedule)) + increment = *(int *)smartlist_get(schedule, dls->n_download_failures); + else if (dls->n_download_failures == IMPOSSIBLE_TO_DOWNLOAD) + increment = INT_MAX; + else + increment = *(int *)smartlist_get(schedule, smartlist_len(schedule) - 1); + + if (increment < INT_MAX) + dls->next_attempt_at = now+increment; + else + dls->next_attempt_at = TIME_MAX; + + if (item) { + if (increment == 0) + log_debug(LD_DIR, "%s failed %d time(s); I'll try again immediately.", + item, (int)dls->n_download_failures); + else if (dls->next_attempt_at < TIME_MAX) + log_debug(LD_DIR, "%s failed %d time(s); I'll try again in %d seconds.", + item, (int)dls->n_download_failures, + (int)(dls->next_attempt_at-now)); + else + log_debug(LD_DIR, "%s failed %d time(s); Giving up for a while.", + item, (int)dls->n_download_failures); + } + return dls->next_attempt_at; +} + +/** Reset dls so that it will be considered downloadable + * immediately, and/or to show that we don't need it anymore. + * + * (We find the zeroth element of the download schedule, and set + * next_attempt_at to be the appropriate offset from 'now'. In most + * cases this means setting it to 'now', so the item will be immediately + * downloadable; in the case of bridge descriptors, the zeroth element + * is an hour from now.) */ +void +download_status_reset(download_status_t *dls) +{ + const smartlist_t *schedule = find_dl_schedule_and_len( + dls, get_options()->DirPort_set); + + dls->n_download_failures = 0; + dls->next_attempt_at = time(NULL) + *(int *)smartlist_get(schedule, 0); +} + +/** Return the number of failures on dls since the last success (if + * any). */ +int +download_status_get_n_failures(const download_status_t *dls) +{ + return dls->n_download_failures; +} + +/** Called when one or more routerdesc (or extrainfo, if was_extrainfo) + * fetches have failed (with uppercase fingerprints listed in failed, + * either as descriptor digests or as identity digests based on + * was_descriptor_digests). + */ +static void +dir_routerdesc_download_failed(smartlist_t *failed, int status_code, + int router_purpose, + int was_extrainfo, int was_descriptor_digests) +{ + char digest[DIGEST_LEN]; + time_t now = time(NULL); + int server = directory_fetches_from_authorities(get_options()); + if (!was_descriptor_digests) { + if (router_purpose == ROUTER_PURPOSE_BRIDGE) { + tor_assert(!was_extrainfo); + connection_dir_retry_bridges(failed); + } + return; /* FFFF should implement for other-than-router-purpose someday */ + } + SMARTLIST_FOREACH_BEGIN(failed, const char *, cp) { + download_status_t *dls = NULL; + if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp)) < 0) { + log_warn(LD_BUG, "Malformed fingerprint in list: %s", escaped(cp)); + continue; + } + if (was_extrainfo) { + signed_descriptor_t *sd = + router_get_by_extrainfo_digest(digest); + if (sd) + dls = &sd->ei_dl_status; + } else { + dls = router_get_dl_status_by_descriptor_digest(digest); + } + if (!dls || dls->n_download_failures >= + get_options()->TestingDescriptorMaxDownloadTries) + continue; + download_status_increment_failure(dls, status_code, cp, server, now); + } SMARTLIST_FOREACH_END(cp); + + /* No need to relaunch descriptor downloads here: we already do it + * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in onion_main.c. */ +} + +/** Called when a connection to download microdescriptors has failed in whole + * or in part. failed is a list of every microdesc digest we didn't + * get. status_code is the http status code we received. Reschedule the + * microdesc downloads as appropriate. */ +static void +dir_microdesc_download_failed(smartlist_t *failed, + int status_code) +{ + networkstatus_t *consensus + = networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); + routerstatus_t *rs; + download_status_t *dls; + time_t now = time(NULL); + int server = directory_fetches_from_authorities(get_options()); + + if (! consensus) + return; + SMARTLIST_FOREACH_BEGIN(failed, const char *, d) { + rs = router_get_mutable_consensus_status_by_descriptor_digest(consensus,d); + if (!rs) + continue; + dls = &rs->dl_status; + if (dls->n_download_failures >= + get_options()->TestingMicrodescMaxDownloadTries) + continue; + { + char buf[BASE64_DIGEST256_LEN+1]; + digest256_to_base64(buf, d); + download_status_increment_failure(dls, status_code, buf, + server, now); + } + } SMARTLIST_FOREACH_END(d); +} + +/** Helper. Compare two fp_pair_t objects, and return negative, 0, or + * positive as appropriate. */ +static int +compare_pairs_(const void **a, const void **b) +{ + const fp_pair_t *fp1 = *a, *fp2 = *b; + int r; + if ((r = fast_memcmp(fp1->first, fp2->first, DIGEST_LEN))) + return r; + else + return fast_memcmp(fp1->second, fp2->second, DIGEST_LEN); +} + +/** Divide a string res of the form FP1-FP2+FP3-FP4...[.z], where each + * FP is a hex-encoded fingerprint, into a sequence of distinct sorted + * fp_pair_t. Skip malformed pairs. On success, return 0 and add those + * fp_pair_t into pairs_out. On failure, return -1. */ +int +dir_split_resource_into_fingerprint_pairs(const char *res, + smartlist_t *pairs_out) +{ + smartlist_t *pairs_tmp = smartlist_new(); + smartlist_t *pairs_result = smartlist_new(); + + smartlist_split_string(pairs_tmp, res, "+", 0, 0); + if (smartlist_len(pairs_tmp)) { + char *last = smartlist_get(pairs_tmp,smartlist_len(pairs_tmp)-1); + size_t last_len = strlen(last); + if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { + last[last_len-2] = '\0'; + } + } + SMARTLIST_FOREACH_BEGIN(pairs_tmp, char *, cp) { + if (strlen(cp) != HEX_DIGEST_LEN*2+1) { + log_info(LD_DIR, + "Skipping digest pair %s with non-standard length.", escaped(cp)); + } else if (cp[HEX_DIGEST_LEN] != '-') { + log_info(LD_DIR, + "Skipping digest pair %s with missing dash.", escaped(cp)); + } else { + fp_pair_t pair; + if (base16_decode(pair.first, DIGEST_LEN, cp, HEX_DIGEST_LEN)<0 || + base16_decode(pair.second, + DIGEST_LEN, cp+HEX_DIGEST_LEN+1, HEX_DIGEST_LEN)<0) { + log_info(LD_DIR, "Skipping non-decodable digest pair %s", escaped(cp)); + } else { + smartlist_add(pairs_result, tor_memdup(&pair, sizeof(pair))); + } + } + tor_free(cp); + } SMARTLIST_FOREACH_END(cp); + smartlist_free(pairs_tmp); + + /* Uniq-and-sort */ + smartlist_sort(pairs_result, compare_pairs_); + smartlist_uniq(pairs_result, compare_pairs_, tor_free_); + + smartlist_add_all(pairs_out, pairs_result); + smartlist_free(pairs_result); + return 0; +} + +/** Given a directory resource request, containing zero + * or more strings separated by plus signs, followed optionally by ".z", store + * the strings, in order, into fp_out. If compressed_out is + * non-NULL, set it to 1 if the resource ends in ".z", else set it to 0. + * + * If (flags & DSR_HEX), then delete all elements that aren't hex digests, and + * decode the rest. If (flags & DSR_BASE64), then use "-" rather than "+" as + * a separator, delete all the elements that aren't base64-encoded digests, + * and decode the rest. If (flags & DSR_DIGEST256), these digests should be + * 256 bits long; else they should be 160. + * + * If (flags & DSR_SORT_UNIQ), then sort the list and remove all duplicates. + */ +int +dir_split_resource_into_fingerprints(const char *resource, + smartlist_t *fp_out, int *compressed_out, + int flags) +{ + const int decode_hex = flags & DSR_HEX; + const int decode_base64 = flags & DSR_BASE64; + const int digests_are_256 = flags & DSR_DIGEST256; + const int sort_uniq = flags & DSR_SORT_UNIQ; + + const int digest_len = digests_are_256 ? DIGEST256_LEN : DIGEST_LEN; + const int hex_digest_len = digests_are_256 ? + HEX_DIGEST256_LEN : HEX_DIGEST_LEN; + const int base64_digest_len = digests_are_256 ? + BASE64_DIGEST256_LEN : BASE64_DIGEST_LEN; + smartlist_t *fp_tmp = smartlist_new(); + + tor_assert(!(decode_hex && decode_base64)); + tor_assert(fp_out); + + smartlist_split_string(fp_tmp, resource, decode_base64?"-":"+", 0, 0); + if (compressed_out) + *compressed_out = 0; + if (smartlist_len(fp_tmp)) { + char *last = smartlist_get(fp_tmp,smartlist_len(fp_tmp)-1); + size_t last_len = strlen(last); + if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { + last[last_len-2] = '\0'; + if (compressed_out) + *compressed_out = 1; + } + } + if (decode_hex || decode_base64) { + const size_t encoded_len = decode_hex ? hex_digest_len : base64_digest_len; + int i; + char *cp, *d = NULL; + for (i = 0; i < smartlist_len(fp_tmp); ++i) { + cp = smartlist_get(fp_tmp, i); + if (strlen(cp) != encoded_len) { + log_info(LD_DIR, + "Skipping digest %s with non-standard length.", escaped(cp)); + smartlist_del_keeporder(fp_tmp, i--); + goto again; + } + d = tor_malloc_zero(digest_len); + if (decode_hex ? + (base16_decode(d, digest_len, cp, hex_digest_len)<0) : + (base64_decode(d, digest_len, cp, base64_digest_len)<0)) { + log_info(LD_DIR, "Skipping non-decodable digest %s", escaped(cp)); + smartlist_del_keeporder(fp_tmp, i--); + goto again; + } + smartlist_set(fp_tmp, i, d); + d = NULL; + again: + tor_free(cp); + tor_free(d); + } + } + if (sort_uniq) { + if (decode_hex || decode_base64) { + if (digests_are_256) { + smartlist_sort_digests256(fp_tmp); + smartlist_uniq_digests256(fp_tmp); + } else { + smartlist_sort_digests(fp_tmp); + smartlist_uniq_digests(fp_tmp); + } + } else { + smartlist_sort_strings(fp_tmp); + smartlist_uniq_strings(fp_tmp); + } + } + smartlist_add_all(fp_out, fp_tmp); + smartlist_free(fp_tmp); + return 0; +} + diff --git a/src/tor/directory.h b/src/tor/directory.h new file mode 100644 index 000000000..0453160f7 --- /dev/null +++ b/src/tor/directory.h @@ -0,0 +1,127 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file directory.h + * \brief Header file for directory.c. + **/ + +#ifndef TOR_DIRECTORY_H +#define TOR_DIRECTORY_H + +int directories_have_accepted_server_descriptor(void); +void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, + dirinfo_type_t type, const char *payload, + size_t payload_len, size_t extrainfo_len); +void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, + const char *resource, + int pds_flags); +void directory_get_from_all_authorities(uint8_t dir_purpose, + uint8_t router_purpose, + const char *resource); + +/** Enumeration of ways to connect to a directory server */ +typedef enum { + /** Default: connect over a one-hop Tor circuit but fall back to direct + * connection */ + DIRIND_ONEHOP=0, + /** Connect over a multi-hop anonymizing Tor circuit */ + DIRIND_ANONYMOUS=1, + /** Conncet to the DirPort directly */ + DIRIND_DIRECT_CONN, + /** Connect over a multi-hop anonymizing Tor circuit to our dirport */ + DIRIND_ANON_DIRPORT, +} dir_indirection_t; + +void directory_initiate_command_routerstatus(const routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since); +void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, + uint8_t dir_purpose, + uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, + size_t payload_len, + time_t if_modified_since, + const rend_data_t *rend_query); + +int parse_http_response(const char *headers, int *code, time_t *date, + compress_method_t *compression, char **response); + +int connection_dir_is_encrypted(dir_connection_t *conn); +int connection_dir_reached_eof(dir_connection_t *conn); +int connection_dir_process_inbuf(dir_connection_t *conn); +int connection_dir_finished_flushing(dir_connection_t *conn); +int connection_dir_finished_connecting(dir_connection_t *conn); +void connection_dir_about_to_close(dir_connection_t *dir_conn); +void directory_initiate_command(const char *address, const tor_addr_t *addr, + uint16_t or_port, uint16_t dir_port, + const char *digest, + uint8_t dir_purpose, uint8_t router_purpose, + dir_indirection_t indirection, + const char *resource, + const char *payload, size_t payload_len, + time_t if_modified_since); + +#define DSR_HEX (1<<0) +#define DSR_BASE64 (1<<1) +#define DSR_DIGEST256 (1<<2) +#define DSR_SORT_UNIQ (1<<3) +int dir_split_resource_into_fingerprints(const char *resource, + smartlist_t *fp_out, int *compressed_out, + int flags); + +int dir_split_resource_into_fingerprint_pairs(const char *res, + smartlist_t *pairs_out); +char *directory_dump_request_log(void); +void note_request(const char *key, size_t bytes); +int router_supports_extrainfo(const char *identity_digest, int is_authority); + +time_t download_status_increment_failure(download_status_t *dls, + int status_code, const char *item, + int server, time_t now); +/** Increment the failure count of the download_status_t dls, with + * the optional status code sc. */ +#define download_status_failed(dls, sc) \ + download_status_increment_failure((dls), (sc), NULL, \ + get_options()->DirPort_set, time(NULL)) + +void download_status_reset(download_status_t *dls); +static int download_status_is_ready(download_status_t *dls, time_t now, + int max_failures); +/** Return true iff, as of now, the resource tracked by dls is + * ready to get its download reattempted. */ +static INLINE int +download_status_is_ready(download_status_t *dls, time_t now, + int max_failures) +{ + return (dls->n_download_failures <= max_failures + && dls->next_attempt_at <= now); +} + +static void download_status_mark_impossible(download_status_t *dl); +/** Mark dl as never downloadable. */ +static INLINE void +download_status_mark_impossible(download_status_t *dl) +{ + dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; +} + +int download_status_get_n_failures(const download_status_t *dls); + +#ifdef TOR_UNIT_TESTS +/* Used only by directory.c and test_dir.c */ +STATIC int parse_http_url(const char *headers, char **url); +#endif + +#endif + diff --git a/src/tor/src/or/dirserv.c b/src/tor/dirserv.c similarity index 61% rename from src/tor/src/or/dirserv.c rename to src/tor/dirserv.c index d3bae241f..b156282f5 100644 --- a/src/tor/src/or/dirserv.c +++ b/src/tor/dirserv.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE @@ -13,49 +13,25 @@ #include "command.h" #include "connection.h" #include "connection_or.h" -#include "conscache.h" -#include "consdiffmgr.h" #include "control.h" #include "directory.h" #include "dirserv.h" #include "dirvote.h" #include "hibernate.h" -#include "keypin.h" -#include "main.h" #include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" -#include "protover.h" #include "rephist.h" #include "router.h" #include "routerlist.h" #include "routerparse.h" #include "routerset.h" -#include "torcert.h" /** * \file dirserv.c * \brief Directory server core implementation. Manages directory * contents and generates directories. - * - * This module implements most of directory cache functionality, and some of - * the directory authority functionality. The directory.c module delegates - * here in order to handle incoming requests from clients, via - * connection_dirserv_flushed_some() and its kin. In order to save RAM, this - * module is reponsible for spooling directory objects (in whole or in part) - * onto buf_t instances, and then closing the dir_connection_t once the - * objects are totally flushed. - * - * The directory.c module also delegates here for handling descriptor uploads - * via dirserv_add_multiple_descriptors(). - * - * Additionally, this module handles some aspects of voting, including: - * deciding how to vote on individual flags (based on decisions reached in - * rephist.c), of formatting routerstatus lines, and deciding what relays to - * include in an authority's vote. (TODO: Those functions could profitably be - * split off. They only live in this file because historically they were - * shared among the v1, v2, and v3 directory code.) */ /** How far in the future do we allow a router to get? (seconds) */ @@ -66,6 +42,28 @@ * directory authorities. */ #define MAX_UNTRUSTED_NETWORKSTATUSES 16 +/** If a v1 directory is older than this, discard it. */ +#define MAX_V1_DIRECTORY_AGE (30*24*60*60) +/** If a v1 running-routers is older than this, discard it. */ +#define MAX_V1_RR_AGE (7*24*60*60) + +extern time_t time_of_process_start; /* from onion_main.c */ + +extern long stats_n_seconds_working; /* from onion_main.c */ + +/** Do we need to regenerate the v1 directory when someone asks for it? */ +static time_t the_directory_is_dirty = 1; +/** Do we need to regenerate the v1 runningrouters document when somebody + * asks for it? */ +static time_t runningrouters_is_dirty = 1; + +/** Most recently generated encoded signed v1 directory. (v1 auth dirservers + * only.) */ +static cached_dir_t *the_directory = NULL; + +/** For authoritative directories: the current (v1) network status. */ +static cached_dir_t the_runningrouters; + /** Total number of routers with measured bandwidth; this is set by * dirserv_count_measured_bws() before the loop in * dirserv_generate_networkstatus_vote_obj() and checked by @@ -74,47 +72,42 @@ static int routers_with_measured_bw = 0; static void directory_remove_invalid(void); +static cached_dir_t *dirserv_regenerate_directory(void); static char *format_versions_list(config_line_t *ln); struct authdir_config_t; +static int add_fingerprint_to_dir(const char *nickname, const char *fp, + struct authdir_config_t *list); static uint32_t dirserv_get_status_impl(const char *fp, const char *nickname, + const char *address, uint32_t addr, uint16_t or_port, - const char *platform, const char **msg, - int severity); + const char *platform, const char *contact, + const char **msg, int should_log); static void clear_cached_dir(cached_dir_t *d); static const signed_descriptor_t *get_signed_descriptor_by_fp( - const uint8_t *fp, - int extrainfo); + const char *fp, + int extrainfo, + time_t publish_cutoff); static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg); static uint32_t dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri); static uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri); -static int spooled_resource_lookup_body(const spooled_resource_t *spooled, - int conn_is_encrypted, - const uint8_t **body_out, - size_t *size_out, - time_t *published_out); -static cached_dir_t *spooled_resource_lookup_cached_dir( - const spooled_resource_t *spooled, - time_t *published_out); -static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp); - /************** Fingerprint handling code ************/ -/* 1 Historically used to indicate Named */ +#define FP_NAMED 1 /**< Listed in fingerprint file. */ #define FP_INVALID 2 /**< Believed invalid. */ #define FP_REJECT 4 /**< We will not publish this router. */ -/* 8 Historically used to avoid using this as a dir. */ +#define FP_BADDIR 8 /**< We'll tell clients to avoid using this as a dir. */ #define FP_BADEXIT 16 /**< We'll tell clients not to use this as an exit. */ -/* 32 Historically used to indicade Unnamed */ +#define FP_UNNAMED 32 /**< Another router has this name in fingerprint file. */ -/** Target of status_by_digest map. */ -typedef uint32_t router_status_t; - -static void add_fingerprint_to_dir(const char *fp, - struct authdir_config_t *list, - router_status_t add_status); +/** Encapsulate a nickname and an FP_* status; target of status_by_digest + * map. */ +typedef struct router_status_t { + char nickname[MAX_NICKNAME_LEN+1]; + uint32_t status; +} router_status_t; /** List of nickname-\>identity fingerprint mappings for all the routers * that we name. Used to prevent router impersonation. */ @@ -136,28 +129,35 @@ authdir_config_new(void) return list; } -/** Add the fingerprint fp to the smartlist of fingerprint_entry_t's - * list, or-ing the currently set status flags with - * add_status. +/** Add the fingerprint fp for nickname to + * the smartlist of fingerprint_entry_t's list. Return 0 if it's + * new, or 1 if we replaced the old value. */ -/* static */ void -add_fingerprint_to_dir(const char *fp, authdir_config_t *list, - router_status_t add_status) +/* static */ int +add_fingerprint_to_dir(const char *nickname, const char *fp, + authdir_config_t *list) { char *fingerprint; char d[DIGEST_LEN]; router_status_t *status; + tor_assert(nickname); tor_assert(fp); tor_assert(list); fingerprint = tor_strdup(fp); tor_strstrip(fingerprint, " "); - if (base16_decode(d, DIGEST_LEN, - fingerprint, strlen(fingerprint)) != DIGEST_LEN) { + if (base16_decode(d, DIGEST_LEN, fingerprint, strlen(fingerprint))) { log_warn(LD_DIRSERV, "Couldn't decode fingerprint \"%s\"", escaped(fp)); tor_free(fingerprint); - return; + return 0; + } + + if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) { + log_warn(LD_DIRSERV, "Tried to add a mapping for reserved nickname %s", + UNNAMED_ROUTER_NICKNAME); + tor_free(fingerprint); + return 0; } status = digestmap_get(list->status_by_digest, d); @@ -166,15 +166,35 @@ add_fingerprint_to_dir(const char *fp, authdir_config_t *list, digestmap_set(list->status_by_digest, d, status); } - tor_free(fingerprint); - *status |= add_status; - return; + if (nickname[0] != '!') { + char *old_fp = strmap_get_lc(list->fp_by_name, nickname); + if (old_fp && !strcasecmp(fingerprint, old_fp)) { + tor_free(fingerprint); + } else { + tor_free(old_fp); + strmap_set_lc(list->fp_by_name, nickname, fingerprint); + } + status->status |= FP_NAMED; + strlcpy(status->nickname, nickname, sizeof(status->nickname)); + } else { + tor_free(fingerprint); + if (!strcasecmp(nickname, "!reject")) { + status->status |= FP_REJECT; + } else if (!strcasecmp(nickname, "!invalid")) { + status->status |= FP_INVALID; + } else if (!strcasecmp(nickname, "!baddir")) { + status->status |= FP_BADDIR; + } else if (!strcasecmp(nickname, "!badexit")) { + status->status |= FP_BADEXIT; + } + } + return 0; } -/** Add the fingerprint for this OR to the global list of recognized - * identity key fingerprints. */ +/** Add the nickname and fingerprint for this OR to the + * global list of recognized identity key fingerprints. */ int -dirserv_add_own_fingerprint(crypto_pk_t *pk) +dirserv_add_own_fingerprint(const char *nickname, crypto_pk_t *pk) { char fp[FINGERPRINT_LEN+1]; if (crypto_pk_get_fingerprint(pk, fp, 0)<0) { @@ -183,7 +203,7 @@ dirserv_add_own_fingerprint(crypto_pk_t *pk) } if (!fingerprint_list) fingerprint_list = authdir_config_new(); - add_fingerprint_to_dir(fp, fingerprint_list, 0); + add_fingerprint_to_dir(nickname, fp, fingerprint_list); return 0; } @@ -201,6 +221,7 @@ dirserv_load_fingerprint_file(void) authdir_config_t *fingerprint_list_new; int result; config_line_t *front=NULL, *list; + const or_options_t *options = get_options(); fname = get_datadir_fname("approved-routers"); log_info(LD_GENERAL, @@ -208,9 +229,15 @@ dirserv_load_fingerprint_file(void) cf = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); if (!cf) { - log_warn(LD_FS, "Cannot open fingerprint file '%s'. That's ok.", fname); - tor_free(fname); - return 0; + if (options->NamingAuthoritativeDir) { + log_warn(LD_FS, "Cannot open fingerprint file '%s'. Failing.", fname); + tor_free(fname); + return -1; + } else { + log_info(LD_FS, "Cannot open fingerprint file '%s'. That's ok.", fname); + tor_free(fname); + return 0; + } } tor_free(fname); @@ -225,26 +252,52 @@ dirserv_load_fingerprint_file(void) for (list=front; list; list=list->next) { char digest_tmp[DIGEST_LEN]; - router_status_t add_status = 0; nickname = list->key; fingerprint = list->value; + if (strlen(nickname) > MAX_NICKNAME_LEN) { + log_notice(LD_CONFIG, + "Nickname '%s' too long in fingerprint file. Skipping.", + nickname); + continue; + } + if (!is_legal_nickname(nickname) && + strcasecmp(nickname, "!reject") && + strcasecmp(nickname, "!invalid") && + strcasecmp(nickname, "!badexit")) { + log_notice(LD_CONFIG, + "Invalid nickname '%s' in fingerprint file. Skipping.", + nickname); + continue; + } tor_strstrip(fingerprint, " "); /* remove spaces */ if (strlen(fingerprint) != HEX_DIGEST_LEN || base16_decode(digest_tmp, sizeof(digest_tmp), - fingerprint, HEX_DIGEST_LEN) != sizeof(digest_tmp)) { + fingerprint, HEX_DIGEST_LEN) < 0) { log_notice(LD_CONFIG, "Invalid fingerprint (nickname '%s', " "fingerprint %s). Skipping.", nickname, fingerprint); continue; } - if (!strcasecmp(nickname, "!reject")) { - add_status = FP_REJECT; - } else if (!strcasecmp(nickname, "!badexit")) { - add_status = FP_BADEXIT; - } else if (!strcasecmp(nickname, "!invalid")) { - add_status = FP_INVALID; + if (0==strcasecmp(nickname, DEFAULT_CLIENT_NICKNAME)) { + /* If you approved an OR called "client", then clients who use + * the default nickname could all be rejected. That's no good. */ + log_notice(LD_CONFIG, + "Authorizing nickname '%s' would break " + "many clients; skipping.", + DEFAULT_CLIENT_NICKNAME); + continue; } - add_fingerprint_to_dir(fingerprint, fingerprint_list_new, add_status); + if (0==strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) { + /* If you approved an OR called "unnamed", then clients will be + * confused. */ + log_notice(LD_CONFIG, + "Authorizing nickname '%s' is not allowed; skipping.", + UNNAMED_ROUTER_NICKNAME); + continue; + } + if (add_fingerprint_to_dir(nickname, fingerprint, fingerprint_list_new) + != 0) + log_notice(LD_CONFIG, "Duplicate nickname '%s'.", nickname); } config_free_lines(front); @@ -255,16 +308,6 @@ dirserv_load_fingerprint_file(void) return 0; } -/* If this is set, then we don't allow routers that have advertised an Ed25519 - * identity to stop doing so. This is going to be essential for good identity - * security: otherwise anybody who can attack RSA-1024 but not Ed25519 could - * just sign fake descriptors missing the Ed25519 key. But we won't actually - * be able to prevent that kind of thing until we're confident that there - * isn't actually a legit reason to downgrade to 0.2.5. So for now, we have - * to leave this #undef. - */ -#undef DISABLE_DISABLING_ED25519 - /** Check whether router has a nickname/identity key combination that * we recognize from the fingerprint list, or an IP we automatically act on * according to our configuration. Return the appropriate router status. @@ -272,11 +315,9 @@ dirserv_load_fingerprint_file(void) * If the status is 'FP_REJECT' and msg is provided, set * *msg to an explanation of why. */ uint32_t -dirserv_router_get_status(const routerinfo_t *router, const char **msg, - int severity) +dirserv_router_get_status(const routerinfo_t *router, const char **msg) { char d[DIGEST_LEN]; - const int key_pinning = get_options()->AuthDirPinKeys; if (crypto_pk_get_digest(router->identity_pkey, d)) { log_warn(LD_BUG,"Error computing fingerprint"); @@ -285,64 +326,11 @@ dirserv_router_get_status(const routerinfo_t *router, const char **msg, return FP_REJECT; } - /* Check for the more usual versions to reject a router first. */ - const uint32_t r = dirserv_get_status_impl(d, router->nickname, - router->addr, router->or_port, - router->platform, msg, severity); - if (r) - return r; - - /* dirserv_get_status_impl already rejects versions older than 0.2.4.18-rc, - * and onion_curve25519_pkey was introduced in 0.2.4.8-alpha. - * But just in case a relay doesn't provide or lies about its version, or - * doesn't include an ntor key in its descriptor, check that it exists, - * and is non-zero (clients check that it's non-zero before using it). */ - if (!routerinfo_has_curve25519_onion_key(router)) { - log_fn(severity, LD_DIR, - "Descriptor from router %s is missing an ntor curve25519 onion " - "key.", router_describe(router)); - if (msg) - *msg = "Missing ntor curve25519 onion key. Please upgrade!"; - return FP_REJECT; - } - - if (router->cache_info.signing_key_cert) { - /* This has an ed25519 identity key. */ - if (KEYPIN_MISMATCH == - keypin_check((const uint8_t*)router->cache_info.identity_digest, - router->cache_info.signing_key_cert->signing_key.pubkey)) { - log_fn(severity, LD_DIR, - "Descriptor from router %s has an Ed25519 key, " - "but the keys don't match what they were before.", - router_describe(router)); - if (key_pinning) { - if (msg) { - *msg = "Ed25519 identity key or RSA identity key has changed."; - } - return FP_REJECT; - } - } - } else { - /* No ed25519 key */ - if (KEYPIN_MISMATCH == keypin_check_lone_rsa( - (const uint8_t*)router->cache_info.identity_digest)) { - log_fn(severity, LD_DIR, - "Descriptor from router %s has no Ed25519 key, " - "when we previously knew an Ed25519 for it. Ignoring for now, " - "since Ed25519 keys are fairly new.", - router_describe(router)); -#ifdef DISABLE_DISABLING_ED25519 - if (key_pinning) { - if (msg) { - *msg = "Ed25519 identity key has disappeared."; - } - return FP_REJECT; - } -#endif /* defined(DISABLE_DISABLING_ED25519) */ - } - } - - return 0; + return dirserv_get_status_impl(d, router->nickname, + router->address, + router->addr, router->or_port, + router->platform, router->contact_info, + msg, 1); } /** Return true if there is no point in downloading the router described by @@ -353,101 +341,168 @@ dirserv_would_reject_router(const routerstatus_t *rs) uint32_t res; res = dirserv_get_status_impl(rs->identity_digest, rs->nickname, + "", /* address is only used in logs */ rs->addr, rs->or_port, - NULL, NULL, LOG_DEBUG); + NULL, NULL, + NULL, 0); return (res & FP_REJECT) != 0; } +/** Helper: Based only on the ID/Nickname combination, + * return FP_UNNAMED (unnamed), FP_NAMED (named), or 0 (neither). + */ +static uint32_t +dirserv_get_name_status(const char *id_digest, const char *nickname) +{ + char fp[HEX_DIGEST_LEN+1]; + char *fp_by_name; + + base16_encode(fp, sizeof(fp), id_digest, DIGEST_LEN); + + if ((fp_by_name = + strmap_get_lc(fingerprint_list->fp_by_name, nickname))) { + if (!strcasecmp(fp, fp_by_name)) { + return FP_NAMED; + } else { + return FP_UNNAMED; /* Wrong fingerprint. */ + } + } + return 0; +} + /** Helper: As dirserv_router_get_status, but takes the router fingerprint * (hex, no spaces), nickname, address (used for logging only), IP address, OR - * port and platform (logging only) as arguments. + * port, platform (logging only) and contact info (logging only) as arguments. * - * Log messages at 'severity'. (There's not much point in + * If should_log is false, do not log messages. (There's not much point in * logging that we're rejecting servers we'll not download.) */ static uint32_t dirserv_get_status_impl(const char *id_digest, const char *nickname, + const char *address, uint32_t addr, uint16_t or_port, - const char *platform, const char **msg, int severity) + const char *platform, const char *contact, + const char **msg, int should_log) { - uint32_t result = 0; + int reject_unlisted = get_options()->AuthDirRejectUnlisted; + uint32_t result; router_status_t *status_by_digest; if (!fingerprint_list) fingerprint_list = authdir_config_new(); - log_debug(LD_DIRSERV, "%d fingerprints, %d digests known.", - strmap_size(fingerprint_list->fp_by_name), - digestmap_size(fingerprint_list->status_by_digest)); - - if (platform) { - tor_version_t ver_tmp; - if (tor_version_parse_platform(platform, &ver_tmp, 1) < 0) { - if (msg) { - *msg = "Malformed platform string."; - } - return FP_REJECT; - } - } + if (should_log) + log_debug(LD_DIRSERV, "%d fingerprints, %d digests known.", + strmap_size(fingerprint_list->fp_by_name), + digestmap_size(fingerprint_list->status_by_digest)); - /* Versions before Tor 0.2.4.18-rc are too old to support, and are - * missing some important security fixes too. Disable them. */ - if (platform && !tor_version_as_new_as(platform,"0.2.4.18-rc")) { + /* Versions before Tor 0.2.2.35 have known security issues that + * make them unsuitable for the current network. */ + if (platform && !tor_version_as_new_as(platform,"0.2.2.35")) { if (msg) *msg = "Tor version is insecure or unsupported. Please upgrade!"; return FP_REJECT; + } else if (platform && tor_version_as_new_as(platform,"0.2.3.0-alpha")) { + /* Versions from 0.2.3-alpha...0.2.3.9-alpha have known security + * issues that make them unusable for the current network */ + if (!tor_version_as_new_as(platform, "0.2.3.10-alpha")) { + if (msg) + *msg = "Tor version is insecure or unsupported. Please upgrade!"; + return FP_REJECT; + } } - /* Tor 0.2.9.x where x<5 suffers from bug #20499, where relays don't - * keep their consensus up to date so they make bad guards. - * The simple fix is to just drop them from the network. */ - if (platform && - tor_version_as_new_as(platform,"0.2.9.0-alpha") && - !tor_version_as_new_as(platform,"0.2.9.5-alpha")) { + result = dirserv_get_name_status(id_digest, nickname); + if (result & FP_NAMED) { + if (should_log) + log_debug(LD_DIRSERV,"Good fingerprint for '%s'",nickname); + } + if (result & FP_UNNAMED) { + if (should_log) { + char *esc_contact = esc_for_log(contact); + log_info(LD_DIRSERV, + "Mismatched fingerprint for '%s'. " + "ContactInfo '%s', platform '%s'.)", + nickname, + esc_contact, + platform ? escaped(platform) : ""); + tor_free(esc_contact); + } if (msg) - *msg = "Tor version contains bug 20499. Please upgrade!"; - return FP_REJECT; + *msg = "Rejected: There is already a named server with this nickname " + "and a different fingerprint."; } status_by_digest = digestmap_get(fingerprint_list->status_by_digest, id_digest); if (status_by_digest) - result |= *status_by_digest; + result |= (status_by_digest->status & ~FP_NAMED); if (result & FP_REJECT) { if (msg) - *msg = "Fingerprint is marked rejected -- please contact us?"; + *msg = "Fingerprint is marked rejected"; return FP_REJECT; } else if (result & FP_INVALID) { if (msg) *msg = "Fingerprint is marked invalid"; } + if (authdir_policy_baddir_address(addr, or_port)) { + if (should_log) + log_info(LD_DIRSERV, + "Marking '%s' as bad directory because of address '%s'", + nickname, address); + result |= FP_BADDIR; + } + if (authdir_policy_badexit_address(addr, or_port)) { - log_fn(severity, LD_DIRSERV, - "Marking '%s' as bad exit because of address '%s'", - nickname, fmt_addr32(addr)); + if (should_log) + log_info(LD_DIRSERV, "Marking '%s' as bad exit because of address '%s'", + nickname, address); result |= FP_BADEXIT; } - if (!authdir_policy_permits_address(addr, or_port)) { - log_fn(severity, LD_DIRSERV, "Rejecting '%s' because of address '%s'", - nickname, fmt_addr32(addr)); - if (msg) - *msg = "Suspicious relay address range -- please contact us?"; - return FP_REJECT; - } - if (!authdir_policy_valid_address(addr, or_port)) { - log_fn(severity, LD_DIRSERV, - "Not marking '%s' valid because of address '%s'", - nickname, fmt_addr32(addr)); - result |= FP_INVALID; + if (!(result & FP_NAMED)) { + if (!authdir_policy_permits_address(addr, or_port)) { + if (should_log) + log_info(LD_DIRSERV, "Rejecting '%s' because of address '%s'", + nickname, address); + if (msg) + *msg = "Authdir is rejecting routers in this range."; + return FP_REJECT; + } + if (!authdir_policy_valid_address(addr, or_port)) { + if (should_log) + log_info(LD_DIRSERV, "Not marking '%s' valid because of address '%s'", + nickname, address); + result |= FP_INVALID; + } + if (reject_unlisted) { + if (msg) + *msg = "Authdir rejects unknown routers."; + return FP_REJECT; + } } return result; } +/** If we are an authoritative dirserver, and the list of approved + * servers contains one whose identity key digest is digest, + * return that router's nickname. Otherwise return NULL. */ +const char * +dirserv_get_nickname_by_digest(const char *digest) +{ + router_status_t *status; + if (!fingerprint_list) + return NULL; + tor_assert(digest); + + status = digestmap_get(fingerprint_list->status_by_digest, digest); + return status ? status->nickname : NULL; +} + /** Clear the current fingerprint list. */ void dirserv_free_fingerprint_list(void) @@ -469,22 +524,26 @@ dirserv_free_fingerprint_list(void) static int dirserv_router_has_valid_address(routerinfo_t *ri) { - tor_addr_t addr; + struct in_addr iaddr; if (get_options()->DirAllowPrivateAddresses) return 0; /* whatever it is, we're fine with it */ - tor_addr_from_ipv4h(&addr, ri->addr); - - if (tor_addr_is_internal(&addr, 0)) { + if (!tor_inet_aton(ri->address, &iaddr)) { + log_info(LD_DIRSERV,"Router %s published non-IP address '%s'. Refusing.", + router_describe(ri), + ri->address); + return -1; + } + if (is_internal_IP(ntohl(iaddr.s_addr), 0)) { log_info(LD_DIRSERV, - "Router %s published internal IP address. Refusing.", - router_describe(ri)); + "Router %s published internal IP address '%s'. Refusing.", + router_describe(ri), ri->address); return -1; /* it's a private IP, we should reject it */ } return 0; } /** Check whether we, as a directory server, want to accept ri. If so, - * set its is_valid,running fields and return 0. Otherwise, return -1. + * set its is_valid,named,running fields and return 0. Otherwise, return -1. * * If the router is rejected, set *msg to an explanation of why. * @@ -496,9 +555,9 @@ authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, int complain, int *valid_out) { /* Okay. Now check whether the fingerprint is recognized. */ + uint32_t status = dirserv_router_get_status(ri, msg); time_t now; int severity = (complain && ri->contact_info) ? LOG_NOTICE : LOG_INFO; - uint32_t status = dirserv_router_get_status(ri, msg, severity); tor_assert(msg); if (status & FP_REJECT) return -1; /* msg is already set. */ @@ -529,10 +588,12 @@ authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, } if (dirserv_router_has_valid_address(ri) < 0) { log_fn(severity, LD_DIRSERV, - "Router %s has invalid address. Not adding (%s).", + "Router %s has invalid address '%s'. " + "Not adding (%s).", router_describe(ri), + ri->address, esc_router_info(ri)); - *msg = "Rejected: Address is a private address."; + *msg = "Rejected: Address is not an IP, or IP is a private address."; return -1; } @@ -549,6 +610,7 @@ dirserv_set_node_flags_from_authoritative_status(node_t *node, uint32_t authstatus) { node->is_valid = (authstatus & FP_INVALID) ? 0 : 1; + node->is_bad_directory = (authstatus & FP_BADDIR) ? 1 : 0; node->is_bad_exit = (authstatus & FP_BADEXIT) ? 1 : 0; } @@ -588,15 +650,13 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, !general ? router_purpose_to_string(purpose) : "", !general ? "\n" : "")<0) { *msg = "Couldn't format annotations"; - /* XXX Not cool: we return -1 below, but (was_router_added_t)-1 is - * ROUTER_BAD_EI, which isn't what's gone wrong here. :( */ return -1; } s = desc; list = smartlist_new(); if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 0, 0, - annotation_buf, NULL)) { + annotation_buf)) { SMARTLIST_FOREACH(list, routerinfo_t *, ri, { msg_out = NULL; tor_assert(ri->purpose == purpose); @@ -612,7 +672,7 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, s = desc; if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 1, 0, - NULL, NULL)) { + NULL)) { SMARTLIST_FOREACH(list, extrainfo_t *, ei, { msg_out = NULL; @@ -630,7 +690,7 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, if (!n_parsed) { *msg = "No descriptors found in your POST."; if (WRA_WAS_ADDED(r)) - r = ROUTER_IS_ALREADY_KNOWN; + r = ROUTER_WAS_NOT_NEW; } else { *msg = "(no message)"; } @@ -644,11 +704,7 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, * passed back to the origin of this descriptor, or NULL if there is no such * message. Use source to produce better log messages. * - * If ri is not added to the list of server descriptors, free it. - * That means the caller must not access ri after this function - * returns, since it might have been freed. - * - * Return the status of the operation. + * Return the status of the operation * * This function is only called when fresh descriptors are posted, not when * we re-load the cache. @@ -659,9 +715,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) was_router_added_t r; routerinfo_t *ri_old; char *desc, *nickname; - const size_t desclen = ri->cache_info.signed_descriptor_len + - ri->cache_info.annotations_len; - const int key_pinning = get_options()->AuthDirPinKeys; + size_t desclen = 0; *msg = NULL; /* If it's too big, refuse it now. Otherwise we'll cache it all over the @@ -673,8 +727,11 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) ri->nickname, source, (int)ri->cache_info.signed_descriptor_len, MAX_DESCRIPTOR_UPLOAD_SIZE); *msg = "Router descriptor was too large."; - r = ROUTER_AUTHDIR_REJECTS; - goto fail; + control_event_or_authdir_new_descriptor("REJECTED", + ri->cache_info.signed_descriptor_body, + ri->cache_info.signed_descriptor_len, *msg); + routerinfo_free(ri); + return ROUTER_AUTHDIR_REJECTS; } /* Check whether this descriptor is semantically identical to the last one @@ -691,50 +748,16 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) router_describe(ri), source); *msg = "Not replacing router descriptor; no information has changed since " "the last one with this identity."; - r = ROUTER_IS_ALREADY_KNOWN; - goto fail; - } - - /* Do keypinning again ... this time, to add the pin if appropriate */ - int keypin_status; - if (ri->cache_info.signing_key_cert) { - ed25519_public_key_t *pkey = &ri->cache_info.signing_key_cert->signing_key; - /* First let's validate this pubkey before pinning it */ - if (ed25519_validate_pubkey(pkey) < 0) { - log_warn(LD_DIRSERV, "Received bad key from %s (source %s)", - router_describe(ri), source); - routerinfo_free(ri); - return ROUTER_AUTHDIR_REJECTS; - } - - /* Now pin it! */ - keypin_status = keypin_check_and_add( - (const uint8_t*)ri->cache_info.identity_digest, - pkey->pubkey, ! key_pinning); - } else { - keypin_status = keypin_check_lone_rsa( - (const uint8_t*)ri->cache_info.identity_digest); -#ifndef DISABLE_DISABLING_ED25519 - if (keypin_status == KEYPIN_MISMATCH) - keypin_status = KEYPIN_NOT_FOUND; -#endif - } - if (keypin_status == KEYPIN_MISMATCH && key_pinning) { - log_info(LD_DIRSERV, "Dropping descriptor from %s (source: %s) because " - "its key did not match an older RSA/Ed25519 keypair", - router_describe(ri), source); - *msg = "Looks like your keypair has changed? This authority previously " - "recorded a different RSA identity for this Ed25519 identity (or vice " - "versa.) Did you replace or copy some of your key files, but not " - "the others? You should either restore the expected keypair, or " - "delete your keys and restart Tor to start your relay with a new " - "identity."; - r = ROUTER_AUTHDIR_REJECTS; - goto fail; + control_event_or_authdir_new_descriptor("DROPPED", + ri->cache_info.signed_descriptor_body, + ri->cache_info.signed_descriptor_len, *msg); + routerinfo_free(ri); + return ROUTER_WAS_NOT_NEW; } /* Make a copy of desc, since router_add_to_routerlist might free * ri and its associated signed_descriptor_t. */ + desclen = ri->cache_info.signed_descriptor_len; desc = tor_strndup(ri->cache_info.signed_descriptor_body, desclen); nickname = tor_strdup(ri->nickname); @@ -745,11 +768,14 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) r = router_add_to_routerlist(ri, msg, 0, 0); if (!WRA_WAS_ADDED(r)) { /* unless the routerinfo was fine, just out-of-date */ + if (WRA_WAS_REJECTED(r)) + control_event_or_authdir_new_descriptor("REJECTED", desc, desclen, *msg); log_info(LD_DIRSERV, "Did not add descriptor from '%s' (source: %s): %s.", nickname, source, *msg ? *msg : "(no message)"); } else { smartlist_t *changed; + control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg); changed = smartlist_new(); smartlist_add(changed, ri); @@ -765,39 +791,22 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) tor_free(desc); tor_free(nickname); return r; - fail: - { - const char *desc_digest = ri->cache_info.signed_descriptor_digest; - download_status_t *dls = - router_get_dl_status_by_descriptor_digest(desc_digest); - if (dls) { - log_info(LD_GENERAL, "Marking router with descriptor %s as rejected, " - "and therefore undownloadable", - hex_str(desc_digest, DIGEST_LEN)); - download_status_mark_impossible(dls); - } - routerinfo_free(ri); - } - return r; } /** As dirserv_add_descriptor, but for an extrainfo_t ei. */ static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) { - routerinfo_t *ri; + const routerinfo_t *ri; int r; - was_router_added_t rv; tor_assert(msg); *msg = NULL; - /* Needs to be mutable so routerinfo_incompatible_with_extrainfo - * can mess with some of the flags in ri->cache_info. */ - ri = router_get_mutable_by_digest(ei->cache_info.identity_digest); + ri = router_get_by_id_digest(ei->cache_info.identity_digest); if (!ri) { *msg = "No corresponding router descriptor for extra-info descriptor"; - rv = ROUTER_BAD_EI; - goto fail; + extrainfo_free(ei); + return ROUTER_BAD_EI; } /* If it's too big, refuse it now. Otherwise we'll cache it all over the @@ -809,34 +818,16 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) (int)ei->cache_info.signed_descriptor_len, MAX_EXTRAINFO_UPLOAD_SIZE); *msg = "Extrainfo document was too large"; - rv = ROUTER_BAD_EI; - goto fail; + extrainfo_free(ei); + return ROUTER_BAD_EI; } - if ((r = routerinfo_incompatible_with_extrainfo(ri->identity_pkey, ei, - &ri->cache_info, msg))) { - if (r<0) { - extrainfo_free(ei); - return ROUTER_IS_ALREADY_KNOWN; - } - rv = ROUTER_BAD_EI; - goto fail; + if ((r = routerinfo_incompatible_with_extrainfo(ri, ei, NULL, msg))) { + extrainfo_free(ei); + return r < 0 ? ROUTER_WAS_NOT_NEW : ROUTER_BAD_EI; } router_add_extrainfo_to_routerlist(ei, msg, 0, 0); return ROUTER_ADDED_SUCCESSFULLY; - fail: - { - const char *d = ei->cache_info.signed_descriptor_digest; - signed_descriptor_t *sd = router_get_by_extrainfo_digest((char*)d); - if (sd) { - log_info(LD_GENERAL, "Marking extrainfo with descriptor %s as " - "rejected, and therefore undownloadable", - hex_str((char*)d,DIGEST_LEN)); - download_status_mark_impossible(&sd->ei_dl_status); - } - extrainfo_free(ei); - } - return rv; } /** Remove all descriptors whose nicknames or fingerprints no longer @@ -846,48 +837,101 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) static void directory_remove_invalid(void) { + int changed = 0; routerlist_t *rl = router_get_routerlist(); smartlist_t *nodes = smartlist_new(); smartlist_add_all(nodes, nodelist_get_list()); SMARTLIST_FOREACH_BEGIN(nodes, node_t *, node) { - const char *msg = NULL; + const char *msg; routerinfo_t *ent = node->ri; char description[NODE_DESC_BUF_LEN]; uint32_t r; if (!ent) continue; - r = dirserv_router_get_status(ent, &msg, LOG_INFO); + r = dirserv_router_get_status(ent, &msg); router_get_description(description, ent); if (r & FP_REJECT) { log_info(LD_DIRSERV, "Router %s is now rejected: %s", description, msg?msg:""); routerlist_remove(rl, ent, 0, time(NULL)); + changed = 1; continue; } +#if 0 + if (bool_neq((r & FP_NAMED), ent->auth_says_is_named)) { + log_info(LD_DIRSERV, + "Router %s is now %snamed.", description, + (r&FP_NAMED)?"":"un"); + ent->is_named = (r&FP_NAMED)?1:0; + changed = 1; + } + if (bool_neq((r & FP_UNNAMED), ent->auth_says_is_unnamed)) { + log_info(LD_DIRSERV, + "Router '%s' is now %snamed. (FP_UNNAMED)", description, + (r&FP_NAMED)?"":"un"); + ent->is_named = (r&FP_NUNAMED)?0:1; + changed = 1; + } +#endif if (bool_neq((r & FP_INVALID), !node->is_valid)) { log_info(LD_DIRSERV, "Router '%s' is now %svalid.", description, (r&FP_INVALID) ? "in" : ""); node->is_valid = (r&FP_INVALID)?0:1; + changed = 1; + } + if (bool_neq((r & FP_BADDIR), node->is_bad_directory)) { + log_info(LD_DIRSERV, "Router '%s' is now a %s directory", description, + (r & FP_BADDIR) ? "bad" : "good"); + node->is_bad_directory = (r&FP_BADDIR) ? 1: 0; + changed = 1; } if (bool_neq((r & FP_BADEXIT), node->is_bad_exit)) { log_info(LD_DIRSERV, "Router '%s' is now a %s exit", description, (r & FP_BADEXIT) ? "bad" : "good"); node->is_bad_exit = (r&FP_BADEXIT) ? 1: 0; + changed = 1; } } SMARTLIST_FOREACH_END(node); + if (changed) + directory_set_dirty(); routerlist_assert_ok(rl); smartlist_free(nodes); } +/** Mark the directory as dirty -- when we're next asked for a + * directory, we will rebuild it instead of reusing the most recently + * generated one. + */ +void +directory_set_dirty(void) +{ + time_t now = time(NULL); + int set_v1_dirty=0; + + /* Regenerate stubs only every 8 hours. + * XXXX It would be nice to generate less often, but these are just + * stubs: it doesn't matter. */ +#define STUB_REGENERATE_INTERVAL (8*60*60) + if (!the_directory || !the_runningrouters.dir) + set_v1_dirty = 1; + else if (the_directory->published < now - STUB_REGENERATE_INTERVAL || + the_runningrouters.published < now - STUB_REGENERATE_INTERVAL) + set_v1_dirty = 1; + + if (set_v1_dirty) { + if (!the_directory_is_dirty) + the_directory_is_dirty = now; + if (!runningrouters_is_dirty) + runningrouters_is_dirty = now; + } +} + /** * Allocate and return a description of the status of the server desc, * for use in a v1-style router-status line. The server is listed * as running iff is_live is true. - * - * This is deprecated: it's only used for controllers that want outputs in - * the old format. */ static char * list_single_server_status(const routerinfo_t *desc, int is_live) @@ -915,7 +959,7 @@ list_single_server_status(const routerinfo_t *desc, int is_live) } /* DOCDOC running_long_enough_to_decide_unreachable */ -static inline int +static INLINE int running_long_enough_to_decide_unreachable(void) { return time_of_process_start @@ -923,7 +967,7 @@ running_long_enough_to_decide_unreachable(void) } /** Each server needs to have passed a reachability test no more - * than this number of seconds ago, or it is listed as down in + * than this number of seconds ago, or he is listed as down in * the directory. */ #define REACHABLE_TIMEOUT (45*60) @@ -938,7 +982,7 @@ running_long_enough_to_decide_unreachable(void) void dirserv_set_router_is_running(routerinfo_t *router, time_t now) { - /*XXXX This function is a mess. Separate out the part that calculates + /*XXXX024 This function is a mess. Separate out the part that calculates whether it's reachable and the part that tells rephist that the router was unreachable. */ @@ -1000,9 +1044,6 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) * *router_status_out. Return 0 on success, -1 on failure. * * If for_controller is true, include the routers with very old descriptors. - * - * This is deprecated: it's only used for controllers that want outputs in - * the old format. */ int list_server_status_v1(smartlist_t *routers, char **router_status_out, @@ -1035,7 +1076,7 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out, if (!node->is_running) *cp++ = '!'; router_get_verbose_nickname(cp, ri); - smartlist_add_strdup(rs_entries, name_buf); + smartlist_add(rs_entries, tor_strdup(name_buf)); } else if (ri->cache_info.published_on >= cutoff) { smartlist_add(rs_entries, list_single_server_status(ri, node->is_running)); @@ -1073,34 +1114,105 @@ format_versions_list(config_line_t *ln) } /** Return 1 if ri's descriptor is "active" -- running, valid, - * not hibernating, having observed bw greater 0, and not too old. Else - * return 0. + * not hibernating, and not too old. Else return 0. */ static int router_is_active(const routerinfo_t *ri, const node_t *node, time_t now) { time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - if (ri->cache_info.published_on < cutoff) { + if (ri->cache_info.published_on < cutoff) return 0; - } - if (!node->is_running || !node->is_valid || ri->is_hibernating) { + if (!node->is_running || !node->is_valid || ri->is_hibernating) return 0; + return 1; +} + +/** Generate a new v1 directory and write it into a newly allocated string. + * Point *dir_out to the allocated string. Sign the + * directory with private_key. Return 0 on success, -1 on + * failure. If complete is set, give us all the descriptors; + * otherwise leave out non-running and non-valid ones. + */ +int +dirserv_dump_directory_to_string(char **dir_out, + crypto_pk_t *private_key) +{ + /* XXXX 024 Get rid of this function if we can confirm that nobody's + * fetching these any longer */ + char *cp; + char *identity_pkey; /* Identity key, DER64-encoded. */ + char *recommended_versions; + char digest[DIGEST_LEN]; + char published[ISO_TIME_LEN+1]; + char *buf = NULL; + size_t buf_len; + size_t identity_pkey_len; + time_t now = time(NULL); + + tor_assert(dir_out); + *dir_out = NULL; + + if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, + &identity_pkey_len)<0) { + log_warn(LD_BUG,"write identity_pkey to string failed!"); + return -1; } - /* Only require bandwith capacity in non-test networks, or - * if TestingTorNetwork, and TestingMinExitFlagThreshold is non-zero */ - if (!ri->bandwidthcapacity) { - if (get_options()->TestingTorNetwork) { - if (get_options()->TestingMinExitFlagThreshold > 0) { - /* If we're in a TestingTorNetwork, and TestingMinExitFlagThreshold is, - * then require bandwidthcapacity */ - return 0; - } - } else { - /* If we're not in a TestingTorNetwork, then require bandwidthcapacity */ - return 0; - } + + recommended_versions = + format_versions_list(get_options()->RecommendedVersions); + + format_iso_time(published, now); + + buf_len = 2048+strlen(recommended_versions); + + buf = tor_malloc(buf_len); + /* We'll be comparing against buf_len throughout the rest of the + function, though strictly speaking we shouldn't be able to exceed + it. This is C, after all, so we may as well check for buffer + overruns.*/ + + tor_snprintf(buf, buf_len, + "signed-directory\n" + "published %s\n" + "recommended-software %s\n" + "router-status %s\n" + "dir-signing-key\n%s\n", + published, recommended_versions, "", + identity_pkey); + + tor_free(recommended_versions); + tor_free(identity_pkey); + + cp = buf + strlen(buf); + *cp = '\0'; + + /* These multiple strlcat calls are inefficient, but dwarfed by the RSA + signature. */ + if (strlcat(buf, "directory-signature ", buf_len) >= buf_len) + goto truncated; + if (strlcat(buf, get_options()->Nickname, buf_len) >= buf_len) + goto truncated; + if (strlcat(buf, "\n", buf_len) >= buf_len) + goto truncated; + + if (router_get_dir_hash(buf,digest)) { + log_warn(LD_BUG,"couldn't compute digest"); + tor_free(buf); + return -1; } - return 1; + note_crypto_pk_op(SIGN_DIR); + if (router_append_dirobj_signature(buf,buf_len,digest,DIGEST_LEN, + private_key)<0) { + tor_free(buf); + return -1; + } + + *dir_out = buf; + return 0; + truncated: + log_warn(LD_BUG,"tried to exceed string length."); + tor_free(buf); + return -1; } /********************************************************************/ @@ -1120,18 +1232,17 @@ directory_fetches_from_authorities(const or_options_t *options) return 1; if (options->BridgeRelay == 1) return 0; - if (server_mode(options) && - router_pick_published_address(options, &addr, 1) < 0) + if (server_mode(options) && router_pick_published_address(options, &addr)<0) return 1; /* we don't know our IP address; ask an authority. */ refuseunknown = ! router_my_exit_policy_is_reject_star() && should_refuse_unknown_exits(options); - if (!dir_server_mode(options) && !refuseunknown) + if (!options->DirPort_set && !refuseunknown) return 0; if (!server_mode(options) || !advertised_server_mode()) return 0; me = router_get_my_routerinfo(); - if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown)) - return 0; /* if we don't service directory requests, return 0 too */ + if (!me || (!me->dir_port && !refuseunknown)) + return 0; /* if dirport not advertised, return 0 too */ return 1; } @@ -1156,30 +1267,22 @@ directory_fetches_dir_info_later(const or_options_t *options) return options->UseBridges != 0; } -/** Return true iff we want to serve certificates for authorities - * that we don't acknowledge as authorities ourself. - * Use we_want_to_fetch_unknown_auth_certs to check if we want to fetch - * and keep these certificates. +/** Return true iff we want to fetch and keep certificates for authorities + * that we don't acknowledge as aurthorities ourself. */ int directory_caches_unknown_auth_certs(const or_options_t *options) { - return dir_server_mode(options) || options->BridgeRelay; + return options->DirPort_set || options->BridgeRelay; } -/** Return 1 if we want to fetch and serve descriptors, networkstatuses, etc - * Else return 0. - * Check options->DirPort_set and directory_permits_begindir_requests() - * to see if we are willing to serve these directory documents to others via - * the DirPort and begindir-over-ORPort, respectively. - * - * To check if we should fetch documents, use we_want_to_fetch_flavor and - * we_want_to_fetch_unknown_auth_certs instead of this function. +/** Return 1 if we want to keep descriptors, networkstatuses, etc around + * and we're willing to serve them to others. Else return 0. */ int directory_caches_dir_info(const or_options_t *options) { - if (options->BridgeRelay || dir_server_mode(options)) + if (options->BridgeRelay || options->DirPort_set) return 1; if (!server_mode(options) || !advertised_server_mode()) return 0; @@ -1189,13 +1292,22 @@ directory_caches_dir_info(const or_options_t *options) should_refuse_unknown_exits(options); } -/** Return 1 if we want to allow remote clients to ask us directory +/** Return 1 if we want to allow remote people to ask us directory * requests via the "begin_dir" interface, which doesn't require * having any separate port open. */ int directory_permits_begindir_requests(const or_options_t *options) { - return options->BridgeRelay != 0 || dir_server_mode(options); + return options->BridgeRelay != 0 || options->DirPort_set; +} + +/** Return 1 if we want to allow controllers to ask us directory + * requests via the controller interface, which doesn't require + * having any separate port open. */ +int +directory_permits_controller_requests(const or_options_t *options) +{ + return options->DirPort_set; } /** Return 1 if we have no need to fetch new descriptors. This generally @@ -1213,10 +1325,51 @@ directory_too_idle_to_fetch_descriptors(const or_options_t *options, /********************************************************************/ +/* Used only by non-v1-auth dirservers: The v1 directory and + * runningrouters we'll serve when requested. */ + +/** The v1 directory we'll serve (as a cache or as an authority) if + * requested. */ +static cached_dir_t *cached_directory = NULL; +/** The v1 runningrouters document we'll serve (as a cache or as an authority) + * if requested. */ +static cached_dir_t cached_runningrouters; + /** Map from flavor name to the cached_dir_t for the v3 consensuses that we're * currently serving. */ static strmap_t *cached_consensuses = NULL; +/** Possibly replace the contents of d with the value of + * directory published on when, unless when is older than + * the last value, or too far in the future. + * + * Does not copy directory; frees it if it isn't used. + */ +static void +set_cached_dir(cached_dir_t *d, char *directory, time_t when) +{ + time_t now = time(NULL); + if (when<=d->published) { + log_info(LD_DIRSERV, "Ignoring old directory; not caching."); + tor_free(directory); + } else if (when>=now+ROUTER_MAX_AGE_TO_PUBLISH) { + log_info(LD_DIRSERV, "Ignoring future directory; not caching."); + tor_free(directory); + } else { + /* if (when>d->published && whendir); + d->dir = directory; + d->dir_len = strlen(directory); + tor_free(d->dir_z); + if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, + ZLIB_METHOD)) { + log_warn(LD_BUG,"Error compressing cached directory"); + } + d->published = when; + } +} + /** Decrement the reference count on d, and free it if it no longer has * any references. */ void @@ -1238,8 +1391,8 @@ new_cached_dir(char *s, time_t published) d->dir = s; d->dir_len = strlen(s); d->published = published; - if (tor_compress(&(d->dir_compressed), &(d->dir_compressed_len), - d->dir, d->dir_len, ZLIB_METHOD)) { + if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, + ZLIB_METHOD)) { log_warn(LD_BUG, "Error compressing directory"); } return d; @@ -1250,7 +1403,7 @@ static void clear_cached_dir(cached_dir_t *d) { tor_free(d->dir); - tor_free(d->dir_compressed); + tor_free(d->dir_z); memset(d, 0, sizeof(cached_dir_t)); } @@ -1266,14 +1419,29 @@ free_cached_dir_(void *_d) cached_dir_decref(d); } +/** If we have no cached v1 directory, or it is older than published, + * then replace it with directory, published at published. + * + * If published is too old, do nothing. + * + * If is_running_routers, this is really a v1 running_routers + * document rather than a v1 directory. + */ +static void +dirserv_set_cached_directory(const char *directory, time_t published) +{ + + cached_dir_decref(cached_directory); + cached_directory = new_cached_dir(tor_strdup(directory), published); +} + /** Replace the v3 consensus networkstatus of type flavor_name that * we're serving with networkstatus, published at published. No * validation is performed. */ void dirserv_set_cached_consensus_networkstatus(const char *networkstatus, const char *flavor_name, - const common_digests_t *digests, - const uint8_t *sha3_as_signed, + const digests_t *digests, time_t published) { cached_dir_t *new_networkstatus; @@ -1282,15 +1450,168 @@ dirserv_set_cached_consensus_networkstatus(const char *networkstatus, cached_consensuses = strmap_new(); new_networkstatus = new_cached_dir(tor_strdup(networkstatus), published); - memcpy(&new_networkstatus->digests, digests, sizeof(common_digests_t)); - memcpy(&new_networkstatus->digest_sha3_as_signed, sha3_as_signed, - DIGEST256_LEN); + memcpy(&new_networkstatus->digests, digests, sizeof(digests_t)); old_networkstatus = strmap_set(cached_consensuses, flavor_name, new_networkstatus); if (old_networkstatus) cached_dir_decref(old_networkstatus); } +/** Remove any v1 info from the directory cache that was published + * too long ago. */ +void +dirserv_clear_old_v1_info(time_t now) +{ + if (cached_directory && + cached_directory->published < (now - MAX_V1_DIRECTORY_AGE)) { + cached_dir_decref(cached_directory); + cached_directory = NULL; + } + if (cached_runningrouters.published < (now - MAX_V1_RR_AGE)) { + clear_cached_dir(&cached_runningrouters); + } +} + +/** Helper: If we're an authority for the right directory version (v1) + * (based on auth_type), try to regenerate + * auth_src as appropriate and return it, falling back to cache_src on + * failure. If we're a cache, simply return cache_src. + */ +static cached_dir_t * +dirserv_pick_cached_dir_obj(cached_dir_t *cache_src, + cached_dir_t *auth_src, + time_t dirty, cached_dir_t *(*regenerate)(void), + const char *name, + dirinfo_type_t auth_type) +{ + const or_options_t *options = get_options(); + int authority = (auth_type == V1_DIRINFO && authdir_mode_v1(options)); + + if (!authority || authdir_mode_bridge(options)) { + return cache_src; + } else { + /* We're authoritative. */ + if (regenerate != NULL) { + if (dirty && dirty + DIR_REGEN_SLACK_TIME < time(NULL)) { + if (!(auth_src = regenerate())) { + log_err(LD_BUG, "Couldn't generate %s?", name); + exit(1); + } + } else { + log_info(LD_DIRSERV, "The %s is still clean; reusing.", name); + } + } + return auth_src ? auth_src : cache_src; + } +} + +/** Return the most recently generated encoded signed v1 directory, + * generating a new one as necessary. If not a v1 authoritative directory + * may return NULL if no directory is yet cached. */ +cached_dir_t * +dirserv_get_directory(void) +{ + return dirserv_pick_cached_dir_obj(cached_directory, the_directory, + the_directory_is_dirty, + dirserv_regenerate_directory, + "v1 server directory", V1_DIRINFO); +} + +/** Only called by v1 auth dirservers. + * Generate a fresh v1 directory; set the_directory and return a pointer + * to the new value. + */ +static cached_dir_t * +dirserv_regenerate_directory(void) +{ + /* XXXX 024 Get rid of this function if we can confirm that nobody's + * fetching these any longer */ + char *new_directory=NULL; + + if (dirserv_dump_directory_to_string(&new_directory, + get_server_identity_key())) { + log_warn(LD_BUG, "Error creating directory."); + tor_free(new_directory); + return NULL; + } + cached_dir_decref(the_directory); + the_directory = new_cached_dir(new_directory, time(NULL)); + log_info(LD_DIRSERV,"New directory (size %d) has been built.", + (int)the_directory->dir_len); + log_debug(LD_DIRSERV,"New directory (size %d):\n%s", + (int)the_directory->dir_len, the_directory->dir); + + the_directory_is_dirty = 0; + + /* Save the directory to disk so we re-load it quickly on startup. + */ + dirserv_set_cached_directory(the_directory->dir, time(NULL)); + + return the_directory; +} + +/** Only called by v1 auth dirservers. + * Replace the current running-routers list with a newly generated one. */ +static cached_dir_t * +generate_runningrouters(void) +{ + char *s=NULL; + char digest[DIGEST_LEN]; + char published[ISO_TIME_LEN+1]; + size_t len; + crypto_pk_t *private_key = get_server_identity_key(); + char *identity_pkey; /* Identity key, DER64-encoded. */ + size_t identity_pkey_len; + + if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, + &identity_pkey_len)<0) { + log_warn(LD_BUG,"write identity_pkey to string failed!"); + goto err; + } + format_iso_time(published, time(NULL)); + + len = 2048; + s = tor_malloc_zero(len); + tor_snprintf(s, len, + "network-status\n" + "published %s\n" + "router-status %s\n" + "dir-signing-key\n%s" + "directory-signature %s\n", + published, "", identity_pkey, + get_options()->Nickname); + tor_free(identity_pkey); + if (router_get_runningrouters_hash(s,digest)) { + log_warn(LD_BUG,"couldn't compute digest"); + goto err; + } + note_crypto_pk_op(SIGN_DIR); + if (router_append_dirobj_signature(s, len, digest, DIGEST_LEN, + private_key)<0) + goto err; + + set_cached_dir(&the_runningrouters, s, time(NULL)); + runningrouters_is_dirty = 0; + + return &the_runningrouters; + err: + tor_free(s); + return NULL; +} + +/** Set *rr to the most recently generated encoded signed + * running-routers list, generating a new one as necessary. Return the + * size of the directory on success, and 0 on failure. */ +cached_dir_t * +dirserv_get_runningrouters(void) +{ + return dirserv_pick_cached_dir_obj( + &cached_runningrouters, &the_runningrouters, + runningrouters_is_dirty, + generate_runningrouters, + "v1 network status list", V1_DIRINFO); +} + /** Return the latest downloaded consensus networkstatus in encoded, signed, * optionally compressed format, suitable for sending to clients. */ cached_dir_t * @@ -1347,7 +1668,7 @@ static uint32_t guard_bandwidth_excluding_exits_kb = 0; /** Helper: estimate the uptime of a router given its stated uptime and the * amount of time since it last stated its stated uptime. */ -static inline long +static INLINE long real_uptime(const routerinfo_t *router, time_t now) { if (now < router->cache_info.published_on) @@ -1368,7 +1689,7 @@ dirserv_thinks_router_is_unreliable(time_t now, { if (need_uptime) { if (!enough_mtbf_info) { - /* XXXX We should change the rule from + /* XXX024 Once most authorities are on v3, we should change the rule from * "use uptime if we don't have mtbf data" to "don't advertise Stable on * v3 if we don't have enough mtbf data." Or maybe not, since if we ever * hit a point where we need to reset a lot of authorities at once, @@ -1395,10 +1716,8 @@ dirserv_thinks_router_is_unreliable(time_t now, } /** Return true iff router should be assigned the "HSDir" flag. - * - * Right now this means it advertises support for it, it has a high uptime, - * it's a directory cache, it has the Stable and Fast flags, and it's currently - * considered Running. + * Right now this means it advertises support for it, it has a high + * uptime, it has a DirPort open, and it's currently considered Running. * * This function needs to be called after router-\>is_running has * been set. @@ -1424,11 +1743,16 @@ dirserv_thinks_router_is_hs_dir(const routerinfo_t *router, else uptime = real_uptime(router, now); - return (router->wants_to_be_hs_dir && - router->supports_tunnelled_dir_requests && - node->is_stable && node->is_fast && + /* XXX We shouldn't need to check dir_port, but we do because of + * bug 1693. In the future, once relays set wants_to_be_hs_dir + * correctly, we can revert to only checking dir_port if router's + * version is too old. */ + /* XXX Unfortunately, we need to keep checking dir_port until all + * *clients* suffering from bug 2722 are obsolete. The first version + * to fix the bug was 0.2.2.25-alpha. */ + return (router->wants_to_be_hs_dir && router->dir_port && uptime >= get_options()->MinUptimeHidServDirectoryV2 && - router_is_active(router, node, now)); + node->is_running); } /** Don't consider routers with less bandwidth than this when computing @@ -1469,13 +1793,13 @@ router_counts_toward_thresholds(const node_t *node, time_t now, * * Also, set the is_exit flag of each router appropriately. */ static void -dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) +dirserv_compute_performance_thresholds(routerlist_t *rl, + digestmap_t *omit_as_sybil) { int n_active, n_active_nonexit, n_familiar; uint32_t *uptimes, *bandwidths_kb, *bandwidths_excluding_exits_kb; long *tks; double *mtbfs, *wfus; - smartlist_t *nodelist; time_t now = time(NULL); const or_options_t *options = get_options(); @@ -1493,47 +1817,38 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) guard_tk = 0; guard_wfu = 0; - nodelist_assert_ok(); - nodelist = nodelist_get_list(); - /* Initialize arrays that will hold values for each router. We'll * sort them and use that to compute thresholds. */ n_active = n_active_nonexit = 0; /* Uptime for every active router. */ - uptimes = tor_calloc(smartlist_len(nodelist), sizeof(uint32_t)); + uptimes = tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); /* Bandwidth for every active router. */ - bandwidths_kb = tor_calloc(smartlist_len(nodelist), sizeof(uint32_t)); + bandwidths_kb = tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); /* Bandwidth for every active non-exit router. */ bandwidths_excluding_exits_kb = - tor_calloc(smartlist_len(nodelist), sizeof(uint32_t)); + tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); /* Weighted mean time between failure for each active router. */ - mtbfs = tor_calloc(smartlist_len(nodelist), sizeof(double)); + mtbfs = tor_malloc(sizeof(double)*smartlist_len(rl->routers)); /* Time-known for each active router. */ - tks = tor_calloc(smartlist_len(nodelist), sizeof(long)); + tks = tor_malloc(sizeof(long)*smartlist_len(rl->routers)); /* Weighted fractional uptime for each active router. */ - wfus = tor_calloc(smartlist_len(nodelist), sizeof(double)); + wfus = tor_malloc(sizeof(double)*smartlist_len(rl->routers)); + + nodelist_assert_ok(); /* Now, fill in the arrays. */ - SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) { + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { if (options->BridgeAuthoritativeDir && node->ri && node->ri->purpose != ROUTER_PURPOSE_BRIDGE) continue; - - routerinfo_t *ri = node->ri; - if (ri) { - node->is_exit = (!router_exit_policy_rejects_all(ri) && - exit_policy_is_general_exit(ri->exit_policy)); - } - if (router_counts_toward_thresholds(node, now, omit_as_sybil, require_mbw)) { + routerinfo_t *ri = node->ri; const char *id = node->identity; uint32_t bw_kb; - - /* resolve spurious clang shallow analysis null pointer errors */ - tor_assert(ri); - + node->is_exit = (!router_exit_policy_rejects_all(ri) && + exit_policy_is_general_exit(ri->exit_policy)); uptimes[n_active] = (uint32_t)real_uptime(ri, now); mtbfs[n_active] = rep_hist_get_stability(id, now); tks [n_active] = rep_hist_get_weighted_time_known(id, now); @@ -1555,10 +1870,9 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) /* The 12.5th percentile bandwidth is fast. */ fast_bandwidth_kb = find_nth_uint32(bandwidths_kb, n_active, n_active/8); /* (Now bandwidths is sorted.) */ - if (fast_bandwidth_kb < RELAY_REQUIRED_MIN_BANDWIDTH/(2 * 1000)) + if (fast_bandwidth_kb < ROUTER_REQUIRED_MIN_BANDWIDTH/(2 * 1000)) fast_bandwidth_kb = bandwidths_kb[n_active/4]; - guard_bandwidth_including_exits_kb = - third_quartile_uint32(bandwidths_kb, n_active); + guard_bandwidth_including_exits_kb = bandwidths_kb[(n_active-1)/2]; guard_tk = find_nth_long(tks, n_active, n_active/8); } @@ -1596,7 +1910,7 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) * fill wfus with the wfu of every such "familiar" router. */ n_familiar = 0; - SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) { + SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { if (router_counts_toward_thresholds(node, now, omit_as_sybil, require_mbw)) { routerinfo_t *ri = node->ri; @@ -1616,8 +1930,7 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) if (n_active_nonexit) { guard_bandwidth_excluding_exits_kb = - find_nth_uint32(bandwidths_excluding_exits_kb, - n_active_nonexit, n_active_nonexit*3/4); + median_uint32(bandwidths_excluding_exits_kb, n_active_nonexit); } log_info(LD_DIRSERV, @@ -1633,7 +1946,7 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) (unsigned long)guard_tk, (unsigned long)guard_bandwidth_including_exits_kb, (unsigned long)guard_bandwidth_excluding_exits_kb, - enough_mtbf_info ? "" : " don't"); + enough_mtbf_info ? "" : " don't "); tor_free(uptimes); tor_free(mtbfs); @@ -1650,10 +1963,11 @@ dirserv_compute_performance_thresholds(digestmap_t *omit_as_sybil) * networkstatus_getinfo_by_purpose(). */ void -dirserv_compute_bridge_flag_thresholds(void) +dirserv_compute_bridge_flag_thresholds(routerlist_t *rl) { + digestmap_t *omit_as_sybil = digestmap_new(); - dirserv_compute_performance_thresholds(omit_as_sybil); + dirserv_compute_performance_thresholds(rl, omit_as_sybil); digestmap_free(omit_as_sybil, NULL); } @@ -1806,13 +2120,16 @@ dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri) * how many measured bandwidths we know. This is used to decide whether we * ever trust advertised bandwidths for purposes of assigning flags. */ static void -dirserv_count_measured_bws(const smartlist_t *routers) +dirserv_count_measured_bws(routerlist_t *rl) { /* Initialize this first */ routers_with_measured_bw = 0; + tor_assert(rl); + tor_assert(rl->routers); + /* Iterate over the routerlist and count measured bandwidths */ - SMARTLIST_FOREACH_BEGIN(routers, const routerinfo_t *, ri) { + SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) { /* Check if we know a measured bandwidth for this one */ if (dirserv_has_measured_bw(ri->cache_info.identity_digest)) { ++routers_with_measured_bw; @@ -1903,28 +2220,20 @@ version_from_platform(const char *platform) /** Helper: write the router-status information in rs into a newly * allocated character buffer. Use the same format as in network-status * documents. If version is non-NULL, add a "v" line for the platform. - * - * consensus_method is the current consensus method when format is - * NS_V3_CONSENSUS or NS_V3_CONSENSUS_MICRODESC. It is ignored for other - * formats: pass ROUTERSTATUS_FORMAT_NO_CONSENSUS_METHOD. - * * Return 0 on success, -1 on failure. * * The format argument has one of the following values: * NS_V2 - Output an entry suitable for a V2 NS opinion document * NS_V3_CONSENSUS - Output the first portion of a V3 NS consensus entry - * for consensus_method. * NS_V3_CONSENSUS_MICRODESC - Output the first portion of a V3 microdesc - * consensus entry for consensus_method. + * consensus entry. * NS_V3_VOTE - Output a complete V3 NS vote. If vrs is present, * it contains additional information for the vote. - * NS_CONTROL_PORT - Output a NS document for the control port. + * NS_CONTROL_PORT - Output a NS document for the control port */ char * routerstatus_format_entry(const routerstatus_t *rs, const char *version, - const char *protocols, routerstatus_format_type_t format, - int consensus_method, const vote_routerstatus_t *vrs) { char *summary; @@ -1933,12 +2242,13 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version, char published[ISO_TIME_LEN+1]; char identity64[BASE64_DIGEST_LEN+1]; char digest64[BASE64_DIGEST_LEN+1]; - smartlist_t *chunks = smartlist_new(); + smartlist_t *chunks = NULL; format_iso_time(published, rs->published_on); digest_to_base64(identity64, rs->identity_digest); digest_to_base64(digest64, rs->descriptor_digest); + chunks = smartlist_new(); smartlist_add_asprintf(chunks, "r %s %s %s%s%s %s %d %d\n", rs->nickname, @@ -1955,10 +2265,8 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version, * networkstatus_type_t values, with an additional control port value * added -MP */ - /* V3 microdesc consensuses only have "a" lines in later consensus methods - */ - if (format == NS_V3_CONSENSUS_MICRODESC && - consensus_method < MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS) + /* V3 microdesc consensuses don't have "a" lines. */ + if (format == NS_V3_CONSENSUS_MICRODESC) goto done; /* Possible "a" line. At most one for now. */ @@ -1967,21 +2275,24 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version, fmt_addrport(&rs->ipv6_addr, rs->ipv6_orport)); } - if (format == NS_V3_CONSENSUS || format == NS_V3_CONSENSUS_MICRODESC) + if (format == NS_V3_CONSENSUS) goto done; smartlist_add_asprintf(chunks, - "s%s%s%s%s%s%s%s%s%s%s\n", + "s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", /* These must stay in alphabetical order. */ rs->is_authority?" Authority":"", + rs->is_bad_directory?" BadDirectory":"", rs->is_bad_exit?" BadExit":"", rs->is_exit?" Exit":"", rs->is_fast?" Fast":"", rs->is_possible_guard?" Guard":"", rs->is_hs_dir?" HSDir":"", + rs->is_named?" Named":"", rs->is_flagged_running?" Running":"", rs->is_stable?" Stable":"", - rs->is_v2_dir?" V2Dir":"", + rs->is_unnamed?" Unnamed":"", + (rs->dir_port!=0)?" V2Dir":"", rs->is_valid?" Valid":""); /* length of "opt v \n" */ @@ -1989,9 +2300,6 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version, if (version && strlen(version) < MAX_V_LINE_LEN - V_LINE_OVERHEAD) { smartlist_add_asprintf(chunks, "v %s\n", version); } - if (protocols) { - smartlist_add_asprintf(chunks, "pr %s\n", protocols); - } if (format != NS_V2) { const routerinfo_t* desc = router_get_by_id_digest(rs->identity_digest); @@ -2052,38 +2360,23 @@ routerstatus_format_entry(const routerstatus_t *rs, const char *version, smartlist_add_asprintf(chunks, " Measured=%d", vrs->measured_bw_kb); } - /* Write down guardfraction information if we have it. */ - if (format == NS_V3_VOTE && vrs && vrs->status.has_guardfraction) { - smartlist_add_asprintf(chunks, - " GuardFraction=%d", - vrs->status.guardfraction_percentage); - } - - smartlist_add_strdup(chunks, "\n"); + smartlist_add(chunks, tor_strdup("\n")); if (desc) { summary = policy_summarize(desc->exit_policy, AF_INET); smartlist_add_asprintf(chunks, "p %s\n", summary); tor_free(summary); } - - if (format == NS_V3_VOTE && vrs) { - if (tor_mem_is_zero((char*)vrs->ed25519_id, ED25519_PUBKEY_LEN)) { - smartlist_add_strdup(chunks, "id ed25519 none\n"); - } else { - char ed_b64[BASE64_DIGEST256_LEN+1]; - digest256_to_base64(ed_b64, (const char*)vrs->ed25519_id); - smartlist_add_asprintf(chunks, "id ed25519 %s\n", ed_b64); - } - } } done: result = smartlist_join_strings(chunks, "", 0, NULL); err: - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); + if (chunks) { + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + } return result; } @@ -2161,8 +2454,12 @@ get_possible_sybil_list(const smartlist_t *routers) int addr_count; /* Allow at most this number of Tor servers on a single IP address, ... */ int max_with_same_addr = options->AuthDirMaxServersPerAddr; + /* ... unless it's a directory authority, in which case allow more. */ + int max_with_same_addr_on_authority = options->AuthDirMaxServersPerAuthAddr; if (max_with_same_addr <= 0) max_with_same_addr = INT_MAX; + if (max_with_same_addr_on_authority <= 0) + max_with_same_addr_on_authority = INT_MAX; smartlist_add_all(routers_by_ip, routers); smartlist_sort(routers_by_ip, compare_routerinfo_by_ip_and_bw_); @@ -2175,7 +2472,9 @@ get_possible_sybil_list(const smartlist_t *routers) last_addr = ri->addr; addr_count = 1; } else if (++addr_count > max_with_same_addr) { - digestmap_set(omit_as_sybil, ri->cache_info.identity_digest, ri); + if (!router_addr_is_trusted_dir(ri->addr) || + addr_count > max_with_same_addr_on_authority) + digestmap_set(omit_as_sybil, ri->cache_info.identity_digest, ri); } } SMARTLIST_FOREACH_END(ri); @@ -2183,53 +2482,78 @@ get_possible_sybil_list(const smartlist_t *routers) return omit_as_sybil; } -/** If there are entries in routers with exactly the same ed25519 keys, - * remove the older one. If they are exactly the same age, remove the one - * with the greater descriptor digest. May alter the order of the list. */ -static void -routers_make_ed_keys_unique(smartlist_t *routers) +/** Return non-zero iff a relay running the Tor version specified in + * platform is suitable for use as a potential entry guard. */ +static int +is_router_version_good_for_possible_guard(const char *platform) { - routerinfo_t *ri2; - digest256map_t *by_ed_key = digest256map_new(); + static int parsed_versions_initialized = 0; + static tor_version_t first_good_0_2_1_guard_version; + static tor_version_t first_good_0_2_2_guard_version; + static tor_version_t first_good_later_guard_version; - SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { - ri->omit_from_vote = 0; - if (ri->cache_info.signing_key_cert == NULL) - continue; /* No ed key */ - const uint8_t *pk = ri->cache_info.signing_key_cert->signing_key.pubkey; - if ((ri2 = digest256map_get(by_ed_key, pk))) { - /* Duplicate; must omit one. Set the omit_from_vote flag in whichever - * one has the earlier published_on. */ - const time_t ri_pub = ri->cache_info.published_on; - const time_t ri2_pub = ri2->cache_info.published_on; - if (ri2_pub < ri_pub || - (ri2_pub == ri_pub && - fast_memcmp(ri->cache_info.signed_descriptor_digest, - ri2->cache_info.signed_descriptor_digest,DIGEST_LEN)<0)) { - digest256map_set(by_ed_key, pk, ri); - ri2->omit_from_vote = 1; - } else { - ri->omit_from_vote = 1; - } - } else { - /* Add to map */ - digest256map_set(by_ed_key, pk, ri); - } - } SMARTLIST_FOREACH_END(ri); + tor_version_t router_version; - digest256map_free(by_ed_key, NULL); + /* XXX024 This block should be extracted into its own function. */ + /* XXXX Begin code copied from tor_version_as_new_as (in routerparse.c) */ + { + char *s, *s2, *start; + char tmp[128]; - /* Now remove every router where the omit_from_vote flag got set. */ - SMARTLIST_FOREACH_BEGIN(routers, const routerinfo_t *, ri) { - if (ri->omit_from_vote) { - SMARTLIST_DEL_CURRENT(routers, ri); + tor_assert(platform); + + /* nonstandard Tor; be safe and say yes */ + if (strcmpstart(platform,"Tor ")) + return 1; + + start = (char *)eat_whitespace(platform+3); + if (!*start) return 0; + s = (char *)find_whitespace(start); /* also finds '\0', which is fine */ + s2 = (char*)eat_whitespace(s); + if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-")) + s = (char*)find_whitespace(s2); + + if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */ + return 0; + strlcpy(tmp, start, s-start+1); + + if (tor_version_parse(tmp, &router_version)<0) { + log_info(LD_DIR,"Router version '%s' unparseable.",tmp); + return 1; /* be safe and say yes */ } - } SMARTLIST_FOREACH_END(ri); + } + /* XXXX End code copied from tor_version_as_new_as (in routerparse.c) */ + + if (!parsed_versions_initialized) { + /* CVE-2011-2769 was fixed on the relay side in Tor versions + * 0.2.1.31, 0.2.2.34, and 0.2.3.6-alpha. */ + tor_assert(tor_version_parse("0.2.1.31", + &first_good_0_2_1_guard_version)>=0); + tor_assert(tor_version_parse("0.2.2.34", + &first_good_0_2_2_guard_version)>=0); + tor_assert(tor_version_parse("0.2.3.6-alpha", + &first_good_later_guard_version)>=0); + + /* Don't parse these constant version strings once for every relay + * for every vote. */ + parsed_versions_initialized = 1; + } + + return ((tor_version_same_series(&first_good_0_2_1_guard_version, + &router_version) && + tor_version_compare(&first_good_0_2_1_guard_version, + &router_version) <= 0) || + (tor_version_same_series(&first_good_0_2_2_guard_version, + &router_version) && + tor_version_compare(&first_good_0_2_2_guard_version, + &router_version) <= 0) || + (tor_version_compare(&first_good_later_guard_version, + &router_version) <= 0)); } /** Extract status information from ri and from other authority - * functions and store it in rs. rs is zeroed out before it is - * set. + * functions and store it in rs>. If naming, consider setting + * the named flag in rs. * * We assume that ri-\>is_running has already been set, e.g. by * dirserv_set_router_is_running(ri, now); @@ -2239,7 +2563,8 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, node_t *node, routerinfo_t *ri, time_t now, - int listbadexits) + int naming, int listbadexits, + int listbaddirs, int vote_on_hsdirs) { const or_options_t *options = get_options(); uint32_t routerbw_kb = dirserv_get_credible_bandwidth_kb(ri); @@ -2252,18 +2577,27 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, /* Already set by compute_performance_thresholds. */ rs->is_exit = node->is_exit; rs->is_stable = node->is_stable = + router_is_active(ri, node, now) && !dirserv_thinks_router_is_unreliable(now, ri, 1, 0); rs->is_fast = node->is_fast = + router_is_active(ri, node, now) && !dirserv_thinks_router_is_unreliable(now, ri, 0, 1); rs->is_flagged_running = node->is_running; /* computed above */ + if (naming) { + uint32_t name_status = dirserv_get_name_status( + node->identity, ri->nickname); + rs->is_named = (naming && (name_status & FP_NAMED)) ? 1 : 0; + rs->is_unnamed = (naming && (name_status & FP_UNNAMED)) ? 1 : 0; + } rs->is_valid = node->is_valid; - if (node->is_fast && node->is_stable && + if (node->is_fast && ((options->AuthDirGuardBWGuarantee && routerbw_kb >= options->AuthDirGuardBWGuarantee/1000) || routerbw_kb >= MIN(guard_bandwidth_including_exits_kb, - guard_bandwidth_excluding_exits_kb))) { + guard_bandwidth_excluding_exits_kb)) && + is_router_version_good_for_possible_guard(ri->platform)) { long tk = rep_hist_get_weighted_time_known( node->identity, now); double wfu = rep_hist_get_weighted_fractional_uptime( @@ -2272,12 +2606,19 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, } else { rs->is_possible_guard = 0; } + if (options->TestingTorNetwork && + routerset_contains_routerstatus(options->TestingDirAuthVoteGuard, + rs, 0)) { + rs->is_possible_guard = 1; + } + rs->is_bad_directory = listbaddirs && node->is_bad_directory; rs->is_bad_exit = listbadexits && node->is_bad_exit; - rs->is_hs_dir = node->is_hs_dir = - dirserv_thinks_router_is_hs_dir(ri, node, now); + node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now); + rs->is_hs_dir = vote_on_hsdirs && node->is_hs_dir; - rs->is_named = rs->is_unnamed = 0; + if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME)) + rs->is_named = rs->is_unnamed = 0; rs->published_on = ri->cache_info.published_on; memcpy(rs->identity_digest, node->identity, DIGEST_LEN); @@ -2287,7 +2628,6 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, strlcpy(rs->nickname, ri->nickname, sizeof(rs->nickname)); rs->or_port = ri->or_port; rs->dir_port = ri->dir_port; - rs->is_v2_dir = ri->supports_tunnelled_dir_requests; if (options->AuthDirHasIPv6Connectivity == 1 && !tor_addr_is_null(&ri->ipv6_addr) && node->last_reachable6 >= now - REACHABLE_TIMEOUT) { @@ -2295,382 +2635,25 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, OR port and it's reachable so copy it to the routerstatus. */ tor_addr_copy(&rs->ipv6_addr, &ri->ipv6_addr); rs->ipv6_orport = ri->ipv6_orport; - } else { - tor_addr_make_null(&rs->ipv6_addr, AF_INET6); - rs->ipv6_orport = 0; - } - - if (options->TestingTorNetwork) { - dirserv_set_routerstatus_testing(rs); - } -} - -/** Use TestingDirAuthVoteExit, TestingDirAuthVoteGuard, and - * TestingDirAuthVoteHSDir to give out the Exit, Guard, and HSDir flags, - * respectively. But don't set the corresponding node flags. - * Should only be called if TestingTorNetwork is set. */ -STATIC void -dirserv_set_routerstatus_testing(routerstatus_t *rs) -{ - const or_options_t *options = get_options(); - - tor_assert(options->TestingTorNetwork); - - if (routerset_contains_routerstatus(options->TestingDirAuthVoteExit, - rs, 0)) { - rs->is_exit = 1; - } else if (options->TestingDirAuthVoteExitIsStrict) { - rs->is_exit = 0; - } - - if (routerset_contains_routerstatus(options->TestingDirAuthVoteGuard, - rs, 0)) { - rs->is_possible_guard = 1; - } else if (options->TestingDirAuthVoteGuardIsStrict) { - rs->is_possible_guard = 0; - } - - if (routerset_contains_routerstatus(options->TestingDirAuthVoteHSDir, - rs, 0)) { - rs->is_hs_dir = 1; - } else if (options->TestingDirAuthVoteHSDirIsStrict) { - rs->is_hs_dir = 0; } } /** Routerstatus rs is part of a group of routers that are on - * too narrow an IP-space. Clear out its flags since we don't want it be used - * because of its Sybil-like appearance. - * - * Leave its BadExit flag alone though, since if we think it's a bad exit, - * we want to vote that way in case all the other authorities are voting - * Running and Exit. + * too narrow an IP-space. Clear out its flags: we don't want people + * using it. */ static void clear_status_flags_on_sybil(routerstatus_t *rs) { rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = rs->is_named = rs->is_valid = - rs->is_hs_dir = rs->is_v2_dir = rs->is_possible_guard = 0; + rs->is_hs_dir = rs->is_possible_guard = rs->is_bad_exit = + rs->is_bad_directory = 0; /* FFFF we might want some mechanism to check later on if we * missed zeroing any flags: it's easy to add a new flag but * forget to add it to this clause. */ } -/** The guardfraction of the guard with identity fingerprint guard_id - * is guardfraction_percentage. See if we have a vote routerstatus for - * this guard in vote_routerstatuses, and if we do, register the - * information to it. - * - * Return 1 if we applied the information and 0 if we couldn't find a - * matching guard. - * - * Requires that vote_routerstatuses be sorted. - */ -static int -guardfraction_line_apply(const char *guard_id, - uint32_t guardfraction_percentage, - smartlist_t *vote_routerstatuses) -{ - vote_routerstatus_t *vrs = NULL; - - tor_assert(vote_routerstatuses); - - vrs = smartlist_bsearch(vote_routerstatuses, guard_id, - compare_digest_to_vote_routerstatus_entry); - - if (!vrs) { - return 0; - } - - vrs->status.has_guardfraction = 1; - vrs->status.guardfraction_percentage = guardfraction_percentage; - - return 1; -} - -/* Given a guard line from a guardfraction file, parse it and register - * its information to vote_routerstatuses. - * - * Return: - * * 1 if the line was proper and its information got registered. - * * 0 if the line was proper but no currently active guard was found - * to register the guardfraction information to. - * * -1 if the line could not be parsed and set err_msg to a - newly allocated string containing the error message. - */ -static int -guardfraction_file_parse_guard_line(const char *guard_line, - smartlist_t *vote_routerstatuses, - char **err_msg) -{ - char guard_id[DIGEST_LEN]; - uint32_t guardfraction; - char *inputs_tmp = NULL; - int num_ok = 1; - - smartlist_t *sl = smartlist_new(); - int retval = -1; - - tor_assert(err_msg); - - /* guard_line should contain something like this: - */ - smartlist_split_string(sl, guard_line, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); - if (smartlist_len(sl) < 3) { - tor_asprintf(err_msg, "bad line '%s'", guard_line); - goto done; - } - - inputs_tmp = smartlist_get(sl, 0); - if (strlen(inputs_tmp) != HEX_DIGEST_LEN || - base16_decode(guard_id, DIGEST_LEN, - inputs_tmp, HEX_DIGEST_LEN) != DIGEST_LEN) { - tor_asprintf(err_msg, "bad digest '%s'", inputs_tmp); - goto done; - } - - inputs_tmp = smartlist_get(sl, 1); - /* Guardfraction is an integer in [0, 100]. */ - guardfraction = - (uint32_t) tor_parse_long(inputs_tmp, 10, 0, 100, &num_ok, NULL); - if (!num_ok) { - tor_asprintf(err_msg, "wrong percentage '%s'", inputs_tmp); - goto done; - } - - /* If routerstatuses were provided, apply this info to actual routers. */ - if (vote_routerstatuses) { - retval = guardfraction_line_apply(guard_id, guardfraction, - vote_routerstatuses); - } else { - retval = 0; /* If we got this far, line was correctly formatted. */ - } - - done: - - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - - return retval; -} - -/** Given an inputs line from a guardfraction file, parse it and - * register its information to total_consensuses and - * total_days. - * - * Return 0 if it parsed well. Return -1 if there was an error, and - * set err_msg to a newly allocated string containing the - * error message. - */ -static int -guardfraction_file_parse_inputs_line(const char *inputs_line, - int *total_consensuses, - int *total_days, - char **err_msg) -{ - int retval = -1; - char *inputs_tmp = NULL; - int num_ok = 1; - smartlist_t *sl = smartlist_new(); - - tor_assert(err_msg); - - /* Second line is inputs information: - * n-inputs . */ - smartlist_split_string(sl, inputs_line, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); - if (smartlist_len(sl) < 2) { - tor_asprintf(err_msg, "incomplete line '%s'", inputs_line); - goto done; - } - - inputs_tmp = smartlist_get(sl, 0); - *total_consensuses = - (int) tor_parse_long(inputs_tmp, 10, 0, INT_MAX, &num_ok, NULL); - if (!num_ok) { - tor_asprintf(err_msg, "unparseable consensus '%s'", inputs_tmp); - goto done; - } - - inputs_tmp = smartlist_get(sl, 1); - *total_days = - (int) tor_parse_long(inputs_tmp, 10, 0, INT_MAX, &num_ok, NULL); - if (!num_ok) { - tor_asprintf(err_msg, "unparseable days '%s'", inputs_tmp); - goto done; - } - - retval = 0; - - done: - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - - return retval; -} - -/* Maximum age of a guardfraction file that we are willing to accept. */ -#define MAX_GUARDFRACTION_FILE_AGE (7*24*60*60) /* approx a week */ - -/** Static strings of guardfraction files. */ -#define GUARDFRACTION_DATE_STR "written-at" -#define GUARDFRACTION_INPUTS "n-inputs" -#define GUARDFRACTION_GUARD "guard-seen" -#define GUARDFRACTION_VERSION "guardfraction-file-version" - -/** Given a guardfraction file in a string, parse it and register the - * guardfraction information to the provided vote routerstatuses. - * - * This is the rough format of the guardfraction file: - * - * guardfraction-file-version 1 - * written-at - * n-inputs - * - * guard-seen - * guard-seen - * guard-seen - * guard-seen - * guard-seen - * ... - * - * Return -1 if the parsing failed and 0 if it went smoothly. Parsing - * should tolerate errors in all lines but the written-at header. - */ -STATIC int -dirserv_read_guardfraction_file_from_str(const char *guardfraction_file_str, - smartlist_t *vote_routerstatuses) -{ - config_line_t *front=NULL, *line; - int ret_tmp; - int retval = -1; - int current_line_n = 0; /* line counter for better log messages */ - - /* Guardfraction info to be parsed */ - int total_consensuses = 0; - int total_days = 0; - - /* Stats */ - int guards_read_n = 0; - int guards_applied_n = 0; - - /* Parse file and split it in lines */ - ret_tmp = config_get_lines(guardfraction_file_str, &front, 0); - if (ret_tmp < 0) { - log_warn(LD_CONFIG, "Error reading from guardfraction file"); - goto done; - } - - /* Sort routerstatuses (needed later when applying guardfraction info) */ - if (vote_routerstatuses) - smartlist_sort(vote_routerstatuses, compare_vote_routerstatus_entries); - - for (line = front; line; line=line->next) { - current_line_n++; - - if (!strcmp(line->key, GUARDFRACTION_VERSION)) { - int num_ok = 1; - unsigned int version; - - version = - (unsigned int) tor_parse_long(line->value, - 10, 0, INT_MAX, &num_ok, NULL); - - if (!num_ok || version != 1) { - log_warn(LD_GENERAL, "Got unknown guardfraction version %d.", version); - goto done; - } - } else if (!strcmp(line->key, GUARDFRACTION_DATE_STR)) { - time_t file_written_at; - time_t now = time(NULL); - - /* First line is 'written-at ' */ - if (parse_iso_time(line->value, &file_written_at) < 0) { - log_warn(LD_CONFIG, "Guardfraction:%d: Bad date '%s'. Ignoring", - current_line_n, line->value); - goto done; /* don't tolerate failure here. */ - } - if (file_written_at < now - MAX_GUARDFRACTION_FILE_AGE) { - log_warn(LD_CONFIG, "Guardfraction:%d: was written very long ago '%s'", - current_line_n, line->value); - goto done; /* don't tolerate failure here. */ - } - } else if (!strcmp(line->key, GUARDFRACTION_INPUTS)) { - char *err_msg = NULL; - - if (guardfraction_file_parse_inputs_line(line->value, - &total_consensuses, - &total_days, - &err_msg) < 0) { - log_warn(LD_CONFIG, "Guardfraction:%d: %s", - current_line_n, err_msg); - tor_free(err_msg); - continue; - } - - } else if (!strcmp(line->key, GUARDFRACTION_GUARD)) { - char *err_msg = NULL; - - ret_tmp = guardfraction_file_parse_guard_line(line->value, - vote_routerstatuses, - &err_msg); - if (ret_tmp < 0) { /* failed while parsing the guard line */ - log_warn(LD_CONFIG, "Guardfraction:%d: %s", - current_line_n, err_msg); - tor_free(err_msg); - continue; - } - - /* Successfully parsed guard line. Check if it was applied properly. */ - guards_read_n++; - if (ret_tmp > 0) { - guards_applied_n++; - } - } else { - log_warn(LD_CONFIG, "Unknown guardfraction line %d (%s %s)", - current_line_n, line->key, line->value); - } - } - - retval = 0; - - log_info(LD_CONFIG, - "Successfully parsed guardfraction file with %d consensuses over " - "%d days. Parsed %d nodes and applied %d of them%s.", - total_consensuses, total_days, guards_read_n, guards_applied_n, - vote_routerstatuses ? "" : " (no routerstatus provided)" ); - - done: - config_free_lines(front); - - if (retval < 0) { - return retval; - } else { - return guards_read_n; - } -} - -/** Read a guardfraction file at fname and load all its - * information to vote_routerstatuses. */ -int -dirserv_read_guardfraction_file(const char *fname, - smartlist_t *vote_routerstatuses) -{ - char *guardfraction_file_str; - - /* Read file to a string */ - guardfraction_file_str = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); - if (!guardfraction_file_str) { - log_warn(LD_FS, "Cannot open guardfraction file '%s'. Failing.", fname); - return -1; - } - - return dirserv_read_guardfraction_file_from_str(guardfraction_file_str, - vote_routerstatuses); -} - /** * Helper function to parse out a line in the measured bandwidth file * into a measured_bw_line_t output structure. Returns -1 on failure @@ -2712,7 +2695,7 @@ measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line) } cp+=strlen("bw="); - out->bw_kb = tor_parse_long(cp, 10, 0, LONG_MAX, &parse_ok, &endptr); + out->bw_kb = tor_parse_long(cp, 0, 0, LONG_MAX, &parse_ok, &endptr); if (!parse_ok || (*endptr && !TOR_ISSPACE(*endptr))) { log_warn(LD_DIRSERV, "Invalid bandwidth in bandwidth file line: %s", escaped(orig_line)); @@ -2730,8 +2713,7 @@ measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line) cp+=strlen("node_id=$"); if (strlen(cp) != HEX_DIGEST_LEN || - base16_decode(out->node_id, DIGEST_LEN, - cp, HEX_DIGEST_LEN) != DIGEST_LEN) { + base16_decode(out->node_id, DIGEST_LEN, cp, HEX_DIGEST_LEN)) { log_warn(LD_DIRSERV, "Invalid node_id in bandwidth file line: %s", escaped(orig_line)); tor_free(line); @@ -2788,7 +2770,7 @@ int dirserv_read_measured_bandwidths(const char *from_file, smartlist_t *routerstatuses) { - char line[512]; + char line[256]; FILE *fp = tor_fopen_cloexec(from_file, "r"); int applied_lines = 0; time_t file_time, now; @@ -2809,7 +2791,7 @@ dirserv_read_measured_bandwidths(const char *from_file, } line[strlen(line)-1] = '\0'; - file_time = (time_t)tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL); + file_time = tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL); if (!ok) { log_warn(LD_DIRSERV, "Non-integer time in bandwidth file: %s", escaped(line)); @@ -2864,7 +2846,10 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, smartlist_t *routers, *routerstatuses; char identity_digest[DIGEST_LEN]; char signing_key_digest[DIGEST_LEN]; + int naming = options->NamingAuthoritativeDir; int listbadexits = options->AuthDirListBadExits; + int listbaddirs = options->AuthDirListBadDirs; + int vote_on_hsdirs = options->VoteOnHidServDirectoriesV2; routerlist_t *rl = router_get_routerlist(); time_t now = time(NULL); time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; @@ -2877,14 +2862,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, tor_assert(private_key); tor_assert(cert); - if (crypto_pk_get_digest(private_key, signing_key_digest)<0) { - log_err(LD_BUG, "Error computing signing key digest"); - return NULL; - } - if (crypto_pk_get_digest(cert->identity_key, identity_digest)<0) { - log_err(LD_BUG, "Error computing identity key digest"); - return NULL; - } if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) { log_warn(LD_NET, "Couldn't resolve my hostname"); return NULL; @@ -2893,6 +2870,14 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, tor_free(hostname); hostname = tor_dup_ip(addr); } + if (crypto_pk_get_digest(private_key, signing_key_digest)<0) { + log_err(LD_BUG, "Error computing signing key digest"); + return NULL; + } + if (crypto_pk_get_digest(cert->identity_key, identity_digest)<0) { + log_err(LD_BUG, "Error computing identity key digest"); + return NULL; + } if (options->VersioningAuthoritativeDir) { client_versions = format_versions_list(options->RecommendedClientVersions); @@ -2927,8 +2912,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, routers = smartlist_new(); smartlist_add_all(routers, rl->routers); - routers_make_ed_keys_unique(routers); - /* After this point, don't use rl->routers; use 'routers' instead. */ routers_sort_by_identity(routers); omit_as_sybil = get_possible_sybil_list(routers); @@ -2939,9 +2922,9 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, /* Count how many have measured bandwidths so we know how to assign flags; * this must come before dirserv_compute_performance_thresholds() */ - dirserv_count_measured_bws(routers); + dirserv_count_measured_bws(rl); - dirserv_compute_performance_thresholds(omit_as_sybil); + dirserv_compute_performance_thresholds(rl, omit_as_sybil); routerstatuses = smartlist_new(); microdescriptors = smartlist_new(); @@ -2957,13 +2940,8 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); rs = &vrs->status; set_routerstatus_from_routerinfo(rs, node, ri, now, - listbadexits); - - if (ri->cache_info.signing_key_cert) { - memcpy(vrs->ed25519_id, - ri->cache_info.signing_key_cert->signing_key.pubkey, - ED25519_PUBKEY_LEN); - } + naming, listbadexits, listbaddirs, + vote_on_hsdirs); if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) clear_status_flags_on_sybil(rs); @@ -2972,12 +2950,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, rs->is_flagged_running = 0; vrs->version = version_from_platform(ri->platform); - if (ri->protocol_list) { - vrs->protocols = tor_strdup(ri->protocol_list); - } else { - vrs->protocols = tor_strdup( - protover_compute_for_old_tor(vrs->version)); - } vrs->microdesc = dirvote_format_all_microdesc_vote_lines(ri, now, microdescriptors); @@ -2996,12 +2968,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, smartlist_free(routers); digestmap_free(omit_as_sybil, NULL); - /* Apply guardfraction information to routerstatuses. */ - if (options->GuardfractionFile) { - dirserv_read_guardfraction_file(options->GuardfractionFile, - routerstatuses); - } - /* This pass through applies the measured bw lines to the routerstatuses */ if (options->V3BandwidthsFile) { dirserv_read_measured_bandwidths(options->V3BandwidthsFile, @@ -3050,48 +3016,22 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, v3_out->client_versions = client_versions; v3_out->server_versions = server_versions; - - /* These are hardwired, to avoid disaster. */ - v3_out->recommended_relay_protocols = - tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=4 LinkAuth=1 Microdesc=1-2 Relay=2"); - v3_out->recommended_client_protocols = - tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=4 LinkAuth=1 Microdesc=1-2 Relay=2"); - v3_out->required_client_protocols = - tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=4 LinkAuth=1 Microdesc=1-2 Relay=2"); - v3_out->required_relay_protocols = - tor_strdup("Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2"); - - /* We are not allowed to vote to require anything we don't have. */ - tor_assert(protover_all_supported(v3_out->required_relay_protocols, NULL)); - tor_assert(protover_all_supported(v3_out->required_client_protocols, NULL)); - - /* We should not recommend anything we don't have. */ - tor_assert_nonfatal(protover_all_supported( - v3_out->recommended_relay_protocols, NULL)); - tor_assert_nonfatal(protover_all_supported( - v3_out->recommended_client_protocols, NULL)); - - v3_out->package_lines = smartlist_new(); - { - config_line_t *cl; - for (cl = get_options()->RecommendedPackages; cl; cl = cl->next) { - if (validate_recommended_package_line(cl->value)) - smartlist_add_strdup(v3_out->package_lines, cl->value); - } - } - v3_out->known_flags = smartlist_new(); smartlist_split_string(v3_out->known_flags, - "Authority Exit Fast Guard Stable V2Dir Valid HSDir", + "Authority Exit Fast Guard Stable V2Dir Valid", 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); if (vote_on_reachability) - smartlist_add_strdup(v3_out->known_flags, "Running"); + smartlist_add(v3_out->known_flags, tor_strdup("Running")); + if (listbaddirs) + smartlist_add(v3_out->known_flags, tor_strdup("BadDirectory")); if (listbadexits) - smartlist_add_strdup(v3_out->known_flags, "BadExit"); + smartlist_add(v3_out->known_flags, tor_strdup("BadExit")); + if (naming) { + smartlist_add(v3_out->known_flags, tor_strdup("Named")); + smartlist_add(v3_out->known_flags, tor_strdup("Unnamed")); + } + if (vote_on_hsdirs) + smartlist_add(v3_out->known_flags, tor_strdup("HSDir")); smartlist_sort_strings(v3_out->known_flags); if (options->ConsensusParams) { @@ -3136,61 +3076,58 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, * requests, adds identity digests. */ int -dirserv_get_routerdesc_spool(smartlist_t *spool_out, - const char *key, - dir_spool_source_t source, - int conn_is_encrypted, - const char **msg_out) +dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, + const char **msg, int for_unencrypted_conn, + int is_extrainfo) { - *msg_out = NULL; + int by_id = 1; + *msg = NULL; if (!strcmp(key, "all")) { - const routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH_BEGIN(rl->routers, const routerinfo_t *, r) { - spooled_resource_t *spooled; - spooled = spooled_resource_new(source, - (const uint8_t *)r->cache_info.identity_digest, - DIGEST_LEN); - /* Treat "all" requests as if they were unencrypted */ - conn_is_encrypted = 0; - smartlist_add(spool_out, spooled); - } SMARTLIST_FOREACH_END(r); + routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, + smartlist_add(fps_out, + tor_memdup(r->cache_info.identity_digest, DIGEST_LEN))); + /* Treat "all" requests as if they were unencrypted */ + for_unencrypted_conn = 1; } else if (!strcmp(key, "authority")) { const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) - smartlist_add(spool_out, - spooled_resource_new(source, - (const uint8_t *)ri->cache_info.identity_digest, - DIGEST_LEN)); + smartlist_add(fps_out, + tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN)); } else if (!strcmpstart(key, "d/")) { + by_id = 0; key += strlen("d/"); - dir_split_resource_into_spoolable(key, source, spool_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_fingerprints(key, fps_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else if (!strcmpstart(key, "fp/")) { key += strlen("fp/"); - dir_split_resource_into_spoolable(key, source, spool_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_fingerprints(key, fps_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else { - *msg_out = "Not found"; + *msg = "Key not recognized"; return -1; } - if (! conn_is_encrypted) { + if (for_unencrypted_conn) { /* Remove anything that insists it not be sent unencrypted. */ - SMARTLIST_FOREACH_BEGIN(spool_out, spooled_resource_t *, spooled) { - const uint8_t *body = NULL; - size_t bodylen = 0; - int r = spooled_resource_lookup_body(spooled, conn_is_encrypted, - &body, &bodylen, NULL); - if (r < 0 || body == NULL || bodylen == 0) { - SMARTLIST_DEL_CURRENT(spool_out, spooled); - spooled_resource_free(spooled); - } - } SMARTLIST_FOREACH_END(spooled); + SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) { + const signed_descriptor_t *sd; + if (by_id) + sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0); + else if (is_extrainfo) + sd = extrainfo_get_by_descriptor_digest(cp); + else + sd = router_get_by_descriptor_digest(cp); + if (sd && !sd->send_unencrypted) { + tor_free(cp); + SMARTLIST_DEL_CURRENT(fps_out, cp); + } + } SMARTLIST_FOREACH_END(cp); } - if (!smartlist_len(spool_out)) { - *msg_out = "Servers unavailable"; + if (!smartlist_len(fps_out)) { + *msg = "Servers unavailable"; return -1; } return 0; @@ -3249,7 +3186,7 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, DSR_HEX|DSR_SORT_UNIQ); SMARTLIST_FOREACH_BEGIN(digests, const char *, d) { if (router_digest_is_me(d)) { - /* calling router_get_my_routerinfo() to make sure it exists */ + /* make sure desc_routerinfo exists */ const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) smartlist_add(descs_out, (void*) &(ri->cache_info)); @@ -3281,13 +3218,12 @@ dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, * router listening at address:or_port, and has yielded * a certificate with digest digest_rcvd. * - * Inform the reachability checker that we could get to this relay. + * Inform the reachability checker that we could get to this guy. */ void dirserv_orconn_tls_done(const tor_addr_t *addr, uint16_t or_port, - const char *digest_rcvd, - const ed25519_public_key_t *ed_id_rcvd) + const char *digest_rcvd) { node_t *node = NULL; tor_addr_port_t orport; @@ -3299,26 +3235,8 @@ dirserv_orconn_tls_done(const tor_addr_t *addr, node = node_get_mutable_by_id(digest_rcvd); if (node == NULL || node->ri == NULL) return; - ri = node->ri; - if (get_options()->AuthDirTestEd25519LinkKeys && - node_supports_ed25519_link_authentication(node, 1) && - ri->cache_info.signing_key_cert) { - /* We allow the node to have an ed25519 key if we haven't been told one in - * the routerinfo, but if we *HAVE* been told one in the routerinfo, it - * needs to match. */ - const ed25519_public_key_t *expected_id = - &ri->cache_info.signing_key_cert->signing_key; - tor_assert(!ed25519_public_key_is_zero(expected_id)); - if (! ed_id_rcvd || ! ed25519_pubkey_eq(ed_id_rcvd, expected_id)) { - log_info(LD_DIRSERV, "Router at %s:%d with RSA ID %s " - "did not present expected Ed25519 ID.", - fmt_addr(addr), or_port, hex_str(digest_rcvd, DIGEST_LEN)); - return; /* Don't mark it as reachable. */ - } - } - tor_addr_copy(&orport.addr, addr); orport.port = or_port; if (router_has_orport(ri, &orport)) { @@ -3326,7 +3244,7 @@ dirserv_orconn_tls_done(const tor_addr_t *addr, if (!authdir_mode_bridge(get_options()) || ri->purpose == ROUTER_PURPOSE_BRIDGE) { char addrstr[TOR_ADDR_BUF_LEN]; - /* This is a bridge or we're not a bridge authority -- + /* This is a bridge or we're not a bridge authorititative -- mark it as reachable. */ log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.", router_describe(ri), @@ -3374,31 +3292,21 @@ dirserv_should_launch_reachability_test(const routerinfo_t *ri, void dirserv_single_reachability_test(time_t now, routerinfo_t *router) { - const or_options_t *options = get_options(); channel_t *chan = NULL; - const node_t *node = NULL; + node_t *node = NULL; tor_addr_t router_addr; - const ed25519_public_key_t *ed_id_key; (void) now; tor_assert(router); - node = node_get_by_id(router->cache_info.identity_digest); + node = node_get_mutable_by_id(router->cache_info.identity_digest); tor_assert(node); - if (options->AuthDirTestEd25519LinkKeys && - node_supports_ed25519_link_authentication(node, 1)) { - ed_id_key = &router->cache_info.signing_key_cert->signing_key; - } else { - ed_id_key = NULL; - } - /* IPv4. */ log_debug(LD_OR,"Testing reachability of %s at %s:%u.", - router->nickname, fmt_addr32(router->addr), router->or_port); + router->nickname, router->address, router->or_port); tor_addr_from_ipv4h(&router_addr, router->addr); chan = channel_tls_connect(&router_addr, router->or_port, - router->cache_info.identity_digest, - ed_id_key); + router->cache_info.identity_digest); if (chan) command_setup_channel(chan); /* Possible IPv6. */ @@ -3410,8 +3318,7 @@ dirserv_single_reachability_test(time_t now, routerinfo_t *router) tor_addr_to_str(addrstr, &router->ipv6_addr, sizeof(addrstr), 1), router->ipv6_orport); chan = channel_tls_connect(&router->ipv6_addr, router->ipv6_orport, - router->cache_info.identity_digest, - ed_id_key); + router->cache_info.identity_digest); if (chan) command_setup_channel(chan); } } @@ -3454,409 +3361,45 @@ dirserv_test_reachability(time_t now) ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */ } -/* ========== - * Spooling code. - * ========== */ - -spooled_resource_t * -spooled_resource_new(dir_spool_source_t source, - const uint8_t *digest, size_t digestlen) -{ - spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t)); - spooled->spool_source = source; - switch (source) { - case DIR_SPOOL_NETWORKSTATUS: - spooled->spool_eagerly = 0; - break; - case DIR_SPOOL_SERVER_BY_DIGEST: - case DIR_SPOOL_SERVER_BY_FP: - case DIR_SPOOL_EXTRA_BY_DIGEST: - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_MICRODESC: - default: - spooled->spool_eagerly = 1; - break; - case DIR_SPOOL_CONSENSUS_CACHE_ENTRY: - tor_assert_unreached(); - break; - } - tor_assert(digestlen <= sizeof(spooled->digest)); - if (digest) - memcpy(spooled->digest, digest, digestlen); - return spooled; -} - -/** - * Create a new spooled_resource_t to spool the contents of entry to - * the user. Return the spooled object on success, or NULL on failure (which - * is probably caused by a failure to map the body of the item from disk). - * - * Adds a reference to entry's reference counter. - */ -spooled_resource_t * -spooled_resource_new_from_cache_entry(consensus_cache_entry_t *entry) -{ - spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t)); - spooled->spool_source = DIR_SPOOL_CONSENSUS_CACHE_ENTRY; - spooled->spool_eagerly = 0; - consensus_cache_entry_incref(entry); - spooled->consensus_cache_entry = entry; - - int r = consensus_cache_entry_get_body(entry, - &spooled->cce_body, - &spooled->cce_len); - if (r == 0) { - return spooled; - } else { - spooled_resource_free(spooled); - return NULL; - } -} - -/** Release all storage held by spooled. */ -void -spooled_resource_free_(spooled_resource_t *spooled) -{ - if (spooled == NULL) - return; - - if (spooled->cached_dir_ref) { - cached_dir_decref(spooled->cached_dir_ref); - } - - if (spooled->consensus_cache_entry) { - consensus_cache_entry_decref(spooled->consensus_cache_entry); - } - - tor_free(spooled); -} - -/** When spooling data from a cached_dir_t object, we always add - * at least this much. */ -#define DIRSERV_CACHED_DIR_CHUNK_SIZE 8192 - -/** Return an compression ratio for compressing objects from source. - */ -static double -estimate_compression_ratio(dir_spool_source_t source) -{ - /* We should put in better estimates here, depending on the number of - objects and their type */ - (void) source; - return 0.5; -} - -/** Return an estimated number of bytes needed for transmitting the - * resource in spooled on conn - * - * As a convenient side-effect, set *published_out to the resource's - * publication time. - */ -static size_t -spooled_resource_estimate_size(const spooled_resource_t *spooled, - dir_connection_t *conn, - int compressed, - time_t *published_out) -{ - if (spooled->spool_eagerly) { - const uint8_t *body = NULL; - size_t bodylen = 0; - int r = spooled_resource_lookup_body(spooled, - connection_dir_is_encrypted(conn), - &body, &bodylen, - published_out); - if (r == -1 || body == NULL || bodylen == 0) - return 0; - if (compressed) { - double ratio = estimate_compression_ratio(spooled->spool_source); - bodylen = (size_t)(bodylen * ratio); - } - return bodylen; - } else { - cached_dir_t *cached; - if (spooled->consensus_cache_entry) { - if (published_out) { - consensus_cache_entry_get_valid_after( - spooled->consensus_cache_entry, published_out); - } - - return spooled->cce_len; - } - if (spooled->cached_dir_ref) { - cached = spooled->cached_dir_ref; - } else { - cached = spooled_resource_lookup_cached_dir(spooled, - published_out); - } - if (cached == NULL) { - return 0; - } - size_t result = compressed ? cached->dir_compressed_len : cached->dir_len; - return result; - } -} - -/** Return code for spooled_resource_flush_some */ -typedef enum { - SRFS_ERR = -1, - SRFS_MORE = 0, - SRFS_DONE -} spooled_resource_flush_status_t; - -/** Flush some or all of the bytes from spooled onto conn. - * Return SRFS_ERR on error, SRFS_MORE if there are more bytes to flush from - * this spooled resource, or SRFS_DONE if we are done flushing this spooled - * resource. - */ -static spooled_resource_flush_status_t -spooled_resource_flush_some(spooled_resource_t *spooled, - dir_connection_t *conn) -{ - if (spooled->spool_eagerly) { - /* Spool_eagerly resources are sent all-at-once. */ - const uint8_t *body = NULL; - size_t bodylen = 0; - int r = spooled_resource_lookup_body(spooled, - connection_dir_is_encrypted(conn), - &body, &bodylen, NULL); - if (r == -1 || body == NULL || bodylen == 0) { - /* Absent objects count as "done". */ - return SRFS_DONE; - } - if (conn->compress_state) { - connection_buf_add_compress((const char*)body, bodylen, conn, 0); - } else { - connection_buf_add((const char*)body, bodylen, TO_CONN(conn)); - } - return SRFS_DONE; - } else { - cached_dir_t *cached = spooled->cached_dir_ref; - consensus_cache_entry_t *cce = spooled->consensus_cache_entry; - if (cached == NULL && cce == NULL) { - /* The cached_dir_t hasn't been materialized yet. So let's look it up. */ - cached = spooled->cached_dir_ref = - spooled_resource_lookup_cached_dir(spooled, NULL); - if (!cached) { - /* Absent objects count as done. */ - return SRFS_DONE; - } - ++cached->refcnt; - tor_assert_nonfatal(spooled->cached_dir_offset == 0); - } - - if (BUG(!cached && !cce)) - return SRFS_DONE; - - int64_t total_len; - const char *ptr; - if (cached) { - total_len = cached->dir_compressed_len; - ptr = cached->dir_compressed; - } else { - total_len = spooled->cce_len; - ptr = (const char *)spooled->cce_body; - } - /* How many bytes left to flush? */ - int64_t remaining; - remaining = total_len - spooled->cached_dir_offset; - if (BUG(remaining < 0)) - return SRFS_ERR; - ssize_t bytes = (ssize_t) MIN(DIRSERV_CACHED_DIR_CHUNK_SIZE, remaining); - if (conn->compress_state) { - connection_buf_add_compress( - ptr + spooled->cached_dir_offset, - bytes, conn, 0); - } else { - connection_buf_add(ptr + spooled->cached_dir_offset, - bytes, TO_CONN(conn)); - } - spooled->cached_dir_offset += bytes; - if (spooled->cached_dir_offset >= (off_t)total_len) { - return SRFS_DONE; - } else { - return SRFS_MORE; - } - } -} - -/** Helper: find the cached_dir_t for a spooled_resource_t, for - * sending it to conn. Set *published_out, if provided, - * to the published time of the cached_dir_t. - * - * DOES NOT increase the reference count on the result. Callers must do that - * themselves if they mean to hang on to it. - */ -static cached_dir_t * -spooled_resource_lookup_cached_dir(const spooled_resource_t *spooled, - time_t *published_out) -{ - tor_assert(spooled->spool_eagerly == 0); - cached_dir_t *d = lookup_cached_dir_by_fp(spooled->digest); - if (d != NULL) { - if (published_out) - *published_out = d->published; - } - return d; -} - -/** Helper: Look up the body for an eagerly-served spooled_resource. If - * conn_is_encrypted is false, don't look up any resource that - * shouldn't be sent over an unencrypted connection. On success, set - * body_out, size_out, and published_out to refer - * to the resource's body, size, and publication date, and return 0. - * On failure return -1. */ -static int -spooled_resource_lookup_body(const spooled_resource_t *spooled, - int conn_is_encrypted, - const uint8_t **body_out, - size_t *size_out, - time_t *published_out) -{ - tor_assert(spooled->spool_eagerly == 1); - - const signed_descriptor_t *sd = NULL; - - switch (spooled->spool_source) { - case DIR_SPOOL_EXTRA_BY_FP: { - sd = get_signed_descriptor_by_fp(spooled->digest, 1); - break; - } - case DIR_SPOOL_SERVER_BY_FP: { - sd = get_signed_descriptor_by_fp(spooled->digest, 0); - break; - } - case DIR_SPOOL_SERVER_BY_DIGEST: { - sd = router_get_by_descriptor_digest((const char *)spooled->digest); - break; - } - case DIR_SPOOL_EXTRA_BY_DIGEST: { - sd = extrainfo_get_by_descriptor_digest((const char *)spooled->digest); - break; - } - case DIR_SPOOL_MICRODESC: { - microdesc_t *md = microdesc_cache_lookup_by_digest256( - get_microdesc_cache(), - (const char *)spooled->digest); - if (! md || ! md->body) { - return -1; - } - *body_out = (const uint8_t *)md->body; - *size_out = md->bodylen; - if (published_out) - *published_out = TIME_MAX; - return 0; - } - case DIR_SPOOL_NETWORKSTATUS: - case DIR_SPOOL_CONSENSUS_CACHE_ENTRY: - default: - /* LCOV_EXCL_START */ - tor_assert_nonfatal_unreached(); - return -1; - /* LCOV_EXCL_STOP */ - } - - /* If we get here, then we tried to set "sd" to a signed_descriptor_t. */ - - if (sd == NULL) { - return -1; - } - if (sd->send_unencrypted == 0 && ! conn_is_encrypted) { - /* we did this check once before (so we could have an accurate size - * estimate and maybe send a 404 if somebody asked for only bridges on - * a connection), but we need to do it again in case a previously - * unknown bridge descriptor has shown up between then and now. */ - return -1; - } - *body_out = (const uint8_t *) signed_descriptor_get_body(sd); - *size_out = sd->signed_descriptor_len; - if (published_out) - *published_out = sd->published_on; - return 0; -} - /** Given a fingerprint fp which is either set if we're looking for a * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded * flavor name if we want a flavored v3 status, return a pointer to the * appropriate cached dir object, or NULL if there isn't one available. */ static cached_dir_t * -lookup_cached_dir_by_fp(const uint8_t *fp) +lookup_cached_dir_by_fp(const char *fp) { cached_dir_t *d = NULL; - if (tor_digest_is_zero((const char *)fp) && cached_consensuses) { + if (tor_digest_is_zero(fp) && cached_consensuses) { d = strmap_get(cached_consensuses, "ns"); - } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses) { - /* this here interface is a nasty hack: we're shoving a flavor into - * a digest field. */ - d = strmap_get(cached_consensuses, (const char *)fp); + } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses && + (d = strmap_get(cached_consensuses, fp))) { + /* this here interface is a nasty hack XXXX024 */; } return d; } -/** Try to guess the number of bytes that will be needed to send the - * spooled objects for conn's outgoing spool. In the process, - * remove every element of the spool that refers to an absent object, or - * which was published earlier than cutoff. Set *size_out - * to the number of bytes, and *n_expired_out to the number of - * objects removed for being too old. */ -void -dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, - time_t cutoff, - int compression, - size_t *size_out, - int *n_expired_out) +/** Remove from fps every networkstatus key where both + * a) we have a networkstatus document and + * b) it is not newer than cutoff. + * + * Return 1 if any items were present at all; else return 0. + */ +int +dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff) { - if (BUG(!conn)) - return; - - smartlist_t *spool = conn->spool; - if (!spool) { - if (size_out) - *size_out = 0; - if (n_expired_out) - *n_expired_out = 0; - return; - } - int n_expired = 0; - uint64_t total = 0; - SMARTLIST_FOREACH_BEGIN(spool, spooled_resource_t *, spooled) { - time_t published = TIME_MAX; - size_t sz = spooled_resource_estimate_size(spooled, conn, - compression, &published); - if (published < cutoff) { - ++n_expired; - SMARTLIST_DEL_CURRENT(spool, spooled); - spooled_resource_free(spooled); - } else if (sz == 0) { - SMARTLIST_DEL_CURRENT(spool, spooled); - spooled_resource_free(spooled); - } else { - total += sz; + int found_any = 0; + SMARTLIST_FOREACH_BEGIN(fps, char *, digest) { + cached_dir_t *d = lookup_cached_dir_by_fp(digest); + if (!d) + continue; + found_any = 1; + if (d->published <= cutoff) { + tor_free(digest); + SMARTLIST_DEL_CURRENT(fps, digest); } - } SMARTLIST_FOREACH_END(spooled); - - if (size_out) { - *size_out = (total > SIZE_MAX) ? SIZE_MAX : (size_t)total; - } - if (n_expired_out) - *n_expired_out = n_expired; -} + } SMARTLIST_FOREACH_END(digest); -/** Helper: used to sort a connection's spool. */ -static int -dirserv_spool_sort_comparison_(const void **a_, const void **b_) -{ - const spooled_resource_t *a = *a_; - const spooled_resource_t *b = *b_; - return fast_memcmp(a->digest, b->digest, sizeof(a->digest)); -} - -/** Sort all the entries in conn by digest. */ -void -dirserv_spool_sort(dir_connection_t *conn) -{ - if (conn->spool == NULL) - return; - smartlist_sort(conn->spool, dirserv_spool_sort_comparison_); + return found_any; } /** Return the cache-info for identity fingerprint fp, or @@ -3864,16 +3407,18 @@ dirserv_spool_sort(dir_connection_t *conn) * NULL if not found or if the descriptor is older than * publish_cutoff. */ static const signed_descriptor_t * -get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo) +get_signed_descriptor_by_fp(const char *fp, int extrainfo, + time_t publish_cutoff) { - if (router_digest_is_me((const char *)fp)) { + if (router_digest_is_me(fp)) { if (extrainfo) return &(router_get_my_extrainfo()->cache_info); else return &(router_get_my_routerinfo()->cache_info); } else { - const routerinfo_t *ri = router_get_by_id_digest((const char *)fp); - if (ri) { + const routerinfo_t *ri = router_get_by_id_digest(fp); + if (ri && + ri->cache_info.published_on > publish_cutoff) { if (extrainfo) return extrainfo_get_by_descriptor_digest( ri->cache_info.extra_info_digest); @@ -3884,148 +3429,336 @@ get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo) return NULL; } +/** Return true iff we have any of the documents (extrainfo or routerdesc) + * specified by the fingerprints in fps and spool_src. Used to + * decide whether to send a 404. */ +int +dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src) +{ + time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; + SMARTLIST_FOREACH_BEGIN(fps, const char *, fp) { + switch (spool_src) + { + case DIR_SPOOL_EXTRA_BY_DIGEST: + if (extrainfo_get_by_descriptor_digest(fp)) return 1; + break; + case DIR_SPOOL_SERVER_BY_DIGEST: + if (router_get_by_descriptor_digest(fp)) return 1; + break; + case DIR_SPOOL_EXTRA_BY_FP: + case DIR_SPOOL_SERVER_BY_FP: + if (get_signed_descriptor_by_fp(fp, + spool_src == DIR_SPOOL_EXTRA_BY_FP, publish_cutoff)) + return 1; + break; + } + } SMARTLIST_FOREACH_END(fp); + return 0; +} + +/** Return true iff any of the 256-bit elements in fps is the digest of + * a microdescriptor we have. */ +int +dirserv_have_any_microdesc(const smartlist_t *fps) +{ + microdesc_cache_t *cache = get_microdesc_cache(); + SMARTLIST_FOREACH(fps, const char *, fp, + if (microdesc_cache_lookup_by_digest256(cache, fp)) + return 1); + return 0; +} + +/** Return an approximate estimate of the number of bytes that will + * be needed to transmit the server descriptors (if is_serverdescs -- + * they can be either d/ or fp/ queries) or networkstatus objects (if + * !is_serverdescs) listed in fps. If compressed is set, + * we guess how large the data will be after compression. + * + * The return value is an estimate; it might be larger or smaller. + **/ +size_t +dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, + int compressed) +{ + size_t result; + tor_assert(fps); + if (is_serverdescs) { + int n = smartlist_len(fps); + const routerinfo_t *me = router_get_my_routerinfo(); + result = (me?me->cache_info.signed_descriptor_len:2048) * n; + if (compressed) + result /= 2; /* observed compressibility is between 35 and 55%. */ + } else { + result = 0; + SMARTLIST_FOREACH(fps, const char *, digest, { + cached_dir_t *dir = lookup_cached_dir_by_fp(digest); + if (dir) + result += compressed ? dir->dir_z_len : dir->dir_len; + }); + } + return result; +} + +/** Given a list of microdescriptor hashes, guess how many bytes will be + * needed to transmit them, and return the guess. */ +size_t +dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed) +{ + size_t result = smartlist_len(fps) * microdesc_average_size(NULL); + if (compressed) + result /= 2; + return result; +} + /** When we're spooling data onto our outbuf, add more whenever we dip * below this threshold. */ #define DIRSERV_BUFFER_MIN 16384 -/** - * Called whenever we have flushed some directory data in state - * SERVER_WRITING, or whenever we want to fill the buffer with initial - * directory data (so that subsequent writes will occur, and trigger this - * function again.) - * - * Return 0 on success, and -1 on failure. +/** Spooling helper: called when we have no more data to spool to conn. + * Flushes any remaining data to be (un)compressed, and changes the spool + * source to NONE. Returns 0 on success, negative on failure. */ +static int +connection_dirserv_finish_spooling(dir_connection_t *conn) +{ + if (conn->zlib_state) { + connection_write_to_buf_zlib("", 0, conn, 1); + tor_zlib_free(conn->zlib_state); + conn->zlib_state = NULL; + } + conn->dir_spool_src = DIR_SPOOL_NONE; + return 0; +} + +/** Spooling helper: called when we're sending a bunch of server descriptors, + * and the outbuf has become too empty. Pulls some entries from + * fingerprint_stack, and writes the corresponding servers onto outbuf. If we + * run out of entries, flushes the zlib state and sets the spool source to + * NONE. Returns 0 on success, negative on failure. */ -int -connection_dirserv_flushed_some(dir_connection_t *conn) +static int +connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) { - tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING); - if (conn->spool == NULL) - return 0; + int by_fp = (conn->dir_spool_src == DIR_SPOOL_SERVER_BY_FP || + conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP); + int extra = (conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP || + conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_DIGEST); + time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; - while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN && - smartlist_len(conn->spool)) { - spooled_resource_t *spooled = - smartlist_get(conn->spool, smartlist_len(conn->spool)-1); - spooled_resource_flush_status_t status; - status = spooled_resource_flush_some(spooled, conn); - if (status == SRFS_ERR) { - return -1; - } else if (status == SRFS_MORE) { - return 0; + const or_options_t *options = get_options(); + + while (smartlist_len(conn->fingerprint_stack) && + connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { + const char *body; + char *fp = smartlist_pop_last(conn->fingerprint_stack); + const signed_descriptor_t *sd = NULL; + if (by_fp) { + sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff); + } else { + sd = extra ? extrainfo_get_by_descriptor_digest(fp) + : router_get_by_descriptor_digest(fp); + } + tor_free(fp); + if (!sd) + continue; + if (!connection_dir_is_encrypted(conn) && !sd->send_unencrypted) { + /* we did this check once before (so we could have an accurate size + * estimate and maybe send a 404 if somebody asked for only bridges on a + * connection), but we need to do it again in case a previously + * unknown bridge descriptor has shown up between then and now. */ + continue; } - tor_assert(status == SRFS_DONE); - /* If we're here, we're done flushing this resource. */ - tor_assert(smartlist_pop_last(conn->spool) == spooled); - spooled_resource_free(spooled); + /** If we are the bridge authority and the descriptor is a bridge + * descriptor, remember that we served this descriptor for desc stats. */ + if (options->BridgeAuthoritativeDir && by_fp) { + const routerinfo_t *router = + router_get_by_id_digest(sd->identity_digest); + /* router can be NULL here when the bridge auth is asked for its own + * descriptor. */ + if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) + rep_hist_note_desc_served(sd->identity_digest); + } + body = signed_descriptor_get_body(sd); + if (conn->zlib_state) { + /* XXXX024 This 'last' business should actually happen on the last + * routerinfo, not on the last fingerprint. */ + int last = ! smartlist_len(conn->fingerprint_stack); + connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn, + last); + if (last) { + tor_zlib_free(conn->zlib_state); + conn->zlib_state = NULL; + } + } else { + connection_write_to_buf(body, + sd->signed_descriptor_len, + TO_CONN(conn)); + } } - if (smartlist_len(conn->spool) > 0) { - /* We're still spooling something. */ - return 0; + if (!smartlist_len(conn->fingerprint_stack)) { + /* We just wrote the last one; finish up. */ + conn->dir_spool_src = DIR_SPOOL_NONE; + smartlist_free(conn->fingerprint_stack); + conn->fingerprint_stack = NULL; } + return 0; +} - /* If we get here, we're done. */ - smartlist_free(conn->spool); - conn->spool = NULL; - if (conn->compress_state) { - /* Flush the compression state: there could be more bytes pending in there, - * and we don't want to omit bytes. */ - connection_buf_add_compress("", 0, conn, 1); - tor_compress_free(conn->compress_state); - conn->compress_state = NULL; +/** Spooling helper: called when we're sending a bunch of microdescriptors, + * and the outbuf has become too empty. Pulls some entries from + * fingerprint_stack, and writes the corresponding microdescs onto outbuf. If + * we run out of entries, flushes the zlib state and sets the spool source to + * NONE. Returns 0 on success, negative on failure. + */ +static int +connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) +{ + microdesc_cache_t *cache = get_microdesc_cache(); + while (smartlist_len(conn->fingerprint_stack) && + connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { + char *fp256 = smartlist_pop_last(conn->fingerprint_stack); + microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); + tor_free(fp256); + if (!md || !md->body) + continue; + if (conn->zlib_state) { + /* XXXX024 This 'last' business should actually happen on the last + * routerinfo, not on the last fingerprint. */ + int last = !smartlist_len(conn->fingerprint_stack); + connection_write_to_buf_zlib(md->body, md->bodylen, conn, last); + if (last) { + tor_zlib_free(conn->zlib_state); + conn->zlib_state = NULL; + } + } else { + connection_write_to_buf(md->body, md->bodylen, TO_CONN(conn)); + } + } + if (!smartlist_len(conn->fingerprint_stack)) { + conn->dir_spool_src = DIR_SPOOL_NONE; + smartlist_free(conn->fingerprint_stack); + conn->fingerprint_stack = NULL; } return 0; } -/** Remove every element from conn's outgoing spool, and delete - * the spool. */ -void -dir_conn_clear_spool(dir_connection_t *conn) -{ - if (!conn || ! conn->spool) - return; - SMARTLIST_FOREACH(conn->spool, spooled_resource_t *, s, - spooled_resource_free(s)); - smartlist_free(conn->spool); - conn->spool = NULL; +/** Spooling helper: Called when we're sending a directory or networkstatus, + * and the outbuf has become too empty. Pulls some bytes from + * conn-\>cached_dir-\>dir_z, uncompresses them if appropriate, and + * puts them on the outbuf. If we run out of entries, flushes the zlib state + * and sets the spool source to NONE. Returns 0 on success, negative on + * failure. */ +static int +connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn) +{ + ssize_t bytes; + int64_t remaining; + + bytes = DIRSERV_BUFFER_MIN - connection_get_outbuf_len(TO_CONN(conn)); + tor_assert(bytes > 0); + tor_assert(conn->cached_dir); + if (bytes < 8192) + bytes = 8192; + remaining = conn->cached_dir->dir_z_len - conn->cached_dir_offset; + if (bytes > remaining) + bytes = (ssize_t) remaining; + + if (conn->zlib_state) { + connection_write_to_buf_zlib( + conn->cached_dir->dir_z + conn->cached_dir_offset, + bytes, conn, bytes == remaining); + } else { + connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset, + bytes, TO_CONN(conn)); + } + conn->cached_dir_offset += bytes; + if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) { + /* We just wrote the last one; finish up. */ + connection_dirserv_finish_spooling(conn); + cached_dir_decref(conn->cached_dir); + conn->cached_dir = NULL; + } + return 0; } -/** Return true iff line is a valid RecommendedPackages line. - */ -/* - The grammar is: - - "package" SP PACKAGENAME SP VERSION SP URL SP DIGESTS NL - - PACKAGENAME = NONSPACE - VERSION = NONSPACE - URL = NONSPACE - DIGESTS = DIGEST | DIGESTS SP DIGEST - DIGEST = DIGESTTYPE "=" DIGESTVAL - - NONSPACE = one or more non-space printing characters - - DIGESTVAL = DIGESTTYPE = one or more non-=, non-" " characters. - - SP = " " - NL = a newline +/** Spooling helper: Called when we're spooling networkstatus objects on + * conn, and the outbuf has become too empty. If the current + * networkstatus object (in conn-\>cached_dir) has more data, pull data + * from there. Otherwise, pop the next fingerprint from fingerprint_stack, + * and start spooling the next networkstatus. (A digest of all 0 bytes is + * treated as a request for the current consensus.) If we run out of entries, + * flushes the zlib state and sets the spool source to NONE. Returns 0 on + * success, negative on failure. */ +static int +connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn) +{ + + while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { + if (conn->cached_dir) { + int uncompressing = (conn->zlib_state != NULL); + int r = connection_dirserv_add_dir_bytes_to_outbuf(conn); + if (conn->dir_spool_src == DIR_SPOOL_NONE) { + /* add_dir_bytes thinks we're done with the cached_dir. But we + * may have more cached_dirs! */ + conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; + /* This bit is tricky. If we were uncompressing the last + * networkstatus, we may need to make a new zlib object to + * uncompress the next one. */ + if (uncompressing && ! conn->zlib_state && + conn->fingerprint_stack && + smartlist_len(conn->fingerprint_stack)) { + conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); + } + } + if (r) return r; + } else if (conn->fingerprint_stack && + smartlist_len(conn->fingerprint_stack)) { + /* Add another networkstatus; start serving it. */ + char *fp = smartlist_pop_last(conn->fingerprint_stack); + cached_dir_t *d = lookup_cached_dir_by_fp(fp); + tor_free(fp); + if (d) { + ++d->refcnt; + conn->cached_dir = d; + conn->cached_dir_offset = 0; + } + } else { + connection_dirserv_finish_spooling(conn); + smartlist_free(conn->fingerprint_stack); + conn->fingerprint_stack = NULL; + return 0; + } + } + return 0; +} - */ +/** Called whenever we have flushed some directory data in state + * SERVER_WRITING. */ int -validate_recommended_package_line(const char *line) -{ - const char *cp = line; - -#define WORD() \ - do { \ - if (*cp == ' ') \ - return 0; \ - cp = strchr(cp, ' '); \ - if (!cp) \ - return 0; \ - } while (0) - - WORD(); /* skip packagename */ - ++cp; - WORD(); /* skip version */ - ++cp; - WORD(); /* Skip URL */ - ++cp; - - /* Skip digesttype=digestval + */ - int n_entries = 0; - while (1) { - const char *start_of_word = cp; - const char *end_of_word = strchr(cp, ' '); - if (! end_of_word) - end_of_word = cp + strlen(cp); - - if (start_of_word == end_of_word) - return 0; +connection_dirserv_flushed_some(dir_connection_t *conn) +{ + tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING); - const char *eq = memchr(start_of_word, '=', end_of_word - start_of_word); + if (connection_get_outbuf_len(TO_CONN(conn)) >= DIRSERV_BUFFER_MIN) + return 0; - if (!eq) - return 0; - if (eq == start_of_word) - return 0; - if (eq == end_of_word - 1) - return 0; - if (memchr(eq+1, '=', end_of_word - (eq+1))) + switch (conn->dir_spool_src) { + case DIR_SPOOL_EXTRA_BY_DIGEST: + case DIR_SPOOL_EXTRA_BY_FP: + case DIR_SPOOL_SERVER_BY_DIGEST: + case DIR_SPOOL_SERVER_BY_FP: + return connection_dirserv_add_servers_to_outbuf(conn); + case DIR_SPOOL_MICRODESC: + return connection_dirserv_add_microdescs_to_outbuf(conn); + case DIR_SPOOL_CACHED_DIR: + return connection_dirserv_add_dir_bytes_to_outbuf(conn); + case DIR_SPOOL_NETWORKSTATUS: + return connection_dirserv_add_networkstatus_bytes_to_outbuf(conn); + case DIR_SPOOL_NONE: + default: return 0; - - ++n_entries; - if (0 == *end_of_word) - break; - - cp = end_of_word + 1; } - - /* If we reach this point, we have at least 1 entry. */ - tor_assert(n_entries > 0); - return 1; } /** Release all storage used by the directory server. */ @@ -4034,6 +3767,11 @@ dirserv_free_all(void) { dirserv_free_fingerprint_list(); + cached_dir_decref(the_directory); + clear_cached_dir(&the_runningrouters); + cached_dir_decref(cached_directory); + clear_cached_dir(&cached_runningrouters); + strmap_free(cached_consensuses, free_cached_dir_); cached_consensuses = NULL; diff --git a/src/tor/src/or/dirserv.h b/src/tor/dirserv.h similarity index 51% rename from src/tor/src/or/dirserv.h rename to src/tor/dirserv.h index 0fd7b7915..8591c4c18 100644 --- a/src/tor/src/or/dirserv.h +++ b/src/tor/dirserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,66 +32,12 @@ /** Maximum allowable length of a version line in a networkstatus. */ #define MAX_V_LINE_LEN 128 -/** Ways to convert a spoolable_resource_t to a bunch of bytes. */ -typedef enum dir_spool_source_t { - DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP, - DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, - DIR_SPOOL_MICRODESC, - DIR_SPOOL_NETWORKSTATUS, - DIR_SPOOL_CONSENSUS_CACHE_ENTRY, -} dir_spool_source_t; -#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t) - -/** Object to remember the identity of an object that we are spooling, - * or about to spool, in response to a directory request. - * - * (Why do we spool? Because some directory responses are very large, - * and we don't want to just shove the complete answer into the output - * buffer: that would take a ridiculous amount of RAM.) - * - * If the spooled resource is relatively small (like microdescriptors, - * descriptors, etc), we look them up by ID as needed, and add the whole - * thing onto the output buffer at once. If the spooled reseource is - * big (like networkstatus documents), we reference-count it, and add it - * a few K at a time. - */ -typedef struct spooled_resource_t { - /** - * If true, we add the entire object to the outbuf. If false, - * we spool the object a few K at a time. - */ - unsigned spool_eagerly : 1; - /** - * Tells us what kind of object to get, and how to look it up. - */ - dir_spool_source_bitfield_t spool_source : 7; - /** - * Tells us the specific object to spool. - */ - uint8_t digest[DIGEST256_LEN]; - /** - * A large object that we're spooling. Holds a reference count. Only - * used when spool_eagerly is false. - */ - struct cached_dir_t *cached_dir_ref; - /** - * A different kind of large object that we might be spooling. Also - * reference-counted. Also only used when spool_eagerly is false. - */ - struct consensus_cache_entry_t *consensus_cache_entry; - const uint8_t *cce_body; - size_t cce_len; - /** - * The current offset into cached_dir or cce_body. Only used when - * spool_eagerly is false */ - off_t cached_dir_offset; -} spooled_resource_t; - int connection_dirserv_flushed_some(dir_connection_t *conn); -int dirserv_add_own_fingerprint(crypto_pk_t *pk); +int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_t *pk); int dirserv_load_fingerprint_file(void); void dirserv_free_fingerprint_list(void); +const char *dirserv_get_nickname_by_digest(const char *digest); enum was_router_added_t dirserv_add_multiple_descriptors( const char *desc, uint8_t purpose, const char *source, @@ -102,8 +48,10 @@ enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri, void dirserv_set_router_is_running(routerinfo_t *router, time_t now); int list_server_status_v1(smartlist_t *routers, char **router_status_out, int for_controller); +int dirserv_dump_directory_to_string(char **dir_out, + crypto_pk_t *private_key); char *dirserv_get_flag_thresholds_line(void); -void dirserv_compute_bridge_flag_thresholds(void); +void dirserv_compute_bridge_flag_thresholds(routerlist_t *rl); int directory_fetches_from_authorities(const or_options_t *options); int directory_fetches_dir_info_early(const or_options_t *options); @@ -111,26 +59,29 @@ int directory_fetches_dir_info_later(const or_options_t *options); int directory_caches_unknown_auth_certs(const or_options_t *options); int directory_caches_dir_info(const or_options_t *options); int directory_permits_begindir_requests(const or_options_t *options); +int directory_permits_controller_requests(const or_options_t *options); int directory_too_idle_to_fetch_descriptors(const or_options_t *options, time_t now); +void directory_set_dirty(void); +cached_dir_t *dirserv_get_directory(void); +cached_dir_t *dirserv_get_runningrouters(void); cached_dir_t *dirserv_get_consensus(const char *flavor_name); void dirserv_set_cached_consensus_networkstatus(const char *consensus, - const char *flavor_name, - const common_digests_t *digests, - const uint8_t *sha3_as_signed, - time_t published); + const char *flavor_name, + const digests_t *digests, + time_t published); void dirserv_clear_old_networkstatuses(time_t cutoff); -int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key, - dir_spool_source_t source, - int conn_is_encrytped, - const char **msg_out); +void dirserv_clear_old_v1_info(time_t now); +int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, + const char **msg, + int for_unencrypted_conn, + int is_extrainfo); int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, const char **msg); void dirserv_orconn_tls_done(const tor_addr_t *addr, uint16_t or_port, - const char *digest_rcvd, - const ed25519_public_key_t *ed_id_rcvd); + const char *digest_rcvd); int dirserv_should_launch_reachability_test(const routerinfo_t *ri, const routerinfo_t *ri_old); void dirserv_single_reachability_test(time_t now, routerinfo_t *router); @@ -139,29 +90,28 @@ int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, int complain, int *valid_out); uint32_t dirserv_router_get_status(const routerinfo_t *router, - const char **msg, - int severity); + const char **msg); void dirserv_set_node_flags_from_authoritative_status(node_t *node, uint32_t authstatus); int dirserv_would_reject_router(const routerstatus_t *rs); +int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff); +int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src); +int dirserv_have_any_microdesc(const smartlist_t *fps); +size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, + int compressed); +size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed); + char *routerstatus_format_entry( - const routerstatus_t *rs, - const char *version, - const char *protocols, + const routerstatus_t *rs, const char *platform, routerstatus_format_type_t format, - int consensus_method, const vote_routerstatus_t *vrs); void dirserv_free_all(void); void cached_dir_decref(cached_dir_t *d); cached_dir_t *new_cached_dir(char *s, time_t published); -int validate_recommended_package_line(const char *line); - #ifdef DIRSERV_PRIVATE -STATIC void dirserv_set_routerstatus_testing(routerstatus_t *rs); - /* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */ #define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */ @@ -179,33 +129,10 @@ STATIC int dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_out, time_t *as_of_out); STATIC int dirserv_has_measured_bw(const char *node_id); - -STATIC int -dirserv_read_guardfraction_file_from_str(const char *guardfraction_file_str, - smartlist_t *vote_routerstatuses); -#endif /* defined(DIRSERV_PRIVATE) */ +#endif int dirserv_read_measured_bandwidths(const char *from_file, smartlist_t *routerstatuses); -int dirserv_read_guardfraction_file(const char *fname, - smartlist_t *vote_routerstatuses); - -spooled_resource_t *spooled_resource_new(dir_spool_source_t source, - const uint8_t *digest, - size_t digestlen); -spooled_resource_t *spooled_resource_new_from_cache_entry( - struct consensus_cache_entry_t *entry); -void spooled_resource_free_(spooled_resource_t *spooled); -#define spooled_resource_free(sp) \ - FREE_AND_NULL(spooled_resource_t, spooled_resource_free_, (sp)) -void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, - time_t cutoff, - int compression, - size_t *size_out, - int *n_expired_out); -void dirserv_spool_sort(dir_connection_t *conn); -void dir_conn_clear_spool(dir_connection_t *conn); - -#endif /* !defined(TOR_DIRSERV_H) */ +#endif diff --git a/src/tor/src/or/dirvote.c b/src/tor/dirvote.c similarity index 76% rename from src/tor/src/or/dirvote.c rename to src/tor/dirvote.c index a75d9e55a..4d3ee9cdb 100644 --- a/src/tor/src/or/dirvote.c +++ b/src/tor/dirvote.c @@ -1,64 +1,25 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRVOTE_PRIVATE #include "or.h" #include "config.h" -#include "dircollate.h" #include "directory.h" #include "dirserv.h" #include "dirvote.h" #include "microdesc.h" #include "networkstatus.h" #include "policies.h" -#include "protover.h" #include "rephist.h" #include "router.h" -#include "routerkeys.h" #include "routerlist.h" #include "routerparse.h" -#include "entrynodes.h" /* needed for guardfraction methods */ -#include "torcert.h" -#include "shared_random_state.h" /** * \file dirvote.c * \brief Functions to compute directory consensus, and schedule voting. - * - * This module is the center of the consensus-voting based directory - * authority system. With this system, a set of authorities first - * publish vote based on their opinions of the network, and then compute - * a consensus from those votes. Each authority signs the consensus, - * and clients trust the consensus if enough known authorities have - * signed it. - * - * The code in this module is only invoked on directory authorities. It's - * responsible for: - * - *
    - *
  • Generating this authority's vote networkstatus, based on the - * authority's view of the network as represented in dirserv.c - *
  • Formatting the vote networkstatus objects. - *
  • Generating the microdescriptors that correspond to our own - * vote. - *
  • Sending votes to all the other authorities. - *
  • Trying to fetch missing votes from other authorities. - *
  • Computing the consensus from a set of votes, as well as - * a "detached signature" object for other authorities to fetch. - *
  • Collecting other authorities' signatures on the same consensus, - * until there are enough. - *
  • Publishing the consensus to the reset of the directory system. - *
  • Scheduling all of the above operations. - *
- * - * The main entry points are in dirvote_act(), which handles scheduled - * actions; and dirvote_add_vote() and dirvote_add_signatures(), which - * handle uploaded and downloaded votes and signatures. - * - * (See dir-spec.txt from torspec.git for a complete specification of - * the directory protocol and voting algorithms.) **/ /** A consensus that we have built and are appending signatures to. Once it's @@ -90,63 +51,12 @@ static int dirvote_perform_vote(void); static void dirvote_clear_votes(int all_votes); static int dirvote_compute_consensuses(void); static int dirvote_publish_consensus(void); +static char *make_consensus_method_list(int low, int high, const char *sep); /* ===== * Voting * =====*/ -/* If opt_value is non-NULL, return "keyword opt_value\n" in a new - * string. Otherwise return a new empty string. */ -static char * -format_line_if_present(const char *keyword, const char *opt_value) -{ - if (opt_value) { - char *result = NULL; - tor_asprintf(&result, "%s %s\n", keyword, opt_value); - return result; - } else { - return tor_strdup(""); - } -} - -/** Format the recommended/required-relay-client protocols lines for a vote in - * a newly allocated string, and return that string. */ -static char * -format_protocols_lines_for_vote(const networkstatus_t *v3_ns) -{ - char *recommended_relay_protocols_line = NULL; - char *recommended_client_protocols_line = NULL; - char *required_relay_protocols_line = NULL; - char *required_client_protocols_line = NULL; - - recommended_relay_protocols_line = - format_line_if_present("recommended-relay-protocols", - v3_ns->recommended_relay_protocols); - recommended_client_protocols_line = - format_line_if_present("recommended-client-protocols", - v3_ns->recommended_client_protocols); - required_relay_protocols_line = - format_line_if_present("required-relay-protocols", - v3_ns->required_relay_protocols); - required_client_protocols_line = - format_line_if_present("required-client-protocols", - v3_ns->required_client_protocols); - - char *result = NULL; - tor_asprintf(&result, "%s%s%s%s", - recommended_relay_protocols_line, - recommended_client_protocols_line, - required_relay_protocols_line, - required_client_protocols_line); - - tor_free(recommended_relay_protocols_line); - tor_free(recommended_client_protocols_line); - tor_free(required_relay_protocols_line); - tor_free(required_client_protocols_line); - - return result; -} - /** Return a new string containing the string representation of the vote in * v3_ns, signed with our v3 signing key private_signing_key. * For v3 authorities. */ @@ -154,14 +64,12 @@ STATIC char * format_networkstatus_vote(crypto_pk_t *private_signing_key, networkstatus_t *v3_ns) { - smartlist_t *chunks = smartlist_new(); - char *packages = NULL; + smartlist_t *chunks; + const char *client_versions = NULL, *server_versions = NULL; char fingerprint[FINGERPRINT_LEN+1]; char digest[DIGEST_LEN]; uint32_t addr; - char *protocols_lines = NULL; char *client_versions_line = NULL, *server_versions_line = NULL; - char *shared_random_vote_str = NULL; networkstatus_voter_info_t *voter; char *status = NULL; @@ -174,29 +82,23 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, base16_encode(fingerprint, sizeof(fingerprint), v3_ns->cert->cache_info.identity_digest, DIGEST_LEN); + client_versions = v3_ns->client_versions; + server_versions = v3_ns->server_versions; - client_versions_line = format_line_if_present("client-versions", - v3_ns->client_versions); - server_versions_line = format_line_if_present("server-versions", - v3_ns->server_versions); - protocols_lines = format_protocols_lines_for_vote(v3_ns); - - if (v3_ns->package_lines) { - smartlist_t *tmp = smartlist_new(); - SMARTLIST_FOREACH(v3_ns->package_lines, const char *, p, - if (validate_recommended_package_line(p)) - smartlist_add_asprintf(tmp, "package %s\n", p)); - smartlist_sort_strings(tmp); - packages = smartlist_join_strings(tmp, "", 0, NULL); - SMARTLIST_FOREACH(tmp, char *, cp, tor_free(cp)); - smartlist_free(tmp); + if (client_versions) { + tor_asprintf(&client_versions_line, "client-versions %s\n", + client_versions); } else { - packages = tor_strdup(""); + client_versions_line = tor_strdup(""); + } + if (server_versions) { + tor_asprintf(&server_versions_line, "server-versions %s\n", + server_versions); + } else { + server_versions_line = tor_strdup(""); } - /* Get shared random commitments/reveals line(s). */ - shared_random_vote_str = sr_get_string_for_vote(); - + chunks = smartlist_new(); { char published[ISO_TIME_LEN+1]; char va[ISO_TIME_LEN+1]; @@ -208,8 +110,7 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, char *params; authority_cert_t *cert = v3_ns->cert; char *methods = - make_consensus_method_list(MIN_SUPPORTED_CONSENSUS_METHOD, - MAX_SUPPORTED_CONSENSUS_METHOD, " "); + make_consensus_method_list(1, MAX_SUPPORTED_CONSENSUS_METHOD, " "); format_iso_time(published, v3_ns->published); format_iso_time(va, v3_ns->valid_after); format_iso_time(fu, v3_ns->fresh_until); @@ -231,36 +132,28 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, "valid-until %s\n" "voting-delay %d %d\n" "%s%s" /* versions */ - "%s" /* protocols */ - "%s" /* packages */ "known-flags %s\n" "flag-thresholds %s\n" "params %s\n" "dir-source %s %s %s %s %d %d\n" - "contact %s\n" - "%s", /* shared randomness information */ + "contact %s\n", v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", methods, published, va, fu, vu, v3_ns->vote_seconds, v3_ns->dist_seconds, client_versions_line, server_versions_line, - protocols_lines, - packages, flags, flag_thresholds, params, voter->nickname, fingerprint, voter->address, fmt_addr32(addr), voter->dir_port, voter->or_port, - voter->contact, - shared_random_vote_str ? - shared_random_vote_str : ""); + voter->contact); tor_free(params); tor_free(flags); tor_free(flag_thresholds); tor_free(methods); - tor_free(shared_random_vote_str); if (!tor_digest_is_zero(voter->legacy_id_digest)) { char fpbuf[HEX_DIGEST_LEN+1]; @@ -277,19 +170,16 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, char *rsf; vote_microdesc_hash_t *h; rsf = routerstatus_format_entry(&vrs->status, - vrs->version, vrs->protocols, - NS_V3_VOTE, - ROUTERSTATUS_FORMAT_NO_CONSENSUS_METHOD, - vrs); + vrs->version, NS_V3_VOTE, vrs); if (rsf) smartlist_add(chunks, rsf); for (h = vrs->microdesc; h; h = h->next) { - smartlist_add_strdup(chunks, h->microdesc_hash_line); + smartlist_add(chunks, tor_strdup(h->microdesc_hash_line)); } } SMARTLIST_FOREACH_END(vrs); - smartlist_add_strdup(chunks, "directory-footer\n"); + smartlist_add(chunks, tor_strdup("directory-footer\n")); /* The digest includes everything up through the space after * directory-signature. (Yuck.) */ @@ -308,6 +198,7 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, signing_key_fingerprint); } + note_crypto_pk_op(SIGN_DIR); { char *sig = router_get_dirobj_signature(digest, DIGEST_LEN, private_signing_key); @@ -339,11 +230,10 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key, done: tor_free(client_versions_line); tor_free(server_versions_line); - tor_free(protocols_lines); - tor_free(packages); - - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); + if (chunks) { + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + } return status; } @@ -445,9 +335,6 @@ static int compare_vote_rs(const vote_routerstatus_t *a, const vote_routerstatus_t *b) { int r; - tor_assert(a); - tor_assert(b); - if ((r = fast_memcmp(a->status.identity_digest, b->status.identity_digest, DIGEST_LEN))) return r; @@ -455,30 +342,16 @@ compare_vote_rs(const vote_routerstatus_t *a, const vote_routerstatus_t *b) b->status.descriptor_digest, DIGEST_LEN))) return r; - /* If we actually reached this point, then the identities and - * the descriptor digests matched, so somebody is making SHA1 collisions. - */ -#define CMP_FIELD(utype, itype, field) do { \ - utype aval = (utype) (itype) a->status.field; \ - utype bval = (utype) (itype) b->status.field; \ - utype u = bval - aval; \ - itype r2 = (itype) u; \ - if (r2 < 0) { \ - return -1; \ - } else if (r2 > 0) { \ - return 1; \ - } \ - } while (0) - - CMP_FIELD(uint64_t, int64_t, published_on); - + if ((r = (int)(b->status.published_on - a->status.published_on))) + return r; if ((r = strcmp(b->status.nickname, a->status.nickname))) return r; - - CMP_FIELD(unsigned, int, addr); - CMP_FIELD(unsigned, int, or_port); - CMP_FIELD(unsigned, int, dir_port); - + if ((r = (((int)b->status.addr) - ((int)a->status.addr)))) + return r; + if ((r = (((int)b->status.or_port) - ((int)a->status.or_port)))) + return r; + if ((r = (((int)b->status.dir_port) - ((int)a->status.dir_port)))) + return r; return 0; } @@ -521,7 +394,7 @@ compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, /* compare_vote_rs_() sorts the items by identity digest (all the same), * then by SD digest. That way, if we have a tie that the published_on - * date cannot break, we use the descriptor with the smaller digest. + * date cannot tie, we use the descriptor with the smaller digest. */ smartlist_sort(votes, compare_vote_rs_); SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { @@ -543,8 +416,8 @@ compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, if (cur_n > most_n || (cur && cur_n == most_n && cur->status.published_on > most_published)) { most = cur; - // most_n = cur_n; // unused after this point. - // most_published = cur->status.published_on; // unused after this point. + most_n = cur_n; + most_published = cur->status.published_on; } tor_assert(most); @@ -559,7 +432,6 @@ compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, const tor_addr_port_t *most_alt_orport = NULL; SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { - tor_assert(rs); if (compare_vote_rs(most, rs) == 0 && !tor_addr_is_null(&rs->status.ipv6_addr) && rs->status.ipv6_orport) { @@ -582,9 +454,10 @@ compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, smartlist_free(alt_orports); } - if (microdesc_digest256_out) { + if (consensus_method >= MIN_METHOD_FOR_MICRODESC && + microdesc_digest256_out) { smartlist_t *digests = smartlist_new(); - const uint8_t *best_microdesc_digest; + const char *best_microdesc_digest; SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { char d[DIGEST256_LEN]; if (compare_vote_rs(rs, most)) @@ -664,20 +537,12 @@ compute_consensus_method(smartlist_t *votes) static int consensus_method_is_supported(int method) { - if (method == MIN_METHOD_FOR_ED25519_ID_IN_MD) { - /* This method was broken due to buggy code accidently left in - * dircollate.c; do not actually use it. - */ - return 0; - } - - return (method >= MIN_SUPPORTED_CONSENSUS_METHOD) && - (method <= MAX_SUPPORTED_CONSENSUS_METHOD); + return (method >= 1) && (method <= MAX_SUPPORTED_CONSENSUS_METHOD); } /** Return a newly allocated string holding the numbers between low and high * (inclusive) that are supported consensus methods. */ -STATIC char * +static char * make_consensus_method_list(int low, int high, const char *separator) { char *list; @@ -714,47 +579,15 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning) return result; } -/** Given a list of K=V values, return the int32_t value corresponding to - * KEYWORD=, or default_val if no such value exists, or if the value is - * corrupt. - */ -STATIC int32_t -dirvote_get_intermediate_param_value(const smartlist_t *param_list, - const char *keyword, - int32_t default_val) -{ - unsigned int n_found = 0; - int32_t value = default_val; - - SMARTLIST_FOREACH_BEGIN(param_list, const char *, k_v_pair) { - if (!strcmpstart(k_v_pair, keyword) && k_v_pair[strlen(keyword)] == '=') { - const char *integer_str = &k_v_pair[strlen(keyword)+1]; - int ok; - value = (int32_t) - tor_parse_long(integer_str, 10, INT32_MIN, INT32_MAX, &ok, NULL); - if (BUG(! ok)) - return default_val; - ++n_found; - } - } SMARTLIST_FOREACH_END(k_v_pair); - - if (n_found == 1) { - return value; - } else { - tor_assert_nonfatal(n_found == 0); - return default_val; - } -} - /** Minimum number of directory authorities voting for a parameter to * include it in the consensus, if consensus method 12 or later is to be * used. See proposal 178 for details. */ #define MIN_VOTES_FOR_PARAM 3 -/** Helper: given a list of valid networkstatus_t, return a new smartlist +/** Helper: given a list of valid networkstatus_t, return a new string * containing the contents of the consensus network parameter set. */ -STATIC smartlist_t * +STATIC char * dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) { int i; @@ -763,18 +596,18 @@ dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) int cur_param_len; const char *cur_param; const char *eq; + char *result; const int n_votes = smartlist_len(votes); smartlist_t *output; smartlist_t *param_list = smartlist_new(); - (void) method; /* We require that the parameter lists in the votes are well-formed: that is, that their keywords are unique and sorted, and that their values are between INT32_MIN and INT32_MAX inclusive. This should be guaranteed by the parsing code. */ - vals = tor_calloc(n_votes, sizeof(int)); + vals = tor_malloc(sizeof(int)*n_votes); SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { if (!v->net_params) @@ -784,7 +617,8 @@ dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) if (smartlist_len(param_list) == 0) { tor_free(vals); - return param_list; + smartlist_free(param_list); + return NULL; } smartlist_sort_strings(param_list); @@ -797,9 +631,6 @@ dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) output = smartlist_new(); SMARTLIST_FOREACH_BEGIN(param_list, const char *, param) { - /* resolve spurious clang shallow analysis null pointer errors */ - tor_assert(param); - const char *next_param; int ok=0; eq = strchr(param, '='); @@ -812,12 +643,12 @@ dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) next_param = NULL; else next_param = smartlist_get(param_list, param_sl_idx+1); - if (!next_param || strncmp(next_param, param, cur_param_len)) { /* We've reached the end of a series. */ /* Make sure enough authorities voted on this param, unless the * the consensus method we use is too old for that. */ - if (i > total_authorities/2 || + if (method < MIN_METHOD_FOR_MAJORITY_PARAMS || + i > total_authorities/2 || i >= MIN_VOTES_FOR_PARAM) { int32_t median = median_int32(vals, i); char *out_string = tor_malloc(64+cur_param_len); @@ -834,9 +665,12 @@ dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) } } SMARTLIST_FOREACH_END(param); + result = smartlist_join_strings(output, " ", 0, NULL); + SMARTLIST_FOREACH(output, char *, cp, tor_free(cp)); + smartlist_free(output); smartlist_free(param_list); tor_free(vals); - return output; + return result; } #define RANGE_CHECK(a,b,c,d,e,f,g,mx) \ @@ -930,7 +764,7 @@ networkstatus_check_weights(int64_t Wgg, int64_t Wgd, int64_t Wmg, * * It returns true if weights could be computed, false otherwise. */ -int +static int networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, int64_t M, int64_t E, int64_t D, int64_t T, int64_t weight_scale) @@ -951,7 +785,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, } /* - * Computed from cases in 3.8.3 of dir-spec.txt + * Computed from cases in 3.4.3 of dir-spec.txt * * 1. Neither are scarce * 2. Both Guard and Exit are scarce @@ -1012,7 +846,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, Wgd = weight_scale; } } else { // Subcase b: R+D >= S - casename = "Case 2b1 (Wgg=weight_scale, Wmd=Wgd)"; + casename = "Case 2b1 (Wgg=1, Wmd=Wgd)"; Wee = (weight_scale*(E - G + M))/E; Wed = (weight_scale*(D - 2*E + 4*G - 2*M))/(3*D); Wme = (weight_scale*(G-M))/E; @@ -1025,7 +859,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, weight_scale, G, M, E, D, T, 10, 1); if (berr) { - casename = "Case 2b2 (Wgg=weight_scale, Wee=weight_scale)"; + casename = "Case 2b2 (Wgg=1, Wee=1)"; Wgg = weight_scale; Wee = weight_scale; Wed = (weight_scale*(D - 2*E + G + M))/(3*D); @@ -1094,7 +928,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, } else { // Subcase b: S+D >= T/3 // D != 0 because S+D >= T/3 if (G < E) { - casename = "Case 3bg (G scarce, Wgg=weight_scale, Wmd == Wed)"; + casename = "Case 3bg (G scarce, Wgg=1, Wmd == Wed)"; Wgg = weight_scale; Wgd = (weight_scale*(D - 2*G + E + M))/(3*D); Wmg = 0; @@ -1106,7 +940,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, weight_scale, G, M, E, D, T, 10, 1); } else { // G >= E - casename = "Case 3be (E scarce, Wee=weight_scale, Wmd == Wgd)"; + casename = "Case 3be (E scarce, Wee=1, Wmd == Wgd)"; Wee = weight_scale; Wed = (weight_scale*(D - 2*E + G + M))/(3*D); Wme = 0; @@ -1140,7 +974,7 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, tor_assert(0 < weight_scale && weight_scale <= INT32_MAX); /* - * Provide Wgm=Wgg, Wmm=weight_scale, Wem=Wee, Weg=Wed. May later determine + * Provide Wgm=Wgg, Wmm=1, Wem=Wee, Weg=Wed. May later determine * that middle nodes need different bandwidth weights for dirport traffic, * or that weird exit policies need special weight, or that bridges * need special weight. @@ -1167,174 +1001,309 @@ networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); return 1; } - -/** Update total bandwidth weights (G/M/E/D/T) with the bandwidth of - * the router in rs. */ +/** + * This function computes the bandwidth weights for consensus method 9. + * + * It has been obsoleted in favor of consensus method 10. + */ static void -update_total_bandwidth_weights(const routerstatus_t *rs, - int is_exit, int is_guard, - int64_t *G, int64_t *M, int64_t *E, int64_t *D, - int64_t *T) +networkstatus_compute_bw_weights_v9(smartlist_t *chunks, int64_t G, int64_t M, + int64_t E, int64_t D, int64_t T, + int64_t weight_scale) { - int default_bandwidth = rs->bandwidth_kb; - int guardfraction_bandwidth = 0; + int64_t Wgg = -1, Wgd = -1; + int64_t Wmg = -1, Wme = -1, Wmd = -1; + int64_t Wed = -1, Wee = -1; + const char *casename; - if (!rs->has_bandwidth) { - log_info(LD_BUG, "Missing consensus bandwidth for router %s", - rs->nickname); + if (G <= 0 || M <= 0 || E <= 0 || D <= 0) { + log_warn(LD_DIR, "Consensus with empty bandwidth: " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); return; } - /* If this routerstatus represents a guard that we have - * guardfraction information on, use it to calculate its actual - * bandwidth. From proposal236: - * - * Similarly, when calculating the bandwidth-weights line as in - * section 3.8.3 of dir-spec.txt, directory authorities should treat N - * as if fraction F of its bandwidth has the guard flag and (1-F) does - * not. So when computing the totals G,M,E,D, each relay N with guard - * visibility fraction F and bandwidth B should be added as follows: - * - * G' = G + F*B, if N does not have the exit flag - * M' = M + (1-F)*B, if N does not have the exit flag - * - * or - * - * D' = D + F*B, if N has the exit flag - * E' = E + (1-F)*B, if N has the exit flag + /* + * Computed from cases in 3.4.3 of dir-spec.txt * - * In this block of code, we prepare the bandwidth values by setting - * the default_bandwidth to F*B and guardfraction_bandwidth to (1-F)*B. + * 1. Neither are scarce + * 2. Both Guard and Exit are scarce + * a. R+D <= S + * b. R+D > S + * 3. One of Guard or Exit is scarce + * a. S+D < T/3 + * b. S+D >= T/3 */ - if (rs->has_guardfraction) { - guardfraction_bandwidth_t guardfraction_bw; - - tor_assert(is_guard); + if (3*E >= T && 3*G >= T) { // E >= T/3 && G >= T/3 + bw_weights_error_t berr = 0; + /* Case 1: Neither are scarce. + * + * Attempt to ensure that we have a large amount of exit bandwidth + * in the middle position. + */ + casename = "Case 1 (Wme*E = Wmd*D)"; + Wgg = (weight_scale*(D+E+G+M))/(3*G); + if (D==0) Wmd = 0; + else Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D); + Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E); + Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E); + Wgd = 0; + Wmg = weight_scale - Wgg; + Wed = weight_scale - Wmd; - guard_get_guardfraction_bandwidth(&guardfraction_bw, - rs->bandwidth_kb, - rs->guardfraction_percentage); + berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, + weight_scale, G, M, E, D, T, 10, 1); - default_bandwidth = guardfraction_bw.guard_bw; - guardfraction_bandwidth = guardfraction_bw.non_guard_bw; - } + if (berr) { + log_warn(LD_DIR, "Bw Weights error %d for case %s. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT, + berr, casename, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + } + } else if (3*E < T && 3*G < T) { // E < T/3 && G < T/3 + int64_t R = MIN(E, G); + int64_t S = MAX(E, G); + /* + * Case 2: Both Guards and Exits are scarce + * Balance D between E and G, depending upon + * D capacity and scarcity. + */ + if (R+D < S) { // Subcase a + Wgg = weight_scale; + Wee = weight_scale; + Wmg = 0; + Wme = 0; + Wmd = 0; + if (E < G) { + casename = "Case 2a (E scarce)"; + Wed = weight_scale; + Wgd = 0; + } else { /* E >= G */ + casename = "Case 2a (G scarce)"; + Wed = 0; + Wgd = weight_scale; + } + } else { // Subcase b: R+D > S + bw_weights_error_t berr = 0; + casename = "Case 2b (Wme*E == Wmd*D)"; + if (D != 0) { + Wgg = weight_scale; + Wgd = (weight_scale*(D + E - 2*G + M))/(3*D); // T/3 >= G (Ok) + Wmd = (weight_scale*(D + E + G - 2*M))/(6*D); // T/3 >= M + Wme = (weight_scale*(D + E + G - 2*M))/(6*E); + Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E); // 2E+M >= T/3 + Wmg = 0; + Wed = weight_scale - Wgd - Wmd; - /* Now calculate the total bandwidth weights with or without - * guardfraction. Depending on the flags of the relay, add its - * bandwidth to the appropriate weight pool. If it's a guard and - * guardfraction is enabled, add its bandwidth to both pools as - * indicated by the previous comment. - */ - *T += default_bandwidth; - if (is_exit && is_guard) { + berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, + weight_scale, G, M, E, D, T, 10, 1); + } - *D += default_bandwidth; - if (rs->has_guardfraction) { - *E += guardfraction_bandwidth; + if (D == 0 || berr) { // Can happen if M > T/3 + casename = "Case 2b (E=G)"; + Wgg = weight_scale; + Wee = weight_scale; + Wmg = 0; + Wme = 0; + Wmd = 0; + if (D == 0) Wgd = 0; + else Wgd = (weight_scale*(D+E-G))/(2*D); + Wed = weight_scale - Wgd; + berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, + Wed, weight_scale, G, M, E, D, T, 10, 1); + } + if (berr != BW_WEIGHTS_NO_ERROR && + berr != BW_WEIGHTS_BALANCE_MID_ERROR) { + log_warn(LD_DIR, "Bw Weights error %d for case %s. " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT + " D="I64_FORMAT" T="I64_FORMAT, + berr, casename, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + } + } + } else { // if (E < T/3 || G < T/3) { + int64_t S = MIN(E, G); + // Case 3: Exactly one of Guard or Exit is scarce + if (!(3*E < T || 3*G < T) || !(3*G >= T || 3*E >= T)) { + log_warn(LD_BUG, + "Bw-Weights Case 3 but with G="I64_FORMAT" M=" + I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); } - } else if (is_exit) { - - *E += default_bandwidth; + if (3*(S+D) < T) { // Subcase a: S+D < T/3 + if (G < E) { + casename = "Case 3a (G scarce)"; + Wgg = Wgd = weight_scale; + Wmd = Wed = Wmg = 0; + // Minor subcase, if E is more scarce than M, + // keep its bandwidth in place. + if (E < M) Wme = 0; + else Wme = (weight_scale*(E-M))/(2*E); + Wee = weight_scale-Wme; + } else { // G >= E + casename = "Case 3a (E scarce)"; + Wee = Wed = weight_scale; + Wmd = Wgd = Wme = 0; + // Minor subcase, if G is more scarce than M, + // keep its bandwidth in place. + if (G < M) Wmg = 0; + else Wmg = (weight_scale*(G-M))/(2*G); + Wgg = weight_scale-Wmg; + } + } else { // Subcase b: S+D >= T/3 + bw_weights_error_t berr = 0; + // D != 0 because S+D >= T/3 + if (G < E) { + casename = "Case 3b (G scarce, Wme*E == Wmd*D)"; + Wgd = (weight_scale*(D + E - 2*G + M))/(3*D); + Wmd = (weight_scale*(D + E + G - 2*M))/(6*D); + Wme = (weight_scale*(D + E + G - 2*M))/(6*E); + Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E); + Wgg = weight_scale; + Wmg = 0; + Wed = weight_scale - Wgd - Wmd; - } else if (is_guard) { + berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, + Wed, weight_scale, G, M, E, D, T, 10, 1); + } else { // G >= E + casename = "Case 3b (E scarce, Wme*E == Wmd*D)"; + Wgg = (weight_scale*(D + E + G + M))/(3*G); + Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D); + Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E); + Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E); + Wgd = 0; + Wmg = weight_scale - Wgg; + Wed = weight_scale - Wmd; - *G += default_bandwidth; - if (rs->has_guardfraction) { - *M += guardfraction_bandwidth; + berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, + Wed, weight_scale, G, M, E, D, T, 10, 1); + } + if (berr) { + log_warn(LD_DIR, "Bw Weights error %d for case %s. " + "G="I64_FORMAT" M="I64_FORMAT + " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT, + berr, casename, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + } } + } - } else { + /* We cast down the weights to 32 bit ints on the assumption that + * weight_scale is ~= 10000. We need to ensure a rogue authority + * doesn't break this assumption to rig our weights */ + tor_assert(0 < weight_scale && weight_scale <= INT32_MAX); - *M += default_bandwidth; - } -} + if (Wgg < 0 || Wgg > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wgg="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wgg), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); -/** Considering the different recommended/required protocols sets as a - * 4-element array, return the element from vote for that protocol - * set. - */ -static const char * -get_nth_protocol_set_vote(int n, const networkstatus_t *vote) -{ - switch (n) { - case 0: return vote->recommended_client_protocols; - case 1: return vote->recommended_relay_protocols; - case 2: return vote->required_client_protocols; - case 3: return vote->required_relay_protocols; - default: - tor_assert_unreached(); - return NULL; + Wgg = MAX(MIN(Wgg, weight_scale), 0); } -} - -/** Considering the different recommended/required protocols sets as a - * 4-element array, return a newly allocated string for the consensus value - * for the n'th set. - */ -static char * -compute_nth_protocol_set(int n, int n_voters, const smartlist_t *votes) -{ - const char *keyword; - smartlist_t *proto_votes = smartlist_new(); - int threshold; - switch (n) { - case 0: - keyword = "recommended-client-protocols"; - threshold = CEIL_DIV(n_voters, 2); - break; - case 1: - keyword = "recommended-relay-protocols"; - threshold = CEIL_DIV(n_voters, 2); - break; - case 2: - keyword = "required-client-protocols"; - threshold = CEIL_DIV(n_voters * 2, 3); - break; - case 3: - keyword = "required-relay-protocols"; - threshold = CEIL_DIV(n_voters * 2, 3); - break; - default: - tor_assert_unreached(); - return NULL; + if (Wgd < 0 || Wgd > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wgd="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wgd), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wgd = MAX(MIN(Wgd, weight_scale), 0); + } + if (Wmg < 0 || Wmg > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wmg="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wmg), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wmg = MAX(MIN(Wmg, weight_scale), 0); + } + if (Wme < 0 || Wme > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wme="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wme), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wme = MAX(MIN(Wme, weight_scale), 0); + } + if (Wmd < 0 || Wmd > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wmd="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wmd), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wmd = MAX(MIN(Wmd, weight_scale), 0); + } + if (Wee < 0 || Wee > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wee="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wee), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wee = MAX(MIN(Wee, weight_scale), 0); + } + if (Wed < 0 || Wed > weight_scale) { + log_warn(LD_DIR, "Bw %s: Wed="I64_FORMAT"! G="I64_FORMAT + " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, I64_PRINTF_ARG(Wed), + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); + Wed = MAX(MIN(Wed, weight_scale), 0); } - SMARTLIST_FOREACH_BEGIN(votes, const networkstatus_t *, ns) { - const char *v = get_nth_protocol_set_vote(n, ns); - if (v) - smartlist_add(proto_votes, (void*)v); - } SMARTLIST_FOREACH_END(ns); - - char *protocols = protover_compute_vote(proto_votes, threshold); - smartlist_free(proto_votes); - - char *result = NULL; - tor_asprintf(&result, "%s %s\n", keyword, protocols); - tor_free(protocols); + // Add consensus weight keywords + smartlist_add(chunks, tor_strdup("bandwidth-weights ")); + /* + * Provide Wgm=Wgg, Wmm=1, Wem=Wee, Weg=Wed. May later determine + * that middle nodes need different bandwidth weights for dirport traffic, + * or that weird exit policies need special weight, or that bridges + * need special weight. + * + * NOTE: This list is sorted. + */ + smartlist_add_asprintf(chunks, + "Wbd=%d Wbe=%d Wbg=%d Wbm=%d " + "Wdb=%d " + "Web=%d Wed=%d Wee=%d Weg=%d Wem=%d " + "Wgb=%d Wgd=%d Wgg=%d Wgm=%d " + "Wmb=%d Wmd=%d Wme=%d Wmg=%d Wmm=%d\n", + (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale, + (int)weight_scale, + (int)weight_scale, (int)Wed, (int)Wee, (int)Wed, (int)Wee, + (int)weight_scale, (int)Wgd, (int)Wgg, (int)Wgg, + (int)weight_scale, (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale); - return result; + log_notice(LD_CIRC, "Computed bandwidth weights for %s with v9: " + "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT + " T="I64_FORMAT, + casename, + I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), + I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); } /** Given a list of vote networkstatus_t in votes, our public * authority identity_key, our private authority signing_key, * and the number of total_authorities that we believe exist in our - * voting quorum, generate the text of a new v3 consensus or microdescriptor - * consensus (depending on flavor), and return the value in a newly - * allocated string. + * voting quorum, generate the text of a new v3 consensus vote, and return the + * value in a newly allocated string. * * Note: this function DOES NOT check whether the votes are from - * recognized authorities. (dirvote_add_vote does that.) - * - * WATCH OUT: You need to think before you change the - * behavior of this function, or of the functions it calls! If some - * authorities compute the consensus with a different algorithm than - * others, they will not reach the same result, and they will not all - * sign the same thing! If you really need to change the algorithm - * here, you should allocate a new "consensus_method" for the new - * behavior, and make the new behavior conditional on a new-enough - * consensus_method. - **/ + * recognized authorities. (dirvote_add_vote does that.) */ char * networkstatus_compute_consensus(smartlist_t *votes, int total_authorities, @@ -1353,18 +1322,13 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_t *flags; const char *flavor_name; uint32_t max_unmeasured_bw_kb = DEFAULT_MAX_UNMEASURED_BW_KB; - int64_t G, M, E, D, T; /* For bandwidth weights */ + int64_t G=0, M=0, E=0, D=0, T=0; /* For bandwidth weights */ const routerstatus_format_type_t rs_format = flavor == FLAV_NS ? NS_V3_CONSENSUS : NS_V3_CONSENSUS_MICRODESC; char *params = NULL; - char *packages = NULL; int added_weights = 0; - dircollator_t *collator = NULL; - smartlist_t *param_list = NULL; - tor_assert(flavor == FLAV_NS || flavor == FLAV_MICRODESC); tor_assert(total_authorities >= smartlist_len(votes)); - tor_assert(total_authorities > 0); flavor_name = networkstatus_get_flavor_name(flavor); @@ -1382,28 +1346,18 @@ networkstatus_compute_consensus(smartlist_t *votes, log_warn(LD_DIR, "The other authorities will use consensus method %d, " "which I don't support. Maybe I should upgrade!", consensus_method); - consensus_method = MAX_SUPPORTED_CONSENSUS_METHOD; - } - - if (consensus_method >= MIN_METHOD_FOR_INIT_BW_WEIGHTS_ONE) { - /* It's smarter to initialize these weights to 1, so that later on, - * we can't accidentally divide by zero. */ - G = M = E = D = 1; - T = 4; - } else { - /* ...but originally, they were set to zero. */ - G = M = E = D = T = 0; + consensus_method = 1; } /* Compute medians of time-related things, and figure out how many * routers we might need to talk about. */ { int n_votes = smartlist_len(votes); - time_t *va_times = tor_calloc(n_votes, sizeof(time_t)); - time_t *fu_times = tor_calloc(n_votes, sizeof(time_t)); - time_t *vu_times = tor_calloc(n_votes, sizeof(time_t)); - int *votesec_list = tor_calloc(n_votes, sizeof(int)); - int *distsec_list = tor_calloc(n_votes, sizeof(int)); + time_t *va_times = tor_malloc(n_votes * sizeof(time_t)); + time_t *fu_times = tor_malloc(n_votes * sizeof(time_t)); + time_t *vu_times = tor_malloc(n_votes * sizeof(time_t)); + int *votesec_list = tor_malloc(n_votes * sizeof(int)); + int *distsec_list = tor_malloc(n_votes * sizeof(int)); int n_versioning_clients = 0, n_versioning_servers = 0; smartlist_t *combined_client_versions = smartlist_new(); smartlist_t *combined_server_versions = smartlist_new(); @@ -1434,7 +1388,7 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_free(sv); /* elements get freed later. */ } SMARTLIST_FOREACH(v->known_flags, const char *, cp, - smartlist_add_strdup(flags, cp)); + smartlist_add(flags, tor_strdup(cp))); } SMARTLIST_FOREACH_END(v); valid_after = median_time(va_times, n_votes); fresh_until = median_time(fu_times, n_votes); @@ -1442,12 +1396,8 @@ networkstatus_compute_consensus(smartlist_t *votes, vote_seconds = median_int(votesec_list, n_votes); dist_seconds = median_int(distsec_list, n_votes); - tor_assert(valid_after + - (get_options()->TestingTorNetwork ? - MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= fresh_until); - tor_assert(fresh_until + - (get_options()->TestingTorNetwork ? - MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= valid_until); + tor_assert(valid_after+MIN_VOTE_INTERVAL <= fresh_until); + tor_assert(fresh_until+MIN_VOTE_INTERVAL <= valid_until); tor_assert(vote_seconds >= MIN_VOTE_SECONDS); tor_assert(dist_seconds >= MIN_DIST_SECONDS); @@ -1455,20 +1405,12 @@ networkstatus_compute_consensus(smartlist_t *votes, n_versioning_servers); client_versions = compute_consensus_versions_list(combined_client_versions, n_versioning_clients); - if (consensus_method >= MIN_METHOD_FOR_PACKAGE_LINES) { - packages = compute_consensus_package_lines(votes); - } else { - packages = tor_strdup(""); - } SMARTLIST_FOREACH(combined_server_versions, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(combined_client_versions, char *, cp, tor_free(cp)); smartlist_free(combined_server_versions); smartlist_free(combined_client_versions); - if (consensus_method >= MIN_METHOD_FOR_ED25519_ID_VOTING) - smartlist_add_strdup(flags, "NoEdConsensus"); - smartlist_sort_strings(flags); smartlist_uniq_strings(flags); @@ -1495,8 +1437,10 @@ networkstatus_compute_consensus(smartlist_t *votes, flavor == FLAV_NS ? "" : " ", flavor == FLAV_NS ? "" : flavor_name); - smartlist_add_asprintf(chunks, "consensus-method %d\n", - consensus_method); + if (consensus_method >= 2) { + smartlist_add_asprintf(chunks, "consensus-method %d\n", + consensus_method); + } smartlist_add_asprintf(chunks, "valid-after %s\n" @@ -1505,50 +1449,21 @@ networkstatus_compute_consensus(smartlist_t *votes, "voting-delay %d %d\n" "client-versions %s\n" "server-versions %s\n" - "%s" /* packages */ "known-flags %s\n", va_buf, fu_buf, vu_buf, vote_seconds, dist_seconds, - client_versions, server_versions, - packages, - flaglist); + client_versions, server_versions, flaglist); tor_free(flaglist); } - if (consensus_method >= MIN_METHOD_FOR_RECOMMENDED_PROTOCOLS) { - int num_dirauth = get_n_authorities(V3_DIRINFO); - int idx; - for (idx = 0; idx < 4; ++idx) { - char *proto_line = compute_nth_protocol_set(idx, num_dirauth, votes); - if (BUG(!proto_line)) - continue; - smartlist_add(chunks, proto_line); - } - } - - param_list = dirvote_compute_params(votes, consensus_method, - total_authorities); - if (smartlist_len(param_list)) { - params = smartlist_join_strings(param_list, " ", 0, NULL); - smartlist_add_strdup(chunks, "params "); - smartlist_add(chunks, params); - smartlist_add_strdup(chunks, "\n"); - } - - if (consensus_method >= MIN_METHOD_FOR_SHARED_RANDOM) { - int num_dirauth = get_n_authorities(V3_DIRINFO); - /* Default value of this is 2/3 of the total number of authorities. For - * instance, if we have 9 dirauth, the default value is 6. The following - * calculation will round it down. */ - int32_t num_srv_agreements = - dirvote_get_intermediate_param_value(param_list, - "AuthDirNumSRVAgreements", - (num_dirauth * 2) / 3); - /* Add the shared random value. */ - char *srv_lines = sr_get_string_for_consensus(votes, num_srv_agreements); - if (srv_lines != NULL) { - smartlist_add(chunks, srv_lines); + if (consensus_method >= MIN_METHOD_FOR_PARAMS) { + params = dirvote_compute_params(votes, consensus_method, + total_authorities); + if (params) { + smartlist_add(chunks, tor_strdup("params ")); + smartlist_add(chunks, params); + smartlist_add(chunks, tor_strdup("\n")); } } @@ -1563,7 +1478,8 @@ networkstatus_compute_consensus(smartlist_t *votes, e->digest = get_voter(v)->identity_digest; e->is_legacy = 0; smartlist_add(dir_sources, e); - if (!tor_digest_is_zero(get_voter(v)->legacy_id_digest)) { + if (consensus_method >= 3 && + !tor_digest_is_zero(get_voter(v)->legacy_id_digest)) { dir_src_ent_t *e_legacy = tor_malloc_zero(sizeof(dir_src_ent_t)); e_legacy->v = v; e_legacy->digest = get_voter(v)->legacy_id_digest; @@ -1579,6 +1495,9 @@ networkstatus_compute_consensus(smartlist_t *votes, networkstatus_t *v = e->v; networkstatus_voter_info_t *voter = get_voter(v); + if (e->is_legacy) + tor_assert(consensus_method >= 2); + base16_encode(fingerprint, sizeof(fingerprint), e->digest, DIGEST_LEN); base16_encode(votedigest, sizeof(votedigest), voter->vote_digest, DIGEST_LEN); @@ -1603,7 +1522,7 @@ networkstatus_compute_consensus(smartlist_t *votes, if (consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW) { char *max_unmeasured_param = NULL; - /* XXXX Extract this code into a common function. Or don't! see #19011 */ + /* XXXX Extract this code into a common function */ if (params) { if (strcmpstart(params, "maxunmeasuredbw=") == 0) max_unmeasured_param = params; @@ -1627,6 +1546,7 @@ networkstatus_compute_consensus(smartlist_t *votes, /* Add the actual router entries. */ { + int *index; /* index[j] is the current index into votes[j]. */ int *size; /* size[j] is the number of routerstatuses in votes[j]. */ int *flag_counts; /* The number of voters that list flag[j] for the * currently considered router. */ @@ -1634,17 +1554,13 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_t *matching_descs = smartlist_new(); smartlist_t *chosen_flags = smartlist_new(); smartlist_t *versions = smartlist_new(); - smartlist_t *protocols = smartlist_new(); smartlist_t *exitsummaries = smartlist_new(); - uint32_t *bandwidths_kb = tor_calloc(smartlist_len(votes), - sizeof(uint32_t)); - uint32_t *measured_bws_kb = tor_calloc(smartlist_len(votes), - sizeof(uint32_t)); - uint32_t *measured_guardfraction = tor_calloc(smartlist_len(votes), - sizeof(uint32_t)); + uint32_t *bandwidths_kb = tor_malloc(sizeof(uint32_t) * + smartlist_len(votes)); + uint32_t *measured_bws_kb = tor_malloc(sizeof(uint32_t) * + smartlist_len(votes)); int num_bandwidths; int num_mbws; - int num_guardfraction_inputs; int *n_voter_flags; /* n_voter_flags[j] is the number of flags that * votes[j] knows about. */ @@ -1654,6 +1570,7 @@ networkstatus_compute_consensus(smartlist_t *votes, * is the same flag as votes[j]->known_flags[b]. */ int *named_flag; /* Index of the flag "Named" for votes[j] */ int *unnamed_flag; /* Index of the flag "Unnamed" for votes[j] */ + int chosen_named_idx; int n_authorities_measuring_bandwidth; strmap_t *name_to_id_map = strmap_new(); @@ -1662,14 +1579,16 @@ networkstatus_compute_consensus(smartlist_t *votes, memset(conflict, 0, sizeof(conflict)); memset(unknown, 0xff, sizeof(conflict)); - size = tor_calloc(smartlist_len(votes), sizeof(int)); - n_voter_flags = tor_calloc(smartlist_len(votes), sizeof(int)); - n_flag_voters = tor_calloc(smartlist_len(flags), sizeof(int)); - flag_map = tor_calloc(smartlist_len(votes), sizeof(int *)); - named_flag = tor_calloc(smartlist_len(votes), sizeof(int)); - unnamed_flag = tor_calloc(smartlist_len(votes), sizeof(int)); + index = tor_malloc_zero(sizeof(int)*smartlist_len(votes)); + size = tor_malloc_zero(sizeof(int)*smartlist_len(votes)); + n_voter_flags = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); + n_flag_voters = tor_malloc_zero(sizeof(int) * smartlist_len(flags)); + flag_map = tor_malloc_zero(sizeof(int*) * smartlist_len(votes)); + named_flag = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); + unnamed_flag = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); for (i = 0; i < smartlist_len(votes); ++i) unnamed_flag[i] = named_flag[i] = -1; + chosen_named_idx = smartlist_string_pos(flags, "Named"); /* Build the flag indexes. Note that no vote can have more than 64 members * for known_flags, so no value will be greater than 63, so it's safe to @@ -1678,8 +1597,8 @@ networkstatus_compute_consensus(smartlist_t *votes, * that they're actually set before doing U64_LITERAL(1) << index with * them.*/ SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - flag_map[v_sl_idx] = tor_calloc(smartlist_len(v->known_flags), - sizeof(int)); + flag_map[v_sl_idx] = tor_malloc_zero( + sizeof(int)*smartlist_len(v->known_flags)); if (smartlist_len(v->known_flags) > MAX_KNOWN_FLAGS_IN_VOTE) { log_warn(LD_BUG, "Somehow, a vote has %d entries in known_flags", smartlist_len(v->known_flags)); @@ -1699,7 +1618,7 @@ networkstatus_compute_consensus(smartlist_t *votes, } SMARTLIST_FOREACH_END(v); /* Named and Unnamed get treated specially */ - { + if (consensus_method >= 2) { SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { uint64_t nf; if (named_flag[v_sl_idx]<0) @@ -1752,78 +1671,73 @@ networkstatus_compute_consensus(smartlist_t *votes, /* We need to know how many votes measure bandwidth. */ n_authorities_measuring_bandwidth = 0; - SMARTLIST_FOREACH(votes, const networkstatus_t *, v, + SMARTLIST_FOREACH(votes, networkstatus_t *, v, if (v->has_measured_bws) { ++n_authorities_measuring_bandwidth; } ); - /* Populate the collator */ - collator = dircollator_new(smartlist_len(votes), total_authorities); - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - dircollator_add_vote(collator, v); - } SMARTLIST_FOREACH_END(v); - - dircollator_collate(collator, consensus_method); - /* Now go through all the votes */ - flag_counts = tor_calloc(smartlist_len(flags), sizeof(int)); - const int num_routers = dircollator_n_routers(collator); - for (i = 0; i < num_routers; ++i) { - vote_routerstatus_t **vrs_lst = - dircollator_get_votes_for_router(collator, i); - + flag_counts = tor_malloc(sizeof(int) * smartlist_len(flags)); + while (1) { vote_routerstatus_t *rs; routerstatus_t rs_out; - const char *current_rsa_id = NULL; + const char *lowest_id = NULL; const char *chosen_version; - const char *chosen_protocol_list; const char *chosen_name = NULL; int exitsummary_disagreement = 0; - int is_named = 0, is_unnamed = 0, is_running = 0, is_valid = 0; + int is_named = 0, is_unnamed = 0, is_running = 0; int is_guard = 0, is_exit = 0, is_bad_exit = 0; int naming_conflict = 0; int n_listing = 0; + int i; char microdesc_digest[DIGEST256_LEN]; tor_addr_port_t alt_orport = {TOR_ADDR_NULL, 0}; + /* Of the next-to-be-considered digest in each voter, which is first? */ + SMARTLIST_FOREACH(votes, networkstatus_t *, v, { + if (index[v_sl_idx] < size[v_sl_idx]) { + rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]); + if (!lowest_id || + fast_memcmp(rs->status.identity_digest, + lowest_id, DIGEST_LEN) < 0) + lowest_id = rs->status.identity_digest; + } + }); + if (!lowest_id) /* we're out of routers. */ + break; + memset(flag_counts, 0, sizeof(int)*smartlist_len(flags)); smartlist_clear(matching_descs); smartlist_clear(chosen_flags); smartlist_clear(versions); - smartlist_clear(protocols); num_bandwidths = 0; num_mbws = 0; - num_guardfraction_inputs = 0; - int ed_consensus = 0; - const uint8_t *ed_consensus_val = NULL; /* Okay, go through all the entries for this digest. */ - for (int voter_idx = 0; voter_idx < smartlist_len(votes); ++voter_idx) { - if (vrs_lst[voter_idx] == NULL) - continue; /* This voter had nothing to say about this entry. */ - rs = vrs_lst[voter_idx]; + SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { + if (index[v_sl_idx] >= size[v_sl_idx]) + continue; /* out of entries. */ + rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]); + if (fast_memcmp(rs->status.identity_digest, lowest_id, DIGEST_LEN)) + continue; /* doesn't include this router. */ + /* At this point, we know that we're looking at a routerstatus with + * identity "lowest". + */ + ++index[v_sl_idx]; ++n_listing; - current_rsa_id = rs->status.identity_digest; - smartlist_add(matching_descs, rs); if (rs->version && rs->version[0]) smartlist_add(versions, rs->version); - if (rs->protocols) { - /* We include this one even if it's empty: voting for an - * empty protocol list actually is meaningful. */ - smartlist_add(protocols, rs->protocols); - } - /* Tally up all the flags. */ - for (int flag = 0; flag < n_voter_flags[voter_idx]; ++flag) { - if (rs->flags & (U64_LITERAL(1) << flag)) - ++flag_counts[flag_map[voter_idx][flag]]; + for (i = 0; i < n_voter_flags[v_sl_idx]; ++i) { + if (rs->flags & (U64_LITERAL(1) << i)) + ++flag_counts[flag_map[v_sl_idx][i]]; } - if (named_flag[voter_idx] >= 0 && - (rs->flags & (U64_LITERAL(1) << named_flag[voter_idx]))) { + if (named_flag[v_sl_idx] >= 0 && + (rs->flags & (U64_LITERAL(1) << named_flag[v_sl_idx]))) { if (chosen_name && strcmp(chosen_name, rs->status.nickname)) { log_notice(LD_DIR, "Conflict on naming for router: %s vs %s", chosen_name, rs->status.nickname); @@ -1832,48 +1746,19 @@ networkstatus_compute_consensus(smartlist_t *votes, chosen_name = rs->status.nickname; } - /* Count guardfraction votes and note down the values. */ - if (rs->status.has_guardfraction) { - measured_guardfraction[num_guardfraction_inputs++] = - rs->status.guardfraction_percentage; - } - /* count bandwidths */ if (rs->has_measured_bw) measured_bws_kb[num_mbws++] = rs->measured_bw_kb; if (rs->status.has_bandwidth) bandwidths_kb[num_bandwidths++] = rs->status.bandwidth_kb; - - /* Count number for which ed25519 is canonical. */ - if (rs->ed25519_reflects_consensus) { - ++ed_consensus; - if (ed_consensus_val) { - tor_assert(fast_memeq(ed_consensus_val, rs->ed25519_id, - ED25519_PUBKEY_LEN)); - } else { - ed_consensus_val = rs->ed25519_id; - } - } - } + } SMARTLIST_FOREACH_END(v); /* We don't include this router at all unless more than half of * the authorities we believe in list it. */ if (n_listing <= total_authorities/2) continue; - if (ed_consensus > 0) { - tor_assert(consensus_method >= MIN_METHOD_FOR_ED25519_ID_VOTING); - if (ed_consensus <= total_authorities / 2) { - log_warn(LD_BUG, "Not enough entries had ed_consensus set; how " - "can we have a consensus of %d?", ed_consensus); - } - } - - /* The clangalyzer can't figure out that this will never be NULL - * if n_listing is at least 1 */ - tor_assert(current_rsa_id); - /* Figure out the most popular opinion of what the most recent * routerinfo and its contents are. */ memset(microdesc_digest, 0, sizeof(microdesc_digest)); @@ -1881,9 +1766,8 @@ networkstatus_compute_consensus(smartlist_t *votes, microdesc_digest, &alt_orport); /* Copy bits of that into rs_out. */ memset(&rs_out, 0, sizeof(rs_out)); - tor_assert(fast_memeq(current_rsa_id, - rs->status.identity_digest,DIGEST_LEN)); - memcpy(rs_out.identity_digest, current_rsa_id, DIGEST_LEN); + tor_assert(fast_memeq(lowest_id, rs->status.identity_digest,DIGEST_LEN)); + memcpy(rs_out.identity_digest, lowest_id, DIGEST_LEN); memcpy(rs_out.descriptor_digest, rs->status.descriptor_digest, DIGEST_LEN); rs_out.addr = rs->status.addr; @@ -1903,11 +1787,14 @@ networkstatus_compute_consensus(smartlist_t *votes, strlcpy(rs_out.nickname, rs->status.nickname, sizeof(rs_out.nickname)); } - { + if (consensus_method == 1) { + is_named = chosen_named_idx >= 0 && + (!naming_conflict && flag_counts[chosen_named_idx]); + } else { const char *d = strmap_get_lc(name_to_id_map, rs_out.nickname); if (!d) { is_named = is_unnamed = 0; - } else if (fast_memeq(d, current_rsa_id, DIGEST_LEN)) { + } else if (fast_memeq(d, lowest_id, DIGEST_LEN)) { is_named = 1; is_unnamed = 0; } else { is_named = 0; is_unnamed = 1; @@ -1920,13 +1807,9 @@ networkstatus_compute_consensus(smartlist_t *votes, if (!strcmp(fl, "Named")) { if (is_named) smartlist_add(chosen_flags, (char*)fl); - } else if (!strcmp(fl, "Unnamed")) { + } else if (!strcmp(fl, "Unnamed") && consensus_method >= 2) { if (is_unnamed) smartlist_add(chosen_flags, (char*)fl); - } else if (!strcmp(fl, "NoEdConsensus") && - consensus_method >= MIN_METHOD_FOR_ED25519_ID_VOTING) { - if (ed_consensus <= total_authorities/2) - smartlist_add(chosen_flags, (char*)fl); } else { if (flag_counts[fl_sl_idx] > n_flag_voters[fl_sl_idx]/2) { smartlist_add(chosen_flags, (char*)fl); @@ -1938,21 +1821,13 @@ networkstatus_compute_consensus(smartlist_t *votes, is_running = 1; else if (!strcmp(fl, "BadExit")) is_bad_exit = 1; - else if (!strcmp(fl, "Valid")) - is_valid = 1; } } } SMARTLIST_FOREACH_END(fl); /* Starting with consensus method 4 we do not list servers * that are not running in a consensus. See Proposal 138 */ - if (!is_running) - continue; - - /* Starting with consensus method 24, we don't list servers - * that are not valid in a consensus. See Proposal 272 */ - if (!is_valid && - consensus_method >= MIN_METHOD_FOR_EXCLUDING_INVALID_NODES) + if (consensus_method >= 4 && !is_running) continue; /* Pick the version. */ @@ -1963,31 +1838,12 @@ networkstatus_compute_consensus(smartlist_t *votes, chosen_version = NULL; } - /* Pick the protocol list */ - if (smartlist_len(protocols)) { - smartlist_sort_strings(protocols); - chosen_protocol_list = get_most_frequent_member(protocols); - } else { - chosen_protocol_list = NULL; - } - - /* If it's a guard and we have enough guardfraction votes, - calculate its consensus guardfraction value. */ - if (is_guard && num_guardfraction_inputs > 2 && - consensus_method >= MIN_METHOD_FOR_GUARDFRACTION) { - rs_out.has_guardfraction = 1; - rs_out.guardfraction_percentage = median_uint32(measured_guardfraction, - num_guardfraction_inputs); - /* final value should be an integer percentage! */ - tor_assert(rs_out.guardfraction_percentage <= 100); - } - /* Pick a bandwidth */ - if (num_mbws > 2) { + if (consensus_method >= 6 && num_mbws > 2) { rs_out.has_bandwidth = 1; rs_out.bw_is_unmeasured = 0; rs_out.bandwidth_kb = median_uint32(measured_bws_kb, num_mbws); - } else if (num_bandwidths > 0) { + } else if (consensus_method >= 5 && num_bandwidths > 0) { rs_out.has_bandwidth = 1; rs_out.bw_is_unmeasured = 1; rs_out.bandwidth_kb = median_uint32(bandwidths_kb, num_bandwidths); @@ -2001,13 +1857,25 @@ networkstatus_compute_consensus(smartlist_t *votes, } /* Fix bug 2203: Do not count BadExit nodes as Exits for bw weights */ - is_exit = is_exit && !is_bad_exit; + if (consensus_method >= MIN_METHOD_TO_CUT_BADEXIT_WEIGHT) { + is_exit = is_exit && !is_bad_exit; + } - /* Update total bandwidth weights with the bandwidths of this router. */ - { - update_total_bandwidth_weights(&rs_out, - is_exit, is_guard, - &G, &M, &E, &D, &T); + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { + if (rs_out.has_bandwidth) { + T += rs_out.bandwidth_kb; + if (is_exit && is_guard) + D += rs_out.bandwidth_kb; + else if (is_exit) + E += rs_out.bandwidth_kb; + else if (is_guard) + G += rs_out.bandwidth_kb; + else + M += rs_out.bandwidth_kb; + } else { + log_warn(LD_BUG, "Missing consensus bandwidth for router %s", + rs_out.nickname); + } } /* Ok, we already picked a descriptor digest we want to list @@ -2024,7 +1892,7 @@ networkstatus_compute_consensus(smartlist_t *votes, * the policy that was most often listed in votes, again breaking * ties like in the previous case. */ - { + if (consensus_method >= 5) { /* Okay, go through all the votes for this router. We prepared * that list previously */ const char *chosen_exitsummary = NULL; @@ -2095,6 +1963,7 @@ networkstatus_compute_consensus(smartlist_t *votes, } if (flavor == FLAV_MICRODESC && + consensus_method >= MIN_METHOD_FOR_MANDATORY_MICRODESC && tor_digest256_is_zero(microdesc_digest)) { /* With no microdescriptor digest, we omit the entry entirely. */ continue; @@ -2104,8 +1973,7 @@ networkstatus_compute_consensus(smartlist_t *votes, char *buf; /* Okay!! Now we can write the descriptor... */ /* First line goes into "buf". */ - buf = routerstatus_format_entry(&rs_out, NULL, NULL, - rs_format, consensus_method, NULL); + buf = routerstatus_format_entry(&rs_out, NULL, rs_format, NULL); if (buf) smartlist_add(chunks, buf); } @@ -2121,31 +1989,17 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_join_strings(chosen_flags, " ", 0, NULL)); /* Now the version line. */ if (chosen_version) { - smartlist_add_strdup(chunks, "\nv "); - smartlist_add_strdup(chunks, chosen_version); - } - smartlist_add_strdup(chunks, "\n"); - if (chosen_protocol_list && - consensus_method >= MIN_METHOD_FOR_RS_PROTOCOLS) { - smartlist_add_asprintf(chunks, "pr %s\n", chosen_protocol_list); + smartlist_add(chunks, tor_strdup("\nv ")); + smartlist_add(chunks, tor_strdup(chosen_version)); } + smartlist_add(chunks, tor_strdup("\n")); /* Now the weight line. */ if (rs_out.has_bandwidth) { - char *guardfraction_str = NULL; int unmeasured = rs_out.bw_is_unmeasured && consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW; - - /* If we have guardfraction info, include it in the 'w' line. */ - if (rs_out.has_guardfraction) { - tor_asprintf(&guardfraction_str, - " GuardFraction=%u", rs_out.guardfraction_percentage); - } - smartlist_add_asprintf(chunks, "w Bandwidth=%d%s%s\n", + smartlist_add_asprintf(chunks, "w Bandwidth=%d%s\n", rs_out.bandwidth_kb, - unmeasured?" Unmeasured=1":"", - guardfraction_str ? guardfraction_str : ""); - - tor_free(guardfraction_str); + unmeasured?" Unmeasured=1":""); } /* Now the exitpolicy summary line. */ @@ -2156,6 +2010,7 @@ networkstatus_compute_consensus(smartlist_t *votes, /* And the loop is over and we move on to the next router */ } + tor_free(index); tor_free(size); tor_free(n_voter_flags); tor_free(n_flag_voters); @@ -2169,24 +2024,25 @@ networkstatus_compute_consensus(smartlist_t *votes, smartlist_free(matching_descs); smartlist_free(chosen_flags); smartlist_free(versions); - smartlist_free(protocols); smartlist_free(exitsummaries); tor_free(bandwidths_kb); tor_free(measured_bws_kb); - tor_free(measured_guardfraction); } - /* Mark the directory footer region */ - smartlist_add_strdup(chunks, "directory-footer\n"); + if (consensus_method >= MIN_METHOD_FOR_FOOTER) { + /* Starting with consensus method 9, we clearly mark the directory + * footer region */ + smartlist_add(chunks, tor_strdup("directory-footer\n")); + } - { + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { int64_t weight_scale = BW_WEIGHT_SCALE; char *bw_weight_param = NULL; // Parse params, extract BW_WEIGHT_SCALE if present // DO NOT use consensus_param_bw_weight_scale() in this code! // The consensus is not formed yet! - /* XXXX Extract this code into a common function. Or not: #19011. */ + /* XXXX Extract this code into a common function */ if (params) { if (strcmpstart(params, "bwweightscale=") == 0) bw_weight_param = params; @@ -2212,8 +2068,13 @@ networkstatus_compute_consensus(smartlist_t *votes, } } - added_weights = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, - T, weight_scale); + if (consensus_method < 10) { + networkstatus_compute_bw_weights_v9(chunks, G, M, E, D, T, weight_scale); + added_weights = 1; + } else { + added_weights = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, + T, weight_scale); + } } /* Add a signature. */ @@ -2228,7 +2089,7 @@ networkstatus_compute_consensus(smartlist_t *votes, const char *algname = crypto_digest_algorithm_get_name(digest_alg); char *signature; - smartlist_add_strdup(chunks, "directory-signature "); + smartlist_add(chunks, tor_strdup("directory-signature ")); /* Compute the hash of the chunks. */ crypto_digest_smartlist(digest, digest_len, chunks, "", digest_alg); @@ -2254,8 +2115,8 @@ networkstatus_compute_consensus(smartlist_t *votes, } smartlist_add(chunks, signature); - if (legacy_id_key_digest && legacy_signing_key) { - smartlist_add_strdup(chunks, "directory-signature "); + if (legacy_id_key_digest && legacy_signing_key && consensus_method >= 3) { + smartlist_add(chunks, tor_strdup("directory-signature ")); base16_encode(fingerprint, sizeof(fingerprint), legacy_id_key_digest, DIGEST_LEN); crypto_pk_get_fingerprint(legacy_signing_key, @@ -2290,7 +2151,7 @@ networkstatus_compute_consensus(smartlist_t *votes, goto done; } // Verify balancing parameters - if (added_weights) { + if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS && added_weights) { networkstatus_verify_bw_weights(c, consensus_method); } networkstatus_vote_free(c); @@ -2298,88 +2159,12 @@ networkstatus_compute_consensus(smartlist_t *votes, done: - dircollator_free(collator); tor_free(client_versions); tor_free(server_versions); - tor_free(packages); SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp)); smartlist_free(flags); SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); - SMARTLIST_FOREACH(param_list, char *, cp, tor_free(cp)); - smartlist_free(param_list); - - return result; -} - -/** Given a list of networkstatus_t for each vote, return a newly allocated - * string containing the "package" lines for the vote. */ -STATIC char * -compute_consensus_package_lines(smartlist_t *votes) -{ - const int n_votes = smartlist_len(votes); - - /* This will be a map from "packagename version" strings to arrays - * of const char *, with the i'th member of the array corresponding to the - * package line from the i'th vote. - */ - strmap_t *package_status = strmap_new(); - - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - if (! v->package_lines) - continue; - SMARTLIST_FOREACH_BEGIN(v->package_lines, const char *, line) { - if (! validate_recommended_package_line(line)) - continue; - - /* Skip 'cp' to the second space in the line. */ - const char *cp = strchr(line, ' '); - if (!cp) continue; - ++cp; - cp = strchr(cp, ' '); - if (!cp) continue; - - char *key = tor_strndup(line, cp - line); - - const char **status = strmap_get(package_status, key); - if (!status) { - status = tor_calloc(n_votes, sizeof(const char *)); - strmap_set(package_status, key, status); - } - status[v_sl_idx] = line; /* overwrite old value */ - tor_free(key); - } SMARTLIST_FOREACH_END(line); - } SMARTLIST_FOREACH_END(v); - - smartlist_t *entries = smartlist_new(); /* temporary */ - smartlist_t *result_list = smartlist_new(); /* output */ - STRMAP_FOREACH(package_status, key, const char **, values) { - int i, count=-1; - for (i = 0; i < n_votes; ++i) { - if (values[i]) - smartlist_add(entries, (void*) values[i]); - } - smartlist_sort_strings(entries); - int n_voting_for_entry = smartlist_len(entries); - const char *most_frequent = - smartlist_get_most_frequent_string_(entries, &count); - - if (n_voting_for_entry >= 3 && count > n_voting_for_entry / 2) { - smartlist_add_asprintf(result_list, "package %s\n", most_frequent); - } - - smartlist_clear(entries); - - } STRMAP_FOREACH_END; - - smartlist_sort_strings(result_list); - - char *result = smartlist_join_strings(result_list, "", 0, NULL); - - SMARTLIST_FOREACH(result_list, char *, cp, tor_free(cp)); - smartlist_free(result_list); - smartlist_free(entries); - strmap_free(package_status, tor_free_); return result; } @@ -2432,14 +2217,14 @@ networkstatus_add_detached_signatures(networkstatus_t *target, /** Make sure all the digests we know match, and at least one matches. */ { - common_digests_t *digests = strmap_get(sigs->digests, flavor); + digests_t *digests = strmap_get(sigs->digests, flavor); int n_matches = 0; int alg; if (!digests) { *msg_out = "No digests for given consensus flavor"; return -1; } - for (alg = DIGEST_SHA1; alg < N_COMMON_DIGEST_ALGORITHMS; ++alg) { + for (alg = DIGEST_SHA1; alg < N_DIGEST_ALGORITHMS; ++alg) { if (!tor_mem_is_zero(digests->d[alg], DIGEST256_LEN)) { if (fast_memeq(target->digests.d[alg], digests->d[alg], DIGEST256_LEN)) { @@ -2451,7 +2236,7 @@ networkstatus_add_detached_signatures(networkstatus_t *target, } } if (!n_matches) { - *msg_out = "No recognized digests for given consensus flavor"; + *msg_out = "No regognized digests for given consensus flavor"; } } @@ -2490,11 +2275,8 @@ networkstatus_add_detached_signatures(networkstatus_t *target, if (!sig->good_signature && !sig->bad_signature) { cert = authority_cert_get_by_digests(sig->identity_digest, sig->signing_key_digest); - if (cert) { - /* Not checking the return value here, since we are going to look - * at the status of sig->good_signature in a moment. */ - (void) networkstatus_check_document_signature(target, sig, cert); - } + if (cert) + networkstatus_check_document_signature(target, sig, cert); } /* If this signature is good, or we don't have any signature yet, @@ -2565,10 +2347,9 @@ networkstatus_format_signatures(networkstatus_t *consensus, for_detached_signatures ? flavor_name : "", digest_name, id, sk); } - base64_encode(buf, sizeof(buf), sig->signature, sig->signature_len, - BASE64_ENCODE_MULTILINE); + base64_encode(buf, sizeof(buf), sig->signature, sig->signature_len); strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); - smartlist_add_strdup(elements, buf); + smartlist_add(elements, tor_strdup(buf)); } SMARTLIST_FOREACH_END(sig); } SMARTLIST_FOREACH_END(v); @@ -2632,7 +2413,7 @@ networkstatus_get_detached_signatures(smartlist_t *consensuses) /* start with SHA256; we don't include SHA1 for anything but the basic * consensus. */ - for (alg = DIGEST_SHA256; alg < N_COMMON_DIGEST_ALGORITHMS; ++alg) { + for (alg = DIGEST_SHA256; alg < N_DIGEST_ALGORITHMS; ++alg) { char d[HEX_DIGEST256_LEN+1]; const char *alg_name = crypto_digest_algorithm_get_name(alg); @@ -2646,15 +2427,15 @@ networkstatus_get_detached_signatures(smartlist_t *consensuses) /* Now get all the sigs for non-FLAV_NS consensuses */ SMARTLIST_FOREACH_BEGIN(consensuses, networkstatus_t *, ns) { - char *sigs_on_this_consensus; + char *sigs; if (ns->flavor == FLAV_NS) continue; - sigs_on_this_consensus = networkstatus_format_signatures(ns, 1); - if (!sigs_on_this_consensus) { + sigs = networkstatus_format_signatures(ns, 1); + if (!sigs) { log_warn(LD_DIR, "Couldn't format signatures"); goto err; } - smartlist_add(elements, sigs_on_this_consensus); + smartlist_add(elements, sigs); } SMARTLIST_FOREACH_END(ns); /* Now add the FLAV_NS consensus signatrures. */ @@ -2691,7 +2472,7 @@ get_detached_signatures_from_pending_consensuses(pending_consensus_t *pending, /** Release all storage held in s. */ void -ns_detached_signatures_free_(ns_detached_signatures_t *s) +ns_detached_signatures_free(ns_detached_signatures_t *s) { if (!s) return; @@ -2793,22 +2574,50 @@ dirvote_get_start_of_next_interval(time_t now, int interval, int offset) return next; } -/* Populate and return a new voting_schedule_t that can be used to schedule - * voting. The object is allocated on the heap and it's the responsibility of - * the caller to free it. Can't fail. */ -static voting_schedule_t * -get_voting_schedule(const or_options_t *options, time_t now, int severity) +/** Scheduling information for a voting interval. */ +static struct { + /** When do we generate and distribute our vote for this interval? */ + time_t voting_starts; + /** When do we send an HTTP request for any votes that we haven't + * been posted yet?*/ + time_t fetch_missing_votes; + /** When do we give up on getting more votes and generate a consensus? */ + time_t voting_ends; + /** When do we send an HTTP request for any signatures we're expecting to + * see on the consensus? */ + time_t fetch_missing_signatures; + /** When do we publish the consensus? */ + time_t interval_starts; + + /* True iff we have generated and distributed our vote. */ + int have_voted; + /* True iff we've requested missing votes. */ + int have_fetched_missing_votes; + /* True iff we have built a consensus and sent the signatures around. */ + int have_built_consensus; + /* True iff we've fetched missing signatures. */ + int have_fetched_missing_signatures; + /* True iff we have published our consensus. */ + int have_published_consensus; +} voting_schedule = {0,0,0,0,0,0,0,0,0,0}; + +/** Set voting_schedule to hold the timing for the next vote we should be + * doing. */ +void +dirvote_recalculate_timing(const or_options_t *options, time_t now) { int interval, vote_delay, dist_delay; time_t start; time_t end; networkstatus_t *consensus; - voting_schedule_t *new_voting_schedule; - new_voting_schedule = tor_malloc_zero(sizeof(voting_schedule_t)); + if (!authdir_mode_v3(options)) + return; consensus = networkstatus_get_live_consensus(now); + memset(&voting_schedule, 0, sizeof(voting_schedule)); + if (consensus) { interval = (int)( consensus->fresh_until - consensus->valid_after ); vote_delay = consensus->vote_seconds; @@ -2824,7 +2633,7 @@ get_voting_schedule(const or_options_t *options, time_t now, int severity) if (vote_delay + dist_delay > interval/2) vote_delay = dist_delay = interval / 4; - start = new_voting_schedule->interval_starts = + start = voting_schedule.interval_starts = dirvote_get_start_of_next_interval(now,interval, options->TestingV3AuthVotingStartOffset); end = dirvote_get_start_of_next_interval(start+1, interval, @@ -2832,68 +2641,18 @@ get_voting_schedule(const or_options_t *options, time_t now, int severity) tor_assert(end > start); - new_voting_schedule->fetch_missing_signatures = start - (dist_delay/2); - new_voting_schedule->voting_ends = start - dist_delay; - new_voting_schedule->fetch_missing_votes = - start - dist_delay - (vote_delay/2); - new_voting_schedule->voting_starts = start - dist_delay - vote_delay; + voting_schedule.fetch_missing_signatures = start - (dist_delay/2); + voting_schedule.voting_ends = start - dist_delay; + voting_schedule.fetch_missing_votes = start - dist_delay - (vote_delay/2); + voting_schedule.voting_starts = start - dist_delay - vote_delay; { char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, new_voting_schedule->interval_starts); - tor_log(severity, LD_DIR,"Choosing expected valid-after time as %s: " - "consensus_set=%d, interval=%d", - tbuf, consensus?1:0, interval); + format_iso_time(tbuf, voting_schedule.interval_starts); + log_notice(LD_DIR,"Choosing expected valid-after time as %s: " + "consensus_set=%d, interval=%d", + tbuf, consensus?1:0, interval); } - - return new_voting_schedule; -} - -#define voting_schedule_free(s) \ - FREE_AND_NULL(voting_schedule_t, voting_schedule_free_, (s)) - -/** Frees a voting_schedule_t. This should be used instead of the generic - * tor_free. */ -static void -voting_schedule_free_(voting_schedule_t *voting_schedule_to_free) -{ - if (!voting_schedule_to_free) - return; - tor_free(voting_schedule_to_free); -} - -static voting_schedule_t voting_schedule; - -/* Using the time now, return the next voting valid-after time. */ -time_t -dirvote_get_next_valid_after_time(void) -{ - /* This is a safe guard in order to make sure that the voting schedule - * static object is at least initialized. Using this function with a zeroed - * voting schedule can lead to bugs. */ - if (tor_mem_is_zero((const char *) &voting_schedule, - sizeof(voting_schedule))) { - dirvote_recalculate_timing(get_options(), time(NULL)); - voting_schedule.created_on_demand = 1; - } - return voting_schedule.interval_starts; -} - -/** Set voting_schedule to hold the timing for the next vote we should be - * doing. All type of tor do that because HS subsystem needs the timing as - * well to function properly. */ -void -dirvote_recalculate_timing(const or_options_t *options, time_t now) -{ - voting_schedule_t *new_voting_schedule; - - /* get the new voting schedule */ - new_voting_schedule = get_voting_schedule(options, now, LOG_INFO); - tor_assert(new_voting_schedule); - - /* Fill in the global static struct now */ - memcpy(&voting_schedule, new_voting_schedule, sizeof(voting_schedule)); - voting_schedule_free(new_voting_schedule); } /** Entry point: Take whatever voting actions are pending as of now. */ @@ -2902,13 +2661,7 @@ dirvote_act(const or_options_t *options, time_t now) { if (!authdir_mode_v3(options)) return; - tor_assert_nonfatal(voting_schedule.voting_starts); - /* If we haven't initialized this object through this codeflow, we need to - * recalculate the timings to match our vote. The reason to do that is if we - * have a voting schedule initialized 1 minute ago, the voting timings might - * not be aligned to what we should expect with "now". This is especially - * true for TestingTorNetwork using smaller timings. */ - if (voting_schedule.created_on_demand) { + if (!voting_schedule.voting_starts) { char *keys = list_v3_auth_ids(); authority_cert_t *c = get_my_v3_authority_cert(); log_notice(LD_DIR, "Scheduling voting. Known authority IDs are %s. " @@ -2948,9 +2701,6 @@ dirvote_act(const or_options_t *options, time_t now) dirvote_publish_consensus(); dirvote_clear_votes(0); voting_schedule.have_published_consensus = 1; - /* Update our shared random state with the consensus just published. */ - sr_act_post_consensus( - networkstatus_get_latest_consensus_by_flavor(FLAV_NS)); /* XXXX We will want to try again later if we haven't got enough * signatures yet. Implement this if it turns out to ever happen. */ dirvote_recalculate_timing(options, now); @@ -3230,8 +2980,7 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) /* Hey, it's a new cert! */ trusted_dirs_load_certs_from_string( vote->cert->cache_info.signed_descriptor_body, - TRUSTED_DIRS_CERTS_SRC_FROM_VOTE, 1 /*flush*/, - NULL); + TRUSTED_DIRS_CERTS_SRC_FROM_VOTE, 1 /*flush*/); if (!authority_cert_get_by_digests(vote->cert->cache_info.identity_digest, vote->cert->signing_key_digest)) { log_warn(LD_BUG, "We added a cert, but still couldn't find it."); @@ -3267,7 +3016,7 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) goto discard; } else if (v->vote->published < vote->published) { log_notice(LD_DIR, "Replacing an older pending vote from this " - "directory (%s)", vi->address); + "directory."); cached_dir_decref(v->vote_body); networkstatus_vote_free(v->vote); v->vote_body = new_cached_dir(tor_strndup(vote_body, @@ -3290,10 +3039,6 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) } } SMARTLIST_FOREACH_END(v); - /* This a valid vote, update our shared random state. */ - sr_handle_received_commits(vote->sr_info.commits, - vote->cert->identity_key); - pending_vote = tor_malloc_zero(sizeof(pending_vote_t)); pending_vote->vote_body = new_cached_dir(tor_strndup(vote_body, end_of_vote-vote_body), @@ -3338,30 +3083,6 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) return any_failed ? NULL : pending_vote; } -/* Write the votes in pending_vote_list to disk. */ -static void -write_v3_votes_to_disk(const smartlist_t *pending_votes) -{ - smartlist_t *votestrings = smartlist_new(); - char *votefile = NULL; - - SMARTLIST_FOREACH(pending_votes, pending_vote_t *, v, - { - sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t)); - c->bytes = v->vote_body->dir; - c->len = v->vote_body->dir_len; - smartlist_add(votestrings, c); /* collect strings to write to disk */ - }); - - votefile = get_datadir_fname("v3-status-votes"); - write_chunks_to_file(votefile, votestrings, 0, 0); - log_debug(LD_DIR, "Wrote votes to disk (%s)!", votefile); - - tor_free(votefile); - SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c)); - smartlist_free(votestrings); -} - /** Try to compute a v3 networkstatus consensus from the currently pending * votes. Return 0 on success, -1 on failure. Store the consensus in * pending_consensus: it won't be ready to be published until we have @@ -3371,8 +3092,8 @@ dirvote_compute_consensuses(void) { /* Have we got enough votes to try? */ int n_votes, n_voters, n_vote_running = 0; - smartlist_t *votes = NULL; - char *consensus_body = NULL, *signatures = NULL; + smartlist_t *votes = NULL, *votestrings = NULL; + char *consensus_body = NULL, *signatures = NULL, *votefile; networkstatus_t *consensus = NULL; authority_cert_t *my_cert; pending_consensus_t pending[N_CONSENSUS_FLAVORS]; @@ -3383,17 +3104,6 @@ dirvote_compute_consensuses(void) if (!pending_vote_list) pending_vote_list = smartlist_new(); - /* Write votes to disk */ - write_v3_votes_to_disk(pending_vote_list); - - /* Setup votes smartlist */ - votes = smartlist_new(); - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, - { - smartlist_add(votes, v->vote); /* collect votes to compute consensus */ - }); - - /* See if consensus managed to achieve majority */ n_voters = get_n_authorities(V3_DIRINFO); n_votes = smartlist_len(pending_vote_list); if (n_votes <= n_voters/2) { @@ -3420,6 +3130,24 @@ dirvote_compute_consensuses(void) goto err; } + votes = smartlist_new(); + votestrings = smartlist_new(); + SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, + { + sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t)); + c->bytes = v->vote_body->dir; + c->len = v->vote_body->dir_len; + smartlist_add(votestrings, c); /* collect strings to write to disk */ + + smartlist_add(votes, v->vote); /* collect votes to compute consensus */ + }); + + votefile = get_datadir_fname("v3-status-votes"); + write_chunks_to_file(votefile, votestrings, 0, 0); + tor_free(votefile); + SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c)); + smartlist_free(votestrings); + { char legacy_dbuf[DIGEST_LEN]; crypto_pk_t *legacy_sign=NULL; @@ -3683,8 +3411,8 @@ dirvote_add_signatures(const char *detached_signatures_body, "Queuing it for the next consensus.", source); if (!pending_consensus_signature_list) pending_consensus_signature_list = smartlist_new(); - smartlist_add_strdup(pending_consensus_signature_list, - detached_signatures_body); + smartlist_add(pending_consensus_signature_list, + tor_strdup(detached_signatures_body)); *msg = "Signature queued"; return 0; } @@ -3709,7 +3437,7 @@ dirvote_publish_consensus(void) continue; } - if (networkstatus_set_current_consensus(pending->body, name, 0, NULL)) + if (networkstatus_set_current_consensus(pending->body, name, 0)) log_warn(LD_DIR, "Error publishing %s consensus", name); else log_notice(LD_DIR, "Published %s consensus", name); @@ -3743,8 +3471,8 @@ dirvote_free_all(void) * ==== */ /** Return the body of the consensus that we're currently trying to build. */ -MOCK_IMPL(const char *, -dirvote_get_pending_consensus, (consensus_flavor_t flav)) +const char * +dirvote_get_pending_consensus(consensus_flavor_t flav) { tor_assert(((int)flav) >= 0 && (int)flav < N_CONSENSUS_FLAVORS); return pending_consensuses[flav].body; @@ -3752,8 +3480,8 @@ dirvote_get_pending_consensus, (consensus_flavor_t flav)) /** Return the signatures that we know for the consensus that we're currently * trying to build. */ -MOCK_IMPL(const char *, -dirvote_get_pending_detached_signatures, (void)) +const char * +dirvote_get_pending_detached_signatures(void) { return pending_consensus_signatures; } @@ -3834,14 +3562,11 @@ dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method) char kbuf[128]; base64_encode(kbuf, sizeof(kbuf), (const char*)ri->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN, BASE64_ENCODE_MULTILINE); + CURVE25519_PUBKEY_LEN); smartlist_add_asprintf(chunks, "ntor-onion-key %s", kbuf); } - /* We originally put a lines in the micrdescriptors, but then we worked out - * that we needed them in the microdesc consensus. See #20916. */ if (consensus_method >= MIN_METHOD_FOR_A_LINES && - consensus_method < MIN_METHOD_FOR_NO_A_LINES_IN_MICRODESC && !tor_addr_is_null(&ri->ipv6_addr) && ri->ipv6_orport) smartlist_add_asprintf(chunks, "a %s\n", fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport)); @@ -3854,7 +3579,7 @@ dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method) if (consensus_method >= MIN_METHOD_FOR_P6_LINES && ri->ipv6_exit_policy) { - /* XXXX+++ This doesn't match proposal 208, which says these should + /* XXXX024 This doesn't match proposal 208, which says these should * be taken unchanged from the routerinfo. That's bogosity, IMO: * the proposal should have said to do this instead.*/ char *p6 = write_short_policy(ri->ipv6_exit_policy); @@ -3863,28 +3588,12 @@ dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method) tor_free(p6); } - if (consensus_method >= MIN_METHOD_FOR_ID_HASH_IN_MD) { - char idbuf[ED25519_BASE64_LEN+1]; - const char *keytype; - if (consensus_method >= MIN_METHOD_FOR_ED25519_ID_IN_MD && - ri->cache_info.signing_key_cert && - ri->cache_info.signing_key_cert->signing_key_included) { - keytype = "ed25519"; - ed25519_public_to_base64(idbuf, - &ri->cache_info.signing_key_cert->signing_key); - } else { - keytype = "rsa1024"; - digest_to_base64(idbuf, ri->cache_info.identity_digest); - } - smartlist_add_asprintf(chunks, "id %s %s\n", keytype, idbuf); - } - output = smartlist_join_strings(chunks, "", 0, NULL); { smartlist_t *lst = microdescs_parse_from_string(output, - output+strlen(output), 0, - SAVED_NOWHERE, NULL); + output+strlen(output), 0, + SAVED_NOWHERE); if (smartlist_len(lst) != 1) { log_warn(LD_DIR, "We generated a microdescriptor we couldn't parse."); SMARTLIST_FOREACH(lst, microdesc_t *, md, microdesc_free(md)); @@ -3945,14 +3654,10 @@ static const struct consensus_method_range_t { int low; int high; } microdesc_consensus_methods[] = { - {MIN_SUPPORTED_CONSENSUS_METHOD, MIN_METHOD_FOR_A_LINES - 1}, + {MIN_METHOD_FOR_MICRODESC, MIN_METHOD_FOR_A_LINES - 1}, {MIN_METHOD_FOR_A_LINES, MIN_METHOD_FOR_P6_LINES - 1}, {MIN_METHOD_FOR_P6_LINES, MIN_METHOD_FOR_NTOR_KEY - 1}, - {MIN_METHOD_FOR_NTOR_KEY, MIN_METHOD_FOR_ID_HASH_IN_MD - 1}, - {MIN_METHOD_FOR_ID_HASH_IN_MD, MIN_METHOD_FOR_ED25519_ID_IN_MD - 1}, - {MIN_METHOD_FOR_ED25519_ID_IN_MD, - MIN_METHOD_FOR_NO_A_LINES_IN_MICRODESC - 1}, - {MIN_METHOD_FOR_NO_A_LINES_IN_MICRODESC, MAX_SUPPORTED_CONSENSUS_METHOD}, + {MIN_METHOD_FOR_NTOR_KEY, MAX_SUPPORTED_CONSENSUS_METHOD}, {-1, -1} }; @@ -4009,15 +3714,14 @@ dirvote_format_all_microdesc_vote_lines(const routerinfo_t *ri, time_t now, while ((ep = entries)) { char buf[128]; vote_microdesc_hash_t *h; - if (dirvote_format_microdesc_vote_line(buf, sizeof(buf), ep->md, - ep->low, ep->high) >= 0) { - h = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); - h->microdesc_hash_line = tor_strdup(buf); - h->next = result; - result = h; - ep->md->last_listed = now; - smartlist_add(microdescriptors_out, ep->md); - } + dirvote_format_microdesc_vote_line(buf, sizeof(buf), ep->md, + ep->low, ep->high); + h = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); + h->microdesc_hash_line = tor_strdup(buf); + h->next = result; + result = h; + ep->md->last_listed = now; + smartlist_add(microdescriptors_out, ep->md); entries = ep->next; tor_free(ep); } diff --git a/src/tor/dirvote.h b/src/tor/dirvote.h new file mode 100644 index 000000000..3a4951a95 --- /dev/null +++ b/src/tor/dirvote.h @@ -0,0 +1,148 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dirvote.h + * \brief Header file for dirvote.c. + **/ + +#ifndef TOR_DIRVOTE_H +#define TOR_DIRVOTE_H + +#include "testsupport.h" + +/** Lowest allowable value for VoteSeconds. */ +#define MIN_VOTE_SECONDS 2 +/** Lowest allowable value for DistSeconds. */ +#define MIN_DIST_SECONDS 2 +/** Smallest allowable voting interval. */ +#define MIN_VOTE_INTERVAL 300 + +/** The highest consensus method that we currently support. */ +#define MAX_SUPPORTED_CONSENSUS_METHOD 17 + +/** Lowest consensus method that contains a 'directory-footer' marker */ +#define MIN_METHOD_FOR_FOOTER 9 + +/** Lowest consensus method that contains bandwidth weights */ +#define MIN_METHOD_FOR_BW_WEIGHTS 9 + +/** Lowest consensus method that contains consensus params */ +#define MIN_METHOD_FOR_PARAMS 7 + +/** Lowest consensus method that generates microdescriptors */ +#define MIN_METHOD_FOR_MICRODESC 8 + +/** Lowest consensus method that doesn't count bad exits as exits for weight */ +#define MIN_METHOD_TO_CUT_BADEXIT_WEIGHT 11 + +/** Lowest consensus method that ensures a majority of authorities voted + * for a param. */ +#define MIN_METHOD_FOR_MAJORITY_PARAMS 12 + +/** Lowest consensus method where microdesc consensuses omit any entry + * with no microdesc. */ +#define MIN_METHOD_FOR_MANDATORY_MICRODESC 13 + +/** Lowest consensus method that contains "a" lines. */ +#define MIN_METHOD_FOR_A_LINES 14 + +/** Lowest consensus method where microdescs may include a "p6" line. */ +#define MIN_METHOD_FOR_P6_LINES 15 + +/** Lowest consensus method where microdescs may include an onion-key-ntor + * line */ +#define MIN_METHOD_FOR_NTOR_KEY 16 + +/** Lowest consensus method that ensures that authorities output an + * Unmeasured=1 flag for unmeasured bandwidths */ +#define MIN_METHOD_TO_CLIP_UNMEASURED_BW 17 + +/** Default bandwidth to clip unmeasured bandwidths to using method >= + * MIN_METHOD_TO_CLIP_UNMEASURED_BW */ +#define DEFAULT_MAX_UNMEASURED_BW_KB 20 + +void dirvote_free_all(void); + +/* vote manipulation */ +char *networkstatus_compute_consensus(smartlist_t *votes, + int total_authorities, + crypto_pk_t *identity_key, + crypto_pk_t *signing_key, + const char *legacy_identity_key_digest, + crypto_pk_t *legacy_signing_key, + consensus_flavor_t flavor); +int networkstatus_add_detached_signatures(networkstatus_t *target, + ns_detached_signatures_t *sigs, + const char *source, + int severity, + const char **msg_out); +char *networkstatus_get_detached_signatures(smartlist_t *consensuses); +void ns_detached_signatures_free(ns_detached_signatures_t *s); + +/* cert manipulation */ +authority_cert_t *authority_cert_dup(authority_cert_t *cert); + +/* vote scheduling */ +void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); +time_t dirvote_get_start_of_next_interval(time_t now, + int interval, + int offset); +void dirvote_recalculate_timing(const or_options_t *options, time_t now); +void dirvote_act(const or_options_t *options, time_t now); + +/* invoked on timers and by outside triggers. */ +struct pending_vote_t * dirvote_add_vote(const char *vote_body, + const char **msg_out, + int *status_out); +int dirvote_add_signatures(const char *detached_signatures_body, + const char *source, + const char **msg_out); + +/* Item access */ +const char *dirvote_get_pending_consensus(consensus_flavor_t flav); +const char *dirvote_get_pending_detached_signatures(void); +#define DGV_BY_ID 1 +#define DGV_INCLUDE_PENDING 2 +#define DGV_INCLUDE_PREVIOUS 4 +const cached_dir_t *dirvote_get_vote(const char *fp, int flags); +void set_routerstatus_from_routerinfo(routerstatus_t *rs, + node_t *node, + routerinfo_t *ri, time_t now, + int naming, int listbadexits, + int listbaddirs, int vote_on_hsdirs); +networkstatus_t * +dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, + authority_cert_t *cert); + +microdesc_t *dirvote_create_microdescriptor(const routerinfo_t *ri, + int consensus_method); +ssize_t dirvote_format_microdesc_vote_line(char *out, size_t out_len, + const microdesc_t *md, + int consensus_method_low, + int consensus_method_high); +vote_microdesc_hash_t *dirvote_format_all_microdesc_vote_lines( + const routerinfo_t *ri, + time_t now, + smartlist_t *microdescriptors_out); + +int vote_routerstatus_find_microdesc_hash(char *digest256_out, + const vote_routerstatus_t *vrs, + int method, + digest_algorithm_t alg); +document_signature_t *voter_get_sig_by_algorithm( + const networkstatus_voter_info_t *voter, + digest_algorithm_t alg); + +#ifdef DIRVOTE_PRIVATE +STATIC char *format_networkstatus_vote(crypto_pk_t *private_key, + networkstatus_t *v3_ns); +STATIC char *dirvote_compute_params(smartlist_t *votes, int method, + int total_authorities); +#endif + +#endif + diff --git a/src/tor/src/or/dns.c b/src/tor/dns.c similarity index 87% rename from src/tor/src/or/dns.c rename to src/tor/dns.c index 1f00fe5b4..9abf550a0 100644 --- a/src/tor/src/or/dns.c +++ b/src/tor/dns.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,46 +9,8 @@ * This is implemented as a wrapper around Adam Langley's eventdns.c code. * (We can't just use gethostbyname() and friends because we really need to * be nonblocking.) - * - * There are three main cases when a Tor relay uses dns.c to launch a DNS - * request: - *
    - *
  1. To check whether the DNS server is working more or less correctly. - * This happens via dns_launch_correctness_checks(). The answer is - * reported in the return value from later calls to - * dns_seems_to_be_broken(). - *
  2. When a client has asked the relay, in a RELAY_BEGIN cell, to connect - * to a given server by hostname. This happens via dns_resolve(). - *
  3. When a client has asked the rela, in a RELAY_RESOLVE cell, to look - * up a given server's IP address(es) by hostname. This also happens via - * dns_resolve(). - *
- * - * Each of these gets handled a little differently. - * - * To check for correctness, we look up some hostname we expect to exist and - * have real entries, some hostnames which we expect to definitely not exist, - * and some hostnames that we expect to probably not exist. If too many of - * the hostnames that shouldn't exist do exist, that's a DNS hijacking - * attempt. If too many of the hostnames that should exist have the same - * addresses as the ones that shouldn't exist, that's a very bad DNS hijacking - * attempt, or a very naughty captive portal. And if the hostnames that - * should exist simply don't exist, we probably have a broken nameserver. - * - * To handle client requests, we first check our cache for answers. If there - * isn't something up-to-date, we've got to launch A or AAAA requests as - * appropriate. How we handle responses to those in particular is a bit - * complex; see dns_lookup() and set_exitconn_info_from_resolve(). - * - * When a lookup is finally complete, the inform_pending_connections() - * function will tell all of the streams that have been waiting for the - * resolve, by calling connection_exit_connect() if the client sent a - * RELAY_BEGIN cell, and by calling send_resolved_cell() or - * send_hostname_cell() if the client sent a RELAY_RESOLVE cell. **/ -#define DNS_PRIVATE - #include "or.h" #include "circuitlist.h" #include "circuituse.h" @@ -57,14 +19,70 @@ #include "connection_edge.h" #include "control.h" #include "dns.h" -#include "main.h" +#include "onion_main.h" #include "policies.h" #include "relay.h" #include "router.h" #include "ht.h" #include "sandbox.h" +#ifdef HAVE_EVENT2_DNS_H #include #include +#else +#include +#include "eventdns.h" +#ifndef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS +#define HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS +#endif +#endif + +#ifndef HAVE_EVENT2_DNS_H +struct evdns_base; +struct evdns_request; +#define evdns_base_new(x,y) tor_malloc(1) +#define evdns_base_clear_nameservers_and_suspend(base) \ + evdns_clear_nameservers_and_suspend() +#define evdns_base_search_clear(base) evdns_search_clear() +#define evdns_base_set_default_outgoing_bind_address(base, a, len) \ + evdns_set_default_outgoing_bind_address((a),(len)) +#define evdns_base_resolv_conf_parse(base, options, fname) \ + evdns_resolv_conf_parse((options), (fname)) +#define evdns_base_count_nameservers(base) \ + evdns_count_nameservers() +#define evdns_base_resume(base) \ + evdns_resume() +#define evdns_base_config_windows_nameservers(base) \ + evdns_config_windows_nameservers() +#define evdns_base_set_option_(base, opt, val) \ + evdns_set_option((opt),(val),DNS_OPTIONS_ALL) +/* Note: our internal eventdns.c, plus Libevent 1.4, used a 1 return to + * signify failure to launch a resolve. Libevent 2.0 uses a -1 return to + * signify a failure on a resolve, though if we're on Libevent 2.0, we should + * have event2/dns.h and never hit these macros. Regardless, 0 is success. */ +#define evdns_base_resolve_ipv4(base, addr, options, cb, ptr) \ + ((evdns_resolve_ipv4((addr), (options), (cb), (ptr))!=0) \ + ? NULL : ((void*)1)) +#define evdns_base_resolve_ipv6(base, addr, options, cb, ptr) \ + ((evdns_resolve_ipv6((addr), (options), (cb), (ptr))!=0) \ + ? NULL : ((void*)1)) +#define evdns_base_resolve_reverse(base, addr, options, cb, ptr) \ + ((evdns_resolve_reverse((addr), (options), (cb), (ptr))!=0) \ + ? NULL : ((void*)1)) +#define evdns_base_resolve_reverse_ipv6(base, addr, options, cb, ptr) \ + ((evdns_resolve_reverse_ipv6((addr), (options), (cb), (ptr))!=0) \ + ? NULL : ((void*)1)) + +#elif defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER < 0x02000303 +#define evdns_base_set_option_(base, opt, val) \ + evdns_base_set_option((base), (opt),(val),DNS_OPTIONS_ALL) + +#else +#define evdns_base_set_option_ evdns_base_set_option + +#endif + +/** Longest hostname we're willing to resolve. */ +#define MAX_ADDRESSLEN 256 /** How long will we wait for an answer from the resolver before we decide * that the resolver is wedged? */ @@ -84,15 +102,107 @@ static char *resolv_conf_fname = NULL; * the nameservers? Used to check whether we need to reconfigure. */ static time_t resolv_conf_mtime = 0; +/** Linked list of connections waiting for a DNS answer. */ +typedef struct pending_connection_t { + edge_connection_t *conn; + struct pending_connection_t *next; +} pending_connection_t; + +/** Value of 'magic' field for cached_resolve_t. Used to try to catch bad + * pointers and memory stomping. */ +#define CACHED_RESOLVE_MAGIC 0x1234F00D + +/* Possible states for a cached resolve_t */ +/** We are waiting for the resolver system to tell us an answer here. + * When we get one, or when we time out, the state of this cached_resolve_t + * will become "DONE" and we'll possibly add a CACHED + * entry. This cached_resolve_t will be in the hash table so that we will + * know not to launch more requests for this addr, but rather to add more + * connections to the pending list for the addr. */ +#define CACHE_STATE_PENDING 0 +/** This used to be a pending cached_resolve_t, and we got an answer for it. + * Now we're waiting for this cached_resolve_t to expire. This should + * have no pending connections, and should not appear in the hash table. */ +#define CACHE_STATE_DONE 1 +/** We are caching an answer for this address. This should have no pending + * connections, and should appear in the hash table. */ +#define CACHE_STATE_CACHED 2 + +/** @name status values for a single DNS request. + * + * @{ */ +/** The DNS request is in progress. */ +#define RES_STATUS_INFLIGHT 1 +/** The DNS request finished and gave an answer */ +#define RES_STATUS_DONE_OK 2 +/** The DNS request finished and gave an error */ +#define RES_STATUS_DONE_ERR 3 +/**@}*/ + +/** A DNS request: possibly completed, possibly pending; cached_resolve + * structs are stored at the OR side in a hash table, and as a linked + * list from oldest to newest. + */ +typedef struct cached_resolve_t { + HT_ENTRY(cached_resolve_t) node; + uint32_t magic; /**< Must be CACHED_RESOLVE_MAGIC */ + char address[MAX_ADDRESSLEN]; /**< The hostname to be resolved. */ + + union { + uint32_t addr_ipv4; /**< IPv4 addr for address, if successful. + * (In host order.) */ + int err_ipv4; /**< One of DNS_ERR_*, if IPv4 lookup failed. */ + } result_ipv4; /**< Outcome of IPv4 lookup */ + union { + struct in6_addr addr_ipv6; /**< IPv6 addr for address, if + * successful */ + int err_ipv6; /**< One of DNS_ERR_*, if IPv6 lookup failed. */ + } result_ipv6; /**< Outcome of IPv6 lookup, if any */ + union { + char *hostname; /** A hostname, if PTR lookup happened successfully*/ + int err_hostname; /** One of DNS_ERR_*, if PTR lookup failed. */ + } result_ptr; + /** @name Status fields + * + * These take one of the RES_STATUS_* values, depending on the state + * of the corresponding lookup. + * + * @{ */ + unsigned int res_status_ipv4 : 2; + unsigned int res_status_ipv6 : 2; + unsigned int res_status_hostname : 2; + /**@}*/ + uint8_t state; /**< Is this cached entry pending/done/informative? */ + + time_t expire; /**< Remove items from cache after this time. */ + uint32_t ttl_ipv4; /**< What TTL did the nameserver tell us? */ + uint32_t ttl_ipv6; /**< What TTL did the nameserver tell us? */ + uint32_t ttl_hostname; /**< What TTL did the nameserver tell us? */ + /** Connections that want to know when we get an answer for this resolve. */ + pending_connection_t *pending_connections; + /** Position of this element in the heap*/ + int minheap_idx; +} cached_resolve_t; + static void purge_expired_resolves(time_t now); static void dns_found_answer(const char *address, uint8_t query_type, int dns_answer, const tor_addr_t *addr, const char *hostname, uint32_t ttl); +static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type, + const cached_resolve_t *resolve); +static int launch_resolve(cached_resolve_t *resolve); static void add_wildcarded_test_address(const char *address); static int configure_nameservers(int force); static int answer_is_wildcarded(const char *ip); +static int dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, + or_circuit_t *oncirc, char **resolved_to_hostname, + int *made_connection_pending_out, + cached_resolve_t **resolve_out); +static int set_exitconn_info_from_resolve(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out); static int evdns_err_is_transient(int err); static void inform_pending_connections(cached_resolve_t *resolve); static void make_pending_resolve_cached(cached_resolve_t *cached); @@ -102,7 +212,7 @@ static void assert_cache_ok_(void); #define assert_cache_ok() assert_cache_ok_() #else #define assert_cache_ok() STMT_NIL -#endif /* defined(DEBUG_DNS_CACHE) */ +#endif static void assert_resolve_ok(cached_resolve_t *resolve); /** Hash table of cached_resolve objects. */ @@ -117,7 +227,7 @@ static int dns_is_broken_for_ipv6 = 0; /** Function to compare hashed resolves on their addresses; used to * implement hash tables. */ -static inline int +static INLINE int cached_resolves_eq(cached_resolve_t *a, cached_resolve_t *b) { /* make this smarter one day? */ @@ -126,16 +236,16 @@ cached_resolves_eq(cached_resolve_t *a, cached_resolve_t *b) } /** Hash function for cached_resolve objects */ -static inline unsigned int +static INLINE unsigned int cached_resolve_hash(cached_resolve_t *a) { - return (unsigned) siphash24g((const uint8_t*)a->address, strlen(a->address)); + return ht_string_hash(a->address); } HT_PROTOTYPE(cache_map, cached_resolve_t, node, cached_resolve_hash, cached_resolves_eq) -HT_GENERATE2(cache_map, cached_resolve_t, node, cached_resolve_hash, - cached_resolves_eq, 0.6, tor_reallocarray_, tor_free_) +HT_GENERATE(cache_map, cached_resolve_t, node, cached_resolve_hash, + cached_resolves_eq, 0.6, malloc, realloc, free) /** Initialize the DNS cache. */ static void @@ -160,9 +270,8 @@ evdns_log_cb(int warn, const char *msg) } if (!strcmpstart(msg, "Nameserver ") && (cp=strstr(msg, " has failed: "))) { char *ns = tor_strndup(msg+11, cp-(msg+11)); - const char *colon = strchr(cp, ':'); - tor_assert(colon); - const char *err = colon+2; + const char *err = strchr(cp, ':')+2; + tor_assert(err); /* Don't warn about a single failed nameserver; we'll warn with 'all * nameservers have failed' if we're completely out of nameservers; * otherwise, the situation is tolerable. */ @@ -182,18 +291,6 @@ evdns_log_cb(int warn, const char *msg) } else if (!strcmp(msg, "All nameservers have failed")) { control_event_server_status(LOG_WARN, "NAMESERVER_ALL_DOWN"); all_down = 1; - } else if (!strcmpstart(msg, "Address mismatch on received DNS")) { - static ratelim_t mismatch_limit = RATELIM_INIT(3600); - const char *src = strstr(msg, " Apparent source"); - if (!src || get_options()->SafeLogging) { - src = ""; - } - log_fn_ratelim(&mismatch_limit, severity, LD_EXIT, - "eventdns: Received a DNS packet from " - "an IP address to which we did not send a request. This " - "could be a DNS spoofing attempt, or some kind of " - "misconfiguration.%s", src); - return; } tor_log(severity, LD_EXIT, "eventdns: %s", msg); } @@ -256,19 +353,29 @@ has_dns_init_failed(void) } /** Helper: Given a TTL from a DNS response, determine what TTL to give the - * OP that asked us to resolve it, and how long to cache that record - * ourselves. */ + * OP that asked us to resolve it. */ uint32_t dns_clip_ttl(uint32_t ttl) { - /* This logic is a defense against "DefectTor" DNS-based traffic - * confirmation attacks, as in https://nymity.ch/tor-dns/tor-dns.pdf . - * We only give two values: a "low" value and a "high" value. - */ - if (ttl < MIN_DNS_TTL_AT_EXIT) - return MIN_DNS_TTL_AT_EXIT; + if (ttl < MIN_DNS_TTL) + return MIN_DNS_TTL; + else if (ttl > MAX_DNS_TTL) + return MAX_DNS_TTL; else - return MAX_DNS_TTL_AT_EXIT; + return ttl; +} + +/** Helper: Given a TTL from a DNS response, determine how long to hold it in + * our cache. */ +static uint32_t +dns_get_expiry_ttl(uint32_t ttl) +{ + if (ttl < MIN_DNS_TTL) + return MIN_DNS_TTL; + else if (ttl > MAX_DNS_ENTRY_AGE) + return MAX_DNS_ENTRY_AGE; + else + return ttl; } /** Helper: free storage held by an entry in the DNS cache. */ @@ -339,7 +446,7 @@ cached_resolve_add_answer(cached_resolve_t *resolve, resolve->result_ipv4.err_ipv4 = dns_result; resolve->res_status_ipv4 = RES_STATUS_DONE_ERR; } - resolve->ttl_ipv4 = ttl; + } else if (query_type == DNS_IPv6_AAAA) { if (resolve->res_status_ipv6 != RES_STATUS_INFLIGHT) return; @@ -354,7 +461,6 @@ cached_resolve_add_answer(cached_resolve_t *resolve, resolve->result_ipv6.err_ipv6 = dns_result; resolve->res_status_ipv6 = RES_STATUS_DONE_ERR; } - resolve->ttl_ipv6 = ttl; } } @@ -378,7 +484,7 @@ set_expiry(cached_resolve_t *resolve, time_t expires) resolve->expire = expires; smartlist_pqueue_add(cached_resolve_pqueue, compare_cached_resolves_by_expiry_, - offsetof(cached_resolve_t, minheap_idx), + STRUCT_OFFSET(cached_resolve_t, minheap_idx), resolve); } @@ -425,7 +531,7 @@ purge_expired_resolves(time_t now) break; smartlist_pqueue_pop(cached_resolve_pqueue, compare_cached_resolves_by_expiry_, - offsetof(cached_resolve_t, minheap_idx)); + STRUCT_OFFSET(cached_resolve_t, minheap_idx)); if (resolve->state == CACHE_STATE_PENDING) { log_debug(LD_EXIT, @@ -452,12 +558,10 @@ purge_expired_resolves(time_t now) /* Connections should only be pending if they have no socket. */ tor_assert(!SOCKET_OK(pend->conn->base_.s)); pendconn = pend->conn; - /* Prevent double-remove */ - pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; if (!pendconn->base_.marked_for_close) { connection_edge_end(pendconn, END_STREAM_REASON_TIMEOUT); circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); - connection_free_(TO_CONN(pendconn)); + connection_free(TO_CONN(pendconn)); } tor_free(pend); } @@ -499,9 +603,9 @@ purge_expired_resolves(time_t now) * answer back along circ; otherwise, send the answer back along * conn's attached circuit. */ -MOCK_IMPL(STATIC void, -send_resolved_cell,(edge_connection_t *conn, uint8_t answer_type, - const cached_resolve_t *resolved)) +static void +send_resolved_cell(edge_connection_t *conn, uint8_t answer_type, + const cached_resolve_t *resolved) { char buf[RELAY_PAYLOAD_SIZE], *cp = buf; size_t buflen = 0; @@ -535,7 +639,6 @@ send_resolved_cell,(edge_connection_t *conn, uint8_t answer_type, answer_type = RESOLVED_TYPE_ERROR; /* fall through. */ } - /* Falls through. */ case RESOLVED_TYPE_ERROR_TRANSIENT: case RESOLVED_TYPE_ERROR: { @@ -566,9 +669,8 @@ send_resolved_cell,(edge_connection_t *conn, uint8_t answer_type, * answer back along circ; otherwise, send the answer back along * conn's attached circuit. */ -MOCK_IMPL(STATIC void, -send_resolved_hostname_cell,(edge_connection_t *conn, - const char *hostname)) +static void +send_resolved_hostname_cell(edge_connection_t *conn, const char *hostname) { char buf[RELAY_PAYLOAD_SIZE]; size_t buflen; @@ -670,7 +772,7 @@ dns_resolve(edge_connection_t *exitconn) /* If we made the connection pending, then we freed it already in * dns_cancel_pending_resolve(). If we marked it for close, it'll * get freed from the main loop. Otherwise, can free it now. */ - connection_free_(TO_CONN(exitconn)); + connection_free(TO_CONN(exitconn)); } break; default: @@ -696,11 +798,11 @@ dns_resolve(edge_connection_t *exitconn) * * Set *resolve_out to a cached resolve, if we found one. */ -MOCK_IMPL(STATIC int, -dns_resolve_impl,(edge_connection_t *exitconn, int is_resolve, +static int +dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, or_circuit_t *oncirc, char **hostname_out, int *made_connection_pending_out, - cached_resolve_t **resolve_out)) + cached_resolve_t **resolve_out) { cached_resolve_t *resolve; cached_resolve_t search; @@ -834,14 +936,8 @@ dns_resolve_impl,(edge_connection_t *exitconn, int is_resolve, } /** Given an exit connection exitconn, and a cached_resolve_t - * resolve whose DNS lookups have all either succeeded or failed, - * update the appropriate fields (address_ttl and addr) of exitconn. - * - * The logic can be complicated here, since we might have launched both - * an A lookup and an AAAA lookup, and since either of those might have - * succeeded or failed, and since we want to answer a RESOLVE cell with - * a full answer but answer a BEGIN cell with whatever answer the client - * would accept and we could still connect to. + * resolve whose DNS lookups have all succeeded or failed, update the + * appropriate fields (address_ttl and addr) of exitconn. * * If this is a reverse lookup, set *hostname_out to a newly allocated * copy of the name resulting hostname. @@ -849,10 +945,10 @@ dns_resolve_impl,(edge_connection_t *exitconn, int is_resolve, * Return -2 on a transient error, -1 on a permenent error, and 1 on * a successful lookup. */ -MOCK_IMPL(STATIC int, -set_exitconn_info_from_resolve,(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out)) +static int +set_exitconn_info_from_resolve(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out) { int ipv4_ok, ipv6_ok, answer_with_ipv4, r; uint32_t begincell_flags; @@ -961,14 +1057,14 @@ assert_connection_edge_not_dns_pending(edge_connection_t *conn) for (pend = resolve->pending_connections; pend; pend = pend->next) { tor_assert(pend->conn != conn); } -#else /* !(1) */ +#else cached_resolve_t **resolve; HT_FOREACH(resolve, cache_map, &cache_root) { for (pend = (*resolve)->pending_connections; pend; pend = pend->next) { tor_assert(pend->conn != conn); } } -#endif /* 1 */ +#endif } /** Log an error and abort if any connection waiting for a DNS resolve is @@ -1037,9 +1133,7 @@ connection_dns_remove(edge_connection_t *conn) return; /* more are pending */ } } - log_warn(LD_BUG, "Connection (fd "TOR_SOCKET_T_FORMAT") was not waiting " - "for a resolve of %s, but we tried to remove it.", - conn->base_.s, escaped_safe_str(conn->base_.address)); + tor_assert(0); /* not reachable unless onlyconn not in pending list */ } } @@ -1047,8 +1141,8 @@ connection_dns_remove(edge_connection_t *conn) * the resolve for address itself, and remove any cached results for * address from the cache. */ -MOCK_IMPL(void, -dns_cancel_pending_resolve,(const char *address)) +void +dns_cancel_pending_resolve(const char *address) { pending_connection_t *pend; cached_resolve_t search; @@ -1101,7 +1195,7 @@ dns_cancel_pending_resolve,(const char *address)) if (circ) circuit_detach_stream(circ, pendconn); if (!pendconn->base_.marked_for_close) - connection_free_(TO_CONN(pendconn)); + connection_free(TO_CONN(pendconn)); resolve->pending_connections = pend->next; tor_free(pend); } @@ -1120,7 +1214,7 @@ dns_cancel_pending_resolve,(const char *address)) /** Return true iff address is one of the addresses we use to verify * that well-known sites aren't being hijacked by our DNS servers. */ -static inline int +static INLINE int is_test_address(const char *address) { const or_options_t *options = get_options(); @@ -1184,12 +1278,7 @@ dns_found_answer(const char *address, uint8_t query_type, /** Given a pending cached_resolve_t that we just finished resolving, * inform every connection that was waiting for the outcome of that - * resolution. - * - * Do this by sending a RELAY_RESOLVED cell (if the pending stream had sent us - * RELAY_RESOLVE cell), or by launching an exit connection (if the pending - * stream had send us a RELAY_BEGIN cell). - */ + * resolution. */ static void inform_pending_connections(cached_resolve_t *resolve) { @@ -1230,7 +1319,7 @@ inform_pending_connections(cached_resolve_t *resolve) /* This detach must happen after we send the resolved cell. */ circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); } - connection_free_(TO_CONN(pendconn)); + connection_free(TO_CONN(pendconn)); } else { circuit_t *circ; if (pendconn->base_.purpose == EXIT_PURPOSE_CONNECT) { @@ -1259,12 +1348,11 @@ inform_pending_connections(cached_resolve_t *resolve) circ = circuit_get_by_edge_conn(pendconn); tor_assert(circ); circuit_detach_stream(circ, pendconn); - connection_free_(TO_CONN(pendconn)); + connection_free(TO_CONN(pendconn)); } } resolve->pending_connections = pend->next; tor_free(pend); - tor_free(hostname); } } @@ -1322,7 +1410,7 @@ make_pending_resolve_cached(cached_resolve_t *resolve) resolve->ttl_hostname < ttl) ttl = resolve->ttl_hostname; - set_expiry(new_resolve, time(NULL) + dns_clip_ttl(ttl)); + set_expiry(new_resolve, time(NULL) + dns_get_expiry_ttl(ttl)); } assert_cache_ok(); @@ -1372,9 +1460,25 @@ configure_nameservers(int force) } } +#ifdef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS + if (! tor_addr_is_null(&options->OutboundBindAddressIPv4_)) { + int socklen; + struct sockaddr_storage ss; + socklen = tor_addr_to_sockaddr(&options->OutboundBindAddressIPv4_, 0, + (struct sockaddr *)&ss, sizeof(ss)); + if (socklen <= 0) { + log_warn(LD_BUG, "Couldn't convert outbound bind address to sockaddr." + " Ignoring."); + } else { + evdns_base_set_default_outgoing_bind_address(the_evdns_base, + (struct sockaddr *)&ss, + socklen); + } + } +#endif + evdns_set_log_fn(evdns_log_cb); if (conf_fname) { - log_debug(LD_FS, "stat()ing %s", conf_fname); if (stat(sandbox_intern_string(conf_fname), &st)) { log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s", conf_fname, strerror(errno)); @@ -1392,11 +1496,10 @@ configure_nameservers(int force) #if defined(DNS_OPTION_HOSTSFILE) && defined(USE_LIBSECCOMP) if (flags & DNS_OPTION_HOSTSFILE) { flags ^= DNS_OPTION_HOSTSFILE; - log_debug(LD_FS, "Loading /etc/hosts"); evdns_base_load_hosts(the_evdns_base, sandbox_intern_string("/etc/hosts")); } -#endif /* defined(DNS_OPTION_HOSTSFILE) && defined(USE_LIBSECCOMP) */ +#endif log_info(LD_EXIT, "Parsing resolver configuration in '%s'", conf_fname); if ((r = evdns_base_resolv_conf_parse(the_evdns_base, flags, sandbox_intern_string(conf_fname)))) { @@ -1434,35 +1537,18 @@ configure_nameservers(int force) tor_free(resolv_conf_fname); resolv_conf_mtime = 0; } -#endif /* defined(_WIN32) */ +#endif -#define SET(k,v) evdns_base_set_option(the_evdns_base, (k), (v)) +#define SET(k,v) evdns_base_set_option_(the_evdns_base, (k), (v)) - // If we only have one nameserver, it does not make sense to back off - // from it for a timeout. Unfortunately, the value for max-timeouts is - // currently clamped by libevent to 255, but it does not hurt to set - // it higher in case libevent gets a patch for this. - // Reducing attempts in the case of just one name server too, because - // it is very likely to be a local one where a network connectivity - // issue should not cause an attempt to fail. if (evdns_base_count_nameservers(the_evdns_base) == 1) { - SET("max-timeouts:", "1000000"); - SET("attempts:", "1"); + SET("max-timeouts:", "16"); + SET("timeout:", "10"); } else { SET("max-timeouts:", "3"); + SET("timeout:", "5"); } - // Elongate the queue of maximum inflight dns requests, so if a bunch - // time out at the resolver (happens commonly with unbound) we won't - // stall every other DNS request. This potentially means some wasted - // CPU as there's a walk over a linear queue involved, but this is a - // much better tradeoff compared to just failing DNS requests because - // of a full queue. - SET("max-inflight:", "8192"); - - // Time out after 5 seconds if no reply. - SET("timeout:", "5"); - if (options->ServerDNSRandomizeCase) SET("randomize-case:", "1"); else @@ -1578,11 +1664,10 @@ evdns_callback(int result, char type, int count, int ttl, void *addresses, escaped_safe_str(hostname)); tor_free(escaped_address); } else if (count) { - log_info(LD_EXIT, "eventdns returned only unrecognized answer types " - " for %s.", + log_warn(LD_EXIT, "eventdns returned only non-IPv4 answers for %s.", escaped_safe_str(string_address)); } else { - log_info(LD_EXIT, "eventdns returned no addresses or error for %s.", + log_warn(LD_BUG, "eventdns returned no addresses or error for %s!", escaped_safe_str(string_address)); } } @@ -1660,13 +1745,13 @@ launch_one_resolve(const char *address, uint8_t query_type, /** For eventdns: start resolving as necessary to find the target for * exitconn. Returns -1 on error, -2 on transient error, * 0 on "resolve launched." */ -MOCK_IMPL(STATIC int, -launch_resolve,(cached_resolve_t *resolve)) +static int +launch_resolve(cached_resolve_t *resolve) { tor_addr_t a; int r; - if (net_is_disabled()) + if (get_options()->DisableNetwork) return -1; /* What? Nameservers not configured? Sounds like a bug. */ @@ -1773,7 +1858,7 @@ wildcard_increment_answer(const char *id) "invalid addresses. Apparently they are hijacking DNS failures. " "I'll try to correct for this by treating future occurrences of " "\"%s\" as 'not found'.", id, *ip, id); - smartlist_add_strdup(dns_wildcard_list, id); + smartlist_add(dns_wildcard_list, tor_strdup(id)); } if (!dns_wildcard_notice_given) control_event_server_status(LOG_NOTICE, "DNS_HIJACKED"); @@ -1797,7 +1882,7 @@ add_wildcarded_test_address(const char *address) n_test_addrs = get_options()->ServerDNSTestAddresses ? smartlist_len(get_options()->ServerDNSTestAddresses) : 0; - smartlist_add_strdup(dns_wildcarded_test_address_list, address); + smartlist_add(dns_wildcarded_test_address_list, tor_strdup(address)); n = smartlist_len(dns_wildcarded_test_address_list); if (n > n_test_addrs/2) { tor_log(dns_wildcarded_test_address_notice_given ? LOG_INFO : LOG_NOTICE, @@ -1901,7 +1986,7 @@ launch_test_addresses(evutil_socket_t fd, short event, void *args) (void)event; (void)args; - if (net_is_disabled()) + if (options->DisableNetwork) return; log_info(LD_EXIT, "Launching checks to see whether our nameservers like to " @@ -1958,7 +2043,7 @@ dns_launch_wildcard_checks(void) launch_wildcard_check(8, 16, ipv6, ".com"); launch_wildcard_check(8, 16, ipv6, ".org"); launch_wildcard_check(8, 16, ipv6, ".net"); - } + } } } @@ -2051,7 +2136,7 @@ assert_resolve_ok(cached_resolve_t *resolve) tor_assert(!resolve->hostname); else tor_assert(!resolve->result_ipv4.addr_ipv4); -#endif /* 0 */ +#endif /*XXXXX ADD MORE */ } } @@ -2086,7 +2171,7 @@ static void assert_cache_ok_(void) { cached_resolve_t **resolve; - int bad_rep = HT_REP_IS_BAD_(cache_map, &cache_root); + int bad_rep = _cache_map_HT_REP_IS_BAD(&cache_root); if (bad_rep) { log_err(LD_BUG, "Bad rep type %d on dns cache hash table", bad_rep); tor_assert(!bad_rep); @@ -2101,7 +2186,7 @@ assert_cache_ok_(void) smartlist_pqueue_assert_ok(cached_resolve_pqueue, compare_cached_resolves_by_expiry_, - offsetof(cached_resolve_t, minheap_idx)); + STRUCT_OFFSET(cached_resolve_t, minheap_idx)); SMARTLIST_FOREACH(cached_resolve_pqueue, cached_resolve_t *, res, { @@ -2114,18 +2199,5 @@ assert_cache_ok_(void) } }); } - -#endif /* defined(DEBUG_DNS_CACHE) */ - -cached_resolve_t * -dns_get_cache_entry(cached_resolve_t *query) -{ - return HT_FIND(cache_map, &cache_root, query); -} - -void -dns_insert_cache_entry(cached_resolve_t *new_entry) -{ - HT_INSERT(cache_map, &cache_root, new_entry); -} +#endif diff --git a/src/tor/dns.h b/src/tor/dns.h new file mode 100644 index 000000000..022cd4ac6 --- /dev/null +++ b/src/tor/dns.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file dns.h + * \brief Header file for dns.c. + **/ + +#ifndef TOR_DNS_H +#define TOR_DNS_H + +int dns_init(void); +int has_dns_init_failed(void); +void dns_free_all(void); +uint32_t dns_clip_ttl(uint32_t ttl); +int dns_reset(void); +void connection_dns_remove(edge_connection_t *conn); +void assert_connection_edge_not_dns_pending(edge_connection_t *conn); +void assert_all_pending_dns_resolves_ok(void); +void dns_cancel_pending_resolve(const char *question); +int dns_resolve(edge_connection_t *exitconn); +void dns_launch_correctness_checks(void); +int dns_seems_to_be_broken(void); +int dns_seems_to_be_broken_for_ipv6(void); +void dns_reset_correctness_checks(void); +void dump_dns_mem_usage(int severity); + +#endif + diff --git a/src/tor/src/or/dnsserv.c b/src/tor/dnsserv.c similarity index 79% rename from src/tor/src/or/dnsserv.c rename to src/tor/dnsserv.c index 9385561d9..9ac42e40f 100644 --- a/src/tor/src/or/dnsserv.c +++ b/src/tor/dnsserv.c @@ -1,24 +1,11 @@ -/* Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** - * \file dnsserv.c - * \brief Implements client-side DNS proxy server code. - * - * When a user enables the DNSPort configuration option to have their local - * Tor client handle DNS requests, this module handles it. It functions as a - * "DNS Server" on the client side, which client applications use. - * - * Inbound DNS requests are represented as entry_connection_t here (since - * that's how Tor represents client-side streams), which are kept associated - * with an evdns_server_request structure as exposed by Libevent's - * evdns code. - * - * Upon receiving a DNS request, libevent calls our evdns_server_callback() - * function here, which causes this module to create an entry_connection_t - * request as appropriate. Later, when that request is answered, - * connection_edge.c calls dnsserv_resolved() so we can finish up and tell the - * DNS client. + * \file dnsserv.c \brief Implements client-side DNS proxy server code. Note: + * this is the DNS Server code, not the Server DNS code. Confused? This code + * runs on client-side, and acts as a DNS server. The code in dns.c, on the + * other hand, runs on Tor servers, and acts as a DNS client. **/ #include "or.h" @@ -27,12 +14,16 @@ #include "connection.h" #include "connection_edge.h" #include "control.h" -#include "main.h" +#include "onion_main.h" #include "policies.h" +#ifdef HAVE_EVENT2_DNS_H #include #include /* XXXX this implies we want an improved evdns */ #include +#else +#include "eventdns.h" +#endif /** Helper function: called by evdns whenever the client sends a request to our * DNSPort. We need to eventually answer the request req. @@ -44,7 +35,7 @@ evdns_server_callback(struct evdns_server_request *req, void *data_) entry_connection_t *entry_conn; edge_connection_t *conn; int i = 0; - struct evdns_server_question *q = NULL, *supported_q = NULL; + struct evdns_server_question *q = NULL; struct sockaddr_storage addr; struct sockaddr *sa; int addrlen; @@ -100,31 +91,27 @@ evdns_server_callback(struct evdns_server_request *req, void *data_) case EVDNS_TYPE_A: case EVDNS_TYPE_AAAA: case EVDNS_TYPE_PTR: - /* We always pick the first one of these questions, if there is - one. */ - if (! supported_q) - supported_q = req->questions[i]; - break; + q = req->questions[i]; default: break; } } - if (supported_q) - q = supported_q; if (!q) { log_info(LD_APP, "None of the questions we got were ones we're willing " "to support. Sending NOTIMPL."); evdns_server_request_respond(req, DNS_ERR_NOTIMPL); return; } + if (q->type != EVDNS_TYPE_A && q->type != EVDNS_TYPE_AAAA) { + tor_assert(q->type == EVDNS_TYPE_PTR); + } /* Make sure the name isn't too long: This should be impossible, I think. */ if (err == DNS_ERR_NONE && strlen(q->name) > MAX_SOCKS_ADDR_LEN-1) err = DNS_ERR_FORMAT; - if (err != DNS_ERR_NONE || !supported_q) { - /* We got an error? There's no question we're willing to answer? Then - * send back an answer immediately; we're done. */ + if (err != DNS_ERR_NONE) { + /* We got an error? Then send back an answer immediately; we're done. */ evdns_server_request_respond(req, err); return; } @@ -132,47 +119,31 @@ evdns_server_callback(struct evdns_server_request *req, void *data_) /* Make a new dummy AP connection, and attach the request to it. */ entry_conn = entry_connection_new(CONN_TYPE_AP, AF_INET); conn = ENTRY_TO_EDGE_CONN(entry_conn); - CONNECTION_AP_EXPECT_NONPENDING(entry_conn); TO_CONN(conn)->state = AP_CONN_STATE_RESOLVE_WAIT; conn->is_dns_request = 1; tor_addr_copy(&TO_CONN(conn)->addr, &tor_addr); TO_CONN(conn)->port = port; - TO_CONN(conn)->address = tor_addr_to_str_dup(&tor_addr); + TO_CONN(conn)->address = tor_dup_addr(&tor_addr); - if (q->type == EVDNS_TYPE_A || q->type == EVDNS_TYPE_AAAA || - q->type == EVDNS_QTYPE_ALL) { + if (q->type == EVDNS_TYPE_A || q->type == EVDNS_TYPE_AAAA) entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE; - } else { - tor_assert(q->type == EVDNS_TYPE_PTR); + else entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - } - - /* This serves our DNS port so enable DNS request by default. */ - entry_conn->entry_cfg.dns_request = 1; - if (q->type == EVDNS_TYPE_A || q->type == EVDNS_QTYPE_ALL) { - entry_conn->entry_cfg.ipv4_traffic = 1; - entry_conn->entry_cfg.ipv6_traffic = 0; - entry_conn->entry_cfg.prefer_ipv6 = 0; - } else if (q->type == EVDNS_TYPE_AAAA) { - entry_conn->entry_cfg.ipv4_traffic = 0; - entry_conn->entry_cfg.ipv6_traffic = 1; - entry_conn->entry_cfg.prefer_ipv6 = 1; - } strlcpy(entry_conn->socks_request->address, q->name, sizeof(entry_conn->socks_request->address)); entry_conn->socks_request->listener_type = listener->base_.type; entry_conn->dns_server_request = req; - entry_conn->entry_cfg.isolation_flags = listener->entry_cfg.isolation_flags; - entry_conn->entry_cfg.session_group = listener->entry_cfg.session_group; + entry_conn->isolation_flags = listener->isolation_flags; + entry_conn->session_group = listener->session_group; entry_conn->nym_epoch = get_signewnym_epoch(); if (connection_add(ENTRY_TO_CONN(entry_conn)) < 0) { log_warn(LD_APP, "Couldn't register dummy connection for DNS request"); evdns_server_request_respond(req, DNS_ERR_SERVERFAILED); - connection_free_(ENTRY_TO_CONN(entry_conn)); + connection_free(ENTRY_TO_CONN(entry_conn)); return; } @@ -209,13 +180,12 @@ dnsserv_launch_request(const char *name, int reverse, /* Make a new dummy AP connection, and attach the request to it. */ entry_conn = entry_connection_new(CONN_TYPE_AP, AF_INET); conn = ENTRY_TO_EDGE_CONN(entry_conn); - CONNECTION_AP_EXPECT_NONPENDING(entry_conn); conn->base_.state = AP_CONN_STATE_RESOLVE_WAIT; tor_addr_copy(&TO_CONN(conn)->addr, &control_conn->base_.addr); #ifdef AF_UNIX /* - * The control connection can be AF_UNIX and if so tor_addr_to_str_dup will + * The control connection can be AF_UNIX and if so tor_dup_addr will * unhelpfully say ""; say "(Tor_internal)" * instead. */ @@ -224,12 +194,12 @@ dnsserv_launch_request(const char *name, int reverse, TO_CONN(conn)->address = tor_strdup("(Tor_internal)"); } else { TO_CONN(conn)->port = control_conn->base_.port; - TO_CONN(conn)->address = tor_addr_to_str_dup(&control_conn->base_.addr); + TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr); } -#else /* !(defined(AF_UNIX)) */ +#else TO_CONN(conn)->port = control_conn->base_.port; - TO_CONN(conn)->address = tor_addr_to_str_dup(&control_conn->base_.addr); -#endif /* defined(AF_UNIX) */ + TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr); +#endif if (reverse) entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; @@ -243,13 +213,13 @@ dnsserv_launch_request(const char *name, int reverse, entry_conn->socks_request->listener_type = CONN_TYPE_CONTROL_LISTENER; entry_conn->original_dest_address = tor_strdup(name); - entry_conn->entry_cfg.session_group = SESSION_GROUP_CONTROL_RESOLVE; + entry_conn->session_group = SESSION_GROUP_CONTROL_RESOLVE; entry_conn->nym_epoch = get_signewnym_epoch(); - entry_conn->entry_cfg.isolation_flags = ISO_DEFAULT; + entry_conn->isolation_flags = ISO_DEFAULT; if (connection_add(TO_CONN(conn))<0) { log_warn(LD_APP, "Couldn't register dummy connection for RESOLVE request"); - connection_free_(TO_CONN(conn)); + connection_free(TO_CONN(conn)); return -1; } @@ -284,7 +254,7 @@ dnsserv_reject_request(entry_connection_t *conn) } /** Look up the original name that corresponds to 'addr' in req. We use this - * to preserve case in order to facilitate clients using 0x20-hacks to avoid + * to preserve case in order to facilitate people using 0x20-hacks to avoid * DNS poisoning. */ static const char * evdns_get_orig_address(const struct evdns_server_request *req, @@ -302,10 +272,6 @@ evdns_get_orig_address(const struct evdns_server_request *req, case RESOLVED_TYPE_IPV6: type = EVDNS_TYPE_AAAA; break; - case RESOLVED_TYPE_ERROR: - case RESOLVED_TYPE_ERROR_TRANSIENT: - /* Addr doesn't matter, since we're not sending it back in the reply.*/ - return addr; default: tor_fragile_assert(); return addr; diff --git a/src/tor/src/or/dnsserv.h b/src/tor/dnsserv.h similarity index 89% rename from src/tor/src/or/dnsserv.h rename to src/tor/dnsserv.h index 2af366eee..687a77e59 100644 --- a/src/tor/src/or/dnsserv.h +++ b/src/tor/dnsserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -23,5 +23,5 @@ void dnsserv_reject_request(entry_connection_t *conn); int dnsserv_launch_request(const char *name, int is_reverse, control_connection_t *control_conn); -#endif /* !defined(TOR_DNSSERV_H) */ +#endif diff --git a/src/tor/doc/HACKING/CodingStandards.md b/src/tor/doc/HACKING/CodingStandards.md deleted file mode 100644 index 79a6a9f0c..000000000 --- a/src/tor/doc/HACKING/CodingStandards.md +++ /dev/null @@ -1,419 +0,0 @@ -Coding conventions for Tor -========================== - -tl;dr: - - - Run configure with `--enable-fatal-warnings` - - Document your functions - - Write unit tests - - Run `make check` before submitting a patch - - Run `make distcheck` if you have made changes to build system components - - Add a file in `changes` for your branch. - -Patch checklist ---------------- - -If possible, send your patch as one of these (in descending order of -preference) - - - A git branch we can pull from - - Patches generated by git format-patch - - A unified diff - -Did you remember... - - - To build your code while configured with `--enable-fatal-warnings`? - - To run `make check-docs` to see whether all new options are on - the manpage? - - To write unit tests, as possible? - - To run `make test-full` to test against all unit and integration tests (or - `make test-full-online` if you have a working connection to the internet)? - - To test that the distribution will actually work via `make distcheck`? - - To base your code on the appropriate branch? - - To include a file in the `changes` directory as appropriate? - -If you are submitting a major patch or new feature, or want to in the future... - - - Set up Chutney and Stem, see HACKING/WritingTests.md - - Run `make test-full` to test against all unit and integration tests. - -If you have changed build system components: - - Please run `make distcheck` - - For example, if you have changed Makefiles, autoconf files, or anything - else that affects the build system. - -How we use Git branches -======================= - -Each main development series (like 0.2.1, 0.2.2, etc) has its main work -applied to a single branch. At most one series can be the development series -at a time; all other series are maintenance series that get bug-fixes only. -The development series is built in a git branch called "master"; the -maintenance series are built in branches called "maint-0.2.0", "maint-0.2.1", -and so on. We regularly merge the active maint branches forward. - -For all series except the development series, we also have a "release" branch -(as in "release-0.2.1"). The release series is based on the corresponding -maintenance series, except that it deliberately lags the maint series for -most of its patches, so that bugfix patches are not typically included in a -maintenance release until they've been tested for a while in a development -release. Occasionally, we'll merge an urgent bugfix into the release branch -before it gets merged into maint, but that's rare. - -If you're working on a bugfix for a bug that occurs in a particular version, -base your bugfix branch on the "maint" branch for the first supported series -that has that bug. (As of June 2013, we're supporting 0.2.3 and later.) - -If you're working on a new feature, base it on the master branch. If you're -working on a new feature and it will take a while to implement and/or you'd -like to avoid the possibility of unrelated bugs in Tor while you're -implementing your feature, consider branching off of the latest maint- branch. -_Never_ branch off a relase- branch. Don't branch off a tag either: they come -from release branches. Doing so will likely produce a nightmare of merge -conflicts in the ChangeLog when it comes time to merge your branch into Tor. -Best advice: don't try to keep an independent branch forked for more than 6 -months and expect it to merge cleanly. Try to merge pieces early and often. - - -How we log changes -================== - -When you do a commit that needs a ChangeLog entry, add a new file to -the `changes` toplevel subdirectory. It should have the format of a -one-entry changelog section from the current ChangeLog file, as in - -- Major bugfixes: - - Fix a potential buffer overflow. Fixes bug 99999; bugfix on - 0.3.1.4-beta. - -To write a changes file, first categorize the change. Some common categories -are: Minor bugfixes, Major bugfixes, Minor features, Major features, Code -simplifications and refactoring. Then say what the change does. If -it's a bugfix, mention what bug it fixes and when the bug was -introduced. To find out which Git tag the change was introduced in, -you can use `git describe --contains `. - -If at all possible, try to create this file in the same commit where you are -making the change. Please give it a distinctive name that no other branch will -use for the lifetime of your change. To verify the format of the changes file, -you can use `make check-changes`. This is run automatically as part of -`make check` -- if it fails, we must fix it before we release. These -checks are implemented in `scripts/maint/lintChanges.py`. - -Changes file style guide: - * Changes files begin with " o Header (subheading):". The header - should usually be "Minor/Major bugfixes/features". The subheading is a - particular area within Tor. See the ChangeLog for examples. - - * Make everything terse. - - * Write from the user's point of view: describe the user-visible changes - right away. - - * Mention configuration options by name. If they're rare or unusual, - remind people what they're for. - - * Describe changes in the present tense and in the imperative: not past. - - * Every bugfix should have a sentence of the form "Fixes bug 1234; bugfix - on 0.1.2.3-alpha", describing what bug was fixed and where it came from. - - * "Relays", not "servers", "nodes", or "Tor relays". - -When we go to make a release, we will concatenate all the entries -in changes to make a draft changelog, and clear the directory. We'll -then edit the draft changelog into a nice readable format. - -What needs a changes file? - - * A not-exhaustive list: Anything that might change user-visible - behavior. Anything that changes internals, documentation, or the build - system enough that somebody could notice. Big or interesting code - rewrites. Anything about which somebody might plausibly wonder "when - did that happen, and/or why did we do that" 6 months down the line. - -What does not need a changes file? - - * Bugfixes for code that hasn't shipped in any released version of Tor - -Why use changes files instead of Git commit messages? - - * Git commit messages are written for developers, not users, and they - are nigh-impossible to revise after the fact. - -Why use changes files instead of entries in the ChangeLog? - - * Having every single commit touch the ChangeLog file tended to create - zillions of merge conflicts. - -Whitespace and C conformance ----------------------------- - -Invoke `make check-spaces` from time to time, so it can tell you about -deviations from our C whitespace style. Generally, we use: - - - Unix-style line endings - - K&R-style indentation - - No space before newlines - - A blank line at the end of each file - - Never more than one blank line in a row - - Always spaces, never tabs - - No more than 79-columns per line. - - Two spaces per indent. - - A space between control keywords and their corresponding paren - `if (x)`, `while (x)`, and `switch (x)`, never `if(x)`, `while(x)`, or - `switch(x)`. - - A space between anything and an open brace. - - No space between a function name and an opening paren. `puts(x)`, not - `puts (x)`. - - Function declarations at the start of the line. - -We try hard to build without warnings everywhere. In particular, if -you're using gcc, you should invoke the configure script with the -option `--enable-fatal-warnings`. This will tell the compiler -to make all warnings into errors. - -Functions to use; functions not to use --------------------------------------- - -We have some wrapper functions like `tor_malloc`, `tor_free`, `tor_strdup`, and -`tor_gettimeofday;` use them instead of their generic equivalents. (They -always succeed or exit.) - -You can get a full list of the compatibility functions that Tor provides by -looking through `src/common/util*.h` and `src/common/compat*.h`. You can see the -available containers in `src/common/containers*.h`. You should probably -familiarize yourself with these modules before you write too much code, or -else you'll wind up reinventing the wheel. - -We don't use `strcat` or `strcpy` or `sprintf` of any of those notoriously broken -old C functions. Use `strlcat`, `strlcpy`, or `tor_snprintf/tor_asprintf` instead. - -We don't call `memcmp()` directly. Use `fast_memeq()`, `fast_memneq()`, -`tor_memeq()`, or `tor_memneq()` for most purposes. - -Also see a longer list of functions to avoid in: -https://people.torproject.org/~nickm/tor-auto/internal/this-not-that.html - -Floating point math is hard ---------------------------- - -Floating point arithmetic as typically implemented by computers is -very counterintuitive. Failure to adequately analyze floating point -usage can result in surprising behavior and even security -vulnerabilities! - -General advice: - - - Don't use floating point. - - If you must use floating point, document how the limits of - floating point precision and calculation accuracy affect function - outputs. - - Try to do as much as possible of your calculations using integers - (possibly acting as fixed-point numbers) and convert to floating - point for display. - - If you must send floating point numbers on the wire, serialize - them in a platform-independent way. Tor avoids exchanging - floating-point values, but when it does, it uses ASCII numerals, - with a decimal point ("."). - - Binary fractions behave very differently from decimal fractions. - Make sure you understand how these differences affect your - calculations. - - Every floating point arithmetic operation is an opportunity to - lose precision, overflow, underflow, or otherwise produce - undesired results. Addition and subtraction tend to be worse - than multiplication and division (due to things like catastrophic - cancellation). Try to arrange your calculations to minimize such - effects. - - Changing the order of operations changes the results of many - floating-point calculations. Be careful when you simplify - calculations! If the order is significant, document it using a - code comment. - - Comparing most floating point values for equality is unreliable. - Avoid using `==`, instead, use `>=` or `<=`. If you use an - epsilon value, make sure it's appropriate for the ranges in - question. - - Different environments (including compiler flags and per-thread - state on a single platform!) can get different results from the - same floating point calculations. This means you can't use - floats in anything that needs to be deterministic, like consensus - generation. This also makes reliable unit tests of - floating-point outputs hard to write. - -For additional useful advice (and a little bit of background), see -[What Every Programmer Should Know About Floating-Point -Arithmetic](http://floating-point-gui.de/). - -A list of notable (and surprising) facts about floating point -arithmetic is at [Floating-point -complexities](https://randomascii.wordpress.com/2012/04/05/floating-point-complexities/). -Most of that [series of posts on floating -point](https://randomascii.wordpress.com/category/floating-point/) is -helpful. - -For more detailed (and math-intensive) background, see [What Every -Computer Scientist Should Know About Floating-Point -Arithmetic](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). - -Other C conventions -------------------- - -The `a ? b : c` trinary operator only goes inside other expressions; -don't use it as a replacement for if. (You can ignore this inside macro -definitions when necessary.) - -Assignment operators shouldn't nest inside other expressions. (You can -ignore this inside macro definitions when necessary.) - -Functions not to write ----------------------- - -Try to never hand-write new code to parse or generate binary -formats. Instead, use trunnel if at all possible. See - - https://gitweb.torproject.org/trunnel.git/tree - -for more information about trunnel. - -For information on adding new trunnel code to Tor, see src/trunnel/README - - -Calling and naming conventions ------------------------------- - -Whenever possible, functions should return -1 on error and 0 on success. - -For multi-word identifiers, use lowercase words combined with -underscores. (e.g., `multi_word_identifier`). Use ALL_CAPS for macros and -constants. - -Typenames should end with `_t`. - -Function names should be prefixed with a module name or object name. (In -general, code to manipulate an object should be a module with the same name -as the object, so it's hard to tell which convention is used.) - -Functions that do things should have imperative-verb names -(e.g. `buffer_clear`, `buffer_resize`); functions that return booleans should -have predicate names (e.g. `buffer_is_empty`, `buffer_needs_resizing`). - -If you find that you have four or more possible return code values, it's -probably time to create an enum. If you find that you are passing three or -more flags to a function, it's probably time to create a flags argument that -takes a bitfield. - -What To Optimize ----------------- - -Don't optimize anything if it's not in the critical path. Right now, the -critical path seems to be AES, logging, and the network itself. Feel free to -do your own profiling to determine otherwise. - -Log conventions ---------------- - -`https://www.torproject.org/docs/faq#LogLevel` - -No error or warning messages should be expected during normal OR or OP -operation. - -If a library function is currently called such that failure always means ERR, -then the library function should log WARN and let the caller log ERR. - -Every message of severity INFO or higher should either (A) be intelligible -to end-users who don't know the Tor source; or (B) somehow inform the -end-users that they aren't expected to understand the message (perhaps -with a string like "internal error"). Option (A) is to be preferred to -option (B). - -Assertions In Tor ------------------ - -Assertions should be used for bug-detection only. Don't use assertions to -detect bad user inputs, network errors, resource exhaustion, or similar -issues. - -Tor is always built with assertions enabled, so try to only use -`tor_assert()` for cases where you are absolutely sure that crashing is the -least bad option. Many bugs have been caused by use of `tor_assert()` when -another kind of check would have been safer. - -If you're writing an assertion to test for a bug that you _can_ recover from, -use `tor_assert_nonfatal()` in place of `tor_assert()`. If you'd like to -write a conditional that incorporates a nonfatal assertion, use the `BUG()` -macro, as in: - - if (BUG(ptr == NULL)) - return -1; - -Allocator conventions ---------------------- - -By convention, any tor type with a name like `abc_t` should be allocated -by a function named `abc_new()`. This function should never return -NULL. - -Also, a type named `abc_t` should be freed by a function named `abc_free_()`. -Don't call this `abc_free_()` function directly -- instead, wrap it in a -macro called `abc_free()`, using the `FREE_AND_NULL` macro: - - void abc_free_(abc_t *obj); - #define abc_free(obj) FREE_AND_NULL(abc_t, abc_free_, (obj)) - -This macro will free the underlying `abc_t` object, and will also set -the object pointer to NULL. - -You should define all `abc_free_()` functions to accept NULL inputs: - - void - abc_free_(abc_t *obj) - { - if (!obj) - return; - tor_free(obj->name); - thing_free(obj->thing); - tor_free(obj); - } - -If you need a free function that takes a `void *` argument (for example, -to use it as a function callback), define it with a name like -`abc_free_void()`: - - static void - abc_free_void_(void *obj) - { - abc_free_(obj); - } - - -Doxygen comment conventions ---------------------------- - -Say what functions do as a series of one or more imperative sentences, as -though you were telling somebody how to be the function. In other words, DO -NOT say: - - /** The strtol function parses a number. - * - * nptr -- the string to parse. It can include whitespace. - * endptr -- a string pointer to hold the first thing that is not part - * of the number, if present. - * base -- the numeric base. - * returns: the resulting number. - */ - long strtol(const char *nptr, char **nptr, int base); - -Instead, please DO say: - - /** Parse a number in radix base from the string nptr, - * and return the result. Skip all leading whitespace. If - * endptr is not NULL, set *endptr to the first character - * after the number parsed. - **/ - long strtol(const char *nptr, char **nptr, int base); - -Doxygen comments are the contract in our abstraction-by-contract world: if -the functions that call your function rely on it doing something, then your -function should mention that it does that something in the documentation. If -you rely on a function doing something beyond what is in its documentation, -then you should watch out, or it might do something else later. diff --git a/src/tor/doc/HACKING/CodingStandardsRust.md b/src/tor/doc/HACKING/CodingStandardsRust.md deleted file mode 100644 index d0b17c160..000000000 --- a/src/tor/doc/HACKING/CodingStandardsRust.md +++ /dev/null @@ -1,469 +0,0 @@ - - Rust Coding Standards -======================= - -You MUST follow the standards laid out in `.../doc/HACKING/CodingStandards.md`, -where applicable. - - Module/Crate Declarations ---------------------------- - -Each Tor C module which is being rewritten MUST be in its own crate. -See the structure of `.../src/rust` for examples. - -In your crate, you MUST use `lib.rs` ONLY for pulling in external -crates (e.g. `extern crate libc;`) and exporting public objects from -other Rust modules (e.g. `pub use mymodule::foo;`). For example, if -you create a crate in `.../src/rust/yourcrate`, your Rust code should -live in `.../src/rust/yourcrate/yourcode.rs` and the public interface -to it should be exported in `.../src/rust/yourcrate/lib.rs`. - -If your code is to be called from Tor C code, you MUST define a safe -`ffi.rs`. See the "Safety" section further down for more details. - -For example, in a hypothetical `tor_addition` Rust module: - -In `.../src/rust/tor_addition/addition.rs`: - - pub fn get_sum(a: i32, b: i32) -> i32 { - a + b - } - -In `.../src/rust/tor_addition/lib.rs`: - - pub use addition::*; - -In `.../src/rust/tor_addition/ffi.rs`: - - #[no_mangle] - pub extern "C" fn tor_get_sum(a: c_int, b: c_int) -> c_int { - get_sum(a, b) - } - -If your Rust code must call out to parts of Tor's C code, you must -declare the functions you are calling in the `external` crate, located -at `.../src/rust/external`. - - - - -Modules should strive to be below 500 lines (tests excluded). Single -responsibility and limited dependencies should be a guiding standard. - -If you have any external modules as dependencies (e.g. `extern crate -libc;`), you MUST declare them in your crate's `lib.rs` and NOT in any -other module. - - Dependencies --------------- - -In general, we use modules from only the Rust standard library -whenever possible. We will review including external crates on a -case-by-case basis. - - Documentation ---------------- - -You MUST include `#[deny(missing_docs)]` in your crate. - -For function/method comments, you SHOULD include a one-sentence, "first person" -description of function behaviour (see requirements for documentation as -described in `.../src/HACKING/CodingStandards.md`), then an `# Inputs` section -for inputs or initialisation values, a `# Returns` section for return -values/types, a `# Warning` section containing warnings for unsafe behaviours or -panics that could happen. For publicly accessible -types/constants/objects/functions/methods, you SHOULD also include an -`# Examples` section with runnable doctests. - -You MUST document your module with _module docstring_ comments, -i.e. `//!` at the beginning of each line. - - Style -------- - -You SHOULD consider breaking up large literal numbers with `_` when it makes it -more human readable to do so, e.g. `let x: u64 = 100_000_000_000`. - - Testing ---------- - -All code MUST be unittested and integration tested. - -Public functions/objects exported from a crate SHOULD include doctests -describing how the function/object is expected to be used. - -Integration tests SHOULD go into a `tests/` directory inside your -crate. Unittests SHOULD go into their own module inside the module -they are testing, e.g. in `.../src/rust/tor_addition/addition.rs` you -should put: - - #[cfg(test)] - mod test { - use super::*; - - #[test] - fn addition_with_zero() { - let sum: i32 = get_sum(5i32, 0i32); - assert_eq!(sum, 5); - } - } - - Benchmarking --------------- - -The external `test` crate can be used for most benchmarking. However, using -this crate requires nightly Rust. Since we may want to switch to a more -stable Rust compiler eventually, we shouldn't do things which will automatically -break builds for stable compilers. Therefore, you MUST feature-gate your -benchmarks in the following manner. - -If you wish to benchmark some of your Rust code, you MUST put the -following in the `[features]` section of your crate's `Cargo.toml`: - - [features] - bench = [] - -Next, in your crate's `lib.rs` you MUST put: - - #[cfg(all(test, feature = "bench"))] - extern crate test; - -This ensures that the external crate `test`, which contains utilities -for basic benchmarks, is only used when running benchmarks via `cargo -bench --features bench`. - -Finally, to write your benchmark code, in -`.../src/rust/tor_addition/addition.rs` you SHOULD put: - - #[cfg(all(test, features = "bench"))] - mod bench { - use test::Bencher; - use super::*; - - #[bench] - fn addition_small_integers(b: &mut Bencher) { - b.iter(| | get_sum(5i32, 0i32)); - } - } - - Fuzzing ---------- - -If you wish to fuzz parts of your code, please see the -[`cargo fuzz`](https://github.com/rust-fuzz/cargo-fuzz) crate, which uses -[libfuzzer-sys](https://github.com/rust-fuzz/libfuzzer-sys). - - Whitespace & Formatting -------------------------- - -You MUST run `rustfmt` (https://github.com/rust-lang-nursery/rustfmt) -on your code before your code will be merged. You can install rustfmt -by doing `cargo install rustfmt-nightly` and then run it with `cargo -fmt`. - - Safety --------- - -You SHOULD read [the nomicon](https://doc.rust-lang.org/nomicon/) before writing -Rust FFI code. It is *highly advised* that you read and write normal Rust code -before attempting to write FFI or any other unsafe code. - -Here are some additional bits of advice and rules: - -0. Any behaviours which Rust considers to be undefined are forbidden - - From https://doc.rust-lang.org/reference/behavior-considered-undefined.html: - - > Behavior considered undefined - > - > The following is a list of behavior which is forbidden in all Rust code, - > including within unsafe blocks and unsafe functions. Type checking provides the - > guarantee that these issues are never caused by safe code. - > - > * Data races - > * Dereferencing a null/dangling raw pointer - > * Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values) - > (uninitialized) memory - > * Breaking the - > [pointer aliasing rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules) - > with raw pointers (a subset of the rules used by C) - > * `&mut T` and `&T` follow LLVM’s scoped noalias model, except if the `&T` - > contains an `UnsafeCell`. Unsafe code must not violate these aliasing - > guarantees. - > * Mutating non-mutable data (that is, data reached through a shared - > reference or data owned by a `let` binding), unless that data is - > contained within an `UnsafeCell`. - > * Invoking undefined behavior via compiler intrinsics: - > - Indexing outside of the bounds of an object with - > `std::ptr::offset` (`offset` intrinsic), with the exception of - > one byte past the end which is permitted. - > - Using `std::ptr::copy_nonoverlapping_memory` (`memcpy32`/`memcpy64` - > intrinsics) on overlapping buffers - > * Invalid values in primitive types, even in private fields/locals: - > - Dangling/null references or boxes - > - A value other than `false` (0) or `true` (1) in a `bool` - > - A discriminant in an `enum` not included in the type definition - > - A value in a `char` which is a surrogate or above `char::MAX` - > - Non-UTF-8 byte sequences in a `str` - > * Unwinding into Rust from foreign code or unwinding from Rust into foreign - > code. Rust's failure system is not compatible with exception handling in other - > languages. Unwinding must be caught and handled at FFI boundaries. - -1. `unwrap()` - - If you call `unwrap()`, anywhere, even in a test, you MUST include - an inline comment stating how the unwrap will either 1) never fail, - or 2) should fail (i.e. in a unittest). - - You SHOULD NOT use `unwrap()` anywhere in which it is possible to handle the - potential error with either `expect()` or the eel operator, `?`. - For example, consider a function which parses a string into an integer: - - fn parse_port_number(config_string: &str) -> u16 { - u16::from_str_radix(config_string, 10).unwrap() - } - - There are numerous ways this can fail, and the `unwrap()` will cause the - whole program to byte the dust! Instead, either you SHOULD use `expect()` - (or another equivalent function which will return an `Option` or a `Result`) - and change the return type to be compatible: - - fn parse_port_number(config_string: &str) -> Option { - u16::from_str_radix(config_string, 10).expect("Couldn't parse port into a u16") - } - - or you SHOULD use `or()` (or another similar method): - - fn parse_port_number(config_string: &str) -> Option { - u16::from_str_radix(config_string, 10).or(Err("Couldn't parse port into a u16") - } - - Using methods like `or()` can be particularly handy when you must do - something afterwards with the data, for example, if we wanted to guarantee - that the port is high. Combining these methods with the eel operator (`?`) - makes this even easier: - - fn parse_port_number(config_string: &str) -> Result { - let port = u16::from_str_radix(config_string, 10).or(Err("Couldn't parse port into a u16"))?; - - if port > 1024 { - return Ok(port); - } else { - return Err("Low ports not allowed"); - } - } - -2. `unsafe` - - If you use `unsafe`, you MUST describe a contract in your - documentation which describes how and when the unsafe code may - fail, and what expectations are made w.r.t. the interfaces to - unsafe code. This is also REQUIRED for major pieces of FFI between - C and Rust. - - When creating an FFI in Rust for C code to call, it is NOT REQUIRED - to declare the entire function `unsafe`. For example, rather than doing: - - #[no_mangle] - pub unsafe extern "C" fn increment_and_combine_numbers(mut numbers: [u8; 4]) -> u32 { - for number in &mut numbers { - *number += 1; - } - std::mem::transmute::<[u8; 4], u32>(numbers) - } - - You SHOULD instead do: - - #[no_mangle] - pub extern "C" fn increment_and_combine_numbers(mut numbers: [u8; 4]) -> u32 { - for index in 0..numbers.len() { - numbers[index] += 1; - } - unsafe { - std::mem::transmute::<[u8; 4], u32>(numbers) - } - } - -3. Pass only integer types and bytes over the boundary - - The only non-integer type which may cross the FFI boundary is - bytes, e.g. `&[u8]`. This SHOULD be done on the Rust side by - passing a pointer (`*mut libc::c_char`) and a length - (`libc::size_t`). - - One might be tempted to do this via doing - `CString::new("blah").unwrap().into_raw()`. This has several problems: - - a) If you do `CString::new("bl\x00ah")` then the unwrap() will fail - due to the additional NULL terminator, causing a dangling - pointer to be returned (as well as a potential use-after-free). - - b) Returning the raw pointer will cause the CString to run its deallocator, - which causes any C code which tries to access the contents to dereference a - NULL pointer. - - c) If we were to do `as_raw()` this would result in a potential double-free - since the Rust deallocator would run and possibly Tor's deallocator. - - d) Calling `into_raw()` without later using the same pointer in Rust to call - `from_raw()` and then deallocate in Rust can result in a - [memory leak](https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_raw). - - [It was determined](https://github.com/rust-lang/rust/pull/41074) that this - is safe to do if you use the same allocator in C and Rust and also specify - the memory alignment for CString (except that there is no way to specify - the alignment for CString). It is believed that the alignment is always 1, - which would mean it's safe to dealloc the resulting `*mut c_char` in Tor's - C code. However, the Rust developers are not willing to guarantee the - stability of, or a contract for, this behaviour, citing concerns that this - is potentially extremely and subtly unsafe. - -4. Perform an allocation on the other side of the boundary - - After crossing the boundary, the other side MUST perform an - allocation to copy the data and is therefore responsible for - freeing that memory later. - -5. No touching other language's enums - - Rust enums should never be touched from C (nor can they be safely - `#[repr(C)]`) nor vice versa: - - > "The chosen size is the default enum size for the target platform's C - > ABI. Note that enum representation in C is implementation defined, so this is - > really a "best guess". In particular, this may be incorrect when the C code - > of interest is compiled with certain flags." - - (from https://gankro.github.io/nomicon/other-reprs.html) - -6. Type safety - - Wherever possible and sensical, you SHOULD create new types in a - manner which prevents type confusion or misuse. For example, - rather than using an untyped mapping between strings and integers - like so: - - use std::collections::HashMap; - - pub fn get_elements_with_over_9000_points(map: &HashMap) -> Vec { - ... - } - - It would be safer to define a new type, such that some other usage - of `HashMap` cannot be confused for this type: - - pub struct DragonBallZPowers(pub HashMap); - - impl DragonBallZPowers { - pub fn over_nine_thousand<'a>(&'a self) -> Vec<&'a String> { - let mut powerful_enough: Vec<&'a String> = Vec::with_capacity(5); - - for (character, power) in &self.0 { - if *power > 9000 { - powerful_enough.push(character); - } - } - powerful_enough - } - } - - Note the following code, which uses Rust's type aliasing, is valid - but it does NOT meet the desired type safety goals: - - pub type Power = usize; - - pub fn over_nine_thousand(power: &Power) -> bool { - if *power > 9000 { - return true; - } - false - } - - // We can still do the following: - let his_power: usize = 9001; - over_nine_thousand(&his_power); - -7. Unsafe mucking around with lifetimes - - Because lifetimes are technically, in type theory terms, a kind, i.e. a - family of types, individual lifetimes can be treated as types. For example, - one can arbitrarily extend and shorten lifetime using `std::mem::transmute`: - - struct R<'a>(&'a i32); - - unsafe fn extend_lifetime<'b>(r: R<'b>) -> R<'static> { - std::mem::transmute::, R<'static>>(r) - } - - unsafe fn shorten_invariant_lifetime<'b, 'c>(r: &'b mut R<'static>) -> &'b mut R<'c> { - std::mem::transmute::<&'b mut R<'static>, &'b mut R<'c>>(r) - } - - Calling `extend_lifetime()` would cause an `R` passed into it to live forever - for the life of the program (the `'static` lifetime). Similarly, - `shorten_invariant_lifetime()` could be used to take something meant to live - forever, and cause it to disappear! This is incredibly unsafe. If you're - going to be mucking around with lifetimes like this, first, you better have - an extremely good reason, and second, you may as be honest and explicit about - it, and for ferris' sake just use a raw pointer. - - In short, just because lifetimes can be treated like types doesn't mean you - should do it. - -8. Doing excessively unsafe things when there's a safer alternative - - Similarly to #7, often there are excessively unsafe ways to do a task and a - simpler, safer way. You MUST choose the safer option where possible. - - For example, `std::mem::transmute` can be abused in ways where casting with - `as` would be both simpler and safer: - - // Don't do this - let ptr = &0; - let ptr_num_transmute = unsafe { std::mem::transmute::<&i32, usize>(ptr)}; - - // Use an `as` cast instead - let ptr_num_cast = ptr as *const i32 as usize; - - In fact, using `std::mem::transmute` for *any* reason is a code smell and as - such SHOULD be avoided. - -9. Casting integers with `as` - - This is generally fine to do, but it has some behaviours which you should be - aware of. Casting down chops off the high bits, e.g.: - - let x: u32 = 4294967295; - println!("{}", x as u16); // prints 65535 - - Some cases which you MUST NOT do include: - - * Casting an `u128` down to an `f32` or vice versa (e.g. - `u128::MAX as f32` but this isn't only a problem with overflowing - as it is also undefined behaviour for `42.0f32 as u128`), - - * Casting between integers and floats when the thing being cast - cannot fit into the type it is being casted into, e.g.: - - println!("{}", 42949.0f32 as u8); // prints 197 in debug mode and 0 in release - println!("{}", 1.04E+17 as u8); // prints 0 in both modes - println!("{}", (0.0/0.0) as i64); // prints whatever the heck LLVM wants - - Because this behaviour is undefined, it can even produce segfaults in - safe Rust code. For example, the following program built in release - mode segfaults: - - #[inline(never)] - pub fn trigger_ub(sl: &[u8; 666]) -> &[u8] { - // Note that the float is out of the range of `usize`, invoking UB when casting. - let idx = 1e99999f64 as usize; - &sl[idx..] // The bound check is elided due to `idx` being of an undefined value. - } - - fn main() { - println!("{}", trigger_ub(&[1; 666])[999999]); // ~ out of bound - } - - And in debug mode panics with: - - thread 'main' panicked at 'slice index starts at 140721821254240 but ends at 666', /checkout/src/libcore/slice/mod.rs:754:4 diff --git a/src/tor/doc/HACKING/Fuzzing.md b/src/tor/doc/HACKING/Fuzzing.md deleted file mode 100644 index 2039d6a4c..000000000 --- a/src/tor/doc/HACKING/Fuzzing.md +++ /dev/null @@ -1,123 +0,0 @@ -= Fuzzing Tor - -== The simple version (no fuzzing, only tests) - -Check out fuzzing-corpora, and set TOR_FUZZ_CORPORA to point to the place -where you checked it out. - -To run the fuzzing test cases in a deterministic fashion, use: - make test-fuzz-corpora - -This won't actually fuzz Tor! It will just run all the fuzz binaries -on our existing set of testcases for the fuzzer. - - -== Different kinds of fuzzing - -Right now we support three different kinds of fuzzer. - -First, there's American Fuzzy Lop (AFL), a fuzzer that works by forking -a target binary and passing it lots of different inputs on stdin. It's the -trickiest one to set up, so I'll be describing it more below. - -Second, there's libFuzzer, a llvm-based fuzzer that you link in as a library, -and it runs a target function over and over. To use this one, you'll need to -have a reasonably recent clang and libfuzzer installed. At that point, you -just build with --enable-expensive-hardening and --enable-libfuzzer. That -will produce a set of binaries in src/test/fuzz/lf-fuzz-* . These programs -take as input a series of directories full of fuzzing examples. For more -information on libfuzzer, see http://llvm.org/docs/LibFuzzer.html - -Third, there's Google's OSS-Fuzz infrastructure, which expects to get all of -its. For more on this, see https://github.com/google/oss-fuzz and the -projects/tor subdirectory. You'll need to mess around with Docker a bit to -test this one out; it's meant to run on Google's infrastructure. - -In all cases, you'll need some starting examples to give the fuzzer when it -starts out. There's a set in the "fuzzing-corpora" git repository. Try -setting TOR_FUZZ_CORPORA to point to a checkout of that repository - -== Writing Tor fuzzers - -A tor fuzzing harness should have: -* a fuzz_init() function to set up any necessary global state. -* a fuzz_main() function to receive input and pass it to a parser. -* a fuzz_cleanup() function to clear global state. - -Most fuzzing frameworks will produce many invalid inputs - a tor fuzzing -harness should rejecting invalid inputs without crashing or behaving badly. - -But the fuzzing harness should crash if tor fails an assertion, triggers a -bug, or accesses memory it shouldn't. This helps fuzzing frameworks detect -"interesting" cases. - - -== Guided Fuzzing with AFL - -There is no HTTPS, hash, or signature for American Fuzzy Lop's source code, so -its integrity can't be verified. That said, you really shouldn't fuzz on a -machine you care about, anyway. - -To Build: - Get AFL from http://lcamtuf.coredump.cx/afl/ and unpack it - cd afl - make - cd ../tor - PATH=$PATH:../afl/ CC="../afl/afl-gcc" ./configure --enable-expensive-hardening - AFL_HARDEN=1 make clean fuzzers - -To Find The ASAN Memory Limit: (64-bit only) - -On 64-bit platforms, afl needs to know how much memory ASAN uses, -because ASAN tends to allocate a ridiculous amount of virtual memory, -and then not actually use it. - -Read afl/docs/notes_for_asan.txt for more details. - - Download recidivm from http://jwilk.net/software/recidivm - Download the signature - Check the signature - tar xvzf recidivm*.tar.gz - cd recidivm* - make - /path/to/recidivm -v src/test/fuzz/fuzz-http - Use the final "ok" figure as the input to -m when calling afl-fuzz - (Normally, recidivm would output a figure automatically, but in some cases, - the fuzzing harness will hang when the memory limit is too small.) - -You could also just say "none" instead of the memory limit below, if you -don't care about memory limits. - - -To Run: - mkdir -p src/test/fuzz/fuzz_http_findings - ../afl/afl-fuzz -i ${TOR_FUZZ_CORPORA}/http -o src/test/fuzz/fuzz_http_findings -m -- src/test/fuzz/fuzz-http - - -AFL has a multi-core mode, check the documentation for details. -You might find the included fuzz-multi.sh script useful for this. - -macOS (OS X) requires slightly more preparation, including: -* using afl-clang (or afl-clang-fast from the llvm directory) -* disabling external crash reporting (AFL will guide you through this step) - -== Triaging Issues - -Crashes are usually interesting, particularly if using AFL_HARDEN=1 and --enable-expensive-hardening. Sometimes crashes are due to bugs in the harness code. - -Hangs might be interesting, but they might also be spurious machine slowdowns. -Check if a hang is reproducible before reporting it. Sometimes, processing -valid inputs may take a second or so, particularly with the fuzzer and -sanitizers enabled. - -To see what fuzz-http is doing with a test case, call it like this: - src/test/fuzz/fuzz-http --debug < /path/to/test.case - -(Logging is disabled while fuzzing to increase fuzzing speed.) - -== Reporting Issues - -Please report any issues discovered using the process in Tor's security issue -policy: - -https://trac.torproject.org/projects/tor/wiki/org/meetings/2016SummerDevMeeting/Notes/SecurityIssuePolicy diff --git a/src/tor/doc/HACKING/GettingStarted.md b/src/tor/doc/HACKING/GettingStarted.md deleted file mode 100644 index 0c4240463..000000000 --- a/src/tor/doc/HACKING/GettingStarted.md +++ /dev/null @@ -1,188 +0,0 @@ - -Getting started in Tor development -================================== - -Congratulations! You've found this file, and you're reading it! This -means that you might be interested in getting started in developing Tor. - -(This guide is just about Tor itself--the small network program at the -heart of the Tor network--and not about all the other programs in the -whole Tor ecosystem.) - - -If you are looking for a more bare-bones, less user-friendly information -dump of important information, you might like reading the "torguts" -documents linked to below. You should probably read it before you write -your first patch. - - -Required background -------------------- - -First, I'm going to assume that you can build Tor from source, and that -you know enough of the C language to read and write it. (See the README -file that comes with the Tor source for more information on building it, -and any high-quality guide to C for information on programming.) - -I'm also going to assume that you know a little bit about how to use -Git, or that you're able to follow one of the several excellent guides -at http://git-scm.org to learn. - -Most Tor developers develop using some Unix-based system, such as Linux, -BSD, or OSX. It's okay to develop on Windows if you want, but you're -going to have a more difficult time. - - -Getting your first patch into Tor ---------------------------------- - -Once you've reached this point, here's what you need to know. - - 1. Get the source. - - We keep our source under version control in Git. To get the latest - version, run - - git clone https://git.torproject.org/git/tor - - This will give you a checkout of the master branch. If you're - going to fix a bug that appears in a stable version, check out the - appropriate "maint" branch, as in: - - git checkout maint-0.2.7 - - 2. Find your way around the source - - Our overall code structure is explained in the "torguts" documents, - currently at - - git clone https://git.torproject.org/user/nickm/torguts.git - - Find a part of the code that looks interesting to you, and start - looking around it to see how it fits together! - - We do some unusual things in our codebase. Our testing-related - practices and kludges are explained in doc/WritingTests.txt. - - If you see something that doesn't make sense, we love to get - questions! - - 3. Find something cool to hack on. - - You may already have a good idea of what you'd like to work on, or - you might be looking for a way to contribute. - - Many people have gotten started by looking for an area where they - personally felt Tor was underperforming, and investigating ways to - fix it. If you're looking for ideas, you can head to our bug - tracker at trac.torproject.org and look for tickets that have - received the "easy" tag: these are ones that developers think would - be pretty simple for a new person to work on. For a bigger - challenge, you might want to look for tickets with the "lorax" - keyword: these are tickets that the developers think might be a - good idea to build, but which we have no time to work on any time - soon. - - Or you might find another open ticket that piques your - interest. It's all fine! - - For your first patch, it is probably NOT a good idea to make - something huge or invasive. In particular, you should probably - avoid: - - * Major changes spread across many parts of the codebase. - * Major changes to programming practice or coding style. - * Huge new features or protocol changes. - - 4. Meet the developers! - - We discuss stuff on the tor-dev mailing list and on the #tor-dev - IRC channel on OFTC. We're generally friendly and approachable, - and we like to talk about how Tor fits together. If we have ideas - about how something should be implemented, we'll be happy to share - them. - - We currently have a patch workshop at least once a week, where - people share patches they've made and discuss how to make them - better. The time might change in the future, but generally, - there's no bad time to talk, and ask us about patch ideas. - - 5. Do you need to write a design proposal? - - If your idea is very large, or it will require a change to Tor's - protocols, there needs to be a written design proposal before it - can be merged. (We use this process to manage changes in the - protocols.) To write one, see the instructions at - https://gitweb.torproject.org/torspec.git/tree/proposals/001-process.txt - . If you'd like help writing a proposal, just ask! We're happy to - help out with good ideas. - - You might also like to look around the rest of that directory, to - see more about open and past proposed changes to Tor's behavior. - - 6. Writing your patch - - As you write your code, you'll probably want it to fit in with the - standards of the rest of the Tor codebase so it will be easy for us - to review and merge. You can learn our coding standards in - doc/HACKING. - - If your patch is large and/or is divided into multiple logical - components, remember to divide it into a series of Git commits. A - series of small changes is much easier to review than one big lump. - - 7. Testing your patch - - We prefer that all new or modified code have unit tests for it to - ensure that it runs correctly. Also, all code should actually be - _run_ by somebody, to make sure it works. - - See doc/WritingTests.txt for more information on how we test things - in Tor. If you'd like any help writing tests, just ask! We're - glad to help out. - - 8. Submitting your patch - - We review patches through tickets on our bugtracker at - trac.torproject.org. You can either upload your patches there, or - put them at a public git repository somewhere we can fetch them - (like github or bitbucket) and then paste a link on the appropriate - trac ticket. - - Once your patches are available, write a short explanation of what - you've done on trac, and then change the status of the ticket to - needs_review. - - 9. Review, Revision, and Merge - - With any luck, somebody will review your patch soon! If not, you - can ask on the IRC channel; sometimes we get really busy and take - longer than we should. But don't let us slow you down: you're the - one who's offering help here, and we should respect your time and - contributions. - - When your patch is reviewed, one of these things will happen: - - * The reviewer will say "looks good to me" and your - patch will get merged right into Tor. [Assuming we're not - in the middle of a code-freeze window. If the codebase is - frozen, your patch will go into the next release series.] - - * OR the reviewer will say "looks good, just needs some small - changes!" And then the reviewer will make those changes, - and merge the modified patch into Tor. - - * OR the reviewer will say "Here are some questions and - comments," followed by a bunch of stuff that the reviewer - thinks should change in your code, or questions that the - reviewer has. - - At this point, you might want to make the requested changes - yourself, and comment on the trac ticket once you have done - so. Or if you disagree with any of the comments, you should - say so! And if you won't have time to make some of the - changes, you should say that too, so that other developers - will be able to pick up the unfinished portion. - - Congratulations! You have now written your first patch, and gotten - it integrated into mainline Tor. diff --git a/src/tor/doc/HACKING/GettingStartedRust.md b/src/tor/doc/HACKING/GettingStartedRust.md deleted file mode 100644 index 3d0038831..000000000 --- a/src/tor/doc/HACKING/GettingStartedRust.md +++ /dev/null @@ -1,174 +0,0 @@ - - Hacking on Rust in Tor -======================== - - Getting Started ------------------ - -Please read or review our documentation on Rust coding standards -(`.../doc/HACKING/CodingStandardsRust.md`) before doing anything. - -Please also read -[the Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html). We aim -to follow the good example set by the Rust community and be excellent to one -another. Let's be careful with each other, so we can be memory-safe together! - -Next, please contact us before rewriting anything! Rust in Tor is still an -experiment. It is an experiment that we very much want to see succeed, so we're -going slowly and carefully. For the moment, it's also a completely -volunteer-driven effort: while many, if not most, of us are paid to work on Tor, -we are not yet funded to write Rust code for Tor. Please be patient with the -other people who are working on getting more Rust code into Tor, because they -are graciously donating their free time to contribute to this effort. - - Resources for learning Rust ------------------------------ - -**Beginning resources** - -The primary resource for learning Rust is -[The Book](https://doc.rust-lang.org/book/). If you'd like to start writing -Rust immediately, without waiting for anything to install, there is -[an interactive browser-based playground](https://play.rust-lang.org/). - -**Advanced resources** - -If you're interested in playing with various Rust compilers and viewing a very -nicely displayed output of the generated assembly, there is -[the Godbolt compiler explorer](https://rust.godbolt.org/) - -For learning how to write unsafe Rust, read -[The Rustonomicon](https://doc.rust-lang.org/nomicon/). - -For learning everything you ever wanted to know about Rust macros, there is -[The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html). - -For learning more about FFI and Rust, see Jake Goulding's -[Rust FFI Omnibus](http://jakegoulding.com/rust-ffi-omnibus/). - - Compiling Tor with Rust enabled ---------------------------------- - -You will need to run the `configure` script with the `--enable-rust` flag to -explicitly build with Rust. Additionally, you will need to specify where to -fetch Rust dependencies, as we allow for either fetching dependencies from Cargo -or specifying a local directory. - -**Fetch dependencies from Cargo** - - ./configure --enable-rust --enable-cargo-online-mode - -**Using a local dependency cache** - -You'll need the following Rust dependencies (as of this writing): - - libc==0.2.22 - -We vendor our Rust dependencies in a separate repo using -[cargo-vendor](https://github.com/alexcrichton/cargo-vendor). To use them, do: - - git submodule init - git submodule update - -To specify the local directory containing the dependencies, (assuming you are in -the top level of the repository) configure tor with: - - TOR_RUST_DEPENDENCIES='path_to_dependencies_directory' ./configure --enable-rust - -(Note that RUST_DEPENDENCIES must be the full path to the directory; it cannot -be relative.) - -Assuming you used the above `git submodule` commands and you're in the topmost -directory of the repository, this would be: - - TOR_RUST_DEPENDENCIES=`pwd`/src/ext/rust/crates ./configure --enable-rust - - - Identifying which modules to rewrite -====================================== - -The places in the Tor codebase that are good candidates for porting to Rust are: - -1. loosely coupled to other Tor submodules, -2. have high test coverage, and -3. would benefit from being implemented in a memory safe language. - -Help in either identifying places such as this, or working to improve existing -areas of the C codebase by adding regression tests and simplifying dependencies, -would be really helpful. - -Furthermore, as submodules in C are implemented in Rust, this is a good -opportunity to refactor, add more tests, and split modules into smaller areas of -responsibility. - -A good first step is to build a module-level callgraph to understand how -interconnected your target module is. - - git clone https://git.torproject.org/user/nickm/calltool.git - cd tor - CFLAGS=0 ./configure - ../calltool/src/main.py module_callgraph - -The output will tell you each module name, along with a set of every module that -the module calls. Modules which call fewer other modules are better targets. - - Writing your Rust module -========================== - -Strive to change the C API as little as possible. - -We are currently targetting Rust nightly, *for now*. We expect this to change -moving forward, as we understand more about which nightly features we need. It -is on our TODO list to try to cultivate good standing with various distro -maintainers of `rustc` and `cargo`, in order to ensure that whatever version we -solidify on is readily available. - -If parts of your Rust code needs to stay in sync with C code (such as handling -enums across the FFI boundary), annonotate these places in a comment structured -as follows: - - /// C_RUST_COUPLED: `` - -Where can be an enum, struct, constant, etc. Then, do the -same in the C code, to note that rust will need to be changed when the C -does. - - Adding your Rust module to Tor's build system ------------------------------------------------ - -0. Your translation of the C module should live in its own crate(s) - in the `.../tor/src/rust/` directory. -1. Add your crate to `.../tor/src/rust/Cargo.toml`, in the - `[workspace.members]` section. -2. Add your crate's files to src/rust/include.am - -If your crate should be available to C (rather than just being included as a -dependency of other Rust modules): -0. Declare the crate as a dependency of tor_rust in - `src/rust/tor_util/Cargo.toml` and include it in - `src/rust/tor_rust/lib.rs` - - How to test your Rust code ----------------------------- - -Everything should be tested full stop. Even non-public functionality. - -Be sure to edit `.../tor/src/test/test_rust.sh` to add the name of your crate to -the `crates` variable! This will ensure that `cargo test` is run on your crate. - -Configure Tor's build system to build with Rust enabled: - - ./configure --enable-fatal-warnings --enable-rust --enable-cargo-online-mode - -Tor's test should be run by doing: - - make check - -Tor's integration tests should also pass: - - make test-stem - - Submitting a patch -===================== - -Please follow the instructions in `.../doc/HACKING/GettingStarted.md`. diff --git a/src/tor/doc/HACKING/HelpfulTools.md b/src/tor/doc/HACKING/HelpfulTools.md deleted file mode 100644 index f919d08ec..000000000 --- a/src/tor/doc/HACKING/HelpfulTools.md +++ /dev/null @@ -1,349 +0,0 @@ -Useful tools -============ - -These aren't strictly necessary for hacking on Tor, but they can help track -down bugs. - -Jenkins -------- - - https://jenkins.torproject.org - -Dmalloc -------- - -The dmalloc library will keep track of memory allocation, so you can find out -if we're leaking memory, doing any double-frees, or so on. - - dmalloc -l -/dmalloc.log - (run the commands it tells you) - ./configure --with-dmalloc - -Valgrind --------- - - valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor - -(Note that if you get a zillion openssl warnings, you will also need to -pass `--undef-value-errors=no` to valgrind, or rebuild your openssl -with `-DPURIFY`.) - -Coverity --------- - -Nick regularly runs the coverity static analyzer on the Tor codebase. - -The preprocessor define `__COVERITY__` is used to work around instances -where coverity picks up behavior that we wish to permit. - -clang Static Analyzer ---------------------- - -The clang static analyzer can be run on the Tor codebase using Xcode (WIP) -or a command-line build. - -The preprocessor define `__clang_analyzer__` is used to work around instances -where clang picks up behavior that we wish to permit. - -clang Runtime Sanitizers ------------------------- - -To build the Tor codebase with the clang Address and Undefined Behavior -sanitizers, see the file `contrib/clang/sanitize_blacklist.txt`. - -Preprocessor workarounds for instances where clang picks up behavior that -we wish to permit are also documented in the blacklist file. - -Running lcov for unit test coverage ------------------------------------ - -Lcov is a utility that generates pretty HTML reports of test code coverage. -To generate such a report: - - ./configure --enable-coverage - make - make coverage-html - $BROWSER ./coverage_html/index.html - -This will run the tor unit test suite `./src/test/test` and generate the HTML -coverage code report under the directory `./coverage_html/`. To change the -output directory, use `make coverage-html HTML_COVER_DIR=./funky_new_cov_dir`. - -Coverage diffs using lcov are not currently implemented, but are being -investigated (as of July 2014). - -Running the unit tests ----------------------- - -To quickly run all the tests distributed with Tor: - - make check - -To run the fast unit tests only: - - make test - -To selectively run just some tests (the following can be combined -arbitrarily): - - ./src/test/test [] ... - ./src/test/test .. [..] ... - ./src/test/test : [: sleep ` - - (You may need to do this as root.) - - You might need to add `-e cpu-clock` as an option to the perf record line - above, if you are on an older CPU without access to hardware profiling - events, or in a VM, or something. - -4. Now you have a perf.data file. Have a look at it with `perf report - --no-children --sort symbol,dso` or `perf report --no-children --sort - symbol,dso --stdio --header`. How does it look? - -5a. Once you have a nice big perf.data file, you can compress it, encrypt it, - and send it to your favorite Tor developers. - -5b. Or maybe you'd rather not send a nice big perf.data file. Who knows what's - in that!? It's kinda scary. To generate a less scary file, you can use `perf - report -g > .out`. Then you can compress that and put it somewhere - public. - -Profiling Tor with gperftools aka Google-performance-tools ----------------------------------------------------------- - -This should work on nearly any unixy system. It doesn't seem to be compatible -with RunAsDaemon though. - -Beforehand, install google-perftools. - -1. You need to rebuild Tor, hack the linking steps to add `-lprofiler` to the - libs. You can do this by adding `LIBS=-lprofiler` when you call `./configure`. - -Now you can run Tor with profiling enabled, and use the pprof utility to look at -performance! See the gperftools manual for more info, but basically: - -2. Run `env CPUPROFILE=/tmp/profile src/or/tor -f `. The profile file - is not written to until Tor finishes execuction. - -3. Run `pprof src/or/tor /tm/profile` to start the REPL. - -Generating and analyzing a callgraph ------------------------------------- - -0. Build Tor on linux or mac, ideally with -O0 or -fno-inline. - -1. Clone 'https://gitweb.torproject.org/user/nickm/calltool.git/' . - Follow the README in that repository. - -Note that currently the callgraph generator can't detect calls that pass -through function pointers. - -Getting emacs to edit Tor source properly ------------------------------------------ - -Nick likes to put the following snippet in his .emacs file: - - - (add-hook 'c-mode-hook - (lambda () - (font-lock-mode 1) - (set-variable 'show-trailing-whitespace t) - - (let ((fname (expand-file-name (buffer-file-name)))) - (cond - ((string-match "^/home/nickm/src/libevent" fname) - (set-variable 'indent-tabs-mode t) - (set-variable 'c-basic-offset 4) - (set-variable 'tab-width 4)) - ((string-match "^/home/nickm/src/tor" fname) - (set-variable 'indent-tabs-mode nil) - (set-variable 'c-basic-offset 2)) - ((string-match "^/home/nickm/src/openssl" fname) - (set-variable 'indent-tabs-mode t) - (set-variable 'c-basic-offset 8) - (set-variable 'tab-width 8)) - )))) - - -You'll note that it defaults to showing all trailing whitespace. The `cond` -test detects whether the file is one of a few C free software projects that I -often edit, and sets up the indentation level and tab preferences to match -what they want. - -If you want to try this out, you'll need to change the filename regex -patterns to match where you keep your Tor files. - -If you use emacs for editing Tor and nothing else, you could always just say: - - - (add-hook 'c-mode-hook - (lambda () - (font-lock-mode 1) - (set-variable 'show-trailing-whitespace t) - (set-variable 'indent-tabs-mode nil) - (set-variable 'c-basic-offset 2))) - - -There is probably a better way to do this. No, we are probably not going -to clutter the files with emacs stuff. - - -Doxygen -------- - -We use the 'doxygen' utility to generate documentation from our -source code. Here's how to use it: - - 1. Begin every file that should be documented with - - /** - * \file filename.c - * \brief Short description of the file. - */ - - (Doxygen will recognize any comment beginning with /** as special.) - - 2. Before any function, structure, #define, or variable you want to - document, add a comment of the form: - - /** Describe the function's actions in imperative sentences. - * - * Use blank lines for paragraph breaks - * - and - * - hyphens - * - for - * - lists. - * - * Write argument_names in boldface. - * - * \code - * place_example_code(); - * between_code_and_endcode_commands(); - * \endcode - */ - - 3. Make sure to escape the characters `<`, `>`, `\`, `%` and `#` as `\<`, - `\>`, `\\`, `\%` and `\#`. - - 4. To document structure members, you can use two forms: - - struct foo { - /** You can put the comment before an element; */ - int a; - int b; /**< Or use the less-than symbol to put the comment - * after the element. */ - }; - - 5. To generate documentation from the Tor source code, type: - - $ doxygen -g - - to generate a file called `Doxyfile`. Edit that file and run - `doxygen` to generate the API documentation. - - 6. See the Doxygen manual for more information; this summary just - scratches the surface. diff --git a/src/tor/doc/HACKING/HowToReview.md b/src/tor/doc/HACKING/HowToReview.md deleted file mode 100644 index 2d1f3d1c9..000000000 --- a/src/tor/doc/HACKING/HowToReview.md +++ /dev/null @@ -1,88 +0,0 @@ -How to review a patch -===================== - -Some folks have said that they'd like to review patches more often, but they -don't know how. - -So, here are a bunch of things to check for when reviewing a patch! - -Note that if you can't do every one of these, that doesn't mean you can't do -a good review! Just make it clear what you checked for and what you didn't. - - -Top-level smell-checks ----------------------- - -(Difficulty: easy) - -- Does it compile with `--enable-fatal-warnings`? - -- Does `make check-spaces` pass? - -- Does `make check-changes` pass? - -- Does it have a reasonable amount of tests? Do they pass? Do they leak - memory? - -- Do all the new functions, global variables, types, and structure members have - documentation? - -- Do all the functions, global variables, types, and structure members with - modified behavior have modified documentation? - -- Do all the new torrc options have documentation? - -- If this changes Tor's behavior on the wire, is there a design proposal? - -- If this changes anything in the code, is there a "changes" file? - - -Let's look at the code! ------------------------ - -- Does the code conform to CodingStandards.txt? - -- Does the code leak memory? - -- If two or more pointers ever point to the same object, is it clear which - pointer "owns" the object? - -- Are all allocated resources freed? - -- Are all pointers that should be const, const? - -- Are `#defines` used for 'magic' numbers? - -- Can you understand what the code is trying to do? - -- Can you convince yourself that the code really does that? - -- Is there duplicated code that could be turned into a function? - - -Let's look at the documentation! --------------------------------- - -- Does the documentation confirm to CodingStandards.txt? - -- Does it make sense? - -- Can you predict what the function will do from its documentation? - - -Let's think about security! ---------------------------- - -- If there are any arrays, buffers, are you 100% sure that they cannot - overflow? - -- If there is any integer math, can it overflow or underflow? - -- If there are any allocations, are you sure there are corresponding - deallocations? - -- Is there a safer pattern that could be used in any case? - -- Have they used one of the Forbidden Functions? - -(Also see your favorite secure C programming guides.) diff --git a/src/tor/doc/HACKING/README.1st.md b/src/tor/doc/HACKING/README.1st.md deleted file mode 100644 index 8299fe634..000000000 --- a/src/tor/doc/HACKING/README.1st.md +++ /dev/null @@ -1,62 +0,0 @@ - -In this directory ------------------ - -This directory has helpful information about what you need to know to -hack on Tor! - -First, read `GettingStarted.md` to learn how to get a start in Tor -development. - -If you've decided to write a patch, `CodingStandards.txt` will give -you a bunch of information about how we structure our code. - -It's important to get code right! Reading `WritingTests.md` will -tell you how to write and run tests in the Tor codebase. - -There are a bunch of other programs we use to help maintain and -develop the codebase: `HelpfulTools.md` can tell you how to use them -with Tor. - -If it's your job to put out Tor releases, see `ReleasingTor.md` so -that you don't miss any steps! - - ------------------------ - -For full information on how Tor is supposed to work, look at the files in -`https://gitweb.torproject.org/torspec.git/tree`. - -For an explanation of how to change Tor's design to work differently, look at -`https://gitweb.torproject.org/torspec.git/blob_plain/HEAD:/proposals/001-process.txt`. - -For the latest version of the code, get a copy of git, and - - git clone https://git.torproject.org/git/tor - -We talk about Tor on the `tor-talk` mailing list. Design proposals and -discussion belong on the `tor-dev` mailing list. We hang around on -irc.oftc.net, with general discussion happening on #tor and development -happening on `#tor-dev`. - -The other files in this `HACKING` directory may also be useful as you -get started working with Tor. - -Happy hacking! - - ------------------------ - -XXXXX also describe - -doc/HACKING/WritingTests.md - -torguts.git - -torspec.git - -The design paper - -freehaven.net/anonbib - -XXXX describe these and add links. diff --git a/src/tor/doc/HACKING/ReleasingTor.md b/src/tor/doc/HACKING/ReleasingTor.md deleted file mode 100644 index 9cbc8710b..000000000 --- a/src/tor/doc/HACKING/ReleasingTor.md +++ /dev/null @@ -1,206 +0,0 @@ - -Putting out a new release -------------------------- - -Here are the steps that the maintainer should take when putting out a -new Tor release: - -=== 0. Preliminaries - -1. Get at least three of weasel/arma/Sebastian/Sina to put the new - version number in their approved versions list. Give them a few - days to do this if you can. - -2. If this is going to be an important security release, give the packagers - some advance warning: See this list of packagers in IV.3 below. - - -=== I. Make sure it works - -1. Use it for a while, as a client, as a relay, as a hidden service, - and as a directory authority. See if it has any obvious bugs, and - resolve those. - - As applicable, merge the `maint-X` branch into the `release-X` branch. - -2. Are all of the jenkins builders happy? See jenkins.torproject.org. - - What about the bsd buildbots? - See http://buildbot.pixelminers.net/builders/ - - What about Coverity Scan? - - What about clan scan-build? - - Does 'make distcheck' complain? - - How about 'make test-stem' and 'make test-network' and - `make test-network-full`? - - - Are all those tests still happy with --enable-expensive-hardening ? - - Any memory leaks? - - -=== II. Write a changelog - - -1a. (Alpha release variant) - - Gather the `changes/*` files into a changelog entry, rewriting many - of them and reordering to focus on what users and funders would find - interesting and understandable. - - To do this, first run `./scripts/maint/lintChanges.py changes/*` and - fix as many warnings as you can. Then run `./scripts/maint/sortChanges.py - changes/* > changelog.in` to combine headings and sort the entries. - After that, it's time to hand-edit and fix the issues that lintChanges - can't find: - - 1. Within each section, sort by "version it's a bugfix on", else by - numerical ticket order. - - 2. Clean them up: - - Make stuff very terse - - Make sure each section name ends with a colon - - Describe the user-visible problem right away - - Mention relevant config options by name. If they're rare or unusual, - remind people what they're for - - Avoid starting lines with open-paren - - Present and imperative tense: not past. - - 'Relays', not 'servers' or 'nodes' or 'Tor relays'. - - "Stop FOOing", not "Fix a bug where we would FOO". - - Try not to let any given section be longer than about a page. Break up - long sections into subsections by some sort of common subtopic. This - guideline is especially important when organizing Release Notes for - new stable releases. - - If a given changes stanza showed up in a different release (e.g. - maint-0.2.1), be sure to make the stanzas identical (so people can - distinguish if these are the same change). - - 3. Clean everything one last time. - - 4. Run `./scripts/maint/format_changelog.py --inplace` to make it prettier - -1b. (old-stable release variant) - - For stable releases that backport things from later, we try to compose - their releases, we try to make sure that we keep the changelog entries - identical to their original versions, with a 'backport from 0.x.y.z' - note added to each section. So in this case, once you have the items - from the changes files copied together, don't use them to build a new - changelog: instead, look up the corrected versions that were merged - into ChangeLog in the master branch, and use those. - -2. Compose a short release blurb to highlight the user-facing - changes. Insert said release blurb into the ChangeLog stanza. If it's - a stable release, add it to the ReleaseNotes file too. If we're adding - to a release-* branch, manually commit the changelogs to the later - git branches too. - -3. If there are changes that require or suggest operator intervention - before or during the update, mail operators (either dirauth or relays - list) with a headline that indicates that an action is required or - appreciated. - -4. If you're doing the first stable release in a series, you need to - create a ReleaseNotes for the series as a whole. To get started - there, copy all of the Changelog entries from the series into a new - file, and run `./scripts/maint/sortChanges.py` on it. That will - group them by category. Then kill every bugfix entry for fixing - bugs that were introduced within that release series; those aren't - relevant changes since the last series. At that point, it's time - to start sorting and condensing entries. (Generally, we don't edit the - text of existing entries, though.) - - -=== III. Making the source release. - -1. In `maint-0.?.x`, bump the version number in `configure.ac` and run - `perl scripts/maint/updateVersions.pl` to update version numbers in other - places, and commit. Then merge `maint-0.?.x` into `release-0.?.x`. - - (NOTE: To bump the version number, edit `configure.ac`, and then run - either `make`, or `perl scripts/maint/updateVersions.pl`, depending on - your version.) - -2. Make distcheck, put the tarball up in somewhere (how about your - homedir on your homedir on people.torproject.org?) , and tell `#tor` - about it. Wait a while to see if anybody has problems building it. - (Though jenkins is usually pretty good about catching these things.) - -=== IV. Commit, upload, announce - -1. Sign the tarball, then sign and push the git tag: - - gpg -ba - git tag -u tor-0.3.x.y-status - git push origin tag tor-0.3.x.y-status - -2. scp the tarball and its sig to the dist website, i.e. - `/srv/dist-master.torproject.org/htdocs/` on dist-master. When you want - it to go live, you run "static-update-component dist.torproject.org" - on dist-master. - - In the webwml.git repository, `include/versions.wmi` and `Makefile` - to note the new version. - - (NOTE: Due to #17805, there can only be one stable version listed at - once. Nonetheless, do not call your version "alpha" if it is stable, - or people will get confused.) - -3. Email the packagers (cc'ing tor-team) that a new tarball is up. - The current list of packagers is: - - - {weasel,gk,mikeperry} at torproject dot org - - {blueness} at gentoo dot org - - {paul} at invizbox dot io - - {vincent} at invizbox dot com - - {lfleischer} at archlinux dot org - - {Nathan} at freitas dot net - - {mike} at tig dot as - - {tails-rm} at boum dot org - - {simon} at sdeziel.info - - {yuri} at freebsd.org - - {mh+tor} at scrit.ch - -4. Add the version number to Trac. To do this, go to Trac, log in, - select "Admin" near the top of the screen, then select "Versions" from - the menu on the left. At the right, there will be an "Add version" - box. By convention, we enter the version in the form "Tor: - 0.2.2.23-alpha" (or whatever the version is), and we select the date as - the date in the ChangeLog. - -5. Mail the release blurb and ChangeLog to tor-talk (development release) or - tor-announce (stable). - - Post the changelog on the blog as well. You can generate a - blog-formatted version of the changelog with the -B option to - format-changelog. - - When you post, include an estimate of when the next TorBrowser - releases will come out that include this Tor release. This will - usually track https://wiki.mozilla.org/RapidRelease/Calendar , but it - can vary. - - -=== V. Aftermath and cleanup - -1. If it's a stable release, bump the version number in the - `maint-x.y.z` branch to "newversion-dev", and do a `merge -s ours` - merge to avoid taking that change into master. - -2. Forward-port the ChangeLog (and ReleaseNotes if appropriate). - -3. Keep an eye on the blog post, to moderate comments and answer questions. - diff --git a/src/tor/doc/HACKING/Tracing.md b/src/tor/doc/HACKING/Tracing.md deleted file mode 100644 index a5fb5165e..000000000 --- a/src/tor/doc/HACKING/Tracing.md +++ /dev/null @@ -1,91 +0,0 @@ -# Tracing # - -This document describes how the event tracing subsystem works in tor so -developers can add events to the code base but also hook them to an event -tracing framework. - -## Basics ### - -Event tracing is seperated in two concepts, trace events and a tracer. The -tracing subsystem can be found in `src/trace`. The `events.h` header file is -the main file that maps the different tracers to trace events. - -### Events ### - -A trace event is basically a function from which we can pass any data that -we want to collect. In addition, we specify a context for the event such as -a subsystem and an event name. - -A trace event in tor has the following standard format: - - tor_trace(subsystem, event\_name, args...) - -The `subsystem` parameter is the name of the subsytem the trace event is in. -For example that could be "scheduler" or "vote" or "hs". The idea is to add -some context to the event so when we collect them we know where it's coming -from. The `event_name` is the name of the event which helps a lot with -adding some semantic to the event. Finally, `args` is any number of -arguments we want to collect. - -Here is an example of a possible tracepoint in main(): - - tor_trace(main, init_phase, argc) - -The above is a tracepoint in the `main` subsystem with `init_phase` as the -event name and the `int argc` is passed to the event as well. - -How `argc` is collected or used has nothing to do with the instrumentation -(adding trace events to the code). It is the work of the tracer so this is why -the trace events and collection framework (tracer) are decoupled. You _can_ -have trace events without a tracer. - -### Tracer ### - -In `src/trace/events.h`, we map the `tor_trace()` function to the right -tracer. A tracer support is only enabled at compile time. For instance, the -file `src/trace/debug.h` contains the mapping of the generic tracing function -`tor_trace()` to the `log_debug()` function. More specialized function can be -mapped depending on the tracepoint. - -## Build System ## - -This section describes how it is integrated into the build system of tor. - -By default, every tracing events are disabled in tor that is `tor_trace()` -is a NOP. - -To enable a tracer, there is a configure option on the form of: - - --enable-tracing- - -We have an option that will send every trace events to a `log_debug()` (as -mentionned above) which will print you the subsystem and name of the event but -not the arguments for technical reasons. This is useful if you want to quickly -see if your trace event is being hit or well written. To do so, use this -configure option: - - --enable-tracing-debug - -## Instrument Tor ## - -This is pretty easy. Let's say you want to add a trace event in -`src/or/rendcache.c`, you only have to add this include statement: - - #include "trace/events.h" - -Once done, you can add as many as you want `tor_trace()` that you need. -Please use the right subsystem (here it would be `hs`) and a unique name that -tells what the event is for. For example: - - tor_trace(hs, store_desc_as_client, desc, desc_id); - -If you look in `src/trace/events.h`, you'll see that if tracing is enabled it -will be mapped to a function called: - - tor_trace_hs_store_desc_as_client(desc, desc_id) - -And the point of all this is for that function to be defined in a new file -that you might want to add named `src/trace/hs.{c|h}` which would defined how -to collect the data for the `tor_trace_hs_store_desc_as_client()` function -like for instance sending it to a `log_debug()` or do more complex operations -or use a userspace tracer like LTTng (https://lttng.org). diff --git a/src/tor/doc/HACKING/WritingTests.md b/src/tor/doc/HACKING/WritingTests.md deleted file mode 100644 index cc393494e..000000000 --- a/src/tor/doc/HACKING/WritingTests.md +++ /dev/null @@ -1,499 +0,0 @@ - -Writing tests for Tor: an incomplete guide -========================================== - -Tor uses a variety of testing frameworks and methodologies to try to -keep from introducing bugs. The major ones are: - - 1. Unit tests written in C and shipped with the Tor distribution. - - 2. Integration tests written in Python and shipped with the Tor - distribution. - - 3. Integration tests written in Python and shipped with the Stem - library. Some of these use the Tor controller protocol. - - 4. System tests written in Python and SH, and shipped with the - Chutney package. These work by running many instances of Tor - locally, and sending traffic through them. - - 5. The Shadow network simulator. - -How to run these tests ----------------------- - -### The easy version - -To run all the tests that come bundled with Tor, run `make check`. - -To run the Stem tests as well, fetch stem from the git repository, -set `STEM_SOURCE_DIR` to the checkout, and run `make test-stem`. - -To run the Chutney tests as well, fetch chutney from the git repository, -set `CHUTNEY_PATH` to the checkout, and run `make test-network`. - -To run all of the above, run `make test-full`. - -To run all of the above, plus tests that require a working connection to the -internet, run `make test-full-online`. - -### Running particular subtests - -The Tor unit tests are divided into separate programs and a couple of -bundled unit test programs. - -Separate programs are easy. For example, to run the memwipe tests in -isolation, you just run `./src/test/test-memwipe`. - -To run tests within the unit test programs, you can specify the name -of the test. The string ".." can be used as a wildcard at the end of the -test name. For example, to run all the cell format tests, enter -`./src/test/test cellfmt/..`. - -Many tests that need to mess with global state run in forked subprocesses in -order to keep from contaminating one another. But when debugging a failing test, -you might want to run it without forking a subprocess. To do so, use the -`--no-fork` option with a single test. (If you specify it along with -multiple tests, they might interfere.) - -You can turn on logging in the unit tests by passing one of `--debug`, -`--info`, `--notice`, or `--warn`. By default only errors are displayed. - -Unit tests are divided into `./src/test/test` and `./src/test/test-slow`. -The former are those that should finish in a few seconds; the latter tend to -take more time, and may include CPU-intensive operations, deliberate delays, -and stuff like that. - -### Finding test coverage - -Test coverage is a measurement of which lines your tests actually visit. - -When you configure Tor with the `--enable-coverage` option, it should -build with support for coverage in the unit tests, and in a special -`tor-cov` binary. - -Then, run the tests you'd like to see coverage from. If you have old -coverage output, you may need to run `reset-gcov` first. - -Now you've got a bunch of files scattered around your build directories -called `*.gcda`. In order to extract the coverage output from them, make a -temporary directory for them and run `./scripts/test/coverage ${TMPDIR}`, -where `${TMPDIR}` is the temporary directory you made. This will create a -`.gcov` file for each source file under tests, containing that file's source -annotated with the number of times the tests hit each line. (You'll need to -have gcov installed.) - -You can get a summary of the test coverage for each file by running -`./scripts/test/cov-display ${TMPDIR}/*` . Each line lists the file's name, -the number of uncovered lines, the number of uncovered lines, and the -coverage percentage. - -For a summary of the test coverage for each _function_, run -`./scripts/test/cov-display -f ${TMPDIR}/*`. - -For more details on using gcov, including the helper scripts in -scripts/test, see HelpfulTools.md. - -### Comparing test coverage - -Sometimes it's useful to compare test coverage for a branch you're writing to -coverage from another branch (such as git master, for example). But you -can't run `diff` on the two coverage outputs directly, since the actual -number of times each line is executed aren't so important, and aren't wholly -deterministic. - -Instead, follow the instructions above for each branch, creating a separate -temporary directory for each. Then, run `./scripts/test/cov-diff ${D1} -${D2}`, where D1 and D2 are the directories you want to compare. This will -produce a diff of the two directories, with all lines normalized to be either -covered or uncovered. - -To count new or modified uncovered lines in D2, you can run: - - ./scripts/test/cov-diff ${D1} ${D2}" | grep '^+ *\#' | wc -l - -### Marking lines as unreachable by tests - -You can mark a specific line as unreachable by using the special -string LCOV_EXCL_LINE. You can mark a range of lines as unreachable -with LCOV_EXCL_START... LCOV_EXCL_STOP. Note that older versions of -lcov don't understand these lines. - -You can post-process .gcov files to make these lines 'unreached' by -running ./scripts/test/cov-exclude on them. It marks excluded -unreached lines with 'x', and excluded reached lines with '!!!'. - -Note: you should never do this unless the line is meant to 100% -unreachable by actual code. - - -What kinds of test should I write? ----------------------------------- - -Integration testing and unit testing are complementary: it's probably a -good idea to make sure that your code is hit by both if you can. - -If your code is very-low level, and its behavior is easily described in -terms of a relation between inputs and outputs, or a set of state -transitions, then it's a natural fit for unit tests. (If not, please -consider refactoring it until most of it _is_ a good fit for unit -tests!) - -If your code adds new externally visible functionality to Tor, it would -be great to have a test for that functionality. That's where -integration tests more usually come in. - -Unit and regression tests: Does this function do what it's supposed to? ------------------------------------------------------------------------ - -Most of Tor's unit tests are made using the "tinytest" testing framework. -You can see a guide to using it in the tinytest manual at - - https://github.com/nmathewson/tinytest/blob/master/tinytest-manual.md - -To add a new test of this kind, either edit an existing C file in `src/test/`, -or create a new C file there. Each test is a single function that must -be indexed in the table at the end of the file. We use the label "done:" as -a cleanup point for all test functions. - -If you have created a new test file, you will need to: -1. Add the new test file to include.am -2. In `test.h`, include the new test cases (testcase_t) -3. In `test.c`, add the new test cases to testgroup_t testgroups - -(Make sure you read `tinytest-manual.md` before proceeding.) - -I use the term "unit test" and "regression tests" very sloppily here. - -### A simple example - -Here's an example of a test function for a simple function in util.c: - - static void - test_util_writepid(void *arg) - { - (void) arg; - - char *contents = NULL; - const char *fname = get_fname("tmp_pid"); - unsigned long pid; - char c; - - write_pidfile(fname); - - contents = read_file_to_str(fname, 0, NULL); - tt_assert(contents); - - int n = sscanf(contents, "%lu\n%c", &pid, &c); - tt_int_op(n, OP_EQ, 1); - tt_int_op(pid, OP_EQ, getpid()); - - done: - tor_free(contents); - } - -This should look pretty familiar to you if you've read the tinytest -manual. One thing to note here is that we use the testing-specific -function `get_fname` to generate a file with respect to a temporary -directory that the tests use. You don't need to delete the file; -it will get removed when the tests are done. - -Also note our use of `OP_EQ` instead of `==` in the `tt_int_op()` calls. -We define `OP_*` macros to use instead of the binary comparison -operators so that analysis tools can more easily parse our code. -(Coccinelle really hates to see `==` used as a macro argument.) - -Finally, remember that by convention, all `*_free()` functions that -Tor defines are defined to accept NULL harmlessly. Thus, you don't -need to say `if (contents)` in the cleanup block. - -### Exposing static functions for testing - -Sometimes you need to test a function, but you don't want to expose -it outside its usual module. - -To support this, Tor's build system compiles a testing version of -each module, with extra identifiers exposed. If you want to -declare a function as static but available for testing, use the -macro `STATIC` instead of `static`. Then, make sure there's a -macro-protected declaration of the function in the module's header. - -For example, `crypto_curve25519.h` contains: - - #ifdef CRYPTO_CURVE25519_PRIVATE - STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret, - const uint8_t *basepoint); - #endif - -The `crypto_curve25519.c` file and the `test_crypto.c` file both define -`CRYPTO_CURVE25519_PRIVATE`, so they can see this declaration. - -### STOP! Does this test really test? - -When writing tests, it's not enough to just generate coverage on all the -lines of the code that you're testing: It's important to make sure that -the test _really tests_ the code. - -For example, here is a _bad_ test for the unlink() function (which is -supposed to remove a file). - - static void - test_unlink_badly(void *arg) - { - (void) arg; - int r; - - const char *fname = get_fname("tmpfile"); - - /* If the file isn't there, unlink returns -1 and sets ENOENT */ - r = unlink(fname); - tt_int_op(n, OP_EQ, -1); - tt_int_op(errno, OP_EQ, ENOENT); - - /* If the file DOES exist, unlink returns 0. */ - write_str_to_file(fname, "hello world", 0); - r = unlink(fnme); - tt_int_op(r, OP_EQ, 0); - - done: - tor_free(contents); - } - - -This test might get very high coverage on unlink(). So why is it a -bad test? Because it doesn't check that unlink() *actually removes the -named file*! - -Remember, the purpose of a test is to succeed if the code does what -it's supposed to do, and fail otherwise. Try to design your tests so -that they check for the code's intended and documented functionality -as much as possible. - - -### Mock functions for testing in isolation - -Often we want to test that a function works right, but the function to -be tested depends on other functions whose behavior is hard to observe, -or which require a working Tor network, or something like that. - -To write tests for this case, you can replace the underlying functions -with testing stubs while your unit test is running. You need to declare -the underlying function as 'mockable', as follows: - - MOCK_DECL(returntype, functionname, (argument list)); - -and then later implement it as: - - MOCK_IMPL(returntype, functionname, (argument list)) - { - /* implementation here */ - } - -For example, if you had a 'connect to remote server' function, you could -declare it as: - - - MOCK_DECL(int, connect_to_remote, (const char *name, status_t *status)); - -When you declare a function this way, it will be declared as normal in -regular builds, but when the module is built for testing, it is declared -as a function pointer initialized to the actual implementation. - -In your tests, if you want to override the function with a temporary -replacement, you say: - - MOCK(functionname, replacement_function_name); - -And later, you can restore the original function with: - - UNMOCK(functionname); - -For more information, see the definitions of this mocking logic in -`testsupport.h`. - -### Okay but what should my tests actually do? - -We talk above about "test coverage" -- making sure that your tests visit -every line of code, or every branch of code. But visiting the code isn't -enough: we want to verify that it's correct. - -So when writing tests, try to make tests that should pass with any correct -implementation of the code, and that should fail if the code doesn't do what -it's supposed to do. - -You can write "black-box" tests or "glass-box" tests. A black-box test is -one that you write without looking at the structure of the function. A -glass-box one is one you implement while looking at how the function is -implemented. - -In either case, make sure to consider common cases *and* edge cases; success -cases and failure csaes. - -For example, consider testing this function: - - /** Remove all elements E from sl such that E==element. Preserve - * the order of any elements before E, but elements after E can be - * rearranged. - */ - void smartlist_remove(smartlist_t *sl, const void *element); - -In order to test it well, you should write tests for at least all of the -following cases. (These would be black-box tests, since we're only looking -at the declared behavior for the function: - - * Remove an element that is in the smartlist. - * Remove an element that is not in the smartlist. - * Remove an element that appears in the smartlist more than once. - -And your tests should verify that it behaves correct. At minimum, you should -test: - - * That other elements before E are in the same order after you call the - functions. - * That the target element is really removed. - * That _only_ the target element is removed. - -When you consider edge cases, you might try: - - * Remove an element from an empty list. - * Remove an element from a singleton list containing that element. - * Remove an element for a list containing several instances of that - element, and nothing else. - -Now let's look at the implementation: - - void - smartlist_remove(smartlist_t *sl, const void *element) - { - int i; - if (element == NULL) - return; - for (i=0; i < sl->num_used; i++) - if (sl->list[i] == element) { - sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ - i--; /* so we process the new i'th element */ - sl->list[sl->num_used] = NULL; - } - } - -Based on the implementation, we now see three more edge cases to test: - - * Removing NULL from the list. - * Removing an element from the end of the list - * Removing an element from a position other than the end of the list. - - -### What should my tests NOT do? - -Tests shouldn't require a network connection. - -Whenever possible, tests shouldn't take more than a second. Put the test -into test/slow if it genuinely needs to be run. - -Tests should not alter global state unless they run with `TT_FORK`: Tests -should not require other tests to be run before or after them. - -Tests should not leak memory or other resources. To find out if your tests -are leaking memory, run them under valgrind (see HelpfulTools.txt for more -information on how to do that). - -When possible, tests should not be over-fit to the implementation. That is, -the test should verify that the documented behavior is implemented, but -should not break if other permissible behavior is later implemented. - - -### Advanced techniques: Namespaces - -Sometimes, when you're doing a lot of mocking at once, it's convenient to -isolate your identifiers within a single namespace. If this were C++, we'd -already have namespaces, but for C, we do the best we can with macros and -token-pasting. - -We have some macros defined for this purpose in `src/test/test.h`. To use -them, you define `NS_MODULE` to a prefix to be used for your identifiers, and -then use other macros in place of identifier names. See `src/test/test.h` for -more documentation. - - -Integration tests: Calling Tor from the outside ------------------------------------------------ - -Some tests need to invoke Tor from the outside, and shouldn't run from the -same process as the Tor test program. Reasons for doing this might include: - - * Testing the actual behavior of Tor when run from the command line - * Testing that a crash-handler correctly logs a stack trace - * Verifying that violating a sandbox or capability requirement will - actually crash the program. - * Needing to run as root in order to test capability inheritance or - user switching. - -To add one of these, you generally want a new C program in `src/test`. Add it -to `TESTS` and `noinst_PROGRAMS` if it can run on its own and return success or -failure. If it needs to be invoked multiple times, or it needs to be -wrapped, add a new shell script to `TESTS`, and the new program to -`noinst_PROGRAMS`. If you need access to any environment variable from the -makefile (eg `${PYTHON}` for a python interpreter), then make sure that the -makefile exports them. - -Writing integration tests with Stem ------------------------------------ - -The 'stem' library includes extensive tests for the Tor controller protocol. -You can run stem tests from tor with `make test-stem`, or see -`https://stem.torproject.org/faq.html#how-do-i-run-the-tests`. - -To see what tests are available, have a look around the `test/*` directory in -stem. The first thing you'll notice is that there are both `unit` and `integ` -tests. The former are for tests of the facilities provided by stem itself that -can be tested on their own, without the need to hook up a tor process. These -are less relevant, unless you want to develop a new stem feature. The latter, -however, are a very useful tool to write tests for controller features. They -provide a default environment with a connected tor instance that can be -modified and queried. Adding more integration tests is a great way to increase -the test coverage inside Tor, especially for controller features. - -Let's assume you actually want to write a test for a previously untested -controller feature. I'm picking the `exit-policy/*` GETINFO queries. Since -these are a controller feature that we want to write an integration test for, -the right file to modify is -`https://gitweb.torproject.org/stem.git/tree/test/integ/control/controller.py`. - -First off we notice that there is an integration test called -`test_get_exit_policy()` that's already written. This exercises the interaction -of stem's `Controller.get_exit_policy()` method, and is not relevant for our -test since there are no stem methods to make use of all `exit-policy/*` -queries (if there were, likely they'd be tested already. Maybe you want to -write a stem feature, but I chose to just add tests). - -Our test requires a tor controller connection, so we'll use the -`@require_controller` annotation for our `test_exit_policy()` method. We need a -controller instance, which we get from -`test.runner.get_runner().get_tor_controller()`. The attached Tor instance is -configured as a client, but the exit-policy GETINFO queries need a relay to -work, so we have to change the config (using `controller.set_options()`). This -is OK for us to do, we just have to remember to set DisableNetwork so we don't -actually start an exit relay and also to undo the changes we made (by calling -`controller.reset_conf()` at the end of our test). Additionally, we have to -configure a static Address for Tor to use, because it refuses to build a -descriptor when it can't guess a suitable IP address. Unfortunately, these -kinds of tripwires are everywhere. Don't forget to file appropriate tickets if -you notice any strange behaviour that seems totally unreasonable. - -Check out the `test_exit_policy()` function in abovementioned file to see the -final implementation for this test. - -System testing with Chutney ---------------------------- - -The 'chutney' program configures and launches a set of Tor relays, -authorities, and clients on your local host. It has a `test network` -functionality to send traffic through them and verify that the traffic -arrives correctly. - -You can write new test networks by adding them to `networks`. To add -them to Tor's tests, add them to the `test-network` or `test-network-all` -targets in `Makefile.am`. - -(Adding new kinds of program to chutney will still require hacking the -code.) diff --git a/src/tor/doc/HACKING/android/Simpleperf.md b/src/tor/doc/HACKING/android/Simpleperf.md deleted file mode 100644 index c12558aed..000000000 --- a/src/tor/doc/HACKING/android/Simpleperf.md +++ /dev/null @@ -1,98 +0,0 @@ -# Using `simpleperf` to collect CPU profiling on Android - -This document describes how you can use Android's `simpleperf` -command-line tool to get CPU profiling information from Tor via the -Orbot application. The tool is particularly useful for Tor development -because it is able to profile native applications on the platform -whereas a lot of the normal tooling for the Android platform is only -able to collect information from Java-based applications. - -## Prerequisites - -Before using `simpleperf` there is a couple of steps that must be -followed. You should make sure you have both a recent installation of -the Android Software Development Kit (SDK) and Native Development Kit -(NDK) installed. These can be found on the Android Developers website. - -1. Follow the build instructions from the `BUILD` file in the Orbot - repository and build an Orbot APK (Android Package) file with - debugging enabled. Make sure that when you build the native content of - the Orbot application that you run the `make -C external` command with - an additional `DEBUG=1` as paramter to ensure that the Orbot build - process does not strip the debug symbols from the Tor binary. - -2. (Optional) Uninstall and clean-up your old Orbot installation that - is most likely downloaded from Google's Play Store or via fdroid: - - $ adb shell pm clear org.torproject.android - $ adb uninstall org.torproject.android - -3. Install the Android Package you generated in step 1: - - $ adb install /path/to/your/app-fullperm-debug.apk - -4. Check on your device that the newly installed Orbot actually works - and behaves in the way you expect it to. - -## Profiling using `simpleperf` - -The `simpleperf` tool can be found in the `simpleperf/` directory in -the directory where you installed the Android NDK to. In this -directory there is a set of Python files that will help you deploy the -tool to a device and collect the measurement data such that you can -analyze the results on your computer rather than on your phone. - -1. Change directory to the location of the `simpleperf` directory. -2. Open the `app_profiler.config` file and change - `app_package_name` to `org.torproject.android`, `apk_file_path` to - the path of your Orbot Android Package (APK file). -3. Optionally change the duration parameter in the `record_options` - variable in `app_profiler.config` to the duration which you would like - to collect samples in. The value is specified in seconds. -4. Run the app profiler using `python app_profiler.py`. This helper - script will push the `simpleperf` tool to your device, start the - profiler, and once it has completed copy the generated `perf.data` - file over to your computer with the results. - -### Analyzing the results - -You can inspect your resulting `perf.data` file via a simple GUI -program `python report.py` or via the command-line tool `simpleperf -report`. I've found the GUI tool to be easier to navigate around with -than the command-line tool. - -The `-g` option can be passed to the command line `simpleperf report` -tool allows you to see the call graph of functions and how much time -was spend on the call. - -## Tips & Tricks - -- When you have installed Orbot the first time, you will notice that - if you get a shell on the Android device that there is no Tor binary - available. This is because Orbot unpacks the Tor binary first time it - is executed and places it under the `app_bin/` directory on the - device. - - To access binaries, `torrc` files, and other useful information on - the device do the following: - - $ adb shell - (device):/ $ run-as org.torproject.android - (device):/data/data/org.torproject.android $ ls - app_bin app_data cache databases files lib shared_prefs - - Descriptors, control authentication cookie, state, and other files can be - found in the `app_data` directory. The `torrc` can be found in the `app_bin/` - directory. - -- You can enable logging in Tor via the syslog (or android) log - mechanism with: - - $ adb shell - (device):/ $ run-as org.torproject.android - (device):/data/data/org.torproject.android $ echo -e "\nLog info syslog" >> app_bin/torrc - - Start Tor the normal way via Orbot and collect the logs from your computer using - - $ adb logcat - diff --git a/src/tor/doc/TUNING b/src/tor/doc/TUNING deleted file mode 100644 index 24552a38c..000000000 --- a/src/tor/doc/TUNING +++ /dev/null @@ -1,86 +0,0 @@ -Most operating systems limit an amount of TCP sockets that can be used -simultaneously. It is possible for a busy Tor relay to run into these -limits, thus being unable to fully utilize the bandwidth resources it -has at its disposal. Following system-specific tips might be helpful -to alleviate the aforementioned problem. - -Linux ------ - -Use 'ulimit -n' to raise an allowed number of file descriptors to be -opened on your host at the same time. - -FreeBSD -------- - -Tune the followind sysctl(8) variables: - * kern.maxfiles - maximum allowed file descriptors (for entire system) - * kern.maxfilesperproc - maximum file descriptors one process is allowed - to use - * kern.ipc.maxsockets - overall maximum numbers of sockets for entire - system - * kern.ipc.somaxconn - size of listen queue for incoming TCP connections - for entire system - -See also: - * https://www.freebsd.org/doc/handbook/configtuning-kernel-limits.html - * https://wiki.freebsd.org/NetworkPerformanceTuning - -Mac OS X --------- - -Since Mac OS X is BSD-based system, most of the above hold for OS X as well. -However, launchd(8) is known to modify kern.maxfiles and kern.maxfilesperproc -when it launches tor service (see launchd.plist(5) manpage). Also, -kern.ipc.maxsockets is determined dynamically by the system and thus is -read-only on OS X. - -OpenBSD -------- - -Because OpenBSD is primarily focused on security and stability, it uses default -resource limits stricter than those of more popular Unix-like operating systems. - -OpenBSD stores a kernel-level file descriptor limit in the sysctl variable -kern.maxfiles. It defaults to 7,030. To change it to, for example, 16,000 while -the system is running, use the command 'sudo sysctl kern.maxfiles=16000'. -kern.maxfiles will reset to the default value upon system reboot unless you also -add 'kern.maxfiles=16000' to the file /etc/sysctl.conf. - -There are stricter resource limits set on user classes, which are stored in -/etc/login.conf. This config file also allows limit sets for daemons started -with scripts in the /etc/rc.d directory, which presumably includes Tor. - -To increase the file descriptor limit from its default of 1,024, add the -following to /etc/login.conf: - -tor:\ - :openfiles-max=13500:\ - :tc=daemon: - -Upon restarting Tor, it will be able to open up to 13,500 file descriptors. - -This will work *only* if you are starting Tor with the script /etc/rc.d/tor. If -you're using a custom build instead of the package, you can easily copy the rc.d -script from the Tor port directory. Alternatively, you can ensure that the Tor's -daemon user has its own user class and make a /etc/login.conf entry for it. - -High-bandwidth relays sometimes give the syslog warning: - -/bsd: WARNING: mclpools limit reached; increase kern.maxclusters - -In this case, increase kern.maxclusters with the sysctl command and in the file -/etc/sysctl.conf, as described with kern.maxfiles above. Use 'sysctl -kern.maxclusters' to query the current value. Increasing by about 15% per day -until the error no longer appears is a good guideline. - -Disclaimer ----------- - -Do note that this document is a draft and above information may be -technically incorrect and/or incomplete. If so, please open a ticket -on https://trac.torproject.org or post to tor-relays mailing list. - -Are you running a busy Tor relay? Let us know how you are solving -the out-of-sockets problem on your system. - diff --git a/src/tor/doc/asciidoc-helper.sh b/src/tor/doc/asciidoc-helper.sh deleted file mode 100644 index a3ef53f88..000000000 --- a/src/tor/doc/asciidoc-helper.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -# Copyright (c) The Tor Project, Inc. -# See LICENSE for licensing information -# Run this to generate .html.in or .1.in files from asciidoc files. -# Arguments: -# html|man asciidocpath outputfile - -set -e - -if [ $# != 3 ]; then - exit 1; -fi - -output=$3 - -if [ "$1" = "html" ]; then - input=${output%%.html.in}.1.txt - base=${output%%.html.in} - - if [ "$2" != none ]; then - TZ=UTC "$2" -d manpage -o $output $input; - else - echo "=================================="; - echo; - echo "You need asciidoc installed to be able to build the manpage."; - echo "To build without manpages, use the --disable-asciidoc argument"; - echo "when calling configure."; - echo; - echo "=================================="; - exit 1; - fi -elif [ "$1" = "man" ]; then - input=${output%%.1.in}.1.txt - base=${output%%.1.in} - - if test "$2" = none; then - echo "=================================="; - echo; - echo "You need asciidoc installed to be able to build the manpage."; - echo "To build without manpages, use the --disable-asciidoc argument"; - echo "when calling configure."; - echo; - echo "=================================="; - exit 1; - fi - if "$2" -f manpage $input; then - mv $base.1 $output; - else - cat< - perl Configure VC-WIN32 - perl util\mkfiles.pl >MINFO - perl util\mk1mf.pl no-asm dll VC-WIN32 >32dll.mak - perl util\mkdef.pl 32 libeay > ms\libeay32.def - perl util\mkdef.pl 32 ssleay > ms\ssleay32.def - nmake -f 32dll.mak - -Making OpenSSL final package: - - Create , I'd recommend using a name like -vc10. - - Copy the following directories and files to their respective locations - \inc32\openssl => \include\openssl - \out32dll\libeay32.lib => \lib\libeay32.lib - \out32dll\ssleay32.lib => \lib\ssleay32.lib - \out32dll\libeay32.dll => \bin\libeay32.dll - \out32dll\openssl.exe => \bin\openssl.exe - \out32dll\ssleay32.dll => \bin\ssleay32.dll - -Building Zlib from source: - - cd - nmake -f win32/Makefile.msc - -Building libevent: - - cd - mkdir build && cd build - SET OPENSSL_ROOT_DIR= - cmake -G "NMake Makefiles" .. -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING="/MT /Zi /O2 /Ob1 /D NDEBUG" -DZLIB_LIBRARY:FILEPATH="\zdll.lib" -DZLIB_INCLUDE_DIR:PATH="" - nmake event - -Building Tor: - - Create a dir above tor source dir named build-alpha and two subdirs include - and lib. - - Your build tree should now be similar to this one: - * build-alpha - - include - - lib - * - - build - - cmake - - ... - * - - ... - - ms - - util - - ... - * - - bin - - include - - lib - * - - ... - - src - - ... - * - - ... - - win32 - - ... - - Copy the following dirs and files to the following locations: - \include\openssl => build-alpha\include\openssl - \include => build-alpha\include - \WIN32-Code\nmake\event2 => build-alpha\include\event2 - \z*.h => build-alpha\include\z*.h - - Now copy the following files to the following locations and rename them - according new names: - - \build\lib\event.lib => build-alpha\lib\libevent.lib - \lib\libeay32.lib => build-alpha\lib\libcrypto.lib - \lib\ssleay32.lib => build-alpha\lib\libssl.lib - \zdll.lib => build-alpha\lib\libz.lib - - And we are now ready for the build process: - - cd - nmake -f Makefile.nmake - - After the above process is completed there should be a tor.exe in \src\or - - Copy tor.exe to desired location and also copy zlib1.dll, libeay32.dll and - ssleay32.dll from built zlib and openssl packages - diff --git a/src/tor/doc/contrib/tor-rpm-creation.txt b/src/tor/doc/contrib/tor-rpm-creation.txt deleted file mode 100644 index 9c4e05764..000000000 --- a/src/tor/doc/contrib/tor-rpm-creation.txt +++ /dev/null @@ -1,56 +0,0 @@ -## Instructions for building the official rpms. -## -The process used to create the official rpms is as follows: - -You'll need to install libevent headers, usually located in package named -libevent-devel. Alternatively, you could download latest libevent from -http://libevent.org/ but that shouldn't be necessary. - -Download and Extract the latest tor source code from -https://www.torproject.org/download - -In the resulting directory: -LIBS=-lrt ./configure -make dist-rpm - -You should have at least two, maybe three, rpms. There should be the binary -(i686|x86_64).rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm. -The debuginfo rpms are created if package redhat-rpm-config is installed (case -of redhat distros). - -This step suffices unless you want to create RPMs for distros other than the -one you used for building. - - -## Instructions for building RPMs for multiple architectures or distributions -## using 'mock' on Fedora or RHEL (and clones) - -Make sure you have mock installed and configured, see following HOWTOs for setup: -https://fedoraproject.org/wiki/How_to_create_an_RPM_package -https://fedoraproject.org/wiki/Using_Mock_to_test_package_builds - -Take the source RPM generated by previous step, and execute mock for every -target architecture (the names come from files in /etc/mock, strip the .cfg -extension in the -r parameter): - -mock --rebuild -r fedora-17-x86_64 tor-X.Y.Z.src.rpm - -Building for EL5 from newer distro (e.g. EL6 or Fedora 17) will fail due to bug -(https://bugzilla.redhat.com/show_bug.cgi?id=490613). -Here's a workaround: - -Before even building the source RPM, install fedora-packager and instruct -the build system to use rpmbuild-md5 like this: - -dnf install fedora-packager -export RPMBUILD=rpmbuild-md5 - -Then proceed as usual to create the source RPM and binary RPMs: - -LIBS=-lrt ./configure -make dist-rpm -mock --rebuild -r epel-5-x86_64 tor-X.Y.Z.src.rpm - - -(Note: don't build under OpenVZ - it breaks unshare() syscall, which in turn -breaks mock. It could save you several hours.) diff --git a/src/tor/doc/include.am b/src/tor/doc/include.am deleted file mode 100644 index 0e8de231e..000000000 --- a/src/tor/doc/include.am +++ /dev/null @@ -1,88 +0,0 @@ -# We use a two-step process to generate documentation from asciidoc files. -# -# First, we use asciidoc/a2x to process the asciidoc files into .1.in and -# .html.in files (see the asciidoc-helper.sh script). These are the same as -# the regular .1 and .html files, except that they still have some autoconf -# variables set in them. -# -# Second, we use config.status to turn .1.in files into .1 files and -# .html.in files into .html files. -# -# We do the steps in this order so that we can ship the .*.in files as -# part of the source distribution, so that people without asciidoc can -# just use the .1 and .html files. - -all_mans = doc/tor doc/tor-gencert doc/tor-resolve doc/torify - -if USE_ASCIIDOC -nodist_man1_MANS = $(all_mans:=.1) -doc_DATA = $(all_mans:=.html) -html_in = $(all_mans:=.html.in) -man_in = $(all_mans:=.1.in) -txt_in = $(all_mans:=.1.txt) -else -html_in = -man_in = -txt_in = -nodist_man1_MANS = -doc_DATA = -endif - -EXTRA_DIST+= doc/asciidoc-helper.sh \ - $(html_in) $(man_in) $(txt_in) \ - doc/state-contents.txt \ - doc/torrc_format.txt \ - doc/TUNING \ - doc/HACKING/README.1st.md \ - doc/HACKING/CodingStandards.md \ - doc/HACKING/GettingStarted.md \ - doc/HACKING/HelpfulTools.md \ - doc/HACKING/HowToReview.md \ - doc/HACKING/ReleasingTor.md \ - doc/HACKING/WritingTests.md - -docdir = @docdir@ - -asciidoc_product = $(nodist_man1_MANS) $(doc_DATA) - -# Generate the html documentation from asciidoc, but don't do -# machine-specific replacements yet -$(html_in) : - $(AM_V_GEN)$(top_srcdir)/doc/asciidoc-helper.sh html @ASCIIDOC@ $(top_srcdir)/$@ - -# Generate the manpage from asciidoc, but don't do -# machine-specific replacements yet -$(man_in) : - $(AM_V_GEN)$(top_srcdir)/doc/asciidoc-helper.sh man @A2X@ $(top_srcdir)/$@ - -doc/tor.1.in: doc/tor.1.txt -doc/torify.1.in: doc/torify.1.txt -doc/tor-gencert.1.in: doc/tor-gencert.1.txt -doc/tor-resolve.1.in: doc/tor-resolve.1.txt - -doc/tor.html.in: doc/tor.1.txt -doc/torify.html.in: doc/torify.1.txt -doc/tor-gencert.html.in: doc/tor-gencert.1.txt -doc/tor-resolve.html.in: doc/tor-resolve.1.txt - -# use config.status to swap all machine-specific magic strings -# in the asciidoc with their replacements. -$(asciidoc_product) : - $(AM_V_GEN)$(MKDIR_P) $(@D) - $(AM_V_at)if test -e $(top_srcdir)/$@.in && ! test -e $@.in ; then \ - cp $(top_srcdir)/$@.in $@; \ - fi - $(AM_V_at)$(top_builddir)/config.status -q --file=$@; - -doc/tor.html: doc/tor.html.in -doc/tor-gencert.html: doc/tor-gencert.html.in -doc/tor-resolve.html: doc/tor-resolve.html.in -doc/torify.html: doc/torify.html.in - -doc/tor.1: doc/tor.1.in -doc/tor-gencert.1: doc/tor-gencert.1.in -doc/tor-resolve.1: doc/tor-resolve.1.in -doc/torify.1: doc/torify.1.in - -CLEANFILES+= $(asciidoc_product) -DISTCLEANFILES+= $(html_in) $(man_in) diff --git a/src/tor/doc/state-contents.txt b/src/tor/doc/state-contents.txt deleted file mode 100644 index 44716efc0..000000000 --- a/src/tor/doc/state-contents.txt +++ /dev/null @@ -1,105 +0,0 @@ - -Contents of the Tor state file -============================== - -The state file is structured with more or less the same rules as torrc. -Recognized fields are: - - TorVersion - - The version of Tor that wrote this file - - LastWritten - - Time when this state file was written. - Given in ISO format (YYYY-MM-DD HH:MM:SS) - - AccountingBytesReadInInterval (memory unit) - AccountingBytesWrittenInInterval (memory unit) - AccountingExpectedUsage (memory unit) - AccountingIntervalStart (ISO time) - AccountingSecondsActive (time interval) - AccountingSecondsToReachSoftLimit (time interval) - AccountingSoftLimitHitAt (ISO time) - AccountingBytesAtSoftLimit (memory unit) - - These fields describe the state of the accounting subsystem. - - The IntervalStart is the time at which the current accounting - interval began. We were expecting to use ExpectedUsage over the - course of the interval. BytesRead/BytesWritten are the total - number of bytes transferred over the whole interval. If Tor has - been active during the interval, then AccountingSecondsActive is - the amount of time for which it has been active. We were expecting - to hit the bandwidth soft limit in SecondsToReachSoftLimit after we - became active. When we hit the soft limit, we record - BytesAtSoftLimit. If we hit the soft limit already, we did so at - SoftLimitHitAt. - - EntryGuard - EntryGuardDownSince - EntryGuardUnlistedSince - EntryGuardAddedBy - - These lines form sections related to entry guards. Each section - starts with a single EntryGuard line, and is then followed by - information on the state of the Entry guard. - - The EntryGuard line contains a nickname, then an identity digest, of - the guard. - - The EntryGuardDownSince and EntryGuardUnlistedSince lines are present - if the entry guard is believed to be non-running or non-listed. If - present, they contain a line in ISO format (YYYY-MM-DD HH:MM:SS). - - The EntryGuardAddedBy line is optional. It contains three - space-separated fields: the identity of the entry guard, the version of - Tor that added it, and the ISO time at which it was added. - - TransportProxy - - One or more of these may be present. - - The format is "transportname addr:port", to remember the address - at which a pluggable transport was listening. Tor bridges use - this information to spawn pluggable transport listeners in the - same IP address and TCP port even after tor client restarts. - - BWHistoryReadEnds (ISO time) - BWHistoryReadInterval (integer, number of seconds) - BWHistoryReadValues (comma-separated list of integer) - BWHistoryReadMaxima (comma-separated list of integer) - BWHistoryWriteEnds - BWHistoryWriteInterval - BWHistoryWriteValues - BWHistoryWriteMaxima - BWHistoryDirReadEnds - BWHistoryDirReadInterval - BWHistoryDirReadValues - BWHistoryDirReadMaxima - BWHistoryDirWriteEnds - BWHistoryDirWriteInterval - BWHistoryDirWriteValues - BWHistoryDirWriteMaxima - - These values record bandwidth history. The "Values" fields are a list, for - some number of "Intervals", of the total amount read/written during that - integer. The "Maxima" are the highest burst for each interval. - - Interval duration is set by the "Interval" field, in seconds. The - "Ends" field is the ending time of the last interval in each list. - - The *Read* and *Write* fields are the total amount read and - written; the *DirRead* and *DirWrite* variants are for directory - traffic only. - - LastRotatedOnionKey - - The last time that we changed our onion key for a new one. - Given in ISO format (YYYY-MM-DD HH:MM:SS) - - TotalBuildTimes - CircuitBuildAbandonedCount - CircuitBuildTimeBin - - XXXX writeme. diff --git a/src/tor/doc/tor-gencert.1.txt b/src/tor/doc/tor-gencert.1.txt deleted file mode 100644 index 6bba548b8..000000000 --- a/src/tor/doc/tor-gencert.1.txt +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) The Tor Project, Inc. -// See LICENSE for licensing information -// This is an asciidoc file used to generate the manpage/html reference. -// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html -:man source: Tor -:man manual: Tor Manual -tor-gencert(1) -============== -Nick Mathewson - -NAME ----- -tor-gencert - Generate certs and keys for Tor directory authorities - -SYNOPSIS --------- -**tor-gencert** [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i __id_file__] [-c -__cert_file__] [-m __num__] [-a __address__:__port__] - -DESCRIPTION ------------ -**tor-gencert** generates certificates and private keys for use by Tor -directory authorities running the v3 Tor directory protocol, as used by -Tor 0.2.0 and later. If you are not running a directory authority, you -don't need to use tor-gencert. + - -Every directory authority has a long term authority __identity__ __key__ (which -is distinct from the identity key it uses as a Tor server); this key -should be kept offline in a secure location. It is used to certify -shorter-lived __signing__ __keys__, which are kept online and used by the -directory authority to sign votes and consensus documents. + - -After you use this program to generate a signing key and a certificate, -copy those files to the keys subdirectory of your Tor process, and send -Tor a SIGHUP signal. DO NOT COPY THE IDENTITY KEY. - -OPTIONS -------- -**-v**:: - Display verbose output. - -**-h** or **--help**:: - Display help text and exit. - -**-r** or **--reuse**:: - Generate a new certificate, but not a new signing key. This can be used to - change the address or lifetime associated with a given key. - -**--create-identity-key**:: - Generate a new identity key. You should only use this option the first time - you run tor-gencert; in the future, you should use the identity key that's - already there. - -**-i** __FILENAME__:: - Read the identity key from the specified file. If the file is not present - and --create-identity-key is provided, create the identity key in the - specified file. Default: "./authority_identity_key" - -**-s** __FILENAME__:: - Write the signing key to the specified file. Default: - "./authority_signing_key" - -**-c** __FILENAME__:: - Write the certificate to the specified file. Default: - "./authority_certificate" - -**-m** __NUM__:: - Number of months that the certificate should be valid. Default: 12. - -**--passphrase-fd** __FILEDES__:: - Filedescriptor to read the passphrase from. Ends at the first NUL or - newline. Default: read from the terminal. - -**-a** __address__:__port__:: - If provided, advertise the address:port combination as this authority's - preferred directory port in its certificate. If the address is a hostname, - the hostname is resolved to an IP before it's published. - -BUGS ----- -This probably doesn't run on Windows. That's not a big issue, since we don't -really want authorities to be running on Windows anyway. - -SEE ALSO --------- -**tor**(1) + - -See also the "dir-spec.txt" file, distributed with Tor. - -AUTHORS -------- - Roger Dingledine , Nick Mathewson . diff --git a/src/tor/doc/tor-resolve.1.txt b/src/tor/doc/tor-resolve.1.txt deleted file mode 100644 index 30e16d5da..000000000 --- a/src/tor/doc/tor-resolve.1.txt +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) The Tor Project, Inc. -// See LICENSE for licensing information -// This is an asciidoc file used to generate the manpage/html reference. -// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html -:man source: Tor -:man manual: Tor Manual -tor-resolve(1) -============== -Peter Palfrader - -NAME ----- -tor-resolve - resolve a hostname to an IP address via tor - -SYNOPSIS --------- -**tor-resolve** [-4|-5] [-v] [-x] [-p __socksport__] __hostname__ [__sockshost__[:__socksport__]] - -DESCRIPTION ------------ -**tor-resolve** is a simple script to connect to a SOCKS proxy that knows about -the SOCKS RESOLVE command, hand it a hostname, and return an IP address. - -By default, **tor-resolve** uses the Tor server running on 127.0.0.1 on SOCKS -port 9050. If this isn't what you want, you should specify an explicit -__sockshost__ and/or __socksport__ on the command line. - -OPTIONS -------- -**-v**:: - Display verbose output. - -**-x**:: - Perform a reverse lookup: get the PTR record for an IPv4 address. - -**-5**:: - Use the SOCKS5 protocol. (Default) - -**-4**:: - Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't - support reverse DNS. - -**-p** __socksport__:: - Override the default SOCKS port without setting the hostname. - -SEE ALSO --------- -**tor**(1), **torify**(1). + - -See doc/socks-extensions.txt in the Tor package for protocol details. - -AUTHORS -------- -Roger Dingledine , Nick Mathewson . diff --git a/src/tor/doc/tor.1.txt b/src/tor/doc/tor.1.txt deleted file mode 100644 index 64114d6e6..000000000 --- a/src/tor/doc/tor.1.txt +++ /dev/null @@ -1,3196 +0,0 @@ -// Copyright (c) The Tor Project, Inc. -// See LICENSE for licensing information -// This is an asciidoc file used to generate the manpage/html reference. -// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html -:man source: Tor -:man manual: Tor Manual -TOR(1) -====== - -NAME ----- -tor - The second-generation onion router - - -SYNOPSIS --------- -**tor** [__OPTION__ __value__]... - -DESCRIPTION ------------ -Tor is a connection-oriented anonymizing communication -service. Users choose a source-routed path through a set of nodes, and -negotiate a "virtual circuit" through the network, in which each node -knows its predecessor and successor, but no others. Traffic flowing down -the circuit is unwrapped by a symmetric key at each node, which reveals -the downstream node. + - -Basically, Tor provides a distributed network of servers or relays ("onion routers"). -Users bounce their TCP streams -- web traffic, ftp, ssh, etc. -- around the -network, and recipients, observers, and even the relays themselves have -difficulty tracking the source of the stream. - -By default, **tor** will act as a client only. To help the network -by providing bandwidth as a relay, change the **ORPort** configuration -option -- see below. Please also consult the documentation on the Tor -Project's website. - -COMMAND-LINE OPTIONS --------------------- -[[opt-h]] **-h**, **-help**:: - Display a short help message and exit. - -[[opt-f]] **-f** __FILE__:: - Specify a new configuration file to contain further Tor configuration - options OR pass *-* to make Tor read its configuration from standard - input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not - found) - -[[opt-allow-missing-torrc]] **--allow-missing-torrc**:: - Do not require that configuration file specified by **-f** exist if - default torrc can be accessed. - -[[opt-defaults-torrc]] **--defaults-torrc** __FILE__:: - Specify a file in which to find default values for Tor options. The - contents of this file are overridden by those in the regular - configuration file, and by those on the command line. (Default: - @CONFDIR@/torrc-defaults.) - -[[opt-ignore-missing-torrc]] **--ignore-missing-torrc**:: - Specifies that Tor should treat a missing torrc file as though it - were empty. Ordinarily, Tor does this for missing default torrc files, - but not for those specified on the command line. - -[[opt-hash-password]] **--hash-password** __PASSWORD__:: - Generates a hashed password for control port access. - -[[opt-list-fingerprint]] **--list-fingerprint**:: - Generate your keys and output your nickname and fingerprint. - -[[opt-verify-config]] **--verify-config**:: - Verify the configuration file is valid. - -[[opt-serviceinstall]] **--service install** [**--options** __command-line options__]:: - Install an instance of Tor as a Windows service, with the provided - command-line options. Current instructions can be found at - https://www.torproject.org/docs/faq#NTService - -[[opt-service]] **--service** **remove**|**start**|**stop**:: - Remove, start, or stop a configured Tor Windows service. - -[[opt-nt-service]] **--nt-service**:: - Used internally to implement a Windows service. - -[[opt-list-torrc-options]] **--list-torrc-options**:: - List all valid options. - -[[opt-list-deprecated-options]] **--list-deprecated-options**:: - List all valid options that are scheduled to become obsolete in a - future version. (This is a warning, not a promise.) - -[[opt-version]] **--version**:: - Display Tor version and exit. - -[[opt-quiet]] **--quiet**|**--hush**:: - Override the default console log. By default, Tor starts out logging - messages at level "notice" and higher to the console. It stops doing so - after it parses its configuration, if the configuration tells it to log - anywhere else. You can override this behavior with the **--hush** option, - which tells Tor to only send warnings and errors to the console, or with - the **--quiet** option, which tells Tor not to log to the console at all. - -[[opt-keygen]] **--keygen** [**--newpass**]:: - Running "tor --keygen" creates a new ed25519 master identity key for a - relay, or only a fresh temporary signing key and certificate, if you - already have a master key. Optionally you can encrypt the master identity - key with a passphrase: Tor will ask you for one. If you don't want to - encrypt the master key, just don't enter any passphrase when asked. + - + - The **--newpass** option should be used with --keygen only when you need - to add, change, or remove a passphrase on an existing ed25519 master - identity key. You will be prompted for the old passphase (if any), - and the new passphrase (if any). + - + - When generating a master key, you will probably want to use - **--DataDirectory** to control where the keys - and certificates will be stored, and **--SigningKeyLifetime** to - control their lifetimes. Their behavior is as documented in the - server options section below. (You must have write access to the specified - DataDirectory.) + - + - To use the generated files, you must copy them to the DataDirectory/keys - directory of your Tor daemon, and make sure that they are owned by the - user actually running the Tor daemon on your system. - -**--passphrase-fd** __FILEDES__:: - Filedescriptor to read the passphrase from. Note that unlike with the - tor-gencert program, the entire file contents are read and used as - the passphrase, including any trailing newlines. - Default: read from the terminal. - -[[opt-key-expiration]] **--key-expiration** [**purpose**]:: - The **purpose** specifies which type of key certificate to determine - the expiration of. The only currently recognised **purpose** is - "sign". + - + - Running "tor --key-expiration sign" will attempt to find your signing - key certificate and will output, both in the logs as well as to stdout, - the signing key certificate's expiration time in ISO-8601 format. - For example, the output sent to stdout will be of the form: - "signing-cert-expiry: 2017-07-25 08:30:15 UTC" - -Other options can be specified on the command-line in the format "--option -value", in the format "option value", or in a configuration file. For -instance, you can tell Tor to start listening for SOCKS connections on port -9999 by passing --SocksPort 9999 or SocksPort 9999 to it on the command line, -or by putting "SocksPort 9999" in the configuration file. You will need to -quote options with spaces in them: if you want Tor to log all debugging -messages to debug.log, you will probably need to say --Log 'debug file -debug.log'. - -Options on the command line override those in configuration files. See the -next section for more information. - -THE CONFIGURATION FILE FORMAT ------------------------------ - -All configuration options in a configuration are written on a single line by -default. They take the form of an option name and a value, or an option name -and a quoted value (option value or option "value"). Anything after a # -character is treated as a comment. Options are -case-insensitive. C-style escaped characters are allowed inside quoted -values. To split one configuration entry into multiple lines, use a single -backslash character (\) before the end of the line. Comments can be used in -such multiline entries, but they must start at the beginning of a line. - -Configuration options can be imported from files or folders using the %include -option with the value being a path. If the path is a file, the options from the -file will be parsed as if they were written where the %include option is. If -the path is a folder, all files on that folder will be parsed following lexical -order. Files starting with a dot are ignored. Files on subfolders are ignored. -The %include option can be used recursively. - -By default, an option on the command line overrides an option found in the -configuration file, and an option in a configuration file overrides one in -the defaults file. - -This rule is simple for options that take a single value, but it can become -complicated for options that are allowed to occur more than once: if you -specify four SocksPorts in your configuration file, and one more SocksPort on -the command line, the option on the command line will replace __all__ of the -SocksPorts in the configuration file. If this isn't what you want, prefix -the option name with a plus sign (+), and it will be appended to the previous -set of options instead. For example, setting SocksPort 9100 will use only -port 9100, but setting +SocksPort 9100 will use ports 9100 and 9050 (because -this is the default). - -Alternatively, you might want to remove every instance of an option in the -configuration file, and not replace it at all: you might want to say on the -command line that you want no SocksPorts at all. To do that, prefix the -option name with a forward slash (/). You can use the plus sign (+) and the -forward slash (/) in the configuration file and on the command line. - -GENERAL OPTIONS ---------------- - -[[BandwidthRate]] **BandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - A token bucket limits the average incoming bandwidth usage on this node - to the specified number of bytes per second, and the average outgoing - bandwidth usage to that same value. If you want to run a relay in the - public network, this needs to be _at the very least_ 75 KBytes for a - relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of - course, more is better; we recommend at least 250 KBytes (2 mbits) if - possible. (Default: 1 GByte) + - + - Note that this option, and other bandwidth-limiting options, apply to TCP - data only: They do not count TCP headers or DNS traffic. + - + - With this option, and in other options that take arguments in bytes, - KBytes, and so on, other formats are also supported. Notably, "KBytes" can - also be written as "kilobytes" or "kb"; "MBytes" can be written as - "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. - Tor also accepts "byte" and "bit" in the singular. - The prefixes "tera" and "T" are also recognized. - If no units are given, we default to bytes. - To avoid confusion, we recommend writing "bytes" or "bits" explicitly, - since it's easy to forget that "B" means bytes, not bits. - -[[BandwidthBurst]] **BandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Limit the maximum token bucket size (also known as the burst) to the given - number of bytes in each direction. (Default: 1 GByte) - -[[MaxAdvertisedBandwidth]] **MaxAdvertisedBandwidth** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - If set, we will not advertise more than this amount of bandwidth for our - BandwidthRate. Server operators who want to reduce the number of clients - who ask to build circuits through them (since this is proportional to - advertised bandwidth rate) can thus reduce the CPU demands on their server - without impacting network performance. - -[[RelayBandwidthRate]] **RelayBandwidthRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - If not 0, a separate token bucket limits the average incoming bandwidth - usage for \_relayed traffic_ on this node to the specified number of bytes - per second, and the average outgoing bandwidth usage to that same value. - Relayed traffic currently is calculated to include answers to directory - requests, but that may change in future versions. They do not include directory - fetches by the relay (from authority or other relays), because that is considered - "client" activity. (Default: 0) - -[[RelayBandwidthBurst]] **RelayBandwidthBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - If not 0, limit the maximum token bucket size (also known as the burst) for - \_relayed traffic_ to the given number of bytes in each direction. - They do not include directory fetches by the relay (from authority - or other relays), because that is considered "client" activity. (Default: 0) - -[[PerConnBWRate]] **PerConnBWRate** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - If set, do separate rate limiting for each connection from a non-relay. - You should never need to change this value, since a network-wide value is - published in the consensus and your relay will use that value. (Default: 0) - -[[PerConnBWBurst]] **PerConnBWBurst** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - If set, do separate rate limiting for each connection from a non-relay. - You should never need to change this value, since a network-wide value is - published in the consensus and your relay will use that value. (Default: 0) - -[[ClientTransportPlugin]] **ClientTransportPlugin** __transport__ socks4|socks5 __IP__:__PORT__:: -**ClientTransportPlugin** __transport__ exec __path-to-binary__ [options]:: - In its first form, when set along with a corresponding Bridge line, the Tor - client forwards its traffic to a SOCKS-speaking proxy on "IP:PORT". - (IPv4 addresses should written as-is; IPv6 addresses should be wrapped in - square brackets.) It's the - duty of that proxy to properly forward the traffic to the bridge. + - + - In its second form, when set along with a corresponding Bridge line, the Tor - client launches the pluggable transport proxy executable in - __path-to-binary__ using __options__ as its command-line options, and - forwards its traffic to it. It's the duty of that proxy to properly forward - the traffic to the bridge. - -[[ServerTransportPlugin]] **ServerTransportPlugin** __transport__ exec __path-to-binary__ [options]:: - The Tor relay launches the pluggable transport proxy in __path-to-binary__ - using __options__ as its command-line options, and expects to receive - proxied client traffic from it. - -[[ServerTransportListenAddr]] **ServerTransportListenAddr** __transport__ __IP__:__PORT__:: - When this option is set, Tor will suggest __IP__:__PORT__ as the - listening address of any pluggable transport proxy that tries to - launch __transport__. (IPv4 addresses should written as-is; IPv6 - addresses should be wrapped in square brackets.) - -[[ServerTransportOptions]] **ServerTransportOptions** __transport__ __k=v__ __k=v__ ...:: - When this option is set, Tor will pass the __k=v__ parameters to - any pluggable transport proxy that tries to launch __transport__. + - (Example: ServerTransportOptions obfs45 shared-secret=bridgepasswd cache=/var/lib/tor/cache) - -[[ExtORPort]] **ExtORPort** \['address':]__port__|**auto**:: - Open this port to listen for Extended ORPort connections from your - pluggable transports. - -[[ExtORPortCookieAuthFile]] **ExtORPortCookieAuthFile** __Path__:: - If set, this option overrides the default location and file name - for the Extended ORPort's cookie file -- the cookie file is needed - for pluggable transports to communicate through the Extended ORPort. - -[[ExtORPortCookieAuthFileGroupReadable]] **ExtORPortCookieAuthFileGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - Extended OR Port cookie file. If the option is set to 1, make the cookie - file readable by the default GID. [Making the file readable by other - groups is not yet implemented; let us know if you need this for some - reason.] (Default: 0) - -[[ConnLimit]] **ConnLimit** __NUM__:: - The minimum number of file descriptors that must be available to the Tor - process before it will start. Tor will ask the OS for as many file - descriptors as the OS will allow (you can find this by "ulimit -H -n"). - If this number is less than ConnLimit, then Tor will refuse to start. + - + - You probably don't need to adjust this. It has no effect on Windows - since that platform lacks getrlimit(). (Default: 1000) - -[[DisableNetwork]] **DisableNetwork** **0**|**1**:: - When this option is set, we don't listen for or accept any connections - other than controller connections, and we close (and don't reattempt) - any outbound - connections. Controllers sometimes use this option to avoid using - the network until Tor is fully configured. (Default: 0) - -[[ConstrainedSockets]] **ConstrainedSockets** **0**|**1**:: - If set, Tor will tell the kernel to attempt to shrink the buffers for all - sockets to the size specified in **ConstrainedSockSize**. This is useful for - virtual servers and other environments where system level TCP buffers may - be limited. If you're on a virtual server, and you encounter the "Error - creating network socket: No buffer space available" message, you are - likely experiencing this problem. + - + - The preferred solution is to have the admin increase the buffer pool for - the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; - this configuration option is a second-resort. + - + - The DirPort option should also not be used if TCP buffers are scarce. The - cached directory requests consume additional sockets which exacerbates - the problem. + - + - You should **not** enable this feature unless you encounter the "no buffer - space available" issue. Reducing the TCP buffers affects window size for - the TCP stream and will reduce throughput in proportion to round trip - time on long paths. (Default: 0) - -[[ConstrainedSockSize]] **ConstrainedSockSize** __N__ **bytes**|**KBytes**:: - When **ConstrainedSockets** is enabled the receive and transmit buffers for - all sockets will be set to this limit. Must be a value between 2048 and - 262144, in 1024 byte increments. Default of 8192 is recommended. - -[[ControlPort]] **ControlPort** __PORT__|**unix:**__path__|**auto** [__flags__]:: - If set, Tor will accept connections on this port and allow those - connections to control the Tor process using the Tor Control Protocol - (described in control-spec.txt in - https://spec.torproject.org[torspec]). Note: unless you also - specify one or more of **HashedControlPassword** or - **CookieAuthentication**, setting this option will cause Tor to allow - any process on the local host to control it. (Setting both authentication - methods means either method is sufficient to authenticate to Tor.) This - option is required for many Tor controllers; most use the value of 9051. - If a unix domain socket is used, you may quote the path using standard - C escape sequences. - Set it to "auto" to have Tor pick a port for you. (Default: 0) + - + - Recognized flags are... - **GroupWritable**;; - Unix domain sockets only: makes the socket get created as - group-writable. - **WorldWritable**;; - Unix domain sockets only: makes the socket get created as - world-writable. - **RelaxDirModeCheck**;; - Unix domain sockets only: Do not insist that the directory - that holds the socket be read-restricted. - -[[ControlSocket]] **ControlSocket** __Path__:: - Like ControlPort, but listens on a Unix domain socket, rather than a TCP - socket. '0' disables ControlSocket (Unix and Unix-like systems only.) - -[[ControlSocketsGroupWritable]] **ControlSocketsGroupWritable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read and - write unix sockets (e.g. ControlSocket). If the option is set to 1, make - the control socket readable and writable by the default GID. (Default: 0) - -[[HashedControlPassword]] **HashedControlPassword** __hashed_password__:: - Allow connections on the control port if they present - the password whose one-way hash is __hashed_password__. You - can compute the hash of a password by running "tor --hash-password - __password__". You can provide several acceptable passwords by using more - than one HashedControlPassword line. - -[[CookieAuthentication]] **CookieAuthentication** **0**|**1**:: - If this option is set to 1, allow connections on the control port - when the connecting process knows the contents of a file named - "control_auth_cookie", which Tor will create in its data directory. This - authentication method should only be used on systems with good filesystem - security. (Default: 0) - -[[CookieAuthFile]] **CookieAuthFile** __Path__:: - If set, this option overrides the default location and file name - for Tor's cookie file. (See CookieAuthentication above.) - -[[CookieAuthFileGroupReadable]] **CookieAuthFileGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - cookie file. If the option is set to 1, make the cookie file readable by - the default GID. [Making the file readable by other groups is not yet - implemented; let us know if you need this for some reason.] (Default: 0) - -[[ControlPortWriteToFile]] **ControlPortWriteToFile** __Path__:: - If set, Tor writes the address and port of any control port it opens to - this address. Usable by controllers to learn the actual control port - when ControlPort is set to "auto". - -[[ControlPortFileGroupReadable]] **ControlPortFileGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - control port file. If the option is set to 1, make the control port - file readable by the default GID. (Default: 0) - -[[DataDirectory]] **DataDirectory** __DIR__:: - Store working data in DIR. Can not be changed while tor is running. - (Default: ~/.tor if your home directory is not /; otherwise, - @LOCALSTATEDIR@/lib/tor. On Windows, the default is - your ApplicationData folder.) - -[[DataDirectoryGroupReadable]] **DataDirectoryGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - DataDirectory. If the option is set to 1, make the DataDirectory readable - by the default GID. (Default: 0) - -[[CacheDirectory]] **CacheDirectory** __DIR__:: - Store cached directory data in DIR. Can not be changed while tor is - running. - (Default: uses the value of DataDirectory.) - -[[CacheDirectoryGroupReadable]] **CacheDirectoryGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - CacheDirectory. If the option is set to 1, make the CacheDirectory readable - by the default GID. (Default: 0) - -[[FallbackDir]] **FallbackDir** __ipv4address__:__port__ orport=__port__ id=__fingerprint__ [weight=__num__] [ipv6=**[**__ipv6address__**]**:__orport__]:: - When we're unable to connect to any directory cache for directory info - (usually because we don't know about any yet) we try a directory authority. - Clients also simultaneously try a FallbackDir, to avoid hangs on client - startup if a directory authority is down. Clients retry FallbackDirs more - often than directory authorities, to reduce the load on the directory - authorities. - By default, the directory authorities are also FallbackDirs. Specifying a - FallbackDir replaces Tor's default hard-coded FallbackDirs (if any). - (See the **DirAuthority** entry for an explanation of each flag.) - -[[UseDefaultFallbackDirs]] **UseDefaultFallbackDirs** **0**|**1**:: - Use Tor's default hard-coded FallbackDirs (if any). (When a - FallbackDir line is present, it replaces the hard-coded FallbackDirs, - regardless of the value of UseDefaultFallbackDirs.) (Default: 1) - -[[DirAuthority]] **DirAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __fingerprint__:: - Use a nonstandard authoritative directory server at the provided address - and port, with the specified key fingerprint. This option can be repeated - many times, for multiple authoritative directory servers. Flags are - separated by spaces, and determine what kind of an authority this directory - is. By default, an authority is not authoritative for any directory style - or version unless an appropriate flag is given. - Tor will use this authority as a bridge authoritative directory if the - "bridge" flag is set. If a flag "orport=**port**" is given, Tor will use the - given port when opening encrypted tunnels to the dirserver. If a flag - "weight=**num**" is given, then the directory server is chosen randomly - with probability proportional to that weight (default 1.0). If a - flag "v3ident=**fp**" is given, the dirserver is a v3 directory authority - whose v3 long-term signing key has the fingerprint **fp**. Lastly, - if an "ipv6=**[**__ipv6address__**]**:__orport__" flag is present, then - the directory - authority is listening for IPv6 connections on the indicated IPv6 address - and OR Port. + - + - Tor will contact the authority at __ipv4address__ to - download directory documents. The provided __port__ value is a dirport; - clients ignore this in favor of the specified "orport=" value. If an - IPv6 ORPort is supplied, Tor will - also download directory documents at the IPv6 ORPort. + - + - If no **DirAuthority** line is given, Tor will use the default directory - authorities. NOTE: this option is intended for setting up a private Tor - network with its own directory authorities. If you use it, you will be - distinguishable from other users, because you won't believe the same - authorities they do. - -[[DirAuthorityFallbackRate]] **DirAuthorityFallbackRate** __NUM__:: - When configured to use both directory authorities and fallback - directories, the directory authorities also work as fallbacks. They are - chosen with their regular weights, multiplied by this number, which - should be 1.0 or less. (Default: 1.0) - -[[AlternateDirAuthority]] **AlternateDirAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __fingerprint__ + - -[[AlternateBridgeAuthority]] **AlternateBridgeAuthority** [__nickname__] [**flags**] __ipv4address__:__port__ __ fingerprint__:: - These options behave as DirAuthority, but they replace fewer of the - default directory authorities. Using - AlternateDirAuthority replaces the default Tor directory authorities, but - leaves the default bridge authorities in - place. Similarly, - AlternateBridgeAuthority replaces the default bridge authority, - but leaves the directory authorities alone. - -[[DisableAllSwap]] **DisableAllSwap** **0**|**1**:: - If set to 1, Tor will attempt to lock all current and future memory pages, - so that memory cannot be paged out. Windows, OS X and Solaris are currently - not supported. We believe that this feature works on modern Gnu/Linux - distributions, and that it should work on *BSD systems (untested). This - option requires that you start your Tor as root, and you should use the - **User** option to properly reduce Tor's privileges. - Can not be changed while tor is running. (Default: 0) - -[[DisableDebuggerAttachment]] **DisableDebuggerAttachment** **0**|**1**:: - If set to 1, Tor will attempt to prevent basic debugging attachment attempts - by other processes. This may also keep Tor from generating core files if - it crashes. It has no impact for users who wish to attach if they - have CAP_SYS_PTRACE or if they are root. We believe that this feature - works on modern Gnu/Linux distributions, and that it may also work on *BSD - systems (untested). Some modern Gnu/Linux systems such as Ubuntu have the - kernel.yama.ptrace_scope sysctl and by default enable it as an attempt to - limit the PTRACE scope for all user processes by default. This feature will - attempt to limit the PTRACE scope for Tor specifically - it will not attempt - to alter the system wide ptrace scope as it may not even exist. If you wish - to attach to Tor with a debugger such as gdb or strace you will want to set - this to 0 for the duration of your debugging. Normal users should leave it - on. Disabling this option while Tor is running is prohibited. (Default: 1) - -[[FetchDirInfoEarly]] **FetchDirInfoEarly** **0**|**1**:: - If set to 1, Tor will always fetch directory information like other - directory caches, even if you don't meet the normal criteria for fetching - early. Normal users should leave it off. (Default: 0) - -[[FetchDirInfoExtraEarly]] **FetchDirInfoExtraEarly** **0**|**1**:: - If set to 1, Tor will fetch directory information before other directory - caches. It will attempt to download directory information closer to the - start of the consensus period. Normal users should leave it off. - (Default: 0) - -[[FetchHidServDescriptors]] **FetchHidServDescriptors** **0**|**1**:: - If set to 0, Tor will never fetch any hidden service descriptors from the - rendezvous directories. This option is only useful if you're using a Tor - controller that handles hidden service fetches for you. (Default: 1) - -[[FetchServerDescriptors]] **FetchServerDescriptors** **0**|**1**:: - If set to 0, Tor will never fetch any network status summaries or server - descriptors from the directory servers. This option is only useful if - you're using a Tor controller that handles directory fetches for you. - (Default: 1) - -[[FetchUselessDescriptors]] **FetchUselessDescriptors** **0**|**1**:: - If set to 1, Tor will fetch every consensus flavor, descriptor, and - certificate that it hears about. Otherwise, it will avoid fetching useless - descriptors: flavors that it is not using to build circuits, and authority - certificates it does not trust. This option is useful if you're using a - tor client with an external parser that uses a full consensus. - This option fetches all documents, **DirCache** fetches and serves - all documents. (Default: 0) - -[[HTTPProxy]] **HTTPProxy** __host__[:__port__]:: - Tor will make all its directory requests through this host:port (or host:80 - if port is not specified), rather than connecting directly to any directory - servers. (DEPRECATED: As of 0.3.1.0-alpha you should use HTTPSProxy.) - -[[HTTPProxyAuthenticator]] **HTTPProxyAuthenticator** __username:password__:: - If defined, Tor will use this username:password for Basic HTTP proxy - authentication, as in RFC 2617. This is currently the only form of HTTP - proxy authentication that Tor supports; feel free to submit a patch if you - want it to support others. (DEPRECATED: As of 0.3.1.0-alpha you should use - HTTPSProxyAuthenticator.) - -[[HTTPSProxy]] **HTTPSProxy** __host__[:__port__]:: - Tor will make all its OR (SSL) connections through this host:port (or - host:443 if port is not specified), via HTTP CONNECT rather than connecting - directly to servers. You may want to set **FascistFirewall** to restrict - the set of ports you might try to connect to, if your HTTPS proxy only - allows connecting to certain ports. - -[[HTTPSProxyAuthenticator]] **HTTPSProxyAuthenticator** __username:password__:: - If defined, Tor will use this username:password for Basic HTTPS proxy - authentication, as in RFC 2617. This is currently the only form of HTTPS - proxy authentication that Tor supports; feel free to submit a patch if you - want it to support others. - -[[Sandbox]] **Sandbox** **0**|**1**:: - If set to 1, Tor will run securely through the use of a syscall sandbox. - Otherwise the sandbox will be disabled. The option is currently an - experimental feature. It only works on Linux-based operating systems, - and only when Tor has been built with the libseccomp library. This option - can not be changed while tor is running. - + - When the Sandbox is 1, the following options can not be changed when tor - is running: - Address - ConnLimit - CookieAuthFile - DirPortFrontPage - ExtORPortCookieAuthFile - Logs - ServerDNSResolvConfFile - Tor must remain in client or server mode (some changes to ClientOnly and - ORPort are not allowed). - (Default: 0) - -[[Socks4Proxy]] **Socks4Proxy** __host__[:__port__]:: - Tor will make all OR connections through the SOCKS 4 proxy at host:port - (or host:1080 if port is not specified). - -[[Socks5Proxy]] **Socks5Proxy** __host__[:__port__]:: - Tor will make all OR connections through the SOCKS 5 proxy at host:port - (or host:1080 if port is not specified). - -[[Socks5ProxyUsername]] **Socks5ProxyUsername** __username__ + - -[[Socks5ProxyPassword]] **Socks5ProxyPassword** __password__:: - If defined, authenticate to the SOCKS 5 server using username and password - in accordance to RFC 1929. Both username and password must be between 1 and - 255 characters. - -[[SocksSocketsGroupWritable]] **SocksSocketsGroupWritable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read and - write unix sockets (e.g. SocksSocket). If the option is set to 1, make - the SocksSocket socket readable and writable by the default GID. (Default: 0) - -[[KeepalivePeriod]] **KeepalivePeriod** __NUM__:: - To keep firewalls from expiring connections, send a padding keepalive cell - every NUM seconds on open connections that are in use. If the connection - has no open circuits, it will instead be closed after NUM seconds of - idleness. (Default: 5 minutes) - -[[Log]] **Log** __minSeverity__[-__maxSeverity__] **stderr**|**stdout**|**syslog**:: - Send all messages between __minSeverity__ and __maxSeverity__ to the standard - output stream, the standard error stream, or to the system log. (The - "syslog" value is only supported on Unix.) Recognized severity levels are - debug, info, notice, warn, and err. We advise using "notice" in most cases, - since anything more verbose may provide sensitive information to an - attacker who obtains the logs. If only one severity level is given, all - messages of that level or higher will be sent to the listed destination. - -[[Log2]] **Log** __minSeverity__[-__maxSeverity__] **file** __FILENAME__:: - As above, but send log messages to the listed filename. The - "Log" option may appear more than once in a configuration file. - Messages are sent to all the logs that match their severity - level. - -[[Log3]] **Log** **[**__domain__,...**]**__minSeverity__[-__maxSeverity__] ... **file** __FILENAME__ + - -[[Log4]] **Log** **[**__domain__,...**]**__minSeverity__[-__maxSeverity__] ... **stderr**|**stdout**|**syslog**:: - As above, but select messages by range of log severity __and__ by a - set of "logging domains". Each logging domain corresponds to an area of - functionality inside Tor. You can specify any number of severity ranges - for a single log statement, each of them prefixed by a comma-separated - list of logging domains. You can prefix a domain with $$~$$ to indicate - negation, and use * to indicate "all domains". If you specify a severity - range without a list of domains, it matches all domains. + - + - This is an advanced feature which is most useful for debugging one or two - of Tor's subsystems at a time. + - + - The currently recognized domains are: general, crypto, net, config, fs, - protocol, mm, http, app, control, circ, rend, bug, dir, dirserv, or, edge, - acct, hist, and handshake. Domain names are case-insensitive. + - + - For example, "`Log [handshake]debug [~net,~mm]info notice stdout`" sends - to stdout: all handshake messages of any severity, all info-and-higher - messages from domains other than networking and memory management, and all - messages of severity notice or higher. - -[[LogMessageDomains]] **LogMessageDomains** **0**|**1**:: - If 1, Tor includes message domains with each log message. Every log - message currently has at least one domain; most currently have exactly - one. This doesn't affect controller log messages. (Default: 0) - -[[MaxUnparseableDescSizeToLog]] **MaxUnparseableDescSizeToLog** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**:: - Unparseable descriptors (e.g. for votes, consensuses, routers) are logged - in separate files by hash, up to the specified size in total. Note that - only files logged during the lifetime of this Tor process count toward the - total; this is intended to be used to debug problems without opening live - servers to resource exhaustion attacks. (Default: 10 MB) - -[[OutboundBindAddress]] **OutboundBindAddress** __IP__:: - Make all outbound connections originate from the IP address specified. This - is only useful when you have multiple network interfaces, and you want all - of Tor's outgoing connections to use a single one. This option may - be used twice, once with an IPv4 address and once with an IPv6 address. - IPv6 addresses should be wrapped in square brackets. - This setting will be ignored for connections to the loopback addresses - (127.0.0.0/8 and ::1). - -[[OutboundBindAddressOR]] **OutboundBindAddressOR** __IP__:: - Make all outbound non-exit (relay and other) connections - originate from the IP address specified. This option overrides - **OutboundBindAddress** for the same IP version. This option may - be used twice, once with an IPv4 address and once with an IPv6 - address. IPv6 addresses should be wrapped in square brackets. - This setting will be ignored for connections to the loopback - addresses (127.0.0.0/8 and ::1). - -[[OutboundBindAddressExit]] **OutboundBindAddressExit** __IP__:: - Make all outbound exit connections originate from the IP address - specified. This option overrides **OutboundBindAddress** for the - same IP version. This option may be used twice, once with an IPv4 - address and once with an IPv6 address. - IPv6 addresses should be wrapped in square brackets. - This setting will be ignored - for connections to the loopback addresses (127.0.0.0/8 and ::1). - -[[PidFile]] **PidFile** __FILE__:: - On startup, write our PID to FILE. On clean shutdown, remove - FILE. Can not be changed while tor is running. - -[[ProtocolWarnings]] **ProtocolWarnings** **0**|**1**:: - If 1, Tor will log with severity \'warn' various cases of other parties not - following the Tor specification. Otherwise, they are logged with severity - \'info'. (Default: 0) - -[[RunAsDaemon]] **RunAsDaemon** **0**|**1**:: - If 1, Tor forks and daemonizes to the background. This option has no effect - on Windows; instead you should use the --service command-line option. - Can not be changed while tor is running. - (Default: 0) - -[[LogTimeGranularity]] **LogTimeGranularity** __NUM__:: - Set the resolution of timestamps in Tor's logs to NUM milliseconds. - NUM must be positive and either a divisor or a multiple of 1 second. - Note that this option only controls the granularity written by Tor to - a file or console log. Tor does not (for example) "batch up" log - messages to affect times logged by a controller, times attached to - syslog messages, or the mtime fields on log files. (Default: 1 second) - -[[TruncateLogFile]] **TruncateLogFile** **0**|**1**:: - If 1, Tor will overwrite logs at startup and in response to a HUP signal, - instead of appending to them. (Default: 0) - -[[SyslogIdentityTag]] **SyslogIdentityTag** __tag__:: - When logging to syslog, adds a tag to the syslog identity such that - log entries are marked with "Tor-__tag__". Can not be changed while tor is - running. (Default: none) - -[[AndroidIdentityTag]] **AndroidIdentityTag** __tag__:: - When logging to Android's logging subsystem, adds a tag to the log identity - such that log entries are marked with "Tor-__tag__". Can not be changed while - tor is running. (Default: none) - -[[SafeLogging]] **SafeLogging** **0**|**1**|**relay**:: - Tor can scrub potentially sensitive strings from log messages (e.g. - addresses) by replacing them with the string [scrubbed]. This way logs can - still be useful, but they don't leave behind personally identifying - information about what sites a user might have visited. + - + - If this option is set to 0, Tor will not perform any scrubbing, if it is - set to 1, all potentially sensitive strings are replaced. If it is set to - relay, all log messages generated when acting as a relay are sanitized, but - all messages generated when acting as a client are not. (Default: 1) - -[[User]] **User** __Username__:: - On startup, setuid to this user and setgid to their primary group. - Can not be changed while tor is running. - -[[KeepBindCapabilities]] **KeepBindCapabilities** **0**|**1**|**auto**:: - On Linux, when we are started as root and we switch our identity using - the **User** option, the **KeepBindCapabilities** option tells us whether to - try to retain our ability to bind to low ports. If this value is 1, we - try to keep the capability; if it is 0 we do not; and if it is **auto**, - we keep the capability only if we are configured to listen on a low port. - Can not be changed while tor is running. - (Default: auto.) - -[[HardwareAccel]] **HardwareAccel** **0**|**1**:: - If non-zero, try to use built-in (static) crypto hardware acceleration when - available. Can not be changed while tor is running. (Default: 0) - -[[AccelName]] **AccelName** __NAME__:: - When using OpenSSL hardware crypto acceleration attempt to load the dynamic - engine of this name. This must be used for any dynamic hardware engine. - Names can be verified with the openssl engine command. Can not be changed - while tor is running. - -[[AccelDir]] **AccelDir** __DIR__:: - Specify this option if using dynamic hardware acceleration and the engine - implementation library resides somewhere other than the OpenSSL default. - Can not be changed while tor is running. - -[[AvoidDiskWrites]] **AvoidDiskWrites** **0**|**1**:: - If non-zero, try to write to disk less frequently than we would otherwise. - This is useful when running on flash memory or other media that support - only a limited number of writes. (Default: 0) - -[[CircuitPriorityHalflife]] **CircuitPriorityHalflife** __NUM1__:: - If this value is set, we override the default algorithm for choosing which - circuit's cell to deliver or relay next. When the value is 0, we - round-robin between the active circuits on a connection, delivering one - cell from each in turn. When the value is positive, we prefer delivering - cells from whichever connection has the lowest weighted cell count, where - cells are weighted exponentially according to the supplied - CircuitPriorityHalflife value (in seconds). If this option is not set at - all, we use the behavior recommended in the current consensus - networkstatus. This is an advanced option; you generally shouldn't have - to mess with it. (Default: not set) - -[[CountPrivateBandwidth]] **CountPrivateBandwidth** **0**|**1**:: - If this option is set, then Tor's rate-limiting applies not only to - remote connections, but also to connections to private addresses like - 127.0.0.1 or 10.0.0.1. This is mostly useful for debugging - rate-limiting. (Default: 0) - -[[ExtendByEd25519ID]] **ExtendByEd25519ID** **0**|**1**|**auto**:: - If this option is set to 1, we always try to include a relay's Ed25519 ID - when telling the proceeding relay in a circuit to extend to it. - If this option is set to 0, we never include Ed25519 IDs when extending - circuits. If the option is set to "default", we obey a - parameter in the consensus document. (Default: auto) - -[[NoExec]] **NoExec** **0**|**1**:: - If this option is set to 1, then Tor will never launch another - executable, regardless of the settings of PortForwardingHelper, - ClientTransportPlugin, or ServerTransportPlugin. Once this - option has been set to 1, it cannot be set back to 0 without - restarting Tor. (Default: 0) - -[[Schedulers]] **Schedulers** **KIST**|**KISTLite**|**Vanilla**:: - Specify the scheduler type that tor should use. The scheduler is - responsible for moving data around within a Tor process. This is an ordered - list by priority which means that the first value will be tried first and if - unavailable, the second one is tried and so on. It is possible to change - these values at runtime. This option mostly effects relays, and most - operators should leave it set to its default value. - (Default: KIST,KISTLite,Vanilla) - + - The possible scheduler types are: - + - **KIST**: Kernel-Informed Socket Transport. Tor will use TCP information - from the kernel to make informed decisions regarding how much data to send - and when to send it. KIST also handles traffic in batches (see - KISTSchedRunInterval) in order to improve traffic prioritization decisions. - As implemented, KIST will only work on Linux kernel version 2.6.39 or - higher. - + - **KISTLite**: Same as KIST but without kernel support. Tor will use all - the same mechanics as with KIST, including the batching, but its decisions - regarding how much data to send will not be as good. KISTLite will work on - all kernels and operating systems, and the majority of the benefits of KIST - are still realized with KISTLite. - + - **Vanilla**: The scheduler that Tor used before KIST was implemented. It - sends as much data as possible, as soon as possible. Vanilla will work on - all kernels and operating systems. - -[[KISTSchedRunInterval]] **KISTSchedRunInterval** __NUM__ **msec**:: - If KIST or KISTLite is used in the Schedulers option, this controls at which - interval the scheduler tick is. If the value is 0 msec, the value is taken - from the consensus if possible else it will fallback to the default 10 - msec. Maximum possible value is 100 msec. (Default: 0 msec) - -[[KISTSockBufSizeFactor]] **KISTSockBufSizeFactor** __NUM__:: - If KIST is used in Schedulers, this is a multiplier of the per-socket - limit calculation of the KIST algorithm. (Default: 1.0) - -CLIENT OPTIONS --------------- - -The following options are useful only for clients (that is, if -**SocksPort**, **HTTPTunnelPort**, **TransPort**, **DNSPort**, or -**NATDPort** is non-zero): - -[[Bridge]] **Bridge** [__transport__] __IP__:__ORPort__ [__fingerprint__]:: - When set along with UseBridges, instructs Tor to use the relay at - "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" - is provided (using the same format as for DirAuthority), we will verify that - the relay running at that location has the right fingerprint. We also use - fingerprint to look up the bridge descriptor at the bridge authority, if - it's provided and if UpdateBridgesFromAuthority is set too. + - + - If "transport" is provided, it must match a ClientTransportPlugin line. We - then use that pluggable transport's proxy to transfer data to the bridge, - rather than connecting to the bridge directly. Some transports use a - transport-specific method to work out the remote address to connect to. - These transports typically ignore the "IP:ORPort" specified in the bridge - line. + - + - Tor passes any "key=val" settings to the pluggable transport proxy as - per-connection arguments when connecting to the bridge. Consult - the documentation of the pluggable transport for details of what - arguments it supports. - -[[LearnCircuitBuildTimeout]] **LearnCircuitBuildTimeout** **0**|**1**:: - If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1) - -[[CircuitBuildTimeout]] **CircuitBuildTimeout** __NUM__:: - - Try for at most NUM seconds when building circuits. If the circuit isn't - open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this - value serves as the initial value to use before a timeout is learned. If - LearnCircuitBuildTimeout is 0, this value is the only value used. - (Default: 60 seconds) - -[[CircuitsAvailableTimeout]] **CircuitsAvailableTimeout** __NUM__:: - Tor will attempt to keep at least one open, unused circuit available for - this amount of time. This option governs how long idle circuits are kept - open, as well as the amount of time Tor will keep a circuit open to each - of the recently used ports. This way when the Tor client is entirely - idle, it can expire all of its circuits, and then expire its TLS - connections. Note that the actual timeout value is uniformly randomized - from the specified value to twice that amount. (Default: 30 minutes; - Max: 24 hours) - -[[CircuitStreamTimeout]] **CircuitStreamTimeout** __NUM__:: - If non-zero, this option overrides our internal timeout schedule for how - many seconds until we detach a stream from a circuit and try a new circuit. - If your network is particularly slow, you might want to set this to a - number like 60. (Default: 0) - -[[ClientOnly]] **ClientOnly** **0**|**1**:: - If set to 1, Tor will not run as a relay or serve - directory requests, even if the ORPort, ExtORPort, or DirPort options are - set. (This config option is - mostly unnecessary: we added it back when we were considering having - Tor clients auto-promote themselves to being relays if they were stable - and fast enough. The current behavior is simply that Tor is a client - unless ORPort, ExtORPort, or DirPort are configured.) (Default: 0) - -[[ConnectionPadding]] **ConnectionPadding** **0**|**1**|**auto**:: - This option governs Tor's use of padding to defend against some forms of - traffic analysis. If it is set to 'auto', Tor will send padding only - if both the client and the relay support it. If it is set to 0, Tor will - not send any padding cells. If it is set to 1, Tor will still send padding - for client connections regardless of relay support. Only clients may set - this option. This option should be offered via the UI to mobile users - for use where bandwidth may be expensive. - (Default: auto) - -[[ReducedConnectionPadding]] **ReducedConnectionPadding** **0**|**1**:: - If set to 1, Tor will not not hold OR connections open for very long, - and will send less padding on these connections. Only clients may set - this option. This option should be offered via the UI to mobile users - for use where bandwidth may be expensive. (Default: 0) - -[[ExcludeNodes]] **ExcludeNodes** __node__,__node__,__...__:: - A list of identity fingerprints, country codes, and address - patterns of nodes to avoid when building a circuit. Country codes are - 2-letter ISO3166 codes, and must - be wrapped in braces; fingerprints may be preceded by a dollar sign. - (Example: - ExcludeNodes ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, \{cc}, 255.254.0.0/8) + - + - By default, this option is treated as a preference that Tor is allowed - to override in order to keep working. - For example, if you try to connect to a hidden service, - but you have excluded all of the hidden service's introduction points, - Tor will connect to one of them anyway. If you do not want this - behavior, set the StrictNodes option (documented below). + - + - Note also that if you are a relay, this (and the other node selection - options below) only affects your own circuits that Tor builds for you. - Clients can still build circuits through you to any node. Controllers - can tell Tor to build circuits through any node. + - + - Country codes are case-insensitive. The code "\{??}" refers to nodes whose - country can't be identified. No country code, including \{??}, works if - no GeoIPFile can be loaded. See also the GeoIPExcludeUnknown option below. - - -[[ExcludeExitNodes]] **ExcludeExitNodes** __node__,__node__,__...__:: - A list of identity fingerprints, country codes, and address - patterns of nodes to never use when picking an exit node---that is, a - node that delivers traffic for you *outside* the Tor network. Note that any - node listed in ExcludeNodes is automatically considered to be part of this - list too. See - the **ExcludeNodes** option for more information on how to specify - nodes. See also the caveats on the "ExitNodes" option below. - -[[GeoIPExcludeUnknown]] **GeoIPExcludeUnknown** **0**|**1**|**auto**:: - If this option is set to 'auto', then whenever any country code is set in - ExcludeNodes or ExcludeExitNodes, all nodes with unknown country (\{??} and - possibly \{A1}) are treated as excluded as well. If this option is set to - '1', then all unknown countries are treated as excluded in ExcludeNodes - and ExcludeExitNodes. This option has no effect when a GeoIP file isn't - configured or can't be found. (Default: auto) - -[[ExitNodes]] **ExitNodes** __node__,__node__,__...__:: - A list of identity fingerprints, country codes, and address - patterns of nodes to use as exit node---that is, a - node that delivers traffic for you *outside* the Tor network. See - the **ExcludeNodes** option for more information on how to specify nodes. + - + - Note that if you list too few nodes here, or if you exclude too many exit - nodes with ExcludeExitNodes, you can degrade functionality. For example, - if none of the exits you list allows traffic on port 80 or 443, you won't - be able to browse the web. + - + - Note also that not every circuit is used to deliver traffic *outside* of - the Tor network. It is normal to see non-exit circuits (such as those - used to connect to hidden services, those that do directory fetches, - those used for relay reachability self-tests, and so on) that end - at a non-exit node. To - keep a node from being used entirely, see ExcludeNodes and StrictNodes. + - + - The ExcludeNodes option overrides this option: any node listed in both - ExitNodes and ExcludeNodes is treated as excluded. + - + - The .exit address notation, if enabled via MapAddress, overrides - this option. - -[[EntryNodes]] **EntryNodes** __node__,__node__,__...__:: - A list of identity fingerprints and country codes of nodes - to use for the first hop in your normal circuits. - Normal circuits include all - circuits except for direct connections to directory servers. The Bridge - option overrides this option; if you have configured bridges and - UseBridges is 1, the Bridges are used as your entry nodes. + - + - The ExcludeNodes option overrides this option: any node listed in both - EntryNodes and ExcludeNodes is treated as excluded. See - the **ExcludeNodes** option for more information on how to specify nodes. - -[[StrictNodes]] **StrictNodes** **0**|**1**:: - If StrictNodes is set to 1, Tor will treat solely the ExcludeNodes option - as a requirement to follow for all the circuits you generate, even if - doing so will break functionality for you (StrictNodes applies to neither - ExcludeExitNodes nor to ExitNodes). If StrictNodes is set to 0, Tor will - still try to avoid nodes in the ExcludeNodes list, but it will err on the - side of avoiding unexpected errors. Specifically, StrictNodes 0 tells Tor - that it is okay to use an excluded node when it is *necessary* to perform - relay reachability self-tests, connect to a hidden service, provide a - hidden service to a client, fulfill a .exit request, upload directory - information, or download directory information. (Default: 0) - -[[FascistFirewall]] **FascistFirewall** **0**|**1**:: - If 1, Tor will only create outgoing connections to ORs running on ports - that your firewall allows (defaults to 80 and 443; see **FirewallPorts**). - This will allow you to run Tor as a client behind a firewall with - restrictive policies, but will not allow you to run as a server behind such - a firewall. If you prefer more fine-grained control, use - ReachableAddresses instead. - -[[FirewallPorts]] **FirewallPorts** __PORTS__:: - A list of ports that your firewall allows you to connect to. Only used when - **FascistFirewall** is set. This option is deprecated; use ReachableAddresses - instead. (Default: 80, 443) - -[[ReachableAddresses]] **ReachableAddresses** __IP__[/__MASK__][:__PORT__]...:: - A comma-separated list of IP addresses and ports that your firewall allows - you to connect to. The format is as for the addresses in ExitPolicy, except - that "accept" is understood unless "reject" is explicitly provided. For - example, \'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept - \*:80' means that your firewall allows connections to everything inside net - 99, rejects port 80 connections to net 18, and accepts connections to port - 80 otherwise. (Default: \'accept \*:*'.) - -[[ReachableDirAddresses]] **ReachableDirAddresses** __IP__[/__MASK__][:__PORT__]...:: - Like **ReachableAddresses**, a list of addresses and ports. Tor will obey - these restrictions when fetching directory information, using standard HTTP - GET requests. If not set explicitly then the value of - **ReachableAddresses** is used. If **HTTPProxy** is set then these - connections will go through that proxy. (DEPRECATED: This option has - had no effect for some time.) - -[[ReachableORAddresses]] **ReachableORAddresses** __IP__[/__MASK__][:__PORT__]...:: - Like **ReachableAddresses**, a list of addresses and ports. Tor will obey - these restrictions when connecting to Onion Routers, using TLS/SSL. If not - set explicitly then the value of **ReachableAddresses** is used. If - **HTTPSProxy** is set then these connections will go through that proxy. + - + - The separation between **ReachableORAddresses** and - **ReachableDirAddresses** is only interesting when you are connecting - through proxies (see **HTTPProxy** and **HTTPSProxy**). Most proxies limit - TLS connections (which Tor uses to connect to Onion Routers) to port 443, - and some limit HTTP GET requests (which Tor uses for fetching directory - information) to port 80. - -[[HidServAuth]] **HidServAuth** __onion-address__ __auth-cookie__ [__service-name__]:: - Client authorization for a hidden service. Valid onion addresses contain 16 - characters in a-z2-7 plus ".onion", and valid auth cookies contain 22 - characters in A-Za-z0-9+/. The service name is only used for internal - purposes, e.g., for Tor controllers. This option may be used multiple times - for different hidden services. If a hidden service uses authorization and - this option is not set, the hidden service is not accessible. Hidden - services can be configured to require authorization using the - **HiddenServiceAuthorizeClient** option. - -[[LongLivedPorts]] **LongLivedPorts** __PORTS__:: - A list of ports for services that tend to have long-running connections - (e.g. chat and interactive shells). Circuits for streams that use these - ports will contain only high-uptime nodes, to reduce the chance that a node - will go down before the stream is finished. Note that the list is also - honored for circuits (both client and service side) involving hidden - services whose virtual port is in this list. (Default: 21, 22, 706, - 1863, 5050, 5190, 5222, 5223, 6523, 6667, 6697, 8300) - -[[MapAddress]] **MapAddress** __address__ __newaddress__:: - When a request for address arrives to Tor, it will transform to newaddress - before processing it. For example, if you always want connections to - www.example.com to exit via __torserver__ (where __torserver__ is the - fingerprint of the server), use "MapAddress www.example.com - www.example.com.torserver.exit". If the value is prefixed with a - "\*.", matches an entire domain. For example, if you - always want connections to example.com and any if its subdomains - to exit via - __torserver__ (where __torserver__ is the fingerprint of the server), use - "MapAddress \*.example.com \*.example.com.torserver.exit". (Note the - leading "*." in each part of the directive.) You can also redirect all - subdomains of a domain to a single address. For example, "MapAddress - *.example.com www.example.com". + - + - NOTES: - - 1. When evaluating MapAddress expressions Tor stops when it hits the most - recently added expression that matches the requested address. So if you - have the following in your torrc, www.torproject.org will map to 1.1.1.1: - - MapAddress www.torproject.org 2.2.2.2 - MapAddress www.torproject.org 1.1.1.1 - - 2. Tor evaluates the MapAddress configuration until it finds no matches. So - if you have the following in your torrc, www.torproject.org will map to - 2.2.2.2: - - MapAddress 1.1.1.1 2.2.2.2 - MapAddress www.torproject.org 1.1.1.1 - - 3. The following MapAddress expression is invalid (and will be - ignored) because you cannot map from a specific address to a wildcard - address: - - MapAddress www.torproject.org *.torproject.org.torserver.exit - - 4. Using a wildcard to match only part of a string (as in *ample.com) is - also invalid. - -[[NewCircuitPeriod]] **NewCircuitPeriod** __NUM__:: - Every NUM seconds consider whether to build a new circuit. (Default: 30 - seconds) - -[[MaxCircuitDirtiness]] **MaxCircuitDirtiness** __NUM__:: - Feel free to reuse a circuit that was first used at most NUM seconds ago, - but never attach a new stream to a circuit that is too old. For hidden - services, this applies to the __last__ time a circuit was used, not the - first. Circuits with streams constructed with SOCKS authentication via - SocksPorts that have **KeepAliveIsolateSOCKSAuth** also remain alive - for MaxCircuitDirtiness seconds after carrying the last such stream. - (Default: 10 minutes) - -[[MaxClientCircuitsPending]] **MaxClientCircuitsPending** __NUM__:: - Do not allow more than NUM circuits to be pending at a time for handling - client streams. A circuit is pending if we have begun constructing it, - but it has not yet been completely constructed. (Default: 32) - -[[NodeFamily]] **NodeFamily** __node__,__node__,__...__:: - The Tor servers, defined by their identity fingerprints, - constitute a "family" of similar or co-administered servers, so never use - any two of them in the same circuit. Defining a NodeFamily is only needed - when a server doesn't list the family itself (with MyFamily). This option - can be used multiple times; each instance defines a separate family. In - addition to nodes, you can also list IP address and ranges and country - codes in {curly braces}. See the **ExcludeNodes** option for more - information on how to specify nodes. - -[[EnforceDistinctSubnets]] **EnforceDistinctSubnets** **0**|**1**:: - If 1, Tor will not put two servers whose IP addresses are "too close" on - the same circuit. Currently, two addresses are "too close" if they lie in - the same /16 range. (Default: 1) - -[[SocksPort]] **SocksPort** \['address':]__port__|**unix:**__path__|**auto** [_flags_] [_isolation flags_]:: - Open this port to listen for connections from SOCKS-speaking - applications. Set this to 0 if you don't want to allow application - connections via SOCKS. Set it to "auto" to have Tor pick a port for - you. This directive can be specified multiple times to bind - to multiple addresses/ports. If a unix domain socket is used, you may - quote the path using standard C escape sequences. - (Default: 9050) + - + - NOTE: Although this option allows you to specify an IP address - other than localhost, you should do so only with extreme caution. - The SOCKS protocol is unencrypted and (as we use it) - unauthenticated, so exposing it in this way could leak your - information to anybody watching your network, and allow anybody - to use your computer as an open proxy. + - + - The _isolation flags_ arguments give Tor rules for which streams - received on this SocksPort are allowed to share circuits with one - another. Recognized isolation flags are: - **IsolateClientAddr**;; - Don't share circuits with streams from a different - client address. (On by default and strongly recommended when - supported; you can disable it with **NoIsolateClientAddr**. - Unsupported and force-disabled when using Unix domain sockets.) - **IsolateSOCKSAuth**;; - Don't share circuits with streams for which different - SOCKS authentication was provided. (For HTTPTunnelPort - connections, this option looks at the Proxy-Authorization and - X-Tor-Stream-Isolation headers. On by default; - you can disable it with **NoIsolateSOCKSAuth**.) - **IsolateClientProtocol**;; - Don't share circuits with streams using a different protocol. - (SOCKS 4, SOCKS 5, TransPort connections, NATDPort connections, - and DNSPort requests are all considered to be different protocols.) - **IsolateDestPort**;; - Don't share circuits with streams targeting a different - destination port. - **IsolateDestAddr**;; - Don't share circuits with streams targeting a different - destination address. - **KeepAliveIsolateSOCKSAuth**;; - If **IsolateSOCKSAuth** is enabled, keep alive circuits while they have - at least one stream with SOCKS authentication active. After such a circuit - is idle for more than MaxCircuitDirtiness seconds, it can be closed. - **SessionGroup=**__INT__;; - If no other isolation rules would prevent it, allow streams - on this port to share circuits with streams from every other - port with the same session group. (By default, streams received - on different SocksPorts, TransPorts, etc are always isolated from one - another. This option overrides that behavior.) - -[[OtherSocksPortFlags]]:: - Other recognized __flags__ for a SocksPort are: - **NoIPv4Traffic**;; - Tell exits to not connect to IPv4 addresses in response to SOCKS - requests on this connection. - **IPv6Traffic**;; - Tell exits to allow IPv6 addresses in response to SOCKS requests on - this connection, so long as SOCKS5 is in use. (SOCKS4 can't handle - IPv6.) - **PreferIPv6**;; - Tells exits that, if a host has both an IPv4 and an IPv6 address, - we would prefer to connect to it via IPv6. (IPv4 is the default.) - **NoDNSRequest**;; - Do not ask exits to resolve DNS addresses in SOCKS5 requests. Tor will - connect to IPv4 addresses, IPv6 addresses (if IPv6Traffic is set) and - .onion addresses. - **NoOnionTraffic**;; - Do not connect to .onion addresses in SOCKS5 requests. - **OnionTrafficOnly**;; - Tell the tor client to only connect to .onion addresses in response to - SOCKS5 requests on this connection. This is equivalent to NoDNSRequest, - NoIPv4Traffic, NoIPv6Traffic. The corresponding NoOnionTrafficOnly - flag is not supported. - **CacheIPv4DNS**;; - Tells the client to remember IPv4 DNS answers we receive from exit - nodes via this connection. (On by default.) - **CacheIPv6DNS**;; - Tells the client to remember IPv6 DNS answers we receive from exit - nodes via this connection. - **GroupWritable**;; - Unix domain sockets only: makes the socket get created as - group-writable. - **WorldWritable**;; - Unix domain sockets only: makes the socket get created as - world-writable. - **CacheDNS**;; - Tells the client to remember all DNS answers we receive from exit - nodes via this connection. - **UseIPv4Cache**;; - Tells the client to use any cached IPv4 DNS answers we have when making - requests via this connection. (NOTE: This option, or UseIPv6Cache - or UseDNSCache, can harm your anonymity, and probably - won't help performance as much as you might expect. Use with care!) - **UseIPv6Cache**;; - Tells the client to use any cached IPv6 DNS answers we have when making - requests via this connection. - **UseDNSCache**;; - Tells the client to use any cached DNS answers we have when making - requests via this connection. - **PreferIPv6Automap**;; - When serving a hostname lookup request on this port that - should get automapped (according to AutomapHostsOnResolve), - if we could return either an IPv4 or an IPv6 answer, prefer - an IPv6 answer. (On by default.) - **PreferSOCKSNoAuth**;; - Ordinarily, when an application offers both "username/password - authentication" and "no authentication" to Tor via SOCKS5, Tor - selects username/password authentication so that IsolateSOCKSAuth can - work. This can confuse some applications, if they offer a - username/password combination then get confused when asked for - one. You can disable this behavior, so that Tor will select "No - authentication" when IsolateSOCKSAuth is disabled, or when this - option is set. - -[[SocksPortFlagsMisc]]:: - Flags are processed left to right. If flags conflict, the last flag on the - line is used, and all earlier flags are ignored. No error is issued for - conflicting flags. - -[[SocksPolicy]] **SocksPolicy** __policy__,__policy__,__...__:: - Set an entrance policy for this server, to limit who can connect to the - SocksPort and DNSPort ports. The policies have the same form as exit - policies below, except that port specifiers are ignored. Any address - not matched by some entry in the policy is accepted. - -[[SocksTimeout]] **SocksTimeout** __NUM__:: - Let a socks connection wait NUM seconds handshaking, and NUM seconds - unattached waiting for an appropriate circuit, before we fail it. (Default: - 2 minutes) - -[[TokenBucketRefillInterval]] **TokenBucketRefillInterval** __NUM__ [**msec**|**second**]:: - Set the refill interval of Tor's token bucket to NUM milliseconds. - NUM must be between 1 and 1000, inclusive. Note that the configured - bandwidth limits are still expressed in bytes per second: this - option only affects the frequency with which Tor checks to see whether - previously exhausted connections may read again. - Can not be changed while tor is running. (Default: 100 msec) - -[[TrackHostExits]] **TrackHostExits** __host__,__.domain__,__...__:: - For each value in the comma separated list, Tor will track recent - connections to hosts that match this value and attempt to reuse the same - exit node for each. If the value is prepended with a \'.\', it is treated as - matching an entire domain. If one of the values is just a \'.', it means - match everything. This option is useful if you frequently connect to sites - that will expire all your authentication cookies (i.e. log you out) if - your IP address changes. Note that this option does have the disadvantage - of making it more clear that a given history is associated with a single - user. However, most people who would wish to observe this will observe it - through cookies or other protocol-specific means anyhow. - -[[TrackHostExitsExpire]] **TrackHostExitsExpire** __NUM__:: - Since exit servers go up and down, it is desirable to expire the - association between host and exit server after NUM seconds. The default is - 1800 seconds (30 minutes). - -[[UpdateBridgesFromAuthority]] **UpdateBridgesFromAuthority** **0**|**1**:: - When set (along with UseBridges), Tor will try to fetch bridge descriptors - from the configured bridge authorities when feasible. It will fall back to - a direct request if the authority responds with a 404. (Default: 0) - -[[UseBridges]] **UseBridges** **0**|**1**:: - When set, Tor will fetch descriptors for each bridge listed in the "Bridge" - config lines, and use these relays as both entry guards and directory - guards. (Default: 0) - -[[UseEntryGuards]] **UseEntryGuards** **0**|**1**:: - If this option is set to 1, we pick a few long-term entry servers, and try - to stick with them. This is desirable because constantly changing servers - increases the odds that an adversary who owns some servers will observe a - fraction of your paths. Entry Guards can not be used by Directory - Authorities, Single Onion Services, and Tor2web clients. In these cases, - the this option is ignored. (Default: 1) - -[[GuardfractionFile]] **GuardfractionFile** __FILENAME__:: - V3 authoritative directories only. Configures the location of the - guardfraction file which contains information about how long relays - have been guards. (Default: unset) - -[[UseGuardFraction]] **UseGuardFraction** **0**|**1**|**auto**:: - This torrc option specifies whether clients should use the - guardfraction information found in the consensus during path - selection. If it's set to 'auto', clients will do what the - UseGuardFraction consensus parameter tells them to do. (Default: auto) - -[[NumEntryGuards]] **NumEntryGuards** __NUM__:: - If UseEntryGuards is set to 1, we will try to pick a total of NUM routers - as long-term entries for our circuits. If NUM is 0, we try to learn the - number from the guard-n-primary-guards-to-use consensus parameter, and - default to 1 if the consensus parameter isn't set. (Default: 0) - -[[NumDirectoryGuards]] **NumDirectoryGuards** __NUM__:: - If UseEntryGuards is set to 1, we try to make sure we have at least NUM - routers to use as directory guards. If this option is set to 0, use the - value from the guard-n-primary-dir-guards-to-use consensus parameter, and - default to 3 if the consensus parameter isn't set. (Default: 0) - -[[GuardLifetime]] **GuardLifetime** __N__ **days**|**weeks**|**months**:: - If nonzero, and UseEntryGuards is set, minimum time to keep a guard before - picking a new one. If zero, we use the GuardLifetime parameter from the - consensus directory. No value here may be less than 1 month or greater - than 5 years; out-of-range values are clamped. (Default: 0) - -[[SafeSocks]] **SafeSocks** **0**|**1**:: - When this option is enabled, Tor will reject application connections that - use unsafe variants of the socks protocol -- ones that only provide an IP - address, meaning the application is doing a DNS resolve first. - Specifically, these are socks4 and socks5 when not doing remote DNS. - (Default: 0) - -[[TestSocks]] **TestSocks** **0**|**1**:: - When this option is enabled, Tor will make a notice-level log entry for - each connection to the Socks port indicating whether the request used a - safe socks protocol or an unsafe one (see above entry on SafeSocks). This - helps to determine whether an application using Tor is possibly leaking - DNS requests. (Default: 0) - -[[VirtualAddrNetworkIPv4]] **VirtualAddrNetworkIPv4** __IPv4Address__/__bits__ + - -[[VirtualAddrNetworkIPv6]] **VirtualAddrNetworkIPv6** [__IPv6Address__]/__bits__:: - When Tor needs to assign a virtual (unused) address because of a MAPADDRESS - command from the controller or the AutomapHostsOnResolve feature, Tor - picks an unassigned address from this range. (Defaults: - 127.192.0.0/10 and [FE80::]/10 respectively.) + - + - When providing proxy server service to a network of computers using a tool - like dns-proxy-tor, change the IPv4 network to "10.192.0.0/10" or - "172.16.0.0/12" and change the IPv6 network to "[FC00::]/7". - The default **VirtualAddrNetwork** address ranges on a - properly configured machine will route to the loopback or link-local - interface. The maximum number of bits for the network prefix is set to 104 - for IPv6 and 16 for IPv4. However, a wider network - smaller prefix length - - is preferable since it reduces the chances for an attacker to guess the - used IP. For local use, no change to the default VirtualAddrNetwork setting - is needed. - -[[AllowNonRFC953Hostnames]] **AllowNonRFC953Hostnames** **0**|**1**:: - When this option is disabled, Tor blocks hostnames containing illegal - characters (like @ and :) rather than sending them to an exit node to be - resolved. This helps trap accidental attempts to resolve URLs and so on. - (Default: 0) - -[[HTTPTunnelPort]] **HTTPTunnelPort** \['address':]__port__|**auto** [_isolation flags_]:: - Open this port to listen for proxy connections using the "HTTP CONNECT" - protocol instead of SOCKS. Set this to 0 - 0 if you don't want to allow "HTTP CONNECT" connections. Set the port - to "auto" to have Tor pick a port for you. This directive can be - specified multiple times to bind to multiple addresses/ports. See - SOCKSPort for an explanation of isolation flags. (Default: 0) - -[[TransPort]] **TransPort** \['address':]__port__|**auto** [_isolation flags_]:: - Open this port to listen for transparent proxy connections. Set this to - 0 if you don't want to allow transparent proxy connections. Set the port - to "auto" to have Tor pick a port for you. This directive can be - specified multiple times to bind to multiple addresses/ports. See - SOCKSPort for an explanation of isolation flags. + - + - TransPort requires OS support for transparent proxies, such as BSDs' pf or - Linux's IPTables. If you're planning to use Tor as a transparent proxy for - a network, you'll want to examine and change VirtualAddrNetwork from the - default setting. (Default: 0) - -[[TransProxyType]] **TransProxyType** **default**|**TPROXY**|**ipfw**|**pf-divert**:: - TransProxyType may only be enabled when there is transparent proxy listener - enabled. + - + - Set this to "TPROXY" if you wish to be able to use the TPROXY Linux module - to transparently proxy connections that are configured using the TransPort - option. Detailed information on how to configure the TPROXY - feature can be found in the Linux kernel source tree in the file - Documentation/networking/tproxy.txt. + - + - Set this option to "ipfw" to use the FreeBSD ipfw interface. + - + - On *BSD operating systems when using pf, set this to "pf-divert" to take - advantage of +divert-to+ rules, which do not modify the packets like - +rdr-to+ rules do. Detailed information on how to configure pf to use - +divert-to+ rules can be found in the pf.conf(5) manual page. On OpenBSD, - +divert-to+ is available to use on versions greater than or equal to - OpenBSD 4.4. + - + - Set this to "default", or leave it unconfigured, to use regular IPTables - on Linux, or to use pf +rdr-to+ rules on *BSD systems. + - + - (Default: "default".) - -[[NATDPort]] **NATDPort** \['address':]__port__|**auto** [_isolation flags_]:: - Open this port to listen for connections from old versions of ipfw (as - included in old versions of FreeBSD, etc) using the NATD protocol. - Use 0 if you don't want to allow NATD connections. Set the port - to "auto" to have Tor pick a port for you. This directive can be - specified multiple times to bind to multiple addresses/ports. See - SocksPort for an explanation of isolation flags. + - + - This option is only for people who cannot use TransPort. (Default: 0) - -[[AutomapHostsOnResolve]] **AutomapHostsOnResolve** **0**|**1**:: - When this option is enabled, and we get a request to resolve an address - that ends with one of the suffixes in **AutomapHostsSuffixes**, we map an - unused virtual address to that address, and return the new virtual address. - This is handy for making ".onion" addresses work with applications that - resolve an address and then connect to it. (Default: 0) - -[[AutomapHostsSuffixes]] **AutomapHostsSuffixes** __SUFFIX__,__SUFFIX__,__...__:: - A comma-separated list of suffixes to use with **AutomapHostsOnResolve**. - The "." suffix is equivalent to "all addresses." (Default: .exit,.onion). - -[[DNSPort]] **DNSPort** \['address':]__port__|**auto** [_isolation flags_]:: - If non-zero, open this port to listen for UDP DNS requests, and resolve - them anonymously. This port only handles A, AAAA, and PTR requests---it - doesn't handle arbitrary DNS request types. Set the port to "auto" to - have Tor pick a port for - you. This directive can be specified multiple times to bind to multiple - addresses/ports. See SocksPort for an explanation of isolation - flags. (Default: 0) - -[[ClientDNSRejectInternalAddresses]] **ClientDNSRejectInternalAddresses** **0**|**1**:: - If true, Tor does not believe any anonymously retrieved DNS answer that - tells it that an address resolves to an internal address (like 127.0.0.1 or - 192.168.0.1). This option prevents certain browser-based attacks; it - is not allowed to be set on the default network. (Default: 1) - -[[ClientRejectInternalAddresses]] **ClientRejectInternalAddresses** **0**|**1**:: - If true, Tor does not try to fulfill requests to connect to an internal - address (like 127.0.0.1 or 192.168.0.1) __unless an exit node is - specifically requested__ (for example, via a .exit hostname, or a - controller request). If true, multicast DNS hostnames for machines on the - local network (of the form *.local) are also rejected. (Default: 1) - -[[DownloadExtraInfo]] **DownloadExtraInfo** **0**|**1**:: - If true, Tor downloads and caches "extra-info" documents. These documents - contain information about servers other than the information in their - regular server descriptors. Tor does not use this information for anything - itself; to save bandwidth, leave this option turned off. (Default: 0) - -[[WarnPlaintextPorts]] **WarnPlaintextPorts** __port__,__port__,__...__:: - Tells Tor to issue a warnings whenever the user tries to make an anonymous - connection to one of these ports. This option is designed to alert users - to services that risk sending passwords in the clear. (Default: - 23,109,110,143) - -[[RejectPlaintextPorts]] **RejectPlaintextPorts** __port__,__port__,__...__:: - Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor - will instead refuse to make the connection. (Default: None) - -[[OptimisticData]] **OptimisticData** **0**|**1**|**auto**:: - When this option is set, and Tor is using an exit node that supports - the feature, it will try optimistically to send data to the exit node - without waiting for the exit node to report whether the connection - succeeded. This can save a round-trip time for protocols like HTTP - where the client talks first. If OptimisticData is set to **auto**, - Tor will look at the UseOptimisticData parameter in the networkstatus. - (Default: auto) - -[[Tor2webMode]] **Tor2webMode** **0**|**1**:: - When this option is set, Tor connects to hidden services - **non-anonymously**. This option also disables client connections to - non-hidden-service hostnames through Tor. It **must only** be used when - running a tor2web Hidden Service web proxy. - To enable this option the compile time flag --enable-tor2web-mode must be - specified. Since Tor2webMode is non-anonymous, you can not run an - anonymous Hidden Service on a tor version compiled with Tor2webMode. - (Default: 0) - -[[Tor2webRendezvousPoints]] **Tor2webRendezvousPoints** __node__,__node__,__...__:: - A list of identity fingerprints, nicknames, country codes and - address patterns of nodes that are allowed to be used as RPs - in HS circuits; any other nodes will not be used as RPs. - (Example: - Tor2webRendezvousPoints Fastyfasty, ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, \{cc}, 255.254.0.0/8) + - + - This feature can only be used if Tor2webMode is also enabled. + - + - ExcludeNodes have higher priority than Tor2webRendezvousPoints, - which means that nodes specified in ExcludeNodes will not be - picked as RPs. + - + - If no nodes in Tor2webRendezvousPoints are currently available for - use, Tor will choose a random node when building HS circuits. - -[[UseMicrodescriptors]] **UseMicrodescriptors** **0**|**1**|**auto**:: - Microdescriptors are a smaller version of the information that Tor needs - in order to build its circuits. Using microdescriptors makes Tor clients - download less directory information, thus saving bandwidth. Directory - caches need to fetch regular descriptors and microdescriptors, so this - option doesn't save any bandwidth for them. If this option is set to - "auto" (recommended) then it is on for all clients that do not set - FetchUselessDescriptors. (Default: auto) - -[[PathBiasCircThreshold]] **PathBiasCircThreshold** __NUM__ + - -[[PathBiasNoticeRate]] **PathBiasNoticeRate** __NUM__ + - -[[PathBiasWarnRate]] **PathBiasWarnRate** __NUM__ + - -[[PathBiasExtremeRate]] **PathBiasExtremeRate** __NUM__ + - -[[PathBiasDropGuards]] **PathBiasDropGuards** __NUM__ + - -[[PathBiasScaleThreshold]] **PathBiasScaleThreshold** __NUM__:: - These options override the default behavior of Tor's (**currently - experimental**) path bias detection algorithm. To try to find broken or - misbehaving guard nodes, Tor looks for nodes where more than a certain - fraction of circuits through that guard fail to get built. + - + - The PathBiasCircThreshold option controls how many circuits we need to build - through a guard before we make these checks. The PathBiasNoticeRate, - PathBiasWarnRate and PathBiasExtremeRate options control what fraction of - circuits must succeed through a guard so we won't write log messages. - If less than PathBiasExtremeRate circuits succeed *and* PathBiasDropGuards - is set to 1, we disable use of that guard. + - + - When we have seen more than PathBiasScaleThreshold - circuits through a guard, we scale our observations by 0.5 (governed by - the consensus) so that new observations don't get swamped by old ones. + - + - By default, or if a negative value is provided for one of these options, - Tor uses reasonable defaults from the networkstatus consensus document. - If no defaults are available there, these options default to 150, .70, - .50, .30, 0, and 300 respectively. - -[[PathBiasUseThreshold]] **PathBiasUseThreshold** __NUM__ + - -[[PathBiasNoticeUseRate]] **PathBiasNoticeUseRate** __NUM__ + - -[[PathBiasExtremeUseRate]] **PathBiasExtremeUseRate** __NUM__ + - -[[PathBiasScaleUseThreshold]] **PathBiasScaleUseThreshold** __NUM__:: - Similar to the above options, these options override the default behavior - of Tor's (**currently experimental**) path use bias detection algorithm. + - + - Where as the path bias parameters govern thresholds for successfully - building circuits, these four path use bias parameters govern thresholds - only for circuit usage. Circuits which receive no stream usage - are not counted by this detection algorithm. A used circuit is considered - successful if it is capable of carrying streams or otherwise receiving - well-formed responses to RELAY cells. + - + - By default, or if a negative value is provided for one of these options, - Tor uses reasonable defaults from the networkstatus consensus document. - If no defaults are available there, these options default to 20, .80, - .60, and 100, respectively. - -[[ClientUseIPv4]] **ClientUseIPv4** **0**|**1**:: - If this option is set to 0, Tor will avoid connecting to directory servers - and entry nodes over IPv4. Note that clients with an IPv4 - address in a **Bridge**, proxy, or pluggable transport line will try - connecting over IPv4 even if **ClientUseIPv4** is set to 0. (Default: 1) - -[[ClientUseIPv6]] **ClientUseIPv6** **0**|**1**:: - If this option is set to 1, Tor might connect to directory servers or - entry nodes over IPv6. Note that clients configured with an IPv6 address - in a **Bridge**, proxy, or pluggable transport line will try connecting - over IPv6 even if **ClientUseIPv6** is set to 0. (Default: 0) - -[[ClientPreferIPv6DirPort]] **ClientPreferIPv6DirPort** **0**|**1**|**auto**:: - If this option is set to 1, Tor prefers a directory port with an IPv6 - address over one with IPv4, for direct connections, if a given directory - server has both. (Tor also prefers an IPv6 DirPort if IPv4Client is set to - 0.) If this option is set to auto, clients prefer IPv4. Other things may - influence the choice. This option breaks a tie to the favor of IPv6. - (Default: auto) (DEPRECATED: This option has had no effect for some - time.) - -[[ClientPreferIPv6ORPort]] **ClientPreferIPv6ORPort** **0**|**1**|**auto**:: - If this option is set to 1, Tor prefers an OR port with an IPv6 - address over one with IPv4 if a given entry node has both. (Tor also - prefers an IPv6 ORPort if IPv4Client is set to 0.) If this option is set - to auto, Tor bridge clients prefer the configured bridge address, and - other clients prefer IPv4. Other things may influence the choice. This - option breaks a tie to the favor of IPv6. (Default: auto) - -[[PathsNeededToBuildCircuits]] **PathsNeededToBuildCircuits** __NUM__:: - Tor clients don't build circuits for user traffic until they know - about enough of the network so that they could potentially construct - enough of the possible paths through the network. If this option - is set to a fraction between 0.25 and 0.95, Tor won't build circuits - until it has enough descriptors or microdescriptors to construct - that fraction of possible paths. Note that setting this option too low - can make your Tor client less anonymous, and setting it too high can - prevent your Tor client from bootstrapping. If this option is negative, - Tor will use a default value chosen by the directory authorities. If the - directory authorities do not choose a value, Tor will default to 0.6. - (Default: -1.) - -[[ClientBootstrapConsensusAuthorityDownloadSchedule]] **ClientBootstrapConsensusAuthorityDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download consensuses from authorities - if they are bootstrapping (that is, they don't have a usable, reasonably - live consensus). Only used by clients fetching from a list of fallback - directory mirrors. This schedule is advanced by (potentially concurrent) - connection attempts, unlike other schedules, which are advanced by - connection failures. (Default: 6, 11, 3600, 10800, 25200, 54000, 111600, - 262800) - -[[ClientBootstrapConsensusFallbackDownloadSchedule]] **ClientBootstrapConsensusFallbackDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download consensuses from fallback - directory mirrors if they are bootstrapping (that is, they don't have a - usable, reasonably live consensus). Only used by clients fetching from a - list of fallback directory mirrors. This schedule is advanced by - (potentially concurrent) connection attempts, unlike other schedules, - which are advanced by connection failures. (Default: 0, 1, 4, 11, 3600, - 10800, 25200, 54000, 111600, 262800) - -[[ClientBootstrapConsensusAuthorityOnlyDownloadSchedule]] **ClientBootstrapConsensusAuthorityOnlyDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download consensuses from authorities - if they are bootstrapping (that is, they don't have a usable, reasonably - live consensus). Only used by clients which don't have or won't fetch - from a list of fallback directory mirrors. This schedule is advanced by - (potentially concurrent) connection attempts, unlike other schedules, - which are advanced by connection failures. (Default: 0, 3, 7, 3600, - 10800, 25200, 54000, 111600, 262800) - -[[ClientBootstrapConsensusMaxDownloadTries]] **ClientBootstrapConsensusMaxDownloadTries** __NUM__:: - Try this many times to download a consensus while bootstrapping using - fallback directory mirrors before giving up. (Default: 7) - -[[ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries]] **ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries** __NUM__:: - Try this many times to download a consensus while bootstrapping using - authorities before giving up. (Default: 4) - -[[ClientBootstrapConsensusMaxInProgressTries]] **ClientBootstrapConsensusMaxInProgressTries** __NUM__:: - Try this many simultaneous connections to download a consensus before - waiting for one to complete, timeout, or error out. (Default: 3) - -SERVER OPTIONS --------------- - -The following options are useful only for servers (that is, if ORPort -is non-zero): - -[[Address]] **Address** __address__:: - The IPv4 address of this server, or a fully qualified domain name of - this server that resolves to an IPv4 address. You can leave this - unset, and Tor will try to guess your IPv4 address. This IPv4 - address is the one used to tell clients and other servers where to - find your Tor server; it doesn't affect the address that your server - binds to. To bind to a different address, use the ORPort and - OutboundBindAddress options. - -[[AssumeReachable]] **AssumeReachable** **0**|**1**:: - This option is used when bootstrapping a new Tor network. If set to 1, - don't do self-reachability testing; just upload your server descriptor - immediately. If **AuthoritativeDirectory** is also set, this option - instructs the dirserver to bypass remote reachability testing too and list - all connected servers as running. - -[[BridgeRelay]] **BridgeRelay** **0**|**1**:: - Sets the relay to act as a "bridge" with respect to relaying connections - from bridge users to the Tor network. It mainly causes Tor to publish a - server descriptor to the bridge database, rather than - to the public directory authorities. - -[[BridgeDistribution]] **BridgeDistribution** __string__:: - If set along with BridgeRelay, Tor will include a new line in its - bridge descriptor which indicates to the BridgeDB service how it - would like its bridge address to be given out. Set it to "none" if - you want BridgeDB to avoid distributing your bridge address, or "any" to - let BridgeDB decide. (Default: any) - + - Note: as of Oct 2017, the BridgeDB part of this option is not yet - implemented. Until BridgeDB is updated to obey this option, your - bridge will make this request, but it will not (yet) be obeyed. - -[[ContactInfo]] **ContactInfo** __email_address__:: - Administrative contact information for this relay or bridge. This line - can be used to contact you if your relay or bridge is misconfigured or - something else goes wrong. Note that we archive and publish all - descriptors containing these lines and that Google indexes them, so - spammers might also collect them. You may want to obscure the fact - that it's an email address and/or generate a new address for this - purpose. - -[[ExitRelay]] **ExitRelay** **0**|**1**|**auto**:: - Tells Tor whether to run as an exit relay. If Tor is running as a - non-bridge server, and ExitRelay is set to 1, then Tor allows traffic to - exit according to the ExitPolicy option (or the default ExitPolicy if - none is specified). + - + - If ExitRelay is set to 0, no traffic is allowed to - exit, and the ExitPolicy option is ignored. + - + - If ExitRelay is set to "auto", then Tor behaves as if it were set to 1, but - warns the user if this would cause traffic to exit. In a future version, - the default value will be 0. (Default: auto) - -[[ExitPolicy]] **ExitPolicy** __policy__,__policy__,__...__:: - Set an exit policy for this server. Each policy is of the form - "**accept[6]**|**reject[6]** __ADDR__[/__MASK__][:__PORT__]". If /__MASK__ is - omitted then this policy just applies to the host given. Instead of giving - a host or network you can also use "\*" to denote the universe (0.0.0.0/0 - and ::/128), or \*4 to denote all IPv4 addresses, and \*6 to denote all - IPv6 addresses. - __PORT__ can be a single port number, an interval of ports - "__FROM_PORT__-__TO_PORT__", or "\*". If __PORT__ is omitted, that means - "\*". + - + - For example, "accept 18.7.22.69:\*,reject 18.0.0.0/8:\*,accept \*:\*" would - reject any IPv4 traffic destined for MIT except for web.mit.edu, and accept - any other IPv4 or IPv6 traffic. + - + - Tor also allows IPv6 exit policy entries. For instance, "reject6 [FC00::]/7:\*" - rejects all destinations that share 7 most significant bit prefix with - address FC00::. Respectively, "accept6 [C000::]/3:\*" accepts all destinations - that share 3 most significant bit prefix with address C000::. + - + - accept6 and reject6 only produce IPv6 exit policy entries. Using an IPv4 - address with accept6 or reject6 is ignored and generates a warning. - accept/reject allows either IPv4 or IPv6 addresses. Use \*4 as an IPv4 - wildcard address, and \*6 as an IPv6 wildcard address. accept/reject * - expands to matching IPv4 and IPv6 wildcard address rules. + - + - To specify all IPv4 and IPv6 internal and link-local networks (including - 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, - 172.16.0.0/12, [::]/8, [FC00::]/7, [FE80::]/10, [FEC0::]/10, [FF00::]/8, - and [::]/127), you can use the "private" alias instead of an address. - ("private" always produces rules for IPv4 and IPv6 addresses, even when - used with accept6/reject6.) + - + - Private addresses are rejected by default (at the beginning of your exit - policy), along with any configured primary public IPv4 and IPv6 addresses. - These private addresses are rejected unless you set the - ExitPolicyRejectPrivate config option to 0. For example, once you've done - that, you could allow HTTP to 127.0.0.1 and block all other connections to - internal networks with "accept 127.0.0.1:80,reject private:\*", though that - may also allow connections to your own computer that are addressed to its - public (external) IP address. See RFC 1918 and RFC 3330 for more details - about internal and reserved IP address space. See - ExitPolicyRejectLocalInterfaces if you want to block every address on the - relay, even those that aren't advertised in the descriptor. + - + - This directive can be specified multiple times so you don't have to put it - all on one line. + - + - Policies are considered first to last, and the first match wins. If you - want to allow the same ports on IPv4 and IPv6, write your rules using - accept/reject \*. If you want to allow different ports on IPv4 and IPv6, - write your IPv6 rules using accept6/reject6 \*6, and your IPv4 rules using - accept/reject \*4. If you want to \_replace_ the default exit policy, end - your exit policy with either a reject \*:* or an accept \*:*. Otherwise, - you're \_augmenting_ (prepending to) the default exit policy. + - + - If you want to use a reduced exit policy rather than the default exit - policy, set "ReducedExitPolicy 1". If you want to _replace_ the default - exit policy with your custom exit policy, end your exit policy with either - a reject *:* or an accept *:*. Otherwise, you’re _augmenting_ (prepending - to) the default or reduced exit policy. + - + - The default exit policy is: - - reject *:25 - reject *:119 - reject *:135-139 - reject *:445 - reject *:563 - reject *:1214 - reject *:4661-4666 - reject *:6346-6429 - reject *:6699 - reject *:6881-6999 - accept *:* - -[[ExitPolicyDefault]] **ExitPolicyDefault**:: - Since the default exit policy uses accept/reject *, it applies to both - IPv4 and IPv6 addresses. - -[[ExitPolicyRejectPrivate]] **ExitPolicyRejectPrivate** **0**|**1**:: - Reject all private (local) networks, along with the relay's advertised - public IPv4 and IPv6 addresses, at the beginning of your exit policy. - See above entry on ExitPolicy. - (Default: 1) - -[[ExitPolicyRejectLocalInterfaces]] **ExitPolicyRejectLocalInterfaces** **0**|**1**:: - Reject all IPv4 and IPv6 addresses that the relay knows about, at the - beginning of your exit policy. This includes any OutboundBindAddress, the - bind addresses of any port options, such as ControlPort or DNSPort, and any - public IPv4 and IPv6 addresses on any interface on the relay. (If IPv6Exit - is not set, all IPv6 addresses will be rejected anyway.) - See above entry on ExitPolicy. - This option is off by default, because it lists all public relay IP - addresses in the ExitPolicy, even those relay operators might prefer not - to disclose. - (Default: 0) - -[[ReducedExitPolicy]] **ReducedExitPolicy** **0**|**1**:: - If set, use a reduced exit policy rather than the default one. + - + - The reduced exit policy is an alternative to the default exit policy. It - allows as many Internet services as possible while still blocking the - majority of TCP ports. Currently, the policy allows approximately 65 ports. - This reduces the odds that your node will be used for peer-to-peer - applications. + - + - The reduced exit policy is: - - accept *:20-21 - accept *:22 - accept *:23 - accept *:43 - accept *:53 - accept *:79 - accept *:80-81 - accept *:88 - accept *:110 - accept *:143 - accept *:194 - accept *:220 - accept *:389 - accept *:443 - accept *:464 - accept *:465 - accept *:531 - accept *:543-544 - accept *:554 - accept *:563 - accept *:587 - accept *:636 - accept *:706 - accept *:749 - accept *:873 - accept *:902-904 - accept *:981 - accept *:989-990 - accept *:991 - accept *:992 - accept *:993 - accept *:994 - accept *:995 - accept *:1194 - accept *:1220 - accept *:1293 - accept *:1500 - accept *:1533 - accept *:1677 - accept *:1723 - accept *:1755 - accept *:1863 - accept *:2082 - accept *:2083 - accept *:2086-2087 - accept *:2095-2096 - accept *:2102-2104 - accept *:3128 - accept *:3389 - accept *:3690 - accept *:4321 - accept *:4643 - accept *:5050 - accept *:5190 - accept *:5222-5223 - accept *:5228 - accept *:5900 - accept *:6660-6669 - accept *:6679 - accept *:6697 - accept *:8000 - accept *:8008 - accept *:8074 - accept *:8080 - accept *:8082 - accept *:8087-8088 - accept *:8232-8233 - accept *:8332-8333 - accept *:8443 - accept *:8888 - accept *:9418 - accept *:9999 - accept *:10000 - accept *:11371 - accept *:19294 - accept *:19638 - accept *:50002 - accept *:64738 - reject *:* - - (Default: 0) - -[[IPv6Exit]] **IPv6Exit** **0**|**1**:: - If set, and we are an exit node, allow clients to use us for IPv6 - traffic. (Default: 0) - -[[MaxOnionQueueDelay]] **MaxOnionQueueDelay** __NUM__ [**msec**|**second**]:: - If we have more onionskins queued for processing than we can process in - this amount of time, reject new ones. (Default: 1750 msec) - -[[MyFamily]] **MyFamily** __fingerprint__,__fingerprint__,...:: - Declare that this Tor relay is controlled or administered by a group or - organization identical or similar to that of the other relays, defined by - their (possibly $-prefixed) identity fingerprints. - This option can be repeated many times, for - convenience in defining large families: all fingerprints in all MyFamily - lines are merged into one list. - When two relays both declare that they are in the - same \'family', Tor clients will not use them in the same circuit. (Each - relay only needs to list the other servers in its family; it doesn't need to - list itself, but it won't hurt if it does.) Do not list any bridge relay as it would - compromise its concealment. + - + - When listing a node, it's better to list it by fingerprint than by - nickname: fingerprints are more reliable. - -[[Nickname]] **Nickname** __name__:: - Set the server's nickname to \'name'. Nicknames must be between 1 and 19 - characters inclusive, and must contain only the characters [a-zA-Z0-9]. - -[[NumCPUs]] **NumCPUs** __num__:: - How many processes to use at once for decrypting onionskins and other - parallelizable operations. If this is set to 0, Tor will try to detect - how many CPUs you have, defaulting to 1 if it can't tell. (Default: 0) - -[[ORPort]] **ORPort** \['address':]__PORT__|**auto** [_flags_]:: - Advertise this port to listen for connections from Tor clients and - servers. This option is required to be a Tor server. - Set it to "auto" to have Tor pick a port for you. Set it to 0 to not - run an ORPort at all. This option can occur more than once. (Default: 0) + - + - Tor recognizes these flags on each ORPort: - **NoAdvertise**;; - By default, we bind to a port and tell our users about it. If - NoAdvertise is specified, we don't advertise, but listen anyway. This - can be useful if the port everybody will be connecting to (for - example, one that's opened on our firewall) is somewhere else. - **NoListen**;; - By default, we bind to a port and tell our users about it. If - NoListen is specified, we don't bind, but advertise anyway. This - can be useful if something else (for example, a firewall's port - forwarding configuration) is causing connections to reach us. - **IPv4Only**;; - If the address is absent, or resolves to both an IPv4 and an IPv6 - address, only listen to the IPv4 address. - **IPv6Only**;; - If the address is absent, or resolves to both an IPv4 and an IPv6 - address, only listen to the IPv6 address. - -[[ORPortFlagsExclusive]]:: - For obvious reasons, NoAdvertise and NoListen are mutually exclusive, and - IPv4Only and IPv6Only are mutually exclusive. - -[[PortForwarding]] **PortForwarding** **0**|**1**:: - Attempt to automatically forward the DirPort and ORPort on a NAT router - connecting this Tor server to the Internet. If set, Tor will try both - NAT-PMP (common on Apple routers) and UPnP (common on routers from other - manufacturers). (Default: 0) - -[[PortForwardingHelper]] **PortForwardingHelper** __filename__|__pathname__:: - If PortForwarding is set, use this executable to configure the forwarding. - If set to a filename, the system path will be searched for the executable. - If set to a path, only the specified path will be executed. - (Default: tor-fw-helper) - -[[PublishServerDescriptor]] **PublishServerDescriptor** **0**|**1**|**v3**|**bridge**,**...**:: - This option specifies which descriptors Tor will publish when acting as - a relay. You can - choose multiple arguments, separated by commas. + - + - If this option is set to 0, Tor will not publish its - descriptors to any directories. (This is useful if you're testing - out your server, or if you're using a Tor controller that handles - directory publishing for you.) Otherwise, Tor will publish its - descriptors of all type(s) specified. The default is "1", which - means "if running as a relay or bridge, publish descriptors to the - appropriate authorities". Other possibilities are "v3", meaning - "publish as if you're a relay", and "bridge", meaning "publish as - if you're a bridge". - -[[ShutdownWaitLength]] **ShutdownWaitLength** __NUM__:: - When we get a SIGINT and we're a server, we begin shutting down: - we close listeners and start refusing new circuits. After **NUM** - seconds, we exit. If we get a second SIGINT, we exit immediately. - (Default: 30 seconds) - -[[SSLKeyLifetime]] **SSLKeyLifetime** __N__ **minutes**|**hours**|**days**|**weeks**:: - When creating a link certificate for our outermost SSL handshake, - set its lifetime to this amount of time. If set to 0, Tor will choose - some reasonable random defaults. (Default: 0) - -[[HeartbeatPeriod]] **HeartbeatPeriod** __N__ **minutes**|**hours**|**days**|**weeks**:: - Log a heartbeat message every **HeartbeatPeriod** seconds. This is - a log level __notice__ message, designed to let you know your Tor - server is still alive and doing useful things. Settings this - to 0 will disable the heartbeat. Otherwise, it must be at least 30 - minutes. (Default: 6 hours) - -[[MainloopStats]] **MainloopStats** **0**|**1**:: - Log main loop statistics every **HeartbeatPeriod** seconds. This is a log - level __notice__ message designed to help developers instrumenting Tor's - main event loop. (Default: 0) - -[[AccountingMax]] **AccountingMax** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Limits the max number of bytes sent and received within a set time period - using a given calculation rule (see: AccountingStart, AccountingRule). - Useful if you need to stay under a specific bandwidth. By default, the - number used for calculation is the max of either the bytes sent or - received. For example, with AccountingMax set to 1 GByte, a server - could send 900 MBytes and receive 800 MBytes and continue running. - It will only hibernate once one of the two reaches 1 GByte. This can - be changed to use the sum of the both bytes received and sent by setting - the AccountingRule option to "sum" (total bandwidth in/out). When the - number of bytes remaining gets low, Tor will stop accepting new connections - and circuits. When the number of bytes is exhausted, Tor will hibernate - until some time in the next accounting period. To prevent all servers - from waking at the same time, Tor will also wait until a random point - in each period before waking up. If you have bandwidth cost issues, - enabling hibernation is preferable to setting a low bandwidth, since - it provides users with a collection of fast servers that are up some - of the time, which is more useful than a set of slow servers that are - always "available". - -[[AccountingRule]] **AccountingRule** **sum**|**max**|**in**|**out**:: - How we determine when our AccountingMax has been reached (when we - should hibernate) during a time interval. Set to "max" to calculate - using the higher of either the sent or received bytes (this is the - default functionality). Set to "sum" to calculate using the sent - plus received bytes. Set to "in" to calculate using only the - received bytes. Set to "out" to calculate using only the sent bytes. - (Default: max) - -[[AccountingStart]] **AccountingStart** **day**|**week**|**month** [__day__] __HH:MM__:: - Specify how long accounting periods last. If **month** is given, each - accounting period runs from the time __HH:MM__ on the __dayth__ day of one - month to the same day and time of the next. (The day must be between 1 and - 28.) If **week** is given, each accounting period runs from the time __HH:MM__ - of the __dayth__ day of one week to the same day and time of the next week, - with Monday as day 1 and Sunday as day 7. If **day** is given, each - accounting period runs from the time __HH:MM__ each day to the same time on - the next day. All times are local, and given in 24-hour time. (Default: - "month 1 0:00") - -[[RefuseUnknownExits]] **RefuseUnknownExits** **0**|**1**|**auto**:: - Prevent nodes that don't appear in the consensus from exiting using this - relay. If the option is 1, we always block exit attempts from such - nodes; if it's 0, we never do, and if the option is "auto", then we do - whatever the authorities suggest in the consensus (and block if the consensus - is quiet on the issue). (Default: auto) - -[[ServerDNSResolvConfFile]] **ServerDNSResolvConfFile** __filename__:: - Overrides the default DNS configuration with the configuration in - __filename__. The file format is the same as the standard Unix - "**resolv.conf**" file (7). This option, like all other ServerDNS options, - only affects name lookups that your server does on behalf of clients. - (Defaults to use the system DNS configuration.) - -[[ServerDNSAllowBrokenConfig]] **ServerDNSAllowBrokenConfig** **0**|**1**:: - If this option is false, Tor exits immediately if there are problems - parsing the system DNS configuration or connecting to nameservers. - Otherwise, Tor continues to periodically retry the system nameservers until - it eventually succeeds. (Default: 1) - -[[ServerDNSSearchDomains]] **ServerDNSSearchDomains** **0**|**1**:: - If set to 1, then we will search for addresses in the local search domain. - For example, if this system is configured to believe it is in - "example.com", and a client tries to connect to "www", the client will be - connected to "www.example.com". This option only affects name lookups that - your server does on behalf of clients. (Default: 0) - -[[ServerDNSDetectHijacking]] **ServerDNSDetectHijacking** **0**|**1**:: - When this option is set to 1, we will test periodically to determine - whether our local nameservers have been configured to hijack failing DNS - requests (usually to an advertising site). If they are, we will attempt to - correct this. This option only affects name lookups that your server does - on behalf of clients. (Default: 1) - -[[ServerDNSTestAddresses]] **ServerDNSTestAddresses** __hostname__,__hostname__,__...__:: - When we're detecting DNS hijacking, make sure that these __valid__ addresses - aren't getting redirected. If they are, then our DNS is completely useless, - and we'll reset our exit policy to "reject \*:*". This option only affects - name lookups that your server does on behalf of clients. (Default: - "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org") - -[[ServerDNSAllowNonRFC953Hostnames]] **ServerDNSAllowNonRFC953Hostnames** **0**|**1**:: - When this option is disabled, Tor does not try to resolve hostnames - containing illegal characters (like @ and :) rather than sending them to an - exit node to be resolved. This helps trap accidental attempts to resolve - URLs and so on. This option only affects name lookups that your server does - on behalf of clients. (Default: 0) - -[[BridgeRecordUsageByCountry]] **BridgeRecordUsageByCountry** **0**|**1**:: - When this option is enabled and BridgeRelay is also enabled, and we have - GeoIP data, Tor keeps a per-country count of how many client - addresses have contacted it so that it can help the bridge authority guess - which countries have blocked access to it. (Default: 1) - -[[ServerDNSRandomizeCase]] **ServerDNSRandomizeCase** **0**|**1**:: - When this option is set, Tor sets the case of each character randomly in - outgoing DNS requests, and makes sure that the case matches in DNS replies. - This so-called "0x20 hack" helps resist some types of DNS poisoning attack. - For more information, see "Increased DNS Forgery Resistance through - 0x20-Bit Encoding". This option only affects name lookups that your server - does on behalf of clients. (Default: 1) - -[[GeoIPFile]] **GeoIPFile** __filename__:: - A filename containing IPv4 GeoIP data, for use with by-country statistics. - -[[GeoIPv6File]] **GeoIPv6File** __filename__:: - A filename containing IPv6 GeoIP data, for use with by-country statistics. - -[[CellStatistics]] **CellStatistics** **0**|**1**:: - Relays only. - When this option is enabled, Tor collects statistics about cell - processing (i.e. mean time a cell is spending in a queue, mean - number of cells in a queue and mean number of processed cells per - circuit) and writes them into disk every 24 hours. Onion router - operators may use the statistics for performance monitoring. - If ExtraInfoStatistics is enabled, it will published as part of - extra-info document. (Default: 0) - -[[PaddingStatistics]] **PaddingStatistics** **0**|**1**:: - Relays only. - When this option is enabled, Tor collects statistics for padding cells - sent and received by this relay, in addition to total cell counts. - These statistics are rounded, and omitted if traffic is low. This - information is important for load balancing decisions related to padding. - (Default: 1) - -[[DirReqStatistics]] **DirReqStatistics** **0**|**1**:: - Relays and bridges only. - When this option is enabled, a Tor directory writes statistics on the - number and response time of network status requests to disk every 24 - hours. Enables relay and bridge operators to monitor how much their - server is being used by clients to learn about Tor network. - If ExtraInfoStatistics is enabled, it will published as part of - extra-info document. (Default: 1) - -[[EntryStatistics]] **EntryStatistics** **0**|**1**:: - Relays only. - When this option is enabled, Tor writes statistics on the number of - directly connecting clients to disk every 24 hours. Enables relay - operators to monitor how much inbound traffic that originates from - Tor clients passes through their server to go further down the - Tor network. If ExtraInfoStatistics is enabled, it will be published - as part of extra-info document. (Default: 0) - -[[ExitPortStatistics]] **ExitPortStatistics** **0**|**1**:: - Exit relays only. - When this option is enabled, Tor writes statistics on the number of - relayed bytes and opened stream per exit port to disk every 24 hours. - Enables exit relay operators to measure and monitor amounts of traffic - that leaves Tor network through their exit node. If ExtraInfoStatistics - is enabled, it will be published as part of extra-info document. - (Default: 0) - -[[ConnDirectionStatistics]] **ConnDirectionStatistics** **0**|**1**:: - Relays only. - When this option is enabled, Tor writes statistics on the amounts of - traffic it passes between itself and other relays to disk every 24 - hours. Enables relay operators to monitor how much their relay is - being used as middle node in the circuit. If ExtraInfoStatistics is - enabled, it will be published as part of extra-info document. - (Default: 0) - -[[HiddenServiceStatistics]] **HiddenServiceStatistics** **0**|**1**:: - Relays only. - When this option is enabled, a Tor relay writes obfuscated - statistics on its role as hidden-service directory, introduction - point, or rendezvous point to disk every 24 hours. If - ExtraInfoStatistics is also enabled, these statistics are further - published to the directory authorities. (Default: 1) - -[[ExtraInfoStatistics]] **ExtraInfoStatistics** **0**|**1**:: - When this option is enabled, Tor includes previously gathered statistics in - its extra-info documents that it uploads to the directory authorities. - (Default: 1) - -[[ExtendAllowPrivateAddresses]] **ExtendAllowPrivateAddresses** **0**|**1**:: - When this option is enabled, Tor will connect to relays on localhost, - RFC1918 addresses, and so on. In particular, Tor will make direct OR - connections, and Tor routers allow EXTEND requests, to these private - addresses. (Tor will always allow connections to bridges, proxies, and - pluggable transports configured on private addresses.) Enabling this - option can create security issues; you should probably leave it off. - (Default: 0) - -[[MaxMemInQueues]] **MaxMemInQueues** __N__ **bytes**|**KB**|**MB**|**GB**:: - This option configures a threshold above which Tor will assume that it - needs to stop queueing or buffering data because it's about to run out of - memory. If it hits this threshold, it will begin killing circuits until - it has recovered at least 10% of this memory. Do not set this option too - low, or your relay may be unreliable under load. This option only - affects some queues, so the actual process size will be larger than - this. If this option is set to 0, Tor will try to pick a reasonable - default based on your system's physical memory. (Default: 0) - -[[DisableOOSCheck]] **DisableOOSCheck** **0**|**1**:: - This option disables the code that closes connections when Tor notices - that it is running low on sockets. Right now, it is on by default, - since the existing out-of-sockets mechanism tends to kill OR connections - more than it should. (Default: 1) - -[[SigningKeyLifetime]] **SigningKeyLifetime** __N__ **days**|**weeks**|**months**:: - For how long should each Ed25519 signing key be valid? Tor uses a - permanent master identity key that can be kept offline, and periodically - generates new "signing" keys that it uses online. This option - configures their lifetime. - (Default: 30 days) - -[[OfflineMasterKey]] **OfflineMasterKey** **0**|**1**:: - If non-zero, the Tor relay will never generate or load its master secret - key. Instead, you'll have to use "tor --keygen" to manage the permanent - ed25519 master identity key, as well as the corresponding temporary - signing keys and certificates. (Default: 0) - -[[KeyDirectory]] **KeyDirectory** __DIR__:: - Store secret keys in DIR. Can not be changed while tor is - running. - (Default: the "keys" subdirectory of DataDirectory.) - -[[KeyDirectoryGroupReadable]] **KeyDirectoryGroupReadable** **0**|**1**:: - If this option is set to 0, don't allow the filesystem group to read the - KeywDirectory. If the option is set to 1, make the KeyDirectory readable - by the default GID. (Default: 0) - - -DIRECTORY SERVER OPTIONS ------------------------- - -The following options are useful only for directory servers. (Relays with -enough bandwidth automatically become directory servers; see DirCache for -details.) - -[[DirPortFrontPage]] **DirPortFrontPage** __FILENAME__:: - When this option is set, it takes an HTML file and publishes it as "/" on - the DirPort. Now relay operators can provide a disclaimer without needing - to set up a separate webserver. There's a sample disclaimer in - contrib/operator-tools/tor-exit-notice.html. - -[[DirPort]] **DirPort** \['address':]__PORT__|**auto** [_flags_]:: - If this option is nonzero, advertise the directory service on this port. - Set it to "auto" to have Tor pick a port for you. This option can occur - more than once, but only one advertised DirPort is supported: all - but one DirPort must have the **NoAdvertise** flag set. (Default: 0) + - + - The same flags are supported here as are supported by ORPort. - -[[DirPolicy]] **DirPolicy** __policy__,__policy__,__...__:: - Set an entrance policy for this server, to limit who can connect to the - directory ports. The policies have the same form as exit policies above, - except that port specifiers are ignored. Any address not matched by - some entry in the policy is accepted. - -[[DirCache]] **DirCache** **0**|**1**:: - When this option is set, Tor caches all current directory documents and - accepts client requests for them. Setting DirPort is not required for this, - because clients connect via the ORPort by default. Setting either DirPort - or BridgeRelay and setting DirCache to 0 is not supported. (Default: 1) - -[[MaxConsensusAgeForDiffs]] **MaxConsensusAgeForDiffs** __N__ **minutes**|**hours**|**days**|**weeks**:: - When this option is nonzero, Tor caches will not try to generate - consensus diffs for any consensus older than this amount of time. - If this option is set to zero, Tor will pick a reasonable default from - the current networkstatus document. You should not set this - option unless your cache is severely low on disk space or CPU. - If you need to set it, keeping it above 3 or 4 hours will help clients - much more than setting it to zero. - (Default: 0) - - -DIRECTORY AUTHORITY SERVER OPTIONS ----------------------------------- - -The following options enable operation as a directory authority, and -control how Tor behaves as a directory authority. You should not need -to adjust any of them if you're running a regular relay or exit server -on the public Tor network. - -[[AuthoritativeDirectory]] **AuthoritativeDirectory** **0**|**1**:: - When this option is set to 1, Tor operates as an authoritative directory - server. Instead of caching the directory, it generates its own list of - good servers, signs it, and sends that to the clients. Unless the clients - already have you listed as a trusted directory, you probably do not want - to set this option. - -[[V3AuthoritativeDirectory]] **V3AuthoritativeDirectory** **0**|**1**:: - When this option is set in addition to **AuthoritativeDirectory**, Tor - generates version 3 network statuses and serves descriptors, etc as - described in dir-spec.txt file of https://spec.torproject.org/[torspec] - (for Tor clients and servers running at least 0.2.0.x). - -[[VersioningAuthoritativeDirectory]] **VersioningAuthoritativeDirectory** **0**|**1**:: - When this option is set to 1, Tor adds information on which versions of - Tor are still believed safe for use to the published directory. Each - version 1 authority is automatically a versioning authority; version 2 - authorities provide this service optionally. See **RecommendedVersions**, - **RecommendedClientVersions**, and **RecommendedServerVersions**. - -[[RecommendedVersions]] **RecommendedVersions** __STRING__:: - STRING is a comma-separated list of Tor versions currently believed to be - safe. The list is included in each directory, and nodes which pull down the - directory learn whether they need to upgrade. This option can appear - multiple times: the values from multiple lines are spliced together. When - this is set then **VersioningAuthoritativeDirectory** should be set too. - -[[RecommendedPackages]] **RecommendedPackages** __PACKAGENAME__ __VERSION__ __URL__ __DIGESTTYPE__**=**__DIGEST__ :: - Adds "package" line to the directory authority's vote. This information - is used to vote on the correct URL and digest for the released versions - of different Tor-related packages, so that the consensus can certify - them. This line may appear any number of times. - -[[RecommendedClientVersions]] **RecommendedClientVersions** __STRING__:: - STRING is a comma-separated list of Tor versions currently believed to be - safe for clients to use. This information is included in version 2 - directories. If this is not set then the value of **RecommendedVersions** - is used. When this is set then **VersioningAuthoritativeDirectory** should - be set too. - -[[BridgeAuthoritativeDir]] **BridgeAuthoritativeDir** **0**|**1**:: - When this option is set in addition to **AuthoritativeDirectory**, Tor - accepts and serves server descriptors, but it caches and serves the main - networkstatus documents rather than generating its own. (Default: 0) - -[[MinUptimeHidServDirectoryV2]] **MinUptimeHidServDirectoryV2** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: - Minimum uptime of a v2 hidden service directory to be accepted as such by - authoritative directories. (Default: 25 hours) - -[[RecommendedServerVersions]] **RecommendedServerVersions** __STRING__:: - STRING is a comma-separated list of Tor versions currently believed to be - safe for servers to use. This information is included in version 2 - directories. If this is not set then the value of **RecommendedVersions** - is used. When this is set then **VersioningAuthoritativeDirectory** should - be set too. - -[[ConsensusParams]] **ConsensusParams** __STRING__:: - STRING is a space-separated list of key=value pairs that Tor will include - in the "params" line of its networkstatus vote. - -[[DirAllowPrivateAddresses]] **DirAllowPrivateAddresses** **0**|**1**:: - If set to 1, Tor will accept server descriptors with arbitrary "Address" - elements. Otherwise, if the address is not an IP address or is a private IP - address, it will reject the server descriptor. Additionally, Tor - will allow exit policies for private networks to fulfill Exit flag - requirements. (Default: 0) - -[[AuthDirBadExit]] **AuthDirBadExit** __AddressPattern...__:: - Authoritative directories only. A set of address patterns for servers that - will be listed as bad exits in any network status document this authority - publishes, if **AuthDirListBadExits** is set. + - + - (The address pattern syntax here and in the options below - is the same as for exit policies, except that you don't need to say - "accept" or "reject", and ports are not needed.) - -[[AuthDirInvalid]] **AuthDirInvalid** __AddressPattern...__:: - Authoritative directories only. A set of address patterns for servers that - will never be listed as "valid" in any network status document that this - authority publishes. - -[[AuthDirReject]] **AuthDirReject** __AddressPattern__...:: - Authoritative directories only. A set of address patterns for servers that - will never be listed at all in any network status document that this - authority publishes, or accepted as an OR address in any descriptor - submitted for publication by this authority. - -[[AuthDirBadExitCCs]] **AuthDirBadExitCCs** __CC__,... + - -[[AuthDirInvalidCCs]] **AuthDirInvalidCCs** __CC__,... + - -[[AuthDirRejectCCs]] **AuthDirRejectCCs** __CC__,...:: - Authoritative directories only. These options contain a comma-separated - list of country codes such that any server in one of those country codes - will be marked as a bad exit/invalid for use, or rejected - entirely. - -[[AuthDirListBadExits]] **AuthDirListBadExits** **0**|**1**:: - Authoritative directories only. If set to 1, this directory has some - opinion about which nodes are unsuitable as exit nodes. (Do not set this to - 1 unless you plan to list non-functioning exits as bad; otherwise, you are - effectively voting in favor of every declared exit as an exit.) - -[[AuthDirMaxServersPerAddr]] **AuthDirMaxServersPerAddr** __NUM__:: - Authoritative directories only. The maximum number of servers that we will - list as acceptable on a single IP address. Set this to "0" for "no limit". - (Default: 2) - -[[AuthDirFastGuarantee]] **AuthDirFastGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Authoritative directories only. If non-zero, always vote the - Fast flag for any relay advertising this amount of capacity or - more. (Default: 100 KBytes) - -[[AuthDirGuardBWGuarantee]] **AuthDirGuardBWGuarantee** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Authoritative directories only. If non-zero, this advertised capacity - or more is always sufficient to satisfy the bandwidth requirement - for the Guard flag. (Default: 2 MBytes) - -[[AuthDirPinKeys]] **AuthDirPinKeys** **0**|**1**:: - Authoritative directories only. If non-zero, do not allow any relay to - publish a descriptor if any other relay has reserved its - identity keypair. In all cases, Tor records every keypair it accepts - in a journal if it is new, or if it differs from the most recently - accepted pinning for one of the keys it contains. (Default: 1) - -[[AuthDirSharedRandomness]] **AuthDirSharedRandomness** **0**|**1**:: - Authoritative directories only. Switch for the shared random protocol. - If zero, the authority won't participate in the protocol. If non-zero - (default), the flag "shared-rand-participate" is added to the authority - vote indicating participation in the protocol. (Default: 1) - -[[AuthDirTestEd25519LinkKeys]] **AuthDirTestEd25519LinkKeys** **0**|**1**:: - Authoritative directories only. If this option is set to 0, then we treat - relays as "Running" if their RSA key is correct when we probe them, - regardless of their Ed25519 key. We should only ever set this option to 0 - if there is some major bug in Ed25519 link authentication that causes us - to label all the relays as not Running. (Default: 1) - -[[BridgePassword]] **BridgePassword** __Password__:: - If set, contains an HTTP authenticator that tells a bridge authority to - serve all requested bridge information. Used by the (only partially - implemented) "bridge community" design, where a community of bridge - relay operators all use an alternate bridge directory authority, - and their target user audience can periodically fetch the list of - available community bridges to stay up-to-date. (Default: not set) - -[[V3AuthVotingInterval]] **V3AuthVotingInterval** __N__ **minutes**|**hours**:: - V3 authoritative directories only. Configures the server's preferred voting - interval. Note that voting will __actually__ happen at an interval chosen - by consensus from all the authorities' preferred intervals. This time - SHOULD divide evenly into a day. (Default: 1 hour) - -[[V3AuthVoteDelay]] **V3AuthVoteDelay** __N__ **minutes**|**hours**:: - V3 authoritative directories only. Configures the server's preferred delay - between publishing its vote and assuming it has all the votes from all the - other authorities. Note that the actual time used is not the server's - preferred time, but the consensus of all preferences. (Default: 5 minutes) - -[[V3AuthDistDelay]] **V3AuthDistDelay** __N__ **minutes**|**hours**:: - V3 authoritative directories only. Configures the server's preferred delay - between publishing its consensus and signature and assuming it has all the - signatures from all the other authorities. Note that the actual time used - is not the server's preferred time, but the consensus of all preferences. - (Default: 5 minutes) - -[[V3AuthNIntervalsValid]] **V3AuthNIntervalsValid** __NUM__:: - V3 authoritative directories only. Configures the number of VotingIntervals - for which each consensus should be valid for. Choosing high numbers - increases network partitioning risks; choosing low numbers increases - directory traffic. Note that the actual number of intervals used is not the - server's preferred number, but the consensus of all preferences. Must be at - least 2. (Default: 3) - -[[V3BandwidthsFile]] **V3BandwidthsFile** __FILENAME__:: - V3 authoritative directories only. Configures the location of the - bandwidth-authority generated file storing information on relays' measured - bandwidth capacities. (Default: unset) - -[[V3AuthUseLegacyKey]] **V3AuthUseLegacyKey** **0**|**1**:: - If set, the directory authority will sign consensuses not only with its - own signing key, but also with a "legacy" key and certificate with a - different identity. This feature is used to migrate directory authority - keys in the event of a compromise. (Default: 0) - -[[RephistTrackTime]] **RephistTrackTime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: - Tells an authority, or other node tracking node reliability and history, - that fine-grained information about nodes can be discarded when it hasn't - changed for a given amount of time. (Default: 24 hours) - -[[AuthDirHasIPv6Connectivity]] **AuthDirHasIPv6Connectivity** **0**|**1**:: - Authoritative directories only. When set to 0, OR ports with an - IPv6 address are not included in the authority's votes. When set to 1, - IPv6 OR ports are tested for reachability like IPv4 OR ports. If the - reachability test succeeds, the authority votes for the IPv6 ORPort, and - votes Running for the relay. If the reachability test fails, the authority - does not vote for the IPv6 ORPort, and does not vote Running (Default: 0) + -+ - The content of the consensus depends on the number of voting authorities - that set AuthDirHasIPv6Connectivity: - - If no authorities set AuthDirHasIPv6Connectivity 1, there will be no - IPv6 ORPorts in the consensus. - - If a minority of authorities set AuthDirHasIPv6Connectivity 1, - unreachable IPv6 ORPorts will be removed from the consensus. But the - majority of IPv4-only authorities will still vote the relay as Running. - Reachable IPv6 ORPort lines will be included in the consensus - - If a majority of voting authorities set AuthDirHasIPv6Connectivity 1, - relays with unreachable IPv6 ORPorts will not be listed as Running. - Reachable IPv6 ORPort lines will be included in the consensus - (To ensure that any valid majority will vote relays with unreachable - IPv6 ORPorts not Running, 75% of authorities must set - AuthDirHasIPv6Connectivity 1.) - -[[MinMeasuredBWsForAuthToIgnoreAdvertised]] **MinMeasuredBWsForAuthToIgnoreAdvertised** __N__:: - A total value, in abstract bandwidth units, describing how much - measured total bandwidth an authority should have observed on the network - before it will treat advertised bandwidths as wholly - unreliable. (Default: 500) - -HIDDEN SERVICE OPTIONS ----------------------- - -The following options are used to configure a hidden service. - -[[HiddenServiceDir]] **HiddenServiceDir** __DIRECTORY__:: - Store data files for a hidden service in DIRECTORY. Every hidden service - must have a separate directory. You may use this option multiple times to - specify multiple services. If DIRECTORY does not exist, Tor will create it. - (Note: in current versions of Tor, if DIRECTORY is a relative path, - it will be relative to the current - working directory of Tor instance, not to its DataDirectory. Do not - rely on this behavior; it is not guaranteed to remain the same in future - versions.) - -[[HiddenServicePort]] **HiddenServicePort** __VIRTPORT__ [__TARGET__]:: - Configure a virtual port VIRTPORT for a hidden service. You may use this - option multiple times; each time applies to the service using the most - recent HiddenServiceDir. By default, this option maps the virtual port to - the same port on 127.0.0.1 over TCP. You may override the target port, - address, or both by specifying a target of addr, port, addr:port, or - **unix:**__path__. (You can specify an IPv6 target as [addr]:port. Unix - paths may be quoted, and may use standard C escapes.) - You may also have multiple lines with the same VIRTPORT: when a user - connects to that VIRTPORT, one of the TARGETs from those lines will be - chosen at random. - -[[PublishHidServDescriptors]] **PublishHidServDescriptors** **0**|**1**:: - If set to 0, Tor will run any hidden services you configure, but it won't - advertise them to the rendezvous directory. This option is only useful if - you're using a Tor controller that handles hidserv publishing for you. - (Default: 1) - -[[HiddenServiceVersion]] **HiddenServiceVersion** __version__,__version__,__...__:: - A list of rendezvous service descriptor versions to publish for the hidden - service. Currently, versions 2 and 3 are supported. (Default: 2) - -[[HiddenServiceAuthorizeClient]] **HiddenServiceAuthorizeClient** __auth-type__ __client-name__,__client-name__,__...__:: - If configured, the hidden service is accessible for authorized clients - only. The auth-type can either be \'basic' for a general-purpose - authorization protocol or \'stealth' for a less scalable protocol that also - hides service activity from unauthorized clients. Only clients that are - listed here are authorized to access the hidden service. Valid client names - are 1 to 16 characters long and only use characters in A-Za-z0-9+-_ (no - spaces). If this option is set, the hidden service is not accessible for - clients without authorization any more. Generated authorization data can be - found in the hostname file. Clients need to put this authorization data in - their configuration file using **HidServAuth**. - -[[HiddenServiceAllowUnknownPorts]] **HiddenServiceAllowUnknownPorts** **0**|**1**:: - If set to 1, then connections to unrecognized ports do not cause the - current hidden service to close rendezvous circuits. (Setting this to 0 is - not an authorization mechanism; it is instead meant to be a mild - inconvenience to port-scanners.) (Default: 0) - -[[HiddenServiceMaxStreams]] **HiddenServiceMaxStreams** __N__:: - The maximum number of simultaneous streams (connections) per rendezvous - circuit. The maximum value allowed is 65535. (Setting this to 0 will allow - an unlimited number of simultanous streams.) (Default: 0) - -[[HiddenServiceMaxStreamsCloseCircuit]] **HiddenServiceMaxStreamsCloseCircuit** **0**|**1**:: - If set to 1, then exceeding **HiddenServiceMaxStreams** will cause the - offending rendezvous circuit to be torn down, as opposed to stream creation - requests that exceed the limit being silently ignored. (Default: 0) - -[[RendPostPeriod]] **RendPostPeriod** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: - Every time the specified period elapses, Tor uploads any rendezvous - service descriptors to the directory servers. This information is also - uploaded whenever it changes. Minimum value allowed is 10 minutes and - maximum is 3.5 days. (Default: 1 hour) - -[[HiddenServiceDirGroupReadable]] **HiddenServiceDirGroupReadable** **0**|**1**:: - If this option is set to 1, allow the filesystem group to read the - hidden service directory and hostname file. If the option is set to 0, - only owner is able to read the hidden service directory. (Default: 0) - Has no effect on Windows. - -[[HiddenServiceNumIntroductionPoints]] **HiddenServiceNumIntroductionPoints** __NUM__:: - Number of introduction points the hidden service will have. You can't - have more than 10 for v2 service and 20 for v3. (Default: 3) - -[[HiddenServiceSingleHopMode]] **HiddenServiceSingleHopMode** **0**|**1**:: - **Experimental - Non Anonymous** Hidden Services on a tor instance in - HiddenServiceSingleHopMode make one-hop (direct) circuits between the onion - service server, and the introduction and rendezvous points. (Onion service - descriptors are still posted using 3-hop paths, to avoid onion service - directories blocking the service.) - This option makes every hidden service instance hosted by a tor instance a - Single Onion Service. One-hop circuits make Single Onion servers easily - locatable, but clients remain location-anonymous. However, the fact that a - client is accessing a Single Onion rather than a Hidden Service may be - statistically distinguishable. + - + - **WARNING:** Once a hidden service directory has been used by a tor - instance in HiddenServiceSingleHopMode, it can **NEVER** be used again for - a hidden service. It is best practice to create a new hidden service - directory, key, and address for each new Single Onion Service and Hidden - Service. It is not possible to run Single Onion Services and Hidden - Services from the same tor instance: they should be run on different - servers with different IP addresses. + - + - HiddenServiceSingleHopMode requires HiddenServiceNonAnonymousMode to be set - to 1. Since a Single Onion service is non-anonymous, you can not configure - a SOCKSPort on a tor instance that is running in - **HiddenServiceSingleHopMode**. Can not be changed while tor is running. - (Default: 0) - -[[HiddenServiceNonAnonymousMode]] **HiddenServiceNonAnonymousMode** **0**|**1**:: - Makes hidden services non-anonymous on this tor instance. Allows the - non-anonymous HiddenServiceSingleHopMode. Enables direct connections in the - server-side hidden service protocol. If you are using this option, - you need to disable all client-side services on your Tor instance, - including setting SOCKSPort to "0". Can not be changed while tor is - running. (Default: 0) - -TESTING NETWORK OPTIONS ------------------------ - -The following options are used for running a testing Tor network. - -[[TestingTorNetwork]] **TestingTorNetwork** **0**|**1**:: - If set to 1, Tor adjusts default values of the configuration options below, - so that it is easier to set up a testing Tor network. May only be set if - non-default set of DirAuthorities is set. Cannot be unset while Tor is - running. - (Default: 0) + - - ServerDNSAllowBrokenConfig 1 - DirAllowPrivateAddresses 1 - EnforceDistinctSubnets 0 - AssumeReachable 1 - AuthDirMaxServersPerAddr 0 - AuthDirMaxServersPerAuthAddr 0 - ClientBootstrapConsensusAuthorityDownloadSchedule 0, 2, - 4 (for 40 seconds), 8, 16, 32, 60 - ClientBootstrapConsensusFallbackDownloadSchedule 0, 1, - 4 (for 40 seconds), 8, 16, 32, 60 - ClientBootstrapConsensusAuthorityOnlyDownloadSchedule 0, 1, - 4 (for 40 seconds), 8, 16, 32, 60 - ClientBootstrapConsensusMaxDownloadTries 80 - ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries 80 - ClientDNSRejectInternalAddresses 0 - ClientRejectInternalAddresses 0 - CountPrivateBandwidth 1 - ExitPolicyRejectPrivate 0 - ExtendAllowPrivateAddresses 1 - V3AuthVotingInterval 5 minutes - V3AuthVoteDelay 20 seconds - V3AuthDistDelay 20 seconds - MinUptimeHidServDirectoryV2 0 seconds - TestingV3AuthInitialVotingInterval 5 minutes - TestingV3AuthInitialVoteDelay 20 seconds - TestingV3AuthInitialDistDelay 20 seconds - TestingAuthDirTimeToLearnReachability 0 minutes - TestingEstimatedDescriptorPropagationTime 0 minutes - TestingServerDownloadSchedule 0, 0, 0, 5, 10, 15, 20, 30, 60 - TestingClientDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 - TestingServerConsensusDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 - TestingClientConsensusDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 - TestingBridgeDownloadSchedule 10, 30, 60 - TestingBridgeBootstrapDownloadSchedule 0, 0, 5, 10, 15, 20, 30, 60 - TestingClientMaxIntervalWithoutRequest 5 seconds - TestingDirConnectionMaxStall 30 seconds - TestingConsensusMaxDownloadTries 80 - TestingDescriptorMaxDownloadTries 80 - TestingMicrodescMaxDownloadTries 80 - TestingCertMaxDownloadTries 80 - TestingEnableConnBwEvent 1 - TestingEnableCellStatsEvent 1 - TestingEnableTbEmptyEvent 1 - -[[TestingV3AuthInitialVotingInterval]] **TestingV3AuthInitialVotingInterval** __N__ **minutes**|**hours**:: - Like V3AuthVotingInterval, but for initial voting interval before the first - consensus has been created. Changing this requires that - **TestingTorNetwork** is set. (Default: 30 minutes) - -[[TestingV3AuthInitialVoteDelay]] **TestingV3AuthInitialVoteDelay** __N__ **minutes**|**hours**:: - Like V3AuthVoteDelay, but for initial voting interval before - the first consensus has been created. Changing this requires that - **TestingTorNetwork** is set. (Default: 5 minutes) - -[[TestingV3AuthInitialDistDelay]] **TestingV3AuthInitialDistDelay** __N__ **minutes**|**hours**:: - Like V3AuthDistDelay, but for initial voting interval before - the first consensus has been created. Changing this requires that - **TestingTorNetwork** is set. (Default: 5 minutes) - -[[TestingV3AuthVotingStartOffset]] **TestingV3AuthVotingStartOffset** __N__ **seconds**|**minutes**|**hours**:: - Directory authorities offset voting start time by this much. - Changing this requires that **TestingTorNetwork** is set. (Default: 0) - -[[TestingAuthDirTimeToLearnReachability]] **TestingAuthDirTimeToLearnReachability** __N__ **minutes**|**hours**:: - After starting as an authority, do not make claims about whether routers - are Running until this much time has passed. Changing this requires - that **TestingTorNetwork** is set. (Default: 30 minutes) - -[[TestingEstimatedDescriptorPropagationTime]] **TestingEstimatedDescriptorPropagationTime** __N__ **minutes**|**hours**:: - Clients try downloading server descriptors from directory caches after this - time. Changing this requires that **TestingTorNetwork** is set. (Default: - 10 minutes) - -[[TestingMinFastFlagThreshold]] **TestingMinFastFlagThreshold** __N__ **bytes**|**KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Minimum value for the Fast flag. Overrides the ordinary minimum taken - from the consensus when TestingTorNetwork is set. (Default: 0.) - -[[TestingServerDownloadSchedule]] **TestingServerDownloadSchedule** __N__,__N__,__...__:: - Schedule for when servers should download things in general. Changing this - requires that **TestingTorNetwork** is set. (Default: 0, 0, 0, 60, 60, 120, - 300, 900, 2147483647) - -[[TestingClientDownloadSchedule]] **TestingClientDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download things in general. Changing this - requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, - 2147483647) - -[[TestingServerConsensusDownloadSchedule]] **TestingServerConsensusDownloadSchedule** __N__,__N__,__...__:: - Schedule for when servers should download consensuses. Changing this - requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, - 1800, 1800, 1800, 1800, 1800, 3600, 7200) - -[[TestingClientConsensusDownloadSchedule]] **TestingClientConsensusDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download consensuses. Changing this - requires that **TestingTorNetwork** is set. (Default: 0, 0, 60, 300, 600, - 1800, 3600, 3600, 3600, 10800, 21600, 43200) - -[[TestingBridgeDownloadSchedule]] **TestingBridgeDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download each bridge descriptor when they - know that one or more of their configured bridges are running. Changing - this requires that **TestingTorNetwork** is set. (Default: 10800, 25200, - 54000, 111600, 262800) - -[[TestingBridgeBootstrapDownloadSchedule]] **TestingBridgeBootstrapDownloadSchedule** __N__,__N__,__...__:: - Schedule for when clients should download each bridge descriptor when they - have just started, or when they can not contact any of their bridges. - Changing this requires that **TestingTorNetwork** is set. (Default: 0, 30, - 90, 600, 3600, 10800, 25200, 54000, 111600, 262800) - -[[TestingClientMaxIntervalWithoutRequest]] **TestingClientMaxIntervalWithoutRequest** __N__ **seconds**|**minutes**:: - When directory clients have only a few descriptors to request, they batch - them until they have more, or until this amount of time has passed. - Changing this requires that **TestingTorNetwork** is set. (Default: 10 - minutes) - -[[TestingDirConnectionMaxStall]] **TestingDirConnectionMaxStall** __N__ **seconds**|**minutes**:: - Let a directory connection stall this long before expiring it. - Changing this requires that **TestingTorNetwork** is set. (Default: - 5 minutes) - -[[TestingConsensusMaxDownloadTries]] **TestingConsensusMaxDownloadTries** __NUM__:: - Try this many times to download a consensus before giving up. Changing - this requires that **TestingTorNetwork** is set. (Default: 8) - -[[TestingDescriptorMaxDownloadTries]] **TestingDescriptorMaxDownloadTries** __NUM__:: - Try this often to download a server descriptor before giving up. - Changing this requires that **TestingTorNetwork** is set. (Default: 8) - -[[TestingMicrodescMaxDownloadTries]] **TestingMicrodescMaxDownloadTries** __NUM__:: - Try this often to download a microdesc descriptor before giving up. - Changing this requires that **TestingTorNetwork** is set. (Default: 8) - -[[TestingCertMaxDownloadTries]] **TestingCertMaxDownloadTries** __NUM__:: - Try this often to download a v3 authority certificate before giving up. - Changing this requires that **TestingTorNetwork** is set. (Default: 8) - -[[TestingDirAuthVoteExit]] **TestingDirAuthVoteExit** __node__,__node__,__...__:: - A list of identity fingerprints, country codes, and - address patterns of nodes to vote Exit for regardless of their - uptime, bandwidth, or exit policy. See the **ExcludeNodes** - option for more information on how to specify nodes. + - + - In order for this option to have any effect, **TestingTorNetwork** - has to be set. See the **ExcludeNodes** option for more - information on how to specify nodes. - -[[TestingDirAuthVoteExitIsStrict]] **TestingDirAuthVoteExitIsStrict** **0**|**1** :: - If True (1), a node will never receive the Exit flag unless it is specified - in the **TestingDirAuthVoteExit** list, regardless of its uptime, bandwidth, - or exit policy. + - + - In order for this option to have any effect, **TestingTorNetwork** - has to be set. - -[[TestingDirAuthVoteGuard]] **TestingDirAuthVoteGuard** __node__,__node__,__...__:: - A list of identity fingerprints and country codes and - address patterns of nodes to vote Guard for regardless of their - uptime and bandwidth. See the **ExcludeNodes** option for more - information on how to specify nodes. + - + - In order for this option to have any effect, **TestingTorNetwork** - has to be set. - -[[TestingDirAuthVoteGuardIsStrict]] **TestingDirAuthVoteGuardIsStrict** **0**|**1** :: - If True (1), a node will never receive the Guard flag unless it is specified - in the **TestingDirAuthVoteGuard** list, regardless of its uptime and bandwidth. + - + - In order for this option to have any effect, **TestingTorNetwork** - has to be set. - -[[TestingDirAuthVoteHSDir]] **TestingDirAuthVoteHSDir** __node__,__node__,__...__:: - A list of identity fingerprints and country codes and - address patterns of nodes to vote HSDir for regardless of their - uptime and DirPort. See the **ExcludeNodes** option for more - information on how to specify nodes. + - + - In order for this option to have any effect, **TestingTorNetwork** - must be set. - -[[TestingDirAuthVoteHSDirIsStrict]] **TestingDirAuthVoteHSDirIsStrict** **0**|**1** :: - If True (1), a node will never receive the HSDir flag unless it is specified - in the **TestingDirAuthVoteHSDir** list, regardless of its uptime and DirPort. + - + - In order for this option to have any effect, **TestingTorNetwork** - has to be set. - -[[TestingEnableConnBwEvent]] **TestingEnableConnBwEvent** **0**|**1**:: - If this option is set, then Tor controllers may register for CONN_BW - events. Changing this requires that **TestingTorNetwork** is set. - (Default: 0) - -[[TestingEnableCellStatsEvent]] **TestingEnableCellStatsEvent** **0**|**1**:: - If this option is set, then Tor controllers may register for CELL_STATS - events. Changing this requires that **TestingTorNetwork** is set. - (Default: 0) - -[[TestingEnableTbEmptyEvent]] **TestingEnableTbEmptyEvent** **0**|**1**:: - If this option is set, then Tor controllers may register for TB_EMPTY - events. Changing this requires that **TestingTorNetwork** is set. - (Default: 0) - -[[TestingMinExitFlagThreshold]] **TestingMinExitFlagThreshold** __N__ **KBytes**|**MBytes**|**GBytes**|**TBytes**|**KBits**|**MBits**|**GBits**|**TBits**:: - Sets a lower-bound for assigning an exit flag when running as an - authority on a testing network. Overrides the usual default lower bound - of 4 KB. (Default: 0) - -[[TestingLinkCertLifetime]] **TestingLinkCertLifetime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**|**months**:: - Overrides the default lifetime for the certificates used to authenticate - our X509 link cert with our ed25519 signing key. - (Default: 2 days) - -[[TestingAuthKeyLifetime]] **TestingAuthKeyLifetime** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**|**months**:: - Overrides the default lifetime for a signing Ed25519 TLS Link authentication - key. - (Default: 2 days) - -[[TestingLinkKeySlop]] **TestingLinkKeySlop** __N__ **seconds**|**minutes**|**hours** + - -[[TestingAuthKeySlop]] **TestingAuthKeySlop** __N__ **seconds**|**minutes**|**hours** + - -[[TestingSigningKeySlop]] **TestingSigningKeySlop** __N__ **seconds**|**minutes**|**hours**:: - How early before the official expiration of a an Ed25519 signing key do - we replace it and issue a new key? - (Default: 3 hours for link and auth; 1 day for signing.) - -NON-PERSISTENT OPTIONS ----------------------- - -These options are not saved to the torrc file by the "SAVECONF" controller -command. Other options of this type are documented in control-spec.txt, -section 5.4. End-users should mostly ignore them. - -[[UnderscorePorts]] **\_\_ControlPort**, **\_\_DirPort**, **\_\_DNSPort**, **\_\_ExtORPort**, **\_\_NATDPort**, **\_\_ORPort**, **\_\_SocksPort**, **\_\_TransPort**:: - These underscore-prefixed options are variants of the regular Port - options. They behave the same, except they are not saved to the - torrc file by the controller's SAVECONF command. - - -SIGNALS -------- - -Tor catches the following signals: - -[[SIGTERM]] **SIGTERM**:: - Tor will catch this, clean up and sync to disk if necessary, and exit. - -[[SIGINT]] **SIGINT**:: - Tor clients behave as with SIGTERM; but Tor servers will do a controlled - slow shutdown, closing listeners and waiting 30 seconds before exiting. - (The delay can be configured with the ShutdownWaitLength config option.) - -[[SIGHUP]] **SIGHUP**:: - The signal instructs Tor to reload its configuration (including closing and - reopening logs), and kill and restart its helper processes if applicable. - -[[SIGUSR1]] **SIGUSR1**:: - Log statistics about current connections, past connections, and throughput. - -[[SIGUSR2]] **SIGUSR2**:: - Switch all logs to loglevel debug. You can go back to the old loglevels by - sending a SIGHUP. - -[[SIGCHLD]] **SIGCHLD**:: - Tor receives this signal when one of its helper processes has exited, so it - can clean up. - -[[SIGPIPE]] **SIGPIPE**:: - Tor catches this signal and ignores it. - -[[SIGXFSZ]] **SIGXFSZ**:: - If this signal exists on your platform, Tor catches and ignores it. - -FILES ------ - -**@CONFDIR@/torrc**:: - The configuration file, which contains "option value" pairs. - -**$HOME/.torrc**:: - Fallback location for torrc, if @CONFDIR@/torrc is not found. - -**@LOCALSTATEDIR@/lib/tor/**:: - The tor process stores keys and other data here. - - -__CacheDirectory__**/cached-certs**:: - This file holds downloaded directory key certificates that are used to - verify authenticity of documents generated by Tor directory authorities. - -__CacheDirectory__**/cached-consensus** and/or **cached-microdesc-consensus**:: - The most recent consensus network status document we've downloaded. - -__CacheDirectory__**/cached-descriptors** and **cached-descriptors.new**:: - These files hold downloaded router statuses. Some routers may appear more - than once; if so, the most recently published descriptor is used. Lines - beginning with @-signs are annotations that contain more information about - a given router. The ".new" file is an append-only journal; when it gets - too large, all entries are merged into a new cached-descriptors file. - -__CacheDirectory__**/cached-extrainfo** and **cached-extrainfo.new**:: - As "cached-descriptors", but holds optionally-downloaded "extra-info" - documents. Relays use these documents to send inessential information - about statistics, bandwidth history, and network health to the - authorities. They aren't fetched by default; see the DownloadExtraInfo - option for more info. - -__CacheDirectory__**/cached-microdescs** and **cached-microdescs.new**:: - These files hold downloaded microdescriptors. Lines beginning with - @-signs are annotations that contain more information about a given - router. The ".new" file is an append-only journal; when it gets too - large, all entries are merged into a new cached-microdescs file. - -__CacheDirectory__**/cached-routers** and **cached-routers.new**:: - Obsolete versions of cached-descriptors and cached-descriptors.new. When - Tor can't find the newer files, it looks here instead. - -__DataDirectory__**/state**:: - A set of persistent key-value mappings. These are documented in - the file. These include: - - The current entry guards and their status. - - The current bandwidth accounting values. - - When the file was last written - - What version of Tor generated the state file - - A short history of bandwidth usage, as produced in the server - descriptors. - -__DataDirectory__**/sr-state**:: - Authority only. State file used to record information about the current - status of the shared-random-value voting state. - -__CacheDirectory__**/diff-cache**:: - Directory cache only. Holds older consensuses, and diffs from older - consensuses to the most recent consensus of each type, compressed - in various ways. Each file contains a set of key-value arguments - decribing its contents, followed by a single NUL byte, followed by the - main file contents. - -__DataDirectory__**/bw_accounting**:: - Used to track bandwidth accounting values (when the current period starts - and ends; how much has been read and written so far this period). This file - is obsolete, and the data is now stored in the \'state' file instead. - -__DataDirectory__**/control_auth_cookie**:: - Used for cookie authentication with the controller. Location can be - overridden by the CookieAuthFile config option. Regenerated on startup. See - control-spec.txt in https://spec.torproject.org/[torspec] for details. - Only used when cookie authentication is enabled. - -__DataDirectory__**/lock**:: - This file is used to prevent two Tor instances from using same data - directory. If access to this file is locked, data directory is already - in use by Tor. - -__DataDirectory__**/key-pinning-journal**:: - Used by authorities. A line-based file that records mappings between - RSA1024 identity keys and Ed25519 identity keys. Authorities enforce - these mappings, so that once a relay has picked an Ed25519 key, stealing - or factoring the RSA1024 key will no longer let an attacker impersonate - the relay. - -__KeyDirectory__**/authority_identity_key**:: - A v3 directory authority's master identity key, used to authenticate its - signing key. Tor doesn't use this while it's running. The tor-gencert - program uses this. If you're running an authority, you should keep this - key offline, and not actually put it here. - -__KeyDirectory__**/authority_certificate**:: - A v3 directory authority's certificate, which authenticates the authority's - current vote- and consensus-signing key using its master identity key. - Only directory authorities use this file. - -__KeyDirectory__**/authority_signing_key**:: - A v3 directory authority's signing key, used to sign votes and consensuses. - Only directory authorities use this file. Corresponds to the - **authority_certificate** cert. - -__KeyDirectory__**/legacy_certificate**:: - As authority_certificate: used only when V3AuthUseLegacyKey is set. - See documentation for V3AuthUseLegacyKey. - -__KeyDirectory__**/legacy_signing_key**:: - As authority_signing_key: used only when V3AuthUseLegacyKey is set. - See documentation for V3AuthUseLegacyKey. - -__KeyDirectory__**/secret_id_key**:: - A relay's RSA1024 permanent identity key, including private and public - components. Used to sign router descriptors, and to sign other keys. - -__KeyDirectory__**/ed25519_master_id_public_key**:: - The public part of a relay's Ed25519 permanent identity key. - -__KeyDirectory__**/ed25519_master_id_secret_key**:: - The private part of a relay's Ed25519 permanent identity key. This key - is used to sign the medium-term ed25519 signing key. This file can be - kept offline, or kept encrypted. If so, Tor will not be able to generate - new signing keys itself; you'll need to use tor --keygen yourself to do - so. - -__KeyDirectory__**/ed25519_signing_secret_key**:: - The private and public components of a relay's medium-term Ed25519 signing - key. This key is authenticated by the Ed25519 master key, in turn - authenticates other keys (and router descriptors). - -__KeyDirectory__**/ed25519_signing_cert**:: - The certificate which authenticates "ed25519_signing_secret_key" as - having been signed by the Ed25519 master key. - -__KeyDirectory__**/secret_onion_key** and **secret_onion_key.old**:: - A relay's RSA1024 short-term onion key. Used to decrypt old-style ("TAP") - circuit extension requests. The ".old" file holds the previously - generated key, which the relay uses to handle any requests that were - made by clients that didn't have the new one. - -__KeyDirectory__**/secret_onion_key_ntor** and **secret_onion_key_ntor.old**:: - A relay's Curve25519 short-term onion key. Used to handle modern ("ntor") - circuit extension requests. The ".old" file holds the previously - generated key, which the relay uses to handle any requests that were - made by clients that didn't have the new one. - -__DataDirectory__**/fingerprint**:: - Only used by servers. Holds the fingerprint of the server's identity key. - -__DataDirectory__**/hashed-fingerprint**:: - Only used by bridges. Holds the hashed fingerprint of the bridge's - identity key. (That is, the hash of the hash of the identity key.) - -__DataDirectory__**/approved-routers**:: - Only used by authoritative directory servers. This file lists - the status of routers by their identity fingerprint. - Each line lists a status and a fingerprint separated by - whitespace. See your **fingerprint** file in the __DataDirectory__ for an - example line. If the status is **!reject** then descriptors from the - given identity (fingerprint) are rejected by this server. If it is - **!invalid** then descriptors are accepted but marked in the directory as - not valid, that is, not recommended. - -__DataDirectory__**/v3-status-votes**:: - Only for v3 authoritative directory servers. This file contains - status votes from all the authoritative directory servers. - -__CacheDirectory__**/unverified-consensus**:: - This file contains a network consensus document that has been downloaded, - but which we didn't have the right certificates to check yet. - -__CacheDirectory__**/unverified-microdesc-consensus**:: - This file contains a microdescriptor-flavored network consensus document - that has been downloaded, but which we didn't have the right certificates - to check yet. - -__DataDirectory__**/unparseable-desc**:: - Onion server descriptors that Tor was unable to parse are dumped to this - file. Only used for debugging. - -__DataDirectory__**/router-stability**:: - Only used by authoritative directory servers. Tracks measurements for - router mean-time-between-failures so that authorities have a good idea of - how to set their Stable flags. - -__DataDirectory__**/stats/dirreq-stats**:: - Only used by directory caches and authorities. This file is used to - collect directory request statistics. - -__DataDirectory__**/stats/entry-stats**:: - Only used by servers. This file is used to collect incoming connection - statistics by Tor entry nodes. - -__DataDirectory__**/stats/bridge-stats**:: - Only used by servers. This file is used to collect incoming connection - statistics by Tor bridges. - -__DataDirectory__**/stats/exit-stats**:: - Only used by servers. This file is used to collect outgoing connection - statistics by Tor exit routers. - -__DataDirectory__**/stats/buffer-stats**:: - Only used by servers. This file is used to collect buffer usage - history. - -__DataDirectory__**/stats/conn-stats**:: - Only used by servers. This file is used to collect approximate connection - history (number of active connections over time). - -__DataDirectory__**/stats/hidserv-stats**:: - Only used by servers. This file is used to collect approximate counts - of what fraction of the traffic is hidden service rendezvous traffic, and - approximately how many hidden services the relay has seen. - -__DataDirectory__**/networkstatus-bridges**:: - Only used by authoritative bridge directories. Contains information - about bridges that have self-reported themselves to the bridge - authority. - -__DataDirectory__**/approved-routers**:: - Authorities only. This file is used to configure which relays are - known to be valid, invalid, and so forth. - -__HiddenServiceDirectory__**/hostname**:: - The .onion domain name for this hidden service. - If the hidden service is restricted to authorized clients only, this file - also contains authorization data for all clients. - + - Note that clients will ignore any extra subdomains prepended to a hidden - service hostname. So if you have "xyz.onion" as your hostname, you - can tell clients to connect to "www.xyz.onion" or "irc.xyz.onion" - for virtual-hosting purposes. - -__HiddenServiceDirectory__**/private_key**:: - The private key for this hidden service. - -__HiddenServiceDirectory__**/client_keys**:: - Authorization data for a hidden service that is only accessible by - authorized clients. - -__HiddenServiceDirectory__**/onion_service_non_anonymous**:: - This file is present if a hidden service key was created in - **HiddenServiceNonAnonymousMode**. - -SEE ALSO --------- -**torsocks**(1), **torify**(1) + - -**https://www.torproject.org/** - -**torspec: https://spec.torproject.org ** - -BUGS ----- - -Plenty, probably. Tor is still in development. Please report them at https://trac.torproject.org/. - -AUTHORS -------- -Roger Dingledine [arma at mit.edu], Nick Mathewson [nickm at alum.mit.edu]. diff --git a/src/tor/doc/torify.1.txt b/src/tor/doc/torify.1.txt deleted file mode 100644 index 7e49081cf..000000000 --- a/src/tor/doc/torify.1.txt +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) The Tor Project, Inc. -// See LICENSE for licensing information -// This is an asciidoc file used to generate the manpage/html reference. -// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html -:man source: Tor -:man manual: Tor Manual -torify(1) -========= - -NAME ----- -torify - wrapper for torsocks and tor - -SYNOPSIS --------- -**torify** __application__ [__application's__ __arguments__] - -DESCRIPTION ------------ -**torify** is a simple wrapper that calls torsocks with a tor-specific -configuration file. - -It is provided for backward compatibility; instead you should use torsocks. - -WARNING -------- -When used with torsocks, torify should not leak DNS requests or UDP data. - -torify can leak ICMP data. - -torify will not ensure that different requests are processed on -different circuits. - -SEE ALSO --------- -**tor**(1), **torsocks**(1) - -AUTHORS -------- -Peter Palfrader and Jacob Appelbaum wrote this manual. diff --git a/src/tor/doc/torrc_format.txt b/src/tor/doc/torrc_format.txt deleted file mode 100644 index 7a4a92a66..000000000 --- a/src/tor/doc/torrc_format.txt +++ /dev/null @@ -1,212 +0,0 @@ - -This document specifies the current format and semantics of the torrc -file, as of July 2015. Note that we make no guarantee about the -stability of this format. If you write something designed for strict -compatibility with this document, please expect us to break it sooner or -later. - -Yes, some of this is quite stupid. My goal here is to explain what it -does, not what it should do. - - - Nick - - - -1. File Syntax - - ; The syntax here is defined an Augmented Backus-Naur form, as - ; specified in RFC5234. - - ; A file is interpreted as every Entry in the file, in order. - TorrcFile = *Line [ UnterminatedLine ] - - Line = BlankLine LF / Entry LF - UnterminatedLine = BlankLine / Entry - - BlankLine = *WSP OptComment LF - BlankLine =/ *WSP LF - - OptComment = [ Comment ] - - Comment = "#" *NonLF - - ; Each Entry is interpreted as an optional "Magic" flag, a key, and a - ; value. - Entry = *WSP [ Magic ] Key 1*(1*WSP / "\" NL *WSP) Val LF - Entry =/ *WSP [ Magic ] Key *( *WSP / "\" NL *WSP) LF - - Magic = "+" / "/" - - ; Keys are always specified verbatim. They are case insensitive. It - ; is an error to specify a key that Tor does not recognize. - Key = 1*KC - - ; Sadly, every kind of value is decoded differently... - Val = QuotedVal / ContinuedVal / PlainVal - - ; The text of a PlainVal is the text of its PVBody portion, - ; plus the optional trailing backslash. - PlainVal = PVBody [ "\" ] *WSP OptComment - - ; Note that a PVBody is copied verbatim. Slashes are included - ; verbatim. No changes are made. Note that a body may be empty. - PVBody = * (VC / "\" NonLF ) - - ; The text of a ContinuedVal is the text of each of its PVBody - ; sub-elements, in order, concatenated. - ContinuedVal = CVal1 *CVal2 CVal3 - - CVal1 = PVBody "\" LF - CVal2 = PVBody ( "\" LF / Comment LF ) - CVal3 = PVBody - - ; The text of a QuotedVal is decoded as if it were a C string. - QuotedVal = DQ QVBody DQ *WSP Comment - - QVBody = QC - QVBody =/ "\" ( "n" / "r" / "t" / "\" / "'" / DQUOTE ) - QVBOdy =/ "\" ( "x" 2HEXDIG / 1*3OCTDIG ) - - ; Anything besides NUL and LF - NonLF = %x01-%x09 / %x0b - %xff - - ; Note that on windows, we open our configuration files in "text" mode, - ; which causes CRLF pairs to be interpreted as LF. So, on windows: - ; LF = [ %x0d ] %x0a - ; but everywhere else, - LF = %0x0a - - OCTDIG = '0' - '7' - - KC = Any character except an isspace() character or '#' or NUL - VC = Any character except '\\', '\n', '#', or NUL - QC = Any character except '\n', '\\', '\"', or NUL - -2. Mid-level Semantics - - - There are four configuration "domains", from lowest to highest priority: - - * Built-in defaults - * The "torrc_defaults" file, if any - * The "torrc" file, if any - * Arguments provided on the command line, if any. - - Normally, values from high-priority domains override low-priority - domains, but see 'magic' below. - - Configuration keys fall into three categories: singletons, lists, and - groups. - - A singleton key may appear at most once in any domain. Its - corresponding value is equal to its value in the highest-priority - domain in which it occurs. - - A list key may appear any number of times in a domain. By default, - its corresponding value is equal to all of the values specified for - it in the highest-priority domain in which it appears. (See 'magic' - below). - - A group key may appear any number of times in a domain. It is - associated with a number of other keys in the same group. The - relative positions of entries with the keys in a single group - matters, but entries with keys not in the group may be freely - interspersed. By default, the group has a value equal to all keys - and values it contains, from the highest-priority domain in which any - of its keys occurs. - - Magic: - - If the '/' flag is specified for an entry, it sets the value for - that entry to an empty list. (This will cause a higher-priority - domain to clear a list from a lower-priority domain, without - actually adding any entries.) - - If the '+' flag is specified for the first entry in a list or a - group that appears in a given domain, that list or group is - appended to the list or group from the next-lowest-priority - domain, rather than replacing it. - -3. High-level semantics - - There are further constraints on the values that each entry can take. - These constraints are out-of-scope for this document. - -4. Examples - - (Indentation is removed in this section, to avoid confusion.) - -4.1. Syntax examples - -# Here is a simple configuration entry. The key is "Foo"; the value is -# "Bar" - -Foo Bar - -# A configuration entry can have spaces in its value, as below. Here the -# key is "Foo" and the value is "Bar Baz" -Foo Bar Baz - -# This configuration entry has space at the end of the line, but those -# spaces don't count, so the key and value are still "Foo" and "Bar Baz" -Foo Bar Baz - -# There can be an escaped newline between the value and the key. This -# is another way to say key="Hello", value="World" -Hello\ -World - -# In regular entries of this kind, you can have a comment at the end of -# the line, either with a space before it or not. Each of these is a -# different spelling of key="Hello", value="World" - -Hello World #today -Hello World#tomorrow - -# One way to encode a complex entry is as a C string. This is the same -# as key="Hello", value="World!" -Hello "World!" - -# The string can contain the usual set of C escapes. This entry has -# key="Hello", and value="\"World\"\nand\nuniverse" -Hello "\"World\"\nand\nuniverse" - -# And now we get to the more-or-less awful part. -# -# Multi-line entries ending with a backslash on each line aren't so -# bad. The backslash is removed, and everything else is included -# verbatim. So this entry has key="Hello" and value="Worldandfriends" -Hello\ -World\ -and\ -friends - -# Backslashes in the middle of a line are included as-is. The key of -# this one is "Too" and the value is "Many\\Backsl\ashes \here" (with -# backslashes in that last string as-is) -Too \ -Many\\\ -Backsl\ashes \\ -here - -# And here's the really yucky part. If a comment appears in a multi-line -# entry, the entry is still able to continue on the next line, as in the -# following, where the key is "This" and the value is -# "entry and some are silly" -This entry \ - # has comments \ - and some \ - are # generally \ - silly - -# But you can also write that without the backslashes at the end of the -# comment lines. That is to say, this entry is exactly the same as the -# one above! -This entry \ - # has comments - and some \ - are # generally - silly - - - diff --git a/src/tor/entrynodes.c b/src/tor/entrynodes.c new file mode 100644 index 000000000..566896e6c --- /dev/null +++ b/src/tor/entrynodes.c @@ -0,0 +1,2334 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file entrynodes.c + * \brief Code to manage our fixed first nodes for various functions. + * + * Entry nodes can be guards (for general use) or bridges (for censorship + * circumvention). + **/ + +#include "or.h" +#include "circpathbias.h" +#include "circuitbuild.h" +#include "circuitstats.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "connection_or.h" +#include "control.h" +#include "directory.h" +#include "entrynodes.h" +#include "onion_main.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "policies.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" +#include "routerset.h" +#include "transports.h" +#include "statefile.h" + +/** Information about a configured bridge. Currently this just matches the + * ones in the torrc file, but one day we may be able to learn about new + * bridges on our own, and remember them in the state file. */ +typedef struct { + /** Address of the bridge. */ + tor_addr_t addr; + /** TLS port for the bridge. */ + uint16_t port; + /** Boolean: We are re-parsing our bridge list, and we are going to remove + * this one if we don't find it in the list of configured bridges. */ + unsigned marked_for_removal : 1; + /** Expected identity digest, or all zero bytes if we don't know what the + * digest should be. */ + char identity[DIGEST_LEN]; + + /** Name of pluggable transport protocol taken from its config line. */ + char *transport_name; + + /** When should we next try to fetch a descriptor for this bridge? */ + download_status_t fetch_status; + + /** A smartlist of k=v values to be passed to the SOCKS proxy, if + transports are used for this bridge. */ + smartlist_t *socks_args; +} bridge_info_t; + +/** A list of our chosen entry guards. */ +static smartlist_t *entry_guards = NULL; +/** A value of 1 means that the entry_guards list has changed + * and those changes need to be flushed to disk. */ +static int entry_guards_dirty = 0; + +static void bridge_free(bridge_info_t *bridge); +static const node_t *choose_random_entry_impl(cpath_build_state_t *state, + int for_directory, + dirinfo_type_t dirtype); + +/** Return the list of entry guards, creating it if necessary. */ +const smartlist_t * +get_entry_guards(void) +{ + if (! entry_guards) + entry_guards = smartlist_new(); + return entry_guards; +} + +/** Check whether the entry guard e is usable, given the directory + * authorities' opinion about the router (stored in ri) and the user's + * configuration (in options). Set e->bad_since + * accordingly. Return true iff the entry guard's status changes. + * + * If it's not usable, set *reason to a static string explaining why. + */ +static int +entry_guard_set_status(entry_guard_t *e, const node_t *node, + time_t now, const or_options_t *options, + const char **reason) +{ + char buf[HEX_DIGEST_LEN+1]; + int changed = 0; + + *reason = NULL; + + /* Do we want to mark this guard as bad? */ + if (!node) + *reason = "unlisted"; + else if (!node->is_running) + *reason = "down"; + else if (options->UseBridges && (!node->ri || + node->ri->purpose != ROUTER_PURPOSE_BRIDGE)) + *reason = "not a bridge"; + else if (options->UseBridges && !node_is_a_configured_bridge(node)) + *reason = "not a configured bridge"; + else if (!options->UseBridges && !node->is_possible_guard && + !routerset_contains_node(options->EntryNodes,node)) + *reason = "not recommended as a guard"; + else if (routerset_contains_node(options->ExcludeNodes, node)) + *reason = "excluded"; + else if (e->path_bias_disabled) + *reason = "path-biased"; + + if (*reason && ! e->bad_since) { + /* Router is newly bad. */ + base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); + log_info(LD_CIRC, "Entry guard %s (%s) is %s: marking as unusable.", + e->nickname, buf, *reason); + + e->bad_since = now; + control_event_guard(e->nickname, e->identity, "BAD"); + changed = 1; + } else if (!*reason && e->bad_since) { + /* There's nothing wrong with the router any more. */ + base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); + log_info(LD_CIRC, "Entry guard %s (%s) is no longer unusable: " + "marking as ok.", e->nickname, buf); + + e->bad_since = 0; + control_event_guard(e->nickname, e->identity, "GOOD"); + changed = 1; + } + + if (node) { + int is_dir = node_is_dir(node) && node->rs && + node->rs->version_supports_microdesc_cache; + if (options->UseBridges && node_is_a_configured_bridge(node)) + is_dir = 1; + if (e->is_dir_cache != is_dir) { + e->is_dir_cache = is_dir; + changed = 1; + } + } + + return changed; +} + +/** Return true iff enough time has passed since we last tried to connect + * to the unreachable guard e that we're willing to try again. */ +static int +entry_is_time_to_retry(entry_guard_t *e, time_t now) +{ + long diff; + if (e->last_attempted < e->unreachable_since) + return 1; + diff = now - e->unreachable_since; + if (diff < 6*60*60) + return now > (e->last_attempted + 60*60); + else if (diff < 3*24*60*60) + return now > (e->last_attempted + 4*60*60); + else if (diff < 7*24*60*60) + return now > (e->last_attempted + 18*60*60); + else + return now > (e->last_attempted + 36*60*60); +} + +/** Return the node corresponding to e, if e is + * working well enough that we are willing to use it as an entry + * right now. (Else return NULL.) In particular, it must be + * - Listed as either up or never yet contacted; + * - Present in the routerlist; + * - Listed as 'stable' or 'fast' by the current dirserver consensus, + * if demanded by need_uptime or need_capacity + * (unless it's a configured EntryNode); + * - Allowed by our current ReachableORAddresses config option; and + * - Currently thought to be reachable by us (unless assume_reachable + * is true). + * + * If the answer is no, set *msg to an explanation of why. + * + * If need_descriptor is true, only return the node if we currently have + * a descriptor (routerinfo or microdesc) for it. + */ +static INLINE const node_t * +entry_is_live(entry_guard_t *e, int need_uptime, int need_capacity, + int assume_reachable, int need_descriptor, const char **msg) +{ + const node_t *node; + const or_options_t *options = get_options(); + tor_assert(msg); + + if (e->path_bias_disabled) { + *msg = "path-biased"; + return NULL; + } + if (e->bad_since) { + *msg = "bad"; + return NULL; + } + /* no good if it's unreachable, unless assume_unreachable or can_retry. */ + if (!assume_reachable && !e->can_retry && + e->unreachable_since && !entry_is_time_to_retry(e, time(NULL))) { + *msg = "unreachable"; + return NULL; + } + node = node_get_by_id(e->identity); + if (!node) { + *msg = "no node info"; + return NULL; + } + if (need_descriptor && !node_has_descriptor(node)) { + *msg = "no descriptor"; + return NULL; + } + if (get_options()->UseBridges) { + if (node_get_purpose(node) != ROUTER_PURPOSE_BRIDGE) { + *msg = "not a bridge"; + return NULL; + } + if (!node_is_a_configured_bridge(node)) { + *msg = "not a configured bridge"; + return NULL; + } + } else { /* !get_options()->UseBridges */ + if (node_get_purpose(node) != ROUTER_PURPOSE_GENERAL) { + *msg = "not general-purpose"; + return NULL; + } + } + if (routerset_contains_node(options->EntryNodes, node)) { + /* they asked for it, they get it */ + need_uptime = need_capacity = 0; + } + if (node_is_unreliable(node, need_uptime, need_capacity, 0)) { + *msg = "not fast/stable"; + return NULL; + } + if (!fascist_firewall_allows_node(node)) { + *msg = "unreachable by config"; + return NULL; + } + return node; +} + +/** Return the number of entry guards that we think are usable. */ +int +num_live_entry_guards(int for_directory) +{ + int n = 0; + const char *msg; + if (! entry_guards) + return 0; + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { + if (for_directory && !entry->is_dir_cache) + continue; + if (entry_is_live(entry, 0, 1, 0, !for_directory, &msg)) + ++n; + } SMARTLIST_FOREACH_END(entry); + return n; +} + +/** If digest matches the identity of any node in the + * entry_guards list, return that node. Else return NULL. */ +entry_guard_t * +entry_guard_get_by_id_digest(const char *digest) +{ + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, + if (tor_memeq(digest, entry->identity, DIGEST_LEN)) + return entry; + ); + return NULL; +} + +/** Dump a description of our list of entry guards to the log at level + * severity. */ +static void +log_entry_guards(int severity) +{ + smartlist_t *elements = smartlist_new(); + char *s; + + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) + { + const char *msg = NULL; + if (entry_is_live(e, 0, 1, 0, 0, &msg)) + smartlist_add_asprintf(elements, "%s [%s] (up %s)", + e->nickname, + hex_str(e->identity, DIGEST_LEN), + e->made_contact ? "made-contact" : "never-contacted"); + else + smartlist_add_asprintf(elements, "%s [%s] (%s, %s)", + e->nickname, + hex_str(e->identity, DIGEST_LEN), + msg, + e->made_contact ? "made-contact" : "never-contacted"); + } + SMARTLIST_FOREACH_END(e); + + s = smartlist_join_strings(elements, ",", 0, NULL); + SMARTLIST_FOREACH(elements, char*, cp, tor_free(cp)); + smartlist_free(elements); + log_fn(severity,LD_CIRC,"%s",s); + tor_free(s); +} + +/** Called when one or more guards that we would previously have used for some + * purpose are no longer in use because a higher-priority guard has become + * usable again. */ +static void +control_event_guard_deferred(void) +{ + /* XXXX We don't actually have a good way to figure out _how many_ entries + * are live for some purpose. We need an entry_is_even_slightly_live() + * function for this to work right. NumEntryGuards isn't reliable: if we + * need guards with weird properties, we can have more than that number + * live. + **/ +#if 0 + int n = 0; + const char *msg; + const or_options_t *options = get_options(); + if (!entry_guards) + return; + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, + { + if (entry_is_live(entry, 0, 1, 0, &msg)) { + if (n++ == options->NumEntryGuards) { + control_event_guard(entry->nickname, entry->identity, "DEFERRED"); + return; + } + } + }); +#endif +} + +/** Largest amount that we'll backdate chosen_on_date */ +#define CHOSEN_ON_DATE_SLOP (30*86400) + +/** Add a new (preferably stable and fast) router to our + * entry_guards list. Return a pointer to the router if we succeed, + * or NULL if we can't find any more suitable entries. + * + * If chosen is defined, use that one, and if it's not + * already in our entry_guards list, put it at the *beginning*. + * Else, put the one we pick at the end of the list. */ +static const node_t * +add_an_entry_guard(const node_t *chosen, int reset_status, int prepend, + int for_discovery, int for_directory) +{ + const node_t *node; + entry_guard_t *entry; + + if (chosen) { + node = chosen; + entry = entry_guard_get_by_id_digest(node->identity); + if (entry) { + if (reset_status) { + entry->bad_since = 0; + entry->can_retry = 1; + } + entry->is_dir_cache = node->rs && + node->rs->version_supports_microdesc_cache; + if (get_options()->UseBridges && node_is_a_configured_bridge(node)) + entry->is_dir_cache = 1; + return NULL; + } + } else if (!for_directory) { + node = choose_good_entry_server(CIRCUIT_PURPOSE_C_GENERAL, NULL); + if (!node) + return NULL; + } else { + const routerstatus_t *rs; + rs = router_pick_directory_server(MICRODESC_DIRINFO|V3_DIRINFO, + PDS_PREFER_TUNNELED_DIR_CONNS_|PDS_FOR_GUARD); + if (!rs) + return NULL; + node = node_get_by_id(rs->identity_digest); + if (!node) + return NULL; + } + if (node->using_as_guard) + return NULL; + if (entry_guard_get_by_id_digest(node->identity) != NULL) { + log_info(LD_CIRC, "I was about to add a duplicate entry guard."); + /* This can happen if we choose a guard, then the node goes away, then + * comes back. */ + ((node_t*) node)->using_as_guard = 1; + return NULL; + } + entry = tor_malloc_zero(sizeof(entry_guard_t)); + log_info(LD_CIRC, "Chose %s as new entry guard.", + node_describe(node)); + strlcpy(entry->nickname, node_get_nickname(node), sizeof(entry->nickname)); + memcpy(entry->identity, node->identity, DIGEST_LEN); + entry->is_dir_cache = node_is_dir(node) && node->rs && + node->rs->version_supports_microdesc_cache; + if (get_options()->UseBridges && node_is_a_configured_bridge(node)) + entry->is_dir_cache = 1; + + /* Choose expiry time smudged over the past month. The goal here + * is to a) spread out when Tor clients rotate their guards, so they + * don't all select them on the same day, and b) avoid leaving a + * precise timestamp in the state file about when we first picked + * this guard. For details, see the Jan 2010 or-dev thread. */ + entry->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); + entry->chosen_by_version = tor_strdup(VERSION); + + /* Are we picking this guard because all of our current guards are + * down so we need another one (for_discovery is 1), or because we + * decided we need more variety in our guard list (for_discovery is 0)? + * + * Currently we hack this behavior into place by setting "made_contact" + * for guards of the latter variety, so we'll be willing to use any of + * them right off the bat. + */ + if (!for_discovery) + entry->made_contact = 1; + + ((node_t*)node)->using_as_guard = 1; + if (prepend) + smartlist_insert(entry_guards, 0, entry); + else + smartlist_add(entry_guards, entry); + control_event_guard(entry->nickname, entry->identity, "NEW"); + control_event_guard_deferred(); + log_entry_guards(LOG_INFO); + return node; +} + +/** Choose how many entry guards or directory guards we'll use. If + * for_directory is true, we return how many directory guards to + * use; else we return how many entry guards to use. */ +static int +decide_num_guards(const or_options_t *options, int for_directory) +{ + if (for_directory && options->NumDirectoryGuards != 0) + return options->NumDirectoryGuards; + return options->NumEntryGuards; +} + +/** If the use of entry guards is configured, choose more entry guards + * until we have enough in the list. */ +static void +pick_entry_guards(const or_options_t *options, int for_directory) +{ + int changed = 0; + const int num_needed = decide_num_guards(options, for_directory); + + tor_assert(entry_guards); + + while (num_live_entry_guards(for_directory) < num_needed) { + if (!add_an_entry_guard(NULL, 0, 0, 0, for_directory)) + break; + changed = 1; + } + if (changed) + entry_guards_changed(); +} + +/** How long (in seconds) do we allow an entry guard to be nonfunctional, + * unlisted, excluded, or otherwise nonusable before we give up on it? */ +#define ENTRY_GUARD_REMOVE_AFTER (30*24*60*60) + +/** Release all storage held by e. */ +static void +entry_guard_free(entry_guard_t *e) +{ + if (!e) + return; + tor_free(e->chosen_by_version); + tor_free(e); +} + +/** + * Return the minimum lifetime of working entry guard, in seconds, + * as given in the consensus networkstatus. (Plus CHOSEN_ON_DATE_SLOP, + * so that we can do the chosen_on_date randomization while achieving the + * desired minimum lifetime.) + */ +static int32_t +guards_get_lifetime(void) +{ + const or_options_t *options = get_options(); +#define DFLT_GUARD_LIFETIME (86400 * 60) /* Two months. */ +#define MIN_GUARD_LIFETIME (86400 * 30) /* One months. */ +#define MAX_GUARD_LIFETIME (86400 * 1826) /* Five years. */ + + if (options->GuardLifetime >= 1) { + return CLAMP(MIN_GUARD_LIFETIME, + options->GuardLifetime, + MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; + } + + return networkstatus_get_param(NULL, "GuardLifetime", + DFLT_GUARD_LIFETIME, + MIN_GUARD_LIFETIME, + MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; +} + +/** Remove any entry guard which was selected by an unknown version of Tor, + * or which was selected by a version of Tor that's known to select + * entry guards badly, or which was selected more 2 months ago. */ +/* XXXX The "obsolete guards" and "chosen long ago guards" things should + * probably be different functions. */ +static int +remove_obsolete_entry_guards(time_t now) +{ + int changed = 0, i; + int32_t guard_lifetime = guards_get_lifetime(); + + for (i = 0; i < smartlist_len(entry_guards); ++i) { + entry_guard_t *entry = smartlist_get(entry_guards, i); + const char *ver = entry->chosen_by_version; + const char *msg = NULL; + tor_version_t v; + int version_is_bad = 0, date_is_bad = 0; + if (!ver) { + msg = "does not say what version of Tor it was selected by"; + version_is_bad = 1; + } else if (tor_version_parse(ver, &v)) { + msg = "does not seem to be from any recognized version of Tor"; + version_is_bad = 1; + } else { + char *tor_ver = NULL; + tor_asprintf(&tor_ver, "Tor %s", ver); + if ((tor_version_as_new_as(tor_ver, "0.1.0.10-alpha") && + !tor_version_as_new_as(tor_ver, "0.1.2.16-dev")) || + (tor_version_as_new_as(tor_ver, "0.2.0.0-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.0.6-alpha")) || + /* above are bug 440; below are bug 1217 */ + (tor_version_as_new_as(tor_ver, "0.2.1.3-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.1.23")) || + (tor_version_as_new_as(tor_ver, "0.2.2.0-alpha") && + !tor_version_as_new_as(tor_ver, "0.2.2.7-alpha"))) { + msg = "was selected without regard for guard bandwidth"; + version_is_bad = 1; + } + tor_free(tor_ver); + } + if (!version_is_bad && entry->chosen_on_date + guard_lifetime < now) { + /* It's been too long since the date listed in our state file. */ + msg = "was selected several months ago"; + date_is_bad = 1; + } + + if (version_is_bad || date_is_bad) { /* we need to drop it */ + char dbuf[HEX_DIGEST_LEN+1]; + tor_assert(msg); + base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); + log_fn(version_is_bad ? LOG_NOTICE : LOG_INFO, LD_CIRC, + "Entry guard '%s' (%s) %s. (Version=%s.) Replacing it.", + entry->nickname, dbuf, msg, ver?escaped(ver):"none"); + control_event_guard(entry->nickname, entry->identity, "DROPPED"); + entry_guard_free(entry); + smartlist_del_keeporder(entry_guards, i--); + log_entry_guards(LOG_INFO); + changed = 1; + } + } + + return changed ? 1 : 0; +} + +/** Remove all entry guards that have been down or unlisted for so + * long that we don't think they'll come up again. Return 1 if we + * removed any, or 0 if we did nothing. */ +static int +remove_dead_entry_guards(time_t now) +{ + char dbuf[HEX_DIGEST_LEN+1]; + char tbuf[ISO_TIME_LEN+1]; + int i; + int changed = 0; + + for (i = 0; i < smartlist_len(entry_guards); ) { + entry_guard_t *entry = smartlist_get(entry_guards, i); + if (entry->bad_since && + ! entry->path_bias_disabled && + entry->bad_since + ENTRY_GUARD_REMOVE_AFTER < now) { + + base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); + format_local_iso_time(tbuf, entry->bad_since); + log_info(LD_CIRC, "Entry guard '%s' (%s) has been down or unlisted " + "since %s local time; removing.", + entry->nickname, dbuf, tbuf); + control_event_guard(entry->nickname, entry->identity, "DROPPED"); + entry_guard_free(entry); + smartlist_del_keeporder(entry_guards, i); + log_entry_guards(LOG_INFO); + changed = 1; + } else + ++i; + } + return changed ? 1 : 0; +} + +/** Remove all currently listed entry guards. So new ones will be chosen. */ +void +remove_all_entry_guards(void) +{ + char dbuf[HEX_DIGEST_LEN+1]; + + while (smartlist_len(entry_guards)) { + entry_guard_t *entry = smartlist_get(entry_guards, 0); + base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); + log_info(LD_CIRC, "Entry guard '%s' (%s) has been dropped.", + entry->nickname, dbuf); + control_event_guard(entry->nickname, entry->identity, "DROPPED"); + entry_guard_free(entry); + smartlist_del(entry_guards, 0); + } + log_entry_guards(LOG_INFO); + entry_guards_changed(); +} + +/** A new directory or router-status has arrived; update the down/listed + * status of the entry guards. + * + * An entry is 'down' if the directory lists it as nonrunning. + * An entry is 'unlisted' if the directory doesn't include it. + * + * Don't call this on startup; only on a fresh download. Otherwise we'll + * think that things are unlisted. + */ +void +entry_guards_compute_status(const or_options_t *options, time_t now) +{ + int changed = 0; + digestmap_t *reasons; + + if (! entry_guards) + return; + + if (options->EntryNodes) /* reshuffle the entry guard list if needed */ + entry_nodes_should_be_added(); + + reasons = digestmap_new(); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) + { + const node_t *r = node_get_by_id(entry->identity); + const char *reason = NULL; + if (entry_guard_set_status(entry, r, now, options, &reason)) + changed = 1; + + if (entry->bad_since) + tor_assert(reason); + if (reason) + digestmap_set(reasons, entry->identity, (char*)reason); + } + SMARTLIST_FOREACH_END(entry); + + if (remove_dead_entry_guards(now)) + changed = 1; + if (remove_obsolete_entry_guards(now)) + changed = 1; + + if (changed) { + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { + const char *reason = digestmap_get(reasons, entry->identity); + const char *live_msg = ""; + const node_t *r = entry_is_live(entry, 0, 1, 0, 0, &live_msg); + log_info(LD_CIRC, "Summary: Entry %s [%s] is %s, %s%s%s, and %s%s.", + entry->nickname, + hex_str(entry->identity, DIGEST_LEN), + entry->unreachable_since ? "unreachable" : "reachable", + entry->bad_since ? "unusable" : "usable", + reason ? ", ": "", + reason ? reason : "", + r ? "live" : "not live / ", + r ? "" : live_msg); + } SMARTLIST_FOREACH_END(entry); + log_info(LD_CIRC, " (%d/%d entry guards are usable/new)", + num_live_entry_guards(0), smartlist_len(entry_guards)); + log_entry_guards(LOG_INFO); + entry_guards_changed(); + } + + digestmap_free(reasons, NULL); +} + +/** Called when a connection to an OR with the identity digest digest + * is established (succeeded==1) or has failed (succeeded==0). + * If the OR is an entry, change that entry's up/down status. + * Return 0 normally, or -1 if we want to tear down the new connection. + * + * If mark_relay_status, also call router_set_status() on this + * relay. + * + * XXX024 change succeeded and mark_relay_status into 'int flags'. + */ +int +entry_guard_register_connect_status(const char *digest, int succeeded, + int mark_relay_status, time_t now) +{ + int changed = 0; + int refuse_conn = 0; + int first_contact = 0; + entry_guard_t *entry = NULL; + int idx = -1; + char buf[HEX_DIGEST_LEN+1]; + + if (! entry_guards) + return 0; + + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + tor_assert(e); + if (tor_memeq(e->identity, digest, DIGEST_LEN)) { + entry = e; + idx = e_sl_idx; + break; + } + } SMARTLIST_FOREACH_END(e); + + if (!entry) + return 0; + + base16_encode(buf, sizeof(buf), entry->identity, DIGEST_LEN); + + if (succeeded) { + if (entry->unreachable_since) { + log_info(LD_CIRC, "Entry guard '%s' (%s) is now reachable again. Good.", + entry->nickname, buf); + entry->can_retry = 0; + entry->unreachable_since = 0; + entry->last_attempted = now; + control_event_guard(entry->nickname, entry->identity, "UP"); + changed = 1; + } + if (!entry->made_contact) { + entry->made_contact = 1; + first_contact = changed = 1; + } + } else { /* ! succeeded */ + if (!entry->made_contact) { + /* We've never connected to this one. */ + log_info(LD_CIRC, + "Connection to never-contacted entry guard '%s' (%s) failed. " + "Removing from the list. %d/%d entry guards usable/new.", + entry->nickname, buf, + num_live_entry_guards(0)-1, smartlist_len(entry_guards)-1); + control_event_guard(entry->nickname, entry->identity, "DROPPED"); + entry_guard_free(entry); + smartlist_del_keeporder(entry_guards, idx); + log_entry_guards(LOG_INFO); + changed = 1; + } else if (!entry->unreachable_since) { + log_info(LD_CIRC, "Unable to connect to entry guard '%s' (%s). " + "Marking as unreachable.", entry->nickname, buf); + entry->unreachable_since = entry->last_attempted = now; + control_event_guard(entry->nickname, entry->identity, "DOWN"); + changed = 1; + entry->can_retry = 0; /* We gave it an early chance; no good. */ + } else { + char tbuf[ISO_TIME_LEN+1]; + format_iso_time(tbuf, entry->unreachable_since); + log_debug(LD_CIRC, "Failed to connect to unreachable entry guard " + "'%s' (%s). It has been unreachable since %s.", + entry->nickname, buf, tbuf); + entry->last_attempted = now; + entry->can_retry = 0; /* We gave it an early chance; no good. */ + } + } + + /* if the caller asked us to, also update the is_running flags for this + * relay */ + if (mark_relay_status) + router_set_status(digest, succeeded); + + if (first_contact) { + /* We've just added a new long-term entry guard. Perhaps the network just + * came back? We should give our earlier entries another try too, + * and close this connection so we don't use it before we've given + * the others a shot. */ + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + if (e == entry) + break; + if (e->made_contact) { + const char *msg; + const node_t *r = entry_is_live(e, 0, 1, 1, 0, &msg); + if (r && e->unreachable_since) { + refuse_conn = 1; + e->can_retry = 1; + } + } + } SMARTLIST_FOREACH_END(e); + if (refuse_conn) { + log_info(LD_CIRC, + "Connected to new entry guard '%s' (%s). Marking earlier " + "entry guards up. %d/%d entry guards usable/new.", + entry->nickname, buf, + num_live_entry_guards(0), smartlist_len(entry_guards)); + log_entry_guards(LOG_INFO); + changed = 1; + } + } + + if (changed) + entry_guards_changed(); + return refuse_conn ? -1 : 0; +} + +/** When we try to choose an entry guard, should we parse and add + * config's EntryNodes first? */ +static int should_add_entry_nodes = 0; + +/** Called when the value of EntryNodes changes in our configuration. */ +void +entry_nodes_should_be_added(void) +{ + log_info(LD_CIRC, "EntryNodes config option set. Putting configured " + "relays at the front of the entry guard list."); + should_add_entry_nodes = 1; +} + +/** Update the using_as_guard fields of all the nodes. We do this after we + * remove entry guards from the list: This is the only function that clears + * the using_as_guard field. */ +static void +update_node_guard_status(void) +{ + smartlist_t *nodes = nodelist_get_list(); + SMARTLIST_FOREACH(nodes, node_t *, node, node->using_as_guard = 0); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { + node_t *node = node_get_mutable_by_id(entry->identity); + if (node) + node->using_as_guard = 1; + } SMARTLIST_FOREACH_END(entry); +} + +/** Adjust the entry guards list so that it only contains entries from + * EntryNodes, adding new entries from EntryNodes to the list as needed. */ +static void +entry_guards_set_from_config(const or_options_t *options) +{ + smartlist_t *entry_nodes, *worse_entry_nodes, *entry_fps; + smartlist_t *old_entry_guards_on_list, *old_entry_guards_not_on_list; + tor_assert(entry_guards); + + should_add_entry_nodes = 0; + + if (!options->EntryNodes) { + /* It's possible that a controller set EntryNodes, thus making + * should_add_entry_nodes set, then cleared it again, all before the + * call to choose_random_entry() that triggered us. If so, just return. + */ + return; + } + + { + char *string = routerset_to_string(options->EntryNodes); + log_info(LD_CIRC,"Adding configured EntryNodes '%s'.", string); + tor_free(string); + } + + entry_nodes = smartlist_new(); + worse_entry_nodes = smartlist_new(); + entry_fps = smartlist_new(); + old_entry_guards_on_list = smartlist_new(); + old_entry_guards_not_on_list = smartlist_new(); + + /* Split entry guards into those on the list and those not. */ + + routerset_get_all_nodes(entry_nodes, options->EntryNodes, + options->ExcludeNodes, 0); + SMARTLIST_FOREACH(entry_nodes, const node_t *,node, + smartlist_add(entry_fps, (void*)node->identity)); + + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, { + if (smartlist_contains_digest(entry_fps, e->identity)) + smartlist_add(old_entry_guards_on_list, e); + else + smartlist_add(old_entry_guards_not_on_list, e); + }); + + /* Remove all currently configured guard nodes, excluded nodes, unreachable + * nodes, or non-Guard nodes from entry_nodes. */ + SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { + if (entry_guard_get_by_id_digest(node->identity)) { + SMARTLIST_DEL_CURRENT(entry_nodes, node); + continue; + } else if (routerset_contains_node(options->ExcludeNodes, node)) { + SMARTLIST_DEL_CURRENT(entry_nodes, node); + continue; + } else if (!fascist_firewall_allows_node(node)) { + SMARTLIST_DEL_CURRENT(entry_nodes, node); + continue; + } else if (! node->is_possible_guard) { + smartlist_add(worse_entry_nodes, (node_t*)node); + SMARTLIST_DEL_CURRENT(entry_nodes, node); + } + } SMARTLIST_FOREACH_END(node); + + /* Now build the new entry_guards list. */ + smartlist_clear(entry_guards); + /* First, the previously configured guards that are in EntryNodes. */ + smartlist_add_all(entry_guards, old_entry_guards_on_list); + /* Next, scramble the rest of EntryNodes, putting the guards first. */ + smartlist_shuffle(entry_nodes); + smartlist_shuffle(worse_entry_nodes); + smartlist_add_all(entry_nodes, worse_entry_nodes); + + /* Next, the rest of EntryNodes */ + SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { + add_an_entry_guard(node, 0, 0, 1, 0); + if (smartlist_len(entry_guards) > options->NumEntryGuards * 10) + break; + } SMARTLIST_FOREACH_END(node); + log_notice(LD_GENERAL, "%d entries in guards", smartlist_len(entry_guards)); + /* Finally, free the remaining previously configured guards that are not in + * EntryNodes. */ + SMARTLIST_FOREACH(old_entry_guards_not_on_list, entry_guard_t *, e, + entry_guard_free(e)); + + update_node_guard_status(); + + smartlist_free(entry_nodes); + smartlist_free(worse_entry_nodes); + smartlist_free(entry_fps); + smartlist_free(old_entry_guards_on_list); + smartlist_free(old_entry_guards_not_on_list); + entry_guards_changed(); +} + +/** Return 0 if we're fine adding arbitrary routers out of the + * directory to our entry guard list, or return 1 if we have a + * list already and we must stick to it. + */ +int +entry_list_is_constrained(const or_options_t *options) +{ + if (options->EntryNodes) + return 1; + if (options->UseBridges) + return 1; + return 0; +} + +/** Return true iff this node can answer directory questions about + * microdescriptors. */ +static int +node_understands_microdescriptors(const node_t *node) +{ + tor_assert(node); + if (node->rs && node->rs->version_supports_microdesc_cache) + return 1; + if (node->ri && tor_version_supports_microdescriptors(node->ri->platform)) + return 1; + return 0; +} + +/** Return true iff node is able to answer directory questions + * of type dirinfo. */ +static int +node_can_handle_dirinfo(const node_t *node, dirinfo_type_t dirinfo) +{ + /* Checking dirinfo for any type other than microdescriptors isn't required + yet, since we only choose directory guards that can support microdescs, + routerinfos, and networkstatuses, AND we don't use directory guards if + we're configured to do direct downloads of anything else. The only case + where we might have a guard that doesn't know about a type of directory + information is when we're retrieving directory information from a + bridge. */ + + if ((dirinfo & MICRODESC_DIRINFO) && + !node_understands_microdescriptors(node)) + return 0; + return 1; +} + +/** Pick a live (up and listed) entry guard from entry_guards. If + * state is non-NULL, this is for a specific circuit -- + * make sure not to pick this circuit's exit or any node in the + * exit's family. If state is NULL, we're looking for a random + * guard (likely a bridge). If dirinfo is not NO_DIRINFO, then + * only select from nodes that know how to answer directory questions + * of that type. */ +const node_t * +choose_random_entry(cpath_build_state_t *state) +{ + return choose_random_entry_impl(state, 0, 0); +} + +/** Pick a live (up and listed) directory guard from entry_guards for + * downloading information of type type. */ +const node_t * +choose_random_dirguard(dirinfo_type_t type) +{ + return choose_random_entry_impl(NULL, 1, type); +} + +/** Helper for choose_random{entry,dirguard}. */ +static const node_t * +choose_random_entry_impl(cpath_build_state_t *state, int for_directory, + dirinfo_type_t dirinfo_type) +{ + const or_options_t *options = get_options(); + smartlist_t *live_entry_guards = smartlist_new(); + smartlist_t *exit_family = smartlist_new(); + const node_t *chosen_exit = + state?build_state_get_exit_node(state) : NULL; + const node_t *node = NULL; + int need_uptime = state ? state->need_uptime : 0; + int need_capacity = state ? state->need_capacity : 0; + int preferred_min, consider_exit_family = 0; + int need_descriptor = !for_directory; + const int num_needed = decide_num_guards(options, for_directory); + + if (chosen_exit) { + nodelist_add_node_and_family(exit_family, chosen_exit); + consider_exit_family = 1; + } + + if (!entry_guards) + entry_guards = smartlist_new(); + + if (should_add_entry_nodes) + entry_guards_set_from_config(options); + + if (!entry_list_is_constrained(options) && + smartlist_len(entry_guards) < num_needed) + pick_entry_guards(options, for_directory); + + retry: + smartlist_clear(live_entry_guards); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { + const char *msg; + node = entry_is_live(entry, need_uptime, need_capacity, 0, + need_descriptor, &msg); + if (!node) + continue; /* down, no point */ + if (for_directory) { + if (!entry->is_dir_cache) + continue; /* We need a directory and didn't get one. */ + } + if (node == chosen_exit) + continue; /* don't pick the same node for entry and exit */ + if (consider_exit_family && smartlist_contains(exit_family, node)) + continue; /* avoid relays that are family members of our exit */ + if (dirinfo_type != NO_DIRINFO && + !node_can_handle_dirinfo(node, dirinfo_type)) + continue; /* this node won't be able to answer our dir questions */ +#if 0 /* since EntryNodes is always strict now, this clause is moot */ + if (options->EntryNodes && + !routerset_contains_node(options->EntryNodes, node)) { + /* We've come to the end of our preferred entry nodes. */ + if (smartlist_len(live_entry_guards)) + goto choose_and_finish; /* only choose from the ones we like */ + if (options->StrictNodes) { + /* in theory this case should never happen, since + * entry_guards_set_from_config() drops unwanted relays */ + tor_fragile_assert(); + } else { + log_info(LD_CIRC, + "No relays from EntryNodes available. Using others."); + } + } +#endif + smartlist_add(live_entry_guards, (void*)node); + if (!entry->made_contact) { + /* Always start with the first not-yet-contacted entry + * guard. Otherwise we might add several new ones, pick + * the second new one, and now we've expanded our entry + * guard list without needing to. */ + goto choose_and_finish; + } + if (smartlist_len(live_entry_guards) >= num_needed) + goto choose_and_finish; /* we have enough */ + } SMARTLIST_FOREACH_END(entry); + + if (entry_list_is_constrained(options)) { + /* If we prefer the entry nodes we've got, and we have at least + * one choice, that's great. Use it. */ + preferred_min = 1; + } else { + /* Try to have at least 2 choices available. This way we don't + * get stuck with a single live-but-crummy entry and just keep + * using him. + * (We might get 2 live-but-crummy entry guards, but so be it.) */ + preferred_min = 2; + } + + if (smartlist_len(live_entry_guards) < preferred_min) { + if (!entry_list_is_constrained(options)) { + /* still no? try adding a new entry then */ + /* XXX if guard doesn't imply fast and stable, then we need + * to tell add_an_entry_guard below what we want, or it might + * be a long time til we get it. -RD */ + node = add_an_entry_guard(NULL, 0, 0, 1, for_directory); + if (node) { + entry_guards_changed(); + /* XXX we start over here in case the new node we added shares + * a family with our exit node. There's a chance that we'll just + * load up on entry guards here, if the network we're using is + * one big family. Perhaps we should teach add_an_entry_guard() + * to understand nodes-to-avoid-if-possible? -RD */ + goto retry; + } + } + if (!node && need_uptime) { + need_uptime = 0; /* try without that requirement */ + goto retry; + } + if (!node && need_capacity) { + /* still no? last attempt, try without requiring capacity */ + need_capacity = 0; + goto retry; + } +#if 0 + /* Removing this retry logic: if we only allow one exit, and it is in the + same family as all our entries, then we are just plain not going to win + here. */ + if (!node && entry_list_is_constrained(options) && consider_exit_family) { + /* still no? if we're using bridges or have strictentrynodes + * set, and our chosen exit is in the same family as all our + * bridges/entry guards, then be flexible about families. */ + consider_exit_family = 0; + goto retry; + } +#endif + /* live_entry_guards may be empty below. Oh well, we tried. */ + } + + choose_and_finish: + if (entry_list_is_constrained(options)) { + /* We need to weight by bandwidth, because our bridges or entryguards + * were not already selected proportional to their bandwidth. */ + node = node_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); + } else { + /* We choose uniformly at random here, because choose_good_entry_server() + * already weights its choices by bandwidth, so we don't want to + * *double*-weight our guard selection. */ + node = smartlist_choose(live_entry_guards); + } + smartlist_free(live_entry_guards); + smartlist_free(exit_family); + return node; +} + +/** Parse state and learn about the entry guards it describes. + * If set is true, and there are no errors, replace the global + * entry_list with what we find. + * On success, return 0. On failure, alloc into *msg a string + * describing the error, and return -1. + */ +int +entry_guards_parse_state(or_state_t *state, int set, char **msg) +{ + entry_guard_t *node = NULL; + smartlist_t *new_entry_guards = smartlist_new(); + config_line_t *line; + time_t now = time(NULL); + const char *state_version = state->TorVersion; + digestmap_t *added_by = digestmap_new(); + + *msg = NULL; + for (line = state->EntryGuards; line; line = line->next) { + if (!strcasecmp(line->key, "EntryGuard")) { + smartlist_t *args = smartlist_new(); + node = tor_malloc_zero(sizeof(entry_guard_t)); + /* all entry guards on disk have been contacted */ + node->made_contact = 1; + smartlist_add(new_entry_guards, node); + smartlist_split_string(args, line->value, " ", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + if (smartlist_len(args)<2) { + *msg = tor_strdup("Unable to parse entry nodes: " + "Too few arguments to EntryGuard"); + } else if (!is_legal_nickname(smartlist_get(args,0))) { + *msg = tor_strdup("Unable to parse entry nodes: " + "Bad nickname for EntryGuard"); + } else { + strlcpy(node->nickname, smartlist_get(args,0), MAX_NICKNAME_LEN+1); + if (base16_decode(node->identity, DIGEST_LEN, smartlist_get(args,1), + strlen(smartlist_get(args,1)))<0) { + *msg = tor_strdup("Unable to parse entry nodes: " + "Bad hex digest for EntryGuard"); + } + } + if (smartlist_len(args) >= 3) { + const char *is_cache = smartlist_get(args, 2); + if (!strcasecmp(is_cache, "DirCache")) { + node->is_dir_cache = 1; + } else if (!strcasecmp(is_cache, "NoDirCache")) { + node->is_dir_cache = 0; + } else { + log_warn(LD_CONFIG, "Bogus third argument to EntryGuard line: %s", + escaped(is_cache)); + } + } + SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); + smartlist_free(args); + if (*msg) + break; + } else if (!strcasecmp(line->key, "EntryGuardDownSince") || + !strcasecmp(line->key, "EntryGuardUnlistedSince")) { + time_t when; + time_t last_try = 0; + if (!node) { + *msg = tor_strdup("Unable to parse entry nodes: " + "EntryGuardDownSince/UnlistedSince without EntryGuard"); + break; + } + if (parse_iso_time(line->value, &when)<0) { + *msg = tor_strdup("Unable to parse entry nodes: " + "Bad time in EntryGuardDownSince/UnlistedSince"); + break; + } + if (when > now) { + /* It's a bad idea to believe info in the future: you can wind + * up with timeouts that aren't allowed to happen for years. */ + continue; + } + if (strlen(line->value) >= ISO_TIME_LEN+ISO_TIME_LEN+1) { + /* ignore failure */ + (void) parse_iso_time(line->value+ISO_TIME_LEN+1, &last_try); + } + if (!strcasecmp(line->key, "EntryGuardDownSince")) { + node->unreachable_since = when; + node->last_attempted = last_try; + } else { + node->bad_since = when; + } + } else if (!strcasecmp(line->key, "EntryGuardAddedBy")) { + char d[DIGEST_LEN]; + /* format is digest version date */ + if (strlen(line->value) < HEX_DIGEST_LEN+1+1+1+ISO_TIME_LEN) { + log_warn(LD_BUG, "EntryGuardAddedBy line is not long enough."); + continue; + } + if (base16_decode(d, sizeof(d), line->value, HEX_DIGEST_LEN)<0 || + line->value[HEX_DIGEST_LEN] != ' ') { + log_warn(LD_BUG, "EntryGuardAddedBy line %s does not begin with " + "hex digest", escaped(line->value)); + continue; + } + digestmap_set(added_by, d, tor_strdup(line->value+HEX_DIGEST_LEN+1)); + } else if (!strcasecmp(line->key, "EntryGuardPathUseBias")) { + const or_options_t *options = get_options(); + double use_cnt, success_cnt; + + if (!node) { + *msg = tor_strdup("Unable to parse entry nodes: " + "EntryGuardPathUseBias without EntryGuard"); + break; + } + + if (tor_sscanf(line->value, "%lf %lf", + &use_cnt, &success_cnt) != 2) { + log_info(LD_GENERAL, "Malformed path use bias line for node %s", + node->nickname); + continue; + } + + if (use_cnt < success_cnt) { + int severity = LOG_INFO; + /* If this state file was written by a Tor that would have + * already fixed it, then the overcounting bug is still there.. */ + if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { + severity = LOG_NOTICE; + } + log_fn(severity, LD_BUG, + "State file contains unexpectedly high usage success " + "counts %lf/%lf for Guard %s ($%s)", + success_cnt, use_cnt, + node->nickname, hex_str(node->identity, DIGEST_LEN)); + success_cnt = use_cnt; + } + + node->use_attempts = use_cnt; + node->use_successes = success_cnt; + + log_info(LD_GENERAL, "Read %f/%f path use bias for node %s", + node->use_successes, node->use_attempts, node->nickname); + + /* Note: We rely on the < comparison here to allow us to set a 0 + * rate and disable the feature entirely. If refactoring, don't + * change to <= */ + if (pathbias_get_use_success_count(node)/node->use_attempts + < pathbias_get_extreme_use_rate(options) && + pathbias_get_dropguards(options)) { + node->path_bias_disabled = 1; + log_info(LD_GENERAL, + "Path use bias is too high (%f/%f); disabling node %s", + node->circ_successes, node->circ_attempts, node->nickname); + } + } else if (!strcasecmp(line->key, "EntryGuardPathBias")) { + const or_options_t *options = get_options(); + double hop_cnt, success_cnt, timeouts, collapsed, successful_closed, + unusable; + + if (!node) { + *msg = tor_strdup("Unable to parse entry nodes: " + "EntryGuardPathBias without EntryGuard"); + break; + } + + /* First try 3 params, then 2. */ + /* In the long run: circuit_success ~= successful_circuit_close + + * collapsed_circuits + + * unusable_circuits */ + if (tor_sscanf(line->value, "%lf %lf %lf %lf %lf %lf", + &hop_cnt, &success_cnt, &successful_closed, + &collapsed, &unusable, &timeouts) != 6) { + int old_success, old_hops; + if (tor_sscanf(line->value, "%u %u", &old_success, &old_hops) != 2) { + continue; + } + log_info(LD_GENERAL, "Reading old-style EntryGuardPathBias %s", + escaped(line->value)); + + success_cnt = old_success; + successful_closed = old_success; + hop_cnt = old_hops; + timeouts = 0; + collapsed = 0; + unusable = 0; + } + + if (hop_cnt < success_cnt) { + int severity = LOG_INFO; + /* If this state file was written by a Tor that would have + * already fixed it, then the overcounting bug is still there.. */ + if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { + severity = LOG_NOTICE; + } + log_fn(severity, LD_BUG, + "State file contains unexpectedly high success counts " + "%lf/%lf for Guard %s ($%s)", + success_cnt, hop_cnt, + node->nickname, hex_str(node->identity, DIGEST_LEN)); + success_cnt = hop_cnt; + } + + node->circ_attempts = hop_cnt; + node->circ_successes = success_cnt; + + node->successful_circuits_closed = successful_closed; + node->timeouts = timeouts; + node->collapsed_circuits = collapsed; + node->unusable_circuits = unusable; + + log_info(LD_GENERAL, "Read %f/%f path bias for node %s", + node->circ_successes, node->circ_attempts, node->nickname); + /* Note: We rely on the < comparison here to allow us to set a 0 + * rate and disable the feature entirely. If refactoring, don't + * change to <= */ + if (pathbias_get_close_success_count(node)/node->circ_attempts + < pathbias_get_extreme_rate(options) && + pathbias_get_dropguards(options)) { + node->path_bias_disabled = 1; + log_info(LD_GENERAL, + "Path bias is too high (%f/%f); disabling node %s", + node->circ_successes, node->circ_attempts, node->nickname); + } + + } else { + log_warn(LD_BUG, "Unexpected key %s", line->key); + } + } + + SMARTLIST_FOREACH_BEGIN(new_entry_guards, entry_guard_t *, e) { + char *sp; + char *val = digestmap_get(added_by, e->identity); + if (val && (sp = strchr(val, ' '))) { + time_t when; + *sp++ = '\0'; + if (parse_iso_time(sp, &when)<0) { + log_warn(LD_BUG, "Can't read time %s in EntryGuardAddedBy", sp); + } else { + e->chosen_by_version = tor_strdup(val); + e->chosen_on_date = when; + } + } else { + if (state_version) { + e->chosen_by_version = tor_strdup(state_version); + e->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); + } + } + if (e->path_bias_disabled && !e->bad_since) + e->bad_since = time(NULL); + } + SMARTLIST_FOREACH_END(e); + + if (*msg || !set) { + SMARTLIST_FOREACH(new_entry_guards, entry_guard_t *, e, + entry_guard_free(e)); + smartlist_free(new_entry_guards); + } else { /* !err && set */ + if (entry_guards) { + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, + entry_guard_free(e)); + smartlist_free(entry_guards); + } + entry_guards = new_entry_guards; + entry_guards_dirty = 0; + /* XXX024 hand new_entry_guards to this func, and move it up a + * few lines, so we don't have to re-dirty it */ + if (remove_obsolete_entry_guards(now)) + entry_guards_dirty = 1; + + update_node_guard_status(); + } + digestmap_free(added_by, tor_free_); + return *msg ? -1 : 0; +} + +/** Our list of entry guards has changed, or some element of one + * of our entry guards has changed. Write the changes to disk within + * the next few minutes. + */ +void +entry_guards_changed(void) +{ + time_t when; + entry_guards_dirty = 1; + + /* or_state_save() will call entry_guards_update_state(). */ + when = get_options()->AvoidDiskWrites ? time(NULL) + 3600 : time(NULL)+600; + or_state_mark_dirty(get_or_state(), when); +} + +/** If the entry guard info has not changed, do nothing and return. + * Otherwise, free the EntryGuards piece of state and create + * a new one out of the global entry_guards list, and then mark + * state dirty so it will get saved to disk. + */ +void +entry_guards_update_state(or_state_t *state) +{ + config_line_t **next, *line; + if (! entry_guards_dirty) + return; + + config_free_lines(state->EntryGuards); + next = &state->EntryGuards; + *next = NULL; + if (!entry_guards) + entry_guards = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + char dbuf[HEX_DIGEST_LEN+1]; + if (!e->made_contact) + continue; /* don't write this one to disk */ + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuard"); + base16_encode(dbuf, sizeof(dbuf), e->identity, DIGEST_LEN); + tor_asprintf(&line->value, "%s %s %sDirCache", e->nickname, dbuf, + e->is_dir_cache ? "" : "No"); + next = &(line->next); + if (e->unreachable_since) { + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuardDownSince"); + line->value = tor_malloc(ISO_TIME_LEN+1+ISO_TIME_LEN+1); + format_iso_time(line->value, e->unreachable_since); + if (e->last_attempted) { + line->value[ISO_TIME_LEN] = ' '; + format_iso_time(line->value+ISO_TIME_LEN+1, e->last_attempted); + } + next = &(line->next); + } + if (e->bad_since) { + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuardUnlistedSince"); + line->value = tor_malloc(ISO_TIME_LEN+1); + format_iso_time(line->value, e->bad_since); + next = &(line->next); + } + if (e->chosen_on_date && e->chosen_by_version && + !strchr(e->chosen_by_version, ' ')) { + char d[HEX_DIGEST_LEN+1]; + char t[ISO_TIME_LEN+1]; + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuardAddedBy"); + base16_encode(d, sizeof(d), e->identity, DIGEST_LEN); + format_iso_time(t, e->chosen_on_date); + tor_asprintf(&line->value, "%s %s %s", + d, e->chosen_by_version, t); + next = &(line->next); + } + if (e->circ_attempts > 0) { + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuardPathBias"); + /* In the long run: circuit_success ~= successful_circuit_close + + * collapsed_circuits + + * unusable_circuits */ + tor_asprintf(&line->value, "%f %f %f %f %f %f", + e->circ_attempts, e->circ_successes, + pathbias_get_close_success_count(e), + e->collapsed_circuits, + e->unusable_circuits, e->timeouts); + next = &(line->next); + } + if (e->use_attempts > 0) { + *next = line = tor_malloc_zero(sizeof(config_line_t)); + line->key = tor_strdup("EntryGuardPathUseBias"); + + tor_asprintf(&line->value, "%f %f", + e->use_attempts, + pathbias_get_use_success_count(e)); + next = &(line->next); + } + + } SMARTLIST_FOREACH_END(e); + if (!get_options()->AvoidDiskWrites) + or_state_mark_dirty(get_or_state(), 0); + entry_guards_dirty = 0; +} + +/** If question is the string "entry-guards", then dump + * to *answer a newly allocated string describing all of + * the nodes in the global entry_guards list. See control-spec.txt + * for details. + * For backward compatibility, we also handle the string "helper-nodes". + * */ +int +getinfo_helper_entry_guards(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg) +{ + (void) conn; + (void) errmsg; + + if (!strcmp(question,"entry-guards") || + !strcmp(question,"helper-nodes")) { + smartlist_t *sl = smartlist_new(); + char tbuf[ISO_TIME_LEN+1]; + char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; + if (!entry_guards) + entry_guards = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + const char *status = NULL; + time_t when = 0; + const node_t *node; + + if (!e->made_contact) { + status = "never-connected"; + } else if (e->bad_since) { + when = e->bad_since; + status = "unusable"; + } else { + status = "up"; + } + + node = node_get_by_id(e->identity); + if (node) { + node_get_verbose_nickname(node, nbuf); + } else { + nbuf[0] = '$'; + base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); + /* e->nickname field is not very reliable if we don't know about + * this router any longer; don't include it. */ + } + + if (when) { + format_iso_time(tbuf, when); + smartlist_add_asprintf(sl, "%s %s %s\n", nbuf, status, tbuf); + } else { + smartlist_add_asprintf(sl, "%s %s\n", nbuf, status); + } + } SMARTLIST_FOREACH_END(e); + *answer = smartlist_join_strings(sl, "", 0, NULL); + SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); + smartlist_free(sl); + } + return 0; +} + +/** A list of configured bridges. Whenever we actually get a descriptor + * for one, we add it as an entry guard. Note that the order of bridges + * in this list does not necessarily correspond to the order of bridges + * in the torrc. */ +static smartlist_t *bridge_list = NULL; + +/** Mark every entry of the bridge list to be removed on our next call to + * sweep_bridge_list unless it has first been un-marked. */ +void +mark_bridge_list(void) +{ + if (!bridge_list) + bridge_list = smartlist_new(); + SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, + b->marked_for_removal = 1); +} + +/** Remove every entry of the bridge list that was marked with + * mark_bridge_list if it has not subsequently been un-marked. */ +void +sweep_bridge_list(void) +{ + if (!bridge_list) + bridge_list = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) { + if (b->marked_for_removal) { + SMARTLIST_DEL_CURRENT(bridge_list, b); + bridge_free(b); + } + } SMARTLIST_FOREACH_END(b); +} + +/** Initialize the bridge list to empty, creating it if needed. */ +static void +clear_bridge_list(void) +{ + if (!bridge_list) + bridge_list = smartlist_new(); + SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, bridge_free(b)); + smartlist_clear(bridge_list); +} + +/** Free the bridge bridge. */ +static void +bridge_free(bridge_info_t *bridge) +{ + if (!bridge) + return; + + tor_free(bridge->transport_name); + if (bridge->socks_args) { + SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s)); + smartlist_free(bridge->socks_args); + } + + tor_free(bridge); +} + +/** If we have a bridge configured whose digest matches digest, or a + * bridge with no known digest whose address matches any of the + * tor_addr_port_t's in orports, return that bridge. Else return + * NULL. */ +static bridge_info_t * +get_configured_bridge_by_orports_digest(const char *digest, + const smartlist_t *orports) +{ + if (!bridge_list) + return NULL; + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) + { + if (tor_digest_is_zero(bridge->identity)) { + SMARTLIST_FOREACH_BEGIN(orports, tor_addr_port_t *, ap) + { + if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 && + bridge->port == ap->port) + return bridge; + } + SMARTLIST_FOREACH_END(ap); + } + if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) + return bridge; + } + SMARTLIST_FOREACH_END(bridge); + return NULL; +} + +/** If we have a bridge configured whose digest matches digest, or a + * bridge with no known digest whose address matches addr:/port, + * return that bridge. Else return NULL. If digest is NULL, check for + * address/port matches only. */ +static bridge_info_t * +get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, + uint16_t port, + const char *digest) +{ + if (!bridge_list) + return NULL; + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) + { + if ((tor_digest_is_zero(bridge->identity) || digest == NULL) && + !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && + bridge->port == port) + return bridge; + if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) + return bridge; + } + SMARTLIST_FOREACH_END(bridge); + return NULL; +} + +/** Wrapper around get_configured_bridge_by_addr_port_digest() to look + * it up via router descriptor ri. */ +static bridge_info_t * +get_configured_bridge_by_routerinfo(const routerinfo_t *ri) +{ + bridge_info_t *bi = NULL; + smartlist_t *orports = router_get_all_orports(ri); + bi = get_configured_bridge_by_orports_digest(ri->cache_info.identity_digest, + orports); + SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); + smartlist_free(orports); + return bi; +} + +/** Return 1 if ri is one of our known bridges, else 0. */ +int +routerinfo_is_a_configured_bridge(const routerinfo_t *ri) +{ + return get_configured_bridge_by_routerinfo(ri) ? 1 : 0; +} + +/** Return 1 if node is one of our configured bridges, else 0. */ +int +node_is_a_configured_bridge(const node_t *node) +{ + int retval = 0; + smartlist_t *orports = node_get_all_orports(node); + retval = get_configured_bridge_by_orports_digest(node->identity, + orports) != NULL; + SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); + smartlist_free(orports); + return retval; +} + +/** We made a connection to a router at addr:port + * without knowing its digest. Its digest turned out to be digest. + * If it was a bridge, and we still don't know its digest, record it. + */ +void +learned_router_identity(const tor_addr_t *addr, uint16_t port, + const char *digest) +{ + bridge_info_t *bridge = + get_configured_bridge_by_addr_port_digest(addr, port, digest); + if (bridge && tor_digest_is_zero(bridge->identity)) { + char *transport_info = NULL; + const char *transport_name = + find_transport_name_by_bridge_addrport(addr, port); + if (transport_name) + tor_asprintf(&transport_info, " (with transport '%s')", transport_name); + + memcpy(bridge->identity, digest, DIGEST_LEN); + log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.", + hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port), + transport_info ? transport_info : ""); + tor_free(transport_info); + } +} + +/** Return true if bridge has the same identity digest as + * digest. If digest is NULL, it matches + * bridges with unspecified identity digests. */ +static int +bridge_has_digest(const bridge_info_t *bridge, const char *digest) +{ + if (digest) + return tor_memeq(digest, bridge->identity, DIGEST_LEN); + else + return tor_digest_is_zero(bridge->identity); +} + +/** We are about to add a new bridge at addr:port, with optional + * digest and transport_name. Mark for removal any previously + * existing bridge with the same address and port, and warn the user as + * appropriate. + */ +static void +bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port, + const char *digest, const char *transport_name) +{ + /* Iterate the already-registered bridge list: + + If you find a bridge with the same adress and port, mark it for + removal. It doesn't make sense to have two active bridges with + the same IP:PORT. If the bridge in question has a different + digest or transport than digest/transport_name, + it's probably a misconfiguration and we should warn the user. + */ + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { + if (bridge->marked_for_removal) + continue; + + if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) { + + bridge->marked_for_removal = 1; + + if (!bridge_has_digest(bridge, digest) || + strcmp_opt(bridge->transport_name, transport_name)) { + /* warn the user */ + char *bridge_description_new, *bridge_description_old; + tor_asprintf(&bridge_description_new, "%s:%s:%s", + fmt_addrport(addr, port), + digest ? hex_str(digest, DIGEST_LEN) : "", + transport_name ? transport_name : ""); + tor_asprintf(&bridge_description_old, "%s:%s:%s", + fmt_addrport(&bridge->addr, bridge->port), + tor_digest_is_zero(bridge->identity) ? + "" : hex_str(bridge->identity,DIGEST_LEN), + bridge->transport_name ? bridge->transport_name : ""); + + log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict" + " with the already registered bridge '%s'. We will discard" + " the old bridge and keep '%s'. If this is not what you" + " wanted, please change your configuration file accordingly.", + bridge_description_new, bridge_description_old, + bridge_description_new); + + tor_free(bridge_description_new); + tor_free(bridge_description_old); + } + } + } SMARTLIST_FOREACH_END(bridge); +} + +/** Return True if we have a bridge that uses a transport with name + * transport_name. */ +int +transport_is_needed(const char *transport_name) +{ + if (!bridge_list) + return 0; + + SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { + if (bridge->transport_name && + !strcmp(bridge->transport_name, transport_name)) + return 1; + } SMARTLIST_FOREACH_END(bridge); + + return 0; +} + +/** Register the bridge information in bridge_line to the + * bridge subsystem. Steals reference of bridge_line. */ +void +bridge_add_from_config(bridge_line_t *bridge_line) +{ + bridge_info_t *b; + + { /* Log the bridge we are about to register: */ + log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)", + fmt_addrport(&bridge_line->addr, bridge_line->port), + bridge_line->transport_name ? + bridge_line->transport_name : "no transport", + tor_digest_is_zero(bridge_line->digest) ? + "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN)); + + if (bridge_line->socks_args) { /* print socks arguments */ + int i = 0; + + tor_assert(smartlist_len(bridge_line->socks_args) > 0); + + log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:", + smartlist_len(bridge_line->socks_args)); + SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg, + log_debug(LD_CONFIG, "%d: %s", ++i, arg)); + } + } + + bridge_resolve_conflicts(&bridge_line->addr, + bridge_line->port, + bridge_line->digest, + bridge_line->transport_name); + + b = tor_malloc_zero(sizeof(bridge_info_t)); + tor_addr_copy(&b->addr, &bridge_line->addr); + b->port = bridge_line->port; + memcpy(b->identity, bridge_line->digest, DIGEST_LEN); + if (bridge_line->transport_name) + b->transport_name = bridge_line->transport_name; + b->fetch_status.schedule = DL_SCHED_BRIDGE; + b->socks_args = bridge_line->socks_args; + if (!bridge_list) + bridge_list = smartlist_new(); + + tor_free(bridge_line); /* Deallocate bridge_line now. */ + + smartlist_add(bridge_list, b); +} + +/** Return true iff routerset contains the bridge bridge. */ +static int +routerset_contains_bridge(const routerset_t *routerset, + const bridge_info_t *bridge) +{ + int result; + extend_info_t *extinfo; + tor_assert(bridge); + if (!routerset) + return 0; + + extinfo = extend_info_new( + NULL, bridge->identity, NULL, NULL, &bridge->addr, bridge->port); + result = routerset_contains_extendinfo(routerset, extinfo); + extend_info_free(extinfo); + return result; +} + +/** If digest is one of our known bridges, return it. */ +static bridge_info_t * +find_bridge_by_digest(const char *digest) +{ + SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, + { + if (tor_memeq(bridge->identity, digest, DIGEST_LEN)) + return bridge; + }); + return NULL; +} + +/** Given the addr and port of a bridge, if that bridge + * supports a pluggable transport, return its name. Otherwise, return + * NULL. */ +const char * +find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) +{ + if (!bridge_list) + return NULL; + + SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { + if (tor_addr_eq(&bridge->addr, addr) && + (bridge->port == port)) + return bridge->transport_name; + } SMARTLIST_FOREACH_END(bridge); + + return NULL; +} + +/** If addr and port match the address and port of a + * bridge of ours that uses pluggable transports, place its transport + * in transport. + * + * Return 0 on success (found a transport, or found a bridge with no + * transport, or found no bridge); return -1 if we should be using a + * transport, but the transport could not be found. + */ +int +get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, + const transport_t **transport) +{ + *transport = NULL; + if (!bridge_list) + return 0; + + SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { + if (tor_addr_eq(&bridge->addr, addr) && + (bridge->port == port)) { /* bridge matched */ + if (bridge->transport_name) { /* it also uses pluggable transports */ + *transport = transport_get_by_name(bridge->transport_name); + if (*transport == NULL) { /* it uses pluggable transports, but + the transport could not be found! */ + return -1; + } + return 0; + } else { /* bridge matched, but it doesn't use transports. */ + break; + } + } + } SMARTLIST_FOREACH_END(bridge); + + *transport = NULL; + return 0; +} + +/** Return a smartlist containing all the SOCKS arguments that we + * should pass to the SOCKS proxy. */ +const smartlist_t * +get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) +{ + bridge_info_t *bridge = get_configured_bridge_by_addr_port_digest(addr, + port, + NULL); + return bridge ? bridge->socks_args : NULL; +} + +/** We need to ask bridge for its server descriptor. */ +static void +launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) +{ + char *address; + const or_options_t *options = get_options(); + + if (connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &bridge->addr, bridge->port, + DIR_PURPOSE_FETCH_SERVERDESC)) + return; /* it's already on the way */ + + if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { + download_status_mark_impossible(&bridge->fetch_status); + log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", + safe_str_client(fmt_and_decorate_addr(&bridge->addr))); + return; + } + + address = tor_dup_addr(&bridge->addr); + + directory_initiate_command(address, &bridge->addr, + bridge->port, 0/*no dirport*/, + bridge->identity, + DIR_PURPOSE_FETCH_SERVERDESC, + ROUTER_PURPOSE_BRIDGE, + DIRIND_ONEHOP, "authority.z", NULL, 0, 0); + tor_free(address); +} + +/** Fetching the bridge descriptor from the bridge authority returned a + * "not found". Fall back to trying a direct fetch. */ +void +retry_bridge_descriptor_fetch_directly(const char *digest) +{ + bridge_info_t *bridge = find_bridge_by_digest(digest); + if (!bridge) + return; /* not found? oh well. */ + + launch_direct_bridge_descriptor_fetch(bridge); +} + +/** For each bridge in our list for which we don't currently have a + * descriptor, fetch a new copy of its descriptor -- either directly + * from the bridge or via a bridge authority. */ +void +fetch_bridge_descriptors(const or_options_t *options, time_t now) +{ + int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO); + int ask_bridge_directly; + int can_use_bridge_authority; + + if (!bridge_list) + return; + + /* If we still have unconfigured managed proxies, don't go and + connect to a bridge. */ + if (pt_proxies_configuration_pending()) + return; + + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) + { + if (!download_status_is_ready(&bridge->fetch_status, now, + IMPOSSIBLE_TO_DOWNLOAD)) + continue; /* don't bother, no need to retry yet */ + if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { + download_status_mark_impossible(&bridge->fetch_status); + log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", + safe_str_client(fmt_and_decorate_addr(&bridge->addr))); + continue; + } + + /* schedule another fetch as if this one will fail, in case it does */ + download_status_failed(&bridge->fetch_status, 0); + + can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) && + num_bridge_auths; + ask_bridge_directly = !can_use_bridge_authority || + !options->UpdateBridgesFromAuthority; + log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)", + ask_bridge_directly, tor_digest_is_zero(bridge->identity), + !options->UpdateBridgesFromAuthority, !num_bridge_auths); + + if (ask_bridge_directly && + !fascist_firewall_allows_address_or(&bridge->addr, bridge->port)) { + log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our " + "firewall policy. %s.", + fmt_addrport(&bridge->addr, bridge->port), + can_use_bridge_authority ? + "Asking bridge authority instead" : "Skipping"); + if (can_use_bridge_authority) + ask_bridge_directly = 0; + else + continue; + } + + if (ask_bridge_directly) { + /* we need to ask the bridge itself for its descriptor. */ + launch_direct_bridge_descriptor_fetch(bridge); + } else { + /* We have a digest and we want to ask an authority. We could + * combine all the requests into one, but that may give more + * hints to the bridge authority than we want to give. */ + char resource[10 + HEX_DIGEST_LEN]; + memcpy(resource, "fp/", 3); + base16_encode(resource+3, HEX_DIGEST_LEN+1, + bridge->identity, DIGEST_LEN); + memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3); + log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.", + resource); + directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, + ROUTER_PURPOSE_BRIDGE, resource, 0); + } + } + SMARTLIST_FOREACH_END(bridge); +} + +/** If our bridge is configured to be a different address than + * the bridge gives in node, rewrite the routerinfo + * we received to use the address we meant to use. Now we handle + * multihomed bridges better. + */ +static void +rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node) +{ + /* XXXX move this function. */ + /* XXXX overridden addresses should really live in the node_t, so that the + * routerinfo_t and the microdesc_t can be immutable. But we can only + * do that safely if we know that no function that connects to an OR + * does so through an address from any source other than node_get_addr(). + */ + tor_addr_t addr; + + if (node->ri) { + routerinfo_t *ri = node->ri; + tor_addr_from_ipv4h(&addr, ri->addr); + + if ((!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && + bridge->port == ri->or_port) || + (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) && + bridge->port == ri->ipv6_orport)) { + /* they match, so no need to do anything */ + } else { + if (tor_addr_family(&bridge->addr) == AF_INET) { + ri->addr = tor_addr_to_ipv4h(&bridge->addr); + tor_free(ri->address); + ri->address = tor_dup_ip(ri->addr); + ri->or_port = bridge->port; + log_info(LD_DIR, + "Adjusted bridge routerinfo for '%s' to match configured " + "address %s:%d.", + ri->nickname, ri->address, ri->or_port); + } else if (tor_addr_family(&bridge->addr) == AF_INET6) { + tor_addr_copy(&ri->ipv6_addr, &bridge->addr); + ri->ipv6_orport = bridge->port; + log_info(LD_DIR, + "Adjusted bridge routerinfo for '%s' to match configured " + "address %s.", + ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport)); + } else { + log_err(LD_BUG, "Address family not supported: %d.", + tor_addr_family(&bridge->addr)); + return; + } + } + + /* Mark which address to use based on which bridge_t we got. */ + node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 && + !tor_addr_is_null(&node->ri->ipv6_addr)); + + /* XXXipv6 we lack support for falling back to another address for + the same relay, warn the user */ + if (!tor_addr_is_null(&ri->ipv6_addr)) { + tor_addr_port_t ap; + node_get_pref_orport(node, &ap); + log_notice(LD_CONFIG, + "Bridge '%s' has both an IPv4 and an IPv6 address. " + "Will prefer using its %s address (%s).", + ri->nickname, + tor_addr_family(&ap.addr) == AF_INET6 ? "IPv6" : "IPv4", + fmt_addrport(&ap.addr, ap.port)); + } + } + if (node->rs) { + routerstatus_t *rs = node->rs; + tor_addr_from_ipv4h(&addr, rs->addr); + + if (!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && + bridge->port == rs->or_port) { + /* they match, so no need to do anything */ + } else { + rs->addr = tor_addr_to_ipv4h(&bridge->addr); + rs->or_port = bridge->port; + log_info(LD_DIR, + "Adjusted bridge routerstatus for '%s' to match " + "configured address %s.", + rs->nickname, fmt_addrport(&bridge->addr, rs->or_port)); + } + } +} + +/** We just learned a descriptor for a bridge. See if that + * digest is in our entry guard list, and add it if not. */ +void +learned_bridge_descriptor(routerinfo_t *ri, int from_cache) +{ + tor_assert(ri); + tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); + if (get_options()->UseBridges) { + int first = !any_bridge_descriptors_known(); + bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri); + time_t now = time(NULL); + router_set_status(ri->cache_info.identity_digest, 1); + + if (bridge) { /* if we actually want to use this one */ + node_t *node; + /* it's here; schedule its re-fetch for a long time from now. */ + if (!from_cache) + download_status_reset(&bridge->fetch_status); + + node = node_get_mutable_by_id(ri->cache_info.identity_digest); + tor_assert(node); + rewrite_node_address_for_bridge(bridge, node); + add_an_entry_guard(node, 1, 1, 0, 0); + + log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname, + from_cache ? "cached" : "fresh", router_describe(ri)); + /* set entry->made_contact so if it goes down we don't drop it from + * our entry node list */ + entry_guard_register_connect_status(ri->cache_info.identity_digest, + 1, 0, now); + if (first) + routerlist_retry_directory_downloads(now); + } + } +} + +/** Return 1 if any of our entry guards have descriptors that + * are marked with purpose 'bridge' and are running. Else return 0. + * + * We use this function to decide if we're ready to start building + * circuits through our bridges, or if we need to wait until the + * directory "server/authority" requests finish. */ +int +any_bridge_descriptors_known(void) +{ + tor_assert(get_options()->UseBridges); + return choose_random_entry(NULL) != NULL; +} + +/** Return 1 if there are any directory conns fetching bridge descriptors + * that aren't marked for close. We use this to guess if we should tell + * the controller that we have a problem. */ +int +any_pending_bridge_descriptor_fetches(void) +{ + smartlist_t *conns = get_connection_array(); + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { + if (conn->type == CONN_TYPE_DIR && + conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && + TO_DIR_CONN(conn)->router_purpose == ROUTER_PURPOSE_BRIDGE && + !conn->marked_for_close && + conn->linked && + conn->linked_conn && !conn->linked_conn->marked_for_close) { + log_debug(LD_DIR, "found one: %s", conn->address); + return 1; + } + } SMARTLIST_FOREACH_END(conn); + return 0; +} + +/** Return 1 if we have at least one descriptor for an entry guard + * (bridge or member of EntryNodes) and all descriptors we know are + * down. Else return 0. If act is 1, then mark the down guards + * up; else just observe and report. */ +static int +entries_retry_helper(const or_options_t *options, int act) +{ + const node_t *node; + int any_known = 0; + int any_running = 0; + int need_bridges = options->UseBridges != 0; + if (!entry_guards) + entry_guards = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + node = node_get_by_id(e->identity); + if (node && node_has_descriptor(node) && + node_is_bridge(node) == need_bridges) { + any_known = 1; + if (node->is_running) + any_running = 1; /* some entry is both known and running */ + else if (act) { + /* Mark all current connections to this OR as unhealthy, since + * otherwise there could be one that started 30 seconds + * ago, and in 30 seconds it will time out, causing us to mark + * the node down and undermine the retry attempt. We mark even + * the established conns, since if the network just came back + * we'll want to attach circuits to fresh conns. */ + connection_or_set_bad_connections(node->identity, 1); + + /* mark this entry node for retry */ + router_set_status(node->identity, 1); + e->can_retry = 1; + e->bad_since = 0; + } + } + } SMARTLIST_FOREACH_END(e); + log_debug(LD_DIR, "%d: any_known %d, any_running %d", + act, any_known, any_running); + return any_known && !any_running; +} + +/** Do we know any descriptors for our bridges / entrynodes, and are + * all the ones we have descriptors for down? */ +int +entries_known_but_down(const or_options_t *options) +{ + tor_assert(entry_list_is_constrained(options)); + return entries_retry_helper(options, 0); +} + +/** Mark all down known bridges / entrynodes up. */ +void +entries_retry_all(const or_options_t *options) +{ + tor_assert(entry_list_is_constrained(options)); + entries_retry_helper(options, 1); +} + +/** Return true if at least one of our bridges runs a Tor version that can + * provide microdescriptors to us. If not, we'll fall back to asking for + * full descriptors. */ +int +any_bridge_supports_microdescriptors(void) +{ + const node_t *node; + if (!get_options()->UseBridges || !entry_guards) + return 0; + SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { + node = node_get_by_id(e->identity); + if (node && node->is_running && + node_is_bridge(node) && node_is_a_configured_bridge(node) && + node_understands_microdescriptors(node)) { + /* This is one of our current bridges, and we know enough about + * it to know that it will be able to answer our microdescriptor + * questions. */ + return 1; + } + } SMARTLIST_FOREACH_END(e); + return 0; +} + +/** Release all storage held by the list of entry guards and related + * memory structs. */ +void +entry_guards_free_all(void) +{ + if (entry_guards) { + SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, + entry_guard_free(e)); + smartlist_free(entry_guards); + entry_guards = NULL; + } + clear_bridge_list(); + smartlist_free(bridge_list); + bridge_list = NULL; + circuit_build_times_free_timeouts(get_circuit_build_times_mutable()); +} + diff --git a/src/tor/entrynodes.h b/src/tor/entrynodes.h new file mode 100644 index 000000000..772c6662d --- /dev/null +++ b/src/tor/entrynodes.h @@ -0,0 +1,133 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file guardnodes.h + * \brief Header file for circuitbuild.c. + **/ + +#ifndef TOR_ENTRYNODES_H +#define TOR_ENTRYNODES_H + +#if 1 +/* XXXX NM I would prefer that all of this stuff be private to + * entrynodes.c. */ + +/** An entry_guard_t represents our information about a chosen long-term + * first hop, known as a "helper" node in the literature. We can't just + * use a node_t, since we want to remember these even when we + * don't have any directory info. */ +typedef struct entry_guard_t { + char nickname[MAX_NICKNAME_LEN+1]; + char identity[DIGEST_LEN]; + time_t chosen_on_date; /**< Approximately when was this guard added? + * "0" if we don't know. */ + char *chosen_by_version; /**< What tor version added this guard? NULL + * if we don't know. */ + unsigned int made_contact : 1; /**< 0 if we have never connected to this + * router, 1 if we have. */ + unsigned int can_retry : 1; /**< Should we retry connecting to this entry, + * in spite of having it marked as unreachable?*/ + unsigned int path_bias_noticed : 1; /**< Did we alert the user about path + * bias for this node already? */ + unsigned int path_bias_warned : 1; /**< Did we alert the user about path bias + * for this node already? */ + unsigned int path_bias_extreme : 1; /**< Did we alert the user about path + * bias for this node already? */ + unsigned int path_bias_disabled : 1; /**< Have we disabled this node because + * of path bias issues? */ + unsigned int path_bias_use_noticed : 1; /**< Did we alert the user about path + * use bias for this node already? */ + unsigned int path_bias_use_extreme : 1; /**< Did we alert the user about path + * use bias for this node already? */ + unsigned int is_dir_cache : 1; /**< Is this node a directory cache? */ + time_t bad_since; /**< 0 if this guard is currently usable, or the time at + * which it was observed to become (according to the + * directory or the user configuration) unusable. */ + time_t unreachable_since; /**< 0 if we can connect to this guard, or the + * time at which we first noticed we couldn't + * connect to it. */ + time_t last_attempted; /**< 0 if we can connect to this guard, or the time + * at which we last failed to connect to it. */ + + double circ_attempts; /**< Number of circuits this guard has "attempted" */ + double circ_successes; /**< Number of successfully built circuits using + * this guard as first hop. */ + double successful_circuits_closed; /**< Number of circuits that carried + * streams successfully. */ + double collapsed_circuits; /**< Number of fully built circuits that were + * remotely closed before any streams were + * attempted. */ + double unusable_circuits; /**< Number of circuits for which streams were + * attempted, but none succeeded. */ + double timeouts; /**< Number of 'right-censored' circuit timeouts for this + * guard. */ + double use_attempts; /**< Number of circuits we tried to use with streams */ + double use_successes; /**< Number of successfully used circuits using + * this guard as first hop. */ +} entry_guard_t; + +entry_guard_t *entry_guard_get_by_id_digest(const char *digest); +void entry_guards_changed(void); +const smartlist_t *get_entry_guards(void); +int num_live_entry_guards(int for_directory); + +#endif + +void remove_all_entry_guards(void); + +void entry_guards_compute_status(const or_options_t *options, time_t now); +int entry_guard_register_connect_status(const char *digest, int succeeded, + int mark_relay_status, time_t now); +void entry_nodes_should_be_added(void); +int entry_list_is_constrained(const or_options_t *options); +const node_t *choose_random_entry(cpath_build_state_t *state); +const node_t *choose_random_dirguard(dirinfo_type_t t); +int entry_guards_parse_state(or_state_t *state, int set, char **msg); +void entry_guards_update_state(or_state_t *state); +int getinfo_helper_entry_guards(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); + +void mark_bridge_list(void); +void sweep_bridge_list(void); + +int routerinfo_is_a_configured_bridge(const routerinfo_t *ri); +int node_is_a_configured_bridge(const node_t *node); +void learned_router_identity(const tor_addr_t *addr, uint16_t port, + const char *digest); +struct bridge_line_t; +void bridge_add_from_config(struct bridge_line_t *bridge_line); +void retry_bridge_descriptor_fetch_directly(const char *digest); +void fetch_bridge_descriptors(const or_options_t *options, time_t now); +void learned_bridge_descriptor(routerinfo_t *ri, int from_cache); +int any_bridge_descriptors_known(void); +int any_pending_bridge_descriptor_fetches(void); +int entries_known_but_down(const or_options_t *options); +void entries_retry_all(const or_options_t *options); + +int any_bridge_supports_microdescriptors(void); +const smartlist_t *get_socks_args_by_bridge_addrport(const tor_addr_t *addr, + uint16_t port); + +int any_bridges_dont_support_microdescriptors(void); + +void entry_guards_free_all(void); + +const char *find_transport_name_by_bridge_addrport(const tor_addr_t *addr, + uint16_t port); +struct transport_t; +int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, + const struct transport_t **transport); + +int transport_is_needed(const char *transport_name); +int validate_pluggable_transports_config(void); + +double pathbias_get_close_success_count(entry_guard_t *guard); +double pathbias_get_use_success_count(entry_guard_t *guard); + +#endif + diff --git a/src/tor/eventdns.h b/src/tor/eventdns.h new file mode 100644 index 000000000..ad8c100dd --- /dev/null +++ b/src/tor/eventdns.h @@ -0,0 +1,337 @@ + +/* + * The original DNS code is due to Adam Langley with heavy + * modifications by Nick Mathewson. Adam put his DNS software in the + * public domain. You can find his original copyright below. Please, + * aware that the code as part of libevent is governed by the 3-clause + * BSD license above. + * + * This software is Public Domain. To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + * I ask and expect, but do not require, that all derivative works contain an + * attribution similar to: + * Parts developed by Adam Langley + * + * You may wish to replace the word "Parts" with something else depending on + * the amount of original code. + * + * (Derivative works does not include programs which link against, run or include + * the source verbatim in their source distributions) + */ + +/* + * Welcome, gentle reader + * + * Async DNS lookups are really a whole lot harder than they should be, + * mostly stemming from the fact that the libc resolver has never been + * very good at them. Before you use this library you should see if libc + * can do the job for you with the modern async call getaddrinfo_a + * (see http://www.imperialviolet.org/page25.html#e498). Otherwise, + * please continue. + * + * This code is based on libevent and you must call event_init before + * any of the APIs in this file. You must also seed the OpenSSL random + * source if you are using OpenSSL for ids (see below). + * + * This library is designed to be included and shipped with your source + * code. You statically link with it. You should also test for the + * existence of strtok_r and define HAVE_STRTOK_R if you have it. + * + * The DNS protocol requires a good source of id numbers and these + * numbers should be unpredictable for spoofing reasons. There are + * three methods for generating them here and you must define exactly + * one of them. In increasing order of preference: + * + * DNS_USE_GETTIMEOFDAY_FOR_ID: + * Using the bottom 16 bits of the usec result from gettimeofday. This + * is a pretty poor solution but should work anywhere. + * DNS_USE_CPU_CLOCK_FOR_ID: + * Using the bottom 16 bits of the nsec result from the CPU's time + * counter. This is better, but may not work everywhere. Requires + * POSIX realtime support and you'll need to link against -lrt on + * glibc systems at least. + * DNS_USE_OPENSSL_FOR_ID: + * Uses the OpenSSL RAND_bytes call to generate the data. You must + * have seeded the pool before making any calls to this library. + * + * The library keeps track of the state of nameservers and will avoid + * them when they go down. Otherwise it will round robin between them. + * + * Quick start guide: + * #include "evdns.h" + * void callback(int result, char type, int count, int ttl, + * void *addresses, void *arg); + * evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf"); + * evdns_resolve("www.hostname.com", 0, callback, NULL); + * + * When the lookup is complete the callback function is called. The + * first argument will be one of the DNS_ERR_* defines in evdns.h. + * Hopefully it will be DNS_ERR_NONE, in which case type will be + * DNS_IPv4_A, count will be the number of IP addresses, ttl is the time + * which the data can be cached for (in seconds), addresses will point + * to an array of uint32_t's and arg will be whatever you passed to + * evdns_resolve. + * + * Searching: + * + * In order for this library to be a good replacement for glibc's resolver it + * supports searching. This involves setting a list of default domains, in + * which names will be queried for. The number of dots in the query name + * determines the order in which this list is used. + * + * Searching appears to be a single lookup from the point of view of the API, + * although many DNS queries may be generated from a single call to + * evdns_resolve. Searching can also drastically slow down the resolution + * of names. + * + * To disable searching: + * 1. Never set it up. If you never call evdns_resolv_conf_parse or + * evdns_search_add then no searching will occur. + * + * 2. If you do call evdns_resolv_conf_parse then don't pass + * DNS_OPTION_SEARCH (or DNS_OPTIONS_ALL, which implies it). + * + * 3. When calling evdns_resolve, pass the DNS_QUERY_NO_SEARCH flag. + * + * The order of searches depends on the number of dots in the name. If the + * number is greater than the ndots setting then the names is first tried + * globally. Otherwise each search domain is appended in turn. + * + * The ndots setting can either be set from a resolv.conf, or by calling + * evdns_search_ndots_set. + * + * For example, with ndots set to 1 (the default) and a search domain list of + * ["myhome.net"]: + * Query: www + * Order: www.myhome.net, www. + * + * Query: www.abc + * Order: www.abc., www.abc.myhome.net + * + * API reference: + * + * int evdns_nameserver_add(uint32_t address) + * Add a nameserver. The address should be an IP address in + * network byte order. The type of address is chosen so that + * it matches in_addr.s_addr. + * Returns non-zero on error. + * + * int evdns_nameserver_ip_add(const char *ip_as_string) + * This wraps the above function by parsing a string as an IP + * address and adds it as a nameserver. + * Returns non-zero on error + * + * int evdns_resolve(const char *name, int flags, + * evdns_callback_type callback, + * void *ptr) + * Resolve a name. The name parameter should be a DNS name. + * The flags parameter should be 0, or DNS_QUERY_NO_SEARCH + * which disables searching for this query. (see defn of + * searching above). + * + * The callback argument is a function which is called when + * this query completes and ptr is an argument which is passed + * to that callback function. + * + * Returns non-zero on error + * + * void evdns_search_clear() + * Clears the list of search domains + * + * void evdns_search_add(const char *domain) + * Add a domain to the list of search domains + * + * void evdns_search_ndots_set(int ndots) + * Set the number of dots which, when found in a name, causes + * the first query to be without any search domain. + * + * int evdns_count_nameservers(void) + * Return the number of configured nameservers (not necessarily the + * number of running nameservers). This is useful for double-checking + * whether our calls to the various nameserver configuration functions + * have been successful. + * + * int evdns_clear_nameservers_and_suspend(void) + * Remove all currently configured nameservers, and suspend all pending + * resolves. Resolves will not necessarily be re-attempted until + * evdns_resume() is called. + * + * int evdns_resume(void) + * Re-attempt resolves left in limbo after an earlier call to + * evdns_clear_nameservers_and_suspend(). + * + * int evdns_config_windows_nameservers(void) + * Attempt to configure a set of nameservers based on platform settings on + * a win32 host. Preferentially tries to use GetNetworkParams; if that fails, + * looks in the registry. Returns 0 on success, nonzero on failure. + * + * int evdns_resolv_conf_parse(int flags, const char *filename) + * Parse a resolv.conf like file from the given filename. + * + * See the man page for resolv.conf for the format of this file. + * The flags argument determines what information is parsed from + * this file: + * DNS_OPTION_SEARCH - domain, search and ndots options + * DNS_OPTION_NAMESERVERS - nameserver lines + * DNS_OPTION_MISC - timeout and attempts options + * DNS_OPTIONS_ALL - all of the above + * The following directives are not parsed from the file: + * sortlist, rotate, no-check-names, inet6, debug + * + * Returns non-zero on error: + * 0 no errors + * 1 failed to open file + * 2 failed to stat file + * 3 file too large + * 4 out of memory + * 5 short read from file + * 6 no nameservers in file + * + * Internals: + * + * Requests are kept in two queues. The first is the inflight queue. In + * this queue requests have an allocated transaction id and nameserver. + * They will soon be transmitted if they haven't already been. + * + * The second is the waiting queue. The size of the inflight ring is + * limited and all other requests wait in waiting queue for space. This + * bounds the number of concurrent requests so that we don't flood the + * nameserver. Several algorithms require a full walk of the inflight + * queue and so bounding its size keeps thing going nicely under huge + * (many thousands of requests) loads. + * + * If a nameserver loses too many requests it is considered down and we + * try not to use it. After a while we send a probe to that nameserver + * (a lookup for google.com) and, if it replies, we consider it working + * again. If the nameserver fails a probe we wait longer to try again + * with the next probe. + */ + +#ifndef TOR_EVENTDNS_H +#define TOR_EVENTDNS_H + +/* Error codes 0-5 are as described in RFC 1035. */ +#define DNS_ERR_NONE 0 +/* The name server was unable to interpret the query */ +#define DNS_ERR_FORMAT 1 +/* The name server was unable to process this query due to a problem with the + * name server */ +#define DNS_ERR_SERVERFAILED 2 +/* The domain name does not exist */ +#define DNS_ERR_NOTEXIST 3 +/* The name server does not support the requested kind of query */ +#define DNS_ERR_NOTIMPL 4 +/* The name server refuses to reform the specified operation for policy + * reasons */ +#define DNS_ERR_REFUSED 5 +/* The reply was truncated or ill-formated */ +#define DNS_ERR_TRUNCATED 65 +/* An unknown error occurred */ +#define DNS_ERR_UNKNOWN 66 +/* Communication with the server timed out */ +#define DNS_ERR_TIMEOUT 67 +/* The request was canceled because the DNS subsystem was shut down. */ +#define DNS_ERR_SHUTDOWN 68 + +#define DNS_IPv4_A 1 +#define DNS_PTR 2 +#define DNS_IPv6_AAAA 3 + +#define DNS_QUERY_NO_SEARCH 1 + +#define DNS_OPTION_SEARCH 1 +#define DNS_OPTION_NAMESERVERS 2 +#define DNS_OPTION_MISC 4 +#define DNS_OPTIONS_ALL 7 + +/* + * The callback that contains the results from a lookup. + * - type is either DNS_IPv4_A or DNS_IPv6_AAAA or DNS_PTR + * - count contains the number of addresses of form type + * - ttl is the number of seconds the resolution may be cached for. + * - addresses needs to be cast according to type + */ +typedef void (*evdns_callback_type) (int result, char type, int count, int ttl, void *addresses, void *arg); + +int evdns_init(void); +void evdns_shutdown(int fail_requests); +const char *evdns_err_to_string(int err); +int evdns_nameserver_add(uint32_t address); +int evdns_count_nameservers(void); +int evdns_clear_nameservers_and_suspend(void); +int evdns_resume(void); +int evdns_nameserver_ip_add(const char *ip_as_string); +int evdns_nameserver_sockaddr_add(const struct sockaddr *sa, socklen_t len); +void evdns_set_default_outgoing_bind_address(const struct sockaddr *addr, socklen_t addrlen); +int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr); +int evdns_resolve_ipv6(const char *name, int flags, evdns_callback_type callback, void *ptr); +struct in_addr; +struct in6_addr; +int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); +int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); +int evdns_set_option(const char *option, const char *val, int flags); +int evdns_resolv_conf_parse(int flags, const char *); +#ifdef _WIN32 +int evdns_config_windows_nameservers(void); +#endif +void evdns_search_clear(void); +void evdns_search_add(const char *domain); +void evdns_search_ndots_set(const int ndots); + +typedef void (*evdns_debug_log_fn_type)(int is_warning, const char *msg); +void evdns_set_log_fn(evdns_debug_log_fn_type fn); + +void evdns_set_transaction_id_fn(uint16_t (*fn)(void)); +void evdns_set_random_bytes_fn(void (*fn)(char *, size_t)); + +#define DNS_NO_SEARCH 1 + +/* Structures and functions used to implement a DNS server. */ + +struct evdns_server_request { + int flags; + int nquestions; + struct evdns_server_question **questions; +}; +struct evdns_server_question { + int type; + int dns_question_class; + char name[1]; +}; +typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *); +#define EVDNS_ANSWER_SECTION 0 +#define EVDNS_AUTHORITY_SECTION 1 +#define EVDNS_ADDITIONAL_SECTION 2 + +#define EVDNS_TYPE_A 1 +#define EVDNS_TYPE_NS 2 +#define EVDNS_TYPE_CNAME 5 +#define EVDNS_TYPE_SOA 6 +#define EVDNS_TYPE_PTR 12 +#define EVDNS_TYPE_MX 15 +#define EVDNS_TYPE_TXT 16 +#define EVDNS_TYPE_AAAA 28 + +#define EVDNS_QTYPE_AXFR 252 +#define EVDNS_QTYPE_ALL 255 + +#define EVDNS_CLASS_INET 1 + +struct evdns_server_port *evdns_add_server_port(tor_socket_t socket, int is_tcp, evdns_request_callback_fn_type callback, void *user_data); +void evdns_close_server_port(struct evdns_server_port *port); + +int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int class, int ttl, int datalen, int is_name, const char *data); +int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); +int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); +int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl); +int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl); + +struct sockaddr; +int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len); + +int evdns_server_request_respond(struct evdns_server_request *req, int err); +int evdns_server_request_drop(struct evdns_server_request *req); + +#endif // !EVENTDNS_H diff --git a/src/tor/eventdns_tor.h b/src/tor/eventdns_tor.h new file mode 100644 index 000000000..4dc3c2fdd --- /dev/null +++ b/src/tor/eventdns_tor.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_EVENTDNS_TOR_H +#define TOR_EVENTDNS_TOR_H + +#include "orconfig.h" +#define DNS_USE_OPENSSL_FOR_ID +#ifndef HAVE_UINT +typedef unsigned int uint; +#endif +#ifndef HAVE_U_CHAR +typedef unsigned char u_char; +#endif +#ifdef _WIN32 +#define inline __inline +#endif +#include "torint.h" + +/* These are for debugging possible memory leaks. */ +#include "tor_util.h" +#include "tor_compat.h" + +#endif + diff --git a/src/tor/src/or/ext_orport.c b/src/tor/ext_orport.c similarity index 91% rename from src/tor/src/or/ext_orport.c rename to src/tor/ext_orport.c index 16a250fa5..fcfe15cfb 100644 --- a/src/tor/src/or/ext_orport.c +++ b/src/tor/ext_orport.c @@ -1,20 +1,10 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* Copyright (c) 2012, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file ext_orport.c * \brief Code implementing the Extended ORPort. - * - * The Extended ORPort interface is used by pluggable transports to - * communicate additional information to a Tor bridge, including - * address information. For more information on this interface, - * see pt-spec.txt in torspec.git. - * - * There is no separate structure for extended ORPort connections; they use - * or_connection_t objects, and share most of their implementation with - * connection_or.c. Once the handshake is done, an extended ORPort connection - * turns into a regular OR connection, using connection_ext_or_transition(). - */ +*/ #define EXT_ORPORT_PRIVATE #include "or.h" @@ -23,16 +13,15 @@ #include "ext_orport.h" #include "control.h" #include "config.h" -#include "main.h" -#include "proto_ext_or.h" -#include "util.h" +#include "tor_util.h" +#include "onion_main.h" /** Allocate and return a structure capable of holding an Extended * ORPort message of body length len. */ ext_or_cmd_t * ext_or_cmd_new(uint16_t len) { - size_t size = offsetof(ext_or_cmd_t, body) + len; + size_t size = STRUCT_OFFSET(ext_or_cmd_t, body) + len; ext_or_cmd_t *cmd = tor_malloc(size); cmd->len = len; return cmd; @@ -40,7 +29,7 @@ ext_or_cmd_new(uint16_t len) /** Deallocate the Extended ORPort message in cmd. */ void -ext_or_cmd_free_(ext_or_cmd_t *cmd) +ext_or_cmd_free(ext_or_cmd_t *cmd) { tor_free(cmd); } @@ -52,7 +41,12 @@ ext_or_cmd_free_(ext_or_cmd_t *cmd) static int connection_fetch_ext_or_cmd_from_buf(connection_t *conn, ext_or_cmd_t **out) { - return fetch_ext_or_command_from_buf(conn->inbuf, out); + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_ext_or_command_from_evbuffer(input, out); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_ext_or_command_from_buf(conn->inbuf, out); + } } /** Write an Extended ORPort message to conn. Use @@ -70,10 +64,10 @@ connection_write_ext_or_command(connection_t *conn, return -1; set_uint16(header, htons(command)); set_uint16(header+2, htons(bodylen)); - connection_buf_add(header, 4, conn); + connection_write_to_buf(header, 4, conn); if (bodylen) { tor_assert(body); - connection_buf_add(body, bodylen, conn); + connection_write_to_buf(body, bodylen, conn); } return 0; } @@ -149,7 +143,6 @@ init_ext_or_cookie_authentication(int is_enabled) fname = get_ext_or_auth_cookie_file_name(); retval = init_cookie_authentication(fname, EXT_OR_PORT_AUTH_COOKIE_HEADER, EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN, - get_options()->ExtORPortCookieAuthFileGroupReadable, &ext_or_auth_cookie, &ext_or_auth_cookie_is_set); tor_free(fname); @@ -157,7 +150,7 @@ init_ext_or_cookie_authentication(int is_enabled) } /** Read data from conn and see if the client sent us the - * authentication type that they prefer to use in this session. + * authentication type that she prefers to use in this session. * * Return -1 if we received corrupted data or if we don't support the * authentication type. Return 0 if we need more data in @@ -171,7 +164,7 @@ connection_ext_or_auth_neg_auth_type(connection_t *conn) if (connection_get_inbuf_len(conn) < 1) return 0; - if (connection_buf_get_bytes(authtype, 1, conn) < 0) + if (connection_fetch_from_buf(authtype, 1, conn) < 0) return -1; log_debug(LD_GENERAL, "Client wants us to use %d auth type", authtype[0]); @@ -184,7 +177,7 @@ connection_ext_or_auth_neg_auth_type(connection_t *conn) return 1; } -/* DOCDOC */ +/** DOCDOC */ STATIC int handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len, char **client_hash_out, @@ -199,7 +192,8 @@ handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len, return -1; /* Get our nonce */ - crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); + if (crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN) < 0) + return -1; { /* set up macs */ size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) + @@ -262,7 +256,7 @@ handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len, base16_encode(server_nonce_encoded, sizeof(server_nonce_encoded), server_nonce, sizeof(server_nonce)); base16_encode(client_nonce_encoded, sizeof(client_nonce_encoded), - client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); + client_nonce, sizeof(client_nonce)); log_debug(LD_GENERAL, "server_hash: '%s'\nserver_nonce: '%s'\nclient_nonce: '%s'", @@ -311,7 +305,7 @@ connection_ext_or_auth_handle_client_nonce(connection_t *conn) if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_NONCE_LEN) return 0; - if (connection_buf_get_bytes(client_nonce, + if (connection_fetch_from_buf(client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN, conn) < 0) return -1; @@ -326,7 +320,7 @@ connection_ext_or_auth_handle_client_nonce(connection_t *conn) &reply, &reply_len) < 0) return -1; - connection_buf_add(reply, reply_len, conn); + connection_write_to_buf(reply, reply_len, conn); memwipe(reply, 0, reply_len); tor_free(reply); @@ -348,9 +342,9 @@ static void connection_ext_or_auth_send_result(connection_t *conn, int success) { if (success) - connection_buf_add("\x01", 1, conn); + connection_write_to_buf("\x01", 1, conn); else - connection_buf_add("\x00", 1, conn); + connection_write_to_buf("\x00", 1, conn); } /** Receive the client's hash from conn, validate that it's @@ -368,7 +362,7 @@ connection_ext_or_auth_handle_client_hash(connection_t *conn) if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_HASH_LEN) return 0; - if (connection_buf_get_bytes(provided_client_hash, + if (connection_fetch_from_buf(provided_client_hash, EXT_OR_PORT_AUTH_HASH_LEN, conn) < 0) return -1; @@ -460,11 +454,6 @@ connection_ext_or_handle_cmd_useraddr(connection_t *conn, tor_free(addr_str); if (res<0) return -1; - if (port == 0) { - log_warn(LD_GENERAL, "Server transport proxy gave us an empty port " - "in ExtORPort UserAddr command."); - // return -1; // enable this if nothing breaks after a while. - } res = tor_addr_parse(&addr, address_part); tor_free(address_part); @@ -472,8 +461,8 @@ connection_ext_or_handle_cmd_useraddr(connection_t *conn, return -1; { /* do some logging */ - char *old_address = tor_addr_to_str_dup(&conn->addr); - char *new_address = tor_addr_to_str_dup(&addr); + char *old_address = tor_dup_addr(&conn->addr); + char *new_address = tor_dup_addr(&addr); log_debug(LD_NET, "Received USERADDR." "We rewrite our address from '%s:%u' to '%s:%u'.", @@ -489,7 +478,7 @@ connection_ext_or_handle_cmd_useraddr(connection_t *conn, if (conn->address) { tor_free(conn->address); } - conn->address = tor_addr_to_str_dup(&addr); + conn->address = tor_dup_addr(&addr); return 0; } @@ -643,7 +632,7 @@ connection_ext_or_start_auth(or_connection_t *or_conn) log_debug(LD_GENERAL, "ExtORPort authentication: Sending supported authentication types"); - connection_buf_add((const char *)authtypes, sizeof(authtypes), conn); + connection_write_to_buf((const char *)authtypes, sizeof(authtypes), conn); conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE; return 0; diff --git a/src/tor/src/or/ext_orport.h b/src/tor/ext_orport.h similarity index 83% rename from src/tor/src/or/ext_orport.h rename to src/tor/ext_orport.h index 09acbc407..ce45e5f41 100644 --- a/src/tor/src/or/ext_orport.h +++ b/src/tor/ext_orport.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef EXT_ORPORT_H @@ -10,11 +10,7 @@ int connection_ext_or_start_auth(or_connection_t *or_conn); ext_or_cmd_t *ext_or_cmd_new(uint16_t len); - -#define ext_or_cmd_free(cmd) \ - FREE_AND_NULL(ext_or_cmd_t, ext_or_cmd_free_, (cmd)) - -void ext_or_cmd_free_(ext_or_cmd_t *cmd); +void ext_or_cmd_free(ext_or_cmd_t *cmd); void connection_or_set_ext_or_identifier(or_connection_t *conn); void connection_or_remove_from_ext_or_id_map(or_connection_t *conn); void connection_or_clear_ext_or_id_map(void); @@ -40,7 +36,7 @@ STATIC int handle_client_auth_nonce(const char *client_nonce, extern uint8_t *ext_or_auth_cookie; extern int ext_or_auth_cookie_is_set; #endif -#endif /* defined(EXT_ORPORT_PRIVATE) */ +#endif -#endif /* !defined(EXT_ORPORT_H) */ +#endif diff --git a/src/tor/src/or/fp_pair.c b/src/tor/fp_pair.c similarity index 85% rename from src/tor/src/or/fp_pair.c rename to src/tor/fp_pair.c index c938e7667..4d8a835c8 100644 --- a/src/tor/src/or/fp_pair.c +++ b/src/tor/fp_pair.c @@ -1,22 +1,6 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* Copyright (c) 2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file fp_pair.c - * - * \brief Manages data structures for associating pairs of fingerprints. Used - * to handle combinations of identity/signing-key fingerprints for - * authorities. - * - * This is a nice, simple, compact data structure module that handles a map - * from (signing key fingerprint, identity key fingerprint) to void *. The - * fingerprints here are SHA1 digests of RSA keys. - * - * This structure is used in directory.c and in routerlist.c for handling - * handling authority certificates, since we never want more than a single - * certificate for any (ID key, signing key) pair. - **/ - #include "or.h" #include "fp_pair.h" @@ -37,7 +21,7 @@ struct fp_pair_map_s { */ /** Compare fp_pair_entry_t objects by key value. */ -static inline int +static INLINE int fp_pair_map_entries_eq(const fp_pair_map_entry_t *a, const fp_pair_map_entry_t *b) { @@ -45,11 +29,20 @@ fp_pair_map_entries_eq(const fp_pair_map_entry_t *a, } /** Return a hash value for an fp_pair_entry_t. */ -static inline unsigned int +static INLINE unsigned int fp_pair_map_entry_hash(const fp_pair_map_entry_t *a) { - tor_assert(sizeof(a->key) == DIGEST_LEN*2); - return (unsigned) siphash24g(&a->key, DIGEST_LEN*2); + const uint32_t *p; + unsigned int hash; + + p = (const uint32_t *)(a->key.first); + /* Hashes are 20 bytes long, so 5 times uint32_t */ + hash = p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; + /* Now XOR in the second fingerprint */ + p = (const uint32_t *)(a->key.second); + hash ^= p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; + + return hash; } /* @@ -58,9 +51,9 @@ fp_pair_map_entry_hash(const fp_pair_map_entry_t *a) HT_PROTOTYPE(fp_pair_map_impl, fp_pair_map_entry_s, node, fp_pair_map_entry_hash, fp_pair_map_entries_eq) -HT_GENERATE2(fp_pair_map_impl, fp_pair_map_entry_s, node, - fp_pair_map_entry_hash, fp_pair_map_entries_eq, - 0.6, tor_reallocarray_, tor_free_) +HT_GENERATE(fp_pair_map_impl, fp_pair_map_entry_s, node, + fp_pair_map_entry_hash, fp_pair_map_entries_eq, + 0.6, tor_malloc, tor_realloc, tor_free) /** Constructor to create a new empty map from fp_pair_t to void * */ @@ -196,7 +189,7 @@ fp_pair_map_remove(fp_pair_map_t *map, const fp_pair_t *key) */ void -fp_pair_map_free_(fp_pair_map_t *map, void (*free_val)(void*)) +fp_pair_map_free(fp_pair_map_t *map, void (*free_val)(void*)) { fp_pair_map_entry_t **ent, **next, *this; diff --git a/src/tor/src/or/fp_pair.h b/src/tor/fp_pair.h similarity index 82% rename from src/tor/src/or/fp_pair.h rename to src/tor/fp_pair.h index 4498a1610..89f664a81 100644 --- a/src/tor/src/or/fp_pair.h +++ b/src/tor/fp_pair.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* Copyright (c) 2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -26,12 +26,7 @@ void * fp_pair_map_get(const fp_pair_map_t *map, const fp_pair_t *key); void * fp_pair_map_get_by_digests(const fp_pair_map_t *map, const char *first, const char *second); void * fp_pair_map_remove(fp_pair_map_t *map, const fp_pair_t *key); -void fp_pair_map_free_(fp_pair_map_t *map, void (*free_val)(void*)); -#define fp_pair_map_free(map, free_val) do { \ - fp_pair_map_free_((map), (free_val)); \ - (map) = NULL; \ - } while (0) - +void fp_pair_map_free(fp_pair_map_t *map, void (*free_val)(void*)); int fp_pair_map_isempty(const fp_pair_map_t *map); int fp_pair_map_size(const fp_pair_map_t *map); fp_pair_map_iter_t * fp_pair_map_iter_init(fp_pair_map_t *map); @@ -46,5 +41,5 @@ void fp_pair_map_assert_ok(const fp_pair_map_t *map); #undef DECLARE_MAP_FNS -#endif /* !defined(_TOR_FP_PAIR_H) */ +#endif diff --git a/src/tor/src/or/geoip.c b/src/tor/geoip.c similarity index 92% rename from src/tor/src/or/geoip.c rename to src/tor/geoip.c index d7411e6aa..dc4730c81 100644 --- a/src/tor/src/or/geoip.c +++ b/src/tor/geoip.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -7,36 +7,18 @@ * to summarizing client connections by country to entry guards, bridges, * and directory servers; and for statistics on answering network status * requests. - * - * There are two main kinds of functions in this module: geoip functions, - * which map groups of IPv4 and IPv6 addresses to country codes, and - * statistical functions, which collect statistics about different kinds of - * per-country usage. - * - * The geoip lookup tables are implemented as sorted lists of disjoint address - * ranges, each mapping to a singleton geoip_country_t. These country objects - * are also indexed by their names in a hashtable. - * - * The tables are populated from disk at startup by the geoip_load_file() - * function. For more information on the file format they read, see that - * function. See the scripts and the README file in src/config for more - * information about how those files are generated. - * - * Tor uses GeoIP information in order to implement user requests (such as - * ExcludeNodes {cc}), and to keep track of how much usage relays are getting - * for each country. */ #define GEOIP_PRIVATE #include "or.h" #include "ht.h" -#include "buffers.h" #include "config.h" #include "control.h" #include "dnsserv.h" #include "geoip.h" #include "routerlist.h" +static void clear_geoip_db(void); static void init_geoip_countries(void); /** An entry from the GeoIP IPv4 file: maps an IPv4 range to a country. */ @@ -76,8 +58,8 @@ static char geoip6_digest[DIGEST_LEN]; /** Return the index of the country's entry in the GeoIP * country list if it is a valid 2-letter country code, otherwise * return -1. */ -MOCK_IMPL(country_t, -geoip_get_country,(const char *country)) +country_t +geoip_get_country(const char *country) { void *idxplus1_; intptr_t idx; @@ -99,9 +81,9 @@ geoip_add_entry(const tor_addr_t *low, const tor_addr_t *high, intptr_t idx; void *idxplus1_; - IF_BUG_ONCE(tor_addr_family(low) != tor_addr_family(high)) + if (tor_addr_family(low) != tor_addr_family(high)) return; - IF_BUG_ONCE(tor_addr_compare(high, low, CMP_EXACT) < 0) + if (tor_addr_compare(high, low, CMP_EXACT) < 0) return; idxplus1_ = strmap_get_lc(country_idxplus1_by_lc_code, country); @@ -129,8 +111,8 @@ geoip_add_entry(const tor_addr_t *low, const tor_addr_t *high, smartlist_add(geoip_ipv4_entries, ent); } else if (tor_addr_family(low) == AF_INET6) { geoip_ipv6_entry_t *ent = tor_malloc_zero(sizeof(geoip_ipv6_entry_t)); - ent->ip_low = *tor_addr_to_in6_assert(low); - ent->ip_high = *tor_addr_to_in6_assert(high); + ent->ip_low = *tor_addr_to_in6(low); + ent->ip_high = *tor_addr_to_in6(high); ent->country = idx; smartlist_add(geoip_ipv6_entries, ent); } @@ -163,7 +145,6 @@ geoip_parse_entry(const char *line, sa_family_t family) if (*line == '#') return 0; - char buf[512]; if (family == AF_INET) { unsigned int low, high; if (tor_sscanf(line,"%u,%u,%2s", &low, &high, c) == 3 || @@ -174,6 +155,7 @@ geoip_parse_entry(const char *line, sa_family_t family) goto fail; country = c; } else { /* AF_INET6 */ + char buf[512]; char *low_str, *high_str; struct in6_addr low, high; char *strtok_state; @@ -414,8 +396,8 @@ geoip_get_country_by_ipv6(const struct in6_addr *addr) * the 'unknown country'. The return value will always be less than * geoip_get_n_countries(). To decode it, call geoip_get_country_name(). */ -MOCK_IMPL(int, -geoip_get_country_by_addr,(const tor_addr_t *addr)) +int +geoip_get_country_by_addr(const tor_addr_t *addr) { if (tor_addr_family(addr) == AF_INET) { return geoip_get_country_by_ipv4(tor_addr_to_ipv4h(addr)); @@ -427,8 +409,8 @@ geoip_get_country_by_addr,(const tor_addr_t *addr)) } /** Return the number of countries recognized by the GeoIP country list. */ -MOCK_IMPL(int, -geoip_get_n_countries,(void)) +int +geoip_get_n_countries(void) { if (!geoip_countries) init_geoip_countries(); @@ -448,8 +430,8 @@ geoip_get_country_name(country_t num) } /** Return true iff we have loaded a GeoIP database.*/ -MOCK_IMPL(int, -geoip_is_loaded,(sa_family_t family)) +int +geoip_is_loaded(sa_family_t family) { tor_assert(family == AF_INET || family == AF_INET6); if (geoip_countries == NULL) @@ -501,18 +483,16 @@ static HT_HEAD(clientmap, clientmap_entry_t) client_history = HT_INITIALIZER(); /** Hashtable helper: compute a hash of a clientmap_entry_t. */ -static inline unsigned +static INLINE unsigned clientmap_entry_hash(const clientmap_entry_t *a) { - unsigned h = (unsigned) tor_addr_hash(&a->addr); - + unsigned h = tor_addr_hash(&a->addr); if (a->transport_name) - h += (unsigned) siphash24g(a->transport_name, strlen(a->transport_name)); - - return h; + h += ht_string_hash(a->transport_name); + return ht_improve_hash(h); } /** Hashtable helper: compare two clientmap_entry_t values for equality. */ -static inline int +static INLINE int clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b) { if (strcmp_opt(a->transport_name, b->transport_name)) @@ -523,16 +503,13 @@ clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b) } HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, - clientmap_entries_eq) -HT_GENERATE2(clientmap, clientmap_entry_t, node, clientmap_entry_hash, - clientmap_entries_eq, 0.6, tor_reallocarray_, tor_free_) - -#define clientmap_entry_free(ent) \ - FREE_AND_NULL(clientmap_entry_t, clientmap_entry_free_, ent) + clientmap_entries_eq); +HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, + clientmap_entries_eq, 0.6, malloc, realloc, free); /** Free all storage held by ent. */ static void -clientmap_entry_free_(clientmap_entry_t *ent) +clientmap_entry_free(clientmap_entry_t *ent) { if (!ent) return; @@ -577,9 +554,8 @@ geoip_note_client_seen(geoip_client_action_t action, (!(options->BridgeRelay && options->BridgeRecordUsageByCountry))) return; } else { - /* Only gather directory-request statistics if configured, and - * forcibly disable them on bridge authorities. */ - if (!options->DirReqStatistics || options->BridgeAuthoritativeDir) + if (options->BridgeRelay || options->BridgeAuthoritativeDir || + !options->DirReqStatistics) return; } @@ -740,9 +716,9 @@ dirreq_map_ent_hash(const dirreq_map_entry_t *entry) } HT_PROTOTYPE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, - dirreq_map_ent_eq) -HT_GENERATE2(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, - dirreq_map_ent_eq, 0.6, tor_reallocarray_, tor_free_) + dirreq_map_ent_eq); +HT_GENERATE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, + dirreq_map_ent_eq, 0.6, malloc, realloc, free); /** Helper: Put entry into map of directory requests using * type and dirreq_id as key parts. If there is @@ -833,7 +809,7 @@ char * geoip_get_transport_history(void) { unsigned granularity = IP_GRANULARITY; - /** String hash table (name of transport) -> (number of users). */ + /** String hash table -> . */ strmap_t *transport_counts = strmap_new(); /** Smartlist that contains copies of the names of the transports @@ -846,6 +822,7 @@ geoip_get_transport_history(void) static const char* no_transport_str = ""; clientmap_entry_t **ent; + const char *transport_name = NULL; smartlist_t *string_chunks = smartlist_new(); char *the_string = NULL; @@ -871,7 +848,7 @@ geoip_get_transport_history(void) HT_FOREACH(ent, clientmap, &client_history) { uintptr_t val; void *ptr; - const char *transport_name = (*ent)->transport_name; + transport_name = (*ent)->transport_name; if (!transport_name) transport_name = no_transport_str; @@ -884,7 +861,7 @@ geoip_get_transport_history(void) /* If it's the first time we see this transport, note it. */ if (val == 1) - smartlist_add_strdup(transports_used, transport_name); + smartlist_add(transports_used, tor_strdup(transport_name)); log_debug(LD_GENERAL, "Client from '%s' with transport '%s'. " "I've now seen %d clients.", @@ -934,16 +911,16 @@ static char * geoip_get_dirreq_history(dirreq_type_t type) { char *result = NULL; - buf_t *buf = NULL; smartlist_t *dirreq_completed = NULL; uint32_t complete = 0, timeouts = 0, running = 0; - dirreq_map_entry_t **ptr, **next; + int bufsize = 1024, written; + dirreq_map_entry_t **ptr, **next, *ent; struct timeval now; tor_gettimeofday(&now); dirreq_completed = smartlist_new(); for (ptr = HT_START(dirreqmap, &dirreq_map); ptr; ptr = next) { - dirreq_map_entry_t *ent = *ptr; + ent = *ptr; if (ent->type != type) { next = HT_NEXT(dirreqmap, &dirreq_map, ptr); continue; @@ -969,9 +946,13 @@ geoip_get_dirreq_history(dirreq_type_t type) DIR_REQ_GRANULARITY); running = round_uint32_to_next_multiple_of(running, DIR_REQ_GRANULARITY); - buf = buf_new_with_capacity(1024); - buf_add_printf(buf, "complete=%u,timeout=%u," - "running=%u", complete, timeouts, running); + result = tor_malloc_zero(bufsize); + written = tor_snprintf(result, bufsize, "complete=%u,timeout=%u," + "running=%u", complete, timeouts, running); + if (written < 0) { + tor_free(result); + goto done; + } #define MIN_DIR_REQ_RESPONSES 16 if (complete >= MIN_DIR_REQ_RESPONSES) { @@ -979,20 +960,20 @@ geoip_get_dirreq_history(dirreq_type_t type) /* We may have rounded 'completed' up. Here we want to use the * real value. */ complete = smartlist_len(dirreq_completed); - dltimes = tor_calloc(complete, sizeof(uint32_t)); + dltimes = tor_malloc_zero(sizeof(uint32_t) * complete); SMARTLIST_FOREACH_BEGIN(dirreq_completed, dirreq_map_entry_t *, ent) { uint32_t bytes_per_second; uint32_t time_diff = (uint32_t) tv_mdiff(&ent->request_time, &ent->completion_time); if (time_diff == 0) time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible - * by law of nature or something, but a millisecond + * by law of nature or something, but a milisecond * is a bit greater than "instantly" */ bytes_per_second = (uint32_t)(1000 * ent->response_size / time_diff); dltimes[ent_sl_idx] = bytes_per_second; } SMARTLIST_FOREACH_END(ent); median_uint32(dltimes, complete); /* sorts as a side effect. */ - buf_add_printf(buf, + written = tor_snprintf(result + written, bufsize - written, ",min=%u,d1=%u,d2=%u,q1=%u,d3=%u,d4=%u,md=%u," "d6=%u,d7=%u,q3=%u,d8=%u,d9=%u,max=%u", dltimes[0], @@ -1008,15 +989,14 @@ geoip_get_dirreq_history(dirreq_type_t type) dltimes[8*complete/10-1], dltimes[9*complete/10-1], dltimes[complete-1]); + if (written<0) + tor_free(result); tor_free(dltimes); } - - result = buf_extract(buf, NULL); - + done: SMARTLIST_FOREACH(dirreq_completed, dirreq_map_entry_t *, ent, tor_free(ent)); smartlist_free(dirreq_completed); - buf_free(buf); return result; } @@ -1042,7 +1022,7 @@ geoip_get_client_history(geoip_client_action_t action, smartlist_t *entries = NULL; int n_countries = geoip_get_n_countries(); int i; - clientmap_entry_t **cm_ent; + clientmap_entry_t **ent; unsigned *counts = NULL; unsigned total = 0; unsigned ipv4_count = 0, ipv6_count = 0; @@ -1050,18 +1030,18 @@ geoip_get_client_history(geoip_client_action_t action, if (!geoip_is_loaded(AF_INET) && !geoip_is_loaded(AF_INET6)) return -1; - counts = tor_calloc(n_countries, sizeof(unsigned)); - HT_FOREACH(cm_ent, clientmap, &client_history) { + counts = tor_malloc_zero(sizeof(unsigned)*n_countries); + HT_FOREACH(ent, clientmap, &client_history) { int country; - if ((*cm_ent)->action != (int)action) + if ((*ent)->action != (int)action) continue; - country = geoip_get_country_by_addr(&(*cm_ent)->addr); + country = geoip_get_country_by_addr(&(*ent)->addr); if (country < 0) country = 0; /** unresolved requests are stored at index 0. */ tor_assert(0 <= country && country < n_countries); ++counts[country]; ++total; - switch (tor_addr_family(&(*cm_ent)->addr)) { + switch (tor_addr_family(&(*ent)->addr)) { case AF_INET: ipv4_count++; break; @@ -1224,9 +1204,9 @@ geoip_format_dirreq_stats(time_t now) { char t[ISO_TIME_LEN+1]; int i; - char *v3_ips_string = NULL, *v3_reqs_string = NULL, - *v3_direct_dl_string = NULL, *v3_tunneled_dl_string = NULL; - char *result = NULL; + char *v3_ips_string, *v3_reqs_string, *v3_direct_dl_string, + *v3_tunneled_dl_string; + char *result; if (!start_of_dirreq_stats_interval) return NULL; /* Not initialized. */ @@ -1297,8 +1277,6 @@ geoip_dirreq_stats_write(time_t now) /* Generate history string .*/ str = geoip_format_dirreq_stats(now); - if (! str) - goto done; /* Write dirreq-stats string to disk. */ if (!check_or_create_data_subdir("stats")) { @@ -1455,39 +1433,6 @@ format_bridge_stats_controller(time_t now) return out; } -/** Return a newly allocated string holding our bridge usage stats by - * country in a format suitable for inclusion in our heartbeat - * message. Return NULL on failure. */ -char * -format_client_stats_heartbeat(time_t now) -{ - const int n_hours = 6; - char *out = NULL; - int n_clients = 0; - clientmap_entry_t **ent; - unsigned cutoff = (unsigned)( (now-n_hours*3600)/60 ); - - if (!start_of_bridge_stats_interval) - return NULL; /* Not initialized. */ - - /* count unique IPs */ - HT_FOREACH(ent, clientmap, &client_history) { - /* only count directly connecting clients */ - if ((*ent)->action != GEOIP_CLIENT_CONNECT) - continue; - if ((*ent)->last_seen_in_minutes < cutoff) - continue; - n_clients++; - } - - tor_asprintf(&out, "Heartbeat: " - "In the last %d hours, I have seen %d unique clients.", - n_hours, - n_clients); - - return out; -} - /** Write bridge statistics to $DATADIR/stats/bridge-stats and return * when we should next try to write statistics. */ time_t @@ -1666,15 +1611,6 @@ getinfo_helper_geoip(control_connection_t *control_conn, sa_family_t family; tor_addr_t addr; question += strlen("ip-to-country/"); - - if (!strcmp(question, "ipv4-available") || - !strcmp(question, "ipv6-available")) { - family = !strcmp(question, "ipv4-available") ? AF_INET : AF_INET6; - const int available = geoip_is_loaded(family); - tor_asprintf(answer, "%d", !! available); - return 0; - } - family = tor_addr_parse(&addr, question); if (family != AF_INET && family != AF_INET6) { *errmsg = "Invalid address family"; @@ -1694,7 +1630,7 @@ getinfo_helper_geoip(control_connection_t *control_conn, } /** Release all storage held by the GeoIP databases and country list. */ -STATIC void +static void clear_geoip_db(void) { if (geoip_countries) { diff --git a/src/tor/src/or/geoip.h b/src/tor/geoip.h similarity index 84% rename from src/tor/src/or/geoip.h rename to src/tor/geoip.h index acf61b97a..b9b53c300 100644 --- a/src/tor/src/or/geoip.h +++ b/src/tor/geoip.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -18,16 +18,15 @@ STATIC int geoip_parse_entry(const char *line, sa_family_t family); STATIC int geoip_get_country_by_ipv4(uint32_t ipaddr); STATIC int geoip_get_country_by_ipv6(const struct in6_addr *addr); -STATIC void clear_geoip_db(void); -#endif /* defined(GEOIP_PRIVATE) */ +#endif int should_record_bridge_info(const or_options_t *options); int geoip_load_file(sa_family_t family, const char *filename); -MOCK_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); -MOCK_DECL(int, geoip_get_n_countries, (void)); +int geoip_get_country_by_addr(const tor_addr_t *addr); +int geoip_get_n_countries(void); const char *geoip_get_country_name(country_t num); -MOCK_DECL(int, geoip_is_loaded, (sa_family_t family)); +int geoip_is_loaded(sa_family_t family); const char *geoip_db_digest(sa_family_t family); -MOCK_DECL(country_t, geoip_get_country, (const char *countrycode)); +country_t geoip_get_country(const char *countrycode); void geoip_note_client_seen(geoip_client_action_t action, const tor_addr_t *addr, const char *transport_name, @@ -65,7 +64,6 @@ time_t geoip_bridge_stats_write(time_t now); void geoip_bridge_stats_term(void); const char *geoip_get_bridge_stats_extrainfo(time_t); char *geoip_get_bridge_stats_controller(time_t); -char *format_client_stats_heartbeat(time_t now); -#endif /* !defined(TOR_GEOIP_H) */ +#endif diff --git a/src/tor/src/or/hibernate.c b/src/tor/hibernate.c similarity index 84% rename from src/tor/src/or/hibernate.c rename to src/tor/hibernate.c index 4dc35f68d..c234e4e6b 100644 --- a/src/tor/src/or/hibernate.c +++ b/src/tor/hibernate.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -8,12 +8,6 @@ * etc in preparation for closing down or going dormant; and to track * bandwidth and time intervals to know when to hibernate and when to * stop hibernating. - * - * Ordinarily a Tor relay is "Live". - * - * A live relay can stop accepting connections for one of two reasons: either - * it is trying to conserve bandwidth because of bandwidth accounting rules - * ("soft hibernation"), or it is about to shut down ("exiting"). **/ /* @@ -34,13 +28,13 @@ hibernating, phase 2: #include "config.h" #include "connection.h" #include "connection_edge.h" -#include "connection_or.h" -#include "control.h" #include "hibernate.h" -#include "main.h" +#include "onion_main.h" #include "router.h" #include "statefile.h" +extern long stats_n_seconds_working; /* published uptime */ + /** Are we currently awake, asleep, running out of bandwidth, or shutting * down? */ static hibernate_state_t hibernate_state = HIBERNATE_STATE_INITIAL; @@ -56,10 +50,8 @@ typedef enum { UNIT_MONTH=1, UNIT_WEEK=2, UNIT_DAY=3, } time_unit_t; -/* - * @file hibernate.c +/* Fields for accounting logic. Accounting overview: * - *

Accounting

* Accounting is designed to ensure that no more than N bytes are sent in * either direction over a given interval (currently, one month, one week, or * one day) We could @@ -73,21 +65,17 @@ typedef enum { * * Each interval runs as follows: * - *
    - *
  1. We guess our bandwidth usage, based on how much we used + * 1. We guess our bandwidth usage, based on how much we used * last time. We choose a "wakeup time" within the interval to come up. - *
  2. Until the chosen wakeup time, we hibernate. - *
  3. We come up at the wakeup time, and provide bandwidth until we are + * 2. Until the chosen wakeup time, we hibernate. + * 3. We come up at the wakeup time, and provide bandwidth until we are * "very close" to running out. - *
  4. Then we go into low-bandwidth mode, and stop accepting new + * 4. Then we go into low-bandwidth mode, and stop accepting new * connections, but provide bandwidth until we run out. - *
  5. Then we hibernate until the end of the interval. + * 5. Then we hibernate until the end of the interval. * * If the interval ends before we run out of bandwidth, we go back to * step one. - * - * Accounting is controlled by the AccountingMax, AccountingRule, and - * AccountingStart options. */ /** How many bytes have we read in this accounting interval? */ @@ -123,34 +111,11 @@ static int cfg_start_day = 0, cfg_start_min = 0; /** @} */ -static const char *hibernate_state_to_string(hibernate_state_t state); static void reset_accounting(time_t now); static int read_bandwidth_usage(void); static time_t start_of_accounting_period_after(time_t now); static time_t start_of_accounting_period_containing(time_t now); static void accounting_set_wakeup_time(void); -static void on_hibernate_state_change(hibernate_state_t prev_state); - -/** - * Return the human-readable name for the hibernation state state - */ -static const char * -hibernate_state_to_string(hibernate_state_t state) -{ - static char buf[64]; - switch (state) { - case HIBERNATE_STATE_EXITING: return "EXITING"; - case HIBERNATE_STATE_LOWBANDWIDTH: return "SOFT"; - case HIBERNATE_STATE_DORMANT: return "HARD"; - case HIBERNATE_STATE_INITIAL: - case HIBERNATE_STATE_LIVE: - return "AWAKE"; - default: - log_warn(LD_BUG, "unknown hibernate state %d", state); - tor_snprintf(buf, sizeof(buf), "unknown [%d]", state); - return buf; - } -} /* ************ * Functions for bandwidth accounting. @@ -274,8 +239,8 @@ accounting_parse_options(const or_options_t *options, int validate_only) /** If we want to manage the accounting system and potentially * hibernate, return 1, else return 0. */ -MOCK_IMPL(int, -accounting_is_enabled,(const or_options_t *options)) +int +accounting_is_enabled(const or_options_t *options) { if (options->AccountingMax) return 1; @@ -291,13 +256,13 @@ accounting_get_interval_length(void) } /** Return the time at which the current accounting interval will end. */ -MOCK_IMPL(time_t, -accounting_get_end_time,(void)) +time_t +accounting_get_end_time(void) { return interval_end_time; } -/** Called from main.c to tell us that seconds seconds have +/** Called from onion_main.c to tell us that seconds seconds have * passed, n_read bytes have been read, and n_written * bytes have been written. */ void @@ -332,7 +297,7 @@ edge_of_accounting_period_containing(time_t now, int get_end) case UNIT_MONTH: { /* If this is before the Nth, we want the Nth of last month. */ if (tm.tm_mday < cfg_start_day || - (tm.tm_mday == cfg_start_day && before)) { + (tm.tm_mday < cfg_start_day && before)) { --tm.tm_mon; } /* Otherwise, the month is correct. */ @@ -425,8 +390,8 @@ configure_accounting(time_t now) if (-0.50 <= delta && delta <= 0.50) { /* The start of the period is now a little later or earlier than we * remembered. That's fine; we might lose some bytes we could otherwise - * have written, but better to err on the side of obeying accounting - * settings. */ + * have written, but better to err on the side of obeying people's + * accounting settings. */ log_info(LD_ACCT, "Accounting interval moved by %.02f%%; " "that's fine.", delta*100); interval_end_time = start_of_accounting_period_after(now); @@ -445,21 +410,6 @@ configure_accounting(time_t now) accounting_set_wakeup_time(); } -/** Return the relevant number of bytes sent/received this interval - * based on the set AccountingRule */ -uint64_t -get_accounting_bytes(void) -{ - if (get_options()->AccountingRule == ACCT_SUM) - return n_bytes_read_in_interval+n_bytes_written_in_interval; - else if (get_options()->AccountingRule == ACCT_IN) - return n_bytes_read_in_interval; - else if (get_options()->AccountingRule == ACCT_OUT) - return n_bytes_written_in_interval; - else - return MAX(n_bytes_read_in_interval, n_bytes_written_in_interval); -} - /** Set expected_bandwidth_usage based on how much we sent/received * per minute last interval (if we were up for at least 30 minutes), * or based on our declared bandwidth otherwise. */ @@ -471,11 +421,6 @@ update_expected_bandwidth(void) uint64_t max_configured = (options->RelayBandwidthRate > 0 ? options->RelayBandwidthRate : options->BandwidthRate) * 60; - /* max_configured is the larger of bytes read and bytes written - * If we are accounting based on sum, worst case is both are - * at max, doubling the expected sum of bandwidth */ - if (get_options()->AccountingRule == ACCT_SUM) - max_configured *= 2; #define MIN_TIME_FOR_MEASUREMENT (1800) @@ -494,7 +439,8 @@ update_expected_bandwidth(void) * doesn't know to store soft-limit info. Just take rate at which * we were reading/writing in the last interval as our expected rate. */ - uint64_t used = get_accounting_bytes(); + uint64_t used = MAX(n_bytes_written_in_interval, + n_bytes_read_in_interval); expected = used / (n_seconds_active_in_interval / 60); } else { /* If we haven't gotten enough data last interval, set 'expected' @@ -529,7 +475,7 @@ reset_accounting(time_t now) } /** Return true iff we should save our bandwidth usage to disk. */ -static inline int +static INLINE int time_to_record_bandwidth_usage(time_t now) { /* Note every 600 sec */ @@ -588,10 +534,7 @@ accounting_set_wakeup_time(void) char buf[ISO_TIME_LEN+1]; format_iso_time(buf, interval_start_time); - if (crypto_pk_get_digest(get_server_identity_key(), digest) < 0) { - log_err(LD_BUG, "Error getting our key's digest."); - tor_assert(0); - } + crypto_pk_get_digest(get_server_identity_key(), digest); d_env = crypto_digest_new(); crypto_digest_add_bytes(d_env, buf, ISO_TIME_LEN); @@ -705,15 +648,7 @@ read_bandwidth_usage(void) { char *fname = get_datadir_fname("bw_accounting"); - int res; - - res = unlink(fname); - if (res != 0 && errno != ENOENT) { - log_warn(LD_FS, - "Failed to unlink %s: %s", - fname, strerror(errno)); - } - + unlink(fname); tor_free(fname); } @@ -772,7 +707,8 @@ hibernate_hard_limit_reached(void) uint64_t hard_limit = get_options()->AccountingMax; if (!hard_limit) return 0; - return get_accounting_bytes() >= hard_limit; + return n_bytes_read_in_interval >= hard_limit + || n_bytes_written_in_interval >= hard_limit; } /** Return true iff we have sent/received almost all the bytes we are willing @@ -803,7 +739,8 @@ hibernate_soft_limit_reached(void) if (!soft_limit) return 0; - return get_accounting_bytes() >= soft_limit; + return n_bytes_read_in_interval >= soft_limit + || n_bytes_written_in_interval >= soft_limit; } /** Called when we get a SIGINT, or when bandwidth soft limit is @@ -819,15 +756,16 @@ hibernate_begin(hibernate_state_t new_state, time_t now) log_notice(LD_GENERAL,"SIGINT received %s; exiting now.", hibernate_state == HIBERNATE_STATE_EXITING ? "a second time" : "while hibernating"); - tor_shutdown_event_loop_and_exit(0); - return; + tor_cleanup(); + exit(0); } if (new_state == HIBERNATE_STATE_LOWBANDWIDTH && hibernate_state == HIBERNATE_STATE_LIVE) { soft_limit_hit_at = now; n_seconds_to_hit_soft_limit = n_seconds_active_in_interval; - n_bytes_at_soft_limit = get_accounting_bytes(); + n_bytes_at_soft_limit = MAX(n_bytes_read_in_interval, + n_bytes_written_in_interval); } /* close listeners. leave control listener(s). */ @@ -860,7 +798,7 @@ hibernate_end(hibernate_state_t new_state) hibernate_state == HIBERNATE_STATE_DORMANT || hibernate_state == HIBERNATE_STATE_INITIAL); - /* listeners will be relaunched in run_scheduled_events() in main.c */ + /* listeners will be relaunched in run_scheduled_events() in onion_main.c */ if (hibernate_state != HIBERNATE_STATE_INITIAL) log_notice(LD_ACCT,"Hibernation period ended. Resuming normal activity."); @@ -877,8 +815,8 @@ hibernate_begin_shutdown(void) } /** Return true iff we are currently hibernating. */ -MOCK_IMPL(int, -we_are_hibernating,(void)) +int +we_are_hibernating(void) { return hibernate_state != HIBERNATE_STATE_LIVE; } @@ -900,30 +838,27 @@ hibernate_go_dormant(time_t now) log_notice(LD_ACCT,"Going dormant. Blowing away remaining connections."); /* Close all OR/AP/exit conns. Leave dir conns because we still want - * to be able to upload server descriptors so clients know we're still + * to be able to upload server descriptors so people know we're still * running, and download directories so we can detect if we're obsolete. * Leave control conns because we still want to be controllable. */ while ((conn = connection_get_by_type(CONN_TYPE_OR)) || (conn = connection_get_by_type(CONN_TYPE_AP)) || (conn = connection_get_by_type(CONN_TYPE_EXIT))) { - if (CONN_IS_EDGE(conn)) { + if (CONN_IS_EDGE(conn)) connection_edge_end(TO_EDGE_CONN(conn), END_STREAM_REASON_HIBERNATING); - } log_info(LD_NET,"Closing conn type %d", conn->type); - if (conn->type == CONN_TYPE_AP) { - /* send socks failure if needed */ + if (conn->type == CONN_TYPE_AP) /* send socks failure if needed */ connection_mark_unattached_ap(TO_ENTRY_CONN(conn), END_STREAM_REASON_HIBERNATING); - } else if (conn->type == CONN_TYPE_OR) { + else if (conn->type == CONN_TYPE_OR) { if (TO_OR_CONN(conn)->chan) { - connection_or_close_normally(TO_OR_CONN(conn), 0); + channel_mark_for_close(TLS_CHAN_TO_BASE(TO_OR_CONN(conn)->chan)); } else { connection_mark_for_close(conn); } - } else { + } else connection_mark_for_close(conn); - } } if (now < interval_wakeup_time) @@ -976,7 +911,6 @@ consider_hibernation(time_t now) { int accounting_enabled = get_options()->AccountingMax != 0; char buf[ISO_TIME_LEN+1]; - hibernate_state_t prev_state = hibernate_state; /* If we're in 'exiting' mode, then we just shut down after the interval * elapses. */ @@ -984,7 +918,8 @@ consider_hibernation(time_t now) tor_assert(shutdown_time); if (shutdown_time <= now) { log_notice(LD_GENERAL, "Clean shutdown finished. Exiting."); - tor_shutdown_event_loop_and_exit(0); + tor_cleanup(); + exit(0); } return; /* if exiting soon, don't worry about bandwidth limits */ } @@ -1031,10 +966,6 @@ consider_hibernation(time_t now) hibernate_end_time_elapsed(now); } } - - /* Dispatch a controller event if the hibernation state changed. */ - if (hibernate_state != prev_state) - on_hibernate_state_change(prev_state); } /** Helper function: called when we get a GETINFO request for an @@ -1052,42 +983,25 @@ getinfo_helper_accounting(control_connection_t *conn, if (!strcmp(question, "accounting/enabled")) { *answer = tor_strdup(accounting_is_enabled(get_options()) ? "1" : "0"); } else if (!strcmp(question, "accounting/hibernating")) { - *answer = tor_strdup(hibernate_state_to_string(hibernate_state)); - tor_strlower(*answer); + if (hibernate_state == HIBERNATE_STATE_DORMANT) + *answer = tor_strdup("hard"); + else if (hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH) + *answer = tor_strdup("soft"); + else + *answer = tor_strdup("awake"); } else if (!strcmp(question, "accounting/bytes")) { - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, + tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, U64_PRINTF_ARG(n_bytes_read_in_interval), U64_PRINTF_ARG(n_bytes_written_in_interval)); } else if (!strcmp(question, "accounting/bytes-left")) { uint64_t limit = get_options()->AccountingMax; - if (get_options()->AccountingRule == ACCT_SUM) { - uint64_t total_left = 0; - uint64_t total_bytes = get_accounting_bytes(); - if (total_bytes < limit) - total_left = limit - total_bytes; - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(total_left), U64_PRINTF_ARG(total_left)); - } else if (get_options()->AccountingRule == ACCT_IN) { - uint64_t read_left = 0; - if (n_bytes_read_in_interval < limit) - read_left = limit - n_bytes_read_in_interval; - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(read_left), U64_PRINTF_ARG(limit)); - } else if (get_options()->AccountingRule == ACCT_OUT) { - uint64_t write_left = 0; - if (n_bytes_written_in_interval < limit) - write_left = limit - n_bytes_written_in_interval; - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(limit), U64_PRINTF_ARG(write_left)); - } else { - uint64_t read_left = 0, write_left = 0; - if (n_bytes_read_in_interval < limit) - read_left = limit - n_bytes_read_in_interval; - if (n_bytes_written_in_interval < limit) - write_left = limit - n_bytes_written_in_interval; - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(read_left), U64_PRINTF_ARG(write_left)); - } + uint64_t read_left = 0, write_left = 0; + if (n_bytes_read_in_interval < limit) + read_left = limit - n_bytes_read_in_interval; + if (n_bytes_written_in_interval < limit) + write_left = limit - n_bytes_written_in_interval; + tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, + U64_PRINTF_ARG(read_left), U64_PRINTF_ARG(write_left)); } else if (!strcmp(question, "accounting/interval-start")) { *answer = tor_malloc(ISO_TIME_LEN+1); format_iso_time(*answer, interval_start_time); @@ -1103,20 +1017,6 @@ getinfo_helper_accounting(control_connection_t *conn, return 0; } -/** - * Helper function: called when the hibernation state changes, and sends a - * SERVER_STATUS event to notify interested controllers of the accounting - * state change. - */ -static void -on_hibernate_state_change(hibernate_state_t prev_state) -{ - (void)prev_state; /* Should we do something with this? */ - control_event_server_status(LOG_NOTICE, - "HIBERNATION_STATUS STATUS=%s", - hibernate_state_to_string(hibernate_state)); -} - #ifdef TOR_UNIT_TESTS /** * Manually change the hibernation state. Private; used only by the unit @@ -1127,5 +1027,5 @@ hibernate_set_state_for_testing_(hibernate_state_t newstate) { hibernate_state = newstate; } -#endif /* defined(TOR_UNIT_TESTS) */ +#endif diff --git a/src/tor/src/or/hibernate.h b/src/tor/hibernate.h similarity index 80% rename from src/tor/src/or/hibernate.h rename to src/tor/hibernate.h index 85fb42864..4f7331ce8 100644 --- a/src/tor/src/or/hibernate.h +++ b/src/tor/hibernate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,24 +12,20 @@ #ifndef TOR_HIBERNATE_H #define TOR_HIBERNATE_H -#include "testsupport.h" - int accounting_parse_options(const or_options_t *options, int validate_only); -MOCK_DECL(int, accounting_is_enabled, (const or_options_t *options)); +int accounting_is_enabled(const or_options_t *options); int accounting_get_interval_length(void); -MOCK_DECL(time_t, accounting_get_end_time, (void)); +time_t accounting_get_end_time(void); void configure_accounting(time_t now); -uint64_t get_accounting_bytes(void); void accounting_run_housekeeping(time_t now); void accounting_add_bytes(size_t n_read, size_t n_written, int seconds); int accounting_record_bandwidth_usage(time_t now, or_state_t *state); void hibernate_begin_shutdown(void); -MOCK_DECL(int, we_are_hibernating, (void)); +int we_are_hibernating(void); void consider_hibernation(time_t now); int getinfo_helper_accounting(control_connection_t *conn, const char *question, char **answer, const char **errmsg); -uint64_t get_accounting_max_total(void); #ifdef HIBERNATE_PRIVATE /** Possible values of hibernate_state */ @@ -53,7 +49,7 @@ typedef enum { #ifdef TOR_UNIT_TESTS void hibernate_set_state_for_testing_(hibernate_state_t newstate); #endif -#endif /* defined(HIBERNATE_PRIVATE) */ +#endif -#endif /* !defined(TOR_HIBERNATE_H) */ +#endif diff --git a/src/tor/src/ext/ht.h b/src/tor/ht.h similarity index 80% rename from src/tor/src/ext/ht.h rename to src/tor/ht.h index 99da773fa..669a2ed92 100644 --- a/src/tor/src/ext/ht.h +++ b/src/tor/ht.h @@ -1,100 +1,10 @@ /* Copyright (c) 2002, Christopher Clark. * Copyright (c) 2005-2006, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See license at end. */ /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ -/* - These macros provide an intrustive implementation for a typesafe chaining - hash table, loosely based on the BSD tree.h and queue.h macros. Here's - how to use them. - - First, pick a the structure that you'll be storing in the hashtable. Let's - say that's "struct dinosaur". To this structure, you add an HT_ENTRY() - member, as such: - - struct dinosaur { - HT_ENTRY(dinosaur) node; // The name inside the () must match the - // struct. - - // These are just fields from the dinosaur structure... - long dinosaur_id; - char *name; - long age; - int is_ornithischian; - int is_herbivorous; - }; - - You can declare the hashtable itself as: - - HT_HEAD(dinosaur_ht, dinosaur); - - This declares a new 'struct dinosaur_ht' type. - - Now you need to declare two functions to help implement the hashtable: one - compares two dinosaurs for equality, and one computes the hash of a - dinosaur. Let's say that two dinosaurs are equal if they have the same ID - and name. - - int - dinosaurs_equal(const struct dinosaur *d1, const struct dinosaur *d2) - { - return d1->dinosaur_id == d2->dinosaur_id && - 0 == strcmp(d1->name, d2->name); - } - - unsigned - dinosaur_hash(const struct dinosaur *d) - { - // This is a very bad hash function. Use siphash24g instead. - return (d->dinosaur_id + d->name[0] ) * 1337 + d->name[1] * 1337; - } - - Now you'll need to declare the functions that manipulate the hash table. - To do this, you put this declaration either in a header file, or inside - a regular module, depending on what visibility you want. - - HT_PROTOTYPE(dinosaur_ht, // The name of the hashtable struct - dinosaur, // The name of the element struct, - node, // The name of HT_ENTRY member - dinosaur_hash, dinosaurs_equal); - - Later, inside a C function, you use this macro to declare the hashtable - functions. - - HT_GENERATE2(dinosaur_ht, dinosaur, node, dinosaur_hash, dinosaurs_equal, - 0.6, tor_reallocarray, tor_free_); - - Note the use of tor_free_, not tor_free. The 0.6 is magic. - - Now you can use the hashtable! You can initialize one with - - struct dinosaur_ht my_dinos = HT_INITIALIZER(); - - Or create one in core with - - struct dinosaur_ht *dinos = tor_malloc(sizeof(dinosaur_ht)); - HT_INIT(dinosaur_ht, dinos); - - To the hashtable, you use the HT_FOO(dinosaur_ht, ...) macros. For - example, to put new_dino into dinos, you say: - - HT_REPLACE(dinosaur_ht, dinos, new_dino); - - If you're searching for an element, you need to use a dummy 'key' element in - the search. For example. - - struct dinosaur dino_key; - dino_key.dinosaur_id = 12345; - dino_key.name = tor_strdup("Atrociraptor"); - - struct dinosaur *found = HT_FIND(dinosaurs_ht, dinos, &dino_key); - - Have fun with your hash table! - - */ - #ifndef HT_H_INCLUDED_ #define HT_H_INCLUDED_ @@ -128,9 +38,8 @@ } #endif -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ #define HT_EMPTY(head) \ - (((head)->hth_n_entries == 0) || 0) + ((head)->hth_n_entries == 0) /* How many elements in 'head'? */ #define HT_SIZE(head) \ @@ -149,11 +58,8 @@ #define HT_NEXT_RMV(name, head, elm) name##_HT_NEXT_RMV((head), (elm)) #define HT_CLEAR(name, head) name##_HT_CLEAR(head) #define HT_INIT(name, head) name##_HT_INIT(head) -#define HT_REP_IS_BAD_(name, head) name##_HT_REP_IS_BAD_(head) -#define HT_FOREACH_FN(name, head, fn, data) \ - name##_HT_FOREACH_FN((head), (fn), (data)) /* Helper: */ -static inline unsigned +static INLINE unsigned ht_improve_hash(unsigned h) { /* Aim to protect against poor hash functions by adding logic here @@ -167,7 +73,7 @@ ht_improve_hash(unsigned h) #if 0 /** Basic string hash function, from Java standard String.hashCode(). */ -static inline unsigned +static INLINE unsigned ht_string_hash(const char *s) { unsigned h = 0; @@ -180,9 +86,8 @@ ht_string_hash(const char *s) } #endif -#if 0 /** Basic string hash function, from Python's str.__hash__() */ -static inline unsigned +static INLINE unsigned ht_string_hash(const char *s) { unsigned h; @@ -195,7 +100,6 @@ ht_string_hash(const char *s) h ^= (unsigned)(cp-(const unsigned char*)s); return h; } -#endif #ifndef HT_NO_CACHE_HASH_VALUES #define HT_SET_HASH_(elm, field, hashfn) \ @@ -213,29 +117,21 @@ ht_string_hash(const char *s) ((void)0) #endif -#define HT_BUCKET_NUM_(head, field, elm, hashfn) \ - (HT_ELT_HASH_(elm,field,hashfn) % head->hth_table_length) - /* Helper: alias for the bucket containing 'elm'. */ #define HT_BUCKET_(head, field, elm, hashfn) \ - ((head)->hth_table[HT_BUCKET_NUM_(head, field, elm, hashfn)]) + ((head)->hth_table[HT_ELT_HASH_(elm,field,hashfn) \ + % head->hth_table_length]) #define HT_FOREACH(x, name, head) \ for ((x) = HT_START(name, head); \ (x) != NULL; \ (x) = HT_NEXT(name, head, x)) -#ifndef HT_NDEBUG -#define HT_ASSERT_(x) tor_assert(x) -#else -#define HT_ASSERT_(x) (void)0 -#endif - #define HT_PROTOTYPE(name, type, field, hashfn, eqfn) \ int name##_HT_GROW(struct name *ht, unsigned min_capacity); \ void name##_HT_CLEAR(struct name *ht); \ int name##_HT_REP_IS_BAD_(const struct name *ht); \ - static inline void \ + static INLINE void \ name##_HT_INIT(struct name *head) { \ head->hth_table_length = 0; \ head->hth_table = NULL; \ @@ -245,7 +141,7 @@ ht_string_hash(const char *s) } \ /* Helper: returns a pointer to the right location in the table \ * 'head' to find or insert the element 'elm'. */ \ - static inline struct type ** \ + static INLINE struct type ** \ name##_HT_FIND_P_(struct name *head, struct type *elm) \ { \ struct type **p; \ @@ -261,7 +157,7 @@ ht_string_hash(const char *s) } \ /* Return a pointer to the element in the table 'head' matching 'elm', \ * or NULL if no such element exists */ \ - ATTR_UNUSED static inline struct type * \ + static INLINE struct type * \ name##_HT_FIND(const struct name *head, struct type *elm) \ { \ struct type **p; \ @@ -272,7 +168,7 @@ ht_string_hash(const char *s) } \ /* Insert the element 'elm' into the table 'head'. Do not call this \ * function if the table might already contain a matching element. */ \ - ATTR_UNUSED static inline void \ + static INLINE void \ name##_HT_INSERT(struct name *head, struct type *elm) \ { \ struct type **p; \ @@ -287,7 +183,7 @@ ht_string_hash(const char *s) /* Insert the element 'elm' into the table 'head'. If there already \ * a matching element in the table, replace that element and return \ * it. */ \ - ATTR_UNUSED static inline struct type * \ + static INLINE struct type * \ name##_HT_REPLACE(struct name *head, struct type *elm) \ { \ struct type **p, *r; \ @@ -295,7 +191,6 @@ ht_string_hash(const char *s) name##_HT_GROW(head, head->hth_n_entries+1); \ HT_SET_HASH_(elm, field, hashfn); \ p = name##_HT_FIND_P_(head, elm); \ - HT_ASSERT_(p != NULL); /* this holds because we called HT_GROW */ \ r = *p; \ *p = elm; \ if (r && (r!=elm)) { \ @@ -309,7 +204,7 @@ ht_string_hash(const char *s) } \ /* Remove any element matching 'elm' from the table 'head'. If such \ * an element is found, return it; otherwise return NULL. */ \ - ATTR_UNUSED static inline struct type * \ + static INLINE struct type * \ name##_HT_REMOVE(struct name *head, struct type *elm) \ { \ struct type **p, *r; \ @@ -327,11 +222,11 @@ ht_string_hash(const char *s) * using 'data' as its second argument. If the function returns \ * nonzero, remove the most recently examined element before invoking \ * the function again. */ \ - ATTR_UNUSED static inline void \ + static INLINE void \ name##_HT_FOREACH_FN(struct name *head, \ int (*fn)(struct type *, void *), \ void *data) \ -{ \ + { \ unsigned idx; \ struct type **p, **nextp, *next; \ if (!head->hth_table) \ @@ -353,16 +248,13 @@ ht_string_hash(const char *s) /* Return a pointer to the first element in the table 'head', under \ * an arbitrary order. This order is stable under remove operations, \ * but not under others. If the table is empty, return NULL. */ \ - ATTR_UNUSED static inline struct type ** \ + static INLINE struct type ** \ name##_HT_START(struct name *head) \ { \ unsigned b = 0; \ while (b < head->hth_table_length) { \ - if (head->hth_table[b]) { \ - HT_ASSERT_(b == \ - HT_BUCKET_NUM_(head,field,head->hth_table[b],hashfn)); \ + if (head->hth_table[b]) \ return &head->hth_table[b]; \ - } \ ++b; \ } \ return NULL; \ @@ -372,27 +264,23 @@ ht_string_hash(const char *s) * NULL. If 'elm' is to be removed from the table, you must call \ * this function for the next value before you remove it. \ */ \ - ATTR_UNUSED static inline struct type ** \ + static INLINE struct type ** \ name##_HT_NEXT(struct name *head, struct type **elm) \ { \ if ((*elm)->field.hte_next) { \ - HT_ASSERT_(HT_BUCKET_NUM_(head,field,*elm,hashfn) == \ - HT_BUCKET_NUM_(head,field,(*elm)->field.hte_next,hashfn)); \ return &(*elm)->field.hte_next; \ } else { \ - unsigned b = HT_BUCKET_NUM_(head,field,*elm,hashfn)+1; \ + unsigned b = (HT_ELT_HASH_(*elm, field, hashfn) \ + % head->hth_table_length)+1; \ while (b < head->hth_table_length) { \ - if (head->hth_table[b]) { \ - HT_ASSERT_(b == \ - HT_BUCKET_NUM_(head,field,head->hth_table[b],hashfn)); \ + if (head->hth_table[b]) \ return &head->hth_table[b]; \ - } \ ++b; \ } \ return NULL; \ } \ } \ - ATTR_UNUSED static inline struct type ** \ + static INLINE struct type ** \ name##_HT_NEXT_RMV(struct name *head, struct type **elm) \ { \ unsigned h = HT_ELT_HASH_(*elm, field, hashfn); \ @@ -411,18 +299,16 @@ ht_string_hash(const char *s) } \ } -#define HT_GENERATE2(name, type, field, hashfn, eqfn, load, reallocarrayfn, \ - freefn) \ - /* Primes that aren't too far from powers of two. We stop at */ \ - /* P=402653189 because P*sizeof(void*) is less than SSIZE_MAX */ \ - /* even on a 32-bit platform. */ \ +#define HT_GENERATE(name, type, field, hashfn, eqfn, load, mallocfn, \ + reallocfn, freefn) \ static unsigned name##_PRIMES[] = { \ 53, 97, 193, 389, \ 769, 1543, 3079, 6151, \ 12289, 24593, 49157, 98317, \ 196613, 393241, 786433, 1572869, \ 3145739, 6291469, 12582917, 25165843, \ - 50331653, 100663319, 201326611, 402653189 \ + 50331653, 100663319, 201326611, 402653189, \ + 805306457, 1610612741 \ }; \ static unsigned name##_N_PRIMES = \ (unsigned)(sizeof(name##_PRIMES)/sizeof(name##_PRIMES[0])); \ @@ -445,7 +331,7 @@ ht_string_hash(const char *s) new_load_limit = (unsigned)(load*new_len); \ } while (new_load_limit <= size && \ prime_idx < (int)name##_N_PRIMES); \ - if ((new_table = reallocarrayfn(NULL, new_len, sizeof(struct type*)))) { \ + if ((new_table = mallocfn(new_len*sizeof(struct type*)))) { \ unsigned b; \ memset(new_table, 0, new_len*sizeof(struct type*)); \ for (b = 0; b < head->hth_table_length; ++b) { \ @@ -465,7 +351,7 @@ ht_string_hash(const char *s) head->hth_table = new_table; \ } else { \ unsigned b, b2; \ - new_table = reallocarrayfn(head->hth_table, new_len, sizeof(struct type*)); \ + new_table = reallocfn(head->hth_table, new_len*sizeof(struct type*)); \ if (!new_table) return -1; \ memset(new_table + head->hth_table_length, 0, \ (new_len - head->hth_table_length)*sizeof(struct type*)); \ @@ -526,7 +412,7 @@ ht_string_hash(const char *s) for (elm = head->hth_table[i]; elm; elm = elm->field.hte_next) { \ if (HT_ELT_HASH_(elm, field, hashfn) != hashfn(elm)) \ return 1000 + i; \ - if (HT_BUCKET_NUM_(head,field,elm,hashfn) != i) \ + if ((HT_ELT_HASH_(elm, field, hashfn) % head->hth_table_length) != i) \ return 10000 + i; \ ++n; \ } \ @@ -536,21 +422,6 @@ ht_string_hash(const char *s) return 0; \ } -#define HT_GENERATE(name, type, field, hashfn, eqfn, load, mallocfn, \ - reallocfn, freefn) \ - static void * \ - name##_reallocarray(void *arg, size_t a, size_t b) \ - { \ - if ((b) && (a) > SIZE_MAX / (b)) \ - return NULL; \ - if (arg) \ - return reallocfn((arg),(a)*(b)); \ - else \ - return mallocfn((a)*(b)); \ - } \ - HT_GENERATE2(name, type, field, hashfn, eqfn, load, \ - name##_reallocarray, freefn) - /** Implements an over-optimized "find and insert if absent" block; * not meant for direct usage by typical code, or usage outside the critical * path.*/ @@ -563,7 +434,6 @@ ht_string_hash(const char *s) name##_HT_GROW(var##_head_, var##_head_->hth_n_entries+1); \ HT_SET_HASH_((elm), field, hashfn); \ var = name##_HT_FIND_P_(var##_head_, (elm)); \ - HT_ASSERT_(var); /* Holds because we called HT_GROW */ \ if (*var) { \ y; \ } else { \ diff --git a/src/tor/src/common/log.c b/src/tor/log.c similarity index 71% rename from src/tor/src/common/log.c rename to src/tor/log.c index ac6d07a92..6e3e95f83 100644 --- a/src/tor/src/common/log.c +++ b/src/tor/log.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -30,14 +30,11 @@ #ifdef HAVE_FCNTL_H #include #endif -#include "compat.h" -#include "util.h" +#include "tor_compat.h" +#include "tor_util.h" #define LOG_PRIVATE #include "torlog.h" #include "container.h" -#ifdef HAVE_ANDROID_LOG_H -#include -#endif // HAVE_ANDROID_LOG_H. /** Given a severity, yields an index into log_severity_list_t.masks to use * for that severity. */ @@ -50,8 +47,6 @@ #define TRUNCATED_STR_LEN 14 /** @} */ -#define raw_assert(x) assert(x) // assert OK - /** Information for a single logfile; only used in log.c */ typedef struct logfile_t { struct logfile_t *next; /**< Next logfile_t in the linked list. */ @@ -61,19 +56,15 @@ typedef struct logfile_t { int needs_close; /**< Boolean: true if the stream gets closed on shutdown. */ int is_temporary; /**< Boolean: close after initializing logging subsystem.*/ int is_syslog; /**< Boolean: send messages to syslog. */ - int is_android; /**< Boolean: send messages to Android's log subsystem. */ - char *android_tag; /**< Identity Tag used in Android's log subsystem. */ log_callback callback; /**< If not NULL, send messages to this function. */ log_severity_list_t *severities; /**< Which severity of messages should we * log for each log domain? */ } logfile_t; -static void log_free_(logfile_t *victim); -#define log_free(lg) \ - FREE_AND_NULL(logfile_t, log_free_, (lg)) +static void log_free(logfile_t *victim); /** Helper: map a log severity to descriptive string. */ -static inline const char * +static INLINE const char * sev_to_string(int severity) { switch (severity) { @@ -84,12 +75,12 @@ sev_to_string(int severity) case LOG_ERR: return "err"; default: /* Call assert, not tor_assert, since tor_assert * calls log on failure. */ - raw_assert(0); return "UNKNOWN"; // LCOV_EXCL_LINE + assert(0); return "UNKNOWN"; } } /** Helper: decide whether to include the function name in the log message. */ -static inline int +static INLINE int should_log_function_name(log_domain_mask_t domain, int severity) { switch (severity) { @@ -104,37 +95,10 @@ should_log_function_name(log_domain_mask_t domain, int severity) return (domain & (LD_BUG|LD_NOFUNCNAME)) == LD_BUG; default: /* Call assert, not tor_assert, since tor_assert calls log on failure. */ - raw_assert(0); return 0; // LCOV_EXCL_LINE + assert(0); return 0; } } -#ifdef HAVE_ANDROID_LOG_H -/** Helper function to convert Tor's log severity into the matching - * Android log priority. - */ -static int -severity_to_android_log_priority(int severity) -{ - switch (severity) { - case LOG_DEBUG: - return ANDROID_LOG_VERBOSE; - case LOG_INFO: - return ANDROID_LOG_DEBUG; - case LOG_NOTICE: - return ANDROID_LOG_INFO; - case LOG_WARN: - return ANDROID_LOG_WARN; - case LOG_ERR: - return ANDROID_LOG_ERROR; - default: - // LCOV_EXCL_START - raw_assert(0); - return 0; - // LCOV_EXCL_STOP - } -} -#endif // HAVE_ANDROID_LOG_H. - /** A mutex to guard changes to logfiles and logging. */ static tor_mutex_t log_mutex; /** True iff we have initialized log_mutex */ @@ -153,46 +117,21 @@ static int syslog_count = 0; /** Represents a log message that we are going to send to callback-driven * loggers once we can do so in a non-reentrant way. */ -typedef struct pending_log_message_t { +typedef struct pending_cb_message_t { int severity; /**< The severity of the message */ log_domain_mask_t domain; /**< The domain of the message */ - char *fullmsg; /**< The message, with all decorations */ char *msg; /**< The content of the message */ -} pending_log_message_t; +} pending_cb_message_t; /** Log messages waiting to be replayed onto callback-based logs */ static smartlist_t *pending_cb_messages = NULL; -/** Log messages waiting to be replayed once the logging system is initialized. - */ -static smartlist_t *pending_startup_messages = NULL; - -/** Number of bytes of messages queued in pending_startup_messages. (This is - * the length of the messages, not the number of bytes used to store - * them.) */ -static size_t pending_startup_messages_len; - -/** True iff we should store messages while waiting for the logs to get - * configured. */ -static int queue_startup_messages = 1; - -/** True iff __PRETTY_FUNCTION__ includes parenthesized arguments. */ -static int pretty_fn_has_parens = 0; - -/** Don't store more than this many bytes of messages while waiting for the - * logs to get configured. */ -#define MAX_STARTUP_MSG_LEN (1<<16) - /** Lock the log_mutex to prevent others from changing the logfile_t list */ #define LOCK_LOGS() STMT_BEGIN \ - tor_assert(log_mutex_initialized); \ tor_mutex_acquire(&log_mutex); \ STMT_END /** Unlock the log_mutex */ -#define UNLOCK_LOGS() STMT_BEGIN \ - tor_assert(log_mutex_initialized); \ - tor_mutex_release(&log_mutex); \ - STMT_END +#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(&log_mutex); STMT_END /** What's the lowest log level anybody cares about? Checking this lets us * bail out early from log_debug if we aren't debugging. */ @@ -203,11 +142,14 @@ static void close_log(logfile_t *victim); static char *domain_to_string(log_domain_mask_t domain, char *buf, size_t buflen); -static inline char *format_msg(char *buf, size_t buf_len, +static INLINE char *format_msg(char *buf, size_t buf_len, log_domain_mask_t domain, int severity, const char *funcname, const char *suffix, const char *format, va_list ap, size_t *msg_len_out) CHECK_PRINTF(7,0); +static void logv(int severity, log_domain_mask_t domain, const char *funcname, + const char *suffix, const char *format, va_list ap) + CHECK_PRINTF(5,0); /** Name of the application: used to generate the message we write at the * start of each new log. */ @@ -239,7 +181,7 @@ set_log_time_granularity(int granularity_msec) /** Helper: Write the standard prefix for log lines to a * buf_len character buffer in buf. */ -static inline size_t +static INLINE size_t log_prefix_(char *buf, size_t buf_len, int severity) { time_t t; @@ -306,19 +248,12 @@ log_tor_version(logfile_t *lf, int reset) return 0; } -static const char bug_suffix[] = " (on Tor " VERSION -#ifndef _MSC_VER - " " -#include "micro-revision.i" -#endif - ")"; - /** Helper: Format a log message into a fixed-sized buffer. (This is * factored out of logv so that we never format a message more * than once.) Return a pointer to the first character of the message * portion of the formatted string. */ -static inline char * +static INLINE char * format_msg(char *buf, size_t buf_len, log_domain_mask_t domain, int severity, const char *funcname, const char *suffix, @@ -329,7 +264,7 @@ format_msg(char *buf, size_t buf_len, char *end_of_prefix; char *buf_end; - raw_assert(buf_len >= 16); /* prevent integer underflow and stupidity */ + assert(buf_len >= 16); /* prevent integer underflow and general stupidity */ buf_len -= 2; /* subtract 2 characters so we have room for \n\0 */ buf_end = buf+buf_len; /* point *after* the last char we can write to */ @@ -356,9 +291,7 @@ format_msg(char *buf, size_t buf_len, } if (funcname && should_log_function_name(domain, severity)) { - r = tor_snprintf(buf+n, buf_len-n, - pretty_fn_has_parens ? "%s: " : "%s(): ", - funcname); + r = tor_snprintf(buf+n, buf_len-n, "%s(): ", funcname); if (r<0) n = strlen(buf); else @@ -393,142 +326,21 @@ format_msg(char *buf, size_t buf_len, } } } - - if (domain == LD_BUG && - buf_len - n > strlen(bug_suffix)+1) { - memcpy(buf+n, bug_suffix, strlen(bug_suffix)); - n += strlen(bug_suffix); - } - buf[n]='\n'; buf[n+1]='\0'; *msg_len_out = n+1; return end_of_prefix; } -/* Create a new pending_log_message_t with appropriate values */ -static pending_log_message_t * -pending_log_message_new(int severity, log_domain_mask_t domain, - const char *fullmsg, const char *shortmsg) -{ - pending_log_message_t *m = tor_malloc(sizeof(pending_log_message_t)); - m->severity = severity; - m->domain = domain; - m->fullmsg = fullmsg ? tor_strdup(fullmsg) : NULL; - m->msg = tor_strdup(shortmsg); - return m; -} - -#define pending_log_message_free(msg) \ - FREE_AND_NULL(pending_log_message_t, pending_log_message_free_, (msg)) - -/** Release all storage held by msg. */ -static void -pending_log_message_free_(pending_log_message_t *msg) -{ - if (!msg) - return; - tor_free(msg->msg); - tor_free(msg->fullmsg); - tor_free(msg); -} - -/** Helper function: returns true iff the log file, given in lf, is - * handled externally via the system log API, the Android logging API, or is an - * external callback function. */ -static inline int -logfile_is_external(const logfile_t *lf) -{ - raw_assert(lf); - return lf->is_syslog || lf->is_android || lf->callback; -} - -/** Return true iff lf would like to receive a message with the - * specified severity in the specified domain. - */ -static inline int -logfile_wants_message(const logfile_t *lf, int severity, - log_domain_mask_t domain) -{ - if (! (lf->severities->masks[SEVERITY_MASK_IDX(severity)] & domain)) { - return 0; - } - if (! (lf->fd >= 0 || logfile_is_external(lf))) { - return 0; - } - if (lf->seems_dead) { - return 0; - } - - return 1; -} - -/** Send a message to lf. The full message, with time prefix and - * severity, is in buf. The message itself is in - * msg_after_prefix. If callbacks_deferred points to true, then - * we already deferred this message for pending callbacks and don't need to do - * it again. Otherwise, if we need to do it, do it, and set - * callbacks_deferred to 1. */ -static inline void -logfile_deliver(logfile_t *lf, const char *buf, size_t msg_len, - const char *msg_after_prefix, log_domain_mask_t domain, - int severity, int *callbacks_deferred) -{ - - if (lf->is_syslog) { -#ifdef HAVE_SYSLOG_H -#ifdef MAXLINE - /* Some syslog implementations have limits on the length of what you can - * pass them, and some very old ones do not detect overflow so well. - * Regrettably, they call their maximum line length MAXLINE. */ -#if MAXLINE < 64 -#warn "MAXLINE is a very low number; it might not be from syslog.h after all" -#endif - char *m = msg_after_prefix; - if (msg_len >= MAXLINE) - m = tor_strndup(msg_after_prefix, MAXLINE-1); - syslog(severity, "%s", m); - if (m != msg_after_prefix) { - tor_free(m); - } -#else /* !(defined(MAXLINE)) */ - /* We have syslog but not MAXLINE. That's promising! */ - syslog(severity, "%s", msg_after_prefix); -#endif /* defined(MAXLINE) */ -#endif /* defined(HAVE_SYSLOG_H) */ - } else if (lf->is_android) { -#ifdef HAVE_ANDROID_LOG_H - int priority = severity_to_android_log_priority(severity); - __android_log_write(priority, lf->android_tag, msg_after_prefix); -#endif // HAVE_ANDROID_LOG_H. - } else if (lf->callback) { - if (domain & LD_NOCB) { - if (!*callbacks_deferred && pending_cb_messages) { - smartlist_add(pending_cb_messages, - pending_log_message_new(severity,domain,NULL,msg_after_prefix)); - *callbacks_deferred = 1; - } - } else { - lf->callback(severity, domain, msg_after_prefix); - } - } else { - if (write_all(lf->fd, buf, msg_len, 0) < 0) { /* error */ - /* don't log the error! mark this log entry to be blown away, and - * continue. */ - lf->seems_dead = 1; - } - } -} - /** Helper: sends a message to the appropriate logfiles, at loglevel * severity. If provided, funcname is prepended to the * message. The actual message is derived as from tor_snprintf(format,ap). */ -MOCK_IMPL(STATIC void, -logv,(int severity, log_domain_mask_t domain, const char *funcname, - const char *suffix, const char *format, va_list ap)) +static void +logv(int severity, log_domain_mask_t domain, const char *funcname, + const char *suffix, const char *format, va_list ap) { - char buf[10240]; + char buf[10024]; size_t msg_len = 0; int formatted = 0; logfile_t *lf; @@ -536,33 +348,29 @@ logv,(int severity, log_domain_mask_t domain, const char *funcname, int callbacks_deferred = 0; /* Call assert, not tor_assert, since tor_assert calls log on failure. */ - raw_assert(format); + assert(format); /* check that severity is sane. Overrunning the masks array leads to * interesting and hard to diagnose effects */ - raw_assert(severity >= LOG_ERR && severity <= LOG_DEBUG); - /* check that we've initialised the log mutex before we try to lock it */ - raw_assert(log_mutex_initialized); + assert(severity >= LOG_ERR && severity <= LOG_DEBUG); LOCK_LOGS(); - if ((! (domain & LD_NOCB)) && pending_cb_messages - && smartlist_len(pending_cb_messages)) + if ((! (domain & LD_NOCB)) && smartlist_len(pending_cb_messages)) flush_pending_log_callbacks(); - if (queue_startup_messages && - pending_startup_messages_len < MAX_STARTUP_MSG_LEN) { - end_of_prefix = - format_msg(buf, sizeof(buf), domain, severity, funcname, suffix, - format, ap, &msg_len); - formatted = 1; - - smartlist_add(pending_startup_messages, - pending_log_message_new(severity,domain,buf,end_of_prefix)); - pending_startup_messages_len += msg_len; - } - - for (lf = logfiles; lf; lf = lf->next) { - if (! logfile_wants_message(lf, severity, domain)) + lf = logfiles; + while (lf) { + if (! (lf->severities->masks[SEVERITY_MASK_IDX(severity)] & domain)) { + lf = lf->next; continue; + } + if (! (lf->fd >= 0 || lf->is_syslog || lf->callback)) { + lf = lf->next; + continue; + } + if (lf->seems_dead) { + lf = lf->next; + continue; + } if (!formatted) { end_of_prefix = @@ -571,8 +379,51 @@ logv,(int severity, log_domain_mask_t domain, const char *funcname, formatted = 1; } - logfile_deliver(lf, buf, msg_len, end_of_prefix, domain, severity, - &callbacks_deferred); + if (lf->is_syslog) { +#ifdef HAVE_SYSLOG_H + char *m = end_of_prefix; +#ifdef MAXLINE + /* Some syslog implementations have limits on the length of what you can + * pass them, and some very old ones do not detect overflow so well. + * Regrettably, they call their maximum line length MAXLINE. */ +#if MAXLINE < 64 +#warn "MAXLINE is a very low number; it might not be from syslog.h after all" +#endif + if (msg_len >= MAXLINE) + m = tor_strndup(end_of_prefix, MAXLINE-1); +#endif + syslog(severity, "%s", m); +#ifdef MAXLINE + if (m != end_of_prefix) { + tor_free(m); + } +#endif +#endif + lf = lf->next; + continue; + } else if (lf->callback) { + if (domain & LD_NOCB) { + if (!callbacks_deferred && pending_cb_messages) { + pending_cb_message_t *msg = tor_malloc(sizeof(pending_cb_message_t)); + msg->severity = severity; + msg->domain = domain; + msg->msg = tor_strdup(end_of_prefix); + smartlist_add(pending_cb_messages, msg); + + callbacks_deferred = 1; + } + } else { + lf->callback(severity, domain, end_of_prefix); + } + lf = lf->next; + continue; + } + if (write_all(lf->fd, buf, msg_len, 0) < 0) { /* error */ + /* don't log the error! mark this log entry to be blown away, and + * continue. */ + lf->seems_dead = 1; + } + lf = lf->next; } UNLOCK_LOGS(); } @@ -588,11 +439,6 @@ tor_log(int severity, log_domain_mask_t domain, const char *format, ...) if (severity > log_global_min_severity_) return; va_start(ap,format); -#ifdef TOR_UNIT_TESTS - if (domain & LD_NO_MOCK) - logv__real(severity, domain, NULL, NULL, format, ap); - else -#endif logv(severity, domain, NULL, NULL, format, ap); va_end(ap); } @@ -693,8 +539,8 @@ tor_log_update_sigsafe_err_fds(void) /* Don't try callback to the control port, or syslogs: We can't * do them from a signal handler. Don't try stdout: we always do stderr. */ - if (lf->is_temporary || logfile_is_external(lf) - || lf->seems_dead || lf->fd < 0) + if (lf->is_temporary || lf->is_syslog || + lf->callback || lf->seems_dead || lf->fd < 0) continue; if (lf->severities->masks[SEVERITY_MASK_IDX(LOG_ERR)] & (LD_BUG|LD_GENERAL)) { @@ -712,35 +558,16 @@ tor_log_update_sigsafe_err_fds(void) if (!found_real_stderr && int_array_contains(sigsafe_log_fds, n_sigsafe_log_fds, STDOUT_FILENO)) { /* Don't use a virtual stderr when we're also logging to stdout. */ - raw_assert(n_sigsafe_log_fds >= 2); /* Don't tor_assert inside log fns */ + assert(n_sigsafe_log_fds >= 2); /* Don't use assert inside log functions*/ sigsafe_log_fds[0] = sigsafe_log_fds[--n_sigsafe_log_fds]; } UNLOCK_LOGS(); } -/** Add to out a copy of every currently configured log file name. Used - * to enable access to these filenames with the sandbox code. */ -void -tor_log_get_logfile_names(smartlist_t *out) -{ - logfile_t *lf; - tor_assert(out); - - LOCK_LOGS(); - - for (lf = logfiles; lf; lf = lf->next) { - if (lf->is_temporary || logfile_is_external(lf)) - continue; - if (lf->filename == NULL) - continue; - smartlist_add_strdup(out, lf->filename); - } - - UNLOCK_LOGS(); -} - -/** Implementation of the log_fn backend, used when we have +/** Output a message to the log, prefixed with a function name fn. */ +#ifdef __GNUC__ +/** GCC-based implementation of the log_fn backend, used when we have * variadic macros. All arguments are as for log_fn, except for * fn, which is the name of the calling functions. */ void @@ -770,16 +597,107 @@ log_fn_ratelim_(ratelim_t *ratelim, int severity, log_domain_mask_t domain, va_end(ap); tor_free(m); } +#else +/** @{ */ +/** Variant implementation of log_fn, log_debug, log_info,... for C compilers + * without variadic macros. In this case, the calling function sets + * log_fn_function_name_ to the name of the function, then invokes the + * appropriate log_fn_, log_debug_, etc. */ +const char *log_fn_function_name_=NULL; +void +log_fn_(int severity, log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + if (severity > log_global_min_severity_) + return; + va_start(ap,format); + logv(severity, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +void +log_fn_ratelim_(ratelim_t *ratelim, int severity, log_domain_mask_t domain, + const char *format, ...) +{ + va_list ap; + char *m; + if (severity > log_global_min_severity_) + return; + m = rate_limit_log(ratelim, approx_time()); + if (m == NULL) + return; + va_start(ap, format); + logv(severity, domain, log_fn_function_name_, m, format, ap); + va_end(ap); + tor_free(m); +} +void +log_debug_(log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + /* For GCC we do this check in the macro. */ + if (PREDICT_LIKELY(LOG_DEBUG > log_global_min_severity_)) + return; + va_start(ap,format); + logv(LOG_DEBUG, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +void +log_info_(log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + if (LOG_INFO > log_global_min_severity_) + return; + va_start(ap,format); + logv(LOG_INFO, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +void +log_notice_(log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + if (LOG_NOTICE > log_global_min_severity_) + return; + va_start(ap,format); + logv(LOG_NOTICE, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +void +log_warn_(log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + if (LOG_WARN > log_global_min_severity_) + return; + va_start(ap,format); + logv(LOG_WARN, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +void +log_err_(log_domain_mask_t domain, const char *format, ...) +{ + va_list ap; + if (LOG_ERR > log_global_min_severity_) + return; + va_start(ap,format); + logv(LOG_ERR, domain, log_fn_function_name_, NULL, format, ap); + va_end(ap); + log_fn_function_name_ = NULL; +} +/** @} */ +#endif /** Free all storage held by victim. */ static void -log_free_(logfile_t *victim) +log_free(logfile_t *victim) { if (!victim) return; tor_free(victim->severities); tor_free(victim->filename); - tor_free(victim->android_tag); tor_free(victim); } @@ -788,14 +706,12 @@ void logs_free_all(void) { logfile_t *victim, *next; - smartlist_t *messages, *messages2; + smartlist_t *messages; LOCK_LOGS(); next = logfiles; logfiles = NULL; messages = pending_cb_messages; pending_cb_messages = NULL; - messages2 = pending_startup_messages; - pending_startup_messages = NULL; UNLOCK_LOGS(); while (next) { victim = next; @@ -805,18 +721,12 @@ logs_free_all(void) } tor_free(appname); - SMARTLIST_FOREACH(messages, pending_log_message_t *, msg, { - pending_log_message_free(msg); + SMARTLIST_FOREACH(messages, pending_cb_message_t *, msg, { + tor_free(msg->msg); + tor_free(msg); }); smartlist_free(messages); - if (messages2) { - SMARTLIST_FOREACH(messages2, pending_log_message_t *, msg, { - pending_log_message_free(msg); - }); - smartlist_free(messages2); - } - /* We _could_ destroy the log mutex here, but that would screw up any logs * that happened between here and the end of execution. */ } @@ -860,7 +770,7 @@ close_log(logfile_t *victim) /* There are no other syslogs; close the logging facility. */ closelog(); } -#endif /* defined(HAVE_SYSLOG_H) */ +#endif } } @@ -911,24 +821,14 @@ add_stream_log(const log_severity_list_t *severity, const char *name, int fd) /** Initialize the global logging facility */ void -init_logging(int disable_startup_queue) +init_logging(void) { if (!log_mutex_initialized) { tor_mutex_init(&log_mutex); log_mutex_initialized = 1; } -#ifdef __GNUC__ - if (strchr(__PRETTY_FUNCTION__, '(')) { - pretty_fn_has_parens = 1; - } -#endif if (pending_cb_messages == NULL) pending_cb_messages = smartlist_new(); - if (disable_startup_queue) - queue_startup_messages = 0; - if (pending_startup_messages == NULL && queue_startup_messages) { - pending_startup_messages = smartlist_new(); - } } /** Set whether we report logging domains as a part of our log messages. @@ -1006,7 +906,7 @@ flush_pending_log_callbacks(void) smartlist_t *messages, *messages_tmp; LOCK_LOGS(); - if (!pending_cb_messages || 0 == smartlist_len(pending_cb_messages)) { + if (0 == smartlist_len(pending_cb_messages)) { UNLOCK_LOGS(); return; } @@ -1014,7 +914,7 @@ flush_pending_log_callbacks(void) messages = pending_cb_messages; pending_cb_messages = smartlist_new(); do { - SMARTLIST_FOREACH_BEGIN(messages, pending_log_message_t *, msg) { + SMARTLIST_FOREACH_BEGIN(messages, pending_cb_message_t *, msg) { const int severity = msg->severity; const int domain = msg->domain; for (lf = logfiles; lf; lf = lf->next) { @@ -1024,7 +924,8 @@ flush_pending_log_callbacks(void) } lf->callback(severity, domain, msg->msg); } - pending_log_message_free(msg); + tor_free(msg->msg); + tor_free(msg); } SMARTLIST_FOREACH_END(msg); smartlist_clear(messages); @@ -1038,45 +939,6 @@ flush_pending_log_callbacks(void) UNLOCK_LOGS(); } -/** Flush all the messages we stored from startup while waiting for log - * initialization. - */ -void -flush_log_messages_from_startup(void) -{ - logfile_t *lf; - - LOCK_LOGS(); - queue_startup_messages = 0; - pending_startup_messages_len = 0; - if (! pending_startup_messages) - goto out; - - SMARTLIST_FOREACH_BEGIN(pending_startup_messages, pending_log_message_t *, - msg) { - int callbacks_deferred = 0; - for (lf = logfiles; lf; lf = lf->next) { - if (! logfile_wants_message(lf, msg->severity, msg->domain)) - continue; - - /* We configure a temporary startup log that goes to stdout, so we - * shouldn't replay to stdout/stderr*/ - if (lf->fd == STDOUT_FILENO || lf->fd == STDERR_FILENO) { - continue; - } - - logfile_deliver(lf, msg->fullmsg, strlen(msg->fullmsg), msg->msg, - msg->domain, msg->severity, &callbacks_deferred); - } - pending_log_message_free(msg); - } SMARTLIST_FOREACH_END(msg); - smartlist_free(pending_startup_messages); - pending_startup_messages = NULL; - - out: - UNLOCK_LOGS(); -} - /** Close any log handlers added by add_temp_log() or marked by * mark_logs_temp(). */ void @@ -1130,16 +992,12 @@ mark_logs_temp(void) * logfile fails, -1 is returned and errno is set appropriately (by open(2)). */ int -add_file_log(const log_severity_list_t *severity, const char *filename, - const int truncate_log) +add_file_log(const log_severity_list_t *severity, const char *filename) { int fd; logfile_t *lf; - int open_flags = O_WRONLY|O_CREAT; - open_flags |= truncate_log ? O_TRUNC : O_APPEND; - - fd = tor_open_cloexec(filename, open_flags, 0640); + fd = tor_open_cloexec(filename, O_WRONLY|O_CREAT|O_APPEND, 0644); if (fd<0) return -1; if (tor_fd_seekend(fd)<0) { @@ -1164,25 +1022,14 @@ add_file_log(const log_severity_list_t *severity, const char *filename, #ifdef HAVE_SYSLOG_H /** * Add a log handler to send messages to they system log facility. - * - * If this is the first log handler, opens syslog with ident Tor or - * Tor- if that is not NULL. */ int -add_syslog_log(const log_severity_list_t *severity, - const char* syslog_identity_tag) +add_syslog_log(const log_severity_list_t *severity) { logfile_t *lf; - if (syslog_count++ == 0) { + if (syslog_count++ == 0) /* This is the first syslog. */ - static char buf[256]; - if (syslog_identity_tag) { - tor_snprintf(buf, sizeof(buf), "Tor-%s", syslog_identity_tag); - } else { - tor_snprintf(buf, sizeof(buf), "Tor"); - } - openlog(buf, LOG_PID | LOG_NDELAY, LOGFACILITY); - } + openlog("Tor", LOG_PID | LOG_NDELAY, LOGFACILITY); lf = tor_malloc_zero(sizeof(logfile_t)); lf->fd = -1; @@ -1197,40 +1044,7 @@ add_syslog_log(const log_severity_list_t *severity, UNLOCK_LOGS(); return 0; } -#endif /* defined(HAVE_SYSLOG_H) */ - -#ifdef HAVE_ANDROID_LOG_H -/** - * Add a log handler to send messages to the Android platform log facility. - */ -int -add_android_log(const log_severity_list_t *severity, - const char *android_tag) -{ - logfile_t *lf = NULL; - - lf = tor_malloc_zero(sizeof(logfile_t)); - lf->fd = -1; - lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); - lf->filename = tor_strdup(""); - lf->is_android = 1; - - if (android_tag == NULL) - lf->android_tag = tor_strdup("Tor"); - else { - char buf[256]; - tor_snprintf(buf, sizeof(buf), "Tor-%s", android_tag); - lf->android_tag = tor_strdup(buf); - } - - LOCK_LOGS(); - lf->next = logfiles; - logfiles = lf; - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); - return 0; -} -#endif // HAVE_ANDROID_LOG_H. +#endif /** If level is a valid log severity, return the corresponding * numeric value. Otherwise, return -1. */ @@ -1262,8 +1076,7 @@ log_level_to_string(int level) static const char *domain_list[] = { "GENERAL", "CRYPTO", "NET", "CONFIG", "FS", "PROTOCOL", "MM", "HTTP", "APP", "CONTROL", "CIRC", "REND", "BUG", "DIR", "DIRSERV", - "OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL", - "SCHED", "GUARD", "CONSDIFF", NULL + "OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL", NULL }; /** Return a bitmask for the log domain for which domain is the name, @@ -1293,8 +1106,7 @@ domain_to_string(log_domain_mask_t domain, char *buf, size_t buflen) const char *d; int bit = tor_log2(domain); size_t n; - if ((unsigned)bit >= ARRAY_LENGTH(domain_list)-1 || - bit >= N_LOGGING_DOMAINS) { + if (bit >= N_LOGGING_DOMAINS) { tor_snprintf(buf, buflen, "", (long)domain); return buf+strlen(buf); } @@ -1399,15 +1211,16 @@ parse_log_severity_config(const char **cfg_ptr, if (!strcasecmpstart(cfg, "file") || !strcasecmpstart(cfg, "stderr") || !strcasecmpstart(cfg, "stdout") || - !strcasecmpstart(cfg, "syslog") || - !strcasecmpstart(cfg, "android")) { + !strcasecmpstart(cfg, "syslog")) { goto done; } if (got_an_unqualified_range > 1) return -1; - space = find_whitespace(cfg); + space = strchr(cfg, ' '); dash = strchr(cfg, '-'); + if (!space) + space = strchr(cfg, '\0'); if (dash && dash < space) { sev_lo = tor_strndup(cfg, dash-cfg); sev_hi = tor_strndup(dash+1, space-(dash+1)); @@ -1466,15 +1279,38 @@ switch_logs_debug(void) UNLOCK_LOGS(); } -/** Truncate all the log files. */ +#if 0 +static void +dump_log_info(logfile_t *lf) +{ + const char *tp; + + if (lf->filename) { + printf("=== log into \"%s\" (%s-%s) (%stemporary)\n", lf->filename, + sev_to_string(lf->min_loglevel), + sev_to_string(lf->max_loglevel), + lf->is_temporary?"":"not "); + } else if (lf->is_syslog) { + printf("=== syslog (%s-%s) (%stemporary)\n", + sev_to_string(lf->min_loglevel), + sev_to_string(lf->max_loglevel), + lf->is_temporary?"":"not "); + } else { + printf("=== log (%s-%s) (%stemporary)\n", + sev_to_string(lf->min_loglevel), + sev_to_string(lf->max_loglevel), + lf->is_temporary?"":"not "); + } +} + void -truncate_logs(void) +describe_logs(void) { logfile_t *lf; - for (lf = logfiles; lf; lf = lf->next) { - if (lf->fd >= 0) { - tor_ftruncate(lf->fd); - } - } + printf("==== BEGIN LOGS ====\n"); + for (lf = logfiles; lf; lf = lf->next) + dump_log_info(lf); + printf("==== END LOGS ====\n"); } +#endif diff --git a/src/tor/m4/ax_check_sign.m4 b/src/tor/m4/ax_check_sign.m4 deleted file mode 100644 index d67e114db..000000000 --- a/src/tor/m4/ax_check_sign.m4 +++ /dev/null @@ -1,54 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_sign.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_SIGN (TYPE, [ACTION-IF-SIGNED], [ACTION-IF-UNSIGNED], [INCLUDES]) -# -# DESCRIPTION -# -# Checks whether TYPE is signed or not. If no INCLUDES are specified, the -# default includes are used. If ACTION-IF-SIGNED is given, it is -# additional shell code to execute when the type is signed. If -# ACTION-IF-UNSIGNED is given, it is executed when the type is unsigned. -# -# This macro assumes that the type exists. Therefore the existence of the -# type should be checked before calling this macro. For example: -# -# AC_CHECK_HEADERS([wchar.h]) -# AC_CHECK_TYPE([wchar_t],,[ AC_MSG_ERROR([Type wchar_t not found.]) ]) -# AX_CHECK_SIGN([wchar_t], -# [ AC_DEFINE(WCHAR_T_SIGNED, 1, [Define if wchar_t is signed]) ], -# [ AC_DEFINE(WCHAR_T_UNSIGNED, 1, [Define if wchar_t is unsigned]) ], [ -# #ifdef HAVE_WCHAR_H -# #include -# #endif -# ]) -# -# LICENSE -# -# Copyright (c) 2008 Ville Laurikari -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AU_ALIAS([VL_CHECK_SIGN], [AX_CHECK_SIGN]) -AC_DEFUN([AX_CHECK_SIGN], [ - typename=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g"` - AC_CACHE_CHECK([whether $1 is signed], ax_cv_decl_${typename}_signed, [ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$4]], - [[ int foo @<:@ 1 - 2 * !((($1) -1) < 0) @:>@ ]])], - [ eval "ax_cv_decl_${typename}_signed=\"yes\"" ], - [ eval "ax_cv_decl_${typename}_signed=\"no\"" ])]) - symbolname=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g" | tr "a-z" "A-Z"` - if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then - $2 - elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then - $3 - fi -])dnl diff --git a/src/tor/m4/pc_from_ucontext.m4 b/src/tor/m4/pc_from_ucontext.m4 deleted file mode 100644 index 9b66bf752..000000000 --- a/src/tor/m4/pc_from_ucontext.m4 +++ /dev/null @@ -1,128 +0,0 @@ -# This file is from Google Performance Tools, svn revision r226. -# -# The Google Performance Tools license is: -######## -# Copyright (c) 2005, Google Inc. -# 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. -######## -# Original file follows below. - -# We want to access the "PC" (Program Counter) register from a struct -# ucontext. Every system has its own way of doing that. We try all the -# possibilities we know about. Note REG_PC should come first (REG_RIP -# is also defined on solaris, but does the wrong thing). - -# OpenBSD doesn't have ucontext.h, but we can get PC from ucontext_t -# by using signal.h. - -# The first argument of AC_PC_FROM_UCONTEXT will be invoked when we -# cannot find a way to obtain PC from ucontext. - -AC_DEFUN([AC_PC_FROM_UCONTEXT], - [AC_CHECK_HEADERS(ucontext.h) - # Redhat 7 has , but it barfs if we #include it directly - # (this was fixed in later redhats). works fine, so use that. - if grep "Red Hat Linux release 7" /etc/redhat-release >/dev/null 2>&1; then - AC_DEFINE(HAVE_SYS_UCONTEXT_H, 0, [ is broken on redhat 7]) - ac_cv_header_sys_ucontext_h=no - else - AC_CHECK_HEADERS(sys/ucontext.h) # ucontext on OS X 10.6 (at least) - fi - AC_CHECK_HEADERS(cygwin/signal.h) # ucontext on cywgin - AC_MSG_CHECKING([how to access the program counter from a struct ucontext]) - pc_fields=" uc_mcontext.gregs[[REG_PC]]" # Solaris x86 (32 + 64 bit) - pc_fields="$pc_fields uc_mcontext.gregs[[REG_EIP]]" # Linux (i386) - pc_fields="$pc_fields uc_mcontext.gregs[[REG_RIP]]" # Linux (x86_64) - pc_fields="$pc_fields uc_mcontext.sc_ip" # Linux (ia64) - pc_fields="$pc_fields uc_mcontext.uc_regs->gregs[[PT_NIP]]" # Linux (ppc) - pc_fields="$pc_fields uc_mcontext.gregs[[R15]]" # Linux (arm old [untested]) - pc_fields="$pc_fields uc_mcontext.arm_pc" # Linux (arm arch 5) - pc_fields="$pc_fields uc_mcontext.gp_regs[[PT_NIP]]" # Suse SLES 11 (ppc64) - pc_fields="$pc_fields uc_mcontext.mc_eip" # FreeBSD (i386) - pc_fields="$pc_fields uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested]) - pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_EIP]]" # NetBSD (i386) - pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_RIP]]" # NetBSD (x86_64) - pc_fields="$pc_fields uc_mcontext->ss.eip" # OS X (i386, <=10.4) - pc_fields="$pc_fields uc_mcontext->__ss.__eip" # OS X (i386, >=10.5) - pc_fields="$pc_fields uc_mcontext->ss.rip" # OS X (x86_64) - pc_fields="$pc_fields uc_mcontext->__ss.__rip" # OS X (>=10.5 [untested]) - pc_fields="$pc_fields uc_mcontext->ss.srr0" # OS X (ppc, ppc64 [untested]) - pc_fields="$pc_fields uc_mcontext->__ss.__srr0" # OS X (>=10.5 [untested]) - pc_field_found=false - for pc_field in $pc_fields; do - if ! $pc_field_found; then - # Prefer sys/ucontext.h to ucontext.h, for OS X's sake. - if test "x$ac_cv_header_cygwin_signal_h" = xyes; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ucontext_t u; return u.$pc_field == 0;]])], - AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, - How to access the PC from a struct ucontext) - AC_MSG_RESULT([$pc_field]) - pc_field_found=true) - elif test "x$ac_cv_header_sys_ucontext_h" = xyes; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ucontext_t u; return u.$pc_field == 0;]])], - AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, - How to access the PC from a struct ucontext) - AC_MSG_RESULT([$pc_field]) - pc_field_found=true) - elif test "x$ac_cv_header_ucontext_h" = xyes; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ucontext_t u; return u.$pc_field == 0;]])], - AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, - How to access the PC from a struct ucontext) - AC_MSG_RESULT([$pc_field]) - pc_field_found=true) - else # hope some standard header gives it to us - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], - [[ucontext_t u; return u.$pc_field == 0;]])], - AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, - How to access the PC from a struct ucontext) - AC_MSG_RESULT([$pc_field]) - pc_field_found=true) - fi - fi - done - if ! $pc_field_found; then - pc_fields=" sc_eip" # OpenBSD (i386) - pc_fields="$pc_fields sc_rip" # OpenBSD (x86_64) - for pc_field in $pc_fields; do - if ! $pc_field_found; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ucontext_t u; return u.$pc_field == 0;]])], - AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, - How to access the PC from a struct ucontext) - AC_MSG_RESULT([$pc_field]) - pc_field_found=true) - fi - done - fi - if ! $pc_field_found; then - [$1] - fi]) diff --git a/src/tor/m4/pkg.m4 b/src/tor/m4/pkg.m4 deleted file mode 100644 index c5b26b52e..000000000 --- a/src/tor/m4/pkg.m4 +++ /dev/null @@ -1,214 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 1 (pkg-config-0.24) -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) -m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) -AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) -AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -# only at the first occurence in configure.ac, so if the first place -# it's called might be skipped (such as if it is within an "if", you -# have to call PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_default([$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$$1"; then - pkg_cv_[]$1="$$1" - elif test -n "$PKG_CONFIG"; then - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes ], - [pkg_failed=yes]) - else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - m4_default([$4], [AC_MSG_ERROR( -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT])[]dnl - ]) -elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) - m4_default([$4], [AC_MSG_FAILURE( -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])[]dnl - ]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - $3 -fi[]dnl -])# PKG_CHECK_MODULES - - -# PKG_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable pkgconfigdir as the location where a module -# should install pkg-config .pc files. By default the directory is -# $libdir/pkgconfig, but the default can be changed by passing -# DIRECTORY. The user can override through the --with-pkgconfigdir -# parameter. -AC_DEFUN([PKG_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([pkgconfigdir], - [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, - [with_pkgconfigdir=]pkg_default) -AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_INSTALLDIR - - -# PKG_NOARCH_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable noarch_pkgconfigdir as the location where a -# module should install arch-independent pkg-config .pc files. By -# default the directory is $datadir/pkgconfig, but the default can be -# changed by passing DIRECTORY. The user can override through the -# --with-noarch-pkgconfigdir parameter. -AC_DEFUN([PKG_NOARCH_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([noarch-pkgconfigdir], - [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, - [with_noarch_pkgconfigdir=]pkg_default) -AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_NOARCH_INSTALLDIR - - -# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, -# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# ------------------------------------------- -# Retrieves the value of the pkg-config variable for the given module. -AC_DEFUN([PKG_CHECK_VAR], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl - -_PKG_CONFIG([$1], [variable="][$3]["], [$2]) -AS_VAR_COPY([$1], [pkg_cv_][$1]) - -AS_VAR_IF([$1], [""], [$5], [$4])dnl -])# PKG_CHECK_VAR diff --git a/src/tor/src/common/memarea.c b/src/tor/memarea.c similarity index 59% rename from src/tor/src/common/memarea.c rename to src/tor/memarea.c index 68c1625fe..96f95bf0d 100644 --- a/src/tor/src/common/memarea.c +++ b/src/tor/memarea.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2017, The Tor Project, Inc. */ +/* Copyright (c) 2008-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** \file memarea.c @@ -7,15 +7,11 @@ */ #include "orconfig.h" -#include #include #include "memarea.h" -#include "util.h" -#include "compat.h" +#include "tor_util.h" +#include "tor_compat.h" #include "torlog.h" -#include "container.h" - -#ifndef DISABLE_MEMORY_SENTINELS /** If true, we try to detect any attempts to write beyond the length of a * memarea. */ @@ -25,23 +21,13 @@ * value. */ #define MEMAREA_ALIGN SIZEOF_VOID_P -/** A value which, when masked out of a pointer, produces a maximally aligned - * pointer. */ #if MEMAREA_ALIGN == 4 -#define MEMAREA_ALIGN_MASK ((uintptr_t)3) +#define MEMAREA_ALIGN_MASK 3lu #elif MEMAREA_ALIGN == 8 -#define MEMAREA_ALIGN_MASK ((uintptr_t)7) +#define MEMAREA_ALIGN_MASK 7lu #else #error "void* is neither 4 nor 8 bytes long. I don't know how to align stuff." -#endif /* MEMAREA_ALIGN == 4 || ... */ - -#if defined(__GNUC__) && defined(FLEXIBLE_ARRAY_MEMBER) -#define USE_ALIGNED_ATTRIBUTE -/** Name for the 'memory' member of a memory chunk. */ -#define U_MEM mem -#else -#define U_MEM u.mem -#endif /* defined(__GNUC__) && defined(FLEXIBLE_ARRAY_MEMBER) */ +#endif #ifdef USE_SENTINELS /** Magic value that we stick at the end of a memarea so we can make sure @@ -53,22 +39,22 @@ * end, set those bytes. */ #define SET_SENTINEL(chunk) \ STMT_BEGIN \ - set_uint32( &(chunk)->U_MEM[chunk->mem_size], SENTINEL_VAL ); \ + set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \ STMT_END /** Assert that the sentinel on a memarea is set correctly. */ #define CHECK_SENTINEL(chunk) \ STMT_BEGIN \ - uint32_t sent_val = get_uint32(&(chunk)->U_MEM[chunk->mem_size]); \ + uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]); \ tor_assert(sent_val == SENTINEL_VAL); \ STMT_END -#else /* !(defined(USE_SENTINELS)) */ +#else #define SENTINEL_LEN 0 #define SET_SENTINEL(chunk) STMT_NIL #define CHECK_SENTINEL(chunk) STMT_NIL -#endif /* defined(USE_SENTINELS) */ +#endif /** Increment ptr until it is aligned to MEMAREA_ALIGN. */ -static inline void * +static INLINE void * realign_pointer(void *ptr) { uintptr_t x = (uintptr_t)ptr; @@ -85,24 +71,19 @@ realign_pointer(void *ptr) typedef struct memarea_chunk_t { /** Next chunk in this area. Only kept around so we can free it. */ struct memarea_chunk_t *next_chunk; - size_t mem_size; /**< How much RAM is available in mem, total? */ - char *next_mem; /**< Next position in mem to allocate data at. If it's - * equal to mem+mem_size, this chunk is full. */ -#ifdef USE_ALIGNED_ATTRIBUTE - /** Actual content of the memory chunk. */ - char mem[FLEXIBLE_ARRAY_MEMBER] __attribute__((aligned(MEMAREA_ALIGN))); -#else + size_t mem_size; /**< How much RAM is available in u.mem, total? */ + char *next_mem; /**< Next position in u.mem to allocate data at. If it's + * greater than or equal to mem+mem_size, this chunk is + * full. */ union { char mem[1]; /**< Memory space in this chunk. */ void *void_for_alignment_; /**< Dummy; used to make sure mem is aligned. */ - } u; /**< Union used to enforce alignment when we don't have support for - * doing it right. */ -#endif /* defined(USE_ALIGNED_ATTRIBUTE) */ + } u; } memarea_chunk_t; /** How many bytes are needed for overhead before we get to the memory part * of a chunk? */ -#define CHUNK_HEADER_SIZE offsetof(memarea_chunk_t, U_MEM) +#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, u) /** What's the smallest that we'll allocate a chunk? */ #define CHUNK_SIZE 4096 @@ -113,32 +94,56 @@ struct memarea_t { memarea_chunk_t *first; /**< Top of the chunk stack: never NULL. */ }; +/** How many chunks will we put into the freelist before freeing them? */ +#define MAX_FREELIST_LEN 4 +/** The number of memarea chunks currently in our freelist. */ +static int freelist_len=0; +/** A linked list of unused memory area chunks. Used to prevent us from + * spinning in malloc/free loops. */ +static memarea_chunk_t *freelist = NULL; + /** Helper: allocate a new memarea chunk of around chunk_size bytes. */ static memarea_chunk_t * -alloc_chunk(size_t sz) +alloc_chunk(size_t sz, int freelist_ok) { tor_assert(sz < SIZE_T_CEILING); - - size_t chunk_size = sz < CHUNK_SIZE ? CHUNK_SIZE : sz; - memarea_chunk_t *res; - chunk_size += SENTINEL_LEN; - res = tor_malloc(chunk_size); - res->next_chunk = NULL; - res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN; - res->next_mem = res->U_MEM; - tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN == - ((char*)res)+chunk_size); - tor_assert(realign_pointer(res->next_mem) == res->next_mem); - SET_SENTINEL(res); - return res; + if (freelist && freelist_ok) { + memarea_chunk_t *res = freelist; + freelist = res->next_chunk; + res->next_chunk = NULL; + --freelist_len; + CHECK_SENTINEL(res); + return res; + } else { + size_t chunk_size = freelist_ok ? CHUNK_SIZE : sz; + memarea_chunk_t *res; + chunk_size += SENTINEL_LEN; + res = tor_malloc(chunk_size); + res->next_chunk = NULL; + res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN; + res->next_mem = res->u.mem; + tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN == + ((char*)res)+chunk_size); + tor_assert(realign_pointer(res->next_mem) == res->next_mem); + SET_SENTINEL(res); + return res; + } } -/** Release chunk from a memarea. */ +/** Release chunk from a memarea, either by adding it to the freelist + * or by freeing it if the freelist is already too big. */ static void -memarea_chunk_free_unchecked(memarea_chunk_t *chunk) +chunk_free_unchecked(memarea_chunk_t *chunk) { CHECK_SENTINEL(chunk); - tor_free(chunk); + if (freelist_len < MAX_FREELIST_LEN) { + ++freelist_len; + chunk->next_chunk = freelist; + freelist = chunk; + chunk->next_mem = chunk->u.mem; + } else { + tor_free(chunk); + } } /** Allocate and return new memarea. */ @@ -146,19 +151,19 @@ memarea_t * memarea_new(void) { memarea_t *head = tor_malloc(sizeof(memarea_t)); - head->first = alloc_chunk(CHUNK_SIZE); + head->first = alloc_chunk(CHUNK_SIZE, 1); return head; } /** Free area, invalidating all pointers returned from memarea_alloc() * and friends for this area */ void -memarea_drop_all_(memarea_t *area) +memarea_drop_all(memarea_t *area) { memarea_chunk_t *chunk, *next; for (chunk = area->first; chunk; chunk = next) { next = chunk->next_chunk; - memarea_chunk_free_unchecked(chunk); + chunk_free_unchecked(chunk); } area->first = NULL; /*fail fast on */ tor_free(area); @@ -174,11 +179,24 @@ memarea_clear(memarea_t *area) if (area->first->next_chunk) { for (chunk = area->first->next_chunk; chunk; chunk = next) { next = chunk->next_chunk; - memarea_chunk_free_unchecked(chunk); + chunk_free_unchecked(chunk); } area->first->next_chunk = NULL; } - area->first->next_mem = area->first->U_MEM; + area->first->next_mem = area->first->u.mem; +} + +/** Remove all unused memarea chunks from the internal freelist. */ +void +memarea_clear_freelist(void) +{ + memarea_chunk_t *chunk, *next; + freelist_len = 0; + for (chunk = freelist; chunk; chunk = next) { + next = chunk->next_chunk; + tor_free(chunk); + } + freelist = NULL; } /** Return true iff p is in a range that has been returned by an @@ -189,7 +207,7 @@ memarea_owns_ptr(const memarea_t *area, const void *p) memarea_chunk_t *chunk; const char *ptr = p; for (chunk = area->first; chunk; chunk = chunk->next_chunk) { - if (ptr >= chunk->U_MEM && ptr < chunk->next_mem) + if (ptr >= chunk->u.mem && ptr < chunk->next_mem) return 1; } return 0; @@ -208,19 +226,16 @@ memarea_alloc(memarea_t *area, size_t sz) tor_assert(sz < SIZE_T_CEILING); if (sz == 0) sz = 1; - tor_assert(chunk->next_mem <= chunk->U_MEM + chunk->mem_size); - const size_t space_remaining = - (chunk->U_MEM + chunk->mem_size) - chunk->next_mem; - if (sz > space_remaining) { + if (chunk->next_mem+sz > chunk->u.mem+chunk->mem_size) { if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) { /* This allocation is too big. Stick it in a special chunk, and put * that chunk second in the list. */ - memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE); + memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE, 0); new_chunk->next_chunk = chunk->next_chunk; chunk->next_chunk = new_chunk; chunk = new_chunk; } else { - memarea_chunk_t *new_chunk = alloc_chunk(CHUNK_SIZE); + memarea_chunk_t *new_chunk = alloc_chunk(CHUNK_SIZE, 1); new_chunk->next_chunk = chunk; area->first = chunk = new_chunk; } @@ -229,8 +244,8 @@ memarea_alloc(memarea_t *area, size_t sz) result = chunk->next_mem; chunk->next_mem = chunk->next_mem + sz; /* Reinstate these if bug 930 ever comes back - tor_assert(chunk->next_mem >= chunk->U_MEM); - tor_assert(chunk->next_mem <= chunk->U_MEM+chunk->mem_size); + tor_assert(chunk->next_mem >= chunk->u.mem); + tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size); */ chunk->next_mem = realign_pointer(chunk->next_mem); return result; @@ -265,11 +280,14 @@ memarea_strdup(memarea_t *area, const char *s) char * memarea_strndup(memarea_t *area, const char *s, size_t n) { - size_t ln = 0; + size_t ln; char *result; + const char *cp, *end = s+n; tor_assert(n < SIZE_T_CEILING); - for (ln = 0; ln < n && s[ln]; ++ln) + for (cp = s; cp < end && *cp; ++cp) ; + /* cp now points to s+n, or to the 0 in the string. */ + ln = cp-s; result = memarea_alloc(area, ln+1); memcpy(result, s, ln); result[ln]='\0'; @@ -286,8 +304,8 @@ memarea_get_stats(memarea_t *area, size_t *allocated_out, size_t *used_out) for (chunk = area->first; chunk; chunk = chunk->next_chunk) { CHECK_SENTINEL(chunk); a += CHUNK_HEADER_SIZE + chunk->mem_size; - tor_assert(chunk->next_mem >= chunk->U_MEM); - u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->U_MEM); + tor_assert(chunk->next_mem >= chunk->u.mem); + u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->u.mem); } *allocated_out = a; *used_out = u; @@ -302,97 +320,9 @@ memarea_assert_ok(memarea_t *area) for (chunk = area->first; chunk; chunk = chunk->next_chunk) { CHECK_SENTINEL(chunk); - tor_assert(chunk->next_mem >= chunk->U_MEM); + tor_assert(chunk->next_mem >= chunk->u.mem); tor_assert(chunk->next_mem <= - (char*) realign_pointer(chunk->U_MEM+chunk->mem_size)); + (char*) realign_pointer(chunk->u.mem+chunk->mem_size)); } } -#else /* !(!defined(DISABLE_MEMORY_SENTINELS)) */ - -struct memarea_t { - smartlist_t *pieces; -}; - -memarea_t * -memarea_new(void) -{ - memarea_t *ma = tor_malloc_zero(sizeof(memarea_t)); - ma->pieces = smartlist_new(); - return ma; -} -void -memarea_drop_all_(memarea_t *area) -{ - memarea_clear(area); - smartlist_free(area->pieces); - tor_free(area); -} -void -memarea_clear(memarea_t *area) -{ - SMARTLIST_FOREACH(area->pieces, void *, p, tor_free_(p)); - smartlist_clear(area->pieces); -} -int -memarea_owns_ptr(const memarea_t *area, const void *ptr) -{ - SMARTLIST_FOREACH(area->pieces, const void *, p, if (ptr == p) return 1;); - return 0; -} - -void * -memarea_alloc(memarea_t *area, size_t sz) -{ - void *result = tor_malloc(sz); - smartlist_add(area->pieces, result); - return result; -} - -void * -memarea_alloc_zero(memarea_t *area, size_t sz) -{ - void *result = tor_malloc_zero(sz); - smartlist_add(area->pieces, result); - return result; -} -void * -memarea_memdup(memarea_t *area, const void *s, size_t n) -{ - void *r = memarea_alloc(area, n); - memcpy(r, s, n); - return r; -} -char * -memarea_strdup(memarea_t *area, const char *s) -{ - size_t n = strlen(s); - char *r = memarea_alloc(area, n+1); - memcpy(r, s, n); - r[n] = 0; - return r; -} -char * -memarea_strndup(memarea_t *area, const char *s, size_t n) -{ - size_t ln = strnlen(s, n); - char *r = memarea_alloc(area, ln+1); - memcpy(r, s, ln); - r[ln] = 0; - return r; -} -void -memarea_get_stats(memarea_t *area, - size_t *allocated_out, size_t *used_out) -{ - (void)area; - *allocated_out = *used_out = 128; -} -void -memarea_assert_ok(memarea_t *area) -{ - (void)area; -} - -#endif /* !defined(DISABLE_MEMORY_SENTINELS) */ - diff --git a/src/tor/src/common/memarea.h b/src/tor/memarea.h similarity index 68% rename from src/tor/src/common/memarea.h rename to src/tor/memarea.h index 5207e8a5b..8b88585d3 100644 --- a/src/tor/src/common/memarea.h +++ b/src/tor/memarea.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2017, The Tor Project, Inc. */ +/* Copyright (c) 2008-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Tor dependencies */ @@ -8,12 +8,7 @@ typedef struct memarea_t memarea_t; memarea_t *memarea_new(void); -void memarea_drop_all_(memarea_t *area); -#define memarea_drop_all(area) \ - do { \ - memarea_drop_all_(area); \ - (area) = NULL; \ - } while (0) +void memarea_drop_all(memarea_t *area); void memarea_clear(memarea_t *area); int memarea_owns_ptr(const memarea_t *area, const void *ptr); void *memarea_alloc(memarea_t *area, size_t sz); @@ -23,7 +18,8 @@ char *memarea_strdup(memarea_t *area, const char *s); char *memarea_strndup(memarea_t *area, const char *s, size_t n); void memarea_get_stats(memarea_t *area, size_t *allocated_out, size_t *used_out); +void memarea_clear_freelist(void); void memarea_assert_ok(memarea_t *area); -#endif /* !defined(TOR_MEMAREA_H) */ +#endif diff --git a/src/tor/mempool.c b/src/tor/mempool.c new file mode 100644 index 000000000..4102aa432 --- /dev/null +++ b/src/tor/mempool.c @@ -0,0 +1,628 @@ +/* Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ +#if 1 +/* Tor dependencies */ +#include "orconfig.h" +#endif + +#include +#include +#include "torint.h" +#include "crypto.h" +#define MEMPOOL_PRIVATE +#include "mempool.h" + +/* OVERVIEW: + * + * This is an implementation of memory pools for Tor cells. It may be + * useful for you too. + * + * Generally, a memory pool is an allocation strategy optimized for large + * numbers of identically-sized objects. Rather than the elaborate arena + * and coalescing strategies you need to get good performance for a + * general-purpose malloc(), pools use a series of large memory "chunks", + * each of which is carved into a bunch of smaller "items" or + * "allocations". + * + * To get decent performance, you need to: + * - Minimize the number of times you hit the underlying allocator. + * - Try to keep accesses as local in memory as possible. + * - Try to keep the common case fast. + * + * Our implementation uses three lists of chunks per pool. Each chunk can + * be either "full" (no more room for items); "empty" (no items); or + * "used" (not full, not empty). There are independent doubly-linked + * lists for each state. + * + * CREDIT: + * + * I wrote this after looking at 3 or 4 other pooling allocators, but + * without copying. The strategy this most resembles (which is funny, + * since that's the one I looked at longest ago) is the pool allocator + * underlying Python's obmalloc code. Major differences from obmalloc's + * pools are: + * - We don't even try to be threadsafe. + * - We only handle objects of one size. + * - Our list of empty chunks is doubly-linked, not singly-linked. + * (This could change pretty easily; it's only doubly-linked for + * consistency.) + * - We keep a list of full chunks (so we can have a "nuke everything" + * function). Obmalloc's pools leave full chunks to float unanchored. + * + * LIMITATIONS: + * - Not even slightly threadsafe. + * - Likes to have lots of items per chunks. + * - One pointer overhead per allocated thing. (The alternative is + * something like glib's use of an RB-tree to keep track of what + * chunk any given piece of memory is in.) + * - Only aligns allocated things to void* level: redefine ALIGNMENT_TYPE + * if you need doubles. + * - Could probably be optimized a bit; the representation contains + * a bit more info than it really needs to have. + */ + +#if 1 +/* Tor dependencies */ +#include "tor_util.h" +#include "tor_compat.h" +#include "torlog.h" +#define ALLOC(x) tor_malloc(x) +#define FREE(x) tor_free(x) +#define ASSERT(x) tor_assert(x) +#undef ALLOC_CAN_RETURN_NULL +#define TOR +/* End Tor dependencies */ +#else +/* If you're not building this as part of Tor, you'll want to define the + * following macros. For now, these should do as defaults. + */ +#include +#define PREDICT_UNLIKELY(x) (x) +#define PREDICT_LIKELY(x) (x) +#define ALLOC(x) malloc(x) +#define FREE(x) free(x) +#define STRUCT_OFFSET(tp, member) \ + ((off_t) (((char*)&((tp*)0)->member)-(char*)0)) +#define ASSERT(x) assert(x) +#define ALLOC_CAN_RETURN_NULL +#endif + +/* Tuning parameters */ +/** Largest type that we need to ensure returned memory items are aligned to. + * Change this to "double" if we need to be safe for structs with doubles. */ +#define ALIGNMENT_TYPE void * +/** Increment that we need to align allocated. */ +#define ALIGNMENT sizeof(ALIGNMENT_TYPE) +/** Largest memory chunk that we should allocate. */ +#define MAX_CHUNK (8*(1L<<20)) +/** Smallest memory chunk size that we should allocate. */ +#define MIN_CHUNK 4096 + +typedef struct mp_allocated_t mp_allocated_t; +typedef struct mp_chunk_t mp_chunk_t; + +/** Holds a single allocated item, allocated as part of a chunk. */ +struct mp_allocated_t { + /** The chunk that this item is allocated in. This adds overhead to each + * allocated item, thus making this implementation inappropriate for + * very small items. */ + mp_chunk_t *in_chunk; + union { + /** If this item is free, the next item on the free list. */ + mp_allocated_t *next_free; + /** If this item is not free, the actual memory contents of this item. + * (Not actual size.) */ + char mem[1]; + /** An extra element to the union to insure correct alignment. */ + ALIGNMENT_TYPE dummy_; + } u; +}; + +/** 'Magic' value used to detect memory corruption. */ +#define MP_CHUNK_MAGIC 0x09870123 + +/** A chunk of memory. Chunks come from malloc; we use them */ +struct mp_chunk_t { + unsigned long magic; /**< Must be MP_CHUNK_MAGIC if this chunk is valid. */ + mp_chunk_t *next; /**< The next free, used, or full chunk in sequence. */ + mp_chunk_t *prev; /**< The previous free, used, or full chunk in sequence. */ + mp_pool_t *pool; /**< The pool that this chunk is part of. */ + /** First free item in the freelist for this chunk. Note that this may be + * NULL even if this chunk is not at capacity: if so, the free memory at + * next_mem has not yet been carved into items. + */ + mp_allocated_t *first_free; + int n_allocated; /**< Number of currently allocated items in this chunk. */ + int capacity; /**< Number of items that can be fit into this chunk. */ + size_t mem_size; /**< Number of usable bytes in mem. */ + char *next_mem; /**< Pointer into part of mem not yet carved up. */ + char mem[FLEXIBLE_ARRAY_MEMBER]; /**< Storage for this chunk. */ +}; + +/** Number of extra bytes needed beyond mem_size to allocate a chunk. */ +#define CHUNK_OVERHEAD STRUCT_OFFSET(mp_chunk_t, mem[0]) + +/** Given a pointer to a mp_allocated_t, return a pointer to the memory + * item it holds. */ +#define A2M(a) (&(a)->u.mem) +/** Given a pointer to a memory_item_t, return a pointer to its enclosing + * mp_allocated_t. */ +#define M2A(p) ( ((char*)p) - STRUCT_OFFSET(mp_allocated_t, u.mem) ) + +#ifdef ALLOC_CAN_RETURN_NULL +/** If our ALLOC() macro can return NULL, check whether x is NULL, + * and if so, return NULL. */ +#define CHECK_ALLOC(x) \ + if (PREDICT_UNLIKELY(!x)) { return NULL; } +#else +/** If our ALLOC() macro can't return NULL, do nothing. */ +#define CHECK_ALLOC(x) +#endif + +/** Helper: Allocate and return a new memory chunk for pool. Does not + * link the chunk into any list. */ +static mp_chunk_t * +mp_chunk_new(mp_pool_t *pool) +{ + size_t sz = pool->new_chunk_capacity * pool->item_alloc_size; + mp_chunk_t *chunk = ALLOC(CHUNK_OVERHEAD + sz); + +#ifdef MEMPOOL_STATS + ++pool->total_chunks_allocated; +#endif + CHECK_ALLOC(chunk); + memset(chunk, 0, sizeof(mp_chunk_t)); /* Doesn't clear the whole thing. */ + chunk->magic = MP_CHUNK_MAGIC; + chunk->capacity = pool->new_chunk_capacity; + chunk->mem_size = sz; + chunk->next_mem = chunk->mem; + chunk->pool = pool; + return chunk; +} + +/** Take a chunk that has just been allocated or removed from + * pool's empty chunk list, and add it to the head of the used chunk + * list. */ +static INLINE void +add_newly_used_chunk_to_used_list(mp_pool_t *pool, mp_chunk_t *chunk) +{ + chunk->next = pool->used_chunks; + if (chunk->next) + chunk->next->prev = chunk; + pool->used_chunks = chunk; + ASSERT(!chunk->prev); +} + +/** Return a newly allocated item from pool. */ +void * +mp_pool_get(mp_pool_t *pool) +{ + mp_chunk_t *chunk; + mp_allocated_t *allocated; + + if (PREDICT_LIKELY(pool->used_chunks != NULL)) { + /* Common case: there is some chunk that is neither full nor empty. Use + * that one. (We can't use the full ones, obviously, and we should fill + * up the used ones before we start on any empty ones. */ + chunk = pool->used_chunks; + + } else if (pool->empty_chunks) { + /* We have no used chunks, but we have an empty chunk that we haven't + * freed yet: use that. (We pull from the front of the list, which should + * get us the most recently emptied chunk.) */ + chunk = pool->empty_chunks; + + /* Remove the chunk from the empty list. */ + pool->empty_chunks = chunk->next; + if (chunk->next) + chunk->next->prev = NULL; + + /* Put the chunk on the 'used' list*/ + add_newly_used_chunk_to_used_list(pool, chunk); + + ASSERT(!chunk->prev); + --pool->n_empty_chunks; + if (pool->n_empty_chunks < pool->min_empty_chunks) + pool->min_empty_chunks = pool->n_empty_chunks; + } else { + /* We have no used or empty chunks: allocate a new chunk. */ + chunk = mp_chunk_new(pool); + CHECK_ALLOC(chunk); + + /* Add the new chunk to the used list. */ + add_newly_used_chunk_to_used_list(pool, chunk); + } + + ASSERT(chunk->n_allocated < chunk->capacity); + + if (chunk->first_free) { + /* If there's anything on the chunk's freelist, unlink it and use it. */ + allocated = chunk->first_free; + chunk->first_free = allocated->u.next_free; + allocated->u.next_free = NULL; /* For debugging; not really needed. */ + ASSERT(allocated->in_chunk == chunk); + } else { + /* Otherwise, the chunk had better have some free space left on it. */ + ASSERT(chunk->next_mem + pool->item_alloc_size <= + chunk->mem + chunk->mem_size); + + /* Good, it did. Let's carve off a bit of that free space, and use + * that. */ + allocated = (void*)chunk->next_mem; + chunk->next_mem += pool->item_alloc_size; + allocated->in_chunk = chunk; + allocated->u.next_free = NULL; /* For debugging; not really needed. */ + } + + ++chunk->n_allocated; +#ifdef MEMPOOL_STATS + ++pool->total_items_allocated; +#endif + + if (PREDICT_UNLIKELY(chunk->n_allocated == chunk->capacity)) { + /* This chunk just became full. */ + ASSERT(chunk == pool->used_chunks); + ASSERT(chunk->prev == NULL); + + /* Take it off the used list. */ + pool->used_chunks = chunk->next; + if (chunk->next) + chunk->next->prev = NULL; + + /* Put it on the full list. */ + chunk->next = pool->full_chunks; + if (chunk->next) + chunk->next->prev = chunk; + pool->full_chunks = chunk; + } + /* And return the memory portion of the mp_allocated_t. */ + return A2M(allocated); +} + +/** Return an allocated memory item to its memory pool. */ +void +mp_pool_release(void *item) +{ + mp_allocated_t *allocated = (void*) M2A(item); + mp_chunk_t *chunk = allocated->in_chunk; + + ASSERT(chunk); + ASSERT(chunk->magic == MP_CHUNK_MAGIC); + ASSERT(chunk->n_allocated > 0); + + allocated->u.next_free = chunk->first_free; + chunk->first_free = allocated; + + if (PREDICT_UNLIKELY(chunk->n_allocated == chunk->capacity)) { + /* This chunk was full and is about to be used. */ + mp_pool_t *pool = chunk->pool; + /* unlink from the full list */ + if (chunk->prev) + chunk->prev->next = chunk->next; + if (chunk->next) + chunk->next->prev = chunk->prev; + if (chunk == pool->full_chunks) + pool->full_chunks = chunk->next; + + /* link to the used list. */ + chunk->next = pool->used_chunks; + chunk->prev = NULL; + if (chunk->next) + chunk->next->prev = chunk; + pool->used_chunks = chunk; + } else if (PREDICT_UNLIKELY(chunk->n_allocated == 1)) { + /* This was used and is about to be empty. */ + mp_pool_t *pool = chunk->pool; + + /* Unlink from the used list */ + if (chunk->prev) + chunk->prev->next = chunk->next; + if (chunk->next) + chunk->next->prev = chunk->prev; + if (chunk == pool->used_chunks) + pool->used_chunks = chunk->next; + + /* Link to the empty list */ + chunk->next = pool->empty_chunks; + chunk->prev = NULL; + if (chunk->next) + chunk->next->prev = chunk; + pool->empty_chunks = chunk; + + /* Reset the guts of this chunk to defragment it, in case it gets + * used again. */ + chunk->first_free = NULL; + chunk->next_mem = chunk->mem; + + ++pool->n_empty_chunks; + } + --chunk->n_allocated; +} + +/** Allocate a new memory pool to hold items of size item_size. We'll + * try to fit about chunk_capacity bytes in each chunk. */ +mp_pool_t * +mp_pool_new(size_t item_size, size_t chunk_capacity) +{ + mp_pool_t *pool; + size_t alloc_size, new_chunk_cap; + + tor_assert(item_size < SIZE_T_CEILING); + tor_assert(chunk_capacity < SIZE_T_CEILING); + tor_assert(SIZE_T_CEILING / item_size > chunk_capacity); + + pool = ALLOC(sizeof(mp_pool_t)); + CHECK_ALLOC(pool); + memset(pool, 0, sizeof(mp_pool_t)); + + /* First, we figure out how much space to allow per item. We'll want to + * use make sure we have enough for the overhead plus the item size. */ + alloc_size = (size_t)(STRUCT_OFFSET(mp_allocated_t, u.mem) + item_size); + /* If the item_size is less than sizeof(next_free), we need to make + * the allocation bigger. */ + if (alloc_size < sizeof(mp_allocated_t)) + alloc_size = sizeof(mp_allocated_t); + + /* If we're not an even multiple of ALIGNMENT, round up. */ + if (alloc_size % ALIGNMENT) { + alloc_size = alloc_size + ALIGNMENT - (alloc_size % ALIGNMENT); + } + if (alloc_size < ALIGNMENT) + alloc_size = ALIGNMENT; + ASSERT((alloc_size % ALIGNMENT) == 0); + + /* Now we figure out how many items fit in each chunk. We need to fit at + * least 2 items per chunk. No chunk can be more than MAX_CHUNK bytes long, + * or less than MIN_CHUNK. */ + if (chunk_capacity > MAX_CHUNK) + chunk_capacity = MAX_CHUNK; + /* Try to be around a power of 2 in size, since that's what allocators like + * handing out. 512K-1 byte is a lot better than 512K+1 byte. */ + chunk_capacity = (size_t) round_to_power_of_2(chunk_capacity); + while (chunk_capacity < alloc_size * 2 + CHUNK_OVERHEAD) + chunk_capacity *= 2; + if (chunk_capacity < MIN_CHUNK) + chunk_capacity = MIN_CHUNK; + + new_chunk_cap = (chunk_capacity-CHUNK_OVERHEAD) / alloc_size; + tor_assert(new_chunk_cap < INT_MAX); + pool->new_chunk_capacity = (int)new_chunk_cap; + + pool->item_alloc_size = alloc_size; + + log_debug(LD_MM, "Capacity is %lu, item size is %lu, alloc size is %lu", + (unsigned long)pool->new_chunk_capacity, + (unsigned long)pool->item_alloc_size, + (unsigned long)(pool->new_chunk_capacity*pool->item_alloc_size)); + + return pool; +} + +/** Helper function for qsort: used to sort pointers to mp_chunk_t into + * descending order of fullness. */ +static int +mp_pool_sort_used_chunks_helper(const void *_a, const void *_b) +{ + mp_chunk_t *a = *(mp_chunk_t**)_a; + mp_chunk_t *b = *(mp_chunk_t**)_b; + return b->n_allocated - a->n_allocated; +} + +/** Sort the used chunks in pool into descending order of fullness, + * so that we preferentially fill up mostly full chunks before we make + * nearly empty chunks less nearly empty. */ +static void +mp_pool_sort_used_chunks(mp_pool_t *pool) +{ + int i, n=0, inverted=0; + mp_chunk_t **chunks, *chunk; + for (chunk = pool->used_chunks; chunk; chunk = chunk->next) { + ++n; + if (chunk->next && chunk->next->n_allocated > chunk->n_allocated) + ++inverted; + } + if (!inverted) + return; + //printf("Sort %d/%d\n",inverted,n); + chunks = ALLOC(sizeof(mp_chunk_t *)*n); +#ifdef ALLOC_CAN_RETURN_NULL + if (PREDICT_UNLIKELY(!chunks)) return; +#endif + for (i=0,chunk = pool->used_chunks; chunk; chunk = chunk->next) + chunks[i++] = chunk; + qsort(chunks, n, sizeof(mp_chunk_t *), mp_pool_sort_used_chunks_helper); + pool->used_chunks = chunks[0]; + chunks[0]->prev = NULL; + for (i=1;inext = chunks[i]; + chunks[i]->prev = chunks[i-1]; + } + chunks[n-1]->next = NULL; + FREE(chunks); + mp_pool_assert_ok(pool); +} + +/** If there are more than n empty chunks in pool, free the + * excess ones that have been empty for the longest. If + * keep_recently_used is true, do not free chunks unless they have been + * empty since the last call to this function. + **/ +void +mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used) +{ + mp_chunk_t *chunk, **first_to_free; + + mp_pool_sort_used_chunks(pool); + ASSERT(n_to_keep >= 0); + + if (keep_recently_used) { + int n_recently_used = pool->n_empty_chunks - pool->min_empty_chunks; + if (n_to_keep < n_recently_used) + n_to_keep = n_recently_used; + } + + ASSERT(n_to_keep >= 0); + + first_to_free = &pool->empty_chunks; + while (*first_to_free && n_to_keep > 0) { + first_to_free = &(*first_to_free)->next; + --n_to_keep; + } + if (!*first_to_free) { + pool->min_empty_chunks = pool->n_empty_chunks; + return; + } + + chunk = *first_to_free; + while (chunk) { + mp_chunk_t *next = chunk->next; + chunk->magic = 0xdeadbeef; + FREE(chunk); +#ifdef MEMPOOL_STATS + ++pool->total_chunks_freed; +#endif + --pool->n_empty_chunks; + chunk = next; + } + + pool->min_empty_chunks = pool->n_empty_chunks; + *first_to_free = NULL; +} + +/** Helper: Given a list of chunks, free all the chunks in the list. */ +static void +destroy_chunks(mp_chunk_t *chunk) +{ + mp_chunk_t *next; + while (chunk) { + chunk->magic = 0xd3adb33f; + next = chunk->next; + FREE(chunk); + chunk = next; + } +} + +/** Free all space held in pool This makes all pointers returned from + * mp_pool_get(pool) invalid. */ +void +mp_pool_destroy(mp_pool_t *pool) +{ + destroy_chunks(pool->empty_chunks); + destroy_chunks(pool->used_chunks); + destroy_chunks(pool->full_chunks); + memwipe(pool, 0xe0, sizeof(mp_pool_t)); + FREE(pool); +} + +/** Helper: make sure that a given chunk list is not corrupt. */ +static int +assert_chunks_ok(mp_pool_t *pool, mp_chunk_t *chunk, int empty, int full) +{ + mp_allocated_t *allocated; + int n = 0; + if (chunk) + ASSERT(chunk->prev == NULL); + + while (chunk) { + n++; + ASSERT(chunk->magic == MP_CHUNK_MAGIC); + ASSERT(chunk->pool == pool); + for (allocated = chunk->first_free; allocated; + allocated = allocated->u.next_free) { + ASSERT(allocated->in_chunk == chunk); + } + if (empty) + ASSERT(chunk->n_allocated == 0); + else if (full) + ASSERT(chunk->n_allocated == chunk->capacity); + else + ASSERT(chunk->n_allocated > 0 && chunk->n_allocated < chunk->capacity); + + ASSERT(chunk->capacity == pool->new_chunk_capacity); + + ASSERT(chunk->mem_size == + pool->new_chunk_capacity * pool->item_alloc_size); + + ASSERT(chunk->next_mem >= chunk->mem && + chunk->next_mem <= chunk->mem + chunk->mem_size); + + if (chunk->next) + ASSERT(chunk->next->prev == chunk); + + chunk = chunk->next; + } + return n; +} + +/** Fail with an assertion if pool is not internally consistent. */ +void +mp_pool_assert_ok(mp_pool_t *pool) +{ + int n_empty; + + n_empty = assert_chunks_ok(pool, pool->empty_chunks, 1, 0); + assert_chunks_ok(pool, pool->full_chunks, 0, 1); + assert_chunks_ok(pool, pool->used_chunks, 0, 0); + + ASSERT(pool->n_empty_chunks == n_empty); +} + +#ifdef TOR +/** Dump information about pool's memory usage to the Tor log at level + * severity. */ +/*FFFF uses Tor logging functions. */ +void +mp_pool_log_status(mp_pool_t *pool, int severity) +{ + uint64_t bytes_used = 0; + uint64_t bytes_allocated = 0; + uint64_t bu = 0, ba = 0; + mp_chunk_t *chunk; + int n_full = 0, n_used = 0; + + ASSERT(pool); + + for (chunk = pool->empty_chunks; chunk; chunk = chunk->next) { + bytes_allocated += chunk->mem_size; + } + log_fn(severity, LD_MM, U64_FORMAT" bytes in %d empty chunks", + U64_PRINTF_ARG(bytes_allocated), pool->n_empty_chunks); + for (chunk = pool->used_chunks; chunk; chunk = chunk->next) { + ++n_used; + bu += chunk->n_allocated * pool->item_alloc_size; + ba += chunk->mem_size; + log_fn(severity, LD_MM, " used chunk: %d items allocated", + chunk->n_allocated); + } + log_fn(severity, LD_MM, U64_FORMAT"/"U64_FORMAT + " bytes in %d partially full chunks", + U64_PRINTF_ARG(bu), U64_PRINTF_ARG(ba), n_used); + bytes_used += bu; + bytes_allocated += ba; + bu = ba = 0; + for (chunk = pool->full_chunks; chunk; chunk = chunk->next) { + ++n_full; + bu += chunk->n_allocated * pool->item_alloc_size; + ba += chunk->mem_size; + } + log_fn(severity, LD_MM, U64_FORMAT"/"U64_FORMAT + " bytes in %d full chunks", + U64_PRINTF_ARG(bu), U64_PRINTF_ARG(ba), n_full); + bytes_used += bu; + bytes_allocated += ba; + + log_fn(severity, LD_MM, "Total: "U64_FORMAT"/"U64_FORMAT" bytes allocated " + "for cell pools are full.", + U64_PRINTF_ARG(bytes_used), U64_PRINTF_ARG(bytes_allocated)); + +#ifdef MEMPOOL_STATS + log_fn(severity, LD_MM, U64_FORMAT" cell allocations ever; " + U64_FORMAT" chunk allocations ever; " + U64_FORMAT" chunk frees ever.", + U64_PRINTF_ARG(pool->total_items_allocated), + U64_PRINTF_ARG(pool->total_chunks_allocated), + U64_PRINTF_ARG(pool->total_chunks_freed)); +#endif +} +#endif + diff --git a/src/tor/mempool.h b/src/tor/mempool.h new file mode 100644 index 000000000..0fc1e4c67 --- /dev/null +++ b/src/tor/mempool.h @@ -0,0 +1,65 @@ +/* Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file mempool.h + * \brief Headers for mempool.c + **/ + +#ifndef TOR_MEMPOOL_H +#define TOR_MEMPOOL_H + +/** A memory pool is a context in which a large number of fixed-sized +* objects can be allocated efficiently. See mempool.c for implementation +* details. */ +typedef struct mp_pool_t mp_pool_t; + +void *mp_pool_get(mp_pool_t *pool); +void mp_pool_release(void *item); +mp_pool_t *mp_pool_new(size_t item_size, size_t chunk_capacity); +void mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used); +void mp_pool_destroy(mp_pool_t *pool); +void mp_pool_assert_ok(mp_pool_t *pool); +void mp_pool_log_status(mp_pool_t *pool, int severity); + +#define MP_POOL_ITEM_OVERHEAD (sizeof(void*)) + +#define MEMPOOL_STATS + +#ifdef MEMPOOL_PRIVATE +/* These declarations are only used by mempool.c and test.c */ + +struct mp_pool_t { + /** Doubly-linked list of chunks in which no items have been allocated. + * The front of the list is the most recently emptied chunk. */ + struct mp_chunk_t *empty_chunks; + /** Doubly-linked list of chunks in which some items have been allocated, + * but which are not yet full. The front of the list is the chunk that has + * most recently been modified. */ + struct mp_chunk_t *used_chunks; + /** Doubly-linked list of chunks in which no more items can be allocated. + * The front of the list is the chunk that has most recently become full. */ + struct mp_chunk_t *full_chunks; + /** Length of empty_chunks. */ + int n_empty_chunks; + /** Lowest value of empty_chunks since last call to + * mp_pool_clean(-1). */ + int min_empty_chunks; + /** Size of each chunk (in items). */ + int new_chunk_capacity; + /** Size to allocate for each item, including overhead and alignment + * padding. */ + size_t item_alloc_size; +#ifdef MEMPOOL_STATS + /** Total number of items allocated ever. */ + uint64_t total_items_allocated; + /** Total number of chunks allocated ever. */ + uint64_t total_chunks_allocated; + /** Total number of chunks freed ever. */ + uint64_t total_chunks_freed; +#endif +}; +#endif + +#endif + diff --git a/src/tor/src/or/microdesc.c b/src/tor/microdesc.c similarity index 68% rename from src/tor/src/or/microdesc.c rename to src/tor/microdesc.c index d8a4660af..11249910c 100644 --- a/src/tor/src/or/microdesc.c +++ b/src/tor/microdesc.c @@ -1,13 +1,6 @@ -/* Copyright (c) 2009-2017, The Tor Project, Inc. */ +/* Copyright (c) 2009-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file microdesc.c - * - * \brief Implements microdescriptors -- an abbreviated description of - * less-frequently-changing router information. - */ - #include "or.h" #include "circuitbuild.h" #include "config.h" @@ -46,129 +39,32 @@ struct microdesc_cache_t { uint64_t total_len_seen; /** Total number of microdescriptors we have added to this cache */ unsigned n_seen; - - /** True iff we have loaded this cache from disk ever. */ - int is_loaded; }; -static microdesc_cache_t *get_microdesc_cache_noload(void); - /** Helper: computes a hash of md to place it in a hash table. */ -static inline unsigned int +static INLINE unsigned int microdesc_hash_(microdesc_t *md) { - return (unsigned) siphash24g(md->digest, sizeof(md->digest)); + unsigned *d = (unsigned*)md->digest; +#if SIZEOF_INT == 4 + return d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7]; +#else + return d[0] ^ d[1] ^ d[2] ^ d[3]; +#endif } -/** Helper: compares a and b for equality for hash-table - * purposes. */ -static inline int +/** Helper: compares a and for equality for hash-table purposes. */ +static INLINE int microdesc_eq_(microdesc_t *a, microdesc_t *b) { return tor_memeq(a->digest, b->digest, DIGEST256_LEN); } HT_PROTOTYPE(microdesc_map, microdesc_t, node, - microdesc_hash_, microdesc_eq_) -HT_GENERATE2(microdesc_map, microdesc_t, node, + microdesc_hash_, microdesc_eq_); +HT_GENERATE(microdesc_map, microdesc_t, node, microdesc_hash_, microdesc_eq_, 0.6, - tor_reallocarray_, tor_free_) - -/************************* md fetch fail cache *****************************/ - -/* If we end up with too many outdated dirservers, something probably went - * wrong so clean up the list. */ -#define TOO_MANY_OUTDATED_DIRSERVERS 30 - -/** List of dirservers with outdated microdesc information. The smartlist is - * filled with the hex digests of outdated dirservers. */ -static smartlist_t *outdated_dirserver_list = NULL; - -/** Note that we failed to fetch a microdescriptor from the relay with - * relay_digest (of size DIGEST_LEN). */ -void -microdesc_note_outdated_dirserver(const char *relay_digest) -{ - char relay_hexdigest[HEX_DIGEST_LEN+1]; - - /* Don't register outdated dirservers if we don't have a live consensus, - * since we might be trying to fetch microdescriptors that are not even - * currently active. */ - if (!networkstatus_get_live_consensus(approx_time())) { - return; - } - - if (!outdated_dirserver_list) { - outdated_dirserver_list = smartlist_new(); - } - - tor_assert(outdated_dirserver_list); - - /* If the list grows too big, clean it up */ - if (BUG(smartlist_len(outdated_dirserver_list) > - TOO_MANY_OUTDATED_DIRSERVERS)) { - microdesc_reset_outdated_dirservers_list(); - } - - /* Turn the binary relay digest to a hex since smartlists have better support - * for strings than digests. */ - base16_encode(relay_hexdigest,sizeof(relay_hexdigest), - relay_digest, DIGEST_LEN); - - /* Make sure we don't add a dirauth as an outdated dirserver */ - if (router_get_trusteddirserver_by_digest(relay_digest)) { - log_info(LD_GENERAL, "Auth %s gave us outdated dirinfo.", relay_hexdigest); - return; - } - - /* Don't double-add outdated dirservers */ - if (smartlist_contains_string(outdated_dirserver_list, relay_hexdigest)) { - return; - } - - /* Add it to the list of outdated dirservers */ - smartlist_add_strdup(outdated_dirserver_list, relay_hexdigest); - - log_info(LD_GENERAL, "Noted %s as outdated md dirserver", relay_hexdigest); -} - -/** Return True if the relay with relay_digest (size DIGEST_LEN) is an - * outdated dirserver */ -int -microdesc_relay_is_outdated_dirserver(const char *relay_digest) -{ - char relay_hexdigest[HEX_DIGEST_LEN+1]; - - if (!outdated_dirserver_list) { - return 0; - } - - /* Convert identity digest to hex digest */ - base16_encode(relay_hexdigest, sizeof(relay_hexdigest), - relay_digest, DIGEST_LEN); - - /* Last time we tried to fetch microdescs, was this directory mirror missing - * any mds we asked for? */ - if (smartlist_contains_string(outdated_dirserver_list, relay_hexdigest)) { - return 1; - } - - return 0; -} - -/** Reset the list of outdated dirservers. */ -void -microdesc_reset_outdated_dirservers_list(void) -{ - if (!outdated_dirserver_list) { - return; - } - - SMARTLIST_FOREACH(outdated_dirserver_list, char *, cp, tor_free(cp)); - smartlist_clear(outdated_dirserver_list); -} - -/****************************************************************************/ + malloc, realloc, free); /** Write the body of md into f, with appropriate annotations. * On success, return the total number of bytes written, and set @@ -204,7 +100,6 @@ dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out) md->off = tor_fd_getpos(fd); written = write_all(fd, md->body, md->bodylen, 0); if (written != (ssize_t)md->bodylen) { - written = written < 0 ? 0 : written; log_warn(LD_DIR, "Couldn't dump microdescriptor (wrote %ld out of %lu): %s", (long)written, (unsigned long)md->bodylen, @@ -222,24 +117,13 @@ static microdesc_cache_t *the_microdesc_cache = NULL; /** Return a pointer to the microdescriptor cache, loading it if necessary. */ microdesc_cache_t * get_microdesc_cache(void) -{ - microdesc_cache_t *cache = get_microdesc_cache_noload(); - if (PREDICT_UNLIKELY(cache->is_loaded == 0)) { - microdesc_cache_reload(cache); - } - return cache; -} - -/** Return a pointer to the microdescriptor cache, creating (but not loading) - * it if necessary. */ -static microdesc_cache_t * -get_microdesc_cache_noload(void) { if (PREDICT_UNLIKELY(the_microdesc_cache==NULL)) { - microdesc_cache_t *cache = tor_malloc_zero(sizeof(*cache)); + microdesc_cache_t *cache = tor_malloc_zero(sizeof(microdesc_cache_t)); HT_INIT(microdesc_map, &cache->map); - cache->cache_fname = get_cachedir_fname("cached-microdescs"); - cache->journal_fname = get_cachedir_fname("cached-microdescs.new"); + cache->cache_fname = get_datadir_fname("cached-microdescs"); + cache->journal_fname = get_datadir_fname("cached-microdescs.new"); + microdesc_cache_reload(cache); the_microdesc_cache = cache; } return the_microdesc_cache; @@ -268,81 +152,39 @@ microdescs_add_to_cache(microdesc_cache_t *cache, int no_save, time_t listed_at, smartlist_t *requested_digests256) { - void * const DIGEST_REQUESTED = (void*)1; - void * const DIGEST_RECEIVED = (void*)2; - void * const DIGEST_INVALID = (void*)3; - smartlist_t *descriptors, *added; const int allow_annotations = (where != SAVED_NOWHERE); - smartlist_t *invalid_digests = smartlist_new(); descriptors = microdescs_parse_from_string(s, eos, allow_annotations, - where, invalid_digests); + where); if (listed_at != (time_t)-1) { SMARTLIST_FOREACH(descriptors, microdesc_t *, md, md->last_listed = listed_at); } if (requested_digests256) { - digest256map_t *requested; - requested = digest256map_new(); - /* Set requested[d] to DIGEST_REQUESTED for every md we requested. */ - SMARTLIST_FOREACH(requested_digests256, const uint8_t *, cp, - digest256map_set(requested, cp, DIGEST_REQUESTED)); - /* Set requested[d] to DIGEST_INVALID for every md we requested which we - * will never be able to parse. Remove the ones we didn't request from - * invalid_digests. - */ - SMARTLIST_FOREACH_BEGIN(invalid_digests, uint8_t *, cp) { - if (digest256map_get(requested, cp)) { - digest256map_set(requested, cp, DIGEST_INVALID); - } else { - tor_free(cp); - SMARTLIST_DEL_CURRENT(invalid_digests, cp); - } - } SMARTLIST_FOREACH_END(cp); - /* Update requested[d] to 2 for the mds we asked for and got. Delete the - * ones we never requested from the 'descriptors' smartlist. - */ + digestmap_t *requested; /* XXXX actually we should just use a + digest256map */ + requested = digestmap_new(); + SMARTLIST_FOREACH(requested_digests256, const char *, cp, + digestmap_set(requested, cp, (void*)1)); SMARTLIST_FOREACH_BEGIN(descriptors, microdesc_t *, md) { - if (digest256map_get(requested, (const uint8_t*)md->digest)) { - digest256map_set(requested, (const uint8_t*)md->digest, - DIGEST_RECEIVED); + if (digestmap_get(requested, md->digest)) { + digestmap_set(requested, md->digest, (void*)2); } else { log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Received non-requested microdesc"); microdesc_free(md); SMARTLIST_DEL_CURRENT(descriptors, md); } } SMARTLIST_FOREACH_END(md); - /* Remove the ones we got or the invalid ones from requested_digests256. - */ - SMARTLIST_FOREACH_BEGIN(requested_digests256, uint8_t *, cp) { - void *status = digest256map_get(requested, cp); - if (status == DIGEST_RECEIVED || status == DIGEST_INVALID) { + SMARTLIST_FOREACH_BEGIN(requested_digests256, char *, cp) { + if (digestmap_get(requested, cp) == (void*)2) { tor_free(cp); SMARTLIST_DEL_CURRENT(requested_digests256, cp); } } SMARTLIST_FOREACH_END(cp); - digest256map_free(requested, NULL); - } - - /* For every requested microdescriptor that was unparseable, mark it - * as not to be retried. */ - if (smartlist_len(invalid_digests)) { - networkstatus_t *ns = - networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); - if (ns) { - SMARTLIST_FOREACH_BEGIN(invalid_digests, char *, d) { - routerstatus_t *rs = - router_get_mutable_consensus_status_by_descriptor_digest(ns, d); - if (rs && tor_memeq(d, rs->descriptor_digest, DIGEST256_LEN)) { - download_status_mark_impossible(&rs->dl_status); - } - } SMARTLIST_FOREACH_END(d); - } + digestmap_free(requested, NULL); } - SMARTLIST_FOREACH(invalid_digests, uint8_t *, d, tor_free(d)); - smartlist_free(invalid_digests); added = microdescs_add_list_to_cache(cache, descriptors, where, no_save); smartlist_free(descriptors); @@ -438,7 +280,6 @@ void microdesc_cache_clear(microdesc_cache_t *cache) { microdesc_t **entry, **next; - for (entry = HT_START(microdesc_map, &cache->map); entry; entry = next) { microdesc_t *md = *entry; next = HT_NEXT_RMV(microdesc_map, &cache->map, entry); @@ -447,13 +288,7 @@ microdesc_cache_clear(microdesc_cache_t *cache) } HT_CLEAR(microdesc_map, &cache->map); if (cache->cache_content) { - int res = tor_munmap_file(cache->cache_content); - if (res != 0) { - log_warn(LD_FS, - "tor_munmap_file() failed clearing microdesc cache; " - "we are probably about to leak memory."); - /* TODO something smarter? */ - } + tor_munmap_file(cache->cache_content); cache->cache_content = NULL; } cache->total_len_seen = 0; @@ -474,8 +309,6 @@ microdesc_cache_reload(microdesc_cache_t *cache) microdesc_cache_clear(cache); - cache->is_loaded = 1; - mm = cache->cache_content = tor_mmap_file(cache->cache_fname); if (mm) { added = microdescs_add_to_cache(cache, mm->data, mm->data+mm->size, @@ -535,9 +368,7 @@ microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force) cutoff = now - TOLERATE_MICRODESC_AGE; for (mdp = HT_START(microdesc_map, &cache->map); mdp != NULL; ) { - const int is_old = (*mdp)->last_listed < cutoff; - const unsigned held_by_nodes = (*mdp)->held_by_nodes; - if (is_old && !held_by_nodes) { + if ((*mdp)->last_listed < cutoff) { ++dropped; victim = *mdp; mdp = HT_NEXT_RMV(microdesc_map, &cache->map, mdp); @@ -545,57 +376,6 @@ microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force) bytes_dropped += victim->bodylen; microdesc_free(victim); } else { - if (is_old) { - /* It's old, but it has held_by_nodes set. That's not okay. */ - /* Let's try to diagnose and fix #7164 . */ - smartlist_t *nodes = nodelist_find_nodes_with_microdesc(*mdp); - const networkstatus_t *ns = networkstatus_get_latest_consensus(); - long networkstatus_age = -1; - const int ht_badness = HT_REP_IS_BAD_(microdesc_map, &cache->map); - if (ns) { - networkstatus_age = now - ns->valid_after; - } - log_warn(LD_BUG, "Microdescriptor seemed very old " - "(last listed %d hours ago vs %d hour cutoff), but is still " - "marked as being held by %d node(s). I found %d node(s) " - "holding it. Current networkstatus is %ld hours old. " - "Hashtable badness is %d.", - (int)((now - (*mdp)->last_listed) / 3600), - (int)((now - cutoff) / 3600), - held_by_nodes, - smartlist_len(nodes), - networkstatus_age / 3600, - ht_badness); - - SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) { - const char *rs_match = "No RS"; - const char *rs_present = ""; - if (node->rs) { - if (tor_memeq(node->rs->descriptor_digest, - (*mdp)->digest, DIGEST256_LEN)) { - rs_match = "Microdesc digest in RS matches"; - } else { - rs_match = "Microdesc digest in RS does match"; - } - if (ns) { - /* This should be impossible, but let's see! */ - rs_present = " RS not present in networkstatus."; - SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *,rs, { - if (rs == node->rs) { - rs_present = " RS okay in networkstatus."; - } - }); - } - } - log_warn(LD_BUG, " [%d]: ID=%s. md=%p, rs=%p, ri=%p. %s.%s", - node_sl_idx, - hex_str(node->identity, DIGEST_LEN), - node->md, node->rs, node->ri, rs_match, rs_present); - } SMARTLIST_FOREACH_END(node); - smartlist_free(nodes); - (*mdp)->last_listed = now; - } - ++kept; mdp = HT_NEXT(microdesc_map, &cache->map, mdp); } @@ -654,7 +434,7 @@ int microdesc_cache_rebuild(microdesc_cache_t *cache, int force) { open_file_t *open_file; - int fd = -1, res; + int fd = -1; microdesc_t **mdp; smartlist_t *wrote; ssize_t size; @@ -721,14 +501,8 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force) /* We must do this unmap _before_ we call finish_writing_to_file(), or * windows will not actually replace the file. */ - if (cache->cache_content) { - res = tor_munmap_file(cache->cache_content); - if (res != 0) { - log_warn(LD_FS, - "Failed to unmap old microdescriptor cache while rebuilding"); - } - cache->cache_content = NULL; - } + if (cache->cache_content) + tor_munmap_file(cache->cache_content); if (finish_writing_to_file(open_file) < 0) { log_warn(LD_DIR, "Error rebuilding microdescriptor cache: %s", @@ -741,7 +515,6 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force) microdesc_wipe_body(md); } } - smartlist_free(wrote); return -1; } @@ -820,7 +593,7 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno) /* Make sure that the microdesc was really removed from the appropriate data structures. */ if (md->held_in_map) { - microdesc_cache_t *cache = get_microdesc_cache_noload(); + microdesc_cache_t *cache = get_microdesc_cache(); microdesc_t *md2 = HT_FIND(microdesc_map, &cache->map, md); if (md2 == md) { log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still " @@ -833,10 +606,8 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno) tor_fragile_assert(); } if (md->held_by_nodes) { - microdesc_cache_t *cache = get_microdesc_cache_noload(); int found=0; const smartlist_t *nodes = nodelist_get_list(); - const int ht_badness = HT_REP_IS_BAD_(microdesc_map, &cache->map); SMARTLIST_FOREACH(nodes, node_t *, node, { if (node->md == md) { ++found; @@ -845,13 +616,12 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno) }); if (found) { log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still " - "referenced %d node(s); held_by_nodes == %u, ht_badness == %d", - fname, lineno, found, md->held_by_nodes, ht_badness); + "referenced %d node(s); held_by_nodes == %u", + fname, lineno, found, md->held_by_nodes); } else { log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_by_nodes " - "set to %u, but md was not referenced by any nodes. " - "ht_badness == %d", - fname, lineno, md->held_by_nodes, ht_badness); + "set to %u, but md was not referenced by any nodes", + fname, lineno, md->held_by_nodes); } tor_fragile_assert(); } @@ -861,7 +631,6 @@ microdesc_free_(microdesc_t *md, const char *fname, int lineno) if (md->onion_pkey) crypto_pk_free(md->onion_pkey); tor_free(md->onion_curve25519_pkey); - tor_free(md->ed25519_identity_pkey); if (md->body && md->saved_location != SAVED_IN_CACHE) tor_free(md->body); @@ -885,11 +654,6 @@ microdesc_free_all(void) tor_free(the_microdesc_cache->journal_fname); tor_free(the_microdesc_cache); } - - if (outdated_dirserver_list) { - SMARTLIST_FOREACH(outdated_dirserver_list, char *, cp, tor_free(cp)); - smartlist_free(outdated_dirserver_list); - } } /** If there is a microdescriptor in cache whose sha256 digest is @@ -905,13 +669,25 @@ microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d) return md; } +/** Return the mean size of decriptors added to cache since it was last + * cleared. Used to estimate the size of large downloads. */ +size_t +microdesc_average_size(microdesc_cache_t *cache) +{ + if (!cache) + cache = get_microdesc_cache(); + if (!cache->n_seen) + return 512; + return (size_t)(cache->total_len_seen / cache->n_seen); +} + /** Return a smartlist of all the sha256 digest of the microdescriptors that * are listed in ns but not present in cache. Returns pointers * to internals of ns; you should not free the members of the resulting * smartlist. Omit all microdescriptors whose digest appear in skip. */ smartlist_t * microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, - int downloadable_only, digest256map_t *skip) + int downloadable_only, digestmap_t *skip) { smartlist_t *result = smartlist_new(); time_t now = time(NULL); @@ -923,7 +699,7 @@ microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, !download_status_is_ready(&rs->dl_status, now, get_options()->TestingMicrodescMaxDownloadTries)) continue; - if (skip && digest256map_get(skip, (const uint8_t*)rs->descriptor_digest)) + if (skip && digestmap_get(skip, rs->descriptor_digest)) continue; if (tor_mem_is_zero(rs->descriptor_digest, DIGEST256_LEN)) continue; @@ -938,7 +714,7 @@ microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, /** Launch download requests for microdescriptors as appropriate. * * Specifically, we should launch download requests if we are configured to - * download mirodescriptors, and there are some microdescriptors listed in the + * download mirodescriptors, and there are some microdescriptors listed the * current microdesc consensus that we don't have, and either we never asked * for them, or we failed to download them but we're willing to retry. */ @@ -948,9 +724,9 @@ update_microdesc_downloads(time_t now) const or_options_t *options = get_options(); networkstatus_t *consensus; smartlist_t *missing; - digest256map_t *pending; + digestmap_t *pending; - if (should_delay_dir_fetches(options, NULL)) + if (should_delay_dir_fetches(options)) return; if (directory_too_idle_to_fetch_descriptors(options, now)) return; @@ -962,14 +738,14 @@ update_microdesc_downloads(time_t now) if (!we_fetch_microdescriptors(options)) return; - pending = digest256map_new(); + pending = digestmap_new(); list_pending_microdesc_downloads(pending); missing = microdesc_list_missing_digest256(consensus, get_microdesc_cache(), 1, pending); - digest256map_free(pending, NULL); + digestmap_free(pending, NULL); launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, missing, NULL, now); @@ -977,7 +753,7 @@ update_microdesc_downloads(time_t now) smartlist_free(missing); } -/** For every microdescriptor listed in the current microdescriptor consensus, +/** For every microdescriptor listed in the current microdecriptor consensus, * update its last_listed field to be at least as recent as the publication * time of the current microdescriptor consensus. */ @@ -1006,9 +782,20 @@ update_microdescs_from_networkstatus(time_t now) int we_use_microdescriptors_for_circuits(const or_options_t *options) { - if (options->UseMicrodescriptors == 0) - return 0; /* the user explicitly picked no */ - return 1; /* yes and auto both mean yes */ + int ret = options->UseMicrodescriptors; + if (ret == -1) { + /* UseMicrodescriptors is "auto"; we need to decide: */ + /* If we are configured to use bridges and none of our bridges + * know what a microdescriptor is, the answer is no. */ + if (options->UseBridges && !any_bridge_supports_microdescriptors()) + return 0; + /* Otherwise, we decide that we'll use microdescriptors iff we are + * not a server, and we're not autofetching everything. */ + /* XXX023 what does not being a server have to do with it? also there's + * a partitioning issue here where bridges differ from clients. */ + ret = !server_mode(options) && !options->FetchUselessDescriptors; + } + return ret; } /** Return true iff we should try to download microdescriptors at all. */ @@ -1034,8 +821,8 @@ we_fetch_router_descriptors(const or_options_t *options) } /** Return the consensus flavor we actually want to use to build circuits. */ -MOCK_IMPL(int, -usable_consensus_flavor,(void)) +int +usable_consensus_flavor(void) { if (we_use_microdescriptors_for_circuits(get_options())) { return FLAV_MICRODESC; diff --git a/src/tor/src/or/microdesc.h b/src/tor/microdesc.h similarity index 76% rename from src/tor/src/or/microdesc.h rename to src/tor/microdesc.h index 83a90bd8f..7adb8c68a 100644 --- a/src/tor/src/or/microdesc.h +++ b/src/tor/microdesc.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,29 +32,25 @@ void microdesc_cache_clear(microdesc_cache_t *cache); microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d); +size_t microdesc_average_size(microdesc_cache_t *cache); + smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, int downloadable_only, - digest256map_t *skip); + digestmap_t *skip); void microdesc_free_(microdesc_t *md, const char *fname, int line); -#define microdesc_free(md) do { \ - microdesc_free_((md), __FILE__, __LINE__); \ - (md) = NULL; \ - } while (0) +#define microdesc_free(md) \ + microdesc_free_((md), __FILE__, __LINE__) void microdesc_free_all(void); void update_microdesc_downloads(time_t now); void update_microdescs_from_networkstatus(time_t now); -MOCK_DECL(int, usable_consensus_flavor,(void)); +int usable_consensus_flavor(void); int we_fetch_microdescriptors(const or_options_t *options); int we_fetch_router_descriptors(const or_options_t *options); int we_use_microdescriptors_for_circuits(const or_options_t *options); -void microdesc_note_outdated_dirserver(const char *relay_digest); -int microdesc_relay_is_outdated_dirserver(const char *relay_digest); -void microdesc_reset_outdated_dirservers_list(void); - -#endif /* !defined(TOR_MICRODESC_H) */ +#endif diff --git a/src/tor/src/or/networkstatus.c b/src/tor/networkstatus.c similarity index 58% rename from src/tor/src/or/networkstatus.c rename to src/tor/networkstatus.c index deef62bd4..9f3d881f1 100644 --- a/src/tor/src/or/networkstatus.c +++ b/src/tor/networkstatus.c @@ -1,44 +1,16 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file networkstatus.c - * \brief Functions and structures for handling networkstatus documents as a - * client or as a directory cache. - * - * A consensus networkstatus object is created by the directory - * authorities. It authenticates a set of network parameters--most - * importantly, the list of all the relays in the network. This list - * of relays is represented as an array of routerstatus_t objects. - * - * There are currently two flavors of consensus. With the older "NS" - * flavor, each relay is associated with a digest of its router - * descriptor. Tor instances that use this consensus keep the list of - * router descriptors as routerinfo_t objects stored and managed in - * routerlist.c. With the newer "microdesc" flavor, each relay is - * associated with a digest of the microdescriptor that the authorities - * made for it. These are stored and managed in microdesc.c. Information - * about the router is divided between the the networkstatus and the - * microdescriptor according to the general rule that microdescriptors - * should hold information that changes much less frequently than the - * information in the networkstatus. - * - * Modern clients use microdescriptor networkstatuses. Directory caches - * need to keep both kinds of networkstatus document, so they can serve them. - * - * This module manages fetching, holding, storing, updating, and - * validating networkstatus objects. The download-and-validate process - * is slightly complicated by the fact that the keys you need to - * validate a consensus are stored in the authority certificates, which - * you might not have yet when you download the consensus. + * \brief Functions and structures for handling network status documents as a + * client or cache. */ -#define NETWORKSTATUS_PRIVATE #include "or.h" -#include "bridges.h" #include "channel.h" #include "circuitmux.h" #include "circuitmux_ewma.h" @@ -46,35 +18,41 @@ #include "config.h" #include "connection.h" #include "connection_or.h" -#include "consdiffmgr.h" #include "control.h" #include "directory.h" #include "dirserv.h" #include "dirvote.h" #include "entrynodes.h" -#include "hibernate.h" -#include "main.h" +#include "onion_main.h" #include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" -#include "protover.h" #include "relay.h" #include "router.h" #include "routerlist.h" #include "routerparse.h" -#include "scheduler.h" -#include "shared_random.h" -#include "transports.h" -#include "torcert.h" -#include "channelpadding.h" + +/** Map from lowercase nickname to identity digest of named server, if any. */ +static strmap_t *named_server_map = NULL; +/** Map from lowercase nickname to (void*)1 for all names that are listed + * as unnamed for some server in the consensus. */ +static strmap_t *unnamed_server_map = NULL; + +/** Most recently received and validated v3 consensus network status, + * of whichever type we are using for our own circuits. This will be the same + * as one of current_ns_consensus or current_md_consensus. + */ +#define current_consensus \ + (we_use_microdescriptors_for_circuits(get_options()) ? \ + current_md_consensus : current_ns_consensus) /** Most recently received and validated v3 "ns"-flavored consensus network * status. */ -STATIC networkstatus_t *current_ns_consensus = NULL; +static networkstatus_t *current_ns_consensus = NULL; -/** Most recently received and validated v3 "microdesc"-flavored consensus +/** Most recently received and validated v3 "microdec"-flavored consensus * network status. */ -STATIC networkstatus_t *current_md_consensus = NULL; +static networkstatus_t *current_md_consensus = NULL; /** A v3 consensus networkstatus that we've received, but which we don't * have enough certificates to be happy about. */ @@ -103,33 +81,7 @@ static consensus_waiting_for_certs_t * before the current consensus becomes invalid. */ static time_t time_to_download_next_consensus[N_CONSENSUS_FLAVORS]; /** Download status for the current consensus networkstatus. */ -static download_status_t consensus_dl_status[N_CONSENSUS_FLAVORS] = - { - { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }, - { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }, - }; - -#define N_CONSENSUS_BOOTSTRAP_SCHEDULES 2 -#define CONSENSUS_BOOTSTRAP_SOURCE_AUTHORITY 0 -#define CONSENSUS_BOOTSTRAP_SOURCE_ANY_DIRSERVER 1 - -/* Using DL_SCHED_INCREMENT_ATTEMPT on these schedules means that - * download_status_increment_failure won't increment these entries. - * However, any bootstrap connection failures that occur after we have - * a valid consensus will count against the failure counts on the non-bootstrap - * schedules. There should only be one of these, as all the others will have - * been cancelled. (This doesn't seem to be a significant issue.) */ -static download_status_t - consensus_bootstrap_dl_status[N_CONSENSUS_BOOTSTRAP_SCHEDULES] = - { - { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }, - /* During bootstrap, DL_WANT_ANY_DIRSERVER means "use fallbacks". */ - { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }, - }; +static download_status_t consensus_dl_status[N_CONSENSUS_FLAVORS]; /** True iff we have logged a warning about this OR's version being older than * listed by the authorities. */ @@ -138,20 +90,17 @@ static int have_warned_about_old_version = 0; * listed by the authorities. */ static int have_warned_about_new_version = 0; -static void update_consensus_bootstrap_multiple_downloads( - time_t now, - const or_options_t *options); -static int networkstatus_check_required_protocols(const networkstatus_t *ns, - int client_mode, - char **warning_out); +static void routerstatus_list_update_named_server_map(void); /** Forget that we've warned about anything networkstatus-related, so we will * give fresh warnings if the same behavior happens again. */ void networkstatus_reset_warnings(void) { - SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, - node->name_lookup_warned = 0); + if (current_consensus) { + SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, + node->name_lookup_warned = 0); + } have_warned_about_old_version = 0; have_warned_about_new_version = 0; @@ -165,84 +114,63 @@ networkstatus_reset_download_failures(void) { int i; - log_debug(LD_GENERAL, - "In networkstatus_reset_download_failures()"); - for (i=0; i < N_CONSENSUS_FLAVORS; ++i) download_status_reset(&consensus_dl_status[i]); - - for (i=0; i < N_CONSENSUS_BOOTSTRAP_SCHEDULES; ++i) - download_status_reset(&consensus_bootstrap_dl_status[i]); -} - -/** - * Read and and return the cached consensus of type flavorname. If - * unverified is false, get the one we haven't verified. Return NULL if - * the file isn't there. */ -static char * -networkstatus_read_cached_consensus_impl(int flav, - const char *flavorname, - int unverified_consensus) -{ - char buf[128]; - const char *prefix; - if (unverified_consensus) { - prefix = "unverified"; - } else { - prefix = "cached"; - } - if (flav == FLAV_NS) { - tor_snprintf(buf, sizeof(buf), "%s-consensus", prefix); - } else { - tor_snprintf(buf, sizeof(buf), "%s-%s-consensus", prefix, flavorname); - } - - char *filename = get_cachedir_fname(buf); - char *result = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - tor_free(filename); - return result; -} - -/** Return a new string containing the current cached consensus of flavor - * flavorname. */ -char * -networkstatus_read_cached_consensus(const char *flavorname) - { - int flav = networkstatus_parse_flavor_name(flavorname); - if (flav < 0) - return NULL; - return networkstatus_read_cached_consensus_impl(flav, flavorname, 0); } /** Read every cached v3 consensus networkstatus from the disk. */ int router_reload_consensus_networkstatus(void) { + char *filename; + char *s; const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS; int flav; /* FFFF Suppress warnings if cached consensus is bad? */ for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + char buf[128]; const char *flavor = networkstatus_get_flavor_name(flav); - char *s = networkstatus_read_cached_consensus_impl(flav, flavor, 0); + if (flav == FLAV_NS) { + filename = get_datadir_fname("cached-consensus"); + } else { + tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); + filename = get_datadir_fname(buf); + } + s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); if (s) { - if (networkstatus_set_current_consensus(s, flavor, flags, NULL) < -1) { - log_warn(LD_FS, "Couldn't load consensus %s networkstatus from cache", - flavor); + if (networkstatus_set_current_consensus(s, flavor, flags) < -1) { + log_warn(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", + flavor, filename); } tor_free(s); } + tor_free(filename); - s = networkstatus_read_cached_consensus_impl(flav, flavor, 1); + if (flav == FLAV_NS) { + filename = get_datadir_fname("unverified-consensus"); + } else { + tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); + filename = get_datadir_fname(buf); + } + + s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); if (s) { if (networkstatus_set_current_consensus(s, flavor, - flags|NSSET_WAS_WAITING_FOR_CERTS, - NULL)) { - log_info(LD_FS, "Couldn't load unverified consensus %s networkstatus " - "from cache", flavor); - } + flags|NSSET_WAS_WAITING_FOR_CERTS)) { + log_info(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", + flavor, filename); + } tor_free(s); } + tor_free(filename); + } + + if (!current_consensus) { + if (!named_server_map) + named_server_map = strmap_new(); + if (!unnamed_server_map) + unnamed_server_map = strmap_new(); } update_certificate_downloads(time(NULL)); @@ -254,14 +182,13 @@ router_reload_consensus_networkstatus(void) } /** Free all storage held by the vote_routerstatus object rs. */ -void -vote_routerstatus_free_(vote_routerstatus_t *rs) +static void +vote_routerstatus_free(vote_routerstatus_t *rs) { vote_microdesc_hash_t *h, *next; if (!rs) return; tor_free(rs->version); - tor_free(rs->protocols); tor_free(rs->status.exitsummary); for (h = rs->microdesc; h; h = next) { tor_free(h->microdesc_hash_line); @@ -273,7 +200,7 @@ vote_routerstatus_free_(vote_routerstatus_t *rs) /** Free all storage held by the routerstatus object rs. */ void -routerstatus_free_(routerstatus_t *rs) +routerstatus_free(routerstatus_t *rs) { if (!rs) return; @@ -283,7 +210,7 @@ routerstatus_free_(routerstatus_t *rs) /** Free all storage held in sig */ void -document_signature_free_(document_signature_t *sig) +document_signature_free(document_signature_t *sig) { tor_free(sig->signature); tor_free(sig); @@ -301,18 +228,13 @@ document_signature_dup(const document_signature_t *sig) /** Free all storage held in ns. */ void -networkstatus_vote_free_(networkstatus_t *ns) +networkstatus_vote_free(networkstatus_t *ns) { if (!ns) return; tor_free(ns->client_versions); tor_free(ns->server_versions); - tor_free(ns->recommended_client_protocols); - tor_free(ns->recommended_relay_protocols); - tor_free(ns->required_client_protocols); - tor_free(ns->required_relay_protocols); - if (ns->known_flags) { SMARTLIST_FOREACH(ns->known_flags, char *, c, tor_free(c)); smartlist_free(ns->known_flags); @@ -329,10 +251,6 @@ networkstatus_vote_free_(networkstatus_t *ns) SMARTLIST_FOREACH(ns->supported_methods, char *, c, tor_free(c)); smartlist_free(ns->supported_methods); } - if (ns->package_lines) { - SMARTLIST_FOREACH(ns->package_lines, char *, c, tor_free(c)); - smartlist_free(ns->package_lines); - } if (ns->voters) { SMARTLIST_FOREACH_BEGIN(ns->voters, networkstatus_voter_info_t *, voter) { tor_free(voter->nickname); @@ -363,14 +281,6 @@ networkstatus_vote_free_(networkstatus_t *ns) digestmap_free(ns->desc_digest_map, NULL); - if (ns->sr_info.commits) { - SMARTLIST_FOREACH(ns->sr_info.commits, sr_commit_t *, c, - sr_commit_free(c)); - smartlist_free(ns->sr_info.commits); - } - tor_free(ns->sr_info.previous_srv); - tor_free(ns->sr_info.current_srv); - memwipe(ns, 11, sizeof(*ns)); tor_free(ns); } @@ -411,17 +321,6 @@ networkstatus_check_document_signature(const networkstatus_t *consensus, DIGEST_LEN)) return -1; - if (authority_cert_is_blacklisted(cert)) { - /* We implement blacklisting for authority signing keys by treating - * all their signatures as always bad. That way we don't get into - * crazy loops of dropping and re-fetching signatures. */ - log_warn(LD_DIR, "Ignoring a consensus signature made with deprecated" - " signing key %s", - hex_str(cert->signing_key_digest, DIGEST_LEN)); - sig->bad_signature = 1; - return 0; - } - signed_digest_len = crypto_pk_keysize(cert->signing_key); signed_digest = tor_malloc(signed_digest_len); if (crypto_pk_public_checksig(cert->signing_key, @@ -623,6 +522,16 @@ networkstatus_check_consensus_signature(networkstatus_t *consensus, return -2; } +/** Helper: return a newly allocated string containing the name of the filename + * where we plan to cache the network status with the given identity digest. */ +char * +networkstatus_get_cache_filename(const char *identity_digest) +{ + char fp[HEX_DIGEST_LEN+1]; + base16_encode(fp, HEX_DIGEST_LEN+1, identity_digest, DIGEST_LEN); + return get_datadir_fname2("cached-status", fp); +} + /** How far in the future do we allow a network-status to get before removing * it? (seconds) */ #define NETWORKSTATUS_ALLOW_SKEW (24*60*60) @@ -679,13 +588,13 @@ networkstatus_vote_find_entry_idx(networkstatus_t *ns, /** As router_get_consensus_status_by_descriptor_digest, but does not return * a const pointer. */ -MOCK_IMPL(routerstatus_t *, -router_get_mutable_consensus_status_by_descriptor_digest,( +routerstatus_t * +router_get_mutable_consensus_status_by_descriptor_digest( networkstatus_t *consensus, - const char *digest)) + const char *digest) { if (!consensus) - consensus = networkstatus_get_latest_consensus(); + consensus = current_consensus; if (!consensus) return NULL; if (!consensus->desc_digest_map) { @@ -710,47 +619,10 @@ router_get_consensus_status_by_descriptor_digest(networkstatus_t *consensus, consensus, digest); } -/** Return a smartlist of all router descriptor digests in a consensus */ -static smartlist_t * -router_get_descriptor_digests_in_consensus(networkstatus_t *consensus) -{ - smartlist_t *result = smartlist_new(); - digestmap_iter_t *i; - const char *digest; - void *rs; - char *digest_tmp; - - for (i = digestmap_iter_init(consensus->desc_digest_map); - !(digestmap_iter_done(i)); - i = digestmap_iter_next(consensus->desc_digest_map, i)) { - digestmap_iter_get(i, &digest, &rs); - digest_tmp = tor_malloc(DIGEST_LEN); - memcpy(digest_tmp, digest, DIGEST_LEN); - smartlist_add(result, digest_tmp); - } - - return result; -} - -/** Return a smartlist of all router descriptor digests in the current - * consensus */ -MOCK_IMPL(smartlist_t *, -router_get_descriptor_digests,(void)) -{ - smartlist_t *result = NULL; - - if (current_ns_consensus) { - result = - router_get_descriptor_digests_in_consensus(current_ns_consensus); - } - - return result; -} - /** Given the digest of a router descriptor, return its current download * status, or NULL if the digest is unrecognized. */ -MOCK_IMPL(download_status_t *, -router_get_dl_status_by_descriptor_digest,(const char *d)) +download_status_t * +router_get_dl_status_by_descriptor_digest(const char *d) { routerstatus_t *rs; if (!current_ns_consensus) @@ -766,11 +638,9 @@ router_get_dl_status_by_descriptor_digest,(const char *d)) routerstatus_t * router_get_mutable_consensus_status_by_id(const char *digest) { - const networkstatus_t *ns = networkstatus_get_latest_consensus(); - if (!ns) + if (!current_consensus) return NULL; - smartlist_t *rslist = ns->routerstatus_list; - return smartlist_bsearch(rslist, digest, + return smartlist_bsearch(current_consensus->routerstatus_list, digest, compare_digest_to_routerstatus_entry); } @@ -782,6 +652,41 @@ router_get_consensus_status_by_id(const char *digest) return router_get_mutable_consensus_status_by_id(digest); } +/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return + * the corresponding routerstatus_t, or NULL if none exists. Warn the + * user if warn_if_unnamed is set, and they have specified a router by + * nickname, but the Named flag isn't set for that router. */ +const routerstatus_t * +router_get_consensus_status_by_nickname(const char *nickname, + int warn_if_unnamed) +{ + const node_t *node = node_get_by_nickname(nickname, warn_if_unnamed); + if (node) + return node->rs; + else + return NULL; +} + +/** Return the identity digest that's mapped to officially by + * nickname. */ +const char * +networkstatus_get_router_digest_by_nickname(const char *nickname) +{ + if (!named_server_map) + return NULL; + return strmap_get_lc(named_server_map, nickname); +} + +/** Return true iff nickname is disallowed from being the nickname + * of any server. */ +int +networkstatus_nickname_is_unnamed(const char *nickname) +{ + if (!unnamed_server_map) + return 0; + return strmap_get_lc(unnamed_server_map, nickname) != NULL; +} + /** How frequently do directory authorities re-download fresh networkstatus * documents? */ #define AUTHORITY_NS_CACHE_INTERVAL (10*60) @@ -791,11 +696,8 @@ router_get_consensus_status_by_id(const char *digest) #define NONAUTHORITY_NS_CACHE_INTERVAL (60*60) /** Return true iff, given the options listed in options, flavor - * is the flavor of a consensus networkstatus that we would like to fetch. - * - * For certificate fetches, use we_want_to_fetch_unknown_auth_certs, and - * for serving fetched documents, use directory_caches_dir_info. */ -int + * is the flavor of a consensus networkstatus that we would like to fetch. */ +static int we_want_to_fetch_flavor(const or_options_t *options, int flavor) { if (flavor < 0 || flavor > N_CONSENSUS_FLAVORS) { @@ -817,71 +719,10 @@ we_want_to_fetch_flavor(const or_options_t *options, int flavor) return flavor == usable_consensus_flavor(); } -/** Return true iff, given the options listed in options, we would like - * to fetch and store unknown authority certificates. - * - * For consensus and descriptor fetches, use we_want_to_fetch_flavor, and - * for serving fetched certificates, use directory_caches_unknown_auth_certs. - */ -int -we_want_to_fetch_unknown_auth_certs(const or_options_t *options) -{ - if (authdir_mode_v3(options) || - directory_caches_unknown_auth_certs((options))) { - /* We want to serve all certs to others, regardless if we would use - * them ourselves. */ - return 1; - } - if (options->FetchUselessDescriptors) { - /* Unknown certificates are definitely useless. */ - return 1; - } - /* Otherwise, don't fetch unknown certificates. */ - return 0; -} - /** How long will we hang onto a possibly live consensus for which we're * fetching certs before we check whether there is a better one? */ #define DELAY_WHILE_FETCHING_CERTS (20*60) -/** What is the minimum time we need to have waited fetching certs, before we - * increment the consensus download schedule on failure? */ -#define MIN_DELAY_FOR_FETCH_CERT_STATUS_FAILURE (1*60) - -/* Check if a downloaded consensus flavor should still wait for certificates - * to download now. If we decide not to wait, check if enough time has passed - * to consider the certificate download failure a separate failure. If so, - * fail dls. - * If waiting for certificates to download, return 1. If not, return 0. */ -static int -check_consensus_waiting_for_certs(int flavor, time_t now, - download_status_t *dls) -{ - consensus_waiting_for_certs_t *waiting; - - /* We should always have a known flavor, because we_want_to_fetch_flavor() - * filters out unknown flavors. */ - tor_assert(flavor >= 0 && flavor < N_CONSENSUS_FLAVORS); - - waiting = &consensus_waiting_for_certs[flavor]; - if (waiting->consensus) { - /* XXXX make sure this doesn't delay sane downloads. */ - if (waiting->set_at + DELAY_WHILE_FETCHING_CERTS > now && - waiting->consensus->valid_until > now) { - return 1; - } else { - if (!waiting->dl_failed) { - if (waiting->set_at + MIN_DELAY_FOR_FETCH_CERT_STATUS_FAILURE > now) { - download_status_failed(dls, 0); - } - waiting->dl_failed=1; - } - } - } - - return 0; -} - /** If we want to download a fresh consensus, launch a new download as * appropriate. */ static void @@ -889,19 +730,12 @@ update_consensus_networkstatus_downloads(time_t now) { int i; const or_options_t *options = get_options(); - const int we_are_bootstrapping = networkstatus_consensus_is_bootstrapping( - now); - const int use_multi_conn = - networkstatus_consensus_can_use_multiple_directories(options); - - if (should_delay_dir_fetches(options, NULL)) - return; for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { /* XXXX need some way to download unknown flavors if we are caching. */ const char *resource; + consensus_waiting_for_certs_t *waiting; networkstatus_t *c; - int max_in_progress_conns = 1; if (! we_want_to_fetch_flavor(options, i)) continue; @@ -917,147 +751,32 @@ update_consensus_networkstatus_downloads(time_t now) resource = networkstatus_get_flavor_name(i); - /* Check if we already have enough connections in progress */ - if (we_are_bootstrapping && use_multi_conn) { - max_in_progress_conns = - options->ClientBootstrapConsensusMaxInProgressTries; - } - if (connection_dir_count_by_purpose_and_resource( - DIR_PURPOSE_FETCH_CONSENSUS, - resource) - >= max_in_progress_conns) { - continue; - } - - /* Check if we want to launch another download for a usable consensus. - * Only used during bootstrap. */ - if (we_are_bootstrapping && use_multi_conn - && i == usable_consensus_flavor()) { - - /* Check if we're already downloading a usable consensus */ - if (networkstatus_consensus_is_already_downloading(resource)) - continue; - - /* Make multiple connections for a bootstrap consensus download. */ - update_consensus_bootstrap_multiple_downloads(now, options); - } else { - /* Check if we failed downloading a consensus too recently */ - int max_dl_tries = options->TestingConsensusMaxDownloadTries; + if (!download_status_is_ready(&consensus_dl_status[i], now, + options->TestingConsensusMaxDownloadTries)) + continue; /* We failed downloading a consensus too recently. */ + if (connection_dir_get_by_purpose_and_resource( + DIR_PURPOSE_FETCH_CONSENSUS, resource)) + continue; /* There's an in-progress download.*/ - /* Let's make sure we remembered to update consensus_dl_status */ - tor_assert(consensus_dl_status[i].schedule == DL_SCHED_CONSENSUS); - - if (!download_status_is_ready(&consensus_dl_status[i], - now, - max_dl_tries)) { - continue; + waiting = &consensus_waiting_for_certs[i]; + if (waiting->consensus) { + /* XXXX make sure this doesn't delay sane downloads. */ + if (waiting->set_at + DELAY_WHILE_FETCHING_CERTS > now) { + continue; /* We're still getting certs for this one. */ + } else { + if (!waiting->dl_failed) { + download_status_failed(&consensus_dl_status[i], 0); + waiting->dl_failed=1; + } } - - /* Check if we're waiting for certificates to download */ - if (check_consensus_waiting_for_certs(i, now, &consensus_dl_status[i])) - continue; - - /* Try the requested attempt */ - log_info(LD_DIR, "Launching %s standard networkstatus consensus " - "download.", networkstatus_get_flavor_name(i)); - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CONSENSUS, - ROUTER_PURPOSE_GENERAL, resource, - PDS_RETRY_IF_NO_SERVERS, - consensus_dl_status[i].want_authority); } - } -} -/** When we're bootstrapping, launch one or more consensus download - * connections, if schedule indicates connection(s) should be made after now. - * If is_authority, connect to an authority, otherwise, use a fallback - * directory mirror. - */ -static void -update_consensus_bootstrap_attempt_downloads( - time_t now, - const or_options_t *options, - download_status_t *dls, - download_want_authority_t want_authority) -{ - int use_fallbacks = networkstatus_consensus_can_use_extra_fallbacks(options); - int max_dl_tries = options->ClientBootstrapConsensusMaxDownloadTries; - if (!use_fallbacks) { - max_dl_tries = - options->ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries; - } - - const char *resource = networkstatus_get_flavor_name( - usable_consensus_flavor()); - - /* Let's make sure we remembered to update schedule */ - tor_assert(dls->schedule == DL_SCHED_CONSENSUS); - - /* Allow for multiple connections in the same second, if the schedule value - * is 0. */ - while (download_status_is_ready(dls, now, max_dl_tries)) { - log_info(LD_DIR, "Launching %s bootstrap %s networkstatus consensus " - "download.", resource, (want_authority == DL_WANT_AUTHORITY - ? "authority" - : "mirror")); + log_info(LD_DIR, "Launching %s networkstatus consensus download.", + networkstatus_get_flavor_name(i)); directory_get_from_dirserver(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, resource, - PDS_RETRY_IF_NO_SERVERS, want_authority); - /* schedule the next attempt */ - download_status_increment_attempt(dls, resource, now); - } -} - -/** If we're bootstrapping, check the connection schedules and see if we want - * to make additional, potentially concurrent, consensus download - * connections. - * Only call when bootstrapping, and when we want to make additional - * connections. Only nodes that satisfy - * networkstatus_consensus_can_use_multiple_directories make additional - * connections. - */ -static void -update_consensus_bootstrap_multiple_downloads(time_t now, - const or_options_t *options) -{ - const int usable_flavor = usable_consensus_flavor(); - - /* make sure we can use multiple connections */ - if (!networkstatus_consensus_can_use_multiple_directories(options)) { - return; - } - - /* Launch concurrent consensus download attempt(s) based on the mirror and - * authority schedules. Try the mirror first - this makes it slightly more - * likely that we'll connect to the fallback first, and then end the - * authority connection attempt. */ - - /* If a consensus download fails because it's waiting for certificates, - * we'll fail both the authority and fallback schedules. This is better than - * failing only one of the schedules, and having the other continue - * unchecked. - */ - - /* If we don't have or can't use extra fallbacks, don't try them. */ - if (networkstatus_consensus_can_use_extra_fallbacks(options)) { - download_status_t *dls_f = - &consensus_bootstrap_dl_status[CONSENSUS_BOOTSTRAP_SOURCE_ANY_DIRSERVER]; - - if (!check_consensus_waiting_for_certs(usable_flavor, now, dls_f)) { - /* During bootstrap, DL_WANT_ANY_DIRSERVER means "use fallbacks". */ - update_consensus_bootstrap_attempt_downloads(now, options, dls_f, - DL_WANT_ANY_DIRSERVER); - } - } - - /* Now try an authority. */ - download_status_t *dls_a = - &consensus_bootstrap_dl_status[CONSENSUS_BOOTSTRAP_SOURCE_AUTHORITY]; - - if (!check_consensus_waiting_for_certs(usable_flavor, now, dls_a)) { - update_consensus_bootstrap_attempt_downloads(now, options, dls_a, - DL_WANT_AUTHORITY); + PDS_RETRY_IF_NO_SERVERS); } } @@ -1103,16 +822,12 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) a crazy-fast voting interval, though, 2 minutes may be too much. */ min_sec_before_caching = interval/16; - /* make sure we always delay by at least a second before caching */ - if (min_sec_before_caching == 0) { - min_sec_before_caching = 1; - } } if (directory_fetches_dir_info_early(options)) { /* We want to cache the next one at some point after this one * is no longer fresh... */ - start = (time_t)(c->fresh_until + min_sec_before_caching); + start = c->fresh_until + min_sec_before_caching; /* Some clients may need the consensus sooner than others. */ if (options->FetchDirInfoExtraEarly || authdir_mode_v3(options)) { dl_interval = 60; @@ -1123,9 +838,9 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) dl_interval = interval/2; } } else { - /* We're an ordinary client, a bridge, or a hidden service. - * Give all the caches enough time to download the consensus. */ - start = (time_t)(c->fresh_until + (interval*3)/4); + /* We're an ordinary client or a bridge. Give all the caches enough + * time to download the consensus. */ + start = c->fresh_until + (interval*3)/4; /* But download the next one well before this one is expired. */ dl_interval = ((c->valid_until - start) * 7 )/ 8; @@ -1133,22 +848,13 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) * to choose the rest of the interval *after* them. */ if (directory_fetches_dir_info_later(options)) { /* Give all the *clients* enough time to download the consensus. */ - start = (time_t)(start + dl_interval + min_sec_before_caching); + start = start + dl_interval + min_sec_before_caching; /* But try to get it before ours actually expires. */ dl_interval = (c->valid_until - start) - min_sec_before_caching; } } - /* catch low dl_interval in crazy-fast networks */ if (dl_interval < 1) dl_interval = 1; - /* catch late start in crazy-fast networks */ - if (start+dl_interval >= c->valid_until) - start = c->valid_until - dl_interval - 1; - log_debug(LD_DIR, - "fresh_until: %ld start: %ld " - "dl_interval: %ld valid_until: %ld ", - (long)c->fresh_until, (long)start, dl_interval, - (long)c->valid_until); /* We must not try to replace c while it's still fresh: */ tor_assert(c->fresh_until < start); /* We must download the next one before c is invalid: */ @@ -1188,55 +894,14 @@ update_consensus_networkstatus_fetch_time(time_t now) /** Return 1 if there's a reason we shouldn't try any directory * fetches yet (e.g. we demand bridges and none are yet known). - * Else return 0. - - * If we return 1 and msg_out is provided, set msg_out - * to an explanation of why directory fetches are delayed. (If we - * return 0, we set msg_out to NULL.) - */ + * Else return 0. */ int -should_delay_dir_fetches(const or_options_t *options, const char **msg_out) +should_delay_dir_fetches(const or_options_t *options) { - if (msg_out) { - *msg_out = NULL; - } - - if (options->DisableNetwork) { - if (msg_out) { - *msg_out = "DisableNetwork is set."; - } - log_info(LD_DIR, "Delaying dir fetches (DisableNetwork is set)"); + if (options->UseBridges && !any_bridge_descriptors_known()) { + log_info(LD_DIR, "delaying dir fetches (no running bridges known)"); return 1; } - - if (we_are_hibernating()) { - if (msg_out) { - *msg_out = "We are hibernating or shutting down."; - } - log_info(LD_DIR, "Delaying dir fetches (Hibernating or shutting down)"); - return 1; - } - - if (options->UseBridges) { - /* If we know that none of our bridges can possibly work, avoid fetching - * directory documents. But if some of them might work, try again. */ - if (num_bridges_usable(1) == 0) { - if (msg_out) { - *msg_out = "No running bridges"; - } - log_info(LD_DIR, "Delaying dir fetches (no running bridges known)"); - return 1; - } - - if (pt_proxies_configuration_pending()) { - if (msg_out) { - *msg_out = "Pluggable transport proxies still configuring"; - } - log_info(LD_DIR, "Delaying dir fetches (pt proxies still configuring)"); - return 1; - } - } - return 0; } @@ -1246,7 +911,7 @@ void update_networkstatus_downloads(time_t now) { const or_options_t *options = get_options(); - if (should_delay_dir_fetches(options, NULL)) + if (should_delay_dir_fetches(options)) return; update_consensus_networkstatus_downloads(now); update_certificate_downloads(now); @@ -1261,13 +926,13 @@ update_certificate_downloads(time_t now) for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { if (consensus_waiting_for_certs[i].consensus) authority_certs_fetch_missing(consensus_waiting_for_certs[i].consensus, - now, NULL); + now); } if (current_ns_consensus) - authority_certs_fetch_missing(current_ns_consensus, now, NULL); + authority_certs_fetch_missing(current_ns_consensus, now); if (current_md_consensus) - authority_certs_fetch_missing(current_md_consensus, now, NULL); + authority_certs_fetch_missing(current_md_consensus, now); } /** Return 1 if we have a consensus but we don't have enough certificates @@ -1279,67 +944,18 @@ consensus_is_waiting_for_certs(void) ? 1 : 0; } -/** Look up the currently active (depending on bootstrap status) download - * status for this consensus flavor and return a pointer to it. - */ -MOCK_IMPL(download_status_t *, -networkstatus_get_dl_status_by_flavor,(consensus_flavor_t flavor)) -{ - download_status_t *dl = NULL; - const int we_are_bootstrapping = - networkstatus_consensus_is_bootstrapping(time(NULL)); - - if ((int)flavor <= N_CONSENSUS_FLAVORS) { - dl = &((we_are_bootstrapping ? - consensus_bootstrap_dl_status : consensus_dl_status)[flavor]); - } - - return dl; -} - -/** Look up the bootstrap download status for this consensus flavor - * and return a pointer to it. */ -MOCK_IMPL(download_status_t *, -networkstatus_get_dl_status_by_flavor_bootstrap,(consensus_flavor_t flavor)) -{ - download_status_t *dl = NULL; - - if ((int)flavor <= N_CONSENSUS_FLAVORS) { - dl = &(consensus_bootstrap_dl_status[flavor]); - } - - return dl; -} - -/** Look up the running (non-bootstrap) download status for this consensus - * flavor and return a pointer to it. */ -MOCK_IMPL(download_status_t *, -networkstatus_get_dl_status_by_flavor_running,(consensus_flavor_t flavor)) -{ - download_status_t *dl = NULL; - - if ((int)flavor <= N_CONSENSUS_FLAVORS) { - dl = &(consensus_dl_status[flavor]); - } - - return dl; -} - /** Return the most recent consensus that we have downloaded, or NULL if we * don't have one. */ -MOCK_IMPL(networkstatus_t *, -networkstatus_get_latest_consensus,(void)) +networkstatus_t * +networkstatus_get_latest_consensus(void) { - if (we_use_microdescriptors_for_circuits(get_options())) - return current_md_consensus; - else - return current_ns_consensus; + return current_consensus; } /** Return the latest consensus we have whose flavor matches f, or NULL * if we don't have one. */ -MOCK_IMPL(networkstatus_t *, -networkstatus_get_latest_consensus_by_flavor,(consensus_flavor_t f)) +networkstatus_t * +networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) { if (f == FLAV_NS) return current_ns_consensus; @@ -1353,50 +969,17 @@ networkstatus_get_latest_consensus_by_flavor,(consensus_flavor_t f)) /** Return the most recent consensus that we have downloaded, or NULL if it is * no longer live. */ -MOCK_IMPL(networkstatus_t *, -networkstatus_get_live_consensus,(time_t now)) +networkstatus_t * +networkstatus_get_live_consensus(time_t now) { - networkstatus_t *ns = networkstatus_get_latest_consensus(); - if (ns && networkstatus_is_live(ns, now)) - return ns; + if (current_consensus && + current_consensus->valid_after <= now && + now <= current_consensus->valid_until) + return current_consensus; else return NULL; } -/** Given a consensus in ns, return true iff currently live and - * unexpired. */ -int -networkstatus_is_live(const networkstatus_t *ns, time_t now) -{ - return (ns->valid_after <= now && now <= ns->valid_until); -} - -/** Determine if consensus is valid or expired recently enough that - * we can still use it. - * - * Return 1 if the consensus is reasonably live, or 0 if it is too old. - */ -int -networkstatus_consensus_reasonably_live(const networkstatus_t *consensus, - time_t now) -{ - if (BUG(!consensus)) - return 0; - - return networkstatus_valid_until_is_reasonably_live(consensus->valid_until, - now); -} - -/** As networkstatus_consensus_reasonably_live, but takes a valid_until - * time rather than an entire consensus. */ -int -networkstatus_valid_until_is_reasonably_live(time_t valid_until, - time_t now) -{ -#define REASONABLY_LIVE_TIME (24*60*60) - return (now <= valid_until + REASONABLY_LIVE_TIME); -} - /* XXXX remove this in favor of get_live_consensus. But actually, * leave something like it for bridge users, who need to not totally * lose if they spend a while fetching a new consensus. */ @@ -1405,136 +988,17 @@ networkstatus_valid_until_is_reasonably_live(time_t valid_until, networkstatus_t * networkstatus_get_reasonably_live_consensus(time_t now, int flavor) { +#define REASONABLY_LIVE_TIME (24*60*60) networkstatus_t *consensus = networkstatus_get_latest_consensus_by_flavor(flavor); if (consensus && consensus->valid_after <= now && - networkstatus_consensus_reasonably_live(consensus, now)) + now <= consensus->valid_until+REASONABLY_LIVE_TIME) return consensus; else return NULL; } -/** Check if we need to download a consensus during tor's bootstrap phase. - * If we have no consensus, or our consensus is unusably old, return 1. - * As soon as we have received a consensus, return 0, even if we don't have - * enough certificates to validate it. - * If a fallback directory gives us a consensus we can never get certs for, - * check_consensus_waiting_for_certs() will wait 20 minutes before failing - * the cert downloads. After that, a new consensus will be fetched from a - * randomly chosen fallback. */ -MOCK_IMPL(int, -networkstatus_consensus_is_bootstrapping,(time_t now)) -{ - /* If we have a validated, reasonably live consensus, we're not - * bootstrapping a consensus at all. */ - if (networkstatus_get_reasonably_live_consensus( - now, - usable_consensus_flavor())) { - return 0; - } - - /* If we have a consensus, but we're waiting for certificates, - * we're not waiting for a consensus download while bootstrapping. */ - if (consensus_is_waiting_for_certs()) { - return 0; - } - - /* If we have no consensus, or our consensus is very old, we are - * bootstrapping, and we need to download a consensus. */ - return 1; -} - -/** Check if we can use multiple directories for a consensus download. - * Only clients (including bridge relays, which act like clients) benefit - * from multiple simultaneous consensus downloads. */ -int -networkstatus_consensus_can_use_multiple_directories( - const or_options_t *options) -{ - /* If we are a client, bridge, bridge client, or hidden service */ - return !public_server_mode(options); -} - -/** Check if we can use fallback directory mirrors for a consensus download. - * If we have fallbacks and don't want to fetch from the authorities, - * we can use them. */ -MOCK_IMPL(int, -networkstatus_consensus_can_use_extra_fallbacks,(const or_options_t *options)) -{ - /* The list length comparisons are a quick way to check if we have any - * non-authority fallback directories. If we ever have any authorities that - * aren't fallback directories, we will need to change this code. */ - tor_assert(smartlist_len(router_get_fallback_dir_servers()) - >= smartlist_len(router_get_trusted_dir_servers())); - /* If we don't fetch from the authorities, and we have additional mirrors, - * we can use them. */ - return (!directory_fetches_from_authorities(options) - && (smartlist_len(router_get_fallback_dir_servers()) - > smartlist_len(router_get_trusted_dir_servers()))); -} - -/* Is there a consensus fetch for flavor resource that's far - * enough along to be attached to a circuit? */ -int -networkstatus_consensus_is_already_downloading(const char *resource) -{ - int answer = 0; - - /* First, get a list of all the dir conns that are fetching a consensus, - * fetching *this* consensus, and are in state "reading" (meaning they - * have already flushed their request onto the socks connection). */ - smartlist_t *fetching_conns = - connection_dir_list_by_purpose_resource_and_state( - DIR_PURPOSE_FETCH_CONSENSUS, resource, DIR_CONN_STATE_CLIENT_READING); - - /* Then, walk through each conn, to see if its linked socks connection - * is in an attached state. We have to check this separately, since with - * the optimistic data feature, fetches can send their request to the - * socks connection and go into state 'reading', even before they're - * attached to any circuit. */ - SMARTLIST_FOREACH_BEGIN(fetching_conns, dir_connection_t *, dirconn) { - /* Do any of these other dir conns have a linked socks conn that is - * attached to a circuit already? */ - connection_t *base = TO_CONN(dirconn); - if (base->linked_conn && - base->linked_conn->type == CONN_TYPE_AP && - !AP_CONN_STATE_IS_UNATTACHED(base->linked_conn->state)) { - answer = 1; - break; /* stop looping, because we know the answer will be yes */ - } - } SMARTLIST_FOREACH_END(dirconn); - smartlist_free(fetching_conns); - - return answer; -} - -/* Does the current, reasonably live consensus have IPv6 addresses? - * Returns 1 if there is a reasonably live consensus and its consensus method - * includes IPv6 addresses in the consensus. - * Otherwise, if there is no consensus, or the method does not include IPv6 - * addresses, returns 0. */ -int -networkstatus_consensus_has_ipv6(const or_options_t* options) -{ - const networkstatus_t *cons = networkstatus_get_reasonably_live_consensus( - approx_time(), - usable_consensus_flavor()); - - /* If we have no consensus, we have no IPv6 in it */ - if (!cons) { - return 0; - } - - /* Different flavours of consensus gained IPv6 at different times */ - if (we_use_microdescriptors_for_circuits(options)) { - return - cons->consensus_method >= MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS; - } else { - return cons->consensus_method >= MIN_METHOD_FOR_A_LINES; - } -} - /** Given two router status entries for the same router identity, return 1 if * if the contents have changed between them. Otherwise, return 0. */ static int @@ -1557,9 +1021,9 @@ routerstatus_has_changed(const routerstatus_t *a, const routerstatus_t *b) a->is_valid != b->is_valid || a->is_possible_guard != b->is_possible_guard || a->is_bad_exit != b->is_bad_exit || - a->is_hs_dir != b->is_hs_dir; - // XXXX this function needs a huge refactoring; it has gotten out - // XXXX of sync with routerstatus_t, and it will do so again. + a->is_bad_directory != b->is_bad_directory || + a->is_hs_dir != b->is_hs_dir || + a->version_known != b->version_known; } /** Notify controllers of any router status entries that changed between @@ -1599,15 +1063,6 @@ notify_control_networkstatus_changed(const networkstatus_t *old_c, smartlist_free(changed); } -/* Called when the consensus has changed from old_c to new_c. */ -static void -notify_networkstatus_changed(const networkstatus_t *old_c, - const networkstatus_t *new_c) -{ - notify_control_networkstatus_changed(old_c, new_c); - scheduler_notify_networkstatus_changed(old_c, new_c); -} - /** Copy all the ancillary information (like router download status and so on) * from old_c to new_c. */ static void @@ -1628,106 +1083,13 @@ networkstatus_copy_old_consensus_info(networkstatus_t *new_c, rs_new->last_dir_503_at = rs_old->last_dir_503_at; if (tor_memeq(rs_old->descriptor_digest, rs_new->descriptor_digest, - DIGEST256_LEN)) { + DIGEST_LEN)) { /* And the same descriptor too! */ memcpy(&rs_new->dl_status, &rs_old->dl_status,sizeof(download_status_t)); } } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); } -#ifdef TOR_UNIT_TESTS -/**Accept a flavor consensus c without any additional - * validation. This is exclusively for unit tests. - * We copy any ancillary information from a pre-existing consensus - * and then free the current one and replace it with the newly - * provided instance. Returns -1 on unrecognized flavor, 0 otherwise. - */ -int -networkstatus_set_current_consensus_from_ns(networkstatus_t *c, - const char *flavor) -{ - int flav = networkstatus_parse_flavor_name(flavor); - switch (flav) { - case FLAV_NS: - if (current_ns_consensus) { - networkstatus_copy_old_consensus_info(c, current_ns_consensus); - networkstatus_vote_free(current_ns_consensus); - } - current_ns_consensus = c; - break; - case FLAV_MICRODESC: - if (current_md_consensus) { - networkstatus_copy_old_consensus_info(c, current_md_consensus); - networkstatus_vote_free(current_md_consensus); - } - current_md_consensus = c; - break; - } - return current_md_consensus ? 0 : -1; -} -#endif /* defined(TOR_UNIT_TESTS) */ - -/** - * Return true if any option is set in options to make us behave - * as a client. - * - * XXXX If we need this elsewhere at any point, we should make it nonstatic - * XXXX and move it into another file. - */ -static int -any_client_port_set(const or_options_t *options) -{ - return (options->SocksPort_set || - options->TransPort_set || - options->NATDPort_set || - options->ControlPort_set || - options->DNSPort_set || - options->HTTPTunnelPort_set); -} - -/** - * Helper for handle_missing_protocol_warning: handles either the - * client case (if is_client is set) or the server case otherwise. - */ -static void -handle_missing_protocol_warning_impl(const networkstatus_t *c, - int is_client) -{ - char *protocol_warning = NULL; - - int should_exit = networkstatus_check_required_protocols(c, - is_client, - &protocol_warning); - if (protocol_warning) { - tor_log(should_exit ? LOG_ERR : LOG_WARN, - LD_GENERAL, - "%s", protocol_warning); - } - if (should_exit) { - tor_assert_nonfatal(protocol_warning); - } - tor_free(protocol_warning); - if (should_exit) - exit(1); // XXXX bad exit: should return from main. -} - -/** Called when we have received a networkstatus c. If there are - * any _required_ protocols we are missing, log an error and exit - * immediately. If there are any _recommended_ protocols we are missing, - * warn. */ -static void -handle_missing_protocol_warning(const networkstatus_t *c, - const or_options_t *options) -{ - const int is_server = server_mode(options); - const int is_client = any_client_port_set(options) || !is_server; - - if (is_server) - handle_missing_protocol_warning_impl(c, 0); - if (is_client) - handle_missing_protocol_warning_impl(c, 1); -} - /** Try to replace the current cached v3 networkstatus with the one in * consensus. If we don't have enough certificates to validate it, * store it in consensus_waiting_for_certs and launch a certificate fetch. @@ -1739,10 +1101,6 @@ handle_missing_protocol_warning(const networkstatus_t *c, * If flags & NSSET_ACCEPT_OBSOLETE, then we should be willing to take this * consensus, even if it comes from many days in the past. * - * If source_dir is non-NULL, it's the identity digest for a directory that - * we've just successfully retrieved a consensus or certificates from, so try - * it first to fetch any missing certificates. - * * Return 0 on success, <0 on failure. On failure, caller should increment * the failure count as appropriate. * @@ -1752,12 +1110,11 @@ handle_missing_protocol_warning(const networkstatus_t *c, int networkstatus_set_current_consensus(const char *consensus, const char *flavor, - unsigned flags, - const char *source_dir) + unsigned flags) { networkstatus_t *c=NULL; int r, result = -1; - time_t now = approx_time(); + time_t now = time(NULL); const or_options_t *options = get_options(); char *unverified_fname = NULL, *consensus_fname = NULL; int flav = networkstatus_parse_flavor_name(flavor); @@ -1766,12 +1123,11 @@ networkstatus_set_current_consensus(const char *consensus, const unsigned dl_certs = !(flags & NSSET_DONT_DOWNLOAD_CERTS); const unsigned accept_obsolete = flags & NSSET_ACCEPT_OBSOLETE; const unsigned require_flavor = flags & NSSET_REQUIRE_FLAVOR; - const common_digests_t *current_digests = NULL; + const digests_t *current_digests = NULL; consensus_waiting_for_certs_t *waiting = NULL; time_t current_valid_after = 0; int free_consensus = 1; /* Free 'c' at the end of the function */ int old_ewma_enabled; - int checked_protocols_already = 0; if (flav < 0) { /* XXXX we don't handle unrecognized flavors yet. */ @@ -1787,16 +1143,6 @@ networkstatus_set_current_consensus(const char *consensus, goto done; } - if (from_cache && !was_waiting_for_certs) { - /* We previously stored this; check _now_ to make sure that version-kills - * really work. This happens even before we check signatures: we did so - * before when we stored this to disk. This does mean an attacker who can - * write to the datadir can make us not start: such an attacker could - * already harm us by replacing our guards, which would be worse. */ - checked_protocols_already = 1; - handle_missing_protocol_warning(c, options); - } - if ((int)c->flavor != flav) { /* This wasn't the flavor we thought we were getting. */ if (require_flavor) { @@ -1809,9 +1155,9 @@ networkstatus_set_current_consensus(const char *consensus, } if (flav != usable_consensus_flavor() && - !we_want_to_fetch_flavor(options, flav)) { - /* This consensus is totally boring to us: we won't use it, we didn't want - * it, and we won't serve it. Drop it. */ + !directory_caches_dir_info(options)) { + /* This consensus is totally boring to us: we won't use it, and we won't + * serve it. Drop it. */ goto done; } @@ -1822,15 +1168,15 @@ networkstatus_set_current_consensus(const char *consensus, } if (!strcmp(flavor, "ns")) { - consensus_fname = get_cachedir_fname("cached-consensus"); - unverified_fname = get_cachedir_fname("unverified-consensus"); + consensus_fname = get_datadir_fname("cached-consensus"); + unverified_fname = get_datadir_fname("unverified-consensus"); if (current_ns_consensus) { current_digests = ¤t_ns_consensus->digests; current_valid_after = current_ns_consensus->valid_after; } } else if (!strcmp(flavor, "microdesc")) { - consensus_fname = get_cachedir_fname("cached-microdesc-consensus"); - unverified_fname = get_cachedir_fname("unverified-microdesc-consensus"); + consensus_fname = get_datadir_fname("cached-microdesc-consensus"); + unverified_fname = get_datadir_fname("unverified-microdesc-consensus"); if (current_md_consensus) { current_digests = ¤t_md_consensus->digests; current_valid_after = current_md_consensus->valid_after; @@ -1839,9 +1185,9 @@ networkstatus_set_current_consensus(const char *consensus, cached_dir_t *cur; char buf[128]; tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); - consensus_fname = get_cachedir_fname(buf); + consensus_fname = get_datadir_fname(buf); tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); - unverified_fname = get_cachedir_fname(buf); + unverified_fname = get_datadir_fname(buf); cur = dirserv_get_consensus(flavor); if (cur) { current_digests = &cur->digests; @@ -1886,7 +1232,7 @@ networkstatus_set_current_consensus(const char *consensus, write_str_to_file(unverified_fname, consensus, 0); } if (dl_certs) - authority_certs_fetch_missing(c, now, source_dir); + authority_certs_fetch_missing(c, now); /* This case is not a success or a failure until we get the certs * or fail to get the certs. */ result = 0; @@ -1894,11 +1240,7 @@ networkstatus_set_current_consensus(const char *consensus, /* Even if we had enough signatures, we'd never use this as the * latest consensus. */ if (was_waiting_for_certs && from_cache) - if (unlink(unverified_fname) != 0) { - log_warn(LD_FS, - "Failed to unlink %s: %s", - unverified_fname, strerror(errno)); - } + unlink(unverified_fname); } goto done; } else { @@ -1908,13 +1250,8 @@ networkstatus_set_current_consensus(const char *consensus, "consensus"); result = -2; } - if (was_waiting_for_certs && (r < -1) && from_cache) { - if (unlink(unverified_fname) != 0) { - log_warn(LD_FS, - "Failed to unlink %s: %s", - unverified_fname, strerror(errno)); - } - } + if (was_waiting_for_certs && (r < -1) && from_cache) + unlink(unverified_fname); goto done; } } @@ -1922,24 +1259,18 @@ networkstatus_set_current_consensus(const char *consensus, if (!from_cache && flav == usable_consensus_flavor()) control_event_client_status(LOG_NOTICE, "CONSENSUS_ARRIVED"); - if (!checked_protocols_already) { - handle_missing_protocol_warning(c, options); - } - /* Are we missing any certificates at all? */ if (r != 1 && dl_certs) - authority_certs_fetch_missing(c, now, source_dir); - - const int is_usable_flavor = flav == usable_consensus_flavor(); + authority_certs_fetch_missing(c, now); - if (is_usable_flavor) { - notify_networkstatus_changed(networkstatus_get_latest_consensus(), c); + if (flav == usable_consensus_flavor()) { + notify_control_networkstatus_changed(current_consensus, c); } if (flav == FLAV_NS) { if (current_ns_consensus) { networkstatus_copy_old_consensus_info(c, current_ns_consensus); networkstatus_vote_free(current_ns_consensus); - /* Defensive programming : we should set current_ns_consensus very soon + /* Defensive programming : we should set current_consensus very soon, * but we're about to call some stuff in the meantime, and leaving this * dangling pointer around has proven to be trouble. */ current_ns_consensus = NULL; @@ -1968,29 +1299,30 @@ networkstatus_set_current_consensus(const char *consensus, waiting->body = NULL; waiting->set_at = 0; waiting->dl_failed = 0; - if (unlink(unverified_fname) != 0) { - log_warn(LD_FS, - "Failed to unlink %s: %s", - unverified_fname, strerror(errno)); - } + unlink(unverified_fname); } - if (is_usable_flavor) { - /* The "current" consensus has just been set and it is a usable flavor so - * the first thing we need to do is recalculate the voting schedule static - * object so we can use the timings in there needed by some subsystems - * such as hidden service and shared random. */ - dirvote_recalculate_timing(options, now); - - nodelist_set_consensus(c); + /* Reset the failure count only if this consensus is actually valid. */ + if (c->valid_after <= now && now <= c->valid_until) { + download_status_reset(&consensus_dl_status[flav]); + } else { + if (!from_cache) + download_status_failed(&consensus_dl_status[flav], 0); + } + if (flav == usable_consensus_flavor()) { /* XXXXNM Microdescs: needs a non-ns variant. ???? NM*/ update_consensus_networkstatus_fetch_time(now); + nodelist_set_consensus(current_consensus); + + dirvote_recalculate_timing(options, now); + routerstatus_list_update_named_server_map(); + /* Update ewma and adjust policy if needed; first cache the old value */ old_ewma_enabled = cell_ewma_enabled(); /* Change the cell EWMA settings */ - cell_ewma_set_scale_factor(options, c); + cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus()); /* If we just enabled ewma, set the cmux policy on all active channels */ if (cell_ewma_enabled() && !old_ewma_enabled) { channel_set_cmux_policy_everywhere(&ewma_policy); @@ -1999,32 +1331,19 @@ networkstatus_set_current_consensus(const char *consensus, channel_set_cmux_policy_everywhere(NULL); } - /* XXXX this call might be unnecessary here: can changing the + /* XXXX024 this call might be unnecessary here: can changing the * current consensus really alter our view of any OR's rate limits? */ connection_or_update_token_buckets(get_connection_array(), options); - circuit_build_times_new_consensus_params( - get_circuit_build_times_mutable(), c); - channelpadding_new_consensus_params(c); - } - - /* Reset the failure count only if this consensus is actually valid. */ - if (c->valid_after <= now && now <= c->valid_until) { - download_status_reset(&consensus_dl_status[flav]); - } else { - if (!from_cache) - download_status_failed(&consensus_dl_status[flav], 0); + circuit_build_times_new_consensus_params(get_circuit_build_times_mutable(), + current_consensus); } - if (we_want_to_fetch_flavor(options, flav)) { + if (directory_caches_dir_info(options)) { dirserv_set_cached_consensus_networkstatus(consensus, flavor, &c->digests, - c->digest_sha3_as_signed, c->valid_after); - if (dir_server_mode(get_options())) { - consdiffmgr_add_consensus(consensus, c); - } } if (!from_cache) { @@ -2039,21 +1358,16 @@ networkstatus_set_current_consensus(const char *consensus, char tbuf[ISO_TIME_LEN+1]; char dbuf[64]; long delta = now - c->valid_after; - char *flavormsg = NULL; format_iso_time(tbuf, c->valid_after); format_time_interval(dbuf, sizeof(dbuf), delta); log_warn(LD_GENERAL, "Our clock is %s behind the time published in the " "consensus network status document (%s UTC). Tor needs an " "accurate clock to work correctly. Please check your time and " "date settings!", dbuf, tbuf); - tor_asprintf(&flavormsg, "%s flavor consensus", flavor); - clock_skew_warning(NULL, delta, 1, LD_GENERAL, flavormsg, "CONSENSUS"); - tor_free(flavormsg); + control_event_general_status(LOG_WARN, + "CLOCK_SKEW MIN_SKEW=%ld SOURCE=CONSENSUS", delta); } - /* We got a new consesus. Reset our md fetch fail cache */ - microdesc_reset_outdated_dirservers_list(); - router_dir_info_changed(); result = 0; @@ -2066,14 +1380,9 @@ networkstatus_set_current_consensus(const char *consensus, } /** Called when we have gotten more certificates: see whether we can - * now verify a pending consensus. - * - * If source_dir is non-NULL, it's the identity digest for a directory that - * we've just successfully retrieved certificates from, so try it first to - * fetch any missing certificates. - */ + * now verify a pending consensus. */ void -networkstatus_note_certs_arrived(const char *source_dir) +networkstatus_note_certs_arrived(void) { int i; for (i=0; irouterstatus_list, + const routerstatus_t *, rs) { + if (rs->is_named) { + strmap_set_lc(named_server_map, rs->nickname, + tor_memdup(rs->identity_digest, DIGEST_LEN)); + } + if (rs->is_unnamed) { + strmap_set_lc(unnamed_server_map, rs->nickname, (void*)1); + } + } SMARTLIST_FOREACH_END(rs); +} + /** Given a list routers of routerinfo_t *, update each status field * according to our current consensus networkstatus. May re-order * routers. */ @@ -2168,7 +1500,7 @@ routers_update_status_from_consensus_networkstatus(smartlist_t *routers, { const or_options_t *options = get_options(); int authdir = authdir_mode_v3(options); - networkstatus_t *ns = networkstatus_get_latest_consensus(); + networkstatus_t *ns = current_consensus; if (!ns || !smartlist_len(ns->routerstatus_list)) return; @@ -2237,9 +1569,7 @@ signed_descs_update_status_from_consensus_networkstatus(smartlist_t *descs) char * networkstatus_getinfo_helper_single(const routerstatus_t *rs) { - return routerstatus_format_entry(rs, NULL, NULL, NS_CONTROL_PORT, - ROUTERSTATUS_FORMAT_NO_CONSENSUS_METHOD, - NULL); + return routerstatus_format_entry(rs, NULL, NS_CONTROL_PORT, NULL); } /** Alloc and return a string describing routerstatuses for the most @@ -2252,13 +1582,13 @@ networkstatus_getinfo_helper_single(const routerstatus_t *rs) char * networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now) { - const time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; + time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; char *answer; routerlist_t *rl = router_get_routerlist(); smartlist_t *statuses; - const uint8_t purpose = router_purpose_from_string(purpose_string); + uint8_t purpose = router_purpose_from_string(purpose_string); routerstatus_t rs; - const int bridge_auth = authdir_mode_bridge(get_options()); + int bridge_auth = authdir_mode_bridge(get_options()); if (purpose == ROUTER_PURPOSE_UNKNOWN) { log_info(LD_DIR, "Unrecognized purpose '%s' when listing router statuses.", @@ -2275,11 +1605,10 @@ networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now) continue; if (ri->purpose != purpose) continue; - /* TODO: modifying the running flag in a getinfo is a bad idea */ if (bridge_auth && ri->purpose == ROUTER_PURPOSE_BRIDGE) dirserv_set_router_is_running(ri, now); /* then generate and write out status lines for each of them */ - set_routerstatus_from_routerinfo(&rs, node, ri, now, 0); + set_routerstatus_from_routerinfo(&rs, node, ri, now, 0, 0, 0, 0); smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs)); } SMARTLIST_FOREACH_END(ri); @@ -2294,34 +1623,21 @@ void networkstatus_dump_bridge_status_to_file(time_t now) { char *status = networkstatus_getinfo_by_purpose("bridge", now); + const or_options_t *options = get_options(); char *fname = NULL; - char *thresholds = NULL; - char *published_thresholds_and_status = NULL; - char published[ISO_TIME_LEN+1]; - const routerinfo_t *me = router_get_my_routerinfo(); - char fingerprint[FINGERPRINT_LEN+1]; - char *fingerprint_line = NULL; - - if (me && crypto_pk_get_fingerprint(me->identity_pkey, - fingerprint, 0) >= 0) { - tor_asprintf(&fingerprint_line, "fingerprint %s\n", fingerprint); - } else { - log_warn(LD_BUG, "Error computing fingerprint for bridge status."); - } - format_iso_time(published, now); - dirserv_compute_bridge_flag_thresholds(); + char *thresholds = NULL, *thresholds_and_status = NULL; + routerlist_t *rl = router_get_routerlist(); + dirserv_compute_bridge_flag_thresholds(rl); thresholds = dirserv_get_flag_thresholds_line(); - tor_asprintf(&published_thresholds_and_status, - "published %s\nflag-thresholds %s\n%s%s", - published, thresholds, fingerprint_line ? fingerprint_line : "", - status); - fname = get_datadir_fname("networkstatus-bridges"); - write_str_to_file(fname,published_thresholds_and_status,0); + tor_asprintf(&thresholds_and_status, "flag-thresholds %s\n%s", + thresholds, status); + tor_asprintf(&fname, "%s"PATH_SEPARATOR"networkstatus-bridges", + options->DataDirectory); + write_str_to_file(fname,thresholds_and_status,0); tor_free(thresholds); - tor_free(published_thresholds_and_status); + tor_free(thresholds_and_status); tor_free(fname); tor_free(status); - tor_free(fingerprint_line); } /* DOCDOC get_net_param_from_list */ @@ -2368,9 +1684,9 @@ get_net_param_from_list(smartlist_t *net_params, const char *param_name, * Make sure the value parsed from the consensus is at least * min_val and at most max_val and raise/cap the parsed value * if necessary. */ -MOCK_IMPL(int32_t, -networkstatus_get_param, (const networkstatus_t *ns, const char *param_name, - int32_t default_val, int32_t min_val, int32_t max_val)) +int32_t +networkstatus_get_param(const networkstatus_t *ns, const char *param_name, + int32_t default_val, int32_t min_val, int32_t max_val) { if (!ns) /* if they pass in null, go find it ourselves */ ns = networkstatus_get_latest_consensus(); @@ -2382,25 +1698,6 @@ networkstatus_get_param, (const networkstatus_t *ns, const char *param_name, default_val, min_val, max_val); } -/** - * As networkstatus_get_param(), but check torrc_value before checking the - * consensus. If torrc_value is in-range, then return it instead of the - * value from the consensus. - */ -int32_t -networkstatus_get_overridable_param(const networkstatus_t *ns, - int32_t torrc_value, - const char *param_name, - int32_t default_val, - int32_t min_val, int32_t max_val) -{ - if (torrc_value >= min_val && torrc_value <= max_val) - return torrc_value; - else - return networkstatus_get_param( - ns, param_name, default_val, min_val, max_val); -} - /** * Retrieve the consensus parameter that governs the * fixed-point precision of our network balancing 'bandwidth-weights' @@ -2477,21 +1774,21 @@ networkstatus_parse_flavor_name(const char *flavname) * running, or otherwise not a descriptor that we would make any * use of even if we had it. Else return 1. */ int -client_would_use_router(const routerstatus_t *rs, time_t now) +client_would_use_router(const routerstatus_t *rs, time_t now, + const or_options_t *options) { - if (!rs->is_flagged_running) { + if (!rs->is_flagged_running && !options->FetchUselessDescriptors) { /* If we had this router descriptor, we wouldn't even bother using it. - * (Fetching and storing depends on by we_want_to_fetch_flavor().) */ + * But, if we want to have a complete list, fetch it anyway. */ return 0; } - if (rs->published_on + OLD_ROUTER_DESC_MAX_AGE < now) { - /* We'd drop it immediately for being too old. */ + if (rs->published_on + options->TestingEstimatedDescriptorPropagationTime + > now) { + /* Most caches probably don't have this descriptor yet. */ return 0; } - if (!routerstatus_version_supports_extend2_cells(rs, 1)) { - /* We'd ignore it because it doesn't support EXTEND2 cells. - * If we don't know the version, download the descriptor so we can - * check if it supports EXTEND2 cells and ntor. */ + if (rs->published_on + OLD_ROUTER_DESC_MAX_AGE < now) { + /* We'd drop it immediately for being too old. */ return 0; } return 1; @@ -2509,14 +1806,14 @@ getinfo_helper_networkstatus(control_connection_t *conn, const routerstatus_t *status; (void) conn; - if (!networkstatus_get_latest_consensus()) { + if (!current_consensus) { *answer = tor_strdup(""); return 0; } if (!strcmp(question, "ns/all")) { smartlist_t *statuses = smartlist_new(); - SMARTLIST_FOREACH(networkstatus_get_latest_consensus()->routerstatus_list, + SMARTLIST_FOREACH(current_consensus->routerstatus_list, const routerstatus_t *, rs, { smartlist_add(statuses, networkstatus_getinfo_helper_single(rs)); @@ -2531,44 +1828,16 @@ getinfo_helper_networkstatus(control_connection_t *conn, if (*q == '$') ++q; - if (base16_decode(d, DIGEST_LEN, q, strlen(q)) != DIGEST_LEN) { + if (base16_decode(d, DIGEST_LEN, q, strlen(q))) { *errmsg = "Data not decodeable as hex"; return -1; } status = router_get_consensus_status_by_id(d); } else if (!strcmpstart(question, "ns/name/")) { - const node_t *n = node_get_by_nickname(question+8, 0); - status = n ? n->rs : NULL; + status = router_get_consensus_status_by_nickname(question+8, 0); } else if (!strcmpstart(question, "ns/purpose/")) { *answer = networkstatus_getinfo_by_purpose(question+11, time(NULL)); return *answer ? 0 : -1; - } else if (!strcmp(question, "consensus/packages")) { - const networkstatus_t *ns = networkstatus_get_latest_consensus(); - if (ns && ns->package_lines) - *answer = smartlist_join_strings(ns->package_lines, "\n", 0, NULL); - else - *errmsg = "No consensus available"; - return *answer ? 0 : -1; - } else if (!strcmp(question, "consensus/valid-after") || - !strcmp(question, "consensus/fresh-until") || - !strcmp(question, "consensus/valid-until")) { - const networkstatus_t *ns = networkstatus_get_latest_consensus(); - if (ns) { - time_t t; - if (!strcmp(question, "consensus/valid-after")) - t = ns->valid_after; - else if (!strcmp(question, "consensus/fresh-until")) - t = ns->fresh_until; - else - t = ns->valid_until; - - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, t); - *answer = tor_strdup(tbuf); - } else { - *errmsg = "No consensus available"; - } - return *answer ? 0 : -1; } else { return 0; } @@ -2578,56 +1847,6 @@ getinfo_helper_networkstatus(control_connection_t *conn, return 0; } -/** Check whether the networkstatus ns lists any protocol - * versions as "required" or "recommended" that we do not support. If - * so, set *warning_out to a newly allocated string describing - * the problem. - * - * Return 1 if we should exit, 0 if we should not. */ -int -networkstatus_check_required_protocols(const networkstatus_t *ns, - int client_mode, - char **warning_out) -{ - const char *func = client_mode ? "client" : "relay"; - const char *required, *recommended; - char *missing = NULL; - - tor_assert(warning_out); - - if (client_mode) { - required = ns->required_client_protocols; - recommended = ns->recommended_client_protocols; - } else { - required = ns->required_relay_protocols; - recommended = ns->recommended_relay_protocols; - } - - if (!protover_all_supported(required, &missing)) { - tor_asprintf(warning_out, "At least one protocol listed as required in " - "the consensus is not supported by this version of Tor. " - "You should upgrade. This version of Tor will not work as a " - "%s on the Tor network. The missing protocols are: %s", - func, missing); - tor_free(missing); - return 1; - } - - if (! protover_all_supported(recommended, &missing)) { - tor_asprintf(warning_out, "At least one protocol listed as recommended in " - "the consensus is not supported by this version of Tor. " - "You should upgrade. This version of Tor will eventually " - "stop working as a %s on the Tor network. The missing " - "protocols are: %s", - func, missing); - tor_free(missing); - } - - tor_assert_nonfatal(missing == NULL); - - return 0; -} - /** Free all storage held locally in this module. */ void networkstatus_free_all(void) @@ -2645,5 +1864,8 @@ networkstatus_free_all(void) } tor_free(waiting->body); } + + strmap_free(named_server_map, tor_free_); + strmap_free(unnamed_server_map, NULL); } diff --git a/src/tor/src/or/networkstatus.h b/src/tor/networkstatus.h similarity index 51% rename from src/tor/src/or/networkstatus.h rename to src/tor/networkstatus.h index 1851a55e8..fed32ea1a 100644 --- a/src/tor/src/or/networkstatus.h +++ b/src/tor/networkstatus.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,18 +12,11 @@ #ifndef TOR_NETWORKSTATUS_H #define TOR_NETWORKSTATUS_H -#include "testsupport.h" - void networkstatus_reset_warnings(void); void networkstatus_reset_download_failures(void); -char *networkstatus_read_cached_consensus(const char *flavorname); int router_reload_consensus_networkstatus(void); -void routerstatus_free_(routerstatus_t *rs); -#define routerstatus_free(rs) \ - FREE_AND_NULL(routerstatus_t, routerstatus_free_, (rs)) -void networkstatus_vote_free_(networkstatus_t *ns); -#define networkstatus_vote_free(ns) \ - FREE_AND_NULL(networkstatus_t, networkstatus_vote_free_, (ns)) +void routerstatus_free(routerstatus_t *rs); +void networkstatus_vote_free(networkstatus_t *ns); networkstatus_voter_info_t *networkstatus_get_voter_by_id( networkstatus_t *vote, const char *identity); @@ -32,6 +25,7 @@ int networkstatus_check_consensus_signature(networkstatus_t *consensus, int networkstatus_check_document_signature(const networkstatus_t *consensus, document_signature_t *sig, const authority_cert_t *cert); +char *networkstatus_get_cache_filename(const char *identity_digest); int compare_digest_to_routerstatus_entry(const void *_key, const void **_member); int compare_digest_to_vote_routerstatus_entry(const void *_key, @@ -42,59 +36,36 @@ routerstatus_t *networkstatus_vote_find_mutable_entry(networkstatus_t *ns, const char *digest); int networkstatus_vote_find_entry_idx(networkstatus_t *ns, const char *digest, int *found_out); - -MOCK_DECL(download_status_t *, - networkstatus_get_dl_status_by_flavor, - (consensus_flavor_t flavor)); -MOCK_DECL(download_status_t *, - networkstatus_get_dl_status_by_flavor_bootstrap, - (consensus_flavor_t flavor)); -MOCK_DECL(download_status_t *, - networkstatus_get_dl_status_by_flavor_running, - (consensus_flavor_t flavor)); - -MOCK_DECL(smartlist_t *, router_get_descriptor_digests, (void)); -MOCK_DECL(download_status_t *,router_get_dl_status_by_descriptor_digest, - (const char *d)); - +download_status_t *router_get_dl_status_by_descriptor_digest(const char *d); const routerstatus_t *router_get_consensus_status_by_id(const char *digest); routerstatus_t *router_get_mutable_consensus_status_by_id( const char *digest); const routerstatus_t *router_get_consensus_status_by_descriptor_digest( networkstatus_t *consensus, const char *digest); -MOCK_DECL(routerstatus_t *, - router_get_mutable_consensus_status_by_descriptor_digest, - (networkstatus_t *consensus, const char *digest)); -int we_want_to_fetch_flavor(const or_options_t *options, int flavor); -int we_want_to_fetch_unknown_auth_certs(const or_options_t *options); +routerstatus_t *router_get_mutable_consensus_status_by_descriptor_digest( + networkstatus_t *consensus, + const char *digest); +const routerstatus_t *router_get_consensus_status_by_nickname( + const char *nickname, + int warn_if_unnamed); +const char *networkstatus_get_router_digest_by_nickname(const char *nickname); +int networkstatus_nickname_is_unnamed(const char *nickname); void networkstatus_consensus_download_failed(int status_code, const char *flavname); void update_consensus_networkstatus_fetch_time(time_t now); -int should_delay_dir_fetches(const or_options_t *options,const char **msg_out); +int should_delay_dir_fetches(const or_options_t *options); void update_networkstatus_downloads(time_t now); void update_certificate_downloads(time_t now); int consensus_is_waiting_for_certs(void); -int client_would_use_router(const routerstatus_t *rs, time_t now); -MOCK_DECL(networkstatus_t *,networkstatus_get_latest_consensus,(void)); -MOCK_DECL(networkstatus_t *,networkstatus_get_latest_consensus_by_flavor, - (consensus_flavor_t f)); -MOCK_DECL(networkstatus_t *, networkstatus_get_live_consensus,(time_t now)); -int networkstatus_is_live(const networkstatus_t *ns, time_t now); -int networkstatus_consensus_reasonably_live(const networkstatus_t *consensus, - time_t now); -int networkstatus_valid_until_is_reasonably_live(time_t valid_until, - time_t now); +int client_would_use_router(const routerstatus_t *rs, time_t now, + const or_options_t *options); +networkstatus_t *networkstatus_get_latest_consensus(void); +networkstatus_t *networkstatus_get_latest_consensus_by_flavor( + consensus_flavor_t f); +networkstatus_t *networkstatus_get_live_consensus(time_t now); networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now, int flavor); -MOCK_DECL(int, networkstatus_consensus_is_bootstrapping,(time_t now)); -int networkstatus_consensus_can_use_multiple_directories( - const or_options_t *options); -MOCK_DECL(int, networkstatus_consensus_can_use_extra_fallbacks,( - const or_options_t *options)); -int networkstatus_consensus_is_already_downloading(const char *resource); -int networkstatus_consensus_has_ipv6(const or_options_t* options); - #define NSSET_FROM_CACHE 1 #define NSSET_WAS_WAITING_FOR_CERTS 2 #define NSSET_DONT_DOWNLOAD_CERTS 4 @@ -102,9 +73,8 @@ int networkstatus_consensus_has_ipv6(const or_options_t* options); #define NSSET_REQUIRE_FLAVOR 16 int networkstatus_set_current_consensus(const char *consensus, const char *flavor, - unsigned flags, - const char *source_dir); -void networkstatus_note_certs_arrived(const char *source_dir); + unsigned flags); +void networkstatus_note_certs_arrived(void); void routers_update_all_from_networkstatus(time_t now, int dir_version); void routers_update_status_from_consensus_networkstatus(smartlist_t *routers, int reset_failures); @@ -114,14 +84,10 @@ void signed_descs_update_status_from_consensus_networkstatus( char *networkstatus_getinfo_helper_single(const routerstatus_t *rs); char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now); void networkstatus_dump_bridge_status_to_file(time_t now); -MOCK_DECL(int32_t, networkstatus_get_param, - (const networkstatus_t *ns, const char *param_name, - int32_t default_val, int32_t min_val, int32_t max_val)); -int32_t networkstatus_get_overridable_param(const networkstatus_t *ns, - int32_t torrc_value, - const char *param_name, - int32_t default_val, - int32_t min_val, int32_t max_val); +int32_t networkstatus_get_param(const networkstatus_t *ns, + const char *param_name, + int32_t default_val, int32_t min_val, + int32_t max_val); int getinfo_helper_networkstatus(control_connection_t *conn, const char *question, char **answer, const char **errmsg); @@ -129,25 +95,10 @@ int32_t networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight, int32_t default_val); const char *networkstatus_get_flavor_name(consensus_flavor_t flav); int networkstatus_parse_flavor_name(const char *flavname); -void document_signature_free_(document_signature_t *sig); -#define document_signature_free(sig) \ - FREE_AND_NULL(document_signature_t, document_signature_free_, (sig)) +void document_signature_free(document_signature_t *sig); document_signature_t *document_signature_dup(const document_signature_t *sig); void networkstatus_free_all(void); int networkstatus_get_weight_scale_param(networkstatus_t *ns); -void vote_routerstatus_free_(vote_routerstatus_t *rs); -#define vote_routerstatus_free(rs) \ - FREE_AND_NULL(vote_routerstatus_t, vote_routerstatus_free_, (rs)) - -#ifdef NETWORKSTATUS_PRIVATE -#ifdef TOR_UNIT_TESTS -STATIC int networkstatus_set_current_consensus_from_ns(networkstatus_t *c, - const char *flavor); -extern networkstatus_t *current_ns_consensus; -extern networkstatus_t *current_md_consensus; -#endif /* defined(TOR_UNIT_TESTS) */ -#endif /* defined(NETWORKSTATUS_PRIVATE) */ - -#endif /* !defined(TOR_NETWORKSTATUS_H) */ +#endif diff --git a/src/tor/src/or/nodelist.c b/src/tor/nodelist.c similarity index 50% rename from src/tor/src/or/nodelist.c rename to src/tor/nodelist.c index e6eaefb21..96d888199 100644 --- a/src/tor/src/or/nodelist.c +++ b/src/tor/nodelist.c @@ -1,89 +1,29 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file nodelist.c - * - * \brief Structures and functions for tracking what we know about the routers - * on the Tor network, and correlating information from networkstatus, - * routerinfo, and microdescs. - * - * The key structure here is node_t: that's the canonical way to refer - * to a Tor relay that we might want to build a circuit through. Every - * node_t has either a routerinfo_t, or a routerstatus_t from the current - * networkstatus consensus. If it has a routerstatus_t, it will also - * need to have a microdesc_t before you can use it for circuits. - * - * The nodelist_t is a global singleton that maps identities to node_t - * objects. Access them with the node_get_*() functions. The nodelist_t - * is maintained by calls throughout the codebase - * - * Generally, other code should not have to reach inside a node_t to - * see what information it has. Instead, you should call one of the - * many accessor functions that works on a generic node_t. If there - * isn't one that does what you need, it's better to make such a function, - * and then use it. - * - * For historical reasons, some of the functions that select a node_t - * from the list of all usable node_t objects are in the routerlist.c - * module, since they originally selected a routerinfo_t. (TODO: They - * should move!) - * - * (TODO: Perhaps someday we should abstract the remaining ways of - * talking about a relay to also be node_t instances. Those would be - * routerstatus_t as used for directory requests, and dir_server_t as - * used for authorities and fallback directories.) - */ - -#define NODELIST_PRIVATE - #include "or.h" #include "address.h" #include "config.h" #include "control.h" #include "dirserv.h" -#include "entrynodes.h" #include "geoip.h" -#include "hs_common.h" -#include "hs_client.h" -#include "main.h" +#include "onion_main.h" #include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" -#include "protover.h" #include "rendservice.h" #include "router.h" #include "routerlist.h" -#include "routerparse.h" #include "routerset.h" -#include "torcert.h" #include static void nodelist_drop_node(node_t *node, int remove_from_ht); -#define node_free(val) \ - FREE_AND_NULL(node_t, node_free_, (val)) -static void node_free_(node_t *node); - -/** count_usable_descriptors counts descriptors with these flag(s) - */ -typedef enum { - /* All descriptors regardless of flags */ - USABLE_DESCRIPTOR_ALL = 0, - /* Only descriptors with the Exit flag */ - USABLE_DESCRIPTOR_EXIT_ONLY = 1 -} usable_descriptor_t; -static void count_usable_descriptors(int *num_present, - int *num_usable, - smartlist_t *descs_out, - const networkstatus_t *consensus, - time_t now, - routerset_t *in_set, - usable_descriptor_t exit_only); +static void node_free(node_t *node); static void update_router_have_minimum_dir_info(void); static double get_frac_paths_needed_for_circs(const or_options_t *options, const networkstatus_t *ns); @@ -97,48 +37,31 @@ typedef struct nodelist_t { smartlist_t *nodes; /* Hash table to map from node ID digest to node. */ HT_HEAD(nodelist_map, node_t) nodes_by_id; - /* Hash table to map from node Ed25519 ID to node. - * - * Whenever a node's routerinfo or microdescriptor is about to change, - * you should remove it from this map with node_remove_from_ed25519_map(). - * Whenever a node's routerinfo or microdescriptor has just chaned, - * you should add it to this map with node_add_to_ed25519_map(). - */ - HT_HEAD(nodelist_ed_map, node_t) nodes_by_ed_id; + } nodelist_t; -static inline unsigned int +static INLINE unsigned int node_id_hash(const node_t *node) { - return (unsigned) siphash24g(node->identity, DIGEST_LEN); +#if SIZEOF_INT == 4 + const uint32_t *p = (const uint32_t*)node->identity; + return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; +#elif SIZEOF_INT == 8 + const uint64_t *p = (const uint32_t*)node->identity; + const uint32_t *p32 = (const uint32_t*)node->identity; + return p[0] ^ p[1] ^ p32[4]; +#endif } -static inline unsigned int +static INLINE unsigned int node_id_eq(const node_t *node1, const node_t *node2) { return tor_memeq(node1->identity, node2->identity, DIGEST_LEN); } -HT_PROTOTYPE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq) -HT_GENERATE2(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq, - 0.6, tor_reallocarray_, tor_free_) - -static inline unsigned int -node_ed_id_hash(const node_t *node) -{ - return (unsigned) siphash24g(node->ed25519_id.pubkey, ED25519_PUBKEY_LEN); -} - -static inline unsigned int -node_ed_id_eq(const node_t *node1, const node_t *node2) -{ - return ed25519_pubkey_eq(&node1->ed25519_id, &node2->ed25519_id); -} - -HT_PROTOTYPE(nodelist_ed_map, node_t, ed_ht_ent, node_ed_id_hash, - node_ed_id_eq) -HT_GENERATE2(nodelist_ed_map, node_t, ed_ht_ent, node_ed_id_hash, - node_ed_id_eq, 0.6, tor_reallocarray_, tor_free_) +HT_PROTOTYPE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq); +HT_GENERATE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq, + 0.6, malloc, realloc, free); /** The global nodelist. */ static nodelist_t *the_nodelist=NULL; @@ -150,7 +73,6 @@ init_nodelist(void) if (PREDICT_UNLIKELY(the_nodelist == NULL)) { the_nodelist = tor_malloc_zero(sizeof(nodelist_t)); HT_INIT(nodelist_map, &the_nodelist->nodes_by_id); - HT_INIT(nodelist_ed_map, &the_nodelist->nodes_by_ed_id); the_nodelist->nodes = smartlist_new(); } } @@ -168,37 +90,14 @@ node_get_mutable_by_id(const char *identity_digest) return node; } -/** As node_get_by_ed25519_id, but returns a non-const pointer */ -node_t * -node_get_mutable_by_ed25519_id(const ed25519_public_key_t *ed_id) -{ - node_t search, *node; - if (PREDICT_UNLIKELY(the_nodelist == NULL)) - return NULL; - if (BUG(ed_id == NULL) || BUG(ed25519_public_key_is_zero(ed_id))) - return NULL; - - memcpy(&search.ed25519_id, ed_id, sizeof(search.ed25519_id)); - node = HT_FIND(nodelist_ed_map, &the_nodelist->nodes_by_ed_id, &search); - return node; -} - /** Return the node_t whose identity is identity_digest, or NULL * if no such node exists. */ -MOCK_IMPL(const node_t *, -node_get_by_id,(const char *identity_digest)) +const node_t * +node_get_by_id(const char *identity_digest) { return node_get_mutable_by_id(identity_digest); } -/** Return the node_t whose ed25519 identity is ed_id, or NULL - * if no such node exists. */ -MOCK_IMPL(const node_t *, -node_get_by_ed25519_id,(const ed25519_public_key_t *ed_id)) -{ - return node_get_mutable_by_ed25519_id(ed_id); -} - /** Internal: return the node_t whose identity_digest is * identity_digest. If none exists, create a new one, add it to the * nodelist, and return it. @@ -219,181 +118,12 @@ node_get_or_create(const char *identity_digest) smartlist_add(the_nodelist->nodes, node); node->nodelist_idx = smartlist_len(the_nodelist->nodes) - 1; - node->hsdir_index = tor_malloc_zero(sizeof(hsdir_index_t)); node->country = -1; return node; } -/** Remove node from the ed25519 map (if it present), and - * set its ed25519_id field to zero. */ -static int -node_remove_from_ed25519_map(node_t *node) -{ - tor_assert(the_nodelist); - tor_assert(node); - - if (ed25519_public_key_is_zero(&node->ed25519_id)) { - return 0; - } - - int rv = 0; - node_t *search = - HT_FIND(nodelist_ed_map, &the_nodelist->nodes_by_ed_id, node); - if (BUG(search != node)) { - goto clear_and_return; - } - - search = HT_REMOVE(nodelist_ed_map, &the_nodelist->nodes_by_ed_id, node); - tor_assert(search == node); - rv = 1; - - clear_and_return: - memset(&node->ed25519_id, 0, sizeof(node->ed25519_id)); - return rv; -} - -/** If node has an ed25519 id, and it is not already in the ed25519 id - * map, set its ed25519_id field, and add it to the ed25519 map. - */ -static int -node_add_to_ed25519_map(node_t *node) -{ - tor_assert(the_nodelist); - tor_assert(node); - - if (! ed25519_public_key_is_zero(&node->ed25519_id)) { - return 0; - } - - const ed25519_public_key_t *key = node_get_ed25519_id(node); - if (!key) { - return 0; - } - - node_t *old; - memcpy(&node->ed25519_id, key, sizeof(node->ed25519_id)); - old = HT_FIND(nodelist_ed_map, &the_nodelist->nodes_by_ed_id, node); - if (BUG(old)) { - /* XXXX order matters here, and this may mean that authorities aren't - * pinning. */ - if (old != node) - memset(&node->ed25519_id, 0, sizeof(node->ed25519_id)); - return 0; - } - - HT_INSERT(nodelist_ed_map, &the_nodelist->nodes_by_ed_id, node); - return 1; -} - -/* For a given node for the consensus ns, set the hsdir index - * for the node, both current and next if possible. This can only fails if the - * node_t ed25519 identity key can't be found which would be a bug. */ -STATIC void -node_set_hsdir_index(node_t *node, const networkstatus_t *ns) -{ - time_t now = approx_time(); - const ed25519_public_key_t *node_identity_pk; - uint8_t *fetch_srv = NULL, *store_first_srv = NULL, *store_second_srv = NULL; - uint64_t next_time_period_num, current_time_period_num; - uint64_t fetch_tp, store_first_tp, store_second_tp; - - tor_assert(node); - tor_assert(ns); - - if (!networkstatus_is_live(ns, now)) { - static struct ratelim_t live_consensus_ratelim = RATELIM_INIT(30 * 60); - log_fn_ratelim(&live_consensus_ratelim, LOG_INFO, LD_GENERAL, - "Not setting hsdir index with a non-live consensus."); - goto done; - } - - node_identity_pk = node_get_ed25519_id(node); - if (node_identity_pk == NULL) { - log_debug(LD_GENERAL, "ed25519 identity public key not found when " - "trying to build the hsdir indexes for node %s", - node_describe(node)); - goto done; - } - - /* Get the current and next time period number. */ - current_time_period_num = hs_get_time_period_num(0); - next_time_period_num = hs_get_next_time_period_num(0); - - /* We always use the current time period for fetching descs */ - fetch_tp = current_time_period_num; - - /* Now extract the needed SRVs and time periods for building hsdir indices */ - if (hs_in_period_between_tp_and_srv(ns, now)) { - fetch_srv = hs_get_current_srv(fetch_tp, ns); - - store_first_tp = hs_get_previous_time_period_num(0); - store_second_tp = current_time_period_num; - } else { - fetch_srv = hs_get_previous_srv(fetch_tp, ns); - - store_first_tp = current_time_period_num; - store_second_tp = next_time_period_num; - } - - /* We always use the old SRV for storing the first descriptor and the latest - * SRV for storing the second descriptor */ - store_first_srv = hs_get_previous_srv(store_first_tp, ns); - store_second_srv = hs_get_current_srv(store_second_tp, ns); - - /* Build the fetch index. */ - hs_build_hsdir_index(node_identity_pk, fetch_srv, fetch_tp, - node->hsdir_index->fetch); - - /* If we are in the time segment between SRV#N and TP#N, the fetch index is - the same as the first store index */ - if (!hs_in_period_between_tp_and_srv(ns, now)) { - memcpy(node->hsdir_index->store_first, node->hsdir_index->fetch, - sizeof(node->hsdir_index->store_first)); - } else { - hs_build_hsdir_index(node_identity_pk, store_first_srv, store_first_tp, - node->hsdir_index->store_first); - } - - /* If we are in the time segment between TP#N and SRV#N+1, the fetch index is - the same as the second store index */ - if (hs_in_period_between_tp_and_srv(ns, now)) { - memcpy(node->hsdir_index->store_second, node->hsdir_index->fetch, - sizeof(node->hsdir_index->store_second)); - } else { - hs_build_hsdir_index(node_identity_pk, store_second_srv, store_second_tp, - node->hsdir_index->store_second); - } - - done: - tor_free(fetch_srv); - tor_free(store_first_srv); - tor_free(store_second_srv); - return; -} - -/** Recompute all node hsdir indices. */ -void -nodelist_recompute_all_hsdir_indices(void) -{ - networkstatus_t *consensus; - if (!the_nodelist) { - return; - } - - /* Get a live consensus. Abort if not found */ - consensus = networkstatus_get_live_consensus(approx_time()); - if (!consensus) { - return; - } - - /* Recompute all hsdir indices */ - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - node_set_hsdir_index(node, consensus); - } SMARTLIST_FOREACH_END(node); -} - /** Called when a node's address changes. */ static void node_addrs_changed(node_t *node) @@ -418,8 +148,6 @@ nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out) id_digest = ri->cache_info.identity_digest; node = node_get_or_create(id_digest); - node_remove_from_ed25519_map(node); - if (node->ri) { if (!routers_have_same_or_addrs(node->ri, ri)) { node_addrs_changed(node); @@ -433,25 +161,15 @@ nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out) } node->ri = ri; - node_add_to_ed25519_map(node); - if (node->country == -1) node_set_country(node); if (authdir_mode(get_options()) && !had_router) { const char *discard=NULL; - uint32_t status = dirserv_router_get_status(ri, &discard, LOG_INFO); + uint32_t status = dirserv_router_get_status(ri, &discard); dirserv_set_node_flags_from_authoritative_status(node, status); } - /* Setting the HSDir index requires the ed25519 identity key which can - * only be found either in the ri or md. This is why this is called here. - * Only nodes supporting HSDir=2 protocol version needs this index. */ - if (node->rs && node->rs->supports_v3_hsdir) { - node_set_hsdir_index(node, - networkstatus_get_latest_consensus()); - } - return node; } @@ -478,21 +196,11 @@ nodelist_add_microdesc(microdesc_t *md) return NULL; node = node_get_mutable_by_id(rs->identity_digest); if (node) { - node_remove_from_ed25519_map(node); if (node->md) node->md->held_by_nodes--; - node->md = md; md->held_by_nodes++; - /* Setting the HSDir index requires the ed25519 identity key which can - * only be found either in the ri or md. This is why this is called here. - * Only nodes supporting HSDir=2 protocol version needs this index. */ - if (rs->supports_v3_hsdir) { - node_set_hsdir_index(node, ns); - } - node_add_to_ed25519_map(node); } - return node; } @@ -506,6 +214,7 @@ nodelist_set_consensus(networkstatus_t *ns) { const or_options_t *options = get_options(); int authdir = authdir_mode_v3(options); + int client = !server_mode(options); init_nodelist(); if (ns->flavor == FLAV_MICRODESC) @@ -520,20 +229,15 @@ nodelist_set_consensus(networkstatus_t *ns) if (ns->flavor == FLAV_MICRODESC) { if (node->md == NULL || tor_memneq(node->md->digest,rs->descriptor_digest,DIGEST256_LEN)) { - node_remove_from_ed25519_map(node); if (node->md) node->md->held_by_nodes--; node->md = microdesc_cache_lookup_by_digest256(NULL, rs->descriptor_digest); if (node->md) node->md->held_by_nodes++; - node_add_to_ed25519_map(node); } } - if (rs->supports_v3_hsdir) { - node_set_hsdir_index(node, ns); - } node_set_country(node); /* If we're not an authdir, believe others. */ @@ -544,10 +248,11 @@ nodelist_set_consensus(networkstatus_t *ns) node->is_stable = rs->is_stable; node->is_possible_guard = rs->is_possible_guard; node->is_exit = rs->is_exit; + node->is_bad_directory = rs->is_bad_directory; node->is_bad_exit = rs->is_bad_exit; node->is_hs_dir = rs->is_hs_dir; node->ipv6_preferred = 0; - if (fascist_firewall_prefer_ipv6_orport(options) && + if (client && options->ClientPreferIPv6ORPort == 1 && (tor_addr_is_null(&rs->ipv6_addr) == 0 || (node->md && tor_addr_is_null(&node->md->ipv6_addr) == 0))) node->ipv6_preferred = 1; @@ -569,7 +274,8 @@ nodelist_set_consensus(networkstatus_t *ns) node->is_valid = node->is_running = node->is_hs_dir = node->is_fast = node->is_stable = node->is_possible_guard = node->is_exit = - node->is_bad_exit = node->ipv6_preferred = 0; + node->is_bad_exit = node->is_bad_directory = + node->ipv6_preferred = 0; } } } SMARTLIST_FOREACH_END(node); @@ -577,7 +283,7 @@ nodelist_set_consensus(networkstatus_t *ns) } /** Helper: return true iff a node has a usable amount of information*/ -static inline int +static INLINE int node_is_usable(const node_t *node) { return (node->rs) || (node->ri); @@ -592,9 +298,6 @@ nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md) if (node && node->md == md) { node->md = NULL; md->held_by_nodes--; - if (! node_get_ed25519_id(node)) { - node_remove_from_ed25519_map(node); - } } } @@ -623,7 +326,6 @@ nodelist_drop_node(node_t *node, int remove_from_ht) tmp = HT_REMOVE(nodelist_map, &the_nodelist->nodes_by_id, node); tor_assert(tmp == node); } - node_remove_from_ed25519_map(node); idx = node->nodelist_idx; tor_assert(idx >= 0); @@ -637,35 +339,15 @@ nodelist_drop_node(node_t *node, int remove_from_ht) node->nodelist_idx = -1; } -/** Return a newly allocated smartlist of the nodes that have md as - * their microdescriptor. */ -smartlist_t * -nodelist_find_nodes_with_microdesc(const microdesc_t *md) -{ - smartlist_t *result = smartlist_new(); - - if (the_nodelist == NULL) - return result; - - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - if (node->md == md) { - smartlist_add(result, node); - } - } SMARTLIST_FOREACH_END(node); - - return result; -} - /** Release storage held by node */ static void -node_free_(node_t *node) +node_free(node_t *node) { if (!node) return; if (node->md) node->md->held_by_nodes--; tor_assert(node->nodelist_idx == -1); - tor_free(node->hsdir_index); tor_free(node); } @@ -707,7 +389,6 @@ nodelist_free_all(void) return; HT_CLEAR(nodelist_map, &the_nodelist->nodes_by_id); - HT_CLEAR(nodelist_ed_map, &the_nodelist->nodes_by_ed_id); SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { node->nodelist_idx = -1; node_free(node); @@ -772,35 +453,17 @@ nodelist_assert_ok(void) tor_assert(node_sl_idx == node->nodelist_idx); } SMARTLIST_FOREACH_END(node); - /* Every node listed with an ed25519 identity should be listed by that - * identity. - */ - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - if (!ed25519_public_key_is_zero(&node->ed25519_id)) { - tor_assert(node == node_get_by_ed25519_id(&node->ed25519_id)); - } - } SMARTLIST_FOREACH_END(node); - - node_t **idx; - HT_FOREACH(idx, nodelist_ed_map, &the_nodelist->nodes_by_ed_id) { - node_t *node = *idx; - tor_assert(node == node_get_by_ed25519_id(&node->ed25519_id)); - } - tor_assert((long)smartlist_len(the_nodelist->nodes) == (long)HT_SIZE(&the_nodelist->nodes_by_id)); - tor_assert((long)smartlist_len(the_nodelist->nodes) >= - (long)HT_SIZE(&the_nodelist->nodes_by_ed_id)); - digestmap_free(dm, NULL); } /** Return a list of a node_t * for every node we know about. The caller * MUST NOT modify the list. (You can set and clear flags in the nodes if * you must, but you must not add or remove nodes.) */ -MOCK_IMPL(smartlist_t *, -nodelist_get_list,(void)) +smartlist_t * +nodelist_get_list(void) { init_nodelist(); return the_nodelist->nodes; @@ -809,23 +472,28 @@ nodelist_get_list,(void)) /** Given a hex-encoded nickname of the format DIGEST, $DIGEST, $DIGEST=name, * or $DIGEST~name, return the node with the matching identity digest and * nickname (if any). Return NULL if no such node exists, or if hex_id - * is not well-formed. DOCDOC flags */ + * is not well-formed. */ const node_t * -node_get_by_hex_id(const char *hex_id, unsigned flags) +node_get_by_hex_id(const char *hex_id) { char digest_buf[DIGEST_LEN]; char nn_buf[MAX_NICKNAME_LEN+1]; char nn_char='\0'; - (void) flags; // XXXX - if (hex_digest_nickname_decode(hex_id, digest_buf, &nn_char, nn_buf)==0) { const node_t *node = node_get_by_id(digest_buf); if (!node) return NULL; - if (nn_char == '=') { - /* "=" indicates a Named relay, but there aren't any of those now. */ - return NULL; + if (nn_char) { + const char *real_name = node_get_nickname(node); + if (!real_name || strcasecmp(real_name, nn_buf)) + return NULL; + if (nn_char == '=') { + const char *named_id = + networkstatus_get_router_digest_by_nickname(nn_buf); + if (!named_id || tor_memneq(named_id, digest_buf, DIGEST_LEN)) + return NULL; + } } return node; } @@ -834,27 +502,40 @@ node_get_by_hex_id(const char *hex_id, unsigned flags) } /** Given a nickname (possibly verbose, possibly a hexadecimal digest), return - * the corresponding node_t, or NULL if none exists. Warn the user if they - * have specified a router by nickname, unless the NNF_NO_WARN_UNNAMED bit is - * set in flags. */ -MOCK_IMPL(const node_t *, -node_get_by_nickname,(const char *nickname, unsigned flags)) + * the corresponding node_t, or NULL if none exists. Warn the user if + * warn_if_unnamed is set, and they have specified a router by + * nickname, but the Named flag isn't set for that router. */ +const node_t * +node_get_by_nickname(const char *nickname, int warn_if_unnamed) { - const int warn_if_unnamed = !(flags & NNF_NO_WARN_UNNAMED); - + const node_t *node; if (!the_nodelist) return NULL; /* Handle these cases: DIGEST, $DIGEST, $DIGEST=name, $DIGEST~name. */ - { - const node_t *node; - if ((node = node_get_by_hex_id(nickname, flags)) != NULL) + if ((node = node_get_by_hex_id(nickname)) != NULL) return node; - } if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) return NULL; + /* Okay, so if we get here, the nickname is just a nickname. Is there + * a binding for it in the consensus? */ + { + const char *named_id = + networkstatus_get_router_digest_by_nickname(nickname); + if (named_id) + return node_get_by_id(named_id); + } + + /* Is it marked as owned-by-someone-else? */ + if (networkstatus_nickname_is_unnamed(nickname)) { + log_info(LD_GENERAL, "The name %s is listed as Unnamed: there is some " + "router that holds it, but not one listed in the current " + "consensus.", escaped(nickname)); + return NULL; + } + /* Okay, so the name is not canonical for anybody. */ { smartlist_t *matches = smartlist_new(); @@ -879,15 +560,17 @@ node_get_by_nickname,(const char *nickname, unsigned flags)) "but none is listed as Named in the directory consensus. " "Choosing one arbitrarily.", nickname); } - } else if (smartlist_len(matches)==1 && warn_if_unnamed) { + } else if (smartlist_len(matches)>1 && warn_if_unnamed) { char fp[HEX_DIGEST_LEN+1]; node_t *node = smartlist_get(matches, 0); - if (! node->name_lookup_warned) { + if (node->name_lookup_warned) { base16_encode(fp, sizeof(fp), node->identity, DIGEST_LEN); log_warn(LD_CONFIG, - "You specified a relay \"%s\" by name, but nicknames can be " - "used by any relay, not just the one you meant. " - "To make sure you get the same relay in the future, refer " + "You specified a server \"%s\" by name, but the directory " + "authorities do not have any key registered for this " + "nickname -- so it could be used by any server, not just " + "the one you meant. " + "To make sure you get the same server in the future, refer " "to it by key, as \"$%s\".", nickname, fp); node->name_lookup_warned = 1; } @@ -901,167 +584,6 @@ node_get_by_nickname,(const char *nickname, unsigned flags)) } } -/** Return the Ed25519 identity key for the provided node, or NULL if it - * doesn't have one. */ -const ed25519_public_key_t * -node_get_ed25519_id(const node_t *node) -{ - const ed25519_public_key_t *ri_pk = NULL; - const ed25519_public_key_t *md_pk = NULL; - if (node->ri) { - if (node->ri->cache_info.signing_key_cert) { - ri_pk = &node->ri->cache_info.signing_key_cert->signing_key; - if (BUG(ed25519_public_key_is_zero(ri_pk))) - ri_pk = NULL; - } - } - - if (node->md) { - if (node->md->ed25519_identity_pkey) { - md_pk = node->md->ed25519_identity_pkey; - } - } - - if (ri_pk && md_pk) { - if (ed25519_pubkey_eq(ri_pk, md_pk)) { - return ri_pk; - } else { - /* This can happen if the relay gets flagged NoEdConsensus which will be - * triggered on all relays of the network. Thus a protocol warning. */ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Inconsistent ed25519 identities in the nodelist"); - return NULL; - } - } else if (ri_pk) { - return ri_pk; - } else { - return md_pk; - } -} - -/** Return true iff this node's Ed25519 identity matches id. - * (An absent Ed25519 identity matches NULL or zero.) */ -int -node_ed25519_id_matches(const node_t *node, const ed25519_public_key_t *id) -{ - const ed25519_public_key_t *node_id = node_get_ed25519_id(node); - if (node_id == NULL || ed25519_public_key_is_zero(node_id)) { - return id == NULL || ed25519_public_key_is_zero(id); - } else { - return id && ed25519_pubkey_eq(node_id, id); - } -} - -/** Return true iff node supports authenticating itself - * by ed25519 ID during the link handshake. If compatible_with_us, - * it needs to be using a link authentication method that we understand. - * If not, any plausible link authentication method will do. */ -int -node_supports_ed25519_link_authentication(const node_t *node, - int compatible_with_us) -{ - if (! node_get_ed25519_id(node)) - return 0; - if (node->ri) { - const char *protos = node->ri->protocol_list; - if (protos == NULL) - return 0; - if (compatible_with_us) - return protocol_list_supports_protocol(protos, PRT_LINKAUTH, 3); - else - return protocol_list_supports_protocol_or_later(protos, PRT_LINKAUTH, 3); - } - if (node->rs) { - if (compatible_with_us) - return node->rs->supports_ed25519_link_handshake_compat; - else - return node->rs->supports_ed25519_link_handshake_any; - } - tor_assert_nonfatal_unreached_once(); - return 0; -} - -/** Return true iff node supports the hidden service directory version - * 3 protocol (proposal 224). */ -int -node_supports_v3_hsdir(const node_t *node) -{ - tor_assert(node); - - if (node->rs) { - return node->rs->supports_v3_hsdir; - } - if (node->ri) { - if (node->ri->protocol_list == NULL) { - return 0; - } - /* Bug #22447 forces us to filter on tor version: - * If platform is a Tor version, and older than 0.3.0.8, return False. - * Else, obey the protocol list. */ - if (node->ri->platform) { - if (!strcmpstart(node->ri->platform, "Tor ") && - !tor_version_as_new_as(node->ri->platform, "0.3.0.8")) { - return 0; - } - } - return protocol_list_supports_protocol(node->ri->protocol_list, - PRT_HSDIR, PROTOVER_HSDIR_V3); - } - tor_assert_nonfatal_unreached_once(); - return 0; -} - -/** Return true iff node supports ed25519 authentication as an hidden - * service introduction point.*/ -int -node_supports_ed25519_hs_intro(const node_t *node) -{ - tor_assert(node); - - if (node->rs) { - return node->rs->supports_ed25519_hs_intro; - } - if (node->ri) { - if (node->ri->protocol_list == NULL) { - return 0; - } - return protocol_list_supports_protocol(node->ri->protocol_list, - PRT_HSINTRO, PROTOVER_HS_INTRO_V3); - } - tor_assert_nonfatal_unreached_once(); - return 0; -} - -/** Return true iff node supports to be a rendezvous point for hidden - * service version 3 (HSRend=2). */ -int -node_supports_v3_rendezvous_point(const node_t *node) -{ - tor_assert(node); - - if (node->rs) { - return node->rs->supports_v3_rendezvous_point; - } - if (node->ri) { - if (node->ri->protocol_list == NULL) { - return 0; - } - return protocol_list_supports_protocol(node->ri->protocol_list, - PRT_HSREND, - PROTOVER_HS_RENDEZVOUS_POINT_V3); - } - tor_assert_nonfatal_unreached_once(); - return 0; -} - -/** Return the RSA ID key's SHA1 digest for the provided node. */ -const uint8_t * -node_get_rsa_id_digest(const node_t *node) -{ - tor_assert(node); - return (const uint8_t*)node->identity; -} - /** Return the nickname of node, or NULL if we can't find one. */ const char * node_get_nickname(const node_t *node) @@ -1075,24 +597,32 @@ node_get_nickname(const node_t *node) return NULL; } +/** Return true iff the nickname of node is canonical, based on the + * latest consensus. */ +int +node_is_named(const node_t *node) +{ + const char *named_id; + const char *nickname = node_get_nickname(node); + if (!nickname) + return 0; + named_id = networkstatus_get_router_digest_by_nickname(nickname); + if (!named_id) + return 0; + return tor_memeq(named_id, node->identity, DIGEST_LEN); +} + /** Return true iff node appears to be a directory authority or * directory cache */ int node_is_dir(const node_t *node) { - if (node->rs) { - routerstatus_t * rs = node->rs; - /* This is true if supports_tunnelled_dir_requests is true which - * indicates that we support directory request tunnelled or through the - * DirPort. */ - return rs->is_v2_dir; - } else if (node->ri) { - routerinfo_t * ri = node->ri; - /* Both tunnelled request is supported or DirPort is set. */ - return ri->supports_tunnelled_dir_requests; - } else { + if (node->rs) + return node->rs->dir_port != 0; + else if (node->ri) + return node->ri->dir_port != 0; + else return 0; - } } /** Return true iff node has either kind of usable descriptor -- that @@ -1122,12 +652,13 @@ node_get_verbose_nickname(const node_t *node, char *verbose_name_out) { const char *nickname = node_get_nickname(node); + int is_named = node_is_named(node); verbose_name_out[0] = '$'; base16_encode(verbose_name_out+1, HEX_DIGEST_LEN+1, node->identity, DIGEST_LEN); if (!nickname) return; - verbose_name_out[1+HEX_DIGEST_LEN] = '~'; + verbose_name_out[1+HEX_DIGEST_LEN] = is_named ? '=' : '~'; strlcpy(verbose_name_out+1+HEX_DIGEST_LEN+1, nickname, MAX_NICKNAME_LEN+1); } @@ -1196,40 +727,6 @@ node_exit_policy_is_exact(const node_t *node, sa_family_t family) return 1; } -/* Check if the "addr" and port_field fields from r are a valid non-listening - * address/port. If so, set valid to true and add a newly allocated - * tor_addr_port_t containing "addr" and port_field to sl. - * "addr" is an IPv4 host-order address and port_field is a uint16_t. - * r is typically a routerinfo_t or routerstatus_t. - */ -#define SL_ADD_NEW_IPV4_AP(r, port_field, sl, valid) \ - STMT_BEGIN \ - if (tor_addr_port_is_valid_ipv4h((r)->addr, (r)->port_field, 0)) { \ - valid = 1; \ - tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); \ - tor_addr_from_ipv4h(&ap->addr, (r)->addr); \ - ap->port = (r)->port_field; \ - smartlist_add((sl), ap); \ - } \ - STMT_END - -/* Check if the "addr" and port_field fields from r are a valid non-listening - * address/port. If so, set valid to true and add a newly allocated - * tor_addr_port_t containing "addr" and port_field to sl. - * "addr" is a tor_addr_t and port_field is a uint16_t. - * r is typically a routerinfo_t or routerstatus_t. - */ -#define SL_ADD_NEW_IPV6_AP(r, port_field, sl, valid) \ - STMT_BEGIN \ - if (tor_addr_port_is_valid(&(r)->ipv6_addr, (r)->port_field, 0)) { \ - valid = 1; \ - tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); \ - tor_addr_copy(&ap->addr, &(r)->ipv6_addr); \ - ap->port = (r)->port_field; \ - smartlist_add((sl), ap); \ - } \ - STMT_END - /** Return list of tor_addr_port_t with all OR ports (in the sense IP * addr + TCP port) for node. Caller must free all elements * using tor_free() and free the list using smartlist_free(). @@ -1242,38 +739,30 @@ smartlist_t * node_get_all_orports(const node_t *node) { smartlist_t *sl = smartlist_new(); - int valid = 0; - - /* Find a valid IPv4 address and port */ - if (node->ri != NULL) { - SL_ADD_NEW_IPV4_AP(node->ri, or_port, sl, valid); - } - - /* If we didn't find a valid address/port in the ri, try the rs */ - if (!valid && node->rs != NULL) { - SL_ADD_NEW_IPV4_AP(node->rs, or_port, sl, valid); - } - /* Find a valid IPv6 address and port */ - valid = 0; if (node->ri != NULL) { - SL_ADD_NEW_IPV6_AP(node->ri, ipv6_orport, sl, valid); - } - - if (!valid && node->rs != NULL) { - SL_ADD_NEW_IPV6_AP(node->rs, ipv6_orport, sl, valid); - } - - if (!valid && node->md != NULL) { - SL_ADD_NEW_IPV6_AP(node->md, ipv6_orport, sl, valid); + if (node->ri->addr != 0) { + tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); + tor_addr_from_ipv4h(&ap->addr, node->ri->addr); + ap->port = node->ri->or_port; + smartlist_add(sl, ap); + } + if (!tor_addr_is_null(&node->ri->ipv6_addr)) { + tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); + tor_addr_copy(&ap->addr, &node->ri->ipv6_addr); + ap->port = node->ri->or_port; + smartlist_add(sl, ap); + } + } else if (node->rs != NULL) { + tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); + tor_addr_from_ipv4h(&ap->addr, node->rs->addr); + ap->port = node->rs->or_port; + smartlist_add(sl, ap); } return sl; } -#undef SL_ADD_NEW_IPV4_AP -#undef SL_ADD_NEW_IPV6_AP - /** Wrapper around node_get_prim_orport for backward compatibility. */ void @@ -1289,13 +778,9 @@ node_get_addr(const node_t *node, tor_addr_t *addr_out) uint32_t node_get_prim_addr_ipv4h(const node_t *node) { - /* Don't check the ORPort or DirPort, as this function isn't port-specific, - * and the node might have a valid IPv4 address, yet have a zero - * ORPort or DirPort. - */ - if (node->ri && tor_addr_is_valid_ipv4h(node->ri->addr, 0)) { + if (node->ri) { return node->ri->addr; - } else if (node->rs && tor_addr_is_valid_ipv4h(node->rs->addr, 0)) { + } else if (node->rs) { return node->rs->addr; } return 0; @@ -1306,13 +791,13 @@ node_get_prim_addr_ipv4h(const node_t *node) void node_get_address_string(const node_t *node, char *buf, size_t len) { - uint32_t ipv4_addr = node_get_prim_addr_ipv4h(node); - - if (tor_addr_is_valid_ipv4h(ipv4_addr, 0)) { + if (node->ri) { + strlcpy(buf, node->ri->address, len); + } else if (node->rs) { tor_addr_t addr; - tor_addr_from_ipv4h(&addr, ipv4_addr); + tor_addr_from_ipv4h(&addr, node->rs->addr); tor_addr_to_str(buf, &addr, len, 0); - } else if (len > 0) { + } else { buf[0] = '\0'; } } @@ -1341,6 +826,16 @@ node_get_platform(const node_t *node) return NULL; } +/** Return node's time of publication, or 0 if we don't have one. */ +time_t +node_get_published_on(const node_t *node) +{ + if (node->ri) + return node->ri->cache_info.published_on; + else + return 0; +} + /** Return true iff node is one representing this router. */ int node_is_me(const node_t *node) @@ -1361,83 +856,30 @@ node_get_declared_family(const node_t *node) return NULL; } -/* Does this node have a valid IPv6 address? - * Prefer node_has_ipv6_orport() or node_has_ipv6_dirport() for - * checking specific ports. */ -int -node_has_ipv6_addr(const node_t *node) -{ - /* Don't check the ORPort or DirPort, as this function isn't port-specific, - * and the node might have a valid IPv6 address, yet have a zero - * ORPort or DirPort. - */ - if (node->ri && tor_addr_is_valid(&node->ri->ipv6_addr, 0)) - return 1; - if (node->rs && tor_addr_is_valid(&node->rs->ipv6_addr, 0)) - return 1; - if (node->md && tor_addr_is_valid(&node->md->ipv6_addr, 0)) - return 1; - - return 0; -} - -/* Does this node have a valid IPv6 ORPort? */ -int -node_has_ipv6_orport(const node_t *node) -{ - tor_addr_port_t ipv6_orport; - node_get_pref_ipv6_orport(node, &ipv6_orport); - return tor_addr_port_is_valid_ap(&ipv6_orport, 0); -} - -/* Does this node have a valid IPv6 DirPort? */ -int -node_has_ipv6_dirport(const node_t *node) -{ - tor_addr_port_t ipv6_dirport; - node_get_pref_ipv6_dirport(node, &ipv6_dirport); - return tor_addr_port_is_valid_ap(&ipv6_dirport, 0); -} - /** Return 1 if we prefer the IPv6 address and OR TCP port of * node, else 0. * - * We prefer the IPv6 address if the router has an IPv6 address, - * and we can use IPv6 addresses, and: + * We prefer the IPv6 address if the router has an IPv6 address and * i) the node_t says that it prefers IPv6 * or - * ii) the router has no IPv4 OR address. - * - * If you don't have a node, consider looking it up. - * If there is no node, use fascist_firewall_prefer_ipv6_orport(). - */ + * ii) the router has no IPv4 address. */ int -node_ipv6_or_preferred(const node_t *node) +node_ipv6_preferred(const node_t *node) { - const or_options_t *options = get_options(); tor_addr_port_t ipv4_addr; node_assert_ok(node); - /* XX/teor - node->ipv6_preferred is set from - * fascist_firewall_prefer_ipv6_orport() each time the consensus is loaded. - */ - if (!fascist_firewall_use_ipv6(options)) { - return 0; - } else if (node->ipv6_preferred || node_get_prim_orport(node, &ipv4_addr)) { - return node_has_ipv6_orport(node); + if (node->ipv6_preferred || node_get_prim_orport(node, &ipv4_addr)) { + if (node->ri) + return !tor_addr_is_null(&node->ri->ipv6_addr); + if (node->md) + return !tor_addr_is_null(&node->md->ipv6_addr); + if (node->rs) + return !tor_addr_is_null(&node->rs->ipv6_addr); } return 0; } -#define RETURN_IPV4_AP(r, port_field, ap_out) \ - STMT_BEGIN \ - if (r && tor_addr_port_is_valid_ipv4h((r)->addr, (r)->port_field, 0)) { \ - tor_addr_from_ipv4h(&(ap_out)->addr, (r)->addr); \ - (ap_out)->port = (r)->port_field; \ - return 0; \ - } \ - STMT_END - /** Copy the primary (IPv4) OR port (IP address and TCP port) for * node into *ap_out. Return 0 if a valid address and * port was copied, else return non-zero.*/ @@ -1447,18 +889,20 @@ node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); - /* Clear the address, as a safety precaution if calling functions ignore the - * return value */ - tor_addr_make_null(&ap_out->addr, AF_INET); - ap_out->port = 0; - - /* Check ri first, because rewrite_node_address_for_bridge() updates - * node->ri with the configured bridge address. */ - - RETURN_IPV4_AP(node->ri, or_port, ap_out); - RETURN_IPV4_AP(node->rs, or_port, ap_out); - /* Microdescriptors only have an IPv6 address */ - + if (node->ri) { + if (node->ri->addr == 0 || node->ri->or_port == 0) + return -1; + tor_addr_from_ipv4h(&ap_out->addr, node->ri->addr); + ap_out->port = node->ri->or_port; + return 0; + } + if (node->rs) { + if (node->rs->addr == 0 || node->rs->or_port == 0) + return -1; + tor_addr_from_ipv4h(&ap_out->addr, node->rs->addr); + ap_out->port = node->rs->or_port; + return 0; + } return -1; } @@ -1467,12 +911,21 @@ node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out) void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out) { + const or_options_t *options = get_options(); tor_assert(ap_out); - if (node_ipv6_or_preferred(node)) { + /* Cheap implementation of config option ClientUseIPv6 -- simply + don't prefer IPv6 when ClientUseIPv6 is not set and we're not a + client running with bridges. See #4455 for more on this subject. + + Note that this filter is too strict since we're hindering not + only clients! Erring on the safe side shouldn't be a problem + though. XXX move this check to where outgoing connections are + made? -LN */ + if ((options->ClientUseIPv6 || options->UseBridges) && + node_ipv6_preferred(node)) { node_get_pref_ipv6_orport(node, ap_out); } else { - /* the primary ORPort is always on IPv4 */ node_get_prim_orport(node, ap_out); } } @@ -1485,174 +938,35 @@ node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out) node_assert_ok(node); tor_assert(ap_out); - /* Check ri first, because rewrite_node_address_for_bridge() updates - * node->ri with the configured bridge address. - * Prefer rs over md for consistency with the fascist_firewall_* functions. - * Check if the address or port are valid, and try another alternative - * if they are not. */ + /* We prefer the microdesc over a potential routerstatus here. They + are not being synchronised atm so there might be a chance that + they differ at some point, f.ex. when flipping + UseMicrodescriptors? -LN */ - if (node->ri && tor_addr_port_is_valid(&node->ri->ipv6_addr, - node->ri->ipv6_orport, 0)) { + if (node->ri) { tor_addr_copy(&ap_out->addr, &node->ri->ipv6_addr); ap_out->port = node->ri->ipv6_orport; - } else if (node->rs && tor_addr_port_is_valid(&node->rs->ipv6_addr, - node->rs->ipv6_orport, 0)) { - tor_addr_copy(&ap_out->addr, &node->rs->ipv6_addr); - ap_out->port = node->rs->ipv6_orport; - } else if (node->md && tor_addr_port_is_valid(&node->md->ipv6_addr, - node->md->ipv6_orport, 0)) { + } else if (node->md) { tor_addr_copy(&ap_out->addr, &node->md->ipv6_addr); ap_out->port = node->md->ipv6_orport; - } else { - tor_addr_make_null(&ap_out->addr, AF_INET6); - ap_out->port = 0; - } -} - -/** Return 1 if we prefer the IPv6 address and Dir TCP port of - * node, else 0. - * - * We prefer the IPv6 address if the router has an IPv6 address, - * and we can use IPv6 addresses, and: - * i) the router has no IPv4 Dir address. - * or - * ii) our preference is for IPv6 Dir addresses. - * - * If there is no node, use fascist_firewall_prefer_ipv6_dirport(). - */ -int -node_ipv6_dir_preferred(const node_t *node) -{ - const or_options_t *options = get_options(); - tor_addr_port_t ipv4_addr; - node_assert_ok(node); - - /* node->ipv6_preferred is set from fascist_firewall_prefer_ipv6_orport(), - * so we can't use it to determine DirPort IPv6 preference. - * This means that bridge clients will use IPv4 DirPorts by default. - */ - if (!fascist_firewall_use_ipv6(options)) { - return 0; - } else if (node_get_prim_dirport(node, &ipv4_addr) - || fascist_firewall_prefer_ipv6_dirport(get_options())) { - return node_has_ipv6_dirport(node); - } - return 0; -} - -/** Copy the primary (IPv4) Dir port (IP address and TCP port) for - * node into *ap_out. Return 0 if a valid address and - * port was copied, else return non-zero.*/ -int -node_get_prim_dirport(const node_t *node, tor_addr_port_t *ap_out) -{ - node_assert_ok(node); - tor_assert(ap_out); - - /* Check ri first, because rewrite_node_address_for_bridge() updates - * node->ri with the configured bridge address. */ - - RETURN_IPV4_AP(node->ri, dir_port, ap_out); - RETURN_IPV4_AP(node->rs, dir_port, ap_out); - /* Microdescriptors only have an IPv6 address */ - - return -1; -} - -#undef RETURN_IPV4_AP - -/** Copy the preferred Dir port (IP address and TCP port) for - * node into *ap_out. */ -void -node_get_pref_dirport(const node_t *node, tor_addr_port_t *ap_out) -{ - tor_assert(ap_out); - - if (node_ipv6_dir_preferred(node)) { - node_get_pref_ipv6_dirport(node, ap_out); - } else { - /* the primary DirPort is always on IPv4 */ - node_get_prim_dirport(node, ap_out); - } -} - -/** Copy the preferred IPv6 Dir port (IP address and TCP port) for - * node into *ap_out. */ -void -node_get_pref_ipv6_dirport(const node_t *node, tor_addr_port_t *ap_out) -{ - node_assert_ok(node); - tor_assert(ap_out); - - /* Check ri first, because rewrite_node_address_for_bridge() updates - * node->ri with the configured bridge address. - * Prefer rs over md for consistency with the fascist_firewall_* functions. - * Check if the address or port are valid, and try another alternative - * if they are not. */ - - /* Assume IPv4 and IPv6 dirports are the same */ - if (node->ri && tor_addr_port_is_valid(&node->ri->ipv6_addr, - node->ri->dir_port, 0)) { - tor_addr_copy(&ap_out->addr, &node->ri->ipv6_addr); - ap_out->port = node->ri->dir_port; - } else if (node->rs && tor_addr_port_is_valid(&node->rs->ipv6_addr, - node->rs->dir_port, 0)) { + } else if (node->rs) { tor_addr_copy(&ap_out->addr, &node->rs->ipv6_addr); - ap_out->port = node->rs->dir_port; - } else { - tor_addr_make_null(&ap_out->addr, AF_INET6); - ap_out->port = 0; - } -} - -/** Return true iff md has a curve25519 onion key. - * Use node_has_curve25519_onion_key() instead of calling this directly. */ -static int -microdesc_has_curve25519_onion_key(const microdesc_t *md) -{ - if (!md) { - return 0; - } - - if (!md->onion_curve25519_pkey) { - return 0; - } - - if (tor_mem_is_zero((const char*)md->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN)) { - return 0; + ap_out->port = node->rs->ipv6_orport; } - - return 1; } /** Return true iff node has a curve25519 onion key. */ int node_has_curve25519_onion_key(const node_t *node) { - if (!node) - return 0; - if (node->ri) - return routerinfo_has_curve25519_onion_key(node->ri); + return node->ri->onion_curve25519_pkey != NULL; else if (node->md) - return microdesc_has_curve25519_onion_key(node->md); + return node->md->onion_curve25519_pkey != NULL; else return 0; } -/** Return the curve25519 key of node, or NULL if none. */ -const curve25519_public_key_t * -node_get_curve25519_onion_key(const node_t *node) -{ - if (node->ri) - return node->ri->onion_curve25519_pkey; - else if (node->md) - return node->md->onion_curve25519_pkey; - else - return NULL; -} - /** Refresh the country code of ri. This function MUST be called on * each router when the GeoIP database is reloaded, and on all new routers. */ void @@ -1680,7 +994,7 @@ nodelist_refresh_countries(void) /** Return true iff router1 and router2 have similar enough network addresses * that we should treat them as being in the same family */ -int +static INLINE int addrs_in_same_network_family(const tor_addr_t *a1, const tor_addr_t *a2) { @@ -1699,11 +1013,12 @@ node_nickname_matches(const node_t *node, const char *nickname) return 1; return hex_digest_nickname_matches(nickname, node->identity, - n); + n, + node_is_named(node)); } /** Return true iff node is named by some nickname in lst. */ -static inline int +static INLINE int node_in_nickname_smartlist(const smartlist_t *lst, const node_t *node) { if (!lst) return 0; @@ -1801,7 +1116,7 @@ nodelist_add_node_and_family(smartlist_t *sl, const node_t *node) SMARTLIST_FOREACH_BEGIN(declared_family, const char *, name) { const node_t *node2; const smartlist_t *family2; - if (!(node2 = node_get_by_nickname(name, NNF_NO_WARN_UNNAMED))) + if (!(node2 = node_get_by_nickname(name, 0))) continue; if (!(family2 = node_get_declared_family(node2))) continue; @@ -1922,76 +1237,37 @@ router_set_status(const char *digest, int up) if (!up && node_is_me(node) && !net_is_disabled()) log_warn(LD_NET, "We just marked ourself as down. Are your external " "addresses reachable?"); - - if (bool_neq(node->is_running, up)) - router_dir_info_changed(); - node->is_running = up; } + + router_dir_info_changed(); } /** True iff, the last time we checked whether we had enough directory info - * to build circuits, the answer was "yes". If there are no exits in the - * consensus, we act as if we have 100% of the exit directory info. */ + * to build circuits, the answer was "yes". */ static int have_min_dir_info = 0; - -/** Does the consensus contain nodes that can exit? */ -static consensus_path_type_t have_consensus_path = CONSENSUS_PATH_UNKNOWN; - /** True iff enough has changed since the last time we checked whether we had * enough directory info to build circuits that our old answer can no longer * be trusted. */ static int need_to_update_have_min_dir_info = 1; /** String describing what we're missing before we have enough directory * info. */ -static char dir_info_status[512] = ""; - -/** Return true iff we have enough consensus information to - * start building circuits. Right now, this means "a consensus that's - * less than a day old, and at least 60% of router descriptors (configurable), - * weighted by bandwidth. Treat the exit fraction as 100% if there are - * no exits in the consensus." - * To obtain the final weighted bandwidth, we multiply the - * weighted bandwidth fraction for each position (guard, middle, exit). */ -MOCK_IMPL(int, -router_have_minimum_dir_info,(void)) -{ - static int logged_delay=0; - const char *delay_fetches_msg = NULL; - if (should_delay_dir_fetches(get_options(), &delay_fetches_msg)) { - if (!logged_delay) - log_notice(LD_DIR, "Delaying directory fetches: %s", delay_fetches_msg); - logged_delay=1; - strlcpy(dir_info_status, delay_fetches_msg, sizeof(dir_info_status)); - return 0; - } - logged_delay = 0; /* reset it if we get this far */ +static char dir_info_status[256] = ""; +/** Return true iff we have enough networkstatus and router information to + * start building circuits. Right now, this means "more than half the + * networkstatus documents, and at least 1/4 of expected routers." */ +//XXX should consider whether we have enough exiting nodes here. +int +router_have_minimum_dir_info(void) +{ if (PREDICT_UNLIKELY(need_to_update_have_min_dir_info)) { update_router_have_minimum_dir_info(); + need_to_update_have_min_dir_info = 0; } - return have_min_dir_info; } -/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node - * in the consensus. We update this flag in compute_frac_paths_available if - * there is at least one relay that has an Exit flag in the consensus. - * Used to avoid building exit circuits when they will almost certainly fail. - * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus. - * (This situation typically occurs during bootstrap of a test network.) - * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have - * reason to believe our last known value was invalid or has expired. - * If we're in a network with TestingDirAuthVoteExit set, - * this can cause router_have_consensus_path() to be set to - * CONSENSUS_PATH_EXIT, even if there are no nodes with accept exit policies. - */ -MOCK_IMPL(consensus_path_type_t, -router_have_consensus_path, (void)) -{ - return have_consensus_path; -} - /** Called when our internal view of the directory has changed. This can be * when the authorities change, networkstatuses change, the list of routerdescs * changes, or number of running routers changes. @@ -2001,8 +1277,6 @@ router_dir_info_changed(void) { need_to_update_have_min_dir_info = 1; rend_hsdir_routers_changed(); - hs_service_dir_info_changed(); - hs_client_dir_info_changed(); } /** Return a string describing what we're missing before we have enough @@ -2014,26 +1288,22 @@ get_dir_info_status_string(void) } /** Iterate over the servers listed in consensus, and count how many of - * them seem like ones we'd use (store this in *num_usable), and how - * many of those we have descriptors for (store this in - * *num_present). - * - * If in_set is non-NULL, only consider those routers in in_set. - * If exit_only is USABLE_DESCRIPTOR_EXIT_ONLY, only consider nodes - * with the Exit flag. - * If *descs_out is present, add a node_t for each usable descriptor - * to it. + * them seem like ones we'd use, and how many of those we have + * descriptors for. Store the former in *num_usable and the latter in + * *num_present. If in_set is non-NULL, only consider those + * routers in in_set. If exit_only is true, only consider nodes + * with the Exit flag. If *descs_out is present, add a node_t for each + * usable descriptor to it. */ static void count_usable_descriptors(int *num_present, int *num_usable, smartlist_t *descs_out, const networkstatus_t *consensus, - time_t now, - routerset_t *in_set, - usable_descriptor_t exit_only) + const or_options_t *options, time_t now, + routerset_t *in_set, int exit_only) { const int md = (consensus->flavor == FLAV_MICRODESC); - *num_present = 0, *num_usable = 0; + *num_present = 0, *num_usable=0; SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, rs) { @@ -2041,11 +1311,11 @@ count_usable_descriptors(int *num_present, int *num_usable, if (!node) continue; /* This would be a bug: every entry in the consensus is * supposed to have a node. */ - if (exit_only == USABLE_DESCRIPTOR_EXIT_ONLY && ! rs->is_exit) + if (exit_only && ! rs->is_exit) continue; if (in_set && ! routerset_contains_routerstatus(in_set, rs, -1)) continue; - if (client_would_use_router(rs, now)) { + if (client_would_use_router(rs, now, options)) { const char * const digest = rs->descriptor_digest; int present; ++*num_usable; /* the consensus says we want it. */ @@ -2065,22 +1335,11 @@ count_usable_descriptors(int *num_present, int *num_usable, log_debug(LD_DIR, "%d usable, %d present (%s%s).", *num_usable, *num_present, - md ? "microdesc" : "desc", - exit_only == USABLE_DESCRIPTOR_EXIT_ONLY ? " exits" : "s"); + md ? "microdesc" : "desc", exit_only ? " exits" : "s"); } /** Return an estimate of which fraction of usable paths through the Tor - * network we have available for use. Count how many routers seem like ones - * we'd use (store this in *num_usable_out), and how many of - * those we have descriptors for (store this in - * *num_present_out.) - * - * If **status_out is present, allocate a new string and print the - * available percentages of guard, middle, and exit nodes to it, noting - * whether there are exits in the consensus. - * If there are no exits in the consensus, we treat the exit fraction as 100%, - * but set router_have_consensus_path() so that we can only build internal - * paths. */ + * network we have available for use. */ static double compute_frac_paths_available(const networkstatus_t *consensus, const or_options_t *options, time_t now, @@ -2090,20 +1349,17 @@ compute_frac_paths_available(const networkstatus_t *consensus, smartlist_t *guards = smartlist_new(); smartlist_t *mid = smartlist_new(); smartlist_t *exits = smartlist_new(); - double f_guard, f_mid, f_exit; - double f_path = 0.0; - /* Used to determine whether there are any exits in the consensus */ - int np = 0; - /* Used to determine whether there are any exits with descriptors */ - int nu = 0; + smartlist_t *myexits= smartlist_new(); + smartlist_t *myexits_unflagged = smartlist_new(); + double f_guard, f_mid, f_exit, f_myexit, f_myexit_unflagged; + int np, nu; /* Ignored */ const int authdir = authdir_mode_v3(options); count_usable_descriptors(num_present_out, num_usable_out, - mid, consensus, now, NULL, - USABLE_DESCRIPTOR_ALL); + mid, consensus, options, now, NULL, 0); if (options->EntryNodes) { - count_usable_descriptors(&np, &nu, guards, consensus, now, - options->EntryNodes, USABLE_DESCRIPTOR_ALL); + count_usable_descriptors(&np, &nu, guards, consensus, options, now, + options->EntryNodes, 0); } else { SMARTLIST_FOREACH(mid, const node_t *, node, { if (authdir) { @@ -2116,148 +1372,60 @@ compute_frac_paths_available(const networkstatus_t *consensus, }); } - /* All nodes with exit flag - * If we're in a network with TestingDirAuthVoteExit set, - * this can cause false positives on have_consensus_path, - * incorrectly setting it to CONSENSUS_PATH_EXIT. This is - * an unavoidable feature of forcing authorities to declare - * certain nodes as exits. - */ - count_usable_descriptors(&np, &nu, exits, consensus, now, - NULL, USABLE_DESCRIPTOR_EXIT_ONLY); - log_debug(LD_NET, - "%s: %d present, %d usable", - "exits", - np, - nu); - - /* We need at least 1 exit present in the consensus to consider - * building exit paths */ - /* Update our understanding of whether the consensus has exits */ - consensus_path_type_t old_have_consensus_path = have_consensus_path; - have_consensus_path = ((nu > 0) ? - CONSENSUS_PATH_EXIT : - CONSENSUS_PATH_INTERNAL); - - if (have_consensus_path == CONSENSUS_PATH_INTERNAL - && old_have_consensus_path != have_consensus_path) { - log_notice(LD_NET, - "The current consensus has no exit nodes. " - "Tor can only build internal paths, " - "such as paths to hidden services."); - - /* However, exit nodes can reachability self-test using this consensus, - * join the network, and appear in a later consensus. This will allow - * the network to build exit paths, such as paths for world wide web - * browsing (as distinct from hidden service web browsing). */ - } + /* All nodes with exit flag */ + count_usable_descriptors(&np, &nu, exits, consensus, options, now, + NULL, 1); + /* All nodes with exit flag in ExitNodes option */ + count_usable_descriptors(&np, &nu, myexits, consensus, options, now, + options->ExitNodes, 1); + /* Now compute the nodes in the ExitNodes option where which we don't know + * what their exit policy is, or we know it permits something. */ + count_usable_descriptors(&np, &nu, myexits_unflagged, + consensus, options, now, + options->ExitNodes, 0); + SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) { + if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) + SMARTLIST_DEL_CURRENT(myexits_unflagged, node); + } SMARTLIST_FOREACH_END(node); f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD); f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID); f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT); + f_myexit= frac_nodes_with_descriptors(myexits,WEIGHT_FOR_EXIT); + f_myexit_unflagged= + frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT); - log_debug(LD_NET, - "f_guard: %.2f, f_mid: %.2f, f_exit: %.2f", - f_guard, - f_mid, - f_exit); + /* If our ExitNodes list has eliminated every possible Exit node, and there + * were some possible Exit nodes, then instead consider nodes that permit + * exiting to some ports. */ + if (smartlist_len(myexits) == 0 && + smartlist_len(myexits_unflagged)) { + f_myexit = f_myexit_unflagged; + } smartlist_free(guards); smartlist_free(mid); smartlist_free(exits); + smartlist_free(myexits); + smartlist_free(myexits_unflagged); - if (options->ExitNodes) { - double f_myexit, f_myexit_unflagged; - smartlist_t *myexits= smartlist_new(); - smartlist_t *myexits_unflagged = smartlist_new(); - - /* All nodes with exit flag in ExitNodes option */ - count_usable_descriptors(&np, &nu, myexits, consensus, now, - options->ExitNodes, USABLE_DESCRIPTOR_EXIT_ONLY); - log_debug(LD_NET, - "%s: %d present, %d usable", - "myexits", - np, - nu); - - /* Now compute the nodes in the ExitNodes option where which we don't know - * what their exit policy is, or we know it permits something. */ - count_usable_descriptors(&np, &nu, myexits_unflagged, - consensus, now, - options->ExitNodes, USABLE_DESCRIPTOR_ALL); - log_debug(LD_NET, - "%s: %d present, %d usable", - "myexits_unflagged (initial)", - np, - nu); - - SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) { - if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) { - SMARTLIST_DEL_CURRENT(myexits_unflagged, node); - /* this node is not actually an exit */ - np--; - /* this node is unusable as an exit */ - nu--; - } - } SMARTLIST_FOREACH_END(node); - - log_debug(LD_NET, - "%s: %d present, %d usable", - "myexits_unflagged (final)", - np, - nu); - - f_myexit= frac_nodes_with_descriptors(myexits,WEIGHT_FOR_EXIT); - f_myexit_unflagged= - frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT); - - log_debug(LD_NET, - "f_exit: %.2f, f_myexit: %.2f, f_myexit_unflagged: %.2f", - f_exit, - f_myexit, - f_myexit_unflagged); - - /* If our ExitNodes list has eliminated every possible Exit node, and there - * were some possible Exit nodes, then instead consider nodes that permit - * exiting to some ports. */ - if (smartlist_len(myexits) == 0 && - smartlist_len(myexits_unflagged)) { - f_myexit = f_myexit_unflagged; - } - - smartlist_free(myexits); - smartlist_free(myexits_unflagged); - - /* This is a tricky point here: we don't want to make it easy for a - * directory to trickle exits to us until it learns which exits we have - * configured, so require that we have a threshold both of total exits - * and usable exits. */ - if (f_myexit < f_exit) - f_exit = f_myexit; - } - - /* if the consensus has no exits, treat the exit fraction as 100% */ - if (router_have_consensus_path() != CONSENSUS_PATH_EXIT) { - f_exit = 1.0; - } - - f_path = f_guard * f_mid * f_exit; + /* This is a tricky point here: we don't want to make it easy for a + * directory to trickle exits to us until it learns which exits we have + * configured, so require that we have a threshold both of total exits + * and usable exits. */ + if (f_myexit < f_exit) + f_exit = f_myexit; if (status_out) tor_asprintf(status_out, "%d%% of guards bw, " "%d%% of midpoint bw, and " - "%d%% of exit bw%s = " - "%d%% of path bw", + "%d%% of exit bw", (int)(f_guard*100), (int)(f_mid*100), - (int)(f_exit*100), - (router_have_consensus_path() == CONSENSUS_PATH_EXIT ? - "" : - " (no exits in consensus)"), - (int)(f_path*100)); + (int)(f_exit*100)); - return f_path; + return f_guard * f_mid * f_exit; } /** We just fetched a new set of descriptors. Compute how far through @@ -2312,7 +1480,6 @@ update_router_have_minimum_dir_info(void) { time_t now = time(NULL); int res; - int num_present=0, num_usable=0; const or_options_t *options = get_options(); const networkstatus_t *consensus = networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor()); @@ -2329,11 +1496,19 @@ update_router_have_minimum_dir_info(void) goto done; } + if (should_delay_dir_fetches(get_options())) { + log_notice(LD_DIR, "no known bridge descriptors running yet; stalling"); + strlcpy(dir_info_status, "No live bridge descriptors.", + sizeof(dir_info_status)); + res = 0; + goto done; + } + using_md = consensus->flavor == FLAV_MICRODESC; - /* Check fraction of available paths */ { char *status = NULL; + int num_present=0, num_usable=0; double paths = compute_frac_paths_available(consensus, options, now, &num_present, &num_usable, &status); @@ -2344,6 +1519,7 @@ update_router_have_minimum_dir_info(void) "can only build %d%% of likely paths. (We have %s.)", using_md?"micro":"", num_present, num_usable, (int)(paths*100), status); + /* log_notice(LD_NET, "%s", dir_info_status); */ tor_free(status); res = 0; control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); @@ -2354,30 +1530,13 @@ update_router_have_minimum_dir_info(void) res = 1; } - { /* Check entry guard dirinfo status */ - char *guard_error = entry_guards_get_err_str_if_dir_info_missing(using_md, - num_present, - num_usable); - if (guard_error) { - strlcpy(dir_info_status, guard_error, sizeof(dir_info_status)); - tor_free(guard_error); - res = 0; - goto done; - } - } - done: - - /* If paths have just become available in this update. */ if (res && !have_min_dir_info) { + log_notice(LD_DIR, + "We now have enough directory information to build circuits."); control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO"); - if (control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0) == 0) { - log_notice(LD_DIR, - "We now have enough directory information to build circuits."); - } + control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0); } - - /* If paths have just become unavailable in this update. */ if (!res && have_min_dir_info) { int quiet = directory_too_idle_to_fetch_descriptors(options, now); tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, @@ -2388,8 +1547,8 @@ update_router_have_minimum_dir_info(void) * is back up and usable, and b) disable some activities that Tor * should only do while circuits are working, like reachability tests * and fetching bridge descriptors only over circuits. */ - note_that_we_maybe_cant_complete_circuits(); - have_consensus_path = CONSENSUS_PATH_UNKNOWN; + can_complete_circuit = 0; + control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO"); } have_min_dir_info = res; diff --git a/src/tor/nodelist.h b/src/tor/nodelist.h new file mode 100644 index 000000000..565caa76c --- /dev/null +++ b/src/tor/nodelist.h @@ -0,0 +1,86 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file nodelist.h + * \brief Header file for nodelist.c. + **/ + +#ifndef TOR_NODELIST_H +#define TOR_NODELIST_H + +#define node_assert_ok(n) STMT_BEGIN { \ + tor_assert((n)->ri || (n)->rs); \ + } STMT_END + +node_t *node_get_mutable_by_id(const char *identity_digest); +const node_t *node_get_by_id(const char *identity_digest); +const node_t *node_get_by_hex_id(const char *identity_digest); +node_t *nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out); +node_t *nodelist_add_microdesc(microdesc_t *md); +void nodelist_set_consensus(networkstatus_t *ns); + +void nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md); +void nodelist_remove_routerinfo(routerinfo_t *ri); +void nodelist_purge(void); + +void nodelist_free_all(void); +void nodelist_assert_ok(void); + +const node_t *node_get_by_nickname(const char *nickname, int warn_if_unnamed); +void node_get_verbose_nickname(const node_t *node, + char *verbose_name_out); +void node_get_verbose_nickname_by_id(const char *id_digest, + char *verbose_name_out); +int node_is_named(const node_t *node); +int node_is_dir(const node_t *node); +int node_has_descriptor(const node_t *node); +int node_get_purpose(const node_t *node); +#define node_is_bridge(node) \ + (node_get_purpose((node)) == ROUTER_PURPOSE_BRIDGE) +int node_is_me(const node_t *node); +int node_exit_policy_rejects_all(const node_t *node); +int node_exit_policy_is_exact(const node_t *node, sa_family_t family); +smartlist_t *node_get_all_orports(const node_t *node); +int node_allows_single_hop_exits(const node_t *node); +const char *node_get_nickname(const node_t *node); +const char *node_get_platform(const node_t *node); +uint32_t node_get_prim_addr_ipv4h(const node_t *node); +void node_get_address_string(const node_t *node, char *cp, size_t len); +long node_get_declared_uptime(const node_t *node); +time_t node_get_published_on(const node_t *node); +const smartlist_t *node_get_declared_family(const node_t *node); +int node_ipv6_preferred(const node_t *node); +int node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out); +void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out); +void node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out); +int node_has_curve25519_onion_key(const node_t *node); + +smartlist_t *nodelist_get_list(void); + +/* Temporary during transition to multiple addresses. */ +void node_get_addr(const node_t *node, tor_addr_t *addr_out); +#define node_get_addr_ipv4h(n) node_get_prim_addr_ipv4h((n)) + +void nodelist_refresh_countries(void); +void node_set_country(node_t *node); +void nodelist_add_node_and_family(smartlist_t *nodes, const node_t *node); +int nodes_in_same_family(const node_t *node1, const node_t *node2); + +const node_t *router_find_exact_exit_enclave(const char *address, + uint16_t port); +int node_is_unreliable(const node_t *router, int need_uptime, + int need_capacity, int need_guard); +int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, + int need_uptime); +void router_set_status(const char *digest, int up); +int router_have_minimum_dir_info(void); +void router_dir_info_changed(void); +const char *get_dir_info_status_string(void); +int count_loading_descriptors_progress(void); + +#endif + diff --git a/src/tor/src/or/ntmain.h b/src/tor/ntmain.h similarity index 76% rename from src/tor/src/or/ntmain.h rename to src/tor/ntmain.h index 81b715985..c6927f1a4 100644 --- a/src/tor/src/or/ntmain.h +++ b/src/tor/ntmain.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,9 +12,11 @@ #ifndef TOR_NTMAIN_H #define TOR_NTMAIN_H -#ifdef _WIN32 -#define NT_SERVICE -#endif +//#ifdef _WIN32 +//#if !defined (WINCE) +//#define NT_SERVICE +//#endif +//#endif #ifdef NT_SERVICE int nt_service_parse_options(int argc, char **argv, int *should_exit); @@ -22,7 +24,7 @@ int nt_service_is_stopping(void); void nt_service_set_state(DWORD state); #else #define nt_service_is_stopping() 0 -#endif /* defined(NT_SERVICE) */ +#endif -#endif /* !defined(TOR_NTMAIN_H) */ +#endif diff --git a/src/tor/src/or/onion.c b/src/tor/onion.c similarity index 73% rename from src/tor/src/or/onion.c rename to src/tor/onion.c index bd80c2f50..30b983d91 100644 --- a/src/tor/src/or/onion.c +++ b/src/tor/onion.c @@ -1,69 +1,16 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file onion.c * \brief Functions to queue create cells, wrap the various onionskin types, * and parse and create the CREATE cell and its allies. - * - * This module has a few functions, all related to the CREATE/CREATED - * handshake that we use on links in order to create a circuit, and the - * related EXTEND/EXTENDED handshake that we use over circuits in order to - * extend them an additional hop. - * - * In this module, we provide a set of abstractions to create a uniform - * interface over the three circuit extension handshakes that Tor has used - * over the years (TAP, CREATE_FAST, and ntor). These handshakes are - * implemented in onion_tap.c, onion_fast.c, and onion_ntor.c respectively. - * - * All[*] of these handshakes follow a similar pattern: a client, knowing - * some key from the relay it wants to extend through, generates the - * first part of a handshake. A relay receives that handshake, and sends - * a reply. Once the client handles the reply, it knows that it is - * talking to the right relay, and it shares some freshly negotiated key - * material with that relay. - * - * We sometimes call the client's part of the handshake an "onionskin". - * We do this because historically, Onion Routing used a multi-layer - * structure called an "onion" to construct circuits. Each layer of the - * onion contained key material chosen by the client, the identity of - * the next relay in the circuit, and a smaller onion, encrypted with - * the key of the next relay. When we changed Tor to use a telescoping - * circuit extension design, it corresponded to sending each layer of the - * onion separately -- as a series of onionskins. - * - * Clients invoke these functions when creating or extending a circuit, - * from circuitbuild.c. - * - * Relays invoke these functions when they receive a CREATE or EXTEND - * cell in command.c or relay.c, in order to queue the pending request. - * They also invoke them from cpuworker.c, which handles dispatching - * onionskin requests to different worker threads. - * - *
    - * - * This module also handles: - *
      - *
    • Queueing incoming onionskins on the relay side before passing - * them to worker threads. - *
    • Expiring onionskins on the relay side if they have waited for - * too long. - *
    • Packaging private keys on the server side in order to pass - * them to worker threads. - *
    • Encoding and decoding CREATE, CREATED, CREATE2, and CREATED2 cells. - *
    • Encoding and decodign EXTEND, EXTENDED, EXTEND2, and EXTENDED2 - * relay cells. - *
    - * - * [*] The CREATE_FAST handshake is weaker than described here; see - * onion_fast.c for more information. **/ #include "or.h" -#include "circuitbuild.h" #include "circuitlist.h" #include "config.h" #include "cpuworker.h" @@ -76,9 +23,6 @@ #include "rephist.h" #include "router.h" -// trunnel -#include "ed25519_cert.h" - /** Type for a linked list of circuits that are waiting for a free CPU worker * to process a waiting onion handshake. */ typedef struct onion_queue_t { @@ -94,9 +38,9 @@ typedef struct onion_queue_t { /** Array of queues of circuits waiting for CPU workers. An element is NULL * if that queue is empty.*/ -static TOR_TAILQ_HEAD(onion_queue_head_t, onion_queue_t) - ol_list[MAX_ONION_HANDSHAKE_TYPE+1] = -{ TOR_TAILQ_HEAD_INITIALIZER(ol_list[0]), /* tap */ +TOR_TAILQ_HEAD(onion_queue_head_t, onion_queue_t) + ol_list[MAX_ONION_HANDSHAKE_TYPE+1] = { + TOR_TAILQ_HEAD_INITIALIZER(ol_list[0]), /* tap */ TOR_TAILQ_HEAD_INITIALIZER(ol_list[1]), /* fast */ TOR_TAILQ_HEAD_INITIALIZER(ol_list[2]), /* ntor */ }; @@ -107,7 +51,7 @@ static int ol_entries[MAX_ONION_HANDSHAKE_TYPE+1]; static int num_ntors_per_tap(void); static void onion_queue_entry_remove(onion_queue_t *victim); -/* XXXX Check lengths vs MAX_ONIONSKIN_{CHALLENGE,REPLY}_LEN. +/* XXXX024 Check lengths vs MAX_ONIONSKIN_{CHALLENGE,REPLY}_LEN. * * (By which I think I meant, "make sure that no * X_ONIONSKIN_CHALLENGE/REPLY_LEN is greater than @@ -167,11 +111,15 @@ have_room_for_onionskin(uint16_t type) (uint64_t)options->MaxOnionQueueDelay) return 0; +#ifdef CURVE25519_ENABLED /* If we support the ntor handshake, then don't let TAP handshakes use * more than 2/3 of the space on the queue. */ if (type == ONION_HANDSHAKE_TYPE_TAP && tap_usec / 1000 > (uint64_t)options->MaxOnionQueueDelay * 2 / 3) return 0; +#else + (void) type; +#endif return 1; } @@ -186,12 +134,9 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin) time_t now = time(NULL); if (onionskin->handshake_type > MAX_ONION_HANDSHAKE_TYPE) { - /* LCOV_EXCL_START - * We should have rejected this far before this point */ log_warn(LD_BUG, "Handshake %d out of range! Dropping.", onionskin->handshake_type); return -1; - /* LCOV_EXCL_STOP */ } tmp = tor_malloc_zero(sizeof(onion_queue_t)); @@ -238,9 +183,7 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin) onion_queue_entry_remove(head); log_info(LD_CIRC, "Circuit create request is too old; canceling due to overload."); - if (! TO_CIRCUIT(circ)->marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); - } + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); } return 0; } @@ -356,8 +299,6 @@ onion_pending_remove(or_circuit_t *circ) victim = circ->onionqueue_entry; if (victim) onion_queue_entry_remove(victim); - - cpuworker_cancel_circ_handshake(circ); } /** Remove a queue entry victim from the queue, unlinking it from @@ -366,13 +307,10 @@ static void onion_queue_entry_remove(onion_queue_t *victim) { if (victim->handshake_type > MAX_ONION_HANDSHAKE_TYPE) { - /* LCOV_EXCL_START - * We should have rejected this far before this point */ log_warn(LD_BUG, "Handshake %d out of range! Dropping.", victim->handshake_type); /* XXX leaks */ return; - /* LCOV_EXCL_STOP */ } TOR_TAILQ_REMOVE(&ol_list[victim->handshake_type], victim, next); @@ -391,49 +329,50 @@ onion_queue_entry_remove(onion_queue_t *victim) void clear_pending_onions(void) { - onion_queue_t *victim, *next; + onion_queue_t *victim; int i; for (i=0; i<=MAX_ONION_HANDSHAKE_TYPE; i++) { - for (victim = TOR_TAILQ_FIRST(&ol_list[i]); victim; victim = next) { - next = TOR_TAILQ_NEXT(victim,next); + while ((victim = TOR_TAILQ_FIRST(&ol_list[i]))) { onion_queue_entry_remove(victim); } - tor_assert(TOR_TAILQ_EMPTY(&ol_list[i])); } memset(ol_entries, 0, sizeof(ol_entries)); } /* ============================================================ */ -/** Return a new server_onion_keys_t object with all of the keys +/** Fill in a server_onion_keys_t object at keys with all of the keys * and other info we might need to do onion handshakes. (We make a copy of * our keys for each cpuworker to avoid race conditions with the main thread, * and to avoid locking) */ -server_onion_keys_t * -server_onion_keys_new(void) +void +setup_server_onion_keys(server_onion_keys_t *keys) { - server_onion_keys_t *keys = tor_malloc_zero(sizeof(server_onion_keys_t)); + memset(keys, 0, sizeof(server_onion_keys_t)); memcpy(keys->my_identity, router_get_my_id_digest(), DIGEST_LEN); dup_onion_keys(&keys->onion_key, &keys->last_onion_key); +#ifdef CURVE25519_ENABLED keys->curve25519_key_map = construct_ntor_key_map(); keys->junk_keypair = tor_malloc_zero(sizeof(curve25519_keypair_t)); curve25519_keypair_generate(keys->junk_keypair, 0); - return keys; +#endif } -/** Release all storage held in keys. */ +/** Release all storage held in keys, but do not free keys + * itself (as it's likely to be stack-allocated.) */ void -server_onion_keys_free_(server_onion_keys_t *keys) +release_server_onion_keys(server_onion_keys_t *keys) { if (! keys) return; crypto_pk_free(keys->onion_key); crypto_pk_free(keys->last_onion_key); +#ifdef CURVE25519_ENABLED ntor_key_map_free(keys->curve25519_key_map); tor_free(keys->junk_keypair); - memwipe(keys, 0, sizeof(server_onion_keys_t)); - tor_free(keys); +#endif + memset(keys, 0, sizeof(server_onion_keys_t)); } /** Release whatever storage is held in state, depending on its @@ -450,17 +389,16 @@ onion_handshake_state_release(onion_handshake_state_t *state) fast_handshake_state_free(state->u.fast); state->u.fast = NULL; break; +#ifdef CURVE25519_ENABLED case ONION_HANDSHAKE_TYPE_NTOR: ntor_handshake_state_free(state->u.ntor); state->u.ntor = NULL; break; +#endif default: - /* LCOV_EXCL_START - * This state should not even exist. */ log_warn(LD_BUG, "called with unknown handshake state type %d", (int)state->tag); tor_fragile_assert(); - /* LCOV_EXCL_STOP */ } } @@ -496,7 +434,9 @@ onion_skin_create(int type, r = CREATE_FAST_LEN; break; case ONION_HANDSHAKE_TYPE_NTOR: - if (!extend_info_supports_ntor(node)) +#ifdef CURVE25519_ENABLED + if (tor_mem_is_zero((const char*)node->curve25519_onion_key.public_key, + CURVE25519_PUBKEY_LEN)) return -1; if (onion_skin_ntor_create((const uint8_t*)node->identity_digest, &node->curve25519_onion_key, @@ -505,14 +445,14 @@ onion_skin_create(int type, return -1; r = NTOR_ONIONSKIN_LEN; +#else + return -1; +#endif break; default: - /* LCOV_EXCL_START - * We should never try to create an impossible handshake type. */ log_warn(LD_BUG, "called with unknown handshake state type %d", type); tor_fragile_assert(); r = -1; - /* LCOV_EXCL_STOP */ } if (r > 0) @@ -559,6 +499,7 @@ onion_skin_server_handshake(int type, memcpy(rend_nonce_out, reply_out+DIGEST_LEN, DIGEST_LEN); break; case ONION_HANDSHAKE_TYPE_NTOR: +#ifdef CURVE25519_ENABLED if (onionskin_len < NTOR_ONIONSKIN_LEN) return -1; { @@ -579,14 +520,14 @@ onion_skin_server_handshake(int type, tor_free(keys_tmp); r = NTOR_REPLY_LEN; } +#else + return -1; +#endif break; default: - /* LCOV_EXCL_START - * We should have rejected this far before this point */ log_warn(LD_BUG, "called with unknown handshake state type %d", type); tor_fragile_assert(); return -1; - /* LCOV_EXCL_STOP */ } return r; @@ -598,59 +539,48 @@ onion_skin_server_handshake(int type, * bytes worth of key material in keys_out_len, set * rend_authenticator_out to the "KH" field that can be used to * establish introduction points at this hop, and return 0. On failure, - * return -1, and set *msg_out to an error message if this is worth - * complaining to the user about. */ + * return -1. */ int onion_skin_client_handshake(int type, const onion_handshake_state_t *handshake_state, const uint8_t *reply, size_t reply_len, uint8_t *keys_out, size_t keys_out_len, - uint8_t *rend_authenticator_out, - const char **msg_out) + uint8_t *rend_authenticator_out) { if (handshake_state->tag != type) return -1; switch (type) { case ONION_HANDSHAKE_TYPE_TAP: - if (reply_len != TAP_ONIONSKIN_REPLY_LEN) { - if (msg_out) - *msg_out = "TAP reply was not of the correct length."; + if (reply_len != TAP_ONIONSKIN_REPLY_LEN) return -1; - } if (onion_skin_TAP_client_handshake(handshake_state->u.tap, (const char*)reply, - (char *)keys_out, keys_out_len, - msg_out) < 0) + (char *)keys_out, keys_out_len) < 0) return -1; memcpy(rend_authenticator_out, reply+DH_KEY_LEN, DIGEST_LEN); return 0; case ONION_HANDSHAKE_TYPE_FAST: - if (reply_len != CREATED_FAST_LEN) { - if (msg_out) - *msg_out = "TAP reply was not of the correct length."; + if (reply_len != CREATED_FAST_LEN) return -1; - } if (fast_client_handshake(handshake_state->u.fast, reply, - keys_out, keys_out_len, msg_out) < 0) + keys_out, keys_out_len) < 0) return -1; memcpy(rend_authenticator_out, reply+DIGEST_LEN, DIGEST_LEN); return 0; +#ifdef CURVE25519_ENABLED case ONION_HANDSHAKE_TYPE_NTOR: - if (reply_len < NTOR_REPLY_LEN) { - if (msg_out) - *msg_out = "ntor reply was not of the correct length."; + if (reply_len < NTOR_REPLY_LEN) return -1; - } { size_t keys_tmp_len = keys_out_len + DIGEST_LEN; uint8_t *keys_tmp = tor_malloc(keys_tmp_len); if (onion_skin_ntor_client_handshake(handshake_state->u.ntor, - reply, - keys_tmp, keys_tmp_len, msg_out) < 0) { + reply, + keys_tmp, keys_tmp_len) < 0) { tor_free(keys_tmp); return -1; } @@ -660,6 +590,7 @@ onion_skin_client_handshake(int type, tor_free(keys_tmp); } return 0; +#endif default: log_warn(LD_BUG, "called with unknown handshake state type %d", type); tor_fragile_assert(); @@ -698,10 +629,12 @@ check_create_cell(const create_cell_t *cell, int unknown_ok) if (cell->handshake_len != CREATE_FAST_LEN) return -1; break; +#ifdef CURVE25519_ENABLED case ONION_HANDSHAKE_TYPE_NTOR: if (cell->handshake_len != NTOR_ONIONSKIN_LEN) return -1; break; +#endif default: if (! unknown_ok) return -1; @@ -876,114 +809,13 @@ check_extend_cell(const extend_cell_t *cell) return check_create_cell(&cell->create_cell, 1); } -static int -extend_cell_from_extend1_cell_body(extend_cell_t *cell_out, - const extend1_cell_body_t *cell) -{ - tor_assert(cell_out); - tor_assert(cell); - memset(cell_out, 0, sizeof(*cell_out)); - tor_addr_make_unspec(&cell_out->orport_ipv4.addr); - tor_addr_make_unspec(&cell_out->orport_ipv6.addr); - - cell_out->cell_type = RELAY_COMMAND_EXTEND; - tor_addr_from_ipv4h(&cell_out->orport_ipv4.addr, cell->ipv4addr); - cell_out->orport_ipv4.port = cell->port; - if (tor_memeq(cell->onionskin, NTOR_CREATE_MAGIC, 16)) { - cell_out->create_cell.cell_type = CELL_CREATE2; - cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_NTOR; - cell_out->create_cell.handshake_len = NTOR_ONIONSKIN_LEN; - memcpy(cell_out->create_cell.onionskin, cell->onionskin + 16, - NTOR_ONIONSKIN_LEN); - } else { - cell_out->create_cell.cell_type = CELL_CREATE; - cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_TAP; - cell_out->create_cell.handshake_len = TAP_ONIONSKIN_CHALLENGE_LEN; - memcpy(cell_out->create_cell.onionskin, cell->onionskin, - TAP_ONIONSKIN_CHALLENGE_LEN); - } - memcpy(cell_out->node_id, cell->identity, DIGEST_LEN); - return 0; -} - -static int -create_cell_from_create2_cell_body(create_cell_t *cell_out, - const create2_cell_body_t *cell) -{ - tor_assert(cell_out); - tor_assert(cell); - memset(cell_out, 0, sizeof(create_cell_t)); - if (BUG(cell->handshake_len > sizeof(cell_out->onionskin))) { - /* This should be impossible because there just isn't enough room in the - * input cell to make the handshake_len this large and provide a - * handshake_data to match. */ - return -1; - } - - cell_out->cell_type = CELL_CREATE2; - cell_out->handshake_type = cell->handshake_type; - cell_out->handshake_len = cell->handshake_len; - memcpy(cell_out->onionskin, - create2_cell_body_getconstarray_handshake_data(cell), - cell->handshake_len); - return 0; -} - -static int -extend_cell_from_extend2_cell_body(extend_cell_t *cell_out, - const extend2_cell_body_t *cell) -{ - tor_assert(cell_out); - tor_assert(cell); - int found_ipv4 = 0, found_ipv6 = 0, found_rsa_id = 0, found_ed_id = 0; - memset(cell_out, 0, sizeof(*cell_out)); - tor_addr_make_unspec(&cell_out->orport_ipv4.addr); - tor_addr_make_unspec(&cell_out->orport_ipv6.addr); - cell_out->cell_type = RELAY_COMMAND_EXTEND2; - - unsigned i; - for (i = 0; i < cell->n_spec; ++i) { - const link_specifier_t *ls = extend2_cell_body_getconst_ls(cell, i); - switch (ls->ls_type) { - case LS_IPV4: - if (found_ipv4) - continue; - found_ipv4 = 1; - tor_addr_from_ipv4h(&cell_out->orport_ipv4.addr, ls->un_ipv4_addr); - cell_out->orport_ipv4.port = ls->un_ipv4_port; - break; - case LS_IPV6: - if (found_ipv6) - continue; - found_ipv6 = 1; - tor_addr_from_ipv6_bytes(&cell_out->orport_ipv6.addr, - (const char *)ls->un_ipv6_addr); - cell_out->orport_ipv6.port = ls->un_ipv6_port; - break; - case LS_LEGACY_ID: - if (found_rsa_id) - return -1; - found_rsa_id = 1; - memcpy(cell_out->node_id, ls->un_legacy_id, 20); - break; - case LS_ED25519_ID: - if (found_ed_id) - return -1; - found_ed_id = 1; - memcpy(cell_out->ed_pubkey.pubkey, ls->un_ed25519_id, 32); - break; - default: - /* Ignore this, whatever it is. */ - break; - } - } - - if (!found_rsa_id || !found_ipv4) /* These are mandatory */ - return -1; - - return create_cell_from_create2_cell_body(&cell_out->create_cell, - cell->create2); -} +/** Protocol constants for specifier types in EXTEND2 + * @{ + */ +#define SPECTYPE_IPV4 0 +#define SPECTYPE_IPV6 1 +#define SPECTYPE_LEGACY_ID 2 +/** @} */ /** Parse an EXTEND or EXTEND2 cell (according to command) from the * payload_length bytes of payload into cell_out. Return @@ -992,44 +824,101 @@ int extend_cell_parse(extend_cell_t *cell_out, const uint8_t command, const uint8_t *payload, size_t payload_length) { + const uint8_t *eop; - tor_assert(cell_out); - tor_assert(payload); - + memset(cell_out, 0, sizeof(*cell_out)); if (payload_length > RELAY_PAYLOAD_SIZE) return -1; + eop = payload + payload_length; switch (command) { case RELAY_COMMAND_EXTEND: { - extend1_cell_body_t *cell = NULL; - if (extend1_cell_body_parse(&cell, payload, payload_length)<0 || - cell == NULL) { - if (cell) - extend1_cell_body_free(cell); + if (payload_length != 6 + TAP_ONIONSKIN_CHALLENGE_LEN + DIGEST_LEN) return -1; + + cell_out->cell_type = RELAY_COMMAND_EXTEND; + tor_addr_from_ipv4n(&cell_out->orport_ipv4.addr, get_uint32(payload)); + cell_out->orport_ipv4.port = ntohs(get_uint16(payload+4)); + tor_addr_make_unspec(&cell_out->orport_ipv6.addr); + if (tor_memeq(payload + 6, NTOR_CREATE_MAGIC, 16)) { + cell_out->create_cell.cell_type = CELL_CREATE2; + cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_NTOR; + cell_out->create_cell.handshake_len = NTOR_ONIONSKIN_LEN; + memcpy(cell_out->create_cell.onionskin, payload + 22, + NTOR_ONIONSKIN_LEN); + } else { + cell_out->create_cell.cell_type = CELL_CREATE; + cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_TAP; + cell_out->create_cell.handshake_len = TAP_ONIONSKIN_CHALLENGE_LEN; + memcpy(cell_out->create_cell.onionskin, payload + 6, + TAP_ONIONSKIN_CHALLENGE_LEN); } - int r = extend_cell_from_extend1_cell_body(cell_out, cell); - extend1_cell_body_free(cell); - if (r < 0) - return r; + memcpy(cell_out->node_id, payload + 6 + TAP_ONIONSKIN_CHALLENGE_LEN, + DIGEST_LEN); + break; } - break; case RELAY_COMMAND_EXTEND2: { - extend2_cell_body_t *cell = NULL; - if (extend2_cell_body_parse(&cell, payload, payload_length) < 0 || - cell == NULL) { - if (cell) - extend2_cell_body_free(cell); + uint8_t n_specs, spectype, speclen; + int i; + int found_ipv4 = 0, found_ipv6 = 0, found_id = 0; + tor_addr_make_unspec(&cell_out->orport_ipv4.addr); + tor_addr_make_unspec(&cell_out->orport_ipv6.addr); + + if (payload_length == 0) return -1; + + cell_out->cell_type = RELAY_COMMAND_EXTEND2; + n_specs = *payload++; + /* Parse the specifiers. We'll only take the first IPv4 and first IPv6 + * address, and the node ID, and ignore everything else */ + for (i = 0; i < n_specs; ++i) { + if (eop - payload < 2) + return -1; + spectype = payload[0]; + speclen = payload[1]; + payload += 2; + if (eop - payload < speclen) + return -1; + switch (spectype) { + case SPECTYPE_IPV4: + if (speclen != 6) + return -1; + if (!found_ipv4) { + tor_addr_from_ipv4n(&cell_out->orport_ipv4.addr, + get_uint32(payload)); + cell_out->orport_ipv4.port = ntohs(get_uint16(payload+4)); + found_ipv4 = 1; + } + break; + case SPECTYPE_IPV6: + if (speclen != 18) + return -1; + if (!found_ipv6) { + tor_addr_from_ipv6_bytes(&cell_out->orport_ipv6.addr, + (const char*)payload); + cell_out->orport_ipv6.port = ntohs(get_uint16(payload+16)); + found_ipv6 = 1; + } + break; + case SPECTYPE_LEGACY_ID: + if (speclen != 20) + return -1; + if (found_id) + return -1; + memcpy(cell_out->node_id, payload, 20); + found_id = 1; + break; + } + payload += speclen; } - int r = extend_cell_from_extend2_cell_body(cell_out, cell); - extend2_cell_body_free(cell); - if (r < 0) - return r; + if (!found_id || !found_ipv4) + return -1; + if (parse_create2_payload(&cell_out->create_cell,payload,eop-payload)<0) + return -1; + break; } - break; default: return -1; } @@ -1041,7 +930,6 @@ extend_cell_parse(extend_cell_t *cell_out, const uint8_t command, static int check_extended_cell(const extended_cell_t *cell) { - tor_assert(cell); if (cell->created_cell.cell_type == CELL_CREATED) { if (cell->cell_type != RELAY_COMMAND_EXTENDED) return -1; @@ -1063,9 +951,6 @@ extended_cell_parse(extended_cell_t *cell_out, const uint8_t command, const uint8_t *payload, size_t payload_len) { - tor_assert(cell_out); - tor_assert(payload); - memset(cell_out, 0, sizeof(*cell_out)); if (payload_len > RELAY_PAYLOAD_SIZE) return -1; @@ -1182,21 +1067,6 @@ created_cell_format(cell_t *cell_out, const created_cell_t *cell_in) return 0; } -/** Return true iff we are configured (by torrc or by the networkstatus - * parameters) to use Ed25519 identities in our Extend2 cells. */ -static int -should_include_ed25519_id_extend_cells(const networkstatus_t *ns, - const or_options_t *options) -{ - if (options->ExtendByEd25519ID != -1) - return options->ExtendByEd25519ID; /* The user has an opinion. */ - - return (int) networkstatus_get_param(ns, "ExtendByEd25519ID", - 0 /* default */, - 0 /* min */, - 1 /*max*/); -} - /** Format the EXTEND{,2} cell in cell_in, storing its relay payload in * payload_out, the number of bytes used in *len_out, and the * relay command in *command_out. The payload_out must have @@ -1205,11 +1075,12 @@ int extend_cell_format(uint8_t *command_out, uint16_t *len_out, uint8_t *payload_out, const extend_cell_t *cell_in) { - uint8_t *p; + uint8_t *p, *eop; if (check_extend_cell(cell_in) < 0) return -1; p = payload_out; + eop = payload_out + RELAY_PAYLOAD_SIZE; memset(p, 0, RELAY_PAYLOAD_SIZE); @@ -1219,7 +1090,7 @@ extend_cell_format(uint8_t *command_out, uint16_t *len_out, *command_out = RELAY_COMMAND_EXTEND; *len_out = 6 + TAP_ONIONSKIN_CHALLENGE_LEN + DIGEST_LEN; set_uint32(p, tor_addr_to_ipv4n(&cell_in->orport_ipv4.addr)); - set_uint16(p+4, htons(cell_in->orport_ipv4.port)); + set_uint16(p+4, ntohs(cell_in->orport_ipv4.port)); if (cell_in->create_cell.handshake_type == ONION_HANDSHAKE_TYPE_NTOR) { memcpy(p+6, NTOR_CREATE_MAGIC, 16); memcpy(p+22, cell_in->create_cell.onionskin, NTOR_ONIONSKIN_LEN); @@ -1232,56 +1103,33 @@ extend_cell_format(uint8_t *command_out, uint16_t *len_out, break; case RELAY_COMMAND_EXTEND2: { - uint8_t n_specifiers = 2; + uint8_t n = 2; *command_out = RELAY_COMMAND_EXTEND2; - extend2_cell_body_t *cell = extend2_cell_body_new(); - link_specifier_t *ls; - { - /* IPv4 specifier first. */ - ls = link_specifier_new(); - extend2_cell_body_add_ls(cell, ls); - ls->ls_type = LS_IPV4; - ls->ls_len = 6; - ls->un_ipv4_addr = tor_addr_to_ipv4h(&cell_in->orport_ipv4.addr); - ls->un_ipv4_port = cell_in->orport_ipv4.port; - } - { - /* Then RSA id */ - ls = link_specifier_new(); - extend2_cell_body_add_ls(cell, ls); - ls->ls_type = LS_LEGACY_ID; - ls->ls_len = DIGEST_LEN; - memcpy(ls->un_legacy_id, cell_in->node_id, DIGEST_LEN); - } - if (should_include_ed25519_id_extend_cells(NULL, get_options()) && - !ed25519_public_key_is_zero(&cell_in->ed_pubkey)) { - /* Then, maybe, the ed25519 id! */ - ++n_specifiers; - ls = link_specifier_new(); - extend2_cell_body_add_ls(cell, ls); - ls->ls_type = LS_ED25519_ID; - ls->ls_len = 32; - memcpy(ls->un_ed25519_id, cell_in->ed_pubkey.pubkey, 32); - } - cell->n_spec = n_specifiers; - - /* Now, the handshake */ - cell->create2 = create2_cell_body_new(); - cell->create2->handshake_type = cell_in->create_cell.handshake_type; - cell->create2->handshake_len = cell_in->create_cell.handshake_len; - create2_cell_body_setlen_handshake_data(cell->create2, - cell_in->create_cell.handshake_len); - memcpy(create2_cell_body_getarray_handshake_data(cell->create2), - cell_in->create_cell.onionskin, - cell_in->create_cell.handshake_len); - ssize_t len_encoded = extend2_cell_body_encode( - payload_out, RELAY_PAYLOAD_SIZE, - cell); - extend2_cell_body_free(cell); - if (len_encoded < 0 || len_encoded > UINT16_MAX) + *p++ = n; /* 2 identifiers */ + *p++ = SPECTYPE_IPV4; /* First is IPV4. */ + *p++ = 6; /* It's 6 bytes long. */ + set_uint32(p, tor_addr_to_ipv4n(&cell_in->orport_ipv4.addr)); + set_uint16(p+4, htons(cell_in->orport_ipv4.port)); + p += 6; + *p++ = SPECTYPE_LEGACY_ID; /* Next is an identity digest. */ + *p++ = 20; /* It's 20 bytes long */ + memcpy(p, cell_in->node_id, DIGEST_LEN); + p += 20; + + /* Now we can send the handshake */ + set_uint16(p, htons(cell_in->create_cell.handshake_type)); + set_uint16(p+2, htons(cell_in->create_cell.handshake_len)); + p += 4; + + if (cell_in->create_cell.handshake_len > eop - p) return -1; - *len_out = (uint16_t) len_encoded; + + memcpy(p, cell_in->create_cell.onionskin, + cell_in->create_cell.handshake_len); + + p += cell_in->create_cell.handshake_len; + *len_out = p - payload_out; } break; default: diff --git a/src/tor/src/or/onion.h b/src/tor/onion.h similarity index 90% rename from src/tor/src/or/onion.h rename to src/tor/onion.h index 3b738debe..d62f032b8 100644 --- a/src/tor/src/or/onion.h +++ b/src/tor/onion.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -23,17 +23,17 @@ typedef struct server_onion_keys_t { uint8_t my_identity[DIGEST_LEN]; crypto_pk_t *onion_key; crypto_pk_t *last_onion_key; +#ifdef CURVE25519_ENABLED di_digest256_map_t *curve25519_key_map; curve25519_keypair_t *junk_keypair; +#endif } server_onion_keys_t; #define MAX_ONIONSKIN_CHALLENGE_LEN 255 #define MAX_ONIONSKIN_REPLY_LEN 255 -server_onion_keys_t *server_onion_keys_new(void); -void server_onion_keys_free_(server_onion_keys_t *keys); -#define server_onion_keys_free(keys) \ - FREE_AND_NULL(server_onion_keys_t, server_onion_keys_free_, (keys)) +void setup_server_onion_keys(server_onion_keys_t *keys); +void release_server_onion_keys(server_onion_keys_t *keys); void onion_handshake_state_release(onion_handshake_state_t *state); @@ -51,8 +51,7 @@ int onion_skin_client_handshake(int type, const onion_handshake_state_t *handshake_state, const uint8_t *reply, size_t reply_len, uint8_t *keys_out, size_t key_out_len, - uint8_t *rend_authenticator_out, - const char **msg_out); + uint8_t *rend_authenticator_out); /** A parsed CREATE, CREATE_FAST, or CREATE2 cell. */ typedef struct create_cell_t { @@ -87,8 +86,6 @@ typedef struct extend_cell_t { tor_addr_port_t orport_ipv6; /** Identity fingerprint of the node we're conecting to.*/ uint8_t node_id[DIGEST_LEN]; - /** Ed25519 public identity key. Zero if not set. */ - ed25519_public_key_t ed_pubkey; /** The "create cell" embedded in this extend cell. Note that unlike the * create cells we generate ourself, this once can have a handshake type we * don't recognize. */ @@ -121,5 +118,5 @@ int extend_cell_format(uint8_t *command_out, uint16_t *len_out, int extended_cell_format(uint8_t *command_out, uint16_t *len_out, uint8_t *payload_out, const extended_cell_t *cell_in); -#endif /* !defined(TOR_ONION_H) */ +#endif diff --git a/src/tor/src/or/onion_fast.c b/src/tor/onion_fast.c similarity index 68% rename from src/tor/src/or/onion_fast.c rename to src/tor/onion_fast.c index 56c954829..8e778dbc6 100644 --- a/src/tor/src/or/onion_fast.c +++ b/src/tor/onion_fast.c @@ -1,30 +1,12 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file onion_fast.c * \brief Functions implement the CREATE_FAST circuit handshake. - * - * The "CREATE_FAST" handshake is an unauthenticated, non-forward-secure - * key derivation mechanism based on SHA1. We used to use it for the - * first hop of each circuit, since the TAP handshake provided no - * additional security beyond the security already provided by the TLS - * handshake [*]. - * - * When we switched to ntor, we deprecated CREATE_FAST, since ntor is - * stronger than our TLS handshake was, and fast enough to not be worrisome. - * - * This handshake, like the other circuit-extension handshakes, is - * invoked from onion.c. - * - * [*]Actually, it's possible that TAP _was_ a little better than TLS with - * RSA1024 certificates and EDH1024 for forward secrecy, if you - * hypothesize an adversary who can compute discrete logarithms on a - * small number of targetted DH1024 fields, but who can't break all that - * many RSA1024 keys. **/ #include "or.h" @@ -32,7 +14,7 @@ /** Release all state held in victim. */ void -fast_handshake_state_free_(fast_handshake_state_t *victim) +fast_handshake_state_free(fast_handshake_state_t *victim) { if (! victim) return; @@ -48,7 +30,10 @@ fast_onionskin_create(fast_handshake_state_t **handshake_state_out, { fast_handshake_state_t *s; *handshake_state_out = s = tor_malloc(sizeof(fast_handshake_state_t)); - crypto_rand((char*)s->state, sizeof(s->state)); + if (crypto_rand((char*)s->state, sizeof(s->state)) < 0) { + tor_free(s); + return -1; + } memcpy(handshake_out, s->state, DIGEST_LEN); return 0; } @@ -71,14 +56,15 @@ fast_server_handshake(const uint8_t *key_in, /* DIGEST_LEN bytes */ size_t out_len; int r = -1; - crypto_rand((char*)handshake_reply_out, DIGEST_LEN); + if (crypto_rand((char*)handshake_reply_out, DIGEST_LEN)<0) + return -1; memcpy(tmp, key_in, DIGEST_LEN); memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN); out_len = key_out_len+DIGEST_LEN; out = tor_malloc(out_len); - if (BUG(crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len))) { - goto done; // LCOV_EXCL_LINE + if (crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len)) { + goto done; } memcpy(handshake_reply_out+DIGEST_LEN, out, DIGEST_LEN); memcpy(key_out, out+DIGEST_LEN, key_out_len); @@ -106,8 +92,7 @@ int fast_client_handshake(const fast_handshake_state_t *handshake_state, const uint8_t *handshake_reply_out,/*DIGEST_LEN*2 bytes*/ uint8_t *key_out, - size_t key_out_len, - const char **msg_out) + size_t key_out_len) { uint8_t tmp[DIGEST_LEN+DIGEST_LEN]; uint8_t *out; @@ -118,17 +103,13 @@ fast_client_handshake(const fast_handshake_state_t *handshake_state, memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN); out_len = key_out_len+DIGEST_LEN; out = tor_malloc(out_len); - if (BUG(crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len))) { - /* LCOV_EXCL_START */ - if (msg_out) - *msg_out = "Failed to expand key material"; + if (crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len)) { goto done; - /* LCOV_EXCL_STOP */ } if (tor_memneq(out, handshake_reply_out+DIGEST_LEN, DIGEST_LEN)) { /* H(K) does *not* match. Something fishy. */ - if (msg_out) - *msg_out = "Digest DOES NOT MATCH on fast handshake. Bug or attack."; + log_warn(LD_PROTOCOL,"Digest DOES NOT MATCH on fast handshake. " + "Bug or attack."); goto done; } memcpy(key_out, out+DIGEST_LEN, key_out_len); diff --git a/src/tor/src/or/onion_fast.h b/src/tor/onion_fast.h similarity index 72% rename from src/tor/src/or/onion_fast.h rename to src/tor/onion_fast.h index c56712e2c..8c078378d 100644 --- a/src/tor/src/or/onion_fast.h +++ b/src/tor/onion_fast.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -19,9 +19,7 @@ typedef struct fast_handshake_state_t { uint8_t state[DIGEST_LEN]; } fast_handshake_state_t; -void fast_handshake_state_free_(fast_handshake_state_t *victim); -#define fast_handshake_state_free(st) \ - FREE_AND_NULL(fast_handshake_state_t, fast_handshake_state_free_, (st)) +void fast_handshake_state_free(fast_handshake_state_t *victim); int fast_onionskin_create(fast_handshake_state_t **handshake_state_out, uint8_t *handshake_out); @@ -34,8 +32,7 @@ int fast_server_handshake(const uint8_t *message_in, int fast_client_handshake(const fast_handshake_state_t *handshake_state, const uint8_t *handshake_reply_out, uint8_t *key_out, - size_t key_out_len, - const char **msg_out); + size_t key_out_len); -#endif /* !defined(TOR_ONION_FAST_H) */ +#endif diff --git a/src/tor/onion_main.c b/src/tor/onion_main.c new file mode 100644 index 000000000..9fe915b7b --- /dev/null +++ b/src/tor/onion_main.c @@ -0,0 +1,2908 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file onion_main.c + * \brief Toplevel module. Handles signals, multiplexes between + * connections, implements main loop, and drives scheduled events. + **/ + +#define MAIN_PRIVATE +#include "or.h" +#include "addressmap.h" +#include "backtrace.h" +#include "buffers.h" +#include "channel.h" +#include "channeltls.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "command.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "connection_edge.h" +#include "connection_or.h" +#include "control.h" +#include "cpuworker.h" +#include "directory.h" +#include "dirserv.h" +#include "dirvote.h" +#include "dns.h" +#include "dnsserv.h" +#include "entrynodes.h" +#include "geoip.h" +#include "hibernate.h" +#include "onion_main.h" +#include "microdesc.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "ntmain.h" +#include "onion.h" +#include "policies.h" +#include "transports.h" +#include "relay.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "rephist.h" +#include "router.h" +#include "routerlist.h" +#include "routerparse.h" +#include "statefile.h" +#include "status.h" +#include "ext_orport.h" +#include "anonymize.h" +#ifdef USE_DMALLOC +#include +#include +#endif +#include "memarea.h" +#include "sandbox.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include +#else +#include +#endif + +#ifdef USE_BUFFEREVENTS +#include +#endif + +void evdns_shutdown(int); + +/********* PROTOTYPES **********/ + +static void dumpmemusage(int severity); +static void dumpstats(int severity); /* log stats */ +static void conn_read_callback(evutil_socket_t fd, short event, void *_conn); +static void conn_write_callback(evutil_socket_t fd, short event, void *_conn); +static void second_elapsed_callback(periodic_timer_t *timer, void *args); +static int conn_close_if_marked(int i); +static void connection_start_reading_from_linked_conn(connection_t *conn); +static int connection_should_read_from_linked_conn(connection_t *conn); + +/********* START VARIABLES **********/ + +#ifndef USE_BUFFEREVENTS +int global_read_bucket; /**< Max number of bytes I can read this second. */ +int global_write_bucket; /**< Max number of bytes I can write this second. */ + +/** Max number of relayed (bandwidth class 1) bytes I can read this second. */ +int global_relayed_read_bucket; +/** Max number of relayed (bandwidth class 1) bytes I can write this second. */ +int global_relayed_write_bucket; +/** What was the read bucket before the last second_elapsed_callback() call? + * (used to determine how many bytes we've read). */ +static int stats_prev_global_read_bucket; +/** What was the write bucket before the last second_elapsed_callback() call? + * (used to determine how many bytes we've written). */ +static int stats_prev_global_write_bucket; +#endif + +/* DOCDOC stats_prev_n_read */ +static uint64_t stats_prev_n_read = 0; +/* DOCDOC stats_prev_n_written */ +static uint64_t stats_prev_n_written = 0; + +/* XXX we might want to keep stats about global_relayed_*_bucket too. Or not.*/ +/** How many bytes have we read since we started the process? */ +static uint64_t stats_n_bytes_read = 0; +/** How many bytes have we written since we started the process? */ +static uint64_t stats_n_bytes_written = 0; +/** What time did this process start up? */ +time_t time_of_process_start = 0; +/** How many seconds have we been running? */ +long stats_n_seconds_working = 0; +/** When do we next launch DNS wildcarding checks? */ +static time_t time_to_check_for_correct_dns = 0; + +/** How often will we honor SIGNEWNYM requests? */ +#define MAX_SIGNEWNYM_RATE 10 +/** When did we last process a SIGNEWNYM request? */ +static time_t time_of_last_signewnym = 0; +/** Is there a signewnym request we're currently waiting to handle? */ +static int signewnym_is_pending = 0; +/** How many times have we called newnym? */ +static unsigned newnym_epoch = 0; + +/** Smartlist of all open connections. */ +static smartlist_t *connection_array = NULL; +/** List of connections that have been marked for close and need to be freed + * and removed from connection_array. */ +static smartlist_t *closeable_connection_lst = NULL; +/** List of linked connections that are currently reading data into their + * inbuf from their partner's outbuf. */ +static smartlist_t *active_linked_connection_lst = NULL; +/** Flag: Set to true iff we entered the current libevent main loop via + * loop_once. If so, there's no need to trigger a loopexit in order + * to handle linked connections. */ +static int called_loop_once = 0; + +/** We set this to 1 when we've opened a circuit, so we can print a log + * entry to inform the user that Tor is working. We set it to 0 when + * we think the fact that we once opened a circuit doesn't mean we can do so + * any longer (a big time jump happened, when we notice our directory is + * heinously out-of-date, etc. + */ +int can_complete_circuit=0; + +const char tor_git_revision[] = ""; + +/** How often do we check for router descriptors that we should download + * when we have too little directory info? */ +#define GREEDY_DESCRIPTOR_RETRY_INTERVAL (10) +/** How often do we check for router descriptors that we should download + * when we have enough directory info? */ +#define LAZY_DESCRIPTOR_RETRY_INTERVAL (60) +/** How often do we 'forgive' undownloadable router descriptors and attempt + * to download them again? */ +#define DESCRIPTOR_FAILURE_RESET_INTERVAL (60*60) + +/** Decides our behavior when no logs are configured/before any + * logs have been configured. For 0, we log notice to stdout as normal. + * For 1, we log warnings only. For 2, we log nothing. + */ +int quiet_level = 0; + +/********* END VARIABLES ************/ + +/**************************************************************************** +* +* This section contains accessors and other methods on the connection_array +* variables (which are global within this file and unavailable outside it). +* +****************************************************************************/ + +#if 0 && defined(USE_BUFFEREVENTS) +static void +free_old_inbuf(connection_t *conn) +{ + if (! conn->inbuf) + return; + + tor_assert(conn->outbuf); + tor_assert(buf_datalen(conn->inbuf) == 0); + tor_assert(buf_datalen(conn->outbuf) == 0); + buf_free(conn->inbuf); + buf_free(conn->outbuf); + conn->inbuf = conn->outbuf = NULL; + + if (conn->read_event) { + event_del(conn->read_event); + tor_event_free(conn->read_event); + } + if (conn->write_event) { + event_del(conn->read_event); + tor_event_free(conn->write_event); + } + conn->read_event = conn->write_event = NULL; +} +#endif + +#if defined(_WIN32) && defined(USE_BUFFEREVENTS) +/** Remove the kernel-space send and receive buffers for s. For use + * with IOCP only. */ +static int +set_buffer_lengths_to_zero(tor_socket_t s) +{ + int zero = 0; + int r = 0; + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, (void*)&zero, sizeof(zero))) { + log_warn(LD_NET, "Unable to clear SO_SNDBUF"); + r = -1; + } + if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, (void*)&zero, sizeof(zero))) { + log_warn(LD_NET, "Unable to clear SO_RCVBUF"); + r = -1; + } + return r; +} +#endif + +/** Add conn to the array of connections that we can poll on. The + * connection's socket must be set; the connection starts out + * non-reading and non-writing. + */ +int +connection_add_impl(connection_t *conn, int is_connecting) +{ + tor_assert(conn); + tor_assert(SOCKET_OK(conn->s) || + conn->linked || + (conn->type == CONN_TYPE_AP && + TO_EDGE_CONN(conn)->is_dns_request)); + + tor_assert(conn->conn_array_index == -1); /* can only connection_add once */ + conn->conn_array_index = smartlist_len(connection_array); + smartlist_add(connection_array, conn); + +#ifdef USE_BUFFEREVENTS + if (connection_type_uses_bufferevent(conn)) { + if (SOCKET_OK(conn->s) && !conn->linked) { + +#ifdef _WIN32 + if (tor_libevent_using_iocp_bufferevents() && + get_options()->UserspaceIOCPBuffers) { + set_buffer_lengths_to_zero(conn->s); + } +#endif + + conn->bufev = bufferevent_socket_new( + tor_libevent_get_base(), + conn->s, + BEV_OPT_DEFER_CALLBACKS); + if (!conn->bufev) { + log_warn(LD_BUG, "Unable to create socket bufferevent"); + smartlist_del(connection_array, conn->conn_array_index); + conn->conn_array_index = -1; + return -1; + } + if (is_connecting) { + /* Put the bufferevent into a "connecting" state so that we'll get + * a "connected" event callback on successful write. */ + bufferevent_socket_connect(conn->bufev, NULL, 0); + } + connection_configure_bufferevent_callbacks(conn); + } else if (conn->linked && conn->linked_conn && + connection_type_uses_bufferevent(conn->linked_conn)) { + tor_assert(!(SOCKET_OK(conn->s))); + if (!conn->bufev) { + struct bufferevent *pair[2] = { NULL, NULL }; + if (bufferevent_pair_new(tor_libevent_get_base(), + BEV_OPT_DEFER_CALLBACKS, + pair) < 0) { + log_warn(LD_BUG, "Unable to create bufferevent pair"); + smartlist_del(connection_array, conn->conn_array_index); + conn->conn_array_index = -1; + return -1; + } + tor_assert(pair[0]); + conn->bufev = pair[0]; + conn->linked_conn->bufev = pair[1]; + } /* else the other side already was added, and got a bufferevent_pair */ + connection_configure_bufferevent_callbacks(conn); + } else { + tor_assert(!conn->linked); + } + + if (conn->bufev) + tor_assert(conn->inbuf == NULL); + + if (conn->linked_conn && conn->linked_conn->bufev) + tor_assert(conn->linked_conn->inbuf == NULL); + } +#else + (void) is_connecting; +#endif + + if (!HAS_BUFFEREVENT(conn) && (SOCKET_OK(conn->s) || conn->linked)) { + conn->read_event = tor_event_new(tor_libevent_get_base(), + conn->s, EV_READ|EV_PERSIST, conn_read_callback, conn); + conn->write_event = tor_event_new(tor_libevent_get_base(), + conn->s, EV_WRITE|EV_PERSIST, conn_write_callback, conn); + /* XXXX CHECK FOR NULL RETURN! */ + } + + log_debug(LD_NET,"new conn type %s, socket %d, address %s, n_conns %d.", + conn_type_to_string(conn->type), (int)conn->s, conn->address, + smartlist_len(connection_array)); + + return 0; +} + +/** Tell libevent that we don't care about conn any more. */ +void +connection_unregister_events(connection_t *conn) +{ + if (conn->read_event) { + if (event_del(conn->read_event)) + log_warn(LD_BUG, "Error removing read event for %d", (int)conn->s); + tor_free(conn->read_event); + } + if (conn->write_event) { + if (event_del(conn->write_event)) + log_warn(LD_BUG, "Error removing write event for %d", (int)conn->s); + tor_free(conn->write_event); + } +#ifdef USE_BUFFEREVENTS + if (conn->bufev) { + bufferevent_free(conn->bufev); + conn->bufev = NULL; + } +#endif + if (conn->type == CONN_TYPE_AP_DNS_LISTENER) { + dnsserv_close_listener(conn); + } +} + +/** Remove the connection from the global list, and remove the + * corresponding poll entry. Calling this function will shift the last + * connection (if any) into the position occupied by conn. + */ +int +connection_remove(connection_t *conn) +{ + int current_index; + connection_t *tmp; + + tor_assert(conn); + + log_debug(LD_NET,"removing socket %d (type %s), n_conns now %d", + (int)conn->s, conn_type_to_string(conn->type), + smartlist_len(connection_array)); + + control_event_conn_bandwidth(conn); + + tor_assert(conn->conn_array_index >= 0); + current_index = conn->conn_array_index; + connection_unregister_events(conn); /* This is redundant, but cheap. */ + if (current_index == smartlist_len(connection_array)-1) { /* at the end */ + smartlist_del(connection_array, current_index); + return 0; + } + + /* replace this one with the one at the end */ + smartlist_del(connection_array, current_index); + tmp = smartlist_get(connection_array, current_index); + tmp->conn_array_index = current_index; + + return 0; +} + +/** If conn is an edge conn, remove it from the list + * of conn's on this circuit. If it's not on an edge, + * flush and send destroys for all circuits on this conn. + * + * Remove it from connection_array (if applicable) and + * from closeable_connection_list. + * + * Then free it. + */ +static void +connection_unlink(connection_t *conn) +{ + connection_about_to_close_connection(conn); + if (conn->conn_array_index >= 0) { + connection_remove(conn); + } + if (conn->linked_conn) { + conn->linked_conn->linked_conn = NULL; + if (! conn->linked_conn->marked_for_close && + conn->linked_conn->reading_from_linked_conn) + connection_start_reading(conn->linked_conn); + conn->linked_conn = NULL; + } + smartlist_remove(closeable_connection_lst, conn); + smartlist_remove(active_linked_connection_lst, conn); + if (conn->type == CONN_TYPE_EXIT) { + assert_connection_edge_not_dns_pending(TO_EDGE_CONN(conn)); + } + if (conn->type == CONN_TYPE_OR) { + if (!tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) + connection_or_remove_from_identity_map(TO_OR_CONN(conn)); + /* connection_unlink() can only get called if the connection + * was already on the closeable list, and it got there by + * connection_mark_for_close(), which was called from + * connection_or_close_normally() or + * connection_or_close_for_error(), so the channel should + * already be in CHANNEL_STATE_CLOSING, and then the + * connection_about_to_close_connection() goes to + * connection_or_about_to_close(), which calls channel_closed() + * to notify the channel_t layer, and closed the channel, so + * nothing more to do here to deal with the channel associated + * with an orconn. + */ + } + connection_free(conn); +} + +/** Initialize the global connection list, closeable connection list, + * and active connection list. */ +STATIC void +init_connection_lists(void) +{ + if (!connection_array) + connection_array = smartlist_new(); + if (!closeable_connection_lst) + closeable_connection_lst = smartlist_new(); + if (!active_linked_connection_lst) + active_linked_connection_lst = smartlist_new(); +} + +/** Schedule conn to be closed. **/ +void +add_connection_to_closeable_list(connection_t *conn) +{ + tor_assert(!smartlist_contains(closeable_connection_lst, conn)); + tor_assert(conn->marked_for_close); + assert_connection_ok(conn, time(NULL)); + smartlist_add(closeable_connection_lst, conn); +} + +/** Return 1 if conn is on the closeable list, else return 0. */ +int +connection_is_on_closeable_list(connection_t *conn) +{ + return smartlist_contains(closeable_connection_lst, conn); +} + +/** Return true iff conn is in the current poll array. */ +int +connection_in_array(connection_t *conn) +{ + return smartlist_contains(connection_array, conn); +} + +/** Set *array to an array of all connections, and *n + * to the length of the array. *array and *n must not + * be modified. + */ +smartlist_t * +get_connection_array(void) +{ + if (!connection_array) + connection_array = smartlist_new(); + return connection_array; +} + +/** Provides the traffic read and written over the life of the process. */ + +uint64_t +get_bytes_read(void) +{ + return stats_n_bytes_read; +} + +/* DOCDOC get_bytes_written */ +uint64_t +get_bytes_written(void) +{ + return stats_n_bytes_written; +} + +/** Set the event mask on conn to events. (The event + * mask is a bitmask whose bits are READ_EVENT and WRITE_EVENT) + */ +void +connection_watch_events(connection_t *conn, watchable_events_t events) +{ + IF_HAS_BUFFEREVENT(conn, { + short ev = ((short)events) & (EV_READ|EV_WRITE); + short old_ev = bufferevent_get_enabled(conn->bufev); + if ((ev & ~old_ev) != 0) { + bufferevent_enable(conn->bufev, ev); + } + if ((old_ev & ~ev) != 0) { + bufferevent_disable(conn->bufev, old_ev & ~ev); + } + return; + }); + if (events & READ_EVENT) + connection_start_reading(conn); + else + connection_stop_reading(conn); + + if (events & WRITE_EVENT) + connection_start_writing(conn); + else + connection_stop_writing(conn); +} + +/** Return true iff conn is listening for read events. */ +int +connection_is_reading(connection_t *conn) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, + return (bufferevent_get_enabled(conn->bufev) & EV_READ) != 0; + ); + return conn->reading_from_linked_conn || + (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); +} + +/** Tell the main loop to stop notifying conn of any read events. */ +MOCK_IMPL(void, +connection_stop_reading,(connection_t *conn)) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, { + bufferevent_disable(conn->bufev, EV_READ); + return; + }); + + tor_assert(conn->read_event); + + if (conn->linked) { + conn->reading_from_linked_conn = 0; + connection_stop_reading_from_linked_conn(conn); + } else { + if (event_del(conn->read_event)) + log_warn(LD_NET, "Error from libevent setting read event state for %d " + "to unwatched: %s", + (int)conn->s, + tor_socket_strerror(tor_socket_errno(conn->s))); + } +} + +/** Tell the main loop to start notifying conn of any read events. */ +MOCK_IMPL(void, +connection_start_reading,(connection_t *conn)) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, { + bufferevent_enable(conn->bufev, EV_READ); + return; + }); + + tor_assert(conn->read_event); + + if (conn->linked) { + conn->reading_from_linked_conn = 1; + if (connection_should_read_from_linked_conn(conn)) + connection_start_reading_from_linked_conn(conn); + } else { + if (event_add(conn->read_event, NULL)) + log_warn(LD_NET, "Error from libevent setting read event state for %d " + "to watched: %s", + (int)conn->s, + tor_socket_strerror(tor_socket_errno(conn->s))); + } +} + +/** Return true iff conn is listening for write events. */ +int +connection_is_writing(connection_t *conn) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, + return (bufferevent_get_enabled(conn->bufev) & EV_WRITE) != 0; + ); + + return conn->writing_to_linked_conn || + (conn->write_event && event_pending(conn->write_event, EV_WRITE, NULL)); +} + +/** Tell the main loop to stop notifying conn of any write events. */ +MOCK_IMPL(void, +connection_stop_writing,(connection_t *conn)) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, { + bufferevent_disable(conn->bufev, EV_WRITE); + return; + }); + + tor_assert(conn->write_event); + + if (conn->linked) { + conn->writing_to_linked_conn = 0; + if (conn->linked_conn) + connection_stop_reading_from_linked_conn(conn->linked_conn); + } else { + if (event_del(conn->write_event)) + log_warn(LD_NET, "Error from libevent setting write event state for %d " + "to unwatched: %s", + (int)conn->s, + tor_socket_strerror(tor_socket_errno(conn->s))); + } +} + +/** Tell the main loop to start notifying conn of any write events. */ +MOCK_IMPL(void, +connection_start_writing,(connection_t *conn)) +{ + tor_assert(conn); + + IF_HAS_BUFFEREVENT(conn, { + bufferevent_enable(conn->bufev, EV_WRITE); + return; + }); + + tor_assert(conn->write_event); + + if (conn->linked) { + conn->writing_to_linked_conn = 1; + if (conn->linked_conn && + connection_should_read_from_linked_conn(conn->linked_conn)) + connection_start_reading_from_linked_conn(conn->linked_conn); + } else { + if (event_add(conn->write_event, NULL)) + log_warn(LD_NET, "Error from libevent setting write event state for %d " + "to watched: %s", + (int)conn->s, + tor_socket_strerror(tor_socket_errno(conn->s))); + } +} + +/** Return true iff conn is linked conn, and reading from the conn + * linked to it would be good and feasible. (Reading is "feasible" if the + * other conn exists and has data in its outbuf, and is "good" if we have our + * reading_from_linked_conn flag set and the other conn has its + * writing_to_linked_conn flag set.)*/ +static int +connection_should_read_from_linked_conn(connection_t *conn) +{ + if (conn->linked && conn->reading_from_linked_conn) { + if (! conn->linked_conn || + (conn->linked_conn->writing_to_linked_conn && + buf_datalen(conn->linked_conn->outbuf))) + return 1; + } + return 0; +} + +/** Helper: Tell the main loop to begin reading bytes into conn from + * its linked connection, if it is not doing so already. Called by + * connection_start_reading and connection_start_writing as appropriate. */ +static void +connection_start_reading_from_linked_conn(connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->linked == 1); + + if (!conn->active_on_link) { + conn->active_on_link = 1; + smartlist_add(active_linked_connection_lst, conn); + if (!called_loop_once) { + /* This is the first event on the list; we won't be in LOOP_ONCE mode, + * so we need to make sure that the event_base_loop() actually exits at + * the end of its run through the current connections and lets us + * activate read events for linked connections. */ + struct timeval tv = { 0, 0 }; + tor_event_base_loopexit(tor_libevent_get_base(), &tv); + } + } else { + tor_assert(smartlist_contains(active_linked_connection_lst, conn)); + } +} + +/** Tell the main loop to stop reading bytes into conn from its linked + * connection, if is currently doing so. Called by connection_stop_reading, + * connection_stop_writing, and connection_read. */ +void +connection_stop_reading_from_linked_conn(connection_t *conn) +{ + tor_assert(conn); + tor_assert(conn->linked == 1); + + if (conn->active_on_link) { + conn->active_on_link = 0; + /* FFFF We could keep an index here so we can smartlist_del + * cleanly. On the other hand, this doesn't show up on profiles, + * so let's leave it alone for now. */ + smartlist_remove(active_linked_connection_lst, conn); + } else { + tor_assert(!smartlist_contains(active_linked_connection_lst, conn)); + } +} + +/** Close all connections that have been scheduled to get closed. */ +STATIC void +close_closeable_connections(void) +{ + int i; + for (i = 0; i < smartlist_len(closeable_connection_lst); ) { + connection_t *conn = smartlist_get(closeable_connection_lst, i); + if (conn->conn_array_index < 0) { + connection_unlink(conn); /* blow it away right now */ + } else { + if (!conn_close_if_marked(conn->conn_array_index)) + ++i; + } + } +} + +/** Libevent callback: this gets invoked when (connection_t*)conn has + * some data to read. */ +static void +conn_read_callback(evutil_socket_t fd, short event, void *_conn) +{ + connection_t *conn = _conn; + (void)fd; + (void)event; + + log_debug(LD_NET,"socket %d wants to read.",(int)conn->s); + + /* assert_connection_ok(conn, time(NULL)); */ + + if (connection_handle_read(conn) < 0) { + if (!conn->marked_for_close) { +#ifndef _WIN32 + log_warn(LD_BUG,"Unhandled error on read for %s connection " + "(fd %d); removing", + conn_type_to_string(conn->type), (int)conn->s); + tor_fragile_assert(); +#endif + if (CONN_IS_EDGE(conn)) + connection_edge_end_errno(TO_EDGE_CONN(conn)); + connection_mark_for_close(conn); + } + } + assert_connection_ok(conn, time(NULL)); + + if (smartlist_len(closeable_connection_lst)) + close_closeable_connections(); +} + +/** Libevent callback: this gets invoked when (connection_t*)conn has + * some data to write. */ +static void +conn_write_callback(evutil_socket_t fd, short events, void *_conn) +{ + connection_t *conn = _conn; + (void)fd; + (void)events; + + LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "socket %d wants to write.", + (int)conn->s)); + + /* assert_connection_ok(conn, time(NULL)); */ + + if (connection_handle_write(conn, 0) < 0) { + if (!conn->marked_for_close) { + /* this connection is broken. remove it. */ + log_fn(LOG_WARN,LD_BUG, + "unhandled error on write for %s connection (fd %d); removing", + conn_type_to_string(conn->type), (int)conn->s); + tor_fragile_assert(); + if (CONN_IS_EDGE(conn)) { + /* otherwise we cry wolf about duplicate close */ + edge_connection_t *edge_conn = TO_EDGE_CONN(conn); + if (!edge_conn->end_reason) + edge_conn->end_reason = END_STREAM_REASON_INTERNAL; + edge_conn->edge_has_sent_end = 1; + } + connection_close_immediate(conn); /* So we don't try to flush. */ + connection_mark_for_close(conn); + } + } + assert_connection_ok(conn, time(NULL)); + + if (smartlist_len(closeable_connection_lst)) + close_closeable_connections(); +} + +/** If the connection at connection_array[i] is marked for close, then: + * - If it has data that it wants to flush, try to flush it. + * - If it _still_ has data to flush, and conn->hold_open_until_flushed is + * true, then leave the connection open and return. + * - Otherwise, remove the connection from connection_array and from + * all other lists, close it, and free it. + * Returns 1 if the connection was closed, 0 otherwise. + */ +static int +conn_close_if_marked(int i) +{ + connection_t *conn; + int retval; + time_t now; + + conn = smartlist_get(connection_array, i); + if (!conn->marked_for_close) + return 0; /* nothing to see here, move along */ + now = time(NULL); + assert_connection_ok(conn, now); + /* assert_all_pending_dns_resolves_ok(); */ + +#ifdef USE_BUFFEREVENTS + if (conn->bufev) { + if (conn->hold_open_until_flushed && + evbuffer_get_length(bufferevent_get_output(conn->bufev))) { + /* don't close yet. */ + return 0; + } + if (conn->linked_conn && ! conn->linked_conn->marked_for_close) { + /* We need to do this explicitly so that the linked connection + * notices that there was an EOF. */ + bufferevent_flush(conn->bufev, EV_WRITE, BEV_FINISHED); + } + } +#endif + + log_debug(LD_NET,"Cleaning up connection (fd "TOR_SOCKET_T_FORMAT").", + conn->s); + + /* If the connection we are about to close was trying to connect to + a proxy server and failed, the client won't be able to use that + proxy. We should warn the user about this. */ + if (conn->proxy_state == PROXY_INFANT) + log_failed_proxy_connection(conn); + + IF_HAS_BUFFEREVENT(conn, goto unlink); + if ((SOCKET_OK(conn->s) || conn->linked_conn) && + connection_wants_to_flush(conn)) { + /* s == -1 means it's an incomplete edge connection, or that the socket + * has already been closed as unflushable. */ + ssize_t sz = connection_bucket_write_limit(conn, now); + if (!conn->hold_open_until_flushed) + log_info(LD_NET, + "Conn (addr %s, fd %d, type %s, state %d) marked, but wants " + "to flush %d bytes. (Marked at %s:%d)", + escaped_safe_str_client(conn->address), + (int)conn->s, conn_type_to_string(conn->type), conn->state, + (int)conn->outbuf_flushlen, + conn->marked_for_close_file, conn->marked_for_close); + if (conn->linked_conn) { + retval = move_buf_to_buf(conn->linked_conn->inbuf, conn->outbuf, + &conn->outbuf_flushlen); + if (retval >= 0) { + /* The linked conn will notice that it has data when it notices that + * we're gone. */ + connection_start_reading_from_linked_conn(conn->linked_conn); + } + log_debug(LD_GENERAL, "Flushed last %d bytes from a linked conn; " + "%d left; flushlen %d; wants-to-flush==%d", retval, + (int)connection_get_outbuf_len(conn), + (int)conn->outbuf_flushlen, + connection_wants_to_flush(conn)); + } else if (connection_speaks_cells(conn)) { + if (conn->state == OR_CONN_STATE_OPEN) { + retval = flush_buf_tls(TO_OR_CONN(conn)->tls, conn->outbuf, sz, + &conn->outbuf_flushlen); + } else + retval = -1; /* never flush non-open broken tls connections */ + } else { + retval = flush_buf(conn->s, conn->outbuf, sz, &conn->outbuf_flushlen); + } + if (retval >= 0 && /* Technically, we could survive things like + TLS_WANT_WRITE here. But don't bother for now. */ + conn->hold_open_until_flushed && connection_wants_to_flush(conn)) { + if (retval > 0) { + LOG_FN_CONN(conn, (LOG_INFO,LD_NET, + "Holding conn (fd %d) open for more flushing.", + (int)conn->s)); + conn->timestamp_lastwritten = now; /* reset so we can flush more */ + } else if (sz == 0) { + /* Also, retval==0. If we get here, we didn't want to write anything + * (because of rate-limiting) and we didn't. */ + + /* Connection must flush before closing, but it's being rate-limited. + * Let's remove from Libevent, and mark it as blocked on bandwidth + * so it will be re-added on next token bucket refill. Prevents + * busy Libevent loops where we keep ending up here and returning + * 0 until we are no longer blocked on bandwidth. + */ + if (connection_is_writing(conn)) { + conn->write_blocked_on_bw = 1; + connection_stop_writing(conn); + } + if (connection_is_reading(conn)) { + /* XXXX024 We should make this code unreachable; if a connection is + * marked for close and flushing, there is no point in reading to it + * at all. Further, checking at this point is a bit of a hack: it + * would make much more sense to react in + * connection_handle_read_impl, or to just stop reading in + * mark_and_flush */ +#if 0 +#define MARKED_READING_RATE 180 + static ratelim_t marked_read_lim = RATELIM_INIT(MARKED_READING_RATE); + char *m; + if ((m = rate_limit_log(&marked_read_lim, now))) { + log_warn(LD_BUG, "Marked connection (fd %d, type %s, state %s) " + "is still reading; that shouldn't happen.%s", + (int)conn->s, conn_type_to_string(conn->type), + conn_state_to_string(conn->type, conn->state), m); + tor_free(m); + } +#endif + conn->read_blocked_on_bw = 1; + connection_stop_reading(conn); + } + } + return 0; + } + if (connection_wants_to_flush(conn)) { + int severity; + if (conn->type == CONN_TYPE_EXIT || + (conn->type == CONN_TYPE_OR && server_mode(get_options())) || + (conn->type == CONN_TYPE_DIR && conn->purpose == DIR_PURPOSE_SERVER)) + severity = LOG_INFO; + else + severity = LOG_NOTICE; + /* XXXX Maybe allow this to happen a certain amount per hour; it usually + * is meaningless. */ + log_fn(severity, LD_NET, "We stalled too much while trying to write %d " + "bytes to address %s. If this happens a lot, either " + "something is wrong with your network connection, or " + "something is wrong with theirs. " + "(fd %d, type %s, state %d, marked at %s:%d).", + (int)connection_get_outbuf_len(conn), + escaped_safe_str_client(conn->address), + (int)conn->s, conn_type_to_string(conn->type), conn->state, + conn->marked_for_close_file, + conn->marked_for_close); + } + } + +#ifdef USE_BUFFEREVENTS + unlink: +#endif + connection_unlink(conn); /* unlink, remove, free */ + return 1; +} + +/** We've just tried every dirserver we know about, and none of + * them were reachable. Assume the network is down. Change state + * so next time an application connection arrives we'll delay it + * and try another directory fetch. Kill off all the circuit_wait + * streams that are waiting now, since they will all timeout anyway. + */ +void +directory_all_unreachable(time_t now) +{ + connection_t *conn; + (void)now; + + stats_n_seconds_working=0; /* reset it */ + + while ((conn = connection_get_by_type_state(CONN_TYPE_AP, + AP_CONN_STATE_CIRCUIT_WAIT))) { + entry_connection_t *entry_conn = TO_ENTRY_CONN(conn); + log_notice(LD_NET, + "Is your network connection down? " + "Failing connection to '%s:%d'.", + safe_str_client(entry_conn->socks_request->address), + entry_conn->socks_request->port); + connection_mark_unattached_ap(entry_conn, + END_STREAM_REASON_NET_UNREACHABLE); + } + control_event_general_status(LOG_ERR, "DIR_ALL_UNREACHABLE"); +} + +/** This function is called whenever we successfully pull down some new + * network statuses or server descriptors. */ +void +directory_info_has_arrived(time_t now, int from_cache) +{ + const or_options_t *options = get_options(); + + if (!router_have_minimum_dir_info()) { + int quiet = from_cache || + directory_too_idle_to_fetch_descriptors(options, now); + tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, + "I learned some more directory information, but not enough to " + "build a circuit: %s", get_dir_info_status_string()); + update_all_descriptor_downloads(now); + return; + } else { + if (directory_fetches_from_authorities(options)) { + update_all_descriptor_downloads(now); + } + + /* if we have enough dir info, then update our guard status with + * whatever we just learned. */ + entry_guards_compute_status(options, now); + /* Don't even bother trying to get extrainfo until the rest of our + * directory info is up-to-date */ + if (options->DownloadExtraInfo) + update_extrainfo_downloads(now); + } + + if (server_mode(options) && !net_is_disabled() && !from_cache && + (can_complete_circuit || !any_predicted_circuits(now))) + consider_testing_reachability(1, 1); +} + +/** How long do we wait before killing OR connections with no circuits? + * In Tor versions up to 0.2.1.25 and 0.2.2.12-alpha, we waited 15 minutes + * before cancelling these connections, which caused fast relays to accrue + * many many idle connections. Hopefully 3 minutes is low enough that + * it kills most idle connections, without being so low that we cause + * clients to bounce on and off. + */ +#define IDLE_OR_CONN_TIMEOUT 180 + +/** Perform regular maintenance tasks for a single connection. This + * function gets run once per second per connection by run_scheduled_events. + */ +static void +run_connection_housekeeping(int i, time_t now) +{ + cell_t cell; + connection_t *conn = smartlist_get(connection_array, i); + const or_options_t *options = get_options(); + or_connection_t *or_conn; + int past_keepalive = + now >= conn->timestamp_lastwritten + options->KeepalivePeriod; + + if (conn->outbuf && !connection_get_outbuf_len(conn) && + conn->type == CONN_TYPE_OR) + TO_OR_CONN(conn)->timestamp_lastempty = now; + + if (conn->marked_for_close) { + /* nothing to do here */ + return; + } + + /* Expire any directory connections that haven't been active (sent + * if a server or received if a client) for 5 min */ + if (conn->type == CONN_TYPE_DIR && + ((DIR_CONN_IS_SERVER(conn) && + conn->timestamp_lastwritten + + options->TestingDirConnectionMaxStall < now) || + (!DIR_CONN_IS_SERVER(conn) && + conn->timestamp_lastread + + options->TestingDirConnectionMaxStall < now))) { + log_info(LD_DIR,"Expiring wedged directory conn (fd %d, purpose %d)", + (int)conn->s, conn->purpose); + /* This check is temporary; it's to let us know whether we should consider + * parsing partial serverdesc responses. */ + if (conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && + connection_get_inbuf_len(conn) >= 1024) { + log_info(LD_DIR,"Trying to extract information from wedged server desc " + "download."); + connection_dir_reached_eof(TO_DIR_CONN(conn)); + } else { + connection_mark_for_close(conn); + } + return; + } + + if (!connection_speaks_cells(conn)) + return; /* we're all done here, the rest is just for OR conns */ + + /* If we haven't written to an OR connection for a while, then either nuke + the connection or send a keepalive, depending. */ + + or_conn = TO_OR_CONN(conn); +#ifdef USE_BUFFEREVENTS + tor_assert(conn->bufev); +#else + tor_assert(conn->outbuf); +#endif + + if (channel_is_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan)) && + !connection_or_get_num_circuits(or_conn)) { + /* It's bad for new circuits, and has no unmarked circuits on it: + * mark it now. */ + log_info(LD_OR, + "Expiring non-used OR connection to fd %d (%s:%d) [Too old].", + (int)conn->s, conn->address, conn->port); + if (conn->state == OR_CONN_STATE_CONNECTING) + connection_or_connect_failed(TO_OR_CONN(conn), + END_OR_CONN_REASON_TIMEOUT, + "Tor gave up on the connection"); + connection_or_close_normally(TO_OR_CONN(conn), 1); + } else if (!connection_state_is_open(conn)) { + if (past_keepalive) { + /* We never managed to actually get this connection open and happy. */ + log_info(LD_OR,"Expiring non-open OR connection to fd %d (%s:%d).", + (int)conn->s,conn->address, conn->port); + connection_or_close_normally(TO_OR_CONN(conn), 0); + } + } else if (we_are_hibernating() && + !connection_or_get_num_circuits(or_conn) && + !connection_get_outbuf_len(conn)) { + /* We're hibernating, there's no circuits, and nothing to flush.*/ + log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " + "[Hibernating or exiting].", + (int)conn->s,conn->address, conn->port); + connection_or_close_normally(TO_OR_CONN(conn), 1); + } else if (!connection_or_get_num_circuits(or_conn) && + now >= or_conn->timestamp_last_added_nonpadding + + IDLE_OR_CONN_TIMEOUT) { + log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " + "[idle %d].", (int)conn->s,conn->address, conn->port, + (int)(now - or_conn->timestamp_last_added_nonpadding)); + connection_or_close_normally(TO_OR_CONN(conn), 0); + } else if ( + now >= or_conn->timestamp_lastempty + options->KeepalivePeriod*10 && + now >= conn->timestamp_lastwritten + options->KeepalivePeriod*10) { + log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, + "Expiring stuck OR connection to fd %d (%s:%d). (%d bytes to " + "flush; %d seconds since last write)", + (int)conn->s, conn->address, conn->port, + (int)connection_get_outbuf_len(conn), + (int)(now-conn->timestamp_lastwritten)); + connection_or_close_normally(TO_OR_CONN(conn), 0); + } else if (past_keepalive && !connection_get_outbuf_len(conn)) { + /* send a padding cell */ + log_fn(LOG_DEBUG,LD_OR,"Sending keepalive to (%s:%d)", + conn->address, conn->port); + memset(&cell,0,sizeof(cell_t)); + cell.command = CELL_PADDING; + connection_or_write_cell_to_buf(&cell, or_conn); + } +} + +/** Honor a NEWNYM request: make future requests unlinkable to past + * requests. */ +static void +signewnym_impl(time_t now) +{ + const or_options_t *options = get_options(); + if (!proxy_mode(options)) { + log_info(LD_CONTROL, "Ignoring SIGNAL NEWNYM because client functionality " + "is disabled."); + return; + } + + circuit_mark_all_dirty_circs_as_unusable(); + addressmap_clear_transient(); + rend_client_purge_state(); + time_of_last_signewnym = now; + signewnym_is_pending = 0; + + ++newnym_epoch; + + control_event_signal(SIGNEWNYM); +} + +/** Return the number of times that signewnym has been called. */ +unsigned +get_signewnym_epoch(void) +{ + return newnym_epoch; +} + +/** Perform regular maintenance tasks. This function gets run once per + * second by second_elapsed_callback(). + */ +static void +run_scheduled_events(time_t now) +{ + static time_t last_rotated_x509_certificate = 0; + static time_t time_to_check_v3_certificate = 0; + static time_t time_to_check_listeners = 0; + static time_t time_to_check_descriptor = 0; + static time_t time_to_download_networkstatus = 0; + static time_t time_to_shrink_memory = 0; + static time_t time_to_try_getting_descriptors = 0; + static time_t time_to_reset_descriptor_failures = 0; + static time_t time_to_add_entropy = 0; + static time_t time_to_write_bridge_status_file = 0; + static time_t time_to_downrate_stability = 0; + static time_t time_to_save_stability = 0; + static time_t time_to_clean_caches = 0; + static time_t time_to_recheck_bandwidth = 0; + static time_t time_to_check_for_expired_networkstatus = 0; + static time_t time_to_write_stats_files = 0; + static time_t time_to_write_bridge_stats = 0; + static time_t time_to_check_port_forwarding = 0; + static time_t time_to_launch_reachability_tests = 0; + static int should_init_bridge_stats = 1; + static time_t time_to_retry_dns_init = 0; + static time_t time_to_next_heartbeat = 0; + const or_options_t *options = get_options(); + + int is_server = server_mode(options); + int i; + int have_dir_info; + + /** 0. See if we've been asked to shut down and our timeout has + * expired; or if our bandwidth limits are exhausted and we + * should hibernate; or if it's time to wake up from hibernation. + */ + consider_hibernation(now); + +#if 0 + { + static time_t nl_check_time = 0; + if (nl_check_time <= now) { + nodelist_assert_ok(); + nl_check_time = now + 30; + } + } +#endif + + /* 0b. If we've deferred a signewnym, make sure it gets handled + * eventually. */ + if (signewnym_is_pending && + time_of_last_signewnym + MAX_SIGNEWNYM_RATE <= now) { + log_info(LD_CONTROL, "Honoring delayed NEWNYM request"); + signewnym_impl(now); + } + + /* 0c. If we've deferred log messages for the controller, handle them now */ + flush_pending_log_callbacks(); + + /** 1a. Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion keys, + * shut down and restart all cpuworkers, and update the directory if + * necessary. + */ + if (is_server && + get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME < now) { + log_info(LD_GENERAL,"Rotating onion key."); + rotate_onion_key(); + cpuworkers_rotate(); + if (router_rebuild_descriptor(1)<0) { + log_info(LD_CONFIG, "Couldn't rebuild router descriptor"); + } + if (advertised_server_mode() && !options->DisableNetwork) + router_upload_dir_desc_to_dirservers(0); + } + + if (!options->DisableNetwork && time_to_try_getting_descriptors < now) { + update_all_descriptor_downloads(now); + update_extrainfo_downloads(now); + if (router_have_minimum_dir_info()) + time_to_try_getting_descriptors = now + LAZY_DESCRIPTOR_RETRY_INTERVAL; + else + time_to_try_getting_descriptors = now + GREEDY_DESCRIPTOR_RETRY_INTERVAL; + } + + if (time_to_reset_descriptor_failures < now) { + router_reset_descriptor_download_failures(); + time_to_reset_descriptor_failures = + now + DESCRIPTOR_FAILURE_RESET_INTERVAL; + } + + if (options->UseBridges) + fetch_bridge_descriptors(options, now); + + /** 1b. Every MAX_SSL_KEY_LIFETIME_INTERNAL seconds, we change our + * TLS context. */ + if (!last_rotated_x509_certificate) + last_rotated_x509_certificate = now; + if (last_rotated_x509_certificate+MAX_SSL_KEY_LIFETIME_INTERNAL < now) { + log_info(LD_GENERAL,"Rotating tls context."); + if (router_initialize_tls_context() < 0) { + log_warn(LD_BUG, "Error reinitializing TLS context"); + /* XXX is it a bug here, that we just keep going? -RD */ + } + last_rotated_x509_certificate = now; + /* We also make sure to rotate the TLS connections themselves if they've + * been up for too long -- but that's done via is_bad_for_new_circs in + * connection_run_housekeeping() above. */ + } + + if (time_to_add_entropy < now) { + if (time_to_add_entropy) { + /* We already seeded once, so don't die on failure. */ + crypto_seed_rng(0); + } +/** How often do we add more entropy to OpenSSL's RNG pool? */ +#define ENTROPY_INTERVAL (60*60) + time_to_add_entropy = now + ENTROPY_INTERVAL; + } + + /** 1c. If we have to change the accounting interval or record + * bandwidth used in this accounting interval, do so. */ + if (accounting_is_enabled(options)) + accounting_run_housekeeping(now); + + if (time_to_launch_reachability_tests < now && + (authdir_mode_tests_reachability(options)) && + !net_is_disabled()) { + time_to_launch_reachability_tests = now + REACHABILITY_TEST_INTERVAL; + /* try to determine reachability of the other Tor relays */ + dirserv_test_reachability(now); + } + + /** 1d. Periodically, we discount older stability information so that new + * stability info counts more, and save the stability information to disk as + * appropriate. */ + if (time_to_downrate_stability < now) + time_to_downrate_stability = rep_hist_downrate_old_runs(now); + if (authdir_mode_tests_reachability(options)) { + if (time_to_save_stability < now) { + if (time_to_save_stability && rep_hist_record_mtbf_data(now, 1)<0) { + log_warn(LD_GENERAL, "Couldn't store mtbf data."); + } +#define SAVE_STABILITY_INTERVAL (30*60) + time_to_save_stability = now + SAVE_STABILITY_INTERVAL; + } + } + + /* 1e. Periodically, if we're a v3 authority, we check whether our cert is + * close to expiring and warn the admin if it is. */ + if (time_to_check_v3_certificate < now) { + v3_authority_check_key_expiry(); +#define CHECK_V3_CERTIFICATE_INTERVAL (5*60) + time_to_check_v3_certificate = now + CHECK_V3_CERTIFICATE_INTERVAL; + } + + /* 1f. Check whether our networkstatus has expired. + */ + if (time_to_check_for_expired_networkstatus < now) { + networkstatus_t *ns = networkstatus_get_latest_consensus(); + /*XXXX RD: This value needs to be the same as REASONABLY_LIVE_TIME in + * networkstatus_get_reasonably_live_consensus(), but that value is way + * way too high. Arma: is the bridge issue there resolved yet? -NM */ +#define NS_EXPIRY_SLOP (24*60*60) + if (ns && ns->valid_until < now+NS_EXPIRY_SLOP && + router_have_minimum_dir_info()) { + router_dir_info_changed(); + } +#define CHECK_EXPIRED_NS_INTERVAL (2*60) + time_to_check_for_expired_networkstatus = now + CHECK_EXPIRED_NS_INTERVAL; + } + + /* 1g. Check whether we should write statistics to disk. + */ + if (time_to_write_stats_files < now) { +#define CHECK_WRITE_STATS_INTERVAL (60*60) + time_t next_time_to_write_stats_files = (time_to_write_stats_files > 0 ? + time_to_write_stats_files : now) + CHECK_WRITE_STATS_INTERVAL; + if (options->CellStatistics) { + time_t next_write = + rep_hist_buffer_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->DirReqStatistics) { + time_t next_write = geoip_dirreq_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->EntryStatistics) { + time_t next_write = geoip_entry_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->ExitPortStatistics) { + time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->ConnDirectionStatistics) { + time_t next_write = rep_hist_conn_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + if (options->BridgeAuthoritativeDir) { + time_t next_write = rep_hist_desc_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } + time_to_write_stats_files = next_time_to_write_stats_files; + } + + /* 1h. Check whether we should write bridge statistics to disk. + */ + if (should_record_bridge_info(options)) { + if (time_to_write_bridge_stats < now) { + if (should_init_bridge_stats) { + /* (Re-)initialize bridge statistics. */ + geoip_bridge_stats_init(now); + time_to_write_bridge_stats = now + WRITE_STATS_INTERVAL; + should_init_bridge_stats = 0; + } else { + /* Possibly write bridge statistics to disk and ask when to write + * them next time. */ + time_to_write_bridge_stats = geoip_bridge_stats_write( + time_to_write_bridge_stats); + } + } + } else if (!should_init_bridge_stats) { + /* Bridge mode was turned off. Ensure that stats are re-initialized + * next time bridge mode is turned on. */ + should_init_bridge_stats = 1; + } + + /* Remove old information from rephist and the rend cache. */ + if (time_to_clean_caches < now) { + rep_history_clean(now - options->RephistTrackTime); + rend_cache_clean(now); + rend_cache_clean_v2_descs_as_dir(now); + microdesc_cache_rebuild(NULL, 0); +#define CLEAN_CACHES_INTERVAL (30*60) + time_to_clean_caches = now + CLEAN_CACHES_INTERVAL; + } + +#define RETRY_DNS_INTERVAL (10*60) + /* If we're a server and initializing dns failed, retry periodically. */ + if (time_to_retry_dns_init < now) { + time_to_retry_dns_init = now + RETRY_DNS_INTERVAL; + if (is_server && has_dns_init_failed()) + dns_init(); + } + + /** 2. Periodically, we consider force-uploading our descriptor + * (if we've passed our internal checks). */ + +/** How often do we check whether part of our router info has changed in a + * way that would require an upload? That includes checking whether our IP + * address has changed. */ +#define CHECK_DESCRIPTOR_INTERVAL (60) + + /* 2b. Once per minute, regenerate and upload the descriptor if the old + * one is inaccurate. */ + if (time_to_check_descriptor < now && !options->DisableNetwork) { + static int dirport_reachability_count = 0; + time_to_check_descriptor = now + CHECK_DESCRIPTOR_INTERVAL; + check_descriptor_bandwidth_changed(now); + check_descriptor_ipaddress_changed(now); + mark_my_descriptor_dirty_if_too_old(now); + consider_publishable_server(0); + /* also, check religiously for reachability, if it's within the first + * 20 minutes of our uptime. */ + if (is_server && + (can_complete_circuit || !any_predicted_circuits(now)) && + !we_are_hibernating()) { + if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { + consider_testing_reachability(1, dirport_reachability_count==0); + if (++dirport_reachability_count > 5) + dirport_reachability_count = 0; + } else if (time_to_recheck_bandwidth < now) { + /* If we haven't checked for 12 hours and our bandwidth estimate is + * low, do another bandwidth test. This is especially important for + * bridges, since they might go long periods without much use. */ + const routerinfo_t *me = router_get_my_routerinfo(); + if (time_to_recheck_bandwidth && me && + me->bandwidthcapacity < me->bandwidthrate && + me->bandwidthcapacity < 51200) { + reset_bandwidth_test(); + } +#define BANDWIDTH_RECHECK_INTERVAL (12*60*60) + time_to_recheck_bandwidth = now + BANDWIDTH_RECHECK_INTERVAL; + } + } + + /* If any networkstatus documents are no longer recent, we need to + * update all the descriptors' running status. */ + /* Remove dead routers. */ + routerlist_remove_old_routers(); + } + + /* 2c. Every minute (or every second if TestingTorNetwork), check + * whether we want to download any networkstatus documents. */ + +/* How often do we check whether we should download network status + * documents? */ +#define networkstatus_dl_check_interval(o) ((o)->TestingTorNetwork ? 1 : 60) + + if (time_to_download_networkstatus < now && !options->DisableNetwork) { + time_to_download_networkstatus = + now + networkstatus_dl_check_interval(options); + update_networkstatus_downloads(now); + } + + /** 2c. Let directory voting happen. */ + if (authdir_mode_v3(options)) + dirvote_act(options, now); + + /** 3a. Every second, we examine pending circuits and prune the + * ones which have been pending for more than a few seconds. + * We do this before step 4, so it can try building more if + * it's not comfortable with the number of available circuits. + */ + /* (If our circuit build timeout can ever become lower than a second (which + * it can't, currently), we should do this more often.) */ + circuit_expire_building(); + + /** 3b. Also look at pending streams and prune the ones that 'began' + * a long time ago but haven't gotten a 'connected' yet. + * Do this before step 4, so we can put them back into pending + * state to be picked up by the new circuit. + */ + connection_ap_expire_beginning(); + + /** 3c. And expire connections that we've held open for too long. + */ + connection_expire_held_open(); + + /** 3d. And every 60 seconds, we relaunch listeners if any died. */ + if (!net_is_disabled() && time_to_check_listeners < now) { + retry_all_listeners(NULL, NULL, 0); + time_to_check_listeners = now+60; + } + + /** 4. Every second, we try a new circuit if there are no valid + * circuits. Every NewCircuitPeriod seconds, we expire circuits + * that became dirty more than MaxCircuitDirtiness seconds ago, + * and we make a new circ if there are no clean circuits. + */ + have_dir_info = router_have_minimum_dir_info(); + if (have_dir_info && !net_is_disabled()) + circuit_build_needed_circs(now); + + /* every 10 seconds, but not at the same second as other such events */ + if (now % 10 == 5) + circuit_expire_old_circuits_serverside(now); + + /** 5. We do housekeeping for each connection... */ + connection_or_set_bad_connections(NULL, 0); + for (i=0;ioutbuf) + buf_shrink(conn->outbuf); + if (conn->inbuf) + buf_shrink(conn->inbuf); + }); + clean_cell_pool(); + buf_shrink_freelists(0); +/** How often do we check buffers and pools for empty space that can be + * deallocated? */ +#define MEM_SHRINK_INTERVAL (60) + time_to_shrink_memory = now + MEM_SHRINK_INTERVAL; + } + + /** 6. And remove any marked circuits... */ + circuit_close_all_marked(); + + /** 7. And upload service descriptors if necessary. */ + if (can_complete_circuit && !net_is_disabled()) { + rend_consider_services_upload(now); + rend_consider_descriptor_republication(); + } + + /** 8. and blow away any connections that need to die. have to do this now, + * because if we marked a conn for close and left its socket -1, then + * we'll pass it to poll/select and bad things will happen. + */ + close_closeable_connections(); + + /** 8b. And if anything in our state is ready to get flushed to disk, we + * flush it. */ + or_state_save(now); + + /** 8c. Do channel cleanup just like for connections */ + channel_run_cleanup(); + channel_listener_run_cleanup(); + + /** 9. and if we're a server, check whether our DNS is telling stories to + * us. */ + if (!net_is_disabled() && + public_server_mode(options) && time_to_check_for_correct_dns < now) { + if (!time_to_check_for_correct_dns) { + time_to_check_for_correct_dns = now + 60 + crypto_rand_int(120); + } else { + dns_launch_correctness_checks(); + time_to_check_for_correct_dns = now + 12*3600 + + crypto_rand_int(12*3600); + } + } + + /** 10. write bridge networkstatus file to disk */ + if (options->BridgeAuthoritativeDir && + time_to_write_bridge_status_file < now) { + networkstatus_dump_bridge_status_to_file(now); +#define BRIDGE_STATUSFILE_INTERVAL (30*60) + time_to_write_bridge_status_file = now+BRIDGE_STATUSFILE_INTERVAL; + } + + /** 11. check the port forwarding app */ + if (!net_is_disabled() && + time_to_check_port_forwarding < now && + options->PortForwarding && + is_server) { +#define PORT_FORWARDING_CHECK_INTERVAL 5 + smartlist_t *ports_to_forward = get_list_of_ports_to_forward(); + if (ports_to_forward) { + tor_check_port_forwarding(options->PortForwardingHelper, + ports_to_forward, + now); + + SMARTLIST_FOREACH(ports_to_forward, char *, cp, tor_free(cp)); + smartlist_free(ports_to_forward); + } + time_to_check_port_forwarding = now+PORT_FORWARDING_CHECK_INTERVAL; + } + + /** 11b. check pending unconfigured managed proxies */ + if (!net_is_disabled() && pt_proxies_configuration_pending()) + pt_configure_remaining_proxies(); + + /** 12. write the heartbeat message */ + if (options->HeartbeatPeriod && + time_to_next_heartbeat <= now) { + if (time_to_next_heartbeat) /* don't log the first heartbeat */ + log_heartbeat(now); + time_to_next_heartbeat = now+options->HeartbeatPeriod; + } +} + +/** Timer: used to invoke second_elapsed_callback() once per second. */ +static periodic_timer_t *second_timer = NULL; +/** Number of libevent errors in the last second: we die if we get too many. */ +static int n_libevent_errors = 0; + +/** Libevent callback: invoked once every second. */ +static void +second_elapsed_callback(periodic_timer_t *timer, void *arg) +{ + /* XXXX This could be sensibly refactored into multiple callbacks, and we + * could use Libevent's timers for this rather than checking the current + * time against a bunch of timeouts every second. */ + static time_t current_second = 0; + time_t now; + size_t bytes_written; + size_t bytes_read; + int seconds_elapsed; + const or_options_t *options = get_options(); + (void)timer; + (void)arg; + + n_libevent_errors = 0; + + /* log_notice(LD_GENERAL, "Tick."); */ + now = time(NULL); + update_approx_time(now); + + /* the second has rolled over. check more stuff. */ + seconds_elapsed = current_second ? (int)(now - current_second) : 0; +#ifdef USE_BUFFEREVENTS + { + uint64_t cur_read,cur_written; + connection_get_rate_limit_totals(&cur_read, &cur_written); + bytes_written = (size_t)(cur_written - stats_prev_n_written); + bytes_read = (size_t)(cur_read - stats_prev_n_read); + stats_n_bytes_read += bytes_read; + stats_n_bytes_written += bytes_written; + if (accounting_is_enabled(options) && seconds_elapsed >= 0) + accounting_add_bytes(bytes_read, bytes_written, seconds_elapsed); + stats_prev_n_written = cur_written; + stats_prev_n_read = cur_read; + } +#else + bytes_read = (size_t)(stats_n_bytes_read - stats_prev_n_read); + bytes_written = (size_t)(stats_n_bytes_written - stats_prev_n_written); + stats_prev_n_read = stats_n_bytes_read; + stats_prev_n_written = stats_n_bytes_written; +#endif + + control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written); + control_event_stream_bandwidth_used(); + control_event_conn_bandwidth_used(); + control_event_circ_bandwidth_used(); + control_event_circuit_cell_stats(); + + if (server_mode(options) && + !net_is_disabled() && + seconds_elapsed > 0 && + can_complete_circuit && + stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT != + (stats_n_seconds_working+seconds_elapsed) / + TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { + /* every 20 minutes, check and complain if necessary */ + const routerinfo_t *me = router_get_my_routerinfo(); + if (me && !check_whether_orport_reachable()) { + log_warn(LD_CONFIG,"Your server (%s:%d) has not managed to confirm that " + "its ORPort is reachable. Please check your firewalls, ports, " + "address, /etc/hosts file, etc.", + me->address, me->or_port); + control_event_server_status(LOG_WARN, + "REACHABILITY_FAILED ORADDRESS=%s:%d", + me->address, me->or_port); + } + + if (me && !check_whether_dirport_reachable()) { + log_warn(LD_CONFIG, + "Your server (%s:%d) has not managed to confirm that its " + "DirPort is reachable. Please check your firewalls, ports, " + "address, /etc/hosts file, etc.", + me->address, me->dir_port); + control_event_server_status(LOG_WARN, + "REACHABILITY_FAILED DIRADDRESS=%s:%d", + me->address, me->dir_port); + } + } + +/** If more than this many seconds have elapsed, probably the clock + * jumped: doesn't count. */ +#define NUM_JUMPED_SECONDS_BEFORE_WARN 100 + if (seconds_elapsed < -NUM_JUMPED_SECONDS_BEFORE_WARN || + seconds_elapsed >= NUM_JUMPED_SECONDS_BEFORE_WARN) { + circuit_note_clock_jumped(seconds_elapsed); + /* XXX if the time jumps *back* many months, do our events in + * run_scheduled_events() recover? I don't think they do. -RD */ + } else if (seconds_elapsed > 0) + stats_n_seconds_working += seconds_elapsed; + + run_scheduled_events(now); + + current_second = now; /* remember which second it is, for next time */ +} + +#ifndef USE_BUFFEREVENTS +/** Timer: used to invoke refill_callback(). */ +static periodic_timer_t *refill_timer = NULL; + +/** Libevent callback: invoked periodically to refill token buckets + * and count r/w bytes. It is only used when bufferevents are disabled. */ +static void +refill_callback(periodic_timer_t *timer, void *arg) +{ + static struct timeval current_millisecond; + struct timeval now; + + size_t bytes_written; + size_t bytes_read; + int milliseconds_elapsed = 0; + int seconds_rolled_over = 0; + + const or_options_t *options = get_options(); + + (void)timer; + (void)arg; + + tor_gettimeofday(&now); + + /* If this is our first time, no time has passed. */ + if (current_millisecond.tv_sec) { + long mdiff = tv_mdiff(¤t_millisecond, &now); + if (mdiff > INT_MAX) + mdiff = INT_MAX; + milliseconds_elapsed = (int)mdiff; + seconds_rolled_over = (int)(now.tv_sec - current_millisecond.tv_sec); + } + + bytes_written = stats_prev_global_write_bucket - global_write_bucket; + bytes_read = stats_prev_global_read_bucket - global_read_bucket; + + stats_n_bytes_read += bytes_read; + stats_n_bytes_written += bytes_written; + if (accounting_is_enabled(options) && milliseconds_elapsed >= 0) + accounting_add_bytes(bytes_read, bytes_written, seconds_rolled_over); + + if (milliseconds_elapsed > 0) + connection_bucket_refill(milliseconds_elapsed, now.tv_sec); + + stats_prev_global_read_bucket = global_read_bucket; + stats_prev_global_write_bucket = global_write_bucket; + + current_millisecond = now; /* remember what time it is, for next time */ +} +#endif + +#ifndef _WIN32 +/** Called when a possibly ignorable libevent error occurs; ensures that we + * don't get into an infinite loop by ignoring too many errors from + * libevent. */ +static int +got_libevent_error(void) +{ + if (++n_libevent_errors > 8) { + log_err(LD_NET, "Too many libevent errors in one second; dying"); + return -1; + } + return 0; +} +#endif + +#define UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST (6*60*60) + +/** Called when our IP address seems to have changed. at_interface + * should be true if we detected a change in our interface, and false if we + * detected a change in our published address. */ +void +ip_address_changed(int at_interface) +{ + int server = server_mode(get_options()); + + if (at_interface) { + if (! server) { + /* Okay, change our keys. */ + if (init_keys()<0) + log_warn(LD_GENERAL, "Unable to rotate keys after IP change!"); + } + } else { + if (server) { + if (stats_n_seconds_working > UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST) + reset_bandwidth_test(); + stats_n_seconds_working = 0; + router_reset_reachability(); + mark_my_descriptor_dirty("IP address changed"); + } + } + + dns_servers_relaunch_checks(); +} + +/** Forget what we've learned about the correctness of our DNS servers, and + * start learning again. */ +void +dns_servers_relaunch_checks(void) +{ + if (server_mode(get_options())) { + dns_reset_correctness_checks(); + time_to_check_for_correct_dns = 0; + } +} + +/** Called when we get a SIGHUP: reload configuration files and keys, + * retry all connections, and so on. */ +static int +do_hup(void) +{ + const or_options_t *options = get_options(); + +#ifdef USE_DMALLOC + dmalloc_log_stats(); + dmalloc_log_changed(0, 1, 0, 0); +#endif + + log_notice(LD_GENERAL,"Received reload signal (hup). Reloading config and " + "resetting internal state."); + if (accounting_is_enabled(options)) + accounting_record_bandwidth_usage(time(NULL), get_or_state()); + + router_reset_warnings(); + routerlist_reset_warnings(); + /* first, reload config variables, in case they've changed */ + if (options->ReloadTorrcOnSIGHUP) { + /* no need to provide argc/v, they've been cached in init_from_config */ + if (options_init_from_torrc(0, NULL) < 0) { + log_err(LD_CONFIG,"Reading config failed--see warnings above. " + "For usage, try -h."); + return -1; + } + options = get_options(); /* they have changed now */ + } else { + char *msg = NULL; + log_notice(LD_GENERAL, "Not reloading config file: the controller told " + "us not to."); + /* Make stuff get rescanned, reloaded, etc. */ + if (set_options((or_options_t*)options, &msg) < 0) { + if (!msg) + msg = tor_strdup("Unknown error"); + log_warn(LD_GENERAL, "Unable to re-set previous options: %s", msg); + tor_free(msg); + } + } + if (authdir_mode_handles_descs(options, -1)) { + /* reload the approved-routers file */ + if (dirserv_load_fingerprint_file() < 0) { + /* warnings are logged from dirserv_load_fingerprint_file() directly */ + log_info(LD_GENERAL, "Error reloading fingerprints. " + "Continuing with old list."); + } + } + + /* Rotate away from the old dirty circuits. This has to be done + * after we've read the new options, but before we start using + * circuits for directory fetches. */ + circuit_mark_all_dirty_circs_as_unusable(); + + /* retry appropriate downloads */ + router_reset_status_download_failures(); + router_reset_descriptor_download_failures(); + if (!options->DisableNetwork) + update_networkstatus_downloads(time(NULL)); + + /* We'll retry routerstatus downloads in about 10 seconds; no need to + * force a retry there. */ + + if (server_mode(options)) { + /* Restart cpuworker and dnsworker processes, so they get up-to-date + * configuration options. */ + cpuworkers_rotate(); + dns_reset(); + } + return 0; +} + +/** Tor main loop. */ +int +do_main_loop(void) +{ + int loop_result; + time_t now; + + /* initialize dns resolve map, spawn workers if needed */ + if (dns_init() < 0) { + if (get_options()->ServerDNSAllowBrokenConfig) + log_warn(LD_GENERAL, "Couldn't set up any working nameservers. " + "Network not up yet? Will try again soon."); + else { + log_err(LD_GENERAL,"Error initializing dns subsystem; exiting. To " + "retry instead, set the ServerDNSAllowBrokenResolvConf option."); + } + } + +#ifdef USE_BUFFEREVENTS + log_warn(LD_GENERAL, "Tor was compiled with the --enable-bufferevents " + "option. This is still experimental, and might cause strange " + "bugs. If you want a more stable Tor, be sure to build without " + "--enable-bufferevents."); +#endif + + handle_signals(1); + + /* load the private keys, if we're supposed to have them, and set up the + * TLS context. */ + if (! client_identity_key_is_set()) { + if (init_keys() < 0) { + log_err(LD_BUG,"Error initializing keys; exiting"); + return -1; + } + } + + /* Set up the packed_cell_t memory pool. */ + init_cell_pool(); + + /* Set up our buckets */ + connection_bucket_init(); +#ifndef USE_BUFFEREVENTS + stats_prev_global_read_bucket = global_read_bucket; + stats_prev_global_write_bucket = global_write_bucket; +#endif + + /* initialize the bootstrap status events to know we're starting up */ + control_event_bootstrap(BOOTSTRAP_STATUS_STARTING, 0); + + if (trusted_dirs_reload_certs()) { + log_warn(LD_DIR, + "Couldn't load all cached v3 certificates. Starting anyway."); + } + if (router_reload_consensus_networkstatus()) { + return -1; + } + /* load the routers file, or assign the defaults. */ + if (router_reload_router_list()) { + return -1; + } + /* load the networkstatuses. (This launches a download for new routers as + * appropriate.) + */ + now = time(NULL); + directory_info_has_arrived(now, 1); + + if (server_mode(get_options())) { + /* launch cpuworkers. Need to do this *after* we've read the onion key. */ + cpu_init(); + } + + /* set up once-a-second callback. */ + if (! second_timer) { + struct timeval one_second; + one_second.tv_sec = 1; + one_second.tv_usec = 0; + + second_timer = periodic_timer_new(tor_libevent_get_base(), + &one_second, + second_elapsed_callback, + NULL); + tor_assert(second_timer); + } + +#ifndef USE_BUFFEREVENTS + if (!refill_timer) { + struct timeval refill_interval; + int msecs = get_options()->TokenBucketRefillInterval; + + refill_interval.tv_sec = msecs/1000; + refill_interval.tv_usec = (msecs%1000)*1000; + + refill_timer = periodic_timer_new(tor_libevent_get_base(), + &refill_interval, + refill_callback, + NULL); + tor_assert(refill_timer); + } +#endif + + for (;;) { + if (nt_service_is_stopping()) + return 0; + + if (check_interrupted()) + return 0; + +#ifndef _WIN32 + /* Make it easier to tell whether libevent failure is our fault or not. */ + errno = 0; +#endif + /* All active linked conns should get their read events activated. */ + SMARTLIST_FOREACH(active_linked_connection_lst, connection_t *, conn, + event_active(conn->read_event, EV_READ, 1)); + called_loop_once = smartlist_len(active_linked_connection_lst) ? 1 : 0; + + update_approx_time(time(NULL)); + + /* poll until we have an event, or the second ends, or until we have + * some active linked connections to trigger events for. */ + loop_result = event_base_loop(tor_libevent_get_base(), + called_loop_once ? EVLOOP_ONCE : 0); + + /* let catch() handle things like ^c, and otherwise don't worry about it */ + if (loop_result < 0) { + int e = tor_socket_errno(-1); + /* let the program survive things like ^z */ + if (e != EINTR && !ERRNO_IS_EINPROGRESS(e)) { + log_err(LD_NET,"libevent call with %s failed: %s [%d]", + tor_libevent_get_method(), tor_socket_strerror(e), e); + return -1; +#ifndef _WIN32 + } else if (e == EINVAL) { + log_warn(LD_NET, "EINVAL from libevent: should you upgrade libevent?"); + if (got_libevent_error()) + return -1; +#endif + } else { + if (ERRNO_IS_EINPROGRESS(e)) + log_warn(LD_BUG, + "libevent call returned EINPROGRESS? Please report."); + log_debug(LD_NET,"libevent call interrupted."); + /* You can't trust the results of this poll(). Go back to the + * top of the big for loop. */ + continue; + } + } + } +} + +#ifndef _WIN32 /* Only called when we're willing to use signals */ +/** Libevent callback: invoked when we get a signal. + */ +static void +signal_callback(int fd, short events, void *arg) +{ + uintptr_t sig = (uintptr_t)arg; + (void)fd; + (void)events; + + process_signal(sig); +} +#endif + +/** Do the work of acting on a signal received in sig */ +void +process_signal(uintptr_t sig) +{ + switch (sig) + { + case SIGTERM: + log_notice(LD_GENERAL,"Catching signal TERM, exiting cleanly."); + tor_cleanup(); + exit(0); + break; + case SIGINT: + if (!server_mode(get_options())) { /* do it now */ + log_notice(LD_GENERAL,"Interrupt: exiting cleanly."); + tor_cleanup(); + exit(0); + } + hibernate_begin_shutdown(); + break; +#ifdef SIGPIPE + case SIGPIPE: + log_debug(LD_GENERAL,"Caught SIGPIPE. Ignoring."); + break; +#endif + case SIGUSR1: + /* prefer to log it at INFO, but make sure we always see it */ + dumpstats(get_min_log_level() 0) ; /* keep reaping until no more + zombies */ + break; +#endif + case SIGNEWNYM: { + time_t now = time(NULL); + if (time_of_last_signewnym + MAX_SIGNEWNYM_RATE > now) { + signewnym_is_pending = 1; + log_notice(LD_CONTROL, + "Rate limiting NEWNYM request: delaying by %d second(s)", + (int)(MAX_SIGNEWNYM_RATE+time_of_last_signewnym-now)); + } else { + signewnym_impl(now); + } + break; + } + case SIGCLEARDNSCACHE: + addressmap_clear_transient(); + control_event_signal(sig); + break; + } +} + +/** Returns Tor's uptime. */ +long +get_uptime(void) +{ + return stats_n_seconds_working; +} + +extern uint64_t rephist_total_alloc; +extern uint32_t rephist_total_num; + +/** + * Write current memory usage information to the log. + */ +static void +dumpmemusage(int severity) +{ + connection_dump_buffer_mem_stats(severity); + tor_log(severity, LD_GENERAL, "In rephist: "U64_FORMAT" used by %d Tors.", + U64_PRINTF_ARG(rephist_total_alloc), rephist_total_num); + dump_routerlist_mem_usage(severity); + dump_cell_pool_usage(severity); + dump_dns_mem_usage(severity); + buf_dump_freelist_sizes(severity); + tor_log_mallinfo(severity); +} + +/** Write all statistics to the log, with log level severity. Called + * in response to a SIGUSR1. */ +static void +dumpstats(int severity) +{ + time_t now = time(NULL); + time_t elapsed; + size_t rbuf_cap, wbuf_cap, rbuf_len, wbuf_len; + + tor_log(severity, LD_GENERAL, "Dumping stats:"); + + SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) { + int i = conn_sl_idx; + tor_log(severity, LD_GENERAL, + "Conn %d (socket %d) type %d (%s), state %d (%s), created %d secs ago", + i, (int)conn->s, conn->type, conn_type_to_string(conn->type), + conn->state, conn_state_to_string(conn->type, conn->state), + (int)(now - conn->timestamp_created)); + if (!connection_is_listener(conn)) { + tor_log(severity,LD_GENERAL, + "Conn %d is to %s:%d.", i, + safe_str_client(conn->address), + conn->port); + tor_log(severity,LD_GENERAL, + "Conn %d: %d bytes waiting on inbuf (len %d, last read %d secs ago)", + i, + (int)connection_get_inbuf_len(conn), + (int)buf_allocation(conn->inbuf), + (int)(now - conn->timestamp_lastread)); + tor_log(severity,LD_GENERAL, + "Conn %d: %d bytes waiting on outbuf " + "(len %d, last written %d secs ago)",i, + (int)connection_get_outbuf_len(conn), + (int)buf_allocation(conn->outbuf), + (int)(now - conn->timestamp_lastwritten)); + if (conn->type == CONN_TYPE_OR) { + or_connection_t *or_conn = TO_OR_CONN(conn); + if (or_conn->tls) { + tor_tls_get_buffer_sizes(or_conn->tls, &rbuf_cap, &rbuf_len, + &wbuf_cap, &wbuf_len); + tor_log(severity, LD_GENERAL, + "Conn %d: %d/%d bytes used on OpenSSL read buffer; " + "%d/%d bytes used on write buffer.", + i, (int)rbuf_len, (int)rbuf_cap, (int)wbuf_len, (int)wbuf_cap); + } + } + } + circuit_dump_by_conn(conn, severity); /* dump info about all the circuits + * using this conn */ + } SMARTLIST_FOREACH_END(conn); + + channel_dumpstats(severity); + channel_listener_dumpstats(severity); + + tor_log(severity, LD_NET, + "Cells processed: "U64_FORMAT" padding\n" + " "U64_FORMAT" create\n" + " "U64_FORMAT" created\n" + " "U64_FORMAT" relay\n" + " ("U64_FORMAT" relayed)\n" + " ("U64_FORMAT" delivered)\n" + " "U64_FORMAT" destroy", + U64_PRINTF_ARG(stats_n_padding_cells_processed), + U64_PRINTF_ARG(stats_n_create_cells_processed), + U64_PRINTF_ARG(stats_n_created_cells_processed), + U64_PRINTF_ARG(stats_n_relay_cells_processed), + U64_PRINTF_ARG(stats_n_relay_cells_relayed), + U64_PRINTF_ARG(stats_n_relay_cells_delivered), + U64_PRINTF_ARG(stats_n_destroy_cells_processed)); + if (stats_n_data_cells_packaged) + tor_log(severity,LD_NET,"Average packaged cell fullness: %2.3f%%", + 100*(U64_TO_DBL(stats_n_data_bytes_packaged) / + U64_TO_DBL(stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)) ); + if (stats_n_data_cells_received) + tor_log(severity,LD_NET,"Average delivered cell fullness: %2.3f%%", + 100*(U64_TO_DBL(stats_n_data_bytes_received) / + U64_TO_DBL(stats_n_data_cells_received*RELAY_PAYLOAD_SIZE)) ); + + cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_TAP, "TAP"); + cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_NTOR,"ntor"); + + if (now - time_of_process_start >= 0) + elapsed = now - time_of_process_start; + else + elapsed = 0; + + if (elapsed) { + tor_log(severity, LD_NET, + "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec reading", + U64_PRINTF_ARG(stats_n_bytes_read), + (int)elapsed, + (int) (stats_n_bytes_read/elapsed)); + tor_log(severity, LD_NET, + "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec writing", + U64_PRINTF_ARG(stats_n_bytes_written), + (int)elapsed, + (int) (stats_n_bytes_written/elapsed)); + } + + tor_log(severity, LD_NET, "--------------- Dumping memory information:"); + dumpmemusage(severity); + + rep_hist_dump_stats(now,severity); + rend_service_dump_stats(severity); + dump_pk_ops(severity); + dump_distinct_digest_count(severity); +} + +/** Called by exit() as we shut down the process. + */ +static void +exit_function(void) +{ + /* NOTE: If we ever daemonize, this gets called immediately. That's + * okay for now, because we only use this on Windows. */ +#ifdef _WIN32 + WSACleanup(); +#endif +} + +/** Set up the signal handlers for either parent or child. */ +void +handle_signals(int is_parent) +{ +#ifndef _WIN32 /* do signal stuff only on Unix */ + int i; + static const int signals[] = { + SIGINT, /* do a controlled slow shutdown */ + SIGTERM, /* to terminate now */ + SIGPIPE, /* otherwise SIGPIPE kills us */ + SIGUSR1, /* dump stats */ + SIGUSR2, /* go to loglevel debug */ + SIGHUP, /* to reload config, retry conns, etc */ +#ifdef SIGXFSZ + SIGXFSZ, /* handle file-too-big resource exhaustion */ +#endif + SIGCHLD, /* handle dns/cpu workers that exit */ + -1 }; + static struct event *signal_events[16]; /* bigger than it has to be. */ + if (is_parent) { + for (i = 0; signals[i] >= 0; ++i) { + signal_events[i] = tor_evsignal_new( + tor_libevent_get_base(), signals[i], signal_callback, + (void*)(uintptr_t)signals[i]); + if (event_add(signal_events[i], NULL)) + log_warn(LD_BUG, "Error from libevent when adding event for signal %d", + signals[i]); + } + } else { + struct sigaction action; + action.sa_flags = 0; + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGINT, &action, NULL); + sigaction(SIGTERM, &action, NULL); + sigaction(SIGPIPE, &action, NULL); + sigaction(SIGUSR1, &action, NULL); + sigaction(SIGUSR2, &action, NULL); + sigaction(SIGHUP, &action, NULL); +#ifdef SIGXFSZ + sigaction(SIGXFSZ, &action, NULL); +#endif + } +#else /* MS windows */ + (void)is_parent; +#endif /* signal stuff */ +} + +/** Main entry point for the Tor command-line client. + */ +int +tor_init(int argc, char *argv[]) +{ + char progname[256]; + int quiet = 0; + + time_of_process_start = time(NULL); + init_connection_lists(); + /* Have the log set up with our application name. */ + tor_snprintf(progname, sizeof(progname), "Tor %s", get_version()); + log_set_application_name(progname); + /* Initialize the history structures. */ + rep_hist_init(); + /* Initialize the service cache. */ + rend_cache_init(); + addressmap_init(); /* Init the client dns cache. Do it always, since it's + * cheap. */ + + { + /* We search for the "quiet" option first, since it decides whether we + * will log anything at all to the command line. */ + config_line_t *opts = NULL, *cmdline_opts = NULL; + const config_line_t *cl; + (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts); + for (cl = cmdline_opts; cl; cl = cl->next) { + if (!strcmp(cl->key, "--hush")) + quiet = 1; + if (!strcmp(cl->key, "--quiet") || + !strcmp(cl->key, "--dump-config")) + quiet = 2; + /* --version, --digests, and --help imply --hush */ + if (!strcmp(cl->key, "--version") || !strcmp(cl->key, "--digests") || + !strcmp(cl->key, "--list-torrc-options") || + !strcmp(cl->key, "--library-versions") || + !strcmp(cl->key, "-h") || !strcmp(cl->key, "--help")) { + if (quiet < 1) + quiet = 1; + } + } + config_free_lines(opts); + config_free_lines(cmdline_opts); + } + + /* give it somewhere to log to initially */ + switch (quiet) { + case 2: + /* no initial logging */ + break; + case 1: + add_temp_log(LOG_WARN); + break; + default: + add_temp_log(LOG_NOTICE); + } + quiet_level = quiet; + + { + const char *version = get_version(); + const char *bev_str = +#ifdef USE_BUFFEREVENTS + "(with bufferevents) "; +#else + ""; +#endif + log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s, " + "OpenSSL %s and Zlib %s.", version, bev_str, + get_uname(), + tor_libevent_get_version_str(), + crypto_openssl_get_version_str(), + tor_zlib_get_version_str()); + + log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " + "Learn how to be safe at " + "https://www.torproject.org/download/download#warning"); + + if (strstr(version, "alpha") || strstr(version, "beta")) + log_notice(LD_GENERAL, "This version is not a stable Tor release. " + "Expect more bugs than usual."); + } + +#ifdef NON_ANONYMOUS_MODE_ENABLED + log_warn(LD_GENERAL, "This copy of Tor was compiled to run in a " + "non-anonymous mode. It will provide NO ANONYMITY."); +#endif + + if (network_init()<0) { + log_err(LD_BUG,"Error initializing network; exiting."); + return -1; + } + atexit(exit_function); + + if (options_init_from_torrc(argc,argv) < 0) { + log_err(LD_CONFIG,"Reading config failed--see warnings above."); + return -1; + } + +#ifndef _WIN32 + if (geteuid()==0) + log_warn(LD_GENERAL,"You are running Tor as root. You don't need to, " + "and you probably shouldn't."); +#endif + + if (crypto_global_init(get_options()->HardwareAccel, + get_options()->AccelName, + get_options()->AccelDir)) { + log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); + return -1; + } + stream_choice_seed_weak_rng(); + + return 0; +} + +/** A lockfile structure, used to prevent two Tors from messing with the + * data directory at once. If this variable is non-NULL, we're holding + * the lockfile. */ +static tor_lockfile_t *lockfile = NULL; + +/** Try to grab the lock file described in options, if we do not + * already have it. If err_if_locked is true, warn if somebody else is + * holding the lock, and exit if we can't get it after waiting. Otherwise, + * return -1 if we can't get the lockfile. Return 0 on success. + */ +int +try_locking(const or_options_t *options, int err_if_locked) +{ + if (lockfile) + return 0; + else { + char *fname = options_get_datadir_fname2_suffix(options, "lock",NULL,NULL); + int already_locked = 0; + tor_lockfile_t *lf = tor_lockfile_lock(fname, 0, &already_locked); + tor_free(fname); + if (!lf) { + if (err_if_locked && already_locked) { + int r; + log_warn(LD_GENERAL, "It looks like another Tor process is running " + "with the same data directory. Waiting 5 seconds to see " + "if it goes away."); +#ifndef _WIN32 + sleep(5); +#else + Sleep(5000); +#endif + r = try_locking(options, 0); + if (r<0) { + log_err(LD_GENERAL, "No, it's still there. Exiting."); + exit(0); + } + return r; + } + return -1; + } + lockfile = lf; + return 0; + } +} + +/** Return true iff we've successfully acquired the lock file. */ +int +have_lockfile(void) +{ + return lockfile != NULL; +} + +/** If we have successfully acquired the lock file, release it. */ +void +release_lockfile(void) +{ + if (lockfile) { + tor_lockfile_unlock(lockfile); + lockfile = NULL; + } +} + +/** Free all memory that we might have allocated somewhere. + * If postfork, we are a worker process and we want to free + * only the parts of memory that we won't touch. If !postfork, + * Tor is shutting down and we should free everything. + * + * Helps us find the real leaks with dmalloc and the like. Also valgrind + * should then report 0 reachable in its leak report (in an ideal world -- + * in practice libevent, SSL, libc etc never quite free everything). */ +void +tor_free_all(int postfork) +{ + if (!postfork) { + evdns_shutdown(1); + } + geoip_free_all(); + dirvote_free_all(); + routerlist_free_all(); + networkstatus_free_all(); + addressmap_free_all(); + dirserv_free_all(); + rend_service_free_all(); + rend_cache_free_all(); + rend_service_authorization_free_all(); + rep_hist_free_all(); + dns_free_all(); + clear_pending_onions(); + circuit_free_all(); + entry_guards_free_all(); + pt_free_all(); + channel_tls_free_all(); + channel_free_all(); + connection_free_all(); + buf_shrink_freelists(1); + memarea_clear_freelist(); + nodelist_free_all(); + microdesc_free_all(); + ext_orport_free_all(); + control_free_all(); + if (!postfork) { + config_free_all(); + or_state_free_all(); + router_free_all(); + policies_free_all(); + } + free_cell_pool(); + if (!postfork) { + tor_tls_free_all(); + } + /* stuff in onion_main.c */ + + smartlist_free(connection_array); + smartlist_free(closeable_connection_lst); + smartlist_free(active_linked_connection_lst); + periodic_timer_free(second_timer); +#ifndef USE_BUFFEREVENTS + periodic_timer_free(refill_timer); +#endif + + if (!postfork) { + release_lockfile(); + } + /* Stuff in util.c and address.c*/ + if (!postfork) { + escaped(NULL); + esc_router_info(NULL); + logs_free_all(); /* free log strings. do this last so logs keep working. */ + } +} + +/** Do whatever cleanup is necessary before shutting Tor down. */ +void +tor_cleanup(void) +{ + const or_options_t *options = get_options(); + if (options->command == CMD_RUN_TOR) { + time_t now = time(NULL); + /* Remove our pid file. We don't care if there was an error when we + * unlink, nothing we could do about it anyways. */ + if (options->PidFile) + unlink(options->PidFile); + if (options->ControlPortWriteToFile) + unlink(options->ControlPortWriteToFile); + if (accounting_is_enabled(options)) + accounting_record_bandwidth_usage(now, get_or_state()); + or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */ + or_state_save(now); + if (authdir_mode_tests_reachability(options)) + rep_hist_record_mtbf_data(now, 0); + } +#ifdef USE_DMALLOC + dmalloc_log_stats(); +#endif + tor_free_all(0); /* We could move tor_free_all back into the ifdef below + later, if it makes shutdown unacceptably slow. But for + now, leave it here: it's helped us catch bugs in the + past. */ + crypto_global_cleanup(); +#ifdef USE_DMALLOC + dmalloc_log_unfreed(); + dmalloc_shutdown(); +#endif +} + +/** Read/create keys as needed, and echo our fingerprint to stdout. */ +static int +do_list_fingerprint(void) +{ + char buf[FINGERPRINT_LEN+1]; + crypto_pk_t *k; + const char *nickname = get_options()->Nickname; + if (!server_mode(get_options())) { + log_err(LD_GENERAL, + "Clients don't have long-term identity keys. Exiting."); + return -1; + } + tor_assert(nickname); + if (init_keys() < 0) { + log_err(LD_BUG,"Error initializing keys; can't display fingerprint"); + return -1; + } + if (!(k = get_server_identity_key())) { + log_err(LD_GENERAL,"Error: missing identity key."); + return -1; + } + if (crypto_pk_get_fingerprint(k, buf, 1)<0) { + log_err(LD_BUG, "Error computing fingerprint"); + return -1; + } + printf("%s %s\n", nickname, buf); + return 0; +} + +/** Entry point for password hashing: take the desired password from + * the command line, and print its salted hash to stdout. **/ +static void +do_hash_password(void) +{ + + char output[256]; + char key[S2K_SPECIFIER_LEN+DIGEST_LEN]; + + crypto_rand(key, S2K_SPECIFIER_LEN-1); + key[S2K_SPECIFIER_LEN-1] = (uint8_t)96; /* Hash 64 K of data. */ + secret_to_key(key+S2K_SPECIFIER_LEN, DIGEST_LEN, + get_options()->command_arg, strlen(get_options()->command_arg), + key); + base16_encode(output, sizeof(output), key, sizeof(key)); + printf("16:%s\n",output); +} + +/** Entry point for configuration dumping: write the configuration to + * stdout. */ +static int +do_dump_config(void) +{ + const or_options_t *options = get_options(); + const char *arg = options->command_arg; + int how; + char *opts; + if (!strcmp(arg, "short")) { + how = OPTIONS_DUMP_MINIMAL; + } else if (!strcmp(arg, "non-builtin")) { + how = OPTIONS_DUMP_DEFAULTS; + } else if (!strcmp(arg, "full")) { + how = OPTIONS_DUMP_ALL; + } else { + printf("%s is not a recognized argument to --dump-config. " + "Please select 'short', 'non-builtin', or 'full'", arg); + return -1; + } + + opts = options_dump(options, how); + printf("%s", opts); + tor_free(opts); + + return 0; +} + +#if defined (WINCE) +int +find_flashcard_path(PWCHAR path, size_t size) +{ + WIN32_FIND_DATA d = {0}; + HANDLE h = NULL; + + if (!path) + return -1; + + h = FindFirstFlashCard(&d); + if (h == INVALID_HANDLE_VALUE) + return -1; + + if (wcslen(d.cFileName) == 0) { + FindClose(h); + return -1; + } + + wcsncpy(path,d.cFileName,size); + FindClose(h); + return 0; +} +#endif + +static void +init_addrinfo(void) +{ + char hname[256]; + + // host name to sandbox + gethostname(hname, sizeof(hname)); + sandbox_add_addrinfo(hname); +} + +static sandbox_cfg_t* +sandbox_init_filter(void) +{ + sandbox_cfg_t *cfg = sandbox_cfg_new(); + + sandbox_cfg_allow_openat_filename(&cfg, + get_datadir_fname("cached-status"), 1); + + sandbox_cfg_allow_open_filename_array(&cfg, + get_datadir_fname("cached-certs"), 1, + get_datadir_fname("cached-certs.tmp"), 1, + get_datadir_fname("cached-consensus"), 1, + get_datadir_fname("unverified-consensus"), 1, + get_datadir_fname("unverified-consensus.tmp"), 1, + get_datadir_fname("cached-microdesc-consensus"), 1, + get_datadir_fname("cached-microdesc-consensus.tmp"), 1, + get_datadir_fname("cached-microdescs"), 1, + get_datadir_fname("cached-microdescs.tmp"), 1, + get_datadir_fname("cached-microdescs.new"), 1, + get_datadir_fname("cached-microdescs.new.tmp"), 1, + get_datadir_fname("unverified-microdesc-consensus"), 1, + get_datadir_fname("cached-descriptors"), 1, + get_datadir_fname("cached-descriptors.new"), 1, + get_datadir_fname("cached-descriptors.tmp"), 1, + get_datadir_fname("cached-descriptors.new.tmp"), 1, + get_datadir_fname("cached-descriptors.tmp.tmp"), 1, + get_datadir_fname("cached-extrainfo"), 1, + get_datadir_fname("state.tmp"), 1, + get_datadir_fname("unparseable-desc.tmp"), 1, + get_datadir_fname("unparseable-desc"), 1, + "/dev/srandom", 0, + "/dev/urandom", 0, + "/dev/random", 0, + NULL, 0 + ); + + sandbox_cfg_allow_stat_filename_array(&cfg, + get_datadir_fname(NULL), 1, + get_datadir_fname("lock"), 1, + get_datadir_fname("state"), 1, + get_datadir_fname("router-stability"), 1, + get_datadir_fname("cached-extrainfo.new"), 1, + NULL, 0 + ); + + // orport + if (server_mode(get_options())) { + sandbox_cfg_allow_open_filename_array(&cfg, + get_datadir_fname2("keys", "secret_id_key"), 1, + get_datadir_fname2("keys", "secret_onion_key"), 1, + get_datadir_fname2("keys", "secret_onion_key_ntor"), 1, + get_datadir_fname2("keys", "secret_onion_key_ntor.tmp"), 1, + get_datadir_fname2("keys", "secret_id_key.old"), 1, + get_datadir_fname2("keys", "secret_onion_key.old"), 1, + get_datadir_fname2("keys", "secret_onion_key_ntor.old"), 1, + get_datadir_fname2("keys", "secret_onion_key.tmp"), 1, + get_datadir_fname2("keys", "secret_id_key.tmp"), 1, + get_datadir_fname("fingerprint"), 1, + get_datadir_fname("fingerprint.tmp"), 1, + get_datadir_fname("cached-consensus"), 1, + get_datadir_fname("cached-consensus.tmp"), 1, + "/etc/resolv.conf", 0, + NULL, 0 + ); + + sandbox_cfg_allow_stat_filename_array(&cfg, + get_datadir_fname("keys"), 1, + get_datadir_fname("stats/dirreq-stats"), 1, + NULL, 0 + ); + } + + sandbox_cfg_allow_execve(&cfg, "/usr/local/bin/tor"); + + init_addrinfo(); + + return cfg; +} + +/** Main entry point for the Tor process. Called from main(). */ +/* This function is distinct from main() only so we can link onion_main.c into + * the unittest binary without conflicting with the unittests' main. */ +int +tor_main(int argc, char *argv[]) +{ + int result = 0; +#if defined (WINCE) + WCHAR path [MAX_PATH] = {0}; + WCHAR fullpath [MAX_PATH] = {0}; + PWCHAR p = NULL; + FILE* redir = NULL; + FILE* redirdbg = NULL; + + // this is to facilitate debugging by opening + // a file on a folder shared by the wm emulator. + // if no flashcard (real or emulated) is present, + // log files will be written in the root folder + if (find_flashcard_path(path,MAX_PATH) == -1) { + redir = _wfreopen( L"\\stdout.log", L"w", stdout ); + redirdbg = _wfreopen( L"\\stderr.log", L"w", stderr ); + } else { + swprintf(fullpath,L"\\%s\\tor",path); + CreateDirectory(fullpath,NULL); + + swprintf(fullpath,L"\\%s\\tor\\stdout.log",path); + redir = _wfreopen( fullpath, L"w", stdout ); + + swprintf(fullpath,L"\\%s\\tor\\stderr.log",path); + redirdbg = _wfreopen( fullpath, L"w", stderr ); + } +#endif + +#ifdef _WIN32 + /* Call SetProcessDEPPolicy to permanently enable DEP. + The function will not resolve on earlier versions of Windows, + and failure is not dangerous. */ + HMODULE hMod = GetModuleHandleA("Kernel32.dll"); + if (hMod) { + typedef BOOL (WINAPI *PSETDEP)(DWORD); + PSETDEP setdeppolicy = (PSETDEP)GetProcAddress(hMod, + "SetProcessDEPPolicy"); + if (setdeppolicy) setdeppolicy(1); /* PROCESS_DEP_ENABLE */ + } +#endif + + configure_backtrace_handler(get_version()); + + update_approx_time(time(NULL)); + tor_threads_init(); + init_logging(); +#ifdef USE_DMALLOC + { + /* Instruct OpenSSL to use our internal wrappers for malloc, + realloc and free. */ + int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); + tor_assert(r); + } +#endif +#ifdef NT_SERVICE + { + int done = 0; + result = nt_service_parse_options(argc, argv, &done); + if (done) return result; + } +#endif + if (tor_init(argc, argv)<0) + return -1; + + if (get_options()->Sandbox) { + sandbox_cfg_t* cfg = sandbox_init_filter(); + + if (sandbox_init(cfg)) { + log_err(LD_BUG,"Failed to create syscall sandbox filter"); + return -1; + } + + // registering libevent rng +#ifdef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE + evutil_secure_rng_set_urandom_device_file( + (char*) sandbox_intern_string("/dev/urandom")); +#endif + } + + switch (get_options()->command) { + case CMD_RUN_TOR: +#ifdef NT_SERVICE + nt_service_set_state(SERVICE_RUNNING); +#endif + result = do_main_loop(); + break; + case CMD_LIST_FINGERPRINT: + result = do_list_fingerprint(); + break; + case CMD_HASH_PASSWORD: + do_hash_password(); + result = 0; + break; + case CMD_VERIFY_CONFIG: + printf("Configuration was valid\n"); + result = 0; + break; + case CMD_DUMP_CONFIG: + result = do_dump_config(); + break; + case CMD_RUN_UNITTESTS: /* only set by test.c */ + default: + log_warn(LD_BUG,"Illegal command number %d: internal error.", + get_options()->command); + result = -1; + } + tor_cleanup(); + return result; +} + diff --git a/src/tor/src/or/main.h b/src/tor/onion_main.h similarity index 57% rename from src/tor/src/or/main.h rename to src/tor/onion_main.h index d8593b57d..1746ce88f 100644 --- a/src/tor/src/or/main.h +++ b/src/tor/onion_main.h @@ -1,20 +1,22 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** - * \file main.h - * \brief Header file for main.c. + * \file onion_main.h + * \brief Header file for onion_main.c. **/ #ifndef TOR_MAIN_H #define TOR_MAIN_H -int have_completed_a_circuit(void); -void note_that_we_completed_a_circuit(void); -void note_that_we_maybe_cant_complete_circuits(void); +#ifdef __cplusplus +extern "C" { +#endif + +extern int can_complete_circuit; int connection_add_impl(connection_t *conn, int is_connecting); #define connection_add(conn) connection_add_impl((conn), 0) @@ -25,9 +27,9 @@ int connection_in_array(connection_t *conn); void add_connection_to_closeable_list(connection_t *conn); int connection_is_on_closeable_list(connection_t *conn); -MOCK_DECL(smartlist_t *, get_connection_array, (void)); -MOCK_DECL(uint64_t,get_bytes_read,(void)); -MOCK_DECL(uint64_t,get_bytes_written,(void)); +smartlist_t *get_connection_array(void); +uint64_t get_bytes_read(void); +uint64_t get_bytes_written(void); /** Bitmask for events that we can turn on and off with * connection_watch_events. */ @@ -45,64 +47,40 @@ int connection_is_writing(connection_t *conn); MOCK_DECL(void,connection_stop_writing,(connection_t *conn)); MOCK_DECL(void,connection_start_writing,(connection_t *conn)); -void tell_event_loop_to_run_external_code(void); -void tor_shutdown_event_loop_and_exit(int exitcode); -int tor_event_loop_shutdown_is_pending(void); - void connection_stop_reading_from_linked_conn(connection_t *conn); -MOCK_DECL(int, connection_count_moribund, (void)); - void directory_all_unreachable(time_t now); -void directory_info_has_arrived(time_t now, int from_cache, int suppress_logs); +void directory_info_has_arrived(time_t now, int from_cache); void ip_address_changed(int at_interface); void dns_servers_relaunch_checks(void); -void reset_all_main_loop_timers(void); -void reschedule_descriptor_update_check(void); -void reschedule_directory_downloads(void); - -MOCK_DECL(long,get_uptime,(void)); +long get_uptime(void); unsigned get_signewnym_epoch(void); void handle_signals(int is_parent); -void activate_signal(int signal_num); +void process_signal(uintptr_t sig); int try_locking(const or_options_t *options, int err_if_locked); int have_lockfile(void); void release_lockfile(void); -void tor_remove_file(const char *filename); - void tor_cleanup(void); void tor_free_all(int postfork); +int tor_main(int argc, char *argv[]); + int do_main_loop(void); int tor_init(int argc, char **argv); -void reset_main_loop_counters(void); -uint64_t get_main_loop_success_count(void); -uint64_t get_main_loop_error_count(void); -uint64_t get_main_loop_idle_count(void); - -extern time_t time_of_process_start; -extern long stats_n_seconds_working; -extern int quiet_level; -extern int global_read_bucket; -extern int global_write_bucket; -extern int global_relayed_read_bucket; -extern int global_relayed_write_bucket; - #ifdef MAIN_PRIVATE STATIC void init_connection_lists(void); STATIC void close_closeable_connections(void); -STATIC void initialize_periodic_events(void); -STATIC void teardown_periodic_events(void); -#ifdef TOR_UNIT_TESTS -extern smartlist_t *connection_array; #endif -#endif /* defined(MAIN_PRIVATE) */ -#endif /* !defined(TOR_MAIN_H) */ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/tor/src/or/onion_ntor.c b/src/tor/onion_ntor.c similarity index 87% rename from src/tor/src/or/onion_ntor.c rename to src/tor/onion_ntor.c index b167cb61f..e37ce9e8a 100644 --- a/src/tor/src/or/onion_ntor.c +++ b/src/tor/onion_ntor.c @@ -1,34 +1,17 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file onion_ntor.c - * - * \brief Implementation for the ntor handshake. - * - * The ntor circuit-extension handshake was developed as a replacement - * for the old TAP handshake. It uses Elliptic-curve Diffie-Hellman and - * a hash function in order to perform a one-way authenticated key - * exchange. The ntor handshake is meant to replace the old "TAP" - * handshake. - * - * We instantiate ntor with curve25519, HMAC-SHA256, and HKDF. - * - * This handshake, like the other circuit-extension handshakes, is - * invoked from onion.c. - */ - #include "orconfig.h" -#define ONION_NTOR_PRIVATE #include "crypto.h" +#define ONION_NTOR_PRIVATE #include "onion_ntor.h" #include "torlog.h" -#include "util.h" +#include "tor_util.h" /** Free storage held in an ntor handshake state. */ void -ntor_handshake_state_free_(ntor_handshake_state_t *state) +ntor_handshake_state_free(ntor_handshake_state_t *state) { if (!state) return; @@ -58,7 +41,7 @@ typedef struct tweakset_t { } tweakset_t; /** The tweaks to be used with our handshake. */ -static const tweakset_t proto1_tweaks = { +const tweakset_t proto1_tweaks = { #define PROTOID "ntor-curve25519-sha256-1" #define PROTOID_LEN 24 PROTOID ":mac", @@ -96,13 +79,8 @@ onion_skin_ntor_create(const uint8_t *router_id, memcpy(state->router_id, router_id, DIGEST_LEN); memcpy(&state->pubkey_B, router_key, sizeof(curve25519_public_key_t)); if (curve25519_secret_key_generate(&state->seckey_x, 0) < 0) { - /* LCOV_EXCL_START - * Secret key generation should be unable to fail when the key isn't - * marked as "extra-strong" */ - tor_assert_nonfatal_unreached(); tor_free(state); return -1; - /* LCOV_EXCL_STOP */ } curve25519_public_key_generate(&state->pubkey_X, &state->seckey_x); @@ -248,8 +226,7 @@ onion_skin_ntor_client_handshake( const ntor_handshake_state_t *handshake_state, const uint8_t *handshake_reply, uint8_t *key_out, - size_t key_out_len, - const char **msg_out) + size_t key_out_len) { const tweakset_t *T = &proto1_tweaks; /* Sensitive stack-allocated material. Kept in an anonymous struct to make @@ -279,7 +256,7 @@ onion_skin_ntor_client_handshake( si += CURVE25519_OUTPUT_LEN; curve25519_handshake(si, &handshake_state->seckey_x, &handshake_state->pubkey_B); - bad |= (safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN) << 1); + bad |= safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN); si += CURVE25519_OUTPUT_LEN; APPEND(si, handshake_state->router_id, DIGEST_LEN); APPEND(si, handshake_state->pubkey_B.public_key, CURVE25519_PUBKEY_LEN); @@ -304,7 +281,7 @@ onion_skin_ntor_client_handshake( /* Compute auth */ h_tweak(s.auth, s.auth_input, sizeof(s.auth_input), T->t_mac); - bad |= (tor_memneq(s.auth, auth_candidate, DIGEST256_LEN) << 2); + bad |= tor_memneq(s.auth, auth_candidate, DIGEST256_LEN); crypto_expand_key_material_rfc5869_sha256( s.secret_input, sizeof(s.secret_input), @@ -313,23 +290,6 @@ onion_skin_ntor_client_handshake( key_out, key_out_len); memwipe(&s, 0, sizeof(s)); - - if (bad) { - if (bad & 4) { - if (msg_out) - *msg_out = NULL; /* Don't report this one; we probably just had the - * wrong onion key.*/ - log_fn(LOG_INFO, LD_PROTOCOL, - "Invalid result from curve25519 handshake: %d", bad); - } - if (bad & 3) { - if (msg_out) - *msg_out = "Zero output from curve25519 handshake"; - log_fn(LOG_WARN, LD_PROTOCOL, - "Invalid result from curve25519 handshake: %d", bad); - } - } - return bad ? -1 : 0; } diff --git a/src/tor/src/or/onion_ntor.h b/src/tor/onion_ntor.h similarity index 82% rename from src/tor/src/or/onion_ntor.h rename to src/tor/onion_ntor.h index f7c962b7d..c942e6e0f 100644 --- a/src/tor/src/or/onion_ntor.h +++ b/src/tor/onion_ntor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ONION_NTOR_H @@ -17,9 +17,8 @@ typedef struct ntor_handshake_state_t ntor_handshake_state_t; /** Length of an ntor reply, as sent from server to client. */ #define NTOR_REPLY_LEN 64 -void ntor_handshake_state_free_(ntor_handshake_state_t *state); -#define ntor_handshake_state_free(state) \ - FREE_AND_NULL(ntor_handshake_state_t, ntor_handshake_state_free_, (state)) +#ifdef CURVE25519_ENABLED +void ntor_handshake_state_free(ntor_handshake_state_t *state); int onion_skin_ntor_create(const uint8_t *router_id, const curve25519_public_key_t *router_key, @@ -38,8 +37,7 @@ int onion_skin_ntor_client_handshake( const ntor_handshake_state_t *handshake_state, const uint8_t *handshake_reply, uint8_t *key_out, - size_t key_out_len, - const char **msg_out); + size_t key_out_len); #ifdef ONION_NTOR_PRIVATE @@ -57,7 +55,9 @@ struct ntor_handshake_state_t { curve25519_public_key_t pubkey_X; /** @} */ }; -#endif /* defined(ONION_NTOR_PRIVATE) */ +#endif -#endif /* !defined(TOR_ONION_NTOR_H) */ +#endif + +#endif diff --git a/src/tor/src/or/onion_tap.c b/src/tor/onion_tap.c similarity index 81% rename from src/tor/src/or/onion_tap.c rename to src/tor/onion_tap.c index c71fa236e..3782e75ab 100644 --- a/src/tor/src/or/onion_tap.c +++ b/src/tor/onion_tap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,22 +9,10 @@ * \brief Functions to implement the original Tor circuit extension handshake * (a.k.a TAP). * - * The "TAP" handshake is the first one that was widely used in Tor: It - * combines RSA1024-OAEP and AES128-CTR to perform a hybrid encryption over - * the first message DH1024 key exchange. (The RSA-encrypted part of the - * encryption is authenticated; the AES-encrypted part isn't. This was - * not a smart choice.) - * * We didn't call it "TAP" ourselves -- Ian Goldberg named it in "On the * Security of the Tor Authentication Protocol". (Spoiler: it's secure, but * its security is kind of fragile and implementation dependent. Never modify * this implementation without reading and understanding that paper at least.) - * - * We have deprecated TAP since the ntor handshake came into general use. It - * is still used for hidden service IP and RP connections, however. - * - * This handshake, like the other circuit-extension handshakes, is - * invoked from onion.c. **/ #include "or.h" @@ -72,8 +60,10 @@ onion_skin_TAP_create(crypto_pk_t *dest_router_key, if (crypto_dh_get_public(dh, challenge, dhbytes)) goto err; + note_crypto_pk_op(ENC_ONIONSKIN); + /* set meeting point, meeting cookie, etc here. Leave zero for now. */ - if (crypto_pk_obsolete_public_hybrid_encrypt(dest_router_key, onion_skin_out, + if (crypto_pk_public_hybrid_encrypt(dest_router_key, onion_skin_out, TAP_ONIONSKIN_CHALLENGE_LEN, challenge, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1)<0) @@ -84,13 +74,9 @@ onion_skin_TAP_create(crypto_pk_t *dest_router_key, return 0; err: - /* LCOV_EXCL_START - * We only get here if RSA encryption fails or DH keygen fails. Those - * shouldn't be possible. */ memwipe(challenge, 0, sizeof(challenge)); if (dh) crypto_dh_free(dh); return -1; - /* LCOV_EXCL_STOP */ } /** Given an encrypted DH public key as generated by onion_skin_create, @@ -122,7 +108,8 @@ onion_skin_TAP_server_handshake( k = i==0?private_key:prev_private_key; if (!k) break; - len = crypto_pk_obsolete_private_hybrid_decrypt(k, challenge, + note_crypto_pk_op(DEC_ONIONSKIN); + len = crypto_pk_private_hybrid_decrypt(k, challenge, TAP_ONIONSKIN_CHALLENGE_LEN, onion_skin, TAP_ONIONSKIN_CHALLENGE_LEN, @@ -135,28 +122,19 @@ onion_skin_TAP_server_handshake( "Couldn't decrypt onionskin: client may be using old onion key"); goto err; } else if (len != DH_KEY_LEN) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Unexpected onionskin length after decryption: %ld", - (long)len); + log_warn(LD_PROTOCOL, "Unexpected onionskin length after decryption: %ld", + (long)len); goto err; } dh = crypto_dh_new(DH_TYPE_CIRCUIT); if (!dh) { - /* LCOV_EXCL_START - * Failure to allocate a DH key should be impossible. - */ log_warn(LD_BUG, "Couldn't allocate DH key"); goto err; - /* LCOV_EXCL_STOP */ } if (crypto_dh_get_public(dh, handshake_reply_out, DH_KEY_LEN)) { - /* LCOV_EXCL_START - * This can only fail if the length of the key we just allocated is too - * big. That should be impossible. */ log_info(LD_GENERAL, "crypto_dh_get_public failed."); goto err; - /* LCOV_EXCL_STOP */ } key_material_len = DIGEST_LEN+key_out_len; @@ -204,8 +182,7 @@ int onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state, const char *handshake_reply, /* TAP_ONIONSKIN_REPLY_LEN bytes */ char *key_out, - size_t key_out_len, - const char **msg_out) + size_t key_out_len) { ssize_t len; char *key_material=NULL; @@ -217,16 +194,13 @@ onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state, len = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, handshake_state, handshake_reply, DH_KEY_LEN, key_material, key_material_len); - if (len < 0) { - if (msg_out) - *msg_out = "DH computation failed."; + if (len < 0) goto err; - } if (tor_memneq(key_material, handshake_reply+DH_KEY_LEN, DIGEST_LEN)) { /* H(K) does *not* match. Something fishy. */ - if (msg_out) - *msg_out = "Digest DOES NOT MATCH on onion handshake. Bug or attack."; + log_warn(LD_PROTOCOL,"Digest DOES NOT MATCH on onion handshake. " + "Bug or attack."); goto err; } diff --git a/src/tor/src/or/onion_tap.h b/src/tor/onion_tap.h similarity index 85% rename from src/tor/src/or/onion_tap.h rename to src/tor/onion_tap.h index 713c1d739..b978b6673 100644 --- a/src/tor/src/or/onion_tap.h +++ b/src/tor/onion_tap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -31,8 +31,7 @@ int onion_skin_TAP_server_handshake(const char *onion_skin, int onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state, const char *handshake_reply, char *key_out, - size_t key_out_len, - const char **msg_out); + size_t key_out_len); -#endif /* !defined(TOR_ONION_TAP_H) */ +#endif diff --git a/src/tor/src/or/or.h b/src/tor/or.h similarity index 78% rename from src/tor/src/or/or.h rename to src/tor/or.h index 2617d2d87..e28f82cdf 100644 --- a/src/tor/src/or/or.h +++ b/src/tor/or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,6 +14,21 @@ #include "orconfig.h" +#ifdef __COVERITY__ +/* If we're building for a static analysis, turn on all the off-by-default + * features. */ +#ifndef INSTRUMENT_DOWNLOADS +#define INSTRUMENT_DOWNLOADS 1 +#endif +#endif + +#ifdef _WIN32 +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#define WIN32_LEAN_AND_MEAN +#endif + #ifdef HAVE_UNISTD_H #include #endif @@ -27,6 +42,9 @@ #include /* FreeBSD needs this to know what version it is */ #endif #include "torint.h" +#ifdef HAVE_SYS_WAIT_H +#include +#endif #ifdef HAVE_SYS_FCNTL_H #include #endif @@ -59,29 +77,29 @@ #endif #ifdef _WIN32 -#include #include #include #include #include -#endif /* defined(_WIN32) */ +#endif + +#ifdef USE_BUFFEREVENTS +#include +#include +#include +#endif #include "crypto.h" -#include "crypto_format.h" #include "tortls.h" #include "torlog.h" #include "container.h" -#include "compress.h" +#include "torgzip.h" #include "address.h" #include "compat_libevent.h" #include "ht.h" -#include "confline.h" #include "replaycache.h" #include "crypto_curve25519.h" -#include "crypto_ed25519.h" #include "tor_queue.h" -#include "util_format.h" -#include "hs_circuitmap.h" /* These signals are defined to help handle_control_signal work. */ @@ -104,7 +122,6 @@ * conflict with system-defined signals. */ #define SIGNEWNYM 129 #define SIGCLEARDNSCACHE 130 -#define SIGHEARTBEAT 131 #if (SIZEOF_CELL_T != 0) /* On Irix, stdlib.h defines a cell_t type, so we need to make sure @@ -116,9 +133,6 @@ #define NON_ANONYMOUS_MODE_ENABLED 1 #endif -/** Helper macro: Given a pointer to to.base_, of type from*, return &to. */ -#define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, base_)) - /** Length of longest allowable configured nickname. */ #define MAX_NICKNAME_LEN 19 /** Length of a router identity encoded as a hexadecimal digest, plus @@ -148,27 +162,20 @@ /** Maximum size of a single extrainfo document, as above. */ #define MAX_EXTRAINFO_UPLOAD_SIZE 50000 -/** Minimum lifetime for an onion key in days. */ -#define MIN_ONION_KEY_LIFETIME_DAYS (1) - -/** Maximum lifetime for an onion key in days. */ -#define MAX_ONION_KEY_LIFETIME_DAYS (90) - -/** Default lifetime for an onion key in days. */ -#define DEFAULT_ONION_KEY_LIFETIME_DAYS (28) - -/** Minimum grace period for acceptance of an onion key in days. - * The maximum value is defined in proposal #274 as being the current network - * consensus parameter for "onion-key-rotation-days". */ -#define MIN_ONION_KEY_GRACE_PERIOD_DAYS (1) - -/** Default grace period for acceptance of an onion key in days. */ -#define DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS (7) - -/** How often we should check the network consensus if it is time to rotate or - * expire onion keys. */ -#define ONION_KEY_CONSENSUS_CHECK_INTERVAL (60*60) - +/** How long do we keep DNS cache entries before purging them (regardless of + * their TTL)? */ +#define MAX_DNS_ENTRY_AGE (30*60) +/** How long do we cache/tell clients to cache DNS records when no TTL is + * known? */ +#define DEFAULT_DNS_TTL (30*60) +/** How long can a TTL be before we stop believing it? */ +#define MAX_DNS_TTL (3*60*60) +/** How small can a TTL be before we stop believing it? Provides rudimentary + * pinning. */ +#define MIN_DNS_TTL 60 + +/** How often do we rotate onion keys? */ +#define MIN_ONION_KEY_LIFETIME (7*24*60*60) /** How often do we rotate TLS contexts? */ #define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60) @@ -189,7 +196,6 @@ typedef enum { * and let it use any circuit ID it wants. */ CIRC_ID_TYPE_NEITHER=2 } circ_id_type_t; -#define circ_id_type_bitfield_t ENUM_BF(circ_id_type_t) #define CONN_TYPE_MIN_ 3 /** Type for sockets listening for OR connections. */ @@ -208,7 +214,8 @@ typedef enum { #define CONN_TYPE_DIR_LISTENER 8 /** Type for HTTP connections to the directory server. */ #define CONN_TYPE_DIR 9 -/* Type 10 is unused. */ +/** Connection from the main process to a CPU worker process. */ +#define CONN_TYPE_CPUWORKER 10 /** Type for listening for connections from user interface process. */ #define CONN_TYPE_CONTROL_LISTENER 11 /** Type for connections from user interface process. */ @@ -226,10 +233,8 @@ typedef enum { #define CONN_TYPE_EXT_OR 16 /** Type for sockets listening for Extended ORPort connections. */ #define CONN_TYPE_EXT_OR_LISTENER 17 -/** Type for sockets listening for HTTP CONNECT tunnel connections. */ -#define CONN_TYPE_AP_HTTP_CONNECT_LISTENER 18 -#define CONN_TYPE_MAX_ 19 +#define CONN_TYPE_MAX_ 17 /* !!!! If _CONN_TYPE_MAX is ever over 31, we must grow the type field in * connection_t. */ @@ -238,7 +243,7 @@ typedef enum { #define PROXY_CONNECT 1 #define PROXY_SOCKS4 2 #define PROXY_SOCKS5 3 -/* !!!! If there is ever a PROXY_* type over 3, we must grow the proxy_type +/* !!!! If there is ever a PROXY_* type over 2, we must grow the proxy_type * field in or_connection_t */ /* Pluggable transport proxy type. Don't use this in or_connection_t, @@ -272,6 +277,17 @@ typedef enum { /** State for any listener connection. */ #define LISTENER_STATE_READY 0 +#define CPUWORKER_STATE_MIN_ 1 +/** State for a connection to a cpuworker process that's idle. */ +#define CPUWORKER_STATE_IDLE 1 +/** State for a connection to a cpuworker process that's processing a + * handshake. */ +#define CPUWORKER_STATE_BUSY_ONION 2 +#define CPUWORKER_STATE_MAX_ 2 + +#define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION +#define CPUWORKER_TASK_SHUTDOWN 255 + #define OR_CONN_STATE_MIN_ 1 /** State for a connection to an OR: waiting for connect() to finish. */ #define OR_CONN_STATE_CONNECTING 1 @@ -350,9 +366,7 @@ typedef enum { /** State for a transparent natd connection: waiting for original * destination. */ #define AP_CONN_STATE_NATD_WAIT 12 -/** State for an HTTP tunnel: waiting for an HTTP CONNECT command. */ -#define AP_CONN_STATE_HTTP_CONNECT_WAIT 13 -#define AP_CONN_STATE_MAX_ 13 +#define AP_CONN_STATE_MAX_ 12 /** True iff the AP_CONN_STATE_* value s means that the corresponding * edge connection is not attached to any circuit. */ @@ -386,10 +400,13 @@ typedef enum { #define CONTROL_CONN_STATE_NEEDAUTH 2 #define CONTROL_CONN_STATE_MAX_ 2 -#define DIR_PURPOSE_MIN_ 4 -/** A connection to a directory server: set after a v2 rendezvous +#define DIR_PURPOSE_MIN_ 3 +/** A connection to a directory server: download a rendezvous + * descriptor. */ +#define DIR_PURPOSE_FETCH_RENDDESC 3 +/** A connection to a directory server: set after a rendezvous * descriptor is downloaded. */ -#define DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 4 +#define DIR_PURPOSE_HAS_FETCHED_RENDDESC 4 /** A connection to a directory server: download one or more server * descriptors. */ #define DIR_PURPOSE_FETCH_SERVERDESC 6 @@ -398,6 +415,9 @@ typedef enum { #define DIR_PURPOSE_FETCH_EXTRAINFO 7 /** A connection to a directory server: upload a server descriptor. */ #define DIR_PURPOSE_UPLOAD_DIR 8 +/** A connection to a directory server: upload a rendezvous + * descriptor. */ +#define DIR_PURPOSE_UPLOAD_RENDDESC 9 /** A connection to a directory server: upload a v3 networkstatus vote. */ #define DIR_PURPOSE_UPLOAD_VOTE 10 /** A connection to a directory server: upload a v3 consensus signature */ @@ -425,23 +445,15 @@ typedef enum { #define DIR_PURPOSE_FETCH_RENDDESC_V2 18 /** A connection to a directory server: download a microdescriptor. */ #define DIR_PURPOSE_FETCH_MICRODESC 19 -/** A connection to a hidden service directory: upload a v3 descriptor. */ -#define DIR_PURPOSE_UPLOAD_HSDESC 20 -/** A connection to a hidden service directory: fetch a v3 descriptor. */ -#define DIR_PURPOSE_FETCH_HSDESC 21 -/** A connection to a directory server: set after a hidden service descriptor - * is downloaded. */ -#define DIR_PURPOSE_HAS_FETCHED_HSDESC 22 -#define DIR_PURPOSE_MAX_ 22 - -/** True iff p is a purpose corresponding to uploading - * data to a directory server. */ +#define DIR_PURPOSE_MAX_ 19 + +/** True iff p is a purpose corresponding to uploading data to a + * directory server. */ #define DIR_PURPOSE_IS_UPLOAD(p) \ ((p)==DIR_PURPOSE_UPLOAD_DIR || \ + (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \ (p)==DIR_PURPOSE_UPLOAD_VOTE || \ - (p)==DIR_PURPOSE_UPLOAD_SIGNATURES || \ - (p)==DIR_PURPOSE_UPLOAD_RENDDESC_V2 || \ - (p)==DIR_PURPOSE_UPLOAD_HSDESC) + (p)==DIR_PURPOSE_UPLOAD_SIGNATURES) #define EXIT_PURPOSE_MIN_ 1 /** This exit stream wants to do an ordinary connect. */ @@ -460,12 +472,8 @@ typedef enum { /** Circuit state: I'd like to deliver a create, but my n_chan is still * connecting. */ #define CIRCUIT_STATE_CHAN_WAIT 2 -/** Circuit state: the circuit is open but we don't want to actually use it - * until we find out if a better guard will be available. - */ -#define CIRCUIT_STATE_GUARD_WAIT 3 /** Circuit state: onionskin(s) processed, ready to send/receive cells. */ -#define CIRCUIT_STATE_OPEN 4 +#define CIRCUIT_STATE_OPEN 3 #define CIRCUIT_PURPOSE_MIN_ 1 @@ -473,11 +481,9 @@ typedef enum { #define CIRCUIT_PURPOSE_OR_MIN_ 1 /** OR-side circuit purpose: normal circuit, at OR. */ #define CIRCUIT_PURPOSE_OR 1 -/** OR-side circuit purpose: At OR, from the service, waiting for intro from - * clients. */ +/** OR-side circuit purpose: At OR, from Bob, waiting for intro from Alices. */ #define CIRCUIT_PURPOSE_INTRO_POINT 2 -/** OR-side circuit purpose: At OR, from the client, waiting for the service. - */ +/** OR-side circuit purpose: At OR, from Alice, waiting for Bob. */ #define CIRCUIT_PURPOSE_REND_POINT_WAITING 3 /** OR-side circuit purpose: At OR, both circuits have this purpose. */ #define CIRCUIT_PURPOSE_REND_ESTABLISHED 4 @@ -496,47 +502,43 @@ typedef enum { * to becoming open, or they are open and have sent the * establish_rendezvous cell but haven't received an ack. * circuits that are c_rend_ready are open and have received a - * rend ack, but haven't heard from the service yet. if they have a + * rend ack, but haven't heard from bob yet. if they have a * buildstate->pending_final_cpath then they're expecting a - * cell from the service, else they're not. + * cell from bob, else they're not. * circuits that are c_rend_ready_intro_acked are open, and * some intro circ has sent its intro and received an ack. * circuits that are c_rend_joined are open, have heard from - * the service, and are talking to it. + * bob, and are talking to him. */ /** Client-side circuit purpose: Normal circuit, with cpath. */ #define CIRCUIT_PURPOSE_C_GENERAL 5 -/** Client-side circuit purpose: at the client, connecting to intro point. */ +/** Client-side circuit purpose: at Alice, connecting to intro point. */ #define CIRCUIT_PURPOSE_C_INTRODUCING 6 -/** Client-side circuit purpose: at the client, sent INTRODUCE1 to intro point, +/** Client-side circuit purpose: at Alice, sent INTRODUCE1 to intro point, * waiting for ACK/NAK. */ #define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7 -/** Client-side circuit purpose: at the client, introduced and acked, closing. - */ +/** Client-side circuit purpose: at Alice, introduced and acked, closing. */ #define CIRCUIT_PURPOSE_C_INTRODUCE_ACKED 8 -/** Client-side circuit purpose: at the client, waiting for ack. */ +/** Client-side circuit purpose: at Alice, waiting for ack. */ #define CIRCUIT_PURPOSE_C_ESTABLISH_REND 9 -/** Client-side circuit purpose: at the client, waiting for the service. */ +/** Client-side circuit purpose: at Alice, waiting for Bob. */ #define CIRCUIT_PURPOSE_C_REND_READY 10 -/** Client-side circuit purpose: at the client, waiting for the service, - * INTRODUCE has been acknowledged. */ +/** Client-side circuit purpose: at Alice, waiting for Bob, INTRODUCE + * has been acknowledged. */ #define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11 -/** Client-side circuit purpose: at the client, rendezvous established. */ +/** Client-side circuit purpose: at Alice, rendezvous established. */ #define CIRCUIT_PURPOSE_C_REND_JOINED 12 /** This circuit is used for build time measurement only */ #define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT 13 #define CIRCUIT_PURPOSE_C_MAX_ 13 -/** Hidden-service-side circuit purpose: at the service, waiting for - * introductions. */ +/** Hidden-service-side circuit purpose: at Bob, waiting for introductions. */ #define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 14 -/** Hidden-service-side circuit purpose: at the service, successfully - * established intro. */ +/** Hidden-service-side circuit purpose: at Bob, successfully established + * intro. */ #define CIRCUIT_PURPOSE_S_INTRO 15 -/** Hidden-service-side circuit purpose: at the service, connecting to rend - * point. */ +/** Hidden-service-side circuit purpose: at Bob, connecting to rend point. */ #define CIRCUIT_PURPOSE_S_CONNECT_REND 16 -/** Hidden-service-side circuit purpose: at the service, rendezvous - * established. */ +/** Hidden-service-side circuit purpose: at Bob, rendezvous established. */ #define CIRCUIT_PURPOSE_S_REND_JOINED 17 /** A testing circuit; not meant to be used for actual traffic. */ #define CIRCUIT_PURPOSE_TESTING 18 @@ -608,8 +610,7 @@ typedef enum { #define END_OR_CONN_REASON_NO_ROUTE 6 /* no route to host/net */ #define END_OR_CONN_REASON_IO_ERROR 7 /* read/write error */ #define END_OR_CONN_REASON_RESOURCE_LIMIT 8 /* sockets, buffers, etc */ -#define END_OR_CONN_REASON_PT_MISSING 9 /* PT failed or not available */ -#define END_OR_CONN_REASON_MISC 10 +#define END_OR_CONN_REASON_MISC 9 /* Reasons why we (or a remote OR) might close a stream. See tor-spec.txt for * documentation of these. The values must match. */ @@ -652,10 +653,6 @@ typedef enum { /** The target address is in a private network (like 127.0.0.1 or 10.0.0.1); * you don't want to do that over a randomly chosen exit */ #define END_STREAM_REASON_PRIVATE_ADDR 262 -/** This is an HTTP tunnel connection and the client used or misused HTTP in a - * way we can't handle. - */ -#define END_STREAM_REASON_HTTPPROTOCOL 263 /** Bitwise-and this value with endreason to mask out all flags. */ #define END_STREAM_REASON_MASK 511 @@ -687,10 +684,6 @@ typedef enum { /* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE * call; they only go to the controller for tracking */ - -/* Closing introduction point that were opened in parallel. */ -#define END_CIRC_REASON_IP_NOW_REDUNDANT -4 - /** Our post-timeout circuit time measurement period expired. * We must give up now */ #define END_CIRC_REASON_MEASUREMENT_EXPIRED -3 @@ -747,15 +740,15 @@ typedef enum { #define REND_NUMBER_OF_CONSECUTIVE_REPLICAS 3 /** Length of v2 descriptor ID (32 base32 chars = 160 bits). */ -#define REND_DESC_ID_V2_LEN_BASE32 BASE32_DIGEST_LEN +#define REND_DESC_ID_V2_LEN_BASE32 32 /** Length of the base32-encoded secret ID part of versioned hidden service * descriptors. */ -#define REND_SECRET_ID_PART_LEN_BASE32 BASE32_DIGEST_LEN +#define REND_SECRET_ID_PART_LEN_BASE32 32 /** Length of the base32-encoded hash of an introduction point's * identity key. */ -#define REND_INTRO_POINT_ID_LEN_BASE32 BASE32_DIGEST_LEN +#define REND_INTRO_POINT_ID_LEN_BASE32 32 /** Length of the descriptor cookie that is used for client authorization * to hidden services. */ @@ -803,7 +796,7 @@ typedef enum rend_auth_type_t { /** Client-side configuration of authorization for a hidden service. */ typedef struct rend_service_authorization_t { - uint8_t descriptor_cookie[REND_DESC_COOKIE_LEN]; + char descriptor_cookie[REND_DESC_COOKIE_LEN]; char onion_address[REND_SERVICE_ADDRESS_LEN+1]; rend_auth_type_t auth_type; } rend_service_authorization_t; @@ -812,62 +805,21 @@ typedef struct rend_service_authorization_t { * establishment. Not all fields contain data depending on where this struct * is used. */ typedef struct rend_data_t { - /* Hidden service protocol version of this base object. */ - uint32_t version; - - /** List of HSDir fingerprints on which this request has been sent to. This - * contains binary identity digest of the directory of size DIGEST_LEN. */ - smartlist_t *hsdirs_fp; - - /** Rendezvous cookie used by both, client and service. */ - char rend_cookie[REND_COOKIE_LEN]; - - /** Number of streams associated with this rendezvous circuit. */ - int nr_streams; -} rend_data_t; - -typedef struct rend_data_v2_t { - /* Rendezvous base data. */ - rend_data_t base_; - /** Onion address (without the .onion part) that a client requests. */ char onion_address[REND_SERVICE_ID_LEN_BASE32+1]; - /** Descriptor ID for each replicas computed from the onion address. If - * the onion address is empty, this array MUST be empty. We keep them so - * we know when to purge our entry in the last hsdir request table. */ - char descriptor_id[REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS][DIGEST_LEN]; - /** (Optional) descriptor cookie that is used by a client. */ char descriptor_cookie[REND_DESC_COOKIE_LEN]; /** Authorization type for accessing a service used by a client. */ rend_auth_type_t auth_type; - /** Descriptor ID for a client request. The control port command HSFETCH - * uses this. It's set if the descriptor query should only use this - * descriptor ID. */ - char desc_id_fetch[DIGEST_LEN]; - /** Hash of the hidden service's PK used by a service. */ char rend_pk_digest[DIGEST_LEN]; -} rend_data_v2_t; - -/* From a base rend_data_t object d, return the v2 object. */ -static inline -rend_data_v2_t *TO_REND_DATA_V2(const rend_data_t *d) -{ - tor_assert(d); - tor_assert(d->version == 2); - return DOWNCAST(rend_data_v2_t, d); -} -/* Stub because we can't include hs_ident.h. */ -struct hs_ident_edge_conn_t; -struct hs_ident_dir_conn_t; -struct hs_ident_circuit_t; -/* Stub because we can't include hs_common.h. */ -struct hsdir_index_t; + /** Rendezvous cookie used by both, client and service. */ + char rend_cookie[REND_COOKIE_LEN]; +} rend_data_t; /** Time interval for tracking replays of DH public keys received in * INTRODUCE2 cells. Used only to avoid launching multiple @@ -919,7 +871,6 @@ typedef enum { #define CELL_RELAY_EARLY 9 #define CELL_CREATE2 10 #define CELL_CREATED2 11 -#define CELL_PADDING_NEGOTIATE 12 #define CELL_VPADDING 128 #define CELL_CERTS 129 @@ -965,18 +916,18 @@ typedef enum { #define VAR_CELL_MAX_HEADER_SIZE 7 static int get_cell_network_size(int wide_circ_ids); -static inline int get_cell_network_size(int wide_circ_ids) +static INLINE int get_cell_network_size(int wide_circ_ids) { return wide_circ_ids ? CELL_MAX_NETWORK_SIZE : CELL_MAX_NETWORK_SIZE - 2; } static int get_var_cell_header_size(int wide_circ_ids); -static inline int get_var_cell_header_size(int wide_circ_ids) +static INLINE int get_var_cell_header_size(int wide_circ_ids) { return wide_circ_ids ? VAR_CELL_MAX_HEADER_SIZE : VAR_CELL_MAX_HEADER_SIZE - 2; } static int get_circ_id_size(int wide_circ_ids); -static inline int get_circ_id_size(int wide_circ_ids) +static INLINE int get_circ_id_size(int wide_circ_ids) { return wide_circ_ids ? 4 : 2; } @@ -1166,34 +1117,54 @@ typedef struct packed_cell_t { /** Next cell queued on this circuit. */ TOR_SIMPLEQ_ENTRY(packed_cell_t) next; char body[CELL_MAX_NETWORK_SIZE]; /**< Cell as packed for network. */ - uint32_t inserted_timestamp; /**< Time (in timestamp units) when this cell - * was inserted */ + uint32_t inserted_time; /**< Time (in milliseconds since epoch, with high + * bits truncated) when this cell was inserted. */ } packed_cell_t; +/* XXXX This next structure may be obsoleted by inserted_time in + * packed_cell_t */ + +/** Number of cells added to a circuit queue including their insertion + * time on 10 millisecond detail; used for buffer statistics. */ +typedef struct insertion_time_elem_t { + struct insertion_time_elem_t *next; /**< Next element in queue. */ + uint32_t insertion_time; /**< When were cells inserted (in 10 ms steps + * starting at 0:00 of the current day)? */ + unsigned counter; /**< How many cells were inserted? */ +} insertion_time_elem_t; + +/** Queue of insertion times. */ +typedef struct insertion_time_queue_t { + struct insertion_time_elem_t *first; /**< First element in queue. */ + struct insertion_time_elem_t *last; /**< Last element in queue. */ +} insertion_time_queue_t; + +/** Number of cells with the same command consecutively added to a circuit + * queue; used for cell statistics only if CELL_STATS events are enabled. */ +typedef struct insertion_command_elem_t { + struct insertion_command_elem_t *next; /**< Next element in queue. */ + /** Which command did these consecutively added cells have? */ + uint8_t command; + unsigned counter; /**< How many cells were inserted? */ +} insertion_command_elem_t; + +/** Queue of insertion commands. */ +typedef struct insertion_command_queue_t { + struct insertion_command_elem_t *first; /**< First element in queue. */ + struct insertion_command_elem_t *last; /**< Last element in queue. */ +} insertion_command_queue_t; + /** A queue of cells on a circuit, waiting to be added to the * or_connection_t's outbuf. */ typedef struct cell_queue_t { /** Linked list of packed_cell_t*/ TOR_SIMPLEQ_HEAD(cell_simpleq, packed_cell_t) head; int n; /**< The number of cells in the queue. */ + insertion_time_queue_t *insertion_times; /**< Insertion times of cells. */ + /** Commands of inserted cells. */ + insertion_command_queue_t *insertion_commands; } cell_queue_t; -/** A single queued destroy cell. */ -typedef struct destroy_cell_t { - TOR_SIMPLEQ_ENTRY(destroy_cell_t) next; - circid_t circid; - uint32_t inserted_timestamp; /**< Time (in timestamp units) when this cell - * was inserted */ - uint8_t reason; -} destroy_cell_t; - -/** A queue of destroy cells on a channel. */ -typedef struct destroy_cell_queue_t { - /** Linked list of packed_cell_t */ - TOR_SIMPLEQ_HEAD(dcell_simpleq, destroy_cell_t) head; - int n; /**< The number of cells in the queue. */ -} destroy_cell_queue_t; - /** Beginning of a RELAY cell payload. */ typedef struct { uint8_t command; /**< The end-to-end relay command. */ @@ -1203,56 +1174,13 @@ typedef struct { uint16_t length; /**< How long is the payload body? */ } relay_header_t; +typedef struct buf_t buf_t; typedef struct socks_request_t socks_request_t; - -typedef struct entry_port_cfg_t { - /* Client port types (socks, dns, trans, natd) only: */ - uint8_t isolation_flags; /**< Zero or more isolation flags */ - int session_group; /**< A session group, or -1 if this port is not in a - * session group. */ - - /* Socks only: */ - /** When both no-auth and user/pass are advertised by a SOCKS client, select - * no-auth. */ - unsigned int socks_prefer_no_auth : 1; - /** When ISO_SOCKSAUTH is in use, Keep-Alive circuits indefinitely. */ - unsigned int socks_iso_keep_alive : 1; - - /* Client port types only: */ - unsigned int ipv4_traffic : 1; - unsigned int ipv6_traffic : 1; - unsigned int prefer_ipv6 : 1; - unsigned int dns_request : 1; - unsigned int onion_traffic : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; - -} entry_port_cfg_t; - -typedef struct server_port_cfg_t { - /* Server port types (or, dir) only: */ - unsigned int no_advertise : 1; - unsigned int no_listen : 1; - unsigned int all_addrs : 1; - unsigned int bind_ipv4_only : 1; - unsigned int bind_ipv6_only : 1; -} server_port_cfg_t; +#ifdef USE_BUFFEREVENTS +#define generic_buffer_t struct evbuffer +#else +#define generic_buffer_t buf_t +#endif /* Values for connection_t.magic: used to make sure that downcasts (casts from * connection_t to foo_connection_t) are safe. */ @@ -1264,8 +1192,6 @@ typedef struct server_port_cfg_t { #define CONTROL_CONNECTION_MAGIC 0x8abc765du #define LISTENER_CONNECTION_MAGIC 0x1a1ac741u -struct buf_t; - /** Description of a connection to another host or process, and associated * data. * @@ -1337,9 +1263,8 @@ typedef struct connection_t { struct event *read_event; /**< Libevent event structure. */ struct event *write_event; /**< Libevent event structure. */ - struct buf_t *inbuf; /**< Buffer holding data read over this connection. */ - struct buf_t *outbuf; /**< Buffer holding data to write over this - * connection. */ + buf_t *inbuf; /**< Buffer holding data read over this connection. */ + buf_t *outbuf; /**< Buffer holding data to write over this connection. */ size_t outbuf_flushlen; /**< How much data should we try to flush from the * outbuf? */ time_t timestamp_lastread; /**< When was the last time libevent said we could @@ -1347,28 +1272,27 @@ typedef struct connection_t { time_t timestamp_lastwritten; /**< When was the last time libevent said we * could write? */ +#ifdef USE_BUFFEREVENTS + struct bufferevent *bufev; /**< A Libevent buffered IO structure. */ +#endif + time_t timestamp_created; /**< When was this connection_t created? */ + /* XXXX_IP6 make this IPv6-capable */ int socket_family; /**< Address family of this connection's socket. Usually - * AF_INET, but it can also be AF_UNIX, or AF_INET6 */ - tor_addr_t addr; /**< IP that socket "s" is directly connected to; - * may be the IP address for a proxy or pluggable transport, - * see "address" for the address of the final destination. - */ - uint16_t port; /**< If non-zero, port that socket "s" is directly connected - * to; may be the port for a proxy or pluggable transport, - * see "address" for the port at the final destination. */ + * AF_INET, but it can also be AF_UNIX, or in the future + * AF_INET6 */ + tor_addr_t addr; /**< IP of the other side of the connection; used to + * identify routers, along with port. */ + uint16_t port; /**< If non-zero, port on the other end + * of the connection. */ uint16_t marked_for_close; /**< Should we close this conn on the next * iteration of the main loop? (If true, holds * the line number where this connection was * marked.) */ const char *marked_for_close_file; /**< For debugging: in which file were * we marked for close? */ - char *address; /**< FQDN (or IP) and port of the final destination for this - * connection; this is always the remote address, it is - * passed to a proxy or pluggable transport if one in use. - * See "addr" and "port" for the address that socket "s" is - * directly connected to. + char *address; /**< FQDN (or IP) of the guy on the other end. * strdup into this, because free_connection() frees it. */ /** Another connection that's connected to this one in lieu of a socket. */ struct connection_t *linked_conn; @@ -1393,7 +1317,52 @@ typedef struct listener_connection_t { * to the evdns_server_port it uses to listen to and answer connections. */ struct evdns_server_port *dns_server_port; - entry_port_cfg_t entry_cfg; + /** @name Isolation parameters + * + * For an AP listener, these fields describe how to isolate streams that + * arrive on the listener. + * + * @{ + */ + /** The session group for this listener. */ + int session_group; + /** One or more ISO_ flags to describe how to isolate streams. */ + uint8_t isolation_flags; + /**@}*/ + /** For SOCKS connections only: If this is set, we will choose "no + * authentication" instead of "username/password" authentication if both + * are offered. Used as input to parse_socks. */ + unsigned int socks_prefer_no_auth : 1; + + /** For a SOCKS listeners, these fields describe whether we should + * allow IPv4 and IPv6 addresses from our exit nodes, respectively. + * + * @{ + */ + unsigned int socks_ipv4_traffic : 1; + unsigned int socks_ipv6_traffic : 1; + /** @} */ + /** For a socks listener: should we tell the exit that we prefer IPv6 + * addresses? */ + unsigned int socks_prefer_ipv6 : 1; + + /** For a socks listener: should we cache IPv4/IPv6 DNS information that + * exit nodes tell us? + * + * @{ */ + unsigned int cache_ipv4_answers : 1; + unsigned int cache_ipv6_answers : 1; + /** @} */ + /** For a socks listeners: if we find an answer in our client-side DNS cache, + * should we use it? + * + * @{ */ + unsigned int use_cached_ipv4_answers : 1; + unsigned int use_cached_ipv6_answers : 1; + /** @} */ + /** For socks listeners: When we can automap an address to IPv4 or IPv6, + * do we prefer IPv6? */ + unsigned int prefer_ipv6_virtaddr : 1; } listener_connection_t; @@ -1418,34 +1387,15 @@ typedef struct listener_connection_t { * in the v3 handshake. The subject key must be a 1024-bit RSA key; it * must be signed by the identity key */ #define OR_CERT_TYPE_AUTH_1024 3 -/* DOCDOC */ -#define OR_CERT_TYPE_RSA_ED_CROSSCERT 7 /**@}*/ -/** The first supported type of AUTHENTICATE cell. It contains +/** The one currently supported type of AUTHENTICATE cell. It contains * a bunch of structures signed with an RSA1024 key. The signed * structures include a HMAC using negotiated TLS secrets, and a digest * of all cells sent or received before the AUTHENTICATE cell (including * the random server-generated AUTH_CHALLENGE cell). */ #define AUTHTYPE_RSA_SHA256_TLSSECRET 1 -/** As AUTHTYPE_RSA_SHA256_TLSSECRET, but instead of using the - * negotiated TLS secrets, uses exported keying material from the TLS - * session as described in RFC 5705. - * - * Not used by today's tors, since everything that supports this - * also supports ED25519_SHA256_5705, which is better. - **/ -#define AUTHTYPE_RSA_SHA256_RFC5705 2 -/** As AUTHTYPE_RSA_SHA256_RFC5705, but uses an Ed25519 identity key to - * authenticate. */ -#define AUTHTYPE_ED25519_SHA256_RFC5705 3 -/* - * NOTE: authchallenge_type_is_better() relies on these AUTHTYPE codes - * being sorted in order of preference. If we someday add one with - * a higher numerical value that we don't like as much, we should revise - * authchallenge_type_is_better(). - */ /** The length of the part of the AUTHENTICATE cell body that the client and * server can generate independently (when using RSA_SHA256_TLSSECRET). It @@ -1456,34 +1406,6 @@ typedef struct listener_connection_t { * signs. */ #define V3_AUTH_BODY_LEN (V3_AUTH_FIXED_PART_LEN + 8 + 16) -/** Structure to hold all the certificates we've received on an OR connection - */ -typedef struct or_handshake_certs_t { - /** True iff we originated this connection. */ - int started_here; - /** The cert for the 'auth' RSA key that's supposed to sign the AUTHENTICATE - * cell. Signed with the RSA identity key. */ - tor_x509_cert_t *auth_cert; - /** The cert for the 'link' RSA key that was used to negotiate the TLS - * connection. Signed with the RSA identity key. */ - tor_x509_cert_t *link_cert; - /** A self-signed identity certificate: the RSA identity key signed - * with itself. */ - tor_x509_cert_t *id_cert; - /** The Ed25519 signing key, signed with the Ed25519 identity key. */ - struct tor_cert_st *ed_id_sign; - /** A digest of the X509 link certificate for the TLS connection, signed - * with the Ed25519 siging key. */ - struct tor_cert_st *ed_sign_link; - /** The Ed25519 authentication key (that's supposed to sign an AUTHENTICATE - * cell) , signed with the Ed25519 siging key. */ - struct tor_cert_st *ed_sign_auth; - /** The Ed25519 identity key, crosssigned with the RSA identity key. */ - uint8_t *ed_rsa_crosscert; - /** The length of ed_rsa_crosscert in bytes */ - size_t ed_rsa_crosscert_len; -} or_handshake_certs_t; - /** Stores flags and information related to the portion of a v2/v3 Tor OR * connection handshake that happens after the TLS handshake is finished. */ @@ -1504,18 +1426,10 @@ typedef struct or_handshake_state_t { /* True iff we've received valid authentication to some identity. */ unsigned int authenticated : 1; - unsigned int authenticated_rsa : 1; - unsigned int authenticated_ed25519 : 1; /* True iff we have sent a netinfo cell */ unsigned int sent_netinfo : 1; - /** The signing->ed25519 link certificate corresponding to the x509 - * certificate we used on the TLS connection (if this is a server-side - * connection). We make a copy of this here to prevent a race condition - * caused by TLS context rotation. */ - struct tor_cert_st *own_link_cert; - /** True iff we should feed outgoing cells into digest_sent and * digest_received respectively. * @@ -1529,12 +1443,9 @@ typedef struct or_handshake_state_t { unsigned int digest_received_data : 1; /**@}*/ - /** Identity RSA digest that we have received and authenticated for our peer + /** Identity digest that we have received and authenticated for our peer * on this connection. */ - uint8_t authenticated_rsa_peer_id[DIGEST_LEN]; - /** Identity Ed25519 public key that we have received and authenticated for - * our peer on this connection. */ - ed25519_public_key_t authenticated_ed25519_peer_id; + uint8_t authenticated_peer_id[DIGEST_LEN]; /** Digests of the cells that we have sent or received as part of a V3 * handshake. Used for making and checking AUTHENTICATE cells. @@ -1547,24 +1458,18 @@ typedef struct or_handshake_state_t { /** Certificates that a connection initiator sent us in a CERTS cell; we're * holding on to them until we get an AUTHENTICATE cell. + * + * @{ */ - or_handshake_certs_t *certs; + /** The cert for the key that's supposed to sign the AUTHENTICATE cell */ + tor_cert_t *auth_cert; + /** A self-signed identity certificate */ + tor_cert_t *id_cert; + /**@}*/ } or_handshake_state_t; /** Length of Extended ORPort connection identifier. */ #define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */ -/* - * OR_CONN_HIGHWATER and OR_CONN_LOWWATER moved from connection_or.c so - * channeltls.c can see them too. - */ - -/** When adding cells to an OR connection's outbuf, keep adding until the - * outbuf is at least this long, or we run out of cells. */ -#define OR_CONN_HIGHWATER (32*1024) - -/** Add cells to an OR connection's outbuf whenever the outbuf's data length - * drops below this size. */ -#define OR_CONN_LOWWATER (16*1024) /** Subtype of connection_t for an "OR connection" -- that is, one that speaks * cells over TLS. */ @@ -1610,45 +1515,47 @@ typedef struct or_connection_t { * NETINFO cell listed the address we're connected to as recognized. */ unsigned int is_canonical:1; + /** True iff we have decided that the other end of this connection + * is a client. Connections with this flag set should never be used + * to satisfy an EXTEND request. */ + unsigned int is_connection_with_client:1; /** True iff this is an outgoing connection. */ unsigned int is_outgoing:1; unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ unsigned int wide_circ_ids:1; - /** True iff this connection has had its bootstrap failure logged with - * control_event_bootstrap_problem. */ - unsigned int have_noted_bootstrap_problem:1; - uint16_t link_proto; /**< What protocol version are we using? 0 for * "none negotiated yet." */ - uint16_t idle_timeout; /**< How long can this connection sit with no - * circuits on it before we close it? Based on - * IDLE_CIRCUIT_TIMEOUT_{NON,}CANONICAL and - * on is_canonical, randomized. */ + or_handshake_state_t *handshake_state; /**< If we are setting this connection * up, state information to do so. */ time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/ + time_t timestamp_last_added_nonpadding; /** When did we last add a + * non-padding cell to the outbuf? */ /* bandwidth* and *_bucket only used by ORs in OPEN state: */ int bandwidthrate; /**< Bytes/s added to the bucket. (OPEN ORs only.) */ int bandwidthburst; /**< Max bucket size for this conn. (OPEN ORs only.) */ +#ifndef USE_BUFFEREVENTS int read_bucket; /**< When this hits 0, stop receiving. Every second we * add 'bandwidthrate' to this, capping it at * bandwidthburst. (OPEN ORs only) */ int write_bucket; /**< When this hits 0, stop writing. Like read_bucket. */ +#else + /** A rate-limiting configuration object to determine how this connection + * set its read- and write- limits. */ + /* XXXX we could share this among all connections. */ + struct ev_token_bucket_cfg *bucket_cfg; +#endif + struct or_connection_t *next_with_same_id; /**< Next connection with same + * identity digest as this one. */ /** Last emptied read token bucket in msec since midnight; only used if * TB_EMPTY events are enabled. */ uint32_t read_emptied_time; /** Last emptied write token bucket in msec since midnight; only used if * TB_EMPTY events are enabled. */ uint32_t write_emptied_time; - - /* - * Count the number of bytes flushed out on this orconn, and the number of - * bytes TLS actually sent - used for overhead estimation for scheduling. - */ - uint64_t bytes_xmitted, bytes_xmitted_by_tls; } or_connection_t; /** Subtype of connection_t for an "edge connection" -- that is, an entry (ap) @@ -1672,11 +1579,6 @@ typedef struct edge_connection_t { * an exit)? */ rend_data_t *rend_data; - /* Hidden service connection identifier for edge connections. Used by the HS - * client-side code to identify client SOCKS connections and by the - * service-side code to match HS circuits with their streams. */ - struct hs_ident_edge_conn_t *hs_ident; - uint32_t address_ttl; /**< TTL for address-to-addr mapping on exit * connection. Exit connections only. */ uint32_t begincell_flags; /** Flags sent or received in the BEGIN cell @@ -1719,18 +1621,18 @@ typedef struct entry_connection_t { edge_connection_t edge_; /** Nickname of planned exit node -- used with .exit support. */ - /* XXX prop220: we need to make chosen_exit_name able to encode Ed IDs too. - * That's logically part of the UI parts for prop220 though. */ char *chosen_exit_name; socks_request_t *socks_request; /**< SOCKS structure describing request (AP * only.) */ /* === Isolation related, AP only. === */ - entry_port_cfg_t entry_cfg; + /** AP only: based on which factors do we isolate this stream? */ + uint8_t isolation_flags; + /** AP only: what session group is this stream in? */ + int session_group; /** AP only: The newnym epoch in which we created this connection. */ unsigned nym_epoch; - /** AP only: The original requested address before we rewrote it. */ char *original_dest_address; /* Other fields to isolate on already exist. The ClientAddr is addr. The @@ -1746,23 +1648,16 @@ typedef struct entry_connection_t { /** For AP connections only: buffer for data that we have sent * optimistically, which we might need to re-send if we have to * retry this connection. */ - struct buf_t *pending_optimistic_data; + generic_buffer_t *pending_optimistic_data; /* For AP connections only: buffer for data that we previously sent * optimistically which we are currently re-sending as we retry this * connection. */ - struct buf_t *sending_optimistic_data; + generic_buffer_t *sending_optimistic_data; /** If this is a DNSPort connection, this field holds the pending DNS * request that we're going to try to answer. */ struct evdns_server_request *dns_server_request; -#define DEBUGGING_17659 - -#ifdef DEBUGGING_17659 - uint16_t marked_pending_circ_line; - const char *marked_pending_circ_file; -#endif - #define NUM_CIRCUITS_LAUNCHED_THRESHOLD 10 /** Number of times we've launched a circuit to handle this stream. If * it gets too high, that could indicate an inconsistency between our @@ -1796,10 +1691,42 @@ typedef struct entry_connection_t { */ unsigned int may_use_optimistic_data : 1; - /** Are we a socks SocksSocket listener? */ - unsigned int is_socks_socket:1; + /** Should we permit IPv4 and IPv6 traffic to use this connection? + * + * @{ */ + unsigned int ipv4_traffic_ok : 1; + unsigned int ipv6_traffic_ok : 1; + /** @} */ + /** Should we say we prefer IPv6 traffic? */ + unsigned int prefer_ipv6_traffic : 1; + + /** For a socks listener: should we cache IPv4/IPv6 DNS information that + * exit nodes tell us? + * + * @{ */ + unsigned int cache_ipv4_answers : 1; + unsigned int cache_ipv6_answers : 1; + /** @} */ + /** For a socks listeners: if we find an answer in our client-side DNS cache, + * should we use it? + * + * @{ */ + unsigned int use_cached_ipv4_answers : 1; + unsigned int use_cached_ipv6_answers : 1; + /** @} */ + /** For socks listeners: When we can automap an address to IPv4 or IPv6, + * do we prefer IPv6? */ + unsigned int prefer_ipv6_virtaddr : 1; + } entry_connection_t; +typedef enum { + DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP, + DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, + DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS, + DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */ +} dir_spool_source_t; + /** Subtype of connection_t for an "directory connection" -- that is, an HTTP * connection to retrieve or serve directory material. */ typedef struct dir_connection_t { @@ -1808,34 +1735,33 @@ typedef struct dir_connection_t { /** Which 'resource' did we ask the directory for? This is typically the part * of the URL string that defines, relative to the directory conn purpose, * what thing we want. For example, in router descriptor downloads by - * descriptor digest, it contains "d/", then one or more +-separated + * descriptor digest, it contains "d/", then one ore more +-separated * fingerprints. **/ char *requested_resource; unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */ + /* Used only for server sides of some dir connections, to implement + * "spooling" of directory material to the outbuf. Otherwise, we'd have + * to append everything to the outbuf in one enormous chunk. */ + /** What exactly are we spooling right now? */ + ENUM_BF(dir_spool_source_t) dir_spool_src : 3; + /** If we're fetching descriptors, what router purpose shall we assign * to them? */ uint8_t router_purpose; - - /** List of spooled_resource_t for objects that we're spooling. We use - * it from back to front. */ - smartlist_t *spool; - /** The compression object doing on-the-fly compression for spooled data. */ - tor_compress_state_t *compress_state; + /** List of fingerprints for networkstatuses or descriptors to be spooled. */ + smartlist_t *fingerprint_stack; + /** A cached_dir_t object that we're currently spooling out */ + struct cached_dir_t *cached_dir; + /** The current offset into cached_dir. */ + off_t cached_dir_offset; + /** The zlib object doing on-the-fly compression for spooled data. */ + tor_zlib_state_t *zlib_state; /** What rendezvous service are we querying for? */ rend_data_t *rend_data; - /* Hidden service connection identifier for dir connections: Used by HS - client-side code to fetch HS descriptors, and by the service-side code to - upload descriptors. */ - struct hs_ident_dir_conn_t *hs_ident; - - /** If this is a one-hop connection, tracks the state of the directory guard - * for this connection (if any). */ - struct circuit_guard_state_t *guard_state; - char identity_digest[DIGEST_LEN]; /**< Hash of the public RSA key for * the directory server's signing key. */ @@ -1843,23 +1769,14 @@ typedef struct dir_connection_t { * that's going away and being used on channels instead. The dirserver still * needs this for the incoming side, so it's moved here. */ uint64_t dirreq_id; - -#ifdef MEASUREMENTS_21206 - /** Number of RELAY_DATA cells received. */ - uint32_t data_cells_received; - - /** Number of RELAY_DATA cells sent. */ - uint32_t data_cells_sent; -#endif /* defined(MEASUREMENTS_21206) */ } dir_connection_t; /** Subtype of connection_t for an connection to a controller. */ typedef struct control_connection_t { connection_t base_; - uint64_t event_mask; /**< Bitfield: which events does this controller - * care about? - * EVENT_MAX_ is >31, so we need a 64 bit mask */ + uint32_t event_mask; /**< Bitfield: which events does this controller + * care about? */ /** True if we have sent a protocolinfo reply on this connection. */ unsigned int have_sent_protocolinfo:1; @@ -1867,9 +1784,6 @@ typedef struct control_connection_t { * connection. */ unsigned int is_owning_control_connection:1; - /** List of ephemeral onion services belonging to this connection. */ - smartlist_t *ephemeral_onion_services; - /** If we have sent an AUTHCHALLENGE reply on this connection and * have not received a successful AUTHENTICATE command, points to * the value which the client must send to authenticate itself; @@ -1887,6 +1801,8 @@ typedef struct control_connection_t { /** Cast a connection_t subtype pointer to a connection_t **/ #define TO_CONN(c) (&(((c)->base_))) +/** Helper macro: Given a pointer to to.base_, of type from*, return &to. */ +#define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, base_)) /** Cast a entry_connection_t subtype pointer to a edge_connection_t **/ #define ENTRY_TO_EDGE_CONN(c) (&(((c))->edge_)) @@ -1915,55 +1831,99 @@ static control_connection_t *TO_CONTROL_CONN(connection_t *); * invalid. */ static listener_connection_t *TO_LISTENER_CONN(connection_t *); -static inline or_connection_t *TO_OR_CONN(connection_t *c) +static INLINE or_connection_t *TO_OR_CONN(connection_t *c) { tor_assert(c->magic == OR_CONNECTION_MAGIC); return DOWNCAST(or_connection_t, c); } -static inline dir_connection_t *TO_DIR_CONN(connection_t *c) +static INLINE dir_connection_t *TO_DIR_CONN(connection_t *c) { tor_assert(c->magic == DIR_CONNECTION_MAGIC); return DOWNCAST(dir_connection_t, c); } -static inline edge_connection_t *TO_EDGE_CONN(connection_t *c) +static INLINE edge_connection_t *TO_EDGE_CONN(connection_t *c) { tor_assert(c->magic == EDGE_CONNECTION_MAGIC || c->magic == ENTRY_CONNECTION_MAGIC); return DOWNCAST(edge_connection_t, c); } -static inline entry_connection_t *TO_ENTRY_CONN(connection_t *c) +static INLINE entry_connection_t *TO_ENTRY_CONN(connection_t *c) { tor_assert(c->magic == ENTRY_CONNECTION_MAGIC); return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_.base_); } -static inline entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *c) +static INLINE entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *c) { tor_assert(c->base_.magic == ENTRY_CONNECTION_MAGIC); return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_); } -static inline control_connection_t *TO_CONTROL_CONN(connection_t *c) +static INLINE control_connection_t *TO_CONTROL_CONN(connection_t *c) { tor_assert(c->magic == CONTROL_CONNECTION_MAGIC); return DOWNCAST(control_connection_t, c); } -static inline listener_connection_t *TO_LISTENER_CONN(connection_t *c) +static INLINE listener_connection_t *TO_LISTENER_CONN(connection_t *c) { tor_assert(c->magic == LISTENER_CONNECTION_MAGIC); return DOWNCAST(listener_connection_t, c); } +/* Conditional macros to help write code that works whether bufferevents are + disabled or not. + + We can't just write: + if (conn->bufev) { + do bufferevent stuff; + } else { + do other stuff; + } + because the bufferevent stuff won't even compile unless we have a fairly + new version of Libevent. Instead, we say: + IF_HAS_BUFFEREVENT(conn, { do_bufferevent_stuff } ); + or: + IF_HAS_BUFFEREVENT(conn, { + do bufferevent stuff; + }) ELSE_IF_NO_BUFFEREVENT { + do non-bufferevent stuff; + } + If we're compiling with bufferevent support, then the macros expand more or + less to: + if (conn->bufev) { + do_bufferevent_stuff; + } else { + do non-bufferevent stuff; + } + and if we aren't using bufferevents, they expand more or less to: + { do non-bufferevent stuff; } +*/ +#ifdef USE_BUFFEREVENTS +#define HAS_BUFFEREVENT(c) (((c)->bufev) != NULL) +#define IF_HAS_BUFFEREVENT(c, stmt) \ + if ((c)->bufev) do { \ + stmt ; \ + } while (0) +#define ELSE_IF_NO_BUFFEREVENT ; else +#define IF_HAS_NO_BUFFEREVENT(c) \ + if (NULL == (c)->bufev) +#else +#define HAS_BUFFEREVENT(c) (0) +#define IF_HAS_BUFFEREVENT(c, stmt) (void)0 +#define ELSE_IF_NO_BUFFEREVENT ; +#define IF_HAS_NO_BUFFEREVENT(c) \ + if (1) +#endif + /** What action type does an address policy indicate: accept or reject? */ typedef enum { ADDR_POLICY_ACCEPT=1, ADDR_POLICY_REJECT=2, } addr_policy_action_t; -#define addr_policy_action_bitfield_t ENUM_BF(addr_policy_action_t) /** A reference-counted address policy rule. */ typedef struct addr_policy_t { int refcnt; /**< Reference count */ /** What to do when the policy matches.*/ - addr_policy_action_bitfield_t policy_type:2; + ENUM_BF(addr_policy_action_t) policy_type:2; unsigned int is_private:1; /**< True iff this is the pseudo-address, * "private". */ unsigned int is_canonical:1; /**< True iff this policy is the canonical @@ -1989,13 +1949,11 @@ typedef struct addr_policy_t { * compressed form. */ typedef struct cached_dir_t { char *dir; /**< Contents of this object, NUL-terminated. */ - char *dir_compressed; /**< Compressed contents of this object. */ + char *dir_z; /**< Compressed contents of this object. */ size_t dir_len; /**< Length of dir (not counting its NUL). */ - size_t dir_compressed_len; /**< Length of dir_compressed. */ + size_t dir_z_len; /**< Length of dir_z. */ time_t published; /**< When was this object published. */ - common_digests_t digests; /**< Digests of this object (networkstatus only) */ - /** Sha3 digest (also ns only) */ - uint8_t digest_sha3_as_signed[DIGEST256_LEN]; + digests_t digests; /**< Digests of this object (networkstatus only) */ int refcnt; /**< Reference count for this cached_dir_t. */ } cached_dir_t; @@ -2017,105 +1975,23 @@ typedef enum { */ SAVED_IN_JOURNAL } saved_location_t; -#define saved_location_bitfield_t ENUM_BF(saved_location_t) -/** Enumeration: what directory object is being downloaded? - * This determines which schedule is selected to perform the download. */ +/** Enumeration: what kind of download schedule are we using for a given + * object? */ typedef enum { DL_SCHED_GENERIC = 0, DL_SCHED_CONSENSUS = 1, DL_SCHED_BRIDGE = 2, } download_schedule_t; -#define download_schedule_bitfield_t ENUM_BF(download_schedule_t) - -/** Enumeration: is the download schedule for downloading from an authority, - * or from any available directory mirror? - * During bootstrap, "any" means a fallback (or an authority, if there - * are no fallbacks). - * When we have a valid consensus, "any" means any directory server. */ -typedef enum { - DL_WANT_ANY_DIRSERVER = 0, - DL_WANT_AUTHORITY = 1, -} download_want_authority_t; -#define download_want_authority_bitfield_t \ - ENUM_BF(download_want_authority_t) - -/** Enumeration: do we want to increment the schedule position each time a - * connection is attempted (these attempts can be concurrent), or do we want - * to increment the schedule position after a connection fails? */ -typedef enum { - DL_SCHED_INCREMENT_FAILURE = 0, - DL_SCHED_INCREMENT_ATTEMPT = 1, -} download_schedule_increment_t; -#define download_schedule_increment_bitfield_t \ - ENUM_BF(download_schedule_increment_t) - -/** Enumeration: do we want to use the random exponential backoff - * mechanism? */ -typedef enum { - DL_SCHED_DETERMINISTIC = 0, - DL_SCHED_RANDOM_EXPONENTIAL = 1, -} download_schedule_backoff_t; -#define download_schedule_backoff_bitfield_t \ - ENUM_BF(download_schedule_backoff_t) /** Information about our plans for retrying downloads for a downloadable - * directory object. - * Each type of downloadable directory object has a corresponding retry - * schedule, which can be different depending on whether the object is - * being downloaded from an authority or a mirror (want_authority). - * next_attempt_at contains the next time we will attempt to download - * the object. - * For schedules that increment_on failure, n_download_failures - * is used to determine the position in the schedule. (Each schedule is a - * smartlist of integer delays, parsed from a CSV option.) Every time a - * connection attempt fails, n_download_failures is incremented, - * the new delay value is looked up from the schedule, and - * next_attempt_at is set delay seconds from the time the previous - * connection failed. Therefore, at most one failure-based connection can be - * in progress for each download_status_t. - * For schedules that increment_on attempt, n_download_attempts - * is used to determine the position in the schedule. Every time a - * connection attempt is made, n_download_attempts is incremented, - * the new delay value is looked up from the schedule, and - * next_attempt_at is set delay seconds from the time the previous - * connection was attempted. Therefore, multiple concurrent attempted-based - * connections can be in progress for each download_status_t. - * After an object is successfully downloaded, any other concurrent connections - * are terminated. A new schedule which starts at position 0 is used for - * subsequent downloads of the same object. - */ + * object. */ typedef struct download_status_t { - time_t next_attempt_at; /**< When should we try downloading this object + time_t next_attempt_at; /**< When should we try downloading this descriptor * again? */ - uint8_t n_download_failures; /**< Number of failed downloads of the most - * recent object, since the last success. */ - uint8_t n_download_attempts; /**< Number of (potentially concurrent) attempts - * to download the most recent object, since - * the last success. */ - download_schedule_bitfield_t schedule : 8; /**< What kind of object is being - * downloaded? This determines the - * schedule used for the download. - */ - download_want_authority_bitfield_t want_authority : 1; /**< Is the download - * happening from an authority - * or a mirror? This determines - * the schedule used for the - * download. */ - download_schedule_increment_bitfield_t increment_on : 1; /**< does this - * schedule increment on each attempt, - * or after each failure? */ - download_schedule_backoff_bitfield_t backoff : 1; /**< do we use the - * deterministic schedule, or random - * exponential backoffs? - * Increment on failure schedules - * always use exponential backoff. */ - uint8_t last_backoff_position; /**< number of attempts/failures, depending - * on increment_on, when we last recalculated - * the delay. Only updated if backoff - * == 1. */ - int last_delay_used; /**< last delay used for random exponential backoff; - * only updated if backoff == 1 */ + uint8_t n_download_failures; /**< Number of failures trying to download the + * most recent descriptor. */ + ENUM_BF(download_schedule_t) schedule : 8; } download_status_t; /** If n_download_failures is this high, the download can never happen. */ @@ -2145,10 +2021,6 @@ typedef struct signed_descriptor_t { time_t published_on; /** For routerdescs only: digest of the corresponding extrainfo. */ char extra_info_digest[DIGEST_LEN]; - /** For routerdescs only: A SHA256-digest of the extrainfo (if any) */ - char extra_info_digest256[DIGEST256_LEN]; - /** Certificate for ed25519 signing key. */ - struct tor_cert_st *signing_key_cert; /** For routerdescs only: Status of downloading the corresponding * extrainfo. */ download_status_t ei_dl_status; @@ -2180,6 +2052,7 @@ typedef int16_t country_t; /** Information about another onion router in the network. */ typedef struct { signed_descriptor_t cache_info; + char *address; /**< Location of OR: either a hostname or an IP address. */ char *nickname; /**< Human-readable OR name. */ uint32_t addr; /**< IPv4 address of OR, in host order. */ @@ -2197,15 +2070,9 @@ typedef struct { crypto_pk_t *identity_pkey; /**< Public RSA key for signing. */ /** Public curve25519 key for onions */ curve25519_public_key_t *onion_curve25519_pkey; - /** What's the earliest expiration time on all the certs in this - * routerinfo? */ - time_t cert_expiration_time; char *platform; /**< What software/operating system is this OR using? */ - char *protocol_list; /**< Encoded list of subprotocol versions supported - * by this OR */ - /* link info */ uint32_t bandwidthrate; /**< How many bytes does this OR add to its token * bucket per second? */ @@ -2236,32 +2103,23 @@ typedef struct { * tests for it. */ unsigned int needs_retest_if_added:1; - /** True iff this router included "tunnelled-dir-server" in its descriptor, - * implying it accepts tunnelled directory requests, or it advertised - * dir_port > 0. */ - unsigned int supports_tunnelled_dir_requests:1; - - /** Used during voting to indicate that we should not include an entry for - * this routerinfo. Used only during voting. */ - unsigned int omit_from_vote:1; - /** Tor can use this router for general positions in circuits; we got it * from a directory server as usual, or we're an authority and a server * uploaded it. */ #define ROUTER_PURPOSE_GENERAL 0 /** Tor should avoid using this router for circuit-building: we got it - * from a controller. If the controller wants to use it, it'll have to + * from a crontroller. If the controller wants to use it, it'll have to * ask for it by identity. */ #define ROUTER_PURPOSE_CONTROLLER 1 /** Tor should use this router only for bridge positions in circuits: we got * it via a directory request from the bridge itself, or a bridge - * authority. */ + * authority. x*/ #define ROUTER_PURPOSE_BRIDGE 2 /** Tor should not use this router; it was marked in cached-descriptors with * a purpose we didn't recognize. */ #define ROUTER_PURPOSE_UNKNOWN 255 - /** In what way did we find out about this router? One of ROUTER_PURPOSE_*. + /* In what way did we find out about this router? One of ROUTER_PURPOSE_*. * Routers of different purposes are kept segregated and used for different * things; see notes on ROUTER_PURPOSE_* macros above. */ @@ -2271,8 +2129,6 @@ typedef struct { /** Information needed to keep and cache a signed extra-info document. */ typedef struct extrainfo_t { signed_descriptor_t cache_info; - /** SHA256 digest of this document */ - uint8_t digest256[DIGEST256_LEN]; /** The router's nickname. */ char nickname[MAX_NICKNAME_LEN+1]; /** True iff we found the right key for this extra-info, verified the @@ -2296,7 +2152,7 @@ typedef struct routerstatus_t { /** Digest of the router's most recent descriptor or microdescriptor. * If it's a descriptor, we only use the first DIGEST_LEN bytes. */ char descriptor_digest[DIGEST256_LEN]; - uint32_t addr; /**< IPv4 address for this router, in host order. */ + uint32_t addr; /**< IPv4 address for this router. */ uint16_t or_port; /**< OR port for this router. */ uint16_t dir_port; /**< Directory port for this router. */ tor_addr_t ipv6_addr; /**< IPv6 address for this router. */ @@ -2318,41 +2174,24 @@ typedef struct routerstatus_t { * choice as an entry guard. */ unsigned int is_bad_exit:1; /**< True iff this node is a bad choice for * an exit node. */ + unsigned int is_bad_directory:1; /**< Do we think this directory is junky, + * underpowered, or otherwise useless? */ unsigned int is_hs_dir:1; /**< True iff this router is a v2-or-later hidden * service directory. */ - unsigned int is_v2_dir:1; /** True iff this router publishes an open DirPort - * or it claims to accept tunnelled dir requests. - */ - /** True iff we have a proto line for this router, or a versions line - * from which we could infer the protocols. */ - unsigned int protocols_known:1; - - /** True iff this router has a version or protocol list that allows it to - * accept EXTEND2 cells */ - unsigned int supports_extend2_cells:1; - - /** True iff this router has a protocol list that allows it to negotiate - * ed25519 identity keys on a link handshake with us. */ - unsigned int supports_ed25519_link_handshake_compat:1; - - /** True iff this router has a protocol list that allows it to negotiate - * ed25519 identity keys on a link handshake, at all. */ - unsigned int supports_ed25519_link_handshake_any:1; - - /** True iff this router has a protocol list that allows it to be an - * introduction point supporting ed25519 authentication key which is part of - * the v3 protocol detailed in proposal 224. This requires HSIntro=4. */ - unsigned int supports_ed25519_hs_intro : 1; - - /** True iff this router has a protocol list that allows it to be an hidden - * service directory supporting version 3 as seen in proposal 224. This - * requires HSDir=2. */ - unsigned int supports_v3_hsdir : 1; - - /** True iff this router has a protocol list that allows it to be an hidden - * service rendezvous point supporting version 3 as seen in proposal 224. - * This requires HSRend=2. */ - unsigned int supports_v3_rendezvous_point: 1; + /** True iff we know version info for this router. (i.e., a "v" entry was + * included.) We'll replace all these with a big tor_version_t or a char[] + * if the number of traits we care about ever becomes incredibly big. */ + unsigned int version_known:1; + + /** True iff this router is a version that, if it caches directory info, + * we can get microdescriptors from. */ + unsigned int version_supports_microdesc_cache:1; + /** True iff this router is a version that allows DATA cells to arrive on + * a stream before it has sent a CONNECTED cell. */ + unsigned int version_supports_optimistic_data:1; + /** True iff this router has a version that allows it to accept EXTEND2 + * cells */ + unsigned int version_supports_extend2_cells:1; unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */ unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */ @@ -2361,12 +2200,6 @@ typedef struct routerstatus_t { uint32_t bandwidth_kb; /**< Bandwidth (capacity) of the router as reported in * the vote/consensus, in kilobytes/sec. */ - - /** The consensus has guardfraction information for this router. */ - unsigned int has_guardfraction:1; - /** The guardfraction value of this router. */ - uint32_t guardfraction_percentage; - char *exitsummary; /**< exit policy summary - * XXX weasel: this probably should not stay a string. */ @@ -2414,7 +2247,7 @@ typedef struct microdesc_t { */ time_t last_listed; /** Where is this microdescriptor currently stored? */ - saved_location_bitfield_t saved_location : 3; + ENUM_BF(saved_location_t) saved_location : 3; /** If true, do not attempt to cache this microdescriptor on disk. */ unsigned int no_save : 1; /** If true, this microdesc has an entry in the microdesc_map */ @@ -2444,9 +2277,7 @@ typedef struct microdesc_t { crypto_pk_t *onion_pkey; /** As routerinfo_t.onion_curve25519_pkey */ curve25519_public_key_t *onion_curve25519_pkey; - /** Ed25519 identity key, if included. */ - ed25519_public_key_t *ed25519_identity_pkey; - /** As routerinfo_t.ipv6_addr */ + /** As routerinfo_t.ipv6_add */ tor_addr_t ipv6_addr; /** As routerinfo_t.ipv6_orport */ uint16_t ipv6_orport; @@ -2464,7 +2295,7 @@ typedef struct microdesc_t { * Specifically, a node_t is a Tor router as we are using it: a router that * we are considering for circuits, connections, and so on. A node_t is a * thin wrapper around the routerstatus, routerinfo, and microdesc for a - * single router, and provides a consistent interface for all of them. + * single wrapper, and provides a consistent interface for all of them. * * Also, a node_t has mutable state. While a routerinfo, a routerstatus, * and a microdesc have[*] only the information read from a router @@ -2479,8 +2310,6 @@ typedef struct node_t { /** Used to look up the node_t by its identity digest. */ HT_ENTRY(node_t) ht_ent; - /** Used to look up the node_t by its ed25519 identity digest. */ - HT_ENTRY(node_t) ed_ht_ent; /** Position of the node within the list of nodes */ int nodelist_idx; @@ -2488,13 +2317,6 @@ typedef struct node_t { * identity may exist at a time. */ char identity[DIGEST_LEN]; - /** The ed25519 identity of this node_t. This field is nonzero iff we - * currently have an ed25519 identity for this node in either md or ri, - * _and_ this node has been inserted to the ed25519-to-node map in the - * nodelist. - */ - ed25519_public_key_t ed25519_id; - microdesc_t *md; routerinfo_t *ri; routerstatus_t *rs; @@ -2513,6 +2335,8 @@ typedef struct node_t { unsigned int is_exit:1; /**< Do we think this is an OK exit? */ unsigned int is_bad_exit:1; /**< Do we think this exit is censored, borked, * or otherwise nasty? */ + unsigned int is_bad_directory:1; /**< Do we think this directory is junky, + * underpowered, or otherwise useless? */ unsigned int is_hs_dir:1; /**< True iff this router is a hidden service * directory according to the authorities. */ @@ -2525,10 +2349,12 @@ typedef struct node_t { /** Local info: we treat this node as if it rejects everything */ unsigned int rejects_all:1; + /** Local info: this node is in our list of guards */ + unsigned int using_as_guard:1; + /* Local info: derived. */ - /** True if the IPv6 OR port is preferred over the IPv4 OR port. - * XX/teor - can this become out of date if the torrc changes? */ + /** True if the IPv6 OR port is preferred over the IPv4 OR port. */ unsigned int ipv6_preferred:1; /** According to the geoip db what country is this router in? */ @@ -2542,10 +2368,6 @@ typedef struct node_t { time_t last_reachable; /* IPv4. */ time_t last_reachable6; /* IPv6. */ - /* Hidden service directory index data. This is used by a service or client - * in order to know what's the hs directory index for this node at the time - * the consensus is set. */ - struct hsdir_index_t *hsdir_index; } node_t; /** Linked list of microdesc hash lines for a single router in a directory @@ -2570,21 +2392,10 @@ typedef struct vote_routerstatus_t { * networkstatus_t.known_flags. */ char *version; /**< The version that the authority says this router is * running. */ - char *protocols; /**< The protocols that this authority says this router - * provides. */ unsigned int has_measured_bw:1; /**< The vote had a measured bw */ - /** True iff the vote included an entry for ed25519 ID, or included - * "id ed25519 none" to indicate that there was no ed25519 ID. */ - unsigned int has_ed25519_listing:1; - /** True if the Ed25519 listing here is the consensus-opinion for the - * Ed25519 listing; false if there was no consensus on Ed25519 key status, - * or if this VRS doesn't reflect it. */ - unsigned int ed25519_reflects_consensus:1; uint32_t measured_bw_kb; /**< Measured bandwidth (capacity) of the router */ /** The hash or hashes that the authority claims this microdesc has. */ vote_microdesc_hash_t *microdesc; - /** Ed25519 identity for this router, or zero if it has none. */ - uint8_t ed25519_id[ED25519_PUBKEY_LEN]; } vote_routerstatus_t; /** A signature of some document by an authority. */ @@ -2625,18 +2436,6 @@ typedef struct networkstatus_voter_info_t { smartlist_t *sigs; } networkstatus_voter_info_t; -typedef struct networkstatus_sr_info_t { - /* Indicate if the dirauth partitipates in the SR protocol with its vote. - * This is tied to the SR flag in the vote. */ - unsigned int participate:1; - /* Both vote and consensus: Current and previous SRV. If list is empty, - * this means none were found in either the consensus or vote. */ - struct sr_srv_t *previous_srv; - struct sr_srv_t *current_srv; - /* Vote only: List of commitments. */ - smartlist_t *commits; -} networkstatus_sr_info_t; - /** Enumerates the possible seriousness values of a networkstatus document. */ typedef enum { NS_TYPE_VOTE, @@ -2658,8 +2457,8 @@ typedef enum { /** A common structure to hold a v3 network status vote, or a v3 network * status consensus. */ typedef struct networkstatus_t { - networkstatus_type_t type; /**< Vote, consensus, or opinion? */ - consensus_flavor_t flavor; /**< If a consensus, what kind? */ + ENUM_BF(networkstatus_type_t) type : 8; /**< Vote, consensus, or opinion? */ + ENUM_BF(consensus_flavor_t) flavor : 8; /**< If a consensus, what kind? */ unsigned int has_measured_bws : 1;/**< True iff this networkstatus contains * measured= bandwidth values. */ @@ -2675,9 +2474,6 @@ typedef struct networkstatus_t { /** Vote only: what methods is this voter willing to use? */ smartlist_t *supported_methods; - /** List of 'package' lines describing hashes of downloadable packages */ - smartlist_t *package_lines; - /** How long does this vote/consensus claim that authorities take to * distribute their votes to one another? */ int vote_seconds; @@ -2689,16 +2485,6 @@ typedef struct networkstatus_t { * voter has no opinion. */ char *client_versions; char *server_versions; - - /** Lists of subprotocol versions which are _recommended_ for relays and - * clients, or which are _require_ for relays and clients. Tor shouldn't - * make any more network connections if a required protocol is missing. - */ - char *recommended_relay_protocols; - char *recommended_client_protocols; - char *required_relay_protocols; - char *required_client_protocols; - /** List of flags that this vote/consensus applies to routers. If a flag is * not listed here, the voter has no opinion on what its value should be. */ smartlist_t *known_flags; @@ -2719,10 +2505,7 @@ typedef struct networkstatus_t { struct authority_cert_t *cert; /**< Vote only: the voter's certificate. */ /** Digests of this document, as signed. */ - common_digests_t digests; - /** A SHA3-256 digest of the document, not including signatures: used for - * consensus diffs */ - uint8_t digest_sha3_as_signed[DIGEST256_LEN]; + digests_t digests; /** List of router statuses, sorted by identity digest. For a vote, * the elements are vote_routerstatus_t; for a consensus, the elements @@ -2732,9 +2515,6 @@ typedef struct networkstatus_t { /** If present, a map from descriptor digest to elements of * routerstatus_list. */ digestmap_t *desc_digest_map; - - /** Contains the shared random protocol data from a vote or consensus. */ - networkstatus_sr_info_t sr_info; } networkstatus_t; /** A set of signatures for a networkstatus consensus. Unless otherwise @@ -2811,14 +2591,13 @@ typedef struct { typedef struct extend_info_t { char nickname[MAX_HEX_NICKNAME_LEN+1]; /**< This router's nickname for * display. */ - /** Hash of this router's RSA identity key. */ - char identity_digest[DIGEST_LEN]; - /** Ed25519 identity for this router, if any. */ - ed25519_public_key_t ed_identity; + char identity_digest[DIGEST_LEN]; /**< Hash of this router's identity key. */ uint16_t port; /**< OR port. */ tor_addr_t addr; /**< IP address. */ crypto_pk_t *onion_key; /**< Current onionskin key. */ +#ifdef CURVE25519_ENABLED curve25519_public_key_t curve25519_onion_key; +#endif } extend_info_t; /** Certificate for v3 directory protocol: binds long-term authority identity @@ -2851,8 +2630,13 @@ typedef struct authority_cert_t { */ typedef enum { NO_DIRINFO = 0, + /** Serves/signs v1 directory information: Big lists of routers, and short + * routerstatus documents. */ + V1_DIRINFO = 1 << 0, /** Serves/signs v3 directory information: votes, consensuses, certs */ V3_DIRINFO = 1 << 2, + /** Serves hidden service descriptors. */ + HIDSERV_DIRINFO = 1 << 3, /** Serves bridge descriptors. */ BRIDGE_DIRINFO = 1 << 4, /** Serves extrainfo documents. */ @@ -2975,14 +2759,8 @@ typedef struct { time_t expiry_time; } cpath_build_state_t; -/** "magic" value for an origin_circuit_t */ #define ORIGIN_CIRCUIT_MAGIC 0x35315243u -/** "magic" value for an or_circuit_t */ #define OR_CIRCUIT_MAGIC 0x98ABC04Fu -/** "magic" value for a circuit that would have been freed by circuit_free, - * but which we're keeping around until a cpuworker reply arrives. See - * circuit_free() for more documentation. */ -#define DEAD_CIRCUIT_MAGIC 0xdeadc14c struct create_cell_t; @@ -3083,9 +2861,6 @@ typedef struct circuit_t { * more. */ int deliver_window; - /** Temporary field used during circuits_handle_oom. */ - uint32_t age_tmp; - /** For storage while n_chan is pending (state CIRCUIT_STATE_CHAN_WAIT). */ struct create_cell_t *n_chan_create_cell; @@ -3106,20 +2881,15 @@ typedef struct circuit_t { /** When the circuit was first used, or 0 if the circuit is clean. * - * XXXX Note that some code will artifically adjust this value backward + * XXXX023 Note that some code will artifically adjust this value backward * in time in order to indicate that a circuit shouldn't be used for new * streams, but that it can stay alive as long as it has streams on it. * That's a kludge we should fix. * - * XXX The CBT code uses this field to record when HS-related + * XXX023 The CBT code uses this field to record when HS-related * circuits entered certain states. This usage probably won't * interfere with this field's primary purpose, but we should * document it more thoroughly to make sure of that. - * - * XXX The SocksPort option KeepaliveIsolateSOCKSAuth will artificially - * adjust this value forward each time a suitable stream is attached to an - * already constructed circuit, potentially keeping the circuit alive - * indefinitely. */ time_t timestamp_dirty; @@ -3128,20 +2898,12 @@ typedef struct circuit_t { * where this circuit was marked.) */ const char *marked_for_close_file; /**< For debugging: in which file was this * circuit marked for close? */ - /** For what reason (See END_CIRC_REASON...) is this circuit being closed? - * This field is set in circuit_mark_for_close and used later in - * circuit_about_to_free. */ - int marked_for_close_reason; - /** As marked_for_close_reason, but reflects the underlying reason for - * closing this circuit. - */ - int marked_for_close_orig_reason; /** Unique ID for measuring tunneled network status requests. */ uint64_t dirreq_id; - /** Index in smartlist of all circuits (global_circuitlist). */ - int global_circuitlist_idx; + /** Next circuit in linked list of all circuits (global_circuitlist). */ + TOR_LIST_ENTRY(circuit_t) head; /** Next circuit in the doubly-linked ring of circuits waiting to add * cells to n_conn. NULL if we have no cells pending, or if we're not @@ -3156,13 +2918,6 @@ typedef struct circuit_t { * circuit's queues; used only if CELL_STATS events are enabled and * cleared after being sent to control port. */ smartlist_t *testing_cell_stats; - - /** If set, points to an HS token that this circuit might be carrying. - * Used by the HS circuitmap. */ - hs_token_t *hs_token; - /** Hashtable node: used to look up the circuit by its HS token using the HS - circuitmap. */ - HT_ENTRY(circuit_t) hs_circuitmap_node; } circuit_t; /** Largest number of relay_early cells that we can send on a given @@ -3224,7 +2979,6 @@ typedef enum { */ PATH_STATE_ALREADY_COUNTED = 6, } path_state_t; -#define path_state_bitfield_t ENUM_BF(path_state_t) /** An origin_circuit_t holds data necessary to build and use a circuit. */ @@ -3259,19 +3013,6 @@ typedef struct origin_circuit_t { /** Holds all rendezvous data on either client or service side. */ rend_data_t *rend_data; - /** Holds hidden service identifier on either client or service side. This - * is for both introduction and rendezvous circuit. */ - struct hs_ident_circuit_t *hs_ident; - - /** Holds the data that the entry guard system uses to track the - * status of the guard this circuit is using, and thereby to determine - * whether this circuit can be used. */ - struct circuit_guard_state_t *guard_state; - - /** Index into global_origin_circuit_list for this circuit. -1 if not - * present. */ - int global_origin_circuit_list_idx; - /** How many more relay_early cells can we send on this circuit, according * to the specification? */ unsigned int remaining_relay_early_cells : 4; @@ -3288,7 +3029,7 @@ typedef struct origin_circuit_t { * circuit building and usage accounting. See path_state_t * for more details. */ - path_state_bitfield_t path_state : 3; + ENUM_BF(path_state_t) path_state : 3; /* If this flag is set, we should not consider attaching any more * connections to this circuit. */ @@ -3415,13 +3156,6 @@ typedef struct origin_circuit_t { * adjust_exit_policy_from_exitpolicy_failure. */ smartlist_t *prepend_policy; - - /** How long do we wait before closing this circuit if it remains - * completely idle after it was built, in seconds? This value - * is randomized on a per-circuit basis from CircuitsAvailableTimoeut - * to 2*CircuitsAvailableTimoeut. */ - int circuit_idle_timeout; - } origin_circuit_t; struct onion_queue_t; @@ -3442,10 +3176,6 @@ typedef struct or_circuit_t { /** Pointer to an entry on the onion queue, if this circuit is waiting for a * chance to give an onionskin to a cpuworker. Used only in onion.c */ struct onion_queue_t *onionqueue_entry; - /** Pointer to a workqueue entry, if this circuit has given an onionskin to - * a cpuworker and is waiting for a response. Used to decide whether it is - * safe to free a circuit or if it is still in use by a cpuworker. */ - struct workqueue_entry_s *workqueue_entry; /** The circuit_id used in the previous (backward) hop of this circuit. */ circid_t p_circ_id; @@ -3483,6 +3213,20 @@ typedef struct or_circuit_t { * is not marked for close. */ struct or_circuit_t *rend_splice; +#if REND_COOKIE_LEN >= DIGEST_LEN +#define REND_TOKEN_LEN REND_COOKIE_LEN +#else +#define REND_TOKEN_LEN DIGEST_LEN +#endif + + /** A hash of location-hidden service's PK if purpose is INTRO_POINT, or a + * rendezvous cookie if purpose is REND_POINT_WAITING. Filled with zeroes + * otherwise. + * ???? move to a subtype or adjunct structure? Wastes 20 bytes. -NM + */ + char rend_token[REND_TOKEN_LEN]; + + /* ???? move to a subtype or adjunct structure? Wastes 20 bytes -NM */ /** Stores KH for the handshake. */ char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */ @@ -3490,12 +3234,8 @@ typedef struct or_circuit_t { * to the specification? */ unsigned int remaining_relay_early_cells : 4; - /* We have already received an INTRODUCE1 cell on this circuit. */ - unsigned int already_received_introduce1 : 1; - - /** If set, this circuit carries HS traffic. Consider it in any HS - * statistics. */ - unsigned int circuit_carries_hs_traffic_stats : 1; + /** True iff this circuit was made with a CREATE_FAST cell. */ + unsigned int is_first_hop : 1; /** Number of cells that were removed from circuit queue; reset every * time when writing buffer stats to disk. */ @@ -3513,53 +3253,36 @@ typedef struct or_circuit_t { uint32_t max_middle_cells; } or_circuit_t; -#if REND_COOKIE_LEN != DIGEST_LEN -#error "The REND_TOKEN_LEN macro assumes REND_COOKIE_LEN == DIGEST_LEN" -#endif -#define REND_TOKEN_LEN DIGEST_LEN - /** Convert a circuit subtype to a circuit_t. */ #define TO_CIRCUIT(x) (&((x)->base_)) /** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert * if the cast is impossible. */ static or_circuit_t *TO_OR_CIRCUIT(circuit_t *); -static const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *); /** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t. * Assert if the cast is impossible. */ static origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *); -static const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *); -/** Return 1 iff node has Exit flag and no BadExit flag. - * Otherwise, return 0. - */ -static inline int node_is_good_exit(const node_t *node) -{ - return node->is_exit && ! node->is_bad_exit; -} - -static inline or_circuit_t *TO_OR_CIRCUIT(circuit_t *x) +static INLINE or_circuit_t *TO_OR_CIRCUIT(circuit_t *x) { tor_assert(x->magic == OR_CIRCUIT_MAGIC); return DOWNCAST(or_circuit_t, x); } -static inline const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *x) -{ - tor_assert(x->magic == OR_CIRCUIT_MAGIC); - return DOWNCAST(or_circuit_t, x); -} -static inline origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x) -{ - tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); - return DOWNCAST(origin_circuit_t, x); -} -static inline const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT( - const circuit_t *x) +static INLINE origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *x) { tor_assert(x->magic == ORIGIN_CIRCUIT_MAGIC); return DOWNCAST(origin_circuit_t, x); } +/** Bitfield type: things that we're willing to use invalid routers for. */ +typedef enum invalid_router_usage_t { + ALLOW_INVALID_ENTRY =1, + ALLOW_INVALID_EXIT =2, + ALLOW_INVALID_MIDDLE =4, + ALLOW_INVALID_RENDEZVOUS =8, + ALLOW_INVALID_INTRODUCTION=16, +} invalid_router_usage_t; + /* limits for TCP send and recv buffer size used for constrained sockets */ #define MIN_CONSTRAINED_TCP_BUFFER 2048 #define MAX_CONSTRAINED_TCP_BUFFER 262144 /* 256k */ @@ -3608,31 +3331,77 @@ typedef struct port_cfg_t { uint8_t type; /**< One of CONN_TYPE_*_LISTENER */ unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */ - unsigned is_group_writable : 1; - unsigned is_world_writable : 1; - unsigned relax_dirmode_check : 1; + /* Client port types (socks, dns, trans, natd) only: */ + uint8_t isolation_flags; /**< Zero or more isolation flags */ + int session_group; /**< A session group, or -1 if this port is not in a + * session group. */ + /* Socks only: */ + /** When both no-auth and user/pass are advertised by a SOCKS client, select + * no-auth. */ + unsigned int socks_prefer_no_auth : 1; - entry_port_cfg_t entry_cfg; + /* Server port types (or, dir) only: */ + unsigned int no_advertise : 1; + unsigned int no_listen : 1; + unsigned int all_addrs : 1; + unsigned int bind_ipv4_only : 1; + unsigned int bind_ipv6_only : 1; - server_port_cfg_t server_cfg; + /* Client port types only: */ + unsigned int ipv4_traffic : 1; + unsigned int ipv6_traffic : 1; + unsigned int prefer_ipv6 : 1; + + /** For a socks listener: should we cache IPv4/IPv6 DNS information that + * exit nodes tell us? + * + * @{ */ + unsigned int cache_ipv4_answers : 1; + unsigned int cache_ipv6_answers : 1; + /** @} */ + /** For a socks listeners: if we find an answer in our client-side DNS cache, + * should we use it? + * + * @{ */ + unsigned int use_cached_ipv4_answers : 1; + unsigned int use_cached_ipv6_answers : 1; + /** @} */ + /** For socks listeners: When we can automap an address to IPv4 or IPv6, + * do we prefer IPv6? */ + unsigned int prefer_ipv6_virtaddr : 1; /* Unix sockets only: */ /** Path for an AF_UNIX address */ char unix_addr[FLEXIBLE_ARRAY_MEMBER]; } port_cfg_t; +/** Ordinary configuration line. */ +#define CONFIG_LINE_NORMAL 0 +/** Appends to previous configuration for the same option, even if we + * would ordinary replace it. */ +#define CONFIG_LINE_APPEND 1 +/* Removes all previous configuration for an option. */ +#define CONFIG_LINE_CLEAR 2 + +/** A linked list of lines in a config file. */ +typedef struct config_line_t { + char *key; + char *value; + struct config_line_t *next; + /** What special treatment (if any) does this line require? */ + unsigned int command:2; + /** If true, subsequent assignments to this linelist should replace + * it, not extend it. Set only on the first item in a linelist in an + * or_options_t. */ + unsigned int fragile:1; +} config_line_t; + typedef struct routerset_t routerset_t; /** A magic value for the (Socks|OR|...)Port options below, telling Tor * to pick its own port. */ #define CFG_AUTO_PORT 0xc4005e -/** Enumeration of outbound address configuration types: - * Exit-only, OR-only, or both */ -typedef enum {OUTBOUND_ADDR_EXIT, OUTBOUND_ADDR_OR, - OUTBOUND_ADDR_EXIT_AND_OR, - OUTBOUND_ADDR_MAX} outbound_addr_t; - /** Configuration options for a Tor process. */ typedef struct { uint32_t magic_; @@ -3640,9 +3409,7 @@ typedef struct { /** What should the tor process actually do? */ enum { CMD_RUN_TOR=0, CMD_LIST_FINGERPRINT, CMD_HASH_PASSWORD, - CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS, CMD_DUMP_CONFIG, - CMD_KEYGEN, - CMD_KEY_EXPIRATION, + CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS, CMD_DUMP_CONFIG } command; char *command_arg; /**< Argument for command-line option. */ @@ -3652,31 +3419,15 @@ typedef struct { int LogMessageDomains; /**< Boolean: Should we log the domain(s) in which * each log message occurs? */ - int TruncateLogFile; /**< Boolean: Should we truncate the log file - before we start writing? */ - char *SyslogIdentityTag; /**< Identity tag to add for syslog logging. */ - char *AndroidIdentityTag; /**< Identity tag to add for Android logging. */ char *DebugLogFile; /**< Where to send verbose log messages. */ - char *DataDirectory_option; /**< Where to store long-term data, as - * configured by the user. */ - char *DataDirectory; /**< Where to store long-term data, as modified. */ - int DataDirectoryGroupReadable; /**< Boolean: Is the DataDirectory g+r? */ - - char *KeyDirectory_option; /**< Where to store keys, as - * configured by the user. */ - char *KeyDirectory; /**< Where to store keys data, as modified. */ - int KeyDirectoryGroupReadable; /**< Boolean: Is the KeyDirectory g+r? */ - - char *CacheDirectory_option; /**< Where to store cached data, as - * configured by the user. */ - char *CacheDirectory; /**< Where to store cached data, as modified. */ - int CacheDirectoryGroupReadable; /**< Boolean: Is the CacheDirectory g+r? */ - + char *DataDirectory; /**< OR only: where to store long-term data. */ char *Nickname; /**< OR only: nickname of this onion router. */ char *Address; /**< OR only: configured address for this onion router. */ char *PidFile; /**< Where to store PID of Tor process. */ + int DynamicDHGroups; /**< Dynamic generation of prime moduli for use in DH.*/ + routerset_t *ExitNodes; /**< Structure containing nicknames, digests, * country codes and IP address patterns of ORs to * consider as exits. */ @@ -3700,38 +3451,46 @@ typedef struct { int DisableAllSwap; /**< Boolean: Attempt to call mlockall() on our * process for all current and future memory. */ + /** List of "entry", "middle", "exit", "introduction", "rendezvous". */ + smartlist_t *AllowInvalidNodes; + /** Bitmask; derived from AllowInvalidNodes. */ + invalid_router_usage_t AllowInvalid_; config_line_t *ExitPolicy; /**< Lists of exit policy components. */ - int ExitPolicyRejectPrivate; /**< Should we not exit to reserved private - * addresses, and our own published addresses? - */ - int ExitPolicyRejectLocalInterfaces; /**< Should we not exit to local - * interface addresses? - * Includes OutboundBindAddresses and - * configured ports. */ - int ReducedExitPolicy; /**, map it to a * virtual address. */ - /** List of suffixes for AutomapHostsOnResolve. The special value - * "." means "match everything." */ - smartlist_t *AutomapHostsSuffixes; + smartlist_t *AutomapHostsSuffixes; /**< List of suffixes for + * AutomapHostsOnResolve. */ int RendPostPeriod; /**< How often do we post each rendezvous service * descriptor? Remember to publish them independently. */ int KeepalivePeriod; /**< How often do we send padding cells to keep @@ -3951,18 +3669,17 @@ typedef struct { * unattached before we fail it? */ int LearnCircuitBuildTimeout; /**< If non-zero, we attempt to learn a value * for CircuitBuildTimeout based on timeout - * history. Use circuit_build_times_disabled() - * rather than checking this value directly. */ + * history */ int CircuitBuildTimeout; /**< Cull non-open circuits that were born at * least this many seconds ago. Used until * adaptive algorithm learns a new value. */ - int CircuitsAvailableTimeout; /**< Try to have an open circuit for at - least this long after last activity */ + int CircuitIdleTimeout; /**< Cull open clean circuits that were born + * at least this many seconds ago. */ int CircuitStreamTimeout; /**< If non-zero, detach streams from circuits * and try a new circuit if the stream has been * waiting for this many seconds. If zero, use * our default internal timeout schedule. */ - int MaxOnionQueueDelay; /*< DOCDOC */ + int MaxOnionQueueDelay; /**ProtocolWarnings ? \ + LOG_WARN : LOG_INFO) int ProtocolWarnings; /**< Boolean: when other parties screw up the Tor * protocol, is it a warn or an info in our logs? */ int TestSocks; /**< Boolean: when we get a socks connection, do we loudly @@ -4132,26 +3849,16 @@ typedef struct { int TokenBucketRefillInterval; char *AccelName; /**< Optional hardware acceleration engine name. */ char *AccelDir; /**< Optional hardware acceleration engine search dir. */ - - /** Boolean: Do we try to enter from a smallish number - * of fixed nodes? */ - int UseEntryGuards_option; - /** Internal variable to remember whether we're actually acting on - * UseEntryGuards_option -- when we're a non-anonymous Tor2web client or - * Single Onion Service, it is alwasy false, otherwise we use the value of - * UseEntryGuards_option. */ - int UseEntryGuards; - + int UseEntryGuards; /**< Boolean: Do we try to enter from a smallish number + * of fixed nodes? */ int NumEntryGuards; /**< How many entry guards do we try to establish? */ - - /** If 1, we use any guardfraction information we see in the - * consensus. If 0, we don't. If -1, let the consensus parameter - * decide. */ - int UseGuardFraction; - + int UseEntryGuardsAsDirGuards; /** Boolean: Do we try to get directory info + * from a smallish number of fixed nodes? */ int NumDirectoryGuards; /**< How many dir guards do we try to establish? * If 0, use value from NumEntryGuards. */ int RephistTrackTime; /**< How many seconds do we keep rephist info? */ + int FastFirstHopPK; /**< If Tor believes it is safe, should we save a third + * of our PK time by sending CREATE_FAST cells? */ /** Should we always fetch our dir info on the mirror schedule (which * means directly from the authorities) no matter our other config? */ int FetchDirInfoEarly; @@ -4159,10 +3866,6 @@ typedef struct { /** Should we fetch our dir info at the start of the consensus period? */ int FetchDirInfoExtraEarly; - int DirCache; /**< Cache all directory documents and accept requests via - * tunnelled dir conns from clients. If 1, enabled (default); - * If 0, disabled. */ - char *VirtualAddrNetworkIPv4; /**< Address and mask to hand out for virtual * MAPADDRESS requests for IPv4 addresses */ char *VirtualAddrNetworkIPv6; /**< Address and mask to hand out for virtual @@ -4194,6 +3897,10 @@ typedef struct { * testing our DNS server. */ int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the * same network zone in the same circuit. */ + int TunnelDirConns; /**< If true, use BEGIN_DIR rather than BEGIN when + * possible. */ + int PreferTunneledDirConns; /**< If true, avoid dirservers that don't + * support BEGIN_DIR, when possible. */ int PortForwarding; /**< If true, use NAT-PMP or UPnP to automatically * forward the DirPort and ORPort on the NAT device */ char *PortForwardingHelper; /** < Filename or full path of the port @@ -4207,11 +3914,29 @@ typedef struct { * if we are a cache). For authorities, this is always true. */ int DownloadExtraInfo; - /** If true, we're configured to collect statistics on clients + /** If true, and we are acting as a relay, allow exit circuits even when + * we are the first hop of a circuit. */ + int AllowSingleHopExits; + /** If true, don't allow relays with AllowSingleHopExits=1 to be used in + * circuits that we build. */ + int ExcludeSingleHopRelays; + /** If true, and the controller tells us to use a one-hop circuit, and the + * exit allows it, we use it. */ + int AllowSingleHopCircuits; + + /** If true, we convert "www.google.com.foo.exit" addresses on the + * socks/trans/natd ports into "www.google.com" addresses that + * exit from the node "foo". Disabled by default since attacking + * websites and exit relays can use it to manipulate your path + * selection. */ + int AllowDotExit; + + /** If true, we will warn if a user gives us only an IP address + * instead of a hostname. */ + int WarnUnsafeSocks; + + /** If true, the user wants us to collect statistics on clients * requesting network statuses from us as directory. */ - int DirReqStatistics_option; - /** Internal variable to remember whether we're actually acting on - * DirReqStatistics_option -- yes if it's set and we're a server, else no. */ int DirReqStatistics; /** If true, the user wants us to collect statistics on port usage. */ @@ -4223,20 +3948,9 @@ typedef struct { /** If true, the user wants us to collect cell statistics. */ int CellStatistics; - /** If true, the user wants us to collect padding statistics. */ - int PaddingStatistics; - /** If true, the user wants us to collect statistics as entry node. */ int EntryStatistics; - /** If true, the user wants us to collect statistics as hidden service - * directory, introduction point, or rendezvous point. */ - int HiddenServiceStatistics_option; - /** Internal variable to remember whether we're actually acting on - * HiddenServiceStatistics_option -- yes if it's set and we're a server, - * else no. */ - int HiddenServiceStatistics; - /** If true, include statistics file contents in extra-info documents. */ int ExtraInfoStatistics; @@ -4249,24 +3963,12 @@ typedef struct { * over randomly chosen exits. */ int ClientRejectInternalAddresses; - /** If true, clients may connect over IPv4. If false, they will avoid - * connecting over IPv4. We enforce this for OR and Dir connections. */ - int ClientUseIPv4; - /** If true, clients may connect over IPv6. If false, they will avoid - * connecting over IPv4. We enforce this for OR and Dir connections. - * Use fascist_firewall_use_ipv6() instead of accessing this value - * directly. */ + /** If true, clients may connect over IPv6. XXX we don't really + enforce this -- clients _may_ set up outgoing IPv6 connections + even when this option is not set. */ int ClientUseIPv6; - /** If true, prefer an IPv6 OR port over an IPv4 one for entry node - * connections. If auto, bridge clients prefer IPv6, and other clients - * prefer IPv4. Use node_ipv6_or_preferred() instead of accessing this value - * directly. */ + /** If true, prefer an IPv6 OR port over an IPv4 one. */ int ClientPreferIPv6ORPort; - /** If true, prefer an IPv6 directory port over an IPv4 one for direct - * directory connections. If auto, bridge clients prefer IPv6, and other - * clients prefer IPv4. Use fascist_firewall_prefer_ipv6_dirport() instead of - * accessing this value directly. */ - int ClientPreferIPv6DirPort; /** The length of time that we think a consensus should be fresh. */ int V3AuthVotingInterval; @@ -4284,15 +3986,12 @@ typedef struct { /** Location of bandwidth measurement file */ char *V3BandwidthsFile; - /** Location of guardfraction file */ - char *GuardfractionFile; - /** Authority only: key=value pairs that we add to our networkstatus * consensus vote on the 'params' line. */ char *ConsensusParams; /** Authority only: minimum number of measured bandwidths we must see - * before we only believe measured bandwidths to assign flags. */ + * before we only beliee measured bandwidths to assign flags. */ int MinMeasuredBWsForAuthToIgnoreAdvertised; /** The length of time that we think an initial consensus should be fresh. @@ -4337,44 +4036,10 @@ typedef struct { * on testing networks. */ smartlist_t *TestingClientConsensusDownloadSchedule; - /** Schedule for when clients should download consensuses from authorities - * if they are bootstrapping (that is, they don't have a usable, reasonably - * live consensus). Only used by clients fetching from a list of fallback - * directory mirrors. - * - * This schedule is incremented by (potentially concurrent) connection - * attempts, unlike other schedules, which are incremented by connection - * failures. Only altered on testing networks. */ - smartlist_t *ClientBootstrapConsensusAuthorityDownloadSchedule; - - /** Schedule for when clients should download consensuses from fallback - * directory mirrors if they are bootstrapping (that is, they don't have a - * usable, reasonably live consensus). Only used by clients fetching from a - * list of fallback directory mirrors. - * - * This schedule is incremented by (potentially concurrent) connection - * attempts, unlike other schedules, which are incremented by connection - * failures. Only altered on testing networks. */ - smartlist_t *ClientBootstrapConsensusFallbackDownloadSchedule; - - /** Schedule for when clients should download consensuses from authorities - * if they are bootstrapping (that is, they don't have a usable, reasonably - * live consensus). Only used by clients which don't have or won't fetch - * from a list of fallback directory mirrors. - * - * This schedule is incremented by (potentially concurrent) connection - * attempts, unlike other schedules, which are incremented by connection - * failures. Only altered on testing networks. */ - smartlist_t *ClientBootstrapConsensusAuthorityOnlyDownloadSchedule; - /** Schedule for when clients should download bridge descriptors. Only * altered on testing networks. */ smartlist_t *TestingBridgeDownloadSchedule; - /** Schedule for when clients should download bridge descriptors when they - * have no running bridges. Only altered on testing networks. */ - smartlist_t *TestingBridgeBootstrapDownloadSchedule; - /** When directory clients have only a few descriptors to request, they * batch them until they have more, or until this amount of time has * passed. Only altered on testing networks. */ @@ -4388,21 +4053,6 @@ typedef struct { * up? Only altered on testing networks. */ int TestingConsensusMaxDownloadTries; - /** How many times will a client try to fetch a consensus while - * bootstrapping using a list of fallback directories, before it gives up? - * Only altered on testing networks. */ - int ClientBootstrapConsensusMaxDownloadTries; - - /** How many times will a client try to fetch a consensus while - * bootstrapping using only a list of authorities, before it gives up? - * Only altered on testing networks. */ - int ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries; - - /** How many simultaneous in-progress connections will we make when trying - * to fetch a consensus before we wait for one to complete, timeout, or - * error out? Only altered on testing networks. */ - int ClientBootstrapConsensusMaxInProgressTries; - /** How many times will we try to download a router's descriptor before * giving up? Only altered on testing networks. */ int TestingDescriptorMaxDownloadTries; @@ -4426,20 +4076,9 @@ typedef struct { /** Minimum value for the Fast flag threshold on testing networks. */ uint64_t TestingMinFastFlagThreshold; - /** Relays in a testing network which should be voted Exit - * regardless of exit policy. */ - routerset_t *TestingDirAuthVoteExit; - int TestingDirAuthVoteExitIsStrict; - /** Relays in a testing network which should be voted Guard * regardless of uptime and bandwidth. */ routerset_t *TestingDirAuthVoteGuard; - int TestingDirAuthVoteGuardIsStrict; - - /** Relays in a testing network which should be voted HSDir - * regardless of uptime and DirPort. */ - routerset_t *TestingDirAuthVoteHSDir; - int TestingDirAuthVoteHSDirIsStrict; /** Enable CONN_BW events. Only altered on testing networks. */ int TestingEnableConnBwEvent; @@ -4483,6 +4122,12 @@ typedef struct { */ double CircuitPriorityHalflife; + /** If true, do not enable IOCP on windows with bufferevents, even if + * we think we could. */ + int DisableIOCP; + /** For testing only: will go away eventually. */ + int UseFilteringSSLBufferevents; + /** Set to true if the TestingTorNetwork configuration option is set. * This is used so that options_validate() has a chance to realize that * the defaults have changed. */ @@ -4506,6 +4151,11 @@ typedef struct { * never use it. If -1, we do what the consensus says. */ int OptimisticData; + /** If 1, and we are using IOCP, we set the kernel socket SNDBUF and RCVBUF + * to 0 to try to save kernel memory and avoid the dread "Out of buffers" + * issue. */ + int UserspaceIOCPBuffers; + /** If 1, we accept and launch no external network connections, except on * control ports. */ int DisableNetwork; @@ -4569,6 +4219,11 @@ typedef struct { int IPv6Exit; /**< Do we support exiting to IPv6 addresses? */ + char *TLSECGroup; /**< One of "P256", "P224", or nil for auto */ + + /** Autobool: should we use the ntor handshake if we can? */ + int UseNTorHandshake; + /** Fraction: */ double PathsNeededToBuildCircuits; @@ -4579,100 +4234,10 @@ typedef struct { /** How long (seconds) do we keep a guard before picking a new one? */ int GuardLifetime; - /** Is this an exit node? This is a tristate, where "1" means "yes, and use - * the default exit policy if none is given" and "0" means "no; exit policy - * is 'reject *'" and "auto" (-1) means "same as 1, but warn the user." - * - * XXXX Eventually, the default will be 0. */ - int ExitRelay; - - /** For how long (seconds) do we declare our signing keys to be valid? */ - int SigningKeyLifetime; - /** For how long (seconds) do we declare our link keys to be valid? */ - int TestingLinkCertLifetime; - /** For how long (seconds) do we declare our auth keys to be valid? */ - int TestingAuthKeyLifetime; - - /** How long before signing keys expire will we try to make a new one? */ - int TestingSigningKeySlop; - /** How long before link keys expire will we try to make a new one? */ - int TestingLinkKeySlop; - /** How long before auth keys expire will we try to make a new one? */ - int TestingAuthKeySlop; - - /** Force use of offline master key features: never generate a master - * ed25519 identity key except from tor --keygen */ - int OfflineMasterKey; - - enum { - FORCE_PASSPHRASE_AUTO=0, - FORCE_PASSPHRASE_ON, - FORCE_PASSPHRASE_OFF - } keygen_force_passphrase; - int use_keygen_passphrase_fd; - int keygen_passphrase_fd; - int change_key_passphrase; - char *master_key_fname; - - /** Autobool: Do we try to retain capabilities if we can? */ - int KeepBindCapabilities; - - /** Maximum total size of unparseable descriptors to log during the - * lifetime of this Tor process. - */ - uint64_t MaxUnparseableDescSizeToLog; - - /** Bool (default: 1): Switch for the shared random protocol. Only - * relevant to a directory authority. If off, the authority won't - * participate in the protocol. If on (default), a flag is added to the - * vote indicating participation. */ - int AuthDirSharedRandomness; - - /** If 1, we skip all OOS checks. */ - int DisableOOSCheck; - - /** Autobool: Should we include Ed25519 identities in extend2 cells? - * If -1, we should do whatever the consensus parameter says. */ - int ExtendByEd25519ID; - - /** Bool (default: 1): When testing routerinfos as a directory authority, - * do we enforce Ed25519 identity match? */ - /* NOTE: remove this option someday. */ - int AuthDirTestEd25519LinkKeys; - - /** Bool (default: 0): Tells if a %include was used on torrc */ - int IncludeUsed; - - /** The seconds after expiration which we as a relay should keep old - * consensuses around so that we can generate diffs from them. If 0, - * use the default. */ - int MaxConsensusAgeForDiffs; - - /** Bool (default: 0). Tells Tor to never try to exec another program. - */ - int NoExec; - - /** Have the KIST scheduler run every X milliseconds. If less than zero, do - * not use the KIST scheduler but use the old vanilla scheduler instead. If - * zero, do what the consensus says and fall back to using KIST as if this is - * set to "10 msec" if the consensus doesn't say anything. */ - int KISTSchedRunInterval; - - /** A multiplier for the KIST per-socket limit calculation. */ - double KISTSockBufSizeFactor; - - /** The list of scheduler type string ordered by priority that is first one - * has to be tried first. Default: KIST,KISTLite,Vanilla */ - smartlist_t *Schedulers; - /* An ordered list of scheduler_types mapped from Schedulers. */ - smartlist_t *SchedulerTypes_; - - /** List of files that were opened by %include in torrc and torrc-defaults */ - smartlist_t *FilesOpenedByIncludes; + /** Should we send the timestamps that pre-023 hidden services want? */ + int Support022HiddenServices; } or_options_t; -#define LOG_PROTOCOL_WARN (get_protocol_warning_severity_level()) - /** Persistent state for an onion router, as saved to disk. */ typedef struct { uint32_t magic_; @@ -4694,17 +4259,11 @@ typedef struct { uint64_t AccountingBytesAtSoftLimit; uint64_t AccountingExpectedUsage; - /** A list of Entry Guard-related configuration lines. (pre-prop271) */ + /** A list of Entry Guard-related configuration lines. */ config_line_t *EntryGuards; - /** A list of guard-related configuration lines. (post-prop271) */ - config_line_t *Guard; - config_line_t *TransportProxies; - /** Cached revision counters for active hidden services on this host */ - config_line_t *HidServRevCounter; - /** These fields hold information on the history of bandwidth usage for * servers. The "Ends" fields hold the time when we last updated the * bandwidth usage. The "Interval" fields hold the granularity, in seconds, @@ -4732,8 +4291,8 @@ typedef struct { /** Build time histogram */ config_line_t * BuildtimeHistogram; - int TotalBuildTimes; - int CircuitBuildAbandonedCount; + unsigned int TotalBuildTimes; + unsigned int CircuitBuildAbandonedCount; /** What version of Tor wrote this state file? */ char *TorVersion; @@ -4749,7 +4308,7 @@ typedef struct { /** Change the next_write time of state to when, unless the * state is already scheduled to be written to disk earlier than when. */ -static inline void or_state_mark_dirty(or_state_t *state, time_t when) +static INLINE void or_state_mark_dirty(or_state_t *state, time_t when) { if (state->next_write > when) state->next_write = when; @@ -4767,8 +4326,7 @@ static inline void or_state_mark_dirty(or_state_t *state, time_t when) /** Please turn this IP address into an FQDN, privately. */ #define SOCKS_COMMAND_RESOLVE_PTR 0xF1 -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define SOCKS_COMMAND_IS_CONNECT(c) (((c)==SOCKS_COMMAND_CONNECT) || 0) +#define SOCKS_COMMAND_IS_CONNECT(c) ((c)==SOCKS_COMMAND_CONNECT) #define SOCKS_COMMAND_IS_RESOLVE(c) ((c)==SOCKS_COMMAND_RESOLVE || \ (c)==SOCKS_COMMAND_RESOLVE_PTR) @@ -4899,7 +4457,7 @@ typedef uint32_t build_time_t; double circuit_build_times_quantile_cutoff(void); /** How often in seconds should we build a test circuit */ -#define CBT_DEFAULT_TEST_FREQUENCY 10 +#define CBT_DEFAULT_TEST_FREQUENCY 60 #define CBT_MIN_TEST_FREQUENCY 1 #define CBT_MAX_TEST_FREQUENCY INT32_MAX @@ -4970,7 +4528,6 @@ typedef enum { * did this remapping happen." */ ADDRMAPSRC_NONE } addressmap_entry_source_t; -#define addressmap_entry_source_bitfield_t ENUM_BF(addressmap_entry_source_t) /********************************* control.c ***************************/ @@ -5094,7 +4651,7 @@ typedef struct measured_bw_line_t { long int bw_kb; } measured_bw_line_t; -#endif /* defined(DIRSERV_PRIVATE) */ +#endif /********************************* dirvote.c ************************/ @@ -5226,7 +4783,7 @@ typedef enum { /** Hidden-service side configuration of client authorization. */ typedef struct rend_authorized_client_t { char *client_name; - uint8_t descriptor_cookie[REND_DESC_COOKIE_LEN]; + char descriptor_cookie[REND_DESC_COOKIE_LEN]; crypto_pk_t *client_key; } rend_authorized_client_t; @@ -5241,38 +4798,31 @@ typedef struct rend_encoded_v2_service_descriptor_t { * introduction point. See also rend_intro_point_t.unreachable_count. */ #define MAX_INTRO_POINT_REACHABILITY_FAILURES 5 -/** The minimum and maximum number of distinct INTRODUCE2 cells which a - * hidden service's introduction point will receive before it begins to - * expire. */ -#define INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS 16384 -/* Double the minimum value so the interval is [min, min * 2]. */ -#define INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS \ - (INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS * 2) +/** The maximum number of distinct INTRODUCE2 cells which a hidden + * service's introduction point will receive before it begins to + * expire. + * + * XXX023 Is this number at all sane? */ +#define INTRO_POINT_LIFETIME_INTRODUCTIONS 16384 /** The minimum number of seconds that an introduction point will last * before expiring due to old age. (If it receives * INTRO_POINT_LIFETIME_INTRODUCTIONS INTRODUCE2 cells, it may expire * sooner.) * - * XXX Should this be configurable? */ + * XXX023 Should this be configurable? */ #define INTRO_POINT_LIFETIME_MIN_SECONDS (18*60*60) /** The maximum number of seconds that an introduction point will last * before expiring due to old age. * - * XXX Should this be configurable? */ + * XXX023 Should this be configurable? */ #define INTRO_POINT_LIFETIME_MAX_SECONDS (24*60*60) -/** The maximum number of circuit creation retry we do to an intro point - * before giving up. We try to reuse intro point that fails during their - * lifetime so this is a hard limit on the amount of time we do that. */ -#define MAX_INTRO_POINT_CIRCUIT_RETRIES 3 - /** Introduction point information. Used both in rend_service_t (on * the service side) and in rend_service_descriptor_t (on both the * client and service side). */ typedef struct rend_intro_point_t { - extend_info_t *extend_info; /**< Extend info for connecting to this - * introduction point via a multi-hop path. */ + extend_info_t *extend_info; /**< Extend info of this introduction point. */ crypto_pk_t *intro_key; /**< Introduction key that replaces the service * key, if this descriptor is V2. */ @@ -5292,6 +4842,11 @@ typedef struct rend_intro_point_t { * included in the last HS descriptor we generated. */ unsigned int listed_in_last_desc : 1; + /** (Service side only) Flag indicating that + * rend_service_note_removing_intro_point has been called for this + * intro point. */ + unsigned int rend_service_note_removing_intro_point_called : 1; + /** (Service side only) A replay cache recording the RSA-encrypted parts * of INTRODUCE2 cells this intro point's circuit has received. This is * used to prevent replay attacks. */ @@ -5302,12 +4857,6 @@ typedef struct rend_intro_point_t { */ int accepted_introduce2_count; - /** (Service side only) Number of maximum INTRODUCE2 cells that this IP - * will accept. This is a random value between - * INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS and - * INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS. */ - int max_introductions; - /** (Service side only) The time at which this intro point was first * published, or -1 if this intro point has not yet been * published. */ @@ -5318,16 +4867,15 @@ typedef struct rend_intro_point_t { * point should expire. */ time_t time_to_expire; - /** (Service side only) The amount of circuit creation we've made to this - * intro point. This is incremented every time we do a circuit relaunch on - * this object which is triggered when the circuit dies but the node is - * still in the consensus. After MAX_INTRO_POINT_CIRCUIT_RETRIES, we give - * up on it. */ - unsigned int circuit_retries; - - /** (Service side only) Set if this intro point has an established circuit - * and unset if it doesn't. */ - unsigned int circuit_established:1; + /** (Service side only) The time at which we decided that this intro + * point should start expiring, or -1 if this intro point is not yet + * expiring. + * + * This field also serves as a flag to indicate that we have decided + * to expire this intro point, in case intro_point_should_expire_now + * flaps (perhaps due to a clock jump; perhaps due to other + * weirdness, or even a (present or future) bug). */ + time_t time_expiring; } rend_intro_point_t; #define REND_PROTOCOL_VERSION_BITMASK_WIDTH 16 @@ -5338,9 +4886,9 @@ typedef struct rend_service_descriptor_t { crypto_pk_t *pk; /**< This service's public key. */ int version; /**< Version of the descriptor format: 0 or 2. */ time_t timestamp; /**< Time when the descriptor was generated. */ - /** Bitmask: which introduce/rendezvous protocols are supported? - * (We allow bits '0', '1', '2' and '3' to be set.) */ - unsigned protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH; + /** Bitmask: which rendezvous protocols are supported? + * (We allow bits '0', '1', and '2' to be set.) */ + int protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH; /** List of the service's introduction points. Elements are removed if * introduction attempts fail. */ smartlist_t *intro_nodes; @@ -5353,6 +4901,14 @@ typedef struct rend_service_descriptor_t { smartlist_t *successful_uploads; } rend_service_descriptor_t; +/** A cached rendezvous descriptor. */ +typedef struct rend_cache_entry_t { + size_t len; /**< Length of desc */ + time_t received; /**< When was the descriptor received? */ + char *desc; /**< Service descriptor */ + rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */ +} rend_cache_entry_t; + /********************************* routerlist.c ***************************/ /** Represents information about a single trusted or fallback directory @@ -5361,13 +4917,9 @@ typedef struct dir_server_t { char *description; char *nickname; char *address; /**< Hostname. */ - /* XX/teor - why do we duplicate the address and port fields here and in - * fake_status? Surely we could just use fake_status (#17867). */ - tor_addr_t ipv6_addr; /**< IPv6 address if present; AF_UNSPEC if not */ uint32_t addr; /**< IPv4 address. */ uint16_t dir_port; /**< Directory port. */ uint16_t or_port; /**< OR port: Used for tunneling connections. */ - uint16_t ipv6_orport; /**< OR port corresponding to ipv6_addr. */ double weight; /** Weight used when selecting this node at random */ char digest[DIGEST_LEN]; /**< Digest of identity key. */ char v3_identity_digest[DIGEST_LEN]; /**< Digest of v3 (authority only, @@ -5388,15 +4940,13 @@ typedef struct dir_server_t { * address information from published? */ routerstatus_t fake_status; /**< Used when we need to pass this trusted - * dir_server_t to - * directory_request_set_routerstatus. + * dir_server_t to directory_initiate_command_* * as a routerstatus_t. Not updated by the * router-status management code! **/ } dir_server_t; -#define RELAY_REQUIRED_MIN_BANDWIDTH (75*1024) -#define BRIDGE_REQUIRED_MIN_BANDWIDTH (50*1024) +#define ROUTER_REQUIRED_MIN_BANDWIDTH (20*1024) #define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX @@ -5420,15 +4970,22 @@ typedef struct dir_server_t { * or extrainfo documents. * * Passed to router_pick_directory_server (et al) - */ -#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3) -/** Flag to indicate that we should not use any directory authority to which - * we have an existing directory connection for downloading microdescs. * - * Passed to router_pick_directory_server (et al) + * [XXXX NOTE: This option is only implemented for pick_trusteddirserver, + * not pick_directory_server. If we make it work on pick_directory_server + * too, we could conservatively make it only prevent multiple fetches to + * the same authority, or we could aggressively make it prevent multiple + * fetches to _any_ single directory server.] */ +#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3) #define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4) +/** This node is to be chosen as a directory guard, so don't choose any + * node that's currently a guard. */ +#define PDS_FOR_GUARD (1<<5) + +#define PDS_PREFER_TUNNELED_DIR_CONNS_ (1<<16) + /** Possible ways to weight routers when choosing one randomly. See * routerlist_sl_choose_by_bandwidth() for more information.*/ typedef enum bandwidth_weight_rule_t { @@ -5442,46 +4999,22 @@ typedef enum { CRN_NEED_UPTIME = 1<<0, CRN_NEED_CAPACITY = 1<<1, CRN_NEED_GUARD = 1<<2, + CRN_ALLOW_INVALID = 1<<3, /* XXXX not used, apparently. */ CRN_WEIGHT_AS_EXIT = 1<<5, - CRN_NEED_DESC = 1<<6, - /* On clients, only provide nodes that satisfy ClientPreferIPv6OR */ - CRN_PREF_ADDR = 1<<7, - /* On clients, only provide nodes that we can connect to directly, based on - * our firewall rules */ - CRN_DIRECT_CONN = 1<<8, - /* On clients, only provide nodes with HSRend >= 2 protocol version which - * is required for hidden service version >= 3. */ - CRN_RENDEZVOUS_V3 = 1<<9, + CRN_NEED_DESC = 1<<6 } router_crn_flags_t; /** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */ typedef enum was_router_added_t { - /* Router was added successfully. */ ROUTER_ADDED_SUCCESSFULLY = 1, - /* Extrainfo document was rejected because no corresponding router - * descriptor was found OR router descriptor was rejected because - * it was incompatible with its extrainfo document. */ + ROUTER_ADDED_NOTIFY_GENERATOR = 0, ROUTER_BAD_EI = -1, - /* Router descriptor was rejected because it is already known. */ - ROUTER_IS_ALREADY_KNOWN = -2, - /* General purpose router was rejected, because it was not listed - * in consensus. */ + ROUTER_WAS_NOT_NEW = -2, ROUTER_NOT_IN_CONSENSUS = -3, - /* Router was neither in directory consensus nor in any of - * networkstatus documents. Caching it to access later. - * (Applies to fetched descriptors only.) */ ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4, - /* Router was rejected by directory authority. */ ROUTER_AUTHDIR_REJECTS = -5, - /* Bridge descriptor was rejected because such bridge was not one - * of the bridges we have listed in our configuration. */ - ROUTER_WAS_NOT_WANTED = -6, - /* Router descriptor was rejected because it was older than - * OLD_ROUTER_DESC_MAX_AGE. */ - ROUTER_WAS_TOO_OLD = -7, /* note contrast with 'NOT_NEW' */ - /* DOCDOC */ - ROUTER_CERTS_EXPIRED = -8 + ROUTER_WAS_NOT_WANTED = -6 } was_router_added_t; /********************************* routerparse.c ************************/ @@ -5507,5 +5040,5 @@ typedef struct tor_version_t { char git_tag[DIGEST_LEN]; } tor_version_t; -#endif /* !defined(TOR_OR_H) */ +#endif diff --git a/src/tor/or_sha1.i b/src/tor/or_sha1.i new file mode 100644 index 000000000..f77a7075c --- /dev/null +++ b/src/tor/or_sha1.i @@ -0,0 +1,167 @@ +"8d4bc392a73ae08804f4aa534d0025abc3ef47c3 src/tor/LICENSE" +"585273311fcbed39ffe440bf5be12f070223ca00 src/tor/address.c" +"d233965a57506745525c7a78ff2911d59f5e3743 src/tor/address.h" +"dffdce63b5197f941a9eaa6213367dc92669038d src/tor/addressmap.c" +"63a5a6a1ab1809f88fd2c4bc296a6f69c1ef868e src/tor/addressmap.h" +"10e0ec8ee3318e6a5ebbedc35d45ad4ec2fe5bb2 src/tor/aes.c" +"947ef902f15f556f176b1115f09d9966e377347d src/tor/aes.h" +"551d4e3d158367dec28982926be373d9bcf2ac60 src/tor/backtrace.c" +"ac6a50ceb318ed6907b5804034b98172ffc5ff83 src/tor/backtrace.h" +"ce6a093c6f41ffa08137699cf621c69957dc2786 src/tor/buffers.c" +"c78d0672ca6c6af973837f60952375caf3e44f32 src/tor/buffers.h" +"e6dbd33b4bfed0ab93c064d1e00257a9e4fd0205 src/tor/channel.c" +"1a58ef361dd56134863cb559375c0c7b276ddad2 src/tor/channel.h" +"9eec4d1b587093cb2fa26f3a72067245ba3fee43 src/tor/channeltls.c" +"9bedc13da7a1844e6faf7a66dd1cc04463b2a4ce src/tor/channeltls.h" +"6fb51902eea04b5c33a99a754845958fec43d912 src/tor/ciphers.inc" +"e7ce2a2bea278d651102f18ec0409da2abb2d14a src/tor/circpathbias.c" +"ff3a5693416ccf243f608a7bb943a078418c16d8 src/tor/circpathbias.h" +"57981a0f8f4f86ba9d3ea8f3481668fb76b5e405 src/tor/circuitbuild.c" +"888b2baa34d7ac6256484c8bba833600e11380e2 src/tor/circuitbuild.h" +"c19733acf96b05f7cc37193089da1db9ddb14a24 src/tor/circuitlist.c" +"ef5c568c3d2afe2ac4fafbc916fbd5bcaf9549ae src/tor/circuitlist.h" +"491c6fb92ffdc81b8df75ec553208a627d744a53 src/tor/circuitmux.c" +"d3d5bc76466470275f95f4496784fd6df8448f42 src/tor/circuitmux.h" +"d4ad2888c3101581cf4544750370f2cd3cf94fdd src/tor/circuitmux_ewma.c" +"db0d9ba7153d05561239701002d286a1690ac761 src/tor/circuitmux_ewma.h" +"7ea48c0e1c46e350d9cc04de3d0ec1c864b5f676 src/tor/circuitstats.c" +"5841bca9afe05cf47e250b61e63a7ecdd4aacfb0 src/tor/circuitstats.h" +"8d821a42c833132db53b4ca23fd4f21ac6e41add src/tor/circuituse.c" +"3e7d60c902027551cb370135afd1048abed6ca7b src/tor/circuituse.h" +"ab2f6f7c588aaf6e0acceb61206a07462d2b0eaf src/tor/command.c" +"8a419c2a26581c1abe28ff3622526824d9530488 src/tor/command.h" +"090739076d6663d15312ebf41e9ed8470677a869 src/tor/common_sha1.i" +"55e2ae4d550cc48e07540bb18c51e39fd9c4c302 src/tor/compat.c" +"6dfa1931b57d13eea420f0d4b55d518c84f738a6 src/tor/compat_libevent.c" +"e427c754391f1282a98cbbb387bae2ae403cbde7 src/tor/compat_libevent.h" +"3538da426f613fe2a0d9c622942be80d34a4dab3 src/tor/config.c" +"6dcfbc668bdbb2a7937cbbb412dbda9a3e33f974 src/tor/config.h" +"48ea4f809cf6b7738d5cfe9b64ee685f35552943 src/tor/config_codedigest.c" +"c086c476b2eb3f7402af9a0cce916698e3f3ddca src/tor/confparse.c" +"ea544b8d0426f349d150930144581dffc7cd14c8 src/tor/confparse.h" +"b666b17b34afe9e407766659acb32472ebda1a18 src/tor/connection.c" +"8a6734ac90158ff17fd4984b6282c523bdb2348a src/tor/connection.h" +"4354befbddcb7324faa6b1b586fec8d44f55cc48 src/tor/connection_edge.c" +"22ad4a23108c8b93e66a86abb72183d5fd0f2ba1 src/tor/connection_edge.h" +"3e7d5afca47799d1567f7ada97b05617707c103a src/tor/connection_or.c" +"274f0f4a322c9289c156f022a7fb60fcc1c1c546 src/tor/connection_or.h" +"40ee43adf2333cca54831acb495036a3795a403c src/tor/container.c" +"faaa0bcfcc0cbc61f6d092b9b36e56cb89b090b7 src/tor/container.h" +"12ec53c928ab9359affd3b0ed7da206abb284d9d src/tor/control.c" +"cc68ca39ff86ca801f7fa940cacbb86fd7d8b81c src/tor/control.h" +"26da4b7aa6ece88f530036e0c7af8831dd914e81 src/tor/cpuworker.c" +"bd39684ad6c38bbb9f171c2cdbd7209198482a4d src/tor/cpuworker.h" +"49eed653e7c5faf49ceb76ead6d133d5aeaef4d0 src/tor/crypto.c" +"7196fde86ec70bd579e8fcd546817d285d936b18 src/tor/crypto.h" +"05dc726d9d47888cc75a1c3bd31c8214dc2cb581 src/tor/crypto_curve25519.c" +"1260154e3b65f2586a54986deffec6963a4c7204 src/tor/crypto_curve25519.h" +"401d6c1243b8d99ad8f64dba232e234e60a59eb7 src/tor/crypto_format.c" +"bd56f54d3ffc76c0b6651cc7ec122726b4f8e8d8 src/tor/curve25519-donna.c" +"c388537581bc15091c769dc2e1bee2e507ababc0 src/tor/di_ops.c" +"9ed1bb165e8d0532cae5bfd17e27d037d2a05bf4 src/tor/di_ops.h" +"22503a699d6eb6c421c214d284ca7ce3da6c7f6c src/tor/directory.c" +"c872c595b665cf98e32f7426eb638d1792825550 src/tor/directory.h" +"e2a2604d70d2e75c7c3a415fc2e8817cadbb2ada src/tor/dirserv.c" +"edab8d7cdd672b3863d2e6d3d9a501bd1483c320 src/tor/dirserv.h" +"cfec2f7ec343d354e6d3144cfefa2e6cec524706 src/tor/dirvote.c" +"3c7f1b89374f449b5274e3155987f574f19a6fd7 src/tor/dirvote.h" +"4453e77b1b71fc61310d6dfc24c6545d2aff7083 src/tor/dns.c" +"6cb1fa72a8e143182af936ca5ab975bc2510c55d src/tor/dns.h" +"2eee7d9c28f237e7a40acf749e1b3a1c1dc6de7d src/tor/dnsserv.c" +"92a6d02b37ccae143cead903d75856e9c1496528 src/tor/dnsserv.h" +"7bc19c39392e41377e0524d3c165f081fd333725 src/tor/entrynodes.c" +"60efe5a221cef762dde349ca855935b3648d8564 src/tor/entrynodes.h" +"ff84c64a6e1935405270649b2b527f6ca2b68c70 src/tor/eventdns.h" +"126556a98b9839bf4d9584e1282926ce6793f1e9 src/tor/eventdns_tor.h" +"8300e16ef71e078ef4ad00360a77ed89333ea565 src/tor/ext_orport.c" +"5f64cde2302c3ef0a2ba48f7fe7e56af1bc1ba64 src/tor/ext_orport.h" +"e5c6da5c0eb4b4214e6365b83fb5483d2d234cef src/tor/fp_pair.c" +"56ab7d66d989746dab1fdb5fb59bc9d43315a606 src/tor/fp_pair.h" +"fc133f573a2e52bb445147685d359bd55219ec1b src/tor/geoip.c" +"43128fc11249480ab0c14c11cdf5cd32b5dcf010 src/tor/geoip.h" +"9f0b32ce2c50b22e099d54c6cf33c7900cedf484 src/tor/hibernate.c" +"3020153dc61f17dc4a8a402d5c87e656f8be07e9 src/tor/hibernate.h" +"e82b35d57295842d5e27375ac1eb2529542b55f6 src/tor/ht.h" +"2e37b69b1e5d27f6f8dae4730342a359fefea127 src/tor/log.c" +"2690cb9b9996ca96088703a2774fb101ffc5a6f1 src/tor/memarea.c" +"697be45dc2e1ae6537b34dc72abf6394952a1b87 src/tor/memarea.h" +"8548d0da9a968b6dfa5b3508fc25a9e6672fab81 src/tor/mempool.c" +"0b594bada47b6e23358fa924cffbf24e01180d60 src/tor/mempool.h" +"602977547b2ba230a433e01ac194e44e7b077a13 src/tor/microdesc.c" +"53546547b5f37dac1e70fb176c1ff2251d5fe736 src/tor/microdesc.h" +"af3380f978a1a2e2378a435cee1b19db733c7345 src/tor/networkstatus.c" +"d438fa81e6c8338d05de94dea37fc5ed023fde80 src/tor/networkstatus.h" +"ef17bdfd659b1948654d880f88565267c7deaf20 src/tor/nodelist.c" +"d4dfe30ea516b49efb4698932c98ffb71982e07d src/tor/nodelist.h" +"fb67721a934c3e90bed728ceb4871251924b9c0f src/tor/not_or_sha1.i" +"77eeeb99b186dc2338fa9c7f0283f4988fc3c094 src/tor/ntmain.h" +"ad4fd89352aee29af8da07d55cac60958f5c9d81 src/tor/onion.c" +"7f6d71c21ff45f3a2dc36b7eabcb15d2a8a34c57 src/tor/onion.h" +"5c1d8796ff4485027bc2525ffd69b23997f03a2a src/tor/onion_fast.c" +"33245d34d6bfbc6c8c700264318c5a594716b5d8 src/tor/onion_fast.h" +"1435dbe5ac894c5e37bfafb873f1245cabeb3d0b src/tor/onion_main.c" +"7c0dc83691463b6564edf492cb7ae284d3d46dba src/tor/onion_main.h" +"5533f7d49dfaa3dfb2bf230e22cb149fa403897c src/tor/onion_ntor.c" +"e0ccc9ed34e5f206f5ea57847c4e41a19f7ad2b3 src/tor/onion_ntor.h" +"ba45a56d4cda342715a9fb81dcef3041aa9801c9 src/tor/onion_tap.c" +"485bf9e2effe89a3f41b28fbd9d80a57ce339cbf src/tor/onion_tap.h" +"99529726d2f4069ad8484680fafe0e3da7e3cf00 src/tor/or.h" +"6731d5ca99b113ea8fd696e669880ac7fa33f4ad src/tor/or_sha1.i" +"fd7c85e665291a9f41fa9a9c6f0f52b3c228c685 src/tor/orconfig.h" +"17678b8e485a614ee31f4cf88f2275a8c4cffa3d src/tor/orconfig_apple.h" +"f815de4c1f09d9e06868ea3097541a4fbf5f3304 src/tor/orconfig_linux.h" +"98e5dbbe2393745ca2670b0e126e79202b45ab38 src/tor/orconfig_win32.h" +"857f07954edd7a226b7f0810da505df87a87582b src/tor/policies.c" +"03dc38b7773b45bbd8203b677cfbc776b0c0b6b7 src/tor/policies.h" +"bd0a3c33ce1609af7d757d935b9ff089bafbb520 src/tor/procmon.c" +"2cd7af59a82d4e1ca2873d2801c44176605a545a src/tor/procmon.h" +"4871aac26b19baa07dd6904c48dfd75234e114d7 src/tor/reasons.c" +"c492ec75acc2dd3365d79b1c72f350aabdc03196 src/tor/reasons.h" +"2696f0379de941f5c65bf79888980863b36240c6 src/tor/relay.c" +"96c2a5773108690855eaf2846b62d2a6db49e0ff src/tor/relay.h" +"46e8f23b6743db4782c20f3a0d9371dd0f6f6565 src/tor/rendclient.c" +"478409fbaa11d514985dba23b0ab4da71a4e2d97 src/tor/rendclient.h" +"759e931e7d4d84658ebf82cf6aa5c80c59f00a2e src/tor/rendcommon.c" +"0ea91df7f1f517b6a50e8568c359e84f7be8c04a src/tor/rendcommon.h" +"34602ab4fa5afc5317bb576cf673137cf8cb4ab3 src/tor/rendmid.c" +"c0ec958def76704f5735d71c6848d0f229db27b3 src/tor/rendmid.h" +"9078fd3476260fe73b5afbba8a4d806d73a81895 src/tor/rendservice.c" +"d5a224d7940b6ff938c4e8336106e24b5ca5756b src/tor/rendservice.h" +"c693d905d4d0ddbeb09adaa6578e3541c7e2043f src/tor/rephist.c" +"fac88cddeda839dc593b037f96f789dd28709ee2 src/tor/rephist.h" +"d58afa23a92c38557b8b57084fe70c919869ca89 src/tor/replaycache.c" +"72c264bcc3370bf71d004fef70f71ee1191fcbf6 src/tor/replaycache.h" +"c06bbc01b893714ac7519258eccd6c5372aa59b6 src/tor/router.c" +"e52dbb07178b60712942a128198c949836c658b7 src/tor/router.h" +"5883eff9af31bf0de0d27bfb156bf88eeffef6a9 src/tor/routerlist.c" +"15d590536a54497244b77f60b01843ca9df247f2 src/tor/routerlist.h" +"f707d41dd2dfe641a5f5196b8499d39dbe8e534d src/tor/routerparse.c" +"18d38445e8d21da51e09a01bebed58aac40eca2f src/tor/routerparse.h" +"a1d43f45a49918eb613e13121ef85cc4405c04ca src/tor/routerset.c" +"ac098125b79f6fba41a58b498811f60c852d562b src/tor/routerset.h" +"a4aed96fda1fd558932737a6746100fe9a586c06 src/tor/sandbox.c" +"ed8b5d4225ceaf11e29fe635a091e2b2f3fe3ae8 src/tor/sandbox.h" +"907d9d2810d111f4d3606caada6b910ff8271c2f src/tor/statefile.c" +"fc3c214ece4640cce33fecb14900570a247dce5a src/tor/statefile.h" +"d39125d8222178b485bc0bb0c6137ac68384a3d9 src/tor/status.c" +"1cec9dc4fff60b5569944a81db1b20e6d00066c0 src/tor/status.h" +"5594e48118c367c92d25dfc0b9f9c2adba502fb6 src/tor/anonymize.cpp" +"9ac90c0efcdabe5fe31d886e61d8db94d2eb50e9 src/tor/anonymize.h" +"f009567cb0708b2bfdff242353c07a7da6f4869f src/tor/strlcat.c" +"7faeaf90301ad7d5d8db105590524a949a25dccf src/tor/strlcpy.c" +"ddfdca2f5d52acc27214a3c91c0ca73c81b526eb src/tor/testsupport.h" +"4799c02f280da99fa349682846fe9509dd729a6c src/tor/tinytest.h" +"de7dc06ad109381130e48b1e6b2663d1d499edac src/tor/tinytest_macros.h" +"4618a9860688c2cb12d37d8172317324c10f0a92 src/tor/tor_compat.h" +"8a167958b0d740ee41380f2b8176d6a9beec3e44 src/tor/tor_queue.h" +"5efeb8115c1c122b9dc6683d1ce92e00966f1b12 src/tor/tor_util.c" +"e5cb074466d9f59f1988e8964fed1476c238ff14 src/tor/tor_util.h" +"64a20b8425300b0bf2373a4fe4eb74b47c4baf50 src/tor/torgzip.c" +"13108dc9184a7ece65685e0724e7e8770acd576f src/tor/torgzip.h" +"9ff7f633e2a5aadc163e2a6bae45ef2aa4a21b5e src/tor/torint.h" +"b86f76bfdfdc3bd841233c662761e857cb830c88 src/tor/torlog.h" +"f0e8fd88f7198ad4adbd5c28e4af909b2d553b5a src/tor/tortls.c" +"27209a8a0e9b8c61bbbb2d50241a2a4b4595ce19 src/tor/tortls.h" +"60d6b828f4b278580e1ea681b4328828cdf7ea6c src/tor/transports.c" +"c3988eae2f1661d29feb9b6d4fc98844423b399d src/tor/transports.h" +"8c336c9bb3916a0494807fc0f8e6022058beda06 src/tor/util_codedigest.c" diff --git a/src/tor/orconfig.h b/src/tor/orconfig.h new file mode 100644 index 000000000..e4796aad6 --- /dev/null +++ b/src/tor/orconfig.h @@ -0,0 +1,12 @@ +#ifndef GENERIC_ORCONFIG_H_ +#define GENERIC_ORCONFIG_H_ + +#if defined(_WIN32) +# include "orconfig_win32.h" +#elif defined(__darwin__) || defined(__APPLE__) +# include "orconfig_apple.h" +#else +# include "orconfig_linux.h" +#endif + +#endif // GENERIC_ORCONFIG_H_ diff --git a/src/tor/orconfig_apple.h b/src/tor/orconfig_apple.h new file mode 100644 index 000000000..bed974799 --- /dev/null +++ b/src/tor/orconfig_apple.h @@ -0,0 +1,623 @@ +/* orconfig.h. Generated from orconfig.h.in by configure. */ +/* orconfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* tor's configuration directory */ +#define CONFDIR "/usr/local/etc/tor" + +/* Defined if we have a curve25519 implementation */ +#define CURVE25519_ENABLED 1 + +/* Enable dmalloc's malloc function check */ +/* #undef DMALLOC_FUNC_CHECK */ + +/* Define to 1 iff memset(0) sets doubles to 0.0 */ +#define DOUBLE_0_REP_IS_ZERO_BYTES 1 + +/* Defined if we try to use freelists for buffer RAM chunks */ +#define ENABLE_BUF_FREELISTS 1 + +/* Defined if we default to host local appdata paths on Windows */ +/* #undef ENABLE_LOCAL_APPDATA */ + +/* Defined if we will try to use multithreading */ +#define ENABLE_THREADS 1 + +/* Define if enum is always signed */ +/* #undef ENUM_VALS_ARE_SIGNED */ + +/* Define to nothing if C supports flexible array members, and to 1 if it does + not. That way, with a declaration like `struct s { int n; double + d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99 + compilers. When computing the size of such an object, don't use 'sizeof + (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)' + instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with + MSVC and with C++ compilers. */ +#define FLEXIBLE_ARRAY_MEMBER /**/ + +/* Define to 1 if you have the `accept4' function. */ +/* #undef HAVE_ACCEPT4 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the `backtrace' function. */ +#define HAVE_BACKTRACE 1 + +/* Define to 1 if you have the `backtrace_symbols_fd' function. */ +#define HAVE_BACKTRACE_SYMBOLS_FD 1 + +/* Defined if the requested minimum BOOST version is satisfied */ +#define HAVE_BOOST 1 + +/* Define to 1 if you have */ +#define HAVE_BOOST_FILESYSTEM_PATH_HPP 1 + +/* Define to 1 if you have */ +#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +/* #undef HAVE_CLOCK_GETTIME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CRT_EXTERNS_H 1 + +/* Define to 1 if you have the header file. + */ +/* #undef HAVE_CRYPTO_SCALARMULT_CURVE25519_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CYGWIN_SIGNAL_H */ + +/* Define to 1 if you have the declaration of `mlockall', and to 0 if you + don't. */ +#define HAVE_DECL_MLOCKALL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DMALLOC_H */ + +/* Define to 1 if you have the `dmalloc_strdup' function. */ +/* #undef HAVE_DMALLOC_STRDUP */ + +/* Define to 1 if you have the `dmalloc_strndup' function. */ +/* #undef HAVE_DMALLOC_STRNDUP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the `evdns_set_outgoing_bind_address' function. */ +/* #undef HAVE_EVDNS_SET_OUTGOING_BIND_ADDRESS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_BUFFEREVENT_SSL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_DNS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_EVENT_H 1 + +/* Define to 1 if you have the `event_base_loopexit' function. */ +#define HAVE_EVENT_BASE_LOOPEXIT 1 + +/* Define to 1 if you have the `event_get_method' function. */ +#define HAVE_EVENT_GET_METHOD 1 + +/* Define to 1 if you have the `event_get_version' function. */ +#define HAVE_EVENT_GET_VERSION 1 + +/* Define to 1 if you have the `event_get_version_number' function. */ +#define HAVE_EVENT_GET_VERSION_NUMBER 1 + +/* Define to 1 if you have the `event_set_log_callback' function. */ +#define HAVE_EVENT_SET_LOG_CALLBACK 1 + +/* Define to 1 if you have the `evutil_secure_rng_set_urandom_device_file' + function. */ +/* #undef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_EXECINFO_H 1 + +/* Defined if we have extern char **environ already declared */ +/* #undef HAVE_EXTERN_ENVIRON_DECLARED */ + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `flock' function. */ +#define HAVE_FLOCK 1 + +/* Define to 1 if you have the `ftime' function. */ +#define HAVE_FTIME 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define this if you have any gethostbyname_r() */ +/* #undef HAVE_GETHOSTBYNAME_R */ + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_6_ARG */ + +/* Define to 1 if you have the `getifaddrs' function. */ +#define HAVE_GETIFADDRS 1 + +/* Define to 1 if you have the `getresgid' function. */ +/* #undef HAVE_GETRESGID */ + +/* Define to 1 if you have the `getresuid' function. */ +/* #undef HAVE_GETRESUID */ + +/* Define to 1 if you have the `getrlimit' function. */ +#define HAVE_GETRLIMIT 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_IFADDRS_H 1 + +/* Define to 1 if you have the `inet_aton' function. */ +#define HAVE_INET_ATON 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `ioctl' function. */ +#define HAVE_IOCTL 1 + +/* Define to 1 if you have the `issetugid' function. */ +#define HAVE_ISSETUGID 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_NETFILTER_IPV4_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LINUX_TYPES_H */ + +/* Define to 1 if you have the `llround' function. */ +#define HAVE_LLROUND 1 + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define to 1 if you have the `lround' function. */ +#define HAVE_LROUND 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MACHINE_LIMITS_H 1 + +/* Defined if the compiler supports __FUNCTION__ */ +#define HAVE_MACRO__FUNCTION__ 1 + +/* Defined if the compiler supports __FUNC__ */ +/* #undef HAVE_MACRO__FUNC__ */ + +/* Defined if the compiler supports __func__ */ +#define HAVE_MACRO__func__ 1 + +/* Define to 1 if you have the `mallinfo' function. */ +/* #undef HAVE_MALLINFO */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_NP_H */ + +/* Define to 1 if you have the `memmem' function. */ +#define HAVE_MEMMEM 0 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mlockall' function. */ +#define HAVE_MLOCKALL 1 + +/* Define to 1 if you have the header + file. */ +/* #undef HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_IN6_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NET_IF_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NET_PFVAR_H */ + +/* Define to 1 if you have the `prctl' function. */ +/* #undef HAVE_PRCTL */ + +/* Define to 1 if you have the `pthread_create' function. */ +#define HAVE_PTHREAD_CREATE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the `rint' function. */ +#define HAVE_RINT 1 + +/* Define to 1 if the system has the type `rlim_t'. */ +#define HAVE_RLIM_T 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +#define HAVE_SA_FAMILY_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SECCOMP_H */ + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `socketpair' function. */ +#define HAVE_SOCKETPAIR 1 + +/* Define to 1 if the system has the type `ssize_t'. */ +#define HAVE_SSIZE_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcat' function. */ +#define HAVE_STRLCAT 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#define HAVE_STRLCPY 1 + +/* Define to 1 if you have the `strptime' function. */ +#define HAVE_STRPTIME 1 + +/* Define to 1 if you have the `strtok_r' function. */ +#define HAVE_STRTOK_R 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if `min_heap_idx' is a member of `struct event'. */ +/* #undef HAVE_STRUCT_EVENT_MIN_HEAP_IDX */ + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ +/* #undef HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */ + +/* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ +/* #undef HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */ + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1 + +/* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ +#define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1 + +/* Define to 1 if `tv_sec' is a member of `struct timeval'. */ +#define HAVE_STRUCT_TIMEVAL_TV_SEC 1 + +/* Define to 1 if you have the `sysconf' function. */ +#define HAVE_SYSCONF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_LIMITS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PRCTL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSLIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UCONTEXT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UTIME_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UCONTEXT_H */ + +/* Define to 1 if the system has the type `uint'. */ +#define HAVE_UINT 1 + +/* Define to 1 if you have the `uname' function. */ +#define HAVE_UNAME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Define to 1 if the system has the type `u_char'. */ +#define HAVE_U_CHAR 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define HAVE_VASPRINTF 1 + +/* Define to 1 if you have the `_NSGetEnviron' function. */ +#define HAVE__NSGETENVIRON 1 + +/* Define to 1 if you have the `_vscprintf' function. */ +/* #undef HAVE__VSCPRINTF */ + +/* Defined if we want to keep track of how much of each kind of resource we + download. */ +/* #undef INSTRUMENT_DOWNLOADS */ + +/* name of the syslog facility */ +#define LOGFACILITY LOG_DAEMON + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 iff malloc(0) returns a pointer */ +#define MALLOC_ZERO_WORKS 1 + +/* Define to 1 if we are building with UPnP. */ +/* #undef MINIUPNPC */ + +/* libminiupnpc version 1.5 found */ +/* #undef MINIUPNPC15 */ + +/* Define to 1 if we are building with nat-pmp. */ +/* #undef NAT_PMP */ + +/* Define to 1 iff memset(0) sets pointers to NULL */ +#define NULL_REP_IS_ZERO_BYTES 1 + +/* "Define to handle pf on OpenBSD properly" */ +/* #undef OPENBSD */ + +/* Name of package */ +#define PACKAGE "tor" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "tor" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "tor 0.2.5.1-alpha-dev" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "tor" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.2.5.1-alpha-dev" + +/* How to access the PC from a struct ucontext */ +#define PC_FROM_UCONTEXT uc_mcontext->__ss.__rip + +/* Define to 1 iff right-shifting a negative value performs sign-extension */ +#define RSHIFT_DOES_SIGN_EXTEND 1 + +/* The size of `cell_t', as computed by sizeof. */ +#define SIZEOF_CELL_T 0 + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `int16_t', as computed by sizeof. */ +#define SIZEOF_INT16_T 2 + +/* The size of `int32_t', as computed by sizeof. */ +#define SIZEOF_INT32_T 4 + +/* The size of `int64_t', as computed by sizeof. */ +#define SIZEOF_INT64_T 8 + +/* The size of `int8_t', as computed by sizeof. */ +#define SIZEOF_INT8_T 1 + +/* The size of `intptr_t', as computed by sizeof. */ +#define SIZEOF_INTPTR_T 8 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of `pid_t', as computed by sizeof. */ +#define SIZEOF_PID_T 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* The size of `socklen_t', as computed by sizeof. */ +#define SIZEOF_SOCKLEN_T 4 + +/* The size of `time_t', as computed by sizeof. */ +#define SIZEOF_TIME_T 8 + +/* The size of `uint16_t', as computed by sizeof. */ +#define SIZEOF_UINT16_T 2 + +/* The size of `uint32_t', as computed by sizeof. */ +#define SIZEOF_UINT32_T 4 + +/* The size of `uint64_t', as computed by sizeof. */ +#define SIZEOF_UINT64_T 8 + +/* The size of `uint8_t', as computed by sizeof. */ +#define SIZEOF_UINT8_T 1 + +/* The size of `uintptr_t', as computed by sizeof. */ +#define SIZEOF_UINTPTR_T 8 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +/* The size of `__int64', as computed by sizeof. */ +#define SIZEOF___INT64 0 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if time_t is signed */ +#define TIME_T_IS_SIGNED 1 + +/* Defined if we're going to use Libevent's buffered IO API */ +/* #undef USE_BUFFEREVENTS */ + +/* Defined if we should use an internal curve25519_donna{,_c64} implementation + */ +#define USE_CURVE25519_DONNA 1 + +/* Defined if we should use a curve25519 from nacl */ +/* #undef USE_CURVE25519_NACL */ + +/* Debug memory allocation library */ +/* #undef USE_DMALLOC */ + +/* "Define to enable transparent proxy support" */ +/* #undef USE_TRANSPARENT */ + +/* Define to 1 iff we represent negative integers with two's complement */ +#define USING_TWOS_COMPLEMENT 1 + +/* Version number of package */ +#define VERSION "0.2.5.1-alpha-dev" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define on some platforms to activate x_r() functions in time.h */ +/* #undef _REENTRANT */ + +/* Define to `unsigned short' if does not define. */ +/* #undef u_int16_t */ + +/* Define to `unsigned long' if does not define. */ +/* #undef u_int32_t */ + +/* Define to `unsigned long long' if does not define. */ +/* #undef u_int64_t */ + +/* Define to `unsigned char' if does not define. */ +/* #undef u_int8_t */ diff --git a/src/tor/orconfig_linux.h b/src/tor/orconfig_linux.h new file mode 100644 index 000000000..c05ac86e9 --- /dev/null +++ b/src/tor/orconfig_linux.h @@ -0,0 +1,621 @@ +/* orconfig.h. Generated from orconfig.h.in by configure. */ +/* orconfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* tor's configuration directory */ +#define CONFDIR "/usr/local/etc/tor" + +/* Defined if we have a curve25519 implementation */ +#define CURVE25519_ENABLED 1 + +/* Enable dmalloc's malloc function check */ +/* #undef DMALLOC_FUNC_CHECK */ + +/* Define to 1 iff memset(0) sets doubles to 0.0 */ +#define DOUBLE_0_REP_IS_ZERO_BYTES 1 + +/* Defined if we try to use freelists for buffer RAM chunks */ +#define ENABLE_BUF_FREELISTS 1 + +/* Defined if we default to host local appdata paths on Windows */ +/* #undef ENABLE_LOCAL_APPDATA */ + +/* Defined if we will try to use multithreading */ +#define ENABLE_THREADS 1 + +/* Define if enum is always signed */ +/* #undef ENUM_VALS_ARE_SIGNED */ + +/* Define to nothing if C supports flexible array members, and to 1 if it does + not. That way, with a declaration like `struct s { int n; double + d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99 + compilers. When computing the size of such an object, don't use 'sizeof + (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)' + instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with + MSVC and with C++ compilers. */ +#define FLEXIBLE_ARRAY_MEMBER /**/ + +/* Define to 1 if you have the `accept4' function. */ +#define HAVE_ACCEPT4 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the `backtrace' function. */ +#define HAVE_BACKTRACE 1 + +/* Define to 1 if you have the `backtrace_symbols_fd' function. */ +#define HAVE_BACKTRACE_SYMBOLS_FD 1 + +/* Defined if the requested minimum BOOST version is satisfied */ +#define HAVE_BOOST 1 + +/* Define to 1 if you have */ +#define HAVE_BOOST_FILESYSTEM_PATH_HPP 1 + +/* Define to 1 if you have */ +#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +#define HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CRT_EXTERNS_H */ + +/* Define to 1 if you have the header file. + */ +/* #undef HAVE_CRYPTO_SCALARMULT_CURVE25519_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CYGWIN_SIGNAL_H */ + +/* Define to 1 if you have the declaration of `mlockall', and to 0 if you + don't. */ +#define HAVE_DECL_MLOCKALL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DMALLOC_H */ + +/* Define to 1 if you have the `dmalloc_strdup' function. */ +/* #undef HAVE_DMALLOC_STRDUP */ + +/* Define to 1 if you have the `dmalloc_strndup' function. */ +/* #undef HAVE_DMALLOC_STRNDUP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the `evdns_set_outgoing_bind_address' function. */ +/* #undef HAVE_EVDNS_SET_OUTGOING_BIND_ADDRESS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_BUFFEREVENT_SSL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_DNS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EVENT2_EVENT_H 1 + +/* Define to 1 if you have the `event_base_loopexit' function. */ +#define HAVE_EVENT_BASE_LOOPEXIT 1 + +/* Define to 1 if you have the `event_get_method' function. */ +#define HAVE_EVENT_GET_METHOD 1 + +/* Define to 1 if you have the `event_get_version' function. */ +#define HAVE_EVENT_GET_VERSION 1 + +/* Define to 1 if you have the `event_get_version_number' function. */ +#define HAVE_EVENT_GET_VERSION_NUMBER 1 + +/* Define to 1 if you have the `event_set_log_callback' function. */ +#define HAVE_EVENT_SET_LOG_CALLBACK 1 + +/* Define to 1 if you have the `evutil_secure_rng_set_urandom_device_file' + function. */ +/* #undef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_EXECINFO_H 1 + +/* Defined if we have extern char **environ already declared */ +#define HAVE_EXTERN_ENVIRON_DECLARED 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `flock' function. */ +#define HAVE_FLOCK 1 + +/* Define to 1 if you have the `ftime' function. */ +#define HAVE_FTIME 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define this if you have any gethostbyname_r() */ +#define HAVE_GETHOSTBYNAME_R 1 + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +#define HAVE_GETHOSTBYNAME_R_6_ARG 1 + +/* Define to 1 if you have the `getifaddrs' function. */ +#define HAVE_GETIFADDRS 1 + +/* Define to 1 if you have the `getresgid' function. */ +#define HAVE_GETRESGID 1 + +/* Define to 1 if you have the `getresuid' function. */ +#define HAVE_GETRESUID 1 + +/* Define to 1 if you have the `getrlimit' function. */ +#define HAVE_GETRLIMIT 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_IFADDRS_H 1 + +/* Define to 1 if you have the `inet_aton' function. */ +#define HAVE_INET_ATON 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `ioctl' function. */ +#define HAVE_IOCTL 1 + +/* Define to 1 if you have the `issetugid' function. */ +/* #undef HAVE_ISSETUGID */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LINUX_NETFILTER_IPV4_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LINUX_TYPES_H 1 + +/* Define to 1 if you have the `llround' function. */ +/* #undef HAVE_LLROUND */ + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define to 1 if you have the `lround' function. */ +/* #undef HAVE_LROUND */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACHINE_LIMITS_H */ + +/* Defined if the compiler supports __FUNCTION__ */ +#define HAVE_MACRO__FUNCTION__ 1 + +/* Defined if the compiler supports __FUNC__ */ +/* #undef HAVE_MACRO__FUNC__ */ + +/* Defined if the compiler supports __func__ */ +#define HAVE_MACRO__func__ 1 + +/* Define to 1 if you have the `mallinfo' function. */ +#define HAVE_MALLINFO 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_NP_H */ + +/* Define to 1 if you have the `memmem' function. */ +#define HAVE_MEMMEM 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mlockall' function. */ +#define HAVE_MLOCKALL 1 + +/* Define to 1 if you have the header + file. */ +/* #undef HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_IN6_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NET_IF_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NET_PFVAR_H */ + +/* Define to 1 if you have the `prctl' function. */ +#define HAVE_PRCTL 1 + +/* Define to 1 if you have the `pthread_create' function. */ +#define HAVE_PTHREAD_CREATE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the `rint' function. */ +/* #undef HAVE_RINT */ + +/* Define to 1 if the system has the type `rlim_t'. */ +#define HAVE_RLIM_T 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +#define HAVE_SA_FAMILY_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SECCOMP_H */ + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `socketpair' function. */ +#define HAVE_SOCKETPAIR 1 + +/* Define to 1 if the system has the type `ssize_t'. */ +#define HAVE_SSIZE_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcat' function. */ +/* #undef HAVE_STRLCAT */ + +/* Define to 1 if you have the `strlcpy' function. */ +/* #undef HAVE_STRLCPY */ + +/* Define to 1 if you have the `strptime' function. */ +#define HAVE_STRPTIME 1 + +/* Define to 1 if you have the `strtok_r' function. */ +#define HAVE_STRTOK_R 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if `min_heap_idx' is a member of `struct event'. */ +/* #undef HAVE_STRUCT_EVENT_MIN_HEAP_IDX */ + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1 + +/* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1 + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ +/* #undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */ + +/* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ +/* #undef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ + +/* Define to 1 if `tv_sec' is a member of `struct timeval'. */ +#define HAVE_STRUCT_TIMEVAL_TV_SEC 1 + +/* Define to 1 if you have the `sysconf' function. */ +#define HAVE_SYSCONF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_LIMITS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PRCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSLIMITS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UCONTEXT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UTIME_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UCONTEXT_H 1 + +/* Define to 1 if the system has the type `uint'. */ +#define HAVE_UINT 1 + +/* Define to 1 if you have the `uname' function. */ +#define HAVE_UNAME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Define to 1 if the system has the type `u_char'. */ +#define HAVE_U_CHAR 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define HAVE_VASPRINTF 1 + +/* Define to 1 if you have the `_NSGetEnviron' function. */ +/* #undef HAVE__NSGETENVIRON */ + +/* Define to 1 if you have the `_vscprintf' function. */ +/* #undef HAVE__VSCPRINTF */ + +/* Defined if we want to keep track of how much of each kind of resource we + download. */ +/* #undef INSTRUMENT_DOWNLOADS */ + +/* name of the syslog facility */ +#define LOGFACILITY LOG_DAEMON + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 iff malloc(0) returns a pointer */ +#define MALLOC_ZERO_WORKS 1 + +/* Define to 1 if we are building with UPnP. */ +/* #undef MINIUPNPC */ + +/* libminiupnpc version 1.5 found */ +/* #undef MINIUPNPC15 */ + +/* Define to 1 if we are building with nat-pmp. */ +/* #undef NAT_PMP */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define to 1 iff memset(0) sets pointers to NULL */ +#define NULL_REP_IS_ZERO_BYTES 1 + +/* "Define to handle pf on OpenBSD properly" */ +/* #undef OPENBSD */ + +/* Name of package */ +#define PACKAGE "tor" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "tor" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "tor 0.2.5.1-alpha-dev" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "tor" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.2.5.1-alpha-dev" + +/* How to access the PC from a struct ucontext */ +/* #define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP] */ + +/* Define to 1 iff right-shifting a negative value performs sign-extension */ +#define RSHIFT_DOES_SIGN_EXTEND 1 + +/* The size of `cell_t', as computed by sizeof. */ +#define SIZEOF_CELL_T 0 + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `int16_t', as computed by sizeof. */ +#define SIZEOF_INT16_T 2 + +/* The size of `int32_t', as computed by sizeof. */ +#define SIZEOF_INT32_T 4 + +/* The size of `int64_t', as computed by sizeof. */ +#define SIZEOF_INT64_T 8 + +/* The size of `int8_t', as computed by sizeof. */ +#define SIZEOF_INT8_T 1 + +/* The size of `intptr_t', as computed by sizeof. */ +#define SIZEOF_INTPTR_T 8 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of `pid_t', as computed by sizeof. */ +#define SIZEOF_PID_T 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* The size of `socklen_t', as computed by sizeof. */ +#define SIZEOF_SOCKLEN_T 4 + +/* The size of `time_t', as computed by sizeof. */ +#define SIZEOF_TIME_T 8 + +/* The size of `uint16_t', as computed by sizeof. */ +#define SIZEOF_UINT16_T 2 + +/* The size of `uint32_t', as computed by sizeof. */ +#define SIZEOF_UINT32_T 4 + +/* The size of `uint64_t', as computed by sizeof. */ +#define SIZEOF_UINT64_T 8 + +/* The size of `uint8_t', as computed by sizeof. */ +#define SIZEOF_UINT8_T 1 + +/* The size of `uintptr_t', as computed by sizeof. */ +#define SIZEOF_UINTPTR_T 8 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +/* The size of `__int64', as computed by sizeof. */ +#define SIZEOF___INT64 0 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if time_t is signed */ +#define TIME_T_IS_SIGNED 1 + +/* Defined if we're going to use Libevent's buffered IO API */ +/* #undef USE_BUFFEREVENTS */ + +/* Defined if we should use an internal curve25519_donna{,_c64} implementation + */ +#define USE_CURVE25519_DONNA 1 + +/* Defined if we should use a curve25519 from nacl */ +/* #undef USE_CURVE25519_NACL */ + +/* Debug memory allocation library */ +/* #undef USE_DMALLOC */ + +/* "Define to enable transparent proxy support" */ +#define USE_TRANSPARENT 1 + +/* Define to 1 iff we represent negative integers with two's complement */ +#define USING_TWOS_COMPLEMENT 1 + +/* Version number of package */ +#define VERSION "0.2.5.1-alpha-dev" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define on some platforms to activate x_r() functions in time.h */ +/* #undef _REENTRANT */ + +/* Define to `unsigned short' if does not define. */ +/* #undef u_int16_t */ + +/* Define to `unsigned long' if does not define. */ +/* #undef u_int32_t */ + +/* Define to `unsigned long long' if does not define. */ +/* #undef u_int64_t */ + +/* Define to `unsigned char' if does not define. */ +/* #undef u_int8_t */ diff --git a/src/tor/src/win32/orconfig.h b/src/tor/orconfig_win32.h similarity index 90% rename from src/tor/src/win32/orconfig.h rename to src/tor/orconfig_win32.h index 5e3c5d87f..0d6fe692b 100644 --- a/src/tor/src/win32/orconfig.h +++ b/src/tor/orconfig_win32.h @@ -14,9 +14,20 @@ /* Define to 1 if you have the header file. */ #define HAVE_CTYPE_H +#define ENABLE_THREADS + /* Define to 1 if you have the header file. */ #define HAVE_ERRNO_H +/* Define to 1 if you have the `event_get_method' function. */ +#define HAVE_EVENT_GET_METHOD 1 + +/* Define to 1 if you have the `event_get_version' function. */ +#define HAVE_EVENT_GET_VERSION 1 + +/* Define to 1 if you have the `event_set_log_callback' function. */ +#define HAVE_EVENT_SET_LOG_CALLBACK 1 + /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H @@ -75,11 +86,18 @@ #define HAVE_STRING_H /* Define to 1 if you have the `strlcat' function. */ +#if defined (WINCE) +#define HAVE_STRLCAT +#else #undef HAVE_STRLCAT +#endif /* Define to 1 if you have the `strlcpy' function. */ +#if defined (WINCE) +#define HAVE_STRLCPY +#else #undef HAVE_STRLCPY - +#endif /* Define to 1 if you have the `strptime' function. */ #undef HAVE_STRPTIME @@ -211,14 +229,19 @@ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS +/* Define to 1 if time_t is signed. */ +#define TIME_T_IS_SIGNED + /* Define to 1 iff unaligned int access is allowed */ #define UNALIGNED_INT_ACCESS_OK +#define HAVE_EVENT_H + /* Define to 1 iff we represent negative integers with two's complement */ #define USING_TWOS_COMPLEMENT /* Version number of package */ -#define VERSION "0.3.3.0-alpha-dev" +#define VERSION "0.2.5.1-alpha-dev" @@ -226,20 +249,11 @@ #define HAVE_STRUCT_IN6_ADDR #define RSHIFT_DOES_SIGN_EXTEND #define FLEXIBLE_ARRAY_MEMBER 0 +#define HAVE_EVENT2_EVENT_H #define SHARE_DATADIR "" +#define HAVE_EVENT2_DNS_H +#define HAVE_EVENT_BASE_LOOPEXIT +#define CURVE25519_ENABLED #define USE_CURVE25519_DONNA #define ENUM_VALS_ARE_SIGNED 1 - -#ifndef STDOUT_FILENO -#define STDOUT_FILENO 1 -#endif - -#ifndef STDERR_FILENO -#define STDERR_FILENO 2 -#endif - -#define WINVER 0x0501 -#define _WIN32_WINNT 0x0501 -#define WIN32_LEAN_AND_MEAN 1 - diff --git a/src/tor/policies.c b/src/tor/policies.c new file mode 100644 index 000000000..be4da5506 --- /dev/null +++ b/src/tor/policies.c @@ -0,0 +1,1758 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file policies.c + * \brief Code to parse and use address policies and exit policies. + **/ + +#include "or.h" +#include "config.h" +#include "dirserv.h" +#include "nodelist.h" +#include "policies.h" +#include "routerparse.h" +#include "geoip.h" +#include "ht.h" + +/** Policy that addresses for incoming SOCKS connections must match. */ +static smartlist_t *socks_policy = NULL; +/** Policy that addresses for incoming directory connections must match. */ +static smartlist_t *dir_policy = NULL; +/** Policy that addresses for incoming router descriptors must match in order + * to be published by us. */ +static smartlist_t *authdir_reject_policy = NULL; +/** Policy that addresses for incoming router descriptors must match in order + * to be marked as valid in our networkstatus. */ +static smartlist_t *authdir_invalid_policy = NULL; +/** Policy that addresses for incoming router descriptors must not + * match in order to not be marked as BadDirectory. */ +static smartlist_t *authdir_baddir_policy = NULL; +/** Policy that addresses for incoming router descriptors must not + * match in order to not be marked as BadExit. */ +static smartlist_t *authdir_badexit_policy = NULL; + +/** Parsed addr_policy_t describing which addresses we believe we can start + * circuits at. */ +static smartlist_t *reachable_or_addr_policy = NULL; +/** Parsed addr_policy_t describing which addresses we believe we can connect + * to directories at. */ +static smartlist_t *reachable_dir_addr_policy = NULL; + +/** Element of an exit policy summary */ +typedef struct policy_summary_item_t { + uint16_t prt_min; /**< Lowest port number to accept/reject. */ + uint16_t prt_max; /**< Highest port number to accept/reject. */ + uint64_t reject_count; /**< Number of IP-Addresses that are rejected to + this port range. */ + unsigned int accepted:1; /** Has this port already been accepted */ +} policy_summary_item_t; + +/** Private networks. This list is used in two places, once to expand the + * "private" keyword when parsing our own exit policy, secondly to ignore + * just such networks when building exit policy summaries. It is important + * that all authorities agree on that list when creating summaries, so don't + * just change this without a proper migration plan and a proposal and stuff. + */ +static const char *private_nets[] = { + "0.0.0.0/8", "169.254.0.0/16", + "127.0.0.0/8", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12", + "[::]/8", + "[fc00::]/7", "[fe80::]/10", "[fec0::]/10", "[ff00::]/8", "[::]/127", + NULL +}; + +/** Replace all "private" entries in *policy with their expanded + * equivalents. */ +void +policy_expand_private(smartlist_t **policy) +{ + uint16_t port_min, port_max; + + int i; + smartlist_t *tmp; + + if (!*policy) /*XXXX disallow NULL policies? */ + return; + + tmp = smartlist_new(); + + SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, p) { + if (! p->is_private) { + smartlist_add(tmp, p); + continue; + } + for (i = 0; private_nets[i]; ++i) { + addr_policy_t newpolicy; + memcpy(&newpolicy, p, sizeof(addr_policy_t)); + newpolicy.is_private = 0; + newpolicy.is_canonical = 0; + if (tor_addr_parse_mask_ports(private_nets[i], 0, + &newpolicy.addr, + &newpolicy.maskbits, &port_min, &port_max)<0) { + tor_assert(0); + } + smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy)); + } + addr_policy_free(p); + } SMARTLIST_FOREACH_END(p); + + smartlist_free(*policy); + *policy = tmp; +} + +/** Expand each of the AF_UNSPEC elements in *policy (which indicate + * protocol-neutral wildcards) into a pair of wildcard elements: one IPv4- + * specific and one IPv6-specific. */ +void +policy_expand_unspec(smartlist_t **policy) +{ + smartlist_t *tmp; + if (!*policy) + return; + + tmp = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, p) { + sa_family_t family = tor_addr_family(&p->addr); + if (family == AF_INET6 || family == AF_INET || p->is_private) { + smartlist_add(tmp, p); + } else if (family == AF_UNSPEC) { + addr_policy_t newpolicy_ipv4; + addr_policy_t newpolicy_ipv6; + memcpy(&newpolicy_ipv4, p, sizeof(addr_policy_t)); + memcpy(&newpolicy_ipv6, p, sizeof(addr_policy_t)); + newpolicy_ipv4.is_canonical = 0; + newpolicy_ipv6.is_canonical = 0; + if (p->maskbits != 0) { + log_warn(LD_BUG, "AF_UNSPEC policy with maskbits==%d", p->maskbits); + newpolicy_ipv4.maskbits = 0; + newpolicy_ipv6.maskbits = 0; + } + tor_addr_from_ipv4h(&newpolicy_ipv4.addr, 0); + tor_addr_from_ipv6_bytes(&newpolicy_ipv6.addr, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); + smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy_ipv4)); + smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy_ipv6)); + addr_policy_free(p); + } else { + log_warn(LD_BUG, "Funny-looking address policy with family %d", family); + smartlist_add(tmp, p); + } + } SMARTLIST_FOREACH_END(p); + + smartlist_free(*policy); + *policy = tmp; +} + +/** + * Given a linked list of config lines containing "allow" and "deny" + * tokens, parse them and append the result to dest. Return -1 + * if any tokens are malformed (and don't append any), else return 0. + * + * If assume_action is nonnegative, then insert its action + * (ADDR_POLICY_ACCEPT or ADDR_POLICY_REJECT) for items that specify no + * action. + */ +static int +parse_addr_policy(config_line_t *cfg, smartlist_t **dest, + int assume_action) +{ + smartlist_t *result; + smartlist_t *entries; + addr_policy_t *item; + int r = 0; + + if (!cfg) + return 0; + + result = smartlist_new(); + entries = smartlist_new(); + for (; cfg; cfg = cfg->next) { + smartlist_split_string(entries, cfg->value, ",", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + SMARTLIST_FOREACH_BEGIN(entries, const char *, ent) { + log_debug(LD_CONFIG,"Adding new entry '%s'",ent); + item = router_parse_addr_policy_item_from_string(ent, assume_action); + if (item) { + smartlist_add(result, item); + } else { + log_warn(LD_CONFIG,"Malformed policy '%s'.", ent); + r = -1; + } + } SMARTLIST_FOREACH_END(ent); + SMARTLIST_FOREACH(entries, char *, ent, tor_free(ent)); + smartlist_clear(entries); + } + smartlist_free(entries); + if (r == -1) { + addr_policy_list_free(result); + } else { + policy_expand_private(&result); + policy_expand_unspec(&result); + + if (*dest) { + smartlist_add_all(*dest, result); + smartlist_free(result); + } else { + *dest = result; + } + } + + return r; +} + +/** Helper: parse the Reachable(Dir|OR)?Addresses fields into + * reachable_(or|dir)_addr_policy. The options should already have + * been validated by validate_addr_policies. + */ +static int +parse_reachable_addresses(void) +{ + const or_options_t *options = get_options(); + int ret = 0; + + if (options->ReachableDirAddresses && + options->ReachableORAddresses && + options->ReachableAddresses) { + log_warn(LD_CONFIG, + "Both ReachableDirAddresses and ReachableORAddresses are set. " + "ReachableAddresses setting will be ignored."); + } + addr_policy_list_free(reachable_or_addr_policy); + reachable_or_addr_policy = NULL; + if (!options->ReachableORAddresses && options->ReachableAddresses) + log_info(LD_CONFIG, + "Using ReachableAddresses as ReachableORAddresses."); + if (parse_addr_policy(options->ReachableORAddresses ? + options->ReachableORAddresses : + options->ReachableAddresses, + &reachable_or_addr_policy, ADDR_POLICY_ACCEPT)) { + log_warn(LD_CONFIG, + "Error parsing Reachable%sAddresses entry; ignoring.", + options->ReachableORAddresses ? "OR" : ""); + ret = -1; + } + + addr_policy_list_free(reachable_dir_addr_policy); + reachable_dir_addr_policy = NULL; + if (!options->ReachableDirAddresses && options->ReachableAddresses) + log_info(LD_CONFIG, + "Using ReachableAddresses as ReachableDirAddresses"); + if (parse_addr_policy(options->ReachableDirAddresses ? + options->ReachableDirAddresses : + options->ReachableAddresses, + &reachable_dir_addr_policy, ADDR_POLICY_ACCEPT)) { + if (options->ReachableDirAddresses) + log_warn(LD_CONFIG, + "Error parsing ReachableDirAddresses entry; ignoring."); + ret = -1; + } + return ret; +} + +/** Return true iff the firewall options might block any address:port + * combination. + */ +int +firewall_is_fascist_or(void) +{ + return reachable_or_addr_policy != NULL; +} + +/** Return true iff policy (possibly NULL) will allow a + * connection to addr:port. + */ +static int +addr_policy_permits_tor_addr(const tor_addr_t *addr, uint16_t port, + smartlist_t *policy) +{ + addr_policy_result_t p; + p = compare_tor_addr_to_addr_policy(addr, port, policy); + switch (p) { + case ADDR_POLICY_PROBABLY_ACCEPTED: + case ADDR_POLICY_ACCEPTED: + return 1; + case ADDR_POLICY_PROBABLY_REJECTED: + case ADDR_POLICY_REJECTED: + return 0; + default: + log_warn(LD_BUG, "Unexpected result: %d", (int)p); + return 0; + } +} + +/** Return true iff policy (possibly NULL) will allow a connection to + * addr:port. addr is an IPv4 address given in host + * order. */ +/* XXXX deprecate when possible. */ +static int +addr_policy_permits_address(uint32_t addr, uint16_t port, + smartlist_t *policy) +{ + tor_addr_t a; + tor_addr_from_ipv4h(&a, addr); + return addr_policy_permits_tor_addr(&a, port, policy); +} + +/** Return true iff we think our firewall will let us make an OR connection to + * addr:port. */ +int +fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port) +{ + return addr_policy_permits_tor_addr(addr, port, + reachable_or_addr_policy); +} + +/** Return true iff we think our firewall will let us make an OR connection to + * ri. */ +int +fascist_firewall_allows_or(const routerinfo_t *ri) +{ + /* XXXX proposal 118 */ + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, ri->addr); + return fascist_firewall_allows_address_or(&addr, ri->or_port); +} + +/** Return true iff we think our firewall will let us make an OR connection to + * node. */ +int +fascist_firewall_allows_node(const node_t *node) +{ + if (node->ri) { + return fascist_firewall_allows_or(node->ri); + } else if (node->rs) { + tor_addr_t addr; + tor_addr_from_ipv4h(&addr, node->rs->addr); + return fascist_firewall_allows_address_or(&addr, node->rs->or_port); + } else { + return 1; + } +} + +/** Return true iff we think our firewall will let us make a directory + * connection to addr:port. */ +int +fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port) +{ + return addr_policy_permits_tor_addr(addr, port, + reachable_dir_addr_policy); +} + +/** Return 1 if addr is permitted to connect to our dir port, + * based on dir_policy. Else return 0. + */ +int +dir_policy_permits_address(const tor_addr_t *addr) +{ + return addr_policy_permits_tor_addr(addr, 1, dir_policy); +} + +/** Return 1 if addr is permitted to connect to our socks port, + * based on socks_policy. Else return 0. + */ +int +socks_policy_permits_address(const tor_addr_t *addr) +{ + return addr_policy_permits_tor_addr(addr, 1, socks_policy); +} + +/** Return true iff the address addr is in a country listed in the + * case-insensitive list of country codes cc_list. */ +static int +addr_is_in_cc_list(uint32_t addr, const smartlist_t *cc_list) +{ + country_t country; + const char *name; + tor_addr_t tar; + + if (!cc_list) + return 0; + /* XXXXipv6 */ + tor_addr_from_ipv4h(&tar, addr); + country = geoip_get_country_by_addr(&tar); + name = geoip_get_country_name(country); + return smartlist_contains_string_case(cc_list, name); +} + +/** Return 1 if addr:port is permitted to publish to our + * directory, based on authdir_reject_policy. Else return 0. + */ +int +authdir_policy_permits_address(uint32_t addr, uint16_t port) +{ + if (! addr_policy_permits_address(addr, port, authdir_reject_policy)) + return 0; + return !addr_is_in_cc_list(addr, get_options()->AuthDirRejectCCs); +} + +/** Return 1 if addr:port is considered valid in our + * directory, based on authdir_invalid_policy. Else return 0. + */ +int +authdir_policy_valid_address(uint32_t addr, uint16_t port) +{ + if (! addr_policy_permits_address(addr, port, authdir_invalid_policy)) + return 0; + return !addr_is_in_cc_list(addr, get_options()->AuthDirInvalidCCs); +} + +/** Return 1 if addr:port should be marked as a bad dir, + * based on authdir_baddir_policy. Else return 0. + */ +int +authdir_policy_baddir_address(uint32_t addr, uint16_t port) +{ + if (! addr_policy_permits_address(addr, port, authdir_baddir_policy)) + return 1; + return addr_is_in_cc_list(addr, get_options()->AuthDirBadDirCCs); +} + +/** Return 1 if addr:port should be marked as a bad exit, + * based on authdir_badexit_policy. Else return 0. + */ +int +authdir_policy_badexit_address(uint32_t addr, uint16_t port) +{ + if (! addr_policy_permits_address(addr, port, authdir_badexit_policy)) + return 1; + return addr_is_in_cc_list(addr, get_options()->AuthDirBadExitCCs); +} + +#define REJECT(arg) \ + STMT_BEGIN *msg = tor_strdup(arg); goto err; STMT_END + +/** Config helper: If there's any problem with the policy configuration + * options in options, return -1 and set msg to a newly + * allocated description of the error. Else return 0. */ +int +validate_addr_policies(const or_options_t *options, char **msg) +{ + /* XXXX Maybe merge this into parse_policies_from_options, to make sure + * that the two can't go out of sync. */ + + smartlist_t *addr_policy=NULL; + *msg = NULL; + + if (policies_parse_exit_policy(options->ExitPolicy, &addr_policy, + options->IPv6Exit, + options->ExitPolicyRejectPrivate, NULL, + !options->BridgeRelay)) + REJECT("Error in ExitPolicy entry."); + + /* The rest of these calls *append* to addr_policy. So don't actually + * use the results for anything other than checking if they parse! */ + if (parse_addr_policy(options->DirPolicy, &addr_policy, -1)) + REJECT("Error in DirPolicy entry."); + if (parse_addr_policy(options->SocksPolicy, &addr_policy, -1)) + REJECT("Error in SocksPolicy entry."); + if (parse_addr_policy(options->AuthDirReject, &addr_policy, + ADDR_POLICY_REJECT)) + REJECT("Error in AuthDirReject entry."); + if (parse_addr_policy(options->AuthDirInvalid, &addr_policy, + ADDR_POLICY_REJECT)) + REJECT("Error in AuthDirInvalid entry."); + if (parse_addr_policy(options->AuthDirBadDir, &addr_policy, + ADDR_POLICY_REJECT)) + REJECT("Error in AuthDirBadDir entry."); + if (parse_addr_policy(options->AuthDirBadExit, &addr_policy, + ADDR_POLICY_REJECT)) + REJECT("Error in AuthDirBadExit entry."); + + if (parse_addr_policy(options->ReachableAddresses, &addr_policy, + ADDR_POLICY_ACCEPT)) + REJECT("Error in ReachableAddresses entry."); + if (parse_addr_policy(options->ReachableORAddresses, &addr_policy, + ADDR_POLICY_ACCEPT)) + REJECT("Error in ReachableORAddresses entry."); + if (parse_addr_policy(options->ReachableDirAddresses, &addr_policy, + ADDR_POLICY_ACCEPT)) + REJECT("Error in ReachableDirAddresses entry."); + + err: + addr_policy_list_free(addr_policy); + return *msg ? -1 : 0; +#undef REJECT +} + +/** Parse string in the same way that the exit policy + * is parsed, and put the processed version in *policy. + * Ignore port specifiers. + */ +static int +load_policy_from_option(config_line_t *config, smartlist_t **policy, + int assume_action) +{ + int r; + addr_policy_list_free(*policy); + *policy = NULL; + r = parse_addr_policy(config, policy, assume_action); + if (r < 0) { + return -1; + } + if (*policy) { + SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, n) { + /* ports aren't used in these. */ + if (n->prt_min > 1 || n->prt_max != 65535) { + addr_policy_t newp, *c; + memcpy(&newp, n, sizeof(newp)); + newp.prt_min = 1; + newp.prt_max = 65535; + newp.is_canonical = 0; + c = addr_policy_get_canonical_entry(&newp); + SMARTLIST_REPLACE_CURRENT(*policy, n, c); + addr_policy_free(n); + } + } SMARTLIST_FOREACH_END(n); + } + return 0; +} + +/** Set all policies based on options, which should have been validated + * first by validate_addr_policies. */ +int +policies_parse_from_options(const or_options_t *options) +{ + int ret = 0; + if (load_policy_from_option(options->SocksPolicy, &socks_policy, -1) < 0) + ret = -1; + if (load_policy_from_option(options->DirPolicy, &dir_policy, -1) < 0) + ret = -1; + if (load_policy_from_option(options->AuthDirReject, + &authdir_reject_policy, ADDR_POLICY_REJECT) < 0) + ret = -1; + if (load_policy_from_option(options->AuthDirInvalid, + &authdir_invalid_policy, ADDR_POLICY_REJECT) < 0) + ret = -1; + if (load_policy_from_option(options->AuthDirBadDir, + &authdir_baddir_policy, ADDR_POLICY_REJECT) < 0) + ret = -1; + if (load_policy_from_option(options->AuthDirBadExit, + &authdir_badexit_policy, ADDR_POLICY_REJECT) < 0) + ret = -1; + if (parse_reachable_addresses() < 0) + ret = -1; + return ret; +} + +/** Compare two provided address policy items, and return -1, 0, or 1 + * if the first is less than, equal to, or greater than the second. */ +static int +cmp_single_addr_policy(addr_policy_t *a, addr_policy_t *b) +{ + int r; + if ((r=((int)a->policy_type - (int)b->policy_type))) + return r; + if ((r=((int)a->is_private - (int)b->is_private))) + return r; + if ((r=tor_addr_compare(&a->addr, &b->addr, CMP_EXACT))) + return r; + if ((r=((int)a->maskbits - (int)b->maskbits))) + return r; + if ((r=((int)a->prt_min - (int)b->prt_min))) + return r; + if ((r=((int)a->prt_max - (int)b->prt_max))) + return r; + return 0; +} + +/** Like cmp_single_addr_policy() above, but looks at the + * whole set of policies in each case. */ +int +cmp_addr_policies(smartlist_t *a, smartlist_t *b) +{ + int r, i; + int len_a = a ? smartlist_len(a) : 0; + int len_b = b ? smartlist_len(b) : 0; + + for (i = 0; i < len_a && i < len_b; ++i) { + if ((r = cmp_single_addr_policy(smartlist_get(a, i), smartlist_get(b, i)))) + return r; + } + if (i == len_a && i == len_b) + return 0; + if (i < len_a) + return -1; + else + return 1; +} + +/** Node in hashtable used to store address policy entries. */ +typedef struct policy_map_ent_t { + HT_ENTRY(policy_map_ent_t) node; + addr_policy_t *policy; +} policy_map_ent_t; + +/* DOCDOC policy_root */ +static HT_HEAD(policy_map, policy_map_ent_t) policy_root = HT_INITIALIZER(); + +/** Return true iff a and b are equal. */ +static INLINE int +policy_eq(policy_map_ent_t *a, policy_map_ent_t *b) +{ + return cmp_single_addr_policy(a->policy, b->policy) == 0; +} + +/** Return a hashcode for ent */ +static unsigned int +policy_hash(policy_map_ent_t *ent) +{ + addr_policy_t *a = ent->policy; + unsigned int r; + if (a->is_private) + r = 0x1234abcd; + else + r = tor_addr_hash(&a->addr); + r += a->prt_min << 8; + r += a->prt_max << 16; + r += a->maskbits; + if (a->policy_type == ADDR_POLICY_REJECT) + r ^= 0xffffffff; + + return r; +} + +HT_PROTOTYPE(policy_map, policy_map_ent_t, node, policy_hash, + policy_eq) +HT_GENERATE(policy_map, policy_map_ent_t, node, policy_hash, + policy_eq, 0.6, malloc, realloc, free) + +/** Given a pointer to an addr_policy_t, return a copy of the pointer to the + * "canonical" copy of that addr_policy_t; the canonical copy is a single + * reference-counted object. */ +addr_policy_t * +addr_policy_get_canonical_entry(addr_policy_t *e) +{ + policy_map_ent_t search, *found; + if (e->is_canonical) + return e; + + search.policy = e; + found = HT_FIND(policy_map, &policy_root, &search); + if (!found) { + found = tor_malloc_zero(sizeof(policy_map_ent_t)); + found->policy = tor_memdup(e, sizeof(addr_policy_t)); + found->policy->is_canonical = 1; + found->policy->refcnt = 0; + HT_INSERT(policy_map, &policy_root, found); + } + + tor_assert(!cmp_single_addr_policy(found->policy, e)); + ++found->policy->refcnt; + return found->policy; +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * addr and port are both known. */ +static addr_policy_result_t +compare_known_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + /* We know the address and port, and we know the policy, so we can just + * compute an exact match. */ + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + /* Address is known */ + if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, + CMP_EXACT)) { + if (port >= tmpe->prt_min && port <= tmpe->prt_max) { + /* Exact match for the policy */ + return tmpe->policy_type == ADDR_POLICY_ACCEPT ? + ADDR_POLICY_ACCEPTED : ADDR_POLICY_REJECTED; + } + } + } SMARTLIST_FOREACH_END(tmpe); + + /* accept all by default. */ + return ADDR_POLICY_ACCEPTED; +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * addr is known but port is not. */ +static addr_policy_result_t +compare_known_tor_addr_to_addr_policy_noport(const tor_addr_t *addr, + const smartlist_t *policy) +{ + /* We look to see if there's a definite match. If so, we return that + match's value, unless there's an intervening possible match that says + something different. */ + int maybe_accept = 0, maybe_reject = 0; + + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, + CMP_EXACT)) { + if (tmpe->prt_min <= 1 && tmpe->prt_max >= 65535) { + /* Definitely matches, since it covers all ports. */ + if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { + /* If we already hit a clause that might trigger a 'reject', than we + * can't be sure of this certain 'accept'.*/ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : + ADDR_POLICY_ACCEPTED; + } else { + return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : + ADDR_POLICY_REJECTED; + } + } else { + /* Might match. */ + if (tmpe->policy_type == ADDR_POLICY_REJECT) + maybe_reject = 1; + else + maybe_accept = 1; + } + } + } SMARTLIST_FOREACH_END(tmpe); + + /* accept all by default. */ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; +} + +/** Helper for compare_tor_addr_to_addr_policy. Implements the case where + * port is known but address is not. */ +static addr_policy_result_t +compare_unknown_tor_addr_to_addr_policy(uint16_t port, + const smartlist_t *policy) +{ + /* We look to see if there's a definite match. If so, we return that + match's value, unless there's an intervening possible match that says + something different. */ + int maybe_accept = 0, maybe_reject = 0; + + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { + if (tmpe->prt_min <= port && port <= tmpe->prt_max) { + if (tmpe->maskbits == 0) { + /* Definitely matches, since it covers all addresses. */ + if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { + /* If we already hit a clause that might trigger a 'reject', than we + * can't be sure of this certain 'accept'.*/ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : + ADDR_POLICY_ACCEPTED; + } else { + return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : + ADDR_POLICY_REJECTED; + } + } else { + /* Might match. */ + if (tmpe->policy_type == ADDR_POLICY_REJECT) + maybe_reject = 1; + else + maybe_accept = 1; + } + } + } SMARTLIST_FOREACH_END(tmpe); + + /* accept all by default. */ + return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; +} + +/** Decide whether a given addr:port is definitely accepted, + * definitely rejected, probably accepted, or probably rejected by a + * given policy. If addr is 0, we don't know the IP of the + * target address. If port is 0, we don't know the port of the + * target address. (At least one of addr and port must be + * provided. If you want to know whether a policy would definitely reject + * an unknown address:port, use policy_is_reject_star().) + * + * We could do better by assuming that some ranges never match typical + * addresses (127.0.0.1, and so on). But we'll try this for now. + */ +addr_policy_result_t +compare_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, + const smartlist_t *policy) +{ + if (!policy) { + /* no policy? accept all. */ + return ADDR_POLICY_ACCEPTED; + } else if (addr == NULL || tor_addr_is_null(addr)) { + if (port == 0) { + log_info(LD_BUG, "Rejecting null address with 0 port (family %d)", + addr ? tor_addr_family(addr) : -1); + return ADDR_POLICY_REJECTED; + } + return compare_unknown_tor_addr_to_addr_policy(port, policy); + } else if (port == 0) { + return compare_known_tor_addr_to_addr_policy_noport(addr, policy); + } else { + return compare_known_tor_addr_to_addr_policy(addr, port, policy); + } +} + +/** Return true iff the address policy a covers every case that + * would be covered by b, so that a,b is redundant. */ +static int +addr_policy_covers(addr_policy_t *a, addr_policy_t *b) +{ + if (tor_addr_family(&a->addr) != tor_addr_family(&b->addr)) { + /* You can't cover a different family. */ + return 0; + } + /* We can ignore accept/reject, since "accept *:80, reject *:80" reduces + * to "accept *:80". */ + if (a->maskbits > b->maskbits) { + /* a has more fixed bits than b; it can't possibly cover b. */ + return 0; + } + if (tor_addr_compare_masked(&a->addr, &b->addr, a->maskbits, CMP_EXACT)) { + /* There's a fixed bit in a that's set differently in b. */ + return 0; + } + return (a->prt_min <= b->prt_min && a->prt_max >= b->prt_max); +} + +/** Return true iff the address policies a and b intersect, + * that is, there exists an address/port that is covered by a that + * is also covered by b. + */ +static int +addr_policy_intersects(addr_policy_t *a, addr_policy_t *b) +{ + maskbits_t minbits; + /* All the bits we care about are those that are set in both + * netmasks. If they are equal in a and b's networkaddresses + * then the networks intersect. If there is a difference, + * then they do not. */ + if (a->maskbits < b->maskbits) + minbits = a->maskbits; + else + minbits = b->maskbits; + if (tor_addr_compare_masked(&a->addr, &b->addr, minbits, CMP_EXACT)) + return 0; + if (a->prt_max < b->prt_min || b->prt_max < a->prt_min) + return 0; + return 1; +} + +/** Add the exit policy described by more to policy. + */ +static void +append_exit_policy_string(smartlist_t **policy, const char *more) +{ + config_line_t tmp; + + tmp.key = NULL; + tmp.value = (char*) more; + tmp.next = NULL; + if (parse_addr_policy(&tmp, policy, -1)<0) { + log_warn(LD_BUG, "Unable to parse internally generated policy %s",more); + } +} + +/** Add "reject addr:*" to dest, creating the list as needed. */ +void +addr_policy_append_reject_addr(smartlist_t **dest, const tor_addr_t *addr) +{ + addr_policy_t p, *add; + memset(&p, 0, sizeof(p)); + p.policy_type = ADDR_POLICY_REJECT; + p.maskbits = tor_addr_family(addr) == AF_INET6 ? 128 : 32; + tor_addr_copy(&p.addr, addr); + p.prt_min = 1; + p.prt_max = 65535; + + add = addr_policy_get_canonical_entry(&p); + if (!*dest) + *dest = smartlist_new(); + smartlist_add(*dest, add); +} + +/** Detect and excise "dead code" from the policy *dest. */ +static void +exit_policy_remove_redundancies(smartlist_t *dest) +{ + addr_policy_t *ap, *tmp; + int i, j; + + /* Step one: kill every ipv4 thing after *4:*, every IPv6 thing after *6:* + */ + { + int kill_v4=0, kill_v6=0; + for (i = 0; i < smartlist_len(dest); ++i) { + sa_family_t family; + ap = smartlist_get(dest, i); + family = tor_addr_family(&ap->addr); + if ((family == AF_INET && kill_v4) || + (family == AF_INET6 && kill_v6)) { + smartlist_del_keeporder(dest, i--); + addr_policy_free(ap); + continue; + } + + if (ap->maskbits == 0 && ap->prt_min <= 1 && ap->prt_max >= 65535) { + /* This is a catch-all line -- later lines are unreachable. */ + if (family == AF_INET) { + kill_v4 = 1; + } else if (family == AF_INET6) { + kill_v6 = 1; + } + } + } + } + + /* Step two: for every entry, see if there's a redundant entry + * later on, and remove it. */ + for (i = 0; i < smartlist_len(dest)-1; ++i) { + ap = smartlist_get(dest, i); + for (j = i+1; j < smartlist_len(dest); ++j) { + tmp = smartlist_get(dest, j); + tor_assert(j > i); + if (addr_policy_covers(ap, tmp)) { + char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; + policy_write_item(p1, sizeof(p1), tmp, 0); + policy_write_item(p2, sizeof(p2), ap, 0); + log_debug(LD_CONFIG, "Removing exit policy %s (%d). It is made " + "redundant by %s (%d).", p1, j, p2, i); + smartlist_del_keeporder(dest, j--); + addr_policy_free(tmp); + } + } + } + + /* Step three: for every entry A, see if there's an entry B making this one + * redundant later on. This is the case if A and B are of the same type + * (accept/reject), A is a subset of B, and there is no other entry of + * different type in between those two that intersects with A. + * + * Anybody want to double-check the logic here? XXX + */ + for (i = 0; i < smartlist_len(dest)-1; ++i) { + ap = smartlist_get(dest, i); + for (j = i+1; j < smartlist_len(dest); ++j) { + // tor_assert(j > i); // j starts out at i+1; j only increases; i only + // // decreases. + tmp = smartlist_get(dest, j); + if (ap->policy_type != tmp->policy_type) { + if (addr_policy_intersects(ap, tmp)) + break; + } else { /* policy_types are equal. */ + if (addr_policy_covers(tmp, ap)) { + char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; + policy_write_item(p1, sizeof(p1), ap, 0); + policy_write_item(p2, sizeof(p2), tmp, 0); + log_debug(LD_CONFIG, "Removing exit policy %s. It is already " + "covered by %s.", p1, p2); + smartlist_del_keeporder(dest, i--); + addr_policy_free(ap); + break; + } + } + } + } +} + +#define DEFAULT_EXIT_POLICY \ + "reject *:25,reject *:119,reject *:135-139,reject *:445," \ + "reject *:563,reject *:1214,reject *:4661-4666," \ + "reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*" + +/** Parse the exit policy cfg into the linked list *dest. If + * cfg doesn't end in an absolute accept or reject and if + * add_default_policy is true, add the default exit + * policy afterwards. If rejectprivate is true, prepend + * "reject private:*" to the policy. Return -1 if we can't parse cfg, + * else return 0. + * + * This function is used to parse the exit policy from our torrc. For + * the functions used to parse the exit policy from a router descriptor, + * see router_add_exit_policy. + */ +int +policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, + int ipv6_exit, + int rejectprivate, const char *local_address, + int add_default_policy) +{ + if (!ipv6_exit) { + append_exit_policy_string(dest, "reject *6:*"); + } + if (rejectprivate) { + append_exit_policy_string(dest, "reject private:*"); + if (local_address) { + char buf[POLICY_BUF_LEN]; + tor_snprintf(buf, sizeof(buf), "reject %s:*", local_address); + append_exit_policy_string(dest, buf); + } + } + if (parse_addr_policy(cfg, dest, -1)) + return -1; + if (add_default_policy) { + append_exit_policy_string(dest, DEFAULT_EXIT_POLICY); + } else { + append_exit_policy_string(dest, "reject *4:*"); + append_exit_policy_string(dest, "reject *6:*"); + } + exit_policy_remove_redundancies(*dest); + + return 0; +} + +/** Add "reject *:*" to the end of the policy in *dest, allocating + * *dest as needed. */ +void +policies_exit_policy_append_reject_star(smartlist_t **dest) +{ + append_exit_policy_string(dest, "reject *4:*"); + append_exit_policy_string(dest, "reject *6:*"); +} + +/** Replace the exit policy of node with reject *:* */ +void +policies_set_node_exitpolicy_to_reject_all(node_t *node) +{ + node->rejects_all = 1; +} + +/** Return 1 if there is at least one /8 subnet in policy that + * allows exiting to port. Otherwise, return 0. */ +static int +exit_policy_is_general_exit_helper(smartlist_t *policy, int port) +{ + uint32_t mask, ip, i; + /* Is this /8 rejected (1), or undecided (0)? */ + char subnet_status[256]; + + memset(subnet_status, 0, sizeof(subnet_status)); + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, p) { + if (tor_addr_family(&p->addr) != AF_INET) + continue; /* IPv4 only for now */ + if (p->prt_min > port || p->prt_max < port) + continue; /* Doesn't cover our port. */ + mask = 0; + tor_assert(p->maskbits <= 32); + + if (p->maskbits) + mask = UINT32_MAX<<(32-p->maskbits); + ip = tor_addr_to_ipv4h(&p->addr); + + /* Calculate the first and last subnet that this exit policy touches + * and set it as loop boundaries. */ + for (i = ((mask & ip)>>24); i <= (~((mask & ip) ^ mask)>>24); ++i) { + tor_addr_t addr; + if (subnet_status[i] != 0) + continue; /* We already reject some part of this /8 */ + tor_addr_from_ipv4h(&addr, i<<24); + if (tor_addr_is_internal(&addr, 0)) + continue; /* Local or non-routable addresses */ + if (p->policy_type == ADDR_POLICY_ACCEPT) { + if (p->maskbits > 8) + continue; /* Narrower than a /8. */ + /* We found an allowed subnet of at least size /8. Done + * for this port! */ + return 1; + } else if (p->policy_type == ADDR_POLICY_REJECT) { + subnet_status[i] = 1; + } + } + } SMARTLIST_FOREACH_END(p); + return 0; +} + +/** Return true iff ri is "useful as an exit node", meaning + * it allows exit to at least one /8 address space for at least + * two of ports 80, 443, and 6667. */ +int +exit_policy_is_general_exit(smartlist_t *policy) +{ + static const int ports[] = { 80, 443, 6667 }; + int n_allowed = 0; + int i; + if (!policy) /*XXXX disallow NULL policies? */ + return 0; + + for (i = 0; i < 3; ++i) { + n_allowed += exit_policy_is_general_exit_helper(policy, ports[i]); + } + return n_allowed >= 2; +} + +/** Return false if policy might permit access to some addr:port; + * otherwise if we are certain it rejects everything, return true. */ +int +policy_is_reject_star(const smartlist_t *policy, sa_family_t family) +{ + if (!policy) /*XXXX disallow NULL policies? */ + return 1; + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, p) { + if (p->policy_type == ADDR_POLICY_ACCEPT && + (tor_addr_family(&p->addr) == family || + tor_addr_family(&p->addr) == AF_UNSPEC)) { + return 0; + } else if (p->policy_type == ADDR_POLICY_REJECT && + p->prt_min <= 1 && p->prt_max == 65535 && + p->maskbits == 0 && + (tor_addr_family(&p->addr) == family || + tor_addr_family(&p->addr) == AF_UNSPEC)) { + return 1; + } + } SMARTLIST_FOREACH_END(p); + return 1; +} + +/** Write a single address policy to the buf_len byte buffer at buf. Return + * the number of characters written, or -1 on failure. */ +int +policy_write_item(char *buf, size_t buflen, addr_policy_t *policy, + int format_for_desc) +{ + size_t written = 0; + char addrbuf[TOR_ADDR_BUF_LEN]; + const char *addrpart; + int result; + const int is_accept = policy->policy_type == ADDR_POLICY_ACCEPT; + const sa_family_t family = tor_addr_family(&policy->addr); + const int is_ip6 = (family == AF_INET6); + + tor_addr_to_str(addrbuf, &policy->addr, sizeof(addrbuf), 1); + + /* write accept/reject 1.2.3.4 */ + if (policy->is_private) { + addrpart = "private"; + } else if (policy->maskbits == 0) { + if (format_for_desc) + addrpart = "*"; + else if (family == AF_INET6) + addrpart = "*6"; + else if (family == AF_INET) + addrpart = "*4"; + else + addrpart = "*"; + } else { + addrpart = addrbuf; + } + + result = tor_snprintf(buf, buflen, "%s%s %s", + is_accept ? "accept" : "reject", + (is_ip6&&format_for_desc)?"6":"", + addrpart); + if (result < 0) + return -1; + written += strlen(buf); + /* If the maskbits is 32 we don't need to give it. If the mask is 0, + * we already wrote "*". */ + if (policy->maskbits < 32 && policy->maskbits > 0) { + if (tor_snprintf(buf+written, buflen-written, "/%d", policy->maskbits)<0) + return -1; + written += strlen(buf+written); + } + if (policy->prt_min <= 1 && policy->prt_max == 65535) { + /* There is no port set; write ":*" */ + if (written+4 > buflen) + return -1; + strlcat(buf+written, ":*", buflen-written); + written += 2; + } else if (policy->prt_min == policy->prt_max) { + /* There is only one port; write ":80". */ + result = tor_snprintf(buf+written, buflen-written, ":%d", policy->prt_min); + if (result<0) + return -1; + written += result; + } else { + /* There is a range of ports; write ":79-80". */ + result = tor_snprintf(buf+written, buflen-written, ":%d-%d", + policy->prt_min, policy->prt_max); + if (result<0) + return -1; + written += result; + } + if (written < buflen) + buf[written] = '\0'; + else + return -1; + + return (int)written; +} + +/** Create a new exit policy summary, initially only with a single + * port 1-64k item */ +/* XXXX This entire thing will do most stuff in O(N^2), or worse. Use an + * RB-tree if that turns out to matter. */ +static smartlist_t * +policy_summary_create(void) +{ + smartlist_t *summary; + policy_summary_item_t* item; + + item = tor_malloc_zero(sizeof(policy_summary_item_t)); + item->prt_min = 1; + item->prt_max = 65535; + item->reject_count = 0; + item->accepted = 0; + + summary = smartlist_new(); + smartlist_add(summary, item); + + return summary; +} + +/** Split the summary item in item at the port new_starts. + * The current item is changed to end at new-starts - 1, the new item + * copies reject_count and accepted from the old item, + * starts at new_starts and ends at the port where the original item + * previously ended. + */ +static policy_summary_item_t* +policy_summary_item_split(policy_summary_item_t* old, uint16_t new_starts) +{ + policy_summary_item_t* new; + + new = tor_malloc_zero(sizeof(policy_summary_item_t)); + new->prt_min = new_starts; + new->prt_max = old->prt_max; + new->reject_count = old->reject_count; + new->accepted = old->accepted; + + old->prt_max = new_starts-1; + + tor_assert(old->prt_min <= old->prt_max); + tor_assert(new->prt_min <= new->prt_max); + return new; +} + +/* XXXX Nick says I'm going to hell for this. If he feels charitably towards + * my immortal soul, he can clean it up himself. */ +#define AT(x) ((policy_summary_item_t*)smartlist_get(summary, x)) + +#define REJECT_CUTOFF_COUNT (1<<25) +/** Split an exit policy summary so that prt_min and prt_max + * fall at exactly the start and end of an item respectively. + */ +static int +policy_summary_split(smartlist_t *summary, + uint16_t prt_min, uint16_t prt_max) +{ + int start_at_index; + + int i = 0; + + while (AT(i)->prt_max < prt_min) + i++; + if (AT(i)->prt_min != prt_min) { + policy_summary_item_t* new_item; + new_item = policy_summary_item_split(AT(i), prt_min); + smartlist_insert(summary, i+1, new_item); + i++; + } + start_at_index = i; + + while (AT(i)->prt_max < prt_max) + i++; + if (AT(i)->prt_max != prt_max) { + policy_summary_item_t* new_item; + new_item = policy_summary_item_split(AT(i), prt_max+1); + smartlist_insert(summary, i+1, new_item); + } + + return start_at_index; +} + +/** Mark port ranges as accepted if they are below the reject_count */ +static void +policy_summary_accept(smartlist_t *summary, + uint16_t prt_min, uint16_t prt_max) +{ + int i = policy_summary_split(summary, prt_min, prt_max); + while (i < smartlist_len(summary) && + AT(i)->prt_max <= prt_max) { + if (!AT(i)->accepted && + AT(i)->reject_count <= REJECT_CUTOFF_COUNT) + AT(i)->accepted = 1; + i++; + } + tor_assert(i < smartlist_len(summary) || prt_max==65535); +} + +/** Count the number of addresses in a network with prefixlen maskbits + * against the given portrange. */ +static void +policy_summary_reject(smartlist_t *summary, + maskbits_t maskbits, + uint16_t prt_min, uint16_t prt_max) +{ + int i = policy_summary_split(summary, prt_min, prt_max); + /* XXX: ipv4 specific */ + uint64_t count = (U64_LITERAL(1) << (32-maskbits)); + while (i < smartlist_len(summary) && + AT(i)->prt_max <= prt_max) { + AT(i)->reject_count += count; + i++; + } + tor_assert(i < smartlist_len(summary) || prt_max==65535); +} + +/** Add a single exit policy item to our summary: + * If it is an accept ignore it unless it is for all IP addresses + * ("*"), i.e. it's prefixlen/maskbits is 0, else call + * policy_summary_accept(). + * If it's a reject ignore it if it is about one of the private + * networks, else call policy_summary_reject(). + */ +static void +policy_summary_add_item(smartlist_t *summary, addr_policy_t *p) +{ + if (p->policy_type == ADDR_POLICY_ACCEPT) { + if (p->maskbits == 0) { + policy_summary_accept(summary, p->prt_min, p->prt_max); + } + } else if (p->policy_type == ADDR_POLICY_REJECT) { + + int is_private = 0; + int i; + for (i = 0; private_nets[i]; ++i) { + tor_addr_t addr; + maskbits_t maskbits; + if (tor_addr_parse_mask_ports(private_nets[i], 0, &addr, + &maskbits, NULL, NULL)<0) { + tor_assert(0); + } + if (tor_addr_compare(&p->addr, &addr, CMP_EXACT) == 0 && + p->maskbits == maskbits) { + is_private = 1; + break; + } + } + + if (!is_private) { + policy_summary_reject(summary, p->maskbits, p->prt_min, p->prt_max); + } + } else + tor_assert(0); +} + +/** Create a string representing a summary for an exit policy. + * The summary will either be an "accept" plus a comma-separated list of port + * ranges or a "reject" plus port-ranges, depending on which is shorter. + * + * If no exits are allowed at all then NULL is returned, if no ports + * are blocked instead of "reject " we return "accept 1-65535" (this + * is an exception to the shorter-representation-wins rule). + */ +char * +policy_summarize(smartlist_t *policy, sa_family_t family) +{ + smartlist_t *summary = policy_summary_create(); + smartlist_t *accepts, *rejects; + int i, last, start_prt; + size_t accepts_len, rejects_len; + char *accepts_str = NULL, *rejects_str = NULL, *shorter_str, *result; + const char *prefix; + + tor_assert(policy); + + /* Create the summary list */ + SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, p) { + sa_family_t f = tor_addr_family(&p->addr); + if (f != AF_INET && f != AF_INET6) { + log_warn(LD_BUG, "Weird family when summarizing address policy"); + } + if (f != family) + continue; + /* XXXX-ipv6 More family work is needed */ + policy_summary_add_item(summary, p); + } SMARTLIST_FOREACH_END(p); + + /* Now create two lists of strings, one for accepted and one + * for rejected ports. We take care to merge ranges so that + * we avoid getting stuff like "1-4,5-9,10", instead we want + * "1-10" + */ + i = 0; + start_prt = 1; + accepts = smartlist_new(); + rejects = smartlist_new(); + while (1) { + last = i == smartlist_len(summary)-1; + if (last || + AT(i)->accepted != AT(i+1)->accepted) { + char buf[POLICY_BUF_LEN]; + + if (start_prt == AT(i)->prt_max) + tor_snprintf(buf, sizeof(buf), "%d", start_prt); + else + tor_snprintf(buf, sizeof(buf), "%d-%d", start_prt, AT(i)->prt_max); + + if (AT(i)->accepted) + smartlist_add(accepts, tor_strdup(buf)); + else + smartlist_add(rejects, tor_strdup(buf)); + + if (last) + break; + + start_prt = AT(i+1)->prt_min; + }; + i++; + }; + + /* Figure out which of the two stringlists will be shorter and use + * that to build the result + */ + if (smartlist_len(accepts) == 0) { /* no exits at all */ + result = tor_strdup("reject 1-65535"); + goto cleanup; + } + if (smartlist_len(rejects) == 0) { /* no rejects at all */ + result = tor_strdup("accept 1-65535"); + goto cleanup; + } + + accepts_str = smartlist_join_strings(accepts, ",", 0, &accepts_len); + rejects_str = smartlist_join_strings(rejects, ",", 0, &rejects_len); + + if (rejects_len > MAX_EXITPOLICY_SUMMARY_LEN-strlen("reject")-1 && + accepts_len > MAX_EXITPOLICY_SUMMARY_LEN-strlen("accept")-1) { + char *c; + shorter_str = accepts_str; + prefix = "accept"; + + c = shorter_str + (MAX_EXITPOLICY_SUMMARY_LEN-strlen(prefix)-1); + while (*c != ',' && c >= shorter_str) + c--; + tor_assert(c >= shorter_str); + tor_assert(*c == ','); + *c = '\0'; + + } else if (rejects_len < accepts_len) { + shorter_str = rejects_str; + prefix = "reject"; + } else { + shorter_str = accepts_str; + prefix = "accept"; + } + + tor_asprintf(&result, "%s %s", prefix, shorter_str); + + cleanup: + /* cleanup */ + SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s)); + smartlist_free(summary); + + tor_free(accepts_str); + SMARTLIST_FOREACH(accepts, char *, s, tor_free(s)); + smartlist_free(accepts); + + tor_free(rejects_str); + SMARTLIST_FOREACH(rejects, char *, s, tor_free(s)); + smartlist_free(rejects); + + return result; +} + +/** Convert a summarized policy string into a short_policy_t. Return NULL + * if the string is not well-formed. */ +short_policy_t * +parse_short_policy(const char *summary) +{ + const char *orig_summary = summary; + short_policy_t *result; + int is_accept; + int n_entries; + short_policy_entry_t entries[MAX_EXITPOLICY_SUMMARY_LEN]; /* overkill */ + const char *next; + + if (!strcmpstart(summary, "accept ")) { + is_accept = 1; + summary += strlen("accept "); + } else if (!strcmpstart(summary, "reject ")) { + is_accept = 0; + summary += strlen("reject "); + } else { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Unrecognized policy summary keyword"); + return NULL; + } + + n_entries = 0; + for ( ; *summary; summary = next) { + const char *comma = strchr(summary, ','); + unsigned low, high; + char dummy; + char ent_buf[32]; + size_t len; + + next = comma ? comma+1 : strchr(summary, '\0'); + len = comma ? (size_t)(comma - summary) : strlen(summary); + + if (n_entries == MAX_EXITPOLICY_SUMMARY_LEN) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Impossibly long policy summary %s", + escaped(orig_summary)); + return NULL; + } + + if (! TOR_ISDIGIT(*summary) || len > (sizeof(ent_buf)-1)) { + /* unrecognized entry format. skip it. */ + continue; + } + if (len < 1) { + /* empty; skip it. */ + /* XXX This happens to be unreachable, since if len==0, then *summary is + * ',' or '\0', and the TOR_ISDIGIT test above would have failed. */ + continue; + } + + memcpy(ent_buf, summary, len); + ent_buf[len] = '\0'; + + if (tor_sscanf(ent_buf, "%u-%u%c", &low, &high, &dummy) == 2) { + if (low<1 || low>65535 || high<1 || high>65535 || low>high) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found bad entry in policy summary %s", escaped(orig_summary)); + return NULL; + } + } else if (tor_sscanf(ent_buf, "%u%c", &low, &dummy) == 1) { + if (low<1 || low>65535) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found bad entry in policy summary %s", escaped(orig_summary)); + return NULL; + } + high = low; + } else { + log_fn(LOG_PROTOCOL_WARN, LD_DIR,"Found bad entry in policy summary %s", + escaped(orig_summary)); + return NULL; + } + + entries[n_entries].min_port = low; + entries[n_entries].max_port = high; + n_entries++; + } + + if (n_entries == 0) { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "Found no port-range entries in summary %s", escaped(orig_summary)); + return NULL; + } + + { + size_t size = STRUCT_OFFSET(short_policy_t, entries) + + sizeof(short_policy_entry_t)*(n_entries); + result = tor_malloc_zero(size); + + tor_assert( (char*)&result->entries[n_entries-1] < ((char*)result)+size); + } + + result->is_accept = is_accept; + result->n_entries = n_entries; + memcpy(result->entries, entries, sizeof(short_policy_entry_t)*n_entries); + return result; +} + +/** Write policy back out into a string. Used only for unit tests + * currently. */ +char * +write_short_policy(const short_policy_t *policy) +{ + int i; + char *answer; + smartlist_t *sl = smartlist_new(); + + smartlist_add_asprintf(sl, "%s", policy->is_accept ? "accept " : "reject "); + + for (i=0; i < policy->n_entries; i++) { + const short_policy_entry_t *e = &policy->entries[i]; + if (e->min_port == e->max_port) { + smartlist_add_asprintf(sl, "%d", e->min_port); + } else { + smartlist_add_asprintf(sl, "%d-%d", e->min_port, e->max_port); + } + if (i < policy->n_entries-1) + smartlist_add(sl, tor_strdup(",")); + } + answer = smartlist_join_strings(sl, "", 0, NULL); + SMARTLIST_FOREACH(sl, char *, a, tor_free(a)); + smartlist_free(sl); + return answer; +} + +/** Release all storage held in policy. */ +void +short_policy_free(short_policy_t *policy) +{ + tor_free(policy); +} + +/** See whether the addr:port address is likely to be accepted + * or rejected by the summarized policy policy. Return values are as + * for compare_tor_addr_to_addr_policy. Unlike the regular addr_policy + * functions, requires the port be specified. */ +addr_policy_result_t +compare_tor_addr_to_short_policy(const tor_addr_t *addr, uint16_t port, + const short_policy_t *policy) +{ + int i; + int found_match = 0; + int accept; + + tor_assert(port != 0); + + if (addr && tor_addr_is_null(addr)) + addr = NULL; /* Unspec means 'no address at all,' in this context. */ + + if (addr && get_options()->ClientRejectInternalAddresses && + (tor_addr_is_internal(addr, 0) || tor_addr_is_loopback(addr))) + return ADDR_POLICY_REJECTED; + + for (i=0; i < policy->n_entries; ++i) { + const short_policy_entry_t *e = &policy->entries[i]; + if (e->min_port <= port && port <= e->max_port) { + found_match = 1; + break; + } + } + + if (found_match) + accept = policy->is_accept; + else + accept = ! policy->is_accept; + + /* ???? are these right? -NM */ + /* We should be sure not to return ADDR_POLICY_ACCEPTED in the accept + * case here, because it would cause clients to believe that the node + * allows exit enclaving. Trying it anyway would open up a cool attack + * where the node refuses due to exitpolicy, the client reacts in + * surprise by rewriting the node's exitpolicy to reject *:*, and then + * a bad guy targets users by causing them to attempt such connections + * to 98% of the exits. + * + * Once microdescriptors can handle addresses in special cases (e.g. if + * we ever solve ticket 1774), we can provide certainty here. -RD */ + if (accept) + return ADDR_POLICY_PROBABLY_ACCEPTED; + else + return ADDR_POLICY_REJECTED; +} + +/** Return true iff policy seems reject all ports */ +int +short_policy_is_reject_star(const short_policy_t *policy) +{ + /* This doesn't need to be as much on the lookout as policy_is_reject_star, + * since policy summaries are from the consensus or from consensus + * microdescs. + */ + tor_assert(policy); + /* Check for an exact match of "reject 1-65535". */ + return (policy->is_accept == 0 && policy->n_entries == 1 && + policy->entries[0].min_port == 1 && + policy->entries[0].max_port == 65535); +} + +/** Decide whether addr:port is probably or definitely accepted or rejected by + * node. See compare_tor_addr_to_addr_policy for details on addr/port + * interpretation. */ +addr_policy_result_t +compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port, + const node_t *node) +{ + if (node->rejects_all) + return ADDR_POLICY_REJECTED; + + if (addr && tor_addr_family(addr) == AF_INET6) { + const short_policy_t *p = NULL; + if (node->ri) + p = node->ri->ipv6_exit_policy; + else if (node->md) + p = node->md->ipv6_exit_policy; + if (p) + return compare_tor_addr_to_short_policy(addr, port, p); + else + return ADDR_POLICY_REJECTED; + } + + if (node->ri) { + return compare_tor_addr_to_addr_policy(addr, port, node->ri->exit_policy); + } else if (node->md) { + if (node->md->exit_policy == NULL) + return ADDR_POLICY_REJECTED; + else + return compare_tor_addr_to_short_policy(addr, port, + node->md->exit_policy); + } else { + return ADDR_POLICY_PROBABLY_REJECTED; + } +} + +/** Implementation for GETINFO control command: knows the answer for questions + * about "exit-policy/..." */ +int +getinfo_helper_policies(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg) +{ + (void) conn; + (void) errmsg; + if (!strcmp(question, "exit-policy/default")) { + *answer = tor_strdup(DEFAULT_EXIT_POLICY); + } + return 0; +} + +/** Release all storage held by p. */ +void +addr_policy_list_free(smartlist_t *lst) +{ + if (!lst) + return; + SMARTLIST_FOREACH(lst, addr_policy_t *, policy, addr_policy_free(policy)); + smartlist_free(lst); +} + +/** Release all storage held by p. */ +void +addr_policy_free(addr_policy_t *p) +{ + if (!p) + return; + + if (--p->refcnt <= 0) { + if (p->is_canonical) { + policy_map_ent_t search, *found; + search.policy = p; + found = HT_REMOVE(policy_map, &policy_root, &search); + if (found) { + tor_assert(p == found->policy); + tor_free(found); + } + } + tor_free(p); + } +} + +/** Release all storage held by policy variables. */ +void +policies_free_all(void) +{ + addr_policy_list_free(reachable_or_addr_policy); + reachable_or_addr_policy = NULL; + addr_policy_list_free(reachable_dir_addr_policy); + reachable_dir_addr_policy = NULL; + addr_policy_list_free(socks_policy); + socks_policy = NULL; + addr_policy_list_free(dir_policy); + dir_policy = NULL; + addr_policy_list_free(authdir_reject_policy); + authdir_reject_policy = NULL; + addr_policy_list_free(authdir_invalid_policy); + authdir_invalid_policy = NULL; + addr_policy_list_free(authdir_baddir_policy); + authdir_baddir_policy = NULL; + addr_policy_list_free(authdir_badexit_policy); + authdir_badexit_policy = NULL; + + if (!HT_EMPTY(&policy_root)) { + policy_map_ent_t **ent; + int n = 0; + char buf[POLICY_BUF_LEN]; + + log_warn(LD_MM, "Still had %d address policies cached at shutdown.", + (int)HT_SIZE(&policy_root)); + + /* Note the first 10 cached policies to try to figure out where they + * might be coming from. */ + HT_FOREACH(ent, policy_map, &policy_root) { + if (++n > 10) + break; + if (policy_write_item(buf, sizeof(buf), (*ent)->policy, 0) >= 0) + log_warn(LD_MM," %d [%d]: %s", n, (*ent)->policy->refcnt, buf); + } + } + HT_CLEAR(policy_map, &policy_root); +} + diff --git a/src/tor/policies.h b/src/tor/policies.h new file mode 100644 index 000000000..facbbb6b5 --- /dev/null +++ b/src/tor/policies.h @@ -0,0 +1,77 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file policies.h + * \brief Header file for policies.c. + **/ + +#ifndef TOR_POLICIES_H +#define TOR_POLICIES_H + +/* (length of + * "accept6 [ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]/128:65535-65535\n" + * plus a terminating NUL, rounded up to a nice number.) + */ +#define POLICY_BUF_LEN 72 + +int firewall_is_fascist_or(void); +int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port); +int fascist_firewall_allows_or(const routerinfo_t *ri); +int fascist_firewall_allows_node(const node_t *node); +int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port); +int dir_policy_permits_address(const tor_addr_t *addr); +int socks_policy_permits_address(const tor_addr_t *addr); +int authdir_policy_permits_address(uint32_t addr, uint16_t port); +int authdir_policy_valid_address(uint32_t addr, uint16_t port); +int authdir_policy_baddir_address(uint32_t addr, uint16_t port); +int authdir_policy_badexit_address(uint32_t addr, uint16_t port); + +int validate_addr_policies(const or_options_t *options, char **msg); +void policy_expand_private(smartlist_t **policy); +void policy_expand_unspec(smartlist_t **policy); +int policies_parse_from_options(const or_options_t *options); + +addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent); +int cmp_addr_policies(smartlist_t *a, smartlist_t *b); +addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr, + uint16_t port, const smartlist_t *policy); + +addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr, + uint16_t port, const node_t *node); + +int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, + int ipv6exit, + int rejectprivate, const char *local_address, + int add_default_policy); +void policies_exit_policy_append_reject_star(smartlist_t **dest); +void addr_policy_append_reject_addr(smartlist_t **dest, + const tor_addr_t *addr); +void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter); +int exit_policy_is_general_exit(smartlist_t *policy); +int policy_is_reject_star(const smartlist_t *policy, sa_family_t family); +int getinfo_helper_policies(control_connection_t *conn, + const char *question, char **answer, + const char **errmsg); +int policy_write_item(char *buf, size_t buflen, addr_policy_t *item, + int format_for_desc); + +void addr_policy_list_free(smartlist_t *p); +void addr_policy_free(addr_policy_t *p); +void policies_free_all(void); + +char *policy_summarize(smartlist_t *policy, sa_family_t family); + +short_policy_t *parse_short_policy(const char *summary); +char *write_short_policy(const short_policy_t *policy); +void short_policy_free(short_policy_t *policy); +int short_policy_is_reject_star(const short_policy_t *policy); +addr_policy_result_t compare_tor_addr_to_short_policy( + const tor_addr_t *addr, uint16_t port, + const short_policy_t *policy); + +#endif + diff --git a/src/tor/src/common/procmon.c b/src/tor/procmon.c similarity index 90% rename from src/tor/src/common/procmon.c rename to src/tor/procmon.c index abcbbeaa2..4ebc02ca7 100644 --- a/src/tor/src/common/procmon.c +++ b/src/tor/procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ +/* Copyright (c) 2011-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -8,9 +8,13 @@ #include "procmon.h" -#include "util.h" +#include "tor_util.h" +#ifdef HAVE_EVENT2_EVENT_H #include +#else +#include +#endif #ifdef HAVE_SIGNAL_H #include @@ -36,7 +40,7 @@ typedef int pid_t; #define PID_T_FORMAT I64_FORMAT #else #error Unknown: SIZEOF_PID_T -#endif /* (0 == SIZEOF_PID_T) && defined(_WIN32) || ... */ +#endif /* Define to 1 if process-termination monitors on this OS and Libevent version must poll for process termination themselves. */ @@ -71,7 +75,7 @@ parse_process_specifier(const char *process_spec, /* If we're lucky, long will turn out to be large enough to hold a * PID everywhere that Tor runs. */ - pid_l = tor_parse_long(process_spec, 10, 1, LONG_MAX, &pid_ok, &pspec_next); + pid_l = tor_parse_long(process_spec, 0, 1, LONG_MAX, &pid_ok, &pspec_next); /* Reserve room in the ‘process specifier’ for additional * (platform-specific) identifying information beyond the PID, to @@ -112,11 +116,11 @@ struct tor_process_monitor_t { * periodically check whether the process we have a handle to has * ended. */ HANDLE hproc; - /* XXXX We should have Libevent watch hproc for us, - * if/when some version of Libevent can be told to do so. */ -#endif /* defined(_WIN32) */ + /* XXX023 We can and should have Libevent watch hproc for us, + * if/when some version of Libevent 2.x can be told to do so. */ +#endif - /* XXXX On Linux, we can and should receive the 22nd + /* XXX023 On Linux, we can and should receive the 22nd * (space-delimited) field (‘starttime’) of /proc/$PID/stat from the * owning controller and store it, and poll once in a while to see * whether it has changed -- if so, the kernel has *definitely* @@ -126,8 +130,7 @@ struct tor_process_monitor_t { * systems whose admins have mounted procfs, or the start-time field * of the process-information structure returned by kvmgetprocs() on * any system. The latter is ickier. */ - - /* XXXX On FreeBSD (and possibly other kqueue systems), we can and + /* XXX023 On FreeBSD (and possibly other kqueue systems), we can and * should arrange to receive EVFILT_PROC NOTE_EXIT notifications for * pid, so we don't have to do such a heavyweight poll operation in * order to avoid the PID-reassignment race condition. (We would @@ -159,11 +162,18 @@ tor_validate_process_specifier(const char *process_spec, return parse_process_specifier(process_spec, &ppspec, msg); } -/* XXXX we should use periodic_timer_new() for this stuff */ +#ifdef HAVE_EVENT2_EVENT_H #define PERIODIC_TIMER_FLAGS EV_PERSIST +#else +#define PERIODIC_TIMER_FLAGS (0) +#endif /* DOCDOC poll_interval_tv */ -static const struct timeval poll_interval_tv = {15, 0}; +static struct timeval poll_interval_tv = {15, 0}; +/* Note: If you port this file to plain Libevent 2, you can make + * poll_interval_tv const. It has to be non-const here because in + * libevent 1.x, event_add expects a pointer to a non-const struct + * timeval. */ /** Create a process-termination monitor for the process specifier * given in process_spec. Return a newly allocated @@ -181,8 +191,7 @@ tor_process_monitor_new(struct event_base *base, tor_procmon_callback_t cb, void *cb_arg, const char **msg) { - tor_process_monitor_t *procmon = tor_malloc_zero( - sizeof(tor_process_monitor_t)); + tor_process_monitor_t *procmon = tor_malloc(sizeof(tor_process_monitor_t)); struct parsed_process_specifier_t ppspec; tor_assert(msg != NULL); @@ -219,7 +228,7 @@ tor_process_monitor_new(struct event_base *base, "try again later.", procmon->pid); } -#endif /* defined(_WIN32) */ +#endif procmon->cb = cb; procmon->cb_arg = cb_arg; @@ -232,9 +241,9 @@ tor_process_monitor_new(struct event_base *base, * tor_evtimer_new never returns NULL. */ evtimer_add(procmon->e, &poll_interval_tv); -#else /* !(defined(PROCMON_POLLS)) */ +#else #error OOPS? -#endif /* defined(PROCMON_POLLS) */ +#endif return procmon; err: @@ -306,11 +315,11 @@ tor_process_monitor_poll_cb(evutil_socket_t unused1, short unused2, tor_free(errmsg); } } -#else /* !(defined(_WIN32)) */ +#else /* Unix makes this part easy, if a bit racy. */ its_dead_jim = kill(procmon->pid, 0); its_dead_jim = its_dead_jim && (errno == ESRCH); -#endif /* defined(_WIN32) */ +#endif tor_log(its_dead_jim ? LOG_NOTICE : LOG_INFO, procmon->log_domain, "Monitored process "PID_T_FORMAT" is %s.", @@ -319,13 +328,17 @@ tor_process_monitor_poll_cb(evutil_socket_t unused1, short unused2, if (its_dead_jim) { procmon->cb(procmon->cb_arg); +#ifndef HAVE_EVENT2_EVENT_H + } else { + evtimer_add(procmon->e, &poll_interval_tv); +#endif } } -#endif /* defined(PROCMON_POLLS) */ +#endif /** Free the process-termination monitor procmon. */ void -tor_process_monitor_free_(tor_process_monitor_t *procmon) +tor_process_monitor_free(tor_process_monitor_t *procmon) { if (procmon == NULL) return; diff --git a/src/tor/src/common/procmon.h b/src/tor/procmon.h similarity index 75% rename from src/tor/src/common/procmon.h rename to src/tor/procmon.h index 63777e411..98a3b69e8 100644 --- a/src/tor/src/common/procmon.h +++ b/src/tor/procmon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ +/* Copyright (c) 2011-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,7 +9,7 @@ #ifndef TOR_PROCMON_H #define TOR_PROCMON_H -#include "compat.h" +#include "tor_compat.h" #include "compat_libevent.h" #include "torlog.h" @@ -27,9 +27,7 @@ tor_process_monitor_t *tor_process_monitor_new(struct event_base *base, tor_procmon_callback_t cb, void *cb_arg, const char **msg); -void tor_process_monitor_free_(tor_process_monitor_t *procmon); -#define tor_process_monitor_free(procmon) \ - FREE_AND_NULL(tor_process_monitor_t, tor_process_monitor_free_, (procmon)) +void tor_process_monitor_free(tor_process_monitor_t *procmon); -#endif /* !defined(TOR_PROCMON_H) */ +#endif diff --git a/src/tor/src/or/reasons.c b/src/tor/reasons.c similarity index 82% rename from src/tor/src/or/reasons.c rename to src/tor/reasons.c index 03d49418d..2a972c33f 100644 --- a/src/tor/src/or/reasons.c +++ b/src/tor/reasons.c @@ -1,17 +1,11 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file reasons.c * \brief Convert circuit, stream, and orconn error reasons to and/or from * strings and errno values. - * - * This module is just a bunch of functions full of case statements that - * convert from one representation of our error codes to another. These are - * mainly used in generating log messages, in sending messages to the - * controller in control.c, and in converting errors from one protocol layer - * to another. **/ #include "or.h" @@ -45,8 +39,6 @@ stream_end_reason_to_control_string(int reason) case END_STREAM_REASON_CANT_ATTACH: return "CANT_ATTACH"; case END_STREAM_REASON_NET_UNREACHABLE: return "NET_UNREACHABLE"; case END_STREAM_REASON_SOCKSPROTOCOL: return "SOCKS_PROTOCOL"; - // XXXX Controlspec - case END_STREAM_REASON_HTTPPROTOCOL: return "HTTP_PROTOCOL"; case END_STREAM_REASON_PRIVATE_ADDR: return "PRIVATE_ADDR"; @@ -107,9 +99,15 @@ stream_end_reason_to_socks5_response(int reason) case END_STREAM_REASON_CONNECTREFUSED: return SOCKS5_CONNECTION_REFUSED; case END_STREAM_REASON_ENTRYPOLICY: + { + printf("tor: entry policy\n"); return SOCKS5_NOT_ALLOWED; + } case END_STREAM_REASON_EXITPOLICY: + { + printf("tor: exit policy\n"); return SOCKS5_NOT_ALLOWED; + } case END_STREAM_REASON_DESTROY: return SOCKS5_GENERAL_ERROR; case END_STREAM_REASON_DONE: @@ -140,11 +138,6 @@ stream_end_reason_to_socks5_response(int reason) return SOCKS5_NET_UNREACHABLE; case END_STREAM_REASON_SOCKSPROTOCOL: return SOCKS5_GENERAL_ERROR; - case END_STREAM_REASON_HTTPPROTOCOL: - // LCOV_EXCL_START - tor_assert_nonfatal_unreached(); - return SOCKS5_GENERAL_ERROR; - // LCOV_EXCL_STOP case END_STREAM_REASON_PRIVATE_ADDR: return SOCKS5_GENERAL_ERROR; @@ -167,7 +160,7 @@ stream_end_reason_to_socks5_response(int reason) #else #define E_CASE(s) case s #define S_CASE(s) case s -#endif /* defined(_WIN32) */ +#endif /** Given an errno from a failed exit connection, return a reason code * appropriate for use in a RELAY END cell. */ @@ -187,12 +180,11 @@ errno_to_stream_end_reason(int e) S_CASE(ENOTSOCK): S_CASE(EPROTONOSUPPORT): S_CASE(EAFNOSUPPORT): + E_CASE(EACCES): S_CASE(ENOTCONN): - return END_STREAM_REASON_INTERNAL; S_CASE(ENETUNREACH): + return END_STREAM_REASON_INTERNAL; S_CASE(EHOSTUNREACH): - E_CASE(EACCES): - case EPERM: return END_STREAM_REASON_NOROUTE; S_CASE(ECONNREFUSED): return END_STREAM_REASON_CONNECTREFUSED; @@ -244,8 +236,6 @@ orconn_end_reason_to_control_string(int r) return "RESOURCELIMIT"; case END_OR_CONN_REASON_MISC: return "MISC"; - case END_OR_CONN_REASON_PT_MISSING: - return "PT_MISSING"; case 0: return ""; default: @@ -363,8 +353,6 @@ circuit_end_reason_to_control_string(int reason) return "NOSUCHSERVICE"; case END_CIRC_REASON_MEASUREMENT_EXPIRED: return "MEASUREMENT_EXPIRED"; - case END_CIRC_REASON_IP_NOW_REDUNDANT: - return "IP_NOW_REDUNDANT"; default: if (is_remote) { /* @@ -382,7 +370,7 @@ circuit_end_reason_to_control_string(int reason) } } -/** Return a string corresponding to a SOCKS4 response code. */ +/** Return a string corresponding to a SOCKS4 reponse code. */ const char * socks4_response_code_to_string(uint8_t code) { @@ -400,7 +388,7 @@ socks4_response_code_to_string(uint8_t code) } } -/** Return a string corresponding to a SOCKS5 response code. */ +/** Return a string corresponding to a SOCKS5 reponse code. */ const char * socks5_response_code_to_string(uint8_t code) { @@ -449,48 +437,3 @@ bandwidth_weight_rule_to_string(bandwidth_weight_rule_t rule) } } -/** Given a RELAY_END reason value, convert it to an HTTP response to be - * send over an HTTP tunnel connection. */ -const char * -end_reason_to_http_connect_response_line(int endreason) -{ - endreason &= END_STREAM_REASON_MASK; - /* XXXX these are probably all wrong. Should they all be 502? */ - switch (endreason) { - case 0: - return "HTTP/1.0 200 OK\r\n\r\n"; - case END_STREAM_REASON_MISC: - return "HTTP/1.0 500 Internal Server Error\r\n\r\n"; - case END_STREAM_REASON_RESOLVEFAILED: - return "HTTP/1.0 404 Not Found (resolve failed)\r\n\r\n"; - case END_STREAM_REASON_NOROUTE: - return "HTTP/1.0 404 Not Found (no route)\r\n\r\n"; - case END_STREAM_REASON_CONNECTREFUSED: - return "HTTP/1.0 403 Forbidden (connection refused)\r\n\r\n"; - case END_STREAM_REASON_EXITPOLICY: - return "HTTP/1.0 403 Forbidden (exit policy)\r\n\r\n"; - case END_STREAM_REASON_DESTROY: - return "HTTP/1.0 502 Bad Gateway (destroy cell received)\r\n\r\n"; - case END_STREAM_REASON_DONE: - return "HTTP/1.0 502 Bad Gateway (unexpected close)\r\n\r\n"; - case END_STREAM_REASON_TIMEOUT: - return "HTTP/1.0 504 Gateway Timeout\r\n\r\n"; - case END_STREAM_REASON_HIBERNATING: - return "HTTP/1.0 502 Bad Gateway (hibernating server)\r\n\r\n"; - case END_STREAM_REASON_INTERNAL: - return "HTTP/1.0 502 Bad Gateway (internal error)\r\n\r\n"; - case END_STREAM_REASON_RESOURCELIMIT: - return "HTTP/1.0 502 Bad Gateway (resource limit)\r\n\r\n"; - case END_STREAM_REASON_CONNRESET: - return "HTTP/1.0 403 Forbidden (connection reset)\r\n\r\n"; - case END_STREAM_REASON_TORPROTOCOL: - return "HTTP/1.0 502 Bad Gateway (tor protocol violation)\r\n\r\n"; - case END_STREAM_REASON_ENTRYPOLICY: - return "HTTP/1.0 403 Forbidden (entry policy violation)\r\n\r\n"; - case END_STREAM_REASON_NOTDIRECTORY: /* Fall Through */ - default: - tor_assert_nonfatal_unreached(); - return "HTTP/1.0 500 Internal Server Error (weird end reason)\r\n\r\n"; - } -} - diff --git a/src/tor/src/or/reasons.h b/src/tor/reasons.h similarity index 85% rename from src/tor/src/or/reasons.h rename to src/tor/reasons.h index 3d6ba8fc8..fe7e67722 100644 --- a/src/tor/src/or/reasons.h +++ b/src/tor/reasons.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -26,7 +26,6 @@ const char *socks4_response_code_to_string(uint8_t code); const char *socks5_response_code_to_string(uint8_t code); const char *bandwidth_weight_rule_to_string(enum bandwidth_weight_rule_t rule); -const char *end_reason_to_http_connect_response_line(int endreason); -#endif /* !defined(TOR_REASONS_H) */ +#endif diff --git a/src/tor/src/or/relay.c b/src/tor/relay.c similarity index 75% rename from src/tor/src/or/relay.c rename to src/tor/relay.c index ac2a98e12..51dd881ab 100644 --- a/src/tor/src/or/relay.c +++ b/src/tor/relay.c @@ -1,82 +1,42 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file relay.c * \brief Handle relay cell encryption/decryption, plus packaging and * receiving from circuits, plus queuing on circuits. - * - * This is a core modules that makes Tor work. It's responsible for - * dealing with RELAY cells (the ones that travel more than one hop along a - * circuit), by: - *
      - *
    • constructing relays cells, - *
    • encrypting relay cells, - *
    • decrypting relay cells, - *
    • demultiplexing relay cells as they arrive on a connection, - *
    • queueing relay cells for retransmission, - *
    • or handling relay cells that are for us to receive (as an exit or a - * client). - *
    - * - * RELAY cells are generated throughout the code at the client or relay side, - * using relay_send_command_from_edge() or one of the functions like - * connection_edge_send_command() that calls it. Of particular interest is - * connection_edge_package_raw_inbuf(), which takes information that has - * arrived on an edge connection socket, and packages it as a RELAY_DATA cell - * -- this is how information is actually sent across the Tor network. The - * cryptography for these functions is handled deep in - * circuit_package_relay_cell(), which either adds a single layer of - * encryption (if we're an exit), or multiple layers (if we're the origin of - * the circuit). After construction and encryption, the RELAY cells are - * passed to append_cell_to_circuit_queue(), which queues them for - * transmission and tells the circuitmux (see circuitmux.c) that the circuit - * is waiting to send something. - * - * Incoming RELAY cells arrive at circuit_receive_relay_cell(), called from - * command.c. There they are decrypted and, if they are for us, are passed to - * connection_edge_process_relay_cell(). If they're not for us, they're - * re-queued for retransmission again with append_cell_to_circuit_queue(). - * - * The connection_edge_process_relay_cell() function handles all the different - * types of relay cells, launching requests or transmitting data as needed. **/ #define RELAY_PRIVATE #include "or.h" #include "addressmap.h" -#include "backtrace.h" #include "buffers.h" #include "channel.h" #include "circpathbias.h" #include "circuitbuild.h" #include "circuitlist.h" #include "circuituse.h" -#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" #include "control.h" #include "geoip.h" -#include "hs_cache.h" -#include "main.h" +#include "onion_main.h" +#include "mempool.h" #include "networkstatus.h" #include "nodelist.h" #include "onion.h" #include "policies.h" #include "reasons.h" #include "relay.h" -#include "rendcache.h" #include "rendcommon.h" #include "router.h" #include "routerlist.h" #include "routerparse.h" -#include "scheduler.h" -#include "rephist.h" static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, @@ -149,14 +109,14 @@ relay_set_digest(crypto_digest_t *digest, cell_t *cell) static int relay_digest_matches(crypto_digest_t *digest, cell_t *cell) { - uint32_t received_integrity, calculated_integrity; + char received_integrity[4], calculated_integrity[4]; relay_header_t rh; crypto_digest_t *backup_digest=NULL; backup_digest = crypto_digest_dup(digest); relay_header_unpack(&rh, cell->payload); - memcpy(&received_integrity, rh.integrity, 4); + memcpy(received_integrity, rh.integrity, 4); memset(rh.integrity, 0, 4); relay_header_pack(cell->payload, &rh); @@ -165,15 +125,15 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell) // received_integrity[2], received_integrity[3]); crypto_digest_add_bytes(digest, (char*) cell->payload, CELL_PAYLOAD_SIZE); - crypto_digest_get_digest(digest, (char*) &calculated_integrity, 4); + crypto_digest_get_digest(digest, calculated_integrity, 4); - if (calculated_integrity != received_integrity) { + if (tor_memneq(received_integrity, calculated_integrity, 4)) { // log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing."); // (%d vs %d).", received_integrity, calculated_integrity); /* restore digest to its old form */ crypto_digest_assign(digest, backup_digest); /* restore the relay header */ - memcpy(rh.integrity, &received_integrity, 4); + memcpy(rh.integrity, received_integrity, 4); relay_header_pack(cell->payload, &rh); crypto_digest_free(backup_digest); return 0; @@ -185,88 +145,23 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell) /** Apply cipher to CELL_PAYLOAD_SIZE bytes of in * (in place). * - * Note that we use the same operation for encrypting and for decrypting. - */ -static void -relay_crypt_one_payload(crypto_cipher_t *cipher, uint8_t *in) -{ - crypto_cipher_crypt_inplace(cipher, (char*) in, CELL_PAYLOAD_SIZE); -} - -/** - * Update channel usage state based on the type of relay cell and - * circuit properties. + * If encrypt_mode is 1 then encrypt, else decrypt. * - * This is needed to determine if a client channel is being - * used for application traffic, and if a relay channel is being - * used for multihop circuits and application traffic. The decision - * to pad in channelpadding.c depends upon this info (as well as - * consensus parameters) to decide what channels to pad. + * Return -1 if the crypto fails, else return 0. */ -static void -circuit_update_channel_usage(circuit_t *circ, cell_t *cell) +static int +relay_crypt_one_payload(crypto_cipher_t *cipher, uint8_t *in, + int encrypt_mode) { - if (CIRCUIT_IS_ORIGIN(circ)) { - /* - * The client state was first set much earlier in - * circuit_send_next_onion_skin(), so we can start padding as early as - * possible. - * - * However, if padding turns out to be expensive, we may want to not do - * it until actual application traffic starts flowing (which is controlled - * via consensus param nf_pad_before_usage). - * - * So: If we're an origin circuit and we've created a full length circuit, - * then any CELL_RELAY cell means application data. Increase the usage - * state of the channel to indicate this. - * - * We want to wait for CELL_RELAY specifically here, so we know that - * the channel was definitely being used for data and not for extends. - * By default, we pad as soon as a channel has been used for *any* - * circuits, so this state is irrelevant to the padding decision in - * the default case. However, if padding turns out to be expensive, - * we would like the ability to avoid padding until we're absolutely - * sure that a channel is used for enough application data to be worth - * padding. - * - * (So it does not matter that CELL_RELAY_EARLY can actually contain - * application data. This is only a load reducing option and that edge - * case does not matter if we're desperately trying to reduce overhead - * anyway. See also consensus parameter nf_pad_before_usage). - */ - if (BUG(!circ->n_chan)) - return; - - if (circ->n_chan->channel_usage == CHANNEL_USED_FOR_FULL_CIRCS && - cell->command == CELL_RELAY) { - circ->n_chan->channel_usage = CHANNEL_USED_FOR_USER_TRAFFIC; - } - } else { - /* If we're a relay circuit, the question is more complicated. Basically: - * we only want to pad connections that carry multihop (anonymous) - * circuits. - * - * We assume we're more than one hop if either the previous hop - * is not a client, or if the previous hop is a client and there's - * a next hop. Then, circuit traffic starts at RELAY_EARLY, and - * user application traffic starts when we see RELAY cells. - */ - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); + int r; + (void)encrypt_mode; + r = crypto_cipher_crypt_inplace(cipher, (char*) in, CELL_PAYLOAD_SIZE); - if (BUG(!or_circ->p_chan)) - return; - - if (!channel_is_client(or_circ->p_chan) || - (channel_is_client(or_circ->p_chan) && circ->n_chan)) { - if (cell->command == CELL_RELAY_EARLY) { - if (or_circ->p_chan->channel_usage < CHANNEL_USED_FOR_FULL_CIRCS) { - or_circ->p_chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; - } - } else if (cell->command == CELL_RELAY) { - or_circ->p_chan->channel_usage = CHANNEL_USED_FOR_USER_TRAFFIC; - } - } + if (r) { + log_warn(LD_BUG,"Error during relay encryption"); + return -1; } + return 0; } /** Receive a relay cell: @@ -298,13 +193,10 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, return 0; if (relay_crypt(circ, cell, cell_direction, &layer_hint, &recognized) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "relay crypt failed. Dropping connection."); + log_warn(LD_BUG,"relay crypt failed. Dropping connection."); return -END_CIRC_REASON_INTERNAL; } - circuit_update_channel_usage(circ, cell); - if (recognized) { edge_connection_t *conn = NULL; @@ -316,7 +208,8 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, return 0; } - conn = relay_lookup_conn(circ, cell, cell_direction, layer_hint); + conn = relay_lookup_conn(circ, cell, cell_direction, + layer_hint); if (cell_direction == CELL_DIRECTION_OUT) { ++stats_n_relay_cells_delivered; log_debug(LD_OR,"Sending away from origin."); @@ -333,13 +226,8 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, log_debug(LD_OR,"Sending to origin."); if ((reason = connection_edge_process_relay_cell(cell, circ, conn, layer_hint)) < 0) { - /* If a client is trying to connect to unknown hidden service port, - * END_CIRC_AT_ORIGIN is sent back so we can then close the circuit. - * Do not log warn as this is an expected behavior for a service. */ - if (reason != END_CIRC_AT_ORIGIN) { - log_warn(LD_OR, - "connection_edge_process_relay_cell (at origin) failed."); - } + log_warn(LD_OR, + "connection_edge_process_relay_cell (at origin) failed."); return reason; } } @@ -372,12 +260,12 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, if (! CIRCUIT_IS_ORIGIN(circ) && TO_OR_CIRCUIT(circ)->rend_splice && cell_direction == CELL_DIRECTION_OUT) { - or_circuit_t *splice_ = TO_OR_CIRCUIT(circ)->rend_splice; + or_circuit_t *splice = TO_OR_CIRCUIT(circ)->rend_splice; tor_assert(circ->purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED); - tor_assert(splice_->base_.purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED); - cell->circ_id = splice_->p_circ_id; + tor_assert(splice->base_.purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED); + cell->circ_id = splice->p_circ_id; cell->command = CELL_RELAY; /* can't be relay_early anyway */ - if ((reason = circuit_receive_relay_cell(cell, TO_CIRCUIT(splice_), + if ((reason = circuit_receive_relay_cell(cell, TO_CIRCUIT(splice), CELL_DIRECTION_IN)) < 0) { log_warn(LD_REND, "Error relaying cell across rendezvous; closing " "circuits"); @@ -444,8 +332,8 @@ relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, do { /* Remember: cpath is in forward order, that is, first hop first. */ tor_assert(thishop); - /* decrypt one layer */ - relay_crypt_one_payload(thishop->b_crypto, cell->payload); + if (relay_crypt_one_payload(thishop->b_crypto, cell->payload, 0) < 0) + return -1; relay_header_unpack(&rh, cell->payload); if (rh.recognized == 0) { @@ -462,14 +350,19 @@ relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, log_fn(LOG_PROTOCOL_WARN, LD_OR, "Incoming cell at client not recognized. Closing."); return -1; - } else { - /* We're in the middle. Encrypt one layer. */ - relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->p_crypto, cell->payload); + } else { /* we're in the middle. Just one crypt. */ + if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->p_crypto, + cell->payload, 1) < 0) + return -1; +// log_fn(LOG_DEBUG,"Skipping recognized check, because we're not " +// "the client."); } } else /* cell_direction == CELL_DIRECTION_OUT */ { - /* We're in the middle. Decrypt one layer. */ + /* we're in the middle. Just one crypt. */ - relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->n_crypto, cell->payload); + if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->n_crypto, + cell->payload, 0) < 0) + return -1; relay_header_unpack(&rh, cell->payload); if (rh.recognized == 0) { @@ -495,32 +388,17 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ, { channel_t *chan; /* where to send the cell */ - if (circ->marked_for_close) { - /* Circuit is marked; send nothing. */ - return 0; - } - if (cell_direction == CELL_DIRECTION_OUT) { crypt_path_t *thishop; /* counter for repeated crypts */ chan = circ->n_chan; if (!chan) { log_warn(LD_BUG,"outgoing relay cell sent from %s:%d has n_chan==NULL." - " Dropping. Circuit is in state %s (%d), and is " - "%smarked for close. (%s:%d, %d)", filename, lineno, - circuit_state_to_string(circ->state), circ->state, - circ->marked_for_close ? "" : "not ", - circ->marked_for_close_file?circ->marked_for_close_file:"", - circ->marked_for_close, circ->marked_for_close_reason); - if (CIRCUIT_IS_ORIGIN(circ)) { - circuit_log_path(LOG_WARN, LD_BUG, TO_ORIGIN_CIRCUIT(circ)); - } - log_backtrace(LOG_WARN,LD_BUG,""); + " Dropping.", filename, lineno); return 0; /* just drop it */ } if (!CIRCUIT_IS_ORIGIN(circ)) { log_warn(LD_BUG,"outgoing relay cell sent from %s:%d on non-origin " "circ. Dropping.", filename, lineno); - log_backtrace(LOG_WARN,LD_BUG,""); return 0; /* just drop it */ } @@ -530,8 +408,11 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ, /* moving from farthest to nearest hop */ do { tor_assert(thishop); - log_debug(LD_OR,"encrypting a layer of the relay cell."); - relay_crypt_one_payload(thishop->f_crypto, cell->payload); + /* XXXX RD This is a bug, right? */ + log_debug(LD_OR,"crypting a layer of the relay cell."); + if (relay_crypt_one_payload(thishop->f_crypto, cell->payload, 1) < 0) { + return -1; + } thishop = thishop->prev; } while (thishop != TO_ORIGIN_CIRCUIT(circ)->cpath->prev); @@ -548,8 +429,8 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ, or_circ = TO_OR_CIRCUIT(circ); chan = or_circ->p_chan; relay_set_digest(or_circ->p_digest, cell); - /* encrypt one layer */ - relay_crypt_one_payload(or_circ->p_crypto, cell->payload); + if (relay_crypt_one_payload(or_circ->p_crypto, cell->payload, 1) < 0) + return -1; } ++stats_n_relay_cells_relayed; @@ -640,7 +521,6 @@ relay_header_unpack(relay_header_t *dest, const uint8_t *src) static const char * relay_command_to_string(uint8_t command) { - static char buf[64]; switch (command) { case RELAY_COMMAND_BEGIN: return "BEGIN"; case RELAY_COMMAND_DATA: return "DATA"; @@ -665,12 +545,7 @@ relay_command_to_string(uint8_t command) case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: return "RENDEZVOUS_ESTABLISHED"; case RELAY_COMMAND_INTRODUCE_ACK: return "INTRODUCE_ACK"; - case RELAY_COMMAND_EXTEND2: return "EXTEND2"; - case RELAY_COMMAND_EXTENDED2: return "EXTENDED2"; - default: - tor_snprintf(buf, sizeof(buf), "Unrecognized relay command %u", - (unsigned)command); - return buf; + default: return "(unrecognized)"; } } @@ -683,11 +558,11 @@ relay_command_to_string(uint8_t command) * If you can't send the cell, mark the circuit for close and return -1. Else * return 0. */ -MOCK_IMPL(int, -relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, crypt_path_t *cpath_layer, - const char *filename, int lineno)) +int +relay_send_command_from_edge_(streamid_t stream_id, circuit_t *circ, + uint8_t relay_command, const char *payload, + size_t payload_len, crypt_path_t *cpath_layer, + const char *filename, int lineno) { cell_t cell; relay_header_t rh; @@ -699,14 +574,14 @@ relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, memset(&cell, 0, sizeof(cell_t)); cell.command = CELL_RELAY; - if (CIRCUIT_IS_ORIGIN(circ)) { - tor_assert(cpath_layer); + if (cpath_layer) { cell.circ_id = circ->n_circ_id; cell_direction = CELL_DIRECTION_OUT; - } else { - tor_assert(! cpath_layer); + } else if (! CIRCUIT_IS_ORIGIN(circ)) { cell.circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; cell_direction = CELL_DIRECTION_IN; + } else { + return -1; } memset(&rh, 0, sizeof(rh)); @@ -720,9 +595,6 @@ relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, log_debug(LD_OR,"delivering %d cell %s.", relay_command, cell_direction == CELL_DIRECTION_OUT ? "forward" : "backward"); - if (relay_command == RELAY_COMMAND_DROP) - rep_hist_padding_count_write(PADDING_TYPE_DROP); - /* If we are sending an END cell and this circuit is used for a tunneled * directory request, advance its state. */ if (relay_command == RELAY_COMMAND_END && circ->dirreq_id) @@ -823,22 +695,6 @@ connection_edge_send_command(edge_connection_t *fromconn, return -1; } - if (circ->marked_for_close) { - /* The circuit has been marked, but not freed yet. When it's freed, it - * will mark this connection for close. */ - return -1; - } - -#ifdef MEASUREMENTS_21206 - /* Keep track of the number of RELAY_DATA cells sent for directory - * connections. */ - connection_t *linked_conn = TO_CONN(fromconn)->linked_conn; - - if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { - ++(TO_DIR_CONN(linked_conn)->data_cells_sent); - } -#endif /* defined(MEASUREMENTS_21206) */ - return relay_send_command_from_edge(fromconn->stream_id, circ, relay_command, payload, payload_len, cpath_layer); @@ -879,15 +735,13 @@ connection_ap_process_end_not_open( if (rh->length > 0) { if (reason == END_STREAM_REASON_TORPROTOCOL || + reason == END_STREAM_REASON_INTERNAL || reason == END_STREAM_REASON_DESTROY) { - /* Both of these reasons could mean a failed tag + /* All three of these reasons could mean a failed tag * hit the exit and it complained. Do not probe. * Fail the circuit. */ circ->path_state = PATH_STATE_USE_FAILED; return -END_CIRC_REASON_TORPROTOCOL; - } else if (reason == END_STREAM_REASON_INTERNAL) { - /* We can't infer success or failure, since older Tors report - * ENETUNREACH as END_STREAM_REASON_INTERNAL. */ } else { /* Path bias: If we get a valid reason code from the exit, * it wasn't due to tagging. @@ -939,10 +793,8 @@ connection_ap_process_end_not_open( return 0; } - if ((tor_addr_family(&addr) == AF_INET && - !conn->entry_cfg.ipv4_traffic) || - (tor_addr_family(&addr) == AF_INET6 && - !conn->entry_cfg.ipv6_traffic)) { + if ((tor_addr_family(&addr) == AF_INET && !conn->ipv4_traffic_ok) || + (tor_addr_family(&addr) == AF_INET6 && !conn->ipv6_traffic_ok)) { log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got an EXITPOLICY failure on a connection with a " "mismatched family. Closing."); @@ -971,7 +823,7 @@ connection_ap_process_end_not_open( } } } - /* check if the exit *ought* to have allowed it */ + /* check if he *ought* to have allowed it */ adjust_exit_policy_from_exitpolicy_failure(circ, conn, @@ -1002,7 +854,6 @@ connection_ap_process_end_not_open( break; /* break means it'll close, below */ /* Else fall through: expire this circuit, clear the * chosen_exit_name field, and try again. */ - /* Falls through. */ case END_STREAM_REASON_RESOLVEFAILED: case END_STREAM_REASON_TIMEOUT: case END_STREAM_REASON_MISC: @@ -1156,254 +1007,6 @@ connected_cell_parse(const relay_header_t *rh, const cell_t *cell, return 0; } -/** Drop all storage held by addr. */ -STATIC void -address_ttl_free_(address_ttl_t *addr) -{ - if (!addr) - return; - tor_free(addr->hostname); - tor_free(addr); -} - -/** Parse a resolved cell in cell, with parsed header in rh. - * Return -1 on parse error. On success, add one or more newly allocated - * address_ttl_t to addresses_out; set *errcode_out to - * one of 0, RESOLVED_TYPE_ERROR, or RESOLVED_TYPE_ERROR_TRANSIENT, and - * return 0. */ -STATIC int -resolved_cell_parse(const cell_t *cell, const relay_header_t *rh, - smartlist_t *addresses_out, int *errcode_out) -{ - const uint8_t *cp; - uint8_t answer_type; - size_t answer_len; - address_ttl_t *addr; - size_t remaining; - int errcode = 0; - smartlist_t *addrs; - - tor_assert(cell); - tor_assert(rh); - tor_assert(addresses_out); - tor_assert(errcode_out); - - *errcode_out = 0; - - if (rh->length > RELAY_PAYLOAD_SIZE) - return -1; - - addrs = smartlist_new(); - - cp = cell->payload + RELAY_HEADER_SIZE; - - remaining = rh->length; - while (remaining) { - const uint8_t *cp_orig = cp; - if (remaining < 2) - goto err; - answer_type = *cp++; - answer_len = *cp++; - if (remaining < 2 + answer_len + 4) { - goto err; - } - if (answer_type == RESOLVED_TYPE_IPV4) { - if (answer_len != 4) { - goto err; - } - addr = tor_malloc_zero(sizeof(*addr)); - tor_addr_from_ipv4n(&addr->addr, get_uint32(cp)); - cp += 4; - addr->ttl = ntohl(get_uint32(cp)); - cp += 4; - smartlist_add(addrs, addr); - } else if (answer_type == RESOLVED_TYPE_IPV6) { - if (answer_len != 16) - goto err; - addr = tor_malloc_zero(sizeof(*addr)); - tor_addr_from_ipv6_bytes(&addr->addr, (const char*) cp); - cp += 16; - addr->ttl = ntohl(get_uint32(cp)); - cp += 4; - smartlist_add(addrs, addr); - } else if (answer_type == RESOLVED_TYPE_HOSTNAME) { - if (answer_len == 0) { - goto err; - } - addr = tor_malloc_zero(sizeof(*addr)); - addr->hostname = tor_memdup_nulterm(cp, answer_len); - cp += answer_len; - addr->ttl = ntohl(get_uint32(cp)); - cp += 4; - smartlist_add(addrs, addr); - } else if (answer_type == RESOLVED_TYPE_ERROR_TRANSIENT || - answer_type == RESOLVED_TYPE_ERROR) { - errcode = answer_type; - /* Ignore the error contents */ - cp += answer_len + 4; - } else { - cp += answer_len + 4; - } - tor_assert(((ssize_t)remaining) >= (cp - cp_orig)); - remaining -= (cp - cp_orig); - } - - if (errcode && smartlist_len(addrs) == 0) { - /* Report an error only if there were no results. */ - *errcode_out = errcode; - } - - smartlist_add_all(addresses_out, addrs); - smartlist_free(addrs); - - return 0; - - err: - /* On parse error, don't report any results */ - SMARTLIST_FOREACH(addrs, address_ttl_t *, a, address_ttl_free(a)); - smartlist_free(addrs); - return -1; -} - -/** Helper for connection_edge_process_resolved_cell: given an error code, - * an entry_connection, and a list of address_ttl_t *, report the best answer - * to the entry_connection. */ -static void -connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn, - int error_code, - smartlist_t *results) -{ - address_ttl_t *addr_ipv4 = NULL; - address_ttl_t *addr_ipv6 = NULL; - address_ttl_t *addr_hostname = NULL; - address_ttl_t *addr_best = NULL; - - /* If it's an error code, that's easy. */ - if (error_code) { - tor_assert(error_code == RESOLVED_TYPE_ERROR || - error_code == RESOLVED_TYPE_ERROR_TRANSIENT); - connection_ap_handshake_socks_resolved(conn, - error_code,0,NULL,-1,-1); - return; - } - - /* Get the first answer of each type. */ - SMARTLIST_FOREACH_BEGIN(results, address_ttl_t *, addr) { - if (addr->hostname) { - if (!addr_hostname) { - addr_hostname = addr; - } - } else if (tor_addr_family(&addr->addr) == AF_INET) { - if (!addr_ipv4 && conn->entry_cfg.ipv4_traffic) { - addr_ipv4 = addr; - } - } else if (tor_addr_family(&addr->addr) == AF_INET6) { - if (!addr_ipv6 && conn->entry_cfg.ipv6_traffic) { - addr_ipv6 = addr; - } - } - } SMARTLIST_FOREACH_END(addr); - - /* Now figure out which type we wanted to deliver. */ - if (conn->socks_request->command == SOCKS_COMMAND_RESOLVE_PTR) { - if (addr_hostname) { - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_HOSTNAME, - strlen(addr_hostname->hostname), - (uint8_t*)addr_hostname->hostname, - addr_hostname->ttl,-1); - } else { - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_ERROR,0,NULL,-1,-1); - } - return; - } - - if (conn->entry_cfg.prefer_ipv6) { - addr_best = addr_ipv6 ? addr_ipv6 : addr_ipv4; - } else { - addr_best = addr_ipv4 ? addr_ipv4 : addr_ipv6; - } - - /* Now convert it to the ugly old interface */ - if (! addr_best) { - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_ERROR,0,NULL,-1,-1); - return; - } - - connection_ap_handshake_socks_resolved_addr(conn, - &addr_best->addr, - addr_best->ttl, - -1); - - remap_event_helper(conn, &addr_best->addr); -} - -/** Handle a RELAY_COMMAND_RESOLVED cell that we received on a non-open AP - * stream. */ -STATIC int -connection_edge_process_resolved_cell(edge_connection_t *conn, - const cell_t *cell, - const relay_header_t *rh) -{ - entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn); - smartlist_t *resolved_addresses = NULL; - int errcode = 0; - - if (conn->base_.state != AP_CONN_STATE_RESOLVE_WAIT) { - log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while " - "not in state resolve_wait. Dropping."); - return 0; - } - tor_assert(SOCKS_COMMAND_IS_RESOLVE(entry_conn->socks_request->command)); - - resolved_addresses = smartlist_new(); - if (resolved_cell_parse(cell, rh, resolved_addresses, &errcode)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Dropping malformed 'resolved' cell"); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TORPROTOCOL); - goto done; - } - - if (get_options()->ClientDNSRejectInternalAddresses) { - int orig_len = smartlist_len(resolved_addresses); - SMARTLIST_FOREACH_BEGIN(resolved_addresses, address_ttl_t *, addr) { - if (addr->hostname == NULL && tor_addr_is_internal(&addr->addr, 0)) { - log_info(LD_APP, "Got a resolved cell with answer %s; dropping that " - "answer.", - safe_str_client(fmt_addr(&addr->addr))); - address_ttl_free(addr); - SMARTLIST_DEL_CURRENT(resolved_addresses, addr); - } - } SMARTLIST_FOREACH_END(addr); - if (orig_len && smartlist_len(resolved_addresses) == 0) { - log_info(LD_APP, "Got a resolved cell with only private addresses; " - "dropping it."); - connection_ap_handshake_socks_resolved(entry_conn, - RESOLVED_TYPE_ERROR_TRANSIENT, - 0, NULL, 0, TIME_MAX); - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_TORPROTOCOL); - goto done; - } - } - - connection_ap_handshake_socks_got_resolved_cell(entry_conn, - errcode, - resolved_addresses); - - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_DONE | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - - done: - SMARTLIST_FOREACH(resolved_addresses, address_ttl_t *, addr, - address_ttl_free(addr)); - smartlist_free(resolved_addresses); - return 0; -} - /** An incoming relay cell has arrived from circuit circ to * stream conn. * @@ -1443,12 +1046,8 @@ connection_edge_process_relay_cell_not_open( "Got 'connected' while not in state connect_wait. Dropping."); return 0; } - CONNECTION_AP_EXPECT_NONPENDING(entry_conn); conn->base_.state = AP_CONN_STATE_OPEN; - log_info(LD_APP,"'connected' received for circid %u streamid %d " - "after %d seconds.", - (unsigned)circ->n_circ_id, - rh->stream_id, + log_info(LD_APP,"'connected' received after %d seconds.", (int)(time(NULL) - conn->base_.timestamp_lastread)); if (connected_cell_parse(rh, cell, &addr, &ttl) < 0) { log_fn(LOG_PROTOCOL_WARN, LD_APP, @@ -1469,8 +1068,8 @@ connection_edge_process_relay_cell_not_open( return 0; } - if ((family == AF_INET && ! entry_conn->entry_cfg.ipv4_traffic) || - (family == AF_INET6 && ! entry_conn->entry_cfg.ipv6_traffic)) { + if ((family == AF_INET && ! entry_conn->ipv4_traffic_ok) || + (family == AF_INET6 && ! entry_conn->ipv6_traffic_ok)) { log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a connected cell to %s with unsupported address family." " Closing.", fmt_addr(&addr)); @@ -1489,9 +1088,8 @@ connection_edge_process_relay_cell_not_open( circuit_log_path(LOG_INFO,LD_APP,TO_ORIGIN_CIRCUIT(circ)); /* don't send a socks reply to transparent conns */ tor_assert(entry_conn->socks_request != NULL); - if (!entry_conn->socks_request->has_finished) { + if (!entry_conn->socks_request->has_finished) connection_ap_handshake_socks_reply(entry_conn, NULL, 0, 0); - } /* Was it a linked dir conn? If so, a dir request just started to * fetch something; this could be a bootstrap status milestone. */ @@ -1519,7 +1117,7 @@ connection_edge_process_relay_cell_not_open( /* This is definitely a success, so forget about any pending data we * had sent. */ if (entry_conn->pending_optimistic_data) { - buf_free(entry_conn->pending_optimistic_data); + generic_buffer_free(entry_conn->pending_optimistic_data); entry_conn->pending_optimistic_data = NULL; } @@ -1533,7 +1131,67 @@ connection_edge_process_relay_cell_not_open( } if (conn->base_.type == CONN_TYPE_AP && rh->command == RELAY_COMMAND_RESOLVED) { - return connection_edge_process_resolved_cell(conn, cell, rh); + int ttl; + int answer_len; + uint8_t answer_type; + entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn); + if (conn->base_.state != AP_CONN_STATE_RESOLVE_WAIT) { + log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a 'resolved' cell while " + "not in state resolve_wait. Dropping."); + return 0; + } + tor_assert(SOCKS_COMMAND_IS_RESOLVE(entry_conn->socks_request->command)); + answer_len = cell->payload[RELAY_HEADER_SIZE+1]; + if (rh->length < 2 || answer_len+2>rh->length) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Dropping malformed 'resolved' cell"); + connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TORPROTOCOL); + return 0; + } + answer_type = cell->payload[RELAY_HEADER_SIZE]; + if (rh->length >= answer_len+6) + ttl = (int)ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+ + 2+answer_len)); + else + ttl = -1; + if (answer_type == RESOLVED_TYPE_IPV4 || + answer_type == RESOLVED_TYPE_IPV6) { + tor_addr_t addr; + if (decode_address_from_payload(&addr, cell->payload+RELAY_HEADER_SIZE, + rh->length) && + tor_addr_is_internal(&addr, 0) && + get_options()->ClientDNSRejectInternalAddresses) { + log_info(LD_APP,"Got a resolve with answer %s. Rejecting.", + fmt_addr(&addr)); + connection_ap_handshake_socks_resolved(entry_conn, + RESOLVED_TYPE_ERROR_TRANSIENT, + 0, NULL, 0, TIME_MAX); + connection_mark_unattached_ap(entry_conn, + END_STREAM_REASON_TORPROTOCOL); + return 0; + } + } + connection_ap_handshake_socks_resolved(entry_conn, + answer_type, + cell->payload[RELAY_HEADER_SIZE+1], /*answer_len*/ + cell->payload+RELAY_HEADER_SIZE+2, /*answer*/ + ttl, + -1); + if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { + tor_addr_t addr; + tor_addr_from_ipv4n(&addr, + get_uint32(cell->payload+RELAY_HEADER_SIZE+2)); + remap_event_helper(entry_conn, &addr); + } else if (answer_type == RESOLVED_TYPE_IPV6 && answer_len == 16) { + tor_addr_t addr; + tor_addr_from_ipv6_bytes(&addr, + (char*)(cell->payload+RELAY_HEADER_SIZE+2)); + remap_event_helper(entry_conn, &addr); + } + connection_mark_unattached_ap(entry_conn, + END_STREAM_REASON_DONE | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + return 0; } log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -1587,6 +1245,7 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, switch (rh.command) { case RELAY_COMMAND_BEGIN: case RELAY_COMMAND_CONNECTED: + case RELAY_COMMAND_DATA: case RELAY_COMMAND_END: case RELAY_COMMAND_RESOLVE: case RELAY_COMMAND_RESOLVED: @@ -1611,9 +1270,6 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, * EXIT_CONN_STATE_CONNECTING or EXIT_CONN_STATE_RESOLVING. * This speeds up HTTP, for example. */ optimistic_data = 1; - } else if (rh.stream_id == 0 && rh.command == RELAY_COMMAND_DATA) { - log_warn(LD_BUG, "Somehow I had a connection that matched a " - "data cell with stream ID 0."); } else { return connection_edge_process_relay_cell_not_open( &rh, cell, circ, conn, layer_hint); @@ -1622,7 +1278,6 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, switch (rh.command) { case RELAY_COMMAND_DROP: - rep_hist_padding_count_read(PADDING_TYPE_DROP); // log_info(domain,"Got a relay-level padding cell. Dropping."); return 0; case RELAY_COMMAND_BEGIN: @@ -1645,8 +1300,7 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, "Begin cell for known stream. Dropping."); return 0; } - if (rh.command == RELAY_COMMAND_BEGIN_DIR && - circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED) { + if (rh.command == RELAY_COMMAND_BEGIN_DIR) { /* Assign this circuit and its app-ward OR connection a unique ID, * so that we can measure download times. The local edge and dir * connection will be assigned the same ID when they are created @@ -1676,11 +1330,7 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, circuit_consider_sending_sendme(circ, layer_hint); - if (rh.stream_id == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Relay data cell with zero " - "stream_id. Dropping."); - return 0; - } else if (!conn) { + if (!conn) { log_info(domain,"data cell dropped, unknown stream (streamid %d).", rh.stream_id); return 0; @@ -1693,19 +1343,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, } stats_n_data_bytes_received += rh.length; - connection_buf_add((char*)(cell->payload + RELAY_HEADER_SIZE), + connection_write_to_buf((char*)(cell->payload + RELAY_HEADER_SIZE), rh.length, TO_CONN(conn)); -#ifdef MEASUREMENTS_21206 - /* Count number of RELAY_DATA cells received on a linked directory - * connection. */ - connection_t *linked_conn = TO_CONN(conn)->linked_conn; - - if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { - ++(TO_DIR_CONN(linked_conn)->data_cells_received); - } -#endif /* defined(MEASUREMENTS_21206) */ - if (!optimistic_data) { /* Only send a SENDME if we're not getting optimistic data; otherwise * a SENDME could arrive before the CONNECTED. @@ -1799,9 +1439,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, } if ((reason = circuit_finish_handshake(TO_ORIGIN_CIRCUIT(circ), &extended_cell.created_cell)) < 0) { - circuit_mark_for_close(circ, -reason); - return 0; /* We don't want to cause a warning, so we mark the circuit - * here. */ + log_warn(domain,"circuit_finish_handshake failed."); + return reason; } } if ((reason=circuit_send_next_onion_skin(TO_ORIGIN_CIRCUIT(circ)))<0) { @@ -1854,9 +1493,7 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, return -END_CIRC_REASON_TORPROTOCOL; } log_info(domain, - "'connected' received on circid %u for streamid %d, " - "no conn attached anymore. Ignoring.", - (unsigned)circ->n_circ_id, rh.stream_id); + "'connected' received, no conn attached anymore. Ignoring."); return 0; case RELAY_COMMAND_SENDME: if (!rh.stream_id) { @@ -1877,7 +1514,7 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, if (circ->package_window + CIRCWINDOW_INCREMENT > CIRCWINDOW_START_MAX) { static struct ratelim_t client_warn_ratelim = RATELIM_INIT(600); - log_fn_ratelim(&client_warn_ratelim,LOG_PROTOCOL_WARN, LD_PROTOCOL, + log_fn_ratelim(&client_warn_ratelim, LOG_WARN, LD_PROTOCOL, "Unexpected sendme cell from client. " "Closing circ (window %d).", circ->package_window); @@ -2033,7 +1670,7 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial, entry_conn->sending_optimistic_data != NULL; if (PREDICT_UNLIKELY(sending_from_optimistic)) { - bytes_to_process = buf_datalen(entry_conn->sending_optimistic_data); + bytes_to_process = generic_buffer_len(entry_conn->sending_optimistic_data); if (PREDICT_UNLIKELY(!bytes_to_process)) { log_warn(LD_BUG, "sending_optimistic_data was non-NULL but empty"); bytes_to_process = connection_get_inbuf_len(TO_CONN(conn)); @@ -2061,13 +1698,13 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial, /* XXXX We could be more efficient here by sometimes packing * previously-sent optimistic data in the same cell with data * from the inbuf. */ - buf_get_bytes(entry_conn->sending_optimistic_data, payload, length); - if (!buf_datalen(entry_conn->sending_optimistic_data)) { - buf_free(entry_conn->sending_optimistic_data); + generic_buffer_get(entry_conn->sending_optimistic_data, payload, length); + if (!generic_buffer_len(entry_conn->sending_optimistic_data)) { + generic_buffer_free(entry_conn->sending_optimistic_data); entry_conn->sending_optimistic_data = NULL; } } else { - connection_buf_get_bytes(payload, length, TO_CONN(conn)); + connection_fetch_from_buf(payload, length, TO_CONN(conn)); } log_debug(domain,TOR_SOCKET_T_FORMAT": Packaging %d bytes (%d waiting).", @@ -2078,8 +1715,8 @@ connection_edge_package_raw_inbuf(edge_connection_t *conn, int package_partial, /* This is new optimistic data; remember it in case we need to detach and retry */ if (!entry_conn->pending_optimistic_data) - entry_conn->pending_optimistic_data = buf_new(); - buf_add(entry_conn->pending_optimistic_data, payload, length); + entry_conn->pending_optimistic_data = generic_buffer_new(); + generic_buffer_add(entry_conn->pending_optimistic_data, payload, length); } if (connection_edge_send_command(conn, RELAY_COMMAND_DATA, @@ -2402,17 +2039,64 @@ circuit_consider_sending_sendme(circuit_t *circ, crypt_path_t *layer_hint) assert_circuit_mux_okay(chan) #else #define assert_cmux_ok_paranoid(chan) -#endif /* defined(ACTIVE_CIRCUITS_PARANOIA) */ +#endif -/** The total number of cells we have allocated. */ +/** The total number of cells we have allocated from the memory pool. */ static size_t total_cells_allocated = 0; +/** A memory pool to allocate packed_cell_t objects. */ +static mp_pool_t *cell_pool = NULL; + +/** Memory pool to allocate insertion_time_elem_t objects used for cell + * statistics. */ +static mp_pool_t *it_pool = NULL; + +/** Memory pool to allocate insertion_command_elem_t objects used for cell + * statistics if CELL_STATS events are enabled. */ +static mp_pool_t *ic_pool = NULL; + +/** Allocate structures to hold cells. */ +void +init_cell_pool(void) +{ + tor_assert(!cell_pool); + cell_pool = mp_pool_new(sizeof(packed_cell_t), 128*1024); +} + +/** Free all storage used to hold cells (and insertion times/commands if we + * measure cell statistics and/or if CELL_STATS events are enabled). */ +void +free_cell_pool(void) +{ + /* Maybe we haven't called init_cell_pool yet; need to check for it. */ + if (cell_pool) { + mp_pool_destroy(cell_pool); + cell_pool = NULL; + } + if (it_pool) { + mp_pool_destroy(it_pool); + it_pool = NULL; + } + if (ic_pool) { + mp_pool_destroy(ic_pool); + ic_pool = NULL; + } +} + +/** Free excess storage in cell pool. */ +void +clean_cell_pool(void) +{ + tor_assert(cell_pool); + mp_pool_clean(cell_pool, 0, 1); +} + /** Release storage held by cell. */ -static inline void +static INLINE void packed_cell_free_unchecked(packed_cell_t *cell) { --total_cells_allocated; - tor_free(cell); + mp_pool_release(cell); } /** Allocate and return a new packed_cell_t. */ @@ -2420,12 +2104,12 @@ STATIC packed_cell_t * packed_cell_new(void) { ++total_cells_allocated; - return tor_malloc_zero(sizeof(packed_cell_t)); + return mp_pool_get(cell_pool); } /** Return a packed cell used outside by channel_t lower layer */ void -packed_cell_free_(packed_cell_t *cell) +packed_cell_free(packed_cell_t *cell) { if (!cell) return; @@ -2437,22 +2121,23 @@ packed_cell_free_(packed_cell_t *cell) void dump_cell_pool_usage(int severity) { + circuit_t *c; int n_circs = 0; int n_cells = 0; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, c) { + TOR_LIST_FOREACH(c, circuit_get_global_list(), head) { n_cells += c->n_chan_cells.n; if (!CIRCUIT_IS_ORIGIN(c)) n_cells += TO_OR_CIRCUIT(c)->p_chan_cells.n; ++n_circs; } - SMARTLIST_FOREACH_END(c); tor_log(severity, LD_MM, "%d cells allocated on %d circuits. %d cells leaked.", n_cells, n_circs, (int)total_cells_allocated - n_cells); + mp_pool_log_status(cell_pool, severity); } /** Allocate a new copy of packed cell. */ -static inline packed_cell_t * +static INLINE packed_cell_t * packed_cell_copy(const cell_t *cell, int wide_circ_ids) { packed_cell_t *c = packed_cell_new(); @@ -2468,6 +2153,57 @@ cell_queue_append(cell_queue_t *queue, packed_cell_t *cell) ++queue->n; } +/** Append command of type command in direction to queue for + * CELL_STATS event. */ +static void +cell_command_queue_append(cell_queue_t *queue, uint8_t command) +{ + insertion_command_queue_t *ic_queue = queue->insertion_commands; + if (!ic_pool) + ic_pool = mp_pool_new(sizeof(insertion_command_elem_t), 1024); + if (!ic_queue) { + ic_queue = tor_malloc_zero(sizeof(insertion_command_queue_t)); + queue->insertion_commands = ic_queue; + } + if (ic_queue->last && ic_queue->last->command == command) { + ic_queue->last->counter++; + } else { + insertion_command_elem_t *elem = mp_pool_get(ic_pool); + elem->next = NULL; + elem->command = command; + elem->counter = 1; + if (ic_queue->last) { + ic_queue->last->next = elem; + ic_queue->last = elem; + } else { + ic_queue->first = ic_queue->last = elem; + } + } +} + +/** Retrieve oldest command from queue and write it to + * command for CELL_STATS event. Return 0 for success, -1 + * otherwise. */ +static int +cell_command_queue_pop(uint8_t *command, cell_queue_t *queue) +{ + int res = -1; + insertion_command_queue_t *ic_queue = queue->insertion_commands; + if (ic_queue && ic_queue->first) { + insertion_command_elem_t *ic_elem = ic_queue->first; + ic_elem->counter--; + if (ic_elem->counter < 1) { + ic_queue->first = ic_elem->next; + if (ic_elem == ic_queue->last) + ic_queue->last = NULL; + mp_pool_release(ic_elem); + } + *command = ic_elem->command; + res = 0; + } + return res; +} + /** Append a newly allocated copy of cell to the end of the * exitward (or app-ward) queue of circ. If * use_stats is true, record statistics about the cell. @@ -2477,13 +2213,54 @@ cell_queue_append_packed_copy(circuit_t *circ, cell_queue_t *queue, int exitward, const cell_t *cell, int wide_circ_ids, int use_stats) { + struct timeval now; packed_cell_t *copy = packed_cell_copy(cell, wide_circ_ids); - (void)circ; - (void)exitward; - (void)use_stats; - - copy->inserted_timestamp = monotime_coarse_get_stamp(); - + tor_gettimeofday_cached(&now); + copy->inserted_time = (uint32_t)tv_to_msec(&now); + + /* Remember the time when this cell was put in the queue. */ + /*XXXX This may be obsoleted by inserted_time */ + if ((get_options()->CellStatistics || + get_options()->TestingEnableCellStatsEvent) && use_stats) { + uint32_t added; + insertion_time_queue_t *it_queue = queue->insertion_times; + if (!it_pool) + it_pool = mp_pool_new(sizeof(insertion_time_elem_t), 1024); + +#define SECONDS_IN_A_DAY 86400L + added = (uint32_t)(((now.tv_sec % SECONDS_IN_A_DAY) * 100L) + + ((uint32_t)now.tv_usec / (uint32_t)10000L)); + if (!it_queue) { + it_queue = tor_malloc_zero(sizeof(insertion_time_queue_t)); + queue->insertion_times = it_queue; + } + if (it_queue->last && it_queue->last->insertion_time == added) { + it_queue->last->counter++; + } else { + insertion_time_elem_t *elem = mp_pool_get(it_pool); + elem->next = NULL; + elem->insertion_time = added; + elem->counter = 1; + if (it_queue->last) { + it_queue->last->next = elem; + it_queue->last = elem; + } else { + it_queue->first = it_queue->last = elem; + } + } + } + /* Remember that we added a cell to the queue, and remember the cell + * command. */ + if (get_options()->TestingEnableCellStatsEvent && circ) { + testing_cell_stats_entry_t *ent = + tor_malloc_zero(sizeof(testing_cell_stats_entry_t)); + ent->command = cell->command; + ent->exitward = exitward; + if (!circ->testing_cell_stats) + circ->testing_cell_stats = smartlist_new(); + smartlist_add(circ->testing_cell_stats, ent); + cell_command_queue_append(queue, cell->command); + } cell_queue_append(queue, copy); } @@ -2506,6 +2283,14 @@ cell_queue_clear(cell_queue_t *queue) } TOR_SIMPLEQ_INIT(&queue->head); queue->n = 0; + if (queue->insertion_times) { + while (queue->insertion_times->first) { + insertion_time_elem_t *elem = queue->insertion_times->first; + queue->insertion_times->first = elem->next; + mp_pool_release(elem); + } + tor_free(queue->insertion_times); + } } /** Extract and return the cell at the head of queue; return NULL if @@ -2521,130 +2306,29 @@ cell_queue_pop(cell_queue_t *queue) return cell; } -/** Initialize queue as an empty cell queue. */ -void -destroy_cell_queue_init(destroy_cell_queue_t *queue) -{ - memset(queue, 0, sizeof(destroy_cell_queue_t)); - TOR_SIMPLEQ_INIT(&queue->head); -} - -/** Remove and free every cell in queue. */ -void -destroy_cell_queue_clear(destroy_cell_queue_t *queue) -{ - destroy_cell_t *cell; - while ((cell = TOR_SIMPLEQ_FIRST(&queue->head))) { - TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next); - tor_free(cell); - } - TOR_SIMPLEQ_INIT(&queue->head); - queue->n = 0; -} - -/** Extract and return the cell at the head of queue; return NULL if - * queue is empty. */ -STATIC destroy_cell_t * -destroy_cell_queue_pop(destroy_cell_queue_t *queue) -{ - destroy_cell_t *cell = TOR_SIMPLEQ_FIRST(&queue->head); - if (!cell) - return NULL; - TOR_SIMPLEQ_REMOVE_HEAD(&queue->head, next); - --queue->n; - return cell; -} - -/** Append a destroy cell for circid to queue. */ -void -destroy_cell_queue_append(destroy_cell_queue_t *queue, - circid_t circid, - uint8_t reason) -{ - destroy_cell_t *cell = tor_malloc_zero(sizeof(destroy_cell_t)); - cell->circid = circid; - cell->reason = reason; - /* Not yet used, but will be required for OOM handling. */ - cell->inserted_timestamp = monotime_coarse_get_stamp(); - - TOR_SIMPLEQ_INSERT_TAIL(&queue->head, cell, next); - ++queue->n; -} - -/** Convert a destroy_cell_t to a newly allocated cell_t. Frees its input. */ -static packed_cell_t * -destroy_cell_to_packed_cell(destroy_cell_t *inp, int wide_circ_ids) -{ - packed_cell_t *packed = packed_cell_new(); - cell_t cell; - memset(&cell, 0, sizeof(cell)); - cell.circ_id = inp->circid; - cell.command = CELL_DESTROY; - cell.payload[0] = inp->reason; - cell_pack(packed, &cell, wide_circ_ids); - - tor_free(inp); - return packed; -} - /** Return the total number of bytes used for each packed_cell in a queue. * Approximate. */ size_t packed_cell_mem_cost(void) { - return sizeof(packed_cell_t); + return sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD + + get_options()->CellStatistics ? + (sizeof(insertion_time_elem_t)+MP_POOL_ITEM_OVERHEAD) : 0; } -/* DOCDOC */ -STATIC size_t -cell_queues_get_total_allocation(void) -{ - return total_cells_allocated * packed_cell_mem_cost(); -} - -/** How long after we've been low on memory should we try to conserve it? */ -#define MEMORY_PRESSURE_INTERVAL (30*60) - -/** The time at which we were last low on memory. */ -static time_t last_time_under_memory_pressure = 0; - /** Check whether we've got too much space used for cells. If so, * call the OOM handler and return 1. Otherwise, return 0. */ -STATIC int +static int cell_queues_check_size(void) { - size_t alloc = cell_queues_get_total_allocation(); - alloc += buf_get_total_allocation(); - alloc += tor_compress_get_total_allocation(); - const size_t rend_cache_total = rend_cache_get_total_allocation(); - alloc += rend_cache_total; - if (alloc >= get_options()->MaxMemInQueues_low_threshold) { - last_time_under_memory_pressure = approx_time(); - if (alloc >= get_options()->MaxMemInQueues) { - /* If we're spending over 20% of the memory limit on hidden service - * descriptors, free them until we're down to 10%. - */ - if (rend_cache_total > get_options()->MaxMemInQueues / 5) { - const size_t bytes_to_remove = - rend_cache_total - (size_t)(get_options()->MaxMemInQueues / 10); - alloc -= hs_cache_handle_oom(time(NULL), bytes_to_remove); - } - circuits_handle_oom(alloc); - return 1; - } + size_t alloc = total_cells_allocated * packed_cell_mem_cost(); + if (alloc >= get_options()->MaxMemInCellQueues) { + circuits_handle_oom(alloc); + return 1; } return 0; } -/** Return true if we've been under memory pressure in the last - * MEMORY_PRESSURE_INTERVAL seconds. */ -int -have_been_under_memory_pressure(void) -{ - return last_time_under_memory_pressure + MEMORY_PRESSURE_INTERVAL - < approx_time(); -} - /** * Update the number of cells available on the circuit's n_chan or p_chan's * circuit mux. @@ -2675,7 +2359,7 @@ update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction, /* Cmux sanity check */ if (! circuitmux_is_circuit_attached(cmux, circ)) { - log_warn(LD_BUG, "called on non-attached circuit from %s:%d", + log_warn(LD_BUG, "called on non-attachd circuit from %s:%d", file, lineno); return; } @@ -2693,18 +2377,14 @@ update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction, assert_cmux_ok_paranoid(chan); } -/** Remove all circuits from the cmux on chan. - * - * If circuits_out is non-NULL, add all detached circuits to - * circuits_out. - **/ +/** Remove all circuits from the cmux on chan. */ void -channel_unlink_all_circuits(channel_t *chan, smartlist_t *circuits_out) +channel_unlink_all_circuits(channel_t *chan) { tor_assert(chan); tor_assert(chan->cmux); - circuitmux_detach_all_circuits(chan->cmux, circuits_out); + circuitmux_detach_all_circuits(chan->cmux); chan->num_n_circuits = 0; chan->num_p_circuits = 0; } @@ -2744,7 +2424,7 @@ set_streams_blocked_on_circ(circuit_t *circ, channel_t *chan, edge->edge_blocked_on_circ = block; } - if (!conn->read_event) { + if (!conn->read_event && !HAS_BUFFEREVENT(conn)) { /* This connection is a placeholder for something; probably a DNS * request. It can't actually stop or start reading.*/ continue; @@ -2763,39 +2443,16 @@ set_streams_blocked_on_circ(circuit_t *circ, channel_t *chan, return n; } -/** Extract the command from a packed cell. */ -static uint8_t -packed_cell_get_command(const packed_cell_t *cell, int wide_circ_ids) -{ - if (wide_circ_ids) { - return get_uint8(cell->body+4); - } else { - return get_uint8(cell->body+2); - } -} - -/** Extract the circuit ID from a packed cell. */ -circid_t -packed_cell_get_circid(const packed_cell_t *cell, int wide_circ_ids) -{ - if (wide_circ_ids) { - return ntohl(get_uint32(cell->body)); - } else { - return ntohs(get_uint16(cell->body)); - } -} - /** Pull as many cells as possible (but no more than max) from the * queue of the first active circuit on chan, and write them to * chan->outbuf. Return the number of cells written. Advance * the active circuit pointer to the next active circuit in the ring. */ -MOCK_IMPL(int, -channel_flush_from_first_active_circuit, (channel_t *chan, int max)) +int +channel_flush_from_first_active_circuit(channel_t *chan, int max) { circuitmux_t *cmux = NULL; int n_flushed = 0; - cell_queue_t *queue; - destroy_cell_queue_t *destroy_queue=NULL; + cell_queue_t *queue, *destroy_queue=NULL; circuit_t *circ; or_circuit_t *or_circ; int streams_blocked; @@ -2810,23 +2467,10 @@ channel_flush_from_first_active_circuit, (channel_t *chan, int max)) while (n_flushed < max) { circ = circuitmux_get_first_active_circuit(cmux, &destroy_queue); if (destroy_queue) { - destroy_cell_t *dcell; /* this code is duplicated from some of the logic below. Ugly! XXXX */ - /* If we are given a destroy_queue here, then it is required to be - * nonempty... */ tor_assert(destroy_queue->n > 0); - dcell = destroy_cell_queue_pop(destroy_queue); - /* ...and pop() will always yield a cell from a nonempty queue. */ - tor_assert(dcell); - /* frees dcell */ - cell = destroy_cell_to_packed_cell(dcell, chan->wide_circ_ids); - /* Send the DESTROY cell. It is very unlikely that this fails but just - * in case, get rid of the channel. */ - if (channel_write_packed_cell(chan, cell) < 0) { - /* The cell has been freed. */ - channel_mark_for_close(chan); - continue; - } + cell = cell_queue_pop(destroy_queue); + channel_write_packed_cell(chan, cell); /* Update the cmux destroy counter */ circuitmux_notify_xmit_destroy(cmux); cell = NULL; @@ -2848,15 +2492,6 @@ channel_flush_from_first_active_circuit, (channel_t *chan, int max)) } /* Circuitmux told us this was active, so it should have cells */ - if (/*BUG(*/ queue->n == 0 /*)*/) { - log_warn(LD_BUG, "Found a supposedly active circuit with no cells " - "to send. Trying to recover."); - circuitmux_set_num_cells(cmux, circ, 0); - if (! circ->marked_for_close) - circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL); - continue; - } - tor_assert(queue->n > 0); /* @@ -2869,30 +2504,55 @@ channel_flush_from_first_active_circuit, (channel_t *chan, int max)) /* Calculate the exact time that this cell has spent in the queue. */ if (get_options()->CellStatistics || get_options()->TestingEnableCellStatsEvent) { - uint32_t timestamp_now = monotime_coarse_get_stamp(); - uint32_t msec_waiting = - (uint32_t) monotime_coarse_stamp_units_to_approx_msec( - timestamp_now - cell->inserted_timestamp); - - if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) { - or_circ = TO_OR_CIRCUIT(circ); - or_circ->total_cell_waiting_time += msec_waiting; - or_circ->processed_cells++; - } - - if (get_options()->TestingEnableCellStatsEvent) { - uint8_t command = packed_cell_get_command(cell, chan->wide_circ_ids); - - testing_cell_stats_entry_t *ent = - tor_malloc_zero(sizeof(testing_cell_stats_entry_t)); - ent->command = command; - ent->waiting_time = msec_waiting / 10; - ent->removed = 1; - if (circ->n_chan == chan) - ent->exitward = 1; - if (!circ->testing_cell_stats) - circ->testing_cell_stats = smartlist_new(); - smartlist_add(circ->testing_cell_stats, ent); + struct timeval tvnow; + uint32_t flushed; + uint32_t cell_waiting_time; + insertion_time_queue_t *it_queue = queue->insertion_times; + tor_gettimeofday_cached(&tvnow); + flushed = (uint32_t)((tvnow.tv_sec % SECONDS_IN_A_DAY) * 100L + + (uint32_t)tvnow.tv_usec / (uint32_t)10000L); + if (!it_queue || !it_queue->first) { + log_info(LD_GENERAL, "Cannot determine insertion time of cell. " + "Looks like the CellStatistics option was " + "recently enabled."); + } else { + insertion_time_elem_t *elem = it_queue->first; + cell_waiting_time = + (uint32_t)((flushed * 10L + SECONDS_IN_A_DAY * 1000L - + elem->insertion_time * 10L) % + (SECONDS_IN_A_DAY * 1000L)); +#undef SECONDS_IN_A_DAY + elem->counter--; + if (elem->counter < 1) { + it_queue->first = elem->next; + if (elem == it_queue->last) + it_queue->last = NULL; + mp_pool_release(elem); + } + if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) { + or_circ = TO_OR_CIRCUIT(circ); + or_circ->total_cell_waiting_time += cell_waiting_time; + or_circ->processed_cells++; + } + if (get_options()->TestingEnableCellStatsEvent) { + uint8_t command; + if (cell_command_queue_pop(&command, queue) < 0) { + log_info(LD_GENERAL, "Cannot determine command of cell. " + "Looks like the CELL_STATS event was " + "recently enabled."); + } else { + testing_cell_stats_entry_t *ent = + tor_malloc_zero(sizeof(testing_cell_stats_entry_t)); + ent->command = command; + ent->waiting_time = (unsigned int)cell_waiting_time / 10; + ent->removed = 1; + if (circ->n_chan == chan) + ent->exitward = 1; + if (!circ->testing_cell_stats) + circ->testing_cell_stats = smartlist_new(); + smartlist_add(circ->testing_cell_stats, ent); + } + } } } @@ -2903,13 +2563,8 @@ channel_flush_from_first_active_circuit, (channel_t *chan, int max)) DIRREQ_TUNNELED, DIRREQ_CIRC_QUEUE_FLUSHED); - /* Now send the cell. It is very unlikely that this fails but just in - * case, get rid of the channel. */ - if (channel_write_packed_cell(chan, cell) < 0) { - /* The cell has been freed at this point. */ - channel_mark_for_close(chan); - continue; - } + /* Now send the cell */ + channel_write_packed_cell(chan, cell); cell = NULL; /* @@ -2944,13 +2599,22 @@ channel_flush_from_first_active_circuit, (channel_t *chan, int max)) return n_flushed; } +#if 0 +/** Indicate the current preferred cap for middle circuits; zero disables + * the cap. Right now it's just a constant, ORCIRC_MAX_MIDDLE_CELLS, but + * the logic in append_cell_to_circuit_queue() is written to be correct + * if we want to base it on a consensus param or something that might change + * in the future. + */ +static int +get_max_middle_cells(void) +{ + return ORCIRC_MAX_MIDDLE_CELLS; +} +#endif + /** Add cell to the queue of circ writing to chan - * transmitting in direction. - * - * The given cell is copied over the circuit queue so the caller must - * cleanup the memory. - * - * This function is part of the fast path. */ + * transmitting in direction. */ void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, cell_t *cell, cell_direction_t direction, @@ -2959,6 +2623,10 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, or_circuit_t *orcirc = NULL; cell_queue_t *queue; int streams_blocked; +#if 0 + uint32_t tgt_max_middle_cells, p_len, n_len, tmp, hard_max_middle_cells; +#endif + int exitward; if (circ->marked_for_close) return; @@ -2973,14 +2641,93 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, streams_blocked = circ->streams_blocked_on_p_chan; } - /* Very important that we copy to the circuit queue because all calls to - * this function use the stack for the cell memory. */ + /* + * Disabling this for now because of a possible guard discovery attack + */ +#if 0 + /* Are we a middle circuit about to exceed ORCIRC_MAX_MIDDLE_CELLS? */ + if ((circ->n_chan != NULL) && CIRCUIT_IS_ORCIRC(circ)) { + orcirc = TO_OR_CIRCUIT(circ); + if (orcirc->p_chan) { + /* We are a middle circuit if we have both n_chan and p_chan */ + /* We'll need to know the current preferred maximum */ + tgt_max_middle_cells = get_max_middle_cells(); + if (tgt_max_middle_cells > 0) { + /* Do we need to initialize middle_max_cells? */ + if (orcirc->max_middle_cells == 0) { + orcirc->max_middle_cells = tgt_max_middle_cells; + } else { + if (tgt_max_middle_cells > orcirc->max_middle_cells) { + /* If we want to increase the cap, we can do so right away */ + orcirc->max_middle_cells = tgt_max_middle_cells; + } else if (tgt_max_middle_cells < orcirc->max_middle_cells) { + /* + * If we're shrinking the cap, we can't shrink past either queue; + * compare tgt_max_middle_cells rather than tgt_max_middle_cells * + * ORCIRC_MAX_MIDDLE_KILL_THRESH so the queues don't shrink enough + * to generate spurious warnings, either. + */ + n_len = circ->n_chan_cells.n; + p_len = orcirc->p_chan_cells.n; + tmp = tgt_max_middle_cells; + if (tmp < n_len) tmp = n_len; + if (tmp < p_len) tmp = p_len; + orcirc->max_middle_cells = tmp; + } + /* else no change */ + } + } else { + /* tgt_max_middle_cells == 0 indicates we should disable the cap */ + orcirc->max_middle_cells = 0; + } + + /* Now we know orcirc->max_middle_cells is set correctly */ + if (orcirc->max_middle_cells > 0) { + hard_max_middle_cells = + (uint32_t)(((double)orcirc->max_middle_cells) * + ORCIRC_MAX_MIDDLE_KILL_THRESH); + + if ((unsigned)queue->n + 1 >= hard_max_middle_cells) { + /* Queueing this cell would put queue over the kill theshold */ + log_warn(LD_CIRC, + "Got a cell exceeding the hard cap of %u in the " + "%s direction on middle circ ID %u on chan ID " + U64_FORMAT "; killing the circuit.", + hard_max_middle_cells, + (direction == CELL_DIRECTION_OUT) ? "n" : "p", + (direction == CELL_DIRECTION_OUT) ? + circ->n_circ_id : orcirc->p_circ_id, + U64_PRINTF_ARG( + (direction == CELL_DIRECTION_OUT) ? + circ->n_chan->global_identifier : + orcirc->p_chan->global_identifier)); + circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT); + return; + } else if ((unsigned)queue->n + 1 == orcirc->max_middle_cells) { + /* Only use ==, not >= for this test so we don't spam the log */ + log_warn(LD_CIRC, + "While trying to queue a cell, reached the soft cap of %u " + "in the %s direction on middle circ ID %u " + "on chan ID " U64_FORMAT ".", + orcirc->max_middle_cells, + (direction == CELL_DIRECTION_OUT) ? "n" : "p", + (direction == CELL_DIRECTION_OUT) ? + circ->n_circ_id : orcirc->p_circ_id, + U64_PRINTF_ARG( + (direction == CELL_DIRECTION_OUT) ? + circ->n_chan->global_identifier : + orcirc->p_chan->global_identifier)); + } + } + } + } +#endif + cell_queue_append_packed_copy(circ, queue, exitward, cell, chan->wide_circ_ids, 1); - /* Check and run the OOM if needed. */ if (PREDICT_UNLIKELY(cell_queues_check_size())) { - /* We ran the OOM handler which might have closed this circuit. */ + /* We ran the OOM handler */ if (circ->marked_for_close) return; } @@ -3002,8 +2749,14 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, log_debug(LD_GENERAL, "Made a circuit active."); } - /* New way: mark this as having waiting cells for the scheduler */ - scheduler_channel_has_waiting_cells(chan); + if (!channel_has_queued_writes(chan)) { + /* There is no data at all waiting to be sent on the outbuf. Add a + * cell, so that we can notice when it gets flushed, flushed_some can + * get called, and we can start putting more data onto the buffer then. + */ + log_debug(LD_GENERAL, "Primed a buffer."); + channel_flush_from_first_active_circuit(chan, 1); + } } /** Append an encoded value of addr to payload_out, which must diff --git a/src/tor/src/or/relay.h b/src/tor/relay.h similarity index 65% rename from src/tor/src/or/relay.h rename to src/tor/relay.h index daf789c85..20eecfb40 100644 --- a/src/tor/src/or/relay.h +++ b/src/tor/relay.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -20,13 +20,10 @@ int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, void relay_header_pack(uint8_t *dest, const relay_header_t *src); void relay_header_unpack(relay_header_t *dest, const uint8_t *src); -MOCK_DECL(int, -relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *circ, +int relay_send_command_from_edge_(streamid_t stream_id, circuit_t *circ, uint8_t relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer, - const char *filename, int lineno)); -/* Indicates to relay_send_command_from_edge() that it is a control cell. */ -#define CONTROL_CELL_ID 0 + const char *filename, int lineno); #define relay_send_command_from_edge(stream_id, circ, relay_command, payload, \ payload_len, cpath_layer) \ relay_send_command_from_edge_((stream_id), (circ), (relay_command), \ @@ -45,15 +42,14 @@ extern uint64_t stats_n_data_bytes_packaged; extern uint64_t stats_n_data_cells_received; extern uint64_t stats_n_data_bytes_received; +void init_cell_pool(void); +void free_cell_pool(void); +void clean_cell_pool(void); void dump_cell_pool_usage(int severity); size_t packed_cell_mem_cost(void); -int have_been_under_memory_pressure(void); - /* For channeltls.c */ -void packed_cell_free_(packed_cell_t *cell); -#define packed_cell_free(cell) \ - FREE_AND_NULL(packed_cell_t, packed_cell_free_, (cell)) +void packed_cell_free(packed_cell_t *cell); void cell_queue_init(cell_queue_t *queue); void cell_queue_clear(cell_queue_t *queue); @@ -65,16 +61,8 @@ void cell_queue_append_packed_copy(circuit_t *circ, cell_queue_t *queue, void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, cell_t *cell, cell_direction_t direction, streamid_t fromstream); - -void destroy_cell_queue_init(destroy_cell_queue_t *queue); -void destroy_cell_queue_clear(destroy_cell_queue_t *queue); -void destroy_cell_queue_append(destroy_cell_queue_t *queue, - circid_t circid, - uint8_t reason); - -void channel_unlink_all_circuits(channel_t *chan, smartlist_t *detached_out); -MOCK_DECL(int, channel_flush_from_first_active_circuit, - (channel_t *chan, int max)); +void channel_unlink_all_circuits(channel_t *chan); +int channel_flush_from_first_active_circuit(channel_t *chan, int max); void assert_circuit_mux_okay(channel_t *chan); void update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction, const char *file, int lineno); @@ -92,31 +80,12 @@ void stream_choice_seed_weak_rng(void); int relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, crypt_path_t **layer_hint, char *recognized); -circid_t packed_cell_get_circid(const packed_cell_t *cell, int wide_circ_ids); - #ifdef RELAY_PRIVATE STATIC int connected_cell_parse(const relay_header_t *rh, const cell_t *cell, tor_addr_t *addr_out, int *ttl_out); -/** An address-and-ttl tuple as yielded by resolved_cell_parse */ -typedef struct address_ttl_s { - tor_addr_t addr; - char *hostname; - int ttl; -} address_ttl_t; -STATIC void address_ttl_free_(address_ttl_t *addr); -#define address_ttl_free(addr) \ - FREE_AND_NULL(address_ttl_t, address_ttl_free_, (addr)) -STATIC int resolved_cell_parse(const cell_t *cell, const relay_header_t *rh, - smartlist_t *addresses_out, int *errcode_out); -STATIC int connection_edge_process_resolved_cell(edge_connection_t *conn, - const cell_t *cell, - const relay_header_t *rh); STATIC packed_cell_t *packed_cell_new(void); STATIC packed_cell_t *cell_queue_pop(cell_queue_t *queue); -STATIC destroy_cell_t *destroy_cell_queue_pop(destroy_cell_queue_t *queue); -STATIC size_t cell_queues_get_total_allocation(void); -STATIC int cell_queues_check_size(void); -#endif /* defined(RELAY_PRIVATE) */ +#endif -#endif /* !defined(TOR_RELAY_H) */ +#endif diff --git a/src/tor/src/or/rendclient.c b/src/tor/rendclient.c similarity index 55% rename from src/tor/src/or/rendclient.c rename to src/tor/rendclient.c index 07fa33306..728cddffa 100644 --- a/src/tor/src/or/rendclient.c +++ b/src/tor/rendclient.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,10 +16,7 @@ #include "connection.h" #include "connection_edge.h" #include "directory.h" -#include "hs_common.h" -#include "hs_circuit.h" -#include "hs_client.h" -#include "main.h" +#include "onion_main.h" #include "networkstatus.h" #include "nodelist.h" #include "relay.h" @@ -41,9 +38,8 @@ void rend_client_purge_state(void) { rend_cache_purge(); - rend_cache_failure_purge(); rend_client_cancel_descriptor_fetches(); - hs_purge_last_hid_serv_requests(); + rend_client_purge_last_hid_serv_requests(); } /** Called when we've established a circuit to an introduction point: @@ -55,7 +51,7 @@ rend_client_introcirc_has_opened(origin_circuit_t *circ) tor_assert(circ->cpath); log_info(LD_REND,"introcirc is open"); - connection_ap_attach_pending(1); + connection_ap_attach_pending(); } /** Send the establish-rendezvous cell along a rendezvous circuit. if @@ -68,7 +64,11 @@ rend_client_send_establish_rendezvous(origin_circuit_t *circ) tor_assert(circ->rend_data); log_info(LD_REND, "Sending an ESTABLISH_RENDEZVOUS cell"); - crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN); + if (crypto_rand(circ->rend_data->rend_cookie, REND_COOKIE_LEN) < 0) { + log_warn(LD_BUG, "Internal error: Couldn't produce random cookie."); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); + return -1; + } /* Set timestamp_dirty, because circuit_expire_building expects it, * and the rend cookie also means we've used the circ. */ @@ -90,6 +90,56 @@ rend_client_send_establish_rendezvous(origin_circuit_t *circ) return 0; } +/** Extend the introduction circuit circ to another valid + * introduction point for the hidden service it is trying to connect + * to, or mark it and launch a new circuit if we can't extend it. + * Return 0 on success or possible success. Return -1 and mark the + * introduction circuit for close on permanent failure. + * + * On failure, the caller is responsible for marking the associated + * rendezvous circuit for close. */ +static int +rend_client_reextend_intro_circuit(origin_circuit_t *circ) +{ + extend_info_t *extend_info; + int result; + extend_info = rend_client_get_random_intro(circ->rend_data); + if (!extend_info) { + log_warn(LD_REND, + "No usable introduction points left for %s. Closing.", + safe_str_client(circ->rend_data->onion_address)); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); + return -1; + } + // XXX: should we not re-extend if hs_circ_has_timed_out? + if (circ->remaining_relay_early_cells) { + log_info(LD_REND, + "Re-extending circ %u, this time to %s.", + (unsigned)circ->base_.n_circ_id, + safe_str_client(extend_info_describe(extend_info))); + result = circuit_extend_to_new_exit(circ, extend_info); + } else { + log_info(LD_REND, + "Closing intro circ %u (out of RELAY_EARLY cells).", + (unsigned)circ->base_.n_circ_id); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); + /* connection_ap_handshake_attach_circuit will launch a new intro circ. */ + result = 0; + } + extend_info_free(extend_info); + return result; +} + +/** Return true iff we should send timestamps in our INTRODUCE1 cells */ +static int +rend_client_should_send_timestamp(void) +{ + if (get_options()->Support022HiddenServices >= 0) + return get_options()->Support022HiddenServices; + + return networkstatus_get_param(NULL, "Support022HiddenServices", 1, 0, 1); +} + /** Called when we're trying to connect an ap conn; sends an INTRODUCE1 cell * down introcirc if possible. */ @@ -97,45 +147,40 @@ int rend_client_send_introduction(origin_circuit_t *introcirc, origin_circuit_t *rendcirc) { - const or_options_t *options = get_options(); size_t payload_len; int r, v3_shift = 0; char payload[RELAY_PAYLOAD_SIZE]; char tmp[RELAY_PAYLOAD_SIZE]; - rend_cache_entry_t *entry = NULL; + rend_cache_entry_t *entry; crypt_path_t *cpath; off_t dh_offset; crypto_pk_t *intro_key = NULL; int status = 0; - const char *onion_address; tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING); tor_assert(rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY); tor_assert(introcirc->rend_data); tor_assert(rendcirc->rend_data); - tor_assert(!rend_cmp_service_ids(rend_data_get_address(introcirc->rend_data), - rend_data_get_address(rendcirc->rend_data))); - assert_circ_anonymity_ok(introcirc, options); - assert_circ_anonymity_ok(rendcirc, options); - onion_address = rend_data_get_address(introcirc->rend_data); - - r = rend_cache_lookup_entry(onion_address, -1, &entry); - /* An invalid onion address is not possible else we have a big issue. */ - tor_assert(r != -EINVAL); - if (r < 0 || !rend_client_any_intro_points_usable(entry)) { - /* If the descriptor is not found or the intro points are not usable - * anymore, trigger a fetch. */ + tor_assert(!rend_cmp_service_ids(introcirc->rend_data->onion_address, + rendcirc->rend_data->onion_address)); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(introcirc->build_state->onehop_tunnel)); + tor_assert(!(rendcirc->build_state->onehop_tunnel)); +#endif + + if (rend_cache_lookup_entry(introcirc->rend_data->onion_address, -1, + &entry) < 1) { log_info(LD_REND, "query %s didn't have valid rend desc in cache. " "Refetching descriptor.", - safe_str_client(onion_address)); + safe_str_client(introcirc->rend_data->onion_address)); rend_client_refetch_v2_renddesc(introcirc->rend_data); { connection_t *conn; while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP, - AP_CONN_STATE_CIRCUIT_WAIT, onion_address))) { - connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn)); + AP_CONN_STATE_CIRCUIT_WAIT, + introcirc->rend_data->onion_address))) { conn->state = AP_CONN_STATE_RENDDESC_WAIT; } } @@ -144,7 +189,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc, goto cleanup; } - /* first 20 bytes of payload are the hash of the service's pk */ + /* first 20 bytes of payload are the hash of Bob's pk */ intro_key = NULL; SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *, intro, { @@ -158,12 +203,12 @@ rend_client_send_introduction(origin_circuit_t *introcirc, log_info(LD_REND, "Could not find intro key for %s at %s; we " "have a v2 rend desc with %d intro points. " "Trying a different intro point...", - safe_str_client(onion_address), + safe_str_client(introcirc->rend_data->onion_address), safe_str_client(extend_info_describe( introcirc->build_state->chosen_exit)), smartlist_len(entry->parsed->intro_nodes)); - if (hs_client_reextend_intro_circuit(introcirc)) { + if (rend_client_reextend_intro_circuit(introcirc)) { status = -2; goto perm_err; } else { @@ -198,17 +243,22 @@ rend_client_send_introduction(origin_circuit_t *introcirc, /* If version is 3, write (optional) auth data and timestamp. */ if (entry->parsed->protocols & (1<<3)) { tmp[0] = 3; /* version 3 of the cell format */ - /* auth type, if any */ - tmp[1] = (uint8_t) TO_REND_DATA_V2(introcirc->rend_data)->auth_type; + tmp[1] = (uint8_t)introcirc->rend_data->auth_type; /* auth type, if any */ v3_shift = 1; - if (tmp[1] != REND_NO_AUTH) { + if (introcirc->rend_data->auth_type != REND_NO_AUTH) { set_uint16(tmp+2, htons(REND_DESC_COOKIE_LEN)); - memcpy(tmp+4, TO_REND_DATA_V2(introcirc->rend_data)->descriptor_cookie, + memcpy(tmp+4, introcirc->rend_data->descriptor_cookie, REND_DESC_COOKIE_LEN); v3_shift += 2+REND_DESC_COOKIE_LEN; } - /* Once this held a timestamp. */ - set_uint32(tmp+v3_shift+1, 0); + if (rend_client_should_send_timestamp()) { + uint32_t now = (uint32_t)time(NULL); + now += 300; + now -= now % 600; + set_uint32(tmp+v3_shift+1, htonl(now)); + } else { + set_uint32(tmp+v3_shift+1, 0); + } v3_shift += 4; } /* if version 2 only write version number */ else if (entry->parsed->protocols & (1<<2)) { @@ -221,17 +271,12 @@ rend_client_send_introduction(origin_circuit_t *introcirc, extend_info_t *extend_info = rendcirc->build_state->chosen_exit; int klen; /* nul pads */ - set_uint32(tmp+v3_shift+1, tor_addr_to_ipv4n(&extend_info->addr)); + set_uint32(tmp+v3_shift+1, tor_addr_to_ipv4h(&extend_info->addr)); set_uint16(tmp+v3_shift+5, htons(extend_info->port)); memcpy(tmp+v3_shift+7, extend_info->identity_digest, DIGEST_LEN); klen = crypto_pk_asn1_encode(extend_info->onion_key, tmp+v3_shift+7+DIGEST_LEN+2, sizeof(tmp)-(v3_shift+7+DIGEST_LEN+2)); - if (klen < 0) { - log_warn(LD_BUG,"Internal error: can't encode public key."); - status = -2; - goto perm_err; - } set_uint16(tmp+v3_shift+7+DIGEST_LEN, htons(klen)); memcpy(tmp+v3_shift+7+DIGEST_LEN+2+klen, rendcirc->rend_data->rend_cookie, REND_COOKIE_LEN); @@ -252,9 +297,10 @@ rend_client_send_introduction(origin_circuit_t *introcirc, goto perm_err; } - /*XXX maybe give crypto_pk_obsolete_public_hybrid_encrypt a max_len arg, + note_crypto_pk_op(REND_CLIENT); + /*XXX maybe give crypto_pk_public_hybrid_encrypt a max_len arg, * to avoid buffer overflows? */ - r = crypto_pk_obsolete_public_hybrid_encrypt(intro_key, payload+DIGEST_LEN, + r = crypto_pk_public_hybrid_encrypt(intro_key, payload+DIGEST_LEN, sizeof(payload)-DIGEST_LEN, tmp, (int)(dh_offset+DH_KEY_LEN), @@ -324,27 +370,29 @@ rend_client_rendcirc_has_opened(origin_circuit_t *circ) } /** - * Called to close other intro circuits we launched in parallel. + * Called to close other intro circuits we launched in parallel + * due to timeout. */ static void -rend_client_close_other_intros(const uint8_t *rend_pk_digest) +rend_client_close_other_intros(const char *onion_address) { + circuit_t *c; /* abort parallel intro circs, if any */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, c) { + TOR_LIST_FOREACH(c, circuit_get_global_list(), head) { if ((c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING || c->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) && !c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) { origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(c); if (oc->rend_data && - rend_circuit_pk_digest_eq(oc, rend_pk_digest)) { + !rend_cmp_service_ids(onion_address, + oc->rend_data->onion_address)) { log_info(LD_REND|LD_CIRC, "Closing introduction circuit %d that we " "built in parallel (Purpose %d).", oc->global_identifier, c->purpose); - circuit_mark_for_close(c, END_CIRC_REASON_IP_NOW_REDUNDANT); + circuit_mark_for_close(c, END_CIRC_REASON_TIMEOUT); } } } - SMARTLIST_FOREACH_END(c); } /** Called when get an ACK or a NAK for a REND_INTRODUCE1 cell. @@ -353,15 +401,27 @@ int rend_client_introduction_acked(origin_circuit_t *circ, const uint8_t *request, size_t request_len) { - const or_options_t *options = get_options(); origin_circuit_t *rendcirc; (void) request; // XXXX Use this. - tor_assert(circ->build_state); + if (circ->base_.purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { + log_warn(LD_PROTOCOL, + "Received REND_INTRODUCE_ACK on unexpected circuit %u.", + (unsigned)circ->base_.n_circ_id); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); + return -1; + } + tor_assert(circ->build_state->chosen_exit); - assert_circ_anonymity_ok(circ, options); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(circ->build_state->onehop_tunnel)); +#endif tor_assert(circ->rend_data); + /* For path bias: This circuit was used successfully. Valid + * nacks and acks count. */ + pathbias_mark_use_success(circ); + if (request_len == 0) { /* It's an ACK; the introduction point relayed our introduction request. */ /* Locate the rend circ which is waiting to hear about this ack, @@ -370,7 +430,9 @@ rend_client_introduction_acked(origin_circuit_t *circ, log_info(LD_REND,"Received ack. Telling rend circ..."); rendcirc = circuit_get_ready_rend_circ_by_rend_data(circ->rend_data); if (rendcirc) { /* remember the ack */ - assert_circ_anonymity_ok(rendcirc, options); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(rendcirc->build_state->onehop_tunnel)); +#endif circuit_change_purpose(TO_CIRCUIT(rendcirc), CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED); /* Set timestamp_dirty, because circuit_expire_building expects @@ -386,8 +448,7 @@ rend_client_introduction_acked(origin_circuit_t *circ, circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); /* close any other intros launched in parallel */ - rend_client_close_other_intros(rend_data_get_pk_digest(circ->rend_data, - NULL)); + rend_client_close_other_intros(circ->rend_data->onion_address); } else { /* It's a NAK; the introduction point didn't relay our request. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_INTRODUCING); @@ -396,29 +457,158 @@ rend_client_introduction_acked(origin_circuit_t *circ, * If none remain, refetch the service descriptor. */ log_info(LD_REND, "Got nack for %s from %s...", - safe_str_client(rend_data_get_address(circ->rend_data)), + safe_str_client(circ->rend_data->onion_address), safe_str_client(extend_info_describe(circ->build_state->chosen_exit))); if (rend_client_report_intro_point_failure(circ->build_state->chosen_exit, circ->rend_data, INTRO_POINT_FAILURE_GENERIC)>0) { /* There are introduction points left. Re-extend the circuit to * another intro point and try again. */ - int result = hs_client_reextend_intro_circuit(circ); + int result = rend_client_reextend_intro_circuit(circ); /* XXXX If that call failed, should we close the rend circuit, * too? */ return result; - } else { - /* Close circuit because no more intro points are usable thus not - * useful anymore. Change it's purpose before so we don't report an - * intro point failure again triggering an extra descriptor fetch. */ - circuit_change_purpose(TO_CIRCUIT(circ), - CIRCUIT_PURPOSE_C_INTRODUCE_ACKED); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); } } return 0; } +/** The period for which a hidden service directory cannot be queried for + * the same descriptor ID again. */ +#define REND_HID_SERV_DIR_REQUERY_PERIOD (15 * 60) + +/** Contains the last request times to hidden service directories for + * certain queries; each key is a string consisting of the + * concatenation of a base32-encoded HS directory identity digest, a + * base32-encoded HS descriptor ID, and a hidden service address + * (without the ".onion" part); each value is a pointer to a time_t + * holding the time of the last request for that descriptor ID to that + * HS directory. */ +static strmap_t *last_hid_serv_requests_ = NULL; + +/** Returns last_hid_serv_requests_, initializing it to a new strmap if + * necessary. */ +static strmap_t * +get_last_hid_serv_requests(void) +{ + if (!last_hid_serv_requests_) + last_hid_serv_requests_ = strmap_new(); + return last_hid_serv_requests_; +} + +#define LAST_HID_SERV_REQUEST_KEY_LEN (REND_DESC_ID_V2_LEN_BASE32 + \ + REND_DESC_ID_V2_LEN_BASE32 + \ + REND_SERVICE_ID_LEN_BASE32) + +/** Look up the last request time to hidden service directory hs_dir + * for descriptor ID desc_id_base32 for the service specified in + * rend_query. If set is non-zero, + * assign the current time now and return that. Otherwise, return + * the most recent request time, or 0 if no such request has been sent + * before. */ +static time_t +lookup_last_hid_serv_request(routerstatus_t *hs_dir, + const char *desc_id_base32, + const rend_data_t *rend_query, + time_t now, int set) +{ + char hsdir_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + char hsdir_desc_comb_id[LAST_HID_SERV_REQUEST_KEY_LEN + 1]; + time_t *last_request_ptr; + strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); + base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32), + hs_dir->identity_digest, DIGEST_LEN); + tor_snprintf(hsdir_desc_comb_id, sizeof(hsdir_desc_comb_id), "%s%s%s", + hsdir_id_base32, + desc_id_base32, + rend_query->onion_address); + /* XXX023 tor_assert(strlen(hsdir_desc_comb_id) == + LAST_HID_SERV_REQUEST_KEY_LEN); */ + if (set) { + time_t *oldptr; + last_request_ptr = tor_malloc_zero(sizeof(time_t)); + *last_request_ptr = now; + oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id, + last_request_ptr); + tor_free(oldptr); + } else + last_request_ptr = strmap_get_lc(last_hid_serv_requests, + hsdir_desc_comb_id); + return (last_request_ptr) ? *last_request_ptr : 0; +} + +/** Clean the history of request times to hidden service directories, so that + * it does not contain requests older than REND_HID_SERV_DIR_REQUERY_PERIOD + * seconds any more. */ +static void +directory_clean_last_hid_serv_requests(time_t now) +{ + strmap_iter_t *iter; + time_t cutoff = now - REND_HID_SERV_DIR_REQUERY_PERIOD; + strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); + for (iter = strmap_iter_init(last_hid_serv_requests); + !strmap_iter_done(iter); ) { + const char *key; + void *val; + time_t *ent; + strmap_iter_get(iter, &key, &val); + ent = (time_t *) val; + if (*ent < cutoff) { + iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); + tor_free(ent); + } else { + iter = strmap_iter_next(last_hid_serv_requests, iter); + } + } +} + +/** Remove all requests related to the hidden service named + * onion_address from the history of times of requests to + * hidden service directories. */ +static void +purge_hid_serv_from_last_hid_serv_requests(const char *onion_address) +{ + strmap_iter_t *iter; + strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); + /* XXX023 tor_assert(strlen(onion_address) == REND_SERVICE_ID_LEN_BASE32); */ + for (iter = strmap_iter_init(last_hid_serv_requests); + !strmap_iter_done(iter); ) { + const char *key; + void *val; + strmap_iter_get(iter, &key, &val); + /* XXX023 tor_assert(strlen(key) == LAST_HID_SERV_REQUEST_KEY_LEN); */ + if (tor_memeq(key + LAST_HID_SERV_REQUEST_KEY_LEN - + REND_SERVICE_ID_LEN_BASE32, + onion_address, + REND_SERVICE_ID_LEN_BASE32)) { + iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); + tor_free(val); + } else { + iter = strmap_iter_next(last_hid_serv_requests, iter); + } + } +} + +/** Purge the history of request times to hidden service directories, + * so that future lookups of an HS descriptor will not fail because we + * accessed all of the HSDir relays responsible for the descriptor + * recently. */ +void +rend_client_purge_last_hid_serv_requests(void) +{ + /* Don't create the table if it doesn't exist yet (and it may very + * well not exist if the user hasn't accessed any HSes)... */ + strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_; + /* ... and let get_last_hid_serv_requests re-create it for us if + * necessary. */ + last_hid_serv_requests_ = NULL; + + if (old_last_hid_serv_requests != NULL) { + log_info(LD_REND, "Purging client last-HS-desc-request-time table"); + strmap_free(old_last_hid_serv_requests, tor_free_); + } +} + /** Determine the responsible hidden service directories for desc_id * and fetch the descriptor with that ID from one of them. Only * send a request to a hidden service directory that we have not yet tried @@ -426,70 +616,61 @@ rend_client_introduction_acked(origin_circuit_t *circ, * in the case that no hidden service directory is left to ask for the * descriptor, return 0, and in case of a failure -1. */ static int -directory_get_from_hs_dir(const char *desc_id, - const rend_data_t *rend_query, - routerstatus_t *rs_hsdir) +directory_get_from_hs_dir(const char *desc_id, const rend_data_t *rend_query) { - routerstatus_t *hs_dir = rs_hsdir; - char *hsdir_fp; + smartlist_t *responsible_dirs = smartlist_new(); + routerstatus_t *hs_dir; char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + time_t now = time(NULL); char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; - const rend_data_v2_t *rend_data; -#ifdef ENABLE_TOR2WEB_MODE - const int tor2web_mode = get_options()->Tor2webMode; - const int how_to_fetch = tor2web_mode ? DIRIND_ONEHOP : DIRIND_ANONYMOUS; -#else - const int how_to_fetch = DIRIND_ANONYMOUS; -#endif /* defined(ENABLE_TOR2WEB_MODE) */ - + int tor2web_mode = get_options()->Tor2webMode; tor_assert(desc_id); tor_assert(rend_query); - rend_data = TO_REND_DATA_V2(rend_query); + /* Determine responsible dirs. Even if we can't get all we want, + * work with the ones we have. If it's empty, we'll notice below. */ + hid_serv_get_responsible_directories(responsible_dirs, desc_id); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id, DIGEST_LEN); - /* Automatically pick an hs dir if none given. */ - if (!rs_hsdir) { - /* Determine responsible dirs. Even if we can't get all we want, work with - * the ones we have. If it's empty, we'll notice in hs_pick_hsdir(). */ - smartlist_t *responsible_dirs = smartlist_new(); - hid_serv_get_responsible_directories(responsible_dirs, desc_id); - - hs_dir = hs_pick_hsdir(responsible_dirs, desc_id_base32); - if (!hs_dir) { - /* No suitable hs dir can be found, stop right now. */ - control_event_hsv2_descriptor_failed(rend_query, NULL, - "QUERY_NO_HSDIR"); - control_event_hs_descriptor_content(rend_data_get_address(rend_query), - desc_id_base32, NULL, NULL); - return 0; - } + /* Only select those hidden service directories to which we did not send + * a request recently and for which we have a router descriptor here. */ + + /* Clean request history first. */ + directory_clean_last_hid_serv_requests(now); + + SMARTLIST_FOREACH(responsible_dirs, routerstatus_t *, dir, { + time_t last = lookup_last_hid_serv_request( + dir, desc_id_base32, rend_query, 0, 0); + const node_t *node = node_get_by_id(dir->identity_digest); + if (last + REND_HID_SERV_DIR_REQUERY_PERIOD >= now || + !node || !node_has_descriptor(node)) + SMARTLIST_DEL_CURRENT(responsible_dirs, dir); + }); + + hs_dir = smartlist_choose(responsible_dirs); + smartlist_free(responsible_dirs); + if (!hs_dir) { + log_info(LD_REND, "Could not pick one of the responsible hidden " + "service directories, because we requested them all " + "recently without success."); + return 0; } - /* Add a copy of the HSDir identity digest to the query so we can track it - * on the control port. */ - hsdir_fp = tor_memdup(hs_dir->identity_digest, - sizeof(hs_dir->identity_digest)); - smartlist_add(rend_query->hsdirs_fp, hsdir_fp); + /* Remember that we are requesting a descriptor from this hidden service + * directory now. */ + lookup_last_hid_serv_request(hs_dir, desc_id_base32, rend_query, now, 1); - /* Encode descriptor cookie for logging purposes. Also, if the cookie is - * malformed, no fetch is triggered thus this needs to be done before the - * fetch request. */ - if (rend_data->auth_type != REND_NO_AUTH) { + /* Encode descriptor cookie for logging purposes. */ + if (rend_query->auth_type != REND_NO_AUTH) { if (base64_encode(descriptor_cookie_base64, sizeof(descriptor_cookie_base64), - rend_data->descriptor_cookie, - REND_DESC_COOKIE_LEN, - 0)<0) { + rend_query->descriptor_cookie, REND_DESC_COOKIE_LEN)<0) { log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); - control_event_hsv2_descriptor_failed(rend_query, hsdir_fp, "BAD_DESC"); - control_event_hs_descriptor_content(rend_data_get_address(rend_query), - desc_id_base32, hsdir_fp, NULL); return 0; } - /* Remove == signs. */ - descriptor_cookie_base64[strlen(descriptor_cookie_base64)-2] = '\0'; + /* Remove == signs and newline. */ + descriptor_cookie_base64[strlen(descriptor_cookie_base64)-3] = '\0'; } else { strlcpy(descriptor_cookie_base64, "(none)", sizeof(descriptor_cookie_base64)); @@ -498,210 +679,92 @@ directory_get_from_hs_dir(const char *desc_id, /* Send fetch request. (Pass query and possibly descriptor cookie so that * they can be written to the directory connection and be referred to when * the response arrives. */ - directory_request_t *req = - directory_request_new(DIR_PURPOSE_FETCH_RENDDESC_V2); - directory_request_set_routerstatus(req, hs_dir); - directory_request_set_indirection(req, how_to_fetch); - directory_request_set_resource(req, desc_id_base32); - directory_request_set_rend_query(req, rend_query); - directory_initiate_request(req); - directory_request_free(req); - + directory_initiate_command_routerstatus_rend(hs_dir, + DIR_PURPOSE_FETCH_RENDDESC_V2, + ROUTER_PURPOSE_GENERAL, + tor2web_mode?DIRIND_ONEHOP:DIRIND_ANONYMOUS, + desc_id_base32, + NULL, 0, 0, + rend_query); log_info(LD_REND, "Sending fetch request for v2 descriptor for " "service '%s' with descriptor ID '%s', auth type %d, " "and descriptor cookie '%s' to hidden service " "directory %s", - rend_data->onion_address, desc_id_base32, - rend_data->auth_type, - (rend_data->auth_type == REND_NO_AUTH ? "[none]" : + rend_query->onion_address, desc_id_base32, + rend_query->auth_type, + (rend_query->auth_type == REND_NO_AUTH ? "[none]" : escaped_safe_str_client(descriptor_cookie_base64)), routerstatus_describe(hs_dir)); - control_event_hs_descriptor_requested(rend_data->onion_address, - rend_data->auth_type, + control_event_hs_descriptor_requested(rend_query, hs_dir->identity_digest, - desc_id_base32, NULL); + desc_id_base32); return 1; } -/** Remove tracked HSDir requests from our history for this hidden service - * descriptor desc_id (of size DIGEST_LEN) */ -static void -purge_v2_hidserv_req(const char *desc_id) -{ - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - - /* The hsdir request tracker stores v2 keys using the base32 encoded - desc_id. Do it: */ - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id, - DIGEST_LEN); - hs_purge_hid_serv_from_last_hid_serv_requests(desc_id_base32); -} - -/** Fetch a v2 descriptor using the given descriptor id. If any hsdir(s) are - * given, they will be used instead. - * - * On success, 1 is returned. If no hidden service is left to ask, return 0. - * On error, -1 is returned. */ -static int -fetch_v2_desc_by_descid(const char *desc_id, - const rend_data_t *rend_query, smartlist_t *hsdirs) -{ - int ret; - - tor_assert(rend_query); - - if (!hsdirs) { - ret = directory_get_from_hs_dir(desc_id, rend_query, NULL); - goto end; /* either success or failure, but we're done */ - } - - /* Using the given hsdir list, trigger a fetch on each of them. */ - SMARTLIST_FOREACH_BEGIN(hsdirs, routerstatus_t *, hs_dir) { - /* This should always be a success. */ - ret = directory_get_from_hs_dir(desc_id, rend_query, hs_dir); - tor_assert(ret); - } SMARTLIST_FOREACH_END(hs_dir); - - /* Everything went well. */ - ret = 0; - - end: - return ret; -} - -/** Fetch a v2 descriptor using the onion address in the given query object. - * This will compute the descriptor id for each replicas and fetch it on the - * given hsdir(s) if any or the responsible ones that are choosen - * automatically. - * - * On success, 1 is returned. If no hidden service is left to ask, return 0. - * On error, -1 is returned. */ -static int -fetch_v2_desc_by_addr(rend_data_t *rend_query, smartlist_t *hsdirs) +/** Unless we already have a descriptor for rend_query with at least + * one (possibly) working introduction point in it, start a connection to a + * hidden service directory to fetch a v2 rendezvous service descriptor. */ +void +rend_client_refetch_v2_renddesc(const rend_data_t *rend_query) { char descriptor_id[DIGEST_LEN]; int replicas_left_to_try[REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS]; - int i, tries_left, ret; - rend_data_v2_t *rend_data = TO_REND_DATA_V2(rend_query); - + int i, tries_left; + rend_cache_entry_t *e = NULL; + tor_assert(rend_query); + /* Are we configured to fetch descriptors? */ + if (!get_options()->FetchHidServDescriptors) { + log_warn(LD_REND, "We received an onion address for a v2 rendezvous " + "service descriptor, but are not fetching service descriptors."); + return; + } + /* Before fetching, check if we already have a usable descriptor here. */ + if (rend_cache_lookup_entry(rend_query->onion_address, -1, &e) > 0 && + rend_client_any_intro_points_usable(e)) { + log_info(LD_REND, "We would fetch a v2 rendezvous descriptor, but we " + "already have a usable descriptor here. Not fetching."); + return; + } + log_debug(LD_REND, "Fetching v2 rendezvous descriptor for service %s", + safe_str_client(rend_query->onion_address)); /* Randomly iterate over the replicas until a descriptor can be fetched * from one of the consecutive nodes, or no options are left. */ - for (i = 0; i < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; i++) { - replicas_left_to_try[i] = i; - } - tries_left = REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; + for (i = 0; i < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; i++) + replicas_left_to_try[i] = i; while (tries_left > 0) { - int rand_val = crypto_rand_int(tries_left); - int chosen_replica = replicas_left_to_try[rand_val]; - replicas_left_to_try[rand_val] = replicas_left_to_try[--tries_left]; - - ret = rend_compute_v2_desc_id(descriptor_id, - rend_data->onion_address, - rend_data->auth_type == REND_STEALTH_AUTH ? - rend_data->descriptor_cookie : NULL, - time(NULL), chosen_replica); - if (ret < 0) { - /* Normally, on failure the descriptor_id is untouched but let's be - * safe in general in case the function changes at some point. */ - goto end; - } - - if (tor_memcmp(descriptor_id, rend_data->descriptor_id[chosen_replica], - sizeof(descriptor_id)) != 0) { - /* Not equal from what we currently have so purge the last hid serv - * request cache and update the descriptor ID with the new value. */ - purge_v2_hidserv_req(rend_data->descriptor_id[chosen_replica]); - memcpy(rend_data->descriptor_id[chosen_replica], descriptor_id, - sizeof(rend_data->descriptor_id[chosen_replica])); - } - - /* Trigger the fetch with the computed descriptor ID. */ - ret = fetch_v2_desc_by_descid(descriptor_id, rend_query, hsdirs); - if (ret != 0) { - /* Either on success or failure, as long as we tried a fetch we are - * done here. */ - goto end; + int rand = crypto_rand_int(tries_left); + int chosen_replica = replicas_left_to_try[rand]; + replicas_left_to_try[rand] = replicas_left_to_try[--tries_left]; + + if (rend_compute_v2_desc_id(descriptor_id, rend_query->onion_address, + rend_query->auth_type == REND_STEALTH_AUTH ? + rend_query->descriptor_cookie : NULL, + time(NULL), chosen_replica) < 0) { + log_warn(LD_REND, "Internal error: Computing v2 rendezvous " + "descriptor ID did not succeed."); + /* + * Hmm, can this write anything to descriptor_id and still fail? + * Let's clear it just to be safe. + * + * From here on, any returns should goto done which clears + * descriptor_id so we don't leave key-derived material on the stack. + */ + goto done; } + if (directory_get_from_hs_dir(descriptor_id, rend_query) != 0) + goto done; /* either success or failure, but we're done */ } - /* If we come here, there are no hidden service directories left. */ log_info(LD_REND, "Could not pick one of the responsible hidden " "service directories to fetch descriptors, because " "we already tried them all unsuccessfully."); - ret = 0; + /* Close pending connections. */ + rend_client_desc_trynow(rend_query->onion_address); - end: + done: memwipe(descriptor_id, 0, sizeof(descriptor_id)); - return ret; -} - -/** Fetch a v2 descriptor using the given query. If any hsdir are specified, - * use them for the fetch. - * - * On success, 1 is returned. If no hidden service is left to ask, return 0. - * On error, -1 is returned. */ -int -rend_client_fetch_v2_desc(rend_data_t *query, smartlist_t *hsdirs) -{ - int ret; - rend_data_v2_t *rend_data; - const char *onion_address; - - tor_assert(query); - - /* Get the version 2 data structure of the query. */ - rend_data = TO_REND_DATA_V2(query); - onion_address = rend_data_get_address(query); - - /* Depending on what's available in the rend data query object, we will - * trigger a fetch by HS address or using a descriptor ID. */ - - if (onion_address[0] != '\0') { - ret = fetch_v2_desc_by_addr(query, hsdirs); - } else if (!tor_digest_is_zero(rend_data->desc_id_fetch)) { - ret = fetch_v2_desc_by_descid(rend_data->desc_id_fetch, query, - hsdirs); - } else { - /* Query data is invalid. */ - ret = -1; - goto error; - } - - error: - return ret; -} - -/** Unless we already have a descriptor for rend_query with at least - * one (possibly) working introduction point in it, start a connection to a - * hidden service directory to fetch a v2 rendezvous service descriptor. */ -void -rend_client_refetch_v2_renddesc(rend_data_t *rend_query) -{ - rend_cache_entry_t *e = NULL; - const char *onion_address = rend_data_get_address(rend_query); - - tor_assert(rend_query); - /* Before fetching, check if we already have a usable descriptor here. */ - if (rend_cache_lookup_entry(onion_address, -1, &e) == 0 && - rend_client_any_intro_points_usable(e)) { - log_info(LD_REND, "We would fetch a v2 rendezvous descriptor, but we " - "already have a usable descriptor here. Not fetching."); - return; - } - /* Are we configured to fetch descriptors? */ - if (!get_options()->FetchHidServDescriptors) { - log_warn(LD_REND, "We received an onion address for a v2 rendezvous " - "service descriptor, but are not fetching service descriptors."); - return; - } - log_debug(LD_REND, "Fetching v2 rendezvous descriptor for service %s", - safe_str_client(onion_address)); - rend_client_fetch_v2_desc(rend_query, NULL); - /* We don't need to look the error code because either on failure or - * success, the necessary steps to continue the HS connection will be - * triggered once the descriptor arrives or if all fetch failed. */ return; } @@ -714,7 +777,8 @@ rend_client_cancel_descriptor_fetches(void) SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) { if (conn->type == CONN_TYPE_DIR && - conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { + (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC || + conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2)) { /* It's a rendezvous descriptor fetch in progress -- cancel it * by marking the connection for close. * @@ -732,7 +796,7 @@ rend_client_cancel_descriptor_fetches(void) } else { log_debug(LD_REND, "Marking for close dir conn fetching " "rendezvous descriptor for service %s", - safe_str(rend_data_get_address(rd))); + safe_str(rd->onion_address)); } connection_mark_for_close(conn); } @@ -762,35 +826,25 @@ rend_client_cancel_descriptor_fetches(void) */ int rend_client_report_intro_point_failure(extend_info_t *failed_intro, - rend_data_t *rend_data, + const rend_data_t *rend_query, unsigned int failure_type) { int i, r; rend_cache_entry_t *ent; connection_t *conn; - const char *onion_address = rend_data_get_address(rend_data); - - r = rend_cache_lookup_entry(onion_address, -1, &ent); - if (r < 0) { - /* Either invalid onion address or cache entry not found. */ - switch (-r) { - case EINVAL: - log_warn(LD_BUG, "Malformed service ID %s.", - escaped_safe_str_client(onion_address)); - return -1; - case ENOENT: - log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.", - escaped_safe_str_client(onion_address)); - rend_client_refetch_v2_renddesc(rend_data); - return 0; - default: - log_warn(LD_BUG, "Unknown cache lookup returned code: %d", r); - return -1; - } + + r = rend_cache_lookup_entry(rend_query->onion_address, -1, &ent); + if (r<0) { + log_warn(LD_BUG, "Malformed service ID %s.", + escaped_safe_str_client(rend_query->onion_address)); + return -1; + } + if (r==0) { + log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.", + escaped_safe_str_client(rend_query->onion_address)); + rend_client_refetch_v2_renddesc(rend_query); + return 0; } - /* The intro points are not checked here if they are usable or not because - * this is called when an intro point circuit is closed thus there must be - * at least one intro point that is usable and is about to be flagged. */ for (i = 0; i < smartlist_len(ent->parsed->intro_nodes); i++) { rend_intro_point_t *intro = smartlist_get(ent->parsed->intro_nodes, i); @@ -803,9 +857,6 @@ rend_client_report_intro_point_failure(extend_info_t *failed_intro, tor_fragile_assert(); /* fall through */ case INTRO_POINT_FAILURE_GENERIC: - rend_cache_intro_failure_note(failure_type, - (uint8_t *)failed_intro->identity_digest, - onion_address); rend_intro_point_free(intro); smartlist_del(ent->parsed->intro_nodes, i); break; @@ -821,9 +872,6 @@ rend_client_report_intro_point_failure(extend_info_t *failed_intro, intro->unreachable_count, zap_intro_point ? " Removing from descriptor.": ""); if (zap_intro_point) { - rend_cache_intro_failure_note( - failure_type, - (uint8_t *) failed_intro->identity_digest, onion_address); rend_intro_point_free(intro); smartlist_del(ent->parsed->intro_nodes, i); } @@ -837,15 +885,13 @@ rend_client_report_intro_point_failure(extend_info_t *failed_intro, if (! rend_client_any_intro_points_usable(ent)) { log_info(LD_REND, "No more intro points remain for %s. Re-fetching descriptor.", - escaped_safe_str_client(onion_address)); - rend_client_refetch_v2_renddesc(rend_data); + escaped_safe_str_client(rend_query->onion_address)); + rend_client_refetch_v2_renddesc(rend_query); /* move all pending streams back to renddesc_wait */ - /* NOTE: We can now do this faster, if we use pending_entry_connections */ while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP, AP_CONN_STATE_CIRCUIT_WAIT, - onion_address))) { - connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn)); + rend_query->onion_address))) { conn->state = AP_CONN_STATE_RENDDESC_WAIT; } @@ -853,28 +899,121 @@ rend_client_report_intro_point_failure(extend_info_t *failed_intro, } log_info(LD_REND,"%d options left for %s.", smartlist_len(ent->parsed->intro_nodes), - escaped_safe_str_client(onion_address)); + escaped_safe_str_client(rend_query->onion_address)); return 1; } -/** The service sent us a rendezvous cell; join the circuits. */ +/** Called when we receive a RENDEZVOUS_ESTABLISHED cell; changes the state of + * the circuit to C_REND_READY. + */ +int +rend_client_rendezvous_acked(origin_circuit_t *circ, const uint8_t *request, + size_t request_len) +{ + (void) request; + (void) request_len; + /* we just got an ack for our establish-rendezvous. switch purposes. */ + if (circ->base_.purpose != CIRCUIT_PURPOSE_C_ESTABLISH_REND) { + log_warn(LD_PROTOCOL,"Got a rendezvous ack when we weren't expecting one. " + "Closing circ."); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); + return -1; + } + log_info(LD_REND,"Got rendezvous ack. This circuit is now ready for " + "rendezvous."); + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_READY); + /* Set timestamp_dirty, because circuit_expire_building expects it + * to specify when a circuit entered the _C_REND_READY state. */ + circ->base_.timestamp_dirty = time(NULL); + + /* From a path bias point of view, this circuit is now successfully used. + * Waiting any longer opens us up to attacks from Bob. He could induce + * Alice to attempt to connect to his hidden service and never reply + * to her rend requests */ + pathbias_mark_use_success(circ); + + /* XXXX This is a pretty brute-force approach. It'd be better to + * attach only the connections that are waiting on this circuit, rather + * than trying to attach them all. See comments bug 743. */ + /* If we already have the introduction circuit built, make sure we send + * the INTRODUCE cell _now_ */ + connection_ap_attach_pending(); + return 0; +} + +/** Bob sent us a rendezvous cell; join the circuits. */ int rend_client_receive_rendezvous(origin_circuit_t *circ, const uint8_t *request, size_t request_len) { + crypt_path_t *hop; + char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; + + if ((circ->base_.purpose != CIRCUIT_PURPOSE_C_REND_READY && + circ->base_.purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) + || !circ->build_state->pending_final_cpath) { + log_warn(LD_PROTOCOL,"Got rendezvous2 cell from hidden service, but not " + "expecting it. Closing."); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); + return -1; + } + if (request_len != DH_KEY_LEN+DIGEST_LEN) { log_warn(LD_PROTOCOL,"Incorrect length (%d) on RENDEZVOUS2 cell.", (int)request_len); goto err; } - if (hs_circuit_setup_e2e_rend_circ_legacy_client(circ, request) < 0) { - log_warn(LD_GENERAL, "Failed to setup circ"); + log_info(LD_REND,"Got RENDEZVOUS2 cell from hidden service."); + + /* first DH_KEY_LEN bytes are g^y from bob. Finish the dh handshake...*/ + tor_assert(circ->build_state); + tor_assert(circ->build_state->pending_final_cpath); + hop = circ->build_state->pending_final_cpath; + tor_assert(hop->rend_dh_handshake_state); + if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, + hop->rend_dh_handshake_state, (char*)request, + DH_KEY_LEN, + keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { + log_warn(LD_GENERAL, "Couldn't complete DH handshake."); goto err; } - return 0; + /* ... and set up cpath. */ + if (circuit_init_cpath_crypto(hop, keys+DIGEST_LEN, 0)<0) + goto err; + + /* Check whether the digest is right... */ + if (tor_memneq(keys, request+DH_KEY_LEN, DIGEST_LEN)) { + log_warn(LD_PROTOCOL, "Incorrect digest of key material."); + goto err; + } + + crypto_dh_free(hop->rend_dh_handshake_state); + hop->rend_dh_handshake_state = NULL; + + /* All is well. Extend the circuit. */ + circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_JOINED); + hop->state = CPATH_STATE_OPEN; + /* set the windows to default. these are the windows + * that alice thinks bob has. + */ + hop->package_window = circuit_initial_package_window(); + hop->deliver_window = CIRCWINDOW_START; + /* Now that this circuit has finished connecting to its destination, + * make sure circuit_get_open_circ_or_launch is willing to return it + * so we can actually use it. */ + circ->hs_circ_has_timed_out = 0; + + onion_append_to_cpath(&circ->cpath, hop); + circ->build_state->pending_final_cpath = NULL; /* prevent double-free */ + + circuit_try_attaching_streams(circ); + + memwipe(keys, 0, sizeof(keys)); + return 0; err: + memwipe(keys, 0, sizeof(keys)); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); return -1; } @@ -900,12 +1039,11 @@ rend_client_desc_trynow(const char *query) rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data; if (!rend_data) continue; - const char *onion_address = rend_data_get_address(rend_data); - if (rend_cmp_service_ids(query, onion_address)) + if (rend_cmp_service_ids(query, rend_data->onion_address)) continue; assert_connection_ok(base_conn, now); - if (rend_cache_lookup_entry(onion_address, -1, - &entry) == 0 && + if (rend_cache_lookup_entry(rend_data->onion_address, -1, + &entry) == 1 && rend_client_any_intro_points_usable(entry)) { /* either this fetch worked, or it failed but there was a * valid entry from before which we should reuse */ @@ -918,35 +1056,35 @@ rend_client_desc_trynow(const char *query) base_conn->timestamp_lastread = now; base_conn->timestamp_lastwritten = now; - connection_ap_mark_as_pending_circuit(conn); + if (connection_ap_handshake_attach_circuit(conn) < 0) { + /* it will never work */ + log_warn(LD_REND,"Rendezvous attempt failed. Closing."); + if (!base_conn->marked_for_close) + connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); + } } else { /* 404, or fetch didn't get that far */ log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is " "unavailable (try again later).", safe_str_client(query)); connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED); - rend_client_note_connection_attempt_ended(rend_data); + rend_client_note_connection_attempt_ended(query); } } SMARTLIST_FOREACH_END(base_conn); } -/** Clear temporary state used only during an attempt to connect to the - * hidden service with rend_data. Called when a connection attempt - * has ended; it is possible for this to be called multiple times while - * handling an ended connection attempt, and any future changes to this - * function must ensure it remains idempotent. */ +/** Clear temporary state used only during an attempt to connect to + * the hidden service named onion_address. Called when a + * connection attempt has ended; may be called occasionally at other + * times, and should be reasonably harmless. */ void -rend_client_note_connection_attempt_ended(const rend_data_t *rend_data) +rend_client_note_connection_attempt_ended(const char *onion_address) { - unsigned int have_onion = 0; rend_cache_entry_t *cache_entry = NULL; - const char *onion_address = rend_data_get_address(rend_data); - rend_data_v2_t *rend_data_v2 = TO_REND_DATA_V2(rend_data); + rend_cache_lookup_entry(onion_address, -1, &cache_entry); - if (onion_address[0] != '\0') { - /* Ignore return value; we find an entry, or we don't. */ - (void) rend_cache_lookup_entry(onion_address, -1, &cache_entry); - have_onion = 1; - } + log_info(LD_REND, "Connection attempt for %s has ended; " + "cleaning up temporary state.", + safe_str_client(onion_address)); /* Clear the timed_out flag on all remaining intro points for this HS. */ if (cache_entry != NULL) { @@ -956,20 +1094,7 @@ rend_client_note_connection_attempt_ended(const rend_data_t *rend_data) } /* Remove the HS's entries in last_hid_serv_requests. */ - if (have_onion) { - unsigned int replica; - for (replica = 0; replica < ARRAY_LENGTH(rend_data_v2->descriptor_id); - replica++) { - const char *desc_id = rend_data_v2->descriptor_id[replica]; - purge_v2_hidserv_req(desc_id); - } - log_info(LD_REND, "Connection attempt for %s has ended; " - "cleaning up temporary state.", - safe_str_client(onion_address)); - } else { - /* We only have an ID for a fetch. Probably used by HSFETCH. */ - purge_v2_hidserv_req(rend_data_v2->desc_id_fetch); - } + purge_hid_serv_from_last_hid_serv_requests(onion_address); } /** Return a newly allocated extend_info_t* for a randomly chosen introduction @@ -979,18 +1104,13 @@ rend_client_note_connection_attempt_ended(const rend_data_t *rend_data) extend_info_t * rend_client_get_random_intro(const rend_data_t *rend_query) { - int ret; extend_info_t *result; rend_cache_entry_t *entry; - const char *onion_address = rend_data_get_address(rend_query); - ret = rend_cache_lookup_entry(onion_address, -1, &entry); - if (ret < 0 || !rend_client_any_intro_points_usable(entry)) { - log_warn(LD_REND, - "Query '%s' didn't have valid rend desc in cache. Failing.", - safe_str_client(onion_address)); - /* XXX: Should we refetch the descriptor here if the IPs are not usable - * anymore ?. */ + if (rend_cache_lookup_entry(rend_query->onion_address, -1, &entry) < 1) { + log_warn(LD_REND, + "Query '%s' didn't have valid rend desc in cache. Failing.", + safe_str_client(rend_query->onion_address)); return NULL; } @@ -1047,20 +1167,32 @@ rend_client_get_random_intro_impl(const rend_cache_entry_t *entry, i = crypto_rand_int(smartlist_len(usable_nodes)); intro = smartlist_get(usable_nodes, i); - if (BUG(!intro->extend_info)) { - /* This should never happen, but it isn't fatal, just try another */ - smartlist_del(usable_nodes, i); - goto again; - } - /* All version 2 HS descriptors come with a TAP onion key. - * Clients used to try to get the TAP onion key from the consensus, but this - * meant that hidden services could discover which consensus clients have. */ - if (!extend_info_supports_tap(intro->extend_info)) { - log_info(LD_REND, "The HS descriptor is missing a TAP onion key for the " - "intro-point relay '%s'; trying another.", - safe_str_client(extend_info_describe(intro->extend_info))); - smartlist_del(usable_nodes, i); - goto again; + /* Do we need to look up the router or is the extend info complete? */ + if (!intro->extend_info->onion_key) { + const node_t *node; + extend_info_t *new_extend_info; + if (tor_digest_is_zero(intro->extend_info->identity_digest)) + node = node_get_by_hex_id(intro->extend_info->nickname); + else + node = node_get_by_id(intro->extend_info->identity_digest); + if (!node) { + log_info(LD_REND, "Unknown router with nickname '%s'; trying another.", + intro->extend_info->nickname); + smartlist_del(usable_nodes, i); + goto again; + } + new_extend_info = extend_info_from_node(node, 0); + if (!new_extend_info) { + log_info(LD_REND, "We don't have a descriptor for the intro-point relay " + "'%s'; trying another.", + extend_info_describe(intro->extend_info)); + smartlist_del(usable_nodes, i); + goto again; + } else { + extend_info_free(intro->extend_info); + intro->extend_info = new_extend_info; + } + tor_assert(intro->extend_info != NULL); } /* Check if we should refuse to talk to this router. */ if (strict && @@ -1104,22 +1236,18 @@ rend_client_lookup_service_authorization(const char *onion_address) return strmap_get(auth_hid_servs, onion_address); } -#define rend_service_authorization_free(val) \ - FREE_AND_NULL(rend_service_authorization_t, \ - rend_service_authorization_free_, (val)) - /** Helper: Free storage held by rend_service_authorization_t. */ static void -rend_service_authorization_free_(rend_service_authorization_t *auth) +rend_service_authorization_free(rend_service_authorization_t *auth) { tor_free(auth); } /** Helper for strmap_free. */ static void -rend_service_authorization_free_void(void *service_auth) +rend_service_authorization_strmap_item_free(void *service_auth) { - rend_service_authorization_free_(service_auth); + rend_service_authorization_free(service_auth); } /** Release all the storage held in auth_hid_servs. @@ -1130,7 +1258,7 @@ rend_service_authorization_free_all(void) if (!auth_hid_servs) { return; } - strmap_free(auth_hid_servs, rend_service_authorization_free_void); + strmap_free(auth_hid_servs, rend_service_authorization_strmap_item_free); auth_hid_servs = NULL; } @@ -1146,10 +1274,12 @@ rend_parse_service_authorization(const or_options_t *options, strmap_t *parsed = strmap_new(); smartlist_t *sl = smartlist_new(); rend_service_authorization_t *auth = NULL; - char *err_msg = NULL; + char descriptor_cookie_tmp[REND_DESC_COOKIE_LEN+2]; + char descriptor_cookie_base64ext[REND_DESC_COOKIE_LEN_BASE64+2+1]; for (line = options->HidServAuth; line; line = line->next) { char *onion_address, *descriptor_cookie; + int auth_type_val = 0; auth = NULL; SMARTLIST_FOREACH(sl, char *, c, tor_free(c);); smartlist_clear(sl); @@ -1171,20 +1301,38 @@ rend_parse_service_authorization(const or_options_t *options, goto err; } strlcpy(auth->onion_address, onion_address, REND_SERVICE_ID_LEN_BASE32+1); - if (!rend_valid_v2_service_id(auth->onion_address)) { + if (!rend_valid_service_id(auth->onion_address)) { log_warn(LD_CONFIG, "Onion address has wrong format: '%s'", onion_address); goto err; } /* Parse descriptor cookie. */ descriptor_cookie = smartlist_get(sl, 1); - if (rend_auth_decode_cookie(descriptor_cookie, auth->descriptor_cookie, - &auth->auth_type, &err_msg) < 0) { - tor_assert(err_msg); - log_warn(LD_CONFIG, "%s", err_msg); - tor_free(err_msg); + if (strlen(descriptor_cookie) != REND_DESC_COOKIE_LEN_BASE64) { + log_warn(LD_CONFIG, "Authorization cookie has wrong length: '%s'", + descriptor_cookie); + goto err; + } + /* Add trailing zero bytes (AA) to make base64-decoding happy. */ + tor_snprintf(descriptor_cookie_base64ext, + REND_DESC_COOKIE_LEN_BASE64+2+1, + "%sAA", descriptor_cookie); + if (base64_decode(descriptor_cookie_tmp, sizeof(descriptor_cookie_tmp), + descriptor_cookie_base64ext, + strlen(descriptor_cookie_base64ext)) < 0) { + log_warn(LD_CONFIG, "Decoding authorization cookie failed: '%s'", + descriptor_cookie); goto err; } + auth_type_val = (((uint8_t)descriptor_cookie_tmp[16]) >> 4) + 1; + if (auth_type_val < 1 || auth_type_val > 2) { + log_warn(LD_CONFIG, "Authorization cookie has unknown authorization " + "type encoded."); + goto err; + } + auth->auth_type = auth_type_val == 1 ? REND_BASIC_AUTH : REND_STEALTH_AUTH; + memcpy(auth->descriptor_cookie, descriptor_cookie_tmp, + REND_DESC_COOKIE_LEN); if (strmap_get(parsed, auth->onion_address)) { log_warn(LD_CONFIG, "Duplicate authorization for the same hidden " "service."); @@ -1205,40 +1353,10 @@ rend_parse_service_authorization(const or_options_t *options, rend_service_authorization_free_all(); auth_hid_servs = parsed; } else { - strmap_free(parsed, rend_service_authorization_free_void); + strmap_free(parsed, rend_service_authorization_strmap_item_free); } + memwipe(descriptor_cookie_tmp, 0, sizeof(descriptor_cookie_tmp)); + memwipe(descriptor_cookie_base64ext, 0, sizeof(descriptor_cookie_base64ext)); return res; } -/* Can Tor client code make direct (non-anonymous) connections to introduction - * or rendezvous points? - * Returns true if tor was compiled with NON_ANONYMOUS_MODE_ENABLED, and is - * configured in Tor2web mode. */ -int -rend_client_allow_non_anonymous_connection(const or_options_t *options) -{ - /* Tor2web support needs to be compiled in to a tor binary. */ -#ifdef NON_ANONYMOUS_MODE_ENABLED - /* Tor2web */ - return options->Tor2webMode ? 1 : 0; -#else - (void)options; - return 0; -#endif /* defined(NON_ANONYMOUS_MODE_ENABLED) */ -} - -/* At compile-time, was non-anonymous mode enabled via - * NON_ANONYMOUS_MODE_ENABLED ? */ -int -rend_client_non_anonymous_mode_enabled(const or_options_t *options) -{ - (void)options; - /* Tor2web support needs to be compiled in to a tor binary. */ -#ifdef NON_ANONYMOUS_MODE_ENABLED - /* Tor2web */ - return 1; -#else - return 0; -#endif /* defined(NON_ANONYMOUS_MODE_ENABLED) */ -} - diff --git a/src/tor/src/or/rendclient.h b/src/tor/rendclient.h similarity index 71% rename from src/tor/src/or/rendclient.h rename to src/tor/rendclient.h index e8495ce09..1f731d0ae 100644 --- a/src/tor/src/or/rendclient.h +++ b/src/tor/rendclient.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,8 +12,6 @@ #ifndef TOR_RENDCLIENT_H #define TOR_RENDCLIENT_H -#include "rendcache.h" - void rend_client_purge_state(void); void rend_client_introcirc_has_opened(origin_circuit_t *circ); @@ -21,20 +19,27 @@ void rend_client_rendcirc_has_opened(origin_circuit_t *circ); int rend_client_introduction_acked(origin_circuit_t *circ, const uint8_t *request, size_t request_len); -void rend_client_refetch_v2_renddesc(rend_data_t *rend_query); -int rend_client_fetch_v2_desc(rend_data_t *query, smartlist_t *hsdirs); +void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query); void rend_client_cancel_descriptor_fetches(void); +void rend_client_purge_last_hid_serv_requests(void); + +#define INTRO_POINT_FAILURE_GENERIC 0 +#define INTRO_POINT_FAILURE_TIMEOUT 1 +#define INTRO_POINT_FAILURE_UNREACHABLE 2 int rend_client_report_intro_point_failure(extend_info_t *failed_intro, - rend_data_t *rend_data, + const rend_data_t *rend_query, unsigned int failure_type); +int rend_client_rendezvous_acked(origin_circuit_t *circ, + const uint8_t *request, + size_t request_len); int rend_client_receive_rendezvous(origin_circuit_t *circ, const uint8_t *request, size_t request_len); void rend_client_desc_trynow(const char *query); -void rend_client_note_connection_attempt_ended(const rend_data_t *rend_data); +void rend_client_note_connection_attempt_ended(const char *onion_address); extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query); int rend_client_any_intro_points_usable(const rend_cache_entry_t *entry); @@ -46,9 +51,7 @@ int rend_parse_service_authorization(const or_options_t *options, rend_service_authorization_t *rend_client_lookup_service_authorization( const char *onion_address); void rend_service_authorization_free_all(void); +rend_data_t *rend_data_dup(const rend_data_t *request); -int rend_client_allow_non_anonymous_connection(const or_options_t *options); -int rend_client_non_anonymous_mode_enabled(const or_options_t *options); - -#endif /* !defined(TOR_RENDCLIENT_H) */ +#endif diff --git a/src/tor/rendcommon.c b/src/tor/rendcommon.c new file mode 100644 index 000000000..325b74c61 --- /dev/null +++ b/src/tor/rendcommon.c @@ -0,0 +1,1487 @@ +/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendcommon.c + * \brief Rendezvous implementation: shared code between + * introducers, services, clients, and rendezvous points. + **/ + +#include "or.h" +#include "circuitbuild.h" +#include "config.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendmid.h" +#include "rendservice.h" +#include "rephist.h" +#include "routerlist.h" +#include "routerparse.h" + +/** Return 0 if one and two are the same service ids, else -1 or 1 */ +int +rend_cmp_service_ids(const char *one, const char *two) +{ + return strcasecmp(one,two); +} + +/** Free the storage held by the service descriptor desc. + */ +void +rend_service_descriptor_free(rend_service_descriptor_t *desc) +{ + if (!desc) + return; + if (desc->pk) + crypto_pk_free(desc->pk); + if (desc->intro_nodes) { + SMARTLIST_FOREACH(desc->intro_nodes, rend_intro_point_t *, intro, + rend_intro_point_free(intro);); + smartlist_free(desc->intro_nodes); + } + if (desc->successful_uploads) { + SMARTLIST_FOREACH(desc->successful_uploads, char *, c, tor_free(c);); + smartlist_free(desc->successful_uploads); + } + tor_free(desc); +} + +/** Length of the descriptor cookie that is used for versioned hidden + * service descriptors. */ +#define REND_DESC_COOKIE_LEN 16 + +/** Length of the replica number that is used to determine the secret ID + * part of versioned hidden service descriptors. */ +#define REND_REPLICA_LEN 1 + +/** Compute the descriptor ID for service_id of length + * REND_SERVICE_ID_LEN and secret_id_part of length + * DIGEST_LEN, and write it to descriptor_id_out of length + * DIGEST_LEN. */ +void +rend_get_descriptor_id_bytes(char *descriptor_id_out, + const char *service_id, + const char *secret_id_part) +{ + crypto_digest_t *digest = crypto_digest_new(); + crypto_digest_add_bytes(digest, service_id, REND_SERVICE_ID_LEN); + crypto_digest_add_bytes(digest, secret_id_part, DIGEST_LEN); + crypto_digest_get_digest(digest, descriptor_id_out, DIGEST_LEN); + crypto_digest_free(digest); +} + +/** Compute the secret ID part for time_period, + * a descriptor_cookie of length + * REND_DESC_COOKIE_LEN which may also be NULL if no + * descriptor_cookie shall be used, and replica, and write it to + * secret_id_part of length DIGEST_LEN. */ +static void +get_secret_id_part_bytes(char *secret_id_part, uint32_t time_period, + const char *descriptor_cookie, uint8_t replica) +{ + crypto_digest_t *digest = crypto_digest_new(); + time_period = htonl(time_period); + crypto_digest_add_bytes(digest, (char*)&time_period, sizeof(uint32_t)); + if (descriptor_cookie) { + crypto_digest_add_bytes(digest, descriptor_cookie, + REND_DESC_COOKIE_LEN); + } + crypto_digest_add_bytes(digest, (const char *)&replica, REND_REPLICA_LEN); + crypto_digest_get_digest(digest, secret_id_part, DIGEST_LEN); + crypto_digest_free(digest); +} + +/** Return the time period for time now plus a potentially + * intended deviation of one or more periods, based on the first byte + * of service_id. */ +static uint32_t +get_time_period(time_t now, uint8_t deviation, const char *service_id) +{ + /* The time period is the number of REND_TIME_PERIOD_V2_DESC_VALIDITY + * intervals that have passed since the epoch, offset slightly so that + * each service's time periods start and end at a fraction of that + * period based on their first byte. */ + return (uint32_t) + (now + ((uint8_t) *service_id) * REND_TIME_PERIOD_V2_DESC_VALIDITY / 256) + / REND_TIME_PERIOD_V2_DESC_VALIDITY + deviation; +} + +/** Compute the time in seconds that a descriptor that is generated + * now for service_id will be valid. */ +static uint32_t +get_seconds_valid(time_t now, const char *service_id) +{ + uint32_t result = REND_TIME_PERIOD_V2_DESC_VALIDITY - + ((uint32_t) + (now + ((uint8_t) *service_id) * REND_TIME_PERIOD_V2_DESC_VALIDITY / 256) + % REND_TIME_PERIOD_V2_DESC_VALIDITY); + return result; +} + +/** Compute the binary desc_id_out (DIGEST_LEN bytes long) for a given + * base32-encoded service_id and optional unencoded + * descriptor_cookie of length REND_DESC_COOKIE_LEN, + * at time now for replica number + * replica. desc_id needs to have DIGEST_LEN bytes + * free. Return 0 for success, -1 otherwise. */ +int +rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, + const char *descriptor_cookie, time_t now, + uint8_t replica) +{ + char service_id_binary[REND_SERVICE_ID_LEN]; + char secret_id_part[DIGEST_LEN]; + uint32_t time_period; + if (!service_id || + strlen(service_id) != REND_SERVICE_ID_LEN_BASE32) { + log_warn(LD_REND, "Could not compute v2 descriptor ID: " + "Illegal service ID: %s", + safe_str(service_id)); + return -1; + } + if (replica >= REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS) { + log_warn(LD_REND, "Could not compute v2 descriptor ID: " + "Replica number out of range: %d", replica); + return -1; + } + /* Convert service ID to binary. */ + if (base32_decode(service_id_binary, REND_SERVICE_ID_LEN, + service_id, REND_SERVICE_ID_LEN_BASE32) < 0) { + log_warn(LD_REND, "Could not compute v2 descriptor ID: " + "Illegal characters in service ID: %s", + safe_str_client(service_id)); + return -1; + } + /* Calculate current time-period. */ + time_period = get_time_period(now, 0, service_id_binary); + /* Calculate secret-id-part = h(time-period + replica). */ + get_secret_id_part_bytes(secret_id_part, time_period, descriptor_cookie, + replica); + /* Calculate descriptor ID. */ + rend_get_descriptor_id_bytes(desc_id_out, service_id_binary, secret_id_part); + return 0; +} + +/** Encode the introduction points in desc and write the result to a + * newly allocated string pointed to by encoded. Return 0 for + * success, -1 otherwise. */ +static int +rend_encode_v2_intro_points(char **encoded, rend_service_descriptor_t *desc) +{ + size_t unenc_len; + char *unenc = NULL; + size_t unenc_written = 0; + int i; + int r = -1; + /* Assemble unencrypted list of introduction points. */ + unenc_len = smartlist_len(desc->intro_nodes) * 1000; /* too long, but ok. */ + unenc = tor_malloc_zero(unenc_len); + for (i = 0; i < smartlist_len(desc->intro_nodes); i++) { + char id_base32[REND_INTRO_POINT_ID_LEN_BASE32 + 1]; + char *onion_key = NULL; + size_t onion_key_len; + crypto_pk_t *intro_key; + char *service_key = NULL; + char *address = NULL; + size_t service_key_len; + int res; + rend_intro_point_t *intro = smartlist_get(desc->intro_nodes, i); + /* Obtain extend info with introduction point details. */ + extend_info_t *info = intro->extend_info; + /* Encode introduction point ID. */ + base32_encode(id_base32, sizeof(id_base32), + info->identity_digest, DIGEST_LEN); + /* Encode onion key. */ + if (crypto_pk_write_public_key_to_string(info->onion_key, &onion_key, + &onion_key_len) < 0) { + log_warn(LD_REND, "Could not write onion key."); + goto done; + } + /* Encode intro key. */ + intro_key = intro->intro_key; + if (!intro_key || + crypto_pk_write_public_key_to_string(intro_key, &service_key, + &service_key_len) < 0) { + log_warn(LD_REND, "Could not write intro key."); + tor_free(onion_key); + goto done; + } + /* Assemble everything for this introduction point. */ + address = tor_dup_addr(&info->addr); + res = tor_snprintf(unenc + unenc_written, unenc_len - unenc_written, + "introduction-point %s\n" + "ip-address %s\n" + "onion-port %d\n" + "onion-key\n%s" + "service-key\n%s", + id_base32, + address, + info->port, + onion_key, + service_key); + tor_free(address); + tor_free(onion_key); + tor_free(service_key); + if (res < 0) { + log_warn(LD_REND, "Not enough space for writing introduction point " + "string."); + goto done; + } + /* Update total number of written bytes for unencrypted intro points. */ + unenc_written += res; + } + /* Finalize unencrypted introduction points. */ + if (unenc_len < unenc_written + 2) { + log_warn(LD_REND, "Not enough space for finalizing introduction point " + "string."); + goto done; + } + unenc[unenc_written++] = '\n'; + unenc[unenc_written++] = 0; + *encoded = unenc; + r = 0; + done: + if (r<0) + tor_free(unenc); + return r; +} + +/** Encrypt the encoded introduction points in encoded using + * authorization type 'basic' with client_cookies and write the + * result to a newly allocated string pointed to by encrypted_out of + * length encrypted_len_out. Return 0 for success, -1 otherwise. */ +static int +rend_encrypt_v2_intro_points_basic(char **encrypted_out, + size_t *encrypted_len_out, + const char *encoded, + smartlist_t *client_cookies) +{ + int r = -1, i, pos, enclen, client_blocks; + size_t len, client_entries_len; + char *enc = NULL, iv[CIPHER_IV_LEN], *client_part = NULL, + session_key[CIPHER_KEY_LEN]; + smartlist_t *encrypted_session_keys = NULL; + crypto_digest_t *digest; + crypto_cipher_t *cipher; + tor_assert(encoded); + tor_assert(client_cookies && smartlist_len(client_cookies) > 0); + + /* Generate session key. */ + if (crypto_rand(session_key, CIPHER_KEY_LEN) < 0) { + log_warn(LD_REND, "Unable to generate random session key to encrypt " + "introduction point string."); + goto done; + } + + /* Determine length of encrypted introduction points including session + * keys. */ + client_blocks = 1 + ((smartlist_len(client_cookies) - 1) / + REND_BASIC_AUTH_CLIENT_MULTIPLE); + client_entries_len = client_blocks * REND_BASIC_AUTH_CLIENT_MULTIPLE * + REND_BASIC_AUTH_CLIENT_ENTRY_LEN; + len = 2 + client_entries_len + CIPHER_IV_LEN + strlen(encoded); + if (client_blocks >= 256) { + log_warn(LD_REND, "Too many clients in introduction point string."); + goto done; + } + enc = tor_malloc_zero(len); + enc[0] = 0x01; /* type of authorization. */ + enc[1] = (uint8_t)client_blocks; + + /* Encrypt with random session key. */ + enclen = crypto_cipher_encrypt_with_iv(session_key, + enc + 2 + client_entries_len, + CIPHER_IV_LEN + strlen(encoded), encoded, strlen(encoded)); + + if (enclen < 0) { + log_warn(LD_REND, "Could not encrypt introduction point string."); + goto done; + } + memcpy(iv, enc + 2 + client_entries_len, CIPHER_IV_LEN); + + /* Encrypt session key for cookies, determine client IDs, and put both + * in a smartlist. */ + encrypted_session_keys = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(client_cookies, const char *, cookie) { + client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + /* Encrypt session key. */ + cipher = crypto_cipher_new(cookie); + if (crypto_cipher_encrypt(cipher, client_part + + REND_BASIC_AUTH_CLIENT_ID_LEN, + session_key, CIPHER_KEY_LEN) < 0) { + log_warn(LD_REND, "Could not encrypt session key for client."); + crypto_cipher_free(cipher); + tor_free(client_part); + goto done; + } + crypto_cipher_free(cipher); + + /* Determine client ID. */ + digest = crypto_digest_new(); + crypto_digest_add_bytes(digest, cookie, REND_DESC_COOKIE_LEN); + crypto_digest_add_bytes(digest, iv, CIPHER_IV_LEN); + crypto_digest_get_digest(digest, client_part, + REND_BASIC_AUTH_CLIENT_ID_LEN); + crypto_digest_free(digest); + + /* Put both together. */ + smartlist_add(encrypted_session_keys, client_part); + } SMARTLIST_FOREACH_END(cookie); + + /* Add some fake client IDs and encrypted session keys. */ + for (i = (smartlist_len(client_cookies) - 1) % + REND_BASIC_AUTH_CLIENT_MULTIPLE; + i < REND_BASIC_AUTH_CLIENT_MULTIPLE - 1; i++) { + client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + if (crypto_rand(client_part, REND_BASIC_AUTH_CLIENT_ENTRY_LEN) < 0) { + log_warn(LD_REND, "Unable to generate fake client entry."); + tor_free(client_part); + goto done; + } + smartlist_add(encrypted_session_keys, client_part); + } + /* Sort smartlist and put elements in result in order. */ + smartlist_sort_digests(encrypted_session_keys); + pos = 2; + SMARTLIST_FOREACH(encrypted_session_keys, const char *, entry, { + memcpy(enc + pos, entry, REND_BASIC_AUTH_CLIENT_ENTRY_LEN); + pos += REND_BASIC_AUTH_CLIENT_ENTRY_LEN; + }); + *encrypted_out = enc; + *encrypted_len_out = len; + enc = NULL; /* prevent free. */ + r = 0; + done: + tor_free(enc); + if (encrypted_session_keys) { + SMARTLIST_FOREACH(encrypted_session_keys, char *, d, tor_free(d);); + smartlist_free(encrypted_session_keys); + } + return r; +} + +/** Encrypt the encoded introduction points in encoded using + * authorization type 'anonymize' with descriptor_cookie of length + * REND_DESC_COOKIE_LEN and write the result to a newly allocated string + * pointed to by encrypted_out of length encrypted_len_out. + * Return 0 for success, -1 otherwise. */ +static int +rend_encrypt_v2_intro_points_anonymize(char **encrypted_out, + size_t *encrypted_len_out, + const char *encoded, + const char *descriptor_cookie) +{ + int r = -1, enclen; + char *enc; + tor_assert(encoded); + tor_assert(descriptor_cookie); + + enc = tor_malloc_zero(1 + CIPHER_IV_LEN + strlen(encoded)); + enc[0] = 0x02; /* Auth type */ + enclen = crypto_cipher_encrypt_with_iv(descriptor_cookie, + enc + 1, + CIPHER_IV_LEN+strlen(encoded), + encoded, strlen(encoded)); + if (enclen < 0) { + log_warn(LD_REND, "Could not encrypt introduction point string."); + goto done; + } + *encrypted_out = enc; + *encrypted_len_out = enclen; + enc = NULL; /* prevent free */ + r = 0; + done: + tor_free(enc); + return r; +} + +/** Attempt to parse the given desc_str and return true if this + * succeeds, false otherwise. */ +static int +rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc) +{ + rend_service_descriptor_t *test_parsed = NULL; + char test_desc_id[DIGEST_LEN]; + char *test_intro_content = NULL; + size_t test_intro_size; + size_t test_encoded_size; + const char *test_next; + int res = rend_parse_v2_service_descriptor(&test_parsed, test_desc_id, + &test_intro_content, + &test_intro_size, + &test_encoded_size, + &test_next, desc->desc_str); + rend_service_descriptor_free(test_parsed); + tor_free(test_intro_content); + return (res >= 0); +} + +/** Free the storage held by an encoded v2 service descriptor. */ +void +rend_encoded_v2_service_descriptor_free( + rend_encoded_v2_service_descriptor_t *desc) +{ + if (!desc) + return; + tor_free(desc->desc_str); + tor_free(desc); +} + +/** Free the storage held by an introduction point info. */ +void +rend_intro_point_free(rend_intro_point_t *intro) +{ + if (!intro) + return; + + extend_info_free(intro->extend_info); + crypto_pk_free(intro->intro_key); + + if (intro->accepted_intro_rsa_parts != NULL) { + replaycache_free(intro->accepted_intro_rsa_parts); + } + + tor_free(intro); +} + +/** Encode a set of rend_encoded_v2_service_descriptor_t's for desc + * at time now using service_key, depending on + * auth_type a descriptor_cookie and a list of + * client_cookies (which are both NULL if no client + * authorization is performed), and period (e.g. 0 for the current + * period, 1 for the next period, etc.) and add them to the existing list + * descs_out; return the number of seconds that the descriptors will + * be found by clients, or -1 if the encoding was not successful. */ +int +rend_encode_v2_descriptors(smartlist_t *descs_out, + rend_service_descriptor_t *desc, time_t now, + uint8_t period, rend_auth_type_t auth_type, + crypto_pk_t *client_key, + smartlist_t *client_cookies) +{ + char service_id[DIGEST_LEN]; + uint32_t time_period; + char *ipos_base64 = NULL, *ipos = NULL, *ipos_encrypted = NULL, + *descriptor_cookie = NULL; + size_t ipos_len = 0, ipos_encrypted_len = 0; + int k; + uint32_t seconds_valid; + crypto_pk_t *service_key; + if (!desc) { + log_warn(LD_BUG, "Could not encode v2 descriptor: No desc given."); + return -1; + } + service_key = (auth_type == REND_STEALTH_AUTH) ? client_key : desc->pk; + tor_assert(service_key); + if (auth_type == REND_STEALTH_AUTH) { + descriptor_cookie = smartlist_get(client_cookies, 0); + tor_assert(descriptor_cookie); + } + /* Obtain service_id from public key. */ + crypto_pk_get_digest(service_key, service_id); + /* Calculate current time-period. */ + time_period = get_time_period(now, period, service_id); + /* Determine how many seconds the descriptor will be valid. */ + seconds_valid = period * REND_TIME_PERIOD_V2_DESC_VALIDITY + + get_seconds_valid(now, service_id); + /* Assemble, possibly encrypt, and encode introduction points. */ + if (smartlist_len(desc->intro_nodes) > 0) { + if (rend_encode_v2_intro_points(&ipos, desc) < 0) { + log_warn(LD_REND, "Encoding of introduction points did not succeed."); + return -1; + } + switch (auth_type) { + case REND_NO_AUTH: + ipos_len = strlen(ipos); + break; + case REND_BASIC_AUTH: + if (rend_encrypt_v2_intro_points_basic(&ipos_encrypted, + &ipos_encrypted_len, ipos, + client_cookies) < 0) { + log_warn(LD_REND, "Encrypting of introduction points did not " + "succeed."); + tor_free(ipos); + return -1; + } + tor_free(ipos); + ipos = ipos_encrypted; + ipos_len = ipos_encrypted_len; + break; + case REND_STEALTH_AUTH: + if (rend_encrypt_v2_intro_points_anonymize(&ipos_encrypted, + &ipos_encrypted_len, ipos, + descriptor_cookie) < 0) { + log_warn(LD_REND, "Encrypting of introduction points did not " + "succeed."); + tor_free(ipos); + return -1; + } + tor_free(ipos); + ipos = ipos_encrypted; + ipos_len = ipos_encrypted_len; + break; + default: + log_warn(LD_REND|LD_BUG, "Unrecognized authorization type %d", + (int)auth_type); + tor_free(ipos); + return -1; + } + /* Base64-encode introduction points. */ + ipos_base64 = tor_malloc_zero(ipos_len * 2); + if (base64_encode(ipos_base64, ipos_len * 2, ipos, ipos_len)<0) { + log_warn(LD_REND, "Could not encode introduction point string to " + "base64. length=%d", (int)ipos_len); + tor_free(ipos_base64); + tor_free(ipos); + return -1; + } + tor_free(ipos); + } + /* Encode REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS descriptors. */ + for (k = 0; k < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; k++) { + char secret_id_part[DIGEST_LEN]; + char secret_id_part_base32[REND_SECRET_ID_PART_LEN_BASE32 + 1]; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + char *permanent_key = NULL; + size_t permanent_key_len; + char published[ISO_TIME_LEN+1]; + int i; + char protocol_versions_string[16]; /* max len: "0,1,2,3,4,5,6,7\0" */ + size_t protocol_versions_written; + size_t desc_len; + char *desc_str = NULL; + int result = 0; + size_t written = 0; + char desc_digest[DIGEST_LEN]; + rend_encoded_v2_service_descriptor_t *enc = + tor_malloc_zero(sizeof(rend_encoded_v2_service_descriptor_t)); + /* Calculate secret-id-part = h(time-period + cookie + replica). */ + get_secret_id_part_bytes(secret_id_part, time_period, descriptor_cookie, + k); + base32_encode(secret_id_part_base32, sizeof(secret_id_part_base32), + secret_id_part, DIGEST_LEN); + /* Calculate descriptor ID. */ + rend_get_descriptor_id_bytes(enc->desc_id, service_id, secret_id_part); + base32_encode(desc_id_base32, sizeof(desc_id_base32), + enc->desc_id, DIGEST_LEN); + /* PEM-encode the public key */ + if (crypto_pk_write_public_key_to_string(service_key, &permanent_key, + &permanent_key_len) < 0) { + log_warn(LD_BUG, "Could not write public key to string."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + /* Encode timestamp. */ + format_iso_time(published, desc->timestamp); + /* Write protocol-versions bitmask to comma-separated value string. */ + protocol_versions_written = 0; + for (i = 0; i < 8; i++) { + if (desc->protocols & 1 << i) { + tor_snprintf(protocol_versions_string + protocol_versions_written, + 16 - protocol_versions_written, "%d,", i); + protocol_versions_written += 2; + } + } + if (protocol_versions_written) + protocol_versions_string[protocol_versions_written - 1] = '\0'; + else + protocol_versions_string[0]= '\0'; + /* Assemble complete descriptor. */ + desc_len = 2000 + smartlist_len(desc->intro_nodes) * 1000; /* far too long, + but okay.*/ + enc->desc_str = desc_str = tor_malloc_zero(desc_len); + result = tor_snprintf(desc_str, desc_len, + "rendezvous-service-descriptor %s\n" + "version 2\n" + "permanent-key\n%s" + "secret-id-part %s\n" + "publication-time %s\n" + "protocol-versions %s\n", + desc_id_base32, + permanent_key, + secret_id_part_base32, + published, + protocol_versions_string); + tor_free(permanent_key); + if (result < 0) { + log_warn(LD_BUG, "Descriptor ran out of room."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + written = result; + /* Add introduction points. */ + if (ipos_base64) { + result = tor_snprintf(desc_str + written, desc_len - written, + "introduction-points\n" + "-----BEGIN MESSAGE-----\n%s" + "-----END MESSAGE-----\n", + ipos_base64); + if (result < 0) { + log_warn(LD_BUG, "could not write introduction points."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + written += result; + } + /* Add signature. */ + strlcpy(desc_str + written, "signature\n", desc_len - written); + written += strlen(desc_str + written); + if (crypto_digest(desc_digest, desc_str, written) < 0) { + log_warn(LD_BUG, "could not create digest."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + if (router_append_dirobj_signature(desc_str + written, + desc_len - written, + desc_digest, DIGEST_LEN, + service_key) < 0) { + log_warn(LD_BUG, "Couldn't sign desc."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + written += strlen(desc_str+written); + if (written+2 > desc_len) { + log_warn(LD_BUG, "Could not finish desc."); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + desc_str[written++] = '\n'; + desc_str[written++] = 0; + /* Check if we can parse our own descriptor. */ + if (!rend_desc_v2_is_parsable(enc)) { + log_warn(LD_BUG, "Could not parse my own descriptor: %s", desc_str); + rend_encoded_v2_service_descriptor_free(enc); + goto err; + } + smartlist_add(descs_out, enc); + } + + log_info(LD_REND, "Successfully encoded a v2 descriptor and " + "confirmed that it is parsable."); + goto done; + + err: + SMARTLIST_FOREACH(descs_out, rend_encoded_v2_service_descriptor_t *, d, + rend_encoded_v2_service_descriptor_free(d);); + smartlist_clear(descs_out); + seconds_valid = -1; + + done: + tor_free(ipos_base64); + return seconds_valid; +} + +/** Parse a service descriptor at str (len bytes). On + * success, return a newly alloced service_descriptor_t. On failure, + * return NULL. + */ +rend_service_descriptor_t * +rend_parse_service_descriptor(const char *str, size_t len) +{ + rend_service_descriptor_t *result = NULL; + int i, n_intro_points; + size_t keylen, asn1len; + const char *end, *cp, *eos; + rend_intro_point_t *intro; + + result = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + cp = str; + end = str+len; + if (end-cp<2) goto truncated; + result->version = 0; + if (end-cp < 2) goto truncated; + asn1len = ntohs(get_uint16(cp)); + cp += 2; + if ((size_t)(end-cp) < asn1len) goto truncated; + result->pk = crypto_pk_asn1_decode(cp, asn1len); + if (!result->pk) goto truncated; + cp += asn1len; + if (end-cp < 4) goto truncated; + result->timestamp = (time_t) ntohl(get_uint32(cp)); + cp += 4; + result->protocols = 1<<2; /* always use intro format 2 */ + if (end-cp < 2) goto truncated; + n_intro_points = ntohs(get_uint16(cp)); + cp += 2; + + result->intro_nodes = smartlist_new(); + for (i=0;iextend_info = tor_malloc_zero(sizeof(extend_info_t)); + strlcpy(intro->extend_info->nickname, cp, + sizeof(intro->extend_info->nickname)); + smartlist_add(result->intro_nodes, intro); + cp = eos+1; + } + keylen = crypto_pk_keysize(result->pk); + tor_assert(end-cp >= 0); + if ((size_t)(end-cp) < keylen) goto truncated; + if ((size_t)(end-cp) > keylen) { + log_warn(LD_PROTOCOL, + "Signature is %d bytes too long on service descriptor.", + (int)((size_t)(end-cp) - keylen)); + goto error; + } + note_crypto_pk_op(REND_CLIENT); + if (crypto_pk_public_checksig_digest(result->pk, + (char*)str,cp-str, /* data */ + (char*)cp,end-cp /* signature*/ + )<0) { + log_warn(LD_PROTOCOL, "Bad signature on service descriptor."); + goto error; + } + + return result; + truncated: + log_warn(LD_PROTOCOL, "Truncated service descriptor."); + error: + rend_service_descriptor_free(result); + return NULL; +} + +/** Sets out to the first 10 bytes of the digest of pk, + * base32 encoded. NUL-terminates out. (We use this string to + * identify services in directory requests and .onion URLs.) + */ +int +rend_get_service_id(crypto_pk_t *pk, char *out) +{ + char buf[DIGEST_LEN]; + tor_assert(pk); + if (crypto_pk_get_digest(pk, buf) < 0) + return -1; + base32_encode(out, REND_SERVICE_ID_LEN_BASE32+1, buf, REND_SERVICE_ID_LEN); + return 0; +} + +/* ==== Rendezvous service descriptor cache. */ + +/** How old do we let hidden service descriptors get before discarding + * them as too old? */ +#define REND_CACHE_MAX_AGE (2*24*60*60) +/** How wrong do we assume our clock may be when checking whether hidden + * services are too old or too new? */ +#define REND_CACHE_MAX_SKEW (24*60*60) + +/** Map from service id (as generated by rend_get_service_id) to + * rend_cache_entry_t. */ +static strmap_t *rend_cache = NULL; + +/** Map from descriptor id to rend_cache_entry_t; only for hidden service + * directories. */ +static digestmap_t *rend_cache_v2_dir = NULL; + +/** Initializes the service descriptor cache. + */ +void +rend_cache_init(void) +{ + rend_cache = strmap_new(); + rend_cache_v2_dir = digestmap_new(); +} + +/** Helper: free storage held by a single service descriptor cache entry. */ +static void +rend_cache_entry_free(rend_cache_entry_t *e) +{ + if (!e) + return; + rend_service_descriptor_free(e->parsed); + tor_free(e->desc); + tor_free(e); +} + +/** Helper: deallocate a rend_cache_entry_t. (Used with strmap_free(), which + * requires a function pointer whose argument is void*). */ +static void +rend_cache_entry_free_(void *p) +{ + rend_cache_entry_free(p); +} + +/** Free all storage held by the service descriptor cache. */ +void +rend_cache_free_all(void) +{ + strmap_free(rend_cache, rend_cache_entry_free_); + digestmap_free(rend_cache_v2_dir, rend_cache_entry_free_); + rend_cache = NULL; + rend_cache_v2_dir = NULL; +} + +/** Removes all old entries from the service descriptor cache. + */ +void +rend_cache_clean(time_t now) +{ + strmap_iter_t *iter; + const char *key; + void *val; + rend_cache_entry_t *ent; + time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW; + for (iter = strmap_iter_init(rend_cache); !strmap_iter_done(iter); ) { + strmap_iter_get(iter, &key, &val); + ent = (rend_cache_entry_t*)val; + if (ent->parsed->timestamp < cutoff) { + iter = strmap_iter_next_rmv(rend_cache, iter); + rend_cache_entry_free(ent); + } else { + iter = strmap_iter_next(rend_cache, iter); + } + } +} + +/** Remove ALL entries from the rendezvous service descriptor cache. + */ +void +rend_cache_purge(void) +{ + if (rend_cache) { + log_info(LD_REND, "Purging client/v0-HS-authority HS descriptor cache"); + strmap_free(rend_cache, rend_cache_entry_free_); + } + rend_cache = strmap_new(); +} + +/** Remove all old v2 descriptors and those for which this hidden service + * directory is not responsible for any more. */ +void +rend_cache_clean_v2_descs_as_dir(time_t now) +{ + digestmap_iter_t *iter; + time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW; + for (iter = digestmap_iter_init(rend_cache_v2_dir); + !digestmap_iter_done(iter); ) { + const char *key; + void *val; + rend_cache_entry_t *ent; + digestmap_iter_get(iter, &key, &val); + ent = val; + if (ent->parsed->timestamp < cutoff || + !hid_serv_responsible_for_desc_id(key)) { + char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN); + log_info(LD_REND, "Removing descriptor with ID '%s' from cache", + safe_str_client(key_base32)); + iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter); + rend_cache_entry_free(ent); + } else { + iter = digestmap_iter_next(rend_cache_v2_dir, iter); + } + } +} + +/** Determines whether a is in the interval of b (excluded) and + * c (included) in a circular digest ring; returns 1 if this is the + * case, and 0 otherwise. + */ +int +rend_id_is_in_interval(const char *a, const char *b, const char *c) +{ + int a_b, b_c, c_a; + tor_assert(a); + tor_assert(b); + tor_assert(c); + + /* There are five cases in which a is outside the interval ]b,c]: */ + a_b = tor_memcmp(a,b,DIGEST_LEN); + if (a_b == 0) + return 0; /* 1. a == b (b is excluded) */ + b_c = tor_memcmp(b,c,DIGEST_LEN); + if (b_c == 0) + return 0; /* 2. b == c (interval is empty) */ + else if (a_b <= 0 && b_c < 0) + return 0; /* 3. a b c */ + c_a = tor_memcmp(c,a,DIGEST_LEN); + if (c_a < 0 && a_b <= 0) + return 0; /* 4. c a b */ + else if (b_c < 0 && c_a < 0) + return 0; /* 5. b c a */ + + /* In the other cases (a c b; b a c; c b a), a is inside the interval. */ + return 1; +} + +/** Return true iff query is a syntactically valid service ID (as + * generated by rend_get_service_id). */ +int +rend_valid_service_id(const char *query) +{ + if (strlen(query) != REND_SERVICE_ID_LEN_BASE32) + return 0; + + if (strspn(query, BASE32_CHARS) != REND_SERVICE_ID_LEN_BASE32) + return 0; + + return 1; +} + +/** If we have a cached rend_cache_entry_t for the service ID query + * with version, set *e to that entry and return 1. + * Else return 0. If version is nonnegative, only return an entry + * in that descriptor format version. Otherwise (if version is + * negative), return the most recent format we have. + */ +int +rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e) +{ + char key[REND_SERVICE_ID_LEN_BASE32+2]; /* \0 */ + tor_assert(rend_cache); + if (!rend_valid_service_id(query)) + return -1; + *e = NULL; + if (version != 0) { + tor_snprintf(key, sizeof(key), "2%s", query); + *e = strmap_get_lc(rend_cache, key); + } + if (!*e && version != 2) { + tor_snprintf(key, sizeof(key), "0%s", query); + *e = strmap_get_lc(rend_cache, key); + } + if (!*e) + return 0; + tor_assert((*e)->parsed && (*e)->parsed->intro_nodes); + /* XXX023 hack for now, to return "not found" if there are no intro + * points remaining. See bug 997. */ + if (! rend_client_any_intro_points_usable(*e)) + return 0; + return 1; +} + +/** query is a base32'ed service id. If it's malformed, return -1. + * Else look it up. + * - If it is found, point *desc to it, and write its length into + * *desc_len, and return 1. + * - If it is not found, return 0. + * Note: calls to rend_cache_clean or rend_cache_store may invalidate + * *desc. + */ +int +rend_cache_lookup_desc(const char *query, int version, const char **desc, + size_t *desc_len) +{ + rend_cache_entry_t *e; + int r; + r = rend_cache_lookup_entry(query,version,&e); + if (r <= 0) return r; + *desc = e->desc; + *desc_len = e->len; + return 1; +} + +/** Lookup the v2 service descriptor with base32-encoded desc_id and + * copy the pointer to it to *desc. Return 1 on success, 0 on + * well-formed-but-not-found, and -1 on failure. + */ +int +rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc) +{ + rend_cache_entry_t *e; + char desc_id_digest[DIGEST_LEN]; + tor_assert(rend_cache_v2_dir); + if (base32_decode(desc_id_digest, DIGEST_LEN, + desc_id, REND_DESC_ID_V2_LEN_BASE32) < 0) { + log_fn(LOG_PROTOCOL_WARN, LD_REND, + "Rejecting v2 rendezvous descriptor request -- descriptor ID " + "contains illegal characters: %s", + safe_str(desc_id)); + return -1; + } + /* Lookup descriptor and return. */ + e = digestmap_get(rend_cache_v2_dir, desc_id_digest); + if (e) { + *desc = e->desc; + return 1; + } + return 0; +} + +/* Do not allow more than this many introduction points in a hidden service + * descriptor */ +#define MAX_INTRO_POINTS 10 + +/** Parse *desc, calculate its service id, and store it in the cache. + * If we have a newer v0 descriptor with the same ID, ignore this one. + * If we have an older descriptor with the same ID, replace it. + * If we are acting as client due to the published flag and have any v2 + * descriptor with the same ID, reject this one in order to not get + * confused with having both versions for the same service. + * + * Return -2 if it's malformed or otherwise rejected; return -1 if we + * already have a v2 descriptor here; return 0 if it's the same or older + * than one we've already got; return 1 if it's novel. + * + * The published flag tells us if we store the descriptor + * in our role as directory (1) or if we cache it as client (0). + * + * If service_id is non-NULL and the descriptor is not for that + * service ID, reject it. service_id must be specified if and + * only if published is 0 (we fetched this descriptor). + */ +int +rend_cache_store(const char *desc, size_t desc_len, int published, + const char *service_id) +{ + rend_cache_entry_t *e; + rend_service_descriptor_t *parsed; + char query[REND_SERVICE_ID_LEN_BASE32+1]; + char key[REND_SERVICE_ID_LEN_BASE32+2]; /* 0\0 */ + time_t now; + tor_assert(rend_cache); + parsed = rend_parse_service_descriptor(desc,desc_len); + if (!parsed) { + log_warn(LD_PROTOCOL,"Couldn't parse service descriptor."); + return -2; + } + if (rend_get_service_id(parsed->pk, query)<0) { + log_warn(LD_BUG,"Couldn't compute service ID."); + rend_service_descriptor_free(parsed); + return -2; + } + if ((service_id != NULL) && strcmp(query, service_id)) { + log_warn(LD_REND, "Received service descriptor for service ID %s; " + "expected descriptor for service ID %s.", + query, safe_str(service_id)); + rend_service_descriptor_free(parsed); + return -2; + } + now = time(NULL); + if (parsed->timestamp < now-REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { + log_fn(LOG_PROTOCOL_WARN, LD_REND, + "Service descriptor %s is too old.", + safe_str_client(query)); + rend_service_descriptor_free(parsed); + return -2; + } + if (parsed->timestamp > now+REND_CACHE_MAX_SKEW) { + log_fn(LOG_PROTOCOL_WARN, LD_REND, + "Service descriptor %s is too far in the future.", + safe_str_client(query)); + rend_service_descriptor_free(parsed); + return -2; + } + /* Do we have a v2 descriptor and fetched this descriptor as a client? */ + tor_snprintf(key, sizeof(key), "2%s", query); + if (!published && strmap_get_lc(rend_cache, key)) { + log_info(LD_REND, "We already have a v2 descriptor for service %s.", + safe_str_client(query)); + rend_service_descriptor_free(parsed); + return -1; + } + if (parsed->intro_nodes && + smartlist_len(parsed->intro_nodes) > MAX_INTRO_POINTS) { + log_warn(LD_REND, "Found too many introduction points on a hidden " + "service descriptor for %s. This is probably a (misguided) " + "attempt to improve reliability, but it could also be an " + "attempt to do a guard enumeration attack. Rejecting.", + safe_str_client(query)); + rend_service_descriptor_free(parsed); + return -2; + } + tor_snprintf(key, sizeof(key), "0%s", query); + e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key); + if (e && e->parsed->timestamp > parsed->timestamp) { + log_info(LD_REND,"We already have a newer service descriptor %s with the " + "same ID and version.", + safe_str_client(query)); + rend_service_descriptor_free(parsed); + return 0; + } + if (e && e->len == desc_len && tor_memeq(desc,e->desc,desc_len)) { + log_info(LD_REND,"We already have this service descriptor %s.", + safe_str_client(query)); + e->received = time(NULL); + rend_service_descriptor_free(parsed); + return 0; + } + if (!e) { + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + strmap_set_lc(rend_cache, key, e); + } else { + rend_service_descriptor_free(e->parsed); + tor_free(e->desc); + } + e->received = time(NULL); + e->parsed = parsed; + e->len = desc_len; + e->desc = tor_malloc(desc_len); + memcpy(e->desc, desc, desc_len); + + log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", + safe_str_client(query), (int)desc_len); + return 1; +} + +/** Parse the v2 service descriptor(s) in desc and store it/them to the + * local rend cache. Don't attempt to decrypt the included list of introduction + * points (as we don't have a descriptor cookie for it). + * + * If we have a newer descriptor with the same ID, ignore this one. + * If we have an older descriptor with the same ID, replace it. + * Return -2 if we are not acting as hidden service directory; + * return -1 if the descriptor(s) were not parsable; return 0 if all + * descriptors are the same or older than those we've already got; + * return a positive number for the number of novel stored descriptors. + */ +int +rend_cache_store_v2_desc_as_dir(const char *desc) +{ + rend_service_descriptor_t *parsed; + char desc_id[DIGEST_LEN]; + char *intro_content; + size_t intro_size; + size_t encoded_size; + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + int number_parsed = 0, number_stored = 0; + const char *current_desc = desc; + const char *next_desc; + rend_cache_entry_t *e; + time_t now = time(NULL); + tor_assert(rend_cache_v2_dir); + tor_assert(desc); + if (!hid_serv_acting_as_directory()) { + /* Cannot store descs, because we are (currently) not acting as + * hidden service directory. */ + log_info(LD_REND, "Cannot store descs: Not acting as hs dir"); + return -2; + } + while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, + &intro_size, &encoded_size, + &next_desc, current_desc) >= 0) { + number_parsed++; + /* We don't care about the introduction points. */ + tor_free(intro_content); + /* For pretty log statements. */ + base32_encode(desc_id_base32, sizeof(desc_id_base32), + desc_id, DIGEST_LEN); + /* Is desc ID in the range that we are (directly or indirectly) responsible + * for? */ + if (!hid_serv_responsible_for_desc_id(desc_id)) { + log_info(LD_REND, "Service descriptor with desc ID %s is not in " + "interval that we are responsible for.", + safe_str_client(desc_id_base32)); + goto skip; + } + /* Is descriptor too old? */ + if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { + log_info(LD_REND, "Service descriptor with desc ID %s is too old.", + safe_str(desc_id_base32)); + goto skip; + } + /* Is descriptor too far in the future? */ + if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) { + log_info(LD_REND, "Service descriptor with desc ID %s is too far in the " + "future.", + safe_str(desc_id_base32)); + goto skip; + } + /* Do we already have a newer descriptor? */ + e = digestmap_get(rend_cache_v2_dir, desc_id); + if (e && e->parsed->timestamp > parsed->timestamp) { + log_info(LD_REND, "We already have a newer service descriptor with the " + "same desc ID %s and version.", + safe_str(desc_id_base32)); + goto skip; + } + /* Do we already have this descriptor? */ + if (e && !strcmp(desc, e->desc)) { + log_info(LD_REND, "We already have this service descriptor with desc " + "ID %s.", safe_str(desc_id_base32)); + e->received = time(NULL); + goto skip; + } + /* Store received descriptor. */ + if (!e) { + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + digestmap_set(rend_cache_v2_dir, desc_id, e); + } else { + rend_service_descriptor_free(e->parsed); + tor_free(e->desc); + } + e->received = time(NULL); + e->parsed = parsed; + e->desc = tor_strndup(current_desc, encoded_size); + e->len = encoded_size; + log_info(LD_REND, "Successfully stored service descriptor with desc ID " + "'%s' and len %d.", + safe_str(desc_id_base32), (int)encoded_size); + number_stored++; + goto advance; + skip: + rend_service_descriptor_free(parsed); + advance: + /* advance to next descriptor, if available. */ + current_desc = next_desc; + /* check if there is a next descriptor. */ + if (!current_desc || + strcmpstart(current_desc, "rendezvous-service-descriptor ")) + break; + } + if (!number_parsed) { + log_info(LD_REND, "Could not parse any descriptor."); + return -1; + } + log_info(LD_REND, "Parsed %d and added %d descriptor%s.", + number_parsed, number_stored, number_stored != 1 ? "s" : ""); + return number_stored; +} + +/** Parse the v2 service descriptor in desc, decrypt the included list + * of introduction points with descriptor_cookie (which may also be + * NULL if decryption is not necessary), and store the descriptor to + * the local cache under its version and service id. + * + * If we have a newer v2 descriptor with the same ID, ignore this one. + * If we have an older descriptor with the same ID, replace it. + * If we have any v0 descriptor with the same ID, reject this one in order + * to not get confused with having both versions for the same service. + * If the descriptor's service ID does not match + * rend_query-\>onion_address, reject it. + * Return -2 if it's malformed or otherwise rejected; return -1 if we + * already have a v0 descriptor here; return 0 if it's the same or older + * than one we've already got; return 1 if it's novel. + */ +int +rend_cache_store_v2_desc_as_client(const char *desc, + const rend_data_t *rend_query) +{ + /*XXXX this seems to have a bit of duplicate code with + * rend_cache_store_v2_desc_as_dir(). Fix that. */ + /* Though having similar elements, both functions were separated on + * purpose: + * - dirs don't care about encoded/encrypted introduction points, clients + * do. + * - dirs store descriptors in a separate cache by descriptor ID, whereas + * clients store them by service ID; both caches are different data + * structures and have different access methods. + * - dirs store a descriptor only if they are responsible for its ID, + * clients do so in every way (because they have requested it before). + * - dirs can process multiple concatenated descriptors which is required + * for replication, whereas clients only accept a single descriptor. + * Thus, combining both methods would result in a lot of if statements + * which probably would not improve, but worsen code readability. -KL */ + rend_service_descriptor_t *parsed = NULL; + char desc_id[DIGEST_LEN]; + char *intro_content = NULL; + size_t intro_size; + size_t encoded_size; + const char *next_desc; + time_t now = time(NULL); + char key[REND_SERVICE_ID_LEN_BASE32+2]; + char service_id[REND_SERVICE_ID_LEN_BASE32+1]; + rend_cache_entry_t *e; + int retval; + tor_assert(rend_cache); + tor_assert(desc); + /* Parse the descriptor. */ + if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, + &intro_size, &encoded_size, + &next_desc, desc) < 0) { + log_warn(LD_REND, "Could not parse descriptor."); + retval = -2; + goto err; + } + /* Compute service ID from public key. */ + if (rend_get_service_id(parsed->pk, service_id)<0) { + log_warn(LD_REND, "Couldn't compute service ID."); + retval = -2; + goto err; + } + if (strcmp(rend_query->onion_address, service_id)) { + log_warn(LD_REND, "Received service descriptor for service ID %s; " + "expected descriptor for service ID %s.", + service_id, safe_str(rend_query->onion_address)); + retval = -2; + goto err; + } + /* Decode/decrypt introduction points. */ + if (intro_content) { + int n_intro_points; + if (rend_query->auth_type != REND_NO_AUTH && + !tor_mem_is_zero(rend_query->descriptor_cookie, + sizeof(rend_query->descriptor_cookie))) { + char *ipos_decrypted = NULL; + size_t ipos_decrypted_size; + if (rend_decrypt_introduction_points(&ipos_decrypted, + &ipos_decrypted_size, + rend_query->descriptor_cookie, + intro_content, + intro_size) < 0) { + log_warn(LD_REND, "Failed to decrypt introduction points. We are " + "probably unable to parse the encoded introduction points."); + } else { + /* Replace encrypted with decrypted introduction points. */ + log_info(LD_REND, "Successfully decrypted introduction points."); + tor_free(intro_content); + intro_content = ipos_decrypted; + intro_size = ipos_decrypted_size; + } + } + n_intro_points = rend_parse_introduction_points(parsed, intro_content, + intro_size); + if (n_intro_points <= 0) { + log_warn(LD_REND, "Failed to parse introduction points. Either the " + "service has published a corrupt descriptor or you have " + "provided invalid authorization data."); + retval = -2; + goto err; + } else if (n_intro_points > MAX_INTRO_POINTS) { + log_warn(LD_REND, "Found too many introduction points on a hidden " + "service descriptor for %s. This is probably a (misguided) " + "attempt to improve reliability, but it could also be an " + "attempt to do a guard enumeration attack. Rejecting.", + safe_str_client(rend_query->onion_address)); + retval = -2; + goto err; + } + } else { + log_info(LD_REND, "Descriptor does not contain any introduction points."); + parsed->intro_nodes = smartlist_new(); + } + /* We don't need the encoded/encrypted introduction points any longer. */ + tor_free(intro_content); + /* Is descriptor too old? */ + if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { + log_warn(LD_REND, "Service descriptor with service ID %s is too old.", + safe_str_client(service_id)); + retval = -2; + goto err; + } + /* Is descriptor too far in the future? */ + if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) { + log_warn(LD_REND, "Service descriptor with service ID %s is too far in " + "the future.", safe_str_client(service_id)); + retval = -2; + goto err; + } + /* Do we have a v0 descriptor? */ + tor_snprintf(key, sizeof(key), "0%s", service_id); + if (strmap_get_lc(rend_cache, key)) { + log_info(LD_REND, "We already have a v0 descriptor for service ID %s.", + safe_str_client(service_id)); + retval = -1; + goto err; + } + /* Do we already have a newer descriptor? */ + tor_snprintf(key, sizeof(key), "2%s", service_id); + e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key); + if (e && e->parsed->timestamp > parsed->timestamp) { + log_info(LD_REND, "We already have a newer service descriptor for " + "service ID %s with the same desc ID and version.", + safe_str_client(service_id)); + retval = 0; + goto err; + } + /* Do we already have this descriptor? */ + if (e && !strcmp(desc, e->desc)) { + log_info(LD_REND,"We already have this service descriptor %s.", + safe_str_client(service_id)); + e->received = time(NULL); + retval = 0; + goto err; + } + if (!e) { + e = tor_malloc_zero(sizeof(rend_cache_entry_t)); + strmap_set_lc(rend_cache, key, e); + } else { + rend_service_descriptor_free(e->parsed); + tor_free(e->desc); + } + e->received = time(NULL); + e->parsed = parsed; + e->desc = tor_malloc_zero(encoded_size + 1); + strlcpy(e->desc, desc, encoded_size + 1); + e->len = encoded_size; + log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", + safe_str_client(service_id), (int)encoded_size); + return 1; + + err: + rend_service_descriptor_free(parsed); + tor_free(intro_content); + return retval; +} + +/** Called when we get a rendezvous-related relay cell on circuit + * circ. Dispatch on rendezvous relay command. */ +void +rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, + int command, size_t length, + const uint8_t *payload) +{ + or_circuit_t *or_circ = NULL; + origin_circuit_t *origin_circ = NULL; + int r = -2; + if (CIRCUIT_IS_ORIGIN(circ)) { + origin_circ = TO_ORIGIN_CIRCUIT(circ); + if (!layer_hint || layer_hint != origin_circ->cpath->prev) { + log_fn(LOG_PROTOCOL_WARN, LD_APP, + "Relay cell (rend purpose %d) from wrong hop on origin circ", + command); + origin_circ = NULL; + } + } else { + or_circ = TO_OR_CIRCUIT(circ); + } + + switch (command) { + case RELAY_COMMAND_ESTABLISH_INTRO: + if (or_circ) + r = rend_mid_establish_intro(or_circ,payload,length); + break; + case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: + if (or_circ) + r = rend_mid_establish_rendezvous(or_circ,payload,length); + break; + case RELAY_COMMAND_INTRODUCE1: + if (or_circ) + r = rend_mid_introduce(or_circ,payload,length); + break; + case RELAY_COMMAND_INTRODUCE2: + if (origin_circ) + r = rend_service_introduce(origin_circ,payload,length); + break; + case RELAY_COMMAND_INTRODUCE_ACK: + if (origin_circ) + r = rend_client_introduction_acked(origin_circ,payload,length); + break; + case RELAY_COMMAND_RENDEZVOUS1: + if (or_circ) + r = rend_mid_rendezvous(or_circ,payload,length); + break; + case RELAY_COMMAND_RENDEZVOUS2: + if (origin_circ) + r = rend_client_receive_rendezvous(origin_circ,payload,length); + break; + case RELAY_COMMAND_INTRO_ESTABLISHED: + if (origin_circ) + r = rend_service_intro_established(origin_circ,payload,length); + break; + case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: + if (origin_circ) + r = rend_client_rendezvous_acked(origin_circ,payload,length); + break; + default: + tor_fragile_assert(); + } + + if (r == -2) + log_info(LD_PROTOCOL, "Dropping cell (type %d) for wrong circuit type.", + command); +} + +/** Allocate and return a new rend_data_t with the same + * contents as query. */ +rend_data_t * +rend_data_dup(const rend_data_t *data) +{ + tor_assert(data); + return tor_memdup(data, sizeof(rend_data_t)); +} + diff --git a/src/tor/rendcommon.h b/src/tor/rendcommon.h new file mode 100644 index 000000000..f476593d2 --- /dev/null +++ b/src/tor/rendcommon.h @@ -0,0 +1,66 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendcommon.h + * \brief Header file for rendcommon.c. + **/ + +#ifndef TOR_RENDCOMMON_H +#define TOR_RENDCOMMON_H + +/** Free all storage associated with data */ +static INLINE void +rend_data_free(rend_data_t *data) +{ + tor_free(data); +} + +int rend_cmp_service_ids(const char *one, const char *two); + +void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, + int command, size_t length, + const uint8_t *payload); + +void rend_service_descriptor_free(rend_service_descriptor_t *desc); +rend_service_descriptor_t *rend_parse_service_descriptor(const char *str, + size_t len); +int rend_get_service_id(crypto_pk_t *pk, char *out); +void rend_encoded_v2_service_descriptor_free( + rend_encoded_v2_service_descriptor_t *desc); +void rend_intro_point_free(rend_intro_point_t *intro); + +void rend_cache_init(void); +void rend_cache_clean(time_t now); +void rend_cache_clean_v2_descs_as_dir(time_t now); +void rend_cache_purge(void); +void rend_cache_free_all(void); +int rend_valid_service_id(const char *query); +int rend_cache_lookup_desc(const char *query, int version, const char **desc, + size_t *desc_len); +int rend_cache_lookup_entry(const char *query, int version, + rend_cache_entry_t **entry_out); +int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc); +int rend_cache_store(const char *desc, size_t desc_len, int published, + const char *service_id); +int rend_cache_store_v2_desc_as_client(const char *desc, + const rend_data_t *rend_query); +int rend_cache_store_v2_desc_as_dir(const char *desc); +int rend_encode_v2_descriptors(smartlist_t *descs_out, + rend_service_descriptor_t *desc, time_t now, + uint8_t period, rend_auth_type_t auth_type, + crypto_pk_t *client_key, + smartlist_t *client_cookies); +int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, + const char *descriptor_cookie, + time_t now, uint8_t replica); +int rend_id_is_in_interval(const char *a, const char *b, const char *c); +void rend_get_descriptor_id_bytes(char *descriptor_id_out, + const char *service_id, + const char *secret_id_part); + +#endif + diff --git a/src/tor/src/or/rendmid.c b/src/tor/rendmid.c similarity index 78% rename from src/tor/src/or/rendmid.c rename to src/tor/rendmid.c index 66d2f9311..1bd11f6dc 100644 --- a/src/tor/src/or/rendmid.c +++ b/src/tor/rendmid.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -11,19 +11,16 @@ #include "circuitlist.h" #include "circuituse.h" #include "config.h" -#include "crypto.h" #include "relay.h" #include "rendmid.h" #include "rephist.h" -#include "hs_circuitmap.h" -#include "hs_intropoint.h" /** Respond to an ESTABLISH_INTRO cell by checking the signed data and * setting the circuit's purpose and service pk digest. */ int -rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, - size_t request_len) +rend_mid_establish_intro(or_circuit_t *circ, const uint8_t *request, + size_t request_len) { crypto_pk_t *pk = NULL; char buf[DIGEST_LEN+9]; @@ -35,14 +32,15 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, int reason = END_CIRC_REASON_INTERNAL; log_info(LD_REND, - "Received a legacy ESTABLISH_INTRO request on circuit %u", + "Received an ESTABLISH_INTRO request on circuit %u", (unsigned) circ->p_circ_id); - if (!hs_intro_circuit_is_suitable_for_establish_intro(circ)) { + if (circ->base_.purpose != CIRCUIT_PURPOSE_OR || circ->base_.n_chan) { + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "Rejecting ESTABLISH_INTRO on non-OR or non-edge circuit."); reason = END_CIRC_REASON_TORPROTOCOL; goto err; } - if (request_len < 2+DIGEST_LEN) goto truncated; /* First 2 bytes: length of asn1-encoded key. */ @@ -71,6 +69,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, goto err; } /* Rest of body: signature of previous data */ + note_crypto_pk_op(REND_MID); if (crypto_pk_public_checksig_digest(pk, (char*)request, 2+asn1len+DIGEST_LEN, (char*)(request+2+DIGEST_LEN+asn1len), @@ -81,7 +80,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, goto err; } - /* The request is valid. First, compute the hash of the service's PK.*/ + /* The request is valid. First, compute the hash of Bob's PK.*/ if (crypto_pk_get_digest(pk, pk_digest)<0) { log_warn(LD_BUG, "Internal error: couldn't hash public key."); goto err; @@ -95,8 +94,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, /* Close any other intro circuits with the same pk. */ c = NULL; - while ((c = hs_circuitmap_get_intro_circ_v2_relay_side( - (const uint8_t *)pk_digest))) { + while ((c = circuit_get_intro_point(pk_digest))) { log_info(LD_REND, "Replacing old circuit for service %s", safe_str(serviceid)); circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED); @@ -104,14 +102,16 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, } /* Acknowledge the request. */ - if (hs_intro_send_intro_established_cell(circ) < 0) { + if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), + RELAY_COMMAND_INTRO_ESTABLISHED, + "", 0, NULL)<0) { log_info(LD_GENERAL, "Couldn't send INTRO_ESTABLISHED cell."); - goto err_no_close; + goto err; } /* Now, set up this circuit. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); - hs_circuitmap_register_intro_circ_v2_relay_side(circ, (uint8_t *)pk_digest); + memcpy(circ->rend_token, pk_digest, DIGEST_LEN); log_info(LD_REND, "Established introduction point on circuit %u for service %s", @@ -122,9 +122,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, log_warn(LD_PROTOCOL, "Rejecting truncated ESTABLISH_INTRO cell."); reason = END_CIRC_REASON_TORPROTOCOL; err: - circuit_mark_for_close(TO_CIRCUIT(circ), reason); - err_no_close: if (pk) crypto_pk_free(pk); + circuit_mark_for_close(TO_CIRCUIT(circ), reason); return -1; } @@ -133,8 +132,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, * INTRODUCE2 cell. */ int -rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, - size_t request_len) +rend_mid_introduce(or_circuit_t *circ, const uint8_t *request, + size_t request_len) { or_circuit_t *intro_circ; char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; @@ -143,10 +142,12 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, log_info(LD_REND, "Received an INTRODUCE1 request on circuit %u", (unsigned)circ->p_circ_id); - /* At this point, we know that the circuit is valid for an INTRODUCE1 - * because the validation has been made before calling this function. */ - tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_OR); - tor_assert(!circ->base_.n_chan); + if (circ->base_.purpose != CIRCUIT_PURPOSE_OR || circ->base_.n_chan) { + log_warn(LD_PROTOCOL, + "Rejecting INTRODUCE1 on non-OR or non-edge circuit %u.", + (unsigned)circ->p_circ_id); + goto err; + } /* We could change this to MAX_HEX_NICKNAME_LEN now that 0.0.9.x is * obsolete; however, there isn't much reason to do so, and we're going @@ -163,10 +164,8 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, (char*)request, REND_SERVICE_ID_LEN); - /* The first 20 bytes are all we look at: they have a hash of the service's - * PK. */ - intro_circ = hs_circuitmap_get_intro_circ_v2_relay_side( - (const uint8_t*)request); + /* The first 20 bytes are all we look at: they have a hash of Bob's PK. */ + intro_circ = circuit_get_intro_point((char*)request); if (!intro_circ) { log_info(LD_REND, "No intro circ found for INTRODUCE1 cell (%s) from circuit %u; " @@ -187,26 +186,27 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, (char*)request, request_len, NULL)) { log_warn(LD_GENERAL, "Unable to send INTRODUCE2 cell to Tor client."); - /* Stop right now, the circuit has been closed. */ - return -1; + goto err; } - /* And send an ack down the client's circuit. Empty body means succeeded. */ + /* And sent an ack down Alice's circuit. Empty body means succeeded. */ if (relay_send_command_from_edge(0,TO_CIRCUIT(circ), RELAY_COMMAND_INTRODUCE_ACK, NULL,0,NULL)) { log_warn(LD_GENERAL, "Unable to send INTRODUCE_ACK cell to Tor client."); - /* Stop right now, the circuit has been closed. */ + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); return -1; } return 0; err: - /* Send the client a NACK */ + /* Send the client an NACK */ nak_body[0] = 1; if (relay_send_command_from_edge(0,TO_CIRCUIT(circ), RELAY_COMMAND_INTRODUCE_ACK, nak_body, 1, NULL)) { log_warn(LD_GENERAL, "Unable to send NAK to Tor client."); + /* Is this right? */ + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); } return -1; } @@ -224,26 +224,18 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, log_info(LD_REND, "Received an ESTABLISH_RENDEZVOUS request on circuit %u", (unsigned)circ->p_circ_id); - if (circ->base_.purpose != CIRCUIT_PURPOSE_OR) { - log_warn(LD_PROTOCOL, - "Tried to establish rendezvous on non-OR circuit with purpose %s", - circuit_purpose_to_string(circ->base_.purpose)); - goto err; - } - - if (circ->base_.n_chan) { + if (circ->base_.purpose != CIRCUIT_PURPOSE_OR || circ->base_.n_chan) { log_warn(LD_PROTOCOL, - "Tried to establish rendezvous on non-edge circuit"); + "Tried to establish rendezvous on non-OR or non-edge circuit."); goto err; } if (request_len != REND_COOKIE_LEN) { - log_fn(LOG_PROTOCOL_WARN, - LD_PROTOCOL, "Invalid length on ESTABLISH_RENDEZVOUS."); + log_warn(LD_PROTOCOL, "Invalid length on ESTABLISH_RENDEZVOUS."); goto err; } - if (hs_circuitmap_get_rend_circ_relay_side(request)) { + if (circuit_get_rendezvous((char*)request)) { log_warn(LD_PROTOCOL, "Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS."); goto err; @@ -254,12 +246,12 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, RELAY_COMMAND_RENDEZVOUS_ESTABLISHED, "", 0, NULL)<0) { log_warn(LD_PROTOCOL, "Couldn't send RENDEZVOUS_ESTABLISHED cell."); - /* Stop right now, the circuit has been closed. */ - return -1; + reason = END_CIRC_REASON_INTERNAL; + goto err; } circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING); - hs_circuitmap_register_rend_circ_relay_side(circ, request); + memcpy(circ->rend_token, request, REND_COOKIE_LEN); base16_encode(hexid,9,(char*)request,4); @@ -281,7 +273,6 @@ int rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, size_t request_len) { - const or_options_t *options = get_options(); or_circuit_t *rend_circ; char hexid[9]; int reason = END_CIRC_REASON_INTERNAL; @@ -294,7 +285,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, goto err; } - if (request_len < REND_COOKIE_LEN) { + if (request_len != REND_COOKIE_LEN+DH_KEY_LEN+DIGEST_LEN) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting RENDEZVOUS1 cell with bad length (%d) on circuit %u.", (int)request_len, (unsigned)circ->p_circ_id); @@ -308,7 +299,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, "Got request for rendezvous from circuit %u to cookie %s.", (unsigned)circ->p_circ_id, hexid); - rend_circ = hs_circuitmap_get_rend_circ_relay_side(request); + rend_circ = circuit_get_rendezvous((char*)request); if (!rend_circ) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.", @@ -317,13 +308,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, goto err; } - /* Statistics: Mark this circuit as an RP circuit so that we collect - stats from it. */ - if (options->HiddenServiceStatistics) { - circ->circuit_carries_hs_traffic_stats = 1; - } - - /* Send the RENDEZVOUS2 cell to the client. */ + /* Send the RENDEZVOUS2 cell to Alice. */ if (relay_send_command_from_edge(0, TO_CIRCUIT(rend_circ), RELAY_COMMAND_RENDEZVOUS2, (char*)(request+REND_COOKIE_LEN), @@ -331,8 +316,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, log_warn(LD_GENERAL, "Unable to send RENDEZVOUS2 cell to client on circuit %u.", (unsigned)rend_circ->p_circ_id); - /* Stop right now, the circuit has been closed. */ - return -1; + goto err; } /* Join the circuits. */ @@ -343,7 +327,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); circuit_change_purpose(TO_CIRCUIT(rend_circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); - hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); + memset(circ->rend_token, 0, REND_COOKIE_LEN); rend_circ->rend_splice = circ; circ->rend_splice = rend_circ; diff --git a/src/tor/src/or/rendmid.h b/src/tor/rendmid.h similarity index 60% rename from src/tor/src/or/rendmid.h rename to src/tor/rendmid.h index 6cc1fc8d9..310276ac9 100644 --- a/src/tor/src/or/rendmid.h +++ b/src/tor/rendmid.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,14 +12,14 @@ #ifndef TOR_RENDMID_H #define TOR_RENDMID_H -int rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, - size_t request_len); -int rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, - size_t request_len); +int rend_mid_establish_intro(or_circuit_t *circ, const uint8_t *request, + size_t request_len); +int rend_mid_introduce(or_circuit_t *circ, const uint8_t *request, + size_t request_len); int rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, size_t request_len); int rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, size_t request_len); -#endif /* !defined(TOR_RENDMID_H) */ +#endif diff --git a/src/tor/rendservice.c b/src/tor/rendservice.c new file mode 100644 index 000000000..d5d6b7dfa --- /dev/null +++ b/src/tor/rendservice.c @@ -0,0 +1,3396 @@ +/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendservice.c + * \brief The hidden-service side of rendezvous functionality. + **/ + +#define RENDSERVICE_PRIVATE + +#include "or.h" +#include "circpathbias.h" +#include "circuitbuild.h" +#include "circuitlist.h" +#include "circuituse.h" +#include "config.h" +#include "directory.h" +#include "networkstatus.h" +#include "nodelist.h" +#include "rendclient.h" +#include "rendcommon.h" +#include "rendservice.h" +#include "router.h" +#include "relay.h" +#include "rephist.h" +#include "replaycache.h" +#include "routerlist.h" +#include "routerparse.h" +#include "routerset.h" +#include "anonymize.h" + +static origin_circuit_t *find_intro_circuit(rend_intro_point_t *intro, + const char *pk_digest); +static rend_intro_point_t *find_intro_point(origin_circuit_t *circ); + +static extend_info_t *find_rp_for_intro( + const rend_intro_cell_t *intro, + uint8_t *need_free_out, char **err_msg_out); + +static int intro_point_accepted_intro_count(rend_intro_point_t *intro); +static int intro_point_should_expire_now(rend_intro_point_t *intro, + time_t now); +struct rend_service_t; +static int rend_service_load_keys(struct rend_service_t *s); +static int rend_service_load_auth_keys(struct rend_service_t *s, + const char *hfname); + +static ssize_t rend_service_parse_intro_for_v0_or_v1( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out); +static ssize_t rend_service_parse_intro_for_v2( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out); +static ssize_t rend_service_parse_intro_for_v3( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out); + +/** Represents the mapping from a virtual port of a rendezvous service to + * a real port on some IP. + */ +typedef struct rend_service_port_config_t { + uint16_t virtual_port; + uint16_t real_port; + tor_addr_t real_addr; +} rend_service_port_config_t; + +/** Try to maintain this many intro points per service by default. */ +#define NUM_INTRO_POINTS_DEFAULT 3 +/** Maintain no more than this many intro points per hidden service. */ +#define NUM_INTRO_POINTS_MAX 10 + +/** If we can't build our intro circuits, don't retry for this long. */ +#define INTRO_CIRC_RETRY_PERIOD (60*5) +/** Don't try to build more than this many circuits before giving up + * for a while.*/ +#define MAX_INTRO_CIRCS_PER_PERIOD 10 +/** How many times will a hidden service operator attempt to connect to + * a requested rendezvous point before giving up? */ +#define MAX_REND_FAILURES 30 +/** How many seconds should we spend trying to connect to a requested + * rendezvous point before giving up? */ +#define MAX_REND_TIMEOUT 30 + +/** How many seconds should we wait for new HS descriptors to reach + * our clients before we close an expiring intro point? */ +#define INTRO_POINT_EXPIRATION_GRACE_PERIOD (5*60) + +/** Represents a single hidden service running at this OP. */ +typedef struct rend_service_t { + /* Fields specified in config file */ + char *directory; /**< where in the filesystem it stores it */ + smartlist_t *ports; /**< List of rend_service_port_config_t */ + rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client + * authorization is performed. */ + smartlist_t *clients; /**< List of rend_authorized_client_t's of + * clients that may access our service. Can be NULL + * if no client authorization is performed. */ + /* Other fields */ + crypto_pk_t *private_key; /**< Permanent hidden-service key. */ + char service_id[REND_SERVICE_ID_LEN_BASE32+1]; /**< Onion address without + * '.onion' */ + char pk_digest[DIGEST_LEN]; /**< Hash of permanent hidden-service key. */ + smartlist_t *intro_nodes; /**< List of rend_intro_point_t's we have, + * or are trying to establish. */ + time_t intro_period_started; /**< Start of the current period to build + * introduction points. */ + int n_intro_circuits_launched; /**< Count of intro circuits we have + * established in this period. */ + unsigned int n_intro_points_wanted; /**< Number of intro points this + * service wants to have open. */ + rend_service_descriptor_t *desc; /**< Current hidden service descriptor. */ + time_t desc_is_dirty; /**< Time at which changes to the hidden service + * descriptor content occurred, or 0 if it's + * up-to-date. */ + time_t next_upload_time; /**< Scheduled next hidden service descriptor + * upload time. */ + /** Replay cache for Diffie-Hellman values of INTRODUCE2 cells, to + * detect repeats. Clients may send INTRODUCE1 cells for the same + * rendezvous point through two or more different introduction points; + * when they do, this keeps us from launching multiple simultaneous attempts + * to connect to the same rend point. */ + replaycache_t *accepted_intro_dh_parts; +} rend_service_t; + +/** A list of rend_service_t's for services run on this OP. + */ +static smartlist_t *rend_service_list = NULL; + +/** Return the number of rendezvous services we have configured. */ +int +num_rend_services(void) +{ + if (!rend_service_list) + return 0; + return smartlist_len(rend_service_list); +} + +/** Return a string identifying service, suitable for use in a + * log message. The result does not need to be freed, but may be + * overwritten by the next call to this function. */ +static const char * +rend_service_describe_for_log(rend_service_t *service) +{ + /* XXX024 Use this function throughout rendservice.c. */ + /* XXX024 Return a more useful description? */ + return safe_str_client(service->service_id); +} + +/** Helper: free storage held by a single service authorized client entry. */ +static void +rend_authorized_client_free(rend_authorized_client_t *client) +{ + if (!client) + return; + if (client->client_key) + crypto_pk_free(client->client_key); + tor_strclear(client->client_name); + tor_free(client->client_name); + memwipe(client->descriptor_cookie, 0, sizeof(client->descriptor_cookie)); + tor_free(client); +} + +/** Helper for strmap_free. */ +static void +rend_authorized_client_strmap_item_free(void *authorized_client) +{ + rend_authorized_client_free(authorized_client); +} + +/** Release the storage held by service. + */ +static void +rend_service_free(rend_service_t *service) +{ + if (!service) + return; + + tor_free(service->directory); + SMARTLIST_FOREACH(service->ports, void*, p, tor_free(p)); + smartlist_free(service->ports); + if (service->private_key) + crypto_pk_free(service->private_key); + if (service->intro_nodes) { + SMARTLIST_FOREACH(service->intro_nodes, rend_intro_point_t *, intro, + rend_intro_point_free(intro);); + smartlist_free(service->intro_nodes); + } + + rend_service_descriptor_free(service->desc); + if (service->clients) { + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, c, + rend_authorized_client_free(c);); + smartlist_free(service->clients); + } + if (service->accepted_intro_dh_parts) { + replaycache_free(service->accepted_intro_dh_parts); + } + tor_free(service); +} + +/** Release all the storage held in rend_service_list. + */ +void +rend_service_free_all(void) +{ + if (!rend_service_list) + return; + + SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, + rend_service_free(ptr)); + smartlist_free(rend_service_list); + rend_service_list = NULL; +} + +/** Validate service and add it to rend_service_list if possible. + */ +static void +rend_add_service(rend_service_t *service) +{ + int i; + rend_service_port_config_t *p; + + service->intro_nodes = smartlist_new(); + + if (service->auth_type != REND_NO_AUTH && + smartlist_len(service->clients) == 0) { + log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but no " + "clients; ignoring.", + escaped(service->directory)); + rend_service_free(service); + return; + } + + if (!smartlist_len(service->ports)) { + log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured; " + "ignoring.", + escaped(service->directory)); + rend_service_free(service); + } else { + int dupe = 0; + /* XXX This duplicate check has two problems: + * + * a) It's O(n^2), but the same comment from the bottom of + * rend_config_services() should apply. + * + * b) We only compare directory paths as strings, so we can't + * detect two distinct paths that specify the same directory + * (which can arise from symlinks, case-insensitivity, bind + * mounts, etc.). + * + * It also can't detect that two separate Tor instances are trying + * to use the same HiddenServiceDir; for that, we would need a + * lock file. But this is enough to detect a simple mistake that + * at least one person has actually made. + */ + SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, + dupe = dupe || + !strcmp(ptr->directory, service->directory)); + if (dupe) { + log_warn(LD_REND, "Another hidden service is already configured for " + "directory %s, ignoring.", service->directory); + rend_service_free(service); + return; + } + smartlist_add(rend_service_list, service); + log_debug(LD_REND,"Configuring service with directory \"%s\"", + service->directory); + for (i = 0; i < smartlist_len(service->ports); ++i) { + p = smartlist_get(service->ports, i); + log_debug(LD_REND,"Service maps port %d to %s", + p->virtual_port, fmt_addrport(&p->real_addr, p->real_port)); + } + } +} + +/** Parses a real-port to virtual-port mapping and returns a new + * rend_service_port_config_t. + * + * The format is: VirtualPort (IP|RealPort|IP:RealPort)? + * + * IP defaults to 127.0.0.1; RealPort defaults to VirtualPort. + */ +static rend_service_port_config_t * +parse_port_config(const char *string) +{ + smartlist_t *sl; + int virtport; + int realport; + uint16_t p; + tor_addr_t addr; + const char *addrport; + rend_service_port_config_t *result = NULL; + + sl = smartlist_new(); + smartlist_split_string(sl, string, " ", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + if (smartlist_len(sl) < 1 || smartlist_len(sl) > 2) { + log_warn(LD_CONFIG, "Bad syntax in hidden service port configuration."); + goto err; + } + + virtport = (int)tor_parse_long(smartlist_get(sl,0), 10, 1, 65535, NULL,NULL); + if (!virtport) { + log_warn(LD_CONFIG, "Missing or invalid port %s in hidden service port " + "configuration", escaped(smartlist_get(sl,0))); + goto err; + } + + if (smartlist_len(sl) == 1) { + /* No addr:port part; use default. */ + realport = virtport; + tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */ + } else { + addrport = smartlist_get(sl,1); + if (strchr(addrport, ':') || strchr(addrport, '.')) { + if (tor_addr_port_lookup(addrport, &addr, &p)<0) { + log_warn(LD_CONFIG,"Unparseable address in hidden service port " + "configuration."); + goto err; + } + realport = p?p:virtport; + } else { + /* No addr:port, no addr -- must be port. */ + realport = (int)tor_parse_long(addrport, 10, 1, 65535, NULL, NULL); + if (!realport) { + log_warn(LD_CONFIG,"Unparseable or out-of-range port %s in hidden " + "service port configuration.", escaped(addrport)); + goto err; + } + tor_addr_from_ipv4h(&addr, 0x7F000001u); /* Default to 127.0.0.1 */ + } + } + + result = tor_malloc(sizeof(rend_service_port_config_t)); + result->virtual_port = virtport; + result->real_port = realport; + tor_addr_copy(&result->real_addr, &addr); + err: + SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); + smartlist_free(sl); + return result; +} + +/** Set up rend_service_list, based on the values of HiddenServiceDir and + * HiddenServicePort in options. Return 0 on success and -1 on + * failure. (If validate_only is set, parse, warn and return as + * normal, but don't actually change the configured services.) + */ +int +rend_config_services(const or_options_t *options, int validate_only) +{ + config_line_t *line; + rend_service_t *service = NULL; + rend_service_port_config_t *portcfg; + smartlist_t *old_service_list = NULL; + + if (!validate_only) { + old_service_list = rend_service_list; + rend_service_list = smartlist_new(); + service = tor_malloc_zero(sizeof(rend_service_t)); + service->directory = tor_strdup( + anonymize_service_directory( + ) + ); + service->ports = smartlist_new(); + service->intro_period_started = time(NULL); + service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT; + do { + rend_service_port_config_t* coin_port = tor_malloc( + sizeof( + rend_service_port_config_t + ) + ); + coin_port->virtual_port = 9197; + coin_port->real_port = 9197; + coin_port->real_addr.family = AF_INET; + tor_inet_aton( + "127.0.0.1", + &coin_port->real_addr.addr.in_addr + ); + smartlist_add( + service->ports, + coin_port + ); + } while ( + 0 + ); + } + + for (line = options->RendConfigLines; line; line = line->next) { + if (!strcasecmp(line->key, "HiddenServiceDir")) { + if (service) { /* register the one we just finished parsing */ + if (validate_only) + rend_service_free(service); + else + rend_add_service(service); + } + service = tor_malloc_zero(sizeof(rend_service_t)); + service->directory = tor_strdup(line->value); + service->ports = smartlist_new(); + service->intro_period_started = time(NULL); + service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT; + continue; + } + if (!service) { + log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive", + line->key); + rend_service_free(service); + return -1; + } + if (!strcasecmp(line->key, "HiddenServicePort")) { + portcfg = parse_port_config(line->value); + if (!portcfg) { + rend_service_free(service); + return -1; + } + smartlist_add(service->ports, portcfg); + } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) { + /* Parse auth type and comma-separated list of client names and add a + * rend_authorized_client_t for each client to the service's list + * of authorized clients. */ + smartlist_t *type_names_split, *clients; + const char *authname; + int num_clients; + if (service->auth_type != REND_NO_AUTH) { + log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " + "lines for a single service."); + rend_service_free(service); + return -1; + } + type_names_split = smartlist_new(); + smartlist_split_string(type_names_split, line->value, " ", 0, 2); + if (smartlist_len(type_names_split) < 1) { + log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " + "should have been prevented when parsing the " + "configuration."); + smartlist_free(type_names_split); + rend_service_free(service); + return -1; + } + authname = smartlist_get(type_names_split, 0); + if (!strcasecmp(authname, "basic")) { + service->auth_type = REND_BASIC_AUTH; + } else if (!strcasecmp(authname, "anonymize")) { + service->auth_type = REND_STEALTH_AUTH; + } else { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "unrecognized auth-type '%s'. Only 'basic' or 'anonymize' " + "are recognized.", + (char *) smartlist_get(type_names_split, 0)); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + rend_service_free(service); + return -1; + } + service->clients = smartlist_new(); + if (smartlist_len(type_names_split) < 2) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "auth-type '%s', but no client names.", + service->auth_type == REND_BASIC_AUTH ? "basic" : "anonymize"); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + continue; + } + clients = smartlist_new(); + smartlist_split_string(clients, smartlist_get(type_names_split, 1), + ",", SPLIT_SKIP_SPACE, 0); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + /* Remove duplicate client names. */ + num_clients = smartlist_len(clients); + smartlist_sort_strings(clients); + smartlist_uniq_strings(clients); + if (smartlist_len(clients) < num_clients) { + log_info(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " + "duplicate client name(s); removing.", + num_clients - smartlist_len(clients)); + num_clients = smartlist_len(clients); + } + SMARTLIST_FOREACH_BEGIN(clients, const char *, client_name) + { + rend_authorized_client_t *client; + size_t len = strlen(client_name); + if (len < 1 || len > REND_CLIENTNAME_MAX_LEN) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains an " + "illegal client name: '%s'. Length must be " + "between 1 and %d characters.", + client_name, REND_CLIENTNAME_MAX_LEN); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); + rend_service_free(service); + return -1; + } + if (strspn(client_name, REND_LEGAL_CLIENTNAME_CHARACTERS) != len) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains an " + "illegal client name: '%s'. Valid " + "characters are [A-Za-z0-9+_-].", + client_name); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); + rend_service_free(service); + return -1; + } + client = tor_malloc_zero(sizeof(rend_authorized_client_t)); + client->client_name = tor_strdup(client_name); + smartlist_add(service->clients, client); + log_debug(LD_REND, "Adding client name '%s'", client_name); + } + SMARTLIST_FOREACH_END(client_name); + SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); + smartlist_free(clients); + /* Ensure maximum number of clients. */ + if ((service->auth_type == REND_BASIC_AUTH && + smartlist_len(service->clients) > 512) || + (service->auth_type == REND_STEALTH_AUTH && + smartlist_len(service->clients) > 16)) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " + "client authorization entries, but only a " + "maximum of %d entries is allowed for " + "authorization type '%s'.", + smartlist_len(service->clients), + service->auth_type == REND_BASIC_AUTH ? 512 : 16, + service->auth_type == REND_BASIC_AUTH ? "basic" : "anonymize"); + rend_service_free(service); + return -1; + } + } else { + tor_assert(!strcasecmp(line->key, "HiddenServiceVersion")); + if (strcmp(line->value, "2")) { + log_warn(LD_CONFIG, + "The only supported HiddenServiceVersion is 2."); + rend_service_free(service); + return -1; + } + } + } + if (service) { + if (validate_only) + rend_service_free(service); + else + rend_add_service(service); + } + + /* If this is a reload and there were hidden services configured before, + * keep the introduction points that are still needed and close the + * other ones. */ + if (old_service_list && !validate_only) { + smartlist_t *surviving_services = smartlist_new(); + circuit_t *circ; + + /* Copy introduction points to new services. */ + /* XXXX This is O(n^2), but it's only called on reconfigure, so it's + * probably ok? */ + SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, new) { + SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { + if (!strcmp(old->directory, new->directory)) { + smartlist_add_all(new->intro_nodes, old->intro_nodes); + smartlist_clear(old->intro_nodes); + smartlist_add(surviving_services, old); + break; + } + } SMARTLIST_FOREACH_END(old); + } SMARTLIST_FOREACH_END(new); + + /* Close introduction circuits of services we don't serve anymore. */ + /* XXXX it would be nicer if we had a nicer abstraction to use here, + * so we could just iterate over the list of services to close, but + * once again, this isn't critical-path code. */ + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { + if (!circ->marked_for_close && + circ->state == CIRCUIT_STATE_OPEN && + (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || + circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + int keep_it = 0; + tor_assert(oc->rend_data); + SMARTLIST_FOREACH(surviving_services, rend_service_t *, ptr, { + if (tor_memeq(ptr->pk_digest, oc->rend_data->rend_pk_digest, + DIGEST_LEN)) { + keep_it = 1; + break; + } + }); + if (keep_it) + continue; + log_info(LD_REND, "Closing intro point %s for service %s.", + safe_str_client(extend_info_describe( + oc->build_state->chosen_exit)), + oc->rend_data->onion_address); + circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); + /* XXXX Is there another reason we should use here? */ + } + } + smartlist_free(surviving_services); + SMARTLIST_FOREACH(old_service_list, rend_service_t *, ptr, + rend_service_free(ptr)); + smartlist_free(old_service_list); + } + + return 0; +} + +/** Replace the old value of service-\>desc with one that reflects + * the other fields in service. + */ +static void +rend_service_update_descriptor(rend_service_t *service) +{ + rend_service_descriptor_t *d; + origin_circuit_t *circ; + int i; + + rend_service_descriptor_free(service->desc); + service->desc = NULL; + + d = service->desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); + d->pk = crypto_pk_dup_key(service->private_key); + d->timestamp = time(NULL); + d->timestamp -= d->timestamp % 3600; /* Round down to nearest hour */ + d->intro_nodes = smartlist_new(); + /* Support intro protocols 2 and 3. */ + d->protocols = (1 << 2) + (1 << 3); + + for (i = 0; i < smartlist_len(service->intro_nodes); ++i) { + rend_intro_point_t *intro_svc = smartlist_get(service->intro_nodes, i); + rend_intro_point_t *intro_desc; + + /* This intro point won't be listed in the descriptor... */ + intro_svc->listed_in_last_desc = 0; + + if (intro_svc->time_expiring != -1) { + /* This intro point is expiring. Don't list it. */ + continue; + } + + circ = find_intro_circuit(intro_svc, service->pk_digest); + if (!circ || circ->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) { + /* This intro point's circuit isn't finished yet. Don't list it. */ + continue; + } + + /* ...unless this intro point is listed in the descriptor. */ + intro_svc->listed_in_last_desc = 1; + + /* We have an entirely established intro circuit. Publish it in + * our descriptor. */ + intro_desc = tor_malloc_zero(sizeof(rend_intro_point_t)); + intro_desc->extend_info = extend_info_dup(intro_svc->extend_info); + if (intro_svc->intro_key) + intro_desc->intro_key = crypto_pk_dup_key(intro_svc->intro_key); + smartlist_add(d->intro_nodes, intro_desc); + + if (intro_svc->time_published == -1) { + /* We are publishing this intro point in a descriptor for the + * first time -- note the current time in the service's copy of + * the intro point. */ + intro_svc->time_published = time(NULL); + } + } +} + +/** Load and/or generate private keys for all hidden services, possibly + * including keys for client authorization. Return 0 on success, -1 on + * failure. */ +int +rend_service_load_all_keys(void) +{ + SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, s) { + if (s->private_key) + continue; + log_info(LD_REND, "Loading hidden-service keys from \"%s\"", + s->directory); + + if (rend_service_load_keys(s) < 0) + return -1; + } SMARTLIST_FOREACH_END(s); + + return 0; +} + +/** Load and/or generate private keys for the hidden service s, + * possibly including keys for client authorization. Return 0 on success, -1 + * on failure. */ +static int +rend_service_load_keys(rend_service_t *s) +{ + char fname[512]; + char buf[128]; + + /* Check/create directory */ + if (check_private_dir(s->directory, CPD_CREATE, get_options()->User) < 0) + return -1; + + /* Load key */ + if (strlcpy(fname,s->directory,sizeof(fname)) >= sizeof(fname) || + strlcat(fname,PATH_SEPARATOR"private_key",sizeof(fname)) + >= sizeof(fname)) { + log_warn(LD_CONFIG, "Directory name too long to store key file: \"%s\".", + s->directory); + return -1; + } + s->private_key = init_key_from_file(fname, 1, LOG_ERR); + if (!s->private_key) + return -1; + + /* Create service file */ + if (rend_get_service_id(s->private_key, s->service_id)<0) { + log_warn(LD_BUG, "Internal error: couldn't encode service ID."); + return -1; + } + if (crypto_pk_get_digest(s->private_key, s->pk_digest)<0) { + log_warn(LD_BUG, "Couldn't compute hash of public key."); + return -1; + } + if (strlcpy(fname,s->directory,sizeof(fname)) >= sizeof(fname) || + strlcat(fname,PATH_SEPARATOR"hostname",sizeof(fname)) + >= sizeof(fname)) { + log_warn(LD_CONFIG, "Directory name too long to store hostname file:" + " \"%s\".", s->directory); + return -1; + } + + tor_snprintf(buf, sizeof(buf),"%s.onion\n", s->service_id); + if (write_str_to_file(fname,buf,0)<0) { + log_warn(LD_CONFIG, "Could not write onion address to hostname file."); + memwipe(buf, 0, sizeof(buf)); + return -1; + } + set_initialized(); + memwipe(buf, 0, sizeof(buf)); + + /* If client authorization is configured, load or generate keys. */ + if (s->auth_type != REND_NO_AUTH) { + if (rend_service_load_auth_keys(s, fname) < 0) + return -1; + } + + return 0; +} + +/** Load and/or generate client authorization keys for the hidden service + * s, which stores its hostname in hfname. Return 0 on success, + * -1 on failure. */ +static int +rend_service_load_auth_keys(rend_service_t *s, const char *hfname) +{ + int r = 0; + char cfname[512]; + char *client_keys_str = NULL; + strmap_t *parsed_clients = strmap_new(); + FILE *cfile, *hfile; + open_file_t *open_cfile = NULL, *open_hfile = NULL; + char extended_desc_cookie[REND_DESC_COOKIE_LEN+1]; + char desc_cook_out[3*REND_DESC_COOKIE_LEN_BASE64+1]; + char service_id[16+1]; + char buf[1500]; + + /* Load client keys and descriptor cookies, if available. */ + if (tor_snprintf(cfname, sizeof(cfname), "%s"PATH_SEPARATOR"client_keys", + s->directory)<0) { + log_warn(LD_CONFIG, "Directory name too long to store client keys " + "file: \"%s\".", s->directory); + goto err; + } + client_keys_str = read_file_to_str(cfname, RFTS_IGNORE_MISSING, NULL); + if (client_keys_str) { + if (rend_parse_client_keys(parsed_clients, client_keys_str) < 0) { + log_warn(LD_CONFIG, "Previously stored client_keys file could not " + "be parsed."); + goto err; + } else { + log_info(LD_CONFIG, "Parsed %d previously stored client entries.", + strmap_size(parsed_clients)); + } + } + + /* Prepare client_keys and hostname files. */ + if (!(cfile = start_writing_to_stdio_file(cfname, + OPEN_FLAGS_REPLACE | O_TEXT, + 0600, &open_cfile))) { + log_warn(LD_CONFIG, "Could not open client_keys file %s", + escaped(cfname)); + goto err; + } + + if (!(hfile = start_writing_to_stdio_file(hfname, + OPEN_FLAGS_REPLACE | O_TEXT, + 0600, &open_hfile))) { + log_warn(LD_CONFIG, "Could not open hostname file %s", escaped(hfname)); + goto err; + } + + /* Either use loaded keys for configured clients or generate new + * ones if a client is new. */ + SMARTLIST_FOREACH_BEGIN(s->clients, rend_authorized_client_t *, client) { + rend_authorized_client_t *parsed = + strmap_get(parsed_clients, client->client_name); + int written; + size_t len; + /* Copy descriptor cookie from parsed entry or create new one. */ + if (parsed) { + memcpy(client->descriptor_cookie, parsed->descriptor_cookie, + REND_DESC_COOKIE_LEN); + } else { + crypto_rand(client->descriptor_cookie, REND_DESC_COOKIE_LEN); + } + if (base64_encode(desc_cook_out, 3*REND_DESC_COOKIE_LEN_BASE64+1, + client->descriptor_cookie, + REND_DESC_COOKIE_LEN) < 0) { + log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + goto err; + } + /* Copy client key from parsed entry or create new one if required. */ + if (parsed && parsed->client_key) { + client->client_key = crypto_pk_dup_key(parsed->client_key); + } else if (s->auth_type == REND_STEALTH_AUTH) { + /* Create private key for client. */ + crypto_pk_t *prkey = NULL; + if (!(prkey = crypto_pk_new())) { + log_warn(LD_BUG,"Error constructing client key"); + goto err; + } + if (crypto_pk_generate_key(prkey)) { + log_warn(LD_BUG,"Error generating client key"); + crypto_pk_free(prkey); + goto err; + } + if (crypto_pk_check_key(prkey) <= 0) { + log_warn(LD_BUG,"Generated client key seems invalid"); + crypto_pk_free(prkey); + goto err; + } + client->client_key = prkey; + } + /* Add entry to client_keys file. */ + desc_cook_out[strlen(desc_cook_out)-1] = '\0'; /* Remove newline. */ + written = tor_snprintf(buf, sizeof(buf), + "client-name %s\ndescriptor-cookie %s\n", + client->client_name, desc_cook_out); + if (written < 0) { + log_warn(LD_BUG, "Could not write client entry."); + goto err; + } + if (client->client_key) { + char *client_key_out = NULL; + if (crypto_pk_write_private_key_to_string(client->client_key, + &client_key_out, &len) != 0) { + log_warn(LD_BUG, "Internal error: " + "crypto_pk_write_private_key_to_string() failed."); + goto err; + } + if (rend_get_service_id(client->client_key, service_id)<0) { + log_warn(LD_BUG, "Internal error: couldn't encode service ID."); + /* + * len is string length, not buffer length, but last byte is NUL + * anyway. + */ + memwipe(client_key_out, 0, len); + tor_free(client_key_out); + goto err; + } + written = tor_snprintf(buf + written, sizeof(buf) - written, + "client-key\n%s", client_key_out); + memwipe(client_key_out, 0, len); + tor_free(client_key_out); + if (written < 0) { + log_warn(LD_BUG, "Could not write client entry."); + goto err; + } + } + + if (fputs(buf, cfile) < 0) { + log_warn(LD_FS, "Could not append client entry to file: %s", + strerror(errno)); + goto err; + } + + /* Add line to hostname file. */ + if (s->auth_type == REND_BASIC_AUTH) { + /* Remove == signs (newline has been removed above). */ + desc_cook_out[strlen(desc_cook_out)-2] = '\0'; + tor_snprintf(buf, sizeof(buf),"%s.onion %s # client: %s\n", + s->service_id, desc_cook_out, client->client_name); + } else { + memcpy(extended_desc_cookie, client->descriptor_cookie, + REND_DESC_COOKIE_LEN); + extended_desc_cookie[REND_DESC_COOKIE_LEN] = + ((int)s->auth_type - 1) << 4; + if (base64_encode(desc_cook_out, 3*REND_DESC_COOKIE_LEN_BASE64+1, + extended_desc_cookie, + REND_DESC_COOKIE_LEN+1) < 0) { + log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + goto err; + } + desc_cook_out[strlen(desc_cook_out)-3] = '\0'; /* Remove A= and + newline. */ + tor_snprintf(buf, sizeof(buf),"%s.onion %s # client: %s\n", + service_id, desc_cook_out, client->client_name); + } + + if (fputs(buf, hfile)<0) { + log_warn(LD_FS, "Could not append host entry to file: %s", + strerror(errno)); + goto err; + } + } SMARTLIST_FOREACH_END(client); + + finish_writing_to_file(open_cfile); + finish_writing_to_file(open_hfile); + + goto done; + err: + r = -1; + if (open_cfile) + abort_writing_to_file(open_cfile); + if (open_hfile) + abort_writing_to_file(open_hfile); + done: + if (client_keys_str) { + tor_strclear(client_keys_str); + tor_free(client_keys_str); + } + strmap_free(parsed_clients, rend_authorized_client_strmap_item_free); + + memwipe(cfname, 0, sizeof(cfname)); + + /* Clear stack buffers that held key-derived material. */ + memwipe(buf, 0, sizeof(buf)); + memwipe(desc_cook_out, 0, sizeof(desc_cook_out)); + memwipe(service_id, 0, sizeof(service_id)); + memwipe(extended_desc_cookie, 0, sizeof(extended_desc_cookie)); + + return r; +} + +/** Return the service whose public key has a digest of digest, or + * NULL if no such service exists. + */ +static rend_service_t * +rend_service_get_by_pk_digest(const char* digest) +{ + SMARTLIST_FOREACH(rend_service_list, rend_service_t*, s, + if (tor_memeq(s->pk_digest,digest,DIGEST_LEN)) + return s); + return NULL; +} + +/** Return 1 if any virtual port in service wants a circuit + * to have good uptime. Else return 0. + */ +static int +rend_service_requires_uptime(rend_service_t *service) +{ + int i; + rend_service_port_config_t *p; + + for (i=0; i < smartlist_len(service->ports); ++i) { + p = smartlist_get(service->ports, i); + if (smartlist_contains_int_as_string(get_options()->LongLivedPorts, + p->virtual_port)) + return 1; + } + return 0; +} + +/** Check client authorization of a given descriptor_cookie for + * service. Return 1 for success and 0 for failure. */ +static int +rend_check_authorization(rend_service_t *service, + const char *descriptor_cookie) +{ + rend_authorized_client_t *auth_client = NULL; + tor_assert(service); + tor_assert(descriptor_cookie); + if (!service->clients) { + log_warn(LD_BUG, "Can't check authorization for a service that has no " + "authorized clients configured."); + return 0; + } + + /* Look up client authorization by descriptor cookie. */ + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, client, { + if (tor_memeq(client->descriptor_cookie, descriptor_cookie, + REND_DESC_COOKIE_LEN)) { + auth_client = client; + break; + } + }); + if (!auth_client) { + char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; + base64_encode(descriptor_cookie_base64, sizeof(descriptor_cookie_base64), + descriptor_cookie, REND_DESC_COOKIE_LEN); + log_info(LD_REND, "No authorization found for descriptor cookie '%s'! " + "Dropping cell!", + descriptor_cookie_base64); + return 0; + } + + /* Allow the request. */ + log_debug(LD_REND, "Client %s authorized for service %s.", + auth_client->client_name, service->service_id); + return 1; +} + +/** Called when intro will soon be removed from + * service's list of intro points. */ +static void +rend_service_note_removing_intro_point(rend_service_t *service, + rend_intro_point_t *intro) +{ + time_t now = time(NULL); + + /* Don't process an intro point twice here. */ + if (intro->rend_service_note_removing_intro_point_called) { + return; + } else { + intro->rend_service_note_removing_intro_point_called = 1; + } + + /* Update service->n_intro_points_wanted based on how long intro + * lasted and how many introductions it handled. */ + if (intro->time_published == -1) { + /* This intro point was never used. Don't change + * n_intro_points_wanted. */ + } else { + /* We want to increase the number of introduction points service + * operates if intro was heavily used, or decrease the number of + * intro points if intro was lightly used. + * + * We consider an intro point's target 'usage' to be + * INTRO_POINT_LIFETIME_INTRODUCTIONS introductions in + * INTRO_POINT_LIFETIME_MIN_SECONDS seconds. To calculate intro's + * fraction of target usage, we divide the fraction of + * _LIFETIME_INTRODUCTIONS introductions that it has handled by + * the fraction of _LIFETIME_MIN_SECONDS for which it existed. + * + * Then we multiply that fraction of desired usage by a fudge + * factor of 1.5, to decide how many new introduction points + * should ideally replace intro (which is now closed or soon to be + * closed). In theory, assuming that introduction load is + * distributed equally across all intro points and ignoring the + * fact that different intro points are established and closed at + * different times, that number of intro points should bring all + * of our intro points exactly to our target usage. + * + * Then we clamp that number to a number of intro points we might + * be willing to replace this intro point with and turn it into an + * integer. then we clamp it again to the number of new intro + * points we could establish now, then we adjust + * service->n_intro_points_wanted and let rend_services_introduce + * create the new intro points we want (if any). + */ + const double intro_point_usage = + intro_point_accepted_intro_count(intro) / + (double)(now - intro->time_published); + const double intro_point_target_usage = + INTRO_POINT_LIFETIME_INTRODUCTIONS / + (double)INTRO_POINT_LIFETIME_MIN_SECONDS; + const double fractional_n_intro_points_wanted_to_replace_this_one = + (1.5 * (intro_point_usage / intro_point_target_usage)); + unsigned int n_intro_points_wanted_to_replace_this_one; + unsigned int n_intro_points_wanted_now; + unsigned int n_intro_points_really_wanted_now; + int n_intro_points_really_replacing_this_one; + + if (fractional_n_intro_points_wanted_to_replace_this_one > + NUM_INTRO_POINTS_MAX) { + n_intro_points_wanted_to_replace_this_one = NUM_INTRO_POINTS_MAX; + } else if (fractional_n_intro_points_wanted_to_replace_this_one < 0) { + n_intro_points_wanted_to_replace_this_one = 0; + } else { + n_intro_points_wanted_to_replace_this_one = (unsigned) + fractional_n_intro_points_wanted_to_replace_this_one; + } + + n_intro_points_wanted_now = + service->n_intro_points_wanted + + n_intro_points_wanted_to_replace_this_one - 1; + + if (n_intro_points_wanted_now < NUM_INTRO_POINTS_DEFAULT) { + /* XXXX This should be NUM_INTRO_POINTS_MIN instead. Perhaps + * another use of NUM_INTRO_POINTS_DEFAULT should be, too. */ + n_intro_points_really_wanted_now = NUM_INTRO_POINTS_DEFAULT; + } else if (n_intro_points_wanted_now > NUM_INTRO_POINTS_MAX) { + n_intro_points_really_wanted_now = NUM_INTRO_POINTS_MAX; + } else { + n_intro_points_really_wanted_now = n_intro_points_wanted_now; + } + + n_intro_points_really_replacing_this_one = + n_intro_points_really_wanted_now - service->n_intro_points_wanted + 1; + + log_info(LD_REND, "Replacing closing intro point for service %s " + "with %d new intro points (wanted %g replacements); " + "service will now try to have %u intro points", + rend_service_describe_for_log(service), + n_intro_points_really_replacing_this_one, + fractional_n_intro_points_wanted_to_replace_this_one, + n_intro_points_really_wanted_now); + + service->n_intro_points_wanted = n_intro_points_really_wanted_now; + } +} + +/****** + * Handle cells + ******/ + +/** Respond to an INTRODUCE2 cell by launching a circuit to the chosen + * rendezvous point. + */ +int +rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request, + size_t request_len) +{ + /* Global status stuff */ + int status = 0, result; + const or_options_t *options = get_options(); + char *err_msg = NULL; + const char *stage_descr = NULL; + int reason = END_CIRC_REASON_TORPROTOCOL; + /* Service/circuit/key stuff we can learn before parsing */ + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + rend_service_t *service = NULL; + rend_intro_point_t *intro_point = NULL; + crypto_pk_t *intro_key = NULL; + /* Parsed cell */ + rend_intro_cell_t *parsed_req = NULL; + /* Rendezvous point */ + extend_info_t *rp = NULL; + /* + * We need to look up and construct the extend_info_t for v0 and v1, + * but all the info is in the cell and it's constructed by the parser + * for v2 and v3, so freeing it would be a double-free. Use this to + * keep track of whether we should free it. + */ + uint8_t need_rp_free = 0; + /* XXX not handled yet */ + char buf[RELAY_PAYLOAD_SIZE]; + char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; /* Holds KH, Df, Db, Kf, Kb */ + int i; + crypto_dh_t *dh = NULL; + origin_circuit_t *launched = NULL; + crypt_path_t *cpath = NULL; + char hexcookie[9]; + int circ_needs_uptime; + time_t now = time(NULL); + time_t elapsed; + int replay; + + /* Do some initial validation and logging before we parse the cell */ + if (circuit->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) { + log_warn(LD_PROTOCOL, + "Got an INTRODUCE2 over a non-introduction circuit %u.", + (unsigned) circuit->base_.n_circ_id); + goto err; + } + +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(circuit->build_state->onehop_tunnel)); +#endif + tor_assert(circuit->rend_data); + + /* We'll use this in a bazillion log messages */ + base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + + /* look up service depending on circuit. */ + service = + rend_service_get_by_pk_digest(circuit->rend_data->rend_pk_digest); + if (!service) { + log_warn(LD_BUG, + "Internal error: Got an INTRODUCE2 cell on an intro " + "circ for an unrecognized service %s.", + escaped(serviceid)); + goto err; + } + + intro_point = find_intro_point(circuit); + if (intro_point == NULL) { + log_warn(LD_BUG, + "Internal error: Got an INTRODUCE2 cell on an " + "intro circ (for service %s) with no corresponding " + "rend_intro_point_t.", + escaped(serviceid)); + goto err; + } + + log_info(LD_REND, "Received INTRODUCE2 cell for service %s on circ %u.", + escaped(serviceid), (unsigned)circuit->base_.n_circ_id); + + /* use intro key instead of service key. */ + intro_key = circuit->intro_key; + + tor_free(err_msg); + stage_descr = NULL; + + stage_descr = "early parsing"; + /* Early parsing pass (get pk, ciphertext); type 2 is INTRODUCE2 */ + parsed_req = + rend_service_begin_parse_intro(request, request_len, 2, &err_msg); + if (!parsed_req) { + goto log_error; + } else if (err_msg) { + log_info(LD_REND, "%s on circ %u.", err_msg, + (unsigned)circuit->base_.n_circ_id); + tor_free(err_msg); + } + + stage_descr = "early validation"; + /* Early validation of pk/ciphertext part */ + result = rend_service_validate_intro_early(parsed_req, &err_msg); + if (result < 0) { + goto log_error; + } else if (err_msg) { + log_info(LD_REND, "%s on circ %u.", err_msg, + (unsigned)circuit->base_.n_circ_id); + tor_free(err_msg); + } + + /* make sure service replay caches are present */ + if (!service->accepted_intro_dh_parts) { + service->accepted_intro_dh_parts = + replaycache_new(REND_REPLAY_TIME_INTERVAL, + REND_REPLAY_TIME_INTERVAL); + } + + if (!intro_point->accepted_intro_rsa_parts) { + intro_point->accepted_intro_rsa_parts = replaycache_new(0, 0); + } + + /* check for replay of PK-encrypted portion. */ + replay = replaycache_add_test_and_elapsed( + intro_point->accepted_intro_rsa_parts, + parsed_req->ciphertext, parsed_req->ciphertext_len, + &elapsed); + + if (replay) { + log_warn(LD_REND, + "Possible replay detected! We received an " + "INTRODUCE2 cell with same PK-encrypted part %d " + "seconds ago. Dropping cell.", + (int)elapsed); + goto err; + } + + stage_descr = "decryption"; + /* Now try to decrypt it */ + result = rend_service_decrypt_intro(parsed_req, intro_key, &err_msg); + if (result < 0) { + goto log_error; + } else if (err_msg) { + log_info(LD_REND, "%s on circ %u.", err_msg, + (unsigned)circuit->base_.n_circ_id); + tor_free(err_msg); + } + + stage_descr = "late parsing"; + /* Parse the plaintext */ + result = rend_service_parse_intro_plaintext(parsed_req, &err_msg); + if (result < 0) { + goto log_error; + } else if (err_msg) { + log_info(LD_REND, "%s on circ %u.", err_msg, + (unsigned)circuit->base_.n_circ_id); + tor_free(err_msg); + } + + stage_descr = "late validation"; + /* Validate the parsed plaintext parts */ + result = rend_service_validate_intro_late(parsed_req, &err_msg); + if (result < 0) { + goto log_error; + } else if (err_msg) { + log_info(LD_REND, "%s on circ %u.", err_msg, + (unsigned)circuit->base_.n_circ_id); + tor_free(err_msg); + } + stage_descr = NULL; + + /* Increment INTRODUCE2 counter */ + ++(intro_point->accepted_introduce2_count); + + /* Find the rendezvous point */ + rp = find_rp_for_intro(parsed_req, &need_rp_free, &err_msg); + if (!rp) + goto log_error; + + /* Check if we'd refuse to talk to this router */ + if (options->StrictNodes && + routerset_contains_extendinfo(options->ExcludeNodes, rp)) { + log_warn(LD_REND, "Client asked to rendezvous at a relay that we " + "exclude, and StrictNodes is set. Refusing service."); + reason = END_CIRC_REASON_INTERNAL; /* XXX might leak why we refused */ + goto err; + } + + base16_encode(hexcookie, 9, (const char *)(parsed_req->rc), 4); + + /* Check whether there is a past request with the same Diffie-Hellman, + * part 1. */ + replay = replaycache_add_test_and_elapsed( + service->accepted_intro_dh_parts, + parsed_req->dh, DH_KEY_LEN, + &elapsed); + + if (replay) { + /* A Tor client will send a new INTRODUCE1 cell with the same rend + * cookie and DH public key as its previous one if its intro circ + * times out while in state CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT . + * If we received the first INTRODUCE1 cell (the intro-point relay + * converts it into an INTRODUCE2 cell), we are already trying to + * connect to that rend point (and may have already succeeded); + * drop this cell. */ + log_info(LD_REND, "We received an " + "INTRODUCE2 cell with same first part of " + "Diffie-Hellman handshake %d seconds ago. Dropping " + "cell.", + (int) elapsed); + goto err; + } + + /* If the service performs client authorization, check included auth data. */ + if (service->clients) { + if (parsed_req->version == 3 && parsed_req->u.v3.auth_len > 0) { + if (rend_check_authorization(service, + (const char*)parsed_req->u.v3.auth_data)) { + log_info(LD_REND, "Authorization data in INTRODUCE2 cell are valid."); + } else { + log_info(LD_REND, "The authorization data that are contained in " + "the INTRODUCE2 cell are invalid. Dropping cell."); + reason = END_CIRC_REASON_CONNECTFAILED; + goto err; + } + } else { + log_info(LD_REND, "INTRODUCE2 cell does not contain authentication " + "data, but we require client authorization. Dropping cell."); + reason = END_CIRC_REASON_CONNECTFAILED; + goto err; + } + } + + /* Try DH handshake... */ + dh = crypto_dh_new(DH_TYPE_REND); + if (!dh || crypto_dh_generate_public(dh)<0) { + log_warn(LD_BUG,"Internal error: couldn't build DH state " + "or generate public key."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh, + (char *)(parsed_req->dh), + DH_KEY_LEN, keys, + DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { + log_warn(LD_BUG, "Internal error: couldn't complete DH handshake"); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + + circ_needs_uptime = rend_service_requires_uptime(service); + + /* help predict this next time */ + rep_hist_note_used_internal(now, circ_needs_uptime, 1); + + /* Launch a circuit to alice's chosen rendezvous point. + */ + for (i=0;ibuild_state); + /* Fill in the circuit's state. */ + launched->rend_data = tor_malloc_zero(sizeof(rend_data_t)); + memcpy(launched->rend_data->rend_pk_digest, + circuit->rend_data->rend_pk_digest, + DIGEST_LEN); + memcpy(launched->rend_data->rend_cookie, parsed_req->rc, REND_COOKIE_LEN); + strlcpy(launched->rend_data->onion_address, service->service_id, + sizeof(launched->rend_data->onion_address)); + + launched->build_state->service_pending_final_cpath_ref = + tor_malloc_zero(sizeof(crypt_path_reference_t)); + launched->build_state->service_pending_final_cpath_ref->refcount = 1; + + launched->build_state->service_pending_final_cpath_ref->cpath = cpath = + tor_malloc_zero(sizeof(crypt_path_t)); + cpath->magic = CRYPT_PATH_MAGIC; + launched->build_state->expiry_time = now + MAX_REND_TIMEOUT; + + cpath->rend_dh_handshake_state = dh; + dh = NULL; + if (circuit_init_cpath_crypto(cpath,keys+DIGEST_LEN,1)<0) + goto err; + memcpy(cpath->rend_circ_nonce, keys, DIGEST_LEN); + + goto done; + + log_error: + if (!err_msg) { + if (stage_descr) { + tor_asprintf(&err_msg, + "unknown %s error for INTRODUCE2", stage_descr); + } else { + err_msg = tor_strdup("unknown error for INTRODUCE2"); + } + } + + log_warn(LD_REND, "%s on circ %u", err_msg, + (unsigned)circuit->base_.n_circ_id); + err: + status = -1; + if (dh) crypto_dh_free(dh); + if (launched) { + circuit_mark_for_close(TO_CIRCUIT(launched), reason); + } + tor_free(err_msg); + + done: + memwipe(keys, 0, sizeof(keys)); + memwipe(buf, 0, sizeof(buf)); + memwipe(serviceid, 0, sizeof(serviceid)); + memwipe(hexcookie, 0, sizeof(hexcookie)); + + /* Free the parsed cell */ + if (parsed_req) { + rend_service_free_intro(parsed_req); + parsed_req = NULL; + } + + /* Free rp if we must */ + if (need_rp_free) extend_info_free(rp); + + return status; +} + +/** Given a parsed and decrypted INTRODUCE2, find the rendezvous point or + * return NULL and an error string if we can't. + */ + +static extend_info_t * +find_rp_for_intro(const rend_intro_cell_t *intro, + uint8_t *need_free_out, char **err_msg_out) +{ + extend_info_t *rp = NULL; + char *err_msg = NULL; + const char *rp_nickname = NULL; + const node_t *node = NULL; + uint8_t need_free = 0; + + if (!intro || !need_free_out) { + if (err_msg_out) + err_msg = tor_strdup("Bad parameters to find_rp_for_intro()"); + + goto err; + } + + if (intro->version == 0 || intro->version == 1) { + if (intro->version == 1) rp_nickname = (const char *)(intro->u.v1.rp); + else rp_nickname = (const char *)(intro->u.v0.rp); + + node = node_get_by_nickname(rp_nickname, 0); + if (!node) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "Couldn't find router %s named in INTRODUCE2 cell", + escaped_safe_str_client(rp_nickname)); + } + + goto err; + } + + rp = extend_info_from_node(node, 0); + if (!rp) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "Could build extend_info_t for router %s named " + "in INTRODUCE2 cell", + escaped_safe_str_client(rp_nickname)); + } + + goto err; + } else { + need_free = 1; + } + } else if (intro->version == 2) { + rp = intro->u.v2.extend_info; + } else if (intro->version == 3) { + rp = intro->u.v3.extend_info; + } else { + if (err_msg_out) { + tor_asprintf(&err_msg, + "Unknown version %d in INTRODUCE2 cell", + (int)(intro->version)); + } + + goto err; + } + + goto done; + + err: + if (err_msg_out) *err_msg_out = err_msg; + else tor_free(err_msg); + + done: + if (rp && need_free_out) *need_free_out = need_free; + + return rp; +} + +/** Remove unnecessary parts from a rend_intro_cell_t - the ciphertext if + * already decrypted, the plaintext too if already parsed + */ + +void +rend_service_compact_intro(rend_intro_cell_t *request) +{ + if (!request) return; + + if ((request->plaintext && request->plaintext_len > 0) || + request->parsed) { + tor_free(request->ciphertext); + request->ciphertext_len = 0; + } + + if (request->parsed) { + tor_free(request->plaintext); + request->plaintext_len = 0; + } +} + +/** Free a parsed INTRODUCE1 or INTRODUCE2 cell that was allocated by + * rend_service_parse_intro(). + */ +void +rend_service_free_intro(rend_intro_cell_t *request) +{ + if (!request) { + log_info(LD_BUG, "rend_service_free_intro() called with NULL request!"); + return; + } + + /* Free ciphertext */ + tor_free(request->ciphertext); + request->ciphertext_len = 0; + + /* Have plaintext? */ + if (request->plaintext) { + /* Zero it out just to be safe */ + memwipe(request->plaintext, 0, request->plaintext_len); + tor_free(request->plaintext); + request->plaintext_len = 0; + } + + /* Have parsed plaintext? */ + if (request->parsed) { + switch (request->version) { + case 0: + case 1: + /* + * Nothing more to do; these formats have no further pointers + * in them. + */ + break; + case 2: + extend_info_free(request->u.v2.extend_info); + request->u.v2.extend_info = NULL; + break; + case 3: + if (request->u.v3.auth_data) { + memwipe(request->u.v3.auth_data, 0, request->u.v3.auth_len); + tor_free(request->u.v3.auth_data); + } + + extend_info_free(request->u.v3.extend_info); + request->u.v3.extend_info = NULL; + break; + default: + log_info(LD_BUG, + "rend_service_free_intro() saw unknown protocol " + "version %d.", + request->version); + } + } + + /* Zero it out to make sure sensitive stuff doesn't hang around in memory */ + memwipe(request, 0, sizeof(*request)); + + tor_free(request); +} + +/** Parse an INTRODUCE1 or INTRODUCE2 cell into a newly allocated + * rend_intro_cell_t structure. Free it with rend_service_free_intro() + * when finished. The type parameter should be 1 or 2 to indicate whether + * this is INTRODUCE1 or INTRODUCE2. This parses only the non-encrypted + * parts; after this, call rend_service_decrypt_intro() with a key, then + * rend_service_parse_intro_plaintext() to finish parsing. The optional + * err_msg_out parameter is set to a string suitable for log output + * if parsing fails. This function does some validation, but only + * that which depends solely on the contents of the cell and the + * key; it can be unit-tested. Further validation is done in + * rend_service_validate_intro(). + */ + +rend_intro_cell_t * +rend_service_begin_parse_intro(const uint8_t *request, + size_t request_len, + uint8_t type, + char **err_msg_out) +{ + rend_intro_cell_t *rv = NULL; + char *err_msg = NULL; + + if (!request || request_len <= 0) goto err; + if (!(type == 1 || type == 2)) goto err; + + /* First, check that the cell is long enough to be a sensible INTRODUCE */ + + /* min key length plus digest length plus nickname length */ + if (request_len < + (DIGEST_LEN + REND_COOKIE_LEN + (MAX_NICKNAME_LEN + 1) + + DH_KEY_LEN + 42)) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "got a truncated INTRODUCE%d cell", + (int)type); + } + goto err; + } + + /* Allocate a new parsed cell structure */ + rv = tor_malloc_zero(sizeof(*rv)); + + /* Set the type */ + rv->type = type; + + /* Copy in the ID */ + memcpy(rv->pk, request, DIGEST_LEN); + + /* Copy in the ciphertext */ + rv->ciphertext = tor_malloc(request_len - DIGEST_LEN); + memcpy(rv->ciphertext, request + DIGEST_LEN, request_len - DIGEST_LEN); + rv->ciphertext_len = request_len - DIGEST_LEN; + + goto done; + + err: + if (rv) rend_service_free_intro(rv); + rv = NULL; + if (err_msg_out && !err_msg) { + tor_asprintf(&err_msg, + "unknown INTRODUCE%d error", + (int)type); + } + + done: + if (err_msg_out) *err_msg_out = err_msg; + else tor_free(err_msg); + + return rv; +} + +/** Parse the version-specific parts of a v0 or v1 INTRODUCE1 or INTRODUCE2 + * cell + */ + +static ssize_t +rend_service_parse_intro_for_v0_or_v1( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out) +{ + const char *rp_nickname, *endptr; + size_t nickname_field_len, ver_specific_len; + + if (intro->version == 1) { + ver_specific_len = MAX_HEX_NICKNAME_LEN + 2; + rp_nickname = ((const char *)buf) + 1; + nickname_field_len = MAX_HEX_NICKNAME_LEN + 1; + } else if (intro->version == 0) { + ver_specific_len = MAX_NICKNAME_LEN + 1; + rp_nickname = (const char *)buf; + nickname_field_len = MAX_NICKNAME_LEN + 1; + } else { + if (err_msg_out) + tor_asprintf(err_msg_out, + "rend_service_parse_intro_for_v0_or_v1() called with " + "bad version %d on INTRODUCE%d cell (this is a bug)", + intro->version, + (int)(intro->type)); + goto err; + } + + if (plaintext_len < ver_specific_len) { + if (err_msg_out) + tor_asprintf(err_msg_out, + "short plaintext of encrypted part in v1 INTRODUCE%d " + "cell (%lu bytes, needed %lu)", + (int)(intro->type), + (unsigned long)plaintext_len, + (unsigned long)ver_specific_len); + goto err; + } + + endptr = memchr(rp_nickname, 0, nickname_field_len); + if (!endptr || endptr == rp_nickname) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "couldn't find a nul-padded nickname in " + "INTRODUCE%d cell", + (int)(intro->type)); + } + goto err; + } + + if ((intro->version == 0 && + !is_legal_nickname(rp_nickname)) || + (intro->version == 1 && + !is_legal_nickname_or_hexdigest(rp_nickname))) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "bad nickname in INTRODUCE%d cell", + (int)(intro->type)); + } + goto err; + } + + if (intro->version == 1) { + memcpy(intro->u.v1.rp, rp_nickname, endptr - rp_nickname + 1); + } else { + memcpy(intro->u.v0.rp, rp_nickname, endptr - rp_nickname + 1); + } + + return ver_specific_len; + + err: + return -1; +} + +/** Parse the version-specific parts of a v2 INTRODUCE1 or INTRODUCE2 cell + */ + +static ssize_t +rend_service_parse_intro_for_v2( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out) +{ + unsigned int klen; + extend_info_t *extend_info = NULL; + ssize_t ver_specific_len; + + /* + * We accept version 3 too so that the v3 parser can call this with + * and adjusted buffer for the latter part of a v3 cell, which is + * identical to a v2 cell. + */ + if (!(intro->version == 2 || + intro->version == 3)) { + if (err_msg_out) + tor_asprintf(err_msg_out, + "rend_service_parse_intro_for_v2() called with " + "bad version %d on INTRODUCE%d cell (this is a bug)", + intro->version, + (int)(intro->type)); + goto err; + } + + /* 7 == version, IP and port, DIGEST_LEN == id, 2 == key length */ + if (plaintext_len < 7 + DIGEST_LEN + 2) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "truncated plaintext of encrypted parted of " + "version %d INTRODUCE%d cell", + intro->version, + (int)(intro->type)); + } + + goto err; + } + + extend_info = tor_malloc_zero(sizeof(extend_info_t)); + tor_addr_from_ipv4n(&extend_info->addr, get_uint32(buf + 1)); + extend_info->port = ntohs(get_uint16(buf + 5)); + memcpy(extend_info->identity_digest, buf + 7, DIGEST_LEN); + extend_info->nickname[0] = '$'; + base16_encode(extend_info->nickname + 1, sizeof(extend_info->nickname) - 1, + extend_info->identity_digest, DIGEST_LEN); + klen = ntohs(get_uint16(buf + 7 + DIGEST_LEN)); + + /* 7 == version, IP and port, DIGEST_LEN == id, 2 == key length */ + if (plaintext_len < 7 + DIGEST_LEN + 2 + klen) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "truncated plaintext of encrypted parted of " + "version %d INTRODUCE%d cell", + intro->version, + (int)(intro->type)); + } + + goto err; + } + + extend_info->onion_key = + crypto_pk_asn1_decode((const char *)(buf + 7 + DIGEST_LEN + 2), klen); + if (!extend_info->onion_key) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "error decoding onion key in version %d " + "INTRODUCE%d cell", + intro->version, + (intro->type)); + } + + goto err; + } + + ver_specific_len = 7+DIGEST_LEN+2+klen; + + if (intro->version == 2) intro->u.v2.extend_info = extend_info; + else intro->u.v3.extend_info = extend_info; + + return ver_specific_len; + + err: + extend_info_free(extend_info); + + return -1; +} + +/** Parse the version-specific parts of a v3 INTRODUCE1 or INTRODUCE2 cell + */ + +static ssize_t +rend_service_parse_intro_for_v3( + rend_intro_cell_t *intro, + const uint8_t *buf, + size_t plaintext_len, + char **err_msg_out) +{ + ssize_t adjust, v2_ver_specific_len, ts_offset; + + /* This should only be called on v3 cells */ + if (intro->version != 3) { + if (err_msg_out) + tor_asprintf(err_msg_out, + "rend_service_parse_intro_for_v3() called with " + "bad version %d on INTRODUCE%d cell (this is a bug)", + intro->version, + (int)(intro->type)); + goto err; + } + + /* + * Check that we have at least enough to get auth_len: + * + * 1 octet for version, 1 for auth_type, 2 for auth_len + */ + if (plaintext_len < 4) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "truncated plaintext of encrypted parted of " + "version %d INTRODUCE%d cell", + intro->version, + (int)(intro->type)); + } + + goto err; + } + + /* + * The rend_client_send_introduction() function over in rendclient.c is + * broken (i.e., fails to match the spec) in such a way that we can't + * change it without breaking the protocol. Specifically, it doesn't + * emit auth_len when auth-type is REND_NO_AUTH, so everything is off + * by two bytes after that. Calculate ts_offset and do everything from + * the timestamp on relative to that to handle this dain bramage. + */ + + intro->u.v3.auth_type = buf[1]; + if (intro->u.v3.auth_type != REND_NO_AUTH) { + intro->u.v3.auth_len = ntohs(get_uint16(buf + 2)); + ts_offset = 4 + intro->u.v3.auth_len; + } else { + intro->u.v3.auth_len = 0; + ts_offset = 2; + } + + /* Check that auth len makes sense for this auth type */ + if (intro->u.v3.auth_type == REND_BASIC_AUTH || + intro->u.v3.auth_type == REND_STEALTH_AUTH) { + if (intro->u.v3.auth_len != REND_DESC_COOKIE_LEN) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "wrong auth data size %d for INTRODUCE%d cell, " + "should be %d", + (int)(intro->u.v3.auth_len), + (int)(intro->type), + REND_DESC_COOKIE_LEN); + } + + goto err; + } + } + + /* Check that we actually have everything up through the timestamp */ + if (plaintext_len < (size_t)(ts_offset)+4) { + if (err_msg_out) { + tor_asprintf(err_msg_out, + "truncated plaintext of encrypted parted of " + "version %d INTRODUCE%d cell", + intro->version, + (int)(intro->type)); + } + + goto err; + } + + if (intro->u.v3.auth_type != REND_NO_AUTH && + intro->u.v3.auth_len > 0) { + /* Okay, we can go ahead and copy auth_data */ + intro->u.v3.auth_data = tor_malloc(intro->u.v3.auth_len); + /* + * We know we had an auth_len field in this case, so 4 is + * always right. + */ + memcpy(intro->u.v3.auth_data, buf + 4, intro->u.v3.auth_len); + } + + /* + * From here on, the format is as in v2, so we call the v2 parser with + * adjusted buffer and length. We are 4 + ts_offset octets in, but the + * v2 parser expects to skip over a version byte at the start, so we + * adjust by 3 + ts_offset. + */ + adjust = 3 + ts_offset; + + v2_ver_specific_len = + rend_service_parse_intro_for_v2(intro, + buf + adjust, plaintext_len - adjust, + err_msg_out); + + /* Success in v2 parser */ + if (v2_ver_specific_len >= 0) return v2_ver_specific_len + adjust; + /* Failure in v2 parser; it will have provided an err_msg */ + else return v2_ver_specific_len; + + err: + return -1; +} + +/** Table of parser functions for version-specific parts of an INTRODUCE2 + * cell. + */ + +static ssize_t + (*intro_version_handlers[])( + rend_intro_cell_t *, + const uint8_t *, + size_t, + char **) = +{ rend_service_parse_intro_for_v0_or_v1, + rend_service_parse_intro_for_v0_or_v1, + rend_service_parse_intro_for_v2, + rend_service_parse_intro_for_v3 }; + +/** Decrypt the encrypted part of an INTRODUCE1 or INTRODUCE2 cell, + * return 0 if successful, or < 0 and write an error message to + * *err_msg_out if provided. + */ + +int +rend_service_decrypt_intro( + rend_intro_cell_t *intro, + crypto_pk_t *key, + char **err_msg_out) +{ + char *err_msg = NULL; + uint8_t key_digest[DIGEST_LEN]; + char service_id[REND_SERVICE_ID_LEN_BASE32+1]; + ssize_t key_len; + uint8_t buf[RELAY_PAYLOAD_SIZE]; + int result, status = 0; + + if (!intro || !key) { + if (err_msg_out) { + err_msg = + tor_strdup("rend_service_decrypt_intro() called with bad " + "parameters"); + } + + status = -2; + goto err; + } + + /* Make sure we have ciphertext */ + if (!(intro->ciphertext) || intro->ciphertext_len <= 0) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "rend_intro_cell_t was missing ciphertext for " + "INTRODUCE%d cell", + (int)(intro->type)); + } + status = -3; + goto err; + } + + /* Check that this cell actually matches this service key */ + + /* first DIGEST_LEN bytes of request is intro or service pk digest */ + crypto_pk_get_digest(key, (char *)key_digest); + if (tor_memneq(key_digest, intro->pk, DIGEST_LEN)) { + if (err_msg_out) { + base32_encode(service_id, REND_SERVICE_ID_LEN_BASE32 + 1, + (char*)(intro->pk), REND_SERVICE_ID_LEN); + tor_asprintf(&err_msg, + "got an INTRODUCE%d cell for the wrong service (%s)", + (int)(intro->type), + escaped(service_id)); + } + + status = -4; + goto err; + } + + /* Make sure the encrypted part is long enough to decrypt */ + + key_len = crypto_pk_keysize(key); + if (intro->ciphertext_len < key_len) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "got an INTRODUCE%d cell with a truncated PK-encrypted " + "part", + (int)(intro->type)); + } + + status = -5; + goto err; + } + + /* Decrypt the encrypted part */ + + note_crypto_pk_op(REND_SERVER); + result = + crypto_pk_private_hybrid_decrypt( + key, (char *)buf, sizeof(buf), + (const char *)(intro->ciphertext), intro->ciphertext_len, + PK_PKCS1_OAEP_PADDING, 1); + if (result < 0) { + if (err_msg_out) { + tor_asprintf(&err_msg, + "couldn't decrypt INTRODUCE%d cell", + (int)(intro->type)); + } + status = -6; + goto err; + } + intro->plaintext_len = result; + intro->plaintext = tor_malloc(intro->plaintext_len); + memcpy(intro->plaintext, buf, intro->plaintext_len); + + goto done; + + err: + if (err_msg_out && !err_msg) { + tor_asprintf(&err_msg, + "unknown INTRODUCE%d error decrypting encrypted part", + (int)(intro->type)); + } + if (status >= 0) status = -1; + + done: + if (err_msg_out) *err_msg_out = err_msg; + else tor_free(err_msg); + + /* clean up potentially sensitive material */ + memwipe(buf, 0, sizeof(buf)); + memwipe(key_digest, 0, sizeof(key_digest)); + memwipe(service_id, 0, sizeof(service_id)); + + return status; +} + +/** Parse the plaintext of the encrypted part of an INTRODUCE1 or + * INTRODUCE2 cell, return 0 if successful, or < 0 and write an error + * message to *err_msg_out if provided. + */ + +int +rend_service_parse_intro_plaintext( + rend_intro_cell_t *intro, + char **err_msg_out) +{ + char *err_msg = NULL; + ssize_t ver_specific_len, ver_invariant_len; + uint8_t version; + int status = 0; + + if (!intro) { + if (err_msg_out) { + err_msg = + tor_strdup("rend_service_parse_intro_plaintext() called with NULL " + "rend_intro_cell_t"); + } + + status = -2; + goto err; + } + + /* Check that we have plaintext */ + if (!(intro->plaintext) || intro->plaintext_len <= 0) { + if (err_msg_out) { + err_msg = tor_strdup("rend_intro_cell_t was missing plaintext"); + } + status = -3; + goto err; + } + + /* In all formats except v0, the first byte is a version number */ + version = intro->plaintext[0]; + + /* v0 has no version byte (stupid...), so handle it as a fallback */ + if (version > 3) version = 0; + + /* Copy the version into the parsed cell structure */ + intro->version = version; + + /* Call the version-specific parser from the table */ + ver_specific_len = + intro_version_handlers[version](intro, + intro->plaintext, intro->plaintext_len, + &err_msg); + if (ver_specific_len < 0) { + status = -4; + goto err; + } + + /** The rendezvous cookie and Diffie-Hellman stuff are version-invariant + * and at the end of the plaintext of the encrypted part of the cell. + */ + + ver_invariant_len = intro->plaintext_len - ver_specific_len; + if (ver_invariant_len < REND_COOKIE_LEN + DH_KEY_LEN) { + tor_asprintf(&err_msg, + "decrypted plaintext of INTRODUCE%d cell was truncated (%ld bytes)", + (int)(intro->type), + (long)(intro->plaintext_len)); + status = -5; + goto err; + } else if (ver_invariant_len > REND_COOKIE_LEN + DH_KEY_LEN) { + tor_asprintf(&err_msg, + "decrypted plaintext of INTRODUCE%d cell was too long (%ld bytes)", + (int)(intro->type), + (long)(intro->plaintext_len)); + status = -6; + } else { + memcpy(intro->rc, + intro->plaintext + ver_specific_len, + REND_COOKIE_LEN); + memcpy(intro->dh, + intro->plaintext + ver_specific_len + REND_COOKIE_LEN, + DH_KEY_LEN); + } + + /* Flag it as being fully parsed */ + intro->parsed = 1; + + goto done; + + err: + if (err_msg_out && !err_msg) { + tor_asprintf(&err_msg, + "unknown INTRODUCE%d error parsing encrypted part", + (int)(intro->type)); + } + if (status >= 0) status = -1; + + done: + if (err_msg_out) *err_msg_out = err_msg; + else tor_free(err_msg); + + return status; +} + +/** Do validity checks on a parsed intro cell before decryption; some of + * these are not done in rend_service_begin_parse_intro() itself because + * they depend on a lot of other state and would make it hard to unit test. + * Returns >= 0 if successful or < 0 if the intro cell is invalid, and + * optionally writes out an error message for logging. If an err_msg + * pointer is provided, it is the caller's responsibility to free any + * provided message. + */ + +int +rend_service_validate_intro_early(const rend_intro_cell_t *intro, + char **err_msg_out) +{ + int status = 0; + + if (!intro) { + if (err_msg_out) + *err_msg_out = + tor_strdup("NULL intro cell passed to " + "rend_service_validate_intro_early()"); + + status = -1; + goto err; + } + + /* TODO */ + + err: + return status; +} + +/** Do validity checks on a parsed intro cell after decryption; some of + * these are not done in rend_service_parse_intro_plaintext() itself because + * they depend on a lot of other state and would make it hard to unit test. + * Returns >= 0 if successful or < 0 if the intro cell is invalid, and + * optionally writes out an error message for logging. If an err_msg + * pointer is provided, it is the caller's responsibility to free any + * provided message. + */ + +int +rend_service_validate_intro_late(const rend_intro_cell_t *intro, + char **err_msg_out) +{ + int status = 0; + + if (!intro) { + if (err_msg_out) + *err_msg_out = + tor_strdup("NULL intro cell passed to " + "rend_service_validate_intro_late()"); + + status = -1; + goto err; + } + + if (intro->version == 3 && intro->parsed) { + if (!(intro->u.v3.auth_type == REND_NO_AUTH || + intro->u.v3.auth_type == REND_BASIC_AUTH || + intro->u.v3.auth_type == REND_STEALTH_AUTH)) { + /* This is an informative message, not an error, as in the old code */ + if (err_msg_out) + tor_asprintf(err_msg_out, + "unknown authorization type %d", + intro->u.v3.auth_type); + } + } + + err: + return status; +} + +/** Called when we fail building a rendezvous circuit at some point other + * than the last hop: launches a new circuit to the same rendezvous point. + */ +void +rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc) +{ + origin_circuit_t *newcirc; + cpath_build_state_t *newstate, *oldstate; + + tor_assert(oldcirc->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); + + /* Don't relaunch the same rend circ twice. */ + if (oldcirc->hs_service_side_rend_circ_has_been_relaunched) { + log_info(LD_REND, "Rendezvous circuit to %s has already been relaunched; " + "not relaunching it again.", + oldcirc->build_state ? + safe_str(extend_info_describe(oldcirc->build_state->chosen_exit)) + : "*unknown*"); + return; + } + oldcirc->hs_service_side_rend_circ_has_been_relaunched = 1; + + if (!oldcirc->build_state || + oldcirc->build_state->failure_count > MAX_REND_FAILURES || + oldcirc->build_state->expiry_time < time(NULL)) { + log_info(LD_REND, + "Attempt to build circuit to %s for rendezvous has failed " + "too many times or expired; giving up.", + oldcirc->build_state ? + safe_str(extend_info_describe(oldcirc->build_state->chosen_exit)) + : "*unknown*"); + return; + } + + oldstate = oldcirc->build_state; + tor_assert(oldstate); + + if (oldstate->service_pending_final_cpath_ref == NULL) { + log_info(LD_REND,"Skipping relaunch of circ that failed on its first hop. " + "Initiator will retry."); + return; + } + + log_info(LD_REND,"Reattempting rendezvous circuit to '%s'", + safe_str(extend_info_describe(oldstate->chosen_exit))); + + newcirc = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, + oldstate->chosen_exit, + CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); + + if (!newcirc) { + log_warn(LD_REND,"Couldn't relaunch rendezvous circuit to '%s'.", + safe_str(extend_info_describe(oldstate->chosen_exit))); + return; + } + newstate = newcirc->build_state; + tor_assert(newstate); + newstate->failure_count = oldstate->failure_count+1; + newstate->expiry_time = oldstate->expiry_time; + newstate->service_pending_final_cpath_ref = + oldstate->service_pending_final_cpath_ref; + ++(newstate->service_pending_final_cpath_ref->refcount); + + newcirc->rend_data = rend_data_dup(oldcirc->rend_data); +} + +/** Launch a circuit to serve as an introduction point for the service + * service at the introduction point nickname + */ +static int +rend_service_launch_establish_intro(rend_service_t *service, + rend_intro_point_t *intro) +{ + origin_circuit_t *launched; + + log_info(LD_REND, + "Launching circuit to introduction point %s for service %s", + safe_str_client(extend_info_describe(intro->extend_info)), + service->service_id); + + rep_hist_note_used_internal(time(NULL), 1, 0); + + ++service->n_intro_circuits_launched; + launched = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, + intro->extend_info, + CIRCLAUNCH_NEED_UPTIME|CIRCLAUNCH_IS_INTERNAL); + + if (!launched) { + log_info(LD_REND, + "Can't launch circuit to establish introduction at %s.", + safe_str_client(extend_info_describe(intro->extend_info))); + return -1; + } + + if (tor_memneq(intro->extend_info->identity_digest, + launched->build_state->chosen_exit->identity_digest, DIGEST_LEN)) { + char cann[HEX_DIGEST_LEN+1], orig[HEX_DIGEST_LEN+1]; + base16_encode(cann, sizeof(cann), + launched->build_state->chosen_exit->identity_digest, + DIGEST_LEN); + base16_encode(orig, sizeof(orig), + intro->extend_info->identity_digest, DIGEST_LEN); + log_info(LD_REND, "The intro circuit we just cannibalized ends at $%s, " + "but we requested an intro circuit to $%s. Updating " + "our service.", cann, orig); + extend_info_free(intro->extend_info); + intro->extend_info = extend_info_dup(launched->build_state->chosen_exit); + } + + launched->rend_data = tor_malloc_zero(sizeof(rend_data_t)); + strlcpy(launched->rend_data->onion_address, service->service_id, + sizeof(launched->rend_data->onion_address)); + memcpy(launched->rend_data->rend_pk_digest, service->pk_digest, DIGEST_LEN); + launched->intro_key = crypto_pk_dup_key(intro->intro_key); + if (launched->base_.state == CIRCUIT_STATE_OPEN) + rend_service_intro_has_opened(launched); + return 0; +} + +/** Return the number of introduction points that are or have been + * established for the given service address in query. */ +static int +count_established_intro_points(const char *query) +{ + int num_ipos = 0; + circuit_t *circ; + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { + if (!circ->marked_for_close && + circ->state == CIRCUIT_STATE_OPEN && + (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || + circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { + origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); + if (oc->rend_data && + !rend_cmp_service_ids(query, oc->rend_data->onion_address)) + num_ipos++; + } + } + return num_ipos; +} + +/** Called when we're done building a circuit to an introduction point: + * sends a RELAY_ESTABLISH_INTRO cell. + */ +void +rend_service_intro_has_opened(origin_circuit_t *circuit) +{ + rend_service_t *service; + size_t len; + int r; + char buf[RELAY_PAYLOAD_SIZE]; + char auth[DIGEST_LEN + 9]; + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + int reason = END_CIRC_REASON_TORPROTOCOL; + crypto_pk_t *intro_key; + + tor_assert(circuit->base_.purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(circuit->build_state->onehop_tunnel)); +#endif + tor_assert(circuit->cpath); + tor_assert(circuit->rend_data); + + base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); + if (!service) { + log_warn(LD_REND, "Unrecognized service ID %s on introduction circuit %u.", + serviceid, (unsigned)circuit->base_.n_circ_id); + reason = END_CIRC_REASON_NOSUCHSERVICE; + goto err; + } + + /* If we already have enough introduction circuits for this service, + * redefine this one as a general circuit or close it, depending. */ + if (count_established_intro_points(serviceid) > + (int)service->n_intro_points_wanted) { /* XXX023 remove cast */ + const or_options_t *options = get_options(); + if (options->ExcludeNodes) { + /* XXXX in some future version, we can test whether the transition is + allowed or not given the actual nodes in the circuit. But for now, + this case, we might as well close the thing. */ + log_info(LD_CIRC|LD_REND, "We have just finished an introduction " + "circuit, but we already have enough. Closing it."); + reason = END_CIRC_REASON_NONE; + goto err; + } else { + tor_assert(circuit->build_state->is_internal); + log_info(LD_CIRC|LD_REND, "We have just finished an introduction " + "circuit, but we already have enough. Redefining purpose to " + "general; leaving as internal."); + + circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_C_GENERAL); + + { + rend_data_t *rend_data = circuit->rend_data; + circuit->rend_data = NULL; + rend_data_free(rend_data); + } + { + crypto_pk_t *intro_key = circuit->intro_key; + circuit->intro_key = NULL; + crypto_pk_free(intro_key); + } + + circuit_has_opened(circuit); + goto done; + } + } + + log_info(LD_REND, + "Established circuit %u as introduction point for service %s", + (unsigned)circuit->base_.n_circ_id, serviceid); + + /* Use the intro key instead of the service key in ESTABLISH_INTRO. */ + intro_key = circuit->intro_key; + /* Build the payload for a RELAY_ESTABLISH_INTRO cell. */ + r = crypto_pk_asn1_encode(intro_key, buf+2, + RELAY_PAYLOAD_SIZE-2); + if (r < 0) { + log_warn(LD_BUG, "Internal error; failed to establish intro point."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + len = r; + set_uint16(buf, htons((uint16_t)len)); + len += 2; + memcpy(auth, circuit->cpath->prev->rend_circ_nonce, DIGEST_LEN); + memcpy(auth+DIGEST_LEN, "INTRODUCE", 9); + if (crypto_digest(buf+len, auth, DIGEST_LEN+9)) + goto err; + len += 20; + note_crypto_pk_op(REND_SERVER); + r = crypto_pk_private_sign_digest(intro_key, buf+len, sizeof(buf)-len, + buf, len); + if (r<0) { + log_warn(LD_BUG, "Internal error: couldn't sign introduction request."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + len += r; + + if (relay_send_command_from_edge(0, TO_CIRCUIT(circuit), + RELAY_COMMAND_ESTABLISH_INTRO, + buf, len, circuit->cpath->prev)<0) { + log_info(LD_GENERAL, + "Couldn't send introduction request for service %s on circuit %u", + serviceid, (unsigned)circuit->base_.n_circ_id); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + + /* We've attempted to use this circuit */ + pathbias_count_use_attempt(circuit); + + goto done; + + err: + circuit_mark_for_close(TO_CIRCUIT(circuit), reason); + done: + memwipe(buf, 0, sizeof(buf)); + memwipe(auth, 0, sizeof(auth)); + memwipe(serviceid, 0, sizeof(serviceid)); + + return; +} + +/** Called when we get an INTRO_ESTABLISHED cell; mark the circuit as a + * live introduction point, and note that the service descriptor is + * now out-of-date. */ +int +rend_service_intro_established(origin_circuit_t *circuit, + const uint8_t *request, + size_t request_len) +{ + rend_service_t *service; + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + (void) request; + (void) request_len; + + if (circuit->base_.purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) { + log_warn(LD_PROTOCOL, + "received INTRO_ESTABLISHED cell on non-intro circuit."); + goto err; + } + tor_assert(circuit->rend_data); + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); + if (!service) { + log_warn(LD_REND, "Unknown service on introduction circuit %u.", + (unsigned)circuit->base_.n_circ_id); + goto err; + } + service->desc_is_dirty = time(NULL); + circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_S_INTRO); + + base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32 + 1, + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + log_info(LD_REND, + "Received INTRO_ESTABLISHED cell on circuit %u for service %s", + (unsigned)circuit->base_.n_circ_id, serviceid); + + /* Getting a valid INTRODUCE_ESTABLISHED means we've successfully + * used the circ */ + pathbias_mark_use_success(circuit); + + return 0; + err: + circuit_mark_for_close(TO_CIRCUIT(circuit), END_CIRC_REASON_TORPROTOCOL); + return -1; +} + +/** Called once a circuit to a rendezvous point is established: sends a + * RELAY_COMMAND_RENDEZVOUS1 cell. + */ +void +rend_service_rendezvous_has_opened(origin_circuit_t *circuit) +{ + rend_service_t *service; + char buf[RELAY_PAYLOAD_SIZE]; + crypt_path_t *hop; + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + char hexcookie[9]; + int reason; + + tor_assert(circuit->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); + tor_assert(circuit->cpath); + tor_assert(circuit->build_state); +#ifndef NON_ANONYMOUS_MODE_ENABLED + tor_assert(!(circuit->build_state->onehop_tunnel)); +#endif + tor_assert(circuit->rend_data); + + /* Declare the circuit dirty to avoid reuse, and for path-bias */ + if (!circuit->base_.timestamp_dirty) + circuit->base_.timestamp_dirty = time(NULL); + + /* This may be redundant */ + pathbias_count_use_attempt(circuit); + + hop = circuit->build_state->service_pending_final_cpath_ref->cpath; + + base16_encode(hexcookie,9,circuit->rend_data->rend_cookie,4); + base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, + circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + + log_info(LD_REND, + "Done building circuit %u to rendezvous with " + "cookie %s for service %s", + (unsigned)circuit->base_.n_circ_id, hexcookie, serviceid); + + /* Clear the 'in-progress HS circ has timed out' flag for + * consistency with what happens on the client side; this line has + * no effect on Tor's behaviour. */ + circuit->hs_circ_has_timed_out = 0; + + /* If hop is NULL, another rend circ has already connected to this + * rend point. Close this circ. */ + if (hop == NULL) { + log_info(LD_REND, "Another rend circ has already reached this rend point; " + "closing this rend circ."); + reason = END_CIRC_REASON_NONE; + goto err; + } + + /* Remove our final cpath element from the reference, so that no + * other circuit will try to use it. Store it in + * pending_final_cpath for now to ensure that it will be freed if + * our rendezvous attempt fails. */ + circuit->build_state->pending_final_cpath = hop; + circuit->build_state->service_pending_final_cpath_ref->cpath = NULL; + + service = rend_service_get_by_pk_digest( + circuit->rend_data->rend_pk_digest); + if (!service) { + log_warn(LD_GENERAL, "Internal error: unrecognized service ID on " + "rendezvous circuit."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + + /* All we need to do is send a RELAY_RENDEZVOUS1 cell... */ + memcpy(buf, circuit->rend_data->rend_cookie, REND_COOKIE_LEN); + if (crypto_dh_get_public(hop->rend_dh_handshake_state, + buf+REND_COOKIE_LEN, DH_KEY_LEN)<0) { + log_warn(LD_GENERAL,"Couldn't get DH public key."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + memcpy(buf+REND_COOKIE_LEN+DH_KEY_LEN, hop->rend_circ_nonce, + DIGEST_LEN); + + /* Send the cell */ + if (relay_send_command_from_edge(0, TO_CIRCUIT(circuit), + RELAY_COMMAND_RENDEZVOUS1, + buf, REND_COOKIE_LEN+DH_KEY_LEN+DIGEST_LEN, + circuit->cpath->prev)<0) { + log_warn(LD_GENERAL, "Couldn't send RENDEZVOUS1 cell."); + reason = END_CIRC_REASON_INTERNAL; + goto err; + } + + crypto_dh_free(hop->rend_dh_handshake_state); + hop->rend_dh_handshake_state = NULL; + + /* Append the cpath entry. */ + hop->state = CPATH_STATE_OPEN; + /* set the windows to default. these are the windows + * that bob thinks alice has. + */ + hop->package_window = circuit_initial_package_window(); + hop->deliver_window = CIRCWINDOW_START; + + onion_append_to_cpath(&circuit->cpath, hop); + circuit->build_state->pending_final_cpath = NULL; /* prevent double-free */ + + /* Change the circuit purpose. */ + circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_S_REND_JOINED); + + goto done; + + err: + circuit_mark_for_close(TO_CIRCUIT(circuit), reason); + done: + memwipe(buf, 0, sizeof(buf)); + memwipe(serviceid, 0, sizeof(serviceid)); + memwipe(hexcookie, 0, sizeof(hexcookie)); + + return; +} + +/* + * Manage introduction points + */ + +/** Return the (possibly non-open) introduction circuit ending at + * intro for the service whose public key is pk_digest. + * (desc_version is ignored). Return NULL if no such service is + * found. + */ +static origin_circuit_t * +find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest) +{ + origin_circuit_t *circ = NULL; + + tor_assert(intro); + while ((circ = circuit_get_next_by_pk_and_purpose(circ,pk_digest, + CIRCUIT_PURPOSE_S_INTRO))) { + if (tor_memeq(circ->build_state->chosen_exit->identity_digest, + intro->extend_info->identity_digest, DIGEST_LEN) && + circ->rend_data) { + return circ; + } + } + + circ = NULL; + while ((circ = circuit_get_next_by_pk_and_purpose(circ,pk_digest, + CIRCUIT_PURPOSE_S_ESTABLISH_INTRO))) { + if (tor_memeq(circ->build_state->chosen_exit->identity_digest, + intro->extend_info->identity_digest, DIGEST_LEN) && + circ->rend_data) { + return circ; + } + } + return NULL; +} + +/** Return a pointer to the rend_intro_point_t corresponding to the + * service-side introduction circuit circ. */ +static rend_intro_point_t * +find_intro_point(origin_circuit_t *circ) +{ + const char *serviceid; + rend_service_t *service = NULL; + + tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || + TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO); + tor_assert(circ->rend_data); + serviceid = circ->rend_data->onion_address; + + SMARTLIST_FOREACH(rend_service_list, rend_service_t *, s, + if (tor_memeq(s->service_id, serviceid, REND_SERVICE_ID_LEN_BASE32)) { + service = s; + break; + }); + + if (service == NULL) return NULL; + + SMARTLIST_FOREACH(service->intro_nodes, rend_intro_point_t *, intro_point, + if (crypto_pk_eq_keys(intro_point->intro_key, circ->intro_key)) { + return intro_point; + }); + + return NULL; +} + +/** Determine the responsible hidden service directories for the + * rend_encoded_v2_service_descriptor_t's in descs and upload them; + * service_id and seconds_valid are only passed for logging + * purposes. */ +static void +directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, + smartlist_t *descs, const char *service_id, + int seconds_valid) +{ + int i, j, failed_upload = 0; + smartlist_t *responsible_dirs = smartlist_new(); + smartlist_t *successful_uploads = smartlist_new(); + routerstatus_t *hs_dir; + for (i = 0; i < smartlist_len(descs); i++) { + rend_encoded_v2_service_descriptor_t *desc = smartlist_get(descs, i); + /* Determine responsible dirs. */ + if (hid_serv_get_responsible_directories(responsible_dirs, + desc->desc_id) < 0) { + log_warn(LD_REND, "Could not determine the responsible hidden service " + "directories to post descriptors to."); + smartlist_free(responsible_dirs); + smartlist_free(successful_uploads); + return; + } + for (j = 0; j < smartlist_len(responsible_dirs); j++) { + char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + char *hs_dir_ip; + const node_t *node; + hs_dir = smartlist_get(responsible_dirs, j); + if (smartlist_contains_digest(renddesc->successful_uploads, + hs_dir->identity_digest)) + /* Don't upload descriptor if we succeeded in doing so last time. */ + continue; + node = node_get_by_id(hs_dir->identity_digest); + if (!node || !node_has_descriptor(node)) { + log_info(LD_REND, "Not launching upload for for v2 descriptor to " + "hidden service directory %s; we don't have its " + "router descriptor. Queuing for later upload.", + safe_str_client(routerstatus_describe(hs_dir))); + failed_upload = -1; + continue; + } + /* Send publish request. */ + directory_initiate_command_routerstatus(hs_dir, + DIR_PURPOSE_UPLOAD_RENDDESC_V2, + ROUTER_PURPOSE_GENERAL, + DIRIND_ANONYMOUS, NULL, + desc->desc_str, + strlen(desc->desc_str), 0); + base32_encode(desc_id_base32, sizeof(desc_id_base32), + desc->desc_id, DIGEST_LEN); + hs_dir_ip = tor_dup_ip(hs_dir->addr); + log_info(LD_REND, "Launching upload for v2 descriptor for " + "service '%s' with descriptor ID '%s' with validity " + "of %d seconds to hidden service directory '%s' on " + "%s:%d.", + safe_str_client(service_id), + safe_str_client(desc_id_base32), + seconds_valid, + hs_dir->nickname, + hs_dir_ip, + hs_dir->or_port); + tor_free(hs_dir_ip); + /* Remember successful upload to this router for next time. */ + if (!smartlist_contains_digest(successful_uploads, + hs_dir->identity_digest)) + smartlist_add(successful_uploads, hs_dir->identity_digest); + } + smartlist_clear(responsible_dirs); + } + if (!failed_upload) { + if (renddesc->successful_uploads) { + SMARTLIST_FOREACH(renddesc->successful_uploads, char *, c, tor_free(c);); + smartlist_free(renddesc->successful_uploads); + renddesc->successful_uploads = NULL; + } + renddesc->all_uploads_performed = 1; + } else { + /* Remember which routers worked this time, so that we don't upload the + * descriptor to them again. */ + if (!renddesc->successful_uploads) + renddesc->successful_uploads = smartlist_new(); + SMARTLIST_FOREACH(successful_uploads, const char *, c, { + if (!smartlist_contains_digest(renddesc->successful_uploads, c)) { + char *hsdir_id = tor_memdup(c, DIGEST_LEN); + smartlist_add(renddesc->successful_uploads, hsdir_id); + } + }); + } + smartlist_free(responsible_dirs); + smartlist_free(successful_uploads); +} + +/** Encode and sign an up-to-date service descriptor for service, + * and upload it/them to the responsible hidden service directories. + */ +static void +upload_service_descriptor(rend_service_t *service) +{ + time_t now = time(NULL); + int rendpostperiod; + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + int uploaded = 0; + + rendpostperiod = get_options()->RendPostPeriod; + + /* Upload descriptor? */ + if (get_options()->PublishHidServDescriptors) { + networkstatus_t *c = networkstatus_get_latest_consensus(); + if (c && smartlist_len(c->routerstatus_list) > 0) { + int seconds_valid, i, j, num_descs; + smartlist_t *descs = smartlist_new(); + smartlist_t *client_cookies = smartlist_new(); + /* Either upload a single descriptor (including replicas) or one + * descriptor for each authorized client in case of authorization + * type 'anonymize'. */ + num_descs = service->auth_type == REND_STEALTH_AUTH ? + smartlist_len(service->clients) : 1; + for (j = 0; j < num_descs; j++) { + crypto_pk_t *client_key = NULL; + rend_authorized_client_t *client = NULL; + smartlist_clear(client_cookies); + switch (service->auth_type) { + case REND_NO_AUTH: + /* Do nothing here. */ + break; + case REND_BASIC_AUTH: + SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, + cl, smartlist_add(client_cookies, cl->descriptor_cookie)); + break; + case REND_STEALTH_AUTH: + client = smartlist_get(service->clients, j); + client_key = client->client_key; + smartlist_add(client_cookies, client->descriptor_cookie); + break; + } + /* Encode the current descriptor. */ + seconds_valid = rend_encode_v2_descriptors(descs, service->desc, + now, 0, + service->auth_type, + client_key, + client_cookies); + if (seconds_valid < 0) { + log_warn(LD_BUG, "Internal error: couldn't encode service " + "descriptor; not uploading."); + smartlist_free(descs); + smartlist_free(client_cookies); + return; + } + /* Post the current descriptors to the hidden service directories. */ + rend_get_service_id(service->desc->pk, serviceid); + log_info(LD_REND, "Launching upload for hidden service %s", + serviceid); + directory_post_to_hs_dir(service->desc, descs, serviceid, + seconds_valid); + /* Free memory for descriptors. */ + for (i = 0; i < smartlist_len(descs); i++) + rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); + smartlist_clear(descs); + /* Update next upload time. */ + if (seconds_valid - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + > rendpostperiod) + service->next_upload_time = now + rendpostperiod; + else if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) + service->next_upload_time = now + seconds_valid + 1; + else + service->next_upload_time = now + seconds_valid - + REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + 1; + /* Post also the next descriptors, if necessary. */ + if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) { + seconds_valid = rend_encode_v2_descriptors(descs, service->desc, + now, 1, + service->auth_type, + client_key, + client_cookies); + if (seconds_valid < 0) { + log_warn(LD_BUG, "Internal error: couldn't encode service " + "descriptor; not uploading."); + smartlist_free(descs); + smartlist_free(client_cookies); + return; + } + directory_post_to_hs_dir(service->desc, descs, serviceid, + seconds_valid); + /* Free memory for descriptors. */ + for (i = 0; i < smartlist_len(descs); i++) + rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i)); + smartlist_clear(descs); + } + } + smartlist_free(descs); + smartlist_free(client_cookies); + uploaded = 1; + log_info(LD_REND, "Successfully uploaded v2 rend descriptors!"); + } + } + + /* If not uploaded, try again in one minute. */ + if (!uploaded) + service->next_upload_time = now + 60; + + /* Unmark dirty flag of this service. */ + service->desc_is_dirty = 0; +} + +/** Return the number of INTRODUCE2 cells this hidden service has received + * from this intro point. */ +static int +intro_point_accepted_intro_count(rend_intro_point_t *intro) +{ + return intro->accepted_introduce2_count; +} + +/** Return non-zero iff intro should 'expire' now (i.e. we + * should stop publishing it in new descriptors and eventually close + * it). */ +static int +intro_point_should_expire_now(rend_intro_point_t *intro, + time_t now) +{ + tor_assert(intro != NULL); + + if (intro->time_published == -1) { + /* Don't expire an intro point if we haven't even published it yet. */ + return 0; + } + + if (intro->time_expiring != -1) { + /* We've already started expiring this intro point. *Don't* let + * this function's result 'flap'. */ + return 1; + } + + if (intro_point_accepted_intro_count(intro) >= + INTRO_POINT_LIFETIME_INTRODUCTIONS) { + /* This intro point has been used too many times. Expire it now. */ + return 1; + } + + if (intro->time_to_expire == -1) { + /* This intro point has been published, but we haven't picked an + * expiration time for it. Pick one now. */ + int intro_point_lifetime_seconds = + INTRO_POINT_LIFETIME_MIN_SECONDS + + crypto_rand_int(INTRO_POINT_LIFETIME_MAX_SECONDS - + INTRO_POINT_LIFETIME_MIN_SECONDS); + + /* Start the expiration timer now, rather than when the intro + * point was first published. There shouldn't be much of a time + * difference. */ + intro->time_to_expire = now + intro_point_lifetime_seconds; + + return 0; + } + + /* This intro point has a time to expire set already. Use it. */ + return (now >= intro->time_to_expire); +} + +/** For every service, check how many intro points it currently has, and: + * - Pick new intro points as necessary. + * - Launch circuits to any new intro points. + */ +void +rend_services_introduce(void) +{ + int i,j,r; + const node_t *node; + rend_service_t *service; + rend_intro_point_t *intro; + int intro_point_set_changed, prev_intro_nodes; + unsigned int n_intro_points_unexpired; + unsigned int n_intro_points_to_open; + smartlist_t *intro_nodes; + time_t now; + const or_options_t *options = get_options(); + + intro_nodes = smartlist_new(); + now = time(NULL); + + for (i=0; i < smartlist_len(rend_service_list); ++i) { + smartlist_clear(intro_nodes); + service = smartlist_get(rend_service_list, i); + + tor_assert(service); + + /* intro_point_set_changed becomes non-zero iff the set of intro + * points to be published in service's descriptor has changed. */ + intro_point_set_changed = 0; + + /* n_intro_points_unexpired collects the number of non-expiring + * intro points we have, so that we know how many new intro + * circuits we need to launch for this service. */ + n_intro_points_unexpired = 0; + + if (now > service->intro_period_started+INTRO_CIRC_RETRY_PERIOD) { + /* One period has elapsed; we can try building circuits again. */ + service->intro_period_started = now; + service->n_intro_circuits_launched = 0; + } else if (service->n_intro_circuits_launched >= + MAX_INTRO_CIRCS_PER_PERIOD) { + /* We have failed too many times in this period; wait for the next + * one before we try again. */ + continue; + } + + /* Find out which introduction points we have in progress for this + service. */ + SMARTLIST_FOREACH_BEGIN(service->intro_nodes, rend_intro_point_t *, + intro) { + origin_circuit_t *intro_circ = + find_intro_circuit(intro, service->pk_digest); + + if (intro->time_expiring + INTRO_POINT_EXPIRATION_GRACE_PERIOD > now) { + /* This intro point has completely expired. Remove it, and + * mark the circuit for close if it's still alive. */ + if (intro_circ != NULL && + intro_circ->base_.purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) { + circuit_mark_for_close(TO_CIRCUIT(intro_circ), + END_CIRC_REASON_FINISHED); + } + rend_intro_point_free(intro); + intro = NULL; /* SMARTLIST_DEL_CURRENT takes a name, not a value. */ + SMARTLIST_DEL_CURRENT(service->intro_nodes, intro); + /* We don't need to set intro_point_set_changed here, because + * this intro point wouldn't have been published in a current + * descriptor anyway. */ + continue; + } + + node = node_get_by_id(intro->extend_info->identity_digest); + if (!node || !intro_circ) { + int removing_this_intro_point_changes_the_intro_point_set = 1; + log_info(LD_REND, "Giving up on %s as intro point for %s" + " (circuit disappeared).", + safe_str_client(extend_info_describe(intro->extend_info)), + safe_str_client(service->service_id)); + rend_service_note_removing_intro_point(service, intro); + if (intro->time_expiring != -1) { + log_info(LD_REND, "We were already expiring the intro point; " + "no need to mark the HS descriptor as dirty over this."); + removing_this_intro_point_changes_the_intro_point_set = 0; + } else if (intro->listed_in_last_desc) { + log_info(LD_REND, "The intro point we are giving up on was " + "included in the last published descriptor. " + "Marking current descriptor as dirty."); + service->desc_is_dirty = now; + } + rend_intro_point_free(intro); + intro = NULL; /* SMARTLIST_DEL_CURRENT takes a name, not a value. */ + SMARTLIST_DEL_CURRENT(service->intro_nodes, intro); + if (removing_this_intro_point_changes_the_intro_point_set) + intro_point_set_changed = 1; + } + + if (intro != NULL && intro_point_should_expire_now(intro, now)) { + log_info(LD_REND, "Expiring %s as intro point for %s.", + safe_str_client(extend_info_describe(intro->extend_info)), + safe_str_client(service->service_id)); + + rend_service_note_removing_intro_point(service, intro); + + /* The polite (and generally Right) way to expire an intro + * point is to establish a new one to replace it, publish a + * new descriptor that doesn't list any expiring intro points, + * and *then*, once our upload attempts for the new descriptor + * have ended (whether in success or failure), close the + * expiring intro points. + * + * Unfortunately, we can't find out when the new descriptor + * has actually been uploaded, so we'll have to settle for a + * five-minute timer. Start it. XXXX024 This sucks. */ + intro->time_expiring = now; + + intro_point_set_changed = 1; + } + + if (intro != NULL && intro->time_expiring == -1) + ++n_intro_points_unexpired; + + if (node) + smartlist_add(intro_nodes, (void*)node); + } SMARTLIST_FOREACH_END(intro); + + if (!intro_point_set_changed && + (n_intro_points_unexpired >= service->n_intro_points_wanted)) { + continue; + } + + /* Remember how many introduction circuits we started with. + * + * prev_intro_nodes serves a different purpose than + * n_intro_points_unexpired -- this variable tells us where our + * previously-created intro points end and our new ones begin in + * the intro-point list, so we don't have to launch the circuits + * at the same time as we create the intro points they correspond + * to. XXXX This is daft. */ + prev_intro_nodes = smartlist_len(service->intro_nodes); + + /* We have enough directory information to start establishing our + * intro points. We want to end up with n_intro_points_wanted + * intro points, but if we're just starting, we launch two extra + * circuits and use the first n_intro_points_wanted that complete. + * + * The ones after the first three will be converted to 'general' + * internal circuits in rend_service_intro_has_opened(), and then + * we'll drop them from the list of intro points next time we + * go through the above "find out which introduction points we have + * in progress" loop. */ + n_intro_points_to_open = (service->n_intro_points_wanted + + (prev_intro_nodes == 0 ? 2 : 0)); + for (j = (int)n_intro_points_unexpired; + j < (int)n_intro_points_to_open; + ++j) { /* XXXX remove casts */ + router_crn_flags_t flags = CRN_NEED_UPTIME|CRN_NEED_DESC; + if (get_options()->AllowInvalid_ & ALLOW_INVALID_INTRODUCTION) + flags |= CRN_ALLOW_INVALID; + node = router_choose_random_node(intro_nodes, + options->ExcludeNodes, flags); + if (!node) { + log_warn(LD_REND, + "Could only establish %d introduction points for %s; " + "wanted %u.", + smartlist_len(service->intro_nodes), service->service_id, + n_intro_points_to_open); + break; + } + intro_point_set_changed = 1; + smartlist_add(intro_nodes, (void*)node); + intro = tor_malloc_zero(sizeof(rend_intro_point_t)); + intro->extend_info = extend_info_from_node(node, 0); + intro->intro_key = crypto_pk_new(); + tor_assert(!crypto_pk_generate_key(intro->intro_key)); + intro->time_published = -1; + intro->time_to_expire = -1; + intro->time_expiring = -1; + smartlist_add(service->intro_nodes, intro); + log_info(LD_REND, "Picked router %s as an intro point for %s.", + safe_str_client(node_describe(node)), + safe_str_client(service->service_id)); + } + + /* If there's no need to launch new circuits, stop here. */ + if (!intro_point_set_changed) + continue; + + /* Establish new introduction points. */ + for (j=prev_intro_nodes; j < smartlist_len(service->intro_nodes); ++j) { + intro = smartlist_get(service->intro_nodes, j); + r = rend_service_launch_establish_intro(service, intro); + if (r<0) { + log_warn(LD_REND, "Error launching circuit to node %s for service %s.", + safe_str_client(extend_info_describe(intro->extend_info)), + safe_str_client(service->service_id)); + } + } + } + smartlist_free(intro_nodes); +} + +/** Regenerate and upload rendezvous service descriptors for all + * services, if necessary. If the descriptor has been dirty enough + * for long enough, definitely upload; else only upload when the + * periodic timeout has expired. + * + * For the first upload, pick a random time between now and two periods + * from now, and pick it independently for each service. + */ +void +rend_consider_services_upload(time_t now) +{ + int i; + rend_service_t *service; + int rendpostperiod = get_options()->RendPostPeriod; + + if (!get_options()->PublishHidServDescriptors) + return; + + for (i=0; i < smartlist_len(rend_service_list); ++i) { + service = smartlist_get(rend_service_list, i); + if (!service->next_upload_time) { /* never been uploaded yet */ + /* The fixed lower bound of 30 seconds ensures that the descriptor + * is stable before being published. See comment below. */ + service->next_upload_time = + now + 30 + crypto_rand_int(2*rendpostperiod); + } + if (service->next_upload_time < now || + (service->desc_is_dirty && + service->desc_is_dirty < now-30)) { + /* if it's time, or if the directory servers have a wrong service + * descriptor and ours has been stable for 30 seconds, upload a + * new one of each format. */ + rend_service_update_descriptor(service); + upload_service_descriptor(service); + } + } +} + +/** True if the list of available router descriptors might have changed so + * that we should have a look whether we can republish previously failed + * rendezvous service descriptors. */ +static int consider_republishing_rend_descriptors = 1; + +/** Called when our internal view of the directory has changed, so that we + * might have router descriptors of hidden service directories available that + * we did not have before. */ +void +rend_hsdir_routers_changed(void) +{ + consider_republishing_rend_descriptors = 1; +} + +/** Consider republication of v2 rendezvous service descriptors that failed + * previously, but without regenerating descriptor contents. + */ +void +rend_consider_descriptor_republication(void) +{ + int i; + rend_service_t *service; + + if (!consider_republishing_rend_descriptors) + return; + consider_republishing_rend_descriptors = 0; + + if (!get_options()->PublishHidServDescriptors) + return; + + for (i=0; i < smartlist_len(rend_service_list); ++i) { + service = smartlist_get(rend_service_list, i); + if (service->desc && !service->desc->all_uploads_performed) { + /* If we failed in uploading a descriptor last time, try again *without* + * updating the descriptor's contents. */ + upload_service_descriptor(service); + } + } +} + +/** Log the status of introduction points for all rendezvous services + * at log severity severity. + */ +void +rend_service_dump_stats(int severity) +{ + int i,j; + rend_service_t *service; + rend_intro_point_t *intro; + const char *safe_name; + origin_circuit_t *circ; + + for (i=0; i < smartlist_len(rend_service_list); ++i) { + service = smartlist_get(rend_service_list, i); + tor_log(severity, LD_GENERAL, "Service configured in \"%s\":", + service->directory); + for (j=0; j < smartlist_len(service->intro_nodes); ++j) { + intro = smartlist_get(service->intro_nodes, j); + safe_name = safe_str_client(intro->extend_info->nickname); + + circ = find_intro_circuit(intro, service->pk_digest); + if (!circ) { + tor_log(severity, LD_GENERAL, " Intro point %d at %s: no circuit", + j, safe_name); + continue; + } + tor_log(severity, LD_GENERAL, " Intro point %d at %s: circuit is %s", + j, safe_name, circuit_state_to_string(circ->base_.state)); + } + } +} + +/** Given conn, a rendezvous exit stream, look up the hidden service for + * 'circ', and look up the port and address based on conn-\>port. + * Assign the actual conn-\>addr and conn-\>port. Return -1 if failure, + * or 0 for success. + */ +int +rend_service_set_connection_addr_port(edge_connection_t *conn, + origin_circuit_t *circ) +{ + rend_service_t *service; + char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; + smartlist_t *matching_ports; + rend_service_port_config_t *chosen_port; + + tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED); + tor_assert(circ->rend_data); + log_debug(LD_REND,"beginning to hunt for addr/port"); + base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, + circ->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN); + service = rend_service_get_by_pk_digest( + circ->rend_data->rend_pk_digest); + if (!service) { + log_warn(LD_REND, "Couldn't find any service associated with pk %s on " + "rendezvous circuit %u; closing.", + serviceid, (unsigned)circ->base_.n_circ_id); + return -1; + } + matching_ports = smartlist_new(); + SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p, + { + if (conn->base_.port == p->virtual_port) { + smartlist_add(matching_ports, p); + } + }); + chosen_port = smartlist_choose(matching_ports); + smartlist_free(matching_ports); + if (chosen_port) { + tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr); + conn->base_.port = chosen_port->real_port; + return 0; + } + log_info(LD_REND, "No virtual port mapping exists for port %d on service %s", + conn->base_.port,serviceid); + return -1; +} + diff --git a/src/tor/rendservice.h b/src/tor/rendservice.h new file mode 100644 index 000000000..caf88a3d6 --- /dev/null +++ b/src/tor/rendservice.h @@ -0,0 +1,108 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file rendservice.h + * \brief Header file for rendservice.c. + **/ + +#ifndef TOR_RENDSERVICE_H +#define TOR_RENDSERVICE_H + +#include "or.h" + +typedef struct rend_intro_cell_s rend_intro_cell_t; + +#ifdef RENDSERVICE_PRIVATE + +/* This can be used for both INTRODUCE1 and INTRODUCE2 */ + +struct rend_intro_cell_s { + /* Is this an INTRODUCE1 or INTRODUCE2? (set to 1 or 2) */ + uint8_t type; + /* Public key digest */ + uint8_t pk[DIGEST_LEN]; + /* Optionally, store ciphertext here */ + uint8_t *ciphertext; + ssize_t ciphertext_len; + /* Optionally, store plaintext */ + uint8_t *plaintext; + ssize_t plaintext_len; + /* Have we parsed the plaintext? */ + uint8_t parsed; + /* intro protocol version (0, 1, 2 or 3) */ + uint8_t version; + /* Version-specific parts */ + union { + struct { + /* Rendezvous point nickname */ + uint8_t rp[20]; + } v0; + struct { + /* Rendezvous point nickname or hex-encoded key digest */ + uint8_t rp[42]; + } v1; + struct { + /* The extend_info_t struct has everything v2 uses */ + extend_info_t *extend_info; + } v2; + struct { + /* Auth type used */ + uint8_t auth_type; + /* Length of auth data */ + uint16_t auth_len; + /* Auth data */ + uint8_t *auth_data; + /* Rendezvous point's IP address/port, identity digest and onion key */ + extend_info_t *extend_info; + } v3; + } u; + /* Rendezvous cookie */ + uint8_t rc[REND_COOKIE_LEN]; + /* Diffie-Hellman data */ + uint8_t dh[DH_KEY_LEN]; +}; + +#endif + +int num_rend_services(void); +int rend_config_services(const or_options_t *options, int validate_only); +int rend_service_load_all_keys(void); +void rend_services_introduce(void); +void rend_consider_services_upload(time_t now); +void rend_hsdir_routers_changed(void); +void rend_consider_descriptor_republication(void); + +void rend_service_intro_has_opened(origin_circuit_t *circuit); +int rend_service_intro_established(origin_circuit_t *circuit, + const uint8_t *request, + size_t request_len); +void rend_service_rendezvous_has_opened(origin_circuit_t *circuit); +int rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request, + size_t request_len); +void rend_service_compact_intro(rend_intro_cell_t *request); +int rend_service_decrypt_intro(rend_intro_cell_t *request, + crypto_pk_t *key, + char **err_msg_out); +void rend_service_free_intro(rend_intro_cell_t *request); +rend_intro_cell_t * rend_service_begin_parse_intro(const uint8_t *request, + size_t request_len, + uint8_t type, + char **err_msg_out); +int rend_service_parse_intro_plaintext(rend_intro_cell_t *intro, + char **err_msg_out); +int rend_service_validate_intro_early(const rend_intro_cell_t *intro, + char **err_msg_out); +int rend_service_validate_intro_late(const rend_intro_cell_t *intro, + char **err_msg_out); +void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc); +int rend_service_set_connection_addr_port(edge_connection_t *conn, + origin_circuit_t *circ); +void rend_service_dump_stats(int severity); +void rend_service_free_all(void); + +#endif + diff --git a/src/tor/src/or/rephist.c b/src/tor/rephist.c similarity index 77% rename from src/tor/src/or/rephist.c rename to src/tor/rephist.c index 15fb674ff..66dc5f611 100644 --- a/src/tor/src/or/rephist.c +++ b/src/tor/rephist.c @@ -1,77 +1,13 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file rephist.c - * \brief Basic history and performance-tracking functionality. - * - * Basic history and performance-tracking functionality to remember + * \brief Basic history and "reputation" functionality to remember * which servers have worked in the past, how much bandwidth we've * been using, which ports we tend to want, and so on; further, * exit port statistics, cell statistics, and connection statistics. - * - * The history and information tracked in this module could sensibly be - * divided into several categories: - * - *
    • Statistics used by authorities to remember the uptime and - * stability information about various relays, including "uptime", - * "weighted fractional uptime" and "mean time between failures". - * - *
    • Bandwidth usage history, used by relays to self-report how much - * bandwidth they've used for different purposes over last day or so, - * in order to generate the {dirreq-,}{read,write}-history lines in - * that they publish. - * - *
    • Predicted ports, used by clients to remember how long it's been - * since they opened an exit connection to each given target - * port. Clients use this information in order to try to keep circuits - * open to exit nodes that can connect to the ports that they care - * about. (The predicted ports mechanism also handles predicted circuit - * usage that _isn't_ port-specific, such as resolves, internal circuits, - * and so on.) - * - *
    • Public key operation counters, for tracking how many times we've - * done each public key operation. (This is unmaintained and we should - * remove it.) - * - *
    • Exit statistics by port, used by exits to keep track of the - * number of streams and bytes they've served at each exit port, so they - * can generate their exit-kibibytes-{read,written} and - * exit-streams-opened statistics. - * - *
    • Circuit stats, used by relays instances to tract circuit - * queue fullness and delay over time, and generate cell-processed-cells, - * cell-queued-cells, cell-time-in-queue, and cell-circuits-per-decile - * statistics. - * - *
    • Descriptor serving statistics, used by directory caches to track - * how many descriptors they've served. - * - *
    • Connection statistics, used by relays to track one-way and - * bidirectional connections. - * - *
    • Onion handshake statistics, used by relays to count how many - * TAP and ntor handshakes they've handled. - * - *
    • Hidden service statistics, used by relays to count rendezvous - * traffic and HSDir-stored descriptors. - * - *
    • Link protocol statistics, used by relays to count how many times - * each link protocol has been used. - * - *
    - * - * The entry points for this module are scattered throughout the - * codebase. Sending data, receiving data, connecting to a relay, - * losing a connection to a relay, and so on can all trigger a change in - * our current stats. Relays also invoke this module in order to - * extract their statistics when building routerinfo and extrainfo - * objects in router.c. - * - * TODO: This module should be broken up. - * - * (The "rephist" name originally stood for "reputation and history". ) **/ #include "or.h" @@ -84,13 +20,9 @@ #include "router.h" #include "routerlist.h" #include "ht.h" -#include "channelpadding.h" - -#include "channelpadding.h" -#include "connection_or.h" static void bw_arrays_init(void); -static void predicted_ports_alloc(void); +static void predicted_ports_init(void); /** Total number of bytes currently allocated in fields used by rephist.c. */ uint64_t rephist_total_alloc=0; @@ -169,44 +101,6 @@ typedef struct or_history_t { digestmap_t *link_history_map; } or_history_t; -/** - * This structure holds accounting needed to calculate the padding overhead. - */ -typedef struct padding_counts_t { - /** Total number of cells we have received, including padding */ - uint64_t read_cell_count; - /** Total number of cells we have sent, including padding */ - uint64_t write_cell_count; - /** Total number of CELL_PADDING cells we have received */ - uint64_t read_pad_cell_count; - /** Total number of CELL_PADDING cells we have sent */ - uint64_t write_pad_cell_count; - /** Total number of read cells on padding-enabled conns */ - uint64_t enabled_read_cell_count; - /** Total number of sent cells on padding-enabled conns */ - uint64_t enabled_write_cell_count; - /** Total number of read CELL_PADDING cells on padding-enabled cons */ - uint64_t enabled_read_pad_cell_count; - /** Total number of sent CELL_PADDING cells on padding-enabled cons */ - uint64_t enabled_write_pad_cell_count; - /** Total number of RELAY_DROP cells we have received */ - uint64_t read_drop_cell_count; - /** Total number of RELAY_DROP cells we have sent */ - uint64_t write_drop_cell_count; - /** The maximum number of padding timers we've seen in 24 hours */ - uint64_t maximum_chanpad_timers; - /** When did we first copy padding_current into padding_published? */ - char first_published_at[ISO_TIME_LEN+1]; -} padding_counts_t; - -/** Holds the current values of our padding statistics. - * It is not published until it is transferred to padding_published. */ -static padding_counts_t padding_current; - -/** Remains fixed for a 24 hour period, and then is replaced - * by a redacted copy of padding_current */ -static padding_counts_t padding_published; - /** When did we last multiply all routers' weighted_run_length and * total_run_weights by STABILITY_ALPHA? */ static time_t stability_last_downrated = 0; @@ -254,7 +148,7 @@ get_link_history(const char *from_id, const char *to_id) return NULL; if (tor_digest_is_zero(to_id)) return NULL; - lhist = digestmap_get(orhist->link_history_map, to_id); + lhist = (link_history_t*) digestmap_get(orhist->link_history_map, to_id); if (!lhist) { lhist = tor_malloc_zero(sizeof(link_history_t)); rephist_total_alloc += sizeof(link_history_t); @@ -306,7 +200,7 @@ rep_hist_init(void) { history_map = digestmap_new(); bw_arrays_init(); - predicted_ports_alloc(); + predicted_ports_init(); } /** Helper: note that we are no longer connected to the router with history @@ -710,7 +604,7 @@ rep_hist_get_weighted_time_known(const char *id, time_t when) int rep_hist_have_measured_enough_stability(void) { - /* XXXX++ This doesn't do so well when we change our opinion + /* XXXX023 This doesn't do so well when we change our opinion * as to whether we're tracking router stability. */ return started_tracking_stability < time(NULL) - 4*60*60; } @@ -849,15 +743,14 @@ rep_history_clean(time_t before) orhist_it = digestmap_iter_init(history_map); while (!digestmap_iter_done(orhist_it)) { - int should_remove; + int remove; digestmap_iter_get(orhist_it, &d1, &or_history_p); or_history = or_history_p; - should_remove = authority ? - (or_history->total_run_weights < STABILITY_EPSILON && + remove = authority ? (or_history->total_run_weights < STABILITY_EPSILON && !or_history->start_of_run) : (or_history->changed < before); - if (should_remove) { + if (remove) { orhist_it = digestmap_iter_next_rmv(history_map, orhist_it); free_or_history(or_history); continue; @@ -947,9 +840,9 @@ rep_hist_record_mtbf_data(time_t now, int missing_means_down) base16_encode(dbuf, sizeof(dbuf), digest, DIGEST_LEN); if (missing_means_down && hist->start_of_run && - !connection_or_digest_is_known_relay(digest)) { + !router_get_by_id_digest(digest)) { /* We think this relay is running, but it's not listed in our - * consensus. Somehow it fell out without telling us it went + * routerlist. Somehow it fell out without telling us it went * down. Complain and also correct it. */ log_info(LD_HIST, "Relay '%s' is listed as up in rephist, but it's not in " @@ -986,6 +879,126 @@ rep_hist_record_mtbf_data(time_t now, int missing_means_down) return -1; } +/** Format the current tracked status of the router in hist at time + * now for analysis; return it in a newly allocated string. */ +static char * +rep_hist_format_router_status(or_history_t *hist, time_t now) +{ + char sor_buf[ISO_TIME_LEN+1]; + char sod_buf[ISO_TIME_LEN+1]; + double wfu; + double mtbf; + int up = 0, down = 0; + char *cp = NULL; + + if (hist->start_of_run) { + format_iso_time(sor_buf, hist->start_of_run); + up = 1; + } + if (hist->start_of_downtime) { + format_iso_time(sod_buf, hist->start_of_downtime); + down = 1; + } + + wfu = get_weighted_fractional_uptime(hist, now); + mtbf = get_stability(hist, now); + tor_asprintf(&cp, + "%s%s%s" + "%s%s%s" + "wfu %0.3f\n" + " weighted-time %lu\n" + " weighted-uptime %lu\n" + "mtbf %0.1f\n" + " weighted-run-length %lu\n" + " total-run-weights %f\n", + up?"uptime-started ":"", up?sor_buf:"", up?" UTC\n":"", + down?"downtime-started ":"", down?sod_buf:"", down?" UTC\n":"", + wfu, + hist->total_weighted_time, + hist->weighted_uptime, + mtbf, + hist->weighted_run_length, + hist->total_run_weights + ); + return cp; +} + +/** The last stability analysis document that we created, or NULL if we never + * have created one. */ +static char *last_stability_doc = NULL; +/** The last time we created a stability analysis document, or 0 if we never + * have created one. */ +static time_t built_last_stability_doc_at = 0; +/** Shortest allowable time between building two stability documents. */ +#define MAX_STABILITY_DOC_BUILD_RATE (3*60) + +/** Return a pointer to a NUL-terminated document describing our view of the + * stability of the routers we've been tracking. Return NULL on failure. */ +const char * +rep_hist_get_router_stability_doc(time_t now) +{ + char *result; + smartlist_t *chunks; + if (built_last_stability_doc_at + MAX_STABILITY_DOC_BUILD_RATE > now) + return last_stability_doc; + + if (!history_map) + return NULL; + + tor_free(last_stability_doc); + chunks = smartlist_new(); + + if (rep_hist_have_measured_enough_stability()) { + smartlist_add(chunks, tor_strdup("we-have-enough-measurements\n")); + } else { + smartlist_add(chunks, tor_strdup("we-do-not-have-enough-measurements\n")); + } + + DIGESTMAP_FOREACH(history_map, id, or_history_t *, hist) { + const node_t *node; + char dbuf[BASE64_DIGEST_LEN+1]; + char *info; + digest_to_base64(dbuf, id); + node = node_get_by_id(id); + if (node) { + char ip[INET_NTOA_BUF_LEN+1]; + char tbuf[ISO_TIME_LEN+1]; + time_t published = node_get_published_on(node); + node_get_address_string(node,ip,sizeof(ip)); + if (published > 0) + format_iso_time(tbuf, published); + else + strlcpy(tbuf, "???", sizeof(tbuf)); + smartlist_add_asprintf(chunks, + "router %s %s %s\n" + "published %s\n" + "relevant-flags %s%s%s\n" + "declared-uptime %ld\n", + dbuf, node_get_nickname(node), ip, + tbuf, + node->is_running ? "Running " : "", + node->is_valid ? "Valid " : "", + node->ri && node->ri->is_hibernating ? "Hibernating " : "", + node_get_declared_uptime(node)); + } else { + smartlist_add_asprintf(chunks, + "router %s {no descriptor}\n", dbuf); + } + info = rep_hist_format_router_status(hist, now); + if (info) + smartlist_add(chunks, info); + + } DIGESTMAP_FOREACH_END; + + result = smartlist_join_strings(chunks, "", 0, NULL); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); + smartlist_free(chunks); + + last_stability_doc = result; + built_last_stability_doc_at = time(NULL); + return result; +} + /** Helper: return the first j >= i such that !strcmpstart(sl[j], prefix) and * such that no line sl[k] with i <= k < j starts with "R ". Return -1 if no * such line exists. */ @@ -1027,7 +1040,7 @@ parse_possibly_bad_iso_time(const char *s, time_t *time_out) * that's about as much before now as t was before * stored_at. */ -static inline time_t +static INLINE time_t correct_time(time_t t, time_t now, time_t stored_at, time_t started_measuring) { if (t < started_measuring - 24*60*60*365) @@ -1038,7 +1051,7 @@ correct_time(time_t t, time_t now, time_t stored_at, time_t started_measuring) return 0; else { long run_length = stored_at - t; - t = (time_t)(now - run_length); + t = now - run_length; if (t < started_measuring) t = started_measuring; return t; @@ -1181,8 +1194,7 @@ rep_hist_load_mtbf_data(time_t now) if (mtbf_idx > i) i = mtbf_idx; } - if (base16_decode(digest, DIGEST_LEN, - hexbuf, HEX_DIGEST_LEN) != DIGEST_LEN) { + if (base16_decode(digest, DIGEST_LEN, hexbuf, HEX_DIGEST_LEN) < 0) { log_warn(LD_HIST, "Couldn't hex string %s", escaped(hexbuf)); continue; } @@ -1200,7 +1212,7 @@ rep_hist_load_mtbf_data(time_t now) hist->start_of_run = correct_time(start_of_run, now, stored_at, tracked_since); if (hist->start_of_run < latest_possible_start + wrl) - latest_possible_start = (time_t)(hist->start_of_run - wrl); + latest_possible_start = hist->start_of_run - wrl; hist->weighted_run_length = wrl; hist->total_run_weights = trw; @@ -1239,9 +1251,11 @@ rep_hist_load_mtbf_data(time_t now) * totals? */ #define NUM_SECS_ROLLING_MEASURE 10 /** How large are the intervals for which we track and report bandwidth use? */ -#define NUM_SECS_BW_SUM_INTERVAL (24*60*60) +/* XXXX Watch out! Before Tor 0.2.2.21-alpha, using any other value here would + * generate an unparseable state file. */ +#define NUM_SECS_BW_SUM_INTERVAL (15*60) /** How far in the past do we remember and publish bandwidth use? */ -#define NUM_SECS_BW_SUM_IS_VALID (5*24*60*60) +#define NUM_SECS_BW_SUM_IS_VALID (24*60*60) /** How many bandwidth usage intervals do we remember? (derived) */ #define NUM_TOTALS (NUM_SECS_BW_SUM_IS_VALID/NUM_SECS_BW_SUM_INTERVAL) @@ -1298,7 +1312,7 @@ commit_max(bw_array_t *b) } /** Shift the current observation time of b forward by one second. */ -static inline void +static INLINE void advance_obs(bw_array_t *b) { int nextidx; @@ -1324,7 +1338,7 @@ advance_obs(bw_array_t *b) /** Add n bytes to the number of bytes in b for second * when. */ -static inline void +static INLINE void add_obs(bw_array_t *b, time_t when, uint64_t n) { if (when < b->cur_obs_time) @@ -1358,21 +1372,6 @@ bw_array_new(void) return b; } -#define bw_array_free(val) \ - FREE_AND_NULL(bw_array_t, bw_array_free_, (val)) - -/** Free storage held by bandwidth array b. */ -static void -bw_array_free_(bw_array_t *b) -{ - if (!b) { - return; - } - - rephist_total_alloc -= sizeof(bw_array_t); - tor_free(b); -} - /** Recent history of bandwidth observations for read operations. */ static bw_array_t *read_array = NULL; /** Recent history of bandwidth observations for write operations. */ @@ -1389,11 +1388,10 @@ static bw_array_t *dir_write_array = NULL; static void bw_arrays_init(void) { - bw_array_free(read_array); - bw_array_free(write_array); - bw_array_free(dir_read_array); - bw_array_free(dir_write_array); - + tor_free(read_array); + tor_free(write_array); + tor_free(dir_read_array); + tor_free(dir_write_array); read_array = bw_array_new(); write_array = bw_array_new(); dir_read_array = bw_array_new(); @@ -1692,7 +1690,7 @@ rep_hist_load_bwhist_state_section(bw_array_t *b, time_t start; uint64_t v, mv; - int i,ok,ok_m = 0; + int i,ok,ok_m; int have_maxima = s_maxima && s_values && (smartlist_len(s_values) == smartlist_len(s_maxima)); @@ -1803,42 +1801,6 @@ typedef struct predicted_port_t { /** A list of port numbers that have been used recently. */ static smartlist_t *predicted_ports_list=NULL; -/** How long do we keep predicting circuits? */ -static int prediction_timeout=0; -/** When was the last time we added a prediction entry (HS or port) */ -static time_t last_prediction_add_time=0; - -/** - * How much time left until we stop predicting circuits? - */ -int -predicted_ports_prediction_time_remaining(time_t now) -{ - time_t idle_delta; - - /* Protect against overflow of return value. This can happen if the clock - * jumps backwards in time. Update the last prediction time (aka last - * active time) to prevent it. This update is preferable to using monotonic - * time because it prevents clock jumps into the past from simply causing - * very long idle timeouts while the monotonic time stands still. */ - if (last_prediction_add_time > now) { - last_prediction_add_time = now; - idle_delta = 0; - } else { - idle_delta = now - last_prediction_add_time; - } - - /* Protect against underflow of the return value. This can happen for very - * large periods of inactivity/system sleep. */ - if (idle_delta > prediction_timeout) - return 0; - - if (BUG((prediction_timeout - idle_delta) > INT_MAX)) { - return INT_MAX; - } - - return (int)(prediction_timeout - idle_delta); -} /** We just got an application request for a connection with * port port. Remember it for the future, so we can keep @@ -1848,47 +1810,28 @@ static void add_predicted_port(time_t now, uint16_t port) { predicted_port_t *pp = tor_malloc(sizeof(predicted_port_t)); - - // If the list is empty, re-randomize predicted ports lifetime - if (!any_predicted_circuits(now)) { - prediction_timeout = channelpadding_get_circuits_available_timeout(); - } - - last_prediction_add_time = now; - - log_info(LD_CIRC, - "New port prediction added. Will continue predictive circ building " - "for %d more seconds.", - predicted_ports_prediction_time_remaining(now)); - pp->port = port; pp->time = now; rephist_total_alloc += sizeof(*pp); smartlist_add(predicted_ports_list, pp); } -/** - * Allocate whatever memory and structs are needed for predicting +/** Initialize whatever memory and structs are needed for predicting * which ports will be used. Also seed it with port 80, so we'll build * circuits on start-up. */ static void -predicted_ports_alloc(void) -{ - predicted_ports_list = smartlist_new(); -} - -void predicted_ports_init(void) { - add_predicted_port(time(NULL), 443); // Add a port to get us started + predicted_ports_list = smartlist_new(); + add_predicted_port(time(NULL), 80); /* add one to kickstart us */ } /** Free whatever memory is needed for predicting which ports will * be used. */ static void -predicted_ports_free_all(void) +predicted_ports_free(void) { rephist_total_alloc -= smartlist_len(predicted_ports_list)*sizeof(predicted_port_t); @@ -1912,12 +1855,6 @@ rep_hist_note_used_port(time_t now, uint16_t port) SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { if (pp->port == port) { pp->time = now; - - last_prediction_add_time = now; - log_info(LD_CIRC, - "New port prediction added. Will continue predictive circ " - "building for %d more seconds.", - predicted_ports_prediction_time_remaining(now)); return; } } SMARTLIST_FOREACH_END(pp); @@ -1925,21 +1862,22 @@ rep_hist_note_used_port(time_t now, uint16_t port) add_predicted_port(now, port); } +/** For this long after we've seen a request for a given port, assume that + * we'll want to make connections to the same port in the future. */ +#define PREDICTED_CIRCS_RELEVANCE_TIME (60*60) + /** Return a newly allocated pointer to a list of uint16_t * for ports that * are likely to be asked for in the near future. */ smartlist_t * rep_hist_get_predicted_ports(time_t now) { - int predicted_circs_relevance_time; smartlist_t *out = smartlist_new(); tor_assert(predicted_ports_list); - predicted_circs_relevance_time = prediction_timeout; - /* clean out obsolete entries */ SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { - if (pp->time + predicted_circs_relevance_time < now) { + if (pp->time + PREDICTED_CIRCS_RELEVANCE_TIME < now) { log_debug(LD_CIRC, "Expiring predicted port %d", pp->port); rephist_total_alloc -= sizeof(predicted_port_t); @@ -1966,7 +1904,6 @@ rep_hist_remove_predicted_ports(const smartlist_t *rmv_ports) SMARTLIST_FOREACH_BEGIN(predicted_ports_list, predicted_port_t *, pp) { if (bitarray_is_set(remove_ports, pp->port)) { tor_free(pp); - rephist_total_alloc -= sizeof(*pp); SMARTLIST_DEL_CURRENT(predicted_ports_list, pp); } } SMARTLIST_FOREACH_END(pp); @@ -1995,18 +1932,6 @@ static time_t predicted_internal_capacity_time = 0; void rep_hist_note_used_internal(time_t now, int need_uptime, int need_capacity) { - // If the list is empty, re-randomize predicted ports lifetime - if (!any_predicted_circuits(now)) { - prediction_timeout = channelpadding_get_circuits_available_timeout(); - } - - last_prediction_add_time = now; - - log_info(LD_CIRC, - "New port prediction added. Will continue predictive circ building " - "for %d more seconds.", - predicted_ports_prediction_time_remaining(now)); - predicted_internal_time = now; if (need_uptime) predicted_internal_uptime_time = now; @@ -2019,18 +1944,14 @@ int rep_hist_get_predicted_internal(time_t now, int *need_uptime, int *need_capacity) { - int predicted_circs_relevance_time; - - predicted_circs_relevance_time = prediction_timeout; - if (!predicted_internal_time) { /* initialize it */ predicted_internal_time = now; predicted_internal_uptime_time = now; predicted_internal_capacity_time = now; } - if (predicted_internal_time + predicted_circs_relevance_time < now) + if (predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME < now) return 0; /* too long ago */ - if (predicted_internal_uptime_time + predicted_circs_relevance_time >= now) + if (predicted_internal_uptime_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now) *need_uptime = 1; // Always predict that we need capacity. *need_capacity = 1; @@ -2042,33 +1963,126 @@ rep_hist_get_predicted_internal(time_t now, int *need_uptime, int any_predicted_circuits(time_t now) { - int predicted_circs_relevance_time; - predicted_circs_relevance_time = prediction_timeout; - return smartlist_len(predicted_ports_list) || - predicted_internal_time + predicted_circs_relevance_time >= now; + predicted_internal_time + PREDICTED_CIRCS_RELEVANCE_TIME >= now; } /** Return 1 if we have no need for circuits currently, else return 0. */ int rep_hist_circbuilding_dormant(time_t now) { - const or_options_t *options = get_options(); - if (any_predicted_circuits(now)) return 0; /* see if we'll still need to build testing circuits */ - if (server_mode(options) && - (!check_whether_orport_reachable(options) || - !circuit_enough_testing_circs())) + if (server_mode(get_options()) && + (!check_whether_orport_reachable() || !circuit_enough_testing_circs())) return 0; - if (!check_whether_dirport_reachable(options)) + if (!check_whether_dirport_reachable()) return 0; return 1; } +/** Structure to track how many times we've done each public key operation. */ +static struct { + /** How many directory objects have we signed? */ + unsigned long n_signed_dir_objs; + /** How many routerdescs have we signed? */ + unsigned long n_signed_routerdescs; + /** How many directory objects have we verified? */ + unsigned long n_verified_dir_objs; + /** How many routerdescs have we verified */ + unsigned long n_verified_routerdescs; + /** How many onionskins have we encrypted to build circuits? */ + unsigned long n_onionskins_encrypted; + /** How many onionskins have we decrypted to do circuit build requests? */ + unsigned long n_onionskins_decrypted; + /** How many times have we done the TLS handshake as a client? */ + unsigned long n_tls_client_handshakes; + /** How many times have we done the TLS handshake as a server? */ + unsigned long n_tls_server_handshakes; + /** How many PK operations have we done as a hidden service client? */ + unsigned long n_rend_client_ops; + /** How many PK operations have we done as a hidden service midpoint? */ + unsigned long n_rend_mid_ops; + /** How many PK operations have we done as a hidden service provider? */ + unsigned long n_rend_server_ops; +} pk_op_counts = {0,0,0,0,0,0,0,0,0,0,0}; + +/** Increment the count of the number of times we've done operation. */ +void +note_crypto_pk_op(pk_op_t operation) +{ + switch (operation) + { + case SIGN_DIR: + pk_op_counts.n_signed_dir_objs++; + break; + case SIGN_RTR: + pk_op_counts.n_signed_routerdescs++; + break; + case VERIFY_DIR: + pk_op_counts.n_verified_dir_objs++; + break; + case VERIFY_RTR: + pk_op_counts.n_verified_routerdescs++; + break; + case ENC_ONIONSKIN: + pk_op_counts.n_onionskins_encrypted++; + break; + case DEC_ONIONSKIN: + pk_op_counts.n_onionskins_decrypted++; + break; + case TLS_HANDSHAKE_C: + pk_op_counts.n_tls_client_handshakes++; + break; + case TLS_HANDSHAKE_S: + pk_op_counts.n_tls_server_handshakes++; + break; + case REND_CLIENT: + pk_op_counts.n_rend_client_ops++; + break; + case REND_MID: + pk_op_counts.n_rend_mid_ops++; + break; + case REND_SERVER: + pk_op_counts.n_rend_server_ops++; + break; + default: + log_warn(LD_BUG, "Unknown pk operation %d", operation); + } +} + +/** Log the number of times we've done each public/private-key operation. */ +void +dump_pk_ops(int severity) +{ + tor_log(severity, LD_HIST, + "PK operations: %lu directory objects signed, " + "%lu directory objects verified, " + "%lu routerdescs signed, " + "%lu routerdescs verified, " + "%lu onionskins encrypted, " + "%lu onionskins decrypted, " + "%lu client-side TLS handshakes, " + "%lu server-side TLS handshakes, " + "%lu rendezvous client operations, " + "%lu rendezvous middle operations, " + "%lu rendezvous server operations.", + pk_op_counts.n_signed_dir_objs, + pk_op_counts.n_verified_dir_objs, + pk_op_counts.n_signed_routerdescs, + pk_op_counts.n_verified_routerdescs, + pk_op_counts.n_onionskins_encrypted, + pk_op_counts.n_onionskins_decrypted, + pk_op_counts.n_tls_client_handshakes, + pk_op_counts.n_tls_server_handshakes, + pk_op_counts.n_rend_client_ops, + pk_op_counts.n_rend_mid_ops, + pk_op_counts.n_rend_server_ops); +} + /*** Exit port statistics ***/ /* Some constants */ @@ -2100,9 +2114,12 @@ void rep_hist_exit_stats_init(time_t now) { start_of_exit_stats_interval = now; - exit_bytes_read = tor_calloc(EXIT_STATS_NUM_PORTS, sizeof(uint64_t)); - exit_bytes_written = tor_calloc(EXIT_STATS_NUM_PORTS, sizeof(uint64_t)); - exit_streams = tor_calloc(EXIT_STATS_NUM_PORTS, sizeof(uint32_t)); + exit_bytes_read = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint64_t)); + exit_bytes_written = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint64_t)); + exit_streams = tor_malloc_zero(EXIT_STATS_NUM_PORTS * + sizeof(uint32_t)); } /** Reset counters for exit port statistics. */ @@ -2380,16 +2397,16 @@ void rep_hist_add_buffer_stats(double mean_num_cells_in_queue, double mean_time_cells_in_queue, uint32_t processed_cells) { - circ_buffer_stats_t *stats; + circ_buffer_stats_t *stat; if (!start_of_buffer_stats_interval) return; /* Not initialized. */ - stats = tor_malloc_zero(sizeof(circ_buffer_stats_t)); - stats->mean_num_cells_in_queue = mean_num_cells_in_queue; - stats->mean_time_cells_in_queue = mean_time_cells_in_queue; - stats->processed_cells = processed_cells; + stat = tor_malloc_zero(sizeof(circ_buffer_stats_t)); + stat->mean_num_cells_in_queue = mean_num_cells_in_queue; + stat->mean_time_cells_in_queue = mean_time_cells_in_queue; + stat->processed_cells = processed_cells; if (!circuits_for_buffer_stats) circuits_for_buffer_stats = smartlist_new(); - smartlist_add(circuits_for_buffer_stats, stats); + smartlist_add(circuits_for_buffer_stats, stat); } /** Remember cell statistics for circuit circ at time @@ -2410,7 +2427,7 @@ rep_hist_buffer_stats_add_circ(circuit_t *circ, time_t end_of_interval) return; start_of_interval = (circ->timestamp_created.tv_sec > start_of_buffer_stats_interval) ? - (time_t)circ->timestamp_created.tv_sec : + circ->timestamp_created.tv_sec : start_of_buffer_stats_interval; interval_length = (int) (end_of_interval - start_of_interval); if (interval_length <= 0) @@ -2459,7 +2476,7 @@ rep_hist_reset_buffer_stats(time_t now) if (!circuits_for_buffer_stats) circuits_for_buffer_stats = smartlist_new(); SMARTLIST_FOREACH(circuits_for_buffer_stats, circ_buffer_stats_t *, - stats, tor_free(stats)); + stat, tor_free(stat)); smartlist_clear(circuits_for_buffer_stats); start_of_buffer_stats_interval = now; } @@ -2500,15 +2517,15 @@ rep_hist_format_buffer_stats(time_t now) buffer_stats_compare_entries_); i = 0; SMARTLIST_FOREACH_BEGIN(circuits_for_buffer_stats, - circ_buffer_stats_t *, stats) + circ_buffer_stats_t *, stat) { int share = i++ * SHARES / number_of_circuits; - processed_cells[share] += stats->processed_cells; - queued_cells[share] += stats->mean_num_cells_in_queue; - time_in_queue[share] += stats->mean_time_cells_in_queue; + processed_cells[share] += stat->processed_cells; + queued_cells[share] += stat->mean_num_cells_in_queue; + time_in_queue[share] += stat->mean_time_cells_in_queue; circs_in_share[share]++; } - SMARTLIST_FOREACH_END(stats); + SMARTLIST_FOREACH_END(stat); } /* Write deciles to strings. */ @@ -2557,7 +2574,7 @@ rep_hist_format_buffer_stats(time_t now) processed_cells_string, queued_cells_string, time_in_queue_string, - CEIL_DIV(number_of_circuits, SHARES)); + (number_of_circuits + SHARES - 1) / SHARES); tor_free(processed_cells_string); tor_free(queued_cells_string); tor_free(time_in_queue_string); @@ -2573,6 +2590,7 @@ rep_hist_format_buffer_stats(time_t now) time_t rep_hist_buffer_stats_write(time_t now) { + circuit_t *circ; char *str = NULL; if (!start_of_buffer_stats_interval) @@ -2581,10 +2599,9 @@ rep_hist_buffer_stats_write(time_t now) goto done; /* Not ready to write */ /* Add open circuits to the history. */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { rep_hist_buffer_stats_add_circ(circ, now); } - SMARTLIST_FOREACH_END(circ); /* Generate history string. */ str = rep_hist_format_buffer_stats(now); @@ -2671,7 +2688,7 @@ rep_hist_format_desc_stats(time_t now) size = digestmap_size(served_descs); if (size > 0) { - vals = tor_calloc(size, sizeof(int)); + vals = tor_malloc(size * sizeof(int)); for (iter = digestmap_iter_init(served_descs); !digestmap_iter_done(iter); iter = digestmap_iter_next(served_descs, iter)) { @@ -2735,9 +2752,7 @@ rep_hist_desc_stats_write(time_t now) return start_of_served_descs_stats_interval + WRITE_STATS_INTERVAL; } -/** Called to note that we've served a given descriptor (by - * digest). Incrememnts the count of descriptors served, and the number - * of times we've served this descriptor. */ +/* DOCDOC rep_hist_note_desc_served */ void rep_hist_note_desc_served(const char * desc) { @@ -2827,13 +2842,13 @@ bidi_map_ent_hash(const bidi_map_entry_t *entry) } HT_PROTOTYPE(bidimap, bidi_map_entry_t, node, bidi_map_ent_hash, - bidi_map_ent_eq) -HT_GENERATE2(bidimap, bidi_map_entry_t, node, bidi_map_ent_hash, - bidi_map_ent_eq, 0.6, tor_reallocarray_, tor_free_) + bidi_map_ent_eq); +HT_GENERATE(bidimap, bidi_map_entry_t, node, bidi_map_ent_hash, + bidi_map_ent_eq, 0.6, malloc, realloc, free); /* DOCDOC bidi_map_free */ static void -bidi_map_free_all(void) +bidi_map_free(void) { bidi_map_entry_t **ptr, **next, *ent; for (ptr = HT_START(bidimap, &bidi_map); ptr; ptr = next) { @@ -2853,7 +2868,7 @@ rep_hist_reset_conn_stats(time_t now) mostly_read = 0; mostly_written = 0; both_read_and_written = 0; - bidi_map_free_all(); + bidi_map_free(); } /** Stop collecting connection stats in a way that we can re-start doing @@ -2973,11 +2988,11 @@ rep_hist_conn_stats_write(time_t now) } /** Internal statistics to track how many requests of each type of - * handshake we've received, and how many we've assigned to cpuworkers. - * Useful for seeing trends in cpu load. + * handshake we've received, and how many we've completed. Useful for + * seeing trends in cpu load. * @{ */ -STATIC int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0}; -STATIC int onion_handshakes_assigned[MAX_ONION_HANDSHAKE_TYPE+1] = {0}; +static int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0}; +static int onion_handshakes_completed[MAX_ONION_HANDSHAKE_TYPE+1] = {0}; /**@}*/ /** A new onionskin (using the type handshake) has arrived. */ @@ -2991,10 +3006,10 @@ rep_hist_note_circuit_handshake_requested(uint16_t type) /** We've sent an onionskin (using the type handshake) to a * cpuworker. */ void -rep_hist_note_circuit_handshake_assigned(uint16_t type) +rep_hist_note_circuit_handshake_completed(uint16_t type) { if (type <= MAX_ONION_HANDSHAKE_TYPE) - onion_handshakes_assigned[type]++; + onion_handshakes_completed[type]++; } /** Log our onionskin statistics since the last time we were called. */ @@ -3004,463 +3019,31 @@ rep_hist_log_circuit_handshake_stats(time_t now) (void)now; log_notice(LD_HEARTBEAT, "Circuit handshake stats since last time: " "%d/%d TAP, %d/%d NTor.", - onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_TAP], + onion_handshakes_completed[ONION_HANDSHAKE_TYPE_TAP], onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP], - onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_NTOR], + onion_handshakes_completed[ONION_HANDSHAKE_TYPE_NTOR], onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR]); - memset(onion_handshakes_assigned, 0, sizeof(onion_handshakes_assigned)); + memset(onion_handshakes_completed, 0, sizeof(onion_handshakes_completed)); memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested)); } -/* Hidden service statistics section */ - -/** Start of the current hidden service stats interval or 0 if we're - * not collecting hidden service statistics. */ -static time_t start_of_hs_stats_interval; - -/** Carries the various hidden service statistics, and any other - * information needed. */ -typedef struct hs_stats_t { - /** How many relay cells have we seen as rendezvous points? */ - uint64_t rp_relay_cells_seen; - - /** Set of unique public key digests we've seen this stat period - * (could also be implemented as sorted smartlist). */ - digestmap_t *onions_seen_this_period; -} hs_stats_t; - -/** Our statistics structure singleton. */ -static hs_stats_t *hs_stats = NULL; - -/** Allocate, initialize and return an hs_stats_t structure. */ -static hs_stats_t * -hs_stats_new(void) -{ - hs_stats_t *new_hs_stats = tor_malloc_zero(sizeof(hs_stats_t)); - new_hs_stats->onions_seen_this_period = digestmap_new(); - - return new_hs_stats; -} - -#define hs_stats_free(val) \ - FREE_AND_NULL(hs_stats_t, hs_stats_free_, (val)) - -/** Free an hs_stats_t structure. */ -static void -hs_stats_free_(hs_stats_t *victim_hs_stats) -{ - if (!victim_hs_stats) { - return; - } - - digestmap_free(victim_hs_stats->onions_seen_this_period, NULL); - tor_free(victim_hs_stats); -} - -/** Initialize hidden service statistics. */ -void -rep_hist_hs_stats_init(time_t now) -{ - if (!hs_stats) { - hs_stats = hs_stats_new(); - } - - start_of_hs_stats_interval = now; -} - -/** Clear history of hidden service statistics and set the measurement - * interval start to now. */ -static void -rep_hist_reset_hs_stats(time_t now) -{ - if (!hs_stats) { - hs_stats = hs_stats_new(); - } - - hs_stats->rp_relay_cells_seen = 0; - - digestmap_free(hs_stats->onions_seen_this_period, NULL); - hs_stats->onions_seen_this_period = digestmap_new(); - - start_of_hs_stats_interval = now; -} - -/** Stop collecting hidden service stats in a way that we can re-start - * doing so in rep_hist_buffer_stats_init(). */ -void -rep_hist_hs_stats_term(void) -{ - rep_hist_reset_hs_stats(0); -} - -/** We saw a new HS relay cell, Count it! */ -void -rep_hist_seen_new_rp_cell(void) -{ - if (!hs_stats) { - return; // We're not collecting stats - } - - hs_stats->rp_relay_cells_seen++; -} - -/** As HSDirs, we saw another hidden service with public key - * pubkey. Check whether we have counted it before, if not - * count it now! */ -void -rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey) -{ - char pubkey_hash[DIGEST_LEN]; - - if (!hs_stats) { - return; // We're not collecting stats - } - - /* Get the digest of the pubkey which will be used to detect whether - we've seen this hidden service before or not. */ - if (crypto_pk_get_digest(pubkey, pubkey_hash) < 0) { - /* This fail should not happen; key has been validated by - descriptor parsing code first. */ - return; - } - - /* Check if this is the first time we've seen this hidden - service. If it is, count it as new. */ - if (!digestmap_get(hs_stats->onions_seen_this_period, - pubkey_hash)) { - digestmap_set(hs_stats->onions_seen_this_period, - pubkey_hash, (void*)(uintptr_t)1); - } -} - -/* The number of cells that are supposed to be hidden from the adversary - * by adding noise from the Laplace distribution. This value, divided by - * EPSILON, is Laplace parameter b. It must be greather than 0. */ -#define REND_CELLS_DELTA_F 2048 -/* Security parameter for obfuscating number of cells with a value between - * ]0.0, 1.0]. Smaller values obfuscate observations more, but at the same - * time make statistics less usable. */ -#define REND_CELLS_EPSILON 0.3 -/* The number of cells that are supposed to be hidden from the adversary - * by rounding up to the next multiple of this number. */ -#define REND_CELLS_BIN_SIZE 1024 -/* The number of service identities that are supposed to be hidden from the - * adversary by adding noise from the Laplace distribution. This value, - * divided by EPSILON, is Laplace parameter b. It must be greater than 0. */ -#define ONIONS_SEEN_DELTA_F 8 -/* Security parameter for obfuscating number of service identities with a - * value between ]0.0, 1.0]. Smaller values obfuscate observations more, but - * at the same time make statistics less usable. */ -#define ONIONS_SEEN_EPSILON 0.3 -/* The number of service identities that are supposed to be hidden from - * the adversary by rounding up to the next multiple of this number. */ -#define ONIONS_SEEN_BIN_SIZE 8 - -/** Allocate and return a string containing hidden service stats that - * are meant to be placed in the extra-info descriptor. */ -static char * -rep_hist_format_hs_stats(time_t now) -{ - char t[ISO_TIME_LEN+1]; - char *hs_stats_string; - int64_t obfuscated_cells_seen; - int64_t obfuscated_onions_seen; - - uint64_t rounded_cells_seen - = round_uint64_to_next_multiple_of(hs_stats->rp_relay_cells_seen, - REND_CELLS_BIN_SIZE); - rounded_cells_seen = MIN(rounded_cells_seen, INT64_MAX); - obfuscated_cells_seen = add_laplace_noise((int64_t)rounded_cells_seen, - crypto_rand_double(), - REND_CELLS_DELTA_F, REND_CELLS_EPSILON); - - uint64_t rounded_onions_seen = - round_uint64_to_next_multiple_of((size_t)digestmap_size( - hs_stats->onions_seen_this_period), - ONIONS_SEEN_BIN_SIZE); - rounded_onions_seen = MIN(rounded_onions_seen, INT64_MAX); - obfuscated_onions_seen = add_laplace_noise((int64_t)rounded_onions_seen, - crypto_rand_double(), ONIONS_SEEN_DELTA_F, - ONIONS_SEEN_EPSILON); - - format_iso_time(t, now); - tor_asprintf(&hs_stats_string, "hidserv-stats-end %s (%d s)\n" - "hidserv-rend-relayed-cells "I64_FORMAT" delta_f=%d " - "epsilon=%.2f bin_size=%d\n" - "hidserv-dir-onions-seen "I64_FORMAT" delta_f=%d " - "epsilon=%.2f bin_size=%d\n", - t, (unsigned) (now - start_of_hs_stats_interval), - I64_PRINTF_ARG(obfuscated_cells_seen), REND_CELLS_DELTA_F, - REND_CELLS_EPSILON, REND_CELLS_BIN_SIZE, - I64_PRINTF_ARG(obfuscated_onions_seen), - ONIONS_SEEN_DELTA_F, - ONIONS_SEEN_EPSILON, ONIONS_SEEN_BIN_SIZE); - - return hs_stats_string; -} - -/** If 24 hours have passed since the beginning of the current HS - * stats period, write buffer stats to $DATADIR/stats/hidserv-stats - * (possibly overwriting an existing file) and reset counters. Return - * when we would next want to write buffer stats or 0 if we never want to - * write. */ -time_t -rep_hist_hs_stats_write(time_t now) -{ - char *str = NULL; - - if (!start_of_hs_stats_interval) { - return 0; /* Not initialized. */ - } - - if (start_of_hs_stats_interval + WRITE_STATS_INTERVAL > now) { - goto done; /* Not ready to write */ - } - - /* Generate history string. */ - str = rep_hist_format_hs_stats(now); - - /* Reset HS history. */ - rep_hist_reset_hs_stats(now); - - /* Try to write to disk. */ - if (!check_or_create_data_subdir("stats")) { - write_to_data_subdir("stats", "hidserv-stats", str, - "hidden service stats"); - } - - done: - tor_free(str); - return start_of_hs_stats_interval + WRITE_STATS_INTERVAL; -} - -static uint64_t link_proto_count[MAX_LINK_PROTO+1][2]; - -/** Note that we negotiated link protocol version link_proto, on - * a connection that started here iff started_here is true. - */ -void -rep_hist_note_negotiated_link_proto(unsigned link_proto, int started_here) -{ - started_here = !!started_here; /* force to 0 or 1 */ - if (link_proto > MAX_LINK_PROTO) { - log_warn(LD_BUG, "Can't log link protocol %u", link_proto); - return; - } - - link_proto_count[link_proto][started_here]++; -} - -/** - * Update the maximum count of total pending channel padding timers - * in this period. - */ -void -rep_hist_padding_count_timers(uint64_t num_timers) -{ - if (num_timers > padding_current.maximum_chanpad_timers) { - padding_current.maximum_chanpad_timers = num_timers; - } -} - -/** - * Count a cell that we sent for padding overhead statistics. - * - * RELAY_COMMAND_DROP and CELL_PADDING are accounted separately. Both should be - * counted for PADDING_TYPE_TOTAL. - */ -void -rep_hist_padding_count_write(padding_type_t type) -{ - switch (type) { - case PADDING_TYPE_DROP: - padding_current.write_drop_cell_count++; - break; - case PADDING_TYPE_CELL: - padding_current.write_pad_cell_count++; - break; - case PADDING_TYPE_TOTAL: - padding_current.write_cell_count++; - break; - case PADDING_TYPE_ENABLED_TOTAL: - padding_current.enabled_write_cell_count++; - break; - case PADDING_TYPE_ENABLED_CELL: - padding_current.enabled_write_pad_cell_count++; - break; - } -} - -/** - * Count a cell that we've received for padding overhead statistics. - * - * RELAY_COMMAND_DROP and CELL_PADDING are accounted separately. Both should be - * counted for PADDING_TYPE_TOTAL. - */ -void -rep_hist_padding_count_read(padding_type_t type) -{ - switch (type) { - case PADDING_TYPE_DROP: - padding_current.read_drop_cell_count++; - break; - case PADDING_TYPE_CELL: - padding_current.read_pad_cell_count++; - break; - case PADDING_TYPE_TOTAL: - padding_current.read_cell_count++; - break; - case PADDING_TYPE_ENABLED_TOTAL: - padding_current.enabled_read_cell_count++; - break; - case PADDING_TYPE_ENABLED_CELL: - padding_current.enabled_read_pad_cell_count++; - break; - } -} - -/** - * Reset our current padding statistics. Called once every 24 hours. - */ -void -rep_hist_reset_padding_counts(void) -{ - memset(&padding_current, 0, sizeof(padding_current)); -} - -/** - * Copy our current cell counts into a structure for listing in our - * extra-info descriptor. Also perform appropriate rounding and redaction. - * - * This function is called once every 24 hours. - */ -#define MIN_CELL_COUNTS_TO_PUBLISH 1 -#define ROUND_CELL_COUNTS_TO 10000 -void -rep_hist_prep_published_padding_counts(time_t now) -{ - memcpy(&padding_published, &padding_current, sizeof(padding_published)); - - if (padding_published.read_cell_count < MIN_CELL_COUNTS_TO_PUBLISH || - padding_published.write_cell_count < MIN_CELL_COUNTS_TO_PUBLISH) { - memset(&padding_published, 0, sizeof(padding_published)); - return; - } - - format_iso_time(padding_published.first_published_at, now); -#define ROUND_AND_SET_COUNT(x) (x) = round_uint64_to_next_multiple_of((x), \ - ROUND_CELL_COUNTS_TO) - ROUND_AND_SET_COUNT(padding_published.read_pad_cell_count); - ROUND_AND_SET_COUNT(padding_published.write_pad_cell_count); - ROUND_AND_SET_COUNT(padding_published.read_drop_cell_count); - ROUND_AND_SET_COUNT(padding_published.write_drop_cell_count); - ROUND_AND_SET_COUNT(padding_published.write_cell_count); - ROUND_AND_SET_COUNT(padding_published.read_cell_count); - ROUND_AND_SET_COUNT(padding_published.enabled_read_cell_count); - ROUND_AND_SET_COUNT(padding_published.enabled_read_pad_cell_count); - ROUND_AND_SET_COUNT(padding_published.enabled_write_cell_count); - ROUND_AND_SET_COUNT(padding_published.enabled_write_pad_cell_count); -#undef ROUND_AND_SET_COUNT -} - -/** - * Returns an allocated string for extra-info documents for publishing - * padding statistics from the last 24 hour interval. - */ -char * -rep_hist_get_padding_count_lines(void) -{ - char *result = NULL; - - if (!padding_published.read_cell_count || - !padding_published.write_cell_count) { - return NULL; - } - - tor_asprintf(&result, "padding-counts %s (%d s)" - " bin-size="U64_FORMAT - " write-drop="U64_FORMAT - " write-pad="U64_FORMAT - " write-total="U64_FORMAT - " read-drop="U64_FORMAT - " read-pad="U64_FORMAT - " read-total="U64_FORMAT - " enabled-read-pad="U64_FORMAT - " enabled-read-total="U64_FORMAT - " enabled-write-pad="U64_FORMAT - " enabled-write-total="U64_FORMAT - " max-chanpad-timers="U64_FORMAT - "\n", - padding_published.first_published_at, - REPHIST_CELL_PADDING_COUNTS_INTERVAL, - U64_PRINTF_ARG(ROUND_CELL_COUNTS_TO), - U64_PRINTF_ARG(padding_published.write_drop_cell_count), - U64_PRINTF_ARG(padding_published.write_pad_cell_count), - U64_PRINTF_ARG(padding_published.write_cell_count), - U64_PRINTF_ARG(padding_published.read_drop_cell_count), - U64_PRINTF_ARG(padding_published.read_pad_cell_count), - U64_PRINTF_ARG(padding_published.read_cell_count), - U64_PRINTF_ARG(padding_published.enabled_read_pad_cell_count), - U64_PRINTF_ARG(padding_published.enabled_read_cell_count), - U64_PRINTF_ARG(padding_published.enabled_write_pad_cell_count), - U64_PRINTF_ARG(padding_published.enabled_write_cell_count), - U64_PRINTF_ARG(padding_published.maximum_chanpad_timers) - ); - - return result; -} - -/** Log a heartbeat message explaining how many connections of each link - * protocol version we have used. - */ -void -rep_hist_log_link_protocol_counts(void) -{ - log_notice(LD_HEARTBEAT, - "Since startup, we have initiated " - U64_FORMAT" v1 connections, " - U64_FORMAT" v2 connections, " - U64_FORMAT" v3 connections, and " - U64_FORMAT" v4 connections; and received " - U64_FORMAT" v1 connections, " - U64_FORMAT" v2 connections, " - U64_FORMAT" v3 connections, and " - U64_FORMAT" v4 connections.", - U64_PRINTF_ARG(link_proto_count[1][1]), - U64_PRINTF_ARG(link_proto_count[2][1]), - U64_PRINTF_ARG(link_proto_count[3][1]), - U64_PRINTF_ARG(link_proto_count[4][1]), - U64_PRINTF_ARG(link_proto_count[1][0]), - U64_PRINTF_ARG(link_proto_count[2][0]), - U64_PRINTF_ARG(link_proto_count[3][0]), - U64_PRINTF_ARG(link_proto_count[4][0])); -} - /** Free all storage held by the OR/link history caches, by the * bandwidth history arrays, by the port history, or by statistics . */ void rep_hist_free_all(void) { - hs_stats_free(hs_stats); digestmap_free(history_map, free_or_history); - - bw_array_free(read_array); - read_array = NULL; - - bw_array_free(write_array); - write_array = NULL; - - bw_array_free(dir_read_array); - dir_read_array = NULL; - - bw_array_free(dir_write_array); - dir_write_array = NULL; - + tor_free(read_array); + tor_free(write_array); + tor_free(dir_read_array); + tor_free(dir_write_array); + tor_free(last_stability_doc); tor_free(exit_bytes_read); tor_free(exit_bytes_written); tor_free(exit_streams); - predicted_ports_free_all(); - bidi_map_free_all(); + built_last_stability_doc_at = 0; + predicted_ports_free(); + bidi_map_free(); if (circuits_for_buffer_stats) { SMARTLIST_FOREACH(circuits_for_buffer_stats, circ_buffer_stats_t *, s, @@ -3470,8 +3053,5 @@ rep_hist_free_all(void) } rep_hist_desc_stats_term(); total_descriptor_downloads = 0; - - tor_assert_nonfatal(rephist_total_alloc == 0); - tor_assert_nonfatal_once(rephist_total_num == 0); } diff --git a/src/tor/src/or/rephist.h b/src/tor/rephist.h similarity index 69% rename from src/tor/src/or/rephist.h rename to src/tor/rephist.h index 496e36686..de824749b 100644 --- a/src/tor/src/or/rephist.h +++ b/src/tor/rephist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -47,8 +47,8 @@ double rep_hist_get_stability(const char *id, time_t when); double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when); long rep_hist_get_weighted_time_known(const char *id, time_t when); int rep_hist_have_measured_enough_stability(void); +const char *rep_hist_get_router_stability_doc(time_t now); -void predicted_ports_init(void); void rep_hist_note_used_port(time_t now, uint16_t port); smartlist_t *rep_hist_get_predicted_ports(time_t now); void rep_hist_remove_predicted_ports(const smartlist_t *rmv_ports); @@ -60,7 +60,9 @@ int rep_hist_get_predicted_internal(time_t now, int *need_uptime, int any_predicted_circuits(time_t now); int rep_hist_circbuilding_dormant(time_t now); -int predicted_ports_prediction_time_remaining(time_t now); + +void note_crypto_pk_op(pk_op_t operation); +void dump_pk_ops(int severity); void rep_hist_exit_stats_init(time_t now); void rep_hist_reset_exit_stats(time_t now); @@ -95,53 +97,10 @@ time_t rep_hist_conn_stats_write(time_t now); void rep_hist_conn_stats_term(void); void rep_hist_note_circuit_handshake_requested(uint16_t type); -void rep_hist_note_circuit_handshake_assigned(uint16_t type); +void rep_hist_note_circuit_handshake_completed(uint16_t type); void rep_hist_log_circuit_handshake_stats(time_t now); -void rep_hist_hs_stats_init(time_t now); -void rep_hist_hs_stats_term(void); -time_t rep_hist_hs_stats_write(time_t now); -char *rep_hist_get_hs_stats_string(void); -void rep_hist_seen_new_rp_cell(void); -void rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey); - void rep_hist_free_all(void); -void rep_hist_note_negotiated_link_proto(unsigned link_proto, - int started_here); -void rep_hist_log_link_protocol_counts(void); - -extern uint64_t rephist_total_alloc; -extern uint32_t rephist_total_num; -#ifdef TOR_UNIT_TESTS -extern int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1]; -extern int onion_handshakes_assigned[MAX_ONION_HANDSHAKE_TYPE+1]; #endif -/** - * Represents the type of a cell for padding accounting - */ -typedef enum padding_type_t { - /** A RELAY_DROP cell */ - PADDING_TYPE_DROP, - /** A CELL_PADDING cell */ - PADDING_TYPE_CELL, - /** Total counts of padding and non-padding together */ - PADDING_TYPE_TOTAL, - /** Total cell counts for all padding-enabled channels */ - PADDING_TYPE_ENABLED_TOTAL, - /** CELL_PADDING counts for all padding-enabled channels */ - PADDING_TYPE_ENABLED_CELL -} padding_type_t; - -/** The amount of time over which the padding cell counts were counted */ -#define REPHIST_CELL_PADDING_COUNTS_INTERVAL (24*60*60) -void rep_hist_padding_count_read(padding_type_t type); -void rep_hist_padding_count_write(padding_type_t type); -char *rep_hist_get_padding_count_lines(void); -void rep_hist_reset_padding_counts(void); -void rep_hist_prep_published_padding_counts(time_t now); -void rep_hist_padding_count_timers(uint64_t num_timers); - -#endif /* !defined(TOR_REPHIST_H) */ - diff --git a/src/tor/src/or/replaycache.c b/src/tor/replaycache.c similarity index 77% rename from src/tor/src/or/replaycache.c rename to src/tor/replaycache.c index 4a56bfd7d..90f87c12d 100644 --- a/src/tor/src/or/replaycache.c +++ b/src/tor/replaycache.c @@ -1,22 +1,10 @@ - /* Copyright (c) 2012-2017, The Tor Project, Inc. */ + /* Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** +/* * \file replaycache.c * * \brief Self-scrubbing replay cache for rendservice.c - * - * To prevent replay attacks, hidden services need to recognize INTRODUCE2 - * cells that they've already seen, and drop them. If they didn't, then - * sending the same INTRODUCE2 cell over and over would force the hidden - * service to make a huge number of circuits to the same rendezvous - * point, aiding traffic analysis. - * - * (It's not that simple, actually. We only check for replays in the - * RSA-encrypted portion of the handshake, since the rest of the handshake is - * malleable.) - * - * This module is used from rendservice.c. */ #define REPLAYCACHE_PRIVATE @@ -28,14 +16,14 @@ */ void -replaycache_free_(replaycache_t *r) +replaycache_free(replaycache_t *r) { if (!r) { log_info(LD_BUG, "replaycache_free() called on NULL"); return; } - if (r->digests_seen) digest256map_free(r->digests_seen, tor_free_); + if (r->digests_seen) digestmap_free(r->digests_seen, tor_free_); tor_free(r); } @@ -66,7 +54,7 @@ replaycache_new(time_t horizon, time_t interval) r->scrub_interval = interval; r->scrubbed = 0; r->horizon = horizon; - r->digests_seen = digest256map_new(); + r->digests_seen = digestmap_new(); err: return r; @@ -81,7 +69,7 @@ replaycache_add_and_test_internal( time_t *elapsed) { int rv = 0; - uint8_t digest[DIGEST256_LEN]; + char digest[DIGEST_LEN]; time_t *access_time; /* sanity check */ @@ -92,10 +80,10 @@ replaycache_add_and_test_internal( } /* compute digest */ - crypto_digest256((char *)digest, (const char *)data, len, DIGEST_SHA256); + crypto_digest(digest, (const char *)data, len); /* check map */ - access_time = digest256map_get(r->digests_seen, digest); + access_time = digestmap_get(r->digests_seen, digest); /* seen before? */ if (access_time != NULL) { @@ -126,7 +114,7 @@ replaycache_add_and_test_internal( /* No, so no hit and update the digest map with the current time */ access_time = tor_malloc(sizeof(*access_time)); *access_time = present; - digest256map_set(r->digests_seen, digest, access_time); + digestmap_set(r->digests_seen, digest, access_time); } /* now scrub the cache if it's time */ @@ -142,8 +130,8 @@ replaycache_add_and_test_internal( STATIC void replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r) { - digest256map_iter_t *itr = NULL; - const uint8_t *digest; + digestmap_iter_t *itr = NULL; + const char *digest; void *valp; time_t *access_time; @@ -161,19 +149,19 @@ replaycache_scrub_if_needed_internal(time_t present, replaycache_t *r) if (r->horizon == 0) return; /* okay, scrub time */ - itr = digest256map_iter_init(r->digests_seen); - while (!digest256map_iter_done(itr)) { - digest256map_iter_get(itr, &digest, &valp); + itr = digestmap_iter_init(r->digests_seen); + while (!digestmap_iter_done(itr)) { + digestmap_iter_get(itr, &digest, &valp); access_time = (time_t *)valp; /* aged out yet? */ if (*access_time < present - r->horizon) { /* Advance the iterator and remove this one */ - itr = digest256map_iter_next_rmv(r->digests_seen, itr); + itr = digestmap_iter_next_rmv(r->digests_seen, itr); /* Free the value removed */ tor_free(access_time); } else { /* Just advance the iterator */ - itr = digest256map_iter_next(r->digests_seen, itr); + itr = digestmap_iter_next(r->digests_seen, itr); } } diff --git a/src/tor/src/or/replaycache.h b/src/tor/replaycache.h similarity index 80% rename from src/tor/src/or/replaycache.h rename to src/tor/replaycache.h index 81a8d907f..cd713fe89 100644 --- a/src/tor/src/or/replaycache.h +++ b/src/tor/replaycache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ +/* Copyright (c) 2012-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -26,16 +26,14 @@ struct replaycache_s { /* * Digest map: keys are digests, values are times the digest was last seen */ - digest256map_t *digests_seen; + digestmap_t *digests_seen; }; -#endif /* defined(REPLAYCACHE_PRIVATE) */ +#endif /* REPLAYCACHE_PRIVATE */ /* replaycache_t free/new */ -void replaycache_free_(replaycache_t *r); -#define replaycache_free(r) \ - FREE_AND_NULL(replaycache_t, replaycache_free_, (r)) +void replaycache_free(replaycache_t *r); replaycache_t * replaycache_new(time_t horizon, time_t interval); #ifdef REPLAYCACHE_PRIVATE @@ -53,7 +51,7 @@ STATIC int replaycache_add_and_test_internal( STATIC void replaycache_scrub_if_needed_internal( time_t present, replaycache_t *r); -#endif /* defined(REPLAYCACHE_PRIVATE) */ +#endif /* REPLAYCACHE_PRIVATE */ /* * replaycache_t methods @@ -64,5 +62,5 @@ int replaycache_add_test_and_elapsed( replaycache_t *r, const void *data, size_t len, time_t *elapsed); void replaycache_scrub_if_needed(replaycache_t *r); -#endif /* !defined(TOR_REPLAYCACHE_H) */ +#endif diff --git a/src/tor/src/or/router.c b/src/tor/router.c similarity index 67% rename from src/tor/src/or/router.c rename to src/tor/router.c index 9c053cad4..0391047bf 100644 --- a/src/tor/src/or/router.c +++ b/src/tor/router.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTER_PRIVATE @@ -19,43 +19,27 @@ #include "dns.h" #include "geoip.h" #include "hibernate.h" -#include "main.h" +#include "onion_main.h" #include "networkstatus.h" #include "nodelist.h" #include "policies.h" -#include "protover.h" #include "relay.h" #include "rephist.h" #include "router.h" -#include "routerkeys.h" #include "routerlist.h" #include "routerparse.h" #include "statefile.h" -#include "torcert.h" #include "transports.h" #include "routerset.h" /** * \file router.c - * \brief Miscellaneous relay functionality, including RSA key maintenance, - * generating and uploading server descriptors, picking an address to - * advertise, and so on. - * - * This module handles the job of deciding whether we are a Tor relay, and if - * so what kind. (Mostly through functions like server_mode() that inspect an - * or_options_t, but in some cases based on our own capabilities, such as when - * we are deciding whether to be a directory cache in - * router_has_bandwidth_to_be_dirserver().) - * - * Also in this module are the functions to generate our own routerinfo_t and - * extrainfo_t, and to encode those to signed strings for upload to the - * directory authorities. - * - * This module also handles key maintenance for RSA and Curve25519-ntor keys, - * and for our TLS context. (These functions should eventually move to - * routerkeys.c along with the code that handles Ed25519 keys now.) + * \brief OR functionality, including key maintenance, generating + * and uploading server descriptors, retrying OR connections. **/ +extern long stats_n_seconds_working; + /************************************************************/ /***** @@ -71,11 +55,13 @@ static crypto_pk_t *onionkey=NULL; /** Previous private onionskin decryption key: used to decode CREATE cells * generated by clients that have an older version of our descriptor. */ static crypto_pk_t *lastonionkey=NULL; +#ifdef CURVE25519_ENABLED /** Current private ntor secret key: used to perform the ntor handshake. */ static curve25519_keypair_t curve25519_onion_key; /** Previous private ntor secret key: used to perform the ntor handshake * with clients that have an older version of our descriptor. */ static curve25519_keypair_t last_curve25519_onion_key; +#endif /** Private server "identity key": used to sign directory info and TLS * certificates. Never changes. */ static crypto_pk_t *server_identitykey=NULL; @@ -148,51 +134,7 @@ dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last) tor_mutex_release(key_lock); } -/** Expire our old set of onion keys. This is done by setting - * last_curve25519_onion_key and lastonionkey to all zero's and NULL - * respectively. - * - * This function does not perform any grace period checks for the old onion - * keys. - */ -void -expire_old_onion_keys(void) -{ - char *fname = NULL; - - tor_mutex_acquire(key_lock); - - /* Free lastonionkey and set it to NULL. */ - if (lastonionkey) { - crypto_pk_free(lastonionkey); - lastonionkey = NULL; - } - - /* We zero out the keypair. See the tor_mem_is_zero() check made in - * construct_ntor_key_map() below. */ - memset(&last_curve25519_onion_key, 0, sizeof(last_curve25519_onion_key)); - - tor_mutex_release(key_lock); - - fname = get_keydir_fname("secret_onion_key.old"); - if (file_status(fname) == FN_FILE) { - if (tor_unlink(fname) != 0) { - log_warn(LD_FS, "Couldn't unlink old onion key file %s: %s", - fname, strerror(errno)); - } - } - tor_free(fname); - - fname = get_keydir_fname("secret_onion_key_ntor.old"); - if (file_status(fname) == FN_FILE) { - if (tor_unlink(fname) != 0) { - log_warn(LD_FS, "Couldn't unlink old ntor onion key file %s: %s", - fname, strerror(errno)); - } - } - tor_free(fname); -} - +#ifdef CURVE25519_ENABLED /** Return the current secret onion key for the ntor handshake. Must only * be called from the main thread. */ static const curve25519_keypair_t * @@ -233,12 +175,13 @@ ntor_key_map_free_helper(void *arg) } /** Release all storage from a keymap returned by construct_ntor_key_map. */ void -ntor_key_map_free_(di_digest256_map_t *map) +ntor_key_map_free(di_digest256_map_t *map) { if (!map) return; dimap_free(map, ntor_key_map_free_helper); } +#endif /** Return the time when the onion key was last set. This is either the time * when the process launched, or the time of the most recent key rotation since @@ -257,11 +200,7 @@ set_server_identity_key(crypto_pk_t *k) { crypto_pk_free(server_identitykey); server_identitykey = k; - if (crypto_pk_get_digest(server_identitykey, - server_identitykey_digest) < 0) { - log_err(LD_BUG, "Couldn't compute our own identity key digest."); - tor_assert(0); - } + crypto_pk_get_digest(server_identitykey, server_identitykey_digest); } /** Make sure that we have set up our identity keys to match or not match as @@ -269,8 +208,6 @@ set_server_identity_key(crypto_pk_t *k) static void assert_identity_keys_ok(void) { - if (1) - return; tor_assert(client_identitykey); if (public_server_mode(get_options())) { /* assert that we have set the client and server keys to be equal */ @@ -332,8 +269,8 @@ client_identity_key_is_set(void) /** Return the key certificate for this v3 (voting) authority, or NULL * if we have no such certificate. */ -MOCK_IMPL(authority_cert_t *, -get_my_v3_authority_cert, (void)) +authority_cert_t * +get_my_v3_authority_cert(void) { return authority_key_certificate; } @@ -376,11 +313,12 @@ rotate_onion_key(void) char *fname, *fname_prev; crypto_pk_t *prkey = NULL; or_state_t *state = get_or_state(); +#ifdef CURVE25519_ENABLED curve25519_keypair_t new_curve25519_keypair; +#endif time_t now; - fname = get_keydir_fname("secret_onion_key"); - fname_prev = get_keydir_fname("secret_onion_key.old"); - /* There isn't much point replacing an old key with an empty file */ + fname = get_datadir_fname2("keys", "secret_onion_key"); + fname_prev = get_datadir_fname2("keys", "secret_onion_key.old"); if (file_status(fname) == FN_FILE) { if (replace_file(fname, fname_prev)) goto error; @@ -397,13 +335,13 @@ rotate_onion_key(void) log_err(LD_FS,"Couldn't write generated onion key to \"%s\".", fname); goto error; } +#ifdef CURVE25519_ENABLED tor_free(fname); tor_free(fname_prev); - fname = get_keydir_fname("secret_onion_key_ntor"); - fname_prev = get_keydir_fname("secret_onion_key_ntor.old"); + fname = get_datadir_fname2("keys", "secret_onion_key_ntor"); + fname_prev = get_datadir_fname2("keys", "secret_onion_key_ntor.old"); if (curve25519_keypair_generate(&new_curve25519_keypair, 1) < 0) goto error; - /* There isn't much point replacing an old key with an empty file */ if (file_status(fname) == FN_FILE) { if (replace_file(fname, fname_prev)) goto error; @@ -413,15 +351,18 @@ rotate_onion_key(void) log_err(LD_FS,"Couldn't write curve25519 onion key to \"%s\".",fname); goto error; } +#endif log_info(LD_GENERAL, "Rotating onion key"); tor_mutex_acquire(key_lock); crypto_pk_free(lastonionkey); lastonionkey = onionkey; onionkey = prkey; +#ifdef CURVE25519_ENABLED memcpy(&last_curve25519_onion_key, &curve25519_onion_key, sizeof(curve25519_keypair_t)); memcpy(&curve25519_onion_key, &new_curve25519_keypair, sizeof(curve25519_keypair_t)); +#endif now = time(NULL); state->LastRotatedOnionKey = onionkey_set_at = now; tor_mutex_release(key_lock); @@ -433,40 +374,20 @@ rotate_onion_key(void) if (prkey) crypto_pk_free(prkey); done: +#ifdef CURVE25519_ENABLED memwipe(&new_curve25519_keypair, 0, sizeof(new_curve25519_keypair)); +#endif tor_free(fname); tor_free(fname_prev); } -/** Log greeting message that points to new relay lifecycle document the - * first time this function has been called. - */ -static void -log_new_relay_greeting(void) -{ - static int already_logged = 0; - - if (already_logged) - return; - - tor_log(LOG_NOTICE, LD_GENERAL, "You are running a new relay. " - "Thanks for helping the Tor network! If you wish to know " - "what will happen in the upcoming weeks regarding its usage, " - "have a look at https://blog.torproject.org/blog/lifecycle-of" - "-a-new-relay"); - - already_logged = 1; -} - /** Try to read an RSA key from fname. If fname doesn't exist * and generate is true, create a new RSA key and save it in * fname. Return the read/created key, or NULL on error. Log all - * errors at level severity. If log_greeting is non-zero and a - * new key was created, log_new_relay_greeting() is called. + * errors at level severity. */ crypto_pk_t * -init_key_from_file(const char *fname, int generate, int severity, - int log_greeting) +init_key_from_file(const char *fname, int generate, int severity) { crypto_pk_t *prkey = NULL; @@ -480,11 +401,7 @@ init_key_from_file(const char *fname, int generate, int severity, case FN_ERROR: tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname); goto error; - /* treat empty key files as if the file doesn't exist, and, - * if generate is set, replace the empty file in - * crypto_pk_write_private_key_to_filename() */ case FN_NOENT: - case FN_EMPTY: if (generate) { if (!have_lockfile()) { if (try_locking(get_options(), 0)<0) { @@ -508,17 +425,13 @@ init_key_from_file(const char *fname, int generate, int severity, goto error; } log_info(LD_GENERAL, "Generated key seems valid"); - if (log_greeting) { - log_new_relay_greeting(); - } if (crypto_pk_write_private_key_to_filename(prkey, fname)) { tor_log(severity, LD_FS, "Couldn't write generated key to \"%s\".", fname); goto error; } } else { - tor_log(severity, LD_GENERAL, "No key found in \"%s\"", fname); - goto error; + log_info(LD_GENERAL, "No key found in \"%s\"", fname); } return prkey; case FN_FILE: @@ -537,11 +450,12 @@ init_key_from_file(const char *fname, int generate, int severity, return NULL; } +#ifdef CURVE25519_ENABLED /** Load a curve25519 keypair from the file fname, writing it into - * keys_out. If the file isn't found, or is empty, and generate - * is true, create a new keypair and write it into the file. If there are - * errors, log them at level severity. Generate files using tag - * in their ASCII wrapper. */ + * keys_out. If the file isn't found and generate is true, + * create a new keypair and write it into the file. If there are errors, log + * them at level severity. Generate files using tag in their + * ASCII wrapper. */ static int init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, const char *fname, @@ -554,10 +468,7 @@ init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, case FN_ERROR: tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname); goto error; - /* treat empty key files as if the file doesn't exist, and, if generate - * is set, replace the empty file in curve25519_keypair_write_to_file() */ case FN_NOENT: - case FN_EMPTY: if (generate) { if (!have_lockfile()) { if (try_locking(get_options(), 0)<0) { @@ -577,7 +488,7 @@ init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, if (curve25519_keypair_write_to_file(keys_out, fname, tag)<0) { tor_log(severity, LD_FS, "Couldn't write generated key to \"%s\".", fname); - memwipe(keys_out, 0, sizeof(*keys_out)); + memset(keys_out, 0, sizeof(*keys_out)); goto error; } } else { @@ -608,6 +519,7 @@ init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, error: return -1; } +#endif /** Try to load the vote-signing private key and certificate for being a v3 * directory authority, and make sure they match. If legacy, load a @@ -624,15 +536,15 @@ load_authority_keyset(int legacy, crypto_pk_t **key_out, crypto_pk_t *signing_key = NULL; authority_cert_t *parsed = NULL; - fname = get_keydir_fname( + fname = get_datadir_fname2("keys", legacy ? "legacy_signing_key" : "authority_signing_key"); - signing_key = init_key_from_file(fname, 0, LOG_ERR, 0); + signing_key = init_key_from_file(fname, 0, LOG_INFO); if (!signing_key) { log_warn(LD_DIR, "No version 3 directory key found in %s", fname); goto done; } tor_free(fname); - fname = get_keydir_fname( + fname = get_datadir_fname2("keys", legacy ? "legacy_certificate" : "authority_certificate"); cert = read_file_to_str(fname, 0, NULL); if (!cert) { @@ -732,47 +644,6 @@ v3_authority_check_key_expiry(void) last_warned = now; } -/** Get the lifetime of an onion key in days. This value is defined by the - * network consesus parameter "onion-key-rotation-days". Always returns a value - * between MIN_ONION_KEY_LIFETIME_DAYS and - * MAX_ONION_KEY_LIFETIME_DAYS. - */ -static int -get_onion_key_rotation_days_(void) -{ - return networkstatus_get_param(NULL, - "onion-key-rotation-days", - DEFAULT_ONION_KEY_LIFETIME_DAYS, - MIN_ONION_KEY_LIFETIME_DAYS, - MAX_ONION_KEY_LIFETIME_DAYS); -} - -/** Get the current lifetime of an onion key in seconds. This value is defined - * by the network consesus parameter "onion-key-rotation-days", but the value - * is converted to seconds. - */ -int -get_onion_key_lifetime(void) -{ - return get_onion_key_rotation_days_()*24*60*60; -} - -/** Get the grace period of an onion key in seconds. This value is defined by - * the network consesus parameter "onion-key-grace-period-days", but the value - * is converted to seconds. - */ -int -get_onion_key_grace_period(void) -{ - int grace_period; - grace_period = networkstatus_get_param(NULL, - "onion-key-grace-period-days", - DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS, - MIN_ONION_KEY_GRACE_PERIOD_DAYS, - get_onion_key_rotation_days_()); - return grace_period*24*60*60; -} - /** Set up Tor's TLS contexts, based on our configuration and keys. Return 0 * on success, and -1 on failure. */ int @@ -783,12 +654,16 @@ router_initialize_tls_context(void) int lifetime = options->SSLKeyLifetime; if (public_server_mode(options)) flags |= TOR_TLS_CTX_IS_PUBLIC_SERVER; + if (options->TLSECGroup) { + if (!strcasecmp(options->TLSECGroup, "P256")) + flags |= TOR_TLS_CTX_USE_ECDHE_P256; + else if (!strcasecmp(options->TLSECGroup, "P224")) + flags |= TOR_TLS_CTX_USE_ECDHE_P224; + } if (!lifetime) { /* we should guess a good ssl cert lifetime */ /* choose between 5 and 365 days, and round to the day */ - unsigned int five_days = 5*24*3600; - unsigned int one_year = 365*24*3600; - lifetime = crypto_rand_int_range(five_days, one_year); + lifetime = 5*24*3600 + crypto_rand_int(361*24*3600); lifetime -= lifetime % (24*3600); if (crypto_rand_int(2)) { @@ -809,103 +684,6 @@ router_initialize_tls_context(void) (unsigned int)lifetime); } -/** Compute fingerprint (or hashed fingerprint if hashed is 1) and write - * it to 'fingerprint' (or 'hashed-fingerprint'). Return 0 on success, or - * -1 if Tor should die, - */ -STATIC int -router_write_fingerprint(int hashed) -{ - char *keydir = NULL, *cp = NULL; - const char *fname = hashed ? "hashed-fingerprint" : - "fingerprint"; - char fingerprint[FINGERPRINT_LEN+1]; - const or_options_t *options = get_options(); - char *fingerprint_line = NULL; - int result = -1; - - keydir = get_datadir_fname(fname); - log_info(LD_GENERAL,"Dumping %sfingerprint to \"%s\"...", - hashed ? "hashed " : "", keydir); - if (!hashed) { - if (crypto_pk_get_fingerprint(get_server_identity_key(), - fingerprint, 0) < 0) { - log_err(LD_GENERAL,"Error computing fingerprint"); - goto done; - } - } else { - if (crypto_pk_get_hashed_fingerprint(get_server_identity_key(), - fingerprint) < 0) { - log_err(LD_GENERAL,"Error computing hashed fingerprint"); - goto done; - } - } - - tor_asprintf(&fingerprint_line, "%s %s\n", options->Nickname, fingerprint); - - /* Check whether we need to write the (hashed-)fingerprint file. */ - - cp = read_file_to_str(keydir, RFTS_IGNORE_MISSING, NULL); - if (!cp || strcmp(cp, fingerprint_line)) { - if (write_str_to_file(keydir, fingerprint_line, 0)) { - log_err(LD_FS, "Error writing %sfingerprint line to file", - hashed ? "hashed " : ""); - goto done; - } - } - - log_notice(LD_GENERAL, "Your Tor %s identity key fingerprint is '%s %s'", - hashed ? "bridge's hashed" : "server's", options->Nickname, - fingerprint); - - result = 0; - done: - tor_free(cp); - tor_free(keydir); - tor_free(fingerprint_line); - return result; -} - -static int -init_keys_common(void) -{ - if (!key_lock) - key_lock = tor_mutex_new(); - - /* There are a couple of paths that put us here before we've asked - * openssl to initialize itself. */ - if (crypto_global_init(get_options()->HardwareAccel, - get_options()->AccelName, - get_options()->AccelDir)) { - log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); - return -1; - } - - return 0; -} - -int -init_keys_client(void) -{ - crypto_pk_t *prkey; - if (init_keys_common() < 0) - return -1; - - if (!(prkey = crypto_pk_new())) - return -1; - if (crypto_pk_generate_key(prkey)) { - crypto_pk_free(prkey); - return -1; - } - set_client_identity_key(prkey); - /* Create a TLS context. */ - if (router_initialize_tls_context() < 0) { - log_err(LD_GENERAL,"Error creating TLS context for Tor client."); - return -1; - } - return 0; -} - /** Initialize all OR private keys, and the TLS context, as necessary. * On OPs, this only initializes the tls context. Return 0 on success, * or -1 if Tor should die. @@ -914,10 +692,14 @@ int init_keys(void) { char *keydir; + char fingerprint[FINGERPRINT_LEN+1]; + /*nicknamefp\n\0 */ + char fingerprint_line[MAX_NICKNAME_LEN+FINGERPRINT_LEN+3]; const char *mydesc; crypto_pk_t *prkey; char digest[DIGEST_LEN]; char v3_digest[DIGEST_LEN]; + char *cp; const or_options_t *options = get_options(); dirinfo_type_t type; time_t now = time(NULL); @@ -925,16 +707,46 @@ init_keys(void) int v3_digest_set = 0; authority_cert_t *cert = NULL; + if (!key_lock) + key_lock = tor_mutex_new(); + + /* There are a couple of paths that put us here before we've asked + * openssl to initialize itself. */ + if (crypto_global_init(get_options()->HardwareAccel, + get_options()->AccelName, + get_options()->AccelDir)) { + log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); + return -1; + } + /* OP's don't need persistent keys; just make up an identity and * initialize the TLS context. */ if (!server_mode(options)) { - return init_keys_client(); + if (!(prkey = crypto_pk_new())) + return -1; + if (crypto_pk_generate_key(prkey)) { + crypto_pk_free(prkey); + return -1; + } + set_client_identity_key(prkey); + /* Create a TLS context. */ + if (router_initialize_tls_context() < 0) { + log_err(LD_GENERAL,"Error creating TLS context for Tor client."); + return -1; + } + return 0; } - if (init_keys_common() < 0) + /* Make sure DataDirectory exists, and is private. */ + if (check_private_dir(options->DataDirectory, CPD_CREATE, options->User)) { return -1; - - if (create_keys_directory(options) < 0) + } + /* Check the key directory. */ + keydir = get_datadir_fname("keys"); + if (check_private_dir(keydir, CPD_CREATE, options->User)) { + tor_free(keydir); return -1; + } + tor_free(keydir); /* 1a. Read v3 directory authority key/cert information. */ memset(v3_digest, 0, sizeof(v3_digest)); @@ -947,20 +759,16 @@ init_keys(void) } cert = get_my_v3_authority_cert(); if (cert) { - if (crypto_pk_get_digest(get_my_v3_authority_cert()->identity_key, - v3_digest) < 0) { - log_err(LD_BUG, "Couldn't compute my v3 authority identity key " - "digest."); - return -1; - } + crypto_pk_get_digest(get_my_v3_authority_cert()->identity_key, + v3_digest); v3_digest_set = 1; } } /* 1b. Read identity key. Make it if none is found. */ - keydir = get_keydir_fname("secret_id_key"); + keydir = get_datadir_fname2("keys", "secret_id_key"); log_info(LD_GENERAL,"Reading/making identity key \"%s\"...",keydir); - prkey = init_key_from_file(keydir, 1, LOG_ERR, 1); + prkey = init_key_from_file(keydir, 1, LOG_ERR); tor_free(keydir); if (!prkey) return -1; set_server_identity_key(prkey); @@ -980,15 +788,10 @@ init_keys(void) set_client_identity_key(prkey); } - /* 1d. Load all ed25519 keys */ - const int new_signing_key = load_ed_keys(options,now); - if (new_signing_key < 0) - return -1; - /* 2. Read onion key. Make it if none is found. */ - keydir = get_keydir_fname("secret_onion_key"); + keydir = get_datadir_fname2("keys", "secret_onion_key"); log_info(LD_GENERAL,"Reading/making onion key \"%s\"...",keydir); - prkey = init_key_from_file(keydir, 1, LOG_ERR, 1); + prkey = init_key_from_file(keydir, 1, LOG_ERR); tor_free(keydir); if (!prkey) return -1; set_onion_key(prkey); @@ -1004,45 +807,43 @@ init_keys(void) /* We have no LastRotatedOnionKey set; either we just created the key * or it's a holdover from 0.1.2.4-alpha-dev or earlier. In either case, * start the clock ticking now so that we will eventually rotate it even - * if we don't stay up for the full lifetime of an onion key. */ + * if we don't stay up for a full MIN_ONION_KEY_LIFETIME. */ state->LastRotatedOnionKey = onionkey_set_at = now; or_state_mark_dirty(state, options->AvoidDiskWrites ? time(NULL)+3600 : 0); } } - keydir = get_keydir_fname("secret_onion_key.old"); + keydir = get_datadir_fname2("keys", "secret_onion_key.old"); if (!lastonionkey && file_status(keydir) == FN_FILE) { - /* Load keys from non-empty files only. - * Missing old keys won't be replaced with freshly generated keys. */ - prkey = init_key_from_file(keydir, 0, LOG_ERR, 0); + prkey = init_key_from_file(keydir, 1, LOG_ERR); /* XXXX Why 1? */ if (prkey) lastonionkey = prkey; } tor_free(keydir); +#ifdef CURVE25519_ENABLED { /* 2b. Load curve25519 onion keys. */ int r; - keydir = get_keydir_fname("secret_onion_key_ntor"); + keydir = get_datadir_fname2("keys", "secret_onion_key_ntor"); r = init_curve25519_keypair_from_file(&curve25519_onion_key, keydir, 1, LOG_ERR, "onion"); tor_free(keydir); if (r<0) return -1; - keydir = get_keydir_fname("secret_onion_key_ntor.old"); + keydir = get_datadir_fname2("keys", "secret_onion_key_ntor.old"); if (tor_mem_is_zero((const char *) last_curve25519_onion_key.pubkey.public_key, CURVE25519_PUBKEY_LEN) && file_status(keydir) == FN_FILE) { - /* Load keys from non-empty files only. - * Missing old keys won't be replaced with freshly generated keys. */ init_curve25519_keypair_from_file(&last_curve25519_onion_key, keydir, 0, LOG_ERR, "onion"); } tor_free(keydir); } +#endif /* 3. Initialize link key and TLS context. */ if (router_initialize_tls_context() < 0) { @@ -1050,27 +851,21 @@ init_keys(void) return -1; } - /* 3b. Get an ed25519 link certificate. Note that we need to do this - * after we set up the TLS context */ - if (generate_ed_link_cert(options, now, new_signing_key > 0) < 0) { - log_err(LD_GENERAL,"Couldn't make link cert"); - return -1; - } - /* 4. Build our router descriptor. */ /* Must be called after keys are initialized. */ mydesc = router_get_my_descriptor(); - if (authdir_mode_v3(options)) { + if (authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL)) { const char *m = NULL; routerinfo_t *ri; /* We need to add our own fingerprint so it gets recognized. */ - if (dirserv_add_own_fingerprint(get_server_identity_key())) { - log_err(LD_GENERAL,"Error adding own fingerprint to set of relays"); + if (dirserv_add_own_fingerprint(options->Nickname, + get_server_identity_key())) { + log_err(LD_GENERAL,"Error adding own fingerprint to approved set"); return -1; } if (mydesc) { was_router_added_t added; - ri = router_parse_entry_from_string(mydesc, NULL, 1, 0, NULL, NULL); + ri = router_parse_entry_from_string(mydesc, NULL, 1, 0, NULL); if (!ri) { log_err(LD_GENERAL,"Generated a routerinfo we couldn't parse."); return -1; @@ -1094,16 +889,40 @@ init_keys(void) } } - /* 5. Dump fingerprint and possibly hashed fingerprint to files. */ - if (router_write_fingerprint(0)) { - log_err(LD_FS, "Error writing fingerprint to file"); + /* 5. Dump fingerprint to 'fingerprint' */ + keydir = get_datadir_fname("fingerprint"); + log_info(LD_GENERAL,"Dumping fingerprint to \"%s\"...",keydir); + if (crypto_pk_get_fingerprint(get_server_identity_key(), + fingerprint, 0) < 0) { + log_err(LD_GENERAL,"Error computing fingerprint"); + tor_free(keydir); return -1; } - if (!public_server_mode(options) && router_write_fingerprint(1)) { - log_err(LD_FS, "Error writing hashed fingerprint to file"); + tor_assert(strlen(options->Nickname) <= MAX_NICKNAME_LEN); + if (tor_snprintf(fingerprint_line, sizeof(fingerprint_line), + "%s %s\n",options->Nickname, fingerprint) < 0) { + log_err(LD_GENERAL,"Error writing fingerprint line"); + tor_free(keydir); return -1; } + /* Check whether we need to write the fingerprint file. */ + cp = NULL; + if (file_status(keydir) == FN_FILE) + cp = read_file_to_str(keydir, 0, NULL); + if (!cp || strcmp(cp, fingerprint_line)) { + if (write_str_to_file(keydir, fingerprint_line, 0)) { + log_err(LD_FS, "Error writing fingerprint line to file"); + tor_free(keydir); + tor_free(cp); + return -1; + } + } + tor_free(cp); + tor_free(keydir); + log_notice(LD_GENERAL, + "Your Tor server's identity key fingerprint is '%s %s'", + options->Nickname, fingerprint); if (!authdir_mode(options)) return 0; /* 6. [authdirserver only] load approved-routers file */ @@ -1113,16 +932,17 @@ init_keys(void) } /* 6b. [authdirserver only] add own key to approved directories. */ crypto_pk_get_digest(get_server_identity_key(), digest); - type = ((options->V3AuthoritativeDir ? + type = ((options->V1AuthoritativeDir ? V1_DIRINFO : NO_DIRINFO) | + (options->V3AuthoritativeDir ? (V3_DIRINFO|MICRODESC_DIRINFO|EXTRAINFO_DIRINFO) : NO_DIRINFO) | - (options->BridgeAuthoritativeDir ? BRIDGE_DIRINFO : NO_DIRINFO)); + (options->BridgeAuthoritativeDir ? BRIDGE_DIRINFO : NO_DIRINFO) | + (options->HSAuthoritativeDir ? HIDSERV_DIRINFO : NO_DIRINFO)); ds = router_get_trusteddirserver_by_digest(digest); if (!ds) { ds = trusted_dir_server_new(options->Nickname, NULL, router_get_advertised_dir_port(options, 0), router_get_advertised_or_port(options), - NULL, digest, v3_digest, type, 0.0); @@ -1150,8 +970,7 @@ init_keys(void) log_info(LD_DIR, "adding my own v3 cert"); if (trusted_dirs_load_certs_from_string( cert->cache_info.signed_descriptor_body, - TRUSTED_DIRS_CERTS_SRC_SELF, 0, - NULL)<0) { + TRUSTED_DIRS_CERTS_SRC_SELF, 0)<0) { log_warn(LD_DIR, "Unable to parse my own v3 cert! Failing."); return -1; } @@ -1176,117 +995,84 @@ router_reset_reachability(void) can_reach_or_port = can_reach_dir_port = 0; } -/** Return 1 if we won't do reachability checks, because: - * - AssumeReachable is set, or - * - the network is disabled. - * Otherwise, return 0. - */ -static int -router_reachability_checks_disabled(const or_options_t *options) -{ - return options->AssumeReachable || - net_is_disabled(); -} - -/** Return 0 if we need to do an ORPort reachability check, because: - * - no reachability check has been done yet, or - * - we've initiated reachability checks, but none have succeeded. - * Return 1 if we don't need to do an ORPort reachability check, because: - * - we've seen a successful reachability check, or - * - AssumeReachable is set, or - * - the network is disabled. - */ +/** Return 1 if ORPort is known reachable; else return 0. */ int -check_whether_orport_reachable(const or_options_t *options) +check_whether_orport_reachable(void) { - int reach_checks_disabled = router_reachability_checks_disabled(options); - return reach_checks_disabled || + const or_options_t *options = get_options(); + return options->AssumeReachable || can_reach_or_port; } -/** Return 0 if we need to do a DirPort reachability check, because: - * - no reachability check has been done yet, or - * - we've initiated reachability checks, but none have succeeded. - * Return 1 if we don't need to do a DirPort reachability check, because: - * - we've seen a successful reachability check, or - * - there is no DirPort set, or - * - AssumeReachable is set, or - * - the network is disabled. - */ +/** Return 1 if we don't have a dirport configured, or if it's reachable. */ int -check_whether_dirport_reachable(const or_options_t *options) +check_whether_dirport_reachable(void) { - int reach_checks_disabled = router_reachability_checks_disabled(options) || - !options->DirPort_set; - return reach_checks_disabled || + const or_options_t *options = get_options(); + return !options->DirPort_set || + options->AssumeReachable || + net_is_disabled() || can_reach_dir_port; } -/** The lower threshold of remaining bandwidth required to advertise (or - * automatically provide) directory services */ -/* XXX Should this be increased? */ -#define MIN_BW_TO_ADVERTISE_DIRSERVER 51200 - -/** Return true iff we have enough configured bandwidth to cache directory - * information. */ -static int -router_has_bandwidth_to_be_dirserver(const or_options_t *options) -{ - if (options->BandwidthRate < MIN_BW_TO_ADVERTISE_DIRSERVER) { - return 0; - } - if (options->RelayBandwidthRate > 0 && - options->RelayBandwidthRate < MIN_BW_TO_ADVERTISE_DIRSERVER) { - return 0; - } - return 1; -} - -/** Helper: Return 1 if we have sufficient resources for serving directory - * requests, return 0 otherwise. - * dir_port is either 0 or the configured DirPort number. - * If AccountingMax is set less than our advertised bandwidth, then don't - * serve requests. Likewise, if our advertised bandwidth is less than - * MIN_BW_TO_ADVERTISE_DIRSERVER, don't bother trying to serve requests. +/** Look at a variety of factors, and return 0 if we don't want to + * advertise the fact that we have a DirPort open. Else return the + * DirPort we want to advertise. + * + * Log a helpful message if we change our mind about whether to publish + * a DirPort. */ static int -router_should_be_directory_server(const or_options_t *options, int dir_port) +decide_to_advertise_dirport(const or_options_t *options, uint16_t dir_port) { static int advertising=1; /* start out assuming we will advertise */ int new_choice=1; const char *reason = NULL; - if (accounting_is_enabled(options) && - get_options()->AccountingRule != ACCT_IN) { + /* Section one: reasons to publish or not publish that aren't + * worth mentioning to the user, either because they're obvious + * or because they're normal behavior. */ + + if (!dir_port) /* short circuit the rest of the function */ + return 0; + if (authdir_mode(options)) /* always publish */ + return dir_port; + if (net_is_disabled()) + return 0; + if (!check_whether_dirport_reachable()) + return 0; + if (!router_get_advertised_dir_port(options, dir_port)) + return 0; + + /* Section two: reasons to publish or not publish that the user + * might find surprising. These are generally config options that + * make us choose not to publish. */ + + if (accounting_is_enabled(options)) { /* Don't spend bytes for directory traffic if we could end up hibernating, - * but allow DirPort otherwise. Some relay operators set AccountingMax - * because they're confused or to get statistics. Directory traffic has a - * much larger effect on output than input so there is no reason to turn it - * off if using AccountingRule in. */ + * but allow DirPort otherwise. Some people set AccountingMax because + * they're confused or to get statistics. */ int interval_length = accounting_get_interval_length(); uint32_t effective_bw = get_effective_bwrate(options); - uint64_t acc_bytes; if (!interval_length) { log_warn(LD_BUG, "An accounting interval is not allowed to be zero " "seconds long. Raising to 1."); interval_length = 1; } - log_info(LD_GENERAL, "Calculating whether to advertise %s: effective " + log_info(LD_GENERAL, "Calculating whether to disable dirport: effective " "bwrate: %u, AccountingMax: "U64_FORMAT", " - "accounting interval length %d", - dir_port ? "dirport" : "begindir", - effective_bw, U64_PRINTF_ARG(options->AccountingMax), + "accounting interval length %d", effective_bw, + U64_PRINTF_ARG(options->AccountingMax), interval_length); - - acc_bytes = options->AccountingMax; - if (get_options()->AccountingRule == ACCT_SUM) - acc_bytes /= 2; if (effective_bw >= - acc_bytes / interval_length) { + options->AccountingMax / interval_length) { new_choice = 0; reason = "AccountingMax enabled"; } - } else if (! router_has_bandwidth_to_be_dirserver(options)) { +#define MIN_BW_TO_ADVERTISE_DIRPORT 51200 + } else if (options->BandwidthRate < MIN_BW_TO_ADVERTISE_DIRPORT || + (options->RelayBandwidthRate > 0 && + options->RelayBandwidthRate < MIN_BW_TO_ADVERTISE_DIRPORT)) { /* if we're advertising a small amount */ new_choice = 0; reason = "BandwidthRate under 50KB"; @@ -1294,114 +1080,29 @@ router_should_be_directory_server(const or_options_t *options, int dir_port) if (advertising != new_choice) { if (new_choice == 1) { - if (dir_port > 0) - log_notice(LD_DIR, "Advertising DirPort as %d", dir_port); - else - log_notice(LD_DIR, "Advertising directory service support"); + log_notice(LD_DIR, "Advertising DirPort as %d", dir_port); } else { tor_assert(reason); - log_notice(LD_DIR, "Not advertising Dir%s (Reason: %s)", - dir_port ? "Port" : "ectory Service support", reason); + log_notice(LD_DIR, "Not advertising DirPort (Reason: %s)", reason); } advertising = new_choice; } - return advertising; -} - -/** Return 1 if we are configured to accept either relay or directory requests - * from clients and we aren't at risk of exceeding our bandwidth limits, thus - * we should be a directory server. If not, return 0. - */ -int -dir_server_mode(const or_options_t *options) -{ - if (!options->DirCache) - return 0; - return options->DirPort_set || - (server_mode(options) && router_has_bandwidth_to_be_dirserver(options)); -} - -/** Look at a variety of factors, and return 0 if we don't want to - * advertise the fact that we have a DirPort open or begindir support, else - * return 1. - * - * Where dir_port or supports_tunnelled_dir_requests are not relevant, they - * must be 0. - * - * Log a helpful message if we change our mind about whether to publish. - */ -static int -decide_to_advertise_dir_impl(const or_options_t *options, - uint16_t dir_port, - int supports_tunnelled_dir_requests) -{ - /* Part one: reasons to publish or not publish that aren't - * worth mentioning to the user, either because they're obvious - * or because they're normal behavior. */ - - /* short circuit the rest of the function */ - if (!dir_port && !supports_tunnelled_dir_requests) - return 0; - if (authdir_mode(options)) /* always publish */ - return 1; - if (net_is_disabled()) - return 0; - if (dir_port && !router_get_advertised_dir_port(options, dir_port)) - return 0; - if (supports_tunnelled_dir_requests && - !router_get_advertised_or_port(options)) - return 0; - - /* Part two: consider config options that could make us choose to - * publish or not publish that the user might find surprising. */ - return router_should_be_directory_server(options, dir_port); -} - -/** Front-end to decide_to_advertise_dir_impl(): return 0 if we don't want to - * advertise the fact that we have a DirPort open, else return the - * DirPort we want to advertise. - */ -static int -decide_to_advertise_dirport(const or_options_t *options, uint16_t dir_port) -{ - /* supports_tunnelled_dir_requests is not relevant, pass 0 */ - return decide_to_advertise_dir_impl(options, dir_port, 0) ? dir_port : 0; -} - -/** Front-end to decide_to_advertise_dir_impl(): return 0 if we don't want to - * advertise the fact that we support begindir requests, else return 1. - */ -static int -decide_to_advertise_begindir(const or_options_t *options, - int supports_tunnelled_dir_requests) -{ - /* dir_port is not relevant, pass 0 */ - return decide_to_advertise_dir_impl(options, 0, - supports_tunnelled_dir_requests); + return advertising ? dir_port : 0; } /** Allocate and return a new extend_info_t that can be used to build - * a circuit to or through the router r. Uses the primary - * address of the router, so should only be called on a server. */ + * a circuit to or through the router r. Use the primary + * address of the router unless for_direct_connect is true, in + * which case the preferred address is used instead. */ static extend_info_t * extend_info_from_router(const routerinfo_t *r) { tor_addr_port_t ap; tor_assert(r); - /* Make sure we don't need to check address reachability */ - tor_assert_nonfatal(router_skip_or_reachability(get_options(), 0)); - - const ed25519_public_key_t *ed_id_key; - if (r->cache_info.signing_key_cert) - ed_id_key = &r->cache_info.signing_key_cert->signing_key; - else - ed_id_key = NULL; - router_get_prim_orport(r, &ap); return extend_info_new(r->nickname, r->cache_info.identity_digest, - ed_id_key, r->onion_pkey, r->onion_curve25519_pkey, &ap.addr, ap.port); } @@ -1421,9 +1122,9 @@ void consider_testing_reachability(int test_or, int test_dir) { const routerinfo_t *me = router_get_my_routerinfo(); - const or_options_t *options = get_options(); - int orport_reachable = check_whether_orport_reachable(options); + int orport_reachable = check_whether_orport_reachable(); tor_addr_t addr; + const or_options_t *options = get_options(); if (!me) return; @@ -1448,35 +1149,24 @@ consider_testing_reachability(int test_or, int test_dir) /* XXX IPv6 self testing */ log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.", !orport_reachable ? "reachability" : "bandwidth", - fmt_addr32(me->addr), me->or_port); + me->address, me->or_port); circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei, CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); extend_info_free(ei); } - /* XXX IPv6 self testing */ tor_addr_from_ipv4h(&addr, me->addr); - if (test_dir && !check_whether_dirport_reachable(options) && + if (test_dir && !check_whether_dirport_reachable() && !connection_get_by_type_addr_port_purpose( CONN_TYPE_DIR, &addr, me->dir_port, DIR_PURPOSE_FETCH_SERVERDESC)) { - tor_addr_port_t my_orport, my_dirport; - memcpy(&my_orport.addr, &addr, sizeof(addr)); - memcpy(&my_dirport.addr, &addr, sizeof(addr)); - my_orport.port = me->or_port; - my_dirport.port = me->dir_port; /* ask myself, via tor, for my server descriptor. */ - directory_request_t *req = - directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); - directory_request_set_or_addr_port(req, &my_orport); - directory_request_set_dir_addr_port(req, &my_dirport); - directory_request_set_directory_id_digest(req, - me->cache_info.identity_digest); - // ask via an anon circuit, connecting to our dirport. - directory_request_set_indirection(req, DIRIND_ANON_DIRPORT); - directory_request_set_resource(req, "authority.z"); - directory_initiate_request(req); - directory_request_free(req); + directory_initiate_command(me->address, &addr, + me->or_port, me->dir_port, + me->cache_info.identity_digest, + DIR_PURPOSE_FETCH_SERVERDESC, + ROUTER_PURPOSE_GENERAL, + DIRIND_ANON_DIRPORT, "authority.z", NULL, 0, 0); } } @@ -1485,25 +1175,16 @@ void router_orport_found_reachable(void) { const routerinfo_t *me = router_get_my_routerinfo(); - const or_options_t *options = get_options(); if (!can_reach_or_port && me) { - char *address = tor_dup_ip(me->addr); log_notice(LD_OR,"Self-testing indicates your ORPort is reachable from " "the outside. Excellent.%s", - options->PublishServerDescriptor_ != NO_DIRINFO - && check_whether_dirport_reachable(options) ? + get_options()->PublishServerDescriptor_ != NO_DIRINFO ? " Publishing server descriptor." : ""); can_reach_or_port = 1; mark_my_descriptor_dirty("ORPort found reachable"); - /* This is a significant enough change to upload immediately, - * at least in a test network */ - if (options->TestingTorNetwork == 1) { - reschedule_descriptor_update_check(); - } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED ORADDRESS=%s:%d", - address, me->or_port); - tor_free(address); + me->address, me->or_port); } } @@ -1512,27 +1193,15 @@ void router_dirport_found_reachable(void) { const routerinfo_t *me = router_get_my_routerinfo(); - const or_options_t *options = get_options(); if (!can_reach_dir_port && me) { - char *address = tor_dup_ip(me->addr); log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable " - "from the outside. Excellent.%s", - options->PublishServerDescriptor_ != NO_DIRINFO - && check_whether_orport_reachable(options) ? - " Publishing server descriptor." : ""); + "from the outside. Excellent."); can_reach_dir_port = 1; - if (decide_to_advertise_dirport(options, me->dir_port)) { + if (decide_to_advertise_dirport(get_options(), me->dir_port)) mark_my_descriptor_dirty("DirPort found reachable"); - /* This is a significant enough change to upload immediately, - * at least in a test network */ - if (options->TestingTorNetwork == 1) { - reschedule_descriptor_update_check(); - } - } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED DIRADDRESS=%s:%d", - address, me->dir_port); - tor_free(address); + me->address, me->dir_port); } } @@ -1567,8 +1236,7 @@ router_perform_bandwidth_test(int num_circs, time_t now) } /** Return true iff our network is in some sense disabled: either we're - * hibernating, entering hibernation, or the network is turned off with - * DisableNetwork. */ + * hibernating, entering hibernation, or */ int net_is_disabled(void) { @@ -1583,6 +1251,14 @@ authdir_mode(const or_options_t *options) { return options->AuthoritativeDir != 0; } +/** Return true iff we believe ourselves to be a v1 authoritative + * directory server. + */ +int +authdir_mode_v1(const or_options_t *options) +{ + return authdir_mode(options) && options->V1AuthoritativeDir != 0; +} /** Return true iff we believe ourselves to be a v3 authoritative * directory server. */ @@ -1591,19 +1267,33 @@ authdir_mode_v3(const or_options_t *options) { return authdir_mode(options) && options->V3AuthoritativeDir != 0; } +/** Return true iff we are a v1 or v3 directory authority. */ +int +authdir_mode_any_main(const or_options_t *options) +{ + return options->V1AuthoritativeDir || + options->V3AuthoritativeDir; +} +/** Return true if we believe ourselves to be any kind of + * authoritative directory beyond just a hidserv authority. */ +int +authdir_mode_any_nonhidserv(const or_options_t *options) +{ + return options->BridgeAuthoritativeDir || + authdir_mode_any_main(options); +} /** Return true iff we are an authoritative directory server that is * authoritative about receiving and serving descriptors of type - * purpose on its dirport. - */ + * purpose on its dirport. Use -1 for "any purpose". */ int authdir_mode_handles_descs(const or_options_t *options, int purpose) { - if (BUG(purpose < 0)) /* Deprecated. */ - return authdir_mode(options); + if (purpose < 0) + return authdir_mode_any_nonhidserv(options); else if (purpose == ROUTER_PURPOSE_GENERAL) - return authdir_mode_v3(options); + return authdir_mode_any_main(options); else if (purpose == ROUTER_PURPOSE_BRIDGE) - return authdir_mode_bridge(options); + return (options->BridgeAuthoritativeDir); else return 0; } @@ -1615,7 +1305,7 @@ authdir_mode_publishes_statuses(const or_options_t *options) { if (authdir_mode_bridge(options)) return 0; - return authdir_mode(options); + return authdir_mode_any_nonhidserv(options); } /** Return true iff we are an authoritative directory server that * tests reachability of the descriptors it learns about. @@ -1623,7 +1313,7 @@ authdir_mode_publishes_statuses(const or_options_t *options) int authdir_mode_tests_reachability(const or_options_t *options) { - return authdir_mode(options); + return authdir_mode_handles_descs(options, -1); } /** Return true iff we believe ourselves to be a bridge authoritative * directory server. @@ -1636,17 +1326,18 @@ authdir_mode_bridge(const or_options_t *options) /** Return true iff we are trying to be a server. */ -MOCK_IMPL(int, -server_mode,(const or_options_t *options)) +int +server_mode(const or_options_t *options) { if (options->ClientOnly) return 0; - return (options->ORPort_set); + /* XXXX024 I believe we can kill off ORListenAddress here.*/ + return (options->ORPort_set || options->ORListenAddress); } /** Return true iff we are trying to be a non-bridge server. */ -MOCK_IMPL(int, -public_server_mode,(const or_options_t *options)) +int +public_server_mode(const or_options_t *options) { if (!server_mode(options)) return 0; return (!options->BridgeRelay); @@ -1670,8 +1361,8 @@ static int server_is_advertised=0; /** Return true iff we have published our descriptor lately. */ -MOCK_IMPL(int, -advertised_server_mode,(void)) +int +advertised_server_mode(void) { return server_is_advertised; } @@ -1708,10 +1399,7 @@ proxy_mode(const or_options_t *options) * and * - We have ORPort set * and - * - We believe our ORPort and DirPort (if present) are reachable from - * the outside; or - * - We believe our ORPort is reachable from the outside, and we can't - * check our DirPort because the consensus has no exits; or + * - We believe we are reachable from the outside; or * - We are an authoritative directory server. */ static int @@ -1729,15 +1417,8 @@ decide_if_publishable_server(void) return 1; if (!router_get_advertised_or_port(options)) return 0; - if (!check_whether_orport_reachable(options)) - return 0; - if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL) { - /* All set: there are no exits in the consensus (maybe this is a tiny - * test network), so we can't check our DirPort reachability. */ - return 1; - } else { - return check_whether_dirport_reachable(options); - } + + return check_whether_orport_reachable(); } /** Initiate server descriptor upload as reasonable (if server is publishable, @@ -1851,7 +1532,7 @@ static const char *desc_gen_reason = NULL; * now. */ static time_t desc_clean_since = 0; /** Why did we mark the descriptor dirty? */ -static const char *desc_dirty_reason = "Tor just started"; +static const char *desc_dirty_reason = NULL; /** Boolean: do we need to regenerate the above? */ static int desc_needs_upload = 0; @@ -1908,8 +1589,7 @@ router_upload_dir_desc_to_dirservers(int force) int router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port) { - const routerinfo_t *me = router_get_my_routerinfo(); - if (!me) /* make sure routerinfo exists */ + if (!router_get_my_routerinfo()) /* make sure desc_routerinfo exists */ return -1; /* make sure it's resolved to something. this way we can't get a @@ -1917,22 +1597,21 @@ router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port) if (tor_addr_is_null(addr)) return -1; - /* look at router_get_my_routerinfo()->exit_policy for both the v4 and the - * v6 policies. The exit_policy field in router_get_my_routerinfo() is a - * bit unusual, in that it contains IPv6 and IPv6 entries. We don't want to - * look at router_get_my_routerinfo()->ipv6_exit_policy, since that's a port - * summary. */ + /* look at desc_routerinfo->exit_policy for both the v4 and the v6 + * policies. The exit_policy field in desc_routerinfo is a bit unusual, + * in that it contains IPv6 and IPv6 entries. We don't want to look + * at desc_routerinfio->ipv6_exit_policy, since that's a port summary. */ if ((tor_addr_family(addr) == AF_INET || tor_addr_family(addr) == AF_INET6)) { return compare_tor_addr_to_addr_policy(addr, port, - me->exit_policy) != ADDR_POLICY_ACCEPTED; + desc_routerinfo->exit_policy) != ADDR_POLICY_ACCEPTED; #if 0 } else if (tor_addr_family(addr) == AF_INET6) { return get_options()->IPv6Exit && desc_routerinfo->ipv6_exit_policy && compare_tor_addr_to_short_policy(addr, port, - me->ipv6_exit_policy) != ADDR_POLICY_ACCEPTED; -#endif /* 0 */ + desc_routerinfo->ipv6_exit_policy) != ADDR_POLICY_ACCEPTED; +#endif } else { return -1; } @@ -1940,13 +1619,13 @@ router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port) /** Return true iff my exit policy is reject *:*. Return -1 if we don't * have a descriptor */ -MOCK_IMPL(int, -router_my_exit_policy_is_reject_star,(void)) +int +router_my_exit_policy_is_reject_star(void) { - if (!router_get_my_routerinfo()) /* make sure routerinfo exists */ + if (!router_get_my_routerinfo()) /* make sure desc_routerinfo exists */ return -1; - return router_get_my_routerinfo()->policy_is_reject_star; + return desc_routerinfo->policy_is_reject_star; } /** Return true iff I'm a server and digest is equal to @@ -1986,10 +1665,22 @@ router_is_me(const routerinfo_t *router) return router_digest_is_me(router->cache_info.identity_digest); } +/** Return true iff fp is a hex fingerprint of my identity digest. */ +int +router_fingerprint_is_me(const char *fp) +{ + char digest[DIGEST_LEN]; + if (strlen(fp) == HEX_DIGEST_LEN && + base16_decode(digest, sizeof(digest), fp, HEX_DIGEST_LEN) == 0) + return router_digest_is_me(digest); + + return 0; +} + /** Return a routerinfo for this OR, rebuilding a fresh one if * necessary. Return NULL on error, or if called on an OP. */ -MOCK_IMPL(const routerinfo_t *, -router_get_my_routerinfo,(void)) +const routerinfo_t * +router_get_my_routerinfo(void) { if (!server_mode(get_options())) return NULL; @@ -2005,13 +1696,12 @@ const char * router_get_my_descriptor(void) { const char *body; - const routerinfo_t *me = router_get_my_routerinfo(); - if (! me) + if (!router_get_my_routerinfo()) return NULL; - tor_assert(me->cache_info.saved_location == SAVED_NOWHERE); - body = signed_descriptor_get_body(&me->cache_info); /* Make sure this is nul-terminated. */ - tor_assert(!body[me->cache_info.signed_descriptor_len]); + tor_assert(desc_routerinfo->cache_info.saved_location == SAVED_NOWHERE); + body = signed_descriptor_get_body(&desc_routerinfo->cache_info); + tor_assert(!body[desc_routerinfo->cache_info.signed_descriptor_len]); log_debug(LD_GENERAL,"my desc is '%s'", body); return body; } @@ -2045,122 +1735,31 @@ static int router_guess_address_from_dir_headers(uint32_t *guess); /** Make a current best guess at our address, either because * it's configured in torrc, or because we've learned it from * dirserver headers. Place the answer in *addr and return - * 0 on success, else return -1 if we have no guess. - * - * If cache_only is true, just return any cached answers, and - * don't try to get any new answers. - */ -MOCK_IMPL(int, -router_pick_published_address,(const or_options_t *options, uint32_t *addr, - int cache_only)) + * 0 on success, else return -1 if we have no guess. */ +int +router_pick_published_address(const or_options_t *options, uint32_t *addr) { - /* First, check the cached output from resolve_my_address(). */ *addr = get_last_resolved_addr(); - if (*addr) - return 0; - - /* Second, consider doing a resolve attempt right here. */ - if (!cache_only) { - if (resolve_my_address(LOG_INFO, options, addr, NULL, NULL) >= 0) { - log_info(LD_CONFIG,"Success: chose address '%s'.", fmt_addr32(*addr)); - return 0; + if (!*addr && + resolve_my_address(LOG_INFO, options, addr, NULL, NULL) < 0) { + log_info(LD_CONFIG, "Could not determine our address locally. " + "Checking if directory headers provide any hints."); + if (router_guess_address_from_dir_headers(addr) < 0) { + log_info(LD_CONFIG, "No hints from directory headers either. " + "Will try again later."); + return -1; } } - - /* Third, check the cached output from router_new_address_suggestion(). */ - if (router_guess_address_from_dir_headers(addr) >= 0) - return 0; - - /* We have no useful cached answers. Return failure. */ - return -1; -} - -/* Like router_check_descriptor_address_consistency, but specifically for the - * ORPort or DirPort. - * listener_type is either CONN_TYPE_OR_LISTENER or CONN_TYPE_DIR_LISTENER. */ -static void -router_check_descriptor_address_port_consistency(uint32_t ipv4h_desc_addr, - int listener_type) -{ - tor_assert(listener_type == CONN_TYPE_OR_LISTENER || - listener_type == CONN_TYPE_DIR_LISTENER); - - /* The first advertised Port may be the magic constant CFG_AUTO_PORT. - */ - int port_v4_cfg = get_first_advertised_port_by_type_af(listener_type, - AF_INET); - if (port_v4_cfg != 0 && - !port_exists_by_type_addr32h_port(listener_type, - ipv4h_desc_addr, port_v4_cfg, 1)) { - const tor_addr_t *port_addr = get_first_advertised_addr_by_type_af( - listener_type, - AF_INET); - /* If we're building a descriptor with no advertised address, - * something is terribly wrong. */ - tor_assert(port_addr); - - tor_addr_t desc_addr; - char port_addr_str[TOR_ADDR_BUF_LEN]; - char desc_addr_str[TOR_ADDR_BUF_LEN]; - - tor_addr_to_str(port_addr_str, port_addr, TOR_ADDR_BUF_LEN, 0); - - tor_addr_from_ipv4h(&desc_addr, ipv4h_desc_addr); - tor_addr_to_str(desc_addr_str, &desc_addr, TOR_ADDR_BUF_LEN, 0); - - const char *listener_str = (listener_type == CONN_TYPE_OR_LISTENER ? - "OR" : "Dir"); - log_warn(LD_CONFIG, "The IPv4 %sPort address %s does not match the " - "descriptor address %s. If you have a static public IPv4 " - "address, use 'Address ' and 'OutboundBindAddress " - "'. If you are behind a NAT, use two %sPort lines: " - "'%sPort NoListen' and '%sPort " - "NoAdvertise'.", - listener_str, port_addr_str, desc_addr_str, listener_str, - listener_str, listener_str); - } -} - -/* Tor relays only have one IPv4 address in the descriptor, which is derived - * from the Address torrc option, or guessed using various methods in - * router_pick_published_address(). - * Warn the operator if there is no ORPort on the descriptor address - * ipv4h_desc_addr. - * Warn the operator if there is no DirPort on the descriptor address. - * This catches a few common config errors: - * - operators who expect ORPorts and DirPorts to be advertised on the - * ports' listen addresses, rather than the torrc Address (or guessed - * addresses in the absence of an Address config). This includes - * operators who attempt to put their ORPort and DirPort on different - * addresses; - * - discrepancies between guessed addresses and configured listen - * addresses (when the Address option isn't set). - * If a listener is listening on all IPv4 addresses, it is assumed that it - * is listening on the configured Address, and no messages are logged. - * If an operators has specified NoAdvertise ORPorts in a NAT setting, - * no messages are logged, unless they have specified other advertised - * addresses. - * The message tells operators to configure an ORPort and DirPort that match - * the Address (using NoListen if needed). - */ -static void -router_check_descriptor_address_consistency(uint32_t ipv4h_desc_addr) -{ - router_check_descriptor_address_port_consistency(ipv4h_desc_addr, - CONN_TYPE_OR_LISTENER); - router_check_descriptor_address_port_consistency(ipv4h_desc_addr, - CONN_TYPE_DIR_LISTENER); + log_info(LD_CONFIG,"Success: chose address '%s'.", fmt_addr32(*addr)); + return 0; } -/** Build a fresh routerinfo, signed server descriptor, and extra-info document - * for this OR. Set r to the generated routerinfo, e to the generated - * extra-info document. Return 0 on success, -1 on temporary error. Failure to - * generate an extra-info document is not an error and is indicated by setting - * e to NULL. Caller is responsible for freeing generated documents if 0 is - * returned. +/** If force is true, or our descriptor is out-of-date, rebuild a fresh + * routerinfo, signed server descriptor, and extra-info document for this OR. + * Return 0 on success, -1 on temporary error. */ int -router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) +router_rebuild_descriptor(int force) { routerinfo_t *ri; extrainfo_t *ei; @@ -2169,42 +1768,45 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) int hibernating = we_are_hibernating(); const or_options_t *options = get_options(); - if (router_pick_published_address(options, &addr, 0) < 0) { - log_warn(LD_CONFIG, "Don't know my address while generating descriptor"); + if (desc_clean_since && !force) + return 0; + + if (router_pick_published_address(options, &addr) < 0 || + router_get_advertised_or_port(options) == 0) { + /* Stop trying to rebuild our descriptor every second. We'll + * learn that it's time to try again when ip_address_changed() + * marks it dirty. */ + desc_clean_since = time(NULL); return -1; } - /* Log a message if the address in the descriptor doesn't match the ORPort - * and DirPort addresses configured by the operator. */ - router_check_descriptor_address_consistency(addr); + log_info(LD_OR, "Rebuilding relay descriptor%s", force ? " (forced)" : ""); ri = tor_malloc_zero(sizeof(routerinfo_t)); ri->cache_info.routerlist_index = -1; + ri->address = tor_dup_ip(addr); ri->nickname = tor_strdup(options->Nickname); ri->addr = addr; ri->or_port = router_get_advertised_or_port(options); ri->dir_port = router_get_advertised_dir_port(options, 0); - ri->supports_tunnelled_dir_requests = - directory_permits_begindir_requests(options); ri->cache_info.published_on = time(NULL); ri->onion_pkey = crypto_pk_dup_key(get_onion_key()); /* must invoke from * main thread */ +#ifdef CURVE25519_ENABLED ri->onion_curve25519_pkey = tor_memdup(&get_current_curve25519_keypair()->pubkey, sizeof(curve25519_public_key_t)); +#endif /* For now, at most one IPv6 or-address is being advertised. */ { const port_cfg_t *ipv6_orport = NULL; SMARTLIST_FOREACH_BEGIN(get_configured_ports(), const port_cfg_t *, p) { if (p->type == CONN_TYPE_OR_LISTENER && - ! p->server_cfg.no_advertise && - ! p->server_cfg.bind_ipv4_only && + ! p->no_advertise && + ! p->bind_ipv4_only && tor_addr_family(&p->addr) == AF_INET6) { - /* Like IPv4, if the relay is configured using the default - * authorities, disallow internal IPs. Otherwise, allow them. */ - const int default_auth = using_default_dir_authorities(options); - if (! tor_addr_is_internal(&p->addr, 0) || ! default_auth) { + if (! tor_addr_is_internal(&p->addr, 0)) { ipv6_orport = p; break; } else { @@ -2212,7 +1814,7 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) log_warn(LD_CONFIG, "Unable to use configured IPv6 address \"%s\" in a " "descriptor. Skipping it. " - "Try specifying a globally reachable address explicitly.", + "Try specifying a globally reachable address explicitly. ", tor_addr_to_str(addrbuf, &p->addr, sizeof(addrbuf), 1)); } } @@ -2229,14 +1831,9 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) routerinfo_free(ri); return -1; } - ri->cache_info.signing_key_cert = - tor_cert_dup(get_master_signing_key_cert()); - get_platform_str(platform, sizeof(platform)); ri->platform = tor_strdup(platform); - ri->protocol_list = tor_strdup(protover_get_supported_protocols()); - /* compute ri->bandwidthrate as the min of various options */ ri->bandwidthrate = get_effective_bwrate(options); @@ -2249,12 +1846,14 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) /* DNS is screwed up; don't claim to be an exit. */ policies_exit_policy_append_reject_star(&ri->exit_policy); } else { - policies_parse_exit_policy_from_options(options,ri->addr,&ri->ipv6_addr, - &ri->exit_policy); + policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy, + options->IPv6Exit, + options->ExitPolicyRejectPrivate, + ri->address, !options->BridgeRelay); } ri->policy_is_reject_star = - policy_is_reject_star(ri->exit_policy, AF_INET, 1) && - policy_is_reject_star(ri->exit_policy, AF_INET6, 1); + policy_is_reject_star(ri->exit_policy, AF_INET) && + policy_is_reject_star(ri->exit_policy, AF_INET6); if (options->IPv6Exit) { char *p_tmp = policy_summarize(ri->exit_policy, AF_INET6); @@ -2263,18 +1862,26 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) tor_free(p_tmp); } +#if 0 + /* XXXX NM NM I belive this is safe to remove */ + if (authdir_mode(options)) + ri->is_valid = ri->is_named = 1; /* believe in yourself */ +#endif + if (options->MyFamily && ! options->BridgeRelay) { + smartlist_t *family; if (!warned_nonexistent_family) warned_nonexistent_family = smartlist_new(); + family = smartlist_new(); ri->declared_family = smartlist_new(); - config_line_t *family; - for (family = options->MyFamily; family; family = family->next) { - char *name = family->value; + smartlist_split_string(family, options->MyFamily, ",", + SPLIT_SKIP_SPACE|SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); + SMARTLIST_FOREACH_BEGIN(family, char *, name) { const node_t *member; if (!strcasecmp(name, options->Nickname)) - continue; /* Don't list ourself, that's redundant */ + goto skip; /* Don't list ourself, that's redundant */ else - member = node_get_by_nickname(name, 0); + member = node_get_by_nickname(name, 1); if (!member) { int is_legal = is_legal_nickname_or_hexdigest(name); if (!smartlist_contains_string(warned_nonexistent_family, name) && @@ -2288,10 +1895,11 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) log_warn(LD_CONFIG, "There is a router named \"%s\" in my " "declared family, but that isn't a legal nickname. " "Skipping it.", escaped(name)); - smartlist_add_strdup(warned_nonexistent_family, name); + smartlist_add(warned_nonexistent_family, tor_strdup(name)); } if (is_legal) { - smartlist_add_strdup(ri->declared_family, name); + smartlist_add(ri->declared_family, name); + name = NULL; } } else if (router_digest_is_me(member->identity)) { /* Don't list ourself in our own family; that's redundant */ @@ -2305,11 +1913,15 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) if (smartlist_contains_string(warned_nonexistent_family, name)) smartlist_string_remove(warned_nonexistent_family, name); } - } + skip: + tor_free(name); + } SMARTLIST_FOREACH_END(name); /* remove duplicates from the list */ smartlist_sort_strings(ri->declared_family); smartlist_uniq_strings(ri->declared_family); + + smartlist_free(family); } /* Now generate the extrainfo. */ @@ -2317,14 +1929,10 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) ei->cache_info.is_extrainfo = 1; strlcpy(ei->nickname, get_options()->Nickname, sizeof(ei->nickname)); ei->cache_info.published_on = ri->cache_info.published_on; - ei->cache_info.signing_key_cert = - tor_cert_dup(get_master_signing_key_cert()); - memcpy(ei->cache_info.identity_digest, ri->cache_info.identity_digest, DIGEST_LEN); if (extrainfo_dump_to_string(&ei->cache_info.signed_descriptor_body, - ei, get_server_identity_key(), - get_master_signing_keypair()) < 0) { + ei, get_server_identity_key()) < 0) { log_warn(LD_BUG, "Couldn't generate extra-info descriptor."); extrainfo_free(ei); ei = NULL; @@ -2334,10 +1942,6 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) router_get_extrainfo_hash(ei->cache_info.signed_descriptor_body, ei->cache_info.signed_descriptor_len, ei->cache_info.signed_descriptor_digest); - crypto_digest256((char*) ei->digest256, - ei->cache_info.signed_descriptor_body, - ei->cache_info.signed_descriptor_len, - DIGEST_SHA256); } /* Now finish the router descriptor. */ @@ -2345,18 +1949,12 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) memcpy(ri->cache_info.extra_info_digest, ei->cache_info.signed_descriptor_digest, DIGEST_LEN); - memcpy(ri->cache_info.extra_info_digest256, - ei->digest256, - DIGEST256_LEN); } else { /* ri was allocated with tor_malloc_zero, so there is no need to * zero ri->cache_info.extra_info_digest here. */ } - if (! (ri->cache_info.signed_descriptor_body = - router_dump_router_to_string(ri, get_server_identity_key(), - get_onion_key(), - get_current_curve25519_keypair(), - get_master_signing_keypair())) ) { + if (! (ri->cache_info.signed_descriptor_body = router_dump_router_to_string( + ri, get_server_identity_key()))) { log_warn(LD_BUG, "Couldn't generate router descriptor."); routerinfo_free(ri); extrainfo_free(ei); @@ -2386,44 +1984,7 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e) ri->cache_info.signed_descriptor_digest); if (ei) { - tor_assert(! - routerinfo_incompatible_with_extrainfo(ri->identity_pkey, ei, - &ri->cache_info, NULL)); - } - - *r = ri; - *e = ei; - return 0; -} - -/** If force is true, or our descriptor is out-of-date, rebuild a fresh - * routerinfo, signed server descriptor, and extra-info document for this OR. - * Return 0 on success, -1 on temporary error. - */ -int -router_rebuild_descriptor(int force) -{ - routerinfo_t *ri; - extrainfo_t *ei; - uint32_t addr; - const or_options_t *options = get_options(); - - if (desc_clean_since && !force) - return 0; - - if (router_pick_published_address(options, &addr, 0) < 0 || - router_get_advertised_or_port(options) == 0) { - /* Stop trying to rebuild our descriptor every second. We'll - * learn that it's time to try again when ip_address_changed() - * marks it dirty. */ - desc_clean_since = time(NULL); - return -1; - } - - log_info(LD_OR, "Rebuilding relay descriptor%s", force ? " (forced)" : ""); - - if (router_build_fresh_descriptor(&ri, &ei) < 0) { - return -1; + tor_assert(! routerinfo_incompatible_with_extrainfo(ri, ei, NULL, NULL)); } routerinfo_free(desc_routerinfo); @@ -2498,9 +2059,8 @@ mark_my_descriptor_dirty(const char *reason) } /** How frequently will we republish our descriptor because of large (factor - * of 2) shifts in estimated bandwidth? Note: We don't use this constant - * if our previous bandwidth estimate was exactly 0. */ -#define MAX_BANDWIDTH_CHANGE_FREQ (3*60*60) + * of 2) shifts in estimated bandwidth? */ +#define MAX_BANDWIDTH_CHANGE_FREQ (20*60) /** Check whether bandwidth has changed a lot since the last time we announced * bandwidth. If so, mark our descriptor dirty. */ @@ -2509,15 +2069,15 @@ check_descriptor_bandwidth_changed(time_t now) { static time_t last_changed = 0; uint64_t prev, cur; - if (!router_get_my_routerinfo()) + if (!desc_routerinfo) return; - prev = router_get_my_routerinfo()->bandwidthcapacity; + prev = desc_routerinfo->bandwidthcapacity; cur = we_are_hibernating() ? 0 : rep_hist_bandwidth_assess(); if ((prev != cur && (!prev || !cur)) || cur > prev*2 || cur < prev/2) { - if (last_changed+MAX_BANDWIDTH_CHANGE_FREQ < now || !prev) { + if (last_changed+MAX_BANDWIDTH_CHANGE_FREQ < now) { log_info(LD_GENERAL, "Measured bandwidth has changed; rebuilding descriptor."); mark_my_descriptor_dirty("bandwidth has changed"); @@ -2566,11 +2126,11 @@ check_descriptor_ipaddress_changed(time_t now) (void) now; - if (router_get_my_routerinfo() == NULL) + if (!desc_routerinfo) return; /* XXXX ipv6 */ - prev = router_get_my_routerinfo()->addr; + prev = desc_routerinfo->addr; if (resolve_my_address(LOG_INFO, options, &cur, &method, &hostname) < 0) { log_info(LD_CONFIG,"options->Address didn't resolve into an IP."); return; @@ -2642,7 +2202,7 @@ router_new_address_suggestion(const char *suggestion, if (tor_addr_eq(&d_conn->base_.addr, &addr)) { /* Don't believe anybody who says our IP is their IP. */ log_debug(LD_DIR, "A directory server told us our IP address is %s, " - "but they are just reporting their own IP address. Ignoring.", + "but he's just reporting his own IP address. Ignoring.", suggestion); return; } @@ -2699,30 +2259,23 @@ get_platform_str(char *platform, size_t len) */ char * router_dump_router_to_string(routerinfo_t *router, - const crypto_pk_t *ident_key, - const crypto_pk_t *tap_key, - const curve25519_keypair_t *ntor_keypair, - const ed25519_keypair_t *signing_keypair) + crypto_pk_t *ident_key) { - char *address = NULL; + /* XXXX025 Make this look entirely at its arguments, and not at globals. + */ char *onion_pkey = NULL; /* Onion key, PEM-encoded. */ char *identity_pkey = NULL; /* Identity key, PEM-encoded. */ - char digest[DIGEST256_LEN]; + char digest[DIGEST_LEN]; char published[ISO_TIME_LEN+1]; char fingerprint[FINGERPRINT_LEN+1]; - char *extra_info_line = NULL; + int has_extra_info_digest; + char extra_info_digest[HEX_DIGEST_LEN+1]; size_t onion_pkeylen, identity_pkeylen; char *family_line = NULL; char *extra_or_address = NULL; const or_options_t *options = get_options(); smartlist_t *chunks = NULL; char *output = NULL; - const int emit_ed_sigs = signing_keypair && - router->cache_info.signing_key_cert; - char *ed_cert_line = NULL; - char *rsa_tap_cc_line = NULL; - char *ntor_cc_line = NULL; - char *proto_line = NULL; /* Make sure the identity key matches the one in the routerinfo. */ if (!crypto_pk_eq_keys(ident_key, router->identity_pkey)) { @@ -2730,16 +2283,6 @@ router_dump_router_to_string(routerinfo_t *router, "match router's public key!"); goto err; } - if (emit_ed_sigs) { - if (!router->cache_info.signing_key_cert->signing_key_included || - !ed25519_pubkey_eq(&router->cache_info.signing_key_cert->signed_key, - &signing_keypair->pubkey)) { - log_warn(LD_BUG, "Tried to sign a router descriptor with a mismatched " - "ed25519 key chain %d", - router->cache_info.signing_key_cert->signing_key_included); - goto err; - } - } /* record our fingerprint, so we can include it in the descriptor */ if (crypto_pk_get_fingerprint(router->identity_pkey, fingerprint, 1)<0) { @@ -2747,30 +2290,6 @@ router_dump_router_to_string(routerinfo_t *router, goto err; } - if (emit_ed_sigs) { - /* Encode ed25519 signing cert */ - char ed_cert_base64[256]; - char ed_fp_base64[ED25519_BASE64_LEN+1]; - if (base64_encode(ed_cert_base64, sizeof(ed_cert_base64), - (const char*)router->cache_info.signing_key_cert->encoded, - router->cache_info.signing_key_cert->encoded_len, - BASE64_ENCODE_MULTILINE) < 0) { - log_err(LD_BUG,"Couldn't base64-encode signing key certificate!"); - goto err; - } - if (ed25519_public_to_base64(ed_fp_base64, - &router->cache_info.signing_key_cert->signing_key)<0) { - log_err(LD_BUG,"Couldn't base64-encode identity key\n"); - goto err; - } - tor_asprintf(&ed_cert_line, "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "%s" - "-----END ED25519 CERT-----\n" - "master-key-ed25519 %s\n", - ed_cert_base64, ed_fp_base64); - } - /* PEM-encode the onion key */ if (crypto_pk_write_public_key_to_string(router->onion_pkey, &onion_pkey,&onion_pkeylen)<0) { @@ -2785,69 +2304,6 @@ router_dump_router_to_string(routerinfo_t *router, goto err; } - /* Cross-certify with RSA key */ - if (tap_key && router->cache_info.signing_key_cert && - router->cache_info.signing_key_cert->signing_key_included) { - char buf[256]; - int tap_cc_len = 0; - uint8_t *tap_cc = - make_tap_onion_key_crosscert(tap_key, - &router->cache_info.signing_key_cert->signing_key, - router->identity_pkey, - &tap_cc_len); - if (!tap_cc) { - log_warn(LD_BUG,"make_tap_onion_key_crosscert failed!"); - goto err; - } - - if (base64_encode(buf, sizeof(buf), (const char*)tap_cc, tap_cc_len, - BASE64_ENCODE_MULTILINE) < 0) { - log_warn(LD_BUG,"base64_encode(rsa_crosscert) failed!"); - tor_free(tap_cc); - goto err; - } - tor_free(tap_cc); - - tor_asprintf(&rsa_tap_cc_line, - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "%s" - "-----END CROSSCERT-----\n", buf); - } - - /* Cross-certify with onion keys */ - if (ntor_keypair && router->cache_info.signing_key_cert && - router->cache_info.signing_key_cert->signing_key_included) { - int sign = 0; - char buf[256]; - /* XXXX Base the expiration date on the actual onion key expiration time?*/ - tor_cert_t *cert = - make_ntor_onion_key_crosscert(ntor_keypair, - &router->cache_info.signing_key_cert->signing_key, - router->cache_info.published_on, - get_onion_key_lifetime(), &sign); - if (!cert) { - log_warn(LD_BUG,"make_ntor_onion_key_crosscert failed!"); - goto err; - } - tor_assert(sign == 0 || sign == 1); - - if (base64_encode(buf, sizeof(buf), - (const char*)cert->encoded, cert->encoded_len, - BASE64_ENCODE_MULTILINE)<0) { - log_warn(LD_BUG,"base64_encode(ntor_crosscert) failed!"); - tor_cert_free(cert); - goto err; - } - tor_cert_free(cert); - - tor_asprintf(&ntor_cc_line, - "ntor-onion-key-crosscert %d\n" - "-----BEGIN ED25519 CERT-----\n" - "%s" - "-----END ED25519 CERT-----\n", sign, buf); - } - /* Encode the publication time. */ format_iso_time(published, router->cache_info.published_on); @@ -2860,19 +2316,12 @@ router_dump_router_to_string(routerinfo_t *router, family_line = tor_strdup(""); } - if (!tor_digest_is_zero(router->cache_info.extra_info_digest)) { - char extra_info_digest[HEX_DIGEST_LEN+1]; + has_extra_info_digest = + ! tor_digest_is_zero(router->cache_info.extra_info_digest); + + if (has_extra_info_digest) { base16_encode(extra_info_digest, sizeof(extra_info_digest), router->cache_info.extra_info_digest, DIGEST_LEN); - if (!tor_digest256_is_zero(router->cache_info.extra_info_digest256)) { - char d256_64[BASE64_DIGEST256_LEN+1]; - digest256_to_base64(d256_64, router->cache_info.extra_info_digest256); - tor_asprintf(&extra_info_line, "extra-info-digest %s %s\n", - extra_info_digest, d256_64); - } else { - tor_asprintf(&extra_info_line, "extra-info-digest %s\n", - extra_info_digest); - } } if (router->ipv6_orport && @@ -2887,54 +2336,42 @@ router_dump_router_to_string(routerinfo_t *router, } } - if (router->protocol_list) { - tor_asprintf(&proto_line, "proto %s\n", router->protocol_list); - } else { - proto_line = tor_strdup(""); - } - - address = tor_dup_ip(router->addr); chunks = smartlist_new(); - /* Generate the easy portion of the router descriptor. */ smartlist_add_asprintf(chunks, "router %s %s %d 0 %d\n" "%s" - "%s" "platform %s\n" - "%s" + "protocols Link 1 2 Circuit 1\n" "published %s\n" "fingerprint %s\n" "uptime %ld\n" "bandwidth %d %d %d\n" - "%s%s" + "%s%s%s%s" "onion-key\n%s" "signing-key\n%s" - "%s%s" - "%s%s%s", + "%s%s%s%s", router->nickname, - address, + router->address, router->or_port, decide_to_advertise_dirport(options, router->dir_port), - ed_cert_line ? ed_cert_line : "", extra_or_address ? extra_or_address : "", router->platform, - proto_line, published, fingerprint, stats_n_seconds_working, (int) router->bandwidthrate, (int) router->bandwidthburst, (int) router->bandwidthcapacity, - extra_info_line ? extra_info_line : "", - (options->DownloadExtraInfo || options->V3AuthoritativeDir) ? - "caches-extra-info\n" : "", + has_extra_info_digest ? "extra-info-digest " : "", + has_extra_info_digest ? extra_info_digest : "", + has_extra_info_digest ? "\n" : "", + options->DownloadExtraInfo ? "caches-extra-info\n" : "", onion_pkey, identity_pkey, - rsa_tap_cc_line ? rsa_tap_cc_line : "", - ntor_cc_line ? ntor_cc_line : "", family_line, we_are_hibernating() ? "hibernating 1\n" : "", - "hidden-service-dir\n"); + options->HidServDirectoryV2 ? "hidden-service-dir\n" : "", + options->AllowSingleHopExits ? "allow-single-hop-exits\n" : ""); if (options->ContactInfo && strlen(options->ContactInfo)) { const char *ci = options->ContactInfo; @@ -2943,41 +2380,34 @@ router_dump_router_to_string(routerinfo_t *router, smartlist_add_asprintf(chunks, "contact %s\n", ci); } - if (options->BridgeRelay) { - const char *bd; - if (options->BridgeDistribution && strlen(options->BridgeDistribution)) { - bd = options->BridgeDistribution; - } else { - bd = "any"; - } - if (strchr(bd, '\n') || strchr(bd, '\r')) - bd = escaped(bd); - smartlist_add_asprintf(chunks, "bridge-distribution-request %s\n", bd); - } - +#ifdef CURVE25519_ENABLED if (router->onion_curve25519_pkey) { char kbuf[128]; base64_encode(kbuf, sizeof(kbuf), (const char *)router->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN, BASE64_ENCODE_MULTILINE); + CURVE25519_PUBKEY_LEN); smartlist_add_asprintf(chunks, "ntor-onion-key %s", kbuf); - } else { - /* Authorities will start rejecting relays without ntor keys in 0.2.9 */ - log_err(LD_BUG, "A relay must have an ntor onion key"); - goto err; } +#endif /* Write the exit policy to the end of 's'. */ if (!router->exit_policy || !smartlist_len(router->exit_policy)) { - smartlist_add_strdup(chunks, "reject *:*\n"); + smartlist_add(chunks, tor_strdup("reject *:*\n")); } else if (router->exit_policy) { - char *exit_policy = router_dump_exit_policy_to_string(router,1,0); - - if (!exit_policy) - goto err; - - smartlist_add_asprintf(chunks, "%s\n", exit_policy); - tor_free(exit_policy); + int i; + for (i = 0; i < smartlist_len(router->exit_policy); ++i) { + char pbuf[POLICY_BUF_LEN]; + addr_policy_t *tmpe = smartlist_get(router->exit_policy, i); + int result; + if (tor_addr_family(&tmpe->addr) == AF_INET6) + continue; /* Don't include IPv6 parts of address policy */ + result = policy_write_item(pbuf, POLICY_BUF_LEN, tmpe, 1); + if (result < 0) { + log_warn(LD_BUG,"descriptor policy_write_item ran out of room!"); + goto err; + } + smartlist_add_asprintf(chunks, "%s\n", pbuf); + } } if (router->ipv6_exit_policy) { @@ -2989,33 +2419,12 @@ router_dump_router_to_string(routerinfo_t *router, tor_free(p6); } - if (decide_to_advertise_begindir(options, - router->supports_tunnelled_dir_requests)) { - smartlist_add_strdup(chunks, "tunnelled-dir-server\n"); - } - - /* Sign the descriptor with Ed25519 */ - if (emit_ed_sigs) { - smartlist_add_strdup(chunks, "router-sig-ed25519 "); - crypto_digest_smartlist_prefix(digest, DIGEST256_LEN, - ED_DESC_SIGNATURE_PREFIX, - chunks, "", DIGEST_SHA256); - ed25519_signature_t sig; - char buf[ED25519_SIG_BASE64_LEN+1]; - if (ed25519_sign(&sig, (const uint8_t*)digest, DIGEST256_LEN, - signing_keypair) < 0) - goto err; - if (ed25519_signature_to_base64(buf, &sig) < 0) - goto err; - - smartlist_add_asprintf(chunks, "%s\n", buf); - } - - /* Sign the descriptor with RSA */ - smartlist_add_strdup(chunks, "router-signature\n"); + /* Sign the descriptor */ + smartlist_add(chunks, tor_strdup("router-signature\n")); crypto_digest_smartlist(digest, DIGEST_LEN, chunks, "", DIGEST_SHA1); + note_crypto_pk_op(SIGN_RTR); { char *sig; if (!(sig = router_get_dirobj_signature(digest, DIGEST_LEN, ident_key))) { @@ -3026,7 +2435,7 @@ router_dump_router_to_string(routerinfo_t *router, } /* include a last '\n' */ - smartlist_add_strdup(chunks, "\n"); + smartlist_add(chunks, tor_strdup("\n")); output = smartlist_join_strings(chunks, "", 0, NULL); @@ -3036,7 +2445,7 @@ router_dump_router_to_string(routerinfo_t *router, const char *cp; routerinfo_t *ri_tmp; cp = s_dup = tor_strdup(output); - ri_tmp = router_parse_entry_from_string(cp, NULL, 1, 0, NULL, NULL); + ri_tmp = router_parse_entry_from_string(cp, NULL, 1, 0, NULL); if (!ri_tmp) { log_err(LD_BUG, "We just generated a router descriptor we can't parse."); @@ -3046,7 +2455,7 @@ router_dump_router_to_string(routerinfo_t *router, tor_free(s_dup); routerinfo_free(ri_tmp); } -#endif /* defined(DEBUG_ROUTER_DUMP_ROUTER_TO_STRING) */ +#endif goto done; @@ -3057,39 +2466,14 @@ router_dump_router_to_string(routerinfo_t *router, SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); } - tor_free(address); tor_free(family_line); tor_free(onion_pkey); tor_free(identity_pkey); tor_free(extra_or_address); - tor_free(ed_cert_line); - tor_free(rsa_tap_cc_line); - tor_free(ntor_cc_line); - tor_free(extra_info_line); - tor_free(proto_line); return output; } -/** - * OR only: Given router, produce a string with its exit policy. - * If include_ipv4 is true, include IPv4 entries. - * If include_ipv6 is true, include IPv6 entries. - */ -char * -router_dump_exit_policy_to_string(const routerinfo_t *router, - int include_ipv4, - int include_ipv6) -{ - if ((!router->exit_policy) || (router->policy_is_reject_star)) { - return tor_strdup("reject *:*"); - } - - return policy_dump_to_string(router->exit_policy, - include_ipv4, - include_ipv6); -} - /** Copy the primary (IPv4) OR port (IP address and TCP port) for * router into *ap_out. */ void @@ -3124,9 +2508,8 @@ router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport) * end_line, ensure that its timestamp is not more than 25 hours in * the past or more than 1 hour in the future with respect to now, * and write the file contents starting with that line to *out. - * Return 1 for success, 0 if the file does not exist or is empty, or -1 - * if the file does not contain a line matching these criteria or other - * failure. */ + * Return 1 for success, 0 if the file does not exist, or -1 if the file + * does not contain a line matching these criteria or other failure. */ static int load_stats_file(const char *filename, const char *end_line, time_t now, char **out) @@ -3160,9 +2543,7 @@ load_stats_file(const char *filename, const char *end_line, time_t now, notfound: tor_free(contents); break; - /* treat empty stats files as if the file doesn't exist */ case FN_NOENT: - case FN_EMPTY: r = 0; break; case FN_ERROR: @@ -3179,8 +2560,7 @@ load_stats_file(const char *filename, const char *end_line, time_t now, * success, negative on failure. */ int extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, - crypto_pk_t *ident_key, - const ed25519_keypair_t *signing_keypair) + crypto_pk_t *ident_key) { const or_options_t *options = get_options(); char identity[HEX_DIGEST_LEN+1]; @@ -3190,47 +2570,20 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, int result; static int write_stats_to_extrainfo = 1; char sig[DIROBJ_MAX_SIG_LEN+1]; - char *s = NULL, *pre, *contents, *cp, *s_dup = NULL; + char *s, *pre, *contents, *cp, *s_dup = NULL; time_t now = time(NULL); smartlist_t *chunks = smartlist_new(); extrainfo_t *ei_tmp = NULL; - const int emit_ed_sigs = signing_keypair && - extrainfo->cache_info.signing_key_cert; - char *ed_cert_line = NULL; base16_encode(identity, sizeof(identity), extrainfo->cache_info.identity_digest, DIGEST_LEN); format_iso_time(published, extrainfo->cache_info.published_on); bandwidth_usage = rep_hist_get_bandwidth_lines(); - if (emit_ed_sigs) { - if (!extrainfo->cache_info.signing_key_cert->signing_key_included || - !ed25519_pubkey_eq(&extrainfo->cache_info.signing_key_cert->signed_key, - &signing_keypair->pubkey)) { - log_warn(LD_BUG, "Tried to sign a extrainfo descriptor with a " - "mismatched ed25519 key chain %d", - extrainfo->cache_info.signing_key_cert->signing_key_included); - goto err; - } - char ed_cert_base64[256]; - if (base64_encode(ed_cert_base64, sizeof(ed_cert_base64), - (const char*)extrainfo->cache_info.signing_key_cert->encoded, - extrainfo->cache_info.signing_key_cert->encoded_len, - BASE64_ENCODE_MULTILINE) < 0) { - log_err(LD_BUG,"Couldn't base64-encode signing key certificate!"); - goto err; - } - tor_asprintf(&ed_cert_line, "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "%s" - "-----END ED25519 CERT-----\n", ed_cert_base64); - } else { - ed_cert_line = tor_strdup(""); - } - tor_asprintf(&pre, "extra-info %s %s\n%spublished %s\n%s", + tor_asprintf(&pre, "extra-info %s %s\npublished %s\n%s", extrainfo->nickname, identity, - ed_cert_line, published, bandwidth_usage); + tor_free(bandwidth_usage); smartlist_add(chunks, pre); if (geoip_is_loaded(AF_INET)) @@ -3247,11 +2600,6 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, "dirreq-stats-end", now, &contents) > 0) { smartlist_add(chunks, contents); } - if (options->HiddenServiceStatistics && - load_stats_file("stats"PATH_SEPARATOR"hidserv-stats", - "hidserv-stats-end", now, &contents) > 0) { - smartlist_add(chunks, contents); - } if (options->EntryStatistics && load_stats_file("stats"PATH_SEPARATOR"entry-stats", "entry-stats-end", now, &contents) > 0) { @@ -3274,12 +2622,6 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, } } - if (options->PaddingStatistics) { - contents = rep_hist_get_padding_count_lines(); - if (contents) - smartlist_add(chunks, contents); - } - /* Add information about the pluggable transports we support. */ if (options->ServerTransportPlugin) { char *pluggable_transports = pt_get_extra_info_descriptor_string(); @@ -3290,28 +2632,11 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, if (should_record_bridge_info(options) && write_stats_to_extrainfo) { const char *bridge_stats = geoip_get_bridge_stats_extrainfo(now); if (bridge_stats) { - smartlist_add_strdup(chunks, bridge_stats); + smartlist_add(chunks, tor_strdup(bridge_stats)); } } - if (emit_ed_sigs) { - char sha256_digest[DIGEST256_LEN]; - smartlist_add_strdup(chunks, "router-sig-ed25519 "); - crypto_digest_smartlist_prefix(sha256_digest, DIGEST256_LEN, - ED_DESC_SIGNATURE_PREFIX, - chunks, "", DIGEST_SHA256); - ed25519_signature_t ed_sig; - char buf[ED25519_SIG_BASE64_LEN+1]; - if (ed25519_sign(&ed_sig, (const uint8_t*)sha256_digest, DIGEST256_LEN, - signing_keypair) < 0) - goto err; - if (ed25519_signature_to_base64(buf, &ed_sig) < 0) - goto err; - - smartlist_add_asprintf(chunks, "%s\n", buf); - } - - smartlist_add_strdup(chunks, "router-signature\n"); + smartlist_add(chunks, tor_strdup("router-signature\n")); s = smartlist_join_strings(chunks, "", 0, NULL); while (strlen(s) > MAX_EXTRAINFO_UPLOAD_SIZE - DIROBJ_MAX_SIG_LEN) { @@ -3346,12 +2671,12 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, "descriptor."); goto err; } - smartlist_add_strdup(chunks, sig); + smartlist_add(chunks, tor_strdup(sig)); tor_free(s); s = smartlist_join_strings(chunks, "", 0, NULL); cp = s_dup = tor_strdup(s); - ei_tmp = extrainfo_parse_entry_from_string(cp, NULL, 1, NULL, NULL); + ei_tmp = extrainfo_parse_entry_from_string(cp, NULL, 1, NULL); if (!ei_tmp) { if (write_stats_to_extrainfo) { log_warn(LD_GENERAL, "We just generated an extra-info descriptor " @@ -3359,8 +2684,7 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, "adding statistics to this or any future " "extra-info descriptors."); write_stats_to_extrainfo = 0; - result = extrainfo_dump_to_string(s_out, extrainfo, ident_key, - signing_keypair); + result = extrainfo_dump_to_string(s_out, extrainfo, ident_key); goto done; } else { log_warn(LD_BUG, "We just generated an extrainfo descriptor we " @@ -3379,12 +2703,10 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, done: tor_free(s); - SMARTLIST_FOREACH(chunks, char *, chunk, tor_free(chunk)); + SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); tor_free(s_dup); - tor_free(ed_cert_line); extrainfo_free(ei_tmp); - tor_free(bandwidth_usage); return result; } @@ -3496,7 +2818,7 @@ router_get_description(char *buf, const routerinfo_t *ri) return ""; return format_node_description(buf, ri->cache_info.identity_digest, - 0, + router_is_named(ri), ri->nickname, NULL, ri->addr); @@ -3606,7 +2928,7 @@ routerstatus_describe(const routerstatus_t *rs) return routerstatus_get_description(buf, rs); } -/** Return a human-readable description of the extend_info_t ei. +/** Return a human-readable description of the extend_info_t ri. * * This function is not thread-safe. Each call to this function invalidates * previous values returned by this function. @@ -3622,16 +2944,21 @@ extend_info_describe(const extend_info_t *ei) * verbose representation of the identity of router. The format is: * A dollar sign. * The upper-case hexadecimal encoding of the SHA1 hash of router's identity. - * A "=" if the router is named (no longer implemented); a "~" if it is not. + * A "=" if the router is named; a "~" if it is not. * The router's nickname. **/ void router_get_verbose_nickname(char *buf, const routerinfo_t *router) { + const char *good_digest = networkstatus_get_router_digest_by_nickname( + router->nickname); + int is_named = good_digest && tor_memeq(good_digest, + router->cache_info.identity_digest, + DIGEST_LEN); buf[0] = '$'; base16_encode(buf+1, HEX_DIGEST_LEN+1, router->cache_info.identity_digest, DIGEST_LEN); - buf[1+HEX_DIGEST_LEN] = '~'; + buf[1+HEX_DIGEST_LEN] = is_named ? '=' : '~'; strlcpy(buf+1+HEX_DIGEST_LEN+1, router->nickname, MAX_NICKNAME_LEN+1); } @@ -3685,7 +3012,6 @@ router_free_all(void) crypto_pk_free(lastonionkey); crypto_pk_free(server_identitykey); crypto_pk_free(client_identitykey); - tor_mutex_free(key_lock); routerinfo_free(desc_routerinfo); extrainfo_free(desc_extrainfo); @@ -3694,8 +3020,10 @@ router_free_all(void) crypto_pk_free(legacy_signing_key); authority_cert_free(legacy_key_certificate); +#ifdef CURVE25519_ENABLED memwipe(&curve25519_onion_key, 0, sizeof(curve25519_onion_key)); memwipe(&last_curve25519_onion_key, 0, sizeof(last_curve25519_onion_key)); +#endif if (warned_nonexistent_family) { SMARTLIST_FOREACH(warned_nonexistent_family, char *, cp, tor_free(cp)); @@ -3705,16 +3033,28 @@ router_free_all(void) /** Return a smartlist of tor_addr_port_t's with all the OR ports of ri. Note that freeing of the items in the list as well as - the smartlist itself is the callers responsibility. */ + the smartlist itself is the callers responsibility. + + XXX duplicating code from node_get_all_orports(). */ smartlist_t * router_get_all_orports(const routerinfo_t *ri) { + smartlist_t *sl = smartlist_new(); tor_assert(ri); - node_t fake_node; - memset(&fake_node, 0, sizeof(fake_node)); - /* we don't modify ri, fake_node is passed as a const node_t * - */ - fake_node.ri = (routerinfo_t *)ri; - return node_get_all_orports(&fake_node); + + if (ri->addr != 0) { + tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); + tor_addr_from_ipv4h(&ap->addr, ri->addr); + ap->port = ri->or_port; + smartlist_add(sl, ap); + } + if (!tor_addr_is_null(&ri->ipv6_addr)) { + tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); + tor_addr_copy(&ap->addr, &ri->ipv6_addr); + ap->port = ri->or_port; + smartlist_add(sl, ap); + } + + return sl; } diff --git a/src/tor/src/or/router.h b/src/tor/router.h similarity index 74% rename from src/tor/src/or/router.h rename to src/tor/router.h index 696e98366..1ee0577c8 100644 --- a/src/tor/src/or/router.h +++ b/src/tor/router.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -22,31 +22,26 @@ int server_identity_key_is_set(void); void set_client_identity_key(crypto_pk_t *k); crypto_pk_t *get_tlsclient_identity_key(void); int client_identity_key_is_set(void); -MOCK_DECL(authority_cert_t *, get_my_v3_authority_cert, (void)); +authority_cert_t *get_my_v3_authority_cert(void); crypto_pk_t *get_my_v3_authority_signing_key(void); authority_cert_t *get_my_v3_legacy_cert(void); crypto_pk_t *get_my_v3_legacy_signing_key(void); void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last); -void expire_old_onion_keys(void); void rotate_onion_key(void); crypto_pk_t *init_key_from_file(const char *fname, int generate, - int severity, int log_greeting); + int severity); void v3_authority_check_key_expiry(void); -int get_onion_key_lifetime(void); -int get_onion_key_grace_period(void); +#ifdef CURVE25519_ENABLED di_digest256_map_t *construct_ntor_key_map(void); -void ntor_key_map_free_(di_digest256_map_t *map); -#define ntor_key_map_free(map) \ - FREE_AND_NULL(di_digest256_map_t, ntor_key_map_free_, (map)) +void ntor_key_map_free(di_digest256_map_t *map); +#endif int router_initialize_tls_context(void); int init_keys(void); -int init_keys_client(void); -int check_whether_orport_reachable(const or_options_t *options); -int check_whether_dirport_reachable(const or_options_t *options); -int dir_server_mode(const or_options_t *options); +int check_whether_orport_reachable(void); +int check_whether_dirport_reachable(void); void consider_testing_reachability(int test_or, int test_dir); void router_orport_found_reachable(void); void router_dirport_found_reachable(void); @@ -55,7 +50,10 @@ void router_perform_bandwidth_test(int num_circs, time_t now); int net_is_disabled(void); int authdir_mode(const or_options_t *options); +int authdir_mode_v1(const or_options_t *options); int authdir_mode_v3(const or_options_t *options); +int authdir_mode_any_main(const or_options_t *options); +int authdir_mode_any_nonhidserv(const or_options_t *options); int authdir_mode_handles_descs(const or_options_t *options, int purpose); int authdir_mode_publishes_statuses(const or_options_t *options); int authdir_mode_tests_reachability(const or_options_t *options); @@ -69,9 +67,9 @@ uint16_t router_get_advertised_or_port_by_af(const or_options_t *options, uint16_t router_get_advertised_dir_port(const or_options_t *options, uint16_t dirport); -MOCK_DECL(int, server_mode, (const or_options_t *options)); -MOCK_DECL(int, public_server_mode, (const or_options_t *options)); -MOCK_DECL(int, advertised_server_mode, (void)); +int server_mode(const or_options_t *options); +int public_server_mode(const or_options_t *options); +int advertised_server_mode(void); int proxy_mode(const or_options_t *options); void consider_publishable_server(int force); int should_refuse_unknown_exits(const or_options_t *options); @@ -84,8 +82,8 @@ void check_descriptor_ipaddress_changed(time_t now); void router_new_address_suggestion(const char *suggestion, const dir_connection_t *d_conn); int router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port); -MOCK_DECL(int, router_my_exit_policy_is_reject_star,(void)); -MOCK_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); +int router_my_exit_policy_is_reject_star(void); +const routerinfo_t *router_get_my_routerinfo(void); extrainfo_t *router_get_my_extrainfo(void); const char *router_get_my_descriptor(void); const char *router_get_descriptor_gen_reason(void); @@ -93,19 +91,11 @@ int router_digest_is_me(const char *digest); const uint8_t *router_get_my_id_digest(void); int router_extrainfo_digest_is_me(const char *digest); int router_is_me(const routerinfo_t *router); -MOCK_DECL(int,router_pick_published_address,(const or_options_t *options, - uint32_t *addr, - int cache_only)); -int router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e); +int router_fingerprint_is_me(const char *fp); +int router_pick_published_address(const or_options_t *options, uint32_t *addr); int router_rebuild_descriptor(int force); char *router_dump_router_to_string(routerinfo_t *router, - const crypto_pk_t *ident_key, - const crypto_pk_t *tap_key, - const curve25519_keypair_t *ntor_keypair, - const ed25519_keypair_t *signing_keypair); -char *router_dump_exit_policy_to_string(const routerinfo_t *router, - int include_ipv4, - int include_ipv6); + crypto_pk_t *ident_key); void router_get_prim_orport(const routerinfo_t *router, tor_addr_port_t *addr_port_out); void router_get_pref_orport(const routerinfo_t *router, @@ -117,8 +107,7 @@ int router_has_addr(const routerinfo_t *router, const tor_addr_t *addr); int router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport); int extrainfo_dump_to_string(char **s, extrainfo_t *extrainfo, - crypto_pk_t *ident_key, - const ed25519_keypair_t *signing_keypair); + crypto_pk_t *ident_key); int is_legal_nickname(const char *s); int is_legal_nickname_or_hexdigest(const char *s); int is_legal_hexdigest(const char *s); @@ -159,8 +148,7 @@ smartlist_t *router_get_all_orports(const routerinfo_t *ri); #ifdef ROUTER_PRIVATE /* Used only by router.c and test.c */ STATIC void get_platform_str(char *platform, size_t len); -STATIC int router_write_fingerprint(int hashed); #endif -#endif /* !defined(TOR_ROUTER_H) */ +#endif diff --git a/src/tor/src/or/routerlist.c b/src/tor/routerlist.c similarity index 69% rename from src/tor/src/or/routerlist.c rename to src/tor/routerlist.c index d8c8a8173..b9682e21c 100644 --- a/src/tor/src/or/routerlist.c +++ b/src/tor/routerlist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,92 +9,10 @@ * \brief Code to * maintain and access the global list of routerinfos for known * servers. - * - * A "routerinfo_t" object represents a single self-signed router - * descriptor, as generated by a Tor relay in order to tell the rest of - * the world about its keys, address, and capabilities. An - * "extrainfo_t" object represents an adjunct "extra-info" object, - * certified by a corresponding router descriptor, reporting more - * information about the relay that nearly all users will not need. - * - * Most users will not use router descriptors for most relays. Instead, - * they use the information in microdescriptors and in the consensus - * networkstatus. - * - * Right now, routerinfo_t objects are used in these ways: - *
      - *
    • By clients, in order to learn about bridge keys and capabilities. - * (Bridges aren't listed in the consensus networkstatus, so they - * can't have microdescriptors.) - *
    • By relays, since relays want more information about other relays - * than they can learn from microdescriptors. (TODO: Is this still true?) - *
    • By authorities, which receive them and use them to generate the - * consensus and the microdescriptors. - *
    • By all directory caches, which download them in case somebody - * else wants them. - *
    - * - * Routerinfos are mostly created by parsing them from a string, in - * routerparse.c. We store them to disk on receiving them, and - * periodically discard the ones we don't need. On restarting, we - * re-read them from disk. (This also applies to extrainfo documents, if - * we are configured to fetch them.) - * - * In order to keep our list of routerinfos up-to-date, we periodically - * check whether there are any listed in the latest consensus (or in the - * votes from other authorities, if we are an authority) that we don't - * have. (This also applies to extrainfo documents, if we are - * configured to fetch them.) - * - * Almost nothing in Tor should use a routerinfo_t to refer directly to - * a relay; instead, almost everything should use node_t (implemented in - * nodelist.c), which provides a common interface to routerinfo_t, - * routerstatus_t, and microdescriptor_t. - * - *
    - * - * This module also has some of the functions used for choosing random - * nodes according to different rules and weights. Historically, they - * were all in this module. Now, they are spread across this module, - * nodelist.c, and networkstatus.c. (TODO: Fix that.) - * - *
    - * - * (For historical reasons) this module also contains code for handling - * the list of fallback directories, the list of directory authorities, - * and the list of authority certificates. - * - * For the directory authorities, we have a list containing the public - * identity key, and contact points, for each authority. The - * authorities receive descriptors from relays, and publish consensuses, - * descriptors, and microdescriptors. This list is pre-configured. - * - * Fallback directories are well-known, stable, but untrusted directory - * caches that clients which have not yet bootstrapped can use to get - * their first networkstatus consensus, in order to find out where the - * Tor network really is. This list is pre-configured in - * fallback_dirs.inc. Every authority also serves as a fallback. - * - * Both fallback directories and directory authorities are are - * represented by a dir_server_t. - * - * Authority certificates are signed with authority identity keys; they - * are used to authenticate shorter-term authority signing keys. We - * fetch them when we find a consensus or a vote that has been signed - * with a signing key we don't recognize. We cache them on disk and - * load them on startup. Authority operators generate them with the - * "tor-gencert" utility. - * - * TODO: Authority certificates should be a separate module. - * - * TODO: dir_server_t stuff should be in a separate module. **/ #define ROUTERLIST_PRIVATE #include "or.h" -#include "backtrace.h" -#include "bridges.h" -#include "crypto_ed25519.h" #include "circuitstats.h" #include "config.h" #include "connection.h" @@ -106,7 +24,7 @@ #include "fp_pair.h" #include "geoip.h" #include "hibernate.h" -#include "main.h" +#include "onion_main.h" #include "microdesc.h" #include "networkstatus.h" #include "nodelist.h" @@ -120,15 +38,10 @@ #include "routerparse.h" #include "routerset.h" #include "sandbox.h" -#include "torcert.h" - // #define DEBUG_ROUTERLIST /****************************************************************************/ -/* Typed wrappers for different digestmap types; used to avoid type - * confusion. */ - DECLARE_TYPED_DIGESTMAP_FNS(sdmap_, digest_sd_map_t, signed_descriptor_t) DECLARE_TYPED_DIGESTMAP_FNS(rimap_, digest_ri_map_t, routerinfo_t) DECLARE_TYPED_DIGESTMAP_FNS(eimap_, digest_ei_map_t, extrainfo_t) @@ -143,10 +56,6 @@ DECLARE_TYPED_DIGESTMAP_FNS(dsmap_, digest_ds_map_t, download_status_t) #define DSMAP_FOREACH(map, keyvar, valvar) \ DIGESTMAP_FOREACH(dsmap_to_digestmap(map), keyvar, download_status_t *, \ valvar) -#define eimap_free(map, fn) MAP_FREE_AND_NULL(eimap, (map), (fn)) -#define rimap_free(map, fn) MAP_FREE_AND_NULL(rimap, (map), (fn)) -#define dsmap_free(map, fn) MAP_FREE_AND_NULL(dsmap, (map), (fn)) -#define sdmap_free(map, fn) MAP_FREE_AND_NULL(sdmap, (map), (fn)) /* Forward declaration for cert_list_t */ typedef struct cert_list_t cert_list_t; @@ -154,8 +63,9 @@ typedef struct cert_list_t cert_list_t; /* static function prototypes */ static int compute_weighted_bandwidths(const smartlist_t *sl, bandwidth_weight_rule_t rule, - double **bandwidths_out, - double *total_bandwidth_out); + u64_dbl_t **bandwidths_out); +static const routerstatus_t *router_pick_directory_server_impl( + dirinfo_type_t auth, int flags); static const routerstatus_t *router_pick_trusteddirserver_impl( const smartlist_t *sourcelist, dirinfo_type_t auth, int flags, int *n_busy_out); @@ -163,12 +73,12 @@ static const routerstatus_t *router_pick_dirserver_generic( smartlist_t *sourcelist, dirinfo_type_t type, int flags); static void mark_all_dirservers_up(smartlist_t *server_list); +static void dir_server_free(dir_server_t *ds); static int signed_desc_digest_is_recognized(signed_descriptor_t *desc); static const char *signed_descriptor_get_body_impl( const signed_descriptor_t *desc, int with_annotations); static void list_pending_downloads(digestmap_t *result, - digest256map_t *result256, int purpose, const char *prefix); static void list_pending_fpsk_downloads(fp_pair_map_t *result); static void launch_dummy_descriptor_download_as_needed(time_t now, @@ -188,8 +98,7 @@ static smartlist_t *trusted_dir_servers = NULL; * and all fallback directory servers. */ static smartlist_t *fallback_dir_servers = NULL; -/** List of certificates for a single authority, and download status for - * latest certificate. +/** List of for a given authority, and download status for latest certificate. */ struct cert_list_t { /* @@ -221,6 +130,16 @@ static smartlist_t *warned_nicknames = NULL; * download is low. */ static time_t last_descriptor_download_attempted = 0; +/** When we last computed the weights to use for bandwidths on directory + * requests, what were the total weighted bandwidth, and our share of that + * bandwidth? Used to determine what fraction of directory requests we should + * expect to see. + * + * @{ */ +static uint64_t sl_last_total_weighted_bw = 0, + sl_last_weighted_bw_of_me = 0; +/**@}*/ + /** Return the number of directory authorities whose type matches some bit set * in type */ int @@ -235,25 +154,6 @@ get_n_authorities(dirinfo_type_t type) return n; } -/** Initialise schedule, want_authority, and increment on in the download - * status dlstatus, then call download_status_reset() on it. - * It is safe to call this function or download_status_reset() multiple times - * on a new dlstatus. But it should *not* be called after a dlstatus has been - * used to count download attempts or failures. */ -static void -download_status_cert_init(download_status_t *dlstatus) -{ - dlstatus->schedule = DL_SCHED_CONSENSUS; - dlstatus->want_authority = DL_WANT_ANY_DIRSERVER; - dlstatus->increment_on = DL_SCHED_INCREMENT_FAILURE; - dlstatus->backoff = DL_SCHED_RANDOM_EXPONENTIAL; - dlstatus->last_backoff_position = 0; - dlstatus->last_delay_used = 0; - - /* Use the new schedule to set next_attempt_at */ - download_status_reset(dlstatus); -} - /** Reset the download status of a specified element in a dsmap */ static void download_status_reset_by_sk_in_cl(cert_list_t *cl, const char *digest) @@ -274,7 +174,6 @@ download_status_reset_by_sk_in_cl(cert_list_t *cl, const char *digest) /* Insert before we reset */ dlstatus = tor_malloc_zero(sizeof(*dlstatus)); dsmap_set(cl->dl_status_map, digest, dlstatus); - download_status_cert_init(dlstatus); } tor_assert(dlstatus); /* Go ahead and reset it */ @@ -313,7 +212,7 @@ download_status_is_ready_by_sk_in_cl(cert_list_t *cl, * too. */ dlstatus = tor_malloc_zero(sizeof(*dlstatus)); - download_status_cert_init(dlstatus); + download_status_reset(dlstatus); dsmap_set(cl->dl_status_map, digest, dlstatus); rv = 1; } @@ -332,7 +231,7 @@ get_cert_list(const char *id_digest) cl = digestmap_get(trusted_dir_certs, id_digest); if (!cl) { cl = tor_malloc_zero(sizeof(cert_list_t)); - download_status_cert_init(&cl->dl_status_by_id); + cl->dl_status_by_id.schedule = DL_SCHED_CONSENSUS; cl->certs = smartlist_new(); cl->dl_status_map = dsmap_new(); digestmap_set(trusted_dir_certs, id_digest, cl); @@ -340,118 +239,9 @@ get_cert_list(const char *id_digest) return cl; } -/** Return a list of authority ID digests with potentially enumerable lists - * of download_status_t objects; used by controller GETINFO queries. - */ - -MOCK_IMPL(smartlist_t *, -list_authority_ids_with_downloads, (void)) -{ - smartlist_t *ids = smartlist_new(); - digestmap_iter_t *i; - const char *digest; - char *tmp; - void *cl; - - if (trusted_dir_certs) { - for (i = digestmap_iter_init(trusted_dir_certs); - !(digestmap_iter_done(i)); - i = digestmap_iter_next(trusted_dir_certs, i)) { - /* - * We always have at least dl_status_by_id to query, so no need to - * probe deeper than the existence of a cert_list_t. - */ - digestmap_iter_get(i, &digest, &cl); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, digest, DIGEST_LEN); - smartlist_add(ids, tmp); - } - } - /* else definitely no downlaods going since nothing even has a cert list */ - - return ids; -} - -/** Given an authority ID digest, return a pointer to the default download - * status, or NULL if there is no such entry in trusted_dir_certs */ - -MOCK_IMPL(download_status_t *, -id_only_download_status_for_authority_id, (const char *digest)) -{ - download_status_t *dl = NULL; - cert_list_t *cl; - - if (trusted_dir_certs) { - cl = digestmap_get(trusted_dir_certs, digest); - if (cl) { - dl = &(cl->dl_status_by_id); - } - } - - return dl; -} - -/** Given an authority ID digest, return a smartlist of signing key digests - * for which download_status_t is potentially queryable, or NULL if no such - * authority ID digest is known. */ - -MOCK_IMPL(smartlist_t *, -list_sk_digests_for_authority_id, (const char *digest)) -{ - smartlist_t *sks = NULL; - cert_list_t *cl; - dsmap_iter_t *i; - const char *sk_digest; - char *tmp; - download_status_t *dl; - - if (trusted_dir_certs) { - cl = digestmap_get(trusted_dir_certs, digest); - if (cl) { - sks = smartlist_new(); - if (cl->dl_status_map) { - for (i = dsmap_iter_init(cl->dl_status_map); - !(dsmap_iter_done(i)); - i = dsmap_iter_next(cl->dl_status_map, i)) { - /* Pull the digest out and add it to the list */ - dsmap_iter_get(i, &sk_digest, &dl); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, sk_digest, DIGEST_LEN); - smartlist_add(sks, tmp); - } - } - } - } - - return sks; -} - -/** Given an authority ID digest and a signing key digest, return the - * download_status_t or NULL if none exists. */ - -MOCK_IMPL(download_status_t *, -download_status_for_authority_id_and_sk,(const char *id_digest, - const char *sk_digest)) -{ - download_status_t *dl = NULL; - cert_list_t *cl = NULL; - - if (trusted_dir_certs) { - cl = digestmap_get(trusted_dir_certs, id_digest); - if (cl && cl->dl_status_map) { - dl = dsmap_get(cl->dl_status_map, sk_digest); - } - } - - return dl; -} - -#define cert_list_free(val) \ - FREE_AND_NULL(cert_list_t, cert_list_free_, (val)) - /** Release all space held by a cert_list_t */ static void -cert_list_free_(cert_list_t *cl) +cert_list_free(cert_list_t *cl) { if (!cl) return; @@ -465,9 +255,9 @@ cert_list_free_(cert_list_t *cl) /** Wrapper for cert_list_free so we can pass it to digestmap_free */ static void -cert_list_free_void(void *cl) +cert_list_free_(void *cl) { - cert_list_free_(cl); + cert_list_free(cl); } /** Reload the cached v3 key certificates from the cached-certs file in @@ -479,21 +269,21 @@ trusted_dirs_reload_certs(void) char *contents; int r; - filename = get_cachedir_fname("cached-certs"); + filename = get_datadir_fname("cached-certs"); contents = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); tor_free(filename); if (!contents) return 0; r = trusted_dirs_load_certs_from_string( contents, - TRUSTED_DIRS_CERTS_SRC_FROM_STORE, 1, NULL); + TRUSTED_DIRS_CERTS_SRC_FROM_STORE, 1); tor_free(contents); return r; } /** Helper: return true iff we already have loaded the exact cert * cert. */ -static inline int +static INLINE int already_have_cert(authority_cert_t *cert) { cert_list_t *cl = get_cert_list(cert->cache_info.identity_digest); @@ -516,20 +306,16 @@ already_have_cert(authority_cert_t *cert) * or TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST. If flush is true, we * need to flush any changed certificates to disk now. Return 0 on success, * -1 if any certs fail to parse. - * - * If source_dir is non-NULL, it's the identity digest for a directory that - * we've just successfully retrieved certificates from, so try it first to - * fetch any missing certificates. */ + int trusted_dirs_load_certs_from_string(const char *contents, int source, - int flush, const char *source_dir) + int flush) { dir_server_t *ds; const char *s, *eos; int failure_code = 0; int from_store = (source == TRUSTED_DIRS_CERTS_SRC_FROM_STORE); - int added_trusted_cert = 0; for (s = contents; *s; s = eos) { authority_cert_t *cert = authority_cert_parse_from_string(s, &eos); @@ -589,12 +375,11 @@ trusted_dirs_load_certs_from_string(const char *contents, int source, } if (ds) { - added_trusted_cert = 1; log_info(LD_DIR, "Adding %s certificate for directory authority %s with " "signing key %s", from_store ? "cached" : "downloaded", ds->nickname, hex_str(cert->signing_key_digest,DIGEST_LEN)); } else { - int adding = we_want_to_fetch_unknown_auth_certs(get_options()); + int adding = directory_caches_unknown_auth_certs(get_options()); log_info(LD_DIR, "%s %s certificate for unrecognized directory " "authority with signing key %s", adding ? "Adding" : "Not adding", @@ -634,15 +419,8 @@ trusted_dirs_load_certs_from_string(const char *contents, int source, trusted_dirs_flush_certs_to_disk(); /* call this even if failure_code is <0, since some certs might have - * succeeded, but only pass source_dir if there were no failures, - * and at least one more authority certificate was added to the store. - * This avoids retrying a directory that's serving bad or entirely duplicate - * certificates. */ - if (failure_code == 0 && added_trusted_cert) { - networkstatus_note_certs_arrived(source_dir); - } else { - networkstatus_note_certs_arrived(NULL); - } + * succeeded. */ + networkstatus_note_certs_arrived(); return failure_code; } @@ -668,7 +446,7 @@ trusted_dirs_flush_certs_to_disk(void) }); } DIGESTMAP_FOREACH_END; - filename = get_cachedir_fname("cached-certs"); + filename = get_datadir_fname("cached-certs"); if (write_chunks_to_file(filename, chunks, 0, 0)) { log_warn(LD_FS, "Error writing certificates to disk."); } @@ -679,69 +457,46 @@ trusted_dirs_flush_certs_to_disk(void) trusted_dir_servers_certs_changed = 0; } -static int -compare_certs_by_pubdates(const void **_a, const void **_b) -{ - const authority_cert_t *cert1 = *_a, *cert2=*_b; - - if (cert1->cache_info.published_on < cert2->cache_info.published_on) - return -1; - else if (cert1->cache_info.published_on > cert2->cache_info.published_on) - return 1; - else - return 0; -} - -/** Remove all expired v3 authority certificates that have been superseded for - * more than 48 hours or, if not expired, that were published more than 7 days - * before being superseded. (If the most recent cert was published more than 48 - * hours ago, then we aren't going to get any consensuses signed with older +/** Remove all v3 authority certificates that have been superseded for more + * than 48 hours. (If the most recent cert was published more than 48 hours + * ago, then we aren't going to get any consensuses signed with older * keys.) */ static void trusted_dirs_remove_old_certs(void) { time_t now = time(NULL); #define DEAD_CERT_LIFETIME (2*24*60*60) -#define SUPERSEDED_CERT_LIFETIME (2*24*60*60) +#define OLD_CERT_LIFETIME (7*24*60*60) if (!trusted_dir_certs) return; DIGESTMAP_FOREACH(trusted_dir_certs, key, cert_list_t *, cl) { - /* Sort the list from first-published to last-published */ - smartlist_sort(cl->certs, compare_certs_by_pubdates); - - SMARTLIST_FOREACH_BEGIN(cl->certs, authority_cert_t *, cert) { - if (cert_sl_idx == smartlist_len(cl->certs) - 1) { - /* This is the most recently published cert. Keep it. */ - continue; - } - authority_cert_t *next_cert = smartlist_get(cl->certs, cert_sl_idx+1); - const time_t next_cert_published = next_cert->cache_info.published_on; - if (next_cert_published > now) { - /* All later certs are published in the future. Keep everything - * we didn't discard. */ - break; - } - int should_remove = 0; - if (cert->expires + DEAD_CERT_LIFETIME < now) { - /* Certificate has been expired for at least DEAD_CERT_LIFETIME. - * Remove it. */ - should_remove = 1; - } else if (next_cert_published + SUPERSEDED_CERT_LIFETIME < now) { - /* Certificate has been superseded for OLD_CERT_LIFETIME. - * Remove it. + authority_cert_t *newest = NULL; + SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert, + if (!newest || (cert->cache_info.published_on > + newest->cache_info.published_on)) + newest = cert); + if (newest) { + const time_t newest_published = newest->cache_info.published_on; + SMARTLIST_FOREACH_BEGIN(cl->certs, authority_cert_t *, cert) { + int expired; + time_t cert_published; + if (newest == cert) + continue; + expired = now > cert->expires; + cert_published = cert->cache_info.published_on; + /* Store expired certs for 48 hours after a newer arrives; */ - should_remove = 1; - } - if (should_remove) { - SMARTLIST_DEL_CURRENT_KEEPORDER(cl->certs, cert); - authority_cert_free(cert); - trusted_dir_servers_certs_changed = 1; - } - } SMARTLIST_FOREACH_END(cert); - + if (expired ? + (newest_published + DEAD_CERT_LIFETIME < now) : + (cert_published + OLD_CERT_LIFETIME < newest_published)) { + SMARTLIST_DEL_CURRENT(cl->certs, cert); + authority_cert_free(cert); + trusted_dir_servers_certs_changed = 1; + } + } SMARTLIST_FOREACH_END(cert); + } } DIGESTMAP_FOREACH_END; -#undef DEAD_CERT_LIFETIME #undef OLD_CERT_LIFETIME trusted_dirs_flush_certs_to_disk(); @@ -876,39 +631,6 @@ authority_cert_dl_failed(const char *id_digest, } } -static const char *BAD_SIGNING_KEYS[] = { - "09CD84F751FD6E955E0F8ADB497D5401470D697E", // Expires 2015-01-11 16:26:31 - "0E7E9C07F0969D0468AD741E172A6109DC289F3C", // Expires 2014-08-12 10:18:26 - "57B85409891D3FB32137F642FDEDF8B7F8CDFDCD", // Expires 2015-02-11 17:19:09 - "87326329007AF781F587AF5B594E540B2B6C7630", // Expires 2014-07-17 11:10:09 - "98CC82342DE8D298CF99D3F1A396475901E0D38E", // Expires 2014-11-10 13:18:56 - "9904B52336713A5ADCB13E4FB14DC919E0D45571", // Expires 2014-04-20 20:01:01 - "9DCD8E3F1DD1597E2AD476BBA28A1A89F3095227", // Expires 2015-01-16 03:52:30 - "A61682F34B9BB9694AC98491FE1ABBFE61923941", // Expires 2014-06-11 09:25:09 - "B59F6E99C575113650C99F1C425BA7B20A8C071D", // Expires 2014-07-31 13:22:10 - "D27178388FA75B96D37FA36E0B015227DDDBDA51", // Expires 2014-08-04 04:01:57 - NULL, -}; - -/** Return true iff cert authenticates some atuhority signing key - * which, because of the old openssl heartbleed vulnerability, should - * never be trusted. */ -int -authority_cert_is_blacklisted(const authority_cert_t *cert) -{ - char hex_digest[HEX_DIGEST_LEN+1]; - int i; - base16_encode(hex_digest, sizeof(hex_digest), - cert->signing_key_digest, sizeof(cert->signing_key_digest)); - - for (i = 0; BAD_SIGNING_KEYS[i]; ++i) { - if (!strcasecmp(hex_digest, BAD_SIGNING_KEYS[i])) { - return 1; - } - } - return 0; -} - /** Return true iff when we've been getting enough failures when trying to * download the certificate with ID digest id_digest that we're willing * to start bugging the user about it. */ @@ -926,85 +648,14 @@ authority_cert_dl_looks_uncertain(const char *id_digest) return n_failures >= N_AUTH_CERT_DL_FAILURES_TO_BUG_USER; } -/* Fetch the authority certificates specified in resource. - * If we are a bridge client, and node is a configured bridge, fetch from node - * using dir_hint as the fingerprint. Otherwise, if rs is not NULL, fetch from - * rs. Otherwise, fetch from a random directory mirror. */ -static void -authority_certs_fetch_resource_impl(const char *resource, - const char *dir_hint, - const node_t *node, - const routerstatus_t *rs) -{ - const or_options_t *options = get_options(); - int get_via_tor = purpose_needs_anonymity(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource); - - /* Make sure bridge clients never connect to anything but a bridge */ - if (options->UseBridges) { - if (node && !node_is_a_configured_bridge(node)) { - /* If we're using bridges, and node is not a bridge, use a 3-hop path. */ - get_via_tor = 1; - } else if (!node) { - /* If we're using bridges, and there's no node, use a 3-hop path. */ - get_via_tor = 1; - } - } - - const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS - : DIRIND_ONEHOP; - - directory_request_t *req = NULL; - /* If we've just downloaded a consensus from a bridge, re-use that - * bridge */ - if (options->UseBridges && node && node->ri && !get_via_tor) { - /* clients always make OR connections to bridges */ - tor_addr_port_t or_ap; - /* we are willing to use a non-preferred address if we need to */ - fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, - &or_ap); - - req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); - directory_request_set_or_addr_port(req, &or_ap); - if (dir_hint) - directory_request_set_directory_id_digest(req, dir_hint); - } else if (rs) { - /* And if we've just downloaded a consensus from a directory, re-use that - * directory */ - req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); - directory_request_set_routerstatus(req, rs); - } - - if (req) { - /* We've set up a request object -- fill in the other request fields, and - * send the request. */ - directory_request_set_indirection(req, indirection); - directory_request_set_resource(req, resource); - directory_initiate_request(req); - directory_request_free(req); - return; - } - - /* Otherwise, we want certs from a random fallback or directory - * mirror, because they will almost always succeed. */ - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, - resource, PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); -} - /** Try to download any v3 authority certificates that we may be missing. If * status is provided, try to get all the ones that were used to sign * status. Additionally, try to have a non-expired certificate for * every V3 authority in trusted_dir_servers. Don't fetch certificates we * already have. - * - * If dir_hint is non-NULL, it's the identity digest for a directory that - * we've just successfully retrieved a consensus or certificates from, so try - * it first to fetch any missing certificates. **/ void -authority_certs_fetch_missing(networkstatus_t *status, time_t now, - const char *dir_hint) +authority_certs_fetch_missing(networkstatus_t *status, time_t now) { /* * The pending_id digestmap tracks pending certificate downloads by @@ -1013,6 +664,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, */ digestmap_t *pending_id; fp_pair_map_t *pending_cert; + authority_cert_t *cert; /* * The missing_id_digests smartlist will hold a list of id digests * we want to fetch the newest cert for; the missing_cert_digests @@ -1022,13 +674,12 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, smartlist_t *missing_cert_digests, *missing_id_digests; char *resource = NULL; cert_list_t *cl; - const or_options_t *options = get_options(); - const int keep_unknown = we_want_to_fetch_unknown_auth_certs(options); + const int cache = directory_caches_unknown_auth_certs(get_options()); fp_pair_t *fp_tmp = NULL; char id_digest_str[2*DIGEST_LEN+1]; char sk_digest_str[2*DIGEST_LEN+1]; - if (should_delay_dir_fetches(options, NULL)) + if (should_delay_dir_fetches(get_options())) return; pending_cert = fp_pair_map_new(); @@ -1040,8 +691,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, * First, we get the lists of already pending downloads so we don't * duplicate effort. */ - list_pending_downloads(pending_id, NULL, - DIR_PURPOSE_FETCH_CERTIFICATE, "fp/"); + list_pending_downloads(pending_id, DIR_PURPOSE_FETCH_CERTIFICATE, "fp/"); list_pending_fpsk_downloads(pending_cert); /* @@ -1069,7 +719,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, } SMARTLIST_FOREACH_END(cert); if (!found && download_status_is_ready(&(cl->dl_status_by_id), now, - options->TestingCertMaxDownloadTries) && + get_options()->TestingCertMaxDownloadTries) && !digestmap_get(pending_id, ds->v3_identity_digest)) { log_info(LD_DIR, "No current certificate known for authority %s " @@ -1095,10 +745,9 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (!smartlist_len(voter->sigs)) continue; /* This authority never signed this consensus, so don't * go looking for a cert with key digest 0000000000. */ - if (!keep_unknown && + if (!cache && !trusteddirserver_get_by_v3_auth_digest(voter->identity_digest)) - continue; /* We don't want unknown certs, and we don't know this - * authority.*/ + continue; /* We are not a cache, and we don't know this authority.*/ /* * If we don't know *any* cert for this authority, and a download by ID @@ -1123,9 +772,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, } SMARTLIST_FOREACH_BEGIN(voter->sigs, document_signature_t *, sig) { - authority_cert_t *cert = - authority_cert_get_by_digests(voter->identity_digest, - sig->signing_key_digest); + cert = authority_cert_get_by_digests(voter->identity_digest, + sig->signing_key_digest); if (cert) { if (now < cert->expires) download_status_reset_by_sk_in_cl(cl, sig->signing_key_digest); @@ -1133,7 +781,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, } if (download_status_is_ready_by_sk_in_cl( cl, sig->signing_key_digest, - now, options->TestingCertMaxDownloadTries) && + now, get_options()->TestingCertMaxDownloadTries) && !fp_pair_map_get_by_digests(pending_cert, voter->identity_digest, sig->signing_key_digest)) { @@ -1170,52 +818,12 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, } SMARTLIST_FOREACH_END(voter); } - /* Bridge clients look up the node for the dir_hint */ - const node_t *node = NULL; - /* All clients, including bridge clients, look up the routerstatus for the - * dir_hint */ - const routerstatus_t *rs = NULL; - - /* If we still need certificates, try the directory that just successfully - * served us a consensus or certificates. - * As soon as the directory fails to provide additional certificates, we try - * another, randomly selected directory. This avoids continual retries. - * (We only ever have one outstanding request per certificate.) - */ - if (dir_hint) { - if (options->UseBridges) { - /* Bridge clients try the nodelist. If the dir_hint is from an authority, - * or something else fetched over tor, we won't find the node here, but - * we will find the rs. */ - node = node_get_by_id(dir_hint); - } - - /* All clients try the consensus routerstatus, then the fallback - * routerstatus */ - rs = router_get_consensus_status_by_id(dir_hint); - if (!rs) { - /* This will also find authorities */ - const dir_server_t *ds = router_get_fallback_dirserver_by_digest( - dir_hint); - if (ds) { - rs = &ds->fake_status; - } - } - - if (!node && !rs) { - log_warn(LD_BUG, "Directory %s delivered a consensus, but %s" - "no routerstatus could be found for it.", - options->UseBridges ? "no node and " : "", - hex_str(dir_hint, DIGEST_LEN)); - } - } - /* Do downloads by identity digest */ if (smartlist_len(missing_id_digests) > 0) { int need_plus = 0; smartlist_t *fps = smartlist_new(); - smartlist_add_strdup(fps, "fp/"); + smartlist_add(fps, tor_strdup("fp/")); SMARTLIST_FOREACH_BEGIN(missing_id_digests, const char *, d) { char *fp = NULL; @@ -1239,9 +847,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fps) > 1) { resource = smartlist_join_strings(fps, "", 0, NULL); - /* node and rs are directories that just gave us a consensus or - * certificates */ - authority_certs_fetch_resource_impl(resource, dir_hint, node, rs); + directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, + resource, PDS_RETRY_IF_NO_SERVERS); tor_free(resource); } /* else we didn't add any: they were all pending */ @@ -1255,7 +862,7 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, int need_plus = 0; smartlist_t *fp_pairs = smartlist_new(); - smartlist_add_strdup(fp_pairs, "fp-sk/"); + smartlist_add(fp_pairs, tor_strdup("fp-sk/")); SMARTLIST_FOREACH_BEGIN(missing_cert_digests, const fp_pair_t *, d) { char *fp_pair = NULL; @@ -1284,9 +891,8 @@ authority_certs_fetch_missing(networkstatus_t *status, time_t now, if (smartlist_len(fp_pairs) > 1) { resource = smartlist_join_strings(fp_pairs, "", 0, NULL); - /* node and rs are directories that just gave us a consensus or - * certificates */ - authority_certs_fetch_resource_impl(resource, dir_hint, node, rs); + directory_get_from_dirserver(DIR_PURPOSE_FETCH_CERTIFICATE, 0, + resource, PDS_RETRY_IF_NO_SERVERS); tor_free(resource); } /* else they were all pending */ @@ -1329,7 +935,7 @@ router_should_rebuild_store(desc_store_t *store) /** Return the desc_store_t in rl that should be used to store * sd. */ -static inline desc_store_t * +static INLINE desc_store_t * desc_get_store(routerlist_t *rl, const signed_descriptor_t *sd) { if (sd->is_extrainfo) @@ -1345,7 +951,7 @@ static int signed_desc_append_to_journal(signed_descriptor_t *desc, desc_store_t *store) { - char *fname = get_cachedir_fname_suffix(store->fname_base, ".new"); + char *fname = get_datadir_fname_suffix(store->fname_base, ".new"); const char *body = signed_descriptor_get_body_impl(desc,1); size_t len = desc->signed_descriptor_len + desc->annotations_len; @@ -1416,8 +1022,8 @@ router_rebuild_store(int flags, desc_store_t *store) log_info(LD_DIR, "Rebuilding %s cache", store->description); - fname = get_cachedir_fname(store->fname_base); - fname_tmp = get_cachedir_fname_suffix(store->fname_base, ".tmp"); + fname = get_datadir_fname(store->fname_base); + fname_tmp = get_datadir_fname_suffix(store->fname_base, ".tmp"); chunk_list = smartlist_new(); @@ -1468,11 +1074,8 @@ router_rebuild_store(int flags, desc_store_t *store) /* Our mmap is now invalid. */ if (store->mmap) { - int res = tor_munmap_file(store->mmap); + tor_munmap_file(store->mmap); store->mmap = NULL; - if (res != 0) { - log_warn(LD_FS, "Unable to munmap route store in %s", fname); - } } if (replace_file(fname_tmp, fname)<0) { @@ -1514,7 +1117,7 @@ router_rebuild_store(int flags, desc_store_t *store) } SMARTLIST_FOREACH_END(sd); tor_free(fname); - fname = get_cachedir_fname_suffix(store->fname_base, ".new"); + fname = get_datadir_fname_suffix(store->fname_base, ".new"); write_str_to_file(fname, "", 1); r = 0; @@ -1544,18 +1147,11 @@ router_reload_router_list_impl(desc_store_t *store) int extrainfo = (store->type == EXTRAINFO_STORE); store->journal_len = store->store_len = 0; - fname = get_cachedir_fname(store->fname_base); + fname = get_datadir_fname(store->fname_base); - if (store->mmap) { - /* get rid of it first */ - int res = tor_munmap_file(store->mmap); - store->mmap = NULL; - if (res != 0) { - log_warn(LD_FS, "Failed to munmap %s", fname); - tor_free(fname); - return -1; - } - } + if (store->mmap) /* get rid of it first */ + tor_munmap_file(store->mmap); + store->mmap = NULL; store->mmap = tor_mmap_file(fname); if (store->mmap) { @@ -1571,8 +1167,7 @@ router_reload_router_list_impl(desc_store_t *store) } tor_free(fname); - fname = get_cachedir_fname_suffix(store->fname_base, ".new"); - /* don't load empty files - we wouldn't get any data, even if we tried */ + fname = get_datadir_fname_suffix(store->fname_base, ".new"); if (file_status(fname) == FN_FILE) contents = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); if (contents) { @@ -1639,8 +1234,8 @@ router_get_fallback_dir_servers(void) /** Try to find a running dirserver that supports operations of type. * * If there are no running dirservers in our routerlist and the - * PDS_RETRY_IF_NO_SERVERS flag is set, set all the fallback ones - * (including authorities) as running again, and pick one. + * PDS_RETRY_IF_NO_SERVERS flag is set, set all the authoritative ones + * as running again, and pick one. * * If the PDS_IGNORE_FASCISTFIREWALL flag is set, then include * dirservers that we can't reach. @@ -1648,42 +1243,65 @@ router_get_fallback_dir_servers(void) * If the PDS_ALLOW_SELF flag is not set, then don't include ourself * (if we're a dirserver). * - * Don't pick a fallback directory mirror if any non-fallback is viable; - * (the fallback directory mirrors include the authorities) - * try to avoid using servers that have returned 503 recently. + * Don't pick an authority if any non-authority is viable; try to avoid using + * servers that have returned 503 recently. */ const routerstatus_t * router_pick_directory_server(dirinfo_type_t type, int flags) { - int busy = 0; const routerstatus_t *choice; + if (get_options()->PreferTunneledDirConns) + flags |= PDS_PREFER_TUNNELED_DIR_CONNS_; if (!routerlist) return NULL; - choice = router_pick_directory_server_impl(type, flags, &busy); + choice = router_pick_directory_server_impl(type, flags); if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS)) return choice; - if (busy) { - /* If the reason that we got no server is that servers are "busy", - * we must be excluding good servers because we already have serverdesc - * fetches with them. Do not mark down servers up because of this. */ - tor_assert((flags & (PDS_NO_EXISTING_SERVERDESC_FETCH| - PDS_NO_EXISTING_MICRODESC_FETCH))); - return NULL; - } - log_info(LD_DIR, "No reachable router entries for dirservers. " "Trying them all again."); - /* mark all fallback directory mirrors as up again */ + /* mark all authdirservers as up again */ mark_all_dirservers_up(fallback_dir_servers); /* try again */ - choice = router_pick_directory_server_impl(type, flags, NULL); + choice = router_pick_directory_server_impl(type, flags); return choice; } +/** Try to determine which fraction ofv3 directory requests aimed at + * caches will be sent to us. Set + * *v3_share_out to the fraction of v3 protocol shares we + * expect to see. Return 0 on success, negative on failure. */ +/* XXXX This function is unused. */ +int +router_get_my_share_of_directory_requests(double *v3_share_out) +{ + const routerinfo_t *me = router_get_my_routerinfo(); + const routerstatus_t *rs; + const int pds_flags = PDS_ALLOW_SELF|PDS_IGNORE_FASCISTFIREWALL; + *v3_share_out = 0.0; + if (!me) + return -1; + rs = router_get_consensus_status_by_id(me->cache_info.identity_digest); + if (!rs) + return -1; + + /* Calling for side effect */ + /* XXXX This is a bit of a kludge */ + { + sl_last_total_weighted_bw = 0; + router_pick_directory_server(V3_DIRINFO, pds_flags); + if (sl_last_total_weighted_bw != 0) { + *v3_share_out = U64_TO_DBL(sl_last_weighted_bw_of_me) / + U64_TO_DBL(sl_last_total_weighted_bw); + } + } + + return 0; +} + /** Return the dir_server_t for the directory authority whose identity * key hashes to digest, or NULL if no such authority is known. */ @@ -1703,21 +1321,15 @@ router_get_trusteddirserver_by_digest(const char *digest) } /** Return the dir_server_t for the fallback dirserver whose identity - * key hashes to digest, or NULL if no such fallback is in the list of - * fallback_dir_servers. (fallback_dir_servers is affected by the FallbackDir - * and UseDefaultFallbackDirs torrc options.) - * The list of fallback directories includes the list of authorities. + * key hashes to digest, or NULL if no such authority is known. */ dir_server_t * router_get_fallback_dirserver_by_digest(const char *digest) { - if (!fallback_dir_servers) - return NULL; - - if (!digest) + if (!trusted_dir_servers) return NULL; - SMARTLIST_FOREACH(fallback_dir_servers, dir_server_t *, ds, + SMARTLIST_FOREACH(trusted_dir_servers, dir_server_t *, ds, { if (tor_memeq(ds->digest, digest, DIGEST_LEN)) return ds; @@ -1726,24 +1338,12 @@ router_get_fallback_dirserver_by_digest(const char *digest) return NULL; } -/** Return 1 if any fallback dirserver's identity key hashes to digest, - * or 0 if no such fallback is in the list of fallback_dir_servers. - * (fallback_dir_servers is affected by the FallbackDir and - * UseDefaultFallbackDirs torrc options.) - * The list of fallback directories includes the list of authorities. - */ -int -router_digest_is_fallback_dir(const char *digest) -{ - return (router_get_fallback_dirserver_by_digest(digest) != NULL); -} - /** Return the dir_server_t for the directory authority whose * v3 identity key hashes to digest, or NULL if no such authority * is known. */ -MOCK_IMPL(dir_server_t *, -trusteddirserver_get_by_v3_auth_digest, (const char *digest)) +dir_server_t * +trusteddirserver_get_by_v3_auth_digest(const char *digest) { if (!trusted_dir_servers) return NULL; @@ -1767,7 +1367,7 @@ router_pick_trusteddirserver(dirinfo_type_t type, int flags) return router_pick_dirserver_generic(trusted_dir_servers, type, flags); } -/** Try to find a running fallback directory. Flags are as for +/** Try to find a running fallback directory Flags are as for * router_pick_directory_server. */ const routerstatus_t * @@ -1776,7 +1376,7 @@ router_pick_fallback_dirserver(dirinfo_type_t type, int flags) return router_pick_dirserver_generic(fallback_dir_servers, type, flags); } -/** Try to find a running fallback directory. Flags are as for +/** Try to find a running fallback directory Flags are as for * router_pick_directory_server. */ static const routerstatus_t * @@ -1785,6 +1385,8 @@ router_pick_dirserver_generic(smartlist_t *sourcelist, { const routerstatus_t *choice; int busy = 0; + if (get_options()->PreferTunneledDirConns) + flags |= PDS_PREFER_TUNNELED_DIR_CONNS_; choice = router_pick_trusteddirserver_impl(sourcelist, type, flags, &busy); if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS)) @@ -1804,196 +1406,18 @@ router_pick_dirserver_generic(smartlist_t *sourcelist, return router_pick_trusteddirserver_impl(sourcelist, type, flags, NULL); } -/* Check if we already have a directory fetch from ap, for serverdesc - * (including extrainfo) or microdesc documents. - * If so, return 1, if not, return 0. - * Also returns 0 if addr is NULL, tor_addr_is_null(addr), or dir_port is 0. - */ -STATIC int -router_is_already_dir_fetching(const tor_addr_port_t *ap, int serverdesc, - int microdesc) -{ - if (!ap || tor_addr_is_null(&ap->addr) || !ap->port) { - return 0; - } - - /* XX/teor - we're not checking tunnel connections here, see #17848 - */ - if (serverdesc && ( - connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, &ap->addr, ap->port, DIR_PURPOSE_FETCH_SERVERDESC) - || connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, &ap->addr, ap->port, DIR_PURPOSE_FETCH_EXTRAINFO))) { - return 1; - } - - if (microdesc && ( - connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, &ap->addr, ap->port, DIR_PURPOSE_FETCH_MICRODESC))) { - return 1; - } - - return 0; -} - -/* Check if we already have a directory fetch from the ipv4 or ipv6 - * router, for serverdesc (including extrainfo) or microdesc documents. - * If so, return 1, if not, return 0. - */ -static int -router_is_already_dir_fetching_(uint32_t ipv4_addr, - const tor_addr_t *ipv6_addr, - uint16_t dir_port, - int serverdesc, - int microdesc) -{ - tor_addr_port_t ipv4_dir_ap, ipv6_dir_ap; - - /* Assume IPv6 DirPort is the same as IPv4 DirPort */ - tor_addr_from_ipv4h(&ipv4_dir_ap.addr, ipv4_addr); - ipv4_dir_ap.port = dir_port; - tor_addr_copy(&ipv6_dir_ap.addr, ipv6_addr); - ipv6_dir_ap.port = dir_port; - - return (router_is_already_dir_fetching(&ipv4_dir_ap, serverdesc, microdesc) - || router_is_already_dir_fetching(&ipv6_dir_ap, serverdesc, microdesc)); -} - -#ifndef LOG_FALSE_POSITIVES_DURING_BOOTSTRAP -#define LOG_FALSE_POSITIVES_DURING_BOOTSTRAP 0 -#endif - -/* Log a message if rs is not found or not a preferred address */ -static void -router_picked_poor_directory_log(const routerstatus_t *rs) -{ - const networkstatus_t *usable_consensus; - usable_consensus = networkstatus_get_reasonably_live_consensus(time(NULL), - usable_consensus_flavor()); - -#if !LOG_FALSE_POSITIVES_DURING_BOOTSTRAP - /* Don't log early in the bootstrap process, it's normal to pick from a - * small pool of nodes. Of course, this won't help if we're trying to - * diagnose bootstrap issues. */ - if (!smartlist_len(nodelist_get_list()) || !usable_consensus - || !router_have_minimum_dir_info()) { - return; - } -#endif /* !LOG_FALSE_POSITIVES_DURING_BOOTSTRAP */ - - /* We couldn't find a node, or the one we have doesn't fit our preferences. - * Sometimes this is normal, sometimes it can be a reachability issue. */ - if (!rs) { - /* This happens a lot, so it's at debug level */ - log_debug(LD_DIR, "Wanted to make an outgoing directory connection, but " - "we couldn't find a directory that fit our criteria. " - "Perhaps we will succeed next time with less strict criteria."); - } else if (!fascist_firewall_allows_rs(rs, FIREWALL_OR_CONNECTION, 1) - && !fascist_firewall_allows_rs(rs, FIREWALL_DIR_CONNECTION, 1) - ) { - /* This is rare, and might be interesting to users trying to diagnose - * connection issues on dual-stack machines. */ - log_info(LD_DIR, "Selected a directory %s with non-preferred OR and Dir " - "addresses for launching an outgoing connection: " - "IPv4 %s OR %d Dir %d IPv6 %s OR %d Dir %d", - routerstatus_describe(rs), - fmt_addr32(rs->addr), rs->or_port, - rs->dir_port, fmt_addr(&rs->ipv6_addr), - rs->ipv6_orport, rs->dir_port); - } -} - -#undef LOG_FALSE_POSITIVES_DURING_BOOTSTRAP - /** How long do we avoid using a directory server after it's given us a 503? */ #define DIR_503_TIMEOUT (60*60) -/* Common retry code for router_pick_directory_server_impl and - * router_pick_trusteddirserver_impl. Retry with the non-preferred IP version. - * Must be called before RETRY_WITHOUT_EXCLUDE(). - * - * If we got no result, and we are applying IP preferences, and we are a - * client that could use an alternate IP version, try again with the - * opposite preferences. */ -#define RETRY_ALTERNATE_IP_VERSION(retry_label) \ - STMT_BEGIN \ - if (result == NULL && try_ip_pref && options->ClientUseIPv4 \ - && fascist_firewall_use_ipv6(options) && !server_mode(options) \ - && !n_busy) { \ - n_excluded = 0; \ - n_busy = 0; \ - try_ip_pref = 0; \ - goto retry_label; \ - } \ - STMT_END \ - -/* Common retry code for router_pick_directory_server_impl and - * router_pick_trusteddirserver_impl. Retry without excluding nodes, but with - * the preferred IP version. Must be called after RETRY_ALTERNATE_IP_VERSION(). - * - * If we got no result, and we are excluding nodes, and StrictNodes is - * not set, try again without excluding nodes. */ -#define RETRY_WITHOUT_EXCLUDE(retry_label) \ - STMT_BEGIN \ - if (result == NULL && try_excluding && !options->StrictNodes \ - && n_excluded && !n_busy) { \ - try_excluding = 0; \ - n_excluded = 0; \ - n_busy = 0; \ - try_ip_pref = 1; \ - goto retry_label; \ - } \ - STMT_END - -/* Common code used in the loop within router_pick_directory_server_impl and - * router_pick_trusteddirserver_impl. - * - * Check if the given identity supports extrainfo. If not, skip further - * checks. - */ -#define SKIP_MISSING_TRUSTED_EXTRAINFO(type, identity) \ - STMT_BEGIN \ - int is_trusted_extrainfo = router_digest_is_trusted_dir_type( \ - (identity), EXTRAINFO_DIRINFO); \ - if (((type) & EXTRAINFO_DIRINFO) && \ - !router_supports_extrainfo((identity), is_trusted_extrainfo)) \ - continue; \ - STMT_END - -/* When iterating through the routerlist, can OR address/port preference - * and reachability checks be skipped? - */ -int -router_skip_or_reachability(const or_options_t *options, int try_ip_pref) -{ - /* Servers always have and prefer IPv4. - * And if clients are checking against the firewall for reachability only, - * but there's no firewall, don't bother checking */ - return server_mode(options) || (!try_ip_pref && !firewall_is_fascist_or()); -} - -/* When iterating through the routerlist, can Dir address/port preference - * and reachability checks be skipped? - */ -static int -router_skip_dir_reachability(const or_options_t *options, int try_ip_pref) -{ - /* Servers always have and prefer IPv4. - * And if clients are checking against the firewall for reachability only, - * but there's no firewall, don't bother checking */ - return server_mode(options) || (!try_ip_pref && !firewall_is_fascist_dir()); -} - /** Pick a random running valid directory server/mirror from our - * routerlist. Arguments are as for router_pick_directory_server(), except: + * routerlist. Arguments are as for router_pick_directory_server(), except + * that RETRY_IF_NO_SERVERS is ignored, and: * - * If n_busy_out is provided, set *n_busy_out to the number of - * directories that we excluded for no other reason than - * PDS_NO_EXISTING_SERVERDESC_FETCH or PDS_NO_EXISTING_MICRODESC_FETCH. + * If the PDS_PREFER_TUNNELED_DIR_CONNS_ flag is set, prefer directory servers + * that we can use with BEGINDIR. */ -STATIC const routerstatus_t * -router_pick_directory_server_impl(dirinfo_type_t type, int flags, - int *n_busy_out) +static const routerstatus_t * +router_pick_directory_server_impl(dirinfo_type_t type, int flags) { const or_options_t *options = get_options(); const node_t *result; @@ -2002,17 +1426,16 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, smartlist_t *overloaded_direct, *overloaded_tunnel; time_t now = time(NULL); const networkstatus_t *consensus = networkstatus_get_latest_consensus(); - const int requireother = ! (flags & PDS_ALLOW_SELF); - const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); - const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH); - const int no_microdesc_fetching = (flags & PDS_NO_EXISTING_MICRODESC_FETCH); - int try_excluding = 1, n_excluded = 0, n_busy = 0; - int try_ip_pref = 1; + int requireother = ! (flags & PDS_ALLOW_SELF); + int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); + int prefer_tunnel = (flags & PDS_PREFER_TUNNELED_DIR_CONNS_); + int for_guard = (flags & PDS_FOR_GUARD); + int try_excluding = 1, n_excluded = 0; if (!consensus) return NULL; - retry_search: + retry_without_exclude: direct = smartlist_new(); tunnel = smartlist_new(); @@ -2021,26 +1444,31 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, overloaded_direct = smartlist_new(); overloaded_tunnel = smartlist_new(); - const int skip_or_fw = router_skip_or_reachability(options, try_ip_pref); - const int skip_dir_fw = router_skip_dir_reachability(options, try_ip_pref); - const int must_have_or = directory_must_use_begindir(options); - /* Find all the running dirservers we know about. */ SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { int is_trusted; int is_overloaded; + tor_addr_t addr; const routerstatus_t *status = node->rs; const country_t country = node->country; if (!status) continue; - if (!node->is_running || !node_is_dir(node) || !node->is_valid) + if (!node->is_running || !status->dir_port || !node->is_valid) + continue; + if (node->is_bad_directory) continue; if (requireother && router_digest_is_me(node->identity)) continue; - - SKIP_MISSING_TRUSTED_EXTRAINFO(type, node->identity); - + is_trusted = router_digest_is_trusted_dir(node->identity); + if ((type & EXTRAINFO_DIRINFO) && + !router_supports_extrainfo(node->identity, 0)) + continue; + if ((type & MICRODESC_DIRINFO) && !is_trusted && + !node->rs->version_supports_microdesc_cache) + continue; + if (for_guard && node->using_as_guard) + continue; /* Don't make the same node a guard twice. */ if (try_excluding && routerset_contains_routerstatus(options->ExcludeNodes, status, country)) { @@ -2048,33 +1476,18 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, continue; } - if (router_is_already_dir_fetching_(status->addr, - &status->ipv6_addr, - status->dir_port, - no_serverdesc_fetching, - no_microdesc_fetching)) { - ++n_busy; - continue; - } + /* XXXX IP6 proposal 118 */ + tor_addr_from_ipv4h(&addr, node->rs->addr); is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; - is_trusted = router_digest_is_trusted_dir(node->identity); - /* Clients use IPv6 addresses if the server has one and the client - * prefers IPv6. - * Add the router if its preferred address and port are reachable. - * If we don't get any routers, we'll try again with the non-preferred - * address for each router (if any). (To ensure correct load-balancing - * we try routers that only have one address both times.) - */ - if (!fascistfirewall || skip_or_fw || - fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, - try_ip_pref)) + if (prefer_tunnel && + (!fascistfirewall || + fascist_firewall_allows_address_or(&addr, status->or_port))) smartlist_add(is_trusted ? trusted_tunnel : is_overloaded ? overloaded_tunnel : tunnel, (void*)node); - else if (!must_have_or && (skip_dir_fw || - fascist_firewall_allows_node(node, FIREWALL_DIR_CONNECTION, - try_ip_pref))) + else if (!fascistfirewall || + fascist_firewall_allows_address_dir(&addr, status->dir_port)) smartlist_add(is_trusted ? trusted_direct : is_overloaded ? overloaded_direct : direct, (void*)node); } SMARTLIST_FOREACH_END(node); @@ -2105,14 +1518,13 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags, smartlist_free(overloaded_direct); smartlist_free(overloaded_tunnel); - RETRY_ALTERNATE_IP_VERSION(retry_search); - - RETRY_WITHOUT_EXCLUDE(retry_search); - - if (n_busy_out) - *n_busy_out = n_busy; - - router_picked_poor_directory_log(result ? result->rs : NULL); + if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) { + /* If we got no result, and we are excluding nodes, and StrictNodes is + * not set, try again without excluding nodes. */ + try_excluding = 0; + n_excluded = 0; + goto retry_without_exclude; + } return result ? result->rs : NULL; } @@ -2124,23 +1536,20 @@ dirserver_choose_by_weight(const smartlist_t *servers, double authority_weight) { int n = smartlist_len(servers); int i; - double *weights_dbl; - uint64_t *weights_u64; + u64_dbl_t *weights; const dir_server_t *ds; - weights_dbl = tor_calloc(n, sizeof(double)); - weights_u64 = tor_calloc(n, sizeof(uint64_t)); + weights = tor_malloc(sizeof(u64_dbl_t) * n); for (i = 0; i < n; ++i) { ds = smartlist_get(servers, i); - weights_dbl[i] = ds->weight; + weights[i].dbl = ds->weight; if (ds->is_authority) - weights_dbl[i] *= authority_weight; + weights[i].dbl *= authority_weight; } - scale_array_elements_to_u64(weights_u64, weights_dbl, n, NULL); - i = choose_array_element_by_weight(weights_u64, n); - tor_free(weights_dbl); - tor_free(weights_u64); + scale_array_elements_to_u64(weights, n, NULL); + i = choose_array_element_by_weight(weights, n); + tor_free(weights); return (i < 0) ? NULL : smartlist_get(servers, i); } @@ -2160,6 +1569,7 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, time_t now = time(NULL); const int requireother = ! (flags & PDS_ALLOW_SELF); const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); + const int prefer_tunnel = (flags & PDS_PREFER_TUNNELED_DIR_CONNS_); const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH); const int no_microdesc_fetching =(flags & PDS_NO_EXISTING_MICRODESC_FETCH); const double auth_weight = (sourcelist == fallback_dir_servers) ? @@ -2167,34 +1577,30 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, smartlist_t *pick_from; int n_busy = 0; int try_excluding = 1, n_excluded = 0; - int try_ip_pref = 1; if (!sourcelist) return NULL; - retry_search: + retry_without_exclude: direct = smartlist_new(); tunnel = smartlist_new(); overloaded_direct = smartlist_new(); overloaded_tunnel = smartlist_new(); - const int skip_or_fw = router_skip_or_reachability(options, try_ip_pref); - const int skip_dir_fw = router_skip_dir_reachability(options, try_ip_pref); - const int must_have_or = directory_must_use_begindir(options); - SMARTLIST_FOREACH_BEGIN(sourcelist, const dir_server_t *, d) { int is_overloaded = d->fake_status.last_dir_503_at + DIR_503_TIMEOUT > now; + tor_addr_t addr; if (!d->is_running) continue; if ((type & d->type) == 0) continue; - - SKIP_MISSING_TRUSTED_EXTRAINFO(type, d->digest); - - if (requireother && me && router_digest_is_me(d->digest)) + if ((type & EXTRAINFO_DIRINFO) && + !router_supports_extrainfo(d->digest, 1)) continue; + if (requireother && me && router_digest_is_me(d->digest)) + continue; if (try_excluding && routerset_contains_routerstatus(options->ExcludeNodes, &d->fake_status, -1)) { @@ -2202,29 +1608,35 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, continue; } - if (router_is_already_dir_fetching_(d->addr, - &d->ipv6_addr, - d->dir_port, - no_serverdesc_fetching, - no_microdesc_fetching)) { - ++n_busy; - continue; + /* XXXX IP6 proposal 118 */ + tor_addr_from_ipv4h(&addr, d->addr); + + if (no_serverdesc_fetching) { + if (connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, d->dir_port, DIR_PURPOSE_FETCH_SERVERDESC) + || connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, d->dir_port, DIR_PURPOSE_FETCH_EXTRAINFO)) { + //log_debug(LD_DIR, "We have an existing connection to fetch " + // "descriptor from %s; delaying",d->description); + ++n_busy; + continue; + } + } + if (no_microdesc_fetching) { + if (connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, d->dir_port, DIR_PURPOSE_FETCH_MICRODESC)) { + ++n_busy; + continue; + } } - /* Clients use IPv6 addresses if the server has one and the client - * prefers IPv6. - * Add the router if its preferred address and port are reachable. - * If we don't get any routers, we'll try again with the non-preferred - * address for each router (if any). (To ensure correct load-balancing - * we try routers that only have one address both times.) - */ - if (!fascistfirewall || skip_or_fw || - fascist_firewall_allows_dir_server(d, FIREWALL_OR_CONNECTION, - try_ip_pref)) + if (prefer_tunnel && + d->or_port && + (!fascistfirewall || + fascist_firewall_allows_address_or(&addr, d->or_port))) smartlist_add(is_overloaded ? overloaded_tunnel : tunnel, (void*)d); - else if (!must_have_or && (skip_dir_fw || - fascist_firewall_allows_dir_server(d, FIREWALL_DIR_CONNECTION, - try_ip_pref))) + else if (!fascistfirewall || + fascist_firewall_allows_address_dir(&addr, d->dir_port)) smartlist_add(is_overloaded ? overloaded_direct : direct, (void*)d); } SMARTLIST_FOREACH_END(d); @@ -2247,19 +1659,22 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist, result = &selection->fake_status; } + if (n_busy_out) + *n_busy_out = n_busy; + smartlist_free(direct); smartlist_free(tunnel); smartlist_free(overloaded_direct); smartlist_free(overloaded_tunnel); - RETRY_ALTERNATE_IP_VERSION(retry_search); - - RETRY_WITHOUT_EXCLUDE(retry_search); - - router_picked_poor_directory_log(result); + if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) { + /* If we got no result, and we are excluding nodes, and StrictNodes is + * not set, try again without excluding nodes. */ + try_excluding = 0; + n_excluded = 0; + goto retry_without_exclude; + } - if (n_busy_out) - *n_busy_out = n_busy; return result; } @@ -2313,7 +1728,7 @@ routerlist_add_node_and_family(smartlist_t *sl, const routerinfo_t *router) { /* XXXX MOVE ? */ node_t fake_node; - const node_t *node = node_get_by_id(router->cache_info.identity_digest); + const node_t *node = node_get_by_id(router->cache_info.identity_digest);; if (node == NULL) { memset(&fake_node, 0, sizeof(fake_node)); fake_node.ri = (routerinfo_t *)router; @@ -2326,17 +1741,14 @@ routerlist_add_node_and_family(smartlist_t *sl, const routerinfo_t *router) /** Add every suitable node from our nodelist to sl, so that * we can pick a node for a circuit. */ -void -router_add_running_nodes_to_smartlist(smartlist_t *sl, int need_uptime, - int need_capacity, int need_guard, - int need_desc, int pref_addr, - int direct_conn) -{ - const int check_reach = !router_skip_or_reachability(get_options(), - pref_addr); - /* XXXX MOVE */ +static void +router_add_running_nodes_to_smartlist(smartlist_t *sl, int allow_invalid, + int need_uptime, int need_capacity, + int need_guard, int need_desc) +{ /* XXXX MOVE */ SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { - if (!node->is_running || !node->is_valid) + if (!node->is_running || + (!node->is_valid && !allow_invalid)) continue; if (need_desc && !(node->ri || (node->rs && node->md))) continue; @@ -2344,18 +1756,6 @@ router_add_running_nodes_to_smartlist(smartlist_t *sl, int need_uptime, continue; if (node_is_unreliable(node, need_uptime, need_capacity, need_guard)) continue; - /* Don't choose nodes if we are certain they can't do EXTEND2 cells */ - if (node->rs && !routerstatus_version_supports_extend2_cells(node->rs, 1)) - continue; - /* Don't choose nodes if we are certain they can't do ntor. */ - if ((node->ri || node->md) && !node_has_curve25519_onion_key(node)) - continue; - /* Choose a node with an OR address that matches the firewall rules */ - if (direct_conn && check_reach && - !fascist_firewall_allows_node(node, - FIREWALL_OR_CONNECTION, - pref_addr)) - continue; smartlist_add(sl, (void *)node); } SMARTLIST_FOREACH_END(node); @@ -2409,43 +1809,58 @@ router_get_advertised_bandwidth_capped(const routerinfo_t *router) * much of the range of uint64_t. If total_out is provided, set it to * the sum of all elements in the array _before_ scaling. */ STATIC void -scale_array_elements_to_u64(uint64_t *entries_out, const double *entries_in, - int n_entries, +scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries, uint64_t *total_out) { double total = 0.0; - double scale_factor = 0.0; + double scale_factor; int i; + /* big, but far away from overflowing an int64_t */ +#define SCALE_TO_U64_MAX (INT64_MAX / 4) for (i = 0; i < n_entries; ++i) - total += entries_in[i]; + total += entries[i].dbl; - if (total > 0.0) { - scale_factor = ((double)INT64_MAX) / total; - scale_factor /= 4.0; /* make sure we're very far away from overflowing */ - } + scale_factor = SCALE_TO_U64_MAX / total; for (i = 0; i < n_entries; ++i) - entries_out[i] = tor_llround(entries_in[i] * scale_factor); + entries[i].u64 = tor_llround(entries[i].dbl * scale_factor); if (total_out) *total_out = (uint64_t) total; + +#undef SCALE_TO_U64_MAX } +/** Time-invariant 64-bit greater-than; works on two integers in the range + * (0,INT64_MAX). */ +#if SIZEOF_VOID_P == 8 +#define gt_i64_timei(a,b) ((a) > (b)) +#else +static INLINE int +gt_i64_timei(uint64_t a, uint64_t b) +{ + int64_t diff = (int64_t) (b - a); + int res = diff >> 63; + return res & 1; +} +#endif + /** Pick a random element of n_entries-element array entries, * choosing each element with a probability proportional to its (uint64_t) * value, and return the index of that element. If all elements are 0, choose * an index at random. Return -1 on error. */ STATIC int -choose_array_element_by_weight(const uint64_t *entries, int n_entries) +choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries) { - int i; + int i, i_chosen=-1, n_chosen=0; + uint64_t total_so_far = 0; uint64_t rand_val; uint64_t total = 0; for (i = 0; i < n_entries; ++i) - total += entries[i]; + total += entries[i].u64; if (n_entries < 1) return -1; @@ -2457,8 +1872,22 @@ choose_array_element_by_weight(const uint64_t *entries, int n_entries) rand_val = crypto_rand_uint64(total); - return select_array_member_cumulative_timei( - entries, n_entries, total, rand_val); + for (i = 0; i < n_entries; ++i) { + total_so_far += entries[i].u64; + if (gt_i64_timei(total_so_far, rand_val)) { + i_chosen = i; + n_chosen++; + /* Set rand_val to INT64_MAX rather than stopping the loop. This way, + * the time we spend in the loop does not leak which element we chose. */ + rand_val = INT64_MAX; + } + } + tor_assert(total_so_far == total); + tor_assert(n_chosen == 1); + tor_assert(i_chosen >= 0); + tor_assert(i_chosen < n_entries); + + return i_chosen; } /** When weighting bridges, enforce these values as lower and upper @@ -2486,7 +1915,7 @@ bridge_get_advertised_bandwidth_bounded(routerinfo_t *router) /** Return bw*1000, unless bw*1000 would overflow, in which case return * INT32_MAX. */ -static inline int32_t +static INLINE int32_t kb_to_bytes(uint32_t bw) { return (bw > (INT32_MAX/1000)) ? INT32_MAX : bw*1000; @@ -2510,21 +1939,18 @@ static const node_t * smartlist_choose_node_by_bandwidth_weights(const smartlist_t *sl, bandwidth_weight_rule_t rule) { - double *bandwidths_dbl=NULL; - uint64_t *bandwidths_u64=NULL; + u64_dbl_t *bandwidths=NULL; - if (compute_weighted_bandwidths(sl, rule, &bandwidths_dbl, NULL) < 0) + if (compute_weighted_bandwidths(sl, rule, &bandwidths) < 0) return NULL; - bandwidths_u64 = tor_calloc(smartlist_len(sl), sizeof(uint64_t)); - scale_array_elements_to_u64(bandwidths_u64, bandwidths_dbl, - smartlist_len(sl), NULL); + scale_array_elements_to_u64(bandwidths, smartlist_len(sl), + &sl_last_total_weighted_bw); { - int idx = choose_array_element_by_weight(bandwidths_u64, + int idx = choose_array_element_by_weight(bandwidths, smartlist_len(sl)); - tor_free(bandwidths_dbl); - tor_free(bandwidths_u64); + tor_free(bandwidths); return idx < 0 ? NULL : smartlist_get(sl, idx); } } @@ -2533,24 +1959,17 @@ smartlist_choose_node_by_bandwidth_weights(const smartlist_t *sl, * smartlist_choose_node_by_bandwidth_weights, compute weighted bandwidth * values for each node and store them in a freshly allocated * *bandwidths_out of the same length as sl, and holding results - * as doubles. If total_bandwidth_out is non-NULL, set it to the total - * of all the bandwidths. - * Return 0 on success, -1 on failure. */ + * as doubles. Return 0 on success, -1 on failure. */ static int compute_weighted_bandwidths(const smartlist_t *sl, bandwidth_weight_rule_t rule, - double **bandwidths_out, - double *total_bandwidth_out) + u64_dbl_t **bandwidths_out) { int64_t weight_scale; double Wg = -1, Wm = -1, We = -1, Wd = -1; double Wgb = -1, Wmb = -1, Web = -1, Wdb = -1; - guardfraction_bandwidth_t guardfraction_bw; - double *bandwidths = NULL; - double total_bandwidth = 0.0; - - tor_assert(sl); - tor_assert(bandwidths_out); + uint64_t weighted_bw = 0; + u64_dbl_t *bandwidths; /* Can't choose exit and guard at same time */ tor_assert(rule == NO_WEIGHTING || @@ -2559,12 +1978,6 @@ compute_weighted_bandwidths(const smartlist_t *sl, rule == WEIGHT_FOR_MID || rule == WEIGHT_FOR_DIR); - *bandwidths_out = NULL; - - if (total_bandwidth_out) { - *total_bandwidth_out = 0.0; - } - if (smartlist_len(sl) == 0) { log_info(LD_CIRC, "Empty routerlist passed in to consensus weight node " @@ -2622,10 +2035,9 @@ compute_weighted_bandwidths(const smartlist_t *sl, if (Wg < 0 || Wm < 0 || We < 0 || Wd < 0 || Wgb < 0 || Wmb < 0 || Wdb < 0 || Web < 0) { log_debug(LD_CIRC, - "Got negative bandwidth weights. Defaulting to naive selection" + "Got negative bandwidth weights. Defaulting to old selection" " algorithm."); - Wg = Wm = We = Wd = weight_scale; - Wgb = Wmb = Web = Wdb = weight_scale; + return -1; // Use old algorithm. } Wg /= weight_scale; @@ -2638,32 +2050,26 @@ compute_weighted_bandwidths(const smartlist_t *sl, Web /= weight_scale; Wdb /= weight_scale; - bandwidths = tor_calloc(smartlist_len(sl), sizeof(double)); + bandwidths = tor_malloc_zero(sizeof(u64_dbl_t)*smartlist_len(sl)); // Cycle through smartlist and total the bandwidth. - static int warned_missing_bw = 0; SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { - int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0; + int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0, is_me = 0; double weight = 1; - double weight_without_guard_flag = 0; /* Used for guardfraction */ - double final_weight = 0; is_exit = node->is_exit && ! node->is_bad_exit; is_guard = node->is_possible_guard; is_dir = node_is_dir(node); if (node->rs) { if (!node->rs->has_bandwidth) { + tor_free(bandwidths); /* This should never happen, unless all the authorites downgrade * to 0.2.0 or rogue routerstatuses get inserted into our consensus. */ - if (! warned_missing_bw) { - log_warn(LD_BUG, - "Consensus is missing some bandwidths. Using a naive " - "router selection algorithm"); - warned_missing_bw = 1; - } - this_bw = 30000; /* Chosen arbitrarily */ - } else { - this_bw = kb_to_bytes(node->rs->bandwidth_kb); + log_warn(LD_BUG, + "Consensus is not listing bandwidths. Defaulting back to " + "old router selection algorithm."); + return -1; } + this_bw = kb_to_bytes(node->rs->bandwidth_kb); } else if (node->ri) { /* bridge or other descriptor not in our consensus */ this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); @@ -2671,13 +2077,12 @@ compute_weighted_bandwidths(const smartlist_t *sl, /* We can't use this one. */ continue; } + is_me = router_digest_is_me(node->identity); if (is_guard && is_exit) { weight = (is_dir ? Wdb*Wd : Wd); - weight_without_guard_flag = (is_dir ? Web*We : We); } else if (is_guard) { weight = (is_dir ? Wgb*Wg : Wg); - weight_without_guard_flag = (is_dir ? Wmb*Wm : Wm); } else if (is_exit) { weight = (is_dir ? Web*We : We); } else { // middle @@ -2689,93 +2094,276 @@ compute_weighted_bandwidths(const smartlist_t *sl, this_bw = 0; if (weight < 0.0) weight = 0.0; - if (weight_without_guard_flag < 0.0) - weight_without_guard_flag = 0.0; - /* If guardfraction information is available in the consensus, we - * want to calculate this router's bandwidth according to its - * guardfraction. Quoting from proposal236: - * - * Let Wpf denote the weight from the 'bandwidth-weights' line a - * client would apply to N for position p if it had the guard - * flag, Wpn the weight if it did not have the guard flag, and B the - * measured bandwidth of N in the consensus. Then instead of choosing - * N for position p proportionally to Wpf*B or Wpn*B, clients should - * choose N proportionally to F*Wpf*B + (1-F)*Wpn*B. - */ - if (node->rs && node->rs->has_guardfraction && rule != WEIGHT_FOR_GUARD) { - /* XXX The assert should actually check for is_guard. However, - * that crashes dirauths because of #13297. This should be - * equivalent: */ - tor_assert(node->rs->is_possible_guard); - - guard_get_guardfraction_bandwidth(&guardfraction_bw, - this_bw, - node->rs->guardfraction_percentage); - - /* Calculate final_weight = F*Wpf*B + (1-F)*Wpn*B */ - final_weight = - guardfraction_bw.guard_bw * weight + - guardfraction_bw.non_guard_bw * weight_without_guard_flag; - - log_debug(LD_GENERAL, "%s: Guardfraction weight %f instead of %f (%s)", - node->rs->nickname, final_weight, weight*this_bw, - bandwidth_weight_rule_to_string(rule)); - } else { /* no guardfraction information. calculate the weight normally. */ - final_weight = weight*this_bw; + bandwidths[node_sl_idx].dbl = weight*this_bw + 0.5; + if (is_me) + sl_last_weighted_bw_of_me = (uint64_t) bandwidths[node_sl_idx].dbl; + } SMARTLIST_FOREACH_END(node); + + log_debug(LD_CIRC, "Generated weighted bandwidths for rule %s based " + "on weights " + "Wg=%f Wm=%f We=%f Wd=%f with total bw "U64_FORMAT, + bandwidth_weight_rule_to_string(rule), + Wg, Wm, We, Wd, U64_PRINTF_ARG(weighted_bw)); + + *bandwidths_out = bandwidths; + + return 0; +} + +/** For all nodes in sl, return the fraction of those nodes, weighted + * by their weighted bandwidths with rule rule, for which we have + * descriptors. */ +double +frac_nodes_with_descriptors(const smartlist_t *sl, + bandwidth_weight_rule_t rule) +{ + u64_dbl_t *bandwidths = NULL; + double total, present; + + if (smartlist_len(sl) == 0) + return 0.0; + + if (compute_weighted_bandwidths(sl, rule, &bandwidths) < 0) { + int n_with_descs = 0; + SMARTLIST_FOREACH(sl, const node_t *, node, { + if (node_has_descriptor(node)) + n_with_descs++; + }); + return ((double)n_with_descs) / (double)smartlist_len(sl); + } + + total = present = 0.0; + SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { + const double bw = bandwidths[node_sl_idx].dbl; + total += bw; + if (node_has_descriptor(node)) + present += bw; + } SMARTLIST_FOREACH_END(node); + + tor_free(bandwidths); + + if (total < 1.0) + return 0; + + return present / total; +} + +/** Helper function: + * choose a random node_t element of smartlist sl, weighted by + * the advertised bandwidth of each element. + * + * If rule==WEIGHT_FOR_EXIT. we're picking an exit node: consider all + * nodes' bandwidth equally regardless of their Exit status, since there may + * be some in the list because they exit to obscure ports. If + * rule==NO_WEIGHTING, we're picking a non-exit node: weight + * exit-node's bandwidth less depending on the smallness of the fraction of + * Exit-to-total bandwidth. If rule==WEIGHT_FOR_GUARD, we're picking a + * guard node: consider all guard's bandwidth equally. Otherwise, weight + * guards proportionally less. + */ +static const node_t * +smartlist_choose_node_by_bandwidth(const smartlist_t *sl, + bandwidth_weight_rule_t rule) +{ + unsigned int i; + u64_dbl_t *bandwidths; + int is_exit; + int is_guard; + int is_fast; + double total_nonexit_bw = 0, total_exit_bw = 0; + double total_nonguard_bw = 0, total_guard_bw = 0; + double exit_weight; + double guard_weight; + int n_unknown = 0; + bitarray_t *fast_bits; + bitarray_t *exit_bits; + bitarray_t *guard_bits; + int me_idx = -1; + + // This function does not support WEIGHT_FOR_DIR + // or WEIGHT_FOR_MID + if (rule == WEIGHT_FOR_DIR || rule == WEIGHT_FOR_MID) { + rule = NO_WEIGHTING; + } + + /* Can't choose exit and guard at same time */ + tor_assert(rule == NO_WEIGHTING || + rule == WEIGHT_FOR_EXIT || + rule == WEIGHT_FOR_GUARD); + + if (smartlist_len(sl) == 0) { + log_info(LD_CIRC, + "Empty routerlist passed in to old node selection for rule %s", + bandwidth_weight_rule_to_string(rule)); + return NULL; + } + + /* First count the total bandwidth weight, and make a list + * of each value. We use UINT64_MAX to indicate "unknown". */ + bandwidths = tor_malloc_zero(sizeof(u64_dbl_t)*smartlist_len(sl)); + fast_bits = bitarray_init_zero(smartlist_len(sl)); + exit_bits = bitarray_init_zero(smartlist_len(sl)); + guard_bits = bitarray_init_zero(smartlist_len(sl)); + + /* Iterate over all the routerinfo_t or routerstatus_t, and */ + SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { + /* first, learn what bandwidth we think i has */ + int is_known = 1; + uint32_t this_bw = 0; + i = node_sl_idx; + + if (router_digest_is_me(node->identity)) + me_idx = node_sl_idx; + + is_exit = node->is_exit; + is_guard = node->is_possible_guard; + if (node->rs) { + if (node->rs->has_bandwidth) { + this_bw = kb_to_bytes(node->rs->bandwidth_kb); + } else { /* guess */ + is_known = 0; + } + } else if (node->ri) { + /* Must be a bridge if we're willing to use it */ + this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); + } + + if (is_exit) + bitarray_set(exit_bits, i); + if (is_guard) + bitarray_set(guard_bits, i); + if (node->is_fast) + bitarray_set(fast_bits, i); + + if (is_known) { + bandwidths[i].dbl = this_bw; + if (is_guard) + total_guard_bw += this_bw; + else + total_nonguard_bw += this_bw; + if (is_exit) + total_exit_bw += this_bw; + else + total_nonexit_bw += this_bw; + } else { + ++n_unknown; + bandwidths[i].dbl = -1.0; + } + } SMARTLIST_FOREACH_END(node); + +#define EPSILON .1 + + /* Now, fill in the unknown values. */ + if (n_unknown) { + int32_t avg_fast, avg_slow; + if (total_exit_bw+total_nonexit_bw < EPSILON) { + /* if there's some bandwidth, there's at least one known router, + * so no worries about div by 0 here */ + int n_known = smartlist_len(sl)-n_unknown; + avg_fast = avg_slow = (int32_t) + ((total_exit_bw+total_nonexit_bw)/((uint64_t) n_known)); + } else { + avg_fast = 40000; + avg_slow = 20000; + } + for (i=0; i<(unsigned)smartlist_len(sl); ++i) { + if (bandwidths[i].dbl >= 0.0) + continue; + is_fast = bitarray_is_set(fast_bits, i); + is_exit = bitarray_is_set(exit_bits, i); + is_guard = bitarray_is_set(guard_bits, i); + bandwidths[i].dbl = is_fast ? avg_fast : avg_slow; + if (is_exit) + total_exit_bw += bandwidths[i].dbl; + else + total_nonexit_bw += bandwidths[i].dbl; + if (is_guard) + total_guard_bw += bandwidths[i].dbl; + else + total_nonguard_bw += bandwidths[i].dbl; } + } - bandwidths[node_sl_idx] = final_weight; - total_bandwidth += final_weight; - } SMARTLIST_FOREACH_END(node); + /* If there's no bandwidth at all, pick at random. */ + if (total_exit_bw+total_nonexit_bw < EPSILON) { + tor_free(bandwidths); + tor_free(fast_bits); + tor_free(exit_bits); + tor_free(guard_bits); + return smartlist_choose(sl); + } - log_debug(LD_CIRC, "Generated weighted bandwidths for rule %s based " - "on weights " - "Wg=%f Wm=%f We=%f Wd=%f with total bw %f", - bandwidth_weight_rule_to_string(rule), - Wg, Wm, We, Wd, total_bandwidth); + /* Figure out how to weight exits and guards */ + { + double all_bw = U64_TO_DBL(total_exit_bw+total_nonexit_bw); + double exit_bw = U64_TO_DBL(total_exit_bw); + double guard_bw = U64_TO_DBL(total_guard_bw); + /* + * For detailed derivation of this formula, see + * http://archives.seul.org/or/dev/Jul-2007/msg00056.html + */ + if (rule == WEIGHT_FOR_EXIT || total_exit_bwsl, return the fraction of those nodes, weighted - * by their weighted bandwidths with rule rule, for which we have - * descriptors. */ -double -frac_nodes_with_descriptors(const smartlist_t *sl, - bandwidth_weight_rule_t rule) -{ - double *bandwidths = NULL; - double total, present; + sl_last_weighted_bw_of_me = 0; + for (i=0; i < (unsigned)smartlist_len(sl); i++) { + tor_assert(bandwidths[i].dbl >= 0.0); - if (smartlist_len(sl) == 0) - return 0.0; + is_exit = bitarray_is_set(exit_bits, i); + is_guard = bitarray_is_set(guard_bits, i); + if (is_exit && is_guard) + bandwidths[i].dbl *= exit_weight * guard_weight; + else if (is_guard) + bandwidths[i].dbl *= guard_weight; + else if (is_exit) + bandwidths[i].dbl *= exit_weight; - if (compute_weighted_bandwidths(sl, rule, &bandwidths, &total) < 0 || - total <= 0.0) { - int n_with_descs = 0; - SMARTLIST_FOREACH(sl, const node_t *, node, { - if (node_has_descriptor(node)) - n_with_descs++; - }); - return ((double)n_with_descs) / (double)smartlist_len(sl); + if (i == (unsigned) me_idx) + sl_last_weighted_bw_of_me = (uint64_t) bandwidths[i].dbl; + } } - present = 0.0; - SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { - if (node_has_descriptor(node)) - present += bandwidths[node_sl_idx]; - } SMARTLIST_FOREACH_END(node); +#if 0 + log_debug(LD_CIRC, "Total weighted bw = "U64_FORMAT + ", exit bw = "U64_FORMAT + ", nonexit bw = "U64_FORMAT", exit weight = %f " + "(for exit == %d)" + ", guard bw = "U64_FORMAT + ", nonguard bw = "U64_FORMAT", guard weight = %f " + "(for guard == %d)", + U64_PRINTF_ARG(total_bw), + U64_PRINTF_ARG(total_exit_bw), U64_PRINTF_ARG(total_nonexit_bw), + exit_weight, (int)(rule == WEIGHT_FOR_EXIT), + U64_PRINTF_ARG(total_guard_bw), U64_PRINTF_ARG(total_nonguard_bw), + guard_weight, (int)(rule == WEIGHT_FOR_GUARD)); +#endif - tor_free(bandwidths); + scale_array_elements_to_u64(bandwidths, smartlist_len(sl), + &sl_last_total_weighted_bw); - return present / total; + { + int idx = choose_array_element_by_weight(bandwidths, + smartlist_len(sl)); + tor_free(bandwidths); + tor_free(fast_bits); + tor_free(exit_bits); + tor_free(guard_bits); + return idx < 0 ? NULL : smartlist_get(sl, idx); + } } /** Choose a random element of status list sl, weighted by @@ -2784,7 +2372,12 @@ const node_t * node_sl_choose_by_bandwidth(const smartlist_t *sl, bandwidth_weight_rule_t rule) { /*XXXX MOVE */ - return smartlist_choose_node_by_bandwidth_weights(sl, rule); + const node_t *ret; + if ((ret = smartlist_choose_node_by_bandwidth_weights(sl, rule))) { + return ret; + } else { + return smartlist_choose_node_by_bandwidth(sl, rule); + } } /** Return a random running node from the nodelist. Never @@ -2795,6 +2388,8 @@ node_sl_choose_by_bandwidth(const smartlist_t *sl, * a minimum uptime, return one of those. * If CRN_NEED_CAPACITY is set in flags, weight your choice by the * advertised capacity of each router. + * If CRN_ALLOW_INVALID is not set in flags, consider only Valid + * routers. * If CRN_NEED_GUARD is set in flags, consider only Guard routers. * If CRN_WEIGHT_AS_EXIT is set in flags, we weight bandwidths as if * picking an exit node, otherwise we weight bandwidths for picking a relay @@ -2802,10 +2397,6 @@ node_sl_choose_by_bandwidth(const smartlist_t *sl, * If CRN_NEED_DESC is set in flags, we only consider nodes that * have a routerinfo or microdescriptor -- that is, enough info to be * used to build a circuit. - * If CRN_PREF_ADDR is set in flags, we only consider nodes that - * have an address that is preferred by the ClientPreferIPv6ORPort setting - * (regardless of this flag, we exclude nodes that aren't allowed by the - * firewall, including ClientUseIPv4 0 and fascist_firewall_use_ipv6() == 0). */ const node_t * router_choose_random_node(smartlist_t *excludedsmartlist, @@ -2815,11 +2406,9 @@ router_choose_random_node(smartlist_t *excludedsmartlist, const int need_uptime = (flags & CRN_NEED_UPTIME) != 0; const int need_capacity = (flags & CRN_NEED_CAPACITY) != 0; const int need_guard = (flags & CRN_NEED_GUARD) != 0; + const int allow_invalid = (flags & CRN_ALLOW_INVALID) != 0; const int weight_for_exit = (flags & CRN_WEIGHT_AS_EXIT) != 0; const int need_desc = (flags & CRN_NEED_DESC) != 0; - const int pref_addr = (flags & CRN_PREF_ADDR) != 0; - const int direct_conn = (flags & CRN_DIRECT_CONN) != 0; - const int rendezvous_v3 = (flags & CRN_RENDEZVOUS_V3) != 0; smartlist_t *sl=smartlist_new(), *excludednodes=smartlist_new(); @@ -2831,58 +2420,32 @@ router_choose_random_node(smartlist_t *excludedsmartlist, rule = weight_for_exit ? WEIGHT_FOR_EXIT : (need_guard ? WEIGHT_FOR_GUARD : WEIGHT_FOR_MID); - SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { - if (node_allows_single_hop_exits(node)) { - /* Exclude relays that allow single hop exit circuits. This is an - * obsolete option since 0.2.9.2-alpha and done by default in - * 0.3.1.0-alpha. */ - smartlist_add(excludednodes, node); - } else if (rendezvous_v3 && - !node_supports_v3_rendezvous_point(node)) { - /* Exclude relays that do not support to rendezvous for a hidden service - * version 3. */ - smartlist_add(excludednodes, node); - } - } SMARTLIST_FOREACH_END(node); + /* Exclude relays that allow single hop exit circuits, if the user + * wants to (such relays might be risky) */ + if (get_options()->ExcludeSingleHopRelays) { + SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, + if (node_allows_single_hop_exits(node)) { + smartlist_add(excludednodes, node); + }); + } - /* If the node_t is not found we won't be to exclude ourself but we - * won't be able to pick ourself in router_choose_random_node() so - * this is fine to at least try with our routerinfo_t object. */ - if ((r = router_get_my_routerinfo())) + if ((r = routerlist_find_my_routerinfo())) routerlist_add_node_and_family(excludednodes, r); - router_add_running_nodes_to_smartlist(sl, need_uptime, need_capacity, - need_guard, need_desc, pref_addr, - direct_conn); - log_debug(LD_CIRC, - "We found %d running nodes.", - smartlist_len(sl)); - + router_add_running_nodes_to_smartlist(sl, allow_invalid, + need_uptime, need_capacity, + need_guard, need_desc); smartlist_subtract(sl,excludednodes); - log_debug(LD_CIRC, - "We removed %d excludednodes, leaving %d nodes.", - smartlist_len(excludednodes), - smartlist_len(sl)); - - if (excludedsmartlist) { + if (excludedsmartlist) smartlist_subtract(sl,excludedsmartlist); - log_debug(LD_CIRC, - "We removed %d excludedsmartlist, leaving %d nodes.", - smartlist_len(excludedsmartlist), - smartlist_len(sl)); - } - if (excludedset) { + if (excludedset) routerset_subtract_nodes(sl,excludedset); - log_debug(LD_CIRC, - "We removed excludedset, leaving %d nodes.", - smartlist_len(sl)); - } // Always weight by bandwidth choice = node_sl_choose_by_bandwidth(sl, rule); smartlist_free(sl); - if (!choice && (need_uptime || need_capacity || need_guard || pref_addr)) { + if (!choice && (need_uptime || need_capacity || need_guard)) { /* try once more -- recurse but with fewer restrictions. */ log_info(LD_CIRC, "We couldn't find any live%s%s%s routers; falling back " @@ -2890,8 +2453,7 @@ router_choose_random_node(smartlist_t *excludedsmartlist, need_capacity?", fast":"", need_uptime?", stable":"", need_guard?", guard":""); - flags &= ~ (CRN_NEED_UPTIME|CRN_NEED_CAPACITY|CRN_NEED_GUARD| - CRN_PREF_ADDR); + flags &= ~ (CRN_NEED_UPTIME|CRN_NEED_CAPACITY|CRN_NEED_GUARD); choice = router_choose_random_node( excludedsmartlist, excludedset, flags); } @@ -2945,8 +2507,7 @@ hex_digest_nickname_decode(const char *hexdigest, return -1; } - if (base16_decode(digest_out, DIGEST_LEN, - hexdigest, HEX_DIGEST_LEN) != DIGEST_LEN) + if (base16_decode(digest_out, DIGEST_LEN, hexdigest, HEX_DIGEST_LEN)<0) return -1; return 0; } @@ -2957,7 +2518,7 @@ hex_digest_nickname_decode(const char *hexdigest, * hexdigest is malformed, or it doesn't match. */ int hex_digest_nickname_matches(const char *hexdigest, const char *identity_digest, - const char *nickname) + const char *nickname, int is_named) { char digest[DIGEST_LEN]; char nn_char='\0'; @@ -2966,23 +2527,33 @@ hex_digest_nickname_matches(const char *hexdigest, const char *identity_digest, if (hex_digest_nickname_decode(hexdigest, digest, &nn_char, nn_buf) == -1) return 0; - if (nn_char == '=') { - return 0; - } - - if (nn_char == '~') { - if (!nickname) // XXX This seems wrong. -NM + if (nn_char == '=' || nn_char == '~') { + if (!nickname) return 0; if (strcasecmp(nn_buf, nickname)) return 0; + if (nn_char == '=' && !is_named) + return 0; } return tor_memeq(digest, identity_digest, DIGEST_LEN); } +/** Return true iff router is listed as named in the current + * consensus. */ +int +router_is_named(const routerinfo_t *router) +{ + const char *digest = + networkstatus_get_router_digest_by_nickname(router->nickname); + + return (digest && + tor_memeq(digest, router->cache_info.identity_digest, DIGEST_LEN)); +} + /** Return true iff digest is the digest of the identity key of a * trusted directory matching at least one bit of type. If type - * is zero (NO_DIRINFO), or ALL_DIRINFO, any authority is okay. */ + * is zero, any authority is okay. */ int router_digest_is_trusted_dir_type(const char *digest, dirinfo_type_t type) { @@ -2997,6 +2568,20 @@ router_digest_is_trusted_dir_type(const char *digest, dirinfo_type_t type) return 0; } +/** Return true iff addr is the address of one of our trusted + * directory authorities. */ +int +router_addr_is_trusted_dir(uint32_t addr) +{ + if (!trusted_dir_servers) + return 0; + SMARTLIST_FOREACH(trusted_dir_servers, dir_server_t *, ent, + if (ent->addr == addr) + return 1; + ); + return 0; +} + /** If hexdigest is correctly formed, base16_decode it into * digest, which must have DIGEST_LEN space in it. * Return 0 on success, -1 on failure. @@ -3007,7 +2592,7 @@ hexdigest_to_digest(const char *hexdigest, char *digest) if (hexdigest[0]=='$') ++hexdigest; if (strlen(hexdigest) < HEX_DIGEST_LEN || - base16_decode(digest,DIGEST_LEN,hexdigest,HEX_DIGEST_LEN) != DIGEST_LEN) + base16_decode(digest,DIGEST_LEN,hexdigest,HEX_DIGEST_LEN) < 0) return -1; return 0; } @@ -3049,8 +2634,8 @@ router_get_by_descriptor_digest(const char *digest) /** Return the signed descriptor for the router in our routerlist whose * 20-byte extra-info digest is digest. Return NULL if no such router * is known. */ -MOCK_IMPL(signed_descriptor_t *, -router_get_by_extrainfo_digest,(const char *digest)) +signed_descriptor_t * +router_get_by_extrainfo_digest(const char *digest) { tor_assert(digest); @@ -3062,8 +2647,8 @@ router_get_by_extrainfo_digest,(const char *digest)) /** Return the signed descriptor for the extrainfo_t in our routerlist whose * extra-info-digest is digest. Return NULL if no such extra-info * document is known. */ -MOCK_IMPL(signed_descriptor_t *, -extrainfo_get_by_descriptor_digest,(const char *digest)) +signed_descriptor_t * +extrainfo_get_by_descriptor_digest(const char *digest) { extrainfo_t *ei; tor_assert(digest); @@ -3105,7 +2690,7 @@ signed_descriptor_get_body_impl(const signed_descriptor_t *desc, log_err(LD_DIR, "We couldn't read a descriptor that is supposedly " "mmaped in our cache. Is another process running in our data " "directory? Exiting."); - exit(1); // XXXX bad exit: should recover. + exit(1); } } if (!r) /* no mmap, or not in cache. */ @@ -3119,7 +2704,7 @@ signed_descriptor_get_body_impl(const signed_descriptor_t *desc, log_err(LD_DIR, "descriptor at %p begins with unexpected string %s. " "Is another process running in our data directory? Exiting.", desc, escaped(cp)); - exit(1); // XXXX bad exit: should recover. + exit(1); } } @@ -3173,22 +2758,21 @@ router_get_routerlist(void) /** Free all storage held by router. */ void -routerinfo_free_(routerinfo_t *router) +routerinfo_free(routerinfo_t *router) { if (!router) return; tor_free(router->cache_info.signed_descriptor_body); + tor_free(router->address); tor_free(router->nickname); tor_free(router->platform); - tor_free(router->protocol_list); tor_free(router->contact_info); if (router->onion_pkey) crypto_pk_free(router->onion_pkey); tor_free(router->onion_curve25519_pkey); if (router->identity_pkey) crypto_pk_free(router->identity_pkey); - tor_cert_free(router->cache_info.signing_key_cert); if (router->declared_family) { SMARTLIST_FOREACH(router->declared_family, char *, s, tor_free(s)); smartlist_free(router->declared_family); @@ -3203,11 +2787,10 @@ routerinfo_free_(routerinfo_t *router) /** Release all storage held by extrainfo */ void -extrainfo_free_(extrainfo_t *extrainfo) +extrainfo_free(extrainfo_t *extrainfo) { if (!extrainfo) return; - tor_cert_free(extrainfo->cache_info.signing_key_cert); tor_free(extrainfo->cache_info.signed_descriptor_body); tor_free(extrainfo->pending_sig); @@ -3215,49 +2798,19 @@ extrainfo_free_(extrainfo_t *extrainfo) tor_free(extrainfo); } -#define signed_descriptor_free(val) \ - FREE_AND_NULL(signed_descriptor_t, signed_descriptor_free_, (val)) - /** Release storage held by sd. */ static void -signed_descriptor_free_(signed_descriptor_t *sd) +signed_descriptor_free(signed_descriptor_t *sd) { if (!sd) return; tor_free(sd->signed_descriptor_body); - tor_cert_free(sd->signing_key_cert); memset(sd, 99, sizeof(signed_descriptor_t)); /* Debug bad mem usage */ tor_free(sd); } -/** Reset the given signed descriptor sd by freeing the allocated - * memory inside the object and by zeroing its content. */ -static void -signed_descriptor_reset(signed_descriptor_t *sd) -{ - tor_assert(sd); - tor_free(sd->signed_descriptor_body); - tor_cert_free(sd->signing_key_cert); - memset(sd, 0, sizeof(*sd)); -} - -/** Copy src into dest, and steal all references inside src so that when - * we free src, we don't mess up dest. */ -static void -signed_descriptor_move(signed_descriptor_t *dest, - signed_descriptor_t *src) -{ - tor_assert(dest != src); - /* Cleanup destination object before overwriting it.*/ - signed_descriptor_reset(dest); - memcpy(dest, src, sizeof(signed_descriptor_t)); - src->signed_descriptor_body = NULL; - src->signing_key_cert = NULL; - dest->routerlist_index = -1; -} - /** Extract a signed_descriptor_t from a general routerinfo, and free the * routerinfo. */ @@ -3267,46 +2820,40 @@ signed_descriptor_from_routerinfo(routerinfo_t *ri) signed_descriptor_t *sd; tor_assert(ri->purpose == ROUTER_PURPOSE_GENERAL); sd = tor_malloc_zero(sizeof(signed_descriptor_t)); - signed_descriptor_move(sd, &ri->cache_info); + memcpy(sd, &(ri->cache_info), sizeof(signed_descriptor_t)); + sd->routerlist_index = -1; + ri->cache_info.signed_descriptor_body = NULL; routerinfo_free(ri); return sd; } /** Helper: free the storage held by the extrainfo_t in e. */ static void -extrainfo_free_void(void *e) +extrainfo_free_(void *e) { - extrainfo_free_(e); + extrainfo_free(e); } /** Free all storage held by a routerlist rl. */ void -routerlist_free_(routerlist_t *rl) +routerlist_free(routerlist_t *rl) { if (!rl) return; rimap_free(rl->identity_map, NULL); sdmap_free(rl->desc_digest_map, NULL); sdmap_free(rl->desc_by_eid_map, NULL); - eimap_free(rl->extra_info_map, extrainfo_free_void); + eimap_free(rl->extra_info_map, extrainfo_free_); SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, routerinfo_free(r)); SMARTLIST_FOREACH(rl->old_routers, signed_descriptor_t *, sd, signed_descriptor_free(sd)); smartlist_free(rl->routers); smartlist_free(rl->old_routers); - if (rl->desc_store.mmap) { - int res = tor_munmap_file(routerlist->desc_store.mmap); - if (res != 0) { - log_warn(LD_FS, "Failed to munmap routerlist->desc_store.mmap"); - } - } - if (rl->extrainfo_store.mmap) { - int res = tor_munmap_file(routerlist->extrainfo_store.mmap); - if (res != 0) { - log_warn(LD_FS, "Failed to munmap routerlist->extrainfo_store.mmap"); - } - } + if (routerlist->desc_store.mmap) + tor_munmap_file(routerlist->desc_store.mmap); + if (routerlist->extrainfo_store.mmap) + tor_munmap_file(routerlist->extrainfo_store.mmap); tor_free(rl); router_dir_info_changed(); @@ -3337,7 +2884,7 @@ dump_routerlist_mem_usage(int severity) * in sl at position idx. Otherwise, search sl for * ri. Return the index of ri in sl, or -1 if ri * is not in sl. */ -static inline int +static INLINE int routerlist_find_elt_(smartlist_t *sl, void *ri, int idx) { if (idx < 0) { @@ -3402,19 +2949,17 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri) } /** Adds the extrainfo_t ei to the routerlist rl, if there is a - * corresponding router in rl-\>routers or rl-\>old_routers. Return the status - * of inserting ei. Free ei if it isn't inserted. */ -MOCK_IMPL(STATIC was_router_added_t, -extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)) + * corresponding router in rl-\>routers or rl-\>old_routers. Return true iff + * we actually inserted ei. Free ei if it isn't inserted. */ +static int +extrainfo_insert(routerlist_t *rl, extrainfo_t *ei) { - was_router_added_t r; - const char *compatibility_error_msg; + int r = 0; routerinfo_t *ri = rimap_get(rl->identity_map, ei->cache_info.identity_digest); signed_descriptor_t *sd = sdmap_get(rl->desc_by_eid_map, ei->cache_info.signed_descriptor_digest); extrainfo_t *ei_tmp; - const int severity = warn_if_incompatible ? LOG_WARN : LOG_INFO; { extrainfo_t *ei_generated = router_get_my_extrainfo(); @@ -3423,41 +2968,9 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)) if (!ri) { /* This router is unknown; we can't even verify the signature. Give up.*/ - r = ROUTER_NOT_IN_CONSENSUS; - goto done; - } - if (! sd) { - /* The extrainfo router doesn't have a known routerdesc to attach it to. - * This just won't work. */; - static ratelim_t no_sd_ratelim = RATELIM_INIT(1800); - r = ROUTER_BAD_EI; - log_fn_ratelim(&no_sd_ratelim, severity, LD_BUG, - "No entry found in extrainfo map."); - goto done; - } - if (tor_memneq(ei->cache_info.signed_descriptor_digest, - sd->extra_info_digest, DIGEST_LEN)) { - static ratelim_t digest_mismatch_ratelim = RATELIM_INIT(1800); - /* The sd we got from the map doesn't match the digest we used to look - * it up. This makes no sense. */ - r = ROUTER_BAD_EI; - log_fn_ratelim(&digest_mismatch_ratelim, severity, LD_BUG, - "Mismatch in digest in extrainfo map."); goto done; } - if (routerinfo_incompatible_with_extrainfo(ri->identity_pkey, ei, sd, - &compatibility_error_msg)) { - char d1[HEX_DIGEST_LEN+1], d2[HEX_DIGEST_LEN+1]; - r = (ri->cache_info.extrainfo_is_bogus) ? - ROUTER_BAD_EI : ROUTER_NOT_IN_CONSENSUS; - - base16_encode(d1, sizeof(d1), ri->cache_info.identity_digest, DIGEST_LEN); - base16_encode(d2, sizeof(d2), ei->cache_info.identity_digest, DIGEST_LEN); - - log_fn(severity,LD_DIR, - "router info incompatible with extra info (ri id: %s, ei id %s, " - "reason: %s)", d1, d2, compatibility_error_msg); - + if (routerinfo_incompatible_with_extrainfo(ri, ei, sd, NULL)) { goto done; } @@ -3467,7 +2980,7 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)) ei_tmp = eimap_set(rl->extra_info_map, ei->cache_info.signed_descriptor_digest, ei); - r = ROUTER_ADDED_SUCCESSFULLY; + r = 1; if (ei_tmp) { rl->extrainfo_store.bytes_dropped += ei_tmp->cache_info.signed_descriptor_len; @@ -3475,7 +2988,7 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)) } done: - if (r != ROUTER_ADDED_SUCCESSFULLY) + if (r == 0) extrainfo_free(ei); #ifdef DEBUG_ROUTERLIST @@ -3750,21 +3263,19 @@ routerlist_reparse_old(routerlist_t *rl, signed_descriptor_t *sd) ri = router_parse_entry_from_string(body, body+sd->signed_descriptor_len+sd->annotations_len, - 0, 1, NULL, NULL); + 0, 1, NULL); if (!ri) return NULL; - signed_descriptor_move(&ri->cache_info, sd); + memcpy(&ri->cache_info, sd, sizeof(signed_descriptor_t)); + sd->signed_descriptor_body = NULL; /* Steal reference. */ + ri->cache_info.routerlist_index = -1; routerlist_remove_old(rl, sd, -1); return ri; } -/** Free all memory held by the routerlist module. - * Note: Calling routerlist_free_all() should always be paired with - * a call to nodelist_free_all(). These should only be called during - * cleanup. - */ +/** Free all memory held by the routerlist module. */ void routerlist_free_all(void) { @@ -3780,7 +3291,7 @@ routerlist_free_all(void) smartlist_free(fallback_dir_servers); trusted_dir_servers = fallback_dir_servers = NULL; if (trusted_dir_certs) { - digestmap_free(trusted_dir_certs, cert_list_free_void); + digestmap_free(trusted_dir_certs, cert_list_free_); trusted_dir_certs = NULL; } } @@ -3798,14 +3309,6 @@ routerlist_reset_warnings(void) networkstatus_reset_warnings(); } -/** Return 1 if the signed descriptor of this router is older than - * seconds seconds. Otherwise return 0. */ -MOCK_IMPL(int, -router_descriptor_is_older_than,(const routerinfo_t *router, int seconds)) -{ - return router->cache_info.published_on < approx_time() - seconds; -} - /** Add router to the routerlist, if we don't already have it. Replace * older entries (if any) with the same key. Note: Callers should not hold * their pointers to router if this function fails; router @@ -3848,13 +3351,6 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, old_router = router_get_mutable_by_digest(id_digest); - /* Make sure that it isn't expired. */ - if (router->cert_expiration_time < approx_time()) { - routerinfo_free(router); - *msg = "Some certs on this router are expired."; - return ROUTER_CERTS_EXPIRED; - } - /* Make sure that we haven't already got this exact descriptor. */ if (sdmap_get(routerlist->desc_digest_map, router->cache_info.signed_descriptor_digest)) { @@ -3879,7 +3375,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, router_describe(router)); *msg = "Router descriptor was not new."; routerinfo_free(router); - return ROUTER_IS_ALREADY_KNOWN; + return ROUTER_WAS_NOT_NEW; } } @@ -3904,7 +3400,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, router_describe(router)); *msg = "Router descriptor is not referenced by any network-status."; - /* Only journal this desc if we want to keep old descriptors */ + /* Only journal this desc if we'll be serving it. */ if (!from_cache && should_cache_old_descriptors()) signed_desc_append_to_journal(&router->cache_info, &routerlist->desc_store); @@ -3964,7 +3460,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, &routerlist->desc_store); routerlist_insert_old(routerlist, router); *msg = "Router descriptor was not new."; - return ROUTER_IS_ALREADY_KNOWN; + return ROUTER_WAS_NOT_NEW; } else { /* Same key, and either new, or listed in the consensus. */ log_debug(LD_DIR, "Replacing entry for router %s", @@ -3974,6 +3470,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, signed_desc_append_to_journal(&router->cache_info, &routerlist->desc_store); } + directory_set_dirty(); *msg = authdir_believes_valid ? "Valid server updated" : ("Invalid server updated. (This dirserver is marking your " "server as unapproved.)"); @@ -3982,10 +3479,10 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, } if (!in_consensus && from_cache && - router_descriptor_is_older_than(router, OLD_ROUTER_DESC_MAX_AGE)) { + router->cache_info.published_on < time(NULL) - OLD_ROUTER_DESC_MAX_AGE) { *msg = "Router descriptor was really old."; routerinfo_free(router); - return ROUTER_WAS_TOO_OLD; + return ROUTER_WAS_NOT_NEW; } /* We haven't seen a router with this identity before. Add it to the end of @@ -3995,6 +3492,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, signed_desc_append_to_journal(&router->cache_info, &routerlist->desc_store); } + directory_set_dirty(); return ROUTER_ADDED_SUCCESSFULLY; } @@ -4006,18 +3504,21 @@ was_router_added_t router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg, int from_cache, int from_fetch) { - was_router_added_t inserted; + int inserted; (void)from_fetch; if (msg) *msg = NULL; - /*XXXX Do something with msg */ + /*XXXX023 Do something with msg */ - inserted = extrainfo_insert(router_get_routerlist(), ei, !from_cache); + inserted = extrainfo_insert(router_get_routerlist(), ei); - if (WRA_WAS_ADDED(inserted) && !from_cache) + if (inserted && !from_cache) signed_desc_append_to_journal(&ei->cache_info, &routerlist->extrainfo_store); - return inserted; + if (inserted) + return ROUTER_ADDED_SUCCESSFULLY; + else + return ROUTER_BAD_EI; } /** Sorting helper: return <0, 0, or >0 depending on whether the @@ -4078,7 +3579,7 @@ routerlist_remove_old_cached_routers_with_id(time_t now, signed_descriptor_t *r = smartlist_get(lst, i); tor_assert(tor_memeq(ident, r->identity_digest, DIGEST_LEN)); } -#endif /* 1 */ +#endif /* Check whether we need to do anything at all. */ { int mdpr = directory_caches_dir_info(get_options()) ? 2 : 1; @@ -4087,9 +3588,9 @@ routerlist_remove_old_cached_routers_with_id(time_t now, n_extra = n - mdpr; } - lifespans = tor_calloc(n, sizeof(struct duration_idx_t)); - rmv = tor_calloc(n, sizeof(uint8_t)); - must_keep = tor_calloc(n, sizeof(uint8_t)); + lifespans = tor_malloc_zero(sizeof(struct duration_idx_t)*n); + rmv = tor_malloc_zero(sizeof(uint8_t)*n); + must_keep = tor_malloc_zero(sizeof(uint8_t)*n); /* Set lifespans to contain the lifespan and index of each server. */ /* Set rmv[i-lo]=1 if we're going to remove a server for being too old. */ for (i = lo; i <= hi; ++i) { @@ -4312,8 +3813,7 @@ router_load_single_router(const char *s, uint8_t purpose, int cache, "@source controller\n" "@purpose %s\n", router_purpose_to_string(purpose)); - if (!(ri = router_parse_entry_from_string(s, NULL, 1, 0, - annotation_buf, NULL))) { + if (!(ri = router_parse_entry_from_string(s, NULL, 1, 0, annotation_buf))) { log_warn(LD_DIR, "Error parsing router descriptor; dropping."); *msg = "Couldn't parse router descriptor."; return -1; @@ -4377,11 +3877,9 @@ router_load_routers_from_string(const char *s, const char *eos, int from_cache = (saved_location != SAVED_NOWHERE); int allow_annotations = (saved_location != SAVED_NOWHERE); int any_changed = 0; - smartlist_t *invalid_digests = smartlist_new(); router_parse_list_from_string(&s, eos, routers, saved_location, 0, - allow_annotations, prepend_annotations, - invalid_digests); + allow_annotations, prepend_annotations); routers_update_status_from_consensus_networkstatus(routers, !from_cache); @@ -4417,7 +3915,7 @@ router_load_routers_from_string(const char *s, const char *eos, smartlist_add(changed, ri); routerlist_descriptors_added(changed, from_cache); smartlist_clear(changed); - } else if (WRA_NEVER_DOWNLOADABLE(r)) { + } else if (WRA_WAS_REJECTED(r)) { download_status_t *dl_status; dl_status = router_get_dl_status_by_descriptor_digest(d); if (dl_status) { @@ -4428,27 +3926,6 @@ router_load_routers_from_string(const char *s, const char *eos, } } SMARTLIST_FOREACH_END(ri); - SMARTLIST_FOREACH_BEGIN(invalid_digests, const uint8_t *, bad_digest) { - /* This digest is never going to be parseable. */ - base16_encode(fp, sizeof(fp), (char*)bad_digest, DIGEST_LEN); - if (requested_fingerprints && descriptor_digests) { - if (! smartlist_contains_string(requested_fingerprints, fp)) { - /* But we didn't ask for it, so we should assume shennanegans. */ - continue; - } - smartlist_string_remove(requested_fingerprints, fp); - } - download_status_t *dls; - dls = router_get_dl_status_by_descriptor_digest((char*)bad_digest); - if (dls) { - log_info(LD_GENERAL, "Marking router with descriptor %s as unparseable, " - "and therefore undownloadable", fp); - download_status_mark_impossible(dls); - } - } SMARTLIST_FOREACH_END(bad_digest); - SMARTLIST_FOREACH(invalid_digests, uint8_t *, d, tor_free(d)); - smartlist_free(invalid_digests); - routerlist_assert_ok(routerlist); if (any_changed) @@ -4472,16 +3949,13 @@ router_load_extrainfo_from_string(const char *s, const char *eos, smartlist_t *extrainfo_list = smartlist_new(); const char *msg; int from_cache = (saved_location != SAVED_NOWHERE); - smartlist_t *invalid_digests = smartlist_new(); router_parse_list_from_string(&s, eos, extrainfo_list, saved_location, 1, 0, - NULL, invalid_digests); + NULL); log_info(LD_DIR, "%d elements to add", smartlist_len(extrainfo_list)); SMARTLIST_FOREACH_BEGIN(extrainfo_list, extrainfo_t *, ei) { - uint8_t d[DIGEST_LEN]; - memcpy(d, ei->cache_info.signed_descriptor_digest, DIGEST_LEN); was_router_added_t added = router_add_extrainfo_to_routerlist(ei, &msg, from_cache, !from_cache); if (WRA_WAS_ADDED(added) && requested_fingerprints) { @@ -4491,57 +3965,26 @@ router_load_extrainfo_from_string(const char *s, const char *eos, ei->cache_info.identity_digest, DIGEST_LEN); smartlist_string_remove(requested_fingerprints, fp); - /* We silently let relays stuff us with extrainfos we didn't ask for, + /* We silently let people stuff us with extrainfos we didn't ask for, * so long as we would have wanted them anyway. Since we always fetch * all the extrainfos we want, and we never actually act on them * inside Tor, this should be harmless. */ - } else if (WRA_NEVER_DOWNLOADABLE(added)) { - signed_descriptor_t *sd = router_get_by_extrainfo_digest((char*)d); - if (sd) { - log_info(LD_GENERAL, "Marking extrainfo with descriptor %s as " - "unparseable, and therefore undownloadable", - hex_str((char*)d,DIGEST_LEN)); - download_status_mark_impossible(&sd->ei_dl_status); - } } } SMARTLIST_FOREACH_END(ei); - SMARTLIST_FOREACH_BEGIN(invalid_digests, const uint8_t *, bad_digest) { - /* This digest is never going to be parseable. */ - char fp[HEX_DIGEST_LEN+1]; - base16_encode(fp, sizeof(fp), (char*)bad_digest, DIGEST_LEN); - if (requested_fingerprints) { - if (! smartlist_contains_string(requested_fingerprints, fp)) { - /* But we didn't ask for it, so we should assume shennanegans. */ - continue; - } - smartlist_string_remove(requested_fingerprints, fp); - } - signed_descriptor_t *sd = - router_get_by_extrainfo_digest((char*)bad_digest); - if (sd) { - log_info(LD_GENERAL, "Marking extrainfo with descriptor %s as " - "unparseable, and therefore undownloadable", fp); - download_status_mark_impossible(&sd->ei_dl_status); - } - } SMARTLIST_FOREACH_END(bad_digest); - SMARTLIST_FOREACH(invalid_digests, uint8_t *, d, tor_free(d)); - smartlist_free(invalid_digests); - routerlist_assert_ok(routerlist); router_rebuild_store(0, &router_get_routerlist()->extrainfo_store); smartlist_free(extrainfo_list); } -/** Return true iff the latest ns-flavored consensus includes a descriptor - * whose digest is that of desc. */ +/** Return true iff any networkstatus includes a descriptor whose digest + * is that of desc. */ static int signed_desc_digest_is_recognized(signed_descriptor_t *desc) { const routerstatus_t *rs; - networkstatus_t *consensus = networkstatus_get_latest_consensus_by_flavor( - FLAV_NS); + networkstatus_t *consensus = networkstatus_get_latest_consensus(); if (consensus) { rs = networkstatus_vote_find_entry(consensus, desc->identity_digest); @@ -4557,7 +4000,7 @@ signed_desc_digest_is_recognized(signed_descriptor_t *desc) void update_all_descriptor_downloads(time_t now) { - if (should_delay_dir_fetches(get_options(), NULL)) + if (get_options()->DisableNetwork) return; update_router_descriptor_downloads(now); update_microdesc_downloads(now); @@ -4569,14 +4012,12 @@ update_all_descriptor_downloads(time_t now) void routerlist_retry_directory_downloads(time_t now) { - (void)now; - - log_debug(LD_GENERAL, - "In routerlist_retry_directory_downloads()"); - router_reset_status_download_failures(); router_reset_descriptor_download_failures(); - reschedule_directory_downloads(); + if (get_options()->DisableNetwork) + return; + update_networkstatus_downloads(now); + update_all_descriptor_downloads(now); } /** Return true iff router does not permit exit streams. @@ -4587,17 +4028,16 @@ router_exit_policy_rejects_all(const routerinfo_t *router) return router->policy_is_reject_star; } -/** Create a directory server at address:port, with OR identity - * key digest which has DIGEST_LEN bytes. If address is NULL, - * add ourself. If is_authority, this is a directory authority. Return - * the new directory server entry on success or NULL on failure. */ +/** Create an directory server at address:port, with OR identity + * key digest. If address is NULL, add ourself. If + * is_authority, this is a directory authority. Return the new + * directory server entry on success or NULL on failure. */ static dir_server_t * dir_server_new(int is_authority, const char *nickname, const tor_addr_t *addr, const char *hostname, uint16_t dir_port, uint16_t or_port, - const tor_addr_port_t *addrport_ipv6, const char *digest, const char *v3_auth_digest, dirinfo_type_t type, double weight) @@ -4606,18 +4046,16 @@ dir_server_new(int is_authority, uint32_t a; char *hostname_ = NULL; - tor_assert(digest); - if (weight < 0) return NULL; if (tor_addr_family(addr) == AF_INET) a = tor_addr_to_ipv4h(addr); else - return NULL; + return NULL; /*XXXX Support IPv6 */ if (!hostname) - hostname_ = tor_addr_to_str_dup(addr); + hostname_ = tor_dup_addr(addr); else hostname_ = tor_strdup(hostname); @@ -4631,31 +4069,18 @@ dir_server_new(int is_authority, ent->is_authority = is_authority; ent->type = type; ent->weight = weight; - if (addrport_ipv6) { - if (tor_addr_family(&addrport_ipv6->addr) != AF_INET6) { - log_warn(LD_BUG, "Hey, I got a non-ipv6 addr as addrport_ipv6."); - tor_addr_make_unspec(&ent->ipv6_addr); - } else { - tor_addr_copy(&ent->ipv6_addr, &addrport_ipv6->addr); - ent->ipv6_orport = addrport_ipv6->port; - } - } else { - tor_addr_make_unspec(&ent->ipv6_addr); - } - memcpy(ent->digest, digest, DIGEST_LEN); if (v3_auth_digest && (type & V3_DIRINFO)) memcpy(ent->v3_identity_digest, v3_auth_digest, DIGEST_LEN); if (nickname) tor_asprintf(&ent->description, "directory server \"%s\" at %s:%d", - nickname, hostname_, (int)dir_port); + nickname, hostname, (int)dir_port); else tor_asprintf(&ent->description, "directory server at %s:%d", - hostname_, (int)dir_port); + hostname, (int)dir_port); ent->fake_status.addr = ent->addr; - tor_addr_copy(&ent->fake_status.ipv6_addr, &ent->ipv6_addr); memcpy(ent->fake_status.identity_digest, digest, DIGEST_LEN); if (nickname) strlcpy(ent->fake_status.nickname, nickname, @@ -4664,7 +4089,6 @@ dir_server_new(int is_authority, ent->fake_status.nickname[0] = '\0'; ent->fake_status.dir_port = ent->dir_port; ent->fake_status.or_port = ent->or_port; - ent->fake_status.ipv6_orport = ent->ipv6_orport; return ent; } @@ -4676,7 +4100,6 @@ dir_server_new(int is_authority, dir_server_t * trusted_dir_server_new(const char *nickname, const char *address, uint16_t dir_port, uint16_t or_port, - const tor_addr_port_t *ipv6_addrport, const char *digest, const char *v3_auth_digest, dirinfo_type_t type, double weight) { @@ -4707,9 +4130,7 @@ trusted_dir_server_new(const char *nickname, const char *address, tor_addr_from_ipv4h(&addr, a); result = dir_server_new(1, nickname, &addr, hostname, - dir_port, or_port, - ipv6_addrport, - digest, + dir_port, or_port, digest, v3_auth_digest, type, weight); tor_free(hostname); return result; @@ -4721,12 +4142,9 @@ trusted_dir_server_new(const char *nickname, const char *address, dir_server_t * fallback_dir_server_new(const tor_addr_t *addr, uint16_t dir_port, uint16_t or_port, - const tor_addr_port_t *addrport_ipv6, const char *id_digest, double weight) { - return dir_server_new(0, NULL, addr, NULL, dir_port, or_port, - addrport_ipv6, - id_digest, + return dir_server_new(0, NULL, addr, NULL, dir_port, or_port, id_digest, NULL, ALL_DIRINFO, weight); } @@ -4748,7 +4166,7 @@ dir_server_add(dir_server_t *ent) /** Free storage held in cert. */ void -authority_cert_free_(authority_cert_t *cert) +authority_cert_free(authority_cert_t *cert) { if (!cert) return; @@ -4760,12 +4178,9 @@ authority_cert_free_(authority_cert_t *cert) tor_free(cert); } -#define dir_server_free(val) \ - FREE_AND_NULL(dir_server_t, dir_server_free_, (val)) - /** Free storage held in ds. */ static void -dir_server_free_(dir_server_t *ds) +dir_server_free(dir_server_t *ds) { if (!ds) return; @@ -4798,11 +4213,11 @@ clear_dir_servers(void) /** For every current directory connection whose purpose is purpose, * and where the resource being downloaded begins with prefix, split * rest of the resource into base16 fingerprints (or base64 fingerprints if - * purpose==DIR_PURPOSE_FETCH_MICRODESC), decode them, and set the + * purpose==DIR_PURPPOSE_FETCH_MICRODESC), decode them, and set the * corresponding elements of result to a nonzero value. */ static void -list_pending_downloads(digestmap_t *result, digest256map_t *result256, +list_pending_downloads(digestmap_t *result, int purpose, const char *prefix) { const size_t p_len = strlen(prefix); @@ -4812,7 +4227,7 @@ list_pending_downloads(digestmap_t *result, digest256map_t *result256, if (purpose == DIR_PURPOSE_FETCH_MICRODESC) flags = DSR_DIGEST256|DSR_BASE64; - tor_assert(result || result256); + tor_assert(result); SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { if (conn->type == CONN_TYPE_DIR && @@ -4825,19 +4240,11 @@ list_pending_downloads(digestmap_t *result, digest256map_t *result256, } } SMARTLIST_FOREACH_END(conn); - if (result) { - SMARTLIST_FOREACH(tmp, char *, d, + SMARTLIST_FOREACH(tmp, char *, d, { digestmap_set(result, d, (void*)1); tor_free(d); }); - } else if (result256) { - SMARTLIST_FOREACH(tmp, uint8_t *, d, - { - digest256map_set(result256, d, (void*)1); - tor_free(d); - }); - } smartlist_free(tmp); } @@ -4849,16 +4256,20 @@ list_pending_descriptor_downloads(digestmap_t *result, int extrainfo) { int purpose = extrainfo ? DIR_PURPOSE_FETCH_EXTRAINFO : DIR_PURPOSE_FETCH_SERVERDESC; - list_pending_downloads(result, NULL, purpose, "d/"); + list_pending_downloads(result, purpose, "d/"); } /** For every microdescriptor we are currently downloading by descriptor - * digest, set result[d] to (void*)1. + * digest, set result[d] to (void*)1. (Note that microdescriptor digests + * are 256-bit, and digestmap_t only holds 160-bit digests, so we're only + * getting the first 20 bytes of each digest here.) + * + * XXXX Let there be a digestmap256_t, and use that instead. */ void -list_pending_microdesc_downloads(digest256map_t *result) +list_pending_microdesc_downloads(digestmap_t *result) { - list_pending_downloads(NULL, result, DIR_PURPOSE_FETCH_MICRODESC, "d/"); + list_pending_downloads(result, DIR_PURPOSE_FETCH_MICRODESC, "d/"); } /** For every certificate we are currently downloading by (identity digest, @@ -4901,106 +4312,76 @@ list_pending_fpsk_downloads(fp_pair_map_t *result) * range.) If source is given, download from source; * otherwise, download from an appropriate random directory server. */ -MOCK_IMPL(STATIC void, -initiate_descriptor_downloads,(const routerstatus_t *source, - int purpose, smartlist_t *digests, - int lo, int hi, int pds_flags)) +static void +initiate_descriptor_downloads(const routerstatus_t *source, + int purpose, + smartlist_t *digests, + int lo, int hi, int pds_flags) { + int i, n = hi-lo; char *resource, *cp; - int digest_len, enc_digest_len; - const char *sep; - int b64_256; - smartlist_t *tmp; + size_t r_len; + + int digest_len = DIGEST_LEN, enc_digest_len = HEX_DIGEST_LEN; + char sep = '+'; + int b64_256 = 0; if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { /* Microdescriptors are downloaded by "-"-separated base64-encoded * 256-bit digests. */ digest_len = DIGEST256_LEN; - enc_digest_len = BASE64_DIGEST256_LEN + 1; - sep = "-"; + enc_digest_len = BASE64_DIGEST256_LEN; + sep = '-'; b64_256 = 1; - } else { - digest_len = DIGEST_LEN; - enc_digest_len = HEX_DIGEST_LEN + 1; - sep = "+"; - b64_256 = 0; } + if (n <= 0) + return; if (lo < 0) lo = 0; if (hi > smartlist_len(digests)) hi = smartlist_len(digests); - if (hi-lo <= 0) - return; - - tmp = smartlist_new(); - - for (; lo < hi; ++lo) { - cp = tor_malloc(enc_digest_len); + r_len = 8 + (enc_digest_len+1)*n; + cp = resource = tor_malloc(r_len); + memcpy(cp, "d/", 2); + cp += 2; + for (i = lo; i < hi; ++i) { if (b64_256) { - digest256_to_base64(cp, smartlist_get(digests, lo)); + digest256_to_base64(cp, smartlist_get(digests, i)); } else { - base16_encode(cp, enc_digest_len, smartlist_get(digests, lo), - digest_len); + base16_encode(cp, r_len-(cp-resource), + smartlist_get(digests,i), digest_len); } - smartlist_add(tmp, cp); + cp += enc_digest_len; + *cp++ = sep; } - - cp = smartlist_join_strings(tmp, sep, 0, NULL); - tor_asprintf(&resource, "d/%s.z", cp); - - SMARTLIST_FOREACH(tmp, char *, cp1, tor_free(cp1)); - smartlist_free(tmp); - tor_free(cp); + memcpy(cp-1, ".z", 3); if (source) { - /* We know which authority or directory mirror we want. */ - directory_request_t *req = directory_request_new(purpose); - directory_request_set_routerstatus(req, source); - directory_request_set_resource(req, resource); - directory_initiate_request(req); - directory_request_free(req); + /* We know which authority we want. */ + directory_initiate_command_routerstatus(source, purpose, + ROUTER_PURPOSE_GENERAL, + DIRIND_ONEHOP, + resource, NULL, 0, 0); } else { directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource, - pds_flags, DL_WANT_ANY_DIRSERVER); + pds_flags); } tor_free(resource); } -/** Return the max number of hashes to put in a URL for a given request. +/** Max amount of hashes to download per request. + * Since squid does not like URLs >= 4096 bytes we limit it to 96. + * 4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058 + * 4058/41 (40 for the hash and 1 for the + that separates them) => 98 + * So use 96 because it's a nice number. */ -static int -max_dl_per_request(const or_options_t *options, int purpose) -{ - /* Since squid does not like URLs >= 4096 bytes we limit it to 96. - * 4096 - strlen(http://[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535 - * /tor/server/d/.z) == 4026 - * 4026/41 (40 for the hash and 1 for the + that separates them) => 98 - * So use 96 because it's a nice number. - * - * For microdescriptors, the calculation is - * 4096 - strlen(http://[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535 - * /tor/micro/d/.z) == 4027 - * 4027/44 (43 for the hash and 1 for the - that separates them) => 91 - * So use 90 because it's a nice number. - */ - int max = 96; - if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { - max = 90; - } - /* If we're going to tunnel our connections, we can ask for a lot more - * in a request. */ - if (directory_must_use_begindir(options)) { - max = 500; - } - return max; -} - +#define MAX_DL_PER_REQUEST 96 +#define MAX_MICRODESC_DL_PER_REQUEST 92 /** Don't split our requests so finely that we are requesting fewer than - * this number per server. (Grouping more than this at once leads to - * diminishing returns.) */ -#define MIN_DL_PER_REQUEST 32 + * this number per server. */ +#define MIN_DL_PER_REQUEST 4 /** To prevent a single screwy cache from confusing us by selective reply, * try to split our requests into at least this many requests. */ #define MIN_REQUESTS 3 @@ -5019,95 +4400,92 @@ launch_descriptor_downloads(int purpose, smartlist_t *downloadable, const routerstatus_t *source, time_t now) { + int should_delay = 0, n_downloadable; const or_options_t *options = get_options(); const char *descname; - const int fetch_microdesc = (purpose == DIR_PURPOSE_FETCH_MICRODESC); - int n_downloadable = smartlist_len(downloadable); - - int i, n_per_request, max_dl_per_req; - const char *req_plural = "", *rtr_plural = ""; - int pds_flags = PDS_RETRY_IF_NO_SERVERS; - tor_assert(fetch_microdesc || purpose == DIR_PURPOSE_FETCH_SERVERDESC); - descname = fetch_microdesc ? "microdesc" : "routerdesc"; + tor_assert(purpose == DIR_PURPOSE_FETCH_SERVERDESC || + purpose == DIR_PURPOSE_FETCH_MICRODESC); - if (!n_downloadable) - return; + descname = (purpose == DIR_PURPOSE_FETCH_SERVERDESC) ? + "routerdesc" : "microdesc"; + n_downloadable = smartlist_len(downloadable); if (!directory_fetches_dir_info_early(options)) { if (n_downloadable >= MAX_DL_TO_DELAY) { log_debug(LD_DIR, "There are enough downloadable %ss to launch requests.", descname); - } else if (! router_have_minimum_dir_info()) { - log_debug(LD_DIR, - "We are only missing %d %ss, but we'll fetch anyway, since " - "we don't yet have enough directory info.", - n_downloadable, descname); + should_delay = 0; } else { - - /* should delay */ - if ((last_descriptor_download_attempted + - options->TestingClientMaxIntervalWithoutRequest) > now) - return; - - if (last_descriptor_download_attempted) { - log_info(LD_DIR, - "There are not many downloadable %ss, but we've " - "been waiting long enough (%d seconds). Downloading.", - descname, - (int)(now-last_descriptor_download_attempted)); - } else { - log_info(LD_DIR, - "There are not many downloadable %ss, but we haven't " - "tried downloading descriptors recently. Downloading.", - descname); + should_delay = (last_descriptor_download_attempted + + options->TestingClientMaxIntervalWithoutRequest) > now; + if (!should_delay && n_downloadable) { + if (last_descriptor_download_attempted) { + log_info(LD_DIR, + "There are not many downloadable %ss, but we've " + "been waiting long enough (%d seconds). Downloading.", + descname, + (int)(now-last_descriptor_download_attempted)); + } else { + log_info(LD_DIR, + "There are not many downloadable %ss, but we haven't " + "tried downloading descriptors recently. Downloading.", + descname); + } } } } - if (!authdir_mode(options)) { - /* If we wind up going to the authorities, we want to only open one - * connection to each authority at a time, so that we don't overload - * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH - * regardless of whether we're a cache or not. - * - * Setting this flag can make initiate_descriptor_downloads() ignore - * requests. We need to make sure that we do in fact call - * update_router_descriptor_downloads() later on, once the connections - * have succeeded or failed. - */ - pds_flags |= fetch_microdesc ? - PDS_NO_EXISTING_MICRODESC_FETCH : - PDS_NO_EXISTING_SERVERDESC_FETCH; - } - - n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS); - max_dl_per_req = max_dl_per_request(options, purpose); - - if (n_per_request > max_dl_per_req) - n_per_request = max_dl_per_req; - - if (n_per_request < MIN_DL_PER_REQUEST) { - n_per_request = MIN(MIN_DL_PER_REQUEST, n_downloadable); - } - - if (n_downloadable > n_per_request) - req_plural = rtr_plural = "s"; - else if (n_downloadable > 1) - rtr_plural = "s"; + if (! should_delay && n_downloadable) { + int i, n_per_request; + const char *req_plural = "", *rtr_plural = ""; + int pds_flags = PDS_RETRY_IF_NO_SERVERS; + if (! authdir_mode_any_nonhidserv(options)) { + /* If we wind up going to the authorities, we want to only open one + * connection to each authority at a time, so that we don't overload + * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH + * regardless of whether we're a cache or not; it gets ignored if we're + * not calling router_pick_trusteddirserver. + * + * Setting this flag can make initiate_descriptor_downloads() ignore + * requests. We need to make sure that we do in fact call + * update_router_descriptor_downloads() later on, once the connections + * have succeeded or failed. + */ + pds_flags |= (purpose == DIR_PURPOSE_FETCH_MICRODESC) ? + PDS_NO_EXISTING_MICRODESC_FETCH : + PDS_NO_EXISTING_SERVERDESC_FETCH; + } - log_info(LD_DIR, - "Launching %d request%s for %d %s%s, %d at a time", - CEIL_DIV(n_downloadable, n_per_request), req_plural, - n_downloadable, descname, rtr_plural, n_per_request); - smartlist_sort_digests(downloadable); - for (i=0; i < n_downloadable; i += n_per_request) { - initiate_descriptor_downloads(source, purpose, - downloadable, i, i+n_per_request, - pds_flags); + n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS); + if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { + if (n_per_request > MAX_MICRODESC_DL_PER_REQUEST) + n_per_request = MAX_MICRODESC_DL_PER_REQUEST; + } else { + if (n_per_request > MAX_DL_PER_REQUEST) + n_per_request = MAX_DL_PER_REQUEST; + } + if (n_per_request < MIN_DL_PER_REQUEST) + n_per_request = MIN_DL_PER_REQUEST; + + if (n_downloadable > n_per_request) + req_plural = rtr_plural = "s"; + else if (n_downloadable > 1) + rtr_plural = "s"; + + log_info(LD_DIR, + "Launching %d request%s for %d %s%s, %d at a time", + CEIL_DIV(n_downloadable, n_per_request), req_plural, + n_downloadable, descname, rtr_plural, n_per_request); + smartlist_sort_digests(downloadable); + for (i=0; i < n_downloadable; i += n_per_request) { + initiate_descriptor_downloads(source, purpose, + downloadable, i, i+n_per_request, + pds_flags); + } + last_descriptor_download_attempted = now; } - last_descriptor_download_attempted = now; } /** For any descriptor that we want that's currently listed in @@ -5176,8 +4554,8 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, ++n_would_reject; continue; /* We would throw it out immediately. */ } - if (!we_want_to_fetch_flavor(options, consensus->flavor) && - !client_would_use_router(rs, now)) { + if (!directory_caches_dir_info(options) && + !client_would_use_router(rs, now, options)) { ++n_wouldnt_use; continue; /* We would never use it ourself. */ } @@ -5198,7 +4576,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, smartlist_add(downloadable, rs->descriptor_digest); } SMARTLIST_FOREACH_END(rsp); - if (!authdir_mode_v3(options) + if (!authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL) && smartlist_len(no_longer_old)) { routerlist_t *rl = router_get_routerlist(); log_info(LD_DIR, "%d router descriptors listed in consensus are " @@ -5212,23 +4590,10 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, log_warn(LD_BUG, "Failed to re-parse a router."); continue; } - /* need to compute this now, since add_to_routerlist may free. */ - char time_cert_expires[ISO_TIME_LEN+1]; - format_iso_time(time_cert_expires, ri->cert_expiration_time); - r = router_add_to_routerlist(ri, &msg, 1, 0); if (WRA_WAS_OUTDATED(r)) { - log_warn(LD_DIR, "Couldn't add re-parsed router: %s. This isn't " - "usually a big deal, but you should make sure that your " - "clock and timezone are set correctly.", + log_warn(LD_DIR, "Couldn't add re-parsed router: %s", msg?msg:"???"); - if (r == ROUTER_CERTS_EXPIRED) { - char time_cons[ISO_TIME_LEN+1]; - format_iso_time(time_cons, consensus->valid_after); - log_warn(LD_DIR, " (I'm looking at a consensus from %s; This " - "router's certificates began expiring at %s.)", - time_cons, time_cert_expires); - } } } SMARTLIST_FOREACH_END(sd); routerlist_assert_ok(rl); @@ -5252,7 +4617,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote, /** How often should we launch a server/authority request to be sure of getting * a guess for our IP? */ -/*XXXX+ this info should come from netinfo cells or something, or we should +/*XXXX024 this info should come from netinfo cells or something, or we should * do this only when we aren't seeing incoming data. see bug 652. */ #define DUMMY_DOWNLOAD_INTERVAL (20*60) @@ -5263,7 +4628,7 @@ launch_dummy_descriptor_download_as_needed(time_t now, const or_options_t *options) { static time_t last_dummy_download = 0; - /* XXXX+ we could be smarter here; see notes on bug 652. */ + /* XXXX024 we could be smarter here; see notes on bug 652. */ /* If we're a server that doesn't have a configured address, we rely on * directory fetches to learn when our address changes. So if we haven't * tried to get any routerdescs in a long time, try a dummy fetch now. */ @@ -5272,14 +4637,9 @@ launch_dummy_descriptor_download_as_needed(time_t now, last_descriptor_download_attempted + DUMMY_DOWNLOAD_INTERVAL < now && last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) { last_dummy_download = now; - /* XX/teor - do we want an authority here, because they are less likely - * to give us the wrong address? (See #17782) - * I'm leaving the previous behaviour intact, because I don't like - * the idea of some relays contacting an authority every 20 minutes. */ directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_GENERAL, "authority.z", - PDS_RETRY_IF_NO_SERVERS, - DL_WANT_ANY_DIRSERVER); + PDS_RETRY_IF_NO_SERVERS); } } @@ -5288,7 +4648,7 @@ void update_router_descriptor_downloads(time_t now) { const or_options_t *options = get_options(); - if (should_delay_dir_fetches(options, NULL)) + if (should_delay_dir_fetches(options)) return; if (!we_fetch_router_descriptors(options)) return; @@ -5305,11 +4665,11 @@ update_extrainfo_downloads(time_t now) routerlist_t *rl; smartlist_t *wanted; digestmap_t *pending; - int old_routers, i, max_dl_per_req; - int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0, n_bogus[2] = {0,0}; + int old_routers, i; + int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0; if (! options->DownloadExtraInfo) return; - if (should_delay_dir_fetches(options, NULL)) + if (should_delay_dir_fetches(options)) return; if (!router_have_minimum_dir_info()) return; @@ -5351,77 +4711,35 @@ update_extrainfo_downloads(time_t now) ++n_pending; continue; } - - const signed_descriptor_t *sd2 = router_get_by_extrainfo_digest(d); - if (sd2 != sd) { - if (sd2 != NULL) { - char d1[HEX_DIGEST_LEN+1], d2[HEX_DIGEST_LEN+1]; - char d3[HEX_DIGEST_LEN+1], d4[HEX_DIGEST_LEN+1]; - base16_encode(d1, sizeof(d1), sd->identity_digest, DIGEST_LEN); - base16_encode(d2, sizeof(d2), sd2->identity_digest, DIGEST_LEN); - base16_encode(d3, sizeof(d3), d, DIGEST_LEN); - base16_encode(d4, sizeof(d3), sd2->extra_info_digest, DIGEST_LEN); - - log_info(LD_DIR, "Found an entry in %s with mismatched " - "router_get_by_extrainfo_digest() value. This has ID %s " - "but the entry in the map has ID %s. This has EI digest " - "%s and the entry in the map has EI digest %s.", - old_routers?"old_routers":"routers", - d1, d2, d3, d4); - } else { - char d1[HEX_DIGEST_LEN+1], d2[HEX_DIGEST_LEN+1]; - base16_encode(d1, sizeof(d1), sd->identity_digest, DIGEST_LEN); - base16_encode(d2, sizeof(d2), d, DIGEST_LEN); - - log_info(LD_DIR, "Found an entry in %s with NULL " - "router_get_by_extrainfo_digest() value. This has ID %s " - "and EI digest %s.", - old_routers?"old_routers":"routers", - d1, d2); - } - ++n_bogus[old_routers]; - continue; - } smartlist_add(wanted, d); } } digestmap_free(pending, NULL); log_info(LD_DIR, "Extrainfo download status: %d router with no ei, %d " - "with present ei, %d delaying, %d pending, %d downloadable, %d " - "bogus in routers, %d bogus in old_routers", - n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted), - n_bogus[0], n_bogus[1]); + "with present ei, %d delaying, %d pending, %d downloadable.", + n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted)); smartlist_shuffle(wanted); - - max_dl_per_req = max_dl_per_request(options, DIR_PURPOSE_FETCH_EXTRAINFO); - for (i = 0; i < smartlist_len(wanted); i += max_dl_per_req) { + for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) { initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO, - wanted, i, i+max_dl_per_req, + wanted, i, i + MAX_DL_PER_REQUEST, PDS_RETRY_IF_NO_SERVERS|PDS_NO_EXISTING_SERVERDESC_FETCH); } smartlist_free(wanted); } -/** Reset the consensus and extra-info download failure count on all routers. - * When we get a new consensus, - * routers_update_status_from_consensus_networkstatus() will reset the - * download statuses on the descriptors in that consensus. +/** Reset the descriptor download failure count on all routers, so that we + * can retry any long-failed routers immediately. */ void router_reset_descriptor_download_failures(void) { - log_debug(LD_GENERAL, - "In router_reset_descriptor_download_failures()"); - networkstatus_reset_download_failures(); last_descriptor_download_attempted = 0; if (!routerlist) return; - /* We want to download *all* extra-info descriptors, not just those in - * the consensus we currently have (or are about to have) */ SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri, { download_status_reset(&ri->cache_info.ei_dl_status); @@ -5457,7 +4775,7 @@ router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2) } /* If any key fields differ, they're different. */ - if (r1->addr != r2->addr || + if (strcasecmp(r1->address, r2->address) || strcasecmp(r1->nickname, r2->nickname) || r1->or_port != r2->or_port || !tor_addr_eq(&r1->ipv6_addr, &r2->ipv6_addr) || @@ -5472,9 +4790,7 @@ router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2) (r1->contact_info && r2->contact_info && strcasecmp(r1->contact_info, r2->contact_info)) || r1->is_hibernating != r2->is_hibernating || - ! addr_policies_eq(r1->exit_policy, r2->exit_policy) || - (r1->supports_tunnelled_dir_requests != - r2->supports_tunnelled_dir_requests)) + cmp_addr_policies(r1->exit_policy, r2->exit_policy)) return 0; if ((r1->declared_family == NULL) != (r2->declared_family == NULL)) return 0; @@ -5519,32 +4835,25 @@ router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2) return 1; } -/** Check whether sd describes a router descriptor compatible with the - * extrainfo document ei. - * - * identity_pkey (which must also be provided) is RSA1024 identity key - * for the router. We use it to check the signature of the extrainfo document, - * if it has not already been checked. - * - * If no router is compatible with ei, ei should be +/** Check whether ri (a.k.a. sd) is a router compatible with the + * extrainfo document + * ei. If no router is compatible with ei, ei should be * dropped. Return 0 for "compatible", return 1 for "reject, and inform * whoever uploaded ei, and return -1 for "reject silently.". If * msg is present, set *msg to a description of the * incompatibility (if any). - * - * Set the extrainfo_is_bogus field in sd if the digests matched - * but the extrainfo was nonetheless incompatible. **/ int -routerinfo_incompatible_with_extrainfo(const crypto_pk_t *identity_pkey, +routerinfo_incompatible_with_extrainfo(const routerinfo_t *ri, extrainfo_t *ei, signed_descriptor_t *sd, const char **msg) { - int digest_matches, digest256_matches, r=1; - tor_assert(identity_pkey); - tor_assert(sd); + int digest_matches, r=1; + tor_assert(ri); tor_assert(ei); + if (!sd) + sd = (signed_descriptor_t*)&ri->cache_info; if (ei->bad_sig) { if (msg) *msg = "Extrainfo signature was bad, or signed with wrong key."; @@ -5553,31 +4862,19 @@ routerinfo_incompatible_with_extrainfo(const crypto_pk_t *identity_pkey, digest_matches = tor_memeq(ei->cache_info.signed_descriptor_digest, sd->extra_info_digest, DIGEST_LEN); - /* Set digest256_matches to 1 if the digest is correct, or if no - * digest256 was in the ri. */ - digest256_matches = tor_memeq(ei->digest256, - sd->extra_info_digest256, DIGEST256_LEN); - digest256_matches |= - tor_mem_is_zero(sd->extra_info_digest256, DIGEST256_LEN); /* The identity must match exactly to have been generated at the same time * by the same router. */ - if (tor_memneq(sd->identity_digest, + if (tor_memneq(ri->cache_info.identity_digest, ei->cache_info.identity_digest, DIGEST_LEN)) { if (msg) *msg = "Extrainfo nickname or identity did not match routerinfo"; goto err; /* different servers */ } - if (! tor_cert_opt_eq(sd->signing_key_cert, - ei->cache_info.signing_key_cert)) { - if (msg) *msg = "Extrainfo signing key cert didn't match routerinfo"; - goto err; /* different servers */ - } - if (ei->pending_sig) { char signed_digest[128]; - if (crypto_pk_public_checksig(identity_pkey, + if (crypto_pk_public_checksig(ri->identity_pkey, signed_digest, sizeof(signed_digest), ei->pending_sig, ei->pending_sig_len) != DIGEST_LEN || tor_memneq(signed_digest, ei->cache_info.signed_descriptor_digest, @@ -5588,7 +4885,7 @@ routerinfo_incompatible_with_extrainfo(const crypto_pk_t *identity_pkey, goto err; /* Bad signature, or no match. */ } - ei->cache_info.send_unencrypted = sd->send_unencrypted; + ei->cache_info.send_unencrypted = ri->cache_info.send_unencrypted; tor_free(ei->pending_sig); } @@ -5601,17 +4898,6 @@ routerinfo_incompatible_with_extrainfo(const crypto_pk_t *identity_pkey, goto err; } - if (!digest256_matches && !digest_matches) { - if (msg) *msg = "Neither digest256 or digest matched " - "digest from routerdesc"; - goto err; - } - - if (!digest256_matches) { - if (msg) *msg = "Extrainfo digest did not match digest256 from routerdesc"; - goto err; /* Digest doesn't match declared value. */ - } - if (!digest_matches) { if (msg) *msg = "Extrainfo digest did not match value from routerdesc"; goto err; /* Digest doesn't match declared value. */ @@ -5629,47 +4915,6 @@ routerinfo_incompatible_with_extrainfo(const crypto_pk_t *identity_pkey, return r; } -/* Does ri have a valid ntor onion key? - * Valid ntor onion keys exist and have at least one non-zero byte. */ -int -routerinfo_has_curve25519_onion_key(const routerinfo_t *ri) -{ - if (!ri) { - return 0; - } - - if (!ri->onion_curve25519_pkey) { - return 0; - } - - if (tor_mem_is_zero((const char*)ri->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN)) { - return 0; - } - - return 1; -} - -/* Is rs running a tor version known to support EXTEND2 cells? - * If allow_unknown_versions is true, return true if we can't tell - * (from a versions line or a protocols line) whether it supports extend2 - * cells. - * Otherwise, return false if the version is unknown. */ -int -routerstatus_version_supports_extend2_cells(const routerstatus_t *rs, - int allow_unknown_versions) -{ - if (!rs) { - return allow_unknown_versions; - } - - if (!rs->protocols_known) { - return allow_unknown_versions; - } - - return rs->supports_extend2_cells; -} - /** Assert that the internal representation of rl is * self-consistent. */ void @@ -5712,7 +4957,7 @@ routerlist_assert_ok(const routerlist_t *rl) } SMARTLIST_FOREACH_END(r); SMARTLIST_FOREACH_BEGIN(rl->old_routers, signed_descriptor_t *, sd) { r2 = rimap_get(rl->identity_map, sd->identity_digest); - tor_assert(!r2 || sd != &(r2->cache_info)); + tor_assert(sd != &(r2->cache_info)); sd2 = sdmap_get(rl->desc_digest_map, sd->signed_descriptor_digest); tor_assert(sd == sd2); tor_assert(sd->routerlist_index == sd_sl_idx); @@ -5820,3 +5065,81 @@ refresh_all_country_info(void) nodelist_refresh_countries(); } +/** Determine the routers that are responsible for id (binary) and + * add pointers to those routers' routerstatus_t to responsible_dirs. + * Return -1 if we're returning an empty smartlist, else return 0. + */ +int +hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, + const char *id) +{ + int start, found, n_added = 0, i; + networkstatus_t *c = networkstatus_get_latest_consensus(); + if (!c || !smartlist_len(c->routerstatus_list)) { + log_warn(LD_REND, "We don't have a consensus, so we can't perform v2 " + "rendezvous operations."); + return -1; + } + tor_assert(id); + start = networkstatus_vote_find_entry_idx(c, id, &found); + if (start == smartlist_len(c->routerstatus_list)) start = 0; + i = start; + do { + routerstatus_t *r = smartlist_get(c->routerstatus_list, i); + if (r->is_hs_dir) { + smartlist_add(responsible_dirs, r); + if (++n_added == REND_NUMBER_OF_CONSECUTIVE_REPLICAS) + return 0; + } + if (++i == smartlist_len(c->routerstatus_list)) + i = 0; + } while (i != start); + + /* Even though we don't have the desired number of hidden service + * directories, be happy if we got any. */ + return smartlist_len(responsible_dirs) ? 0 : -1; +} + +/** Return true if this node is currently acting as hidden service + * directory, false otherwise. */ +int +hid_serv_acting_as_directory(void) +{ + const routerinfo_t *me = router_get_my_routerinfo(); + if (!me) + return 0; + if (!get_options()->HidServDirectoryV2) { + log_info(LD_REND, "We are not acting as hidden service directory, " + "because we have not been configured as such."); + return 0; + } + return 1; +} + +/** Return true if this node is responsible for storing the descriptor ID + * in query and false otherwise. */ +int +hid_serv_responsible_for_desc_id(const char *query) +{ + const routerinfo_t *me; + routerstatus_t *last_rs; + const char *my_id, *last_id; + int result; + smartlist_t *responsible; + if (!hid_serv_acting_as_directory()) + return 0; + if (!(me = router_get_my_routerinfo())) + return 0; /* This is redundant, but let's be paranoid. */ + my_id = me->cache_info.identity_digest; + responsible = smartlist_new(); + if (hid_serv_get_responsible_directories(responsible, query) < 0) { + smartlist_free(responsible); + return 0; + } + last_rs = smartlist_get(responsible, smartlist_len(responsible)-1); + last_id = last_rs->identity_digest; + result = rend_id_is_in_interval(my_id, query, last_id); + smartlist_free(responsible); + return result; +} + diff --git a/src/tor/src/or/routerlist.h b/src/tor/routerlist.h similarity index 66% rename from src/tor/src/or/routerlist.h rename to src/tor/routerlist.h index 83f4d1002..cfa868386 100644 --- a/src/tor/src/or/routerlist.h +++ b/src/tor/routerlist.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,7 +29,7 @@ int trusted_dirs_reload_certs(void); #define TRUSTED_DIRS_CERTS_SRC_FROM_VOTE 4 int trusted_dirs_load_certs_from_string(const char *contents, int source, - int flush, const char *source_dir); + int flush); void trusted_dirs_flush_certs_to_disk(void); authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest); authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest); @@ -38,35 +38,25 @@ authority_cert_t *authority_cert_get_by_digests(const char *id_digest, void authority_cert_get_all(smartlist_t *certs_out); void authority_cert_dl_failed(const char *id_digest, const char *signing_key_digest, int status); -void authority_certs_fetch_missing(networkstatus_t *status, time_t now, - const char *dir_hint); +void authority_certs_fetch_missing(networkstatus_t *status, time_t now); int router_reload_router_list(void); int authority_cert_dl_looks_uncertain(const char *id_digest); const smartlist_t *router_get_trusted_dir_servers(void); const smartlist_t *router_get_fallback_dir_servers(void); -int authority_cert_is_blacklisted(const authority_cert_t *cert); const routerstatus_t *router_pick_directory_server(dirinfo_type_t type, int flags); dir_server_t *router_get_trusteddirserver_by_digest(const char *d); dir_server_t *router_get_fallback_dirserver_by_digest( const char *digest); -int router_digest_is_fallback_dir(const char *digest); -MOCK_DECL(dir_server_t *, trusteddirserver_get_by_v3_auth_digest, - (const char *d)); +dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d); const routerstatus_t *router_pick_trusteddirserver(dirinfo_type_t type, int flags); const routerstatus_t *router_pick_fallback_dirserver(dirinfo_type_t type, int flags); -int router_skip_or_reachability(const or_options_t *options, int try_ip_pref); int router_get_my_share_of_directory_requests(double *v3_share_out); void router_reset_status_download_failures(void); int routers_have_same_or_addrs(const routerinfo_t *r1, const routerinfo_t *r2); -void router_add_running_nodes_to_smartlist(smartlist_t *sl, int need_uptime, - int need_capacity, int need_guard, - int need_desc, int pref_addr, - int direct_conn); - const routerinfo_t *routerlist_find_my_routerinfo(void); uint32_t router_get_advertised_bandwidth(const routerinfo_t *router); uint32_t router_get_advertised_bandwidth_capped(const routerinfo_t *router); @@ -80,85 +70,60 @@ const node_t *router_choose_random_node(smartlist_t *excludedsmartlist, struct routerset_t *excludedset, router_crn_flags_t flags); +int router_is_named(const routerinfo_t *router); int router_digest_is_trusted_dir_type(const char *digest, dirinfo_type_t type); #define router_digest_is_trusted_dir(d) \ router_digest_is_trusted_dir_type((d), NO_DIRINFO) +int router_addr_is_trusted_dir(uint32_t addr); int hexdigest_to_digest(const char *hexdigest, char *digest); const routerinfo_t *router_get_by_id_digest(const char *digest); routerinfo_t *router_get_mutable_by_digest(const char *digest); signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); -MOCK_DECL(signed_descriptor_t *,router_get_by_extrainfo_digest, - (const char *digest)); -MOCK_DECL(signed_descriptor_t *,extrainfo_get_by_descriptor_digest, - (const char *digest)); +signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest); +signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); const char *signed_descriptor_get_body(const signed_descriptor_t *desc); const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc); routerlist_t *router_get_routerlist(void); -void routerinfo_free_(routerinfo_t *router); -#define routerinfo_free(router) \ - FREE_AND_NULL(routerinfo_t, routerinfo_free_, (router)) -void extrainfo_free_(extrainfo_t *extrainfo); -#define extrainfo_free(ei) FREE_AND_NULL(extrainfo_t, extrainfo_free_, (ei)) -void routerlist_free_(routerlist_t *rl); -#define routerlist_free(rl) FREE_AND_NULL(routerlist_t, routerlist_free_, (rl)) +void routerinfo_free(routerinfo_t *router); +void extrainfo_free(extrainfo_t *extrainfo); +void routerlist_free(routerlist_t *rl); void dump_routerlist_mem_usage(int severity); void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old, time_t now); void routerlist_free_all(void); void routerlist_reset_warnings(void); -MOCK_DECL(smartlist_t *, list_authority_ids_with_downloads, (void)); -MOCK_DECL(download_status_t *, id_only_download_status_for_authority_id, - (const char *digest)); -MOCK_DECL(smartlist_t *, list_sk_digests_for_authority_id, - (const char *digest)); -MOCK_DECL(download_status_t *, download_status_for_authority_id_and_sk, - (const char *id_digest, const char *sk_digest)); - static int WRA_WAS_ADDED(was_router_added_t s); static int WRA_WAS_OUTDATED(was_router_added_t s); static int WRA_WAS_REJECTED(was_router_added_t s); -static int WRA_NEVER_DOWNLOADABLE(was_router_added_t s); /** Return true iff the outcome code in s indicates that the descriptor * was added. It might still be necessary to check whether the descriptor * generator should be notified. */ -static inline int +static INLINE int WRA_WAS_ADDED(was_router_added_t s) { - return s == ROUTER_ADDED_SUCCESSFULLY; + return s == ROUTER_ADDED_SUCCESSFULLY || s == ROUTER_ADDED_NOTIFY_GENERATOR; } /** Return true iff the outcome code in s indicates that the descriptor * was not added because it was either: * - not in the consensus * - neither in the consensus nor in any networkstatus document * - it was outdated. - * - its certificates were expired. */ -static inline int WRA_WAS_OUTDATED(was_router_added_t s) +static INLINE int WRA_WAS_OUTDATED(was_router_added_t s) { - return (s == ROUTER_WAS_TOO_OLD || - s == ROUTER_IS_ALREADY_KNOWN || + return (s == ROUTER_WAS_NOT_NEW || s == ROUTER_NOT_IN_CONSENSUS || - s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS || - s == ROUTER_CERTS_EXPIRED); + s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS); } /** Return true iff the outcome code in s indicates that the descriptor * was flat-out rejected. */ -static inline int WRA_WAS_REJECTED(was_router_added_t s) +static INLINE int WRA_WAS_REJECTED(was_router_added_t s) { return (s == ROUTER_AUTHDIR_REJECTS); } -/** Return true iff the outcome code in s indicates that the descriptor - * was flat-out rejected. */ -static inline int WRA_NEVER_DOWNLOADABLE(was_router_added_t s) -{ - return (s == ROUTER_AUTHDIR_REJECTS || - s == ROUTER_BAD_EI || - s == ROUTER_WAS_TOO_OLD || - s == ROUTER_CERTS_EXPIRED); -} was_router_added_t router_add_to_routerlist(routerinfo_t *router, const char **msg, int from_cache, @@ -186,18 +151,14 @@ int router_exit_policy_rejects_all(const routerinfo_t *router); dir_server_t *trusted_dir_server_new(const char *nickname, const char *address, uint16_t dir_port, uint16_t or_port, - const tor_addr_port_t *addrport_ipv6, const char *digest, const char *v3_auth_digest, dirinfo_type_t type, double weight); dir_server_t *fallback_dir_server_new(const tor_addr_t *addr, uint16_t dir_port, uint16_t or_port, - const tor_addr_port_t *addrport_ipv6, const char *id_digest, double weight); void dir_server_add(dir_server_t *ent); -void authority_cert_free_(authority_cert_t *cert); -#define authority_cert_free(cert) \ - FREE_AND_NULL(authority_cert_t, authority_cert_free_, (cert)) +void authority_cert_free(authority_cert_t *cert); void clear_dir_servers(void); void update_consensus_router_descriptor_downloads(time_t now, int is_vote, networkstatus_t *consensus); @@ -207,13 +168,10 @@ void update_extrainfo_downloads(time_t now); void router_reset_descriptor_download_failures(void); int router_differences_are_cosmetic(const routerinfo_t *r1, const routerinfo_t *r2); -int routerinfo_incompatible_with_extrainfo(const crypto_pk_t *ri, +int routerinfo_incompatible_with_extrainfo(const routerinfo_t *ri, extrainfo_t *ei, signed_descriptor_t *sd, const char **msg); -int routerinfo_has_curve25519_onion_key(const routerinfo_t *ri); -int routerstatus_version_supports_extend2_cells(const routerstatus_t *rs, - int allow_unknown_versions); void routerlist_assert_ok(const routerlist_t *rl); const char *esc_router_info(const routerinfo_t *router); @@ -221,7 +179,12 @@ void routers_sort_by_identity(smartlist_t *routers); void refresh_all_country_info(void); -void list_pending_microdesc_downloads(digest256map_t *result); +int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, + const char *id); +int hid_serv_acting_as_directory(void); +int hid_serv_responsible_for_desc_id(const char *id); + +void list_pending_microdesc_downloads(digestmap_t *result); void launch_descriptor_downloads(int purpose, smartlist_t *downloadable, const routerstatus_t *source, @@ -233,31 +196,22 @@ int hex_digest_nickname_decode(const char *hexdigest, char *nickname_out); int hex_digest_nickname_matches(const char *hexdigest, const char *identity_digest, - const char *nickname); + const char *nickname, int is_named); #ifdef ROUTERLIST_PRIVATE -STATIC int choose_array_element_by_weight(const uint64_t *entries, +/** Helper type for choosing routers by bandwidth: contains a union of + * double and uint64_t. Before we call scale_array_elements_to_u64, it holds + * a double; after, it holds a uint64_t. */ +typedef union u64_dbl_t { + uint64_t u64; + double dbl; +} u64_dbl_t; + +STATIC int choose_array_element_by_weight(const u64_dbl_t *entries, int n_entries); -STATIC void scale_array_elements_to_u64(uint64_t *entries_out, - const double *entries_in, - int n_entries, +STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries, uint64_t *total_out); -STATIC const routerstatus_t *router_pick_directory_server_impl( - dirinfo_type_t auth, int flags, - int *n_busy_out); - -MOCK_DECL(int, router_descriptor_is_older_than, (const routerinfo_t *router, - int seconds)); -MOCK_DECL(STATIC was_router_added_t, extrainfo_insert, - (routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)); - -MOCK_DECL(STATIC void, initiate_descriptor_downloads, - (const routerstatus_t *source, int purpose, smartlist_t *digests, - int lo, int hi, int pds_flags)); -STATIC int router_is_already_dir_fetching(const tor_addr_port_t *ap, - int serverdesc, int microdesc); - -#endif /* defined(ROUTERLIST_PRIVATE) */ +#endif -#endif /* !defined(TOR_ROUTERLIST_H) */ +#endif diff --git a/src/tor/src/or/routerparse.c b/src/tor/routerparse.c similarity index 67% rename from src/tor/src/or/routerparse.c rename to src/tor/routerparse.c index f1895ce31..4ad316cee 100644 --- a/src/tor/src/or/routerparse.c +++ b/src/tor/routerparse.c @@ -1,68 +1,20 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file routerparse.c - * \brief Code to parse and validate router descriptors, consenus directories, - * and similar objects. - * - * The objects parsed by this module use a common text-based metaformat, - * documented in dir-spec.txt in torspec.git. This module is itself divided - * into two major kinds of function: code to handle the metaformat, and code - * to convert from particular instances of the metaformat into the - * objects that Tor uses. - * - * The generic parsing code works by calling a table-based tokenizer on the - * input string. Each token corresponds to a single line with a token, plus - * optional arguments on that line, plus an optional base-64 encoded object - * after that line. Each token has a definition in a table of token_rule_t - * entries that describes how many arguments it can take, whether it takes an - * object, how many times it may appear, whether it must appear first, and so - * on. - * - * The tokenizer function tokenize_string() converts its string input into a - * smartlist full of instances of directory_token_t, according to a provided - * table of token_rule_t. - * - * The generic parts of this module additionally include functions for - * finding the start and end of signed information inside a signed object, and - * computing the digest that will be signed. - * - * There are also functions for saving objects to disk that have caused - * parsing to fail. - * - * The specific parts of this module describe conversions between - * particular lists of directory_token_t and particular objects. The - * kinds of objects that can be parsed here are: - *
      - *
    • router descriptors (managed from routerlist.c) - *
    • extra-info documents (managed from routerlist.c) - *
    • microdescriptors (managed from microdesc.c) - *
    • vote and consensus networkstatus documents, and the routerstatus_t - * objects that they comprise (managed from networkstatus.c) - *
    • detached-signature objects used by authorities for gathering - * signatures on the networkstatus consensus (managed from dirvote.c) - *
    • authority key certificates (managed from routerlist.c) - *
    • hidden service descriptors (managed from rendcommon.c and rendcache.c) - *
    - * - * For no terribly good reason, the functions to generate signatures on - * the above directory objects are also in this module. + * \brief Code to parse and validate router descriptors and directories. **/ -#define ROUTERPARSE_PRIVATE - #include "or.h" #include "config.h" #include "circuitstats.h" #include "dirserv.h" #include "dirvote.h" -#include "parsecommon.h" #include "policies.h" -#include "protover.h" #include "rendcommon.h" #include "router.h" #include "routerlist.h" @@ -70,18 +22,251 @@ #include "microdesc.h" #include "networkstatus.h" #include "rephist.h" -#include "routerkeys.h" #include "routerparse.h" -#include "entrynodes.h" -#include "torcert.h" -#include "sandbox.h" -#include "shared_random.h" - #undef log #include /****************************************************************************/ +/** Enumeration of possible token types. The ones starting with K_ correspond + * to directory 'keywords'. ERR_ is an error in the tokenizing process, EOF_ + * is an end-of-file marker, and NIL_ is used to encode not-a-token. + */ +typedef enum { + K_ACCEPT = 0, + K_ACCEPT6, + K_DIRECTORY_SIGNATURE, + K_RECOMMENDED_SOFTWARE, + K_REJECT, + K_REJECT6, + K_ROUTER, + K_SIGNED_DIRECTORY, + K_SIGNING_KEY, + K_ONION_KEY, + K_ONION_KEY_NTOR, + K_ROUTER_SIGNATURE, + K_PUBLISHED, + K_RUNNING_ROUTERS, + K_ROUTER_STATUS, + K_PLATFORM, + K_OPT, + K_BANDWIDTH, + K_CONTACT, + K_NETWORK_STATUS, + K_UPTIME, + K_DIR_SIGNING_KEY, + K_FAMILY, + K_FINGERPRINT, + K_HIBERNATING, + K_READ_HISTORY, + K_WRITE_HISTORY, + K_NETWORK_STATUS_VERSION, + K_DIR_SOURCE, + K_DIR_OPTIONS, + K_CLIENT_VERSIONS, + K_SERVER_VERSIONS, + K_OR_ADDRESS, + K_P, + K_P6, + K_R, + K_A, + K_S, + K_V, + K_W, + K_M, + K_EXTRA_INFO, + K_EXTRA_INFO_DIGEST, + K_CACHES_EXTRA_INFO, + K_HIDDEN_SERVICE_DIR, + K_ALLOW_SINGLE_HOP_EXITS, + K_IPV6_POLICY, + + K_DIRREQ_END, + K_DIRREQ_V2_IPS, + K_DIRREQ_V3_IPS, + K_DIRREQ_V2_REQS, + K_DIRREQ_V3_REQS, + K_DIRREQ_V2_SHARE, + K_DIRREQ_V3_SHARE, + K_DIRREQ_V2_RESP, + K_DIRREQ_V3_RESP, + K_DIRREQ_V2_DIR, + K_DIRREQ_V3_DIR, + K_DIRREQ_V2_TUN, + K_DIRREQ_V3_TUN, + K_ENTRY_END, + K_ENTRY_IPS, + K_CELL_END, + K_CELL_PROCESSED, + K_CELL_QUEUED, + K_CELL_TIME, + K_CELL_CIRCS, + K_EXIT_END, + K_EXIT_WRITTEN, + K_EXIT_READ, + K_EXIT_OPENED, + + K_DIR_KEY_CERTIFICATE_VERSION, + K_DIR_IDENTITY_KEY, + K_DIR_KEY_PUBLISHED, + K_DIR_KEY_EXPIRES, + K_DIR_KEY_CERTIFICATION, + K_DIR_KEY_CROSSCERT, + K_DIR_ADDRESS, + + K_VOTE_STATUS, + K_VALID_AFTER, + K_FRESH_UNTIL, + K_VALID_UNTIL, + K_VOTING_DELAY, + + K_KNOWN_FLAGS, + K_PARAMS, + K_BW_WEIGHTS, + K_VOTE_DIGEST, + K_CONSENSUS_DIGEST, + K_ADDITIONAL_DIGEST, + K_ADDITIONAL_SIGNATURE, + K_CONSENSUS_METHODS, + K_CONSENSUS_METHOD, + K_LEGACY_DIR_KEY, + K_DIRECTORY_FOOTER, + + A_PURPOSE, + A_LAST_LISTED, + A_UNKNOWN_, + + R_RENDEZVOUS_SERVICE_DESCRIPTOR, + R_VERSION, + R_PERMANENT_KEY, + R_SECRET_ID_PART, + R_PUBLICATION_TIME, + R_PROTOCOL_VERSIONS, + R_INTRODUCTION_POINTS, + R_SIGNATURE, + + R_IPO_IDENTIFIER, + R_IPO_IP_ADDRESS, + R_IPO_ONION_PORT, + R_IPO_ONION_KEY, + R_IPO_SERVICE_KEY, + + C_CLIENT_NAME, + C_DESCRIPTOR_COOKIE, + C_CLIENT_KEY, + + ERR_, + EOF_, + NIL_ +} directory_keyword; + +#define MIN_ANNOTATION A_PURPOSE +#define MAX_ANNOTATION A_UNKNOWN_ + +/** Structure to hold a single directory token. + * + * We parse a directory by breaking it into "tokens", each consisting + * of a keyword, a line full of arguments, and a binary object. The + * arguments and object are both optional, depending on the keyword + * type. + * + * This structure is only allocated in memareas; do not allocate it on + * the heap, or token_clear() won't work. + */ +typedef struct directory_token_t { + directory_keyword tp; /**< Type of the token. */ + int n_args:30; /**< Number of elements in args */ + char **args; /**< Array of arguments from keyword line. */ + + char *object_type; /**< -----BEGIN [object_type]-----*/ + size_t object_size; /**< Bytes in object_body */ + char *object_body; /**< Contents of object, base64-decoded. */ + + crypto_pk_t *key; /**< For public keys only. Heap-allocated. */ + + char *error; /**< For ERR_ tokens only. */ +} directory_token_t; + +/* ********************************************************************** */ + +/** We use a table of rules to decide how to parse each token type. */ + +/** Rules for whether the keyword needs an object. */ +typedef enum { + NO_OBJ, /**< No object, ever. */ + NEED_OBJ, /**< Object is required. */ + NEED_SKEY_1024,/**< Object is required, and must be a 1024 bit private key */ + NEED_KEY_1024, /**< Object is required, and must be a 1024 bit public key */ + NEED_KEY, /**< Object is required, and must be a public key. */ + OBJ_OK, /**< Object is optional. */ +} obj_syntax; + +#define AT_START 1 +#define AT_END 2 + +/** Determines the parsing rules for a single token type. */ +typedef struct token_rule_t { + /** The string value of the keyword identifying the type of item. */ + const char *t; + /** The corresponding directory_keyword enum. */ + directory_keyword v; + /** Minimum number of arguments for this item */ + int min_args; + /** Maximum number of arguments for this item */ + int max_args; + /** If true, we concatenate all arguments for this item into a single + * string. */ + int concat_args; + /** Requirements on object syntax for this item. */ + obj_syntax os; + /** Lowest number of times this item may appear in a document. */ + int min_cnt; + /** Highest number of times this item may appear in a document. */ + int max_cnt; + /** One or more of AT_START/AT_END to limit where the item may appear in a + * document. */ + int pos; + /** True iff this token is an annotation. */ + int is_annotation; +} token_rule_t; + +/* + * Helper macros to define token tables. 's' is a string, 't' is a + * directory_keyword, 'a' is a trio of argument multiplicities, and 'o' is an + * object syntax. + * + */ + +/** Appears to indicate the end of a table. */ +#define END_OF_TABLE { NULL, NIL_, 0,0,0, NO_OBJ, 0, INT_MAX, 0, 0 } +/** An item with no restrictions: used for obsolete document types */ +#define T(s,t,a,o) { s, t, a, o, 0, INT_MAX, 0, 0 } +/** An item with no restrictions on multiplicity or location. */ +#define T0N(s,t,a,o) { s, t, a, o, 0, INT_MAX, 0, 0 } +/** An item that must appear exactly once */ +#define T1(s,t,a,o) { s, t, a, o, 1, 1, 0, 0 } +/** An item that must appear exactly once, at the start of the document */ +#define T1_START(s,t,a,o) { s, t, a, o, 1, 1, AT_START, 0 } +/** An item that must appear exactly once, at the end of the document */ +#define T1_END(s,t,a,o) { s, t, a, o, 1, 1, AT_END, 0 } +/** An item that must appear one or more times */ +#define T1N(s,t,a,o) { s, t, a, o, 1, INT_MAX, 0, 0 } +/** An item that must appear no more than once */ +#define T01(s,t,a,o) { s, t, a, o, 0, 1, 0, 0 } +/** An annotation that must appear no more than once */ +#define A01(s,t,a,o) { s, t, a, o, 0, 1, 0, 1 } + +/* Argument multiplicity: any number of arguments. */ +#define ARGS 0,INT_MAX,0 +/* Argument multiplicity: no arguments. */ +#define NO_ARGS 0,0,0 +/* Argument multiplicity: concatenate all arguments. */ +#define CONCAT_ARGS 1,1,1 +/* Argument multiplicity: at least n arguments. */ +#define GE(n) n,INT_MAX,0 +/* Argument multiplicity: exactly n arguments. */ +#define EQ(n) n,n,0 + /** List of tokens recognized in router descriptors */ static token_rule_t routerdesc_token_table[] = { T0N("reject", K_REJECT, ARGS, NO_OBJ ), @@ -99,19 +284,11 @@ static token_rule_t routerdesc_token_table[] = { T01("fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ), T01("hibernating", K_HIBERNATING, GE(1), NO_OBJ ), T01("platform", K_PLATFORM, CONCAT_ARGS, NO_OBJ ), - T01("proto", K_PROTO, CONCAT_ARGS, NO_OBJ ), T01("contact", K_CONTACT, CONCAT_ARGS, NO_OBJ ), T01("read-history", K_READ_HISTORY, ARGS, NO_OBJ ), T01("write-history", K_WRITE_HISTORY, ARGS, NO_OBJ ), T01("extra-info-digest", K_EXTRA_INFO_DIGEST, GE(1), NO_OBJ ), T01("hidden-service-dir", K_HIDDEN_SERVICE_DIR, NO_ARGS, NO_OBJ ), - T01("identity-ed25519", K_IDENTITY_ED25519, NO_ARGS, NEED_OBJ ), - T01("master-key-ed25519", K_MASTER_KEY_ED25519, GE(1), NO_OBJ ), - T01("router-sig-ed25519", K_ROUTER_SIG_ED25519, GE(1), NO_OBJ ), - T01("onion-key-crosscert", K_ONION_KEY_CROSSCERT, NO_ARGS, NEED_OBJ ), - T01("ntor-onion-key-crosscert", K_NTOR_ONION_KEY_CROSSCERT, - EQ(1), NEED_OBJ ), - T01("allow-single-hop-exits",K_ALLOW_SINGLE_HOP_EXITS, NO_ARGS, NO_OBJ ), T01("family", K_FAMILY, ARGS, NO_OBJ ), @@ -121,7 +298,6 @@ static token_rule_t routerdesc_token_table[] = { T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), T1( "bandwidth", K_BANDWIDTH, GE(3), NO_OBJ ), A01("@purpose", A_PURPOSE, GE(1), NO_OBJ ), - T01("tunnelled-dir-server",K_DIR_TUNNELLED, NO_ARGS, NO_OBJ ), END_OF_TABLE }; @@ -130,8 +306,6 @@ static token_rule_t routerdesc_token_table[] = { static token_rule_t extrainfo_token_table[] = { T1_END( "router-signature", K_ROUTER_SIGNATURE, NO_ARGS, NEED_OBJ ), T1( "published", K_PUBLISHED, CONCAT_ARGS, NO_OBJ ), - T01("identity-ed25519", K_IDENTITY_ED25519, NO_ARGS, NEED_OBJ ), - T01("router-sig-ed25519", K_ROUTER_SIG_ED25519, GE(1), NO_OBJ ), T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), T01("read-history", K_READ_HISTORY, ARGS, NO_OBJ ), T01("write-history", K_WRITE_HISTORY, ARGS, NO_OBJ ), @@ -175,8 +349,6 @@ static token_rule_t rtrstatus_token_table[] = { T01("v", K_V, CONCAT_ARGS, NO_OBJ ), T01("w", K_W, ARGS, NO_OBJ ), T0N("m", K_M, CONCAT_ARGS, NO_OBJ ), - T0N("id", K_ID, GE(2), NO_OBJ ), - T01("pr", K_PROTO, CONCAT_ARGS, NO_OBJ ), T0N("opt", K_OPT, CONCAT_ARGS, OBJ_OK ), END_OF_TABLE }; @@ -248,20 +420,6 @@ static token_rule_t networkstatus_token_table[] = { T1("known-flags", K_KNOWN_FLAGS, ARGS, NO_OBJ ), T01("params", K_PARAMS, ARGS, NO_OBJ ), T( "fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ), - T01("signing-ed25519", K_SIGNING_CERT_ED, NO_ARGS , NEED_OBJ ), - T01("shared-rand-participate",K_SR_FLAG, NO_ARGS, NO_OBJ ), - T0N("shared-rand-commit", K_COMMIT, GE(3), NO_OBJ ), - T01("shared-rand-previous-value", K_PREVIOUS_SRV,EQ(2), NO_OBJ ), - T01("shared-rand-current-value", K_CURRENT_SRV, EQ(2), NO_OBJ ), - T0N("package", K_PACKAGE, CONCAT_ARGS, NO_OBJ ), - T01("recommended-client-protocols", K_RECOMMENDED_CLIENT_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("recommended-relay-protocols", K_RECOMMENDED_RELAY_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("required-client-protocols", K_REQUIRED_CLIENT_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("required-relay-protocols", K_REQUIRED_RELAY_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), CERTIFICATE_MEMBERS @@ -300,18 +458,6 @@ static token_rule_t networkstatus_consensus_token_table[] = { T01("consensus-method", K_CONSENSUS_METHOD, EQ(1), NO_OBJ), T01("params", K_PARAMS, ARGS, NO_OBJ ), - T01("shared-rand-previous-value", K_PREVIOUS_SRV, EQ(2), NO_OBJ ), - T01("shared-rand-current-value", K_CURRENT_SRV, EQ(2), NO_OBJ ), - - T01("recommended-client-protocols", K_RECOMMENDED_CLIENT_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("recommended-relay-protocols", K_RECOMMENDED_RELAY_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("required-client-protocols", K_REQUIRED_CLIENT_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - T01("required-relay-protocols", K_REQUIRED_RELAY_PROTOCOLS, - CONCAT_ARGS, NO_OBJ ), - END_OF_TABLE }; @@ -339,7 +485,6 @@ static token_rule_t networkstatus_detached_signature_token_table[] = { static token_rule_t microdesc_token_table[] = { T1_START("onion-key", K_ONION_KEY, NO_ARGS, NEED_KEY_1024), T01("ntor-onion-key", K_ONION_KEY_NTOR, GE(1), NO_OBJ ), - T0N("id", K_ID, GE(2), NO_OBJ ), T0N("a", K_A, GE(1), NO_OBJ ), T01("family", K_FAMILY, ARGS, NO_OBJ ), T01("p", K_P, CONCAT_ARGS, NO_OBJ ), @@ -356,22 +501,38 @@ static addr_policy_t *router_parse_addr_policy(directory_token_t *tok, unsigned fmt_flags); static addr_policy_t *router_parse_addr_policy_private(directory_token_t *tok); -static int router_get_hash_impl_helper(const char *s, size_t s_len, - const char *start_str, - const char *end_str, char end_c, - int log_severity, - const char **start_out, const char **end_out); static int router_get_hash_impl(const char *s, size_t s_len, char *digest, const char *start_str, const char *end_str, char end_char, digest_algorithm_t alg); static int router_get_hashes_impl(const char *s, size_t s_len, - common_digests_t *digests, + digests_t *digests, const char *start_str, const char *end_str, char end_char); +static void token_clear(directory_token_t *tok); +static smartlist_t *find_all_by_keyword(smartlist_t *s, directory_keyword k); static smartlist_t *find_all_exitpolicy(smartlist_t *s); - -#define CST_NO_CHECK_OBJTYPE (1<<0) +static directory_token_t *find_by_keyword_(smartlist_t *s, + directory_keyword keyword, + const char *keyword_str); +#define find_by_keyword(s, keyword) find_by_keyword_((s), (keyword), #keyword) +static directory_token_t *find_opt_by_keyword(smartlist_t *s, + directory_keyword keyword); + +#define TS_ANNOTATIONS_OK 1 +#define TS_NOCHECK 2 +#define TS_NO_NEW_ANNOTATIONS 4 +static int tokenize_string(memarea_t *area, + const char *start, const char *end, + smartlist_t *out, + token_rule_t *table, + int flags); +static directory_token_t *get_next_token(memarea_t *area, + const char **s, + const char *eos, + token_rule_t *table); +#define CST_CHECK_AUTHORITY (1<<0) +#define CST_NO_CHECK_OBJTYPE (1<<1) static int check_signature_token(const char *digest, ssize_t digest_len, directory_token_t *tok, @@ -388,583 +549,36 @@ static int check_signature_token(const char *digest, log_debug(LD_MM, "Area for %s has %lu allocated; using %lu.", \ name, (unsigned long)alloc, (unsigned long)used); \ STMT_END -#else /* !(defined(DEBUG_AREA_ALLOC)) */ +#else #define DUMP_AREA(a,name) STMT_NIL -#endif /* defined(DEBUG_AREA_ALLOC) */ - -/* Dump mechanism for unparseable descriptors */ - -/** List of dumped descriptors for FIFO cleanup purposes */ -STATIC smartlist_t *descs_dumped = NULL; -/** Total size of dumped descriptors for FIFO cleanup */ -STATIC uint64_t len_descs_dumped = 0; -/** Directory to stash dumps in */ -static int have_dump_desc_dir = 0; -static int problem_with_dump_desc_dir = 0; - -#define DESC_DUMP_DATADIR_SUBDIR "unparseable-descs" -#define DESC_DUMP_BASE_FILENAME "unparseable-desc" - -/** Find the dump directory and check if we'll be able to create it */ -static void -dump_desc_init(void) -{ - char *dump_desc_dir; - - dump_desc_dir = get_datadir_fname(DESC_DUMP_DATADIR_SUBDIR); - - /* - * We just check for it, don't create it at this point; we'll - * create it when we need it if it isn't already there. - */ - if (check_private_dir(dump_desc_dir, CPD_CHECK, get_options()->User) < 0) { - /* Error, log and flag it as having a problem */ - log_notice(LD_DIR, - "Doesn't look like we'll be able to create descriptor dump " - "directory %s; dumps will be disabled.", - dump_desc_dir); - problem_with_dump_desc_dir = 1; - tor_free(dump_desc_dir); - return; - } - - /* Check if it exists */ - switch (file_status(dump_desc_dir)) { - case FN_DIR: - /* We already have a directory */ - have_dump_desc_dir = 1; - break; - case FN_NOENT: - /* Nothing, we'll need to create it later */ - have_dump_desc_dir = 0; - break; - case FN_ERROR: - /* Log and flag having a problem */ - log_notice(LD_DIR, - "Couldn't check whether descriptor dump directory %s already" - " exists: %s", - dump_desc_dir, strerror(errno)); - problem_with_dump_desc_dir = 1; - break; - case FN_FILE: - case FN_EMPTY: - default: - /* Something else was here! */ - log_notice(LD_DIR, - "Descriptor dump directory %s already exists and isn't a " - "directory", - dump_desc_dir); - problem_with_dump_desc_dir = 1; - } - - if (have_dump_desc_dir && !problem_with_dump_desc_dir) { - dump_desc_populate_fifo_from_directory(dump_desc_dir); - } - - tor_free(dump_desc_dir); -} - -/** Create the dump directory if needed and possible */ -static void -dump_desc_create_dir(void) -{ - char *dump_desc_dir; - - /* If the problem flag is set, skip it */ - if (problem_with_dump_desc_dir) return; - - /* Do we need it? */ - if (!have_dump_desc_dir) { - dump_desc_dir = get_datadir_fname(DESC_DUMP_DATADIR_SUBDIR); - - if (check_private_dir(dump_desc_dir, CPD_CREATE, - get_options()->User) < 0) { - log_notice(LD_DIR, - "Failed to create descriptor dump directory %s", - dump_desc_dir); - problem_with_dump_desc_dir = 1; - } - - /* Okay, we created it */ - have_dump_desc_dir = 1; - - tor_free(dump_desc_dir); - } -} - -/** Dump desc FIFO/cleanup; take ownership of the given filename, add it to - * the FIFO, and clean up the oldest entries to the extent they exceed the - * configured cap. If any old entries with a matching hash existed, they - * just got overwritten right before this was called and we should adjust - * the total size counter without deleting them. - */ -static void -dump_desc_fifo_add_and_clean(char *filename, const uint8_t *digest_sha256, - size_t len) -{ - dumped_desc_t *ent = NULL, *tmp; - uint64_t max_len; - - tor_assert(filename != NULL); - tor_assert(digest_sha256 != NULL); - - if (descs_dumped == NULL) { - /* We better have no length, then */ - tor_assert(len_descs_dumped == 0); - /* Make a smartlist */ - descs_dumped = smartlist_new(); - } - - /* Make a new entry to put this one in */ - ent = tor_malloc_zero(sizeof(*ent)); - ent->filename = filename; - ent->len = len; - ent->when = time(NULL); - memcpy(ent->digest_sha256, digest_sha256, DIGEST256_LEN); - - /* Do we need to do some cleanup? */ - max_len = get_options()->MaxUnparseableDescSizeToLog; - /* Iterate over the list until we've freed enough space */ - while (len > max_len - len_descs_dumped && - smartlist_len(descs_dumped) > 0) { - /* Get the oldest thing on the list */ - tmp = (dumped_desc_t *)(smartlist_get(descs_dumped, 0)); - - /* - * Check if it matches the filename we just added, so we don't delete - * something we just emitted if we get repeated identical descriptors. - */ - if (strcmp(tmp->filename, filename) != 0) { - /* Delete it and adjust the length counter */ - tor_unlink(tmp->filename); - tor_assert(len_descs_dumped >= tmp->len); - len_descs_dumped -= tmp->len; - log_info(LD_DIR, - "Deleting old unparseable descriptor dump %s due to " - "space limits", - tmp->filename); - } else { - /* - * Don't delete, but do adjust the counter since we will bump it - * later - */ - tor_assert(len_descs_dumped >= tmp->len); - len_descs_dumped -= tmp->len; - log_info(LD_DIR, - "Replacing old descriptor dump %s with new identical one", - tmp->filename); - } - - /* Free it and remove it from the list */ - smartlist_del_keeporder(descs_dumped, 0); - tor_free(tmp->filename); - tor_free(tmp); - } - - /* Append our entry to the end of the list and bump the counter */ - smartlist_add(descs_dumped, ent); - len_descs_dumped += len; -} - -/** Check if we already have a descriptor for this hash and move it to the - * head of the queue if so. Return 1 if one existed and 0 otherwise. - */ -static int -dump_desc_fifo_bump_hash(const uint8_t *digest_sha256) -{ - dumped_desc_t *match = NULL; - - tor_assert(digest_sha256); - - if (descs_dumped) { - /* Find a match if one exists */ - SMARTLIST_FOREACH_BEGIN(descs_dumped, dumped_desc_t *, ent) { - if (ent && - tor_memeq(ent->digest_sha256, digest_sha256, DIGEST256_LEN)) { - /* - * Save a pointer to the match and remove it from its current - * position. - */ - match = ent; - SMARTLIST_DEL_CURRENT_KEEPORDER(descs_dumped, ent); - break; - } - } SMARTLIST_FOREACH_END(ent); - - if (match) { - /* Update the timestamp */ - match->when = time(NULL); - /* Add it back at the end of the list */ - smartlist_add(descs_dumped, match); - - /* Indicate we found one */ - return 1; - } - } - - return 0; -} - -/** Clean up on exit; just memory, leave the dumps behind - */ -STATIC void -dump_desc_fifo_cleanup(void) -{ - if (descs_dumped) { - /* Free each descriptor */ - SMARTLIST_FOREACH_BEGIN(descs_dumped, dumped_desc_t *, ent) { - tor_assert(ent); - tor_free(ent->filename); - tor_free(ent); - } SMARTLIST_FOREACH_END(ent); - /* Free the list */ - smartlist_free(descs_dumped); - descs_dumped = NULL; - len_descs_dumped = 0; - } -} - -/** Handle one file for dump_desc_populate_fifo_from_directory(); make sure - * the filename is sensibly formed and matches the file content, and either - * return a dumped_desc_t for it or remove the file and return NULL. - */ -MOCK_IMPL(STATIC dumped_desc_t *, -dump_desc_populate_one_file, (const char *dirname, const char *f)) -{ - dumped_desc_t *ent = NULL; - char *path = NULL, *desc = NULL; - const char *digest_str; - char digest[DIGEST256_LEN], content_digest[DIGEST256_LEN]; - /* Expected prefix before digest in filenames */ - const char *f_pfx = DESC_DUMP_BASE_FILENAME "."; - /* - * Stat while reading; this is important in case the file - * contains a NUL character. - */ - struct stat st; - - /* Sanity-check args */ - tor_assert(dirname != NULL); - tor_assert(f != NULL); - - /* Form the full path */ - tor_asprintf(&path, "%s" PATH_SEPARATOR "%s", dirname, f); - - /* Check that f has the form DESC_DUMP_BASE_FILENAME. */ - - if (!strcmpstart(f, f_pfx)) { - /* It matches the form, but is the digest parseable as such? */ - digest_str = f + strlen(f_pfx); - if (base16_decode(digest, DIGEST256_LEN, - digest_str, strlen(digest_str)) != DIGEST256_LEN) { - /* We failed to decode it */ - digest_str = NULL; - } - } else { - /* No match */ - digest_str = NULL; - } - - if (!digest_str) { - /* We couldn't get a sensible digest */ - log_notice(LD_DIR, - "Removing unrecognized filename %s from unparseable " - "descriptors directory", f); - tor_unlink(path); - /* We're done */ - goto done; - } - - /* - * The filename has the form DESC_DUMP_BASE_FILENAME "." and - * we've decoded the digest. Next, check that we can read it and the - * content matches this digest. We are relying on the fact that if the - * file contains a '\0', read_file_to_str() will allocate space for and - * read the entire file and return the correct size in st. - */ - desc = read_file_to_str(path, RFTS_IGNORE_MISSING|RFTS_BIN, &st); - if (!desc) { - /* We couldn't read it */ - log_notice(LD_DIR, - "Failed to read %s from unparseable descriptors directory; " - "attempting to remove it.", f); - tor_unlink(path); - /* We're done */ - goto done; - } - -#if SIZE_MAX > UINT64_MAX - if (BUG((uint64_t)st.st_size > (uint64_t)SIZE_MAX)) { - /* LCOV_EXCL_START - * Should be impossible since RFTS above should have failed to read the - * huge file into RAM. */ - goto done; - /* LCOV_EXCL_STOP */ - } -#endif /* SIZE_MAX > UINT64_MAX */ - if (BUG(st.st_size < 0)) { - /* LCOV_EXCL_START - * Should be impossible, since the OS isn't supposed to be b0rken. */ - goto done; - /* LCOV_EXCL_STOP */ - } - /* (Now we can be sure that st.st_size is safe to cast to a size_t.) */ - - /* - * We got one; now compute its digest and check that it matches the - * filename. - */ - if (crypto_digest256((char *)content_digest, desc, (size_t) st.st_size, - DIGEST_SHA256) < 0) { - /* Weird, but okay */ - log_info(LD_DIR, - "Unable to hash content of %s from unparseable descriptors " - "directory", f); - tor_unlink(path); - /* We're done */ - goto done; - } - - /* Compare the digests */ - if (tor_memneq(digest, content_digest, DIGEST256_LEN)) { - /* No match */ - log_info(LD_DIR, - "Hash of %s from unparseable descriptors directory didn't " - "match its filename; removing it", f); - tor_unlink(path); - /* We're done */ - goto done; - } - - /* Okay, it's a match, we should prepare ent */ - ent = tor_malloc_zero(sizeof(dumped_desc_t)); - ent->filename = path; - memcpy(ent->digest_sha256, digest, DIGEST256_LEN); - ent->len = (size_t) st.st_size; - ent->when = st.st_mtime; - /* Null out path so we don't free it out from under ent */ - path = NULL; - - done: - /* Free allocations if we had them */ - tor_free(desc); - tor_free(path); - - return ent; -} - -/** Sort helper for dump_desc_populate_fifo_from_directory(); compares - * the when field of dumped_desc_ts in a smartlist to put the FIFO in - * the correct order after reconstructing it from the directory. - */ -static int -dump_desc_compare_fifo_entries(const void **a_v, const void **b_v) -{ - const dumped_desc_t **a = (const dumped_desc_t **)a_v; - const dumped_desc_t **b = (const dumped_desc_t **)b_v; - - if ((a != NULL) && (*a != NULL)) { - if ((b != NULL) && (*b != NULL)) { - /* We have sensible dumped_desc_ts to compare */ - if ((*a)->when < (*b)->when) { - return -1; - } else if ((*a)->when == (*b)->when) { - return 0; - } else { - return 1; - } - } else { - /* - * We shouldn't see this, but what the hell, NULLs precede everythin - * else - */ - return 1; - } - } else { - return -1; - } -} - -/** Scan the contents of the directory, and update FIFO/counters; this will - * consistency-check descriptor dump filenames against hashes of descriptor - * dump file content, and remove any inconsistent/unreadable dumps, and then - * reconstruct the dump FIFO as closely as possible for the last time the - * tor process shut down. If a previous dump was repeated more than once and - * moved ahead in the FIFO, the mtime will not have been updated and the - * reconstructed order will be wrong, but will always be a permutation of - * the original. - */ -STATIC void -dump_desc_populate_fifo_from_directory(const char *dirname) -{ - smartlist_t *files = NULL; - dumped_desc_t *ent = NULL; - - tor_assert(dirname != NULL); - - /* Get a list of files */ - files = tor_listdir(dirname); - if (!files) { - log_notice(LD_DIR, - "Unable to get contents of unparseable descriptor dump " - "directory %s", - dirname); - return; - } - - /* - * Iterate through the list and decide which files should go in the - * FIFO and which should be purged. - */ - - SMARTLIST_FOREACH_BEGIN(files, char *, f) { - /* Try to get a FIFO entry */ - ent = dump_desc_populate_one_file(dirname, f); - if (ent) { - /* - * We got one; add it to the FIFO. No need for duplicate checking - * here since we just verified the name and digest match. - */ - - /* Make sure we have a list to add it to */ - if (!descs_dumped) { - descs_dumped = smartlist_new(); - len_descs_dumped = 0; - } - - /* Add it and adjust the counter */ - smartlist_add(descs_dumped, ent); - len_descs_dumped += ent->len; - } - /* - * If we didn't, we will have unlinked the file if necessary and - * possible, and emitted a log message about it, so just go on to - * the next. - */ - } SMARTLIST_FOREACH_END(f); - - /* Did we get anything? */ - if (descs_dumped != NULL) { - /* Sort the FIFO in order of increasing timestamp */ - smartlist_sort(descs_dumped, dump_desc_compare_fifo_entries); - - /* Log some stats */ - log_info(LD_DIR, - "Reloaded unparseable descriptor dump FIFO with %d dump(s) " - "totaling " U64_FORMAT " bytes", - smartlist_len(descs_dumped), U64_PRINTF_ARG(len_descs_dumped)); - } +#endif - /* Free the original list */ - SMARTLIST_FOREACH(files, char *, f, tor_free(f)); - smartlist_free(files); -} +/** Last time we dumped a descriptor to disk. */ +static time_t last_desc_dumped = 0; /** For debugging purposes, dump unparseable descriptor *desc of * type *type to file $DATADIR/unparseable-desc. Do not write more * than one descriptor to disk per minute. If there is already such a * file in the data directory, overwrite it. */ -MOCK_IMPL(STATIC void, -dump_desc,(const char *desc, const char *type)) +static void +dump_desc(const char *desc, const char *type) { + time_t now = time(NULL); tor_assert(desc); tor_assert(type); - size_t len; - /* The SHA256 of the string */ - uint8_t digest_sha256[DIGEST256_LEN]; - char digest_sha256_hex[HEX_DIGEST256_LEN+1]; - /* Filename to log it to */ - char *debugfile, *debugfile_base; - - /* Get the hash for logging purposes anyway */ - len = strlen(desc); - if (crypto_digest256((char *)digest_sha256, desc, len, - DIGEST_SHA256) < 0) { - log_info(LD_DIR, - "Unable to parse descriptor of type %s, and unable to even hash" - " it!", type); - goto err; - } - - base16_encode(digest_sha256_hex, sizeof(digest_sha256_hex), - (const char *)digest_sha256, sizeof(digest_sha256)); - - /* - * We mention type and hash in the main log; don't clutter up the files - * with anything but the exact dump. - */ - tor_asprintf(&debugfile_base, - DESC_DUMP_BASE_FILENAME ".%s", digest_sha256_hex); - debugfile = get_datadir_fname2(DESC_DUMP_DATADIR_SUBDIR, debugfile_base); - - /* - * Check if the sandbox is active or will become active; see comment - * below at the log message for why. - */ - if (!(sandbox_is_active() || get_options()->Sandbox)) { - if (len <= get_options()->MaxUnparseableDescSizeToLog) { - if (!dump_desc_fifo_bump_hash(digest_sha256)) { - /* Create the directory if needed */ - dump_desc_create_dir(); - /* Make sure we've got it */ - if (have_dump_desc_dir && !problem_with_dump_desc_dir) { - /* Write it, and tell the main log about it */ - write_str_to_file(debugfile, desc, 1); - log_info(LD_DIR, - "Unable to parse descriptor of type %s with hash %s and " - "length %lu. See file %s in data directory for details.", - type, digest_sha256_hex, (unsigned long)len, - debugfile_base); - dump_desc_fifo_add_and_clean(debugfile, digest_sha256, len); - /* Since we handed ownership over, don't free debugfile later */ - debugfile = NULL; - } else { - /* Problem with the subdirectory */ - log_info(LD_DIR, - "Unable to parse descriptor of type %s with hash %s and " - "length %lu. Descriptor not dumped because we had a " - "problem creating the " DESC_DUMP_DATADIR_SUBDIR - " subdirectory", - type, digest_sha256_hex, (unsigned long)len); - /* We do have to free debugfile in this case */ - } - } else { - /* We already had one with this hash dumped */ - log_info(LD_DIR, - "Unable to parse descriptor of type %s with hash %s and " - "length %lu. Descriptor not dumped because one with that " - "hash has already been dumped.", - type, digest_sha256_hex, (unsigned long)len); - /* We do have to free debugfile in this case */ - } - } else { - /* Just log that it happened without dumping */ - log_info(LD_DIR, - "Unable to parse descriptor of type %s with hash %s and " - "length %lu. Descriptor not dumped because it exceeds maximum" - " log size all by itself.", - type, digest_sha256_hex, (unsigned long)len); - /* We do have to free debugfile in this case */ - } - } else { - /* - * Not logging because the sandbox is active and seccomp2 apparently - * doesn't have a sensible way to allow filenames according to a pattern - * match. (If we ever figure out how to say "allow writes to /regex/", - * remove this checK). - */ - log_info(LD_DIR, - "Unable to parse descriptor of type %s with hash %s and " - "length %lu. Descriptor not dumped because the sandbox is " - "configured", - type, digest_sha256_hex, (unsigned long)len); + if (!last_desc_dumped || last_desc_dumped + 60 < now) { + char *debugfile = get_datadir_fname("unparseable-desc"); + size_t filelen = 50 + strlen(type) + strlen(desc); + char *content = tor_malloc_zero(filelen); + tor_snprintf(content, filelen, "Unable to parse descriptor of type " + "%s:\n%s", type, desc); + write_str_to_file(debugfile, content, 0); + log_info(LD_DIR, "Unable to parse descriptor of type %s. See file " + "unparseable-desc in data directory for details.", type); + tor_free(content); + tor_free(debugfile); + last_desc_dumped = now; } - - tor_free(debugfile_base); - tor_free(debugfile); - - err: - return; } /** Set digest to the SHA-1 digest of the hash of the directory in @@ -989,45 +603,21 @@ router_get_router_hash(const char *s, size_t s_len, char *digest) DIGEST_SHA1); } -/** Try to find the start and end of the signed portion of a networkstatus - * document in s. On success, set start_out to the first - * character of the document, and end_out to a position one after the - * final character of the signed document, and return 0. On failure, return - * -1. */ -int -router_get_networkstatus_v3_signed_boundaries(const char *s, - const char **start_out, - const char **end_out) -{ - return router_get_hash_impl_helper(s, strlen(s), - "network-status-version", - "\ndirectory-signature", - ' ', LOG_INFO, - start_out, end_out); -} - -/** Set digest_out to the SHA3-256 digest of the signed portion of the - * networkstatus vote in s -- or of the entirety of s if no - * signed portion can be identified. Return 0 on success, -1 on failure. */ +/** Set digest to the SHA-1 digest of the hash of the running-routers + * string in s. Return 0 on success, -1 on failure. + */ int -router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out, - const char *s) +router_get_runningrouters_hash(const char *s, char *digest) { - const char *start, *end; - if (router_get_networkstatus_v3_signed_boundaries(s, &start, &end) < 0) { - start = s; - end = s + strlen(s); - } - tor_assert(start); - tor_assert(end); - return crypto_digest256((char*)digest_out, start, end-start, - DIGEST_SHA3_256); + return router_get_hash_impl(s, strlen(s), digest, + "network-status","\ndirectory-signature", '\n', + DIGEST_SHA1); } /** Set digests to all the digests of the consensus document in * s */ int -router_get_networkstatus_v3_hashes(const char *s, common_digests_t *digests) +router_get_networkstatus_v3_hashes(const char *s, digests_t *digests) { return router_get_hashes_impl(s,strlen(s),digests, "network-status-version", @@ -1053,7 +643,7 @@ router_get_extrainfo_hash(const char *s, size_t s_len, char *digest) char * router_get_dirobj_signature(const char *digest, size_t digest_len, - const crypto_pk_t *private_key) + crypto_pk_t *private_key) { char *signature; size_t i, keysize; @@ -1080,8 +670,7 @@ router_get_dirobj_signature(const char *digest, goto truncated; i = strlen(buf); - if (base64_encode(buf+i, buf_len-i, signature, siglen, - BASE64_ENCODE_MULTILINE) < 0) { + if (base64_encode(buf+i, buf_len-i, signature, siglen) < 0) { log_warn(LD_BUG,"couldn't base64-encode signature"); goto err; } @@ -1102,7 +691,7 @@ router_get_dirobj_signature(const char *digest, /** Helper: used to generate signatures for routers, directories and * network-status objects. Given a digest in digest and a secret - * private_key, generate a PKCS1-padded signature, BASE64-encode it, + * private_key, generate an PKCS1-padded signature, BASE64-encode it, * surround it with -----BEGIN/END----- pairs, and write it to the * buf_len-byte buffer at buf. Return 0 on success, -1 on * failure. @@ -1125,7 +714,6 @@ router_append_dirobj_signature(char *buf, size_t buf_len, const char *digest, return -1; } memcpy(buf+s_len, sig, sig_len+1); - tor_free(sig); return 0; } @@ -1208,15 +796,28 @@ tor_version_is_obsolete(const char *myversion, const char *versionlist) return ret; } -MOCK_IMPL(STATIC int, -signed_digest_equals, (const uint8_t *d1, const uint8_t *d2, size_t len)) +/** Return true iff key is allowed to sign directories. + */ +static int +dir_signing_key_is_trusted(crypto_pk_t *key) { - return tor_memeq(d1, d2, len); + char digest[DIGEST_LEN]; + if (!key) return 0; + if (crypto_pk_get_digest(key, digest) < 0) { + log_warn(LD_DIR, "Error computing dir-signing-key digest"); + return 0; + } + if (!router_digest_is_trusted_dir(digest)) { + log_warn(LD_DIR, "Listed dir-signing-key is not trusted"); + return 0; + } + return 1; } /** Check whether the object body of the token in tok has a good - * signature for digest using key pkey. - * If CST_NO_CHECK_OBJTYPE is set, do not check + * signature for digest using key pkey. If + * CST_CHECK_AUTHORITY is set, make sure that pkey is the key of + * a directory authority. If CST_NO_CHECK_OBJTYPE is set, do not check * the object type of the signature object. Use doctype as the type of * the document when generating log messages. Return 0 on success, negative * on failure. @@ -1231,6 +832,7 @@ check_signature_token(const char *digest, { char *signed_digest; size_t keysize; + const int check_authority = (flags & CST_CHECK_AUTHORITY); const int check_objtype = ! (flags & CST_NO_CHECK_OBJTYPE); tor_assert(pkey); @@ -1238,6 +840,12 @@ check_signature_token(const char *digest, tor_assert(digest); tor_assert(doctype); + if (check_authority && !dir_signing_key_is_trusted(pkey)) { + log_warn(LD_DIR, "Key on %s did not come from an authority; rejecting", + doctype); + return -1; + } + if (check_objtype) { if (strcmp(tok->object_type, "SIGNATURE")) { log_warn(LD_DIR, "Bad object type on %s signature", doctype); @@ -1254,10 +862,9 @@ check_signature_token(const char *digest, tor_free(signed_digest); return -1; } - // log_debug(LD_DIR,"Signed %s hash starts %s", doctype, - // hex_str(signed_digest,4)); - if (! signed_digest_equals((const uint8_t *)digest, - (const uint8_t *)signed_digest, digest_len)) { +// log_debug(LD_DIR,"Signed %s hash starts %s", doctype, +// hex_str(signed_digest,4)); + if (tor_memneq(digest, signed_digest, digest_len)) { log_warn(LD_DIR, "Error reading %s: signature does not match.", doctype); tor_free(signed_digest); return -1; @@ -1314,9 +921,7 @@ find_start_of_next_router_or_extrainfo(const char **s_ptr, * descriptor in the signed_descriptor_body field of each routerinfo_t. If it * isn't SAVED_NOWHERE, remember the offset of each descriptor. * - * Returns 0 on success and -1 on failure. Adds a digest to - * invalid_digests_out for every entry that was unparseable or - * invalid. (This may cause duplicate entries.) + * Returns 0 on success and -1 on failure. */ int router_parse_list_from_string(const char **s, const char *eos, @@ -1324,12 +929,11 @@ router_parse_list_from_string(const char **s, const char *eos, saved_location_t saved_location, int want_extrainfo, int allow_annotations, - const char *prepend_annotations, - smartlist_t *invalid_digests_out) + const char *prepend_annotations) { routerinfo_t *router; extrainfo_t *extrainfo; - signed_descriptor_t *signed_desc = NULL; + signed_descriptor_t *signed_desc; void *elt; const char *end, *start; int have_extrainfo; @@ -1345,9 +949,6 @@ router_parse_list_from_string(const char **s, const char *eos, tor_assert(eos >= *s); while (1) { - char raw_digest[DIGEST_LEN]; - int have_raw_digest = 0; - int dl_again = 0; if (find_start_of_next_router_or_extrainfo(s, eos, &have_extrainfo) < 0) break; @@ -1364,20 +965,18 @@ router_parse_list_from_string(const char **s, const char *eos, if (have_extrainfo && want_extrainfo) { routerlist_t *rl = router_get_routerlist(); - have_raw_digest = router_get_extrainfo_hash(*s, end-*s, raw_digest) == 0; extrainfo = extrainfo_parse_entry_from_string(*s, end, saved_location != SAVED_IN_CACHE, - rl->identity_map, &dl_again); + rl->identity_map); if (extrainfo) { signed_desc = &extrainfo->cache_info; elt = extrainfo; } } else if (!have_extrainfo && !want_extrainfo) { - have_raw_digest = router_get_router_hash(*s, end-*s, raw_digest) == 0; router = router_parse_entry_from_string(*s, end, saved_location != SAVED_IN_CACHE, allow_annotations, - prepend_annotations, &dl_again); + prepend_annotations); if (router) { log_debug(LD_DIR, "Read router '%s', purpose '%s'", router_describe(router), @@ -1386,15 +985,11 @@ router_parse_list_from_string(const char **s, const char *eos, elt = router; } } - if (! elt && ! dl_again && have_raw_digest && invalid_digests_out) { - smartlist_add(invalid_digests_out, tor_memdup(raw_digest, DIGEST_LEN)); - } if (!elt) { *s = end; continue; } if (saved_location != SAVED_NOWHERE) { - tor_assert(signed_desc); signed_desc->saved_location = saved_location; signed_desc->saved_offset = *s - start; } @@ -1425,9 +1020,9 @@ dump_distinct_digest_count(int severity) verified_digests = digestmap_new(); tor_log(severity, LD_GENERAL, "%d *distinct* router digests verified", digestmap_size(verified_digests)); -#else /* !(defined(COUNT_DISTINCT_DIGESTS)) */ +#else (void)severity; /* suppress "unused parameter" warning */ -#endif /* defined(COUNT_DISTINCT_DIGESTS) */ +#endif } /** Try to find an IPv6 OR port in list of directory_token_t's @@ -1482,17 +1077,11 @@ find_single_ipv6_orport(const smartlist_t *list, * around when caching the router. * * Only one of allow_annotations and prepend_annotations may be set. - * - * If can_dl_again_out is provided, set *can_dl_again_out to 1 - * if it's okay to try to download a descriptor with this same digest again, - * and 0 if it isn't. (It might not be okay to download it again if part of - * the part covered by the digest is invalid.) */ routerinfo_t * router_parse_entry_from_string(const char *s, const char *end, int cache_copy, int allow_annotations, - const char *prepend_annotations, - int *can_dl_again_out) + const char *prepend_annotations) { routerinfo_t *router = NULL; char digest[128]; @@ -1503,10 +1092,6 @@ router_parse_entry_from_string(const char *s, const char *end, size_t prepend_len = prepend_annotations ? strlen(prepend_annotations) : 0; int ok = 1; memarea_t *area = NULL; - tor_cert_t *ntor_cc_cert = NULL; - /* Do not set this to '1' until we have parsed everything that we intend to - * parse that's covered by the hash. */ - int can_dl_again = 0; tor_assert(!allow_annotations || !prepend_annotations); @@ -1576,22 +1161,20 @@ router_parse_entry_from_string(const char *s, const char *end, } tok = find_by_keyword(tokens, K_ROUTER); - const int router_token_pos = smartlist_pos(tokens, tok); tor_assert(tok->n_args >= 5); router = tor_malloc_zero(sizeof(routerinfo_t)); - router->cert_expiration_time = TIME_MAX; router->cache_info.routerlist_index = -1; router->cache_info.annotations_len = s-start_of_annotations + prepend_len; router->cache_info.signed_descriptor_len = end-s; if (cache_copy) { size_t len = router->cache_info.signed_descriptor_len + router->cache_info.annotations_len; - char *signed_body = + char *cp = router->cache_info.signed_descriptor_body = tor_malloc(len+1); if (prepend_annotations) { - memcpy(signed_body, prepend_annotations, prepend_len); - signed_body += prepend_len; + memcpy(cp, prepend_annotations, prepend_len); + cp += prepend_len; } /* This assertion will always succeed. * len == signed_desc_len + annotations_len @@ -1599,9 +1182,9 @@ router_parse_entry_from_string(const char *s, const char *end, * == end-start_of_annotations + prepend_len * We already wrote prepend_len bytes into the buffer; now we're * writing end-start_of_annotations -NM. */ - tor_assert(signed_body+(end-start_of_annotations) == + tor_assert(cp+(end-start_of_annotations) == router->cache_info.signed_descriptor_body+len); - memcpy(signed_body, start_of_annotations, end-start_of_annotations); + memcpy(cp, start_of_annotations, end-start_of_annotations); router->cache_info.signed_descriptor_body[len] = '\0'; tor_assert(strlen(router->cache_info.signed_descriptor_body) == len); } @@ -1612,7 +1195,8 @@ router_parse_entry_from_string(const char *s, const char *end, log_warn(LD_DIR,"Router nickname is invalid"); goto err; } - if (!tor_inet_aton(tok->args[1], &in)) { + router->address = tor_strdup(tok->args[1]); + if (!tor_inet_aton(router->address, &in)) { log_warn(LD_DIR,"Router address is not an IP address."); goto err; } @@ -1711,179 +1295,12 @@ router_parse_entry_from_string(const char *s, const char *end, log_warn(LD_DIR, "Couldn't calculate key digest"); goto err; } - { - directory_token_t *ed_sig_tok, *ed_cert_tok, *cc_tap_tok, *cc_ntor_tok, - *master_key_tok; - ed_sig_tok = find_opt_by_keyword(tokens, K_ROUTER_SIG_ED25519); - ed_cert_tok = find_opt_by_keyword(tokens, K_IDENTITY_ED25519); - master_key_tok = find_opt_by_keyword(tokens, K_MASTER_KEY_ED25519); - cc_tap_tok = find_opt_by_keyword(tokens, K_ONION_KEY_CROSSCERT); - cc_ntor_tok = find_opt_by_keyword(tokens, K_NTOR_ONION_KEY_CROSSCERT); - int n_ed_toks = !!ed_sig_tok + !!ed_cert_tok + - !!cc_tap_tok + !!cc_ntor_tok; - if ((n_ed_toks != 0 && n_ed_toks != 4) || - (n_ed_toks == 4 && !router->onion_curve25519_pkey)) { - log_warn(LD_DIR, "Router descriptor with only partial ed25519/" - "cross-certification support"); - goto err; - } - if (master_key_tok && !ed_sig_tok) { - log_warn(LD_DIR, "Router descriptor has ed25519 master key but no " - "certificate"); - goto err; - } - if (ed_sig_tok) { - tor_assert(ed_cert_tok && cc_tap_tok && cc_ntor_tok); - const int ed_cert_token_pos = smartlist_pos(tokens, ed_cert_tok); - if (ed_cert_token_pos == -1 || router_token_pos == -1 || - (ed_cert_token_pos != router_token_pos + 1 && - ed_cert_token_pos != router_token_pos - 1)) { - log_warn(LD_DIR, "Ed25519 certificate in wrong position"); - goto err; - } - if (ed_sig_tok != smartlist_get(tokens, smartlist_len(tokens)-2)) { - log_warn(LD_DIR, "Ed25519 signature in wrong position"); - goto err; - } - if (strcmp(ed_cert_tok->object_type, "ED25519 CERT")) { - log_warn(LD_DIR, "Wrong object type on identity-ed25519 in decriptor"); - goto err; - } - if (strcmp(cc_ntor_tok->object_type, "ED25519 CERT")) { - log_warn(LD_DIR, "Wrong object type on ntor-onion-key-crosscert " - "in decriptor"); - goto err; - } - if (strcmp(cc_tap_tok->object_type, "CROSSCERT")) { - log_warn(LD_DIR, "Wrong object type on onion-key-crosscert " - "in decriptor"); - goto err; - } - if (strcmp(cc_ntor_tok->args[0], "0") && - strcmp(cc_ntor_tok->args[0], "1")) { - log_warn(LD_DIR, "Bad sign bit on ntor-onion-key-crosscert"); - goto err; - } - int ntor_cc_sign_bit = !strcmp(cc_ntor_tok->args[0], "1"); - - uint8_t d256[DIGEST256_LEN]; - const char *signed_start, *signed_end; - tor_cert_t *cert = tor_cert_parse( - (const uint8_t*)ed_cert_tok->object_body, - ed_cert_tok->object_size); - if (! cert) { - log_warn(LD_DIR, "Couldn't parse ed25519 cert"); - goto err; - } - /* makes sure it gets freed. */ - router->cache_info.signing_key_cert = cert; - - if (cert->cert_type != CERT_TYPE_ID_SIGNING || - ! cert->signing_key_included) { - log_warn(LD_DIR, "Invalid form for ed25519 cert"); - goto err; - } - - if (master_key_tok) { - /* This token is optional, but if it's present, it must match - * the signature in the signing cert, or supplant it. */ - tor_assert(master_key_tok->n_args >= 1); - ed25519_public_key_t pkey; - if (ed25519_public_from_base64(&pkey, master_key_tok->args[0])<0) { - log_warn(LD_DIR, "Can't parse ed25519 master key"); - goto err; - } - - if (fast_memneq(&cert->signing_key.pubkey, - pkey.pubkey, ED25519_PUBKEY_LEN)) { - log_warn(LD_DIR, "Ed25519 master key does not match " - "key in certificate"); - goto err; - } - } - ntor_cc_cert = tor_cert_parse((const uint8_t*)cc_ntor_tok->object_body, - cc_ntor_tok->object_size); - if (!ntor_cc_cert) { - log_warn(LD_DIR, "Couldn't parse ntor-onion-key-crosscert cert"); - goto err; - } - if (ntor_cc_cert->cert_type != CERT_TYPE_ONION_ID || - ! ed25519_pubkey_eq(&ntor_cc_cert->signed_key, &cert->signing_key)) { - log_warn(LD_DIR, "Invalid contents for ntor-onion-key-crosscert cert"); - goto err; - } - - ed25519_public_key_t ntor_cc_pk; - if (ed25519_public_key_from_curve25519_public_key(&ntor_cc_pk, - router->onion_curve25519_pkey, - ntor_cc_sign_bit)<0) { - log_warn(LD_DIR, "Error converting onion key to ed25519"); - goto err; - } - - if (router_get_hash_impl_helper(s, end-s, "router ", - "\nrouter-sig-ed25519", - ' ', LOG_WARN, - &signed_start, &signed_end) < 0) { - log_warn(LD_DIR, "Can't find ed25519-signed portion of descriptor"); - goto err; - } - crypto_digest_t *d = crypto_digest256_new(DIGEST_SHA256); - crypto_digest_add_bytes(d, ED_DESC_SIGNATURE_PREFIX, - strlen(ED_DESC_SIGNATURE_PREFIX)); - crypto_digest_add_bytes(d, signed_start, signed_end-signed_start); - crypto_digest_get_digest(d, (char*)d256, sizeof(d256)); - crypto_digest_free(d); - - ed25519_checkable_t check[3]; - int check_ok[3]; - time_t expires = TIME_MAX; - if (tor_cert_get_checkable_sig(&check[0], cert, NULL, &expires) < 0) { - log_err(LD_BUG, "Couldn't create 'checkable' for cert."); - goto err; - } - if (tor_cert_get_checkable_sig(&check[1], - ntor_cc_cert, &ntor_cc_pk, &expires) < 0) { - log_err(LD_BUG, "Couldn't create 'checkable' for ntor_cc_cert."); - goto err; - } - - if (ed25519_signature_from_base64(&check[2].signature, - ed_sig_tok->args[0])<0) { - log_warn(LD_DIR, "Couldn't decode ed25519 signature"); - goto err; - } - check[2].pubkey = &cert->signed_key; - check[2].msg = d256; - check[2].len = DIGEST256_LEN; - - if (ed25519_checksig_batch(check_ok, check, 3) < 0) { - log_warn(LD_DIR, "Incorrect ed25519 signature(s)"); - goto err; - } - - if (check_tap_onion_key_crosscert( - (const uint8_t*)cc_tap_tok->object_body, - (int)cc_tap_tok->object_size, - router->onion_pkey, - &cert->signing_key, - (const uint8_t*)router->cache_info.identity_digest)<0) { - log_warn(LD_DIR, "Incorrect TAP cross-verification"); - goto err; - } - - /* We check this before adding it to the routerlist. */ - router->cert_expiration_time = expires; - } - } - if ((tok = find_opt_by_keyword(tokens, K_FINGERPRINT))) { /* If there's a fingerprint line, it must match the identity digest. */ char d[DIGEST_LEN]; tor_assert(tok->n_args == 1); tor_strstrip(tok->args[0], " "); - if (base16_decode(d, DIGEST_LEN, - tok->args[0], strlen(tok->args[0])) != DIGEST_LEN) { + if (base16_decode(d, DIGEST_LEN, tok->args[0], strlen(tok->args[0]))) { log_warn(LD_DIR, "Couldn't decode router fingerprint %s", escaped(tok->args[0])); goto err; @@ -1899,10 +1316,6 @@ router_parse_entry_from_string(const char *s, const char *end, router->platform = tor_strdup(tok->args[0]); } - if ((tok = find_opt_by_keyword(tokens, K_PROTO))) { - router->protocol_list = tor_strdup(tok->args[0]); - } - if ((tok = find_opt_by_keyword(tokens, K_CONTACT))) { router->contact_info = tor_strdup(tok->args[0]); } @@ -1941,7 +1354,7 @@ router_parse_entry_from_string(const char *s, const char *end, } } - if (policy_is_reject_star(router->exit_policy, AF_INET, 1) && + if (policy_is_reject_star(router->exit_policy, AF_INET) && (!router->ipv6_exit_policy || short_policy_is_reject_star(router->ipv6_exit_policy))) router->policy_is_reject_star = 1; @@ -1955,7 +1368,7 @@ router_parse_entry_from_string(const char *s, const char *end, escaped(tok->args[i])); goto err; } - smartlist_add_strdup(router->declared_family, tok->args[i]); + smartlist_add(router->declared_family, tor_strdup(tok->args[i])); } } @@ -1968,54 +1381,37 @@ router_parse_entry_from_string(const char *s, const char *end, if ((tok = find_opt_by_keyword(tokens, K_EXTRA_INFO_DIGEST))) { tor_assert(tok->n_args >= 1); if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { - if (base16_decode(router->cache_info.extra_info_digest, DIGEST_LEN, - tok->args[0], HEX_DIGEST_LEN) != DIGEST_LEN) { - log_warn(LD_DIR,"Invalid extra info digest"); - } + base16_decode(router->cache_info.extra_info_digest, + DIGEST_LEN, tok->args[0], HEX_DIGEST_LEN); } else { log_warn(LD_DIR, "Invalid extra info digest %s", escaped(tok->args[0])); } - - if (tok->n_args >= 2) { - if (digest256_from_base64(router->cache_info.extra_info_digest256, - tok->args[1]) < 0) { - log_warn(LD_DIR, "Invalid extra info digest256 %s", - escaped(tok->args[1])); - } - } } if (find_opt_by_keyword(tokens, K_HIDDEN_SERVICE_DIR)) { router->wants_to_be_hs_dir = 1; } - /* This router accepts tunnelled directory requests via begindir if it has - * an open dirport or it included "tunnelled-dir-server". */ - if (find_opt_by_keyword(tokens, K_DIR_TUNNELLED) || router->dir_port > 0) { - router->supports_tunnelled_dir_requests = 1; - } - tok = find_by_keyword(tokens, K_ROUTER_SIGNATURE); + note_crypto_pk_op(VERIFY_RTR); #ifdef COUNT_DISTINCT_DIGESTS if (!verified_digests) verified_digests = digestmap_new(); digestmap_set(verified_digests, signed_digest, (void*)(uintptr_t)1); #endif + if (check_signature_token(digest, DIGEST_LEN, tok, router->identity_pkey, 0, + "router descriptor") < 0) + goto err; if (!router->or_port) { log_warn(LD_DIR,"or_port unreadable or 0. Failing."); goto err; } - /* We've checked everything that's covered by the hash. */ - can_dl_again = 1; - if (check_signature_token(digest, DIGEST_LEN, tok, router->identity_pkey, 0, - "router descriptor") < 0) - goto err; - if (!router->platform) { router->platform = tor_strdup(""); } + goto done; err: @@ -2023,7 +1419,6 @@ router_parse_entry_from_string(const char *s, const char *end, routerinfo_free(router); router = NULL; done: - tor_cert_free(ntor_cc_cert); if (tokens) { SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); @@ -2033,8 +1428,6 @@ router_parse_entry_from_string(const char *s, const char *end, DUMP_AREA(area, "routerinfo"); memarea_drop_all(area); } - if (can_dl_again_out) - *can_dl_again_out = can_dl_again; return router; } @@ -2043,16 +1436,10 @@ router_parse_entry_from_string(const char *s, const char *end, * cache_copy is true, make a copy of the extra-info document in the * cache_info fields of the result. If routermap is provided, use it * as a map from router identity to routerinfo_t when looking up signing keys. - * - * If can_dl_again_out is provided, set *can_dl_again_out to 1 - * if it's okay to try to download an extrainfo with this same digest again, - * and 0 if it isn't. (It might not be okay to download it again if part of - * the part covered by the digest is invalid.) */ extrainfo_t * extrainfo_parse_entry_from_string(const char *s, const char *end, - int cache_copy, struct digest_ri_map_t *routermap, - int *can_dl_again_out) + int cache_copy, struct digest_ri_map_t *routermap) { extrainfo_t *extrainfo = NULL; char digest[128]; @@ -2062,12 +1449,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, routerinfo_t *router = NULL; memarea_t *area = NULL; const char *s_dup = s; - /* Do not set this to '1' until we have parsed everything that we intend to - * parse that's covered by the hash. */ - int can_dl_again = 0; - - if (BUG(s == NULL)) - return NULL; if (!end) { end = s + strlen(s); @@ -2093,7 +1474,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, goto err; } - /* XXXX Accept this in position 1 too, and ed identity in position 0. */ tok = smartlist_get(tokens,0); if (tok->tp != K_EXTRA_INFO) { log_warn(LD_DIR,"Entry does not start with \"extra-info\""); @@ -2106,7 +1486,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, extrainfo->cache_info.signed_descriptor_body = tor_memdup_nulterm(s,end-s); extrainfo->cache_info.signed_descriptor_len = end-s; memcpy(extrainfo->cache_info.signed_descriptor_digest, digest, DIGEST_LEN); - crypto_digest256((char*)extrainfo->digest256, s, end-s, DIGEST_SHA256); tor_assert(tok->n_args >= 2); if (!is_legal_nickname(tok->args[0])) { @@ -2116,7 +1495,7 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, strlcpy(extrainfo->nickname, tok->args[0], sizeof(extrainfo->nickname)); if (strlen(tok->args[1]) != HEX_DIGEST_LEN || base16_decode(extrainfo->cache_info.identity_digest, DIGEST_LEN, - tok->args[1], HEX_DIGEST_LEN) != DIGEST_LEN) { + tok->args[1], HEX_DIGEST_LEN)) { log_warn(LD_DIR,"Invalid fingerprint %s on \"extra-info\"", escaped(tok->args[1])); goto err; @@ -2129,93 +1508,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, goto err; } - { - directory_token_t *ed_sig_tok, *ed_cert_tok; - ed_sig_tok = find_opt_by_keyword(tokens, K_ROUTER_SIG_ED25519); - ed_cert_tok = find_opt_by_keyword(tokens, K_IDENTITY_ED25519); - int n_ed_toks = !!ed_sig_tok + !!ed_cert_tok; - if (n_ed_toks != 0 && n_ed_toks != 2) { - log_warn(LD_DIR, "Router descriptor with only partial ed25519/" - "cross-certification support"); - goto err; - } - if (ed_sig_tok) { - tor_assert(ed_cert_tok); - const int ed_cert_token_pos = smartlist_pos(tokens, ed_cert_tok); - if (ed_cert_token_pos != 1) { - /* Accept this in position 0 XXXX */ - log_warn(LD_DIR, "Ed25519 certificate in wrong position"); - goto err; - } - if (ed_sig_tok != smartlist_get(tokens, smartlist_len(tokens)-2)) { - log_warn(LD_DIR, "Ed25519 signature in wrong position"); - goto err; - } - if (strcmp(ed_cert_tok->object_type, "ED25519 CERT")) { - log_warn(LD_DIR, "Wrong object type on identity-ed25519 in decriptor"); - goto err; - } - - uint8_t d256[DIGEST256_LEN]; - const char *signed_start, *signed_end; - tor_cert_t *cert = tor_cert_parse( - (const uint8_t*)ed_cert_tok->object_body, - ed_cert_tok->object_size); - if (! cert) { - log_warn(LD_DIR, "Couldn't parse ed25519 cert"); - goto err; - } - /* makes sure it gets freed. */ - extrainfo->cache_info.signing_key_cert = cert; - - if (cert->cert_type != CERT_TYPE_ID_SIGNING || - ! cert->signing_key_included) { - log_warn(LD_DIR, "Invalid form for ed25519 cert"); - goto err; - } - - if (router_get_hash_impl_helper(s, end-s, "extra-info ", - "\nrouter-sig-ed25519", - ' ', LOG_WARN, - &signed_start, &signed_end) < 0) { - log_warn(LD_DIR, "Can't find ed25519-signed portion of extrainfo"); - goto err; - } - crypto_digest_t *d = crypto_digest256_new(DIGEST_SHA256); - crypto_digest_add_bytes(d, ED_DESC_SIGNATURE_PREFIX, - strlen(ED_DESC_SIGNATURE_PREFIX)); - crypto_digest_add_bytes(d, signed_start, signed_end-signed_start); - crypto_digest_get_digest(d, (char*)d256, sizeof(d256)); - crypto_digest_free(d); - - ed25519_checkable_t check[2]; - int check_ok[2]; - if (tor_cert_get_checkable_sig(&check[0], cert, NULL, NULL) < 0) { - log_err(LD_BUG, "Couldn't create 'checkable' for cert."); - goto err; - } - - if (ed25519_signature_from_base64(&check[1].signature, - ed_sig_tok->args[0])<0) { - log_warn(LD_DIR, "Couldn't decode ed25519 signature"); - goto err; - } - check[1].pubkey = &cert->signed_key; - check[1].msg = d256; - check[1].len = DIGEST256_LEN; - - if (ed25519_checksig_batch(check_ok, check, 2) < 0) { - log_warn(LD_DIR, "Incorrect ed25519 signature(s)"); - goto err; - } - /* We don't check the certificate expiration time: checking that it - * matches the cert in the router descriptor is adequate. */ - } - } - - /* We've checked everything that's covered by the hash. */ - can_dl_again = 1; - if (routermap && (router = digestmap_get((digestmap_t*)routermap, extrainfo->cache_info.identity_digest))) { @@ -2230,6 +1522,7 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, } if (key) { + note_crypto_pk_op(VERIFY_RTR); if (check_signature_token(digest, DIGEST_LEN, tok, key, 0, "extra-info") < 0) goto err; @@ -2257,8 +1550,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, DUMP_AREA(area, "extrainfo"); memarea_drop_all(area); } - if (can_dl_again_out) - *can_dl_again_out = can_dl_again; return extrainfo; } @@ -2338,7 +1629,7 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string) tok = find_by_keyword(tokens, K_FINGERPRINT); tor_assert(tok->n_args); if (base16_decode(fp_declared, DIGEST_LEN, tok->args[0], - strlen(tok->args[0])) != DIGEST_LEN) { + strlen(tok->args[0]))) { log_warn(LD_DIR, "Couldn't decode key certificate fingerprint %s", escaped(tok->args[0])); goto err; @@ -2359,7 +1650,7 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string) struct in_addr in; char *address = NULL; tor_assert(tok->n_args); - /* XXX++ use some tor_addr parse function below instead. -RD */ + /* XXX024 use some tor_addr parse function below instead. -RD */ if (tor_addr_port_split(LOG_WARN, tok->args[0], &address, &cert->dir_port) < 0 || tor_inet_aton(address, &in) == 0) { @@ -2451,7 +1742,7 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string) * object (starting with "r " at the start of a line). If none is found, * return the start of the directory footer, or the next directory signature. * If none is found, return the end of the string. */ -static inline const char * +static INLINE const char * find_start_of_next_routerstatus(const char *s) { const char *eos, *footer, *sig; @@ -2473,63 +1764,6 @@ find_start_of_next_routerstatus(const char *s) return eos; } -/** Parse the GuardFraction string from a consensus or vote. - * - * If vote or vote_rs are set the document getting - * parsed is a vote routerstatus. Otherwise it's a consensus. This is - * the same semantic as in routerstatus_parse_entry_from_string(). */ -STATIC int -routerstatus_parse_guardfraction(const char *guardfraction_str, - networkstatus_t *vote, - vote_routerstatus_t *vote_rs, - routerstatus_t *rs) -{ - int ok; - const char *end_of_header = NULL; - int is_consensus = !vote_rs; - uint32_t guardfraction; - - tor_assert(bool_eq(vote, vote_rs)); - - /* If this info comes from a consensus, but we should't apply - guardfraction, just exit. */ - if (is_consensus && !should_apply_guardfraction(NULL)) { - return 0; - } - - end_of_header = strchr(guardfraction_str, '='); - if (!end_of_header) { - return -1; - } - - guardfraction = (uint32_t)tor_parse_ulong(end_of_header+1, - 10, 0, 100, &ok, NULL); - if (!ok) { - log_warn(LD_DIR, "Invalid GuardFraction %s", escaped(guardfraction_str)); - return -1; - } - - log_debug(LD_GENERAL, "[*] Parsed %s guardfraction '%s' for '%s'.", - is_consensus ? "consensus" : "vote", - guardfraction_str, rs->nickname); - - if (!is_consensus) { /* We are parsing a vote */ - vote_rs->status.guardfraction_percentage = guardfraction; - vote_rs->status.has_guardfraction = 1; - } else { - /* We are parsing a consensus. Only apply guardfraction to guards. */ - if (rs->is_possible_guard) { - rs->guardfraction_percentage = guardfraction; - rs->has_guardfraction = 1; - } else { - log_warn(LD_BUG, "Got GuardFraction for non-guard %s. " - "This is not supposed to happen. Not applying. ", rs->nickname); - } - } - - return 0; -} - /** Given a string at *s, containing a routerstatus object, and an * empty smartlist at tokens, parse and return the first router status * object in the string, and advance *s to just after the end of the @@ -2544,7 +1778,7 @@ routerstatus_parse_guardfraction(const char *guardfraction_str, * * Parse according to the syntax used by the consensus flavor flav. **/ -STATIC routerstatus_t * +static routerstatus_t * routerstatus_parse_entry_from_string(memarea_t *area, const char **s, smartlist_t *tokens, networkstatus_t *vote, @@ -2583,7 +1817,7 @@ routerstatus_parse_entry_from_string(memarea_t *area, goto err; } } else if (flav == FLAV_MICRODESC) { - offset = -1; /* There is no descriptor digest in an md consensus r line */ + offset = -1; /* There is no identity digest */ } if (vote_rs) { @@ -2658,7 +1892,6 @@ routerstatus_parse_entry_from_string(memarea_t *area, } } } else if (tok) { - /* This is a consensus, not a vote. */ int i; for (i=0; i < tok->n_args; ++i) { if (!strcmp(tok->args[i], "Exit")) @@ -2677,6 +1910,8 @@ routerstatus_parse_entry_from_string(memarea_t *area, rs->is_possible_guard = 1; else if (!strcmp(tok->args[i], "BadExit")) rs->is_bad_exit = 1; + else if (!strcmp(tok->args[i], "BadDirectory")) + rs->is_bad_directory = 1; else if (!strcmp(tok->args[i], "Authority")) rs->is_authority = 1; else if (!strcmp(tok->args[i], "Unnamed") && @@ -2685,50 +1920,22 @@ routerstatus_parse_entry_from_string(memarea_t *area, rs->is_unnamed = 1; } else if (!strcmp(tok->args[i], "HSDir")) { rs->is_hs_dir = 1; - } else if (!strcmp(tok->args[i], "V2Dir")) { - rs->is_v2_dir = 1; } } - /* These are implied true by having been included in a consensus made - * with a given method */ - rs->is_flagged_running = 1; /* Starting with consensus method 4. */ - if (consensus_method >= MIN_METHOD_FOR_EXCLUDING_INVALID_NODES) - rs->is_valid = 1; - } - int found_protocol_list = 0; - if ((tok = find_opt_by_keyword(tokens, K_PROTO))) { - found_protocol_list = 1; - rs->protocols_known = 1; - rs->supports_extend2_cells = - protocol_list_supports_protocol(tok->args[0], PRT_RELAY, 2); - rs->supports_ed25519_link_handshake_compat = - protocol_list_supports_protocol(tok->args[0], PRT_LINKAUTH, 3); - rs->supports_ed25519_link_handshake_any = - protocol_list_supports_protocol_or_later(tok->args[0], PRT_LINKAUTH, 3); - rs->supports_ed25519_hs_intro = - protocol_list_supports_protocol(tok->args[0], PRT_HSINTRO, 4); - rs->supports_v3_hsdir = - protocol_list_supports_protocol(tok->args[0], PRT_HSDIR, - PROTOVER_HSDIR_V3); - rs->supports_v3_rendezvous_point = - protocol_list_supports_protocol(tok->args[0], PRT_HSDIR, - PROTOVER_HS_RENDEZVOUS_POINT_V3); } if ((tok = find_opt_by_keyword(tokens, K_V))) { tor_assert(tok->n_args == 1); - if (!strcmpstart(tok->args[0], "Tor ") && !found_protocol_list) { - /* We only do version checks like this in the case where - * the version is a "Tor" version, and where there is no - * list of protocol versions that we should be looking at instead. */ - rs->supports_extend2_cells = + rs->version_known = 1; + if (strcmpstart(tok->args[0], "Tor ")) { + rs->version_supports_microdesc_cache = 1; + rs->version_supports_optimistic_data = 1; + } else { + rs->version_supports_microdesc_cache = + tor_version_supports_microdescriptors(tok->args[0]); + rs->version_supports_optimistic_data = + tor_version_as_new_as(tok->args[0], "0.2.3.1-alpha"); + rs->version_supports_extend2_cells = tor_version_as_new_as(tok->args[0], "0.2.4.8-alpha"); - rs->protocols_known = 1; - } - if (!strcmpstart(tok->args[0], "Tor ") && found_protocol_list) { - /* Bug #22447 forces us to filter on this version. */ - if (!tor_version_as_new_as(tok->args[0], "0.3.0.8")) { - rs->supports_v3_hsdir = 0; - } } if (vote_rs) { vote_rs->version = tor_strdup(tok->args[0]); @@ -2764,11 +1971,6 @@ routerstatus_parse_entry_from_string(memarea_t *area, vote->has_measured_bws = 1; } else if (!strcmpstart(tok->args[i], "Unmeasured=1")) { rs->bw_is_unmeasured = 1; - } else if (!strcmpstart(tok->args[i], "GuardFraction=")) { - if (routerstatus_parse_guardfraction(tok->args[i], - vote, vote_rs, rs) < 0) { - goto err; - } } } } @@ -2799,22 +2001,6 @@ routerstatus_parse_entry_from_string(memarea_t *area, line->microdesc_hash_line = tor_strdup(t->args[0]); vote_rs->microdesc = line; } - if (t->tp == K_ID) { - tor_assert(t->n_args >= 2); - if (!strcmp(t->args[0], "ed25519")) { - vote_rs->has_ed25519_listing = 1; - if (strcmp(t->args[1], "none") && - digest256_from_base64((char*)vote_rs->ed25519_id, - t->args[1])<0) { - log_warn(LD_DIR, "Bogus ed25519 key in networkstatus vote"); - goto err; - } - } - } - if (t->tp == K_PROTO) { - tor_assert(t->n_args == 1); - vote_rs->protocols = tor_strdup(t->args[0]); - } } SMARTLIST_FOREACH_END(t); } else if (flav == FLAV_MICRODESC) { tok = find_opt_by_keyword(tokens, K_M); @@ -2854,6 +2040,14 @@ routerstatus_parse_entry_from_string(memarea_t *area, return rs; } +/** Helper to sort a smartlist of pointers to routerstatus_t */ +int +compare_routerstatus_entries(const void **_a, const void **_b) +{ + const routerstatus_t *a = *_a, *b = *_b; + return fast_memcmp(a->identity_digest, b->identity_digest, DIGEST_LEN); +} + int compare_vote_routerstatus_entries(const void **_a, const void **_b) { @@ -2866,15 +2060,14 @@ compare_vote_routerstatus_entries(const void **_a, const void **_b) int networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method) { + int64_t weight_scale; int64_t G=0, M=0, E=0, D=0, T=0; double Wgg, Wgm, Wgd, Wmg, Wmm, Wme, Wmd, Weg, Wem, Wee, Wed; double Gtotal=0, Mtotal=0, Etotal=0; const char *casename = NULL; int valid = 1; - (void) consensus_method; - const int64_t weight_scale = networkstatus_get_weight_scale_param(ns); - tor_assert(weight_scale >= 1); + weight_scale = networkstatus_get_weight_scale_param(ns); Wgg = networkstatus_get_bw_weight(ns, "Wgg", -1); Wgm = networkstatus_get_bw_weight(ns, "Wgm", -1); Wgd = networkstatus_get_bw_weight(ns, "Wgd", -1); @@ -2936,7 +2129,7 @@ networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method) } Wgg /= weight_scale; - Wgm /= weight_scale; (void) Wgm; // unused from here on. + Wgm /= weight_scale; Wgd /= weight_scale; Wmg /= weight_scale; @@ -2944,16 +2137,20 @@ networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method) Wme /= weight_scale; Wmd /= weight_scale; - Weg /= weight_scale; (void) Weg; // unused from here on. - Wem /= weight_scale; (void) Wem; // unused from here on. + Weg /= weight_scale; + Wem /= weight_scale; Wee /= weight_scale; Wed /= weight_scale; // Then, gather G, M, E, D, T to determine case SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { int is_exit = 0; - /* Bug #2203: Don't count bad exits as exits for balancing */ - is_exit = rs->is_exit && !rs->is_bad_exit; + if (consensus_method >= MIN_METHOD_TO_CUT_BADEXIT_WEIGHT) { + /* Bug #2203: Don't count bad exits as exits for balancing */ + is_exit = rs->is_exit && !rs->is_bad_exit; + } else { + is_exit = rs->is_exit; + } if (rs->has_bandwidth) { T += rs->bandwidth_kb; if (is_exit && rs->is_possible_guard) { @@ -3255,134 +2452,6 @@ networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method) return valid; } -/** Parse and extract all SR commits from tokens and place them in - * ns. */ -static void -extract_shared_random_commits(networkstatus_t *ns, smartlist_t *tokens) -{ - smartlist_t *chunks = NULL; - - tor_assert(ns); - tor_assert(tokens); - /* Commits are only present in a vote. */ - tor_assert(ns->type == NS_TYPE_VOTE); - - ns->sr_info.commits = smartlist_new(); - - smartlist_t *commits = find_all_by_keyword(tokens, K_COMMIT); - /* It's normal that a vote might contain no commits even if it participates - * in the SR protocol. Don't treat it as an error. */ - if (commits == NULL) { - goto end; - } - - /* Parse the commit. We do NO validation of number of arguments or ordering - * for forward compatibility, it's the parse commit job to inform us if it's - * supported or not. */ - chunks = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(commits, directory_token_t *, tok) { - /* Extract all arguments and put them in the chunks list. */ - for (int i = 0; i < tok->n_args; i++) { - smartlist_add(chunks, tok->args[i]); - } - sr_commit_t *commit = sr_parse_commit(chunks); - smartlist_clear(chunks); - if (commit == NULL) { - /* Get voter identity so we can warn that this dirauth vote contains - * commit we can't parse. */ - networkstatus_voter_info_t *voter = smartlist_get(ns->voters, 0); - tor_assert(voter); - log_warn(LD_DIR, "SR: Unable to parse commit %s from vote of voter %s.", - escaped(tok->object_body), - hex_str(voter->identity_digest, - sizeof(voter->identity_digest))); - /* Commitment couldn't be parsed. Continue onto the next commit because - * this one could be unsupported for instance. */ - continue; - } - /* Add newly created commit object to the vote. */ - smartlist_add(ns->sr_info.commits, commit); - } SMARTLIST_FOREACH_END(tok); - - end: - smartlist_free(chunks); - smartlist_free(commits); -} - -/** Check if a shared random value of type srv_type is in - * tokens. If there is, parse it and set it to srv_out. Return - * -1 on failure, 0 on success. The resulting srv is allocated on the heap and - * it's the responsibility of the caller to free it. */ -static int -extract_one_srv(smartlist_t *tokens, directory_keyword srv_type, - sr_srv_t **srv_out) -{ - int ret = -1; - directory_token_t *tok; - sr_srv_t *srv = NULL; - smartlist_t *chunks; - - tor_assert(tokens); - - chunks = smartlist_new(); - tok = find_opt_by_keyword(tokens, srv_type); - if (!tok) { - /* That's fine, no SRV is allowed. */ - ret = 0; - goto end; - } - for (int i = 0; i < tok->n_args; i++) { - smartlist_add(chunks, tok->args[i]); - } - srv = sr_parse_srv(chunks); - if (srv == NULL) { - log_warn(LD_DIR, "SR: Unparseable SRV %s", escaped(tok->object_body)); - goto end; - } - /* All is good. */ - *srv_out = srv; - ret = 0; - end: - smartlist_free(chunks); - return ret; -} - -/** Extract any shared random values found in tokens and place them in - * the networkstatus ns. */ -static void -extract_shared_random_srvs(networkstatus_t *ns, smartlist_t *tokens) -{ - const char *voter_identity; - networkstatus_voter_info_t *voter; - - tor_assert(ns); - tor_assert(tokens); - /* Can be only one of them else code flow. */ - tor_assert(ns->type == NS_TYPE_VOTE || ns->type == NS_TYPE_CONSENSUS); - - if (ns->type == NS_TYPE_VOTE) { - voter = smartlist_get(ns->voters, 0); - tor_assert(voter); - voter_identity = hex_str(voter->identity_digest, - sizeof(voter->identity_digest)); - } else { - /* Consensus has multiple voters so no specific voter. */ - voter_identity = "consensus"; - } - - /* We extract both, and on error everything is stopped because it means - * the vote is malformed for the shared random value(s). */ - if (extract_one_srv(tokens, K_PREVIOUS_SRV, &ns->sr_info.previous_srv) < 0) { - log_warn(LD_DIR, "SR: Unable to parse previous SRV from %s", - voter_identity); - /* Maybe we have a chance with the current SRV so let's try it anyway. */ - } - if (extract_one_srv(tokens, K_CURRENT_SRV, &ns->sr_info.current_srv) < 0) { - log_warn(LD_DIR, "SR: Unable to parse current SRV from %s", - voter_identity); - } -} - /** Parse a v3 networkstatus vote, opinion, or consensus (depending on * ns_type), from s, and return the result. Return NULL on failure. */ networkstatus_t * @@ -3393,10 +2462,10 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, smartlist_t *rs_tokens = NULL, *footer_tokens = NULL; networkstatus_voter_info_t *voter = NULL; networkstatus_t *ns = NULL; - common_digests_t ns_digests; - uint8_t sha3_as_signed[DIGEST256_LEN]; + digests_t ns_digests; const char *cert, *end_of_header, *end_of_footer, *s_dup = s; directory_token_t *tok; + int ok; struct in_addr in; int i, inorder, n_signatures = 0; memarea_t *area = NULL, *rs_area = NULL; @@ -3408,8 +2477,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, if (eos_out) *eos_out = NULL; - if (router_get_networkstatus_v3_hashes(s, &ns_digests) || - router_get_networkstatus_v3_sha3_as_signed(sha3_as_signed, s)<0) { + if (router_get_networkstatus_v3_hashes(s, &ns_digests)) { log_warn(LD_DIR, "Unable to compute digest of network-status"); goto err; } @@ -3420,13 +2488,12 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, (ns_type == NS_TYPE_CONSENSUS) ? networkstatus_consensus_token_table : networkstatus_token_table, 0)) { - log_warn(LD_DIR, "Error tokenizing network-status header"); + log_warn(LD_DIR, "Error tokenizing network-status vote header"); goto err; } ns = tor_malloc_zero(sizeof(networkstatus_t)); memcpy(&ns->digests, &ns_digests, sizeof(ns_digests)); - memcpy(&ns->digest_sha3_as_signed, sha3_as_signed, sizeof(sha3_as_signed)); tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION); tor_assert(tok); @@ -3481,32 +2548,22 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, tok = find_opt_by_keyword(tokens, K_CONSENSUS_METHODS); if (tok) { for (i=0; i < tok->n_args; ++i) - smartlist_add_strdup(ns->supported_methods, tok->args[i]); + smartlist_add(ns->supported_methods, tor_strdup(tok->args[i])); } else { - smartlist_add_strdup(ns->supported_methods, "1"); + smartlist_add(ns->supported_methods, tor_strdup("1")); } } else { tok = find_opt_by_keyword(tokens, K_CONSENSUS_METHOD); if (tok) { - int num_ok; ns->consensus_method = (int)tor_parse_long(tok->args[0], 10, 1, INT_MAX, - &num_ok, NULL); - if (!num_ok) + &ok, NULL); + if (!ok) goto err; } else { ns->consensus_method = 1; } } - if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_CLIENT_PROTOCOLS))) - ns->recommended_client_protocols = tor_strdup(tok->args[0]); - if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_RELAY_PROTOCOLS))) - ns->recommended_relay_protocols = tor_strdup(tok->args[0]); - if ((tok = find_opt_by_keyword(tokens, K_REQUIRED_CLIENT_PROTOCOLS))) - ns->required_client_protocols = tor_strdup(tok->args[0]); - if ((tok = find_opt_by_keyword(tokens, K_REQUIRED_RELAY_PROTOCOLS))) - ns->required_relay_protocols = tor_strdup(tok->args[0]); - tok = find_by_keyword(tokens, K_VALID_AFTER); if (parse_iso_time(tok->args[0], &ns->valid_after)) goto err; @@ -3521,26 +2578,19 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, tok = find_by_keyword(tokens, K_VOTING_DELAY); tor_assert(tok->n_args >= 2); - { - int ok; - ns->vote_seconds = - (int) tor_parse_long(tok->args[0], 10, 0, INT_MAX, &ok, NULL); - if (!ok) - goto err; - ns->dist_seconds = - (int) tor_parse_long(tok->args[1], 10, 0, INT_MAX, &ok, NULL); - if (!ok) - goto err; - } - if (ns->valid_after + - (get_options()->TestingTorNetwork ? - MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) > ns->fresh_until) { + ns->vote_seconds = + (int) tor_parse_long(tok->args[0], 10, 0, INT_MAX, &ok, NULL); + if (!ok) + goto err; + ns->dist_seconds = + (int) tor_parse_long(tok->args[1], 10, 0, INT_MAX, &ok, NULL); + if (!ok) + goto err; + if (ns->valid_after + MIN_VOTE_INTERVAL > ns->fresh_until) { log_warn(LD_DIR, "Vote/consensus freshness interval is too short"); goto err; } - if (ns->valid_after + - (get_options()->TestingTorNetwork ? - MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL)*2 > ns->valid_until) { + if (ns->valid_after + MIN_VOTE_INTERVAL*2 > ns->valid_until) { log_warn(LD_DIR, "Vote/consensus liveness interval is too short"); goto err; } @@ -3560,21 +2610,11 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, ns->server_versions = tor_strdup(tok->args[0]); } - { - smartlist_t *package_lst = find_all_by_keyword(tokens, K_PACKAGE); - ns->package_lines = smartlist_new(); - if (package_lst) { - SMARTLIST_FOREACH(package_lst, directory_token_t *, t, - smartlist_add_strdup(ns->package_lines, t->args[0])); - } - smartlist_free(package_lst); - } - tok = find_by_keyword(tokens, K_KNOWN_FLAGS); ns->known_flags = smartlist_new(); inorder = 1; for (i = 0; i < tok->n_args; ++i) { - smartlist_add_strdup(ns->known_flags, tok->args[i]); + smartlist_add(ns->known_flags, tor_strdup(tok->args[i])); if (i>0 && strcmp(tok->args[i-1], tok->args[i])>= 0) { log_warn(LD_DIR, "%s >= %s", tok->args[i-1], tok->args[i]); inorder = 0; @@ -3626,7 +2666,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, } tor_free(last_kwd); last_kwd = tor_strndup(tok->args[i], eq_pos); - smartlist_add_strdup(ns->net_params, tok->args[i]); + smartlist_add(ns->net_params, tor_strdup(tok->args[i])); } if (!inorder) { log_warn(LD_DIR, "params not in order"); @@ -3655,10 +2695,9 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, voter->nickname = tor_strdup(tok->args[0]); if (strlen(tok->args[1]) != HEX_DIGEST_LEN || base16_decode(voter->identity_digest, sizeof(voter->identity_digest), - tok->args[1], HEX_DIGEST_LEN) - != sizeof(voter->identity_digest)) { + tok->args[1], HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding identity digest %s in " - "network-status document.", escaped(tok->args[1])); + "network-status vote.", escaped(tok->args[1])); goto err; } if (ns->type != NS_TYPE_CONSENSUS && @@ -3667,14 +2706,6 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, log_warn(LD_DIR,"Mismatch between identities in certificate and vote"); goto err; } - if (ns->type != NS_TYPE_CONSENSUS) { - if (authority_cert_is_blacklisted(ns->cert)) { - log_warn(LD_DIR, "Rejecting vote signature made with blacklisted " - "signing key %s", - hex_str(ns->cert->signing_key_digest, DIGEST_LEN)); - goto err; - } - } voter->address = tor_strdup(tok->args[2]); if (!tor_inet_aton(tok->args[3], &in)) { log_warn(LD_DIR, "Error decoding IP address %s in network-status.", @@ -3682,7 +2713,6 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, goto err; } voter->addr = ntohl(in.s_addr); - int ok; voter->dir_port = (uint16_t) tor_parse_long(tok->args[4], 10, 0, 65535, &ok, NULL); if (!ok) @@ -3706,8 +2736,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, } if (strlen(tok->args[0]) != HEX_DIGEST_LEN || base16_decode(voter->vote_digest, sizeof(voter->vote_digest), - tok->args[0], HEX_DIGEST_LEN) - != sizeof(voter->vote_digest)) { + tok->args[0], HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding vote digest %s in " "network-status consensus.", escaped(tok->args[0])); goto err; @@ -3719,7 +2748,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, voter = NULL; } if (smartlist_len(ns->voters) == 0) { - log_warn(LD_DIR, "Missing dir-source elements in a networkstatus."); + log_warn(LD_DIR, "Missing dir-source elements in a vote networkstatus."); goto err; } else if (ns->type != NS_TYPE_CONSENSUS && smartlist_len(ns->voters) != 1) { log_warn(LD_DIR, "Too many dir-source elements in a vote networkstatus."); @@ -3730,9 +2759,9 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, (tok = find_opt_by_keyword(tokens, K_LEGACY_DIR_KEY))) { int bad = 1; if (strlen(tok->args[0]) == HEX_DIGEST_LEN) { - networkstatus_voter_info_t *voter_0 = smartlist_get(ns->voters, 0); - if (base16_decode(voter_0->legacy_id_digest, DIGEST_LEN, - tok->args[0], HEX_DIGEST_LEN) != DIGEST_LEN) + networkstatus_voter_info_t *voter = smartlist_get(ns->voters, 0); + if (base16_decode(voter->legacy_id_digest, DIGEST_LEN, + tok->args[0], HEX_DIGEST_LEN)<0) bad = 1; else bad = 0; @@ -3743,22 +2772,6 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, } } - /* If this is a vote document, check if information about the shared - randomness protocol is included, and extract it. */ - if (ns->type == NS_TYPE_VOTE) { - /* Does this authority participates in the SR protocol? */ - tok = find_opt_by_keyword(tokens, K_SR_FLAG); - if (tok) { - ns->sr_info.participate = 1; - /* Get the SR commitments and reveals from the vote. */ - extract_shared_random_commits(ns, tokens); - } - } - /* For both a vote and consensus, extract the shared random values. */ - if (ns->type == NS_TYPE_VOTE || ns->type == NS_TYPE_CONSENSUS) { - extract_shared_random_srvs(ns, tokens); - } - /* Parse routerstatus lines. */ rs_tokens = smartlist_new(); rs_area = memarea_new(); @@ -3769,21 +2782,19 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, if (ns->type != NS_TYPE_CONSENSUS) { vote_routerstatus_t *rs = tor_malloc_zero(sizeof(vote_routerstatus_t)); if (routerstatus_parse_entry_from_string(rs_area, &s, rs_tokens, ns, - rs, 0, 0)) { + rs, 0, 0)) smartlist_add(ns->routerstatus_list, rs); - } else { - vote_routerstatus_free(rs); + else { + tor_free(rs->version); + tor_free(rs); } } else { routerstatus_t *rs; if ((rs = routerstatus_parse_entry_from_string(rs_area, &s, rs_tokens, NULL, NULL, ns->consensus_method, - flav))) { - /* Use exponential-backoff scheduling when downloading microdescs */ - rs->dl_status.backoff = DL_SCHED_RANDOM_EXPONENTIAL; + flav))) smartlist_add(ns->routerstatus_list, rs); - } } } for (i = 1; i < smartlist_len(ns->routerstatus_list); ++i) { @@ -3798,27 +2809,11 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, } if (fast_memcmp(rs1->identity_digest, rs2->identity_digest, DIGEST_LEN) >= 0) { - log_warn(LD_DIR, "Networkstatus entries not sorted by identity digest"); + log_warn(LD_DIR, "Vote networkstatus entries not sorted by identity " + "digest"); goto err; } } - if (ns_type != NS_TYPE_CONSENSUS) { - digest256map_t *ed_id_map = digest256map_new(); - SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, vote_routerstatus_t *, - vrs) { - if (! vrs->has_ed25519_listing || - tor_mem_is_zero((const char *)vrs->ed25519_id, DIGEST256_LEN)) - continue; - if (digest256map_get(ed_id_map, vrs->ed25519_id) != NULL) { - log_warn(LD_DIR, "Vote networkstatus ed25519 identities were not " - "unique"); - digest256map_free(ed_id_map, NULL); - goto err; - } - digest256map_set(ed_id_map, vrs->ed25519_id, (void*)1); - } SMARTLIST_FOREACH_END(vrs); - digest256map_free(ed_id_map, NULL); - } /* Parse footer; check signature. */ footer_tokens = smartlist_new(); @@ -3868,7 +2863,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i])); goto err; } - smartlist_add_strdup(ns->weight_params, tok->args[i]); + smartlist_add(ns->weight_params, tor_strdup(tok->args[i])); } } @@ -3909,15 +2904,14 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, if (strlen(id_hexdigest) != HEX_DIGEST_LEN || base16_decode(declared_identity, sizeof(declared_identity), - id_hexdigest, HEX_DIGEST_LEN) - != sizeof(declared_identity)) { + id_hexdigest, HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding declared identity %s in " - "network-status document.", escaped(id_hexdigest)); + "network-status vote.", escaped(id_hexdigest)); goto err; } if (!(v = networkstatus_get_voter_by_id(ns, declared_identity))) { - log_warn(LD_DIR, "ID on signature on network-status document does " - "not match any declared directory source."); + log_warn(LD_DIR, "ID on signature on network-status vote does not match " + "any declared directory source."); goto err; } sig = tor_malloc_zero(sizeof(document_signature_t)); @@ -3925,10 +2919,9 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, sig->alg = alg; if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || base16_decode(sig->signing_key_digest, sizeof(sig->signing_key_digest), - sk_hexdigest, HEX_DIGEST_LEN) - != sizeof(sig->signing_key_digest)) { + sk_hexdigest, HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding declared signing key digest %s in " - "network-status document.", escaped(sk_hexdigest)); + "network-status vote.", escaped(sk_hexdigest)); tor_free(sig); goto err; } @@ -3947,8 +2940,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, /* We already parsed a vote with this algorithm from this voter. Use the first one. */ log_fn(LOG_PROTOCOL_WARN, LD_DIR, "We received a networkstatus " - "that contains two signatures from the same voter with the same " - "algorithm. Ignoring the second signature."); + "that contains two votes from the same voter with the same " + "algorithm. Ignoring the second vote."); tor_free(sig); continue; } @@ -3956,7 +2949,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, if (ns->type != NS_TYPE_CONSENSUS) { if (check_signature_token(ns_digests.d[DIGEST_SHA1], DIGEST_LEN, tok, ns->cert->signing_key, 0, - "network-status document")) { + "network-status vote")) { tor_free(sig); goto err; } @@ -3975,7 +2968,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, } SMARTLIST_FOREACH_END(_tok); if (! n_signatures) { - log_warn(LD_DIR, "No signatures on networkstatus document."); + log_warn(LD_DIR, "No signatures on networkstatus vote."); goto err; } else if (ns->type == NS_TYPE_VOTE && n_signatures != 1) { log_warn(LD_DIR, "Received more than one signature on a " @@ -4026,16 +3019,15 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, return ns; } -/** Return the common_digests_t that holds the digests of the +/** Return the digests_t that holds the digests of the * flavor_name-flavored networkstatus according to the detached - * signatures document sigs, allocating a new common_digests_t as - * needed. */ -static common_digests_t * + * signatures document sigs, allocating a new digests_t as neeeded. */ +static digests_t * detached_get_digests(ns_detached_signatures_t *sigs, const char *flavor_name) { - common_digests_t *d = strmap_get(sigs->digests, flavor_name); + digests_t *d = strmap_get(sigs->digests, flavor_name); if (!d) { - d = tor_malloc_zero(sizeof(common_digests_t)); + d = tor_malloc_zero(sizeof(digests_t)); strmap_set(sigs->digests, flavor_name, d); } return d; @@ -4043,7 +3035,7 @@ detached_get_digests(ns_detached_signatures_t *sigs, const char *flavor_name) /** Return the list of signatures of the flavor_name-flavored * networkstatus according to the detached signatures document sigs, - * allocating a new common_digests_t as needed. */ + * allocating a new digests_t as neeeded. */ static smartlist_t * detached_get_signatures(ns_detached_signatures_t *sigs, const char *flavor_name) @@ -4065,7 +3057,7 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) * networkstatus_parse_vote_from_string(). */ directory_token_t *tok; memarea_t *area = NULL; - common_digests_t *digests; + digests_t *digests; smartlist_t *tokens = smartlist_new(); ns_detached_signatures_t *sigs = @@ -4089,7 +3081,7 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) digest_algorithm_t alg; const char *flavor; const char *hexdigest; - size_t expected_length, digest_length; + size_t expected_length; tok = _tok; @@ -4112,8 +3104,8 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) continue; } - digest_length = crypto_digest_algorithm_get_length(alg); - expected_length = digest_length * 2; /* hex encoding */ + expected_length = + (alg == DIGEST_SHA1) ? HEX_DIGEST_LEN : HEX_DIGEST256_LEN; if (strlen(hexdigest) != expected_length) { log_warn(LD_DIR, "Wrong length on consensus-digest in detached " @@ -4122,13 +3114,13 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) } digests = detached_get_digests(sigs, flavor); tor_assert(digests); - if (!tor_mem_is_zero(digests->d[alg], digest_length)) { + if (!tor_mem_is_zero(digests->d[alg], DIGEST256_LEN)) { log_warn(LD_DIR, "Multiple digests for %s with %s on detached " "signatures document", flavor, algname); continue; } - if (base16_decode(digests->d[alg], digest_length, - hexdigest, strlen(hexdigest)) != (int) digest_length) { + if (base16_decode(digests->d[alg], DIGEST256_LEN, + hexdigest, strlen(hexdigest)) < 0) { log_warn(LD_DIR, "Bad encoding on consensus-digest in detached " "networkstatus signatures"); goto err; @@ -4201,14 +3193,14 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) if (strlen(id_hexdigest) != HEX_DIGEST_LEN || base16_decode(id_digest, sizeof(id_digest), - id_hexdigest, HEX_DIGEST_LEN) != sizeof(id_digest)) { + id_hexdigest, HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding declared identity %s in " "network-status vote.", escaped(id_hexdigest)); goto err; } if (strlen(sk_hexdigest) != HEX_DIGEST_LEN || base16_decode(sk_digest, sizeof(sk_digest), - sk_hexdigest, HEX_DIGEST_LEN) != sizeof(sk_digest)) { + sk_hexdigest, HEX_DIGEST_LEN) < 0) { log_warn(LD_DIR, "Error decoding declared signing key digest %s in " "network-status vote.", escaped(sk_hexdigest)); goto err; @@ -4261,43 +3253,24 @@ networkstatus_parse_detached_signatures(const char *s, const char *eos) * assume_action is nonnegative, then insert its action (ADDR_POLICY_ACCEPT or * ADDR_POLICY_REJECT) for items that specify no action. * - * Returns NULL on policy errors. - * - * Set *malformed_list to true if the entire policy list should be - * discarded. Otherwise, set it to false, and only this item should be ignored - * on error - the rest of the policy list can continue to be processed and - * used. - * * The addr_policy_t returned by this function can have its address set to * AF_UNSPEC for '*'. Use policy_expand_unspec() to turn this into a pair * of AF_INET and AF_INET6 items. */ -MOCK_IMPL(addr_policy_t *, -router_parse_addr_policy_item_from_string,(const char *s, int assume_action, - int *malformed_list)) +addr_policy_t * +router_parse_addr_policy_item_from_string(const char *s, int assume_action) { directory_token_t *tok = NULL; const char *cp, *eos; - /* Longest possible policy is - * "accept6 [ffff:ffff:..255]/128:10000-65535", - * which contains a max-length IPv6 address, plus 26 characters. + /* Longest possible policy is "accept ffff:ffff:..255/ffff:...255:0-65535". * But note that there can be an arbitrary amount of space between the - * accept and the address:mask/port element. - * We don't need to multiply TOR_ADDR_BUF_LEN by 2, as there is only one - * IPv6 address. But making the buffer shorter might cause valid long lines, - * which parsed in previous versions, to fail to parse in new versions. - * (These lines would have to have excessive amounts of whitespace.) */ + * accept and the address:mask/port element. */ char line[TOR_ADDR_BUF_LEN*2 + 32]; addr_policy_t *r; memarea_t *area = NULL; - tor_assert(malformed_list); - *malformed_list = 0; - s = eat_whitespace(s); - /* We can only do assume_action on []-quoted IPv6, as "a" (accept) - * and ":" (port separator) are ambiguous */ - if ((*s == '*' || *s == '[' || TOR_ISDIGIT(*s)) && assume_action >= 0) { + if ((*s == '*' || TOR_ISDIGIT(*s)) && assume_action >= 0) { if (tor_snprintf(line, sizeof(line), "%s %s", assume_action == ADDR_POLICY_ACCEPT?"accept":"reject", s)<0) { log_warn(LD_DIR, "Policy %s is too long.", escaped(s)); @@ -4322,34 +3295,9 @@ router_parse_addr_policy_item_from_string,(const char *s, int assume_action, goto err; } - /* Use the extended interpretation of accept/reject *, - * expanding it into an IPv4 wildcard and an IPv6 wildcard. - * Also permit *4 and *6 for IPv4 and IPv6 only wildcards. */ r = router_parse_addr_policy(tok, TAPMP_EXTENDED_STAR); - if (!r) { - goto err; - } - - /* Ensure that accept6/reject6 fields are followed by IPv6 addresses. - * AF_UNSPEC addresses are only permitted on the accept/reject field type. - * Unlike descriptors, torrcs exit policy accept/reject can be followed by - * either an IPv4 or IPv6 address. */ - if ((tok->tp == K_ACCEPT6 || tok->tp == K_REJECT6) && - tor_addr_family(&r->addr) != AF_INET6) { - /* This is a non-fatal error, just ignore this one entry. */ - *malformed_list = 0; - log_warn(LD_DIR, "IPv4 address '%s' with accept6/reject6 field type in " - "exit policy. Ignoring, but continuing to parse rules. (Use " - "accept/reject with IPv4 addresses.)", - tok->n_args == 1 ? tok->args[0] : ""); - addr_policy_free(r); - r = NULL; - goto done; - } - goto done; err: - *malformed_list = 1; r = NULL; done: token_clear(tok); @@ -4366,27 +3314,19 @@ static int router_add_exit_policy(routerinfo_t *router, directory_token_t *tok) { addr_policy_t *newe; - /* Use the standard interpretation of accept/reject *, an IPv4 wildcard. */ newe = router_parse_addr_policy(tok, 0); if (!newe) return -1; if (! router->exit_policy) router->exit_policy = smartlist_new(); - /* Ensure that in descriptors, accept/reject fields are followed by - * IPv4 addresses, and accept6/reject6 fields are followed by - * IPv6 addresses. Unlike torrcs, descriptor exit policies do not permit - * accept/reject followed by IPv6. */ if (((tok->tp == K_ACCEPT6 || tok->tp == K_REJECT6) && tor_addr_family(&newe->addr) == AF_INET) || ((tok->tp == K_ACCEPT || tok->tp == K_REJECT) && tor_addr_family(&newe->addr) == AF_INET6)) { - /* There's nothing the user can do about other relays' descriptors, - * so we don't provide usage advice here. */ log_warn(LD_DIR, "Mismatch between field type and address type in exit " - "policy '%s'. Discarding entire router descriptor.", - tok->n_args == 1 ? tok->args[0] : ""); + "policy"); addr_policy_free(newe); return -1; } @@ -4396,11 +3336,8 @@ router_add_exit_policy(routerinfo_t *router, directory_token_t *tok) return 0; } -/** Given a K_ACCEPT[6] or K_REJECT[6] token and a router, create and return - * a new exit_policy_t corresponding to the token. If TAPMP_EXTENDED_STAR - * is set in fmt_flags, K_ACCEPT6 and K_REJECT6 tokens followed by * - * expand to IPv6-only policies, otherwise they expand to IPv4 and IPv6 - * policies */ +/** Given a K_ACCEPT or K_REJECT token and a router, create and return + * a new exit_policy_t corresponding to the token. */ static addr_policy_t * router_parse_addr_policy(directory_token_t *tok, unsigned fmt_flags) { @@ -4424,13 +3361,6 @@ router_parse_addr_policy(directory_token_t *tok, unsigned fmt_flags) else newe.policy_type = ADDR_POLICY_ACCEPT; - /* accept6/reject6 * produces an IPv6 wildcard address only. - * (accept/reject * produces rules for IPv4 and IPv6 wildcard addresses.) */ - if ((fmt_flags & TAPMP_EXTENDED_STAR) - && (tok->tp == K_ACCEPT6 || tok->tp == K_REJECT6)) { - fmt_flags |= TAPMP_STAR_IPV6_ONLY; - } - if (tor_addr_parse_mask_ports(arg, fmt_flags, &newe.addr, &newe.maskbits, &newe.prt_min, &newe.prt_max) < 0) { log_warn(LD_DIR,"Couldn't parse line %s. Dropping", escaped(arg)); @@ -4440,12 +3370,9 @@ router_parse_addr_policy(directory_token_t *tok, unsigned fmt_flags) return addr_policy_get_canonical_entry(&newe); } -/** Parse an exit policy line of the format "accept[6]/reject[6] private:...". +/** Parse an exit policy line of the format "accept/reject private:...". * This didn't exist until Tor 0.1.1.15, so nobody should generate it in * router descriptors until earlier versions are obsolete. - * - * accept/reject and accept6/reject6 private all produce rules for both - * IPv4 and IPv6 addresses. */ static addr_policy_t * router_parse_addr_policy_private(directory_token_t *tok) @@ -4475,13 +3402,6 @@ router_parse_addr_policy_private(directory_token_t *tok) result.prt_min = port_min; result.prt_max = port_max; - if (tok->tp == K_ACCEPT6 || tok->tp == K_REJECT6) { - log_warn(LD_GENERAL, - "'%s' expands into rules which apply to all private IPv4 and " - "IPv6 addresses. (Use accept/reject private:* for IPv4 and " - "IPv6.)", tok->n_args == 1 ? tok->args[0] : ""); - } - return addr_policy_get_canonical_entry(&result); } @@ -4497,6 +3417,445 @@ assert_addr_policy_ok(smartlist_t *lst) }); } +/* + * Low-level tokenizer for router descriptors and directories. + */ + +/** Free all resources allocated for tok */ +static void +token_clear(directory_token_t *tok) +{ + if (tok->key) + crypto_pk_free(tok->key); +} + +#define ALLOC_ZERO(sz) memarea_alloc_zero(area,sz) +#define ALLOC(sz) memarea_alloc(area,sz) +#define STRDUP(str) memarea_strdup(area,str) +#define STRNDUP(str,n) memarea_strndup(area,(str),(n)) + +#define RET_ERR(msg) \ + STMT_BEGIN \ + if (tok) token_clear(tok); \ + tok = ALLOC_ZERO(sizeof(directory_token_t)); \ + tok->tp = ERR_; \ + tok->error = STRDUP(msg); \ + goto done_tokenizing; \ + STMT_END + +/** Helper: make sure that the token tok with keyword kwd obeys + * the object syntax of o_syn. Allocate all storage in area. + * Return tok on success, or a new ERR_ token if the token didn't + * conform to the syntax we wanted. + **/ +static INLINE directory_token_t * +token_check_object(memarea_t *area, const char *kwd, + directory_token_t *tok, obj_syntax o_syn) +{ + char ebuf[128]; + switch (o_syn) { + case NO_OBJ: + /* No object is allowed for this token. */ + if (tok->object_body) { + tor_snprintf(ebuf, sizeof(ebuf), "Unexpected object for %s", kwd); + RET_ERR(ebuf); + } + if (tok->key) { + tor_snprintf(ebuf, sizeof(ebuf), "Unexpected public key for %s", kwd); + RET_ERR(ebuf); + } + break; + case NEED_OBJ: + /* There must be a (non-key) object. */ + if (!tok->object_body) { + tor_snprintf(ebuf, sizeof(ebuf), "Missing object for %s", kwd); + RET_ERR(ebuf); + } + break; + case NEED_KEY_1024: /* There must be a 1024-bit public key. */ + case NEED_SKEY_1024: /* There must be a 1024-bit private key. */ + if (tok->key && crypto_pk_num_bits(tok->key) != PK_BYTES*8) { + tor_snprintf(ebuf, sizeof(ebuf), "Wrong size on key for %s: %d bits", + kwd, crypto_pk_num_bits(tok->key)); + RET_ERR(ebuf); + } + /* fall through */ + case NEED_KEY: /* There must be some kind of key. */ + if (!tok->key) { + tor_snprintf(ebuf, sizeof(ebuf), "Missing public key for %s", kwd); + RET_ERR(ebuf); + } + if (o_syn != NEED_SKEY_1024) { + if (crypto_pk_key_is_private(tok->key)) { + tor_snprintf(ebuf, sizeof(ebuf), + "Private key given for %s, which wants a public key", kwd); + RET_ERR(ebuf); + } + } else { /* o_syn == NEED_SKEY_1024 */ + if (!crypto_pk_key_is_private(tok->key)) { + tor_snprintf(ebuf, sizeof(ebuf), + "Public key given for %s, which wants a private key", kwd); + RET_ERR(ebuf); + } + } + break; + case OBJ_OK: + /* Anything goes with this token. */ + break; + } + + done_tokenizing: + return tok; +} + +/** Helper: parse space-separated arguments from the string s ending at + * eol, and store them in the args field of tok. Store the + * number of parsed elements into the n_args field of tok. Allocate + * all storage in area. Return the number of arguments parsed, or + * return -1 if there was an insanely high number of arguments. */ +static INLINE int +get_token_arguments(memarea_t *area, directory_token_t *tok, + const char *s, const char *eol) +{ +/** Largest number of arguments we'll accept to any token, ever. */ +#define MAX_ARGS 512 + char *mem = memarea_strndup(area, s, eol-s); + char *cp = mem; + int j = 0; + char *args[MAX_ARGS]; + while (*cp) { + if (j == MAX_ARGS) + return -1; + args[j++] = cp; + cp = (char*)find_whitespace(cp); + if (!cp || !*cp) + break; /* End of the line. */ + *cp++ = '\0'; + cp = (char*)eat_whitespace(cp); + } + tok->n_args = j; + tok->args = memarea_memdup(area, args, j*sizeof(char*)); + return j; +#undef MAX_ARGS +} + +/** Helper function: read the next token from *s, advance *s to the end of the + * token, and return the parsed token. Parse *s according to the list + * of tokens in table. + */ +static directory_token_t * +get_next_token(memarea_t *area, + const char **s, const char *eos, token_rule_t *table) +{ + /** Reject any object at least this big; it is probably an overflow, an + * attack, a bug, or some other nonsense. */ +#define MAX_UNPARSED_OBJECT_SIZE (128*1024) + /** Reject any line at least this big; it is probably an overflow, an + * attack, a bug, or some other nonsense. */ +#define MAX_LINE_LENGTH (128*1024) + + const char *next, *eol, *obstart; + size_t obname_len; + int i; + directory_token_t *tok; + obj_syntax o_syn = NO_OBJ; + char ebuf[128]; + const char *kwd = ""; + + tor_assert(area); + tok = ALLOC_ZERO(sizeof(directory_token_t)); + tok->tp = ERR_; + + /* Set *s to first token, eol to end-of-line, next to after first token */ + *s = eat_whitespace_eos(*s, eos); /* eat multi-line whitespace */ + tor_assert(eos >= *s); + eol = memchr(*s, '\n', eos-*s); + if (!eol) + eol = eos; + if (eol - *s > MAX_LINE_LENGTH) { + RET_ERR("Line far too long"); + } + + next = find_whitespace_eos(*s, eol); + + if (!strcmp_len(*s, "opt", next-*s)) { + /* Skip past an "opt" at the start of the line. */ + *s = eat_whitespace_eos_no_nl(next, eol); + next = find_whitespace_eos(*s, eol); + } else if (*s == eos) { /* If no "opt", and end-of-line, line is invalid */ + RET_ERR("Unexpected EOF"); + } + + /* Search the table for the appropriate entry. (I tried a binary search + * instead, but it wasn't any faster.) */ + for (i = 0; table[i].t ; ++i) { + if (!strcmp_len(*s, table[i].t, next-*s)) { + /* We've found the keyword. */ + kwd = table[i].t; + tok->tp = table[i].v; + o_syn = table[i].os; + *s = eat_whitespace_eos_no_nl(next, eol); + /* We go ahead whether there are arguments or not, so that tok->args is + * always set if we want arguments. */ + if (table[i].concat_args) { + /* The keyword takes the line as a single argument */ + tok->args = ALLOC(sizeof(char*)); + tok->args[0] = STRNDUP(*s,eol-*s); /* Grab everything on line */ + tok->n_args = 1; + } else { + /* This keyword takes multiple arguments. */ + if (get_token_arguments(area, tok, *s, eol)<0) { + tor_snprintf(ebuf, sizeof(ebuf),"Far too many arguments to %s", kwd); + RET_ERR(ebuf); + } + *s = eol; + } + if (tok->n_args < table[i].min_args) { + tor_snprintf(ebuf, sizeof(ebuf), "Too few arguments to %s", kwd); + RET_ERR(ebuf); + } else if (tok->n_args > table[i].max_args) { + tor_snprintf(ebuf, sizeof(ebuf), "Too many arguments to %s", kwd); + RET_ERR(ebuf); + } + break; + } + } + + if (tok->tp == ERR_) { + /* No keyword matched; call it an "K_opt" or "A_unrecognized" */ + if (**s == '@') + tok->tp = A_UNKNOWN_; + else + tok->tp = K_OPT; + tok->args = ALLOC(sizeof(char*)); + tok->args[0] = STRNDUP(*s, eol-*s); + tok->n_args = 1; + o_syn = OBJ_OK; + } + + /* Check whether there's an object present */ + *s = eat_whitespace_eos(eol, eos); /* Scan from end of first line */ + tor_assert(eos >= *s); + eol = memchr(*s, '\n', eos-*s); + if (!eol || eol-*s<11 || strcmpstart(*s, "-----BEGIN ")) /* No object. */ + goto check_object; + + obstart = *s; /* Set obstart to start of object spec */ + if (*s+16 >= eol || memchr(*s+11,'\0',eol-*s-16) || /* no short lines, */ + strcmp_len(eol-5, "-----", 5) || /* nuls or invalid endings */ + (eol-*s) > MAX_UNPARSED_OBJECT_SIZE) { /* name too long */ + RET_ERR("Malformed object: bad begin line"); + } + tok->object_type = STRNDUP(*s+11, eol-*s-16); + obname_len = eol-*s-16; /* store objname length here to avoid a strlen() */ + *s = eol+1; /* Set *s to possible start of object data (could be eos) */ + + /* Go to the end of the object */ + next = tor_memstr(*s, eos-*s, "-----END "); + if (!next) { + RET_ERR("Malformed object: missing object end line"); + } + tor_assert(eos >= next); + eol = memchr(next, '\n', eos-next); + if (!eol) /* end-of-line marker, or eos if there's no '\n' */ + eol = eos; + /* Validate the ending tag, which should be 9 + NAME + 5 + eol */ + if ((size_t)(eol-next) != 9+obname_len+5 || + strcmp_len(next+9, tok->object_type, obname_len) || + strcmp_len(eol-5, "-----", 5)) { + tor_snprintf(ebuf, sizeof(ebuf), "Malformed object: mismatched end tag %s", + tok->object_type); + ebuf[sizeof(ebuf)-1] = '\0'; + RET_ERR(ebuf); + } + if (next - *s > MAX_UNPARSED_OBJECT_SIZE) + RET_ERR("Couldn't parse object: missing footer or object much too big."); + + if (!strcmp(tok->object_type, "RSA PUBLIC KEY")) { /* If it's a public key */ + tok->key = crypto_pk_new(); + if (crypto_pk_read_public_key_from_string(tok->key, obstart, eol-obstart)) + RET_ERR("Couldn't parse public key."); + } else if (!strcmp(tok->object_type, "RSA PRIVATE KEY")) { /* private key */ + tok->key = crypto_pk_new(); + if (crypto_pk_read_private_key_from_string(tok->key, obstart, eol-obstart)) + RET_ERR("Couldn't parse private key."); + } else { /* If it's something else, try to base64-decode it */ + int r; + tok->object_body = ALLOC(next-*s); /* really, this is too much RAM. */ + r = base64_decode(tok->object_body, next-*s, *s, next-*s); + if (r<0) + RET_ERR("Malformed object: bad base64-encoded data"); + tok->object_size = r; + } + *s = eol; + + check_object: + tok = token_check_object(area, kwd, tok, o_syn); + + done_tokenizing: + return tok; + +#undef RET_ERR +#undef ALLOC +#undef ALLOC_ZERO +#undef STRDUP +#undef STRNDUP +} + +/** Read all tokens from a string between start and end, and add + * them to out. Parse according to the token rules in table. + * Caller must free tokens in out. If end is NULL, use the + * entire string. + */ +static int +tokenize_string(memarea_t *area, + const char *start, const char *end, smartlist_t *out, + token_rule_t *table, int flags) +{ + const char **s; + directory_token_t *tok = NULL; + int counts[NIL_]; + int i; + int first_nonannotation; + int prev_len = smartlist_len(out); + tor_assert(area); + + s = &start; + if (!end) { + end = start+strlen(start); + } else { + /* it's only meaningful to check for nuls if we got an end-of-string ptr */ + if (memchr(start, '\0', end-start)) { + log_warn(LD_DIR, "parse error: internal NUL character."); + return -1; + } + } + for (i = 0; i < NIL_; ++i) + counts[i] = 0; + + SMARTLIST_FOREACH(out, const directory_token_t *, t, ++counts[t->tp]); + + while (*s < end && (!tok || tok->tp != EOF_)) { + tok = get_next_token(area, s, end, table); + if (tok->tp == ERR_) { + log_warn(LD_DIR, "parse error: %s", tok->error); + token_clear(tok); + return -1; + } + ++counts[tok->tp]; + smartlist_add(out, tok); + *s = eat_whitespace_eos(*s, end); + } + + if (flags & TS_NOCHECK) + return 0; + + if ((flags & TS_ANNOTATIONS_OK)) { + first_nonannotation = -1; + for (i = 0; i < smartlist_len(out); ++i) { + tok = smartlist_get(out, i); + if (tok->tp < MIN_ANNOTATION || tok->tp > MAX_ANNOTATION) { + first_nonannotation = i; + break; + } + } + if (first_nonannotation < 0) { + log_warn(LD_DIR, "parse error: item contains only annotations"); + return -1; + } + for (i=first_nonannotation; i < smartlist_len(out); ++i) { + tok = smartlist_get(out, i); + if (tok->tp >= MIN_ANNOTATION && tok->tp <= MAX_ANNOTATION) { + log_warn(LD_DIR, "parse error: Annotations mixed with keywords"); + return -1; + } + } + if ((flags & TS_NO_NEW_ANNOTATIONS)) { + if (first_nonannotation != prev_len) { + log_warn(LD_DIR, "parse error: Unexpected annotations."); + return -1; + } + } + } else { + for (i=0; i < smartlist_len(out); ++i) { + tok = smartlist_get(out, i); + if (tok->tp >= MIN_ANNOTATION && tok->tp <= MAX_ANNOTATION) { + log_warn(LD_DIR, "parse error: no annotations allowed."); + return -1; + } + } + first_nonannotation = 0; + } + for (i = 0; table[i].t; ++i) { + if (counts[table[i].v] < table[i].min_cnt) { + log_warn(LD_DIR, "Parse error: missing %s element.", table[i].t); + return -1; + } + if (counts[table[i].v] > table[i].max_cnt) { + log_warn(LD_DIR, "Parse error: too many %s elements.", table[i].t); + return -1; + } + if (table[i].pos & AT_START) { + if (smartlist_len(out) < 1 || + (tok = smartlist_get(out, first_nonannotation))->tp != table[i].v) { + log_warn(LD_DIR, "Parse error: first item is not %s.", table[i].t); + return -1; + } + } + if (table[i].pos & AT_END) { + if (smartlist_len(out) < 1 || + (tok = smartlist_get(out, smartlist_len(out)-1))->tp != table[i].v) { + log_warn(LD_DIR, "Parse error: last item is not %s.", table[i].t); + return -1; + } + } + } + return 0; +} + +/** Find the first token in s whose keyword is keyword; return + * NULL if no such keyword is found. + */ +static directory_token_t * +find_opt_by_keyword(smartlist_t *s, directory_keyword keyword) +{ + SMARTLIST_FOREACH(s, directory_token_t *, t, if (t->tp == keyword) return t); + return NULL; +} + +/** Find the first token in s whose keyword is keyword; fail + * with an assert if no such keyword is found. + */ +static directory_token_t * +find_by_keyword_(smartlist_t *s, directory_keyword keyword, + const char *keyword_as_string) +{ + directory_token_t *tok = find_opt_by_keyword(s, keyword); + if (PREDICT_UNLIKELY(!tok)) { + log_err(LD_BUG, "Missing %s [%d] in directory object that should have " + "been validated. Internal error.", keyword_as_string, (int)keyword); + tor_assert(tok); + } + return tok; +} + +/** If there are any directory_token_t entries in s whose keyword is + * k, return a newly allocated smartlist_t containing all such entries, + * in the same order in which they occur in s. Otherwise return + * NULL. */ +static smartlist_t * +find_all_by_keyword(smartlist_t *s, directory_keyword k) +{ + smartlist_t *out = NULL; + SMARTLIST_FOREACH(s, directory_token_t *, t, + if (t->tp == k) { + if (!out) + out = smartlist_new(); + smartlist_add(out, t); + }); + return out; +} + /** Return a newly allocated smartlist of all accept or reject tokens in * s. */ @@ -4522,18 +3881,16 @@ static int router_get_hash_impl_helper(const char *s, size_t s_len, const char *start_str, const char *end_str, char end_c, - int log_severity, const char **start_out, const char **end_out) { const char *start, *end; start = tor_memstr(s, s_len, start_str); if (!start) { - log_fn(log_severity,LD_DIR, - "couldn't find start of hashed material \"%s\"",start_str); + log_warn(LD_DIR,"couldn't find start of hashed material \"%s\"",start_str); return -1; } if (start != s && *(start-1) != '\n') { - log_fn(log_severity,LD_DIR, + log_warn(LD_DIR, "first occurrence of \"%s\" is not at the start of a line", start_str); return -1; @@ -4541,14 +3898,12 @@ router_get_hash_impl_helper(const char *s, size_t s_len, end = tor_memstr(start+strlen(start_str), s_len - (start-s) - strlen(start_str), end_str); if (!end) { - log_fn(log_severity,LD_DIR, - "couldn't find end of hashed material \"%s\"",end_str); + log_warn(LD_DIR,"couldn't find end of hashed material \"%s\"",end_str); return -1; } end = memchr(end+strlen(end_str), end_c, s_len - (end-s) - strlen(end_str)); if (!end) { - log_fn(log_severity,LD_DIR, - "couldn't find EOL"); + log_warn(LD_DIR,"couldn't find EOL"); return -1; } ++end; @@ -4572,28 +3927,17 @@ router_get_hash_impl(const char *s, size_t s_len, char *digest, digest_algorithm_t alg) { const char *start=NULL, *end=NULL; - if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN, + if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c, &start,&end)<0) return -1; - return router_compute_hash_final(digest, start, end-start, alg); -} - -/** Compute the digest of the len-byte directory object at - * start, using alg. Store the result in digest, which - * must be long enough to hold it. */ -MOCK_IMPL(STATIC int, -router_compute_hash_final,(char *digest, - const char *start, size_t len, - digest_algorithm_t alg)) -{ if (alg == DIGEST_SHA1) { - if (crypto_digest(digest, start, len) < 0) { + if (crypto_digest(digest, start, end-start)) { log_warn(LD_BUG,"couldn't compute digest"); return -1; } } else { - if (crypto_digest256(digest, start, len, alg) < 0) { + if (crypto_digest256(digest, start, end-start, alg)) { log_warn(LD_BUG,"couldn't compute digest"); return -1; } @@ -4604,16 +3948,16 @@ router_compute_hash_final,(char *digest, /** As router_get_hash_impl, but compute all hashes. */ static int -router_get_hashes_impl(const char *s, size_t s_len, common_digests_t *digests, +router_get_hashes_impl(const char *s, size_t s_len, digests_t *digests, const char *start_str, const char *end_str, char end_c) { const char *start=NULL, *end=NULL; - if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN, + if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c, &start,&end)<0) return -1; - if (crypto_common_digests(digests, start, end-start)) { + if (crypto_digest_all(digests, start, end-start)) { log_warn(LD_BUG,"couldn't compute digests"); return -1; } @@ -4680,15 +4024,12 @@ find_start_of_next_microdesc(const char *s, const char *eos) * If saved_location isn't SAVED_IN_CACHE, make a local copy of each * descriptor in the body field of each microdesc_t. * - * Return all newly parsed microdescriptors in a newly allocated - * smartlist_t. If invalid_disgests_out is provided, add a SHA256 - * microdesc digest to it for every microdesc that we found to be badly - * formed. (This may cause duplicates) */ + * Return all newly + * parsed microdescriptors in a newly allocated smartlist_t. */ smartlist_t * microdescs_parse_from_string(const char *s, const char *eos, int allow_annotations, - saved_location_t where, - smartlist_t *invalid_digests_out) + saved_location_t where) { smartlist_t *tokens; smartlist_t *result; @@ -4710,20 +4051,21 @@ microdescs_parse_from_string(const char *s, const char *eos, tokens = smartlist_new(); while (s < eos) { - int okay = 0; - start_of_next_microdesc = find_start_of_next_microdesc(s, eos); if (!start_of_next_microdesc) start_of_next_microdesc = eos; + if (tokenize_string(area, s, start_of_next_microdesc, tokens, + microdesc_token_table, flags)) { + log_warn(LD_DIR, "Unparseable microdescriptor"); + goto next; + } + md = tor_malloc_zero(sizeof(microdesc_t)); { const char *cp = tor_memstr(s, start_of_next_microdesc-s, "onion-key"); - const int no_onion_key = (cp == NULL); - if (no_onion_key) { - cp = s; /* So that we have *some* junk to put in the body */ - } + tor_assert(cp); md->bodylen = start_of_next_microdesc - cp; md->saved_location = where; @@ -4732,17 +4074,6 @@ microdescs_parse_from_string(const char *s, const char *eos, else md->body = (char*)cp; md->off = cp - start; - crypto_digest256(md->digest, md->body, md->bodylen, DIGEST_SHA256); - if (no_onion_key) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Malformed or truncated descriptor"); - goto next; - } - } - - if (tokenize_string(area, s, start_of_next_microdesc, tokens, - microdesc_token_table, flags)) { - log_warn(LD_DIR, "Unparseable microdescriptor"); - goto next; } if ((tok = find_opt_by_keyword(tokens, A_LAST_LISTED))) { @@ -4772,28 +4103,6 @@ microdescs_parse_from_string(const char *s, const char *eos, tor_memdup(&k, sizeof(curve25519_public_key_t)); } - smartlist_t *id_lines = find_all_by_keyword(tokens, K_ID); - if (id_lines) { - SMARTLIST_FOREACH_BEGIN(id_lines, directory_token_t *, t) { - tor_assert(t->n_args >= 2); - if (!strcmp(t->args[0], "ed25519")) { - if (md->ed25519_identity_pkey) { - log_warn(LD_DIR, "Extra ed25519 key in microdesc"); - smartlist_free(id_lines); - goto next; - } - ed25519_public_key_t k; - if (ed25519_public_from_base64(&k, t->args[1])<0) { - log_warn(LD_DIR, "Bogus ed25519 key in microdesc"); - smartlist_free(id_lines); - goto next; - } - md->ed25519_identity_pkey = tor_memdup(&k, sizeof(k)); - } - } SMARTLIST_FOREACH_END(t); - smartlist_free(id_lines); - } - { smartlist_t *a_lines = find_all_by_keyword(tokens, K_A); if (a_lines) { @@ -4811,7 +4120,7 @@ microdescs_parse_from_string(const char *s, const char *eos, escaped(tok->args[i])); goto next; } - smartlist_add_strdup(md->family, tok->args[i]); + smartlist_add(md->family, tor_strdup(tok->args[i])); } } @@ -4822,78 +4131,32 @@ microdescs_parse_from_string(const char *s, const char *eos, md->ipv6_exit_policy = parse_short_policy(tok->args[0]); } + crypto_digest256(md->digest, md->body, md->bodylen, DIGEST_SHA256); + smartlist_add(result, md); - okay = 1; md = NULL; next: - if (! okay && invalid_digests_out) { - smartlist_add(invalid_digests_out, - tor_memdup(md->digest, DIGEST256_LEN)); - } microdesc_free(md); md = NULL; - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); memarea_clear(area); smartlist_clear(tokens); s = start_of_next_microdesc; } - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); memarea_drop_all(area); smartlist_free(tokens); return result; } -/** Extract a Tor version from a platform line from a router - * descriptor, and place the result in router_version. - * - * Return 1 on success, -1 on parsing failure, and 0 if the - * platform line does not indicate some version of Tor. - * - * If strict is non-zero, finding any weird version components - * (like negative numbers) counts as a parsing failure. - */ +/** Return true iff this Tor version can answer directory questions + * about microdescriptors. */ int -tor_version_parse_platform(const char *platform, - tor_version_t *router_version, - int strict) +tor_version_supports_microdescriptors(const char *platform) { - char tmp[128]; - char *s, *s2, *start; - - if (strcmpstart(platform,"Tor ")) /* nonstandard Tor; say 0. */ - return 0; - - start = (char *)eat_whitespace(platform+3); - if (!*start) return -1; - s = (char *)find_whitespace(start); /* also finds '\0', which is fine */ - s2 = (char*)eat_whitespace(s); - if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-")) - s = (char*)find_whitespace(s2); - - if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */ - return -1; - strlcpy(tmp, start, s-start+1); - - if (tor_version_parse(tmp, router_version)<0) { - log_info(LD_DIR,"Router version '%s' unparseable.",tmp); - return -1; - } - - if (strict) { - if (router_version->major < 0 || - router_version->minor < 0 || - router_version->micro < 0 || - router_version->patchlevel < 0 || - router_version->svn_revision < 0) { - return -1; - } - } - - return 1; + return tor_version_as_new_as(platform, "0.2.3.1-alpha"); } /** Parse the Tor version of the platform string platform, @@ -4904,21 +4167,32 @@ int tor_version_as_new_as(const char *platform, const char *cutoff) { tor_version_t cutoff_version, router_version; - int r; + char *s, *s2, *start; + char tmp[128]; + tor_assert(platform); if (tor_version_parse(cutoff, &cutoff_version)<0) { log_warn(LD_BUG,"cutoff version '%s' unparseable.",cutoff); return 0; } - - r = tor_version_parse_platform(platform, &router_version, 0); - if (r == 0) { - /* nonstandard Tor; be safe and say yes */ - return 1; - } else if (r < 0) { - /* unparseable version; be safe and say yes. */ + if (strcmpstart(platform,"Tor ")) /* nonstandard Tor; be safe and say yes */ return 1; + + start = (char *)eat_whitespace(platform+3); + if (!*start) return 0; + s = (char *)find_whitespace(start); /* also finds '\0', which is fine */ + s2 = (char*)eat_whitespace(s); + if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-")) + s = (char*)find_whitespace(s2); + + if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */ + return 0; + strlcpy(tmp, start, s-start+1); + + if (tor_version_parse(tmp, &router_version)<0) { + log_info(LD_DIR,"Router version '%s' unparseable.",tmp); + return 1; /* be safe and say yes */ } /* Here's why we don't need to do any special handling for svn revisions: @@ -4940,56 +4214,41 @@ tor_version_parse(const char *s, tor_version_t *out) { char *eos=NULL; const char *cp=NULL; - int ok = 1; /* Format is: - * "Tor " ? NUM dot NUM [ dot NUM [ ( pre | rc | dot ) NUM ] ] [ - tag ] + * "Tor " ? NUM dot NUM dot NUM [ ( pre | rc | dot ) NUM [ - tag ] ] */ tor_assert(s); tor_assert(out); memset(out, 0, sizeof(tor_version_t)); - out->status = VER_RELEASE; + if (!strcasecmpstart(s, "Tor ")) s += 4; - cp = s; - -#define NUMBER(m) \ - do { \ - if (!cp || *cp < '0' || *cp > '9') \ - return -1; \ - out->m = (int)tor_parse_uint64(cp, 10, 0, INT32_MAX, &ok, &eos); \ - if (!ok) \ - return -1; \ - if (!eos || eos == cp) \ - return -1; \ - cp = eos; \ - } while (0) - -#define DOT() \ - do { \ - if (*cp != '.') \ - return -1; \ - ++cp; \ - } while (0) - - NUMBER(major); - DOT(); - NUMBER(minor); - if (*cp == 0) + /* Get major. */ + out->major = (int)strtol(s,&eos,10); + if (!eos || eos==s || *eos != '.') return -1; + cp = eos+1; + + /* Get minor */ + out->minor = (int) strtol(cp,&eos,10); + if (!eos || eos==cp || *eos != '.') return -1; + cp = eos+1; + + /* Get micro */ + out->micro = (int) strtol(cp,&eos,10); + if (!eos || eos==cp) return -1; + if (!*eos) { + out->status = VER_RELEASE; + out->patchlevel = 0; return 0; - else if (*cp == '-') - goto status_tag; - DOT(); - NUMBER(micro); + } + cp = eos; /* Get status */ - if (*cp == 0) { - return 0; - } else if (*cp == '.') { + if (*cp == '.') { + out->status = VER_RELEASE; ++cp; - } else if (*cp == '-') { - goto status_tag; } else if (0==strncmp(cp, "pre", 3)) { out->status = VER_PRE; cp += 3; @@ -5000,9 +4259,11 @@ tor_version_parse(const char *s, tor_version_t *out) return -1; } - NUMBER(patchlevel); + /* Get patchlevel */ + out->patchlevel = (int) strtol(cp,&eos,10); + if (!eos || eos==cp) return -1; + cp = eos; - status_tag: /* Get status tag. */ if (*cp == '-' || *cp == '.') ++cp; @@ -5031,15 +4292,13 @@ tor_version_parse(const char *s, tor_version_t *out) memwipe(digest, 0, sizeof(digest)); if ( hexlen == 0 || (hexlen % 2) == 1) return -1; - if (base16_decode(digest, hexlen/2, cp, hexlen) != hexlen/2) + if (base16_decode(digest, hexlen/2, cp, hexlen)) return -1; memcpy(out->git_tag, digest, hexlen/2); out->git_tag_len = hexlen/2; } return 0; -#undef NUMBER -#undef DOT } /** Compare two tor versions; Return <0 if a < b; 0 if a ==b, >0 if a > @@ -5050,37 +4309,26 @@ tor_version_compare(tor_version_t *a, tor_version_t *b) int i; tor_assert(a); tor_assert(b); - - /* We take this approach to comparison to ensure the same (bogus!) behavior - * on all inputs as we would have seen before bug #21278 was fixed. The - * only important difference here is that this method doesn't cause - * a signed integer underflow. - */ -#define CMP(field) do { \ - unsigned aval = (unsigned) a->field; \ - unsigned bval = (unsigned) b->field; \ - int result = (int) (aval - bval); \ - if (result < 0) \ - return -1; \ - else if (result > 0) \ - return 1; \ - } while (0) - - CMP(major); - CMP(minor); - CMP(micro); - CMP(status); - CMP(patchlevel); - if ((i = strcmp(a->status_tag, b->status_tag))) - return i; - CMP(svn_revision); - CMP(git_tag_len); - if (a->git_tag_len) - return fast_memcmp(a->git_tag, b->git_tag, a->git_tag_len); + if ((i = a->major - b->major)) + return i; + else if ((i = a->minor - b->minor)) + return i; + else if ((i = a->micro - b->micro)) + return i; + else if ((i = a->status - b->status)) + return i; + else if ((i = a->patchlevel - b->patchlevel)) + return i; + else if ((i = strcmp(a->status_tag, b->status_tag))) + return i; + else if ((i = a->svn_revision - b->svn_revision)) + return i; + else if ((i = a->git_tag_len - b->git_tag_len)) + return i; + else if (a->git_tag_len) + return fast_memcmp(a->git_tag, b->git_tag, a->git_tag_len); else - return 0; - -#undef CMP + return 0; } /** Return true iff versions a and b belong to the same series. @@ -5138,9 +4386,6 @@ sort_version_list(smartlist_t *versions, int remove_duplicates) * to *encoded_size_out, and a pointer to the possibly next * descriptor to *next_out; return 0 for success (including validation) * and -1 for failure. - * - * If as_hsdir is 1, we're parsing this as an HSDir, and we should - * be strict about time formats. */ int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, @@ -5148,8 +4393,7 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char **intro_points_encrypted_out, size_t *intro_points_encrypted_size_out, size_t *encoded_size_out, - const char **next_out, const char *desc, - int as_hsdir) + const char **next_out, const char *desc) { rend_service_descriptor_t *result = tor_malloc_zero(sizeof(rend_service_descriptor_t)); @@ -5163,8 +4407,6 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char public_key_hash[DIGEST_LEN]; char test_desc_id[DIGEST_LEN]; memarea_t *area = NULL; - const int strict_time_fmt = as_hsdir; - tor_assert(desc); /* Check if desc starts correctly. */ if (strncmp(desc, "rendezvous-service-descriptor ", @@ -5187,7 +4429,7 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, eos = eos + 1; /* Check length. */ if (eos-desc > REND_DESC_MAX_SIZE) { - /* XXXX+ If we are parsing this descriptor as a server, this + /* XXX023 If we are parsing this descriptor as a server, this * should be a protocol warning. */ log_warn(LD_REND, "Descriptor length is %d which exceeds " "maximum rendezvous descriptor size of %d bytes.", @@ -5213,7 +4455,8 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, tok = find_by_keyword(tokens, R_RENDEZVOUS_SERVICE_DESCRIPTOR); tor_assert(tok == smartlist_get(tokens, 0)); tor_assert(tok->n_args == 1); - if (!rend_valid_descriptor_id(tok->args[0])) { + if (strlen(tok->args[0]) != REND_DESC_ID_V2_LEN_BASE32 || + strspn(tok->args[0], BASE32_CHARS) != REND_DESC_ID_V2_LEN_BASE32) { log_warn(LD_REND, "Invalid descriptor ID: '%s'", tok->args[0]); goto err; } @@ -5258,8 +4501,7 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, * descriptor. */ tok = find_by_keyword(tokens, R_PUBLICATION_TIME); tor_assert(tok->n_args == 1); - if (parse_iso_time_(tok->args[0], &result->timestamp, - strict_time_fmt, 0) < 0) { + if (parse_iso_time(tok->args[0], &result->timestamp) < 0) { log_warn(LD_REND, "Invalid publication time: '%s'", tok->args[0]); goto err; } @@ -5298,14 +4540,12 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, } /* Parse and verify signature. */ tok = find_by_keyword(tokens, R_SIGNATURE); + note_crypto_pk_op(VERIFY_RTR); if (check_signature_token(desc_hash, DIGEST_LEN, tok, result->pk, 0, "v2 rendezvous service descriptor") < 0) goto err; /* Verify that descriptor ID belongs to public key and secret ID part. */ - if (crypto_pk_get_digest(result->pk, public_key_hash) < 0) { - log_warn(LD_REND, "Unable to compute rend descriptor public key digest"); - goto err; - } + crypto_pk_get_digest(result->pk, public_key_hash); rend_get_descriptor_id_bytes(test_desc_id, public_key_hash, secret_id_part); if (tor_memneq(desc_id_out, test_desc_id, DIGEST_LEN)) { @@ -5387,7 +4627,7 @@ rend_decrypt_introduction_points(char **ipos_decrypted, crypto_cipher_free(cipher); len = ipos_encrypted_size - 2 - client_entries_len - CIPHER_IV_LEN; - dec = tor_malloc_zero(len + 1); + dec = tor_malloc(len); declen = crypto_cipher_decrypt_with_iv(session_key, dec, len, ipos_encrypted + 2 + client_entries_len, ipos_encrypted_size - 2 - client_entries_len); @@ -5419,7 +4659,7 @@ rend_decrypt_introduction_points(char **ipos_decrypted, "small."); return -1; } - dec = tor_malloc_zero(ipos_encrypted_size - CIPHER_IV_LEN - 1 + 1); + dec = tor_malloc_zero(ipos_encrypted_size - CIPHER_IV_LEN - 1); declen = crypto_cipher_decrypt_with_iv(descriptor_cookie, dec, ipos_encrypted_size - @@ -5452,7 +4692,7 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed, size_t intro_points_encoded_size) { const char *current_ipo, *end_of_intro_points; - smartlist_t *tokens = NULL; + smartlist_t *tokens; directory_token_t *tok; rend_intro_point_t *intro; extend_info_t *info; @@ -5461,10 +4701,8 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed, tor_assert(parsed); /** Function may only be invoked once. */ tor_assert(!parsed->intro_nodes); - if (!intro_points_encoded || intro_points_encoded_size == 0) { - log_warn(LD_REND, "Empty or zero size introduction point list"); - goto err; - } + tor_assert(intro_points_encoded); + tor_assert(intro_points_encoded_size > 0); /* Consider one intro point after the other. */ current_ipo = intro_points_encoded; end_of_intro_points = intro_points_encoded + intro_points_encoded_size; @@ -5568,10 +4806,8 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed, done: /* Free tokens and clear token list. */ - if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); - smartlist_free(tokens); - } + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_free(tokens); if (area) memarea_drop_all(area); @@ -5590,7 +4826,6 @@ rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) directory_token_t *tok; const char *current_entry = NULL; memarea_t *area = NULL; - char *err_msg = NULL; if (!ckstr || strlen(ckstr) == 0) return -1; tokens = smartlist_new(); @@ -5600,6 +4835,8 @@ rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) current_entry = eat_whitespace(ckstr); while (!strcmpstart(current_entry, "client-name ")) { rend_authorized_client_t *parsed_entry; + size_t len; + char descriptor_cookie_tmp[REND_DESC_COOKIE_LEN+2]; /* Determine end of string. */ const char *eos = strstr(current_entry, "\nclient-name "); if (!eos) @@ -5628,10 +4865,12 @@ rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) tor_assert(tok == smartlist_get(tokens, 0)); tor_assert(tok->n_args == 1); - if (!rend_valid_client_name(tok->args[0])) { + len = strlen(tok->args[0]); + if (len < 1 || len > 19 || + strspn(tok->args[0], REND_LEGAL_CLIENTNAME_CHARACTERS) != len) { log_warn(LD_CONFIG, "Illegal client name: %s. (Length must be " - "between 1 and %d, and valid characters are " - "[A-Za-z0-9+-_].)", tok->args[0], REND_CLIENTNAME_MAX_LEN); + "between 1 and 19, and valid characters are " + "[A-Za-z0-9+-_].)", tok->args[0]); goto err; } /* Check if client name is duplicate. */ @@ -5653,13 +4892,23 @@ rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) /* Parse descriptor cookie. */ tok = find_by_keyword(tokens, C_DESCRIPTOR_COOKIE); tor_assert(tok->n_args == 1); - if (rend_auth_decode_cookie(tok->args[0], parsed_entry->descriptor_cookie, - NULL, &err_msg) < 0) { - tor_assert(err_msg); - log_warn(LD_REND, "%s", err_msg); - tor_free(err_msg); + if (strlen(tok->args[0]) != REND_DESC_COOKIE_LEN_BASE64 + 2) { + log_warn(LD_REND, "Descriptor cookie has illegal length: %s", + escaped(tok->args[0])); + goto err; + } + /* The size of descriptor_cookie_tmp needs to be REND_DESC_COOKIE_LEN+2, + * because a base64 encoding of length 24 does not fit into 16 bytes in all + * cases. */ + if (base64_decode(descriptor_cookie_tmp, sizeof(descriptor_cookie_tmp), + tok->args[0], strlen(tok->args[0])) + != REND_DESC_COOKIE_LEN) { + log_warn(LD_REND, "Descriptor cookie contains illegal characters: " + "%s", escaped(tok->args[0])); goto err; } + memcpy(parsed_entry->descriptor_cookie, descriptor_cookie_tmp, + REND_DESC_COOKIE_LEN); } result = strmap_size(parsed_clients); goto done; @@ -5674,27 +4923,3 @@ rend_parse_client_keys(strmap_t *parsed_clients, const char *ckstr) return result; } -/** Called on startup; right now we just handle scanning the unparseable - * descriptor dumps, but hang anything else we might need to do in the - * future here as well. - */ -void -routerparse_init(void) -{ - /* - * Check both if the sandbox is active and whether it's configured; no - * point in loading all that if we won't be able to use it after the - * sandbox becomes active. - */ - if (!(sandbox_is_active() || get_options()->Sandbox)) { - dump_desc_init(); - } -} - -/** Clean up all data structures used by routerparse.c at exit */ -void -routerparse_free_all(void) -{ - dump_desc_fifo_cleanup(); -} - diff --git a/src/tor/src/or/routerparse.h b/src/tor/routerparse.h similarity index 55% rename from src/tor/src/or/routerparse.h rename to src/tor/routerparse.h index c4c8635f4..177217dc3 100644 --- a/src/tor/src/or/routerparse.h +++ b/src/tor/routerparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,18 +14,13 @@ int router_get_router_hash(const char *s, size_t s_len, char *digest); int router_get_dir_hash(const char *s, char *digest); -int router_get_networkstatus_v3_hashes(const char *s, - common_digests_t *digests); -int router_get_networkstatus_v3_signed_boundaries(const char *s, - const char **start_out, - const char **end_out); -int router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out, - const char *s); +int router_get_runningrouters_hash(const char *s, char *digest); +int router_get_networkstatus_v3_hashes(const char *s, digests_t *digests); int router_get_extrainfo_hash(const char *s, size_t s_len, char *digest); #define DIROBJ_MAX_SIG_LEN 256 char *router_get_dirobj_signature(const char *digest, size_t digest_len, - const crypto_pk_t *private_key); + crypto_pk_t *private_key); int router_append_dirobj_signature(char *buf, size_t buf_len, const char *digest, size_t digest_len, @@ -35,24 +30,19 @@ int router_parse_list_from_string(const char **s, const char *eos, saved_location_t saved_location, int is_extrainfo, int allow_annotations, - const char *prepend_annotations, - smartlist_t *invalid_digests_out); + const char *prepend_annotations); routerinfo_t *router_parse_entry_from_string(const char *s, const char *end, int cache_copy, int allow_annotations, - const char *prepend_annotations, - int *can_dl_again_out); + const char *prepend_annotations); extrainfo_t *extrainfo_parse_entry_from_string(const char *s, const char *end, - int cache_copy, struct digest_ri_map_t *routermap, - int *can_dl_again_out); -MOCK_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, - (const char *s, int assume_action, int *malformed_list)); + int cache_copy, struct digest_ri_map_t *routermap); +addr_policy_t *router_parse_addr_policy_item_from_string(const char *s, + int assume_action); version_status_t tor_version_is_obsolete(const char *myversion, const char *versionlist); -int tor_version_parse_platform(const char *platform, - tor_version_t *version_out, - int strict); +int tor_version_supports_microdescriptors(const char *platform); int tor_version_as_new_as(const char *platform, const char *cutoff); int tor_version_parse(const char *s, tor_version_t *out); int tor_version_compare(tor_version_t *a, tor_version_t *b); @@ -61,6 +51,7 @@ void sort_version_list(smartlist_t *lst, int remove_duplicates); void assert_addr_policy_ok(smartlist_t *t); void dump_distinct_digest_count(int severity); +int compare_routerstatus_entries(const void **_a, const void **_b); int compare_vote_routerstatus_entries(const void **_a, const void **_b); int networkstatus_verify_bw_weights(networkstatus_t *ns, int); networkstatus_t *networkstatus_parse_vote_from_string(const char *s, @@ -71,8 +62,7 @@ ns_detached_signatures_t *networkstatus_parse_detached_signatures( smartlist_t *microdescs_parse_from_string(const char *s, const char *eos, int allow_annotations, - saved_location_t where, - smartlist_t *invalid_digests_out); + saved_location_t where); authority_cert_t *authority_cert_parse_from_string(const char *s, const char **end_of_string); @@ -81,8 +71,7 @@ int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char **intro_points_encrypted_out, size_t *intro_points_encrypted_size_out, size_t *encoded_size_out, - const char **next_out, const char *desc, - int as_hsdir); + const char **next_out, const char *desc); int rend_decrypt_introduction_points(char **ipos_decrypted, size_t *ipos_decrypted_size, const char *descriptor_cookie, @@ -93,49 +82,5 @@ int rend_parse_introduction_points(rend_service_descriptor_t *parsed, size_t intro_points_encoded_size); int rend_parse_client_keys(strmap_t *parsed_clients, const char *str); -void routerparse_init(void); -void routerparse_free_all(void); - -#ifdef ROUTERPARSE_PRIVATE -/* - * One entry in the list of dumped descriptors; filename dumped to, length, - * SHA-256 and timestamp. - */ - -typedef struct { - char *filename; - size_t len; - uint8_t digest_sha256[DIGEST256_LEN]; - time_t when; -} dumped_desc_t; - -EXTERN(uint64_t, len_descs_dumped) -EXTERN(smartlist_t *, descs_dumped) -STATIC int routerstatus_parse_guardfraction(const char *guardfraction_str, - networkstatus_t *vote, - vote_routerstatus_t *vote_rs, - routerstatus_t *rs); -MOCK_DECL(STATIC dumped_desc_t *, dump_desc_populate_one_file, - (const char *dirname, const char *f)); -STATIC void dump_desc_populate_fifo_from_directory(const char *dirname); -STATIC void dump_desc_fifo_cleanup(void); -struct memarea_t; -STATIC routerstatus_t *routerstatus_parse_entry_from_string( - struct memarea_t *area, - const char **s, smartlist_t *tokens, - networkstatus_t *vote, - vote_routerstatus_t *vote_rs, - int consensus_method, - consensus_flavor_t flav); -MOCK_DECL(STATIC void,dump_desc,(const char *desc, const char *type)); -MOCK_DECL(STATIC int, router_compute_hash_final,(char *digest, - const char *start, size_t len, - digest_algorithm_t alg)); -MOCK_DECL(STATIC int, signed_digest_equals, - (const uint8_t *d1, const uint8_t *d2, size_t len)); -#endif /* defined(ROUTERPARSE_PRIVATE) */ - -#define ED_DESC_SIGNATURE_PREFIX "Tor router descriptor signature v1" - -#endif /* !defined(TOR_ROUTERPARSE_H) */ +#endif diff --git a/src/tor/src/or/routerset.c b/src/tor/routerset.c similarity index 78% rename from src/tor/src/or/routerset.c rename to src/tor/routerset.c index a2599b316..2e41f7f6c 100644 --- a/src/tor/src/or/routerset.c +++ b/src/tor/routerset.c @@ -1,34 +1,10 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file routerset.c - * - * \brief Functions and structures to handle set-type selection of routers - * by name, ID, address, etc. - * - * This module implements the routerset_t data structure, whose purpose - * is to specify a set of relays based on a list of their identities or - * properties. Routersets can restrict relays by IP address mask, - * identity fingerprint, country codes, and nicknames (deprecated). - * - * Routersets are typically used for user-specified restrictions, and - * are created by invoking routerset_new and routerset_parse from - * config.c and confparse.c. To use a routerset, invoke one of - * routerset_contains_...() functions , or use - * routerstatus_get_all_nodes() / routerstatus_subtract_nodes() to - * manipulate a smartlist of node_t pointers. - * - * Country-code restrictions are implemented in geoip.c. - */ - -#define ROUTERSET_PRIVATE - #include "or.h" -#include "bridges.h" #include "geoip.h" #include "nodelist.h" #include "policies.h" @@ -36,6 +12,39 @@ #include "routerparse.h" #include "routerset.h" +/** A routerset specifies constraints on a set of possible routerinfos, based + * on their names, identities, or addresses. It is optimized for determining + * whether a router is a member or not, in O(1+P) time, where P is the number + * of address policy constraints. */ +struct routerset_t { + /** A list of strings for the elements of the policy. Each string is either + * a nickname, a hexadecimal identity fingerprint, or an address policy. A + * router belongs to the set if its nickname OR its identity OR its address + * matches an entry here. */ + smartlist_t *list; + /** A map from lowercase nicknames of routers in the set to (void*)1 */ + strmap_t *names; + /** A map from identity digests routers in the set to (void*)1 */ + digestmap_t *digests; + /** An address policy for routers in the set. For implementation reasons, + * a router belongs to the set if it is _rejected_ by this policy. */ + smartlist_t *policies; + + /** A human-readable description of what this routerset is for. Used in + * log messages. */ + char *description; + + /** A list of the country codes in this set. */ + smartlist_t *country_names; + /** Total number of countries we knew about when we built countries.*/ + int n_countries; + /** Bit array mapping the return value of geoip_get_country() to 1 iff the + * country is a member of this routerset. Note that we MUST call + * routerset_refresh_countries() whenever the geoip country list is + * reloaded. */ + bitarray_t *countries; +}; + /** Return a new empty routerset. */ routerset_t * routerset_new(void) @@ -51,7 +60,7 @@ routerset_new(void) /** If c is a country code in the form {cc}, return a newly allocated * string holding the "cc" part. Else, return NULL. */ -STATIC char * +static char * routerset_get_countryname(const char *c) { char *country; @@ -107,13 +116,10 @@ routerset_parse(routerset_t *target, const char *s, const char *description) int added_countries = 0; char *countryname; smartlist_t *list = smartlist_new(); - int malformed_list; smartlist_split_string(list, s, ",", SPLIT_SKIP_SPACE | SPLIT_IGNORE_BLANK, 0); SMARTLIST_FOREACH_BEGIN(list, char *, nick) { addr_policy_t *p; - /* if it doesn't pass our validation, assume it's malformed */ - malformed_list = 1; if (is_legal_hexdigest(nick)) { char d[DIGEST_LEN]; if (*nick == '$') @@ -129,23 +135,15 @@ routerset_parse(routerset_t *target, const char *s, const char *description) description); smartlist_add(target->country_names, countryname); added_countries = 1; - } else if ((strchr(nick,'.') || strchr(nick, ':') || strchr(nick, '*')) - && (p = router_parse_addr_policy_item_from_string( - nick, ADDR_POLICY_REJECT, - &malformed_list))) { - /* IPv4 addresses contain '.', IPv6 addresses contain ':', - * and wildcard addresses contain '*'. */ + } else if ((strchr(nick,'.') || strchr(nick, '*')) && + (p = router_parse_addr_policy_item_from_string( + nick, ADDR_POLICY_REJECT))) { log_debug(LD_CONFIG, "Adding address %s to %s", nick, description); smartlist_add(target->policies, p); - } else if (malformed_list) { - log_warn(LD_CONFIG, "Entry '%s' in %s is malformed. Discarding entire" - " list.", nick, description); - r = -1; - tor_free(nick); - SMARTLIST_DEL_CURRENT(list, nick); } else { - log_notice(LD_CONFIG, "Entry '%s' in %s is ignored. Using the" - " remainder of the list.", nick, description); + log_warn(LD_CONFIG, "Entry '%s' in %s is malformed.", nick, + description); + r = -1; tor_free(nick); SMARTLIST_DEL_CURRENT(list, nick); } @@ -195,17 +193,6 @@ routerset_is_empty(const routerset_t *set) return !set || smartlist_len(set->list) == 0; } -/** Return the number of entries in set. This does NOT return a - * negative value. */ -int -routerset_len(const routerset_t *set) -{ - if (!set) { - return 0; - } - return smartlist_len(set->list); -} - /** Helper. Return true iff set contains a router based on the other * provided fields. Return higher values for more specific subentries: a * single router is more specific than an address range of routers, which is @@ -213,7 +200,7 @@ routerset_len(const routerset_t *set) * * (If country is -1, then we take the country * from addr.) */ -STATIC int +static int routerset_contains(const routerset_t *set, const tor_addr_t *addr, uint16_t orport, const char *nickname, const char *id_digest, @@ -263,12 +250,12 @@ routerset_add_unknown_ccs(routerset_t **setp, int only_if_some_cc_set) geoip_get_country("A1") >= 0; if (add_unknown) { - smartlist_add_strdup(set->country_names, "??"); - smartlist_add_strdup(set->list, "{??}"); + smartlist_add(set->country_names, tor_strdup("??")); + smartlist_add(set->list, tor_strdup("{??}")); } if (add_a1) { - smartlist_add_strdup(set->country_names, "a1"); - smartlist_add_strdup(set->list, "{a1}"); + smartlist_add(set->country_names, tor_strdup("a1")); + smartlist_add(set->list, tor_strdup("{a1}")); } if (add_unknown || add_a1) { @@ -335,18 +322,6 @@ routerset_contains_node(const routerset_t *set, const node_t *node) return 0; } -/** Return true iff routerset contains the bridge bridge. */ -int -routerset_contains_bridge(const routerset_t *set, const bridge_info_t *bridge) -{ - const char *id = (const char*)bridge_get_rsa_id_digest(bridge); - const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); - - tor_assert(addrport); - return routerset_contains(set, &addrport->addr, addrport->port, - NULL, id, -1); -} - /** Add every known node_t that is a member of routerset to * out, but never add any that are part of excludeset. * If running_only, only add the running ones. */ @@ -362,7 +337,7 @@ routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, /* No routers are specified by type; all are given by name or digest. * we can do a lookup in O(len(routerset)). */ SMARTLIST_FOREACH(routerset->list, const char *, name, { - const node_t *node = node_get_by_nickname(name, 0); + const node_t *node = node_get_by_nickname(name, 1); if (node) { if (!running_only || node->is_running) if (!routerset_contains_node(excludeset, node)) @@ -383,6 +358,39 @@ routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, } } +#if 0 +/** Add to target every node_t from source except: + * + * 1) Don't add it if include is non-empty and the relay isn't in + * include; and + * 2) Don't add it if exclude is non-empty and the relay is + * excluded in a more specific fashion by exclude. + * 3) If running_only, don't add non-running routers. + */ +void +routersets_get_node_disjunction(smartlist_t *target, + const smartlist_t *source, + const routerset_t *include, + const routerset_t *exclude, int running_only) +{ + SMARTLIST_FOREACH(source, const node_t *, node, { + int include_result; + if (running_only && !node->is_running) + continue; + if (!routerset_is_empty(include)) + include_result = routerset_contains_node(include, node); + else + include_result = 1; + + if (include_result) { + int exclude_result = routerset_contains_node(exclude, node); + if (include_result >= exclude_result) + smartlist_add(target, (void*)node); + } + }); +} +#endif + /** Remove every node_t from lst that is in routerset. */ void routerset_subtract_nodes(smartlist_t *lst, const routerset_t *routerset) @@ -437,7 +445,7 @@ routerset_equal(const routerset_t *old, const routerset_t *new) /** Free all storage held in routerset. */ void -routerset_free_(routerset_t *routerset) +routerset_free(routerset_t *routerset) { if (!routerset) return; diff --git a/src/tor/routerset.h b/src/tor/routerset.h new file mode 100644 index 000000000..bfa0c59ac --- /dev/null +++ b/src/tor/routerset.h @@ -0,0 +1,49 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file routerlist.h + * \brief Header file for routerset.c + **/ + +#ifndef TOR_ROUTERSET_H +#define TOR_ROUTERSET_H + +routerset_t *routerset_new(void); +void routerset_refresh_countries(routerset_t *rs); +int routerset_parse(routerset_t *target, const char *s, + const char *description); +void routerset_union(routerset_t *target, const routerset_t *source); +int routerset_is_list(const routerset_t *set); +int routerset_needs_geoip(const routerset_t *set); +int routerset_is_empty(const routerset_t *set); +int routerset_contains_router(const routerset_t *set, const routerinfo_t *ri, + country_t country); +int routerset_contains_routerstatus(const routerset_t *set, + const routerstatus_t *rs, + country_t country); +int routerset_contains_extendinfo(const routerset_t *set, + const extend_info_t *ei); + +int routerset_contains_node(const routerset_t *set, const node_t *node); +void routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, + const routerset_t *excludeset, + int running_only); +int routerset_add_unknown_ccs(routerset_t **setp, int only_if_some_cc_set); +#if 0 +void routersets_get_node_disjunction(smartlist_t *target, + const smartlist_t *source, + const routerset_t *include, + const routerset_t *exclude, int running_only); +#endif +void routerset_subtract_nodes(smartlist_t *out, + const routerset_t *routerset); + +char *routerset_to_string(const routerset_t *routerset); +int routerset_equal(const routerset_t *old, const routerset_t *new); +void routerset_free(routerset_t *routerset); + +#endif + diff --git a/src/tor/sandbox.c b/src/tor/sandbox.c new file mode 100644 index 000000000..969678b6d --- /dev/null +++ b/src/tor/sandbox.c @@ -0,0 +1,1510 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file sandbox.c + * \brief Code to enable sandboxing. + **/ + +#include "orconfig.h" + +#ifndef _LARGEFILE64_SOURCE +/** + * Temporarily required for O_LARGEFILE flag. Needs to be removed + * with the libevent fix. + */ +#define _LARGEFILE64_SOURCE +#endif + +/** Malloc mprotect limit in bytes. */ +#define MALLOC_MP_LIM 1048576 + +#include +#include +#include + +#include "sandbox.h" +#include "torlog.h" +#include "torint.h" +#include "tor_util.h" +#include "tor_queue.h" + +#define DEBUGGING_CLOSE + +#if defined(USE_LIBSECCOMP) + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/**Determines if at least one sandbox is active.*/ +static int sandbox_active = 0; +/** Holds the parameter list configuration for the sandbox.*/ +static sandbox_cfg_t *filter_dynamic = NULL; +/** Holds a list of pre-recorded results from getaddrinfo().*/ +static sb_addr_info_t *sb_addr_info = NULL; + +#undef SCMP_CMP +#define SCMP_CMP(a,b,c) ((struct scmp_arg_cmp){(a),(b),(c),0}) + +/** Variable used for storing all syscall numbers that will be allowed with the + * stage 1 general Tor sandbox. + */ +static int filter_nopar_gen[] = { + SCMP_SYS(access), + SCMP_SYS(brk), + SCMP_SYS(clock_gettime), + SCMP_SYS(close), + SCMP_SYS(clone), + SCMP_SYS(epoll_create), + SCMP_SYS(epoll_wait), + SCMP_SYS(fcntl), + SCMP_SYS(fstat), +#ifdef __NR_fstat64 + SCMP_SYS(fstat64), +#endif + SCMP_SYS(getdents64), + SCMP_SYS(getegid), +#ifdef __NR_getegid32 + SCMP_SYS(getegid32), +#endif + SCMP_SYS(geteuid), +#ifdef __NR_geteuid32 + SCMP_SYS(geteuid32), +#endif + SCMP_SYS(getgid), +#ifdef __NR_getgid32 + SCMP_SYS(getgid32), +#endif + SCMP_SYS(getrlimit), + SCMP_SYS(gettimeofday), + SCMP_SYS(getuid), +#ifdef __NR_getuid32 + SCMP_SYS(getuid32), +#endif + SCMP_SYS(lseek), +#ifdef __NR__llseek + SCMP_SYS(_llseek), +#endif + SCMP_SYS(mkdir), + SCMP_SYS(mlockall), + SCMP_SYS(mmap), + SCMP_SYS(munmap), + SCMP_SYS(read), + SCMP_SYS(rename), + SCMP_SYS(rt_sigreturn), + SCMP_SYS(set_robust_list), +#ifdef __NR_sigreturn + SCMP_SYS(sigreturn), +#endif + SCMP_SYS(stat), + SCMP_SYS(uname), + SCMP_SYS(write), + SCMP_SYS(exit_group), + SCMP_SYS(exit), + + SCMP_SYS(madvise), +#ifdef __NR_stat64 + // getaddrinfo uses this.. + SCMP_SYS(stat64), +#endif + + /* + * These socket syscalls are not required on x86_64 and not supported with + * some libseccomp versions (eg: 1.0.1) + */ +#if defined(__i386) + SCMP_SYS(recv), + SCMP_SYS(send), +#endif + + // socket syscalls + SCMP_SYS(bind), + SCMP_SYS(connect), + SCMP_SYS(getsockname), + SCMP_SYS(recvmsg), + SCMP_SYS(recvfrom), + SCMP_SYS(sendto), + SCMP_SYS(unlink) +}; + +/** + * Function responsible for setting up the rt_sigaction syscall for + * the seccomp filter sandbox. + */ +static int +sb_rt_sigaction(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + unsigned i; + int rc; + int param[] = { SIGINT, SIGTERM, SIGPIPE, SIGUSR1, SIGUSR2, SIGHUP, SIGCHLD, +#ifdef SIGXFSZ + SIGXFSZ +#endif + }; + (void) filter; + + for (i = 0; i < ARRAY_LENGTH(param); i++) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigaction), 1, + SCMP_CMP(0, SCMP_CMP_EQ, param[i])); + if (rc) + break; + } + + return rc; +} + +/** + * Function responsible for setting up the execve syscall for + * the seccomp filter sandbox. + */ +static int +sb_execve(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc; + sandbox_cfg_t *elem = NULL; + + // for each dynamic parameter filters + for (elem = filter; elem != NULL; elem = elem->next) { + smp_param_t *param = (smp_param_t*) elem->param; + + if (param != NULL && param->prot == 1 && param->syscall + == SCMP_SYS(execve)) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(execve), 1, + SCMP_CMP(0, SCMP_CMP_EQ, param->value)); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add execve syscall, received " + "libseccomp error %d", rc); + return rc; + } + } + } + + return 0; +} + +/** + * Function responsible for setting up the time syscall for + * the seccomp filter sandbox. + */ +static int +sb_time(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + (void) filter; + return seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(time), 1, + SCMP_CMP(0, SCMP_CMP_EQ, 0)); +} + +/** + * Function responsible for setting up the accept4 syscall for + * the seccomp filter sandbox. + */ +static int +sb_accept4(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void)filter; + +#ifdef __i386__ + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketcall), 1, + SCMP_CMP(0, SCMP_CMP_EQ, 18)); + if (rc) { + return rc; + } +#endif + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept4), 1, + SCMP_CMP(3, SCMP_CMP_EQ, SOCK_CLOEXEC)); + if (rc) { + return rc; + } + + return 0; +} + +#ifdef __NR_mmap2 +/** + * Function responsible for setting up the mmap2 syscall for + * the seccomp filter sandbox. + */ +static int +sb_mmap2(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void)filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), + SCMP_CMP(3, SCMP_CMP_EQ,MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS)); + if (rc) { + return rc; + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), 2, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_EXEC), + SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_DENYWRITE)); + if (rc) { + return rc; + } + + return 0; +} +#endif + +/** + * Function responsible for setting up the open syscall for + * the seccomp filter sandbox. + */ +static int +sb_open(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc; + sandbox_cfg_t *elem = NULL; + + // for each dynamic parameter filters + for (elem = filter; elem != NULL; elem = elem->next) { + smp_param_t *param = elem->param; + + if (param != NULL && param->prot == 1 && param->syscall + == SCMP_SYS(open)) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 1, + SCMP_CMP(0, SCMP_CMP_EQ, param->value)); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add open syscall, received " + "libseccomp error %d", rc); + return rc; + } + } + } + + rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(-1), SCMP_SYS(open), 1, + SCMP_CMP(1, SCMP_CMP_EQ, O_RDONLY|O_CLOEXEC)); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add open syscall, received libseccomp " + "error %d", rc); + return rc; + } + + return 0; +} + +/** + * Function responsible for setting up the openat syscall for + * the seccomp filter sandbox. + */ +static int +sb_openat(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc; + sandbox_cfg_t *elem = NULL; + + // for each dynamic parameter filters + for (elem = filter; elem != NULL; elem = elem->next) { + smp_param_t *param = elem->param; + + if (param != NULL && param->prot == 1 && param->syscall + == SCMP_SYS(openat)) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 1, + SCMP_CMP(0, SCMP_CMP_EQ, AT_FDCWD), + SCMP_CMP(1, SCMP_CMP_EQ, param->value), + SCMP_CMP(2, SCMP_CMP_EQ, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY| + O_CLOEXEC)); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add openat syscall, received " + "libseccomp error %d", rc); + return rc; + } + } + } + + return 0; +} + +/** + * Function responsible for setting up the socket syscall for + * the seccomp filter sandbox. + */ +static int +sb_socket(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + +#ifdef __i386__ + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 0); + if (rc) + return rc; +#endif + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 3, + SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK), + SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_IP)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 3, + SCMP_CMP(0, SCMP_CMP_EQ, PF_INET), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC), + SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_TCP)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 3, + SCMP_CMP(0, SCMP_CMP_EQ, PF_INET), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK), + SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_TCP)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 3, + SCMP_CMP(0, SCMP_CMP_EQ, PF_INET), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK), + SCMP_CMP(2, SCMP_CMP_EQ, IPPROTO_IP)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), 3, + SCMP_CMP(0, SCMP_CMP_EQ, PF_NETLINK), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_RAW), + SCMP_CMP(2, SCMP_CMP_EQ, 0)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the socketpair syscall for + * the seccomp filter sandbox. + */ +static int +sb_socketpair(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + +#ifdef __i386__ + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair), 0); + if (rc) + return rc; +#endif + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair), 2, + SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE), + SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the setsockopt syscall for + * the seccomp filter sandbox. + */ +static int +sb_setsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + +#ifdef __i386__ + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), 0); + if (rc) + return rc; +#endif + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), 2, + SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), + SCMP_CMP(2, SCMP_CMP_EQ, SO_REUSEADDR)); + if (rc) + return rc; + +#ifdef IP_TRANSPARENT + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), 2, + SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP), + SCMP_CMP(2, SCMP_CMP_EQ, IP_TRANSPARENT)); + if (rc) + return rc; +#endif + + return 0; +} + +/** + * Function responsible for setting up the getsockopt syscall for + * the seccomp filter sandbox. + */ +static int +sb_getsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + +#ifdef __i386__ + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), 0); + if (rc) + return rc; +#endif + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), 2, + SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), + SCMP_CMP(2, SCMP_CMP_EQ, SO_ERROR)); + if (rc) + return rc; + + return 0; +} + +#ifdef __NR_fcntl64 +/** + * Function responsible for setting up the fcntl64 syscall for + * the seccomp filter sandbox. + */ +static int +sb_fcntl64(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), 1, + SCMP_CMP(1, SCMP_CMP_EQ, F_GETFL)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), 2, + SCMP_CMP(1, SCMP_CMP_EQ, F_SETFL), + SCMP_CMP(2, SCMP_CMP_EQ, O_RDWR|O_NONBLOCK)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), 1, + SCMP_CMP(1, SCMP_CMP_EQ, F_GETFD)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), 2, + SCMP_CMP(1, SCMP_CMP_EQ, F_SETFD), + SCMP_CMP(2, SCMP_CMP_EQ, FD_CLOEXEC)); + if (rc) + return rc; + + return 0; +} +#endif + +/** + * Function responsible for setting up the epoll_ctl syscall for + * the seccomp filter sandbox. + * + * Note: basically allows everything but will keep for now.. + */ +static int +sb_epoll_ctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), 1, + SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_ADD)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), 1, + SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_MOD)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), 1, + SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_DEL)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the fcntl64 syscall for + * the seccomp filter sandbox. + * + * NOTE: if multiple filters need to be added, the PR_SECCOMP parameter needs + * to be whitelisted in this function. + */ +static int +sb_prctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(prctl), 1, + SCMP_CMP(0, SCMP_CMP_EQ, PR_SET_DUMPABLE)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the fcntl64 syscall for + * the seccomp filter sandbox. + * + * NOTE: does not NEED to be here.. currently only occurs before filter; will + * keep just in case for the future. + */ +static int +sb_mprotect(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 1, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 1, + SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the rt_sigprocmask syscall for + * the seccomp filter sandbox. + */ +static int +sb_rt_sigprocmask(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask), 1, + SCMP_CMP(0, SCMP_CMP_EQ, SIG_UNBLOCK)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask), 1, + SCMP_CMP(0, SCMP_CMP_EQ, SIG_SETMASK)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the flock syscall for + * the seccomp filter sandbox. + * + * NOTE: does not need to be here, occurs before filter is applied. + */ +static int +sb_flock(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock), 1, + SCMP_CMP(1, SCMP_CMP_EQ, LOCK_EX|LOCK_NB)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock), 1, + SCMP_CMP(1, SCMP_CMP_EQ, LOCK_UN)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the futex syscall for + * the seccomp filter sandbox. + */ +static int +sb_futex(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + // can remove + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), 1, + SCMP_CMP(1, SCMP_CMP_EQ, + FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), 1, + SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAKE_PRIVATE)); + if (rc) + return rc; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), 1, + SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAIT_PRIVATE)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the mremap syscall for + * the seccomp filter sandbox. + * + * NOTE: so far only occurs before filter is applied. + */ +static int +sb_mremap(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mremap), 1, + SCMP_CMP(3, SCMP_CMP_EQ, MREMAP_MAYMOVE)); + if (rc) + return rc; + + return 0; +} + +/** + * Function responsible for setting up the poll syscall for + * the seccomp filter sandbox. + */ +static int +sb_poll(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + (void) filter; + + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(poll), 2, + SCMP_CMP(1, SCMP_CMP_EQ, 1), + SCMP_CMP(2, SCMP_CMP_EQ, 10)); + if (rc) + return rc; + + return 0; +} + +#ifdef __NR_stat64 +/** + * Function responsible for setting up the stat64 syscall for + * the seccomp filter sandbox. + */ +static int +sb_stat64(scmp_filter_ctx ctx, sandbox_cfg_t *filter) +{ + int rc = 0; + sandbox_cfg_t *elem = NULL; + + // for each dynamic parameter filters + for (elem = filter; elem != NULL; elem = elem->next) { + smp_param_t *param = elem->param; + + if (param != NULL && param->prot == 1 && (param->syscall == SCMP_SYS(open) + || param->syscall == SCMP_SYS(stat64))) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat64), 1, + SCMP_CMP(0, SCMP_CMP_EQ, param->value)); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add open syscall, received " + "libseccomp error %d", rc); + return rc; + } + } + } + + return 0; +} +#endif + +/** + * Array of function pointers responsible for filtering different syscalls at + * a parameter level. + */ +static sandbox_filter_func_t filter_func[] = { + sb_rt_sigaction, + sb_rt_sigprocmask, + sb_execve, + sb_time, + sb_accept4, +#ifdef __NR_mmap2 + sb_mmap2, +#endif + sb_open, + sb_openat, +#ifdef __NR_fcntl64 + sb_fcntl64, +#endif + sb_epoll_ctl, + sb_prctl, + sb_mprotect, + sb_flock, + sb_futex, + sb_mremap, + sb_poll, +#ifdef __NR_stat64 + sb_stat64, +#endif + + sb_socket, + sb_setsockopt, + sb_getsockopt, + sb_socketpair +}; + +const char* +sandbox_intern_string(const char *str) +{ + sandbox_cfg_t *elem; + + if (str == NULL) + return NULL; + + for (elem = filter_dynamic; elem != NULL; elem = elem->next) { + smp_param_t *param = elem->param; + + if (param->prot && !strcmp(str, (char*)(param->value))) { + return (char*)(param->value); + } + } + + log_info(LD_GENERAL, "(Sandbox) Parameter %s not found", str); + return str; +} + +/** + * Protects all the strings in the sandbox's parameter list configuration. It + * works by calculating the total amount of memory required by the parameter + * list, allocating the memory using mmap, and protecting it from writes with + * mprotect(). + */ +static int +prot_strings(scmp_filter_ctx ctx, sandbox_cfg_t* cfg) +{ + int ret = 0; + size_t pr_mem_size = 0, pr_mem_left = 0; + char *pr_mem_next = NULL, *pr_mem_base; + sandbox_cfg_t *el = NULL; + + // get total number of bytes required to mmap + for (el = cfg; el != NULL; el = el->next) { + pr_mem_size += strlen((char*) ((smp_param_t*)el->param)->value) + 1; + } + + // allocate protected memory with MALLOC_MP_LIM canary + pr_mem_base = (char*) mmap(NULL, MALLOC_MP_LIM + pr_mem_size, + PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (pr_mem_base == MAP_FAILED) { + log_err(LD_BUG,"(Sandbox) failed allocate protected memory! mmap: %s", + strerror(errno)); + ret = -1; + goto out; + } + + pr_mem_next = pr_mem_base + MALLOC_MP_LIM; + pr_mem_left = pr_mem_size; + + // change el value pointer to protected + for (el = cfg; el != NULL; el = el->next) { + char *param_val = (char*)((smp_param_t *)el->param)->value; + size_t param_size = strlen(param_val) + 1; + + if (pr_mem_left >= param_size) { + // copy to protected + memcpy(pr_mem_next, param_val, param_size); + + // re-point el parameter to protected + { + void *old_val = (void *) ((smp_param_t*)el->param)->value; + tor_free(old_val); + } + ((smp_param_t*)el->param)->value = (intptr_t) pr_mem_next; + ((smp_param_t*)el->param)->prot = 1; + + // move next available protected memory + pr_mem_next += param_size; + pr_mem_left -= param_size; + } else { + log_err(LD_BUG,"(Sandbox) insufficient protected memory!"); + ret = -2; + goto out; + } + } + + // protecting from writes + if (mprotect(pr_mem_base, MALLOC_MP_LIM + pr_mem_size, PROT_READ)) { + log_err(LD_BUG,"(Sandbox) failed to protect memory! mprotect: %s", + strerror(errno)); + ret = -3; + goto out; + } + + /* + * Setting sandbox restrictions so the string memory cannot be tampered with + */ + // no mremap of the protected base address + ret = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(mremap), 1, + SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base)); + if (ret) { + log_err(LD_BUG,"(Sandbox) mremap protected memory filter fail!"); + return ret; + } + + // no munmap of the protected base address + ret = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(munmap), 1, + SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base)); + if (ret) { + log_err(LD_BUG,"(Sandbox) munmap protected memory filter fail!"); + return ret; + } + + /* + * Allow mprotect with PROT_READ|PROT_WRITE because openssl uses it, but + * never over the memory region used by the protected strings. + * + * PROT_READ|PROT_WRITE was originally fully allowed in sb_mprotect(), but + * had to be removed due to limitation of libseccomp regarding intervals. + * + * There is a restriction on how much you can mprotect with R|W up to the + * size of the canary. + */ + ret = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 2, + SCMP_CMP(0, SCMP_CMP_LT, (intptr_t) pr_mem_base), + SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM), + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE)); + if (ret) { + log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (LT)!"); + return ret; + } + + ret = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), 2, + SCMP_CMP(0, SCMP_CMP_GT, (intptr_t) pr_mem_base + pr_mem_size + + MALLOC_MP_LIM), + SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM), + SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE)); + if (ret) { + log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (GT)!"); + return ret; + } + + out: + return ret; +} + +/** + * Auxiliary function used in order to allocate a sandbox_cfg_t element and set + * it's values according the the parameter list. All elements are initialised + * with the 'prot' field set to false, as the pointer is not protected at this + * point. + */ +static sandbox_cfg_t* +new_element(int syscall, int index, intptr_t value) +{ + smp_param_t *param = NULL; + + sandbox_cfg_t *elem = tor_malloc(sizeof(sandbox_cfg_t)); + elem->param = tor_malloc(sizeof(smp_param_t)); + + param = elem->param; + param->syscall = syscall; + param->pindex = index; + param->value = value; + param->prot = 0; + + return elem; +} + +#ifdef __NR_stat64 +#define SCMP_stat SCMP_SYS(stat64) +#else +#define SCMP_stat SCMP_SYS(stat) +#endif + +int +sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file, int fr) +{ + sandbox_cfg_t *elem = NULL; + + elem = new_element(SCMP_stat, 0, (intptr_t)(void*) tor_strdup(file)); + if (!elem) { + log_err(LD_BUG,"(Sandbox) failed to register parameter!"); + return -1; + } + + elem->next = *cfg; + *cfg = elem; + + if (fr) tor_free(file); + return 0; +} + +int +sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...) +{ + int rc = 0; + char *fn = NULL; + + va_list ap; + va_start(ap, cfg); + + while ((fn = va_arg(ap, char*)) != NULL) { + int fr = va_arg(ap, int); + + rc = sandbox_cfg_allow_stat_filename(cfg, fn, fr); + if (rc) { + log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_stat_filename_array fail"); + goto end; + } + } + + end: + va_end(ap); + return 0; +} + +int +sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file, int fr) +{ + sandbox_cfg_t *elem = NULL; + + elem = new_element(SCMP_SYS(open), 0, (intptr_t)(void *)tor_strdup(file)); + if (!elem) { + log_err(LD_BUG,"(Sandbox) failed to register parameter!"); + return -1; + } + + elem->next = *cfg; + *cfg = elem; + + if (fr) tor_free(file); + + return 0; +} + +int +sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...) +{ + int rc = 0; + char *fn = NULL; + + va_list ap; + va_start(ap, cfg); + + while ((fn = va_arg(ap, char*)) != NULL) { + int fr = va_arg(ap, int); + + rc = sandbox_cfg_allow_open_filename(cfg, fn, fr); + if (rc) { + log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_open_filename_array fail"); + goto end; + } + } + + end: + va_end(ap); + return 0; +} + +int +sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file, int fr) +{ + sandbox_cfg_t *elem = NULL; + + elem = new_element(SCMP_SYS(openat), 1, (intptr_t)(void *)tor_strdup(file)); + if (!elem) { + log_err(LD_BUG,"(Sandbox) failed to register parameter!"); + return -1; + } + + elem->next = *cfg; + *cfg = elem; + + if (fr) tor_free(file); + + return 0; +} + +int +sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...) +{ + int rc = 0; + char *fn = NULL; + + va_list ap; + va_start(ap, cfg); + + while ((fn = va_arg(ap, char*)) != NULL) { + int fr = va_arg(ap, int); + + rc = sandbox_cfg_allow_openat_filename(cfg, fn, fr); + if (rc) { + log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_openat_filename_array fail"); + goto end; + } + } + + end: + va_end(ap); + return 0; +} + +int +sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com) +{ + sandbox_cfg_t *elem = NULL; + + elem = new_element(SCMP_SYS(execve), 1, (intptr_t)(void *)tor_strdup(com)); + if (!elem) { + log_err(LD_BUG,"(Sandbox) failed to register parameter!"); + return -1; + } + + elem->next = *cfg; + *cfg = elem; + + return 0; +} + +int +sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...) +{ + int rc = 0; + char *fn = NULL; + + va_list ap; + va_start(ap, cfg); + + while ((fn = va_arg(ap, char*)) != NULL) { + + rc = sandbox_cfg_allow_execve(cfg, fn); + if (rc) { + log_err(LD_BUG,"(Sandbox) sandbox_cfg_allow_execve_array failed"); + goto end; + } + } + + end: + va_end(ap); + return 0; +} + +int +sandbox_getaddrinfo(const char *name, const char *servname, + const struct addrinfo *hints, + struct addrinfo **res) +{ + sb_addr_info_t *el; + + if (servname != NULL) + return -1; + + *res = NULL; + + for (el = sb_addr_info; el; el = el->next) { + if (!strcmp(el->name, name)) { + *res = tor_malloc(sizeof(struct addrinfo)); + + memcpy(*res, el->info, sizeof(struct addrinfo)); + /* XXXX What if there are multiple items in the list? */ + return 0; + } + } + + if (!sandbox_active) { + if (getaddrinfo(name, NULL, hints, res)) { + log_err(LD_BUG,"(Sandbox) getaddrinfo failed!"); + return -1; + } + + return 0; + } + + // getting here means something went wrong + log_err(LD_BUG,"(Sandbox) failed to get address %s!", name); + if (*res) { + tor_free(*res); + res = NULL; + } + return -1; +} + +int +sandbox_add_addrinfo(const char* name) +{ + int ret; + struct addrinfo hints; + sb_addr_info_t *el = NULL; + + el = tor_malloc(sizeof(sb_addr_info_t)); + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + ret = getaddrinfo(name, NULL, &hints, &(el->info)); + if (ret) { + log_err(LD_BUG,"(Sandbox) failed to getaddrinfo"); + ret = -2; + tor_free(el); + goto out; + } + + el->name = tor_strdup(name); + el->next = sb_addr_info; + sb_addr_info = el; + + out: + return ret; +} + +/** + * Function responsible for going through the parameter syscall filters and + * call each function pointer in the list. + */ +static int +add_param_filter(scmp_filter_ctx ctx, sandbox_cfg_t* cfg) +{ + unsigned i; + int rc = 0; + + // function pointer + for (i = 0; i < ARRAY_LENGTH(filter_func); i++) { + if ((filter_func[i])(ctx, cfg)) { + log_err(LD_BUG,"(Sandbox) failed to add syscall %d, received libseccomp " + "error %d", i, rc); + return rc; + } + } + + return 0; +} + +/** + * Function responsible of loading the libseccomp syscall filters which do not + * have parameter filtering. + */ +static int +add_noparam_filter(scmp_filter_ctx ctx) +{ + unsigned i; + int rc = 0; + + // add general filters + for (i = 0; i < ARRAY_LENGTH(filter_nopar_gen); i++) { + rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, filter_nopar_gen[i], 0); + if (rc != 0) { + log_err(LD_BUG,"(Sandbox) failed to add syscall index %d (NR=%d), " + "received libseccomp error %d", i, filter_nopar_gen[i], rc); + return rc; + } + } + + return 0; +} + +/** + * Function responsible for setting up and enabling a global syscall filter. + * The function is a prototype developed for stage 1 of sandboxing Tor. + * Returns 0 on success. + */ +static int +install_syscall_filter(sandbox_cfg_t* cfg) +{ + int rc = 0; + scmp_filter_ctx ctx; + + ctx = seccomp_init(SCMP_ACT_TRAP); + if (ctx == NULL) { + log_err(LD_BUG,"(Sandbox) failed to initialise libseccomp context"); + rc = -1; + goto end; + } + + // protectign sandbox parameter strings + if ((rc = prot_strings(ctx, cfg))) { + goto end; + } + + // add parameter filters + if ((rc = add_param_filter(ctx, cfg))) { + log_err(LD_BUG, "(Sandbox) failed to add param filters!"); + goto end; + } + + // adding filters with no parameters + if ((rc = add_noparam_filter(ctx))) { + log_err(LD_BUG, "(Sandbox) failed to add param filters!"); + goto end; + } + + // loading the seccomp2 filter + if ((rc = seccomp_load(ctx))) { + log_err(LD_BUG, "(Sandbox) failed to load!"); + goto end; + } + + // marking the sandbox as active + sandbox_active = 1; + + end: + seccomp_release(ctx); + return (rc < 0 ? -rc : rc); +} + +/** + * Function called when a SIGSYS is caught by the application. It notifies the + * user that an error has occurred and either terminates or allows the + * application to continue execution, based on the DEBUGGING_CLOSE symbol. + */ +static void +sigsys_debugging(int nr, siginfo_t *info, void *void_context) +{ + ucontext_t *ctx = (ucontext_t *) (void_context); + char number[32]; + int syscall; + (void) nr; + + if (info->si_code != SYS_SECCOMP) + return; + + if (!ctx) + return; + + syscall = ctx->uc_mcontext.gregs[REG_SYSCALL]; + + format_dec_number_sigsafe(syscall, number, sizeof(number)); + tor_log_err_sigsafe("(Sandbox) Caught a bad syscall attempt (syscall ", + number, + ")\n", + NULL); + +#if defined(DEBUGGING_CLOSE) + _exit(1); +#endif // DEBUGGING_CLOSE +} + +/** + * Function that adds a handler for SIGSYS, which is the signal thrown + * when the application is issuing a syscall which is not allowed. The + * main purpose of this function is to help with debugging by identifying + * filtered syscalls. + */ +static int +install_sigsys_debugging(void) +{ + struct sigaction act; + sigset_t mask; + + memset(&act, 0, sizeof(act)); + sigemptyset(&mask); + sigaddset(&mask, SIGSYS); + + act.sa_sigaction = &sigsys_debugging; + act.sa_flags = SA_SIGINFO; + if (sigaction(SIGSYS, &act, NULL) < 0) { + log_err(LD_BUG,"(Sandbox) Failed to register SIGSYS signal handler"); + return -1; + } + + if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) { + log_err(LD_BUG,"(Sandbox) Failed call to sigprocmask()"); + return -2; + } + + return 0; +} + +/** + * Function responsible of registering the sandbox_cfg_t list of parameter + * syscall filters to the existing parameter list. This is used for incipient + * multiple-sandbox support. + */ +static int +register_cfg(sandbox_cfg_t* cfg) +{ + sandbox_cfg_t *elem = NULL; + + if (filter_dynamic == NULL) { + filter_dynamic = cfg; + return 0; + } + + for (elem = filter_dynamic; elem->next != NULL; elem = elem->next); + + elem->next = cfg; + + return 0; +} + +#endif // USE_LIBSECCOMP + +#ifdef USE_LIBSECCOMP +/** + * Initialises the syscall sandbox filter for any linux architecture, taking + * into account various available features for different linux flavours. + */ +static int +initialise_libseccomp_sandbox(sandbox_cfg_t* cfg) +{ + if (install_sigsys_debugging()) + return -1; + + if (install_syscall_filter(cfg)) + return -2; + + if (register_cfg(cfg)) + return -3; + + return 0; +} + +#endif // USE_LIBSECCOMP + +sandbox_cfg_t* +sandbox_cfg_new(void) +{ + return NULL; +} + +int +sandbox_init(sandbox_cfg_t *cfg) +{ +#if defined(USE_LIBSECCOMP) + return initialise_libseccomp_sandbox(cfg); + +#elif defined(_WIN32) + (void)cfg; + log_warn(LD_BUG,"Windows sandboxing is not implemented. The feature is " + "currently disabled."); + return 0; + +#elif defined(TARGET_OS_MAC) + (void)cfg; + log_warn(LD_BUG,"Mac OSX sandboxing is not implemented. The feature is " + "currently disabled"); + return 0; +#else + (void)cfg; + log_warn(LD_BUG,"Sandboxing is not implemented for your platform. The " + "feature is currently disabled"); + return 0; +#endif +} + +#ifndef USE_LIBSECCOMP +int +sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file, + int fr) +{ + (void)cfg; (void)file; (void)fr; + return 0; +} + +int +sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...) +{ + (void)cfg; + return 0; +} + +int +sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file, + int fr) +{ + (void)cfg; (void)file; (void)fr; + return 0; +} + +int +sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...) +{ + (void)cfg; + return 0; +} + +int +sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com) +{ + (void)cfg; (void)com; + return 0; +} + +int +sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...) +{ + (void)cfg; + return 0; +} + +int +sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file, + int fr) +{ + (void)cfg; (void)file; (void)fr; + return 0; +} + +int +sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...) +{ + (void)cfg; + return 0; +} +#endif + diff --git a/src/tor/sandbox.h b/src/tor/sandbox.h new file mode 100644 index 000000000..d64d427d3 --- /dev/null +++ b/src/tor/sandbox.h @@ -0,0 +1,247 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file sandbox.h + * \brief Header file for sandbox.c. + **/ + +#ifndef SANDBOX_H_ +#define SANDBOX_H_ + +#include "orconfig.h" +#include "torint.h" + +#ifndef SYS_SECCOMP + +/** + * Used by SIGSYS signal handler to check if the signal was issued due to a + * seccomp2 filter violation. + */ +#define SYS_SECCOMP 1 + +#endif + +#if defined(HAVE_SECCOMP_H) && defined(__linux__) +#define USE_LIBSECCOMP +#endif + +struct sandbox_cfg_elem; + +/** Typedef to structure used to manage a sandbox configuration. */ +typedef struct sandbox_cfg_elem sandbox_cfg_t; + +/** + * Linux definitions + */ +#ifdef USE_LIBSECCOMP + +#ifndef __USE_GNU +#define __USE_GNU +#endif +#include +#include +#include + +#define PARAM_PTR 0 +#define PARAM_NUM 1 + +/** + * Enum used to manage the type of the implementation for general purpose. + */ +typedef enum { + /** Libseccomp implementation based on seccomp2*/ + LIBSECCOMP2 = 0 +} SB_IMPL; + +/** + * Configuration parameter structure associated with the LIBSECCOMP2 + * implementation. + */ +typedef struct smp_param { + /** syscall associated with parameter. */ + int syscall; + + /** parameter index. */ + int pindex; + /** parameter value. */ + intptr_t value; + + /** parameter flag (0 = not protected, 1 = protected). */ + int prot; +} smp_param_t; + +/** + * Structure used to manage a sandbox configuration. + * + * It is implemented as a linked list of parameters. Currently only controls + * parameters for open, openat, execve, stat64. + */ +struct sandbox_cfg_elem { + /** Sandbox implementation which dictates the parameter type. */ + SB_IMPL implem; + + /** Configuration parameter. */ + void *param; + + /** Next element of the configuration*/ + struct sandbox_cfg_elem *next; +}; + +/** + * Structure used for keeping a linked list of getaddrinfo pre-recorded + * results. + */ +struct sb_addr_info_el { + /** Name of the address info result. */ + char *name; + /** Pre-recorded getaddrinfo result. */ + struct addrinfo *info; + /** Next element in the list. */ + struct sb_addr_info_el *next; +}; +/** Typedef to structure used to manage an addrinfo list. */ +typedef struct sb_addr_info_el sb_addr_info_t; + +/** Function pointer defining the prototype of a filter function.*/ +typedef int (*sandbox_filter_func_t)(scmp_filter_ctx ctx, + sandbox_cfg_t *filter); + +/** Type that will be used in step 3 in order to manage multiple sandboxes.*/ +typedef struct { + /** function pointers associated with the filter */ + sandbox_filter_func_t *filter_func; + + /** filter function pointer parameters */ + sandbox_cfg_t *filter_dynamic; +} sandbox_t; + +/** + * Linux 32 bit definitions + */ +#if defined(__i386__) + +#define REG_SYSCALL REG_EAX + +/** + * Linux 64 bit definitions + */ +#elif defined(__x86_64__) + +#define REG_SYSCALL REG_RAX + +#endif + +#endif // USE_LIBSECCOMP + +#ifdef USE_LIBSECCOMP +/** Pre-calls getaddrinfo in order to pre-record result. */ +int sandbox_add_addrinfo(const char *addr); + +struct addrinfo; +/** Replacement for getaddrinfo(), using pre-recorded results. */ +int sandbox_getaddrinfo(const char *name, const char *servname, + const struct addrinfo *hints, + struct addrinfo **res); +#else +#define sandbox_getaddrinfo(name, servname, hints, res) \ + getaddrinfo((name),(servname), (hints),(res)) +#define sandbox_add_addrinfo(name) \ + ((void)(name)) +#endif + +#ifdef USE_LIBSECCOMP +/** Returns a registered protected string used with the sandbox, given that + * it matches the parameter. + */ +const char* sandbox_intern_string(const char *param); +#else +#define sandbox_intern_string(s) (s) +#endif + +/** Creates an empty sandbox configuration file.*/ +sandbox_cfg_t * sandbox_cfg_new(void); + +/** + * Function used to add a open allowed filename to a supplied configuration. + * The (char*) specifies the path to the allowed file, fr = 1 tells the + * function that the char* needs to be free-ed, 0 means the pointer does not + * need to be free-ed. + */ +int sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file, + int fr); + +/** Function used to add a series of open allowed filenames to a supplied + * configuration. + * @param cfg sandbox configuration. + * @param ... all future parameters are specified as pairs of <(char*), 1 / 0> + * the char* specifies the path to the allowed file, 1 tells the function + * that the char* needs to be free-ed, 0 means the pointer does not need to + * be free-ed; the final parameter needs to be . + */ +int sandbox_cfg_allow_open_filename_array(sandbox_cfg_t **cfg, ...); + +/** + * Function used to add a openat allowed filename to a supplied configuration. + * The (char*) specifies the path to the allowed file, fr = 1 tells the + * function that the char* needs to be free-ed, 0 means the pointer does not + * need to be free-ed. + */ +int sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file, + int fr); + +/** Function used to add a series of openat allowed filenames to a supplied + * configuration. + * @param cfg sandbox configuration. + * @param ... all future parameters are specified as pairs of <(char*), 1 / 0> + * the char* specifies the path to the allowed file, 1 tells the function + * that the char* needs to be free-ed, 0 means the pointer does not need to + * be free-ed; the final parameter needs to be . + */ +int sandbox_cfg_allow_openat_filename_array(sandbox_cfg_t **cfg, ...); + +/** + * Function used to add a execve allowed filename to a supplied configuration. + * The (char*) specifies the path to the allowed file, fr = 1 tells the + * function that the char* needs to be free-ed, 0 means the pointer does not + * need to be free-ed. + */ +int sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com); + +/** Function used to add a series of execve allowed filenames to a supplied + * configuration. + * @param cfg sandbox configuration. + * @param ... all future parameters are specified as pairs of <(char*), 1 / 0> + * the char* specifies the path to the allowed file, 1 tells the function + * that the char* needs to be free-ed, 0 means the pointer does not need to + * be free-ed; the final parameter needs to be . + */ +int sandbox_cfg_allow_execve_array(sandbox_cfg_t **cfg, ...); + +/** + * Function used to add a stat/stat64 allowed filename to a configuration. + * The (char*) specifies the path to the allowed file, fr = 1 tells the + * function that the char* needs to be free-ed, 0 means the pointer does not + * need to be free-ed. + */ +int sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file, + int fr); + +/** Function used to add a series of stat64 allowed filenames to a supplied + * configuration. + * @param cfg sandbox configuration. + * @param ... all future parameters are specified as pairs of <(char*), 1 / 0> + * the char* specifies the path to the allowed file, 1 tells the function + * that the char* needs to be free-ed, 0 means the pointer does not need to + * be free-ed; the final parameter needs to be . + */ +int sandbox_cfg_allow_stat_filename_array(sandbox_cfg_t **cfg, ...); + +/** Function used to initialise a sandbox configuration.*/ +int sandbox_init(sandbox_cfg_t* cfg); + +#endif /* SANDBOX_H_ */ + diff --git a/src/tor/scripts/README b/src/tor/scripts/README deleted file mode 100644 index 02faabe06..000000000 --- a/src/tor/scripts/README +++ /dev/null @@ -1,63 +0,0 @@ -The scripts directory holds tools for use in building, generating, testing, -and maintaining the Tor source code. It is mainly for use by developers. - -Code maintenance scripts ------------------------- - -maint/checkLogs.pl -- Verify that Tor log statements are unique. - -maint/check_config_macros.pl -- Look for autoconf tests whose results are -never used. - -maint/checkOptionDocs.pl -- Make sure that Tor options are documented in the -manpage, and that the manpage only documents real Tor options. - -maint/checkSpaces.pl -- Style checker for the Tor source code. Mainly checks -whitespace. - -maint/findMergedChanges.pl -- Find a set of changes/* files that have been -merged into an upstream version. - -maint/format_changelog.py -- Flow the changelog into the proper format. - -maint/redox.py -- Find places that should have DOCDOC comments to indicate a -need for doxygen comments, and put those comments there. - -maint/updateVersions.pl -- Update the version number in the .nsi and windows -orconfig.h files. - - -Testing scripts ---------------- - -test/cov-blame -- Mash up the results of gcov with git blame. Mainly useful -to find out who has been writing untested code. - -test/cov-diff -- Compare two directories of gcov files to identify changed -lines without coverage. - -test/coverage -- Generates a directory full of gcov files. You need to use -this script instead of calling gcov directly because of our confusingly named -object files. - -test/scan-build.sh -- Example script for invoking clang's scan-build -static analysis tools. - - -Code generation scripts ------------------------ - -codegen/gen_linux_syscalls.pl -- Generate a table mapping linux syscall -numbers to their names. - -codegen/gen_server_ciphers.py -- Generate a sorted list of TLS ciphersuites -for servers to choose from. - -codegen/get_mozilla_ciphers.py -- Generate a list of TLS ciphersuites for -clients to use in order to look like Firefox. - -Code transformation scripts ---------------------------- - -coccinelle/calloc.cocci -- Transform code to replace variants of -malloc(a*b) with calloc(a,b) diff --git a/src/tor/scripts/coccinelle/calloc.cocci b/src/tor/scripts/coccinelle/calloc.cocci deleted file mode 100644 index fbda88e53..000000000 --- a/src/tor/scripts/coccinelle/calloc.cocci +++ /dev/null @@ -1,23 +0,0 @@ -// Use calloc or realloc as appropriate instead of multiply-and-alloc - -@malloc_to_calloc@ -identifier f =~ "(tor_malloc|tor_malloc_zero)"; -expression a; -constant b; -@@ -- f(a * b) -+ tor_calloc(a, b) - -@calloc_arg_order@ -expression a; -type t; -@@ -- tor_calloc(sizeof(t), a) -+ tor_calloc(a, sizeof(t)) - -@realloc_to_reallocarray@ -expression a, b; -expression p; -@@ -- tor_realloc(p, a * b) -+ tor_reallocarray(p, a, b) diff --git a/src/tor/scripts/coccinelle/ceil_div.cocci b/src/tor/scripts/coccinelle/ceil_div.cocci deleted file mode 100644 index 00843e82c..000000000 --- a/src/tor/scripts/coccinelle/ceil_div.cocci +++ /dev/null @@ -1,6 +0,0 @@ -@@ -expression n, d; -@@ - -- (((n) + (d) - 1) / (d)) -+ CEIL_DIV(n, d) diff --git a/src/tor/scripts/coccinelle/malloc_cast.cocci b/src/tor/scripts/coccinelle/malloc_cast.cocci deleted file mode 100644 index 20321d4fd..000000000 --- a/src/tor/scripts/coccinelle/malloc_cast.cocci +++ /dev/null @@ -1,38 +0,0 @@ -@cast_malloc@ -expression e; -type T; -@@ -- (T *)tor_malloc(e) -+ tor_malloc(e) - -@cast_malloc_zero@ -expression e; -type T; -identifier func; -@@ -- (T *)tor_malloc_zero(e) -+ tor_malloc_zero(e) - -@cast_calloc@ -expression a, b; -type T; -identifier func; -@@ -- (T *)tor_calloc(a, b) -+ tor_calloc(a, b) - -@cast_realloc@ -expression e; -expression p; -type T; -@@ -- (T *)tor_realloc(p, e) -+ tor_realloc(p, e) - -@cast_reallocarray@ -expression a,b; -expression p; -type T; -@@ -- (T *)tor_reallocarray(p, a, b) -+ tor_reallocarray(p, a, b) diff --git a/src/tor/scripts/coccinelle/test-operator-cleanup b/src/tor/scripts/coccinelle/test-operator-cleanup deleted file mode 100644 index e7822542a..000000000 --- a/src/tor/scripts/coccinelle/test-operator-cleanup +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/perl -w -p -i - -next if m#^ */\*# or m#^ *\* #; - -s/<([,)])/OP_LT$1/; -s/(?<=[\s,])>([,)])/OP_GT$1/; -#s/>([,)])/OP_GT$1/; -s/==([,)])/OP_EQ$1/; -s/>=([,)])/OP_GE$1/; -s/<=([,)])/OP_LE$1/; -s/!=([,)])/OP_NE$1/; diff --git a/src/tor/scripts/coccinelle/test_assert_int.cocci b/src/tor/scripts/coccinelle/test_assert_int.cocci deleted file mode 100644 index 80e86b4f3..000000000 --- a/src/tor/scripts/coccinelle/test_assert_int.cocci +++ /dev/null @@ -1,49 +0,0 @@ -@@ -int e; -constant c; -@@ - -( -- tt_assert(e == c) -+ tt_int_op(e, OP_EQ, c) -| -- tt_assert(e != c) -+ tt_int_op(e, OP_NE, c) -| -- tt_assert(e < c) -+ tt_int_op(e, OP_LT, c) -| -- tt_assert(e <= c) -+ tt_int_op(e, OP_LE, c) -| -- tt_assert(e > c) -+ tt_int_op(e, OP_GT, c) -| -- tt_assert(e >= c) -+ tt_int_op(e, OP_GE, c) -) - -@@ -unsigned int e; -constant c; -@@ - -( -- tt_assert(e == c) -+ tt_uint_op(e, OP_EQ, c) -| -- tt_assert(e != c) -+ tt_uint_op(e, OP_NE, c) -| -- tt_assert(e < c) -+ tt_uint_op(e, OP_LT, c) -| -- tt_assert(e <= c) -+ tt_uint_op(e, OP_LE, c) -| -- tt_assert(e > c) -+ tt_uint_op(e, OP_GT, c) -| -- tt_assert(e >= c) -+ tt_uint_op(e, OP_GE, c) -) diff --git a/src/tor/scripts/coccinelle/test_assert_null.cocci b/src/tor/scripts/coccinelle/test_assert_null.cocci deleted file mode 100644 index 3d66e1ee0..000000000 --- a/src/tor/scripts/coccinelle/test_assert_null.cocci +++ /dev/null @@ -1,11 +0,0 @@ -@@ -expression * e; -@@ - -( -- tt_assert(e != NULL) -+ tt_ptr_op(e, OP_NE, NULL) -| -- tt_assert(e == NULL) -+ tt_ptr_op(e, OP_EQ, NULL) -) diff --git a/src/tor/scripts/coccinelle/test_assert_zero.cocci b/src/tor/scripts/coccinelle/test_assert_zero.cocci deleted file mode 100644 index 09feaa5fb..000000000 --- a/src/tor/scripts/coccinelle/test_assert_zero.cocci +++ /dev/null @@ -1,5 +0,0 @@ -@@ -@@ - -- tt_assert(0) -+ tt_abort() diff --git a/src/tor/scripts/coccinelle/uncalloc.cocci b/src/tor/scripts/coccinelle/uncalloc.cocci deleted file mode 100644 index bf3f74165..000000000 --- a/src/tor/scripts/coccinelle/uncalloc.cocci +++ /dev/null @@ -1,13 +0,0 @@ - -@@ -expression a; -@@ -- tor_calloc(1, a) -+ tor_malloc_zero(a) - -@@ -expression a; -@@ -- tor_calloc(a, 1) -+ tor_malloc_zero(a) - diff --git a/src/tor/scripts/codegen/fuzzing_include_am.py b/src/tor/scripts/codegen/fuzzing_include_am.py deleted file mode 100644 index fda57d2ae..000000000 --- a/src/tor/scripts/codegen/fuzzing_include_am.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/python - -FUZZERS = """ - consensus - descriptor - diff - diff-apply - extrainfo - hsdescv2 - hsdescv3 - http - http-connect - iptsv2 - microdesc - vrs -""" - - -PREAMBLE = r""" -FUZZING_CPPFLAGS = \ - $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) -FUZZING_CFLAGS = \ - $(AM_CFLAGS) $(TEST_CFLAGS) -FUZZING_LDFLAG = \ - @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ -FUZZING_LIBS = \ - src/or/libtor-testing.a \ - src/common/libor-crypto-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/trunnel/libor-trunnel-testing.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ \ - @TOR_LZMA_LIBS@ \ - @TOR_ZSTD_LIBS@ - -oss-fuzz-prereqs: \ - src/or/libtor-testing.a \ - src/common/libor-crypto-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/trunnel/libor-trunnel-testing.a - -noinst_HEADERS += \ - src/test/fuzz/fuzzing.h - -LIBFUZZER = -lFuzzer -LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) -LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ - -LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) -""" - -POSTAMBLE = r""" -noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) -noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) -oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) -fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) - -test-fuzz-corpora: $(FUZZERS) - $(top_srcdir)/src/test/fuzz_static_testcases.sh -""" - -########### No user serviceable parts will follow. - -PREAMBLE = PREAMBLE.strip() -POSTAMBLE = POSTAMBLE.strip() # If I use it, it's a word! -FUZZERS = FUZZERS.split() -FUZZERS.sort() - -WARNING = """ -# This file was generated by fuzzing_include_am.py; do not hand-edit unless -# you enjoy having your changes erased. -""".strip() - -print(WARNING) - -print(PREAMBLE) - -print("\n# ===== AFL fuzzers") - -def get_id_name(s): - return s.replace("-", "_") - -for fuzzer in FUZZERS: - idname = get_id_name(fuzzer) - print("""\ -src_test_fuzz_fuzz_{name}_SOURCES = \\ - src/test/fuzz/fuzzing_common.c \\ - src/test/fuzz/fuzz_{name}.c -src_test_fuzz_fuzz_{name}_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_{name}_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_{name}_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_{name}_LDADD = $(FUZZING_LIBS) -""".format(name=idname)) - -print("FUZZERS = \\") -print(" \\\n".join("\tsrc/test/fuzz/fuzz-{name}".format(name=fuzzer) - for fuzzer in FUZZERS)) - -print("\n# ===== libfuzzer") -print("\nif LIBFUZZER_ENABLED") - -for fuzzer in FUZZERS: - idname = get_id_name(fuzzer) - print("""\ -src_test_fuzz_lf_fuzz_{name}_SOURCES = \\ - $(src_test_fuzz_fuzz_{name}_SOURCES) -src_test_fuzz_lf_fuzz_{name}_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_{name}_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_{name}_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_{name}_LDADD = $(LIBFUZZER_LIBS) -""".format(name=idname)) - -print("LIBFUZZER_FUZZERS = \\") -print(" \\\n".join("\tsrc/test/fuzz/lf-fuzz-{name}".format(name=fuzzer) - for fuzzer in FUZZERS)) - -print(""" -else -LIBFUZZER_FUZZERS = -endif""") - -print("\n# ===== oss-fuzz\n") -print("if OSS_FUZZ_ENABLED") - -for fuzzer in FUZZERS: - idname = get_id_name(fuzzer) - print("""\ -src_test_fuzz_liboss_fuzz_{name}_a_SOURCES = \\ - $(src_test_fuzz_fuzz_{name}_SOURCES) -src_test_fuzz_liboss_fuzz_{name}_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_{name}_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) -""".format(name=idname)) - -print("OSS_FUZZ_FUZZERS = \\") -print(" \\\n".join("\tsrc/test/fuzz/liboss-fuzz-{name}.a".format(name=fuzzer) - for fuzzer in FUZZERS)) - -print(""" -else -OSS_FUZZ_FUZZERS = -endif""") - -print("") - -print(POSTAMBLE) diff --git a/src/tor/scripts/codegen/gen_linux_syscalls.pl b/src/tor/scripts/codegen/gen_linux_syscalls.pl deleted file mode 100644 index f985bad6c..000000000 --- a/src/tor/scripts/codegen/gen_linux_syscalls.pl +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -my %syscalls = (); - -while (<>) { - if (/^#define (__NR_\w+) /) { - $syscalls{$1} = 1; - } -} - -print <>sys.stderr, "Syntax: get_mozilla_ciphers.py " - sys.exit(1) - -ff_root = sys.argv[1] -ossl_root = sys.argv[2] - -def ff(s): - return os.path.join(ff_root, s) -def ossl(s): - return os.path.join(ossl_root, s) - -##### -# Read the cpp file to understand what Ciphers map to what name : -# Make "ciphers" a map from name used in the javascript to a cipher macro name -fileA = open(ff('security/manager/ssl/nsNSSComponent.cpp'),'r') - -# The input format is a file containing exactly one section of the form: -# static CipherPref CipherPrefs[] = { -# {"name", MACRO_NAME}, // comment -# ... -# {NULL, 0} -# } - -inCipherSection = False -cipherLines = [] -for line in fileA: - if line.startswith('static const CipherPref sCipherPrefs[]'): - # Get the starting boundary of the Cipher Preferences - inCipherSection = True - elif inCipherSection: - line = line.strip() - if line.startswith('{ nullptr, 0}'): - # At the ending boundary of the Cipher Prefs - break - else: - cipherLines.append(line) -fileA.close() - -# Parse the lines and put them into a dict -ciphers = {} -cipher_pref = {} -key_pending = None -for line in cipherLines: - m = re.search(r'^{\s*\"([^\"]+)\",\s*(\S+)\s*(?:,\s*(true|false))?\s*}', line) - if m: - assert not key_pending - key,value,enabled = m.groups() - if enabled == 'true': - ciphers[key] = value - cipher_pref[value] = key - continue - m = re.search(r'^{\s*\"([^\"]+)\",', line) - if m: - assert not key_pending - key_pending = m.group(1) - continue - m = re.search(r'^\s*(\S+)(?:,\s*(true|false))+\s*}', line) - if m: - assert key_pending - key = key_pending - value,enabled = m.groups() - key_pending = None - if enabled == 'true': - ciphers[key] = value - cipher_pref[value] = key - -#### -# Now find the correct order for the ciphers -fileC = open(ff('security/nss/lib/ssl/ssl3con.c'), 'r') -firefox_ciphers = [] -inEnum=False -for line in fileC: - if not inEnum: - if "ssl3CipherSuiteCfg cipherSuites[" in line: - inEnum = True - continue - - if line.startswith("};"): - break - - m = re.match(r'^\s*\{\s*([A-Z_0-9]+),', line) - if m: - firefox_ciphers.append(m.group(1)) - -fileC.close() - -##### -# Read the JS file to understand what ciphers are enabled. The format is -# pref("name", true/false); -# Build a map enabled_ciphers from javascript name to "true" or "false", -# and an (unordered!) list of the macro names for those ciphers that are -# enabled. -fileB = open(ff('netwerk/base/security-prefs.js'), 'r') - -enabled_ciphers = {} -for line in fileB: - m = re.match(r'pref\(\"([^\"]+)\"\s*,\s*(\S*)\s*\)', line) - if not m: - continue - key, val = m.groups() - if key.startswith("security.ssl3"): - enabled_ciphers[key] = val -fileB.close() - -used_ciphers = [] -for k, v in enabled_ciphers.items(): - if v == "true": - used_ciphers.append(ciphers[k]) - -#oSSLinclude = ('/usr/include/openssl/ssl3.h', '/usr/include/openssl/ssl.h', -# '/usr/include/openssl/ssl2.h', '/usr/include/openssl/ssl23.h', -# '/usr/include/openssl/tls1.h') -oSSLinclude = ['ssl3.h', 'ssl.h' - 'ssl2.h', 'ssl23.h', - 'tls1.h'] - -##### -# This reads the hex code for the ciphers that are used by firefox. -# sslProtoD is set to a map from macro name to macro value in sslproto.h; -# cipher_codes is set to an (unordered!) list of these hex values. -sslProto = open(ff('security/nss/lib/ssl/sslproto.h'), 'r') -sslProtoD = {} - -for line in sslProto: - m = re.match('#define\s+(\S+)\s+(\S+)', line) - if m: - key, value = m.groups() - sslProtoD[key] = value -sslProto.close() - -cipher_codes = [] -for x in used_ciphers: - cipher_codes.append(sslProtoD[x].lower()) - -#### -# Now read through all the openssl include files, and try to find the openssl -# macro names for those files. -openssl_macro_by_hex = {} -all_openssl_macros = {} -for fl in oSSLinclude: - fname = ossl("include/openssl/"+fl) - if not os.path.exists(fname): - continue - fp = open(fname, 'r') - for line in fp.readlines(): - m = re.match('# *define\s+(\S+)\s+(\S+)', line) - if m: - value,key = m.groups() - if key.startswith('0x') and "_CK_" in value: - key = key.replace('0x0300','0x').lower() - #print "%s %s" % (key, value) - openssl_macro_by_hex[key] = value - all_openssl_macros[value]=key - fp.close() - -# Now generate the output. -print """\ -/* This is an include file used to define the list of ciphers clients should - * advertise. Before including it, you should define the CIPHER and XCIPHER - * macros. - * - * This file was automatically generated by get_mozilla_ciphers.py. - */""" -# Go in order by the order in CipherPrefs -for firefox_macro in firefox_ciphers: - - try: - js_cipher_name = cipher_pref[firefox_macro] - except KeyError: - # This one has no javascript preference. - continue - - # The cipher needs to be enabled in security-prefs.js - if enabled_ciphers.get(js_cipher_name, 'false') != 'true': - continue - - hexval = sslProtoD[firefox_macro].lower() - - try: - openssl_macro = openssl_macro_by_hex[hexval.lower()] - openssl_macro = openssl_macro.replace("_CK_", "_TXT_") - if openssl_macro not in all_openssl_macros: - raise KeyError() - format = {'hex':hexval, 'macro':openssl_macro, 'note':""} - except KeyError: - # openssl doesn't have a macro for this. - format = {'hex':hexval, 'macro':firefox_macro, - 'note':"/* No openssl macro found for "+hexval+" */\n"} - - res = """\ -%(note)s#ifdef %(macro)s - CIPHER(%(hex)s, %(macro)s) -#else - XCIPHER(%(hex)s, %(macro)s) -#endif""" % format - print res diff --git a/src/tor/scripts/codegen/makedesc.py b/src/tor/scripts/codegen/makedesc.py deleted file mode 100644 index 8d9d4edaa..000000000 --- a/src/tor/scripts/codegen/makedesc.py +++ /dev/null @@ -1,351 +0,0 @@ -#!/usr/bin/python -# Copyright 2014-2017, The Tor Project, Inc. -# See LICENSE for license information - -# This is a kludgey python script that uses ctypes and openssl to sign -# router descriptors and extrainfo documents and put all the keys in -# the right places. There are examples at the end of the file. - -# I've used this to make inputs for unit tests. I wouldn't suggest -# using it for anything else. - -import base64 -import binascii -import ctypes -import ctypes.util -import hashlib -import optparse -import os -import re -import struct -import time -import UserDict - -import slow_ed25519 -import slownacl_curve25519 -import ed25519_exts_ref - -# Pull in the openssl stuff we need. - -crypt = ctypes.CDLL(ctypes.util.find_library('crypto')) -BIO_s_mem = crypt.BIO_s_mem -BIO_s_mem.argtypes = [] -BIO_s_mem.restype = ctypes.c_void_p - -BIO_new = crypt.BIO_new -BIO_new.argtypes = [ctypes.c_void_p] -BIO_new.restype = ctypes.c_void_p - -crypt.BIO_free.argtypes = [ctypes.c_void_p] -crypt.BIO_free.restype = ctypes.c_int - -crypt.BIO_ctrl.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_long, ctypes.c_void_p ] -crypt.BIO_ctrl.restype = ctypes.c_long - -crypt.PEM_write_bio_RSAPublicKey.argtypes = [ ctypes.c_void_p, ctypes.c_void_p ] -crypt.PEM_write_bio_RSAPublicKey.restype = ctypes.c_int - -RSA_generate_key = crypt.RSA_generate_key -RSA_generate_key.argtypes = [ctypes.c_int, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p] -RSA_generate_key.restype = ctypes.c_void_p - -RSA_private_encrypt = crypt.RSA_private_encrypt -RSA_private_encrypt.argtypes = [ - ctypes.c_int, ctypes.c_char_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int ] -RSA_private_encrypt.restype = ctypes.c_int - -i2d_RSAPublicKey = crypt.i2d_RSAPublicKey -i2d_RSAPublicKey.argtypes = [ - ctypes.c_void_p, ctypes.POINTER(ctypes.c_char_p) -] -i2d_RSAPublicKey.restype = ctypes.c_int - - -def rsa_sign(msg, rsa): - buf = ctypes.create_string_buffer(1024) - n = RSA_private_encrypt(len(msg), msg, buf, rsa, 1) - if n <= 0: - raise Exception() - return buf.raw[:n] - -def b64(x): - x = base64.b64encode(x) - res = [] - for i in xrange(0, len(x), 64): - res.append(x[i:i+64]+"\n") - return "".join(res) - -def bio_extract(bio): - buf = ctypes.c_char_p() - length = crypt.BIO_ctrl(bio, 3, 0, ctypes.byref(buf)) - return ctypes.string_at(buf, length) - -def make_rsa_key(e=65537): - rsa = crypt.RSA_generate_key(1024, e, None, None) - bio = BIO_new(BIO_s_mem()) - crypt.PEM_write_bio_RSAPublicKey(bio, rsa) - pem = bio_extract(bio).rstrip() - crypt.BIO_free(bio) - buf = ctypes.create_string_buffer(1024) - pBuf = ctypes.c_char_p(ctypes.addressof(buf)) - n = crypt.i2d_RSAPublicKey(rsa, ctypes.byref(pBuf)) - s = buf.raw[:n] - digest = hashlib.sha1(s).digest() - return (rsa,pem,digest) - -def makeEdSigningKeyCert(sk_master, pk_master, pk_signing, date, - includeSigning=False, certType=1): - assert len(pk_signing) == len(pk_master) == 32 - expiration = struct.pack("!L", date//3600) - if includeSigning: - extensions = "\x01\x00\x20\x04\x00%s"%(pk_master) - else: - extensions = "\x00" - signed = "\x01%s%s\x01%s%s" % ( - chr(certType), expiration, pk_signing, extensions) - signature = ed25519_exts_ref.signatureWithESK(signed, sk_master, pk_master) - assert len(signature) == 64 - return signed+signature - -def objwrap(identifier, body): - return ("-----BEGIN {0}-----\n" - "{1}" - "-----END {0}-----").format(identifier, body) - -MAGIC1 = "<<<<<>>>>>" -MAGIC2 = "<<<<>>>>" - -class OnDemandKeys(object): - def __init__(self, certDate=None): - if certDate is None: - certDate = time.time() + 86400 - self.certDate = certDate - self.rsa_id = None - self.rsa_onion_key = None - self.ed_id_sk = None - self.ntor_sk = None - self.ntor_crosscert = None - self.rsa_crosscert_ed = None - self.rsa_crosscert_noed = None - - @property - def RSA_IDENTITY(self): - if self.rsa_id is None: - self.rsa_id, self.rsa_ident_pem, self.rsa_id_digest = make_rsa_key() - - return self.rsa_ident_pem - - @property - def RSA_ID_DIGEST(self): - self.RSA_IDENTITY - return self.rsa_id_digest - - @property - def RSA_FINGERPRINT_NOSPACE(self): - return binascii.b2a_hex(self.RSA_ID_DIGEST).upper() - - @property - def RSA_ONION_KEY(self): - if self.rsa_onion_key is None: - self.rsa_onion_key, self.rsa_onion_pem, _ = make_rsa_key() - - return self.rsa_onion_pem - - @property - def RSA_FINGERPRINT(self): - hexdigest = self.RSA_FINGERPRINT_NOSPACEK - return " ".join(hexdigest[i:i+4] for i in range(0,len(hexdigest),4)) - - @property - def RSA_SIGNATURE(self): - return MAGIC1 - - @property - def ED_SIGNATURE(self): - return MAGIC2 - - @property - def NTOR_ONION_KEY(self): - if self.ntor_sk is None: - self.ntor_sk = slownacl_curve25519.Private() - self.ntor_pk = self.ntor_sk.get_public() - return base64.b64encode(self.ntor_pk.serialize()) - - @property - def ED_CERT(self): - if self.ed_id_sk is None: - self.ed_id_sk = ed25519_exts_ref.expandSK(os.urandom(32)) - self.ed_signing_sk = ed25519_exts_ref.expandSK(os.urandom(32)) - self.ed_id_pk = ed25519_exts_ref.publickeyFromESK(self.ed_id_sk) - self.ed_signing_pk = ed25519_exts_ref.publickeyFromESK(self.ed_signing_sk) - self.ed_cert = makeEdSigningKeyCert(self.ed_id_sk, self.ed_id_pk, self.ed_signing_pk, self.certDate, includeSigning=True, certType=4) - - return objwrap('ED25519 CERT', b64(self.ed_cert)) - - @property - def NTOR_CROSSCERT(self): - if self.ntor_crosscert is None: - self.ED_CERT - self.NTOR_ONION_KEY - - ed_privkey = self.ntor_sk.serialize() + os.urandom(32) - ed_pub0 = ed25519_exts_ref.publickeyFromESK(ed_privkey) - sign = (ord(ed_pub0[31]) & 255) >> 7 - - self.ntor_crosscert = makeEdSigningKeyCert(self.ntor_sk.serialize() + os.urandom(32), ed_pub0, self.ed_id_pk, self.certDate, certType=10) - self.ntor_crosscert_sign = sign - - return objwrap('ED25519 CERT', b64(self.ntor_crosscert)) - - @property - def NTOR_CROSSCERT_SIGN(self): - self.NTOR_CROSSCERT - return self.ntor_crosscert_sign - - @property - def RSA_CROSSCERT_NOED(self): - if self.rsa_crosscert_noed is None: - self.RSA_ONION_KEY - signed = self.RSA_ID_DIGEST - self.rsa_crosscert_noed = rsa_sign(signed, self.rsa_onion_key) - return objwrap("CROSSCERT",b64(self.rsa_crosscert_noed)) - - @property - def RSA_CROSSCERT_ED(self): - if self.rsa_crosscert_ed is None: - self.RSA_ONION_KEY - self.ED_CERT - signed = self.RSA_ID_DIGEST + self.ed_id_pk - self.rsa_crosscert_ed = rsa_sign(signed, self.rsa_onion_key) - return objwrap("CROSSCERT",b64(self.rsa_crosscert_ed)) - - def sign_desc(self, body): - idx = body.rfind("\nrouter-sig-ed25519 ") - if idx >= 0: - self.ED_CERT - signed_part = body[:idx+len("\nrouter-sig-ed25519 ")] - signed_part = "Tor router descriptor signature v1" + signed_part - digest = hashlib.sha256(signed_part).digest() - ed_sig = ed25519_exts_ref.signatureWithESK(digest, - self.ed_signing_sk, self.ed_signing_pk) - - body = body.replace(MAGIC2, base64.b64encode(ed_sig).replace("=","")) - - idx = body.rindex("\nrouter-signature") - end_of_sig = body.index("\n", idx+1) - - signed_part = body[:end_of_sig+1] - - digest = hashlib.sha1(signed_part).digest() - assert len(digest) == 20 - - rsasig = rsa_sign(digest, self.rsa_id) - - body = body.replace(MAGIC1, objwrap("SIGNATURE", b64(rsasig))) - - return body - - -def signdesc(body, args_out=None): - rsa, ident_pem, id_digest = make_key() - _, onion_pem, _ = make_key() - - need_ed = '{ED25519-CERT}' in body or '{ED25519-SIGNATURE}' in body - if need_ed: - sk_master = os.urandom(32) - sk_signing = os.urandom(32) - pk_master = slow_ed25519.pubkey(sk_master) - pk_signing = slow_ed25519.pubkey(sk_signing) - - hexdigest = binascii.b2a_hex(id_digest).upper() - fingerprint = " ".join(hexdigest[i:i+4] for i in range(0,len(hexdigest),4)) - - MAGIC = "<<<<<>>>>>" - MORE_MAGIC = "<<<<>>>>" - args = { - "RSA-IDENTITY" : ident_pem, - "ONION-KEY" : onion_pem, - "FINGERPRINT" : fingerprint, - "FINGERPRINT-NOSPACE" : hexdigest, - "RSA-SIGNATURE" : MAGIC - } - if need_ed: - args['ED25519-CERT'] = makeEdSigningKeyCert( - sk_master, pk_master, pk_signing) - args['ED25519-SIGNATURE'] = MORE_MAGIC - - if args_out: - args_out.update(args) - body = body.format(**args) - - idx = body.rindex("\nrouter-signature") - end_of_sig = body.index("\n", idx+1) - - signed_part = body[:end_of_sig+1] - - digest = hashlib.sha1(signed_part).digest() - assert len(digest) == 20 - - buf = ctypes.create_string_buffer(1024) - n = RSA_private_encrypt(20, digest, buf, rsa, 1) - sig = buf.raw[:n] - - sig = """-----BEGIN SIGNATURE----- -%s ------END SIGNATURE-----""" % b64(sig).rstrip() - body = body.replace(MAGIC, sig) - - return body.rstrip() - -def print_c_string(ident, body): - print "static const char %s[] =" % ident - for line in body.split("\n"): - print ' "%s\\n"' %(line) - print " ;" - -def emit_ri(name, body): - info = OnDemandKeys() - body = body.format(d=info) - body = info.sign_desc(body) - print_c_string("EX_RI_%s"%name.upper(), body) - -def emit_ei(name, body): - info = OnDemandKeys() - body = body.format(d=info) - body = info.sign_desc(body) - print_c_string("EX_EI_%s"%name.upper(), body) - - print 'const char EX_EI_{NAME}_FP[] = "{d.RSA_FINGERPRINT_NOSPACE}";'.format( - d=info, NAME=name.upper()) - print_c_string("EX_EI_%s_KEY"%name.upper(), info.RSA_IDENTITY) - -def analyze(s): - fields = {} - while s.startswith(":::"): - first,s=s.split("\n", 1) - m = re.match(r'^:::(\w+)=(.*)',first) - if not m: - raise ValueError(first) - k,v = m.groups() - fields[k] = v - return fields, s - -def process_file(s): - fields, s = analyze(s) - try: - name = fields['name'] - tp = fields['type'] - except KeyError: - raise ValueError("missing required field") - - if tp == 'ei': - emit_ei(name, s) - elif tp == 'ri': - emit_ri(name, s) - else: - raise ValueError("unrecognized type") - -if __name__ == '__main__': - import sys - for fn in sys.argv[1:]: - process_file(open(fn).read()) diff --git a/src/tor/scripts/codegen/run_trunnel.sh b/src/tor/scripts/codegen/run_trunnel.sh deleted file mode 100644 index 428804342..000000000 --- a/src/tor/scripts/codegen/run_trunnel.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -if test "x$TRUNNEL_PATH" != "x"; then - PYTHONPATH="${TRUNNEL_PATH}:${PYTHONPATH}" - export PYTHONPATH -fi - -OPTIONS="--require-version=1.5.1" - -# Get all .trunnel files recursively from that directory so we can support -# multiple sub-directories. -for file in `find ./src/trunnel/ -name '*.trunnel'`; do - python -m trunnel ${OPTIONS} $file -done - -python -m trunnel ${OPTIONS} --write-c-files --target-dir=./src/ext/trunnel/ - diff --git a/src/tor/scripts/maint/annotate_ifdef_directives b/src/tor/scripts/maint/annotate_ifdef_directives deleted file mode 100644 index 368d842e2..000000000 --- a/src/tor/scripts/maint/annotate_ifdef_directives +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/python -# Copyright (c) 2017, The Tor Project, Inc. -# See LICENSE for licensing information - -import re - -LINE_OBVIOUSNESS_LIMIT = 4 - -class Problem(Exception): - pass - -def uncomment(s): - s = re.sub(r'//.*','',s) - s = re.sub(r'/\*.*','',s) - return s.strip() - -def translate(f_in, f_out): - whole_file = [] - stack = [] - cur_level = whole_file - lineno = 0 - for line in f_in: - lineno += 1 - m = re.match(r'\s*#\s*(if|ifdef|ifndef|else|endif|elif)\b\s*(.*)', - line) - if not m: - f_out.write(line) - continue - command,rest = m.groups() - if command in ("if", "ifdef", "ifndef"): - # The #if directive pushes us one level lower on the stack. - if command == 'ifdef': - rest = "defined(%s)"%uncomment(rest) - elif command == 'ifndef': - rest = "!defined(%s)"%uncomment(rest) - elif rest.endswith("\\"): - rest = rest[:-1]+"..." - - rest = uncomment(rest) - - new_level = [ (command, rest, lineno) ] - stack.append(cur_level) - cur_level = new_level - f_out.write(line) - elif command in ("else", "elif"): - if len(cur_level) == 0 or cur_level[-1][0] == 'else': - raise Problem("Unexpected #%s on %d"% (command,lineno)) - if (len(cur_level) == 1 and command == 'else' and - lineno > cur_level[0][2] + LINE_OBVIOUSNESS_LIMIT): - f_out.write("#else /* !(%s) */\n"%cur_level[0][1]) - else: - f_out.write(line) - cur_level.append((command, rest, lineno)) - else: - assert command == 'endif' - if len(stack) == 0: - raise Problem("Unmatched #%s on %s"% (command,lineno)) - if lineno <= cur_level[0][2] + LINE_OBVIOUSNESS_LIMIT: - f_out.write(line) - elif len(cur_level) == 1 or ( - len(cur_level) == 2 and cur_level[1][0] == 'else'): - f_out.write("#endif /* %s */\n"%cur_level[0][1]) - else: - f_out.write("#endif /* %s || ... */\n"%cur_level[0][1]) - cur_level = stack.pop() - if len(stack) or cur_level != whole_file: - raise Problem("Missing #endif") - -import sys,os -for fn in sys.argv[1:]: - with open(fn+"_OUT", 'w') as output_file: - translate(open(fn, 'r'), output_file) - os.rename(fn+"_OUT", fn) - diff --git a/src/tor/scripts/maint/checkLogs.pl b/src/tor/scripts/maint/checkLogs.pl deleted file mode 100644 index b00503e9a..000000000 --- a/src/tor/scripts/maint/checkLogs.pl +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/perl -w - -use strict; - -my %count = (); -my $more = 0; -my $last = ""; - -while (<>) { - if ($more) { - if (/LD_BUG/) { - $more = 0; - next; - } - if (/\"((?:[^\"\\]+|\\.*)+)\"(.*)/) { - $last .= $1; - if ($2 !~ /[,\)]/) { - $more = 1; - } else { - $count{lc $last}++; - $more = 0; - } - } elsif (/[,\)]/) { - $count{lc $last}++; - $more = 0; - } elsif ($more == 2) { - print "SKIPPED more\n"; - } - } elsif (/log_(?:warn|err|notice)\(\s*(LD_[A-Z_]*)\s*,\s*\"((?:[^\"\\]+|\\.)*)\"(.*)/) { - next if ($1 eq 'LD_BUG'); - my $s = $2; - if ($3 =~ /[,\)]/ ) { - $count{lc $s}++; - } else { - $more = 1; - $last = $s; - } - } elsif (/log_(?:warn|err|notice)\(\s*((?:LD_[A-Z_]*)?)(.*)/) { - next if ($1 eq 'LD_BUG'); - my $extra = $2; - chomp $extra; - $last = ""; - $more = 2 if ($extra eq ''); - } -} - -while ((my $phrase, my $count) = each %count) { - if ($count > 1) { - print "$count\t$phrase\n"; - } -} diff --git a/src/tor/scripts/maint/checkOptionDocs.pl.in b/src/tor/scripts/maint/checkOptionDocs.pl.in deleted file mode 100644 index 1f53adf09..000000000 --- a/src/tor/scripts/maint/checkOptionDocs.pl.in +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/perl -w -use strict; - -my %options = (); -my %descOptions = (); -my %torrcSampleOptions = (); -my %manPageOptions = (); - -# Load the canonical list as actually accepted by Tor. -open(F, "@abs_top_builddir@/src/or/tor --list-torrc-options |") or die; -while () { - next if m!\[notice\] Tor v0\.!; - if (m!^([A-Za-z0-9_]+)!) { - $options{$1} = 1; - } else { - print "Unrecognized output> "; - print; - } -} -close F; - -# Load the contents of torrc.sample -sub loadTorrc { - my ($fname, $options) = @_; - local *F; - open(F, "$fname") or die; - while () { - next if (m!##+!); - if (m!#([A-Za-z0-9_]+)!) { - $options->{$1} = 1; - } - } - close F; - 0; -} - -loadTorrc("@abs_top_srcdir@/src/config/torrc.sample.in", \%torrcSampleOptions); - -# Try to figure out what's in the man page. - -my $considerNextLine = 0; -open(F, "@abs_top_srcdir@/doc/tor.1.txt") or die; -while () { - if (m!^(?:\[\[([A-za-z0-9_]+)\]\] *)?\*\*([A-Za-z0-9_]+)\*\*!) { - $manPageOptions{$2} = 1; - print "Missing an anchor: $2\n" unless (defined $1 or $2 eq 'tor'); - } -} -close F; - -# Now, display differences: - -sub subtractHashes { - my ($s, $a, $b) = @_; - my @lst = (); - for my $k (keys %$a) { - push @lst, $k unless (exists $b->{$k}); - } - print "$s: ", join(' ', sort @lst), "\n\n"; - 0; -} - -# subtractHashes("No online docs", \%options, \%descOptions); -# subtractHashes("Orphaned online docs", \%descOptions, \%options); - -subtractHashes("Orphaned in torrc.sample.in", \%torrcSampleOptions, \%options); - -subtractHashes("Not in man page", \%options, \%manPageOptions); -subtractHashes("Orphaned in man page", \%manPageOptions, \%options); diff --git a/src/tor/scripts/maint/checkSpace.pl b/src/tor/scripts/maint/checkSpace.pl deleted file mode 100644 index 9929932cc..000000000 --- a/src/tor/scripts/maint/checkSpace.pl +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -my $found = 0; -sub msg { - $found = 1; - print "$_[0]"; -} - -my $C = 0; - -if ($ARGV[0] =~ /^-/) { - my $lang = shift @ARGV; - $C = ($lang eq '-C'); -} - -for my $fn (@ARGV) { - open(F, "$fn"); - my $lastnil = 0; - my $lastline = ""; - my $incomment = 0; - my $in_func_head = 0; - while () { - ## Warn about windows-style newlines. - # (We insist on lines that end with a single LF character, not - # CR LF.) - if (/\r/) { - msg " CR:$fn:$.\n"; - } - ## Warn about tabs. - # (We only use spaces) - if (/\t/) { - msg " TAB:$fn:$.\n"; - } - ## Warn about labels that don't have a space in front of them - # (We indent every label at least one space) - if (/^[a-zA-Z_][a-zA-Z_0-9]*:/) { - msg "nosplabel:$fn:$.\n"; - } - ## Warn about trailing whitespace. - # (We don't allow whitespace at the end of the line; make your - # editor highlight it for you so you can stop adding it in.) - if (/ +$/) { - msg "Space\@EOL:$fn:$.\n"; - } - ## Warn about control keywords without following space. - # (We put a space after every 'if', 'while', 'for', 'switch', etc) - if ($C && /\s(?:if|while|for|switch)\(/) { - msg " KW(:$fn:$.\n"; - } - ## Warn about #else #if instead of #elif. - # (We only allow #elif) - if (($lastline =~ /^\# *else/) and ($_ =~ /^\# *if/)) { - msg " #else#if:$fn:$.\n"; - } - ## Warn about some K&R violations - # (We use K&R-style C, where open braces go on the same line as - # the statement that introduces them. In other words: - # if (a) { - # stuff; - # } else { - # other stuff; - # } - if (/^\s+\{/ and $lastline =~ /^\s*(if|while|for|else if)/ and - $lastline !~ /\{$/) { - msg "non-K&R {:$fn:$.\n"; - } - if (/^\s*else/ and $lastline =~ /\}$/) { - msg " }\\nelse:$fn:$.\n"; - } - $lastline = $_; - ## Warn about unnecessary empty lines. - # (Don't put an empty line before a line that contains nothing - # but a closing brace.) - if ($lastnil && /^\s*}\n/) { - msg " UnnecNL:$fn:$.\n"; - } - ## Warn about multiple empty lines. - # (At most one blank line in a row.) - if ($lastnil && /^$/) { - msg " DoubleNL:$fn:$.\n"; - } elsif (/^$/) { - $lastnil = 1; - } else { - $lastnil = 0; - } - ## Terminals are still 80 columns wide in my world. I refuse to - ## accept double-line lines. - # (Don't make lines wider than 80 characters, including newline.) - if (/^.{80}/) { - msg " Wide:$fn:$.\n"; - } - ### Juju to skip over comments and strings, since the tests - ### we're about to do are okay there. - if ($C) { - if ($incomment) { - if (m!\*/!) { - s!.*?\*/!!; - $incomment = 0; - } else { - next; - } - } - if (m!/\*.*?\*/!) { - s!\s*/\*.*?\*/!!; - } elsif (m!/\*!) { - s!\s*/\*!!; - $incomment = 1; - next; - } - s!"(?:[^\"]+|\\.)*"!"X"!g; - next if /^\#/; - ## Warn about C++-style comments. - # (Use C style comments only.) - if (m!//!) { - # msg " //:$fn:$.\n"; - s!//.*!!; - } - ## Warn about unquoted braces preceded by non-space. - # (No character except a space should come before a {) - if (/([^\s'])\{/) { - msg " $1\{:$fn:$.\n"; - } - ## Warn about double semi-colons at the end of a line. - if (/;;$/) { - msg " double semi-colons at the end of $. in $fn\n" - } - ## Warn about multiple internal spaces. - #if (/[^\s,:]\s{2,}[^\s\\=]/) { - # msg " X X:$fn:$.\n"; - #} - ## Warn about { with stuff after. - #s/\s+$//; - #if (/\{[^\}\\]+$/) { - # msg " {X:$fn:$.\n"; - #} - ## Warn about function calls with space before parens. - # (Don't put a space between the name of a function and its - # arguments.) - if (/(\w+)\s\(([A-Z]*)/) { - if ($1 ne "if" and $1 ne "while" and $1 ne "for" and - $1 ne "switch" and $1 ne "return" and $1 ne "int" and - $1 ne "elsif" and $1 ne "WINAPI" and $2 ne "WINAPI" and - $1 ne "void" and $1 ne "__attribute__" and $1 ne "op" and - $1 ne "size_t" and $1 ne "double" and $1 ne "uint64_t" and - $1 ne "workqueue_reply_t") { - msg " fn ():$fn:$.\n"; - } - } - ## Warn about functions not declared at start of line. - # (When you're declaring functions, put "static" and "const" - # and the return type on one line, and the function name at - # the start of a new line.) - if ($in_func_head || - ($fn !~ /\.h$/ && /^[a-zA-Z0-9_]/ && - ! /^(?:const |static )*(?:typedef|struct|union)[^\(]*$/ && - ! /= *\{$/ && ! /;$/)) { - if (/.\{$/){ - msg "fn() {:$fn:$.\n"; - $in_func_head = 0; - } elsif (/^\S[^\(]* +\**[a-zA-Z0-9_]+\(/) { - $in_func_head = -1; # started with tp fn - } elsif (/;$/) { - $in_func_head = 0; - } elsif (/\{/) { - if ($in_func_head == -1) { - msg "tp fn():$fn:$.\n"; - } - $in_func_head = 0; - } - } - - ## Check for forbidden functions except when they are - # explicitly permitted - if (/\bassert\(/ && not /assert OK/) { - msg "assert :$fn:$. (use tor_assert)\n"; - } - if (/\bmemcmp\(/ && not /memcmp OK/) { - msg "memcmp :$fn:$. (use {tor,fast}_mem{eq,neq,cmp}\n"; - } - # always forbidden. - if (not /\ OVERRIDE\ /) { - if (/\bstrcat\(/ or /\bstrcpy\(/ or /\bsprintf\(/) { - msg "$& :$fn:$.\n"; - } - if (/\bmalloc\(/ or /\bfree\(/ or /\brealloc\(/ or - /\bstrdup\(/ or /\bstrndup\(/ or /\bcalloc\(/) { - msg "$& :$fn:$. (use tor_malloc, tor_free, etc)\n"; - } - } - } - } - ## Warn if the file doesn't end with a blank line. - # (End each file with a single blank line.) - if (! $lastnil) { - msg " EOL\@EOF:$fn:$.\n"; - } - close(F); -} - -exit $found; diff --git a/src/tor/scripts/maint/check_config_macros.pl b/src/tor/scripts/maint/check_config_macros.pl deleted file mode 100644 index bcde2becc..000000000 --- a/src/tor/scripts/maint/check_config_macros.pl +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/perl -w - -use strict; - -my @macros = (); - -open(F, 'orconfig.h.in'); -while() { - if (/^#undef +([A-Za-z0-9_]*)/) { - push @macros, $1; - } -} -close F; - -for my $m (@macros) { - my $s = `git grep '$m' src`; - if ($s eq '') { - print "Unused: $m\n"; - } -} diff --git a/src/tor/scripts/maint/fallback.blacklist b/src/tor/scripts/maint/fallback.blacklist deleted file mode 100644 index 1417a13a9..000000000 --- a/src/tor/scripts/maint/fallback.blacklist +++ /dev/null @@ -1,274 +0,0 @@ -# updateFallbackDirs.py directory mirror blacklist -# -# Format: -# [ IPv4[:DirPort] ] [ orport= ] [ id= ] ... -# [ ipv6=[:] ] -# -# If a sufficiently specific group of attributes matches, the directory mirror -# will be excluded: (each group is listed on its own line) -# , -# , -# -# , -# , -# If DirPort and ORPort are not present, the entire IP address is blacklisted. -# (The blacklist overrides the whitelist.) - -# If a relay operator doesn't want their relay to be a FallbackDir, -# enter the following information here: -# : orport= id= ipv6=: - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008364.html -87.181.248.227:9030 orport=443 id=8827944C4BDCBDAC9079803F47823403C11A9B7A - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008368.html -149.18.2.82:9030 orport=9001 id=953DB709F2A2DECC8D7560661F934E64411444F7 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008384.html -80.82.215.199:80 orport=443 id=3BEFAB76461B6B99DCF34C285E933562F5712AE4 ipv6=[2001:4ba0:cafe:a18::1]:443 - -# Email sent directly to teor, verified using relay contact info -5.34.183.168:80 orport=443 id=601C92108A568742A7A6D9473FE3A414F7149070 -217.12.199.208:8080 orport=22 id=BCFB0933367D626715DA32A147F417194A5D48D6 - -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008555.html -62.210.207.124:9030 orport=9001 id=58938B1A5C4029B4415D38A4F36B7724273F4755 ipv6=[2001:bc8:31eb:100::1]:9001 -62.210.207.124:9130 orport=9101 id=338D0AB6DBAB7B529B9C91B2FD770658000693C4 ipv6=[2001:bc8:31eb:100::1]:9101 - -# these fallback candidates fail the consensus download test in a way that -# causes stem to hang (and not respond to ^C, at least on OS X) -# (Is something sending weird responses to DirPort traffic?) -#217.23.14.190:1194 -#151.80.164.147:80 -#148.251.255.92:80 -#78.142.19.59:80 - -# Email sent directly to teor, verified using relay contact info -216.17.99.183:80 orport=443 id=D52CD431CEF28E01B11F545A84347EE45524BCA7 -216.17.99.183:8080 orport=9001 id=EE21F83AB6F76E3B3FFCBA5C2496F789CB84E7C6 -65.19.167.130:80 orport=443 id=890E2EA65455FBF0FAAB4159FAC4412BDCB24295 -65.19.167.131:80 orport=443 id=0DA9BD201766EDB19F57F49F1A013A8A5432C008 -65.19.167.132:80 orport=443 id=12B80ABF019354A9D25EE8BE85EB3C0AD8F7DFC1 -65.19.167.133:80 orport=443 id=C170AE5A886C5A09D6D1CF5CF284653632EEF25D - -# Email sent directly to teor, verified using relay contact info -213.136.83.225:80 orport=443 id=B411027C926A9BFFCF7DA91E3CAF1856A321EFFD -195.154.126.78:80 orport=443 id=F6556156E2B3837248E03FDB770441CF64DBBFBE - -# Email sent directly to teor, verified using relay contact info -178.63.198.113:80 orport=443 id=872B18761953254914F77C71846E8A2623C52591 - -# Email sent directly to teor, verified using relay contact info -63.141.226.34:80 orport=9001 id=5EF131C0C82270F40B756987FDB5D54D9C966238 -185.75.56.103:80 orport=9001 id=3763CE5C3F574670D4296573744F821C0FFFB98E - -# Email sent directly to teor, verified using relay contact info -81.7.14.227:9030 orport=9001 id=BCA197C43A44B7B9D14509637F96A45B13C233D0 - -# Email sent directly to teor, verified using relay contact info -84.245.32.195:9030 orport=9001 id=4CD4DFFEF3971C902A22100D911CAC639BE2EF5C - -# Email sent directly to teor, verified using relay contact info -185.21.217.10:9030 orport=9001 id=41537E1D3DD3CAE86F5A3F0882F1C647FE8FC0A0 - -# Email sent directly to teor, verified using relay contact info -185.21.216.140:9030 orport=9001 id=921DA852C95141F8964B359F774B35502E489869 - -# Email sent directly to teor, verified using relay contact info -62.210.82.44:143 orport=21 id=1C90D3AEADFF3BCD079810632C8B85637924A58E ipv6=[2001:bc8:3d7c::]:21 - -# Email sent directly to teor, verified using relay contact info -46.101.220.161:80 orport=443 id=7DDFE5B2C306B19A79832FBE581EAA245BAE90C6 ipv6=[2a03:b0c0:3:d0::8b:3001]:443 - -# Email sent directly to teor, verified using relay contact info -195.154.107.23:80 orport=443 id=A1F89F26E82209169E4037B035AE7B6C94A49AEB ipv6=[2001:bc8:3829:300::1]:443 -195.154.92.70:80 orport=443 id=E7FF4ECEEFCFE3A40A6D3594898A4A3DE018BBF5 ipv6=[2001:bc8:3829:500::1]:443 -195.154.113.200:80 orport=443 id=D1A4763FA0BD71978901B1951FEE1DC29777F95A ipv6=[2001:bc8:3829:600::1]:443 -195.154.92.155:110 orport=993 id=4477D3466FE136B7FE6F7FF8EBD0D6E2FFE3288B ipv6=[2001:bc8:3829:100::1]:993 -195.154.117.182:110 orport=993 id=B1A0F1143789466AADD5FAE5948C8138548EECEC ipv6=[2001:bc8:3829:400::1]:993 -195.154.97.163:80 orport=443 id=8A2994A63B20813B7724817A8FB8C444D10BA2E2 - -# Email sent directly to teor, verified using relay contact info -5.135.154.206:9030 orport=9001 id=7D67B342DC1158F4CFFEE8BC530A2448848026E3 - -# Email sent directly to teor, verified using relay contact info -85.24.215.117:9030 orport=9001 id=5989521A85C94EE101E88B8DB2E68321673F9405 ipv6=[2001:9b0:20:2106:21a:4aff:fea5:ad05]:9001 - -# Email sent directly to teor, verified using relay contact info -62.210.137.230:8888 orport=8843 id=CD6B850159CFF4C068A8D0F1BA5296AE4EDCAB39 ipv6=[2001:bc8:31d3:100::1]:3443 -62.210.137.230:8080 orport=8443 id=F596E1B1EF98E1DDBBDC934DB722AF54069868F6 ipv6=[2001:bc8:31d3:100::1]:8443 - -# Email sent directly to teor, verified using relay contact info -195.154.99.80:80 orport=443 id=6E7CB6E783C1B67B79D0EBBE7D48BC09BD441201 -195.154.127.60:80 orport=443 id=D74ABE34845190E242EC74BA28B8C89B0A480D4B - -# Email sent directly to teor, verified using relay contact info -212.51.143.20:80 orport=443 id=62DA0256BBC28992D41CBAFB549FFD7C9B846A99 - -# Email sent directly to teor, verified using relay contact info -195.154.90.122:80 orport=443 id=3A0D88024A30152E6F6372CFDF8F9B725F984362 - -# Email sent directly to teor, verified using relay contact info -188.166.118.215:9030 orport=443 id=FB5FF60F5EBA010F8A45AC6ED31A4393718A2C31 ipv6=[2a03:b0c0:2:d0::72:9001]:443 - -# Email sent directly to teor, verified using relay contact info -185.87.185.245:40001 orport=40000 id=2A499AEEA95FB10F07544383D562368E49BE32CA - -# Email sent directly to teor, verified using relay contact info -82.161.109.71:9030 orport=9001 id=BD9CE352648B940E788A8E45393C5400CC3E87E7 - -# Email sent directly to teor, verified using relay contact info -212.83.40.239:9030 orport=9001 id=6DC5616BD3FC463329DCE87DD7AAAEA112C264B5 - -# Email sent directly to teor, verified using relay contact info -178.32.53.53:80 orport=443 id=10582C360E972EE76B0DB1C246F4E892A6BF5465 - -# Email sent directly to teor, verified using relay contact info -85.114.135.20:9030 orport=9001 id=ED8A9291A3139E34BBD35037B082081EC6C26C80 ipv6=[2001:4ba0:fff5:2d::8]:9001 -148.251.128.156:9030 orport=9001 id=E382042E06A0A68AFC533E5AD5FB6867A12DF9FF ipv6=[2a01:4f8:210:238a::8]:9001 -62.210.115.147:9030 orport=9001 id=7F1D94E2C36F8CC595C2AB00022A5AE38171D50B ipv6=[2001:bc8:3182:101::8]:9001 - -# Email sent directly to teor, verified using relay contact info -74.208.220.222:60000 orport=59999 id=4AA22235F0E9B3795A33930343CBB3EDAC60C5B0 - -# Email sent directly to teor, verified using relay contact info -89.163.140.168:9030 orport=9001 id=839C1212DB15723263BE96C83DA7E1B24FA395E8 - -# Email sent directly to teor, verified using relay contact info -212.47.246.211:9030 orport=9001 id=AA34219475E41282095DD3C088009EE562AF14E5 - -# Email sent directly to teor, verified using relay contact info -85.195.235.148:9030 orport=9001 id=103336165A0D2EFCAD3605339843A0A7710B8B92 -85.195.235.148:19030 orport=19001 id=713235638AB6C64715EAFD1B4772685E38AFD52A - -# Email sent directly to teor, verified using relay contact info -163.172.7.30:9030 orport=9001 id=E2EACD4752B2583202F374A34CACC844A3AECAC4 - -# Email sent directly to teor, verified using relay contact info -178.62.90.111:22 orport=25 id=3254D1DC1F1531D9C07C535E4991F38EE99B99E1 - -# Email sent directly to teor, verified using relay contact info -213.200.106.131:9030 orport=4443 id=B07CE79FD215129C381F6645B16E76DCA0845CAB - -# Email sent directly to teor, verified using relay contact info -198.51.75.165:80 orport=9001 id=DABCB84A524A22FDDD3AFCB090E3090CC12D9770 - -# Email sent directly to teor, verified using relay contact info -204.194.29.4:80 orport=9001 id=78C7C299DB4C4BD119A22B87B57D5AF5F3741A79 - -# Email sent directly to teor, verified using relay contact info -104.207.132.109:9030 orport=9001 id=12D5737383C23E756A7AA1A90BB24413BA428DA7 ipv6=[2001:19f0:300:2261::1]:9001 - -# Email sent directly to teor, verified using relay contact info -46.252.25.249:9030 orport=443 id=80DCBB6EF4E86A7CD4FBCBDEE64979645509A610 - -# Email sent directly to teor, verified using relay contact info -176.10.99.200:8080 orport=443 id=2B44FD1742D26E4F28D4CACF1F0CF8A686270E45 -176.10.99.200:8000 orport=22 id=EB79F07792A065D3C534063773E83268E069F5EB -176.10.99.201:667 orport=666 id=3EAAAB35932610411E24FA4317603CB5780B80BC -176.10.99.201:990 orport=989 id=7C3A4CFF09C1981D41173CDE2A2ADD4A5CA109FD -176.10.99.202:992 orport=991 id=615EBC4B48F03858FA50A3E23E5AF569D0D2308A -176.10.99.202:994 orport=993 id=E34E25D958D46DDE5092385B14117C9B301DC0E9 -176.10.99.203:1194 orport=995 id=AD368442E9FF33C08C7407DF2DA7DB958F406CE2 -176.10.99.203:43 orport=53 id=79CF377F0ACEC5F0002D85335E4192B34202A269 -176.10.99.204:1755 orport=1723 id=69DF3CDA1CDA460C17ECAD9D6F0C117A42384FA0 -176.10.99.204:1293 orport=4321 id=3F061400B6FB1F55E7F19BB3C713884D677E55B7 -176.10.99.205:426 orport=425 id=C30B284784BF11D0D58C6A250240EE58D2084AD0 -176.10.99.205:109 orport=110 id=12D17D9F9E30FA901DE68806950A0EA278716CED -176.10.99.206:24 orport=23 id=2C804AAB0C02F971A4386B3A1F2AC00F9E080679 -176.10.99.206:20 orport=21 id=237588726AB6BEA37FF23CA00F5BD178586CA68E -176.10.99.207:3390 orport=3389 id=A838D5B8890B10172429ECE92EB5677DF93DC4DD -176.10.99.207:1415 orport=1414 id=377E5E817A84FAE0F4DC3427805DB2E8A6CBBFC0 -176.10.99.208:390 orport=389 id=7C288587BA0D99CC6B8537CDC2C4639FA827B907 -176.10.99.208:3307 orport=3306 id=1F0D2A44C56F42816DED2022EFD631878C29905B -176.10.99.209:1434 orport=1433 id=BDA7A91FF3806DE5109FDAE74CFEFB3BABB9E10F -176.10.99.209:220 orport=219 id=B8C2030001D832066A648269CFBA94171951D34B - -# Email sent directly to teor, verified using relay contact info -78.193.40.205:8080 orport=8443 id=C91450840E75AC1B654A3096744338A573A239C6 - -# Email sent directly to teor, verified using relay contact info -37.187.22.172:9030 orport=9035 id=335E4117BD9A4966403C2AFA31CFDD1BC13BD46A - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008367.html -# Email sent directly to teor to opt-out -88.198.38.226:22 orport=443 id=4B9E2C56FB42B891794FE2CD2FCAD08A320CC3BB ipv6=[2a01:4f8:a0:1351::2]:80 -213.239.210.204:22 orport=443 id=5BFDECCE9B4A23AE14EC767C5A2C1E10558B00B9 ipv6=[2a01:4f8:a0:9474::2]:80 -213.239.220.25:22 orport=443 id=BEE2317AE127EB681C5AE1551C1EA0630580638A ipv6=[2a01:4f8:a0:710c::2]:80 -85.10.201.38:22 orport=443 id=F6279A203C1950ACF592322A235647A05BFBCF91 ipv6=[2a01:4f8:a0:43cc::2]:80 - -# Email sent directly to teor, verified using relay contact info -88.190.208.4:30555 orport=30556 id=030A6EB24725C05D8E0FCE21923CBA5223E75E0E - -# Fallback was on 0.2.8.2-alpha list, but changed fingerprint before 0.2.8.5 -46.101.102.71:80 orport=443 id=9504CB22EEB25D344DE63CB7A6F2C46F895C3686 ipv6=[2a03:b0c0:3:d0::2ed:7001]:9050 -# Also blacklist anything with the new fingerprint -id=9C8A123081EFBE022EF795630F447839DDFDDDEC - -# Fallbacks were on 0.2.8.2-alpha list, but downloads were slow before 0.2.8.5 -185.96.88.29:80 orport=443 id=86C281AD135058238D7A337D546C902BE8505DDE -178.62.36.64:9030 orport=9001 id=B87C84E38DAECFFFFDE98E5AEE5786AFDC748F2C - -# Fallback was on 0.2.8.2-alpha list, but changed address before 0.2.8.5 -84.219.173.60:9030 orport=443 id=855BC2DABE24C861CD887DB9B2E950424B49FC34 -# Also blacklist anything with the new address -84.216.235.55:9030 orport=443 - -# Fallbacks were on 0.2.8.2-alpha list, but disappeared before 0.2.8.5 -81.7.17.171:80 orport=443 id=CFECDDCA990E3EF7B7EC958B22441386B6B8D820 ipv6=[2a02:180:1:1::517:11ab]:443 -51.254.215.121:80 orport=443 id=262B66AD25C79588AD1FC8ED0E966395B47E5C1D -185.100.85.138:80 orport=46356 id=5C4DF16A0029CC4F67D3E127356E68F219269859 - -# Fallback was on 0.2.8.2-alpha list, but opted-out before 0.2.8.6 -37.187.1.149:9030 orport=9001 id=08DC0F3C6E3D9C527C1FC8745D35DD1B0DE1875D ipv6=[2001:41d0:a:195::1]:9001 - -# Email sent directly to teor, verified using relay contact info -195.154.15.227:9030 orport=9001 id=6C3E3AB2F5F03CD71B637D433BAD924A1ECC5796 - -# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9 -195.154.8.111:80 orport=443 id=FCB6695F8F2DC240E974510A4B3A0F2B12AB5B64 -# Same operator, not on 0.2.8.6 list, also changed IPv4 -51.255.235.246:80 orport=443 id=9B99C72B02AF8E3E5BE3596964F9CACD0090D132 - -# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9 -5.175.233.86:80 orport=443 id=5525D0429BFE5DC4F1B0E9DE47A4CFA169661E33 - -# Fallbacks were on 0.2.8.6 list, but went down before 0.2.9 -194.150.168.79:11112 orport=11111 id=29F1020B94BE25E6BE1AD13E93CE19D2131B487C -94.126.23.174:9030 orport=9001 id=6FC6F08270D565BE89B7C819DD8E2D487397C073 -195.191.233.221:80 orport=443 id=DE134FC8E5CC4EC8A5DE66934E70AC9D70267197 -176.31.180.157:143 orport=22 id=E781F4EC69671B3F1864AE2753E0890351506329 ipv6=[2001:41d0:8:eb9d::1]:22 - -# Fallback was on 0.2.8.6 list, but opted-out before 0.2.9 -144.76.73.140:9030 orport=9001 id=6A640018EABF3DA9BAD9321AA37C2C87BBE1F907 - -# https://lists.torproject.org/pipermail/tor-relays/2016-December/011114.html -# no dirport -86.107.110.34:0 orport=9001 id=A0E3D30A660DB70CA0B6D081BA54D094DED6F28D -94.242.59.147:80 orport=9001 id=674DCBB0D9C1C4C4DBFB4A9AE024AF59FE4E7F46 ipv6=[2a00:1838:35:42::b648]:9001 - -# Email sent directly to teor, verified using relay contact info -167.114.152.100:9030 orport=443 id=0EF5E5FFC5D1EABCBDA1AFF6F6D6325C5756B0B2 ipv6=[2607:5300:100:200::1608]:443 - -# Email sent directly to teor, verified using relay contact info -163.172.35.245:80 orport=443 id=B771AA877687F88E6F1CA5354756DF6C8A7B6B24 - -# Email sent directly to teor, verified using relay contact info -104.243.35.196:9030 orport=9001 id=FA3415659444AE006E7E9E5375E82F29700CFDFD - -# Relay changed IPv4 address, operator uncontactable -138.201.130.32:9030 orport=9001 id=52AEA31188331F421B2EDB494DB65CD181E5B257 - -# Emails sent directly to teor, verified using relay contact info -217.12.199.208:80 orport=443 id=DF3AED4322B1824BF5539AE54B2D1B38E080FF05 ipv6=[2a02:27a8:0:2::7e]:443 - -# Emails sent directly to teor, verified using relay contact info -195.154.75.84:9030 orport=9001 id=F80FDE27EFCB3F6A7B4E2CC517133DBFFA78BA2D -195.154.127.246:9030 orport=9001 id=4FEE77AFFD157BBCF2D896AE417FBF647860466C - -# Email sent directly to teor, verified using relay contact info -5.35.251.247:9030 orport=9001 id=9B1F5187DFBA89DC24B37EA7BF896C12B43A27AE - -#​https://lists.torproject.org/pipermail/tor-relays/2017-May/012281.html -62.210.124.124:9030 orport=9001 id=86E78DD3720C78DA8673182EF96C54B162CD660C ipv6=[2001:bc8:3f23:100::1]:9001 -62.210.124.124:9130 orport=9101 id=2EBD117806EE43C3CC885A8F1E4DC60F207E7D3E ipv6=[2001:bc8:3f23:100::1]:9101 diff --git a/src/tor/scripts/maint/fallback.whitelist b/src/tor/scripts/maint/fallback.whitelist deleted file mode 100644 index 0620d6b5f..000000000 --- a/src/tor/scripts/maint/fallback.whitelist +++ /dev/null @@ -1,829 +0,0 @@ -# updateFallbackDirs.py directory mirror whitelist -# -# Format: -# IPv4:DirPort orport= id= [ ipv6=: ] -# -# All attributes must match for the directory mirror to be included. -# If the fallback has an ipv6 key, the whitelist line must also have -# it, and vice versa, otherwise they don't match. -# (The blacklist overrides the whitelist.) - -# To replace this list with the hard-coded fallback list (for testing), use -# a command similar to: -# cat src/or/fallback_dirs.inc | grep \" | grep -v weight | tr -d '\n' | \ -# sed 's/"" / /g' | sed 's/""/"/g' | tr \" '\n' | grep -v '^$' \ -# > scripts/maint/fallback.whitelist -# -# When testing before a release, exclusions due to changed details will result -# in a warning, unless the IPv4 address or port change happened recently. -# Then it is only logged at info level, as part of the eligibility check. -# Exclusions due to stability also are only shown at info level. -# -# Add the number of selected, slow, and excluded relays, and compare that to -# the number of hard-coded relays. If it's less, use info-level logs to find -# out why each of the missing relays was excluded. - -# If a relay operator wants their relay to be a FallbackDir, -# enter the following information here: -# : orport= id= [ ipv6=: ] - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008362.html -78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE -131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008366.html -5.39.88.19:9030 orport=9001 id=7CB8C31432A796731EA7B6BF4025548DFEB25E0C ipv6=[2001:41d0:8:9a13::1]:9050 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008370.html -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008517.html -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008555.html -212.47.237.95:9030 orport=9001 id=3F5D8A879C58961BB45A3D26AC41B543B40236D6 -212.47.237.95:9130 orport=9101 id=6FB38EB22E57EF7ED5EF00238F6A48E553735D88 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008372.html -# IPv6 tunnel available on request (is this a good idea?) -108.53.208.157:80 orport=443 id=4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008373.html -167.114.35.28:9030 orport=9001 id=E65D300F11E1DB12C534B0146BDAB6972F1A8A48 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008378.html -144.76.14.145:110 orport=143 id=14419131033443AE6E21DA82B0D307F7CAE42BDB ipv6=[2a01:4f8:190:9490::dead]:443 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008379.html -# Email sent directly to teor, verified using relay contact info -91.121.84.137:4951 orport=4051 id=6DE61A6F72C1E5418A66BFED80DFB63E4C77668F ipv6=[2001:41d0:1:8989::1]:4051 -91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334 ipv6=[2001:41d0:1:8989::1]:4052 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008381.html -# Sent additional email to teor with more relays -178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422 -178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377 -178.254.20.134:9030 orport=9001 id=2CE96A8A1DA032664C90F574AFFBECE18A6E8DFC -178.254.44.135:80 orport=443 id=AE6A8C18E7499B586CD36246AC4BCAFFBBF93AB2 -178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE -178.254.13.126:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008382.html -51.255.33.237:9091 orport=9001 id=A360C21FA87FFA2046D92C17086A6B47E5C68109 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008383.html -81.7.14.246:80 orport=443 id=CE75BF0972ADD52AF8807602374E495C815DB304 ipv6=[2a02:180:a:51::dead]:443 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008384.html -# Sent additional email to teor with fingerprint change -149.202.98.161:80 orport=443 id=FC64CD763F8C1A319BFBBF62551684F4E1E42332 ipv6=[2001:41d0:8:4528::161]:443 -193.111.136.162:80 orport=443 id=C79552275DFCD486B942510EF663ED36ACA1A84B ipv6=[2001:4ba0:cafe:10d0::1]:443 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008416.html -185.100.84.212:80 orport=443 id=330CD3DB6AD266DC70CDB512B036957D03D9BC59 ipv6=[2a06:1700:0:7::1]:443 - -# https://lists.torproject.org/pipermail/tor-relays/2015-December/008417.html -178.16.208.56:80 orport=443 id=2CDCFED0142B28B002E89D305CBA2E26063FADE2 ipv6=[2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec]:443 -178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443 - -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008513.html -178.62.173.203:9030 orport=9001 id=DD85503F2D1F52EF9EAD621E942298F46CD2FC10 ipv6=[2a03:b0c0:0:1010::a4:b001]:9001 - -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008534.html -5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB ipv6=[2a01:4f8:162:51e2::2]:9001 - -# https://lists.torproject.org/pipermail/tor-relays/2016-January/008542.html -178.62.199.226:80 orport=443 id=CBEFF7BA4A4062045133C053F2D70524D8BBE5BE ipv6=[2a03:b0c0:2:d0::b7:5001]:443 - -# Email sent directly to teor, verified using relay contact info -94.23.204.175:9030 orport=9001 id=5665A3904C89E22E971305EE8C1997BCA4123C69 - -# Email sent directly to teor, verified using relay contact info -171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A ipv6=[2001:67c:289c:3::77]:443 -171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE ipv6=[2001:67c:289c:3::78]:443 -171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576 -171.25.193.20:80 orport=443 id=DD8BD7307017407FCC36F8D04A688F74A0774C02 ipv6=[2001:67c:289c::20]:443 -# OK, but same machine as 79861CF8522FC637EF046F7688F5289E49D94576 -#171.25.193.132:80 orport=443 id=01C67E0CA8F97111E652C7564CB3204361FFFAB8 -# OK, but same machine as DD8BD7307017407FCC36F8D04A688F74A0774C02 -#171.25.193.25:80 orport=443 id=185663B7C12777F052B2C2D23D7A239D8DA88A0F ipv6=[2001:67c:289c::25]:443 - -# Email sent directly to teor, verified using relay contact info -212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68 ipv6=[2001:bc8:4400:2100::f03]:9001 -93.115.97.242:9030 orport=9001 id=B5212DB685A2A0FCFBAE425738E478D12361710D -46.28.109.231:9030 orport=9001 id=F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610 ipv6=[2a02:2b88:2:1::4205:1]:9001 - -# Email sent directly to teor, verified using relay contact info -85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE -185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216 - -# Email sent directly to teor, verified using relay contact info -185.11.180.67:80 orport=9001 id=794D8EA8343A4E820320265D05D4FA83AB6D1778 - -# Email sent directly to teor, verified using relay contact info -178.16.208.62:80 orport=443 id=5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B ipv6=[2a00:1c20:4089:1234:a6a4:2926:d0af:dfee]:443 -46.165.221.166:80 orport=443 id=EE5F897C752D46BCFF531641B853FC6BC78DD4A7 -178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443 -178.16.208.55:80 orport=443 id=C4AEA05CF380BAD2230F193E083B8869B4A29937 ipv6=[2a00:1c20:4089:1234:7b2c:11c5:5221:903e]:443 -178.16.208.61:80 orport=443 id=3B52392E2256C35CDCF7801FF898FC88CE6D431A ipv6=[2a00:1c20:4089:1234:2712:a3d0:666b:88a6]:443 -81.89.96.88:80 orport=443 id=55ED4BB49F6D3F36D8D9499BE43500E017A5EF82 ipv6=[2a02:180:1:1:14c5:b0b7:2d7d:5f3a]:443 -209.222.8.196:80 orport=443 id=C86D2F3DEFE287A0EEB28D4887AF14E35C172733 ipv6=[2001:19f0:1620:41c1:426c:5adf:2ed5:4e88]:443 -81.89.96.89:80 orport=443 id=28651F419F5A1CF74511BB500C58112192DD4943 ipv6=[2a02:180:1:1:2ced:24e:32ea:a03b]:443 -46.165.221.166:9030 orport=9001 id=8C7106C880FE8AA1319DD71B59623FCB8914C9F1 -178.16.208.62:80 orport=443 id=5CF8AFA5E4B0BB88942A44A3F3AAE08C3BDFD60B ipv6=[2a00:1c20:4089:1234:a6a4:2926:d0af:dfee]:443" -46.165.221.166:80 orport=443 id=EE5F897C752D46BCFF531641B853FC6BC78DD4A7 -178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443 -178.16.208.55:80 orport=443 id=C4AEA05CF380BAD2230F193E083B8869B4A29937 ipv6=[2a00:1c20:4089:1234:7b2c:11c5:5221:903e]:443 -178.16.208.61:80 orport=443 id=3B52392E2256C35CDCF7801FF898FC88CE6D431A ipv6=[2a00:1c20:4089:1234:2712:a3d0:666b:88a6]:443 -81.89.96.88:80 orport=443 id=55ED4BB49F6D3F36D8D9499BE43500E017A5EF82 ipv6=[2a02:180:1:1:14c5:b0b7:2d7d:5f3a]:443 -209.222.8.196:80 orport=443 id=C86D2F3DEFE287A0EEB28D4887AF14E35C172733 ipv6=[2001:19f0:1620:41c1:426c:5adf:2ed5:4e88]:443 -81.89.96.89:80 orport=443 id=28651F419F5A1CF74511BB500C58112192DD4943 ipv6=[2a02:180:1:1:2ced:24e:32ea:a03b]:443 -46.165.221.166:9030 orport=9001 id=8C7106C880FE8AA1319DD71B59623FCB8914C9F1 -178.16.208.56:80 orport=443 id=2CDCFED0142B28B002E89D305CBA2E26063FADE2 ipv6=[2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec]:443 -178.16.208.58:80 orport=443 id=A4C98CEA3F34E05299417E9F885A642C88EF6029 ipv6=[2a00:1c20:4089:1234:cdae:1b3e:cc38:3d45]:443 -178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443 -178.16.208.59:80 orport=443 id=136F9299A5009A4E0E96494E723BDB556FB0A26B ipv6=[2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6]:443 - -# Email sent directly to teor, verified using relay contact info -5.39.76.158:80 orport=443 id=C41F60F8B00E7FEF5CCC5BC6BB514CA1B8AAB651 - -# Email sent directly to teor, verified using relay contact info -109.163.234.2:80 orport=443 id=14F92FF956105932E9DEC5B82A7778A0B1BD9A52 -109.163.234.4:80 orport=443 id=4888770464F0E900EFEF1BA181EA873D13F7713C -109.163.234.5:80 orport=443 id=5EB8D862E70981B8690DEDEF546789E26AB2BD24 -109.163.234.7:80 orport=443 id=23038A7F2845EBA2234ECD6651BD4A7762F51B18 -109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281 -109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9 -62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF -77.247.181.162:80 orport=443 id=7BB160A8F54BD74F3DA5F2CE701E8772B841859D -77.247.181.164:80 orport=443 id=10E13E340651D0EF66B4DEBF610B3C0981168107 -77.247.181.166:80 orport=443 id=06E123865C590189B3181114F23F0F13A7BC0E69 - -# https://twitter.com/biotimylated/status/718994247500718080 -212.47.252.149:9030 orport=9001 id=2CAC39BAA996791CEFAADC9D4754D65AF5EB77C0 - -# Email sent directly to teor, verified using relay contact info -46.165.230.5:80 orport=443 id=A0F06C2FADF88D3A39AA3072B406F09D7095AC9E - -# Email sent directly to teor, verified using relay contact info -94.242.246.24:23 orport=8080 id=EC116BCB80565A408CE67F8EC3FE3B0B02C3A065 ipv6=[2a01:608:ffff:ff07::1:24]:9004 -176.126.252.11:443 orport=9001 id=B0279A521375F3CB2AE210BDBFC645FDD2E1973A ipv6=[2a02:59e0:0:7::11]:9003 -176.126.252.12:21 orport=8080 id=379FB450010D17078B3766C2273303C358C3A442 ipv6=[2a02:59e0:0:7::12]:81 -94.242.246.23:443 orport=9001 id=F65E0196C94DFFF48AFBF2F5F9E3E19AAE583FD0 ipv6=[2a01:608:ffff:ff07::1:23]:9003 -85.248.227.164:444 orport=9002 id=B84F248233FEA90CAD439F292556A3139F6E1B82 ipv6=[2a00:1298:8011:212::164]:9004 -85.248.227.163:443 orport=9001 id=C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9 ipv6=[2a00:1298:8011:212::163]:9003 - -# Email sent directly to teor, verified using relay contact info -148.251.190.229:9030 orport=9010 id=BF0FB582E37F738CD33C3651125F2772705BB8E8 ipv6=[2a01:4f8:211:c68::2]:9010 - -# Email sent directly to teor, verified using relay contact info -5.79.68.161:81 orport=443 id=9030DCF419F6E2FBF84F63CBACBA0097B06F557E ipv6=[2001:1af8:4700:a012:1::1]:443 -5.79.68.161:9030 orport=9001 id=B7EC0C02D7D9F1E31B0C251A6B058880778A0CD1 ipv6=[2001:1af8:4700:a012:1::1]:9001 - -# Email sent directly to teor, verified using relay contact info -62.210.92.11:9030 orport=9001 id=0266B0660F3F20A7D1F3D8335931C95EF50F6C6B ipv6=[2001:bc8:338c::1]:9001 -62.210.92.11:9130 orport=9101 id=387B065A38E4DAA16D9D41C2964ECBC4B31D30FF ipv6=[2001:bc8:338c::1]:9101 - -# Email sent directly to teor, verified using relay contact info -188.165.194.195:9030 orport=9001 id=49E7AD01BB96F6FE3AB8C3B15BD2470B150354DF - -# Message sent directly to teor, verified using relay contact info -95.215.44.110:80 orport=443 id=D56AA4A1AA71961F5279FB70A6DCF7AD7B993EB5 -95.215.44.122:80 orport=443 id=998D8FE06B867AA3F8D257A7D28FFF16964D53E2 -95.215.44.111:80 orport=443 id=A7C7FD510B20BC8BE8F2A1D911364E1A23FBD09F - -# Email sent directly to teor, verified using relay contact info -86.59.119.88:80 orport=443 id=ACD889D86E02EDDAB1AFD81F598C0936238DC6D0 -86.59.119.83:80 orport=443 id=FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B - -# Email sent directly to teor, verified using relay contact info -193.11.164.243:9030 orport=9001 id=FFA72BD683BC2FCF988356E6BEC1E490F313FB07 ipv6=[2001:6b0:7:125::243]:9001 -109.105.109.162:52860 orport=60784 id=32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F ipv6=[2001:948:7:2::163]:5001 - -# Email sent directly to teor, verified using relay contact info -146.0.32.144:9030 orport=9001 id=35E8B344F661F4F2E68B17648F35798B44672D7E - -# Email sent directly to teor, verified using relay contact info -46.252.26.2:45212 orport=49991 id=E589316576A399C511A9781A73DA4545640B479D - -# Email sent directly to teor, verified using relay contact info -89.187.142.208:80 orport=443 id=64186650FFE4469EBBE52B644AE543864D32F43C - -# Email sent directly to teor, verified using relay contact info -212.51.134.123:9030 orport=9001 id=50586E25BE067FD1F739998550EDDCB1A14CA5B2 ipv6=[2a02:168:6e00:0:3a60:77ff:fe9c:8bd1]:9001 - -# Email sent directly to teor, verified using relay contact info -46.101.143.173:80 orport=443 id=F960DF50F0FD4075AC9B505C1D4FFC8384C490FB - -# Email sent directly to teor, verified using relay contact info -217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B - -# Email sent directly to teor, verified using relay contact info -193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524 - -# Email sent directly to teor, verified using relay contact info -197.231.221.211:9030 orport=9001 id=BC630CBBB518BE7E9F4E09712AB0269E9DC7D626 - -# Email sent directly to teor, verified using relay contact info -185.61.138.18:8080 orport=4443 id=2541759BEC04D37811C2209A88E863320271EC9C - -# Email sent directly to teor, verified using relay contact info -193.11.114.45:9031 orport=9002 id=80AAF8D5956A43C197104CEF2550CD42D165C6FB -193.11.114.43:9030 orport=9001 id=12AD30E5D25AA67F519780E2111E611A455FDC89 ipv6=[2001:6b0:30:1000::99]:9050 -193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E - -# Email sent directly to teor, verified using relay contact info -144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510 - -# Email sent directly to teor, verified using relay contact info -37.221.162.226:9030 orport=9001 id=D64366987CB39F61AD21DBCF8142FA0577B92811 - -# Email sent directly to teor, verified using relay contact info -91.219.237.244:80 orport=443 id=92ECC9E0E2AF81BB954719B189AC362E254AD4A5 - -# Email sent directly to teor, verified using relay contact info -185.21.100.50:9030 orport=9001 id=58ED9C9C35E433EE58764D62892B4FFD518A3CD0 ipv6=[2a00:1158:2:cd00:0:74:6f:72]:443 - -# Email sent directly to teor, verified using relay contact info -193.35.52.53:9030 orport=9001 id=DAA39FC00B196B353C2A271459C305C429AF09E4 - -# Email sent directly to teor, verified using relay contact info -134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE - -# Email sent directly to teor, verified using relay contact info -81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7 - -# Email sent directly to teor, verified using relay contact info -178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1 ipv6=[2a03:b0c0:1:d0::174:1]:9050 -188.166.23.127:80 orport=443 id=8672E8A01B4D3FA4C0BBE21C740D4506302EA487 ipv6=[2a03:b0c0:2:d0::27b:7001]:9050 -198.199.64.217:80 orport=443 id=B1D81825CFD7209BD1B4520B040EF5653C204A23 ipv6=[2604:a880:400:d0::1a9:b001]:9050 -159.203.32.149:80 orport=443 id=55C7554AFCEC1062DCBAC93E67B2E03C6F330EFC ipv6=[2604:a880:cad:d0::105:f001]:9050 - -# Email sent directly to teor, verified using relay contact info -5.196.31.80:9030 orport=9900 id=DFB2EB472643FAFCD5E73D2E37D51DB67203A695 ipv6=[2001:41d0:52:400::a65]:9900 - -# Email sent directly to teor, verified using relay contact info -188.138.112.60:1433 orport=1521 id=C414F28FD2BEC1553024299B31D4E726BEB8E788 - -# Email sent directly to teor, verified using relay contact info -213.61.66.118:9031 orport=9001 id=30648BC64CEDB3020F4A405E4AB2A6347FB8FA22 -213.61.66.117:9032 orport=9002 id=6E44A52E3D1FF7683FE5C399C3FB5E912DE1C6B4 -213.61.66.115:9034 orport=9004 id=480CCC94CEA04D2DEABC0D7373868E245D4C2AE2 -213.61.66.116:9033 orport=9003 id=A9DEB920B42B4EC1DE6249034039B06D61F38690 - -# Email sent directly to teor, verified using relay contact info -136.243.187.165:9030 orport=443 id=1AC65257D7BFDE7341046625470809693A8ED83E - -# Email sent directly to teor, verified using relay contact info -212.47.230.49:9030 orport=9001 id=3D6D0771E54056AEFC28BB1DE816951F11826E97 - -# Email sent directly to teor, verified using relay contact info -192.99.55.69:80 orport=443 id=0682DE15222A4A4A0D67DBA72A8132161992C023 -192.99.59.140:80 orport=443 id=3C9148DA49F20654730FAC83FFF693A4D49D0244 -51.254.215.13:80 orport=443 id=73C30C8ABDD6D9346C822966DE73B9F82CB6178A -51.254.215.129:80 orport=443 id=7B4491D05144B20AE8519AE784B94F0525A8BB79 -192.99.59.139:80 orport=443 id=82EC878ADA7C205146B9F5193A7310867FAA0D7B -51.254.215.124:80 orport=443 id=98999EBE89B5FA9AA0C58421F0B46C3D0AF51CBA -51.254.214.208:80 orport=443 id=C3F0D1417848EAFC41277A73DEB4A9F2AEC23DDF -192.99.59.141:80 orport=443 id=F45426551795B9DA78BEDB05CD5F2EACED8132E4 -192.99.59.14:80 orport=443 id=161A1B29A37EBF096D2F8A9B1E176D6487FE42AE - -# Email sent directly to teor, verified using relay contact info -151.80.42.103:9030 orport=9001 id=9007C1D8E4F03D506A4A011B907A9E8D04E3C605 ipv6=[2001:41d0:e:f67::114]:9001 - -# Email sent directly to teor, verified using relay contact info -5.39.92.199:80 orport=443 id=0BEA4A88D069753218EAAAD6D22EA87B9A1319D6 ipv6=[2001:41d0:8:b1c7::1]:443 - -# Email sent directly to teor, verified using relay contact info -176.31.159.231:80 orport=443 id=D5DBCC0B4F029F80C7B8D33F20CF7D97F0423BB1 -176.31.159.230:80 orport=443 id=631748AFB41104D77ADBB7E5CD4F8E8AE876E683 -195.154.79.128:80 orport=443 id=C697612CA5AED06B8D829FCC6065B9287212CB2F -195.154.9.161:80 orport=443 id=B6295A9960F89BD0C743EEBC5670450EA6A34685 -46.148.18.74:8080 orport=443 id=6CACF0B5F03C779672F3C5C295F37C8D234CA3F7 - -# Email sent directly to teor, verified using relay contact info -37.187.102.108:9090 orport=5550 id=F4263275CF54A6836EE7BD527B1328836A6F06E1 -212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C - -# Email sent directly to teor, verified using relay contact info -212.129.38.254:9030 orport=9001 id=FDF845FC159C0020E2BDDA120C30C5C5038F74B4 - -# Email sent directly to teor, verified using relay contact info -37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2 - -# Email sent directly to teor, verified using relay contact info -37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05 ipv6=[2001:41d0:a:74a::1]:443 - -# Email sent directly to teor, verified using relay contact info -185.66.250.141:9030 orport=9001 id=B1726B94885CE3AC3910CA8B60622B97B98E2529 - -# Email sent directly to teor, verified using relay contact info -185.104.120.7:9030 orport=443 id=445F1C853966624FB3CF1E12442570DC553CC2EC ipv6=[2a06:3000::120:7]:443 -185.104.120.2:9030 orport=21 id=518FF8708698E1DA09C823C36D35DF89A2CAD956 -185.104.120.4:9030 orport=9001 id=F92B3CB9BBE0CB22409843FB1AE4DBCD5EFAC835 -185.104.120.3:9030 orport=21 id=707C1B61AC72227B34487B56D04BAA3BA1179CE8 ipv6=[2a06:3000::120:3]:21 - -# Email sent directly to teor, verified using relay contact info -37.187.102.186:9030 orport=9001 id=489D94333DF66D57FFE34D9D59CC2D97E2CB0053 ipv6=[2001:41d0:a:26ba::1]:9001 - -# Email sent directly to teor, verified using relay contact info -198.96.155.3:8080 orport=5001 id=BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E - -# Email sent directly to teor, verified using relay contact info -212.83.154.33:8888 orport=443 id=3C79699D4FBC37DE1A212D5033B56DAE079AC0EF -212.83.154.33:8080 orport=8443 id=322C6E3A973BC10FC36DE3037AD27BC89F14723B - -# Email sent directly to teor, verified using relay contact info -51.255.41.65:9030 orport=9001 id=9231DF741915AA1630031A93026D88726877E93A - -# Email sent directly to teor, verified using relay contact info -78.142.142.246:80 orport=443 id=5A5E03355C1908EBF424CAF1F3ED70782C0D2F74 - -# Email sent directly to teor, verified using relay contact info -195.154.97.91:80 orport=443 id=BD33C50D50DCA2A46AAED54CA319A1EFEBF5D714 - -# Email sent directly to teor, verified using relay contact info -62.210.129.246:80 orport=443 id=79E169B25E4C7CE99584F6ED06F379478F23E2B8 - -# Email sent directly to teor, verified using relay contact info -5.196.74.215:9030 orport=9001 id=5818055DFBAF0FA7F67E8125FD63E3E7F88E28F6 - -# Email sent directly to teor, verified using relay contact info -212.47.233.86:9030 orport=9001 id=B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20 - -# Email sent directly to teor, verified using relay contact info -85.214.206.219:9030 orport=9001 id=98F8D5F359949E41DE8DF3DBB1975A86E96A84A0 - -# Email sent directly to teor, verified using relay contact info -46.166.170.4:80 orport=443 id=19F42DB047B72C7507F939F5AEA5CD1FA4656205 -46.166.170.5:80 orport=443 id=DA705AD4591E7B4708FA2CAC3D53E81962F3E6F6 - -# Email sent directly to teor, verified using relay contact info -5.189.157.56:80 orport=443 id=77F6D6A6B6EAFB8F5DADDC07A918BBF378ED6725 - -# Email sent directly to teor, verified using relay contact info -46.28.110.244:80 orport=443 id=9F7D6E6420183C2B76D3CE99624EBC98A21A967E -185.13.39.197:80 orport=443 id=001524DD403D729F08F7E5D77813EF12756CFA8D -95.130.12.119:80 orport=443 id=587E0A9552E4274B251F29B5B2673D38442EE4BF - -# Email sent directly to teor, verified using relay contact info -212.129.62.232:80 orport=443 id=B143D439B72D239A419F8DCE07B8A8EB1B486FA7 - -# Email sent directly to teor, verified using relay contact info -91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7 - -# Email sent directly to teor, verified using relay contact info -212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB -# Ok, but on the same machine as 2A4C448784F5A83AFE6C78DA357D5E31F7989DEB -#212.47.240.10:81 orport=993 id=72527E3242CB15AADE28374AE0D35833FC083F60 -163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE ipv6=[2001:bc8:4400:2100::2:1009]:443 -# Ok, but on the same machine as AD253B49E303C6AB1E048B014392AC569E8A7DAE -#163.172.131.88:81 orport=993 id=D5F3FB17504744FB7ECEF46F4B1D155258A6D942 ipv6=[2001:bc8:4400:2100::2:1009]:993 - -# Email sent directly to teor, verified using relay contact info -46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8 -178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794 - -# Email sent directly to teor, verified using relay contact info -178.62.197.82:80 orport=443 id=0D3EBA17E1C78F1E9900BABDB23861D46FCAF163 - -# Email sent directly to teor, verified using relay contact info -82.223.21.74:9030 orport=9001 id=7A32C9519D80CA458FC8B034A28F5F6815649A98 ipv6=[2001:470:53e0::cafe]:9050 - -# Email sent directly to teor, verified using relay contact info -146.185.177.103:80 orport=9030 id=9EC5E097663862DF861A18C32B37C5F82284B27D - -# Email sent directly to teor, verified using relay contact info -37.187.22.87:9030 orport=9001 id=36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400 ipv6=[2001:41d0:a:1657::1]:9001 - -# Email sent directly to teor, verified using relay contact info -37.59.46.159:9030 orport=9001 id=CBD0D1BD110EC52963082D839AC6A89D0AE243E7 - -# Email sent directly to teor, verified using relay contact info -212.47.250.243:9030 orport=9001 id=5B33EDBAEA92F446768B3753549F3B813836D477 -# Confirm with operator before adding these -#163.172.133.36:9030 orport=9001 id=D8C2BD36F01FA86F4401848A0928C4CB7E5FDFF9 -#158.69.216.70:9030 orport=9001 id=0ACE25A978D4422C742D6BC6345896719BF6A7EB - -# Email sent directly to teor, verified using relay contact info -5.199.142.236:9030 orport=9001 id=F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265 - -# Email sent directly to teor, verified using relay contact info -188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7 ipv6=[2a03:b0c0:2:d0::5:f001]:9001 - -# Email sent directly to teor, verified using relay contact info -46.8.249.10:80 orport=443 id=31670150090A7C3513CB7914B9610E786391A95D - -# Email sent directly to teor, verified using relay contact info -144.76.163.93:9030 orport=9001 id=22F08CF09764C4E8982640D77F71ED72FF26A9AC - -# Email sent directly to teor, verified using relay contact info -46.4.24.161:9030 orport=9001 id=DB4C76A3AD7E234DA0F00D6F1405D8AFDF4D8DED -46.4.24.161:9031 orport=9002 id=7460F3D12EBE861E4EE073F6233047AACFE46AB4 -46.38.51.132:9030 orport=9001 id=810DEFA7E90B6C6C383C063028EC397A71D7214A -163.172.194.53:9030 orport=9001 id=8C00FA7369A7A308F6A137600F0FA07990D9D451 ipv6=[2001:bc8:225f:142:6c69:7461:7669:73]:9001 - -# Email sent directly to teor, verified using relay contact info -176.10.107.180:9030 orport=9001 id=3D7E274A87D9A89AF064C13D1EE4CA1F184F2600 - -# Email sent directly to teor, verified using relay contact info -46.28.207.19:80 orport=443 id=5B92FA5C8A49D46D235735504C72DBB3472BA321 -46.28.207.141:80 orport=443 id=F69BED36177ED727706512BA6A97755025EEA0FB -46.28.205.170:80 orport=443 id=AF322D83A4D2048B22F7F1AF5F38AFF4D09D0B76 -95.183.48.12:80 orport=443 id=7187CED1A3871F837D0E60AC98F374AC541CB0DA - -# Email sent directly to teor, verified using relay contact info -93.180.156.84:9030 orport=9001 id=8844D87E9B038BE3270938F05AF797E1D3C74C0F - -# Email sent directly to teor, verified using relay contact info -37.187.115.157:9030 orport=9001 id=D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A - -# Email sent directly to teor, verified using relay contact info -5.34.183.205:80 orport=443 id=DDD7871C1B7FA32CB55061E08869A236E61BDDF8 - -# Email sent directly to teor, verified using relay contact info -51.254.246.203:9030 orport=9001 id=47B596B81C9E6277B98623A84B7629798A16E8D5 - -# Email sent directly to teor, verified using relay contact info -5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11 - -# Email sent directly to teor, verified using relay contact info -# Updated details from atlas based on ticket #20010 -163.172.176.167:80 orport=443 id=230A8B2A8BA861210D9B4BA97745AEC217A94207 -163.172.149.155:80 orport=443 id=0B85617241252517E8ECF2CFC7F4C1A32DCD153F -163.172.149.122:80 orport=443 id=A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2 - -# Email sent directly to teor, verified using relay contact info -204.11.50.131:9030 orport=9001 id=185F2A57B0C4620582602761097D17DB81654F70 - -# Email sent directly to teor, verified using relay contact info -151.236.222.217:44607 orport=9001 id=94D58704C2589C130C9C39ED148BD8EA468DBA54 - -# Email sent directly to teor, verified using relay contact info -185.35.202.221:9030 orport=9001 id=C13B91384CDD52A871E3ECECE4EF74A7AC7DCB08 ipv6=[2a02:ed06::221]:9001 - -# Email sent directly to teor, verified using relay contact info -5.9.151.241:9030 orport=4223 id=9BF04559224F0F1C3C953D641F1744AF0192543A ipv6=[2a01:4f8:190:34f0::2]:4223 - -# Email sent directly to teor, verified using relay contact info -89.40.71.149:8081 orport=8080 id=EC639EDAA5121B47DBDF3D6B01A22E48A8CB6CC7 - -# Email sent directly to teor, verified using relay contact info -92.222.20.130:80 orport=443 id=0639612FF149AA19DF3BCEA147E5B8FED6F3C87C - -# Email sent directly to teor, verified using relay contact info -80.112.155.100:9030 orport=9001 id=53B000310984CD86AF47E5F3CD0BFF184E34B383 ipv6=[2001:470:7b02::38]:9001 - -# Email sent directly to teor, verified using relay contact info -83.212.99.68:80 orport=443 id=DDBB2A38252ADDA53E4492DDF982CA6CC6E10EC0 ipv6=[2001:648:2ffc:1225:a800:bff:fe3d:67b5]:443 - -# Email sent directly to teor, verified using relay contact info -95.130.11.147:9030 orport=443 id=6B697F3FF04C26123466A5C0E5D1F8D91925967A - -# Email sent directly to teor, verified using relay contact info -176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C - -# Email sent directly to teor, verified using relay contact info -128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5 ipv6=[2a03:b0c0:2:d0::158:3001]:9001 - -# Email sent directly to teor, verified using relay contact info -178.32.216.146:9030 orport=9001 id=17898F9A2EBC7D69DAF87C00A1BD2FABF3C9E1D2 - -# Email sent directly to teor, verified using relay contact info -212.83.40.238:9030 orport=9001 id=F409FA7902FD89270E8DE0D7977EA23BC38E5887 - -# Email sent directly to teor, verified using relay contact info -204.8.156.142:80 orport=443 id=94C4B7B8C50C86A92B6A20107539EE2678CF9A28 - -# Email sent directly to teor, verified using relay contact info -80.240.139.111:80 orport=443 id=DD3BE7382C221F31723C7B294310EF9282B9111B - -# Email sent directly to teor, verified using relay contact info -185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088 - -# Email sent directly to teor, verified using relay contact info -149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76 - -# Email sent directly to teor, verified using relay contact info -81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243 ipv6=[2001:15e8:201:1::d10a]:80 - -# Email sent directly to teor, verified using relay contact info -# IPv6 address unreliable -195.154.164.243:80 orport=443 id=AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C #ipv6=[2001:bc8:399f:f000::1]:993 -138.201.26.2:80 orport=443 id=6D3A3ED5671E4E3F58D4951438B10AE552A5FA0F -81.7.16.182:80 orport=443 id=51E1CF613FD6F9F11FE24743C91D6F9981807D82 ipv6=[2a02:180:1:1::517:10b6]:993 -134.119.36.135:80 orport=443 id=763C9556602BD6207771A7A3D958091D44C43228 ipv6=[2a00:1158:3::2a8]:993 -46.228.199.19:80 orport=443 id=E26AFC5F718E21AC502899B20C653AEFF688B0D2 ipv6=[2001:4ba0:cafe:4a::1]:993 -37.200.98.5:80 orport=443 id=231C2B9C8C31C295C472D031E06964834B745996 ipv6=[2a00:1158:3::11a]:993 -46.23.70.195:80 orport=443 id=C9933B3725239B6FAB5227BA33B30BE7B48BB485 -185.15.244.124:80 orport=443 id=935BABE2564F82016C19AEF63C0C40B5753BA3D2 ipv6=[2001:4ba0:cafe:e35::1]:993 -195.154.116.232:80 orport=443 id=B35C5739C8C5AB72094EB2B05738FD1F8EEF6EBD ipv6=[2001:bc8:399f:200::1]:993 -195.154.121.198:80 orport=443 id=0C77421C890D16B6D201283A2244F43DF5BC89DD ipv6=[2001:bc8:399f:100::1]:993 -37.187.20.59:80 orport=443 id=91D23D8A539B83D2FB56AA67ECD4D75CC093AC55 ipv6=[2001:41d0:a:143b::1]:993 -217.12.208.117:80 orport=443 id=E6E18151300F90C235D3809F90B31330737CEB43 ipv6=[2a00:1ca8:a7::1bb]:993 -81.7.10.251:80 orport=443 id=8073670F8F852971298F8AF2C5B23AE012645901 ipv6=[2a02:180:1:1::517:afb]:993 -46.36.39.50:80 orport=443 id=ED4B0DBA79AEF5521564FA0231455DCFDDE73BB6 ipv6=[2a02:25b0:aaaa:aaaa:8d49:b692:4852:0]:995 -91.194.90.103:80 orport=443 id=75C4495F4D80522CA6F6A3FB349F1B009563F4B7 ipv6=[2a02:c205:3000:5449::1]:993 -163.172.25.118:80 orport=22 id=0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F -188.138.88.42:80 orport=443 id=70C55A114C0EF3DC5784A4FAEE64388434A3398F -81.7.13.84:80 orport=443 id=0C1E7DD9ED0676C788933F68A9985ED853CA5812 ipv6=[2a02:180:1:1::5b8f:538c]:993 -213.246.56.95:80 orport=443 id=27E6E8E19C46751E7312420723C6162FF3356A4C ipv6=[2a00:c70:1:213:246:56:95:1]:993 -94.198.100.18:80 orport=443 id=BAACCB29197DB833F107E410E2BFAE5009EE7583 -217.12.203.46:80 orport=443 id=6A29FD8C00D573E6C1D47852345B0E5275BA3307 -212.117.180.107:80 orport=443 id=0B454C7EBA58657B91133A587C1BDAEDC6E23142 -217.12.199.190:80 orport=443 id=A37C47B03FF31CA6937D3D68366B157997FE7BCD ipv6=[2a02:27a8:0:2::486]:993 -216.230.230.247:80 orport=443 id=4C7BF55B1BFF47993DFF995A2926C89C81E4F04A -69.30.215.42:80 orport=443 id=510176C07005D47B23E6796F02C93241A29AA0E9 ipv6=[2604:4300:a:2e::2]:993 -89.46.100.162:80 orport=443 id=6B7191639E179965FD694612C9B2C8FB4267B27D -107.181.174.22:80 orport=443 id=5A551BF2E46BF26CC50A983F7435CB749C752553 ipv6=[2607:f7a0:3:4::4e]:993 - -# Email sent directly to teor, verified using relay contact info -212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109 ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001 - -# Email sent directly to teor, verified using relay contact info -176.158.132.12:9030 orport=9001 id=DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686 - -# Email sent directly to teor, verified using relay contact info -91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F - -# Email sent directly to teor, verified using relay contact info -80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621 ipv6=[2001:981:47c1:1::6]:443 - -# Email sent directly to teor, verified using relay contact info -163.172.138.22:80 orport=443 id=8664DC892540F3C789DB37008236C096C871734D ipv6=[2001:bc8:4400:2100::1:3]:443 - -# Email sent directly to teor, verified using relay contact info -97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94 - -# Email sent directly to teor, verified using relay contact info -192.187.124.98:9030 orport=9001 id=FD1871854BFC06D7B02F10742073069F0528B5CC - -# Email sent directly to teor, verified using relay contact info -178.62.98.160:9030 orport=9001 id=8B92044763E880996A988831B15B2B0E5AD1544A - -# Email sent directly to teor, verified using relay contact info -163.172.217.50:9030 orport=9001 id=02ECD99ECD596013A8134D46531560816ECC4BE6 - -# Email sent directly to teor, verified using relay contact info -185.100.86.100:80 orport=443 id=0E8C0C8315B66DB5F703804B3889A1DD66C67CE0 -185.100.84.82:80 orport=443 id=7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E - -# Email sent directly to teor, verified using relay contact info -164.132.77.175:9030 orport=9001 id=3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B -78.24.75.53:9030 orport=9001 id=DEB73705B2929AE9BE87091607388939332EF123 - -# Email sent directly to teor, verified using relay contact info -46.101.237.246:9030 orport=9001 id=75F1992FD3F403E9C082A5815EB5D12934CDF46C ipv6=[2a03:b0c0:3:d0::208:5001]:9050 -178.62.86.96:9030 orport=9001 id=439D0447772CB107B886F7782DBC201FA26B92D1 ipv6=[2a03:b0c0:1:d0::3cf:7001]:9050 - -# Email sent directly to teor, verified using relay contact info -# Very low bandwidth, stale consensues, excluded to cut down on warnings -#91.233.106.121:80 orport=443 id=896364B7996F5DFBA0E15D1A2E06D0B98B555DD6 - -# Email sent directly to teor, verified using relay contact info -167.114.113.48:9030 orport=403 id=2EC0C66EA700C44670444280AABAB1EC78B722A0 - -# Email sent directly to teor, verified using relay contact info -79.120.16.42:9030 orport=9001 id=BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6 - -# Email sent directly to teor, verified using relay contact info -95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90 ipv6=[2a02:ec0:209:10::4]:443 - -# Email sent directly to teor, verified using relay contact info -166.82.21.200:9030 orport=9029 id=D5C33F3E203728EDF8361EA868B2939CCC43FAFB - -# Email sent directly to teor, verified using relay contact info -91.121.54.8:9030 orport=9001 id=CBEE0F3303C8C50462A12107CA2AE061831931BC - -# Email sent directly to teor, verified using relay contact info -178.217.184.32:8080 orport=443 id=8B7F47AE1A5D954A3E58ACDE0865D09DBA5B738D - -# Email sent directly to teor, verified using relay contact info -85.10.201.47:9030 orport=9001 id=D8B7A3A6542AA54D0946B9DC0257C53B6C376679 ipv6=[2a01:4f8:a0:43eb::beef]:9001 - -# Email sent directly to teor, verified using relay contact info -120.29.217.46:80 orport=443 id=5E853C94AB1F655E9C908924370A0A6707508C62 - -# Email sent directly to teor, verified using relay contact info -37.153.1.10:9030 orport=9001 id=9772EFB535397C942C3AB8804FB35CFFAD012438 - -# Email sent directly to teor, verified using relay contact info -92.222.4.102:9030 orport=9001 id=1A6B8B8272632D8AD38442027F822A367128405C - -# Email sent directly to teor, verified using relay contact info -31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798 - -# Email sent directly to teor, verified using relay contact info -96.47.231.214:9030 orport=8080 id=F843CB5729575D76FF1FFBB2179BDCF52C0C6387 -192.99.246.48:9030 orport=9001 id=CD6B149BED1BB254EF6DFF9D75DDB11E7F8A38A4 ipv6=[2607:5300:100:200::de3]:9002 -192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F ipv6=[2605:e200:d00c:c01d::1111]:9002 - -# Email sent directly to teor, verified using relay contact info -136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664 - -# Email sent directly to teor, verified using relay contact info -192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024 -192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7 - -# Email sent directly to teor, verified using relay contact info -192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024 -# OK, but same machine as ED2338CAC2711B3E331392E1ED2831219B794024 -#192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7 - -# https://twitter.com/kosjoli/status/719507270904758272 -85.10.202.87:9030 orport=9001 id=971AFB23C168DCD8EDA17473C1C452B359DE3A5A -176.9.5.116:9030 orport=9001 id=A1EB8D8F1EE28DB98BBB1EAA3B4BEDD303BAB911 -46.4.111.124:9030 orport=9001 id=D9065F9E57899B3D272AA212317AF61A9B14D204 - -# Email sent directly to teor, verified using relay contact info -185.100.85.61:80 orport=443 id=025B66CEBC070FCB0519D206CF0CF4965C20C96E - -# Email sent directly to teor, verified using relay contact info -108.166.168.158:80 orport=443 id=CDAB3AE06A8C9C6BF817B3B0F1877A4B91465699 - -# Email sent directly to teor, verified using relay contact info -91.219.236.222:80 orport=443 id=20704E7DD51501DC303FA51B738D7B7E61397CF6 - -# Email sent directly to teor, verified using relay contact info -185.14.185.240:9030 orport=443 id=D62FB817B0288085FAC38A6DC8B36DCD85B70260 -192.34.63.137:9030 orport=443 id=ABCB4965F1FEE193602B50A365425105C889D3F8 -128.199.197.16:9030 orport=443 id=DEE5298B3BA18CDE651421CD2DCB34A4A69F224D - -# Email sent directly to teor, verified using relay contact info -185.13.38.75:9030 orport=9001 id=D2A1703758A0FBBA026988B92C2F88BAB59F9361 - -# Email sent directly to teor, verified using relay contact info -128.204.39.106:9030 orport=9001 id=6F0F3C09AF9580F7606B34A7678238B3AF7A57B7 - -# Email sent directly to teor, verified using relay contact info -198.50.191.95:80 orport=443 id=39F096961ED2576975C866D450373A9913AFDC92 - -# Email sent directly to teor, verified using relay contact info -167.114.66.61:9696 orport=443 id=DE6CD5F09DF26076F26321B0BDFBE78ACD935C65 ipv6=[2607:5300:100::78d]:443 - -# Email sent directly to teor, verified using relay contact info -66.111.2.20:9030 orport=9001 id=9A68B85A02318F4E7E87F2828039FBD5D75B0142 -66.111.2.16:9030 orport=9001 id=3F092986E9B87D3FDA09B71FA3A602378285C77A - -# Email sent directly to teor, verified using relay contact info -92.222.38.67:80 orport=443 id=DED6892FF89DBD737BA689698A171B2392EB3E82 - -# Email sent directly to teor, verified using relay contact info -212.47.228.115:9030 orport=443 id=BCA017ACDA48330D02BB70716639ED565493E36E - -# Email sent directly to teor, verified using relay contact info -185.100.84.175:80 orport=443 id=39B59AF4FE54FAD8C5085FA9C15FDF23087250DB - -# Email sent directly to teor, verified using relay contact info -166.70.207.2:9030 orport=9001 id=E3DB2E354B883B59E8DC56B3E7A353DDFD457812 - -# Emails sent directly to teor, verified using relay contact info -69.162.139.9:9030 orport=9001 id=4791FC0692EAB60DF2BCCAFF940B95B74E7654F6 ipv6=[2607:f128:40:1212::45a2:8b09]:9001 - -# Email sent directly to teor, verified using relay contact info -213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2 ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337 - -# Email sent directly to teor, verified using relay contact info -188.40.128.246:9030 orport=9001 id=AD19490C7DBB26D3A68EFC824F67E69B0A96E601 - -# Email sent directly to teor, verified using relay contact info -88.198.253.13:9030 orport=9001 id=DF924196D69AAE3C00C115A9CCDF7BB62A175310 ipv6=[2a01:4f8:11a:b1f::2]:9001 - -# Email sent directly to teor, verified using relay contact info -185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883 -46.36.36.127:9030 orport=9001 id=C80DF89B21FF932DEC0D7821F679B6C79E1449C3 - -# Email sent directly to teor, verified using relay contact info -176.10.104.240:80 orport=443 id=0111BA9B604669E636FFD5B503F382A4B7AD6E80 -176.10.104.240:8080 orport=8443 id=AD86CD1A49573D52A7B6F4A35750F161AAD89C88 -176.10.104.243:80 orport=443 id=88487BDD980BF6E72092EE690E8C51C0AA4A538C -176.10.104.243:8080 orport=8443 id=95DA61AEF23A6C851028C1AA88AD8593F659E60F - -# Email sent directly to teor, verified using relay contact info -107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA - -# Email sent directly to teor, verified using relay contact info -192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC - -# Email sent directly to teor, verified using relay contact info -163.172.35.249:80 orport=443 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A -163.172.35.247:80 orport=443 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4 - -# Email sent directly to teor, verified using relay contact info -64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2 - -# Email sent directly to teor, verified using relay contact info -212.51.156.193:995 orport=110 id=32E7AAF1F602814D699BEF6761AD03E387758D49 ipv6=[2a02:168:4a01::49]:110 - -# Emails sent directly to teor, verified using relay contact info -51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF - -# Emails sent directly to teor, verified using relay contact info -85.214.62.48:80 orport=443 id=6A7551EEE18F78A9813096E82BF84F740D32B911 - -# Email sent directly to teor, verified using relay contact info -173.255.245.116:9030 orport=9001 id=91E4015E1F82DAF0121D62267E54A1F661AB6DC7 - -# Email sent directly to teor, verified using relay contact info -62.216.5.120:9030 orport=9001 id=D032D4D617140D6B828FC7C4334860E45E414FBE - -# Email sent directly to teor, verified using relay contact info -51.254.136.195:80 orport=443 id=7BB70F8585DFC27E75D692970C0EEB0F22983A63 - -# Email sent directly to teor, verified using relay contact info -163.172.13.165:9030 orport=9001 id=33DA0CAB7C27812EFF2E22C9705630A54D101FEB ipv6=[2001:bc8:38cb:201::8]:9001 - -# Email sent directly to teor, verified using relay contact info -5.196.88.122:9030 orport=9001 id=0C2C599AFCB26F5CFC2C7592435924C1D63D9484 ipv6=[2001:41d0:a:fb7a::1]:9001 - -# Email sent directly to teor, verified using relay contact info -5.9.158.75:80 orport=443 id=1AF72E8906E6C49481A791A6F8F84F8DFEBBB2BA ipv6=[2a01:4f8:190:514a::2]:443 - -# Email sent directly to teor, verified using relay contact info -46.101.169.151:9030 orport=9001 id=D760C5B436E42F93D77EF2D969157EEA14F9B39C ipv6=[2a03:b0c0:3:d0::74f:a001]:9001 - -# Email sent directly to teor, verified using relay contact info -199.249.223.81:80 orport=443 id=F7447E99EB5CBD4D5EB913EE0E35AC642B5C1EF3 -199.249.223.79:80 orport=443 id=D33292FEDE24DD40F2385283E55C87F85C0943B6 -199.249.223.78:80 orport=443 id=EC15DB62D9101481F364DE52EB8313C838BDDC29 -199.249.223.77:80 orport=443 id=CC4A3AE960E3617F49BF9887B79186C14CBA6813 -199.249.223.76:80 orport=443 id=43209F6D50C657A56FE79AF01CA69F9EF19BD338 -199.249.223.75:80 orport=443 id=60D3667F56AEC5C69CF7E8F557DB21DDF6C36060 -199.249.223.74:80 orport=443 id=5F4CD12099AF20FAF9ADFDCEC65316A376D0201C -199.249.223.73:80 orport=443 id=5649CB2158DA94FB747415F26628BEC07FA57616 -199.249.223.72:80 orport=443 id=B028707969D8ED84E6DEA597A884F78AAD471971 -199.249.223.71:80 orport=443 id=B6320E44A230302C7BF9319E67597A9B87882241 -199.249.223.60:80 orport=443 id=B7047FBDE9C53C39011CA84E5CB2A8E3543066D0 -199.249.223.61:80 orport=443 id=40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD -199.249.223.62:80 orport=443 id=0077BCBA7244DB3E6A5ED2746E86170066684887 -199.249.223.63:80 orport=443 id=1DB25DF59DAA01B5BE3D3CEB8AFED115940EBE8B -199.249.223.64:80 orport=443 id=9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A -199.249.223.65:80 orport=443 id=9D21F034C3BFF4E7737D08CF775DC1745706801F -199.249.223.66:80 orport=443 id=C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2 -199.249.223.67:80 orport=443 id=155D6F57425F16C0624D77777641E4EB1B47C6F0 -199.249.223.68:80 orport=443 id=DF20497E487A979995D851A5BCEC313DF7E5BC51 -199.249.223.69:80 orport=443 id=7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3 - -# https://lists.torproject.org/pipermail/tor-relays/2016-December/011114.html -86.105.212.130:9030 orport=443 id=9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022 - -# Email sent directly to teor, verified using relay contact info -178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB ipv6=[2001:41d0:2:a683::251]:443 - -# Email sent directly to teor, verified using relay contact info -#31.185.104.19:80 orport=443 id=9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D -# OK, but on same machine as 9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D -31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D -#31.185.104.21:80 orport=443 id=C2AAB088555850FC434E68943F551072042B85F1 -#31.185.104.22:80 orport=443 id=5BA3A52760A0EABF7E7C3ED3048A77328FF0F148 - -# Email sent directly to teor, verified using relay contact info -185.34.60.114:80 orport=443 id=7F7A695DF6F2B8640A70B6ADD01105BC2EBC5135 - -# Email sent directly to teor, verified using relay contact info -94.142.242.84:80 orport=443 id=AA0D167E03E298F9A8CD50F448B81FBD7FA80D56 ipv6=[2a02:898:24:84::1]:443 - -# Email sent directly to teor, verified using relay contact info -185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F ipv6=[2a06:d380:0:3700::62]:9001 - -# Email sent directly to teor, verified using relay contact info -# The e84 part of the IPv6 address does not have a leading 0 in the consensus -81.30.158.213:9030 orport=9001 id=789EA6C9AE9ADDD8760903171CFA9AC5741B0C70 ipv6=[2001:4ba0:cafe:e84::1]:9001 - -# https://lists.torproject.org/pipermail/tor-relays/2016-December/011209.html -5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797 - -# Email sent directly to teor, verified using relay contact info -45.62.255.25:80 orport=443 id=3473ED788D9E63361D1572B7E82EC54338953D2A - -# Email sent directly to teor, verified using relay contact info -217.79.179.177:9030 orport=9001 id=3E53D3979DB07EFD736661C934A1DED14127B684 ipv6=[2001:4ba0:fff9:131:6c4f::90d3]:9001 - -# Email sent directly to teor, verified using relay contact info -212.47.244.38:8080 orport=443 id=E81EF60A73B3809F8964F73766B01BAA0A171E20 -163.172.157.213:8080 orport=443 id=4623A9EC53BFD83155929E56D6F7B55B5E718C24 -163.172.139.104:8080 orport=443 id=68F175CCABE727AA2D2309BCD8789499CEE36ED7 - -# Email sent directly to teor, verified using relay contact info -163.172.223.200:80 orport=443 id=998BF3ED7F70E33D1C307247B9626D9E7573C438 -195.154.122.54:80 orport=443 id=64E99CB34C595A02A3165484BD1215E7389322C6 - -# Email sent directly to teor, verified using relay contact info -185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883 -185.100.85.101:9030 orport=9001 id=4061C553CA88021B8302F0814365070AAE617270 -31.171.155.108:9030 orport=9001 id=D3E5EDDBE5159388704D6785BE51930AAFACEC6F - -# Email sent directly to teor, verified using relay contact info -89.163.247.43:9030 orport=9001 id=BC7ACFAC04854C77167C7D66B7E471314ED8C410 ipv6=[2001:4ba0:fff7:25::5]:9001 - -# Email sent directly to teor, verified using relay contact info -95.85.8.226:80 orport=443 id=1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423 - -# Email sent directly to teor, verified using relay contact info -85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812 - -# Email sent directly to teor, verified using relay contact info -72.52.75.27:9030 orport=9001 id=1220F0F20E80D348244C5F3B6D126DAA0A446DFD - -# Email sent directly to teor, verified using relay contact info -5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11 -5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797 - -# Email sent directly to teor, verified using relay contact info -5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2 diff --git a/src/tor/scripts/maint/findMergedChanges.pl b/src/tor/scripts/maint/findMergedChanges.pl deleted file mode 100644 index d6c4105b7..000000000 --- a/src/tor/scripts/maint/findMergedChanges.pl +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl - -use warnings; -use strict; - -sub nChanges { - my ($branches, $fname) = @_; - local *F; - # requires perl 5.8. Avoids shell issues if we ever get a changes - # file named by the parents of Little Johnny Tables. - open F, "-|", "git", "log", "--no-merges", "--pretty=format:%H", $branches, "--", $fname - or die "$!"; - my @changes = ; - return scalar @changes -} - -my $look_for_type = "merged"; - -if (! @ARGV) { - print <] changes/* - -A change is "merged" if it has ever been merged to release-0.2.4 and it has had -no subsequent changes in master. - -A change is "unmerged" if it has never been merged to release-0.2.4 and it -has had changes in master. - -A change is "weird" if it has been merged to release-0.2.4 and it *has* had -subsequent changes in master. - -Suggested application: - findMergedChanges.pl --merged changes/* | xargs -n 1 git rm - -EOF -} - -my $target_branch = "origin/release-0.2.4"; -my $head = "origin/master"; - -while (@ARGV and $ARGV[0] =~ /^--/) { - my $flag = shift @ARGV; - if ($flag =~ /^--(weird|merged|unmerged|list)/) { - $look_for_type = $1; - } elsif ($flag =~ /^--branch=(\S+)/) { - $target_branch = $1; - } elsif ($flag =~ /^--head=(\S+)/) { - $head = $1; - } else { - die "Unrecognized flag $flag"; - } -} - -for my $changefile (@ARGV) { - my $n_merged = nChanges($target_branch, $changefile); - my $n_postmerged = nChanges("${target_branch}..${head}", $changefile); - my $type; - - if ($n_merged != 0 and $n_postmerged == 0) { - $type = "merged"; - } elsif ($n_merged == 0 and $n_postmerged != 0) { - $type = "unmerged"; - } else { - $type = "weird"; - } - - if ($type eq $look_for_type) { - print "$changefile\n"; - } elsif ($look_for_type eq 'list') { - printf "% 8s: %s\n", $type, $changefile; - } -} diff --git a/src/tor/scripts/maint/format_changelog.py b/src/tor/scripts/maint/format_changelog.py deleted file mode 100644 index c5a0cfc81..000000000 --- a/src/tor/scripts/maint/format_changelog.py +++ /dev/null @@ -1,569 +0,0 @@ -#!/usr/bin/python -# Copyright (c) 2014-2017, The Tor Project, Inc. -# See LICENSE for licensing information -# -# This script reformats a section of the changelog to wrap everything to -# the right width and put blank lines in the right places. Eventually, -# it might include a linter. -# -# To run it, pipe a section of the changelog (starting with "Changes -# in Tor 0.x.y.z-alpha" through the script.) - -import os -import re -import sys -import optparse - -# ============================== -# Oh, look! It's a cruddy approximation to Knuth's elegant text wrapping -# algorithm, with totally ad hoc parameters! -# -# We're trying to minimize: -# The total of the cubes of ragged space on underflowed intermediate lines, -# PLUS -# 100 * the fourth power of overflowed characters -# PLUS -# .1 * a bit more than the cube of ragged space on the last line. -# PLUS -# OPENPAREN_PENALTY for each line that starts with ( -# -# We use an obvious dynamic programming algorithm to sorta approximate this. -# It's not coded right or optimally, but it's fast enough for changelogs -# -# (Code found in an old directory of mine, lightly cleaned. -NM) - -NO_HYPHENATE=set(""" -pf-divert -tor-resolve -tor-gencert -""".split()) - -LASTLINE_UNDERFLOW_EXPONENT = 1 -LASTLINE_UNDERFLOW_PENALTY = 1 - -UNDERFLOW_EXPONENT = 3 -UNDERFLOW_PENALTY = 1 - -OVERFLOW_EXPONENT = 4 -OVERFLOW_PENALTY = 2000 - -ORPHAN_PENALTY = 10000 - -OPENPAREN_PENALTY = 200 - -def generate_wrapping(words, divisions): - lines = [] - last = 0 - for i in divisions: - w = words[last:i] - last = i - line = " ".join(w).replace("\xff ","-").replace("\xff","-") - lines.append(line.strip()) - return lines - -def wrapping_quality(words, divisions, width1, width2): - total = 0.0 - - lines = generate_wrapping(words, divisions) - for line in lines: - length = len(line) - if line is lines[0]: - width = width1 - else: - width = width2 - - if line[0:1] == '(': - total += OPENPAREN_PENALTY - - if length > width: - total += OVERFLOW_PENALTY * ( - (length - width) ** OVERFLOW_EXPONENT ) - else: - if line is lines[-1]: - e,p = (LASTLINE_UNDERFLOW_EXPONENT, LASTLINE_UNDERFLOW_PENALTY) - if " " not in line: - total += ORPHAN_PENALTY - else: - e,p = (UNDERFLOW_EXPONENT, UNDERFLOW_PENALTY) - - total += p * ((width - length) ** e) - - return total - -def wrap_graf(words, prefix_len1=0, prefix_len2=0, width=72): - wrapping_after = [ (0,), ] - - w1 = width - prefix_len1 - w2 = width - prefix_len2 - - for i in range(1, len(words)+1): - best_so_far = None - best_score = 1e300 - for j in range(i): - t = wrapping_after[j] - t1 = t[:-1] + (i,) - t2 = t + (i,) - wq1 = wrapping_quality(words, t1, w1, w2) - wq2 = wrapping_quality(words, t2, w1, w2) - - if wq1 < best_score: - best_so_far = t1 - best_score = wq1 - if wq2 < best_score: - best_so_far = t2 - best_score = wq2 - wrapping_after.append( best_so_far ) - - lines = generate_wrapping(words, wrapping_after[-1]) - - return lines - -def hyphenatable(word): - if "--" in word: - return False - - if re.match(r'^[^\d\-]\D*-', word): - stripped = re.sub(r'^\W+','',word) - stripped = re.sub(r'\W+$','',word) - return stripped not in NO_HYPHENATE - else: - return False - -def split_paragraph(s): - "Split paragraph into words; tuned for Tor." - - r = [] - for word in s.split(): - if hyphenatable(word): - while "-" in word: - a,word = word.split("-",1) - r.append(a+"\xff") - r.append(word) - return r - -def fill(text, width, initial_indent, subsequent_indent): - words = split_paragraph(text) - lines = wrap_graf(words, len(initial_indent), len(subsequent_indent), - width) - res = [ initial_indent, lines[0], "\n" ] - for line in lines[1:]: - res.append(subsequent_indent) - res.append(line) - res.append("\n") - return "".join(res) - -# ============================== - - -TP_MAINHEAD = 0 -TP_HEADTEXT = 1 -TP_BLANK = 2 -TP_SECHEAD = 3 -TP_ITEMFIRST = 4 -TP_ITEMBODY = 5 -TP_END = 6 -TP_PREHEAD = 7 - -def head_parser(line): - if re.match(r'^Changes in', line): - return TP_MAINHEAD - elif re.match(r'^[A-Za-z]', line): - return TP_PREHEAD - elif re.match(r'^ o ', line): - return TP_SECHEAD - elif re.match(r'^\s*$', line): - return TP_BLANK - else: - return TP_HEADTEXT - -def body_parser(line): - if re.match(r'^ o ', line): - return TP_SECHEAD - elif re.match(r'^ -',line): - return TP_ITEMFIRST - elif re.match(r'^ \S', line): - return TP_ITEMBODY - elif re.match(r'^\s*$', line): - return TP_BLANK - elif re.match(r'^Changes in', line): - return TP_END - elif re.match(r'^\s+\S', line): - return TP_HEADTEXT - else: - print "Weird line %r"%line - -def clean_head(head): - return head - -def head_score(s): - m = re.match(r'^ +o (.*)', s) - if not m: - print >>sys.stderr, "Can't score %r"%s - return 99999 - lw = m.group(1).lower() - if lw.startswith("security") and "feature" not in lw: - score = -300 - elif lw.startswith("deprecated version"): - score = -200 - elif lw.startswith("directory auth"): - score = -150 - elif (('new' in lw and 'requirement' in lw) or - ('new' in lw and 'dependenc' in lw) or - ('build' in lw and 'requirement' in lw) or - ('removed' in lw and 'platform' in lw)): - score = -100 - elif lw.startswith("major feature"): - score = 00 - elif lw.startswith("major bug"): - score = 50 - elif lw.startswith("major"): - score = 70 - elif lw.startswith("minor feature"): - score = 200 - elif lw.startswith("minor bug"): - score = 250 - elif lw.startswith("minor"): - score = 270 - else: - score = 1000 - - if 'secur' in lw: - score -= 2 - - if "(other)" in lw: - score += 2 - - if '(' not in lw: - score -= 1 - - return score - -class ChangeLog(object): - def __init__(self, wrapText=True, blogOrder=True, drupalBreak=False): - self.prehead = [] - self.mainhead = None - self.headtext = [] - self.curgraf = None - self.sections = [] - self.cursection = None - self.lineno = 0 - self.wrapText = wrapText - self.blogOrder = blogOrder - self.drupalBreak = drupalBreak - - def addLine(self, tp, line): - self.lineno += 1 - - if tp == TP_MAINHEAD: - assert not self.mainhead - self.mainhead = line - - elif tp == TP_PREHEAD: - self.prehead.append(line) - - elif tp == TP_HEADTEXT: - if self.curgraf is None: - self.curgraf = [] - self.headtext.append(self.curgraf) - self.curgraf.append(line) - - elif tp == TP_BLANK: - self.curgraf = None - - elif tp == TP_SECHEAD: - self.cursection = [ self.lineno, line, [] ] - self.sections.append(self.cursection) - - elif tp == TP_ITEMFIRST: - item = ( self.lineno, [ [line] ]) - self.curgraf = item[1][0] - self.cursection[2].append(item) - - elif tp == TP_ITEMBODY: - if self.curgraf is None: - self.curgraf = [] - self.cursection[2][-1][1].append(self.curgraf) - self.curgraf.append(line) - - else: - assert "This" is "unreachable" - - def lint_head(self, line, head): - m = re.match(r'^ *o ([^\(]+)((?:\([^\)]+\))?):', head) - if not m: - print >>sys.stderr, "Weird header format on line %s"%line - - def lint_item(self, line, grafs, head_type): - pass - - def lint(self): - self.head_lines = {} - for sec_line, sec_head, items in self.sections: - head_type = self.lint_head(sec_line, sec_head) - for item_line, grafs in items: - self.lint_item(item_line, grafs, head_type) - - def dumpGraf(self,par,indent1,indent2=-1): - if not self.wrapText: - for line in par: - print line - return - - if indent2 == -1: - indent2 = indent1 - text = " ".join(re.sub(r'\s+', ' ', line.strip()) for line in par) - - sys.stdout.write(fill(text, - width=72, - initial_indent=" "*indent1, - subsequent_indent=" "*indent2)) - - def dumpPreheader(self, graf): - self.dumpGraf(graf, 0) - print - - def dumpMainhead(self, head): - print head - - def dumpHeadGraf(self, graf): - self.dumpGraf(graf, 2) - print - - def dumpSectionHeader(self, header): - print header - - def dumpStartOfSections(self): - pass - - def dumpEndOfSections(self): - pass - - def dumpEndOfSection(self): - print - - def dumpEndOfChangelog(self): - print - - def dumpDrupalBreak(self): - pass - - def dumpItem(self, grafs): - self.dumpGraf(grafs[0],4,6) - for par in grafs[1:]: - print - self.dumpGraf(par,6,6) - - def collateAndSortSections(self): - heads = [] - sectionsByHead = { } - for _, head, items in self.sections: - head = clean_head(head) - try: - s = sectionsByHead[head] - except KeyError: - s = sectionsByHead[head] = [] - heads.append( (head_score(head), head.lower(), head, s) ) - - s.extend(items) - - heads.sort() - self.sections = [ (0, head, items) for _1,_2,head,items in heads ] - - def dump(self): - if self.prehead: - self.dumpPreheader(self.prehead) - - if not self.blogOrder: - self.dumpMainhead(self.mainhead) - - for par in self.headtext: - self.dumpHeadGraf(par) - - if self.blogOrder: - self.dumpMainhead(self.mainhead) - - drupalBreakAfter = None - if self.drupalBreak and len(self.sections) > 4: - drupalBreakAfter = self.sections[1][2] - - self.dumpStartOfSections() - for _,head,items in self.sections: - if not head.endswith(':'): - print >>sys.stderr, "adding : to %r"%head - head = head + ":" - self.dumpSectionHeader(head) - for _,grafs in items: - self.dumpItem(grafs) - self.dumpEndOfSection() - if items is drupalBreakAfter: - self.dumpDrupalBreak() - self.dumpEndOfSections() - self.dumpEndOfChangelog() - -# Let's turn bugs to html. -BUG_PAT = re.compile('(bug|ticket|feature)\s+(\d{4,5})', re.I) -def bug_html(m): - return "%s %s" % (m.group(1), m.group(2), m.group(2)) - -class HTMLChangeLog(ChangeLog): - def __init__(self, *args, **kwargs): - ChangeLog.__init__(self, *args, **kwargs) - - def htmlText(self, graf): - output = [] - for line in graf: - line = line.rstrip().replace("&","&") - line = line.rstrip().replace("<","<").replace(">",">") - output.append(line.strip()) - output = " ".join(output) - output = BUG_PAT.sub(bug_html, output) - sys.stdout.write(output) - - def htmlPar(self, graf): - sys.stdout.write("

    ") - self.htmlText(graf) - sys.stdout.write("

    \n") - - def dumpPreheader(self, graf): - self.htmlPar(graf) - - def dumpMainhead(self, head): - sys.stdout.write("

    %s

    "%head) - - def dumpHeadGraf(self, graf): - self.htmlPar(graf) - - def dumpSectionHeader(self, header): - header = header.replace(" o ", "", 1).lstrip() - sys.stdout.write("
  6. %s\n"%header) - sys.stdout.write("
      \n") - - def dumpEndOfSection(self): - sys.stdout.write("
    \n\n") - - def dumpEndOfChangelog(self): - pass - - def dumpStartOfSections(self): - print "
      \n" - - def dumpEndOfSections(self): - print "
    \n" - - def dumpDrupalBreak(self): - print "\n\n" - print "

     

    " - print "\n\n\n" - print "
      " - - def dumpItem(self, grafs): - grafs[0][0] = grafs[0][0].replace(" - ", "", 1).lstrip() - sys.stdout.write("
    • ") - if len(grafs) > 1: - for par in grafs: - self.htmlPar(par) - else: - self.htmlText(grafs[0]) - print - -op = optparse.OptionParser(usage="usage: %prog [options] [filename]") -op.add_option('-W', '--no-wrap', action='store_false', - dest='wrapText', default=True, - help='Do not re-wrap paragraphs') -op.add_option('-S', '--no-sort', action='store_false', - dest='sort', default=True, - help='Do not sort or collate sections') -op.add_option('-o', '--output', dest='output', - default='-', metavar='FILE', help="write output to FILE") -op.add_option('-H', '--html', action='store_true', - dest='html', default=False, - help="generate an HTML fragment") -op.add_option('-1', '--first', action='store_true', - dest='firstOnly', default=False, - help="write only the first section") -op.add_option('-b', '--blog-header', action='store_true', - dest='blogOrder', default=False, - help="Write the header in blog order") -op.add_option('-B', '--blog', action='store_true', - dest='blogFormat', default=False, - help="Set all other options as appropriate for a blog post") -op.add_option('--inplace', action='store_true', - dest='inplace', default=False, - help="Alter the ChangeLog in place") -op.add_option('--drupal-break', action='store_true', - dest='drupalBreak', default=False, - help='Insert a drupal-friendly as needed') - -options,args = op.parse_args() - -if options.blogFormat: - options.blogOrder = True - options.html = True - options.sort = False - options.wrapText = False - options.firstOnly = True - options.drupalBreak = True - -if len(args) > 1: - op.error("Too many arguments") -elif len(args) == 0: - fname = 'ChangeLog' -else: - fname = args[0] - -if options.inplace: - assert options.output == '-' - options.output = fname - -if fname != '-': - sys.stdin = open(fname, 'r') - -nextline = None - -if options.html: - ChangeLogClass = HTMLChangeLog -else: - ChangeLogClass = ChangeLog - -CL = ChangeLogClass(wrapText=options.wrapText, - blogOrder=options.blogOrder, - drupalBreak=options.drupalBreak) -parser = head_parser - -for line in sys.stdin: - line = line.rstrip() - tp = parser(line) - - if tp == TP_SECHEAD: - parser = body_parser - elif tp == TP_END: - nextline = line - break - - CL.addLine(tp,line) - -CL.lint() - -if options.output != '-': - fname_new = options.output+".new" - fname_out = options.output - sys.stdout = open(fname_new, 'w') -else: - fname_new = fname_out = None - -if options.sort: - CL.collateAndSortSections() - -CL.dump() - -if options.firstOnly: - sys.exit(0) - -if nextline is not None: - print nextline - -for line in sys.stdin: - sys.stdout.write(line) - -if fname_new is not None: - os.rename(fname_new, fname_out) diff --git a/src/tor/scripts/maint/lintChanges.py b/src/tor/scripts/maint/lintChanges.py deleted file mode 100644 index d5b8fcae5..000000000 --- a/src/tor/scripts/maint/lintChanges.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/python - -from __future__ import print_function -from __future__ import with_statement -import sys -import re -import os - - -KNOWN_GROUPS = set([ - "Minor bugfix", - "Minor bugfixes", - "Major bugfix", - "Major bugfixes", - "Minor feature", - "Minor features", - "Major feature", - "Major features", - "New system requirements", - "Testing", - "Documentation", - "Code simplification and refactoring", - "Removed features", - "Deprecated features", - "Directory authority changes"]) - -NEEDS_SUBCATEGORIES = set([ - "Minor bugfix", - "Minor bugfixes", - "Major bugfix", - "Major bugfixes", - "Minor feature", - "Minor features", - "Major feature", - "Major features", - ]) - -def lintfile(fname): - have_warned = [] - - def warn(s): - if not have_warned: - have_warned.append(1) - print("{}:".format(fname)) - print("\t{}".format(s)) - - m = re.search(r'(\d{3,})', os.path.basename(fname)) - if m: - bugnum = m.group(1) - else: - bugnum = None - - with open(fname) as f: - contents = f.read() - - if bugnum and bugnum not in contents: - warn("bug number {} does not appear".format(bugnum)) - - m = re.match(r'^[ ]{2}o ([^\(:]*)([^:]*):', contents) - if not m: - warn("Header not in format expected. (' o Foo:' or ' o Foo (Bar):')") - elif m.group(1).strip() not in KNOWN_GROUPS: - warn("Unrecognized header: %r" % m.group(1)) - elif (m.group(1) in NEEDS_SUBCATEGORIES and '(' not in m.group(2)): - warn("Missing subcategory on %r" % m.group(1)) - - if m: - isBug = ("bug" in m.group(1).lower() or "fix" in m.group(1).lower()) - else: - isBug = False - - contents = " ".join(contents.split()) - - if re.search(r'\#\d{2,}', contents): - warn("Don't use a # before ticket numbers. ('bug 1234' not '#1234')") - - if isBug and not re.search(r'(\d+)', contents): - warn("Ticket marked as bugfix, but does not mention a number.") - elif isBug and not re.search(r'Fixes ([a-z ]*)bugs? (\d+)', contents): - warn("Ticket marked as bugfix, but does not say 'Fixes bug XXX'") - - if re.search(r'[bB]ug (\d+)', contents): - if not re.search(r'[Bb]ugfix on ', contents): - warn("Bugfix does not say 'bugfix on X.Y.Z'") - elif not re.search('[fF]ixes ([a-z ]*)bugs? (\d+)((, \d+)* and \d+)?; bugfix on ', - contents): - warn("Bugfix does not say 'Fixes bug X; bugfix on Y'") - elif re.search('tor-([0-9]+)', contents): - warn("Do not prefix versions with 'tor-'. ('0.1.2', not 'tor-0.1.2'.)") - - return have_warned != [] - -def files(args): - """Walk through the arguments: for directories, yield their contents; - for files, just yield the files. Only search one level deep, because - that's how the changes directory is laid out.""" - for f in args: - if os.path.isdir(f): - for item in os.listdir(f): - if item.startswith("."): #ignore dotfiles - continue - yield os.path.join(f, item) - else: - yield f - -if __name__ == '__main__': - problems = 0 - for fname in files(sys.argv[1:]): - if fname.endswith("~"): - continue - if lintfile(fname): - problems += 1 - - if problems: - sys.exit(1) - else: - sys.exit(0) diff --git a/src/tor/scripts/maint/locatemissingdoxygen.py b/src/tor/scripts/maint/locatemissingdoxygen.py deleted file mode 100644 index 797bf8176..000000000 --- a/src/tor/scripts/maint/locatemissingdoxygen.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/python - -""" - This script parses the stderr output of doxygen and looks for undocumented - stuff. By default, it just counts the undocumented things per file. But with - the -A option, it rewrites the files to stick in /*DOCDOC*/ comments - to highlight the undocumented stuff. -""" - -import os -import re -import shutil -import sys - -warning_pattern = re.compile(r'^([^:]+):(\d+): warning: (.*) is not documented') - -def readDoxygenOutput(f): - " yields (cfilename, lineno, thingname) " - for line in f: - m = warning_pattern.match(line) - if m: - yield m.groups() - -warnings = {} - -def buildWarnings(): - for fn, lineno, what in list(readDoxygenOutput(sys.stdin)): - warnings.setdefault(fn, []).append( (int(lineno), what) ) - -def count(fn): - if os.path.abspath(fn) not in warnings: - print "0\t%s"%fn - else: - n = len(warnings[os.path.abspath(fn)]) - print "%d\t%s"%(n,fn) - -def getIndentation(line): - s = line.lstrip() - return line[:len(line)-len(s)] - -def annotate(filename): - if os.path.abspath(filename) not in warnings: - return - with open(filename) as f: - lines = f.readlines() - w = warnings[os.path.abspath(filename)][:] - w.sort() - w.reverse() - - for lineno, what in w: - lineno -= 1 # list is 0-indexed. - if 'DOCDOC' in lines[lineno]: - continue - ind = getIndentation(lines[lineno]) - lines.insert(lineno, "%s/* DOCDOC %s */\n"%(ind,what)) - - shutil.copy(filename, filename+".orig") - with open(filename, 'w') as f: - for l in lines: - f.write(l) - - -if __name__ == '__main__': - if len(sys.argv) == 1: - print "Usage: locatemissingdoxygen.py [-A] filename... doxygen.stderr' ... -# ...and run ./scripts/maint/redox.py < doxygen.stderr ! -# I'll make a bunch of new files by adding missing DOCDOC comments to your -# source. Those files will have names like ./src/common/util.c.newdoc. -# You will want to look over the changes by hand before checking them in. -# -# So, here's your workflow: -# -# 0. Make sure you're running a bourne shell for the redirects below. -# 1. make doxygen 1>doxygen.stdout 2>doxygen.stderr. -# 2. grep Warning doxygen.stderr | grep -v 'is not documented' | less -# [This will tell you about all the bogus doxygen output you have] -# 3. python ./scripts/maint/redox.py callgraph/$calculation -done - -echo < callgraph/README -This directory holds output from calltool, as run on Tor. For more -information about each of these files, see the NOTES and README files in -the calltool distribution. - -You can find calltool at - https://gitweb.torproject.org/user/nickm/calltool.git -EOF - diff --git a/src/tor/scripts/maint/sortChanges.py b/src/tor/scripts/maint/sortChanges.py deleted file mode 100644 index 22e40fd36..000000000 --- a/src/tor/scripts/maint/sortChanges.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/python -# Copyright (c) 2014-2017, The Tor Project, Inc. -# See LICENSE for licensing information - -"""This script sorts a bunch of changes files listed on its command - line into roughly the order in which they should appear in the - changelog. -""" - -import re -import sys - -def fetch(fn): - with open(fn) as f: - s = f.read() - s = "%s\n" % s.rstrip() - return s - -CSR='Code simplification and refactoring' - -REPLACEMENTS = { - # plurals - 'Minor bugfix' : 'Minor bugfixes', - 'Major bugfix' : 'Major bugfixes', - 'Minor feature' : 'Minor features', - 'Major feature' : 'Major features', - 'Removed feature' : 'Removed features', - 'Code simplification and refactorings' : CSR, - 'Code simplifications and refactoring' : CSR, - 'Code simplifications and refactorings' : CSR, - - # wrong words - 'Minor fix' : 'Minor bugfixes', - 'Major fix' : 'Major bugfixes', - 'Minor fixes' : 'Minor bugfixes', - 'Major fixes' : 'Major bugfixes', - 'Minor enhancement' : 'Minor features', - 'Minor enhancements' : 'Minor features', - 'Major enhancement' : 'Major features', - 'Major enhancements' : 'Major features', -} - -def score(s,fname=None): - m = re.match(r'^ +o ([^\n]*)\n(.*)', s, re.M|re.S) - if not m: - print >>sys.stderr, "Can't score %r from %s"%(s,fname) - heading = m.group(1) - heading = REPLACEMENTS.get(heading, heading) - lw = m.group(1).lower() - if lw.startswith("major feature"): - score = 0 - elif lw.startswith("major bug"): - score = 1 - elif lw.startswith("major"): - score = 2 - elif lw.startswith("minor feature"): - score = 10 - elif lw.startswith("minor bug"): - score = 11 - elif lw.startswith("minor"): - score = 12 - else: - score = 100 - - return (score, lw, heading, m.group(2)) - -def splitChanges(s): - this_entry = [] - for line in s.split("\n"): - if line.strip() == "": - continue - if re.match(r" +o ", line): - if len(this_entry) > 2: - yield "".join(this_entry) - curHeader = line - this_entry = [ curHeader, "\n" ] - continue - elif re.match(r" +- ", line): - if len(this_entry) > 2: - yield "".join(this_entry) - this_entry = [ curHeader, "\n" ] - - this_entry.append(line) - this_entry.append("\n") - - if len(this_entry) > 2: - yield "".join(this_entry) - - -changes = [] - -for fn in sys.argv[1:]: - if fn.endswith('~'): - continue - for change in splitChanges(fetch(fn)): - changes.append(score(change,fn)) - -changes.sort() - -last_lw = "this is not a header" -for _, lw, header, rest in changes: - if lw == last_lw: - print rest, - else: - print - print " o",header - print rest, - last_lw = lw diff --git a/src/tor/scripts/maint/updateCopyright.pl b/src/tor/scripts/maint/updateCopyright.pl deleted file mode 100644 index beb0b8f26..000000000 --- a/src/tor/scripts/maint/updateCopyright.pl +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/perl -i -w -p - -$NEWYEAR=2017; - -s/Copyright(.*) (201[^7]), The Tor Project/Copyright$1 $2-${NEWYEAR}, The Tor Project/; - -s/Copyright(.*)-(20..), The Tor Project/Copyright$1-${NEWYEAR}, The Tor Project/; diff --git a/src/tor/scripts/maint/updateFallbackDirs.py b/src/tor/scripts/maint/updateFallbackDirs.py deleted file mode 100644 index 3efd408ec..000000000 --- a/src/tor/scripts/maint/updateFallbackDirs.py +++ /dev/null @@ -1,2226 +0,0 @@ -#!/usr/bin/python - -# Usage: -# -# Regenerate the list: -# scripts/maint/updateFallbackDirs.py > src/or/fallback_dirs.inc 2> fallback_dirs.log -# -# Check the existing list: -# scripts/maint/updateFallbackDirs.py check_existing > fallback_dirs.inc.ok 2> fallback_dirs.log -# mv fallback_dirs.inc.ok src/or/fallback_dirs.inc -# -# This script should be run from a stable, reliable network connection, -# with no other network activity (and not over tor). -# If this is not possible, please disable: -# PERFORM_IPV4_DIRPORT_CHECKS and PERFORM_IPV6_DIRPORT_CHECKS -# -# Needs dateutil (and potentially other python packages) -# Needs stem available in your PYTHONPATH, or just ln -s ../stem/stem . -# Optionally uses ipaddress (python 3 builtin) or py2-ipaddress (package) -# for netblock analysis, in PYTHONPATH, or just -# ln -s ../py2-ipaddress-3.4.1/ipaddress.py . -# -# Then read the logs to make sure the fallbacks aren't dominated by a single -# netblock or port - -# Script by weasel, April 2015 -# Portions by gsathya & karsten, 2013 -# https://trac.torproject.org/projects/tor/attachment/ticket/8374/dir_list.2.py -# Modifications by teor, 2015 - -import StringIO -import string -import re -import datetime -import gzip -import os.path -import json -import math -import sys -import urllib -import urllib2 -import hashlib -import dateutil.parser -# bson_lazy provides bson -#from bson import json_util -import copy -import re - -from stem.descriptor import DocumentHandler -from stem.descriptor.remote import get_consensus - -import logging -logging.root.name = '' - -HAVE_IPADDRESS = False -try: - # python 3 builtin, or install package py2-ipaddress - # there are several ipaddress implementations for python 2 - # with slightly different semantics with str typed text - # fortunately, all our IP addresses are in unicode - import ipaddress - HAVE_IPADDRESS = True -except ImportError: - # if this happens, we avoid doing netblock analysis - logging.warning('Unable to import ipaddress, please install py2-ipaddress.' + - ' A fallback list will be created, but optional netblock' + - ' analysis will not be performed.') - -## Top-Level Configuration - -# Output all candidate fallbacks, or only output selected fallbacks? -OUTPUT_CANDIDATES = False - -# Perform DirPort checks over IPv4? -# Change this to False if IPv4 doesn't work for you, or if you don't want to -# download a consensus for each fallback -# Don't check ~1000 candidates when OUTPUT_CANDIDATES is True -PERFORM_IPV4_DIRPORT_CHECKS = False if OUTPUT_CANDIDATES else True - -# Perform DirPort checks over IPv6? -# If you know IPv6 works for you, set this to True -# This will exclude IPv6 relays without an IPv6 DirPort configured -# So it's best left at False until #18394 is implemented -# Don't check ~1000 candidates when OUTPUT_CANDIDATES is True -PERFORM_IPV6_DIRPORT_CHECKS = False if OUTPUT_CANDIDATES else False - -# Must relays be running now? -MUST_BE_RUNNING_NOW = (PERFORM_IPV4_DIRPORT_CHECKS - or PERFORM_IPV6_DIRPORT_CHECKS) - -# Clients have been using microdesc consensuses by default for a while now -DOWNLOAD_MICRODESC_CONSENSUS = True - -# If a relay delivers an expired consensus, if it expired less than this many -# seconds ago, we still allow the relay. This should never be less than -90, -# as all directory mirrors should have downloaded a consensus 90 minutes -# before it expires. It should never be more than 24 hours, because clients -# reject consensuses that are older than REASONABLY_LIVE_TIME. -# For the consensus expiry check to be accurate, the machine running this -# script needs an accurate clock. -# We use 24 hours to compensate for #20909, where relays on 0.2.9.5-alpha and -# 0.3.0.0-alpha-dev and later deliver stale consensuses, but typically recover -# after ~12 hours. -# We should make this lower when #20909 is fixed, see #20942. -CONSENSUS_EXPIRY_TOLERANCE = 24*60*60 - -# Output fallback name, flags, bandwidth, and ContactInfo in a C comment? -OUTPUT_COMMENTS = True if OUTPUT_CANDIDATES else False - -# Output matching ContactInfo in fallbacks list or the blacklist? -# Useful if you're trying to contact operators -CONTACT_COUNT = True if OUTPUT_CANDIDATES else False -CONTACT_BLACKLIST_COUNT = True if OUTPUT_CANDIDATES else False - -# How the list should be sorted: -# fingerprint: is useful for stable diffs of fallback lists -# measured_bandwidth: is useful when pruning the list based on bandwidth -# contact: is useful for contacting operators once the list has been pruned -OUTPUT_SORT_FIELD = 'contact' if OUTPUT_CANDIDATES else 'fingerprint' - -## OnionOO Settings - -ONIONOO = 'https://onionoo.torproject.org/' -#ONIONOO = 'https://onionoo.thecthulhu.com/' - -# Don't bother going out to the Internet, just use the files available locally, -# even if they're very old -LOCAL_FILES_ONLY = False - -## Whitelist / Blacklist Filter Settings - -# The whitelist contains entries that are included if all attributes match -# (IPv4, dirport, orport, id, and optionally IPv6 and IPv6 orport) -# The blacklist contains (partial) entries that are excluded if any -# sufficiently specific group of attributes matches: -# IPv4 & DirPort -# IPv4 & ORPort -# ID -# IPv6 & DirPort -# IPv6 & IPv6 ORPort -# If neither port is included in the blacklist, the entire IP address is -# blacklisted. - -# What happens to entries in neither list? -# When True, they are included, when False, they are excluded -INCLUDE_UNLISTED_ENTRIES = True if OUTPUT_CANDIDATES else False - -# If an entry is in both lists, what happens? -# When True, it is excluded, when False, it is included -BLACKLIST_EXCLUDES_WHITELIST_ENTRIES = True - -WHITELIST_FILE_NAME = 'scripts/maint/fallback.whitelist' -BLACKLIST_FILE_NAME = 'scripts/maint/fallback.blacklist' -FALLBACK_FILE_NAME = 'src/or/fallback_dirs.inc' - -# The number of bytes we'll read from a filter file before giving up -MAX_LIST_FILE_SIZE = 1024 * 1024 - -## Eligibility Settings - -# Require fallbacks to have the same address and port for a set amount of time -# We used to have this at 1 week, but that caused many fallback failures, which -# meant that we had to rebuild the list more often. -# -# There was a bug in Tor 0.2.8.1-alpha and earlier where a relay temporarily -# submits a 0 DirPort when restarted. -# This causes OnionOO to (correctly) reset its stability timer. -# Affected relays should upgrade to Tor 0.2.8.7 or later, which has a fix -# for this issue. -ADDRESS_AND_PORT_STABLE_DAYS = 30 -# We ignore relays that have been down for more than this period -MAX_DOWNTIME_DAYS = 0 if MUST_BE_RUNNING_NOW else 7 -# What time-weighted-fraction of these flags must FallbackDirs -# Equal or Exceed? -CUTOFF_RUNNING = .90 -CUTOFF_V2DIR = .90 -# Tolerate lower guard flag averages, as guard flags are removed for some time -# after a relay restarts -CUTOFF_GUARD = .80 -# What time-weighted-fraction of these flags must FallbackDirs -# Equal or Fall Under? -# .00 means no bad exits -PERMITTED_BADEXIT = .00 - -# older entries' weights are adjusted with ALPHA^(age in days) -AGE_ALPHA = 0.99 - -# this factor is used to scale OnionOO entries to [0,1] -ONIONOO_SCALE_ONE = 999. - -## Fallback Count Limits - -# The target for these parameters is 20% of the guards in the network -# This is around 200 as of October 2015 -_FB_POG = 0.2 -FALLBACK_PROPORTION_OF_GUARDS = None if OUTPUT_CANDIDATES else _FB_POG - -# Limit the number of fallbacks (eliminating lowest by advertised bandwidth) -MAX_FALLBACK_COUNT = None if OUTPUT_CANDIDATES else 200 -# Emit a C #error if the number of fallbacks is less than expected -MIN_FALLBACK_COUNT = 0 if OUTPUT_CANDIDATES else MAX_FALLBACK_COUNT*0.5 - -# The maximum number of fallbacks on the same address, contact, or family -# With 200 fallbacks, this means each operator can see 1% of client bootstraps -# (The directory authorities used to see ~12% of client bootstraps each.) -MAX_FALLBACKS_PER_IP = 1 -MAX_FALLBACKS_PER_IPV4 = MAX_FALLBACKS_PER_IP -MAX_FALLBACKS_PER_IPV6 = MAX_FALLBACKS_PER_IP -MAX_FALLBACKS_PER_CONTACT = 3 -MAX_FALLBACKS_PER_FAMILY = 3 - -## Fallback Bandwidth Requirements - -# Any fallback with the Exit flag has its bandwidth multipled by this fraction -# to make sure we aren't further overloading exits -# (Set to 1.0, because we asked that only lightly loaded exits opt-in, -# and the extra load really isn't that much for large relays.) -EXIT_BANDWIDTH_FRACTION = 1.0 - -# If a single fallback's bandwidth is too low, it's pointless adding it -# We expect fallbacks to handle an extra 10 kilobytes per second of traffic -# Make sure they can support a hundred times the expected extra load -# (Use 102.4 to make it come out nicely in MByte/s) -# We convert this to a consensus weight before applying the filter, -# because all the bandwidth amounts are specified by the relay -MIN_BANDWIDTH = 102.4 * 10.0 * 1024.0 - -# Clients will time out after 30 seconds trying to download a consensus -# So allow fallback directories half that to deliver a consensus -# The exact download times might change based on the network connection -# running this script, but only by a few seconds -# There is also about a second of python overhead -CONSENSUS_DOWNLOAD_SPEED_MAX = 15.0 -# If the relay fails a consensus check, retry the download -# This avoids delisting a relay due to transient network conditions -CONSENSUS_DOWNLOAD_RETRY = True - -## Fallback Weights for Client Selection - -# All fallback weights are equal, and set to the value below -# Authorities are weighted 1.0 by default -# Clients use these weights to select fallbacks and authorities at random -# If there are 100 fallbacks and 9 authorities: -# - each fallback is chosen with probability 10.0/(10.0*100 + 1.0*9) ~= 0.99% -# - each authority is chosen with probability 1.0/(10.0*100 + 1.0*9) ~= 0.09% -# A client choosing a bootstrap directory server will choose a fallback for -# 10.0/(10.0*100 + 1.0*9) * 100 = 99.1% of attempts, and an authority for -# 1.0/(10.0*100 + 1.0*9) * 9 = 0.9% of attempts. -# (This disregards the bootstrap schedules, where clients start by choosing -# from fallbacks & authoritites, then later choose from only authorities.) -FALLBACK_OUTPUT_WEIGHT = 10.0 - -## Parsing Functions - -def parse_ts(t): - return datetime.datetime.strptime(t, "%Y-%m-%d %H:%M:%S") - -def remove_bad_chars(raw_string, bad_char_list): - # Remove each character in the bad_char_list - cleansed_string = raw_string - for c in bad_char_list: - cleansed_string = cleansed_string.replace(c, '') - return cleansed_string - -def cleanse_unprintable(raw_string): - # Remove all unprintable characters - cleansed_string = '' - for c in raw_string: - if c in string.printable: - cleansed_string += c - return cleansed_string - -def cleanse_whitespace(raw_string): - # Replace all whitespace characters with a space - cleansed_string = raw_string - for c in string.whitespace: - cleansed_string = cleansed_string.replace(c, ' ') - return cleansed_string - -def cleanse_c_multiline_comment(raw_string): - cleansed_string = raw_string - # Embedded newlines should be removed by tor/onionoo, but let's be paranoid - cleansed_string = cleanse_whitespace(cleansed_string) - # ContactInfo and Version can be arbitrary binary data - cleansed_string = cleanse_unprintable(cleansed_string) - # Prevent a malicious / unanticipated string from breaking out - # of a C-style multiline comment - # This removes '/*' and '*/' and '//' - bad_char_list = '*/' - # Prevent a malicious string from using C nulls - bad_char_list += '\0' - # Be safer by removing bad characters entirely - cleansed_string = remove_bad_chars(cleansed_string, bad_char_list) - # Some compilers may further process the content of comments - # There isn't much we can do to cover every possible case - # But comment-based directives are typically only advisory - return cleansed_string - -def cleanse_c_string(raw_string): - cleansed_string = raw_string - # Embedded newlines should be removed by tor/onionoo, but let's be paranoid - cleansed_string = cleanse_whitespace(cleansed_string) - # ContactInfo and Version can be arbitrary binary data - cleansed_string = cleanse_unprintable(cleansed_string) - # Prevent a malicious address/fingerprint string from breaking out - # of a C-style string - bad_char_list = '"' - # Prevent a malicious string from using escapes - bad_char_list += '\\' - # Prevent a malicious string from using C nulls - bad_char_list += '\0' - # Be safer by removing bad characters entirely - cleansed_string = remove_bad_chars(cleansed_string, bad_char_list) - # Some compilers may further process the content of strings - # There isn't much we can do to cover every possible case - # But this typically only results in changes to the string data - return cleansed_string - -## OnionOO Source Functions - -# a dictionary of source metadata for each onionoo query we've made -fetch_source = {} - -# register source metadata for 'what' -# assumes we only retrieve one document for each 'what' -def register_fetch_source(what, url, relays_published, version): - fetch_source[what] = {} - fetch_source[what]['url'] = url - fetch_source[what]['relays_published'] = relays_published - fetch_source[what]['version'] = version - -# list each registered source's 'what' -def fetch_source_list(): - return sorted(fetch_source.keys()) - -# given 'what', provide a multiline C comment describing the source -def describe_fetch_source(what): - desc = '/*' - desc += '\n' - desc += 'Onionoo Source: ' - desc += cleanse_c_multiline_comment(what) - desc += ' Date: ' - desc += cleanse_c_multiline_comment(fetch_source[what]['relays_published']) - desc += ' Version: ' - desc += cleanse_c_multiline_comment(fetch_source[what]['version']) - desc += '\n' - desc += 'URL: ' - desc += cleanse_c_multiline_comment(fetch_source[what]['url']) - desc += '\n' - desc += '*/' - return desc - -## File Processing Functions - -def write_to_file(str, file_name, max_len): - try: - with open(file_name, 'w') as f: - f.write(str[0:max_len]) - except EnvironmentError, error: - logging.error('Writing file %s failed: %d: %s'% - (file_name, - error.errno, - error.strerror) - ) - -def read_from_file(file_name, max_len): - try: - if os.path.isfile(file_name): - with open(file_name, 'r') as f: - return f.read(max_len) - except EnvironmentError, error: - logging.info('Loading file %s failed: %d: %s'% - (file_name, - error.errno, - error.strerror) - ) - return None - -def parse_fallback_file(file_name): - file_data = read_from_file(file_name, MAX_LIST_FILE_SIZE) - file_data = cleanse_unprintable(file_data) - file_data = remove_bad_chars(file_data, '\n"\0') - file_data = re.sub('/\*.*?\*/', '', file_data) - file_data = file_data.replace(',', '\n') - file_data = file_data.replace(' weight=10', '') - return file_data - -def load_possibly_compressed_response_json(response): - if response.info().get('Content-Encoding') == 'gzip': - buf = StringIO.StringIO( response.read() ) - f = gzip.GzipFile(fileobj=buf) - return json.load(f) - else: - return json.load(response) - -def load_json_from_file(json_file_name): - # An exception here may be resolved by deleting the .last_modified - # and .json files, and re-running the script - try: - with open(json_file_name, 'r') as f: - return json.load(f) - except EnvironmentError, error: - raise Exception('Reading not-modified json file %s failed: %d: %s'% - (json_file_name, - error.errno, - error.strerror) - ) - -## OnionOO Functions - -def datestr_to_datetime(datestr): - # Parse datetimes like: Fri, 02 Oct 2015 13:34:14 GMT - if datestr is not None: - dt = dateutil.parser.parse(datestr) - else: - # Never modified - use start of epoch - dt = datetime.datetime.utcfromtimestamp(0) - # strip any timezone out (in case they're supported in future) - dt = dt.replace(tzinfo=None) - return dt - -def onionoo_fetch(what, **kwargs): - params = kwargs - params['type'] = 'relay' - #params['limit'] = 10 - params['first_seen_days'] = '%d-'%(ADDRESS_AND_PORT_STABLE_DAYS) - params['last_seen_days'] = '-%d'%(MAX_DOWNTIME_DAYS) - params['flag'] = 'V2Dir' - url = ONIONOO + what + '?' + urllib.urlencode(params) - - # Unfortunately, the URL is too long for some OS filenames, - # but we still don't want to get files from different URLs mixed up - base_file_name = what + '-' + hashlib.sha1(url).hexdigest() - - full_url_file_name = base_file_name + '.full_url' - MAX_FULL_URL_LENGTH = 1024 - - last_modified_file_name = base_file_name + '.last_modified' - MAX_LAST_MODIFIED_LENGTH = 64 - - json_file_name = base_file_name + '.json' - - if LOCAL_FILES_ONLY: - # Read from the local file, don't write to anything - response_json = load_json_from_file(json_file_name) - else: - # store the full URL to a file for debugging - # no need to compare as long as you trust SHA-1 - write_to_file(url, full_url_file_name, MAX_FULL_URL_LENGTH) - - request = urllib2.Request(url) - request.add_header('Accept-encoding', 'gzip') - - # load the last modified date from the file, if it exists - last_mod_date = read_from_file(last_modified_file_name, - MAX_LAST_MODIFIED_LENGTH) - if last_mod_date is not None: - request.add_header('If-modified-since', last_mod_date) - - # Parse last modified date - last_mod = datestr_to_datetime(last_mod_date) - - # Not Modified and still recent enough to be useful - # Onionoo / Globe used to use 6 hours, but we can afford a day - required_freshness = datetime.datetime.utcnow() - # strip any timezone out (to match dateutil.parser) - required_freshness = required_freshness.replace(tzinfo=None) - required_freshness -= datetime.timedelta(hours=24) - - # Make the OnionOO request - response_code = 0 - try: - response = urllib2.urlopen(request) - response_code = response.getcode() - except urllib2.HTTPError, error: - response_code = error.code - if response_code == 304: # not modified - pass - else: - raise Exception("Could not get " + url + ": " - + str(error.code) + ": " + error.reason) - - if response_code == 200: # OK - last_mod = datestr_to_datetime(response.info().get('Last-Modified')) - - # Check for freshness - if last_mod < required_freshness: - if last_mod_date is not None: - # This check sometimes fails transiently, retry the script if it does - date_message = "Outdated data: last updated " + last_mod_date - else: - date_message = "No data: never downloaded " - raise Exception(date_message + " from " + url) - - # Process the data - if response_code == 200: # OK - - response_json = load_possibly_compressed_response_json(response) - - with open(json_file_name, 'w') as f: - # use the most compact json representation to save space - json.dump(response_json, f, separators=(',',':')) - - # store the last modified date in its own file - if response.info().get('Last-modified') is not None: - write_to_file(response.info().get('Last-Modified'), - last_modified_file_name, - MAX_LAST_MODIFIED_LENGTH) - - elif response_code == 304: # Not Modified - - response_json = load_json_from_file(json_file_name) - - else: # Unexpected HTTP response code not covered in the HTTPError above - raise Exception("Unexpected HTTP response code to " + url + ": " - + str(response_code)) - - register_fetch_source(what, - url, - response_json['relays_published'], - response_json['version']) - - return response_json - -def fetch(what, **kwargs): - #x = onionoo_fetch(what, **kwargs) - # don't use sort_keys, as the order of or_addresses is significant - #print json.dumps(x, indent=4, separators=(',', ': ')) - #sys.exit(0) - - return onionoo_fetch(what, **kwargs) - -## Fallback Candidate Class - -class Candidate(object): - CUTOFF_ADDRESS_AND_PORT_STABLE = (datetime.datetime.utcnow() - - datetime.timedelta(ADDRESS_AND_PORT_STABLE_DAYS)) - - def __init__(self, details): - for f in ['fingerprint', 'nickname', 'last_changed_address_or_port', - 'consensus_weight', 'or_addresses', 'dir_address']: - if not f in details: raise Exception("Document has no %s field."%(f,)) - - if not 'contact' in details: - details['contact'] = None - if not 'flags' in details or details['flags'] is None: - details['flags'] = [] - if (not 'advertised_bandwidth' in details - or details['advertised_bandwidth'] is None): - # relays without advertised bandwdith have it calculated from their - # consensus weight - details['advertised_bandwidth'] = 0 - if (not 'effective_family' in details - or details['effective_family'] is None): - details['effective_family'] = [] - if not 'platform' in details: - details['platform'] = None - details['last_changed_address_or_port'] = parse_ts( - details['last_changed_address_or_port']) - self._data = details - self._stable_sort_or_addresses() - - self._fpr = self._data['fingerprint'] - self._running = self._guard = self._v2dir = 0. - self._split_dirport() - self._compute_orport() - if self.orport is None: - raise Exception("Failed to get an orport for %s."%(self._fpr,)) - self._compute_ipv6addr() - if not self.has_ipv6(): - logging.debug("Failed to get an ipv6 address for %s."%(self._fpr,)) - self._compute_version() - - def _stable_sort_or_addresses(self): - # replace self._data['or_addresses'] with a stable ordering, - # sorting the secondary addresses in string order - # leave the received order in self._data['or_addresses_raw'] - self._data['or_addresses_raw'] = self._data['or_addresses'] - or_address_primary = self._data['or_addresses'][:1] - # subsequent entries in the or_addresses array are in an arbitrary order - # so we stabilise the addresses by sorting them in string order - or_addresses_secondaries_stable = sorted(self._data['or_addresses'][1:]) - or_addresses_stable = or_address_primary + or_addresses_secondaries_stable - self._data['or_addresses'] = or_addresses_stable - - def get_fingerprint(self): - return self._fpr - - # is_valid_ipv[46]_address by gsathya, karsten, 2013 - @staticmethod - def is_valid_ipv4_address(address): - if not isinstance(address, (str, unicode)): - return False - - # check if there are four period separated values - if address.count(".") != 3: - return False - - # checks that each value in the octet are decimal values between 0-255 - for entry in address.split("."): - if not entry.isdigit() or int(entry) < 0 or int(entry) > 255: - return False - elif entry[0] == "0" and len(entry) > 1: - return False # leading zeros, for instance in "1.2.3.001" - - return True - - @staticmethod - def is_valid_ipv6_address(address): - if not isinstance(address, (str, unicode)): - return False - - # remove brackets - address = address[1:-1] - - # addresses are made up of eight colon separated groups of four hex digits - # with leading zeros being optional - # https://en.wikipedia.org/wiki/IPv6#Address_format - - colon_count = address.count(":") - - if colon_count > 7: - return False # too many groups - elif colon_count != 7 and not "::" in address: - return False # not enough groups and none are collapsed - elif address.count("::") > 1 or ":::" in address: - return False # multiple groupings of zeros can't be collapsed - - found_ipv4_on_previous_entry = False - for entry in address.split(":"): - # If an IPv6 address has an embedded IPv4 address, - # it must be the last entry - if found_ipv4_on_previous_entry: - return False - if not re.match("^[0-9a-fA-f]{0,4}$", entry): - if not Candidate.is_valid_ipv4_address(entry): - return False - else: - found_ipv4_on_previous_entry = True - - return True - - def _split_dirport(self): - # Split the dir_address into dirip and dirport - (self.dirip, _dirport) = self._data['dir_address'].split(':', 2) - self.dirport = int(_dirport) - - def _compute_orport(self): - # Choose the first ORPort that's on the same IPv4 address as the DirPort. - # In rare circumstances, this might not be the primary ORPort address. - # However, _stable_sort_or_addresses() ensures we choose the same one - # every time, even if onionoo changes the order of the secondaries. - self._split_dirport() - self.orport = None - for i in self._data['or_addresses']: - if i != self._data['or_addresses'][0]: - logging.debug('Secondary IPv4 Address Used for %s: %s'%(self._fpr, i)) - (ipaddr, port) = i.rsplit(':', 1) - if (ipaddr == self.dirip) and Candidate.is_valid_ipv4_address(ipaddr): - self.orport = int(port) - return - - def _compute_ipv6addr(self): - # Choose the first IPv6 address that uses the same port as the ORPort - # Or, choose the first IPv6 address in the list - # _stable_sort_or_addresses() ensures we choose the same IPv6 address - # every time, even if onionoo changes the order of the secondaries. - self.ipv6addr = None - self.ipv6orport = None - # Choose the first IPv6 address that uses the same port as the ORPort - for i in self._data['or_addresses']: - (ipaddr, port) = i.rsplit(':', 1) - if (port == self.orport) and Candidate.is_valid_ipv6_address(ipaddr): - self.ipv6addr = ipaddr - self.ipv6orport = int(port) - return - # Choose the first IPv6 address in the list - for i in self._data['or_addresses']: - (ipaddr, port) = i.rsplit(':', 1) - if Candidate.is_valid_ipv6_address(ipaddr): - self.ipv6addr = ipaddr - self.ipv6orport = int(port) - return - - def _compute_version(self): - # parse the version out of the platform string - # The platform looks like: "Tor 0.2.7.6 on Linux" - self._data['version'] = None - if self._data['platform'] is None: - return - # be tolerant of weird whitespacing, use a whitespace split - tokens = self._data['platform'].split() - for token in tokens: - vnums = token.split('.') - # if it's at least a.b.c.d, with potentially an -alpha-dev, -alpha, -rc - if (len(vnums) >= 4 and vnums[0].isdigit() and vnums[1].isdigit() and - vnums[2].isdigit()): - self._data['version'] = token - return - - # From #20509 - # bug #20499 affects versions from 0.2.9.1-alpha-dev to 0.2.9.4-alpha-dev - # and version 0.3.0.0-alpha-dev - # Exhaustive lists are hard to get wrong - STALE_CONSENSUS_VERSIONS = ['0.2.9.1-alpha-dev', - '0.2.9.2-alpha', - '0.2.9.2-alpha-dev', - '0.2.9.3-alpha', - '0.2.9.3-alpha-dev', - '0.2.9.4-alpha', - '0.2.9.4-alpha-dev', - '0.3.0.0-alpha-dev' - ] - - def is_valid_version(self): - # call _compute_version before calling this - # is the version of the relay a version we want as a fallback? - # checks both recommended versions and bug #20499 / #20509 - # - # if the relay doesn't have a recommended version field, exclude the relay - if not self._data.has_key('recommended_version'): - log_excluded('%s not a candidate: no recommended_version field', - self._fpr) - return False - if not self._data['recommended_version']: - log_excluded('%s not a candidate: version not recommended', self._fpr) - return False - # if the relay doesn't have version field, exclude the relay - if not self._data.has_key('version'): - log_excluded('%s not a candidate: no version field', self._fpr) - return False - if self._data['version'] in Candidate.STALE_CONSENSUS_VERSIONS: - logging.warning('%s not a candidate: version delivers stale consensuses', - self._fpr) - return False - return True - - @staticmethod - def _extract_generic_history(history, which='unknown'): - # given a tree like this: - # { - # "1_month": { - # "count": 187, - # "factor": 0.001001001001001001, - # "first": "2015-02-27 06:00:00", - # "interval": 14400, - # "last": "2015-03-30 06:00:00", - # "values": [ - # 999, - # 999 - # ] - # }, - # "1_week": { - # "count": 169, - # "factor": 0.001001001001001001, - # "first": "2015-03-23 07:30:00", - # "interval": 3600, - # "last": "2015-03-30 07:30:00", - # "values": [ ...] - # }, - # "1_year": { - # "count": 177, - # "factor": 0.001001001001001001, - # "first": "2014-04-11 00:00:00", - # "interval": 172800, - # "last": "2015-03-29 00:00:00", - # "values": [ ...] - # }, - # "3_months": { - # "count": 185, - # "factor": 0.001001001001001001, - # "first": "2014-12-28 06:00:00", - # "interval": 43200, - # "last": "2015-03-30 06:00:00", - # "values": [ ...] - # } - # }, - # extract exactly one piece of data per time interval, - # using smaller intervals where available. - # - # returns list of (age, length, value) dictionaries. - - generic_history = [] - - periods = history.keys() - periods.sort(key = lambda x: history[x]['interval']) - now = datetime.datetime.utcnow() - newest = now - for p in periods: - h = history[p] - interval = datetime.timedelta(seconds = h['interval']) - this_ts = parse_ts(h['last']) - - if (len(h['values']) != h['count']): - logging.warning('Inconsistent value count in %s document for %s' - %(p, which)) - for v in reversed(h['values']): - if (this_ts <= newest): - agt1 = now - this_ts - agt2 = interval - agetmp1 = (agt1.microseconds + (agt1.seconds + agt1.days * 24 * 3600) - * 10**6) / 10**6 - agetmp2 = (agt2.microseconds + (agt2.seconds + agt2.days * 24 * 3600) - * 10**6) / 10**6 - generic_history.append( - { 'age': agetmp1, - 'length': agetmp2, - 'value': v - }) - newest = this_ts - this_ts -= interval - - if (this_ts + interval != parse_ts(h['first'])): - logging.warning('Inconsistent time information in %s document for %s' - %(p, which)) - - #print json.dumps(generic_history, sort_keys=True, - # indent=4, separators=(',', ': ')) - return generic_history - - @staticmethod - def _avg_generic_history(generic_history): - a = [] - for i in generic_history: - if i['age'] > (ADDRESS_AND_PORT_STABLE_DAYS * 24 * 3600): - continue - if (i['length'] is not None - and i['age'] is not None - and i['value'] is not None): - w = i['length'] * math.pow(AGE_ALPHA, i['age']/(3600*24)) - a.append( (i['value'] * w, w) ) - - sv = math.fsum(map(lambda x: x[0], a)) - sw = math.fsum(map(lambda x: x[1], a)) - - if sw == 0.0: - svw = 0.0 - else: - svw = sv/sw - return svw - - def _add_generic_history(self, history): - periods = r['read_history'].keys() - periods.sort(key = lambda x: r['read_history'][x]['interval'] ) - - print periods - - def add_running_history(self, history): - pass - - def add_uptime(self, uptime): - logging.debug('Adding uptime %s.'%(self._fpr,)) - - # flags we care about: Running, V2Dir, Guard - if not 'flags' in uptime: - logging.debug('No flags in document for %s.'%(self._fpr,)) - return - - for f in ['Running', 'Guard', 'V2Dir']: - if not f in uptime['flags']: - logging.debug('No %s in flags for %s.'%(f, self._fpr,)) - return - - running = self._extract_generic_history(uptime['flags']['Running'], - '%s-Running'%(self._fpr)) - guard = self._extract_generic_history(uptime['flags']['Guard'], - '%s-Guard'%(self._fpr)) - v2dir = self._extract_generic_history(uptime['flags']['V2Dir'], - '%s-V2Dir'%(self._fpr)) - if 'BadExit' in uptime['flags']: - badexit = self._extract_generic_history(uptime['flags']['BadExit'], - '%s-BadExit'%(self._fpr)) - - self._running = self._avg_generic_history(running) / ONIONOO_SCALE_ONE - self._guard = self._avg_generic_history(guard) / ONIONOO_SCALE_ONE - self._v2dir = self._avg_generic_history(v2dir) / ONIONOO_SCALE_ONE - self._badexit = None - if 'BadExit' in uptime['flags']: - self._badexit = self._avg_generic_history(badexit) / ONIONOO_SCALE_ONE - - def is_candidate(self): - try: - if (MUST_BE_RUNNING_NOW and not self.is_running()): - log_excluded('%s not a candidate: not running now, unable to check ' + - 'DirPort consensus download', self._fpr) - return False - if (self._data['last_changed_address_or_port'] > - self.CUTOFF_ADDRESS_AND_PORT_STABLE): - log_excluded('%s not a candidate: changed address/port recently (%s)', - self._fpr, self._data['last_changed_address_or_port']) - return False - if self._running < CUTOFF_RUNNING: - log_excluded('%s not a candidate: running avg too low (%lf)', - self._fpr, self._running) - return False - if self._v2dir < CUTOFF_V2DIR: - log_excluded('%s not a candidate: v2dir avg too low (%lf)', - self._fpr, self._v2dir) - return False - if self._badexit is not None and self._badexit > PERMITTED_BADEXIT: - log_excluded('%s not a candidate: badexit avg too high (%lf)', - self._fpr, self._badexit) - return False - # this function logs a message depending on which check fails - if not self.is_valid_version(): - return False - if self._guard < CUTOFF_GUARD: - log_excluded('%s not a candidate: guard avg too low (%lf)', - self._fpr, self._guard) - return False - if (not self._data.has_key('consensus_weight') - or self._data['consensus_weight'] < 1): - log_excluded('%s not a candidate: consensus weight invalid', self._fpr) - return False - except BaseException as e: - logging.warning("Exception %s when checking if fallback is a candidate", - str(e)) - return False - return True - - def is_in_whitelist(self, relaylist): - """ A fallback matches if each key in the whitelist line matches: - ipv4 - dirport - orport - id - ipv6 address and port (if present) - If the fallback has an ipv6 key, the whitelist line must also have - it, and vice versa, otherwise they don't match. """ - ipv6 = None - if self.has_ipv6(): - ipv6 = '%s:%d'%(self.ipv6addr, self.ipv6orport) - for entry in relaylist: - if entry['id'] != self._fpr: - # can't log here unless we match an IP and port, because every relay's - # fingerprint is compared to every entry's fingerprint - if entry['ipv4'] == self.dirip and int(entry['orport']) == self.orport: - logging.warning('%s excluded: has OR %s:%d changed fingerprint to ' + - '%s?', entry['id'], self.dirip, self.orport, - self._fpr) - if self.has_ipv6() and entry.has_key('ipv6') and entry['ipv6'] == ipv6: - logging.warning('%s excluded: has OR %s changed fingerprint to ' + - '%s?', entry['id'], ipv6, self._fpr) - continue - if entry['ipv4'] != self.dirip: - logging.warning('%s excluded: has it changed IPv4 from %s to %s?', - self._fpr, entry['ipv4'], self.dirip) - continue - if int(entry['dirport']) != self.dirport: - logging.warning('%s excluded: has it changed DirPort from %s:%d to ' + - '%s:%d?', self._fpr, self.dirip, int(entry['dirport']), - self.dirip, self.dirport) - continue - if int(entry['orport']) != self.orport: - logging.warning('%s excluded: has it changed ORPort from %s:%d to ' + - '%s:%d?', self._fpr, self.dirip, int(entry['orport']), - self.dirip, self.orport) - continue - if entry.has_key('ipv6') and self.has_ipv6(): - # if both entry and fallback have an ipv6 address, compare them - if entry['ipv6'] != ipv6: - logging.warning('%s excluded: has it changed IPv6 ORPort from %s ' + - 'to %s?', self._fpr, entry['ipv6'], ipv6) - continue - # if the fallback has an IPv6 address but the whitelist entry - # doesn't, or vice versa, the whitelist entry doesn't match - elif entry.has_key('ipv6') and not self.has_ipv6(): - logging.warning('%s excluded: has it lost its former IPv6 address %s?', - self._fpr, entry['ipv6']) - continue - elif not entry.has_key('ipv6') and self.has_ipv6(): - logging.warning('%s excluded: has it gained an IPv6 address %s?', - self._fpr, ipv6) - continue - return True - return False - - def is_in_blacklist(self, relaylist): - """ A fallback matches a blacklist line if a sufficiently specific group - of attributes matches: - ipv4 & dirport - ipv4 & orport - id - ipv6 & dirport - ipv6 & ipv6 orport - If the fallback and the blacklist line both have an ipv6 key, - their values will be compared, otherwise, they will be ignored. - If there is no dirport and no orport, the entry matches all relays on - that ip. """ - for entry in relaylist: - for key in entry: - value = entry[key] - if key == 'id' and value == self._fpr: - log_excluded('%s is in the blacklist: fingerprint matches', - self._fpr) - return True - if key == 'ipv4' and value == self.dirip: - # if the dirport is present, check it too - if entry.has_key('dirport'): - if int(entry['dirport']) == self.dirport: - log_excluded('%s is in the blacklist: IPv4 (%s) and ' + - 'DirPort (%d) match', self._fpr, self.dirip, - self.dirport) - return True - # if the orport is present, check it too - elif entry.has_key('orport'): - if int(entry['orport']) == self.orport: - log_excluded('%s is in the blacklist: IPv4 (%s) and ' + - 'ORPort (%d) match', self._fpr, self.dirip, - self.orport) - return True - else: - log_excluded('%s is in the blacklist: IPv4 (%s) matches, and ' + - 'entry has no DirPort or ORPort', self._fpr, - self.dirip) - return True - ipv6 = None - if self.has_ipv6(): - ipv6 = '%s:%d'%(self.ipv6addr, self.ipv6orport) - if (key == 'ipv6' and self.has_ipv6()): - # if both entry and fallback have an ipv6 address, compare them, - # otherwise, disregard ipv6 addresses - if value == ipv6: - # if the dirport is present, check it too - if entry.has_key('dirport'): - if int(entry['dirport']) == self.dirport: - log_excluded('%s is in the blacklist: IPv6 (%s) and ' + - 'DirPort (%d) match', self._fpr, ipv6, - self.dirport) - return True - # we've already checked the ORPort, it's part of entry['ipv6'] - else: - log_excluded('%s is in the blacklist: IPv6 (%s) matches, and' + - 'entry has no DirPort', self._fpr, ipv6) - return True - elif (key == 'ipv6' or self.has_ipv6()): - # only log if the fingerprint matches but the IPv6 doesn't - if entry.has_key('id') and entry['id'] == self._fpr: - log_excluded('%s skipping IPv6 blacklist comparison: relay ' + - 'has%s IPv6%s, but entry has%s IPv6%s', self._fpr, - '' if self.has_ipv6() else ' no', - (' (' + ipv6 + ')') if self.has_ipv6() else '', - '' if key == 'ipv6' else ' no', - (' (' + value + ')') if key == 'ipv6' else '') - logging.warning('Has %s %s IPv6 address %s?', self._fpr, - 'gained an' if self.has_ipv6() else 'lost its former', - ipv6 if self.has_ipv6() else value) - return False - - def cw_to_bw_factor(self): - # any relays with a missing or zero consensus weight are not candidates - # any relays with a missing advertised bandwidth have it set to zero - return self._data['advertised_bandwidth'] / self._data['consensus_weight'] - - # since advertised_bandwidth is reported by the relay, it can be gamed - # to avoid this, use the median consensus weight to bandwidth factor to - # estimate this relay's measured bandwidth, and make that the upper limit - def measured_bandwidth(self, median_cw_to_bw_factor): - cw_to_bw= median_cw_to_bw_factor - # Reduce exit bandwidth to make sure we're not overloading them - if self.is_exit(): - cw_to_bw *= EXIT_BANDWIDTH_FRACTION - measured_bandwidth = self._data['consensus_weight'] * cw_to_bw - if self._data['advertised_bandwidth'] != 0: - # limit advertised bandwidth (if available) to measured bandwidth - return min(measured_bandwidth, self._data['advertised_bandwidth']) - else: - return measured_bandwidth - - def set_measured_bandwidth(self, median_cw_to_bw_factor): - self._data['measured_bandwidth'] = self.measured_bandwidth( - median_cw_to_bw_factor) - - def is_exit(self): - return 'Exit' in self._data['flags'] - - def is_guard(self): - return 'Guard' in self._data['flags'] - - def is_running(self): - return 'Running' in self._data['flags'] - - # does this fallback have an IPv6 address and orport? - def has_ipv6(self): - return self.ipv6addr is not None and self.ipv6orport is not None - - # strip leading and trailing brackets from an IPv6 address - # safe to use on non-bracketed IPv6 and on IPv4 addresses - # also convert to unicode, and make None appear as '' - @staticmethod - def strip_ipv6_brackets(ip): - if ip is None: - return unicode('') - if len(ip) < 2: - return unicode(ip) - if ip[0] == '[' and ip[-1] == ']': - return unicode(ip[1:-1]) - return unicode(ip) - - # are ip_a and ip_b in the same netblock? - # mask_bits is the size of the netblock - # takes both IPv4 and IPv6 addresses - # the versions of ip_a and ip_b must be the same - # the mask must be valid for the IP version - @staticmethod - def netblocks_equal(ip_a, ip_b, mask_bits): - if ip_a is None or ip_b is None: - return False - ip_a = Candidate.strip_ipv6_brackets(ip_a) - ip_b = Candidate.strip_ipv6_brackets(ip_b) - a = ipaddress.ip_address(ip_a) - b = ipaddress.ip_address(ip_b) - if a.version != b.version: - raise Exception('Mismatching IP versions in %s and %s'%(ip_a, ip_b)) - if mask_bits > a.max_prefixlen: - logging.error('Bad IP mask %d for %s and %s'%(mask_bits, ip_a, ip_b)) - mask_bits = a.max_prefixlen - if mask_bits < 0: - logging.error('Bad IP mask %d for %s and %s'%(mask_bits, ip_a, ip_b)) - mask_bits = 0 - a_net = ipaddress.ip_network('%s/%d'%(ip_a, mask_bits), strict=False) - return b in a_net - - # is this fallback's IPv4 address (dirip) in the same netblock as other's - # IPv4 address? - # mask_bits is the size of the netblock - def ipv4_netblocks_equal(self, other, mask_bits): - return Candidate.netblocks_equal(self.dirip, other.dirip, mask_bits) - - # is this fallback's IPv6 address (ipv6addr) in the same netblock as - # other's IPv6 address? - # Returns False if either fallback has no IPv6 address - # mask_bits is the size of the netblock - def ipv6_netblocks_equal(self, other, mask_bits): - if not self.has_ipv6() or not other.has_ipv6(): - return False - return Candidate.netblocks_equal(self.ipv6addr, other.ipv6addr, mask_bits) - - # is this fallback's IPv4 DirPort the same as other's IPv4 DirPort? - def dirport_equal(self, other): - return self.dirport == other.dirport - - # is this fallback's IPv4 ORPort the same as other's IPv4 ORPort? - def ipv4_orport_equal(self, other): - return self.orport == other.orport - - # is this fallback's IPv6 ORPort the same as other's IPv6 ORPort? - # Returns False if either fallback has no IPv6 address - def ipv6_orport_equal(self, other): - if not self.has_ipv6() or not other.has_ipv6(): - return False - return self.ipv6orport == other.ipv6orport - - # does this fallback have the same DirPort, IPv4 ORPort, or - # IPv6 ORPort as other? - # Ignores IPv6 ORPort if either fallback has no IPv6 address - def port_equal(self, other): - return (self.dirport_equal(other) or self.ipv4_orport_equal(other) - or self.ipv6_orport_equal(other)) - - # return a list containing IPv4 ORPort, DirPort, and IPv6 ORPort (if present) - def port_list(self): - ports = [self.dirport, self.orport] - if self.has_ipv6() and not self.ipv6orport in ports: - ports.append(self.ipv6orport) - return ports - - # does this fallback share a port with other, regardless of whether the - # port types match? - # For example, if self's IPv4 ORPort is 80 and other's DirPort is 80, - # return True - def port_shared(self, other): - for p in self.port_list(): - if p in other.port_list(): - return True - return False - - # log how long it takes to download a consensus from dirip:dirport - # returns True if the download failed, False if it succeeded within max_time - @staticmethod - def fallback_consensus_download_speed(dirip, dirport, nickname, fingerprint, - max_time): - download_failed = False - # some directory mirrors respond to requests in ways that hang python - # sockets, which is why we log this line here - logging.info('Initiating %sconsensus download from %s (%s:%d) %s.', - 'microdesc ' if DOWNLOAD_MICRODESC_CONSENSUS else '', - nickname, dirip, dirport, fingerprint) - # there appears to be about 1 second of overhead when comparing stem's - # internal trace time and the elapsed time calculated here - TIMEOUT_SLOP = 1.0 - start = datetime.datetime.utcnow() - try: - consensus = get_consensus( - endpoints = [(dirip, dirport)], - timeout = (max_time + TIMEOUT_SLOP), - validate = True, - retries = 0, - fall_back_to_authority = False, - document_handler = DocumentHandler.BARE_DOCUMENT, - microdescriptor = DOWNLOAD_MICRODESC_CONSENSUS - ).run()[0] - end = datetime.datetime.utcnow() - time_since_expiry = (end - consensus.valid_until).total_seconds() - except Exception, stem_error: - end = datetime.datetime.utcnow() - log_excluded('Unable to retrieve a consensus from %s: %s', nickname, - stem_error) - status = 'error: "%s"' % (stem_error) - level = logging.WARNING - download_failed = True - elapsed = (end - start).total_seconds() - if download_failed: - # keep the error failure status, and avoid using the variables - pass - elif elapsed > max_time: - status = 'too slow' - level = logging.WARNING - download_failed = True - elif (time_since_expiry > 0): - status = 'outdated consensus, expired %ds ago'%(int(time_since_expiry)) - if time_since_expiry <= CONSENSUS_EXPIRY_TOLERANCE: - status += ', tolerating up to %ds'%(CONSENSUS_EXPIRY_TOLERANCE) - level = logging.INFO - else: - status += ', invalid' - level = logging.WARNING - download_failed = True - else: - status = 'ok' - level = logging.DEBUG - logging.log(level, 'Consensus download: %0.1fs %s from %s (%s:%d) %s, ' + - 'max download time %0.1fs.', elapsed, status, nickname, - dirip, dirport, fingerprint, max_time) - return download_failed - - # does this fallback download the consensus fast enough? - def check_fallback_download_consensus(self): - # include the relay if we're not doing a check, or we can't check (IPv6) - ipv4_failed = False - ipv6_failed = False - if PERFORM_IPV4_DIRPORT_CHECKS: - ipv4_failed = Candidate.fallback_consensus_download_speed(self.dirip, - self.dirport, - self._data['nickname'], - self._fpr, - CONSENSUS_DOWNLOAD_SPEED_MAX) - if self.has_ipv6() and PERFORM_IPV6_DIRPORT_CHECKS: - # Clients assume the IPv6 DirPort is the same as the IPv4 DirPort - ipv6_failed = Candidate.fallback_consensus_download_speed(self.ipv6addr, - self.dirport, - self._data['nickname'], - self._fpr, - CONSENSUS_DOWNLOAD_SPEED_MAX) - return ((not ipv4_failed) and (not ipv6_failed)) - - # if this fallback has not passed a download check, try it again, - # and record the result, available in get_fallback_download_consensus - def try_fallback_download_consensus(self): - if not self.get_fallback_download_consensus(): - self._data['download_check'] = self.check_fallback_download_consensus() - - # did this fallback pass the download check? - def get_fallback_download_consensus(self): - # if we're not performing checks, return True - if not PERFORM_IPV4_DIRPORT_CHECKS and not PERFORM_IPV6_DIRPORT_CHECKS: - return True - # if we are performing checks, but haven't done one, return False - if not self._data.has_key('download_check'): - return False - return self._data['download_check'] - - # output an optional header comment and info for this fallback - # try_fallback_download_consensus before calling this - def fallbackdir_line(self, fallbacks, prefilter_fallbacks): - s = '' - if OUTPUT_COMMENTS: - s += self.fallbackdir_comment(fallbacks, prefilter_fallbacks) - # if the download speed is ok, output a C string - # if it's not, but we OUTPUT_COMMENTS, output a commented-out C string - if self.get_fallback_download_consensus() or OUTPUT_COMMENTS: - s += self.fallbackdir_info(self.get_fallback_download_consensus()) - return s - - # output a header comment for this fallback - def fallbackdir_comment(self, fallbacks, prefilter_fallbacks): - # /* - # nickname - # flags - # adjusted bandwidth, consensus weight - # [contact] - # [identical contact counts] - # */ - # Multiline C comment - s = '/*' - s += '\n' - s += cleanse_c_multiline_comment(self._data['nickname']) - s += '\n' - s += 'Flags: ' - s += cleanse_c_multiline_comment(' '.join(sorted(self._data['flags']))) - s += '\n' - # this is an adjusted bandwidth, see calculate_measured_bandwidth() - bandwidth = self._data['measured_bandwidth'] - weight = self._data['consensus_weight'] - s += 'Bandwidth: %.1f MByte/s, Consensus Weight: %d'%( - bandwidth/(1024.0*1024.0), - weight) - s += '\n' - if self._data['contact'] is not None: - s += cleanse_c_multiline_comment(self._data['contact']) - if CONTACT_COUNT or CONTACT_BLACKLIST_COUNT: - fallback_count = len([f for f in fallbacks - if f._data['contact'] == self._data['contact']]) - if fallback_count > 1: - s += '\n' - s += '%d identical contacts listed' % (fallback_count) - if CONTACT_BLACKLIST_COUNT: - prefilter_count = len([f for f in prefilter_fallbacks - if f._data['contact'] == self._data['contact']]) - filter_count = prefilter_count - fallback_count - if filter_count > 0: - if fallback_count > 1: - s += ' ' - else: - s += '\n' - s += '%d blacklisted' % (filter_count) - s += '\n' - s += '*/' - s += '\n' - return s - - # output the fallback info C string for this fallback - # this is the text that would go after FallbackDir in a torrc - # if this relay failed the download test and we OUTPUT_COMMENTS, - # comment-out the returned string - def fallbackdir_info(self, dl_speed_ok): - # "address:dirport orport=port id=fingerprint" - # "[ipv6=addr:orport]" - # "weight=FALLBACK_OUTPUT_WEIGHT", - # - # Do we want a C string, or a commented-out string? - c_string = dl_speed_ok - comment_string = not dl_speed_ok and OUTPUT_COMMENTS - # If we don't want either kind of string, bail - if not c_string and not comment_string: - return '' - s = '' - # Comment out the fallback directory entry if it's too slow - # See the debug output for which address and port is failing - if comment_string: - s += '/* Consensus download failed or was too slow:\n' - # Multi-Line C string with trailing comma (part of a string list) - # This makes it easier to diff the file, and remove IPv6 lines using grep - # Integers don't need escaping - s += '"%s orport=%d id=%s"'%( - cleanse_c_string(self._data['dir_address']), - self.orport, - cleanse_c_string(self._fpr)) - s += '\n' - if self.has_ipv6(): - s += '" ipv6=%s:%d"'%(cleanse_c_string(self.ipv6addr), self.ipv6orport) - s += '\n' - s += '" weight=%d",'%(FALLBACK_OUTPUT_WEIGHT) - if comment_string: - s += '\n' - s += '*/' - return s - -## Fallback Candidate List Class - -class CandidateList(dict): - def __init__(self): - pass - - def _add_relay(self, details): - if not 'dir_address' in details: return - c = Candidate(details) - self[ c.get_fingerprint() ] = c - - def _add_uptime(self, uptime): - try: - fpr = uptime['fingerprint'] - except KeyError: - raise Exception("Document has no fingerprint field.") - - try: - c = self[fpr] - except KeyError: - logging.debug('Got unknown relay %s in uptime document.'%(fpr,)) - return - - c.add_uptime(uptime) - - def _add_details(self): - logging.debug('Loading details document.') - d = fetch('details', - fields=('fingerprint,nickname,contact,last_changed_address_or_port,' + - 'consensus_weight,advertised_bandwidth,or_addresses,' + - 'dir_address,recommended_version,flags,effective_family,' + - 'platform')) - logging.debug('Loading details document done.') - - if not 'relays' in d: raise Exception("No relays found in document.") - - for r in d['relays']: self._add_relay(r) - - def _add_uptimes(self): - logging.debug('Loading uptime document.') - d = fetch('uptime') - logging.debug('Loading uptime document done.') - - if not 'relays' in d: raise Exception("No relays found in document.") - for r in d['relays']: self._add_uptime(r) - - def add_relays(self): - self._add_details() - self._add_uptimes() - - def count_guards(self): - guard_count = 0 - for fpr in self.keys(): - if self[fpr].is_guard(): - guard_count += 1 - return guard_count - - # Find fallbacks that fit the uptime, stability, and flags criteria, - # and make an array of them in self.fallbacks - def compute_fallbacks(self): - self.fallbacks = map(lambda x: self[x], - filter(lambda x: self[x].is_candidate(), - self.keys())) - - # sort fallbacks by their consensus weight to advertised bandwidth factor, - # lowest to highest - # used to find the median cw_to_bw_factor() - def sort_fallbacks_by_cw_to_bw_factor(self): - self.fallbacks.sort(key=lambda f: f.cw_to_bw_factor()) - - # sort fallbacks by their measured bandwidth, highest to lowest - # calculate_measured_bandwidth before calling this - # this is useful for reviewing candidates in priority order - def sort_fallbacks_by_measured_bandwidth(self): - self.fallbacks.sort(key=lambda f: f._data['measured_bandwidth'], - reverse=True) - - # sort fallbacks by the data field data_field, lowest to highest - def sort_fallbacks_by(self, data_field): - self.fallbacks.sort(key=lambda f: f._data[data_field]) - - @staticmethod - def load_relaylist(file_obj): - """ Read each line in the file, and parse it like a FallbackDir line: - an IPv4 address and optional port: - : - which are parsed into dictionary entries: - ipv4= - dirport= - followed by a series of key=value entries: - orport= - id= - ipv6=: - each line's key/value pairs are placed in a dictonary, - (of string -> string key/value pairs), - and these dictionaries are placed in an array. - comments start with # and are ignored """ - file_data = file_obj['data'] - file_name = file_obj['name'] - relaylist = [] - if file_data is None: - return relaylist - for line in file_data.split('\n'): - relay_entry = {} - # ignore comments - line_comment_split = line.split('#') - line = line_comment_split[0] - # cleanup whitespace - line = cleanse_whitespace(line) - line = line.strip() - if len(line) == 0: - continue - for item in line.split(' '): - item = item.strip() - if len(item) == 0: - continue - key_value_split = item.split('=') - kvl = len(key_value_split) - if kvl < 1 or kvl > 2: - print '#error Bad %s item: %s, format is key=value.'%( - file_name, item) - if kvl == 1: - # assume that entries without a key are the ipv4 address, - # perhaps with a dirport - ipv4_maybe_dirport = key_value_split[0] - ipv4_maybe_dirport_split = ipv4_maybe_dirport.split(':') - dirl = len(ipv4_maybe_dirport_split) - if dirl < 1 or dirl > 2: - print '#error Bad %s IPv4 item: %s, format is ipv4:port.'%( - file_name, item) - if dirl >= 1: - relay_entry['ipv4'] = ipv4_maybe_dirport_split[0] - if dirl == 2: - relay_entry['dirport'] = ipv4_maybe_dirport_split[1] - elif kvl == 2: - relay_entry[key_value_split[0]] = key_value_split[1] - relaylist.append(relay_entry) - return relaylist - - # apply the fallback whitelist and blacklist - def apply_filter_lists(self, whitelist_obj, blacklist_obj): - excluded_count = 0 - logging.debug('Applying whitelist and blacklist.') - # parse the whitelist and blacklist - whitelist = self.load_relaylist(whitelist_obj) - blacklist = self.load_relaylist(blacklist_obj) - filtered_fallbacks = [] - for f in self.fallbacks: - in_whitelist = f.is_in_whitelist(whitelist) - in_blacklist = f.is_in_blacklist(blacklist) - if in_whitelist and in_blacklist: - if BLACKLIST_EXCLUDES_WHITELIST_ENTRIES: - # exclude - excluded_count += 1 - logging.warning('Excluding %s: in both blacklist and whitelist.', - f._fpr) - else: - # include - filtered_fallbacks.append(f) - elif in_whitelist: - # include - filtered_fallbacks.append(f) - elif in_blacklist: - # exclude - excluded_count += 1 - log_excluded('Excluding %s: in blacklist.', f._fpr) - else: - if INCLUDE_UNLISTED_ENTRIES: - # include - filtered_fallbacks.append(f) - else: - # exclude - excluded_count += 1 - log_excluded('Excluding %s: in neither blacklist nor whitelist.', - f._fpr) - self.fallbacks = filtered_fallbacks - return excluded_count - - @staticmethod - def summarise_filters(initial_count, excluded_count): - return '/* Whitelist & blacklist excluded %d of %d candidates. */'%( - excluded_count, initial_count) - - # calculate each fallback's measured bandwidth based on the median - # consensus weight to advertised bandwdith ratio - def calculate_measured_bandwidth(self): - self.sort_fallbacks_by_cw_to_bw_factor() - median_fallback = self.fallback_median(True) - if median_fallback is not None: - median_cw_to_bw_factor = median_fallback.cw_to_bw_factor() - else: - # this will never be used, because there are no fallbacks - median_cw_to_bw_factor = None - for f in self.fallbacks: - f.set_measured_bandwidth(median_cw_to_bw_factor) - - # remove relays with low measured bandwidth from the fallback list - # calculate_measured_bandwidth for each relay before calling this - def remove_low_bandwidth_relays(self): - if MIN_BANDWIDTH is None: - return - above_min_bw_fallbacks = [] - for f in self.fallbacks: - if f._data['measured_bandwidth'] >= MIN_BANDWIDTH: - above_min_bw_fallbacks.append(f) - else: - # the bandwidth we log here is limited by the relay's consensus weight - # as well as its adverttised bandwidth. See set_measured_bandwidth - # for details - log_excluded('%s not a candidate: bandwidth %.1fMByte/s too low, ' + - 'must be at least %.1fMByte/s', f._fpr, - f._data['measured_bandwidth']/(1024.0*1024.0), - MIN_BANDWIDTH/(1024.0*1024.0)) - self.fallbacks = above_min_bw_fallbacks - - # the minimum fallback in the list - # call one of the sort_fallbacks_* functions before calling this - def fallback_min(self): - if len(self.fallbacks) > 0: - return self.fallbacks[-1] - else: - return None - - # the median fallback in the list - # call one of the sort_fallbacks_* functions before calling this - def fallback_median(self, require_advertised_bandwidth): - # use the low-median when there are an evan number of fallbacks, - # for consistency with the bandwidth authorities - if len(self.fallbacks) > 0: - median_position = (len(self.fallbacks) - 1) / 2 - if not require_advertised_bandwidth: - return self.fallbacks[median_position] - # if we need advertised_bandwidth but this relay doesn't have it, - # move to a fallback with greater consensus weight until we find one - while not self.fallbacks[median_position]._data['advertised_bandwidth']: - median_position += 1 - if median_position >= len(self.fallbacks): - return None - return self.fallbacks[median_position] - else: - return None - - # the maximum fallback in the list - # call one of the sort_fallbacks_* functions before calling this - def fallback_max(self): - if len(self.fallbacks) > 0: - return self.fallbacks[0] - else: - return None - - # return a new bag suitable for storing attributes - @staticmethod - def attribute_new(): - return dict() - - # get the count of attribute in attribute_bag - # if attribute is None or the empty string, return 0 - @staticmethod - def attribute_count(attribute, attribute_bag): - if attribute is None or attribute == '': - return 0 - if attribute not in attribute_bag: - return 0 - return attribute_bag[attribute] - - # does attribute_bag contain more than max_count instances of attribute? - # if so, return False - # if not, return True - # if attribute is None or the empty string, or max_count is invalid, - # always return True - @staticmethod - def attribute_allow(attribute, attribute_bag, max_count=1): - if attribute is None or attribute == '' or max_count <= 0: - return True - elif CandidateList.attribute_count(attribute, attribute_bag) >= max_count: - return False - else: - return True - - # add attribute to attribute_bag, incrementing the count if it is already - # present - # if attribute is None or the empty string, or count is invalid, - # do nothing - @staticmethod - def attribute_add(attribute, attribute_bag, count=1): - if attribute is None or attribute == '' or count <= 0: - pass - attribute_bag.setdefault(attribute, 0) - attribute_bag[attribute] += count - - # make sure there are only MAX_FALLBACKS_PER_IP fallbacks per IPv4 address, - # and per IPv6 address - # there is only one IPv4 address on each fallback: the IPv4 DirPort address - # (we choose the IPv4 ORPort which is on the same IPv4 as the DirPort) - # there is at most one IPv6 address on each fallback: the IPv6 ORPort address - # we try to match the IPv4 ORPort, but will use any IPv6 address if needed - # (clients only use the IPv6 ORPort) - # if there is no IPv6 address, only the IPv4 address is checked - # return the number of candidates we excluded - def limit_fallbacks_same_ip(self): - ip_limit_fallbacks = [] - ip_list = CandidateList.attribute_new() - for f in self.fallbacks: - if (CandidateList.attribute_allow(f.dirip, ip_list, - MAX_FALLBACKS_PER_IPV4) - and CandidateList.attribute_allow(f.ipv6addr, ip_list, - MAX_FALLBACKS_PER_IPV6)): - ip_limit_fallbacks.append(f) - CandidateList.attribute_add(f.dirip, ip_list) - if f.has_ipv6(): - CandidateList.attribute_add(f.ipv6addr, ip_list) - elif not CandidateList.attribute_allow(f.dirip, ip_list, - MAX_FALLBACKS_PER_IPV4): - log_excluded('Eliminated %s: already have %d fallback(s) on IPv4 %s' - %(f._fpr, CandidateList.attribute_count(f.dirip, ip_list), - f.dirip)) - elif (f.has_ipv6() and - not CandidateList.attribute_allow(f.ipv6addr, ip_list, - MAX_FALLBACKS_PER_IPV6)): - log_excluded('Eliminated %s: already have %d fallback(s) on IPv6 %s' - %(f._fpr, CandidateList.attribute_count(f.ipv6addr, - ip_list), - f.ipv6addr)) - original_count = len(self.fallbacks) - self.fallbacks = ip_limit_fallbacks - return original_count - len(self.fallbacks) - - # make sure there are only MAX_FALLBACKS_PER_CONTACT fallbacks for each - # ContactInfo - # if there is no ContactInfo, allow the fallback - # this check can be gamed by providing no ContactInfo, or by setting the - # ContactInfo to match another fallback - # However, given the likelihood that relays with the same ContactInfo will - # go down at similar times, its usefulness outweighs the risk - def limit_fallbacks_same_contact(self): - contact_limit_fallbacks = [] - contact_list = CandidateList.attribute_new() - for f in self.fallbacks: - if CandidateList.attribute_allow(f._data['contact'], contact_list, - MAX_FALLBACKS_PER_CONTACT): - contact_limit_fallbacks.append(f) - CandidateList.attribute_add(f._data['contact'], contact_list) - else: - log_excluded( - 'Eliminated %s: already have %d fallback(s) on ContactInfo %s' - %(f._fpr, CandidateList.attribute_count(f._data['contact'], - contact_list), - f._data['contact'])) - original_count = len(self.fallbacks) - self.fallbacks = contact_limit_fallbacks - return original_count - len(self.fallbacks) - - # make sure there are only MAX_FALLBACKS_PER_FAMILY fallbacks per effective - # family - # if there is no family, allow the fallback - # we use effective family, which ensures mutual family declarations - # but the check can be gamed by not declaring a family at all - # if any indirect families exist, the result depends on the order in which - # fallbacks are sorted in the list - def limit_fallbacks_same_family(self): - family_limit_fallbacks = [] - fingerprint_list = CandidateList.attribute_new() - for f in self.fallbacks: - if CandidateList.attribute_allow(f._fpr, fingerprint_list, - MAX_FALLBACKS_PER_FAMILY): - family_limit_fallbacks.append(f) - CandidateList.attribute_add(f._fpr, fingerprint_list) - for family_fingerprint in f._data['effective_family']: - CandidateList.attribute_add(family_fingerprint, fingerprint_list) - else: - # we already have a fallback with this fallback in its effective - # family - log_excluded( - 'Eliminated %s: already have %d fallback(s) in effective family' - %(f._fpr, CandidateList.attribute_count(f._fpr, fingerprint_list))) - original_count = len(self.fallbacks) - self.fallbacks = family_limit_fallbacks - return original_count - len(self.fallbacks) - - # try a download check on each fallback candidate in order - # stop after max_count successful downloads - # but don't remove any candidates from the array - def try_download_consensus_checks(self, max_count): - dl_ok_count = 0 - for f in self.fallbacks: - f.try_fallback_download_consensus() - if f.get_fallback_download_consensus(): - # this fallback downloaded a consensus ok - dl_ok_count += 1 - if dl_ok_count >= max_count: - # we have enough fallbacks - return - - # put max_count successful candidates in the fallbacks array: - # - perform download checks on each fallback candidate - # - retry failed candidates if CONSENSUS_DOWNLOAD_RETRY is set - # - eliminate failed candidates - # - if there are more than max_count candidates, eliminate lowest bandwidth - # - if there are fewer than max_count candidates, leave only successful - # Return the number of fallbacks that failed the consensus check - def perform_download_consensus_checks(self, max_count): - self.sort_fallbacks_by_measured_bandwidth() - self.try_download_consensus_checks(max_count) - if CONSENSUS_DOWNLOAD_RETRY: - # try unsuccessful candidates again - # we could end up with more than max_count successful candidates here - self.try_download_consensus_checks(max_count) - # now we have at least max_count successful candidates, - # or we've tried them all - original_count = len(self.fallbacks) - self.fallbacks = filter(lambda x: x.get_fallback_download_consensus(), - self.fallbacks) - # some of these failed the check, others skipped the check, - # if we already had enough successful downloads - failed_count = original_count - len(self.fallbacks) - self.fallbacks = self.fallbacks[:max_count] - return failed_count - - # return a string that describes a/b as a percentage - @staticmethod - def describe_percentage(a, b): - if b != 0: - return '%d/%d = %.0f%%'%(a, b, (a*100.0)/b) - else: - # technically, 0/0 is undefined, but 0.0% is a sensible result - return '%d/%d = %.0f%%'%(a, b, 0.0) - - # return a dictionary of lists of fallbacks by IPv4 netblock - # the dictionary is keyed by the fingerprint of an arbitrary fallback - # in each netblock - # mask_bits is the size of the netblock - def fallbacks_by_ipv4_netblock(self, mask_bits): - netblocks = {} - for f in self.fallbacks: - found_netblock = False - for b in netblocks.keys(): - # we found an existing netblock containing this fallback - if f.ipv4_netblocks_equal(self[b], mask_bits): - # add it to the list - netblocks[b].append(f) - found_netblock = True - break - # make a new netblock based on this fallback's fingerprint - if not found_netblock: - netblocks[f._fpr] = [f] - return netblocks - - # return a dictionary of lists of fallbacks by IPv6 netblock - # where mask_bits is the size of the netblock - def fallbacks_by_ipv6_netblock(self, mask_bits): - netblocks = {} - for f in self.fallbacks: - # skip fallbacks without IPv6 addresses - if not f.has_ipv6(): - continue - found_netblock = False - for b in netblocks.keys(): - # we found an existing netblock containing this fallback - if f.ipv6_netblocks_equal(self[b], mask_bits): - # add it to the list - netblocks[b].append(f) - found_netblock = True - break - # make a new netblock based on this fallback's fingerprint - if not found_netblock: - netblocks[f._fpr] = [f] - return netblocks - - # log a message about the proportion of fallbacks in each IPv4 netblock, - # where mask_bits is the size of the netblock - def describe_fallback_ipv4_netblock_mask(self, mask_bits): - fallback_count = len(self.fallbacks) - shared_netblock_fallback_count = 0 - most_frequent_netblock = None - netblocks = self.fallbacks_by_ipv4_netblock(mask_bits) - for b in netblocks.keys(): - if len(netblocks[b]) > 1: - # how many fallbacks are in a netblock with other fallbacks? - shared_netblock_fallback_count += len(netblocks[b]) - # what's the netblock with the most fallbacks? - if (most_frequent_netblock is None - or len(netblocks[b]) > len(netblocks[most_frequent_netblock])): - most_frequent_netblock = b - logging.debug('Fallback IPv4 addresses in the same /%d:'%(mask_bits)) - for f in netblocks[b]: - logging.debug('%s - %s', f.dirip, f._fpr) - if most_frequent_netblock is not None: - logging.warning('There are %s fallbacks in the IPv4 /%d containing %s'%( - CandidateList.describe_percentage( - len(netblocks[most_frequent_netblock]), - fallback_count), - mask_bits, - self[most_frequent_netblock].dirip)) - if shared_netblock_fallback_count > 0: - logging.warning(('%s of fallbacks are in an IPv4 /%d with other ' + - 'fallbacks')%(CandidateList.describe_percentage( - shared_netblock_fallback_count, - fallback_count), - mask_bits)) - - # log a message about the proportion of fallbacks in each IPv6 netblock, - # where mask_bits is the size of the netblock - def describe_fallback_ipv6_netblock_mask(self, mask_bits): - fallback_count = len(self.fallbacks_with_ipv6()) - shared_netblock_fallback_count = 0 - most_frequent_netblock = None - netblocks = self.fallbacks_by_ipv6_netblock(mask_bits) - for b in netblocks.keys(): - if len(netblocks[b]) > 1: - # how many fallbacks are in a netblock with other fallbacks? - shared_netblock_fallback_count += len(netblocks[b]) - # what's the netblock with the most fallbacks? - if (most_frequent_netblock is None - or len(netblocks[b]) > len(netblocks[most_frequent_netblock])): - most_frequent_netblock = b - logging.debug('Fallback IPv6 addresses in the same /%d:'%(mask_bits)) - for f in netblocks[b]: - logging.debug('%s - %s', f.ipv6addr, f._fpr) - if most_frequent_netblock is not None: - logging.warning('There are %s fallbacks in the IPv6 /%d containing %s'%( - CandidateList.describe_percentage( - len(netblocks[most_frequent_netblock]), - fallback_count), - mask_bits, - self[most_frequent_netblock].ipv6addr)) - if shared_netblock_fallback_count > 0: - logging.warning(('%s of fallbacks are in an IPv6 /%d with other ' + - 'fallbacks')%(CandidateList.describe_percentage( - shared_netblock_fallback_count, - fallback_count), - mask_bits)) - - # log a message about the proportion of fallbacks in each IPv4 /8, /16, - # and /24 - def describe_fallback_ipv4_netblocks(self): - # this doesn't actually tell us anything useful - #self.describe_fallback_ipv4_netblock_mask(8) - self.describe_fallback_ipv4_netblock_mask(16) - self.describe_fallback_ipv4_netblock_mask(24) - - # log a message about the proportion of fallbacks in each IPv6 /12 (RIR), - # /23 (smaller RIR blocks), /32 (LIR), /48 (Customer), and /64 (Host) - # https://www.iana.org/assignments/ipv6-unicast-address-assignments/ - def describe_fallback_ipv6_netblocks(self): - # these don't actually tell us anything useful - #self.describe_fallback_ipv6_netblock_mask(12) - #self.describe_fallback_ipv6_netblock_mask(23) - self.describe_fallback_ipv6_netblock_mask(32) - self.describe_fallback_ipv6_netblock_mask(48) - self.describe_fallback_ipv6_netblock_mask(64) - - # log a message about the proportion of fallbacks in each IPv4 and IPv6 - # netblock - def describe_fallback_netblocks(self): - self.describe_fallback_ipv4_netblocks() - self.describe_fallback_ipv6_netblocks() - - # return a list of fallbacks which are on the IPv4 ORPort port - def fallbacks_on_ipv4_orport(self, port): - return filter(lambda x: x.orport == port, self.fallbacks) - - # return a list of fallbacks which are on the IPv6 ORPort port - def fallbacks_on_ipv6_orport(self, port): - return filter(lambda x: x.ipv6orport == port, self.fallbacks_with_ipv6()) - - # return a list of fallbacks which are on the DirPort port - def fallbacks_on_dirport(self, port): - return filter(lambda x: x.dirport == port, self.fallbacks) - - # log a message about the proportion of fallbacks on IPv4 ORPort port - # and return that count - def describe_fallback_ipv4_orport(self, port): - port_count = len(self.fallbacks_on_ipv4_orport(port)) - fallback_count = len(self.fallbacks) - logging.warning('%s of fallbacks are on IPv4 ORPort %d'%( - CandidateList.describe_percentage(port_count, - fallback_count), - port)) - return port_count - - # log a message about the proportion of IPv6 fallbacks on IPv6 ORPort port - # and return that count - def describe_fallback_ipv6_orport(self, port): - port_count = len(self.fallbacks_on_ipv6_orport(port)) - fallback_count = len(self.fallbacks_with_ipv6()) - logging.warning('%s of IPv6 fallbacks are on IPv6 ORPort %d'%( - CandidateList.describe_percentage(port_count, - fallback_count), - port)) - return port_count - - # log a message about the proportion of fallbacks on DirPort port - # and return that count - def describe_fallback_dirport(self, port): - port_count = len(self.fallbacks_on_dirport(port)) - fallback_count = len(self.fallbacks) - logging.warning('%s of fallbacks are on DirPort %d'%( - CandidateList.describe_percentage(port_count, - fallback_count), - port)) - return port_count - - # log a message about the proportion of fallbacks on each dirport, - # each IPv4 orport, and each IPv6 orport - def describe_fallback_ports(self): - fallback_count = len(self.fallbacks) - ipv4_or_count = fallback_count - ipv4_or_count -= self.describe_fallback_ipv4_orport(443) - ipv4_or_count -= self.describe_fallback_ipv4_orport(9001) - logging.warning('%s of fallbacks are on other IPv4 ORPorts'%( - CandidateList.describe_percentage(ipv4_or_count, - fallback_count))) - ipv6_fallback_count = len(self.fallbacks_with_ipv6()) - ipv6_or_count = ipv6_fallback_count - ipv6_or_count -= self.describe_fallback_ipv6_orport(443) - ipv6_or_count -= self.describe_fallback_ipv6_orport(9001) - logging.warning('%s of IPv6 fallbacks are on other IPv6 ORPorts'%( - CandidateList.describe_percentage(ipv6_or_count, - ipv6_fallback_count))) - dir_count = fallback_count - dir_count -= self.describe_fallback_dirport(80) - dir_count -= self.describe_fallback_dirport(9030) - logging.warning('%s of fallbacks are on other DirPorts'%( - CandidateList.describe_percentage(dir_count, - fallback_count))) - - # return a list of fallbacks which have the Exit flag - def fallbacks_with_exit(self): - return filter(lambda x: x.is_exit(), self.fallbacks) - - # log a message about the proportion of fallbacks with an Exit flag - def describe_fallback_exit_flag(self): - exit_falback_count = len(self.fallbacks_with_exit()) - fallback_count = len(self.fallbacks) - logging.warning('%s of fallbacks have the Exit flag'%( - CandidateList.describe_percentage(exit_falback_count, - fallback_count))) - - # return a list of fallbacks which have an IPv6 address - def fallbacks_with_ipv6(self): - return filter(lambda x: x.has_ipv6(), self.fallbacks) - - # log a message about the proportion of fallbacks on IPv6 - def describe_fallback_ip_family(self): - ipv6_falback_count = len(self.fallbacks_with_ipv6()) - fallback_count = len(self.fallbacks) - logging.warning('%s of fallbacks are on IPv6'%( - CandidateList.describe_percentage(ipv6_falback_count, - fallback_count))) - - def summarise_fallbacks(self, eligible_count, operator_count, failed_count, - guard_count, target_count): - s = '' - s += '/* To comment-out entries in this file, use C comments, and add *' - s += ' to the start of each line. (stem finds fallback entries using "' - s += ' at the start of a line.) */' - s += '\n' - # Report: - # whether we checked consensus download times - # the number of fallback directories (and limits/exclusions, if relevant) - # min & max fallback bandwidths - # #error if below minimum count - if PERFORM_IPV4_DIRPORT_CHECKS or PERFORM_IPV6_DIRPORT_CHECKS: - s += '/* Checked %s%s%s DirPorts served a consensus within %.1fs. */'%( - 'IPv4' if PERFORM_IPV4_DIRPORT_CHECKS else '', - ' and ' if (PERFORM_IPV4_DIRPORT_CHECKS - and PERFORM_IPV6_DIRPORT_CHECKS) else '', - 'IPv6' if PERFORM_IPV6_DIRPORT_CHECKS else '', - CONSENSUS_DOWNLOAD_SPEED_MAX) - else: - s += '/* Did not check IPv4 or IPv6 DirPort consensus downloads. */' - s += '\n' - # Multiline C comment with #error if things go bad - s += '/*' - s += '\n' - # Integers don't need escaping in C comments - fallback_count = len(self.fallbacks) - if FALLBACK_PROPORTION_OF_GUARDS is None: - fallback_proportion = '' - else: - fallback_proportion = ', Target %d (%d * %.2f)'%(target_count, - guard_count, - FALLBACK_PROPORTION_OF_GUARDS) - s += 'Final Count: %d (Eligible %d%s'%(fallback_count, eligible_count, - fallback_proportion) - if MAX_FALLBACK_COUNT is not None: - s += ', Max %d'%(MAX_FALLBACK_COUNT) - s += ')\n' - if eligible_count != fallback_count: - removed_count = eligible_count - fallback_count - excess_to_target_or_max = (eligible_count - operator_count - failed_count - - fallback_count) - # some 'Failed' failed the check, others 'Skipped' the check, - # if we already had enough successful downloads - s += ('Excluded: %d (Same Operator %d, Failed/Skipped Download %d, ' + - 'Excess %d)')%(removed_count, operator_count, failed_count, - excess_to_target_or_max) - s += '\n' - min_fb = self.fallback_min() - min_bw = min_fb._data['measured_bandwidth'] - max_fb = self.fallback_max() - max_bw = max_fb._data['measured_bandwidth'] - s += 'Bandwidth Range: %.1f - %.1f MByte/s'%(min_bw/(1024.0*1024.0), - max_bw/(1024.0*1024.0)) - s += '\n' - s += '*/' - if fallback_count < MIN_FALLBACK_COUNT: - # We must have a minimum number of fallbacks so they are always - # reachable, and are in diverse locations - s += '\n' - s += '#error Fallback Count %d is too low. '%(fallback_count) - s += 'Must be at least %d for diversity. '%(MIN_FALLBACK_COUNT) - s += 'Try adding entries to the whitelist, ' - s += 'or setting INCLUDE_UNLISTED_ENTRIES = True.' - return s - -def process_existing(): - logging.basicConfig(level=logging.INFO) - logging.getLogger('stem').setLevel(logging.INFO) - whitelist = {'data': parse_fallback_file(FALLBACK_FILE_NAME), - 'name': FALLBACK_FILE_NAME} - blacklist = {'data': read_from_file(BLACKLIST_FILE_NAME, MAX_LIST_FILE_SIZE), - 'name': BLACKLIST_FILE_NAME} - list_fallbacks(whitelist, blacklist) - -def process_default(): - logging.basicConfig(level=logging.WARNING) - logging.getLogger('stem').setLevel(logging.WARNING) - whitelist = {'data': read_from_file(WHITELIST_FILE_NAME, MAX_LIST_FILE_SIZE), - 'name': WHITELIST_FILE_NAME} - blacklist = {'data': read_from_file(BLACKLIST_FILE_NAME, MAX_LIST_FILE_SIZE), - 'name': BLACKLIST_FILE_NAME} - list_fallbacks(whitelist, blacklist) - -## Main Function -def main(): - if get_command() == 'check_existing': - process_existing() - else: - process_default() - -def get_command(): - if len(sys.argv) == 2: - return sys.argv[1] - else: - return None - -def log_excluded(msg, *args): - if get_command() == 'check_existing': - logging.warning(msg, *args) - else: - logging.info(msg, *args) - -def list_fallbacks(whitelist, blacklist): - """ Fetches required onionoo documents and evaluates the - fallback directory criteria for each of the relays """ - - logging.warning('Downloading and parsing Onionoo data. ' + - 'This may take some time.') - # find relays that could be fallbacks - candidates = CandidateList() - candidates.add_relays() - - # work out how many fallbacks we want - guard_count = candidates.count_guards() - if FALLBACK_PROPORTION_OF_GUARDS is None: - target_count = guard_count - else: - target_count = int(guard_count * FALLBACK_PROPORTION_OF_GUARDS) - # the maximum number of fallbacks is the least of: - # - the target fallback count (FALLBACK_PROPORTION_OF_GUARDS * guard count) - # - the maximum fallback count (MAX_FALLBACK_COUNT) - if MAX_FALLBACK_COUNT is None: - max_count = target_count - else: - max_count = min(target_count, MAX_FALLBACK_COUNT) - - candidates.compute_fallbacks() - prefilter_fallbacks = copy.copy(candidates.fallbacks) - - # filter with the whitelist and blacklist - # if a relay has changed IPv4 address or ports recently, it will be excluded - # as ineligible before we call apply_filter_lists, and so there will be no - # warning that the details have changed from those in the whitelist. - # instead, there will be an info-level log during the eligibility check. - initial_count = len(candidates.fallbacks) - excluded_count = candidates.apply_filter_lists(whitelist, blacklist) - print candidates.summarise_filters(initial_count, excluded_count) - eligible_count = len(candidates.fallbacks) - - # calculate the measured bandwidth of each relay, - # then remove low-bandwidth relays - candidates.calculate_measured_bandwidth() - candidates.remove_low_bandwidth_relays() - - # print the raw fallback list - #for x in candidates.fallbacks: - # print x.fallbackdir_line(True) - # print json.dumps(candidates[x]._data, sort_keys=True, indent=4, - # separators=(',', ': '), default=json_util.default) - - # impose mandatory conditions here, like one per contact, family, IP - # in measured bandwidth order - candidates.sort_fallbacks_by_measured_bandwidth() - operator_count = 0 - # only impose these limits on the final list - operators can nominate - # multiple candidate fallbacks, and then we choose the best set - if not OUTPUT_CANDIDATES: - operator_count += candidates.limit_fallbacks_same_ip() - operator_count += candidates.limit_fallbacks_same_contact() - operator_count += candidates.limit_fallbacks_same_family() - - # check if each candidate can serve a consensus - # there's a small risk we've eliminated relays from the same operator that - # can serve a consensus, in favour of one that can't - # but given it takes up to 15 seconds to check each consensus download, - # the risk is worth it - if PERFORM_IPV4_DIRPORT_CHECKS or PERFORM_IPV6_DIRPORT_CHECKS: - logging.warning('Checking consensus download speeds. ' + - 'This may take some time.') - failed_count = candidates.perform_download_consensus_checks(max_count) - - # analyse and log interesting diversity metrics - # like netblock, ports, exit, IPv4-only - # (we can't easily analyse AS, and it's hard to accurately analyse country) - candidates.describe_fallback_ip_family() - # if we can't import the ipaddress module, we can't do netblock analysis - if HAVE_IPADDRESS: - candidates.describe_fallback_netblocks() - candidates.describe_fallback_ports() - candidates.describe_fallback_exit_flag() - - # output C comments summarising the fallback selection process - if len(candidates.fallbacks) > 0: - print candidates.summarise_fallbacks(eligible_count, operator_count, - failed_count, guard_count, - target_count) - else: - print '/* No Fallbacks met criteria */' - - # output C comments specifying the OnionOO data used to create the list - for s in fetch_source_list(): - print describe_fetch_source(s) - - # sort the list differently depending on why we've created it: - # if we're outputting the final fallback list, sort by fingerprint - # this makes diffs much more stable - # otherwise, if we're trying to find a bandwidth cutoff, or we want to - # contact operators in priority order, sort by bandwidth (not yet - # implemented) - # otherwise, if we're contacting operators, sort by contact - candidates.sort_fallbacks_by(OUTPUT_SORT_FIELD) - - for x in candidates.fallbacks: - print x.fallbackdir_line(candidates.fallbacks, prefilter_fallbacks) - -if __name__ == "__main__": - main() diff --git a/src/tor/scripts/maint/updateVersions.pl.in b/src/tor/scripts/maint/updateVersions.pl.in deleted file mode 100644 index 65c51a1f2..000000000 --- a/src/tor/scripts/maint/updateVersions.pl.in +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/perl -w - -$CONFIGURE_IN = '@abs_top_srcdir@/configure.ac'; -$ORCONFIG_H = '@abs_top_srcdir@/src/win32/orconfig.h'; -$TOR_NSI = '@abs_top_srcdir@/contrib/win32build/tor-mingw.nsi.in'; - -$quiet = 1; - -sub demand { - my $fn = shift; - die "Missing file $fn" unless (-f $fn); -} - -demand($CONFIGURE_IN); -demand($ORCONFIG_H); -demand($TOR_NSI); - -# extract version from configure.ac - -open(F, $CONFIGURE_IN) or die "$!"; -$version = undef; -while () { - if (/AC_INIT\(\[tor\],\s*\[([^\]]*)\]\)/) { - $version = $1; - last; - } -} -die "No version found" unless $version; -print "Tor version is $version\n" unless $quiet; -close F; - -sub correctversion { - my ($fn, $defchar) = @_; - undef $/; - open(F, $fn) or die "$!"; - my $s = ; - close F; - if ($s =~ /^$defchar(?:)define\s+VERSION\s+\"([^\"]+)\"/m) { - $oldver = $1; - if ($oldver ne $version) { - print "Version mismatch in $fn: It thinks that the version is $oldver. I think it's $version. Fixing.\n"; - $line = $defchar . "define VERSION \"$version\""; - open(F, ">$fn.bak"); - print F $s; - close F; - $s =~ s/^$defchar(?:)define\s+VERSION.*?$/$line/m; - open(F, ">$fn"); - print F $s; - close F; - } else { - print "$fn has the correct version. Good.\n" unless $quiet; - } - } else { - print "Didn't find a version line in $fn -- uh oh.\n"; - } -} - -correctversion($TOR_NSI, "!"); -correctversion($ORCONFIG_H, "#"); diff --git a/src/tor/scripts/test/cov-blame b/src/tor/scripts/test/cov-blame deleted file mode 100644 index 601f21195..000000000 --- a/src/tor/scripts/test/cov-blame +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python - -import os -import re -import subprocess -import sys - -def handle_file(source_fname, cov_fname): - - lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines() - lines_cov = open(cov_fname).readlines() - - # XXXX expensive! - while re.match(r'\s*-:\s*0:', lines_cov[0]): - del lines_cov[0] - - if len(lines_blm) != len(lines_cov): - print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname - - for b,c in zip(lines_blm, lines_cov): - m = re.match(r'\s*([^\s:]+):', c) - if not m: - print >>sys.stderr, "CONFUSING LINE %r"% c - cov = 'X' - elif m.group(1) == '-': - cov = '-' - elif m.group(1)[0] == '#': - cov = '#' - elif m.group(1)[0].isdigit(): - cov = '1' - else: - print >>sys.stderr, "CONFUSING LINE %r"% c - cov = 'X' - - print cov, b, - -COV_DIR = sys.argv[1] -SOURCES = sys.argv[2:] - -for fn in SOURCES: - _, base = os.path.split(fn) - cfn = os.path.join(COV_DIR, base) - cfn += ".gcov" - if os.path.exists(cfn): - handle_file(fn, cfn) - else: - print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn - diff --git a/src/tor/scripts/test/cov-diff b/src/tor/scripts/test/cov-diff deleted file mode 100644 index ed8874d2d..000000000 --- a/src/tor/scripts/test/cov-diff +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Copyright 2013 The Tor Project, Inc. -# See LICENSE for licensing information. - -# cov-diff -- compare two directories full of gcov files. - -DIRA="$1" -DIRB="$2" - -for B in $DIRB/*; do - A=$DIRA/`basename $B` - if [ -f $A ]; then - perl -pe 's/^\s*\!*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/; s/^ *-:(Runs|Programs):.*//;' "$A" > "$A.tmp" - else - cat /dev/null > "$A.tmp" - fi - perl -pe 's/^\s*\!*\d+:/ 1:/; s/^([^:]+:)[\d\s]+:/$1/; s/^ *-:(Runs|Programs):.*//;' "$B" > "$B.tmp" - diff -u "$A.tmp" "$B.tmp" - rm "$A.tmp" "$B.tmp" -done - diff --git a/src/tor/scripts/test/cov-display b/src/tor/scripts/test/cov-display deleted file mode 100644 index 4628cd589..000000000 --- a/src/tor/scripts/test/cov-display +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/python -import sys, re, os - -none0, some0 = 0,0 -branchTaken0, branchNot0 = 0,0 - -BRANCH = False -FUNC = False - -if sys.argv[1] == '-b': - BRANCH = True - del sys.argv[1] - -if sys.argv[1] == '-f': - FUNC = True - del sys.argv[1] - -def show(name, none, some): - if some+none == 0: - none = 1 - print name, none, some, "%.02f"%(100*(float(some)/(some+none))) - - -file_args = sys.argv[1:] -files = [] -for fn in file_args: - if os.path.isdir(fn): - files.extend(os.path.join(fn, f) for f in os.listdir(fn)) - else: - files.append(fn) - -for fn in files: - none = some = branchTaken = branchNot = 0 - inFunc = "" - for line in open(fn, 'r'): - m = re.match(r'^[^:]*:([^:]*):(.*)', line) - if m: - body = m.group(2).rstrip() - lineno = m.group(1).strip() - else: - body = "" - lineno = "?" - m = re.match(r'^([A-Za-z_][A-Za-z0-9_]*)(?:, *)?\(', body) - if m: - inFunc = "%s:%s %s" %(fn,lineno,m.group(1)) - elif body == "}": - if FUNC and inFunc: - show(inFunc, none, some) - none = some = 0 - inFunc = None - if re.match(r'^ *###', line): - none += 1 - elif re.match(r'^ *\d', line): - some += 1 - else: - m = re.match(r'^branch.*taken (\d+)%', line) - if m: - if int(m.group(1)) == 0: - branchNot += 1 - else: - branchTaken += 1 - - none0 += none - some0 += some - branchTaken0 += branchTaken - branchNot0 += branchNot - if FUNC: - pass - elif BRANCH: - if branchTaken or branchNot: - show(fn, branchNot, branchTaken) - else: - if some or none: - show(fn, none, some) - -if BRANCH: - if branchTaken0 or branchNot0: - show("TOTAL", branchNot0, branchTaken0) -else: - if some0 or none0: - show("TOTAL", none0, some0) diff --git a/src/tor/scripts/test/cov-exclude b/src/tor/scripts/test/cov-exclude deleted file mode 100644 index 5cb9b1282..000000000 --- a/src/tor/scripts/test/cov-exclude +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/perl -p -i - -use warnings; -use strict; -our $excluding; - -# This script is meant to post-process a .gcov file for an input source -# that was annotated with LCOV_EXCL_START, LCOV_EXCL_STOP, and LCOV_EXCL_LINE -# entries. It doesn't understand the LCOV_EXCL_BR* variations. -# -# It replaces unreached reached lines with x:, and reached excluded lines -# with !!!num:. - -BEGIN { our $excluding = 0; } - -if (m/LCOV_EXCL_START/) { - $excluding = 1; -} -if ($excluding and m/LCOV_EXCL_STOP/) { - $excluding = 0; -} - -my $exclude_this = (m/LCOV_EXCL_LINE/); - -if ($excluding or $exclude_this) { - s{^\s*\#\#+:}{ x:}; - s{^ (\s*)(\d+):}{$1!!!$2:}; -} - -if (eof and $excluding) { - warn "Runaway LCOV_EXCL_START in $ARGV"; - $excluding = 0; -} - diff --git a/src/tor/scripts/test/coverage b/src/tor/scripts/test/coverage deleted file mode 100644 index f10c5afaa..000000000 --- a/src/tor/scripts/test/coverage +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# Copyright 2013 The Tor Project, Inc. -# See LICENSE for licensing information. - -# coverage -- run gcov on the appropriate set of object files to extract -# coverage information. - -dst=$1 - -for fn in src/or/*.c src/common/*.c; do - BN=`basename $fn` - DN=`dirname $fn` - F=`echo $BN | sed -e 's/\.c$//;'` - GC="${BN}.gcov" - # Figure out the object file names - ONS=`echo ${DN}/src_*-${F}.o` - ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o" - # If the wildcard didn't expand, no files - if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ] - then - for on in $ONS; do - # We should have a gcno file - GCNO=`echo $on | sed -e 's/\.o$/\.gcno/;'` - if [ -e $GCNO ] - then - # No need to test for gcda, since gcov assumes no execution - # if it's absent - rm -f $GC - gcov -o $on $fn - if [ -e $GC ] - then - if [ -d "$dst" ] - then - mv $GC $dst/$GC - fi - else - echo "gcov -o $on $fn didn't make a .gcov file" - fi - else - echo "Couldn't find gcno file for $on" - fi - done - else - echo "No object file found matching source file $fn" - fi -done diff --git a/src/tor/scripts/test/scan-build.sh b/src/tor/scripts/test/scan-build.sh deleted file mode 100644 index 793adf87e..000000000 --- a/src/tor/scripts/test/scan-build.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh -# Copyright 2014 The Tor Project, Inc -# See LICENSE for licensing information -# -# This script is used for running a bunch of clang scan-build checkers -# on Tor. - -# These don't seem to cause false positives in our code, so let's turn -# them on. -CHECKERS="\ - -enable-checker alpha.core.CallAndMessageUnInitRefArg \ - -enable-checker alpha.core.CastToStruct \ - -enable-checker alpha.core.Conversion \ - -enable-checker alpha.core.FixedAddr \ - -enable-checker alpha.core.IdenticalExpr \ - -enable-checker alpha.core.PointerArithm \ - -enable-checker alpha.core.SizeofPtr \ - -enable-checker alpha.core.TestAfterDivZero \ - -enable-checker alpha.security.MallocOverflow \ - -enable-checker alpha.security.ReturnPtrRange \ - -enable-checker alpha.unix.BlockInCriticalSection \ - -enable-checker alpha.unix.Chroot \ - -enable-checker alpha.unix.PthreadLock \ - -enable-checker alpha.unix.PthreadLock \ - -enable-checker alpha.unix.SimpleStream \ - -enable-checker alpha.unix.Stream \ - -enable-checker alpha.unix.cstring.BufferOverlap \ - -enable-checker alpha.unix.cstring.NotNullTerminated \ - -enable-checker alpha.valist.CopyToSelf \ - -enable-checker alpha.valist.Uninitialized \ - -enable-checker alpha.valist.Unterminated \ - -enable-checker security.FloatLoopCounter \ - -enable-checker security.insecureAPI.strcpy \ -" - -# These have high false-positive rates. -EXTRA_CHECKERS="\ - -enable-checker alpha.security.ArrayBoundV2 \ - -enable-checker alpha.unix.cstring.OutOfBounds \ - -enable-checker alpha.core.CastSize \ -" - -# These don't seem to generate anything useful -NOISY_CHECKERS="\ - -enable-checker alpha.clone.CloneChecker \ - -enable-checker alpha.deadcode.UnreachableCode \ -" - -if test "x$SCAN_BUILD_OUTPUT" != "x"; then - OUTPUTARG="-o $SCAN_BUILD_OUTPUT" -else - OUTPUTARG="" -fi - -scan-build \ - $CHECKERS \ - ./configure - -scan-build \ - make clean - -# Make this not get scanned for dead assignments, since it has lots of -# dead assignments we don't care about. -scan-build \ - $CHECKERS \ - -disable-checker deadcode.DeadStores \ - make -j5 -k ./src/ext/ed25519/ref10/libed25519_ref10.a - -scan-build \ - $CHECKERS $OUTPUTARG \ - make -j5 -k - -CHECKERS="\ -" - -# This one gives a false positive on every strcmp. -# -enable-checker alpha.core.PointerSub - -# Needs work -# -enable-checker alpha.unix.MallocWithAnnotations diff --git a/src/tor/src/common/Makefile.nmake b/src/tor/src/common/Makefile.nmake deleted file mode 100644 index a1c819fff..000000000 --- a/src/tor/src/common/Makefile.nmake +++ /dev/null @@ -1,28 +0,0 @@ -all: libor.lib libor-crypto.lib libor-event.lib - -CFLAGS = /O2 /MT /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common \ - /I ..\ext - -LIBOR_OBJECTS = address.obj backtrace.obj compat.obj container.obj di_ops.obj \ - log.obj memarea.obj mempool.obj procmon.obj sandbox.obj util.obj \ - util_codedigest.obj - -LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj compress.obj compress_zlib.obj \ - tortls.obj crypto_curve25519.obj curve25519-donna.obj - -LIBOR_EVENT_OBJECTS = compat_libevent.obj - -curve25519-donna.obj: ..\ext\curve25519_donna\curve25519-donna.c - $(CC) $(CFLAGS) /D inline=_inline /c ..\ext\curve25519_donna\curve25519-donna.c - -libor.lib: $(LIBOR_OBJECTS) - lib $(LIBOR_OBJECTS) /out:libor.lib - -libor-crypto.lib: $(LIBOR_CRYPTO_OBJECTS) - lib $(LIBOR_CRYPTO_OBJECTS) /out:libor-crypto.lib - -libor-event.lib: $(LIBOR_EVENT_OBJECTS) - lib $(LIBOR_EVENT_OBJECTS) /out:libor-event.lib - -clean: - del *.obj *.lib libor*.lib diff --git a/src/tor/src/common/backtrace.h b/src/tor/src/common/backtrace.h deleted file mode 100644 index 3d0ab8a90..000000000 --- a/src/tor/src/common/backtrace.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_BACKTRACE_H -#define TOR_BACKTRACE_H - -#include "orconfig.h" - -void log_backtrace(int severity, int domain, const char *msg); -int configure_backtrace_handler(const char *tor_version); -void clean_up_backtrace_handler(void); - -#ifdef EXPOSE_CLEAN_BACKTRACE -#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ - defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION) -void clean_backtrace(void **stack, size_t depth, const ucontext_t *ctx); -#endif -#endif /* defined(EXPOSE_CLEAN_BACKTRACE) */ - -#endif /* !defined(TOR_BACKTRACE_H) */ - diff --git a/src/tor/src/common/buffers.c b/src/tor/src/common/buffers.c deleted file mode 100644 index a01add9be..000000000 --- a/src/tor/src/common/buffers.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file buffers.c - * \brief Implements a generic buffer interface. - * - * A buf_t is a (fairly) opaque byte-oriented FIFO that can read to or flush - * from memory, sockets, file descriptors, TLS connections, or another buf_t. - * Buffers are implemented as linked lists of memory chunks. - * - * All socket-backed and TLS-based connection_t objects have a pair of - * buffers: one for incoming data, and one for outcoming data. These are fed - * and drained from functions in connection.c, trigged by events that are - * monitored in main.c. - **/ - -#define BUFFERS_PRIVATE -#include "orconfig.h" -#include -#include "buffers.h" -#include "compat.h" -#include "compress.h" -#include "util.h" -#include "torint.h" -#include "torlog.h" -#ifdef HAVE_UNISTD_H -#include -#endif - -//#define PARANOIA - -#ifdef PARANOIA -/** Helper: If PARANOIA is defined, assert that the buffer in local variable - * buf is well-formed. */ -#define check() STMT_BEGIN buf_assert_ok(buf); STMT_END -#else -#define check() STMT_NIL -#endif /* defined(PARANOIA) */ - -/* Implementation notes: - * - * After flirting with memmove, and dallying with ring-buffers, we're finally - * getting up to speed with the 1970s and implementing buffers as a linked - * list of small chunks. Each buffer has such a list; data is removed from - * the head of the list, and added at the tail. The list is singly linked, - * and the buffer keeps a pointer to the head and the tail. - * - * Every chunk, except the tail, contains at least one byte of data. Data in - * each chunk is contiguous. - * - * When you need to treat the first N characters on a buffer as a contiguous - * string, use the buf_pullup function to make them so. Don't do this more - * than necessary. - * - * The major free Unix kernels have handled buffers like this since, like, - * forever. - */ - -/* Chunk manipulation functions */ - -#define CHUNK_HEADER_LEN offsetof(chunk_t, mem[0]) - -/* We leave this many NUL bytes at the end of the buffer. */ -#ifdef DISABLE_MEMORY_SENTINELS -#define SENTINEL_LEN 0 -#else -#define SENTINEL_LEN 4 -#endif - -/* Header size plus NUL bytes at the end */ -#define CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN) - -/** Return the number of bytes needed to allocate a chunk to hold - * memlen bytes. */ -#define CHUNK_ALLOC_SIZE(memlen) (CHUNK_OVERHEAD + (memlen)) -/** Return the number of usable bytes in a chunk allocated with - * malloc(memlen). */ -#define CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - CHUNK_OVERHEAD) - -#define DEBUG_SENTINEL - -#if defined(DEBUG_SENTINEL) && !defined(DISABLE_MEMORY_SENTINELS) -#define DBG_S(s) s -#else -#define DBG_S(s) (void)0 -#endif - -#ifdef DISABLE_MEMORY_SENTINELS -#define CHUNK_SET_SENTINEL(chunk, alloclen) STMT_NIL -#else -#define CHUNK_SET_SENTINEL(chunk, alloclen) do { \ - uint8_t *a = (uint8_t*) &(chunk)->mem[(chunk)->memlen]; \ - DBG_S(uint8_t *b = &((uint8_t*)(chunk))[(alloclen)-SENTINEL_LEN]); \ - DBG_S(tor_assert(a == b)); \ - memset(a,0,SENTINEL_LEN); \ - } while (0) -#endif /* defined(DISABLE_MEMORY_SENTINELS) */ - -/** Move all bytes stored in chunk to the front of chunk->mem, - * to free up space at the end. */ -static inline void -chunk_repack(chunk_t *chunk) -{ - if (chunk->datalen && chunk->data != &chunk->mem[0]) { - memmove(chunk->mem, chunk->data, chunk->datalen); - } - chunk->data = &chunk->mem[0]; -} - -/** Keep track of total size of allocated chunks for consistency asserts */ -static size_t total_bytes_allocated_in_chunks = 0; -static void -buf_chunk_free_unchecked(chunk_t *chunk) -{ - if (!chunk) - return; -#ifdef DEBUG_CHUNK_ALLOC - tor_assert(CHUNK_ALLOC_SIZE(chunk->memlen) == chunk->DBG_alloc); -#endif - tor_assert(total_bytes_allocated_in_chunks >= - CHUNK_ALLOC_SIZE(chunk->memlen)); - total_bytes_allocated_in_chunks -= CHUNK_ALLOC_SIZE(chunk->memlen); - tor_free(chunk); -} -static inline chunk_t * -chunk_new_with_alloc_size(size_t alloc) -{ - chunk_t *ch; - ch = tor_malloc(alloc); - ch->next = NULL; - ch->datalen = 0; -#ifdef DEBUG_CHUNK_ALLOC - ch->DBG_alloc = alloc; -#endif - ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc); - total_bytes_allocated_in_chunks += alloc; - ch->data = &ch->mem[0]; - CHUNK_SET_SENTINEL(ch, alloc); - return ch; -} - -/** Expand chunk until it can hold sz bytes, and return a - * new pointer to chunk. Old pointers are no longer valid. */ -static inline chunk_t * -chunk_grow(chunk_t *chunk, size_t sz) -{ - off_t offset; - const size_t memlen_orig = chunk->memlen; - const size_t orig_alloc = CHUNK_ALLOC_SIZE(memlen_orig); - const size_t new_alloc = CHUNK_ALLOC_SIZE(sz); - tor_assert(sz > chunk->memlen); - offset = chunk->data - chunk->mem; - chunk = tor_realloc(chunk, new_alloc); - chunk->memlen = sz; - chunk->data = chunk->mem + offset; -#ifdef DEBUG_CHUNK_ALLOC - tor_assert(chunk->DBG_alloc == orig_alloc); - chunk->DBG_alloc = new_alloc; -#endif - total_bytes_allocated_in_chunks += new_alloc - orig_alloc; - CHUNK_SET_SENTINEL(chunk, new_alloc); - return chunk; -} - -/** Every chunk should take up at least this many bytes. */ -#define MIN_CHUNK_ALLOC 256 -/** No chunk should take up more than this many bytes. */ -#define MAX_CHUNK_ALLOC 65536 - -/** Return the allocation size we'd like to use to hold target - * bytes. */ -size_t -buf_preferred_chunk_size(size_t target) -{ - tor_assert(target <= SIZE_T_CEILING - CHUNK_OVERHEAD); - if (CHUNK_ALLOC_SIZE(target) >= MAX_CHUNK_ALLOC) - return CHUNK_ALLOC_SIZE(target); - size_t sz = MIN_CHUNK_ALLOC; - while (CHUNK_SIZE_WITH_ALLOC(sz) < target) { - sz <<= 1; - } - return sz; -} - -/** Collapse data from the first N chunks from buf into buf->head, - * growing it as necessary, until buf->head has the first bytes bytes - * of data from the buffer, or until buf->head has all the data in buf. - * - * Set *head_out to point to the first byte of available data, and - * *len_out to the number of bytes of data available at - * *head_out. Note that *len_out may be more or less than - * bytes, depending on the number of bytes available. - */ -void -buf_pullup(buf_t *buf, size_t bytes, const char **head_out, size_t *len_out) -{ - chunk_t *dest, *src; - size_t capacity; - if (!buf->head) { - *head_out = NULL; - *len_out = 0; - return; - } - - check(); - if (buf->datalen < bytes) - bytes = buf->datalen; - - capacity = bytes; - if (buf->head->datalen >= bytes) { - *head_out = buf->head->data; - *len_out = buf->head->datalen; - return; - } - - if (buf->head->memlen >= capacity) { - /* We don't need to grow the first chunk, but we might need to repack it.*/ - size_t needed = capacity - buf->head->datalen; - if (CHUNK_REMAINING_CAPACITY(buf->head) < needed) - chunk_repack(buf->head); - tor_assert(CHUNK_REMAINING_CAPACITY(buf->head) >= needed); - } else { - chunk_t *newhead; - size_t newsize; - /* We need to grow the chunk. */ - chunk_repack(buf->head); - newsize = CHUNK_SIZE_WITH_ALLOC(buf_preferred_chunk_size(capacity)); - newhead = chunk_grow(buf->head, newsize); - tor_assert(newhead->memlen >= capacity); - if (newhead != buf->head) { - if (buf->tail == buf->head) - buf->tail = newhead; - buf->head = newhead; - } - } - - dest = buf->head; - while (dest->datalen < bytes) { - size_t n = bytes - dest->datalen; - src = dest->next; - tor_assert(src); - if (n >= src->datalen) { - memcpy(CHUNK_WRITE_PTR(dest), src->data, src->datalen); - dest->datalen += src->datalen; - dest->next = src->next; - if (buf->tail == src) - buf->tail = dest; - buf_chunk_free_unchecked(src); - } else { - memcpy(CHUNK_WRITE_PTR(dest), src->data, n); - dest->datalen += n; - src->data += n; - src->datalen -= n; - tor_assert(dest->datalen == bytes); - } - } - - check(); - *head_out = buf->head->data; - *len_out = buf->head->datalen; -} - -#ifdef TOR_UNIT_TESTS -/* Write sz bytes from cp into a newly allocated buffer buf. - * Returns NULL when passed a NULL cp or zero sz. - * Asserts on failure: only for use in unit tests. - * buf must be freed using buf_free(). */ -buf_t * -buf_new_with_data(const char *cp, size_t sz) -{ - /* Validate arguments */ - if (!cp || sz <= 0) { - return NULL; - } - - tor_assert(sz < SSIZE_T_CEILING); - - /* Allocate a buffer */ - buf_t *buf = buf_new_with_capacity(sz); - tor_assert(buf); - buf_assert_ok(buf); - tor_assert(!buf->head); - - /* Allocate a chunk that is sz bytes long */ - buf->head = chunk_new_with_alloc_size(CHUNK_ALLOC_SIZE(sz)); - buf->tail = buf->head; - tor_assert(buf->head); - buf_assert_ok(buf); - tor_assert(buf_allocation(buf) >= sz); - - /* Copy the data and size the buffers */ - tor_assert(sz <= buf_slack(buf)); - tor_assert(sz <= CHUNK_REMAINING_CAPACITY(buf->head)); - memcpy(&buf->head->mem[0], cp, sz); - buf->datalen = sz; - buf->head->datalen = sz; - buf->head->data = &buf->head->mem[0]; - buf_assert_ok(buf); - - /* Make sure everything is large enough */ - tor_assert(buf_allocation(buf) >= sz); - tor_assert(buf_allocation(buf) >= buf_datalen(buf) + buf_slack(buf)); - /* Does the buffer implementation allocate more than the requested size? - * (for example, by rounding up). If so, these checks will fail. */ - tor_assert(buf_datalen(buf) == sz); - tor_assert(buf_slack(buf) == 0); - - return buf; -} -#endif /* defined(TOR_UNIT_TESTS) */ - -/** Remove the first n bytes from buf. */ -void -buf_drain(buf_t *buf, size_t n) -{ - tor_assert(buf->datalen >= n); - while (n) { - tor_assert(buf->head); - if (buf->head->datalen > n) { - buf->head->datalen -= n; - buf->head->data += n; - buf->datalen -= n; - return; - } else { - chunk_t *victim = buf->head; - n -= victim->datalen; - buf->datalen -= victim->datalen; - buf->head = victim->next; - if (buf->tail == victim) - buf->tail = NULL; - buf_chunk_free_unchecked(victim); - } - } - check(); -} - -/** Create and return a new buf with default chunk capacity size. - */ -buf_t * -buf_new_with_capacity(size_t size) -{ - buf_t *b = buf_new(); - b->default_chunk_size = buf_preferred_chunk_size(size); - return b; -} - -/** Allocate and return a new buffer with default capacity. */ -buf_t * -buf_new(void) -{ - buf_t *buf = tor_malloc_zero(sizeof(buf_t)); - buf->magic = BUFFER_MAGIC; - buf->default_chunk_size = 4096; - return buf; -} - -size_t -buf_get_default_chunk_size(const buf_t *buf) -{ - return buf->default_chunk_size; -} - -/** Remove all data from buf. */ -void -buf_clear(buf_t *buf) -{ - chunk_t *chunk, *next; - buf->datalen = 0; - for (chunk = buf->head; chunk; chunk = next) { - next = chunk->next; - buf_chunk_free_unchecked(chunk); - } - buf->head = buf->tail = NULL; -} - -/** Return the number of bytes stored in buf */ -MOCK_IMPL(size_t, -buf_datalen, (const buf_t *buf)) -{ - return buf->datalen; -} - -/** Return the total length of all chunks used in buf. */ -size_t -buf_allocation(const buf_t *buf) -{ - size_t total = 0; - const chunk_t *chunk; - for (chunk = buf->head; chunk; chunk = chunk->next) { - total += CHUNK_ALLOC_SIZE(chunk->memlen); - } - return total; -} - -/** Return the number of bytes that can be added to buf without - * performing any additional allocation. */ -size_t -buf_slack(const buf_t *buf) -{ - if (!buf->tail) - return 0; - else - return CHUNK_REMAINING_CAPACITY(buf->tail); -} - -/** Release storage held by buf. */ -void -buf_free_(buf_t *buf) -{ - if (!buf) - return; - - buf_clear(buf); - buf->magic = 0xdeadbeef; - tor_free(buf); -} - -/** Return a new copy of in_chunk */ -static chunk_t * -chunk_copy(const chunk_t *in_chunk) -{ - chunk_t *newch = tor_memdup(in_chunk, CHUNK_ALLOC_SIZE(in_chunk->memlen)); - total_bytes_allocated_in_chunks += CHUNK_ALLOC_SIZE(in_chunk->memlen); -#ifdef DEBUG_CHUNK_ALLOC - newch->DBG_alloc = CHUNK_ALLOC_SIZE(in_chunk->memlen); -#endif - newch->next = NULL; - if (in_chunk->data) { - off_t offset = in_chunk->data - in_chunk->mem; - newch->data = newch->mem + offset; - } - return newch; -} - -/** Return a new copy of buf */ -buf_t * -buf_copy(const buf_t *buf) -{ - chunk_t *ch; - buf_t *out = buf_new(); - out->default_chunk_size = buf->default_chunk_size; - for (ch = buf->head; ch; ch = ch->next) { - chunk_t *newch = chunk_copy(ch); - if (out->tail) { - out->tail->next = newch; - out->tail = newch; - } else { - out->head = out->tail = newch; - } - } - out->datalen = buf->datalen; - return out; -} - -/** Append a new chunk with enough capacity to hold capacity bytes to - * the tail of buf. If capped, don't allocate a chunk bigger - * than MAX_CHUNK_ALLOC. */ -chunk_t * -buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped) -{ - chunk_t *chunk; - - if (CHUNK_ALLOC_SIZE(capacity) < buf->default_chunk_size) { - chunk = chunk_new_with_alloc_size(buf->default_chunk_size); - } else if (capped && CHUNK_ALLOC_SIZE(capacity) > MAX_CHUNK_ALLOC) { - chunk = chunk_new_with_alloc_size(MAX_CHUNK_ALLOC); - } else { - chunk = chunk_new_with_alloc_size(buf_preferred_chunk_size(capacity)); - } - - chunk->inserted_time = monotime_coarse_get_stamp(); - - if (buf->tail) { - tor_assert(buf->head); - buf->tail->next = chunk; - buf->tail = chunk; - } else { - tor_assert(!buf->head); - buf->head = buf->tail = chunk; - } - check(); - return chunk; -} - -/** Return the age of the oldest chunk in the buffer buf, in - * timestamp units. Requires the current monotonic timestamp as its - * input now. - */ -uint32_t -buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now) -{ - if (buf->head) { - return now - buf->head->inserted_time; - } else { - return 0; - } -} - -size_t -buf_get_total_allocation(void) -{ - return total_bytes_allocated_in_chunks; -} - -/** Read up to at_most bytes from the socket fd into - * chunk (which must be on buf). If we get an EOF, set - * *reached_eof to 1. Return -1 on error, 0 on eof or blocking, - * and the number of bytes read otherwise. */ -static inline int -read_to_chunk(buf_t *buf, chunk_t *chunk, tor_socket_t fd, size_t at_most, - int *reached_eof, int *socket_error) -{ - ssize_t read_result; - if (at_most > CHUNK_REMAINING_CAPACITY(chunk)) - at_most = CHUNK_REMAINING_CAPACITY(chunk); - read_result = tor_socket_recv(fd, CHUNK_WRITE_PTR(chunk), at_most, 0); - - if (read_result < 0) { - int e = tor_socket_errno(fd); - if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ -#ifdef _WIN32 - if (e == WSAENOBUFS) - log_warn(LD_NET,"recv() failed: WSAENOBUFS. Not enough ram?"); -#endif - *socket_error = e; - return -1; - } - return 0; /* would block. */ - } else if (read_result == 0) { - log_debug(LD_NET,"Encountered eof on fd %d", (int)fd); - *reached_eof = 1; - return 0; - } else { /* actually got bytes. */ - buf->datalen += read_result; - chunk->datalen += read_result; - log_debug(LD_NET,"Read %ld bytes. %d on inbuf.", (long)read_result, - (int)buf->datalen); - tor_assert(read_result < INT_MAX); - return (int)read_result; - } -} - -/** Read from socket s, writing onto end of buf. Read at most - * at_most bytes, growing the buffer as necessary. If recv() returns 0 - * (because of EOF), set *reached_eof to 1 and return 0. Return -1 on - * error; else return the number of bytes read. - */ -/* XXXX indicate "read blocked" somehow? */ -int -buf_read_from_socket(buf_t *buf, tor_socket_t s, size_t at_most, - int *reached_eof, - int *socket_error) -{ - /* XXXX It's stupid to overload the return values for these functions: - * "error status" and "number of bytes read" are not mutually exclusive. - */ - int r = 0; - size_t total_read = 0; - - check(); - tor_assert(reached_eof); - tor_assert(SOCKET_OK(s)); - - if (BUG(buf->datalen >= INT_MAX)) - return -1; - if (BUG(buf->datalen >= INT_MAX - at_most)) - return -1; - - while (at_most > total_read) { - size_t readlen = at_most - total_read; - chunk_t *chunk; - if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) { - chunk = buf_add_chunk_with_capacity(buf, at_most, 1); - if (readlen > chunk->memlen) - readlen = chunk->memlen; - } else { - size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail); - chunk = buf->tail; - if (cap < readlen) - readlen = cap; - } - - r = read_to_chunk(buf, chunk, s, readlen, reached_eof, socket_error); - check(); - if (r < 0) - return r; /* Error */ - tor_assert(total_read+r < INT_MAX); - total_read += r; - if ((size_t)r < readlen) { /* eof, block, or no more to read. */ - break; - } - } - return (int)total_read; -} - -/** Helper for buf_flush_to_socket(): try to write sz bytes from chunk - * chunk of buffer buf onto socket s. On success, deduct - * the bytes written from *buf_flushlen. Return the number of bytes - * written on success, 0 on blocking, -1 on failure. - */ -static inline int -flush_chunk(tor_socket_t s, buf_t *buf, chunk_t *chunk, size_t sz, - size_t *buf_flushlen) -{ - ssize_t write_result; - - if (sz > chunk->datalen) - sz = chunk->datalen; - write_result = tor_socket_send(s, chunk->data, sz, 0); - - if (write_result < 0) { - int e = tor_socket_errno(s); - if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ -#ifdef _WIN32 - if (e == WSAENOBUFS) - log_warn(LD_NET,"write() failed: WSAENOBUFS. Not enough ram?"); -#endif - return -1; - } - log_debug(LD_NET,"write() would block, returning."); - return 0; - } else { - *buf_flushlen -= write_result; - buf_drain(buf, write_result); - tor_assert(write_result < INT_MAX); - return (int)write_result; - } -} - -/** Write data from buf to the socket s. Write at most - * sz bytes, decrement *buf_flushlen by - * the number of bytes actually written, and remove the written bytes - * from the buffer. Return the number of bytes written on success, - * -1 on failure. Return 0 if write() would block. - */ -int -buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz, - size_t *buf_flushlen) -{ - /* XXXX It's stupid to overload the return values for these functions: - * "error status" and "number of bytes flushed" are not mutually exclusive. - */ - int r; - size_t flushed = 0; - tor_assert(buf_flushlen); - tor_assert(SOCKET_OK(s)); - if (BUG(*buf_flushlen > buf->datalen)) { - *buf_flushlen = buf->datalen; - } - if (BUG(sz > *buf_flushlen)) { - sz = *buf_flushlen; - } - - check(); - while (sz) { - size_t flushlen0; - tor_assert(buf->head); - if (buf->head->datalen >= sz) - flushlen0 = sz; - else - flushlen0 = buf->head->datalen; - - r = flush_chunk(s, buf, buf->head, flushlen0, buf_flushlen); - check(); - if (r < 0) - return r; - flushed += r; - sz -= r; - if (r == 0 || (size_t)r < flushlen0) /* can't flush any more now. */ - break; - } - tor_assert(flushed < INT_MAX); - return (int)flushed; -} - -/** Append string_len bytes from string to the end of - * buf. - * - * Return the new length of the buffer on success, -1 on failure. - */ -int -buf_add(buf_t *buf, const char *string, size_t string_len) -{ - if (!string_len) - return (int)buf->datalen; - check(); - - if (BUG(buf->datalen >= INT_MAX)) - return -1; - if (BUG(buf->datalen >= INT_MAX - string_len)) - return -1; - - while (string_len) { - size_t copy; - if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail)) - buf_add_chunk_with_capacity(buf, string_len, 1); - - copy = CHUNK_REMAINING_CAPACITY(buf->tail); - if (copy > string_len) - copy = string_len; - memcpy(CHUNK_WRITE_PTR(buf->tail), string, copy); - string_len -= copy; - string += copy; - buf->datalen += copy; - buf->tail->datalen += copy; - } - - check(); - tor_assert(buf->datalen < INT_MAX); - return (int)buf->datalen; -} - -/** Add a nul-terminated string to buf, not including the - * terminating NUL. */ -void -buf_add_string(buf_t *buf, const char *string) -{ - buf_add(buf, string, strlen(string)); -} - -/** As tor_snprintf, but write the results into a buf_t */ -void -buf_add_printf(buf_t *buf, const char *format, ...) -{ - va_list ap; - va_start(ap,format); - buf_add_vprintf(buf, format, ap); - va_end(ap); -} - -/** As tor_vsnprintf, but write the results into a buf_t. */ -void -buf_add_vprintf(buf_t *buf, const char *format, va_list args) -{ - /* XXXX Faster implementations are easy enough, but let's optimize later */ - char *tmp; - tor_vasprintf(&tmp, format, args); - buf_add(buf, tmp, strlen(tmp)); - tor_free(tmp); -} - -/** Return a heap-allocated string containing the contents of buf, plus - * a NUL byte. If sz_out is provided, set *sz_out to the length - * of the returned string, not including the terminating NUL. */ -char * -buf_extract(buf_t *buf, size_t *sz_out) -{ - tor_assert(buf); - - size_t sz = buf_datalen(buf); - char *result; - result = tor_malloc(sz+1); - buf_peek(buf, result, sz); - result[sz] = 0; - if (sz_out) - *sz_out = sz; - return result; -} - -/** Helper: copy the first string_len bytes from buf - * onto string. - */ -void -buf_peek(const buf_t *buf, char *string, size_t string_len) -{ - chunk_t *chunk; - - tor_assert(string); - /* make sure we don't ask for too much */ - tor_assert(string_len <= buf->datalen); - /* buf_assert_ok(buf); */ - - chunk = buf->head; - while (string_len) { - size_t copy = string_len; - tor_assert(chunk); - if (chunk->datalen < copy) - copy = chunk->datalen; - memcpy(string, chunk->data, copy); - string_len -= copy; - string += copy; - chunk = chunk->next; - } -} - -/** Remove string_len bytes from the front of buf, and store - * them into string. Return the new buffer size. string_len - * must be \<= the number of bytes on the buffer. - */ -int -buf_get_bytes(buf_t *buf, char *string, size_t string_len) -{ - /* There must be string_len bytes in buf; write them onto string, - * then memmove buf back (that is, remove them from buf). - * - * Return the number of bytes still on the buffer. */ - - check(); - buf_peek(buf, string, string_len); - buf_drain(buf, string_len); - check(); - tor_assert(buf->datalen < INT_MAX); - return (int)buf->datalen; -} - -/** Move up to *buf_flushlen bytes from buf_in to - * buf_out, and modify *buf_flushlen appropriately. - * Return the number of bytes actually copied. - */ -int -buf_move_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) -{ - /* We can do way better here, but this doesn't turn up in any profiles. */ - char b[4096]; - size_t cp, len; - - if (BUG(buf_out->datalen >= INT_MAX)) - return -1; - if (BUG(buf_out->datalen >= INT_MAX - *buf_flushlen)) - return -1; - - len = *buf_flushlen; - if (len > buf_in->datalen) - len = buf_in->datalen; - - cp = len; /* Remember the number of bytes we intend to copy. */ - tor_assert(cp < INT_MAX); - while (len) { - /* This isn't the most efficient implementation one could imagine, since - * it does two copies instead of 1, but I kinda doubt that this will be - * critical path. */ - size_t n = len > sizeof(b) ? sizeof(b) : len; - buf_get_bytes(buf_in, b, n); - buf_add(buf_out, b, n); - len -= n; - } - *buf_flushlen -= cp; - return (int)cp; -} - -/** Moves all data from buf_in to buf_out, without copying. - */ -void -buf_move_all(buf_t *buf_out, buf_t *buf_in) -{ - tor_assert(buf_out); - if (!buf_in) - return; - - if (buf_out->head == NULL) { - buf_out->head = buf_in->head; - buf_out->tail = buf_in->tail; - } else { - buf_out->tail->next = buf_in->head; - buf_out->tail = buf_in->tail; - } - - buf_out->datalen += buf_in->datalen; - buf_in->head = buf_in->tail = NULL; - buf_in->datalen = 0; -} - -/** Internal structure: represents a position in a buffer. */ -typedef struct buf_pos_t { - const chunk_t *chunk; /**< Which chunk are we pointing to? */ - int pos;/**< Which character inside the chunk's data are we pointing to? */ - size_t chunk_pos; /**< Total length of all previous chunks. */ -} buf_pos_t; - -/** Initialize out to point to the first character of buf.*/ -static void -buf_pos_init(const buf_t *buf, buf_pos_t *out) -{ - out->chunk = buf->head; - out->pos = 0; - out->chunk_pos = 0; -} - -/** Advance out to the first appearance of ch at the current - * position of out, or later. Return -1 if no instances are found; - * otherwise returns the absolute position of the character. */ -static off_t -buf_find_pos_of_char(char ch, buf_pos_t *out) -{ - const chunk_t *chunk; - int pos; - tor_assert(out); - if (out->chunk) { - if (out->chunk->datalen) { - tor_assert(out->pos < (off_t)out->chunk->datalen); - } else { - tor_assert(out->pos == 0); - } - } - pos = out->pos; - for (chunk = out->chunk; chunk; chunk = chunk->next) { - char *cp = memchr(chunk->data+pos, ch, chunk->datalen - pos); - if (cp) { - out->chunk = chunk; - tor_assert(cp - chunk->data < INT_MAX); - out->pos = (int)(cp - chunk->data); - return out->chunk_pos + out->pos; - } else { - out->chunk_pos += chunk->datalen; - pos = 0; - } - } - return -1; -} - -/** Advance pos by a single character, if there are any more characters - * in the buffer. Returns 0 on success, -1 on failure. */ -static inline int -buf_pos_inc(buf_pos_t *pos) -{ - ++pos->pos; - if (pos->pos == (off_t)pos->chunk->datalen) { - if (!pos->chunk->next) - return -1; - pos->chunk_pos += pos->chunk->datalen; - pos->chunk = pos->chunk->next; - pos->pos = 0; - } - return 0; -} - -/** Return true iff the n-character string in s appears - * (verbatim) at pos. */ -static int -buf_matches_at_pos(const buf_pos_t *pos, const char *s, size_t n) -{ - buf_pos_t p; - if (!n) - return 1; - - memcpy(&p, pos, sizeof(p)); - - while (1) { - char ch = p.chunk->data[p.pos]; - if (ch != *s) - return 0; - ++s; - /* If we're out of characters that don't match, we match. Check this - * _before_ we test incrementing pos, in case we're at the end of the - * string. */ - if (--n == 0) - return 1; - if (buf_pos_inc(&p)<0) - return 0; - } -} - -/** Return the first position in buf at which the n-character - * string s occurs, or -1 if it does not occur. */ -int -buf_find_string_offset(const buf_t *buf, const char *s, size_t n) -{ - buf_pos_t pos; - buf_pos_init(buf, &pos); - while (buf_find_pos_of_char(*s, &pos) >= 0) { - if (buf_matches_at_pos(&pos, s, n)) { - tor_assert(pos.chunk_pos + pos.pos < INT_MAX); - return (int)(pos.chunk_pos + pos.pos); - } else { - if (buf_pos_inc(&pos)<0) - return -1; - } - } - return -1; -} - -/** Return 1 iff buf starts with cmd. cmd must be a null - * terminated string, of no more than PEEK_BUF_STARTSWITH_MAX bytes. */ -int -buf_peek_startswith(const buf_t *buf, const char *cmd) -{ - char tmp[PEEK_BUF_STARTSWITH_MAX]; - size_t clen = strlen(cmd); - if (clen == 0) - return 1; - if (BUG(clen > sizeof(tmp))) - return 0; - if (buf->datalen < clen) - return 0; - buf_peek(buf, tmp, clen); - return fast_memeq(tmp, cmd, clen); -} - -/** Return the index within buf at which ch first appears, - * or -1 if ch does not appear on buf. */ -static off_t -buf_find_offset_of_char(buf_t *buf, char ch) -{ - chunk_t *chunk; - off_t offset = 0; - for (chunk = buf->head; chunk; chunk = chunk->next) { - char *cp = memchr(chunk->data, ch, chunk->datalen); - if (cp) - return offset + (cp - chunk->data); - else - offset += chunk->datalen; - } - return -1; -} - -/** Try to read a single LF-terminated line from buf, and write it - * (including the LF), NUL-terminated, into the *data_len byte buffer - * at data_out. Set *data_len to the number of bytes in the - * line, not counting the terminating NUL. Return 1 if we read a whole line, - * return 0 if we don't have a whole line yet, and return -1 if the line - * length exceeds *data_len. - */ -int -buf_get_line(buf_t *buf, char *data_out, size_t *data_len) -{ - size_t sz; - off_t offset; - - if (!buf->head) - return 0; - - offset = buf_find_offset_of_char(buf, '\n'); - if (offset < 0) - return 0; - sz = (size_t) offset; - if (sz+2 > *data_len) { - *data_len = sz + 2; - return -1; - } - buf_get_bytes(buf, data_out, sz+1); - data_out[sz+1] = '\0'; - *data_len = sz+1; - return 1; -} - -/** Compress or uncompress the data_len bytes in data using the - * compression state state, appending the result to buf. If - * done is true, flush the data in the state and finish the - * compression/uncompression. Return -1 on failure, 0 on success. */ -int -buf_add_compress(buf_t *buf, tor_compress_state_t *state, - const char *data, size_t data_len, - const int done) -{ - char *next; - size_t old_avail, avail; - int over = 0; - - do { - int need_new_chunk = 0; - if (!buf->tail || ! CHUNK_REMAINING_CAPACITY(buf->tail)) { - size_t cap = data_len / 4; - buf_add_chunk_with_capacity(buf, cap, 1); - } - next = CHUNK_WRITE_PTR(buf->tail); - avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail); - switch (tor_compress_process(state, &next, &avail, - &data, &data_len, done)) { - case TOR_COMPRESS_DONE: - over = 1; - break; - case TOR_COMPRESS_ERROR: - return -1; - case TOR_COMPRESS_OK: - if (data_len == 0) { - tor_assert_nonfatal(!done); - over = 1; - } - break; - case TOR_COMPRESS_BUFFER_FULL: - if (avail) { - /* The compression module says we need more room - * (TOR_COMPRESS_BUFFER_FULL). Start a new chunk automatically, - * whether were going to or not. */ - need_new_chunk = 1; - } - if (data_len == 0 && !done) { - /* We've consumed all the input data, though, so there's no - * point in forging ahead right now. */ - over = 1; - } - break; - } - buf->datalen += old_avail - avail; - buf->tail->datalen += old_avail - avail; - if (need_new_chunk) { - buf_add_chunk_with_capacity(buf, data_len/4, 1); - } - - } while (!over); - check(); - return 0; -} - -/** Set *output to contain a copy of the data in *input */ -int -buf_set_to_copy(buf_t **output, - const buf_t *input) -{ - if (*output) - buf_free(*output); - *output = buf_copy(input); - return 0; -} - -/** Log an error and exit if buf is corrupted. - */ -void -buf_assert_ok(buf_t *buf) -{ - tor_assert(buf); - tor_assert(buf->magic == BUFFER_MAGIC); - - if (! buf->head) { - tor_assert(!buf->tail); - tor_assert(buf->datalen == 0); - } else { - chunk_t *ch; - size_t total = 0; - tor_assert(buf->tail); - for (ch = buf->head; ch; ch = ch->next) { - total += ch->datalen; - tor_assert(ch->datalen <= ch->memlen); - tor_assert(ch->data >= &ch->mem[0]); - tor_assert(ch->data <= &ch->mem[0]+ch->memlen); - if (ch->data == &ch->mem[0]+ch->memlen) { - /* LCOV_EXCL_START */ - static int warned = 0; - if (! warned) { - log_warn(LD_BUG, "Invariant violation in buf.c related to #15083"); - warned = 1; - } - /* LCOV_EXCL_STOP */ - } - tor_assert(ch->data+ch->datalen <= &ch->mem[0] + ch->memlen); - if (!ch->next) - tor_assert(ch == buf->tail); - } - tor_assert(buf->datalen == total); - } -} - diff --git a/src/tor/src/common/buffers.h b/src/tor/src/common/buffers.h deleted file mode 100644 index 22a5f7bfa..000000000 --- a/src/tor/src/common/buffers.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file buffers.h - * \brief Header file for buffers.c. - **/ - -#ifndef TOR_BUFFERS_H -#define TOR_BUFFERS_H - -#include "compat.h" -#include "compat.h" -#include "torint.h" -#include "testsupport.h" - -typedef struct buf_t buf_t; - -struct tor_compress_state_t; - -buf_t *buf_new(void); -buf_t *buf_new_with_capacity(size_t size); -size_t buf_get_default_chunk_size(const buf_t *buf); -void buf_free_(buf_t *buf); -#define buf_free(b) FREE_AND_NULL(buf_t, buf_free_, (b)) -void buf_clear(buf_t *buf); -buf_t *buf_copy(const buf_t *buf); - -MOCK_DECL(size_t, buf_datalen, (const buf_t *buf)); -size_t buf_allocation(const buf_t *buf); -size_t buf_slack(const buf_t *buf); - -uint32_t buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now); -size_t buf_get_total_allocation(void); - -int buf_read_from_socket(buf_t *buf, tor_socket_t s, size_t at_most, - int *reached_eof, - int *socket_error); - -int buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz, - size_t *buf_flushlen); - -int buf_add(buf_t *buf, const char *string, size_t string_len); -void buf_add_string(buf_t *buf, const char *string); -void buf_add_printf(buf_t *buf, const char *format, ...) - CHECK_PRINTF(2, 3); -void buf_add_vprintf(buf_t *buf, const char *format, va_list args) - CHECK_PRINTF(2, 0); -int buf_add_compress(buf_t *buf, struct tor_compress_state_t *state, - const char *data, size_t data_len, int done); -int buf_move_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); -void buf_move_all(buf_t *buf_out, buf_t *buf_in); -void buf_peek(const buf_t *buf, char *string, size_t string_len); -void buf_drain(buf_t *buf, size_t n); -int buf_get_bytes(buf_t *buf, char *string, size_t string_len); -int buf_get_line(buf_t *buf, char *data_out, size_t *data_len); - -#define PEEK_BUF_STARTSWITH_MAX 16 -int buf_peek_startswith(const buf_t *buf, const char *cmd); - -int buf_set_to_copy(buf_t **output, - const buf_t *input); - -void buf_assert_ok(buf_t *buf); - -int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); -void buf_pullup(buf_t *buf, size_t bytes, - const char **head_out, size_t *len_out); -char *buf_extract(buf_t *buf, size_t *sz_out); - -#ifdef BUFFERS_PRIVATE -#ifdef TOR_UNIT_TESTS -buf_t *buf_new_with_data(const char *cp, size_t sz); -#endif -size_t buf_preferred_chunk_size(size_t target); - -#define DEBUG_CHUNK_ALLOC -/** A single chunk on a buffer. */ -typedef struct chunk_t { - struct chunk_t *next; /**< The next chunk on the buffer. */ - size_t datalen; /**< The number of bytes stored in this chunk */ - size_t memlen; /**< The number of usable bytes of storage in mem. */ -#ifdef DEBUG_CHUNK_ALLOC - size_t DBG_alloc; -#endif - char *data; /**< A pointer to the first byte of data stored in mem. */ - uint32_t inserted_time; /**< Timestamp when this chunk was inserted. */ - char mem[FLEXIBLE_ARRAY_MEMBER]; /**< The actual memory used for storage in - * this chunk. */ -} chunk_t; - -/** Magic value for buf_t.magic, to catch pointer errors. */ -#define BUFFER_MAGIC 0xB0FFF312u -/** A resizeable buffer, optimized for reading and writing. */ -struct buf_t { - uint32_t magic; /**< Magic cookie for debugging: Must be set to - * BUFFER_MAGIC. */ - size_t datalen; /**< How many bytes is this buffer holding right now? */ - size_t default_chunk_size; /**< Don't allocate any chunks smaller than - * this for this buffer. */ - chunk_t *head; /**< First chunk in the list, or NULL for none. */ - chunk_t *tail; /**< Last chunk in the list, or NULL for none. */ -}; - -chunk_t *buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped); -/** If a read onto the end of a chunk would be smaller than this number, then - * just start a new chunk. */ -#define MIN_READ_LEN 8 - -/** Return the number of bytes that can be written onto chunk without - * running out of space. */ -static inline size_t -CHUNK_REMAINING_CAPACITY(const chunk_t *chunk) -{ - return (chunk->mem + chunk->memlen) - (chunk->data + chunk->datalen); -} - -/** Return the next character in chunk onto which data can be appended. - * If the chunk is full, this might be off the end of chunk->mem. */ -static inline char * -CHUNK_WRITE_PTR(chunk_t *chunk) -{ - return chunk->data + chunk->datalen; -} - -#endif /* defined(BUFFERS_PRIVATE) */ - -#endif /* !defined(TOR_BUFFERS_H) */ - diff --git a/src/tor/src/common/buffers_tls.c b/src/tor/src/common/buffers_tls.c deleted file mode 100644 index 041f78b81..000000000 --- a/src/tor/src/common/buffers_tls.c +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define BUFFERS_PRIVATE -#include "orconfig.h" -#include -#include "buffers.h" -#include "buffers_tls.h" -#include "compat.h" -#include "compress.h" -#include "util.h" -#include "torint.h" -#include "torlog.h" -#include "tortls.h" -#ifdef HAVE_UNISTD_H -#include -#endif - -/** As read_to_chunk(), but return (negative) error code on error, blocking, - * or TLS, and the number of bytes read otherwise. */ -static inline int -read_to_chunk_tls(buf_t *buf, chunk_t *chunk, tor_tls_t *tls, - size_t at_most) -{ - int read_result; - - tor_assert(CHUNK_REMAINING_CAPACITY(chunk) >= at_most); - read_result = tor_tls_read(tls, CHUNK_WRITE_PTR(chunk), at_most); - if (read_result < 0) - return read_result; - buf->datalen += read_result; - chunk->datalen += read_result; - return read_result; -} - -/** As read_to_buf, but reads from a TLS connection, and returns a TLS - * status value rather than the number of bytes read. - * - * Using TLS on OR connections complicates matters in two ways. - * - * First, a TLS stream has its own read buffer independent of the - * connection's read buffer. (TLS needs to read an entire frame from - * the network before it can decrypt any data. Thus, trying to read 1 - * byte from TLS can require that several KB be read from the network - * and decrypted. The extra data is stored in TLS's decrypt buffer.) - * Because the data hasn't been read by Tor (it's still inside the TLS), - * this means that sometimes a connection "has stuff to read" even when - * poll() didn't return POLLIN. The tor_tls_get_pending_bytes function is - * used in connection.c to detect TLS objects with non-empty internal - * buffers and read from them again. - * - * Second, the TLS stream's events do not correspond directly to network - * events: sometimes, before a TLS stream can read, the network must be - * ready to write -- or vice versa. - */ -int -buf_read_from_tls(buf_t *buf, tor_tls_t *tls, size_t at_most) -{ - int r = 0; - size_t total_read = 0; - - check_no_tls_errors(); - - if (BUG(buf->datalen >= INT_MAX)) - return -1; - if (BUG(buf->datalen >= INT_MAX - at_most)) - return -1; - - while (at_most > total_read) { - size_t readlen = at_most - total_read; - chunk_t *chunk; - if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) { - chunk = buf_add_chunk_with_capacity(buf, at_most, 1); - if (readlen > chunk->memlen) - readlen = chunk->memlen; - } else { - size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail); - chunk = buf->tail; - if (cap < readlen) - readlen = cap; - } - - r = read_to_chunk_tls(buf, chunk, tls, readlen); - if (r < 0) - return r; /* Error */ - tor_assert(total_read+r < INT_MAX); - total_read += r; - if ((size_t)r < readlen) /* eof, block, or no more to read. */ - break; - } - return (int)total_read; -} - -/** Helper for buf_flush_to_tls(): try to write sz bytes from chunk - * chunk of buffer buf onto socket s. (Tries to write - * more if there is a forced pending write size.) On success, deduct the - * bytes written from *buf_flushlen. Return the number of bytes - * written on success, and a TOR_TLS error code on failure or blocking. - */ -static inline int -flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk, - size_t sz, size_t *buf_flushlen) -{ - int r; - size_t forced; - char *data; - - forced = tor_tls_get_forced_write_size(tls); - if (forced > sz) - sz = forced; - if (chunk) { - data = chunk->data; - tor_assert(sz <= chunk->datalen); - } else { - data = NULL; - tor_assert(sz == 0); - } - r = tor_tls_write(tls, data, sz); - if (r < 0) - return r; - if (*buf_flushlen > (size_t)r) - *buf_flushlen -= r; - else - *buf_flushlen = 0; - buf_drain(buf, r); - log_debug(LD_NET,"flushed %d bytes, %d ready to flush, %d remain.", - r,(int)*buf_flushlen,(int)buf->datalen); - return r; -} - -/** As buf_flush_to_socket(), but writes data to a TLS connection. Can write - * more than flushlen bytes. - */ -int -buf_flush_to_tls(buf_t *buf, tor_tls_t *tls, size_t flushlen, - size_t *buf_flushlen) -{ - int r; - size_t flushed = 0; - ssize_t sz; - tor_assert(buf_flushlen); - if (BUG(*buf_flushlen > buf->datalen)) { - *buf_flushlen = buf->datalen; - } - if (BUG(flushlen > *buf_flushlen)) { - flushlen = *buf_flushlen; - } - sz = (ssize_t) flushlen; - - /* we want to let tls write even if flushlen is zero, because it might - * have a partial record pending */ - check_no_tls_errors(); - - do { - size_t flushlen0; - if (buf->head) { - if ((ssize_t)buf->head->datalen >= sz) - flushlen0 = sz; - else - flushlen0 = buf->head->datalen; - } else { - flushlen0 = 0; - } - - r = flush_chunk_tls(tls, buf, buf->head, flushlen0, buf_flushlen); - if (r < 0) - return r; - flushed += r; - sz -= r; - if (r == 0) /* Can't flush any more now. */ - break; - } while (sz > 0); - tor_assert(flushed < INT_MAX); - return (int)flushed; -} - diff --git a/src/tor/src/common/buffers_tls.h b/src/tor/src/common/buffers_tls.h deleted file mode 100644 index 2f9fda45a..000000000 --- a/src/tor/src/common/buffers_tls.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_BUFFERS_TLS_H -#define TOR_BUFFERS_TLS_H - -struct buf_t; -struct tor_tls_t; - -int buf_read_from_tls(struct buf_t *buf, - struct tor_tls_t *tls, size_t at_most); -int buf_flush_to_tls(struct buf_t *buf, struct tor_tls_t *tls, - size_t sz, size_t *buf_flushlen); - -#endif /* !defined(TOR_BUFFERS_TLS_H) */ - diff --git a/src/tor/src/common/ciphers.inc b/src/tor/src/common/ciphers.inc deleted file mode 100644 index a336e2dfa..000000000 --- a/src/tor/src/common/ciphers.inc +++ /dev/null @@ -1,81 +0,0 @@ -/* This is an include file used to define the list of ciphers clients should - * advertise. Before including it, you should define the CIPHER and XCIPHER - * macros. - * - * This file was automatically generated by get_mozilla_ciphers.py. - */ -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - CIPHER(0xc02b, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) -#else - XCIPHER(0xc02b, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - CIPHER(0xc02f, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256) -#else - XCIPHER(0xc02f, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 - CIPHER(0xcca9, TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305) -#else - XCIPHER(0xcca9, TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 - CIPHER(0xcca8, TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305) -#else - XCIPHER(0xcca8, TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - CIPHER(0xc02c, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) -#else - XCIPHER(0xc02c, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - CIPHER(0xc030, TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384) -#else - XCIPHER(0xc030, TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA - CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA - CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA - CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) -#else - XCIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA - CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) -#else - XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_AES_128_SHA - CIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) -#else - XCIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA - CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) -#else - XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) -#endif -#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA - CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) -#else - XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) -#endif diff --git a/src/tor/src/common/compat_libevent.c b/src/tor/src/common/compat_libevent.c deleted file mode 100644 index 10489bf29..000000000 --- a/src/tor/src/common/compat_libevent.c +++ /dev/null @@ -1,295 +0,0 @@ -/* Copyright (c) 2009-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_libevent.c - * \brief Wrappers and utility functions for Libevent. - */ - -#include "orconfig.h" -#include "compat.h" -#define COMPAT_LIBEVENT_PRIVATE -#include "compat_libevent.h" - -#include "crypto.h" - -#include "util.h" -#include "torlog.h" - -#include -#include - -/** A string which, if it appears in a libevent log, should be ignored. */ -static const char *suppress_msg = NULL; -/** Callback function passed to event_set_log() so we can intercept - * log messages from libevent. */ -STATIC void -libevent_logging_callback(int severity, const char *msg) -{ - char buf[1024]; - size_t n; - if (suppress_msg && strstr(msg, suppress_msg)) - return; - n = strlcpy(buf, msg, sizeof(buf)); - if (n && n < sizeof(buf) && buf[n-1] == '\n') { - buf[n-1] = '\0'; - } - switch (severity) { - case _EVENT_LOG_DEBUG: - log_debug(LD_NOCB|LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_MSG: - log_info(LD_NOCB|LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_WARN: - log_warn(LD_NOCB|LD_GENERAL, "Warning from libevent: %s", buf); - break; - case _EVENT_LOG_ERR: - log_err(LD_NOCB|LD_GENERAL, "Error from libevent: %s", buf); - break; - default: - log_warn(LD_NOCB|LD_GENERAL, "Message [%d] from libevent: %s", - severity, buf); - break; - } -} -/** Set hook to intercept log messages from libevent. */ -void -configure_libevent_logging(void) -{ - event_set_log_callback(libevent_logging_callback); -} - -/** Ignore any libevent log message that contains msg. */ -void -suppress_libevent_log_msg(const char *msg) -{ - suppress_msg = msg; -} - -/* Wrapper for event_free() that tolerates tor_event_free(NULL) */ -void -tor_event_free_(struct event *ev) -{ - if (ev == NULL) - return; - event_free(ev); -} - -/** Global event base for use by the main thread. */ -static struct event_base *the_event_base = NULL; - -/* This is what passes for version detection on OSX. We set - * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before - * 10.4.0 (aka 1040). */ -#ifdef __APPLE__ -#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ -#define MACOSX_KQUEUE_IS_BROKEN \ - (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040) -#else -#define MACOSX_KQUEUE_IS_BROKEN 0 -#endif /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */ -#endif /* defined(__APPLE__) */ - -/** Initialize the Libevent library and set up the event base. */ -void -tor_libevent_initialize(tor_libevent_cfg *torcfg) -{ - tor_assert(the_event_base == NULL); - /* some paths below don't use torcfg, so avoid unused variable warnings */ - (void)torcfg; - - { - int attempts = 0; - struct event_config *cfg; - - ++attempts; - cfg = event_config_new(); - tor_assert(cfg); - - /* Telling Libevent not to try to turn locking on can avoid a needless - * socketpair() attempt. */ - event_config_set_flag(cfg, EVENT_BASE_FLAG_NOLOCK); - - if (torcfg->num_cpus > 0) - event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); - - /* We can enable changelist support with epoll, since we don't give - * Libevent any dup'd fds. This lets us avoid some syscalls. */ - event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); - - the_event_base = event_base_new_with_config(cfg); - - event_config_free(cfg); - } - - if (!the_event_base) { - /* LCOV_EXCL_START */ - log_err(LD_GENERAL, "Unable to initialize Libevent: cannot continue."); - exit(1); // exit ok: libevent is broken. - /* LCOV_EXCL_STOP */ - } - - log_info(LD_GENERAL, - "Initialized libevent version %s using method %s. Good.", - event_get_version(), tor_libevent_get_method()); -} - -/** Return the current Libevent event base that we're set up to use. */ -MOCK_IMPL(struct event_base *, -tor_libevent_get_base, (void)) -{ - tor_assert(the_event_base != NULL); - return the_event_base; -} - -/** Return the name of the Libevent backend we're using. */ -const char * -tor_libevent_get_method(void) -{ - return event_base_get_method(the_event_base); -} - -/** Return a string representation of the version of the currently running - * version of Libevent. */ -const char * -tor_libevent_get_version_str(void) -{ - return event_get_version(); -} - -/** Return a string representation of the version of Libevent that was used -* at compilation time. */ -const char * -tor_libevent_get_header_version_str(void) -{ - return LIBEVENT_VERSION; -} - -/** Represents a timer that's run every N microseconds by Libevent. */ -struct periodic_timer_t { - /** Underlying event used to implement this periodic event. */ - struct event *ev; - /** The callback we'll be invoking whenever the event triggers */ - void (*cb)(struct periodic_timer_t *, void *); - /** User-supplied data for the callback */ - void *data; -}; - -/** Libevent callback to implement a periodic event. */ -static void -periodic_timer_cb(evutil_socket_t fd, short what, void *arg) -{ - periodic_timer_t *timer = arg; - (void) what; - (void) fd; - timer->cb(timer, timer->data); -} - -/** Create and schedule a new timer that will run every tv in - * the event loop of base. When the timer fires, it will - * run the timer in cb with the user-supplied data in data. */ -periodic_timer_t * -periodic_timer_new(struct event_base *base, - const struct timeval *tv, - void (*cb)(periodic_timer_t *timer, void *data), - void *data) -{ - periodic_timer_t *timer; - tor_assert(base); - tor_assert(tv); - tor_assert(cb); - timer = tor_malloc_zero(sizeof(periodic_timer_t)); - if (!(timer->ev = tor_event_new(base, -1, EV_PERSIST, - periodic_timer_cb, timer))) { - tor_free(timer); - return NULL; - } - timer->cb = cb; - timer->data = data; - event_add(timer->ev, (struct timeval *)tv); /*drop const for old libevent*/ - return timer; -} - -/** Stop and free a periodic timer */ -void -periodic_timer_free_(periodic_timer_t *timer) -{ - if (!timer) - return; - tor_event_free(timer->ev); - tor_free(timer); -} - -int -tor_init_libevent_rng(void) -{ - int rv = 0; - char buf[256]; - if (evutil_secure_rng_init() < 0) { - rv = -1; - } - crypto_rand(buf, 32); -#ifdef HAVE_EVUTIL_SECURE_RNG_ADD_BYTES - evutil_secure_rng_add_bytes(buf, 32); -#endif - evutil_secure_rng_get_bytes(buf, sizeof(buf)); - return rv; -} - -#if defined(LIBEVENT_VERSION_NUMBER) && \ - LIBEVENT_VERSION_NUMBER >= V(2,1,1) && \ - !defined(TOR_UNIT_TESTS) -void -tor_gettimeofday_cached(struct timeval *tv) -{ - event_base_gettimeofday_cached(the_event_base, tv); -} -void -tor_gettimeofday_cache_clear(void) -{ - event_base_update_cache_time(the_event_base); -} -#else /* !(defined(LIBEVENT_VERSION_NUMBER) && ...) */ -/** Cache the current hi-res time; the cache gets reset when libevent - * calls us. */ -static struct timeval cached_time_hires = {0, 0}; - -/** Return a fairly recent view of the current time. */ -void -tor_gettimeofday_cached(struct timeval *tv) -{ - if (cached_time_hires.tv_sec == 0) { - tor_gettimeofday(&cached_time_hires); - } - *tv = cached_time_hires; -} - -/** Reset the cached view of the current time, so that the next time we try - * to learn it, we will get an up-to-date value. */ -void -tor_gettimeofday_cache_clear(void) -{ - cached_time_hires.tv_sec = 0; -} - -#ifdef TOR_UNIT_TESTS -/** For testing: force-update the cached time to a given value. */ -void -tor_gettimeofday_cache_set(const struct timeval *tv) -{ - tor_assert(tv); - memcpy(&cached_time_hires, tv, sizeof(*tv)); -} - -/** For testing: called post-fork to make libevent reinitialize - * kernel structures. */ -void -tor_libevent_postfork(void) -{ - int r = event_reinit(tor_libevent_get_base()); - tor_assert(r == 0); -} -#endif /* defined(TOR_UNIT_TESTS) */ -#endif /* defined(LIBEVENT_VERSION_NUMBER) && ... */ - diff --git a/src/tor/src/common/compat_libevent.h b/src/tor/src/common/compat_libevent.h deleted file mode 100644 index 0cdb73fbb..000000000 --- a/src/tor/src/common/compat_libevent.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (c) 2009-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_COMPAT_LIBEVENT_H -#define TOR_COMPAT_LIBEVENT_H - -#include "orconfig.h" -#include "testsupport.h" - -#include - -void configure_libevent_logging(void); -void suppress_libevent_log_msg(const char *msg); - -#define tor_event_new event_new -#define tor_evtimer_new evtimer_new -#define tor_evsignal_new evsignal_new -#define tor_evdns_add_server_port(sock, tcp, cb, data) \ - evdns_add_server_port_with_base(tor_libevent_get_base(), \ - (sock),(tcp),(cb),(data)); - -void tor_event_free_(struct event *ev); -#define tor_event_free(ev) \ - FREE_AND_NULL(struct event, tor_event_free_, (ev)) - -typedef struct periodic_timer_t periodic_timer_t; - -periodic_timer_t *periodic_timer_new(struct event_base *base, - const struct timeval *tv, - void (*cb)(periodic_timer_t *timer, void *data), - void *data); -void periodic_timer_free_(periodic_timer_t *); -#define periodic_timer_free(t) \ - FREE_AND_NULL(periodic_timer_t, periodic_timer_free_, (t)) - -#define tor_event_base_loopexit event_base_loopexit -#define tor_event_base_loopbreak event_base_loopbreak - -/** Defines a configuration for using libevent with Tor: passed as an argument - * to tor_libevent_initialize() to describe how we want to set up. */ -typedef struct tor_libevent_cfg { - /** How many CPUs should we use (not currently useful). */ - int num_cpus; - /** How many milliseconds should we allow between updating bandwidth limits? - * (Not currently useful). */ - int msec_per_tick; -} tor_libevent_cfg; - -void tor_libevent_initialize(tor_libevent_cfg *cfg); -MOCK_DECL(struct event_base *, tor_libevent_get_base, (void)); -const char *tor_libevent_get_method(void); -void tor_check_libevent_header_compatibility(void); -const char *tor_libevent_get_version_str(void); -const char *tor_libevent_get_header_version_str(void); - -int tor_init_libevent_rng(void); - -void tor_gettimeofday_cached(struct timeval *tv); -void tor_gettimeofday_cache_clear(void); -#ifdef TOR_UNIT_TESTS -void tor_gettimeofday_cache_set(const struct timeval *tv); -void tor_libevent_postfork(void); -#endif - -#ifdef COMPAT_LIBEVENT_PRIVATE - -/** Macro: returns the number of a Libevent version as a 4-byte number, - with the first three bytes representing the major, minor, and patchlevel - respectively of the library. The fourth byte is unused. - - This is equivalent to the format of LIBEVENT_VERSION_NUMBER on Libevent - 2.0.1 or later. */ -#define V(major, minor, patch) \ - (((major) << 24) | ((minor) << 16) | ((patch) << 8)) - -STATIC void -libevent_logging_callback(int severity, const char *msg); -#endif /* defined(COMPAT_LIBEVENT_PRIVATE) */ - -#endif /* !defined(TOR_COMPAT_LIBEVENT_H) */ - diff --git a/src/tor/src/common/compat_openssl.h b/src/tor/src/common/compat_openssl.h deleted file mode 100644 index c695f1e9d..000000000 --- a/src/tor/src/common/compat_openssl.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_COMPAT_OPENSSL_H -#define TOR_COMPAT_OPENSSL_H - -#include - -/** - * \file compat_openssl.h - * - * \brief compatability definitions for working with different openssl forks - **/ - -#if !defined(LIBRESSL_VERSION_NUMBER) && \ - OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(1,0,1) -#error "We require OpenSSL >= 1.0.1" -#endif - -#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) && \ - ! defined(LIBRESSL_VERSION_NUMBER) -/* We define this macro if we're trying to build with the majorly refactored - * API in OpenSSL 1.1 */ -#define OPENSSL_1_1_API -#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) && ... */ - -#ifndef OPENSSL_1_1_API -#define OPENSSL_VERSION SSLEAY_VERSION -#define OpenSSL_version(v) SSLeay_version(v) -#define OpenSSL_version_num() SSLeay() -#define RAND_OpenSSL() RAND_SSLeay() -#define STATE_IS_SW_SERVER_HELLO(st) \ - (((st) == SSL3_ST_SW_SRVR_HELLO_A) || \ - ((st) == SSL3_ST_SW_SRVR_HELLO_B)) -#define OSSL_HANDSHAKE_STATE int -#define CONST_IF_OPENSSL_1_1_API -#else /* !(!defined(OPENSSL_1_1_API)) */ -#define STATE_IS_SW_SERVER_HELLO(st) \ - ((st) == TLS_ST_SW_SRVR_HELLO) -#define CONST_IF_OPENSSL_1_1_API const -#endif /* !defined(OPENSSL_1_1_API) */ - -#endif /* !defined(TOR_COMPAT_OPENSSL_H) */ - diff --git a/src/tor/src/common/compat_pthreads.c b/src/tor/src/common/compat_pthreads.c deleted file mode 100644 index 002274c46..000000000 --- a/src/tor/src/common/compat_pthreads.c +++ /dev/null @@ -1,350 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_pthreads.c - * - * \brief Implementation for the pthreads-based multithreading backend - * functions. - */ - -#include "orconfig.h" -#include -#include -#include - -#include "compat.h" -#include "torlog.h" -#include "util.h" - -/** Wraps a void (*)(void*) function and its argument so we can - * invoke them in a way pthreads would expect. - */ -typedef struct tor_pthread_data_t { - void (*func)(void *); - void *data; -} tor_pthread_data_t; -/** Given a tor_pthread_data_t _data, call _data->func(d->data) - * and free _data. Used to make sure we can call functions the way pthread - * expects. */ -static void * -tor_pthread_helper_fn(void *_data) -{ - tor_pthread_data_t *data = _data; - void (*func)(void*); - void *arg; - /* mask signals to worker threads to avoid SIGPIPE, etc */ - sigset_t sigs; - /* We're in a subthread; don't handle any signals here. */ - sigfillset(&sigs); - pthread_sigmask(SIG_SETMASK, &sigs, NULL); - - func = data->func; - arg = data->data; - tor_free(_data); - func(arg); - return NULL; -} -/** - * A pthread attribute to make threads start detached. - */ -static pthread_attr_t attr_detached; -/** True iff we've called tor_threads_init() */ -static int threads_initialized = 0; - -/** Minimalist interface to run a void function in the background. On - * Unix calls pthread_create, on win32 calls beginthread. Returns -1 on - * failure. - * func should not return, but rather should call spawn_exit. - * - * NOTE: if data is used, it should not be allocated on the stack, - * since in a multithreaded environment, there is no way to be sure that - * the caller's stack will still be around when the called function is - * running. - */ -int -spawn_func(void (*func)(void *), void *data) -{ - pthread_t thread; - tor_pthread_data_t *d; - if (PREDICT_UNLIKELY(!threads_initialized)) { - tor_threads_init(); - } - d = tor_malloc(sizeof(tor_pthread_data_t)); - d->data = data; - d->func = func; - if (pthread_create(&thread, &attr_detached, tor_pthread_helper_fn, d)) { - tor_free(d); - return -1; - } - - return 0; -} - -/** End the current thread/process. - */ -void -spawn_exit(void) -{ - pthread_exit(NULL); -} - -/** A mutex attribute that we're going to use to tell pthreads that we want - * "recursive" mutexes (i.e., once we can re-lock if we're already holding - * them.) */ -static pthread_mutexattr_t attr_recursive; - -/** Initialize mutex so it can be locked. Every mutex must be set - * up with tor_mutex_init() or tor_mutex_new(); not both. */ -void -tor_mutex_init(tor_mutex_t *mutex) -{ - if (PREDICT_UNLIKELY(!threads_initialized)) - tor_threads_init(); // LCOV_EXCL_LINE - const int err = pthread_mutex_init(&mutex->mutex, &attr_recursive); - if (PREDICT_UNLIKELY(err)) { - // LCOV_EXCL_START - log_err(LD_GENERAL, "Error %d creating a mutex.", err); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } -} - -/** As tor_mutex_init, but initialize a mutex suitable that may be - * non-recursive, if the OS supports that. */ -void -tor_mutex_init_nonrecursive(tor_mutex_t *mutex) -{ - int err; - if (!threads_initialized) - tor_threads_init(); // LCOV_EXCL_LINE - err = pthread_mutex_init(&mutex->mutex, NULL); - if (PREDICT_UNLIKELY(err)) { - // LCOV_EXCL_START - log_err(LD_GENERAL, "Error %d creating a mutex.", err); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } -} - -/** Wait until m is free, then acquire it. */ -void -tor_mutex_acquire(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_lock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - // LCOV_EXCL_START - log_err(LD_GENERAL, "Error %d locking a mutex.", err); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } -} -/** Release the lock m so another thread can have it. */ -void -tor_mutex_release(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_unlock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - // LCOV_EXCL_START - log_err(LD_GENERAL, "Error %d unlocking a mutex.", err); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } -} -/** Clean up the mutex m so that it no longer uses any system - * resources. Does not free m. This function must only be called on - * mutexes from tor_mutex_init(). */ -void -tor_mutex_uninit(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_destroy(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - // LCOV_EXCL_START - log_err(LD_GENERAL, "Error %d destroying a mutex.", err); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } -} -/** Return an integer representing this thread. */ -unsigned long -tor_get_thread_id(void) -{ - union { - pthread_t thr; - unsigned long id; - } r; - r.thr = pthread_self(); - return r.id; -} - -/* Conditions. */ - -/** Initialize an already-allocated condition variable. */ -int -tor_cond_init(tor_cond_t *cond) -{ - pthread_condattr_t condattr; - - memset(cond, 0, sizeof(tor_cond_t)); - /* Default condition attribute. Might be used if clock monotonic is - * available else this won't affect anything. */ - if (pthread_condattr_init(&condattr)) { - return -1; - } - -#if defined(HAVE_CLOCK_GETTIME) -#if defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && \ - defined(CLOCK_MONOTONIC) - /* Use monotonic time so when we timedwait() on it, any clock adjustment - * won't affect the timeout value. */ - if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)) { - return -1; - } -#define USE_COND_CLOCK CLOCK_MONOTONIC -#else /* !(defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && ...) */ - /* On OSX Sierra, there is no pthread_condattr_setclock, so we are stuck - * with the realtime clock. - */ -#define USE_COND_CLOCK CLOCK_REALTIME -#endif /* defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && ... */ -#endif /* defined(HAVE_CLOCK_GETTIME) */ - if (pthread_cond_init(&cond->cond, &condattr)) { - return -1; - } - return 0; -} - -/** Release all resources held by cond, but do not free cond - * itself. */ -void -tor_cond_uninit(tor_cond_t *cond) -{ - if (pthread_cond_destroy(&cond->cond)) { - // LCOV_EXCL_START - log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); - return; - // LCOV_EXCL_STOP - } -} -/** Wait until one of the tor_cond_signal functions is called on cond. - * (If tv is set, and that amount of time passes with no signal to - * cond, return anyway. All waiters on the condition must wait holding - * the same mutex. All signallers should hold that mutex. The mutex - * needs to have been allocated with tor_mutex_init_for_cond(). - * - * Returns 0 on success, -1 on failure, 1 on timeout. */ -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, const struct timeval *tv) -{ - int r; - if (tv == NULL) { - while (1) { - r = pthread_cond_wait(&cond->cond, &mutex->mutex); - if (r == EINTR) { - /* EINTR should be impossible according to POSIX, but POSIX, like the - * Pirate's Code, is apparently treated "more like what you'd call - * guidelines than actual rules." */ - continue; // LCOV_EXCL_LINE - } - return r ? -1 : 0; - } - } else { - struct timeval tvnow, tvsum; - struct timespec ts; - while (1) { -#if defined(HAVE_CLOCK_GETTIME) && defined(USE_COND_CLOCK) - if (clock_gettime(USE_COND_CLOCK, &ts) < 0) { - return -1; - } - tvnow.tv_sec = ts.tv_sec; - tvnow.tv_usec = (int)(ts.tv_nsec / 1000); - timeradd(tv, &tvnow, &tvsum); -#else /* !(defined(HAVE_CLOCK_GETTIME) && defined(USE_COND_CLOCK)) */ - if (gettimeofday(&tvnow, NULL) < 0) - return -1; - timeradd(tv, &tvnow, &tvsum); -#endif /* defined(HAVE_CLOCK_GETTIME) && defined(USE_COND_CLOCK) */ - - ts.tv_sec = tvsum.tv_sec; - ts.tv_nsec = tvsum.tv_usec * 1000; - - r = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &ts); - if (r == 0) - return 0; - else if (r == ETIMEDOUT) - return 1; - else if (r == EINTR) - continue; - else - return -1; - } - } -} -/** Wake up one of the waiters on cond. */ -void -tor_cond_signal_one(tor_cond_t *cond) -{ - pthread_cond_signal(&cond->cond); -} -/** Wake up all of the waiters on cond. */ -void -tor_cond_signal_all(tor_cond_t *cond) -{ - pthread_cond_broadcast(&cond->cond); -} - -int -tor_threadlocal_init(tor_threadlocal_t *threadlocal) -{ - int err = pthread_key_create(&threadlocal->key, NULL); - return err ? -1 : 0; -} - -void -tor_threadlocal_destroy(tor_threadlocal_t *threadlocal) -{ - pthread_key_delete(threadlocal->key); - memset(threadlocal, 0, sizeof(tor_threadlocal_t)); -} - -void * -tor_threadlocal_get(tor_threadlocal_t *threadlocal) -{ - return pthread_getspecific(threadlocal->key); -} - -void -tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value) -{ - int err = pthread_setspecific(threadlocal->key, value); - tor_assert(err == 0); -} - -/** Set up common structures for use by threading. */ -void -tor_threads_init(void) -{ - if (!threads_initialized) { - pthread_mutexattr_init(&attr_recursive); - pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE); - const int ret1 = pthread_attr_init(&attr_detached); - tor_assert(ret1 == 0); -#ifndef PTHREAD_CREATE_DETACHED -#define PTHREAD_CREATE_DETACHED 1 -#endif - const int ret2 = - pthread_attr_setdetachstate(&attr_detached, PTHREAD_CREATE_DETACHED); - tor_assert(ret2 == 0); - threads_initialized = 1; - set_main_thread(); - } -} - diff --git a/src/tor/src/common/compat_threads.c b/src/tor/src/common/compat_threads.c deleted file mode 100644 index 3171c4b2f..000000000 --- a/src/tor/src/common/compat_threads.c +++ /dev/null @@ -1,407 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_threads.c - * - * \brief Cross-platform threading and inter-thread communication logic. - * (Platform-specific parts are written in the other compat_*threads - * modules.) - */ - -#include "orconfig.h" -#include -#include "compat.h" -#include "compat_threads.h" - -#include "util.h" -#include "torlog.h" - -#ifdef HAVE_SYS_EVENTFD_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -/** Return a newly allocated, ready-for-use mutex. */ -tor_mutex_t * -tor_mutex_new(void) -{ - tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); - tor_mutex_init(m); - return m; -} -/** Return a newly allocated, ready-for-use mutex. This one might be - * non-recursive, if that's faster. */ -tor_mutex_t * -tor_mutex_new_nonrecursive(void) -{ - tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); - tor_mutex_init_nonrecursive(m); - return m; -} -/** Release all storage and system resources held by m. */ -void -tor_mutex_free_(tor_mutex_t *m) -{ - if (!m) - return; - tor_mutex_uninit(m); - tor_free(m); -} - -/** Allocate and return a new condition variable. */ -tor_cond_t * -tor_cond_new(void) -{ - tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t)); - if (BUG(tor_cond_init(cond)<0)) - tor_free(cond); // LCOV_EXCL_LINE - return cond; -} - -/** Free all storage held in c. */ -void -tor_cond_free_(tor_cond_t *c) -{ - if (!c) - return; - tor_cond_uninit(c); - tor_free(c); -} - -/** Identity of the "main" thread */ -static unsigned long main_thread_id = -1; - -/** Start considering the current thread to be the 'main thread'. This has - * no effect on anything besides in_main_thread(). */ -void -set_main_thread(void) -{ - main_thread_id = tor_get_thread_id(); -} -/** Return true iff called from the main thread. */ -int -in_main_thread(void) -{ - return main_thread_id == tor_get_thread_id(); -} - -#if defined(HAVE_EVENTFD) || defined(HAVE_PIPE) -/* As write(), but retry on EINTR, and return the negative error code on - * error. */ -static int -write_ni(int fd, const void *buf, size_t n) -{ - int r; - again: - r = (int) write(fd, buf, n); - if (r < 0) { - if (errno == EINTR) - goto again; - else - return -errno; - } - return r; -} -/* As read(), but retry on EINTR, and return the negative error code on error. - */ -static int -read_ni(int fd, void *buf, size_t n) -{ - int r; - again: - r = (int) read(fd, buf, n); - if (r < 0) { - if (errno == EINTR) - goto again; - else - return -errno; - } - return r; -} -#endif /* defined(HAVE_EVENTFD) || defined(HAVE_PIPE) */ - -/** As send(), but retry on EINTR, and return the negative error code on - * error. */ -static int -send_ni(int fd, const void *buf, size_t n, int flags) -{ - int r; - again: - r = (int) send(fd, buf, n, flags); - if (r < 0) { - int error = tor_socket_errno(fd); - if (ERRNO_IS_EINTR(error)) - goto again; - else - return -error; - } - return r; -} - -/** As recv(), but retry on EINTR, and return the negative error code on - * error. */ -static int -recv_ni(int fd, void *buf, size_t n, int flags) -{ - int r; - again: - r = (int) recv(fd, buf, n, flags); - if (r < 0) { - int error = tor_socket_errno(fd); - if (ERRNO_IS_EINTR(error)) - goto again; - else - return -error; - } - return r; -} - -#ifdef HAVE_EVENTFD -/* Increment the event count on an eventfd fd */ -static int -eventfd_alert(int fd) -{ - uint64_t u = 1; - int r = write_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && -r != EAGAIN) - return -1; - return 0; -} - -/* Drain all events from an eventfd fd. */ -static int -eventfd_drain(int fd) -{ - uint64_t u = 0; - int r = read_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && -r != EAGAIN) - return r; - return 0; -} -#endif /* defined(HAVE_EVENTFD) */ - -#ifdef HAVE_PIPE -/** Send a byte over a pipe. Return 0 on success or EAGAIN; -1 on error */ -static int -pipe_alert(int fd) -{ - ssize_t r = write_ni(fd, "x", 1); - if (r < 0 && -r != EAGAIN) - return (int)r; - return 0; -} - -/** Drain all input from a pipe fd and ignore it. Return 0 on - * success, -1 on error. */ -static int -pipe_drain(int fd) -{ - char buf[32]; - ssize_t r; - do { - r = read_ni(fd, buf, sizeof(buf)); - } while (r > 0); - if (r < 0 && errno != EAGAIN) - return -errno; - /* A value of r = 0 means EOF on the fd so successfully drained. */ - return 0; -} -#endif /* defined(HAVE_PIPE) */ - -/** Send a byte on socket fdt. Return 0 on success or EAGAIN, - * -1 on error. */ -static int -sock_alert(tor_socket_t fd) -{ - ssize_t r = send_ni(fd, "x", 1, 0); - if (r < 0 && !ERRNO_IS_EAGAIN(-r)) - return (int)r; - return 0; -} - -/** Drain all the input from a socket fd, and ignore it. Return 0 on - * success, -errno on error. */ -static int -sock_drain(tor_socket_t fd) -{ - char buf[32]; - ssize_t r; - do { - r = recv_ni(fd, buf, sizeof(buf), 0); - } while (r > 0); - if (r < 0 && !ERRNO_IS_EAGAIN(-r)) - return (int)r; - /* A value of r = 0 means EOF on the fd so successfully drained. */ - return 0; -} - -/** Allocate a new set of alert sockets, and set the appropriate function - * pointers, in socks_out. */ -int -alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags) -{ - tor_socket_t socks[2] = { TOR_INVALID_SOCKET, TOR_INVALID_SOCKET }; - -#ifdef HAVE_EVENTFD - /* First, we try the Linux eventfd() syscall. This gives a 64-bit counter - * associated with a single file descriptor. */ -#if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) - if (!(flags & ASOCKS_NOEVENTFD2)) - socks[0] = eventfd(0, EFD_CLOEXEC|EFD_NONBLOCK); -#endif - if (socks[0] < 0 && !(flags & ASOCKS_NOEVENTFD)) { - socks[0] = eventfd(0,0); - if (socks[0] >= 0) { - if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 || - set_socket_nonblocking(socks[0]) < 0) { - // LCOV_EXCL_START -- if eventfd succeeds, fcntl will. - tor_assert_nonfatal_unreached(); - close(socks[0]); - return -1; - // LCOV_EXCL_STOP - } - } - } - if (socks[0] >= 0) { - socks_out->read_fd = socks_out->write_fd = socks[0]; - socks_out->alert_fn = eventfd_alert; - socks_out->drain_fn = eventfd_drain; - return 0; - } -#endif /* defined(HAVE_EVENTFD) */ - -#ifdef HAVE_PIPE2 - /* Now we're going to try pipes. First type the pipe2() syscall, if we - * have it, so we can save some calls... */ - if (!(flags & ASOCKS_NOPIPE2) && - pipe2(socks, O_NONBLOCK|O_CLOEXEC) == 0) { - socks_out->read_fd = socks[0]; - socks_out->write_fd = socks[1]; - socks_out->alert_fn = pipe_alert; - socks_out->drain_fn = pipe_drain; - return 0; - } -#endif /* defined(HAVE_PIPE2) */ - -#ifdef HAVE_PIPE - /* Now try the regular pipe() syscall. Pipes have a bit lower overhead than - * socketpairs, fwict. */ - if (!(flags & ASOCKS_NOPIPE) && - pipe(socks) == 0) { - if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 || - fcntl(socks[1], F_SETFD, FD_CLOEXEC) < 0 || - set_socket_nonblocking(socks[0]) < 0 || - set_socket_nonblocking(socks[1]) < 0) { - // LCOV_EXCL_START -- if pipe succeeds, you can fcntl the output - tor_assert_nonfatal_unreached(); - close(socks[0]); - close(socks[1]); - return -1; - // LCOV_EXCL_STOP - } - socks_out->read_fd = socks[0]; - socks_out->write_fd = socks[1]; - socks_out->alert_fn = pipe_alert; - socks_out->drain_fn = pipe_drain; - return 0; - } -#endif /* defined(HAVE_PIPE) */ - - /* If nothing else worked, fall back on socketpair(). */ - if (!(flags & ASOCKS_NOSOCKETPAIR) && - tor_socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == 0) { - if (set_socket_nonblocking(socks[0]) < 0 || - set_socket_nonblocking(socks[1])) { - // LCOV_EXCL_START -- if socketpair worked, you can make it nonblocking. - tor_assert_nonfatal_unreached(); - tor_close_socket(socks[0]); - tor_close_socket(socks[1]); - return -1; - // LCOV_EXCL_STOP - } - socks_out->read_fd = socks[0]; - socks_out->write_fd = socks[1]; - socks_out->alert_fn = sock_alert; - socks_out->drain_fn = sock_drain; - return 0; - } - return -1; -} - -/** Close the sockets in socks. */ -void -alert_sockets_close(alert_sockets_t *socks) -{ - if (socks->alert_fn == sock_alert) { - /* they are sockets. */ - tor_close_socket(socks->read_fd); - tor_close_socket(socks->write_fd); - } else { - close(socks->read_fd); - if (socks->write_fd != socks->read_fd) - close(socks->write_fd); - } - socks->read_fd = socks->write_fd = -1; -} - -#ifndef HAVE_STDATOMIC_H -/** Initialize a new atomic counter with the value 0 */ -void -atomic_counter_init(atomic_counter_t *counter) -{ - memset(counter, 0, sizeof(*counter)); - tor_mutex_init_nonrecursive(&counter->mutex); -} -/** Clean up all resources held by an atomic counter. */ -void -atomic_counter_destroy(atomic_counter_t *counter) -{ - tor_mutex_uninit(&counter->mutex); - memset(counter, 0, sizeof(*counter)); -} -/** Add a value to an atomic counter. */ -void -atomic_counter_add(atomic_counter_t *counter, size_t add) -{ - tor_mutex_acquire(&counter->mutex); - counter->val += add; - tor_mutex_release(&counter->mutex); -} -/** Subtract a value from an atomic counter. */ -void -atomic_counter_sub(atomic_counter_t *counter, size_t sub) -{ - // this relies on unsigned overflow, but that's fine. - atomic_counter_add(counter, -sub); -} -/** Return the current value of an atomic counter */ -size_t -atomic_counter_get(atomic_counter_t *counter) -{ - size_t val; - tor_mutex_acquire(&counter->mutex); - val = counter->val; - tor_mutex_release(&counter->mutex); - return val; -} -/** Replace the value of an atomic counter; return the old one. */ -size_t -atomic_counter_exchange(atomic_counter_t *counter, size_t newval) -{ - size_t oldval; - tor_mutex_acquire(&counter->mutex); - oldval = counter->val; - counter->val = newval; - tor_mutex_release(&counter->mutex); - return oldval; -} -#endif /* !defined(HAVE_STDATOMIC_H) */ - diff --git a/src/tor/src/common/compat_threads.h b/src/tor/src/common/compat_threads.h deleted file mode 100644 index c93e601ec..000000000 --- a/src/tor/src/common/compat_threads.h +++ /dev/null @@ -1,223 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_COMPAT_THREADS_H -#define TOR_COMPAT_THREADS_H - -#include "orconfig.h" -#include "torint.h" -#include "testsupport.h" - -#if defined(HAVE_PTHREAD_H) && !defined(_WIN32) -#include -#endif - -#ifdef HAVE_STDATOMIC_H -#include -#endif - -#if defined(_WIN32) -#define USE_WIN32_THREADS -#elif defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_CREATE) -#define USE_PTHREADS -#else -#error "No threading system was found" -#endif /* defined(_WIN32) || ... */ - -int spawn_func(void (*func)(void *), void *data); -void spawn_exit(void) ATTR_NORETURN; - -/* Because we use threads instead of processes on most platforms (Windows, - * Linux, etc), we need locking for them. On platforms with poor thread - * support or broken gethostbyname_r, these functions are no-ops. */ - -/** A generic lock structure for multithreaded builds. */ -typedef struct tor_mutex_t { -#if defined(USE_WIN32_THREADS) - /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */ - CRITICAL_SECTION mutex; -#elif defined(USE_PTHREADS) - /** Pthreads-only: with pthreads, we implement locks with - * pthread_mutex_t. */ - pthread_mutex_t mutex; -#else - /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */ - int _unused; -#endif /* defined(USE_WIN32_THREADS) || ... */ -} tor_mutex_t; - -tor_mutex_t *tor_mutex_new(void); -tor_mutex_t *tor_mutex_new_nonrecursive(void); -void tor_mutex_init(tor_mutex_t *m); -void tor_mutex_init_nonrecursive(tor_mutex_t *m); -void tor_mutex_acquire(tor_mutex_t *m); -void tor_mutex_release(tor_mutex_t *m); -void tor_mutex_free_(tor_mutex_t *m); -#define tor_mutex_free(m) FREE_AND_NULL(tor_mutex_t, tor_mutex_free_, (m)) -void tor_mutex_uninit(tor_mutex_t *m); -unsigned long tor_get_thread_id(void); -void tor_threads_init(void); - -/** Conditions need nonrecursive mutexes with pthreads. */ -#define tor_mutex_init_for_cond(m) tor_mutex_init_nonrecursive(m) - -void set_main_thread(void); -int in_main_thread(void); - -typedef struct tor_cond_t { -#ifdef USE_PTHREADS - pthread_cond_t cond; -#elif defined(USE_WIN32_THREADS) - HANDLE event; - - CRITICAL_SECTION lock; - int n_waiting; - int n_to_wake; - int generation; -#else -#error no known condition implementation. -#endif /* defined(USE_PTHREADS) || ... */ -} tor_cond_t; - -tor_cond_t *tor_cond_new(void); -void tor_cond_free_(tor_cond_t *cond); -#define tor_cond_free(c) FREE_AND_NULL(tor_cond_t, tor_cond_free_, (c)) -int tor_cond_init(tor_cond_t *cond); -void tor_cond_uninit(tor_cond_t *cond); -int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, - const struct timeval *tv); -void tor_cond_signal_one(tor_cond_t *cond); -void tor_cond_signal_all(tor_cond_t *cond); - -/** Helper type used to manage waking up the main thread while it's in - * the libevent main loop. Used by the work queue code. */ -typedef struct alert_sockets_s { - /* XXXX This structure needs a better name. */ - /** Socket that the main thread should listen for EV_READ events on. - * Note that this socket may be a regular fd on a non-Windows platform. - */ - tor_socket_t read_fd; - /** Socket to use when alerting the main thread. */ - tor_socket_t write_fd; - /** Function to alert the main thread */ - int (*alert_fn)(tor_socket_t write_fd); - /** Function to make the main thread no longer alerted. */ - int (*drain_fn)(tor_socket_t read_fd); -} alert_sockets_t; - -/* Flags to disable one or more alert_sockets backends. */ -#define ASOCKS_NOEVENTFD2 (1u<<0) -#define ASOCKS_NOEVENTFD (1u<<1) -#define ASOCKS_NOPIPE2 (1u<<2) -#define ASOCKS_NOPIPE (1u<<3) -#define ASOCKS_NOSOCKETPAIR (1u<<4) - -int alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags); -void alert_sockets_close(alert_sockets_t *socks); - -typedef struct tor_threadlocal_s { -#ifdef _WIN32 - DWORD index; -#else - pthread_key_t key; -#endif -} tor_threadlocal_t; - -/** Initialize a thread-local variable. - * - * After you call this function on a tor_threadlocal_t, you can call - * tor_threadlocal_set to change the current value of this variable for the - * current thread, and tor_threadlocal_get to retrieve the current value for - * the current thread. Each thread has its own value. - **/ -int tor_threadlocal_init(tor_threadlocal_t *threadlocal); -/** - * Release all resource associated with a thread-local variable. - */ -void tor_threadlocal_destroy(tor_threadlocal_t *threadlocal); -/** - * Return the current value of a thread-local variable for this thread. - * - * It's undefined behavior to use this function if the threadlocal hasn't - * been initialized, or has been destroyed. - */ -void *tor_threadlocal_get(tor_threadlocal_t *threadlocal); -/** - * Change the current value of a thread-local variable for this thread to - * value. - * - * It's undefined behavior to use this function if the threadlocal hasn't - * been initialized, or has been destroyed. - */ -void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value); - -/** - * Atomic counter type; holds a size_t value. - */ -#ifdef HAVE_STDATOMIC_H -typedef struct atomic_counter_t { - atomic_size_t val; -} atomic_counter_t; -#define ATOMIC_LINKAGE static -#else /* !(defined(HAVE_STDATOMIC_H)) */ -typedef struct atomic_counter_t { - tor_mutex_t mutex; - size_t val; -} atomic_counter_t; -#define ATOMIC_LINKAGE -#endif /* defined(HAVE_STDATOMIC_H) */ - -ATOMIC_LINKAGE void atomic_counter_init(atomic_counter_t *counter); -ATOMIC_LINKAGE void atomic_counter_destroy(atomic_counter_t *counter); -ATOMIC_LINKAGE void atomic_counter_add(atomic_counter_t *counter, size_t add); -ATOMIC_LINKAGE void atomic_counter_sub(atomic_counter_t *counter, size_t sub); -ATOMIC_LINKAGE size_t atomic_counter_get(atomic_counter_t *counter); -ATOMIC_LINKAGE size_t atomic_counter_exchange(atomic_counter_t *counter, - size_t newval); -#undef ATOMIC_LINKAGE - -#ifdef HAVE_STDATOMIC_H -/** Initialize a new atomic counter with the value 0 */ -static inline void -atomic_counter_init(atomic_counter_t *counter) -{ - atomic_init(&counter->val, 0); -} -/** Clean up all resources held by an atomic counter. */ -static inline void -atomic_counter_destroy(atomic_counter_t *counter) -{ - (void)counter; -} -/** Add a value to an atomic counter. */ -static inline void -atomic_counter_add(atomic_counter_t *counter, size_t add) -{ - (void) atomic_fetch_add(&counter->val, add); -} -/** Subtract a value from an atomic counter. */ -static inline void -atomic_counter_sub(atomic_counter_t *counter, size_t sub) -{ - (void) atomic_fetch_sub(&counter->val, sub); -} -/** Return the current value of an atomic counter */ -static inline size_t -atomic_counter_get(atomic_counter_t *counter) -{ - return atomic_load(&counter->val); -} -/** Replace the value of an atomic counter; return the old one. */ -static inline size_t -atomic_counter_exchange(atomic_counter_t *counter, size_t newval) -{ - return atomic_exchange(&counter->val, newval); -} - -#else /* !(defined(HAVE_STDATOMIC_H)) */ -#endif /* defined(HAVE_STDATOMIC_H) */ - -#endif /* !defined(TOR_COMPAT_THREADS_H) */ - diff --git a/src/tor/src/common/compat_time.c b/src/tor/src/common/compat_time.c deleted file mode 100644 index 8cecff278..000000000 --- a/src/tor/src/common/compat_time.c +++ /dev/null @@ -1,840 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_time.c - * \brief Portable wrappers for finding out the current time, running - * timers, etc. - **/ - -#define COMPAT_TIME_PRIVATE -#include "compat.h" - -#ifdef _WIN32 -#include -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef TOR_UNIT_TESTS -#if !defined(HAVE_USLEEP) && defined(HAVE_SYS_SELECT_H) -/* as fallback implementation for tor_sleep_msec */ -#include -#endif -#endif /* defined(TOR_UNIT_TESTS) */ - -#ifdef __APPLE__ -#include -#endif - -#include "torlog.h" -#include "util.h" -#include "container.h" - -#ifndef HAVE_GETTIMEOFDAY -#ifdef HAVE_FTIME -#include -#endif -#endif - -#ifdef _WIN32 -#undef HAVE_CLOCK_GETTIME -#endif - -#ifdef TOR_UNIT_TESTS -/** Delay for msec milliseconds. Only used in tests. */ -void -tor_sleep_msec(int msec) -{ -#ifdef _WIN32 - Sleep(msec); -#elif defined(HAVE_USLEEP) - sleep(msec / 1000); - /* Some usleep()s hate sleeping more than 1 sec */ - usleep((msec % 1000) * 1000); -#elif defined(HAVE_SYS_SELECT_H) - struct timeval tv = { msec / 1000, (msec % 1000) * 1000}; - select(0, NULL, NULL, NULL, &tv); -#else - sleep(CEIL_DIV(msec, 1000)); -#endif /* defined(_WIN32) || ... */ -} -#endif /* defined(TOR_UNIT_TESTS) */ - -/** Set *timeval to the current time of day. On error, log and terminate. - * (Same as gettimeofday(timeval,NULL), but never returns -1.) - */ -void -tor_gettimeofday(struct timeval *timeval) -{ -#ifdef _WIN32 - /* Epoch bias copied from perl: number of units between windows epoch and - * Unix epoch. */ -#define EPOCH_BIAS U64_LITERAL(116444736000000000) -#define UNITS_PER_SEC U64_LITERAL(10000000) -#define USEC_PER_SEC U64_LITERAL(1000000) -#define UNITS_PER_USEC U64_LITERAL(10) - union { - uint64_t ft_64; - FILETIME ft_ft; - } ft; - /* number of 100-nsec units since Jan 1, 1601 */ - GetSystemTimeAsFileTime(&ft.ft_ft); - if (ft.ft_64 < EPOCH_BIAS) { - /* LCOV_EXCL_START */ - log_err(LD_GENERAL,"System time is before 1970; failing."); - exit(1); // exit ok: system clock is broken. - /* LCOV_EXCL_STOP */ - } - ft.ft_64 -= EPOCH_BIAS; - timeval->tv_sec = (unsigned) (ft.ft_64 / UNITS_PER_SEC); - timeval->tv_usec = (unsigned) ((ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC); -#elif defined(HAVE_GETTIMEOFDAY) - if (gettimeofday(timeval, NULL)) { - /* LCOV_EXCL_START */ - log_err(LD_GENERAL,"gettimeofday failed."); - /* If gettimeofday dies, we have either given a bad timezone (we didn't), - or segfaulted.*/ - exit(1); // exit ok: gettimeofday failed. - /* LCOV_EXCL_STOP */ - } -#elif defined(HAVE_FTIME) - struct timeb tb; - ftime(&tb); - timeval->tv_sec = tb.time; - timeval->tv_usec = tb.millitm * 1000; -#else -#error "No way to get time." -#endif /* defined(_WIN32) || ... */ - return; -} - -#define ONE_MILLION ((int64_t) (1000 * 1000)) -#define ONE_BILLION ((int64_t) (1000 * 1000 * 1000)) - -/** True iff monotime_init has been called. */ -static int monotime_initialized = 0; - -static monotime_t initialized_at; -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT -static monotime_coarse_t initialized_at_coarse; -#endif - -#ifdef TOR_UNIT_TESTS -/** True if we are running unit tests and overriding the current monotonic - * time. Note that mocked monotonic time might not be monotonic. - */ -static int monotime_mocking_enabled = 0; -static monotime_t initialized_at_saved; - -static int64_t mock_time_nsec = 0; -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT -static int64_t mock_time_nsec_coarse = 0; -static monotime_coarse_t initialized_at_coarse_saved; -#endif - -void -monotime_enable_test_mocking(void) -{ - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - - tor_assert_nonfatal(monotime_mocking_enabled == 0); - monotime_mocking_enabled = 1; - memcpy(&initialized_at_saved, - &initialized_at, sizeof(monotime_t)); - memset(&initialized_at, 0, sizeof(monotime_t)); -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT - memcpy(&initialized_at_coarse_saved, - &initialized_at_coarse, sizeof(monotime_coarse_t)); - memset(&initialized_at_coarse, 0, sizeof(monotime_coarse_t)); -#endif -} - -void -monotime_disable_test_mocking(void) -{ - tor_assert_nonfatal(monotime_mocking_enabled == 1); - monotime_mocking_enabled = 0; - - memcpy(&initialized_at, - &initialized_at_saved, sizeof(monotime_t)); -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT - memcpy(&initialized_at_coarse, - &initialized_at_coarse_saved, sizeof(monotime_coarse_t)); -#endif -} - -void -monotime_set_mock_time_nsec(int64_t nsec) -{ - tor_assert_nonfatal(monotime_mocking_enabled == 1); - mock_time_nsec = nsec; -} - -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT -void -monotime_coarse_set_mock_time_nsec(int64_t nsec) -{ - tor_assert_nonfatal(monotime_mocking_enabled == 1); - mock_time_nsec_coarse = nsec; -} -#endif /* defined(MONOTIME_COARSE_FN_IS_DIFFERENT) */ -#endif /* defined(TOR_UNIT_TESTS) */ - -/* "ratchet" functions for monotonic time. */ - -#if defined(_WIN32) || defined(TOR_UNIT_TESTS) - -/** Protected by lock: last value returned by monotime_get(). */ -static int64_t last_pctr = 0; -/** Protected by lock: offset we must add to monotonic time values. */ -static int64_t pctr_offset = 0; -/* If we are using GetTickCount(), how many times has it rolled over? */ -static uint32_t rollover_count = 0; -/* If we are using GetTickCount(), what's the last value it returned? */ -static int64_t last_tick_count = 0; - -/** Helper for windows: Called with a sequence of times that are supposed - * to be monotonic; increments them as appropriate so that they actually - * _are_ monotonic. - * - * Caller must hold lock. */ -STATIC int64_t -ratchet_performance_counter(int64_t count_raw) -{ - /* must hold lock */ - const int64_t count_adjusted = count_raw + pctr_offset; - - if (PREDICT_UNLIKELY(count_adjusted < last_pctr)) { - /* Monotonicity failed! Pretend no time elapsed. */ - pctr_offset = last_pctr - count_raw; - return last_pctr; - } else { - last_pctr = count_adjusted; - return count_adjusted; - } -} - -STATIC int64_t -ratchet_coarse_performance_counter(const int64_t count_raw) -{ - int64_t count = count_raw + (((int64_t)rollover_count) << 32); - while (PREDICT_UNLIKELY(count < last_tick_count)) { - ++rollover_count; - count = count_raw + (((int64_t)rollover_count) << 32); - } - last_tick_count = count; - return count; -} -#endif /* defined(_WIN32) || defined(TOR_UNIT_TESTS) */ - -#if defined(MONOTIME_USING_GETTIMEOFDAY) || defined(TOR_UNIT_TESTS) -static struct timeval last_timeofday = { 0, 0 }; -static struct timeval timeofday_offset = { 0, 0 }; - -/** Helper for gettimeofday(): Called with a sequence of times that are - * supposed to be monotonic; increments them as appropriate so that they - * actually _are_ monotonic. - * - * Caller must hold lock. */ -STATIC void -ratchet_timeval(const struct timeval *timeval_raw, struct timeval *out) -{ - /* must hold lock */ - timeradd(timeval_raw, &timeofday_offset, out); - if (PREDICT_UNLIKELY(timercmp(out, &last_timeofday, OP_LT))) { - /* time ran backwards. Instead, declare that no time occurred. */ - timersub(&last_timeofday, timeval_raw, &timeofday_offset); - memcpy(out, &last_timeofday, sizeof(struct timeval)); - } else { - memcpy(&last_timeofday, out, sizeof(struct timeval)); - } -} -#endif /* defined(MONOTIME_USING_GETTIMEOFDAY) || defined(TOR_UNIT_TESTS) */ - -#ifdef TOR_UNIT_TESTS -/** For testing: reset all the ratchets */ -void -monotime_reset_ratchets_for_testing(void) -{ - last_pctr = pctr_offset = last_tick_count = 0; - rollover_count = 0; - memset(&last_timeofday, 0, sizeof(struct timeval)); - memset(&timeofday_offset, 0, sizeof(struct timeval)); -} -#endif /* defined(TOR_UNIT_TESTS) */ - -#ifdef __APPLE__ - -/** Initialized on startup: tells is how to convert from ticks to - * nanoseconds. - */ -static struct mach_timebase_info mach_time_info; -static int monotime_shift = 0; - -static void -monotime_init_internal(void) -{ - tor_assert(!monotime_initialized); - int r = mach_timebase_info(&mach_time_info); - tor_assert(r == 0); - tor_assert(mach_time_info.denom != 0); - - { - // approximate only. - uint64_t ns_per_tick = mach_time_info.numer / mach_time_info.denom; - uint64_t ms_per_tick = ns_per_tick * ONE_MILLION; - // requires that tor_log2(0) == 0. - monotime_shift = tor_log2(ms_per_tick); - } -} - -/** - * Set "out" to the most recent monotonic time value - */ -void -monotime_get(monotime_t *out) -{ -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->abstime_ = (mock_time_nsec * mach_time_info.denom) - / mach_time_info.numer; - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - out->abstime_ = mach_absolute_time(); -} - -#if defined(HAVE_MACH_APPROXIMATE_TIME) -void -monotime_coarse_get(monotime_coarse_t *out) -{ -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->abstime_ = (mock_time_nsec_coarse * mach_time_info.denom) - / mach_time_info.numer; - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - out->abstime_ = mach_approximate_time(); -} -#endif - -/** - * Return the number of nanoseconds between start and end. - */ -int64_t -monotime_diff_nsec(const monotime_t *start, - const monotime_t *end) -{ - if (BUG(mach_time_info.denom == 0)) { - monotime_init(); - } - const int64_t diff_ticks = end->abstime_ - start->abstime_; - const int64_t diff_nsec = - (diff_ticks * mach_time_info.numer) / mach_time_info.denom; - return diff_nsec; -} - -uint32_t -monotime_coarse_to_stamp(const monotime_coarse_t *t) -{ - return (uint32_t)(t->abstime_ >> monotime_shift); -} - -int -monotime_is_zero(const monotime_t *val) -{ - return val->abstime_ == 0; -} - -void -monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec) -{ - const uint64_t nsec = msec * ONE_MILLION; - const uint64_t ticks = (nsec * mach_time_info.denom) / mach_time_info.numer; - out->abstime_ = val->abstime_ + ticks; -} - -/* end of "__APPLE__" */ -#elif defined(HAVE_CLOCK_GETTIME) - -#ifdef CLOCK_MONOTONIC_COARSE -/** - * Which clock should we use for coarse-grained monotonic time? By default - * this is CLOCK_MONOTONIC_COARSE, but it might not work -- for example, - * if we're compiled with newer Linux headers and then we try to run on - * an old Linux kernel. In that case, we will fall back to CLOCK_MONOTONIC. - */ -static int clock_monotonic_coarse = CLOCK_MONOTONIC_COARSE; -#endif /* defined(CLOCK_MONOTONIC_COARSE) */ - -static void -monotime_init_internal(void) -{ -#ifdef CLOCK_MONOTONIC_COARSE - struct timespec ts; - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) < 0) { - log_info(LD_GENERAL, "CLOCK_MONOTONIC_COARSE isn't working (%s); " - "falling back to CLOCK_MONOTONIC.", strerror(errno)); - clock_monotonic_coarse = CLOCK_MONOTONIC; - } -#endif /* defined(CLOCK_MONOTONIC_COARSE) */ -} - -void -monotime_get(monotime_t *out) -{ -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->ts_.tv_sec = (time_t) (mock_time_nsec / ONE_BILLION); - out->ts_.tv_nsec = (int) (mock_time_nsec % ONE_BILLION); - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - int r = clock_gettime(CLOCK_MONOTONIC, &out->ts_); - tor_assert(r == 0); -} - -#ifdef CLOCK_MONOTONIC_COARSE -void -monotime_coarse_get(monotime_coarse_t *out) -{ -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->ts_.tv_sec = (time_t) (mock_time_nsec_coarse / ONE_BILLION); - out->ts_.tv_nsec = (int) (mock_time_nsec_coarse % ONE_BILLION); - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - int r = clock_gettime(clock_monotonic_coarse, &out->ts_); - if (PREDICT_UNLIKELY(r < 0) && - errno == EINVAL && - clock_monotonic_coarse == CLOCK_MONOTONIC_COARSE) { - /* We should have caught this at startup in monotime_init_internal! - */ - log_warn(LD_BUG, "Falling back to non-coarse monotonic time %s initial " - "system start?", monotime_initialized?"after":"without"); - clock_monotonic_coarse = CLOCK_MONOTONIC; - r = clock_gettime(clock_monotonic_coarse, &out->ts_); - } - - tor_assert(r == 0); -} -#endif /* defined(CLOCK_MONOTONIC_COARSE) */ - -int64_t -monotime_diff_nsec(const monotime_t *start, - const monotime_t *end) -{ - const int64_t diff_sec = end->ts_.tv_sec - start->ts_.tv_sec; - const int64_t diff_nsec = diff_sec * ONE_BILLION + - (end->ts_.tv_nsec - start->ts_.tv_nsec); - - return diff_nsec; -} - -/* This value is ONE_BILLION >> 20. */ -static const uint32_t STAMP_TICKS_PER_SECOND = 953; - -uint32_t -monotime_coarse_to_stamp(const monotime_coarse_t *t) -{ - uint32_t nsec = (uint32_t)t->ts_.tv_nsec; - uint32_t sec = (uint32_t)t->ts_.tv_sec; - - return (sec * STAMP_TICKS_PER_SECOND) + (nsec >> 20); -} - -int -monotime_is_zero(const monotime_t *val) -{ - return val->ts_.tv_sec == 0 && val->ts_.tv_nsec == 0; -} - -void -monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec) -{ - const uint32_t sec = msec / 1000; - const uint32_t msec_remainder = msec % 1000; - out->ts_.tv_sec = val->ts_.tv_sec + sec; - out->ts_.tv_nsec = val->ts_.tv_nsec + (msec_remainder * ONE_MILLION); - if (out->ts_.tv_nsec > ONE_BILLION) { - out->ts_.tv_nsec -= ONE_BILLION; - out->ts_.tv_sec += 1; - } -} - -/* end of "HAVE_CLOCK_GETTIME" */ -#elif defined (_WIN32) - -/** Result of QueryPerformanceFrequency, in terms needed to - * convert ticks to nanoseconds. */ -static int64_t nsec_per_tick_numer = 1; -static int64_t nsec_per_tick_denom = 1; - -/** Lock to protect last_pctr and pctr_offset */ -static CRITICAL_SECTION monotime_lock; -/** Lock to protect rollover_count and last_tick_count */ -static CRITICAL_SECTION monotime_coarse_lock; - -typedef ULONGLONG (WINAPI *GetTickCount64_fn_t)(void); -static GetTickCount64_fn_t GetTickCount64_fn = NULL; - -static void -monotime_init_internal(void) -{ - tor_assert(!monotime_initialized); - BOOL ok = InitializeCriticalSectionAndSpinCount(&monotime_lock, 200); - tor_assert(ok); - ok = InitializeCriticalSectionAndSpinCount(&monotime_coarse_lock, 200); - tor_assert(ok); - LARGE_INTEGER li; - ok = QueryPerformanceFrequency(&li); - tor_assert(ok); - tor_assert(li.QuadPart); - - uint64_t n = ONE_BILLION; - uint64_t d = li.QuadPart; - /* We need to simplify this or we'll probably overflow the int64. */ - simplify_fraction64(&n, &d); - tor_assert(n <= INT64_MAX); - tor_assert(d <= INT64_MAX); - - nsec_per_tick_numer = (int64_t) n; - nsec_per_tick_denom = (int64_t) d; - - last_pctr = 0; - pctr_offset = 0; - - HANDLE h = load_windows_system_library(TEXT("kernel32.dll")); - if (h) { - GetTickCount64_fn = (GetTickCount64_fn_t) - GetProcAddress(h, "GetTickCount64"); - } - // FreeLibrary(h) ? -} - -void -monotime_get(monotime_t *out) -{ - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->pcount_ = (mock_time_nsec * nsec_per_tick_denom) - / nsec_per_tick_numer; - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - - /* Alas, QueryPerformanceCounter is not always monotonic: see bug list at - - https://www.python.org/dev/peps/pep-0418/#windows-queryperformancecounter - */ - - EnterCriticalSection(&monotime_lock); - LARGE_INTEGER res; - BOOL ok = QueryPerformanceCounter(&res); - tor_assert(ok); - const int64_t count_raw = res.QuadPart; - out->pcount_ = ratchet_performance_counter(count_raw); - LeaveCriticalSection(&monotime_lock); -} - -void -monotime_coarse_get(monotime_coarse_t *out) -{ -#ifdef TOR_UNIT_TESTS - if (monotime_mocking_enabled) { - out->tick_count_ = mock_time_nsec_coarse / ONE_MILLION; - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - - if (GetTickCount64_fn) { - out->tick_count_ = (int64_t)GetTickCount64_fn(); - } else { - EnterCriticalSection(&monotime_coarse_lock); - DWORD tick = GetTickCount(); - out->tick_count_ = ratchet_coarse_performance_counter(tick); - LeaveCriticalSection(&monotime_coarse_lock); - } -} - -int64_t -monotime_diff_nsec(const monotime_t *start, - const monotime_t *end) -{ - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - const int64_t diff_ticks = end->pcount_ - start->pcount_; - return (diff_ticks * nsec_per_tick_numer) / nsec_per_tick_denom; -} - -int64_t -monotime_coarse_diff_msec(const monotime_coarse_t *start, - const monotime_coarse_t *end) -{ - const int64_t diff_ticks = end->tick_count_ - start->tick_count_; - return diff_ticks; -} - -int64_t -monotime_coarse_diff_usec(const monotime_coarse_t *start, - const monotime_coarse_t *end) -{ - return monotime_coarse_diff_msec(start, end) * 1000; -} - -int64_t -monotime_coarse_diff_nsec(const monotime_coarse_t *start, - const monotime_coarse_t *end) -{ - return monotime_coarse_diff_msec(start, end) * ONE_MILLION; -} - -static const uint32_t STAMP_TICKS_PER_SECOND = 1000; - -uint32_t -monotime_coarse_to_stamp(const monotime_coarse_t *t) -{ - return (uint32_t) t->tick_count_; -} - -int -monotime_is_zero(const monotime_t *val) -{ - return val->pcount_ == 0; -} - -int -monotime_coarse_is_zero(const monotime_coarse_t *val) -{ - return val->tick_count_ == 0; -} - -void -monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec) -{ - const uint64_t nsec = msec * ONE_MILLION; - const uint64_t ticks = (nsec * nsec_per_tick_denom) / nsec_per_tick_numer; - out->pcount_ = val->pcount_ + ticks; -} - -void -monotime_coarse_add_msec(monotime_coarse_t *out, const monotime_coarse_t *val, - uint32_t msec) -{ - out->tick_count_ = val->tick_count_ + msec; -} - -/* end of "_WIN32" */ -#elif defined(MONOTIME_USING_GETTIMEOFDAY) - -static tor_mutex_t monotime_lock; - -/** Initialize the monotonic timer subsystem. */ -static void -monotime_init_internal(void) -{ - tor_assert(!monotime_initialized); - tor_mutex_init(&monotime_lock); -} - -void -monotime_get(monotime_t *out) -{ - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - - tor_mutex_acquire(&monotime_lock); - struct timeval timeval_raw; - tor_gettimeofday(&timeval_raw); - ratchet_timeval(&timeval_raw, &out->tv_); - tor_mutex_release(&monotime_lock); -} - -int64_t -monotime_diff_nsec(const monotime_t *start, - const monotime_t *end) -{ - struct timeval diff; - timersub(&end->tv_, &start->tv_, &diff); - return (diff.tv_sec * ONE_BILLION + diff.tv_usec * 1000); -} - -/* This value is ONE_MILLION >> 10. */ -static const uint32_t STAMP_TICKS_PER_SECOND = 976; - -uint32_t -monotime_coarse_to_stamp(const monotime_coarse_t *t) -{ - const uint32_t usec = (uint32_t)t->tv_.tv_usec; - const uint32_t sec = (uint32_t)t->tv_.tv_sec; - return (sec * STAMP_TICKS_PER_SECOND) | (nsec >> 10); -} - -int -monotime_is_zero(const monotime_t *val) -{ - return val->tv_.tv_sec == 0 && val->tv_.tv_usec == 0; -} - -void -monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec) -{ - const uint32_t sec = msec / 1000; - const uint32_t msec_remainder = msec % 1000; - out->tv_.tv_sec = val->tv_.tv_sec + sec; - out->tv_.tv_usec = val->tv_.tv_nsec + (msec_remainder * 1000); - if (out->tv_.tv_usec > ONE_MILLION) { - out->tv_.tv_usec -= ONE_MILLION; - out->tv_.tv_sec += 1; - } -} - -/* end of "MONOTIME_USING_GETTIMEOFDAY" */ -#else -#error "No way to implement monotonic timers." -#endif /* defined(__APPLE__) || ... */ - -/** - * Initialize the monotonic timer subsystem. Must be called before any - * monotonic timer functions. This function is idempotent. - */ -void -monotime_init(void) -{ - if (!monotime_initialized) { - monotime_init_internal(); - monotime_initialized = 1; - monotime_get(&initialized_at); -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT - monotime_coarse_get(&initialized_at_coarse); -#endif - } -} - -void -monotime_zero(monotime_t *out) -{ - memset(out, 0, sizeof(*out)); -} -#ifdef MONOTIME_COARSE_TYPE_IS_DIFFERENT -void -monotime_coarse_zero(monotime_coarse_t *out) -{ - memset(out, 0, sizeof(*out)); -} -#endif - -int64_t -monotime_diff_usec(const monotime_t *start, - const monotime_t *end) -{ - const int64_t nsec = monotime_diff_nsec(start, end); - return CEIL_DIV(nsec, 1000); -} - -int64_t -monotime_diff_msec(const monotime_t *start, - const monotime_t *end) -{ - const int64_t nsec = monotime_diff_nsec(start, end); - return CEIL_DIV(nsec, ONE_MILLION); -} - -uint64_t -monotime_absolute_nsec(void) -{ - monotime_t now; - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - - monotime_get(&now); - return monotime_diff_nsec(&initialized_at, &now); -} - -uint64_t -monotime_absolute_usec(void) -{ - return monotime_absolute_nsec() / 1000; -} - -uint64_t -monotime_absolute_msec(void) -{ - return monotime_absolute_nsec() / ONE_MILLION; -} - -#ifdef MONOTIME_COARSE_FN_IS_DIFFERENT -uint64_t -monotime_coarse_absolute_nsec(void) -{ - if (BUG(monotime_initialized == 0)) { - monotime_init(); - } - - monotime_coarse_t now; - monotime_coarse_get(&now); - return monotime_coarse_diff_nsec(&initialized_at_coarse, &now); -} - -uint64_t -monotime_coarse_absolute_usec(void) -{ - return monotime_coarse_absolute_nsec() / 1000; -} - -uint64_t -monotime_coarse_absolute_msec(void) -{ - return monotime_coarse_absolute_nsec() / ONE_MILLION; -} -#else -#define initalized_at_coarse initialized_at -#endif /* defined(MONOTIME_COARSE_FN_IS_DIFFERENT) */ - -/** - * Return the current time "stamp" as described by monotime_coarse_to_stamp. - */ -uint32_t -monotime_coarse_get_stamp(void) -{ - monotime_coarse_t now; - monotime_coarse_get(&now); - return monotime_coarse_to_stamp(&now); -} - -#ifdef __APPLE__ -uint64_t -monotime_coarse_stamp_units_to_approx_msec(uint64_t units) -{ - /* Recover as much precision as we can. */ - uint64_t abstime_diff = (units << monotime_shift); - return (abstime_diff * mach_time_info.numer) / - (mach_time_info.denom * ONE_MILLION); -} -#else -uint64_t -monotime_coarse_stamp_units_to_approx_msec(uint64_t units) -{ - return (units * 1000) / STAMP_TICKS_PER_SECOND; -} -#endif - diff --git a/src/tor/src/common/compat_time.h b/src/tor/src/common/compat_time.h deleted file mode 100644 index 6ddd11883..000000000 --- a/src/tor/src/common/compat_time.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_time.h - * - * \brief Functions and types for monotonic times. - * - * monotime_* functions try to provide a high-resolution monotonic timer with - * something the best resolution the system provides. monotime_coarse_* - * functions run faster (if the operating system gives us a way to do that) - * but produce a less accurate timer: accuracy will probably be on the order - * of tens of milliseconds. - */ - -#ifndef TOR_COMPAT_TIME_H -#define TOR_COMPAT_TIME_H - -#include "orconfig.h" -#ifdef _WIN32 -#undef HAVE_CLOCK_GETTIME -#endif - -#if defined(HAVE_CLOCK_GETTIME) -/* to ensure definition of CLOCK_MONOTONIC_COARSE if it's there */ -#include -#endif - -#if !defined(HAVE_STRUCT_TIMEVAL_TV_SEC) -/** Implementation of timeval for platforms that don't have it. */ -struct timeval { - time_t tv_sec; - unsigned int tv_usec; -}; -#endif /* !defined(HAVE_STRUCT_TIMEVAL_TV_SEC) */ - -/** Represents a monotonic timer in a platform-dependent way. */ -typedef struct monotime_t { -#ifdef __APPLE__ - /* On apple, there is a 64-bit counter whose precision we must look up. */ - uint64_t abstime_; -#elif defined(HAVE_CLOCK_GETTIME) - /* It sure would be nice to use clock_gettime(). Posix is a nice thing. */ - struct timespec ts_; -#elif defined (_WIN32) - /* On Windows, there is a 64-bit counter whose precision we must look up. */ - int64_t pcount_; -#else -#define MONOTIME_USING_GETTIMEOFDAY - /* Otherwise, we will be stuck using gettimeofday. */ - struct timeval tv_; -#endif /* defined(__APPLE__) || ... */ -} monotime_t; - -#if defined(CLOCK_MONOTONIC_COARSE) && \ - defined(HAVE_CLOCK_GETTIME) -#define MONOTIME_COARSE_FN_IS_DIFFERENT -#define monotime_coarse_t monotime_t -#elif defined(_WIN32) -#define MONOTIME_COARSE_FN_IS_DIFFERENT -#define MONOTIME_COARSE_TYPE_IS_DIFFERENT -/** Represents a coarse monotonic time in a platform-independent way. */ -typedef struct monotime_coarse_t { - uint64_t tick_count_; -} monotime_coarse_t; -#elif defined(__APPLE__) && defined(HAVE_MACH_APPROXIMATE_TIME) -#define MONOTIME_COARSE_FN_IS_DIFFERENT -#define monotime_coarse_t monotime_t -#else -#define monotime_coarse_t monotime_t -#endif /* defined(CLOCK_MONOTONIC_COARSE) && ... || ... */ - -/** - * Initialize the timing subsystem. This function is idempotent. - */ -void monotime_init(void); -/** - * Set out to the current time. - */ -void monotime_get(monotime_t *out); -/** - * Return the number of nanoseconds between start and end. - */ -int64_t monotime_diff_nsec(const monotime_t *start, const monotime_t *end); -/** - * Return the number of microseconds between start and end. - */ -int64_t monotime_diff_usec(const monotime_t *start, const monotime_t *end); -/** - * Return the number of milliseconds between start and end. - */ -int64_t monotime_diff_msec(const monotime_t *start, const monotime_t *end); -/** - * Return the number of nanoseconds since the timer system was initialized. - */ -uint64_t monotime_absolute_nsec(void); -/** - * Return the number of microseconds since the timer system was initialized. - */ -uint64_t monotime_absolute_usec(void); -/** - * Return the number of milliseconds since the timer system was initialized. - */ -uint64_t monotime_absolute_msec(void); - -/** - * Set out to zero. - */ -void monotime_zero(monotime_t *out); -/** - * Return true iff out is zero - */ -int monotime_is_zero(const monotime_t *out); - -/** - * Set out to N milliseconds after val. - */ -/* XXXX We should add a more generic function here if we ever need to */ -void monotime_add_msec(monotime_t *out, const monotime_t *val, uint32_t msec); - -#if defined(MONOTIME_COARSE_FN_IS_DIFFERENT) -/** - * Set out to the current coarse time. - */ -void monotime_coarse_get(monotime_coarse_t *out); -uint64_t monotime_coarse_absolute_nsec(void); -uint64_t monotime_coarse_absolute_usec(void); -uint64_t monotime_coarse_absolute_msec(void); -#else /* !(defined(MONOTIME_COARSE_FN_IS_DIFFERENT)) */ -#define monotime_coarse_get monotime_get -#define monotime_coarse_absolute_nsec monotime_absolute_nsec -#define monotime_coarse_absolute_usec monotime_absolute_usec -#define monotime_coarse_absolute_msec monotime_absolute_msec -#endif /* defined(MONOTIME_COARSE_FN_IS_DIFFERENT) */ - -/** - * Return a "timestamp" approximation for a coarse monotonic timer. - * This timestamp is meant to be fast to calculate and easy to - * compare, and have a unit of something roughly around 1 msec. - * - * It will wrap over from time to time. - * - * It has no defined zero point. - */ -uint32_t monotime_coarse_to_stamp(const monotime_coarse_t *t); -/** - * Convert a difference, expressed in the units of monotime_coarse_to_stamp, - * into an approximate number of milliseconds. - */ -uint64_t monotime_coarse_stamp_units_to_approx_msec(uint64_t units); -uint32_t monotime_coarse_get_stamp(void); - -#if defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT) -int64_t monotime_coarse_diff_nsec(const monotime_coarse_t *start, - const monotime_coarse_t *end); -int64_t monotime_coarse_diff_usec(const monotime_coarse_t *start, - const monotime_coarse_t *end); -int64_t monotime_coarse_diff_msec(const monotime_coarse_t *start, - const monotime_coarse_t *end); -void monotime_coarse_zero(monotime_coarse_t *out); -int monotime_coarse_is_zero(const monotime_coarse_t *val); -void monotime_coarse_add_msec(monotime_coarse_t *out, - const monotime_coarse_t *val, uint32_t msec); -#else /* !(defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT)) */ -#define monotime_coarse_diff_nsec monotime_diff_nsec -#define monotime_coarse_diff_usec monotime_diff_usec -#define monotime_coarse_diff_msec monotime_diff_msec -#define monotime_coarse_zero monotime_zero -#define monotime_coarse_is_zero monotime_is_zero -#define monotime_coarse_add_msec monotime_add_msec -#endif /* defined(MONOTIME_COARSE_TYPE_IS_DIFFERENT) */ - -void tor_gettimeofday(struct timeval *timeval); - -#ifdef TOR_UNIT_TESTS -void tor_sleep_msec(int msec); - -void monotime_enable_test_mocking(void); -void monotime_disable_test_mocking(void); -void monotime_set_mock_time_nsec(int64_t); -#if defined(MONOTIME_COARSE_FN_IS_DIFFERENT) -void monotime_coarse_set_mock_time_nsec(int64_t); -#else -#define monotime_coarse_set_mock_time_nsec monotime_set_mock_time_nsec -#endif -#endif /* defined(TOR_UNIT_TESTS) */ - -#ifdef COMPAT_TIME_PRIVATE -#if defined(_WIN32) || defined(TOR_UNIT_TESTS) -STATIC int64_t ratchet_performance_counter(int64_t count_raw); -STATIC int64_t ratchet_coarse_performance_counter(int64_t count_raw); -#endif -#if defined(MONOTIME_USING_GETTIMEOFDAY) || defined(TOR_UNIT_TESTS) -STATIC void ratchet_timeval(const struct timeval *timeval_raw, - struct timeval *out); -#endif -#ifdef TOR_UNIT_TESTS -void monotime_reset_ratchets_for_testing(void); -#endif -#endif /* defined(COMPAT_TIME_PRIVATE) */ - -#endif /* !defined(TOR_COMPAT_TIME_H) */ - diff --git a/src/tor/src/common/compat_winthreads.c b/src/tor/src/common/compat_winthreads.c deleted file mode 100644 index 5f7ec94c2..000000000 --- a/src/tor/src/common/compat_winthreads.c +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_winthreads.c - * - * \brief Implementation for the windows-based multithreading backend - * functions. - */ - -#ifdef _WIN32 - -#include "compat.h" -#include -#include -#include "util.h" -#include "container.h" -#include "torlog.h" -#include - -/* This value is more or less total cargo-cult */ -#define SPIN_COUNT 2000 - -/** Minimalist interface to run a void function in the background. On - * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. - * func should not return, but rather should call spawn_exit. - * - * NOTE: if data is used, it should not be allocated on the stack, - * since in a multithreaded environment, there is no way to be sure that - * the caller's stack will still be around when the called function is - * running. - */ -int -spawn_func(void (*func)(void *), void *data) -{ - int rv; - rv = (int)_beginthread(func, 0, data); - if (rv == (int)-1) - return -1; - return 0; -} - -/** End the current thread/process. - */ -void -spawn_exit(void) -{ - _endthread(); - // LCOV_EXCL_START - //we should never get here. my compiler thinks that _endthread returns, this - //is an attempt to fool it. - tor_assert(0); - _exit(0); // exit ok: unreachable. - // LCOV_EXCL_STOP -} - -void -tor_mutex_init(tor_mutex_t *m) -{ - InitializeCriticalSection(&m->mutex); -} -void -tor_mutex_init_nonrecursive(tor_mutex_t *m) -{ - InitializeCriticalSection(&m->mutex); -} - -void -tor_mutex_uninit(tor_mutex_t *m) -{ - DeleteCriticalSection(&m->mutex); -} -void -tor_mutex_acquire(tor_mutex_t *m) -{ - tor_assert(m); - EnterCriticalSection(&m->mutex); -} -void -tor_mutex_release(tor_mutex_t *m) -{ - LeaveCriticalSection(&m->mutex); -} -unsigned long -tor_get_thread_id(void) -{ - return (unsigned long)GetCurrentThreadId(); -} - -int -tor_cond_init(tor_cond_t *cond) -{ - memset(cond, 0, sizeof(tor_cond_t)); - if (InitializeCriticalSectionAndSpinCount(&cond->lock, SPIN_COUNT)==0) { - return -1; - } - if ((cond->event = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) { - DeleteCriticalSection(&cond->lock); - return -1; - } - cond->n_waiting = cond->n_to_wake = cond->generation = 0; - return 0; -} -void -tor_cond_uninit(tor_cond_t *cond) -{ - DeleteCriticalSection(&cond->lock); - CloseHandle(cond->event); -} - -static void -tor_cond_signal_impl(tor_cond_t *cond, int broadcast) -{ - EnterCriticalSection(&cond->lock); - if (broadcast) - cond->n_to_wake = cond->n_waiting; - else - ++cond->n_to_wake; - cond->generation++; - SetEvent(cond->event); - LeaveCriticalSection(&cond->lock); -} -void -tor_cond_signal_one(tor_cond_t *cond) -{ - tor_cond_signal_impl(cond, 0); -} -void -tor_cond_signal_all(tor_cond_t *cond) -{ - tor_cond_signal_impl(cond, 1); -} - -int -tor_threadlocal_init(tor_threadlocal_t *threadlocal) -{ - threadlocal->index = TlsAlloc(); - return (threadlocal->index == TLS_OUT_OF_INDEXES) ? -1 : 0; -} - -void -tor_threadlocal_destroy(tor_threadlocal_t *threadlocal) -{ - TlsFree(threadlocal->index); - memset(threadlocal, 0, sizeof(tor_threadlocal_t)); -} - -void * -tor_threadlocal_get(tor_threadlocal_t *threadlocal) -{ - void *value = TlsGetValue(threadlocal->index); - if (value == NULL) { - DWORD err = GetLastError(); - if (err != ERROR_SUCCESS) { - char *msg = format_win32_error(err); - log_err(LD_GENERAL, "Error retrieving thread-local value: %s", msg); - tor_free(msg); - tor_assert(err == ERROR_SUCCESS); - } - } - return value; -} - -void -tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value) -{ - BOOL ok = TlsSetValue(threadlocal->index, value); - if (!ok) { - DWORD err = GetLastError(); - char *msg = format_win32_error(err); - log_err(LD_GENERAL, "Error adjusting thread-local value: %s", msg); - tor_free(msg); - tor_assert(ok); - } -} - -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *lock_, const struct timeval *tv) -{ - CRITICAL_SECTION *lock = &lock_->mutex; - int generation_at_start; - int waiting = 1; - int result = -1; - DWORD ms = INFINITE, ms_orig = INFINITE, startTime, endTime; - if (tv) - ms_orig = ms = tv->tv_sec*1000 + (tv->tv_usec+999)/1000; - - EnterCriticalSection(&cond->lock); - ++cond->n_waiting; - generation_at_start = cond->generation; - LeaveCriticalSection(&cond->lock); - - LeaveCriticalSection(lock); - - startTime = GetTickCount(); - do { - DWORD res; - res = WaitForSingleObject(cond->event, ms); - EnterCriticalSection(&cond->lock); - if (cond->n_to_wake && - cond->generation != generation_at_start) { - --cond->n_to_wake; - --cond->n_waiting; - result = 0; - waiting = 0; - goto out; - } else if (res != WAIT_OBJECT_0) { - result = (res==WAIT_TIMEOUT) ? 1 : -1; - --cond->n_waiting; - waiting = 0; - goto out; - } else if (ms != INFINITE) { - endTime = GetTickCount(); - if (startTime + ms_orig <= endTime) { - result = 1; /* Timeout */ - --cond->n_waiting; - waiting = 0; - goto out; - } else { - ms = startTime + ms_orig - endTime; - } - } - /* If we make it here, we are still waiting. */ - if (cond->n_to_wake == 0) { - /* There is nobody else who should wake up; reset - * the event. */ - ResetEvent(cond->event); - } - out: - LeaveCriticalSection(&cond->lock); - } while (waiting); - - EnterCriticalSection(lock); - - EnterCriticalSection(&cond->lock); - if (!cond->n_waiting) - ResetEvent(cond->event); - LeaveCriticalSection(&cond->lock); - - return result; -} - -void -tor_threads_init(void) -{ - set_main_thread(); -} - -#endif /* defined(_WIN32) */ - diff --git a/src/tor/src/common/compress.c b/src/tor/src/common/compress.c deleted file mode 100644 index 47c93cf6a..000000000 --- a/src/tor/src/common/compress.c +++ /dev/null @@ -1,665 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress.c - * \brief Common compression API. - **/ - -#include "orconfig.h" - -#include -#include -#include -#include -#include "torint.h" - -#ifdef HAVE_NETINET_IN_H -#include -#endif - -#include "util.h" -#include "torlog.h" -#include "compress.h" -#include "compress_lzma.h" -#include "compress_none.h" -#include "compress_zlib.h" -#include "compress_zstd.h" - -/** Total number of bytes allocated for compression state overhead. */ -static atomic_counter_t total_compress_allocation; - -/** @{ */ -/* These macros define the maximum allowable compression factor. Anything of - * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to - * have an uncompression factor (uncompressed size:compressed size ratio) of - * any greater than MAX_UNCOMPRESSION_FACTOR. - * - * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to - * be small to limit the attack multiplier, but we also want it to be large - * enough so that no legitimate document --even ones we might invent in the - * future -- ever compresses by a factor of greater than - * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably - * large range of possible values. IMO, anything over 8 is probably safe; IMO - * anything under 50 is probably sufficient. - */ -#define MAX_UNCOMPRESSION_FACTOR 25 -#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) -/** @} */ - -/** Return true if uncompressing an input of size in_size to an input of - * size at least size_out looks like a compression bomb. */ -MOCK_IMPL(int, -tor_compress_is_compression_bomb,(size_t size_in, size_t size_out)) -{ - if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) - return 0; - - return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); -} - -/** Guess the size that in_len will be after compression or - * decompression. */ -static size_t -guess_compress_size(int compress, compress_method_t method, - compression_level_t compression_level, - size_t in_len) -{ - // ignore these for now. - (void)compression_level; - if (method == NO_METHOD) { - /* Guess that we'll need an extra byte, to avoid a needless realloc - * for nul-termination */ - return (in_len < SIZE_MAX) ? in_len + 1 : in_len; - } - - /* Always guess a factor of 2. */ - if (compress) { - in_len /= 2; - } else { - if (in_len < SIZE_T_CEILING/2) - in_len *= 2; - } - return MAX(in_len, 1024); -} - -/** Internal function to implement tor_compress/tor_uncompress, depending on - * whether compress is set. All arguments are as for tor_compress or - * tor_uncompress. */ -static int -tor_compress_impl(int compress, - char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - compression_level_t compression_level, - int complete_only, - int protocol_warn_level) -{ - tor_compress_state_t *stream; - int rv; - - stream = tor_compress_new(compress, method, compression_level); - - if (stream == NULL) { - log_warn(LD_GENERAL, "NULL stream while %scompressing", - compress?"":"de"); - log_debug(LD_GENERAL, "method: %d level: %d at len: %lu", - method, compression_level, (unsigned long)in_len); - return -1; - } - - size_t in_len_orig = in_len; - size_t out_remaining, out_alloc; - char *outptr; - - out_remaining = out_alloc = - guess_compress_size(compress, method, compression_level, in_len); - *out = outptr = tor_malloc(out_remaining); - - const int finish = complete_only || compress; - - while (1) { - switch (tor_compress_process(stream, - &outptr, &out_remaining, - &in, &in_len, finish)) { - case TOR_COMPRESS_DONE: - if (in_len == 0 || compress) { - goto done; - } else { - // More data is present, and we're decompressing. So we may need to - // reinitialize the stream if we are handling multiple concatenated - // inputs. - tor_compress_free(stream); - stream = tor_compress_new(compress, method, compression_level); - if (stream == NULL) { - log_warn(LD_GENERAL, "NULL stream while %scompressing", - compress?"":"de"); - goto err; - } - } - break; - case TOR_COMPRESS_OK: - if (compress || complete_only) { - log_fn(protocol_warn_level, LD_PROTOCOL, - "Unexpected %s while %scompressing", - complete_only?"end of input":"result", - compress?"":"de"); - log_debug(LD_GENERAL, "method: %d level: %d at len: %lu", - method, compression_level, (unsigned long)in_len); - goto err; - } else { - if (in_len == 0) { - goto done; - } - } - break; - case TOR_COMPRESS_BUFFER_FULL: { - if (!compress && outptr < *out+out_alloc) { - // A buffer error in this case means that we have a problem - // with our input. - log_fn(protocol_warn_level, LD_PROTOCOL, - "Possible truncated or corrupt compressed data"); - goto err; - } - if (out_alloc >= SIZE_T_CEILING / 2) { - log_warn(LD_GENERAL, "While %scompressing data: ran out of space.", - compress?"":"un"); - goto err; - } - if (!compress && - tor_compress_is_compression_bomb(in_len_orig, out_alloc)) { - // This should already have been caught down in the backend logic. - // LCOV_EXCL_START - tor_assert_nonfatal_unreached(); - goto err; - // LCOV_EXCL_STOP - } - const size_t offset = outptr - *out; - out_alloc *= 2; - *out = tor_realloc(*out, out_alloc); - outptr = *out + offset; - out_remaining = out_alloc - offset; - break; - } - case TOR_COMPRESS_ERROR: - log_fn(protocol_warn_level, LD_GENERAL, - "Error while %scompressing data: bad input?", - compress?"":"un"); - goto err; // bad data. - - // LCOV_EXCL_START - default: - tor_assert_nonfatal_unreached(); - goto err; - // LCOV_EXCL_STOP - } - } - done: - *out_len = outptr - *out; - if (compress && tor_compress_is_compression_bomb(*out_len, in_len_orig)) { - log_warn(LD_BUG, "We compressed something and got an insanely high " - "compression factor; other Tors would think this was a " - "compression bomb."); - goto err; - } - if (!compress) { - // NUL-terminate our output. - if (out_alloc == *out_len) - *out = tor_realloc(*out, out_alloc + 1); - (*out)[*out_len] = '\0'; - } - rv = 0; - goto out; - - err: - tor_free(*out); - *out_len = 0; - rv = -1; - goto out; - - out: - tor_compress_free(stream); - return rv; -} - -/** Given in_len bytes at in, compress them into a newly - * allocated buffer, using the method described in method. Store the - * compressed string in *out, and its length in *out_len. - * Return 0 on success, -1 on failure. - */ -int -tor_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method) -{ - return tor_compress_impl(1, out, out_len, in, in_len, method, - BEST_COMPRESSION, - 1, LOG_WARN); -} - -/** Given zero or more compressed strings of total length in_len bytes - * at in, uncompress them into a newly allocated buffer, using the - * method described in method. Store the uncompressed string in - * *out, and its length in *out_len. Return 0 on success, -1 on - * failure. - * - * If any bytes are written to out, an extra byte NUL is always - * written at the end, but not counted in out_len. This is a - * safety feature to ensure that the output can be treated as a - * NUL-terminated string -- though of course, callers should check - * out_len anyway. - * - * If complete_only is true, we consider a truncated input as a - * failure; otherwise we decompress as much as we can. Warn about truncated - * or corrupt inputs at protocol_warn_level. - */ -int -tor_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level) -{ - return tor_compress_impl(0, out, out_len, in, in_len, method, - BEST_COMPRESSION, - complete_only, protocol_warn_level); -} - -/** Try to tell whether the in_len-byte string in in is likely - * to be compressed or not. If it is, return the likeliest compression method. - * Otherwise, return UNKNOWN_METHOD. - */ -compress_method_t -detect_compression_method(const char *in, size_t in_len) -{ - if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { - return GZIP_METHOD; - } else if (in_len > 2 && (in[0] & 0x0f) == 8 && - (ntohs(get_uint16(in)) % 31) == 0) { - return ZLIB_METHOD; - } else if (in_len > 2 && - fast_memeq(in, "\x5d\x00\x00", 3)) { - return LZMA_METHOD; - } else if (in_len > 3 && - fast_memeq(in, "\x28\xb5\x2f\xfd", 4)) { - return ZSTD_METHOD; - } else { - return UNKNOWN_METHOD; - } -} - -/** Return 1 if a given method is supported; otherwise 0. */ -int -tor_compress_supports_method(compress_method_t method) -{ - switch (method) { - case GZIP_METHOD: - case ZLIB_METHOD: - return tor_zlib_method_supported(); - case LZMA_METHOD: - return tor_lzma_method_supported(); - case ZSTD_METHOD: - return tor_zstd_method_supported(); - case NO_METHOD: - return 1; - case UNKNOWN_METHOD: - default: - return 0; - } -} - -/** - * Return a bitmask of the supported compression types, where 1<<m is - * set in the bitmask if and only if compression with method m is - * supported. - */ -unsigned -tor_compress_get_supported_method_bitmask(void) -{ - static unsigned supported = 0; - if (supported == 0) { - compress_method_t m; - for (m = NO_METHOD; m <= UNKNOWN_METHOD; ++m) { - if (tor_compress_supports_method(m)) { - supported |= (1u << m); - } - } - } - return supported; -} - -/** Table of compression method names. These should have an "x-" prefix, - * if they are not listed in the IANA content coding registry. */ -static const struct { - const char *name; - compress_method_t method; -} compression_method_names[] = { - { "gzip", GZIP_METHOD }, - { "deflate", ZLIB_METHOD }, - // We call this "x-tor-lzma" rather than "x-lzma", because we impose a - // lower maximum memory usage on the decoding side. - { "x-tor-lzma", LZMA_METHOD }, - { "x-zstd" , ZSTD_METHOD }, - { "identity", NO_METHOD }, - - /* Later entries in this table are not canonical; these are recognized but - * not emitted. */ - { "x-gzip", GZIP_METHOD }, -}; - -/** Return the canonical string representation of the compression method - * method, or NULL if the method isn't recognized. */ -const char * -compression_method_get_name(compress_method_t method) -{ - unsigned i; - for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { - if (method == compression_method_names[i].method) - return compression_method_names[i].name; - } - return NULL; -} - -/** Table of compression human readable method names. */ -static const struct { - compress_method_t method; - const char *name; -} compression_method_human_names[] = { - { NO_METHOD, "uncompressed" }, - { GZIP_METHOD, "gzipped" }, - { ZLIB_METHOD, "deflated" }, - { LZMA_METHOD, "LZMA compressed" }, - { ZSTD_METHOD, "Zstandard compressed" }, - { UNKNOWN_METHOD, "unknown encoding" }, -}; - -/** Return a human readable string representation of the compression method - * method, or NULL if the method isn't recognized. */ -const char * -compression_method_get_human_name(compress_method_t method) -{ - unsigned i; - for (i = 0; i < ARRAY_LENGTH(compression_method_human_names); ++i) { - if (method == compression_method_human_names[i].method) - return compression_method_human_names[i].name; - } - return NULL; -} - -/** Return the compression method represented by the string name, or - * UNKNOWN_METHOD if the string isn't recognized. */ -compress_method_t -compression_method_get_by_name(const char *name) -{ - unsigned i; - for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { - if (!strcmp(compression_method_names[i].name, name)) - return compression_method_names[i].method; - } - return UNKNOWN_METHOD; -} - -/** Return a string representation of the version of the library providing the - * compression method given in method. Returns NULL if method is - * unknown or unsupported. */ -const char * -tor_compress_version_str(compress_method_t method) -{ - switch (method) { - case GZIP_METHOD: - case ZLIB_METHOD: - return tor_zlib_get_version_str(); - case LZMA_METHOD: - return tor_lzma_get_version_str(); - case ZSTD_METHOD: - return tor_zstd_get_version_str(); - case NO_METHOD: - case UNKNOWN_METHOD: - default: - return NULL; - } -} - -/** Return a string representation of the version of the library, found at - * compile time, providing the compression method given in method. - * Returns NULL if method is unknown or unsupported. */ -const char * -tor_compress_header_version_str(compress_method_t method) -{ - switch (method) { - case GZIP_METHOD: - case ZLIB_METHOD: - return tor_zlib_get_header_version_str(); - case LZMA_METHOD: - return tor_lzma_get_header_version_str(); - case ZSTD_METHOD: - return tor_zstd_get_header_version_str(); - case NO_METHOD: - case UNKNOWN_METHOD: - default: - return NULL; - } -} - -/** Return the approximate number of bytes allocated for all - * supported compression schemas. */ -size_t -tor_compress_get_total_allocation(void) -{ - return atomic_counter_get(&total_compress_allocation) + - tor_zlib_get_total_allocation() + - tor_lzma_get_total_allocation() + - tor_zstd_get_total_allocation(); -} - -/** Internal state for an incremental compression/decompression. The body of - * this struct is not exposed. */ -struct tor_compress_state_t { - compress_method_t method; /**< The compression method. */ - - union { - tor_zlib_compress_state_t *zlib_state; - tor_lzma_compress_state_t *lzma_state; - tor_zstd_compress_state_t *zstd_state; - } u; /**< Compression backend state. */ -}; - -/** Construct and return a tor_compress_state_t object using method. If - * compress, it's for compression; otherwise it's for decompression. */ -tor_compress_state_t * -tor_compress_new(int compress, compress_method_t method, - compression_level_t compression_level) -{ - tor_compress_state_t *state; - - state = tor_malloc_zero(sizeof(tor_compress_state_t)); - state->method = method; - - switch (method) { - case GZIP_METHOD: - case ZLIB_METHOD: { - tor_zlib_compress_state_t *zlib_state = - tor_zlib_compress_new(compress, method, compression_level); - - if (zlib_state == NULL) - goto err; - - state->u.zlib_state = zlib_state; - break; - } - case LZMA_METHOD: { - tor_lzma_compress_state_t *lzma_state = - tor_lzma_compress_new(compress, method, compression_level); - - if (lzma_state == NULL) - goto err; - - state->u.lzma_state = lzma_state; - break; - } - case ZSTD_METHOD: { - tor_zstd_compress_state_t *zstd_state = - tor_zstd_compress_new(compress, method, compression_level); - - if (zstd_state == NULL) - goto err; - - state->u.zstd_state = zstd_state; - break; - } - case NO_METHOD: { - break; - } - case UNKNOWN_METHOD: - goto err; - } - - atomic_counter_add(&total_compress_allocation, - sizeof(tor_compress_state_t)); - return state; - - err: - tor_free(state); - return NULL; -} - -/** Compress/decompress some bytes using state. Read up to - * *in_len bytes from *in, and write up to *out_len bytes - * to *out, adjusting the values as we go. If finish is true, - * we've reached the end of the input. - * - * Return TOR_COMPRESS_DONE if we've finished the entire - * compression/decompression. - * Return TOR_COMPRESS_OK if we're processed everything from the input. - * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on out. - * Return TOR_COMPRESS_ERROR if the stream is corrupt. - */ -tor_compress_output_t -tor_compress_process(tor_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ - tor_assert(state != NULL); - const size_t in_len_orig = *in_len; - const size_t out_len_orig = *out_len; - tor_compress_output_t rv; - - if (*out_len == 0 && (*in_len > 0 || finish)) { - // If we still have input data, but no space for output data, we might as - // well return early and let the caller do the reallocation of the out - // variable. - return TOR_COMPRESS_BUFFER_FULL; - } - - switch (state->method) { - case GZIP_METHOD: - case ZLIB_METHOD: - rv = tor_zlib_compress_process(state->u.zlib_state, - out, out_len, in, in_len, - finish); - break; - case LZMA_METHOD: - rv = tor_lzma_compress_process(state->u.lzma_state, - out, out_len, in, in_len, - finish); - break; - case ZSTD_METHOD: - rv = tor_zstd_compress_process(state->u.zstd_state, - out, out_len, in, in_len, - finish); - break; - case NO_METHOD: - rv = tor_cnone_compress_process(out, out_len, in, in_len, - finish); - break; - default: - case UNKNOWN_METHOD: - goto err; - } - if (BUG((rv == TOR_COMPRESS_OK) && - *in_len == in_len_orig && - *out_len == out_len_orig)) { - log_warn(LD_GENERAL, - "More info on the bug: method == %s, finish == %d, " - " *in_len == in_len_orig == %lu, " - "*out_len == out_len_orig == %lu", - compression_method_get_human_name(state->method), finish, - (unsigned long)in_len_orig, (unsigned long)out_len_orig); - return TOR_COMPRESS_ERROR; - } - - return rv; - err: - return TOR_COMPRESS_ERROR; -} - -/** Deallocate state. */ -void -tor_compress_free_(tor_compress_state_t *state) -{ - if (state == NULL) - return; - - switch (state->method) { - case GZIP_METHOD: - case ZLIB_METHOD: - tor_zlib_compress_free(state->u.zlib_state); - break; - case LZMA_METHOD: - tor_lzma_compress_free(state->u.lzma_state); - break; - case ZSTD_METHOD: - tor_zstd_compress_free(state->u.zstd_state); - break; - case NO_METHOD: - break; - case UNKNOWN_METHOD: - break; - } - - atomic_counter_sub(&total_compress_allocation, - sizeof(tor_compress_state_t)); - tor_free(state); -} - -/** Return the approximate number of bytes allocated for state. */ -size_t -tor_compress_state_size(const tor_compress_state_t *state) -{ - tor_assert(state != NULL); - - size_t size = sizeof(tor_compress_state_t); - - switch (state->method) { - case GZIP_METHOD: - case ZLIB_METHOD: - size += tor_zlib_compress_state_size(state->u.zlib_state); - break; - case LZMA_METHOD: - size += tor_lzma_compress_state_size(state->u.lzma_state); - break; - case ZSTD_METHOD: - size += tor_zstd_compress_state_size(state->u.zstd_state); - break; - case NO_METHOD: - case UNKNOWN_METHOD: - break; - } - - return size; -} - -/** Initialize all compression modules. */ -void -tor_compress_init(void) -{ - atomic_counter_init(&total_compress_allocation); - - tor_zlib_init(); - tor_lzma_init(); - tor_zstd_init(); -} - diff --git a/src/tor/src/common/compress.h b/src/tor/src/common/compress.h deleted file mode 100644 index 952102bf9..000000000 --- a/src/tor/src/common/compress.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress.h - * \brief Headers for compress.c - **/ - -#ifndef TOR_COMPRESS_H -#define TOR_COMPRESS_H - -/** Enumeration of what kind of compression to use. Only ZLIB_METHOD and - * GZIP_METHOD is guaranteed to be supported by the compress/uncompress - * functions here. Call tor_compress_supports_method() to check if a given - * compression schema is supported by Tor. */ -typedef enum { - NO_METHOD=0, // This method must be first. - GZIP_METHOD=1, - ZLIB_METHOD=2, - LZMA_METHOD=3, - ZSTD_METHOD=4, - UNKNOWN_METHOD=5, // This method must be last. Add new ones in the middle. -} compress_method_t; - -/** - * Enumeration to define tradeoffs between memory usage and compression level. - * BEST_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most - * memory. - **/ -typedef enum { - BEST_COMPRESSION, HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION -} compression_level_t; - -int tor_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method); - -int tor_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level); - -compress_method_t detect_compression_method(const char *in, size_t in_len); - -MOCK_DECL(int,tor_compress_is_compression_bomb,(size_t size_in, - size_t size_out)); - -int tor_compress_supports_method(compress_method_t method); -unsigned tor_compress_get_supported_method_bitmask(void); -const char *compression_method_get_name(compress_method_t method); -const char *compression_method_get_human_name(compress_method_t method); -compress_method_t compression_method_get_by_name(const char *name); - -const char *tor_compress_version_str(compress_method_t method); - -const char *tor_compress_header_version_str(compress_method_t method); - -size_t tor_compress_get_total_allocation(void); - -/** Return values from tor_compress_process; see that function's documentation - * for details. */ -typedef enum { - TOR_COMPRESS_OK, - TOR_COMPRESS_DONE, - TOR_COMPRESS_BUFFER_FULL, - TOR_COMPRESS_ERROR -} tor_compress_output_t; - -/** Internal state for an incremental compression/decompression. */ -typedef struct tor_compress_state_t tor_compress_state_t; - -tor_compress_state_t *tor_compress_new(int compress, - compress_method_t method, - compression_level_t level); - -tor_compress_output_t tor_compress_process(tor_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); -void tor_compress_free_(tor_compress_state_t *state); -#define tor_compress_free(st) \ - FREE_AND_NULL(tor_compress_state_t, tor_compress_free_, (st)) - -size_t tor_compress_state_size(const tor_compress_state_t *state); - -void tor_compress_init(void); - -#endif /* !defined(TOR_COMPRESS_H) */ - diff --git a/src/tor/src/common/compress_lzma.c b/src/tor/src/common/compress_lzma.c deleted file mode 100644 index 051c59ba2..000000000 --- a/src/tor/src/common/compress_lzma.c +++ /dev/null @@ -1,361 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_lzma.c - * \brief Compression backend for LZMA. - * - * This module should never be invoked directly. Use the compress module - * instead. - **/ - -#include "orconfig.h" - -#include "util.h" -#include "torlog.h" -#include "compress.h" -#include "compress_lzma.h" - -#ifdef HAVE_LZMA -#include -#endif - -/** The maximum amount of memory we allow the LZMA decoder to use, in bytes. */ -#define MEMORY_LIMIT (16 * 1024 * 1024) - -/** Total number of bytes allocated for LZMA state. */ -static atomic_counter_t total_lzma_allocation; - -#ifdef HAVE_LZMA -/** Given level return the memory level. */ -static int -memory_level(compression_level_t level) -{ - switch (level) { - default: - case BEST_COMPRESSION: - case HIGH_COMPRESSION: return 6; - case MEDIUM_COMPRESSION: return 4; - case LOW_COMPRESSION: return 2; - } -} - -/** Convert a given error to a human readable error string. */ -static const char * -lzma_error_str(lzma_ret error) -{ - switch (error) { - case LZMA_OK: - return "Operation completed successfully"; - case LZMA_STREAM_END: - return "End of stream"; - case LZMA_NO_CHECK: - return "Input stream lacks integrity check"; - case LZMA_UNSUPPORTED_CHECK: - return "Unable to calculate integrity check"; - case LZMA_GET_CHECK: - return "Integrity check available"; - case LZMA_MEM_ERROR: - return "Unable to allocate memory"; - case LZMA_MEMLIMIT_ERROR: - return "Memory limit reached"; - case LZMA_FORMAT_ERROR: - return "Unknown file format"; - case LZMA_OPTIONS_ERROR: - return "Unsupported options"; - case LZMA_DATA_ERROR: - return "Corrupt input data"; - case LZMA_BUF_ERROR: - return "Unable to progress"; - case LZMA_PROG_ERROR: - return "Programming error"; - default: - return "Unknown LZMA error"; - } -} -#endif /* defined(HAVE_LZMA) */ - -/** Return 1 if LZMA compression is supported; otherwise 0. */ -int -tor_lzma_method_supported(void) -{ -#ifdef HAVE_LZMA - return 1; -#else - return 0; -#endif -} - -/** Return a string representation of the version of the currently running - * version of liblzma. Returns NULL if LZMA is unsupported. */ -const char * -tor_lzma_get_version_str(void) -{ -#ifdef HAVE_LZMA - return lzma_version_string(); -#else - return NULL; -#endif -} - -/** Return a string representation of the version of liblzma used at - * compilation time. Returns NULL if LZMA is unsupported. */ -const char * -tor_lzma_get_header_version_str(void) -{ -#ifdef HAVE_LZMA - return LZMA_VERSION_STRING; -#else - return NULL; -#endif -} - -/** Internal LZMA state for incremental compression/decompression. - * The body of this struct is not exposed. */ -struct tor_lzma_compress_state_t { -#ifdef HAVE_LZMA - lzma_stream stream; /**< The LZMA stream. */ -#endif - - int compress; /**< True if we are compressing; false if we are inflating */ - - /** Number of bytes read so far. Used to detect compression bombs. */ - size_t input_so_far; - /** Number of bytes written so far. Used to detect compression bombs. */ - size_t output_so_far; - - /** Approximate number of bytes allocated for this object. */ - size_t allocation; -}; - -#ifdef HAVE_LZMA -/** Return an approximate number of bytes stored in memory to hold the LZMA - * encoder/decoder state. */ -static size_t -tor_lzma_state_size_precalc(int compress, compression_level_t level) -{ - uint64_t memory_usage; - - if (compress) - memory_usage = lzma_easy_encoder_memusage(memory_level(level)); - else - memory_usage = lzma_easy_decoder_memusage(memory_level(level)); - - if (memory_usage == UINT64_MAX) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Unsupported compression level passed to LZMA %s", - compress ? "encoder" : "decoder"); - goto err; - // LCOV_EXCL_STOP - } - - if (memory_usage + sizeof(tor_lzma_compress_state_t) > SIZE_MAX) - memory_usage = SIZE_MAX; - else - memory_usage += sizeof(tor_lzma_compress_state_t); - - return (size_t)memory_usage; - - // LCOV_EXCL_START - err: - return 0; - // LCOV_EXCL_STOP -} -#endif /* defined(HAVE_LZMA) */ - -/** Construct and return a tor_lzma_compress_state_t object using - * method. If compress, it's for compression; otherwise it's for - * decompression. */ -tor_lzma_compress_state_t * -tor_lzma_compress_new(int compress, - compress_method_t method, - compression_level_t level) -{ - tor_assert(method == LZMA_METHOD); - -#ifdef HAVE_LZMA - tor_lzma_compress_state_t *result; - lzma_ret retval; - lzma_options_lzma stream_options; - - // Note that we do not explicitly initialize the lzma_stream object here, - // since the LZMA_STREAM_INIT "just" initializes all members to 0, which is - // also what `tor_malloc_zero()` does. - result = tor_malloc_zero(sizeof(tor_lzma_compress_state_t)); - result->compress = compress; - result->allocation = tor_lzma_state_size_precalc(compress, level); - - if (compress) { - lzma_lzma_preset(&stream_options, memory_level(level)); - - retval = lzma_alone_encoder(&result->stream, &stream_options); - - if (retval != LZMA_OK) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Error from LZMA encoder: %s (%u).", - lzma_error_str(retval), retval); - goto err; - // LCOV_EXCL_STOP - } - } else { - retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT); - - if (retval != LZMA_OK) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).", - lzma_error_str(retval), retval); - goto err; - // LCOV_EXCL_STOP - } - } - - atomic_counter_add(&total_lzma_allocation, result->allocation); - return result; - - /* LCOV_EXCL_START */ - err: - tor_free(result); - return NULL; - /* LCOV_EXCL_STOP */ -#else /* !(defined(HAVE_LZMA)) */ - (void)compress; - (void)method; - (void)level; - - return NULL; -#endif /* defined(HAVE_LZMA) */ -} - -/** Compress/decompress some bytes using state. Read up to - * *in_len bytes from *in, and write up to *out_len bytes - * to *out, adjusting the values as we go. If finish is true, - * we've reached the end of the input. - * - * Return TOR_COMPRESS_DONE if we've finished the entire - * compression/decompression. - * Return TOR_COMPRESS_OK if we're processed everything from the input. - * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on out. - * Return TOR_COMPRESS_ERROR if the stream is corrupt. - */ -tor_compress_output_t -tor_lzma_compress_process(tor_lzma_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ -#ifdef HAVE_LZMA - lzma_ret retval; - lzma_action action; - - tor_assert(state != NULL); - tor_assert(*in_len <= UINT_MAX); - tor_assert(*out_len <= UINT_MAX); - - state->stream.next_in = (unsigned char *)*in; - state->stream.avail_in = *in_len; - state->stream.next_out = (unsigned char *)*out; - state->stream.avail_out = *out_len; - - action = finish ? LZMA_FINISH : LZMA_RUN; - - retval = lzma_code(&state->stream, action); - - state->input_so_far += state->stream.next_in - ((unsigned char *)*in); - state->output_so_far += state->stream.next_out - ((unsigned char *)*out); - - *out = (char *)state->stream.next_out; - *out_len = state->stream.avail_out; - *in = (const char *)state->stream.next_in; - *in_len = state->stream.avail_in; - - if (! state->compress && - tor_compress_is_compression_bomb(state->input_so_far, - state->output_so_far)) { - log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); - return TOR_COMPRESS_ERROR; - } - - switch (retval) { - case LZMA_OK: - if (state->stream.avail_out == 0 || finish) - return TOR_COMPRESS_BUFFER_FULL; - - return TOR_COMPRESS_OK; - - case LZMA_BUF_ERROR: - if (state->stream.avail_in == 0 && !finish) - return TOR_COMPRESS_OK; - - return TOR_COMPRESS_BUFFER_FULL; - - case LZMA_STREAM_END: - return TOR_COMPRESS_DONE; - - // We list all the possible values of `lzma_ret` here to silence the - // `switch-enum` warning and to detect if a new member was added. - case LZMA_NO_CHECK: - case LZMA_UNSUPPORTED_CHECK: - case LZMA_GET_CHECK: - case LZMA_MEM_ERROR: - case LZMA_MEMLIMIT_ERROR: - case LZMA_FORMAT_ERROR: - case LZMA_OPTIONS_ERROR: - case LZMA_DATA_ERROR: - case LZMA_PROG_ERROR: - default: - log_warn(LD_GENERAL, "LZMA %s didn't finish: %s.", - state->compress ? "compression" : "decompression", - lzma_error_str(retval)); - return TOR_COMPRESS_ERROR; - } -#else /* !(defined(HAVE_LZMA)) */ - (void)state; - (void)out; - (void)out_len; - (void)in; - (void)in_len; - (void)finish; - return TOR_COMPRESS_ERROR; -#endif /* defined(HAVE_LZMA) */ -} - -/** Deallocate state. */ -void -tor_lzma_compress_free_(tor_lzma_compress_state_t *state) -{ - if (state == NULL) - return; - - atomic_counter_sub(&total_lzma_allocation, state->allocation); - -#ifdef HAVE_LZMA - lzma_end(&state->stream); -#endif - - tor_free(state); -} - -/** Return the approximate number of bytes allocated for state. */ -size_t -tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state) -{ - tor_assert(state != NULL); - return state->allocation; -} - -/** Return the approximate number of bytes allocated for all LZMA states. */ -size_t -tor_lzma_get_total_allocation(void) -{ - return atomic_counter_get(&total_lzma_allocation); -} - -/** Initialize the lzma module */ -void -tor_lzma_init(void) -{ - atomic_counter_init(&total_lzma_allocation); -} - diff --git a/src/tor/src/common/compress_lzma.h b/src/tor/src/common/compress_lzma.h deleted file mode 100644 index 38a447c1f..000000000 --- a/src/tor/src/common/compress_lzma.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_lzma.h - * \brief Header for compress_lzma.c - **/ - -#ifndef TOR_COMPRESS_LZMA_H -#define TOR_COMPRESS_LZMA_H - -int tor_lzma_method_supported(void); - -const char *tor_lzma_get_version_str(void); - -const char *tor_lzma_get_header_version_str(void); - -/** Internal state for an incremental LZMA compression/decompression. */ -typedef struct tor_lzma_compress_state_t tor_lzma_compress_state_t; - -tor_lzma_compress_state_t * -tor_lzma_compress_new(int compress, - compress_method_t method, - compression_level_t compression_level); - -tor_compress_output_t -tor_lzma_compress_process(tor_lzma_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); - -void tor_lzma_compress_free_(tor_lzma_compress_state_t *state); -#define tor_lzma_compress_free(st) \ - FREE_AND_NULL(tor_lzma_compress_state_t, \ - tor_lzma_compress_free_, (st)) - -size_t tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state); - -size_t tor_lzma_get_total_allocation(void); - -void tor_lzma_init(void); - -#endif /* !defined(TOR_COMPRESS_LZMA_H) */ - diff --git a/src/tor/src/common/compress_none.c b/src/tor/src/common/compress_none.c deleted file mode 100644 index 34314e4af..000000000 --- a/src/tor/src/common/compress_none.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_none.c - * \brief Compression backend for identity compression. - * - * We actually define this backend so that we can treat the identity transform - * as another case of compression. - * - * This module should never be invoked directly. Use the compress module - * instead. - **/ - -#include "orconfig.h" - -#include "util.h" -#include "torlog.h" -#include "compress.h" -#include "compress_none.h" - -/** Transfer some bytes using the identity transformation. Read up to - * *in_len bytes from *in, and write up to *out_len bytes - * to *out, adjusting the values as we go. If finish is true, - * we've reached the end of the input. - * - * Return TOR_COMPRESS_DONE if we've finished the entire - * compression/decompression. - * Return TOR_COMPRESS_OK if we're processed everything from the input. - * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on out. - * Return TOR_COMPRESS_ERROR if the stream is corrupt. - */ -tor_compress_output_t -tor_cnone_compress_process(char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ - size_t n_to_copy = MIN(*in_len, *out_len); - - memcpy(*out, *in, n_to_copy); - *out += n_to_copy; - *in += n_to_copy; - *out_len -= n_to_copy; - *in_len -= n_to_copy; - if (*in_len == 0) { - return finish ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; - } else { - return TOR_COMPRESS_BUFFER_FULL; - } -} - diff --git a/src/tor/src/common/compress_none.h b/src/tor/src/common/compress_none.h deleted file mode 100644 index 77c3cef47..000000000 --- a/src/tor/src/common/compress_none.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_none.h - * \brief Header for compress_none.c - **/ - -#ifndef TOR_COMPRESS_NONE_H -#define TOR_COMPRESS_NONE_H - -tor_compress_output_t -tor_cnone_compress_process(char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); - -#endif /* !defined(TOR_COMPRESS_NONE_H) */ - diff --git a/src/tor/src/common/compress_zlib.c b/src/tor/src/common/compress_zlib.c deleted file mode 100644 index 23d71d27b..000000000 --- a/src/tor/src/common/compress_zlib.c +++ /dev/null @@ -1,304 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_zlib.c - * \brief Compression backend for gzip and zlib. - * - * This module should never be invoked directly. Use the compress module - * instead. - **/ - -#include "orconfig.h" - -#include "util.h" -#include "torlog.h" -#include "compress.h" -#include "compress_zlib.h" - -/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of - saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory - that nobody will care if the compile outputs a no-such-identifier warning. - - Sorry, but we like -Werror over here, so I guess we need to define these. - I hope that zlib 1.2.6 doesn't break these too. -*/ -#ifndef _LARGEFILE64_SOURCE -#define _LARGEFILE64_SOURCE 0 -#endif -#ifndef _LFS64_LARGEFILE -#define _LFS64_LARGEFILE 0 -#endif -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 0 -#endif -#ifndef off64_t -#define off64_t int64_t -#endif - -#include - -#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200 -#error "We require zlib version 1.2 or later." -#endif - -static size_t tor_zlib_state_size_precalc(int inflate, - int windowbits, int memlevel); - -/** Total number of bytes allocated for zlib state */ -static atomic_counter_t total_zlib_allocation; - -/** Given level return the memory level. */ -static int -memory_level(compression_level_t level) -{ - switch (level) { - default: - case BEST_COMPRESSION: return 9; - case HIGH_COMPRESSION: return 8; - case MEDIUM_COMPRESSION: return 7; - case LOW_COMPRESSION: return 6; - } -} - -/** Return the 'bits' value to tell zlib to use method.*/ -static inline int -method_bits(compress_method_t method, compression_level_t level) -{ - /* Bits+16 means "use gzip" in zlib >= 1.2 */ - const int flag = method == GZIP_METHOD ? 16 : 0; - switch (level) { - default: - case BEST_COMPRESSION: - case HIGH_COMPRESSION: return flag + 15; - case MEDIUM_COMPRESSION: return flag + 13; - case LOW_COMPRESSION: return flag + 11; - } -} - -/** Return 1 if zlib/gzip compression is supported; otherwise 0. */ -int -tor_zlib_method_supported(void) -{ - /* We currently always support zlib/gzip, but we keep this function around in - * case we some day decide to deprecate zlib/gzip support. - */ - return 1; -} - -/** Return a string representation of the version of the currently running - * version of zlib. */ -const char * -tor_zlib_get_version_str(void) -{ - return zlibVersion(); -} - -/** Return a string representation of the version of the version of zlib -* used at compilation. */ -const char * -tor_zlib_get_header_version_str(void) -{ - return ZLIB_VERSION; -} - -/** Internal zlib state for an incremental compression/decompression. - * The body of this struct is not exposed. */ -struct tor_zlib_compress_state_t { - struct z_stream_s stream; /**< The zlib stream */ - int compress; /**< True if we are compressing; false if we are inflating */ - - /** Number of bytes read so far. Used to detect zlib bombs. */ - size_t input_so_far; - /** Number of bytes written so far. Used to detect zlib bombs. */ - size_t output_so_far; - - /** Approximate number of bytes allocated for this object. */ - size_t allocation; -}; - -/** Return an approximate number of bytes used in RAM to hold a state with - * window bits windowBits and compression level 'memlevel' */ -static size_t -tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel) -{ - windowbits &= 15; - -#define A_FEW_KILOBYTES 2048 - - if (inflate_) { - /* From zconf.h: - - "The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects." - */ - return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + - (1 << 15) + A_FEW_KILOBYTES; - } else { - /* Also from zconf.h: - - "The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - ... plus a few kilobytes for small objects." - */ - return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + - (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES; - } -#undef A_FEW_KILOBYTES -} - -/** Construct and return a tor_zlib_compress_state_t object using - * method. If compress, it's for compression; otherwise it's for - * decompression. */ -tor_zlib_compress_state_t * -tor_zlib_compress_new(int compress_, - compress_method_t method, - compression_level_t compression_level) -{ - tor_zlib_compress_state_t *out; - int bits, memlevel; - - if (! compress_) { - /* use this setting for decompression, since we might have the - * max number of window bits */ - compression_level = BEST_COMPRESSION; - } - - out = tor_malloc_zero(sizeof(tor_zlib_compress_state_t)); - out->stream.zalloc = Z_NULL; - out->stream.zfree = Z_NULL; - out->stream.opaque = NULL; - out->compress = compress_; - bits = method_bits(method, compression_level); - memlevel = memory_level(compression_level); - if (compress_) { - if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, - bits, memlevel, - Z_DEFAULT_STRATEGY) != Z_OK) - goto err; // LCOV_EXCL_LINE - } else { - if (inflateInit2(&out->stream, bits) != Z_OK) - goto err; // LCOV_EXCL_LINE - } - out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel); - - atomic_counter_add(&total_zlib_allocation, out->allocation); - - return out; - - err: - tor_free(out); - return NULL; -} - -/** Compress/decompress some bytes using state. Read up to - * *in_len bytes from *in, and write up to *out_len bytes - * to *out, adjusting the values as we go. If finish is true, - * we've reached the end of the input. - * - * Return TOR_COMPRESS_DONE if we've finished the entire - * compression/decompression. - * Return TOR_COMPRESS_OK if we're processed everything from the input. - * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on out. - * Return TOR_COMPRESS_ERROR if the stream is corrupt. - */ -tor_compress_output_t -tor_zlib_compress_process(tor_zlib_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ - int err; - tor_assert(state != NULL); - if (*in_len > UINT_MAX || - *out_len > UINT_MAX) { - return TOR_COMPRESS_ERROR; - } - - state->stream.next_in = (unsigned char*) *in; - state->stream.avail_in = (unsigned int)*in_len; - state->stream.next_out = (unsigned char*) *out; - state->stream.avail_out = (unsigned int)*out_len; - - if (state->compress) { - err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH); - } else { - err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); - } - - state->input_so_far += state->stream.next_in - ((unsigned char*)*in); - state->output_so_far += state->stream.next_out - ((unsigned char*)*out); - - *out = (char*) state->stream.next_out; - *out_len = state->stream.avail_out; - *in = (const char *) state->stream.next_in; - *in_len = state->stream.avail_in; - - if (! state->compress && - tor_compress_is_compression_bomb(state->input_so_far, - state->output_so_far)) { - log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); - return TOR_COMPRESS_ERROR; - } - - switch (err) - { - case Z_STREAM_END: - return TOR_COMPRESS_DONE; - case Z_BUF_ERROR: - if (state->stream.avail_in == 0 && !finish) - return TOR_COMPRESS_OK; - return TOR_COMPRESS_BUFFER_FULL; - case Z_OK: - if (state->stream.avail_out == 0 || finish) - return TOR_COMPRESS_BUFFER_FULL; - return TOR_COMPRESS_OK; - default: - log_warn(LD_GENERAL, "Gzip returned an error: %s", - state->stream.msg ? state->stream.msg : ""); - return TOR_COMPRESS_ERROR; - } -} - -/** Deallocate state. */ -void -tor_zlib_compress_free_(tor_zlib_compress_state_t *state) -{ - if (state == NULL) - return; - - atomic_counter_sub(&total_zlib_allocation, state->allocation); - - if (state->compress) - deflateEnd(&state->stream); - else - inflateEnd(&state->stream); - - tor_free(state); -} - -/** Return the approximate number of bytes allocated for state. */ -size_t -tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state) -{ - tor_assert(state != NULL); - return state->allocation; -} - -/** Return the approximate number of bytes allocated for all zlib states. */ -size_t -tor_zlib_get_total_allocation(void) -{ - return atomic_counter_get(&total_zlib_allocation); -} - -/** Set up global state for the zlib module */ -void -tor_zlib_init(void) -{ - atomic_counter_init(&total_zlib_allocation); -} - diff --git a/src/tor/src/common/compress_zlib.h b/src/tor/src/common/compress_zlib.h deleted file mode 100644 index e3c1a2b33..000000000 --- a/src/tor/src/common/compress_zlib.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_zlib.h - * \brief Header for compress_zlib.c - **/ - -#ifndef TOR_COMPRESS_ZLIB_H -#define TOR_COMPRESS_ZLIB_H - -int tor_zlib_method_supported(void); - -const char *tor_zlib_get_version_str(void); - -const char *tor_zlib_get_header_version_str(void); - -/** Internal state for an incremental zlib/gzip compression/decompression. */ -typedef struct tor_zlib_compress_state_t tor_zlib_compress_state_t; - -tor_zlib_compress_state_t * -tor_zlib_compress_new(int compress, - compress_method_t method, - compression_level_t compression_level); - -tor_compress_output_t -tor_zlib_compress_process(tor_zlib_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); - -void tor_zlib_compress_free_(tor_zlib_compress_state_t *state); -#define tor_zlib_compress_free(st) \ - FREE_AND_NULL(tor_zlib_compress_state_t, \ - tor_zlib_compress_free_, (st)) - -size_t tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state); - -size_t tor_zlib_get_total_allocation(void); - -void tor_zlib_init(void); - -#endif /* !defined(TOR_COMPRESS_ZLIB_H) */ - diff --git a/src/tor/src/common/compress_zstd.c b/src/tor/src/common/compress_zstd.c deleted file mode 100644 index 0db87d61b..000000000 --- a/src/tor/src/common/compress_zstd.c +++ /dev/null @@ -1,442 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_zstd.c - * \brief Compression backend for Zstandard. - * - * This module should never be invoked directly. Use the compress module - * instead. - **/ - -#include "orconfig.h" - -#include "util.h" -#include "torlog.h" -#include "compress.h" -#include "compress_zstd.h" - -#ifdef HAVE_ZSTD -#include -#endif - -/** Total number of bytes allocated for Zstandard state. */ -static atomic_counter_t total_zstd_allocation; - -#ifdef HAVE_ZSTD -/** Given level return the memory level. */ -static int -memory_level(compression_level_t level) -{ - switch (level) { - default: - case BEST_COMPRESSION: - case HIGH_COMPRESSION: return 9; - case MEDIUM_COMPRESSION: return 8; - case LOW_COMPRESSION: return 7; - } -} -#endif /* defined(HAVE_ZSTD) */ - -/** Return 1 if Zstandard compression is supported; otherwise 0. */ -int -tor_zstd_method_supported(void) -{ -#ifdef HAVE_ZSTD - return 1; -#else - return 0; -#endif -} - -/** Return a string representation of the version of the currently running - * version of libzstd. Returns NULL if Zstandard is unsupported. */ -const char * -tor_zstd_get_version_str(void) -{ -#ifdef HAVE_ZSTD - static char version_str[16]; - size_t version_number; - - version_number = ZSTD_versionNumber(); - tor_snprintf(version_str, sizeof(version_str), - "%d.%d.%d", - (int) version_number / 10000 % 100, - (int) version_number / 100 % 100, - (int) version_number % 100); - - return version_str; -#else /* !(defined(HAVE_ZSTD)) */ - return NULL; -#endif /* defined(HAVE_ZSTD) */ -} - -/** Return a string representation of the version of the version of libzstd - * used at compilation time. Returns NULL if Zstandard is unsupported. */ -const char * -tor_zstd_get_header_version_str(void) -{ -#ifdef HAVE_ZSTD - return ZSTD_VERSION_STRING; -#else - return NULL; -#endif -} - -/** Internal Zstandard state for incremental compression/decompression. - * The body of this struct is not exposed. */ -struct tor_zstd_compress_state_t { -#ifdef HAVE_ZSTD - union { - /** Compression stream. Used when compress is true. */ - ZSTD_CStream *compress_stream; - /** Decompression stream. Used when compress is false. */ - ZSTD_DStream *decompress_stream; - } u; /**< Zstandard stream objects. */ -#endif /* defined(HAVE_ZSTD) */ - - int compress; /**< True if we are compressing; false if we are inflating */ - int have_called_end; /**< True if we are compressing and we've called - * ZSTD_endStream */ - - /** Number of bytes read so far. Used to detect compression bombs. */ - size_t input_so_far; - /** Number of bytes written so far. Used to detect compression bombs. */ - size_t output_so_far; - - /** Approximate number of bytes allocated for this object. */ - size_t allocation; -}; - -#ifdef HAVE_ZSTD -/** Return an approximate number of bytes stored in memory to hold the - * Zstandard compression/decompression state. */ -static size_t -tor_zstd_state_size_precalc(int compress, int preset) -{ - tor_assert(preset > 0); - - size_t memory_usage = sizeof(tor_zstd_compress_state_t); - - // The Zstandard library provides a number of functions that would be useful - // here, but they are, unfortunately, still considered experimental and are - // thus only available in libzstd if we link against the library statically. - // - // The code in this function tries to approximate the calculations without - // being able to use the following: - // - // - We do not have access to neither the internal members of ZSTD_CStream - // and ZSTD_DStream and their internal context objects. - // - // - We cannot use ZSTD_sizeof_CStream() and ZSTD_sizeof_DStream() since they - // are unexposed. - // - // In the future it might be useful to check if libzstd have started - // providing these functions in a stable manner and simplify this function. - if (compress) { - // We try to approximate the ZSTD_sizeof_CStream(ZSTD_CStream *stream) - // function here. This function uses the following fields to make its - // estimate: - - // - sizeof(ZSTD_CStream): Around 192 bytes on a 64-bit machine: - memory_usage += 192; - - // - ZSTD_sizeof_CCtx(stream->cctx): This function requires access to - // variables that are not exposed via the public API. We use a _very_ - // simplified function to calculate the estimated amount of bytes used in - // this struct. - // memory_usage += (preset - 0.5) * 1024 * 1024; - memory_usage += (preset * 1024 * 1024) - (512 * 1024); - // - ZSTD_sizeof_CDict(stream->cdictLocal): Unused in Tor: 0 bytes. - // - stream->outBuffSize: 128 KB: - memory_usage += 128 * 1024; - // - stream->inBuffSize: 2048 KB: - memory_usage += 2048 * 1024; - } else { - // We try to approximate the ZSTD_sizeof_DStream(ZSTD_DStream *stream) - // function here. This function uses the following fields to make its - // estimate: - - // - sizeof(ZSTD_DStream): Around 208 bytes on a 64-bit machine: - memory_usage += 208; - // - ZSTD_sizeof_DCtx(stream->dctx): Around 150 KB. - memory_usage += 150 * 1024; - - // - ZSTD_sizeof_DDict(stream->ddictLocal): Unused in Tor: 0 bytes. - // - stream->inBuffSize: 0 KB. - // - stream->outBuffSize: 0 KB. - } - - return memory_usage; -} -#endif /* defined(HAVE_ZSTD) */ - -/** Construct and return a tor_zstd_compress_state_t object using - * method. If compress, it's for compression; otherwise it's for - * decompression. */ -tor_zstd_compress_state_t * -tor_zstd_compress_new(int compress, - compress_method_t method, - compression_level_t level) -{ - tor_assert(method == ZSTD_METHOD); - -#ifdef HAVE_ZSTD - const int preset = memory_level(level); - tor_zstd_compress_state_t *result; - size_t retval; - - result = tor_malloc_zero(sizeof(tor_zstd_compress_state_t)); - result->compress = compress; - result->allocation = tor_zstd_state_size_precalc(compress, preset); - - if (compress) { - result->u.compress_stream = ZSTD_createCStream(); - - if (result->u.compress_stream == NULL) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Error while creating Zstandard compression " - "stream"); - goto err; - // LCOV_EXCL_STOP - } - - retval = ZSTD_initCStream(result->u.compress_stream, preset); - - if (ZSTD_isError(retval)) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", - ZSTD_getErrorName(retval)); - goto err; - // LCOV_EXCL_STOP - } - } else { - result->u.decompress_stream = ZSTD_createDStream(); - - if (result->u.decompress_stream == NULL) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Error while creating Zstandard decompression " - "stream"); - goto err; - // LCOV_EXCL_STOP - } - - retval = ZSTD_initDStream(result->u.decompress_stream); - - if (ZSTD_isError(retval)) { - // LCOV_EXCL_START - log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", - ZSTD_getErrorName(retval)); - goto err; - // LCOV_EXCL_STOP - } - } - - atomic_counter_add(&total_zstd_allocation, result->allocation); - return result; - - err: - // LCOV_EXCL_START - if (compress) { - ZSTD_freeCStream(result->u.compress_stream); - } else { - ZSTD_freeDStream(result->u.decompress_stream); - } - - tor_free(result); - return NULL; - // LCOV_EXCL_STOP -#else /* !(defined(HAVE_ZSTD)) */ - (void)compress; - (void)method; - (void)level; - - return NULL; -#endif /* defined(HAVE_ZSTD) */ -} - -/** Compress/decompress some bytes using state. Read up to - * *in_len bytes from *in, and write up to *out_len bytes - * to *out, adjusting the values as we go. If finish is true, - * we've reached the end of the input. - * - * Return TOR_COMPRESS_DONE if we've finished the entire - * compression/decompression. - * Return TOR_COMPRESS_OK if we're processed everything from the input. - * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on out. - * Return TOR_COMPRESS_ERROR if the stream is corrupt. - */ -tor_compress_output_t -tor_zstd_compress_process(tor_zstd_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ -#ifdef HAVE_ZSTD - size_t retval; - - tor_assert(state != NULL); - tor_assert(*in_len <= UINT_MAX); - tor_assert(*out_len <= UINT_MAX); - - ZSTD_inBuffer input = { *in, *in_len, 0 }; - ZSTD_outBuffer output = { *out, *out_len, 0 }; - - if (BUG(finish == 0 && state->have_called_end)) { - finish = 1; - } - - if (state->compress) { - if (! state->have_called_end) - retval = ZSTD_compressStream(state->u.compress_stream, - &output, &input); - else - retval = 0; - } else { - retval = ZSTD_decompressStream(state->u.decompress_stream, - &output, &input); - } - - state->input_so_far += input.pos; - state->output_so_far += output.pos; - - *out = (char *)output.dst + output.pos; - *out_len = output.size - output.pos; - *in = (char *)input.src + input.pos; - *in_len = input.size - input.pos; - - if (! state->compress && - tor_compress_is_compression_bomb(state->input_so_far, - state->output_so_far)) { - log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); - return TOR_COMPRESS_ERROR; - } - - if (ZSTD_isError(retval)) { - log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.", - state->compress ? "compression" : "decompression", - ZSTD_getErrorName(retval)); - return TOR_COMPRESS_ERROR; - } - - if (state->compress && !state->have_called_end) { - retval = ZSTD_flushStream(state->u.compress_stream, &output); - - *out = (char *)output.dst + output.pos; - *out_len = output.size - output.pos; - - if (ZSTD_isError(retval)) { - log_warn(LD_GENERAL, "Zstandard compression unable to flush: %s.", - ZSTD_getErrorName(retval)); - return TOR_COMPRESS_ERROR; - } - - // ZSTD_flushStream returns 0 if the frame is done, or >0 if it - // is incomplete. - if (retval > 0) { - return TOR_COMPRESS_BUFFER_FULL; - } - } - - if (!finish) { - // The caller says we're not done with the input, so no need to write an - // epilogue. - return TOR_COMPRESS_OK; - } else if (state->compress) { - if (*in_len) { - // We say that we're not done with the input, so we can't write an - // epilogue. - return TOR_COMPRESS_OK; - } - - retval = ZSTD_endStream(state->u.compress_stream, &output); - state->have_called_end = 1; - *out = (char *)output.dst + output.pos; - *out_len = output.size - output.pos; - - if (ZSTD_isError(retval)) { - log_warn(LD_GENERAL, "Zstandard compression unable to write " - "epilogue: %s.", - ZSTD_getErrorName(retval)); - return TOR_COMPRESS_ERROR; - } - - // endStream returns the number of bytes that is needed to write the - // epilogue. - if (retval > 0) - return TOR_COMPRESS_BUFFER_FULL; - - return TOR_COMPRESS_DONE; - } else /* if (!state->compress) */ { - // ZSTD_decompressStream returns 0 if the frame is done, or >0 if it - // is incomplete. - // We check this above. - tor_assert_nonfatal(!ZSTD_isError(retval)); - // Start a new frame if this frame is done - if (retval == 0) - return TOR_COMPRESS_DONE; - // Don't check out_len, it might have some space left if the next output - // chunk is larger than the remaining space - else if (*in_len > 0) - return TOR_COMPRESS_BUFFER_FULL; - else - return TOR_COMPRESS_OK; - } - -#else /* !(defined(HAVE_ZSTD)) */ - (void)state; - (void)out; - (void)out_len; - (void)in; - (void)in_len; - (void)finish; - - return TOR_COMPRESS_ERROR; -#endif /* defined(HAVE_ZSTD) */ -} - -/** Deallocate state. */ -void -tor_zstd_compress_free_(tor_zstd_compress_state_t *state) -{ - if (state == NULL) - return; - - atomic_counter_sub(&total_zstd_allocation, state->allocation); - -#ifdef HAVE_ZSTD - if (state->compress) { - ZSTD_freeCStream(state->u.compress_stream); - } else { - ZSTD_freeDStream(state->u.decompress_stream); - } -#endif /* defined(HAVE_ZSTD) */ - - tor_free(state); -} - -/** Return the approximate number of bytes allocated for state. */ -size_t -tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state) -{ - tor_assert(state != NULL); - return state->allocation; -} - -/** Return the approximate number of bytes allocated for all Zstandard - * states. */ -size_t -tor_zstd_get_total_allocation(void) -{ - return atomic_counter_get(&total_zstd_allocation); -} - -/** Initialize the zstd module */ -void -tor_zstd_init(void) -{ - atomic_counter_init(&total_zstd_allocation); -} - diff --git a/src/tor/src/common/compress_zstd.h b/src/tor/src/common/compress_zstd.h deleted file mode 100644 index 9bca24ded..000000000 --- a/src/tor/src/common/compress_zstd.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compress_zstd.h - * \brief Header for compress_zstd.c - **/ - -#ifndef TOR_COMPRESS_ZSTD_H -#define TOR_COMPRESS_ZSTD_H - -int tor_zstd_method_supported(void); - -const char *tor_zstd_get_version_str(void); - -const char *tor_zstd_get_header_version_str(void); - -/** Internal state for an incremental Zstandard compression/decompression. */ -typedef struct tor_zstd_compress_state_t tor_zstd_compress_state_t; - -tor_zstd_compress_state_t * -tor_zstd_compress_new(int compress, - compress_method_t method, - compression_level_t compression_level); - -tor_compress_output_t -tor_zstd_compress_process(tor_zstd_compress_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); - -void tor_zstd_compress_free_(tor_zstd_compress_state_t *state); -#define tor_zstd_compress_free(st) \ - FREE_AND_NULL(tor_zstd_compress_state_t, \ - tor_zstd_compress_free_, (st)) - -size_t tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state); - -size_t tor_zstd_get_total_allocation(void); - -void tor_zstd_init(void); - -#endif /* !defined(TOR_COMPRESS_ZSTD_H) */ - diff --git a/src/tor/src/common/confline.c b/src/tor/src/common/confline.c deleted file mode 100644 index bf613ab74..000000000 --- a/src/tor/src/common/confline.c +++ /dev/null @@ -1,538 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "compat.h" -#include "confline.h" -#include "torlog.h" -#include "util.h" -#include "container.h" - -static int config_get_lines_aux(const char *string, config_line_t **result, - int extended, int allow_include, - int *has_include, smartlist_t *opened_lst, - int recursion_level, config_line_t **last); -static smartlist_t *config_get_file_list(const char *path, - smartlist_t *opened_files); -static int config_get_included_config(const char *path, int recursion_level, - int extended, config_line_t **config, - config_line_t **config_last, - smartlist_t *opened_lst); -static int config_process_include(const char *path, int recursion_level, - int extended, config_line_t **list, - config_line_t **list_last, - smartlist_t *opened_lst); - -/** Helper: allocate a new configuration option mapping 'key' to 'val', - * append it to *lst. */ -void -config_line_append(config_line_t **lst, - const char *key, - const char *val) -{ - tor_assert(lst); - - config_line_t *newline; - - newline = tor_malloc_zero(sizeof(config_line_t)); - newline->key = tor_strdup(key); - newline->value = tor_strdup(val); - newline->next = NULL; - while (*lst) - lst = &((*lst)->next); - - (*lst) = newline; -} - -/** Helper: allocate a new configuration option mapping 'key' to 'val', - * and prepend it to *lst */ -void -config_line_prepend(config_line_t **lst, - const char *key, - const char *val) -{ - tor_assert(lst); - - config_line_t *newline; - - newline = tor_malloc_zero(sizeof(config_line_t)); - newline->key = tor_strdup(key); - newline->value = tor_strdup(val); - newline->next = *lst; - *lst = newline; -} - -/** Return the first line in lines whose key is exactly key, or - * NULL if no such key exists. - * - * (In options parsing, this is for handling commandline-only options only; - * other options should be looked up in the appropriate data structure.) */ -const config_line_t * -config_line_find(const config_line_t *lines, - const char *key) -{ - const config_line_t *cl; - for (cl = lines; cl; cl = cl->next) { - if (!strcmp(cl->key, key)) - return cl; - } - return NULL; -} - -/** Auxiliary function that does all the work of config_get_lines. - * recursion_level is the count of how many nested %includes we have. - * opened_lst will have a list of opened files if provided. - * Returns the a pointer to the last element of the result in - * last. */ -static int -config_get_lines_aux(const char *string, config_line_t **result, int extended, - int allow_include, int *has_include, - smartlist_t *opened_lst, int recursion_level, - config_line_t **last) -{ - config_line_t *list = NULL, **next, *list_last = NULL; - char *k, *v; - const char *parse_err; - int include_used = 0; - - if (recursion_level > MAX_INCLUDE_RECURSION_LEVEL) { - log_warn(LD_CONFIG, "Error while parsing configuration: more than %d " - "nested %%includes.", MAX_INCLUDE_RECURSION_LEVEL); - return -1; - } - - next = &list; - do { - k = v = NULL; - string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); - if (!string) { - log_warn(LD_CONFIG, "Error while parsing configuration: %s", - parse_err?parse_err:""); - config_free_lines(list); - tor_free(k); - tor_free(v); - return -1; - } - if (k && v) { - unsigned command = CONFIG_LINE_NORMAL; - if (extended) { - if (k[0] == '+') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - command = CONFIG_LINE_APPEND; - } else if (k[0] == '/') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - tor_free(v); - v = tor_strdup(""); - command = CONFIG_LINE_CLEAR; - } - } - - if (allow_include && !strcmp(k, "%include")) { - tor_free(k); - include_used = 1; - - config_line_t *include_list; - if (config_process_include(v, recursion_level, extended, &include_list, - &list_last, opened_lst) < 0) { - log_warn(LD_CONFIG, "Error reading included configuration " - "file or directory: \"%s\".", v); - config_free_lines(list); - tor_free(v); - return -1; - } - *next = include_list; - if (list_last) - next = &list_last->next; - tor_free(v); - } else { - /* This list can get long, so we keep a pointer to the end of it - * rather than using config_line_append over and over and getting - * n^2 performance. */ - *next = tor_malloc_zero(sizeof(**next)); - (*next)->key = k; - (*next)->value = v; - (*next)->next = NULL; - (*next)->command = command; - list_last = *next; - next = &((*next)->next); - } - } else { - tor_free(k); - tor_free(v); - } - } while (*string); - - if (last) { - *last = list_last; - } - if (has_include) { - *has_include = include_used; - } - *result = list; - return 0; -} - -/** Helper: parse the config string and strdup into key/value - * strings. Set *result to the list, or NULL if parsing the string - * failed. Set *has_include to 1 if result has values from - * %included files. opened_lst will have a list of opened files if - * provided. Return 0 on success, -1 on failure. Warn and ignore any - * misformatted lines. - * - * If extended is set, then treat keys beginning with / and with + as - * indicating "clear" and "append" respectively. */ -int -config_get_lines_include(const char *string, config_line_t **result, - int extended, int *has_include, - smartlist_t *opened_lst) -{ - return config_get_lines_aux(string, result, extended, 1, has_include, - opened_lst, 1, NULL); -} - -/** Same as config_get_lines_include but does not allow %include */ -int -config_get_lines(const char *string, config_line_t **result, int extended) -{ - return config_get_lines_aux(string, result, extended, 0, NULL, NULL, 1, - NULL); -} - -/** Adds a list of configuration files present on path to - * file_list. path can be a file or a directory. If it is a file, - * only that file will be added to file_list. If it is a directory, - * all paths for files on that directory root (no recursion) except for files - * whose name starts with a dot will be added to file_list. - * opened_files will have a list of files opened by this function - * if provided. Return 0 on success, -1 on failure. Ignores empty files. - */ -static smartlist_t * -config_get_file_list(const char *path, smartlist_t *opened_files) -{ - smartlist_t *file_list = smartlist_new(); - - if (opened_files) { - smartlist_add_strdup(opened_files, path); - } - - file_status_t file_type = file_status(path); - if (file_type == FN_FILE) { - smartlist_add_strdup(file_list, path); - return file_list; - } else if (file_type == FN_DIR) { - smartlist_t *all_files = tor_listdir(path); - if (!all_files) { - smartlist_free(file_list); - return NULL; - } - smartlist_sort_strings(all_files); - SMARTLIST_FOREACH_BEGIN(all_files, char *, f) { - if (f[0] == '.') { - tor_free(f); - continue; - } - - char *fullname; - tor_asprintf(&fullname, "%s"PATH_SEPARATOR"%s", path, f); - tor_free(f); - - if (opened_files) { - smartlist_add_strdup(opened_files, fullname); - } - - if (file_status(fullname) != FN_FILE) { - tor_free(fullname); - continue; - } - smartlist_add(file_list, fullname); - } SMARTLIST_FOREACH_END(f); - smartlist_free(all_files); - return file_list; - } else if (file_type == FN_EMPTY) { - return file_list; - } else { - smartlist_free(file_list); - return NULL; - } -} - -/** Creates a list of config lines present on included path. - * Set config to the list and config_last to the last element of - * config. opened_lst will have a list of opened files if - * provided. Return 0 on success, -1 on failure. */ -static int -config_get_included_config(const char *path, int recursion_level, int extended, - config_line_t **config, config_line_t **config_last, - smartlist_t *opened_lst) -{ - char *included_conf = read_file_to_str(path, 0, NULL); - if (!included_conf) { - return -1; - } - - if (config_get_lines_aux(included_conf, config, extended, 1, NULL, - opened_lst, recursion_level+1, config_last) < 0) { - tor_free(included_conf); - return -1; - } - - tor_free(included_conf); - return 0; -} - -/** Process an %include path in a config file. Set list to the - * list of configuration settings obtained and list_last to the last - * element of the same list. opened_lst will have a list of opened - * files if provided. Return 0 on success, -1 on failure. */ -static int -config_process_include(const char *path, int recursion_level, int extended, - config_line_t **list, config_line_t **list_last, - smartlist_t *opened_lst) -{ - config_line_t *ret_list = NULL; - config_line_t **next = &ret_list; - - smartlist_t *config_files = config_get_file_list(path, opened_lst); - if (!config_files) { - return -1; - } - - int rv = -1; - SMARTLIST_FOREACH_BEGIN(config_files, const char *, config_file) { - config_line_t *included_config = NULL; - if (config_get_included_config(config_file, recursion_level, extended, - &included_config, list_last, - opened_lst) < 0) { - goto done; - } - - *next = included_config; - if (*list_last) - next = &(*list_last)->next; - - } SMARTLIST_FOREACH_END(config_file); - *list = ret_list; - rv = 0; - - done: - SMARTLIST_FOREACH(config_files, char *, f, tor_free(f)); - smartlist_free(config_files); - return rv; -} - -/** - * Free all the configuration lines on the linked list front. - */ -void -config_free_lines_(config_line_t *front) -{ - config_line_t *tmp; - - while (front) { - tmp = front; - front = tmp->next; - - tor_free(tmp->key); - tor_free(tmp->value); - tor_free(tmp); - } -} - -/** Return a newly allocated deep copy of the lines in inp. */ -config_line_t * -config_lines_dup(const config_line_t *inp) -{ - return config_lines_dup_and_filter(inp, NULL); -} - -/** Return a newly allocated deep copy of the lines in inp, - * but only the ones whose keys begin with key (case-insensitive). - * If key is NULL, do not filter. */ -config_line_t * -config_lines_dup_and_filter(const config_line_t *inp, - const char *key) -{ - config_line_t *result = NULL; - config_line_t **next_out = &result; - while (inp) { - if (key && strcasecmpstart(inp->key, key)) { - inp = inp->next; - continue; - } - *next_out = tor_malloc_zero(sizeof(config_line_t)); - (*next_out)->key = tor_strdup(inp->key); - (*next_out)->value = tor_strdup(inp->value); - inp = inp->next; - next_out = &((*next_out)->next); - } - (*next_out) = NULL; - return result; -} - -/** Return true iff a and b contain identical keys and values in identical - * order. */ -int -config_lines_eq(config_line_t *a, config_line_t *b) -{ - while (a && b) { - if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) - return 0; - a = a->next; - b = b->next; - } - if (a || b) - return 0; - return 1; -} - -/** Return the number of lines in a whose key is key. */ -int -config_count_key(const config_line_t *a, const char *key) -{ - int n = 0; - while (a) { - if (!strcasecmp(a->key, key)) { - ++n; - } - a = a->next; - } - return n; -} - -/** Given a string containing part of a configuration file or similar format, - * advance past comments and whitespace and try to parse a single line. If we - * parse a line successfully, set *key_out to a new string holding the - * key portion and *value_out to a new string holding the value portion - * of the line, and return a pointer to the start of the next line. If we run - * out of data, return a pointer to the end of the string. If we encounter an - * error, return NULL and set *err_out (if provided) to an error - * message. - */ -const char * -parse_config_line_from_str_verbose(const char *line, char **key_out, - char **value_out, - const char **err_out) -{ - /* - See torrc_format.txt for a description of the (silly) format this parses. - */ - const char *key, *val, *cp; - int continuation = 0; - - tor_assert(key_out); - tor_assert(value_out); - - *key_out = *value_out = NULL; - key = val = NULL; - /* Skip until the first keyword. */ - while (1) { - while (TOR_ISSPACE(*line)) - ++line; - if (*line == '#') { - while (*line && *line != '\n') - ++line; - } else { - break; - } - } - - if (!*line) { /* End of string? */ - *key_out = *value_out = NULL; - return line; - } - - /* Skip until the next space or \ followed by newline. */ - key = line; - while (*line && !TOR_ISSPACE(*line) && *line != '#' && - ! (line[0] == '\\' && line[1] == '\n')) - ++line; - *key_out = tor_strndup(key, line-key); - - /* Skip until the value. */ - while (*line == ' ' || *line == '\t') - ++line; - - val = line; - - /* Find the end of the line. */ - if (*line == '\"') { // XXX No continuation handling is done here - if (!(line = unescape_string(line, value_out, NULL))) { - if (err_out) - *err_out = "Invalid escape sequence in quoted string"; - return NULL; - } - while (*line == ' ' || *line == '\t') - ++line; - if (*line == '\r' && *(++line) == '\n') - ++line; - if (*line && *line != '#' && *line != '\n') { - if (err_out) - *err_out = "Excess data after quoted string"; - return NULL; - } - } else { - /* Look for the end of the line. */ - while (*line && *line != '\n' && (*line != '#' || continuation)) { - if (*line == '\\' && line[1] == '\n') { - continuation = 1; - line += 2; - } else if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - if (*line == '\n') - ++line; - } else { - ++line; - } - } - - if (*line == '\n') { - cp = line++; - } else { - cp = line; - } - /* Now back cp up to be the last nonspace character */ - while (cp>val && TOR_ISSPACE(*(cp-1))) - --cp; - - tor_assert(cp >= val); - - /* Now copy out and decode the value. */ - *value_out = tor_strndup(val, cp-val); - if (continuation) { - char *v_out, *v_in; - v_out = v_in = *value_out; - while (*v_in) { - if (*v_in == '#') { - do { - ++v_in; - } while (*v_in && *v_in != '\n'); - if (*v_in == '\n') - ++v_in; - } else if (v_in[0] == '\\' && v_in[1] == '\n') { - v_in += 2; - } else { - *v_out++ = *v_in++; - } - } - *v_out = '\0'; - } - } - - if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - } - while (TOR_ISSPACE(*line)) ++line; - - return line; -} - diff --git a/src/tor/src/common/confline.h b/src/tor/src/common/confline.h deleted file mode 100644 index 772a9bbbd..000000000 --- a/src/tor/src/common/confline.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONFLINE_H -#define TOR_CONFLINE_H - -#include "container.h" - -/** Ordinary configuration line. */ -#define CONFIG_LINE_NORMAL 0 -/** Appends to previous configuration for the same option, even if we - * would ordinary replace it. */ -#define CONFIG_LINE_APPEND 1 -/* Removes all previous configuration for an option. */ -#define CONFIG_LINE_CLEAR 2 - -#define MAX_INCLUDE_RECURSION_LEVEL 31 - -/** A linked list of lines in a config file, or elsewhere */ -typedef struct config_line_t { - char *key; - char *value; - struct config_line_t *next; - - /** What special treatment (if any) does this line require? */ - unsigned int command:2; - /** If true, subsequent assignments to this linelist should replace - * it, not extend it. Set only on the first item in a linelist in an - * or_options_t. */ - unsigned int fragile:1; -} config_line_t; - -void config_line_append(config_line_t **lst, - const char *key, const char *val); -void config_line_prepend(config_line_t **lst, - const char *key, const char *val); -config_line_t *config_lines_dup(const config_line_t *inp); -config_line_t *config_lines_dup_and_filter(const config_line_t *inp, - const char *key); -const config_line_t *config_line_find(const config_line_t *lines, - const char *key); -int config_lines_eq(config_line_t *a, config_line_t *b); -int config_count_key(const config_line_t *a, const char *key); -int config_get_lines(const char *string, config_line_t **result, int extended); -int config_get_lines_include(const char *string, config_line_t **result, - int extended, int *has_include, - smartlist_t *opened_lst); -void config_free_lines_(config_line_t *front); -#define config_free_lines(front) \ - do { \ - config_free_lines_(front); \ - (front) = NULL; \ - } while (0) -const char *parse_config_line_from_str_verbose(const char *line, - char **key_out, char **value_out, - const char **err_out); -#endif /* !defined(TOR_CONFLINE_H) */ - diff --git a/src/tor/src/common/crypto_curve25519.c b/src/tor/src/common/crypto_curve25519.c deleted file mode 100644 index 8793fa627..000000000 --- a/src/tor/src/common/crypto_curve25519.c +++ /dev/null @@ -1,357 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto_curve25519.c - * - * \brief Wrapper code for a curve25519 implementation. - * - * Curve25519 is an Elliptic-Curve Diffie Hellman handshake, designed by - * Dan Bernstein. For more information, see https://cr.yp.to/ecdh.html - * - * Tor uses Curve25519 as the basis of its "ntor" circuit extension - * handshake, and in related code. The functions in this module are - * used to find the most suitable available Curve25519 implementation, - * to provide wrappers around it, and so on. - */ - -#define CRYPTO_CURVE25519_PRIVATE -#include "orconfig.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif -#include "container.h" -#include "crypto.h" -#include "crypto_curve25519.h" -#include "crypto_format.h" -#include "util.h" -#include "torlog.h" - -#include "ed25519/donna/ed25519_donna_tor.h" - -/* ============================== - Part 1: wrap a suitable curve25519 implementation as curve25519_impl - ============================== */ - -#ifdef USE_CURVE25519_DONNA -int curve25519_donna(uint8_t *mypublic, - const uint8_t *secret, const uint8_t *basepoint); -#endif -#ifdef USE_CURVE25519_NACL -#ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H -#include -#elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H) -#include -#endif -#endif /* defined(USE_CURVE25519_NACL) */ - -static void pick_curve25519_basepoint_impl(void); - -/** This is set to 1 if we have an optimized Ed25519-based - * implementation for multiplying a value by the basepoint; to 0 if we - * don't, and to -1 if we haven't checked. */ -static int curve25519_use_ed = -1; - -/** - * Helper function: call the most appropriate backend to compute the - * scalar "secret" times the point "point". Store the result in - * "output". Return 0 on success, negative on failure. - **/ -STATIC int -curve25519_impl(uint8_t *output, const uint8_t *secret, - const uint8_t *point) -{ - uint8_t bp[CURVE25519_PUBKEY_LEN]; - int r; - memcpy(bp, point, CURVE25519_PUBKEY_LEN); - /* Clear the high bit, in case our backend foolishly looks at it. */ - bp[31] &= 0x7f; -#ifdef USE_CURVE25519_DONNA - r = curve25519_donna(output, secret, bp); -#elif defined(USE_CURVE25519_NACL) - r = crypto_scalarmult_curve25519(output, secret, bp); -#else -#error "No implementation of curve25519 is available." -#endif /* defined(USE_CURVE25519_DONNA) || ... */ - memwipe(bp, 0, sizeof(bp)); - return r; -} - -/** - * Helper function: Multiply the scalar "secret" by the Curve25519 - * basepoint (X=9), and store the result in "output". Return 0 on - * success, -1 on failure. - */ -STATIC int -curve25519_basepoint_impl(uint8_t *output, const uint8_t *secret) -{ - int r = 0; - if (BUG(curve25519_use_ed == -1)) { - /* LCOV_EXCL_START - Only reached if we forgot to call curve25519_init() */ - pick_curve25519_basepoint_impl(); - /* LCOV_EXCL_STOP */ - } - - /* TODO: Someone should benchmark curved25519_scalarmult_basepoint versus - * an optimized NaCl build to see which should be used when compiled with - * NaCl available. I suspected that the ed25519 optimization always wins. - */ - if (PREDICT_LIKELY(curve25519_use_ed == 1)) { - curved25519_scalarmult_basepoint_donna(output, secret); - r = 0; - } else { - static const uint8_t basepoint[32] = {9}; - r = curve25519_impl(output, secret, basepoint); - } - return r; -} - -/** - * Override the decision of whether to use the Ed25519-based basepoint - * multiply function. Used for testing. - */ -void -curve25519_set_impl_params(int use_ed) -{ - curve25519_use_ed = use_ed; -} - -/* ============================== - Part 2: Wrap curve25519_impl with some convenience types and functions. - ============================== */ - -/** - * Return true iff a curve25519_public_key_t seems valid. (It's not necessary - * to see if the point is on the curve, since the twist is also secure, but we - * do need to make sure that it isn't the point at infinity.) */ -int -curve25519_public_key_is_ok(const curve25519_public_key_t *key) -{ - return !safe_mem_is_zero(key->public_key, CURVE25519_PUBKEY_LEN); -} - -/** - * Generate CURVE25519_SECKEY_LEN random bytes in out. If - * extra_strong is true, this key is possibly going to get used more - * than once, so use a better-than-usual RNG. Return 0 on success, -1 on - * failure. - * - * This function does not adjust the output of the RNG at all; the will caller - * will need to clear or set the appropriate bits to make curve25519 work. - */ -int -curve25519_rand_seckey_bytes(uint8_t *out, int extra_strong) -{ - if (extra_strong) - crypto_strongest_rand(out, CURVE25519_SECKEY_LEN); - else - crypto_rand((char*)out, CURVE25519_SECKEY_LEN); - - return 0; -} - -/** Generate a new keypair and return the secret key. If extra_strong - * is true, this key is possibly going to get used more than once, so - * use a better-than-usual RNG. Return 0 on success, -1 on failure. */ -int -curve25519_secret_key_generate(curve25519_secret_key_t *key_out, - int extra_strong) -{ - if (curve25519_rand_seckey_bytes(key_out->secret_key, extra_strong) < 0) - return -1; - - key_out->secret_key[0] &= 248; - key_out->secret_key[31] &= 127; - key_out->secret_key[31] |= 64; - - return 0; -} - -/** - * Given a secret key in seckey, create the corresponding public - * key in key_out. - */ -void -curve25519_public_key_generate(curve25519_public_key_t *key_out, - const curve25519_secret_key_t *seckey) -{ - curve25519_basepoint_impl(key_out->public_key, seckey->secret_key); -} - -/** - * Construct a new keypair in *keypair_out. If extra_strong - * is true, this key is possibly going to get used more than once, so - * use a better-than-usual RNG. Return 0 on success, -1 on failure. */ -int -curve25519_keypair_generate(curve25519_keypair_t *keypair_out, - int extra_strong) -{ - if (curve25519_secret_key_generate(&keypair_out->seckey, extra_strong) < 0) - return -1; - curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); - return 0; -} - -/** Store the keypair keypair, including its secret and public - * parts, to the file fname. Use the string tag tag to - * distinguish this from other Curve25519 keypairs. Return 0 on success, - * -1 on failure. - * - * See crypto_write_tagged_contents_to_file() for more information on - * the metaformat used for these keys.*/ -int -curve25519_keypair_write_to_file(const curve25519_keypair_t *keypair, - const char *fname, - const char *tag) -{ - uint8_t contents[CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN]; - int r; - - memcpy(contents, keypair->seckey.secret_key, CURVE25519_SECKEY_LEN); - memcpy(contents+CURVE25519_SECKEY_LEN, - keypair->pubkey.public_key, CURVE25519_PUBKEY_LEN); - - r = crypto_write_tagged_contents_to_file(fname, - "c25519v1", - tag, - contents, - sizeof(contents)); - - memwipe(contents, 0, sizeof(contents)); - return r; -} - -/** Read a curve25519 keypair from a file named fname created by - * curve25519_keypair_write_to_file(). Store the keypair in - * keypair_out, and the associated tag string in tag_out. - * Return 0 on success, and -1 on failure. */ -int -curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out, - char **tag_out, - const char *fname) -{ - uint8_t content[CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN]; - ssize_t len; - int r = -1; - - len = crypto_read_tagged_contents_from_file(fname, "c25519v1", tag_out, - content, sizeof(content)); - if (len != sizeof(content)) - goto end; - - /* Make sure that the public key matches the secret key */ - memcpy(keypair_out->seckey.secret_key, content, CURVE25519_SECKEY_LEN); - curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); - if (tor_memneq(keypair_out->pubkey.public_key, - content + CURVE25519_SECKEY_LEN, - CURVE25519_PUBKEY_LEN)) - goto end; - - r = 0; - - end: - memwipe(content, 0, sizeof(content)); - if (r != 0) { - memset(keypair_out, 0, sizeof(*keypair_out)); - tor_free(*tag_out); - } - return r; -} - -/** Perform the curve25519 ECDH handshake with skey and pkey, - * writing CURVE25519_OUTPUT_LEN bytes of output into output. */ -void -curve25519_handshake(uint8_t *output, - const curve25519_secret_key_t *skey, - const curve25519_public_key_t *pkey) -{ - curve25519_impl(output, skey->secret_key, pkey->public_key); -} - -/** Check whether the ed25519-based curve25519 basepoint optimization seems to - * be working. If so, return 0; otherwise return -1. */ -static int -curve25519_basepoint_spot_check(void) -{ - static const uint8_t alicesk[32] = { - 0x77,0x07,0x6d,0x0a,0x73,0x18,0xa5,0x7d, - 0x3c,0x16,0xc1,0x72,0x51,0xb2,0x66,0x45, - 0xdf,0x4c,0x2f,0x87,0xeb,0xc0,0x99,0x2a, - 0xb1,0x77,0xfb,0xa5,0x1d,0xb9,0x2c,0x2a - }; - static const uint8_t alicepk[32] = { - 0x85,0x20,0xf0,0x09,0x89,0x30,0xa7,0x54, - 0x74,0x8b,0x7d,0xdc,0xb4,0x3e,0xf7,0x5a, - 0x0d,0xbf,0x3a,0x0d,0x26,0x38,0x1a,0xf4, - 0xeb,0xa4,0xa9,0x8e,0xaa,0x9b,0x4e,0x6a - }; - const int loop_max=200; - int save_use_ed = curve25519_use_ed; - unsigned char e1[32] = { 5 }; - unsigned char e2[32] = { 5 }; - unsigned char x[32],y[32]; - int i; - int r=0; - - /* Check the most basic possible sanity via the test secret/public key pair - * used in "Cryptography in NaCl - 2. Secret keys and public keys". This - * may catch catastrophic failures on systems where Curve25519 is expensive, - * without requiring a ton of key generation. - */ - curve25519_use_ed = 1; - r |= curve25519_basepoint_impl(x, alicesk); - if (fast_memneq(x, alicepk, 32)) - goto fail; - - /* Ok, the optimization appears to produce passable results, try a few more - * values, maybe there's something subtle wrong. - */ - for (i = 0; i < loop_max; ++i) { - curve25519_use_ed = 0; - r |= curve25519_basepoint_impl(x, e1); - curve25519_use_ed = 1; - r |= curve25519_basepoint_impl(y, e2); - if (fast_memneq(x,y,32)) - goto fail; - memcpy(e1, x, 32); - memcpy(e2, x, 32); - } - - goto end; - // LCOV_EXCL_START -- we can only hit this code if there is a bug in our - // curve25519-basepoint implementation. - fail: - r = -1; - // LCOV_EXCL_STOP - end: - curve25519_use_ed = save_use_ed; - return r; -} - -/** Choose whether to use the ed25519-based curve25519-basepoint - * implementation. */ -static void -pick_curve25519_basepoint_impl(void) -{ - curve25519_use_ed = 1; - - if (curve25519_basepoint_spot_check() == 0) - return; - - /* LCOV_EXCL_START - * only reachable if our basepoint implementation broken */ - log_warn(LD_BUG|LD_CRYPTO, "The ed25519-based curve25519 basepoint " - "multiplication seems broken; using the curve25519 " - "implementation."); - curve25519_use_ed = 0; - /* LCOV_EXCL_STOP */ -} - -/** Initialize the curve25519 implementations. This is necessary if you're - * going to use them in a multithreaded setting, and not otherwise. */ -void -curve25519_init(void) -{ - pick_curve25519_basepoint_impl(); -} - diff --git a/src/tor/src/common/crypto_ed25519.c b/src/tor/src/common/crypto_ed25519.c deleted file mode 100644 index 26523e312..000000000 --- a/src/tor/src/common/crypto_ed25519.c +++ /dev/null @@ -1,816 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto_ed25519.c - * - * \brief Wrapper code for an ed25519 implementation. - * - * Ed25519 is a Schnorr signature on a Twisted Edwards curve, defined - * by Dan Bernstein. For more information, see https://ed25519.cr.yp.to/ - * - * This module wraps our choice of Ed25519 backend, and provides a few - * convenience functions for checking and generating signatures. It also - * provides Tor-specific tools for key blinding and for converting Ed25519 - * keys to and from the corresponding Curve25519 keys. - */ - -#define CRYPTO_ED25519_PRIVATE -#include "orconfig.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif - -#include "crypto.h" - -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "crypto_format.h" -#include "torlog.h" -#include "util.h" -#include "util_format.h" - -#include "ed25519/ref10/ed25519_ref10.h" -#include "ed25519/donna/ed25519_donna_tor.h" - -static void pick_ed25519_impl(void); - -/** An Ed25519 implementation, as a set of function pointers. */ -typedef struct { - int (*selftest)(void); - - int (*seckey)(unsigned char *); - int (*seckey_expand)(unsigned char *, const unsigned char *); - int (*pubkey)(unsigned char *, const unsigned char *); - int (*keygen)(unsigned char *, unsigned char *); - - int (*open)(const unsigned char *, const unsigned char *, size_t, const - unsigned char *); - int (*sign)(unsigned char *, const unsigned char *, size_t, - const unsigned char *, const unsigned char *); - int (*open_batch)(const unsigned char **, size_t *, const unsigned char **, - const unsigned char **, size_t, int *); - - int (*blind_secret_key)(unsigned char *, const unsigned char *, - const unsigned char *); - int (*blind_public_key)(unsigned char *, const unsigned char *, - const unsigned char *); - - int (*pubkey_from_curve25519_pubkey)(unsigned char *, const unsigned char *, - int); - - int (*ed25519_scalarmult_with_group_order)(unsigned char *, - const unsigned char *); -} ed25519_impl_t; - -/** The Ref10 Ed25519 implementation. This one is pure C and lightly - * optimized. */ -static const ed25519_impl_t impl_ref10 = { - NULL, - - ed25519_ref10_seckey, - ed25519_ref10_seckey_expand, - ed25519_ref10_pubkey, - ed25519_ref10_keygen, - - ed25519_ref10_open, - ed25519_ref10_sign, - NULL, - - ed25519_ref10_blind_secret_key, - ed25519_ref10_blind_public_key, - - ed25519_ref10_pubkey_from_curve25519_pubkey, - ed25519_ref10_scalarmult_with_group_order, -}; - -/** The Ref10 Ed25519 implementation. This one is heavily optimized, but still - * mostly C. The C still tends to be heavily platform-specific. */ -static const ed25519_impl_t impl_donna = { - ed25519_donna_selftest, - - ed25519_donna_seckey, - ed25519_donna_seckey_expand, - ed25519_donna_pubkey, - ed25519_donna_keygen, - - ed25519_donna_open, - ed25519_donna_sign, - ed25519_sign_open_batch_donna, - - ed25519_donna_blind_secret_key, - ed25519_donna_blind_public_key, - - ed25519_donna_pubkey_from_curve25519_pubkey, - ed25519_donna_scalarmult_with_group_order, -}; - -/** Which Ed25519 implementation are we using? NULL if we haven't decided - * yet. */ -static const ed25519_impl_t *ed25519_impl = NULL; - -/** Helper: Return our chosen Ed25519 implementation. - * - * This should only be called after we've picked an implementation, but - * it _does_ recover if you forget this. - **/ -static inline const ed25519_impl_t * -get_ed_impl(void) -{ - if (BUG(ed25519_impl == NULL)) { - pick_ed25519_impl(); // LCOV_EXCL_LINE - We always call ed25519_init(). - } - return ed25519_impl; -} - -#ifdef TOR_UNIT_TESTS -/** For testing: used to remember our actual choice of Ed25519 - * implementation */ -static const ed25519_impl_t *saved_ed25519_impl = NULL; -/** For testing: Use the Ed25519 implementation called name until - * crypto_ed25519_testing_restore_impl is called. Recognized names are - * "donna" and "ref10". */ -void -crypto_ed25519_testing_force_impl(const char *name) -{ - tor_assert(saved_ed25519_impl == NULL); - saved_ed25519_impl = ed25519_impl; - if (! strcmp(name, "donna")) { - ed25519_impl = &impl_donna; - } else { - tor_assert(!strcmp(name, "ref10")); - ed25519_impl = &impl_ref10; - } -} -/** For testing: go back to whatever Ed25519 implementation we had picked - * before crypto_ed25519_testing_force_impl was called. - */ -void -crypto_ed25519_testing_restore_impl(void) -{ - ed25519_impl = saved_ed25519_impl; - saved_ed25519_impl = NULL; -} -#endif /* defined(TOR_UNIT_TESTS) */ - -/** - * Initialize a new ed25519 secret key in seckey_out. If - * extra_strong, take the RNG inputs directly from the operating - * system. Return 0 on success, -1 on failure. - */ -int -ed25519_secret_key_generate(ed25519_secret_key_t *seckey_out, - int extra_strong) -{ - int r; - uint8_t seed[32]; - if (extra_strong) - crypto_strongest_rand(seed, sizeof(seed)); - else - crypto_rand((char*)seed, sizeof(seed)); - - r = get_ed_impl()->seckey_expand(seckey_out->seckey, seed); - memwipe(seed, 0, sizeof(seed)); - - return r < 0 ? -1 : 0; -} - -/** - * Given a 32-byte random seed in seed, expand it into an ed25519 - * secret key in seckey_out. Return 0 on success, -1 on failure. - */ -int -ed25519_secret_key_from_seed(ed25519_secret_key_t *seckey_out, - const uint8_t *seed) -{ - if (get_ed_impl()->seckey_expand(seckey_out->seckey, seed) < 0) - return -1; - return 0; -} - -/** - * Given a secret key in seckey, expand it into an - * ed25519 public key. Return 0 on success, -1 on failure. - */ -int -ed25519_public_key_generate(ed25519_public_key_t *pubkey_out, - const ed25519_secret_key_t *seckey) -{ - if (get_ed_impl()->pubkey(pubkey_out->pubkey, seckey->seckey) < 0) - return -1; - return 0; -} - -/** Generate a new ed25519 keypair in keypair_out. If - * extra_strong is set, try to mix some system entropy into the key - * generation process. Return 0 on success, -1 on failure. */ -int -ed25519_keypair_generate(ed25519_keypair_t *keypair_out, int extra_strong) -{ - if (ed25519_secret_key_generate(&keypair_out->seckey, extra_strong) < 0) - return -1; - if (ed25519_public_key_generate(&keypair_out->pubkey, - &keypair_out->seckey)<0) - return -1; - return 0; -} - -/** Return true iff 'pubkey' is set to zero (eg to indicate that it is not - * set). */ -int -ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey) -{ - return tor_mem_is_zero((char*)pubkey->pubkey, ED25519_PUBKEY_LEN); -} - -/* Return a heap-allocated array that contains msg prefixed by the - * string prefix_str. Set final_msg_len_out to the size of the - * final array. If an error occured, return NULL. It's the resonsibility of the - * caller to free the returned array. */ -static uint8_t * -get_prefixed_msg(const uint8_t *msg, size_t msg_len, - const char *prefix_str, - size_t *final_msg_len_out) -{ - size_t prefixed_msg_len, prefix_len; - uint8_t *prefixed_msg; - - tor_assert(prefix_str); - tor_assert(final_msg_len_out); - - prefix_len = strlen(prefix_str); - - /* msg_len + strlen(prefix_str) must not overflow. */ - if (msg_len > SIZE_T_CEILING - prefix_len) { - return NULL; - } - - prefixed_msg_len = msg_len + prefix_len; - prefixed_msg = tor_malloc_zero(prefixed_msg_len); - - memcpy(prefixed_msg, prefix_str, prefix_len); - memcpy(prefixed_msg + prefix_len, msg, msg_len); - - *final_msg_len_out = prefixed_msg_len; - return prefixed_msg; -} - -/** - * Set signature_out to a signature of the len-byte message - * msg, using the secret and public key in keypair. - * - * Return 0 if we successfuly signed the message, otherwise return -1. - */ -int -ed25519_sign(ed25519_signature_t *signature_out, - const uint8_t *msg, size_t len, - const ed25519_keypair_t *keypair) -{ - if (get_ed_impl()->sign(signature_out->sig, msg, len, - keypair->seckey.seckey, - keypair->pubkey.pubkey) < 0) { - return -1; - } - - return 0; -} - -/** - * Like ed25519_sign(), but also prefix msg with prefix_str - * before signing. prefix_str must be a NUL-terminated string. - */ -MOCK_IMPL(int, -ed25519_sign_prefixed,(ed25519_signature_t *signature_out, - const uint8_t *msg, size_t msg_len, - const char *prefix_str, - const ed25519_keypair_t *keypair)) -{ - int retval; - size_t prefixed_msg_len; - uint8_t *prefixed_msg; - - tor_assert(prefix_str); - - prefixed_msg = get_prefixed_msg(msg, msg_len, prefix_str, - &prefixed_msg_len); - if (BUG(!prefixed_msg)) { - /* LCOV_EXCL_START -- only possible when the message and prefix are - * ridiculously huge */ - log_warn(LD_GENERAL, "Failed to get prefixed msg."); - return -1; - /* LCOV_EXCL_STOP */ - } - - retval = ed25519_sign(signature_out, - prefixed_msg, prefixed_msg_len, - keypair); - tor_free(prefixed_msg); - - return retval; -} - -/** - * Check whether if signature is a valid signature for the - * len-byte message in msg made with the key pubkey. - * - * Return 0 if the signature is valid; -1 if it isn't. - */ -MOCK_IMPL(int, -ed25519_checksig,(const ed25519_signature_t *signature, - const uint8_t *msg, size_t len, - const ed25519_public_key_t *pubkey)) -{ - return - get_ed_impl()->open(signature->sig, msg, len, pubkey->pubkey) < 0 ? -1 : 0; -} - -/** - * Like ed2519_checksig(), but also prefix msg with prefix_str - * before verifying signature. prefix_str must be a NUL-terminated - * string. - */ -int -ed25519_checksig_prefixed(const ed25519_signature_t *signature, - const uint8_t *msg, size_t msg_len, - const char *prefix_str, - const ed25519_public_key_t *pubkey) -{ - int retval; - size_t prefixed_msg_len; - uint8_t *prefixed_msg; - - prefixed_msg = get_prefixed_msg(msg, msg_len, prefix_str, - &prefixed_msg_len); - if (BUG(!prefixed_msg)) { - /* LCOV_EXCL_START -- only possible when the message and prefix are - * ridiculously huge */ - log_warn(LD_GENERAL, "Failed to get prefixed msg."); - return -1; - /* LCOV_EXCL_STOP */ - } - - retval = ed25519_checksig(signature, - prefixed_msg, prefixed_msg_len, - pubkey); - tor_free(prefixed_msg); - - return retval; -} - -/** Validate every signature among those in checkable, which contains - * exactly n_checkable elements. If okay_out is non-NULL, set - * the i'th element of okay_out to 1 if the i'th element of - * checkable is valid, and to 0 otherwise. Return 0 if every signature - * was valid. Otherwise return -N, where N is the number of invalid - * signatures. - */ -MOCK_IMPL(int, -ed25519_checksig_batch,(int *okay_out, - const ed25519_checkable_t *checkable, - int n_checkable)) -{ - int i, res; - const ed25519_impl_t *impl = get_ed_impl(); - - if (impl->open_batch == NULL) { - /* No batch verification implementation available, fake it by checking the - * each signature individually. - */ - res = 0; - for (i = 0; i < n_checkable; ++i) { - const ed25519_checkable_t *ch = &checkable[i]; - int r = ed25519_checksig(&ch->signature, ch->msg, ch->len, ch->pubkey); - if (r < 0) - --res; - if (okay_out) - okay_out[i] = (r == 0); - } - } else { - /* ed25519-donna style batch verification available. - * - * Theoretically, this should only be called if n_checkable >= 3, since - * that's the threshold where the batch verification actually kicks in, - * but the only difference is a few mallocs/frees. - */ - const uint8_t **ms; - size_t *lens; - const uint8_t **pks; - const uint8_t **sigs; - int *oks; - int all_ok; - - ms = tor_calloc(n_checkable, sizeof(uint8_t*)); - lens = tor_calloc(n_checkable, sizeof(size_t)); - pks = tor_calloc(n_checkable, sizeof(uint8_t*)); - sigs = tor_calloc(n_checkable, sizeof(uint8_t*)); - oks = okay_out ? okay_out : tor_calloc(n_checkable, sizeof(int)); - - for (i = 0; i < n_checkable; ++i) { - ms[i] = checkable[i].msg; - lens[i] = checkable[i].len; - pks[i] = checkable[i].pubkey->pubkey; - sigs[i] = checkable[i].signature.sig; - oks[i] = 0; - } - - res = 0; - all_ok = impl->open_batch(ms, lens, pks, sigs, n_checkable, oks); - for (i = 0; i < n_checkable; ++i) { - if (!oks[i]) - --res; - } - /* XXX: For now sanity check oks with the return value. Once we have - * more confidence in the code, if `all_ok == 0` we can skip iterating - * over oks since all the signatures were found to be valid. - */ - tor_assert(((res == 0) && !all_ok) || ((res < 0) && all_ok)); - - tor_free(ms); - tor_free(lens); - tor_free(pks); - tor_free(sigs); - if (! okay_out) - tor_free(oks); - } - - return res; -} - -/** - * Given a curve25519 keypair in inp, generate a corresponding - * ed25519 keypair in out, and set signbit_out to the - * sign bit of the X coordinate of the ed25519 key. - * - * NOTE THAT IT IS PROBABLY NOT SAFE TO USE THE GENERATED KEY FOR ANYTHING - * OUTSIDE OF WHAT'S PRESENTED IN PROPOSAL 228. In particular, it's probably - * not a great idea to use it to sign attacker-supplied anything. - */ -int -ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out, - int *signbit_out, - const curve25519_keypair_t *inp) -{ - const char string[] = "Derive high part of ed25519 key from curve25519 key"; - ed25519_public_key_t pubkey_check; - crypto_digest_t *ctx; - uint8_t sha512_output[DIGEST512_LEN]; - - memcpy(out->seckey.seckey, inp->seckey.secret_key, 32); - - ctx = crypto_digest512_new(DIGEST_SHA512); - crypto_digest_add_bytes(ctx, (const char*)out->seckey.seckey, 32); - crypto_digest_add_bytes(ctx, (const char*)string, sizeof(string)); - crypto_digest_get_digest(ctx, (char *)sha512_output, sizeof(sha512_output)); - crypto_digest_free(ctx); - memcpy(out->seckey.seckey + 32, sha512_output, 32); - - ed25519_public_key_generate(&out->pubkey, &out->seckey); - - *signbit_out = out->pubkey.pubkey[31] >> 7; - - ed25519_public_key_from_curve25519_public_key(&pubkey_check, &inp->pubkey, - *signbit_out); - - tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32)); - - memwipe(&pubkey_check, 0, sizeof(pubkey_check)); - memwipe(sha512_output, 0, sizeof(sha512_output)); - - return 0; -} - -/** - * Given a curve25519 public key and sign bit of X coordinate of the ed25519 - * public key, generate the corresponding ed25519 public key. - */ -int -ed25519_public_key_from_curve25519_public_key(ed25519_public_key_t *pubkey, - const curve25519_public_key_t *pubkey_in, - int signbit) -{ - return get_ed_impl()->pubkey_from_curve25519_pubkey(pubkey->pubkey, - pubkey_in->public_key, - signbit); -} - -/** - * Given an ed25519 keypair in inp, generate a corresponding - * ed25519 keypair in out, blinded by the corresponding 32-byte input - * in 'param'. - * - * Tor uses key blinding for the "next-generation" hidden services design: - * service descriptors are encrypted with a key derived from the service's - * long-term public key, and then signed with (and stored at a position - * indexed by) a short-term key derived by blinding the long-term keys. - * - * Return 0 if blinding was successful, else return -1. */ -int -ed25519_keypair_blind(ed25519_keypair_t *out, - const ed25519_keypair_t *inp, - const uint8_t *param) -{ - ed25519_public_key_t pubkey_check; - - get_ed_impl()->blind_secret_key(out->seckey.seckey, - inp->seckey.seckey, param); - - if (ed25519_public_blind(&pubkey_check, &inp->pubkey, param) < 0) { - return -1; - } - ed25519_public_key_generate(&out->pubkey, &out->seckey); - - tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32)); - - memwipe(&pubkey_check, 0, sizeof(pubkey_check)); - - return 0; -} - -/** - * Given an ed25519 public key in inp, generate a corresponding blinded - * public key in out, blinded with the 32-byte parameter in - * param. Return 0 on sucess, -1 on railure. - */ -int -ed25519_public_blind(ed25519_public_key_t *out, - const ed25519_public_key_t *inp, - const uint8_t *param) -{ - return get_ed_impl()->blind_public_key(out->pubkey, inp->pubkey, param); -} - -/** - * Store seckey unencrypted to filename, marking it with tag. - * Return 0 on success, -1 on failure. - */ -int -ed25519_seckey_write_to_file(const ed25519_secret_key_t *seckey, - const char *filename, - const char *tag) -{ - return crypto_write_tagged_contents_to_file(filename, - "ed25519v1-secret", - tag, - seckey->seckey, - sizeof(seckey->seckey)); -} - -/** - * Read seckey unencrypted from filename, storing it into - * seckey_out. Set *tag_out to the tag it was marked with. - * Return 0 on success, -1 on failure. - */ -int -ed25519_seckey_read_from_file(ed25519_secret_key_t *seckey_out, - char **tag_out, - const char *filename) -{ - ssize_t len; - - len = crypto_read_tagged_contents_from_file(filename, "ed25519v1-secret", - tag_out, seckey_out->seckey, - sizeof(seckey_out->seckey)); - if (len == sizeof(seckey_out->seckey)) { - return 0; - } else if (len >= 0) { - errno = EINVAL; - } - - tor_free(*tag_out); - return -1; -} - -/** - * Store pubkey unencrypted to filename, marking it with tag. - * Return 0 on success, -1 on failure. - */ -int -ed25519_pubkey_write_to_file(const ed25519_public_key_t *pubkey, - const char *filename, - const char *tag) -{ - return crypto_write_tagged_contents_to_file(filename, - "ed25519v1-public", - tag, - pubkey->pubkey, - sizeof(pubkey->pubkey)); -} - -/** - * Store pubkey unencrypted to filename, marking it with tag. - * Return 0 on success, -1 on failure. - */ -int -ed25519_pubkey_read_from_file(ed25519_public_key_t *pubkey_out, - char **tag_out, - const char *filename) -{ - ssize_t len; - - len = crypto_read_tagged_contents_from_file(filename, "ed25519v1-public", - tag_out, pubkey_out->pubkey, - sizeof(pubkey_out->pubkey)); - if (len == sizeof(pubkey_out->pubkey)) { - return 0; - } else if (len >= 0) { - errno = EINVAL; - } - - tor_free(*tag_out); - return -1; -} - -/** Release all storage held for kp. */ -void -ed25519_keypair_free_(ed25519_keypair_t *kp) -{ - if (! kp) - return; - - memwipe(kp, 0, sizeof(*kp)); - tor_free(kp); -} - -/** Return true iff key1 and key2 are the same public key. */ -int -ed25519_pubkey_eq(const ed25519_public_key_t *key1, - const ed25519_public_key_t *key2) -{ - tor_assert(key1); - tor_assert(key2); - return tor_memeq(key1->pubkey, key2->pubkey, ED25519_PUBKEY_LEN); -} - -/** - * Set dest to contain the same key as src. - */ -void -ed25519_pubkey_copy(ed25519_public_key_t *dest, - const ed25519_public_key_t *src) -{ - tor_assert(dest); - tor_assert(src); - memcpy(dest, src, sizeof(ed25519_public_key_t)); -} - -/** Check whether the given Ed25519 implementation seems to be working. - * If so, return 0; otherwise return -1. */ -MOCK_IMPL(STATIC int, -ed25519_impl_spot_check,(void)) -{ - static const uint8_t alicesk[32] = { - 0xc5,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b, - 0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1, - 0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b, - 0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7 - }; - static const uint8_t alicepk[32] = { - 0xfc,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3, - 0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58, - 0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac, - 0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25 - }; - static const uint8_t alicemsg[2] = { 0xaf, 0x82 }; - static const uint8_t alicesig[64] = { - 0x62,0x91,0xd6,0x57,0xde,0xec,0x24,0x02, - 0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3, - 0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44, - 0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac, - 0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90, - 0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59, - 0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d, - 0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a - }; - const ed25519_impl_t *impl = get_ed_impl(); - uint8_t sk[ED25519_SECKEY_LEN]; - uint8_t pk[ED25519_PUBKEY_LEN]; - uint8_t sig[ED25519_SIG_LEN]; - int r = 0; - - /* Some implementations (eg: The modified Ed25519-donna) have handy self-test - * code that sanity-checks the internals. If present, use that to screen out - * catastrophic errors like massive compiler failure. - */ - if (impl->selftest && impl->selftest() != 0) - goto fail; - - /* Validate results versus known answer tests. People really should be - * running "make test" instead of relying on this, but it's better than - * nothing. - * - * Test vectors taken from "EdDSA & Ed25519 - 6. Test Vectors for Ed25519 - * (TEST3)" (draft-josefsson-eddsa-ed25519-03). - */ - - /* Key expansion, public key derivation. */ - if (impl->seckey_expand(sk, alicesk) < 0) - goto fail; - if (impl->pubkey(pk, sk) < 0) - goto fail; - if (fast_memneq(pk, alicepk, ED25519_PUBKEY_LEN)) - goto fail; - - /* Signing, verification. */ - if (impl->sign(sig, alicemsg, sizeof(alicemsg), sk, pk) < 0) - return -1; - if (fast_memneq(sig, alicesig, ED25519_SIG_LEN)) - return -1; - if (impl->open(sig, alicemsg, sizeof(alicemsg), pk) < 0) - return -1; - - /* XXX/yawning: Someone that's more paranoid than I am, can write "Assume - * ref0 is cannonical, and fuzz impl against it" if they want, but I doubt - * that will catch anything that the known answer tests won't. - */ - goto end; - - // LCOV_EXCL_START -- We can only reach this if our ed25519 implementation is - // broken. - fail: - r = -1; - // LCOV_EXCL_STOP - end: - return r; -} - -/** Force the Ed25519 implementation to a given one, without sanity checking - * the output. Used for testing. - */ -void -ed25519_set_impl_params(int use_donna) -{ - if (use_donna) - ed25519_impl = &impl_donna; - else - ed25519_impl = &impl_ref10; -} - -/** Choose whether to use the Ed25519-donna implementation. */ -static void -pick_ed25519_impl(void) -{ - ed25519_impl = &impl_donna; - - if (ed25519_impl_spot_check() == 0) - return; - - /* LCOV_EXCL_START - * unreachable unless ed25519_donna is broken */ - log_warn(LD_CRYPTO, "The Ed25519-donna implementation seems broken; using " - "the ref10 implementation."); - ed25519_impl = &impl_ref10; - /* LCOV_EXCL_STOP */ -} - -/* Initialize the Ed25519 implementation. This is neccessary if you're - * going to use them in a multithreaded setting, and not otherwise. */ -void -ed25519_init(void) -{ - pick_ed25519_impl(); -} - -/* Return true if point is the identity element of the ed25519 group. */ -static int -ed25519_point_is_identity_element(const uint8_t *point) -{ - /* The identity element in ed25159 is the point with coordinates (0,1). */ - static const uint8_t ed25519_identity[32] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - tor_assert(sizeof(ed25519_identity) == ED25519_PUBKEY_LEN); - return tor_memeq(point, ed25519_identity, sizeof(ed25519_identity)); -} - -/** Validate pubkey to ensure that it has no torsion component. - * Return 0 if pubkey is valid, else return -1. */ -int -ed25519_validate_pubkey(const ed25519_public_key_t *pubkey) -{ - uint8_t result[32] = {9}; - - /* First check that we were not given the identity element */ - if (ed25519_point_is_identity_element(pubkey->pubkey)) { - log_warn(LD_CRYPTO, "ed25519 pubkey is the identity"); - return -1; - } - - /* For any point on the curve, doing l*point should give the identity element - * (where l is the group order). Do the computation and check that the - * identity element is returned. */ - if (get_ed_impl()->ed25519_scalarmult_with_group_order(result, - pubkey->pubkey) < 0) { - log_warn(LD_CRYPTO, "ed25519 group order scalarmult failed"); - return -1; - } - - if (!ed25519_point_is_identity_element(result)) { - log_warn(LD_CRYPTO, "ed25519 validation failed"); - return -1; - } - - return 0; -} - diff --git a/src/tor/src/common/crypto_ed25519.h b/src/tor/src/common/crypto_ed25519.h deleted file mode 100644 index 74269ccff..000000000 --- a/src/tor/src/common/crypto_ed25519.h +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CRYPTO_ED25519_H -#define TOR_CRYPTO_ED25519_H - -#include "testsupport.h" -#include "torint.h" -#include "crypto_curve25519.h" -#include "util.h" - -#define ED25519_PUBKEY_LEN 32 -#define ED25519_SECKEY_LEN 64 -#define ED25519_SECKEY_SEED_LEN 32 -#define ED25519_SIG_LEN 64 - -/** An Ed25519 signature. */ -typedef struct { - uint8_t sig[ED25519_SIG_LEN]; -} ed25519_signature_t; - -/** An Ed25519 public key */ -typedef struct { - uint8_t pubkey[ED25519_PUBKEY_LEN]; -} ed25519_public_key_t; - -/** An Ed25519 secret key */ -typedef struct { - /** Note that we store secret keys in an expanded format that doesn't match - * the format from standard ed25519. Ed25519 stores a 32-byte value k and - * expands it into a 64-byte H(k), using the first 32 bytes for a multiplier - * of the base point, and second 32 bytes as an input to a hash function - * for deriving r. But because we implement key blinding, we need to store - * keys in the 64-byte expanded form. */ - uint8_t seckey[ED25519_SECKEY_LEN]; -} ed25519_secret_key_t; - -/** An Ed25519 keypair. */ -typedef struct { - ed25519_public_key_t pubkey; - ed25519_secret_key_t seckey; -} ed25519_keypair_t; - -int ed25519_secret_key_generate(ed25519_secret_key_t *seckey_out, - int extra_strong); -int ed25519_secret_key_from_seed(ed25519_secret_key_t *seckey_out, - const uint8_t *seed); - -int ed25519_public_key_generate(ed25519_public_key_t *pubkey_out, - const ed25519_secret_key_t *seckey); -int ed25519_keypair_generate(ed25519_keypair_t *keypair_out, int extra_strong); -int ed25519_sign(ed25519_signature_t *signature_out, - const uint8_t *msg, size_t len, - const ed25519_keypair_t *key); -MOCK_DECL(int,ed25519_checksig,(const ed25519_signature_t *signature, - const uint8_t *msg, size_t len, - const ed25519_public_key_t *pubkey)); - -MOCK_DECL(int, -ed25519_sign_prefixed,(ed25519_signature_t *signature_out, - const uint8_t *msg, size_t len, - const char *prefix_str, - const ed25519_keypair_t *keypair)); - -int -ed25519_checksig_prefixed(const ed25519_signature_t *signature, - const uint8_t *msg, size_t len, - const char *prefix_str, - const ed25519_public_key_t *pubkey); - -int ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey); - -/** - * A collection of information necessary to check an Ed25519 signature. Used - * for batch verification. - */ -typedef struct { - /** The public key that supposedly generated the signature. */ - const ed25519_public_key_t *pubkey; - /** The signature to check. */ - ed25519_signature_t signature; - /** The message that the signature is supposed to have been applied to. */ - const uint8_t *msg; - /** The length of the message. */ - size_t len; -} ed25519_checkable_t; - -MOCK_DECL(int, ed25519_checksig_batch,(int *okay_out, - const ed25519_checkable_t *checkable, - int n_checkable)); - -int ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out, - int *signbit_out, - const curve25519_keypair_t *inp); - -int ed25519_public_key_from_curve25519_public_key(ed25519_public_key_t *pubkey, - const curve25519_public_key_t *pubkey_in, - int signbit); -int ed25519_keypair_blind(ed25519_keypair_t *out, - const ed25519_keypair_t *inp, - const uint8_t *param); -int ed25519_public_blind(ed25519_public_key_t *out, - const ed25519_public_key_t *inp, - const uint8_t *param); - -/* XXXX read encrypted, write encrypted. */ - -int ed25519_seckey_write_to_file(const ed25519_secret_key_t *seckey, - const char *filename, - const char *tag); -int ed25519_seckey_read_from_file(ed25519_secret_key_t *seckey_out, - char **tag_out, - const char *filename); -int ed25519_pubkey_write_to_file(const ed25519_public_key_t *pubkey, - const char *filename, - const char *tag); -int ed25519_pubkey_read_from_file(ed25519_public_key_t *pubkey_out, - char **tag_out, - const char *filename); - -void ed25519_keypair_free_(ed25519_keypair_t *kp); -#define ed25519_keypair_free(kp) \ - FREE_AND_NULL(ed25519_keypair_t, ed25519_keypair_free_, (kp)) - -int ed25519_pubkey_eq(const ed25519_public_key_t *key1, - const ed25519_public_key_t *key2); -void ed25519_pubkey_copy(ed25519_public_key_t *dest, - const ed25519_public_key_t *src); - -void ed25519_set_impl_params(int use_donna); -void ed25519_init(void); - -int ed25519_validate_pubkey(const ed25519_public_key_t *pubkey); - -#ifdef TOR_UNIT_TESTS -void crypto_ed25519_testing_force_impl(const char *name); -void crypto_ed25519_testing_restore_impl(void); -#endif - -#ifdef CRYPTO_ED25519_PRIVATE -MOCK_DECL(STATIC int, ed25519_impl_spot_check, (void)); -#endif - -#endif /* !defined(TOR_CRYPTO_ED25519_H) */ - diff --git a/src/tor/src/common/crypto_format.c b/src/tor/src/common/crypto_format.c deleted file mode 100644 index 1d090a877..000000000 --- a/src/tor/src/common/crypto_format.c +++ /dev/null @@ -1,298 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto_format.c - * - * \brief Formatting and parsing code for crypto-related data structures. - */ - -#include "orconfig.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif -#include "container.h" -#include "crypto.h" -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "crypto_format.h" -#include "util.h" -#include "util_format.h" -#include "torlog.h" - -/** Write the datalen bytes from data to the file named - * fname in the tagged-data format. This format contains a - * 32-byte header, followed by the data itself. The header is the - * NUL-padded string "== typestring: tag ==". The length - * of typestring and tag must therefore be no more than - * 24. - **/ -int -crypto_write_tagged_contents_to_file(const char *fname, - const char *typestring, - const char *tag, - const uint8_t *data, - size_t datalen) -{ - char header[32]; - smartlist_t *chunks = smartlist_new(); - sized_chunk_t ch0, ch1; - int r = -1; - - memset(header, 0, sizeof(header)); - if (tor_snprintf(header, sizeof(header), - "== %s: %s ==", typestring, tag) < 0) - goto end; - ch0.bytes = header; - ch0.len = 32; - ch1.bytes = (const char*) data; - ch1.len = datalen; - smartlist_add(chunks, &ch0); - smartlist_add(chunks, &ch1); - - r = write_chunks_to_file(fname, chunks, 1, 0); - - end: - smartlist_free(chunks); - return r; -} - -/** Read a tagged-data file from fname into the - * data_out_len-byte buffer in data_out. Check that the - * typestring matches typestring; store the tag into a newly allocated - * string in tag_out. Return -1 on failure, and the number of bytes of - * data on success. Preserves the errno from reading the file. */ -ssize_t -crypto_read_tagged_contents_from_file(const char *fname, - const char *typestring, - char **tag_out, - uint8_t *data_out, - ssize_t data_out_len) -{ - char prefix[33]; - char *content = NULL; - struct stat st; - ssize_t r = -1; - size_t st_size = 0; - int saved_errno = 0; - - *tag_out = NULL; - st.st_size = 0; - content = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); - if (! content) { - saved_errno = errno; - goto end; - } - if (st.st_size < 32 || st.st_size > 32 + data_out_len) { - saved_errno = EINVAL; - goto end; - } - st_size = (size_t)st.st_size; - - memcpy(prefix, content, 32); - prefix[32] = 0; - /* Check type, extract tag. */ - if (strcmpstart(prefix, "== ") || strcmpend(prefix, " ==") || - ! tor_mem_is_zero(prefix+strlen(prefix), 32-strlen(prefix))) { - saved_errno = EINVAL; - goto end; - } - - if (strcmpstart(prefix+3, typestring) || - 3+strlen(typestring) >= 32 || - strcmpstart(prefix+3+strlen(typestring), ": ")) { - saved_errno = EINVAL; - goto end; - } - - *tag_out = tor_strndup(prefix+5+strlen(typestring), - strlen(prefix)-8-strlen(typestring)); - - memcpy(data_out, content+32, st_size-32); - r = st_size - 32; - - end: - if (content) - memwipe(content, 0, st_size); - tor_free(content); - if (saved_errno) - errno = saved_errno; - return r; -} - -/** Encode pkey as a base64-encoded string, without trailing "=" - * characters, in the buffer output, which must have at least - * CURVE25519_BASE64_PADDED_LEN+1 bytes available. Return 0 on success, -1 on - * failure. */ -int -curve25519_public_to_base64(char *output, - const curve25519_public_key_t *pkey) -{ - char buf[128]; - base64_encode(buf, sizeof(buf), - (const char*)pkey->public_key, CURVE25519_PUBKEY_LEN, 0); - buf[CURVE25519_BASE64_PADDED_LEN] = '\0'; - memcpy(output, buf, CURVE25519_BASE64_PADDED_LEN+1); - return 0; -} - -/** Try to decode a base64-encoded curve25519 public key from input - * into the object at pkey. Return 0 on success, -1 on failure. - * Accepts keys with or without a trailing "=". */ -int -curve25519_public_from_base64(curve25519_public_key_t *pkey, - const char *input) -{ - size_t len = strlen(input); - if (len == CURVE25519_BASE64_PADDED_LEN - 1) { - /* not padded */ - return digest256_from_base64((char*)pkey->public_key, input); - } else if (len == CURVE25519_BASE64_PADDED_LEN) { - char buf[128]; - if (base64_decode(buf, sizeof(buf), input, len) != CURVE25519_PUBKEY_LEN) - return -1; - memcpy(pkey->public_key, buf, CURVE25519_PUBKEY_LEN); - return 0; - } else { - return -1; - } -} - -/** For logging convenience: Convert pkey to a statically allocated - * base64 string and return it. Not threadsafe. Format not meant to be - * computer-readable; it may change in the future. Subsequent calls invalidate - * previous returns. */ -const char * -ed25519_fmt(const ed25519_public_key_t *pkey) -{ - static char formatted[ED25519_BASE64_LEN+1]; - if (pkey) { - if (ed25519_public_key_is_zero(pkey)) { - strlcpy(formatted, "", sizeof(formatted)); - } else { - int r = ed25519_public_to_base64(formatted, pkey); - tor_assert(!r); - } - } else { - strlcpy(formatted, "", sizeof(formatted)); - } - return formatted; -} - -/** Try to decode the string input into an ed25519 public key. On - * success, store the value in pkey and return 0. Otherwise return - * -1. */ -int -ed25519_public_from_base64(ed25519_public_key_t *pkey, - const char *input) -{ - return digest256_from_base64((char*)pkey->pubkey, input); -} - -/** Encode the public key pkey into the buffer at output, - * which must have space for ED25519_BASE64_LEN bytes of encoded key, - * plus one byte for a terminating NUL. Return 0 on success, -1 on failure. - */ -int -ed25519_public_to_base64(char *output, - const ed25519_public_key_t *pkey) -{ - return digest256_to_base64(output, (const char *)pkey->pubkey); -} - -/** Encode the signature sig into the buffer at output, - * which must have space for ED25519_SIG_BASE64_LEN bytes of encoded signature, - * plus one byte for a terminating NUL. Return 0 on success, -1 on failure. - */ -int -ed25519_signature_to_base64(char *output, - const ed25519_signature_t *sig) -{ - char buf[256]; - int n = base64_encode_nopad(buf, sizeof(buf), sig->sig, ED25519_SIG_LEN); - tor_assert(n == ED25519_SIG_BASE64_LEN); - memcpy(output, buf, ED25519_SIG_BASE64_LEN+1); - return 0; -} - -/** Try to decode the string input into an ed25519 signature. On - * success, store the value in sig and return 0. Otherwise return - * -1. */ -int -ed25519_signature_from_base64(ed25519_signature_t *sig, - const char *input) -{ - - if (strlen(input) != ED25519_SIG_BASE64_LEN) - return -1; - char buf[ED25519_SIG_BASE64_LEN+3]; - memcpy(buf, input, ED25519_SIG_BASE64_LEN); - buf[ED25519_SIG_BASE64_LEN+0] = '='; - buf[ED25519_SIG_BASE64_LEN+1] = '='; - buf[ED25519_SIG_BASE64_LEN+2] = 0; - char decoded[128]; - int n = base64_decode(decoded, sizeof(decoded), buf, strlen(buf)); - if (n < 0 || n != ED25519_SIG_LEN) - return -1; - memcpy(sig->sig, decoded, ED25519_SIG_LEN); - - return 0; -} - -/** Base64 encode DIGEST_LINE bytes from digest, remove the trailing = - * characters, and store the nul-terminated result in the first - * BASE64_DIGEST_LEN+1 bytes of d64. */ -/* XXXX unify with crypto_format.c code */ -int -digest_to_base64(char *d64, const char *digest) -{ - char buf[256]; - base64_encode(buf, sizeof(buf), digest, DIGEST_LEN, 0); - buf[BASE64_DIGEST_LEN] = '\0'; - memcpy(d64, buf, BASE64_DIGEST_LEN+1); - return 0; -} - -/** Given a base64 encoded, nul-terminated digest in d64 (without - * trailing newline or = characters), decode it and store the result in the - * first DIGEST_LEN bytes at digest. */ -/* XXXX unify with crypto_format.c code */ -int -digest_from_base64(char *digest, const char *d64) -{ - if (base64_decode(digest, DIGEST_LEN, d64, strlen(d64)) == DIGEST_LEN) - return 0; - else - return -1; -} - -/** Base64 encode DIGEST256_LINE bytes from digest, remove the - * trailing = characters, and store the nul-terminated result in the first - * BASE64_DIGEST256_LEN+1 bytes of d64. */ - /* XXXX unify with crypto_format.c code */ -int -digest256_to_base64(char *d64, const char *digest) -{ - char buf[256]; - base64_encode(buf, sizeof(buf), digest, DIGEST256_LEN, 0); - buf[BASE64_DIGEST256_LEN] = '\0'; - memcpy(d64, buf, BASE64_DIGEST256_LEN+1); - return 0; -} - -/** Given a base64 encoded, nul-terminated digest in d64 (without - * trailing newline or = characters), decode it and store the result in the - * first DIGEST256_LEN bytes at digest. */ -/* XXXX unify with crypto_format.c code */ -int -digest256_from_base64(char *digest, const char *d64) -{ - if (base64_decode(digest, DIGEST256_LEN, d64, strlen(d64)) == DIGEST256_LEN) - return 0; - else - return -1; -} - diff --git a/src/tor/src/common/crypto_format.h b/src/tor/src/common/crypto_format.h deleted file mode 100644 index bbd85dc72..000000000 --- a/src/tor/src/common/crypto_format.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CRYPTO_FORMAT_H -#define TOR_CRYPTO_FORMAT_H - -#include "testsupport.h" -#include "torint.h" -#include "crypto_ed25519.h" - -int crypto_write_tagged_contents_to_file(const char *fname, - const char *typestring, - const char *tag, - const uint8_t *data, - size_t datalen); - -ssize_t crypto_read_tagged_contents_from_file(const char *fname, - const char *typestring, - char **tag_out, - uint8_t *data_out, - ssize_t data_out_len); - -#define ED25519_BASE64_LEN 43 -int ed25519_public_from_base64(ed25519_public_key_t *pkey, - const char *input); -int ed25519_public_to_base64(char *output, - const ed25519_public_key_t *pkey); -const char *ed25519_fmt(const ed25519_public_key_t *pkey); - -/* XXXX move these to crypto_format.h */ -#define ED25519_SIG_BASE64_LEN 86 - -int ed25519_signature_from_base64(ed25519_signature_t *sig, - const char *input); -int ed25519_signature_to_base64(char *output, - const ed25519_signature_t *sig); - -int digest_to_base64(char *d64, const char *digest); -int digest_from_base64(char *digest, const char *d64); -int digest256_to_base64(char *d64, const char *digest); -int digest256_from_base64(char *digest, const char *d64); - -#endif /* !defined(TOR_CRYPTO_FORMAT_H) */ - diff --git a/src/tor/src/common/crypto_pwbox.c b/src/tor/src/common/crypto_pwbox.c deleted file mode 100644 index 12acc9331..000000000 --- a/src/tor/src/common/crypto_pwbox.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto_pwbox.c - * - * \brief Code for encrypting secrets in a password-protected form and saving - * them to disk. - */ - -#include "crypto.h" -#include "crypto_s2k.h" -#include "crypto_pwbox.h" -#include "di_ops.h" -#include "util.h" -#include "pwbox.h" - -/* 8 bytes "TORBOX00" - 1 byte: header len (H) - H bytes: header, denoting secret key algorithm. - 16 bytes: IV - Round up to multiple of 128 bytes, then encrypt: - 4 bytes: data len - data - zeros - 32 bytes: HMAC-SHA256 of all previous bytes. -*/ - -#define MAX_OVERHEAD (S2K_MAXLEN + 8 + 1 + 32 + CIPHER_IV_LEN) - -/** - * Make an authenticated passphrase-encrypted blob to encode the - * input_len bytes in input using the passphrase - * secret of secret_len bytes. Allocate a new chunk of memory - * to hold the encrypted data, and store a pointer to that memory in - * *out, and its size in outlen_out. Use s2k_flags as an - * argument to the passphrase-hashing function. - */ -int -crypto_pwbox(uint8_t **out, size_t *outlen_out, - const uint8_t *input, size_t input_len, - const char *secret, size_t secret_len, - unsigned s2k_flags) -{ - uint8_t *result = NULL, *encrypted_portion; - size_t encrypted_len = 128 * CEIL_DIV(input_len+4, 128); - ssize_t result_len; - int spec_len; - uint8_t keys[CIPHER_KEY_LEN + DIGEST256_LEN]; - pwbox_encoded_t *enc = NULL; - ssize_t enc_len; - - crypto_cipher_t *cipher; - int rv; - - enc = pwbox_encoded_new(); - - pwbox_encoded_setlen_skey_header(enc, S2K_MAXLEN); - - spec_len = secret_to_key_make_specifier( - pwbox_encoded_getarray_skey_header(enc), - S2K_MAXLEN, - s2k_flags); - if (BUG(spec_len < 0 || spec_len > S2K_MAXLEN)) - goto err; - pwbox_encoded_setlen_skey_header(enc, spec_len); - enc->header_len = spec_len; - - crypto_rand((char*)enc->iv, sizeof(enc->iv)); - - pwbox_encoded_setlen_data(enc, encrypted_len); - encrypted_portion = pwbox_encoded_getarray_data(enc); - - set_uint32(encrypted_portion, htonl((uint32_t)input_len)); - memcpy(encrypted_portion+4, input, input_len); - - /* Now that all the data is in position, derive some keys, encrypt, and - * digest */ - const int s2k_rv = secret_to_key_derivekey(keys, sizeof(keys), - pwbox_encoded_getarray_skey_header(enc), - spec_len, - secret, secret_len); - if (BUG(s2k_rv < 0)) - goto err; - - cipher = crypto_cipher_new_with_iv((char*)keys, (char*)enc->iv); - crypto_cipher_crypt_inplace(cipher, (char*)encrypted_portion, encrypted_len); - crypto_cipher_free(cipher); - - result_len = pwbox_encoded_encoded_len(enc); - if (BUG(result_len < 0)) - goto err; - result = tor_malloc(result_len); - enc_len = pwbox_encoded_encode(result, result_len, enc); - if (BUG(enc_len < 0)) - goto err; - tor_assert(enc_len == result_len); - - crypto_hmac_sha256((char*) result + result_len - 32, - (const char*)keys + CIPHER_KEY_LEN, - DIGEST256_LEN, - (const char*)result, - result_len - 32); - - *out = result; - *outlen_out = result_len; - rv = 0; - goto out; - - /* LCOV_EXCL_START - - This error case is often unreachable if we're correctly coded, unless - somebody adds a new error case somewhere, or unless you're building - without scrypto support. - - - make_specifier can't fail, unless S2K_MAX_LEN is too short. - - secret_to_key_derivekey can't really fail unless we're missing - scrypt, or the underlying function fails, or we pass it a bogus - algorithm or parameters. - - pwbox_encoded_encoded_len can't fail unless we're using trunnel - incorrectly. - - pwbox_encoded_encode can't fail unless we're using trunnel wrong, - or it's buggy. - */ - err: - tor_free(result); - rv = -1; - /* LCOV_EXCL_STOP */ - out: - pwbox_encoded_free(enc); - memwipe(keys, 0, sizeof(keys)); - return rv; -} - -/** - * Try to decrypt the passphrase-encrypted blob of input_len bytes in - * input using the passphrase secret of secret_len bytes. - * On success, return 0 and allocate a new chunk of memory to hold the - * decrypted data, and store a pointer to that memory in *out, and its - * size in outlen_out. On failure, return UNPWBOX_BAD_SECRET if - * the passphrase might have been wrong, and UNPWBOX_CORRUPT if the object is - * definitely corrupt. - */ -int -crypto_unpwbox(uint8_t **out, size_t *outlen_out, - const uint8_t *inp, size_t input_len, - const char *secret, size_t secret_len) -{ - uint8_t *result = NULL; - const uint8_t *encrypted; - uint8_t keys[CIPHER_KEY_LEN + DIGEST256_LEN]; - uint8_t hmac[DIGEST256_LEN]; - uint32_t result_len; - size_t encrypted_len; - crypto_cipher_t *cipher = NULL; - int rv = UNPWBOX_CORRUPTED; - ssize_t got_len; - - pwbox_encoded_t *enc = NULL; - - got_len = pwbox_encoded_parse(&enc, inp, input_len); - if (got_len < 0 || (size_t)got_len != input_len) - goto err; - - /* Now derive the keys and check the hmac. */ - if (secret_to_key_derivekey(keys, sizeof(keys), - pwbox_encoded_getarray_skey_header(enc), - pwbox_encoded_getlen_skey_header(enc), - secret, secret_len) < 0) - goto err; - - crypto_hmac_sha256((char *)hmac, - (const char*)keys + CIPHER_KEY_LEN, DIGEST256_LEN, - (const char*)inp, input_len - DIGEST256_LEN); - - if (tor_memneq(hmac, enc->hmac, DIGEST256_LEN)) { - rv = UNPWBOX_BAD_SECRET; - goto err; - } - - /* How long is the plaintext? */ - encrypted = pwbox_encoded_getarray_data(enc); - encrypted_len = pwbox_encoded_getlen_data(enc); - if (encrypted_len < 4) - goto err; - - cipher = crypto_cipher_new_with_iv((char*)keys, (char*)enc->iv); - crypto_cipher_decrypt(cipher, (char*)&result_len, (char*)encrypted, 4); - result_len = ntohl(result_len); - if (encrypted_len < result_len + 4) - goto err; - - /* Allocate a buffer and decrypt */ - result = tor_malloc_zero(result_len); - crypto_cipher_decrypt(cipher, (char*)result, (char*)encrypted+4, result_len); - - *out = result; - *outlen_out = result_len; - - rv = UNPWBOX_OKAY; - goto out; - - err: - tor_free(result); - - out: - crypto_cipher_free(cipher); - pwbox_encoded_free(enc); - memwipe(keys, 0, sizeof(keys)); - return rv; -} - diff --git a/src/tor/src/common/crypto_pwbox.h b/src/tor/src/common/crypto_pwbox.h deleted file mode 100644 index a26b6d2c1..000000000 --- a/src/tor/src/common/crypto_pwbox.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef CRYPTO_PWBOX_H_INCLUDED_ -#define CRYPTO_PWBOX_H_INCLUDED_ - -#include "torint.h" - -#define UNPWBOX_OKAY 0 -#define UNPWBOX_BAD_SECRET -1 -#define UNPWBOX_CORRUPTED -2 - -int crypto_pwbox(uint8_t **out, size_t *outlen_out, - const uint8_t *inp, size_t input_len, - const char *secret, size_t secret_len, - unsigned s2k_flags); - -int crypto_unpwbox(uint8_t **out, size_t *outlen_out, - const uint8_t *inp, size_t input_len, - const char *secret, size_t secret_len); - -#endif /* !defined(CRYPTO_PWBOX_H_INCLUDED_) */ - diff --git a/src/tor/src/common/crypto_s2k.c b/src/tor/src/common/crypto_s2k.c deleted file mode 100644 index b2fcca54c..000000000 --- a/src/tor/src/common/crypto_s2k.c +++ /dev/null @@ -1,472 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto_s2k.c - * - * \brief Functions for deriving keys from human-readable passphrases. - */ - -#define CRYPTO_S2K_PRIVATE - -#include "crypto.h" -#include "util.h" -#include "compat.h" -#include "crypto_s2k.h" - -#include - -#if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT) -#define HAVE_SCRYPT -#include -#endif - -/* Encoded secrets take the form: - - u8 type; - u8 salt_and_parameters[depends on type]; - u8 key[depends on type]; - - As a special case, if the encoded secret is exactly 29 bytes long, - type 0 is understood. - - Recognized types are: - 00 -- RFC2440. salt_and_parameters is 9 bytes. key is 20 bytes. - salt_and_parameters is 8 bytes random salt, - 1 byte iteration info. - 01 -- PKBDF2_SHA1. salt_and_parameters is 17 bytes. key is 20 bytes. - salt_and_parameters is 16 bytes random salt, - 1 byte iteration info. - 02 -- SCRYPT_SALSA208_SHA256. salt_and_parameters is 18 bytes. key is - 32 bytes. - salt_and_parameters is 18 bytes random salt, 2 bytes iteration - info. -*/ - -#define S2K_TYPE_RFC2440 0 -#define S2K_TYPE_PBKDF2 1 -#define S2K_TYPE_SCRYPT 2 - -#define PBKDF2_SPEC_LEN 17 -#define PBKDF2_KEY_LEN 20 - -#define SCRYPT_SPEC_LEN 18 -#define SCRYPT_KEY_LEN 32 - -/** Given an algorithm ID (one of S2K_TYPE_*), return the length of the - * specifier part of it, without the prefix type byte. Return -1 if it is not - * a valid algorithm ID. */ -static int -secret_to_key_spec_len(uint8_t type) -{ - switch (type) { - case S2K_TYPE_RFC2440: - return S2K_RFC2440_SPECIFIER_LEN; - case S2K_TYPE_PBKDF2: - return PBKDF2_SPEC_LEN; - case S2K_TYPE_SCRYPT: - return SCRYPT_SPEC_LEN; - default: - return -1; - } -} - -/** Given an algorithm ID (one of S2K_TYPE_*), return the length of the - * its preferred output. */ -static int -secret_to_key_key_len(uint8_t type) -{ - switch (type) { - case S2K_TYPE_RFC2440: - return DIGEST_LEN; - case S2K_TYPE_PBKDF2: - return DIGEST_LEN; - case S2K_TYPE_SCRYPT: - return DIGEST256_LEN; - // LCOV_EXCL_START - default: - tor_fragile_assert(); - return -1; - // LCOV_EXCL_STOP - } -} - -/** Given a specifier in spec_and_key of length - * spec_and_key_len, along with its prefix algorithm ID byte, and along - * with a key if key_included is true, check whether the whole - * specifier-and-key is of valid length, and return the algorithm type if it - * is. Set *legacy_out to 1 iff this is a legacy password hash or - * legacy specifier. Return an error code on failure. - */ -static int -secret_to_key_get_type(const uint8_t *spec_and_key, size_t spec_and_key_len, - int key_included, int *legacy_out) -{ - size_t legacy_len = S2K_RFC2440_SPECIFIER_LEN; - uint8_t type; - int total_len; - - if (key_included) - legacy_len += DIGEST_LEN; - - if (spec_and_key_len == legacy_len) { - *legacy_out = 1; - return S2K_TYPE_RFC2440; - } - - *legacy_out = 0; - if (spec_and_key_len == 0) - return S2K_BAD_LEN; - - type = spec_and_key[0]; - total_len = secret_to_key_spec_len(type); - if (total_len < 0) - return S2K_BAD_ALGORITHM; - if (key_included) { - int keylen = secret_to_key_key_len(type); - if (keylen < 0) - return S2K_BAD_ALGORITHM; - total_len += keylen; - } - - if ((size_t)total_len + 1 == spec_and_key_len) - return type; - else - return S2K_BAD_LEN; -} - -/** - * Write a new random s2k specifier of type type, without prefixing - * type byte, to spec_out, which must have enough room. May adjust - * parameter choice based on flags. - */ -static int -make_specifier(uint8_t *spec_out, uint8_t type, unsigned flags) -{ - int speclen = secret_to_key_spec_len(type); - if (speclen < 0) - return S2K_BAD_ALGORITHM; - - crypto_rand((char*)spec_out, speclen); - switch (type) { - case S2K_TYPE_RFC2440: - /* Hash 64 k of data. */ - spec_out[S2K_RFC2440_SPECIFIER_LEN-1] = 96; - break; - case S2K_TYPE_PBKDF2: - /* 131 K iterations */ - spec_out[PBKDF2_SPEC_LEN-1] = 17; - break; - case S2K_TYPE_SCRYPT: - if (flags & S2K_FLAG_LOW_MEM) { - /* N = 1<<12 */ - spec_out[SCRYPT_SPEC_LEN-2] = 12; - } else { - /* N = 1<<15 */ - spec_out[SCRYPT_SPEC_LEN-2] = 15; - } - /* r = 8; p = 2. */ - spec_out[SCRYPT_SPEC_LEN-1] = (3u << 4) | (1u << 0); - break; - // LCOV_EXCL_START - we should have returned above. - default: - tor_fragile_assert(); - return S2K_BAD_ALGORITHM; - // LCOV_EXCL_STOP - } - - return speclen; -} - -/** Implement RFC2440-style iterated-salted S2K conversion: convert the - * secret_len-byte secret into a key_out_len byte - * key_out. As in RFC2440, the first 8 bytes of s2k_specifier - * are a salt; the 9th byte describes how much iteration to do. - * If key_out_len > DIGEST_LEN, use HDKF to expand the result. - */ -void -secret_to_key_rfc2440(char *key_out, size_t key_out_len, const char *secret, - size_t secret_len, const char *s2k_specifier) -{ - crypto_digest_t *d; - uint8_t c; - size_t count, tmplen; - char *tmp; - uint8_t buf[DIGEST_LEN]; - tor_assert(key_out_len < SIZE_T_CEILING); - -#define EXPBIAS 6 - c = s2k_specifier[8]; - count = ((uint32_t)16 + (c & 15)) << ((c >> 4) + EXPBIAS); -#undef EXPBIAS - - d = crypto_digest_new(); - tmplen = 8+secret_len; - tmp = tor_malloc(tmplen); - memcpy(tmp,s2k_specifier,8); - memcpy(tmp+8,secret,secret_len); - secret_len += 8; - while (count) { - if (count >= secret_len) { - crypto_digest_add_bytes(d, tmp, secret_len); - count -= secret_len; - } else { - crypto_digest_add_bytes(d, tmp, count); - count = 0; - } - } - crypto_digest_get_digest(d, (char*)buf, sizeof(buf)); - - if (key_out_len <= sizeof(buf)) { - memcpy(key_out, buf, key_out_len); - } else { - crypto_expand_key_material_rfc5869_sha256(buf, DIGEST_LEN, - (const uint8_t*)s2k_specifier, 8, - (const uint8_t*)"EXPAND", 6, - (uint8_t*)key_out, key_out_len); - } - memwipe(tmp, 0, tmplen); - memwipe(buf, 0, sizeof(buf)); - tor_free(tmp); - crypto_digest_free(d); -} - -/** - * Helper: given a valid specifier without prefix type byte in spec, - * whose length must be correct, and given a secret passphrase secret - * of length secret_len, compute the key and store it into - * key_out, which must have enough room for secret_to_key_key_len(type) - * bytes. Return the number of bytes written on success and an error code - * on failure. - */ -STATIC int -secret_to_key_compute_key(uint8_t *key_out, size_t key_out_len, - const uint8_t *spec, size_t spec_len, - const char *secret, size_t secret_len, - int type) -{ - int rv; - if (key_out_len > INT_MAX) - return S2K_BAD_LEN; - - switch (type) { - case S2K_TYPE_RFC2440: - secret_to_key_rfc2440((char*)key_out, key_out_len, secret, secret_len, - (const char*)spec); - return (int)key_out_len; - - case S2K_TYPE_PBKDF2: { - uint8_t log_iters; - if (spec_len < 1 || secret_len > INT_MAX || spec_len > INT_MAX) - return S2K_BAD_LEN; - log_iters = spec[spec_len-1]; - if (log_iters > 31) - return S2K_BAD_PARAMS; - rv = PKCS5_PBKDF2_HMAC_SHA1(secret, (int)secret_len, - spec, (int)spec_len-1, - (1<> 4; - log_p = (spec[spec_len-1]) & 15; - if (log_N > 63) - return S2K_BAD_PARAMS; - N = ((uint64_t)1) << log_N; - r = 1u << log_r; - p = 1u << log_p; - rv = libscrypt_scrypt((const uint8_t*)secret, secret_len, - spec, spec_len-2, N, r, p, key_out, key_out_len); - if (rv != 0) - return S2K_FAILED; - return (int)key_out_len; -#else /* !(defined(HAVE_SCRYPT)) */ - return S2K_NO_SCRYPT_SUPPORT; -#endif /* defined(HAVE_SCRYPT) */ - } - default: - return S2K_BAD_ALGORITHM; - } -} - -/** - * Given a specifier previously constructed with secret_to_key_make_specifier - * in spec of length spec_len, and a secret password in - * secret of length secret_len, generate key_out_len - * bytes of cryptographic material in key_out. The native output of - * the secret-to-key function will be truncated if key_out_len is short, and - * expanded with HKDF if key_out_len is long. Returns S2K_OKAY on success, - * and an error code on failure. - */ -int -secret_to_key_derivekey(uint8_t *key_out, size_t key_out_len, - const uint8_t *spec, size_t spec_len, - const char *secret, size_t secret_len) -{ - int legacy_format = 0; - int type = secret_to_key_get_type(spec, spec_len, 0, &legacy_format); - int r; - - if (type < 0) - return type; -#ifndef HAVE_SCRYPT - if (type == S2K_TYPE_SCRYPT) - return S2K_NO_SCRYPT_SUPPORT; - #endif - - if (! legacy_format) { - ++spec; - --spec_len; - } - - r = secret_to_key_compute_key(key_out, key_out_len, spec, spec_len, - secret, secret_len, type); - if (r < 0) - return r; - else - return S2K_OKAY; -} - -/** - * Construct a new s2k algorithm specifier and salt in buf, according - * to the bitwise-or of some S2K_FLAG_* options in flags. Up to - * buf_len bytes of storage may be used in buf. Return the - * number of bytes used on success and an error code on failure. - */ -int -secret_to_key_make_specifier(uint8_t *buf, size_t buf_len, unsigned flags) -{ - int rv; - int spec_len; -#ifdef HAVE_SCRYPT - uint8_t type = S2K_TYPE_SCRYPT; -#else - uint8_t type = S2K_TYPE_RFC2440; -#endif - - if (flags & S2K_FLAG_NO_SCRYPT) - type = S2K_TYPE_RFC2440; - if (flags & S2K_FLAG_USE_PBKDF2) - type = S2K_TYPE_PBKDF2; - - spec_len = secret_to_key_spec_len(type); - - if ((int)buf_len < spec_len + 1) - return S2K_TRUNCATED; - - buf[0] = type; - rv = make_specifier(buf+1, type, flags); - if (rv < 0) - return rv; - else - return rv + 1; -} - -/** - * Hash a passphrase from secret of length secret_len, according - * to the bitwise-or of some S2K_FLAG_* options in flags, and store the - * hash along with salt and hashing parameters into buf. Up to - * buf_len bytes of storage may be used in buf. Set - * *len_out to the number of bytes used and return S2K_OKAY on success; - * and return an error code on failure. - */ -int -secret_to_key_new(uint8_t *buf, - size_t buf_len, - size_t *len_out, - const char *secret, size_t secret_len, - unsigned flags) -{ - int key_len; - int spec_len; - int type; - int rv; - - spec_len = secret_to_key_make_specifier(buf, buf_len, flags); - - if (spec_len < 0) - return spec_len; - - type = buf[0]; - key_len = secret_to_key_key_len(type); - - if (key_len < 0) - return key_len; - - if ((int)buf_len < key_len + spec_len) - return S2K_TRUNCATED; - - rv = secret_to_key_compute_key(buf + spec_len, key_len, - buf + 1, spec_len-1, - secret, secret_len, type); - if (rv < 0) - return rv; - - *len_out = spec_len + key_len; - - return S2K_OKAY; -} - -/** - * Given a hashed passphrase in spec_and_key of length - * spec_and_key_len as generated by secret_to_key_new(), verify whether - * it is a hash of the passphrase secret of length secret_len. - * Return S2K_OKAY on a match, S2K_BAD_SECRET on a well-formed hash that - * doesn't match this secret, and another error code on other errors. - */ -int -secret_to_key_check(const uint8_t *spec_and_key, size_t spec_and_key_len, - const char *secret, size_t secret_len) -{ - int is_legacy = 0; - int type = secret_to_key_get_type(spec_and_key, spec_and_key_len, - 1, &is_legacy); - uint8_t buf[32]; - int spec_len; - int key_len; - int rv; - - if (type < 0) - return type; - - if (! is_legacy) { - spec_and_key++; - spec_and_key_len--; - } - - spec_len = secret_to_key_spec_len(type); - key_len = secret_to_key_key_len(type); - tor_assert(spec_len > 0); - tor_assert(key_len > 0); - tor_assert(key_len <= (int) sizeof(buf)); - tor_assert((int)spec_and_key_len == spec_len + key_len); - rv = secret_to_key_compute_key(buf, key_len, - spec_and_key, spec_len, - secret, secret_len, type); - if (rv < 0) - goto done; - - if (tor_memeq(buf, spec_and_key + spec_len, key_len)) - rv = S2K_OKAY; - else - rv = S2K_BAD_SECRET; - - done: - memwipe(buf, 0, sizeof(buf)); - return rv; -} - diff --git a/src/tor/src/common/crypto_s2k.h b/src/tor/src/common/crypto_s2k.h deleted file mode 100644 index 849ff59ce..000000000 --- a/src/tor/src/common/crypto_s2k.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CRYPTO_S2K_H_INCLUDED -#define TOR_CRYPTO_S2K_H_INCLUDED - -#include -#include "torint.h" - -/** Length of RFC2440-style S2K specifier: the first 8 bytes are a salt, the - * 9th describes how much iteration to do. */ -#define S2K_RFC2440_SPECIFIER_LEN 9 -void secret_to_key_rfc2440( - char *key_out, size_t key_out_len, const char *secret, - size_t secret_len, const char *s2k_specifier); - -/** Flag for secret-to-key function: do not use scrypt. */ -#define S2K_FLAG_NO_SCRYPT (1u<<0) -/** Flag for secret-to-key functions: if using a memory-tuned s2k function, - * assume that we have limited memory. */ -#define S2K_FLAG_LOW_MEM (1u<<1) -/** Flag for secret-to-key functions: force use of pbkdf2. Without this, we - * default to scrypt, then RFC2440. */ -#define S2K_FLAG_USE_PBKDF2 (1u<<2) - -/** Maximum possible output length from secret_to_key_new. */ -#define S2K_MAXLEN 64 - -/** Error code from secret-to-key functions: all is well */ -#define S2K_OKAY 0 -/** Error code from secret-to-key functions: generic failure */ -#define S2K_FAILED -1 -/** Error code from secret-to-key functions: provided secret didn't match */ -#define S2K_BAD_SECRET -2 -/** Error code from secret-to-key functions: didn't recognize the algorithm */ -#define S2K_BAD_ALGORITHM -3 -/** Error code from secret-to-key functions: specifier wasn't valid */ -#define S2K_BAD_PARAMS -4 -/** Error code from secret-to-key functions: compiled without scrypt */ -#define S2K_NO_SCRYPT_SUPPORT -5 -/** Error code from secret-to-key functions: not enough space to write output. - */ -#define S2K_TRUNCATED -6 -/** Error code from secret-to-key functions: Wrong length for specifier. */ -#define S2K_BAD_LEN -7 - -int secret_to_key_new(uint8_t *buf, - size_t buf_len, - size_t *len_out, - const char *secret, size_t secret_len, - unsigned flags); - -int secret_to_key_make_specifier(uint8_t *buf, size_t buf_len, unsigned flags); - -int secret_to_key_check(const uint8_t *spec_and_key, size_t spec_and_key_len, - const char *secret, size_t secret_len); - -int secret_to_key_derivekey(uint8_t *key_out, size_t key_out_len, - const uint8_t *spec, size_t spec_len, - const char *secret, size_t secret_len); - -#ifdef CRYPTO_S2K_PRIVATE -STATIC int secret_to_key_compute_key(uint8_t *key_out, size_t key_out_len, - const uint8_t *spec, size_t spec_len, - const char *secret, size_t secret_len, - int type); -#endif /* defined(CRYPTO_S2K_PRIVATE) */ - -#endif /* !defined(TOR_CRYPTO_S2K_H_INCLUDED) */ - diff --git a/src/tor/src/common/handles.h b/src/tor/src/common/handles.h deleted file mode 100644 index aef8cd89e..000000000 --- a/src/tor/src/common/handles.h +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file handles.h - * \brief Macros for C weak-handle implementation. - * - * A 'handle' is a pointer to an object that is allowed to go away while - * the handle stays alive. When you dereference the handle, you might get - * the object, or you might get "NULL". - * - * Use this pattern when an object has a single obvious lifespan, so you don't - * want to use reference counting, but when other objects might need to refer - * to the first object without caring about its lifetime. - * - * To enable a type to have handles, add a HANDLE_ENTRY() field in its - * definition, as in: - * - * struct walrus { - * HANDLE_ENTRY(wlr, walrus); - * // ... - * }; - * - * And invoke HANDLE_DECL(wlr, walrus, [static]) to declare the handle - * manipulation functions (typically in a header): - * - * // opaque handle to walrus. - * typedef struct wlr_handle_t wlr_handle_t; - * - * // make a new handle - * struct wlr_handle_t *wlr_handle_new(struct walrus *); - * - * // release a handle - * void wlr_handle_free(wlr_handle_t *); - * - * // return the pointed-to walrus, or NULL. - * struct walrus *wlr_handle_get(wlr_handle_t *). - * - * // call this function when you're about to free the walrus; - * // it invalidates all handles. (IF YOU DON'T, YOU WILL HAVE - * // DANGLING REFERENCES) - * void wlr_handles_clear(struct walrus *); - * - * Finally, use HANDLE_IMPL() to define the above functions in some - * appropriate C file: HANDLE_IMPL(wlr, walrus, [static]) - * - **/ - -#ifndef TOR_HANDLE_H -#define TOR_HANDLE_H - -#include "orconfig.h" -#include "tor_queue.h" -#include "util.h" - -#define HANDLE_ENTRY(name, structname) \ - struct name ## _handle_head_t *handle_head - -#define HANDLE_DECL(name, structname, linkage) \ - typedef struct name ## _handle_t name ## _handle_t; \ - linkage name ## _handle_t *name ## _handle_new(struct structname *object); \ - linkage void name ## _handle_free_(name ## _handle_t *); \ - linkage struct structname *name ## _handle_get(name ## _handle_t *); \ - linkage void name ## _handles_clear(struct structname *object); - -/* - * Implementation notes: there are lots of possible implementations here. We - * could keep a linked list of handles, each with a backpointer to the object, - * and set all of their backpointers to NULL when the object is freed. Or we - * could have the clear function invalidate the object, but not actually let - * the object get freed until the all the handles went away. We could even - * have a hash-table mapping unique identifiers to objects, and have each - * handle be a copy of the unique identifier. (We'll want to build that last - * one eventually if we want cross-process handles.) - * - * But instead we're opting for a single independent 'head' that knows how - * many handles there are, and where the object is (or isn't). This makes - * all of our functions O(1), and most as fast as a single pointer access. - * - * The handles themselves are opaque structures holding a pointer to the head. - * We could instead have each foo_handle_t* be identical to foo_handle_head_t - * *, and save some allocations ... but doing so would make handle leaks - * harder to debug. As it stands, every handle leak is a memory leak, and - * existing memory debugging tools should help with those. We can revisit - * this decision if handles are too slow. - */ - -#define HANDLE_IMPL(name, structname, linkage) \ - /* The 'head' object for a handle-accessible type. This object */ \ - /* persists for as long as the object, or any handles, exist. */ \ - typedef struct name ## _handle_head_t { \ - struct structname *object; /* pointed-to object, or NULL */ \ - unsigned int references; /* number of existing handles */ \ - } name ## _handle_head_t; \ - \ - struct name ## _handle_t { \ - struct name ## _handle_head_t *head; /* reference to the 'head'. */ \ - }; \ - \ - linkage struct name ## _handle_t * \ - name ## _handle_new(struct structname *object) \ - { \ - tor_assert(object); \ - name ## _handle_head_t *head = object->handle_head; \ - if (PREDICT_UNLIKELY(head == NULL)) { \ - head = object->handle_head = tor_malloc_zero(sizeof(*head)); \ - head->object = object; \ - } \ - name ## _handle_t *new_ref = tor_malloc_zero(sizeof(*new_ref)); \ - new_ref->head = head; \ - ++head->references; \ - return new_ref; \ - } \ - \ - linkage void \ - name ## _handle_free_(struct name ## _handle_t *ref) \ - { \ - if (! ref) return; \ - name ## _handle_head_t *head = ref->head; \ - tor_assert(head); \ - --head->references; \ - tor_free(ref); \ - if (head->object == NULL && head->references == 0) { \ - tor_free(head); \ - return; \ - } \ - } \ - \ - linkage struct structname * \ - name ## _handle_get(struct name ## _handle_t *ref) \ - { \ - tor_assert(ref); \ - name ## _handle_head_t *head = ref->head; \ - tor_assert(head); \ - return head->object; \ - } \ - \ - linkage void \ - name ## _handles_clear(struct structname *object) \ - { \ - tor_assert(object); \ - name ## _handle_head_t *head = object->handle_head; \ - if (! head) \ - return; \ - object->handle_head = NULL; \ - head->object = NULL; \ - if (head->references == 0) { \ - tor_free(head); \ - } \ - } - -#endif /* !defined(TOR_HANDLE_H) */ - diff --git a/src/tor/src/common/include.am b/src/tor/src/common/include.am deleted file mode 100644 index 2856c40fd..000000000 --- a/src/tor/src/common/include.am +++ /dev/null @@ -1,189 +0,0 @@ - -noinst_LIBRARIES += \ - src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a \ - src/common/libor-event.a - -if UNITTESTS_ENABLED -noinst_LIBRARIES += \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-crypto-testing.a \ - src/common/libor-event-testing.a -endif - -EXTRA_DIST += src/common/Makefile.nmake - -#CFLAGS = -Wall -Wpointer-arith -O2 -AM_CPPFLAGS += -I$(srcdir)/src/common -Isrc/common -I$(srcdir)/src/ext/trunnel -I$(srcdir)/src/trunnel - -if USE_OPENBSD_MALLOC -libor_extra_source=src/ext/OpenBSD_malloc_Linux.c -else -libor_extra_source= -endif - -src_common_libcurve25519_donna_a_CFLAGS= - -if BUILD_CURVE25519_DONNA -src_common_libcurve25519_donna_a_SOURCES=\ - src/ext/curve25519_donna/curve25519-donna.c -# See bug 13538 -- this code is known to have signed overflow issues. -src_common_libcurve25519_donna_a_CFLAGS+=\ - @F_OMIT_FRAME_POINTER@ @CFLAGS_CONSTTIME@ -noinst_LIBRARIES+=src/common/libcurve25519_donna.a -LIBDONNA=src/common/libcurve25519_donna.a -else -if BUILD_CURVE25519_DONNA_C64 -src_common_libcurve25519_donna_a_CFLAGS+=@CFLAGS_CONSTTIME@ -src_common_libcurve25519_donna_a_SOURCES=\ - src/ext/curve25519_donna/curve25519-donna-c64.c -noinst_LIBRARIES+=src/common/libcurve25519_donna.a -LIBDONNA=src/common/libcurve25519_donna.a -else -LIBDONNA= -endif -endif - -LIBDONNA += $(LIBED25519_REF10) -LIBDONNA += $(LIBED25519_DONNA) - -if THREADS_PTHREADS -threads_impl_source=src/common/compat_pthreads.c -endif -if THREADS_WIN32 -threads_impl_source=src/common/compat_winthreads.c -endif - -if BUILD_READPASSPHRASE_C -readpassphrase_source=src/ext/readpassphrase.c -else -readpassphrase_source= -endif - -if ADD_MULODI4 -mulodi4_source=src/ext/mulodi/mulodi4.c -else -mulodi4_source= -endif - -LIBOR_CTIME_A_SRC = \ - $(mulodi4_source) \ - src/ext/csiphash.c \ - src/common/di_ops.c - -src_common_libor_ctime_a_SOURCES = $(LIBOR_CTIME_A_SRC) -src_common_libor_ctime_testing_a_SOURCES = $(LIBOR_CTIME_A_SRC) -src_common_libor_ctime_a_CFLAGS = @CFLAGS_CONSTTIME@ -src_common_libor_ctime_testing_a_CFLAGS = @CFLAGS_CONSTTIME@ $(TEST_CFLAGS) - -LIBOR_A_SRC = \ - src/common/address.c \ - src/common/backtrace.c \ - src/common/buffers.c \ - src/common/compat.c \ - src/common/compat_threads.c \ - src/common/compat_time.c \ - src/common/confline.c \ - src/common/container.c \ - src/common/log.c \ - src/common/memarea.c \ - src/common/pubsub.c \ - src/common/util.c \ - src/common/util_bug.c \ - src/common/util_format.c \ - src/common/util_process.c \ - src/common/sandbox.c \ - src/common/storagedir.c \ - src/common/workqueue.c \ - $(libor_extra_source) \ - $(threads_impl_source) \ - $(readpassphrase_source) - -src/common/src_common_libor_testing_a-log.$(OBJEXT) \ - src/common/log.$(OBJEXT): micro-revision.i - -LIBOR_CRYPTO_A_SRC = \ - src/common/aes.c \ - src/common/buffers_tls.c \ - src/common/compress.c \ - src/common/compress_lzma.c \ - src/common/compress_none.c \ - src/common/compress_zlib.c \ - src/common/compress_zstd.c \ - src/common/crypto.c \ - src/common/crypto_pwbox.c \ - src/common/crypto_s2k.c \ - src/common/crypto_format.c \ - src/common/tortls.c \ - src/common/crypto_curve25519.c \ - src/common/crypto_ed25519.c - -LIBOR_EVENT_A_SRC = \ - src/common/compat_libevent.c \ - src/common/procmon.c \ - src/common/timers.c \ - src/ext/timeouts/timeout.c - -src_common_libor_a_SOURCES = $(LIBOR_A_SRC) -src_common_libor_crypto_a_SOURCES = $(LIBOR_CRYPTO_A_SRC) -src_common_libor_event_a_SOURCES = $(LIBOR_EVENT_A_SRC) - -src_common_libor_testing_a_SOURCES = $(LIBOR_A_SRC) -src_common_libor_crypto_testing_a_SOURCES = $(LIBOR_CRYPTO_A_SRC) -src_common_libor_event_testing_a_SOURCES = $(LIBOR_EVENT_A_SRC) - -src_common_libor_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_common_libor_crypto_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_common_libor_event_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_common_libor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_common_libor_crypto_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_common_libor_event_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - -COMMONHEADERS = \ - src/common/address.h \ - src/common/backtrace.h \ - src/common/buffers.h \ - src/common/buffers_tls.h \ - src/common/aes.h \ - src/common/ciphers.inc \ - src/common/compat.h \ - src/common/compat_libevent.h \ - src/common/compat_openssl.h \ - src/common/compat_threads.h \ - src/common/compat_time.h \ - src/common/compress.h \ - src/common/compress_lzma.h \ - src/common/compress_none.h \ - src/common/compress_zlib.h \ - src/common/compress_zstd.h \ - src/common/confline.h \ - src/common/container.h \ - src/common/crypto.h \ - src/common/crypto_curve25519.h \ - src/common/crypto_ed25519.h \ - src/common/crypto_format.h \ - src/common/crypto_pwbox.h \ - src/common/crypto_s2k.h \ - src/common/di_ops.h \ - src/common/handles.h \ - src/common/memarea.h \ - src/common/linux_syscalls.inc \ - src/common/procmon.h \ - src/common/pubsub.h \ - src/common/sandbox.h \ - src/common/storagedir.h \ - src/common/testsupport.h \ - src/common/timers.h \ - src/common/torint.h \ - src/common/torlog.h \ - src/common/tortls.h \ - src/common/util.h \ - src/common/util_bug.h \ - src/common/util_format.h \ - src/common/util_process.h \ - src/common/workqueue.h - -noinst_HEADERS+= $(COMMONHEADERS) - diff --git a/src/tor/src/common/linux_syscalls.inc b/src/tor/src/common/linux_syscalls.inc deleted file mode 100644 index cf47c7380..000000000 --- a/src/tor/src/common/linux_syscalls.inc +++ /dev/null @@ -1,1153 +0,0 @@ -/* Automatically generated with - gen_linux_syscalls.pl /usr/include/asm/unistd*.h - Do not edit. - */ -static const struct { - int syscall_num; const char *syscall_name; -} SYSCALLS_BY_NUMBER[] = { -#ifdef __NR__llseek - { __NR__llseek, "_llseek" }, -#endif -#ifdef __NR__newselect - { __NR__newselect, "_newselect" }, -#endif -#ifdef __NR__sysctl - { __NR__sysctl, "_sysctl" }, -#endif -#ifdef __NR_accept - { __NR_accept, "accept" }, -#endif -#ifdef __NR_accept4 - { __NR_accept4, "accept4" }, -#endif -#ifdef __NR_access - { __NR_access, "access" }, -#endif -#ifdef __NR_acct - { __NR_acct, "acct" }, -#endif -#ifdef __NR_add_key - { __NR_add_key, "add_key" }, -#endif -#ifdef __NR_adjtimex - { __NR_adjtimex, "adjtimex" }, -#endif -#ifdef __NR_afs_syscall - { __NR_afs_syscall, "afs_syscall" }, -#endif -#ifdef __NR_alarm - { __NR_alarm, "alarm" }, -#endif -#ifdef __NR_arch_prctl - { __NR_arch_prctl, "arch_prctl" }, -#endif -#ifdef __NR_bdflush - { __NR_bdflush, "bdflush" }, -#endif -#ifdef __NR_bind - { __NR_bind, "bind" }, -#endif -#ifdef __NR_break - { __NR_break, "break" }, -#endif -#ifdef __NR_brk - { __NR_brk, "brk" }, -#endif -#ifdef __NR_capget - { __NR_capget, "capget" }, -#endif -#ifdef __NR_capset - { __NR_capset, "capset" }, -#endif -#ifdef __NR_chdir - { __NR_chdir, "chdir" }, -#endif -#ifdef __NR_chmod - { __NR_chmod, "chmod" }, -#endif -#ifdef __NR_chown - { __NR_chown, "chown" }, -#endif -#ifdef __NR_chown32 - { __NR_chown32, "chown32" }, -#endif -#ifdef __NR_chroot - { __NR_chroot, "chroot" }, -#endif -#ifdef __NR_clock_adjtime - { __NR_clock_adjtime, "clock_adjtime" }, -#endif -#ifdef __NR_clock_getres - { __NR_clock_getres, "clock_getres" }, -#endif -#ifdef __NR_clock_gettime - { __NR_clock_gettime, "clock_gettime" }, -#endif -#ifdef __NR_clock_nanosleep - { __NR_clock_nanosleep, "clock_nanosleep" }, -#endif -#ifdef __NR_clock_settime - { __NR_clock_settime, "clock_settime" }, -#endif -#ifdef __NR_clone - { __NR_clone, "clone" }, -#endif -#ifdef __NR_close - { __NR_close, "close" }, -#endif -#ifdef __NR_connect - { __NR_connect, "connect" }, -#endif -#ifdef __NR_creat - { __NR_creat, "creat" }, -#endif -#ifdef __NR_create_module - { __NR_create_module, "create_module" }, -#endif -#ifdef __NR_delete_module - { __NR_delete_module, "delete_module" }, -#endif -#ifdef __NR_dup - { __NR_dup, "dup" }, -#endif -#ifdef __NR_dup2 - { __NR_dup2, "dup2" }, -#endif -#ifdef __NR_dup3 - { __NR_dup3, "dup3" }, -#endif -#ifdef __NR_epoll_create - { __NR_epoll_create, "epoll_create" }, -#endif -#ifdef __NR_epoll_create1 - { __NR_epoll_create1, "epoll_create1" }, -#endif -#ifdef __NR_epoll_ctl - { __NR_epoll_ctl, "epoll_ctl" }, -#endif -#ifdef __NR_epoll_ctl_old - { __NR_epoll_ctl_old, "epoll_ctl_old" }, -#endif -#ifdef __NR_epoll_pwait - { __NR_epoll_pwait, "epoll_pwait" }, -#endif -#ifdef __NR_epoll_wait - { __NR_epoll_wait, "epoll_wait" }, -#endif -#ifdef __NR_epoll_wait_old - { __NR_epoll_wait_old, "epoll_wait_old" }, -#endif -#ifdef __NR_eventfd - { __NR_eventfd, "eventfd" }, -#endif -#ifdef __NR_eventfd2 - { __NR_eventfd2, "eventfd2" }, -#endif -#ifdef __NR_execve - { __NR_execve, "execve" }, -#endif -#ifdef __NR_exit - { __NR_exit, "exit" }, -#endif -#ifdef __NR_exit_group - { __NR_exit_group, "exit_group" }, -#endif -#ifdef __NR_faccessat - { __NR_faccessat, "faccessat" }, -#endif -#ifdef __NR_fadvise64 - { __NR_fadvise64, "fadvise64" }, -#endif -#ifdef __NR_fadvise64_64 - { __NR_fadvise64_64, "fadvise64_64" }, -#endif -#ifdef __NR_fallocate - { __NR_fallocate, "fallocate" }, -#endif -#ifdef __NR_fanotify_init - { __NR_fanotify_init, "fanotify_init" }, -#endif -#ifdef __NR_fanotify_mark - { __NR_fanotify_mark, "fanotify_mark" }, -#endif -#ifdef __NR_fchdir - { __NR_fchdir, "fchdir" }, -#endif -#ifdef __NR_fchmod - { __NR_fchmod, "fchmod" }, -#endif -#ifdef __NR_fchmodat - { __NR_fchmodat, "fchmodat" }, -#endif -#ifdef __NR_fchown - { __NR_fchown, "fchown" }, -#endif -#ifdef __NR_fchown32 - { __NR_fchown32, "fchown32" }, -#endif -#ifdef __NR_fchownat - { __NR_fchownat, "fchownat" }, -#endif -#ifdef __NR_fcntl - { __NR_fcntl, "fcntl" }, -#endif -#ifdef __NR_fcntl64 - { __NR_fcntl64, "fcntl64" }, -#endif -#ifdef __NR_fdatasync - { __NR_fdatasync, "fdatasync" }, -#endif -#ifdef __NR_fgetxattr - { __NR_fgetxattr, "fgetxattr" }, -#endif -#ifdef __NR_finit_module - { __NR_finit_module, "finit_module" }, -#endif -#ifdef __NR_flistxattr - { __NR_flistxattr, "flistxattr" }, -#endif -#ifdef __NR_flock - { __NR_flock, "flock" }, -#endif -#ifdef __NR_fork - { __NR_fork, "fork" }, -#endif -#ifdef __NR_fremovexattr - { __NR_fremovexattr, "fremovexattr" }, -#endif -#ifdef __NR_fsetxattr - { __NR_fsetxattr, "fsetxattr" }, -#endif -#ifdef __NR_fstat - { __NR_fstat, "fstat" }, -#endif -#ifdef __NR_fstat64 - { __NR_fstat64, "fstat64" }, -#endif -#ifdef __NR_fstatat64 - { __NR_fstatat64, "fstatat64" }, -#endif -#ifdef __NR_fstatfs - { __NR_fstatfs, "fstatfs" }, -#endif -#ifdef __NR_fstatfs64 - { __NR_fstatfs64, "fstatfs64" }, -#endif -#ifdef __NR_fsync - { __NR_fsync, "fsync" }, -#endif -#ifdef __NR_ftime - { __NR_ftime, "ftime" }, -#endif -#ifdef __NR_ftruncate - { __NR_ftruncate, "ftruncate" }, -#endif -#ifdef __NR_ftruncate64 - { __NR_ftruncate64, "ftruncate64" }, -#endif -#ifdef __NR_futex - { __NR_futex, "futex" }, -#endif -#ifdef __NR_futimesat - { __NR_futimesat, "futimesat" }, -#endif -#ifdef __NR_get_kernel_syms - { __NR_get_kernel_syms, "get_kernel_syms" }, -#endif -#ifdef __NR_get_mempolicy - { __NR_get_mempolicy, "get_mempolicy" }, -#endif -#ifdef __NR_get_robust_list - { __NR_get_robust_list, "get_robust_list" }, -#endif -#ifdef __NR_get_thread_area - { __NR_get_thread_area, "get_thread_area" }, -#endif -#ifdef __NR_getcpu - { __NR_getcpu, "getcpu" }, -#endif -#ifdef __NR_getcwd - { __NR_getcwd, "getcwd" }, -#endif -#ifdef __NR_getdents - { __NR_getdents, "getdents" }, -#endif -#ifdef __NR_getdents64 - { __NR_getdents64, "getdents64" }, -#endif -#ifdef __NR_getegid - { __NR_getegid, "getegid" }, -#endif -#ifdef __NR_getegid32 - { __NR_getegid32, "getegid32" }, -#endif -#ifdef __NR_geteuid - { __NR_geteuid, "geteuid" }, -#endif -#ifdef __NR_geteuid32 - { __NR_geteuid32, "geteuid32" }, -#endif -#ifdef __NR_getgid - { __NR_getgid, "getgid" }, -#endif -#ifdef __NR_getgid32 - { __NR_getgid32, "getgid32" }, -#endif -#ifdef __NR_getgroups - { __NR_getgroups, "getgroups" }, -#endif -#ifdef __NR_getgroups32 - { __NR_getgroups32, "getgroups32" }, -#endif -#ifdef __NR_getitimer - { __NR_getitimer, "getitimer" }, -#endif -#ifdef __NR_getpeername - { __NR_getpeername, "getpeername" }, -#endif -#ifdef __NR_getpgid - { __NR_getpgid, "getpgid" }, -#endif -#ifdef __NR_getpgrp - { __NR_getpgrp, "getpgrp" }, -#endif -#ifdef __NR_getpid - { __NR_getpid, "getpid" }, -#endif -#ifdef __NR_getpmsg - { __NR_getpmsg, "getpmsg" }, -#endif -#ifdef __NR_getppid - { __NR_getppid, "getppid" }, -#endif -#ifdef __NR_getpriority - { __NR_getpriority, "getpriority" }, -#endif -#ifdef __NR_getresgid - { __NR_getresgid, "getresgid" }, -#endif -#ifdef __NR_getresgid32 - { __NR_getresgid32, "getresgid32" }, -#endif -#ifdef __NR_getresuid - { __NR_getresuid, "getresuid" }, -#endif -#ifdef __NR_getresuid32 - { __NR_getresuid32, "getresuid32" }, -#endif -#ifdef __NR_getrlimit - { __NR_getrlimit, "getrlimit" }, -#endif -#ifdef __NR_getrusage - { __NR_getrusage, "getrusage" }, -#endif -#ifdef __NR_getsid - { __NR_getsid, "getsid" }, -#endif -#ifdef __NR_getsockname - { __NR_getsockname, "getsockname" }, -#endif -#ifdef __NR_getsockopt - { __NR_getsockopt, "getsockopt" }, -#endif -#ifdef __NR_gettid - { __NR_gettid, "gettid" }, -#endif -#ifdef __NR_gettimeofday - { __NR_gettimeofday, "gettimeofday" }, -#endif -#ifdef __NR_getuid - { __NR_getuid, "getuid" }, -#endif -#ifdef __NR_getuid32 - { __NR_getuid32, "getuid32" }, -#endif -#ifdef __NR_getxattr - { __NR_getxattr, "getxattr" }, -#endif -#ifdef __NR_gtty - { __NR_gtty, "gtty" }, -#endif -#ifdef __NR_idle - { __NR_idle, "idle" }, -#endif -#ifdef __NR_init_module - { __NR_init_module, "init_module" }, -#endif -#ifdef __NR_inotify_add_watch - { __NR_inotify_add_watch, "inotify_add_watch" }, -#endif -#ifdef __NR_inotify_init - { __NR_inotify_init, "inotify_init" }, -#endif -#ifdef __NR_inotify_init1 - { __NR_inotify_init1, "inotify_init1" }, -#endif -#ifdef __NR_inotify_rm_watch - { __NR_inotify_rm_watch, "inotify_rm_watch" }, -#endif -#ifdef __NR_io_cancel - { __NR_io_cancel, "io_cancel" }, -#endif -#ifdef __NR_io_destroy - { __NR_io_destroy, "io_destroy" }, -#endif -#ifdef __NR_io_getevents - { __NR_io_getevents, "io_getevents" }, -#endif -#ifdef __NR_io_setup - { __NR_io_setup, "io_setup" }, -#endif -#ifdef __NR_io_submit - { __NR_io_submit, "io_submit" }, -#endif -#ifdef __NR_ioctl - { __NR_ioctl, "ioctl" }, -#endif -#ifdef __NR_ioperm - { __NR_ioperm, "ioperm" }, -#endif -#ifdef __NR_iopl - { __NR_iopl, "iopl" }, -#endif -#ifdef __NR_ioprio_get - { __NR_ioprio_get, "ioprio_get" }, -#endif -#ifdef __NR_ioprio_set - { __NR_ioprio_set, "ioprio_set" }, -#endif -#ifdef __NR_ipc - { __NR_ipc, "ipc" }, -#endif -#ifdef __NR_kcmp - { __NR_kcmp, "kcmp" }, -#endif -#ifdef __NR_kexec_load - { __NR_kexec_load, "kexec_load" }, -#endif -#ifdef __NR_keyctl - { __NR_keyctl, "keyctl" }, -#endif -#ifdef __NR_kill - { __NR_kill, "kill" }, -#endif -#ifdef __NR_lchown - { __NR_lchown, "lchown" }, -#endif -#ifdef __NR_lchown32 - { __NR_lchown32, "lchown32" }, -#endif -#ifdef __NR_lgetxattr - { __NR_lgetxattr, "lgetxattr" }, -#endif -#ifdef __NR_link - { __NR_link, "link" }, -#endif -#ifdef __NR_linkat - { __NR_linkat, "linkat" }, -#endif -#ifdef __NR_listen - { __NR_listen, "listen" }, -#endif -#ifdef __NR_listxattr - { __NR_listxattr, "listxattr" }, -#endif -#ifdef __NR_llistxattr - { __NR_llistxattr, "llistxattr" }, -#endif -#ifdef __NR_lock - { __NR_lock, "lock" }, -#endif -#ifdef __NR_lookup_dcookie - { __NR_lookup_dcookie, "lookup_dcookie" }, -#endif -#ifdef __NR_lremovexattr - { __NR_lremovexattr, "lremovexattr" }, -#endif -#ifdef __NR_lseek - { __NR_lseek, "lseek" }, -#endif -#ifdef __NR_lsetxattr - { __NR_lsetxattr, "lsetxattr" }, -#endif -#ifdef __NR_lstat - { __NR_lstat, "lstat" }, -#endif -#ifdef __NR_lstat64 - { __NR_lstat64, "lstat64" }, -#endif -#ifdef __NR_madvise - { __NR_madvise, "madvise" }, -#endif -#ifdef __NR_mbind - { __NR_mbind, "mbind" }, -#endif -#ifdef __NR_migrate_pages - { __NR_migrate_pages, "migrate_pages" }, -#endif -#ifdef __NR_mincore - { __NR_mincore, "mincore" }, -#endif -#ifdef __NR_mkdir - { __NR_mkdir, "mkdir" }, -#endif -#ifdef __NR_mkdirat - { __NR_mkdirat, "mkdirat" }, -#endif -#ifdef __NR_mknod - { __NR_mknod, "mknod" }, -#endif -#ifdef __NR_mknodat - { __NR_mknodat, "mknodat" }, -#endif -#ifdef __NR_mlock - { __NR_mlock, "mlock" }, -#endif -#ifdef __NR_mlockall - { __NR_mlockall, "mlockall" }, -#endif -#ifdef __NR_mmap - { __NR_mmap, "mmap" }, -#endif -#ifdef __NR_mmap2 - { __NR_mmap2, "mmap2" }, -#endif -#ifdef __NR_modify_ldt - { __NR_modify_ldt, "modify_ldt" }, -#endif -#ifdef __NR_mount - { __NR_mount, "mount" }, -#endif -#ifdef __NR_move_pages - { __NR_move_pages, "move_pages" }, -#endif -#ifdef __NR_mprotect - { __NR_mprotect, "mprotect" }, -#endif -#ifdef __NR_mpx - { __NR_mpx, "mpx" }, -#endif -#ifdef __NR_mq_getsetattr - { __NR_mq_getsetattr, "mq_getsetattr" }, -#endif -#ifdef __NR_mq_notify - { __NR_mq_notify, "mq_notify" }, -#endif -#ifdef __NR_mq_open - { __NR_mq_open, "mq_open" }, -#endif -#ifdef __NR_mq_timedreceive - { __NR_mq_timedreceive, "mq_timedreceive" }, -#endif -#ifdef __NR_mq_timedsend - { __NR_mq_timedsend, "mq_timedsend" }, -#endif -#ifdef __NR_mq_unlink - { __NR_mq_unlink, "mq_unlink" }, -#endif -#ifdef __NR_mremap - { __NR_mremap, "mremap" }, -#endif -#ifdef __NR_msgctl - { __NR_msgctl, "msgctl" }, -#endif -#ifdef __NR_msgget - { __NR_msgget, "msgget" }, -#endif -#ifdef __NR_msgrcv - { __NR_msgrcv, "msgrcv" }, -#endif -#ifdef __NR_msgsnd - { __NR_msgsnd, "msgsnd" }, -#endif -#ifdef __NR_msync - { __NR_msync, "msync" }, -#endif -#ifdef __NR_munlock - { __NR_munlock, "munlock" }, -#endif -#ifdef __NR_munlockall - { __NR_munlockall, "munlockall" }, -#endif -#ifdef __NR_munmap - { __NR_munmap, "munmap" }, -#endif -#ifdef __NR_name_to_handle_at - { __NR_name_to_handle_at, "name_to_handle_at" }, -#endif -#ifdef __NR_nanosleep - { __NR_nanosleep, "nanosleep" }, -#endif -#ifdef __NR_newfstatat - { __NR_newfstatat, "newfstatat" }, -#endif -#ifdef __NR_nfsservctl - { __NR_nfsservctl, "nfsservctl" }, -#endif -#ifdef __NR_nice - { __NR_nice, "nice" }, -#endif -#ifdef __NR_oldfstat - { __NR_oldfstat, "oldfstat" }, -#endif -#ifdef __NR_oldlstat - { __NR_oldlstat, "oldlstat" }, -#endif -#ifdef __NR_oldolduname - { __NR_oldolduname, "oldolduname" }, -#endif -#ifdef __NR_oldstat - { __NR_oldstat, "oldstat" }, -#endif -#ifdef __NR_olduname - { __NR_olduname, "olduname" }, -#endif -#ifdef __NR_open - { __NR_open, "open" }, -#endif -#ifdef __NR_open_by_handle_at - { __NR_open_by_handle_at, "open_by_handle_at" }, -#endif -#ifdef __NR_openat - { __NR_openat, "openat" }, -#endif -#ifdef __NR_pause - { __NR_pause, "pause" }, -#endif -#ifdef __NR_perf_event_open - { __NR_perf_event_open, "perf_event_open" }, -#endif -#ifdef __NR_personality - { __NR_personality, "personality" }, -#endif -#ifdef __NR_pipe - { __NR_pipe, "pipe" }, -#endif -#ifdef __NR_pipe2 - { __NR_pipe2, "pipe2" }, -#endif -#ifdef __NR_pivot_root - { __NR_pivot_root, "pivot_root" }, -#endif -#ifdef __NR_poll - { __NR_poll, "poll" }, -#endif -#ifdef __NR_ppoll - { __NR_ppoll, "ppoll" }, -#endif -#ifdef __NR_prctl - { __NR_prctl, "prctl" }, -#endif -#ifdef __NR_pread64 - { __NR_pread64, "pread64" }, -#endif -#ifdef __NR_preadv - { __NR_preadv, "preadv" }, -#endif -#ifdef __NR_prlimit64 - { __NR_prlimit64, "prlimit64" }, -#endif -#ifdef __NR_process_vm_readv - { __NR_process_vm_readv, "process_vm_readv" }, -#endif -#ifdef __NR_process_vm_writev - { __NR_process_vm_writev, "process_vm_writev" }, -#endif -#ifdef __NR_prof - { __NR_prof, "prof" }, -#endif -#ifdef __NR_profil - { __NR_profil, "profil" }, -#endif -#ifdef __NR_pselect6 - { __NR_pselect6, "pselect6" }, -#endif -#ifdef __NR_ptrace - { __NR_ptrace, "ptrace" }, -#endif -#ifdef __NR_putpmsg - { __NR_putpmsg, "putpmsg" }, -#endif -#ifdef __NR_pwrite64 - { __NR_pwrite64, "pwrite64" }, -#endif -#ifdef __NR_pwritev - { __NR_pwritev, "pwritev" }, -#endif -#ifdef __NR_query_module - { __NR_query_module, "query_module" }, -#endif -#ifdef __NR_quotactl - { __NR_quotactl, "quotactl" }, -#endif -#ifdef __NR_read - { __NR_read, "read" }, -#endif -#ifdef __NR_readahead - { __NR_readahead, "readahead" }, -#endif -#ifdef __NR_readdir - { __NR_readdir, "readdir" }, -#endif -#ifdef __NR_readlink - { __NR_readlink, "readlink" }, -#endif -#ifdef __NR_readlinkat - { __NR_readlinkat, "readlinkat" }, -#endif -#ifdef __NR_readv - { __NR_readv, "readv" }, -#endif -#ifdef __NR_reboot - { __NR_reboot, "reboot" }, -#endif -#ifdef __NR_recvfrom - { __NR_recvfrom, "recvfrom" }, -#endif -#ifdef __NR_recvmmsg - { __NR_recvmmsg, "recvmmsg" }, -#endif -#ifdef __NR_recvmsg - { __NR_recvmsg, "recvmsg" }, -#endif -#ifdef __NR_remap_file_pages - { __NR_remap_file_pages, "remap_file_pages" }, -#endif -#ifdef __NR_removexattr - { __NR_removexattr, "removexattr" }, -#endif -#ifdef __NR_rename - { __NR_rename, "rename" }, -#endif -#ifdef __NR_renameat - { __NR_renameat, "renameat" }, -#endif -#ifdef __NR_request_key - { __NR_request_key, "request_key" }, -#endif -#ifdef __NR_restart_syscall - { __NR_restart_syscall, "restart_syscall" }, -#endif -#ifdef __NR_rmdir - { __NR_rmdir, "rmdir" }, -#endif -#ifdef __NR_rt_sigaction - { __NR_rt_sigaction, "rt_sigaction" }, -#endif -#ifdef __NR_rt_sigpending - { __NR_rt_sigpending, "rt_sigpending" }, -#endif -#ifdef __NR_rt_sigprocmask - { __NR_rt_sigprocmask, "rt_sigprocmask" }, -#endif -#ifdef __NR_rt_sigqueueinfo - { __NR_rt_sigqueueinfo, "rt_sigqueueinfo" }, -#endif -#ifdef __NR_rt_sigreturn - { __NR_rt_sigreturn, "rt_sigreturn" }, -#endif -#ifdef __NR_rt_sigsuspend - { __NR_rt_sigsuspend, "rt_sigsuspend" }, -#endif -#ifdef __NR_rt_sigtimedwait - { __NR_rt_sigtimedwait, "rt_sigtimedwait" }, -#endif -#ifdef __NR_rt_tgsigqueueinfo - { __NR_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" }, -#endif -#ifdef __NR_sched_get_priority_max - { __NR_sched_get_priority_max, "sched_get_priority_max" }, -#endif -#ifdef __NR_sched_get_priority_min - { __NR_sched_get_priority_min, "sched_get_priority_min" }, -#endif -#ifdef __NR_sched_getaffinity - { __NR_sched_getaffinity, "sched_getaffinity" }, -#endif -#ifdef __NR_sched_getparam - { __NR_sched_getparam, "sched_getparam" }, -#endif -#ifdef __NR_sched_getscheduler - { __NR_sched_getscheduler, "sched_getscheduler" }, -#endif -#ifdef __NR_sched_rr_get_interval - { __NR_sched_rr_get_interval, "sched_rr_get_interval" }, -#endif -#ifdef __NR_sched_setaffinity - { __NR_sched_setaffinity, "sched_setaffinity" }, -#endif -#ifdef __NR_sched_setparam - { __NR_sched_setparam, "sched_setparam" }, -#endif -#ifdef __NR_sched_setscheduler - { __NR_sched_setscheduler, "sched_setscheduler" }, -#endif -#ifdef __NR_sched_yield - { __NR_sched_yield, "sched_yield" }, -#endif -#ifdef __NR_security - { __NR_security, "security" }, -#endif -#ifdef __NR_select - { __NR_select, "select" }, -#endif -#ifdef __NR_semctl - { __NR_semctl, "semctl" }, -#endif -#ifdef __NR_semget - { __NR_semget, "semget" }, -#endif -#ifdef __NR_semop - { __NR_semop, "semop" }, -#endif -#ifdef __NR_semtimedop - { __NR_semtimedop, "semtimedop" }, -#endif -#ifdef __NR_sendfile - { __NR_sendfile, "sendfile" }, -#endif -#ifdef __NR_sendfile64 - { __NR_sendfile64, "sendfile64" }, -#endif -#ifdef __NR_sendmmsg - { __NR_sendmmsg, "sendmmsg" }, -#endif -#ifdef __NR_sendmsg - { __NR_sendmsg, "sendmsg" }, -#endif -#ifdef __NR_sendto - { __NR_sendto, "sendto" }, -#endif -#ifdef __NR_set_mempolicy - { __NR_set_mempolicy, "set_mempolicy" }, -#endif -#ifdef __NR_set_robust_list - { __NR_set_robust_list, "set_robust_list" }, -#endif -#ifdef __NR_set_thread_area - { __NR_set_thread_area, "set_thread_area" }, -#endif -#ifdef __NR_set_tid_address - { __NR_set_tid_address, "set_tid_address" }, -#endif -#ifdef __NR_setdomainname - { __NR_setdomainname, "setdomainname" }, -#endif -#ifdef __NR_setfsgid - { __NR_setfsgid, "setfsgid" }, -#endif -#ifdef __NR_setfsgid32 - { __NR_setfsgid32, "setfsgid32" }, -#endif -#ifdef __NR_setfsuid - { __NR_setfsuid, "setfsuid" }, -#endif -#ifdef __NR_setfsuid32 - { __NR_setfsuid32, "setfsuid32" }, -#endif -#ifdef __NR_setgid - { __NR_setgid, "setgid" }, -#endif -#ifdef __NR_setgid32 - { __NR_setgid32, "setgid32" }, -#endif -#ifdef __NR_setgroups - { __NR_setgroups, "setgroups" }, -#endif -#ifdef __NR_setgroups32 - { __NR_setgroups32, "setgroups32" }, -#endif -#ifdef __NR_sethostname - { __NR_sethostname, "sethostname" }, -#endif -#ifdef __NR_setitimer - { __NR_setitimer, "setitimer" }, -#endif -#ifdef __NR_setns - { __NR_setns, "setns" }, -#endif -#ifdef __NR_setpgid - { __NR_setpgid, "setpgid" }, -#endif -#ifdef __NR_setpriority - { __NR_setpriority, "setpriority" }, -#endif -#ifdef __NR_setregid - { __NR_setregid, "setregid" }, -#endif -#ifdef __NR_setregid32 - { __NR_setregid32, "setregid32" }, -#endif -#ifdef __NR_setresgid - { __NR_setresgid, "setresgid" }, -#endif -#ifdef __NR_setresgid32 - { __NR_setresgid32, "setresgid32" }, -#endif -#ifdef __NR_setresuid - { __NR_setresuid, "setresuid" }, -#endif -#ifdef __NR_setresuid32 - { __NR_setresuid32, "setresuid32" }, -#endif -#ifdef __NR_setreuid - { __NR_setreuid, "setreuid" }, -#endif -#ifdef __NR_setreuid32 - { __NR_setreuid32, "setreuid32" }, -#endif -#ifdef __NR_setrlimit - { __NR_setrlimit, "setrlimit" }, -#endif -#ifdef __NR_setsid - { __NR_setsid, "setsid" }, -#endif -#ifdef __NR_setsockopt - { __NR_setsockopt, "setsockopt" }, -#endif -#ifdef __NR_settimeofday - { __NR_settimeofday, "settimeofday" }, -#endif -#ifdef __NR_setuid - { __NR_setuid, "setuid" }, -#endif -#ifdef __NR_setuid32 - { __NR_setuid32, "setuid32" }, -#endif -#ifdef __NR_setxattr - { __NR_setxattr, "setxattr" }, -#endif -#ifdef __NR_sgetmask - { __NR_sgetmask, "sgetmask" }, -#endif -#ifdef __NR_shmat - { __NR_shmat, "shmat" }, -#endif -#ifdef __NR_shmctl - { __NR_shmctl, "shmctl" }, -#endif -#ifdef __NR_shmdt - { __NR_shmdt, "shmdt" }, -#endif -#ifdef __NR_shmget - { __NR_shmget, "shmget" }, -#endif -#ifdef __NR_shutdown - { __NR_shutdown, "shutdown" }, -#endif -#ifdef __NR_sigaction - { __NR_sigaction, "sigaction" }, -#endif -#ifdef __NR_sigaltstack - { __NR_sigaltstack, "sigaltstack" }, -#endif -#ifdef __NR_signal - { __NR_signal, "signal" }, -#endif -#ifdef __NR_signalfd - { __NR_signalfd, "signalfd" }, -#endif -#ifdef __NR_signalfd4 - { __NR_signalfd4, "signalfd4" }, -#endif -#ifdef __NR_sigpending - { __NR_sigpending, "sigpending" }, -#endif -#ifdef __NR_sigprocmask - { __NR_sigprocmask, "sigprocmask" }, -#endif -#ifdef __NR_sigreturn - { __NR_sigreturn, "sigreturn" }, -#endif -#ifdef __NR_sigsuspend - { __NR_sigsuspend, "sigsuspend" }, -#endif -#ifdef __NR_socket - { __NR_socket, "socket" }, -#endif -#ifdef __NR_socketcall - { __NR_socketcall, "socketcall" }, -#endif -#ifdef __NR_socketpair - { __NR_socketpair, "socketpair" }, -#endif -#ifdef __NR_splice - { __NR_splice, "splice" }, -#endif -#ifdef __NR_ssetmask - { __NR_ssetmask, "ssetmask" }, -#endif -#ifdef __NR_stat - { __NR_stat, "stat" }, -#endif -#ifdef __NR_stat64 - { __NR_stat64, "stat64" }, -#endif -#ifdef __NR_statfs - { __NR_statfs, "statfs" }, -#endif -#ifdef __NR_statfs64 - { __NR_statfs64, "statfs64" }, -#endif -#ifdef __NR_stime - { __NR_stime, "stime" }, -#endif -#ifdef __NR_stty - { __NR_stty, "stty" }, -#endif -#ifdef __NR_swapoff - { __NR_swapoff, "swapoff" }, -#endif -#ifdef __NR_swapon - { __NR_swapon, "swapon" }, -#endif -#ifdef __NR_symlink - { __NR_symlink, "symlink" }, -#endif -#ifdef __NR_symlinkat - { __NR_symlinkat, "symlinkat" }, -#endif -#ifdef __NR_sync - { __NR_sync, "sync" }, -#endif -#ifdef __NR_sync_file_range - { __NR_sync_file_range, "sync_file_range" }, -#endif -#ifdef __NR_syncfs - { __NR_syncfs, "syncfs" }, -#endif -#ifdef __NR_sysfs - { __NR_sysfs, "sysfs" }, -#endif -#ifdef __NR_sysinfo - { __NR_sysinfo, "sysinfo" }, -#endif -#ifdef __NR_syslog - { __NR_syslog, "syslog" }, -#endif -#ifdef __NR_tee - { __NR_tee, "tee" }, -#endif -#ifdef __NR_tgkill - { __NR_tgkill, "tgkill" }, -#endif -#ifdef __NR_time - { __NR_time, "time" }, -#endif -#ifdef __NR_timer_create - { __NR_timer_create, "timer_create" }, -#endif -#ifdef __NR_timer_delete - { __NR_timer_delete, "timer_delete" }, -#endif -#ifdef __NR_timer_getoverrun - { __NR_timer_getoverrun, "timer_getoverrun" }, -#endif -#ifdef __NR_timer_gettime - { __NR_timer_gettime, "timer_gettime" }, -#endif -#ifdef __NR_timer_settime - { __NR_timer_settime, "timer_settime" }, -#endif -#ifdef __NR_timerfd_create - { __NR_timerfd_create, "timerfd_create" }, -#endif -#ifdef __NR_timerfd_gettime - { __NR_timerfd_gettime, "timerfd_gettime" }, -#endif -#ifdef __NR_timerfd_settime - { __NR_timerfd_settime, "timerfd_settime" }, -#endif -#ifdef __NR_times - { __NR_times, "times" }, -#endif -#ifdef __NR_tkill - { __NR_tkill, "tkill" }, -#endif -#ifdef __NR_truncate - { __NR_truncate, "truncate" }, -#endif -#ifdef __NR_truncate64 - { __NR_truncate64, "truncate64" }, -#endif -#ifdef __NR_tuxcall - { __NR_tuxcall, "tuxcall" }, -#endif -#ifdef __NR_ugetrlimit - { __NR_ugetrlimit, "ugetrlimit" }, -#endif -#ifdef __NR_ulimit - { __NR_ulimit, "ulimit" }, -#endif -#ifdef __NR_umask - { __NR_umask, "umask" }, -#endif -#ifdef __NR_umount - { __NR_umount, "umount" }, -#endif -#ifdef __NR_umount2 - { __NR_umount2, "umount2" }, -#endif -#ifdef __NR_uname - { __NR_uname, "uname" }, -#endif -#ifdef __NR_unlink - { __NR_unlink, "unlink" }, -#endif -#ifdef __NR_unlinkat - { __NR_unlinkat, "unlinkat" }, -#endif -#ifdef __NR_unshare - { __NR_unshare, "unshare" }, -#endif -#ifdef __NR_uselib - { __NR_uselib, "uselib" }, -#endif -#ifdef __NR_ustat - { __NR_ustat, "ustat" }, -#endif -#ifdef __NR_utime - { __NR_utime, "utime" }, -#endif -#ifdef __NR_utimensat - { __NR_utimensat, "utimensat" }, -#endif -#ifdef __NR_utimes - { __NR_utimes, "utimes" }, -#endif -#ifdef __NR_vfork - { __NR_vfork, "vfork" }, -#endif -#ifdef __NR_vhangup - { __NR_vhangup, "vhangup" }, -#endif -#ifdef __NR_vm86 - { __NR_vm86, "vm86" }, -#endif -#ifdef __NR_vm86old - { __NR_vm86old, "vm86old" }, -#endif -#ifdef __NR_vmsplice - { __NR_vmsplice, "vmsplice" }, -#endif -#ifdef __NR_vserver - { __NR_vserver, "vserver" }, -#endif -#ifdef __NR_wait4 - { __NR_wait4, "wait4" }, -#endif -#ifdef __NR_waitid - { __NR_waitid, "waitid" }, -#endif -#ifdef __NR_waitpid - { __NR_waitpid, "waitpid" }, -#endif -#ifdef __NR_write - { __NR_write, "write" }, -#endif -#ifdef __NR_writev - { __NR_writev, "writev" }, -#endif - {0, NULL} -}; - diff --git a/src/tor/src/common/pubsub.c b/src/tor/src/common/pubsub.c deleted file mode 100644 index 336e8a6e7..000000000 --- a/src/tor/src/common/pubsub.c +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file pubsub.c - * - * \brief DOCDOC - */ - -#include "orconfig.h" -#include "pubsub.h" -#include "container.h" - -/** Helper: insert s into topic's list of subscribers, keeping - * them sorted in priority order. */ -static void -subscriber_insert(pubsub_topic_t *topic, pubsub_subscriber_t *s) -{ - int i; - smartlist_t *sl = topic->subscribers; - for (i = 0; i < smartlist_len(sl); ++i) { - pubsub_subscriber_t *other = smartlist_get(sl, i); - if (s->priority < other->priority) { - break; - } - } - smartlist_insert(sl, i, s); -} - -/** - * Add a new subscriber to topic, where (when an event is triggered), - * we'll notify the function fn by passing it subscriber_data. - * Return a handle to the subscribe which can later be passed to - * pubsub_unsubscribe_(). - * - * Functions are called in priority order, from lowest to highest. - * - * See pubsub.h for subscribe_flags. - */ -const pubsub_subscriber_t * -pubsub_subscribe_(pubsub_topic_t *topic, - pubsub_subscriber_fn_t fn, - void *subscriber_data, - unsigned subscribe_flags, - unsigned priority) -{ - tor_assert(! topic->locked); - if (subscribe_flags & SUBSCRIBE_ATSTART) { - tor_assert(topic->n_events_fired == 0); - } - pubsub_subscriber_t *r = tor_malloc_zero(sizeof(*r)); - r->priority = priority; - r->subscriber_flags = subscribe_flags; - r->fn = fn; - r->subscriber_data = subscriber_data; - if (topic->subscribers == NULL) { - topic->subscribers = smartlist_new(); - } - subscriber_insert(topic, r); - return r; -} - -/** - * Remove the subscriber s from topic. After calling this - * function, s may no longer be used. - */ -int -pubsub_unsubscribe_(pubsub_topic_t *topic, - const pubsub_subscriber_t *s) -{ - tor_assert(! topic->locked); - smartlist_t *sl = topic->subscribers; - if (sl == NULL) - return -1; - int i = smartlist_pos(sl, s); - if (i == -1) - return -1; - pubsub_subscriber_t *tmp = smartlist_get(sl, i); - tor_assert(tmp == s); - smartlist_del_keeporder(sl, i); - tor_free(tmp); - return 0; -} - -/** - * For every subscriber s in topic, invoke notify_fn on s and - * event_data. Return 0 if there were no nonzero return values, and -1 if - * there were any. - */ -int -pubsub_notify_(pubsub_topic_t *topic, pubsub_notify_fn_t notify_fn, - void *event_data, unsigned notify_flags) -{ - tor_assert(! topic->locked); - (void) notify_flags; - smartlist_t *sl = topic->subscribers; - int n_bad = 0; - ++topic->n_events_fired; - if (sl == NULL) - return -1; - topic->locked = 1; - SMARTLIST_FOREACH_BEGIN(sl, pubsub_subscriber_t *, s) { - int r = notify_fn(s, event_data); - if (r != 0) - ++n_bad; - } SMARTLIST_FOREACH_END(s); - topic->locked = 0; - return (n_bad == 0) ? 0 : -1; -} - -/** - * Release all storage held by topic. - */ -void -pubsub_clear_(pubsub_topic_t *topic) -{ - tor_assert(! topic->locked); - - smartlist_t *sl = topic->subscribers; - if (sl == NULL) - return; - SMARTLIST_FOREACH_BEGIN(sl, pubsub_subscriber_t *, s) { - tor_free(s); - } SMARTLIST_FOREACH_END(s); - smartlist_free(sl); - topic->subscribers = NULL; - topic->n_events_fired = 0; -} - diff --git a/src/tor/src/common/pubsub.h b/src/tor/src/common/pubsub.h deleted file mode 100644 index 2bee3af08..000000000 --- a/src/tor/src/common/pubsub.h +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file pubsub.h - * \brief Macros to implement publish/subscribe abstractions. - * - * To use these macros, call DECLARE_PUBSUB_TOPIC() with an identifier to use - * as your topic. Below, I'm going to assume you say DECLARE_PUBSUB_TOPIC(T). - * - * Doing this will declare the following types: - * typedef struct T_event_data_t T_event_data_t; // you define this struct - * typedef struct T_subscriber_data_t T_subscriber_data_t; // this one too. - * typedef struct T_subscriber_t T_subscriber_t; // opaque - * typedef int (*T_subscriber_fn_t)(T_event_data_t*, T_subscriber_data_t*); - * - * and it will declare the following functions: - * const T_subscriber_t *T_subscribe(T_subscriber_fn_t, - * T_subscriber_data_t *, - * unsigned flags, - * unsigned priority); - * int T_unsubscribe(const T_subscriber_t *) - * - * Elsewhere you can say DECLARE_NOTIFY_PUBSUB_TOPIC(static, T), which - * declares: - * - * static int T_notify(T_event_data_t *, unsigned notify_flags); - * static void T_clear(void); - * - * And in some C file, you would define these functions with: - * IMPLEMENT_PUBSUB_TOPIC(static, T). - * - * The implementations will be small typesafe wrappers over generic versions - * of the above functions. - * - * To use the typesafe functions, you add any number of subscribers with - * T_subscribe(). Each has an associated function pointer, data pointer, - * and priority. Later, you can invoke T_notify() to declare that the - * event has occurred. Each of the subscribers will be invoked once. - **/ - -#ifndef TOR_PUBSUB_H -#define TOR_PUBSUB_H - -#include "torint.h" - -/** - * Flag for T_subscribe: die with an assertion failure if the event - * have ever been published before. Used when a subscriber must absolutely - * never have missed an event. - */ -#define SUBSCRIBE_ATSTART (1u<<0) - -#define DECLARE_PUBSUB_STRUCT_TYPES(name) \ - /* You define this type. */ \ - typedef struct name ## _event_data_t name ## _event_data_t; \ - /* You define this type. */ \ - typedef struct name ## _subscriber_data_t name ## _subscriber_data_t; - -#define DECLARE_PUBSUB_TOPIC(name) \ - /* This type is opaque. */ \ - typedef struct name ## _subscriber_t name ## _subscriber_t; \ - /* You declare functions matching this type. */ \ - typedef int (*name ## _subscriber_fn_t)( \ - name ## _event_data_t *data, \ - name ## _subscriber_data_t *extra); \ - /* Call this function to subscribe to a topic. */ \ - const name ## _subscriber_t *name ## _subscribe( \ - name##_subscriber_fn_t subscriber, \ - name##_subscriber_data_t *extra_data, \ - unsigned flags, \ - unsigned priority); \ - /* Call this function to unsubscribe from a topic. */ \ - int name ## _unsubscribe(const name##_subscriber_t *s); - -#define DECLARE_NOTIFY_PUBSUB_TOPIC(linkage, name) \ - /* Call this function to notify all subscribers. Flags not yet used. */ \ - linkage int name ## _notify(name ## _event_data_t *data, unsigned flags); \ - /* Call this function to release storage held by the topic. */ \ - linkage void name ## _clear(void); - -/** - * Type used to hold a generic function for a subscriber. - * - * [Yes, it is safe to cast to this, so long as we cast back to the original - * type before calling. From C99: "A pointer to a function of one type may be - * converted to a pointer to a function of another type and back again; the - * result shall compare equal to the original pointer."] -*/ -typedef int (*pubsub_subscriber_fn_t)(void *, void *); - -/** - * Helper type to implement pubsub abstraction. Don't use this directly. - * It represents a subscriber. - */ -typedef struct pubsub_subscriber_t { - /** Function to invoke when the event triggers. */ - pubsub_subscriber_fn_t fn; - /** Data associated with this subscriber. */ - void *subscriber_data; - /** Priority for this subscriber. Low priorities happen first. */ - unsigned priority; - /** Flags set on this subscriber. Not yet used.*/ - unsigned subscriber_flags; -} pubsub_subscriber_t; - -/** - * Helper type to implement pubsub abstraction. Don't use this directly. - * It represents a topic, and keeps a record of subscribers. - */ -typedef struct pubsub_topic_t { - /** List of subscribers to this topic. May be NULL. */ - struct smartlist_t *subscribers; - /** Total number of times that pubsub_notify_() has ever been called on this - * topic. */ - uint64_t n_events_fired; - /** True iff we're running 'notify' on this topic, and shouldn't allow - * any concurrent modifications or events. */ - unsigned locked; -} pubsub_topic_t; - -const pubsub_subscriber_t *pubsub_subscribe_(pubsub_topic_t *topic, - pubsub_subscriber_fn_t fn, - void *subscriber_data, - unsigned subscribe_flags, - unsigned priority); -int pubsub_unsubscribe_(pubsub_topic_t *topic, const pubsub_subscriber_t *sub); -void pubsub_clear_(pubsub_topic_t *topic); -typedef int (*pubsub_notify_fn_t)(pubsub_subscriber_t *subscriber, - void *notify_data); -int pubsub_notify_(pubsub_topic_t *topic, pubsub_notify_fn_t notify_fn, - void *notify_data, unsigned notify_flags); - -#define IMPLEMENT_PUBSUB_TOPIC(notify_linkage, name) \ - static pubsub_topic_t name ## _topic_ = { NULL, 0, 0 }; \ - const name ## _subscriber_t * \ - name ## _subscribe(name##_subscriber_fn_t subscriber, \ - name##_subscriber_data_t *extra_data, \ - unsigned flags, \ - unsigned priority) \ - { \ - const pubsub_subscriber_t *s; \ - s = pubsub_subscribe_(&name##_topic_, \ - (pubsub_subscriber_fn_t)subscriber, \ - extra_data, \ - flags, \ - priority); \ - return (const name##_subscriber_t *)s; \ - } \ - int \ - name ## _unsubscribe(const name##_subscriber_t *subscriber) \ - { \ - return pubsub_unsubscribe_(&name##_topic_, \ - (const pubsub_subscriber_t *)subscriber); \ - } \ - static int \ - name##_call_the_notify_fn_(pubsub_subscriber_t *subscriber, \ - void *notify_data) \ - { \ - name ## _subscriber_fn_t fn; \ - fn = (name ## _subscriber_fn_t) subscriber->fn; \ - return fn(notify_data, subscriber->subscriber_data); \ - } \ - notify_linkage int \ - name ## _notify(name ## _event_data_t *event_data, unsigned flags) \ - { \ - return pubsub_notify_(&name##_topic_, \ - name##_call_the_notify_fn_, \ - event_data, \ - flags); \ - } \ - notify_linkage void \ - name ## _clear(void) \ - { \ - pubsub_clear_(&name##_topic_); \ - } - -#endif /* !defined(TOR_PUBSUB_H) */ - diff --git a/src/tor/src/common/sandbox.c b/src/tor/src/common/sandbox.c deleted file mode 100644 index 37f582048..000000000 --- a/src/tor/src/common/sandbox.c +++ /dev/null @@ -1,1993 +0,0 @@ - /* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file sandbox.c - * \brief Code to enable sandboxing. - **/ - -#include "orconfig.h" - -#ifndef _LARGEFILE64_SOURCE -/** - * Temporarily required for O_LARGEFILE flag. Needs to be removed - * with the libevent fix. - */ -#define _LARGEFILE64_SOURCE -#endif /* !defined(_LARGEFILE64_SOURCE) */ - -/** Malloc mprotect limit in bytes. - * - * 28/06/2017: This value was increased from 16 MB to 20 MB after we introduced - * LZMA support in Tor (0.3.1.1-alpha). We limit our LZMA coder to 16 MB, but - * liblzma have a small overhead that we need to compensate for to avoid being - * killed by the sandbox. - */ -#define MALLOC_MP_LIM (20*1024*1024) - -#include -#include -#include - -#include "sandbox.h" -#include "container.h" -#include "torlog.h" -#include "torint.h" -#include "util.h" -#include "tor_queue.h" - -#include "ht.h" - -#define DEBUGGING_CLOSE - -#if defined(USE_LIBSECCOMP) - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_GNU_LIBC_VERSION_H -#include -#endif -#ifdef HAVE_LINUX_NETFILTER_IPV4_H -#include -#endif -#ifdef HAVE_LINUX_IF_H -#include -#endif -#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H -#include -#endif - -#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ - defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION) -#define USE_BACKTRACE -#define EXPOSE_CLEAN_BACKTRACE -#include "backtrace.h" -#endif /* defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && ... */ - -#ifdef USE_BACKTRACE -#include -#endif - -/** - * Linux 32 bit definitions - */ -#if defined(__i386__) - -#define REG_SYSCALL REG_EAX -#define M_SYSCALL gregs[REG_SYSCALL] - -/** - * Linux 64 bit definitions - */ -#elif defined(__x86_64__) - -#define REG_SYSCALL REG_RAX -#define M_SYSCALL gregs[REG_SYSCALL] - -#elif defined(__arm__) - -#define M_SYSCALL arm_r7 - -#elif defined(__aarch64__) && defined(__LP64__) - -#define REG_SYSCALL 8 -#define M_SYSCALL regs[REG_SYSCALL] - -#endif /* defined(__i386__) || ... */ - -/**Determines if at least one sandbox is active.*/ -static int sandbox_active = 0; -/** Holds the parameter list configuration for the sandbox.*/ -static sandbox_cfg_t *filter_dynamic = NULL; - -#undef SCMP_CMP -#define SCMP_CMP(a,b,c) ((struct scmp_arg_cmp){(a),(b),(c),0}) -#define SCMP_CMP_STR(a,b,c) \ - ((struct scmp_arg_cmp) {(a),(b),(intptr_t)(void*)(c),0}) -#define SCMP_CMP4(a,b,c,d) ((struct scmp_arg_cmp){(a),(b),(c),(d)}) -/* We use a wrapper here because these masked comparisons seem to be pretty - * verbose. Also, it's important to cast to scmp_datum_t before negating the - * mask, since otherwise the negation might get applied to a 32 bit value, and - * the high bits of the value might get masked out improperly. */ -#define SCMP_CMP_MASKED(a,b,c) \ - SCMP_CMP4((a), SCMP_CMP_MASKED_EQ, ~(scmp_datum_t)(b), (c)) - -/** Variable used for storing all syscall numbers that will be allowed with the - * stage 1 general Tor sandbox. - */ -static int filter_nopar_gen[] = { - SCMP_SYS(access), - SCMP_SYS(brk), - SCMP_SYS(clock_gettime), - SCMP_SYS(close), - SCMP_SYS(clone), - SCMP_SYS(epoll_create), - SCMP_SYS(epoll_wait), -#ifdef __NR_epoll_pwait - SCMP_SYS(epoll_pwait), -#endif -#ifdef HAVE_EVENTFD - SCMP_SYS(eventfd2), -#endif -#ifdef HAVE_PIPE2 - SCMP_SYS(pipe2), -#endif -#ifdef HAVE_PIPE - SCMP_SYS(pipe), -#endif -#ifdef __NR_fchmod - SCMP_SYS(fchmod), -#endif - SCMP_SYS(fcntl), - SCMP_SYS(fstat), -#ifdef __NR_fstat64 - SCMP_SYS(fstat64), -#endif - SCMP_SYS(futex), - SCMP_SYS(getdents), - SCMP_SYS(getdents64), - SCMP_SYS(getegid), -#ifdef __NR_getegid32 - SCMP_SYS(getegid32), -#endif - SCMP_SYS(geteuid), -#ifdef __NR_geteuid32 - SCMP_SYS(geteuid32), -#endif - SCMP_SYS(getgid), -#ifdef __NR_getgid32 - SCMP_SYS(getgid32), -#endif - SCMP_SYS(getpid), -#ifdef __NR_getrlimit - SCMP_SYS(getrlimit), -#endif - SCMP_SYS(gettimeofday), - SCMP_SYS(gettid), - SCMP_SYS(getuid), -#ifdef __NR_getuid32 - SCMP_SYS(getuid32), -#endif - SCMP_SYS(lseek), -#ifdef __NR__llseek - SCMP_SYS(_llseek), -#endif - SCMP_SYS(mkdir), - SCMP_SYS(mlockall), -#ifdef __NR_mmap - /* XXXX restrict this in the same ways as mmap2 */ - SCMP_SYS(mmap), -#endif - SCMP_SYS(munmap), -#ifdef __NR_prlimit - SCMP_SYS(prlimit), -#endif -#ifdef __NR_prlimit64 - SCMP_SYS(prlimit64), -#endif - SCMP_SYS(read), - SCMP_SYS(rt_sigreturn), - SCMP_SYS(sched_getaffinity), -#ifdef __NR_sched_yield - SCMP_SYS(sched_yield), -#endif - SCMP_SYS(sendmsg), - SCMP_SYS(set_robust_list), -#ifdef __NR_setrlimit - SCMP_SYS(setrlimit), -#endif -#ifdef __NR_sigaltstack - SCMP_SYS(sigaltstack), -#endif -#ifdef __NR_sigreturn - SCMP_SYS(sigreturn), -#endif - SCMP_SYS(stat), - SCMP_SYS(uname), - SCMP_SYS(wait4), - SCMP_SYS(write), - SCMP_SYS(writev), - SCMP_SYS(exit_group), - SCMP_SYS(exit), - - SCMP_SYS(madvise), -#ifdef __NR_stat64 - // getaddrinfo uses this.. - SCMP_SYS(stat64), -#endif - -#ifdef __NR_getrandom - SCMP_SYS(getrandom), -#endif - -#ifdef __NR_sysinfo - // qsort uses this.. - SCMP_SYS(sysinfo), -#endif - /* - * These socket syscalls are not required on x86_64 and not supported with - * some libseccomp versions (eg: 1.0.1) - */ -#if defined(__i386) - SCMP_SYS(recv), - SCMP_SYS(send), -#endif - - // socket syscalls - SCMP_SYS(bind), - SCMP_SYS(listen), - SCMP_SYS(connect), - SCMP_SYS(getsockname), - SCMP_SYS(recvmsg), - SCMP_SYS(recvfrom), - SCMP_SYS(sendto), - SCMP_SYS(unlink) -}; - -/* These macros help avoid the error where the number of filters we add on a - * single rule don't match the arg_cnt param. */ -#define seccomp_rule_add_0(ctx,act,call) \ - seccomp_rule_add((ctx),(act),(call),0) -#define seccomp_rule_add_1(ctx,act,call,f1) \ - seccomp_rule_add((ctx),(act),(call),1,(f1)) -#define seccomp_rule_add_2(ctx,act,call,f1,f2) \ - seccomp_rule_add((ctx),(act),(call),2,(f1),(f2)) -#define seccomp_rule_add_3(ctx,act,call,f1,f2,f3) \ - seccomp_rule_add((ctx),(act),(call),3,(f1),(f2),(f3)) -#define seccomp_rule_add_4(ctx,act,call,f1,f2,f3,f4) \ - seccomp_rule_add((ctx),(act),(call),4,(f1),(f2),(f3),(f4)) - -/** - * Function responsible for setting up the rt_sigaction syscall for - * the seccomp filter sandbox. - */ -static int -sb_rt_sigaction(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - unsigned i; - int rc; - int param[] = { SIGINT, SIGTERM, SIGPIPE, SIGUSR1, SIGUSR2, SIGHUP, SIGCHLD, -#ifdef SIGXFSZ - SIGXFSZ -#endif - }; - (void) filter; - - for (i = 0; i < ARRAY_LENGTH(param); i++) { - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigaction), - SCMP_CMP(0, SCMP_CMP_EQ, param[i])); - if (rc) - break; - } - - return rc; -} - -/** - * Function responsible for setting up the time syscall for - * the seccomp filter sandbox. - */ -static int -sb_time(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - (void) filter; -#ifdef __NR_time - return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(time), - SCMP_CMP(0, SCMP_CMP_EQ, 0)); -#else - return 0; -#endif /* defined(__NR_time) */ -} - -/** - * Function responsible for setting up the accept4 syscall for - * the seccomp filter sandbox. - */ -static int -sb_accept4(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void)filter; - -#ifdef __i386__ - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketcall), - SCMP_CMP(0, SCMP_CMP_EQ, 18)); - if (rc) { - return rc; - } -#endif /* defined(__i386__) */ - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(accept4), - SCMP_CMP_MASKED(3, SOCK_CLOEXEC|SOCK_NONBLOCK, 0)); - if (rc) { - return rc; - } - - return 0; -} - -#ifdef __NR_mmap2 -/** - * Function responsible for setting up the mmap2 syscall for - * the seccomp filter sandbox. - */ -static int -sb_mmap2(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void)filter; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_ANONYMOUS)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), - SCMP_CMP(3, SCMP_CMP_EQ,MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS)); - if (rc) { - return rc; - } - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mmap2), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_EXEC), - SCMP_CMP(3, SCMP_CMP_EQ, MAP_PRIVATE|MAP_DENYWRITE)); - if (rc) { - return rc; - } - - return 0; -} -#endif /* defined(__NR_mmap2) */ - -#ifdef HAVE_GNU_LIBC_VERSION_H -#ifdef HAVE_GNU_GET_LIBC_VERSION -#define CHECK_LIBC_VERSION -#endif -#endif - -/* Return true if we think we're running with a libc that always uses - * openat on linux. */ -static int -libc_uses_openat_for_everything(void) -{ -#ifdef CHECK_LIBC_VERSION - const char *version = gnu_get_libc_version(); - if (version == NULL) - return 0; - - int major = -1; - int minor = -1; - - tor_sscanf(version, "%d.%d", &major, &minor); - if (major >= 3) - return 1; - else if (major == 2 && minor >= 26) - return 1; - else - return 0; -#else /* !(defined(CHECK_LIBC_VERSION)) */ - return 0; -#endif /* defined(CHECK_LIBC_VERSION) */ -} - -/** Allow a single file to be opened. If use_openat is true, - * we're using a libc that remaps all the opens into openats. */ -static int -allow_file_open(scmp_filter_ctx ctx, int use_openat, const char *file) -{ - if (use_openat) { - return seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), - SCMP_CMP_STR(0, SCMP_CMP_EQ, AT_FDCWD), - SCMP_CMP_STR(1, SCMP_CMP_EQ, file)); - } else { - return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), - SCMP_CMP_STR(0, SCMP_CMP_EQ, file)); - } -} - -/** - * Function responsible for setting up the open syscall for - * the seccomp filter sandbox. - */ -static int -sb_open(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - sandbox_cfg_t *elem = NULL; - - int use_openat = libc_uses_openat_for_everything(); - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && param->syscall - == SCMP_SYS(open)) { - rc = allow_file_open(ctx, use_openat, param->value); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add open syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(open), - SCMP_CMP_MASKED(1, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|O_NOFOLLOW, - O_RDONLY)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add open syscall, received libseccomp " - "error %d", rc); - return rc; - } - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(openat), - SCMP_CMP_MASKED(2, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|O_NOFOLLOW, - O_RDONLY)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add openat syscall, received " - "libseccomp error %d", rc); - return rc; - } - - return 0; -} - -static int -sb_chmod(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - sandbox_cfg_t *elem = NULL; - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && param->syscall - == SCMP_SYS(chmod)) { - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(chmod), - SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add chmod syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - return 0; -} - -static int -sb_chown(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - sandbox_cfg_t *elem = NULL; - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && param->syscall - == SCMP_SYS(chown)) { - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(chown), - SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add chown syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - return 0; -} - -static int -sb__sysctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - (void) filter; - (void) ctx; - - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(_sysctl)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add _sysctl syscall, " - "received libseccomp error %d", rc); - return rc; - } - - return 0; -} - -/** - * Function responsible for setting up the rename syscall for - * the seccomp filter sandbox. - */ -static int -sb_rename(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - sandbox_cfg_t *elem = NULL; - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && - param->syscall == SCMP_SYS(rename)) { - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rename), - SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value), - SCMP_CMP_STR(1, SCMP_CMP_EQ, param->value2)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add rename syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - return 0; -} - -/** - * Function responsible for setting up the openat syscall for - * the seccomp filter sandbox. - */ -static int -sb_openat(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - sandbox_cfg_t *elem = NULL; - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && param->syscall - == SCMP_SYS(openat)) { - rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), - SCMP_CMP(0, SCMP_CMP_EQ, AT_FDCWD), - SCMP_CMP_STR(1, SCMP_CMP_EQ, param->value), - SCMP_CMP(2, SCMP_CMP_EQ, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY| - O_CLOEXEC)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add openat syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - return 0; -} - -/** - * Function responsible for setting up the socket syscall for - * the seccomp filter sandbox. - */ -static int -sb_socket(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - int i, j; - (void) filter; - -#ifdef __i386__ - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket)); - if (rc) - return rc; -#endif - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), - SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE), - SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_STREAM)); - if (rc) - return rc; - - for (i = 0; i < 2; ++i) { - const int pf = i ? PF_INET : PF_INET6; - for (j=0; j < 3; ++j) { - const int type = (j == 0) ? SOCK_STREAM : - SOCK_DGRAM; - const int protocol = (j == 0) ? IPPROTO_TCP : - (j == 1) ? IPPROTO_IP : - IPPROTO_UDP; - rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), - SCMP_CMP(0, SCMP_CMP_EQ, pf), - SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, type), - SCMP_CMP(2, SCMP_CMP_EQ, protocol)); - if (rc) - return rc; - } - } - - rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), - SCMP_CMP(0, SCMP_CMP_EQ, PF_UNIX), - SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_STREAM), - SCMP_CMP(2, SCMP_CMP_EQ, 0)); - if (rc) - return rc; - - rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), - SCMP_CMP(0, SCMP_CMP_EQ, PF_UNIX), - SCMP_CMP_MASKED(1, SOCK_CLOEXEC|SOCK_NONBLOCK, SOCK_DGRAM), - SCMP_CMP(2, SCMP_CMP_EQ, 0)); - if (rc) - return rc; - - rc = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socket), - SCMP_CMP(0, SCMP_CMP_EQ, PF_NETLINK), - SCMP_CMP_MASKED(1, SOCK_CLOEXEC, SOCK_RAW), - SCMP_CMP(2, SCMP_CMP_EQ, 0)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the socketpair syscall for - * the seccomp filter sandbox. - */ -static int -sb_socketpair(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - -#ifdef __i386__ - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair)); - if (rc) - return rc; -#endif - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(socketpair), - SCMP_CMP(0, SCMP_CMP_EQ, PF_FILE), - SCMP_CMP(1, SCMP_CMP_EQ, SOCK_STREAM|SOCK_CLOEXEC)); - if (rc) - return rc; - - return 0; -} - -#ifdef HAVE_KIST_SUPPORT - -#include - -static int -sb_ioctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(ioctl), - SCMP_CMP(1, SCMP_CMP_EQ, SIOCOUTQNSD)); - if (rc) - return rc; - return 0; -} - -#endif /* defined(HAVE_KIST_SUPPORT) */ - -/** - * Function responsible for setting up the setsockopt syscall for - * the seccomp filter sandbox. - */ -static int -sb_setsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - -#ifdef __i386__ - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt)); - if (rc) - return rc; -#endif - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_REUSEADDR)); - if (rc) - return rc; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_SNDBUF)); - if (rc) - return rc; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_RCVBUF)); - if (rc) - return rc; - -#ifdef HAVE_SYSTEMD - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_SNDBUFFORCE)); - if (rc) - return rc; -#endif /* defined(HAVE_SYSTEMD) */ - -#ifdef IP_TRANSPARENT - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP), - SCMP_CMP(2, SCMP_CMP_EQ, IP_TRANSPARENT)); - if (rc) - return rc; -#endif /* defined(IP_TRANSPARENT) */ - -#ifdef IPV6_V6ONLY - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(setsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, IPPROTO_IPV6), - SCMP_CMP(2, SCMP_CMP_EQ, IPV6_V6ONLY)); - if (rc) - return rc; -#endif /* defined(IPV6_V6ONLY) */ - - return 0; -} - -/** - * Function responsible for setting up the getsockopt syscall for - * the seccomp filter sandbox. - */ -static int -sb_getsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - -#ifdef __i386__ - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt)); - if (rc) - return rc; -#endif - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_ERROR)); - if (rc) - return rc; - -#ifdef HAVE_SYSTEMD - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_SOCKET), - SCMP_CMP(2, SCMP_CMP_EQ, SO_SNDBUF)); - if (rc) - return rc; -#endif /* defined(HAVE_SYSTEMD) */ - -#ifdef HAVE_LINUX_NETFILTER_IPV4_H - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP), - SCMP_CMP(2, SCMP_CMP_EQ, SO_ORIGINAL_DST)); - if (rc) - return rc; -#endif /* defined(HAVE_LINUX_NETFILTER_IPV4_H) */ - -#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_IPV6), - SCMP_CMP(2, SCMP_CMP_EQ, IP6T_SO_ORIGINAL_DST)); - if (rc) - return rc; -#endif /* defined(HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H) */ - -#ifdef HAVE_KIST_SUPPORT -#include - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), - SCMP_CMP(1, SCMP_CMP_EQ, SOL_TCP), - SCMP_CMP(2, SCMP_CMP_EQ, TCP_INFO)); - if (rc) - return rc; -#endif /* defined(HAVE_KIST_SUPPORT) */ - - return 0; -} - -#ifdef __NR_fcntl64 -/** - * Function responsible for setting up the fcntl64 syscall for - * the seccomp filter sandbox. - */ -static int -sb_fcntl64(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), - SCMP_CMP(1, SCMP_CMP_EQ, F_GETFL)); - if (rc) - return rc; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), - SCMP_CMP(1, SCMP_CMP_EQ, F_SETFL), - SCMP_CMP(2, SCMP_CMP_EQ, O_RDWR|O_NONBLOCK)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), - SCMP_CMP(1, SCMP_CMP_EQ, F_GETFD)); - if (rc) - return rc; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fcntl64), - SCMP_CMP(1, SCMP_CMP_EQ, F_SETFD), - SCMP_CMP(2, SCMP_CMP_EQ, FD_CLOEXEC)); - if (rc) - return rc; - - return 0; -} -#endif /* defined(__NR_fcntl64) */ - -/** - * Function responsible for setting up the epoll_ctl syscall for - * the seccomp filter sandbox. - * - * Note: basically allows everything but will keep for now.. - */ -static int -sb_epoll_ctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), - SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_ADD)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), - SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_MOD)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_ctl), - SCMP_CMP(1, SCMP_CMP_EQ, EPOLL_CTL_DEL)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the prctl syscall for - * the seccomp filter sandbox. - * - * NOTE: if multiple filters need to be added, the PR_SECCOMP parameter needs - * to be whitelisted in this function. - */ -static int -sb_prctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(prctl), - SCMP_CMP(0, SCMP_CMP_EQ, PR_SET_DUMPABLE)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the mprotect syscall for - * the seccomp filter sandbox. - * - * NOTE: does not NEED to be here.. currently only occurs before filter; will - * keep just in case for the future. - */ -static int -sb_mprotect(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_NONE)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the rt_sigprocmask syscall for - * the seccomp filter sandbox. - */ -static int -sb_rt_sigprocmask(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask), - SCMP_CMP(0, SCMP_CMP_EQ, SIG_UNBLOCK)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigprocmask), - SCMP_CMP(0, SCMP_CMP_EQ, SIG_SETMASK)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the flock syscall for - * the seccomp filter sandbox. - * - * NOTE: does not need to be here, occurs before filter is applied. - */ -static int -sb_flock(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock), - SCMP_CMP(1, SCMP_CMP_EQ, LOCK_EX|LOCK_NB)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(flock), - SCMP_CMP(1, SCMP_CMP_EQ, LOCK_UN)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the futex syscall for - * the seccomp filter sandbox. - */ -static int -sb_futex(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - // can remove - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), - SCMP_CMP(1, SCMP_CMP_EQ, - FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), - SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAKE_PRIVATE)); - if (rc) - return rc; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(futex), - SCMP_CMP(1, SCMP_CMP_EQ, FUTEX_WAIT_PRIVATE)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the mremap syscall for - * the seccomp filter sandbox. - * - * NOTE: so far only occurs before filter is applied. - */ -static int -sb_mremap(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mremap), - SCMP_CMP(3, SCMP_CMP_EQ, MREMAP_MAYMOVE)); - if (rc) - return rc; - - return 0; -} - -/** - * Function responsible for setting up the poll syscall for - * the seccomp filter sandbox. - */ -static int -sb_poll(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - (void) filter; - - rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(poll), - SCMP_CMP(1, SCMP_CMP_EQ, 1), - SCMP_CMP(2, SCMP_CMP_EQ, 10)); - if (rc) - return rc; - - return 0; -} - -#ifdef __NR_stat64 -/** - * Function responsible for setting up the stat64 syscall for - * the seccomp filter sandbox. - */ -static int -sb_stat64(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - int rc = 0; - sandbox_cfg_t *elem = NULL; - - // for each dynamic parameter filters - for (elem = filter; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param != NULL && param->prot == 1 && (param->syscall == SCMP_SYS(open) - || param->syscall == SCMP_SYS(stat64))) { - rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat64), - SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value)); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add stat64 syscall, received " - "libseccomp error %d", rc); - return rc; - } - } - } - - return 0; -} -#endif /* defined(__NR_stat64) */ - -static int -sb_kill(scmp_filter_ctx ctx, sandbox_cfg_t *filter) -{ - (void) filter; -#ifdef __NR_kill - /* Allow killing anything with signal 0 -- it isn't really a kill. */ - return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(kill), - SCMP_CMP(1, SCMP_CMP_EQ, 0)); -#else - return 0; -#endif /* defined(__NR_kill) */ -} - -/** - * Array of function pointers responsible for filtering different syscalls at - * a parameter level. - */ -static sandbox_filter_func_t filter_func[] = { - sb_rt_sigaction, - sb_rt_sigprocmask, - sb_time, - sb_accept4, -#ifdef __NR_mmap2 - sb_mmap2, -#endif - sb_chown, - sb_chmod, - sb_open, - sb_openat, - sb__sysctl, - sb_rename, -#ifdef __NR_fcntl64 - sb_fcntl64, -#endif - sb_epoll_ctl, - sb_prctl, - sb_mprotect, - sb_flock, - sb_futex, - sb_mremap, - sb_poll, -#ifdef __NR_stat64 - sb_stat64, -#endif - - sb_socket, - sb_setsockopt, - sb_getsockopt, - sb_socketpair, -#ifdef HAVE_KIST_SUPPORT - sb_ioctl, -#endif - sb_kill -}; - -const char * -sandbox_intern_string(const char *str) -{ - sandbox_cfg_t *elem; - - if (str == NULL) - return NULL; - - for (elem = filter_dynamic; elem != NULL; elem = elem->next) { - smp_param_t *param = elem->param; - - if (param->prot) { - if (!strcmp(str, (char*)(param->value))) { - return (char*)param->value; - } - if (param->value2 && !strcmp(str, (char*)param->value2)) { - return (char*)param->value2; - } - } - } - - if (sandbox_active) - log_warn(LD_BUG, "No interned sandbox parameter found for %s", str); - return str; -} - -/* DOCDOC */ -static int -prot_strings_helper(strmap_t *locations, - char **pr_mem_next_p, - size_t *pr_mem_left_p, - char **value_p) -{ - char *param_val; - size_t param_size; - void *location; - - if (*value_p == 0) - return 0; - - param_val = (char*) *value_p; - param_size = strlen(param_val) + 1; - location = strmap_get(locations, param_val); - - if (location) { - // We already interned this string. - tor_free(param_val); - *value_p = location; - return 0; - } else if (*pr_mem_left_p >= param_size) { - // copy to protected - location = *pr_mem_next_p; - memcpy(location, param_val, param_size); - - // re-point el parameter to protected - tor_free(param_val); - *value_p = location; - - strmap_set(locations, location, location); /* good real estate advice */ - - // move next available protected memory - *pr_mem_next_p += param_size; - *pr_mem_left_p -= param_size; - return 0; - } else { - log_err(LD_BUG,"(Sandbox) insufficient protected memory!"); - return -1; - } -} - -/** - * Protects all the strings in the sandbox's parameter list configuration. It - * works by calculating the total amount of memory required by the parameter - * list, allocating the memory using mmap, and protecting it from writes with - * mprotect(). - */ -static int -prot_strings(scmp_filter_ctx ctx, sandbox_cfg_t* cfg) -{ - int ret = 0; - size_t pr_mem_size = 0, pr_mem_left = 0; - char *pr_mem_next = NULL, *pr_mem_base; - sandbox_cfg_t *el = NULL; - strmap_t *locations = NULL; - - // get total number of bytes required to mmap. (Overestimate.) - for (el = cfg; el != NULL; el = el->next) { - pr_mem_size += strlen((char*) el->param->value) + 1; - if (el->param->value2) - pr_mem_size += strlen((char*) el->param->value2) + 1; - } - - // allocate protected memory with MALLOC_MP_LIM canary - pr_mem_base = (char*) mmap(NULL, MALLOC_MP_LIM + pr_mem_size, - PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); - if (pr_mem_base == MAP_FAILED) { - log_err(LD_BUG,"(Sandbox) failed allocate protected memory! mmap: %s", - strerror(errno)); - ret = -1; - goto out; - } - - pr_mem_next = pr_mem_base + MALLOC_MP_LIM; - pr_mem_left = pr_mem_size; - - locations = strmap_new(); - - // change el value pointer to protected - for (el = cfg; el != NULL; el = el->next) { - if (prot_strings_helper(locations, &pr_mem_next, &pr_mem_left, - &el->param->value) < 0) { - ret = -2; - goto out; - } - if (prot_strings_helper(locations, &pr_mem_next, &pr_mem_left, - &el->param->value2) < 0) { - ret = -2; - goto out; - } - el->param->prot = 1; - } - - // protecting from writes - if (mprotect(pr_mem_base, MALLOC_MP_LIM + pr_mem_size, PROT_READ)) { - log_err(LD_BUG,"(Sandbox) failed to protect memory! mprotect: %s", - strerror(errno)); - ret = -3; - goto out; - } - - /* - * Setting sandbox restrictions so the string memory cannot be tampered with - */ - // no mremap of the protected base address - ret = seccomp_rule_add_1(ctx, SCMP_ACT_KILL, SCMP_SYS(mremap), - SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base)); - if (ret) { - log_err(LD_BUG,"(Sandbox) mremap protected memory filter fail!"); - goto out; - } - - // no munmap of the protected base address - ret = seccomp_rule_add_1(ctx, SCMP_ACT_KILL, SCMP_SYS(munmap), - SCMP_CMP(0, SCMP_CMP_EQ, (intptr_t) pr_mem_base)); - if (ret) { - log_err(LD_BUG,"(Sandbox) munmap protected memory filter fail!"); - goto out; - } - - /* - * Allow mprotect with PROT_READ|PROT_WRITE because openssl uses it, but - * never over the memory region used by the protected strings. - * - * PROT_READ|PROT_WRITE was originally fully allowed in sb_mprotect(), but - * had to be removed due to limitation of libseccomp regarding intervals. - * - * There is a restriction on how much you can mprotect with R|W up to the - * size of the canary. - */ - ret = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), - SCMP_CMP(0, SCMP_CMP_LT, (intptr_t) pr_mem_base), - SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE)); - if (ret) { - log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (LT)!"); - goto out; - } - - ret = seccomp_rule_add_3(ctx, SCMP_ACT_ALLOW, SCMP_SYS(mprotect), - SCMP_CMP(0, SCMP_CMP_GT, (intptr_t) pr_mem_base + pr_mem_size + - MALLOC_MP_LIM), - SCMP_CMP(1, SCMP_CMP_LE, MALLOC_MP_LIM), - SCMP_CMP(2, SCMP_CMP_EQ, PROT_READ|PROT_WRITE)); - if (ret) { - log_err(LD_BUG,"(Sandbox) mprotect protected memory filter fail (GT)!"); - goto out; - } - - out: - strmap_free(locations, NULL); - return ret; -} - -/** - * Auxiliary function used in order to allocate a sandbox_cfg_t element and set - * its values according the parameter list. All elements are initialised - * with the 'prot' field set to false, as the pointer is not protected at this - * point. - */ -static sandbox_cfg_t* -new_element2(int syscall, char *value, char *value2) -{ - smp_param_t *param = NULL; - - sandbox_cfg_t *elem = tor_malloc_zero(sizeof(sandbox_cfg_t)); - param = elem->param = tor_malloc_zero(sizeof(smp_param_t)); - - param->syscall = syscall; - param->value = value; - param->value2 = value2; - param->prot = 0; - - return elem; -} - -static sandbox_cfg_t* -new_element(int syscall, char *value) -{ - return new_element2(syscall, value, NULL); -} - -#ifdef __NR_stat64 -#define SCMP_stat SCMP_SYS(stat64) -#else -#define SCMP_stat SCMP_SYS(stat) -#endif - -int -sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element(SCMP_stat, file); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -int -sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element(SCMP_SYS(open), file); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -int -sandbox_cfg_allow_chmod_filename(sandbox_cfg_t **cfg, char *file) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element(SCMP_SYS(chmod), file); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -int -sandbox_cfg_allow_chown_filename(sandbox_cfg_t **cfg, char *file) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element(SCMP_SYS(chown), file); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -int -sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element2(SCMP_SYS(rename), file1, file2); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -int -sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file) -{ - sandbox_cfg_t *elem = NULL; - - elem = new_element(SCMP_SYS(openat), file); - - elem->next = *cfg; - *cfg = elem; - - return 0; -} - -/** Cache entry for getaddrinfo results; used when sandboxing is implemented - * so that we can consult the cache when the sandbox prevents us from doing - * getaddrinfo. - * - * We support only a limited range of getaddrinfo calls, where servname is null - * and hints contains only socktype=SOCK_STREAM, family in INET,INET6,UNSPEC. - */ -typedef struct cached_getaddrinfo_item_t { - HT_ENTRY(cached_getaddrinfo_item_t) node; - char *name; - int family; - /** set if no error; otherwise NULL */ - struct addrinfo *res; - /** 0 for no error; otherwise an EAI_* value */ - int err; -} cached_getaddrinfo_item_t; - -static unsigned -cached_getaddrinfo_item_hash(const cached_getaddrinfo_item_t *item) -{ - return (unsigned)siphash24g(item->name, strlen(item->name)) + item->family; -} - -static unsigned -cached_getaddrinfo_items_eq(const cached_getaddrinfo_item_t *a, - const cached_getaddrinfo_item_t *b) -{ - return (a->family == b->family) && 0 == strcmp(a->name, b->name); -} - -#define cached_getaddrinfo_item_free(item) \ - FREE_AND_NULL(cached_getaddrinfo_item_t, \ - cached_getaddrinfo_item_free_, (item)) - -static void -cached_getaddrinfo_item_free_(cached_getaddrinfo_item_t *item) -{ - if (item == NULL) - return; - - tor_free(item->name); - if (item->res) - freeaddrinfo(item->res); - tor_free(item); -} - -static HT_HEAD(getaddrinfo_cache, cached_getaddrinfo_item_t) - getaddrinfo_cache = HT_INITIALIZER(); - -HT_PROTOTYPE(getaddrinfo_cache, cached_getaddrinfo_item_t, node, - cached_getaddrinfo_item_hash, - cached_getaddrinfo_items_eq) -HT_GENERATE2(getaddrinfo_cache, cached_getaddrinfo_item_t, node, - cached_getaddrinfo_item_hash, - cached_getaddrinfo_items_eq, - 0.6, tor_reallocarray_, tor_free_) - -/** If true, don't try to cache getaddrinfo results. */ -static int sandbox_getaddrinfo_cache_disabled = 0; - -/** Tell the sandbox layer not to try to cache getaddrinfo results. Used as in - * tor-resolve, when we have no intention of initializing crypto or of - * installing the sandbox.*/ -void -sandbox_disable_getaddrinfo_cache(void) -{ - sandbox_getaddrinfo_cache_disabled = 1; -} - -void -sandbox_freeaddrinfo(struct addrinfo *ai) -{ - if (sandbox_getaddrinfo_cache_disabled) - freeaddrinfo(ai); -} - -int -sandbox_getaddrinfo(const char *name, const char *servname, - const struct addrinfo *hints, - struct addrinfo **res) -{ - int err; - struct cached_getaddrinfo_item_t search, *item; - - if (sandbox_getaddrinfo_cache_disabled) { - return getaddrinfo(name, NULL, hints, res); - } - - if (servname != NULL) { - log_warn(LD_BUG, "called with non-NULL servname"); - return EAI_NONAME; - } - if (name == NULL) { - log_warn(LD_BUG, "called with NULL name"); - return EAI_NONAME; - } - - *res = NULL; - - memset(&search, 0, sizeof(search)); - search.name = (char *) name; - search.family = hints ? hints->ai_family : AF_UNSPEC; - item = HT_FIND(getaddrinfo_cache, &getaddrinfo_cache, &search); - - if (! sandbox_is_active()) { - /* If the sandbox is not turned on yet, then getaddrinfo and store the - result. */ - - err = getaddrinfo(name, NULL, hints, res); - log_info(LD_NET,"(Sandbox) getaddrinfo %s.", err ? "failed" : "succeeded"); - - if (! item) { - item = tor_malloc_zero(sizeof(*item)); - item->name = tor_strdup(name); - item->family = hints ? hints->ai_family : AF_UNSPEC; - HT_INSERT(getaddrinfo_cache, &getaddrinfo_cache, item); - } - - if (item->res) { - freeaddrinfo(item->res); - item->res = NULL; - } - item->res = *res; - item->err = err; - return err; - } - - /* Otherwise, the sandbox is on. If we have an item, yield its cached - result. */ - if (item) { - *res = item->res; - return item->err; - } - - /* getting here means something went wrong */ - log_err(LD_BUG,"(Sandbox) failed to get address %s!", name); - return EAI_NONAME; -} - -int -sandbox_add_addrinfo(const char *name) -{ - struct addrinfo *res; - struct addrinfo hints; - int i; - static const int families[] = { AF_INET, AF_INET6, AF_UNSPEC }; - - memset(&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - for (i = 0; i < 3; ++i) { - hints.ai_family = families[i]; - - res = NULL; - (void) sandbox_getaddrinfo(name, NULL, &hints, &res); - if (res) - sandbox_freeaddrinfo(res); - } - - return 0; -} - -void -sandbox_free_getaddrinfo_cache(void) -{ - cached_getaddrinfo_item_t **next, **item, *this; - - for (item = HT_START(getaddrinfo_cache, &getaddrinfo_cache); - item; - item = next) { - this = *item; - next = HT_NEXT_RMV(getaddrinfo_cache, &getaddrinfo_cache, item); - cached_getaddrinfo_item_free(this); - } - - HT_CLEAR(getaddrinfo_cache, &getaddrinfo_cache); -} - -/** - * Function responsible for going through the parameter syscall filters and - * call each function pointer in the list. - */ -static int -add_param_filter(scmp_filter_ctx ctx, sandbox_cfg_t* cfg) -{ - unsigned i; - int rc = 0; - - // function pointer - for (i = 0; i < ARRAY_LENGTH(filter_func); i++) { - rc = filter_func[i](ctx, cfg); - if (rc) { - log_err(LD_BUG,"(Sandbox) failed to add syscall %d, received libseccomp " - "error %d", i, rc); - return rc; - } - } - - return 0; -} - -/** - * Function responsible of loading the libseccomp syscall filters which do not - * have parameter filtering. - */ -static int -add_noparam_filter(scmp_filter_ctx ctx) -{ - unsigned i; - int rc = 0; - - // add general filters - for (i = 0; i < ARRAY_LENGTH(filter_nopar_gen); i++) { - rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, filter_nopar_gen[i]); - if (rc != 0) { - log_err(LD_BUG,"(Sandbox) failed to add syscall index %d (NR=%d), " - "received libseccomp error %d", i, filter_nopar_gen[i], rc); - return rc; - } - } - - return 0; -} - -/** - * Function responsible for setting up and enabling a global syscall filter. - * The function is a prototype developed for stage 1 of sandboxing Tor. - * Returns 0 on success. - */ -static int -install_syscall_filter(sandbox_cfg_t* cfg) -{ - int rc = 0; - scmp_filter_ctx ctx; - - ctx = seccomp_init(SCMP_ACT_TRAP); - if (ctx == NULL) { - log_err(LD_BUG,"(Sandbox) failed to initialise libseccomp context"); - rc = -1; - goto end; - } - - // protectign sandbox parameter strings - if ((rc = prot_strings(ctx, cfg))) { - goto end; - } - - // add parameter filters - if ((rc = add_param_filter(ctx, cfg))) { - log_err(LD_BUG, "(Sandbox) failed to add param filters!"); - goto end; - } - - // adding filters with no parameters - if ((rc = add_noparam_filter(ctx))) { - log_err(LD_BUG, "(Sandbox) failed to add param filters!"); - goto end; - } - - // loading the seccomp2 filter - if ((rc = seccomp_load(ctx))) { - log_err(LD_BUG, "(Sandbox) failed to load: %d (%s)! " - "Are you sure that your kernel has seccomp2 support? The " - "sandbox won't work without it.", rc, - strerror(-rc)); - goto end; - } - - // marking the sandbox as active - sandbox_active = 1; - - end: - seccomp_release(ctx); - return (rc < 0 ? -rc : rc); -} - -#include "linux_syscalls.inc" -static const char * -get_syscall_name(int syscall_num) -{ - int i; - for (i = 0; SYSCALLS_BY_NUMBER[i].syscall_name; ++i) { - if (SYSCALLS_BY_NUMBER[i].syscall_num == syscall_num) - return SYSCALLS_BY_NUMBER[i].syscall_name; - } - - { - static char syscall_name_buf[64]; - format_dec_number_sigsafe(syscall_num, - syscall_name_buf, sizeof(syscall_name_buf)); - return syscall_name_buf; - } -} - -#ifdef USE_BACKTRACE -#define MAX_DEPTH 256 -static void *syscall_cb_buf[MAX_DEPTH]; -#endif - -/** - * Function called when a SIGSYS is caught by the application. It notifies the - * user that an error has occurred and either terminates or allows the - * application to continue execution, based on the DEBUGGING_CLOSE symbol. - */ -static void -sigsys_debugging(int nr, siginfo_t *info, void *void_context) -{ - ucontext_t *ctx = (ucontext_t *) (void_context); - const char *syscall_name; - int syscall; -#ifdef USE_BACKTRACE - size_t depth; - int n_fds, i; - const int *fds = NULL; -#endif - - (void) nr; - - if (info->si_code != SYS_SECCOMP) - return; - - if (!ctx) - return; - - syscall = (int) ctx->uc_mcontext.M_SYSCALL; - -#ifdef USE_BACKTRACE - depth = backtrace(syscall_cb_buf, MAX_DEPTH); - /* Clean up the top stack frame so we get the real function - * name for the most recently failing function. */ - clean_backtrace(syscall_cb_buf, depth, ctx); -#endif /* defined(USE_BACKTRACE) */ - - syscall_name = get_syscall_name(syscall); - - tor_log_err_sigsafe("(Sandbox) Caught a bad syscall attempt (syscall ", - syscall_name, - ")\n", - NULL); - -#ifdef USE_BACKTRACE - n_fds = tor_log_get_sigsafe_err_fds(&fds); - for (i=0; i < n_fds; ++i) - backtrace_symbols_fd(syscall_cb_buf, (int)depth, fds[i]); -#endif - -#if defined(DEBUGGING_CLOSE) - _exit(1); // exit ok: programming error has led to sandbox failure. -#endif // DEBUGGING_CLOSE -} - -/** - * Function that adds a handler for SIGSYS, which is the signal thrown - * when the application is issuing a syscall which is not allowed. The - * main purpose of this function is to help with debugging by identifying - * filtered syscalls. - */ -static int -install_sigsys_debugging(void) -{ - struct sigaction act; - sigset_t mask; - - memset(&act, 0, sizeof(act)); - sigemptyset(&mask); - sigaddset(&mask, SIGSYS); - - act.sa_sigaction = &sigsys_debugging; - act.sa_flags = SA_SIGINFO; - if (sigaction(SIGSYS, &act, NULL) < 0) { - log_err(LD_BUG,"(Sandbox) Failed to register SIGSYS signal handler"); - return -1; - } - - if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) { - log_err(LD_BUG,"(Sandbox) Failed call to sigprocmask()"); - return -2; - } - - return 0; -} - -/** - * Function responsible of registering the sandbox_cfg_t list of parameter - * syscall filters to the existing parameter list. This is used for incipient - * multiple-sandbox support. - */ -static int -register_cfg(sandbox_cfg_t* cfg) -{ - sandbox_cfg_t *elem = NULL; - - if (filter_dynamic == NULL) { - filter_dynamic = cfg; - return 0; - } - - for (elem = filter_dynamic; elem->next != NULL; elem = elem->next) - ; - - elem->next = cfg; - - return 0; -} - -#endif /* defined(USE_LIBSECCOMP) */ - -#ifdef USE_LIBSECCOMP -/** - * Initialises the syscall sandbox filter for any linux architecture, taking - * into account various available features for different linux flavours. - */ -static int -initialise_libseccomp_sandbox(sandbox_cfg_t* cfg) -{ - /* Prevent glibc from trying to open /dev/tty on fatal error */ - setenv("LIBC_FATAL_STDERR_", "1", 1); - - if (install_sigsys_debugging()) - return -1; - - if (install_syscall_filter(cfg)) - return -2; - - if (register_cfg(cfg)) - return -3; - - return 0; -} - -int -sandbox_is_active(void) -{ - return sandbox_active != 0; -} -#endif /* defined(USE_LIBSECCOMP) */ - -sandbox_cfg_t* -sandbox_cfg_new(void) -{ - return NULL; -} - -int -sandbox_init(sandbox_cfg_t *cfg) -{ -#if defined(USE_LIBSECCOMP) - return initialise_libseccomp_sandbox(cfg); - -#elif defined(__linux__) - (void)cfg; - log_warn(LD_GENERAL, - "This version of Tor was built without support for sandboxing. To " - "build with support for sandboxing on Linux, you must have " - "libseccomp and its necessary header files (e.g. seccomp.h)."); - return 0; - -#else - (void)cfg; - log_warn(LD_GENERAL, - "Currently, sandboxing is only implemented on Linux. The feature " - "is disabled on your platform."); - return 0; -#endif /* defined(USE_LIBSECCOMP) || ... */ -} - -#ifndef USE_LIBSECCOMP -int -sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file) -{ - (void)cfg; (void)file; - return 0; -} - -int -sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file) -{ - (void)cfg; (void)file; - return 0; -} - -int -sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file) -{ - (void)cfg; (void)file; - return 0; -} - -int -sandbox_cfg_allow_chown_filename(sandbox_cfg_t **cfg, char *file) -{ - (void)cfg; (void)file; - return 0; -} - -int -sandbox_cfg_allow_chmod_filename(sandbox_cfg_t **cfg, char *file) -{ - (void)cfg; (void)file; - return 0; -} - -int -sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2) -{ - (void)cfg; (void)file1; (void)file2; - return 0; -} - -int -sandbox_is_active(void) -{ - return 0; -} - -void -sandbox_disable_getaddrinfo_cache(void) -{ -} -#endif /* !defined(USE_LIBSECCOMP) */ - diff --git a/src/tor/src/common/sandbox.h b/src/tor/src/common/sandbox.h deleted file mode 100644 index d0f85570f..000000000 --- a/src/tor/src/common/sandbox.h +++ /dev/null @@ -1,174 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file sandbox.h - * \brief Header file for sandbox.c. - **/ - -#ifndef SANDBOX_H_ -#define SANDBOX_H_ - -#include "orconfig.h" -#include "torint.h" - -#ifndef SYS_SECCOMP - -/** - * Used by SIGSYS signal handler to check if the signal was issued due to a - * seccomp2 filter violation. - */ -#define SYS_SECCOMP 1 - -#endif /* !defined(SYS_SECCOMP) */ - -#if defined(HAVE_SECCOMP_H) && defined(__linux__) -#define USE_LIBSECCOMP -#endif - -struct sandbox_cfg_elem; - -/** Typedef to structure used to manage a sandbox configuration. */ -typedef struct sandbox_cfg_elem sandbox_cfg_t; - -/** - * Linux definitions - */ -#ifdef USE_LIBSECCOMP - -#include -#include -#include - -#define PARAM_PTR 0 -#define PARAM_NUM 1 - -/** - * Enum used to manage the type of the implementation for general purpose. - */ -typedef enum { - /** Libseccomp implementation based on seccomp2*/ - LIBSECCOMP2 = 0 -} SB_IMPL; - -/** - * Configuration parameter structure associated with the LIBSECCOMP2 - * implementation. - */ -typedef struct smp_param { - /** syscall associated with parameter. */ - int syscall; - - /** parameter value. */ - char *value; - /** parameter value, second argument. */ - char *value2; - - /** parameter flag (0 = not protected, 1 = protected). */ - int prot; -} smp_param_t; - -/** - * Structure used to manage a sandbox configuration. - * - * It is implemented as a linked list of parameters. Currently only controls - * parameters for open, openat, execve, stat64. - */ -struct sandbox_cfg_elem { - /** Sandbox implementation which dictates the parameter type. */ - SB_IMPL implem; - - /** Configuration parameter. */ - smp_param_t *param; - - /** Next element of the configuration*/ - struct sandbox_cfg_elem *next; -}; - -/** Function pointer defining the prototype of a filter function.*/ -typedef int (*sandbox_filter_func_t)(scmp_filter_ctx ctx, - sandbox_cfg_t *filter); - -/** Type that will be used in step 3 in order to manage multiple sandboxes.*/ -typedef struct { - /** function pointers associated with the filter */ - sandbox_filter_func_t *filter_func; - - /** filter function pointer parameters */ - sandbox_cfg_t *filter_dynamic; -} sandbox_t; - -#endif /* defined(USE_LIBSECCOMP) */ - -#ifdef USE_LIBSECCOMP -/** Pre-calls getaddrinfo in order to pre-record result. */ -int sandbox_add_addrinfo(const char *addr); - -struct addrinfo; -/** Replacement for getaddrinfo(), using pre-recorded results. */ -int sandbox_getaddrinfo(const char *name, const char *servname, - const struct addrinfo *hints, - struct addrinfo **res); -void sandbox_freeaddrinfo(struct addrinfo *addrinfo); -void sandbox_free_getaddrinfo_cache(void); -#else /* !(defined(USE_LIBSECCOMP)) */ -#define sandbox_getaddrinfo(name, servname, hints, res) \ - getaddrinfo((name),(servname), (hints),(res)) -#define sandbox_add_addrinfo(name) \ - ((void)(name)) -#define sandbox_freeaddrinfo(addrinfo) \ - freeaddrinfo((addrinfo)) -#define sandbox_free_getaddrinfo_cache() -#endif /* defined(USE_LIBSECCOMP) */ - -#ifdef USE_LIBSECCOMP -/** Returns a registered protected string used with the sandbox, given that - * it matches the parameter. - */ -const char* sandbox_intern_string(const char *param); -#else /* !(defined(USE_LIBSECCOMP)) */ -#define sandbox_intern_string(s) (s) -#endif /* defined(USE_LIBSECCOMP) */ - -/** Creates an empty sandbox configuration file.*/ -sandbox_cfg_t * sandbox_cfg_new(void); - -/** - * Function used to add a open allowed filename to a supplied configuration. - * The (char*) specifies the path to the allowed file; we take ownership - * of the pointer. - */ -int sandbox_cfg_allow_open_filename(sandbox_cfg_t **cfg, char *file); - -int sandbox_cfg_allow_chmod_filename(sandbox_cfg_t **cfg, char *file); -int sandbox_cfg_allow_chown_filename(sandbox_cfg_t **cfg, char *file); - -/* DOCDOC */ -int sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2); - -/** - * Function used to add a openat allowed filename to a supplied configuration. - * The (char*) specifies the path to the allowed file; we steal the pointer to - * that file. - */ -int sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file); - -/** - * Function used to add a stat/stat64 allowed filename to a configuration. - * The (char*) specifies the path to the allowed file; that pointer is stolen. - */ -int sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file); - -/** Function used to initialise a sandbox configuration.*/ -int sandbox_init(sandbox_cfg_t* cfg); - -/** Return true iff the sandbox is turned on. */ -int sandbox_is_active(void); - -void sandbox_disable_getaddrinfo_cache(void); - -#endif /* !defined(SANDBOX_H_) */ - diff --git a/src/tor/src/common/storagedir.c b/src/tor/src/common/storagedir.c deleted file mode 100644 index e2c7b4bb8..000000000 --- a/src/tor/src/common/storagedir.c +++ /dev/null @@ -1,586 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "container.h" -#include "compat.h" -#include "confline.h" -#include "memarea.h" -#include "sandbox.h" -#include "storagedir.h" -#include "torlog.h" -#include "util.h" - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#define FNAME_MIN_NUM 1000 - -/** A storage_dir_t represents a directory full of similar cached - * files. Filenames are decimal integers. Files can be cleaned as needed - * to limit total disk usage. */ -struct storage_dir_t { - /** Directory holding the files for this storagedir. */ - char *directory; - /** Either NULL, or a directory listing of the directory (as a smartlist - * of strings */ - smartlist_t *contents; - /** The largest number of non-temporary files we'll place in the - * directory. */ - int max_files; - /** If true, then 'usage' has been computed. */ - int usage_known; - /** The total number of bytes used in this directory */ - uint64_t usage; -}; - -/** Create or open a new storage directory at dirname, with - * capacity for up to max_files files. - */ -storage_dir_t * -storage_dir_new(const char *dirname, int max_files) -{ - if (check_private_dir(dirname, CPD_CREATE, NULL) < 0) - return NULL; - - storage_dir_t *d = tor_malloc_zero(sizeof(storage_dir_t)); - d->directory = tor_strdup(dirname); - d->max_files = max_files; - return d; -} - -/** - * Drop all in-RAM storage for d. Does not delete any files. - */ -void -storage_dir_free_(storage_dir_t *d) -{ - if (d == NULL) - return; - tor_free(d->directory); - if (d->contents) { - SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); - smartlist_free(d->contents); - } - tor_free(d); -} - -/** - * Tell the sandbox (if any) configured by cfg to allow the - * operations that d will need. - * - * The presence of this function is why we need an upper limit on the - * number of files in a storage_dir_t: we need to approve file operations - * one by one. - */ -int -storage_dir_register_with_sandbox(storage_dir_t *d, sandbox_cfg_t **cfg) -{ - int problems = 0; - int idx; - for (idx = FNAME_MIN_NUM; idx < FNAME_MIN_NUM + d->max_files; ++idx) { - char *path = NULL, *tmppath = NULL; - tor_asprintf(&path, "%s/%d", d->directory, idx); - tor_asprintf(&tmppath, "%s/%d.tmp", d->directory, idx); - - problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(path)); - problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(tmppath)); - problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(path)); - problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(tmppath)); - problems += sandbox_cfg_allow_rename(cfg, - tor_strdup(tmppath), tor_strdup(path)); - - tor_free(path); - tor_free(tmppath); - } - - return problems ? -1 : 0; -} - -/** - * Remove all files in d whose names end with ".tmp". - * - * Requires that the contents field of d is set. - */ -static void -storage_dir_clean_tmpfiles(storage_dir_t *d) -{ - if (!d->contents) - return; - SMARTLIST_FOREACH_BEGIN(d->contents, char *, fname) { - if (strcmpend(fname, ".tmp")) - continue; - char *path = NULL; - tor_asprintf(&path, "%s/%s", d->directory, fname); - if (unlink(sandbox_intern_string(path))) { - log_warn(LD_FS, "Unable to unlink %s while cleaning " - "temporary files: %s", escaped(path), strerror(errno)); - tor_free(path); - continue; - } - tor_free(path); - SMARTLIST_DEL_CURRENT(d->contents, fname); - tor_free(fname); - } SMARTLIST_FOREACH_END(fname); - - d->usage_known = 0; -} - -/** - * Re-scan the directory d to learn its contents. - */ -static int -storage_dir_rescan(storage_dir_t *d) -{ - if (d->contents) { - SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); - smartlist_free(d->contents); - } - d->usage = 0; - d->usage_known = 0; - if (NULL == (d->contents = tor_listdir(d->directory))) { - return -1; - } - storage_dir_clean_tmpfiles(d); - return 0; -} - -/** - * Return a smartlist containing the filenames within d. - */ -const smartlist_t * -storage_dir_list(storage_dir_t *d) -{ - if (! d->contents) - storage_dir_rescan(d); - return d->contents; -} - -/** - * Return the total number of bytes used for storage in d. - */ -uint64_t -storage_dir_get_usage(storage_dir_t *d) -{ - if (d->usage_known) - return d->usage; - - uint64_t total = 0; - SMARTLIST_FOREACH_BEGIN(storage_dir_list(d), const char *, cp) { - char *path = NULL; - struct stat st; - tor_asprintf(&path, "%s/%s", d->directory, cp); - if (stat(sandbox_intern_string(path), &st) == 0) { - total += st.st_size; - } - tor_free(path); - } SMARTLIST_FOREACH_END(cp); - - d->usage = total; - d->usage_known = 1; - return d->usage; -} - -/** Mmap a specified file within d. - * - * On failure, return NULL and set errno as for tor_mmap_file(). */ -tor_mmap_t * -storage_dir_map(storage_dir_t *d, const char *fname) -{ - char *path = NULL; - tor_asprintf(&path, "%s/%s", d->directory, fname); - tor_mmap_t *result = tor_mmap_file(path); - int errval = errno; - tor_free(path); - if (result == NULL) - errno = errval; - return result; -} - -/** Read a file within d into a newly allocated buffer. Set - * *sz_out to its size. */ -uint8_t * -storage_dir_read(storage_dir_t *d, const char *fname, int bin, size_t *sz_out) -{ - const int flags = bin ? RFTS_BIN : 0; - - char *path = NULL; - tor_asprintf(&path, "%s/%s", d->directory, fname); - struct stat st; - char *contents = read_file_to_str(path, flags, &st); - if (contents && sz_out) { - // it fits in RAM, so we know its size is less than SIZE_MAX -#if UINT64_MAX > SIZE_MAX - tor_assert((uint64_t)st.st_size <= SIZE_MAX); -#endif - *sz_out = (size_t) st.st_size; - } - - tor_free(path); - return (uint8_t *) contents; -} - -/** Helper: Find an unused filename within the directory */ -static char * -find_unused_fname(storage_dir_t *d) -{ - if (!d->contents) { - if (storage_dir_rescan(d) < 0) - return NULL; - } - - char buf[16]; - int i; - /* Yuck; this is quadratic. Fortunately, that shouldn't matter much, - * since disk writes are more expensive by a lot. */ - for (i = FNAME_MIN_NUM; i < FNAME_MIN_NUM + d->max_files; ++i) { - tor_snprintf(buf, sizeof(buf), "%d", i); - if (!smartlist_contains_string(d->contents, buf)) { - return tor_strdup(buf); - } - } - return NULL; -} - -/** Helper: As storage_dir_save_bytes_to_file, but store a smartlist of - * sized_chunk_t rather than a single byte array. */ -static int -storage_dir_save_chunks_to_file(storage_dir_t *d, - const smartlist_t *chunks, - int binary, - char **fname_out) -{ - uint64_t total_length = 0; - char *fname = find_unused_fname(d); - if (!fname) - return -1; - - SMARTLIST_FOREACH(chunks, const sized_chunk_t *, ch, - total_length += ch->len); - - char *path = NULL; - tor_asprintf(&path, "%s/%s", d->directory, fname); - - int r = write_chunks_to_file(path, chunks, binary, 0); - if (r == 0) { - if (d->usage_known) - d->usage += total_length; - if (fname_out) { - *fname_out = tor_strdup(fname); - } - if (d->contents) - smartlist_add(d->contents, tor_strdup(fname)); - } - tor_free(fname); - tor_free(path); - return r; -} - -/** Try to write the length bytes at data into a new file - * in d. On success, return 0 and set *fname_out to a - * newly allocated string containing the filename. On failure, return - * -1. */ -int -storage_dir_save_bytes_to_file(storage_dir_t *d, - const uint8_t *data, - size_t length, - int binary, - char **fname_out) -{ - smartlist_t *chunks = smartlist_new(); - sized_chunk_t chunk = { (const char *)data, length }; - smartlist_add(chunks, &chunk); - int r = storage_dir_save_chunks_to_file(d, chunks, binary, fname_out); - smartlist_free(chunks); - return r; -} - -/** - * As storage_dir_save_bytes_to_file, but saves a NUL-terminated string - * str. - */ -int -storage_dir_save_string_to_file(storage_dir_t *d, - const char *str, - int binary, - char **fname_out) -{ - return storage_dir_save_bytes_to_file(d, - (const uint8_t*)str, strlen(str), binary, fname_out); -} - -/** - * As storage_dir_save_bytes_to_file, but associates the data with the - * key-value pairs in labels. Files stored in this format can be - * recovered with storage_dir_map_labeled() or storage_dir_read_labeled(). - */ -int -storage_dir_save_labeled_to_file(storage_dir_t *d, - const config_line_t *labels, - const uint8_t *data, - size_t length, - char **fname_out) -{ - /* - * The storage format is to prefix the data with the key-value pairs in - * labels, and a single NUL separator. But code outside this module - * MUST NOT rely on that format. - */ - - smartlist_t *chunks = smartlist_new(); - memarea_t *area = memarea_new(); - const config_line_t *line; - for (line = labels; line; line = line->next) { - sized_chunk_t *sz = memarea_alloc(area, sizeof(sized_chunk_t)); - sz->len = strlen(line->key) + 1 + strlen(line->value) + 1; - const size_t allocated = sz->len + 1; - char *bytes = memarea_alloc(area, allocated); - tor_snprintf(bytes, allocated, "%s %s\n", line->key, line->value); - sz->bytes = bytes; - smartlist_add(chunks, sz); - } - - sized_chunk_t *nul = memarea_alloc(area, sizeof(sized_chunk_t)); - nul->len = 1; - nul->bytes = "\0"; - smartlist_add(chunks, nul); - - sized_chunk_t *datachunk = memarea_alloc(area, sizeof(sized_chunk_t)); - datachunk->bytes = (const char *)data; - datachunk->len = length; - smartlist_add(chunks, datachunk); - - int r = storage_dir_save_chunks_to_file(d, chunks, 1, fname_out); - smartlist_free(chunks); - memarea_drop_all(area); - return r; -} - -/** - * Map a file that was created with storage_dir_save_labeled_to_file(). On - * failure, return NULL. On success, write a set of newly allocated labels - * into *labels_out, a pointer to the data into *data_out, and - * the data's size into *sz_out. On success, also return a tor_mmap_t - * object whose contents should not be used -- it needs to be kept around, - * though, for as long as data_out is going to be valid. - * - * On failure, set errno as for tor_mmap_file() if the file was missing or - * empty, and set errno to EINVAL if the file was not in the labeled - * format expected. - */ -tor_mmap_t * -storage_dir_map_labeled(storage_dir_t *dir, - const char *fname, - config_line_t **labels_out, - const uint8_t **data_out, - size_t *sz_out) -{ - tor_mmap_t *m = storage_dir_map(dir, fname); - int errval; - if (! m) { - errval = errno; - goto err; - } - const char *nulp = memchr(m->data, '\0', m->size); - if (! nulp) { - errval = EINVAL; - goto err; - } - if (labels_out && config_get_lines(m->data, labels_out, 0) < 0) { - errval = EINVAL; - goto err; - } - size_t offset = nulp - m->data + 1; - tor_assert(offset <= m->size); - *data_out = (const uint8_t *)(m->data + offset); - *sz_out = m->size - offset; - - return m; - err: - tor_munmap_file(m); - errno = errval; - return NULL; -} - -/** As storage_dir_map_labeled, but return a new byte array containing the - * data. */ -uint8_t * -storage_dir_read_labeled(storage_dir_t *dir, - const char *fname, - config_line_t **labels_out, - size_t *sz_out) -{ - const uint8_t *data = NULL; - tor_mmap_t *m = storage_dir_map_labeled(dir, fname, labels_out, - &data, sz_out); - if (m == NULL) - return NULL; - uint8_t *result = tor_memdup(data, *sz_out); - tor_munmap_file(m); - return result; -} - -/* Reduce the cached usage amount in d by removed_file_size. - * This function is a no-op if d->usage_known is 0. */ -static void -storage_dir_reduce_usage(storage_dir_t *d, uint64_t removed_file_size) -{ - if (d->usage_known) { - if (! BUG(d->usage < removed_file_size)) { - /* This bug can also be triggered if an external process resized a file - * between the call to storage_dir_get_usage() that last checked - * actual usage (rather than relaying on cached usage), and the call to - * this function. */ - d->usage -= removed_file_size; - } else { - /* If we underflowed the cached directory size, re-check the sizes of all - * the files in the directory. This makes storage_dir_shrink() quadratic, - * but only if a process is continually changing file sizes in the - * storage directory (in which case, we have bigger issues). - * - * We can't just reset usage_known, because storage_dir_shrink() relies - * on knowing the usage. */ - storage_dir_rescan(d); - (void)storage_dir_get_usage(d); - } - } -} - -/** - * Remove the file called fname from d. - */ -void -storage_dir_remove_file(storage_dir_t *d, - const char *fname) -{ - char *path = NULL; - tor_asprintf(&path, "%s/%s", d->directory, fname); - const char *ipath = sandbox_intern_string(path); - - uint64_t size = 0; - if (d->usage_known) { - struct stat st; - if (stat(ipath, &st) == 0) { - size = st.st_size; - } - } - if (unlink(ipath) == 0) { - storage_dir_reduce_usage(d, size); - } else { - log_warn(LD_FS, "Unable to unlink %s while removing file: %s", - escaped(path), strerror(errno)); - tor_free(path); - return; - } - if (d->contents) { - smartlist_string_remove(d->contents, fname); - } - - tor_free(path); -} - -/** Helper type: used to sort the members of storage directory by mtime. */ -typedef struct shrinking_dir_entry_t { - time_t mtime; - uint64_t size; - char *path; -} shrinking_dir_entry_t; - -/** Helper: use with qsort to sort shrinking_dir_entry_t structs. */ -static int -shrinking_dir_entry_compare(const void *a_, const void *b_) -{ - const shrinking_dir_entry_t *a = a_; - const shrinking_dir_entry_t *b = b_; - - if (a->mtime < b->mtime) - return -1; - else if (a->mtime > b->mtime) - return 1; - else - return 0; -} - -/** - * Try to free space by removing the oldest files in d. Delete - * until no more than target_size bytes are left, and at least - * min_to_remove files have been removed... or until there is - * nothing left to remove. - * - * Return 0 on success; -1 on failure. - */ -int -storage_dir_shrink(storage_dir_t *d, - uint64_t target_size, - int min_to_remove) -{ - if (d->usage_known && d->usage <= target_size && !min_to_remove) { - /* Already small enough. */ - return 0; - } - - if (storage_dir_rescan(d) < 0) - return -1; - - const uint64_t orig_usage = storage_dir_get_usage(d); - if (orig_usage <= target_size && !min_to_remove) { - /* Okay, small enough after rescan! */ - return 0; - } - - const int n = smartlist_len(d->contents); - shrinking_dir_entry_t *ents = tor_calloc(n, sizeof(shrinking_dir_entry_t)); - SMARTLIST_FOREACH_BEGIN(d->contents, const char *, fname) { - shrinking_dir_entry_t *ent = &ents[fname_sl_idx]; - struct stat st; - tor_asprintf(&ent->path, "%s/%s", d->directory, fname); - if (stat(sandbox_intern_string(ent->path), &st) == 0) { - ent->mtime = st.st_mtime; - ent->size = st.st_size; - } - } SMARTLIST_FOREACH_END(fname); - - qsort(ents, n, sizeof(shrinking_dir_entry_t), shrinking_dir_entry_compare); - - int idx = 0; - while ((d->usage > target_size || min_to_remove > 0) && idx < n) { - if (unlink(sandbox_intern_string(ents[idx].path)) == 0) { - storage_dir_reduce_usage(d, ents[idx].size); - --min_to_remove; - } - ++idx; - } - - for (idx = 0; idx < n; ++idx) { - tor_free(ents[idx].path); - } - tor_free(ents); - - storage_dir_rescan(d); - - return 0; -} - -/** Remove all files in d. */ -int -storage_dir_remove_all(storage_dir_t *d) -{ - return storage_dir_shrink(d, 0, d->max_files); -} - -/** - * Return the largest number of non-temporary files we're willing to - * store in d. - */ -int -storage_dir_get_max_files(storage_dir_t *d) -{ - return d->max_files; -} - diff --git a/src/tor/src/common/storagedir.h b/src/tor/src/common/storagedir.h deleted file mode 100644 index d99bd7ec5..000000000 --- a/src/tor/src/common/storagedir.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_STORAGEDIR_H -#define TOR_STORAGEDIR_H - -typedef struct storage_dir_t storage_dir_t; -struct config_line_t; -struct sandbox_cfg_elem; - -storage_dir_t * storage_dir_new(const char *dirname, int n_files); -void storage_dir_free_(storage_dir_t *d); -#define storage_dir_free(d) \ - FREE_AND_NULL(storage_dir_t, storage_dir_free_, (d)) - -int storage_dir_register_with_sandbox(storage_dir_t *d, - struct sandbox_cfg_elem **cfg); -const smartlist_t *storage_dir_list(storage_dir_t *d); -uint64_t storage_dir_get_usage(storage_dir_t *d); -tor_mmap_t *storage_dir_map(storage_dir_t *d, const char *fname); -uint8_t *storage_dir_read(storage_dir_t *d, const char *fname, int bin, - size_t *sz_out); -int storage_dir_save_bytes_to_file(storage_dir_t *d, - const uint8_t *data, - size_t length, - int binary, - char **fname_out); -int storage_dir_save_string_to_file(storage_dir_t *d, - const char *data, - int binary, - char **fname_out); -int storage_dir_save_labeled_to_file(storage_dir_t *d, - const struct config_line_t *labels, - const uint8_t *data, - size_t length, - char **fname_out); -tor_mmap_t *storage_dir_map_labeled(storage_dir_t *dir, - const char *fname, - struct config_line_t **labels_out, - const uint8_t **data_out, - size_t *size_out); -uint8_t *storage_dir_read_labeled(storage_dir_t *d, const char *fname, - struct config_line_t **labels_out, - size_t *sz_out); -void storage_dir_remove_file(storage_dir_t *d, - const char *fname); -int storage_dir_shrink(storage_dir_t *d, - uint64_t target_size, - int min_to_remove); -int storage_dir_remove_all(storage_dir_t *d); -int storage_dir_get_max_files(storage_dir_t *d); - -#endif /* !defined(TOR_STORAGEDIR_H) */ - diff --git a/src/tor/src/common/timers.c b/src/tor/src/common/timers.c deleted file mode 100644 index 93cde7de5..000000000 --- a/src/tor/src/common/timers.c +++ /dev/null @@ -1,317 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file timers.c - * \brief Wrapper around William Ahern's fast hierarchical timer wheel - * implementation, to tie it in with a libevent backend. - * - * Only use these functions from the main thread. - * - * The main advantage of tor_timer_t over using libevent's timers is that - * they're way more efficient if we need to have thousands or millions of - * them. For more information, see - * http://www.25thandclement.com/~william/projects/timeout.c.html - * - * Periodic timers are available in the backend, but I've turned them off. - * We can turn them back on if needed. - */ - -/* Notes: - * - * Having a way to free all timers on shutdown would free people from the - * need to track them. Not sure if that's clever though. - * - * In an ideal world, Libevent would just switch to use this backend, and we - * could throw this file away. But even if Libevent does switch, we'll be - * stuck with legacy libevents for some time. - */ - -#include "orconfig.h" - -#define TOR_TIMERS_PRIVATE - -#include "compat.h" -#include "compat_libevent.h" -#include "timers.h" -#include "torlog.h" -#include "util.h" - -#include - -struct timeout_cb { - timer_cb_fn_t cb; - void *arg; -}; - -/* - * These definitions are for timeouts.c and timeouts.h. - */ -#ifdef __GNUC__ -/* We're not exposing any of the functions outside this file. */ -#define TIMEOUT_PUBLIC __attribute__((__unused__)) static -#else -/* We're not exposing any of the functions outside this file. */ -#define TIMEOUT_PUBLIC static -#endif /* defined(__GNUC__) */ -/* We're not using periodic events. */ -#define TIMEOUT_DISABLE_INTERVALS -/* We always know the global_timeouts object, so we don't need each timeout - * to keep a pointer to it. */ -#define TIMEOUT_DISABLE_RELATIVE_ACCESS -/* We're providing our own struct timeout_cb. */ -#define TIMEOUT_CB_OVERRIDE -/* We're going to support timers that are pretty far out in advance. Making - * this big can be inefficient, but having a significant number of timers - * above TIMEOUT_MAX can also be super-inefficent. Choosing 5 here sets - * timeout_max to 2^30 ticks, or 29 hours with our value for USEC_PER_TICK */ -#define WHEEL_NUM 5 -#include "src/ext/timeouts/timeout.c" - -static struct timeouts *global_timeouts = NULL; -static struct event *global_timer_event = NULL; - -static monotime_t start_of_time; - -/** We need to choose this value carefully. Because we're using timer wheels, - * it actually costs us to have extra resolution we don't use. So for now, - * I'm going to define our resolution as .1 msec, and hope that's good enough. - * - * Note that two of the most popular libevent backends (epoll without timerfd, - * and windows select), simply can't support sub-millisecond resolution, - * do this is optimistic for a lot of users. - */ -#define USEC_PER_TICK 100 - -/** One million microseconds in a second */ -#define USEC_PER_SEC 1000000 - -/** Check at least once every N seconds. */ -#define MIN_CHECK_SECONDS 3600 - -/** Check at least once every N ticks. */ -#define MIN_CHECK_TICKS \ - (((timeout_t)MIN_CHECK_SECONDS) * (1000000 / USEC_PER_TICK)) - -/** - * Convert the timeval in tv to a timeout_t, and return it. - * - * The output resolution is set by USEC_PER_TICK. Only use this to convert - * delays to number of ticks; the time represented by 0 is undefined. - */ -static timeout_t -tv_to_timeout(const struct timeval *tv) -{ - uint64_t usec = tv->tv_usec; - usec += ((uint64_t)USEC_PER_SEC) * tv->tv_sec; - return usec / USEC_PER_TICK; -} - -/** - * Convert the timeout in t to a timeval in tv_out. Only - * use this for delays, not absolute times. - */ -static void -timeout_to_tv(timeout_t t, struct timeval *tv_out) -{ - t *= USEC_PER_TICK; - tv_out->tv_usec = (int)(t % USEC_PER_SEC); - tv_out->tv_sec = (time_t)(t / USEC_PER_SEC); -} - -/** - * Update the timer tv to the current time in tv. - */ -static void -timer_advance_to_cur_time(const monotime_t *now) -{ - timeout_t cur_tick = CEIL_DIV(monotime_diff_usec(&start_of_time, now), - USEC_PER_TICK); - timeouts_update(global_timeouts, cur_tick); -} - -/** - * Adjust the time at which the libevent timer should fire based on - * the next-expiring time in global_timeouts - */ -static void -libevent_timer_reschedule(void) -{ - monotime_t now; - monotime_get(&now); - timer_advance_to_cur_time(&now); - - timeout_t delay = timeouts_timeout(global_timeouts); - - struct timeval d; - if (delay > MIN_CHECK_TICKS) - delay = MIN_CHECK_TICKS; - timeout_to_tv(delay, &d); - event_add(global_timer_event, &d); -} - -/** Run the callback of every timer that has expired, based on the current - * output of monotime_get(). */ -STATIC void -timers_run_pending(void) -{ - monotime_t now; - monotime_get(&now); - timer_advance_to_cur_time(&now); - - tor_timer_t *t; - while ((t = timeouts_get(global_timeouts))) { - t->callback.cb(t, t->callback.arg, &now); - } -} - -/** - * Invoked when the libevent timer has expired: see which tor_timer_t events - * have fired, activate their callbacks, and reschedule the libevent timer. - */ -static void -libevent_timer_callback(evutil_socket_t fd, short what, void *arg) -{ - (void)fd; - (void)what; - (void)arg; - - timers_run_pending(); - - libevent_timer_reschedule(); -} - -/** - * Initialize the timers subsystem. Requires that libevent has already been - * initialized. - */ -void -timers_initialize(void) -{ - if (BUG(global_timeouts)) - return; // LCOV_EXCL_LINE - - timeout_error_t err = 0; - global_timeouts = timeouts_open(0, &err); - if (!global_timeouts) { - // LCOV_EXCL_START -- this can only fail on malloc failure. - log_err(LD_BUG, "Unable to open timer backend: %s", strerror(err)); - tor_assert(0); - // LCOV_EXCL_STOP - } - - monotime_init(); - monotime_get(&start_of_time); - - struct event *timer_event; - timer_event = tor_event_new(tor_libevent_get_base(), - -1, 0, libevent_timer_callback, NULL); - tor_assert(timer_event); - global_timer_event = timer_event; - - libevent_timer_reschedule(); -} - -/** - * Release all storage held in the timers subsystem. Does not fire timers. - */ -void -timers_shutdown(void) -{ - if (global_timer_event) { - tor_event_free(global_timer_event); - global_timer_event = NULL; - } - if (global_timeouts) { - timeouts_close(global_timeouts); - global_timeouts = NULL; - } -} - -/** - * Allocate and return a new timer, with given callback and argument. - */ -tor_timer_t * -timer_new(timer_cb_fn_t cb, void *arg) -{ - tor_timer_t *t = tor_malloc(sizeof(tor_timer_t)); - timeout_init(t, 0); - timer_set_cb(t, cb, arg); - return t; -} - -/** - * Release all storage held by t, and unschedule it if was already - * scheduled. - */ -void -timer_free_(tor_timer_t *t) -{ - if (! t) - return; - - timeouts_del(global_timeouts, t); - tor_free(t); -} - -/** - * Change the callback and argument associated with a timer t. - */ -void -timer_set_cb(tor_timer_t *t, timer_cb_fn_t cb, void *arg) -{ - t->callback.cb = cb; - t->callback.arg = arg; -} - -/** - * Set *cb_out (if provided) to this timer's callback function, - * and *arg_out (if provided) to this timer's callback argument. - */ -void -timer_get_cb(const tor_timer_t *t, - timer_cb_fn_t *cb_out, void **arg_out) -{ - if (cb_out) - *cb_out = t->callback.cb; - if (arg_out) - *arg_out = t->callback.arg; -} - -/** - * Schedule the timer t to fire at the current time plus a delay of - * delay microseconds. All times are relative to monotime_get(). - */ -void -timer_schedule(tor_timer_t *t, const struct timeval *tv) -{ - const timeout_t delay = tv_to_timeout(tv); - - monotime_t now; - monotime_get(&now); - timer_advance_to_cur_time(&now); - - /* Take the old timeout value. */ - timeout_t to = timeouts_timeout(global_timeouts); - - timeouts_add(global_timeouts, t, delay); - - /* Should we update the libevent timer? */ - if (to <= delay) { - return; /* we're already going to fire before this timer would trigger. */ - } - libevent_timer_reschedule(); -} - -/** - * Cancel the timer t if it is currently scheduled. (It's okay to call - * this on an unscheduled timer. - */ -void -timer_disable(tor_timer_t *t) -{ - timeouts_del(global_timeouts, t); - /* We don't reschedule the libevent timer here, since it's okay if it fires - * early. */ -} - diff --git a/src/tor/src/common/timers.h b/src/tor/src/common/timers.h deleted file mode 100644 index 6d27f3e01..000000000 --- a/src/tor/src/common/timers.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TIMERS_H -#define TOR_TIMERS_H - -#include "orconfig.h" -#include "testsupport.h" - -struct monotime_t; -typedef struct timeout tor_timer_t; -typedef void (*timer_cb_fn_t)(tor_timer_t *, void *, - const struct monotime_t *); -tor_timer_t *timer_new(timer_cb_fn_t cb, void *arg); -void timer_set_cb(tor_timer_t *t, timer_cb_fn_t cb, void *arg); -void timer_get_cb(const tor_timer_t *t, - timer_cb_fn_t *cb_out, void **arg_out); -void timer_schedule(tor_timer_t *t, const struct timeval *delay); -void timer_disable(tor_timer_t *t); -void timer_free_(tor_timer_t *t); -#define timer_free(t) FREE_AND_NULL(tor_timer_t, timer_free_, (t)) - -void timers_initialize(void); -void timers_shutdown(void); - -#ifdef TOR_TIMERS_PRIVATE -STATIC void timers_run_pending(void); -#endif - -#endif /* !defined(TOR_TIMERS_H) */ - diff --git a/src/tor/src/common/tortls.h b/src/tor/src/common/tortls.h deleted file mode 100644 index 1dbf0b332..000000000 --- a/src/tor/src/common/tortls.h +++ /dev/null @@ -1,295 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TORTLS_H -#define TOR_TORTLS_H - -/** - * \file tortls.h - * \brief Headers for tortls.c - **/ - -#include "crypto.h" -#include "compat_openssl.h" -#include "compat.h" -#include "testsupport.h" - -/* Opaque structure to hold a TLS connection. */ -typedef struct tor_tls_t tor_tls_t; - -/* Opaque structure to hold an X509 certificate. */ -typedef struct tor_x509_cert_t tor_x509_cert_t; - -/* Possible return values for most tor_tls_* functions. */ -#define MIN_TOR_TLS_ERROR_VAL_ -9 -#define TOR_TLS_ERROR_MISC -9 -/* Rename to unexpected close or something. XXXX */ -#define TOR_TLS_ERROR_IO -8 -#define TOR_TLS_ERROR_CONNREFUSED -7 -#define TOR_TLS_ERROR_CONNRESET -6 -#define TOR_TLS_ERROR_NO_ROUTE -5 -#define TOR_TLS_ERROR_TIMEOUT -4 -#define TOR_TLS_CLOSE -3 -#define TOR_TLS_WANTREAD -2 -#define TOR_TLS_WANTWRITE -1 -#define TOR_TLS_DONE 0 - -/** Collection of case statements for all TLS errors that are not due to - * underlying IO failure. */ -#define CASE_TOR_TLS_ERROR_ANY_NONIO \ - case TOR_TLS_ERROR_MISC: \ - case TOR_TLS_ERROR_CONNREFUSED: \ - case TOR_TLS_ERROR_CONNRESET: \ - case TOR_TLS_ERROR_NO_ROUTE: \ - case TOR_TLS_ERROR_TIMEOUT - -/** Use this macro in a switch statement to catch _any_ TLS error. That way, - * if more errors are added, your switches will still work. */ -#define CASE_TOR_TLS_ERROR_ANY \ - CASE_TOR_TLS_ERROR_ANY_NONIO: \ - case TOR_TLS_ERROR_IO - -#define TOR_TLS_IS_ERROR(rv) ((rv) < TOR_TLS_CLOSE) - -#ifdef TORTLS_PRIVATE -#define TOR_TLS_MAGIC 0x71571571 - -typedef enum { - TOR_TLS_ST_HANDSHAKE, TOR_TLS_ST_OPEN, TOR_TLS_ST_GOTCLOSE, - TOR_TLS_ST_SENTCLOSE, TOR_TLS_ST_CLOSED, TOR_TLS_ST_RENEGOTIATE, - TOR_TLS_ST_BUFFEREVENT -} tor_tls_state_t; -#define tor_tls_state_bitfield_t ENUM_BF(tor_tls_state_t) - -struct x509_st; -struct ssl_st; -struct ssl_ctx_st; -struct ssl_session_st; - -/** Holds a SSL_CTX object and related state used to configure TLS - * connections. - */ -typedef struct tor_tls_context_t { - int refcnt; - struct ssl_ctx_st *ctx; - tor_x509_cert_t *my_link_cert; - tor_x509_cert_t *my_id_cert; - tor_x509_cert_t *my_auth_cert; - crypto_pk_t *link_key; - crypto_pk_t *auth_key; -} tor_tls_context_t; - -/** Structure that we use for a single certificate. */ -struct tor_x509_cert_t { - struct x509_st *cert; - uint8_t *encoded; - size_t encoded_len; - unsigned pkey_digests_set : 1; - common_digests_t cert_digests; - common_digests_t pkey_digests; -}; - -/** Holds a SSL object and its associated data. Members are only - * accessed from within tortls.c. - */ -struct tor_tls_t { - uint32_t magic; - tor_tls_context_t *context; /** A link to the context object for this tls. */ - struct ssl_st *ssl; /**< An OpenSSL SSL object. */ - int socket; /**< The underlying file descriptor for this TLS connection. */ - char *address; /**< An address to log when describing this connection. */ - tor_tls_state_bitfield_t state : 3; /**< The current SSL state, - * depending on which operations - * have completed successfully. */ - unsigned int isServer:1; /**< True iff this is a server-side connection */ - unsigned int wasV2Handshake:1; /**< True iff the original handshake for - * this connection used the updated version - * of the connection protocol (client sends - * different cipher list, server sends only - * one certificate). */ - /** True iff we should call negotiated_callback when we're done reading. */ - unsigned int got_renegotiate:1; - /** Return value from tor_tls_classify_client_ciphers, or 0 if we haven't - * called that function yet. */ - int8_t client_cipher_list_type; - /** Incremented every time we start the server side of a handshake. */ - uint8_t server_handshake_count; - size_t wantwrite_n; /**< 0 normally, >0 if we returned wantwrite last - * time. */ - /** Last values retrieved from BIO_number_read()/write(); see - * tor_tls_get_n_raw_bytes() for usage. - */ - unsigned long last_write_count; - unsigned long last_read_count; - /** If set, a callback to invoke whenever the client tries to renegotiate - * the handshake. */ - void (*negotiated_callback)(tor_tls_t *tls, void *arg); - /** Argument to pass to negotiated_callback. */ - void *callback_arg; -}; - -STATIC int tor_errno_to_tls_error(int e); -STATIC int tor_tls_get_error(tor_tls_t *tls, int r, int extra, - const char *doing, int severity, int domain); -STATIC tor_tls_t *tor_tls_get_by_ssl(const struct ssl_st *ssl); -STATIC void tor_tls_allocate_tor_tls_object_ex_data_index(void); -#ifdef TORTLS_OPENSSL_PRIVATE -STATIC int always_accept_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx); -STATIC int tor_tls_classify_client_ciphers(const struct ssl_st *ssl, - STACK_OF(SSL_CIPHER) *peer_ciphers); -#endif -STATIC int tor_tls_client_is_using_v2_ciphers(const struct ssl_st *ssl); -MOCK_DECL(STATIC void, try_to_extract_certs_from_tls, - (int severity, tor_tls_t *tls, struct x509_st **cert_out, - struct x509_st **id_cert_out)); -#ifndef HAVE_SSL_SESSION_GET_MASTER_KEY -STATIC size_t SSL_SESSION_get_master_key(struct ssl_session_st *s, - uint8_t *out, - size_t len); -#endif -STATIC void tor_tls_debug_state_callback(const struct ssl_st *ssl, - int type, int val); -STATIC void tor_tls_server_info_callback(const struct ssl_st *ssl, - int type, int val); -#ifdef TORTLS_OPENSSL_PRIVATE -STATIC int tor_tls_session_secret_cb(struct ssl_st *ssl, void *secret, - int *secret_len, - STACK_OF(SSL_CIPHER) *peer_ciphers, - CONST_IF_OPENSSL_1_1_API SSL_CIPHER **cipher, - void *arg); -STATIC int find_cipher_by_id(const SSL *ssl, const SSL_METHOD *m, - uint16_t cipher); -#endif /* defined(TORTLS_OPENSSL_PRIVATE) */ -MOCK_DECL(STATIC struct x509_st *, tor_tls_create_certificate, - (crypto_pk_t *rsa, - crypto_pk_t *rsa_sign, - const char *cname, - const char *cname_sign, - unsigned int cert_lifetime)); -STATIC tor_tls_context_t *tor_tls_context_new(crypto_pk_t *identity, - unsigned int key_lifetime, unsigned flags, int is_client); -MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new, - (struct x509_st *x509_cert)); -STATIC int tor_tls_context_init_one(tor_tls_context_t **ppcontext, - crypto_pk_t *identity, - unsigned int key_lifetime, - unsigned int flags, - int is_client); -STATIC void tls_log_errors(tor_tls_t *tls, int severity, int domain, - const char *doing); - -#ifdef TOR_UNIT_TESTS -extern int tor_tls_object_ex_data_index; -extern tor_tls_context_t *server_tls_context; -extern tor_tls_context_t *client_tls_context; -extern uint16_t v2_cipher_list[]; -extern uint64_t total_bytes_written_over_tls; -extern uint64_t total_bytes_written_by_tls; - -STATIC tor_x509_cert_t *tor_x509_cert_replace_expiration( - const tor_x509_cert_t *inp, - time_t new_expiration_time, - crypto_pk_t *signing_key); -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* defined(TORTLS_PRIVATE) */ - -tor_x509_cert_t *tor_x509_cert_dup(const tor_x509_cert_t *cert); -const char *tor_tls_err_to_string(int err); -void tor_tls_get_state_description(tor_tls_t *tls, char *buf, size_t sz); - -void tor_tls_free_all(void); - -#define TOR_TLS_CTX_IS_PUBLIC_SERVER (1u<<0) -#define TOR_TLS_CTX_USE_ECDHE_P256 (1u<<1) -#define TOR_TLS_CTX_USE_ECDHE_P224 (1u<<2) - -int tor_tls_context_init(unsigned flags, - crypto_pk_t *client_identity, - crypto_pk_t *server_identity, - unsigned int key_lifetime); -tor_tls_t *tor_tls_new(int sock, int is_server); -void tor_tls_set_logged_address(tor_tls_t *tls, const char *address); -void tor_tls_set_renegotiate_callback(tor_tls_t *tls, - void (*cb)(tor_tls_t *, void *arg), - void *arg); -int tor_tls_is_server(tor_tls_t *tls); -void tor_tls_free_(tor_tls_t *tls); -#define tor_tls_free(tls) FREE_AND_NULL(tor_tls_t, tor_tls_free_, (tls)) -int tor_tls_peer_has_cert(tor_tls_t *tls); -MOCK_DECL(tor_x509_cert_t *,tor_tls_get_peer_cert,(tor_tls_t *tls)); -MOCK_DECL(tor_x509_cert_t *,tor_tls_get_own_cert,(tor_tls_t *tls)); -int tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_t **identity); -int tor_tls_check_lifetime(int severity, - tor_tls_t *tls, time_t now, - int past_tolerance, - int future_tolerance); -MOCK_DECL(int, tor_tls_read, (tor_tls_t *tls, char *cp, size_t len)); -int tor_tls_write(tor_tls_t *tls, const char *cp, size_t n); -int tor_tls_handshake(tor_tls_t *tls); -int tor_tls_finish_handshake(tor_tls_t *tls); -void tor_tls_unblock_renegotiation(tor_tls_t *tls); -void tor_tls_block_renegotiation(tor_tls_t *tls); -void tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls); -int tor_tls_shutdown(tor_tls_t *tls); -int tor_tls_get_pending_bytes(tor_tls_t *tls); -size_t tor_tls_get_forced_write_size(tor_tls_t *tls); - -void tor_tls_get_n_raw_bytes(tor_tls_t *tls, - size_t *n_read, size_t *n_written); - -int tor_tls_get_buffer_sizes(tor_tls_t *tls, - size_t *rbuf_capacity, size_t *rbuf_bytes, - size_t *wbuf_capacity, size_t *wbuf_bytes); - -MOCK_DECL(double, tls_get_write_overhead_ratio, (void)); - -int tor_tls_used_v1_handshake(tor_tls_t *tls); -int tor_tls_get_num_server_handshakes(tor_tls_t *tls); -int tor_tls_server_got_renegotiate(tor_tls_t *tls); -MOCK_DECL(int,tor_tls_get_tlssecrets,(tor_tls_t *tls, uint8_t *secrets_out)); -MOCK_DECL(int,tor_tls_export_key_material,( - tor_tls_t *tls, uint8_t *secrets_out, - const uint8_t *context, - size_t context_len, - const char *label)); - -/* Log and abort if there are unhandled TLS errors in OpenSSL's error stack. - */ -#define check_no_tls_errors() check_no_tls_errors_(__FILE__,__LINE__) - -void check_no_tls_errors_(const char *fname, int line); -void tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, - int severity, int domain, const char *doing); - -void tor_x509_cert_free_(tor_x509_cert_t *cert); -#define tor_x509_cert_free(c) \ - FREE_AND_NULL(tor_x509_cert_t, tor_x509_cert_free_, (c)) -tor_x509_cert_t *tor_x509_cert_decode(const uint8_t *certificate, - size_t certificate_len); -void tor_x509_cert_get_der(const tor_x509_cert_t *cert, - const uint8_t **encoded_out, size_t *size_out); -const common_digests_t *tor_x509_cert_get_id_digests( - const tor_x509_cert_t *cert); -const common_digests_t *tor_x509_cert_get_cert_digests( - const tor_x509_cert_t *cert); -int tor_tls_get_my_certs(int server, - const tor_x509_cert_t **link_cert_out, - const tor_x509_cert_t **id_cert_out); -crypto_pk_t *tor_tls_get_my_client_auth_key(void); -crypto_pk_t *tor_tls_cert_get_key(tor_x509_cert_t *cert); -MOCK_DECL(int,tor_tls_cert_matches_key,(const tor_tls_t *tls, - const tor_x509_cert_t *cert)); -int tor_tls_cert_is_valid(int severity, - const tor_x509_cert_t *cert, - const tor_x509_cert_t *signing_cert, - time_t now, - int check_rsa_1024); -const char *tor_tls_get_ciphersuite_name(tor_tls_t *tls); - -int evaluate_ecgroup_for_tls(const char *ecgroup); - -#endif /* !defined(TOR_TORTLS_H) */ - diff --git a/src/tor/src/common/util_bug.c b/src/tor/src/common/util_bug.c deleted file mode 100644 index 126e84386..000000000 --- a/src/tor/src/common/util_bug.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file util_bug.c - **/ - -#include "orconfig.h" -#include "util_bug.h" -#include "torlog.h" -#include "backtrace.h" -#include "container.h" - -#ifdef __COVERITY__ -int bug_macro_deadcode_dummy__ = 0; -#endif - -#ifdef TOR_UNIT_TESTS -static void (*failed_assertion_cb)(void) = NULL; -static int n_bugs_to_capture = 0; -static smartlist_t *bug_messages = NULL; -#define capturing_bugs() (bug_messages != NULL && n_bugs_to_capture) -void -tor_capture_bugs_(int n) -{ - tor_end_capture_bugs_(); - bug_messages = smartlist_new(); - n_bugs_to_capture = n; -} -void -tor_end_capture_bugs_(void) -{ - n_bugs_to_capture = 0; - if (!bug_messages) - return; - SMARTLIST_FOREACH(bug_messages, char *, cp, tor_free(cp)); - smartlist_free(bug_messages); - bug_messages = NULL; -} -const smartlist_t * -tor_get_captured_bug_log_(void) -{ - return bug_messages; -} -static void -add_captured_bug(const char *s) -{ - --n_bugs_to_capture; - smartlist_add_strdup(bug_messages, s); -} -/** Set a callback to be invoked when we get any tor_bug_occurred_ - * invocation. We use this in the unit tests so that a nonfatal - * assertion failure can also count as a test failure. - */ -void -tor_set_failed_assertion_callback(void (*fn)(void)) -{ - failed_assertion_cb = fn; -} -#else /* !(defined(TOR_UNIT_TESTS)) */ -#define capturing_bugs() (0) -#define add_captured_bug(s) do { } while (0) -#endif /* defined(TOR_UNIT_TESTS) */ - -/** Helper for tor_assert: report the assertion failure. */ -void -tor_assertion_failed_(const char *fname, unsigned int line, - const char *func, const char *expr) -{ - char buf[256]; - log_err(LD_BUG, "%s:%u: %s: Assertion %s failed; aborting.", - fname, line, func, expr); - tor_snprintf(buf, sizeof(buf), - "Assertion %s failed in %s at %s:%u", - expr, func, fname, line); - log_backtrace(LOG_ERR, LD_BUG, buf); -} - -/** Helper for tor_assert_nonfatal: report the assertion failure. */ -void -tor_bug_occurred_(const char *fname, unsigned int line, - const char *func, const char *expr, - int once) -{ - char buf[256]; - const char *once_str = once ? - " (Future instances of this warning will be silenced.)": ""; - if (! expr) { - if (capturing_bugs()) { - add_captured_bug("This line should not have been reached."); - return; - } - log_warn(LD_BUG, "%s:%u: %s: This line should not have been reached.%s", - fname, line, func, once_str); - tor_snprintf(buf, sizeof(buf), - "Line unexpectedly reached at %s at %s:%u", - func, fname, line); - } else { - if (capturing_bugs()) { - add_captured_bug(expr); - return; - } - log_warn(LD_BUG, "%s:%u: %s: Non-fatal assertion %s failed.%s", - fname, line, func, expr, once_str); - tor_snprintf(buf, sizeof(buf), - "Non-fatal assertion %s failed in %s at %s:%u", - expr, func, fname, line); - } - log_backtrace(LOG_WARN, LD_BUG, buf); - -#ifdef TOR_UNIT_TESTS - if (failed_assertion_cb) { - failed_assertion_cb(); - } -#endif -} - diff --git a/src/tor/src/common/util_bug.h b/src/tor/src/common/util_bug.h deleted file mode 100644 index be549fde0..000000000 --- a/src/tor/src/common/util_bug.h +++ /dev/null @@ -1,202 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file util_bug.h - * - * \brief Macros to manage assertions, fatal and non-fatal. - * - * Guidelines: All the different kinds of assertion in this file are for - * bug-checking only. Don't write code that can assert based on bad inputs. - * - * We provide two kinds of assertion here: "fatal" and "nonfatal". Use - * nonfatal assertions for any bug you can reasonably recover from -- and - * please, try to recover! Many severe bugs in Tor have been caused by using - * a regular assertion when a nonfatal assertion would have been better. - * - * If you need to check a condition with a nonfatal assertion, AND recover - * from that same condition, consider using the BUG() macro inside a - * conditional. For example: - * - * - * // wrong -- use tor_assert_nonfatal() if you just want an assertion. - * BUG(ptr == NULL); - * - * // okay, but needlessly verbose - * tor_assert_nonfatal(ptr != NULL); - * if (ptr == NULL) { ... } - * - * // this is how we do it: - * if (BUG(ptr == NULL)) { ... } - * - **/ - -#ifndef TOR_UTIL_BUG_H -#define TOR_UTIL_BUG_H - -#include "orconfig.h" -#include "compat.h" -#include "testsupport.h" - -/* Replace assert() with a variant that sends failures to the log before - * calling assert() normally. - */ -#ifdef NDEBUG -/* Nobody should ever want to build with NDEBUG set. 99% of our asserts will - * be outside the critical path anyway, so it's silly to disable bug-checking - * throughout the entire program just because a few asserts are slowing you - * down. Profile, optimize the critical path, and keep debugging on. - * - * And I'm not just saying that because some of our asserts check - * security-critical properties. - */ -#error "Sorry; we don't support building with NDEBUG." -#endif /* defined(NDEBUG) */ - -/* Sometimes we don't want to use assertions during branch coverage tests; it - * leads to tons of unreached branches which in reality are only assertions we - * didn't hit. */ -#if defined(TOR_UNIT_TESTS) && defined(DISABLE_ASSERTS_IN_UNIT_TESTS) -#define tor_assert(a) STMT_BEGIN \ - (void)(a); \ - STMT_END -#else -/** Like assert(3), but send assertion failures to the log as well as to - * stderr. */ -#define tor_assert(expr) STMT_BEGIN \ - if (PREDICT_UNLIKELY(!(expr))) { \ - tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, #expr); \ - abort(); \ - } STMT_END -#endif /* defined(TOR_UNIT_TESTS) && defined(DISABLE_ASSERTS_IN_UNIT_TESTS) */ - -#define tor_assert_unreached() tor_assert(0) - -/* Non-fatal bug assertions. The "unreached" variants mean "this line should - * never be reached." The "once" variants mean "Don't log a warning more than - * once". - * - * The 'BUG' macro checks a boolean condition and logs an error message if it - * is true. Example usage: - * if (BUG(x == NULL)) - * return -1; - */ - -#ifdef __COVERITY__ -extern int bug_macro_deadcode_dummy__; -#undef BUG -// Coverity defines this in global headers; let's override it. This is a -// magic coverity-only preprocessor thing. -// We use this "deadcode_dummy__" trick to prevent coverity from -// complaining about unreachable bug cases. -#nodef BUG(x) ((x)?(__coverity_panic__(),1):(0+bug_macro_deadcode_dummy__)) -#endif /* defined(__COVERITY__) */ - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -// We're running with a static analysis tool: let's treat even nonfatal -// assertion failures as something that we need to avoid. -#define ALL_BUGS_ARE_FATAL -#endif - -#ifdef ALL_BUGS_ARE_FATAL -#define tor_assert_nonfatal_unreached() tor_assert(0) -#define tor_assert_nonfatal(cond) tor_assert((cond)) -#define tor_assert_nonfatal_unreached_once() tor_assert(0) -#define tor_assert_nonfatal_once(cond) tor_assert((cond)) -#define BUG(cond) \ - (PREDICT_UNLIKELY(cond) ? \ - (tor_assertion_failed_(SHORT_FILE__,__LINE__,__func__,"!("#cond")"), \ - abort(), 1) \ - : 0) -#elif defined(TOR_UNIT_TESTS) && defined(DISABLE_ASSERTS_IN_UNIT_TESTS) -#define tor_assert_nonfatal_unreached() STMT_NIL -#define tor_assert_nonfatal(cond) ((void)(cond)) -#define tor_assert_nonfatal_unreached_once() STMT_NIL -#define tor_assert_nonfatal_once(cond) ((void)(cond)) -#define BUG(cond) (PREDICT_UNLIKELY(cond) ? 1 : 0) -#else /* Normal case, !ALL_BUGS_ARE_FATAL, !DISABLE_ASSERTS_IN_UNIT_TESTS */ -#define tor_assert_nonfatal_unreached() STMT_BEGIN \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, NULL, 0); \ - STMT_END -#define tor_assert_nonfatal(cond) STMT_BEGIN \ - if (PREDICT_UNLIKELY(!(cond))) { \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, #cond, 0); \ - } \ - STMT_END -#define tor_assert_nonfatal_unreached_once() STMT_BEGIN \ - static int warning_logged__ = 0; \ - if (!warning_logged__) { \ - warning_logged__ = 1; \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, NULL, 1); \ - } \ - STMT_END -#define tor_assert_nonfatal_once(cond) STMT_BEGIN \ - static int warning_logged__ = 0; \ - if (!warning_logged__ && PREDICT_UNLIKELY(!(cond))) { \ - warning_logged__ = 1; \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, #cond, 1); \ - } \ - STMT_END -#define BUG(cond) \ - (PREDICT_UNLIKELY(cond) ? \ - (tor_bug_occurred_(SHORT_FILE__,__LINE__,__func__,"!("#cond")",0), 1) \ - : 0) -#endif /* defined(ALL_BUGS_ARE_FATAL) || ... */ - -#ifdef __GNUC__ -#define IF_BUG_ONCE__(cond,var) \ - if (( { \ - static int var = 0; \ - int bool_result = (cond); \ - if (PREDICT_UNLIKELY(bool_result) && !var) { \ - var = 1; \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \ - "!("#cond")", 1); \ - } \ - PREDICT_UNLIKELY(bool_result); } )) -#else /* !(defined(__GNUC__)) */ -#define IF_BUG_ONCE__(cond,var) \ - static int var = 0; \ - if (PREDICT_UNLIKELY(cond) ? \ - (var ? 1 : \ - (var=1, \ - tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \ - "!("#cond")", 1), \ - 1)) \ - : 0) -#endif /* defined(__GNUC__) */ -#define IF_BUG_ONCE_VARNAME_(a) \ - warning_logged_on_ ## a ## __ -#define IF_BUG_ONCE_VARNAME__(a) \ - IF_BUG_ONCE_VARNAME_(a) - -/** This macro behaves as 'if (bug(x))', except that it only logs its - * warning once, no matter how many times it triggers. - */ - -#define IF_BUG_ONCE(cond) \ - IF_BUG_ONCE__((cond), \ - IF_BUG_ONCE_VARNAME__(__LINE__)) - -/** Define this if you want Tor to crash when any problem comes up, - * so you can get a coredump and track things down. */ -// #define tor_fragile_assert() tor_assert_unreached(0) -#define tor_fragile_assert() tor_assert_nonfatal_unreached_once() - -void tor_assertion_failed_(const char *fname, unsigned int line, - const char *func, const char *expr); -void tor_bug_occurred_(const char *fname, unsigned int line, - const char *func, const char *expr, - int once); - -#ifdef TOR_UNIT_TESTS -void tor_capture_bugs_(int n); -void tor_end_capture_bugs_(void); -const struct smartlist_t *tor_get_captured_bug_log_(void); -void tor_set_failed_assertion_callback(void (*fn)(void)); -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* !defined(TOR_UTIL_BUG_H) */ - diff --git a/src/tor/src/common/util_format.c b/src/tor/src/common/util_format.c deleted file mode 100644 index e51757a4e..000000000 --- a/src/tor/src/common/util_format.c +++ /dev/null @@ -1,535 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file util_format.c - * - * \brief Miscellaneous functions for encoding and decoding various things - * in base{16,32,64}. - */ - -#include "orconfig.h" -#include "torlog.h" -#include "util.h" -#include "util_format.h" -#include "torint.h" - -#include -#include -#include - -/* Return the base32 encoded size in bytes using the source length srclen. - * - * (WATCH OUT: This API counts the terminating NUL byte, but - * base64_encode_size does not.) - */ -size_t -base32_encoded_size(size_t srclen) -{ - size_t enclen; - tor_assert(srclen < SIZE_T_CEILING / 8); - enclen = BASE32_NOPAD_BUFSIZE(srclen); - tor_assert(enclen < INT_MAX && enclen > srclen); - return enclen; -} - -/** Implements base32 encoding as in RFC 4648. */ -void -base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - unsigned int i, v, u; - size_t nbits = srclen * 8; - size_t bit; - - /* We need enough space for the encoded data and the extra NUL byte. */ - tor_assert(base32_encoded_size(srclen) <= destlen); - tor_assert(destlen < SIZE_T_CEILING); - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - for (i=0,bit=0; bit < nbits; ++i, bit+=5) { - /* set v to the 16-bit value starting at src[bits/8], 0-padded. */ - size_t idx = bit / 8; - v = ((uint8_t)src[idx]) << 8; - if (idx+1 < srclen) - v += (uint8_t)src[idx+1]; - /* set u to the 5-bit value at the bit'th bit of buf. */ - u = (v >> (11-(bit%8))) & 0x1F; - dest[i] = BASE32_CHARS[u]; - } - dest[i] = '\0'; -} - -/** Implements base32 decoding as in RFC 4648. - * Returns 0 if successful, -1 otherwise. - */ -int -base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - /* XXXX we might want to rewrite this along the lines of base64_decode, if - * it ever shows up in the profile. */ - unsigned int i; - size_t nbits, j, bit; - char *tmp; - nbits = ((srclen * 5) / 8) * 8; - - tor_assert(srclen < SIZE_T_CEILING / 5); - tor_assert((nbits/8) <= destlen); /* We need enough space. */ - tor_assert(destlen < SIZE_T_CEILING); - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - /* Convert base32 encoded chars to the 5-bit values that they represent. */ - tmp = tor_malloc_zero(srclen); - for (j = 0; j < srclen; ++j) { - if (src[j] > 0x60 && src[j] < 0x7B) tmp[j] = src[j] - 0x61; - else if (src[j] > 0x31 && src[j] < 0x38) tmp[j] = src[j] - 0x18; - else if (src[j] > 0x40 && src[j] < 0x5B) tmp[j] = src[j] - 0x41; - else { - log_warn(LD_GENERAL, "illegal character in base32 encoded string"); - tor_free(tmp); - return -1; - } - } - - /* Assemble result byte-wise by applying five possible cases. */ - for (i = 0, bit = 0; bit < nbits; ++i, bit += 8) { - switch (bit % 40) { - case 0: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 3) + - (((uint8_t)tmp[(bit/5)+1]) >> 2); - break; - case 8: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 6) + - (((uint8_t)tmp[(bit/5)+1]) << 1) + - (((uint8_t)tmp[(bit/5)+2]) >> 4); - break; - case 16: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 4) + - (((uint8_t)tmp[(bit/5)+1]) >> 1); - break; - case 24: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 7) + - (((uint8_t)tmp[(bit/5)+1]) << 2) + - (((uint8_t)tmp[(bit/5)+2]) >> 3); - break; - case 32: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 5) + - ((uint8_t)tmp[(bit/5)+1]); - break; - } - } - - memset(tmp, 0, srclen); /* on the heap, this should be safe */ - tor_free(tmp); - tmp = NULL; - return 0; -} - -#define BASE64_OPENSSL_LINELEN 64 - -/** Return the Base64 encoded size of srclen bytes of data in - * bytes. - * - * (WATCH OUT: This API does not count the terminating NUL byte, - * but base32_encoded_size does.) - * - * If flags&BASE64_ENCODE_MULTILINE is true, return the size - * of the encoded output as multiline output (64 character, `\n' terminated - * lines). - */ -size_t -base64_encode_size(size_t srclen, int flags) -{ - size_t enclen; - - /* Use INT_MAX for overflow checking because base64_encode() returns int. */ - tor_assert(srclen < INT_MAX); - tor_assert(CEIL_DIV(srclen, 3) < INT_MAX / 4); - - enclen = BASE64_LEN(srclen); - if (flags & BASE64_ENCODE_MULTILINE) - enclen += CEIL_DIV(enclen, BASE64_OPENSSL_LINELEN); - - tor_assert(enclen < INT_MAX && (enclen == 0 || enclen > srclen)); - return enclen; -} - -/** Internal table mapping 6 bit values to the Base64 alphabet. */ -static const char base64_encode_table[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '+', '/' -}; - -/** Base64 encode srclen bytes of data from src. Write - * the result into dest, if it will fit within destlen - * bytes. Return the number of bytes written on success; -1 if - * destlen is too short, or other failure. - * - * If flags&BASE64_ENCODE_MULTILINE is true, return encoded - * output in multiline format (64 character, `\n' terminated lines). - */ -int -base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, - int flags) -{ - const unsigned char *usrc = (unsigned char *)src; - const unsigned char *eous = usrc + srclen; - char *d = dest; - uint32_t n = 0; - size_t linelen = 0; - size_t enclen; - int n_idx = 0; - - if (!src || !dest) - return -1; - - /* Ensure that there is sufficient space, including the NUL. */ - enclen = base64_encode_size(srclen, flags); - if (destlen < enclen + 1) - return -1; - if (destlen > SIZE_T_CEILING) - return -1; - if (enclen > INT_MAX) - return -1; - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - /* XXX/Yawning: If this ends up being too slow, this can be sped up - * by separating the multiline format case and the normal case, and - * processing 48 bytes of input at a time when newlines are desired. - */ -#define ENCODE_CHAR(ch) \ - STMT_BEGIN \ - *d++ = ch; \ - if (flags & BASE64_ENCODE_MULTILINE) { \ - if (++linelen % BASE64_OPENSSL_LINELEN == 0) { \ - linelen = 0; \ - *d++ = '\n'; \ - } \ - } \ - STMT_END - -#define ENCODE_N(idx) \ - ENCODE_CHAR(base64_encode_table[(n >> ((3 - idx) * 6)) & 0x3f]) - -#define ENCODE_PAD() ENCODE_CHAR('=') - - /* Iterate over all the bytes in src. Each one will add 8 bits to the - * value we're encoding. Accumulate bits in n, and whenever we - * have 24 bits, batch them into 4 bytes and flush those bytes to dest. - */ - for ( ; usrc < eous; ++usrc) { - n = (n << 8) | *usrc; - if ((++n_idx) == 3) { - ENCODE_N(0); - ENCODE_N(1); - ENCODE_N(2); - ENCODE_N(3); - n_idx = 0; - n = 0; - } - } - switch (n_idx) { - case 0: - /* 0 leftover bits, no pading to add. */ - break; - case 1: - /* 8 leftover bits, pad to 12 bits, write the 2 6-bit values followed - * by 2 padding characters. - */ - n <<= 4; - ENCODE_N(2); - ENCODE_N(3); - ENCODE_PAD(); - ENCODE_PAD(); - break; - case 2: - /* 16 leftover bits, pad to 18 bits, write the 3 6-bit values followed - * by 1 padding character. - */ - n <<= 2; - ENCODE_N(1); - ENCODE_N(2); - ENCODE_N(3); - ENCODE_PAD(); - break; - // LCOV_EXCL_START -- we can't reach this point, because we enforce - // 0 <= ncov_idx < 3 in the loop above. - default: - /* Something went catastrophically wrong. */ - tor_fragile_assert(); - return -1; - // LCOV_EXCL_STOP - } - -#undef ENCODE_N -#undef ENCODE_PAD -#undef ENCODE_CHAR - - /* Multiline output always includes at least one newline. */ - if (flags & BASE64_ENCODE_MULTILINE && linelen != 0) - *d++ = '\n'; - - tor_assert(d - dest == (ptrdiff_t)enclen); - - *d++ = '\0'; /* NUL terminate the output. */ - - return (int) enclen; -} - -/** As base64_encode, but do not add any internal spaces or external padding - * to the output stream. */ -int -base64_encode_nopad(char *dest, size_t destlen, - const uint8_t *src, size_t srclen) -{ - int n = base64_encode(dest, destlen, (const char*) src, srclen, 0); - if (n <= 0) - return n; - tor_assert((size_t)n < destlen && dest[n] == 0); - char *in, *out; - in = out = dest; - while (*in) { - if (*in == '=' || *in == '\n') { - ++in; - } else { - *out++ = *in++; - } - } - *out = 0; - - tor_assert(out - dest <= INT_MAX); - - return (int)(out - dest); -} - -#undef BASE64_OPENSSL_LINELEN - -/** @{ */ -/** Special values used for the base64_decode_table */ -#define X 255 -#define SP 64 -#define PAD 65 -/** @} */ -/** Internal table mapping byte values to what they represent in base64. - * Numbers 0..63 are 6-bit integers. SPs are spaces, and should be - * skipped. Xs are invalid and must not appear in base64. PAD indicates - * end-of-string. */ -static const uint8_t base64_decode_table[256] = { - X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, /* */ - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, - X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, - X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, -}; - -/** Base64 decode srclen bytes of data from src. Write - * the result into dest, if it will fit within destlen - * bytes. Return the number of bytes written on success; -1 if - * destlen is too short, or other failure. - * - * NOTE 1: destlen is checked conservatively, as though srclen contained no - * spaces or padding. - * - * NOTE 2: This implementation does not check for the correct number of - * padding "=" characters at the end of the string, and does not check - * for internal padding characters. - */ -int -base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - const char *eos = src+srclen; - uint32_t n=0; - int n_idx=0; - size_t di = 0; - - if (destlen > INT_MAX) - return -1; - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - /* Iterate over all the bytes in src. Each one will add 0 or 6 bits to the - * value we're decoding. Accumulate bits in n, and whenever we have - * 24 bits, batch them into 3 bytes and flush those bytes to dest. - */ - for ( ; src < eos; ++src) { - unsigned char c = (unsigned char) *src; - uint8_t v = base64_decode_table[c]; - switch (v) { - case X: - /* This character isn't allowed in base64. */ - return -1; - case SP: - /* This character is whitespace, and has no effect. */ - continue; - case PAD: - /* We've hit an = character: the data is over. */ - goto end_of_loop; - default: - /* We have an actual 6-bit value. Append it to the bits in n. */ - n = (n<<6) | v; - if ((++n_idx) == 4) { - /* We've accumulated 24 bits in n. Flush them. */ - if (destlen < 3 || di > destlen - 3) - return -1; - dest[di++] = (n>>16); - dest[di++] = (n>>8) & 0xff; - dest[di++] = (n) & 0xff; - n_idx = 0; - n = 0; - } - } - } - end_of_loop: - /* If we have leftover bits, we need to cope. */ - switch (n_idx) { - case 0: - default: - /* No leftover bits. We win. */ - break; - case 1: - /* 6 leftover bits. That's invalid; we can't form a byte out of that. */ - return -1; - case 2: - /* 12 leftover bits: The last 4 are padding and the first 8 are data. */ - if (destlen < 1 || di > destlen - 1) - return -1; - dest[di++] = n >> 4; - break; - case 3: - /* 18 leftover bits: The last 2 are padding and the first 16 are data. */ - if (destlen < 2 || di > destlen - 2) - return -1; - dest[di++] = n >> 10; - dest[di++] = n >> 2; - } - - tor_assert(di <= destlen); - - return (int)di; -} -#undef X -#undef SP -#undef PAD - -/** Encode the srclen bytes at src in a NUL-terminated, - * uppercase hexadecimal string; store it in the destlen-byte buffer - * dest. - */ -void -base16_encode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - const char *end; - char *cp; - - tor_assert(srclen < SIZE_T_CEILING / 2 - 1); - tor_assert(destlen >= BASE16_BUFSIZE(srclen)); - tor_assert(destlen < SIZE_T_CEILING); - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - cp = dest; - end = src+srclen; - while (src> 4 ]; - *cp++ = "0123456789ABCDEF"[ (*(const uint8_t*)src) & 0xf ]; - ++src; - } - *cp = '\0'; -} - -/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ -static inline int -hex_decode_digit_(char c) -{ - switch (c) { - case '0': return 0; - case '1': return 1; - case '2': return 2; - case '3': return 3; - case '4': return 4; - case '5': return 5; - case '6': return 6; - case '7': return 7; - case '8': return 8; - case '9': return 9; - case 'A': case 'a': return 10; - case 'B': case 'b': return 11; - case 'C': case 'c': return 12; - case 'D': case 'd': return 13; - case 'E': case 'e': return 14; - case 'F': case 'f': return 15; - default: - return -1; - } -} - -/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ -int -hex_decode_digit(char c) -{ - return hex_decode_digit_(c); -} - -/** Given a hexadecimal string of srclen bytes in src, decode - * it and store the result in the destlen-byte buffer at dest. - * Return the number of bytes decoded on success, -1 on failure. If - * destlen is greater than INT_MAX or less than half of - * srclen, -1 is returned. */ -int -base16_decode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - const char *end; - char *dest_orig = dest; - int v1,v2; - - if ((srclen % 2) != 0) - return -1; - if (destlen < srclen/2 || destlen > INT_MAX) - return -1; - - /* Make sure we leave no uninitialized data in the destination buffer. */ - memset(dest, 0, destlen); - - end = src+srclen; - while (src -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif - -#include "compat.h" -#include "util.h" -#include "torlog.h" -#include "util_process.h" -#include "ht.h" - -/* ================================================== */ -/* Convenience structures for handlers for waitpid(). - * - * The tor_process_monitor*() code above doesn't use them, since it is for - * monitoring a non-child process. - */ - -#ifndef _WIN32 - -/** Mapping from a PID to a userfn/userdata pair. */ -struct waitpid_callback_t { - HT_ENTRY(waitpid_callback_t) node; - pid_t pid; - - void (*userfn)(int, void *userdata); - void *userdata; - - unsigned running; -}; - -static inline unsigned int -process_map_entry_hash_(const waitpid_callback_t *ent) -{ - return (unsigned) ent->pid; -} - -static inline unsigned int -process_map_entries_eq_(const waitpid_callback_t *a, - const waitpid_callback_t *b) -{ - return a->pid == b->pid; -} - -static HT_HEAD(process_map, waitpid_callback_t) process_map = HT_INITIALIZER(); - -HT_PROTOTYPE(process_map, waitpid_callback_t, node, process_map_entry_hash_, - process_map_entries_eq_) -HT_GENERATE2(process_map, waitpid_callback_t, node, process_map_entry_hash_, - process_map_entries_eq_, 0.6, tor_reallocarray_, tor_free_) - -/** - * Begin monitoring the child pid pid to see if we get a SIGCHLD for - * it. If we eventually do, call fn, passing it the exit status (as - * yielded by waitpid) and the pointer arg. - * - * To cancel this, or clean up after it has triggered, call - * clear_waitpid_callback(). - */ -waitpid_callback_t * -set_waitpid_callback(pid_t pid, void (*fn)(int, void *), void *arg) -{ - waitpid_callback_t *old_ent; - waitpid_callback_t *ent = tor_malloc_zero(sizeof(waitpid_callback_t)); - ent->pid = pid; - ent->userfn = fn; - ent->userdata = arg; - ent->running = 1; - - old_ent = HT_REPLACE(process_map, &process_map, ent); - if (old_ent) { - log_warn(LD_BUG, "Replaced a waitpid monitor on pid %u. That should be " - "impossible.", (unsigned) pid); - old_ent->running = 0; - } - - return ent; -} - -/** - * Cancel a waitpid_callback_t, or clean up after one has triggered. Releases - * all storage held by ent. - */ -void -clear_waitpid_callback(waitpid_callback_t *ent) -{ - waitpid_callback_t *old_ent; - if (ent == NULL) - return; - - if (ent->running) { - old_ent = HT_REMOVE(process_map, &process_map, ent); - if (old_ent != ent) { - log_warn(LD_BUG, "Couldn't remove waitpid monitor for pid %u.", - (unsigned) ent->pid); - return; - } - } - - tor_free(ent); -} - -/** Helper: find the callack for pid; if there is one, run it, - * reporting the exit status as status. */ -static void -notify_waitpid_callback_by_pid(pid_t pid, int status) -{ - waitpid_callback_t search, *ent; - - search.pid = pid; - ent = HT_REMOVE(process_map, &process_map, &search); - if (!ent || !ent->running) { - log_info(LD_GENERAL, "Child process %u has exited; no callback was " - "registered", (unsigned)pid); - return; - } - - log_info(LD_GENERAL, "Child process %u has exited; running callback.", - (unsigned)pid); - - ent->running = 0; - ent->userfn(status, ent->userdata); -} - -/** Use waitpid() to wait for all children that have exited, and invoke any - * callbacks registered for them. */ -void -notify_pending_waitpid_callbacks(void) -{ - /* I was going to call this function reap_zombie_children(), but - * that makes it sound way more exciting than it really is. */ - pid_t child; - int status = 0; - - while ((child = waitpid(-1, &status, WNOHANG)) > 0) { - notify_waitpid_callback_by_pid(child, status); - status = 0; /* should be needless */ - } -} - -#endif /* !defined(_WIN32) */ - diff --git a/src/tor/src/common/util_process.h b/src/tor/src/common/util_process.h deleted file mode 100644 index c9aa771b7..000000000 --- a/src/tor/src/common/util_process.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file util_process.h - * \brief Headers for util_process.c - **/ - -#ifndef TOR_UTIL_PROCESS_H -#define TOR_UTIL_PROCESS_H - -#ifndef _WIN32 -/** A callback structure waiting for us to get a SIGCHLD informing us that a - * PID has been closed. Created by set_waitpid_callback. Cancelled or cleaned- - * up from clear_waitpid_callback(). Do not access outside of the main thread; - * do not access from inside a signal handler. */ -typedef struct waitpid_callback_t waitpid_callback_t; - -waitpid_callback_t *set_waitpid_callback(pid_t pid, - void (*fn)(int, void *), void *arg); -void clear_waitpid_callback(waitpid_callback_t *ent); -void notify_pending_waitpid_callbacks(void); -#endif /* !defined(_WIN32) */ - -#endif /* !defined(TOR_UTIL_PROCESS_H) */ - diff --git a/src/tor/src/common/workqueue.c b/src/tor/src/common/workqueue.c deleted file mode 100644 index ec96959b7..000000000 --- a/src/tor/src/common/workqueue.c +++ /dev/null @@ -1,645 +0,0 @@ -/* copyright (c) 2013-2015, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file workqueue.c - * - * \brief Implements worker threads, queues of work for them, and mechanisms - * for them to send answers back to the main thread. - * - * The main structure here is a threadpool_t : it manages a set of worker - * threads, a queue of pending work, and a reply queue. Every piece of work - * is a workqueue_entry_t, containing data to process and a function to - * process it with. - * - * The main thread informs the worker threads of pending work by using a - * condition variable. The workers inform the main process of completed work - * by using an alert_sockets_t object, as implemented in compat_threads.c. - * - * The main thread can also queue an "update" that will be handled by all the - * workers. This is useful for updating state that all the workers share. - * - * In Tor today, there is currently only one thread pool, used in cpuworker.c. - */ - -#include "orconfig.h" -#include "compat.h" -#include "compat_threads.h" -#include "crypto.h" -#include "util.h" -#include "workqueue.h" -#include "tor_queue.h" -#include "torlog.h" - -#define WORKQUEUE_PRIORITY_FIRST WQ_PRI_HIGH -#define WORKQUEUE_PRIORITY_LAST WQ_PRI_LOW -#define WORKQUEUE_N_PRIORITIES (((int) WORKQUEUE_PRIORITY_LAST)+1) - -TOR_TAILQ_HEAD(work_tailq_t, workqueue_entry_s); -typedef struct work_tailq_t work_tailq_t; - -struct threadpool_s { - /** An array of pointers to workerthread_t: one for each running worker - * thread. */ - struct workerthread_s **threads; - - /** Condition variable that we wait on when we have no work, and which - * gets signaled when our queue becomes nonempty. */ - tor_cond_t condition; - /** Queues of pending work that we have to do. The queue with priority - * p is work[p]. */ - work_tailq_t work[WORKQUEUE_N_PRIORITIES]; - - /** Weak RNG, used to decide when to ignore priority. */ - tor_weak_rng_t weak_rng; - - /** The current 'update generation' of the threadpool. Any thread that is - * at an earlier generation needs to run the update function. */ - unsigned generation; - - /** Function that should be run for updates on each thread. */ - workqueue_reply_t (*update_fn)(void *, void *); - /** Function to free update arguments if they can't be run. */ - void (*free_update_arg_fn)(void *); - /** Array of n_threads update arguments. */ - void **update_args; - - /** Number of elements in threads. */ - int n_threads; - /** Mutex to protect all the above fields. */ - tor_mutex_t lock; - - /** A reply queue to use when constructing new threads. */ - replyqueue_t *reply_queue; - - /** Functions used to allocate and free thread state. */ - void *(*new_thread_state_fn)(void*); - void (*free_thread_state_fn)(void*); - void *new_thread_state_arg; -}; - -/** Used to put a workqueue_priority_t value into a bitfield. */ -#define workqueue_priority_bitfield_t ENUM_BF(workqueue_priority_t) -/** Number of bits needed to hold all legal values of workqueue_priority_t */ -#define WORKQUEUE_PRIORITY_BITS 2 - -struct workqueue_entry_s { - /** The next workqueue_entry_t that's pending on the same thread or - * reply queue. */ - TOR_TAILQ_ENTRY(workqueue_entry_s) next_work; - /** The threadpool to which this workqueue_entry_t was assigned. This field - * is set when the workqueue_entry_t is created, and won't be cleared until - * after it's handled in the main thread. */ - struct threadpool_s *on_pool; - /** True iff this entry is waiting for a worker to start processing it. */ - uint8_t pending; - /** Priority of this entry. */ - workqueue_priority_bitfield_t priority : WORKQUEUE_PRIORITY_BITS; - /** Function to run in the worker thread. */ - workqueue_reply_t (*fn)(void *state, void *arg); - /** Function to run while processing the reply queue. */ - void (*reply_fn)(void *arg); - /** Argument for the above functions. */ - void *arg; -}; - -struct replyqueue_s { - /** Mutex to protect the answers field */ - tor_mutex_t lock; - /** Doubly-linked list of answers that the reply queue needs to handle. */ - TOR_TAILQ_HEAD(, workqueue_entry_s) answers; - - /** Mechanism to wake up the main thread when it is receiving answers. */ - alert_sockets_t alert; -}; - -/** A worker thread represents a single thread in a thread pool. */ -typedef struct workerthread_s { - /** Which thread it this? In range 0..in_pool->n_threads-1 */ - int index; - /** The pool this thread is a part of. */ - struct threadpool_s *in_pool; - /** User-supplied state field that we pass to the worker functions of each - * work item. */ - void *state; - /** Reply queue to which we pass our results. */ - replyqueue_t *reply_queue; - /** The current update generation of this thread */ - unsigned generation; - /** One over the probability of taking work from a lower-priority queue. */ - int32_t lower_priority_chance; -} workerthread_t; - -static void queue_reply(replyqueue_t *queue, workqueue_entry_t *work); - -/** Allocate and return a new workqueue_entry_t, set up to run the function - * fn in the worker thread, and reply_fn in the main - * thread. See threadpool_queue_work() for full documentation. */ -static workqueue_entry_t * -workqueue_entry_new(workqueue_reply_t (*fn)(void*, void*), - void (*reply_fn)(void*), - void *arg) -{ - workqueue_entry_t *ent = tor_malloc_zero(sizeof(workqueue_entry_t)); - ent->fn = fn; - ent->reply_fn = reply_fn; - ent->arg = arg; - ent->priority = WQ_PRI_HIGH; - return ent; -} - -#define workqueue_entry_free(ent) \ - FREE_AND_NULL(workqueue_entry_t, workqueue_entry_free_, (ent)) - -/** - * Release all storage held in ent. Call only when ent is not on - * any queue. - */ -static void -workqueue_entry_free_(workqueue_entry_t *ent) -{ - if (!ent) - return; - memset(ent, 0xf0, sizeof(*ent)); - tor_free(ent); -} - -/** - * Cancel a workqueue_entry_t that has been returned from - * threadpool_queue_work. - * - * You must not call this function on any work whose reply function has been - * executed in the main thread; that will cause undefined behavior (probably, - * a crash). - * - * If the work is cancelled, this function return the argument passed to the - * work function. It is the caller's responsibility to free this storage. - * - * This function will have no effect if the worker thread has already executed - * or begun to execute the work item. In that case, it will return NULL. - */ -void * -workqueue_entry_cancel(workqueue_entry_t *ent) -{ - int cancelled = 0; - void *result = NULL; - tor_mutex_acquire(&ent->on_pool->lock); - workqueue_priority_t prio = ent->priority; - if (ent->pending) { - TOR_TAILQ_REMOVE(&ent->on_pool->work[prio], ent, next_work); - cancelled = 1; - result = ent->arg; - } - tor_mutex_release(&ent->on_pool->lock); - - if (cancelled) { - workqueue_entry_free(ent); - } - return result; -} - -/**DOCDOC - - must hold lock */ -static int -worker_thread_has_work(workerthread_t *thread) -{ - unsigned i; - for (i = WORKQUEUE_PRIORITY_FIRST; i <= WORKQUEUE_PRIORITY_LAST; ++i) { - if (!TOR_TAILQ_EMPTY(&thread->in_pool->work[i])) - return 1; - } - return thread->generation != thread->in_pool->generation; -} - -/** Extract the next workqueue_entry_t from the the thread's pool, removing - * it from the relevant queues and marking it as non-pending. - * - * The caller must hold the lock. */ -static workqueue_entry_t * -worker_thread_extract_next_work(workerthread_t *thread) -{ - threadpool_t *pool = thread->in_pool; - work_tailq_t *queue = NULL, *this_queue; - unsigned i; - for (i = WORKQUEUE_PRIORITY_FIRST; i <= WORKQUEUE_PRIORITY_LAST; ++i) { - this_queue = &pool->work[i]; - if (!TOR_TAILQ_EMPTY(this_queue)) { - queue = this_queue; - if (! tor_weak_random_one_in_n(&pool->weak_rng, - thread->lower_priority_chance)) { - /* Usually we'll just break now, so that we can get out of the loop - * and use the queue where we found work. But with a small - * probability, we'll keep looking for lower priority work, so that - * we don't ignore our low-priority queues entirely. */ - break; - } - } - } - - if (queue == NULL) - return NULL; - - workqueue_entry_t *work = TOR_TAILQ_FIRST(queue); - TOR_TAILQ_REMOVE(queue, work, next_work); - work->pending = 0; - return work; -} - -/** - * Main function for the worker thread. - */ -static void -worker_thread_main(void *thread_) -{ - workerthread_t *thread = thread_; - threadpool_t *pool = thread->in_pool; - workqueue_entry_t *work; - workqueue_reply_t result; - - tor_mutex_acquire(&pool->lock); - while (1) { - /* lock must be held at this point. */ - while (worker_thread_has_work(thread)) { - /* lock must be held at this point. */ - if (thread->in_pool->generation != thread->generation) { - void *arg = thread->in_pool->update_args[thread->index]; - thread->in_pool->update_args[thread->index] = NULL; - workqueue_reply_t (*update_fn)(void*,void*) = - thread->in_pool->update_fn; - thread->generation = thread->in_pool->generation; - tor_mutex_release(&pool->lock); - - workqueue_reply_t r = update_fn(thread->state, arg); - - if (r != WQ_RPL_REPLY) { - return; - } - - tor_mutex_acquire(&pool->lock); - continue; - } - work = worker_thread_extract_next_work(thread); - if (BUG(work == NULL)) - break; - tor_mutex_release(&pool->lock); - - /* We run the work function without holding the thread lock. This - * is the main thread's first opportunity to give us more work. */ - result = work->fn(thread->state, work->arg); - - /* Queue the reply for the main thread. */ - queue_reply(thread->reply_queue, work); - - /* We may need to exit the thread. */ - if (result != WQ_RPL_REPLY) { - return; - } - tor_mutex_acquire(&pool->lock); - } - /* At this point the lock is held, and there is no work in this thread's - * queue. */ - - /* TODO: support an idle-function */ - - /* Okay. Now, wait till somebody has work for us. */ - if (tor_cond_wait(&pool->condition, &pool->lock, NULL) < 0) { - log_warn(LD_GENERAL, "Fail tor_cond_wait."); - } - } -} - -/** Put a reply on the reply queue. The reply must not currently be on - * any thread's work queue. */ -static void -queue_reply(replyqueue_t *queue, workqueue_entry_t *work) -{ - int was_empty; - tor_mutex_acquire(&queue->lock); - was_empty = TOR_TAILQ_EMPTY(&queue->answers); - TOR_TAILQ_INSERT_TAIL(&queue->answers, work, next_work); - tor_mutex_release(&queue->lock); - - if (was_empty) { - if (queue->alert.alert_fn(queue->alert.write_fd) < 0) { - /* XXXX complain! */ - } - } -} - -/** Allocate and start a new worker thread to use state object state, - * and send responses to replyqueue. */ -static workerthread_t * -workerthread_new(int32_t lower_priority_chance, - void *state, threadpool_t *pool, replyqueue_t *replyqueue) -{ - workerthread_t *thr = tor_malloc_zero(sizeof(workerthread_t)); - thr->state = state; - thr->reply_queue = replyqueue; - thr->in_pool = pool; - thr->lower_priority_chance = lower_priority_chance; - - if (spawn_func(worker_thread_main, thr) < 0) { - //LCOV_EXCL_START - tor_assert_nonfatal_unreached(); - log_err(LD_GENERAL, "Can't launch worker thread."); - tor_free(thr); - return NULL; - //LCOV_EXCL_STOP - } - - return thr; -} - -/** - * Queue an item of work for a thread in a thread pool. The function - * fn will be run in a worker thread, and will receive as arguments the - * thread's state object, and the provided object arg. It must return - * one of WQ_RPL_REPLY, WQ_RPL_ERROR, or WQ_RPL_SHUTDOWN. - * - * Regardless of its return value, the function reply_fn will later be - * run in the main thread when it invokes replyqueue_process(), and will - * receive as its argument the same arg object. It's the reply - * function's responsibility to free the work object. - * - * On success, return a workqueue_entry_t object that can be passed to - * workqueue_entry_cancel(). On failure, return NULL. (Failure is not - * currently possible, but callers should check anyway.) - * - * Items are executed in a loose priority order -- each thread will usually - * take from the queued work with the highest prioirity, but will occasionally - * visit lower-priority queues to keep them from starving completely. - * - * Note that because of priorities and thread behavior, work items may not - * be executed strictly in order. - */ -workqueue_entry_t * -threadpool_queue_work_priority(threadpool_t *pool, - workqueue_priority_t prio, - workqueue_reply_t (*fn)(void *, void *), - void (*reply_fn)(void *), - void *arg) -{ - tor_assert(((int)prio) >= WORKQUEUE_PRIORITY_FIRST && - ((int)prio) <= WORKQUEUE_PRIORITY_LAST); - - workqueue_entry_t *ent = workqueue_entry_new(fn, reply_fn, arg); - ent->on_pool = pool; - ent->pending = 1; - ent->priority = prio; - - tor_mutex_acquire(&pool->lock); - - TOR_TAILQ_INSERT_TAIL(&pool->work[prio], ent, next_work); - - tor_cond_signal_one(&pool->condition); - - tor_mutex_release(&pool->lock); - - return ent; -} - -/** As threadpool_queue_work_priority(), but assumes WQ_PRI_HIGH */ -workqueue_entry_t * -threadpool_queue_work(threadpool_t *pool, - workqueue_reply_t (*fn)(void *, void *), - void (*reply_fn)(void *), - void *arg) -{ - return threadpool_queue_work_priority(pool, WQ_PRI_HIGH, fn, reply_fn, arg); -} - -/** - * Queue a copy of a work item for every thread in a pool. This can be used, - * for example, to tell the threads to update some parameter in their states. - * - * Arguments are as for threadpool_queue_work, except that the - * arg value is passed to dup_fn once per each thread to - * make a copy of it. - * - * UPDATE FUNCTIONS MUST BE IDEMPOTENT. We do not guarantee that every update - * will be run. If a new update is scheduled before the old update finishes - * running, then the new will replace the old in any threads that haven't run - * it yet. - * - * Return 0 on success, -1 on failure. - */ -int -threadpool_queue_update(threadpool_t *pool, - void *(*dup_fn)(void *), - workqueue_reply_t (*fn)(void *, void *), - void (*free_fn)(void *), - void *arg) -{ - int i, n_threads; - void (*old_args_free_fn)(void *arg); - void **old_args; - void **new_args; - - tor_mutex_acquire(&pool->lock); - n_threads = pool->n_threads; - old_args = pool->update_args; - old_args_free_fn = pool->free_update_arg_fn; - - new_args = tor_calloc(n_threads, sizeof(void*)); - for (i = 0; i < n_threads; ++i) { - if (dup_fn) - new_args[i] = dup_fn(arg); - else - new_args[i] = arg; - } - - pool->update_args = new_args; - pool->free_update_arg_fn = free_fn; - pool->update_fn = fn; - ++pool->generation; - - tor_cond_signal_all(&pool->condition); - - tor_mutex_release(&pool->lock); - - if (old_args) { - for (i = 0; i < n_threads; ++i) { - if (old_args[i] && old_args_free_fn) - old_args_free_fn(old_args[i]); - } - tor_free(old_args); - } - - return 0; -} - -/** Don't have more than this many threads per pool. */ -#define MAX_THREADS 1024 - -/** For half of our threads, choose lower priority queues with probability - * 1/N for each of these values. Both are chosen somewhat arbitrarily. If - * CHANCE_PERMISSIVE is too low, then we have a risk of low-priority tasks - * stalling forever. If it's too high, we have a risk of low-priority tasks - * grabbing half of the threads. */ -#define CHANCE_PERMISSIVE 37 -#define CHANCE_STRICT INT32_MAX - -/** Launch threads until we have n. */ -static int -threadpool_start_threads(threadpool_t *pool, int n) -{ - if (BUG(n < 0)) - return -1; // LCOV_EXCL_LINE - if (n > MAX_THREADS) - n = MAX_THREADS; - - tor_mutex_acquire(&pool->lock); - - if (pool->n_threads < n) - pool->threads = tor_reallocarray(pool->threads, - sizeof(workerthread_t*), n); - - while (pool->n_threads < n) { - /* For half of our threads, we'll choose lower priorities permissively; - * for the other half, we'll stick more strictly to higher priorities. - * This keeps slow low-priority tasks from taking over completely. */ - int32_t chance = (pool->n_threads & 1) ? CHANCE_STRICT : CHANCE_PERMISSIVE; - - void *state = pool->new_thread_state_fn(pool->new_thread_state_arg); - workerthread_t *thr = workerthread_new(chance, - state, pool, pool->reply_queue); - - if (!thr) { - //LCOV_EXCL_START - tor_assert_nonfatal_unreached(); - pool->free_thread_state_fn(state); - tor_mutex_release(&pool->lock); - return -1; - //LCOV_EXCL_STOP - } - thr->index = pool->n_threads; - pool->threads[pool->n_threads++] = thr; - } - tor_mutex_release(&pool->lock); - - return 0; -} - -/** - * Construct a new thread pool with n worker threads, configured to - * send their output to replyqueue. The threads' states will be - * constructed with the new_thread_state_fn call, receiving arg - * as its argument. When the threads close, they will call - * free_thread_state_fn on their states. - */ -threadpool_t * -threadpool_new(int n_threads, - replyqueue_t *replyqueue, - void *(*new_thread_state_fn)(void*), - void (*free_thread_state_fn)(void*), - void *arg) -{ - threadpool_t *pool; - pool = tor_malloc_zero(sizeof(threadpool_t)); - tor_mutex_init_nonrecursive(&pool->lock); - tor_cond_init(&pool->condition); - unsigned i; - for (i = WORKQUEUE_PRIORITY_FIRST; i <= WORKQUEUE_PRIORITY_LAST; ++i) { - TOR_TAILQ_INIT(&pool->work[i]); - } - { - unsigned seed; - crypto_rand((void*)&seed, sizeof(seed)); - tor_init_weak_random(&pool->weak_rng, seed); - } - - pool->new_thread_state_fn = new_thread_state_fn; - pool->new_thread_state_arg = arg; - pool->free_thread_state_fn = free_thread_state_fn; - pool->reply_queue = replyqueue; - - if (threadpool_start_threads(pool, n_threads) < 0) { - //LCOV_EXCL_START - tor_assert_nonfatal_unreached(); - tor_cond_uninit(&pool->condition); - tor_mutex_uninit(&pool->lock); - tor_free(pool); - return NULL; - //LCOV_EXCL_STOP - } - - return pool; -} - -/** Return the reply queue associated with a given thread pool. */ -replyqueue_t * -threadpool_get_replyqueue(threadpool_t *tp) -{ - return tp->reply_queue; -} - -/** Allocate a new reply queue. Reply queues are used to pass results from - * worker threads to the main thread. Since the main thread is running an - * IO-centric event loop, it needs to get woken up with means other than a - * condition variable. */ -replyqueue_t * -replyqueue_new(uint32_t alertsocks_flags) -{ - replyqueue_t *rq; - - rq = tor_malloc_zero(sizeof(replyqueue_t)); - if (alert_sockets_create(&rq->alert, alertsocks_flags) < 0) { - //LCOV_EXCL_START - tor_free(rq); - return NULL; - //LCOV_EXCL_STOP - } - - tor_mutex_init(&rq->lock); - TOR_TAILQ_INIT(&rq->answers); - - return rq; -} - -/** - * Return the "read socket" for a given reply queue. The main thread should - * listen for read events on this socket, and call replyqueue_process() every - * time it triggers. - */ -tor_socket_t -replyqueue_get_socket(replyqueue_t *rq) -{ - return rq->alert.read_fd; -} - -/** - * Process all pending replies on a reply queue. The main thread should call - * this function every time the socket returned by replyqueue_get_socket() is - * readable. - */ -void -replyqueue_process(replyqueue_t *queue) -{ - int r = queue->alert.drain_fn(queue->alert.read_fd); - if (r < 0) { - //LCOV_EXCL_START - static ratelim_t warn_limit = RATELIM_INIT(7200); - log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL, - "Failure from drain_fd: %s", - tor_socket_strerror(-r)); - //LCOV_EXCL_STOP - } - - tor_mutex_acquire(&queue->lock); - while (!TOR_TAILQ_EMPTY(&queue->answers)) { - /* lock must be held at this point.*/ - workqueue_entry_t *work = TOR_TAILQ_FIRST(&queue->answers); - TOR_TAILQ_REMOVE(&queue->answers, work, next_work); - tor_mutex_release(&queue->lock); - work->on_pool = NULL; - - work->reply_fn(work->arg); - workqueue_entry_free(work); - - tor_mutex_acquire(&queue->lock); - } - - tor_mutex_release(&queue->lock); -} - diff --git a/src/tor/src/common/workqueue.h b/src/tor/src/common/workqueue.h deleted file mode 100644 index eb885e680..000000000 --- a/src/tor/src/common/workqueue.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_WORKQUEUE_H -#define TOR_WORKQUEUE_H - -#include "compat.h" - -/** A replyqueue is used to tell the main thread about the outcome of - * work that we queued for the workers. */ -typedef struct replyqueue_s replyqueue_t; -/** A thread-pool manages starting threads and passing work to them. */ -typedef struct threadpool_s threadpool_t; -/** A workqueue entry represents a request that has been passed to a thread - * pool. */ -typedef struct workqueue_entry_s workqueue_entry_t; - -/** Possible return value from a work function: */ -typedef enum workqueue_reply_t { - WQ_RPL_REPLY = 0, /** indicates success */ - WQ_RPL_ERROR = 1, /** indicates fatal error */ - WQ_RPL_SHUTDOWN = 2, /** indicates thread is shutting down */ -} workqueue_reply_t; - -/** Possible priorities for work. Lower numeric values are more important. */ -typedef enum workqueue_priority_t { - WQ_PRI_HIGH = 0, - WQ_PRI_MED = 1, - WQ_PRI_LOW = 2, -} workqueue_priority_t; - -workqueue_entry_t *threadpool_queue_work_priority(threadpool_t *pool, - workqueue_priority_t prio, - workqueue_reply_t (*fn)(void *, - void *), - void (*reply_fn)(void *), - void *arg); - -workqueue_entry_t *threadpool_queue_work(threadpool_t *pool, - workqueue_reply_t (*fn)(void *, - void *), - void (*reply_fn)(void *), - void *arg); - -int threadpool_queue_update(threadpool_t *pool, - void *(*dup_fn)(void *), - workqueue_reply_t (*fn)(void *, void *), - void (*free_fn)(void *), - void *arg); -void *workqueue_entry_cancel(workqueue_entry_t *pending_work); -threadpool_t *threadpool_new(int n_threads, - replyqueue_t *replyqueue, - void *(*new_thread_state_fn)(void*), - void (*free_thread_state_fn)(void*), - void *arg); -replyqueue_t *threadpool_get_replyqueue(threadpool_t *tp); - -replyqueue_t *replyqueue_new(uint32_t alertsocks_flags); -tor_socket_t replyqueue_get_socket(replyqueue_t *rq); -void replyqueue_process(replyqueue_t *queue); - -#endif /* !defined(TOR_WORKQUEUE_H) */ - diff --git a/src/tor/src/config/README b/src/tor/src/config/README deleted file mode 100644 index cb2debb88..000000000 --- a/src/tor/src/config/README +++ /dev/null @@ -1,35 +0,0 @@ -This directory has configuration files that ship with Tor. They include: - -geoip -geoip6 - - Geoip files for IPv4 and IPv6 - -torrc.minimal, torrc.sample: - - generated from torrc.minimal.in and torrc.sample.in by autoconf. - -torrc.minimal.in: - - A very small torrc, suitable for installation by default in - /etc/tor/torrc. - - We try to change torrc.minimal.in as infrequently as possible, - since doing so makes the users of many packages have to re-build - their torrc files. - - -torrc.minimal.in-staging - - This is where we stage changes to torrc.minimal.in over time so - that when we have a change large enough to warrant a new - torrc.minimal.in, we can copy all the other changes over - wholesale. - -torrc.sample.in: - - A verbose, discursive, batteries-included torrc. Suitable for - letting people know how to set up various options, including those - most people shouldn't mess with. - - diff --git a/src/tor/src/config/geoip b/src/tor/src/config/geoip deleted file mode 100644 index 84bd94d97..000000000 --- a/src/tor/src/config/geoip +++ /dev/null @@ -1,161213 +0,0 @@ -# Last updated based on December 6 2017 Maxmind GeoLite2 Country -# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz -# gunzip GeoLite2-Country.mmdb.gz -# python mmdb-convert.py GeoLite2-Country.mmdb -16777216,16777471,AU -16777472,16778239,CN -16778240,16779263,AU -16779264,16781311,CN -16781312,16785407,JP -16785408,16793599,CN -16793600,16809983,JP -16809984,16842751,TH -16842752,16843007,CN -16843008,16843263,AU -16843264,16859135,CN -16859136,16875519,JP -16875520,16908287,TH -16908288,16909055,CN -16909056,16909311,US -16909312,16941055,CN -16941056,16973823,TH -16973824,17039359,CN -17039360,17039615,AU -17039616,17072127,CN -17072128,17104895,TH -17104896,17170431,JP -17170432,17301503,IN -17301504,17367039,CN -17367040,17432575,MY -17432576,17435135,CN -17435136,17435391,AU -17435392,17465343,CN -17465344,17498111,TH -17498112,17563647,KR -17563648,17825791,CN -17825792,18087935,KR -18087936,18153471,TH -18153472,18219007,JP -18219008,18350079,IN -18350080,18874367,CN -18874368,18907135,MY -18907136,18923519,SG -18923520,18924031,HK -18924032,18924287,TW -18924288,18924799,HK -18924800,18925055,TW -18925056,18925567,HK -18925568,18926079,SG -18926080,18926207,TW -18926208,18926335,SG -18926336,18926463,TW -18926464,18926591,SG -18926592,18926719,TW -18926720,18927615,SG -18927616,18929663,TW -18929664,18931711,KR -18931712,18933759,JP -18933760,18939903,SG -18939904,19005439,JP -19005440,19005440,CN -19005441,19136511,TW -19136512,19202047,HK -19202048,19267583,PH -19267584,19398655,IN -19398656,19726335,AU -19726336,19791871,CN -19791872,19807232,TH -19807233,19807233,CN -19807234,19922943,TH -19922944,20185087,CN -20185088,20447231,VN -20447232,20971519,CN -20971520,21102591,HK -21102592,21233663,JP -21233664,21495807,CN -21495808,22020095,JP -22020096,23068671,CN -23068672,24117247,KR -24117248,24379391,JP -24379392,24641535,CN -24641536,27262975,AU -27262976,28311551,TW -28311552,28442623,KR -28442624,28540927,AU -28540928,28573695,TH -28573696,28966911,CN -28966912,29097983,IN -29097984,29884415,CN -29884416,29949951,TW -29949952,30015487,KR -30015488,30408703,CN -30408704,33554431,KR -33554432,34603007,FR -34604544,34605055,DE -34612224,34612479,AU -34612480,34612735,IL -34620416,34620927,SE -34620928,34621439,IT -34621952,34622463,NL -34636800,34637311,DE -34646528,34647551,DE -34648576,34649087,GR -34659328,34660351,GR -34673664,34674687,DE -34733056,34734079,DE -34754560,34758655,GR -34796032,34796543,NL -34803712,34807807,IT -34861056,34865151,DE -34866176,34867199,IT -34880512,34881535,DE -34910976,34911231,ES -34911232,34911743,DE -34911744,34911999,AT -34912000,34912255,GB -34912256,34912511,DE -34912512,34912767,ES -34912768,34913279,DE -34928384,34928639,DE -34930688,34938879,DE -34938880,34947071,FR -34953216,34954751,AT -34954752,34955263,NL -34955264,34959359,AT -34959360,34963455,NL -34992128,34993151,NL -34993152,34993663,FR -34993664,34993919,AT -34993920,34994175,DE -34994176,34995711,FR -34995968,34996223,NL -34999296,35001343,GB -35008512,35009023,FR -35010304,35010559,BE -35010560,35011583,FR -35011584,35012607,SE -35020800,35037183,GB -35037184,35054335,FR -35054336,35054591,GB -35055104,35055359,ES -35055872,35056127,NL -35059200,35059711,GB -35060736,35061247,GB -35061248,35061759,FR -35090432,35094527,GR -35127296,35651583,GB -35651584,36700159,IT -36700160,36962303,AE -36962304,37224447,IL -37486592,37748735,RU -37748736,38273023,SE -38273024,38797311,KZ -38797312,39059455,PT -39059456,39321599,GR -39321600,39583743,SA -39583744,39845887,RU -39845888,40159231,GB -40159232,40159232,IN -40159233,40370175,GB -40370176,40894463,DK -40894464,41418751,IT -41418752,41943039,GB -41943040,42205183,DK -42205184,42467327,KZ -42467328,42991615,ES -42991616,43253759,IR -43253760,43515903,NO -43515904,43778047,ES -43778048,44040191,IT -44040192,45088767,DE -45088768,46137343,IR -46137344,46661631,IT -46661632,47710207,DE -47710208,48234495,GB -48234496,49283071,IT -49283072,49807359,DE -49807360,50331647,SE -50331648,68169727,US -68169728,68171775,CA -68171776,68194815,US -68194816,68194879,CA -68194880,68305407,US -68305408,68305919,MX -68305920,68978687,US -68978688,68980735,CA -68980736,69109759,US -69109760,69111807,CA -69111808,71670208,US -71670209,71670209,NL -71670210,83886079,US -83886080,83951615,SY -83951616,83959807,UA -83959808,83961855,ES -83961856,83962111,KW -83962112,83962367,SA -83962368,83962623,BH -83962624,83962879,LB -83962880,83963135,AE -83963136,83963391,QA -83963392,83963647,OM -83963648,83963903,JO -83963904,83965951,RU -83965952,83967999,CZ -83968000,83969023,DE -83969024,83969535,GB -83969536,83972863,DE -83972864,83973119,GB -83973120,83974143,DE -83974144,83974399,GB -83974400,83976191,DE -83976192,83978239,CH -83978240,83980287,IQ -83980288,83982335,CH -83982336,84017151,DE -84017152,84021247,IT -84021248,84023295,GB -84023296,84025343,ES -84025344,84033535,RU -84033536,84037631,NL -84037632,84039679,TR -84039680,84041727,ES -84041728,84049919,GB -84049920,84082687,RO -84082688,84148223,RU -84148224,84410367,DE -84410368,84416511,RU -84416512,84417535,GB -84417536,84418559,RU -84418560,84418815,UA -84418816,84419071,NL -84419072,84419327,UA -84419328,84419583,NL -84419584,84420607,RU -84420608,84421631,GB -84421632,84421759,MX -84421760,84421887,PA -84421888,84422015,BR -84422016,84422143,CL -84422144,84422271,AR -84422272,84422399,CO -84422400,84422527,PL -84422528,84422655,IT -84422656,84426495,RU -84426496,84426751,US -84426752,84427775,RU -84427776,84428799,GB -84428800,84432895,RU -84432896,84433919,NL -84433920,84434943,RU -84434944,84443135,IT -84443136,84451327,LB -84451328,84457471,RU -84457472,84459519,ES -84459520,84471807,RU -84471808,84473855,IQ -84475904,84498681,DE -84498682,84498682,NL -84498683,84517997,DE -84517998,84517998,NL -84517999,84545535,DE -84545536,84549631,GB -84549632,84551679,GE -84551680,84557823,DE -84557824,84566015,NL -84566016,84574207,GB -84574208,84576255,FR -84576256,84582399,GB -84582400,84590591,DE -84590592,84591103,NL -84591104,84592639,CN -84592640,84594687,ES -84594688,84598783,DE -84598784,84600831,IQ -84600832,84602879,GB -84602880,84606975,AZ -84606976,84609023,AT -84609024,84615167,GB -84615168,84617215,IT -84617216,84619263,PS -84619264,84621311,DE -84621312,84623359,GR -84623360,84627455,RU -84627456,84629503,NL -84629504,84631551,GB -84631552,84639743,IT -84639744,84672511,TR -84672512,84934655,RO -84934656,85196799,RU -85196800,85262335,LT -85262336,85326911,OM -85326912,85327103,AE -85327104,85327871,OM -85327872,85360639,IR -85360640,85362687,IL -85362688,85364735,GB -85364736,85366783,DE -85366784,85367039,CZ -85367040,85367295,RU -85367296,85367551,SK -85367552,85367807,RU -85367808,85368831,UA -85368832,85377023,RS -85377024,85385215,IR -85385216,85387263,GB -85387264,85389311,SE -85389312,85391359,DE -85391360,85393407,NL -85394432,85394439,IT -85394944,85395199,HU -85395456,85395711,TR -85395968,85396223,LU -85396480,85397503,ES -85398016,85398047,NO -85398528,85399039,SA -85399040,85399047,CH -85399552,85400063,FR -85400576,85400583,ES -85401600,85403647,IT -85403648,85405695,FR -85405696,85407743,RU -85407744,85409791,FI -85409792,85417983,IS -85417984,85422079,RU -85422080,85424127,IR -85424128,85426175,TR -85426176,85458943,BE -85458944,85721087,TR -85721088,85723135,HU -85723136,85725183,IT -85725184,85729279,RU -85729280,85731327,IR -85731328,85733375,DE -85733376,85737471,GB -85737472,85753855,DE -85753856,85770239,IL -85770240,85786623,IR -85786624,85852159,IL -85852160,86015999,AE -86016000,86018047,BG -86018048,86020095,SI -86020096,86022143,RU -86022144,86024191,GB -86024192,86026239,DE -86026240,86028287,MD -86028288,86030335,MK -86030336,86032383,DE -86032384,86048767,OM -86048768,86114303,DK -86114304,86147071,KZ -86147072,86155263,ES -86155264,86157311,PS -86157312,86159359,IL -86159360,86160383,UA -86160384,86160895,NL -86160896,86161407,UA -86161408,86163455,IT -86163456,86171647,IR -86171648,86173695,DE -86173696,86175743,NL -86175744,86177535,SE -86177536,86177791,IE -86177792,86179839,LI -86179840,86220799,RU -86220800,86222607,JE -86222608,86222615,GB -86222616,86222847,JE -86222848,86226943,NL -86226944,86228991,SE -86228992,86231039,US -86231040,86233087,ES -86233088,86235135,RO -86235136,86237183,ES -86237184,86245375,DE -86245376,86376447,OM -86376448,86409215,AE -86409216,86441983,HU -86441984,86442239,FR -86442240,86442243,GB -86442244,86442291,FR -86442292,86442295,GB -86442296,86442495,FR -86442496,86442499,ES -86442500,86442507,FR -86442508,86442511,ES -86442512,86442687,FR -86442688,86442691,ES -86442692,86442695,FR -86442696,86442700,ES -86442701,86442701,CH -86442702,86442703,ES -86442704,86442719,FR -86442720,86442723,PT -86442724,86442724,PL -86442725,86442739,FR -86442740,86442743,ES -86442744,86442747,IE -86442748,86443007,GB -86443008,86443047,FR -86443048,86443051,ES -86443052,86443311,FR -86443312,86443319,ES -86443320,86443451,FR -86443452,86443455,ES -86443456,86443519,FR -86443520,86443535,PL -86443536,86443539,ES -86443540,86443583,FR -86443584,86443647,GB -86443648,86443883,FR -86443884,86443887,ES -86443888,86443991,FR -86443992,86443995,ES -86443996,86444023,FR -86444024,86444031,FI -86444032,86444119,FR -86444120,86444123,ES -86444124,86444311,FR -86444312,86444315,PL -86444316,86444323,ES -86444324,86444331,FR -86444332,86444335,ES -86444336,86444519,FR -86444520,86444523,ES -86444524,86444575,FR -86444576,86444579,ES -86444580,86444655,FR -86444656,86444663,ES -86444664,86444687,FR -86444688,86444691,ES -86444692,86444743,FR -86444744,86444751,GB -86444752,86444783,FR -86444784,86444791,GB -86444792,86444839,FR -86444840,86444843,ES -86444844,86444983,FR -86444984,86444991,ES -86444992,86445311,FR -86445312,86445319,NL -86445320,86445375,FR -86445376,86445407,ES -86445408,86445551,FR -86445552,86445555,ES -86445556,86445563,FR -86445564,86445567,ES -86445568,86445831,FR -86445832,86445839,ES -86445840,86446407,FR -86446408,86446408,DE -86446409,86446411,FR -86446412,86446412,DE -86446413,86446427,FR -86446428,86446431,DE -86446432,86446591,FR -86446592,86446599,ES -86446600,86446619,FR -86446620,86446620,DE -86446621,86446655,FR -86446656,86446663,ES -86446664,86446679,FR -86446680,86446683,ES -86446684,86446715,FR -86446716,86446719,DE -86446720,86446727,FR -86446728,86446731,DE -86446732,86446767,FR -86446768,86446771,GB -86446772,86446931,FR -86446932,86446935,CZ -86446936,86447095,FR -86447096,86447103,ES -86447104,86447279,FR -86447280,86447280,DE -86447281,86447287,FR -86447288,86447291,DE -86447292,86447335,FR -86447336,86447339,ES -86447340,86447351,FR -86447352,86447355,GB -86447356,86448559,FR -86448560,86448575,GB -86448576,86448803,FR -86448804,86448807,FI -86448808,86448835,FR -86448836,86448839,GB -86448840,86448851,FR -86448852,86448855,IT -86448856,86448859,PT -86448860,86448951,FR -86448952,86448955,DE -86448956,86449039,FR -86449040,86449055,ES -86449056,86449119,FR -86449120,86449151,PT -86449152,86449311,FR -86449312,86449343,ES -86449344,86449363,FR -86449364,86449367,DE -86449368,86449379,FR -86449380,86449383,FI -86449384,86449387,FR -86449388,86449391,FI -86449392,86449499,FR -86449500,86449503,ES -86449504,86449675,FR -86449676,86449679,PT -86449680,86449759,FR -86449760,86449791,IE -86449792,86449883,FR -86449884,86449884,DE -86449885,86449983,FR -86449984,86450015,LT -86450016,86450087,FR -86450088,86450091,PL -86450092,86450163,FR -86450164,86450167,GB -86450168,86450335,FR -86450336,86450339,GB -86450340,86450471,FR -86450472,86450479,ES -86450480,86450775,FR -86450776,86450779,PL -86450780,86450847,FR -86450848,86450863,ES -86450864,86450867,PT -86450868,86450875,FR -86450876,86450879,GB -86450880,86451531,FR -86451532,86451535,FI -86451536,86452059,FR -86452060,86452063,ES -86452064,86452067,FR -86452068,86452071,ES -86452072,86452347,FR -86452348,86452351,ES -86452352,86452367,FR -86452368,86452383,GB -86452384,86452399,ES -86452400,86452543,FR -86452544,86452575,GB -86452576,86452615,FR -86452616,86452623,ES -86452624,86452671,FR -86452672,86452735,GB -86452736,86452943,FR -86452944,86452959,GB -86452960,86453199,FR -86453200,86453203,ES -86453204,86453231,FR -86453232,86453247,ES -86453248,86453311,FR -86453312,86453319,ES -86453320,86453327,FR -86453328,86453339,ES -86453340,86453343,PT -86453344,86453435,FR -86453436,86453439,ES -86453440,86453836,FR -86453837,86453838,PT -86453839,86453843,FR -86453844,86453847,GB -86453848,86453947,FR -86453948,86453951,IE -86453952,86454207,FR -86454208,86454271,ES -86454272,86454279,FR -86454280,86454287,ES -86454288,86454299,FR -86454300,86454303,DE -86454304,86454335,FR -86454336,86454343,DE -86454344,86454463,FR -86454464,86454527,DE -86454528,86454559,FR -86454560,86454591,CZ -86454592,86454607,FR -86454608,86454611,DE -86454612,86454615,FR -86454616,86454619,ES -86454620,86454751,FR -86454752,86454783,CZ -86454784,86454823,FR -86454824,86454831,ES -86454832,86454839,FR -86454840,86454847,GB -86454848,86454855,DE -86454856,86454899,FR -86454900,86454903,GB -86454904,86455003,FR -86455004,86455007,ES -86455008,86455591,FR -86455592,86455595,NL -86455596,86455623,FR -86455624,86455624,DE -86455625,86455631,FR -86455632,86455647,CZ -86455648,86455767,FR -86455768,86455771,GB -86455772,86456039,FR -86456040,86456043,FI -86456044,86456195,FR -86456196,86456211,DE -86456212,86456351,FR -86456352,86456367,CH -86456368,86456371,FR -86456372,86456375,ES -86456376,86456655,FR -86456656,86456671,IE -86456672,86456943,FR -86456944,86456947,GR -86456948,86456999,FR -86457000,86457007,ES -86457008,86457059,FR -86457060,86457060,DE -86457061,86457087,FR -86457088,86457091,DE -86457092,86457111,FR -86457112,86457112,DE -86457113,86457187,FR -86457188,86457199,ES -86457200,86457263,FR -86457264,86457279,ES -86457280,86457403,FR -86457404,86457407,ES -86457408,86457455,FR -86457456,86457456,DE -86457457,86457471,FR -86457472,86457519,ES -86457520,86457703,FR -86457704,86457707,ES -86457708,86457759,FR -86457760,86457791,PL -86457792,86457799,FR -86457800,86457803,ES -86457804,86458183,FR -86458184,86458187,DE -86458188,86458295,FR -86458296,86458299,CZ -86458300,86466639,FR -86466640,86466647,ES -86466648,86467207,FR -86467208,86467211,IE -86467212,86467279,FR -86467280,86467283,DE -86467284,86467320,FR -86467321,86467321,FI -86467322,86467871,FR -86467872,86467903,BE -86467904,86467999,FR -86468000,86468003,PL -86468004,86468055,FR -86468056,86468056,DE -86468057,86468103,FR -86468104,86468111,IT -86468112,86468199,FR -86468200,86468200,ES -86468201,86468407,FR -86468408,86468415,CH -86468416,86468447,FR -86468448,86468479,CZ -86468480,86468571,FR -86468572,86468575,ES -86468576,86468587,FR -86468588,86468591,ES -86468592,86468671,FR -86468672,86468675,ES -86468676,86468799,FR -86468800,86468831,PL -86468832,86468883,FR -86468884,86468887,PL -86468888,86469183,FR -86469184,86469247,GB -86469248,86469691,FR -86469692,86469695,DE -86469696,86469791,FR -86469792,86469795,GB -86469796,86469915,FR -86469916,86469919,ES -86469920,86469951,FR -86469952,86470047,ES -86470048,86470359,FR -86470360,86470363,PT -86470364,86470727,FR -86470728,86470731,ES -86470732,86470735,FR -86470736,86470751,GB -86470752,86470767,PT -86470768,86470951,FR -86470952,86470959,GB -86470960,86471007,FR -86471008,86471023,IT -86471024,86471063,FR -86471064,86471071,PL -86471072,86471083,FR -86471084,86471087,DE -86471088,86471123,FR -86471124,86471127,GB -86471128,86471135,FR -86471136,86471167,FI -86471168,86471179,FR -86471180,86471180,DE -86471181,86471231,FR -86471232,86471263,FI -86471264,86471295,FR -86471296,86471327,GB -86471328,86471839,FR -86471840,86471871,PT -86471872,86471943,FR -86471944,86471947,ES -86471948,86472063,FR -86472064,86472095,IT -86472096,86472775,FR -86472776,86472779,GB -86472780,86472951,FR -86472952,86472955,PL -86472956,86473087,FR -86473088,86473151,PT -86473152,86473347,FR -86473348,86473359,ES -86473360,86473807,FR -86473808,86473823,GB -86473824,86473839,FR -86473840,86473855,PT -86473856,86474163,FR -86474164,86474167,GB -86474168,86474307,FR -86474308,86474311,DE -86474312,86474391,FR -86474392,86474395,ES -86474396,86474467,FR -86474468,86474475,GB -86474476,86474479,DE -86474480,86474527,FR -86474528,86474531,DE -86474532,86474743,FR -86474744,86474747,LT -86474748,86474751,FR -86474752,86482943,HR -86482944,86484991,RU -86484992,86487039,NL -86487040,86489087,GB -86489088,86491135,NL -86491136,86493183,PL -86493184,86495231,RU -86495232,86497279,ES -86497280,86499327,NL -86499328,86503423,FR -86503424,86505471,DE -86505472,86507519,GB -86507520,86573055,ES -86573056,86638591,SA -86638592,86671359,RU -86671360,86673407,JE -86673408,86675455,DE -86675456,86677503,IT -86677504,86687743,FR -86687744,86695935,IQ -86695936,86704127,SA -86704128,86720511,PT -86720512,86736895,BA -86736896,86745087,RU -86745088,86753279,HR -86753280,86761471,PS -86761472,86763519,CZ -86763520,86765567,IT -86765568,86767615,RU -86767616,86769663,IT -86769664,86773759,RU -86773760,86777855,GB -86777856,86779903,AZ -86779904,86781183,RU -86781184,86781439,NL -86781440,86786047,RU -86786048,86788095,NO -86788096,86790143,NL -86790144,86794239,TR -86794240,86795775,DE -86795776,86796287,NL -86796288,86797311,US -86797312,86797343,PY -86797344,86798335,DE -86798336,86802431,CH -86802432,86804479,GE -86804480,86806527,DK -86806528,86810623,TR -86810624,86812671,FR -86812672,86814719,RU -86814720,86816767,SE -86816768,86818815,EE -86818816,86822911,SE -86822912,86824959,AT -86824960,86827007,LV -86827008,86831103,GB -86831104,86833151,FI -86833152,86835199,GB -86835200,86837247,DE -86837248,86839295,ES -86839296,86840319,GB -86840320,86843391,NL -86847488,86849535,GB -86849536,86850559,CZ -86850560,86851327,NL -86851328,86851583,CZ -86851584,86855679,NL -86855680,86856703,RU -86856704,86858751,NL -86858752,86859775,RU -86859776,86863871,DE -86863872,86867967,EE -86867968,86872063,JO -86872064,86874111,GB -86874112,86876159,NO -86876160,86880255,ES -86880256,86882303,DE -86882304,86884351,LB -86884352,86900735,RU -86900736,87031807,TR -87031808,87293951,FR -87293952,87359487,IR -87359488,87360543,ES -87360544,87360575,NL -87360576,87361535,ES -87361536,87363583,CZ -87363584,87367679,RU -87367680,87375871,IR -87375872,87384063,GB -87384064,87386111,AE -87386112,87388159,CH -87388160,87390207,UA -87390208,87392255,RU -87392256,87425023,BG -87425024,87556095,GR -87556096,87558143,ES -87558144,87560191,IT -87560192,87562239,DE -87562240,87564287,UA -87564288,87566335,HU -87566336,87568383,FR -87568384,87570431,GB -87570432,87572479,ES -87572480,87588863,MD -87588864,87590143,IR -87590144,87590655,GB -87590656,87590911,IR -87590912,87592959,RU -87592960,87597055,DK -87597056,87599103,ES -87599104,87601151,GB -87601152,87621631,DE -87621632,87623679,LB -87623680,87625727,KG -87625728,87626751,NL -87626752,87627007,GB -87627008,87627775,NL -87627776,87629823,ES -87629824,87631871,IR -87631872,87633919,DE -87633920,87635967,DK -87635968,87638015,GB -87638016,87640063,UA -87640064,87642111,RS -87642112,87646207,GB -87646208,87646463,RE -87646464,87647231,FR -87647232,87647487,RE -87647488,87648255,FR -87648256,87648767,RE -87648768,87650047,FR -87650048,87650303,RE -87650304,87654399,FR -87654400,87670783,PL -87670784,87672831,DE -87672832,87674879,CH -87674880,87676927,AE -87676928,87678975,RU -87678976,87679999,ES -87680000,87681023,NL -87681024,87683071,RU -87683072,87685119,SE -87685120,87687167,NL -87687168,87752703,UA -87752704,87754751,RU -87754752,87755263,CZ -87755264,87755519,SK -87755520,87755775,KG -87755776,87756799,RU -87756800,87758847,ES -87758848,87761407,RU -87761408,87761663,CZ -87761664,87761919,RU -87761920,87762431,FR -87762432,87762943,UA -87762944,87763967,KZ -87763968,87766527,RU -87766528,87766783,UA -87766784,87768063,RU -87768064,87777279,ES -87777280,87777535,TJ -87777536,87778303,CZ -87778304,87779327,RU -87779328,87785471,CZ -87785472,87793663,RU -87793664,87818239,CZ -87818240,87883775,PL -87883776,87885823,IT -87885824,87889919,RU -87889920,87890687,IR -87890688,87890943,US -87890944,87891199,NL -87891200,87891967,IR -87891968,87902207,DE -87902208,87904255,IR -87904256,87906303,DE -87906304,87908351,FI -87908352,87912447,BG -87912448,87914495,IE -87914496,87916543,GB -87916544,87932927,DE -87932928,87934975,GB -87934976,87939071,ES -87939072,87941119,IT -87941120,87943167,CH -87943168,87945215,RU -87945216,87947263,HU -87947264,87949311,NL -87949312,87954431,GB -87954432,87954687,BE -87954688,87957503,GB -87957504,87957759,ES -87957760,87958015,IN -87958016,87958023,SG -87958024,87958031,IN -87958032,87958039,ID -87958040,87958047,US -87958048,87958055,GB -87958056,87958063,CN -87958064,87958279,SG -87958280,87958287,CN -87958288,87958295,US -87958296,87958303,GB -87958304,87958311,KR -87958312,87958527,SG -87958528,87959039,CZ -87959040,87959519,NL -87959520,87959527,BE -87959528,87959535,US -87959536,87959547,BE -87959548,87959551,NL -87959552,87959817,DE -87959818,87959818,NL -87959819,87959835,DE -87959836,87959836,BE -87959837,87960063,DE -87960064,87960321,GB -87960322,87960322,NL -87960323,87960575,GB -87960576,87961583,US -87961584,87961591,CA -87961592,87963651,US -87963652,87963655,AS -87963656,87963659,AI -87963660,87963663,AG -87963664,87963667,AR -87963668,87963671,AW -87963672,87963675,BS -87963676,87963679,BB -87963680,87963683,BZ -87963684,87963687,BM -87963688,87963691,BO -87963692,87963695,VG -87963696,87963699,KY -87963700,87963703,CL -87963704,87963707,CN -87963708,87963711,CO -87963712,87963715,CK -87963716,87963719,CR -87963720,87963723,CU -87963724,87963727,DM -87963728,87963731,DO -87963732,87963735,EC -87963736,87963739,SV -87963740,87963743,FK -87963744,87963747,FJ -87963748,87963751,GD -87963752,87963755,GP -87963756,87963759,GU -87963760,87963763,GT -87963764,87963767,GY -87963768,87963771,HT -87963772,87963775,HN -87963776,87963779,JM -87963780,87963783,KI -87963784,87963787,MS -87963788,87963791,NR -87963792,87963795,NC -87963796,87963799,NI -87963800,87963803,NU -87963804,87963807,NF -87963808,87963810,US -87963811,87963811,KP -87963812,87963815,PW -87963816,87963819,PA -87963820,87963823,PG -87963824,87963827,PY -87963828,87963831,PE -87963832,87963835,PH -87963836,87963839,PN -87963840,87963843,PR -87963844,87963847,KN -87963848,87963851,LC -87963852,87963855,VC -87963856,87963859,WS -87963860,87963863,SB -87963864,87963867,SR -87963868,87963871,SZ -87963872,87963875,TK -87963876,87963879,TO -87963880,87963883,TT -87963884,87963887,TC -87963888,87963891,TV -87963892,87963895,UY -87963896,87963911,US -87963912,87963915,DE -87963916,87963955,US -87963956,87963959,CA -87963960,87963963,GB -87963964,87963999,US -87964000,87964003,VU -87964004,87964007,VE -87964008,87964015,US -87964016,87964019,IN -87964020,87964163,US -87964164,87964167,AS -87964168,87964171,AI -87964172,87964175,AG -87964176,87964179,AR -87964180,87964183,AW -87964184,87964187,BS -87964188,87964191,BB -87964192,87964195,BZ -87964196,87964199,BM -87964200,87964203,BO -87964204,87964207,VG -87964208,87964211,KY -87964212,87964215,CL -87964216,87964219,CO -87964220,87964223,CK -87964224,87964227,CR -87964228,87964231,CU -87964232,87964235,DM -87964236,87964239,DO -87964240,87964243,EC -87964244,87964247,SV -87964248,87964251,FK -87964252,87964255,FJ -87964256,87964259,GD -87964260,87964263,GP -87964264,87964267,GT -87964268,87964271,GY -87964272,87964275,HT -87964276,87964279,HN -87964280,87964283,JM -87964284,87964287,KI -87964288,87964291,MS -87964292,87964295,NR -87964296,87964299,NC -87964300,87964303,NI -87964304,87964307,NU -87964308,87964311,NF -87964312,87964315,PA -87964316,87964319,PY -87964320,87964323,PE -87964324,87964327,PN -87964328,87964331,PR -87964332,87964335,KN -87964336,87964339,LC -87964340,87964343,PM -87964344,87964347,VC -87964348,87964351,WS -87964352,87964355,SB -87964356,87964359,SR -87964360,87964363,SZ -87964364,87964367,TK -87964368,87964371,TO -87964372,87964375,TT -87964376,87964379,TC -87964380,87964383,TV -87964384,87964387,UY -87964388,87964403,US -87964404,87964407,DE -87964408,87964447,US -87964448,87964451,CA -87964452,87964455,GB -87964456,87964491,US -87964492,87964495,VU -87964496,87964499,VE -87964500,87964671,US -87964672,87964675,CZ -87964676,87964679,AD -87964680,87964683,AO -87964684,87964687,AM -87964688,87964691,AZ -87964692,87964695,BH -87964696,87964699,BD -87964700,87964703,BY -87964704,87964707,BJ -87964708,87964711,BT -87964712,87964715,BA -87964716,87964719,BW -87964720,87964723,BN -87964724,87964727,BG -87964728,87964731,BF -87964732,87964735,BI -87964736,87964739,KH -87964740,87964743,CM -87964744,87964747,CV -87964748,87964751,CF -87964752,87964755,TD -87964756,87964759,CN -87964760,87964763,CX -87964764,87964767,CC -87964768,87964771,KM -87964772,87964775,CD -87964776,87964779,CI -87964780,87964783,CY -87964784,87964787,EG -87964788,87964791,GQ -87964792,87964795,ER -87964796,87964799,EE -87964800,87964803,ET -87964804,87964807,FO -87964808,87964811,GA -87964812,87964815,GM -87964816,87964819,GE -87964820,87964823,GH -87964824,87964827,GI -87964828,87964831,GR -87964832,87964835,GL -87964836,87964839,GU -87964840,87964843,GW -87964844,87964847,GN -87964848,87964851,IR -87964852,87964855,IQ -87964856,87964859,IE -87964860,87964863,JO -87964864,87964867,KZ -87964868,87964871,KE -87964872,87964875,KW -87964876,87964879,KG -87964880,87964883,LA -87964884,87964887,LV -87964888,87964891,LB -87964892,87964895,LS -87964896,87964899,LR -87964900,87964903,LY -87964904,87964907,LI -87964908,87964911,LT -87964912,87964915,MO -87964916,87964919,MK -87964920,87964923,MG -87964924,87964927,MW -87964928,87964931,MV -87964932,87964935,ML -87964936,87964936,MN -87964937,87964939,MT -87964940,87964943,MR -87964944,87964947,MU -87964948,87964951,MD -87964952,87964955,MC -87964956,87964959,MN -87964960,87964963,ME -87964964,87964967,MA -87964968,87964971,MZ -87964972,87964975,MM -87964976,87964979,NA -87964980,87964983,NP -87964984,87964987,NE -87964988,87964991,NG -87964992,87964995,CZ -87964996,87964999,OM -87965000,87965003,PK -87965004,87965007,PW -87965008,87965011,PS -87965012,87965015,PG -87965016,87965019,PH -87965020,87965023,QA -87965024,87965027,DJ -87965028,87965031,CG -87965032,87965035,RO -87965036,87965039,RW -87965040,87965043,SH -87965044,87965047,SM -87965048,87965051,ST -87965052,87965055,SA -87965056,87965059,SN -87965060,87965063,RS -87965064,87965067,SL -87965068,87965071,SK -87965072,87965075,SI -87965076,87965079,SO -87965080,87965083,LK -87965084,87965087,SD -87965088,87965091,SJ -87965092,87965095,SY -87965096,87965099,TJ -87965100,87965103,TZ -87965104,87965107,TH -87965108,87965111,TG -87965112,87965115,TN -87965116,87965119,TM -87965120,87965123,UG -87965124,87965127,UA -87965128,87965131,AE -87965132,87965135,UZ -87965136,87965139,VA -87965140,87965143,VN -87965144,87965147,YE -87965148,87965151,ZM -87965152,87965155,ZW -87965156,87965159,HR -87965160,87965160,MN -87965161,87965163,IL -87965164,87965167,AF -87965168,87965171,AL -87965172,87965175,DZ -87965176,87965179,AX -87965180,87965183,MN -87965184,87965187,GB -87965188,87965191,AD -87965192,87965195,AO -87965196,87965199,AM -87965200,87965203,AZ -87965204,87965207,BH -87965208,87965211,BD -87965212,87965215,BY -87965216,87965219,BJ -87965220,87965223,BT -87965224,87965227,BA -87965228,87965231,BW -87965232,87965235,BN -87965236,87965239,BG -87965240,87965243,BF -87965244,87965247,BI -87965248,87965251,KH -87965252,87965255,CM -87965256,87965259,CV -87965260,87965263,CF -87965264,87965267,TD -87965268,87965271,CX -87965272,87965275,CC -87965276,87965279,KM -87965280,87965283,CD -87965284,87965287,CI -87965288,87965291,CY -87965292,87965295,EG -87965296,87965299,GQ -87965300,87965303,ER -87965304,87965307,EE -87965308,87965311,ET -87965312,87965315,FO -87965316,87965319,GA -87965320,87965323,GM -87965324,87965327,GE -87965328,87965331,GH -87965332,87965335,GI -87965336,87965339,GR -87965340,87965343,GL -87965344,87965347,GW -87965348,87965351,GN -87965352,87965355,IR -87965356,87965359,IQ -87965360,87965363,IE -87965364,87965367,JO -87965368,87965371,KZ -87965372,87965375,KE -87965376,87965379,KW -87965380,87965383,KG -87965384,87965387,LA -87965388,87965391,LV -87965392,87965395,LB -87965396,87965399,LS -87965400,87965403,LR -87965404,87965407,LY -87965408,87965411,LI -87965412,87965415,LT -87965416,87965419,MO -87965420,87965423,MK -87965424,87965427,MG -87965428,87965431,MW -87965432,87965435,MV -87965436,87965439,ML -87965440,87965443,MT -87965444,87965447,MR -87965448,87965451,MU -87965452,87965455,MD -87965456,87965459,MC -87965460,87965463,MN -87965464,87965467,ME -87965468,87965471,MA -87965472,87965475,MZ -87965476,87965479,MM -87965480,87965483,NA -87965484,87965487,NP -87965488,87965491,NE -87965492,87965495,NG -87965496,87965499,OM -87965500,87965503,PK -87965504,87965507,PS -87965508,87965511,QA -87965512,87965515,DJ -87965516,87965519,CG -87965520,87965523,RO -87965524,87965527,RW -87965528,87965531,SH -87965532,87965535,PM -87965536,87965539,SM -87965540,87965543,ST -87965544,87965547,SA -87965548,87965551,SN -87965552,87965555,RS -87965556,87965559,SL -87965560,87965563,SK -87965564,87965567,SI -87965568,87965571,SO -87965572,87965575,LK -87965576,87965579,SD -87965580,87965583,SJ -87965584,87965587,SY -87965588,87965591,TJ -87965592,87965595,TZ -87965596,87965599,TH -87965600,87965603,TG -87965604,87965607,TN -87965608,87965611,TM -87965612,87965615,UG -87965616,87965619,PT -87965620,87965623,US -87965624,87965627,UA -87965628,87965631,AE -87965632,87965635,UZ -87965636,87965639,VA -87965640,87965643,VN -87965644,87965647,YE -87965648,87965651,ZM -87965652,87965655,ZW -87965656,87965659,PT -87965660,87965663,US -87965664,87965667,HR -87965668,87965671,IL -87965672,87965675,AF -87965676,87965679,AL -87965680,87965683,DZ -87965684,87965687,AX -87965688,87965691,IN -87965692,87965695,GB -87965696,87967743,DE -87967744,87969791,IT -87969792,87970815,IM -87970816,87971071,GG -87971072,87971839,IM -87971840,87972863,IE -87972864,87973375,GI -87973376,87973887,IM -87973888,87981567,DE -87981568,87982079,TR -87982080,87988223,IQ -87988224,87988479,RU -87988480,87988735,US -87988736,87988863,LV -87988864,87989247,RU -87989248,87989503,US -87989504,87989759,FR -87989760,87990015,US -87990016,87990271,DE -87990272,88014847,IR -88014848,88016895,LY -88016896,88018943,IR -88018944,88020991,GB -88020992,88023039,FR -88023040,88031231,TR -88031232,88047615,KZ -88047616,88049663,RU -88049664,88051711,IT -88051712,88053759,GB -88053760,88055807,RU -88055808,88057855,AM -88057856,88059903,IT -88059904,88061951,DE -88061952,88063999,PL -88064000,88080383,HU -88080384,88604671,GB -88604672,88866815,IR -88866816,88932351,KZ -88932352,88940543,RU -88940544,88948735,GB -88948736,88965119,IT -88965120,88997887,AM -88997888,89063423,IR -89063424,89079807,GB -89079808,89096191,NL -89096192,89128959,RU -89128960,89260031,GB -89260032,89325567,SA -89325568,89327615,NL -89327616,89329663,GB -89329664,89331711,UA -89331712,89333759,DK -89333760,89337855,RO -89337856,89339903,ES -89339904,89341951,FI -89341952,89350143,ES -89350144,89352191,GB -89352192,89354239,IT -89354240,89356287,AE -89356288,89358335,IT -89358336,89374719,DE -89374720,89382911,GB -89382912,89384959,NO -89384960,89387007,FR -89387008,89391103,IE -89391104,90439679,IT -90439680,90456063,DE -90456064,90472447,RU -90472448,90476543,DE -90476544,90478591,FR -90478592,90480639,VG -90480640,90482687,YE -90482688,90484735,GB -90484736,90488831,NO -90488832,90497023,BY -90497024,90499071,NL -90499072,90501119,IT -90503168,90505215,IL -90505216,90516479,RU -90516480,90516735,DE -90516736,90516991,RO -90516992,90517503,FR -90517504,90518527,US -90518528,90520575,KZ -90520576,90528767,RU -90528768,90533887,NL -90533888,90537983,EE -90537984,90540031,RU -90540032,90544127,GB -90544128,90546175,RU -90546176,90548223,DE -90548224,90550271,GB -90550272,90554367,EE -90554368,90558463,RU -90558464,90560511,UA -90560512,90560767,RU -90560768,90560895,UZ -90560896,90561023,BG -90561024,90561151,RU -90561152,90561279,NI -90561280,90561407,TH -90561408,90561535,GR -90561536,90561663,GE -90561664,90561791,LV -90561792,90561919,CY -90561920,90562047,CU -90562048,90562175,AM -90562176,90562303,QA -90562304,90570751,RU -90570752,90578943,IT -90583040,90587135,CZ -90587136,90589183,PL -90589184,90591231,FR -90591232,90595327,GB -90595328,90603519,PS -90603520,90605567,ES -90605568,90607615,NL -90607616,90609663,CH -90609664,90611711,RU -90611712,90613759,DE -90613760,90615807,GB -90615808,90617855,BA -90617856,90619903,GB -90619904,90636287,IL -90636288,90701823,DK -90701824,90705919,TR -90705920,90707967,CZ -90707968,90710015,IT -90710016,90718207,UA -90718208,90718719,DE -90718720,90719231,FR -90719232,90719487,AT -90719488,90719999,SE -90720000,90720255,GB -90722304,90724351,FI -90724352,90726399,CH -90726400,90728447,FR -90728448,90730495,DE -90730496,90734591,NL -90734592,90736639,SY -90736640,90738687,NL -90738688,90742271,DE -90742272,90742783,RO -90742784,90750975,BG -90750976,90753023,FR -90753024,90755071,RU -90755072,90757119,IR -90757120,90759167,AT -90759168,90761215,NL -90761216,90763263,KZ -90763264,90763519,IL -90763520,90763775,US -90763776,90764287,IL -90764288,90764799,US -90764800,90765311,IL -90765312,90767359,PL -90767360,90832895,UA -90832896,90898431,IR -90898432,90963967,AE -90963968,91226111,SA -91226112,92274687,IR -92274688,92536831,RU -92536832,92569599,NL -92569600,92569855,SI -92569856,92570111,FR -92570112,92570367,DE -92570368,92570623,GB -92570624,92570879,IE -92570880,92571135,GB -92571136,92571391,SK -92571392,92571647,BG -92571648,92571903,DE -92571904,92572159,AT -92572160,92572415,IT -92572416,92572927,RU -92572928,92573183,CH -92573184,92573439,CZ -92573440,92573695,IT -92573696,92573951,AT -92573952,92574207,ES -92574208,92574463,PL -92574464,92574719,PT -92574720,92574975,UA -92574976,92575231,LU -92575232,92575487,HU -92575488,92575999,TR -92576000,92576255,RS -92576256,92576511,AE -92576512,92576767,DE -92576768,92577023,CH -92577024,92577535,DE -92577536,92585983,AT -92585984,92602367,SA -92602368,92604415,BA -92604416,92606463,PL -92606464,92608511,GB -92608512,92610559,PS -92610560,92612607,CH -92612608,92614655,GB -92614656,92618751,IT -92635136,92643327,BA -92643328,92645375,GE -92645376,92651519,GB -92651520,92654591,SE -92654592,92654623,US -92654624,92654847,SE -92654848,92654879,US -92654880,92655039,SE -92655040,92655071,NL -92655072,92655103,SE -92655104,92655135,US -92655136,92655295,SE -92655296,92655327,NL -92655328,92655359,SE -92655360,92655391,US -92655392,92655615,SE -92655616,92655647,US -92655648,92655727,SE -92655728,92655743,NL -92655744,92655871,SE -92655872,92655903,US -92655904,92655999,SE -92656000,92656015,NL -92656016,92656127,SE -92656128,92656159,US -92656160,92656223,SE -92656224,92656239,NL -92656240,92656383,SE -92656384,92656415,US -92656416,92656591,SE -92656592,92656607,NL -92656608,92656639,SE -92656640,92656671,US -92656672,92656783,SE -92656784,92656799,NL -92656800,92656895,SE -92656896,92656927,US -92656928,92657103,SE -92657104,92657119,NL -92657120,92657151,SE -92657152,92657183,US -92657184,92657279,SE -92657280,92657295,NL -92657296,92657407,SE -92657408,92657439,US -92657440,92657631,SE -92657632,92657663,NL -92657664,92657695,US -92657696,92657775,SE -92657776,92657823,NL -92657824,92657919,SE -92657920,92657951,US -92657952,92658111,SE -92658112,92658127,NL -92658128,92658175,SE -92658176,92658207,US -92658208,92658303,SE -92658304,92658319,NL -92658320,92658431,SE -92658432,92658463,US -92658464,92658575,SE -92658576,92658591,NL -92658592,92658687,SE -92658688,92658719,US -92658720,92658847,SE -92658848,92658879,NL -92658880,92658943,SE -92658944,92658975,US -92658976,92659055,SE -92659056,92659103,NL -92659104,92659199,SE -92659200,92659231,US -92659232,92659295,SE -92659296,92659311,NL -92659312,92659455,SE -92659456,92659471,US -92659472,92659631,SE -92659632,92659647,NL -92659648,92659711,SE -92659712,92663807,AZ -92663808,92665855,GB -92665856,92667903,PL -92667904,92669951,BE -92669952,92671999,GB -92672000,92674047,DE -92674048,92676095,CH -92676096,92680191,ES -92680192,92684287,AZ -92684288,92688383,PL -92688384,92690431,AM -92690432,92692479,IE -92692480,92694527,FR -92694528,92696575,RS -92696576,92698623,ES -92698624,92700671,IT -92700672,92719103,IR -92719104,92721151,SY -92721152,92723199,PL -92723200,92725247,RU -92725248,92733439,SY -92733440,92733931,FR -92733932,92733935,ES -92733936,92734639,FR -92734640,92734655,ES -92734656,92734735,FR -92734736,92734739,DE -92734740,92734831,FR -92734832,92734847,ES -92734848,92735103,FR -92735104,92735119,GB -92735120,92735347,FR -92735348,92735351,GB -92735352,92735615,FR -92735616,92735616,DE -92735617,92735619,FR -92735620,92735623,ES -92735624,92735823,FR -92735824,92735827,ES -92735828,92735875,FR -92735876,92735876,DE -92735877,92735999,FR -92736000,92736255,GB -92736256,92736479,FR -92736480,92736480,DE -92736481,92736487,FR -92736488,92736491,ES -92736492,92736607,FR -92736608,92736639,PT -92736640,92737151,FR -92737152,92737183,NL -92737184,92737199,FR -92737200,92737215,PL -92737216,92737611,FR -92737612,92737615,GB -92737616,92737887,FR -92737888,92737903,IT -92737904,92738071,FR -92738072,92738075,DE -92738076,92738239,FR -92738240,92738271,GB -92738272,92738659,FR -92738660,92738679,ES -92738680,92738783,FR -92738784,92738815,GB -92738816,92739199,FR -92739200,92739215,DE -92739216,92739351,FR -92739352,92739355,PL -92739356,92739403,FR -92739404,92739407,IE -92739408,92740415,FR -92740416,92740431,NL -92740432,92740611,FR -92740612,92740615,CZ -92740616,92740639,FR -92740640,92740671,ES -92740672,92740915,FR -92740916,92740923,DE -92740924,92741331,FR -92741332,92741335,ES -92741336,92742419,FR -92742420,92742423,ES -92742424,92742607,FR -92742608,92742623,BE -92742624,92742771,FR -92742772,92742775,ES -92742776,92742815,FR -92742816,92742819,ES -92742820,92743343,FR -92743344,92743351,GB -92743352,92743679,FR -92743680,92743935,ES -92743936,92744103,FR -92744104,92744111,ES -92744112,92744123,FR -92744124,92744127,GB -92744128,92744319,FR -92744320,92744323,GB -92744324,92744551,FR -92744552,92744555,ES -92744556,92744951,FR -92744952,92744959,ES -92744960,92745071,FR -92745072,92745087,ES -92745088,92745207,FR -92745208,92745215,ES -92745216,92745395,FR -92745396,92745399,GB -92745400,92745663,FR -92745664,92745695,PL -92745696,92746415,FR -92746416,92746431,ES -92746432,92746559,FR -92746560,92746623,IT -92746624,92747043,FR -92747044,92747047,CH -92747048,92747231,FR -92747232,92747247,PL -92747248,92747547,FR -92747548,92747567,ES -92747568,92747711,FR -92747712,92747775,GB -92747776,92748516,FR -92748517,92748517,BE -92748518,92748543,FR -92748544,92748799,PT -92748800,92748843,FR -92748844,92748847,GB -92748848,92748863,FR -92748864,92748879,ES -92748880,92748983,FR -92748984,92748991,GB -92748992,92748999,ES -92749000,92749007,PT -92749008,92749011,FR -92749012,92749015,ES -92749016,92749023,FR -92749024,92749039,FI -92749040,92749055,IE -92749056,92749067,FR -92749068,92749071,GB -92749072,92749135,FR -92749136,92749151,FI -92749152,92749471,FR -92749472,92749487,PL -92749488,92749747,FR -92749748,92749751,ES -92749752,92750639,FR -92750640,92750643,ES -92750644,92750911,FR -92750912,92750943,PT -92750944,92751243,FR -92751244,92751247,ES -92751248,92751383,FR -92751384,92751391,ES -92751392,92751487,FR -92751488,92751615,IE -92751616,92751711,FR -92751712,92751712,DE -92751713,92751807,FR -92751808,92751871,NL -92751872,92752031,FR -92752032,92752063,FI -92752064,92753079,FR -92753080,92753087,ES -92753088,92753215,FR -92753216,92753279,PT -92753280,92753647,FR -92753648,92753663,ES -92753664,92754031,FR -92754032,92754047,PT -92754048,92754367,FR -92754368,92754431,GB -92754432,92754447,FR -92754448,92754463,GB -92754464,92754551,FR -92754552,92754555,DE -92754556,92754579,FR -92754580,92754583,ES -92754584,92755135,FR -92755136,92755199,PT -92755200,92755439,FR -92755440,92755455,GB -92755456,92755743,FR -92755744,92755775,FI -92755776,92755839,GB -92755840,92757311,FR -92757312,92757375,ES -92757376,92758207,FR -92758208,92758223,ES -92758224,92758367,FR -92758368,92758383,ES -92758384,92758915,FR -92758916,92758919,GB -92758920,92759263,FR -92759264,92759279,ES -92759280,92759287,FR -92759288,92759295,ES -92759296,92760159,FR -92760160,92760191,DE -92760192,92760255,CZ -92760256,92760323,FR -92760324,92760327,DE -92760328,92760607,FR -92760608,92760639,GB -92760640,92760671,LT -92760672,92761151,FR -92761152,92761215,PT -92761216,92761375,FR -92761376,92761391,FI -92761392,92762055,FR -92762056,92762059,GB -92762060,92762127,FR -92762128,92762135,ES -92762136,92762279,FR -92762280,92762283,GB -92762284,92762383,FR -92762384,92762391,ES -92762392,92762719,FR -92762720,92762751,PT -92762752,92762783,BE -92762784,92762863,FR -92762864,92762879,IT -92762880,92763103,FR -92763104,92763119,CZ -92763120,92763127,FR -92763128,92763135,ES -92763136,92763391,FR -92763392,92763519,IE -92763520,92764223,FR -92764224,92764287,ES -92764288,92764687,FR -92764688,92764703,ES -92764704,92764863,FR -92764864,92764879,ES -92764880,92764911,FR -92764912,92764927,GB -92764928,92765423,FR -92765424,92765427,GB -92765428,92766015,FR -92766016,92766047,ES -92766048,92776671,FR -92776672,92776703,PL -92776704,92776895,FR -92776896,92776959,NL -92776960,92777055,FR -92777056,92777087,DE -92777088,92777855,FR -92777856,92777983,GB -92777984,92778431,FR -92778432,92778495,ES -92778496,92782335,FR -92782336,92782457,RU -92782458,92782458,FR -92782459,92782528,RU -92782529,92782529,FR -92782530,92782591,RU -92782592,92782623,FR -92782624,92782655,PL -92782656,92782687,FR -92782688,92782719,ES -92782720,92782815,FR -92782816,92782847,CZ -92782848,92782879,NL -92782880,92783155,FR -92783156,92783159,GB -92783160,92783291,FR -92783292,92783295,DE -92783296,92783359,FR -92783360,92783423,ES -92783424,92783543,FR -92783544,92783547,ES -92783548,92783871,FR -92783872,92783887,PL -92783888,92784239,FR -92784240,92784243,DE -92784244,92784255,FR -92784256,92784263,NL -92784264,92784319,FR -92784320,92784351,NL -92784352,92784667,FR -92784668,92784671,IE -92784672,92784687,LT -92784688,92784703,FI -92784704,92784895,FR -92784896,92784959,ES -92784960,92785183,FR -92785184,92785199,ES -92785200,92785363,FR -92785364,92785367,PT -92785368,92785407,FR -92785408,92785439,ES -92785440,92785455,DE -92785456,92785611,FR -92785612,92785615,ES -92785616,92785735,FR -92785736,92785739,DE -92785740,92785791,FR -92785792,92785823,CZ -92785824,92786175,FR -92786176,92786179,GB -92786180,92786239,FR -92786240,92786255,FI -92786256,92786295,FR -92786296,92786299,GB -92786300,92786415,FR -92786416,92786419,GB -92786420,92786527,FR -92786528,92786535,ES -92786536,92786827,FR -92786828,92786831,IT -92786832,92786911,FR -92786912,92786927,ES -92786928,92787199,FR -92787200,92787203,FI -92787204,92787251,FR -92787252,92787255,ES -92787256,92787567,FR -92787568,92787583,IT -92787584,92787707,FR -92787708,92787711,FI -92787712,92788095,FR -92788096,92788127,DE -92788128,92788131,FI -92788132,92788399,FR -92788400,92788415,FI -92788416,92788447,FR -92788448,92788479,BE -92788480,92788495,FI -92788496,92789119,FR -92789120,92789183,ES -92789184,92789255,FR -92789256,92789259,GB -92789260,92789463,FR -92789464,92789471,IT -92789472,92789703,FR -92789704,92789707,DE -92789708,92790271,FR -92790272,92790275,DE -92790276,92790279,FR -92790280,92790283,IE -92790284,92790671,FR -92790672,92790679,ES -92790680,92791903,FR -92791904,92791935,PT -92791936,92792415,FR -92792416,92792431,ES -92792432,92792671,FR -92792672,92792675,GB -92792676,92792679,NL -92792680,92793023,FR -92793024,92793055,DE -92793056,92793087,ES -92793088,92793327,FR -92793328,92793331,PL -92793332,92794227,FR -92794228,92794231,PT -92794232,92794239,ES -92794240,92794335,FR -92794336,92794367,NL -92794368,92794691,FR -92794692,92794695,ES -92794696,92795195,FR -92795196,92795199,BE -92795200,92795631,FR -92795632,92795639,CZ -92795640,92796499,FR -92796500,92796503,PL -92796504,92796575,FR -92796576,92796579,GB -92796580,92796687,FR -92796688,92796691,DE -92796692,92796879,FR -92796880,92796895,FI -92796896,92796911,GB -92796912,92797163,FR -92797164,92797167,PT -92797168,92797355,FR -92797356,92797359,DE -92797360,92797567,FR -92797568,92797599,PT -92797600,92797679,FR -92797680,92797695,FI -92797696,92798211,FR -92798212,92798215,PL -92798216,92798255,FR -92798256,92798271,LT -92798272,92798591,FR -92798592,92798623,PT -92798624,92798975,FR -92798976,93323263,RU -93323264,93335551,CH -93335552,93339647,IL -93339648,93343743,RU -93343744,93347839,GB -93347840,93356031,RU -93356032,93358079,IR -93358080,93360127,FR -93360128,93362175,ES -93362176,93364223,GB -93364224,93368319,IT -93368320,93370367,GB -93370368,93372415,IT -93372416,93388799,GR -93388800,93415423,CH -93415424,93417471,CZ -93417472,93419519,IR -93419520,93421567,IT -93421568,93425663,DE -93425664,93426183,SE -93426184,93426687,US -93426688,93427711,DE -93427712,93429759,NO -93429760,93431807,RU -93431808,93433855,ES -93433856,93437951,DE -93437952,93454335,RU -93454336,93585407,DE -93585408,93626367,GB -93626368,93634559,CH -93634560,93650943,HU -93650944,93652991,CH -93652992,93655039,GB -93655040,93667327,CH -93667328,93675519,BA -93675520,93679615,IQ -93679616,93681663,LU -93681664,93683711,UA -93683712,93685759,AT -93685760,93687807,BE -93687808,93691903,RU -93691904,93693951,PL -93693952,93695999,IE -93696000,93700095,FR -93700096,93702143,PL -93702144,93704191,RU -93704192,93708287,UA -93708288,93712383,DE -93712384,93714431,HU -93714432,93714943,NL -93714944,93715455,GB -93715456,93715967,CA -93715968,93716479,NL -93716480,93749247,GB -93749248,93753343,IT -93753344,93756415,GB -93756416,93757439,FR -93757440,93765631,GB -93765632,93774847,SE -93774848,93775871,NO -93775872,93782015,SE -93782016,93836287,GB -93836288,93836799,NL -93836800,93842351,GB -93842352,93842359,NL -93842360,93847551,GB -93847552,93880319,GE -93880320,93888511,IT -93888512,93890559,PL -93890560,93892607,ES -93892608,93892863,GB -93892864,93893119,HK -93893120,93893375,NL -93893376,93893631,US -93893632,93893887,AU -93893888,93896703,US -93896704,93904895,GB -93904896,93906943,LV -93906944,93908991,BA -93908992,93911039,IT -93911040,93913087,AE -93913088,93929471,NL -93929472,93939711,GB -93939712,93941759,NO -93941760,93945855,CH -93945856,93962239,UA -93962240,93972479,GB -93972480,93973247,SE -93973248,93973503,GB -93973504,93973759,SE -93973760,93974015,PL -93974016,93974527,SE -93974528,93976575,CH -93976576,93978623,GB -93978624,94011391,ES -94011392,94015487,GB -94015488,94021631,DE -94021632,94022143,BA -94022144,94027263,RO -94027264,94027775,MD -94027776,94035967,IT -94035968,94036991,RO -94036992,94037503,BA -94037504,94041087,RO -94041088,94042111,SE -94042112,94043135,BA -94043136,94044159,RO -94044160,94109695,SY -94109696,94175231,SA -94175232,94175487,SE -94175488,94175743,CZ -94175744,94177535,SE -94177536,94177791,IT -94177792,94178047,DK -94178048,94178303,SE -94178304,94178559,IE -94178560,94180351,SE -94180352,94180607,PT -94180608,94181631,SE -94181632,94181887,CZ -94181888,94182399,SE -94182400,94182655,GB -94182656,94183423,SE -94183424,94183597,RU -94183598,94183598,IL -94183599,94183935,RU -94183936,94184191,SE -94184192,94184447,RU -94184448,94186239,SE -94186240,94186495,IT -94186496,94186751,SE -94186752,94187263,GB -94187264,94187775,SE -94187776,94188031,NO -94188032,94188287,SE -94188288,94188543,FR -94188544,94189311,SE -94189312,94189567,IE -94189568,94191615,SE -94191616,94193663,GB -94193664,94195711,SI -94195712,94199807,NL -94199808,94207999,IT -94208000,94240767,RO -94240768,94257151,PT -94257152,94261247,IT -94261248,94263295,ES -94263296,94265343,GB -94265344,94273535,RU -94273536,94289919,DE -94289920,94291967,NO -94291968,94294015,FR -94294016,94296063,GB -94296064,94298111,ES -94298112,94300159,GB -94300160,94302207,RU -94302208,94306303,FR -94306304,94308351,AT -94308352,94310399,ES -94310400,94312447,GE -94312448,94314495,DE -94314496,94316543,NL -94316544,94318591,IE -94318592,94320639,IR -94320640,94330879,DE -94330880,94337023,RU -94337024,94339071,GB -94339072,94355455,ES -94355456,94357503,NL -94357504,94361599,GB -94361600,94363647,LU -94363648,94365695,GB -94365696,94367743,HU -94367744,94369791,ES -94369792,94371839,TR -94371840,94502911,IR -94502912,94568447,OM -94568448,94633983,SA -94633984,94896127,RU -94896128,94931351,IT -94931352,94931352,SM -94931353,95158271,IT -95158272,95166463,RU -95166464,95168511,RS -95168512,95170559,NL -95170560,95174655,GB -95174656,95191039,IT -95191040,95195135,CH -95195136,95197183,SE -95197184,95203327,GB -95205376,95207423,PL -95207424,95211519,GR -95211520,95213567,IT -95213568,95215615,NL -95215616,95354879,PL -95354880,95363071,DE -95363072,95365119,IT -95365120,95367167,ES -95367168,95369215,IT -95369216,95371263,GB -95371264,95374591,IT -95375360,95377407,NL -95377408,95387647,RU -95387648,95387903,GB -95387904,95388927,DE -95388928,95389183,AU -95389184,95389695,DE -95389696,95389951,GB -95389952,95390207,US -95390208,95391231,DE -95391232,95391487,AE -95391488,95391999,RU -95392000,95393023,DE -95393024,95393151,GB -95393152,95393279,RS -95393280,95393407,GB -95393408,95393535,AE -95393536,95393663,DE -95393664,95393791,QA -95393792,95394047,GB -95394048,95394175,AU -95394176,95394303,DE -95394304,95395327,AU -95395328,95395455,GB -95395456,95395583,DE -95395584,95395839,GB -95395840,95398399,DE -95398400,95398655,GB -95398656,95398911,US -95398912,95399423,DE -95399424,95399679,US -95399680,95399695,DE -95399696,95399807,US -95399808,95399951,DE -95399952,95400063,CA -95400064,95400207,DE -95400208,95400319,US -95400320,95400447,DE -95400448,95400703,GB -95400704,95400719,DE -95400720,95400831,US -95400832,95400975,DE -95400976,95401087,US -95401088,95401471,DE -95401472,95401727,GB -95401728,95401855,US -95401856,95401903,DE -95401904,95401911,AT -95401912,95401983,DE -95401984,95402111,GB -95402112,95402239,KW -95402240,95402495,DE -95402496,95402623,GB -95402624,95402695,US -95402696,95402703,HR -95402704,95402719,DE -95402720,95402751,US -95402752,95403007,DE -95403008,95403135,US -95403136,95403183,DE -95403184,95403191,BE -95403192,95403263,DE -95403264,95403391,US -95403392,95403519,DE -95403520,95403775,GB -95403776,95404031,US -95404032,95404799,DE -95404800,95405055,GB -95405056,95405311,DE -95405312,95405439,US -95405440,95405567,DE -95405568,95405823,GB -95405824,95405951,US -95405952,95406335,DE -95406336,95407103,GB -95407104,95407359,DE -95407360,95407871,US -95407872,95407999,DE -95408000,95408127,US -95408128,95408255,DE -95408256,95408383,US -95408384,95408511,DE -95408512,95408639,US -95408640,95409151,GB -95409152,95409279,DE -95409280,95409407,US -95409408,95410175,DE -95410176,95410431,US -95410432,95410447,CH -95410448,95410559,DE -95410560,95410943,GB -95410944,95411199,DE -95411200,95411215,NL -95411216,95416831,DE -95416832,95417087,GB -95417088,95420173,DE -95420174,95420174,US -95420175,95420415,DE -95420416,95551487,TR -95551488,95555583,AZ -95555584,95557631,GB -95557632,95559679,RU -95559680,95561727,NL -95561728,95563007,IT -95563008,95563263,GB -95563264,95563775,IT -95563776,95567871,SK -95567872,95569919,NL -95569920,95571967,SE -95571968,95574015,RU -95574016,95576063,IT -95576064,95578624,GB -95578625,95578879,US -95578880,95580159,GB -95580160,95582207,NL -95582208,95584255,IT -95584256,95604735,GE -95604736,95608831,RU -95608832,95617023,GE -95617024,95625215,LV -95625216,95635455,IE -95635456,95637503,GB -95637504,95641599,DK -95641600,95645695,GB -95645696,95647743,SE -95647744,95649791,FR -95649792,95666175,IT -95666176,95668223,FR -95668224,95682559,DE -95944704,96075775,PL -96075776,96141311,DK -96141312,96143359,DE -96143360,96145407,GE -96145408,96149503,GB -96149504,96151551,ES -96151552,96153599,RU -96153600,96155647,PL -96155648,96157695,CH -96157696,96165887,RU -96165888,96174079,GP -96174080,96206847,HU -96206848,96209407,RU -96209408,96209919,HR -96209920,96210943,NL -96210944,96214015,EE -96214016,96222463,RU -96222464,96222719,UA -96222720,96223231,RU -96223232,96224255,KZ -96224256,96228863,RU -96228864,96229119,IE -96229120,96229375,RU -96229376,96230399,NL -96230400,96235519,RU -96235520,96236543,GB -96236544,96241663,RU -96241664,96241919,UA -96241920,96245759,RU -96245760,96246783,KZ -96246784,96247807,RU -96247808,96248831,NL -96248832,96250879,RU -96250880,96251903,UA -96251904,96252159,DE -96252160,96252415,ES -96252416,96252671,FR -96252672,96252927,NL -96252928,96255999,RU -96256000,96257023,US -96257024,96259327,RU -96259328,96259583,RO -96259584,96259839,US -96259840,96262143,RU -96262144,96262399,NL -96262400,96264191,RU -96264192,96265215,NL -96265216,96266239,RU -96266240,96266495,NL -96266496,96266751,RU -96266752,96267007,NL -96267008,96268287,RU -96268288,96272383,KZ -96272384,96305151,RU -96305152,96321535,DE -96321536,96323583,RU -96323584,96323711,ZA -96323712,96323839,KR -96323840,96323967,EG -96323968,96324095,ID -96324096,96324223,PK -96324224,96324351,VN -96324352,96324479,SG -96324480,96324607,US -96324608,96324735,IR -96324736,96324863,US -96324864,96324991,CA -96324992,96325119,FR -96325120,96325247,US -96325248,96325375,FI -96325376,96325503,US -96325504,96325631,SE -96325632,96327679,RU -96327680,96327935,NL -96327936,96328191,RO -96328192,96328447,US -96328448,96328703,DE -96328704,96329727,UA -96329728,96333823,GB -96333824,96336895,RU -96336896,96337151,CZ -96337152,96337663,NL -96337664,96337919,US -96337920,96403455,IR -96403456,96468991,AZ -96468992,96731135,AE -96731136,96736399,FR -96736400,96736400,ES -96736401,96739479,FR -96739480,96739483,DE -96739484,96739583,FR -96739584,96739587,PT -96739588,96739807,FR -96739808,96739839,NL -96739840,96740302,FR -96740303,96740303,IT -96740304,96740431,FR -96740432,96740447,PL -96740448,96741039,FR -96741040,96741043,PT -96741044,96741351,FR -96741352,96741359,LT -96741360,96741375,FR -96741376,96741391,GB -96741392,96741839,FR -96741840,96741843,DE -96741844,96742815,FR -96742816,96742831,NL -96742832,96743951,FR -96743952,96743967,GB -96743968,96744015,FR -96744016,96744031,BE -96744032,96744319,FR -96744320,96744335,PT -96744336,96744467,FR -96744468,96744471,DE -96744472,96744559,FR -96744560,96744567,ES -96744568,96745071,FR -96745072,96745087,GB -96745088,96745231,FR -96745232,96745247,GB -96745248,96746867,FR -96746868,96746871,PL -96746872,96747291,FR -96747292,96747295,PT -96747296,96747323,FR -96747324,96747327,PL -96747328,96747343,FR -96747344,96747359,DE -96747360,96747407,FR -96747408,96747423,DE -96747424,96747487,FR -96747488,96747519,ES -96747520,96755815,FR -96755816,96755819,PT -96755820,96755967,FR -96755968,96755999,PT -96756000,96756071,FR -96756072,96756079,ES -96756080,96756095,GB -96756096,96756427,FR -96756428,96756431,ES -96756432,96756543,FR -96756544,96756551,ES -96756552,96757375,FR -96757376,96757379,DE -96757380,96757403,FR -96757404,96757407,NL -96757408,96757639,FR -96757640,96757643,CH -96757644,96757647,SE -96757648,96757663,FR -96757664,96757667,SE -96757668,96757883,FR -96757884,96757887,ES -96757888,96758247,FR -96758248,96758251,DE -96758252,96759735,FR -96759736,96759739,ES -96759740,96761855,FR -96761856,96761871,BE -96761872,96762799,FR -96762800,96762815,BE -96762816,96762943,FR -96762944,96763007,ES -96763008,96763163,FR -96763164,96763167,PT -96763168,96763495,FR -96763496,96763503,IT -96763504,96763551,FR -96763552,96763555,GB -96763556,96763575,FR -96763576,96763579,ES -96763580,96763935,FR -96763936,96763967,IT -96763968,96764207,FR -96764208,96764223,LT -96764224,96764239,FR -96764240,96764255,DE -96764256,96764303,FR -96764304,96764319,DE -96764320,96764383,FR -96764384,96764399,FI -96764400,96764415,CZ -96764416,96764859,FR -96764860,96764863,CZ -96764864,96765327,FR -96765328,96765335,NL -96765336,96766063,FR -96766064,96766079,ES -96766080,96766259,FR -96766260,96766263,ES -96766264,96766267,FR -96766268,96766271,ES -96766272,96767031,FR -96767032,96767035,GB -96767036,96767243,FR -96767244,96767247,DE -96767248,96767823,FR -96767824,96767839,BE -96767840,96767903,FR -96767904,96767935,PL -96767936,96768143,FR -96768144,96768151,PT -96768152,96768155,FI -96768156,96768559,FR -96768560,96768563,PL -96768564,96768603,FR -96768604,96768607,DE -96768608,96769279,FR -96769280,96769295,ES -96769296,96770159,FR -96770160,96770175,ES -96770176,96770651,FR -96770652,96770655,PL -96770656,96771239,FR -96771240,96771247,ES -96771248,96771487,FR -96771488,96771503,IE -96771504,96771615,FR -96771616,96771647,FI -96771648,96772215,FR -96772216,96772223,PT -96772224,96772407,FR -96772408,96772408,GB -96772409,96773119,FR -96773120,96773375,ES -96773376,96774631,FR -96774632,96774635,BE -96774636,96774719,FR -96774720,96774751,ES -96774752,96774911,FR -96774912,96775039,GB -96775040,96775183,FR -96775184,96775199,PT -96775200,96775231,FR -96775232,96775295,DE -96775296,96775491,FR -96775492,96775495,ES -96775496,96775551,FR -96775552,96775567,GB -96775568,96775631,FR -96775632,96775639,ES -96775640,96775975,FR -96775976,96775983,ES -96775984,96775999,FR -96776000,96776063,GB -96776064,96776127,FR -96776128,96776191,ES -96776192,96776319,FR -96776320,96776323,ES -96776324,96776511,FR -96776512,96776543,ES -96776544,96776891,FR -96776892,96776895,DE -96776896,96777023,FR -96777024,96777087,ES -96777088,96777951,FR -96777952,96777983,PL -96777984,96778015,FR -96778016,96778031,ES -96778032,96778103,FR -96778104,96778107,BE -96778108,96778167,FR -96778168,96778171,LU -96778172,96778175,PT -96778176,96778239,FR -96778240,96778243,NL -96778244,96778255,FR -96778256,96778259,NL -96778260,96778263,PL -96778264,96778859,FR -96778860,96778863,NL -96778864,96778867,CZ -96778868,96778871,BE -96778872,96779007,FR -96779008,96779011,PT -96779012,96779015,FR -96779016,96779023,ES -96779024,96779167,FR -96779168,96779199,PT -96779200,96779247,FR -96779248,96779255,CZ -96779256,96780355,FR -96780356,96780359,BE -96780360,96780815,FR -96780816,96780823,ES -96780824,96780847,FR -96780848,96780855,CZ -96780856,96781407,FR -96781408,96781423,FI -96781424,96781647,FR -96781648,96781663,IT -96781664,96781751,FR -96781752,96781759,ES -96781760,96782167,FR -96782168,96782175,ES -96782176,96782199,FR -96782200,96782207,CZ -96782208,96782911,FR -96782912,96782915,LT -96782916,96783119,FR -96783120,96783135,PT -96783136,96783299,FR -96783300,96783303,ES -96783304,96783519,FR -96783520,96783551,ES -96783552,96783771,FR -96783772,96783775,DE -96783776,96783887,FR -96783888,96783903,DE -96783904,96784031,FR -96784032,96784039,ES -96784040,96784495,FR -96784496,96784511,FI -96784512,96784719,FR -96784720,96784723,NL -96784724,96784807,FR -96784808,96784811,PL -96784812,96784827,FR -96784828,96784831,PL -96784832,96785135,FR -96785136,96785151,NL -96785152,96785183,FR -96785184,96785199,ES -96785200,96785407,FR -96785408,96785411,NL -96785412,96785415,FR -96785416,96785423,NL -96785424,96785603,FR -96785604,96785607,PT -96785608,96786431,FR -96786432,96786495,GB -96786496,96787743,FR -96787744,96787751,ES -96787752,96787999,FR -96788000,96788031,LT -96788032,96788143,FR -96788144,96788159,ES -96788160,96792283,FR -96792284,96792287,DE -96792288,96792319,FR -96792320,96792383,ES -96792384,96792447,NL -96792448,96792511,FR -96792512,96792575,IT -96792576,96792751,FR -96792752,96792767,DE -96792768,96792923,FR -96792924,96792927,PL -96792928,96793039,FR -96793040,96793047,IT -96793048,96793583,FR -96793584,96793599,DE -96793600,96793687,FR -96793688,96793688,ES -96793689,96793715,FR -96793716,96793716,ES -96793717,96794159,FR -96794160,96794175,ES -96794176,96794271,FR -96794272,96794303,PT -96794304,96794471,FR -96794472,96794479,ES -96794480,96794623,FR -96794624,96794687,CZ -96794688,96796671,FR -96796672,96862207,AZ -96862208,96894975,GB -96894976,96897023,CZ -96897024,96899071,GB -96899072,96903167,AT -96903168,96911359,IR -96911360,96919551,FR -96919552,96923647,IT -96923648,96925695,JO -96925696,96960511,GB -96960512,96964607,DE -96964608,96968703,NL -96968704,96972799,LT -96972800,96974847,DE -96976896,96985087,RU -96985088,96987135,ES -96987136,96989183,UA -96989184,96993279,DE -96993280,97001471,NL -97001472,97009663,RU -97009664,97058815,IR -97058816,97091583,PL -97091584,97189887,IR -97189888,97255423,GR -97255424,97320959,HU -97320960,97386495,ES -97386496,97419263,RU -97419264,97435647,HU -97435648,97437695,DK -97437696,97439743,AT -97439744,97444863,NL -97444864,97445887,PT -97445888,97447935,RS -97447936,97452031,PL -97452032,97517567,UA -97517568,98566143,IR -98566144,98697215,ES -98697216,98701311,FR -98701312,98705407,ES -98705408,98707455,SE -98707456,98709503,NL -98709504,98711551,IR -98711552,98713599,GB -98713600,98732031,PL -98732032,98734079,GB -98734080,98736127,CH -98736128,98738175,RU -98738176,98740223,NO -98740224,98740479,ES -98740480,98740735,US -98740736,98741247,DE -98741248,98741503,ES -98741504,98741759,US -98741760,98742271,DE -98742272,98744319,GB -98744320,98746367,ES -98746368,98762751,TR -98762752,98893823,RU -98893824,98959359,TR -98959360,98959615,DE -98959616,98959679,US -98959680,98960639,DE -98960640,98960799,US -98960800,98961407,DE -98961408,98961919,FR -98961920,98992383,DE -98992384,98992423,US -98992424,98992431,DE -98992432,98992639,US -98992640,98993151,DE -98993152,98993175,US -98993176,98993407,DE -98993408,98993663,GB -98993664,98997759,DE -98997760,98998271,FR -98998272,98998527,DE -98998528,98998783,GB -98998784,98999551,DE -98999552,99000319,GB -99000320,99001855,DE -99001856,99001871,SG -99001872,99024895,DE -99024896,99025167,GB -99025168,99025279,DE -99025280,99025407,US -99025408,99025919,DE -99025920,99025935,FI -99025936,99026047,DE -99026048,99026175,US -99026176,99026303,DE -99026304,99026431,US -99026432,99026559,DE -99026560,99026687,US -99026688,99026943,DE -99026944,99027199,GB -99027200,99027215,HR -99027216,99027455,CA -99027456,99027711,PL -99027712,99027967,DE -99027968,99027983,ES -99027984,99028095,DE -99028096,99028223,US -99028224,99028239,GB -99028240,99028351,DE -99028352,99028735,US -99028736,99028751,SE -99028752,99028863,DE -99028864,99028991,US -99028992,99029503,GB -99029504,99029519,IE -99029520,99029887,DE -99029888,99030015,US -99030016,99030143,DE -99030144,99030271,US -99030272,99030399,DE -99030400,99030527,US -99030528,99030815,DE -99030816,99030895,US -99030896,99030911,DE -99030912,99031039,US -99031040,99031295,DE -99031296,99031551,GB -99031552,99031807,CZ -99031808,99031823,GB -99031824,99031935,DE -99031936,99032063,US -99032064,99032319,DE -99032320,99032575,ES -99032576,99033343,DE -99033344,99033599,IT -99033600,99043839,DE -99043840,99043847,AT -99043848,99044111,DE -99044112,99044223,US -99044224,99044351,DE -99044352,99044359,BE -99044360,99044607,DE -99044608,99044615,HR -99044616,99044863,DE -99044864,99045119,GB -99045120,99045375,NL -99045376,99049471,DE -99049472,99049983,GB -99049984,99053055,DE -99053056,99053567,GB -99053568,99085567,DE -99085568,99085823,GB -99085824,99090431,DE -99090432,99614719,IR -99614720,99876863,SE -99876864,100139007,SA -100139008,100204543,UA -100204544,100237311,PT -100237312,100245503,IT -100245504,100246015,SE -100246016,100246271,GB -100246272,100246527,NL -100246528,100246783,DE -100246784,100247039,FR -100247040,100247551,SE -100247552,100249599,CH -100249600,100253695,SI -100253696,100261887,RU -100261888,100270079,NO -100270080,100302847,IR -100302848,100311039,KZ -100311040,100313087,FI -100313088,100315135,RU -100315136,100319231,GB -100319232,100327423,AZ -100327424,100329471,SE -100329472,100331519,RU -100331520,100335615,TR -100335616,100401151,KZ -100532224,100547839,RO -100547840,100548095,DE -100548096,100548607,US -100548608,100548872,RO -100548873,100548873,TR -100548874,100550143,RO -100550144,100550399,NL -100550400,100550655,DE -100550656,100550911,RO -100550912,100551167,NL -100551168,100551423,US -100551424,100551679,RO -100551680,100552191,US -100552192,100552447,GB -100552448,100552703,US -100552704,100552959,AT -100552960,100553215,US -100553216,100553471,DE -100553472,100553727,AT -100553728,100553983,US -100553984,100554495,DE -100554496,100554751,US -100554752,100555263,DE -100555264,100555519,US -100555520,100558847,RO -100558848,100559255,DE -100559256,100559263,EG -100559264,100559359,DE -100559360,100559871,GB -100559872,100560895,US -100560896,100561151,GB -100561152,100561407,RO -100561408,100561919,US -100561920,100562943,RO -100562944,100564223,DE -100564224,100564479,RO -100564480,100564991,US -100564992,100573183,SE -100573184,100575231,GB -100575232,100577279,DK -100577280,100579327,RU -100579328,100581375,AT -100581376,100589567,SE -100589568,100597759,RU -100597760,100598783,TR -100598784,100612095,US -100612096,100630527,NL -100630528,100632575,BE -100632576,100634623,GB -100634624,100635199,ES -100635200,100635247,BE -100635248,100635263,CH -100635264,100636671,ES -100636672,100638719,NL -100638720,100646911,UA -100646912,100647679,RU -100647680,100647711,TR -100647712,100661759,RU -100661760,100662015,US -100662016,100662143,DE -100662144,100662271,TR -100662272,100663295,RU -100663296,121195295,US -121195296,121195327,IT -121195328,134221823,US -134221824,134222079,DE -134222080,134222335,US -134222336,134222379,DE -134222380,134222380,US -134222381,134222404,DE -134222405,134222405,US -134222406,134222452,DE -134222453,134222453,US -134222454,134222476,DE -134222477,134222477,US -134222478,134222523,DE -134222524,134222524,US -134222525,134222526,DE -134222527,134222527,US -134222528,134222538,DE -134222539,134222539,US -134222540,134222556,DE -134222557,134222557,US -134222558,134222591,DE -134222592,134223871,US -134223872,134224127,GB -134224128,134224383,US -134224384,134224639,GB -134224640,134227967,US -134227968,134228223,SG -134228224,134228479,JP -134228480,134247423,US -134247424,134247424,DE -134247425,134443007,US -134443008,134445055,MP -134445056,134445823,US -134445824,134446079,GU -134446080,134738943,US -134738944,134739199,CA -134739200,135192575,US -135192576,135200767,MX -135200768,135430143,US -135430144,135430399,CA -135430400,135432191,US -135432192,135434239,CA -135434240,135441407,US -135441408,135441663,CA -135441664,135556607,US -135556608,135556863,CA -135556864,135557375,US -135557376,135557631,CA -135557632,135558399,US -135558400,135558655,NL -135558656,135603199,US -135603200,135604223,CA -135604224,135604479,US -135604480,135604735,CA -135604736,135607039,US -135607040,135607295,CA -135607296,135792639,US -135792640,135794687,CA -135794688,135925759,US -135925760,135926783,VI -135926784,135941631,US -135941632,135942143,CA -135942144,135945727,US -135945728,135945983,CA -135945984,136054015,US -136054016,136054271,GB -136054272,136175615,US -136175616,136175871,CA -136175872,136237055,US -136237056,136239103,CA -136239104,136404991,US -136404992,136407039,CA -136407040,136413183,US -136413184,136415665,CA -136415666,136415666,FR -136415667,136415743,CA -136415744,136702290,US -136702291,136702291,UM -136702292,139954241,US -139954242,139954242,ES -139954243,151521029,US -151521030,151521030,FR -151521031,151587080,US -151587081,151587081,FR -151587082,152305663,US -152305664,152338431,GB -152338432,167772159,US -184549376,185405200,US -185405201,185405201,CZ -185405202,185999659,US -185999660,185999660,FR -185999661,202182143,US -202182144,202182399,GB -202182400,204047871,US -204047872,204047999,PR -204048000,204048031,US -204048032,204048047,PR -204048048,209472767,US -209472768,209472768,IN -209472769,212791831,US -212791832,212791839,VI -212791840,213981695,US -213981696,213982207,CA -213982208,214698239,US -214698240,214698255,VI -214698256,214698303,US -214698304,214698311,VI -214698312,214777855,US -214777856,214786303,PR -214786304,214787071,US -214787072,214788095,PR -214788096,217809407,US -217809408,217809663,GB -217809664,219512063,US -219512064,219512319,GB -219512320,221642751,US -221642752,221773823,AU -221773824,222494719,US -222494720,222527487,SG -222527488,222625791,US -222625792,222658559,NL -222658560,222691327,IE -222691328,222707711,HK -222707712,222740479,AU -222740480,222756863,IE -222756864,222789631,IN -222789632,222797823,JP -222797824,222806015,CA -222806016,222871551,US -222871552,222879743,HK -222879744,222887935,AU -222887936,222896127,JP -222896128,222912511,US -222912512,222920703,AU -222920704,222937087,NL -222937088,222941183,AU -222941184,222945279,US -222945280,222947327,NL -222947328,222949375,JP -222949376,222953471,US -222953472,223019007,IE -223019008,223051775,HK -223051776,223084543,AU -223084544,223150079,SG -223150080,223166463,AU -223166464,223215615,US -223215616,223248383,JP -223248384,223281151,US -223281152,223346687,IE -223346688,223477759,NL -223477760,223805439,US -223805440,223838207,GB -223838208,223922175,US -223922176,223924223,NL -223924224,223928319,HK -223928320,223936511,CA -223936512,224198655,US -224198656,224231423,NL -224231424,224264191,US -224264192,224280575,HK -224280576,224296959,IE -224296960,224395263,NL -224395264,225050623,US -225050624,225051647,IN -225051648,225052159,SG -225052160,225052671,JP -225052672,225053183,CA -225053184,225055231,GB -225055232,225055743,JP -225055744,225060863,US -225060864,225061375,JP -225061376,225061887,CA -225061888,225062399,HK -225062400,225062911,IN -225062912,225063423,CA -225063424,225065471,US -225065472,225066495,AU -225066496,225067007,US -225067008,225068031,NL -225068032,225068543,US -225068544,225069055,IE -225069056,225070079,US -225070080,225070591,NL -225070592,225070599,PR -225070600,225070623,US -225070624,225070655,PR -225070656,225070847,US -225070848,225071103,PR -225071104,225073151,US -225073152,225073663,IE -225073664,225074687,KR -225074688,225076735,US -225076736,225077247,NL -225077248,225077759,IE -225077760,225078783,US -225078784,225079295,IE -225079296,225079807,HK -225079808,225080319,PR -225080320,225080831,US -225080832,225080895,JP -225080896,225081855,US -225081856,225082367,AU -225082368,225082879,GB -225082880,225084415,US -225084416,225085439,FR -225085440,225085951,NL -225085952,225086463,FR -225086464,225086975,NL -225086976,225087487,FR -225087488,225088511,US -225088512,225089023,SG -225089024,225089535,IE -225089536,225093631,US -225093632,225094143,SG -225094144,225094655,JP -225094656,225095167,US -225095168,225095679,IE -225095680,225096191,AU -225096192,225096703,HK -225096704,225097215,IE -225097216,225097727,JP -225097728,225098239,AU -225098240,225098751,US -225098752,225099263,JP -225099264,225099775,US -225099776,225100287,SG -225100288,225100799,AU -225100800,225101823,US -225101824,225102335,AU -225102336,225443839,US -225443840,225705983,JP -225705984,226230271,US -226230272,226361343,KR -226361344,226492415,IN -226492416,231800831,US -231800832,231866367,KR -231866368,231997439,AU -231997440,233046015,US -233046016,233177087,SG -233177088,233308159,JP -233308160,233570303,IN -233570304,233832447,AU -233832448,234487807,US -234487808,234618879,SG -234618880,234881023,US -234881024,234883071,CN -234883072,234884095,JP -234884096,234885119,CN -234885120,234889215,VN -234889216,234893311,JP -234893312,234893567,MY -234893568,234893823,KR -234893824,234894079,IN -234894080,234894335,KR -234894336,234894847,HK -234894848,234895359,SG -234895360,234895615,TW -234895616,234895871,MY -234895872,234896127,TH -234896128,234896383,MN -234896384,234896639,IN -234896640,234896895,AE -234896896,234897151,PH -234897152,234897407,IN -234897408,234913791,KR -234913792,234946559,HK -234946560,234947583,CN -234947584,234950655,JP -234950656,234951679,AU -234951680,234952703,HK -234952704,234953727,CN -234953728,234954751,US -234954752,234971135,NZ -234971136,234972159,CN -234972160,234973183,BD -234973184,234974207,PK -234974208,234975231,CN -234975232,234976255,SG -234976256,234979327,IN -234979328,235012095,MY -235012096,235077631,AU -235077632,235143167,JP -235143168,235405311,KR -235405312,235929599,JP -235929600,236978175,CN -236978176,241172479,KR -241172480,241434623,IN -241434624,241500159,SG -241500160,241565695,JP -241565696,241598463,IN -241598464,241599487,CN -241599488,241600511,JP -241600512,241602559,AU -241602560,241604607,MY -241604608,241605631,ID -241605632,241606655,CN -241606656,241607679,IN -241607680,241608703,JP -241608704,241609727,PH -241609728,241610751,US -241610752,241611775,JP -241611776,241612799,CN -241612800,241613823,HK -241613824,241614847,IN -241614848,241623039,JP -241623040,241627135,IN -241627136,241631231,HK -241631232,243269631,CN -243269632,243270655,JP -243270656,243271679,NZ -243271680,243272703,TH -243273728,243277823,JP -243277824,243286015,AU -243286016,243302399,JP -243302400,243400703,KR -243400704,243531775,CN -243531776,243662847,JP -243662848,243793919,CN -243793920,243859455,HK -243859456,243916799,AU -243916800,243924991,JP -243924992,243990527,KR -243990528,244071319,IN -244071320,244071327,LK -244071328,244318207,IN -244318208,245366783,CN -245366784,247463935,VN -247463936,247464959,IN -247464960,247467007,HK -247467008,247469055,IN -247469056,247470079,HK -247470080,247472127,IN -247472128,247476223,JP -247477248,247478271,IN -247479296,247480319,CN -247480320,247482367,MY -247482368,247483391,PG -247483392,247484415,CN -247484416,247488511,KR -247488512,247496703,JP -247496704,247504895,PK -247504896,247513087,AU -247513088,247529471,MY -247529472,247595007,JP -247595008,247726079,IN -247726080,247857151,CN -247857152,247988223,HK -247988224,248250367,AU -248250368,248381439,CN -248381440,248446975,KR -248446976,248512511,TH -248512512,249561087,CN -249561088,251658239,VN -251658240,257532415,US -257532416,257532423,SG -257532424,257532431,US -257532432,257532671,SG -257532672,265003519,US -265003520,265003547,HU -265003548,265003548,FR -265003549,265003775,HU -265003776,265025791,US -265025792,265026047,GB -265026048,265527295,US -265527296,265529599,JP -265529600,265529855,US -265529856,265535487,JP -265535488,266062079,US -266062080,266062335,GB -266062336,266067967,US -266067968,266076159,AU -266076160,266598655,US -266598656,266598911,BR -266598912,288151551,US -288151552,288157695,CA -288157696,288167423,US -288167424,288167935,CA -288167936,288169471,US -288169472,288169983,CA -288169984,288176127,US -288176128,288178175,MX -288178176,288180223,CA -288180224,288196607,US -288196608,288197119,CA -288197120,288197631,US -288197632,288198143,CA -288198144,288198655,CL -288198656,288199679,US -288199680,288200703,CO -288200704,288205422,US -288205423,288205423,CO -288205424,288205424,BR -288205425,288205425,MX -288205426,288205426,CL -288205427,288212991,US -288212992,288215039,CA -288215040,288223231,US -288223232,288227327,CA -288227328,288293887,US -288293888,288294143,BR -288294144,288358399,US -288358400,288366591,BR -288366592,289406975,US -289406976,289554431,IE -289554432,289610751,US -289610752,289611775,SE -289611776,289615871,GB -289615872,289619967,FR -289619968,289624063,US -289624064,289628159,CH -289628160,289630207,US -289630208,289632255,SE -289632256,289652735,US -289652736,289653759,NL -289653760,289654271,DE -289654272,289654783,US -289654784,289655807,CZ -289655808,289656831,DE -289656832,289657855,BE -289657856,289658879,AE -289658880,289659903,GB -289659904,289660927,US -289660928,289665023,ES -289665024,289667071,US -289667072,289668095,GB -289668096,289669119,DE -289669120,289746943,US -289746944,289751039,GB -289751040,289767423,US -289767424,289769471,GB -289769472,289779711,US -289779712,289783807,RU -289783808,289787903,GB -289787904,289789951,DE -289789952,289791999,US -289792000,289794047,AE -289794048,289796095,GB -289796096,289798143,TR -289798144,289800191,SA -289800192,289948927,US -289948928,289949055,AT -289949056,289949183,US -289949184,289949695,RU -289949696,289950207,NL -289950208,289950463,PL -289950464,289950719,PT -289950720,289950975,CZ -289950976,289951231,US -289951232,289951487,RU -289951488,289951743,US -289951744,289952255,DE -289952256,289953791,GB -289953792,289954303,US -289954304,289954559,ES -289954560,289955839,US -289955840,289955967,NL -289955968,289956095,US -289956096,289956223,NO -289956224,289956351,US -289956352,289956479,DK -289956480,289956607,US -289956608,289956735,NL -289956736,289956863,IN -289956864,289957119,ES -289957120,289957375,US -289957376,289957631,SE -289957632,289957887,US -289957888,289958143,LU -289958144,289958399,US -289958400,289958655,IN -289958656,289958911,US -289958912,289959423,IT -289959424,289959935,DK -289959936,289960447,DE -289960448,289960959,IN -289960960,289961471,BE -289961472,289963007,US -289963008,289964031,FR -289964032,289980415,IE -289980416,290193407,US -290193408,290258943,IN -290258944,290265087,US -290265088,290267135,RU -290267136,290269183,US -290269184,290270207,PL -290270208,290271231,PT -290271232,290277375,US -290277376,290279423,GB -290279424,290295295,US -290295296,290295807,IN -290295808,290299903,US -290299904,290300927,LU -290300928,290301951,TR -290301952,290302463,IN -290302464,290302591,DE -290302592,290302975,US -290302976,290303999,DE -290304000,290306047,US -290306048,290308095,DK -290308096,290310143,US -290310144,290312191,IN -290312192,290340863,US -290340864,290373631,IL -290373632,290374911,US -290374912,290375167,GB -290375168,290377727,US -290377728,290379775,GB -290379776,290383103,US -290383104,290383359,NL -290383360,290390015,US -290390016,290394111,IL -290394112,290423807,US -290423808,290424831,SE -290424832,290455551,US -290455552,290586623,CN -290586624,290652159,SG -290652160,290717695,JP -290717696,290737919,US -290737920,290738175,SG -290738176,290791423,US -290791424,290795519,CN -290795520,290799615,US -290799616,290801663,CN -290801664,290815999,US -290816000,290848767,CN -290848768,290914303,AU -290914304,291045375,CN -291045376,291201023,US -291201024,291203071,JP -291203072,300646399,US -300646400,300650495,JP -300650496,300654591,SG -300654592,300658687,US -300658688,300662783,AU -300662784,300666879,GB -300666880,300670975,NL -300670976,300675071,IE -300675072,300679167,IL -300679168,301801983,US -301801984,301802239,GB -301802240,301802495,US -301802496,301802751,GB -301802752,301803007,US -301803008,301803263,SE -301803264,301805567,US -301805568,301805823,DE -301805824,301806591,US -301806592,301806847,NL -301806848,301807103,US -301807104,301807359,DE -301807360,301807615,US -301807616,301807871,DE -301807872,301810175,US -301810176,301810431,AU -301810432,301810687,US -301810688,301810943,JP -301810944,301811199,US -301811200,301811455,JP -301811456,301812223,US -301812224,301812479,JP -301812480,301812735,US -301812736,301812991,GB -301812992,301813247,US -301813248,301813503,DE -301813504,301814271,US -301814272,301814527,SG -301814528,301814783,US -301814784,301815039,HK -301815040,301815295,US -301815296,301815551,HK -301815552,301987839,US -301987840,301987847,GB -301987848,301987863,US -301987864,301988111,GB -301988112,301988119,US -301988120,301988151,GB -301988152,301988167,US -301988168,301988191,GB -301988192,301989023,US -301989024,301989031,MO -301989032,301989119,US -301989120,301989183,AU -301989184,301989375,US -301989376,301989631,SG -301989632,301989711,US -301989712,301989719,JP -301989720,314703871,US -314703872,314966015,DE -314966016,315097087,US -315097088,315162623,IE -315162624,317128703,US -317128704,317194239,BR -317194240,322058771,US -322058772,322058772,CL -322058773,323243895,US -323243896,323243903,FR -323243904,332132119,US -332132120,332132127,IL -332132128,344262655,US -344262656,344262911,GB -344262912,344592895,US -344592896,344592945,GB -344592946,344592946,US -344592947,344593151,GB -344593152,344662783,US -344662784,344663039,MY -344663040,344670719,US -344670720,344671231,IN -344671232,344711167,US -344711168,344719359,AU -344719360,344881151,US -344881152,344881407,IN -344881408,344977407,US -344977408,344977663,IN -344977664,347602943,US -347602944,347619327,SG -347619328,347815935,US -347815936,347832319,HK -347832320,347865087,US -347865088,347873279,JP -347873280,347881471,FR -347881472,347889663,US -347889664,347897855,SG -347897856,347930623,AU -347930624,347947007,US -347947008,347963391,HK -347963392,347979775,US -347979776,347996159,JP -347996160,348012543,US -348012544,348020735,SG -348020736,348029183,US -348029184,348029439,IE -348029440,348031231,US -348031232,348031487,NL -348031488,348031743,US -348031744,348031999,CA -348032000,348032127,SG -348032128,348032255,HK -348032256,348032511,JP -348032512,348032767,AU -348032768,348033023,GB -348033024,348033151,US -348033152,348033279,KR -348033280,348033407,BR -348033408,348033791,IN -348033792,348034047,FR -348034048,348034303,KR -348034304,348061695,US -348061696,348078079,IE -348078080,353769239,US -353769240,353769240,FR -353769241,355993887,US -355993888,355993895,IT -355993896,368674047,US -368674048,368674303,ES -368674304,372398271,US -372398272,372398303,AU -372398304,385884159,US -385884160,385888255,NL -385888256,385917183,US -385917184,385917439,NL -385917440,385920511,US -385920512,385920767,NL -385920768,385930239,US -385930240,385931263,NL -385931264,385939967,US -385939968,385940479,NL -385940480,385942527,US -385942528,385943551,NL -385943552,385957887,US -385957888,385961983,NL -385961984,386003199,US -386003200,386003967,NL -386003968,386012159,US -386012160,386012671,NL -386012672,386013183,US -386013184,386013695,NL -386013696,386015231,US -386015232,386015487,NL -386015488,386020351,US -386020352,386021375,NL -386021376,386035711,US -386035712,386039807,NL -386039808,386060287,US -386060288,386068479,NL -386068480,386073343,US -386073344,386073599,NL -386073600,386076415,US -386076416,386076671,NL -386076672,386095615,US -386095616,386096127,NL -386096128,386191359,US -386191360,386195455,NL -386195456,386201599,US -386201600,386203135,NL -386203136,386215935,US -386215936,386220031,NL -386220032,386228223,US -386228224,386232319,NL -386232320,386244607,US -386244608,386244863,NL -386244864,386245119,US -386245120,386245631,NL -386245632,386247679,US -386247680,386248703,NL -386248704,386297855,US -386297856,386298879,NL -386298880,386300415,US -386300416,386301951,NL -386301952,386383871,US -386383872,386387967,NL -386387968,386398207,US -386398208,386398719,NL -386398720,386398975,US -386398976,386399231,NL -386399232,386400255,US -386400256,386404351,NL -386404352,386465791,US -386465792,386469887,NL -386469888,386498559,US -386498560,386502655,NL -386502656,386519039,US -386519040,386523135,NL -386523136,386593279,US -386593280,386594815,NL -386594816,386595071,US -386595072,386595327,NL -386595328,386595583,US -386595584,386596095,NL -386596096,386656255,US -386656256,386656511,NL -386656512,386662399,US -386662400,386666495,NL -386666496,386682879,US -386682880,386691071,NL -386691072,386736127,US -386736128,386740223,NL -386740224,386774527,US -386774528,386775039,NL -386775040,386783231,US -386783232,386783743,NL -386783744,386789375,US -386789376,386797567,NL -386797568,386816511,US -386816512,386818047,NL -386818048,386826751,US -386826752,386827263,NL -386827264,386828287,US -386828288,386829311,NL -386829312,386862079,US -386862080,386862335,JP -386862336,386862591,KR -386862592,386868735,US -386868736,386868991,NL -386868992,386875391,US -386875392,386879487,NL -386879488,386892799,US -386892800,386893311,NL -386893312,386923519,US -386923520,386924543,NL -386924544,387055615,CA -387055616,387121151,PR -387121152,387648767,US -387648768,387649023,DE -387649024,387707903,US -387707904,387708159,CH -387708160,387825663,US -387825664,387833855,CA -387833856,387975167,US -387975168,387976191,NL -387976192,387977215,US -387977216,387978239,NL -387978240,387979263,US -387979264,387980287,NL -387980288,387994623,US -387994624,387996159,NL -387996160,387997695,US -387997696,388005887,NL -388005888,388029439,US -388029440,388030463,NL -388030464,388035071,US -388035072,388036607,NL -388036608,388038655,US -388038656,388042751,NL -388042752,388050943,US -388050944,388051967,NL -388051968,388055039,US -388055040,388059135,NL -388059136,388091903,US -388091904,388095999,NL -388096000,388100095,US -388100096,388101119,NL -388101120,388139519,US -388139520,388140031,NL -388140032,388149247,US -388149248,388153343,NL -388153344,388194303,US -388194304,388202495,NL -388202496,388206591,US -388206592,388207103,NL -388207104,388207871,US -388207872,388208127,NL -388208128,388223999,US -388224000,388225023,NL -388225024,388272127,US -388272128,388280319,NL -388280320,388288511,US -388288512,388293631,NL -388293632,388294143,US -388294144,388296703,NL -388296704,388308991,US -388308992,388317183,NL -388317184,388325375,US -388325376,388329471,NL -388329472,388341759,US -388341760,388345855,NL -388345856,388366335,US -388366336,388392447,NL -388392448,388397055,US -388397056,388398079,NL -388398080,388419583,US -388419584,388423679,NL -388423680,388440063,US -388440064,388444159,NL -388444160,388448255,US -388448256,388464639,NL -388464640,388472831,US -388472832,388476927,NL -388476928,388481023,US -388481024,388485119,NL -388485120,388493311,US -388493312,388501503,NL -388501504,388521983,US -388521984,388523007,NL -388523008,388526079,US -388526080,388530175,NL -388530176,388538367,US -388538368,388542463,NL -388542464,388550655,US -388550656,388554751,NL -388554752,388558847,US -388558848,388562943,NL -388562944,388567039,US -388567040,388571135,NL -388571136,388617215,US -388617216,388620287,NL -388620288,388632575,US -388632576,388636671,NL -388636672,388665343,US -388665344,388668415,NL -388668416,388677631,US -388677632,388681727,NL -388681728,388698111,US -388698112,388703231,NL -388703232,388710399,US -388710400,388714495,NL -388714496,388722687,US -388722688,388730879,NL -388730880,388784895,US -388784896,388792319,NL -388792320,388825087,US -388825088,388826111,NL -388826112,388828159,US -388828160,388829183,NL -388829184,388843519,US -388843520,388844543,NL -388844544,388849663,US -388849664,388853759,NL -388853760,388856831,US -388856832,388857343,NL -388857344,388862975,US -388862976,388865023,NL -388865024,388866047,US -388866048,388870143,NL -388870144,388885503,US -388885504,388890623,NL -388890624,388893695,US -388893696,388894719,NL -388894720,388896767,US -388896768,388897279,NL -388897280,388897791,US -388897792,388898815,NL -388898816,388919295,US -388919296,388923391,NL -388923392,388943871,US -388943872,388944127,NL -388944128,388944895,US -388944896,388945919,NL -388945920,388956159,US -388956160,388960255,NL -388960256,388964351,US -388964352,388973567,NL -388973568,388996095,US -388996096,388997119,NL -388997120,389044223,US -389044224,389045247,NL -389045248,389060607,US -389060608,389061631,NL -389061632,389076479,US -389076480,389078015,NL -389078016,389102079,US -389102080,389102591,NL -389102592,389136383,US -389136384,389140479,NL -389140480,389153791,US -389153792,389154815,NL -389154816,389165055,US -389165056,389169151,NL -389169152,389177343,US -389177344,389181439,NL -389181440,389185535,US -389185536,389201919,NL -389201920,389242879,US -389242880,389251071,NL -389251072,389273599,US -389273600,389283839,NL -389283840,389286911,US -389286912,389293055,NL -389293056,389296127,US -389296128,389300223,NL -389300224,389319167,US -389319168,389319679,NL -389319680,389320191,US -389320192,389320447,NL -389320448,389327359,US -389327360,389327615,NL -389327616,389350143,US -389350144,389350399,NL -389350400,389350655,US -389350656,389351423,NL -389351424,389351935,US -389351936,389352959,NL -389352960,389353215,US -389353216,389365759,NL -389365760,389391359,US -389391360,389394431,NL -389394432,389414911,US -389414912,389419007,NL -389419008,389435391,US -389435392,389445119,NL -389445120,389447679,US -389447680,389451775,NL -389451776,389495295,US -389495296,389495807,NL -389495808,389509119,US -389509120,389513215,NL -389513216,389515263,US -389515264,389521407,NL -389521408,389554175,US -389554176,389562367,NL -389562368,389570559,US -389570560,389571071,NL -389571072,389571583,US -389571584,389571839,NL -389571840,389572095,US -389572096,389572607,NL -389572608,389572863,US -389572864,389573119,NL -389573120,389573887,US -389573888,389574143,NL -389574144,389591039,US -389591040,389592063,NL -389592064,389593087,US -389593088,389594111,NL -389594112,389612543,US -389612544,389613567,NL -389613568,389615615,US -389615616,389619711,NL -389619712,389631999,US -389632000,389635071,NL -389635072,389636095,US -389636096,389640191,NL -389640192,389700863,US -389700864,389701119,NL -389701120,389732351,US -389732352,389733375,NL -389733376,389733887,US -389733888,389734399,NL -389734400,389758975,US -389758976,389761023,NL -389761024,389764095,US -389764096,389765631,NL -389765632,389767167,US -389767168,389775359,NL -389775360,389812223,US -389812224,389816319,NL -389816320,389825791,US -389825792,389826047,NL -389826048,389852671,US -389852672,389853183,NL -389853184,389857279,US -389857280,389873663,NL -389873664,389874687,US -389874688,389875711,NL -389875712,389931007,US -389931008,389936127,NL -389936128,389937407,US -389937408,389937663,NL -389937664,389939711,US -389939712,389940223,NL -389940224,389941503,US -389941504,389941759,NL -389941760,389954815,US -389954816,389955071,NL -389955072,389964287,US -389964288,389965055,NL -389965056,389965311,US -389965312,389966335,NL -389966336,389967871,US -389967872,389977087,NL -389977088,389977599,US -389977600,389978111,NL -389978112,389979156,US -389979157,389979157,AU -389979158,389979189,US -389979190,389979190,AU -389979191,389988351,US -389988352,389992447,NL -389992448,389996543,US -389996544,389996799,NL -389996800,389996800,SG -389996801,390026751,US -390026752,390029311,NL -390029312,390030335,US -390030336,390030847,NL -390030848,390033407,US -390033408,390043135,NL -390043136,390063615,US -390063616,390066175,NL -390066176,390074111,US -390074112,390082559,NL -390082560,390085631,US -390085632,390086655,NL -390086656,390103039,US -390103040,390103551,NL -390103552,390106623,US -390106624,390107135,NL -390107136,390123519,US -390123520,390131711,NL -390131712,390141439,US -390141440,390141695,NL -390141696,390143231,US -390143232,390143999,NL -390144000,390165503,US -390165504,390166527,NL -390166528,390184959,US -390184960,390189055,NL -390189056,390205439,US -390205440,390209535,NL -390209536,390261247,US -390261248,390261759,NL -390261760,390276863,US -390276864,390277375,NL -390277376,390277631,US -390277632,390278143,NL -390278144,390278911,US -390278912,390279167,NL -390279168,390281727,US -390281728,390281983,NL -390281984,390286847,US -390286848,390287359,NL -390287360,390299647,US -390299648,390304767,NL -390304768,390332159,US -390332160,390332415,NL -390332416,390731775,US -390731776,390732031,NL -390732032,390972927,US -390972928,390973951,NL -390973952,390975487,US -390975488,390976511,NL -390976512,390995967,US -390995968,391020543,NL -391020544,391110655,US -391110656,391110911,IL -391110912,391111167,GB -391111168,391111679,NL -391111680,391111935,US -391111936,391112063,AU -391112064,391112703,US -391112704,391113471,NL -391113472,391116543,US -391116544,391116799,NL -391116800,391331839,US -391331840,391333887,NL -391333888,391344127,US -391344128,391348223,NL -391348224,391368703,US -391368704,391372799,CA -391372800,391865855,US -391865856,391866879,HK -391866880,391867391,US -391867392,391867647,VN -391867648,391872511,US -391872512,391888895,CA -391888896,391897087,US -391897088,391905279,CA -391905280,391937535,US -391937536,391937791,CA -391937792,391938047,IE -391938048,391946239,CA -391946240,391960335,US -391960336,391960351,GB -391960352,392044351,US -392044352,392044359,CA -392044360,392054271,US -392054272,392054527,CA -392054528,392055943,US -392055944,392055951,GB -392055952,392073319,US -392073320,392073327,CA -392073328,392103471,US -392103472,392103479,GB -392103480,392112815,US -392112816,392112823,GB -392112824,392114895,US -392114896,392114903,TH -392114904,392245247,US -392245248,392249343,SG -392249344,392257535,HK -392257536,392265727,BR -392265728,392298495,NL -392298496,392306687,US -392306688,392310015,HK -392310016,392310271,US -392310272,392310527,NL -392310528,392312831,US -392312832,392313343,JP -392313344,392314879,US -392314880,392331263,SG -392331264,392388607,US -392388608,392396799,HK -392396800,392429567,US -392429568,392433663,NL -392433664,392441855,US -392441856,392445951,IE -392445952,392452095,US -392452096,392454143,HK -392454144,392458239,JP -392458240,392460287,SG -392460288,392462335,US -392462336,392478719,IE -392478720,392495103,US -392495104,392499199,HK -392499200,392503295,SG -392503296,392507391,US -392507392,392511487,IE -392511488,392515583,NL -392515584,392548351,US -392548352,392560639,AU -392560640,392577023,IE -392577024,392585215,JP -392585216,392611839,US -392611840,392612351,HK -392612352,392617983,US -392617984,392626175,HK -392626176,392658943,US -392658944,392659199,JP -392659200,392659455,AU -392659456,392659583,JP -392659584,392659711,AU -392659712,392659807,US -392659808,392659823,IE -392659824,392659871,SG -392659872,392659903,NL -392659904,392660351,US -392660352,392660383,IE -392660384,392660415,FI -392660416,392660447,AT -392660448,392660607,US -392660608,392660671,GB -392660672,392661887,US -392661888,392661951,JP -392661952,392662143,US -392662144,392662207,IN -392662208,392662399,US -392662400,392662463,KR -392662464,392663039,US -392663040,392663071,FI -392663072,392663103,US -392663104,392663135,IE -392663136,392663167,US -392663168,392663199,NL -392663200,392663359,US -392663360,392663391,IE -392663392,392663487,US -392663488,392663519,IE -392663520,392665855,US -392665856,392665887,HK -392665888,392665983,US -392665984,392666015,HK -392666016,392666047,SG -392666048,392666367,US -392666368,392666431,CA -392666432,392667135,US -392667136,392671231,JP -392671232,392672767,US -392672768,392672895,IE -392672896,392672959,NL -392672960,392673087,SG -392673088,392674559,US -392674560,392674591,SG -392674592,392674815,US -392674816,392674879,SG -392674880,392674911,US -392674912,392674943,SG -392674944,392674975,US -392674976,392675023,IE -392675024,392675039,US -392675040,392675071,SG -392675072,392684479,US -392684480,392684511,IE -392684512,392684543,NL -392684544,392684575,IE -392684576,392684607,NL -392684608,392684639,IE -392684640,392684655,NL -392684656,392684671,US -392684672,392684703,IE -392684704,392684719,NL -392684720,392684735,US -392684736,392684767,IE -392684768,392684783,NL -392684784,392684799,US -392684800,392684831,IE -392684832,392684847,NL -392684848,392684863,US -392684864,392684895,IE -392684896,392684911,NL -392684912,392684927,US -392684928,392684959,IE -392684960,392684975,NL -392684976,392684991,US -392684992,392685023,IE -392685024,392685039,NL -392685040,392685055,US -392685056,392685087,IE -392685088,392685103,NL -392685104,392685119,US -392685120,392685151,IE -392685152,392686607,US -392686608,392686623,AT -392686624,392686639,FI -392686640,392686655,IE -392686656,392686671,US -392686672,392686687,AT -392686688,392686703,FI -392686704,392686719,IE -392686720,392686735,US -392686736,392686751,AT -392686752,392686767,FI -392686768,392686783,IE -392686784,392686799,US -392686800,392686815,AT -392686816,392686831,FI -392686832,392686847,IE -392686848,392686863,US -392686864,392686879,AT -392686880,392686895,FI -392686896,392686911,IE -392686912,392686927,US -392686928,392686943,IE -392686944,392686959,FI -392686960,392686975,AT -392686976,392686991,US -392686992,392687007,IE -392687008,392687023,FI -392687024,392687039,AT -392687040,392687055,US -392687056,392687071,IE -392687072,392687087,FI -392687088,392687103,AT -392687104,392687119,US -392687120,392687135,IE -392687136,392687151,FI -392687152,392687167,AT -392687168,392687183,US -392687184,392687199,IE -392687200,392687215,FI -392687216,392687231,AT -392687232,392687311,US -392687312,392687327,NL -392687328,392687375,US -392687376,392687391,NL -392687392,392687439,US -392687440,392687455,NL -392687456,392687503,US -392687504,392687519,NL -392687520,392687567,US -392687568,392687583,NL -392687584,392687631,US -392687632,392687647,NL -392687648,392687695,US -392687696,392687711,NL -392687712,392687759,US -392687760,392687775,NL -392687776,392687823,US -392687824,392687839,NL -392687840,392687887,US -392687888,392687903,NL -392687904,392689295,US -392689296,392689311,NL -392689312,392689327,AT -392689328,392689343,IE -392689344,392689359,US -392689360,392689375,NL -392689376,392689391,AT -392689392,392689407,IE -392689408,392689423,US -392689424,392689439,NL -392689440,392689455,AT -392689456,392689471,IE -392689472,392689487,US -392689488,392689503,NL -392689504,392689519,AT -392689520,392689535,IE -392689536,392689551,US -392689552,392689567,NL -392689568,392689583,AT -392689584,392689599,IE -392689600,392689615,US -392689616,392689631,NL -392689632,392689647,AT -392689648,392689663,IE -392689664,392689679,US -392689680,392689695,NL -392689696,392689711,AT -392689712,392689727,IE -392689728,392689743,US -392689744,392689759,NL -392689760,392689775,AT -392689776,392689791,IE -392689792,392689807,US -392689808,392689823,NL -392689824,392689839,AT -392689840,392689855,IE -392689856,392689871,US -392689872,392689887,NL -392689888,392689903,AT -392689904,392689919,IE -392689920,392689983,US -392689984,392689999,SG -392690000,392690015,HK -392690016,392690031,KR -392690032,392690047,MY -392690048,392690079,US -392690080,392690095,KR -392690096,392690111,MY -392690112,392690431,US -392690432,392690687,NL -392690688,392690703,SG -392690704,392690719,HK -392690720,392690879,NL -392690880,392690943,US -392690944,392690975,HK -392690976,392691007,SG -392691008,392691023,HK -392691024,392691039,SG -392691040,392691055,KR -392691056,392691071,MY -392691072,392691327,US -392691328,392691343,NL -392691344,392691359,IE -392691360,392691375,FI -392691376,392691391,AT -392691392,392691407,NL -392691408,392691423,IE -392691424,392691439,FI -392691440,392691455,AT -392691456,392765439,US -392765440,392765695,GB -392765696,392814591,US -392814592,392822783,RU -392822784,392849663,US -392849664,392849919,NL -392849920,392850687,US -392850688,392850943,NL -392850944,392851455,US -392851456,392852479,NL -392852480,392852735,US -392852736,392852991,NL -392852992,392853503,US -392853504,392855551,SG -392855552,393007103,US -393007104,393008639,NL -393008640,393008895,US -393008896,393011199,NL -393011200,393019391,US -393019392,393042015,NL -393042016,393042023,US -393042024,393042087,NL -393042088,393042095,US -393042096,393042143,NL -393042144,393042151,US -393042152,393042719,NL -393042720,393042727,US -393042728,393084927,NL -393084928,393150463,US -393150464,393152511,NL -393152512,393153535,US -393153536,393154559,SG -393154560,393158655,NL -393158656,393166847,RU -393166848,393170943,CA -393170944,393175039,NL -393175040,393183231,RU -393183232,393199615,US -393199616,393207807,RU -393207808,393213951,NL -393213952,394264575,US -394264576,394264831,CA -394270720,394271231,NL -394280960,394281215,US -394296320,394296831,NL -394297344,394559743,US -394575872,394576127,CA -394592256,394593279,US -394608640,394608895,CA -394625024,394756351,US -394772480,394772735,CA -394788864,394854399,US -394854400,394854655,CA -394870784,394871039,US -394887168,394887423,US -394903552,394903807,CA -394919936,394920191,US -394936320,394936575,CA -394952704,394953215,CA -394969088,394969343,US -394985472,395018239,US -395018240,395018495,CA -395034624,395034879,US -395051008,395051263,CA -395067392,395067647,US -395083776,395084031,US -395100160,395100415,US -395116544,395116799,US -395132928,395133183,US -395149312,395149567,CA -395165696,395165951,US -395182080,395182335,CA -395198464,395198719,US -395214848,395215103,US -395231232,395231487,US -395247616,395313407,US -395329536,395329791,US -395345920,395346175,CA -395362304,395362559,US -395378688,395493375,US -395493376,395493631,CA -395493632,395576319,US -395591680,395591935,US -395608064,395640831,CA -395657216,395657471,US -395673600,395673855,CA -395689984,395690239,US -395706368,395706623,CA -395722752,395723007,US -395739136,395771903,US -395771904,395788287,CA -395788288,395788543,US -395788544,395837439,CA -395837440,395903231,US -395919360,395919615,CA -395935744,395935999,CA -395952128,395952383,US -395968512,395984895,CA -395984896,395985151,US -395985152,396034047,CA -396034048,396034303,US -396050432,396050687,CA -396066816,396067071,CA -396083200,396083455,US -396099584,396263423,US -396263424,396263679,CA -396279808,396280063,US -396296192,396754943,US -396754944,396755199,CA -396787712,396787967,US -396820480,397082879,US -397115392,397115647,CA -397148160,397345023,US -397377536,397377791,CA -397410304,397410559,CA -397443072,397443327,US -397475840,397541375,US -397541376,397541887,CA -397574144,397574399,US -397606912,397607423,CA -397639680,397639935,US -397672448,397738239,US -397770752,397771007,CA -397803520,397869055,CA -397869056,398065663,US -398065664,398065919,CA -398098432,398098687,US -398131200,398196735,US -398196736,398196991,KY -398229504,398229759,US -398262272,398327807,US -398327808,398328063,PR -398360576,398360831,CA -398393344,398393599,US -398426112,398426367,CA -398458880,398500351,US -398500352,398500863,NL -398500864,398532607,US -398532608,398536703,NL -398536704,398566911,US -398566912,398567423,NL -398567424,398640127,US -398640128,398641151,NL -398641152,398642175,US -398642176,398643199,NL -398643200,398684159,US -398684160,398692351,NL -398692352,398779903,US -398779904,398781439,NL -398781440,398782463,US -398782464,398790655,NL -398790656,398851071,US -398851072,398852095,NL -398852096,398854143,US -398854144,398854399,NL -398854400,398856191,US -398856192,398860287,NL -398860288,398868479,US -398868480,398877183,NL -398877184,398940159,US -398940160,398941183,NL -398941184,398970879,US -398970880,398974975,NL -398974976,399004671,US -399004672,399006207,FR -399006208,399007743,US -399007744,399011839,NL -399011840,399016959,US -399016960,399017983,NL -399017984,399020031,US -399020032,399028223,NL -399028224,399032319,US -399032320,399036415,NL -399036416,399055871,US -399055872,399056639,NL -399056640,399076095,US -399076096,399076863,NL -399076864,399087615,US -399087616,399088639,NL -399088640,399089663,US -399089664,399114239,NL -399114240,399125759,US -399125760,399126015,NL -399126016,399143935,US -399143936,399145471,NL -399145472,399147007,US -399147008,399155199,NL -399155200,399172863,US -399172864,399173119,NL -399173120,399175679,US -399175680,399179775,NL -399179776,399280127,US -399280128,399280639,NL -399280640,399280895,US -399280896,399281151,NL -399281152,399331327,US -399331328,399339519,NL -399339520,399353855,US -399353856,399354879,NL -399354880,399355391,US -399355392,399359999,NL -399360000,399367167,US -399367168,399367679,NL -399367680,399368191,US -399368192,399378943,NL -399378944,399380479,US -399380480,399388671,NL -399388672,399396863,US -399396864,399407103,NL -399407104,399458303,US -399458304,399466495,NL -399466496,399484927,US -399484928,399485183,NL -399485184,399486975,US -399486976,399491071,NL -399491072,399495167,US -399495168,399503359,NL -399503360,399590399,US -399590400,399591935,NL -399591936,399594495,US -399594496,399595519,NL -399595520,399598591,US -399598592,399599615,NL -399599616,399622143,US -399622144,399630335,NL -399630336,399642623,US -399642624,399643647,NL -399643648,399644671,US -399644672,399647231,NL -399647232,399648767,US -399648768,399650815,NL -399650816,399688191,US -399688192,399689727,NL -399689728,399702015,US -399702016,399707135,NL -399707136,399734527,US -399734528,399735807,NL -399735808,399738879,US -399738880,399739135,NL -399739136,399739391,US -399739392,399739647,NL -399739648,399740927,US -399740928,399749119,NL -399749120,399769855,US -399769856,399770111,NL -399770112,399782911,US -399782912,399783167,NL -399783168,399797247,US -399797248,399797759,NL -399797760,399826943,US -399826944,399830015,NL -399830016,399849471,US -399849472,399850495,NL -399850496,399870975,US -399870976,399871999,NL -399872000,399908863,US -399908864,399919615,NL -399919616,399921151,US -399921152,399951359,NL -399951360,399951615,US -399951616,399952895,NL -399952896,399953919,US -399953920,399958015,NL -399958016,399968511,US -399968512,399968767,NL -399968768,399969279,US -399969280,399969535,NL -399969536,399970303,US -399970304,399980031,NL -399980032,399981567,US -399981568,399982079,NL -399982080,399998975,US -399998976,399999487,NL -399999488,400021247,US -400021248,400021503,NL -400021504,400056319,US -400056320,400064511,NL -400064512,400083455,US -400083456,400084991,NL -400084992,400093183,US -400093184,400097279,NL -400097280,400098303,US -400098304,400100351,NL -400100352,400111103,US -400111104,400111615,NL -400111616,400112639,US -400112640,400113663,NL -400113664,400121855,US -400121856,400122367,NL -400122368,400124927,US -400124928,400130047,NL -400130048,400130559,US -400130560,400131071,NL -400131072,400131583,US -400131584,400132095,NL -400132096,400144383,US -400144384,400145407,NL -400145408,400154623,US -400154624,400162815,NL -400162816,400201215,US -400201216,400202751,NL -400202752,400203775,US -400203776,400211967,NL -400211968,400222719,US -400222720,400223231,NL -400223232,400249855,US -400249856,400250879,NL -400250880,400251647,US -400251648,400251903,NL -400251904,400261119,US -400261120,400261887,NL -400261888,400263167,US -400263168,400263679,NL -400263680,400264703,US -400264704,400265215,NL -400265216,400267263,US -400267264,400268287,NL -400268288,400400383,US -400400384,400430079,NL -400430080,400432639,US -400432640,400442367,NL -400442368,400482303,US -400482304,400486399,NL -400486400,400494591,US -400494592,400527359,NL -400527360,400543743,US -400543744,400551935,NL -400551936,400740351,US -400740352,400740607,MX -400740608,400760831,US -400760832,400769023,CA -400769024,400794111,US -400794112,400794239,IT -400794240,400795903,US -400795904,400796159,IT -400796160,400796927,US -400796928,400796991,IT -400796992,400797863,US -400797864,400797871,IT -400797872,400805887,US -400805888,400809983,CA -400809984,400883711,US -400883712,400883759,CA -400883760,400883767,US -400883768,400883799,CA -400883800,400883807,US -400883808,400883823,CA -400883824,400883831,US -400883832,400883855,CA -400883856,400883871,US -400883872,400883887,CA -400883888,400883895,BG -400883896,400883919,CA -400883920,400883927,GB -400883928,400884231,CA -400884232,400884239,US -400884240,400884255,CA -400884256,400884287,US -400884288,400884319,CA -400884320,400884359,US -400884360,400884455,CA -400884456,400884463,US -400884464,400884471,CA -400884472,400884479,US -400884480,400884735,TR -400884736,400884991,GB -400884992,400885007,US -400885008,400885095,CA -400885096,400885103,US -400885104,400885111,GB -400885112,400885119,US -400885120,400885223,CA -400885224,400885227,US -400885228,400885279,CA -400885280,400885311,US -400885312,400885407,CA -400885408,400885439,US -400885440,400885783,CA -400885784,400885791,US -400885792,400885903,CA -400885904,400885919,US -400885920,400886031,CA -400886032,400886047,US -400886048,400886095,CA -400886096,400886111,US -400886112,400886119,CA -400886120,400886135,US -400886136,400886151,CA -400886152,400886159,US -400886160,400886175,CA -400886176,400886183,US -400886184,400886191,CA -400886192,400886199,US -400886200,400886303,CA -400886304,400886335,US -400886336,400886351,CA -400886352,400886383,US -400886384,400886407,CA -400886408,400886415,US -400886416,400886463,CA -400886464,400886527,US -400886528,400886583,CA -400886584,400886591,US -400886592,400886695,CA -400886696,400886703,FI -400886704,400886719,CA -400886720,400886767,US -400886768,400887039,CA -400887040,400887135,US -400887136,400887151,CA -400887152,400887175,US -400887176,400887231,CA -400887232,400887263,US -400887264,400887335,CA -400887336,400887343,US -400887344,400887351,SE -400887352,400887503,CA -400887504,400887543,US -400887544,400887551,CA -400887552,400887807,GB -400887808,400887831,CA -400887832,400887839,US -400887840,400887895,CA -400887896,400887911,US -400887912,400887935,CA -400887936,400887959,US -400887960,400887975,CA -400887976,400887983,US -400887984,400888031,CA -400888032,400888039,US -400888040,400888063,CA -400888064,400888319,US -400888320,400888575,CA -400888576,400888831,GB -400888832,400889359,CA -400889360,400889367,US -400889368,400889439,CA -400889440,400889503,US -400889504,400889511,CA -400889512,400889599,US -400889600,400889647,CA -400889648,400889663,US -400889664,400889711,CA -400889712,400889727,US -400889728,400889775,CA -400889776,400889791,US -400889792,400889855,CA -400889856,400890111,US -400890112,400890143,CA -400890144,400890151,US -400890152,400890159,CA -400890160,400890207,US -400890208,400890263,CA -400890264,400890271,US -400890272,400890335,CA -400890336,400890367,US -400890368,400890383,CA -400890384,400890391,US -400890392,400890399,CA -400890400,400890407,US -400890408,400890527,CA -400890528,400890543,US -400890544,400890591,CA -400890592,400890623,US -400890624,400890639,CA -400890640,400890655,US -400890656,400890783,CA -400890784,400890831,US -400890832,400891263,CA -400891264,400891343,US -400891344,400891383,CA -400891384,400891407,US -400891408,400891415,CA -400891416,400891455,US -400891456,400891471,CA -400891472,400891487,US -400891488,400891551,CA -400891552,400891583,US -400891584,400891615,CA -400891616,400891631,US -400891632,400891695,CA -400891696,400891703,US -400891704,400891791,CA -400891792,400891807,US -400891808,400891887,CA -400891888,400892159,US -400892160,400892479,CA -400892480,400892543,US -400892544,400892567,CA -400892568,400892575,US -400892576,400892591,CA -400892592,400892607,US -400892608,400892671,CA -400892672,400892767,US -400892768,400892863,CA -400892864,400892895,US -400892896,400893055,CA -400893056,400893087,US -400893088,400893095,CA -400893096,400893311,US -400893312,400893695,CA -400893696,400893983,US -400893984,400893991,CA -400893992,400894047,US -400894048,400894079,CA -400894080,400894335,US -400894336,400894463,CA -400894464,400894719,US -400894720,400894783,CA -400894784,400894815,US -400894816,400894903,CA -400894904,400894911,US -400894912,400895231,CA -400895232,400895295,US -400895296,400895359,CA -400895360,400895407,US -400895408,400895455,CA -400895456,400895551,US -400895552,400895615,GB -400895616,400895663,CA -400895664,400895679,US -400895680,400895711,CA -400895712,400896511,US -400896512,400896591,CA -400896592,400896599,US -400896600,400896767,CA -400896768,400896775,US -400896776,400896823,CA -400896824,400896831,US -400896832,400896911,CA -400896912,400896919,US -400896920,400896927,CA -400896928,400896935,US -400896936,400896951,CA -400896952,400896959,US -400896960,400897023,CA -400897024,400897279,US -400897280,400897423,CA -400897424,400897439,US -400897440,400897503,CA -400897504,400897519,US -400897520,400897535,CA -400897536,400897791,US -400897792,400897847,CA -400897848,400897855,US -400897856,400897887,CA -400897888,400897903,US -400897904,400897935,CA -400897936,400897967,US -400897968,400897983,CA -400897984,400898047,US -400898048,400898063,CA -400898064,400898079,US -400898080,400898175,CA -400898176,400898303,US -400898304,400898311,CA -400898312,400898319,US -400898320,400898463,CA -400898464,400898495,US -400898496,400898703,CA -400898704,400898735,US -400898736,400898751,CA -400898752,400898783,US -400898784,400898807,CA -400898808,400898815,US -400898816,400898911,CA -400898912,400898927,US -400898928,400898943,CA -400898944,400899039,US -400899040,400899047,CA -400899048,400899055,US -400899056,400899071,CA -400899072,400899327,US -400899328,400899591,CA -400899592,400899599,US -400899600,400899623,CA -400899624,400899631,US -400899632,400899711,CA -400899712,400899743,US -400899744,400899759,CA -400899760,400899807,US -400899808,400899815,CA -400899816,400899823,US -400899824,400899847,CA -400899848,400899855,US -400899856,400899967,CA -400899968,400899999,US -400900000,400900031,CA -400900032,400900255,US -400900256,400900263,CA -400900264,400900271,US -400900272,400900287,CA -400900288,400900319,US -400900320,400900391,CA -400900392,400900399,US -400900400,400900447,CA -400900448,400900479,US -400900480,400900487,CA -400900488,400900495,US -400900496,400900559,CA -400900560,400900575,US -400900576,400900607,CA -400900608,400901119,US -400901120,400901487,CA -400901488,400901495,US -400901496,400901567,CA -400901568,400901583,US -400901584,400901615,CA -400901616,400901631,US -400901632,400901759,CA -400901760,400901807,US -400901808,400901823,CA -400901824,400901887,US -400901888,400902143,CA -400902144,400902399,US -400902400,400902431,CA -400902432,400902479,US -400902480,400902527,CA -400902528,400902623,US -400902624,400902639,CA -400902640,400902655,US -400902656,400902663,CA -400902664,400902671,US -400902672,400902719,CA -400902720,400902783,US -400902784,400902911,CA -400902912,400902943,US -400902944,400903271,CA -400903272,400903279,US -400903280,400903935,CA -400903936,400904479,US -400904480,400904487,CA -400904488,400904591,US -400904592,400904599,CA -400904600,400904607,US -400904608,400904623,CA -400904624,400904671,US -400904672,400905271,CA -400905272,400905279,US -400905280,400905335,CA -400905336,400905343,US -400905344,400905359,CA -400905360,400905367,US -400905368,400905399,CA -400905400,400905407,US -400905408,400905455,CA -400905456,400905463,FI -400905464,400906111,CA -400906112,400906143,US -400906144,400906175,CA -400906176,400906207,US -400906208,400906215,CA -400906216,400906223,US -400906224,400906231,CA -400906232,400906239,US -400906240,400906255,CA -400906256,400906263,US -400906264,400906399,CA -400906400,400906463,US -400906464,400906471,CA -400906472,400906815,US -400906816,400906831,CA -400906832,400906879,US -400906880,400907263,CA -400907264,400907519,US -400907520,400907775,CA -400907776,400908031,US -400908032,400908287,CA -400908288,400911103,US -400911104,400911359,PA -400911360,400911583,AU -400911584,400911615,US -400911616,400911871,CR -400911872,400912191,US -400912192,400912255,SG -400912256,401114367,US -401114368,401114623,DE -401114624,401115903,US -401115904,401116159,GB -401116160,401120255,US -401120256,401120767,HK -401120768,401125119,US -401125120,401125375,DE -401125376,401129727,US -401129728,401129983,FR -401129984,401130495,US -401130496,401130751,DE -401130752,401137151,US -401137152,401137663,GB -401137664,401142783,US -401142784,401143039,PE -401143040,401143295,BZ -401143296,401143551,NG -401143552,401143807,IM -401143808,401144063,SA -401144064,401144319,VE -401144320,401144575,BS -401144576,401144831,MA -401144832,401145087,OM -401145088,401145343,CO -401145344,401145599,GB -401145600,401145855,YE -401145856,401211391,CA -401211392,401229767,US -401229768,401229775,GB -401229776,401230527,US -401230528,401230559,GB -401230560,401230943,US -401230944,401230951,GB -401230952,401232375,US -401232376,401232383,GB -401232384,401234415,US -401234416,401234423,AU -401234424,401234959,US -401234960,401234967,GB -401234968,401236447,US -401236448,401236479,GB -401236480,401237191,US -401237192,401237199,GB -401237200,401240207,US -401240208,401240215,AU -401240216,401241631,US -401241632,401241663,AU -401241664,401287423,US -401287424,401287679,AU -401287680,401287935,US -401287936,401288191,NL -401288192,401288447,US -401288448,401288703,SE -401288704,401293311,US -401293312,401297407,CA -401297408,401342463,US -401342464,401346559,BB -401346560,401360639,US -401360640,401360895,HK -401360896,401361151,US -401361152,401361663,HK -401361664,401367039,US -401367040,401367295,GB -401367296,401367551,US -401367552,401367807,JP -401367808,401368831,US -401368832,401369343,TW -401369344,401369599,US -401369600,401369855,DE -401369856,401370623,US -401370624,401370879,DE -401370880,401372671,US -401372672,401372927,SG -401372928,401375487,US -401375488,401375511,CA -401375512,401375519,US -401375520,401375535,CA -401375536,401375543,US -401375544,401375743,CA -401375744,401376095,US -401376096,401376103,SE -401376104,401376111,CA -401376112,401376143,US -401376144,401376175,CA -401376176,401376191,US -401376192,401376223,CA -401376224,401376255,US -401376256,401376327,CA -401376328,401376335,US -401376336,401376351,CA -401376352,401376367,US -401376368,401376447,CA -401376448,401376479,US -401376480,401376495,CA -401376496,401376511,US -401376512,401377791,CA -401377792,401378303,US -401378304,401378559,EG -401378560,401378687,US -401378688,401378815,CA -401378816,401379071,US -401379072,401380367,CA -401380368,401380383,US -401380384,401380431,CA -401380432,401380447,US -401380448,401380479,CA -401380480,401380503,US -401380504,401380527,CA -401380528,401380543,US -401380544,401380607,CA -401380608,401380863,US -401380864,401381119,CA -401381120,401381247,US -401381248,401381375,CA -401381376,401381407,US -401381408,401381423,CA -401381424,401381887,US -401381888,401382015,CA -401382016,401382023,US -401382024,401382063,CA -401382064,401382087,US -401382088,401382479,CA -401382480,401382527,US -401382528,401382543,CA -401382544,401382575,US -401382576,401382623,CA -401382624,401382655,US -401382656,401384423,CA -401384424,401384431,US -401384432,401384799,CA -401384800,401384831,US -401384832,401384959,CA -401384960,401385215,US -401385216,401385295,CA -401385296,401385375,US -401385376,401385391,CA -401385392,401385407,US -401385408,401385423,CA -401385424,401385439,US -401385440,401385455,CA -401385456,401385983,US -401385984,401386303,CA -401386304,401386399,US -401386400,401386415,CA -401386416,401386463,US -401386464,401386471,CA -401386472,401386495,US -401386496,401387007,SE -401387008,401387263,US -401387264,401387519,CA -401387520,401387775,US -401387776,401388543,CA -401388544,401388559,US -401388560,401388575,CA -401388576,401388583,US -401388584,401388615,CA -401388616,401388631,US -401388632,401388671,CA -401388672,401388687,US -401388688,401389567,CA -401389568,401390079,US -401390080,401390591,CA -401390592,401390847,US -401390848,401393151,CA -401393152,401393407,US -401393408,401395455,CA -401395456,401395711,US -401395712,401396351,CA -401396352,401396383,US -401396384,401396391,CA -401396392,401396399,US -401396400,401396415,CA -401396416,401396447,US -401396448,401397247,CA -401397248,401397311,US -401397312,401397327,CA -401397328,401397359,US -401397360,401397407,CA -401397408,401397439,US -401397440,401397487,CA -401397488,401397503,US -401397504,401399063,CA -401399064,401399071,US -401399072,401399103,CA -401399104,401399135,US -401399136,401399167,CA -401399168,401399199,US -401399200,401399215,CA -401399216,401399263,US -401399264,401399279,CA -401399280,401399295,US -401399296,401399583,CA -401399584,401399599,US -401399600,401399607,CA -401399608,401399647,US -401399648,401399663,CA -401399664,401399679,US -401399680,401399711,CA -401399712,401399743,US -401399744,401399759,CA -401399760,401399775,US -401399776,401400063,CA -401400064,401400319,US -401400320,401400655,CA -401400656,401400671,US -401400672,401400703,CA -401400704,401400735,US -401400736,401400751,CA -401400752,401400783,US -401400784,401400815,CA -401400816,401400863,US -401400864,401400871,CA -401400872,401400879,NO -401400880,401400895,US -401400896,401400975,CA -401400976,401400991,US -401400992,401401039,CA -401401040,401401055,US -401401056,401401111,CA -401401112,401401135,US -401401136,401401151,CA -401401152,401401215,US -401401216,401401247,CA -401401248,401401279,US -401401280,401401359,CA -401401360,401401375,US -401401376,401401391,CA -401401392,401401439,US -401401440,401401455,CA -401401456,401401463,US -401401464,401401471,CA -401401472,401401503,US -401401504,401401511,CA -401401512,401401519,US -401401520,401401535,CA -401401536,401401567,US -401401568,401401615,CA -401401616,401401623,US -401401624,401401663,CA -401401664,401401679,US -401401680,401401687,CA -401401688,401401695,US -401401696,401401727,CA -401401728,401401855,US -401401856,401401935,CA -401401936,401401983,US -401401984,401402031,CA -401402032,401402047,US -401402048,401402079,CA -401402080,401402095,US -401402096,401402111,CA -401402112,401402207,US -401402208,401402223,CA -401402224,401402239,US -401402240,401402287,CA -401402288,401402303,US -401402304,401402335,CA -401402336,401402343,US -401402344,401402623,CA -401402624,401402879,US -401402880,401403455,CA -401403456,401403503,US -401403504,401403583,CA -401403584,401403615,US -401403616,401403663,CA -401403664,401403679,US -401403680,401403695,CA -401403696,401403743,US -401403744,401403807,CA -401403808,401403839,US -401403840,401403903,CA -401403904,401419775,US -401419776,401420031,CA -401420032,401420287,US -401420288,401420543,CA -401420544,401547263,US -401547264,401555455,CA -401555456,402096639,US -402096640,402096895,FR -402096896,402097407,US -402097408,402097663,KE -402097664,402097919,SY -402097920,402098175,MX -402098176,402098431,BN -402098432,402098687,BH -402098688,402098943,AW -402098944,402099711,US -402099712,402099967,GB -402099968,402105087,US -402105088,402105343,GB -402105344,402107391,US -402107392,402107647,IT -402107648,402108159,US -402108160,402108415,FR -402108416,402108927,US -402108928,402109183,CA -402109184,402110975,US -402110976,402111231,FR -402111232,402111487,US -402111488,402111743,CA -402111744,402113023,US -402113024,402113279,CA -402113280,402113535,FR -402113536,402114047,US -402114048,402114303,HK -402114304,402114559,US -402114560,402114815,CA -402114816,402115583,US -402115584,402115839,FR -402115840,402116607,US -402116608,402116863,CA -402116864,402118143,US -402118144,402118399,FR -402118400,402118911,US -402118912,402119167,CA -402119168,402120959,US -402120960,402121215,FR -402121216,402121727,US -402121728,402121983,CA -402121984,402122751,US -402122752,402123007,SE -402123008,402124287,US -402124288,402124543,TR -402124544,402124799,US -402124800,402125567,AU -402125568,402125823,FR -402125824,402126079,US -402126080,402126335,CA -402126336,402128127,US -402128128,402128383,FR -402128384,402128895,US -402128896,402169855,CA -402169856,402170111,KR -402170112,402170879,US -402170880,402171135,JP -402171136,402173695,US -402173696,402174463,SG -402174464,402175743,US -402175744,402175999,ES -402176000,402176255,AE -402176256,402223103,US -402223104,402227199,CA -402227200,402231295,PR -402235392,402239301,US -402239302,402239302,CA -402239303,402239473,US -402239474,402239474,CA -402239475,402243583,US -402243584,402247679,CA -402247680,402249215,US -402249216,402249727,GB -402249728,402259967,US -402259968,402260031,CA -402260032,402260039,FI -402260040,402260159,CA -402260160,402260167,US -402260168,402260199,CA -402260200,402260231,US -402260232,402260271,CA -402260272,402260279,GB -402260280,402260295,CA -402260296,402260303,US -402260304,402260431,CA -402260432,402260439,US -402260440,402260479,CA -402260480,402260511,US -402260512,402260575,CA -402260576,402260655,US -402260656,402260767,CA -402260768,402260831,US -402260832,402260863,CA -402260864,402260895,US -402260896,402260911,CA -402260912,402260959,US -402260960,402260967,CA -402260968,402260991,US -402260992,402260999,CA -402261000,402261087,US -402261088,402261119,CA -402261120,402261151,US -402261152,402261183,CA -402261184,402261215,US -402261216,402262015,CA -402262016,402262271,US -402262272,402262351,CA -402262352,402262359,US -402262360,402262455,CA -402262456,402262463,FI -402262464,402262519,CA -402262520,402262527,US -402262528,402262591,CA -402262592,402262599,US -402262600,402262663,CA -402262664,402262671,US -402262672,402262695,CA -402262696,402262703,US -402262704,402262751,CA -402262752,402262759,US -402262760,402262847,CA -402262848,402262855,US -402262856,402262927,CA -402262928,402262935,US -402262936,402262943,CA -402262944,402262951,US -402262952,402262975,CA -402262976,402262983,US -402262984,402263295,CA -402263296,402263311,US -402263312,402263335,CA -402263336,402263343,US -402263344,402263359,CA -402263360,402263391,US -402263392,402263423,CA -402263424,402263455,US -402263456,402263471,CA -402263472,402263487,US -402263488,402263807,CA -402263808,402264063,US -402264064,402264079,CA -402264080,402264095,US -402264096,402264111,CA -402264112,402264127,US -402264128,402264175,CA -402264176,402264319,US -402264320,402264447,CA -402264448,402264559,US -402264560,402265471,CA -402265472,402265535,US -402265536,402265551,CA -402265552,402265583,US -402265584,402265615,CA -402265616,402265631,US -402265632,402265663,CA -402265664,402265690,US -402265691,402265691,BD -402265692,402265791,US -402265792,402265879,CA -402265880,402265887,US -402265888,402265919,CA -402265920,402265951,US -402265952,402265967,CA -402265968,402266143,US -402266144,402266175,CA -402266176,402266215,US -402266216,402266287,CA -402266288,402266303,US -402266304,402266311,CA -402266312,402266319,US -402266320,402266335,CA -402266336,402266343,US -402266344,402266351,CA -402266352,402266359,US -402266360,402266367,CA -402266368,402266655,US -402266656,402266671,CA -402266672,402266703,US -402266704,402266727,CA -402266728,402266735,NO -402266736,402266751,US -402266752,402266831,CA -402266832,402266847,US -402266848,402267391,CA -402267392,402267423,US -402267424,402267439,CA -402267440,402267455,US -402267456,402267471,CA -402267472,402267487,US -402267488,402267519,CA -402267520,402267647,US -402267648,402269199,CA -402269200,402269207,US -402269208,402269215,CA -402269216,402269223,US -402269224,402269263,CA -402269264,402269455,US -402269456,402269519,CA -402269520,402269535,US -402269536,402269551,CA -402269552,402269567,US -402269568,402269583,CA -402269584,402269591,US -402269592,402269631,CA -402269632,402269647,US -402269648,402269983,CA -402269984,402270031,US -402270032,402270047,CA -402270048,402270207,US -402270208,402270335,CA -402270336,402270463,US -402270464,402270719,CA -402270720,402270783,US -402270784,402270879,CA -402270880,402270895,US -402270896,402270911,CA -402270912,402270927,US -402270928,402270975,CA -402270976,402271103,US -402271104,402271119,CA -402271120,402271135,US -402271136,402271167,CA -402271168,402271199,US -402271200,402271231,CA -402271232,402271423,US -402271424,402271439,CA -402271440,402271455,US -402271456,402271487,CA -402271488,402271615,US -402271616,402271631,CA -402271632,402271735,US -402271736,402271999,CA -402272000,402272127,US -402272128,402272255,CA -402272256,402272639,US -402272640,402272663,CA -402272664,402272671,US -402272672,402272703,CA -402272704,402272895,US -402272896,402273279,CA -402273280,402273327,US -402273328,402273375,CA -402273376,402273391,US -402273392,402273471,CA -402273472,402273503,US -402273504,402273519,CA -402273520,402273535,US -402273536,402273543,CA -402273544,402273551,FI -402273552,402273599,CA -402273600,402273791,US -402273792,402273927,CA -402273928,402273951,US -402273952,402273983,CA -402273984,402273999,US -402274000,402274015,CA -402274016,402274047,US -402274048,402274239,CA -402274240,402274287,US -402274288,402274295,CA -402274296,402274463,US -402274464,402274479,CA -402274480,402274543,US -402274544,402275351,CA -402275352,402275359,US -402275360,402275407,CA -402275408,402275839,US -402275840,402276095,CA -402276096,402276223,US -402276224,402277375,CA -402277376,402277631,US -402277632,402278015,CA -402278016,402278127,US -402278128,402278399,CA -402278400,402278655,US -402278656,402279959,CA -402279960,402279967,US -402279968,402280063,CA -402280064,402280191,US -402280192,402280207,CA -402280208,402280223,US -402280224,402280319,CA -402280320,402280383,US -402280384,402280399,CA -402280400,402280415,US -402280416,402280959,CA -402280960,402281087,US -402281088,402281199,CA -402281200,402281471,US -402281472,402281603,CA -402281604,402281607,US -402281608,402281687,CA -402281688,402281691,US -402281692,402281727,CA -402281728,402281823,US -402281824,402281991,CA -402281992,402281999,US -402282000,402282111,CA -402282112,402282239,US -402282240,402282815,CA -402282816,402282847,US -402282848,402282879,CA -402282880,402282911,US -402282912,402282927,CA -402282928,402282943,US -402282944,402282959,CA -402282960,402282975,US -402282976,402283263,CA -402283264,402283519,US -402283520,402284039,CA -402284040,402284047,US -402284048,402284159,CA -402284160,402284287,US -402284288,402284799,CA -402284800,402285055,US -402285056,402285327,CA -402285328,402285343,US -402285344,402285407,CA -402285408,402285439,US -402285440,402285567,CA -402285568,402285823,US -402285824,402286335,CA -402286336,402286847,US -402286848,402286863,CA -402286864,402286895,US -402286896,402286911,CA -402286912,402286927,US -402286928,402286935,CA -402286936,402286975,US -402286976,402286983,CA -402286984,402286991,US -402286992,402287207,CA -402287208,402287215,US -402287216,402287263,CA -402287264,402287279,US -402287280,402287343,CA -402287344,402287391,US -402287392,402287423,CA -402287424,402287487,US -402287488,402287551,CA -402287552,402287583,US -402287584,402287743,CA -402287744,402287799,US -402287800,402287823,CA -402287824,402287839,US -402287840,402287887,CA -402287888,402287903,US -402287904,402288007,CA -402288008,402288015,US -402288016,402288031,CA -402288032,402288063,US -402288064,402288135,CA -402288136,402288143,US -402288144,402288159,CA -402288160,402288175,US -402288176,402288223,CA -402288224,402288255,US -402288256,402288271,CA -402288272,402288287,US -402288288,402288319,CA -402288320,402288383,US -402288384,402288391,CA -402288392,402288399,US -402288400,402288431,CA -402288432,402288447,US -402288448,402288511,CA -402288512,402288591,US -402288592,402288607,CA -402288608,402288623,US -402288624,402288631,CA -402288632,402288895,US -402288896,402289119,CA -402289120,402289151,US -402289152,402289407,CA -402289408,402289471,US -402289472,402289535,CA -402289536,402289663,US -402289664,402289679,CA -402289680,402289695,US -402289696,402289711,CA -402289712,402289719,US -402289720,402289743,CA -402289744,402289759,US -402289760,402289775,CA -402289776,402289791,US -402289792,402289983,CA -402289984,402290047,US -402290048,402290239,CA -402290240,402290255,US -402290256,402290271,CA -402290272,402290287,US -402290288,402290399,CA -402290400,402290407,US -402290408,402290479,CA -402290480,402290511,US -402290512,402290639,CA -402290640,402290655,US -402290656,402290687,CA -402290688,402290815,US -402290816,402290823,CA -402290824,402290847,US -402290848,402290879,CA -402290880,402290919,US -402290920,402290975,CA -402290976,402291007,US -402291008,402291041,CA -402291042,402291042,US -402291043,402291087,CA -402291088,402291119,US -402291120,402291135,CA -402291136,402291199,US -402291200,402291231,CA -402291232,402291263,US -402291264,402291327,CA -402291328,402291359,US -402291360,402291391,CA -402291392,402291423,US -402291424,402291711,CA -402291712,402291999,US -402292000,402292143,CA -402292144,402292151,US -402292152,402292351,CA -402292352,402353663,US -402353664,402353919,JP -402353920,402354175,ID -402354176,402354431,DE -402354432,402354943,US -402354944,402355199,ES -402355200,402356223,US -402356224,402356479,SG -402356480,402356735,HK -402356736,402356991,MY -402356992,402357247,US -402357248,402357503,KR -402357504,402357759,JP -402357760,402358015,US -402358016,402358271,ID -402358272,402366463,US -402366464,402374655,CA -402374656,402399231,US -402399232,402403327,CA -402403328,402407935,US -402407936,402408191,TR -402408192,402408447,US -402408448,402408703,TR -402408704,402409470,US -402409471,402409727,TR -402409728,402410239,US -402410240,402410751,TR -402410752,402522111,US -402522112,402522175,CA -402522176,402522183,US -402522184,402522223,CA -402522224,402522231,US -402522232,402522271,CA -402522272,402522287,US -402522288,402522327,CA -402522328,402522335,US -402522336,402522399,CA -402522400,402522407,US -402522408,402522479,CA -402522480,402522559,US -402522560,402522591,CA -402522592,402522607,US -402522608,402522623,CA -402522624,402522655,US -402522656,402522679,CA -402522680,402522911,US -402522912,402522943,CA -402522944,402522975,US -402522976,402522991,CA -402522992,402523007,US -402523008,402523023,CA -402523024,402523039,US -402523040,402523071,CA -402523072,402523103,US -402523104,402523111,CA -402523112,402523135,US -402523136,402523167,CA -402523168,402523391,US -402523392,402523423,CA -402523424,402523447,US -402523448,402523455,CA -402523456,402523487,US -402523488,402523503,CA -402523504,402523647,US -402523648,402523679,CA -402523680,402523711,US -402523712,402523743,CA -402523744,402524159,US -402524160,402524191,CA -402524192,402524255,US -402524256,402524263,CA -402524264,402524271,FI -402524272,402524279,CA -402524280,402524351,US -402524352,402524383,CA -402524384,402524415,US -402524416,402524431,CA -402524432,402524447,US -402524448,402524479,CA -402524480,402524575,US -402524576,402524591,CA -402524592,402524607,US -402524608,402524639,CA -402524640,402524663,US -402524664,402524671,CA -402524672,402524799,US -402524800,402524831,CA -402524832,402524895,US -402524896,402524927,CA -402524928,402524959,US -402524960,402524991,CA -402524992,402525007,US -402525008,402525023,CA -402525024,402525055,US -402525056,402525087,CA -402525088,402525103,US -402525104,402525119,CA -402525120,402525167,US -402525168,402525183,CA -402525184,402525279,US -402525280,402525295,CA -402525296,402525375,US -402525376,402525415,CA -402525416,402525423,NO -402525424,402525439,CA -402525440,402525695,US -402525696,402525951,CA -402525952,402526079,US -402526080,402526207,CA -402526208,402526527,US -402526528,402526655,CA -402526656,402526671,US -402526672,402526687,CA -402526688,402526719,US -402526720,402526975,CA -402526976,402527359,US -402527360,402527391,CA -402527392,402527615,US -402527616,402528255,CA -402528256,402528383,US -402528384,402528767,CA -402528768,402529023,US -402529024,402529279,CA -402529280,402529535,US -402529536,402529791,CA -402529792,402530047,US -402530048,402530303,CA -402530304,402530559,US -402530560,402531583,CA -402531584,402531839,US -402531840,402531935,CA -402531936,402532031,US -402532032,402532159,CA -402532160,402532231,US -402532232,402532247,CA -402532248,402532255,US -402532256,402532351,CA -402532352,402532607,US -402532608,402532887,CA -402532888,402532895,US -402532896,402532967,CA -402532968,402532975,US -402532976,402532983,CA -402532984,402532991,US -402532992,402533015,CA -402533016,402533023,US -402533024,402533039,CA -402533040,402533055,US -402533056,402533111,CA -402533112,402533279,US -402533280,402533295,CA -402533296,402533311,US -402533312,402533327,CA -402533328,402533343,US -402533344,402533631,CA -402533632,402533759,US -402533760,402533791,CA -402533792,402533887,US -402533888,402533903,CA -402533904,402533919,US -402533920,402533935,CA -402533936,402534015,US -402534016,402534079,CA -402534080,402534095,US -402534096,402534111,CA -402534112,402534143,US -402534144,402534175,CA -402534176,402534255,US -402534256,402534271,CA -402534272,402534319,US -402534320,402534399,CA -402534400,402534479,US -402534480,402534487,CA -402534488,402534655,US -402534656,402535935,CA -402535936,402536191,US -402536192,402536255,CA -402536256,402536287,US -402536288,402536303,CA -402536304,402536351,US -402536352,402536367,CA -402536368,402536383,US -402536384,402536391,CA -402536392,402536399,US -402536400,402536455,CA -402536456,402536463,US -402536464,402536479,CA -402536480,402536527,US -402536528,402536543,CA -402536544,402536575,US -402536576,402536639,CA -402536640,402536703,US -402536704,402536959,CA -402536960,402537215,US -402537216,402537279,CA -402537280,402537367,US -402537368,402538511,CA -402538512,402538687,US -402538688,402538727,CA -402538728,402538751,US -402538752,402538759,CA -402538760,402538767,US -402538768,402538815,CA -402538816,402538863,US -402538864,402538879,CA -402538880,402538895,US -402538896,402538911,CA -402538912,402538927,US -402538928,402538959,CA -402538960,402538975,US -402538976,402539071,CA -402539072,402539087,US -402539088,402539135,CA -402539136,402539199,US -402539200,402539327,CA -402539328,402539455,US -402539456,402539775,CA -402539776,402540031,US -402540032,402541119,CA -402541120,402541247,US -402541248,402541311,CA -402541312,402541567,US -402541568,402541823,CA -402541824,402542079,US -402542080,402542335,CA -402542336,402542591,US -402542592,402542847,CA -402542848,402543135,US -402543136,402543167,CA -402543168,402543295,US -402543296,402543303,CA -402543304,402543311,US -402543312,402543327,CA -402543328,402543343,US -402543344,402543367,CA -402543368,402543375,US -402543376,402543391,CA -402543392,402543487,US -402543488,402543551,CA -402543552,402543583,US -402543584,402543607,CA -402543608,402544415,US -402544416,402544423,CA -402544424,402544479,US -402544480,402544495,CA -402544496,402544511,US -402544512,402544551,CA -402544552,402544591,US -402544592,402544607,CA -402544608,402546687,US -402546688,402546943,CA -402546944,402547455,US -402547456,402547967,CA -402547968,402549247,US -402549248,402550271,CA -402550272,402550527,US -402550528,402550783,GB -402550784,402551039,CA -402551040,402552063,US -402552064,402554879,CA -402554880,402591663,US -402591664,402591671,AU -402591672,402593535,US -402593536,402593543,AU -402593544,402594255,US -402594256,402594263,GB -402594264,402594551,US -402594552,402594559,GB -402594560,402595599,US -402595600,402595607,GB -402595608,402595775,US -402595776,402595783,GB -402595784,402597695,US -402597696,402597703,GB -402597704,402603303,US -402603304,402603311,GB -402603312,402606279,US -402606280,402606287,AU -402606288,402608183,US -402608184,402608191,GB -402608192,402611295,US -402611296,402611303,GB -402611304,402613767,US -402613768,402613775,AU -402613776,402614087,US -402614088,402614095,GB -402614096,402614303,US -402614304,402614311,AU -402614312,402615055,US -402615056,402615063,GB -402615064,405012479,US -405012480,405143551,CA -405143552,405180415,US -405180416,405184511,CA -405184512,405364735,US -405364736,405372927,CA -405372928,405422079,PR -405422080,405798911,US -405798912,405831679,CA -405831680,405843967,US -405843968,405848063,CA -405848064,405864447,PR -405864448,405921791,US -405921792,405929983,CA -405929984,405938175,US -405938176,405962751,CA -405962752,405970943,US -405970944,405979135,CA -405979136,405995519,PR -405995520,406003711,CA -406003712,406011903,US -406011904,406028287,BS -406028288,406052863,US -406052864,406061055,CA -406061056,406110207,US -406110208,406142975,CA -406142976,406147071,US -406147072,406159359,CA -406159360,406175743,US -406175744,406183935,JP -406183936,406216703,CA -406216704,406241279,US -406241280,406257663,PR -406257664,406274047,US -406274048,406290431,PR -406290432,406298623,US -406298624,406306815,PR -406306816,406323199,CA -406323200,406388735,US -406388736,406454271,CA -406454272,406847487,US -406847488,407408639,CA -407408640,407613439,US -407613440,407617535,CA -407617536,407633919,US -407633920,408420351,CA -408420352,408502271,US -408502272,408518655,CA -408518656,408535039,US -408535040,408551423,CA -408551424,408719359,US -408719360,408723455,LC -408723456,409255935,US -409255936,409272319,CA -409272320,409337855,US -409337856,409354239,CA -409354240,409509887,US -409509888,409518079,CA -409518080,409550847,US -409550848,409567231,CA -409567232,409731071,US -409731072,409862143,CA -409862144,410124287,US -410124288,410189823,CA -410189824,410648575,US -410648576,410714111,CA -410714112,411156479,US -411156480,411160575,CA -411160576,411164671,US -411164672,411168767,CA -411168768,411303935,US -411303936,411369471,NL -411369472,411435007,TR -411435008,411500543,DE -411500544,411509759,RS -411509760,411510783,XK -411510784,411566079,RS -411566080,411639807,US -411639808,411664383,CA -411664384,411680767,US -411680768,411688959,CA -411688960,411697151,PR -411697152,411746303,CA -411746304,411762687,PR -411762688,411770879,CA -411770880,411779071,US -411779072,411828223,PR -411828224,411885567,US -411885568,411975679,CA -411975680,411979775,US -411979776,411983871,CA -411983872,411988991,US -411988992,411989247,GB -411989248,412057599,US -412057600,412073983,CA -412073984,412221439,US -412221440,412254207,CA -412254208,412483583,US -412483584,412549119,CA -412549120,412614655,US -412647424,412680191,US -412680192,412688383,CA -412688384,412704767,US -412704768,412708863,CA -412708864,412909567,US -412909568,412942335,CA -412942336,412946431,US -412946432,412950527,PR -412950528,412958719,US -412958720,413007871,CA -413007872,413908991,US -413908992,413925375,PR -413925376,415760383,US -415760384,416022527,CA -416022528,416059391,US -416059392,416088063,CA -416088064,416153599,US -416153600,416161791,BS -416161792,416219135,US -416219136,416251903,CA -416251904,416546815,US -416546816,416612351,CA -416612352,416628735,US -416628736,416636927,CA -416636928,416743423,US -416743424,416776191,CA -416776192,417202175,US -417202176,417267711,CA -417267712,417366015,US -417366016,417398783,CA -417398784,417431551,US -417431552,417529855,CA -417529856,417538047,PR -417538048,417726463,US -417726464,417734655,HK -417734656,417775615,US -417775616,417796095,CA -417796096,417800191,US -417800192,417808383,BS -417808384,417820671,CA -417820672,417857535,US -417857536,417923071,AR -417923072,418060287,US -418060288,418062335,HK -418062336,418070527,CA -418070528,418078719,US -418078720,418119679,CA -418119680,418164095,US -418164096,418164223,AS -418164224,418316287,US -418316288,418320383,CA -418320384,418643967,US -418643968,418668543,CA -418668544,418672639,US -418672640,418676735,CA -418676736,418693119,BS -418693120,418709503,CA -418709504,418766847,US -418766848,418770943,CA -418770944,418775039,US -418775040,418799615,CA -418799616,419430399,US -419430400,426470229,GB -426470230,426470230,IT -426470231,436207615,GB -436207616,452984831,US -452984832,452985855,JP -452985856,452986879,MY -452986880,452987143,SG -452987144,452987147,BD -452987148,452987399,SG -452987400,452987403,BD -452987404,452987903,SG -452987904,452988927,VN -452988928,452997119,JP -452997120,453001215,IN -453001216,453009407,AU -453009408,453017599,BD -453017600,453019647,CN -453019648,453023743,IN -453023744,453024767,TW -453024768,453025791,HK -453025792,453027839,CN -453027840,453031935,IN -453031936,453032959,PK -453032960,453033983,CN -453033984,453035007,HK -453035008,453036031,ID -453036032,453037055,IN -453037056,453040127,CN -453040128,453044223,IN -453044224,453044479,HK -453044480,453044735,AT -453044736,453044991,JP -453044992,453045247,IN -453045248,453046271,KR -453046272,453047295,VN -453047296,453050367,IN -453050368,453115903,KR -453115904,453246975,VN -453246976,453509119,IN -453509120,455081983,CN -455081984,455213055,AU -455213056,455245823,NP -455245824,455258111,JP -455258112,455258623,SG -455258624,455258688,KH -455258689,455260671,SG -455260672,455260674,KH -455260675,455260927,SG -455260928,455260960,KH -455260961,455262207,SG -455262208,455270399,JP -455270400,455272447,AU -455272448,455274495,CN -455274496,455278591,IN -455278592,455344127,KR -455344128,456130559,CN -456130560,456261631,IN -456261632,456262655,PH -456262656,456263679,IN -456263680,456264703,AU -456264704,456265727,JP -456265728,456269823,ID -456269824,456271871,HK -456271872,456273919,CN -456273920,456278015,HK -456278016,456286207,AU -456286208,456294399,JP -456294400,456327167,CN -456327168,456523775,TW -456523776,456540159,SG -456540160,456542207,AU -456542208,456544255,CN -456544256,456548351,AU -456548352,456553471,JP -456553472,456554495,ID -456554496,456555519,PK -456555520,456556543,JP -456556544,456560639,AU -456560640,456562687,BD -456562688,456564735,CN -456564736,456572927,IN -456572928,456589311,CN -456589312,456654847,TH -456654848,457179135,IN -457179136,458227711,VN -458227712,459282431,JP -459282432,459284479,TK -459284480,459292671,JP -459292672,459293695,NZ -459293696,459297791,JP -459297792,459299839,IN -459299840,459300863,PK -459300864,459309055,SG -459309056,459325439,KR -459325440,459333631,AU -459333632,459341823,TW -459341824,459407359,IN -459407360,459456511,JP -459456512,459460607,HK -459460608,459472895,CN -459472896,459505663,AU -459505664,459538431,CN -459538432,459539455,AU -459540480,459541503,JP -459541504,459542527,IN -459542528,459543295,HK -459543296,459543551,TW -459543552,459544319,MO -459544320,459544575,SG -459544576,459545599,IN -459545600,459547647,JP -459547648,459548159,AU -459548160,459548415,HK -459548416,459548671,AU -459548672,459550719,TH -459550720,459554815,JP -459554816,459571199,TW -459571200,459735039,KR -459735040,459800575,CN -459800576,459866111,SG -459866112,459931647,TW -459931648,459964415,IN -459964416,459980799,CN -459980800,459983871,AU -459983872,459984895,CN -459984896,459986943,JP -459986944,459988991,PH -459988992,459997183,JP -459997184,460062719,IN -460062720,460128255,PH -460128256,460136447,IN -460136448,460144639,CN -460144640,460152831,PH -460152832,460154879,JP -460154880,460155903,SG -460155904,460156927,AU -460156928,460158975,KH -460158976,460159999,JP -460160000,460161023,CN -460161024,460193791,MO -460193792,460210175,JP -460210176,460214271,HK -460214272,460218367,MY -460218368,460224511,JP -460224512,460226559,NZ -460226560,460259327,PH -460259328,460261375,AU -460261376,460262399,KH -460262400,460262655,US -460262656,460262911,AU -460262912,460263167,NZ -460263168,460263423,GB -460263424,460267519,NP -460267520,460275711,ID -460275712,460277759,AU -460277760,460278783,IN -460278784,460279807,JP -460279808,460283903,AU -460283904,460292095,KR -460292096,460300287,JP -460300288,460312575,HK -460312576,460320767,SG -460320768,460324863,AU -460324864,460341247,CN -460341248,460343295,ID -460343296,460344319,AU -460344320,460345343,ID -460345344,460349439,CN -460349440,460350463,HK -460350464,460351487,AU -460351488,460353535,JP -460353536,460355583,CN -460355584,460356607,IN -460356608,460357631,JP -460357632,460423167,KR -460423168,460439551,CN -460439552,460451839,JP -460451840,460453887,AU -460453888,460454911,JP -460454912,460455935,IN -460455936,460488703,JP -460488704,460505087,MV -460505088,460521471,SG -460521472,460554239,CN -460554240,460587007,KR -460587008,460591103,JP -460591104,460593151,IN -460593152,460595199,JP -460595200,460595711,SG -460595712,460596223,JP -460596224,460597247,AU -460597248,460598271,IN -460598272,460599295,CN -460599296,460601343,IN -460601344,460602367,AF -460602368,460603391,KH -460603392,460718079,KR -460718080,460722175,JP -460722176,460726271,VN -460726272,460734463,IN -460734464,460865535,KR -460865536,460931071,JP -460931072,460933119,AU -460933120,460935167,CN -460935168,460937215,ID -460937216,460938239,AU -460938240,460939263,JP -460939264,460940287,NZ -460940288,460941311,IN -460941312,460942335,AU -460942336,460943359,MY -460943360,460945407,AU -460945408,460947455,CN -460947456,460980223,JP -460980224,460981247,NC -460981248,460983295,JP -460983296,460984319,HK -460984320,460988415,PG -460988416,460994559,JP -460994560,460995071,HK -460995072,460995583,SG -460995584,460996607,IN -460996608,461008895,JP -461008896,461012991,AU -461012992,461045759,KR -461045760,461047807,ID -461047808,461049855,JP -461049856,461050111,TH -461050112,461050367,SG -461050368,461050879,TH -461050880,461051903,NZ -461051904,461054975,AU -461054976,461055999,HK -461056000,461058047,AU -461058048,461062143,HK -461062144,461078527,IN -461078528,461094911,FJ -461094912,461096959,HK -461096960,461099007,TW -461099008,461100031,JP -461100032,461101055,MN -461101056,461102079,IN -461102080,461103103,ID -461103104,461104127,AU -461104128,461104383,CN -461104384,461104639,HK -461104640,461105151,JP -461105152,461106175,CN -461106176,461107199,JP -461107200,461108223,IN -461108224,461109247,BD -461109248,461110271,IN -461110272,461111295,BD -461111296,461127679,IN -461127680,461131775,PH -461131776,461135871,ID -461135872,461143329,AU -461143330,461143331,US -461143332,461144063,AU -461144064,461209599,KR -461209600,461225983,SG -461225984,461227007,WF -461227008,461228031,SG -461228032,461229055,IN -461229056,461230079,JP -461230080,461234175,AU -461234176,461242367,MY -461242368,461258751,KR -461258752,461279231,JP -461279232,461281279,AU -461281280,461282303,PH -461282304,461283327,MY -461283328,461287423,JP -461287424,461294591,HK -461294592,461298687,US -461298688,461301759,HK -461301760,461302527,US -461302528,461307903,HK -461307904,461357055,JP -461357056,461369343,AU -461369344,461373439,JP -461373440,461504511,CN -461504512,461570047,TH -461570048,461572095,ID -461572096,461573119,JP -461573120,461574143,BD -461574144,461578239,JP -461578240,461586431,MY -461586432,461602815,AU -461602816,461619199,TH -461619200,461623295,JP -461623296,461625343,IN -461625344,461626367,AU -461626368,461627391,CN -461627392,461633535,JP -461633536,461635583,ID -461635584,462422015,JP -462422016,462487551,CN -462487552,462553087,TH -462553088,462618623,MY -462618624,462635007,TW -462635008,462651391,JP -462651392,462684159,BD -462684160,463470591,CN -463470592,465043455,KR -465043456,467927039,CN -467927040,468189183,JP -468189184,468713471,KR -468713472,469237759,TW -469237760,469499903,IN -469499904,469565439,NZ -469565440,469598207,AU -469598208,469630975,JP -469630976,469696511,TH -469696512,469712895,PK -469712896,469729279,KR -469729280,469762047,IN -469762048,520093695,US -520093696,520257535,PL -520257536,520290303,IR -520290304,520292351,TR -520292352,520294399,NL -520294400,520296447,RU -520296448,520298495,UA -520298496,520306687,SK -520306688,520308735,GB -520308736,520310783,DK -520310784,520312831,DE -520312832,520314879,MK -520314880,520318975,NL -520318976,520323071,ES -520323072,520325119,CH -520325120,520327167,FR -520327168,520329215,DE -520329216,520330239,SE -520330240,520330751,NL -520330752,520331263,SE -520331264,520339455,IT -520339456,520343551,UA -520343552,520355839,GB -520355840,520421375,ES -520421376,520486911,RO -520486912,520488959,NL -520488960,520489215,UA -520489216,520489471,CH -520489472,520489727,EG -520489728,520489983,GR -520489984,520490020,RU -520490021,520490021,NL -520490022,520490495,RU -520490496,520490751,RO -520490752,520491007,RU -520491008,520491263,LI -520491264,520491391,IS -520491392,520491647,AE -520491648,520491775,IS -520491776,520492031,IE -520492032,520492799,IT -520492800,520493055,LV -520493056,520493311,BE -520493312,520493567,SK -520493568,520493695,DE -520493696,520493823,PT -520493824,520494079,FI -520494080,520494335,FR -520494336,520494591,CZ -520494592,520494847,CH -520494848,520495103,DK -520495104,520495359,SE -520495360,520495615,BE -520495616,520495871,SE -520495872,520496383,DE -520496384,520496639,TR -520496640,520496767,CZ -520496768,520496895,TR -520496896,520497151,ES -520497152,520497407,FR -520497408,520497919,CH -520497920,520498175,FR -520498176,520498431,CH -520498432,520498687,SE -520498688,520499711,FR -520499712,520500223,DK -520500224,520500479,LU -520500480,520500735,DE -520500736,520500991,LT -520500992,520501247,AT -520501248,520501503,LU -520501504,520501759,NO -520501760,520502015,PK -520502016,520502271,SI -520502272,520502527,IE -520502528,520502783,BG -520502784,520503295,GB -520503296,520505343,PL -520505344,520507391,GB -520507392,520511487,TR -520511488,520519679,UA -520519680,520552447,PL -520552448,520554495,NL -520554496,520556543,GB -520556544,520560639,FI -520560640,520562687,TR -520562688,520564735,PL -520564736,520566783,IE -520566784,520568831,CH -520568832,520589311,IR -520589312,520593407,IT -520593408,520595455,AM -520595456,520597503,MK -520597504,520601599,DE -520601600,520609791,SI -520609792,520613887,RU -520613888,520615935,CZ -520615936,520617983,FR -520617984,520683519,RU -520683520,520749055,SY -520749056,520753151,RU -520753152,520757247,LI -520757248,520761343,GB -520761344,520763391,IT -520763392,520765439,CZ -520765440,520781823,RU -520781824,520822783,CH -520822784,520824831,IT -520824832,520826879,US -520826880,520828927,QA -520828928,520830975,NL -520830976,520847359,MK -520847360,520880127,PL -520880128,520882175,AT -520882176,520884223,IT -520884224,520888319,MK -520888320,520896511,DE -520896512,520898303,BE -520898304,520898559,US -520900608,520902655,GB -520902656,520902784,NL -520902785,520912895,GB -520912896,520945663,UA -520945664,520947711,GB -520947712,520949759,SE -520949760,520951807,RU -520951808,520953855,IE -520953856,520962047,RU -520962048,520962310,IE -520962311,520962311,US -520962312,520963327,IE -520963328,520963839,US -520963840,520964354,IE -520964355,520964355,US -520964356,520965119,IE -520965120,520965631,US -520965632,520978431,IE -520978432,520980479,RU -520980480,520982527,IT -520982528,520984575,RU -520984576,520984641,GB -520984642,520984643,US -520984644,520986623,GB -520986624,520988671,PS -520988672,520990719,DE -520990720,520992767,RU -520994816,521006079,BG -521006080,521007103,DE -521007104,521011199,BG -521011200,521013247,FR -521013248,521014015,RO -521014016,521014271,NL -521014272,521018367,RO -521018368,521018623,IT -521018624,521019135,RO -521019136,521019391,GB -521019392,521019647,NL -521019648,521019903,BG -521019904,521022463,RO -521022464,521022719,NL -521022720,521022975,RO -521022976,521023487,DE -521023488,521023743,NL -521023744,521023999,RO -521024000,521024511,BE -521024512,521024767,TR -521024768,521026559,RO -521026560,521027583,ES -521027584,521027839,RO -521027840,521028607,GB -521028608,521028863,RU -521028864,521029119,RO -521029120,521029375,ES -521029376,521029631,US -521029632,521030655,GB -521030656,521031679,PL -521031680,521035775,IR -521035776,521037567,RO -521037568,521037823,TH -521037824,521039871,RO -521039872,521043967,IR -521043968,521048063,IT -521048064,521052159,IR -521052160,521053183,RO -521053184,521054207,SY -521054208,521056255,GR -521056256,521057279,LT -521057280,521058303,MD -521058304,521060351,IT -521060352,521062399,RO -521062400,521064447,ES -521064448,521066495,GR -521066496,521072639,RO -521072640,521074687,GR -521074688,521074943,EG -521074944,521075199,RO -521075200,521075327,FR -521075328,521075455,RO -521075456,521075711,EG -521075712,521076479,RO -521076480,521076735,IN -521076736,521078783,ES -521078784,521080831,CZ -521080832,521082879,RU -521082880,521084927,FR -521084928,521093119,SE -521093120,521095167,DE -521095168,521097215,IT -521097216,521101311,RU -521101312,521103359,IT -521103360,521105407,GB -521105408,521107455,IS -521107456,521109503,FI -521109504,521142271,SI -521142272,521404415,DE -521404416,521535487,NL -521535488,521537535,GB -521539584,521541631,BE -521541632,521543679,DE -521543680,521545727,RU -521545728,521547775,GB -521547776,521551871,AL -521551872,521553919,DE -521553920,521555967,GB -521555968,521558015,NL -521558016,521560063,CY -521560064,521562111,PL -521562112,521563135,GB -521563136,521564159,NL -521564160,521565183,GR -521565184,521565439,GB -521565440,521566207,GR -521566208,521568255,LU -521568256,521601023,PT -521601024,521666559,RU -521666560,521668607,GB -521668608,521670655,CH -521670656,521670911,HU -521670912,521671935,DE -521671936,521672703,HU -521672704,521674751,RU -521674752,521676799,GB -521676800,521678847,ES -521678848,521680895,NL -521680896,521682943,EE -521682944,521683679,SE -521683680,521683695,FI -521683696,521683711,NO -521683712,521687039,SE -521687040,521689087,GB -521689088,521691135,BY -521691136,521693183,DE -521693184,521695231,GB -521695232,521697279,BE -521697280,521699327,ES -521699328,521701375,NO -521701376,521703423,IT -521703424,521705471,DE -521705472,521707519,ES -521707520,521709567,NL -521709568,521711615,DE -521711616,521713663,SK -521713664,521715711,HU -521715712,521717759,LV -521717760,521718783,IQ -521718784,521719807,IR -521719808,521721855,UA -521721856,521724159,GB -521724160,521724415,AU -521724416,521724671,GB -521724672,521724927,NL -521724928,521725951,GB -521725952,521727999,IR -521728000,521732095,FR -521732096,521736191,GB -521736192,521738239,DK -521738240,521740287,RU -521740288,521742335,IT -521742336,521746431,DE -521746432,521748479,GB -521748480,521750527,SE -521750528,521752575,PS -521752576,521754623,IE -521754624,521756671,IR -521756672,521758719,NL -521758720,521760767,IR -521760768,521762815,IL -521762816,521764863,CH -521764864,521766911,IR -521766912,521768959,IQ -521768960,521771007,FI -521771008,521773055,DE -521773056,521775103,GB -521775104,521777151,TR -521777152,521779199,ES -521779200,521783295,GB -521783296,521785343,RU -521785344,521787391,GB -521787392,521789439,NO -521789440,521791487,RU -521791488,521793535,IR -521793536,521795583,RU -521795584,521797631,PL -521797632,521928703,IT -521928704,521929087,RU -521929088,521929151,UA -521929152,521945087,RU -521945088,521953279,GB -521953280,521961471,RU -521961472,521969663,CZ -521969664,521977855,UA -521977856,521986047,RU -521986048,521994239,UA -521994240,522002431,KG -522002432,522010623,IR -522010624,522018815,AE -522018816,522027007,FR -522027008,522059775,RU -522059776,522125311,CZ -522125312,522133503,MD -522133504,522135551,NL -522135552,522137599,IT -522137600,522141695,CH -522141696,522143743,RU -522143744,522145791,CZ -522145792,522147839,DK -522147840,522149887,ES -522149888,522158079,UA -522158080,522166271,BE -522166272,522168319,SE -522168320,522170367,PL -522170368,522174463,YE -522174464,522178559,RU -522178560,522180607,DE -522180608,522182655,KZ -522182656,522190847,CZ -522190848,522715135,FR -522715136,522717183,IR -522717184,522719231,RU -522719232,522721279,UA -522721280,522723327,UZ -522723328,522741759,RU -522741760,522743807,UA -522743808,522747903,RU -522747904,522758143,UA -522758144,522759167,RU -522759168,522764287,UA -522780672,522782719,RU -522782720,522784767,UA -522784768,522786815,BG -522786816,522788863,PL -522788864,522792959,RU -522792960,522795007,UA -522795008,522797055,RU -522797056,522801151,UA -522801152,522803199,PL -522803200,522805247,UA -522805248,522807295,RU -522807296,522811391,UA -522811392,522813439,RU -522813440,522815487,UA -522815488,522819583,PL -522819584,522821631,KG -522821632,522823679,RU -522823680,522827775,PL -522827776,522831871,RU -522831872,522833919,CZ -522833920,522835967,PL -522835968,522838015,UA -522838016,522840063,RU -522840064,522842111,PL -522842112,522846207,RU -522846208,522854399,PL -522854400,522858495,RU -522858496,522866687,UA -522866688,522870783,LV -522870784,522874879,RU -522874880,522878975,UA -522878976,522887167,RO -522887168,522895359,UA -522895360,522911743,RU -522911744,522960895,UA -522960896,522969087,RU -522969088,522977279,UA -522977280,522981375,RU -522981376,522985471,IT -522985472,522989567,CH -522989568,522993663,RU -522993664,522997759,AL -522997760,523001855,RU -523001856,523003903,LT -523003904,523004159,IL -523004160,523004415,AE -523004416,523004671,TR -523004672,523004927,ES -523004928,523005183,BE -523005184,523005951,CH -523005952,523010047,IT -523010048,523014143,IL -523014144,523018239,ES -523018240,523022335,IT -523022336,523024895,RU -523024896,523025407,DE -523025408,523025663,UA -523025664,523025919,CH -523025920,523026175,UA -523026176,523026431,GB -523026432,523030527,TR -523030528,523034623,FR -523034624,523038719,SE -523038720,523042815,RU -523042816,523075583,NO -523075584,523108351,HR -523108352,523173887,HU -523173888,523182079,BA -523182080,523190271,IR -523190272,523192319,FI -523192320,523194367,ES -523194368,523196415,DE -523196416,523198463,AE -523198464,523202559,CZ -523202560,523223039,RU -523223040,523225087,AM -523225088,523227135,SE -523227136,523229183,RO -523229184,523231231,GB -523231232,523239423,DE -523239424,523763711,GB -523763712,524025855,IR -524025856,524287999,PL -524288000,528482303,GB -528482304,528490495,PL -528490496,528498687,RU -528498688,528515071,UA -528515072,528523263,RU -528523264,528531455,UA -528531456,528539647,RU -528539648,528547839,UA -528547840,528564223,RU -528564224,528572415,UA -528572416,528588799,RU -528588800,528596991,UA -528596992,528605183,RU -528605184,528613375,UA -528613376,528637951,RU -528637952,528642047,PL -528642048,528654335,RU -528654336,528656383,SK -528656384,528658431,CZ -528658432,528662527,IR -528662528,528664575,RU -528664576,528666623,BY -528666624,528668671,RU -528668672,528670719,PL -528670720,528674815,SG -528674816,528676863,RO -528676864,528678911,RU -528678912,528680959,MD -528680960,528683007,RO -528683008,528684031,UA -528684032,528684543,NL -528684544,528685823,UA -528685824,528687103,US -528687104,528689151,UA -528689152,528691199,RO -528691200,528695295,PL -528695296,528703487,RU -528703488,528715775,UA -528715776,528719871,RU -528719872,528721919,RO -528721920,528723967,PL -528723968,528726015,ES -528726016,528736255,RU -528736256,528740351,SK -528740352,528742399,IT -528742400,528744447,RU -528744448,528746495,GB -528748544,528752639,CZ -528760832,528762879,PL -528762880,528764927,AM -528764928,528769023,KZ -528769024,528793599,RU -528793600,528795647,RO -528795648,528797695,NL -528797696,528809983,RU -528809984,528812031,PL -528812032,528814079,CZ -528814080,528816127,PL -528816128,528818175,RO -528818176,528834559,UA -528836608,528838655,RU -528838656,528840703,UA -528840704,528842751,RU -528842752,528859135,SG -528859136,528861183,RO -528861184,528863231,RU -528863232,528867327,KZ -528867328,528887807,RU -528887808,528891903,PL -528891904,528900095,UA -528900096,528902143,SK -528902144,528908287,UA -528908288,528926719,RU -528926720,528928767,NL -528928768,528930815,UA -528930816,528932863,CZ -528932864,528941055,RU -528941056,528943103,RO -528943104,528945151,RU -528945152,528949247,PL -528949248,528965631,RU -528965632,528982015,UA -528982016,528986111,PL -528986112,528988159,UA -528988160,528990207,RU -528990208,528994303,PL -528994304,528996351,UZ -528996352,528998399,LT -528998400,529006591,RU -529006592,529268735,NL -529268736,529530879,TR -529530880,529596415,UA -529596416,529661951,TR -529661952,529727487,GE -529727488,529793023,HR -529793024,529793279,CZ -529793280,529798655,RU -529798656,529798911,KZ -529798912,529799167,UA -529799168,529799423,RU -529799424,529799679,UA -529799680,529800191,RU -529800192,529800703,UA -529800704,529800959,CZ -529800960,529806079,RU -529806080,529809407,UA -529809408,529817855,RU -529817856,529818367,CZ -529818368,529826303,RU -529826304,529826815,CZ -529826816,529827327,MD -529827328,529827839,UA -529827840,529828863,RU -529828864,529829887,KZ -529829888,529830911,UZ -529830912,529831935,RU -529831936,529833983,SY -529833984,529838079,RU -529838080,529842175,UA -529842176,529843199,ES -529843200,529843711,RU -529843712,529844223,BY -529844224,529844735,CZ -529844736,529845503,RU -529845504,529846271,UA -529846272,529847295,UZ -529847296,529848319,GB -529848320,529848575,NL -529848576,529848831,CZ -529848832,529849087,UA -529849088,529849599,NL -529849600,529849855,UA -529849856,529850111,CZ -529850112,529850367,RU -529850368,529855487,ES -529855488,529856511,RU -529856512,529856530,BY -529856531,529856531,RU -529856532,529857535,BY -529857536,529858559,UA -529858560,529924095,NL -529924096,529989631,DE -529989632,530055167,NL -530055168,530120703,GR -530120704,530186239,CY -530186240,530251775,IL -530251776,530317311,TR -530317312,530579455,IT -530579456,530648143,NL -530648144,530648151,GB -530648152,530710527,NL -530710528,530841599,RU -530841600,530972671,CH -530972672,531103743,SA -531103744,531169279,IL -531169280,531177471,KZ -531177472,531179519,GB -531179520,531181567,FR -531181568,531183615,NO -531183616,531185663,NL -531185664,531193855,TR -531193856,531195903,IE -531195904,531197951,IT -531197952,531199999,GB -531202048,531234815,CZ -531234816,531236863,IE -531236864,531238911,FR -531238912,531240959,LV -531240960,531243007,SE -531243008,531245055,RU -531245056,531247103,IT -531247104,531251199,IR -531251200,531259391,SK -531261440,531263487,DE -531263488,531265535,RU -531265536,531267583,GB -531267584,531275775,UA -531275776,531276799,US -531276800,531277311,GB -531277312,531277823,US -531277824,531279871,RU -531279872,531281919,CZ -531281920,531283967,RU -531283968,531292159,DE -531292160,531333119,AZ -531333120,531334143,NL -531334144,531334399,US -531334400,531334527,NL -531334528,531335167,US -531335168,531337215,IT -531337216,531339263,CH -531339264,531341311,AL -531341312,531349503,KZ -531349504,531351551,RU -531351552,531355647,NL -531355648,531357695,IR -531357696,531361791,HU -531361792,531367935,CH -531367936,531369983,DE -531369984,531372031,CH -531372032,531372287,DE -531372288,531372543,CH -531372544,531372799,DE -531372800,531373055,CH -531373056,531374144,DE -531374145,531376127,CH -531376128,531377151,DE -531377152,531382271,CH -531382272,531390463,DE -531390464,531392511,CH -531392512,531398655,DE -531398656,531400703,RU -531400704,531402751,UA -531402752,531404799,LU -531404800,531406847,FI -531406848,531408895,FR -531410944,531415039,PL -531415040,531423231,RU -531425280,531427327,FR -531427328,531427503,GB -531427504,531427511,IT -531427512,531427967,GB -531427968,531427983,IT -531427984,531428191,GB -531428192,531428199,IT -531428200,531428263,GB -531428264,531428271,IT -531428272,531428279,GB -531428280,531428287,IT -531428288,531428351,GB -531428352,531428359,IT -531428360,531428487,GB -531428488,531428495,IT -531428496,531428599,GB -531428600,531428607,IT -531428608,531430319,GB -531430320,531430327,IT -531430328,531430407,GB -531430408,531430415,IT -531430416,531430823,GB -531430824,531430831,IT -531430832,531430911,GB -531430912,531430919,IT -531430920,531431423,GB -531431424,531496959,RU -531496960,531628031,PL -531628032,531660799,TR -531660800,531693567,BA -531693568,531695615,RU -531695616,531697663,LT -531697664,531699711,GB -531699712,531701759,CZ -531701760,531703807,NL -531703808,531705855,IT -531705856,531707903,ES -531707904,531709951,GR -531709952,531718143,RU -531718144,531720191,ES -531720192,531722239,RU -531722240,531724287,IT -531724288,531726335,DE -531726336,531759103,TR -531759104,531890175,PL -531890176,532021247,RU -532021248,532152319,PL -532152320,532168703,DE -532168704,532185087,NL -532185088,532201471,IR -532201472,532209663,RU -532209664,532210687,DE -532210688,532212223,RU -532212224,532212479,ME -532212480,532213759,RU -532213760,532214015,GB -532214016,532214783,RU -532214784,532215807,UA -532215808,532221951,RU -532221952,532223999,IT -532224000,532226047,NO -532226048,532234239,GB -532234240,532242431,DK -532242432,532244479,IT -532244480,532246527,DE -532246528,532250623,BA -532250624,532283391,GB -532283392,532291583,TR -532291584,532293631,IE -532293632,532295679,IT -532295680,532297727,KG -532297728,532303871,RU -532303872,532305919,PL -532305920,532307967,NO -532307968,532310015,RU -532310016,532312063,GR -532312064,532312983,JE -532312984,532312991,GB -532312992,532314111,JE -532314112,532316159,DE -532316160,532324351,RU -532324352,532328447,NL -532328448,532330495,PS -532330496,532332543,CZ -532332544,532340735,SK -532340736,532341503,GB -532341504,532341759,DE -532341760,532343967,GB -532343968,532343983,US -532343984,532344319,GB -532344320,532344371,FR -532344372,532344372,GB -532344373,532344575,FR -532344576,532346367,GB -532346368,532346623,NL -532346624,532347391,GB -532347392,532347903,DE -532347904,532348927,GB -532348928,532365311,IE -532365312,532365567,NL -532365568,532365631,AE -532365632,532365695,PK -532365696,532365759,SA -532365760,532365823,TW -532365824,532366079,DE -532366080,532366207,NL -532366208,532366239,AR -532366240,532366271,PA -532366272,532366847,DE -532366848,532367359,GB -532367360,532368383,US -532368384,532368639,NL -532368640,532370431,DE -532370432,532371455,FI -532371456,532372479,DE -532372480,532372735,NL -532372736,532372767,GB -532372768,532372783,CA -532372784,532372799,BR -532372800,532372815,MX -532372816,532372831,PL -532372832,532372863,FR -532372864,532372895,IT -532372896,532372959,SE -532372960,532372991,RU -532372992,532373247,NL -532373248,532373343,DE -532373344,532373503,NL -532373504,532375551,RU -532375552,532377599,IT -532377600,532381695,DE -532381696,532414463,NL -532414464,532676607,IT -532676608,532684799,GE -532684800,532689919,RU -532689920,532690943,GE -532690944,532692991,RU -532692992,532701153,CZ -532701154,532701154,SK -532701155,532701183,CZ -532701184,532703231,GB -532703232,532704511,RU -532704512,532705023,NL -532705024,532705279,RU -532705280,532709375,NL -532709376,532725759,RU -532725760,532729855,SE -532729856,532731903,TR -532731904,532733951,PL -532733952,532735999,SE -532736000,532738047,RU -532738048,532740095,GB -532740096,532742143,KG -532742144,532746239,GB -532746240,532750335,IT -532750336,532751359,SM -532751360,532752383,IT -532752384,532754431,BE -532754432,532756479,FR -532756480,532758527,IT -532758528,532762623,SY -532762624,532766719,UA -532766720,532768767,PL -532768768,532770815,NL -532770816,532772863,IR -532772864,532774911,RU -532774912,532779007,GB -532779008,532783103,IR -532783104,532785151,AT -532785152,532787199,GB -532787200,532789247,BE -532789248,532791295,DK -532791296,532793343,LT -532793344,532795391,SE -532795392,532797439,CH -532797440,532799231,IE -532799232,532799487,GB -532799488,532801535,ES -532801536,532803583,DK -532803584,532805631,FR -532805632,532807679,SE -532807680,533200895,IT -533200896,533233663,TR -533233664,533250047,IE -533250048,533254143,RU -533254144,533256191,NL -533256192,533262335,RU -533262336,533264383,ES -533264384,533266431,RU -533266432,533331967,NL -533331968,533397503,UA -533397504,533463039,KW -533463040,533479423,RU -533479424,533479519,DE -533479520,533479551,FI -533479552,533479743,DE -533479744,533479775,FI -533479776,533480031,DE -533480032,533480063,FI -533480064,533481471,DE -533481472,533483519,NO -533483520,533485567,FR -533485568,533487615,LU -533487616,533491711,RU -533491712,533495807,DE -533495808,533500159,NL -533500160,533500415,JP -533500416,533503999,NL -533504000,533512191,RU -533512192,533528575,ME -533528576,533594111,GB -533594112,533659647,TR -533659648,533667839,US -533667840,533669887,FR -533669888,533670911,GB -533670912,533673983,NL -533673984,533675007,US -533675008,533676031,NL -533676032,533680127,RU -533680128,533682175,TR -533682176,533684223,ES -533684224,533692415,IT -533692416,533725183,RU -533725184,533734393,SE -533734394,533734394,DK -533734395,533807103,SE -533807104,533811199,LT -533811200,533815295,DE -533815296,533815296,TR -533815297,533816319,CY -533816320,533816320,TR -533816321,533817343,CY -533817344,533817344,TR -533817345,533819391,CY -533819392,533823487,DE -533823488,533825535,BE -533825536,533831679,IS -533831680,533835775,DE -533835776,533837823,SE -533837824,533839871,DE -533839872,533856255,IS -533856256,533858303,FR -533858304,533858751,TR -533858752,533858815,AT -533858816,533858895,TR -533858896,533858903,AT -533858904,533859071,TR -533859072,533859087,AT -533859088,533859647,TR -533859648,533859663,AT -533859664,533860351,TR -533862400,533864447,GB -533864448,533889023,TR -533889024,533891071,GB -533891072,533893119,RU -533895168,533897215,TR -533897216,533899263,DE -533899264,533901311,RU -533901312,533905407,IL -533905408,533913599,RU -533913600,533915647,ES -533915648,533919743,GB -533919744,533921791,SE -533921792,533954559,RU -533954560,533962751,BG -533962752,533964799,GB -533964800,533966847,NO -533966848,533968895,DE -533968896,533970943,ES -533970944,533987327,SE -533987328,534118399,DE -534118400,534151167,KW -534151168,534151423,US -534151424,534151679,TR -534151680,534152191,DE -534152192,534152703,IR -534152704,534153471,DE -534153472,534153983,PL -534153984,534154239,ES -534154240,534154495,PL -534154496,534155519,DE -534155520,534155775,PL -534155776,534156287,IR -534156288,534157311,DE -534157312,534157567,TR -534157568,534157823,IT -534157824,534158079,IR -534158080,534158591,ES -534158592,534158847,NL -534158848,534161407,DE -534161408,534163455,IR -534163456,534167551,ES -534167552,534169599,DE -534169600,534170111,IR -534170112,534176767,DE -534176768,534177791,IR -534177792,534181887,DE -534181888,534183935,IR -534183936,534249471,AE -534249472,534253567,GB -534253568,534254607,FR -534254608,534254623,US -534254624,534257663,FR -534257664,534259711,SE -534259712,534261759,CH -534261760,534263807,GB -534263808,534265855,PL -534265856,534282239,CY -534284288,534286335,SE -534286336,534288383,LU -534288384,534290431,IT -534290432,534296575,RU -534296576,534298623,BA -534298624,534306815,HR -534306816,534308863,SE -534308864,534310911,IE -534310912,534315007,IT -534315008,534347775,HR -534347776,534348031,US -534348032,534348287,GB -534348288,534348543,US -534348544,534348831,GB -534348832,534348847,CA -534348848,534349071,GB -534349072,534349079,US -534349080,534355967,GB -534355968,534364159,GR -534364160,534366207,FI -534366208,534368255,IT -534368256,534370303,IR -534370304,534372351,AT -534372352,534374399,KW -534374400,534376447,FR -534376448,534378495,IE -534380544,534511615,AE -534511616,534511871,NL -534511872,534512639,BZ -534512640,534512895,NL -534512896,534513151,SE -534513152,534513215,BS -534513216,534513279,VG -534513280,534513407,NL -534513408,534513663,SE -534513664,534514687,US -534514688,534515199,DE -534515200,534515455,US -534515456,534515711,SE -534515712,534515967,GB -534515968,534516735,US -534516736,534516991,GB -534516992,534517759,US -534517760,534518783,NL -534518784,534518847,ES -534518848,534518911,FI -534518912,534518975,FR -534518976,534519039,AU -534519040,534519167,AL -534519168,534519199,GB -534519200,534519231,VA -534519232,534519263,AQ -534519264,534519295,IT -534519296,534519327,NL -534519328,534519359,PK -534519360,534519391,PE -534519392,534519423,PK -534519424,534519455,FJ -534519456,534519487,BR -534519488,534519519,MX -534519520,534519551,CN -534519552,534519807,NL -534519808,534521855,US -534521856,534522367,DE -534522368,534523391,NL -534523392,534530047,US -534530048,534538239,ES -534538240,534538751,US -534538752,534539007,GB -534539008,534540287,US -534540288,534544383,DE -534544384,534546431,RO -534546432,534548479,DE -534548480,534550527,PL -534550528,534560767,RU -534560768,534573823,GB -534573824,534574079,NL -534574080,534597887,GB -534597888,534598095,US -534598096,534598111,GB -534598112,534598143,US -534598144,534609919,GB -534609920,534642687,ES -534642688,534645759,CZ -534645760,534646271,PL -534646272,534646783,CZ -534646784,534648831,PL -534648832,534650879,CH -534650880,534652927,RU -534652928,534654975,AL -534654976,534663167,GB -534663168,534675455,ES -534675456,534691839,GB -534691840,534693887,FR -534693888,534695935,NL -534695936,534700031,GB -534700032,534708223,JO -534708224,534740991,TR -534740992,534749183,BA -534749184,534753279,NL -534753280,534757375,PS -534757376,534761471,KZ -534761472,534765567,BA -534765568,534767615,UA -534767616,534769663,HU -534769664,534773759,IT -534773760,536870911,DE -536870912,539623423,US -539623424,539627519,AU -539627520,539629455,GB -539629456,539629463,BE -539629464,539629975,GB -539629976,539629983,DE -539629984,539630975,GB -539630976,539630983,PT -539630984,539630991,FI -539630992,539630999,NO -539631000,539631007,CZ -539631008,539631015,DK -539631016,539631023,FR -539631024,539631031,ES -539631032,539631039,IE -539631040,539631047,IT -539631048,539631615,GB -539631616,539635711,NL -539635712,539656191,US -539656192,539660287,IN -539660288,539666431,HK -539666432,539668479,JP -539668480,539668819,AU -539668820,539668823,NZ -539668824,539670527,AU -539670528,539672575,JP -539672576,540725247,US -540725248,540727295,FR -540727296,540729343,DE -540729344,540731391,US -540731392,540733439,GB -540733440,540737535,NL -540737536,540803071,BR -540803072,540811263,US -540811264,540813639,SG -540813640,540813647,US -540813648,540814084,SG -540814085,540814086,TH -540814087,540814327,SG -540814328,540814328,IN -540814329,540817055,SG -540817056,540817071,US -540817072,540819455,SG -540819456,540820959,US -540820960,540820975,CA -540820976,540825347,US -540825348,540825348,CA -540825349,540826383,US -540826384,540826399,CA -540826400,540832575,US -540832576,540832591,CA -540832592,543524607,US -543524608,543524863,CA -543524864,543526143,US -543526144,543526399,CA -543526400,543590143,US -543590144,543590399,CA -543590400,543690751,US -543690752,543691007,AR -543691008,543817727,US -543817728,543818239,DE -543818240,543819263,US -543819264,543820287,DE -543820288,543821311,US -543821312,543821567,DE -543821568,543821823,NL -543821824,543822847,DE -543822848,543823615,US -543823616,543823871,DE -543823872,543825663,US -543825664,543827199,DE -543827200,543830015,US -543830016,543830527,GB -543830528,543830783,NL -543830784,543831551,US -543831552,543832063,GB -543832064,543836159,US -543836160,543836671,FR -543836672,543837183,US -543837184,543837695,FR -543837696,543842559,US -543842560,543843071,GB -543843072,543843583,AT -543843584,543844351,US -543844352,543845119,CH -543845120,543847423,US -543847424,543848447,NO -543848448,543849471,US -543849472,543850751,ES -543850752,543851263,TR -543851264,543855615,US -543855616,543855871,FI -543855872,543856639,IT -543856640,543857663,US -543857664,543857919,NO -543857920,543859967,US -543859968,543860223,NO -543860224,543860479,GR -543860480,543864319,US -543864320,543864575,IE -543864576,543866623,US -543866624,543870975,NL -543870976,543872511,US -543872512,543872767,BE -543872768,543873023,NL -543873024,543875071,US -543875072,543875839,BE -543875840,544250495,US -544250496,544250499,GB -544250500,544250527,US -544250528,544250531,GB -544250532,544436771,US -544436772,544436775,CA -544436776,586153983,US -586153984,586975999,IE -586976000,586976255,US -586976256,587006719,IE -587006720,587006975,GB -587006976,587202559,IE -587202560,597295103,US -597295104,597360639,IN -597360640,597426175,US -597426176,597688319,DE -597688320,598736895,US -598736896,598999039,GB -598999040,599261183,CA -599261184,599608829,US -599608830,599608830,GB -599608831,599609659,US -599609660,599609660,GB -599609661,599615125,US -599615126,599615126,GB -599615127,603979775,US -603979776,603980799,CN -603980800,603981823,NP -603981824,604110847,CN -604110848,604241919,JP -604241920,604504063,CN -604504064,605028351,JP -605028352,606412799,CN -606412800,606413823,HK -606413824,606414335,CN -606414336,606414591,AU -606414592,606420991,CN -606420992,606437375,ID -606437376,606470143,KH -606470144,606601215,KR -606601216,607387647,CN -607387648,607649791,JP -607649792,608174079,CN -608174080,610271231,ID -610271232,618659839,CN -618659840,619708415,TW -619708416,620232703,JP -620232704,620494847,CN -620494848,620625919,NP -620625920,620691455,CN -620691456,620699647,IN -620699648,620700671,PK -620700672,620701311,JP -620701312,620701439,HK -620701440,620701695,JP -620701696,620703743,PK -620703744,620704767,NZ -620704768,620705791,BD -620705792,620706815,HK -620707840,620708863,IN -620708864,620709887,HK -620709888,620711935,AU -620711936,620712959,HK -620712960,620715007,IN -620715008,620716031,AU -620716032,620716287,TW -620716288,620716543,PH -620716544,620716799,BE -620716800,620717055,LU -620717056,620718079,PK -620718080,620720127,IN -620720128,620721151,AU -620721152,620722175,CN -620722176,620723199,JP -620723200,620724223,SG -620724224,620725247,CN -620725248,620726271,IN -620726272,620727295,TH -620727296,620728319,MY -620728320,620729343,KH -620729344,620731391,SG -620731392,620732415,IN -620732416,620733439,JP -620733440,620734463,CN -620734464,620735487,IN -620735488,620737535,CN -620737536,620739583,IN -620739584,620740607,BD -620740608,620741631,HK -620741632,620743679,IN -620743680,620743935,SG -620743936,620744191,AU -620744192,620744703,JP -620744704,620745727,IN -620745728,620746751,PK -620746752,620747775,JP -620747776,620748799,CN -620748800,620751871,IN -620751872,620752895,JP -620752896,620753919,IN -620753920,620754943,PH -620755968,620756991,IN -620756992,620759039,IE -620759040,620763135,NL -620763136,620765183,EE -620765184,620773375,CH -620773376,620775423,ME -620775424,620777471,FR -620777472,620781567,NL -620781568,620783615,GB -620783616,620785663,ES -620785664,620786687,DE -620786688,620787199,IE -620787200,620787711,DE -620787712,620789503,RU -620789504,620789631,KZ -620789632,620789759,RU -620789760,620810239,HR -620810240,620822527,LT -620822528,620845055,RU -620845056,620845191,GB -620845192,620845199,DE -620845200,620845503,GB -620845504,620845567,SI -620845568,620849151,GB -620849152,620851199,NL -620851200,620855295,DE -620855296,620859391,RU -620859392,620861439,NL -620861440,620863487,GB -620863488,620865535,DE -620865536,620867583,FR -620867584,620869631,ES -620869632,620871679,FI -620871680,620873727,DE -620873728,620875775,NL -620875776,620877823,US -620877824,620879871,DE -620879872,620881919,GB -620881920,620888063,FR -620888064,621019135,SE -621019136,621150207,DE -621150208,621215743,GR -621215744,621281279,PL -621281280,621314047,PS -621314048,621318143,BA -621318144,621322239,RU -621322240,621330431,FR -621330432,621346815,PL -621346816,621358079,RU -621358080,621358591,US -621358592,621361151,RU -621361152,621363199,GB -621363200,621381631,RU -621381632,621383679,FR -621383680,621387775,RU -621387776,621389823,NL -621389824,621391871,SK -621391872,621392127,IT -621392128,621392383,CY -621392384,621392639,GE -621392640,621392895,CY -621392896,621393151,IT -621393152,621393919,CY -621393920,621395967,DE -621395968,621398015,CZ -621398016,621400063,TR -621400064,621402111,HU -621402112,621404159,NL -621404160,621408255,IT -621408256,621410303,RU -621410304,621412351,IR -621412352,621414399,NL -621414400,621414655,HK -621414656,621416447,NL -621416448,621416703,GB -621416704,621417471,NL -621417472,621417727,DE -621417728,621418495,NL -621418496,621418752,US -621418753,621428735,NL -621428736,621429759,IR -621429760,621430271,DE -621430272,621430527,ES -621430528,621430783,GB -621430784,621432831,ES -621432832,621436927,IT -621436928,621439999,DE -621440000,621440255,ES -621440256,621440511,IR -621440512,621441279,DE -621441280,621441791,GB -621441792,621442047,DE -621442048,621442303,ES -621442304,621442559,IR -621442560,621444095,DE -621444096,621444351,US -621444352,621445119,DE -621445120,621805567,ES -621805568,621813759,NL -621813760,621821951,SA -621821952,621823999,DE -621824000,621826047,FR -621826048,621828095,RU -621830144,621838335,FI -621838336,621871103,SA -621871104,621903871,BY -621903872,621912063,IQ -621912064,621916159,HU -621916160,621918207,KZ -621918208,621920255,GB -621920256,621924351,JO -621924352,621928447,NL -621928448,621932543,DE -621932544,621934591,UA -621934592,621936639,SE -621936640,621938687,RU -621938688,621939458,GE -621939459,621939459,RU -621939460,621939711,GE -621939712,621969407,RU -621971456,621973503,IM -621973504,621975551,IE -621975552,621977599,RU -621977600,621981695,FR -621981696,621982719,CH -621982720,621983743,US -621983744,621985791,GB -621985792,621987839,US -621987840,621989887,DE -621989888,621992959,SE -621992960,621993983,DK -621993984,621998079,SI -621998080,622000127,ES -622000128,622004223,RU -622004224,622006271,BE -622006272,622008319,FI -622008320,622010367,GB -622010368,622018559,RU -622018560,622020607,SI -622020608,622022655,RU -622022656,622026751,IR -622026752,622028799,IE -622028800,622030847,RS -622030848,622034943,IL -622034944,622067711,UA -622067712,622329855,RU -622329856,622395391,DE -622395392,622405631,UA -622405632,622406655,ES -622406656,622407679,GB -622407680,622409727,DE -622409728,622411775,FR -622411776,622413823,DE -622413824,622415871,FR -622415872,622417919,MK -622417920,622419967,IM -622419968,622428159,UA -622428160,622430207,DE -622430208,622432255,IE -622432256,622434303,IT -622434304,622436351,DE -622436352,622438399,IE -622438400,622439423,IT -622439424,622444543,DE -622444544,622449663,IE -622449664,622451711,ES -622451712,622452735,DE -622452736,622454783,IT -622454784,622456831,DE -622456832,622458879,IT -622458880,622459903,ES -622459904,622460927,IE -622460928,622477311,AZ -622477312,622479359,AL -622479360,622481407,GB -622481408,622483455,AL -622483456,622485503,GB -622485504,622487551,MK -622487552,622489599,GB -622489600,622493695,IL -622493696,622497791,MD -622497792,622499839,IL -622499840,622501887,SE -622501888,622503935,PL -622503936,622505983,AM -622505984,622510079,FR -622510080,622512127,PL -622512128,622514175,DE -622514176,622518271,NO -622518272,622518783,GB -622518784,622519039,DE -622519040,622519281,NL -622519282,622519282,GB -622519283,622519295,NL -622519296,622519551,FR -622519552,622520319,NL -622520320,622522367,RU -622522368,622524415,FR -622524416,622526463,ES -622526464,622591999,IR -622592000,622624767,OM -622624768,622626815,NO -622626816,622630911,DK -622630912,622632959,PL -622632960,622641151,RU -622641152,622657535,PT -622657536,622690303,RU -622690304,622723071,ES -622723072,622854143,PL -622854144,622866431,IR -622866432,622868479,NO -622868480,622870527,FR -622870528,622874623,AZ -622874624,622878719,IT -622880768,622882815,IT -622882816,622886911,IR -622886912,622919679,GR -622919680,622985215,FI -622985216,622993407,TR -622993408,622997503,IT -622997504,623001599,NL -623001600,623003647,ES -623003648,623005695,IT -623005696,623009791,PS -623009792,623017983,MD -623017984,623050751,KW -623050752,623052799,FR -623052800,623054847,XK -623054848,623058943,FI -623058944,623067135,RO -623067136,623069183,AL -623069184,623071231,GB -623071232,623073279,FI -623073280,623075327,GB -623075328,623077375,DK -623077376,623077783,CH -623077784,623077791,NL -623077792,623077807,CH -623077808,623077815,BE -623077816,623077819,SE -623077820,623077827,CH -623077828,623077831,US -623077832,623077833,PT -623077834,623077835,ES -623077836,623077837,CR -623077838,623077839,KN -623077840,623077843,BR -623077844,623077849,HK -623077850,623077851,ZA -623077852,623077855,SG -623077856,623077857,WS -623077858,623077861,NZ -623077862,623083519,CH -623083520,623097737,ES -623097738,623097738,RO -623097739,623116287,ES -623116288,623191332,KW -623191333,623191333,SA -623191334,623378431,KW -623378432,623509503,OM -623509504,623575807,SA -623575808,623576063,RO -623576064,623640575,SA -623640576,623642623,DE -623642624,623644671,NL -623644672,623648767,CZ -623648768,623650815,JO -623650816,623652863,RU -623652864,623654911,FI -623654912,623656959,IR -623656960,623673343,BY -623673344,623689727,NO -623689728,623706111,RU -623706112,623771647,BY -623771648,623773695,GB -623775744,623777791,IE -623777792,623779839,GB -623779840,623783935,IL -623783936,623788031,RU -623788032,623790079,HU -623790080,623792127,ES -623792128,623794175,CZ -623794176,623796223,ES -623796224,623798271,GB -623798272,623800319,GE -623800320,623800575,SE -623800576,623800831,LU -623800832,623801087,BG -623801088,623802367,NL -623802368,623802879,SE -623802880,623804415,NL -623804416,623806463,RU -623806464,623808511,NL -623810560,623812607,ES -623812608,623820799,SE -623820800,623821823,NL -623821824,623822335,US -623822336,623822591,NL -623822592,623822847,DE -623822848,623824895,GB -623824896,623826943,CZ -623826944,623827967,UA -623827968,623828991,BG -623828992,623837183,UA -623837184,623902719,PL -623902720,623919103,CZ -623919104,623935487,NL -623935488,623960063,SY -623960064,623962111,GB -623962112,623964159,HR -623964160,623966207,GB -623966208,623968255,RU -623968256,624001023,DE -624001024,624005119,DK -624005120,624007167,IR -624007168,624009215,DE -624009216,624025599,RU -624025600,624027647,NL -624027648,624029695,FR -624029696,624033791,SE -624033792,624164863,DE -624164864,624427007,UA -624427008,624492543,SA -624492544,624558079,UA -624558080,624562175,SK -624562176,624564223,TR -624564224,624566271,GB -624566272,624568319,RU -624568320,624570367,BE -624570368,624574463,DE -624574464,624590847,NL -624590848,624625848,FR -624625849,624625849,CA -624625850,624640187,FR -624640188,624640191,GB -624640192,624640255,FR -624640256,624640259,GB -624640260,624640527,FR -624640528,624640543,GB -624640544,624640615,FR -624640616,624640619,IE -624640620,624640639,FR -624640640,624640703,ES -624640704,624640751,FR -624640752,624640755,GB -624640756,624640783,FR -624640784,624640787,ES -624640788,624640811,FR -624640812,624640815,GB -624640816,624640823,FR -624640824,624640827,GB -624640828,624640931,FR -624640932,624640935,ES -624640936,624640951,FR -624640952,624640959,PT -624640960,624641187,FR -624641188,624641191,ES -624641192,624641375,FR -624641376,624641407,LT -624641408,624641535,FR -624641536,624641551,IE -624641552,624641855,FR -624641856,624641887,GB -624641888,624641983,FR -624641984,624642015,ES -624642016,624642035,FR -624642036,624642039,ES -624642040,624642079,FR -624642080,624642095,GB -624642096,624642299,FR -624642300,624642303,ES -624642304,624642479,FR -624642480,624642483,GB -624642484,624642815,FR -624642816,624642831,LT -624642832,624643091,FR -624643092,624643095,FI -624643096,624643107,FR -624643108,624643111,GB -624643112,624643211,FR -624643212,624643215,CH -624643216,624643231,FR -624643232,624643235,DE -624643236,624643243,FR -624643244,624643247,ES -624643248,624643263,FR -624643264,624643295,DE -624643296,624643343,FR -624643344,624643351,ES -624643352,624643423,FR -624643424,624643459,ES -624643460,624643811,FR -624643812,624643815,CH -624643816,624644031,FR -624644032,624644063,FI -624644064,624644095,ES -624644096,624644115,FR -624644116,624644119,GB -624644120,624644283,FR -624644284,624644287,ES -624644288,624644303,FR -624644304,624644307,IE -624644308,624644667,FR -624644668,624644671,DK -624644672,624644939,FR -624644940,624644943,ES -624644944,624645183,FR -624645184,624645215,ES -624645216,624645479,FR -624645480,624645487,CZ -624645488,624645583,FR -624645584,624645591,GB -624645592,624645663,FR -624645664,624645695,PT -624645696,624646235,FR -624646236,624646239,IT -624646240,624646255,DE -624646256,624646267,FR -624646268,624646271,PL -624646272,624646347,FR -624646348,624646351,IE -624646352,624646643,FR -624646644,624646647,ES -624646648,624646651,FR -624646652,624646655,PT -624646656,624646671,FR -624646672,624646687,GB -624646688,624646719,FR -624646720,624646735,ES -624646736,624646791,FR -624646792,624646795,IE -624646796,624646911,FR -624646912,624646927,LT -624646928,624647171,FR -624647172,624647183,ES -624647184,624647459,FR -624647460,624647463,GB -624647464,624647647,FR -624647648,624647663,GB -624647664,624647675,FR -624647676,624647679,ES -624647680,624648139,FR -624648140,624648143,ES -624648144,624656727,FR -624656728,624656731,PT -624656732,624656751,FR -624656752,624656755,GB -624656756,624656863,FR -624656864,624656867,CZ -624656868,624656975,FR -624656976,624656979,PT -624656980,624657023,FR -624657024,624657055,FI -624657056,624657327,FR -624657328,624657331,ES -624657332,624657359,FR -624657360,624657363,GB -624657364,624657543,FR -624657544,624657547,ES -624657548,624657615,FR -624657616,624657631,GB -624657632,624657711,FR -624657712,624657715,ES -624657716,624657719,PL -624657720,624657759,FR -624657760,624657767,ES -624657768,624657831,FR -624657832,624657839,ES -624657840,624657883,FR -624657884,624657887,ES -624657888,624657923,FR -624657924,624657927,DE -624657928,624658187,FR -624658188,624658191,ES -624658192,624658271,FR -624658272,624658279,PT -624658280,624658323,FR -624658324,624658327,IE -624658328,624658479,FR -624658480,624658483,DE -624658484,624658487,ES -624658488,624658535,FR -624658536,624658539,ES -624658540,624658559,FR -624658560,624658591,LT -624658592,624658863,FR -624658864,624658879,ES -624658880,624659071,FR -624659072,624659135,ES -624659136,624659599,FR -624659600,624659607,ES -624659608,624659611,FR -624659612,624659615,PL -624659616,624659975,FR -624659976,624659983,LT -624659984,624660103,FR -624660104,624660107,PT -624660108,624660127,FR -624660128,624660131,IE -624660132,624660607,FR -624660608,624660639,IE -624660640,624660703,FR -624660704,624660719,PL -624660720,624660827,FR -624660828,624660839,ES -624660840,624660927,FR -624660928,624660991,GB -624660992,624661175,FR -624661176,624661183,ES -624661184,624661247,FR -624661248,624661251,ES -624661252,624661787,FR -624661788,624661788,RO -624661789,624661863,FR -624661864,624661871,ES -624661872,624661887,FR -624661888,624661903,ES -624661904,624661955,FR -624661956,624661959,PL -624661960,624662315,FR -624662316,624662319,ES -624662320,624662327,FR -624662328,624662331,PT -624662332,624662895,FR -624662896,624662911,ES -624662912,624663407,FR -624663408,624663423,FI -624663424,624663503,FR -624663504,624663519,ES -624663520,624663567,FR -624663568,624663583,ES -624663584,624663687,FR -624663688,624663695,GB -624663696,624663759,FR -624663760,624663767,ES -624663768,624663787,FR -624663788,624663791,ES -624663792,624663863,FR -624663864,624663867,DE -624663868,624663951,FR -624663952,624663955,ES -624663956,624664047,FR -624664048,624664063,IE -624664064,624664067,FR -624664068,624664071,ES -624664072,624664351,FR -624664352,624664367,ES -624664368,624664495,FR -624664496,624664511,ES -624664512,624664527,FR -624664528,624664531,ES -624664532,624664599,FR -624664600,624664603,GB -624664604,624664607,IE -624664608,624664623,FR -624664624,624664627,ES -624664628,624664671,FR -624664672,624664703,IE -624664704,624664767,FR -624664768,624664775,GB -624664776,624665587,FR -624665588,624665591,DE -624665592,624665611,FR -624665612,624665615,ES -624665616,624665663,FR -624665664,624665695,ES -624665696,624665887,FR -624665888,624665903,PL -624665904,624665919,FI -624665920,624665999,FR -624666000,624666015,GB -624666016,624666167,FR -624666168,624666175,GB -624666176,624666219,FR -624666220,624666223,DE -624666224,624666375,FR -624666376,624666379,GB -624666380,624666591,FR -624666592,624666607,ES -624666608,624666691,FR -624666692,624666695,ES -624666696,624666703,DE -624666704,624666791,FR -624666792,624666795,ES -624666796,624666799,GB -624666800,624666975,FR -624666976,624666991,ES -624666992,624667111,FR -624667112,624667115,ES -624667116,624667263,FR -624667264,624667279,IE -624667280,624667711,FR -624667712,624667775,ES -624667776,624667951,FR -624667952,624667967,GB -624667968,624668055,FR -624668056,624668063,IE -624668064,624668079,BE -624668080,624668111,FR -624668112,624668127,GB -624668128,624668207,FR -624668208,624668211,CZ -624668212,624668643,FR -624668644,624668647,IE -624668648,624668667,FR -624668668,624668671,PT -624668672,624668927,FR -624668928,624668931,GB -624668932,624669459,FR -624669460,624669463,FI -624669464,624669711,FR -624669712,624669727,ES -624669728,624669795,FR -624669796,624669799,ES -624669800,624669959,FR -624669960,624669963,ES -624669964,624669987,FR -624669988,624669991,ES -624669992,624670171,FR -624670172,624670175,ES -624670176,624670315,FR -624670316,624670319,ES -624670320,624670659,FR -624670660,624670663,IE -624670664,624670871,FR -624670872,624670875,BE -624670876,624670915,FR -624670916,624670919,ES -624670920,624670935,FR -624670936,624670939,GB -624670940,624671287,FR -624671288,624671291,ES -624671292,624671295,PL -624671296,624671455,FR -624671456,624671471,ES -624671472,624672127,FR -624672128,624672131,GB -624672132,624672547,FR -624672548,624672551,ES -624672552,624672951,FR -624672952,624672959,ES -624672960,624673287,FR -624673288,624673295,DE -624673296,624673451,FR -624673452,624673455,ES -624673456,624673535,FR -624673536,624673791,ES -624673792,624673803,FR -624673804,624673807,NL -624673808,624673903,FR -624673904,624673919,ES -624673920,624673931,FR -624673932,624673935,GB -624673936,624674411,FR -624674412,624674415,ES -624674416,624674447,FR -624674448,624674451,GB -624674452,624674463,FR -624674464,624674479,ES -624674480,624675019,FR -624675020,624675023,DE -624675024,624675027,BE -624675028,624675047,FR -624675048,624675055,ES -624675056,624675647,FR -624675648,624675651,FI -624675652,624675655,ES -624675656,624675683,FR -624675684,624675687,PT -624675688,624675691,FR -624675692,624675695,ES -624675696,624675775,FR -624675776,624675779,ES -624675780,624676003,FR -624676004,624676007,DE -624676008,624676015,FR -624676016,624676019,GB -624676020,624676071,FR -624676072,624676075,ES -624676076,624676087,FR -624676088,624676091,DE -624676092,624676115,FR -624676116,624676119,IT -624676120,624676627,FR -624676628,624676631,GB -624676632,624676715,FR -624676716,624676719,ES -624676720,624677463,FR -624677464,624677467,ES -624677468,624677471,GB -624677472,624677583,FR -624677584,624677587,ES -624677588,624677687,FR -624677688,624677695,GB -624677696,624677769,FR -624677770,624677770,NL -624677771,624677855,FR -624677856,624677887,BE -624677888,624677891,PL -624677892,624678015,FR -624678016,624678023,ES -624678024,624678199,FR -624678200,624678239,ES -624678240,624678263,FR -624678264,624678279,ES -624678280,624678483,FR -624678484,624678487,ES -624678488,624678671,FR -624678672,624678679,ES -624678680,624678847,FR -624678848,624678855,GB -624678856,624678863,FR -624678864,624678879,PT -624678880,624678899,FR -624678900,624678903,GB -624678904,624679199,FR -624679200,624679203,ES -624679204,624679259,FR -624679260,624679263,ES -624679264,624679327,FR -624679328,624679335,ES -624679336,624679843,FR -624679844,624679847,ES -624679848,624680063,FR -624680064,624680191,ES -624680192,624680455,FR -624680456,624680463,ES -624680464,624680747,FR -624680748,624680751,NL -624680752,624680783,FR -624680784,624680799,GB -624680800,624680895,FR -624680896,624680927,ES -624680928,624681023,FR -624681024,624681055,ES -624681056,624681083,FR -624681084,624681087,ES -624681088,624681095,FR -624681096,624681103,NL -624681104,624681535,FR -624681536,624681599,ES -624681600,624681807,FR -624681808,624681823,BE -624681824,624682263,FR -624682264,624682267,ES -624682268,624682319,FR -624682320,624682323,ES -624682324,624682367,FR -624682368,624682383,LT -624682384,624682495,FR -624682496,624682527,ES -624682528,624682623,FR -624682624,624682639,ES -624682640,624683007,FR -624683008,624683011,GB -624683012,624683015,FR -624683016,624683023,ES -624683024,624683031,FR -624683032,624683039,GB -624683040,624683135,FR -624683136,624683151,PL -624683152,624683295,FR -624683296,624683311,DE -624683312,624683339,FR -624683340,624683343,ES -624683344,624683631,FR -624683632,624683647,ES -624683648,624683775,FR -624683776,624683779,DE -624683780,624683783,FR -624683784,624683787,DE -624683788,624683807,FR -624683808,624683811,ES -624683812,624683875,FR -624683876,624683879,PL -624683880,624683975,FR -624683976,624683983,GB -624683984,624684043,FR -624684044,624684047,PT -624684048,624684051,FR -624684052,624684055,ES -624684056,624684063,FR -624684064,624684071,PT -624684072,624684191,FR -624684192,624684195,CH -624684196,624684339,FR -624684340,624684343,NL -624684344,624684479,FR -624684480,624684511,FI -624684512,624684639,FR -624684640,624684655,ES -624684656,624684799,FR -624684800,624684803,DE -624684804,624684907,FR -624684908,624684911,ES -624684912,624685375,FR -624685376,624685439,ES -624685440,624685535,FR -624685536,624685539,PT -624685540,624685683,FR -624685684,624685687,FI -624685688,624685711,FR -624685712,624685715,ES -624685716,624685799,FR -624685800,624685803,ES -624685804,624685815,FR -624685816,624685823,GB -624685824,624685919,FR -624685920,624685923,ES -624685924,624686627,FR -624686628,624686631,ES -624686632,624686667,FR -624686668,624686671,ES -624686672,624686711,FR -624686712,624686719,ES -624686720,624686783,FR -624686784,624686815,ES -624686816,624686895,FR -624686896,624686911,IE -624686912,624687343,FR -624687344,624687346,CZ -624687347,624687347,ES -624687348,624687783,FR -624687784,624687791,PT -624687792,624687827,FR -624687828,624687831,ES -624687832,624687923,FR -624687924,624687927,ES -624687928,624688007,FR -624688008,624688015,ES -624688016,624688031,GB -624688032,624688307,FR -624688308,624688311,ES -624688312,624688315,FR -624688316,624688319,GB -624688320,624688435,FR -624688436,624688439,IE -624688440,624688443,ES -624688444,624688487,FR -624688488,624688491,ES -624688492,624688495,GB -624688496,624688639,FR -624688640,624688643,ES -624688644,624688663,FR -624688664,624688671,ES -624688672,624688691,FR -624688692,624688695,ES -624688696,624688775,FR -624688776,624688779,PL -624688780,624688783,ES -624688784,624688791,FR -624688792,624688795,ES -624688796,624688831,FR -624688832,624688835,ES -624688836,624689063,FR -624689064,624689067,ES -624689068,624689071,FR -624689072,624689075,ES -624689076,624689076,FR -624689077,624689078,BE -624689079,624689151,FR -624689152,624691199,DE -624691200,624693247,FR -624693248,624695295,RU -624695296,624697343,PL -624697344,624699391,IT -624699392,624701439,IL -624701440,624705535,FR -624705536,624721919,GB -624721920,624723967,HR -624723968,624726015,BG -624726016,624728063,PS -624728064,624730111,FR -624730112,624731135,DK -624731136,624732159,US -624732160,624734207,DE -624734208,624736255,RU -624736256,624738303,FR -624738304,624740351,NL -624740352,624742399,DE -624742400,624746495,RU -624746496,624748182,US -624748183,624748183,NL -624748184,624750236,US -624750237,624750237,NL -624750238,624750241,US -624750242,624750242,NL -624750243,624754687,US -624754688,624787455,AZ -624787456,624791551,DE -624791552,624795647,ES -624795648,624799743,SK -624799744,624801791,RU -624801792,624803839,AT -624803840,624812031,DE -624812032,624813055,US -624813056,624814079,IL -624814080,624816127,GB -624816128,624818175,FR -624818176,624820223,ES -624820224,624885759,BE -624885760,624918527,BG -624918528,624951295,IR -624951296,625475583,FR -625475584,625483775,ES -625483776,625485823,IT -625485824,625487871,UA -625487872,625491967,TR -625491968,625500159,RU -625500160,625504255,NL -625504256,625506303,GB -625506304,625508351,PL -625508352,625512447,AZ -625512448,625514495,DE -625514496,625516543,GG -625516544,625518591,BE -625518592,625518847,NL -625518848,625519103,US -625519104,625520135,NL -625520136,625520479,US -625520480,625520495,NL -625520496,625520511,US -625520512,625520639,NL -625520640,625522687,RU -625522688,625523455,SE -625523456,625523711,NO -625523712,625523967,SE -625523968,625524223,GR -625524224,625524735,SE -625524736,625541119,FR -625541120,625606655,UA -625606656,625616127,NL -625616128,625616383,GB -625616384,625672191,NL -625672192,625674239,RU -625674240,625676287,TR -625676288,625680383,MD -625680384,625688575,MT -625688576,625704959,MD -625704960,625707007,GE -625707008,625709055,AT -625709056,625711103,JO -625711104,625713151,NL -625713152,625721343,DK -625721344,625725439,RU -625725440,625727487,PS -625727488,625729535,UA -625729536,625731583,NL -625731584,625733631,GB -625733632,625735679,IR -625735680,625737727,RU -625737728,625770495,HU -625770496,625786879,RU -625786880,625795071,PS -625795072,625803263,SA -625803264,625811455,TR -625811456,625815551,FR -625815552,625817599,IQ -625817600,625817911,NL -625817912,625817915,GB -625817916,625819647,NL -625819648,625823743,IQ -625823744,625827839,BG -625827840,625829887,IT -625829888,625831935,RU -625831936,625836031,IT -625836032,625838079,RU -625838080,625840127,IT -625842176,625844223,PL -625844224,625846271,IT -625846272,625848319,RS -625848320,625854463,GB -625854464,625856511,DE -625856512,625860607,IT -625860608,625868799,CZ -625868800,625999871,RU -625999872,627048447,DE -627048448,627130367,DK -627130368,627142655,FR -627142656,627145727,RO -627145728,627146751,ES -627146752,627179519,NL -627179520,627212287,IR -627212288,627216383,FI -627216384,627218431,GB -627218432,627220479,TJ -627220480,627228671,RU -627228672,627230719,GR -627230720,627232767,IR -627232768,627236863,PL -627236864,627238911,IQ -627240192,627240447,US -627240704,627240959,US -627240960,627245055,RU -627245056,627277823,KZ -627277824,627294207,SA -627294208,627296255,GR -627296256,627298303,DE -627298304,627300351,IT -627300352,627302399,RU -627302400,627572735,IT -627572736,627834879,SA -627834880,627965951,PL -627965952,628006911,RU -628006912,628015103,GE -628015104,628017151,FR -628017152,628019199,CH -628019200,628021247,UZ -628021248,628023039,IE -628023040,628023295,GB -628023296,628029439,RU -628029440,628031487,GB -628031488,628064255,MM -628064256,628080639,PK -628080640,628097023,BD -628097024,628230143,RU -628230144,628232191,IT -628232192,628236287,RU -628236288,628244479,DE -628244480,628246527,FR -628246528,628248575,MT -628248576,628250367,FI -628250368,628250623,LV -628250624,628252671,NL -628252672,628260863,DE -628260864,628277247,AZ -628277248,628293631,IR -628293632,628359167,UA -628359168,628621311,IT -628621312,628654079,DE -628654080,628662271,RO -628662272,628670463,DE -628670464,628685823,RO -628685824,628686335,FO -628686336,628686847,RO -628686848,628752383,SA -628752384,628785151,RU -628785152,628787199,CH -628787200,628789247,TR -628789248,628791295,SE -628791296,628793343,IL -628793344,628801535,ME -628801536,628803583,GB -628803584,628805631,FR -628805632,628807679,GB -628809728,628813823,TR -628813824,628815871,DK -628815872,628817919,GB -628817920,628834303,TR -628834304,628842495,JO -628842496,628844543,TR -628844544,628846847,DE -628846848,628847359,GB -628847360,628847615,FR -628847616,628848639,GB -628848640,628850687,DE -628850688,628852723,NO -628852724,628852727,SE -628852728,628852735,NO -628852736,628867071,SE -628867072,628869119,IR -628869120,628871167,PL -628871168,628873215,US -628873216,628875263,RU -628875264,628877311,SE -628877312,628879359,BE -628879360,628881407,IT -628881408,628883455,GB -628883456,629082095,SA -629082096,629082103,US -629082104,629145599,SA -629145600,629178367,PL -629178368,629180415,GB -629180416,629182463,IT -629182464,629184511,NL -629184512,629188607,PL -629188608,629190655,ES -629190656,629192703,CH -629192704,629194751,GB -629194752,629196799,IE -629196800,629198847,AZ -629198848,629202943,DK -629202944,629207039,RO -629207040,629276671,IR -629276672,629293055,PL -629293056,629309439,TR -629309440,629313535,DE -629313536,629315583,ES -629315584,629317631,IT -629317632,629325823,FI -629325824,629327359,RU -629327360,629327615,GB -629327616,629327871,RU -629327872,629329919,IR -629329920,629331967,ES -629331968,629334015,IT -629334016,629334271,NL -629334272,629338111,GB -629338112,629340159,BG -629340160,629342207,GB -629342208,629374975,BH -629374976,629387263,PL -629387264,629389311,DE -629389312,629391359,CH -629391360,629399551,RU -629399552,629401599,GE -629401600,629405695,DE -629405696,629407743,TR -629407744,629669887,ES -629669888,629735423,FI -629735424,629800959,IR -629800960,629866495,DE -629866496,629874687,NL -629874688,629879807,RU -629879808,629880063,DE -629880064,629882879,RU -629882880,629883135,GB -629883136,629883391,AU -629883904,629884159,AU -629884160,629884415,US -629884416,629884671,CL -629884672,629884927,AU -629884928,629886975,PL -629886976,629889023,RU -629889024,629891071,IT -629891072,629895167,UA -629895168,629897215,AL -629897216,629899263,ES -629901312,629903359,NL -629903360,629905407,PL -629905408,629907455,SE -629907456,629915647,UA -629915648,629970943,RU -629970944,629971071,ID -629971072,629971199,GB -629971200,629971327,BR -629971328,629971455,DE -629971456,629971583,ES -629971584,629971711,IT -629971712,629971839,MX -629971840,629971967,FR -629971968,629972095,ID -629972096,629972223,GB -629972224,629972351,BR -629972352,629972479,DE -629972480,629972607,ES -629972608,629972735,IT -629972736,629972863,MX -629972864,629972991,FR -629972992,629983231,RU -629983232,629985279,FR -629985280,629987327,TR -629989376,629991423,FR -629991424,629993471,NL -629993472,629997567,JO -629997568,630063103,SA -630063104,630073479,IL -630073480,630073487,FR -630073488,630128639,IL -630128640,630130687,BE -630130688,630136831,RU -630136832,630138879,NL -630138880,630140927,DE -630145024,630147071,EE -630147072,630149119,HU -630149120,630151167,NL -630151168,630153215,UA -630153216,630157311,RU -630157312,630159359,CZ -630159360,630161407,ES -630163456,630165503,GB -630165504,630167551,IR -630167552,630169599,GE -630169600,630173695,RO -630173696,630177791,AT -630177792,630194175,BG -630194176,630456319,RU -630456320,630489087,IR -630489088,630491135,NL -630491136,630493183,DE -630493184,630495231,NO -630495232,630497279,DE -630497280,630499327,NL -630499328,630501375,LV -630501376,630503423,BE -630503424,630503679,NL -630503680,630504447,IT -630504448,630509567,NL -630509568,630511615,TR -630511616,630513663,GB -630513664,630515711,IT -630515712,630517759,DE -630517760,630519807,GB -630521856,630587391,CY -630587392,630718463,KZ -630718464,630720511,JO -630720512,630722559,NL -630722560,630726655,PL -630726656,630732799,GB -630732800,630734079,SE -630734080,630734847,US -630734848,630736895,IS -630736896,630738943,TR -630738944,630743039,ES -630743040,630751231,SK -630751232,630759423,ES -630759424,630767615,IR -630767616,630783999,GB -630784000,630802431,RU -630802432,630804479,GB -630804480,630806527,CH -630806528,630808575,ES -630808576,630810623,NL -630810624,630816767,CH -630816768,630817791,IR -630817792,630818047,GB -630818048,630818303,RO -630818304,630818431,CN -630818432,630818559,KR -630818560,630819327,RO -630819328,630819839,SE -630819840,630820095,GR -630820096,630820351,RO -630820352,630820607,ES -630820608,630820863,US -630820864,630822911,GR -630822912,630824959,RO -630824960,630827007,GR -630827008,630828031,NL -630828032,630828543,SE -630828544,630829055,BG -630829056,630833151,IR -630833152,630849535,NL -630849536,630980607,TR -630980608,630981631,IR -630981632,630982143,RO -630982144,630982271,CN -630982272,630982399,KR -630982400,630982655,RO -630982656,630988799,IR -630988800,630990335,RO -630990336,630990847,JE -630990848,630992895,RO -630992896,630996991,IR -630996992,630997503,GB -630997504,630997759,FR -630997760,630998271,RO -630998272,630998783,MD -630998784,630999039,RO -630999040,630999295,CN -630999296,630999551,RO -630999552,630999679,GB -630999680,631000063,RO -631000064,631001087,ES -631001088,631005183,DE -631005184,631006207,IT -631006208,631007231,IR -631007232,631007487,KR -631007488,631007743,RO -631007744,631007871,GB -631007872,631008255,RO -631008256,631009279,ES -631009280,631018495,IR -631018496,631019519,IT -631019520,631023615,IR -631023616,631024639,IT -631024640,631024895,RO -631024896,631025151,GB -631025152,631025663,RO -631025664,631026687,IR -631026688,631027711,RO -631027712,631027967,KR -631027968,631028223,RO -631028224,631028351,GB -631028352,631028735,RO -631028736,631029759,ES -631029760,631033855,SE -631033856,631034879,IT -631034880,631035903,IR -631035904,631036159,JP -631036160,631036415,RO -631036416,631036543,GB -631036544,631037951,RO -631037952,631038207,BG -631038208,631038975,RO -631038976,631039999,NL -631040000,631043071,IR -631043072,631043583,RO -631043584,631043839,TR -631043840,631044095,NL -631044096,631045119,IR -631045120,631046143,NL -631046144,631048191,DK -631048192,631050239,FR -631050240,631054335,RU -631054336,631056383,GB -631056384,631058431,DE -631058432,631060479,GB -631060480,631062527,FR -631062528,631078911,EE -631078912,631080959,FR -631080960,631083007,BG -631083008,631085055,LT -631085056,631087103,LU -631087104,631095295,BG -631095296,631097343,CZ -631097344,631099391,PL -631099392,631103487,AM -631103488,631105535,FR -631105536,631107583,RU -631107584,631109631,GB -631109632,631111679,DE -631111680,631177215,ES -631177216,631242751,IT -631242752,631408581,FR -631408582,631408582,RE -631408583,632291327,FR -632291328,632815615,IT -632815616,632946687,BE -632946688,632954879,AT -632954880,632963071,QA -632963072,632979455,AM -632979456,633012223,IT -633012224,633059983,FR -633059984,633059987,GB -633059988,633060359,FR -633060360,633060367,ES -633060368,633061247,FR -633061248,633061311,NL -633061312,633062463,FR -633062464,633062527,BE -633062528,633063679,FR -633063680,633063935,PL -633063936,633064191,FR -633064192,633064447,GB -633064448,633064471,FR -633064472,633064475,DE -633064476,633065315,FR -633065316,633065323,FI -633065324,633065471,FR -633065472,633065727,GB -633065728,633065983,DE -633065984,633066239,FR -633066240,633066751,ES -633066752,633067007,IT -633067008,633067455,FR -633067456,633067471,ES -633067472,633068695,FR -633068696,633068703,ES -633068704,633068735,FR -633068736,633068799,BE -633068800,633069251,FR -633069252,633069255,ES -633069256,633069263,FR -633069264,633069271,ES -633069272,633074760,FR -633074761,633074761,ES -633074762,633077759,FR -633077760,633094143,RU -633094144,633098239,NL -633098240,633100287,HU -633100288,633102335,FR -633102336,633110527,GB -633110528,633143295,CZ -633143296,633208831,PT -633208832,633241599,RU -633241600,633274367,PL -633274368,633290751,HU -633290752,633298943,IR -633298944,633307135,GB -633307136,633339903,NO -633339904,633602047,RU -633602048,633864191,SE -633864192,633880575,NO -633880576,633888767,RU -633888768,633890815,DE -633890816,633892863,FR -633892864,633894911,GB -633894912,633896959,RU -633896960,633929727,OM -633929728,633997311,DE -633997312,633999359,RU -633999360,634001407,IT -634001408,634003455,NO -634003456,634007551,PL -634007552,634009599,TR -634009600,634011647,NO -634011648,634028031,JO -634028032,634060799,IR -634060800,634068991,UA -634068992,634069503,DE -634069504,634071039,LV -634071040,634073087,GB -634073088,634075135,IE -634075136,634077183,NL -634077184,634093567,BA -634093568,634109951,GB -634109952,634111999,IE -634112000,634114047,RU -634114048,634114303,FR -634114304,634114559,SE -634114560,634114815,FR -634114816,634115071,FI -634115072,634115839,SE -634115840,634116095,IT -634116096,634118143,NL -634118144,634122239,IT -634122240,634124287,RU -634124288,634126335,CH -634126336,634191871,RU -634191872,634193919,TR -634193920,634195967,CZ -634195968,634198015,RU -634198016,634200063,BA -634200064,634202111,IS -634202112,634204159,FR -634204160,634206207,RU -634206208,634208255,GB -634208256,634216447,RU -634216448,634220543,HR -634220544,634222591,IQ -634222592,634224639,DK -634224640,634388479,IT -634388480,634396671,SE -634396672,634398719,BA -634398720,634400767,KZ -634400768,634402815,FR -634402816,634404863,BE -634404864,634408959,RU -634408960,634411007,GB -634411008,634413055,BE -634413056,634415103,RU -634415104,634417151,DE -634417152,634419199,NL -634419200,634421247,RU -634421248,634454015,QA -634454016,634486783,DE -634486784,634494975,PL -634494976,634497023,LV -634497024,634499071,BG -634499072,634503167,CH -634503168,634505215,GB -634505216,634507263,IT -634507264,634511359,GB -634511360,634517503,RU -634517504,634519551,LB -634519552,634639103,QA -634639104,634639359,AE -634639360,634650623,QA -634650624,634912767,BY -634912768,635043839,SA -635043840,635076607,ES -635076608,635092991,KG -635092992,635097087,CY -635097088,635101183,PS -635101184,635103231,AE -635103232,635105279,HU -635105280,635107327,NL -635107328,635109375,DE -635109376,635174911,FI -635174912,635183103,GB -635183104,635185151,NL -635185152,635187199,IT -635187200,635191295,FR -635191296,635195391,RS -635195392,635197439,RU -635197440,635199775,GB -635199776,635199783,IT -635199784,635200167,GB -635200168,635200175,IT -635200176,635200335,GB -635200336,635200343,IT -635200344,635200631,GB -635200632,635200639,IT -635200640,635200727,GB -635200728,635200735,IT -635200736,635200847,GB -635200848,635200855,IT -635200856,635201159,GB -635201160,635201167,IT -635201168,635201295,GB -635201296,635201303,IT -635201304,635203583,GB -635203584,635207679,JO -635207680,635211775,HU -635211776,635213823,NL -635213824,635217919,RU -635217920,635219967,NL -635219968,635224063,RU -635224064,635240447,HU -635240448,635256831,IR -635273216,635281407,UA -635281408,635283455,RO -635283456,635283967,DE -635283968,635284479,RO -635284480,635285503,US -635285504,635287551,ME -635287552,635289599,RU -635289600,635291647,DE -635291648,635293695,RU -635293696,635295743,HU -635295744,635297791,GB -635297792,635299839,SE -635299840,635301887,ES -635301888,635305983,CZ -635305984,635437055,ES -635437056,635502591,SA -635502592,635568127,PL -635568128,635699199,IT -635699200,635715583,PL -635715584,635717631,KZ -635717632,635719679,NL -635719680,635723775,RU -635723776,635725823,ES -635725824,635727871,US -635727872,635729919,RU -635729920,635731967,DE -635731968,635732479,SC -635732480,635732735,DE -635732736,635732991,IR -635732992,635733209,DE -635733210,635733210,PT -635733211,635733247,DE -635733248,635733503,IR -635733504,635733759,DE -635733760,635735039,IR -635735040,635748351,DE -635748352,635764735,IE -635764736,635830271,UA -635830272,635842559,DE -635842560,635846655,GB -635846656,635854847,ES -635854848,635856895,NL -635856896,635858943,TR -635858944,635860479,RU -635860480,635860991,NL -635860992,635863039,BE -635863040,635863551,GB -635863552,635864063,NL -635864064,635864319,IQ -635864320,635864575,RU -635864576,635864831,LB -635864832,635865087,ES -635865088,635865855,RU -635865856,635866111,US -635866112,635871487,RU -635871488,635871743,UA -635871744,635873279,RU -635873280,635873791,LU -635873792,635874303,SE -635874304,635874815,SG -635874816,635875327,FR -635875328,635875839,IT -635875840,635876351,CH -635876352,635876863,DK -635876864,635877119,MY -635877120,635877375,BN -635877376,635877631,NO -635877632,635877887,JP -635877888,635878143,ES -635878144,635878399,BO -635878400,635878655,RU -635878656,635878911,AM -635878912,635879167,FI -635879168,635879423,AT -635879424,635882495,RU -635882496,635882751,GE -635882752,635891967,RU -635891968,635892223,GB -635892224,635894527,RU -635894528,635894783,KZ -635894784,635895807,RU -635895808,635961343,KW -635961344,635994111,GE -635994112,636026879,RU -636026880,636043263,MD -636043264,636047359,SE -636047360,636049407,RU -636049408,636051455,FI -636051456,636055551,PL -636055552,636057599,RU -636057600,636059647,CH -636059648,636092415,GE -636092416,636157951,HU -636157952,636159999,AT -636160000,636162047,NL -636162048,636166143,IR -636166144,636168191,ES -636168192,636170239,GB -636170240,636170495,PL -636170496,636170751,IS -636170752,636171263,CH -636171264,636171519,CL -636171520,636171775,ES -636171776,636172031,GB -636172032,636172287,IM -636172288,636174335,AT -636174336,636176383,RU -636176384,636178431,TR -636178432,636180479,NL -636180480,636182527,FR -636182528,636185087,CZ -636185088,636185343,SE -636185344,636186111,US -636186112,636186367,FR -636186368,636186623,ES -636186624,636188671,NL -636188672,636190719,GB -636190720,636223487,RU -636223488,636485631,IQ -636485632,636747775,SA -636747776,636753407,FR -636753408,636753919,US -636753920,636753938,NL -636753939,636753941,DE -636753942,636754072,NL -636754073,636754075,DE -636754076,636754175,NL -636754176,636764159,FR -636764160,636780543,GB -636780544,636813311,HR -636813312,636878847,AE -636878848,636944383,MD -636944384,636952575,SE -636952576,636956671,NL -636956672,636958719,IT -636958720,636960767,PL -636960768,636965631,DE -636965632,636965887,BE -636965888,636966655,DE -636966656,636966911,IT -636966912,636967167,DE -636967168,636967935,FR -636967936,636968455,DE -636968456,636968456,BE -636968457,636968959,DE -636968960,636974079,TR -636974080,636974591,GB -636974592,636975103,TR -636975104,636977151,ES -636977152,637140991,PL -637140992,637206527,SE -637206528,637239295,NL -637239296,637272063,RO -637272064,637272831,RU -637272832,637275135,DE -637275136,637275391,RU -637275392,637276159,NL -637276160,637278207,RU -637278208,637288447,GB -637288448,637296639,AM -637296640,637298687,ES -637298688,637300735,DE -637300736,637302783,NO -637302784,637304831,NL -637304832,637313023,CH -637317120,637319167,ES -637319168,637321215,AT -637321216,637323263,GB -637323264,637325311,FR -637325312,637325823,US -637325824,637326079,GB -637326080,637326335,DE -637326336,637326591,HK -637326592,637326847,AU -637326848,637327103,JP -637327104,637327359,NO -637329408,637329663,SI -637329664,637330175,FR -637330176,637330431,DE -637330432,637330943,JP -637330944,637331199,GB -637331200,637331455,IE -637331456,637331711,GB -637331712,637331967,AT -637331968,637332223,DE -637332224,637332991,AT -637332992,637333503,BR -637333504,637333759,AU -637333760,637334271,AT -637334272,637334527,TW -637334528,637334783,KR -637334784,637335039,AE -637335040,637335295,SK -637335296,637335551,BG -637335552,637335807,DE -637335808,637336063,HK -637336064,637336319,AT -637336320,637336575,CL -637336576,637336831,AT -637336832,637337087,IT -637337088,637337599,RU -637337600,637403135,NO -637403136,637534207,IR -637534208,638730239,US -638730240,638738431,CA -638738432,638754815,US -638754816,638763007,CA -638763008,639242239,US -639242240,639246335,CA -639246336,639320063,US -639320064,639328255,CA -639328256,639442943,US -639442944,639451135,CA -639451136,641738239,US -641738240,641738495,CA -641738496,641761535,US -641761536,641761791,CA -641761792,641763327,US -641763328,641764351,CA -641764352,641765375,US -641765376,641767423,CA -641767424,641769471,US -641769472,641769727,CA -641769728,641770495,US -641770496,641772031,CA -641772032,641772287,US -641772288,641772543,CA -641772544,641773055,US -641773056,641773567,CA -641773568,641774079,US -641774080,641774641,CA -641774642,641774642,US -641774643,641776639,CA -641776640,641777663,US -641777664,641777919,CA -641777920,641778175,US -641778176,641778687,CA -641778688,641779199,US -641779200,641779327,CA -641779328,641779711,US -641779712,641781759,CA -641781760,641789951,US -641789952,641790975,CA -641790976,641791999,US -641792000,641793023,CA -641793024,641828863,US -641828864,641829375,MX -641829376,641829887,US -641829888,641832959,MX -641832960,642093055,US -642093056,642095103,CA -642095104,642096127,US -642096128,642096639,CA -642096640,642097151,US -642097152,642105343,CA -642105344,642113535,US -642113536,642115583,AU -642115584,642385919,US -642385920,642400255,CA -642400256,642793471,US -642793472,642794495,CA -642794496,642799615,US -642799616,642801663,CA -642801664,643219519,US -643219520,643219523,CA -643219524,643219526,US -643219527,643219527,CA -643219528,643235839,US -643235840,643244031,CA -643244032,643293439,US -643293440,643293695,GB -643293696,643293951,US -643293952,643294207,SG -643294208,643294719,US -643294720,643294975,RU -643294976,643295231,DE -643295232,643295487,PR -643295488,643295743,US -643295744,643296767,PR -643296768,643299583,US -643299584,643299839,HK -643299840,643302911,US -643302912,643303423,CA -643303424,643317759,US -643317760,643330047,CA -643330048,643346431,US -643346432,643346943,CA -643346944,644051967,US -644051968,644052479,MF -644052480,644052735,GP -644052736,644052991,MF -644052992,644055039,US -644055040,644057599,CA -644057600,644058111,US -644058112,644059647,CA -644059648,644060159,US -644060160,644061631,CA -644061632,644061663,US -644061664,644062975,CA -644062976,644063231,US -644063232,644065023,CA -644065024,644065055,US -644065056,644065279,CA -644065280,644066303,US -644066304,644066815,CA -644066816,644067072,US -644067073,644067073,CA -644067074,644067327,US -644067328,644071423,CA -644071424,644084479,US -644084480,644084607,GU -644084608,644210431,US -644210432,644210687,MX -644210688,644239615,US -644239616,644239871,CA -644239872,644247551,US -644247552,644249599,CA -644249600,644268031,US -644268032,644268569,CA -644268570,644268570,US -644268571,644268613,CA -644268614,644268614,US -644268615,644268799,CA -644268800,644321279,US -644321280,644325375,CA -644325376,644388863,US -644388864,644390911,CA -644390912,644399103,US -644399104,644399359,CA -644399360,644403199,US -644403200,644403455,CA -644403456,644413439,US -644413440,644413951,MX -644413952,644414463,CA -644414464,644422911,US -644422912,644423423,JP -644423424,644569087,US -644569088,644570111,PR -644570112,644570367,US -644570368,644570623,PR -644570624,644582399,US -644582400,644582655,CA -644582656,644628799,US -644628800,644628807,CA -644628808,644629759,US -644629760,644630015,CA -644630016,644630527,US -644630528,644631551,CA -644631552,644635647,US -644635648,644636671,CA -644636672,644718719,US -644718720,644718783,CA -644718784,644718847,US -644718848,644718943,CA -644718944,644720127,US -644720128,644720639,CA -644720640,644759551,US -644759552,644761599,CA -644761600,644763647,US -644763648,644765695,CA -644765696,644767878,US -644767879,644767879,CA -644767880,644773887,US -644773888,644775935,CA -644775936,644833279,US -644833280,644834815,CA -644834816,644835071,US -644835072,644835327,CA -644835328,644838143,US -644838144,644839679,CA -644839680,644840447,US -644840448,644841471,CA -644841472,644845839,US -644845840,644845840,RU -644845841,644845841,US -644845842,644845855,RU -644845856,644845863,US -644845864,644846079,RU -644846080,644874751,US -644874752,644875263,CA -644875264,644877311,US -644877312,644877439,CA -644877440,644896767,US -644896768,644902911,CA -644902912,644981759,US -644981760,644982399,CA -644982400,644982527,US -644982528,644982783,CA -644982784,644986111,US -644986112,644986367,CA -644986368,644987135,US -644987136,644987903,CA -644987904,645185535,US -645185536,645185791,CA -645185792,645186559,US -645186560,645187583,CA -645187584,645221375,US -645221376,645222399,CA -645222400,645224959,US -645224960,645225215,CA -645225216,645225471,US -645225472,645225983,CA -645225984,645228031,US -645228032,645228287,CA -645228288,645480447,US -645480448,645481471,CA -645481472,645481727,US -645481728,645481983,CA -645481984,645482239,US -645482240,645482495,AU -645482496,645483775,US -645483776,645484031,CA -645484032,645484543,US -645484544,645488639,CA -645488640,645525503,US -645525504,645529599,CA -645529600,645539839,US -645539840,645540863,CA -645540864,645547007,US -645547008,645548031,CA -645548032,645576703,US -645576704,645576997,CA -645576998,645576998,US -645576999,645577215,CA -645577216,645611519,US -645611520,645615615,MX -645615616,645644351,US -645644352,645644415,MX -645644416,645644927,US -645644928,645645055,MX -645645056,645646335,US -645646336,645646847,MX -645646848,645647615,US -645647616,645647871,MX -645647872,645703679,US -645703680,645705727,MX -645705728,645709823,US -645709824,645718015,MX -645718016,645873663,US -645873664,645877759,CA -645877760,645980159,US -645980160,645982719,CA -645982720,645984255,US -645984256,645988351,CA -645988352,645989450,US -645989451,645989451,CA -645989452,646082559,US -646082560,646083583,CA -646083584,646084095,US -646084096,646084351,CA -646084352,646084607,US -646084608,646086655,CA -646086656,646160383,US -646160384,646164479,CA -646164480,646166527,US -646166528,646168575,CA -646168576,646194175,US -646194176,646194943,CA -646194944,646195560,US -646195561,646195561,CA -646195562,646197247,US -646197248,646198783,CA -646198784,646199384,US -646199385,646199385,CA -646199386,646250495,US -646250496,646258687,CA -646258688,646262783,US -646262784,646264831,CA -646264832,646711807,US -646711808,646712319,CA -646712320,646734847,US -646734848,646735359,CA -646735360,646765567,US -646765568,646765887,CA -646765888,646766079,US -646766080,646766591,CA -646766592,646840319,US -646840320,646841343,CA -646841344,654311423,US -654311424,654311679,CN -654311680,654311935,AU -654311936,654376959,CN -654376960,654442495,TW -654442496,654573567,JP -654573568,654835711,KR -654835712,654999551,TW -654999552,655001599,CN -655001600,655359999,TW -655360000,656408575,KR -656408576,658505727,PK -658505728,661454847,CN -661454848,661487615,HK -661487616,661520383,SG -661520384,661651455,JP -661651456,662700031,KR -662700032,666894335,CN -666894336,671088639,ID -671088640,675381247,US -675381248,675397631,SG -675397632,675422207,US -675422208,675430399,FR -675430400,675447167,US -675447168,675447295,HK -675447296,675447423,US -675447424,675447551,BR -675447552,675448575,US -675448576,675449087,GB -675449088,675449151,US -675449152,675449215,BR -675449216,675449471,US -675449472,675449599,IE -675449600,675449727,AT -675449728,675449855,FI -675449856,675449983,US -675449984,675450495,FR -675450496,675450623,NL -675450624,675450751,MY -675450752,675450879,US -675450880,675451007,JP -675451008,675451391,FR -675451392,675451519,US -675451520,675451647,AU -675451648,675451775,NL -675451776,675451903,US -675451904,675452159,HK -675452160,675452927,US -675452928,675453055,IE -675453056,675453439,US -675453440,675453503,BR -675453504,675453567,IN -675453568,675453695,AU -675453696,675453759,KR -675453760,675453951,GB -675453952,675454015,JP -675454016,675454079,CA -675454080,675454207,IE -675454208,675454271,SG -675454272,675454335,MY -675454336,675454399,KR -675454400,675454463,AU -675454464,675454719,NL -675454720,675454847,AT -675454848,675463167,US -675463168,675463295,KR -675463296,675463423,US -675463424,675463807,KR -675463808,675528703,US -675528704,675536895,NL -675536896,675545087,IE -675545088,675610623,NL -675610624,675635199,IE -675635200,675643391,CA -675643392,675659775,US -675659776,675667967,IE -675667968,675807231,US -675807232,675938303,CN -675938304,675954687,NL -675954688,675975167,JP -675975168,676168959,US -676168960,676169215,IE -676169216,676169471,HK -676169472,676169743,US -676169744,676169759,HK -676169760,676169775,IE -676169776,676169807,US -676169808,676169823,IE -676169824,676175903,US -676175904,676176191,HK -676176192,676176255,US -676176256,676176383,HK -676176384,676176639,IE -676176640,676179455,US -676179456,676179711,IE -676179712,676179839,US -676179840,676179871,HK -676179872,676179903,IE -676179904,676181599,US -676181600,676181631,IE -676181632,676192767,US -676192768,676192895,HK -676192896,676193023,IE -676193024,676193535,US -676193536,676193791,IE -676193792,676194943,US -676194944,676194975,HK -676194976,676195007,IE -676195008,676195327,US -676195328,676195359,IE -676195360,676249599,US -676249600,676251647,IN -676251648,676253731,US -676253732,676254207,AU -676254208,676254463,NL -676254464,676254719,IE -676254720,676254975,FI -676254976,676255231,AT -676255232,676255487,US -676255488,676255743,AU -676255744,676257535,US -676257536,676257791,SG -676257792,676259839,US -676259840,676261887,SG -676261888,676298751,US -676298752,676304895,FR -676304896,676306943,US -676306944,676311039,AU -676311040,676313087,FR -676313088,676317183,JP -676317184,676317439,MY -676317440,676317951,GB -676317952,676319231,IE -676319232,676319743,JP -676319744,676319999,HK -676320000,676320511,AU -676320512,676321023,IN -676321024,676321279,GB -676321280,676321791,CA -676321792,676322047,GB -676322048,676322303,IN -676322304,676322815,KR -676322816,676323327,FR -676323328,676331519,IE -676331520,676332543,GB -676332544,676333567,FI -676333568,676334591,MY -676334592,676336639,GB -676336640,676338687,FR -676338688,676339711,AT -676339712,676341759,KR -676341760,676343807,CA -676343808,676347903,NL -676347904,676368383,JP -676368384,676388863,US -676388864,676392959,KR -676392960,676397055,CA -676397056,676401151,US -676401152,676405247,HK -676405248,676409343,US -676409344,676413439,AU -676413440,676421631,IN -676421632,676442111,GB -676442112,676454399,JP -676454400,676462591,IN -676462592,676463103,US -676463104,676463615,NL -676463616,676464639,US -676464640,676495359,NL -676495360,676503551,KR -676503552,676511743,CA -676511744,676519935,AU -676519936,676524031,FR -676524032,676528127,NL -676528128,676544511,US -676544512,676560895,HK -676560896,676659199,US -676659200,676696063,IE -676696064,676708351,US -676708352,676724735,CA -676724736,676773887,US -676773888,676790271,CA -676790272,676823039,US -676823040,676831231,IE -676831232,676837375,US -676837376,676838399,NL -676838400,676839423,IE -676839424,676840447,HK -676840448,676841471,SG -676841472,676843519,JP -676843520,676845567,AU -676845568,676848639,IN -676848640,676849663,GB -676849664,676921343,US -676921344,676929535,CA -676929536,676954111,US -676954112,676970495,FR -676970496,676978687,KR -676978688,677020095,US -677020096,677020127,IE -677020128,677020159,US -677020160,677020191,NL -677020192,677020351,US -677020352,677020367,CA -677020368,677020383,AU -677020384,677020399,IN -677020400,677020479,US -677020480,677020543,GB -677020544,677020607,KR -677020608,677020927,US -677020928,677020959,NL -677020960,677020991,BR -677020992,677021023,IE -677021024,677021055,US -677021056,677021087,SG -677021088,677021951,US -677021952,677021983,JP -677021984,677022015,US -677022016,677022047,SG -677022048,677022079,US -677022080,677022143,IN -677022144,677022175,IE -677022176,677022207,US -677022208,677022239,NL -677022240,677022303,CA -677022304,677022335,SG -677022336,677022367,AU -677022368,677022431,US -677022432,677022463,IN -677022464,677022527,US -677022528,677022591,GB -677022592,677022655,KR -677022656,677022719,US -677022720,677022751,CA -677022752,677022783,AU -677022784,677022815,IN -677022816,677023007,US -677023008,677023039,NL -677023040,677023071,BR -677023072,677023135,IE -677023136,677023167,NL -677023168,677023199,US -677023200,677023231,SG -677023232,677023935,US -677023936,677023967,NL -677023968,677023999,BR -677024000,677024031,IE -677024032,677024127,US -677024128,677024159,SG -677024160,677024191,US -677024192,677024223,NL -677024224,677024255,IE -677024256,677024383,US -677024384,677024415,NL -677024416,677024447,SG -677024448,677024479,US -677024480,677024511,SG -677024512,677024543,US -677024544,677024575,CA -677024576,677024607,AU -677024608,677024639,IN -677024640,677027839,US -677027840,677036031,SG -677036032,677054463,US -677054464,677054719,PR -677054720,677057535,US -677057536,677058559,IE -677058560,677101567,US -677101568,677117951,NL -677117952,677134335,US -677134336,677134591,IE -677134592,677134847,FI -677134848,677135103,AT -677135104,677135359,NL -677135360,677135615,FI -677135616,677135871,AT -677135872,677136127,NL -677136128,677136383,IE -677136384,677136639,AT -677136640,677182975,US -677182976,677183231,KR -677183232,677199871,US -677199872,677200127,IE -677200128,677200383,FI -677200384,677200639,AT -677200640,677200895,NL -677200896,677201151,FI -677201152,677201407,AT -677201408,677201663,NL -677201664,677201919,IE -677201920,677202175,AT -677202176,677248511,US -677248512,677248767,KR -677248768,677380095,US -677380096,677380127,AU -677380128,677380159,IE -677380160,677380191,NL -677380192,677380543,US -677380544,677380583,SG -677380584,677380591,US -677380592,677380719,SG -677380720,677380759,KR -677380760,677380767,US -677380768,677380895,KR -677380896,677380927,AU -677380928,677380943,IN -677380944,677380959,FI -677380960,677380991,AU -677380992,677381055,US -677381056,677381071,FI -677381072,677381111,HK -677381112,677381119,US -677381120,677381247,HK -677381248,677381375,US -677381376,677381407,AT -677381408,677381423,NL -677381424,677381599,US -677381600,677381631,NL -677381632,677381711,US -677381712,677381759,IE -677381760,677381943,US -677381944,677381951,FI -677381952,677382015,US -677382016,677382047,NL -677382048,677382063,KR -677382064,677382479,US -677382480,677382487,FI -677382488,677382495,US -677382496,677382527,NL -677382528,677382543,CA -677382544,677382559,IE -677382560,677382575,US -677382576,677382591,AU -677382592,677382623,IE -677382624,677382639,CA -677382640,677382719,US -677382720,677382727,IE -677382728,677382751,FI -677382752,677382815,CA -677382816,677382831,NL -677382832,677382839,FI -677382840,677383191,BR -677383192,677383391,US -677383392,677383567,NL -677383568,677383583,MY -677383584,677383615,US -677383616,677383631,MY -677383632,677383695,US -677383696,677383711,MY -677383712,677383775,US -677383776,677383791,CL -677383792,677383823,MY -677383824,677383983,CL -677383984,677383999,MY -677384000,677384127,SG -677384128,677384143,US -677384144,677384159,IE -677384160,677384191,US -677384192,677384367,NL -677384368,677384399,MY -677384400,677384431,AT -677384432,677384463,US -677384464,677384495,FI -677384496,677384511,MY -677384512,677384623,KR -677384624,677384639,HK -677384640,677384671,FI -677384672,677384719,NL -677384720,677384831,US -677384832,677384991,HK -677384992,677385167,CA -677385168,677385343,FI -677385344,677385471,US -677385472,677385519,FI -677385520,677385695,AT -677385696,677385871,NL -677385872,677385919,US -677385920,677385935,CA -677385936,677385967,US -677385968,677385983,SG -677385984,677385999,FI -677386000,677386015,US -677386016,677386047,IN -677386048,677386063,HK -677386064,677386095,US -677386096,677386111,BR -677386112,677386127,CA -677386128,677386159,US -677386160,677386175,BR -677386176,677386207,CA -677386208,677386239,AU -677386240,677386359,BR -677386360,677386367,MY -677386368,677386375,AU -677386376,677386399,AT -677386400,677386415,CL -677386416,677386423,FI -677386424,677386431,AU -677386432,677386439,FI -677386440,677386495,CL -677386496,677386527,IE -677386528,677386543,AT -677386544,677386559,HK -677386560,677386575,FI -677386576,677386615,MY -677386616,677386623,IE -677386624,677386639,JP -677386640,677386655,US -677386656,677386671,AU -677386672,677386735,US -677386736,677386751,HK -677386752,677386767,US -677386768,677386799,CA -677386800,677386967,IE -677386968,677387319,US -677387320,677387327,FI -677387328,677387455,AT -677387456,677387487,FI -677387488,677387663,US -677387664,677387839,HK -677387840,677387863,AT -677387864,677387967,US -677387968,677388007,FI -677388008,677388183,US -677388184,677388223,FI -677388224,677388351,US -677388352,677388527,MY -677388528,677388703,US -677388704,677388879,FI -677388880,677389055,NL -677389056,677389231,AT -677389232,677389263,US -677389264,677389439,CA -677389440,677389615,US -677389616,677389791,IE -677389792,677389823,CA -677389824,677389999,US -677390000,677390063,CA -677390064,677390239,US -677390240,677390247,FI -677390248,677390271,AT -677390272,677390983,US -677390984,677391399,GB -677391400,677391575,US -677391576,677391959,GB -677391960,677392135,US -677392136,677392143,KR -677392144,677392159,US -677392160,677392327,KR -677392328,677392503,MY -677392504,677392679,HK -677392680,677392855,SG -677392856,677393031,NL -677393032,677393207,US -677393208,677393215,FI -677393216,677393375,AT -677393376,677393383,FI -677393384,677393391,US -677393392,677393407,FI -677393408,677393535,US -677393536,677393559,FI -677393560,677393575,NL -677393576,677393735,US -677393736,677393743,FI -677393744,677393759,NL -677393760,677393855,US -677393856,677393863,FI -677393864,677393927,US -677393928,677394279,JP -677394280,677394287,FI -677394288,677394303,AU -677394304,677394431,US -677394432,677394447,AU -677394448,677394455,FI -677394456,677394527,JP -677394528,677394559,CL -677394560,677394591,US -677394592,677394759,JP -677394760,677394767,FI -677394768,677394799,US -677394800,677394967,FI -677394968,677395319,AT -677395320,677395495,NL -677395496,677395671,IE -677395672,677395863,US -677395864,677395871,FI -677395872,677395903,IE -677395904,677396071,FI -677396072,677396079,NL -677396080,677396095,IN -677396096,677396247,NL -677396248,677396599,IE -677396600,677396623,FI -677396624,677396639,IE -677396640,677396791,FI -677396792,677396823,US -677396824,677396831,FI -677396832,677642239,US -677642240,677645311,HK -677645312,677646335,US -677646336,677647359,MY -677647360,677648383,KR -677648384,677651455,SG -677651456,677652479,JP -677652480,677653503,HK -677653504,677655551,KR -677655552,677655655,JP -677655656,677655663,US -677655664,677655919,JP -677655920,677656063,US -677656064,677656319,HK -677656320,677656575,SG -677656576,677657087,HK -677657088,677677055,US -677677056,677678591,IN -677678592,677679103,US -677679104,677679999,AU -677680000,677680127,US -677680128,677681151,AU -677681152,677683199,JP -677683200,677685247,CA -677685248,677687295,GB -677687296,677707775,US -677707776,677708799,NL -677708800,677709823,AT -677709824,677713919,NL -677713920,677714943,US -677714944,677715967,FI -677715968,677720063,IE -677720064,677721087,FI -677721088,677722111,AT -677722112,677723135,US -677723136,677724159,NL -677724160,677725183,FI -677725184,677726207,AT -677726208,677727231,IE -677727232,677728255,AT -677728256,677729279,NL -677729280,677730303,FI -677730304,677731327,NL -677731328,677732351,FR -677732352,677734399,IE -677734400,677735423,NL -677735424,677738495,US -677738496,677739775,NL -677739776,677740031,IE -677740032,677740543,FI -677740544,677742591,CA -677742592,677744639,FR -677744640,677748735,JP -677748736,677774335,US -677774336,677776383,BR -677776384,677781503,US -677781504,677783551,CL -677783552,677784575,ZA -677784576,677785599,PR -677785600,677838847,US -677838848,677838863,NL -677838864,677838879,IE -677838880,677838895,FI -677838896,677838911,AT -677838912,677838927,NL -677838928,677838943,IE -677838944,677838959,FI -677838960,677838975,AT -677838976,677838991,NL -677838992,677839007,IE -677839008,677839023,FI -677839024,677839039,AT -677839040,677839055,NL -677839056,677839071,IE -677839072,677839087,FI -677839088,677839103,AT -677839104,677839119,NL -677839120,677839135,IE -677839136,677839151,FI -677839152,677839167,AT -677839168,677839183,NL -677839184,677839199,IE -677839200,677839215,FI -677839216,677839231,AT -677839232,677839247,NL -677839248,677839263,IE -677839264,677839279,FI -677839280,677839295,AT -677839296,677839311,NL -677839312,677839327,IE -677839328,677839343,FI -677839344,677839359,AT -677839360,677840319,US -677840320,677840335,NL -677840336,677840367,IE -677840368,677840383,AT -677840384,677840399,NL -677840400,677840431,IE -677840432,677840447,AT -677840448,677840463,NL -677840464,677840495,IE -677840496,677840511,AT -677840512,677840543,NL -677840544,677840559,IE -677840560,677840575,AT -677840576,677840591,NL -677840592,677840623,IE -677840624,677840639,AT -677840640,677841919,US -677841920,677841935,FI -677841936,677841951,IE -677841952,677841967,AT -677841968,677841983,NL -677841984,677841999,FI -677842000,677842015,IE -677842016,677842031,AT -677842032,677842047,NL -677842048,677842063,FI -677842064,677842079,IE -677842080,677842095,AT -677842096,677842111,NL -677842112,677842127,FI -677842128,677842143,IE -677842144,677842159,AT -677842160,677842175,NL -677842176,677842191,FI -677842192,677842207,IE -677842208,677842223,AT -677842224,677842239,NL -677842240,677842255,FI -677842256,677842271,IE -677842272,677842287,AT -677842288,677842303,NL -677842304,677842319,FI -677842320,677842335,US -677842336,677842351,AT -677842352,677842367,NL -677842368,677842383,FI -677842384,677842399,IE -677842400,677842415,AT -677842416,677842431,NL -677842432,677842447,FI -677842448,677842463,IE -677842464,677842479,AT -677842480,677842495,NL -677842496,677842511,FI -677842512,677842527,IE -677842528,677842543,AT -677842544,677842559,NL -677842560,677844479,US -677844480,677844495,NL -677844496,677844511,AT -677844512,677844527,FI -677844528,677844543,IE -677844544,677844559,NL -677844560,677844575,AT -677844576,677844591,FI -677844592,677844607,IE -677844608,677844623,NL -677844624,677844639,AT -677844640,677844655,FI -677844656,677844671,IE -677844672,677844687,NL -677844688,677844703,AT -677844704,677844719,FI -677844720,677844735,IE -677844736,677844751,NL -677844752,677844767,AT -677844768,677844783,FI -677844784,677844799,IE -677844800,677846079,US -677846080,677846095,KR -677846096,677846111,SG -677846112,677846127,HK -677846128,677846143,MY -677846144,677846159,KR -677846160,677846175,SG -677846176,677846191,HK -677846192,677846207,MY -677846208,677846223,KR -677846224,677846239,SG -677846240,677846255,HK -677846256,677846271,MY -677846272,677846287,KR -677846288,677846303,SG -677846304,677846319,HK -677846320,677846335,MY -677846336,677846975,US -677846976,677846991,IE -677846992,677847007,AT -677847008,677847023,NL -677847024,677847039,FI -677847040,677847055,IE -677847056,677847071,AT -677847072,677847087,NL -677847088,677847103,FI -677847104,677847119,IE -677847120,677847135,AT -677847136,677847151,NL -677847152,677847167,FI -677847168,677847183,IE -677847184,677847199,AT -677847200,677847215,NL -677847216,677847231,FI -677847232,677847247,IE -677847248,677847263,AT -677847264,677847279,NL -677847280,677847295,FI -677847296,677847311,IE -677847312,677847327,AT -677847328,677847343,NL -677847344,677847359,FI -677847360,677847375,IE -677847376,677847391,AT -677847392,677847407,NL -677847408,677847423,FI -677847424,677847439,IE -677847440,677847455,AT -677847456,677847471,NL -677847472,677847487,FI -677847488,677847503,IE -677847504,677847519,AT -677847520,677847535,NL -677847536,677847551,FI -677847552,677847567,IE -677847568,677847583,AT -677847584,677847599,NL -677847600,677847615,FI -677847616,677848319,US -677848320,677848335,FI -677848336,677848351,US -677848352,677848367,IE -677848368,677848399,US -677848400,677848415,NL -677848416,677848431,IE -677848432,677848447,AT -677848448,677848463,FI -677848464,677848479,NL -677848480,677848495,IE -677848496,677848511,AT -677848512,677848527,FI -677848528,677848543,NL -677848544,677848559,IE -677848560,677848575,AT -677848576,677848591,FI -677848592,677848607,US -677848608,677848623,IE -677848624,677848639,US -677848640,677848655,FI -677848656,677848671,NL -677848672,677848687,IE -677848688,677848703,AT -677848704,677848719,FI -677848720,677848735,NL -677848736,677848751,IE -677848752,677848767,AT -677848768,677848783,FI -677848784,677848799,NL -677848800,677848815,IE -677848816,677848831,AT -677848832,677848847,FI -677848848,677848863,NL -677848864,677848879,IE -677848880,677848895,AT -677848896,677848911,FI -677848912,677848927,NL -677848928,677848943,IE -677848944,677848959,AT -677848960,677850239,US -677850240,677850255,AT -677850256,677850271,IE -677850272,677850287,FI -677850288,677850303,NL -677850304,677850319,AT -677850320,677850335,IE -677850336,677850351,FI -677850352,677850367,NL -677850368,677850383,AT -677850384,677850399,IE -677850400,677850415,FI -677850416,677850431,NL -677850432,677850447,AT -677850448,677850463,IE -677850464,677850479,FI -677850480,677850495,NL -677850496,677850511,AT -677850512,677850527,IE -677850528,677850543,FI -677850544,677850559,NL -677850560,677850575,AT -677850576,677850591,IE -677850592,677850607,FI -677850608,677850623,NL -677850624,677850639,AT -677850640,677850655,IE -677850656,677850671,FI -677850672,677850687,NL -677850688,677850703,AT -677850704,677850719,IE -677850720,677850735,FI -677850736,677850751,NL -677850752,677850767,AT -677850768,677850783,IE -677850784,677850799,FI -677850800,677850815,NL -677850816,677850831,AT -677850832,677850847,IE -677850848,677850863,FI -677850864,677850879,NL -677850880,677853695,US -677853696,677853711,AT -677853712,677853727,IE -677853728,677853743,FI -677853744,677853759,NL -677853760,677853775,AT -677853776,677853791,MY -677853792,677853807,FI -677853808,677853823,NL -677853824,677853839,AT -677853840,677853855,IE -677853856,677853871,FI -677853872,677853887,US -677853888,677853903,AT -677853904,677853919,IE -677853920,677853935,FI -677853936,677853951,NL -677853952,677853967,AT -677853968,677853983,IE -677853984,677853999,FI -677854000,677854031,NL -677854032,677854047,FI -677854048,677854063,IE -677854064,677854079,AT -677854080,677854095,NL -677854096,677854111,FI -677854112,677854127,IE -677854128,677854143,AT -677854144,677854159,NL -677854160,677854175,FI -677854176,677854191,IE -677854192,677854207,AT -677854208,677854223,NL -677854224,677854239,FI -677854240,677854255,IE -677854256,677854271,AT -677854272,677854287,NL -677854288,677854303,FI -677854304,677854319,IE -677854320,677854335,AT -677854336,677854975,US -677854976,677854991,KR -677854992,677855007,HK -677855008,677855023,SG -677855024,677855039,MY -677855040,677855055,KR -677855056,677855071,HK -677855072,677855087,SG -677855088,677855103,MY -677855104,677855119,KR -677855120,677855135,HK -677855136,677855151,SG -677855152,677855167,MY -677855168,678117887,US -678117888,678118399,CA -678118400,678150143,US -678150144,678150399,FI -678150400,678150655,IE -678150656,678150911,FI -678150912,678151167,US -678151168,678151295,NL -678151296,678152447,US -678152448,678152703,AT -678152704,678153215,NL -678153216,678158591,US -678158592,678158847,KR -678158848,678170623,US -678170624,678170815,IE -678170816,678171007,NL -678171008,678171391,IE -678171392,678171775,NL -678171776,678200831,US -678200832,678201087,BR -678201088,678202111,US -678202112,678202367,NL -678202368,678203135,IE -678203136,678203391,NL -678203392,678205183,US -678205184,678205695,NL -678205696,678205951,KR -678205952,678206463,CA -678206464,678206719,KR -678206720,678206975,IE -678206976,678207487,AU -678207488,678207999,IE -678208000,678208255,US -678208256,678208511,GB -678208512,678209023,IE -678209024,678209279,GB -678209280,678209791,IE -678209792,678211583,US -678211584,678212607,NL -678212608,678212863,GB -678212864,678214143,US -678214144,678214399,AU -678214400,678214655,US -678214656,678214911,GB -678214912,678215167,CA -678215168,678215423,US -678215424,678216191,NL -678216192,678216447,US -678216448,678216703,NL -678216704,678216959,US -678216960,678217215,AU -678217216,678217471,JP -678217472,678217983,IE -678217984,678220543,US -678220544,678221055,NL -678221056,678221567,US -678221568,678221823,CA -678221824,678222079,GB -678222080,678222335,SG -678222336,678222591,GB -678222592,678223103,FR -678223104,678223615,AU -678223616,678224127,US -678224128,678224639,IE -678224640,678224895,JP -678224896,678225407,US -678225408,678225663,NL -678225664,678225919,IE -678225920,678226175,GB -678226176,678226943,US -678226944,678227199,SG -678227200,678227455,JP -678227456,678227711,HK -678227712,678227967,JP -678227968,678228223,US -678228224,678228479,NL -678228480,678228735,IE -678228736,678428671,US -678428672,678436863,IE -678436864,678437887,US -678437888,678438015,IE -678438016,678438207,NL -678438208,678438271,IE -678438272,678438399,AU -678438400,678438591,US -678438592,678438655,NL -678438656,678438847,IN -678438848,678445055,US -678445056,678453247,IE -678453248,678461439,NL -678461440,678494207,US -678494208,678518783,IE -678518784,678543359,NL -678543360,678592511,US -678592512,678623193,NL -678623194,678623194,US -678623195,678641663,NL -678641664,678649855,AU -678649856,678658047,IE -678658048,678690815,JP -678690816,678821887,US -678821888,678854655,NL -678854656,679313407,US -679313408,679346175,CN -679346176,679346431,US -679346432,679346687,IE -679346688,679348479,US -679348480,679348735,NL -679348736,679348991,US -679348992,679349247,CA -679349248,679349375,SG -679349376,679349503,HK -679349504,679349759,JP -679349760,679350015,AU -679350016,679350271,GB -679350272,679350399,US -679350400,679350527,KR -679350528,679350655,BR -679350656,679351039,IN -679351040,679351295,FR -679351296,679351551,KR -679351552,679362559,US -679362560,679378943,CN -679378944,679403519,US -679403520,679411711,AU -679411712,679428095,US -679428096,679436287,AU -679436288,679440383,IE -679440384,679444479,US -679444480,679477247,IE -679477248,687865855,US -687865856,689963007,ZA -689963008,691011583,EG -691011584,691617791,ZA -691617792,691621887,ZW -691621888,691625983,LR -691625984,691630079,KE -691630080,691631103,ZA -691631104,691632127,GH -691632128,691633151,NG -691633152,691634175,ZW -691634176,691650559,ZA -691650560,691666943,GH -691666944,691732479,NG -691732480,691798015,TZ -691798016,691806207,ZM -691806208,691830783,ZW -691830784,691832319,ZM -691832320,691832831,ZA -691832832,691857407,ZM -691857408,691857919,KE -691857920,691858175,MU -691858176,691858431,KE -691858432,691859455,MU -691859456,691863551,ZM -691863552,691866623,ZA -691866624,691866879,CI -691866880,691929087,ZA -691994624,692011007,ZM -692011008,692027391,ZA -692027392,692035583,MG -692035584,692043775,AO -692043776,692060159,NA -692060160,692191231,EG -692191232,692207615,CI -692207616,692240383,ZA -692240384,692256767,GH -692256768,692273151,SD -692273152,692289535,EG -692289536,692305919,NG -692305920,692322303,CM -692322304,692453375,EG -692453376,692486143,MW -692486144,692518911,AO -692518912,692551679,ZA -692551680,692584447,NG -692584448,692600831,AO -692600832,692608255,EG -692608256,692608767,AO -692608768,692609023,EG -692609024,692617215,ZM -692617216,692625407,ZA -692625408,692626687,KE -692626688,692626943,AO -692626944,692633599,KE -692633600,692637135,MU -692637136,692637139,KE -692637140,692637903,MU -692637904,692637911,KE -692637912,692641791,MU -692641792,692649983,GA -692649984,692658175,NG -692658176,692666367,ZA -692666368,692674559,TZ -692674560,692682751,ML -692682752,692690943,NG -692690944,692707327,TZ -692707328,692715519,NG -692715520,692719615,BJ -692719616,692723711,MG -692723712,692727807,TD -692727808,692731903,BW -692731904,692735999,LY -692736000,692740095,GH -692740656,692740671,ZA -692744192,692748287,TZ -692748288,692752383,CV -692752384,692756479,ZA -692756480,692760575,RW -692760576,692768767,ZA -692768768,692772863,MG -692772864,692776959,ZA -692776960,692781055,AO -692781056,692785151,BW -692789248,692793343,KE -692793344,692797439,GH -692797440,692801535,CG -692801536,692805631,NG -692805632,692809727,ZA -692809728,692813823,MW -692813824,692817919,ZA -692817920,692822015,KE -692822016,692826111,UG -692826112,692830207,KE -692830208,692834303,NG -692834304,692838399,TZ -692838400,692842495,ZA -692842496,692846591,ZM -692846592,692848639,MZ -692848640,692850687,GM -692850688,692852735,LS -692852736,692854783,GH -692854784,692856831,ZA -692856832,692858879,MU -692858880,692860927,UG -692860928,692862975,ZA -692862976,692869119,NG -692869120,692871167,TZ -692871168,692877311,ZA -692877312,692879359,GA -692879360,692881407,ZA -692881408,692883455,CG -692883456,692885503,MZ -692885504,692887551,NG -692889600,692891647,KE -692891648,692893695,ZA -692893696,692895743,KE -692895744,692897791,NG -692897792,692905983,ZA -692908032,692910079,BW -692910080,692912127,NG -692912128,692914175,ZM -692914176,692916223,MW -692916224,692918271,MG -692918272,692920319,ZA -692920320,692922367,MZ -692922368,692924415,NG -692924416,692928511,ZA -692928512,692930559,GH -692930560,692932607,UG -692932608,692934655,CM -692934656,692936703,BW -692936704,692940799,ZA -692940800,692941311,MA -692941312,692941567,CA -692941568,692942847,MA -692942848,692944895,GA -692944896,692946943,MZ -692946944,692948991,EG -692948992,692951039,MU -692951040,692953087,ZA -692955136,692957183,NG -692957184,692959231,DZ -692959232,692961279,GN -692961280,692963327,TZ -692963328,692965375,ZA -692965376,692967423,CM -692968448,692969471,CD -692969472,692971519,TZ -692971520,692973567,SZ -692973568,692975615,MZ -692977664,692978687,TZ -692978688,692979711,ZA -692979712,692980735,NG -692981760,692982783,AO -692982784,692983807,EG -692983808,692984831,KE -692984832,692987903,ZA -692987904,692988927,GH -692989952,692991999,BF -692992000,692993023,MW -692993024,692994047,EG -692994048,692995071,TZ -692996096,692997119,SO -692997120,692998143,ZW -692998144,692999167,NG -692999168,693000191,SL -693000192,693001215,NG -693001216,693002239,BW -693002240,693002505,GA -693002506,693002506,CM -693002507,693003263,GA -693003264,693004287,NG -693004288,693005311,CD -693005312,693006335,SD -693006336,693007359,ZM -693007360,693008383,NE -693008384,693009407,CF -693009408,693010431,GH -693010432,693011455,ZA -693012480,693013503,TG -693013504,693014527,ZA -693014528,693015551,GH -693015552,693016575,EG -693016576,693017599,GA -693017600,693018623,NG -693019648,693020671,ZA -693020672,693021695,TZ -693021696,693022719,NG -693022720,693023743,KE -693024768,693026815,ZA -693026816,693028863,CD -693028864,693029887,ZA -693029888,693030911,CM -693030912,693031935,NG -693031936,693032959,ZA -693032960,693033983,MW -693033984,693035007,ZA -693035008,693036031,NG -693036032,693038079,ZA -693039104,693040127,GA -693040128,693041151,ZA -693041152,693042175,MW -693042176,693043199,NG -693044224,693045247,NG -693045248,693046271,KE -693046272,693047295,ZW -693047296,693049343,ZA -693049344,693050367,SS -693050368,693051391,ZW -693051392,693052415,BW -693052416,693054463,ZA -693054464,693055487,BI -693055488,693056511,GQ -693056512,693057535,NA -693057536,693058559,ZW -693058560,693059583,SC -693059584,693060607,NG -693060608,693061631,TZ -693061632,693064703,ZA -693065728,693066751,MW -693066752,693067775,ZA -693067776,693068799,GH -693068800,693069823,TZ -693069824,693071871,ZA -693071872,693072895,ZW -693072896,693073919,NG -693073920,693074943,SS -693074944,693075967,CV -693075968,693076991,CM -693076992,693078015,MU -693078016,693079039,BW -693080064,693081087,NG -693081088,693082111,ZA -693082112,693083135,NG -693083136,693086207,ZA -693086208,693087231,KE -693087232,693088255,ZA -693088256,693089279,NG -693089280,693090303,ZA -693090304,693091327,TZ -693091328,693092351,ZW -693092352,693093375,ZA -693093376,693094399,SO -693094400,693095423,GN -693095424,693096447,NG -693096448,693097471,EG -693097472,693098495,ZA -693098496,693099519,BJ -693099520,693100543,ZA -693100544,693101567,BI -693101568,693102591,KE -693102592,693103615,CD -693103616,693104639,GN -693104640,693105663,ZA -693105664,693106687,MZ -693106688,693106951,TZ -693106952,693106959,ZA -693106960,693107711,TZ -693107712,693239807,KE -693239808,693370879,SN -693370880,693403647,ZA -693403648,693411583,KE -693411584,693411839,MU -693411840,693420031,NG -693420032,693423103,UG -693423104,693424127,KE -693424128,693428223,UG -693428224,693436415,SZ -693436416,693477375,ZA -693477376,693485567,BJ -693485568,693493759,ZW -693493760,693501951,ZA -693501952,693510143,LR -693510144,693511167,SC -693511168,693511423,RU -693511424,693518335,SC -693518336,693534719,ZA -693534720,693542911,NG -693542912,693551103,TZ -693551104,693559295,ZA -693559296,693567487,BJ -693567488,693575679,MW -693583872,693592063,NG -693592064,693600255,MU -693600256,693608447,MA -693608448,693616639,BW -693616640,693633023,ZA -693633024,693698559,EG -693698560,693829631,KE -693829632,693895167,EG -693895168,693927935,MA -693927936,693960703,CM -693960704,693993471,TZ -693993472,694026239,GH -694026240,694091775,MZ -694091776,694157311,SD -694157312,695205887,DZ -695205888,696254463,ZA -696254464,696516607,EG -696516608,696778751,ZA -696778752,696844287,MU -696844288,696909823,MA -696909824,696918015,UG -696918016,696926207,NE -696926208,696928255,ZA -696928256,696930303,BW -696930304,696932351,RW -696932352,696933375,BJ -696933376,696934399,ZA -696934400,696942591,BF -696942592,696950783,MR -696950784,696958975,NG -696958976,696963071,TZ -696963072,696967167,UG -696967168,696971263,MZ -696971264,696974335,KE -696974336,696975359,LU -696975360,696991743,GH -696991744,697008127,NG -697008128,697040895,KE -697040896,697303039,MA -697303040,697827327,ZA -697827328,697958399,EG -697958400,698023935,ZA -698023936,698056703,NG -698056704,698089471,EG -698089472,698220543,ZA -698220544,698351615,GA -698351616,699334655,ZA -699334656,699342847,ZM -699342848,699359231,ZA -699359232,699367423,ZW -699367424,699400191,ZA -699400192,699465727,EG -699465728,699531263,ZA -699531264,699662335,EG -699662336,699793407,ZA -699793408,699858943,NA -699858944,699924479,ZA -699924480,699990015,NG -699990016,700055551,ZA -700055552,700121087,RW -700121088,700186623,EG -700186624,700203007,MG -700203008,700219391,MR -700219392,700235775,TZ -700235776,700252159,ZA -700252160,700260351,NG -700260352,700268543,CI -700268544,700276735,ZA -700293120,700301311,GH -700301312,700309503,CD -700309504,700317695,DJ -700317696,700325887,NG -700325888,700334079,ZW -700334080,700335103,BJ -700335104,700336127,GH -700336128,700337151,CG -700337152,700338175,UG -700338176,700339199,CD -700339200,700340223,NA -700340224,700341247,GH -700341248,700342271,MW -700342272,700350463,NA -700350464,700351487,MU -700351488,700352511,UG -700352512,700358655,MU -700358656,700366847,MZ -700366848,700375039,UG -700375040,700376063,CM -700376064,700377087,NE -700377088,700378111,CD -700378112,700379135,MG -700380160,700381183,BW -700381184,700382207,EG -700382208,700383231,KE -700383232,700399615,EG -700399616,700400639,BW -700400640,700401663,CI -700401664,700402687,MZ -700402688,700403711,UG -700403712,700404735,EG -700404736,700405759,BJ -700405760,700406783,ZA -700407808,700408831,GH -700408832,700409855,CM -700409856,700410879,LR -700412928,700413951,ZM -700413952,700414975,SC -700414976,700432383,ZA -700432384,700434431,KE -700434432,700436479,LS -700436480,700437503,NG -700437504,700438527,MU -700438528,700439551,BW -700439552,700440575,GN -700440576,700442623,MU -700442624,700444671,ZW -700444672,700446719,GH -700446720,700447743,SL -700447744,700448767,DZ -700448768,700587007,ZA -700587008,700587263,ZM -700587264,700588287,ZA -700588288,700588543,KM -700588544,700593151,ZA -700593152,700594175,NG -700594176,700595199,ZA -700595200,700596223,CD -700596224,700598783,ZA -700598784,700599039,CG -700599040,700710911,ZA -700710912,700776447,EG -700776448,700841983,RW -700841984,700844031,GB -700844032,700846079,ZA -700846080,700858367,NA -700858368,700862463,ZA -700862464,700866559,ZM -700866560,700866815,NG -700866816,700867327,NA -700867328,700867583,NG -700867584,700870655,NA -700870656,700874751,GB -700874752,700907519,ZA -700907520,700973055,EG -700973056,701104127,DZ -701104128,701112319,GH -701112320,701120511,ZA -701120512,701145087,CI -701145088,701153279,SD -701153280,701161471,CM -701161472,701169663,UG -701169664,701186047,ZA -701186048,701202431,NG -701202432,701210623,NE -701210624,701214719,ZA -701214720,701218815,LS -701218816,701222911,ML -701222912,701227007,KE -701227008,701231103,BF -701231104,701235199,SC -701235200,701243391,SZ -701243392,701251583,GH -701251584,701259775,CM -701259776,701267967,MG -701267968,701276159,TZ -701276160,701284351,KE -701284352,701292543,ZA -701292544,701300735,NG -701300736,701308927,CM -701308928,701317119,AO -701317120,701325311,CM -701325312,701333503,EG -701333504,701341695,NA -701341696,701349887,NG -701349888,701358079,MA -701358080,701366271,SL -701366272,701374463,NG -701374464,701382655,KE -701382656,701390847,CI -701390848,701391871,MU -701391872,701392127,KE -701392128,701392383,MU -701392384,701392639,ZA -701392640,701399039,MU -701399040,701407231,EG -701407232,701423615,ZA -701431808,701439999,CI -701440000,701448191,MG -701448192,701462783,KE -701462784,701463039,CG -701463040,701463807,KE -701463808,701464063,CG -701464064,701464575,KE -701464576,701472767,MU -701472768,701480959,TG -701480960,701489151,CI -701490176,701491199,AO -701491200,701492223,MU -701492224,701493247,ZA -701493248,701495295,TZ -701495296,701496319,NG -701496320,701497343,GH -701497344,701513727,ZA -701513728,701530111,LY -701530112,701546495,SN -701546496,701562879,ZA -701562880,701579263,KE -701579264,701595647,SD -701612032,701628415,EG -701628416,701644799,GH -701644800,701661183,DZ -701661184,701677567,UG -701677568,701693951,AO -701693952,701702143,GH -701702144,701710335,SZ -701710336,701718527,MU -701718528,701726719,CM -701726720,701743103,GA -701743104,701759487,NG -701759488,701792255,KE -701792256,701825023,MU -701825024,701857791,ZA -701857792,701890559,RE -701890560,701923327,SN -701923328,701956095,MA -701956096,701992959,KE -701992960,701997055,SZ -701997056,702001151,GH -702001152,702005247,ZM -702005248,702009343,KE -702009344,702013439,CV -702013440,702015487,KE -702015488,702017535,ZA -702017536,702018559,EG -702018560,702019583,NG -702019584,702020607,MU -702020608,702021631,CD -702021632,702029823,ZM -702029824,702038015,BJ -702038016,702046207,ZM -702046208,702053375,RW -702053376,702054399,ZW -702054400,702058495,ZA -702058496,702062591,BF -702062592,702066687,NG -702066688,702066943,PL -702066944,702067199,NL -702067200,702067711,PL -702067712,702068735,NL -702068736,702069759,ZA -702069760,702070271,US -702070272,702070783,RU -702070784,702074879,ZA -702074880,702076927,BW -702076928,702078975,TZ -702078976,702079999,MA -702080000,702081023,MW -702081024,702082047,CM -702082048,702083071,AO -702087168,702119935,NG -702119936,702128127,CM -702128128,702136319,EG -702136320,702137343,ZA -702138368,702139391,TZ -702139392,702140415,NG -702140416,702141439,MZ -702141440,702142463,MU -702142464,702143487,MW -702143488,702144511,KE -702144512,702146559,EG -702146560,702148607,UG -702148608,702150655,ZA -702152704,702169087,SD -702169088,702181375,NA -702181376,702185471,AO -702185472,702201855,EG -702201856,702218239,GH -702218240,702234623,SN -702234624,702251007,NA -702251008,702283775,NG -702283776,702287871,UG -702287872,702291967,ZW -702291968,702296063,MZ -702296064,702300159,GH -702300160,702308351,NG -702308352,702312447,SC -702312448,702316543,KE -702316544,702320639,TZ -702320640,702324735,DZ -702324736,702328831,MZ -702328832,702332927,TZ -702332928,702337023,MZ -702337024,702341119,UG -702341120,702342111,MU -702342112,702342127,KE -702342128,702343039,MU -702343040,702343103,KE -702343104,702344199,MU -702344200,702344971,KE -702344972,702345215,MU -702345216,702349311,KE -702349312,702353407,ZA -702353408,702357503,DZ -702357504,702365695,TZ -702365696,702369791,MZ -702369792,702373887,UG -702373888,702377983,MW -702382080,702386175,EG -702386176,702390271,ZW -702390272,702394367,NG -702394368,702398463,ML -702398464,702402559,CV -702402560,702407167,ZA -702407168,702407423,BJ -702407424,702410751,ZA -702410752,702414847,AO -702414848,702416895,MU -702416896,702418943,KE -702418944,702420991,ZM -702420992,702423039,TZ -702423040,702425087,ZA -702425088,702427135,NG -702427136,702429183,ZA -702429184,702431231,TZ -702431232,702433279,NG -702433280,702434303,SS -702434304,702435327,NG -702437376,702439423,TZ -702439424,702441471,MU -702441472,702443519,ZA -702443520,702445567,GQ -702445568,702447615,ZA -702447616,702449663,EG -702449664,702451711,ZA -702451712,702453759,NG -702453760,702457855,ZA -702457856,702459903,EG -702459904,702461951,TZ -702461952,702463999,MW -702464000,702465023,BJ -702465024,702466047,CD -702466048,702467071,AO -702467072,702468095,SC -702468096,702469119,NG -702469120,702470143,ZA -702470144,702471167,CD -702471168,702474239,ZA -702474240,702475263,GH -702475264,702476287,AO -702476288,702477311,ZM -702477312,702478335,RW -702478336,702480383,AO -702481408,702482431,TZ -702482432,702483455,ZA -702484480,702485503,TZ -702485504,702486527,EG -702486528,702487551,ZA -702487552,702488575,CM -702488576,702490623,ZA -702490624,702491647,AO -702491648,702492671,NG -702492672,702493695,GN -702493696,702493962,EG -702493963,702493963,PH -702493964,702494719,EG -702494720,702495743,KE -702495744,702496767,ZA -702496768,702497791,NG -702498816,702499839,BW -702499840,702500863,MU -702500864,702501887,NA -702501888,702502911,UG -702502912,702503935,CG -702503936,702504959,CM -702504960,702505983,MR -702505984,702507007,AO -702507008,702508031,CD -702508032,702509055,SO -702509056,702509391,KE -702509392,702509399,AO -702509400,702509471,KE -702509472,702509479,CD -702509480,702509911,KE -702509912,702509919,AO -702509920,702510079,KE -702510080,702511103,ZM -702511104,702512127,ZA -702512128,702513151,MZ -702513152,702514175,NG -702514176,702515199,SL -702515200,702516223,NG -702516224,702517247,BW -702517248,702518271,NG -702518272,702519295,KE -702519296,702520319,MZ -702520320,702521343,AO -702521344,702522367,SD -702522368,702523391,AO -702523392,702524415,GA -702524416,702525439,ZA -702525440,702526463,DZ -702526464,702527487,TZ -702527488,702528511,CF -702528512,702529535,CG -702529536,702530559,BW -702530560,702531583,EG -702531584,702532607,SD -702532608,702533631,SC -702534656,702535679,GM -702535680,702536703,SC -702536704,702538751,MU -702538752,702539775,TZ -702539776,702540799,BF -702540800,702541823,DZ -702541824,702542847,EG -702542848,702543871,ZA -702543872,702544895,BJ -702544896,702545919,ZA -702545920,703070207,TN -703070208,703071999,EG -703072000,703072255,CD -703072256,703594495,EG -703594496,703725567,SD -703725568,703727615,KE -703727616,703728639,TZ -703728640,703733759,LY -703733760,703735807,CI -703735808,703737855,ZA -703737856,703746047,NG -703746048,703747071,ZA -703747072,703748095,CD -703748096,703749119,GN -703749120,703750143,NG -703750144,703754239,MG -703754240,703755263,GH -703755264,703756287,YT -703756288,703757311,ZA -703757312,703758335,RE -703758336,703759359,CD -703760384,703761407,GH -703761408,703762431,RW -703762432,703764479,MU -703766528,703770623,ZA -703770624,703774719,BJ -703774720,703791103,ZA -703791104,703856639,CD -703856640,703922175,CM -703954944,703987711,NG -703987712,704118783,ZA -704118784,704380927,MA -704380928,704643071,LY -704643072,704644095,CN -704644096,704645119,BD -704645120,704650239,CN -704650240,704651263,MY -704651264,704659455,CN -704659456,704675839,TW -704675840,704723967,CN -704723968,704724991,MY -704724992,704741375,VN -704741376,704774143,CN -704774144,704905215,HK -704905216,705167359,CN -705167360,707788799,KR -707788800,708575231,CN -708575232,708706303,SG -708706304,708751359,CN -708751360,708752383,ID -708752384,708755455,CN -708755456,708771839,AU -708771840,708837375,CN -708837376,709885951,TW -709885952,710017023,CN -710017024,710082559,KR -710082560,710098943,JP -710098944,710104063,CN -710104064,710105087,PK -710105088,710934527,CN -710934528,710950911,VN -710950912,710961151,CN -710961152,710962175,TH -710962176,711065599,CN -711065600,711131135,HK -711131136,711160831,CN -711160832,711161855,HK -711161856,711163903,CN -711163904,711164727,JP -711164728,711164735,HK -711164736,711166463,JP -711166464,711166591,HK -711166592,711169311,JP -711169312,711169327,IN -711169328,711173247,JP -711173248,711173375,SG -711173376,711196671,JP -711196672,711458815,CN -711458816,711983103,IN -711983104,712179711,VN -712179712,712212479,KH -712212480,712507391,VN -712507392,712712191,CN -712712192,712713215,JP -712713216,712769535,CN -712769536,713031679,JP -713031680,714080255,CN -714080256,714604543,JP -714604544,714866687,MY -714866688,714874879,CN -714874880,714875903,MY -714875904,716930047,CN -716930048,716931071,JP -716931072,716963839,CN -716963840,717225983,MY -717225984,717750271,CN -717750272,717815807,HK -717815808,717848575,CN -717848576,717881343,PK -717881344,720437247,CN -720437248,720502783,AU -720502784,721420287,CN -721420288,728883199,JP -728883200,728883327,CZ -728883328,728883455,BG -728883456,728883583,HU -728883584,728883711,RS -728883712,728883839,SI -728883840,728883967,BA -728883968,728884095,HR -728884096,728884223,SK -728884224,733944831,JP -733944832,733945855,US -733945856,736100351,JP -736100352,736101375,IN -736101376,736102399,HK -736102400,736103423,IN -736103424,736104447,CN -736104448,736105471,ID -736105472,736106495,TW -736106496,736107519,CN -736107520,736108543,HK -736108544,736109567,JP -736109568,736110591,LA -736110592,736111615,MM -736111616,736112639,CN -736112640,736113663,HK -736113664,736115711,CN -736115712,736116735,AU -736116736,736119807,CN -736119808,736120831,AU -736120832,736121855,CN -736121856,736122879,MM -736122880,736123903,MO -736123904,736124927,HK -736124928,736125951,IN -736125952,736126975,CN -736126976,736127999,KR -736128000,736131071,BD -736131072,736132095,NZ -736132096,736133119,LK -736133120,736136191,IN -736136192,736137215,JP -736137216,736138239,CN -736138240,736139263,HK -736139264,736140287,SG -736140288,736141311,IN -736141312,736142335,CN -736142336,736143359,IN -736143360,736144383,ID -736144384,736145407,IN -736145408,736146431,CN -736146432,736147455,IN -736147456,736148479,CN -736148480,736149503,NZ -736149504,736150527,NC -736150528,736151551,HK -736151552,736156671,CN -736156672,736157695,IN -736157696,736158719,CN -736158720,736160767,HK -736160768,736161791,PK -736161792,736162815,CN -736162816,736163839,HK -736163840,736164351,TW -736164352,736164863,NZ -736164864,736166911,IN -736166912,736167935,SG -736167936,736168959,HK -736168960,736169983,AU -736169984,736173055,IN -736173056,736174079,HK -736174080,736175103,AU -736175104,736176127,HK -736176128,736177151,BN -736177152,736178175,HK -736178176,736178431,AU -736178432,736178432,NZ -736178433,736179199,AU -736179200,736180223,AE -736180224,736181247,HK -736181248,736182271,AU -736182272,736183295,ID -736183296,736185343,IN -736185344,736186367,CN -736186368,736187391,IN -736187392,736188415,CN -736188416,736189439,JP -736189440,736190463,IN -736190464,736191487,PK -736191488,736193535,HK -736193536,736194559,MY -736194560,736195583,NZ -736195584,736196607,IN -736196608,736198655,CN -736198656,736199679,AU -736199680,736200703,HK -736200704,736201727,BN -736201728,736202751,CN -736202752,736203775,AU -736203776,736204799,BD -736204800,736205823,SG -736205824,736206847,HK -736206848,736209919,IN -736209920,736210943,CN -736210944,736211967,AU -736211968,736212991,CN -736212992,736214015,ID -736214016,736216063,IN -736216064,736217087,HK -736217088,736218111,NZ -736218112,736219135,BD -736219136,736220159,CN -736220160,736221183,IN -736221184,736229375,CN -736229376,736230399,IN -736230400,736231423,CN -736231424,736231935,AU -736231936,736232447,IN -736232448,736233471,PH -736233472,736234495,NZ -736234496,736235519,KH -736235520,736237567,HK -736237568,736239615,IN -736239616,736263167,CN -736263168,736264191,HK -736264192,736286719,CN -736286720,736287743,NZ -736287744,736288767,MV -736288768,736289791,MY -736289792,736289919,KR -736289920,736290047,JP -736290048,736290303,AU -736290304,736290559,MY -736290560,736290815,KR -736290816,736291839,TW -736291840,736300031,CN -736300032,736301055,HK -736301056,736303103,IN -736303104,736304127,TW -736304128,736305151,HK -736305152,736324607,CN -736324608,736325631,AU -736325632,736326655,HK -736326656,736328703,KR -736328704,736329727,AU -736329728,736331775,IN -736331776,736334847,CN -736334848,736335871,ID -736335872,736354303,CN -736354304,736355327,IN -736355328,736356351,SG -736356352,736357375,CN -736357376,736358399,HK -736358400,736359423,SG -736359424,736360447,IN -736360448,736380927,CN -736380928,736381951,IN -736381952,736382975,CN -736382976,736383999,TH -736384000,736385023,LA -736385024,736386047,HK -736386048,736388095,IN -736388096,736389119,CN -736389120,736390143,JP -736390144,736391167,LK -736391168,736392191,IN -736392192,736394239,CN -736394240,736395007,SG -736395008,736395263,HK -736395264,736396287,MN -736396288,736398335,CN -736398336,736399359,IN -736400384,736402431,CN -736402432,736402687,NZ -736402688,736402943,SG -736402944,736403071,MY -736403072,736403199,BN -736403200,736403327,AU -736403328,736403455,PK -736403456,736404479,KR -736405504,736406527,IN -736407552,736408575,IN -736408576,736409599,HK -736409600,736410623,US -736410624,736411647,CN -736411648,736412671,NP -736412672,736413695,TH -736413696,736414719,MY -736414720,736415743,HK -736415744,736416767,BD -736416768,736417791,SG -736417792,736418815,HK -736418816,736421887,IN -736421888,736422911,SG -736422912,736423935,IN -736423936,736424959,HK -736424960,736428031,MY -736428032,736429055,IN -736429056,736430079,HK -736430080,736431103,IN -736431104,736432127,BD -736432128,736433151,CN -736433152,736434175,ID -736434176,736435199,IN -736435200,736436223,HK -736436224,736437247,JP -736437248,736438271,HK -736438272,736439295,CN -736439296,736440319,TH -736440320,736441343,CN -736441344,736442367,HK -736442368,736443391,CN -736443392,736445439,AU -736445440,736446463,TH -736446464,736447487,IN -736447488,736448511,TH -736448512,736449535,IN -736449536,736450559,SG -736450560,736452607,IN -736452608,736453631,CN -736453632,736455679,IN -736455680,736458751,HK -736458752,736459775,CN -736459776,736460799,BT -736460800,736461823,SG -736461824,736462847,TH -736462848,736465919,CN -736465920,736466943,TH -736466944,736467967,HK -736467968,736468991,SG -736468992,736470015,IN -736470016,736471039,PK -736471040,736479231,CN -736479232,736480255,IN -736480256,736481279,ID -736481280,736482303,BD -736482304,736483327,HK -736483328,736485375,CN -736485376,736486399,IN -736487424,736489471,CN -736489472,736491519,JP -736491520,736493567,ID -736493568,736494591,KR -736494592,736495103,ID -736495104,736495359,NR -736495360,736495615,ID -736495616,736498687,HK -736498688,736499711,CN -736499712,736500479,SG -736500480,736500735,TH -736500736,736501759,ID -736501760,736502783,CN -736502784,736505855,IN -736505856,736506879,AU -736506880,736508927,JP -736508928,736509951,KH -736509952,736510975,AU -736510976,736513023,CN -736513024,736515071,KR -736515072,736516095,CN -736516096,736517119,HK -736517120,736518143,PK -736518144,736519167,HK -736519168,736520191,AU -736520192,736521215,IN -736521216,736521747,AU -736521748,736521748,US -736521749,736522239,AU -736522240,736524287,HK -736524288,736525311,BD -736525312,736526335,CN -736526336,736527359,ID -736527360,736528383,IN -736528384,736529407,CN -736529408,736531455,HK -736531456,736532479,IN -736532480,736533503,ID -736533504,736535551,IN -736535552,736536575,HK -736536576,736537599,CN -736537600,736538623,IN -736538624,736539647,AU -736539648,736540671,SG -736540672,736541695,IN -736541696,736542719,HK -736542720,736543743,KH -736543744,736545791,IN -736545792,736546815,HK -736546816,736547071,BT -736547072,736547327,AF -736547328,736547839,BD -736547840,736548863,IN -736548864,736549887,KR -736549888,736559103,CN -736559104,736560127,HK -736560128,736561151,MY -736561152,736562175,HK -736562176,736563199,SG -736563200,736564223,HK -736564224,736565247,BD -736565248,736566271,AU -736566272,736567295,MV -736567296,736571391,CN -736571392,736574463,IN -736574464,736575487,PK -736575488,736576511,KH -736576512,736577535,AU -736577536,736578559,MY -736578560,736579583,BD -736579584,736587775,CN -736587776,736588799,MN -736588800,736591871,IN -736591872,736592383,ID -736592384,736592639,SG -736592640,736592895,AF -736592896,736593919,IN -736593920,736606207,CN -736606208,736607231,HK -736607232,736608255,JP -736608256,736609279,NZ -736609280,736610303,CN -736610304,736611327,AU -736611328,736612351,IN -736612352,736613375,NP -736613376,736615423,IN -736615424,736616447,JP -736616448,736617471,MY -736617472,736618495,PH -736618496,736621567,IN -736621568,736622591,JP -736622592,736624639,IN -736624640,736886783,JP -736886784,737096703,CN -737096704,737099775,IN -737099776,737100799,HK -737100800,737101823,IN -737101824,737102847,BD -737102848,737104895,IN -737104896,737105919,HK -737105920,737106943,IN -737106944,737108991,NZ -737108992,737109503,SG -737109504,737109759,AU -737109760,737110015,SG -737110016,737111039,JP -737111040,737113087,IN -737113088,737115135,CN -737115136,737118207,IN -737118208,737119231,HK -737119232,737119999,NL -737120000,737121279,IN -737121280,737122303,VN -737122304,737123327,IN -737123328,737126399,HK -737126400,737127423,IN -737127424,737129471,CN -737129472,737130495,NZ -737130496,737132543,VN -737132544,737139711,IN -737139712,737141759,VN -737141760,737142783,IN -737142784,737143039,HK -737143040,737143807,MY -737143808,737146879,IN -737146880,737147391,US -737147392,737147903,NZ -737147904,737148927,MY -737148928,737149951,CN -737149952,737151999,IN -737152000,737154047,HK -737154048,737155071,MY -737155072,737156095,TW -737156096,737157119,HK -737157120,737158143,NZ -737158144,737159167,HK -737159168,737160191,AU -737160192,737161215,TW -737161216,737162239,CN -737162240,737163263,BD -737163264,737165311,CN -737165312,737166335,IN -737166336,737169407,CN -737169408,737170431,ID -737170432,737171455,CN -737171456,737172479,GU -737172480,737173503,HK -737173504,737174527,AU -737174528,737175551,BD -737175552,737177599,TW -737177600,737178623,AU -737178624,737179647,HK -737179648,737180671,AU -737180672,737184767,CN -737184768,737185791,VU -737185792,737186815,HK -737186816,737187839,ID -737187840,737188863,TW -737188864,737206271,CN -737206272,737208319,ID -737208320,737209343,AU -737209344,737220607,CN -737220608,737222655,IN -737222656,737223679,TW -737223680,737224703,IN -737224704,737224959,MY -737224960,737224971,AU -737224972,737225215,IN -737225216,737225223,AU -737225224,737225727,IN -737225728,737225983,KR -737225984,737226751,HK -737226752,737227775,CN -737227776,737228799,AU -737228800,737229823,TH -737229824,737232895,IN -737232896,737233919,HK -737233920,737239039,CN -737239040,737240063,MY -737240064,737241087,HK -737241088,737243135,KR -737243136,737244159,CN -737244160,737249279,IN -737249280,737250303,BT -737250304,737252351,IN -737252352,737253375,ID -737253376,737255423,HK -737255424,737256447,TW -737256448,737257471,WS -737257472,737262591,CN -737262592,737263615,AU -737263616,737264639,IN -737264640,737265663,CN -737265664,737266687,AU -737266688,737267711,HK -737267712,737276927,CN -737276928,737277951,IN -737277952,737279999,CN -737280000,737281023,KR -737281024,737282047,SG -737282048,737288191,CN -737288192,737289215,HK -737289216,737290239,IN -737290240,737291263,AU -737291264,737297407,CN -737297408,737298431,AU -737298432,737305599,CN -737305600,737306623,PK -737306624,737307647,IN -737307648,737308671,MY -737308672,737309695,KR -737309696,737312767,IN -737312768,737313791,HK -737313792,737314303,ID -737314304,737314815,MM -737314816,737315839,JP -737315840,737316863,HK -737316864,737324031,CN -737324032,737325055,HK -737325056,737326079,PK -737326080,737327103,CN -737327104,737328127,SG -737328128,737331199,CN -737331200,737332223,HK -737332224,737333247,CN -737333248,737335295,IN -737335296,737337343,CN -737337344,737339391,IN -737339392,737341439,HK -737341440,737342463,MN -737342464,737343487,IN -737343488,737344511,AU -737344512,737345535,CN -737345536,737346559,AU -737346560,737350655,CN -737350656,737350911,AU -737350912,737351679,NZ -737351680,737352703,CN -737352704,737354751,HK -737354752,737355775,IN -737355776,737356287,HK -737356288,737356799,GB -737356800,737359871,HK -737359872,737361919,NZ -737361920,737364991,HK -737364992,737367039,IN -737367040,737367807,GB -737367808,737368063,DE -737368064,737369087,CN -737369088,737370111,HK -737370112,737371135,NP -737371136,737375231,HK -737375232,737375743,AU -737375744,737375999,SG -737376000,737376255,AU -737376256,737377279,HK -737377280,737378303,PH -737378304,737379327,CN -737379328,737380351,BD -737380352,737381375,CN -737381376,737382399,ID -737382400,737384447,CN -737384448,737385471,ID -737385472,737386495,CN -737386496,737387519,MN -737387520,737388543,HK -737388544,737389567,CN -737389568,737390591,IN -737390592,737391615,HK -737391616,737392639,CN -737392640,737393663,ID -737393664,737394687,CN -737394688,737395711,HK -737395712,737396735,NZ -737396736,737397759,AU -737397760,737398783,BD -737398784,737399807,HK -737399808,737400831,IN -737400832,737401855,KR -737401856,737403903,HK -737403904,737405951,CN -737405952,737406975,AU -737406976,737407999,HK -737408000,737409023,CN -737409024,737410047,HK -737410048,737411071,TW -737411072,737476607,JP -737476608,737478655,IN -737478656,737479679,PK -737479680,737480703,IN -737480704,737481727,SG -737481728,737482751,IN -737482752,737484799,AU -737484800,737485823,KH -737485824,737487871,AU -737487872,737488895,MM -737488896,737489151,AU -737489152,737489407,SG -737489408,737489919,HK -737489920,737490943,NZ -737490944,737491967,FJ -737491968,737492447,SG -737492448,737492479,MY -737492480,737492735,SG -737492736,737492991,HK -737492992,737497087,AU -737497088,737498111,NZ -737498112,737499135,NP -737499136,737500159,IN -737500160,737501183,NP -737501184,737502207,SG -737502208,737503231,IN -737503232,737505279,SG -737505280,737506303,AU -737506304,737508351,BD -737508352,737509375,MY -737509376,737510399,PK -737510400,737511423,AU -737511424,737512447,IN -737512448,737513471,BD -737513472,737514495,TH -737514496,737515519,IN -737515520,737516543,AU -737516544,737517567,IN -737517568,737519615,AU -737519616,737519871,HK -737519872,737520127,SG -737520128,737520639,AU -737520640,737521663,NZ -737521664,737522687,AU -737522688,737525759,ID -737525760,737526783,BD -737526784,737527295,US -737527296,737527551,SG -737527552,737527807,ID -737527808,737528831,KH -737528832,737529855,PK -737529856,737530879,IN -737530880,737531903,NC -737531904,737532927,KH -737532928,737533183,HK -737533184,737533184,PH -737533185,737533439,MY -737533440,737533695,VN -737533696,737533951,TW -737533952,737534975,AU -737534976,737535999,SG -737536000,737537023,BD -737537024,737538047,NP -737538048,737539071,NZ -737539072,737540095,BD -737540096,737541119,ID -737541120,737542143,SG -737542144,737567743,CN -737567744,737570815,IN -737570816,737571839,CN -737571840,737572863,HK -737572864,737574911,IN -737574912,737575935,JP -737575936,737576959,HK -737576960,737581055,IN -737581056,737582079,KR -737582080,737584127,IN -737584128,737585151,MY -737585152,737587199,HK -737587200,737588223,MY -737588224,737589247,KR -737589248,737590271,TH -737590272,737591295,TW -737591296,737593343,JP -737593344,737594367,BD -737594368,737596415,HK -737596416,737597439,CN -737597440,737598463,TW -737598464,737600511,PK -737600512,737601535,CN -737601536,737602559,AU -737602560,737607679,IN -737607680,737608703,HK -737608704,737610751,CN -737610752,737611775,ID -737611776,737612799,PH -737612800,737613823,ID -737613824,737614847,MO -737614848,737615871,IN -737615872,737617919,ID -737617920,737618943,IN -737618944,737620991,CN -737620992,737622015,IN -737622016,737623039,TH -737623040,737624063,GU -737624064,737625087,AU -737625088,737626111,CN -737626112,737627135,CA -737627136,737628159,CN -737628160,737629183,AU -737629184,737634303,CN -737634304,737635327,KR -737635328,737637375,CN -737637376,737638399,AU -737638400,737639423,PK -737639424,737641471,AU -737641472,737642495,HK -737642496,737645567,IN -737645568,737647615,CN -737647616,737649663,IN -737649664,737650687,HK -737650688,737651711,JP -737651712,737652735,NZ -737652736,737656831,CN -737656832,737657855,KR -737657856,737675263,CN -737675264,737676287,HK -737676288,737677311,PK -737677312,737678335,TW -737678336,737679359,CN -737679360,737680383,ID -737680384,737681407,CN -737681408,737683455,IN -737683456,737684479,JP -737684480,737685503,AU -737685504,737686527,CN -737686528,737687551,AU -737688576,737690623,HK -737690624,737692671,IN -737692672,737712127,CN -737712128,737713151,IN -737713152,737714175,FM -737714176,737715199,JP -737715200,737718271,HK -737718272,737727487,CN -737727488,737728511,ID -737728512,737729535,JP -737729536,737730559,IN -737730560,737731583,HK -737731584,737733631,CN -737733632,737735679,IN -737735680,737736703,CN -737736704,737737727,HK -737737728,737738751,IN -737738752,737741823,CN -737741824,737742847,SG -737742848,737744895,HK -737744896,737745919,CN -737745920,737746943,HK -737746944,737747967,TH -737747968,737748479,HK -737748480,737748991,SG -737748992,737750015,AF -737750016,737751039,JP -737751040,737753087,IN -737753088,737757183,TH -737757184,737757439,JP -737757440,737757695,HK -737757696,737757951,AU -737757952,737758207,SG -737758208,737760255,HK -737760256,737761279,IN -737761280,737762303,HK -737762304,737763327,JP -737763328,737765375,HK -737765376,737768447,TH -737768448,737769471,AU -737769472,737770495,CN -737770496,737771519,HK -737771520,737771647,KR -737771648,737771775,JP -737771776,737771903,KR -737771904,737772159,JP -737772160,737772287,KR -737772288,737772415,JP -737772416,737772543,KR -737772544,737774591,CN -737774592,737775615,ID -737775616,737782783,CN -737782784,737783807,HK -737783808,737784831,PF -737784832,737787903,IN -737787904,737788927,CN -737788928,737790975,NZ -737790976,737791999,HK -737792000,737793023,ID -737793024,737794047,SG -737794048,737795071,IN -737795072,737796095,HK -737796096,737799167,IN -737799168,737800191,CN -737800192,737802239,JP -737802240,737803263,SG -737803264,737804287,HK -737804288,737805311,SG -737805312,737806335,CN -737806336,737807359,HK -737807360,737810431,CN -737810432,737811455,AU -737811456,737814527,CN -737814528,737815551,IN -737815552,737816575,TW -737816576,737817599,HK -737817600,737818623,AU -737818624,737821695,HK -737821696,737822719,AU -737822720,737823743,CN -737823744,737824767,ID -737824768,737825791,BD -737825792,737826815,PK -737826816,737827839,JP -737827840,737828863,AU -737828864,737835007,CN -737835008,737836031,IN -737836032,737837055,MN -737837056,737838079,CN -737838080,737839103,IN -737839104,737840127,AF -737840128,737841151,AU -737841152,737843199,CN -737843200,737844223,KR -737844224,737845247,IN -737845248,737846271,CN -737846272,737847295,IN -737847296,737850367,CN -737851392,737853439,HK -737853440,737854463,SG -737854464,737855487,JP -737855488,737856511,CN -737856512,737857535,AU -737857536,737858559,IN -737858560,737861631,CN -737861632,737862655,PH -737862656,737863679,JP -737863680,737864447,AU -737864448,737864703,HK -737864704,737865727,CN -737865728,737866751,LK -737866752,737867775,CN -737867776,737868031,AU -737868032,737868287,US -737868288,737868799,AU -737868800,737870847,IN -737870848,737873919,CN -737873920,737874431,HK -737874432,737874943,IN -737875968,737876991,HK -737876992,737878015,KR -737878016,737878271,HK -737878272,737878783,JP -737878784,737879039,HK -737879040,737880063,CN -737880064,737881087,AU -737881088,737882111,HK -737882112,737883135,JP -737883136,737884159,AU -737884160,737886207,TW -737886208,737887231,PH -737887232,737888255,KR -737888256,737889279,IN -737889280,737890303,HK -737890304,737894399,IN -737894400,737895423,ID -737895424,737896447,CN -737896448,737897471,HK -737897472,737898495,AU -737898496,737899519,MY -737899520,737900543,CN -737900544,737901567,KR -737901568,737902591,IN -737902592,737903615,BN -737903616,737904639,HK -737904640,737905663,MY -737905664,737906687,HK -737906688,737908735,IN -737908736,737909759,AU -737909760,737910783,HK -737910784,737911807,DE -737911808,737912319,SG -737912320,737912575,AU -737912576,737912703,SG -737912704,737912831,MY -737912832,737915903,IN -737915904,737916927,US -737916928,737917951,JP -737917952,737918975,IN -737918976,737919999,CN -737920000,737921023,HK -737921024,737922047,AU -737922048,737923071,NZ -737923072,737924095,MY -737924096,737927167,IN -737927168,737929215,HK -737929216,737931263,CN -737931264,737932287,AU -737932288,737933311,CN -737933312,737934335,HK -737934336,737935359,TH -737935360,737936383,AU -737936384,737937407,IN -737937408,737938431,ID -737938432,737939455,LK -737939456,737940479,KH -737940480,737941503,AU -737941504,737944575,IN -737944576,737945599,MY -737945600,737946623,HK -737946624,737947647,MY -737947648,737948671,CN -737948672,737949695,HK -737949696,737950719,CN -737950720,737951743,IN -737951744,737953791,NZ -737953792,737954815,ID -737954816,737955839,AU -737955840,737956351,US -737956352,737956479,CH -737956480,737956607,AT -737956608,737956735,BE -737956736,737956863,NL -737956864,737957887,HK -737957888,737959935,IN -737959936,737960959,AU -737960960,737961983,IN -737961984,737963007,ID -737963008,737965055,AU -737965056,737966079,IN -737966080,737967103,TH -737967104,737969151,AU -737969152,737970175,HK -737970176,737971199,ID -737971200,737972223,IN -737972224,737973247,ID -737973248,737974271,HK -737974272,737975295,IN -737975296,737976319,ID -737976320,737981439,HK -737981440,737981695,US -737981696,737981823,IT -737981824,737981951,PT -737981952,737982207,ES -737982208,737982463,PL -737982464,737983487,ID -737983488,737986559,IN -737986560,737987583,HK -737987584,737988607,IN -737988608,737989631,HK -737989632,737991679,MY -737991680,737992191,IN -737992192,737992703,ID -737992704,737993727,CN -737993728,737994751,HK -737994752,737995775,MY -737995776,737996799,ID -737996800,737997823,IN -737997824,737998847,LA -737998848,737999871,IN -737999872,738000895,AU -738000896,738066431,JP -738066432,738069503,CN -738069504,738070527,PK -738070528,738071551,TW -738071552,738072575,NZ -738072576,738073599,CN -738073600,738075647,IN -738075648,738076671,CN -738076672,738077695,IN -738077696,738078719,CN -738078720,738079743,IN -738079744,738080767,CN -738080768,738081791,TL -738081792,738082815,TW -738082816,738083839,CN -738083840,738084863,ID -738084864,738085887,CN -738085888,738086911,MY -738086912,738087935,ID -738087936,738091007,CN -738091008,738092031,BD -738092032,738094079,CN -738094080,738095103,IN -738095104,738097151,CN -738097152,738098175,MY -738098176,738099199,ID -738099200,738100223,CN -738100224,738101247,TH -738101248,738107391,CN -738107392,738108415,IN -738108416,738109439,HK -738109440,738111487,CN -738111488,738112511,IN -738112512,738118655,CN -738118656,738119679,IN -738119680,738120703,CN -738120704,738121727,IN -738121728,738122751,HK -738122752,738128895,CN -738128896,738129919,KR -738129920,738135039,CN -738135040,738136063,TW -738136064,738137087,CN -738137088,738138111,BD -738138112,738138623,US -738138624,738139135,NZ -738139136,738140159,HK -738140160,738141183,AU -738141184,738142207,HK -738142208,738143231,JP -738143232,738144255,AU -738144256,738145279,CN -738145280,738146303,HK -738146304,738147327,IN -738147328,738148095,TH -738148096,738148351,AU -738148352,738152447,CN -738152448,738152703,JP -738152704,738152959,MY -738152960,738153215,JP -738153216,738153471,AU -738153472,738154495,CN -738154496,738156543,TW -738156544,738157567,CN -738157568,738158591,SG -738158592,738159615,HK -738159616,738160639,CN -738160640,738161663,KH -738161664,738163711,HK -738163712,738164735,SG -738164736,738165759,AU -738165760,738166783,IN -738166784,738167807,AU -738167808,738168831,IN -738168832,738169855,CN -738169856,738170879,TO -738170880,738171903,SG -738171904,738172927,HK -738172928,738173951,NZ -738173952,738174975,IN -738174976,738175999,CN -738176000,738177023,MY -738177024,738178047,CN -738178048,738179071,TW -738179072,738180095,CN -738180096,738180607,HK -738180608,738180863,US -738180864,738181119,HK -738181120,738182143,CN -738182144,738183167,ID -738183168,738187263,CN -738187264,738188287,PH -738188288,738189311,IN -738189312,738192383,CN -738192384,738193407,NC -738193408,738194431,TH -738194432,738195455,CN -738195456,738197503,KR -738197504,746786303,US -746786304,746786559,GB -746786560,746973439,US -746973440,746973695,ES -746973696,747175935,US -747175936,747241471,NL -747241472,747372543,US -747372544,747438079,SE -747438080,747671807,US -747671808,747672063,GB -747672064,755105791,US -755105792,755179519,CA -755179520,755236863,US -755236864,755237673,CL -755237674,755237674,US -755237675,755237887,CL -755237888,755258367,BR -755258368,755259391,HN -755259392,755260415,EC -755260416,755261439,AR -755261440,755261695,BR -755261696,755261951,AR -755261952,755262463,BO -755262464,755263487,AR -755263488,755269631,BR -755269632,755270655,HN -755270656,755271679,BR -755271680,755272703,HN -755272704,755277823,BR -755277824,755279871,AR -755279872,755280895,CL -755280896,755281919,HN -755281920,755287039,BR -755287040,755288063,HN -755288064,755289087,EC -755289088,755290111,HN -755290112,755292159,BR -755292160,755293183,AR -755293184,755301375,BR -755301376,755303423,AR -755303424,755304447,BR -755304448,755305471,DO -755305472,755305727,SV -755305728,755305983,BO -755305984,755306239,BR -755306240,755306495,AR -755306496,755307519,BR -755307520,755309567,AR -755309568,755310591,HN -755310592,755315711,BR -755315712,755316735,MX -755316736,755317759,PE -755317760,755318783,CR -755318784,755319807,HN -755319808,755320831,PE -755320832,755321855,BR -755321856,755322879,HN -755322880,755325951,BR -755325952,755326975,MX -755326976,755332095,BR -755332096,755333119,GT -755333120,755335167,CL -755335168,755340287,BR -755340288,755342335,AR -755342336,755343359,BR -755343360,755345407,CO -755345408,755346431,BR -755346432,755347455,CO -755347456,755348479,BR -755348480,755351551,CO -755351552,755357695,BR -755357696,755358719,NI -755358720,755368959,BR -755368960,755371007,AR -755371008,755378175,BR -755378176,755379199,DO -755379200,755381247,HN -755381248,755383295,BR -755383296,755384319,MX -755384320,755385343,BR -755385344,755386367,AR -755386368,755394559,BR -755394560,755395583,AR -755395584,755401727,BR -755401728,755402751,AR -755402752,755403775,BR -755403776,755404799,MX -755404800,755419135,BR -755419136,755420159,US -755420160,755422207,BR -755422208,755423231,AR -755423232,755425279,BR -755425280,755426303,EC -755426304,755431423,BR -755431424,755433471,UY -755433472,755440639,BR -755440640,755441663,MX -755441664,755444735,BR -755444736,755445759,MX -755445760,755454975,BR -755454976,755457023,AR -755457024,755458047,CL -755458048,755459071,AR -755459072,755465215,BR -755465216,755466239,AR -755466240,755467263,BR -755467264,755468287,CO -755468288,755469311,MX -755469312,755470335,CR -755470336,755486719,BR -755486720,755487743,AR -755487744,755491839,BR -755491840,755492863,CL -755492864,755493887,BR -755493888,755494911,HN -755494912,755499007,AR -756023296,757071871,US -757071872,757071911,NL -757071912,757071919,US -757071920,757071951,NL -757071952,757071975,US -757071976,757071991,NL -757071992,757071999,US -757072000,757072063,NL -757072064,757072103,US -757072104,757072127,NL -757072128,757072383,US -757072384,757072639,NL -757072640,757072703,US -757072704,757072711,NL -757072712,757072727,US -757072728,757072775,NL -757072776,757072791,US -757072792,757072895,NL -757072896,757072903,US -757072904,757072911,NL -757072912,757072919,US -757072920,757073007,NL -757073008,757073023,US -757073024,757073047,NL -757073048,757073055,US -757073056,757073103,NL -757073104,757073127,US -757073128,757073151,NL -757073152,757073919,US -757073920,757079615,JP -757079616,757079679,NL -757079680,757088255,JP -757088256,757096447,US -757096448,757104639,SG -757104640,757108223,US -757108224,757108415,NL -757108416,757108671,US -757108672,757108735,NL -757108736,757110523,FR -757110524,757110524,TF -757110525,757110783,FR -757110784,757112831,DE -757112832,757116927,US -757116928,757118975,GB -757118976,757119999,NL -757120000,757121023,AU -757121024,757125119,US -757125120,757125151,NL -757125152,757125215,US -757125216,757125247,NL -757125248,757125503,US -757125504,757125631,NL -757125632,757131263,US -757131264,757133311,NL -757133312,757135359,AU -757135360,757137407,JP -757137408,757176319,US -757176320,757176575,FR -757176576,757186559,US -757186560,757190655,CA -757190656,757600255,US -757600256,757604351,CA -757604352,757612543,US -757612544,757616639,CA -757616640,757645311,US -757645312,757645567,NZ -757645568,757661695,CN -757661696,757661951,NZ -757661952,757662719,US -757662720,757662975,IN -757662976,757686271,US -757686272,757694463,CA -757694464,757696255,US -757696256,757696511,JP -757696512,757697535,DE -757697536,757711871,US -757711872,757712127,AU -757712128,757714175,US -757714176,757714431,JP -757714432,757716735,US -757716736,757716991,NZ -757716992,757721599,US -757721600,757721855,PH -757721856,757727231,US -757727232,757728255,VI -757728256,757729279,US -757729280,757731327,CA -757731328,757733375,US -757733376,757734399,CA -757734400,757736447,US -757736448,757737471,CA -757737472,757745663,US -757745664,757747711,CA -757747712,757751807,US -757751808,757759999,CA -757760000,757760255,US -757760256,757760511,ML -757760512,757761535,US -757761536,757761791,MW -757761792,757762047,US -757762048,757762303,MV -757762304,757762559,JP -757762560,757762815,PH -757762816,757763071,CD -757763072,757763327,US -757763328,757763583,PA -757763584,757763839,MN -757763840,757764095,VA -757764096,757764351,ZW -757764352,757765375,US -757765376,757765631,SD -757765632,757766655,US -757766656,757766911,BI -757766912,757767167,US -757767168,757767423,CC -757767424,757767935,US -757767936,757768191,MU -757768192,757768447,US -757768448,757768703,AD -757768704,757769215,US -757769216,757769471,SL -757769472,757769727,US -757769728,757769983,NZ -757769984,757770239,GU -757770240,757770495,US -757770496,757770751,TG -757770752,757771007,US -757771008,757771263,FJ -757771264,757771519,CW -757771520,757771775,SB -757771776,757772031,ER -757772032,757772287,US -757772288,757772543,NR -757772544,757773055,US -757773056,757773311,MR -757773312,757774335,US -757774336,757774591,LR -757774592,757774847,US -757774848,757775103,MC -757775104,757776639,US -757776640,757776767,GQ -757776768,757777919,US -757777920,757778047,LS -757778048,757779199,US -757779200,757779327,CV -757779328,757780479,US -757780480,757780607,CF -757780608,757780991,US -757780992,757781247,SM -757781248,757781503,US -757781504,757781759,TO -757781760,757781887,GW -757781888,757783039,US -757783040,757783167,GM -757783168,757783551,US -757783552,757783807,TV -757783808,757784319,US -757784320,757784447,KM -757784448,757784575,US -757784576,757784831,SZ -757784832,757785087,CG -757785088,757785599,US -757785600,757785727,ST -757785728,757786111,US -757786112,757786367,AR -757786368,757786879,US -757786880,757787007,SO -757787008,757788159,US -757788160,757788287,LK -757788288,757789439,US -757789440,757789567,NP -757789568,757790975,US -757790976,757791231,WS -757791232,757809151,US -757809152,757809407,CA -757809408,757809663,RO -757809664,757809919,GB -757817344,757858303,US -757858304,757956607,CA -757956608,757956863,HK -757956864,757957119,DE -757957120,757957631,US -757957632,757957887,JP -757957888,757958143,GB -757958144,757958399,US -757958400,757958655,DE -757958656,757959679,US -757959680,757959935,IT -757959936,757960191,GB -757960192,757961471,US -757961472,757961727,HK -757961728,757962239,US -757962240,757962495,GB -757962496,757964031,US -757964032,757964287,GB -757964288,757965311,US -757965312,757965567,IN -757965568,757967103,US -757967104,757967359,FR -757967360,757968127,US -757968128,757968383,FR -757968384,757969151,US -757969152,757969407,FR -757969408,757971199,US -757971200,757971455,FR -757971456,758682111,US -758682112,758682367,PH -758682368,758683647,US -758683648,758683903,HK -758683904,758684159,SG -758684160,758684671,US -758684672,758684927,BR -758684928,758685183,IN -758685184,758685439,AU -758685440,758685695,JP -758685696,758691839,US -758691840,758693887,DE -758693888,758700031,US -758700032,758702079,CA -758702080,758704127,GR -758704128,758706175,NL -758706176,758710271,GR -758710272,758743039,US -758743040,758744679,CA -758744680,758744687,US -758744688,758744751,CA -758744752,758744767,US -758744768,758744879,CA -758744880,758744887,US -758744888,758745087,CA -758745088,758745727,US -758745728,758745791,CA -758745792,758745823,US -758745824,758745831,CA -758745832,758745855,US -758745856,758747135,CA -758747136,758747199,US -758747200,758747215,CA -758747216,758747231,US -758747232,758747327,CA -758747328,758747375,US -758747376,758747903,CA -758747904,758747935,US -758747936,758747951,CA -758747952,758747999,US -758748000,758748031,CA -758748032,758748159,US -758748160,758748415,CA -758748416,758748927,US -758748928,758749439,CA -758749440,758749519,US -758749520,758749535,CA -758749536,758749567,US -758749568,758749695,CA -758749696,758749951,US -758749952,758750207,CA -758750208,758750463,US -758750464,758750719,CA -758750720,758750975,US -758750976,758751039,CA -758751040,758751055,US -758751056,758751071,CA -758751072,758751167,US -758751168,758751487,CA -758751488,758751999,US -758752000,758752127,CA -758752128,758752191,US -758752192,758752199,CA -758752200,758752207,FI -758752208,758752223,US -758752224,758752239,CA -758752240,758752255,US -758752256,758752511,CA -758752512,758752671,US -758752672,758752687,CA -758752688,758752735,US -758752736,758752831,CA -758752832,758752895,US -758752896,758752927,CA -758752928,758752959,US -758752960,758753279,CA -758753280,758753535,US -758753536,758754047,CA -758754048,758754431,US -758754432,758755327,CA -758755328,758755839,US -758755840,758756351,CA -758756352,758756863,US -758756864,758756927,CA -758756928,758757055,US -758757056,758757183,CA -758757184,758757311,US -758757312,758757375,CA -758757376,758757631,US -758757632,758757887,CA -758757888,758758143,US -758758144,758759487,CA -758759488,758759615,US -758759616,758759743,CA -758759744,758759807,US -758759808,758759839,CA -758759840,758759871,US -758759872,758759935,CA -758759936,758760191,US -758760192,758760447,SC -758760448,758760703,US -758760704,758760799,CA -758760800,758760895,US -758760896,758761727,CA -758761728,758762239,US -758762240,758762495,CA -758762496,758762751,US -758762752,758764031,CA -758764032,758764287,US -758764288,758764679,CA -758764680,758764703,US -758764704,758764719,CA -758764720,758764759,US -758764760,758764767,CA -758764768,758764799,US -758764800,758764863,CA -758764864,758764927,US -758764928,758765183,CA -758765184,758765247,US -758765248,758765375,CA -758765376,758765439,US -758765440,758765631,CA -758765632,758765647,US -758765648,758765663,CA -758765664,758765695,US -758765696,758765951,CA -758765952,758765975,US -758765976,758765983,CA -758765984,758766015,US -758766016,758766103,CA -758766104,758766111,US -758766112,758766143,CA -758766144,758766303,US -758766304,758766319,CA -758766320,758766335,US -758766336,758766431,CA -758766432,758766495,US -758766496,758766527,CA -758766528,758766575,US -758766576,758766583,CA -758766584,758766847,US -758766848,758769279,CA -758769280,758769359,US -758769360,758769367,CA -758769368,758769375,US -758769376,758769663,CA -758769664,758769751,US -758769752,758769791,CA -758769792,758769855,US -758769856,758769919,CA -758769920,758770175,US -758770176,758770271,CA -758770272,758770303,US -758770304,758770431,CA -758770432,758770687,US -758770688,758770751,CA -758770752,758770847,US -758770848,758770863,CA -758770864,758771199,US -758771200,758771711,CA -758771712,758772991,US -758772992,758773759,CA -758773760,758774271,US -758774272,758775807,CA -758775808,758779903,US -758779904,758783999,CA -758784000,758785023,US -758785024,758785535,CA -758785536,758796287,US -758796288,758804479,CA -758804480,758811135,US -758811136,758811391,NL -758811392,758824959,US -758824960,758841343,CA -758841344,758847487,US -758847488,758847743,NL -758847744,758847999,US -758848000,758848255,CA -758848256,758859775,US -758859776,758861823,CA -758861824,758874367,US -758874368,758874623,AM -758874624,758875391,US -758875392,758875647,AO -758875648,758875903,BT -758875904,758876159,AZ -758876160,758876415,AU -758876416,758876671,US -758876672,758876927,SD -758876928,758877183,MH -758877184,758877439,US -758877440,758877695,KZ -758877696,758877951,IR -758877952,758878207,PG -758878208,758878463,ET -758878464,758878719,TO -758878720,758878975,KH -758878976,758879231,KG -758879232,758879487,US -758879488,758879743,GG -758879744,758879999,CD -758880000,758880255,SJ -758880256,758880511,AS -758880512,758880767,UZ -758880768,758881023,GN -758881024,758881535,US -758881536,758881791,PH -758881792,758882047,CG -758882048,758882303,TM -758882304,758882559,HM -758882560,758882815,CV -758882816,758883071,ZM -758883072,758883583,US -758883584,758883839,TJ -758883840,758884095,LI -758884096,758884351,MQ -758884352,758884607,MZ -758884608,758884863,GP -758884864,758885119,RE -758885120,758885375,CN -758885376,758885631,WF -758885632,758885887,KM -758885888,758886143,SN -758886144,758886399,TF -758886400,758886655,PA -758886656,758886911,DZ -758886912,758887167,NE -758887168,758887423,GI -758887424,758887679,TD -758887680,758888191,US -758888192,758888447,LY -758888448,758888703,US -758888704,758888959,TZ -758888960,758889215,US -758889216,758889471,MG -758889472,758889727,LA -758889728,758889983,TN -758889984,758972415,US -758972416,758976511,CA -758976512,758981247,US -758981248,758981375,GM -758981376,758981887,US -758981888,758982015,ML -758982016,758982143,TV -758982144,758982271,US -758982272,758982399,KM -758982400,758982527,CD -758982528,758982655,ST -758982656,758982783,MV -758982784,758982911,AR -758982912,758983551,US -758983552,758983679,MN -758983680,758983807,US -758983808,758983935,VA -758983936,758984063,ZW -758984064,758984191,SO -758984192,758984703,US -758984704,758988799,CA -758988800,758994943,US -758994944,758996991,IN -758996992,758998015,DE -758998016,759001087,US -759001088,759005183,CN -759005184,759047423,US -759047424,759047679,IN -759047680,759048191,US -759048192,759048447,PK -759048448,759050495,US -759050496,759050751,IN -759050752,759051519,US -759051520,759051775,PK -759051776,759053055,US -759053056,759053311,IN -759053312,759053823,US -759053824,759054079,PK -759054080,759054335,US -759054336,759062527,CA -759062528,759068671,US -759068672,759069695,NL -759069696,759086079,US -759086080,759086591,HK -759086592,759086847,SG -759086848,759087103,US -759087104,759100278,CA -759100279,759100279,NL -759100280,759103487,CA -759103488,759109631,US -759109632,759111679,AU -759111680,759113727,US -759113728,759114751,NL -759114752,759128063,US -759128064,759128672,GB -759128673,759128673,LB -759128674,759130111,GB -759130112,759132159,US -759132160,759133183,FR -759133184,759134207,DE -759134208,759136255,JP -759136256,759169023,US -759169024,759171071,ID -759171072,759174143,IN -759174144,759175167,MO -759175168,759176191,PK -759176192,759178239,TW -759178240,759179263,AU -759179264,759180287,SG -759180288,759181311,ID -759181312,759182335,NZ -759182336,759183359,HK -759183360,759184383,AU -759184384,759185407,NZ -759185408,759186431,HK -759186432,759187455,AU -759187456,759187967,SG -759187968,759188479,TW -759188480,759189503,TH -759189504,759190527,PH -759190528,759193599,IN -759193600,759193855,ID -759193856,759194111,SG -759194112,759195647,ID -759195648,759196671,IN -759196672,759198207,HK -759198208,759198335,SI -759198336,759198463,CZ -759198464,759198719,PL -759198720,759199743,NZ -759199744,759200767,PH -759200768,759201791,KH -759201792,759202815,SG -759202816,759204863,BD -759204864,759206911,KR -759206912,759207935,AU -759207936,759208959,KR -759208960,759209983,IN -759209984,759211007,NP -759211008,759212031,BD -759212032,759213055,MY -759213056,759214079,KR -759214080,759215103,IN -759215104,759216127,PK -759216128,759217151,TH -759217152,759220223,IN -759220224,759221247,NZ -759221248,759227391,IN -759227392,759229439,TW -759229440,759230463,IN -759230464,759232511,HK -759232512,759233535,BT -759233536,759234559,ID -759234560,759235583,SG -759235584,759236607,NZ -759236608,759237631,IN -759237632,759238655,AU -759238656,759242751,CN -759242752,759243775,HK -759243776,759245823,IN -759245824,759246847,US -759246848,759249407,IN -759249408,759249919,AF -759249920,759250943,AU -759267328,759269375,BR -759269376,759270399,CO -759270400,759272447,BR -759272448,759273471,AR -759273472,759274495,MX -759274496,759275519,BR -759275520,759276543,CL -759276544,759282687,BR -759282688,759283711,HN -759283712,759285759,BR -759285760,759286015,CO -759286016,759286271,BR -759286272,759286527,AR -759286528,759286783,EC -759286784,759291903,BR -759291904,759292927,AR -759292928,759293951,BR -759293952,759294975,CO -759294976,759295999,BR -759296000,759297023,CL -759297024,759298047,DO -759298048,759299071,PE -759299072,759299327,AR -759299328,759299583,BR -759299584,759300095,PA -759496704,759504895,GB -759562240,759564287,BR -759564288,759565311,AR -759565312,759566335,EC -759566336,759576575,BR -759576576,759577599,EC -759577600,759584767,BR -759584768,759585791,AR -759585792,759591935,BR -759591936,759592959,AR -759592960,759601151,BR -759601152,759602175,AR -759602176,759605247,BR -759605248,759606271,CO -759606272,759608319,BR -759608320,759609343,BO -759609344,759610367,AR -759610368,759612415,BR -759612416,759614463,EC -759614464,759618559,BR -759618560,759619583,AR -759619584,759620607,BR -759620608,759621631,BZ -759621632,759622655,BR -759622656,759623679,EC -759623680,759624703,BZ -759624704,759627775,BR -759627776,759628799,EC -759628800,759629055,BR -759629056,759629311,AR -759629312,759629567,BR -759629568,759629823,CO -759629824,759630847,CL -759630848,759631871,BR -759631872,759632895,HN -759632896,759635967,BR -759635968,759636991,PE -759636992,759638015,EC -759638016,759639039,BR -759639040,759640063,CL -759640064,759641087,BR -759641088,759642111,HN -759642112,759643135,AR -759643136,759654911,BR -759654912,759655167,AR -759655168,759656447,BR -759656448,759657471,EC -759657472,759666687,BR -759666688,759667711,AR -759667712,759668735,CW -759668736,759673855,BR -759673856,759674879,CO -759674880,759675903,EC -759675904,759677951,BR -759677952,759678975,AR -759678976,759679999,EC -759680000,759681023,AR -759681024,759692287,BR -759692288,759693311,EC -759693312,759693439,CA -759693440,759693455,US -759693456,759693471,CA -759693472,759693519,US -759693520,759693527,CA -759693528,759693567,US -759693568,759693959,CA -759693960,759693975,GR -759693976,759694207,CA -759694208,759694303,US -759694304,759694319,CA -759694320,759695231,US -759695232,759696263,CA -759696264,759696335,US -759696336,759696351,CA -759696352,759696463,US -759696464,759696479,CA -759696480,759696575,US -759696576,759696599,CA -759696600,759696607,US -759696608,759699263,CA -759699264,759699279,US -759699280,759699287,CA -759699288,759699423,US -759699424,759699439,CA -759699440,759699455,US -759699456,759699967,CA -759699968,759699983,US -759699984,759699991,CA -759699992,759700047,US -759700048,759700063,CA -759700064,759700223,US -759700224,759700479,CA -759700480,759700607,US -759700608,759700735,CA -759700736,759700863,US -759700864,759701759,CA -759701760,759702015,US -759702016,759702399,CA -759702400,759702431,US -759702432,759702447,CA -759702448,759702479,US -759702480,759702495,CA -759702496,759702527,US -759702528,759708287,CA -759708288,759708415,US -759708416,759708927,CA -759708928,759709183,US -759709184,759710463,CA -759710464,759710495,US -759710496,759710511,CA -759710512,759710559,US -759710560,759710591,CA -759710592,759710719,US -759710720,759710975,CA -759710976,759711263,US -759711264,759711279,CA -759711280,759711359,US -759711360,759711615,CA -759711616,759711647,US -759711648,759711655,CA -759711656,759711679,US -759711680,759711695,CA -759711696,759711711,US -759711712,759711743,CA -759711744,759711807,CN -759711808,759711839,CA -759711840,759711855,US -759711856,759711871,CA -759711872,759712015,US -759712016,759712031,CA -759712032,759712095,US -759712096,759712111,CA -759712112,759712127,US -759712128,759712255,CA -759712256,759712351,US -759712352,759712383,CA -759712384,759712511,US -759712512,759712895,CA -759712896,759713023,US -759713024,759721215,CA -759721216,759721231,US -759721232,759721279,CA -759721280,759721343,US -759721344,759791615,CA -759791616,759802367,US -759802368,759803391,CA -759803392,759803903,US -759803904,759804927,GB -759804928,759824639,US -759824640,759824895,SA -759824896,759825151,CR -759825152,759825407,US -759825408,759825663,DE -759825664,759828735,US -759828736,759828863,GT -759828864,759828991,SV -759828992,759829119,HN -759829120,759829247,NI -759829248,759829375,BO -759829376,759829503,PY -759829504,759829631,SR -759829632,759829759,GY -759829760,759829887,TT -759829888,759830015,GD -759830016,759830143,DM -759830144,759830271,BB -759830272,759830399,LC -759830400,759830527,DO -759830528,759830655,HT -759830656,759830783,TC -759830784,759830911,CV -759830912,759831039,KY -759831040,759831167,BM -759831168,759831295,MS -759831296,759831423,AG -759831424,759831551,BY -759831552,759831679,CM -759831680,759831807,CF -759831808,759831935,US -759831936,759832063,ZW -759832064,759832191,ZM -759832192,759832319,GA -759832320,759832447,RW -759832448,759832575,BW -759832576,759832703,MZ -759832704,759832831,SZ -759832832,759832959,MW -759832960,759833087,BI -759833088,759833215,ER -759833216,759833343,LS -759833344,759834623,US -759834624,759834879,GB -759834880,759835391,US -759835392,759835647,AU -759835648,759835903,SE -759835904,759836159,US -759836160,759836415,SE -759836416,759839999,US -759840000,759840255,CA -759840256,759840511,GB -759840512,759840767,US -759840768,759844863,CA -759844864,759848959,US -759848960,759889919,CA -759889920,759922687,JP -759922688,759955455,GB -759955456,759963647,US -759963648,759965983,NL -759965984,759966207,US -759966208,759966719,NL -759966720,759966915,FR -759966916,759966916,TF -759966917,759967743,FR -759967744,759969791,JP -759969792,759975935,US -759975936,759980031,DE -759980032,759983119,JP -759983120,759983135,US -759983136,759984127,JP -759984128,759988223,AU -759988224,759992319,GB -759992320,759997439,SG -759997440,760000511,US -760000512,760004607,SG -760004608,760006911,JP -760006912,760007039,US -760007040,760012799,JP -760012800,760023039,US -760023040,760026367,JP -760026368,760026623,HK -760026624,760029183,JP -760029184,760033279,SG -760033280,760034303,AU -760034304,760035327,DE -760035328,760036351,GB -760036352,760037375,FR -760037376,760038399,DE -760038400,760043519,US -760043520,760044543,GB -760044544,760053759,US -760053760,760055807,JP -760055808,760056831,NL -760056832,760057855,DE -760057856,760063999,US -760064000,760066047,SG -760066048,760068095,JP -760068096,760078335,US -760078336,760079359,GB -760079360,760080383,US -760080384,760081407,AU -760081408,760082431,US -760082432,760084479,SG -760084480,760111103,US -760111104,760119295,CA -760119296,760127487,US -760127488,760152063,CA -760152064,760217599,US -761266176,761316351,EG -761316352,761316607,RU -761316608,762314751,EG -762314752,762315775,IN -762315776,762316799,US -762316800,762320895,IN -762320896,762321919,HK -762321920,762323967,IN -762323968,762324991,SG -762324992,762330111,IN -762330112,762331135,NZ -762331136,762332159,TH -762332160,762333183,IN -762333184,762334207,BD -762334208,762335743,SG -762335744,762336255,PH -762336256,762337279,ID -762337280,762345471,KR -762345472,762346495,SG -762346496,762347519,ID -762347520,762348543,JP -762348544,762349567,CN -762349568,762350591,IN -762350592,762351615,TH -762351616,762353663,IN -762353664,762358783,KR -762358784,762359807,IN -762359808,762360831,MM -762360832,762361855,NP -762361856,762362879,IN -762362880,762363903,CN -762363904,762364927,IN -762364928,762365951,MY -762365952,762366975,IN -762366976,762367999,HK -762368000,762372095,CN -762372096,762373119,FJ -762373120,762376191,CN -762376192,762377215,HK -762377216,762378239,AU -762378240,762380287,IN -762380288,762381311,HK -762381312,762382335,JP -762382336,762383359,NZ -762383360,762388479,CN -762388480,762389503,HK -762389504,762390527,AU -762390528,762391551,CN -762391552,762393599,KR -762393600,762395647,CN -762395648,762396159,TH -762396160,762397695,IN -762397696,762398719,HK -762398720,762399743,CN -762399744,762400767,IN -762400768,762401023,HK -762401024,762401279,US -762401280,762401791,KR -762401792,762402815,TH -762402816,762403839,IN -762403840,762404863,AU -762404864,762407935,IN -762407936,762408959,CN -762408960,762409983,HK -762409984,762411007,JP -762411008,762411519,HK -762411520,762411775,IN -762411776,762412031,HK -762412032,762413055,PK -762413056,762414079,HK -762414080,762415103,BD -762415104,762416127,IN -762416128,762417151,HK -762417152,762419199,CN -762419200,762420223,IN -762420224,762421247,TW -762421248,762423295,HK -762423296,762424319,CN -762424320,762425343,JP -762425344,762426367,CN -762426368,762427391,IN -762427392,762428415,CN -762428416,762429439,IN -762429440,762430463,HK -762430464,762431487,AU -762431488,762437631,CN -762437632,762438655,IN -762438656,762439679,CN -762439680,762440703,AU -762440704,762441727,BD -762441728,762442751,CN -762442752,762443775,AU -762443776,762444799,IN -762444800,762446847,CN -762446848,762447871,SG -762447872,762448895,HK -762448896,762449919,CN -762449920,762450943,JP -762450944,762451967,PH -762451968,762452991,HK -762452992,762454015,MY -762454016,762455039,CN -762455040,762456063,IN -762456064,762457087,CN -762457088,762458111,HK -762458112,762459135,IN -762459136,762460159,CN -762460160,762467327,IN -762467328,762469375,BD -762469376,762470399,HK -762470400,762471423,CN -762471424,762472447,MY -762472448,762474495,CN -762474496,762475519,JP -762475520,762475775,AU -762475776,762476031,SG -762476032,762476287,ID -762476288,762476543,SG -762476544,762477567,SE -762477568,762478591,CN -762478592,762479615,KR -762479616,762480639,PH -762480640,762481663,CN -762481664,762486783,IN -762486784,762487807,KH -762487808,762490879,HK -762490880,762491903,IN -762491904,762492927,BD -762492928,762493951,JP -762493952,762494975,AU -762494976,762495999,IN -762496000,762498047,CN -762498048,762499071,AU -762499072,762500095,JP -762500096,762502143,IN -762502144,762503167,AU -762503168,762504191,IN -762504192,762505215,CN -762505216,762506239,BD -762506240,762507263,CN -762507264,762510335,IN -762510336,762511359,CN -762511360,762514431,IN -762514432,762515455,BD -762515456,762516479,IN -762516480,762517503,AU -762517504,762517759,TH -762517760,762518015,KR -762518016,762518271,AO -762518272,762518527,HK -762518528,762519551,IN -762519552,762520575,JP -762520576,762522623,HK -762522624,762523647,CN -762523648,762523903,AU -762523904,762524159,PK -762524160,762524671,TH -762524672,762527743,IN -762527744,762528767,ID -762528768,762529791,AU -762529792,762530815,TL -762530816,762532863,IN -762532864,762533887,PK -762533888,762536959,IN -762536960,762537983,CN -762537984,762540031,IN -762540032,762541055,BD -762541056,762541567,AU -762541568,762541823,TH -762541824,762542079,IN -762542080,762543103,CN -762543104,762544127,HK -762544128,762545151,AU -762545152,762546175,CN -762546176,762547199,ID -762547200,762548223,IN -762548224,762549247,CN -762549248,762550271,IN -762550272,762551295,KR -762551296,762552319,CN -762552320,762553343,HK -762553344,762554367,CN -762554368,762560511,IN -762560512,762561535,JP -762562560,762563583,CN -762563584,762564607,AU -762564608,762565631,IN -762565632,762567679,CN -762567680,762568703,IN -762568704,762569727,BD -762569728,762570751,CN -762570752,762571775,AU -762571776,762572799,CN -762572800,762573823,HK -762573824,762575871,CN -762575872,762578943,IN -762578944,762580479,HK -762580480,762580991,JP -762580992,762584063,CN -762584064,762585087,IN -762585088,762587135,CN -762587136,762588159,HK -762588160,762589183,IN -762589184,762590207,AU -762590208,762591231,CN -762591232,762592255,IN -762592256,762594303,HK -762594304,762595327,IN -762595328,762596351,JP -762596352,762598399,HK -762598400,762599423,IN -762599424,762600447,SG -762600448,762601471,JP -762601472,762603519,CN -762603520,762604543,IN -762604544,762605567,AU -762605568,762609663,IN -762609664,762610175,AF -762610176,762610431,HK -762610432,762610687,AU -762610688,762611711,JP -762611712,762612735,SG -762612736,762613759,CN -762613760,762614783,HK -762614784,762615807,IN -762615808,762616831,CN -762616832,762617855,ID -762617856,762619903,IN -762619904,762620927,HK -762620928,762622975,MY -762622976,762630143,IN -762630144,762631167,CN -762631168,762632191,HK -762632192,762633215,TH -762633216,762634239,AU -762634240,762635263,JP -762635264,762636287,IN -762636288,762637311,PK -762637312,762640383,MY -762640384,762641407,BD -762641408,762644479,IN -762644480,762645503,CN -762645504,762646527,KR -762646528,762647551,JP -762647552,762648575,CN -762648576,762649599,AU -762649600,762650623,IN -762650624,762651647,MN -762651648,762652671,NZ -762652672,762653695,HK -762653696,762656767,IN -762656768,762658815,BD -762658816,762659839,IN -762659840,762660863,CN -762660864,762661887,IN -762661888,762663935,VN -762663936,762664959,AU -762664960,762665983,PK -762665984,762667007,IN -762667008,762669055,HK -762669056,762670079,PK -762670080,762673151,IN -762673152,762674175,MY -762674176,762675199,CN -762675200,762678271,IN -762678272,762679295,JP -762679296,762680319,HK -762680320,762681343,IN -762681344,762682367,NP -762682368,762688511,VN -762688512,762690559,IN -762690560,762691583,SG -762691584,762692607,HK -762692608,762693631,MP -762693632,762700799,IN -762700800,762701823,MY -762701824,762702847,IN -762702848,762703871,MY -762703872,762705919,FJ -762705920,762706943,IN -762706944,762707967,CN -762707968,762717183,IN -762717184,762718207,PH -762718208,762719231,JP -762719232,762723327,IN -762723328,762724351,BD -762724352,762725375,AU -762725376,762726399,BD -762726400,762736639,IN -762736640,762737663,ID -762737664,762739711,IN -762739712,762740735,HK -762740736,762741759,IN -762741760,762742783,SG -762742784,762746879,VN -762746880,762754047,IN -762754048,762755071,SG -762755072,762756095,AU -762756096,762757119,NZ -762757120,762770431,IN -762770432,762771455,BD -762771456,762775551,HK -762775552,762783743,IN -762783744,762784767,KR -762784768,762786815,IN -762786816,762787839,CN -762787840,762788863,IN -762788864,762792959,CN -762792960,762796031,VN -762796032,762797055,IN -762797056,762799103,HK -762799104,762800127,NZ -762800128,762801151,CN -762801152,762802175,VN -762802176,762803199,IN -762803200,762804223,CN -762804224,762805247,BD -762805248,762806271,HK -762806272,762810367,IN -762810368,762811391,KR -762811392,762812415,IN -762812416,762814463,SG -762814464,762815487,MY -762815488,762816511,JP -762816512,762824703,IN -762824704,762824959,JP -762824960,762825727,SG -762825728,762826751,JP -762826752,762827775,US -762827776,762829823,VN -762829824,762830847,AU -762830848,762832895,IN -762832896,762833919,CN -762833920,762834943,IN -762834944,762835967,VN -762835968,762838015,IN -762838016,762841087,HK -762841088,762846207,IN -762846208,762847231,HK -762847232,762848255,IN -762848256,762848511,AU -762848512,762848767,IN -762848768,762849279,BD -762849280,762850303,IN -762850304,762851327,HK -762852352,762853375,HK -762853376,762855423,IN -762855424,762857471,KR -762857472,762858495,IN -762858496,762860543,HK -762860544,762861567,MM -762861568,762863615,IN -762863616,762864639,BD -762864640,762865663,CN -762865664,762866687,AU -762866688,762867711,PH -762867712,762868735,BD -762868736,762869759,NZ -762869760,762871807,IN -762871808,762872831,MY -762872832,762873855,JP -762873856,762874879,IN -762874880,762875903,CN -762875904,762876927,IN -762876928,762877951,SG -762877952,762879231,HK -762879232,762879487,JP -762879488,762879743,HK -762879744,762879999,JP -762880000,762881023,IN -762881024,762882047,CN -762882048,762883071,HK -762883072,762884095,IN -762884096,762885119,JP -762885120,762887167,HK -762887168,762888191,IN -762888192,762889215,JP -762890240,762890495,KR -762890496,762890751,TW -762890752,762891007,HK -762891008,762891263,MY -762891264,762893311,HK -762893312,762894335,IN -762894336,762895359,HK -762895360,762896383,CN -762896384,762898431,VN -762898432,762900479,IN -762900480,762901503,CN -762901504,762902527,ID -762902528,762909695,IN -762909696,762910719,HK -762910720,762911743,VN -762911744,762912767,IN -762912768,762913791,HK -762913792,762914815,MY -762914816,762915839,ID -762915840,762916863,IN -762916864,762917887,TW -762917888,762918911,CN -762918912,762919935,HK -762919936,762920959,TH -762920960,762924031,CN -762924032,762925055,IN -762925056,762926079,HK -762926080,762927103,SG -762927104,762928127,LK -762928128,762930175,CN -762930176,762931199,IN -762931200,762932223,CN -762932224,762938367,IN -762938368,762939391,AU -762939392,762941439,HK -762941440,762942463,MY -762942464,762943487,JP -762943488,762944511,VN -762944512,762945535,IN -762945536,762946559,VN -762946560,762947583,KR -762947584,762948607,IN -762948608,762950655,CN -762950656,762951679,AU -762951680,762952191,SG -762952192,762952703,JP -762952704,762953727,IN -762953728,762957823,HK -762957824,762958847,AU -762958848,762959871,CN -762959872,762960895,ID -762960896,762964991,IN -762964992,762966015,KH -762966016,762981375,CN -762981376,762982399,IN -762982400,762983423,TH -762983424,762985471,ID -762985472,763000831,CN -763000832,763003903,IN -763003904,763005951,HK -763005952,763010047,IN -763010048,763011071,HK -763011072,763026431,CN -763026432,763027455,VN -763027456,763028479,JP -763028480,763029503,AU -763029504,763035647,VN -763035648,763040767,IN -763040768,763041791,HK -763041792,763042815,IN -763042816,763045887,CN -763045888,763046911,BD -763046912,763059199,CN -763059200,763060223,IN -763060224,763061247,VN -763061248,763062271,MY -763062272,763063295,AU -763063296,763064319,IN -763064320,763065343,HK -763065344,763066367,TR -763066368,763067391,CN -763067392,763068415,MY -763068416,763071487,CN -763071488,763073535,IN -763073536,763076607,CN -763076608,763077631,IN -763077632,763083775,CN -763083776,763084287,HK -763084288,763084543,LT -763084544,763086847,HK -763086848,763087871,MO -763087872,763088895,CN -763088896,763089919,JP -763089920,763090943,CN -763090944,763091967,IN -763091968,763092991,NP -763092992,763102207,CN -763102208,763103231,IN -763103232,763104255,HK -763104256,763105279,BD -763105280,763106303,PH -763106304,763107327,CN -763107328,763108351,HK -763108352,763111423,CN -763111424,763112447,AU -763112448,763113471,CN -763113472,763114495,IN -763114496,763115519,AU -763115520,763116543,PH -763116544,763117567,JP -763117568,763118591,HK -763118592,763119615,CN -763119616,763120639,HK -763120640,763122687,CN -763122688,763125759,VN -763125760,763126783,IN -763126784,763127807,CN -763127808,763129343,IN -763129344,763129855,AU -763129856,763130879,HK -763130880,763132927,IN -763132928,763133951,CN -763133952,763134975,IN -763134976,763135999,HK -763136000,763137023,JP -763137024,763142143,IN -763142144,763143167,HK -763143168,763143423,AU -763143680,763144191,AU -763144192,763145215,BD -763145216,763147263,CN -763147264,763152383,IN -763152384,763153407,AU -763153408,763154431,JP -763154432,763155455,CN -763155456,763156479,AU -763156480,763158527,JP -763158528,763164671,IN -763164672,763165695,CN -763165696,763165951,HK -763165952,763166207,US -763166208,763166463,DE -763166464,763166719,RU -763166720,763169791,HK -763169792,763171839,CN -763171840,763172863,SG -763172864,763175935,CN -763175936,763177983,IN -763177984,763179007,CN -763179008,763180031,HK -763180032,763182079,CN -763182080,763183103,IN -763183104,763183615,HK -763183616,763183871,LT -763183872,763184127,JP -763184128,763185151,IN -763185152,763186175,ID -763186176,763194367,CN -763194368,763196415,HK -763196416,763197439,IN -763197440,763199487,AU -763199488,763199743,DE -763200512,763201535,IN -763201536,763202559,CN -763202560,763207679,IN -763207680,763208703,HK -763208704,763208959,US -763208960,763209727,HK -763209728,763210751,NZ -763210752,763214847,IN -763214848,763215871,JP -763215872,763217919,SG -763217920,763220991,VN -763220992,763222015,IN -763222016,763223039,HK -763223040,763224063,BD -763224064,763225087,AF -763225088,763226111,TH -763226112,763227135,KR -763227136,763228159,VN -763228160,763229183,JP -763229184,763229439,NZ -763229440,763229695,AU -763229696,763229951,IN -763229952,763230207,AU -763230208,763231231,PH -763231232,763232255,IN -763232256,763234303,HK -763234304,763235327,IN -763235328,763236351,HK -763236352,763238399,IN -763238400,763239423,AU -763239424,763243519,IN -763243520,763244543,AU -763244544,763246591,CN -763246592,763247615,ID -763247616,763248639,SG -763248640,763250687,IN -763250688,763251711,US -763251712,763252735,HK -763252736,763253759,ID -763253760,763254783,PH -763254784,763255807,MY -763255808,763257855,VN -763257856,763258879,CN -763258880,763259903,IN -763259904,763263999,CN -763264000,763264511,HK -763264512,763265023,AU -763265024,763266047,NZ -763266048,763267071,ID -763267072,763268095,IN -763268096,763269119,BN -763269120,763270143,IN -763270144,763271167,KR -763271168,763272191,ID -763272192,763273215,JP -763273216,763274239,IN -763274240,763275263,SG -763275264,763278335,IN -763278336,763279359,HK -763279360,763280383,ID -763280384,763281407,IN -763281408,763282431,AU -763282432,763285503,IN -763285504,763285759,US -763285760,763286015,SG -763286016,763286527,US -763286528,763287551,CN -763287552,763288575,HK -763288576,763289599,CN -763289600,763290623,TH -763290624,763291647,HK -763291648,763293695,IN -763293696,763294719,HK -763294720,763297023,IN -763297024,763297279,AF -763297280,763297791,IN -763297792,763298815,HK -763298816,763299839,MY -763299840,763301887,CN -763301888,763304959,IN -763304960,763305983,JP -763305984,763307007,SG -763307008,763308031,CN -763308032,763310079,IN -763310080,763311103,BD -763311104,763313151,IN -763313152,763313279,PH -763313280,763313407,HK -763313408,763313535,ID -763313536,763313663,KR -763313664,763313791,TH -763313792,763313919,VN -763313920,763314047,BG -763314048,763314175,HR -763314176,763321343,IN -763321344,763322367,HK -763322368,763323391,CN -763323392,763326463,IN -763326464,763327487,US -763327488,763328511,CN -763328512,763329535,IN -763329536,763331583,CN -763331584,763332607,ID -763332608,763333631,IN -763333632,763334655,AU -763334656,763336703,CN -763336704,763337727,KH -763337728,763338751,CN -763338752,763339775,HK -763339776,763340799,PH -763340800,763341823,SG -763341824,763342847,AU -763342848,763343871,HK -763343872,763344895,AU -763344896,763345919,HK -763345920,763350015,IN -763350016,763351039,ID -763351040,763353087,IN -763353088,763353343,HK -763353344,763353599,CN -763353600,763353855,TW -763353856,763354111,CN -763354112,763360255,IN -763360256,763362303,BD -763362304,763363327,VN -767557632,767623167,ZA -767623168,767688703,HK -767688704,767754239,ZA -767754240,767819775,HK -767819776,768016383,ZA -768016384,768081919,US -768081920,768606207,ZA -768606208,768868351,GH -768868352,769130495,ZM -769130496,769392639,MA -769392640,769404927,ZA -769404928,769405183,TZ -769405184,769405439,ZA -769405440,769405951,CI -769405952,769406975,GH -769406976,769409023,ZA -769409024,769425407,SC -769425408,769458175,ZA -769458176,769459199,MU -769459200,769460223,CD -769460224,769461247,UG -769461248,769462271,ZA -769462272,769463295,MU -769463296,769464319,AO -769464320,769464575,GH -769464576,769464831,MW -769464832,769465087,ZA -769465344,769466367,CI -769466368,769474815,ZA -769474816,769475583,NG -769475584,769476607,ZA -769476608,769478655,UG -769478656,769507327,ZA -769507328,769509375,TZ -769509376,769515519,ZA -769515520,769523711,BJ -769523712,769535999,ZA -769536000,769540095,GH -769540096,769548287,ZA -769548288,769550335,NG -769550336,769556479,ZA -769556480,769589247,GH -769589248,769654783,US -769654784,769656831,BR -769656832,769657855,AR -769657856,769659903,BR -769659904,769660927,EC -769660928,769661951,BR -769661952,769662975,AR -769662976,769668095,BR -769668096,769669119,AR -769669120,769679359,BR -769679360,769680383,EC -769680384,769682431,AR -769682432,769684479,BR -769684480,769685503,EC -769685504,769686527,CL -769686528,769687551,AR -769687552,769690623,BR -769690624,769691647,AR -769691648,769692671,PE -769692672,769694719,EC -769694720,769695743,AR -769695744,769701887,BR -769701888,769702143,AR -769702400,769702655,CO -769702656,769702911,BR -769702912,769703935,AR -769703936,769706495,BR -769706752,769707007,AR -769707008,769713151,BR -769713152,769714175,HN -769714176,769719295,BR -769719296,769720319,HN -769720320,769721343,AR -769721344,769727487,BR -769727488,769728511,AR -769728512,769730559,BR -769730560,769731071,AR -769731072,769731327,BZ -769731328,769731583,CL -769731584,769732607,EC -769732608,769737727,BR -769738240,769738751,PA -769738752,769739263,BR -769739264,769739519,PA -769739776,769741823,CL -769741824,769742847,BR -769742848,769743871,EC -769743872,769744895,CL -769744896,769745919,AR -769745920,769746943,BR -769746944,769747967,EC -769747968,769748991,BR -769748992,769750015,CL -769750016,769754111,BR -769754112,769754623,CL -769754624,769754879,AR -769754880,769755135,PA -769755136,769759231,BR -769759744,769760255,BR -769760256,769761279,AR -769761280,769767423,BR -769767424,769768447,CL -769768448,769771519,BR -769772544,769773567,CL -769773568,769774591,BR -769774592,769777663,AR -769777664,769778687,CO -769778688,769787903,BR -769787904,769788927,AR -769788928,769793023,BR -769793024,769794047,AR -769794048,769795071,BO -769795072,769800191,BR -769800704,769800959,AR -769801216,769802239,BR -769802240,769803263,CR -769803264,769804287,PE -769804288,769811455,BR -769811456,769812479,AR -769812480,769814527,BR -769814528,769815551,CO -769815552,769822719,BR -769822720,769823743,AR -769823744,769826815,BR -769828864,769829887,CL -769829888,769830911,AR -769830912,769831935,GT -769831936,769832959,PY -769832960,769833471,AR -769833984,769838079,BR -769838080,769839103,EC -769840128,769843199,BR -769843200,769845247,AR -769845248,769853439,BR -769853440,769855487,AR -769855488,769856511,PE -769856512,769858559,BR -769859584,769861631,AR -769863680,769864703,AR -769864704,769866751,BR -769867008,769867263,BO -769867264,769868799,CL -769868800,769869823,AR -769869824,769870847,BR -769872896,769873919,BR -769873920,769874943,CO -769874944,769875967,AR -769876992,769878015,AR -769878016,769884159,BR -769886208,769887231,BR -769888256,769890303,BR -769890304,769891327,AR -769891328,769892351,BR -769892352,769894399,AR -769894400,769895423,BR -769896448,769897471,CL -769897472,769899519,BR -769903616,769905663,BR -769906688,769907711,AR -769908736,769909759,AR -769910784,769911807,BR -769913856,769914879,AR -769914880,769915903,BR -769915904,769916927,PA -769917952,769918975,BR -770703360,771227647,EG -771227648,771229695,IN -771229696,771230719,CN -771230720,771237375,IN -771237376,771237887,MY -771237888,771238911,IN -771238912,771239935,US -771239936,771241983,AU -771241984,771245055,IN -771245056,771246079,HK -771246080,771247103,KR -771247104,771248127,AU -771248128,771251199,CN -771251200,771252223,IN -771252224,771256319,CN -771256320,771260415,IN -771260416,771262463,CN -771262464,771263487,IN -771263488,771264511,AU -771264512,771267583,BD -771267584,771277823,IN -771277824,771278847,AU -771278848,771279871,HK -771279872,771295231,CN -771295232,771296255,PK -771296256,771303423,CN -771303424,771308543,IN -771308544,771309567,HK -771309568,771310591,KR -771310592,771315711,IN -771315712,771316223,US -771316224,771316479,KR -771316480,771316735,HK -771316736,771317759,CN -771317760,771318783,HK -771318784,771319295,SG -771319296,771319807,BD -771319808,771320063,SG -771320064,771320319,TW -771320320,771320831,AU -771320832,771321855,IN -771321856,771322879,CN -771322880,771323135,TW -771323904,771334143,IN -771334144,771335167,KR -771335168,771339263,IN -771339264,771340287,CN -771340288,771341311,BD -771341312,771348479,CN -771348480,771348991,ID -771348992,771349503,IN -771349504,771350271,ID -771350272,771350527,US -771350528,771355647,IN -771355648,771356671,HK -771356672,771361791,IN -771361792,771363839,CN -771363840,771364863,BD -771364864,771365887,GB -771365888,771369983,CN -771369984,771374079,IN -771374080,771375103,HK -771375104,771377151,IN -771377152,771378175,US -771378176,771384319,CN -771384320,771385343,ID -771385344,771398655,CN -771398656,771399679,PH -771399680,771400703,SG -771400704,771401727,CN -771401728,771402751,IN -771402752,771403775,HK -771403776,771404799,TH -771404800,771408895,CN -771408896,771409919,HK -771409920,771410943,MM -771410944,771412991,KR -771412992,771415039,IN -771415040,771416063,KR -771416064,771417087,IN -771417088,771418111,BD -771418112,771419135,IN -771419136,771420159,NL -771420160,771421183,MM -771421184,771423231,IN -771423232,771424255,BD -771424256,771425279,CN -771425280,771426303,ID -771426304,771427327,CN -771427328,771428351,IN -771428352,771430399,CN -771430400,771431423,PH -771431424,771435519,IN -771435520,771436543,US -771436544,771437567,IN -771437568,771438591,CN -771438592,771439615,BD -771439616,771440639,IN -771440640,771441663,HK -771441664,771442687,IN -771442688,771443711,ID -771443712,771445759,IN -771445760,771450879,CN -771450880,771452927,HK -771452928,771453951,VN -771453952,771454975,IN -771454976,771457023,CN -771457024,771458047,BD -771458048,771459071,JP -771459072,771482623,CN -771482624,771483647,BD -771483648,771489791,IN -771489792,771503103,CN -771503104,771504127,BD -771504128,771505151,US -771505152,771506175,HK -771506176,771507199,TH -771507200,771511295,IN -771511296,771535871,CN -771535872,771536895,IN -771536896,771537919,US -771537920,771538943,IN -771538944,771550207,CN -771550208,771551231,AU -771551232,771554303,VN -771554304,771555327,AU -771555328,771577855,CN -771577856,771578879,PH -771578880,771587071,CN -771587072,771588095,NZ -771588096,771588607,AU -771589120,771629055,CN -771629056,771630079,VN -771630080,771631103,SG -771631104,771632127,CN -771632128,771633151,MM -771633152,771680255,CN -771680256,771681279,HK -771681280,771683327,CN -771683328,771683583,US -771683584,771683839,PH -771683840,771684095,MV -771684096,771684351,MH -771684352,771685375,CN -771685376,771685631,KR -771685632,771685887,JP -771685888,771686143,NZ -771686144,771686399,TW -771686400,771718399,CN -771718400,771718655,ID -771718656,771719167,CN -771719168,771719423,IN -771719424,771720191,US -771720192,771720447,NL -771720448,771720703,CN -771720704,771720959,NL -771720960,771750911,CN -771750912,771751935,MY -771751936,771817471,RU -771817472,771948543,TR -771948544,772014079,RU -772014080,772145151,DE -772145152,772210687,ES -772210688,772276223,IE -772276224,772278271,RU -772278272,772278783,CZ -772278784,772282623,RU -772282624,772282879,KZ -772282880,772283391,RU -772283392,772283647,ES -772283648,772284927,RU -772284928,772285183,UA -772285184,772285439,UZ -772285440,772285695,RU -772285696,772285951,GR -772285952,772287771,RU -772287772,772287772,NL -772287773,772339967,RU -772339968,772340223,NL -772340224,772340735,RU -772340736,772341247,KZ -772341248,772341759,RU -772341760,772407295,NO -772407296,772472831,BG -772472832,772538367,MT -772538368,772603903,GR -772603904,772669439,CZ -772669440,772734975,CH -772734976,772800511,NO -772800512,772802559,GB -772802560,772804607,RU -772804608,772806655,GL -772806656,772808703,RU -772808704,772810751,GB -772810752,772812799,FR -772812800,772814847,NO -772814848,772816895,ES -772816896,772818943,RU -772818944,772820991,DE -772820992,772823039,GB -772823040,772825087,IT -772825088,772827135,RU -772827136,772829183,RS -772829184,772831231,EE -772831232,772833279,CZ -772835328,772837375,CY -772837376,772839423,KZ -772839424,772841471,CH -772841472,772843519,GB -772843520,772845567,IT -772845568,772847615,RU -772847616,772849663,NL -772849664,772851711,BG -772851712,772853759,CH -772853760,772855807,GB -772855808,772857855,DE -772857856,772859903,RU -772859904,772861951,SE -772861952,772863743,BE -772863744,772863999,ES -772864000,772870143,NL -772870144,772872191,NO -772872192,772874239,NL -772874240,772876287,IE -772876288,772880383,RU -772880384,772882431,GB -772882432,772884479,FR -772884480,772886527,LB -772886528,772888575,FR -772888576,772890623,GB -772890624,772892033,NL -772892034,772892041,RU -772892042,772892671,NL -772892672,772894719,GB -772894720,772896767,PL -772896768,772898815,RS -772898816,772900863,TR -772900864,772902911,ES -772902912,772904959,RS -772904960,772907007,IT -772907008,772909055,GB -772911104,772913151,GB -772913152,772915199,SE -772915200,772917247,FI -772917248,772919295,RU -772919296,772923391,GB -772923392,772925439,AT -772925440,772925695,ZW -772925696,772926463,GB -772926464,772926719,ZW -772926720,772927487,GB -772927488,772929535,UA -772929536,772931583,RU -772931584,772933631,UA -772933632,772935679,GB -772935680,772937727,PS -772937728,772939775,IT -772939776,772941823,BE -772941824,772943871,ES -772943872,772945919,GB -772945920,772947967,DE -772947968,772950015,AZ -772950016,772952063,ES -772952064,772952319,US -772952320,772954111,GB -772954112,772958207,FR -772958208,772962303,GB -772962304,772966399,FR -772966400,772968447,IT -772968448,772970495,SK -772970496,772972543,GB -772972544,772974591,SA -772974592,772978687,GB -772978688,772980735,DE -772980736,772982783,FR -772982784,772984831,RU -772984832,772986879,FR -772986880,772988927,GB -772988928,772990975,FR -772990976,772993023,IT -772993024,772995071,DE -772995072,772997119,IR -772997120,772999167,BE -772999168,773001215,SI -773001216,773003263,NO -773003264,773005311,FR -773005312,773007359,NL -773007360,773009407,KZ -773009408,773011455,IT -773011456,773013503,DE -773013504,773015551,RU -773015552,773017599,AE -773017600,773019647,IL -773019648,773021695,DE -773021696,773023743,AM -773023744,773025791,US -773025792,773027839,RU -773027840,773031935,FR -773031936,773033983,CH -773033984,773036031,LV -773036032,773038079,DE -773038080,773040127,GB -773040128,773042175,NL -773042176,773044223,FR -773044224,773046271,RU -773046272,773048319,LB -773048320,773050367,LV -773050368,773052415,IE -773052416,773054463,NL -773054464,773055871,AL -773055872,773055999,RS -773056000,773056511,AL -773056512,773058559,IT -773058560,773060607,BE -773060608,773062655,DK -773062656,773066751,TR -773066752,773070847,AT -773070848,773074943,DE -773074944,773079039,PL -773079040,773083135,RU -773083136,773087231,IT -773087232,773091327,LB -773091328,773095423,GB -773095424,773099519,RO -773099520,773103615,TR -773103616,773107711,FR -773107712,773111807,RU -773111808,773115903,TJ -773115904,773119999,PS -773120000,773124095,GB -773124096,773125247,CH -773125248,773125375,GB -773125376,773125503,CH -773125504,773125567,GB -773125568,773125855,CH -773125856,773125887,RU -773125888,773126143,FR -773126144,773128191,CH -773128192,773132287,DE -773132288,773136383,CH -773136384,773140479,DK -773140480,773144575,CY -773144576,773148671,RU -773148672,773152767,IR -773152768,773153791,SE -773153792,773154303,US -773154304,773156863,SE -773156864,773165055,FR -773165056,773166463,NL -773166464,773166591,PL -773166592,773167199,US -773167200,773167215,NL -773167216,773167655,US -773167656,773167663,NL -773167664,773168127,US -773168128,773168415,NL -773168416,773168639,US -773168640,773168895,NL -773168896,773169151,US -773169152,773173247,NL -773173248,773177343,IT -773177344,773177407,ES -773177408,773181439,FR -773181440,773185535,PL -773185536,773189631,NL -773189632,773192191,RU -773192192,773192447,UA -773192448,773192703,IQ -773192704,773197823,RU -773197824,773201919,CH -773201920,773206015,DE -773206016,773210111,RU -773210112,773210623,US -773210624,773211135,ES -773211136,773211391,FR -773211392,773211647,US -773211648,773211903,NL -773211904,773212159,SG -773212160,773212671,NL -773212672,773213183,GB -773213184,773214207,US -773214208,773218303,FR -773218304,773222399,IS -773222400,773226495,SE -773226496,773230591,IE -773230592,773234687,RS -773234688,773238783,PL -773238784,773242879,NL -773242880,773246975,FR -773246976,773251071,EE -773251072,773255167,AZ -773255168,773259263,RU -773259264,773263359,SI -773263360,773267455,BH -773267456,773271551,LV -773271552,773275647,CZ -773275648,773277695,GB -773277696,773283839,NL -773283840,773287935,AZ -773287936,773292031,JO -773292032,773296127,CZ -773296128,773300223,RU -773300224,773304319,FI -773304320,773308415,RU -773308416,773312511,IT -773312512,773316607,DE -773316608,773318655,GB -773318656,773320703,DE -773320704,773324799,FR -773324800,773586943,ES -773586944,773588991,IT -773588992,773591039,PL -773591040,773593087,RU -773593088,773595135,IT -773595136,773597183,DE -773597184,773599231,BE -773599232,773601279,GB -773601280,773603327,LV -773603328,773605375,UA -773605376,773607423,IR -773607424,773609471,DE -773609472,773611519,RU -773611520,773613567,BY -773613568,773615615,CZ -773615616,773617663,DE -773617664,773619711,IT -773619712,773621759,RU -773621760,773623807,PS -773623808,773625855,SE -773625856,773627903,IS -773627904,773629951,ES -773629952,773631999,FR -773632000,773634047,CY -773634048,773636095,DE -773636096,773638143,UA -773638144,773640191,CH -773640192,773642239,ES -773642240,773644287,HU -773644288,773646335,RU -773646336,773648383,TR -773648384,773650431,PL -773650432,773652479,GB -773652480,773653503,SK -773653504,773654527,CZ -773654528,773656575,RU -773656576,773658623,PL -773660672,773662719,AT -773662720,773664767,DE -773664768,773666815,ES -773666816,773668863,GB -773668864,773670911,DE -773670912,773672959,RU -773672960,773675007,SA -773675008,773677055,GB -773677056,773679103,DE -773679104,773681151,IT -773681152,773683199,RU -773683200,773685247,FR -773685248,773687295,UA -773687296,773689343,HU -773689344,773691391,PL -773691392,773695487,RU -773695488,773697535,MK -773697536,773699583,LU -773699584,773701631,CZ -773701632,773703679,RU -773703680,773705727,IT -773705728,773707775,RU -773707776,773709823,NO -773709824,773711871,CZ -773711872,773713919,RU -773713920,773715967,NL -773715968,773718015,SE -773718016,773720063,DE -773720064,773722111,GB -773722112,773724159,ES -773724160,773726207,DE -773726208,773730303,RU -773730304,773732351,GB -773732352,773734399,DE -773734400,773736447,CZ -773736448,773740543,DE -773740544,773742591,CZ -773742592,773744639,GB -773744640,773746175,ES -773746176,773746687,US -773746688,773748735,DE -773748736,773750783,DK -773750784,773752831,FI -773752832,773754879,GB -773754880,773756927,CZ -773756928,773758975,RU -773758976,773761023,UA -773761024,773763071,IT -773763072,773765119,TR -773767168,773769215,GB -773769216,773771263,FR -773771264,773773311,DK -773773312,773775359,IT -773775360,773777407,IQ -773777408,773779455,CZ -773779456,773783551,IT -773783552,773785599,RU -773785600,773787647,NL -773787648,773789695,DK -773789696,773791743,RU -773791744,773793791,PL -773793792,773795839,FR -773795840,773797887,NL -773797888,773799935,ES -773799936,773800703,CY -773800704,773800959,GB -773800960,773801215,SG -773801216,773801471,US -773801472,773801983,CY -773804032,773806079,GB -773806080,773808127,BE -773808128,773810175,IL -773810176,773812223,IT -773812224,773814271,TR -773814272,773816319,DE -773816320,773818367,IT -773818368,773820415,HR -773820416,773822463,TR -773822464,773824511,RU -773824512,773826559,FR -773826560,773828607,GB -773828608,773830655,HU -773830656,773831679,NO -773831680,773832703,NL -773832704,773834751,FR -773834752,773836799,IM -773836800,773838847,FR -773838848,773840895,DE -773840896,773842943,GB -773844992,773845247,GB -773845248,773845503,GG -773845504,773846015,GB -773846016,773847039,GG -773847040,773849087,IT -773849088,773857279,IR -773857280,773865471,DK -773865472,773873663,RU -773873664,773881855,JO -773881856,773890047,DK -773890048,773898239,AZ -773898240,773906431,PS -773906432,773922815,GB -773922816,773931007,UA -773931008,773934591,DE -773934592,773935352,FR -773935353,773935353,US -773935354,773935728,FR -773935729,773935729,GB -773935730,773936145,FR -773936146,773936146,US -773936147,773936199,FR -773936200,773936203,DE -773936204,773936419,FR -773936420,773936423,GB -773936424,773937663,FR -773937664,773937664,DE -773937665,773937673,FR -773937674,773937674,IE -773937675,773938231,FR -773938232,773938239,GB -773938240,773939199,FR -773939200,773947391,CZ -773947392,773955583,GB -773955584,773963775,FR -773963776,773968895,ME -773968896,773969407,RU -773969408,773971967,ME -773971968,773980159,UA -773980160,773988351,GB -773988352,773996543,ES -773996544,773996799,TR -773996800,773997823,ES -773997824,773998079,NL -773998080,774000671,ES -774000672,774000687,NL -774000688,774000823,ES -774000824,774000824,GB -774000825,774001663,ES -774001664,774002687,NL -774002688,774002815,ES -774002816,774002842,NL -774002843,774002843,ES -774002844,774002943,NL -774002944,774003199,ES -774003200,774003711,TR -774003712,774004735,ES -774004736,774012927,IR -774012928,774021119,RU -774021120,774029311,IR -774029312,774037503,KZ -774037504,774045695,SK -774045696,774053887,FR -774053888,774062079,DE -774062080,774070271,YE -774070272,774078463,ES -774078464,774086655,BA -774086656,774094847,BG -774094848,774103039,HU -774103040,774111231,UA -774111232,774119423,RU -774119424,774127615,CZ -774127616,774135807,LT -774135808,774143999,IR -774144000,774152191,KZ -774152192,774160383,BA -774160384,774162431,GB -774162432,774162432,VA -774162433,774162442,GB -774162443,774162452,BA -774162453,774162462,BO -774162463,774162472,SR -774162473,774162482,IT -774162483,774162492,CK -774162493,774162502,IT -774162503,774162512,NU -774162513,774162522,BO -774162523,774162532,DE -774162533,774162542,TF -774162543,774162552,GG -774162553,774162562,MX -774162563,774162572,MQ -774162573,774162582,YT -774162583,774162592,NC -774162593,774162602,CA -774162603,774162622,US -774162623,774162627,MX -774162628,774162637,GB -774162638,774162642,NF -774162643,774162647,VN -774162648,774162652,AO -774162653,774162657,GM -774162658,774162662,US -774162663,774162667,BW -774162668,774162672,US -774162673,774162677,KG -774162678,774162682,MG -774162683,774162687,US -774162688,774162688,VA -774162689,774162693,US -774162694,774162698,MZ -774162699,774162703,NP -774162704,774162738,US -774162739,774162743,UA -774162744,774162778,US -774162779,774162784,CA -774162785,774162787,UA -774162788,774162788,VA -774162789,774162798,CA -774162799,774162803,BN -774162804,774162808,TM -774162809,774162813,US -774162814,774162818,IT -774162819,774162823,KZ -774162824,774162828,US -774162829,774162833,PN -774162834,774162838,SM -774162839,774162848,GB -774162849,774162853,AU -774162854,774162858,NL -774162859,774162863,IE -774162864,774162888,US -774162889,774162893,CA -774162894,774162903,MX -774162904,774162908,GB -774162909,774162913,AX -774162914,774162917,FO -774162918,774162923,SJ -774162924,774162928,CC -774162929,774162933,NR -774162934,774162938,GS -774162939,774162942,UM -774162943,774162944,VA -774162945,774162964,IT -774162965,774162966,MX -774162967,774162967,LI -774162968,774162969,MX -774162970,774162970,BY -774162971,774162974,MX -774162975,774162975,MY -774162976,774162979,LB -774162980,774162980,IN -774162981,774162983,BO -774162984,774162987,SX -774162988,774162991,MX -774162992,774162994,VA -774162995,774162999,IR -774163000,774163000,PK -774163001,774163009,BO -774163010,774163010,VE -774163011,774163014,BO -774163015,774163024,RU -774163025,774163034,UA -774163035,774163039,AE -774163040,774163071,VA -774163072,774163074,GW -774163075,774163124,IT -774163125,774163134,TJ -774163135,774163139,ET -774163140,774163144,DK -774163145,774163149,AF -774163150,774163154,SY -774163155,774163174,UA -774163175,774163179,US -774163180,774163200,VA -774163201,774163203,US -774163204,774163210,AU -774163211,774163215,TD -774163216,774163220,CD -774163221,774163225,DJ -774163226,774163230,CF -774163231,774163235,US -774163236,774163240,MF -774163241,774163245,VC -774163246,774163250,PM -774163251,774163255,BL -774163256,774163260,DM -774163261,774163265,KM -774163266,774163270,TZ -774163271,774163275,ST -774163276,774163280,GB -774163281,774163283,NL -774163284,774163290,FK -774163291,774163330,IT -774163331,774163335,UG -774163336,774163339,MP -774163340,774163343,TL -774163344,774163347,WF -774163348,774163351,SD -774163352,774163359,SS -774163360,774163367,BQ -774163368,774163375,CW -774163376,774163383,IT -774163384,774163399,GE -774163400,774163415,US -774163416,774163455,VA -774163456,774166527,DK -774166528,774168575,EE -774168576,774176767,PL -774176768,774184959,IT -774184960,774193151,GB -774193152,774209535,ES -774209536,774217727,RU -774217728,774225919,GB -774225920,774234111,UA -774234112,774242303,IT -774242304,774258687,RU -774258688,774266879,SA -774266880,774275071,RU -774275072,774279167,IR -774279168,774281215,UA -774281216,774283263,IR -774283264,774291455,GB -774291456,774299647,NL -774299648,774307839,DE -774307840,774324223,RU -774324224,774332415,UA -774332416,774340607,SE -774340608,774348799,EE -774348800,774356991,CZ -774356992,774365183,ES -774365184,774373375,RU -774373376,774383359,RS -774383360,774383615,XK -774383616,774389759,RS -774389760,774406143,BG -774406144,774422527,SY -774422528,774438911,OM -774438912,774455295,DE -774455296,774471679,RU -774471680,774488063,PL -774488064,774504447,IR -774504448,774520831,RU -774520832,774537215,BH -774537216,774553599,RU -774553600,774569983,KZ -774569984,774586367,GB -774586368,774602751,PS -774602752,774619135,GB -774619136,774651903,RU -774651904,774668287,SA -774668288,774684671,NL -774684672,774701055,IT -774701056,774717439,RU -774717440,774733823,PL -774733824,774750207,TR -774750208,774782975,RU -774782976,774799359,UA -774799360,774815743,RU -774815744,774832127,NO -774832128,774848511,RU -774848512,774864895,BG -774864896,774881279,CZ -774881280,774963199,RU -774963200,774995967,GE -774995968,775028735,SA -775028736,775061503,PT -775061504,775094271,RU -775094272,775111877,RO -775111878,775111878,IR -775111879,775127039,RO -775127040,775147519,IE -775147520,775149567,NL -775149568,775151615,SG -775151616,775159807,JP -775159808,775192575,SA -775192576,775225343,RU -775225344,775258111,SY -775258112,775290879,BY -775290880,775323647,MT -775323648,775356415,SI -775356416,775389183,MD -775389184,775421951,BG -775421952,775487487,BY -775487488,775520255,AT -775520256,775553023,SY -775557120,775557375,CH -775569408,775569663,US -775585792,775618559,SY -775618560,775645951,SE -775645952,775646207,NO -775646208,775651327,SE -775651328,775684095,DE -775684096,775716863,PS -775716864,775749631,GB -775749632,775847935,RU -775847936,775880703,IR -775880704,775913471,UA -775913472,775946239,RU -775946240,776077311,GB -776077312,776208383,NO -776208384,776339455,GB -776339456,776470527,AM -776470528,776601599,RU -776601600,776732671,AT -776732672,776863743,PL -776863744,778043391,DE -778043392,778108927,UA -778108928,778174463,RO -778174464,778239999,UA -778240000,778304305,AL -778304306,778304306,SI -778304307,778305535,AL -778305536,778371071,IR -778371072,778388479,GB -778388480,778389503,DE -778389504,778395647,GB -778395648,778436607,DE -778436608,778461183,RO -778461184,778461439,TR -778461440,778462207,RO -778462208,778462463,TR -778462464,778462719,US -778462720,778462975,RO -778462976,778463231,EE -778463232,778463999,RO -778464000,778464255,RU -778464256,778465279,RO -778465280,778466303,IT -778466304,778467327,RO -778467328,778473471,IR -778473472,778474495,RO -778474496,778475519,US -778475520,778475775,CH -778475776,778476031,RO -778476032,778476287,IE -778476288,778477567,RO -778477568,778477695,NL -778477696,778479615,ES -778479616,778480639,RO -778480640,778480895,FR -778480896,778481151,RO -778481152,778481407,GB -778481408,778481663,RO -778481664,778481919,ES -778481920,778482943,GB -778482944,778483199,IE -778483200,778483711,RO -778483712,778484735,IR -778484736,778485247,IT -778485248,778485759,RO -778485760,778493951,GB -778493952,778495999,NL -778496000,778497791,RO -778497792,778500095,NL -778500096,778500351,GB -778500352,778500863,RO -778500864,778500991,CN -778500992,778501119,HK -778501120,778501631,GB -778501632,778502143,RO -778502144,778567679,GR -778567680,778633215,TR -778633216,778638335,FR -778638336,778638591,ES -778638592,778639231,FR -778639232,778639359,FI -778639360,778639615,ES -778639616,778640127,FR -778640128,778640383,GB -778640384,778640639,FR -778640640,778640895,PT -778640896,778641151,FR -778641152,778641407,IE -778641408,778650655,FR -778650656,778650687,LT -778650688,778653855,FR -778653856,778653871,BE -778653872,778653887,FR -778653888,778653903,IE -778653904,778653935,FR -778653936,778653951,GB -778653952,778654031,FR -778654032,778654039,ES -778654040,778654903,FR -778654904,778654907,GB -778654908,778654927,FR -778654928,778654935,ES -778654936,778654959,FR -778654960,778654975,BE -778654976,778655039,FR -778655040,778655103,ES -778655104,778655191,FR -778655192,778655199,LT -778655200,778655223,FR -778655224,778655231,PT -778655232,778655583,FR -778655584,778655615,ES -778655616,778655679,IT -778655680,778655807,FR -778655808,778655871,NL -778655872,778655935,FR -778655936,778655999,IE -778656000,778656223,FR -778656224,778656255,PT -778656256,778656383,FR -778656384,778656447,GB -778656448,778656575,FR -778656576,778656607,PT -778656608,778656639,FR -778656640,778656671,BE -778656672,778656703,IT -778656704,778657399,FR -778657400,778657403,PT -778657404,778657463,FR -778657464,778657471,CZ -778657472,778657535,GB -778657536,778662028,FR -778662029,778662029,ES -778662030,778666063,FR -778666064,778666079,IE -778666080,778666095,ES -778666096,778666259,FR -778666260,778666263,ES -778666264,778666303,FR -778666304,778666367,ES -778666368,778666375,FR -778666376,778666379,GB -778666380,778666479,FR -778666480,778666495,DE -778666496,778666591,FR -778666592,778666607,LT -778666608,778666687,FR -778666688,778666719,ES -778666720,778666847,FR -778666848,778666863,PT -778666864,778666879,FR -778666880,778666943,GB -778666944,778666975,FR -778666976,778667007,PL -778667008,778667175,FR -778667176,778667179,ES -778667180,778667347,FR -778667348,778667351,GB -778667352,778667499,FR -778667500,778667503,GB -778667504,778667999,FR -778668000,778668003,GB -778668004,778668271,FR -778668272,778668279,ES -778668280,778668391,FR -778668392,778668395,FI -778668396,778668399,ES -778668400,778668479,FR -778668480,778668495,ES -778668496,778668607,FR -778668608,778668615,IE -778668616,778668627,FR -778668628,778668631,ES -778668632,778668719,FR -778668720,778668723,PT -778668724,778668731,FR -778668732,778668735,GB -778668736,778668799,FR -778668800,778668831,FI -778668832,778668863,FR -778668864,778668895,DE -778668896,778669055,FR -778669056,778669087,ES -778669088,778669211,FR -778669212,778669215,ES -778669216,778669223,FR -778669224,778669231,GB -778669232,778669451,FR -778669452,778669455,ES -778669456,778669663,FR -778669664,778669695,FI -778669696,778669823,FR -778669824,778669855,ES -778669856,778669935,FR -778669936,778669951,ES -778669952,778669967,FR -778669968,778669975,IE -778669976,778669979,PT -778669980,778669983,IE -778669984,778670047,FR -778670048,778670079,GB -778670080,778670175,FR -778670176,778670207,GB -778670208,778670751,FR -778670752,778670755,DE -778670756,778670975,FR -778670976,778670976,DE -778670977,778671201,FR -778671202,778671202,ES -778671203,778671915,FR -778671916,778671919,GB -778671920,778672063,FR -778672064,778672067,GB -778672068,778672071,FR -778672072,778672079,GB -778672080,778672095,FR -778672096,778672111,IE -778672112,778672119,FR -778672120,778672123,ES -778672124,778672383,FR -778672384,778672447,NL -778672448,778672479,FR -778672480,778672511,ES -778672512,778672639,FR -778672640,778672703,PT -778672704,778673187,FR -778673188,778673191,ES -778673192,778673207,FR -778673208,778673211,ES -778673212,778673279,FR -778673280,778673283,GB -778673284,778673751,FR -778673752,778673759,DE -778673760,778673883,FR -778673884,778673887,ES -778673888,778674303,FR -778674304,778674367,DE -778674368,778674535,FR -778674536,778674539,ES -778674540,778674768,FR -778674769,778674769,BE -778674770,778674783,FR -778674784,778674799,GB -778674800,778674991,FR -778674992,778674995,GB -778674996,778674999,FR -778675000,778675003,FI -778675004,778675007,PL -778675008,778675199,FR -778675200,778675207,ES -778675208,778675631,FR -778675632,778675639,ES -778675640,778675695,FR -778675696,778675711,BE -778675712,778675767,FR -778675768,778675775,ES -778675776,778675795,FR -778675796,778675799,ES -778675800,778675819,FR -778675820,778675823,GB -778675824,778675827,ES -778675828,778675891,FR -778675892,778675895,ES -778675896,778676127,FR -778676128,778676131,ES -778676132,778676143,FR -778676144,778676159,ES -778676160,778676367,FR -778676368,778676383,GB -778676384,778676555,FR -778676556,778676559,ES -778676560,778676623,FR -778676624,778676627,GB -778676628,778676631,ES -778676632,778676639,FR -778676640,778676655,ES -778676656,778676719,FR -778676720,778676723,GB -778676724,778677095,FR -778677096,778677099,PL -778677100,778677183,FR -778677184,778677215,ES -778677216,778677255,FR -778677256,778677259,ES -778677260,778677375,FR -778677376,778677391,GB -778677392,778677399,FR -778677400,778677403,PT -778677404,778677503,FR -778677504,778677505,GB -778677506,778677506,ES -778677507,778677507,GB -778677508,778677759,ES -778677760,778678859,FR -778678860,778678863,GB -778678864,778678919,FR -778678920,778678927,ES -778678928,778679212,FR -778679213,778679214,FI -778679215,778679279,FR -778679280,778679295,ES -778679296,778679491,FR -778679492,778679495,ES -778679496,778680147,FR -778680148,778680151,GB -778680152,778680175,FR -778680176,778680183,ES -778680184,778680227,FR -778680228,778680231,IE -778680232,778680575,FR -778680576,778680639,DE -778680640,778680643,FR -778680644,778680647,PT -778680648,778680651,FR -778680652,778680655,ES -778680656,778680683,FR -778680684,778680687,ES -778680688,778681023,FR -778681024,778681087,FI -778681088,778681359,FR -778681360,778681367,ES -778681368,778681423,FR -778681424,778681431,FI -778681432,778681463,FR -778681464,778681471,ES -778681472,778681503,FR -778681504,778681507,DE -778681508,778681519,FR -778681520,778681523,ES -778681524,778681615,FR -778681616,778681619,ES -778681620,778681707,FR -778681708,778681711,ES -778681712,778681775,FR -778681776,778681779,GB -778681780,778681983,FR -778681984,778681999,PT -778682000,778682079,FR -778682080,778682095,PT -778682096,778686543,FR -778686544,778686559,LT -778686560,778687431,FR -778687432,778687439,IT -778687440,778688447,FR -778688448,778688451,CZ -778688452,778689007,FR -778689008,778689015,FI -778689016,778689151,FR -778689152,778689183,CZ -778689184,778689923,FR -778689924,778689927,DE -778689928,778690655,FR -778690656,778690687,ES -778690688,778690735,FR -778690736,778690751,PT -778690752,778691763,FR -778691764,778691767,DE -778691768,778691887,FR -778691888,778691895,PT -778691896,778691975,FR -778691976,778691983,ES -778691984,778692143,FR -778692144,778692159,DE -778692160,778692191,FR -778692192,778692195,ES -778692196,778692199,FR -778692200,778692207,ES -778692208,778692499,FR -778692500,778692503,ES -778692504,778692527,FR -778692528,778692535,BE -778692536,778692551,FR -778692552,778692555,ES -778692556,778692619,FR -778692620,778692623,ES -778692624,778692743,FR -778692744,778692747,ES -778692748,778692767,FR -778692768,778692783,ES -778692784,778692827,FR -778692828,778692831,GB -778692832,778692891,FR -778692892,778692895,GB -778692896,778693095,FR -778693096,778693103,ES -778693104,778693159,FR -778693160,778693163,ES -778693164,778693175,FR -778693176,778693179,ES -778693180,778693427,FR -778693428,778693431,ES -778693432,778693439,FR -778693440,778693455,GB -778693456,778693471,FR -778693472,778693503,NL -778693504,778693663,FR -778693664,778693679,ES -778693680,778693759,FR -778693760,778693763,ES -778693764,778693855,FR -778693856,778693887,BE -778693888,778693967,FR -778693968,778693971,ES -778693972,778694659,FR -778694660,778694663,NL -778694664,778695087,FR -778695088,778695103,PT -778695104,778695119,FR -778695120,778695135,LT -778695136,778695203,FR -778695204,778695207,ES -778695208,778695375,FR -778695376,778695391,FI -778695392,778695471,FR -778695472,778695475,ES -778695476,778695535,FR -778695536,778695551,ES -778695552,778695767,FR -778695768,778695775,ES -778695776,778695795,FR -778695796,778695799,ES -778695800,778695823,FR -778695824,778695839,FI -778695840,778695991,FR -778695992,778695999,IT -778696000,778696219,FR -778696220,778696223,GB -778696224,778696271,FR -778696272,778696287,ES -778696288,778696435,FR -778696436,778696439,GB -778696440,778696495,FR -778696496,778696499,ES -778696500,778696811,FR -778696812,778696815,DE -778696816,778696847,FR -778696848,778696851,ES -778696852,778696983,FR -778696984,778696987,ES -778696988,778696991,FR -778696992,778696995,ES -778696996,778697055,FR -778697056,778697063,ES -778697064,778697067,FR -778697068,778697071,ES -778697072,778697175,FR -778697176,778697179,ES -778697180,778697279,FR -778697280,778697287,IE -778697288,778697311,FR -778697312,778697343,ES -778697344,778697435,FR -778697436,778697439,GB -778697440,778697471,FR -778697472,778697479,CZ -778697480,778697727,FR -778697728,778697791,ES -778697792,778697815,FR -778697816,778697819,ES -778697820,778697955,FR -778697956,778697959,ES -778697960,778698243,FR -778698244,778698247,GB -778698248,778698295,FR -778698296,778698303,IE -778698304,778698447,FR -778698448,778698451,ES -778698452,778698511,FR -778698512,778698519,FI -778698520,778698591,FR -778698592,778698595,BE -778698596,778698627,FR -778698628,778698631,ES -778698632,778698643,FR -778698644,778698647,ES -778698648,778698703,FR -778698704,778698707,ES -778698708,778698751,FR -778698752,778764287,TR -778764288,778822655,HU -778822656,778823423,UA -778823424,778829823,HU -778829824,778862591,RO -778862592,778895359,GB -778895360,778960895,LV -778960896,779026431,DE -779026432,779091967,RU -779091968,779223039,PL -779223040,779354111,DE -779354112,779485183,IL -779485184,779616255,UA -779616256,779747327,IL -779747328,779878399,SI -779878400,780009471,AT -780009472,780140543,CH -780140544,780206079,DE -780206080,780271615,NL -780271616,780337151,AM -780337152,780402687,EE -780402688,780468223,FI -780468224,780533759,UA -780533760,780599295,PL -780599296,780664831,CZ -780664832,780730367,ES -780730368,780779519,IE -780779520,780795903,SG -780795904,780861439,RU -780861440,780926975,HU -780926976,780992511,CH -780992512,781058047,IT -781058048,781123583,DE -781123584,781189119,IR -781189120,781320191,NL -781320192,781451263,RU -781451264,781455359,PL -781455360,781459455,UA -781459456,781463551,IR -781463552,781467647,RU -781467648,781475839,PL -781475840,781479935,RU -781479936,781480191,UA -781480192,781480447,RO -781480448,781480703,BE -781480704,781484031,UA -781484032,781488127,RU -781488128,781496319,PL -781496320,781497343,RU -781497344,781498367,UA -781498368,781516799,RU -781516800,781520895,SA -781520896,781524991,IS -781524992,781529087,RU -781529088,781533183,UA -781533184,781537279,RU -781537280,781541375,UA -781545472,781549567,CZ -781549568,781553663,RU -781553664,781557759,PL -781557760,781565951,UA -781565952,781570047,IT -781570048,781574143,PL -781574144,781578239,RU -781578240,781582335,PL -781582336,781590527,UA -781590528,781598719,SI -781598720,781615103,UA -781615104,781631487,RU -781631488,781639679,SK -781639680,781651967,RU -781651968,781654015,PL -781654016,781656063,RU -781656064,781658111,RO -781658112,781660159,UA -781660160,781662207,RU -781662208,781664255,SK -781664256,781666303,RU -781666304,781668351,PL -781668352,781670399,UA -781670400,781672447,RU -781672448,781674495,BE -781674496,781676543,RU -781676544,781678591,PL -781678592,781682687,RS -781682688,781684735,PL -781684736,781686783,UA -781686784,781688831,RU -781688832,781690879,RO -781690880,781692927,RU -781692928,781694975,UA -781694976,781697023,PL -781697024,781699071,UA -781699072,781701119,AT -781701120,781703167,SA -781703168,781705215,PL -781705216,781707263,RO -781707264,781709311,SI -781709312,781711359,RU -781711360,781713407,UA -781713408,781844479,SA -781844480,781975551,TR -781975552,782106623,NO -782106624,782254079,RU -782254080,782270463,UA -782270464,782311167,RU -782311168,782311423,MD -782311424,782313471,RU -782313472,782313727,UA -782313728,782316543,RU -782316544,782317567,DE -782317568,782317695,IN -782317696,782317823,CN -782317824,782317951,TR -782317952,782318079,JP -782318080,782318207,SA -782318208,782318335,IL -782318336,782318463,AU -782318464,782318591,RU -782318592,782318719,ES -782318720,782318847,RU -782318848,782318975,IS -782318976,782319103,BE -782319104,782319231,KZ -782319232,782319359,RU -782319360,782319487,MD -782319488,782319615,RU -782319616,782335999,ME -782336000,782352383,RU -782352384,782368767,SY -782368768,782385151,UA -782385152,782401535,SE -782401536,782417919,FR -782417920,782434303,AM -782434304,782434815,HR -782434816,782446591,SI -782446592,782447359,BA -782447360,782447615,HR -782447616,782447871,SI -782447872,782448127,HR -782448128,782449151,SI -782449152,782449407,HR -782449408,782449471,RS -782449472,782449663,SI -782449664,782450687,BA -782450688,782467071,DE -782467072,782483455,RU -782483456,782499839,FI -782499840,782516223,SI -782516224,782532607,IR -782532608,782548991,UA -782548992,782581759,RU -782581760,782598143,FR -782598144,782616643,DE -782616644,782616644,RU -782616645,782630911,DE -782630912,782647295,MD -782647296,782663679,RU -782663680,782671871,NL -782671872,782672655,LT -782672656,782672663,VG -782672664,782673935,LT -782673936,782673943,EE -782673944,782674439,LT -782674440,782674447,CA -782674448,782674471,LT -782674472,782674479,CA -782674480,782674959,LT -782674960,782674975,CR -782674976,782675967,LT -782675968,782680063,NL -782680064,782696447,RU -782696448,782712831,DE -782712832,782729215,RU -782729216,782737407,IR -782737408,782745599,DE -782745600,782761983,CZ -782761984,783024127,PL -783024128,783040511,RU -783040512,783048703,UA -783048704,783056895,RU -783056896,783065087,UA -783065088,783073279,RU -783073280,783081471,UA -783081472,783089663,AD -783089664,783114239,RU -783114240,783134719,UA -783134720,783138815,RU -783138816,783142911,CZ -783142912,783147007,RU -783147008,783151103,FI -783151104,783155199,RO -783155200,783157247,PL -783157248,783159295,RU -783159296,783161343,CZ -783161344,783163391,PL -783163392,783165439,CZ -783165440,783169535,RU -783169536,783171583,CZ -783171584,783173631,UA -783173632,783175679,PL -783175680,783179775,RU -783179776,783181823,RS -783181824,783185919,RU -783185920,783187967,UA -783187968,783190015,NL -783190016,783194111,RO -783194112,783196159,CZ -783196160,783198207,UA -783198208,783202303,PL -783204352,783206399,RU -783206400,783208447,RO -783208448,783210495,PL -783210496,783212543,UA -783212544,783216639,PL -783216640,783218687,UA -783218688,783220735,RU -783220736,783222783,SK -783222784,783223807,CH -783223808,783224063,RU -783224064,783224319,GB -783224320,783224831,PL -783224832,783226879,UA -783226880,783230975,RU -783230976,783233023,PL -783233024,783235071,GB -783235072,783237119,DE -783237120,783243263,UA -783243264,783245311,CZ -783245312,783247359,RU -783247360,783251455,PL -783251456,783255551,RU -783255552,783259647,UA -783261696,783263743,UA -783263744,783265791,BY -783265792,783267839,CZ -783267840,783269887,UA -783269888,783278079,RU -783278080,783282175,PL -783282176,783286271,UA -783286272,783417343,GR -783417344,783548415,BE -783548416,783679487,RU -783679488,783681535,FR -783681536,783683583,IE -783683584,783685631,DE -783685632,783687679,RU -783687680,783688447,IR -783688448,783688703,ES -783688704,783689727,IR -783689728,783691775,FR -783691776,783693823,BY -783693824,783694367,GB -783694368,783694399,DE -783694400,783695871,GB -783695872,783697919,TR -783697920,783699967,FR -783699968,783702015,UA -783702016,783704063,IT -783704064,783706111,PL -783706112,783708159,NL -783708160,783710207,FI -783710208,783712255,NL -783712256,783714303,RU -783714304,783718399,DE -783718400,783720447,IT -783720448,783722495,FI -783722496,783724543,AM -783724544,783726591,NL -783726592,783728639,IS -783728640,783730687,BE -783730688,783732735,SE -783732736,783734783,FR -783734784,783736831,NL -783736832,783738879,SI -783738880,783740927,IT -783740928,783745023,DE -783745024,783747071,RU -783747072,783749119,GB -783749120,783751167,GR -783751168,783753215,SE -783753216,783755263,FR -783755264,783757311,DE -783757312,783759359,FR -783759360,783763455,CZ -783763456,783765503,FI -783765504,783767551,RU -783767552,783769599,IL -783769600,783771647,DE -783771648,783773695,FR -783773696,783775743,ES -783775744,783777791,AL -783777792,783779839,RU -783779840,783781887,DK -783781888,783782143,NL -783782144,783782399,US -783782400,783783935,NL -783783936,783785983,DE -783785984,783788031,RU -783788032,783790079,NO -783790080,783792127,RU -783794176,783798271,GB -783798272,783800319,PL -783800320,783802367,LV -783802368,783804415,FR -783804416,783806463,IT -783806464,783810559,NL -783810560,783843327,SA -783843328,783876095,BH -783876096,783908863,UA -783908864,783941631,JO -783941632,783974399,PL -783974400,784007167,KW -784007168,784039935,RU -784039936,784072703,PL -784072704,784105471,RU -784105472,784138239,HR -784138240,784145617,DE -784145618,784145618,BE -784145619,784155483,DE -784155484,784155487,CH -784155488,784155491,NL -784155492,784155495,BE -784155496,784155503,AT -784155504,784155511,GB -784155512,784155519,CZ -784155520,784155611,DE -784155612,784155615,CH -784155616,784155619,NL -784155620,784155623,BE -784155624,784155631,AT -784155632,784155639,GB -784155640,784155640,CZ -784155641,784169215,DE -784169216,784169231,AL -784169232,784169247,BG -784169248,784169263,CZ -784169264,784169279,MK -784169280,784169343,AT -784169344,784169407,HU -784169408,784169471,SE -784169472,784171007,DE -784171008,784203775,PT -784203776,784236543,GR -784236544,784237567,IT -784237568,784238591,ES -784238592,784238847,GB -784238848,784239103,US -784239104,784240895,GB -784240896,784241151,SG -784241152,784268799,GB -784268800,784269055,US -784269056,784269311,GB -784269312,784302079,BY -784302080,784334847,RU -784334848,784457727,FR -784457728,784461823,GB -784461824,784463359,FR -784463360,784464383,GB -784464384,784465919,FR -784465920,784596991,SE -784596992,784728063,TR -784728064,784793599,GR -784793600,784859135,CY -784859136,785121279,UA -785121280,785252351,PL -785252352,785383423,AT -785383424,785448959,GB -785448960,785514495,IR -785514496,785580031,IL -785580032,785609020,UA -785609021,785609021,US -785609022,785645567,UA -785645568,785711103,NO -785711104,785776639,SY -785776640,785842175,RO -785842176,785907711,PL -785907712,785973247,BY -785973248,786038783,MK -786038784,786046463,FR -786046464,786046975,GB -786046976,786104319,FR -786104320,786169855,UA -786169856,786235391,AT -786235392,786300927,TR -786300928,786366463,ES -786366464,786431999,DE -786432000,786563071,IR -786563072,786565119,GB -786565120,786567167,NO -786567168,786569215,CZ -786569216,786571263,NO -786571264,786575359,ES -786575360,786576098,GB -786576099,786576099,SE -786576100,786576102,GB -786576103,786576103,BE -786576104,786577407,GB -786577408,786579455,NL -786579456,786581503,RU -786581504,786583551,GB -786583552,786585599,DE -786585600,786587647,NL -786587648,786589695,RU -786589696,786590719,FR -786590720,786591743,LU -786591744,786593791,DE -786593792,786595839,GB -786595840,786597887,FR -786597888,786599935,EE -786599936,786601983,ES -786601984,786603007,SE -786603008,786603519,NL -786603520,786604031,SE -786604032,786606079,RU -786606080,786608127,GB -786608128,786610175,IT -786610176,786612223,IM -786612224,786614271,GR -786614272,786616319,IT -786616320,786618367,KG -786618368,786620415,GB -786620416,786622463,RU -786622464,786624511,NL -786624512,786626559,RU -786626560,786628607,GB -786628608,786630655,IT -786630656,786632703,CZ -786632704,786634751,FR -786634752,786636799,RU -786636800,786638847,PL -786638848,786642943,GB -786642944,786644991,GR -786644992,786649087,SE -786649088,786651135,FR -786651136,786655231,DE -786655232,786657279,PL -786657280,786659327,FO -786659328,786661375,UZ -786661376,786663423,DE -786663424,786665471,UA -786665472,786667519,GB -786667520,786669567,IT -786669568,786671615,RU -786671616,786673663,CZ -786673664,786675711,SK -786675712,786677759,KZ -786677760,786679807,NO -786679808,786681855,GB -786681856,786683903,RU -786683904,786685951,DE -786685952,786687999,CH -786688000,786690047,NL -786690048,786692095,PL -786692096,786694143,LB -786694144,786698239,RU -786698240,786702335,CZ -786702336,786706431,GB -786706432,786710527,NO -786710528,786714623,RU -786714624,786718719,PL -786718720,786726911,RU -786726912,786731007,FI -786731008,786735103,IL -786735104,786739199,GB -786739200,786743295,AZ -786743296,786747391,DE -786747392,786751487,SK -786751488,786755583,PL -786755584,786759679,IT -786759680,786771967,DE -786771968,786776063,UA -786776064,786780159,RU -786780160,786784255,IT -786784256,786788351,RU -786788352,786792447,CZ -786792448,786796543,RU -786796544,786800639,PL -786800640,786804735,US -786804736,786808831,RU -786808832,786812927,BG -786812928,786817023,RU -786817024,786821119,SK -786821120,786824703,HR -786824704,786825215,CN -786825216,786857983,SA -786857984,786868223,NO -786868224,786890751,SE -786890752,786892799,ES -786892800,786894847,GB -786894848,786896895,NL -786896896,786900991,IT -786900992,786903039,NL -786905088,786907135,PL -786907136,786909183,GB -786909184,786911231,CZ -786911232,786913279,NL -786913280,786915327,DE -786915328,786917375,SK -786917376,786919423,US -786919424,786919639,GB -786919640,786919655,IT -786919656,786919687,GB -786919688,786919695,IT -786919696,786920191,GB -786920192,786920199,IT -786920200,786920615,GB -786920616,786920623,IT -786920624,786920999,GB -786921000,786921007,IT -786921008,786921087,GB -786921088,786921095,IT -786921096,786921471,GB -786921472,786923519,ES -786923520,786925567,FR -786925568,786927615,DE -786927616,786929663,FR -786929664,786931711,PL -786931712,786933759,GB -786933760,786935807,RU -786935808,786937855,DE -786937856,786939903,GB -786939904,786941951,FI -786941952,786943999,CH -786944000,786946047,RU -786946048,786948095,FR -786948096,786950143,UA -786950144,786952191,DE -786952192,786952703,NE -786952704,786952959,US -786952960,786953215,NE -786953216,786954239,US -786954240,786956287,NL -786956288,786989055,RU -786989056,786991103,PL -786991104,786995199,IT -786995200,786997247,BG -786997248,786999295,RU -786999296,787001343,ES -787001344,787003391,CH -787003392,787005439,DE -787005440,787007487,GB -787007488,787009535,RU -787011584,787013631,RU -787013632,787015679,DE -787015680,787017727,UA -787017728,787019775,RU -787021824,787038207,BG -787038208,787038463,GB -787038464,787038719,IE -787038720,787038975,DE -787038976,787039231,FR -787039232,787039247,AR -787039248,787039263,PE -787039264,787039279,VE -787039280,787039295,GB -787039296,787039423,AT -787039424,787039551,NL -787039552,787039679,ES -787039680,787039807,BE -787039808,787039935,PT -787039936,787040255,GB -787040256,787040383,IT -787040384,787040511,DK -787040512,787054591,GB -787054592,787070975,IT -787070976,787087359,RU -787087360,787095551,TR -787095680,787095711,CH -787096576,787097855,CH -787098112,787098879,CH -787099392,787100671,CH -787101696,787102719,CH -787103744,787111935,HR -787111936,787116287,CZ -787116288,787116543,US -787116544,787120127,CZ -787120128,787128319,ES -787128320,787136511,CZ -787136512,787152895,IT -787152896,787154943,GB -787154944,787156991,TR -787156992,787159039,FR -787159040,787161087,DE -787161088,787163135,GB -787163136,787165183,NL -787165184,787167231,RU -787167232,787169279,CH -787169280,787171327,RU -787171328,787172863,KG -787172864,787173375,RU -787173376,787175423,KZ -787175424,787177471,SA -787177472,787179519,RS -787179520,787183615,DE -787183616,787185663,PL -787185664,787187711,GG -787187712,787189759,IT -787189760,787191807,CH -787191808,787192063,GB -787192064,787192319,FR -787192320,787192575,DE -787192576,787192831,SE -787192832,787193087,AE -787193088,787193343,FI -787193344,787193599,DE -787193600,787193855,IT -787193856,787195903,RU -787195904,787197951,GB -787197952,787199999,FR -787200000,787202047,RU -787202048,787206143,DE -787206144,787208191,BH -787208192,787210239,RU -787210240,787212287,GB -787212288,787214335,SE -787214336,787216383,DE -787216384,787218431,RU -787218432,787234815,GB -787234816,787236559,SE -787236560,787236575,NO -787236576,787251199,SE -787251200,787267583,RU -787267584,787283967,DE -787283968,787300351,RU -787300352,787316735,BG -787316736,787333119,GB -787333120,787349503,DE -787349504,787365887,BG -787365888,787382271,PL -787382272,787398655,GP -787398656,787415039,PL -787415040,787431423,BA -787431424,787447807,SE -787447808,787464191,PL -787464192,787480575,IS -787480576,787513343,SA -787513344,787546111,RS -787546112,787578879,RU -787578880,787582975,AM -787582976,787587071,RU -787587072,787611647,AM -787611648,787644415,RU -787644416,787677183,PL -787677184,787679231,GB -787679232,787681279,RU -787681280,787683327,IQ -787683328,787685375,NL -787685376,787687423,IT -787687424,787689471,NL -787689472,787691519,CZ -787693568,787695615,SK -787695616,787697663,RU -787697664,787701759,DE -787701760,787703807,NL -787703808,787705855,AT -787705856,787707903,RO -787707904,787709951,DE -787709952,787711487,IE -787711488,787711999,GB -787712000,787712255,MT -787712256,787712511,MA -787712512,787713023,DE -787713024,787713279,BE -787713280,787713535,SE -787713536,787713791,BG -787713792,787714047,GR -787714048,787714303,IM -787714304,787714559,SY -787714560,787714815,LB -787714816,787715071,QA -787715072,787715327,OM -787715328,787715583,YE -787715584,787715839,BH -787715840,787716095,GL -787716096,787718143,NL -787718144,787718911,RU -787718912,787719167,NL -787719168,787719679,RU -787719680,787719935,NL -787719936,787722239,RU -787722240,787722751,NL -787722752,787725311,RU -787725312,787728639,NL -787728640,787728895,RU -787728896,787729407,NL -787729408,787730431,US -787730432,787731199,SE -787731200,787731967,CA -787731968,787732479,LU -787732480,787732735,CH -787732736,787733247,BE -787733248,787733759,RU -787733760,787734015,AT -787734016,787734271,IE -787734272,787734527,RO -787734528,787736575,US -787736576,787737599,GB -787737600,787738367,DE -787738368,787739135,NL -787739136,787739903,CA -787739904,787740671,AU -787740672,787741183,BE -787741184,787741695,HK -787741696,787741951,RU -787741952,787742207,NL -787742208,787742719,RU -787742720,787747327,NL -787747328,787747583,IE -787747584,787749887,NL -787749888,787750143,US -787750144,787750159,BD -787750160,787750175,BT -787750176,787750191,BN -787750192,787750192,CN -787750193,787750207,NL -787750208,787750223,FJ -787750224,787750239,ID -787750240,787750255,LA -787750256,787750271,MO -787750272,787750287,MY -787750288,787750303,MV -787750304,787750319,MM -787750320,787750335,NP -787750336,787750351,PK -787750352,787750367,PG -787750368,787750383,LK -787750384,787750399,NL -787750400,787750655,US -787750656,787750911,NL -787750912,787755007,GB -787755008,787759103,NL -787759104,787767295,PS -787767296,787768319,IT -787768320,787771135,NL -787771136,787771391,IT -787771392,787772159,NL -787772160,787772415,FR -787772416,787773439,US -787773440,787775487,NL -787775488,787808255,DE -787808256,787841023,IR -787841024,787843071,RU -787843072,787845119,GR -787845120,787847167,CH -787847168,787849215,SE -787849216,787851263,TR -787851264,787853311,RU -787853312,787855359,DE -787855360,787857407,CH -787857408,787859455,PL -787859456,787861503,AT -787861504,787863551,IE -787863552,787865599,DE -787865600,787869695,FR -787869696,787873791,GB -787873792,787881745,SE -787881746,787881747,FR -787881748,787890175,SE -787890176,787890431,NL -787890432,787891247,SE -787891248,787891251,ES -787891252,787900415,SE -787900416,787900671,DE -787900672,787900927,SE -787900928,787901183,DK -787901184,787906559,SE -787906560,787939327,GR -787939328,787972095,GB -787972096,788004863,UA -788004864,788005375,GB -788005376,788006399,BE -788006400,788006911,IT -788006912,788007423,FR -788007424,788007935,DE -788007936,788008447,US -788008448,788008959,SG -788008960,788009471,IN -788009472,788009983,ES -788009984,788010495,HK -788010496,788011007,AU -788011008,788011519,CN -788011520,788012031,AR -788012032,788012543,CA -788012544,788013055,RU -788013056,788021247,IR -788021248,788029439,SI -788029440,788045823,GB -788045824,788054015,PL -788054016,788062207,JO -788062208,788070399,GB -788070400,788078591,RU -788078592,788086783,NL -788086784,788094975,BG -788094976,788095231,IR -788095232,788095487,DE -788095488,788103167,IR -788103168,788111359,HU -788111360,788119551,LT -788119552,788127743,GB -788127744,788135935,NO -788135936,788144127,UA -788144128,788160511,RU -788160512,788168703,UA -788168704,788176895,RU -788176896,788185087,PL -788185088,788193279,NO -788193280,788201471,GB -788201472,788209663,HU -788209664,788217855,LT -788217856,788226047,RU -788226048,788234239,CY -788234240,788242431,SA -788242432,788250623,IR -788250624,788258815,KG -788258816,788259071,IR -788259072,788259327,DE -788259328,788259583,IR -788259584,788261375,DE -788261376,788261631,GB -788261632,788262143,DE -788262144,788262399,IR -788262400,788265215,DE -788265216,788265727,ES -788265728,788265983,DE -788265984,788267007,ES -788267008,788271103,SE -788271104,788275199,DE -788275200,788279295,AL -788279296,788283391,BG -788283392,788291583,GB -788291584,788295679,TR -788295680,788299775,RU -788299776,788303871,DE -788303872,788307967,IT -788307968,788312063,RU -788312064,788316159,FR -788316160,788320255,NL -788320256,788324351,UA -788324352,788328447,CZ -788328448,788332543,RU -788332544,788336639,BG -788336640,788340735,DE -788340736,788344831,ES -788344832,788353023,DE -788353024,788357119,PS -788357120,788361215,CZ -788361216,788365311,DE -788365312,788369407,IQ -788369408,788373503,DE -788373504,788377599,BE -788377600,788381695,CH -788381696,788385791,SE -788385792,788389887,PL -788389888,788393983,ES -788393984,788398079,DE -788398080,788400127,SI -788400128,788402175,SE -788402176,788406271,RU -788406272,788410367,IT -788410368,788412415,TR -788412416,788414463,SI -788414464,788416511,CZ -788416512,788418559,PL -788418560,788422655,RU -788422656,788424703,FI -788424704,788426751,IT -788426752,788428799,GB -788428800,788430847,DE -788430848,788432895,BG -788432896,788434943,DE -788434944,788436991,SI -788436992,788439039,IT -788439040,788441087,RU -788441088,788443135,NL -788443136,788445183,IT -788445184,788451327,GB -788451328,788453375,FI -788453376,788455423,RU -788455424,788457471,FR -788457472,788459519,IT -788459520,788461567,RU -788461568,788463615,JE -788463616,788465663,GB -788465664,788467711,CZ -788467712,788469759,NO -788469760,788471807,NL -788471808,788473855,UA -788473856,788474111,DE -788474112,788475903,GB -788475904,788477951,FR -788477952,788479999,OM -788480000,788482047,UZ -788482048,788484095,GB -788484096,788486143,IT -788486144,788488191,NL -788488192,788490239,RU -788490240,788492287,NL -788492288,788494335,GB -788494336,788494591,US -788494592,788495103,CY -788495104,788495615,US -788495616,788495871,GB -788495872,788496383,CY -788496384,788498431,FR -788498432,788500479,RU -788500480,788502527,AL -788502528,788504575,IE -788504576,788506623,FR -788506624,788508671,CH -788508672,788509439,AT -788509440,788509711,FR -788509712,788509951,AT -788509952,788509983,FR -788509984,788510191,AT -788510192,788510207,FR -788510208,788510719,AT -788510720,788512320,ES -788512321,788512383,NO -788512384,788512767,ES -788512768,788514815,FI -788514816,788516863,FR -788516864,788518911,LT -788518912,788520959,IR -788520960,788523007,CZ -788523008,788525055,KZ -788525056,788527103,IT -788527104,788529151,GB -788529152,789053439,CA -789053440,789184511,IN -789184512,789250047,CA -789250048,789315583,IN -789315584,789512191,CA -789512192,789577727,IN -789577728,790102015,US -790102016,790429695,CA -790429696,790626303,IN -790626304,791937023,US -791937024,792002559,HK -792002560,792068095,IT -792068096,792199167,CA -792199168,792338431,US -792338432,792371199,ES -792371200,792387583,US -792387584,792723455,ES -792723456,793247743,DE -793247744,793313279,NZ -793313280,793378815,DE -793378816,793395199,JP -793395200,793411583,AU -793411584,793444351,SG -793444352,794329087,US -794329088,794361855,SG -794361856,794369288,HK -794369289,794369289,CN -794369290,794378239,HK -794378240,794390527,US -794390528,794391807,IN -794391808,794392575,ID -794392576,794392831,TH -794392832,794393087,ID -794393088,794427391,US -794427392,794460159,HK -794460160,794492927,US -794492928,794501119,JP -794501120,794509311,AU -794509312,794517503,DE -794517504,794525695,AE -794525696,794558463,HK -794558464,796917759,CN -796917760,797442047,CA -797442048,800522240,US -800522241,800522241,CA -800522242,803209215,US -803209216,803930111,CA -803930112,804716543,US -804716544,804782079,IN -804782080,804913151,CA -804913152,805208063,US -805208064,805224447,DE -805224448,805240831,US -805240832,805306367,CA -805306368,822083583,US -822083584,822084607,ID -822084608,822085631,BD -822085632,822087679,AU -822087680,822089727,JP -822089728,822090751,ID -822090752,822091775,NZ -822091776,822099967,BD -822099968,822116351,TH -822116352,822149119,MN -822149120,822214655,KR -822214656,822345727,AU -822345728,822607871,CN -822607872,822870015,KR -822870016,823132159,IN -823132160,824180735,KR -824180736,825229311,IN -825229312,825360383,TH -825360384,825361407,KR -825361408,825363455,ID -825363456,825364479,MY -825364480,825376767,KR -825376768,825393151,IN -825393152,825409535,KR -825409536,825419775,NZ -825419776,825420799,TH -825420800,825421823,MY -825421824,825425919,NZ -825425920,825753599,CN -825753600,826277887,KR -826277888,828375039,CN -828375040,829423615,JP -829423616,830210047,CN -830210048,830341119,MY -830341120,830406655,NP -830406656,830472191,AU -830472192,830474239,CN -830474240,830475263,SG -830475264,830476287,AU -830476288,830480383,JP -830480384,830488575,SG -830488576,830496767,HK -830496768,830498815,JP -830498816,830499839,GU -830499840,830500863,IN -830500864,830504959,TW -830504960,830513151,JP -830513152,830517247,IN -830517248,830521343,ID -830521344,830529535,KR -830529536,830537727,AU -830537728,830603263,JP -830603264,830734335,HK -830734336,830996479,JP -830996480,831258623,IN -831258624,831389695,CN -831389696,831512575,KR -831512576,831513599,AU -831513600,831514623,NZ -831514624,831514975,HK -831514976,831515007,AU -831515008,831515135,HK -831515136,831515143,AU -831515144,831515647,HK -831515648,831516671,AU -831516672,831518719,JP -831518720,831519743,AU -831519744,831520767,IN -831520768,831666800,PH -831666801,831666801,HK -831666802,832045055,PH -832045056,832307199,CN -832307200,832308223,KH -832308224,832311295,JP -832311296,832312319,AU -832312320,832313343,ID -832313344,832315391,AU -832315392,832319487,KH -832319488,832320511,NU -832320512,832321535,VN -832321536,832323583,ID -832323584,832348159,IN -832348160,832372735,JP -832372736,832438271,PH -832438272,832569343,TW -832569344,833617919,KR -833617920,835190783,AU -835190784,835715071,IN -835715072,835977215,CN -835977216,836042751,JP -836042752,836046847,HK -836046848,836048895,SG -836048896,836049919,HK -836049920,836050431,SG -836050432,836050943,HK -836050944,836059135,IN -836059136,836075519,VN -836075520,836501503,TW -836501504,836763647,CN -836763648,837025791,NZ -837025792,837287935,TH -837287936,837550079,CN -837550080,837566463,IN -837566464,837599231,KR -837599232,837603327,MY -837603328,837604351,VN -837604352,837605375,NP -837605376,837607423,ID -837607424,837611519,JP -837611520,837615615,AU -837615616,837681151,TH -837681152,837689343,JP -837689344,837697535,IN -837697536,837746687,KR -837746688,837763071,CN -837763072,837779455,JP -837779456,837795839,KR -837795840,837812223,CN -837812224,838074367,JP -838074368,838139903,NP -838139904,838205439,SG -838205440,838238207,KR -838238208,838262783,VN -838262784,838270975,CN -838270976,838336511,KR -838336512,838467583,IN -838467584,838729727,JP -838729728,838795263,KR -838795264,838860799,AU -838860800,838991871,US -838991872,839008511,DE -839008512,839008767,US -839008768,839016959,DE -839016960,839017087,US -839017088,839041023,DE -839041024,839042047,US -839042048,839046271,DE -839046272,839046303,US -839046304,839081471,DE -839081472,839081727,US -839081728,839116543,DE -839116544,839116799,US -839116800,839122943,DE -839122944,839340031,US -839340032,839341055,ES -839341056,839343103,DE -839343104,839344127,NL -839344128,839348223,US -839348224,839348479,DE -839348480,839348735,AT -839348736,839348991,GB -839348992,839349247,AT -839349248,839349759,DE -839349760,839350271,US -839350272,839351295,NL -839351296,839352063,DE -839352064,839357439,NL -839357440,839358463,FR -839358464,839359335,GB -839359336,839359343,US -839359344,839359351,GB -839359352,839359359,IT -839359360,839359367,IE -839359368,839359375,FR -839359376,839359383,TH -839359384,839359487,GB -839359488,839360511,DE -839360512,839366655,NL -839366656,839366911,AT -839366912,839367167,CZ -839367168,839368703,NL -839368704,839385087,CZ -839385088,840269823,US -840269824,840273919,CA -840273920,840278015,US -840278016,840282111,CA -840282112,840294399,US -840294400,840298495,CA -840298496,840836121,US -840836122,840836124,BZ -840836125,840865791,US -840865792,840866047,CA -840866048,840953855,US -840953856,840954367,JP -840954368,840956927,US -840956928,840957951,JP -840957952,843055103,US -843055104,843644927,CA -843644928,844462879,US -844462880,844462880,CL -844462881,844890111,US -844890112,844988415,CA -844988416,845222689,US -845222690,845222690,HK -845222691,845283327,US -845283328,845545471,CA -845545472,846442495,US -846442496,846446591,CA -846446592,846561279,US -846561280,846594047,CA -846594048,846631253,US -846631254,846631254,CA -846631255,846644755,US -846644756,846644756,PT -846644757,846646527,US -846646528,846646783,CN -846646784,846648063,US -846648064,846648575,CN -846648576,846649343,US -846649344,846649599,CN -846649600,846650367,US -846650368,846650879,CN -846650880,846659583,US -846659584,846725119,SA -846725120,853622019,US -853622020,853622020,DE -853622021,853622096,US -853622097,853622098,GB -853622099,853622099,US -853622100,853622100,FR -853622101,853622101,BG -853622102,853622102,ES -853622103,853622103,IT -853622104,853622104,US -853622105,853622105,SE -853622106,853622109,US -853622110,853622110,DE -853622111,855638015,US -855638016,855900159,GB -855900160,856031231,DE -856031232,856162303,GB -856162304,856227839,DE -856227840,856621055,GB -856621056,856637439,NL -856637440,856686591,FR -856686592,857997311,GB -857997312,858062847,SA -858062848,858128383,IE -858128384,858193919,GB -858193920,858259455,SA -858259456,859059509,GB -859059510,859059510,FR -859059511,860905167,GB -860905168,860905171,FR -860905172,864550911,GB -864550912,864649215,NL -864649216,864919551,GB -864919552,864927743,US -864927744,865009663,GB -865009664,865042431,US -865042432,865075199,GB -865075200,865140735,NL -865140736,865173503,GB -865173504,865206271,NL -865206272,866844671,GB -866844672,866910207,IE -866910208,867041279,GB -867041280,867172351,NO -867172352,867368959,GB -867368960,867401727,IT -867401728,869466111,GB -869466112,869531647,SA -869531648,869924863,GB -869924864,869990399,SA -869990400,870252543,GB -870252544,870318079,SA -870318080,871038975,GB -871038976,871104511,SA -871104512,872153087,GB -872153088,872284159,SA -872284160,872285339,FR -872285340,872285343,PL -872285344,872285375,FR -872285376,872285439,DE -872285440,872285567,ES -872285568,872286271,FR -872286272,872286335,ES -872286336,872286871,FR -872286872,872286875,CZ -872286876,872287743,FR -872287744,872287807,BE -872287808,872288159,FR -872288160,872288191,ES -872288192,872288255,FR -872288256,872288319,ES -872288320,872288383,DE -872288384,872288511,GB -872288512,872288871,FR -872288872,872288875,DE -872288876,872289071,FR -872289072,872289087,PL -872289088,872289247,FR -872289248,872289279,IT -872289280,872290111,FR -872290112,872290143,ES -872290144,872290415,FR -872290416,872290431,BE -872290432,872290463,FR -872290464,872290495,BE -872290496,872290523,FR -872290524,872290527,PL -872290528,872290671,FR -872290672,872290687,CZ -872290688,872290751,FR -872290752,872290815,DE -872290816,872291151,FR -872291152,872291167,FI -872291168,872291519,FR -872291520,872291583,IE -872291584,872291871,FR -872291872,872291903,ES -872291904,872292071,FR -872292072,872292079,BE -872292080,872292223,FR -872292224,872292351,GB -872292352,872296479,FR -872296480,872296511,IT -872296512,872296575,NL -872296576,872297039,FR -872297040,872297055,ES -872297056,872297087,CZ -872297088,872297215,FR -872297216,872297231,GB -872297232,872297823,FR -872297824,872297855,ES -872297856,872298383,FR -872298384,872298391,LT -872298392,872298463,FR -872298464,872298495,DE -872298496,872299103,FR -872299104,872299135,PT -872299136,872299239,FR -872299240,872299247,ES -872299248,872299839,FR -872299840,872299903,DE -872299904,872299967,FR -872299968,872299983,ES -872299984,872300031,FR -872300032,872300063,ES -872300064,872300127,FR -872300128,872300159,NL -872300160,872300543,FR -872300544,872300559,GB -872300560,872300639,FR -872300640,872300671,PT -872300672,872300735,FR -872300736,872300751,PL -872300752,872300767,FR -872300768,872300799,NL -872300800,872301087,FR -872301088,872301095,ES -872301096,872301503,FR -872301504,872301567,PL -872301568,872302687,FR -872302688,872302719,NL -872302720,872302783,FR -872302784,872302847,GB -872302848,872303007,FR -872303008,872303039,IT -872303040,872303103,FR -872303104,872303359,GB -872303360,872303679,FR -872303680,872303743,IT -872303744,872304063,FR -872304064,872304079,GB -872304080,872304239,FR -872304240,872304255,IT -872304256,872304311,FR -872304312,872304319,BE -872304320,872304383,IE -872304384,872304395,FR -872304396,872304399,CZ -872304400,872304447,FR -872304448,872304511,ES -872304512,872304831,FR -872304832,872304895,ES -872304896,872305655,FR -872305656,872305663,GB -872305664,872306183,FR -872306184,872306191,US -872306192,872306223,FR -872306224,872306239,NL -872306240,872306367,FR -872306368,872306399,GB -872306400,872307263,FR -872307264,872307327,ES -872307328,872307743,FR -872307744,872307759,IT -872307760,872308351,FR -872308352,872308371,GB -872308372,872308372,US -872308373,872308455,GB -872308456,872308456,FR -872308457,872308479,GB -872308480,872308703,FR -872308704,872308735,ES -872308736,872309883,FR -872309884,872309884,PT -872309885,872310799,FR -872310800,872310815,ES -872310816,872310911,FR -872310912,872311039,DE -872311040,872311167,IE -872311168,872311231,FR -872311232,872311295,BE -872311296,872311903,FR -872311904,872311935,DE -872311936,872311983,FR -872311984,872311999,FI -872312000,872312063,NL -872312064,872312159,FR -872312160,872312191,CZ -872312192,872312255,ES -872312256,872312383,FR -872312384,872312447,IT -872312448,872312511,FR -872312512,872312575,IE -872312576,872312703,FR -872312704,872312767,ES -872312768,872316797,FR -872316798,872316798,PT -872316799,872321183,FR -872321184,872321215,FI -872321216,872321279,ES -872321280,872321379,FR -872321380,872321383,GB -872321384,872321599,FR -872321600,872321663,IT -872321664,872321711,FR -872321712,872321727,CZ -872321728,872322623,FR -872322624,872322655,GB -872322656,872322943,FR -872322944,872323071,GB -872323072,872323135,FR -872323136,872323199,ES -872323200,872323327,GB -872323328,872323407,FR -872323408,872323423,FI -872323424,872323471,FR -872323472,872323487,ES -872323488,872323551,FR -872323552,872323583,GB -872323584,872323647,FR -872323648,872323711,NL -872323712,872323775,FR -872323776,872323839,ES -872323840,872323936,FR -872323937,872323937,DE -872323938,872324239,FR -872324240,872324255,LT -872324256,872324719,FR -872324720,872324723,PL -872324724,872324831,FR -872324832,872324863,CZ -872324864,872324927,FR -872324928,872324991,IT -872324992,872325567,FR -872325568,872325583,FI -872325584,872325707,FR -872325708,872325711,ES -872325712,872325823,FR -872325824,872325887,DE -872325888,872326151,FR -872326152,872326155,CZ -872326156,872326175,FR -872326176,872326207,PT -872326208,872326271,FR -872326272,872326275,FI -872326276,872326303,FR -872326304,872326311,LT -872326312,872326399,FR -872326400,872326431,CZ -872326432,872326495,FR -872326496,872326511,BE -872326512,872327615,FR -872327616,872327679,ES -872327680,872327807,FR -872327808,872327811,FI -872327812,872327815,IE -872327816,872327831,FR -872327832,872327835,IT -872327836,872327887,FR -872327888,872327903,ES -872327904,872328351,FR -872328352,872328383,IT -872328384,872328447,PL -872328448,872328575,FR -872328576,872328591,DE -872328592,872328671,FR -872328672,872328703,NL -872328704,872329151,FR -872329152,872329215,DE -872329216,872329263,FR -872329264,872329271,ES -872329272,872329407,FR -872329408,872329471,ES -872329472,872329599,GB -872329600,872329951,FR -872329952,872329983,GB -872329984,872330279,FR -872330280,872330283,GB -872330284,872330527,FR -872330528,872330559,CZ -872330560,872331271,FR -872331272,872331275,PL -872331276,872332287,FR -872332288,872332295,PT -872332296,872332383,FR -872332384,872332415,DE -872332416,872332607,FR -872332608,872332671,BE -872332672,872332735,FR -872332736,872332799,ES -872332800,872332831,IE -872332832,872338880,FR -872338881,872338881,BE -872338882,872341887,FR -872341888,872341903,ES -872341904,872342335,FR -872342336,872342367,ES -872342368,872342623,FR -872342624,872342655,DE -872342656,872343191,FR -872343192,872343199,ES -872343200,872343351,FR -872343352,872343355,GB -872343356,872344423,FR -872344424,872344431,ES -872344432,872344603,FR -872344604,872344607,GB -872344608,872344639,IT -872344640,872344895,FR -872344896,872344959,NL -872344960,872345151,FR -872345152,872345215,CZ -872345216,872345343,GB -872345344,872346095,FR -872346096,872346111,DE -872346112,872346223,FR -872346224,872346239,ES -872346240,872346319,FR -872346320,872346335,CZ -872346336,872346351,FR -872346352,872346367,FI -872346368,872346799,FR -872346800,872346815,DE -872346816,872346879,ES -872346880,872346943,FR -872346944,872347007,DE -872347008,872347039,FR -872347040,872347055,GB -872347056,872347063,FR -872347064,872347067,PT -872347068,872347263,FR -872347264,872347271,CZ -872347272,872347511,FR -872347512,872347519,ES -872347520,872348095,FR -872348096,872348159,IT -872348160,872348799,FR -872348800,872348863,BE -872348864,872348959,FR -872348960,872348991,GB -872348992,872349039,FR -872349040,872349055,IT -872349056,872349983,FR -872349984,872350015,GB -872350016,872350271,FR -872350272,872350335,BE -872350336,872350351,NL -872350352,872350399,FR -872350400,872350463,NL -872350464,872350815,FR -872350816,872350847,IT -872350848,872351327,FR -872351328,872351359,ES -872351360,872351575,FR -872351576,872351583,FI -872351584,872351679,FR -872351680,872351743,DE -872351744,872351879,FR -872351880,872351883,PL -872351884,872352443,FR -872352444,872352447,DE -872352448,872353119,FR -872353120,872353151,PT -872353152,872353343,FR -872353344,872353407,IE -872353408,872353471,FR -872353472,872353535,ES -872353536,872353663,FR -872353664,872353791,GB -872353792,872354079,FR -872354080,872354111,CZ -872354112,872354263,FR -872354264,872354271,ES -872354272,872354367,FR -872354368,872354399,PT -872354400,872354751,FR -872354752,872354815,BE -872354816,872355071,FR -872355072,872355103,ES -872355104,872355679,FR -872355680,872355711,PT -872355712,872356375,FR -872356376,872356383,FI -872356384,872356399,FR -872356400,872356415,ES -872356416,872356479,DE -872356480,872356671,FR -872356672,872356735,IT -872356736,872357423,FR -872357424,872357439,PT -872357440,872357503,ES -872357504,872357671,FR -872357672,872357679,IT -872357680,872357695,FR -872357696,872357759,NL -872357760,872363071,FR -872363072,872363103,ES -872363104,872363135,FR -872363136,872363199,PL -872363200,872363423,FR -872363424,872363455,CZ -872363456,872363871,FR -872363872,872363903,PT -872363904,872364671,FR -872364672,872364703,LT -872364704,872364847,FR -872364848,872364855,DE -872364856,872364863,FR -872364864,872364898,NL -872364899,872364899,FR -872364900,872364927,NL -872364928,872365019,FR -872365020,872365023,CZ -872365024,872365311,FR -872365312,872365319,PT -872365320,872374459,FR -872374460,872374463,GB -872374464,872374543,FR -872374544,872374559,LT -872374560,872374591,FR -872374592,872374655,ES -872374656,872375007,FR -872375008,872375039,PT -872375040,872375295,FR -872375296,872375423,NL -872375424,872375807,FR -872375808,872375871,GB -872375872,872376191,FR -872376192,872376319,GB -872376320,872376687,FR -872376688,872376691,CZ -872376692,872376895,FR -872376896,872376959,BE -872376960,872377279,FR -872377280,872377343,ES -872377344,872377919,FR -872377920,872377983,BE -872377984,872378047,IE -872378048,872378207,FR -872378208,872378239,IT -872378240,872378447,FR -872378448,872378463,CZ -872378464,872379103,FR -872379104,872379135,PL -872379136,872379199,FR -872379200,872379263,DE -872379264,872379375,FR -872379376,872379391,GB -872379392,872379967,FR -872379968,872380031,NL -872380032,872380143,FR -872380144,872380147,DE -872380148,872380247,FR -872380248,872380248,ES -872380249,872380607,FR -872380608,872380671,ES -872380672,872380783,FR -872380784,872380799,IE -872380800,872381063,FR -872381064,872381071,CZ -872381072,872381151,FR -872381152,872381183,CZ -872381184,872381343,FR -872381344,872381375,PL -872381376,872382143,FR -872382144,872382207,ES -872382208,872382335,FR -872382336,872382463,GB -872382464,872382655,FR -872382656,872382719,DE -872382720,872382779,FR -872382780,872382783,ES -872382784,872383327,FR -872383328,872383359,PL -872383360,872383519,FR -872383520,872383551,ES -872383552,872383583,GB -872383584,872383743,FR -872383744,872383759,DE -872383760,872383807,FR -872383808,872383871,IT -872383872,872383967,FR -872383968,872383999,CZ -872384000,872384003,PL -872384004,872384095,FR -872384096,872384127,ES -872384128,872384287,FR -872384288,872384319,FI -872384320,872384383,ES -872384384,872385103,FR -872385104,872385119,PL -872385120,872385151,FR -872385152,872385167,LT -872385168,872385183,FR -872385184,872385215,DE -872385216,872385279,BE -872385280,872385535,FR -872385536,872385543,PT -872385544,872385615,FR -872385616,872385631,NL -872385632,872385671,FR -872385672,872385679,PL -872385680,872385695,FR -872385696,872385727,PT -872385728,872386175,FR -872386176,872386303,GB -872386304,872386335,FR -872386336,872386367,FI -872386368,872386399,FR -872386400,872386431,IT -872386432,872386591,FR -872386592,872386607,LT -872386608,872386623,FR -872386624,872386687,IT -872386688,872386719,FR -872386720,872386751,PL -872386752,872387007,FR -872387008,872387071,IE -872387072,872387263,FR -872387264,872387279,PT -872387280,872387295,PL -872387296,872387775,FR -872387776,872387839,IT -872387840,872388191,FR -872388192,872388223,DE -872388224,872388255,FR -872388256,872388287,CZ -872388288,872388351,ES -872388352,872388407,FR -872388408,872388415,PT -872388416,872388447,ES -872388448,872388511,FR -872388512,872388543,PL -872388544,872388591,FR -872388592,872388607,ES -872388608,872388671,DE -872388672,872388799,FR -872388800,872388863,DE -872388864,872389247,FR -872389248,872389311,DE -872389312,872389535,FR -872389536,872389567,GB -872389568,872389983,FR -872389984,872390015,NL -872390016,872390495,FR -872390496,872390527,PL -872390528,872390591,FR -872390592,872390655,ES -872390656,872391230,FR -872391231,872391231,BE -872391232,872393204,FR -872393205,872393205,BE -872393206,872403023,FR -872403024,872403039,LT -872403040,872403071,NL -872403072,872403159,FR -872403160,872403167,PT -872403168,872403183,FR -872403184,872403199,PL -872403200,872403567,FR -872403568,872403583,LT -872403584,872403599,FR -872403600,872403615,PT -872403616,872403647,PL -872403648,872403711,IT -872403712,872403743,FR -872403744,872403775,PT -872403776,872403839,DE -872403840,872404071,FR -872404072,872404079,PL -872404080,872404511,FR -872404512,872404543,IT -872404544,872404639,FR -872404640,872404671,PL -872404672,872405567,FR -872405568,872405631,BE -872405632,872405791,FR -872405792,872405823,FI -872405824,872405887,NL -872405888,872405935,FR -872405936,872405951,CZ -872405952,872406047,FR -872406048,872406079,PL -872406080,872406207,FR -872406208,872406271,ES -872406272,872406431,FR -872406432,872406439,ES -872406440,872406591,FR -872406592,872406655,DE -872406656,872406815,FR -872406816,872406847,FI -872406848,872406879,FR -872406880,872406911,ES -872406912,872407167,FR -872407168,872407171,FI -872407172,872407231,FR -872407232,872407295,IT -872407296,872408255,FR -872408256,872408319,NL -872408320,872408383,FR -872408384,872408447,IE -872408448,872408591,FR -872408592,872408607,LT -872408608,872408839,FR -872408840,872408847,ES -872408848,872409151,FR -872409152,872409215,DE -872409216,872409343,GB -872409344,872409631,FR -872409632,872409663,IT -872409664,872409679,FR -872409680,872409683,ES -872409684,872410175,FR -872410176,872410239,DE -872410240,872410759,FR -872410760,872410767,IT -872410768,872410847,FR -872410848,872410879,IT -872410880,872415231,FR -872415232,873463807,US -873463808,873646466,IE -873646467,873646467,US -873646468,873664545,IE -873664546,873664546,US -873664547,873725951,IE -873725952,874250239,US -874250240,874381311,DE -874381312,874512383,IE -874512384,875446271,US -875446272,875454463,FR -875454464,875473919,US -875473920,875474943,BR -875474944,875495423,US -875495424,875560959,FR -875560960,875823103,IE -875823104,876085247,US -876085248,876150783,GB -876150784,876347391,DE -876347392,876412927,CA -876412928,876478463,US -876478464,876740607,AU -876740608,876806143,IN -876806144,876871679,BR -876871680,877002751,JP -877002752,877264895,US -877264896,877330431,SG -877330432,877395967,US -877395968,877527039,SG -877527040,877658111,KR -877658112,877920255,CN -877920256,878444543,US -878444544,878448639,KR -878448640,878454527,US -878454528,878454783,BR -878454784,878456831,IE -878456832,878457855,US -878457856,878458879,AU -878458880,878459903,SG -878459904,878460927,JP -878460928,878461951,BR -878461952,878462975,DE -878462976,878463999,BR -878464000,878465023,US -878465024,878466047,JP -878466048,878467071,CA -878467072,878468095,GB -878468096,878508031,US -878508032,878509055,IN -878509056,878510079,US -878510080,878510335,IE -878510336,878510591,US -878510592,878510847,IE -878510848,878511359,US -878511360,878511615,CA -878511616,878512127,US -878512128,878513151,SG -878513152,878514175,US -878514176,878514431,IE -878514432,878576895,US -878576896,878577151,IE -878577152,878577407,KR -878577408,878577663,BR -878577664,878577919,JP -878577920,878578431,US -878578432,878578687,SG -878578688,878578943,US -878578944,878579199,AU -878579200,878579455,CA -878579456,878579711,GB -878579712,878579967,FR -878579968,878580223,DE -878580224,878580735,US -878580736,878580991,IN -878580992,878581759,US -878581760,878582783,IE -878582784,878583807,US -878583808,878591999,GB -878592000,878593023,CA -878593024,878593279,US -878593280,878593535,DE -878593536,878596095,US -878596096,878604287,CA -878604288,878605311,GB -878605312,878625791,US -878625792,878626047,IE -878626048,878626319,US -878626320,878626335,BR -878626336,878626351,US -878626352,878626367,DE -878626368,878626383,KR -878626384,878626399,IN -878626400,878626415,SG -878626416,878626431,AU -878626432,878626447,CA -878626448,878626463,GB -878626464,878626815,US -878626816,878627071,JP -878627072,878627839,US -878627840,878628351,DE -878628352,878628863,BR -878628864,878630911,US -878630912,878632959,IE -878632960,878639119,US -878639120,878639135,IE -878639136,878639151,SG -878639152,878639167,BR -878639168,878639183,AU -878639184,878639199,JP -878639200,878639215,US -878639216,878639231,DE -878639232,878639247,US -878639248,878639263,IN -878639264,878639279,US -878639280,878639295,KR -878639296,878639311,GB -878639312,878639327,CA -878639328,878639359,US -878639360,878639391,CN -878639392,878639407,FR -878639408,878648831,US -878648832,878649343,JP -878649344,878649855,US -878649856,878650111,JP -878650112,878650367,SG -878650368,878651391,AU -878651392,878655487,US -878655488,878656511,JP -878656512,878657023,IE -878657024,878657535,US -878657536,878666751,IN -878666752,878667775,US -878667776,878668799,IE -878668800,878669567,US -878669568,878669823,KR -878669824,878673919,IE -878673920,878675967,AU -878675968,878676735,BR -878676736,878678271,US -878678272,878679039,CA -878679040,878679807,GB -878679808,878680575,US -878680576,878681343,FR -878681344,878682879,US -878682880,878683647,BR -878683648,878690303,US -878690304,878694399,KR -878694400,878695423,US -878695424,878696447,SG -878696448,878702591,US -878702592,878702847,BR -878702848,878703103,AU -878703104,878703359,SG -878703360,878703615,JP -878703616,878703871,IE -878703872,878704639,US -878704640,878704895,DE -878704896,878705151,IN -878705152,878705407,CA -878705408,878705663,US -878705664,878705919,KR -878705920,878706175,GB -878706176,878706431,FR -878706432,878706447,BR -878706448,878706463,AU -878706464,878706479,SG -878706480,878706495,JP -878706496,878706511,IE -878706512,878706559,US -878706560,878706575,DE -878706576,878706591,CN -878706592,878804991,US -878804992,878805247,AT -878805248,878837759,US -878837760,878837775,AU -878837776,878952447,US -878952448,878952463,BR -878952464,879499263,US -879499264,879501311,NL -879501312,879502335,HK -879502336,879503359,BR -879503360,879503871,AU -879503872,879504383,CA -879504384,879504895,IN -879504896,879505407,JP -879505408,879505919,KR -879505920,879506431,GB -879506432,879506943,FR -879506944,879549951,US -879549952,879550463,FR -879550464,879550975,GB -879550976,879551487,KR -879551488,879551999,JP -879552000,879552511,IN -879552512,879553023,CA -879553024,879553535,AU -879553536,879554559,SG -879554560,879556607,IE -879556608,879565823,US -879565824,879569919,GB -879569920,879571967,KR -879571968,879572991,JP -879572992,879576063,IN -879576064,879578111,FR -879578112,879579135,IE -879579136,879580159,FI -879580160,879581183,AT -879581184,879582207,NL -879582208,879584255,CA -879584256,879585279,US -879585280,879587327,BR -879587328,879589375,AU -879589376,879590399,HK -879590400,879591423,SG -879591424,879592447,MY -879592448,879593471,JP -879593472,879757055,US -879757056,879757311,CA -879757312,879763583,US -879763584,879763711,CA -879763712,879772543,US -879772544,879772671,CA -879772672,879788031,US -879788032,879788159,NL -879788160,879788287,IE -879788288,879788543,GB -879788544,879788671,NL -879788672,879788799,IE -879788800,879788927,NL -879788928,879789183,IE -879789184,879789439,NL -879789440,879796223,US -879796224,879796479,GB -879796480,879796735,NL -879796736,879796991,IE -879796992,879804415,US -879804416,879804479,NL -879804480,879804543,IE -879804544,879804671,GB -879804672,879804735,NL -879804736,879804799,IE -879804800,879804863,NL -879804864,879804991,IE -879804992,879805119,NL -879805120,879808511,US -879808512,879808639,GB -879808640,879808767,NL -879808768,879808895,IE -879808896,879820799,US -879820800,879820927,KR -879820928,879821055,HK -879821056,879821311,SG -879821312,879821439,KR -879821440,879821567,HK -879821568,879821695,SG -879821696,879821823,KR -879821824,879822079,JP -879822080,879822335,AU -879822336,879822591,IN -879822592,879822623,HK -879822624,879822655,SG -879822656,879822719,US -879822720,879822847,HK -879822848,879822975,SG -879822976,879829119,US -879829120,879829247,SG -879829248,879829375,JP -879829376,879829503,HK -879829504,879829759,US -879829760,879829887,AU -879829888,879830015,IN -879830016,879830271,KR -879830272,879837183,US -879837184,879837247,KR -879837248,879837311,HK -879837312,879837439,SG -879837440,879837503,KR -879837504,879837567,HK -879837568,879837631,SG -879837632,879837695,KR -879837696,879837823,JP -879837824,879837951,AU -879837952,879838079,IN -879838080,879838111,HK -879838112,879838143,SG -879838144,879841343,US -879841344,879841407,SG -879841408,879841471,JP -879841472,879841535,HK -879841536,879841663,US -879841664,879841727,AU -879841728,879841791,IN -879841792,879841919,KR -879841920,879886335,US -879886336,879888383,HK -879888384,879890431,SG -879890432,879892479,AU -879892480,879894527,IN -879894528,879896575,JP -879896576,879897599,IN -879897600,879899647,US -879899648,879900159,HK -879900160,879900671,US -879900672,879901183,SG -879901184,879902719,US -879902720,879905791,NL -879905792,879906815,IE -879906816,879910911,GB -879910912,879912959,IE -879912960,879916031,US -879916032,879917055,NL -879917056,879918079,IE -879918080,879927295,US -879927296,879929343,CA -879929344,879951871,US -879951872,879954943,NL -879954944,879955967,US -879955968,879959039,IE -879959040,879960063,US -879960064,879961599,SG -879961600,879962111,US -879962112,879963647,HK -879963648,880216831,US -880216832,880217087,CA -880217088,880261119,US -880261120,880262143,SG -880262144,880263167,DE -880263168,880264191,IE -880264192,880266495,US -880266496,880266751,SG -880266752,880267775,US -880267776,880268287,AU -880268288,880269311,US -880269312,880271359,JP -880271360,880275455,US -880275456,880277503,IE -880277504,880293356,US -880293357,880293357,CL -880293358,880543743,US -880543744,880545791,CA -880545792,880553983,US -880553984,880556031,CA -880556032,880557567,US -880557568,880557823,CA -880557824,880558079,US -880558080,880574463,CA -880574464,880807935,US -880807936,880808191,CA -880808192,880861183,US -880861184,880869375,HK -880869376,880872191,US -880872192,880872447,CA -880872448,880874751,US -880874752,880875007,CA -880875008,880876543,US -880876544,880877567,CA -880877568,880878079,US -880878080,880878591,CA -880878592,880881663,US -880881664,880885759,PR -880885760,880934911,US -880934912,881065983,SG -881065984,881332223,US -881332224,881332735,IN -881332736,881333759,GB -881333760,881334271,CA -881334272,881334527,IN -881334528,881334783,AU -881334784,881335039,SG -881335040,881335295,US -881335296,881335551,FR -881335552,881336319,US -881336320,881344511,IN -881344512,881360895,US -881360896,881377279,FR -881377280,881410047,NL -881410048,881459199,US -881459200,881475583,CA -881475584,881491967,US -881491968,881524735,IE -881524736,881557503,CA -881557504,881573887,HK -881573888,881590271,SG -881590272,881639423,IN -881639424,881655807,JP -881655808,881672191,KR -881672192,881737727,US -881737728,881754111,IE -881754112,881770495,GB -881770496,881803263,NL -881803264,881819647,US -881819648,881836031,FR -881836032,881836543,US -881836544,881836799,NL -881836800,881837055,IE -881837056,881837311,SG -881837312,881840127,US -881840128,881840383,NL -881840384,881840639,IE -881840640,881840895,SG -881840896,881841919,US -881841920,881842687,FR -881842688,881859327,US -881859328,881859583,CA -881859584,881868799,US -881868800,881876991,IT -881876992,882016255,US -882016256,882049023,IE -882049024,882065407,AU -882065408,882073599,JP -882073600,882081791,KR -882081792,882130943,US -882130944,882147327,SG -882147328,882163711,US -882163712,882180095,NL -882180096,882196479,US -882196480,882212863,NL -882212864,882327551,US -882327552,882343935,GB -882343936,882573311,US -882573312,882581503,CA -882581504,882589695,US -882589696,882597887,IE -882597888,882606079,JP -882606080,882638847,IE -882638848,882647039,CA -882647040,882655231,JP -882655232,882679807,US -882679808,882687999,AU -882688000,882704383,IE -882704384,882720767,US -882720768,882769919,NL -882769920,882802687,IE -882802688,882810879,AU -882810880,882851839,US -882851840,882851942,IN -882851943,882851943,US -882851944,882860031,IN -882860032,883097599,US -883097600,883163135,SG -883163136,883228671,IE -883228672,883294207,US -883294208,883359743,NL -883359744,883490815,US -883490816,883556351,IE -883556352,883687423,US -883687424,883752959,IN -883752960,883818495,US -883818496,883884031,NL -883884032,883916799,HK -883916800,883933183,JP -883933184,884080639,US -884080640,884113407,NL -884113408,884146175,IE -884146176,884441087,US -884441088,884457471,IN -884457472,884473855,US -884473856,884506623,HK -884506624,884572159,US -884572160,884588543,JP -884588544,884670463,US -884670464,884719615,SG -884719616,884735999,AU -884736000,884850687,US -884850688,884867071,AU -884867072,884998143,US -884998144,885129215,JP -885129216,885260287,US -885260288,885522431,JP -885522432,886046719,US -886046720,886571007,IE -886571008,886702079,US -886702080,886734847,IE -886734848,886767615,US -886767616,886772735,JP -886772736,886775807,US -886775808,886778879,SG -886778880,886779903,DE -886779904,886781951,US -886781952,886783487,KR -886783488,886785023,IN -886785024,886786047,JP -886786048,886787071,DE -886787072,886788095,SG -886788096,886833151,US -886833152,886964223,SG -886964224,887078911,US -887078912,887083007,NL -887083008,887085055,BR -887085056,887357439,US -887357440,887390207,CA -887390208,887439359,US -887439360,887455743,CA -887455744,887488511,HK -887488512,887521279,SG -887521280,887554047,US -887554048,887619583,KR -887619584,887652351,NL -887652352,887654399,CA -887654400,887656447,AU -887656448,887656959,KR -887656960,887657215,US -887657216,887657471,NL -887657472,887657727,IE -887657728,887658751,US -887658752,887659007,HK -887659008,887659263,AU -887659264,887659519,JP -887659520,887660031,US -887660032,887660287,JP -887660288,887685119,US -887685120,887701503,CA -887701504,887717887,US -887717888,887750655,NL -887750656,887816191,US -887816192,887832575,CA -887832576,887881727,US -887881728,887914495,IE -887914496,887947263,NL -887947264,887963647,CA -887963648,887980031,SG -887980032,887996415,US -887996416,888012799,AU -888012800,888111103,US -888111104,888111359,HK -888111360,888111615,SG -888111616,888112639,AU -888112640,888112959,FR -888112960,888113151,IN -888113152,888114175,IE -888114176,888115199,NL -888115200,888116223,JP -888116224,888116255,KR -888116256,888116287,US -888116288,888116351,CA -888116352,888120447,US -888120448,888120511,CA -888120512,888120735,US -888120736,888120767,KR -888120768,888126207,US -888126208,888126335,GB -888126336,888126719,IN -888126720,888127103,CA -888127104,888127231,KR -888127232,888127999,US -888128000,888128255,FR -888128256,888128511,US -888128512,888128767,FR -888128768,888129023,SG -888129024,888130047,US -888130048,888130303,IN -888130304,888132607,US -888132608,888133119,NL -888133120,888274943,US -888274944,888291327,CA -888291328,888348671,US -888348672,888356863,JP -888356864,888373247,AU -888373248,888475647,US -888475648,888477695,AU -888477696,888478719,US -888478720,888480767,CA -888480768,888481791,JP -888481792,888482815,IE -888482816,888483839,US -888483840,888484863,NL -888484864,888485887,US -888485888,888486911,HK -888486912,888487935,US -888487936,888488959,GB -888488960,888491007,US -888491008,888492031,IN -888492032,888493055,SG -888493056,888494079,IN -888494080,888495103,IE -888495104,888496127,JP -888496128,888497151,IN -888497152,888498175,KR -888498176,888500223,US -888500224,888501247,KR -888501248,888503295,FR -888503296,888504319,NL -888504320,888569855,US -888569856,888573951,HK -888573952,888578047,US -888578048,888586239,JP -888586240,888750079,US -888750080,888758271,IN -888758272,889016319,US -889016320,889020415,SG -889020416,889028607,JP -889028608,889036799,US -889036800,889039871,IN -889039872,889041919,JP -889041920,889042943,NL -889042944,889043967,IE -889043968,889046015,KR -889046016,889048063,CA -889048064,889050111,AU -889050112,889051135,SG -889051136,889052159,HK -889052160,889135103,US -889135104,889143295,AU -889143296,889192447,US -889192448,905969663,DE -905969664,908328959,US -908328960,908329215,FR -908329216,908329247,PT -908329248,908329279,FR -908329280,908329311,PT -908329312,908329755,FR -908329756,908329759,DE -908329760,908329855,FR -908329856,908329983,IT -908329984,908330111,ES -908330112,908330239,NL -908330240,908330367,DE -908330368,908330663,FR -908330664,908330671,ES -908330672,908331775,FR -908331776,908331903,IT -908331904,908332847,FR -908332848,908332863,LT -908332864,908332991,FR -908332992,908333023,GB -908333024,908333823,FR -908333824,908333951,DE -908333952,908334079,GB -908334080,908334271,FR -908334272,908334303,PT -908334304,908334919,FR -908334920,908334927,ES -908334928,908334951,FR -908334952,908334959,ES -908334960,908335871,FR -908335872,908335999,ES -908336000,908336167,FR -908336168,908336183,ES -908336184,908336295,FR -908336296,908336303,ES -908336304,908336535,FR -908336536,908336543,ES -908336544,908336639,FR -908336640,908336767,NL -908336768,908336831,FR -908336832,908336839,ES -908336840,908336991,FR -908336992,908337023,PT -908337024,908337151,IE -908337152,908337383,FR -908337384,908337391,ES -908337392,908337407,FR -908337408,908337535,NL -908337536,908338367,FR -908338368,908338375,ES -908338376,908339295,FR -908339296,908339303,ES -908339304,908339327,FR -908339328,908339455,DE -908339456,908339583,NL -908339584,908339975,FR -908339976,908339983,ES -908339984,908340079,FR -908340080,908340095,LT -908340096,908340223,GB -908340224,908340607,FR -908340608,908340735,ES -908340736,908340863,GB -908340864,908341207,FR -908341208,908341215,ES -908341216,908345343,FR -908345344,908345359,ES -908345360,908345447,FR -908345448,908345455,ES -908345456,908345527,FR -908345528,908345535,ES -908345536,908345543,FR -908345544,908345547,ES -908345548,908345583,FR -908345584,908345599,LT -908345600,908345727,DE -908345728,908345855,ES -908345856,908345951,FR -908345952,908345959,ES -908345960,908346271,FR -908346272,908346279,ES -908346280,908346287,FR -908346288,908346303,LT -908346304,908346647,FR -908346648,908346655,ES -908346656,908347455,FR -908347456,908347471,ES -908347472,908347919,FR -908347920,908347927,ES -908347928,908347935,FR -908347936,908347943,ES -908347944,908347951,FR -908347952,908347959,ES -908347960,908348143,FR -908348144,908348159,LT -908348160,908348415,FR -908348416,908348543,IT -908348544,908348671,FR -908348672,908348799,ES -908348800,908348855,FR -908348856,908348863,ES -908348864,908349455,FR -908349456,908349463,ES -908349464,908349503,FR -908349504,908349519,LT -908349520,908349647,FR -908349648,908349655,ES -908349656,908349711,FR -908349712,908349727,ES -908349728,908349767,FR -908349768,908349775,ES -908349776,908349823,FR -908349824,908349951,GB -908349952,908350679,FR -908350680,908350687,ES -908350688,908350719,PT -908350720,908350751,FR -908350752,908350759,ES -908350760,908350815,FR -908350816,908350847,PT -908350848,908350975,DE -908350976,908351007,FI -908351008,908351039,FR -908351040,908351071,GB -908351072,908351127,FR -908351128,908351135,ES -908351136,908351327,FR -908351328,908351335,ES -908351336,908351423,FR -908351424,908351455,CZ -908351456,908351487,FR -908351488,908351615,IT -908351616,908351743,ES -908351744,908351871,NL -908351872,908351999,DE -908352000,908352095,FR -908352096,908352127,PL -908352128,908352511,FR -908352512,908352767,GB -908352768,908353023,FR -908353024,908353151,BE -908353152,908353279,GB -908353280,908356607,FR -908356608,908359679,DE -908359680,908361815,FR -908361816,908361823,ES -908361824,908361855,PT -908361856,908362623,FR -908362624,908362751,DE -908362752,908362943,FR -908362944,908362951,ES -908362952,908362959,FR -908362960,908362975,CH -908362976,908362999,FR -908363000,908363007,ES -908363008,908363103,FR -908363104,908363119,DE -908363120,908363375,FR -908363376,908363391,ES -908363392,908363471,FR -908363472,908363479,ES -908363480,908363487,FR -908363488,908363519,FI -908363520,908363647,NL -908363648,908363775,DE -908363776,908363887,FR -908363888,908363903,LT -908363904,908363919,FR -908363920,908363927,ES -908363928,908364063,FR -908364064,908364095,FI -908364096,908364215,FR -908364216,908364223,ES -908364224,908364287,FR -908364288,908364415,ES -908364416,908364431,FR -908364432,908364439,ES -908364440,908364799,FR -908364800,908364927,IT -908364928,908364935,FR -908364936,908364943,ES -908364944,908364959,FR -908364960,908364967,ES -908364968,908365215,FR -908365216,908365231,ES -908365232,908366199,FR -908366200,908366335,ES -908366336,908366631,FR -908366632,908366639,ES -908366640,908366839,FR -908366840,908366847,ES -908366848,908368015,FR -908368016,908368031,LT -908368032,908368167,FR -908368168,908368175,ES -908368176,908368391,FR -908368392,908368399,ES -908368400,908368479,FR -908368480,908368511,ES -908368512,908368639,FR -908368640,908368767,IT -908368768,908369023,FR -908369024,908369055,CZ -908369056,908369239,FR -908369240,908369247,ES -908369248,908369543,FR -908369544,908369551,ES -908369552,908369743,FR -908369744,908369775,LT -908369776,908369919,FR -908369920,908371967,GB -908371968,908374015,PL -908374016,908376127,FR -908376128,908376255,PL -908376256,908376767,FR -908376768,908376895,PL -908376896,908378271,FR -908378272,908378279,ES -908378280,908378383,FR -908378384,908378399,LT -908378400,908378463,FR -908378464,908378495,PT -908378496,908378503,FR -908378504,908378511,ES -908378512,908378575,FR -908378576,908378591,GB -908378592,908378783,FR -908378784,908378799,LT -908378800,908378863,FR -908378864,908378871,GB -908378872,908378879,ES -908378880,908378983,FR -908378984,908378991,ES -908378992,908379039,FR -908379040,908379071,CZ -908379072,908379903,FR -908379904,908379911,ES -908379912,908379951,FR -908379952,908379967,LT -908379968,908380223,FR -908380224,908380239,ES -908380240,908380319,FR -908380320,908380327,ES -908380328,908380351,FR -908380352,908380383,PL -908380384,908380415,PT -908380416,908380543,ES -908380544,908380959,FR -908380960,908380991,PT -908380992,908381055,FR -908381056,908381183,GB -908381184,908381311,IE -908381312,908381327,FR -908381328,908381335,ES -908381336,908381751,FR -908381752,908381759,ES -908381760,908382719,FR -908382720,908382751,PL -908382752,908382823,FR -908382824,908382831,ES -908382832,908383015,FR -908383016,908383023,ES -908383024,908384511,FR -908384512,908384639,BE -908384640,908385063,FR -908385064,908385071,ES -908385072,908385407,FR -908385408,908385423,LT -908385424,908385535,FR -908385536,908385663,IT -908385664,908386007,FR -908386008,908386015,ES -908386016,908386431,FR -908386432,908386447,GB -908386448,908387071,FR -908387072,908387135,GB -908387136,908387151,FR -908387152,908387167,GB -908387168,908387903,FR -908387904,908387967,GB -908387968,908388399,FR -908388400,908388415,DE -908388416,908388431,FR -908388432,908388447,DE -908388448,908388879,FR -908388880,908388887,DE -908388888,908389055,FR -908389056,908389375,DE -908389376,908389759,FR -908389760,908389823,DE -908389824,908391159,FR -908391160,908391295,ES -908391296,908391423,GB -908391424,908392759,FR -908392760,908392767,ES -908392768,908392863,FR -908392864,908392879,LT -908392880,908394495,FR -908394496,908396543,GB -908396544,908403343,FR -908403344,908403351,ES -908403352,908403655,FR -908403656,908403663,ES -908403664,908403735,FR -908403736,908403743,ES -908403744,908403775,FR -908403776,908403807,CZ -908403808,908403839,FR -908403840,908403967,NL -908403968,908405247,FR -908405248,908405375,IT -908405376,908405455,FR -908405456,908405463,ES -908405464,908405599,FR -908405600,908405607,ES -908405608,908405647,FR -908405648,908405655,ES -908405656,908406039,FR -908406040,908406047,ES -908406048,908406083,FR -908406084,908406087,IT -908406088,908406159,FR -908406160,908406167,ES -908406168,908406551,FR -908406552,908406559,ES -908406560,908407151,FR -908407152,908407159,ES -908407160,908408295,FR -908408296,908408303,ES -908408304,908408799,FR -908408800,908408815,LT -908408816,908409279,FR -908409280,908409287,ES -908409288,908409487,FR -908409488,908409495,ES -908409496,908409975,FR -908409976,908409983,ES -908409984,908410111,DE -908410112,908410495,FR -908410496,908410503,ES -908410504,908410711,FR -908410712,908410719,ES -908410720,908410863,FR -908410864,908410879,LT -908410880,908412927,FR -908412928,908414975,DE -908414976,908417023,FR -908417024,908417599,DE -908417600,908417791,FR -908417792,908417919,DE -908417920,908418751,FR -908418752,908418815,DE -908418816,908419327,FR -908419328,908419455,ES -908419456,908419495,FR -908419496,908419503,ES -908419504,908419711,FR -908419712,908419719,ES -908419720,908419767,FR -908419768,908419775,ES -908419776,908419999,FR -908420000,908420015,LT -908420016,908420071,FR -908420072,908420079,ES -908420080,908420351,FR -908420352,908420479,GB -908420480,908420791,FR -908420792,908420799,ES -908420800,908421127,FR -908421128,908421135,ES -908421136,908421951,FR -908421952,908421967,ES -908421968,908422047,FR -908422048,908422063,GB -908422064,908422079,FI -908422080,908422255,FR -908422256,908422263,ES -908422264,908422911,FR -908422912,908422919,ES -908422920,908423039,FR -908423040,908423071,PT -908423072,908423095,FR -908423096,908423103,ES -908423104,908423319,FR -908423320,908423327,ES -908423328,908423823,FR -908423824,908423831,ES -908423832,908423895,FR -908423896,908423903,ES -908423904,908424263,FR -908424264,908424271,ES -908424272,908424319,FR -908424320,908424447,DE -908424448,908424511,FR -908424512,908424527,LT -908424528,908424535,ES -908424536,908425055,FR -908425056,908425087,PT -908425088,908425151,FR -908425152,908425183,FI -908425184,908425463,FR -908425464,908425471,ES -908425472,908425855,FR -908425856,908425983,ES -908425984,908426287,FR -908426288,908426295,ES -908426296,908426391,FR -908426392,908426399,ES -908426400,908426431,FR -908426432,908426447,LT -908426448,908426479,FR -908426480,908426495,GB -908426496,908426703,FR -908426704,908426711,ES -908426712,908427119,FR -908427120,908427127,ES -908427128,908427143,FR -908427144,908427151,ES -908427152,908427247,FR -908427248,908427263,ES -908427264,908428351,FR -908428352,908428415,PL -908428416,908428671,FR -908428672,908428735,PL -908428736,908428799,FR -908428800,908428863,PL -908428864,908429311,FR -908429312,908430335,PL -908430336,908430847,FR -908430848,908430911,PL -908430912,908431167,FR -908431168,908431231,PL -908431232,908435495,FR -908435496,908435503,ES -908435504,908435647,FR -908435648,908435663,ES -908435664,908435839,FR -908435840,908435967,GB -908435968,908436223,FR -908436224,908436351,ES -908436352,908436479,NL -908436480,908436503,FR -908436504,908436511,ES -908436512,908436535,FR -908436536,908436543,ES -908436544,908436607,FR -908436608,908436735,DE -908436736,908437335,FR -908437336,908437343,ES -908437344,908438023,FR -908438024,908438031,ES -908438032,908438087,FR -908438088,908438095,ES -908438096,908438111,LT -908438112,908438399,FR -908438400,908438407,ES -908438408,908438527,FR -908438528,908438655,IE -908438656,908438783,ES -908438784,908438911,DE -908438912,908439087,FR -908439088,908439103,ES -908439104,908439295,FR -908439296,908439423,BE -908439424,908439679,FR -908439680,908439807,NL -908439808,908439871,FR -908439872,908439903,PL -908439904,908439967,FR -908439968,908439999,PT -908440000,908440031,PL -908440032,908440063,FR -908440064,908440191,GB -908440192,908440223,FI -908440224,908440255,FR -908440256,908440287,PT -908440288,908440319,CZ -908440320,908440447,IT -908440448,908441023,FR -908441024,908441055,FI -908441056,908441311,FR -908441312,908441343,CZ -908441344,908443263,FR -908443264,908443391,BE -908443392,908443487,FR -908443488,908443519,GB -908443520,908444159,FR -908444160,908444223,DE -908444224,908448927,FR -908448928,908448935,IT -908448936,908448995,FR -908448996,908448999,IT -908449000,908453887,FR -908453888,908454911,PL -908454912,908525567,FR -908525568,908591103,CA -908591104,910163967,US -910163968,910197237,JP -910197238,910197238,US -910197239,910295039,JP -910295040,910360575,AU -910360576,910688255,US -910688256,911147007,IE -911147008,911212543,AU -911212544,911998975,US -911998976,912031743,JP -912031744,912064511,US -912064512,912130047,DE -912130048,912195583,BR -912195584,912261119,JP -912261120,915800063,US -915800064,915865599,JP -915865600,915898367,US -915898368,915931135,SG -915931136,916029439,US -916029440,916062207,AU -916062208,916191009,IE -916191010,916191010,GB -916191011,916193279,IE -916193280,916979711,US -916979712,917045247,JP -917045248,917089018,SG -917089019,917089019,IN -917089020,917110783,SG -917110784,917241855,IE -917241856,917635071,US -917635072,917700607,JP -917700608,917766143,SG -917766144,918683647,US -918683648,918814719,IE -918814720,919011327,US -919011328,919076863,JP -919076864,919470079,US -919470080,919535615,AU -919535616,919601151,BR -919601152,920125439,US -920125440,920256511,IE -920256512,920387583,US -920387584,920453119,IE -920453120,920518655,US -920518656,920649727,CN -920649728,920911871,US -920911872,921042943,IE -921042944,921141247,US -921141248,921149439,IE -921149440,921157631,US -921157632,921161727,DE -921161728,921165823,US -921165824,921167871,JP -921167872,921169919,US -921169920,921170943,SG -921170944,921171967,US -921171968,921173247,AU -921173248,921173503,BR -921173504,921174015,US -921174016,921305087,BR -921305088,921567231,US -921567232,921632767,JP -921632768,921632815,US -921632816,921632831,IE -921632832,921632847,BR -921632848,921632863,JP -921632864,921632879,SG -921632880,921632895,AU -921632896,921632911,US -921632912,921632927,CN -921632928,921632943,DE -921632944,921632959,CN -921632960,921632975,KR -921632976,921632991,IN -921632992,921633007,US -921633008,921633023,GB -921633024,921633039,CA -921633040,921633055,FR -921633056,921633791,US -921633792,921634815,DE -921634816,921640959,US -921640960,921643007,IE -921643008,921646079,US -921646080,921646591,JP -921646592,921649151,DE -921649152,921657343,US -921657344,921657599,JP -921657600,921658111,US -921658112,921658879,IE -921658880,921662463,US -921662464,921665535,KR -921665536,921747455,US -921747456,921748479,AU -921748480,921748735,US -921748736,921748991,IE -921748992,921749247,US -921749248,921749503,SG -921749504,921749759,JP -921749760,921750271,US -921750272,921751551,AU -921751552,921754623,US -921754624,921755647,IE -921755648,921755903,US -921755904,921756159,JP -921756160,921756671,SG -921756672,921760767,US -921760768,921761791,BR -921761792,922091519,US -922091520,922189311,IE -922189312,922189567,US -922189568,922205775,IE -922205776,922205776,DE -922205777,922222591,IE -922222592,922419199,JP -922419200,922427633,SG -922427634,922427634,US -922427635,922427703,SG -922427704,922427704,US -922427705,922484735,SG -922484736,922615807,AU -922615808,922746879,SG -922746880,956301311,US -956301312,959447039,BE -959447040,959512575,US -959512576,960495615,BE -960495616,960626687,FR -960626688,960659455,GB -960659456,960662783,DE -960662784,960663039,FR -960663040,960676607,DE -960676608,960676863,PL -960676864,960692223,DE -960692224,960699935,FR -960699936,960699967,IT -960699968,960724991,FR -960724992,960726783,NL -960726784,960727039,ZA -960727040,960727295,US -960727296,960729343,NL -960729344,960729599,ZA -960729600,960733183,NL -960733184,960741375,BE -960741376,960749567,NL -960749568,960757759,LU -960757760,960888831,US -960888832,960921599,AU -960921600,960929791,NZ -960929792,960933887,KI -960933888,960937983,MH -960937984,960942079,FM -960942080,960946175,NR -960946176,960950271,FJ -960950272,960954367,PW -960954368,960958463,PG -960958464,960962559,WS -960962560,960966655,SB -960966656,960970751,TO -960970752,960974847,TV -960974848,960978943,VU -960978944,960983039,NC -960983040,961019903,FR -961019904,961022079,HK -961022080,961022095,SG -961022096,961052671,HK -961052672,961085439,JP -961085440,961092095,SG -961092096,961092351,IN -961092352,961118207,SG -961118208,961126399,MY -961126400,961134591,TW -961134592,961142783,KR -961142784,961150975,FR -961150976,961183743,BR -961183744,961191935,AR -961191936,961200127,CL -961200128,961208319,CO -961208320,961216511,VE -961216512,961224703,PE -961224704,961228799,EC -961228800,961232895,BO -961232896,961236991,PY -961236992,961237011,FR -961237012,961241087,UY -961241088,961245183,GF -961245184,961247231,GY -961247232,961249279,SR -961249280,961253375,GT -961253376,961257471,BZ -961257472,961261567,HN -961261568,961265663,NI -961265664,961269759,SV -961269760,961273855,PA -961273856,961277951,CR -961277952,961282047,FR -961282048,961314815,MX -961314816,961380351,US -961380352,961413119,CA -961413120,961445887,IT -961445888,961478655,ES -961478656,961511423,CH -961511424,961519615,PT -961519616,961523711,SE -961523712,961527807,LI -961527808,961531903,MC -961531904,961533951,SM -961533952,961540095,VA -961540096,961542143,AD -961542144,961544191,MC -961544192,961675263,US -961675264,961683455,ZA -961683456,961687551,DZ -961687552,961691647,AO -961691648,961695743,BJ -961695744,961699839,BW -961699840,961703935,BF -961703936,961708031,BI -961708032,961712127,CM -961712128,961716223,CV -961716224,961720319,CF -961720320,961724415,TD -961724416,961740799,ZA -961740800,961744895,EG -961744896,961748991,GQ -961748992,961753087,ER -961753088,961757183,ET -961757184,961761279,GA -961761280,961765375,GH -961765376,961769471,GN -961769472,961773567,GW -961773568,961777663,CI -961777664,961781759,KE -961781760,961785855,LS -961785856,961789951,LR -961789952,961794047,LY -961794048,961798143,MG -961798144,961800191,MW -961800192,961802239,ML -961802240,961810431,MR -961810432,961814527,MU -961814528,961818623,MA -961818624,961822719,MZ -961822720,961826815,NA -961826816,961830911,NE -961830912,961835007,NG -961835008,961839103,RW -961839104,961843199,ST -961843200,961847295,SN -961847296,961851391,SC -961851392,961855487,SL -961855488,961859583,SO -961859584,961863679,SD -961863680,961867775,SZ -961867776,961871871,TZ -961871872,961875967,GM -961875968,961880063,TG -961880064,961884159,TN -961884160,961888255,UG -961888256,961892351,ZM -961892352,961896447,ZW -961896448,961900543,NG -961900544,961937407,FR -961937408,961945599,IS -961945600,961953791,FI -961953792,961961983,DK -961961984,961970175,NO -961970176,962002943,SE -962002944,962035711,RU -962035712,962039807,EE -962039808,962043903,LV -962043904,962047999,LT -962048000,962052095,FR -962052096,962056191,UA -962056192,962060287,BY -962060288,962068479,FR -962068480,962072575,AM -962072576,962076671,AZ -962076672,962080767,BH -962080768,962084863,EG -962084864,962088959,GE -962088960,962093055,IR -962093056,962097151,IQ -962097152,962101247,IL -962101248,962105343,JO -962105344,962109439,KW -962109440,962113535,LB -962113536,962117631,OM -962117632,962121727,QA -962121728,962125823,SA -962125824,962129919,SY -962129920,962134015,TM -962134016,962138111,AE -962138112,962142207,YE -962142208,962199551,FR -962199552,962203647,AL -962203648,962211839,AT -962211840,962215935,BG -962215936,962217983,HR -962217984,962220031,BA -962220032,962224127,CZ -962224128,962228223,GR -962228224,962232319,HU -962232320,962236415,MK -962236416,962240511,MD -962240512,962244607,PL -962244608,962248703,RO -962248704,962250751,RS -962250752,962252799,ME -962252800,962256895,SK -962256896,962260991,SI -962260992,962265087,TR -962265088,962269183,AG -962269184,962273279,BB -962273280,962277375,CU -962277376,962281471,DM -962281472,962285567,DO -962285568,962289663,GD -962289664,962293759,HT -962293760,962297855,JM -962297856,962301951,KN -962301952,962306047,LC -962306048,962310143,VC -962310144,962314239,BS -962314240,962318335,TT -962318336,962322431,PR -962322432,962324479,AW -962324480,962330623,FR -962330624,962334719,AF -962334720,962338815,BD -962338816,962342911,BT -962342912,962347007,BN -962347008,962351103,MM -962351104,962355199,KH -962355200,962359295,CN -962359296,962363391,IN -962363392,962367487,ID -962367488,962371583,KZ -962371584,962375679,KG -962375680,962379775,LA -962379776,962383871,MV -962383872,962387967,MN -962387968,962392063,NP -962392064,962396159,PK -962396160,962400255,PH -962400256,962404351,LK -962404352,962408447,TJ -962408448,962412543,TH -962412544,962416639,UZ -962416640,962420735,VN -962420736,962461695,FR -962461696,962469887,IE -962469888,962527231,TR -962527232,962592767,FR -962592768,962594815,IN -962594816,962596863,FR -962596864,962598911,SG -962598912,962600959,FR -962600960,962609151,HK -962609152,962613247,JP -962613248,962617343,FR -962617344,962621439,AU -962621440,962674687,FR -962674688,962676735,BR -962676736,962678783,CL -962678784,962680831,FR -962680832,962689023,US -962689024,962723839,FR -962723840,962732031,GB -962732032,962740223,DE -962740224,962744319,SE -962744320,962746367,FR -962746368,962748415,NL -962748416,962752511,BH -962752512,962756607,ZA -962756608,962854911,FR -962854912,962856959,SG -962856960,964689919,FR -964689920,968753151,BE -968753152,968757247,NL -968757248,968818687,CH -968818688,968819711,DE -968819712,968851455,BE -968851456,968852479,US -968852480,973078527,BE -973078528,973209599,JP -973209600,973275135,IN -973275136,973471743,JP -973471744,973602815,AU -973602816,973864959,TH -973864960,973996031,JP -973996032,974782463,CN -974782464,974880767,MY -974880768,974913535,PK -974913536,974979071,NZ -974979072,975044607,KR -975044608,977272831,CN -977272832,977305599,TH -977305600,977338367,HK -977338368,977346559,SG -977346560,977354751,JP -977354752,977371135,KR -977371136,977395711,PK -977395712,977397759,BD -977397760,977399807,CN -977399808,977401855,ID -977401856,977403903,AU -977403904,977534975,CN -977534976,977567743,IN -977567744,977600511,CN -977600512,977666047,PH -977666048,977731583,JP -977731584,977764351,PH -977764352,977797119,MY -977797120,978321407,KR -978321408,978452479,JP -978452480,978485247,CN -978485248,978501631,TH -978501632,978518015,HK -978518016,978583551,CN -978583552,978584575,VN -978584576,978585599,HK -978585600,978586623,US -978586624,978587647,IN -978587648,978588671,MY -978588672,978590719,IN -978590720,978591743,PK -978591744,978592767,BD -978592768,978593023,US -978593024,978593279,NZ -978593280,978593535,AU -978593536,978593791,AE -978593792,978594815,MY -978594816,978595839,KR -978595840,978596863,NZ -978596864,978597887,HK -978597888,978599935,IN -978599936,978640895,AU -978640896,978644991,NZ -978644992,978714623,JP -978714624,978780159,TW -978780160,978784255,AU -978784256,978788351,JP -978788352,978796543,KR -978796544,978812927,CN -978812928,979369983,JP -979369984,979410943,AU -979410944,979419135,HK -979419136,979435519,SG -979435520,979468287,TH -979468288,979501055,BD -979501056,979566591,JP -979566592,979599359,TW -979599360,979763199,CN -979763200,979894271,KR -979894272,980418559,AU -980418560,980549631,JP -980549632,980680703,TW -980680704,980942847,CN -980942848,981467135,KR -981467136,981991423,CN -981991424,982122495,TH -982122496,982171647,JP -982171648,982188031,KR -982188032,982253567,MY -982253568,982515711,KR -982515712,982581247,CN -982581248,982614015,KR -982614016,982622207,AU -982622208,982624255,JP -982624256,982626303,ID -982626304,982628351,JP -982628352,982630399,BD -982630400,982639103,JP -982639104,982639615,SG -982639616,982639871,JP -982639872,982641151,SG -982641152,982641407,JP -982641408,982642687,SG -982642688,982671359,JP -982671360,982679551,IN -982679552,982695935,SG -982695936,982712319,KR -982712320,982745087,TH -982745088,982753279,AF -982753280,982755327,JP -982755328,982757375,BD -982757376,982759423,KR -982759424,982761471,ID -982761472,982777855,JP -982777856,983039999,KR -983040000,983171071,HK -983171072,983302143,CN -983302144,983564287,JP -983564288,984612863,AU -984612864,984743935,HK -984743936,984875007,AU -984875008,984956927,KR -984956928,984965119,AU -984965120,984973311,PK -984973312,985006079,TH -985006080,985071615,SG -985071616,985137151,JP -985137152,985202687,KR -985202688,985268223,SG -985268224,985399295,VN -985399296,985661439,JP -985661440,987758591,CN -987758592,988807167,KR -988807168,989855743,CN -989855744,991952895,KR -991952896,995360767,CN -995360768,995532799,JP -995532800,995540991,AU -995540992,995557375,KR -995557376,995622911,JP -995622912,996409343,IN -996409344,996573183,AU -996573184,996605951,TW -996605952,996671487,PK -996671488,996802559,TW -996802560,996868095,JP -996868096,997195775,CN -997195776,998244351,TW -998244352,999292927,JP -999292928,999423999,IN -999424000,999555071,JP -999555072,999686143,HK -999686144,999751679,KR -999751680,999784447,CN -999784448,999800831,US -999800832,999817215,KR -999817216,999821311,BD -999821312,999827455,CN -999827456,999828479,IN -999828480,999828735,HK -999828736,999828991,PH -999828992,999829311,MY -999829312,999829343,CN -999829344,999829375,MM -999829376,999829383,TH -999829384,999829407,HK -999829408,999829439,KR -999829440,999829471,VN -999829472,999829503,ID -999829504,999830527,HK -999830528,999832575,IN -999832576,999833599,BD -999833600,999837695,CN -999837696,999838719,IN -999838720,999838975,FR -999838976,999839231,IT -999839232,999839487,ES -999839488,999839743,AU -999839744,999845887,BD -999845888,999847935,CN -999847936,999848959,IN -999848960,999849983,US -999849984,999866367,KR -999866368,999882751,HK -999882752,999883775,IN -999883776,999884799,CN -999884800,999885823,AU -999885824,999886847,IN -999886848,999887871,BD -999887872,999888895,NZ -999888896,999889407,ID -999889408,999889919,MY -999889920,999890943,BD -999890944,999891967,CN -999891968,999892991,IN -999892992,999895039,JP -999895040,999898111,HK -999898112,999902207,CN -999902208,999903231,SG -999903232,999904255,ID -999904256,999905279,MN -999905280,999906303,MM -999906304,999907327,CN -999907328,999908351,IN -999908352,999909375,BD -999909376,999910399,SG -999910400,999911423,MM -999911424,999912447,MN -999912448,999913471,CN -999913472,999914495,IN -999914496,999915519,AF -999915520,999916543,ID -999916544,999917567,TL -999917568,999918591,CN -999918592,999919615,JP -999919616,999921663,HK -999921664,999923711,CN -999923712,999924735,HK -999924736,999932927,CN -999932928,999933951,HK -999933952,999934975,BD -999934976,999935999,JP -999936000,999937023,TH -999937024,999948287,VN -999948288,1000013823,AU -1000013824,1000079359,CN -1000079360,1000341503,JP -1000341504,1000734719,IN -1000734720,1000800255,JP -1000800256,1000865791,AU -1000865792,1001127935,JP -1001127936,1001390079,CN -1001390080,1002045439,IN -1002045440,1002176511,KR -1002176512,1002242047,HK -1002242048,1002307583,SG -1002307584,1002373119,JP -1002373120,1002405887,CN -1002405888,1002422271,JP -1002422272,1002434559,AU -1002434560,1002438399,CN -1002438400,1002438655,HK -1002438656,1008730111,CN -1008730112,1009778687,JP -1009778688,1010237439,MY -1010237440,1010302975,CN -1010302976,1010761727,JP -1010761728,1010827263,CN -1010827264,1017118719,JP -1017118720,1019215871,CN -1019215872,1019346943,JP -1019346944,1019478015,CN -1019478016,1019609087,KR -1019609088,1019740159,TW -1019740160,1021313023,CN -1021313024,1021837311,AU -1021837312,1021968383,CN -1021968384,1022033919,NZ -1022033920,1022099455,CN -1022099456,1022361599,JP -1022361600,1022558207,AU -1022558208,1022623743,IN -1022623744,1022722047,TW -1022722048,1022754815,CN -1022754816,1022820351,MO -1022820352,1022885887,CN -1022885888,1023148031,TW -1023148032,1023213567,CN -1023213568,1023238143,KR -1023238144,1023246335,ID -1023246336,1023279103,CN -1023279104,1023311871,IN -1023311872,1023317503,US -1023317504,1023317759,IN -1023317760,1023323429,US -1023323430,1023323430,CN -1023323431,1023328255,US -1023328256,1023344639,JP -1023344640,1023410175,CN -1023410176,1023672319,IN -1023672320,1023688703,HK -1023688704,1023692799,MM -1023692800,1023696895,CN -1023696896,1023705087,MY -1023705088,1023717375,JP -1023717376,1023721471,CN -1023721472,1023737855,KR -1023737856,1023770623,ID -1023770624,1023778815,PK -1023778816,1023787007,KR -1023787008,1023791103,AF -1023791104,1023795199,NC -1023795200,1023803391,JP -1023803392,1023852543,MY -1023852544,1023868927,BN -1023868928,1023901695,JP -1023901696,1023934463,TH -1023934464,1023942719,AU -1023942720,1023942751,MY -1023942752,1023943535,AU -1023943536,1023943551,JP -1023943552,1023946879,AU -1023946880,1023946911,SG -1023946912,1023950847,AU -1023950848,1023954943,ID -1023954944,1023959039,JP -1023959040,1023967231,AU -1023967232,1023975423,IN -1023975424,1023979519,CN -1023979520,1023983615,AU -1023983616,1023999999,SG -1024000000,1024032767,PH -1024032768,1024065535,AU -1024065536,1024131071,HK -1024131072,1024163839,IN -1024163840,1024184319,JP -1024184320,1024188415,MY -1024188416,1024196607,VN -1024196608,1024229375,IN -1024229376,1024262143,JP -1024262144,1024327679,SG -1024327680,1024327935,US -1024327936,1024328191,AU -1024328192,1024328447,HK -1024328448,1024328703,US -1024328704,1024329727,CN -1024329728,1024330751,JP -1024330752,1024331775,AU -1024331776,1024335871,US -1024335872,1024339967,AU -1024339968,1024340991,ZA -1024340992,1024344063,US -1024344064,1024352255,SG -1024352256,1024360447,AU -1024360448,1024361135,JP -1024361136,1024361151,HK -1024361152,1024361167,JP -1024361168,1024361183,HK -1024361184,1024364063,JP -1024364064,1024364079,AU -1024364080,1024365727,JP -1024365728,1024365759,SG -1024365760,1024368895,JP -1024368896,1024368896,HK -1024368897,1024370175,JP -1024370176,1024370687,AU -1024370688,1024371199,JP -1024371200,1024371455,PH -1024371456,1024372543,JP -1024372544,1024372639,HK -1024372640,1024373263,JP -1024373264,1024373279,HK -1024373280,1024376831,JP -1024376832,1024378879,PH -1024378880,1024380927,IN -1024380928,1024381951,KR -1024381952,1024385023,CN -1024385024,1024386047,US -1024386048,1024387071,IN -1024387072,1024389119,VN -1024389120,1024391167,CN -1024391168,1024392191,ID -1024392192,1024458751,HK -1024458752,1024491519,SG -1024491520,1024589823,IN -1024589824,1024655359,HK -1024655360,1024720895,TH -1024720896,1024786431,TW -1024786432,1025245183,JP -1025245184,1025277951,CN -1025277952,1025294335,PH -1025294336,1025294591,AU -1025294592,1025294847,SG -1025294848,1025295615,AU -1025295616,1025295871,PH -1025295872,1025296127,AU -1025296128,1025296639,FR -1025296640,1025299199,AU -1025299200,1025299263,IN -1025299264,1025299455,AU -1025299456,1025299711,CN -1025299712,1025300735,AU -1025300736,1025300991,US -1025300992,1025301055,AU -1025301056,1025301247,US -1025301248,1025301503,GB -1025301504,1025302271,AU -1025302272,1025302527,GB -1025302528,1025310719,VN -1025310720,1025343487,AU -1025343488,1025376255,CN -1025376256,1025507327,TW -1025507328,1026293759,KR -1026293760,1026392063,JP -1026392064,1026408447,CN -1026408448,1026416639,JP -1026416640,1026420735,CN -1026420736,1026422783,JP -1026422784,1026423039,AU -1026423040,1026423295,SG -1026423296,1026424831,AU -1026424832,1026490623,JP -1026490624,1026491135,SG -1026491136,1026491903,JP -1026491904,1026494207,SG -1026494208,1026494463,JP -1026494464,1026494719,SG -1026494720,1026494975,JP -1026494976,1026495743,SG -1026495744,1026496255,JP -1026496256,1026496511,SG -1026496512,1026496767,JP -1026496768,1026497279,SG -1026497280,1026497535,JP -1026497536,1026497791,SG -1026497792,1026498047,JP -1026498048,1026501631,SG -1026501632,1026502399,JP -1026502400,1026502911,SG -1026502912,1026503679,JP -1026503680,1026503935,SG -1026503936,1026504959,JP -1026504960,1026506751,SG -1026506752,1026507519,JP -1026507520,1026508799,SG -1026508800,1026510847,JP -1026510848,1026512895,SG -1026512896,1026514943,JP -1026514944,1026515455,SG -1026515456,1026515967,JP -1026515968,1026516479,SG -1026516480,1026516991,JP -1026516992,1026518015,SG -1026518016,1026519039,JP -1026519040,1026523135,SG -1026523136,1026539519,CN -1026539520,1026555903,KR -1026555904,1027080191,CN -1027080192,1027866623,TW -1027866624,1027997695,AU -1027997696,1028128767,TW -1028128768,1029046271,KR -1029046272,1029122817,JP -1029122818,1029122818,FR -1029122819,1029148671,JP -1029148672,1029152767,HK -1029152768,1029156863,SG -1029156864,1029160959,AU -1029160960,1029177343,CN -1029177344,1029242879,AU -1029242880,1029308415,JP -1029308416,1029439487,TH -1029439488,1029570559,HK -1029570560,1029636095,ID -1029636096,1029668863,AU -1029668864,1029701631,IN -1029701632,1030674431,KR -1030674432,1030676479,JP -1030676480,1030750207,KR -1030750208,1031798783,JP -1031798784,1033172184,CN -1033172185,1033172185,US -1033172186,1035993087,CN -1035993088,1037565951,JP -1037565952,1038614527,TW -1038614528,1039007743,CN -1039007744,1039138815,HK -1039138816,1039400959,CN -1039400960,1039466495,HK -1039466496,1039499263,JP -1039499264,1039507455,AU -1039507456,1039511551,LK -1039511552,1039515647,KR -1039515648,1039523839,JP -1039523840,1039532031,KR -1039532032,1039597567,IN -1039597568,1039613951,ID -1039613952,1039638527,KR -1039638528,1039642623,TW -1039642624,1039646719,BD -1039646720,1039654911,KR -1039654912,1039663103,IN -1039663104,1040187391,KR -1040187392,1040252927,IL -1040252928,1040318463,GR -1040318464,1040383999,CH -1040384000,1040392191,SA -1040392192,1040392447,GB -1040392448,1040400383,SA -1040400384,1040416767,GB -1040416768,1040424959,SE -1040424960,1040433151,PL -1040433152,1040449535,GB -1040449536,1040457727,FR -1040457728,1040465919,ME -1040465920,1040466175,DE -1040473344,1040473599,DE -1040474112,1040477183,CZ -1040477184,1040477184,KG -1040477185,1040482303,CZ -1040482304,1040515071,BE -1040515072,1040547839,GB -1040547840,1040580607,RU -1040580608,1040711679,GB -1040711680,1040719871,FR -1040719872,1040728063,DE -1040728064,1040736255,KE -1040736256,1040744447,GB -1040744448,1040777215,DE -1040777216,1040842751,IE -1040842752,1040973823,IT -1040973824,1040982015,NL -1040982016,1040982527,DK -1040982528,1040982783,FI -1040982784,1040983551,DK -1040983552,1040983807,FO -1040983808,1040990207,DK -1040990208,1040998399,CY -1040998400,1041002495,SD -1041002496,1041004543,KE -1041006592,1041039359,CH -1041039360,1041072127,SE -1041072128,1041080319,GB -1041080320,1041088511,IT -1041088512,1041093631,AT -1041093632,1041094143,US -1041094144,1041096703,AT -1041096704,1041235967,ES -1041235968,1041244159,UA -1041244160,1041252351,RU -1041252352,1041256447,PS -1041256448,1041260543,SY -1041260544,1041268735,RU -1041268736,1041283839,NO -1041283840,1041284095,SJ -1041284096,1041294847,NO -1041294848,1041295103,SJ -1041295104,1041301503,NO -1041301504,1041367039,IE -1041367040,1041498111,IT -1041498112,1041563647,SE -1041563648,1041596415,PL -1041596416,1041629183,NL -1041629184,1041694719,ES -1041694720,1041724807,FR -1041724808,1041724815,AT -1041724816,1041728551,FR -1041728552,1041728559,IT -1041728560,1041728655,FR -1041728656,1041728671,IT -1041728672,1041741567,FR -1041741568,1041741823,ES -1041741824,1041748823,FR -1041748824,1041748831,DE -1041748832,1041750351,FR -1041750352,1041750367,DE -1041750368,1041752319,FR -1041752320,1041752575,AT -1041752576,1041760255,FR -1041760256,1041768447,DE -1041768448,1041776639,NO -1041776640,1041784831,CZ -1041784832,1041793023,KE -1041793024,1041825791,GB -1041825792,1041842175,NL -1041842176,1041858559,GB -1041858560,1041862655,HK -1041862656,1041866751,SG -1041866752,1041870847,JP -1041870848,1041874943,AU -1041874944,1041890047,GB -1041890048,1041891327,HK -1041891328,1042022399,DE -1042022400,1042087935,PT -1042087936,1042120703,TR -1042120704,1042153471,PL -1042153472,1042284543,GB -1042284544,1042292735,CH -1042292736,1042294527,NL -1042294528,1042294783,GB -1042294784,1042295551,NL -1042295552,1042296575,GE -1042296576,1042300903,NL -1042300904,1042300911,UA -1042300912,1042300927,NL -1042300928,1042309119,RU -1042309120,1042317311,GB -1042317312,1042350079,ES -1042350080,1042415615,RU -1042415616,1042546687,FR -1042546688,1042677759,ES -1042677760,1042743295,GR -1042743296,1042808831,FR -1042808832,1042817023,DE -1042817024,1042825215,IE -1042825216,1042833407,CZ -1042833408,1042834025,GB -1042834026,1042834026,PT -1042834027,1042840673,GB -1042840674,1042840674,PT -1042840675,1042841599,GB -1042841600,1042874367,AT -1042874368,1042875135,NL -1042875136,1042875391,FR -1042875392,1042879999,NL -1042880000,1042880007,GB -1042880008,1042881023,NL -1042881024,1042881535,DE -1042881536,1042939903,NL -1042939904,1043070975,ES -1043070976,1043079167,CZ -1043079168,1043087359,DE -1043087360,1043095551,GB -1043095552,1043103743,BG -1043103744,1043120127,DK -1043120128,1043136511,FI -1043136512,1043202047,NL -1043202048,1043333119,AT -1043333120,1043341311,CH -1043341312,1043349503,IT -1043349504,1043357695,DE -1043357696,1043365887,CH -1043365888,1043398655,PT -1043398656,1043465839,GB -1043465840,1043465847,NL -1043465848,1043475871,GB -1043475872,1043475887,DE -1043475888,1043476111,GB -1043476112,1043476127,DE -1043476128,1043476383,GB -1043476384,1043476399,DE -1043476400,1043476431,GB -1043476432,1043476447,DE -1043476448,1043483391,GB -1043483392,1043483423,CH -1043483424,1043488767,GB -1043488768,1043496959,DE -1043496960,1043505151,GB -1043505152,1043513343,NO -1043513344,1043529727,GB -1043529728,1043595263,NL -1043595264,1043661567,DE -1043661568,1043661823,GB -1043661824,1043857407,DE -1043857408,1043897343,GB -1043897344,1043897855,NG -1043897856,1043899391,GB -1043899392,1043899647,CG -1043899648,1043902463,GB -1043902464,1043908607,US -1043908608,1043910655,DE -1043910656,1043919442,GB -1043919443,1043919443,SS -1043919444,1043920895,GB -1043920896,1043921919,UG -1043921920,1043922943,IL -1043922944,1043988479,ES -1043988480,1044118295,NL -1044118296,1044118303,BE -1044118304,1044118423,NL -1044118424,1044118431,BE -1044118432,1044118439,NL -1044118440,1044118447,BE -1044118448,1044118511,NL -1044118512,1044118519,BE -1044118520,1044119551,NL -1044119552,1044152319,GB -1044152320,1044185087,IR -1044185088,1044193279,RU -1044193280,1044201471,PL -1044201472,1044217855,FI -1044217856,1044226047,DK -1044226048,1044234239,OM -1044234240,1044250623,RE -1044283392,1044316159,FR -1044316160,1044332543,NO -1044332544,1044348927,RU -1044348928,1044365311,LV -1044365312,1044381695,SE -1044381696,1044389887,RU -1044389888,1044398079,FR -1044398080,1044414463,UA -1044414464,1044447231,GB -1044447232,1044453233,SE -1044453234,1044453234,NO -1044453235,1044455168,SE -1044455169,1044455169,NO -1044455170,1044455423,SE -1044455424,1044463615,EE -1044463616,1044479999,SE -1044480000,1044488191,CH -1044488192,1044496383,SK -1044496384,1044512767,EE -1044512768,1044578303,DK -1044578304,1044578623,GB -1044578624,1044578639,DE -1044578640,1044589055,GB -1044589056,1044589311,DE -1044589312,1044590689,GB -1044590690,1044590690,FR -1044590691,1044594303,GB -1044594304,1044594431,DE -1044594432,1044625631,GB -1044625632,1044625647,RS -1044625648,1044627391,GB -1044627392,1044627455,ES -1044627456,1044636671,GB -1044636672,1044637695,DE -1044637696,1044638463,GB -1044638464,1044638719,DE -1044638720,1044640767,GB -1044640768,1044642815,DE -1044642816,1044643839,GB -1044643840,1044652031,DE -1044652032,1044660223,LY -1044660224,1044668415,GR -1044668416,1044676607,BA -1044676608,1044684799,RU -1044684800,1044685158,GG -1044685159,1044685159,JE -1044685160,1044692422,GG -1044692423,1044692423,IM -1044692424,1044692991,GG -1044692992,1044697087,AT -1044697088,1044697343,DE -1044697344,1044698111,AT -1044698112,1044698367,DE -1044698368,1044698623,AT -1044698624,1044699135,DE -1044699136,1044701183,AT -1044701184,1044709375,EG -1044709376,1044717567,RU -1044717568,1044742143,GB -1044742144,1044744191,IT -1044744192,1044746239,GB -1044746240,1044748287,DE -1044748288,1044750335,DK -1044750336,1044758527,NL -1044758528,1044774911,PL -1044774912,1044840447,NO -1044840448,1044905983,FI -1044905984,1044908031,GB -1044908032,1044909055,US -1044909056,1044910847,GB -1044910848,1044911103,DE -1044911104,1044913951,GB -1044913952,1044913967,DE -1044913968,1044913983,GB -1044913984,1044914015,DE -1044914016,1044914047,GB -1044914048,1044914111,DE -1044914112,1044916735,GB -1044916736,1044917247,DE -1044917248,1044917279,GB -1044917280,1044917295,US -1044917296,1044917311,DE -1044917312,1044917343,GB -1044917344,1044917359,DE -1044917360,1044917503,GB -1044917504,1044917759,DE -1044917760,1044917823,GB -1044917824,1044918271,DE -1044918272,1044918287,GB -1044918288,1044919295,DE -1044919296,1044920191,GB -1044920192,1044920319,DE -1044920320,1044921343,GB -1044921344,1044922367,US -1044922368,1044930559,DE -1044930560,1044931231,GB -1044931232,1044931239,BE -1044931240,1044932303,GB -1044932304,1044932311,BE -1044932312,1044933499,GB -1044933500,1044933503,BE -1044933504,1044935119,GB -1044935120,1044935135,BE -1044935136,1044935183,GB -1044935184,1044935191,BE -1044935192,1044936115,GB -1044936116,1044936119,BE -1044936120,1044936487,GB -1044936488,1044936495,BE -1044936496,1044936735,GB -1044936736,1044936743,BE -1044936744,1044937247,GB -1044937248,1044937255,BE -1044937256,1044938503,GB -1044938504,1044938511,LU -1044938512,1044938679,GB -1044938680,1044938687,LU -1044938688,1044946943,GB -1044946944,1044955135,UA -1044955136,1044963327,NL -1044963328,1044971519,FI -1044971520,1044973567,FR -1044973568,1044974079,GB -1044974080,1044979711,FR -1044979712,1044987903,FI -1044987904,1045004287,BG -1045004288,1045018787,GB -1045018788,1045018799,ES -1045018800,1045020671,GB -1045020672,1045037055,NO -1045037056,1045119231,GR -1045119232,1045119743,AL -1045119744,1045135359,GR -1045135360,1045162147,FR -1045162148,1045162151,DE -1045162152,1045168127,FR -1045168128,1045171199,RU -1045171200,1045171455,UA -1045171456,1045233663,RU -1045233664,1045241855,GB -1045241856,1045250047,IT -1045250048,1045266431,CZ -1045266432,1045268479,HU -1045268480,1045270527,MK -1045270528,1045274623,HU -1045274624,1045282815,IE -1045282816,1045299199,HU -1045299200,1045307391,US -1045307392,1045315583,RU -1045315584,1045319679,DE -1045319680,1045323775,RU -1045323776,1045364735,FI -1045364736,1045430271,DK -1045430272,1045446655,DE -1045446656,1045453823,HU -1045453824,1045454847,SK -1045460992,1045461503,FR -1045461632,1045461695,FR -1045462016,1045463039,DE -1045463040,1045471231,FI -1045471232,1045479423,UA -1045479424,1045487615,SE -1045487616,1045495807,LT -1045495808,1045692415,ES -1045692416,1045700607,LV -1045700608,1045708799,KZ -1045708800,1045716991,LB -1045716992,1045725183,RU -1045725184,1045733375,CZ -1045733376,1045745420,GB -1045745421,1045745421,SE -1045745422,1045748319,GB -1045748320,1045748351,SE -1045748352,1045749759,GB -1045749760,1045753855,SI -1045753856,1045755903,NL -1045755904,1045757951,UA -1045757952,1045790719,LV -1045790720,1045798911,FR -1045798912,1045889023,IT -1045889024,1045921791,ES -1045921792,1045954559,PL -1045954560,1045987327,BE -1045987328,1046020095,SE -1046020096,1046028287,AM -1046028288,1046036479,NO -1046036480,1046052863,PL -1046052864,1046061055,GB -1046061056,1046069247,DE -1046069248,1046075391,RU -1046075392,1046077439,KZ -1046077440,1046085631,RU -1046085632,1046151167,IL -1046151168,1046216703,DE -1046216704,1046225647,NO -1046225648,1046225655,SE -1046225656,1046282239,NO -1046282240,1046290431,DE -1046290432,1046298623,PL -1046298624,1046315007,AT -1046315008,1046315519,FR -1046315520,1046316031,IT -1046316032,1046316543,FR -1046316544,1046317055,DK -1046317056,1046317567,GB -1046317568,1046318079,NL -1046318080,1046319103,GB -1046319104,1046320127,NL -1046320128,1046321151,GB -1046321152,1046323199,NL -1046323200,1046331391,ES -1046347776,1046413311,IT -1046413312,1046446079,SE -1046446080,1046478879,DE -1046478880,1046479839,GB -1046479840,1046479871,DE -1046479872,1046481919,GB -1046481920,1046481927,DE -1046481928,1046482951,GB -1046482952,1046482952,DE -1046482953,1046483199,GB -1046483200,1046483231,DE -1046483232,1046484607,GB -1046484608,1046484615,DE -1046484616,1046484711,GB -1046484712,1046484719,DE -1046484720,1046485303,GB -1046485304,1046485311,DE -1046485312,1046485903,GB -1046485904,1046485911,DE -1046485912,1046487289,GB -1046487290,1046487290,DE -1046487291,1046488913,GB -1046488914,1046488914,DE -1046488915,1046489087,GB -1046489088,1046489119,DE -1046489120,1046489311,GB -1046489312,1046489327,ES -1046489328,1046489391,GB -1046489392,1046489407,IT -1046489408,1046489471,GB -1046489472,1046489487,ES -1046489488,1046489503,GB -1046489504,1046489519,DE -1046489520,1046489975,GB -1046489976,1046489983,DE -1046489984,1046489999,GB -1046490000,1046490007,DE -1046490008,1046492471,GB -1046492472,1046492479,DE -1046492480,1046492719,GB -1046492720,1046492727,DE -1046492728,1046493015,GB -1046493016,1046493023,DE -1046493024,1046493039,GB -1046493040,1046493047,DE -1046493048,1046493063,GB -1046493064,1046493071,DE -1046493072,1046493983,GB -1046493984,1046493999,DE -1046494000,1046494191,GB -1046494192,1046494199,DE -1046494200,1046495127,GB -1046495128,1046495135,DE -1046495136,1046495415,GB -1046495416,1046495423,DE -1046495424,1046495607,GB -1046495608,1046495615,DE -1046495616,1046495719,GB -1046495720,1046495727,DE -1046495728,1046495767,GB -1046495768,1046495775,DE -1046495776,1046495911,GB -1046495912,1046495919,DE -1046495920,1046495983,GB -1046495984,1046495991,DE -1046495992,1046497807,GB -1046497808,1046497815,DE -1046497816,1046498135,GB -1046498136,1046498143,DE -1046498144,1046498215,GB -1046498216,1046498223,DE -1046498224,1046498303,GB -1046498304,1046498319,DE -1046498320,1046498687,GB -1046498688,1046498695,DE -1046498696,1046498799,GB -1046498800,1046498807,DE -1046498808,1046500735,GB -1046500736,1046500743,DE -1046500744,1046502106,GB -1046502107,1046502108,DE -1046502109,1046503095,GB -1046503096,1046503103,DE -1046503104,1046504447,GB -1046504448,1046508543,DE -1046508544,1046511815,GB -1046511816,1046511823,DE -1046511824,1046512583,GB -1046512584,1046512599,DE -1046512600,1046514687,GB -1046514688,1046515711,DE -1046515712,1046518359,GB -1046518360,1046518367,DE -1046518368,1046518911,GB -1046518912,1046518975,DE -1046518976,1046524215,GB -1046524216,1046524223,DE -1046524224,1046524487,GB -1046524488,1046524495,DE -1046524496,1046524615,GB -1046524616,1046524623,DE -1046524624,1046524647,GB -1046524648,1046524655,DE -1046524656,1046525351,GB -1046525352,1046525359,DE -1046525360,1046525439,GB -1046525440,1046525695,DE -1046525696,1046528335,GB -1046528336,1046528391,DE -1046528392,1046528505,GB -1046528506,1046528506,DE -1046528507,1046528535,GB -1046528536,1046528543,DE -1046528544,1046529023,GB -1046529024,1046530047,DE -1046530048,1046530973,GB -1046530974,1046530974,DE -1046530975,1046531839,GB -1046531840,1046532095,DE -1046532096,1046533375,GB -1046533376,1046533383,DE -1046533384,1046533537,GB -1046533538,1046533538,DE -1046533539,1046533615,GB -1046533616,1046533631,DE -1046533632,1046535447,GB -1046535448,1046535448,DE -1046535449,1046535623,GB -1046535624,1046535631,DE -1046535632,1046535665,GB -1046535666,1046535666,DE -1046535667,1046535967,GB -1046535968,1046535999,DE -1046536000,1046536063,GB -1046536064,1046536095,DE -1046536096,1046536511,GB -1046536512,1046536543,DE -1046536544,1046536631,GB -1046536632,1046536639,DE -1046536640,1046537023,GB -1046537024,1046537039,DE -1046537040,1046539615,GB -1046539616,1046539623,DE -1046539624,1046539887,GB -1046539888,1046539895,DE -1046539896,1046540527,GB -1046540528,1046540543,SE -1046540544,1046542807,GB -1046542808,1046542815,DE -1046542816,1046542831,GB -1046542832,1046542847,DE -1046542848,1046543209,GB -1046543210,1046543210,DE -1046543211,1046543343,GB -1046543344,1046543359,DE -1046543360,1046544383,GB -1046544384,1046560767,IT -1046560768,1046585343,ES -1046585344,1046609919,NO -1046609920,1046675455,IT -1046675456,1046708223,ES -1046708224,1046740991,AT -1046740992,1046757375,NL -1046757376,1046765567,IT -1046765568,1046773759,ES -1046773760,1046781951,FR -1046781952,1046791167,GB -1046791168,1046792191,IT -1046792192,1046792192,IN -1046792193,1046792447,US -1046792448,1046792448,IN -1046792449,1046793215,US -1046793216,1046794239,GB -1046794240,1046794495,MX -1046794496,1046795007,US -1046795008,1046796287,GB -1046796288,1046797311,US -1046797312,1046798335,GB -1046798336,1046806527,HU -1046806528,1046814719,IT -1046814720,1046822911,SE -1046822912,1046839295,IT -1046839296,1046847487,BA -1046847488,1046855679,ES -1046855680,1046872063,NO -1046896640,1046904831,GB -1046904832,1046908927,IR -1046908928,1046910975,SE -1046910976,1046913023,IT -1046913024,1046921215,NO -1046921216,1046929407,DE -1046929408,1046937599,FR -1046937600,1047003135,GR -1047003136,1047068671,DE -1047068672,1047085055,RU -1047085056,1047101439,GB -1047101440,1047109631,RU -1047109632,1047117823,GB -1047117824,1047134207,NL -1047134208,1047150591,FI -1047150592,1047158783,FR -1047158784,1047166975,RU -1047166976,1047199743,FR -1047199744,1047265279,DK -1047265280,1047273471,NL -1047273472,1047281663,DE -1047281664,1047289855,TR -1047289856,1047298047,RS -1047298048,1047300095,CH -1047300096,1047301119,GB -1047301120,1047306239,CH -1047306240,1047314431,PL -1047314432,1047322623,SE -1047322624,1047330815,IT -1047330816,1047339007,RU -1047339008,1047340863,SE -1047340864,1047340927,NO -1047340928,1047342879,SE -1047342880,1047342887,FI -1047342888,1047346431,SE -1047346432,1047346687,FI -1047346688,1047347199,SE -1047347200,1047363583,DE -1047363584,1047371775,CZ -1047371776,1047373559,RU -1047373560,1047373567,FI -1047373568,1047379967,RU -1047379968,1047396351,NL -1047396352,1047461887,IT -1047461888,1047494655,DE -1047494656,1047527423,PL -1047527424,1047529471,US -1047529472,1047530495,NL -1047530496,1047531007,GB -1047531008,1047533567,BE -1047533568,1047534847,DE -1047534848,1047535103,BE -1047535104,1047535359,US -1047535360,1047535615,BE -1047535616,1047551999,DE -1047552000,1047560191,RU -1047560192,1047563431,DE -1047563432,1047563435,CH -1047563436,1047565279,DE -1047565280,1047565311,CH -1047565312,1047565343,DE -1047565344,1047565359,CH -1047565360,1047565839,DE -1047565840,1047565887,CH -1047565888,1047566435,DE -1047566436,1047566439,CH -1047566440,1047566451,DE -1047566452,1047566459,CH -1047566460,1047566519,DE -1047566520,1047566527,CH -1047566528,1047566531,DE -1047566532,1047566535,CH -1047566536,1047566543,DE -1047566544,1047566547,CH -1047566548,1047566967,DE -1047566968,1047566971,CH -1047566972,1047567015,DE -1047567016,1047567019,CH -1047567020,1047567027,DE -1047567028,1047567031,CH -1047567032,1047567143,DE -1047567144,1047567147,CH -1047567148,1047567151,DE -1047567152,1047567159,CH -1047567160,1047567359,DE -1047567360,1047567375,CH -1047567376,1047567467,DE -1047567468,1047567471,CH -1047567472,1047567475,DE -1047567476,1047567483,CH -1047567484,1047567823,DE -1047567824,1047567839,CH -1047567840,1047567903,DE -1047567904,1047567935,CH -1047567936,1047568383,DE -1047568384,1047576575,NL -1047576576,1047584767,HU -1047584768,1047592959,NL -1047592960,1047601151,BA -1047601152,1047625727,RU -1047625728,1047633919,NO -1047633920,1047642111,FI -1047642112,1047658495,DE -1047658496,1047724031,EG -1047728128,1047732223,SE -1047735770,1047735770,DE -1047736552,1047736553,US -1047740544,1047740671,DE -1047758911,1047758911,CZ -1047759119,1047759119,AT -1047759125,1047759125,AT -1047759754,1047759754,FR -1047759834,1047759834,CZ -1047763266,1047763267,SE -1047781856,1047781871,DE -1047782690,1047782690,GB -1047787520,1047787775,ES -1047788288,1047788543,NL -1047789568,1047822335,AT -1047822336,1047838719,DE -1047838720,1047846911,DK -1047846912,1047855103,SE -1047855104,1047863295,DE -1047863296,1047871487,EG -1047871488,1047887871,RU -1047887872,1047920639,ES -1047920640,1047986175,RU -1047986176,1048051711,SE -1048051712,1048117247,SA -1048117248,1048125439,GB -1048125440,1048133631,FI -1048133632,1048150015,RO -1048150016,1048158207,PL -1048158208,1048166399,DK -1048166400,1048182783,CH -1048182784,1048184831,UA -1048184832,1048186879,FR -1048186880,1048188927,LV -1048193024,1048195071,US -1048195072,1048197119,RU -1048197120,1048201215,UA -1048203264,1048205311,DE -1048205312,1048209407,RU -1048209408,1048211455,UA -1048211456,1048215551,PL -1048215552,1048221695,RU -1048221696,1048223743,UA -1048223744,1048225791,DK -1048225792,1048227839,CZ -1048227840,1048233983,RU -1048233984,1048236031,UA -1048236032,1048238079,RU -1048242176,1048244223,PL -1048244224,1048246271,RU -1048246272,1048248319,NO -1048248320,1048313855,IT -1048313856,1048338431,GB -1048338432,1048346623,US -1048346624,1048510463,GB -1048510464,1048575999,SE -1048576000,1048584191,DE -1048584192,1048592383,IL -1048592384,1048600575,IT -1048600576,1048601599,UA -1048601600,1048602111,RU -1048602112,1048602623,PL -1048602624,1048603135,RU -1048603136,1048603391,UA -1048603392,1048603647,LV -1048603648,1048604944,UA -1048604945,1048604945,LT -1048604946,1048608767,UA -1048608768,1048616959,GB -1048616960,1048619007,US -1048619008,1048621055,GB -1048621056,1048621056,DE -1048621057,1048625151,US -1048625152,1048633343,GB -1048633344,1048641535,NO -1048641536,1048649727,FR -1048649728,1048657919,CZ -1048657920,1048674303,GB -1048674304,1048682495,NL -1048682496,1048690687,FR -1048690688,1048707071,PL -1048707072,1048772607,GB -1048772608,1048903679,NL -1048903680,1048911871,GB -1048920064,1048936447,NL -1048936448,1048944639,PL -1048944640,1048952831,RU -1048952832,1048969215,NL -1048979712,1048980223,DE -1048982888,1048982943,DE -1048987480,1048987487,DE -1048991960,1048991967,DE -1048992528,1048992535,DE -1048992608,1048992623,DE -1048992640,1048992703,DE -1049006080,1049006335,DE -1049008128,1049009151,DE -1049016320,1049022463,DE -1049026816,1049029375,DE -1049030656,1049031679,DE -1049031744,1049031871,DE -1049032094,1049032094,DE -1049034752,1049067519,EG -1049067520,1049100287,DK -1049100288,1049231359,GB -1049231360,1049235144,DE -1049235145,1049235145,FR -1049235146,1049266175,DE -1049266176,1049268223,ES -1049268224,1049296895,DE -1049296896,1049362431,EG -1049362432,1049366527,GB -1049366528,1049368575,DE -1049368576,1049368656,GB -1049368657,1049368657,DE -1049368658,1049369983,GB -1049369984,1049370047,DE -1049370048,1049370623,GB -1049370624,1049378815,AT -1049378816,1049395199,EG -1049395200,1049411583,NL -1049411584,1049419775,GB -1049419776,1049423615,RU -1049423616,1049423856,UA -1049423857,1049423857,RU -1049423858,1049423871,UA -1049423872,1049427967,RU -1049427968,1049436159,CZ -1049436160,1049444351,DE -1049444352,1049460735,RU -1049460736,1049468927,NO -1049468928,1049477119,DE -1049477120,1049493503,PL -1049493504,1049559039,FI -1049559040,1049698303,DE -1049698304,1049700351,NL -1049700352,1049702399,DE -1049702400,1049706495,NL -1049706496,1049722879,GB -1049722880,1049731071,IS -1049731072,1049739263,FI -1049739264,1049755647,NL -1049755648,1049794559,DE -1049794560,1049795583,CH -1049795584,1049821183,DE -1049821184,1049886719,FR -1049886720,1049894911,RU -1049894912,1049903103,NO -1049903104,1049911295,PL -1049911296,1049919487,FI -1049919488,1049927679,RU -1049927680,1049935871,NL -1049935872,1049944063,FI -1049944064,1049952255,RU -1049952256,1049960447,UA -1049960448,1049968639,GB -1049968640,1049985023,SA -1049985024,1050017791,IT -1050017792,1050083327,KW -1050083328,1050128383,ES -1050128384,1050130431,US -1050130432,1050148863,ES -1050148864,1050157055,CY -1050157056,1050173439,RU -1050173440,1050181631,IT -1050181632,1050189823,PL -1050189824,1050198015,DE -1050198016,1050206207,RU -1050206208,1050214399,SK -1050214400,1050470911,DE -1050470912,1050471031,GB -1050471032,1050471039,DE -1050471040,1050471167,GB -1050471168,1050673151,DE -1050673152,1050804223,FR -1050804224,1050869759,MK -1050869760,1050935295,NL -1050938112,1050938623,ES -1050938880,1050939135,ES -1050939136,1050939647,BR -1050939648,1050940159,MX -1050940160,1050940671,GB -1050940672,1050940927,HK -1050941696,1050941951,DE -1050941952,1050942207,US -1050942464,1050942719,US -1050942720,1050942975,BR -1050943232,1050943487,ES -1050945536,1050945791,ES -1050948608,1050948863,ES -1050959872,1050961919,ES -1050961920,1050962943,MX -1050962944,1050963967,GB -1050963968,1050964991,ES -1050968064,1051000831,GB -1051000832,1051017215,RU -1051017216,1051033599,NL -1051033600,1051049983,FI -1051049984,1051066367,HU -1051066368,1051115519,NL -1051115520,1051117055,BE -1051117056,1051117567,NL -1051117568,1051123711,BE -1051123712,1051125471,NL -1051125472,1051125479,BE -1051125480,1051131903,NL -1051131904,1051197439,CH -1051197440,1051213823,CZ -1051213824,1051230207,SK -1051230208,1051238399,SE -1051238400,1051246591,GE -1051246592,1051254783,DE -1051254784,1051262975,RU -1051262976,1051271167,DE -1051271168,1051279359,IT -1051279360,1051295743,PT -1051295744,1051303935,GB -1051303936,1051312127,SK -1051312128,1051328511,GR -1051328512,1051394047,IT -1051394048,1051525119,GB -1051525120,1051533311,MT -1051533312,1051541503,NG -1051541504,1051557887,GB -1051557888,1051566079,RU -1051566080,1051574271,IT -1051574272,1051590655,GB -1051590656,1051721727,ES -1051721728,1051729919,RU -1051729920,1051738111,FI -1051738112,1051754495,BG -1051754496,1051762687,DE -1051762688,1051770879,SK -1051770880,1051779071,NO -1051779072,1051787263,DE -1051787264,1051795455,IT -1051795456,1051803647,RU -1051803648,1051820031,CZ -1051820032,1051852799,NL -1051852800,1051918335,AT -1051918336,1051922431,PL -1051922432,1051924479,CH -1051924480,1051948031,NL -1051948032,1051949055,CH -1051949056,1051983871,NL -1051984664,1051984671,DE -1051984752,1051984767,DE -1051990016,1051991039,DE -1052001280,1052002303,DE -1052011264,1052012287,DE -1052017536,1052017567,DE -1052041216,1052041471,DE -1052043216,1052043231,DE -1052045312,1052046079,DE -1052049408,1052057599,PL -1052057600,1052065791,RU -1052065792,1052082175,SE -1052082176,1052090367,DE -1052090368,1052098559,PL -1052098560,1052116991,SE -1052116992,1052119039,RU -1052119040,1052121087,GB -1052121088,1052125183,RU -1052127232,1052129279,RU -1052129280,1052131327,BE -1052131328,1052133375,UA -1052133376,1052135423,RU -1052135424,1052137471,UA -1052137472,1052139519,RU -1052141056,1052141567,DE -1052141568,1052143615,PL -1052143616,1052145663,BG -1052145664,1052147711,UA -1052147712,1052151807,RU -1052151808,1052153855,PL -1052155904,1052157951,UA -1052157952,1052159999,DK -1052160000,1052162047,LU -1052162048,1052164095,CH -1052164096,1052168191,RU -1052168192,1052170239,PL -1052170240,1052172287,SE -1052172288,1052174335,PL -1052174336,1052176383,CZ -1052176384,1052178943,NL -1052178944,1052180479,DK -1052180480,1052213247,RU -1052213248,1052246015,FI -1052246016,1052247039,DE -1052247040,1052247295,FR -1052247296,1052247359,DE -1052247360,1052247391,FR -1052247392,1052247407,DE -1052247408,1052247415,GB -1052247416,1052247423,NL -1052247424,1052247551,GB -1052247552,1052248095,DE -1052248096,1052248127,ZA -1052248128,1052248135,FR -1052248136,1052248143,DE -1052248144,1052248159,BE -1052248160,1052249375,DE -1052249376,1052249407,IT -1052249408,1052249471,DE -1052249472,1052249503,ZA -1052249504,1052250655,DE -1052250656,1052250687,GB -1052250688,1052250719,IL -1052250720,1052250735,IT -1052250736,1052250751,NL -1052250752,1052252863,DE -1052252864,1052252879,GB -1052252880,1052252895,ZA -1052252896,1052252927,IT -1052252928,1052254207,DE -1052254208,1052255255,NL -1052255256,1052255263,GB -1052255264,1052255871,NL -1052255872,1052255935,GB -1052255936,1052257279,NL -1052257280,1052257791,FR -1052257792,1052258303,AT -1052258304,1052260623,FR -1052260624,1052260631,ZA -1052260632,1052260639,AT -1052260640,1052260735,FR -1052260736,1052260863,NL -1052260864,1052260895,TR -1052260896,1052261055,FR -1052261056,1052261119,NL -1052261120,1052262399,FR -1052262400,1052263423,DK -1052263424,1052263935,DE -1052263936,1052264447,DK -1052264448,1052264639,SE -1052264640,1052264703,IT -1052264704,1052265471,SE -1052265472,1052265519,IT -1052265520,1052265535,GB -1052265536,1052265599,DE -1052265600,1052265983,IT -1052265984,1052266239,DE -1052266240,1052266495,GB -1052266496,1052268543,BE -1052268544,1052268607,ZA -1052268608,1052268671,BE -1052268672,1052268703,IT -1052268704,1052268719,ZA -1052268720,1052268735,NL -1052268736,1052268799,DE -1052268800,1052270591,ZA -1052270592,1052271871,FR -1052271872,1052272127,BE -1052272128,1052272543,FR -1052272544,1052272575,AT -1052272576,1052272639,SE -1052272640,1052274175,FR -1052274176,1052274687,ZA -1052274688,1052274943,ES -1052274944,1052275199,IT -1052275200,1052275711,AT -1052275712,1052276735,GB -1052276736,1052278207,IT -1052278208,1052278271,GB -1052278272,1052278783,IT -1052278784,1052278823,CH -1052278824,1052278831,GB -1052278832,1052278847,AT -1052278848,1052278863,ZA -1052278864,1052278879,NL -1052278880,1052284607,GB -1052284672,1052286975,GB -1052286976,1052287487,CH -1052287488,1052288255,SE -1052288288,1052288295,IL -1052288296,1052288303,BE -1052288304,1052288319,AT -1052288384,1052288511,FR -1052288512,1052289023,AT -1052289024,1052289151,GB -1052289152,1052289183,CH -1052289184,1052289215,DE -1052289216,1052289279,GB -1052289536,1052290047,GB -1052290048,1052290063,CH -1052290064,1052290303,GB -1052290368,1052290399,CH -1052290400,1052290431,ZA -1052290432,1052290559,FR -1052290560,1052290575,GB -1052290576,1052290591,BE -1052290592,1052290639,GB -1052290640,1052290655,ZA -1052290656,1052290687,DE -1052290688,1052290815,GB -1052290816,1052290831,CH -1052290832,1052291327,GB -1052291328,1052291583,CH -1052291584,1052291679,FI -1052291680,1052291687,TR -1052291688,1052291695,GB -1052291696,1052291711,CH -1052291712,1052292095,FR -1052292096,1052299263,GB -1052299776,1052303359,GB -1052303360,1052307455,DE -1052307456,1052309247,CH -1052309248,1052309503,NO -1052309504,1052310527,CH -1052310528,1052310783,FR -1052310784,1052311039,AT -1052311040,1052311551,GB -1052311552,1052311615,DE -1052311616,1052311679,BE -1052311680,1052311871,DE -1052311872,1052311895,BE -1052311896,1052311903,NL -1052311904,1052311935,IT -1052311936,1052311967,GB -1052311968,1052311999,DE -1052312000,1052312063,CH -1052312064,1052312767,DE -1052312832,1052312895,DE -1052312896,1052312903,CH -1052312904,1052312911,ES -1052312912,1052312927,CH -1052312928,1052313087,GB -1052313088,1052314751,DE -1052314752,1052314815,ES -1052314816,1052314823,GB -1052314824,1052314831,ES -1052314832,1052314847,IT -1052314848,1052315071,DE -1052315072,1052315103,IT -1052315104,1052315135,AT -1052315136,1052315551,DE -1052315552,1052315583,ES -1052315584,1052315647,GB -1052315648,1052316319,DE -1052316320,1052316335,NL -1052316336,1052316767,DE -1052316768,1052316799,IT -1052316800,1052316927,DE -1052317184,1052317599,DE -1052317600,1052317607,BE -1052317608,1052317615,DE -1052317616,1052317631,GB -1052317632,1052317663,IT -1052317664,1052318047,DE -1052318048,1052318079,ES -1052318080,1052318207,SE -1052318208,1052318719,DE -1052319232,1052319743,DE -1052320000,1052320079,GB -1052320080,1052320087,CZ -1052320088,1052320095,GB -1052320096,1052320127,ZA -1052320128,1052320255,BE -1052320256,1052322239,GB -1052322240,1052322303,CH -1052322304,1052323871,GB -1052323872,1052323903,CH -1052323904,1052324927,GB -1052324928,1052324943,ZA -1052324944,1052324959,NL -1052324960,1052324991,ES -1052324992,1052325191,GB -1052325192,1052325199,DE -1052325200,1052325215,AT -1052325216,1052325247,ZA -1052325248,1052325311,GB -1052325312,1052325375,NL -1052325376,1052325567,GB -1052325568,1052325631,ZA -1052325632,1052327935,GB -1052327936,1052328223,CH -1052328224,1052328255,IT -1052328256,1052328319,ES -1052328320,1052328447,DE -1052328448,1052328639,CH -1052328640,1052328671,ZA -1052328672,1052328703,ES -1052328704,1052329983,CH -1052329984,1052330239,DE -1052330240,1052331167,CH -1052331168,1052331183,GB -1052331184,1052331199,CH -1052331200,1052331263,GB -1052331264,1052331615,CH -1052331616,1052331647,AT -1052331648,1052331711,CH -1052331712,1052331743,GB -1052331744,1052332031,CH -1052332032,1052333103,IT -1052333104,1052333119,CH -1052333120,1052333183,FR -1052333184,1052333311,ZA -1052333568,1052334751,IT -1052334752,1052334759,NL -1052334760,1052334767,ZA -1052334768,1052334815,GB -1052334816,1052334847,ZA -1052334848,1052335423,IT -1052335424,1052335455,NL -1052335456,1052335519,ES -1052335520,1052335535,ZA -1052335536,1052335551,DE -1052335552,1052335615,AT -1052335616,1052336127,BE -1052336128,1052336255,FR -1052336256,1052336383,GB -1052336384,1052337343,FR -1052337344,1052337375,DE -1052337376,1052337759,FR -1052337760,1052337887,GB -1052337888,1052337903,ZA -1052337904,1052337911,NL -1052337912,1052337919,ZA -1052337920,1052340111,FR -1052340112,1052340127,ES -1052340128,1052340135,NL -1052340136,1052340223,FR -1052340224,1052340527,AT -1052340528,1052340543,BE -1052340544,1052340575,IT -1052340576,1052340607,NL -1052340608,1052340671,HU -1052340672,1052340703,GB -1052340704,1052340719,ZA -1052340720,1052340735,GB -1052340736,1052340767,AT -1052340768,1052340799,DE -1052340800,1052340863,GB -1052340864,1052341247,AT -1052341248,1052341503,DE -1052341504,1052342271,AT -1052342272,1052342303,SE -1052342304,1052342335,CH -1052342336,1052342463,SE -1052342464,1052342471,ZA -1052342472,1052342479,GB -1052342480,1052342495,ZA -1052342496,1052342527,FR -1052342528,1052343647,CH -1052343648,1052343655,NL -1052343656,1052343663,GB -1052343664,1052343679,DE -1052343680,1052344319,CH -1052344320,1052344863,NL -1052344864,1052344895,ES -1052344896,1052344959,IT -1052344960,1052345087,CH -1052345088,1052345135,NL -1052345136,1052345151,GB -1052345152,1052345247,FR -1052345248,1052345279,IT -1052345280,1052345343,DE -1052345344,1052345471,NL -1052345488,1052345503,NL -1052345504,1052345535,ZA -1052345536,1052345551,AT -1052345552,1052345567,GB -1052345568,1052345631,NL -1052345632,1052345663,IT -1052345664,1052345695,HU -1052345696,1052345727,PT -1052345728,1052345855,AT -1052345856,1052346903,NL -1052346904,1052346911,BE -1052346912,1052346943,ZA -1052346944,1052347007,ES -1052347008,1052347135,DE -1052347136,1052347391,NL -1052347392,1052348415,CH -1052348416,1052348799,GB -1052348800,1052348831,DE -1052348832,1052348863,CH -1052348864,1052348879,DE -1052348880,1052348895,GB -1052348896,1052348927,DE -1052348928,1052349055,GB -1052349120,1052349151,BE -1052349152,1052349343,GB -1052349344,1052349375,DE -1052349376,1052349407,GB -1052349408,1052349439,ZA -1052349440,1052352559,GB -1052352560,1052352591,ZA -1052352592,1052352607,GB -1052352640,1052352703,GB -1052352704,1052352767,DE -1052352768,1052352927,GB -1052352928,1052352959,IT -1052352960,1052352991,ES -1052352992,1052353023,BE -1052353024,1052353279,IT -1052353280,1052353407,DE -1052353536,1052354111,DE -1052354112,1052354175,TR -1052354176,1052354559,DE -1052354560,1052356607,GB -1052356608,1052356703,ZA -1052356704,1052356735,ES -1052356736,1052356799,RU -1052356800,1052356863,IE -1052356864,1052358479,ZA -1052358480,1052358495,GB -1052358496,1052358511,AT -1052358512,1052358527,ZA -1052358528,1052358655,DE -1052358656,1052359839,ZA -1052359840,1052359871,IE -1052359872,1052359935,IT -1052359936,1052360735,ZA -1052360736,1052360743,GB -1052360744,1052360767,ZA -1052360768,1052360783,DE -1052360784,1052360831,IT -1052360832,1052360959,GB -1052360960,1052360991,FR -1052360992,1052361023,BE -1052361024,1052361039,ZA -1052361040,1052361055,NL -1052361056,1052361087,DE -1052361088,1052361151,ES -1052361152,1052361215,GB -1052361216,1052361471,ZA -1052361472,1052361647,BE -1052361648,1052361655,GB -1052361656,1052361663,DE -1052361664,1052361695,BE -1052361696,1052361727,CH -1052361728,1052361919,IT -1052361920,1052361951,ZA -1052361952,1052361967,IT -1052361968,1052361983,ZA -1052361984,1052362239,IT -1052362240,1052362751,DK -1052362752,1052362783,ES -1052362784,1052362815,GB -1052362816,1052362879,CH -1052362880,1052363039,ES -1052363072,1052363135,GB -1052363136,1052363263,ES -1052363264,1052364543,DE -1052364544,1052364671,BE -1052364672,1052364687,DE -1052364688,1052364695,GB -1052364696,1052364703,NL -1052364704,1052364799,GB -1052364800,1052366207,BE -1052366208,1052366271,IE -1052366272,1052366335,GB -1052366336,1052366655,BE -1052366656,1052366719,DE -1052366720,1052367871,BE -1052367872,1052368895,DK -1052368896,1052369023,IE -1052369024,1052369039,IT -1052369040,1052369055,DE -1052369056,1052369087,ZA -1052369088,1052369151,IT -1052369152,1052369407,IE -1052369408,1052369663,HU -1052369664,1052369855,CZ -1052369888,1052369919,CZ -1052369920,1052370175,NO -1052370176,1052370431,DK -1052370432,1052370559,SE -1052370560,1052370623,DE -1052370624,1052370687,IT -1052370688,1052370943,DK -1052370944,1052372255,GB -1052372256,1052372287,ZA -1052372288,1052372351,FI -1052372352,1052374015,GB -1052374016,1052375039,CH -1052375040,1052375551,DE -1052375680,1052375711,DE -1052375712,1052375807,FR -1052375808,1052376063,DE -1052376320,1052376831,DE -1052376832,1052377087,ES -1052377088,1052377535,DE -1052377536,1052377599,NO -1052377600,1052377743,FR -1052377744,1052377759,NL -1052377760,1052377791,ZA -1052377792,1052377855,GB -1052377856,1052377871,DE -1052377872,1052377887,CH -1052377920,1052377951,DE -1052377952,1052377983,FR -1052377984,1052378047,GB -1052378048,1052378079,FR -1052378080,1052378111,NL -1052378112,1052378983,DE -1052378984,1052378991,NO -1052378992,1052379031,GB -1052379032,1052379039,DE -1052379040,1052379103,GB -1052379104,1052379135,SE -1052379392,1052379791,DE -1052379792,1052379799,GB -1052379800,1052379807,NL -1052379808,1052379839,DE -1052379840,1052379903,ZA -1052379904,1052380063,GB -1052380064,1052380127,DE -1052380128,1052380159,NL -1052380160,1052381183,DE -1052381440,1052382623,DE -1052382656,1052382719,ES -1052382720,1052382975,DE -1052382976,1052383999,GB -1052384000,1052384255,NL -1052384256,1052385279,GB -1052385280,1052385535,DE -1052385536,1052385615,GB -1052385616,1052385631,ZA -1052385632,1052385695,GB -1052385696,1052385791,FR -1052385792,1052388863,GB -1052388864,1052389119,NL -1052389120,1052390431,GB -1052390432,1052390447,ZA -1052390448,1052390455,GB -1052390456,1052390463,IT -1052390464,1052393471,GB -1052393472,1052393599,CH -1052393600,1052393695,FR -1052393696,1052394271,CH -1052394272,1052394303,ZA -1052394304,1052394367,GB -1052394368,1052395263,CH -1052395264,1052395679,GB -1052395680,1052395743,DE -1052395744,1052395775,ES -1052395776,1052396031,NL -1052396032,1052396543,CH -1052396544,1052396607,SE -1052396608,1052396671,BE -1052396672,1052396799,SE -1052396800,1052396863,TR -1052396864,1052396927,RO -1052396928,1052397439,HU -1052397568,1052399039,IT -1052399040,1052399103,NO -1052399104,1052399903,IT -1052399904,1052399919,DE -1052399920,1052399927,NL -1052399928,1052399935,FR -1052399936,1052399999,IT -1052400000,1052400127,BE -1052400128,1052401151,IT -1052401152,1052401279,BE -1052401280,1052401311,IT -1052401312,1052401343,AT -1052401344,1052401407,ZA -1052401408,1052401599,BE -1052401600,1052401631,GB -1052401632,1052401663,RU -1052401664,1052402047,FR -1052402048,1052402175,NL -1052402176,1052402271,FR -1052402272,1052402303,IT -1052402304,1052402367,GB -1052402368,1052403359,FR -1052403360,1052403391,DE -1052403392,1052403407,IT -1052403408,1052403415,GB -1052403416,1052403423,NL -1052403424,1052403455,RO -1052403456,1052403727,FR -1052403728,1052403743,NL -1052403744,1052403775,FR -1052403776,1052403807,ZA -1052403840,1052403967,CH -1052403968,1052404383,FR -1052404384,1052404399,ZA -1052404400,1052404447,FR -1052404448,1052404479,GB -1052404480,1052404767,FR -1052404768,1052404783,ZA -1052404784,1052404799,GB -1052404800,1052404863,FR -1052404864,1052404991,GB -1052404992,1052405759,FR -1052405760,1052407519,AT -1052407520,1052407535,FR -1052407536,1052407551,SE -1052407552,1052407839,AT -1052407840,1052407871,ZA -1052407872,1052407887,DE -1052407888,1052407903,ZA -1052407904,1052407935,DE -1052407936,1052408159,AT -1052408160,1052408383,GB -1052408384,1052408447,BE -1052408448,1052408511,FR -1052408512,1052408575,GB -1052408576,1052408831,AT -1052408832,1052409855,GB -1052409856,1052409863,NL -1052409864,1052409871,DE -1052409872,1052409951,NL -1052409952,1052409983,BE -1052409984,1052410047,GB -1052410048,1052410111,BE -1052411136,1052412327,NL -1052412336,1052412343,NL -1052412344,1052412351,GB -1052412352,1052412415,CH -1052412672,1052412831,NL -1052412832,1052412863,DE -1052412864,1052413951,NL -1052413952,1052414335,CZ -1052414464,1052414975,IE -1052414976,1052415999,BE -1052416000,1052416575,DE -1052416576,1052416639,ZA -1052416640,1052416671,GB -1052416672,1052416703,DE -1052416704,1052416735,IT -1052416736,1052416767,DE -1052416768,1052417071,NO -1052417072,1052417087,DE -1052417088,1052417119,AT -1052417120,1052417151,IT -1052417152,1052417279,GB -1052417280,1052417359,NO -1052417368,1052417535,NO -1052417536,1052418047,ZA -1052418048,1052419583,BE -1052419584,1052420031,IT -1052420064,1052420095,IT -1052420096,1052420735,GB -1052420736,1052420767,DE -1052420768,1052420783,GB -1052420784,1052420799,ZA -1052420800,1052420863,DE -1052420864,1052422143,GB -1052422144,1052422847,ZA -1052422848,1052422863,SE -1052422864,1052422879,FR -1052422880,1052423199,ZA -1052423200,1052423231,CH -1052423232,1052423295,ZA -1052423304,1052423311,CH -1052423360,1052423423,NL -1052423424,1052423967,ZA -1052424000,1052424799,ZA -1052424800,1052424815,GB -1052424816,1052424823,ES -1052424824,1052424831,BE -1052424832,1052424959,GB -1052424960,1052425151,ZA -1052425152,1052425215,BE -1052425216,1052426239,ZA -1052426240,1052426319,PT -1052426328,1052426495,PT -1052426512,1052426527,FR -1052426752,1052427263,NL -1052427264,1052427839,CH -1052427840,1052427855,GB -1052427856,1052427871,IT -1052427872,1052427903,AT -1052427904,1052427967,DE -1052427968,1052428031,GB -1052428032,1052428287,CH -1052428288,1052428479,ES -1052428480,1052428543,BE -1052428544,1052429407,ES -1052429408,1052429439,FR -1052429440,1052429567,BE -1052429568,1052429759,ES -1052429760,1052429823,DE -1052429824,1052430335,ES -1052430336,1052430407,BE -1052430408,1052430415,ZA -1052430416,1052430431,FR -1052430432,1052430463,DE -1052430464,1052430527,BE -1052430528,1052430591,DE -1052430592,1052433407,BE -1052433408,1052433719,DK -1052433720,1052433727,FR -1052433728,1052433919,DK -1052433920,1052434431,ZA -1052434432,1052434751,GB -1052434752,1052434783,NO -1052434784,1052435455,GB -1052435456,1052435647,NL -1052435680,1052436479,NL -1052436480,1052437023,DE -1052437024,1052437055,ZA -1052437056,1052437119,DE -1052437120,1052437135,ZA -1052437136,1052437151,DE -1052437152,1052437183,GB -1052437184,1052437247,ZA -1052437248,1052437759,DE -1052437760,1052438015,CH -1052438016,1052438399,BE -1052438528,1052439503,AT -1052439520,1052439551,AT -1052439552,1052440575,FR -1052440576,1052441343,DE -1052441600,1052442623,GB -1052442624,1052443647,DE -1052446208,1052446719,DE -1052446720,1052447743,CZ -1052447744,1052447871,PL -1052448000,1052448127,PL -1052448256,1052450815,ZA -1052450816,1052451839,DE -1052451840,1052452159,NO -1052452224,1052452351,NO -1052452352,1052452831,ES -1052452832,1052452847,GB -1052452848,1052452863,FR -1052452992,1052452999,SK -1052453120,1052453375,FR -1052453376,1052453887,AT -1052453888,1052454911,GB -1052454912,1052454943,FR -1052454944,1052454959,NL -1052454976,1052455359,NL -1052455424,1052455935,GB -1052455936,1052456447,NL -1052456448,1052456959,CH -1052456960,1052457983,NL -1052457984,1052458367,AT -1052458432,1052458495,AT -1052458496,1052458847,NL -1052458848,1052458863,FR -1052458864,1052458871,NL -1052458872,1052458879,FR -1052458880,1052460031,GB -1052460032,1052460127,NO -1052460224,1052460287,FR -1052460544,1052460799,NO -1052460800,1052461055,DE -1052461056,1052461295,FR -1052461296,1052461311,BE -1052461312,1052461951,FR -1052461968,1052463103,FR -1052463104,1052463615,ES -1052463616,1052464639,GB -1052464640,1052464927,ES -1052464960,1052465087,ES -1052465152,1052465375,ZA -1052465408,1052465663,ZA -1052466432,1052468223,FR -1052468224,1052469247,GB -1052469248,1052470271,FR -1052470272,1052470783,ZA -1052470784,1052471007,FR -1052471040,1052471295,BE -1052471296,1052472319,GB -1052472448,1052472511,GB -1052472576,1052475231,GB -1052475240,1052475255,GB -1052475264,1052475391,GB -1052475392,1052476383,FR -1052476416,1052479487,FR -1052479488,1052479743,NL -1052479744,1052479999,DE -1052480000,1052483583,NL -1052483584,1052483999,IT -1052484032,1052485279,IT -1052485312,1052485631,IT -1052485632,1052486655,GB -1052486656,1052486911,CH -1052486912,1052486975,DE -1052486976,1052487039,FR -1052487040,1052487167,DE -1052487168,1052487423,GB -1052487424,1052487679,AT -1052487680,1052488703,CH -1052488704,1052489727,GB -1052489728,1052490239,IE -1052490240,1052490751,SE -1052490752,1052491679,AT -1052491688,1052491775,AT -1052491776,1052493567,BE -1052493696,1052494335,BE -1052494336,1052494591,NL -1052494592,1052495439,BE -1052495440,1052495487,FR -1052495488,1052495551,BE -1052495552,1052495583,GB -1052495584,1052495871,BE -1052495872,1052495879,UA -1052496128,1052497407,DE -1052497664,1052497919,DE -1052497920,1052498431,ES -1052498432,1052498495,RO -1052498944,1052499455,GB -1052499968,1052500191,DK -1052500208,1052500319,DK -1052500480,1052500991,GB -1052500992,1052501023,FI -1052501032,1052501039,FI -1052501120,1052501247,FI -1052501504,1052502015,CH -1052502016,1052502783,IE -1052502816,1052502847,IE -1052503040,1052504319,GB -1052504320,1052504351,BY -1052504384,1052507583,GB -1052507648,1052507775,GB -1052507904,1052704767,GB -1052704768,1052712959,NL -1052712960,1052770303,GB -1052770304,1052778495,CH -1052778496,1052786687,RU -1052786688,1052789759,GR -1052789760,1052803071,NL -1052803072,1052806655,DE -1052806656,1052807167,MW -1052807168,1052811263,DE -1052811264,1052819455,RU -1052819456,1052827647,DE -1052827648,1052835839,RU -1052835840,1052844031,IR -1052844032,1052852223,FR -1052852224,1052868607,EG -1052868608,1052876799,RS -1052884992,1052901375,FR -1052901376,1053032447,NL -1053032448,1053097983,IT -1053097984,1053106175,DE -1053106176,1053114367,GB -1053114368,1053130751,BE -1053130752,1053138943,NL -1053138944,1053147135,FI -1053147136,1053163519,SK -1053163520,1053294591,DK -1053294616,1053294623,AT -1053294656,1053294679,AT -1053295104,1053296639,AT -1053296896,1053297023,IT -1053297152,1053297663,IT -1053301056,1053301071,FR -1053302780,1053302783,FR -1053302784,1053303807,GB -1053310144,1053310207,SK -1053312872,1053312887,DK -1053312912,1053312927,DK -1053318912,1053318943,FI -1053325824,1053326335,DE -1053326504,1053326527,BE -1053326544,1053326551,BE -1053326556,1053326559,BE -1053329440,1053329471,ES -1053329516,1053329535,ES -1053332992,1053334015,BE -1053335552,1053336575,ZA -1053349376,1053349631,NL -1053349952,1053349967,IE -1053350408,1053350415,BE -1053350492,1053350495,BE -1053350500,1053350503,BE -1053350508,1053350515,BE -1053353408,1053353423,GB -1053360128,1053364223,ES -1053364224,1053368319,CZ -1053368320,1053376511,SE -1053376512,1053392895,HU -1053392896,1053401087,FR -1053401088,1053409279,DE -1053409280,1053425663,IQ -1053425664,1053556735,CH -1053556736,1053564927,FI -1053564928,1053573119,GB -1053573120,1053581311,NL -1053581312,1053589503,CH -1053589504,1053597695,BG -1053597696,1053605887,DE -1053605888,1053614079,ES -1053614080,1053622271,CZ -1053622272,1053630463,IT -1053630464,1053638655,GR -1053638656,1053655039,BE -1053655040,1053663231,UA -1053663232,1053671423,RU -1053671424,1053687807,LV -1053687808,1053753343,DE -1053753344,1053818879,NL -1053818880,1053819391,DE -1053819424,1053819439,DE -1053819520,1053819563,DE -1053819584,1053819647,DE -1053820160,1053820927,DE -1053821440,1053821447,GB -1053821568,1053821695,GB -1053824000,1053824007,DE -1053824016,1053824023,DE -1053824064,1053824095,DE -1053824128,1053824255,NL -1053825024,1053825791,ES -1053825792,1053825919,GB -1053825920,1053826047,ES -1053826816,1053827327,DE -1053827328,1053827583,BE -1053828096,1053829119,GB -1053831168,1053831423,DE -1053834944,1053834975,DE -1053835264,1053835775,DE -1053837440,1053837455,GB -1053837568,1053838335,GB -1053838336,1053838591,DE -1053839360,1053840383,DE -1053840400,1053840415,DE -1053840448,1053840511,DE -1053843200,1053843231,DK -1053843232,1053843455,GB -1053843712,1053843967,DE -1053843968,1053844223,GB -1053844224,1053844479,DE -1053844992,1053845503,DE -1053845728,1053845735,DE -1053846016,1053846527,DE -1053846784,1053847551,DE -1053847552,1053849599,GB -1053849600,1053850367,DE -1053851136,1053851647,DE -1053851904,1053851919,FR -1053852032,1053852047,IT -1053852112,1053852127,GB -1053852128,1053852159,DE -1053855744,1053859839,GB -1053859840,1053860863,DE -1053862848,1053862879,DE -1053863424,1053864959,DE -1053865216,1053865727,DE -1053865728,1053865759,US -1053865984,1053866239,DE -1053866240,1053866495,ES -1053866496,1053866823,DE -1053866832,1053866847,DE -1053867520,1053867775,DE -1053867976,1053867999,DE -1053868008,1053868015,DE -1053868032,1053868383,ES -1053868416,1053868447,ES -1053868448,1053868455,GB -1053868456,1053868479,ES -1053868480,1053868543,FR -1053868800,1053869567,DE -1053870080,1053870335,DE -1053870336,1053870591,GB -1053870848,1053871359,DE -1053871616,1053871871,DE -1053872384,1053872447,DE -1053872512,1053872639,FR -1053872896,1053873663,DE -1053876224,1053876479,DE -1053876480,1053876735,GB -1053876736,1053876991,DE -1053877248,1053878271,DE -1053878272,1053878783,GB -1053878784,1053879047,DE -1053879056,1053879071,DE -1053879104,1053879167,GB -1053879296,1053882111,DE -1053882368,1053882879,DE -1053882880,1053883391,GB -1053883392,1053884415,DE -1053884416,1053892607,BH -1053892608,1053900799,DE -1053900800,1053917183,NO -1053917184,1053925375,UZ -1053925376,1053927159,SE -1053927160,1053927199,FI -1053927200,1053933567,SE -1053933568,1053949951,CZ -1053949952,1053968188,FR -1053968189,1053968189,PT -1053968190,1053985279,FR -1053985280,1053985390,GB -1053985391,1053985391,FR -1053985392,1053985535,GB -1053985536,1054015487,FR -1054015488,1054089215,IT -1054089216,1054097407,GE -1054097408,1054105599,NL -1054105600,1054113791,FR -1054113792,1054121983,NL -1054121984,1054130175,AT -1054130176,1054138367,LT -1054138368,1054146559,AZ -1054146560,1054179327,RU -1054179328,1054180351,GB -1054180352,1054181120,DE -1054181121,1054181375,GB -1054181376,1054185216,DE -1054185217,1054185471,GB -1054185472,1054186240,DE -1054186241,1054186495,GB -1054186496,1054187264,DE -1054187265,1054187519,GB -1054187520,1054195711,FR -1054195712,1054212095,BE -1054212096,1054277631,DE -1054277632,1054343167,KW -1054343168,1054351359,NL -1054351360,1054359551,UA -1054359552,1054367743,RO -1054367744,1054375935,FI -1054375936,1054381571,GB -1054381572,1054381572,SG -1054381573,1054381587,GB -1054381588,1054381588,HK -1054381589,1054381619,GB -1054381620,1054381620,US -1054381621,1054384127,GB -1054384128,1054400511,DE -1054400512,1054408703,GB -1054408704,1054416895,FR -1054416896,1054425087,DE -1054425088,1054441471,GR -1054441472,1054449663,AZ -1054449664,1054457855,RU -1054457856,1054474239,RO -1054474240,1054539775,AT -1054539776,1054605311,IL -1054605312,1054613503,DE -1054613504,1054621695,RU -1054621696,1054629887,IT -1054629888,1054638079,IR -1054638080,1054646271,CH -1054646272,1054654463,SE -1054654464,1054662655,MK -1054662656,1054670847,FI -1054670848,1054671103,GB -1054671168,1054671231,IE -1054671372,1054671375,IE -1054671416,1054671423,IE -1054671432,1054671439,IE -1054672160,1054672175,IE -1054672256,1054672271,IE -1054672320,1054672335,US -1054672336,1054672367,IE -1054672384,1054672447,IE -1054672720,1054672727,IE -1054672744,1054672767,IE -1054672776,1054672783,IE -1054672792,1054672807,IE -1054673664,1054673727,IE -1054673856,1054673919,IE -1054673952,1054674047,IE -1054674080,1054674111,IE -1054674456,1054674471,IE -1054674480,1054674495,IE -1054674504,1054674511,IE -1054674520,1054674527,GB -1054674688,1054675199,IE -1054675456,1054675711,IE -1054675968,1054676223,US -1054679040,1054687231,UA -1054687232,1054703615,MD -1054703616,1054711807,BG -1054711808,1054719999,IT -1054720000,1054728191,NL -1054728192,1054728447,ES -1054728448,1054728703,IE -1054728704,1054728959,FR -1054728960,1054729215,IE -1054729216,1054729471,ES -1054729472,1054867455,NL -1054867456,1055129599,DE -1055129600,1055195135,CY -1055195136,1055203327,CH -1055211520,1055219711,PT -1055219712,1055223807,NL -1055223808,1055225855,LU -1055225856,1055227903,ES -1055232000,1055236095,NL -1055252480,1055256575,ES -1055260672,1055264767,SE -1055326208,1055334399,RU -1055334400,1055342591,IE -1055342592,1055358975,RO -1055358976,1055367167,GB -1055367168,1055375359,RU -1055375360,1055391743,OM -1055391744,1055457279,GB -1055457280,1055465471,BE -1055465472,1055473663,FR -1055473664,1055490047,GB -1055490048,1055522815,PL -1055522816,1055588351,CN -1055588352,1055653887,BE -1055653888,1055784959,FI -1055784960,1055850495,NL -1055850496,1055916031,GB -1055916032,1055924223,RS -1055924224,1055932415,LY -1055932416,1055940607,FI -1055940608,1055948799,EG -1055948800,1055956991,DE -1055956992,1055965183,CZ -1055965184,1055973375,CH -1055973376,1055981567,FR -1055981568,1055989759,IT -1055989760,1055997951,DE -1055997952,1056014335,FR -1056014336,1056022527,EG -1056022528,1056030719,GB -1056030720,1056047103,FI -1056047104,1056178175,DK -1056178176,1056194559,UA -1056194560,1056210943,FR -1056210944,1056219135,PL -1056219136,1056227327,GB -1056227328,1056243711,TR -1056243712,1056251903,CH -1056251904,1056260095,RU -1056260096,1056276479,CZ -1056276480,1056374783,DE -1056374784,1056440319,SE -1056440320,1056473087,TR -1056473088,1056505855,FI -1056505856,1056514047,PT -1056514048,1056522239,IT -1056522240,1056538623,AT -1056538624,1056546815,RU -1056546816,1056555007,NO -1056555008,1056571391,GB -1056571392,1056669695,NL -1056669696,1056702463,MA -1056702464,1056874751,GB -1056874752,1056874943,IE -1056874944,1056874975,GB -1056874976,1056875007,IE -1056875008,1056964607,GB -1056964608,1061227263,US -1061227264,1061227519,BO -1061227520,1061558271,US -1061558272,1061559295,PK -1061559296,1061588735,US -1061588736,1061588991,GU -1061588992,1061853695,US -1061853696,1061854207,GB -1061854208,1061939711,US -1061939712,1061940223,JM -1061940224,1062069247,US -1062069248,1062070271,PR -1062070272,1062219519,US -1062219520,1062219775,IN -1062219776,1062262783,US -1062262784,1062263039,PH -1062263040,1062486271,US -1062486272,1062486527,MX -1062486528,1062530047,US -1062530048,1062531071,EC -1062531072,1062545919,US -1062545920,1062546431,BM -1062546432,1062597375,US -1062597376,1062597631,PR -1062597632,1062723583,US -1062723584,1062727679,GB -1062727680,1062871551,US -1062871552,1062872063,PR -1062872064,1063057432,US -1063057433,1063057433,CA -1063057434,1063568895,US -1063568896,1063569151,TZ -1063569152,1063748607,US -1063748608,1063749119,GH -1063749120,1063749631,US -1063749632,1063749887,LR -1063749888,1063750143,SA -1063750144,1063750399,NG -1063750400,1063750655,US -1063750656,1063751679,NG -1063751680,1063895039,US -1063895040,1063899135,KR -1063899136,1064124927,US -1064124928,1064125695,EC -1064125696,1064125951,US -1064125952,1064126207,PE -1064126208,1064126719,US -1064126720,1064126975,EC -1064126976,1064127487,US -1064127488,1064127999,EC -1064128000,1064171263,US -1064171264,1064171519,NG -1064171520,1064204287,US -1064204288,1064205311,MX -1064205312,1064221951,US -1064221952,1064222207,MX -1064222208,1064445183,US -1064445184,1064445439,PK -1064445440,1065371647,US -1065371648,1065372959,PR -1065372960,1065372991,US -1065372992,1065373695,PR -1065373696,1065493759,US -1065493760,1065494015,GB -1065494016,1065506047,US -1065506048,1065506559,GB -1065506560,1065519247,US -1065519248,1065519263,IN -1065519264,1065519303,US -1065519304,1065519311,IN -1065519312,1065519871,US -1065519872,1065520127,GB -1065520128,1065521407,US -1065521408,1065525247,GB -1065525248,1065525791,US -1065525792,1065525807,IN -1065525808,1065526015,US -1065526016,1065526271,GB -1065526272,1065529343,US -1065529344,1065537535,GB -1065537536,1065539583,US -1065539584,1065539839,GB -1065539840,1065611263,US -1065611264,1065615359,PR -1065615360,1065811967,US -1065811968,1065820159,CA -1065820160,1065873407,US -1065873408,1065877503,PR -1065877504,1065906175,US -1065906176,1065908223,KY -1065908224,1066139647,US -1066139648,1066143743,HK -1066143744,1066213887,US -1066213888,1066214911,NL -1066214912,1066254975,US -1066254976,1066255103,GB -1066255104,1066270719,US -1066270720,1066274815,DE -1066274816,1066311679,US -1066311680,1066311954,CA -1066311955,1066311955,US -1066311956,1066315775,CA -1066315776,1066352639,US -1066352640,1066355711,JM -1066355712,1066355967,BB -1066355968,1066358271,JM -1066358272,1066358527,AG -1066358528,1066369023,JM -1066369024,1066830303,US -1066830304,1066830311,SG -1066830312,1066831071,US -1066831072,1066831079,JP -1066831080,1066831183,US -1066831184,1066831191,JP -1066831192,1066831199,US -1066831200,1066831215,KR -1066831216,1066831335,US -1066831336,1066831343,JP -1066831344,1067237887,US -1067237888,1067238399,JP -1067238400,1067294719,US -1067294720,1067294975,CA -1067294976,1067450879,US -1067450880,1067450880,AL -1067450881,1067471689,US -1067471690,1067471690,SV -1067471691,1067473649,US -1067473650,1067473650,IT -1067473651,1067481855,US -1067481856,1067482111,CA -1067482112,1067530633,US -1067530634,1067530634,NL -1067530635,1067532287,US -1067532288,1067532799,HN -1067532800,1067537927,US -1067537928,1067537928,HU -1067537929,1067550244,US -1067550245,1067550245,IL -1067550246,1067575295,US -1067575296,1067577343,HN -1067577344,1067617791,US -1067617792,1067618047,CN -1067618048,1067621667,US -1067621668,1067621668,CN -1067621669,1067647048,US -1067647049,1067647049,CZ -1067647050,1067693055,US -1067693056,1067693567,CO -1067693568,1067715631,US -1067715632,1067715632,SA -1067715633,1067726847,US -1067726848,1067727359,EC -1067727360,1067736831,US -1067736832,1067737087,PR -1067737088,1067740159,US -1067740160,1067741183,HN -1067741184,1067810188,US -1067810189,1067810189,GH -1067810190,1067823171,US -1067823172,1067823172,TZ -1067823173,1067826283,US -1067826284,1067826284,SE -1067826285,1067831584,US -1067831585,1067831585,BE -1067831586,1067839328,US -1067839329,1067839329,CH -1067839330,1067868455,US -1067868456,1067868456,SG -1067868457,1067969987,US -1067969988,1067969988,SI -1067969989,1067971327,US -1067971328,1067971328,RO -1067971329,1067986307,US -1067986308,1067986308,ZM -1067986309,1067993091,US -1067993092,1067993092,UA -1067993093,1067998463,US -1067998464,1067998719,CO -1067998720,1068004351,US -1068004352,1068004607,CA -1068004608,1068017663,US -1068017664,1068018175,YE -1068018176,1068069919,US -1068069920,1068069920,RU -1068069921,1068080677,US -1068080678,1068080678,RS -1068080679,1068123135,US -1068123136,1068123647,BB -1068123648,1068157839,US -1068157840,1068157840,HR -1068157841,1068157847,US -1068157848,1068157851,CA -1068157852,1068169679,US -1068169680,1068169680,GR -1068169681,1068171799,US -1068171800,1068171800,BA -1068171801,1068175871,US -1068175872,1068176383,YE -1068176384,1068199935,US -1068199936,1068204031,CA -1068204032,1068230655,US -1068230656,1068230911,CO -1068230912,1068249114,US -1068249115,1068249115,BG -1068249116,1068346367,US -1068346368,1068346879,YE -1068346880,1068419071,US -1068419072,1068421119,CO -1068421120,1068425983,US -1068425984,1068426239,EC -1068426240,1068427158,US -1068427159,1068427159,AR -1068427160,1068473343,US -1068473344,1068474367,BB -1068474368,1068481023,US -1068481024,1068481535,PR -1068481536,1068491263,US -1068491264,1068491519,HN -1068491520,1070729471,US -1070729472,1070729727,CA -1070729728,1071100927,US -1071100928,1071101951,PR -1071101952,1071106559,US -1071106560,1071106815,NL -1071106816,1071141557,US -1071141558,1071141558,HK -1071141559,1071141873,US -1071141874,1071141874,HK -1071141875,1071144959,US -1071144960,1071153151,LB -1071153152,1071170815,US -1071170816,1071171071,PH -1071171072,1071206911,US -1071206912,1071207167,HK -1071207168,1071255525,US -1071255526,1071255526,DE -1071255527,1071255839,US -1071255840,1071255847,TW -1071255848,1071278959,US -1071278960,1071278963,SG -1071278964,1071318783,US -1071318784,1071319039,IN -1071319040,1071382975,US -1071382976,1071383039,HK -1071383040,1071477247,US -1071477248,1071480831,CA -1071480832,1071522817,US -1071522818,1071522818,MW -1071522819,1071726951,US -1071726952,1071726955,IE -1071726956,1071727023,US -1071727024,1071727027,GB -1071727028,1071954327,US -1071954328,1071954335,ES -1071954336,1071954391,US -1071954392,1071954399,GB -1071954400,1071954415,US -1071954416,1071954423,GB -1071954424,1071998999,US -1071999000,1071999003,GB -1071999004,1072099327,US -1072099328,1072099519,DE -1072099520,1072099527,FR -1072099528,1072099535,NL -1072099536,1072099583,DE -1072099584,1072157503,US -1072157504,1072157511,GR -1072157512,1072157631,US -1072157632,1072157663,DE -1072157664,1072228863,US -1072228864,1072229375,CA -1072229376,1072361471,US -1072361472,1072361727,GB -1072361728,1072707327,US -1072707328,1072707583,IN -1072707584,1072923135,US -1072923136,1072923391,CA -1072923392,1072924159,US -1072924160,1072924671,HT -1072924672,1072925183,US -1072925184,1072925695,GB -1072925696,1072926207,CA -1072926208,1072926719,US -1072926720,1072926975,PH -1072926976,1072927487,CA -1072927488,1072928511,US -1072928512,1072928767,CA -1072928768,1072929023,US -1072929024,1072929535,CA -1072929536,1072930303,US -1072930304,1072930559,CA -1072930560,1072930815,US -1072930816,1072931071,CA -1072931072,1072931327,US -1072931328,1072931583,CA -1072931584,1072931839,SY -1072931840,1072932095,CA -1072932096,1072932351,US -1072932352,1072932607,CA -1072932608,1072932863,NG -1072932864,1072933887,US -1072933888,1072934399,CA -1072934400,1072934775,US -1072934776,1072934783,FR -1072934784,1072935423,US -1072935424,1072935679,CA -1072935680,1072936191,US -1072936192,1072936447,CA -1072936448,1072936703,PH -1072936704,1072937215,US -1072937216,1072937471,IR -1072937472,1072937727,US -1072937728,1072938239,CA -1072938240,1072938495,VG -1072938496,1072939007,US -1072939008,1072939263,CA -1072939264,1072941055,US -1072941056,1072942079,CA -1072942080,1072943103,US -1072943104,1072945151,CA -1072945152,1072953599,US -1072953600,1072953607,IE -1072953608,1073022975,US -1073022976,1073025791,HN -1073025792,1073026047,NI -1073026048,1073026303,US -1073026304,1073026559,DO -1073026560,1073027071,PR -1073027072,1073028351,NI -1073028352,1073028607,US -1073028608,1073029119,GD -1073029120,1073035263,US -1073035264,1073036287,GD -1073036288,1073036543,US -1073036544,1073037055,MX -1073037056,1073037311,CW -1073037312,1073037823,CO -1073037824,1073038335,GD -1073038336,1073039359,US -1073039360,1073041407,GT -1073041408,1073043455,CO -1073043456,1073043967,PR -1073043968,1073044735,US -1073044736,1073044991,PR -1073044992,1073045247,US -1073045248,1073045503,PR -1073045504,1073047551,CO -1073047552,1073049064,US -1073049065,1073049065,CW -1073049066,1073049599,US -1073049600,1073052671,BS -1073052672,1073075199,US -1073075200,1073075455,CA -1073075456,1073116159,US -1073116160,1073117183,GB -1073117184,1073118207,US -1073118208,1073118719,NL -1073118720,1073119231,DE -1073119232,1073373183,US -1073373184,1073381375,CA -1073381376,1073454591,US -1073454592,1073454847,KY -1073454848,1074009727,US -1074009728,1074009855,IE -1074009856,1074012671,US -1074012672,1074013183,FI -1074013184,1074016895,US -1074016896,1074017023,IE -1074017024,1074020351,US -1074020352,1074028543,CA -1074028544,1074118655,US -1074118656,1074120703,CA -1074120704,1074120719,US -1074120720,1074120959,CA -1074120960,1074121215,US -1074121216,1074122415,CA -1074122416,1074122431,US -1074122432,1074125055,CA -1074125056,1074125311,US -1074125312,1074126847,CA -1074126848,1074127359,US -1074127360,1074128511,CA -1074128512,1074128575,US -1074128576,1074130943,CA -1074130944,1074131199,US -1074131200,1074135039,CA -1074135040,1074184191,US -1074184192,1074188287,CA -1074188288,1074233343,US -1074233344,1074241535,CA -1074241536,1074397439,US -1074397440,1074398975,CA -1074398976,1074399231,US -1074399232,1074406655,CA -1074406656,1074407167,US -1074407168,1074408191,CA -1074408192,1074408447,US -1074408448,1074409471,CA -1074409472,1074409727,US -1074409728,1074410495,CA -1074410496,1074411007,US -1074411008,1074413567,CA -1074413568,1074413823,US -1074413824,1074417407,CA -1074417408,1074418431,US -1074418432,1074419967,CA -1074419968,1074420223,US -1074420224,1074421247,CA -1074421248,1074421503,US -1074421504,1074426623,CA -1074426624,1074427135,US -1074427136,1074428671,CA -1074428672,1074428927,US -1074428928,1074430207,CA -1074430208,1074430463,US -1074430464,1074433535,CA -1074433536,1074433791,US -1074433792,1074437119,CA -1074437120,1074437375,US -1074437376,1074438911,CA -1074438912,1074439167,US -1074439168,1074441727,CA -1074441728,1074441983,US -1074441984,1074444031,CA -1074444032,1074444287,US -1074444288,1074445311,CA -1074445312,1074445567,US -1074445568,1074446079,CA -1074446080,1074446335,US -1074446336,1074453247,CA -1074453248,1074453503,US -1074453504,1074455039,CA -1074455040,1074455295,US -1074455296,1074456319,CA -1074456320,1074456575,US -1074456576,1074459135,CA -1074459136,1074459391,US -1074459392,1074462207,CA -1074462208,1074463743,US -1074463744,1074465535,CA -1074465536,1074465791,US -1074465792,1074466815,CA -1074466816,1074467071,US -1074467072,1074469887,CA -1074469888,1074470143,US -1074470144,1074472191,CA -1074472192,1074472447,US -1074472448,1074474751,CA -1074474752,1074475263,US -1074475264,1074479871,CA -1074479872,1074480127,US -1074480128,1074482175,CA -1074482176,1074482431,US -1074482432,1074484479,CA -1074484480,1074484735,US -1074484736,1074488319,CA -1074488320,1074488831,US -1074488832,1074493695,CA -1074493696,1074494207,US -1074494208,1074494719,CA -1074494720,1074495743,US -1074495744,1074497023,CA -1074497024,1074497279,US -1074497280,1074498815,CA -1074498816,1074499071,US -1074499072,1074501375,CA -1074501376,1074501631,US -1074501632,1074503935,CA -1074503936,1074504191,US -1074504192,1074505215,CA -1074505216,1074505471,US -1074505472,1074508031,CA -1074508032,1074508287,US -1074508288,1074509823,CA -1074509824,1074510079,US -1074510080,1074513151,CA -1074513152,1074703615,US -1074703616,1074703871,GB -1074703872,1074704383,US -1074704384,1074704639,GB -1074704640,1074707967,US -1074707968,1074708223,GB -1074708224,1074708991,US -1074708992,1074709247,PH -1074709248,1074733055,US -1074733056,1074737151,AU -1074737152,1074745343,CA -1074745344,1074757631,US -1074757632,1074765823,CA -1074765824,1074777343,US -1074777344,1074777599,AU -1074777600,1074937855,US -1074937856,1074946047,CA -1074946048,1074954239,US -1074954240,1074962431,PL -1074962432,1074970623,CA -1074970624,1074976703,US -1074976704,1074976735,GB -1074976736,1075265535,US -1075265536,1075269631,KR -1075269632,1075421183,US -1075421184,1075429375,CA -1075429376,1075478527,US -1075478528,1075494911,CA -1075494912,1075576831,US -1075576832,1075576895,NO -1075576896,1075576896,SE -1075576897,1075585023,NO -1075585024,1075609599,US -1075609600,1075613695,TT -1075613696,1075646463,US -1075646464,1075650559,CA -1075650560,1075855359,US -1075855360,1075871743,DO -1075871744,1075904511,US -1075904512,1075920895,JP -1075920896,1075970047,US -1075970048,1075972095,CA -1075972096,1075972351,GB -1075972352,1075973375,CA -1075973376,1075973631,US -1075973632,1075980031,CA -1075980032,1075980543,US -1075980544,1075981567,CA -1075981568,1075982079,US -1075982080,1075985151,CA -1075985152,1075985407,US -1075985408,1075990783,CA -1075990784,1075991039,US -1075991040,1075991807,CA -1075991808,1075992063,US -1075992064,1075992575,CA -1075992576,1075992831,US -1075992832,1075992895,CA -1075992896,1075992959,US -1075992960,1075994111,CA -1075994112,1075994367,US -1075994368,1075999231,CA -1075999232,1075999487,US -1075999488,1075999743,CA -1075999744,1075999999,US -1076000000,1076000255,CA -1076000256,1076000767,US -1076000768,1076002047,CA -1076002048,1076002815,US -1076002816,1076011007,CA -1076011008,1076015103,US -1076015104,1076018098,CA -1076018099,1076018099,US -1076018100,1076018431,CA -1076018432,1076018687,US -1076018688,1076018765,CA -1076018766,1076018766,US -1076018767,1076018943,CA -1076018944,1076022783,US -1076022784,1076023295,CA -1076023296,1076025855,US -1076025856,1076025951,CA -1076025952,1076025999,US -1076026000,1076026023,CA -1076026024,1076026031,US -1076026032,1076026175,CA -1076026176,1076026207,US -1076026208,1076028671,CA -1076028672,1076028927,US -1076028928,1076029183,BZ -1076029184,1076032511,CA -1076032512,1076033543,US -1076033544,1076033887,CA -1076033888,1076033903,US -1076033904,1076033983,CA -1076033984,1076034015,US -1076034016,1076034111,CA -1076034112,1076034175,US -1076034176,1076034303,CA -1076034304,1076034334,US -1076034335,1076034340,CA -1076034341,1076034367,US -1076034368,1076034815,CA -1076034816,1076035071,US -1076035072,1076035135,CA -1076035136,1076035199,US -1076035200,1076035519,CA -1076035520,1076035583,IN -1076035584,1076046847,US -1076046848,1076047103,CA -1076047104,1076049151,US -1076049152,1076049407,DE -1076049408,1076049919,US -1076049920,1076050175,IL -1076050176,1076174847,US -1076174848,1076178943,BM -1076178944,1076183807,US -1076183808,1076184063,CA -1076184064,1076191743,US -1076191744,1076191999,CN -1076192000,1076193375,US -1076193376,1076193383,PG -1076193384,1076194559,US -1076194560,1076194815,CA -1076194816,1076195071,US -1076195072,1076195327,IN -1076195328,1076196095,US -1076196096,1076196351,CA -1076196352,1076198655,US -1076198656,1076198911,AE -1076198912,1076307967,US -1076307968,1076308223,DE -1076308224,1076310015,US -1076310016,1076310271,DE -1076310272,1076323839,US -1076323840,1076324095,CH -1076324096,1076338687,US -1076338688,1076346879,CA -1076346880,1076387839,US -1076387840,1076393727,CA -1076393728,1076394239,US -1076394240,1076396031,CA -1076396032,1076400127,US -1076400128,1076404223,DE -1076404224,1076408319,US -1076408320,1076412415,CA -1076412416,1076424703,US -1076424704,1076428799,CA -1076428800,1076543487,US -1076543488,1076559871,CA -1076559872,1076695039,US -1076695040,1076699135,CA -1076699136,1076703231,US -1076703232,1076706559,CA -1076706560,1076706815,US -1076706816,1076707327,CA -1076707328,1076756479,US -1076756480,1076772863,CA -1076772864,1076823009,US -1076823010,1076823011,CR -1076823012,1076850687,US -1076850688,1076851711,CA -1076851712,1076855044,US -1076855045,1076855045,MX -1076855046,1076879505,US -1076879506,1076879507,CA -1076879508,1076880383,US -1076880384,1076880639,CH -1076880640,1076880895,GB -1076880896,1077055487,US -1077055488,1077059583,CA -1077059584,1077444607,US -1077444608,1077452799,CA -1077452800,1077460991,JP -1077460992,1077465855,US -1077465856,1077466111,CA -1077466112,1077469183,US -1077469184,1077477375,CA -1077477376,1077506047,US -1077506048,1077510143,LS -1077510144,1077511167,US -1077511168,1077511423,UY -1077511424,1077512191,US -1077512192,1077514239,SE -1077514240,1077641215,US -1077641216,1077657599,CA -1077657600,1077841151,US -1077841152,1077841407,GB -1077841408,1077857279,US -1077857280,1077857280,FR -1077857281,1077857281,MF -1077857282,1077857283,FR -1077857284,1077857284,MF -1077857285,1077857304,FR -1077857305,1077857305,MF -1077857306,1077857307,FR -1077857308,1077857308,MF -1077857309,1077857379,FR -1077857380,1077857380,MF -1077857381,1077857535,FR -1077857536,1077865983,US -1077865984,1077866239,CA -1077866240,1077886975,US -1077886976,1077903359,JP -1077903360,1077961347,US -1077961348,1077961350,MX -1077961351,1077963775,US -1077963776,1077964031,JP -1077964032,1077967103,US -1077967104,1077967359,CA -1077967360,1077967615,US -1077967616,1077968127,GB -1077968128,1077968765,US -1077968766,1077968768,MX -1077968769,1077977087,US -1077977088,1077985279,CA -1077985280,1077993471,US -1077993472,1078018047,CA -1078018048,1078067199,US -1078067200,1078071295,BS -1078071296,1078075391,CA -1078075392,1078124543,US -1078124544,1078128639,CA -1078128640,1078247423,US -1078247424,1078251519,CA -1078251520,1078280191,US -1078280192,1078285008,CA -1078285009,1078285011,US -1078285012,1078288383,CA -1078288384,1078429695,US -1078429696,1078429951,GR -1078429952,1078438399,US -1078438400,1078438655,CA -1078438656,1078438911,US -1078438912,1078438929,CN -1078438930,1078438930,US -1078438931,1078439167,CN -1078439168,1078439679,US -1078439680,1078439935,NL -1078439936,1078453935,US -1078453936,1078453951,AT -1078453952,1078454703,US -1078454704,1078454719,AT -1078454720,1078455343,US -1078455344,1078455359,AT -1078455360,1078456319,US -1078456320,1078460415,CA -1078460416,1078517759,US -1078517760,1078525951,CA -1078525952,1078575359,US -1078575360,1078575615,CA -1078575616,1078594815,US -1078594816,1078594943,HK -1078594944,1078722559,US -1078722560,1078734847,AR -1078734848,1078737919,CO -1078737920,1078738943,EC -1078738944,1078739455,VE -1078739456,1078739967,US -1078739968,1078743039,PE -1078743040,1078746111,CO -1078746112,1078747135,PE -1078747136,1078749183,CL -1078749184,1078751231,PE -1078751232,1078753279,CO -1078753280,1078755327,AR -1078755328,1078757375,PE -1078757376,1078767615,CL -1078767616,1078768639,CO -1078768640,1078769663,CL -1078769664,1078771711,CO -1078771712,1078773759,EC -1078773760,1078775807,PE -1078775808,1078777855,CO -1078777856,1078780927,EC -1078780928,1078782463,US -1078782464,1078782719,PA -1078782720,1078788095,US -1078788096,1078790911,CA -1078790912,1078791167,US -1078791168,1078793727,CA -1078793728,1078793983,US -1078793984,1078795263,CA -1078795264,1078795519,US -1078795520,1078796287,CA -1078796288,1078797311,US -1078797312,1078801167,CA -1078801168,1078801183,US -1078801184,1078801407,CA -1078801408,1078803199,US -1078803200,1078804479,CA -1078804480,1078805503,US -1078805504,1078807391,CA -1078807392,1078807407,US -1078807408,1078807807,CA -1078807808,1078808831,US -1078808832,1078809855,CA -1078809856,1078811391,US -1078811392,1078812415,CA -1078812416,1078813439,US -1078813440,1078813959,CA -1078813960,1078813967,US -1078813968,1078814031,CA -1078814032,1078814039,US -1078814040,1078814071,CA -1078814072,1078814079,US -1078814080,1078814719,CA -1078814720,1078815999,US -1078816000,1078816511,CA -1078816512,1078817791,US -1078817792,1078819327,CA -1078819328,1078820095,US -1078820096,1078820863,CA -1078820864,1078895103,US -1078895104,1078895359,CN -1078895360,1079319295,US -1079319296,1079319551,CN -1079319552,1079320575,US -1079320576,1079322831,CA -1079322832,1079322839,US -1079322840,1079328767,CA -1079328768,1079379199,US -1079379200,1079379455,CA -1079379456,1079383039,US -1079383040,1079383295,VG -1079383296,1079383807,US -1079383808,1079384063,MH -1079384064,1079384319,LR -1079384320,1079384575,CA -1079384576,1079385087,ZW -1079385088,1079385599,US -1079385600,1079386623,CA -1079386624,1079386879,SG -1079386880,1079387135,EG -1079387136,1079387903,US -1079387904,1079388159,PH -1079388160,1079389183,CA -1079389184,1079389951,US -1079389952,1079390207,CA -1079390208,1079392255,US -1079392256,1079393791,CA -1079393792,1079394303,US -1079394304,1079395327,EC -1079395328,1079396095,US -1079396096,1079396351,CA -1079396352,1079397375,MP -1079397376,1079397631,MH -1079397632,1079400959,US -1079400960,1079401215,CA -1079401216,1079402495,US -1079402496,1079403263,CA -1079403264,1079403519,US -1079403520,1079403775,CA -1079403776,1079405567,US -1079405568,1079406111,CA -1079406112,1079408895,US -1079408896,1079409407,PK -1079409408,1079409919,US -1079409920,1079410175,CA -1079410176,1079411455,US -1079411456,1079411711,PK -1079411712,1079413759,US -1079413760,1079414271,CA -1079414272,1079415039,US -1079415040,1079415295,HN -1079415296,1079418887,US -1079418888,1079418895,CA -1079418896,1079422975,US -1079422976,1079423999,CA -1079424000,1079424255,US -1079424256,1079424259,MX -1079424260,1079425791,US -1079425792,1079426047,CA -1079426048,1079427327,US -1079427328,1079427583,CA -1079427584,1079429295,US -1079429296,1079429311,FR -1079429312,1079431679,US -1079431680,1079432191,ZM -1079432192,1079432959,US -1079432960,1079433215,CA -1079433216,1079435263,CR -1079435264,1079435775,CO -1079435776,1079436031,CA -1079436032,1079439359,US -1079439360,1079439407,CA -1079439408,1079439615,US -1079439616,1079439871,CA -1079439872,1079440191,US -1079440192,1079440207,CA -1079440208,1079459839,US -1079459840,1079508991,CA -1079508992,1079566847,US -1079566848,1079567103,GB -1079567104,1079567359,US -1079567360,1079567615,AU -1079567616,1079574527,US -1079574528,1079578623,PR -1079578624,1079623679,US -1079623680,1079627775,PR -1079627776,1079664639,US -1079664640,1079668735,CA -1079668736,1079669247,US -1079669248,1079669759,NL -1079669760,1079861247,US -1079861248,1079865343,CA -1079865344,1079917055,US -1079917056,1079917311,KY -1079917312,1079962879,US -1079962880,1079963135,GB -1079963136,1079992319,US -1079992320,1079993343,NL -1079993344,1080015871,US -1080015872,1080016383,GB -1080016384,1080016639,US -1080016640,1080016895,GB -1080016896,1080033279,US -1080033280,1080164351,KY -1080164352,1080165375,US -1080165376,1080168447,CA -1080168448,1080172543,US -1080172544,1080176639,CA -1080176640,1080197119,US -1080197120,1080213503,CA -1080213504,1080229887,US -1080229888,1080233983,CA -1080233984,1080238079,US -1080238080,1080258559,CA -1080258560,1080262655,US -1080262656,1080279039,CA -1080279040,1080492031,US -1080492032,1080498664,NL -1080498665,1080498665,US -1080498666,1080501380,NL -1080501381,1080501381,US -1080501382,1080501503,NL -1080501504,1080501759,US -1080501760,1080524799,NL -1080524800,1080557567,IN -1080557568,1080573951,JP -1080573952,1080581887,SG -1080581888,1080582143,US -1080582144,1080590335,HK -1080590336,1080598527,IN -1080598528,1080606719,HK -1080606720,1080623103,AU -1080623104,1080957951,US -1080957952,1080958207,DE -1080958208,1080958463,BH -1080958464,1080958719,DE -1080958720,1080958975,BH -1080958976,1080960255,DE -1080960256,1080960511,BH -1080960512,1080963839,DE -1080963840,1080967167,US -1080967168,1080968191,DE -1080968192,1080968447,BH -1080968448,1080969471,DE -1080969472,1080969727,BH -1080969728,1080983551,DE -1080983552,1080987647,US -1080987648,1080988671,DE -1080988672,1080989951,US -1080989952,1080990207,DE -1080990208,1080999935,US -1080999936,1081016319,CA -1081016320,1081037311,US -1081037312,1081037567,CA -1081037568,1081038335,US -1081038336,1081040895,CA -1081040896,1081129983,US -1081129984,1081130495,CA -1081130496,1081212927,US -1081212928,1081278463,CA -1081278464,1081369599,US -1081369600,1081370111,CO -1081370112,1081377663,US -1081377664,1081377791,VE -1081377792,1081378495,US -1081378496,1081378559,VE -1081378560,1081379327,US -1081379328,1081379839,VE -1081379840,1081385215,US -1081385216,1081385471,PA -1081385472,1081387519,US -1081387520,1081387775,PA -1081387776,1081391103,US -1081391104,1081393151,PA -1081393152,1081393407,US -1081393408,1081393663,CL -1081393664,1081393919,US -1081393920,1081397247,CL -1081397248,1081397759,US -1081397760,1081398783,CL -1081398784,1081399295,US -1081399296,1081401343,CL -1081401344,1081403135,US -1081403136,1081403391,AR -1081403392,1081409791,US -1081409792,1081410047,PR -1081410048,1081410559,US -1081410560,1081411583,PR -1081411584,1081416191,US -1081416192,1081416447,PR -1081416448,1081419775,US -1081419776,1081420287,PR -1081420288,1081421311,US -1081421312,1081421567,MF -1081421568,1081443327,US -1081443328,1081444351,CL -1081444352,1081445375,US -1081445376,1081446399,CL -1081446400,1081460735,US -1081460736,1081462783,PA -1081462784,1081462856,US -1081462857,1081462857,BR -1081462858,1081479167,US -1081479168,1081483247,CA -1081483248,1081483255,US -1081483256,1081483263,CA -1081483264,1081565183,US -1081565184,1081573375,CA -1081573376,1081589759,US -1081589760,1081593855,BB -1081593856,1081597951,CA -1081597952,1081634303,US -1081634304,1081637375,SG -1081637376,1081978623,US -1081978624,1081978631,CH -1081978632,1082091263,US -1082091264,1082091271,CN -1082091272,1082091999,US -1082092000,1082092007,CA -1082092008,1082093679,US -1082093680,1082093695,AU -1082093696,1082097055,US -1082097056,1082097071,CA -1082097072,1082314751,US -1082314752,1082318847,CA -1082318848,1082683391,US -1082683392,1082687487,CA -1082687488,1082753023,US -1082753024,1082785791,CA -1082785792,1082788655,US -1082788656,1082788663,SG -1082788664,1082791167,US -1082791168,1082791423,IN -1082791424,1082945535,US -1082945536,1082949631,CA -1082949632,1082982399,US -1082982400,1083015167,CA -1083015168,1083142399,US -1083142400,1083142655,IN -1083142656,1083267583,US -1083267584,1083268095,JP -1083268096,1083396095,US -1083396096,1083400191,BM -1083400192,1083417727,US -1083417728,1083417791,CA -1083417792,1083437055,US -1083437056,1083441151,CA -1083441152,1083621375,US -1083621376,1083637759,BS -1083637760,1083686911,US -1083686912,1083703295,CA -1083703296,1083738111,US -1083738112,1083740159,PR -1083740160,1084067583,US -1084067584,1084067839,CA -1084067840,1084153599,US -1084153600,1084153855,NL -1084153856,1085439999,US -1085440000,1085448191,CA -1085448192,1085456383,US -1085456384,1085464575,PR -1085464576,1085526015,US -1085526016,1085530111,CA -1085530112,1085538303,US -1085538304,1085603839,CA -1085603840,1085849599,US -1085849600,1085857791,CA -1085857792,1085915135,US -1085915136,1085923327,PR -1085923328,1085997055,US -1085997056,1086013439,CA -1086013440,1086027263,US -1086027264,1086027519,CA -1086027520,1086028031,US -1086028032,1086028287,CA -1086028288,1086042111,US -1086042112,1086046207,CA -1086046208,1086050815,US -1086050816,1086051327,CA -1086051328,1086267391,US -1086267392,1086271487,CA -1086271488,1086421503,US -1086421504,1086422015,MP -1086422016,1086922751,US -1086922752,1086930943,CA -1086930944,1086955519,US -1086955520,1086971903,CA -1086971904,1087016959,US -1087016960,1087021055,CA -1087021056,1087062015,US -1087062016,1087070207,CA -1087070208,1087405407,US -1087405408,1087405423,MX -1087405424,1087413879,US -1087413880,1087413883,ES -1087413884,1087413895,US -1087413896,1087413903,DE -1087413904,1087416985,US -1087416986,1087416986,GB -1087416987,1087418367,US -1087418368,1087419391,GB -1087419392,1087430191,US -1087430192,1087430195,FR -1087430196,1087436799,US -1087436800,1087438847,FR -1087438848,1087440895,US -1087440896,1087442943,PR -1087442944,1087466751,US -1087466752,1087467007,GB -1087467008,1087501471,US -1087501472,1087501479,HK -1087501480,1087501535,US -1087501536,1087501695,HK -1087501696,1087501775,US -1087501776,1087501799,HK -1087501800,1087508161,US -1087508162,1087508162,JP -1087508163,1087509967,US -1087509968,1087509971,FI -1087509972,1087514623,US -1087514624,1087516671,BB -1087516672,1087575807,US -1087575808,1087575815,MX -1087575816,1087586967,US -1087586968,1087586971,NL -1087586972,1087586999,US -1087587000,1087587003,DE -1087587004,1087589119,US -1087589120,1087589247,GB -1087589248,1087591237,US -1087591238,1087591238,FR -1087591239,1087613115,US -1087613116,1087613119,FR -1087613120,1087626111,US -1087626112,1087626239,VI -1087626240,1087686655,US -1087686656,1087686911,PR -1087686912,1087693151,US -1087693152,1087693155,GB -1087693156,1087714335,US -1087714336,1087714367,NL -1087714368,1087715327,US -1087715328,1087717375,PA -1087717376,1087726015,US -1087726016,1087726047,FR -1087726048,1087743569,US -1087743570,1087743570,GB -1087743571,1087758335,US -1087758336,1087766527,PR -1087766528,1087795199,US -1087795200,1087797247,CN -1087797248,1087798943,US -1087798944,1087798975,CA -1087798976,1087821567,US -1087821568,1087821823,GB -1087821824,1087837359,US -1087837360,1087837367,BR -1087837368,1087837695,US -1087837696,1087837951,BR -1087837952,1087860735,US -1087860736,1087860991,GB -1087860992,1087862783,US -1087862784,1087864831,PA -1087864832,1087873023,US -1087873024,1087873535,CA -1087873536,1087879403,US -1087879404,1087879407,GB -1087879408,1087883263,US -1087883264,1087883519,AR -1087883520,1087918511,US -1087918512,1087918519,PR -1087918520,1087950111,US -1087950112,1087950119,PR -1087950120,1088012767,US -1088012768,1088012775,PR -1088012776,1088421887,US -1088421888,1088422143,CA -1088422144,1088422911,US -1088422912,1088423167,CA -1088423168,1088423679,US -1088423680,1088424959,CA -1088424960,1088425983,US -1088425984,1088427263,CA -1088427264,1088433663,US -1088433664,1088433919,CA -1088433920,1088435455,US -1088435456,1088435711,CA -1088435712,1088437247,US -1088437248,1088438527,CA -1088438528,1088440063,US -1088440064,1088440575,CA -1088440576,1088440831,US -1088440832,1088441343,CA -1088441344,1088442623,US -1088442624,1088442879,CA -1088442880,1088446975,US -1088446976,1088447231,CA -1088447232,1088447487,US -1088447488,1088449023,CA -1088449024,1088449279,US -1088449280,1088450047,CA -1088450048,1088450303,US -1088450304,1088462847,CA -1088462848,1088467711,US -1088467712,1088467967,CA -1088467968,1088471039,US -1088471040,1088471807,CA -1088471808,1088472063,US -1088472064,1088473455,CA -1088473456,1088473487,US -1088473488,1088473855,CA -1088473856,1088474111,US -1088474112,1088475135,CA -1088475136,1088475903,US -1088475904,1088476159,CA -1088476160,1088476927,US -1088476928,1088477439,CA -1088477440,1088477695,US -1088477696,1088478207,CA -1088478208,1088478719,US -1088478720,1088479231,CA -1088479232,1088481023,US -1088481024,1088483327,CA -1088483328,1088484095,US -1088484096,1088484351,CA -1088484352,1088485375,US -1088485376,1088486911,CA -1088486912,1088487423,US -1088487424,1088495615,CA -1088495616,1088514047,US -1088514048,1088514559,CA -1088514560,1088516095,US -1088516096,1088538623,CA -1088538624,1088543487,US -1088543488,1088546815,CA -1088546816,1088548863,US -1088548864,1088550399,CA -1088550400,1088550655,US -1088550656,1088551167,CA -1088551168,1088551423,US -1088551424,1088551935,CA -1088551936,1088552191,US -1088552192,1088552703,CA -1088552704,1088552959,US -1088552960,1088553727,CA -1088553728,1088553983,US -1088553984,1088554239,CA -1088554240,1088558335,US -1088558336,1088558591,CA -1088558592,1088559103,US -1088559104,1088560383,CA -1088560384,1088564223,US -1088564224,1088565247,CA -1088565248,1088566271,US -1088566272,1088566783,CA -1088566784,1088580095,US -1088580096,1088584703,CA -1088584704,1088591871,US -1088591872,1088596479,CA -1088596480,1088599039,US -1088599040,1088599551,CA -1088599552,1088607999,US -1088608000,1088608255,CA -1088608256,1088609279,US -1088609280,1088609791,CA -1088609792,1088610815,US -1088610816,1088611071,CA -1088611072,1088614399,US -1088614400,1088616447,CA -1088616448,1088617471,US -1088617472,1088618495,CA -1088618496,1088636927,US -1088636928,1088639999,CA -1088640000,1088641023,US -1088641024,1088642047,CA -1088642048,1088660735,US -1088660736,1088661503,CA -1088661504,1088663551,US -1088663552,1088665599,CA -1088665600,1088666111,US -1088666112,1088666623,CA -1088666624,1088668671,US -1088668672,1088669695,CA -1088669696,1088673279,US -1088673280,1088676863,CA -1088676864,1088677887,US -1088677888,1088678911,CA -1088678912,1088679423,US -1088679424,1088679935,CA -1088679936,1088680959,US -1088680960,1088946175,CA -1088946176,1089056058,US -1089056059,1089056059,IN -1089056060,1089151231,US -1089151232,1089151487,NL -1089151488,1089152255,US -1089152256,1089152511,NL -1089152512,1089153279,US -1089153280,1089153535,SG -1089153536,1089154303,US -1089154304,1089154559,SG -1089154560,1089167359,US -1089167360,1089171455,CA -1089171456,1089183231,US -1089183232,1089183487,GB -1089183488,1089191935,US -1089191936,1089200127,CA -1089200128,1089210623,US -1089210624,1089210879,GB -1089210880,1089211391,BR -1089211392,1089219839,US -1089219840,1089220095,JP -1089220096,1089233919,US -1089233920,1089234175,JP -1089234176,1089235455,US -1089235456,1089235967,GB -1089235968,1089249279,US -1089249280,1089249535,IE -1089249536,1089263615,US -1089263616,1089263871,GB -1089263872,1089264127,US -1089264128,1089264639,FR -1089264640,1089265663,US -1089265664,1089265919,GB -1089265920,1089266431,US -1089266432,1089266943,GB -1089266944,1089306623,US -1089306624,1089339391,PR -1089339392,1089404927,US -1089404928,1089437695,CA -1089437696,1089462271,US -1089462272,1089462394,CA -1089462395,1089462395,US -1089462396,1089462411,CA -1089462412,1089462412,US -1089462413,1089462436,CA -1089462437,1089462437,US -1089462438,1089462527,CA -1089462528,1089462783,US -1089462784,1089463039,CA -1089463040,1089463295,US -1089463296,1089465343,CA -1089465344,1089881599,US -1089881600,1089882111,GB -1089882112,1089882623,US -1089882624,1089883135,GB -1089883136,1089887231,US -1089887232,1089887743,GB -1089887744,1089961983,US -1089961984,1089970175,CA -1089970176,1089974271,PR -1089974272,1090146303,US -1090146304,1090150399,CA -1090150400,1090207743,US -1090207744,1090215935,CA -1090215936,1090330623,US -1090330624,1090338815,GB -1090338816,1090355199,US -1090355200,1090363391,CA -1090363392,1090387967,US -1090387968,1090395391,CA -1090395392,1090418565,US -1090418566,1090418566,DE -1090418567,1090427391,US -1090427392,1090427647,CA -1090427648,1090445311,US -1090445312,1090453503,CA -1090453504,1090497903,US -1090497904,1090497919,AU -1090497920,1091803135,US -1091803136,1091803391,CN -1091803392,1091807231,US -1091807232,1091807487,CA -1091807488,1091807999,US -1091808000,1091808255,CA -1091808256,1091809535,US -1091809536,1091809791,CA -1091809792,1091960831,US -1091960832,1092026367,CA -1092026368,1092075519,US -1092075520,1092091903,PR -1092091904,1093017599,US -1093017600,1093021695,CA -1093021696,1093025791,US -1093025792,1093033983,CA -1093033984,1093058559,US -1093058560,1093066751,PR -1093066752,1093074943,US -1093074944,1093091327,CA -1093091328,1093099519,FR -1093099520,1093107711,US -1093107712,1093109952,CA -1093109953,1093109955,US -1093109956,1093110840,CA -1093110841,1093110843,US -1093110844,1093113783,CA -1093113784,1093113791,US -1093113792,1093120511,CA -1093120512,1093120767,GB -1093120768,1093127270,CA -1093127271,1093127271,US -1093127272,1093127423,CA -1093127424,1093127679,US -1093127680,1093127935,CA -1093127936,1093128191,US -1093128192,1093131775,CA -1093131776,1093132287,US -1093132288,1093134335,CA -1093134336,1093135359,US -1093135360,1093140479,CA -1093140480,1093697535,US -1093697536,1093699071,BB -1093699072,1093700607,GD -1093700608,1093701631,VC -1093701632,1093708287,BB -1093708288,1093709311,LC -1093709312,1093716479,BB -1093716480,1093717759,GD -1093717760,1093719807,BB -1093719808,1093720575,LC -1093720576,1093721343,VG -1093721344,1093723391,BB -1093723392,1093723647,VC -1093723648,1093724415,BB -1093724416,1093725183,VC -1093725184,1093730303,BB -1093730304,1093732537,US -1093732538,1093732538,CA -1093732539,1093734053,US -1093734054,1093734054,PH -1093734055,1093764095,US -1093764096,1093765119,CA -1093765120,1093767167,US -1093767168,1093767679,HK -1093767680,1093768703,US -1093768704,1093769215,HK -1093769216,1093787647,US -1093787648,1093791743,CA -1093791744,1093943295,US -1093943296,1093947391,IE -1093947392,1093959679,US -1093959680,1093967871,NL -1093967872,1093976063,HK -1093976064,1093984255,US -1093984256,1093986303,IE -1093986304,1094061971,US -1094061972,1094061975,NL -1094061976,1094061979,IE -1094061980,1094064127,US -1094064128,1094064575,IE -1094064576,1094064639,US -1094064640,1094064799,IE -1094064800,1094064831,US -1094064832,1094064863,IE -1094064864,1094064871,US -1094064872,1094064887,IE -1094064888,1094065087,US -1094065088,1094065119,IE -1094065120,1094066175,US -1094066176,1094066407,IE -1094066408,1094066415,US -1094066416,1094066431,IE -1094066432,1094066671,US -1094066672,1094066679,IE -1094066680,1094066683,US -1094066684,1094066687,IE -1094066688,1094066911,US -1094066912,1094066975,IE -1094066976,1094074879,US -1094074880,1094075167,BR -1094075168,1094075171,US -1094075172,1094075195,BR -1094075196,1094075223,US -1094075224,1094075235,BR -1094075236,1094079743,US -1094079744,1094079999,BR -1094080000,1094081023,US -1094081024,1094081535,JP -1094081536,1094088703,US -1094088704,1094088751,PR -1094088752,1094088863,US -1094088864,1094089103,PR -1094089104,1094089119,US -1094089120,1094089279,PR -1094089280,1094089503,US -1094089504,1094089535,PR -1094089536,1094099551,US -1094099552,1094099567,IE -1094099568,1094100719,US -1094100720,1094100735,GB -1094100736,1094106239,US -1094106240,1094106255,GB -1094106256,1094124543,US -1094124544,1094124799,IE -1094124800,1094139039,US -1094139040,1094139051,IE -1094139052,1094139063,US -1094139064,1094139067,CN -1094139068,1094146047,US -1094146048,1094146079,KR -1094146080,1094146111,HK -1094146112,1094146143,SG -1094146144,1094146175,MY -1094146176,1094146239,AU -1094146240,1094146271,HK -1094146272,1094146303,SG -1094146304,1094150751,US -1094150752,1094150783,SG -1094150784,1094177663,US -1094177664,1094177727,IE -1094177728,1094178303,US -1094178304,1094178559,SG -1094178560,1094178815,US -1094178816,1094179071,IE -1094179072,1094565887,US -1094565888,1094582271,CA -1094582272,1095450623,US -1095450624,1095467007,BS -1095467008,1095627775,US -1095627776,1095628287,CA -1095628288,1096278015,US -1096278016,1096286207,CA -1096286208,1096548351,US -1096548352,1096810495,CA -1096810496,1096884223,US -1096884224,1096888319,CA -1096888320,1096890879,US -1096890880,1096891135,GB -1096891136,1096925183,US -1096925184,1096941567,CA -1096941568,1097007103,US -1097007104,1097031679,JP -1097031680,1097039871,US -1097039872,1097056255,SE -1097056256,1097076123,US -1097076124,1097076127,DE -1097076128,1097727999,US -1097728000,1097736191,CA -1097736192,1097768959,US -1097768960,1097785343,CA -1097785344,1097830399,US -1097830400,1097834495,CA -1097834496,1097896191,US -1097896192,1097897215,VI -1097897216,1097947135,US -1097947136,1097949183,VI -1097949184,1097951231,US -1097951232,1097953279,VI -1097953280,1098070271,US -1098070272,1098070279,GR -1098070280,1098070295,US -1098070296,1098070303,BE -1098070304,1098096287,US -1098096288,1098096295,BR -1098096296,1098178383,US -1098178384,1098178391,CA -1098178392,1098891623,US -1098891624,1098891631,AU -1098891632,1098892255,US -1098892256,1098892263,AU -1098892264,1100450825,US -1100450826,1100450829,DE -1100450830,1100505127,US -1100505128,1100505135,CA -1100505136,1100560647,US -1100560648,1100560655,TR -1100560656,1101116083,US -1101116084,1101116084,KR -1101116085,1101182975,US -1101182976,1101183487,YE -1101183488,1101253203,US -1101253204,1101253204,JP -1101253205,1101263103,US -1101263104,1101263359,CW -1101263360,1101267711,US -1101267712,1101267967,CA -1101267968,1101291072,US -1101291073,1101291073,DE -1101291074,1101294079,US -1101294080,1101294080,PE -1101294081,1101304831,US -1101304832,1101305855,HN -1101305856,1101352959,US -1101352960,1101355007,HN -1101355008,1101361039,US -1101361040,1101361040,PA -1101361041,1101402031,US -1101402032,1101402047,PR -1101402048,1101459455,US -1101459456,1101461503,BB -1101461504,1101475839,US -1101475840,1101479935,CO -1101479936,1101484031,US -1101484032,1101488127,CO -1101488128,1101542399,US -1101542400,1101542911,CO -1101542912,1101551213,US -1101551214,1101551214,AU -1101551215,1101564519,US -1101564520,1101564520,PL -1101564521,1101592425,US -1101592426,1101592426,FR -1101592427,1101598895,US -1101598896,1101598896,KE -1101598897,1101635327,US -1101635328,1101635583,HN -1101635584,1101650276,US -1101650277,1101650277,TN -1101650278,1101650431,US -1101650432,1101650943,HN -1101650944,1101669655,US -1101669656,1101669656,NZ -1101669657,1101673579,US -1101673580,1101673580,KW -1101673581,1101681407,US -1101681408,1101681663,NL -1101681664,1101729355,US -1101729356,1101729356,LB -1101729357,1101750783,US -1101750784,1101751295,BM -1101751296,1101767679,US -1101767680,1101768191,CW -1101768192,1101803519,US -1101803520,1101804543,HN -1101804544,1101857247,US -1101857248,1101857248,MA -1101857249,1101871103,US -1101871104,1101873151,BO -1101873152,1101992063,US -1101992064,1101992191,NL -1101992192,1102004735,US -1102004736,1102004991,IN -1102004992,1102005503,US -1102005504,1102005759,PK -1102005760,1102006271,US -1102006272,1102006527,CA -1102006528,1102389247,US -1102389248,1102393343,CA -1102393344,1102446591,US -1102446592,1102448383,HN -1102448384,1102449151,US -1102449152,1102449407,SV -1102449408,1102454527,CR -1102454528,1102454783,HN -1102454784,1102512127,US -1102512128,1102516223,JM -1102516224,1103244799,US -1103244800,1103245055,EC -1103245056,1103548415,US -1103548416,1103550463,BS -1103550464,1103603711,US -1103603712,1103605759,EC -1103605760,1103623167,US -1103623168,1103623679,CO -1103623680,1103930879,US -1103930880,1103931135,MX -1103931136,1103987967,US -1103987968,1103988223,BR -1103988224,1103992319,US -1103992320,1103992575,FI -1103992576,1104166911,US -1104166912,1104168959,CO -1104168960,1104265215,US -1104265216,1104265727,PH -1104265728,1104842751,US -1104842752,1104844799,PR -1104844800,1105099519,US -1105099520,1105099775,EC -1105099776,1105719295,US -1105719296,1105723391,IN -1105723392,1106469887,US -1106469888,1106470911,BS -1106470912,1106475007,US -1106475008,1106475519,CO -1106475520,1106758655,US -1106758656,1106759167,EC -1106759168,1106759679,CO -1106759680,1106767871,US -1106767872,1106768383,CO -1106768384,1106768895,EC -1106768896,1106769919,CO -1106769920,1107240191,US -1107240192,1107240959,CN -1107240960,1107242495,US -1107242496,1107243007,DE -1107243008,1107247103,TC -1107247104,1107275775,US -1107275776,1107279871,CA -1107279872,1107288063,US -1107288064,1107292159,CA -1107292160,1107701759,US -1107701760,1107705855,CA -1107705856,1107820543,US -1107820544,1107853311,ZA -1107853312,1107895039,US -1107895040,1107895807,GB -1107895808,1107898367,US -1107898368,1107899903,GB -1107899904,1107906559,US -1107906560,1107907071,GB -1107907072,1107907839,US -1107907840,1107908095,GB -1107908096,1107909375,US -1107909376,1107909631,GB -1107909632,1107927039,US -1107927040,1107927551,GB -1107927552,1107935743,US -1107935744,1107936767,GB -1107936768,1107947775,US -1107947776,1107948031,GB -1107948032,1107948543,US -1107948544,1107948799,GB -1107948800,1108025343,US -1108025344,1108029439,CA -1108029440,1108033535,US -1108033536,1108041727,CA -1108041728,1108054015,US -1108054016,1108066303,CA -1108066304,1108492287,US -1108492288,1108500479,ZA -1108500480,1108525055,US -1108525056,1108541439,CA -1108541440,1109458943,US -1109458944,1109491711,CA -1109491712,1109688319,US -1109688320,1109696511,CA -1109696512,1109705727,US -1109705728,1109705983,CG -1109705984,1109707519,US -1109707520,1109707775,MW -1109707776,1109819391,US -1109819392,1109848831,CA -1109848832,1109849087,US -1109849088,1109852159,CA -1109852160,1109918463,US -1109918464,1109918719,GB -1109918720,1109919487,CA -1109919488,1109919743,US -1109919744,1109919999,GB -1109920000,1109920255,US -1109920256,1109920767,CA -1109920768,1109921023,US -1109921024,1109921279,CA -1109921280,1109921791,US -1109921792,1109926143,CA -1109926144,1109926655,US -1109926656,1109927167,CA -1109927168,1109927423,AU -1109927424,1109927679,CA -1109927680,1109928959,US -1109928960,1109929983,CA -1109929984,1109930751,US -1109930752,1109931007,CA -1109931008,1109931263,US -1109931264,1109931775,CA -1109931776,1109932287,US -1109932288,1109932543,CA -1109932544,1109932799,US -1109932800,1109934591,CA -1109934592,1109934847,GB -1109934848,1109936127,CA -1109936128,1109936383,US -1109936384,1109936639,CA -1109936640,1109937151,US -1109937152,1109937663,CA -1109937664,1109950463,US -1109950464,1109969407,CA -1109969408,1109970431,US -1109970432,1109970687,CA -1109970688,1109979135,US -1109979136,1109983231,CA -1109983232,1110126591,US -1110126592,1110130687,CA -1110130688,1110248623,US -1110248624,1110248631,CA -1110248632,1110270207,US -1110270208,1110270335,CA -1110270336,1110310911,US -1110310912,1110376447,CA -1110376448,1110443535,US -1110443536,1110443543,CA -1110443544,1110444287,US -1110444288,1110444799,CA -1110444800,1110445055,US -1110445056,1110446591,CA -1110446592,1110447359,US -1110447360,1110448383,CA -1110448384,1110448639,US -1110448640,1110448895,CA -1110448896,1110449151,US -1110449152,1110449663,CA -1110449664,1110450431,US -1110450432,1110450943,CA -1110450944,1110451455,US -1110451456,1110451711,CA -1110451712,1110451967,US -1110451968,1110453247,CA -1110453248,1110462143,US -1110462144,1110462207,CA -1110462208,1110462271,US -1110462272,1110462335,CA -1110462336,1110462847,US -1110462848,1110463103,CA -1110463104,1110463999,US -1110464000,1110464767,CA -1110464768,1110465023,US -1110465024,1110465535,CA -1110465536,1110466047,US -1110466048,1110466303,CA -1110466304,1110472447,US -1110472448,1110473727,CA -1110473728,1110473983,US -1110473984,1110474239,CA -1110474240,1110540287,US -1110540288,1110573055,CA -1110573056,1110579967,PR -1110579968,1110580223,US -1110580224,1110587903,PR -1110587904,1110593023,US -1110593024,1110593279,PR -1110593280,1110595776,US -1110595777,1110638591,PR -1110638592,1110642687,US -1110642688,1110644735,CA -1110644736,1110654463,US -1110654464,1110654719,HT -1110654720,1110663167,US -1110663168,1110675455,CA -1110675456,1110679551,US -1110679552,1110683647,CA -1110683648,1110700031,US -1110700032,1110704127,CA -1110704128,1110853631,US -1110853632,1110854655,GB -1110854656,1110857215,US -1110857216,1110857471,DE -1110857472,1110859007,US -1110859008,1110859263,AU -1110859264,1110863871,US -1110863872,1110865919,JM -1110865920,1110867455,KY -1110867456,1110867967,JM -1110867968,1110887423,US -1110887424,1110887679,IE -1110887680,1110929407,US -1110929408,1110933503,BM -1110933504,1111195647,US -1111195648,1111212031,CA -1111212032,1111228415,US -1111228416,1111244799,AR -1111244800,1111916543,US -1111916544,1111949311,CA -1111949312,1111982079,US -1111982080,1111998463,IT -1111998464,1112412671,US -1112412672,1112413183,NL -1112413184,1112413695,CH -1112413696,1112414207,CA -1112414208,1112416255,US -1112416256,1112418303,CN -1112418304,1112418815,US -1112418816,1112419071,IT -1112419072,1112419327,FR -1112419328,1112419839,GB -1112419840,1112420095,US -1112420096,1112420351,GB -1112420352,1112422399,CN -1112422400,1112422655,US -1112422656,1112422911,FR -1112422912,1112423167,GB -1112423168,1112424447,US -1112424448,1112440831,CA -1112440832,1112498175,US -1112498176,1112506367,IR -1112506368,1112530943,US -1112530944,1112539135,CA -1112539136,1112653823,US -1112653824,1112657919,VG -1112657920,1112867327,US -1112867328,1112867583,BS -1112867584,1112869887,US -1112869888,1112870143,CA -1112870144,1112873983,US -1112873984,1112875007,CA -1112875008,1112875519,US -1112875520,1112875775,CA -1112875776,1112889855,US -1112889856,1112890367,CA -1112890368,1112907775,US -1112907776,1112907783,CA -1112907784,1112931327,US -1112931328,1112931839,CA -1112931840,1113033727,US -1113033728,1113033983,PR -1113033984,1113591807,US -1113591808,1113595903,CA -1113595904,1113596415,CL -1113596416,1113596927,GT -1113596928,1113597183,PE -1113597184,1113597439,US -1113597440,1113597695,PE -1113597696,1113598463,PA -1113598464,1113599487,US -1113599488,1113599999,VE -1113600000,1113600255,US -1113600256,1113603071,VE -1113603072,1113603327,US -1113603328,1113603583,GT -1113603584,1113603839,US -1113603840,1113604095,CA -1113604096,1113636863,US -1113636864,1113645055,SG -1113645056,1113653247,ID -1113653248,1113657343,US -1113657344,1113661439,CA -1113661440,1113669631,US -1113669632,1113677823,CA -1113677824,1113681919,US -1113686016,1113695231,US -1113695232,1113695487,CA -1113695488,1113697279,US -1113697280,1113697791,BM -1113697792,1113699327,US -1113699328,1113700351,CA -1113700352,1113718783,US -1113718784,1113743359,DO -1113743360,1113854207,US -1113854208,1113854463,CA -1113854464,1113854975,US -1113854976,1113855487,CA -1113855488,1113983249,US -1113983250,1113983250,RU -1113983251,1113983251,KG -1113983252,1113983364,US -1113983365,1113983365,LT -1113983366,1113984643,US -1113984644,1113984645,DE -1113984646,1113997311,US -1113997312,1114005503,CA -1114005504,1114054655,US -1114054656,1114062847,CA -1114062848,1114095615,US -1114095616,1114103807,CA -1114103808,1114505215,US -1114505216,1114506239,CA -1114506240,1114506751,US -1114506752,1114507263,CA -1114507264,1114509567,US -1114509568,1114509571,MX -1114509572,1114511871,US -1114511872,1114512127,CA -1114512128,1114515463,US -1114515464,1114515471,CA -1114515472,1114517503,US -1114517504,1114518015,CA -1114518016,1114520063,US -1114520064,1114520319,PH -1114520320,1114520575,US -1114520576,1114520831,PH -1114520832,1114523971,US -1114523972,1114523975,BM -1114523976,1114523999,US -1114524000,1114524007,BM -1114524008,1114524031,US -1114524032,1114524415,JM -1114524416,1114533375,US -1114533376,1114533887,ZA -1114533888,1114537983,AO -1114537984,1114550271,CA -1114550272,1114588671,US -1114588672,1114589695,CA -1114589696,1114590975,US -1114590976,1114595327,CA -1114595328,1114681343,US -1114681344,1114685439,CA -1114685440,1114730495,US -1114730496,1114734591,CA -1114734592,1114782271,US -1114782272,1114782330,HK -1114782331,1115112575,US -1115112576,1115112607,IN -1115112608,1115113471,US -1115113472,1115114495,HN -1115114496,1115114751,MX -1115114752,1115115007,GT -1115115008,1115115519,US -1115115520,1115116543,HN -1115116544,1115117567,US -1115117568,1115118591,HN -1115118592,1115119615,SV -1115119616,1115127807,US -1115127808,1115131903,CA -1115131904,1115132095,US -1115132096,1115132159,HK -1115132160,1115132671,US -1115132672,1115132927,SG -1115132928,1115133183,US -1115133184,1115133439,CN -1115133440,1115133503,US -1115133504,1115133567,NL -1115133568,1115133951,US -1115133952,1115134079,SG -1115134080,1115134207,US -1115134208,1115134463,IE -1115134464,1115134719,SG -1115134720,1115134975,IE -1115134976,1115135359,HK -1115135360,1115135375,NL -1115135376,1115135391,US -1115135392,1115135647,SG -1115135648,1115135999,US -1115136000,1115144191,CA -1115144192,1115693055,US -1115693056,1115697151,AR -1115697152,1115705343,US -1115705344,1115709439,CA -1115709440,1115783167,US -1115783168,1115791359,CA -1115791360,1115795455,PR -1115795456,1115799551,CA -1115799552,1115815935,US -1115815936,1115947007,CA -1115947008,1115979775,US -1115979776,1116012543,CA -1116012544,1116014079,US -1116014080,1116014335,DE -1116014336,1116014591,US -1116014592,1116014847,DE -1116014848,1116015871,US -1116015872,1116016127,DE -1116016128,1116024063,US -1116024064,1116024319,PG -1116024320,1116027135,US -1116027136,1116027903,DE -1116027904,1116031743,US -1116031744,1116031999,GB -1116032000,1116032255,US -1116032256,1116032511,NL -1116032512,1116032767,US -1116032768,1116033023,GB -1116033024,1116037119,HK -1116037120,1116168191,US -1116168192,1116176383,CA -1116176384,1116198575,US -1116198576,1116198576,DE -1116198577,1116897279,US -1116897280,1116905471,CA -1116905472,1116997119,US -1116997120,1116999423,CA -1116999424,1117000703,US -1117000704,1117002751,CA -1117002752,1117004031,US -1117004032,1117005823,CA -1117005824,1117006847,US -1117006848,1117007871,CA -1117007872,1117009919,US -1117009920,1117010943,CA -1117010944,1117011455,US -1117011456,1117011711,CA -1117011712,1117137919,US -1117137920,1117138175,CA -1117138176,1117142271,US -1117142272,1117142527,CA -1117142528,1117274111,US -1117274112,1117282303,CA -1117282304,1117413375,US -1117413376,1117415423,CA -1117415424,1117416703,US -1117416704,1117417471,CA -1117417472,1117417983,US -1117417984,1117418495,CA -1117418496,1117419007,US -1117419008,1117419519,CA -1117419520,1117454335,US -1117454336,1117454591,CA -1117454592,1117454847,US -1117454848,1117455619,CA -1117455620,1117455620,DE -1117455621,1117456895,CA -1117456896,1117457151,US -1117457152,1117458751,CA -1117458752,1117458815,GB -1117458816,1117458911,CA -1117458912,1117458943,GB -1117458944,1117460223,CA -1117460224,1117460351,GB -1117460352,1117460991,CA -1117460992,1117461247,GB -1117461248,1117469183,CA -1117469184,1117469439,US -1117469440,1117476735,CA -1117476736,1117476799,US -1117476800,1117478519,CA -1117478520,1117478520,DE -1117478521,1117478561,CA -1117478562,1117478562,DE -1117478563,1117478603,CA -1117478604,1117478604,DE -1117478605,1117478610,CA -1117478611,1117478611,DE -1117478612,1117481471,CA -1117481472,1117481727,US -1117481728,1117487103,CA -1117487104,1117683711,US -1117683712,1117691903,CA -1117691904,1117724671,US -1117724672,1117728767,CA -1117728768,1117744127,US -1117744128,1117749247,CA -1117749248,1117823231,US -1117823232,1117823487,CA -1117823488,1117823999,US -1117824000,1117824511,CA -1117824512,1117829375,US -1117829376,1117829631,GR -1117829632,1117978623,US -1117978624,1117986815,CA -1117986816,1117995007,US -1117995008,1117999103,CA -1117999104,1118027775,US -1118027776,1118031871,CA -1118031872,1118126335,US -1118126336,1118126591,CA -1118126592,1118130687,US -1118130688,1118131199,CA -1118131200,1118131967,US -1118131968,1118132479,CA -1118132480,1118132991,US -1118132992,1118133247,CA -1118133248,1118139903,US -1118139904,1118140159,CA -1118140160,1118157567,US -1118157568,1118157583,SV -1118157584,1118158847,US -1118158848,1118167039,CA -1118167040,1118474239,US -1118474240,1118478335,CA -1118478336,1118483455,US -1118483456,1118484479,CA -1118484480,1118515199,US -1118515200,1118519295,CA -1118519296,1118527487,US -1118527488,1118531583,CA -1118531584,1118535679,US -1118535680,1118539775,CA -1118539776,1118543871,US -1118543872,1118547967,CA -1118547968,1118790655,US -1118790656,1118790911,IL -1118790912,1118796543,US -1118796544,1118796799,GB -1118796800,1118962943,US -1118962944,1118963199,AS -1118963200,1118965247,US -1118965248,1118965503,AS -1118965504,1118966015,US -1118966016,1118966271,BR -1118966272,1118969855,US -1118969856,1118970111,LB -1118970112,1118970367,US -1118970368,1118970623,GB -1118970624,1118971647,US -1118971648,1118971903,GY -1118971904,1118972159,US -1118972160,1118972415,VE -1118972416,1118972671,GB -1118972672,1118973183,US -1118973184,1118973439,VE -1118973440,1118975487,US -1118975488,1118975743,KE -1118975744,1118975999,US -1118976000,1118976255,GB -1118976256,1118983423,US -1118983424,1118983679,NI -1118983680,1118984447,US -1118984448,1118984703,SA -1118984704,1118986239,US -1118986240,1118987007,GB -1118987008,1118988287,US -1118988288,1118988543,CA -1118988544,1118988799,US -1118988800,1118989055,VE -1118989056,1118989311,US -1118989312,1118989823,KE -1118989824,1118994175,US -1118994176,1118994431,LR -1118994432,1119072255,US -1119072256,1119074303,CA -1119074304,1119110143,US -1119110144,1119111167,CA -1119111168,1119199231,US -1119199232,1119207169,MN -1119207170,1119207170,US -1119207171,1119207423,MN -1119207424,1119211519,US -1119211520,1119215615,CA -1119215616,1119289343,US -1119289344,1119354879,CA -1119354880,1119428607,US -1119428608,1119432703,VI -1119432704,1119436799,CA -1119436800,1119440895,US -1119440896,1119444991,CA -1119444992,1119469567,US -1119469568,1119477759,CA -1119477760,1119486783,US -1119486784,1119486847,BR -1119486848,1119502335,US -1119502336,1119510527,CA -1119510528,1119558143,US -1119558144,1119558655,PR -1119558656,1119571967,US -1119571968,1119576063,CA -1119576064,1119580159,US -1119580160,1119584255,CA -1119584256,1119611903,US -1119611904,1119612159,BR -1119612160,1120149503,US -1120149504,1120153599,CA -1120153600,1120274943,US -1120274944,1120274991,CA -1120274992,1120282367,US -1120282368,1120282623,SY -1120282624,1120282879,US -1120282880,1120283135,SY -1120283136,1120283647,US -1120283648,1120284671,EC -1120284672,1120286719,CA -1120286720,1120292863,US -1120292864,1120293119,CA -1120293120,1120294911,US -1120294912,1120297215,CA -1120297216,1120306687,US -1120306688,1120306943,PH -1120306944,1120307199,US -1120307200,1120307967,EC -1120307968,1120308223,PH -1120308224,1120310271,US -1120310272,1120310783,PH -1120310784,1120312575,US -1120312576,1120312831,PH -1120312832,1120315391,US -1120315392,1120317439,SG -1120317440,1120346111,US -1120346112,1120350207,CA -1120350208,1120370687,US -1120370688,1120371711,CA -1120371712,1120371967,US -1120371968,1120372479,CA -1120372480,1120372735,US -1120372736,1120378367,CA -1120378368,1120378623,US -1120378624,1120382975,CA -1120382976,1120383231,US -1120383232,1120383487,CA -1120383488,1120383743,US -1120383744,1120385535,CA -1120385536,1120385791,US -1120385792,1120387071,CA -1120387072,1120486655,US -1120486656,1120486911,CA -1120486912,1120487423,US -1120487424,1120487679,CA -1120487680,1120489471,US -1120489472,1120489727,CA -1120489728,1120491519,US -1120491520,1120491775,CA -1120491776,1120492543,US -1120492544,1120493055,CA -1120493056,1120497407,US -1120497408,1120497663,CA -1120497664,1120498943,US -1120498944,1120499199,CA -1120499200,1120509951,US -1120509952,1120516095,SV -1120516096,1120517119,US -1120517120,1120517375,CN -1120517376,1120517631,AR -1120517632,1120517887,US -1120517888,1120518143,CL -1120518144,1120534527,CA -1120534528,1120641023,US -1120641024,1120657407,CA -1120657408,1120737023,US -1120737024,1120737279,BS -1120737280,1120740351,US -1120740352,1120741375,TT -1120741376,1120741631,US -1120741632,1120741887,KN -1120741888,1120743423,US -1120743424,1120743679,KN -1120743680,1120744447,US -1120744448,1120744703,KN -1120744704,1120854015,US -1120854016,1120862207,CA -1120862208,1120875007,US -1120875008,1120875263,AS -1120875264,1120886783,US -1120886784,1120894975,CA -1120894976,1120911359,US -1120911360,1120919551,CA -1120919552,1121005567,US -1121005568,1121009663,CA -1121009664,1121038335,US -1121038336,1121042431,CA -1121042432,1121203199,US -1121203200,1121204223,JM -1121204224,1121205247,US -1121205248,1121205759,PR -1121205760,1121206271,LC -1121206272,1121230847,US -1121230848,1121239039,CA -1121239040,1121250303,US -1121250304,1121250815,BZ -1121250816,1121251039,US -1121251040,1121251047,CA -1121251048,1121252863,US -1121252864,1121253119,BZ -1121253120,1121254159,US -1121254160,1121254167,CA -1121254168,1121763327,US -1121763328,1121767423,CA -1121767424,1121878015,US -1121878016,1121910783,CA -1121910784,1122074623,US -1122074624,1122091007,CA -1122091008,1122092799,US -1122092800,1122093055,CA -1122093056,1122140159,US -1122140160,1122148351,CA -1122148352,1122156543,BS -1122156544,1122203135,US -1122203136,1122203391,GB -1122203392,1122412287,US -1122412288,1122412543,AU -1122412544,1122414335,US -1122414336,1122414591,AU -1122414592,1122416383,US -1122416384,1122416639,DM -1122416640,1122417919,US -1122417920,1122418175,AU -1122418176,1122433023,US -1122433024,1122434047,PR -1122434048,1122451455,US -1122451456,1122455551,CO -1122455552,1122476031,US -1122476032,1122480127,PR -1122480128,1122493439,US -1122493440,1122493951,PR -1122493952,1122495487,US -1122495488,1122495999,PR -1122496000,1122497327,US -1122497328,1122497343,BR -1122497344,1122533375,US -1122533376,1122535423,GB -1122535424,1122538495,KR -1122538496,1122635775,US -1122635776,1122639871,CA -1122639872,1122672639,US -1122672640,1122676735,AU -1122676736,1123123199,US -1123123200,1123127295,CA -1123127296,1123180543,US -1123180544,1123184639,CA -1123184640,1123336191,US -1123336192,1123352575,CA -1123352576,1123394807,US -1123394808,1123394815,CA -1123394816,1123395455,US -1123395456,1123395471,CA -1123395472,1123395615,US -1123395616,1123395616,CA -1123395617,1123395807,US -1123395808,1123395839,CA -1123395840,1123534847,US -1123534848,1123536895,AW -1123536896,1123589631,US -1123589632,1123589887,DE -1123589888,1123590143,US -1123590144,1123598335,VI -1123598336,1123598591,CA -1123598592,1123635626,US -1123635627,1123635627,PL -1123635628,1123635639,US -1123635640,1123635640,RU -1123635641,1123635660,US -1123635661,1123635661,RU -1123635662,1123635670,US -1123635671,1123635671,RU -1123635672,1123635865,US -1123635866,1123635866,IN -1123635867,1123635887,US -1123635888,1123635888,AU -1123635889,1123635909,US -1123635910,1123635910,TW -1123635911,1123635928,US -1123635929,1123635929,PH -1123635930,1123638539,US -1123638540,1123638540,PK -1123638541,1123638573,US -1123638574,1123638574,FR -1123638575,1123638614,US -1123638615,1123638615,RE -1123638616,1123638730,US -1123638731,1123638731,RE -1123638732,1123651583,US -1123651584,1123651839,JM -1123651840,1123652095,BB -1123652096,1123653119,JM -1123653120,1123653375,BB -1123653376,1123653631,JM -1123653632,1123654655,KY -1123654656,1123655679,JM -1123655680,1123663871,US -1123663872,1123667967,SV -1123667968,1123670015,PR -1123670016,1123671039,US -1123671040,1123672063,PY -1123672064,1123694591,US -1123694592,1123694709,CA -1123694710,1123694710,US -1123694711,1123694783,CA -1123694784,1123694787,US -1123694788,1123694847,CA -1123694848,1123778559,US -1123778560,1123794943,ZA -1123794944,1123795199,DO -1123795200,1123801087,US -1123801088,1123801343,RU -1123801344,1123848191,US -1123848192,1123852287,CA -1123852288,1123950591,US -1123950592,1123958783,CA -1123958784,1124853798,US -1124853799,1124853799,JP -1124853800,1125147624,US -1125147625,1125147625,GB -1125147626,1125156304,US -1125156305,1125156305,DE -1125156306,1125228647,US -1125228648,1125228651,FI -1125228652,1125237277,US -1125237278,1125237278,GB -1125237279,1125237919,US -1125237920,1125237923,GB -1125237924,1125474303,US -1125474304,1125478399,CA -1125478400,1125481215,US -1125481216,1125481727,CA -1125481728,1125486591,US -1125486592,1125490687,CA -1125490688,1125498879,US -1125498880,1125508095,CA -1125508096,1125508351,PA -1125508352,1125514239,CA -1125514240,1125514495,CY -1125514496,1125514751,US -1125514752,1125515263,CA -1125515264,1125523455,US -1125523456,1125530623,NL -1125530624,1125531647,US -1125531648,1125543887,CA -1125543888,1125543903,US -1125543904,1125543935,CA -1125543936,1125545983,US -1125545984,1125550079,CA -1125550080,1125550335,US -1125550336,1125552127,CA -1125552128,1125572607,US -1125572608,1125576703,CA -1125576704,1126924287,US -1126924288,1126928383,CA -1126928384,1126948863,US -1126948864,1126952959,CA -1126952960,1127677951,US -1127677952,1127694335,CA -1127694336,1127923711,US -1127923712,1127931903,CA -1127931904,1128529919,US -1128529920,1128641023,CA -1128641024,1128641535,US -1128641536,1128792063,CA -1128792064,1128817407,US -1128817408,1128817663,NL -1128817664,1130535935,US -1130535936,1130536191,FR -1130536192,1130537626,US -1130537627,1130537627,GU -1130537628,1130537727,US -1130537728,1130537983,GU -1130537984,1130538751,US -1130538752,1130539007,GU -1130539008,1133461247,US -1133461248,1133461503,CA -1133461504,1133785351,US -1133785352,1133785359,IE -1133785360,1133785439,US -1133785440,1133785471,GB -1133785472,1133785487,US -1133785488,1133785495,IE -1133785496,1133785519,US -1133785520,1133785535,GB -1133785536,1133789887,US -1133789888,1133789895,NL -1133789896,1133789903,IE -1133789904,1134444543,US -1134444544,1134448639,CA -1134448640,1134545919,US -1134545920,1134545951,BH -1134545952,1134546175,US -1134546176,1134546207,BH -1134546208,1134546943,US -1134546944,1134551039,CA -1134551040,1136721919,US -1136721920,1136787455,CA -1136787456,1137195519,US -1137195520,1137195775,JP -1137195776,1137278975,US -1137278976,1137295359,CA -1137295360,1137369855,US -1137369856,1137370111,CA -1137370112,1137426431,US -1137426432,1137442815,PR -1137442816,1137491967,US -1137491968,1137508351,CA -1137508352,1137524735,US -1137524736,1137541119,CA -1137541120,1137623039,US -1137623040,1137639423,PR -1137639424,1137656831,US -1137656832,1137657855,GB -1137657856,1137659903,DE -1137659904,1137681583,US -1137681584,1137681599,AR -1137681600,1137688063,US -1137688064,1137688319,FR -1137688320,1137704959,US -1137704960,1137712383,CA -1137712384,1137712639,US -1137712640,1137713151,CA -1137713152,1137717247,US -1137721344,1137836031,US -1137840128,1137840383,CA -1137840384,1137840895,US -1137840896,1137841151,DE -1137841152,1137868799,US -1137868800,1137872895,CA -1137872896,1137876991,US -1137876992,1137881087,CA -1137881088,1137889279,US -1137889280,1137893375,CA -1137893376,1137917951,US -1137917952,1137922047,CA -1137922048,1137926655,US -1137926656,1137926911,CA -1137926912,1137929727,US -1137929728,1137929983,IE -1137929984,1137930239,US -1137930240,1137934335,CA -1137934336,1137950719,US -1137950720,1137954815,CA -1137954816,1137963007,US -1137963008,1137967103,VI -1137967104,1137983487,US -1137983488,1137991679,CA -1137991680,1138049023,US -1138049024,1138061311,CA -1138061312,1138068479,US -1138068480,1138069247,AU -1138069248,1138069503,US -1138069504,1138073599,JM -1138073600,1138163711,US -1138163712,1138166935,CA -1138166936,1138166943,SA -1138166944,1138167807,CA -1138167808,1138175999,US -1138176000,1138180095,CA -1138180096,1138184191,US -1138184192,1138184447,SG -1138184448,1138184703,US -1138184704,1138184714,CN -1138184715,1138184715,HK -1138184716,1138184959,CN -1138184960,1138185215,AU -1138185216,1138185727,CA -1138185728,1138185983,ZA -1138185984,1138188287,US -1138188288,1138192383,PR -1138192384,1138196479,NZ -1138196480,1138204671,CA -1138204672,1138212863,US -1138212864,1138216959,CA -1138216960,1138237439,US -1138237440,1138245631,CA -1138245632,1138372607,US -1138372608,1138376703,AS -1138376704,1138415871,US -1138415872,1138416127,CA -1138416128,1138417407,US -1138417408,1138417663,CA -1138417664,1138419711,US -1138419712,1138419967,DE -1138419968,1138451767,US -1138451768,1138451775,IN -1138451776,1138474239,US -1138474240,1138474751,CA -1138474752,1138499583,US -1138499584,1138503679,CA -1138503680,1138507775,US -1138507776,1138508575,CA -1138508576,1138508591,IT -1138508592,1138509823,CA -1138509824,1138510847,IN -1138510848,1138515967,CA -1138515968,1138528255,US -1138528256,1138528511,CA -1138528512,1138544895,US -1138544896,1138545151,GB -1138545152,1138552319,US -1138552320,1138552575,CA -1138552576,1138555135,US -1138555136,1138555391,NL -1138555392,1138556159,US -1138556160,1138556671,NL -1138556672,1138569215,US -1138569216,1138573311,CA -1138573312,1138593791,US -1138593792,1138597887,CA -1138597888,1138704383,US -1138704384,1138716671,CA -1138716672,1138720767,US -1138720768,1138728959,CA -1138728960,1138774015,US -1138774016,1138778111,CA -1138778112,1138780671,US -1138780672,1138780679,CA -1138780680,1138786303,US -1138786304,1138819071,PR -1138819072,1138851839,CA -1138851840,1138917375,US -1138917376,1138937855,CA -1138937856,1138940415,US -1138940416,1138940671,CA -1138940672,1138941951,US -1138941952,1138950143,CA -1138950144,1138951679,US -1138951680,1138951935,GB -1138951936,1138956799,US -1138956800,1138957311,CA -1138957312,1138957823,US -1138957824,1138958079,NL -1138958080,1138958335,CA -1138958336,1138970111,US -1138970112,1138970367,IN -1138970368,1138974719,US -1138974720,1138974975,MX -1138974976,1138975231,US -1138975232,1138976767,MX -1138976768,1138977791,US -1138977792,1138978047,FR -1138978048,1138978303,IT -1138978304,1138978815,HK -1138978816,1138980863,DE -1138980864,1138982911,CN -1138982912,1139146751,US -1139146752,1139154943,GT -1139154944,1139167231,JM -1139167232,1139167743,US -1139167744,1139168255,PR -1139168256,1139169279,US -1139169280,1139169791,PR -1139169792,1139179519,US -1139179520,1139195903,CA -1139195904,1139216383,US -1139216384,1139220479,CA -1139220480,1139265535,US -1139265536,1139269631,CA -1139269632,1145099519,US -1145099520,1145099551,SA -1145099552,1145099567,US -1145099568,1145099697,SA -1145099698,1145099699,US -1145099700,1145099775,SA -1145099776,1145188351,US -1145188352,1145192447,CA -1145192448,1145242111,US -1145242112,1145242367,NO -1145242368,1145244159,US -1145244160,1145244415,NO -1145244416,1145249791,US -1145249792,1145257983,CA -1145257984,1145259247,US -1145259248,1145259251,AE -1145259252,1145286655,US -1145286656,1145287167,SG -1145287168,1145287679,US -1145287680,1145287935,SG -1145287936,1145288191,US -1145288192,1145288447,SG -1145288448,1145307135,US -1145307136,1145311231,CA -1145311232,1145376767,US -1145376768,1145380863,CA -1145380864,1145405439,US -1145405440,1145413631,CA -1145413632,1145421823,US -1145421824,1145430015,CA -1145430016,1145475071,US -1145475072,1145479167,CA -1145479168,1145503743,US -1145503744,1145520127,CA -1145520128,1150287871,US -1150287872,1150812159,CA -1150812160,1151867903,US -1151867904,1151868927,CA -1151868928,1151889407,US -1151889408,1151892703,CA -1151892704,1151892711,DZ -1151892712,1151897599,CA -1151897600,1152073727,US -1152073728,1152077823,CA -1152077824,1152085152,US -1152085153,1152085168,KN -1152085169,1152114687,US -1152114688,1152117759,CA -1152117760,1152117952,IL -1152117953,1152117953,CA -1152117954,1152118015,IL -1152118016,1152122879,CA -1152122880,1152581631,US -1152581632,1152614399,CA -1152614400,1152778239,US -1152778240,1152843775,CA -1152843776,1156071423,US -1156071424,1156079615,CA -1156079616,1156243455,US -1156243456,1156245503,CA -1156245504,1156249599,US -1156249600,1156250623,CA -1156250624,1156296703,US -1156296704,1156300799,CA -1156300800,1157660671,US -1157660672,1157664767,CA -1157664768,1157666815,US -1157666816,1157693439,CA -1157693440,1157753087,US -1157753088,1157753343,GB -1157753344,1157755247,US -1157755248,1157755263,GR -1157755264,1157758207,US -1157758208,1157758463,RU -1157758464,1157910527,US -1157910528,1157910543,CA -1157910544,1157910551,US -1157910552,1157910575,CA -1157910576,1157910591,US -1157910592,1157910615,CA -1157910616,1157910623,US -1157910624,1157910639,CA -1157910640,1157910655,US -1157910656,1157910831,CA -1157910832,1157910847,US -1157910848,1157910863,CA -1157910864,1157910879,US -1157910880,1157911071,CA -1157911072,1157911103,US -1157911104,1157911343,CA -1157911344,1157911351,US -1157911352,1157911775,CA -1157911776,1157911791,US -1157911792,1157911927,CA -1157911928,1157911935,US -1157911936,1157911951,CA -1157911952,1157911983,US -1157911984,1157912015,CA -1157912016,1157912031,US -1157912032,1157912347,CA -1157912348,1157912348,US -1157912349,1157912391,CA -1157912392,1157912399,US -1157912400,1157912447,CA -1157912448,1157912463,US -1157912464,1157912647,CA -1157912648,1157912671,US -1157912672,1157912703,CA -1157912704,1157912735,US -1157912736,1157912743,CA -1157912744,1157912751,US -1157912752,1157912815,CA -1157912816,1157912823,US -1157912824,1157912831,CA -1157912832,1157912839,US -1157912840,1157912895,CA -1157912896,1157912911,US -1157912912,1157913039,CA -1157913040,1157913047,FI -1157913048,1157913087,CA -1157913088,1157913119,US -1157913120,1157913231,CA -1157913232,1157913247,US -1157913248,1157913279,CA -1157913280,1157913295,US -1157913296,1157913439,CA -1157913440,1157913455,US -1157913456,1157913471,CA -1157913472,1157913487,US -1157913488,1157913495,CA -1157913496,1157913503,US -1157913504,1157913583,CA -1157913584,1157913599,US -1157913600,1157913631,CA -1157913632,1157913647,US -1157913648,1157913663,CA -1157913664,1157913679,US -1157913680,1157913759,CA -1157913760,1157913775,US -1157913776,1157913919,CA -1157913920,1157913943,US -1157913944,1157914031,CA -1157914032,1157914047,US -1157914048,1157914079,CA -1157914080,1157914095,US -1157914096,1157914143,CA -1157914144,1157914175,US -1157914176,1157914183,CA -1157914184,1157914191,US -1157914192,1157914194,CA -1157914195,1157914202,IN -1157914203,1157914207,CA -1157914208,1157914223,US -1157914224,1157914239,CA -1157914240,1157914255,US -1157914256,1157914303,CA -1157914304,1157914335,US -1157914336,1157914351,CA -1157914352,1157914367,US -1157914368,1157914623,CA -1157914624,1157931007,US -1157931008,1157935103,BS -1157935104,1157943295,US -1157943296,1157947391,CA -1157947392,1158120959,US -1158120960,1158121215,GB -1158121216,1158148095,US -1158148096,1158152191,CA -1158152192,1158183467,US -1158183468,1158183468,GB -1158183469,1158234111,US -1158234112,1158250495,CA -1158250496,1158295807,US -1158295808,1158296063,GB -1158296064,1158316031,US -1158316032,1158324223,CA -1158324224,1158340607,US -1158340608,1158344703,CA -1158344704,1158348799,US -1158348800,1158381567,CA -1158381568,1158422527,US -1158422528,1158423551,CA -1158423552,1158427647,US -1158427648,1158428159,CA -1158428160,1158440959,US -1158440960,1158441215,CA -1158441216,1158441471,US -1158441472,1158441983,CA -1158441984,1158443007,DM -1158443008,1158774783,US -1158774784,1158784703,CA -1158784704,1158784767,US -1158784768,1158791167,CA -1158791168,1158799359,BM -1158799360,1158807551,CA -1158807552,1158995967,US -1158995968,1159004159,CA -1159004160,1159213055,US -1159213056,1159217151,CA -1159217152,1159249919,US -1159249920,1159254015,PR -1159254016,1159262475,US -1159262476,1159262479,SA -1159262480,1159262487,US -1159262488,1159262491,SA -1159262492,1159269119,US -1159269120,1159269375,AR -1159269376,1159274495,US -1159274496,1159274751,GB -1159274752,1159281919,US -1159281920,1159282175,GB -1159282176,1159300607,US -1159300608,1159300863,SE -1159300864,1159341103,US -1159341104,1159341111,BR -1159341112,1159348223,US -1159348224,1159356415,CA -1159356416,1159421951,US -1159421952,1159430143,CA -1159430144,1159477247,US -1159477248,1159477248,AM -1159477249,1159477503,HK -1159477504,1159480063,US -1159480064,1159480319,CA -1159480320,1159483903,US -1159483904,1159484415,CA -1159484416,1159512063,US -1159512064,1159516271,CA -1159516272,1159516287,US -1159516288,1159516415,CA -1159516416,1159516671,US -1159516672,1159518767,CA -1159518768,1159518775,US -1159518776,1159518975,CA -1159518976,1159519231,US -1159519232,1159520383,CA -1159520384,1159520511,US -1159520512,1159523327,CA -1159523328,1159523583,US -1159523584,1159525119,CA -1159525120,1159525375,US -1159525376,1159526399,CA -1159526400,1159526655,US -1159526656,1159527167,CA -1159527168,1159527423,US -1159527424,1159528191,CA -1159528192,1159668479,US -1159668480,1159668735,CA -1159668736,1159685377,US -1159685378,1159685379,NL -1159685380,1159694591,US -1159694592,1159694847,CA -1159694848,1159700479,US -1159700480,1159725055,CA -1159725056,1160011775,US -1160011776,1160019967,CA -1160019968,1160364031,US -1160364032,1160368127,CA -1160368128,1160392703,US -1160392704,1160392959,CA -1160392960,1160393727,US -1160393728,1160396799,CA -1160396800,1160405759,US -1160405760,1160406015,DO -1160406016,1160406319,US -1160406320,1160406335,DO -1160406336,1160409423,US -1160409424,1160409439,PT -1160409440,1160409599,US -1160409600,1160410111,CO -1160410112,1160410511,US -1160410512,1160410519,EC -1160410520,1160410551,US -1160410552,1160410559,EC -1160410560,1160425471,US -1160425472,1160429567,CA -1160429568,1160547839,US -1160547840,1160548351,MX -1160548352,1160563199,US -1160563200,1160563711,MP -1160563712,1160609791,US -1160609792,1160610815,MX -1160610816,1160662015,US -1160662016,1160662271,CN -1160662272,1160665599,US -1160665600,1160665855,CH -1160665856,1160667135,US -1160667136,1160675327,CA -1160675328,1160683519,US -1160683520,1160691711,CA -1160691712,1160847359,US -1160847360,1160855551,CA -1160855552,1160863999,US -1160864000,1160864255,CA -1160864256,1160921087,US -1160921088,1160925183,AG -1160925184,1160945663,US -1160945664,1160953855,CA -1160953856,1161019391,US -1161019392,1161035775,CA -1161035776,1161052671,US -1161052672,1161052927,GB -1161052928,1161053439,US -1161053440,1161053695,GB -1161053696,1161163263,US -1161163264,1161163519,NL -1161163520,1161293823,US -1161293824,1161297919,CA -1161297920,1161363455,US -1161363456,1161367551,CA -1161367552,1161416703,US -1161416704,1161420799,CA -1161420800,1161421311,AG -1161421312,1161421823,AI -1161421824,1161422079,AG -1161422080,1161422335,VG -1161422336,1161422591,LC -1161422592,1161422847,AG -1161422848,1161424127,LC -1161424128,1161424383,AI -1161424384,1161424895,KN -1161424896,1161425151,VG -1161425152,1161425407,DM -1161425408,1161425663,AG -1161425664,1161425919,AI -1161425920,1161426943,AG -1161426944,1161427199,AI -1161427200,1161427455,VG -1161427456,1161428223,AG -1161428224,1161428991,KN -1161428992,1161429031,CA -1161429032,1161429039,SE -1161429040,1161429111,CA -1161429112,1161429135,US -1161429136,1161429175,CA -1161429176,1161429199,US -1161429200,1161429215,CA -1161429216,1161429255,US -1161429256,1161429295,CA -1161429296,1161429327,US -1161429328,1161429335,CA -1161429336,1161429351,US -1161429352,1161429375,CA -1161429376,1161429407,US -1161429408,1161429431,CA -1161429432,1161429439,US -1161429440,1161429535,CA -1161429536,1161429543,US -1161429544,1161429551,CA -1161429552,1161429583,US -1161429584,1161429647,CA -1161429648,1161429663,US -1161429664,1161429695,CA -1161429696,1161429711,US -1161429712,1161429719,FI -1161429720,1161429727,US -1161429728,1161429759,CA -1161429760,1161429775,US -1161429776,1161429855,CA -1161429856,1161429863,US -1161429864,1161429887,CA -1161429888,1161429903,US -1161429904,1161429999,CA -1161430000,1161430015,US -1161430016,1161430023,FI -1161430024,1161430111,CA -1161430112,1161430159,US -1161430160,1161430191,CA -1161430192,1161430207,US -1161430208,1161430431,CA -1161430432,1161430447,US -1161430448,1161430455,CA -1161430456,1161430463,US -1161430464,1161430527,CA -1161430528,1161430543,US -1161430544,1161430559,CA -1161430560,1161430567,US -1161430568,1161430575,CA -1161430576,1161430591,US -1161430592,1161430727,CA -1161430728,1161430735,FI -1161430736,1161430799,CA -1161430800,1161430815,US -1161430816,1161430847,CA -1161430848,1161430911,US -1161430912,1161430943,CA -1161430944,1161430975,US -1161430976,1161430991,CA -1161430992,1161431007,US -1161431008,1161431039,CA -1161431040,1161431295,CN -1161431296,1161432063,US -1161432064,1161432831,CA -1161432832,1161433087,US -1161433088,1161437183,CA -1161437184,1161453567,US -1161453568,1161457663,CA -1161457664,1161576447,US -1161576448,1161580543,CA -1161580544,1161617407,US -1161617408,1161625599,CA -1161625600,1161631623,US -1161631624,1161631631,KW -1161631632,1161631839,US -1161631840,1161631871,AT -1161631872,1161632071,US -1161632072,1161632075,AT -1161632076,1161649407,US -1161649408,1161649663,AR -1161649664,1161764863,US -1161764864,1161773055,CA -1161773056,1161777151,SZ -1161777152,1161818111,US -1161818112,1161822207,CA -1161822208,1161830852,US -1161830853,1161830853,BZ -1161830854,1161835230,US -1161835231,1161835231,PH -1161835232,1161835948,US -1161835949,1161835949,BZ -1161835950,1161837567,US -1161837568,1161837823,JP -1161837824,1161884927,US -1161884928,1161884959,DE -1161884960,1161885183,US -1161885184,1161885199,JP -1161885200,1161885215,US -1161885216,1161885255,JP -1161885256,1161885695,US -1161885696,1161886207,JP -1161886208,1161887023,US -1161887024,1161887055,NO -1161887056,1161887231,US -1161887232,1161887743,AU -1161887744,1161925631,US -1161925632,1161925887,EC -1161925888,1161926399,US -1161926400,1161926655,EC -1161926656,1162018815,US -1162018816,1162022911,CA -1162022912,1162027007,US -1162027008,1162031103,ZA -1162031104,1162032287,US -1162032288,1162032303,BE -1162032304,1162059775,US -1162059776,1162067967,CA -1162067968,1162215423,US -1162215424,1162280959,CA -1162280960,1162297343,US -1162297344,1162305535,CA -1162305536,1162461183,US -1162461184,1162461695,BB -1162461696,1162462207,GD -1162462208,1162462975,BB -1162462976,1162463999,VC -1162464000,1162465279,BB -1162465280,1162465535,GD -1162465536,1162470911,BB -1162470912,1162471423,GD -1162471424,1162472703,BB -1162472704,1162473471,VC -1162473472,1162475007,GD -1162475008,1162477567,BB -1162477568,1162715135,US -1162715136,1162723327,CA -1162723328,1162806527,US -1162806528,1162806783,PR -1162806784,1162807295,US -1162807296,1162808063,PR -1162808064,1162808319,LC -1162808320,1162809343,PR -1162809344,1162811391,US -1162811392,1162811647,CW -1162811648,1162812159,US -1162812160,1162812415,DO -1162812416,1162813439,BS -1162813440,1162823679,US -1162823680,1162825727,GT -1162825728,1162831871,US -1162831872,1162833919,PR -1162833920,1162835967,GT -1162835968,1162836223,BS -1162836224,1162836735,CW -1162836736,1162836991,US -1162836992,1162838015,BS -1162838016,1162840063,PR -1162840064,1162853375,US -1162853376,1162854399,PR -1162854400,1162858495,JM -1162858496,1162870783,US -1162870784,1162871295,BB -1162871296,1162878975,LC -1162878976,1162882559,DM -1162882560,1162883839,GD -1162883840,1162884863,BB -1162884864,1162885887,VC -1162885888,1162887167,BB -1162887168,1162925983,US -1162925984,1162926015,AU -1162926016,1162926071,US -1162926072,1162926079,AU -1162926080,1163386367,US -1163386368,1163386879,CA -1163386880,1163399167,US -1163399168,1163399423,WS -1163399424,1163400959,US -1163400960,1163401215,BD -1163401216,1163401471,US -1163401472,1163401727,ID -1163401728,1163407359,US -1163407360,1163411455,CA -1163411456,1163468799,US -1163468800,1163469055,PR -1163469056,1163469311,US -1163469312,1163472895,PR -1163472896,1163479295,US -1163479296,1163479551,CA -1163479552,1163526143,US -1163526144,1163529215,CA -1163529216,1163529727,US -1163529728,1163529983,CA -1163529984,1163530239,US -1163530240,1163534335,CA -1163534336,1163534591,US -1163534592,1163555839,CA -1163555840,1163556095,US -1163556096,1163556863,CA -1163556864,1163557119,US -1163557120,1163558911,CA -1163558912,1163561215,US -1163561216,1163561471,CA -1163561472,1163563007,US -1163563008,1163563999,CA -1163564000,1163564031,US -1163564032,1163565567,CA -1163565568,1163565823,US -1163565824,1163566335,CA -1163566336,1163567103,US -1163567104,1163569407,CA -1163569408,1163569919,US -1163569920,1163570943,CA -1163570944,1163571199,US -1163571200,1163573343,CA -1163573344,1163573375,US -1163573376,1163573439,CA -1163573440,1163573503,IN -1163573504,1163573775,CA -1163573776,1163573791,US -1163573792,1163574015,CA -1163574016,1163574031,US -1163574032,1163574143,CA -1163574144,1163574159,US -1163574160,1163574207,CA -1163574208,1163574356,US -1163574357,1163574359,CA -1163574360,1163574527,US -1163574528,1163574879,CA -1163574880,1163574895,US -1163574896,1163575007,CA -1163575008,1163575039,US -1163575040,1163575295,IN -1163575296,1163577599,CA -1163577600,1163577855,US -1163577856,1163579391,CA -1163579392,1163579455,US -1163579456,1163579463,CA -1163579464,1163579471,US -1163579472,1163579487,CA -1163579488,1163579519,US -1163579520,1163579647,CA -1163579648,1163579663,US -1163579664,1163579683,CA -1163579684,1163579710,US -1163579711,1163579727,CA -1163579728,1163579735,US -1163579736,1163579807,CA -1163579808,1163579839,US -1163579840,1163580415,CA -1163580416,1163580543,US -1163580544,1163580819,CA -1163580820,1163580830,US -1163580831,1163581375,CA -1163581376,1163581399,US -1163581400,1163581407,CA -1163581408,1163581423,US -1163581424,1163583487,CA -1163583488,1163584255,US -1163584256,1163584511,CA -1163584512,1163584767,US -1163584768,1163586303,CA -1163586304,1163586559,US -1163586560,1163587327,CA -1163587328,1163587583,US -1163587584,1163589631,CA -1163589632,1163590655,US -1163590656,1163590751,CA -1163590752,1163590783,US -1163590784,1163591679,CA -1163591680,1163808767,US -1163808768,1163812863,MV -1163812864,1167851519,US -1167851520,1168113663,CA -1168113664,1168121855,MM -1168121856,1168138239,US -1168138240,1168146431,JM -1168146432,1168211967,US -1168211968,1168220159,CA -1168220160,1168228863,US -1168228864,1168229119,AU -1168229120,1168229375,HK -1168229376,1168229631,JP -1168229632,1168269887,US -1168269888,1168269951,GB -1168269952,1168279295,US -1168279296,1168279359,CA -1168279360,1168420863,US -1168420864,1168424959,CA -1168424960,1168461823,US -1168461824,1168465919,CA -1168465920,1168474111,US -1168474112,1168486399,CA -1168486400,1168486911,US -1168486912,1168487167,CA -1168487168,1168488447,US -1168488448,1168488703,CA -1168488704,1168490495,US -1168490496,1168506879,CA -1168506880,1168510975,US -1168510976,1168515071,CA -1168515072,1168535551,US -1168535552,1168539647,CA -1168539648,1168593151,US -1168593152,1168593279,CA -1168593280,1168670719,US -1168670720,1168687103,CA -1168687104,1168697599,US -1168697600,1168697855,GB -1168697856,1168698111,NL -1168698112,1168698367,GB -1168698368,1168727551,US -1168727552,1168727807,ES -1168727808,1168850943,US -1168850944,1168851967,HK -1168851968,1168855039,CA -1168855040,1168859135,US -1168859136,1168863231,CA -1168863232,1168867327,US -1168867328,1168875519,CA -1168882548,1168882548,US -1168883712,1168916479,US -1168916480,1168924671,HK -1168924672,1168932863,IT -1168932864,1168936959,US -1168936960,1168951295,CA -1168951296,1168951807,US -1168951808,1168953599,CA -1168953600,1168954047,US -1168954048,1168954079,CA -1168954080,1168954367,US -1168954368,1168954623,CA -1168954624,1168954687,US -1168954688,1168954751,CA -1168954752,1168955076,US -1168955077,1168955093,CA -1168955094,1168955647,US -1168955648,1168956927,CA -1168956928,1168957183,US -1168957184,1168957311,IN -1168957312,1168958495,CA -1168958496,1168958527,US -1168958528,1168958559,IN -1168958560,1168958719,CA -1168958720,1168958847,US -1168958848,1168958975,CA -1168958976,1168959231,US -1168959232,1168959359,CA -1168959360,1168959481,US -1168959482,1168959487,CA -1168959488,1168960511,US -1168960512,1168962567,CA -1168962568,1168962575,US -1168962576,1168965631,CA -1168965632,1168973823,US -1168973824,1168982015,CA -1168982016,1169031167,US -1169031168,1169035263,CA -1169035264,1169203199,US -1169203200,1169211391,CA -1169211392,1170190335,US -1170190336,1170190847,GB -1170190848,1170191103,JP -1170191104,1170191359,US -1170191360,1170191871,DE -1170191872,1170192383,HK -1170192384,1170227199,US -1170227200,1170231295,NL -1170231296,1170350079,US -1170350080,1170355199,CA -1170355200,1170357247,US -1170357248,1170358271,CA -1170358272,1170374655,AE -1170374656,1170382847,US -1170382848,1170386943,HK -1170386944,1170461135,US -1170461136,1170461151,SV -1170461152,1170461183,US -1170461184,1170461695,CO -1170461696,1170467839,US -1170467840,1170468351,DO -1170468352,1170470911,US -1170470912,1170470946,ES -1170470947,1170470947,US -1170470948,1170471167,ES -1170471168,1170472959,US -1170472960,1170481151,CA -1170481152,1170489343,US -1170489344,1170497535,CA -1170497536,1170505727,US -1170505728,1170522111,CA -1170522112,1175977983,US -1175977984,1176068167,CA -1176068168,1176068175,US -1176068176,1176068191,CA -1176068192,1176068207,US -1176068208,1176502271,CA -1176502272,1176616959,US -1176616960,1176627775,CA -1176627776,1176628223,US -1176628224,1176631551,CA -1176631552,1176632063,US -1176632064,1176632319,CA -1176632320,1176632575,US -1176632576,1176632831,GB -1176632832,1176643583,US -1176643584,1176645631,NL -1176645632,1176731647,US -1176731648,1176735743,PR -1176735744,1176736767,US -1176736768,1176737023,CR -1176737024,1176738303,US -1176738304,1176739071,CO -1176739072,1176739583,US -1176739584,1176739839,CO -1176739840,1176743935,CA -1176743936,1176752127,US -1176752128,1176756223,CA -1176756224,1176764415,US -1176764416,1176768511,PM -1176768512,1176771583,US -1176771584,1176771839,GB -1176771840,1176776703,US -1176776704,1176780799,CA -1176780800,1176864255,US -1176864256,1176864319,JP -1176864320,1176864767,US -1176864768,1176865535,PR -1176865536,1176868095,US -1176868096,1176868351,AU -1176868352,1176868863,BR -1176868864,1176895487,US -1176895488,1176897047,CA -1176897048,1176897055,US -1176897056,1176900735,CA -1176900736,1176900743,US -1176900744,1176904871,CA -1176904872,1176904879,US -1176904880,1176907927,CA -1176907928,1176907935,GB -1176907936,1176910343,CA -1176910344,1176910351,CR -1176910352,1176917831,CA -1176917832,1176917839,AU -1176917840,1176925007,CA -1176925008,1176925015,NG -1176925016,1176928255,CA -1176928256,1177000703,US -1177000704,1177000711,CA -1177000712,1177000719,US -1177000720,1177000735,CA -1177000736,1177000751,US -1177000752,1177000759,CA -1177000760,1177022975,US -1177022976,1177023231,GB -1177023232,1177030655,US -1177030656,1177033727,AG -1177033728,1177059327,US -1177059328,1177061375,CA -1177061376,1177062143,US -1177062144,1177075455,CA -1177075456,1177164415,US -1177164416,1177164543,CA -1177164544,1177164863,US -1177164864,1177164895,CA -1177164896,1177165055,US -1177165056,1177165087,CA -1177165088,1177354239,US -1177354240,1177359615,PR -1177359616,1177359871,US -1177359872,1177419775,PR -1177419776,1177550847,US -1177550848,1178075135,CA -1178075136,1178599423,US -1178599424,1179910143,CA -1179910144,1191673855,US -1191673856,1191706623,CA -1191706624,1192232127,US -1192232128,1192232159,PA -1192232160,1192296447,US -1192296448,1192361983,CA -1192361984,1192427519,US -1192427520,1192460287,CA -1192460288,1192468479,US -1192468480,1192476671,CA -1192476672,1192488959,US -1192488960,1192493055,CA -1192493056,1207975935,US -1207975936,1207980031,CA -1207980032,1208008703,US -1208008704,1208016895,CA -1208016896,1208020991,US -1208020992,1208025087,CA -1208025088,1208050943,US -1208050944,1208051199,CA -1208051200,1208074239,US -1208074240,1208082431,CA -1208082432,1208090623,US -1208090624,1208107007,CA -1208107008,1208590335,US -1208590336,1208598527,CA -1208598528,1208647679,US -1208647680,1208659967,CA -1208659968,1208721407,US -1208721408,1208729599,CA -1208729600,1208770559,US -1208770560,1208774655,CA -1208774656,1208778751,US -1208778752,1208795135,CA -1208795136,1208852479,US -1208852480,1208860671,CA -1208860672,1208918015,US -1208918016,1208922111,CA -1208922112,1208935935,US -1208935936,1208935943,AU -1208935944,1208935951,IN -1208935952,1208935959,SG -1208935960,1208935967,HK -1208935968,1208935975,KR -1208935976,1208935983,TW -1208935984,1208935991,IN -1208935992,1208935999,JP -1208936000,1208936003,HK -1208936004,1208936007,US -1208936008,1208936015,ID -1208936016,1208936023,US -1208936024,1208936039,IN -1208936040,1208936047,JP -1208936048,1208936191,US -1208936192,1208936199,AU -1208936200,1208936207,SG -1208936208,1208936215,HK -1208936216,1208936223,IN -1208936224,1208936231,KR -1208936232,1208936239,TW -1208936240,1208936247,JP -1208936248,1208936255,IN -1208936256,1208936263,MY -1208936264,1208936295,US -1208936296,1208936299,HK -1208936300,1208936311,US -1208936312,1208936313,ID -1208936314,1208954879,US -1208954880,1208958975,CA -1208958976,1208975359,US -1208975360,1208983551,CA -1208983552,1209358591,US -1209358592,1209358847,DE -1209358848,1209359103,GB -1209359104,1209434111,US -1209434112,1209436671,BB -1209436672,1209437183,VC -1209437184,1209440767,BB -1209440768,1209441279,GD -1209441280,1209442303,BB -1209442304,1209647103,US -1209647104,1209663487,CA -1209663488,1209718783,US -1209718784,1209719807,NL -1209719808,1209720831,SG -1209720832,1209729023,US -1209729024,1209786367,JM -1209786368,1209810943,US -1209810944,1209819135,CA -1209819136,1209823487,US -1209823488,1209823519,GB -1209823520,1209823543,US -1209823544,1209823551,GB -1209823552,1209824447,US -1209824448,1209824511,GB -1209824512,1209862143,US -1209862144,1209862399,CA -1209862400,1209863423,US -1209863424,1209863679,IN -1209863680,1209884679,US -1209884680,1209884687,ES -1209884688,1209917439,US -1209917440,1209925631,CA -1209925632,1210254935,US -1210254936,1210254943,CA -1210254944,1210257407,US -1210257408,1210261503,CA -1210261504,1210314751,US -1210314752,1210315007,GB -1210315008,1210315775,US -1210315776,1210316031,GB -1210316032,1210316287,US -1210316288,1210316543,NL -1210316544,1210316799,US -1210316800,1210317823,ID -1210317824,1210318335,HK -1210318336,1210420223,US -1210420224,1210420479,IT -1210420480,1210421503,US -1210421504,1210421551,CA -1210421552,1210449919,US -1210449920,1210580991,CA -1210580992,1210847231,US -1210847232,1210851327,BR -1210851328,1210865262,US -1210865263,1210865270,MY -1210865271,1210925055,US -1210925056,1210941439,CA -1210941440,1210994687,US -1210994688,1210997759,CA -1210997760,1211032271,US -1211032272,1211032287,DO -1211032288,1211033087,US -1211033088,1211033599,CO -1211033600,1211236351,US -1211236352,1211269119,PR -1211269120,1211301887,US -1211301888,1211303167,CA -1211303168,1211303423,US -1211303424,1211304959,CA -1211304960,1211305983,US -1211305984,1211306655,CA -1211306656,1211306687,US -1211306688,1211307007,CA -1211307008,1211308031,US -1211308032,1211312522,CA -1211312523,1211312523,US -1211312524,1211315199,CA -1211315200,1211315455,US -1211315456,1211315615,CA -1211315616,1211315647,US -1211315648,1211315663,CA -1211315664,1211315679,US -1211315680,1211317759,CA -1211317760,1211318015,US -1211318016,1211318271,CA -1211318272,1211321343,BB -1211321344,1211322367,VC -1211322368,1211322623,BB -1211322624,1211324415,GD -1211324416,1211324927,VC -1211324928,1211333119,BB -1211333120,1211333631,VC -1211333632,1211333887,GD -1211333888,1211334655,VG -1211334656,1211367935,US -1211367936,1211368191,CA -1211368192,1211368447,EE -1211368448,1211390981,US -1211390982,1211390982,DE -1211390983,1211390989,US -1211390990,1211390990,DE -1211390991,1211391216,US -1211391217,1211391217,IT -1211391218,1211432959,US -1211432960,1211473919,CA -1211473920,1211596799,US -1211596800,1211605999,CA -1211606000,1211606003,US -1211606004,1211613183,CA -1211613184,1216872447,US -1216872448,1217396735,CA -1217396736,1218674687,US -1218674688,1218699263,IN -1218699264,1218705407,HK -1218705408,1218706431,CN -1218706432,1218707455,HK -1218707456,1218987263,US -1218987264,1218987519,CA -1218987520,1219256319,US -1219256320,1219264511,CA -1219264512,1219272703,US -1219272704,1219276799,CA -1219276800,1219290623,US -1219290624,1219290751,AU -1219290752,1219295295,US -1219295296,1219295359,GR -1219295360,1224094463,US -1224094464,1224094719,NL -1224094720,1224104959,US -1224104960,1224105471,NL -1224105472,1224118271,US -1224118272,1224119807,NL -1224119808,1224124415,US -1224124416,1224126463,NL -1224126464,1224138751,US -1224138752,1224140799,NL -1224140800,1224157695,US -1224157696,1224158207,NL -1224158208,1224167935,US -1224167936,1224169471,NL -1224169472,1224169983,US -1224169984,1224171519,NL -1224171520,1224190975,US -1224190976,1224193023,NL -1224193024,1224193535,US -1224193536,1224193791,NL -1224193792,1224194047,US -1224194048,1224194559,NL -1224194560,1224196095,US -1224196096,1224196607,NL -1224196608,1224197119,US -1224197120,1224198143,NL -1224198144,1224200191,US -1224200192,1224200959,NL -1224200960,1224201215,US -1224201216,1224202239,NL -1224202240,1224327167,US -1224327168,1224327295,NL -1224327296,1224327935,US -1224327936,1224327943,CA -1224327944,1224328063,US -1224328064,1224328191,NL -1224328192,1224329215,US -1224329216,1224329471,CA -1224329472,1224331263,US -1224331264,1224333311,PR -1224333312,1224470527,US -1224470528,1224471567,NL -1224471568,1224471568,RU -1224471569,1224473599,NL -1224473600,1224474623,US -1224474624,1224475647,GT -1224475648,1224476671,US -1224476672,1224478719,SX -1224478720,1224480767,US -1224480768,1224484863,JM -1224484864,1224493055,GT -1224493056,1224497151,US -1224497152,1224501247,GT -1224501248,1224523520,JM -1224523521,1224523558,US -1224523559,1224523559,JM -1224523560,1224523775,US -1224523776,1224540159,JM -1224540160,1224671231,US -1224671232,1224687615,PK -1224687616,1224728575,US -1224728576,1224736767,HK -1224736768,1241743359,US -1241743360,1241759743,CA -1241759744,1242300415,US -1242300416,1242562559,CA -1242562560,1244659711,US -1244659712,1244790783,CA -1244790784,1244831743,US -1244831744,1244839935,CA -1244839936,1244844031,US -1244844032,1244846079,MM -1244846080,1244848127,US -1244848128,1244852223,CA -1244852224,1244864511,US -1244864512,1244872703,CA -1244872704,1245183999,US -1245184000,1245446143,CA -1245446144,1246890431,US -1246890432,1246890463,CA -1246890464,1246890464,US -1246890465,1246890495,CA -1246890496,1246895103,US -1246895104,1246895615,NL -1246895616,1246902783,US -1246902784,1246903039,NL -1246903040,1246904575,US -1246904576,1246905343,CA -1246905344,1246905599,US -1246905600,1246912511,CA -1246912512,1246923519,US -1246923520,1246923775,AU -1246923776,1246937087,US -1246937088,1246945279,CA -1246945280,1247101439,US -1247101440,1247101695,CA -1247101696,1247123967,US -1247123968,1247124223,CA -1247124224,1247124479,US -1247124480,1247124991,PR -1247124992,1247129599,US -1247129600,1247133695,NL -1247133696,1247498239,US -1247498240,1247502335,CA -1247502336,1248864255,US -1248864256,1248866303,CA -1248866304,1248877311,US -1248877312,1248877567,CA -1248877568,1248885759,US -1248885760,1248886783,CA -1248886784,1248899071,US -1248899072,1248900095,CA -1248900096,1248902143,US -1248902144,1248902655,CA -1248902656,1248913407,US -1248913408,1248915455,MF -1248915456,1248919551,US -1248919552,1248920575,CA -1248920576,1248922623,US -1248922624,1248923647,CA -1248923648,1248924671,US -1248924672,1248925695,CA -1248925696,1248936959,US -1248936960,1248939007,CA -1248939008,1248946175,US -1248946176,1248947199,VG -1248947200,1248964607,US -1248964608,1248966655,CA -1248966656,1248971007,US -1248971008,1248971263,CA -1248971264,1248979711,US -1248979712,1248979967,IE -1248979968,1248997375,US -1248997376,1248998399,ID -1248998400,1249003519,US -1249003520,1249005567,CA -1249005568,1249010687,US -1249010688,1249011711,CA -1249011712,1249019903,US -1249019904,1249020927,CA -1249020928,1249023999,US -1249024000,1249025023,CA -1249025024,1249029119,US -1249029120,1249030143,CA -1249030144,1249036287,US -1249036288,1249037311,TC -1249037312,1249038335,US -1249038336,1249040383,CA -1249040384,1249046527,US -1249046528,1249047551,BM -1249047552,1249059327,US -1249059328,1249059839,CA -1249059840,1249099775,US -1249099776,1249101823,CA -1249101824,1249102847,PR -1249102848,1249103103,US -1249103104,1249103871,CA -1249103872,1249106943,US -1249106944,1249107967,CA -1249107968,1249130495,US -1249130496,1249131519,JM -1249131520,1249139711,US -1249139712,1249140268,MF -1249140269,1249140269,FR -1249140270,1249140735,MF -1249140736,1249142015,US -1249142016,1249142271,GB -1249142272,1249146879,US -1249146880,1249147903,CA -1249147904,1249160703,US -1249160704,1249161215,GB -1249161216,1249163263,US -1249163264,1249165311,CA -1249165312,1249171455,US -1249171456,1249173503,CA -1249173504,1249191935,US -1249191936,1249193983,CA -1249193984,1249195007,US -1249195008,1249196031,CA -1249196032,1249203199,US -1249203200,1249204223,GD -1249204224,1249210367,US -1249210368,1249212415,KY -1249212416,1249217535,US -1249217536,1249218559,CA -1249218560,1249227263,US -1249227264,1249227519,VG -1249227520,1249234687,US -1249234688,1249234943,GB -1249234944,1249236991,US -1249236992,1249239039,KY -1249239040,1249245183,US -1249245184,1249247231,CA -1249247232,1249256447,US -1249256448,1249257471,CA -1249257472,1249260543,US -1249260544,1249261567,CA -1249261568,1249267711,US -1249267712,1249268735,AF -1249268736,1249272831,US -1249272832,1249273855,CA -1249273856,1249310719,US -1249310720,1249311743,CA -1249311744,1249312767,US -1249312768,1249313791,CA -1249313792,1249335295,US -1249335296,1249337343,CA -1249337344,1249359871,US -1249359872,1249361919,CA -1249361920,1249379327,US -1249379328,1249380351,CA -1249380352,1249384447,US -1249384448,1249386495,PR -1249386496,1249391615,US -1249391616,1249392639,CA -1249392640,1249396735,US -1249396736,1249398783,CA -1249398784,1249409023,US -1249409024,1249410047,CA -1249410048,1249434623,US -1249434624,1249435647,CA -1249435648,1249452031,US -1249452032,1249453055,CA -1249453056,1249474559,US -1249474560,1249475583,CA -1249475584,1249479167,US -1249479168,1249479423,FR -1249479424,1249479679,US -1249479680,1249479935,CH -1249479936,1249480191,HK -1249480192,1249484799,US -1249484800,1249486847,CA -1249486848,1249506303,US -1249506304,1249507327,CA -1249507328,1249522687,US -1249522688,1249523711,CA -1249523712,1249531903,US -1249531904,1249533951,GD -1249533952,1249542143,US -1249542144,1249544191,CA -1249544192,1249545215,US -1249546240,1249562623,US -1249562624,1249564671,CA -1249564672,1249571839,US -1249571840,1249572863,CA -1249572864,1249576959,US -1249576960,1249577983,CA -1249577984,1249587199,US -1249587200,1249588223,PR -1249588224,1249592319,US -1249592320,1249593343,CA -1249593344,1249598463,US -1249598464,1249599487,CA -1249599488,1249710143,US -1249710144,1249710207,CN -1249710208,1249710271,NL -1249710272,1249710591,BE -1249710592,1249716479,US -1249716480,1249716735,TW -1249716736,1249717759,US -1249717760,1249718015,FI -1249718016,1249718271,BE -1249718272,1249720319,US -1249720320,1249720351,AU -1249720352,1249720367,JP -1249720368,1249720511,AU -1249720512,1249720527,IN -1249720528,1249720575,AU -1249720576,1249720591,FR -1249720592,1249720599,AU -1249720600,1249720607,DE -1249720608,1249720663,AU -1249720664,1249720671,SE -1249720672,1249720703,AU -1249720704,1249720707,GB -1249720708,1249720711,AU -1249720712,1249720719,NL -1249720720,1249720751,AU -1249720752,1249720767,GB -1249720768,1249720831,AU -1249720832,1249721343,US -1249721344,1249721351,AT -1249721352,1249721359,BE -1249721360,1249721367,CH -1249721368,1249721375,CZ -1249721376,1249721407,DE -1249721408,1249721415,ES -1249721416,1249721423,FI -1249721424,1249721431,FR -1249721432,1249721439,HU -1249721440,1249721447,IE -1249721448,1249721455,IT -1249721456,1249721463,NL -1249721464,1249721471,NO -1249721472,1249721479,PL -1249721480,1249721487,PT -1249721488,1249721495,SE -1249721496,1249721503,GB -1249721504,1249721511,KE -1249721512,1249721519,TR -1249721520,1249721527,ZA -1249721528,1249721535,DK -1249721536,1249721539,PL -1249721540,1249721543,US -1249721544,1249721551,GB -1249721552,1249721599,US -1249721600,1249721607,AT -1249721608,1249721615,BE -1249721616,1249721623,CH -1249721624,1249721631,CZ -1249721632,1249721647,DE -1249721648,1249721655,DK -1249721656,1249721663,ES -1249721664,1249721671,FI -1249721672,1249721679,FR -1249721680,1249721687,HU -1249721688,1249721695,IE -1249721696,1249721703,IT -1249721704,1249721711,NL -1249721712,1249721719,NO -1249721720,1249721727,PL -1249721728,1249721735,PT -1249721736,1249721743,SE -1249721744,1249721751,GB -1249721752,1249721759,DE -1249721760,1249721767,FR -1249721768,1249721775,IE -1249721776,1249721783,RU -1249721784,1249721791,GB -1249721792,1249721799,KE -1249721800,1249721807,TR -1249721808,1249721815,ZA -1249721816,1249721825,US -1249721826,1249721827,IL -1249721828,1249721833,US -1249721834,1249721835,GB -1249721836,1249722111,US -1249722112,1249722367,IN -1249722368,1249724671,US -1249724672,1249724694,BE -1249724695,1249724695,US -1249724696,1249724927,BE -1249724928,1249725183,FI -1249725184,1249726207,US -1249726208,1249726463,FI -1249726464,1249726719,US -1249726720,1249726975,IE -1249726976,1249734655,US -1249734656,1249734911,FI -1249734912,1249752319,US -1249752320,1249752575,BE -1249752576,1249754111,US -1249754112,1249754367,IE -1249754368,1249754390,US -1249754391,1249754391,DE -1249754392,1249754623,US -1249754624,1249754879,SG -1249754880,1249796095,US -1249796096,1249804287,CA -1249804288,1249851903,US -1249851904,1249852159,FR -1249852160,1249886207,US -1249886208,1249902591,CA -1249902592,1254490111,US -1254490112,1254555647,CA -1254555648,1254621183,US -1254621184,1254629375,CA -1254629376,1254653439,US -1254653440,1254653695,CA -1254653696,1254978751,US -1254978752,1254978767,LB -1254978768,1254989823,US -1254989824,1254998015,CA -1254998016,1255002111,US -1255002112,1255006207,CA -1255006208,1255011583,US -1255011584,1255011839,CA -1255011840,1255047167,US -1255047168,1255055359,CA -1255055360,1255210495,US -1255210496,1255210751,DE -1255210752,1255264511,US -1255264512,1255264767,SG -1255264768,1255274495,US -1255274496,1255274751,SG -1255274752,1255276543,US -1255276544,1255342079,CA -1255342080,1255367167,US -1255367168,1255367423,DE -1255367424,1255489535,US -1255489536,1255505919,PR -1255505920,1255514111,US -1255514112,1255522303,CA -1255522304,1255571455,US -1255571456,1255579647,CA -1255579648,1255588351,US -1255588352,1255588607,NL -1255588608,1255669759,US -1255669760,1255735295,CA -1255735296,1255770367,US -1255770368,1255770623,CA -1255770624,1255792127,US -1255792128,1255792383,IL -1255792384,1255972863,US -1255972864,1255981055,CA -1255981056,1256001535,US -1256001536,1256005631,CA -1256005632,1256030207,US -1256030208,1256034303,CA -1256034304,1256054399,US -1256054400,1256054783,CZ -1256054784,1256079359,US -1256079360,1256087551,KY -1256087552,1263525887,US -1263525888,1263534079,CA -1263534080,1264717823,US -1264717824,1264718079,CA -1264718080,1264718719,US -1264718720,1264718847,CA -1264718848,1264719103,US -1264719104,1264719871,CA -1264719872,1264746495,US -1264746496,1264750591,CA -1264750592,1264762879,US -1264762880,1264766975,CA -1264766976,1264991311,US -1264991312,1264991319,JP -1264991320,1265073535,US -1265073536,1265073551,KN -1265073552,1266147327,US -1266147328,1266155519,CA -1266155520,1268252671,US -1268252672,1268776959,CA -1268776960,1274692607,US -1274692608,1274692863,IN -1274692864,1275600895,US -1275600896,1275604991,BM -1275604992,1275621375,US -1275621376,1275625471,CA -1275625472,1275658239,US -1275658240,1275658495,GB -1275658496,1275659007,US -1275659008,1275659263,GB -1275659264,1275665151,US -1275665152,1275665407,UA -1275665408,1275666431,US -1275666432,1275674623,CA -1275674624,1275707391,US -1275707392,1275711487,CA -1275711488,1275712511,US -1275712512,1275715583,CA -1275715584,1275756543,US -1275756544,1275772927,CA -1275772928,1275789311,US -1275789312,1275822079,CA -1275822080,1275912759,US -1275912760,1275912783,CA -1275912784,1279262719,US -1279262720,1279787007,CA -1279787008,1279848447,US -1279848448,1279852543,PR -1279852544,1279950847,US -1279950848,1279956319,CA -1279956320,1279956335,US -1279956336,1279956367,CA -1279956368,1279956383,US -1279956384,1279956991,CA -1279956992,1279959551,US -1279959552,1279959807,CA -1279959808,1279960063,US -1279960064,1279960575,CA -1279960576,1279961855,US -1279961856,1279961967,CA -1279961968,1279961975,US -1279961976,1279962215,CA -1279962216,1279962223,US -1279962224,1279962335,CA -1279962336,1279962367,US -1279962368,1279963135,CA -1279963136,1279963391,US -1279963392,1279963455,CA -1279963456,1279963519,US -1279963520,1279963647,CA -1279963648,1279963775,US -1279963776,1279963999,CA -1279964000,1279964095,US -1279964096,1279964415,CA -1279964416,1279964671,US -1279964672,1279966207,CA -1279966208,1279967231,US -1279967232,1279968767,CA -1279968768,1279969279,US -1279969280,1279971327,CA -1279971328,1279971583,US -1279971584,1279972095,CA -1279972096,1279973375,US -1279973376,1279973887,CA -1279973888,1279973951,US -1279973952,1279973983,CA -1279973984,1279974015,IN -1279974016,1279974143,US -1279974144,1279974399,CA -1279974400,1279974479,US -1279974480,1279974511,CA -1279974512,1279974655,US -1279974656,1279975343,CA -1279975344,1279975359,US -1279975360,1279981567,CA -1279981568,1279999999,US -1280000000,1280032767,CA -1280032768,1280040959,US -1280040960,1280049151,CA -1280049152,1280073727,US -1280073728,1280081919,CA -1280081920,1280090111,US -1280090112,1280091135,AG -1280091136,1280092159,VG -1280092160,1280093183,KN -1280093184,1280094207,VG -1280094208,1280095231,AI -1280095232,1280095487,KN -1280095488,1280097279,AG -1280097280,1280097791,LC -1280097792,1280098303,AG -1280098304,1280102399,PR -1280102400,1280126975,US -1280126976,1280131071,JP -1280131072,1280139263,CA -1280139264,1280242175,US -1280242176,1280243199,CA -1280243200,1291845631,US -1291845632,1292894207,DE -1292894208,1293156351,NO -1293156352,1293549567,DE -1293549568,1293680639,ES -1293680640,1293811711,MK -1293811712,1293942783,SA -1293942784,1294000127,PL -1294000128,1294004223,CH -1294004224,1294073855,PL -1294073856,1294204927,RU -1294204928,1294237695,RO -1294237696,1294270463,IR -1294270464,1294299135,DE -1294299136,1294303231,IR -1294303232,1294335999,RU -1294336000,1294368767,SI -1294368768,1294401535,LV -1294401536,1294434303,RU -1294434304,1294467071,IT -1294467072,1294499839,RU -1294499840,1294532607,NO -1294532608,1294598143,RU -1294598144,1294630911,IR -1294630912,1294663679,LB -1294663680,1294696447,IT -1294696448,1294729215,RU -1294729216,1294761983,GB -1294761984,1294794751,SY -1294794752,1294827519,PL -1294827520,1294860287,RU -1294860288,1294893055,PL -1294893056,1294925823,RS -1294925824,1294958591,DE -1294958592,1294991359,UA -1294991360,1295024639,CZ -1295024640,1295025151,SK -1295025152,1295047679,CZ -1295047680,1295048191,SK -1295048192,1295056895,CZ -1295056896,1295122431,GR -1295122432,1295253503,RU -1295253504,1295319039,UA -1295319040,1295384575,SE -1295384576,1295450111,PT -1295450112,1295515647,PL -1295515648,1295777791,CH -1295777792,1296039935,NL -1296039936,1296072703,SA -1296072704,1296105471,DE -1296105472,1296171007,PL -1296171008,1296203775,DK -1296203776,1296236543,RU -1296236544,1296236671,FR -1296236672,1296236799,US -1296236800,1296237055,IE -1296237056,1296237311,FR -1296237312,1296237439,IE -1296237440,1296237567,IT -1296237568,1296237823,IE -1296237824,1296237824,GB -1296237825,1296237825,IE -1296237826,1296237826,GB -1296237827,1296237878,IE -1296237879,1296237879,GB -1296237880,1296238591,IE -1296238592,1296239103,NL -1296239104,1296239231,IE -1296239232,1296239359,NL -1296239360,1296240383,DE -1296240384,1296241791,IE -1296241792,1296241919,NL -1296241920,1296242303,IE -1296242304,1296242431,NL -1296242432,1296242927,IE -1296242928,1296242943,GB -1296242944,1296242975,IE -1296242976,1296243007,ES -1296243008,1296243111,IE -1296243112,1296243119,GB -1296243120,1296243455,IE -1296243456,1296243711,DE -1296243712,1296244223,US -1296244224,1296244479,NL -1296244480,1296244991,IE -1296244992,1296245247,CH -1296245248,1296245503,IE -1296245504,1296245759,NL -1296245760,1296246783,IE -1296246784,1296247295,NL -1296247296,1296247807,DE -1296247808,1296247999,IE -1296248000,1296248015,ES -1296248016,1296248447,IE -1296248448,1296248575,DE -1296248576,1296248703,IE -1296248704,1296248831,FR -1296248832,1296249023,IE -1296249024,1296249087,GB -1296249088,1296249279,IE -1296249280,1296249343,DE -1296249344,1296249407,IE -1296249408,1296249423,GB -1296249424,1296249439,IE -1296249440,1296249455,GB -1296249456,1296249463,IT -1296249464,1296249471,GB -1296249472,1296249567,IE -1296249568,1296249599,NO -1296249600,1296249615,GB -1296249616,1296249747,IE -1296249748,1296249751,GB -1296249752,1296249823,IE -1296249824,1296249855,FR -1296249856,1296250239,IE -1296250240,1296250271,FR -1296250272,1296250367,IE -1296250368,1296250399,CZ -1296250400,1296250431,DE -1296250432,1296250463,PL -1296250464,1296250495,RO -1296250496,1296250527,IE -1296250528,1296250559,DK -1296250560,1296250847,IE -1296250848,1296250879,GB -1296250880,1296251199,IE -1296251200,1296251231,NL -1296251232,1296251391,IE -1296251392,1296251775,NL -1296251776,1296252479,IE -1296252480,1296252487,ES -1296252488,1296252503,IE -1296252504,1296252507,DE -1296252508,1296252535,IE -1296252536,1296252543,IT -1296252544,1296252551,FR -1296252552,1296252571,IE -1296252572,1296252575,DE -1296252576,1296252591,IE -1296252592,1296252595,GB -1296252596,1296252599,IE -1296252600,1296252607,GB -1296252608,1296252615,NL -1296252616,1296252623,ES -1296252624,1296252647,IE -1296252648,1296252655,GB -1296252656,1296252667,IE -1296252668,1296252671,GB -1296252672,1296252871,IE -1296252872,1296252879,DE -1296252880,1296254207,IE -1296254208,1296254463,US -1296254464,1296256839,IE -1296256840,1296256847,US -1296256848,1296258303,IE -1296258304,1296258559,NL -1296258560,1296258815,US -1296258816,1296259071,NL -1296259072,1296259839,IE -1296259840,1296260095,NL -1296260096,1296260351,US -1296260352,1296261119,IE -1296261120,1296261631,DE -1296261632,1296262383,IE -1296262384,1296262399,IN -1296262400,1296262655,US -1296262656,1296263431,IE -1296263432,1296263439,FR -1296263440,1296263523,IE -1296263524,1296263527,CH -1296263528,1296263679,IE -1296263680,1296263935,US -1296263936,1296264263,IE -1296264264,1296264271,GB -1296264272,1296264287,IE -1296264288,1296264303,US -1296264304,1296265175,IE -1296265176,1296265183,RS -1296265184,1296267263,IE -1296267264,1296267341,DE -1296267342,1296267342,GB -1296267343,1296268287,DE -1296268288,1296268389,IE -1296268390,1296268391,GB -1296268392,1296268799,IE -1296268800,1296269055,FR -1296269056,1296269311,US -1296269312,1296302079,BY -1296302080,1296334847,GB -1296334848,1296367615,DK -1296367616,1296400383,GR -1296400384,1296433151,BH -1296433152,1296465919,BG -1296465920,1296467535,LU -1296467536,1296467543,CD -1296467544,1296469759,LU -1296469760,1296478207,FR -1296478208,1296482077,US -1296482078,1296482078,NO -1296482079,1296482303,US -1296482304,1296483071,GB -1296483072,1296498175,US -1296498176,1296498687,FR -1296498688,1296531455,BG -1296531456,1296564223,MT -1296564224,1296566271,GB -1296566272,1296568319,DE -1296568320,1296570367,RU -1296570368,1296574463,IT -1296574464,1296576511,FR -1296576512,1296578559,DK -1296578560,1296580607,FI -1296580608,1296582655,CH -1296582656,1296584703,IE -1296584704,1296585215,RU -1296585216,1296585983,GB -1296585984,1296586239,BG -1296586240,1296586751,RU -1296586752,1296588799,FR -1296588800,1296590847,SE -1296590848,1296592895,ES -1296592896,1296594943,NL -1296594944,1296596991,RU -1296596992,1296599039,DE -1296599040,1296601087,RU -1296601088,1296605183,NL -1296605184,1296607231,AT -1296607232,1296609279,NL -1296609280,1296611327,CH -1296611328,1296613375,TR -1296613376,1296615423,IT -1296615424,1296617471,GB -1296617472,1296619519,ES -1296619520,1296621567,DE -1296621568,1296623615,SE -1296623616,1296625663,BE -1296625664,1296629759,RU -1296629760,1296633855,GB -1296635904,1296637951,RU -1296640000,1296642047,ES -1296642048,1296644095,RU -1296644096,1296646143,IT -1296646144,1296648191,RU -1296648192,1296650239,GB -1296650240,1296652287,ES -1296652288,1296654335,RU -1296654336,1296656383,BE -1296656384,1296658431,RU -1296658432,1296662527,GB -1296662528,1296664575,KZ -1296664576,1296666623,RU -1296666624,1296670719,GB -1296670720,1296672767,ES -1296672768,1296674815,GB -1296674816,1296676863,BE -1296676864,1296677295,JE -1296677296,1296677303,NG -1296677304,1296677639,JE -1296677640,1296677647,NG -1296677648,1296677727,JE -1296677728,1296677735,NG -1296677736,1296678791,JE -1296678792,1296678799,NG -1296678800,1296678903,JE -1296678904,1296678911,NG -1296678912,1296680959,SA -1296680960,1296683007,ES -1296683008,1296685055,IE -1296685056,1296687103,TR -1296687104,1296689151,NL -1296689152,1296691199,RU -1296691200,1296693247,CH -1296693248,1296695295,DE -1296695296,1296697343,CH -1296697344,1296699391,RU -1296699392,1296701439,IT -1296701440,1296703487,RU -1296703488,1296705535,BY -1296705536,1296707583,GE -1296707584,1296709631,NL -1296709632,1296709887,CY -1296709888,1296711679,CH -1296711680,1296713727,KZ -1296713728,1296715775,RU -1296715776,1296717823,CH -1296717824,1296719871,BE -1296719872,1296721919,CH -1296721920,1296723967,GB -1296723968,1296726015,AT -1296726016,1296728063,GB -1296728064,1296730111,SE -1296730112,1296732159,DE -1296732160,1296734207,IT -1296734208,1296736255,US -1296736256,1296738303,NO -1296738304,1296738815,CH -1296738816,1296739327,FI -1296739328,1296740351,CH -1296740352,1296744447,RU -1296744448,1296746495,GB -1296748544,1296750591,FR -1296750592,1296752639,NO -1296752640,1296754687,BA -1296754688,1296756735,DE -1296756736,1296758783,FR -1296758784,1296760831,RS -1296760832,1296764927,RU -1296764928,1296769023,AT -1296769024,1296771071,TR -1296771072,1296773119,LT -1296775168,1296779263,FR -1296779264,1296781311,CZ -1296781312,1296783359,DK -1296783360,1296785407,LB -1296785408,1296787455,IE -1296787456,1296789503,GB -1296789504,1296791551,CH -1296791552,1296793599,GB -1296793600,1296795647,RU -1296795648,1296797695,GB -1296797696,1296799743,UA -1296799744,1296801791,RU -1296801792,1296803839,DK -1296803840,1296805887,RU -1296805888,1296807935,ES -1296807936,1296812031,GB -1296812032,1296814079,DE -1296814080,1296816127,NO -1296816128,1296818175,TR -1296818176,1296820223,ES -1296820224,1296822271,GB -1296822272,1296824319,IE -1296824320,1296826367,DE -1296826368,1296842751,BG -1296842752,1296859135,GB -1296859136,1296875519,BG -1296875520,1296891903,DE -1296891904,1296908287,BG -1296908288,1296924671,IR -1296924672,1296941055,BG -1296941056,1296957439,BA -1296957440,1296973823,BG -1296973824,1296990207,CZ -1296990208,1296995839,BG -1296995840,1296996095,GB -1296996096,1296998399,BG -1296998400,1297006591,DE -1297006592,1297022975,BA -1297022976,1297039359,LT -1297039360,1297055743,TR -1297055744,1297072127,RU -1297072128,1297088511,PL -1297088512,1297121279,AT -1297121280,1297154047,SE -1297154048,1297154303,RO -1297154304,1297154559,US -1297154560,1297154815,RO -1297154816,1297155071,FR -1297155072,1297155583,RO -1297155584,1297156095,SE -1297156096,1297162239,RO -1297162240,1297166335,IR -1297166336,1297168383,RO -1297168384,1297170431,AZ -1297170432,1297170943,RO -1297170944,1297171455,GB -1297171456,1297172479,RO -1297172480,1297172991,GB -1297172992,1297173503,RO -1297173504,1297175551,IR -1297175552,1297176319,GB -1297176320,1297176831,RO -1297176832,1297177599,GB -1297177600,1297177855,QA -1297177856,1297178111,US -1297178112,1297178367,QA -1297178368,1297178623,RO -1297178624,1297178879,NL -1297178880,1297181439,RO -1297181440,1297181695,GB -1297181696,1297181951,RO -1297181952,1297182207,DE -1297182208,1297182463,NL -1297182464,1297182719,RO -1297182720,1297184767,ES -1297184768,1297185279,BZ -1297185280,1297185791,RO -1297185792,1297185919,NL -1297185920,1297186815,US -1297186816,1297188863,IR -1297188864,1297190143,RO -1297190144,1297190399,ES -1297190400,1297190655,RO -1297190656,1297190911,IT -1297190912,1297195007,IR -1297195008,1297195135,NL -1297195136,1297196031,US -1297196032,1297196799,RO -1297196800,1297197055,CN -1297197056,1297199103,ES -1297199104,1297202175,RO -1297202176,1297202687,SE -1297202688,1297202943,RO -1297202944,1297203199,GB -1297203200,1297211391,IR -1297211392,1297215487,IT -1297215488,1297217535,NL -1297217536,1297219583,AZ -1297219584,1297285119,RU -1297350656,1297416191,FR -1297416192,1297481727,BG -1297481728,1297514495,GB -1297514496,1297547263,FI -1297547264,1297549311,PL -1297549312,1297551359,LT -1297551360,1297553407,SA -1297553408,1297555455,IE -1297555456,1297559551,UA -1297559552,1297561599,DE -1297561600,1297563647,NL -1297563648,1297565695,RU -1297565696,1297567743,PL -1297567744,1297569791,RU -1297569792,1297571839,RO -1297571840,1297573887,RU -1297573888,1297575935,FR -1297575936,1297577983,RU -1297577984,1297580031,PL -1297580032,1297582079,CH -1297582080,1297584127,PL -1297584128,1297588223,UA -1297588224,1297590271,NL -1297590272,1297592319,RU -1297592320,1297594367,GB -1297594368,1297596415,DE -1297596416,1297598463,UA -1297598464,1297602559,RU -1297602560,1297604607,PL -1297604608,1297606655,DE -1297606656,1297610751,CZ -1297610752,1297612799,DE -1297612800,1297615231,RU -1297615232,1297615359,DE -1297615360,1297624831,RU -1297624832,1297625087,US -1297625088,1297629183,RU -1297629184,1297645567,NO -1297645568,1297661951,PL -1297661952,1297670143,UA -1297670144,1297674239,GB -1297674240,1297678335,UA -1297678336,1297694719,IT -1297694720,1297711103,PL -1297711104,1297727487,GB -1297727488,1297743871,MD -1297743872,1297760255,DE -1297760256,1297776639,LT -1297776640,1297782783,DE -1297782784,1297793023,PT -1297793024,1297809407,UA -1297809408,1297825791,PL -1297825792,1297838079,RU -1297838080,1297838335,LU -1297838336,1297842175,RU -1297842176,1297858559,UA -1297858560,1297860607,RU -1297860608,1297862655,PT -1297862656,1297864703,FI -1297864704,1297866751,SE -1297866752,1297868799,RU -1297868800,1297870847,DE -1297870848,1297872895,FR -1297872896,1297874943,GB -1297874944,1297879039,CY -1297879040,1297880063,TR -1297880064,1297883135,CY -1297883136,1297891327,PL -1297891328,1297899519,GB -1297899520,1297915903,TR -1297915904,1297924095,BH -1297924096,1297932287,CZ -1297932288,1297940479,GE -1297940480,1297948671,LV -1297948672,1297956863,UA -1297956864,1297965055,NL -1297965056,1297973247,RU -1297973248,1297981439,GB -1297981440,1297989631,RO -1297989632,1297997823,CZ -1297997824,1298006015,IT -1298006016,1298006783,RU -1298006784,1298014207,KZ -1298014208,1298017279,LT -1298017280,1298018303,BY -1298018304,1298020351,LT -1298020352,1298022399,BY -1298022400,1298030591,IT -1298030592,1298038783,RU -1298038784,1298046975,SI -1298046976,1298063359,RU -1298063360,1298065407,FR -1298065408,1298067455,NO -1298067456,1298071551,NL -1298071552,1298073599,TJ -1298073600,1298075647,RU -1298075648,1298077695,CY -1298077696,1298079743,NL -1298079744,1298081791,GB -1298081792,1298083839,CZ -1298083840,1298085887,PL -1298085888,1298087935,KG -1298087936,1298089983,FR -1298089984,1298092031,NO -1298092032,1298094079,GB -1298094080,1298096127,RU -1298096128,1298098175,NL -1298098176,1298100223,SE -1298100224,1298102271,GB -1298102272,1298104319,CH -1298104320,1298106367,RU -1298106368,1298108415,IT -1298108416,1298110463,FI -1298110464,1298112511,ES -1298112512,1298114559,IE -1298114560,1298116607,IT -1298116608,1298118655,GB -1298118656,1298120703,AM -1298120704,1298122751,CZ -1298122752,1298124799,RU -1298124800,1298126847,IT -1298126848,1298127871,SA -1298127872,1298128127,IR -1298128128,1298128895,SA -1298128896,1298130943,NL -1298130944,1298131455,BG -1298131456,1298132991,PL -1298132992,1298135039,FI -1298135040,1298137087,NL -1298137088,1298661375,GB -1298661376,1298677759,FR -1298677760,1298694143,IR -1298694144,1298708223,US -1298708224,1298708479,NL -1298708480,1298708735,US -1298708736,1298708991,SG -1298708992,1298710527,US -1298710528,1298726911,CZ -1298726912,1298743295,RS -1298743296,1298757631,FI -1298757632,1298759679,FJ -1298759680,1298776063,RU -1298776064,1298792447,SE -1298792448,1298825215,RU -1298825216,1298841599,NO -1298841600,1298857983,RU -1298857984,1298874367,SE -1298874368,1298907135,GB -1298907136,1298923519,IE -1298923520,1298939903,IT -1298939904,1298956287,RU -1298956288,1298972671,GB -1298972672,1298989055,RU -1298989056,1299005439,UA -1299005440,1299008767,NL -1299008768,1299009023,BE -1299009024,1299010047,NL -1299010048,1299011583,BE -1299011584,1299013631,NL -1299013632,1299015679,BE -1299015680,1299017727,NL -1299017728,1299019775,BE -1299019776,1299020031,NL -1299020032,1299021055,BE -1299021056,1299021823,NL -1299021824,1299025148,CH -1299025149,1299025149,DE -1299025150,1299026111,CH -1299026112,1299026127,ES -1299026128,1299038207,CH -1299038208,1299054591,FI -1299054592,1299070975,SE -1299070976,1299087359,SA -1299087360,1299103743,HU -1299103744,1299104255,NO -1299104256,1299104511,SJ -1299104512,1299120127,NO -1299120128,1299136511,SI -1299136512,1299169279,HU -1299169280,1299171327,GB -1299171328,1299172351,US -1299172352,1299173375,GB -1299173376,1299174399,FR -1299174400,1299178495,GB -1299178496,1299180543,CH -1299180544,1299181567,GB -1299181568,1299182591,DK -1299182592,1299183103,SE -1299183104,1299183359,NO -1299183360,1299183615,SE -1299183616,1299185663,FR -1299185664,1299447807,PL -1299447808,1299709951,AT -1299709952,1299724287,UA -1299724288,1299725311,RU -1299725312,1299779071,UA -1299779072,1299779327,RU -1299779328,1299783679,UA -1299783680,1299791871,RU -1299791872,1299935231,UA -1299935232,1299937279,BG -1299937280,1299959807,UA -1299959808,1299963903,RU -1299963904,1299971071,UA -1299971072,1299972095,RU -1299972096,1300234239,IL -1300234240,1300824063,FR -1300824064,1300874239,IL -1300874240,1300889599,FR -1300889600,1301020671,IL -1301020672,1301774847,FR -1301774848,1301774975,GP -1301774976,1302331391,FR -1302331392,1303379967,NL -1303379968,1304428543,DE -1304428544,1305477119,FR -1305477120,1305739263,ES -1305739264,1306001407,DK -1306001408,1306132479,HR -1306132480,1306140671,SE -1306140672,1306148863,EE -1306148864,1306198015,SE -1306198016,1306206207,LV -1306206208,1306214399,HR -1306214400,1306222591,LT -1306222592,1306230783,HR -1306230784,1306263551,LT -1306263552,1306271743,KE -1306271744,1306279935,RU -1306279936,1306288127,IT -1306288128,1306296319,AT -1306296320,1306312703,RU -1306312704,1306315775,UZ -1306315776,1306316031,KG -1306316032,1306316287,RU -1306316288,1306316799,KZ -1306316800,1306317823,RU -1306317824,1306318847,NL -1306318848,1306320895,RU -1306320896,1306329087,DE -1306329088,1306337279,BA -1306337280,1306345471,HU -1306345472,1306353663,LT -1306353664,1306361855,SA -1306361856,1306370047,RU -1306370048,1306378239,GB -1306378240,1306386431,RU -1306386432,1306394623,DK -1306394624,1306402815,ME -1306402816,1306411007,RU -1306411008,1306419199,NL -1306419200,1306427391,RU -1306427392,1306435583,UA -1306435584,1306451967,NO -1306451968,1306460159,PL -1306460160,1306468351,IT -1306468352,1306476543,FI -1306476544,1306492927,RU -1306492928,1306501119,TR -1306501120,1306509311,NO -1306509312,1306525695,PL -1306525696,1307049983,ES -1307049984,1307066367,RU -1307068870,1307068870,CH -1307074560,1307082751,SA -1307082752,1307092991,RU -1307092992,1307095039,GB -1307095040,1307097087,SA -1307097088,1307099135,RU -1307099136,1307107327,RO -1307107328,1307115519,DE -1307115520,1307123711,RU -1307123712,1307131903,NL -1307131904,1307140095,EE -1307140096,1307148287,FR -1307148288,1307156479,GB -1307156480,1307172863,RU -1307172864,1307181055,DK -1307181056,1307189247,RU -1307189248,1307191295,DE -1307191296,1307191551,CZ -1307191552,1307192063,US -1307192064,1307192319,GB -1307192320,1307192575,US -1307192576,1307192755,DE -1307192756,1307192756,AF -1307192757,1307192831,DE -1307192832,1307193343,US -1307193344,1307195391,NO -1307195392,1307197439,CH -1307197440,1307205631,HU -1307205632,1307213823,FI -1307213824,1307222015,SI -1307222016,1307230207,DK -1307230208,1307238399,RU -1307238400,1307246591,SK -1307246592,1307254783,KG -1307254784,1307262975,NL -1307262976,1307271167,AT -1307271168,1307279359,MD -1307279360,1307287551,LB -1307287552,1307295743,DE -1307295744,1307303935,RU -1307303936,1307312127,SE -1307312128,1307320319,PL -1307320320,1307336703,RU -1307336704,1307344895,DE -1307344896,1307353087,RU -1307353088,1307361279,BG -1307361280,1307369471,CZ -1307369472,1307377663,RU -1307377664,1307385855,PL -1307385856,1307394047,AT -1307394048,1307402239,IR -1307402240,1307410431,HR -1307410432,1307418623,CZ -1307418624,1307426815,IR -1307426816,1307435007,CH -1307435008,1307435263,DE -1307435264,1307435327,AL -1307435328,1307435391,ME -1307435392,1307435519,SK -1307435520,1307435647,RU -1307435648,1307435775,LT -1307435776,1307436543,DE -1307436544,1307436799,AU -1307436800,1307437055,US -1307437056,1307441151,ES -1307441152,1307442175,NL -1307442176,1307443199,DE -1307443200,1307451391,IT -1307451392,1307459583,SE -1307459584,1307467775,BG -1307467776,1307469823,RU -1307469824,1307475967,IR -1307475968,1307484159,RU -1307484160,1307492351,GB -1307492352,1307500543,BA -1307500544,1307508735,RU -1307508736,1307516927,BA -1307516928,1307525119,CH -1307525120,1307533311,BA -1307533312,1307535871,GB -1307535872,1307536127,US -1307536128,1307541503,GB -1307541504,1307549695,IT -1307549696,1307557887,UA -1307557888,1307574271,RU -1307574272,1307578367,GB -1307578368,1307582463,FI -1307582464,1307586559,KZ -1307586560,1307590655,GB -1307590656,1307594751,SE -1307594752,1307598847,SA -1307598848,1307602943,CZ -1307602944,1307607039,ES -1307607040,1307611135,SA -1307611136,1307619327,RU -1307619328,1307623423,CZ -1307623424,1307627519,FR -1307627520,1307631615,SE -1307631616,1307635711,IT -1307635712,1307636735,EE -1307636736,1307637759,LV -1307637760,1307639807,LT -1307639808,1307643903,IT -1307643904,1307652095,RU -1307652096,1307656191,ES -1307656192,1307660287,JO -1307660288,1307662335,BE -1307662336,1307662351,NL -1307662352,1307662359,GB -1307662360,1307662367,FR -1307662368,1307664383,BE -1307664384,1307668479,NO -1307668480,1307672575,ES -1307672576,1307676671,DK -1307676672,1307680767,RU -1307680768,1307684863,LV -1307684864,1307688959,GB -1307688960,1307693055,LT -1307693056,1307697151,IT -1307697152,1307701247,NL -1307701248,1307709439,RU -1307709440,1307713535,AL -1307713536,1307717631,IT -1307717632,1307721727,GE -1307721728,1307725823,AT -1307725824,1307729919,CZ -1307729920,1307734015,RU -1307734016,1307738111,NL -1307738112,1307742207,IT -1307742208,1307746303,HU -1307746304,1307750399,UA -1307750400,1307754495,IT -1307754496,1307758591,GB -1307758592,1307758847,SM -1307758848,1307761931,IT -1307761932,1307761932,SM -1307761933,1307762687,IT -1307762688,1307766783,PL -1307766784,1307770879,GB -1307770880,1307774975,RU -1307774976,1307779071,RS -1307779072,1307787263,DK -1307787264,1307791359,MT -1307795456,1307803647,RU -1307803648,1307807743,DK -1307807744,1307811839,SE -1307811840,1307815935,NL -1307816192,1307816703,GB -1307816960,1307817215,NL -1307817216,1307817219,DE -1307817220,1307817223,CZ -1307817224,1307817231,DE -1307817232,1307817251,CZ -1307817252,1307817255,HU -1307817256,1307817259,CZ -1307817260,1307817447,DE -1307817448,1307817455,PT -1307817456,1307817471,DE -1307817728,1307817935,DE -1307817936,1307817943,GR -1307817944,1307817983,DE -1307817984,1307818048,GB -1307818049,1307818049,BE -1307818050,1307818239,GB -1307818496,1307818503,IT -1307818752,1307819263,GB -1307819264,1307819287,NL -1307819288,1307819331,DE -1307819332,1307819343,NL -1307819344,1307819355,DE -1307819356,1307819395,NL -1307819396,1307819399,DE -1307819400,1307819407,NL -1307819408,1307819431,DE -1307819432,1307819439,FI -1307819440,1307819447,LU -1307819448,1307819519,NL -1307819520,1307819775,GB -1307819776,1307820031,BE -1307820032,1307824127,ES -1307824128,1307828223,HU -1307828224,1307832319,NL -1307832320,1307836415,RU -1307836416,1307840511,SE -1307840512,1307844607,RU -1307844608,1307848703,UA -1307848704,1307852799,CH -1307852800,1307856895,RU -1307856896,1307860991,IT -1307860992,1307865087,DE -1307865088,1307869183,AZ -1307869184,1307873279,GB -1307873280,1307877375,TJ -1307877376,1307881471,RU -1307881472,1307885567,IT -1307885568,1307889663,BG -1307889664,1307893759,RU -1307893760,1307897855,SE -1307897856,1307901951,AT -1307901952,1307906047,JO -1307906048,1307910143,CH -1307910144,1307914239,DE -1307914240,1307914495,NL -1307914496,1307914527,GB -1307914528,1307918335,NL -1307918336,1307922431,GB -1307922432,1307926527,NL -1307926528,1307930623,KZ -1307930624,1307934719,RU -1307934720,1307938815,FR -1307938816,1307941242,CY -1307941243,1307941243,TR -1307941244,1307942911,CY -1307942912,1307947007,RU -1307947008,1307951103,CH -1307951104,1307959295,RU -1307959296,1307963391,IR -1307963392,1307967487,PL -1307967488,1307971583,IT -1307971584,1307979775,GB -1307979776,1307981823,ZW -1307981824,1307983871,GB -1307983872,1307987967,LB -1307987968,1307992063,FR -1307992064,1307996159,RU -1307996160,1308000255,DE -1308000256,1308004351,CH -1308004352,1308006399,RU -1308006400,1308007423,DE -1308007424,1308008447,RU -1308008448,1308012543,GB -1308012544,1308016639,ES -1308016640,1308020735,FI -1308020736,1308024831,BG -1308024832,1308030975,RU -1308030976,1308033023,UA -1308033024,1308033685,DE -1308033686,1308033686,GB -1308033687,1308035427,DE -1308035428,1308035428,GB -1308035429,1308035839,DE -1308035840,1308036095,GB -1308036096,1308037119,DE -1308037120,1308041215,UA -1308041216,1308049407,RU -1308049408,1308053503,DK -1308053504,1308055551,DE -1308055552,1308057599,AL -1308065792,1308069887,RU -1308069888,1308073983,NO -1308073984,1308078079,RU -1308078080,1308080127,NL -1308080128,1308082175,RU -1308082176,1308084223,GB -1308084224,1308086271,RS -1308086272,1308088319,RU -1308088320,1308090367,UA -1308090368,1308092415,SK -1308092416,1308096511,RU -1308096512,1308096767,AL -1308096768,1308097535,RS -1308097536,1308098303,AL -1308098304,1308098559,RS -1308098560,1308360703,NL -1308360704,1308622847,PL -1308622848,1308884991,HR -1308884992,1309147135,IT -1309147136,1309409279,PL -1309409280,1309671423,IT -1309671424,1309933567,IE -1309933568,1310195711,BE -1310195712,1310197759,RU -1310197760,1310199807,CZ -1310199808,1310201855,IE -1310201856,1310203903,RU -1310203904,1310205951,FR -1310205952,1310207999,RU -1310208000,1310210047,MD -1310210048,1310212095,RU -1310212096,1310214143,HU -1310214144,1310214399,UA -1310214400,1310214911,GR -1310214912,1310215423,UA -1310215424,1310215679,DE -1310215680,1310216191,UA -1310216192,1310218239,IT -1310222336,1310224383,RS -1310224384,1310226431,GB -1310226432,1310228479,BE -1310228480,1310230527,FR -1310230528,1310232575,ES -1310232576,1310234623,NO -1310234624,1310236671,RU -1310236672,1310238719,PL -1310238720,1310240767,BE -1310240768,1310242815,RU -1310242816,1310244863,HU -1310244864,1310246911,EE -1310246912,1310248959,ZA -1310248960,1310251007,IM -1310251008,1310255103,RU -1310255104,1310257151,CZ -1310257152,1310259199,FR -1310259200,1310261247,GB -1310261248,1310277631,UA -1310277632,1310310399,RU -1310310400,1310326783,GB -1310326784,1310343167,NO -1310343168,1310358783,IT -1310358784,1310359039,US -1310359040,1310359551,IT -1310359552,1310392319,UA -1310392320,1310408703,NL -1310408704,1310425087,FI -1310425088,1310457855,UA -1310457856,1310474239,PL -1310474240,1310490623,EE -1310490624,1310507007,BA -1310507008,1310523391,LV -1310523392,1310556159,RU -1310556160,1310572543,PT -1310572544,1310588927,BE -1310588928,1310605311,ES -1310605312,1310621695,PL -1310621696,1310638079,RS -1310638080,1310654463,UA -1310654464,1310656511,RU -1310656512,1310657535,GB -1310657536,1310658559,SE -1310658560,1310660607,RU -1310660608,1310662655,CZ -1310662656,1310664703,DK -1310664704,1310666751,FR -1310666752,1310668799,NL -1310668800,1310670847,RO -1310670848,1310672895,DE -1310672896,1310674943,RU -1310674944,1310676991,NO -1310676992,1310679039,PL -1310679040,1310681087,RU -1310681088,1310683135,GB -1310683136,1310685183,NL -1310685184,1310687231,PL -1310687232,1310689279,RO -1310689280,1310695423,PL -1310695424,1310695935,RU -1310695936,1310696447,PL -1310696448,1310696703,RO -1310696704,1310696959,SE -1310696960,1310697471,PL -1310697472,1310699519,DE -1310699520,1310701567,UA -1310701568,1310703615,LT -1310705664,1310707711,RU -1310707712,1310707967,GB -1310707968,1310708223,PL -1310708224,1310708479,RU -1310708480,1310708735,GB -1310708736,1310708927,IE -1310708928,1310708943,GB -1310708944,1310709199,IE -1310709200,1310709215,DE -1310709216,1310709231,NL -1310709232,1310709247,IE -1310709248,1310709759,PL -1310709760,1310711807,RU -1310711808,1310713855,LT -1310715904,1310717951,RU -1310720000,1310851071,GB -1310851072,1310921103,DE -1310921104,1310921119,ES -1310921120,1310982143,DE -1310982144,1311113215,RU -1311113216,1311244287,IR -1311244288,1311246335,MK -1311248384,1311250431,GB -1311250432,1311252479,RU -1311252480,1311253479,GB -1311253480,1311253487,IT -1311253488,1311254007,GB -1311254008,1311254015,IT -1311254016,1311254319,GB -1311254320,1311254327,IT -1311254328,1311254527,GB -1311254528,1311256575,SE -1311256576,1311258623,FR -1311258624,1311260671,GB -1311260672,1311262719,NL -1311262720,1311262735,CH -1311262736,1311262767,FR -1311262768,1311264767,CH -1311264768,1311266815,RU -1311266816,1311268863,FR -1311268864,1311270911,BE -1311271936,1311272447,KZ -1311272448,1311272703,NL -1311272704,1311272959,IE -1311275008,1311277055,FR -1311277056,1311279103,IT -1311279104,1311280127,BG -1311280128,1311280383,MK -1311280384,1311281151,BG -1311281152,1311285247,GB -1311285248,1311289343,IT -1311289344,1311291391,LB -1311291392,1311293439,RU -1311293440,1311295487,NL -1311295488,1311297535,IT -1311297536,1311299583,AT -1311299584,1311301631,RU -1311301632,1311303679,TR -1311303680,1311307775,GB -1311307776,1311309823,IS -1311309824,1311311871,GG -1311311872,1311315967,CZ -1311315968,1311318015,PL -1311318016,1311320063,RU -1311320064,1311322111,FR -1311324160,1311326207,LB -1311326208,1311328255,BE -1311328256,1311330303,NL -1311332352,1311338495,RU -1311338496,1311340543,AT -1311340544,1311342591,NO -1311342592,1311344639,FR -1311344640,1311346687,NO -1311346688,1311348735,AT -1311348736,1311350783,GB -1311350784,1311352831,FR -1311352832,1311354879,SK -1311354880,1311356927,RU -1311356928,1311358975,FR -1311358976,1311361023,RU -1311361024,1311363071,NL -1311363072,1311365119,GB -1311365120,1311367167,DE -1311367168,1311369215,GB -1311369216,1311371263,FR -1311371264,1311373311,SE -1311373312,1311375359,FR -1311375360,1311506431,DE -1311506432,1311593431,CZ -1311593432,1311593432,US -1311593433,1311637503,CZ -1311637504,1312292863,DE -1312292864,1312817151,LT -1312817152,1313035071,SE -1313035072,1313035135,DK -1313035136,1313865727,SE -1313865728,1313931263,CZ -1313931264,1313996799,RU -1313996800,1314062335,SE -1314062336,1314127871,BG -1314127872,1314193407,LV -1314193408,1314258943,RU -1314258944,1314324479,GB -1314324480,1314390015,GR -1314390016,1314455551,PL -1314455552,1314521087,KW -1314521088,1314586623,BG -1314586624,1314652159,NO -1314652160,1314717695,HU -1314717696,1314783231,SA -1314783232,1314797978,DE -1314797979,1314797979,FR -1314797980,1314848767,DE -1314848768,1314914303,SA -1314914304,1315045375,RO -1315045376,1315176447,SK -1315176448,1315307519,QA -1315307520,1315438591,CZ -1315438592,1315504127,AT -1315504128,1315569663,GB -1315569664,1315700735,RU -1315700736,1315704831,SE -1315704832,1315708927,HU -1315708928,1315713023,GR -1315713024,1315717119,SE -1315717120,1315725311,RU -1315725312,1315729407,CZ -1315729408,1315729663,IE -1315730176,1315730431,NL -1315731712,1315731967,DE -1315731968,1315732223,IE -1315732224,1315732991,DE -1315732992,1315733247,NL -1315733504,1315737599,NL -1315737600,1315741695,CZ -1315741696,1315745791,LB -1315745792,1315749887,CZ -1315749888,1315753983,RU -1315758080,1315762175,FR -1315762176,1315766271,BG -1315766272,1315770367,NL -1315770368,1315774463,UA -1315774464,1315778559,RU -1315778560,1315780607,AZ -1315780608,1315782655,DE -1315782656,1315786751,AM -1315786752,1315790847,FR -1315790848,1315794943,RS -1315794944,1315803135,RU -1315803136,1315807231,KZ -1315807232,1315815423,GB -1315815424,1315819519,IR -1315819520,1315823615,DK -1315823616,1315827711,IQ -1315827712,1315831807,FR -1315831808,1315835903,SA -1315835904,1315839999,MT -1315840000,1315844095,EE -1315844096,1315848191,RU -1315848192,1315852287,BH -1315852288,1315856383,SE -1315856384,1315860479,SY -1315860480,1315864575,IR -1315864576,1315868671,CH -1315868672,1315872767,RU -1315872768,1315876863,GB -1315876864,1315880959,IT -1315880960,1315885055,BE -1315885056,1315889151,CZ -1315889152,1315893247,DE -1315893248,1315897343,RU -1315897344,1315901439,IR -1315901440,1315905535,UA -1315905536,1315906089,OM -1315906090,1315906090,BA -1315906091,1315906228,OM -1315906229,1315906229,BA -1315906230,1315909631,OM -1315909632,1315913727,AZ -1315913728,1315917823,DE -1315917824,1315921919,RU -1315921920,1315926015,TR -1315926016,1315930111,CZ -1315930112,1315934207,DE -1315934208,1315938303,RU -1315938304,1315942399,DK -1315942400,1315945030,UA -1315945031,1315945031,RU -1315945032,1315946495,UA -1315946496,1315946687,GB -1315946688,1315946727,GG -1315946728,1315946751,GB -1315946752,1315950591,GG -1315950592,1315954687,UA -1315954688,1315958783,DE -1315958784,1315962879,RU -1315962880,1317011455,FR -1317011456,1317044223,BG -1317044224,1317076991,CZ -1317076992,1317109759,BE -1317109760,1317126399,GB -1317126400,1317126655,US -1317126656,1317142527,GB -1317142528,1317175295,PT -1317175296,1317208063,BG -1317208064,1317240831,HU -1317240832,1317273599,PL -1317273600,1317306367,AT -1317306368,1317339135,RU -1317339136,1317371903,MT -1317371904,1317404671,PL -1317404672,1317437439,IT -1317437440,1317470207,HR -1317470208,1317470463,CY -1317470464,1317471231,TR -1317471232,1317472255,CY -1317472256,1317474303,TR -1317474304,1317478399,CY -1317478400,1317502975,TR -1317502976,1317535743,IE -1317535744,1317552127,GB -1317552128,1317568511,ES -1317568512,1317584895,CZ -1317584896,1317601279,RU -1317601280,1317617663,UA -1317617664,1317625855,YE -1317625856,1317627903,DE -1317627904,1317629951,RU -1317629952,1317636095,GB -1317636096,1317637119,IE -1317637120,1317642239,GB -1317642240,1317642495,IE -1317642496,1317643316,GB -1317643317,1317643317,IE -1317643318,1317645615,GB -1317645616,1317645623,IE -1317645624,1317646551,GB -1317646552,1317646559,IE -1317646560,1317647015,GB -1317647016,1317647023,IE -1317647024,1317647026,GB -1317647027,1317647027,IE -1317647028,1317650130,GB -1317650131,1317650131,IE -1317650132,1317650431,GB -1317650432,1317666815,PT -1317666816,1317667791,GB -1317667792,1317667799,NG -1317667800,1317668223,GB -1317668224,1317668231,NG -1317668232,1317669087,GB -1317669088,1317669095,CD -1317669096,1317673575,GB -1317673576,1317673583,CD -1317673584,1317676599,GB -1317676600,1317676607,AO -1317676608,1317677143,GB -1317677144,1317677151,CD -1317677152,1317678271,GB -1317678272,1317678279,CD -1317678280,1317678335,GB -1317678336,1317678343,AO -1317678344,1317678519,GB -1317678520,1317678527,GN -1317678528,1317679319,GB -1317679320,1317679327,NG -1317679328,1317679671,GB -1317679672,1317679679,AO -1317679680,1317679703,GB -1317679704,1317679711,TD -1317679712,1317679911,GB -1317679912,1317679919,CD -1317679920,1317679943,GB -1317679944,1317679951,CD -1317679952,1317679959,GB -1317679960,1317679967,GN -1317679968,1317679991,GB -1317679992,1317679999,CD -1317680000,1317680063,GB -1317680064,1317680071,AO -1317680072,1317683199,GB -1317683200,1317685247,DE -1317685248,1317686271,BE -1317686272,1317687295,NL -1317687296,1317699583,DE -1317699584,1317715967,RU -1317715968,1317732351,SA -1317732352,1317748735,HU -1317748736,1317765119,RU -1317765120,1317781503,GE -1317781504,1317814271,RU -1317814272,1317816335,DE -1317816336,1317816351,JP -1317816352,1317830655,DE -1317830656,1317847039,NL -1317847040,1317863423,RU -1317863424,1317879807,GB -1317879808,1317896191,SK -1317896192,1317912575,LU -1317912576,1317928959,GB -1317928960,1317945343,BG -1317945344,1317978111,AT -1317978112,1317994495,RU -1317994496,1318010879,DE -1318010880,1318027263,DK -1318027264,1318043647,IE -1318043648,1318051839,GB -1318051840,1318055935,PS -1318055936,1318584319,GB -1318584320,1318592511,PL -1318592512,1318593983,NL -1318593984,1318593991,GB -1318593992,1318594007,NL -1318594008,1318594015,GB -1318594016,1318594335,NL -1318594336,1318594343,US -1318594344,1318596543,NL -1318596544,1318596559,SE -1318596560,1318597343,NL -1318597344,1318597359,US -1318597360,1318599679,NL -1318599680,1318599687,IE -1318599688,1318600703,NL -1318600704,1318608895,AT -1318608896,1318617087,IT -1318617088,1318625279,FR -1318625280,1318633471,UA -1318633472,1318649855,IE -1318649856,1318658047,RU -1318658048,1318666239,SI -1318666240,1318674431,DE -1318674432,1318682623,HU -1318682624,1318690815,RU -1318690816,1318699007,DK -1318699008,1318707199,IE -1318707200,1318715391,FR -1318715392,1318723583,BG -1318723584,1318731775,IR -1318731776,1318739967,PL -1318739968,1318748159,GB -1318748160,1318756351,LV -1318756352,1318764543,UA -1318764544,1318780927,KW -1318780928,1318789119,CH -1318789120,1318797311,ME -1318797312,1318805503,SY -1318805504,1318813695,PL -1318813696,1318821887,FR -1318821888,1318838271,RU -1318838272,1318841078,IE -1318841079,1318841079,GB -1318841080,1318846463,IE -1318846464,1318854655,NO -1318854656,1318862847,CZ -1318862848,1318871039,GB -1318871040,1318879231,DK -1318879232,1318887423,CZ -1318887424,1318895615,PL -1318895616,1318897663,SE -1318897664,1318903807,DK -1318903808,1318911999,RU -1318912000,1318920191,MK -1318920192,1318928383,IR -1318928384,1318936383,LT -1318936384,1318936447,BR -1318936448,1318936575,LT -1318936576,1318944767,DK -1318944768,1318958079,CZ -1318958080,1318960127,PL -1318960128,1318961151,CZ -1318961152,1318969343,GB -1318969344,1318977535,RU -1318977536,1318985727,LT -1318985728,1319000063,GB -1319000064,1319002111,US -1319002112,1319010303,IE -1319010304,1319018495,CY -1319018496,1319026687,IR -1319026688,1319034879,UA -1319034880,1319035903,NO -1319035904,1319036927,DK -1319036928,1319038975,SE -1319038976,1319043071,NO -1319043072,1319051263,FR -1319051264,1319059455,UA -1319059456,1319067647,PL -1319067648,1319070271,DE -1319070272,1319070335,PT -1319070336,1319070975,DE -1319070976,1319071103,PL -1319071104,1319071231,DE -1319071232,1319071487,PL -1319071488,1319074815,DE -1319074816,1319074943,PL -1319074944,1319075071,DE -1319075072,1319075199,PL -1319075200,1319075839,DE -1319075840,1319084031,BG -1319084032,1319092223,KW -1319092224,1319100415,IT -1319100416,1319108607,RU -1319108608,1319530036,TR -1319530037,1319530037,GR -1319530038,1321205759,TR -1321205760,1325400063,FR -1325400064,1329594367,IT -1329594368,1330642943,GB -1330642944,1331691519,FR -1331691520,1331757055,PL -1331757056,1331822591,IE -1331822592,1331824639,IT -1331824640,1331826687,RU -1331826688,1331828735,FR -1331828736,1331830783,LT -1331830784,1331832831,GB -1331832832,1331834879,IT -1331834880,1331836927,BY -1331836928,1331838975,FR -1331838976,1331841023,ES -1331841024,1331843071,CZ -1331843072,1331845119,GB -1331845120,1331847167,RU -1331847168,1331849215,FR -1331849216,1331851263,BG -1331851264,1331853311,AL -1331853312,1331855359,AE -1331855360,1331857407,TR -1331857408,1331859455,RU -1331859456,1331861503,PL -1331861504,1331863551,CZ -1331863552,1331865599,GB -1331865600,1331869695,NL -1331871744,1331873791,DK -1331873792,1331877887,RU -1331877888,1331879935,ES -1331879936,1331881983,DE -1331881984,1331886079,GB -1331886080,1331888127,RU -1331888128,1331890175,SE -1331890176,1331892223,IT -1331892224,1331894271,RU -1331894272,1331896319,NL -1331896320,1331898367,FR -1331898368,1331900415,GB -1331900416,1331902463,RU -1331902464,1331904511,MK -1331904512,1331908607,GB -1331908608,1331910655,DE -1331912704,1331914751,DE -1331914752,1331916799,RU -1331916800,1331918847,IT -1331918848,1331920895,BE -1331920896,1331922943,NL -1331922944,1331924991,DE -1331924992,1331927039,GB -1331927040,1331929087,FI -1331929088,1331931135,FR -1331931136,1331933183,SE -1331933184,1331935231,TR -1331935232,1331937279,NL -1331937280,1331939327,GB -1331939328,1331941375,BE -1331941376,1331943423,ES -1331943424,1331945471,RU -1331945472,1331947519,SE -1331947520,1331949567,DE -1331949568,1331951615,RU -1331951616,1331953663,GE -1331953664,1332019199,BG -1332019200,1332084735,RS -1332084736,1332150271,SE -1332150272,1332215807,GR -1332215808,1332346879,RU -1332346880,1332412415,AL -1332412416,1332477951,GR -1332477952,1332609023,ES -1332609024,1332613119,PL -1332613120,1332613375,ES -1332613376,1332614143,UA -1332614144,1332614399,BY -1332614400,1332614655,NL -1332614656,1332614783,UA -1332614784,1332614911,KZ -1332614912,1332615167,RO -1332615168,1332615423,DE -1332615424,1332615679,UA -1332615680,1332616191,RO -1332616192,1332616319,GB -1332616320,1332616447,US -1332616448,1332616703,CZ -1332616704,1332616959,DE -1332616960,1332617087,RU -1332617088,1332617215,CA -1332617216,1332621311,CZ -1332625408,1332629503,RU -1332629504,1332633599,DE -1332633600,1332637695,UA -1332637696,1332641791,BG -1332641792,1332645887,UA -1332645888,1332649983,RS -1332654080,1332658175,RU -1332658176,1332662271,PL -1332662272,1332670463,UA -1332670464,1332740095,RU -1332740096,1333264383,RO -1333264384,1333297151,RU -1333297152,1333362687,HU -1333362688,1333395455,GB -1333395456,1333428223,HU -1333428224,1333460991,RU -1333460992,1333493759,GB -1333493760,1333526527,TR -1333526528,1333526783,BG -1333526784,1333527039,GB -1333527040,1333528575,BG -1333528576,1333528831,GB -1333528832,1333551103,BG -1333551104,1333559295,PL -1333559296,1333592063,UA -1333592064,1333624831,IE -1333624832,1333657599,MK -1333657600,1333690367,RU -1333690368,1333723135,MK -1333723136,1333755903,IR -1333755904,1333788671,CZ -1333788672,1334050815,GR -1334050816,1334059007,BG -1334059008,1334067199,FR -1334067200,1334075391,LV -1334075392,1334083583,RU -1334083584,1334091775,DE -1334091776,1334099967,LT -1334099968,1334108159,IR -1334108160,1334116351,BE -1334116352,1334124543,AX -1334124544,1334125055,AT -1334125056,1334127359,DE -1334127360,1334127615,AT -1334127616,1334132735,DE -1334132736,1334165503,RU -1334165504,1334173695,PL -1334173696,1334181887,LT -1334181888,1334190079,RU -1334190080,1334194175,KZ -1334194176,1334198271,BG -1334198272,1334206463,RU -1334206464,1334214655,FI -1334214656,1334222847,JO -1334222848,1334231039,BG -1334231040,1334239231,RU -1334239232,1334242303,CH -1334242304,1334242559,IS -1334242560,1334243327,CH -1334243328,1334247423,IS -1334247424,1334255615,NO -1334255616,1334263807,IT -1334263808,1334271999,RU -1334272000,1334280191,GB -1334280192,1334288383,LV -1334288384,1334296575,PL -1334296576,1334304767,UA -1334304768,1334312959,RU -1334312960,1334345727,SE -1334345728,1334378495,RU -1334378496,1334378751,FR -1334378752,1334378879,ES -1334378880,1334378887,FR -1334378888,1334378895,ES -1334378896,1334379023,FR -1334379024,1334379039,FI -1334379040,1334379071,FR -1334379072,1334379135,PL -1334379136,1334379263,FR -1334379264,1334379519,PL -1334379520,1334379971,FR -1334379972,1334379975,DE -1334379976,1334380031,FR -1334380032,1334380287,PL -1334380288,1334380447,FR -1334380448,1334380463,LT -1334380464,1334381823,FR -1334381824,1334381839,IT -1334381840,1334381887,FR -1334381888,1334381919,IT -1334381920,1334381983,FR -1334381984,1334382015,FI -1334382016,1334382975,FR -1334382976,1334383103,GB -1334383104,1334383615,FR -1334383616,1334383679,DE -1334383680,1334383743,ES -1334383744,1334383807,IT -1334383808,1334383871,NL -1334383872,1334383935,BE -1334383936,1334383967,IE -1334383968,1334383999,PT -1334384000,1334384031,CZ -1334384032,1334384063,FI -1334384064,1334384095,LT -1334384096,1334384335,FR -1334384336,1334384343,ES -1334384344,1334384735,FR -1334384736,1334384767,BE -1334384768,1334384799,PL -1334384800,1334384831,ES -1334384832,1334384863,DE -1334384864,1334385007,FR -1334385008,1334385023,BE -1334385024,1334385055,IT -1334385056,1334385695,FR -1334385696,1334385727,BE -1334385728,1334386111,FR -1334386112,1334386143,BE -1334386144,1334386175,IT -1334386176,1334389759,FR -1334389760,1334389791,BE -1334389792,1334389823,FR -1334389824,1334389887,ES -1334389888,1334390015,FR -1334390016,1334390271,ES -1334390272,1334390399,FR -1334390400,1334390415,FI -1334390416,1334390431,DE -1334390432,1334390439,LT -1334390440,1334390463,FR -1334390464,1334390527,IE -1334390528,1334390975,FR -1334390976,1334390991,FI -1334390992,1334391359,FR -1334391360,1334391423,IT -1334391424,1334391551,FR -1334391552,1334391615,ES -1334391616,1334391711,FR -1334391712,1334391727,LT -1334391728,1334391871,FR -1334391872,1334391903,DE -1334391904,1334391935,NL -1334391936,1334392063,FR -1334392064,1334392067,CZ -1334392068,1334392095,FR -1334392096,1334392111,PT -1334392112,1334392223,FR -1334392224,1334392255,ES -1334392256,1334392639,FR -1334392640,1334392655,DE -1334392656,1334392847,FR -1334392848,1334392863,FI -1334392864,1334392895,DE -1334392896,1334392959,GB -1334392960,1334392991,NL -1334392992,1334393007,PL -1334393008,1334393023,CZ -1334393024,1334393055,IT -1334393056,1334394383,FR -1334394384,1334394399,GB -1334394400,1334395903,FR -1334395904,1334396927,PL -1334396928,1334402623,FR -1334402624,1334402687,BE -1334402688,1334402751,FR -1334402752,1334402815,DE -1334402816,1334402879,NL -1334402880,1334403071,FR -1334403072,1334403135,IE -1334403136,1334404991,FR -1334404992,1334405119,GB -1334405120,1334405311,FR -1334405312,1334405327,GB -1334405328,1334405759,FR -1334405760,1334405791,FI -1334405792,1334405919,FR -1334405920,1334405951,PL -1334405952,1334406015,DE -1334406016,1334406527,FR -1334406528,1334406543,DE -1334406544,1334406559,FR -1334406560,1334406575,NL -1334406576,1334407071,FR -1334407072,1334407103,GB -1334407104,1334407167,FR -1334407168,1334407231,IE -1334407232,1334407295,BE -1334407296,1334407359,IT -1334407360,1334408191,FR -1334408192,1334408255,ES -1334408256,1334408279,FR -1334408280,1334408287,ES -1334408288,1334408319,FR -1334408320,1334408351,FI -1334408352,1334408367,LT -1334408368,1334408383,FR -1334408384,1334408447,DE -1334408448,1334408823,FR -1334408824,1334408831,ES -1334408832,1334409535,FR -1334409536,1334409567,PL -1334409568,1334409599,FR -1334409600,1334409607,DE -1334409608,1334410735,FR -1334410736,1334410751,GB -1334410752,1334411263,FR -1334411264,1334444031,RU -1334444032,1334509567,SE -1334509568,1334542335,PL -1334542336,1334575103,RU -1334575104,1334579199,UA -1334579200,1334583295,RU -1334583296,1334591487,DE -1334591488,1334595583,RU -1334595584,1334599039,IT -1334599040,1334599167,FR -1334599168,1334599679,IT -1334599680,1334603775,RU -1334603776,1334607871,DE -1334607872,1334611967,IE -1334611968,1334616063,ME -1334616064,1334620159,MD -1334620160,1334624255,DE -1334624256,1334628351,GB -1334628352,1334632447,IE -1334632448,1334636543,KZ -1334636544,1334640639,RU -1334640640,1334644735,FR -1334644736,1334647039,DE -1334647040,1334647807,IQ -1334647808,1334648831,DE -1334648832,1334652927,GB -1334652928,1334661119,RU -1334661120,1334665215,CH -1334665216,1334669311,NO -1334669312,1334673407,MK -1334673408,1334677503,GB -1334677504,1334681599,FI -1334681600,1334681855,PL -1334681856,1334682111,NL -1334682112,1334682367,IE -1334682368,1334682623,NL -1334682624,1334682879,NO -1334682880,1334682900,GB -1334682901,1334682901,DK -1334682902,1334683135,GB -1334683136,1334683391,CZ -1334683392,1334683647,CH -1334683648,1334683903,NL -1334683904,1334684031,DE -1334684032,1334684159,NL -1334684160,1334684415,SE -1334684416,1334684479,NL -1334684480,1334684511,DE -1334684512,1334684671,NL -1334684672,1334684927,FI -1334684928,1334685183,NL -1334685184,1334685695,DE -1334685696,1334689791,IT -1334689792,1334693887,FR -1334693888,1334697983,RU -1334697984,1334702079,SY -1334702080,1334706175,CZ -1334706176,1334706431,BA -1334706432,1334706687,AT -1334706688,1334710271,BA -1334710272,1334714367,RU -1334714368,1334718463,DE -1334718464,1334722559,KZ -1334722560,1334723839,NL -1334723840,1334724095,DK -1334724096,1334724351,BG -1334724352,1334724607,SE -1334724608,1334724863,US -1334724864,1334725631,NL -1334725632,1334726143,SE -1334726144,1334726399,LU -1334726400,1334726655,SE -1334726656,1334729983,RU -1334729984,1334730495,KZ -1334730496,1334734847,RU -1334734848,1334738943,LT -1334738944,1334743039,CH -1334743040,1334747135,CZ -1334747136,1334751231,RU -1334755328,1334759423,UA -1334759424,1334763519,SE -1334763520,1334767615,DK -1334767616,1334771711,SE -1334771712,1334779903,RU -1334779904,1334783999,UA -1334784000,1334784255,GB -1334784256,1334784511,RO -1334784512,1334788095,GB -1334788096,1334792191,RU -1334792192,1334793320,GB -1334793321,1334793321,IR -1334793322,1334793471,GB -1334793472,1334793983,IR -1334793984,1334794239,GB -1334794240,1334796287,ES -1334796288,1334800383,ME -1334800384,1334804479,IT -1334804480,1334808575,FR -1334808576,1334812671,GB -1334812672,1334816767,BA -1334816768,1334820863,DE -1334820864,1334824959,IE -1334824960,1334829055,NL -1334829056,1334833151,RU -1334833152,1334837247,FR -1334837248,1335885823,ES -1335885824,1336016895,NO -1336016896,1336049663,PL -1336049664,1336066047,ES -1336066048,1336147967,PL -1336147968,1336279039,RU -1336279040,1336410111,GR -1336410112,1336541183,PT -1336541184,1336543231,SA -1336543232,1336545279,ES -1336545280,1336547327,SE -1336547328,1336549375,RU -1336549376,1336551423,IM -1336551424,1336553471,GB -1336553472,1336555519,SA -1336555520,1336557567,BE -1336557568,1336559615,ES -1336559616,1336561663,GB -1336561664,1336563711,NO -1336563712,1336567807,NL -1336567808,1336569855,BY -1336571904,1336573951,PL -1336573952,1336575999,DK -1336576000,1336578047,RU -1336580096,1336584191,RU -1336584192,1336586239,TR -1336586240,1336588287,GB -1336588288,1336590335,TJ -1336590336,1336592383,GB -1336592384,1336594431,AM -1336594432,1336596479,AT -1336596480,1336598527,FR -1336598528,1336600575,MD -1336600576,1336602623,FR -1336602624,1336604671,IE -1336604672,1336606719,CZ -1336606720,1336608767,PL -1336608768,1336610815,RU -1336610816,1336612863,TR -1336612864,1336614911,ES -1336614912,1336616959,GB -1336616960,1336619007,ES -1336619008,1336621055,AL -1336621056,1336623103,DE -1336623104,1336625151,BE -1336625152,1336627199,IE -1336627200,1336629247,NO -1336629248,1336631295,DE -1336631296,1336633343,IS -1336633344,1336635391,ES -1336635392,1336637439,RU -1336637440,1336639487,UA -1336639488,1336643583,HU -1336643584,1336644887,DK -1336644888,1336644895,NO -1336644896,1336645631,DK -1336645632,1336647679,GB -1336647680,1336649727,IT -1336649728,1336651775,RU -1336651776,1336653823,DE -1336653824,1336655871,CZ -1336655872,1336657919,NL -1336657920,1336659967,DE -1336659968,1336662015,RU -1336662016,1336664063,ES -1336664064,1336668159,FI -1336668160,1336670207,BH -1336670208,1336672255,SE -1336672256,1336705023,RU -1336705024,1336721407,SA -1336721408,1336737791,HU -1336737792,1336754175,PL -1336754176,1336770559,RU -1336770560,1336786943,GB -1336786944,1336803327,JO -1336811520,1336827903,RU -1336827904,1336836095,AT -1336836096,1336837119,BE -1336837120,1336837151,NL -1336837152,1336837183,BE -1336837184,1336837191,FR -1336837192,1336837199,NL -1336837200,1336837207,GB -1336837208,1336838143,BE -1336838144,1336842239,DE -1336842240,1336844287,DK -1336844288,1336846335,IR -1336846336,1336848383,GB -1336848384,1336850431,NO -1336850432,1336852479,RU -1336852480,1336868863,FR -1336868864,1336885247,RU -1336885248,1336901631,RS -1336901632,1336918015,IR -1336918016,1336934399,PL -1336934400,1337241562,IL -1337241563,1337241563,RO -1337241564,1337458687,IL -1337458688,1337982975,PL -1337982976,1342177279,DE -1342177280,1342701567,GB -1342701568,1342750719,RE -1342750720,1342750975,YT -1342750976,1342751743,FR -1342751744,1342752511,YT -1342752512,1342752767,FR -1342752768,1342753023,YT -1342753024,1342753535,FR -1342753536,1342753791,YT -1342753792,1342754047,FR -1342754048,1342754303,YT -1342754304,1342754559,FR -1342754560,1342755327,YT -1342755328,1342755583,FR -1342755584,1342755839,YT -1342755840,1342756351,FR -1342756352,1342756607,YT -1342756608,1342757375,FR -1342757376,1342758655,YT -1342758656,1342758911,FR -1342758912,1342759423,YT -1342759424,1342759679,FR -1342759680,1342759935,YT -1342759936,1342761215,FR -1342761216,1342761471,YT -1342761472,1342761727,FR -1342761728,1342761983,YT -1342761984,1342762239,FR -1342762240,1342762495,YT -1342762496,1342765311,FR -1342765312,1342765567,YT -1342765568,1342766335,FR -1342766336,1342766847,YT -1342766848,1342834687,FR -1342834688,1342842879,JO -1342842880,1342844927,FR -1342844928,1342853119,JO -1342853120,1342860799,FR -1342860800,1342861055,RE -1342861056,1342869503,FR -1342869504,1342871551,JO -1342871552,1342875647,FR -1342875648,1342877695,JO -1342877696,1342959049,FR -1342959050,1342959050,RE -1342959051,1342988287,FR -1342988288,1342989055,US -1342989056,1342996479,FR -1342996480,1342996735,GF -1342996736,1342996991,FR -1342996992,1342997247,GF -1342997248,1342997503,FR -1342997504,1342998527,GF -1342998528,1342999039,FR -1342999040,1343000319,GF -1343000320,1343000575,FR -1343000576,1343000831,GF -1343000832,1343001087,FR -1343001088,1343001855,GF -1343001856,1343002111,FR -1343002112,1343002623,GF -1343002624,1343002879,FR -1343002880,1343003903,GF -1343003904,1343004159,FR -1343004160,1343005695,GF -1343005696,1343005951,FR -1343005952,1343007743,GF -1343007744,1343007999,FR -1343008000,1343009023,GF -1343009024,1343009279,FR -1343009280,1343009791,GF -1343009792,1343010047,FR -1343010048,1343010559,GF -1343010560,1343011071,FR -1343011072,1343011327,GF -1343011328,1343011839,FR -1343011840,1343012863,GF -1343012864,1343018239,FR -1343018240,1343018495,RE -1343018496,1343027711,FR -1343027712,1343027967,RE -1343027968,1343218687,FR -1343218688,1343219711,DE -1343219712,1343220479,FR -1343220480,1343220671,DE -1343220672,1343220735,FR -1343220736,1343220863,GB -1343220864,1343221055,FR -1343221056,1343221119,GB -1343221120,1343221247,DE -1343221248,1343221759,FR -1343221760,1343222399,GB -1343222400,1343222911,FR -1343222912,1343223039,US -1343223040,1343223679,FR -1343223680,1343223687,LB -1343223688,1343224255,FR -1343224256,1343224303,US -1343224304,1343225855,FR -1343225856,1343750143,IT -1343750144,1344798719,ES -1344798720,1345323007,GB -1345323008,1345404927,PL -1345404928,1345421311,ES -1345421312,1345601535,PL -1345601536,1345617919,ES -1345617920,1345847295,PL -1345847296,1345978367,NL -1345978368,1346109439,ES -1346109440,1346240511,NL -1346240512,1346371583,DK -1346371584,1346375679,FI -1346375680,1346379775,RU -1346379776,1346383871,ES -1346383872,1346387967,GB -1346387968,1346392063,HU -1346392064,1346396159,UA -1346396160,1346398335,RU -1346398336,1346398367,DE -1346398368,1346398687,RU -1346398688,1346398719,DE -1346398720,1346400255,RU -1346400256,1346404351,IT -1346404352,1346407423,AT -1346407424,1346408447,DE -1346408448,1346412543,LU -1346412544,1346416639,RU -1346416640,1346420735,DE -1346420736,1346424831,NO -1346428928,1346433023,FR -1346433024,1346439167,NL -1346439168,1346441215,ES -1346441216,1346445311,RU -1346445312,1346449407,DE -1346449408,1346453503,NO -1346453504,1346461695,BA -1346461696,1346469887,NL -1346469888,1346473983,BE -1346473984,1346478079,IT -1346478080,1346482175,BA -1346482176,1346486271,CZ -1346486272,1346490367,SE -1346494464,1346498559,FR -1346498560,1346502655,IM -1346502656,1346510847,DE -1346510848,1346519039,AT -1346519040,1346527231,RU -1346527232,1346531327,DE -1346531328,1346535423,ES -1346535424,1346539519,BE -1346539520,1346543615,RU -1346543616,1346547711,FI -1346547712,1346551807,IR -1346555904,1346559999,IT -1346560000,1346564095,LI -1346564096,1346568191,EE -1346568192,1346569815,SE -1346569816,1346569819,ES -1346569820,1346569983,SE -1346569984,1346570239,NO -1346570240,1346572287,SE -1346572288,1346576383,DE -1346580480,1346584575,RU -1346584576,1346588159,US -1346588160,1346588671,KR -1346588928,1346589439,US -1346589440,1346589695,DE -1346589696,1346592767,US -1346592768,1346596863,ES -1346596864,1346600959,IT -1346600960,1346605055,MU -1346605056,1346609151,CH -1346609152,1346614527,FR -1346614528,1346614783,BE -1346614784,1346617343,FR -1346617344,1346621439,SE -1346621440,1346625535,RU -1346625536,1346629631,DE -1346629632,1346637823,RU -1346637824,1346650111,GB -1346650112,1346654207,RU -1346654208,1346658303,GB -1346658304,1346666495,SE -1346666496,1346670591,ES -1346670592,1346674687,IT -1346674688,1346678783,DE -1346678784,1346686975,IT -1346686976,1346691071,GB -1346691072,1346695167,PL -1346695168,1346699263,RU -1346699264,1346707455,GB -1346707456,1346711551,DE -1346711552,1346715647,AZ -1346715648,1346723839,NL -1346723840,1346732031,DE -1346732032,1346736127,GB -1346736128,1346740223,RU -1346740224,1346744319,FI -1346744320,1346748415,RU -1346748416,1346752511,DE -1346752512,1346756607,FR -1346756608,1346760703,SE -1346760704,1346764799,IR -1346764800,1346768895,DK -1346768896,1346772991,LV -1346772992,1346777087,FR -1346777088,1346781183,GB -1346781184,1346789375,UA -1346789376,1346793471,RU -1346793472,1346795519,IT -1346795520,1346797567,SY -1346797568,1346801663,IL -1346801664,1346805759,SE -1346805760,1346806031,DE -1346806032,1346806047,CH -1346806048,1346818047,DE -1346818048,1346822143,FR -1346822144,1346826239,RU -1346826240,1346830335,RS -1346830336,1346838527,GB -1346838528,1346842623,RU -1346842624,1346846719,MT -1346846720,1346854911,DK -1346854912,1346859007,MT -1346859008,1346863103,IR -1346863104,1346867199,DK -1346867200,1346871295,BA -1346871296,1346879487,RU -1346879488,1346883583,FI -1346883584,1346887679,RU -1346887680,1346891775,IT -1346891776,1346895871,RU -1346895872,1346899967,SE -1346899968,1346904063,RU -1346904064,1346908159,PL -1346908160,1346912255,LI -1346912256,1346920447,BG -1346920448,1346924543,KE -1346924544,1346928639,RU -1346928640,1346932735,DE -1346932736,1346936831,DK -1346936832,1346940927,IT -1346940928,1346945023,KG -1346945024,1346949119,PL -1346949120,1346957311,RU -1346957312,1346961407,DE -1346961408,1346965503,UA -1346965504,1346969599,RU -1346969600,1346973695,DE -1346973696,1346977791,SE -1346977792,1346985983,RU -1346985984,1346994175,DE -1346994176,1346998271,NL -1346998272,1347002367,ES -1347002368,1347006463,RU -1347006464,1347010559,SE -1347010560,1347014655,RU -1347014656,1347018751,GG -1347018752,1347022847,IT -1347022848,1347024895,AT -1347024896,1347035135,GB -1347035136,1347039231,CZ -1347039232,1347043327,RO -1347043328,1347047423,FR -1347047424,1347051519,SA -1347051520,1347059711,IL -1347059712,1347067903,CH -1347067904,1347071999,RS -1347072000,1347076095,IT -1347076096,1347084287,FI -1347084288,1347092479,GB -1347092480,1347096575,IR -1347096576,1347100671,SE -1347100672,1347108863,AT -1347108864,1347112959,GB -1347112960,1347117055,RU -1347117056,1347121151,FI -1347121152,1347125247,CH -1347125248,1347129343,RU -1347129344,1347133439,FR -1347133440,1347141631,EG -1347141632,1347145727,CH -1347145728,1347146239,IN -1347146240,1347146751,DE -1347146752,1347147007,IN -1347147008,1347147263,DE -1347147264,1347147775,GB -1347147776,1347148287,DE -1347148288,1347148543,GB -1347148544,1347148799,IN -1347148800,1347149055,NO -1347149056,1347149311,GB -1347149312,1347149567,DE -1347149568,1347149823,IN -1347149824,1347151423,HU -1347151424,1347158015,AT -1347158016,1347159935,CH -1347159936,1347160063,AT -1347160064,1347162111,CH -1347162112,1347166207,IT -1347174400,1347182591,IT -1347182592,1347186687,RU -1347186688,1347190783,GB -1347190784,1347194879,RU -1347194880,1347198975,SE -1347198976,1347200511,QA -1347200512,1347200601,US -1347200602,1347200602,QA -1347200603,1347200767,US -1347200768,1347203071,QA -1347203072,1347207167,RU -1347207168,1347215359,GB -1347215360,1347223551,RU -1347223552,1347225599,GB -1347225600,1347226623,PK -1347226624,1347227647,GB -1347227648,1347229895,DE -1347229896,1347229903,GR -1347229904,1347231743,DE -1347231744,1347235839,UA -1347235840,1347239935,GE -1347239936,1347244031,DK -1347244032,1347248127,GB -1347248128,1347252223,SE -1347252224,1347256319,HU -1347256320,1347260415,FO -1347260416,1347264511,MK -1347264512,1347268607,RU -1347268608,1347272703,LB -1347272704,1347276799,MT -1347276800,1347280895,DE -1347280896,1347284991,FR -1347284992,1347289087,GB -1347289088,1347293183,FR -1347293184,1347293311,SE -1347293312,1347293315,DJ -1347293316,1347293319,LR -1347293320,1347293327,GA -1347293328,1347293335,NG -1347293336,1347293351,SE -1347293352,1347293375,NG -1347293376,1347293391,SE -1347293392,1347293399,NG -1347293400,1347293407,US -1347293408,1347293415,NG -1347293416,1347293423,TZ -1347293424,1347293439,GN -1347293440,1347293447,US -1347293448,1347293455,GA -1347293456,1347293463,NG -1347293464,1347293471,SE -1347293472,1347293479,IQ -1347293480,1347293487,LR -1347293488,1347293495,TD -1347293496,1347293511,NG -1347293512,1347293519,GN -1347293520,1347293527,PS -1347293528,1347293535,NG -1347293536,1347293543,GH -1347293544,1347293551,NG -1347293552,1347293559,SE -1347293560,1347293567,GN -1347293568,1347293575,NG -1347293576,1347293583,GN -1347293584,1347293591,NG -1347293592,1347293599,US -1347293600,1347293615,NG -1347293616,1347293623,US -1347293624,1347293631,GH -1347293632,1347293639,LR -1347293640,1347293655,NG -1347293656,1347293672,GN -1347293673,1347293679,SE -1347293680,1347293687,US -1347293688,1347293719,NG -1347293720,1347293723,SE -1347293724,1347293724,US -1347293725,1347293727,SE -1347293728,1347293751,GN -1347293752,1347293767,NG -1347293768,1347293775,CM -1347293776,1347293799,NG -1347293800,1347293807,US -1347293808,1347293815,NG -1347293816,1347293823,GN -1347293824,1347293831,CM -1347293832,1347293839,NG -1347293840,1347293847,CG -1347293848,1347293855,NG -1347293856,1347293863,GN -1347293864,1347293871,ZM -1347293872,1347293879,GN -1347293880,1347293887,NG -1347293888,1347293903,GQ -1347293904,1347293911,GN -1347293912,1347293919,US -1347293920,1347293927,CM -1347293928,1347293935,TZ -1347293936,1347293943,NG -1347293944,1347293951,US -1347293952,1347293975,NG -1347293976,1347293983,CM -1347293984,1347293991,US -1347293992,1347293999,NG -1347294000,1347294007,TZ -1347294008,1347294015,SE -1347294016,1347294023,US -1347294024,1347294039,GN -1347294040,1347294047,NG -1347294048,1347294055,GN -1347294056,1347294071,US -1347294072,1347294079,NG -1347294080,1347294087,SE -1347294088,1347294095,US -1347294096,1347294111,NG -1347294112,1347294119,GN -1347294120,1347294135,NG -1347294136,1347294143,LR -1347294144,1347294151,NG -1347294152,1347294159,NE -1347294160,1347294167,GN -1347294168,1347294175,NG -1347294176,1347294183,US -1347294184,1347294191,SE -1347294192,1347294207,NG -1347294208,1347294215,SE -1347294216,1347294223,IQ -1347294224,1347294231,CM -1347294232,1347294239,US -1347294240,1347294247,LR -1347294248,1347294255,NG -1347294256,1347294263,LR -1347294264,1347294267,LS -1347294268,1347294271,LR -1347294272,1347294279,BR -1347294280,1347294287,CM -1347294288,1347294303,UG -1347294304,1347294311,NG -1347294312,1347294319,KZ -1347294320,1347294327,NG -1347294328,1347294335,GA -1347294336,1347294343,NG -1347294344,1347294351,CM -1347294352,1347294367,US -1347294368,1347294371,LS -1347294372,1347294375,IQ -1347294376,1347294399,NG -1347294400,1347294407,CM -1347294408,1347294415,GN -1347294416,1347294423,NG -1347294424,1347294431,US -1347294432,1347294439,SE -1347294440,1347294447,SO -1347294448,1347294495,US -1347294496,1347294975,SE -1347294976,1347294991,CG -1347294992,1347295007,US -1347295008,1347295015,LR -1347295016,1347295031,SE -1347295032,1347295055,NG -1347295056,1347295063,SE -1347295064,1347295071,LS -1347295072,1347295079,AF -1347295080,1347295103,NG -1347295104,1347295111,LY -1347295112,1347295119,ZA -1347295120,1347295127,NG -1347295128,1347295131,GN -1347295132,1347295135,SE -1347295136,1347295143,FR -1347295144,1347295151,NG -1347295152,1347295159,SE -1347295160,1347295167,GN -1347295168,1347295183,LS -1347295184,1347295191,SO -1347295192,1347295199,SE -1347295200,1347295215,ZM -1347295216,1347295223,US -1347295224,1347295231,NG -1347295232,1347295744,SE -1347295745,1347295745,US -1347295746,1347295747,SE -1347295748,1347295751,US -1347295752,1347295755,BW -1347295756,1347295759,SE -1347295760,1347295775,BW -1347295776,1347295783,HU -1347295784,1347295791,LB -1347295792,1347295815,SE -1347295816,1347295823,OM -1347295824,1347295831,GH -1347295832,1347295839,FR -1347295840,1347295847,NG -1347295848,1347295851,LS -1347295852,1347295855,SE -1347295856,1347295863,NG -1347295864,1347295927,SE -1347295928,1347295935,NG -1347295936,1347295975,US -1347295976,1347295983,LS -1347295984,1347295991,US -1347295992,1347295999,SE -1347296000,1347296031,US -1347296032,1347296039,SE -1347296040,1347296043,US -1347296044,1347296055,SE -1347296056,1347296079,US -1347296080,1347296103,SE -1347296104,1347296111,US -1347296112,1347296127,ZM -1347296128,1347296135,SE -1347296136,1347296143,US -1347296144,1347296159,SE -1347296160,1347296167,US -1347296168,1347296175,SE -1347296176,1347296183,US -1347296184,1347296191,SE -1347296192,1347296199,US -1347296200,1347296223,SE -1347296224,1347296231,US -1347296232,1347296239,JO -1347296240,1347296263,SE -1347296264,1347296271,US -1347296272,1347297279,SE -1347297280,1347305471,UA -1347305472,1347309567,AL -1347309568,1347313663,DE -1347313664,1347321855,RU -1347325952,1347330047,CZ -1347330048,1347338239,DE -1347338240,1347342335,RU -1347342336,1347346431,SE -1347346432,1347350527,BG -1347350528,1347354623,RU -1347358720,1347362815,CZ -1347362816,1347366911,NL -1347366912,1347371007,IT -1347371008,1347375103,RU -1347375104,1347379199,GB -1347379200,1347383295,NL -1347383296,1347387391,EE -1347387392,1347391487,GB -1347391488,1347393535,IQ -1347393536,1347395583,LB -1347395584,1347399679,SE -1347399680,1347403775,RU -1347403776,1347407871,NL -1347407872,1347411967,GB -1347411968,1347416063,DE -1347416064,1347420159,RU -1347420160,1347428351,DK -1347428352,1347432447,BA -1347432448,1347436543,HR -1347436544,1347440639,SE -1347440640,1347441151,NL -1347441152,1347444735,ES -1347444736,1347452927,RU -1347452928,1347461119,BG -1347461120,1347465215,AL -1347465216,1347469311,GB -1347469312,1347473407,RU -1347473408,1347477503,UZ -1347477504,1347481599,CH -1347481600,1347485695,AT -1347485696,1347493887,DE -1347493888,1347502079,LV -1347502080,1347504639,ES -1347504640,1347504671,SG -1347504672,1347504703,FR -1347504704,1347504735,DE -1347504736,1347504767,ES -1347504768,1347504803,GB -1347504804,1347504807,FR -1347504808,1347504811,DE -1347504812,1347504815,SG -1347504816,1347504831,GB -1347504832,1347505159,ES -1347505160,1347505167,GB -1347505168,1347505215,ES -1347505216,1347505247,GB -1347505248,1347518463,ES -1347518464,1347522559,NL -1347522560,1347526655,LB -1347526656,1347534847,FI -1347534848,1347538943,DE -1347538944,1347543039,RU -1347543040,1347547135,SK -1347547136,1347551167,DE -1347551168,1347551231,PL -1347551232,1347555327,IT -1347555328,1347559423,PL -1347559424,1347567615,RU -1347567616,1347567888,SC -1347567889,1347567889,NL -1347567890,1347569125,SC -1347569126,1347569126,NL -1347569127,1347569314,SC -1347569315,1347569315,NL -1347569316,1347569663,SC -1347569664,1347570687,NL -1347570688,1347570955,SC -1347570956,1347570956,NL -1347570957,1347571538,SC -1347571539,1347571539,NL -1347571540,1347571711,SC -1347571712,1347575807,RU -1347575808,1347579903,DK -1347579904,1347588095,GB -1347588096,1347592191,CZ -1347592192,1347600383,RU -1347600384,1347601919,CZ -1347601920,1347602431,UA -1347602432,1347608575,DE -1347608576,1347612671,FR -1347612672,1347616767,GB -1347616768,1347620863,FI -1347620864,1347624959,LB -1347624960,1347633151,CH -1347633152,1347637247,CZ -1347637248,1347641343,SE -1347641344,1347649535,DE -1347649536,1347653631,GE -1347653632,1347657727,GB -1347657728,1347661823,IT -1347661824,1347665919,DE -1347665920,1347670015,RU -1347670016,1347674111,SE -1347674112,1347682303,RU -1347682304,1347686399,DE -1347690496,1347694591,SE -1347694592,1347696375,GB -1347696376,1347696383,US -1347696384,1347706879,GB -1347706880,1347710975,IT -1347710976,1347715071,RU -1347715072,1347717375,ES -1347717376,1347717631,BG -1347717632,1347718143,ES -1347718144,1347718399,US -1347718400,1347723263,ES -1347723264,1347727359,GB -1347727360,1347731455,UA -1347731456,1347739647,DE -1347739648,1347747839,NL -1347747840,1347751935,DE -1347751936,1347754903,CY -1347754904,1347754911,GR -1347754912,1347755015,CY -1347755016,1347755023,GR -1347755024,1347755135,CY -1347755136,1347755151,GR -1347755152,1347755159,CY -1347755160,1347755175,GR -1347755176,1347756031,CY -1347756032,1347760127,NL -1347760128,1347764223,HU -1347764224,1347772415,GB -1347772416,1347776511,MT -1347776512,1347780607,SE -1347780608,1347784703,NL -1347784704,1347788799,RU -1347788800,1347792895,NL -1347792896,1347796991,RU -1347796992,1347801087,DE -1347801088,1347805183,GB -1347805184,1347809279,PL -1347809280,1347813375,RU -1347813376,1347817471,DE -1347817472,1347821567,US -1347821568,1347825663,GB -1347825664,1347829759,IT -1347829760,1347833855,SE -1347833856,1347837951,DE -1347837952,1347846143,RO -1347846144,1347850239,NO -1347850240,1347854335,IT -1347854336,1347854591,DE -1347854600,1347854607,DE -1347857408,1347858431,DE -1347858752,1347858815,DE -1347860992,1347861247,DE -1347862090,1347862090,DE -1347862272,1347862527,DE -1347862528,1347866623,CH -1347866624,1347870719,NO -1347870720,1347874815,AM -1347874816,1347878911,SK -1347878912,1347887103,GB -1347887104,1347891199,PL -1347891200,1347895295,SE -1347895296,1347903487,GH -1347903488,1347907583,RU -1347907584,1347911679,DE -1347911680,1347915775,GB -1347915776,1347919871,RU -1347919872,1347923967,DE -1347923968,1347928063,CZ -1347928064,1347931391,RU -1347931392,1347931647,BZ -1347931648,1347931903,RU -1347931904,1347932159,BZ -1347932160,1347936255,SK -1347936256,1347940351,FR -1347940352,1347944447,BA -1347944448,1347944959,ZA -1347944960,1347945215,UG -1347945216,1347945471,ZM -1347945472,1347945983,KE -1347945984,1347946239,MU -1347946240,1347946751,NG -1347946752,1347947007,AO -1347947008,1347947263,NG -1347947264,1347947519,ZA -1347947520,1347948543,DZ -1347948544,1347952639,DE -1347952640,1347956735,BE -1347956736,1347960831,RU -1347960832,1347964927,DE -1347964928,1347969023,IT -1347969024,1347977215,SE -1347977216,1347985407,DK -1347985408,1347989503,IT -1347989504,1347993599,FI -1347993600,1348001791,GB -1348001792,1348005887,ES -1348005888,1348009983,BH -1348009984,1348014079,RU -1348014080,1348018175,DK -1348018176,1348026367,NO -1348026368,1348028415,DE -1348028416,1348030463,LV -1348030464,1348034559,GB -1348034560,1348038655,AT -1348038656,1348042751,FR -1348042752,1348050943,RU -1348050944,1348055039,SE -1348055040,1348059135,LB -1348059136,1348063231,RU -1348063232,1348067327,CH -1348067328,1348070399,NL -1348070400,1348070911,DE -1348070912,1348071423,NL -1348071424,1348075519,DE -1348075520,1348076287,LV -1348076288,1348076543,RU -1348076544,1348082687,LV -1348082688,1348082943,RU -1348082944,1348083711,LV -1348083712,1348091903,LU -1348091904,1348095999,RU -1348096000,1348100095,AL -1348100096,1348104191,DE -1348104192,1348108287,RU -1348108288,1348112383,CZ -1348112384,1348116479,DE -1348116480,1348120575,JO -1348120576,1348124671,RU -1348124672,1348128767,GB -1348128768,1348129791,BE -1348129792,1348131071,SI -1348131072,1348132863,BE -1348132864,1348136959,UA -1348136960,1348141055,RU -1348141056,1348145151,DK -1348145152,1348149247,RU -1348149248,1348153343,NO -1348153344,1348157439,IT -1348157440,1348165631,ES -1348165632,1348169727,DE -1348169728,1348173823,AL -1348173824,1348177919,DK -1348177920,1348182015,BE -1348182016,1348190207,UA -1348190208,1348194303,RU -1348194304,1348198399,GR -1348198400,1348202495,NO -1348205258,1348205258,DE -1348206592,1348218879,RU -1348218880,1348222975,DE -1348222976,1348231167,LU -1348231168,1348235263,RU -1348235264,1348239359,AT -1348239360,1348241407,SE -1348241408,1348242431,GB -1348242432,1348243455,SE -1348243456,1348247551,GB -1348247552,1348251647,RU -1348251648,1348255743,GE -1348255744,1348263935,RU -1348263936,1348268031,UA -1348268032,1348272127,CZ -1348272128,1348280319,IE -1348280320,1348284415,AT -1348284416,1348288511,RU -1348288512,1348292607,IT -1348292608,1348296703,FR -1348296704,1348300799,RU -1348300800,1348304895,UA -1348304896,1348308991,IT -1348308992,1348313087,MT -1348313088,1348317183,GB -1348317184,1348321279,RU -1348321280,1348325375,GB -1348325376,1348329471,TR -1348329472,1348333599,RS -1348333600,1348333607,XK -1348333608,1348333631,RS -1348333632,1348333807,XK -1348333808,1348333823,RS -1348333824,1348334079,XK -1348334080,1348336191,RS -1348336192,1348336383,XK -1348336384,1348337471,RS -1348337472,1348337663,XK -1348337664,1348341759,ES -1348341760,1348345855,PL -1348345856,1348349951,GB -1348349952,1348354047,SK -1348354048,1348355267,NL -1348355268,1348355269,IE -1348355270,1348358143,NL -1348358144,1348362239,DE -1348362240,1348366335,MC -1348366336,1348370431,IT -1348370432,1348374527,DE -1348374528,1348378623,CH -1348378624,1348382719,BY -1348382720,1348386815,FR -1348386816,1348390911,GB -1348390912,1348395007,SE -1348395008,1348399103,BY -1348399104,1348403199,MD -1348403200,1348407295,ZA -1348407296,1348411391,BG -1348411392,1348415487,RU -1348415488,1348419583,GB -1348419584,1348427775,HU -1348427776,1348435967,CZ -1348435968,1348440063,FI -1348440064,1348444159,DE -1348444160,1348448255,NL -1348448256,1348456447,GB -1348456448,1348460543,BH -1348460544,1348464639,SI -1348464640,1348468735,CZ -1348468736,1348548607,RO -1348548608,1348549631,MD -1348549632,1348599807,RO -1348599808,1348730879,HU -1348730880,1348861951,NL -1348861952,1348993023,ES -1348993024,1349124095,IT -1349124096,1349255167,GR -1349255168,1349451775,AT -1349451776,1349517311,IE -1349517312,1349763071,NL -1349763072,1349771263,RU -1349771264,1349779455,NL -1349779456,1349910527,IT -1349910528,1350041599,FR -1350041600,1350215679,AT -1350215680,1350215935,IQ -1350215936,1350216959,AT -1350216960,1350217215,IQ -1350217216,1350217471,AT -1350217472,1350217727,IQ -1350217728,1350303743,AT -1350303744,1350434815,FR -1350434816,1350565887,NL -1350565888,1350763083,DE -1350763084,1350763084,JP -1350763085,1352299775,DE -1352299776,1352300031,US -1352300032,1352412159,DE -1352412160,1352412415,FR -1352412416,1352417279,DE -1352417280,1352418303,SK -1352418304,1352488959,DE -1352488960,1352491007,FR -1352491008,1352663039,DE -1352663040,1353187327,DK -1353187328,1353259263,GB -1353259264,1353259519,US -1353259520,1353262295,GB -1353262296,1353262303,US -1353262304,1353271317,GB -1353271318,1353271318,AT -1353271319,1353271567,GB -1353271568,1353271575,AT -1353271576,1353271683,GB -1353271684,1353271684,AT -1353271685,1353271711,GB -1353271712,1353271719,AT -1353271720,1353271727,GB -1353271728,1353271743,AT -1353271744,1353271775,GB -1353271776,1353271807,AT -1353271808,1353272983,GB -1353272984,1353272991,ES -1353272992,1353273407,GB -1353273408,1353273423,BE -1353273424,1353275247,GB -1353275248,1353275255,ES -1353275256,1353277439,GB -1353277440,1353279487,CH -1353279488,1353280511,IT -1353280512,1353287959,GB -1353287960,1353287967,IE -1353287968,1353298783,GB -1353298784,1353298815,SE -1353298816,1353298895,GB -1353298896,1353298911,SE -1353298912,1353298943,GB -1353298944,1353299455,SE -1353299456,1353300063,GB -1353300064,1353300071,SE -1353300072,1353300079,GB -1353300080,1353300095,SE -1353300096,1353308159,GB -1353308160,1353309183,FR -1353309184,1353312447,GB -1353312448,1353312479,CH -1353312480,1353312511,GB -1353312512,1353312767,CH -1353312768,1353313167,GB -1353313168,1353313183,IT -1353313184,1353315327,GB -1353315328,1353316351,ES -1353316352,1353318399,GB -1353318400,1353383935,SE -1353383936,1353449471,DE -1353449472,1353515007,PT -1353515008,1353646079,ES -1353646080,1353842687,GB -1353842688,1353973759,IL -1353973760,1354235903,IT -1354235904,1354301439,KW -1354301440,1354366975,FR -1354366976,1354432511,FI -1354432512,1354498047,DE -1354498048,1354563583,CZ -1354563584,1354629119,GB -1354629120,1354658495,DE -1354658496,1354658511,AT -1354658512,1354662159,DE -1354662160,1354662167,AT -1354662168,1354665215,DE -1354665216,1354665223,AT -1354665224,1354694655,DE -1354694656,1354760191,IR -1354760192,1355022335,GB -1355022336,1355083555,DK -1355083556,1355083559,US -1355083560,1355284479,DK -1355284480,1355415551,BE -1355415552,1355546623,NO -1355546624,1355808767,IT -1355808768,1355841535,DK -1355841536,1355857919,CH -1355857920,1355862015,LU -1355862016,1355864063,DE -1355864064,1355866111,GB -1355866112,1355868159,LT -1355868160,1355870207,DE -1355870208,1355872255,FI -1355872256,1355873279,IT -1355873280,1355873791,GB -1355874048,1355874303,DE -1355874304,1355907071,DK -1355907072,1355923455,GB -1355923456,1355931647,DE -1355931648,1355935743,LT -1355935744,1355936767,NL -1355936768,1355937791,DE -1355937792,1355938815,PL -1355938816,1355939327,NL -1355939584,1355939839,ES -1355939840,1355956223,IR -1355956224,1355964415,DK -1355964416,1355972607,IT -1355972608,1356005375,IR -1356005376,1356054527,IT -1356054528,1356062719,CZ -1356062720,1356068863,IT -1356068864,1356070911,PL -1356070912,1356201983,NO -1356201984,1356333055,FR -1356333056,1356464127,SE -1356464128,1356513497,CH -1356513498,1356513498,US -1356513499,1356595199,CH -1356595200,1356789759,FI -1356789760,1356790271,AX -1356790272,1356857343,FI -1356857344,1356922879,ES -1356922880,1356988415,GB -1356988416,1357053951,DE -1357053952,1357119487,AE -1357119488,1357185023,DE -1357185024,1357250559,GB -1357250560,1357316095,IL -1357317120,1357317375,GB -1357318152,1357318159,GR -1357318160,1357318207,GB -1357318208,1357318215,IT -1357318272,1357318279,CH -1357318288,1357318303,FR -1357318348,1357318351,NL -1357318356,1357318356,DE -1357318372,1357318375,BE -1357318378,1357318378,FR -1357318379,1357318379,PL -1357318384,1357318387,PL -1357318388,1357318391,FR -1357318396,1357318399,DE -1357318400,1357318655,FR -1357318912,1357319167,DE -1357319168,1357319171,PL -1357319172,1357319178,GB -1357319180,1357319187,GB -1357321024,1357321087,KE -1357321984,1357322239,GB -1357322240,1357322255,DE -1357322752,1357323007,GB -1357323008,1357323015,CG -1357323776,1357323791,FI -1357323808,1357323839,NO -1357324288,1357324295,RU -1357324296,1357324327,PL -1357326336,1357326337,ES -1357326338,1357326339,SL -1357326352,1357326367,GB -1357326592,1357326847,GB -1357327360,1357327615,FR -1357328384,1357328671,GB -1357328688,1357328695,ES -1357328696,1357328703,IT -1357328704,1357328711,IE -1357328896,1357329163,NL -1357329168,1357329183,NL -1357329408,1357329415,BE -1357330944,1357331207,GB -1357335808,1357336063,IT -1357337600,1357337647,NL -1357337664,1357337727,NL -1357340672,1357341695,GB -1357342976,1357343231,GB -1357343488,1357343503,GB -1357344260,1357344271,FR -1357344512,1357344767,FR -1357346816,1357346835,FR -1357346848,1357346863,FR -1357347336,1357347375,FR -1357347456,1357347583,FR -1357347616,1357347659,FR -1357347664,1357347671,FR -1357347680,1357347727,FR -1357347744,1357347775,FR -1357347840,1357348095,PL -1357348352,1357348359,ES -1357348384,1357348415,ES -1357348480,1357348607,ES -1357350400,1357350647,GB -1357350656,1357350847,GB -1357351168,1357351423,PL -1357359104,1357363199,GB -1357363200,1357363455,DE -1357363456,1357364223,QA -1357364224,1357365247,ES -1357366880,1357366911,GB -1357366960,1357366967,BE -1357366976,1357367039,GB -1357368352,1357368383,NL -1357368576,1357368831,NL -1357369344,1357369599,RO -1357370368,1357370623,SA -1357372416,1357372927,GB -1357373468,1357373471,GB -1357373480,1357373519,GB -1357373520,1357373535,FI -1357373536,1357373539,ES -1357373540,1357373543,PT -1357373544,1357375215,GB -1357375216,1357375223,ES -1357375224,1357375423,GB -1357375424,1357375487,IE -1357375504,1357375551,GB -1357375560,1357375567,GB -1357375576,1357375583,FR -1357375584,1357375591,GB -1357375600,1357375615,GB -1357377536,1357377679,FR -1357377696,1357378647,FR -1357378656,1357378687,FR -1357378816,1357379071,FR -1357381632,1357414399,NO -1357414400,1357447167,LV -1357447168,1357479935,IE -1357479936,1357512703,LV -1357512704,1357545471,RU -1357545472,1357578239,GB -1357578240,1357611007,EE -1357611008,1357643775,GB -1357643776,1357676543,FR -1357676544,1357709311,BE -1357709312,1357742079,RU -1357742080,1357774847,DE -1357774848,1357791231,GB -1357791232,1357807615,PL -1357807616,1357840383,CH -1357840384,1357873151,NO -1357875296,1357875327,IE -1357875456,1357875711,NL -1357876448,1357876479,DE -1357878272,1357878335,CH -1357878336,1357878399,CZ -1357878400,1357878463,NL -1357878464,1357878527,NO -1357878528,1357878591,AT -1357878592,1357878655,PL -1357878656,1357878719,DE -1357879296,1357879423,DE -1357883744,1357883759,AT -1357883852,1357883852,SE -1357885120,1357885183,DE -1357885200,1357885215,AT -1357885952,1357886207,SE -1357889280,1357889535,SE -1357890828,1357890831,NL -1357891072,1357891327,NL -1357891584,1357891647,SE -1357891712,1357891839,SE -1357892224,1357892351,FR -1357892608,1357892735,NL -1357892864,1357893119,NL -1357894912,1357895423,FR -1357895936,1357896191,SE -1357896192,1357896447,DE -1357897376,1357897407,PL -1357897624,1357897631,GB -1357899712,1357899775,GB -1357900312,1357900315,GB -1357900416,1357900543,SE -1357900800,1357901055,PL -1357901056,1357901311,SE -1357902366,1357902366,NO -1357903616,1357903743,CH -1357903744,1357903871,DK -1357904896,1357905407,GB -1357905408,1357905663,SE -1357905664,1357905919,NL -1357905920,1357910015,LT -1357910016,1357914111,GR -1357914112,1357922303,RU -1357922304,1357926399,SA -1357926400,1357930495,GB -1357930496,1357932287,RU -1357932288,1357932543,GB -1357932544,1357933055,RU -1357933056,1357933567,ES -1357933568,1357934079,GB -1357934080,1357934335,RU -1357934336,1357934591,GB -1357934592,1357938687,RU -1357938688,1357942783,NL -1357942784,1357946879,RS -1357946880,1357955071,PL -1357955072,1357959167,KE -1357959168,1357963263,RU -1357963264,1357967359,AT -1357967360,1357971455,RU -1357971456,1357975551,KZ -1357975552,1357979647,AT -1357979648,1357983743,KZ -1357983744,1357984103,GB -1357984104,1357984111,IT -1357984112,1357984167,GB -1357984168,1357984175,IT -1357984176,1357984367,GB -1357984368,1357984375,IT -1357984376,1357984511,GB -1357984512,1357984519,IT -1357984520,1357984527,GB -1357984528,1357984535,IT -1357984536,1357984839,GB -1357984840,1357984847,IT -1357984848,1357985575,GB -1357985576,1357985583,IT -1357985584,1357985791,GB -1357985792,1357987839,DE -1357987840,1357991935,GB -1357991936,1357996031,NO -1357996032,1358000127,CH -1358000128,1358004223,LI -1358004224,1358006271,PL -1358008320,1358012415,BH -1358012416,1358016511,IT -1358016512,1358020607,GE -1358020608,1358028799,DE -1358028800,1358032895,IT -1358032896,1358036991,GE -1358036992,1358041087,IR -1358041088,1358045183,FI -1358045184,1358049279,SK -1358049280,1358064639,RU -1358064640,1358065663,UA -1358065664,1358069759,BA -1358069760,1358086143,DE -1358086144,1358090239,CH -1358090240,1358094335,KZ -1358094336,1358102527,NL -1358102528,1358106623,RU -1358106624,1358110719,LT -1358110720,1358118911,DE -1358118912,1358123007,RU -1358123008,1358127103,PT -1358127104,1358131199,CZ -1358131200,1358132735,DK -1358132736,1358133247,GB -1358133248,1358135295,DK -1358135296,1358139391,RU -1358139392,1358143487,UA -1358143488,1358147583,AT -1358147584,1358151679,GB -1358151680,1358155775,DE -1358155776,1358159871,CH -1358163968,1358166015,MQ -1358166016,1358168063,GP -1358168064,1358172159,GB -1358172160,1358176255,CY -1358176256,1358180351,RU -1358180352,1358184447,ES -1358184448,1358187775,SE -1358187776,1358187839,NO -1358187840,1358192639,SE -1358192640,1358196735,HU -1358196736,1358200831,IT -1358200832,1358209023,PL -1358209024,1358213119,IL -1358213120,1358217215,GB -1358217216,1358221311,SE -1358221312,1358225407,DE -1358225408,1358229503,RU -1358229504,1358233599,DE -1358233600,1358237695,ES -1358237696,1358249983,FR -1358249984,1358254079,DE -1358254080,1358258175,MD -1358262272,1358266367,RU -1358266368,1358274559,DE -1358274560,1358278655,GR -1358278656,1358282751,PL -1358282752,1358286847,AT -1358286848,1358290943,MT -1358290944,1358295039,SE -1358295040,1358299135,RU -1358299136,1358303231,DZ -1358303232,1358306303,RU -1358306304,1358306815,GB -1358306816,1358307071,PT -1358307072,1358307327,GB -1358307328,1358315519,DE -1358315520,1358323711,RU -1358323712,1358327807,LU -1358327808,1358328671,DE -1358328672,1358328727,AT -1358328728,1358331903,DE -1358331904,1358335999,IL -1358336000,1358344191,FI -1358344192,1358352383,NL -1358352384,1358356479,RU -1358356480,1358360575,SI -1358360576,1358364671,RU -1358364672,1358372863,GB -1358372864,1358376959,RU -1358376960,1358381055,GB -1358381056,1358385151,IT -1358385152,1358389247,GB -1358389248,1358397439,RU -1358397440,1358401279,GB -1358401280,1358401535,KE -1358401536,1358402303,GB -1358402304,1358402559,TZ -1358402560,1358405631,GB -1358405632,1358409727,NL -1358409728,1358413823,RU -1358413824,1358422015,NL -1358422016,1358426111,FR -1358426112,1358430207,FI -1358430208,1358434303,NG -1358434304,1358438399,IS -1358438400,1358442495,NL -1358442496,1358446591,RU -1358446592,1358450687,TG -1358450688,1358454783,RU -1358454784,1358462975,FI -1358462976,1358467071,SE -1358467072,1358471167,RU -1358471168,1358475263,FI -1358475264,1358479359,GB -1358479360,1358479615,CH -1358479616,1358483455,LI -1358483456,1358487551,FR -1358487552,1358491647,SE -1358491648,1358495743,FI -1358495744,1358499839,PL -1358499840,1358503935,KZ -1358503936,1358508031,IT -1358508032,1358512127,GB -1358512128,1358516223,DZ -1358516224,1358520319,BY -1358520320,1358524415,GB -1358528512,1358530815,RU -1358530816,1358532607,KZ -1358532608,1358534655,RU -1358534656,1358536703,KZ -1358536704,1358540799,HU -1358540800,1358548991,RU -1358548992,1358551039,NL -1358551040,1358553087,GB -1358553088,1358557183,UA -1358557184,1358561279,IE -1358561280,1358569471,CZ -1358569472,1358573567,MA -1358573568,1358577663,LV -1358577664,1358585855,RU -1358585856,1358589951,GB -1358589952,1358594047,EE -1358594048,1358598143,DE -1358598144,1358602239,IL -1358602240,1358610431,RU -1358610432,1358614527,IR -1358614528,1358622719,RU -1358622720,1358626815,SK -1358626816,1358635007,GB -1358635008,1358639103,TR -1358639104,1358643199,RU -1358643200,1358647295,ES -1358647296,1358651391,DE -1358651392,1358655487,FR -1358655488,1358667775,RU -1358667776,1358668159,GB -1358668160,1358668167,PT -1358668168,1358668447,GB -1358668448,1358668455,PT -1358668456,1358668623,GB -1358668624,1358668631,PT -1358668632,1358670975,GB -1358670976,1358670991,PT -1358670992,1358671001,GB -1358671002,1358671002,PT -1358671003,1358671935,GB -1358671936,1358671943,PT -1358671944,1358675967,GB -1358675968,1358676991,SE -1358676992,1358678015,DK -1358678016,1358679295,SE -1358679296,1358680063,DK -1358680064,1358688255,RU -1358688256,1358692351,CZ -1358692352,1358696447,PL -1358696448,1358700543,RU -1358700544,1358704639,AT -1358704640,1358708735,HU -1358708736,1358712831,GB -1358712832,1358715135,NL -1358715136,1358715143,GB -1358715144,1358716927,NL -1358716928,1358721023,DE -1358721024,1358725119,GB -1358725120,1358733311,RU -1358733312,1358741503,SE -1358741504,1358745599,IT -1358745600,1358749695,SE -1358749696,1358753791,IT -1358753792,1358757887,UA -1358757888,1358766079,RU -1358766080,1358770175,IT -1358770176,1358774271,BG -1358774272,1358778367,ES -1358778368,1358782463,CH -1358782464,1358784039,GB -1358784040,1358784047,DE -1358784048,1358787327,GB -1358787328,1358787583,IE -1358787584,1358790655,GB -1358790656,1358798847,IR -1358798848,1358807039,HU -1358807040,1358811135,ES -1358811136,1358815231,DE -1358815232,1358819327,RU -1358819328,1358823423,TR -1358823424,1358827519,UA -1358827520,1358831615,RU -1358831616,1358835711,NO -1358835712,1358839807,RU -1358839808,1358843903,CH -1358843904,1358847999,MT -1358848000,1358856191,RU -1358856192,1358860287,DE -1358860288,1358861361,GB -1358861362,1358861363,DE -1358861364,1358861449,GB -1358861450,1358861450,DE -1358861451,1358861473,GB -1358861474,1358861474,DE -1358861475,1358861567,GB -1358861568,1358861823,DE -1358861824,1358861895,GB -1358861896,1358861903,FR -1358861904,1358862079,GB -1358862080,1358862335,FR -1358862336,1358862847,US -1358862848,1358862911,DK -1358862912,1358862914,GB -1358862915,1358862915,DK -1358862916,1358862975,GB -1358862976,1358863103,DK -1358863104,1358863359,CH -1358863360,1358863871,US -1358863872,1358864383,GB -1358864384,1358872575,CH -1358872576,1358876671,IT -1358876672,1358880767,LV -1358884864,1358888959,SE -1358888960,1358890399,DE -1358890400,1358890431,SE -1358890432,1358890479,DE -1358890480,1358890487,US -1358890488,1358892159,DE -1358892160,1358892175,CH -1358892176,1358893055,DE -1358893056,1358897151,RU -1358897152,1358899711,GB -1358899712,1358899967,US -1358899968,1358900223,KE -1358900224,1358905343,GB -1358905344,1358909439,UA -1358909440,1358913535,RU -1358913536,1358917631,CH -1358917632,1358921727,ES -1358921728,1358929919,RU -1358929920,1358934015,LU -1358934016,1358938111,RU -1358938112,1358946303,GB -1358946304,1358950399,LV -1358950400,1358954495,NL -1358954496,1358970879,ES -1358970880,1358987263,HU -1358987264,1359003647,NO -1359003648,1359020031,CZ -1359020032,1359036415,FR -1359036416,1359052799,GB -1359052800,1359101951,RU -1359101952,1359118335,GB -1359118336,1359118655,DE -1359118656,1359118719,GR -1359118720,1359118847,DE -1359118848,1359119103,IT -1359119104,1359119199,ES -1359119200,1359119231,NL -1359119232,1359119359,ES -1359119360,1359120383,IT -1359120384,1359121407,DE -1359121408,1359122431,ES -1359122432,1359123711,DE -1359123712,1359124479,ES -1359124480,1359132671,GB -1359132672,1359133191,DE -1359133192,1359133199,NL -1359133200,1359134463,DE -1359134464,1359134719,GR -1359134720,1359147960,CZ -1359147961,1359147961,PT -1359147962,1359151103,CZ -1359151104,1359161369,DE -1359161370,1359161370,CL -1359161371,1359167487,DE -1359167488,1359183871,GB -1359183872,1359200255,RU -1359200256,1359216639,AT -1359216640,1359233023,ZA -1359233024,1359249407,NL -1359249408,1359265791,CY -1359265792,1359282175,RU -1359282176,1359298559,IL -1359298560,1359314943,RU -1359314944,1359331327,GB -1359331328,1359347711,AT -1359347712,1359364095,CH -1359364096,1359380479,TR -1359380480,1359396863,PL -1359396864,1359413247,GB -1359413248,1359429631,DE -1359429632,1359446015,LT -1359446016,1359462399,DK -1359462400,1359468607,DE -1359468608,1359468623,SG -1359468624,1359470591,DE -1359470592,1359478783,CH -1359478784,1359511551,TR -1359511552,1359544319,SE -1359544320,1359577087,RU -1359577088,1359609855,ES -1359609856,1359642623,EG -1359642624,1359675391,AT -1359675392,1359708159,DE -1359708160,1359740927,BE -1359740928,1359773695,IR -1359773696,1359806463,RO -1359806464,1359839231,RU -1359839232,1359871999,CH -1359872000,1359904767,FR -1359904768,1359937535,DE -1359937536,1359970303,IS -1359970304,1360003071,PL -1360003072,1360007167,AM -1360011264,1360015359,AT -1360015360,1360019455,DE -1360019456,1360023551,FI -1360023552,1360027647,RU -1360027648,1360031743,AT -1360031744,1360035839,IR -1360039936,1360044031,AT -1360044032,1360048127,SE -1360048128,1360052223,DE -1360052224,1360056319,HU -1360060416,1360064511,LT -1360064512,1360068607,GE -1360068608,1360072703,RU -1360072704,1360076799,CH -1360076800,1360084991,NL -1360084992,1360089087,GB -1360089088,1360093183,AZ -1360093184,1360101375,DE -1360101376,1360105471,UA -1360105472,1360109567,RU -1360109568,1360113663,KZ -1360113664,1360117759,HU -1360117760,1360121855,FI -1360121856,1360125951,DE -1360125952,1360127487,SI -1360127488,1360127999,RS -1360128000,1360128511,MK -1360128512,1360129023,ME -1360129024,1360129535,BA -1360129536,1360130047,SI -1360130048,1360134143,IE -1360134144,1360138239,NL -1360138240,1360142335,CH -1360142336,1360146431,KZ -1360146432,1360150527,RS -1360150528,1360158719,RO -1360158720,1360162815,DE -1360162816,1360175103,RU -1360175104,1360179199,NL -1360179200,1360183295,FR -1360183296,1360191487,PL -1360191488,1360195583,FO -1360195584,1360199679,NL -1360199680,1360203775,CZ -1360203776,1360207871,FR -1360207872,1360211967,CZ -1360211968,1360216063,GB -1360216064,1360224255,RU -1360224256,1360224767,ES -1360224768,1360224895,FR -1360224896,1360227841,ES -1360227842,1360227842,SE -1360227843,1360228351,ES -1360228352,1360232447,FI -1360232448,1360236543,RU -1360236544,1360240639,AT -1360240640,1360244735,ES -1360244736,1360250623,GB -1360250624,1360251391,NL -1360251392,1360252415,DE -1360252416,1360252671,CH -1360252672,1360257023,GB -1360257024,1360265215,DK -1360265216,1360265503,NL -1360265504,1360265511,DE -1360265512,1360265983,NL -1360265984,1360265991,PT -1360265992,1360266567,GB -1360266568,1360266575,RU -1360266576,1360266759,GB -1360266760,1360266767,FR -1360266768,1360266791,GB -1360266792,1360266815,ES -1360266816,1360266847,GB -1360266848,1360266863,BE -1360266864,1360266871,FR -1360266872,1360266879,ES -1360266880,1360266991,GB -1360266992,1360266999,BE -1360267000,1360267007,GB -1360267008,1360268031,SE -1360268032,1360268199,FR -1360268200,1360268207,ES -1360268208,1360268287,FR -1360268288,1360269311,GB -1360269312,1360273407,KG -1360273408,1360281599,GB -1360281600,1360281727,NL -1360281728,1360281855,ES -1360281856,1360282111,NL -1360282112,1360282239,ES -1360282240,1360282495,NL -1360282496,1360282623,DE -1360282624,1360284671,NL -1360284672,1360284927,DK -1360284928,1360285183,NL -1360285184,1360285247,ES -1360285248,1360285695,NL -1360285696,1360289791,DE -1360289792,1360293887,RU -1360293888,1360302079,DE -1360302080,1360306175,EE -1360306176,1360310271,RU -1360310272,1360314367,JE -1360314368,1360318463,RU -1360318464,1360322559,FR -1360322560,1360326655,FI -1360326656,1360330751,PT -1360330752,1360334847,UA -1360334848,1360338943,IT -1360338944,1360343039,CY -1360343040,1360347135,SA -1360347136,1360351231,GB -1360351232,1360355327,AZ -1360355328,1360359423,EG -1360359424,1360363519,AT -1360363520,1360365567,IT -1360365568,1360367615,NL -1360367616,1360367771,IE -1360367772,1360367772,DE -1360367773,1360371711,IE -1360371712,1360375807,TR -1360375808,1360379903,NL -1360379904,1360383999,PL -1360384000,1360388095,SE -1360388096,1360392191,RU -1360392192,1360396287,EE -1360396288,1360400383,RU -1360400384,1360404479,BH -1360408576,1360412671,RU -1360420864,1360424959,TR -1360424960,1360425215,NL -1360425216,1360429055,RU -1360429056,1360433151,UA -1360433152,1360437247,RO -1360437248,1360441343,FI -1360441344,1360445439,HU -1360445440,1360453631,RU -1360453632,1360457727,DE -1360457728,1360461823,FI -1360461824,1360465919,RU -1360465920,1360470015,UA -1360470016,1360474111,FR -1360474112,1360478207,GB -1360478208,1360482303,CH -1360482304,1360486399,IT -1360486400,1360494591,RU -1360494592,1360498687,DK -1360498688,1360515071,RU -1360515072,1360519167,JP -1360519168,1360524031,NL -1360524032,1360524287,US -1360524288,1360531455,NL -1360531456,1360535551,RO -1360535552,1360539647,DE -1360539648,1360543743,NL -1360543744,1360547839,DE -1360547840,1360551935,RU -1360551936,1360556031,NL -1360556032,1360564223,RU -1360564224,1360568319,AT -1360568320,1360572415,ES -1360572416,1360576511,RU -1360576512,1360580607,GB -1360580608,1360584703,UA -1360584704,1360588799,IT -1360588800,1360590847,RS -1360590848,1360592895,IE -1360592896,1360596991,RU -1360596992,1360601087,CZ -1360601088,1360605183,BY -1360605184,1360609279,RU -1360613376,1360617471,SE -1360617472,1360621567,IT -1360621568,1360625663,ES -1360625664,1360629759,DE -1360629760,1360633855,SE -1360633856,1360637951,RU -1360637952,1360642047,FO -1360642048,1360644735,FR -1360644736,1360644863,IT -1360644864,1360645887,FR -1360645888,1360646143,GB -1360646144,1360650239,AT -1360650240,1360654335,UA -1360654336,1360658431,EE -1360658432,1360666623,PL -1360666624,1360674815,NO -1360674816,1360676863,NG -1360676864,1360678911,ZA -1360678912,1360683007,RU -1360683008,1360691199,GB -1360691200,1360698367,RU -1360698368,1360698623,RO -1360698624,1360698879,RU -1360698880,1360699391,RO -1360699392,1360703487,DE -1360703488,1360707583,RU -1360707584,1360709631,IT -1360709632,1360711679,AL -1360711680,1360715775,NL -1360715776,1360728063,SE -1360728064,1360732159,FR -1360732160,1360736255,NO -1360736256,1360740351,RU -1360740352,1360748543,GB -1360748544,1360749567,IM -1360749568,1360752639,GB -1360752640,1360756735,DE -1360756736,1360760831,IT -1360760832,1360764927,RU -1360764928,1360769023,DE -1360769024,1360773119,IT -1360773120,1360777215,CZ -1360777216,1360781311,DK -1360781312,1360785407,DE -1360785408,1360793599,RU -1360793600,1360797695,CZ -1360797696,1360805887,IR -1360805888,1360809983,DE -1360809984,1360814079,NL -1360814080,1360818175,FR -1360818176,1360822271,JO -1360822272,1360826367,AT -1360826368,1360830463,GB -1360830464,1360838655,RU -1360838656,1360842751,FR -1360842752,1360846847,RU -1360846848,1360850943,DE -1360855040,1360859135,NL -1360859136,1360863231,LT -1360863232,1360867327,NO -1360867328,1360879615,GB -1360879616,1360883711,EG -1360883712,1360891903,RU -1360891904,1360895999,CH -1360896000,1360900095,QA -1360900096,1360916479,IT -1360916480,1360920575,IR -1360920576,1360928767,IT -1360928768,1360932863,NL -1360932864,1360936959,RU -1360936960,1360941055,NL -1360941056,1360945151,BY -1360945152,1360949247,DE -1360949248,1360953343,RU -1360953344,1360957439,PL -1360957440,1360961535,DE -1360961536,1360965631,UA -1360965632,1360977919,RU -1360977920,1360986111,CZ -1360986112,1360986269,GB -1360986270,1360986270,US -1360986271,1360986299,GB -1360986300,1360986300,US -1360986301,1360986356,GB -1360986357,1360986358,US -1360986359,1360986367,GB -1360986368,1360986399,US -1360986400,1360986431,GB -1360986432,1360986447,US -1360986448,1360986631,GB -1360986632,1360986635,US -1360986636,1360986755,GB -1360986756,1360986763,US -1360986764,1360989439,GB -1360989440,1360989695,FR -1360989696,1360989929,GB -1360989930,1360989930,FR -1360989931,1360989935,GB -1360989936,1360989943,FR -1360989944,1360991743,GB -1360991744,1360991871,US -1360991872,1360992255,GB -1360992256,1360992511,DE -1360992512,1360993095,GB -1360993096,1360993099,DE -1360993100,1360994303,GB -1360994304,1360998399,CZ -1360998400,1361002495,FI -1361002496,1361006591,GB -1361006592,1361010687,DK -1361010688,1361018879,GB -1361018880,1361022975,AT -1361022976,1361027071,IT -1361027072,1361035263,IR -1361035628,1361035631,DZ -1361039360,1361041407,IE -1361041408,1361043455,NL -1361043456,1361051647,IR -1361051648,1362100223,ES -1362100224,1362395647,FR -1362395648,1362396031,US -1362396032,1362396415,FR -1362396416,1362396927,US -1362396928,1362397439,FR -1362397440,1362397695,US -1362397696,1362398463,FR -1362398464,1362398719,DE -1362398720,1362403583,FR -1362403584,1362404351,DZ -1362404352,1362404607,FR -1362404608,1362405887,DZ -1362405888,1362406143,FR -1362406144,1362407167,SV -1362407168,1362407679,FR -1362407680,1362407743,US -1362407744,1362407839,FR -1362407840,1362407871,US -1362407872,1362407887,HK -1362407888,1362407903,US -1362407904,1362407919,HK -1362407920,1362407935,US -1362407936,1362411519,FR -1362411520,1362413273,MQ -1362413274,1362414847,FR -1362414848,1362415103,GB -1362415104,1362415359,FR -1362415360,1362415615,DE -1362415616,1362417663,GP -1362417664,1362419711,SG -1362419712,1362423807,FR -1362423808,1362425855,SG -1362425856,1362426879,FR -1362426880,1362427815,MQ -1362427816,1362755583,FR -1362755584,1362886655,NL -1362886656,1363017727,ES -1363017728,1363148799,CH -1363148800,1363410943,FR -1363410944,1363673087,NL -1363673088,1363935231,IT -1363935232,1364197375,GB -1364197376,1364262911,FR -1364262912,1364328447,IT -1364328448,1364459519,BE -1364459520,1364525055,PT -1364525056,1364526591,NL -1364526592,1364528639,GB -1364528640,1364529663,NL -1364529664,1364530175,GB -1364530176,1364541439,NL -1364541440,1364545535,SE -1364545536,1364581375,NL -1364581376,1364582399,LY -1364582400,1364585727,NL -1364585728,1364585983,CA -1364585984,1364590591,NL -1364590592,1364721663,GB -1364721664,1364725759,SE -1364725760,1364733951,DE -1364733952,1364738047,IT -1364738048,1364742143,NO -1364742144,1364746239,RU -1364746240,1364750335,FR -1364750336,1364754431,RU -1364754432,1364758527,SK -1364758528,1364762623,KZ -1364762624,1364766719,GB -1364766720,1364770815,CH -1364770816,1364774911,KG -1364774912,1364779007,RU -1364779008,1364787199,IT -1364787200,1364795391,RO -1364795392,1364799487,ES -1364799488,1364803583,SK -1364803584,1364809727,RU -1364809728,1364815871,DE -1364815872,1364819967,RU -1364819968,1364824063,GB -1364824064,1364828159,SE -1364828160,1364829439,GB -1364829440,1364829487,FR -1364829488,1364829503,GB -1364829504,1364829527,FR -1364829528,1364832255,GB -1364832256,1364836351,RU -1364836352,1364840447,DE -1364840448,1364844543,AM -1364844544,1364852735,DE -1364852736,1364856831,RU -1364856832,1364860927,IQ -1364860928,1364865023,DE -1364865024,1364869119,PT -1364869120,1364873215,FI -1364873216,1364877311,GB -1364877312,1364881407,ES -1364881408,1364885503,EE -1364885504,1364889599,GB -1364889600,1364893695,IR -1364893696,1364897791,CZ -1364901888,1364905983,DE -1364905984,1364910079,RU -1364910080,1364914175,UA -1364914176,1364918271,CZ -1364918272,1364922367,SE -1364922368,1364924415,DE -1364924416,1364926463,YE -1364926464,1364934655,RU -1364934656,1364938751,FR -1364938752,1364942847,CZ -1364942848,1364946943,GB -1364946944,1364951039,TR -1364951040,1364959231,IR -1364959232,1364963327,DE -1364963328,1364967423,RU -1364967424,1364971519,GB -1364971520,1364975615,CZ -1364975616,1364979711,BJ -1364979712,1364983807,GB -1364983808,1364988351,DE -1364988352,1364988359,AT -1364988360,1364988367,NL -1364988368,1364988375,BE -1364988376,1364988383,FR -1364988384,1364988391,PL -1364988392,1364988399,ES -1364988400,1364988407,CH -1364988408,1364988415,IT -1364988416,1364990719,DE -1364990720,1364990911,SE -1364990912,1364990943,NO -1364990944,1364990951,DK -1364990952,1364990959,FI -1364990960,1364990967,LT -1364990968,1364990975,LV -1364990976,1364991999,DE -1364992000,1364996095,IT -1364996096,1365000191,GR -1365000192,1365004287,SE -1365004288,1365008383,FR -1365008384,1365012479,CH -1365012480,1365015903,US -1365015904,1365015919,GB -1365015920,1365016575,US -1365016576,1365020671,ES -1365020672,1365024767,CZ -1365024768,1365025151,DE -1365025152,1365025215,AT -1365025216,1365028863,DE -1365028864,1365032959,NL -1365032960,1365033471,US -1365033472,1365033599,PT -1365033600,1365033983,GB -1365033984,1365035007,SE -1365035008,1365039103,GB -1365039104,1365039135,FI -1365039136,1365039359,PT -1365039360,1365039615,GB -1365039616,1365039871,BE -1365039872,1365040127,US -1365040128,1365041151,SE -1365041152,1365044735,FR -1365044736,1365044799,LU -1365044800,1365044927,FR -1365044928,1365044935,GR -1365044936,1365044943,LU -1365044944,1365045247,FR -1365045248,1365047295,AT -1365047296,1365049343,SK -1365049344,1365057535,FR -1365057536,1365061631,IT -1365061632,1365065727,NL -1365065728,1365073919,BA -1365073920,1365078015,NO -1365078016,1365082111,DE -1365082112,1365090303,SE -1365090304,1365094399,NO -1365094400,1365098495,FR -1365098496,1365102591,HU -1365102592,1365102655,FR -1365102656,1365106687,ES -1365106688,1365110783,GB -1365110784,1365114879,FR -1365114880,1365118975,BA -1365118976,1365127167,RU -1365127168,1365131263,AT -1365131264,1365139455,SE -1365139456,1365147647,CH -1365147648,1365155839,RU -1365155840,1365159935,SE -1365159936,1365164031,HU -1365164032,1365171967,GB -1365171968,1365172223,ML -1365172224,1365176319,LV -1365176320,1365180415,HU -1365180416,1365182335,DE -1365182336,1365182351,GB -1365182352,1365182367,NL -1365182368,1365182391,DE -1365182392,1365182399,CH -1365182400,1365182431,SE -1365182432,1365184511,DE -1365184512,1365192703,RU -1365192704,1365196799,GB -1365196800,1365200895,ES -1365200896,1365204991,IQ -1365204992,1365209087,CZ -1365209088,1365213183,BE -1365213184,1365217279,RU -1365217280,1365219167,NL -1365219168,1365219168,GB -1365219169,1365221375,NL -1365221376,1365225471,GE -1365225472,1365229567,UA -1365229568,1365233663,PL -1365233664,1365237759,RU -1365237760,1365241855,UZ -1365241856,1365245951,DK -1365245952,1366294527,GB -1366294528,1366456994,IT -1366456995,1366456995,BO -1366456996,1367343103,IT -1367343104,1369440255,GB -1369440256,1369473023,DE -1369473024,1369505791,HU -1369505792,1369509887,RO -1369509888,1369518079,RU -1369518080,1369520127,RO -1369520128,1369520639,LI -1369520640,1369520895,FR -1369520896,1369521151,RO -1369521152,1369521663,SK -1369521664,1369521919,PL -1369521920,1369522175,RU -1369522176,1369530367,CZ -1369530368,1369530879,DK -1369530880,1369531391,RU -1369531392,1369534975,PL -1369534976,1369535231,RU -1369535232,1369535487,AT -1369535488,1369538559,RU -1369538560,1369554943,DK -1369554944,1369559039,PL -1369559040,1369563135,RU -1369567232,1369571327,BG -1369571328,1369585663,RU -1369585664,1369591807,UA -1369591808,1369595903,SK -1369595904,1369604095,UA -1369604096,1369620479,MD -1369620480,1369624575,CZ -1369624576,1369626623,PL -1369626624,1369636863,UA -1369636864,1369638911,IR -1369638912,1369640959,PL -1369640960,1369655295,RU -1369655296,1369657343,LV -1369657344,1369659391,RU -1369659392,1369661439,UA -1369661440,1369665535,RU -1369665536,1369677823,UA -1369677824,1369686015,RU -1369688064,1369690111,PL -1369690112,1369694207,UA -1369694208,1369702399,RU -1369702400,1369833471,BE -1369833472,1369964543,NO -1369964544,1369997311,GB -1369997312,1370030079,PL -1370030080,1370062847,BE -1370062848,1370095615,DE -1370095616,1370128383,GB -1370128384,1370161151,SE -1370161152,1370174207,NL -1370174208,1370174463,DE -1370174464,1370174495,BE -1370174496,1370174527,FR -1370174528,1370174559,CH -1370174560,1370174591,HU -1370174592,1370174623,CZ -1370174624,1370174655,PL -1370174656,1370174687,DE -1370174688,1370174719,SE -1370174720,1370174751,DK -1370174752,1370174752,NL -1370174753,1370174783,ES -1370174784,1370174815,CH -1370174816,1370175999,NL -1370176000,1370176255,DE -1370176256,1370176511,GB -1370176512,1370176767,NL -1370176768,1370177023,SE -1370177024,1370178559,NL -1370178560,1370179071,ES -1370179072,1370179583,SE -1370179584,1370180095,NL -1370180096,1370180351,GB -1370180352,1370180607,DE -1370180608,1370182911,NL -1370182912,1370183167,DE -1370183168,1370185983,NL -1370185984,1370186239,GB -1370186240,1370188543,NL -1370188544,1370188799,FR -1370188800,1370189055,AU -1370189056,1370189311,NL -1370189312,1370189567,US -1370189568,1370190847,NL -1370190848,1370192127,DE -1370192128,1370193919,NL -1370193920,1370226687,GB -1370226688,1370259455,ES -1370259456,1370292223,SE -1370292224,1370296319,NL -1370296320,1370300415,GB -1370300416,1370302463,NL -1370302464,1370302975,ES -1370302976,1370303487,NO -1370303488,1370312703,NL -1370312704,1370316799,CH -1370316800,1370317823,NL -1370317824,1370318847,IT -1370318848,1370320895,ES -1370320896,1370321919,DE -1370321920,1370324991,NL -1370324992,1370357759,DE -1370357760,1370390527,IT -1370390528,1370423295,GB -1370423296,1370439679,NO -1370439680,1370456063,NL -1370456064,1370488831,FI -1370488832,1370619903,RU -1370619904,1370750975,GB -1370750976,1370767359,RO -1370767360,1370771455,MD -1370771456,1370772479,RO -1370772480,1370772991,MD -1370772992,1370882047,RO -1370882048,1371013119,HU -1371013120,1371078655,ES -1371078656,1371144191,FR -1371144192,1371201535,GR -1371201536,1371205631,PL -1371205632,1371209727,SE -1371209728,1371275263,GB -1371275264,1371340799,BE -1371340800,1371406335,AT -1371406336,1371471871,PL -1371471872,1371537407,NO -1371537408,1371602943,MA -1371602944,1371668479,PT -1371668480,1371734015,FR -1371734016,1371799551,RU -1371799552,1371865087,RO -1371865088,1371930623,FI -1371930624,1371979007,LV -1371979008,1371979263,LT -1371979264,1371996159,LV -1371996160,1371996671,GB -1371996672,1371996927,GA -1371996928,1372000255,GB -1372000256,1372001279,UG -1372001280,1372012543,GB -1372012544,1372016639,DE -1372016640,1372017583,GB -1372017584,1372017599,CD -1372017600,1372020223,GB -1372020224,1372020224,CD -1372020225,1372020479,GB -1372020480,1372020480,CD -1372020481,1372020735,GB -1372020736,1372022783,CD -1372022784,1372023807,GB -1372023808,1372024831,IL -1372024832,1372025087,ZM -1372025088,1372026623,GB -1372026624,1372026879,KE -1372026880,1372027903,IL -1372027904,1372043519,GB -1372043520,1372043775,NG -1372043776,1372045567,GB -1372045568,1372045823,ZM -1372045824,1372047231,GB -1372047232,1372047295,NG -1372047296,1372060671,GB -1372060672,1372061695,IL -1372061696,1372069887,RU -1372069888,1372073983,FR -1372073984,1372078079,CZ -1372078080,1372082175,GB -1372082176,1372086271,RU -1372086272,1372090367,DE -1372090368,1372094463,RU -1372094464,1372098559,IT -1372098560,1372102655,RU -1372102656,1372106751,SE -1372106752,1372110847,FR -1372110848,1372114943,DE -1372114944,1372119039,RU -1372119040,1372123135,IT -1372123136,1372127231,RU -1372127232,1372131327,IT -1372131328,1372135423,RU -1372135424,1372139519,DE -1372139520,1372143615,CZ -1372143616,1372147711,RU -1372147712,1372151807,BE -1372151808,1372153343,DE -1372153344,1372153855,GB -1372153856,1372154367,DE -1372154368,1372154879,GB -1372154880,1372156927,DE -1372156928,1372157439,GB -1372157440,1372159999,DE -1372160000,1372164095,GB -1372164096,1372168191,DE -1372168192,1372172287,GB -1372172288,1372176383,FR -1372176384,1372180479,CH -1372180480,1372184575,SE -1372184576,1372188671,DE -1372188672,1372192767,RU -1372192768,1372323839,ES -1372323840,1372585983,NL -1372585984,1372618751,IT -1372618752,1372651519,GB -1372651520,1372684287,FI -1372684544,1372684799,DE -1372685664,1372685679,DE -1372688384,1372689407,DE -1372689920,1372690175,DE -1372693504,1372694015,DE -1372697344,1372697599,DE -1372698880,1372699647,DE -1372699904,1372700159,DE -1372702720,1372703231,DE -1372703616,1372703743,DE -1372704768,1372713983,DE -1372715008,1372717055,DE -1372717056,1372749823,PL -1372749824,1372782591,DE -1372782592,1372815359,RU -1372815360,1372848127,KZ -1372848128,1373110271,TR -1373110272,1373175807,SE -1373175808,1373241343,AT -1373241344,1373306879,IL -1373306880,1373372415,PL -1373372416,1373437951,FR -1373437952,1373503487,CH -1373503488,1373569023,RU -1373569024,1373634559,AT -1373634560,1373802623,SE -1373802624,1373802751,DK -1373802752,1374683135,SE -1374683136,1375207423,BE -1375207424,1375207679,FR -1375207680,1375208191,MQ -1375208192,1375208703,FR -1375208704,1375210239,MQ -1375210240,1375211007,FR -1375211008,1375211263,MQ -1375211264,1375211519,FR -1375211520,1375212287,GP -1375212288,1375212543,FR -1375212544,1375213311,GP -1375213312,1375213823,FR -1375213824,1375215359,GP -1375215360,1375215615,FR -1375215616,1375215871,GF -1375215872,1375216127,FR -1375216128,1375216383,GF -1375216384,1375216639,FR -1375216640,1375217407,GF -1375217408,1375217663,FR -1375217664,1375217919,GF -1375217920,1375218175,FR -1375218176,1375220735,GF -1375220736,1375224831,FR -1375224832,1375225087,MQ -1375225088,1375225855,FR -1375225856,1375226111,MQ -1375226112,1375226367,FR -1375226368,1375226623,MQ -1375226624,1375227135,FR -1375227136,1375229695,MQ -1375229696,1375229951,FR -1375229952,1375230463,MQ -1375230464,1375230719,FR -1375230720,1375231999,MQ -1375232000,1375235071,FR -1375235072,1375235583,MQ -1375235584,1375236095,FR -1375236096,1375237631,MQ -1375237632,1375237887,FR -1375237888,1375240191,MQ -1375240192,1375256575,GP -1375256576,1375272959,RE -1375272960,1375731711,FR -1375731712,1378877439,GB -1378877440,1379926015,IT -1379926016,1380188159,FR -1380188160,1380450303,GB -1380450304,1380712447,NL -1380712448,1380974591,RO -1380974592,1381105663,IL -1381105664,1381236735,DE -1381236736,1381367807,IT -1381367808,1381498879,ES -1381498880,1381761023,IT -1381761024,1382023167,NL -1382023168,1382027327,SE -1382027328,1382027343,DK -1382027344,1382039551,SE -1382039552,1382055935,DE -1382055936,1382072319,FR -1382072320,1382088703,RU -1382088704,1382105087,FR -1382105088,1382137855,DE -1382137856,1382138367,GB -1382138368,1382138879,RU -1382138880,1382139391,GB -1382139392,1382139647,RU -1382139648,1382140159,GB -1382140160,1382141951,RU -1382141952,1382146047,SY -1382146048,1382154239,IR -1382154240,1382170623,FR -1382170624,1382187007,DE -1382187008,1382203391,ES -1382203392,1382205439,GB -1382213632,1382219775,GB -1382219776,1382219959,SE -1382219960,1382219967,FI -1382219968,1382222807,SE -1382222808,1382222815,FI -1382222816,1382222847,SE -1382222848,1382222911,FI -1382222912,1382230207,SE -1382230208,1382230215,NO -1382230216,1382232775,SE -1382232776,1382232783,FI -1382232784,1382252543,SE -1382252544,1382268927,CZ -1382268928,1382285311,IR -1382285312,1382301695,CZ -1382301696,1382318079,SE -1382318080,1382334463,SY -1382334464,1382350847,DE -1382350848,1382367231,FR -1382367232,1382383615,BG -1382383616,1382399999,NG -1382400000,1382416383,NL -1382416384,1382417407,SE -1382417408,1382417663,PT -1382417664,1382418175,SE -1382418176,1382418431,PT -1382418432,1382420479,GB -1382420480,1382420735,DE -1382420736,1382420991,ES -1382420992,1382421247,FR -1382421248,1382421503,BE -1382421504,1382421759,DK -1382421760,1382422015,IT -1382422016,1382422271,NO -1382422272,1382422527,BG -1382422528,1382422783,CH -1382422784,1382423039,SG -1382423040,1382423167,IT -1382423168,1382423295,ES -1382423296,1382423551,NO -1382423552,1382423807,JP -1382423808,1382423935,US -1382423936,1382424063,GB -1382424064,1382424575,US -1382424576,1382449151,CY -1382449152,1382465535,IL -1382465536,1382481919,PS -1382481920,1382498303,AT -1382498304,1382514687,BG -1382514688,1382518783,DK -1382518784,1382522879,DE -1382522880,1382531071,DK -1382531072,1382547455,FI -1382547456,1382809599,IT -1382809600,1383071743,GB -1383071744,1383088127,RU -1383088128,1383096319,IS -1383096320,1383098879,GB -1383098880,1383099135,DE -1383099136,1383099163,GB -1383099164,1383099164,NL -1383099165,1383104511,GB -1383104512,1383112703,JE -1383112704,1383114751,LB -1383114752,1383116799,GB -1383116800,1383120895,RU -1383120896,1383129087,IT -1383129088,1383137279,GB -1383137280,1383145471,MC -1383145472,1383153663,CZ -1383153664,1383161855,GB -1383161856,1383170047,DE -1383170048,1383186431,GB -1383186432,1383194623,IT -1383194624,1383202815,GB -1383202816,1383211007,RU -1383211008,1383219199,CY -1383219200,1383225983,AL -1383225984,1383226007,RS -1383226008,1383226207,AL -1383226208,1383226239,RS -1383226240,1383227391,AL -1383227392,1383243775,RU -1383243776,1383251967,YE -1383251968,1383260159,CZ -1383260160,1383268351,RU -1383268352,1383268607,IR -1383268608,1383269375,NL -1383269376,1383272191,IR -1383272192,1383272447,NL -1383272448,1383276543,IR -1383276544,1383284735,KZ -1383284736,1383292927,PL -1383292928,1383301119,DE -1383301120,1383309311,SE -1383309312,1383317503,IT -1383317504,1383321599,SE -1383325696,1383333887,GB -1383333888,1383350271,RU -1383350272,1383358463,NO -1383358464,1383366911,DE -1383366912,1383367167,SY -1383367168,1383367679,DE -1383367680,1383368703,GB -1383368704,1383369727,DE -1383369728,1383369983,SA -1383369984,1383372031,DE -1383372032,1383374591,KW -1383374592,1383374847,US -1383374848,1383383039,ES -1383383040,1383391231,CY -1383391232,1383399423,FI -1383399424,1383407615,LI -1383407616,1383415807,NO -1383415808,1383423999,RU -1383424000,1383432191,SE -1383432192,1383440383,CZ -1383440384,1383448575,RU -1383448576,1383456767,RS -1383456768,1383464959,UA -1383464960,1383469055,BA -1383469056,1383471103,UA -1383471104,1383473151,SE -1383473152,1383481343,DE -1383481344,1383481599,GB -1383481600,1383481615,US -1383481616,1383481663,GB -1383481664,1383481695,US -1383481696,1383482623,GB -1383482624,1383482879,NL -1383482880,1383497727,GB -1383497728,1383505919,RU -1383505920,1383514111,SA -1383514112,1383522303,FI -1383522304,1383523839,BG -1383523840,1383524095,GB -1383524096,1383524863,BG -1383524864,1383525119,GB -1383525120,1383530495,BG -1383530496,1383538687,DE -1383538688,1383546879,IT -1383546880,1383555071,BG -1383555072,1383563263,SK -1383563264,1383571455,RU -1383571456,1383579647,DE -1383579648,1383587839,IT -1383587840,1383591935,SK -1383591936,1383596031,CZ -1383596032,1384120319,FR -1384120320,1384153087,NG -1384153088,1384185855,FI -1384187136,1384187391,DE -1384188160,1384188415,ES -1384198144,1384202239,GB -1384206336,1384218623,GB -1384218624,1384251391,EG -1384251392,1384267775,FI -1384267776,1384284159,CH -1384284160,1384316927,ES -1384316928,1384349695,EE -1384349696,1384382463,HU -1384382464,1384415231,HR -1384415232,1384480767,GB -1384480768,1384513535,FI -1384513536,1384546303,NO -1384546304,1384579071,NL -1384579072,1384611839,DE -1384611840,1384644607,LT -1384644608,1384660991,GB -1384660992,1384677375,CH -1384677376,1384693759,SE -1384693760,1384710143,NL -1384710144,1384726527,RO -1384726528,1384742911,BG -1384742912,1384759295,RU -1384759296,1384775679,SY -1384775680,1384792063,RU -1384792064,1384808447,FR -1384808448,1384808479,BE -1384808736,1384808799,BE -1384808800,1384808831,FR -1384808832,1384808959,FI -1384808960,1384808967,BE -1384808976,1384808991,DE -1384808992,1384809015,BE -1384809016,1384809023,GB -1384809024,1384809039,FR -1384809040,1384809047,BE -1384809056,1384809071,BE -1384809072,1384809087,FR -1384809088,1384809103,BE -1384809112,1384809119,GE -1384809120,1384809175,BE -1384809184,1384809199,BE -1384809208,1384809215,BE -1384809216,1384809407,BR -1384809408,1384809439,FR -1384809440,1384809471,DE -1384809472,1384809983,US -1384809984,1384810239,PT -1384810240,1384811007,US -1384811008,1384811519,GB -1384811520,1384811647,IR -1384811712,1384811743,ES -1384811744,1384811775,BE -1384811776,1384812031,FR -1384812032,1384812159,PR -1384812160,1384812287,PT -1384812288,1384812543,ES -1384812544,1384813567,GB -1384813568,1384814079,ES -1384814080,1384814591,GB -1384814592,1384815103,BE -1384815104,1384815615,FR -1384815616,1384816127,BE -1384816256,1384816383,ES -1384824832,1384841215,GB -1384841216,1384857599,PL -1384857600,1384873983,NL -1384873984,1384890367,PL -1384890368,1384923135,DE -1384923136,1384939519,RU -1384939520,1384955903,LT -1384955904,1384972287,RU -1384972288,1384988671,DE -1384988672,1385005055,FI -1385005056,1385021439,HU -1385021440,1385037823,IE -1385037824,1385054207,FR -1385054208,1385070591,CZ -1385070592,1385086975,RU -1385086976,1385103359,GB -1385103360,1385119743,IT -1385119744,1385136127,BE -1385136128,1385152511,PL -1385152512,1385168895,DK -1385168896,1385177087,ES -1385177088,1385185279,DE -1385185280,1385193471,RU -1385193472,1385201663,ES -1385201664,1385209855,CZ -1385209856,1385218047,HU -1385218048,1385226239,UA -1385226240,1385234431,GB -1385234432,1385242623,DE -1385242624,1385250815,GB -1385250816,1385259007,PL -1385259008,1385267199,IT -1385267200,1385275391,SE -1385275392,1385283583,IT -1385283584,1385286143,DE -1385286144,1385290288,GB -1385290289,1385290289,RE -1385290290,1385290631,GB -1385290632,1385290632,IS -1385290633,1385291343,GB -1385291344,1385291344,IS -1385291345,1385291775,GB -1385291776,1385299967,TR -1385299968,1385303039,BG -1385303040,1385303295,HU -1385303296,1385303551,JP -1385303552,1385304063,BG -1385304064,1385304319,KR -1385304320,1385304575,AE -1385304576,1385304831,GR -1385304832,1385308159,BG -1385308160,1385316351,RU -1385316352,1385324543,NO -1385324544,1385332735,BE -1385332736,1385340927,GB -1385340928,1385349119,LB -1385349120,1385357311,CH -1385357312,1385365503,PL -1385365504,1385373695,GB -1385373696,1385381887,NO -1385381888,1385398271,RU -1385398272,1385406463,BG -1385406464,1385414655,EE -1385414656,1385422847,SA -1385422848,1385431039,DK -1385431040,1385439231,RU -1385439232,1385447423,GB -1385447424,1385455615,IS -1385455616,1385463807,QA -1385463808,1385480191,NO -1385480192,1385488383,NL -1385488384,1385496575,GB -1385496576,1385504767,SI -1385504768,1385512959,IT -1385512960,1385521151,DE -1385521152,1385529343,AT -1385529344,1385537535,RU -1385537536,1385545727,DE -1385545728,1385553919,RU -1385553920,1385562111,DE -1385566432,1385566447,FR -1385566720,1385566975,GB -1385567000,1385567007,FR -1385567232,1385568255,IE -1385569024,1385569279,FR -1385570112,1385570119,FR -1385570144,1385570151,FR -1385570304,1385578495,HU -1385578496,1385586687,TR -1385586688,1385588991,GB -1385588992,1385589247,HK -1385589248,1385589503,JP -1385589504,1385589759,GB -1385589760,1385590015,JP -1385590016,1385590783,GB -1385590784,1385591295,US -1385591296,1385591807,HK -1385591808,1385592063,SG -1385592064,1385594879,GB -1385594880,1385603071,NL -1385603072,1385611263,CZ -1385611264,1385619455,AT -1385619456,1385625599,DE -1385625600,1385635839,FR -1385635840,1385644031,NL -1385644032,1385652223,MR -1385652224,1385660415,RU -1385660416,1385668607,TR -1385668608,1385676799,NL -1385676800,1385684991,RU -1385684992,1385824255,GB -1385824256,1385955327,PT -1385955328,1386086399,NL -1386086400,1386217471,ES -1386217472,1386283007,PL -1386283008,1386348543,NL -1386348544,1386414079,RU -1386414080,1386422271,GB -1386422272,1386423295,IT -1386423296,1386424319,FR -1386424320,1386426367,NL -1386426368,1386426623,US -1386426624,1386427391,IL -1386427392,1386432511,PS -1386432512,1386433023,GB -1386433024,1386433279,NL -1386433280,1386434751,GB -1386434752,1386434767,BE -1386434768,1386434783,IE -1386434784,1386434799,PT -1386434800,1386438143,GB -1386438144,1386438399,ES -1386438400,1386438655,FR -1386438656,1386442751,PS -1386442752,1386444799,GB -1386444800,1386445823,DK -1386445824,1386447871,GB -1386447872,1386448895,DK -1386448896,1386449151,IL -1386449152,1386449343,NL -1386449344,1386449347,GB -1386449348,1386449359,NL -1386449360,1386449363,GB -1386449364,1386449367,BE -1386449368,1386449371,AU -1386449372,1386449375,AT -1386449376,1386449379,NL -1386449380,1386449383,CH -1386449384,1386449387,FR -1386449388,1386449391,NL -1386449392,1386449395,ES -1386449396,1386449399,PT -1386449400,1386449403,RU -1386449404,1386449407,DE -1386449408,1386449663,GB -1386449664,1386449919,HK -1386449920,1386449920,US -1386449921,1386450175,IL -1386450176,1386450431,US -1386450432,1386450943,IL -1386450944,1386455039,GB -1386455040,1386456063,DK -1386456064,1386457087,GB -1386457088,1386459135,PS -1386459136,1386471423,GB -1386471424,1386473471,PS -1386473472,1386477567,GB -1386477568,1386477823,US -1386477824,1386478079,IL -1386478080,1386478335,US -1386478336,1386478591,IL -1386478592,1386479615,GB -1386479616,1386545151,NO -1386545152,1386552319,DE -1386552320,1386553087,GB -1386553088,1386610687,DE -1386610688,1386676223,IL -1386676224,1386741759,SA -1386741760,1387249663,NL -1387249664,1387250687,BE -1387250688,1387331583,NL -1387331584,1387397119,PL -1387397120,1387462655,OM -1387462656,1387528191,RU -1387528192,1387593727,DK -1387593728,1387659263,FI -1387659264,1387790335,SE -1387790336,1388314623,IT -1388314624,1388315135,AT -1388315136,1388315647,GR -1388315648,1388322815,AT -1388322816,1388331007,SI -1388331008,1388339199,NL -1388339200,1388339711,GB -1388339712,1388340223,DE -1388340224,1388347391,GB -1388347392,1388363775,DK -1388363776,1388371967,DE -1388371968,1388380159,CH -1388380160,1388396543,IT -1388396544,1388404735,LV -1388404736,1388412927,UA -1388412928,1388421119,RU -1388421120,1388429311,SE -1388429312,1388437503,HR -1388437504,1388445695,DE -1388445696,1388453887,AZ -1388453888,1388462079,BH -1388462080,1388470271,ES -1388470272,1388478463,DE -1388478464,1388486655,AT -1388486656,1388494847,RU -1388494848,1388503039,NO -1388503040,1388519423,RU -1388519424,1388527615,NL -1388527616,1388535807,DE -1388535808,1388543999,GB -1388544000,1388552191,IE -1388552192,1388553664,GB -1388553665,1388553665,EC -1388553666,1388553666,SV -1388553667,1388553667,GT -1388553668,1388554463,GB -1388554464,1388554464,ZM -1388554465,1388554465,IL -1388554466,1388555760,GB -1388555761,1388555761,AR -1388555762,1388555762,BO -1388555763,1388555763,BR -1388555764,1388555764,CL -1388555765,1388555765,CO -1388555766,1388555766,CR -1388555767,1388555767,DO -1388555768,1388557551,GB -1388557552,1388557552,MX -1388557553,1388557553,PA -1388557554,1388557554,PE -1388557555,1388557555,PR -1388557556,1388557556,VE -1388557557,1388557557,IN -1388557558,1388557558,PK -1388557559,1388557559,AL -1388557560,1388559119,GB -1388559120,1388559120,BA -1388559121,1388559121,BG -1388559122,1388559122,BH -1388559123,1388559123,CH -1388559124,1388559124,CZ -1388559125,1388559125,DZ -1388559126,1388559126,EG -1388559127,1388559127,GH -1388559128,1388560383,GB -1388560384,1388568575,FI -1388568576,1388576767,CH -1388576768,1388580863,NL -1388580864,1388581119,GB -1388581120,1388583167,FR -1388583168,1388583423,DZ -1388583424,1388584959,FR -1388587456,1388587471,GB -1388589056,1388589823,GB -1388591104,1388591359,AU -1388593152,1388601343,RU -1388601344,1388609535,SE -1388609536,1388617727,RU -1388617728,1388625919,SE -1388625920,1388634111,NO -1388634112,1388642303,GB -1388642304,1388650495,FI -1388650496,1388658687,PL -1388658688,1388666879,GB -1388666880,1388666956,FR -1388666957,1388666957,RE -1388666958,1388669696,FR -1388669697,1388669697,RE -1388669698,1388671097,FR -1388671098,1388671098,RE -1388671099,1388671763,FR -1388671764,1388671764,RE -1388671765,1388672244,FR -1388672245,1388672245,RE -1388672246,1388673079,FR -1388673080,1388673080,RE -1388673081,1388673769,FR -1388673770,1388673770,RE -1388673771,1388675071,FR -1388675584,1388676095,DE -1388677632,1388677887,NL -1388678144,1388679167,DE -1388679168,1388679423,FR -1388681216,1388683263,DE -1388683264,1388683903,CH -1388683904,1388683919,DE -1388683920,1388684080,CH -1388684081,1388684081,AT -1388684082,1388685599,CH -1388685600,1388685631,GB -1388685632,1388688127,CH -1388688128,1388688159,NL -1388688160,1388691455,CH -1388691456,1388699647,NL -1388699648,1388707839,SE -1388707840,1388708727,LT -1388708728,1388708743,US -1388708744,1388708859,LT -1388708860,1388708863,US -1388708864,1388711176,LT -1388711177,1388711177,RU -1388711178,1388714239,LT -1388714240,1388714495,LB -1388714496,1388716031,LT -1388716032,1388724223,ES -1388724224,1388732415,DE -1388732416,1388740607,ES -1388740608,1388741791,GB -1388741792,1388741795,IE -1388741796,1388743015,GB -1388743016,1388743023,IE -1388743024,1388743047,GB -1388743048,1388743055,IE -1388743056,1388743423,GB -1388743424,1388743435,IE -1388743436,1388743679,GB -1388743680,1388743919,IE -1388743920,1388744391,GB -1388744392,1388744395,IE -1388744396,1388744759,GB -1388744760,1388744767,IE -1388744768,1388744831,GB -1388744832,1388744847,IE -1388744848,1388745971,GB -1388745972,1388745975,IE -1388745976,1388746207,GB -1388746208,1388746223,IE -1388746224,1388746495,GB -1388746496,1388746559,IE -1388746560,1388746911,GB -1388746912,1388746927,IE -1388746928,1388748799,GB -1388748800,1388756991,RU -1388756992,1388765183,DE -1388765184,1388773375,GB -1388773376,1388781567,NO -1388781568,1388789759,ES -1388789760,1388789823,NL -1388789824,1388789831,GB -1388789832,1388789839,NL -1388789840,1388789847,GB -1388789848,1388794943,NL -1388794944,1388794959,GB -1388794960,1388795967,NL -1388795968,1388796031,GB -1388796032,1388796679,NL -1388796680,1388796687,GB -1388796688,1388797951,NL -1388797952,1388806143,RU -1388806144,1388806399,CH -1388806400,1388806655,DE -1388806656,1388806783,CH -1388806784,1388806911,GB -1388806912,1388807551,CH -1388807552,1388807615,DE -1388807616,1388807871,CH -1388807872,1388807935,DE -1388807936,1388811775,CH -1388811776,1388812031,DE -1388812032,1388813247,CH -1388813248,1388813311,DE -1388813312,1388814335,CH -1388814336,1388816383,FI -1388816384,1388822527,AX -1388822528,1388830719,AM -1388830720,1388838911,FI -1388838912,1388871679,RU -1388871680,1388904447,KZ -1388904448,1388937215,NL -1388937216,1388969983,EG -1388969984,1389002751,CZ -1389002752,1389035519,RU -1389035520,1389068287,GB -1389068288,1389101055,FI -1389101056,1389133823,NL -1389133824,1389166591,RU -1389166592,1389199359,PS -1389199360,1389199871,AE -1389199872,1389200159,US -1389200160,1389218815,AE -1389218816,1389219839,AF -1389219840,1389228415,AE -1389228416,1389228479,LB -1389228480,1389232127,AE -1389232128,1389264895,DE -1389264896,1389265151,TZ -1389265152,1389266943,GB -1389266944,1389267199,KE -1389267200,1389268863,GB -1389268864,1389268871,KE -1389268872,1389275647,GB -1389275648,1389275903,ZA -1389275904,1389289471,GB -1389289472,1389290495,NO -1389290496,1389297663,GB -1389297664,1389330431,UA -1389330432,1389363199,DE -1389363200,1389373498,CZ -1389373499,1389373499,ES -1389373500,1389379583,CZ -1389379584,1389395967,RU -1389395968,1389412351,RO -1389412352,1389428735,RS -1389428736,1389445119,CZ -1389445120,1389461503,RU -1389461504,1389477887,SE -1389477888,1389494271,BY -1389494272,1389494527,RO -1389494528,1389510655,DE -1389510656,1389527039,NL -1389527040,1389543423,RO -1389543424,1389548991,DE -1389548992,1389549055,BE -1389549056,1389576191,DE -1389576192,1389592575,GB -1389592576,1389598719,GE -1389598720,1389598956,RU -1389598957,1389598957,GE -1389598958,1389598975,RU -1389598976,1389604863,GE -1389604864,1389605119,RU -1389605120,1389608959,GE -1389608960,1389625343,DK -1389625344,1389641727,DE -1389641728,1389658111,JO -1389658112,1389674495,BE -1389674496,1389690879,DE -1389690880,1389707263,PS -1389707264,1389723647,IT -1389723648,1389756415,ES -1389756416,1389772799,SE -1389772800,1389778431,SI -1389778432,1389780991,RS -1389780992,1389783039,HR -1389783040,1389785087,BA -1389785088,1389787135,MK -1389787136,1389788671,SI -1389788672,1389789183,RS -1389789184,1389805567,PL -1389805568,1389806591,US -1389806592,1389806847,SA -1389806848,1389814271,US -1389814272,1389814527,DE -1389814528,1389815295,US -1389815296,1389815551,DE -1389815552,1389817603,US -1389817604,1389817604,NO -1389817605,1389817855,US -1389817856,1389819007,GB -1389819008,1389819023,DE -1389819024,1389819039,FR -1389819040,1389819055,IT -1389819056,1389819071,TR -1389819072,1389819903,GB -1389819904,1389821951,US -1389821952,1389838335,NL -1389838336,1389854719,UZ -1389854720,1389871103,IT -1389871104,1389887487,FI -1389887488,1389953023,FR -1389953024,1390018559,NL -1390018560,1390084095,AT -1390084096,1390149631,GB -1390149632,1390215167,CH -1390215168,1390280703,IS -1390280704,1390346239,TR -1390346240,1390411775,ES -1390411776,1392508927,FR -1392508928,1393623705,PL -1393623706,1393623706,GB -1393623707,1394606079,PL -1394606080,1396703231,ES -1396703232,1396834303,AT -1396834304,1396899839,TR -1396899840,1396965375,GB -1396965376,1396973567,NL -1396973568,1396981759,RU -1396981760,1396989951,PL -1396989952,1396998143,FR -1396998144,1397006335,AT -1397006336,1397014527,KW -1397014528,1397022719,CH -1397022720,1397030911,SE -1397030912,1397039103,RU -1397039104,1397047295,CZ -1397047296,1397063679,RU -1397063680,1397071871,UZ -1397071872,1397096447,RU -1397096448,1397227519,IE -1397227520,1397489663,DK -1397489664,1397751807,CH -1397751808,1398276095,NL -1398276096,1398800383,DK -1398800384,1398833151,KW -1398833152,1398865919,NL -1398865920,1398867967,RU -1398867968,1398870015,NL -1398872064,1398874111,BG -1398874112,1398876159,GB -1398876160,1398880255,DE -1398880256,1398882303,FR -1398882304,1398884351,BG -1398884352,1398886399,DE -1398886400,1398888447,CH -1398888448,1398890495,GB -1398890496,1398892543,DK -1398892544,1398894591,RU -1398896640,1398898687,CH -1398898688,1398931455,ES -1398931456,1398964223,GB -1398964224,1398996991,NL -1398996992,1399029759,LU -1399029760,1399062527,LV -1399062528,1399095295,FI -1399095296,1399128063,GB -1399128064,1399160831,BE -1399160832,1399193599,SA -1399193600,1399226367,FI -1399226368,1399259135,RU -1399259136,1399291903,IT -1399291904,1399324671,RO -1399324672,1399586815,GB -1399586816,1399717887,NO -1399717888,1399848959,AE -1399848960,1400111103,FR -1400111104,1400274943,NL -1400274944,1400291327,NO -1400291328,1400299519,FR -1400299520,1400373247,NL -1400373248,1400635391,IR -1400700928,1400768511,DE -1400897536,1400963071,NL -1400963072,1401028607,DE -1401028608,1401094143,IL -1401094144,1401159679,HR -1401159680,1401225215,PT -1401225216,1401241599,DE -1401242632,1401242632,DE -1401271296,1401274367,DE -1401278464,1401283583,DE -1401286656,1401290751,DE -1401290752,1401356287,BE -1401356288,1401421823,DE -1401421824,1401423871,GB -1401423872,1401425919,AE -1401425920,1401427967,NL -1401427968,1401430015,RU -1401430016,1401432063,AT -1401432064,1401434111,IE -1401436160,1401438207,BH -1401438208,1401440255,GB -1401440256,1401444351,DE -1401444352,1401446399,DK -1401446400,1401448447,DE -1401448448,1401450495,IT -1401450496,1401452543,RU -1401452544,1401454591,GB -1401454592,1401456639,DE -1401456640,1401458687,LV -1401460736,1401462783,PL -1401462784,1401464831,FR -1401464832,1401466879,IE -1401466880,1401468927,RS -1401468928,1401470975,ES -1401470976,1401473023,NL -1401473024,1401475071,CZ -1401475072,1401477119,FR -1401479168,1401481215,PL -1401481216,1401485311,RU -1401485312,1401487834,GB -1401487835,1401487835,BE -1401487836,1401489407,GB -1401489408,1401491455,SE -1401491456,1401493503,NL -1401493504,1401495551,CH -1401495552,1401497599,DE -1401497600,1401499647,AT -1401499648,1401501695,RU -1401501696,1401503487,IT -1401503488,1401503743,AL -1401503744,1401505791,DE -1401505792,1401509887,CH -1401509888,1401511935,UA -1401511936,1401513983,DE -1401513984,1401516031,IT -1401516032,1401518079,AT -1401518080,1401520127,DK -1401520128,1401522175,GB -1401522176,1401526271,NL -1401526272,1401528319,HU -1401528320,1401530367,IT -1401530368,1401532415,DE -1401532416,1401534463,GB -1401534464,1401536511,DE -1401536512,1401538559,NL -1401538560,1401540607,NO -1401540608,1401542655,GB -1401542656,1401544703,RU -1401544704,1401546751,GB -1401546752,1401548799,IT -1401548800,1401550847,FR -1401550848,1401551615,GB -1401551616,1401552383,JE -1401552384,1401552767,GB -1401552768,1401552895,JE -1401552896,1401554943,NL -1401554944,1401556991,IE -1401556992,1401563135,GB -1401563136,1401565183,ES -1401565184,1401567231,RU -1401567232,1401569279,GB -1401569280,1401585663,DE -1401585664,1401602047,GB -1401602048,1401618431,ES -1401618432,1401634815,AM -1401634816,1401651199,HR -1401651200,1401667583,RU -1401667584,1401683967,IT -1401683968,1401708287,SE -1401708288,1401708543,DE -1401708544,1401712895,SE -1401712896,1401713151,DE -1401713152,1401718111,SE -1401718112,1401718112,DK -1401718113,1401727743,SE -1401727744,1401727999,GB -1401728000,1401740543,SE -1401740544,1401740799,DE -1401740800,1401747711,SE -1401747712,1401747967,FR -1401747968,1401749503,SE -1401749504,1401765887,DE -1401765888,1401782271,IE -1401782272,1401815039,FR -1401815040,1401817087,SE -1401817088,1401819135,RU -1401819136,1401821183,BG -1401821184,1401825279,GB -1401825280,1401827327,PL -1401829376,1401831423,PL -1401831424,1401833471,GB -1401833472,1401835519,FI -1401835520,1401837567,DE -1401837568,1401839615,CH -1401839616,1401841663,NO -1401841664,1401843711,UA -1401843712,1401847807,PL -1401847808,1401849855,DE -1401849856,1401851903,PL -1401851904,1401853951,FR -1401853952,1401855999,PL -1401856000,1401858047,RU -1401858048,1401868287,PL -1401868288,1401870335,UA -1401870336,1401872383,PL -1401872384,1401874431,GB -1401874432,1401876479,UA -1401876480,1401878527,ES -1401878528,1401880575,MT -1401880576,1401882623,DE -1401882624,1401884671,NG -1401884672,1401886719,FR -1401886720,1401888767,BW -1401888768,1401890815,RU -1401890816,1401892863,PL -1401892864,1401894911,RU -1401894912,1401896959,FI -1401896960,1401897983,RU -1401897984,1401899007,MD -1401901056,1401903103,NO -1401903104,1401905151,FI -1401905152,1401907199,PL -1401911296,1401913343,DK -1401913344,1401917439,PL -1401917440,1401919487,BG -1401919488,1401921535,RU -1401921536,1401923583,PL -1401923584,1401925631,GG -1401925632,1401927679,BG -1401927680,1401929727,NL -1401929728,1401933823,RU -1401933824,1401935871,DE -1401935872,1401937919,FI -1401937920,1401939967,GB -1401939968,1401942015,UA -1401942016,1401942047,CZ -1401942048,1401942063,GB -1401942064,1401942071,HU -1401942072,1401943295,GB -1401943296,1401943551,DE -1401943552,1401944063,GB -1401944064,1401946111,BG -1401946112,1401962495,FR -1401962496,1401978879,PL -1401978880,1401995263,PT -1401995264,1402011647,CH -1402011648,1402015743,SE -1402015744,1402017791,FI -1402017792,1402018815,SE -1402018816,1402019839,FI -1402019840,1402027263,SE -1402027264,1402027519,NO -1402027520,1402028031,SE -1402028032,1402044415,FR -1402044416,1402060799,PL -1402060800,1402077183,FI -1402077184,1402093567,GB -1402093568,1402109951,RU -1402109952,1402142719,FI -1402142720,1402159103,ES -1402159104,1402175487,IT -1402175488,1402191871,IE -1402191872,1402208255,IR -1402208256,1402224639,CZ -1402224640,1402241023,BG -1402241024,1402257407,GB -1402257408,1402273791,FI -1402273792,1402277631,RU -1402277632,1402277887,TJ -1402277888,1402290175,RU -1402290176,1402306204,NL -1402306205,1402306205,DE -1402306206,1402306559,NL -1402306560,1402322943,IT -1402322944,1402339327,RU -1402339328,1402355711,CH -1402355712,1402372095,FI -1402372096,1402388479,SE -1402404864,1402408959,RU -1402408960,1402413055,DE -1402413056,1402417151,PL -1402417152,1402421247,DE -1402421248,1402421375,NL -1402421376,1402421735,FR -1402421736,1402421743,NL -1402421744,1402422119,FR -1402422120,1402422127,PT -1402422128,1402422159,FR -1402422160,1402422167,AT -1402422168,1402422783,FR -1402422784,1402423039,LU -1402423040,1402423295,FR -1402423296,1402423399,BE -1402423400,1402423407,LU -1402423408,1402423807,BE -1402423808,1402423839,FR -1402423840,1402423847,ES -1402423848,1402423919,FR -1402423920,1402423927,ES -1402423928,1402424319,FR -1402424320,1402424575,BE -1402424576,1402424831,FR -1402424832,1402425343,GB -1402425344,1402425599,DE -1402425600,1402425855,LU -1402425856,1402425871,BE -1402425872,1402425935,FR -1402425936,1402425943,NL -1402425944,1402425999,FR -1402426000,1402426015,CH -1402426016,1402426271,FR -1402426272,1402426279,PT -1402426280,1402426367,FR -1402426368,1402426623,DE -1402426624,1402427135,CH -1402427136,1402427239,GB -1402427240,1402427247,FR -1402427248,1402427335,GB -1402427336,1402427343,FR -1402427344,1402427535,GB -1402427536,1402427551,BE -1402427552,1402427655,GB -1402427656,1402427663,FR -1402427664,1402427671,GB -1402427672,1402427679,NL -1402427680,1402427903,GB -1402427904,1402427935,FR -1402427936,1402427951,GB -1402427952,1402427959,FR -1402427960,1402428023,GB -1402428024,1402428031,AT -1402428032,1402428095,GB -1402428096,1402428103,BE -1402428104,1402428111,GB -1402428112,1402428119,BE -1402428120,1402428255,GB -1402428256,1402428271,AT -1402428272,1402428279,FR -1402428280,1402428295,GB -1402428296,1402428311,BE -1402428312,1402428319,NL -1402428320,1402428335,FR -1402428336,1402428351,BE -1402428352,1402429439,GB -1402429440,1402431487,US -1402431488,1402433600,GB -1402433601,1402433601,FR -1402433602,1402435071,GB -1402435072,1402435103,LU -1402435104,1402437631,GB -1402437632,1402454015,DK -1402454016,1402455469,GB -1402455470,1402455470,DK -1402455471,1402455551,GB -1402455552,1402455807,US -1402455808,1402470399,GB -1402470400,1402994687,FR -1402994688,1403256831,NL -1403256832,1403322367,AT -1403322368,1403387903,ES -1403387904,1403396095,SE -1403396096,1403404287,EE -1403404288,1403412479,GB -1403412480,1403420671,RU -1403420672,1403428863,CH -1403428864,1403437055,GB -1403437056,1403445247,RO -1403445248,1403447295,RU -1403447296,1403448575,MD -1403448576,1403461631,RU -1403461632,1403469823,FR -1403469824,1403486207,RU -1403486208,1403494399,FR -1403494400,1403502591,GB -1403502592,1403510783,NL -1403510784,1403518975,CZ -1403518976,1403535359,CY -1403535360,1403551743,PL -1403551744,1403568127,SK -1403568128,1403573247,SE -1403573248,1403573503,ES -1403573504,1403574783,SE -1403574784,1403575039,IT -1403575040,1403576063,SE -1403576064,1403576319,DE -1403576320,1403578879,SE -1403578880,1403579135,DK -1403579136,1403581951,SE -1403581952,1403582207,US -1403582208,1403584511,SE -1403584512,1403600895,DE -1403600896,1403601519,FR -1403601520,1403601535,MC -1403601536,1403617279,FR -1403617280,1403633663,DE -1403633664,1403650047,RU -1403650048,1403666431,DE -1403666432,1403699199,GB -1403699200,1403715583,UA -1403715584,1403731967,LT -1403731968,1403748351,RU -1403748352,1403764735,DE -1403781120,1403797503,RU -1403797504,1403813887,SE -1403813888,1403830271,NL -1403830272,1403846655,CH -1403846656,1403863039,IS -1403863040,1403879423,FR -1403879424,1403895807,ES -1403895808,1403912191,CH -1403912192,1403928575,PT -1403928576,1403944959,SE -1403944960,1403953151,GR -1403953152,1403961343,IE -1403961344,1403977727,RU -1403977728,1403994111,IT -1403994112,1404010495,AT -1404010496,1404026879,PL -1404026880,1404043263,ES -1404043264,1404051455,EE -1404051456,1404076031,HR -1404076032,1404076543,SE -1404076544,1404077055,LV -1404077056,1404081151,SE -1404081152,1404084223,LV -1404084224,1404099327,LT -1404099328,1404099583,SE -1404099584,1404103167,LT -1404103168,1404103679,SE -1404103680,1404108799,LT -1404108800,1404116991,HR -1404116992,1404125183,LT -1404125184,1404141567,HR -1404141568,1404149759,LV -1404149760,1404151807,LT -1404151808,1404153855,LV -1404153856,1404153856,LT -1404153857,1404157090,LV -1404157091,1404157091,LT -1404157092,1404157951,LV -1404157952,1404157952,LT -1404157953,1404166143,LV -1404166144,1404174335,LT -1404174336,1404182527,EE -1404182528,1404187519,SE -1404187520,1404187535,LV -1404187536,1404187551,NL -1404187552,1404189183,SE -1404189184,1404190719,EE -1404190720,1404194815,SE -1404194816,1404198911,LT -1404198912,1404200959,SE -1404200960,1404207103,HR -1404207104,1404220415,SE -1404220416,1404221439,EE -1404221440,1404222463,SE -1404222464,1404222975,LV -1404222976,1404227071,SE -1404227072,1404230655,LV -1404230656,1404232703,SE -1404232704,1404233215,LV -1404233216,1404234239,SE -1404234240,1404239871,HR -1404239872,1404239872,LT -1404239873,1404242687,EE -1404242688,1404242751,SE -1404242752,1404249572,EE -1404249573,1404249573,LT -1404249574,1404251450,EE -1404251451,1404251451,LT -1404251452,1404257995,EE -1404257996,1404257996,LT -1404257997,1404258945,EE -1404258946,1404258946,LT -1404258947,1404263186,EE -1404263187,1404263187,LT -1404263188,1404265888,EE -1404265889,1404265889,LT -1404265890,1404313599,EE -1404313600,1404321791,HR -1404321792,1404338175,EE -1404338176,1404340223,SE -1404340224,1404342271,HR -1404342272,1404362751,SE -1404362752,1404376288,LT -1404376289,1404376289,SE -1404376290,1404379135,LT -1404379136,1404383231,AT -1404383232,1404385279,HR -1404385280,1404386047,LT -1404386048,1404386303,SE -1404386304,1404420095,LT -1404420096,1404426502,HR -1404426503,1404426503,SE -1404426504,1404436479,HR -1404436480,1404444671,SE -1404444672,1404452863,LT -1404452864,1404510207,SE -1404510208,1404518399,HR -1404518400,1404522495,SE -1404522496,1404526591,LV -1404526592,1404567551,SE -1404567552,1404600319,HR -1404600320,1404633087,SE -1404633088,1404641279,HR -1404641280,1404678143,SE -1404678144,1404680191,HR -1404680192,1404731391,SE -1404731392,1404764159,HR -1404764160,1404768255,NL -1404768256,1404772351,SE -1404772352,1404780543,NL -1404780544,1404788735,SE -1404788736,1404796927,LT -1404796928,1404801023,EE -1404801024,1404803071,SE -1404803072,1404805119,LV -1404805120,1404813311,AT -1404813312,1404815871,EE -1404815872,1404816383,LT -1404816384,1404817407,SE -1404817408,1404821503,EE -1404821504,1404862463,LT -1404862464,1404870655,HR -1404870656,1404872703,LT -1404872704,1404875775,SE -1404875776,1404876799,LT -1404876800,1404887039,SE -1404887040,1404895231,LT -1404895232,1404911615,SE -1404911616,1404921855,NL -1404921856,1404927999,LT -1404928000,1404944383,SE -1404944384,1404960767,LT -1404960768,1404977151,SE -1404977152,1404993535,LT -1404993536,1405009919,SE -1405009920,1405042687,LT -1405042688,1405050879,HR -1405050880,1405059071,AT -1405059072,1405063167,SE -1405063168,1405091839,EE -1405091840,1405812991,FR -1405812992,1405813247,MQ -1405813248,1405814015,FR -1405814016,1405814783,MQ -1405814784,1405815039,FR -1405815040,1405815807,MQ -1405815808,1405816063,FR -1405816064,1405816575,MQ -1405816576,1405816831,FR -1405816832,1405817855,MQ -1405817856,1405818111,FR -1405818112,1405818879,MQ -1405818880,1405822719,FR -1405822720,1405824255,MQ -1405824256,1405824767,FR -1405824768,1405825023,MQ -1405825024,1405825279,FR -1405825280,1405826815,MQ -1405826816,1405830655,FR -1405830656,1405831167,MQ -1405831168,1405832447,FR -1405832448,1405832703,MQ -1405832704,1405832959,FR -1405832960,1405833727,MQ -1405833728,1405833983,FR -1405833984,1405834239,MQ -1405834240,1405834751,FR -1405834752,1405835263,MQ -1405835264,1405835775,FR -1405835776,1405836287,MQ -1405836288,1405836799,FR -1405836800,1405837567,MQ -1405837568,1405837823,FR -1405837824,1405838079,MQ -1405838080,1405838591,FR -1405838592,1405838847,MQ -1405838848,1405839359,FR -1405839360,1405839615,MQ -1405839616,1405839871,FR -1405839872,1405840127,MQ -1405840128,1405840383,FR -1405840384,1405841919,MQ -1405841920,1405842175,FR -1405842176,1405843711,MQ -1405843712,1405843967,FR -1405843968,1405845503,MQ -1405845504,1405845759,FR -1405845760,1405846271,MQ -1405846272,1405846527,FR -1405846528,1405846783,MQ -1405846784,1405847295,FR -1405847296,1405848063,MQ -1405848064,1405848319,FR -1405848320,1405849087,MQ -1405849088,1405849599,FR -1405849600,1405850111,MQ -1405850112,1405850623,FR -1405850624,1405851135,MQ -1405851136,1405851647,FR -1405851648,1405851903,MQ -1405851904,1405855999,FR -1405856000,1405856255,MQ -1405856256,1405856767,FR -1405856768,1405857279,MQ -1405857280,1405857535,FR -1405857536,1405857791,MQ -1405857792,1405858815,FR -1405858816,1405859839,MQ -1405859840,1405861119,FR -1405861120,1405861631,MQ -1405861632,1405863167,FR -1405863168,1405863935,MQ -1405863936,1405865727,FR -1405865728,1405869567,MQ -1405869568,1405869823,FR -1405869824,1405870079,MQ -1405870080,1405870591,FR -1405870592,1405870847,MQ -1405870848,1405871615,FR -1405871616,1405872383,MQ -1405872384,1405873151,FR -1405873152,1405873663,MQ -1405873664,1405874175,FR -1405874176,1405876223,MQ -1405876224,1405876735,FR -1405876736,1405878015,MQ -1405878016,1406140415,FR -1406140416,1406205951,CZ -1406205952,1406210175,SE -1406210176,1406210559,NO -1406210560,1406271487,SE -1406271488,1406337023,IE -1406337024,1406402559,IT -1406402560,1406468095,GR -1406468096,1406533631,ES -1406533632,1406599167,FR -1406599168,1406664703,AT -1406664704,1406672895,FI -1406672896,1406681087,HU -1406681088,1406689279,GB -1406689280,1406697471,SE -1406697472,1406705663,GB -1406705664,1406713855,IT -1406713856,1406721023,AT -1406721024,1406721279,DE -1406721280,1406722047,AT -1406722048,1406730239,DE -1406730240,1406746623,RU -1406746624,1406754559,BE -1406754560,1406754815,FR -1406754816,1406763007,GB -1406763008,1406771199,LU -1406771200,1406779391,GB -1406779392,1406787583,RU -1406787584,1406788095,ES -1406788096,1406788351,NL -1406788352,1406791159,ES -1406791160,1406791295,GB -1406791296,1406793087,ES -1406793088,1406793088,FR -1406793089,1406793843,ES -1406793844,1406793847,GB -1406793848,1406794751,ES -1406794752,1406795775,NL -1406795776,1406797823,IM -1406797824,1406803967,GB -1406803968,1406812159,DE -1406812160,1406820351,SE -1406820352,1406828543,PL -1406828544,1406836735,GB -1406836736,1406844927,AT -1406844928,1406853119,MD -1406853120,1406861311,UA -1406861312,1406869503,RU -1406869504,1406877695,GB -1406877696,1406885887,NL -1406887936,1406889983,DE -1406889984,1406894079,CH -1406894080,1406902271,RU -1406902272,1406910463,AT -1406910464,1406918655,SE -1406918656,1406926847,RU -1406926848,1406935039,IT -1406935040,1406951423,RU -1406951424,1406959615,PL -1406959616,1406964223,DE -1406964224,1406964735,NL -1406964736,1406967807,DE -1406967808,1406975999,RU -1406976000,1406984191,IE -1406984192,1407000575,RU -1407000576,1407016959,DE -1407016960,1407025151,IT -1407025152,1407033343,DK -1407033344,1407041535,UZ -1407041536,1407049727,RU -1407049728,1407057919,DE -1407057920,1407066111,RU -1407066112,1407074303,LU -1407074304,1407089663,RU -1407089664,1407090559,US -1407090560,1407090687,RU -1407090688,1407098879,CH -1407098880,1407107071,BG -1407107072,1407115263,RU -1407115264,1407123455,GB -1407123456,1407131647,SE -1407131648,1407139839,NL -1407139840,1407148031,DE -1407148032,1407156223,GB -1407156224,1407164415,LV -1407164416,1407172607,PT -1407172608,1407180799,GB -1407180800,1407188991,PT -1407188992,1407320063,IT -1407320064,1407451135,SE -1407451136,1407483903,BG -1407483904,1407516671,CH -1407516672,1407516919,GB -1407516920,1407516927,NG -1407516928,1407518831,GB -1407518832,1407518847,NG -1407518848,1407520535,GB -1407520536,1407520543,NG -1407520544,1407520575,GB -1407520576,1407520583,NG -1407520584,1407520623,GB -1407520624,1407520631,NG -1407520632,1407521127,GB -1407521128,1407521135,CD -1407521136,1407521359,GB -1407521360,1407521367,CD -1407521368,1407522375,GB -1407522376,1407522383,CD -1407522384,1407522471,GB -1407522472,1407522479,CD -1407522480,1407523263,GB -1407523264,1407523271,CD -1407523272,1407523959,GB -1407523960,1407523967,CD -1407523968,1407524207,GB -1407524208,1407524215,CD -1407524216,1407525127,GB -1407525128,1407525135,CD -1407525136,1407525599,GB -1407525600,1407525607,CD -1407525608,1407526231,GB -1407526232,1407526239,CD -1407526240,1407527447,GB -1407527448,1407527455,CD -1407527456,1407531215,GB -1407531216,1407531223,CD -1407531224,1407531263,GB -1407531264,1407531519,AU -1407531520,1407533143,GB -1407533144,1407533151,CD -1407533152,1407537087,GB -1407537088,1407537095,GH -1407537096,1407538327,GB -1407538328,1407538335,CD -1407538336,1407538343,GB -1407538344,1407538351,CD -1407538352,1407539967,GB -1407539968,1407539975,CD -1407539976,1407540159,GB -1407540160,1407540167,CD -1407540168,1407540207,GB -1407540208,1407540215,CD -1407540216,1407542687,GB -1407542688,1407542695,CD -1407542696,1407543935,GB -1407543936,1407543943,NG -1407543944,1407544015,GB -1407544016,1407544023,NG -1407544024,1407544791,GB -1407544792,1407544799,NG -1407544800,1407545311,GB -1407545312,1407545319,CD -1407545320,1407545327,GB -1407545328,1407545343,CD -1407545344,1407545863,GB -1407545864,1407545871,CD -1407545872,1407549439,GB -1407549440,1407582207,RU -1407582208,1407614975,PL -1407614976,1407680511,ES -1407680512,1407681023,GB -1407681024,1407681087,ES -1407681088,1407686119,GB -1407686120,1407686123,CH -1407686124,1407686127,DE -1407686128,1407686131,FR -1407686132,1407686135,BE -1407686136,1407686139,GB -1407686140,1407686143,ES -1407686144,1407686147,SE -1407686148,1407695679,GB -1407695680,1407695683,IT -1407695684,1407695763,GB -1407695764,1407695767,DK -1407695768,1407695771,GB -1407695772,1407695775,DK -1407695776,1407695807,GB -1407695808,1407695811,SE -1407695812,1407702271,GB -1407702272,1407702527,DE -1407702528,1407711239,GB -1407711240,1407711247,FR -1407711248,1407713279,GB -1407713280,1407778815,NL -1407778816,1407844351,SE -1407844352,1407909887,RU -1407909888,1407975423,GR -1407975424,1408040959,DE -1408040960,1408106495,RU -1408106496,1408172031,PL -1408172032,1408237567,RU -1408237568,1408270335,CZ -1408270336,1408303103,PT -1408303104,1408335871,LV -1408335872,1408368639,SE -1408368640,1408376831,NO -1408376832,1408385023,DE -1408385024,1408393215,PL -1408393216,1408397311,UA -1408397312,1408401407,PL -1408401408,1408434175,RU -1408434176,1408436223,DE -1408436224,1408438271,LU -1408438272,1408440319,FR -1408440320,1408442367,SE -1408442368,1408444415,PL -1408444416,1408450559,DE -1408450560,1408454655,RU -1408454656,1408456703,DE -1408456704,1408458751,LV -1408458752,1408460799,GB -1408460800,1408462847,PL -1408462848,1408464895,DE -1408466944,1408499711,NO -1408499712,1408532479,PS -1408532480,1408567919,GB -1408567920,1408567927,IE -1408567928,1408579583,GB -1408579584,1408579839,IE -1408579840,1408597503,GB -1408597504,1408598015,IE -1408598016,1408630783,FI -1408630784,1408634879,RO -1408634880,1408663551,DE -1408663552,1408696319,RU -1408696320,1408729087,NL -1408729088,1408761855,ES -1408761856,1409286143,SE -1409286144,1409362431,HU -1409362432,1409363967,BG -1409363968,1409377791,HU -1409377792,1409378047,RO -1409378048,1409378679,HU -1409378680,1409378687,RO -1409378688,1409391103,HU -1409391104,1409391359,BG -1409391360,1409413119,HU -1409413120,1409415167,BG -1409415168,1409436159,HU -1409436160,1409436415,BG -1409436416,1409548287,HU -1409548288,1409810431,FR -1409810432,1409941503,GB -1409941504,1410007039,PL -1410007040,1410009855,DE -1410009856,1410010111,US -1410010112,1410072575,DE -1410072576,1410203647,GB -1410203648,1410212863,FR -1410212864,1410213119,GB -1410213120,1410220959,FR -1410220960,1410220967,AT -1410220968,1410221033,FR -1410221034,1410221034,AT -1410221035,1410221047,FR -1410221048,1410221055,AT -1410221056,1410262055,FR -1410262056,1410262063,ES -1410262064,1410269183,FR -1410269184,1410303999,LT -1410304000,1410306047,LV -1410306048,1410318335,LT -1410318336,1410319359,LV -1410319360,1410322431,LT -1410322432,1410326527,LV -1410326528,1410334719,LT -1410334720,1410338319,ES -1410338320,1410338327,GB -1410338328,1410342399,ES -1410342400,1410342655,DE -1410342656,1410342911,ES -1410342912,1410351103,SK -1410351104,1410359295,CH -1410359296,1410367487,CZ -1410367488,1410375679,RU -1410375680,1410378015,DK -1410378016,1410378031,NO -1410378032,1410383871,DK -1410383872,1410392063,NO -1410392064,1410400255,DE -1410400256,1410408447,RU -1410408448,1410416639,IT -1410416640,1410424831,TR -1410424832,1410433023,DE -1410433024,1410441215,BE -1410441216,1410449407,DE -1410449408,1410457599,SE -1410457600,1410465791,RU -1410465792,1410473983,ES -1410473984,1410490367,JO -1410490368,1410498559,RU -1410498560,1410506751,IT -1410506752,1410514943,IE -1410514944,1410523135,GB -1410523136,1410531327,PT -1410531328,1410539519,DE -1410539520,1410547711,GB -1410547712,1410555903,CZ -1410555904,1410564095,GB -1410564096,1410567313,SE -1410567314,1410567314,CH -1410567315,1410567320,SE -1410567321,1410567321,NO -1410567322,1410567322,FI -1410567323,1410567323,EE -1410567324,1410567324,IT -1410567325,1410568357,SE -1410568358,1410568358,NO -1410568359,1410568501,SE -1410568502,1410568502,DK -1410568503,1410568991,SE -1410568992,1410569007,NO -1410569008,1410572287,SE -1410572288,1410588671,DE -1410588672,1410596863,GB -1410596864,1410605055,ES -1410605056,1410613247,CH -1410613248,1410621439,AL -1410621440,1410629631,NO -1410629632,1410637823,FI -1410637824,1410646015,AT -1410646016,1410654207,GB -1410654208,1410662399,SI -1410662400,1410670591,HU -1410670592,1410675967,DE -1410675968,1410676223,US -1410676224,1410678783,DE -1410678784,1410686975,RU -1410686976,1410695167,CZ -1410695168,1410703359,GB -1410711552,1410719743,BG -1410719744,1410727935,RU -1410727936,1410736127,BG -1410736128,1410739455,RS -1410739456,1410739711,XK -1410739712,1410744319,RS -1410744320,1410752511,FR -1410752512,1410760703,NL -1410760704,1410768895,RU -1410768896,1410777087,GB -1410777088,1410785279,RU -1410785280,1410793471,SA -1410793472,1410801663,GB -1410801664,1410809855,RU -1410809856,1410818047,DE -1410818048,1410826239,SA -1410826240,1410834431,SE -1410834432,1410842623,PL -1410842624,1410850815,PT -1410850816,1410859007,DE -1410859008,1411383295,NL -1411383296,1411448831,LT -1411448832,1411449727,IT -1411449728,1411449791,DE -1411449792,1411450303,IT -1411450304,1411450367,DE -1411450368,1411514367,IT -1411514368,1411579903,FI -1411579904,1411645439,NL -1411645440,1411710975,EG -1411710976,1411776511,FR -1411776512,1411777535,RU -1411777536,1411778559,HK -1411778560,1411780607,NO -1411780608,1411784703,PL -1411784704,1411788799,GB -1411788800,1411792895,IT -1411792896,1411796991,DE -1411796992,1411805183,PL -1411805184,1411809279,AT -1411809280,1411811327,NL -1411811328,1411813375,LV -1411813376,1411817471,NO -1411817472,1411821567,PL -1411821568,1411825663,RU -1411825664,1411829759,DE -1411829760,1411833855,PL -1411833856,1411837951,NL -1411837952,1411842047,BG -1411842048,1411850239,NL -1411850240,1411858431,FR -1411858432,1411870719,DE -1411870720,1411871743,CH -1411871744,1411871771,GB -1411871772,1411871775,FR -1411871776,1411871999,GB -1411872000,1411872056,CH -1411872057,1411872057,GB -1411872058,1411872767,CH -1411872768,1411874815,NL -1411874816,1411876863,RU -1411878912,1411880959,CH -1411880960,1411881215,DE -1411881216,1411881471,GB -1411883008,1411887103,PL -1411887104,1411889151,IR -1411889152,1411891199,IT -1411895296,1411899391,SI -1411899392,1411901439,ES -1411901440,1411903487,IE -1411903488,1411907583,RU -1411907584,1411911679,GB -1411911680,1411915775,US -1411915776,1411919871,GB -1411921920,1411922175,GB -1411922176,1411922431,DE -1411922432,1411923967,GB -1411923968,1411940351,BG -1411940352,1411961611,PL -1411961612,1411961612,IE -1411961613,1411973119,PL -1411973120,1411999743,SI -1411999744,1412001279,BA -1412001280,1412002815,SI -1412002816,1412003839,BA -1412003840,1412005887,SI -1412005888,1412038655,NL -1412038656,1412071423,RU -1412071424,1412104191,CZ -1412104192,1412136959,GB -1412136960,1412169727,BG -1412169728,1412202495,TR -1412202496,1412235263,DE -1412235264,1412300799,GB -1412300800,1412333567,DE -1412333568,1412366335,LT -1412366336,1412399103,SK -1412399104,1412400127,RU -1412400128,1412400639,RO -1412400640,1412403711,RU -1412403712,1412403967,RO -1412403968,1412405759,RU -1412405760,1412406271,PL -1412406272,1412408831,RU -1412408832,1412409343,RO -1412409344,1412412159,RU -1412412160,1412412415,UA -1412412416,1412412671,GB -1412412672,1412413439,RU -1412413440,1412413951,RO -1412413952,1412414719,RU -1412414720,1412414975,RO -1412414976,1412415487,RU -1412415488,1412431871,IR -1412431872,1412562943,NO -1412562944,1412628479,EE -1412628480,1412644863,TR -1412644864,1412661247,RU -1412661248,1412677631,GB -1412677632,1412685823,RU -1412685824,1412694015,IE -1412694016,1412710399,EE -1412710400,1412726783,RU -1412726784,1412743167,SI -1412743168,1412775935,NO -1412775936,1412792319,NL -1412792320,1412793343,US -1412793856,1412795903,US -1412796928,1412800511,US -1412801536,1412804607,US -1412804864,1412805631,US -1412806656,1412808703,US -1412808704,1412825087,RU -1412832768,1412833023,SL -1412841472,1412857855,UZ -1412857856,1412874239,BG -1412874240,1412890623,RU -1412890624,1412907007,LT -1412907008,1412923391,SE -1412923392,1412939775,FR -1412939776,1412956159,CH -1412956160,1413455940,DE -1413455941,1413455941,US -1413455942,1413480447,DE -1413480448,1414004735,IN -1414004736,1414069218,CH -1414069219,1414069219,AT -1414069220,1414266879,CH -1414266880,1414529023,ES -1414529024,1415053311,NL -1415053312,1415184383,ES -1415184384,1415315455,PT -1415315456,1415446527,GB -1415446528,1415577599,IL -1415577600,1416101887,FR -1416101888,1416364031,NL -1416364032,1416626175,IL -1416626176,1416941567,AT -1416941568,1416943615,CH -1416943616,1416944639,AT -1416944640,1416945663,CZ -1416945664,1416953855,AT -1416953856,1417019391,RO -1417019392,1417150463,DE -1417150464,1417674751,ES -1417674752,1421869055,DE -1421869056,1422393343,BE -1422393344,1422413567,DE -1422413568,1422413695,AT -1422413696,1422463231,DE -1422463232,1422463743,NL -1422463744,1422491647,DE -1422491648,1422495615,RU -1422495616,1422495679,NL -1422495680,1422508031,RU -1422508032,1422512127,BG -1422512128,1422516223,PL -1422516224,1422520319,BY -1422520320,1422524415,RU -1422524416,1422589951,NO -1422589952,1422655487,IE -1422655488,1422721023,RU -1422721024,1422729215,PL -1422729216,1422737407,NO -1422745600,1422753791,EG -1422753792,1422761983,FR -1422761984,1422770175,PL -1422770176,1422786559,GR -1422786560,1422852095,HU -1422857088,1422857151,FR -1422903296,1422905343,GB -1422905344,1422907391,IE -1422907392,1422911487,NL -1422911488,1422915583,GB -1422916608,1422916863,GB -1422917344,1422917375,NL -1422917632,1423441919,NO -1423441920,1423704063,SE -1423704064,1423966207,IT -1423966208,1424097279,HU -1424097280,1424228351,CH -1424228352,1424359423,IL -1424359424,1424490495,FI -1424490496,1424503711,ES -1424503712,1424503715,PT -1424503716,1424523263,ES -1424523264,1424556031,RO -1424556032,1424588799,EG -1424588800,1424595726,GB -1424595727,1424595727,IT -1424595728,1424595743,GB -1424595744,1424595751,IT -1424595752,1424597069,GB -1424597070,1424597070,CZ -1424597071,1424600705,GB -1424600706,1424600706,FR -1424600707,1424601471,GB -1424601472,1424601535,ES -1424601536,1424601887,GB -1424601888,1424601903,NL -1424601904,1424603023,GB -1424603024,1424603039,US -1424603040,1424604975,GB -1424604976,1424604991,NL -1424604992,1424607743,GB -1424607744,1424607775,DE -1424607776,1424608083,GB -1424608084,1424608087,FR -1424608088,1424608579,GB -1424608580,1424608580,ES -1424608581,1424608671,GB -1424608672,1424608687,ES -1424608688,1424608743,GB -1424608744,1424608751,ES -1424608752,1424609543,GB -1424609544,1424609551,CH -1424609552,1424610643,GB -1424610644,1424610644,PL -1424610645,1424610992,GB -1424610993,1424610993,FR -1424610994,1424611002,GB -1424611003,1424611003,FR -1424611004,1424611005,GB -1424611006,1424611006,FR -1424611007,1424611295,GB -1424611296,1424611311,BE -1424611312,1424613855,GB -1424613856,1424613859,IT -1424613860,1424616319,GB -1424616320,1424616351,IT -1424616352,1424618464,GB -1424618465,1424618465,NL -1424618466,1424618479,GB -1424618480,1424618495,NL -1424618496,1424619343,GB -1424619344,1424619351,IT -1424619352,1424619855,GB -1424619856,1424619863,BE -1424619864,1424621567,GB -1424621568,1424625663,PL -1424625664,1424629759,US -1424629760,1424633855,PL -1424633856,1424637951,MD -1424637952,1424642047,FI -1424642048,1424646143,DK -1424646144,1424647167,UA -1424647168,1424648191,IT -1424648192,1424650239,UA -1424650240,1424654335,PL -1424654336,1424687103,NO -1424687104,1424711679,SA -1424711680,1424713727,BH -1424713728,1424719871,SA -1424719872,1424752639,DE -1424752640,1424785407,HU -1424785408,1424818175,ES -1424818176,1424850943,RU -1424850944,1424883711,LV -1424883712,1424916479,DK -1424916480,1424917503,BG -1424917504,1424918015,IE -1424918016,1424924671,BG -1424924672,1424925183,BE -1424925184,1424925695,RU -1424925696,1424928767,BG -1424928768,1424929279,AT -1424929280,1424949247,BG -1424949248,1424965631,RO -1424965632,1424982015,FR -1424982016,1425014783,FI -1425014784,1425015295,LT -1425015296,1425015551,RU -1425015552,1425031167,LT -1425031168,1425047551,FI -1425047552,1425063935,IT -1425063936,1425080319,KZ -1425080320,1425096703,IR -1425096704,1425113087,CH -1425113088,1425145855,NL -1425145856,1425162239,RU -1425162240,1425178623,CZ -1425178624,1425195007,BG -1425195008,1425211391,RU -1425211392,1425227775,SE -1425227776,1425244159,RO -1425244160,1425260543,NO -1425260544,1425276927,NL -1425276928,1425293311,RU -1425293312,1425309695,CZ -1425309696,1425326079,NL -1425326080,1425342463,SE -1425342464,1425358847,NL -1425358848,1425375231,SK -1425375232,1425391615,DE -1425391616,1425407999,LV -1425408000,1425424383,NL -1425424384,1425426431,DE -1425426432,1425428479,KW -1425428480,1425430527,GB -1425430528,1425432575,SE -1425432576,1425434623,HR -1425434624,1425436671,FR -1425436672,1425438463,GB -1425438464,1425438719,IN -1425438720,1425440767,DE -1425440768,1425442815,SE -1425442816,1425444863,GB -1425444864,1425446911,IT -1425446912,1425448959,GB -1425448960,1425451007,CZ -1425451008,1425459199,GB -1425459200,1425461247,IM -1425461248,1425463295,ES -1425463296,1425467135,FR -1425467136,1425467391,ES -1425467392,1425469439,CH -1425469440,1425471487,DK -1425471488,1425473535,DE -1425473536,1425474559,RO -1425474560,1425475583,US -1425475584,1425478143,RO -1425478144,1425478655,ES -1425478656,1425478911,GB -1425478912,1425479679,RO -1425479680,1425479935,ES -1425479936,1425480191,NL -1425480192,1425480447,FR -1425480448,1425480703,IE -1425480704,1425481727,RO -1425481728,1425482751,US -1425482752,1425483775,RO -1425483776,1425484799,US -1425484800,1425485311,MD -1425485312,1425485823,BG -1425485824,1425486847,RO -1425486848,1425487103,FR -1425487104,1425487359,IE -1425487360,1425488639,RO -1425488640,1425488895,US -1425488896,1425489407,RO -1425489408,1425489663,NL -1425489664,1425506303,RO -1425506304,1425509887,NO -1425509888,1425510143,SE -1425510144,1425522687,NO -1425522688,1425539071,IT -1425539072,1425801215,FI -1425801216,1425817599,BG -1425833984,1425850367,RU -1425850368,1425866751,GB -1425866752,1425883135,CH -1425883136,1425899519,RU -1425899520,1425915903,IT -1425915904,1425932287,FI -1425932288,1425948671,GR -1425948672,1425952767,DE -1425952768,1425960959,CH -1425960960,1425965055,DE -1425967872,1425968127,GB -1425973248,1425975807,GB -1425975808,1425976063,FR -1425976064,1425977343,GB -1425977344,1425980415,FR -1425980416,1425980671,IQ -1425981440,1425997823,RU -1425997824,1426014207,MT -1426014208,1426030591,DK -1426030592,1426046975,BH -1426046976,1426063359,SI -1426063360,1426587647,CH -1426587648,1426604031,SE -1426604032,1426620415,DE -1426636800,1426653183,GB -1426653184,1426669567,RO -1426669568,1426685951,IR -1426685952,1426702335,TJ -1426702336,1426716159,LV -1426716160,1426716415,RU -1426716416,1426718719,LV -1426718720,1426731007,SI -1426731008,1426735103,HR -1426735104,1426743295,BE -1426743296,1426751487,LU -1426751488,1426767871,FR -1426767872,1426784255,DE -1426784256,1426800639,SE -1426800640,1426817023,PL -1426817024,1426833407,BG -1426833408,1426849791,SE -1426849792,1426866175,NL -1426866176,1426882559,GB -1426882560,1426898943,FR -1426898944,1426915327,RU -1426915328,1426931711,AT -1426931712,1426948095,CZ -1426948096,1426964479,DE -1426964480,1426980863,GB -1426980864,1426997247,BG -1426997248,1427013631,PL -1427013632,1427030015,FR -1427030016,1427033247,DE -1427033248,1427033263,TW -1427033264,1427046399,DE -1427046400,1427062783,IR -1427062784,1427095551,RU -1427095552,1427111935,LV -1427111936,1427177471,DE -1427177472,1427243007,NL -1427243008,1427308543,IT -1427308544,1427374079,NO -1427374080,1427439615,IT -1427439616,1427505151,RU -1427505152,1427570687,DE -1427570688,1427636223,FI -1427636224,1427668991,DK -1427668992,1427701759,SE -1427701760,1427740810,DE -1427740811,1427740811,FR -1427740812,1427741372,DE -1427741373,1427741373,AT -1427741374,1427767295,DE -1427767296,1427800063,BE -1427800064,1427832831,RU -1427832832,1427865599,BE -1427865600,1427898367,DK -1427898368,1427914751,RU -1427914752,1427930965,BE -1427930966,1427930966,LU -1427930967,1427931135,BE -1427931136,1427947519,PL -1427947520,1427963903,RU -1427963904,1427980287,TR -1427980288,1427996671,FI -1427996672,1428013055,KZ -1428013056,1428029439,EE -1428029440,1428045823,SE -1428045824,1428062207,MK -1428062208,1428078591,SE -1428078592,1428094975,RU -1428094976,1428103167,AT -1428111360,1428119551,GB -1428119552,1428121599,LV -1428121600,1428123647,FR -1428123648,1428127743,RU -1428127744,1428129791,ES -1428129792,1428131839,GB -1428131840,1428133887,FR -1428133888,1428135935,LI -1428135936,1428137983,IT -1428140032,1428142079,RU -1428142080,1428144127,DE -1428144128,1428152319,FR -1428152320,1428160511,PL -1428160512,1428260863,IT -1428260864,1428261119,GB -1428261120,1429209087,IT -1429209088,1430257663,ES -1430257664,1430388735,IL -1430388736,1430519807,HU -1430519808,1430650879,FR -1430650880,1430781951,CZ -1430781952,1431044095,GR -1431044096,1431306239,FI -1431306240,1431568383,DK -1431568384,1431830527,ES -1431830528,1431838719,DE -1431838720,1431846911,BE -1431846912,1431855103,NO -1431855104,1431863295,NL -1431863296,1431871487,PT -1431871488,1431879679,RU -1431879680,1431887871,IT -1431887872,1431896063,GB -1431896064,1431904255,NO -1431904256,1431912447,EE -1431912448,1431920639,SE -1431920640,1431928831,RU -1431928832,1431937023,IT -1431937024,1431945215,PL -1431945216,1431953407,NO -1431953408,1431961599,DK -1431961600,1431969791,CH -1431969792,1431977983,GB -1431977984,1431980719,NL -1431980720,1431980727,SA -1431980728,1431986175,NL -1431986176,1431994367,RU -1431994368,1432002559,AT -1432002560,1432010751,HU -1432010752,1432018943,UA -1432018944,1432024063,GB -1432024064,1432025087,DE -1432025088,1432027135,GB -1432027136,1432035327,IE -1432035328,1432038399,GB -1432038400,1432039423,NL -1432039424,1432043519,GB -1432043520,1432051711,ES -1432051712,1432054015,RU -1432054016,1432054271,RO -1432054272,1432056831,RU -1432056832,1432057343,RO -1432057344,1432059903,RU -1432059904,1432068095,BG -1432068096,1432076287,BE -1432076288,1432084479,RU -1432084480,1432092671,GB -1432092672,1432100863,RU -1432100864,1432109055,CZ -1432109056,1432117247,GB -1432125440,1432130703,NL -1432130704,1432130711,GB -1432130712,1432131583,NL -1432131584,1432133631,US -1432133632,1432150015,GB -1432150016,1432158207,BA -1432158208,1432158463,RO -1432158464,1432158719,DE -1432158720,1432158975,LB -1432158976,1432159487,DE -1432159488,1432159743,AE -1432159744,1432163327,DE -1432163328,1432163583,PL -1432163584,1432166399,DE -1432166400,1432174591,RU -1432174592,1432182783,DE -1432182784,1432190975,CZ -1432190976,1432199167,RU -1432199168,1432207359,CZ -1432207360,1432215551,LU -1432215552,1432223743,NO -1432223744,1432240127,RU -1432240128,1432248319,HR -1432248320,1432256511,ME -1432256512,1432264703,BA -1432264704,1432272895,AD -1432272896,1432273407,IT -1432273408,1432273535,DE -1432273536,1432281087,IT -1432281088,1432289279,LU -1432289280,1432297471,GB -1432297472,1432305663,NO -1432305664,1432313855,BG -1432313856,1432322047,GB -1432322048,1432338431,RU -1432338432,1432346623,FR -1432346624,1433353473,TR -1433353474,1433353474,GE -1433353475,1433403391,TR -1433403392,1433408831,ES -1433408832,1433408895,NL -1433408896,1433409023,ES -1433409024,1433410047,NL -1433410048,1433411071,ES -1433411072,1433411327,TR -1433411328,1433411343,ES -1433411344,1433411375,TR -1433411376,1433411407,US -1433411408,1433411423,TR -1433411424,1433411439,ES -1433411440,1433411455,TR -1433411456,1433411551,ES -1433411552,1433411567,TR -1433411568,1433411583,ES -1433411584,1433419775,RU -1433419776,1433427967,LB -1433427968,1433436159,RU -1433436160,1433444351,NO -1433444352,1433452543,SE -1433452544,1433460735,PL -1433460736,1433468927,DE -1433468928,1433477119,KG -1433477120,1433485311,RU -1433485312,1433493503,GB -1433493504,1433501695,PS -1433501696,1433509887,RU -1433509888,1433518079,NO -1433518080,1433526271,RU -1433526272,1433534463,NL -1433534464,1433542655,RU -1433542656,1433550847,HR -1433550848,1433559039,RU -1433559040,1433567231,PS -1433567232,1433575423,DE -1433575424,1433583615,RU -1433583616,1433591807,UA -1433591808,1433599999,GE -1433600000,1433608191,DE -1433608192,1433608447,TR -1433608448,1433608703,NL -1433608704,1433608959,GB -1433608960,1433609215,PL -1433609216,1433609471,GB -1433609472,1433609727,NO -1433609728,1433610239,GB -1433610240,1433611263,US -1433611264,1433611775,ES -1433611776,1433614335,GB -1433614336,1433614847,DE -1433614848,1433615027,HU -1433615028,1433615028,DE -1433615029,1433615103,HU -1433615104,1433615359,DE -1433615360,1433615871,FR -1433615872,1433616383,GB -1433616384,1433624575,AE -1433624576,1433632767,LV -1433632768,1433637375,GI -1433637376,1433637631,FR -1433637632,1433640959,GI -1433640960,1433649151,RU -1433657344,1433665535,RU -1433665536,1433669375,GB -1433669376,1433669631,IE -1433669632,1433673727,GB -1433673728,1433681919,FR -1433681920,1433690111,IS -1433690112,1433698303,RU -1433698304,1433706495,IT -1433706496,1433714687,GB -1433714688,1433722879,DE -1433722880,1433731071,IT -1433731072,1433739263,PL -1433739264,1433747299,GE -1433747300,1433747300,IL -1433747301,1433747455,GE -1433747456,1433755647,RU -1433755648,1433763839,KZ -1433763840,1433772031,FR -1433772032,1433788415,SE -1433796608,1433804799,GB -1433804800,1433812273,FR -1433812274,1433812274,GB -1433812275,1433812991,FR -1433812992,1433821183,BG -1433821184,1433829375,GE -1433829376,1433831423,CZ -1433831424,1433833471,RU -1433833472,1433835519,IT -1433835520,1433837567,GB -1433837568,1433839615,DE -1433839616,1433841663,GB -1433841664,1433843711,RU -1433843712,1433845759,AT -1433845760,1433847807,BG -1433847808,1433849855,SE -1433849856,1433851903,BE -1433851904,1433853951,CH -1433853952,1433855999,RU -1433856000,1433858047,GB -1433858048,1433860095,ES -1433860096,1433862143,DE -1433862144,1433864191,CH -1433864192,1433866239,HU -1433866240,1433867521,NL -1433867522,1433867522,GB -1433867523,1433868287,NL -1433868288,1433870335,GB -1433870336,1433872383,TR -1433872384,1433874431,IT -1433874432,1433876479,NL -1433876480,1433878527,GB -1433878528,1433880575,TR -1433880576,1433882623,RU -1433882624,1433884671,GB -1433884672,1433886719,CZ -1433886720,1433888767,GB -1433888768,1433890815,NL -1433890816,1433892863,GB -1433892864,1433894911,MT -1433894912,1433896959,SE -1433896960,1433899007,NO -1433899008,1433901055,RU -1433901056,1433905151,DE -1433905152,1433907199,FR -1433907200,1433909247,IT -1433909248,1433911295,BE -1433911296,1433913343,ES -1433913344,1433917439,DE -1433917440,1433919487,BE -1433919488,1433921535,GB -1433921536,1433923583,CH -1433923584,1433925631,BE -1433925632,1433927679,GB -1433927680,1433971711,RO -1433971712,1433972223,LU -1433972224,1434189823,RO -1434189824,1434451967,AT -1434451968,1434517503,PL -1434517504,1434550271,DK -1434550272,1434583039,SA -1434583040,1434615807,BG -1434615808,1434648575,IL -1434648576,1434681343,FI -1434681344,1434714111,DE -1434714112,1434746879,AZ -1434746880,1434779647,CZ -1434779648,1434812415,GB -1434812416,1434845183,IR -1434845184,1434877951,FI -1434877952,1434910719,IE -1434910720,1434943487,CZ -1434943488,1434976255,SK -1434976256,1435107327,ES -1435107328,1435238399,PT -1435238400,1435500543,RU -1435500544,1436024831,NL -1436024832,1436090367,ES -1436090368,1436155903,TR -1436155904,1436221439,OM -1436221440,1436286975,ES -1436286976,1436418047,FI -1436418048,1436420095,DE -1436422144,1436424191,FR -1436424192,1436426239,CH -1436426240,1436428287,BA -1436428288,1436430335,GB -1436430336,1436432383,RU -1436432384,1436436479,GB -1436436480,1436438527,LV -1436438528,1436440575,IT -1436440576,1436442623,RU -1436442624,1436444671,TR -1436444672,1436446719,BE -1436446720,1436450815,FR -1436450816,1436452863,BH -1436452864,1436453375,GB -1436453376,1436453391,DE -1436453392,1436453399,GB -1436453400,1436453631,DE -1436453632,1436454911,GB -1436454912,1436456959,AZ -1436456960,1436459007,GB -1436459008,1436461055,NL -1436461056,1436463103,ES -1436463104,1436464383,DE -1436464384,1436464639,AT -1436464640,1436465151,DE -1436465152,1436467199,RU -1436467200,1436469247,DE -1436469248,1436471295,NL -1436471296,1436473343,BE -1436473344,1436475391,RO -1436475392,1436477439,AT -1436477440,1436479487,CH -1436479488,1436481535,RU -1436481536,1436483583,NL -1436483584,1436485631,UA -1436485632,1436487679,DE -1436487680,1436489727,IE -1436489728,1436491775,KZ -1436491776,1436495871,RU -1436495872,1436497919,HU -1436497920,1436499967,GB -1436499968,1436504063,TR -1436504064,1436508159,GB -1436508160,1436510207,NL -1436510208,1436512255,SK -1436512256,1436514303,NL -1436514304,1436516351,GI -1436516352,1436520447,GB -1436520448,1436522495,IT -1436522496,1436524543,GB -1436524544,1436526591,IL -1436526592,1436528639,GB -1436528640,1436530687,IT -1436530688,1436532735,GB -1436532736,1436536831,IT -1436536832,1436538879,GB -1436538880,1436540927,JO -1436540928,1436542975,RU -1436542976,1436545023,NL -1436545024,1436547071,DE -1436547072,1436549119,GB -1436549120,1436811263,CZ -1436811264,1437073407,NO -1437073408,1437335551,FR -1437335552,1437597695,RU -1437597696,1438121983,DE -1438121984,1438125055,NL -1438125056,1438125311,ES -1438125312,1438125567,NL -1438125568,1438125823,FR -1438125824,1438126079,IE -1438126080,1438130175,CZ -1438130176,1438138367,PS -1438138368,1438146559,FR -1438146560,1438147583,MT -1438147584,1438147839,SE -1438147840,1438148095,BE -1438148096,1438148351,GB -1438148352,1438154751,MT -1438154752,1438171135,DK -1438171136,1438173183,GB -1438173184,1438179327,IM -1438179328,1438180351,ES -1438180352,1438181375,NL -1438181376,1438183423,SA -1438183424,1438184447,PS -1438184448,1438185471,CH -1438185472,1438186495,DE -1438186496,1438187519,CH -1438187520,1438253055,IR -1438253056,1438318591,RO -1438318592,1438320127,BG -1438320128,1438320383,NL -1438320384,1438351359,BG -1438351360,1438359551,US -1438359552,1438384127,BG -1438384128,1438400511,FI -1438400512,1438433279,SE -1438433280,1438515199,GB -1438515200,1438531583,DE -1438531584,1438539775,FR -1438539776,1438547967,NL -1438547968,1438553343,DE -1438553344,1438553599,GB -1438553600,1438553855,DE -1438553856,1438554111,BR -1438554112,1438554623,US -1438554624,1438555135,DE -1438555136,1438556159,US -1438556160,1438560255,DE -1438560256,1438562303,US -1438562304,1438572543,DE -1438572544,1438572671,RU -1438572672,1438572799,TR -1438572800,1438572863,BE -1438572864,1438572927,NL -1438572928,1438573055,LU -1438573056,1438573119,TW -1438573120,1438573183,KR -1438573184,1438573247,SG -1438573248,1438573311,JP -1438573312,1438573375,CA -1438573376,1438573439,KR -1438573440,1438573503,PT -1438573504,1438573567,DK -1438573568,1438573823,US -1438573824,1438574079,DE -1438574080,1438574335,GB -1438574336,1438574591,US -1438574592,1438578687,PL -1438578688,1438579967,DE -1438579968,1438580095,NZ -1438580096,1438580223,AU -1438580224,1438580479,US -1438580480,1438580735,DE -1438580736,1438646271,DK -1438646272,1438662655,RU -1438662656,1438679039,ES -1438679040,1438695423,RU -1438695424,1438711807,FR -1438711808,1438728191,CZ -1438728192,1438744575,RU -1438744576,1438748671,AT -1438748672,1438752767,GB -1438752768,1438760959,AT -1438760960,1438777343,PL -1438777344,1438793727,SE -1438793728,1438810111,SA -1438810112,1438826495,SE -1438826496,1438827519,FI -1438827520,1438828543,IQ -1438828544,1438829567,EE -1438829568,1438836991,FI -1438836992,1438837247,DK -1438837248,1438838783,FI -1438838784,1438840831,PL -1438840832,1438841855,IQ -1438841856,1438842367,DE -1438842368,1438842879,DK -1438842880,1438859263,SE -1438859264,1438875647,DE -1438875648,1438876927,LT -1438876928,1438877183,IQ -1438877184,1438877951,LT -1438877952,1438878207,LB -1438878208,1438891007,LT -1438891008,1438892031,RU -1438892032,1438908415,CH -1438908416,1438924799,GR -1438924800,1438941183,NO -1438941184,1438957567,BG -1438957568,1438973951,EE -1438973952,1439000575,DE -1439000576,1439000831,NL -1439000832,1439002367,DE -1439002368,1439002623,NL -1439002624,1439006719,DE -1439006720,1439023103,SE -1439023104,1439039487,IS -1439039488,1439055871,IR -1439055872,1439072255,RU -1439072256,1439088639,UA -1439088640,1439105023,PL -1439105024,1439121407,AT -1439121408,1439154175,DE -1439154176,1439170559,GB -1439170560,1439236095,NO -1439236096,1439301631,BE -1439301632,1439305727,RU -1439305728,1439309823,DK -1439309824,1439318015,PL -1439318016,1439322111,DK -1439326208,1439330303,PL -1439330304,1439334399,RS -1439334400,1439338495,RU -1439338496,1439342591,PL -1439346688,1439350783,RU -1439354880,1439358975,PL -1439358976,1439367167,RU -1439367168,1439369215,NL -1439369216,1439369471,AE -1439369472,1439369727,ES -1439369728,1439370495,NL -1439370496,1439370751,FR -1439370752,1439371007,NL -1439371008,1439371263,DE -1439371264,1439371519,CZ -1439371520,1439371775,FR -1439371776,1439372031,SE -1439372032,1439372287,TR -1439372288,1439372543,IT -1439372544,1439372799,JP -1439372800,1439372815,MT -1439372816,1439372831,AD -1439372832,1439372847,CY -1439372848,1439372863,AM -1439372864,1439372879,BY -1439372880,1439372895,IM -1439372896,1439372911,BA -1439372912,1439372959,IM -1439372960,1439372975,JE -1439372976,1439372991,LI -1439372992,1439373007,MK -1439373008,1439373023,MC -1439373024,1439373039,ME -1439373040,1439373040,SC -1439373041,1439373055,IM -1439373056,1439373311,US -1439373312,1439373567,AE -1439373568,1439373823,KW -1439373824,1439374079,OM -1439374080,1439374335,MX -1439374336,1439375359,IT -1439375360,1439375615,MX -1439375616,1439375871,KW -1439375872,1439376127,OM -1439376128,1439376383,SA -1439376384,1439376639,US -1439376640,1439376895,NL -1439376896,1439377407,CN -1439377408,1439378431,IT -1439378432,1439378687,NL -1439378688,1439378943,CA -1439378944,1439379199,GB -1439379200,1439379455,HK -1439379456,1439380479,US -1439380480,1439380991,IN -1439380992,1439381503,US -1439381504,1439382527,MX -1439382528,1439383551,US -1439383552,1439399935,FR -1439399936,1439432703,DK -1439432704,1439437823,RO -1439437824,1439438335,FR -1439438336,1439438847,RO -1439438848,1439439359,FR -1439439360,1439439615,RO -1439439616,1439439871,PL -1439439872,1439440383,RO -1439440384,1439440895,IR -1439440896,1439441919,RO -1439441920,1439442943,ES -1439442944,1439446527,RO -1439446528,1439447039,DE -1439447040,1439449087,RO -1439449088,1439450111,GR -1439450112,1439450879,RO -1439450880,1439451135,IT -1439451136,1439451647,RO -1439451648,1439451903,LT -1439451904,1439452159,RO -1439452160,1439452671,IR -1439452672,1439453183,RO -1439453184,1439457279,IR -1439457280,1439457791,DE -1439457792,1439459327,RO -1439459328,1439459839,IR -1439459840,1439460607,RO -1439460608,1439460863,MD -1439460864,1439461375,RO -1439461376,1439462399,IT -1439462400,1439462655,RO -1439462656,1439462911,NL -1439462912,1439463167,RO -1439463168,1439463423,IT -1439463424,1439463935,DK -1439463936,1439465471,RO -1439465472,1439466495,IR -1439466496,1439467007,DK -1439467008,1439467263,RO -1439467264,1439467519,FR -1439467520,1439468031,DK -1439468032,1439468543,RO -1439468544,1439469567,ES -1439469568,1439469823,DE -1439469824,1439470335,RO -1439470336,1439470591,IT -1439470592,1439471615,US -1439471616,1439473663,ES -1439473664,1439474687,US -1439474688,1439475711,RO -1439475712,1439475967,IN -1439475968,1439476735,RO -1439476736,1439477759,IN -1439477760,1439479807,MD -1439479808,1439482367,RO -1439482368,1439482879,DK -1439482880,1439483903,RO -1439483904,1439485951,ES -1439485952,1439490047,IR -1439490048,1439495423,RO -1439495424,1439495679,GB -1439495680,1439496959,RO -1439496960,1439497215,GB -1439497216,1439498239,RO -1439498240,1439513599,DE -1439513600,1439514623,GB -1439514624,1439516671,IT -1439516672,1439518207,DE -1439518208,1439518719,IT -1439518720,1439527935,DE -1439527936,1439528959,GB -1439528960,1439529599,DE -1439529600,1439529983,GB -1439529984,1439530239,EG -1439530240,1439534079,DE -1439534080,1439535103,GB -1439535104,1439536127,IT -1439536128,1439537151,DE -1439537152,1439538175,IT -1439538176,1439538687,GB -1439538688,1439539199,IT -1439539200,1439549439,DE -1439549440,1439551487,IT -1439551488,1439556095,DE -1439556096,1439556607,IT -1439556608,1439558143,DE -1439558144,1439558911,IT -1439558912,1439560191,DE -1439560192,1439560447,IT -1439560448,1439560703,DE -1439560704,1439561215,IT -1439561216,1439561727,DE -1439561728,1439562239,GB -1439562240,1439562751,IE -1439562752,1439563007,DE -1439563008,1439563263,GB -1439563264,1439563775,DE -1439563776,1439629311,LT -1439629312,1439694847,CZ -1439825920,1439956991,GB -1439956992,1440251903,DE -1440251904,1440284671,SK -1440284672,1440317439,FI -1440317440,1440322559,BG -1440322560,1440322815,DE -1440322816,1440325631,BG -1440325632,1440326655,DE -1440326656,1440328703,BG -1440328704,1440329727,DE -1440329728,1440331775,BG -1440331776,1440333823,DE -1440333824,1440350207,BG -1440350208,1440382975,CH -1440382976,1440415743,DK -1440415744,1440448511,ES -1440448512,1440481279,PL -1440481280,1440514047,IS -1440514048,1440546815,DE -1440546816,1440579583,NO -1440579584,1440645119,PL -1440645120,1440653311,GB -1440653312,1440661503,RS -1440661504,1440663551,NL -1440663552,1440665599,FR -1440665600,1440669695,DE -1440669696,1440671743,NL -1440671744,1440672767,EE -1440672768,1440710655,NL -1440710656,1440743423,UA -1440743424,1441267711,SE -1441267712,1441275903,DE -1441275904,1441284095,GB -1441284096,1441292287,AT -1441292288,1441300479,RU -1441300480,1441308671,LT -1441308672,1441316863,HR -1441316864,1441325055,MT -1441325056,1441333247,PL -1441333248,1441349631,DE -1441349632,1441357823,RU -1441357824,1441366015,AT -1441366016,1441374207,RU -1441374208,1441382399,GB -1441382400,1441390591,FR -1441390592,1441398783,DK -1441398784,1441403903,RU -1441403904,1441404159,US -1441404160,1441415167,RU -1441415168,1441423359,GB -1441423360,1441431551,RU -1441431552,1441439743,GB -1441439744,1441447935,LV -1441447936,1441456127,BE -1441456128,1441460735,NL -1441460736,1441462271,EE -1441462272,1441464319,PL -1441464320,1441472511,SE -1441472512,1441480703,RU -1441488896,1441497087,GB -1441497088,1441505279,IT -1441505280,1441521663,RU -1441521664,1441529855,DK -1441529856,1441538047,RU -1441538048,1441546239,DE -1441546240,1441554431,DK -1441554432,1441556479,GB -1441556480,1441556991,DE -1441556992,1441557503,SE -1441557504,1441558015,NL -1441558016,1441564671,GB -1441564672,1441566719,NL -1441566720,1441568767,GB -1441568768,1441570815,FR -1441570816,1441579007,RU -1441579008,1441587199,DE -1441587200,1441603583,AT -1441603584,1441611775,RU -1441611776,1441619967,DE -1441619968,1441628159,FR -1441628160,1441636351,SA -1441636352,1441644543,PL -1441644544,1441651455,GB -1441651456,1441651711,CA -1441651712,1441652735,GB -1441652736,1441660927,SK -1441660928,1441669119,ES -1441669120,1441677311,GE -1441677312,1441685503,HU -1441685504,1441693695,UA -1441693696,1441694719,BR -1441694720,1441696767,DE -1441696768,1441697791,SG -1441697792,1441698815,US -1441698816,1441701887,DE -1441701888,1441710079,AT -1441710080,1441718271,SE -1441718272,1441726463,DE -1441726464,1441734655,KW -1441734656,1441742847,RU -1441742848,1441751039,CZ -1441751040,1441759231,DE -1441759232,1441767423,BG -1441767424,1441775615,IT -1441775616,1441783807,IR -1441783808,1441791999,CZ -1441792000,1442316287,PT -1442316288,1442381823,SK -1442381824,1442447359,RU -1442447360,1442512895,IL -1442512896,1442578431,ES -1442578432,1442643967,NO -1442643968,1442709503,EE -1442709504,1442775039,LV -1442775040,1442779135,CZ -1442779136,1442783231,DE -1442783232,1442787327,NO -1442787328,1442791423,LT -1442791424,1442795519,LV -1442799616,1442803711,LT -1442803712,1442807807,RO -1442807808,1442811903,BG -1442811904,1442815999,AT -1442816000,1442820095,BG -1442820096,1442822143,UA -1442822144,1442824191,RU -1442824192,1442828287,BE -1442828288,1442832383,NL -1442832384,1442836479,GB -1442836480,1442840575,PL -1442840576,1444937727,GB -1444937728,1445068799,AT -1445068800,1445199871,RO -1445199872,1445330943,QA -1445330944,1445396479,LT -1445396480,1445462015,BE -1445462016,1445986303,IE -1445986304,1446051839,DK -1446051840,1446117375,CZ -1446117376,1446182911,FI -1446182912,1446248447,SA -1446248448,1446313983,DK -1446313984,1446445055,GB -1446445056,1446510591,IR -1446510592,1446543359,DE -1446543360,1446576127,AT -1446576128,1446608895,IR -1446608896,1446641663,BY -1446641664,1446674431,SI -1446674432,1446704127,DK -1446704128,1446705151,ES -1446705152,1446707199,DK -1446707200,1446739967,AT -1446739968,1446772735,HU -1446772736,1446805503,SA -1446805504,1446838271,FI -1446838272,1446871039,SI -1446871040,1446903807,CZ -1446906880,1446907135,IQ -1446910720,1446911231,IQ -1446920192,1446936575,RU -1446936576,1446952959,NO -1446952960,1446969343,QA -1446969344,1446985727,GB -1446985728,1447010303,PL -1447010304,1447018495,LV -1447018496,1447026687,CZ -1447026688,1448083455,FR -1448083456,1449132031,NL -1449132032,1449394175,AE -1449394176,1449459711,LT -1449459712,1449525247,HU -1449525248,1449590783,RU -1449590784,1449656319,DE -1449656320,1449657087,GB -1449657088,1449659903,RO -1449659904,1449660159,NL -1449660160,1449660415,BG -1449660416,1449661439,RO -1449661440,1449662463,US -1449662464,1449663487,ES -1449663488,1449663999,GB -1449664000,1449664511,RO -1449664512,1449668607,IR -1449668608,1449672703,SE -1449672704,1449673727,RO -1449673728,1449674751,GR -1449674752,1449675775,RO -1449675776,1449676799,US -1449676800,1449684991,IR -1449684992,1449687039,ES -1449687040,1449688063,GR -1449688064,1449688575,RO -1449688576,1449688831,GB -1449688832,1449690623,RO -1449690624,1449690879,IE -1449690880,1449695231,RO -1449695232,1449697279,SE -1449697280,1449699327,PS -1449699328,1449701375,ES -1449701376,1449702655,RO -1449702656,1449702911,GB -1449702912,1449706495,RO -1449706496,1449707519,MD -1449707520,1449709567,SE -1449709568,1449709823,GB -1449709824,1449710079,US -1449710080,1449710591,RO -1449710592,1449711103,GB -1449711104,1449713151,RO -1449713152,1449714175,GB -1449714176,1449715711,RO -1449715712,1449719807,IR -1449719808,1449720831,US -1449720832,1449721343,FR -1449721344,1449722111,RO -1449722112,1449722367,IT -1449722368,1449722623,GB -1449722624,1449723135,RO -1449723136,1449723391,DE -1449723392,1449723903,GB -1449723904,1449724159,IT -1449724160,1449724415,RO -1449724416,1449724927,RU -1449724928,1449725439,GB -1449725440,1449726463,RO -1449726464,1449726719,NL -1449726720,1449726975,RO -1449726976,1449727999,NO -1449728000,1449728255,MD -1449728256,1449729023,RO -1449729024,1449730047,ES -1449730048,1449732095,RO -1449732096,1449734143,IR -1449734144,1449736191,DE -1449736192,1449738239,MD -1449738240,1449742335,RO -1449742336,1449744383,MD -1449744384,1449748479,RO -1449748480,1449749503,US -1449749504,1449750527,RO -1449750528,1449752575,SE -1449752576,1449754623,RO -1449754624,1449758719,IR -1449758720,1449759743,RO -1449759744,1449759999,NL -1449760000,1449760255,ES -1449760256,1449760511,IE -1449760512,1449761791,RO -1449761792,1449762815,ES -1449762816,1449763839,AU -1449763840,1449764863,RO -1449764864,1449765119,FR -1449765120,1449765887,RO -1449765888,1449766911,MD -1449766912,1449767167,GB -1449767168,1449767423,IT -1449767424,1449767679,GB -1449767680,1449767935,IT -1449767936,1449768959,RO -1449768960,1449769471,GB -1449769472,1449769983,RO -1449769984,1449771007,GR -1449771008,1449772031,RO -1449772032,1449772287,GB -1449772288,1449773055,RO -1449773056,1449774079,GR -1449774080,1449775103,RO -1449775104,1449776127,MD -1449776128,1449776639,FR -1449776640,1449778431,RO -1449778432,1449778687,NL -1449778688,1449779455,RO -1449779456,1449779711,GB -1449779712,1449779967,RO -1449779968,1449780223,RU -1449780224,1449780479,RO -1449780480,1449780991,GB -1449780992,1449781247,RO -1449781248,1449781503,MD -1449781504,1449782015,RO -1449782016,1449782271,GB -1449782272,1449783295,IT -1449783296,1449783551,DE -1449783552,1449783807,RO -1449783808,1449784319,GB -1449784320,1449785343,RO -1449785344,1449786367,GR -1449786368,1449786879,RO -1449786880,1449787391,FR -1449787392,1449789439,ES -1449789440,1449790207,GB -1449790208,1449790719,RO -1449790720,1449791487,GB -1449791488,1449791743,ES -1449791744,1449793279,RO -1449793280,1449793535,NL -1449793536,1449794047,IR -1449794048,1449794303,PH -1449794304,1449803775,RO -1449803776,1449805823,ES -1449805824,1449806591,RO -1449806592,1449807103,IE -1449807104,1449808639,RO -1449808640,1449808895,UA -1449808896,1449810687,RO -1449810688,1449810943,PL -1449810944,1449811199,FR -1449811200,1449811455,BG -1449811456,1449811967,GB -1449811968,1449812223,DK -1449812224,1449812991,RO -1449812992,1449813503,GB -1449813504,1449813759,RU -1449813760,1449814271,RO -1449814272,1449815039,GB -1449815040,1449815295,RO -1449815296,1449816063,GB -1449816064,1449816575,RO -1449816576,1449817855,GB -1449817856,1449818111,RO -1449818112,1449818367,DE -1449818368,1449818623,RO -1449818624,1449819135,TR -1449819136,1449820927,RO -1449820928,1449821183,DE -1449821184,1449822719,RO -1449822720,1449823743,GB -1449823744,1449823999,BG -1449824000,1449824255,RO -1449824256,1449826303,MD -1449826304,1449827327,US -1449827328,1449828351,RO -1449828352,1449830399,SE -1449830400,1449831935,RO -1449831936,1449832447,GB -1449832448,1449834495,RO -1449834496,1449835519,ES -1449835520,1449836543,RO -1449836544,1449838591,IR -1449838592,1449840639,RO -1449840640,1449852927,MD -1449852928,1449857023,IR -1449857024,1449858047,SY -1449858048,1449859583,RO -1449859584,1449860607,GB -1449860608,1449863679,RO -1449863680,1449863935,GB -1449863936,1449865215,RO -1449865216,1449865727,SE -1449865728,1449869311,RO -1449869312,1449870335,MD -1449870336,1449870847,RO -1449870848,1449871615,GB -1449871616,1449871871,RO -1449871872,1449872383,GB -1449872384,1449873407,RO -1449873408,1449877503,IR -1449877504,1449878527,IT -1449878528,1449879039,RO -1449879040,1449879167,PH -1449879168,1449879295,TH -1449879296,1449880319,RO -1449880320,1449880575,ES -1449880576,1449881087,US -1449881088,1449883647,RO -1449883648,1449885695,BE -1449885696,1449886463,KZ -1449886464,1449886719,RO -1449886720,1449889791,KZ -1449889792,1449893887,IR -1449893888,1449895935,MD -1449895936,1449896447,RO -1449896448,1449896959,GB -1449896960,1449897983,IR -1449897984,1449900543,RO -1449900544,1449901055,MD -1449901056,1449901311,RO -1449901312,1449901823,FR -1449901824,1449902079,DE -1449902080,1449902335,RO -1449902336,1449903103,GB -1449903104,1449903359,ES -1449903360,1449904127,RO -1449904128,1449906175,NL -1449906176,1449910271,IR -1449910272,1449914879,RO -1449914880,1449915135,DE -1449915136,1449915391,SE -1449915392,1449918463,RO -1449918464,1449951231,JO -1449951232,1449983999,TR -1449984000,1449992191,NL -1449992192,1450000383,IR -1450000384,1450008575,HU -1450008576,1450016767,ES -1450016768,1450024959,IT -1450024960,1450033151,ES -1450033152,1450041343,RU -1450041344,1450049535,DE -1450049536,1450057727,RU -1450057728,1450065919,EE -1450065920,1450067135,DE -1450067136,1450067199,AT -1450067200,1450074111,DE -1450074112,1450082303,RU -1450082304,1450090495,IT -1450090496,1450106879,RU -1450106880,1450115071,SK -1450115072,1450123263,RU -1450123264,1450131455,AT -1450131456,1450139647,UA -1450139648,1450147839,PL -1450147840,1450151935,CH -1450151936,1450153983,IQ -1450153984,1450156031,DE -1450156032,1450164199,GB -1450164200,1450164200,US -1450164201,1450164221,GB -1450164222,1450164222,US -1450164223,1450164223,GB -1450164224,1450166271,SA -1450166272,1450168319,PL -1450170368,1450172415,GB -1450172416,1450174463,UA -1450174464,1450176511,DE -1450176512,1450178559,PL -1450178560,1450180607,DE -1450180608,1450311679,GB -1450311680,1450442751,FI -1450442752,1450704895,CH -1450704896,1451229183,RO -1451229184,1451415166,GB -1451415167,1451415167,US -1451415168,1455423487,GB -1455423488,1459617791,FR -1459617792,1461714943,IT -1461714944,1462763519,IE -1462763520,1463812095,DK -1463812096,1464074239,BE -1464074240,1464336383,IL -1464336384,1464467455,DK -1464467456,1464598527,GB -1464598528,1464602623,RU -1464602624,1464606719,GB -1464606720,1464614911,KZ -1464614912,1464664063,UA -1464664064,1464860671,DE -1464860672,1465384959,GB -1465384960,1465647103,FR -1465647104,1465909247,FI -1465909248,1465942015,PL -1465942016,1465974783,SE -1465974784,1466007551,HU -1466007552,1466040319,BG -1466040320,1466073087,EE -1466073088,1466086016,FR -1466086017,1466086017,ES -1466086018,1466097919,FR -1466097920,1466099711,ES -1466099712,1466101759,PL -1466101760,1466101951,FR -1466101952,1466102015,DE -1466102016,1466102271,FR -1466102272,1466102527,DE -1466102528,1466102783,FR -1466102784,1466103807,DE -1466103808,1466104575,GB -1466104576,1466104942,FR -1466104943,1466104943,BE -1466104944,1466105173,FR -1466105174,1466105174,BE -1466105175,1466105343,FR -1466105344,1466105855,GB -1466105856,1466122239,PL -1466122240,1466130431,LV -1466130432,1466138623,PL -1466138624,1466171391,SE -1466171392,1466204159,FR -1466204160,1466236927,FI -1466236928,1466241023,NL -1466241024,1466249215,PL -1466249216,1466253311,GR -1466253312,1466257407,PL -1466261504,1466265599,GB -1466265600,1466269695,HU -1466269696,1466302463,SA -1466302464,1466335231,GB -1466335232,1466367999,CH -1466368000,1466400767,PT -1466400768,1466433535,RU -1466433536,1466499071,DK -1466499072,1466564607,PL -1466564608,1466571894,DE -1466571895,1466571895,AE -1466571896,1466588785,DE -1466588786,1466588786,FR -1466588787,1466589183,DE -1466589184,1466590207,FR -1466590208,1466591999,GB -1466592000,1466613759,DE -1466613760,1466615807,ES -1466615808,1466616575,GB -1466616576,1466630143,DE -1466630144,1466695679,IR -1466695680,1466761215,FI -1466761216,1466826751,SA -1466826752,1466886399,LV -1466886400,1466886655,LT -1466886656,1466892287,LV -1466892288,1466957823,ES -1466957824,1467219967,GB -1467219968,1467236351,DK -1467236352,1467252735,BG -1467252736,1467269119,RS -1467269120,1467285503,PL -1467285504,1467301887,RU -1467301888,1467303423,GB -1467303424,1467303935,CH -1467303936,1467310079,GB -1467310080,1467314175,ES -1467314176,1467316223,GB -1467316224,1467318271,CH -1467318272,1467334655,RU -1467334656,1467351039,GB -1467351040,1467367423,NO -1467367424,1467383807,DE -1467383808,1467400191,BG -1467400192,1467416575,RU -1467416576,1467432959,PL -1467432960,1467449343,BG -1467449344,1467457535,SI -1467457536,1467465727,EE -1467465728,1467466751,NL -1467466752,1467472895,DE -1467472896,1467473919,NL -1467473920,1467482111,RU -1467482112,1467484927,BG -1467484928,1467485183,IL -1467485184,1467502591,BG -1467502592,1467503615,DE -1467503616,1467525119,BG -1467525120,1467527167,DE -1467527168,1467535359,BG -1467535360,1467537407,DE -1467537408,1467543551,BG -1467543552,1467544575,DE -1467544576,1467545599,BG -1467545600,1467546623,DE -1467546624,1467566079,BG -1467566080,1467567103,DE -1467567104,1467571199,BG -1467571200,1467572223,DE -1467572224,1467579903,BG -1467579904,1467580415,IL -1467580416,1467582463,BG -1467582464,1467584511,DE -1467584512,1467593727,BG -1467593728,1467597823,DE -1467597824,1467604991,BG -1467604992,1467611135,DE -1467611136,1467613183,BG -1467613184,1467744255,DE -1467744256,1467777023,GB -1467777024,1467875327,ES -1467875328,1467940863,BG -1467940864,1468006399,GB -1468006400,1472200703,DE -1472200704,1472259071,IE -1472259072,1472259327,GB -1472259328,1472266239,IE -1472266240,1472331775,DE -1472331776,1472397311,GB -1472397312,1472462847,NL -1472462848,1472528383,PT -1472528384,1472593919,SK -1472593920,1472659455,IE -1472659456,1472724991,PL -1472724992,1472856063,AE -1472856064,1472987135,GR -1472987136,1473249279,PL -1473249280,1473773567,NL -1473773568,1474297855,ES -1474297856,1474330623,GB -1474330624,1474396159,RU -1474396160,1474428927,DE -1474428928,1474461695,LV -1474461696,1474494463,RU -1474494464,1474527231,SE -1474527232,1474559999,BG -1474560000,1474592767,RU -1474592768,1474625535,CY -1474625536,1474658303,HU -1474658304,1474691071,RU -1474691072,1474723839,DE -1474723840,1474756607,SA -1474756608,1474822143,FR -1474822144,1474887679,IE -1474887680,1474953215,NL -1474953216,1475018751,DE -1475018752,1475084287,ES -1475084288,1475086335,NL -1475086336,1475092479,RU -1475092480,1475094527,CY -1475094528,1475096575,RU -1475096576,1475098623,BH -1475098624,1475102719,GB -1475102720,1475104767,FR -1475104768,1475106815,RU -1475106816,1475108863,SE -1475108864,1475110911,NL -1475110912,1475112959,DE -1475112960,1475115007,AT -1475115008,1475117055,KW -1475117056,1475119103,GB -1475119104,1475121151,BH -1475121152,1475123199,GB -1475123200,1475125247,FI -1475125248,1475127295,IT -1475127296,1475129343,FI -1475129344,1475131391,BE -1475131392,1475133439,RU -1475133440,1475135487,CZ -1475135488,1475137535,CH -1475137536,1475138815,GB -1475138816,1475139327,IR -1475139328,1475139583,LT -1475139584,1475141631,ES -1475141632,1475143679,FI -1475143680,1475145727,JO -1475145728,1475147775,ES -1475147776,1475149823,GB -1475149824,1475151871,NL -1475151872,1475153919,BE -1475153920,1475155967,GB -1475155968,1475158015,NL -1475158016,1475160063,IS -1475160064,1475162111,RU -1475162112,1475170303,GB -1475170304,1475172351,ES -1475172352,1475174399,DE -1475174400,1475175047,NL -1475175048,1475175055,US -1475175056,1475176447,NL -1475176448,1475178495,RO -1475178496,1475180543,RU -1475180544,1475184639,DE -1475184640,1475186687,RU -1475186688,1475188735,GB -1475188736,1475190783,SE -1475192832,1475194879,CH -1475194880,1475196927,DE -1475196928,1475198975,FR -1475198976,1475201023,BH -1475201024,1475203071,RS -1475203072,1475205119,SE -1475205120,1475205887,DE -1475205888,1475206143,US -1475206144,1475207167,DE -1475207168,1475207423,AE -1475207424,1475207679,GR -1475207680,1475209215,AE -1475209216,1475211263,UZ -1475211264,1475213311,DE -1475213312,1475215359,FR -1475215360,1475223551,IT -1475223552,1475233791,NO -1475233792,1475235839,GB -1475235840,1475237887,IE -1475237888,1475239935,ES -1475239936,1475241983,RU -1475241984,1475244031,FR -1475244032,1475245823,DE -1475245824,1475246079,RU -1475246080,1475248127,CH -1475248128,1475250175,JO -1475250176,1475252223,DE -1475252224,1475254271,FR -1475254272,1475256319,UA -1475256320,1475258367,BE -1475258368,1475260415,NL -1475260416,1475262463,FR -1475262464,1475266559,DE -1475266560,1475268607,GB -1475268608,1475269375,XK -1475269376,1475270655,RS -1475270656,1475272703,GB -1475272704,1475274751,BE -1475274752,1475276799,RU -1475276800,1475278847,ES -1475278848,1475280895,DK -1475280896,1475282943,RU -1475282944,1475284991,NL -1475284992,1475287039,GB -1475287040,1475291135,RU -1475291136,1475293183,PL -1475295232,1475297279,SK -1475297280,1475299327,DK -1475299328,1475301375,PL -1475301376,1475303423,LT -1475303424,1475305471,PL -1475305472,1475307519,NL -1475307520,1475309567,RU -1475309568,1475311615,LT -1475311616,1475313663,FI -1475313664,1475315711,DE -1475315712,1475317759,US -1475317760,1475319807,RU -1475319808,1475321855,BG -1475321856,1475323903,RO -1475323904,1475327999,PL -1475328000,1475330047,NL -1475330048,1475332095,PL -1475332096,1475336191,CH -1475336192,1475338239,PL -1475338240,1475340287,RO -1475340288,1475342335,GR -1475342336,1475344383,PL -1475344384,1475344639,GR -1475344640,1475344895,RO -1475344896,1475345151,SE -1475345152,1475345919,NL -1475345920,1475346175,ES -1475346176,1475346431,IL -1475346432,1475362815,RU -1475362816,1475379199,FR -1475379200,1475395583,RU -1475395584,1475411967,LU -1475411968,1475428351,IT -1475428352,1475444735,SE -1475444736,1475461119,AM -1475461120,1475477503,RU -1475477504,1475493887,HU -1475493888,1475510271,RU -1475510272,1475543039,GB -1475543040,1475545087,RO -1475545088,1475559423,KZ -1475559424,1475575807,BG -1475575808,1475592191,AT -1475592192,1475608575,GB -1475608576,1475624959,RU -1475624960,1475634991,JE -1475634992,1475634995,GB -1475634996,1475635043,JE -1475635044,1475635047,GB -1475635048,1475635075,JE -1475635076,1475635079,GB -1475635080,1475635159,JE -1475635160,1475635167,GB -1475635168,1475636287,JE -1475636288,1475636351,GB -1475636352,1475637303,JE -1475637304,1475637311,GB -1475637312,1475637471,JE -1475637472,1475637479,GB -1475637480,1475638783,JE -1475638784,1475639039,GB -1475639040,1475639391,JE -1475639392,1475639399,GB -1475639400,1475639479,JE -1475639480,1475639487,GB -1475639488,1475639559,JE -1475639560,1475639567,GB -1475639568,1475639583,JE -1475639584,1475639591,GB -1475639592,1475639695,JE -1475639696,1475639703,GB -1475639704,1475641343,JE -1475641344,1475657727,UA -1475657728,1475674111,SK -1475674112,1475690495,DE -1475690496,1475706879,CH -1475706880,1475727359,RU -1475727360,1475727391,FI -1475727392,1475727775,GB -1475727776,1475727871,FI -1475727872,1475728639,GB -1475728640,1475728767,PL -1475728768,1475728895,GB -1475728896,1475729151,DE -1475729152,1475729247,AT -1475729248,1475729407,GB -1475729408,1475729535,UA -1475729536,1475729663,GB -1475729664,1475729671,UA -1475729672,1475729791,GB -1475729792,1475729855,UA -1475729856,1475730751,GB -1475730752,1475730815,UA -1475730816,1475731007,GB -1475731008,1475731071,UA -1475731072,1475731135,GB -1475731136,1475731167,UA -1475731168,1475735485,GB -1475735486,1475735486,RU -1475735487,1475738111,GB -1475738112,1475738879,RU -1475738880,1475739647,GB -1475739648,1475749887,BG -1475749888,1475750911,IQ -1475750912,1475756031,BG -1475756032,1475772415,GB -1475772416,1475788799,LV -1475788800,1475805183,PL -1475805184,1475821567,KZ -1475821568,1475837951,LT -1475837952,1475846143,GB -1475846144,1475854335,IR -1475854336,1475862527,AT -1475862528,1475864575,FR -1475864576,1475866623,IT -1475866624,1475868671,GB -1475868672,1475870719,BG -1475870720,1475878911,NO -1475878912,1475887103,IT -1475887104,1475895295,PL -1475895296,1475901439,GB -1475901440,1475903487,CH -1475903488,1475911679,IR -1475911680,1475919871,MD -1475919872,1475928063,IT -1475928064,1475952639,RU -1475952640,1475954175,GB -1475954176,1475954687,NO -1475954688,1475955247,GB -1475955248,1475955255,NG -1475955256,1475958527,GB -1475958528,1475958783,NO -1475958784,1475960831,GB -1475960832,1475969023,NL -1475969024,1475977215,CZ -1475977216,1475985407,SE -1475985408,1476009983,RU -1476009984,1476010047,RS -1476010048,1476010111,XK -1476010112,1476011327,RS -1476011328,1476011775,XK -1476011776,1476012095,RS -1476012096,1476012176,XK -1476012177,1476012177,RS -1476012178,1476012221,XK -1476012222,1476012222,RS -1476012223,1476012238,XK -1476012239,1476012239,RS -1476012240,1476012250,XK -1476012251,1476012251,RS -1476012252,1476012278,XK -1476012279,1476012279,RS -1476012280,1476012287,XK -1476012288,1476014079,RS -1476014080,1476014127,XK -1476014128,1476014135,RS -1476014136,1476014591,XK -1476014592,1476015871,RS -1476015872,1476016127,XK -1476016128,1476018175,RS -1476018176,1476026367,IT -1476026368,1476034559,BA -1476034560,1476042751,NL -1476042752,1476050943,PL -1476050944,1476064255,RU -1476064256,1476064383,DE -1476064384,1476064511,TR -1476064512,1476067327,RU -1476067328,1476075519,TR -1476075520,1476083711,NL -1476083712,1476100095,RU -1476100096,1476108287,IR -1476108288,1476116479,RU -1476116480,1476124671,SE -1476124672,1476132863,PL -1476132864,1476141055,FR -1476141056,1476149247,GB -1476149248,1476157439,NO -1476157440,1476165631,BH -1476165632,1476173823,HR -1476173824,1476182015,BG -1476182016,1476186367,GB -1476186368,1476186383,IE -1476186384,1476189382,GB -1476189383,1476189383,IE -1476189384,1476190207,GB -1476190208,1476198399,BY -1476198400,1476206591,RU -1476206592,1476214783,GE -1476214784,1476222975,SE -1476222976,1476231167,IT -1476231168,1476239359,NL -1476239360,1476247551,DE -1476247552,1476255743,RU -1476255744,1476257791,ES -1476257792,1476259839,FR -1476259840,1476263935,DE -1476263936,1476272127,GB -1476272128,1476280319,NO -1476280320,1476288511,IM -1476288512,1476296703,LU -1476296704,1476304895,RU -1476304896,1476313087,BG -1476313088,1476315135,DE -1476315136,1476316159,US -1476316160,1476317183,FI -1476317184,1476321151,DE -1476321152,1476321279,FI -1476321280,1476329471,MC -1476329472,1476337663,RU -1476337664,1476345855,NL -1476345856,1476354047,MD -1476354048,1476362239,KE -1476362240,1476370431,FR -1476370432,1476378623,SE -1476378624,1476386815,KZ -1476386816,1476395007,RU -1476395008,1478492159,ES -1478492160,1480589311,IT -1480589312,1481637887,DE -1481637888,1481646079,SE -1481646080,1481654271,RU -1481654272,1481662463,IT -1481662464,1481678847,BG -1481678848,1481680663,SE -1481680664,1481680671,GB -1481680672,1481684991,SE -1481684992,1481687039,GB -1481687040,1481695231,DE -1481695232,1481703423,SK -1481703424,1481711615,SA -1481711616,1481719807,RU -1481719808,1481727999,CZ -1481728000,1481736191,IE -1481736192,1481741055,GG -1481741056,1481744127,GB -1481744128,1481744383,GG -1481744384,1481752575,IT -1481752576,1481760767,RU -1481760768,1481768959,UA -1481768960,1481777151,GB -1481777152,1481785343,BE -1481785344,1481793535,RU -1481793536,1481801727,LI -1481801728,1481809919,GB -1481809920,1481818111,RU -1481818112,1481826303,ES -1481826304,1481834495,DE -1481834496,1481842687,GL -1481842688,1481843007,SE -1481843008,1481843039,NO -1481843040,1481844959,SE -1481844960,1481844991,NO -1481844992,1481850879,SE -1481850880,1481859071,DK -1481859072,1481867263,GB -1481867264,1481875455,SE -1481875456,1481883647,CZ -1481883648,1481891839,RU -1481891840,1481900031,CZ -1481900032,1481908223,CH -1481908224,1481916415,NO -1481916416,1481924607,ES -1481924608,1481932799,SA -1481932800,1481936959,GB -1481936960,1481936975,FR -1481936976,1481937183,GB -1481937184,1481937199,NL -1481937200,1481937207,GB -1481937208,1481937215,FR -1481937216,1481940991,GB -1481940992,1481949183,NO -1481949184,1481957375,RU -1481957376,1481965567,SE -1481965568,1481973759,CH -1481973760,1481981951,FO -1481981952,1481990143,NL -1481990144,1481998335,MK -1481998336,1482006527,FI -1482006528,1482022911,RU -1482022912,1482031103,SA -1482031104,1482039295,SY -1482039296,1482047487,SE -1482047488,1482055679,RU -1482055680,1482063871,CZ -1482063872,1482072063,FI -1482072064,1482080255,IT -1482080256,1482088447,RU -1482088448,1482096639,FR -1482096640,1482104831,BG -1482104832,1482113023,NO -1482113024,1482121215,RU -1482121216,1482129407,IT -1482129408,1482137599,ES -1482137600,1482145791,IE -1482145792,1482153983,ES -1482153984,1482162175,HU -1482162176,1482686463,NO -1482686464,1482842111,GB -1482842112,1482850303,ES -1482850304,1482860695,GB -1482860696,1482860703,NL -1482860704,1482883071,GB -1482883072,1482948607,DE -1482948608,1483210751,CZ -1483210752,1483735039,GB -1483735040,1483997183,FI -1483997184,1484128255,AT -1484128256,1484259327,LT -1484259328,1484783615,FR -1484783616,1484849151,DE -1484849152,1484914687,SE -1484914688,1484980223,DE -1484980224,1485045759,SE -1485045760,1485111295,HU -1485111296,1485242367,DE -1485242368,1485246463,RU -1485246464,1485250559,LT -1485250560,1485254655,IR -1485254656,1485259007,RU -1485262848,1485266943,UA -1485266944,1485271039,US -1485271040,1485275135,UA -1485275136,1485283327,LV -1485283328,1485291519,PL -1485291520,1485307903,UA -1485307904,1485832191,FR -1485832192,1485963263,GB -1485963264,1486028799,CZ -1486028800,1486061567,IT -1486061568,1486094335,RU -1486094336,1486127103,ES -1486127104,1486159871,FI -1486159872,1486192639,IS -1486192640,1486225407,IT -1486225408,1486258175,DE -1486258176,1486292991,GB -1486292992,1486295039,RU -1486295040,1486297087,ES -1486297088,1486299135,IE -1486299136,1486301183,NL -1486301184,1486303231,GB -1486303232,1486305279,IS -1486305280,1486307327,HU -1486307328,1486309375,DE -1486309376,1486311423,AT -1486311424,1486313471,IE -1486313472,1486315519,RU -1486315520,1486317567,HU -1486317568,1486321663,RU -1486321664,1486323711,NL -1486323712,1486325759,GB -1486325760,1486327807,PL -1486327808,1486329855,CH -1486329856,1486331903,GB -1486331904,1486333951,NO -1486333952,1486335999,SE -1486336000,1486338047,KZ -1486338048,1486340095,RU -1486340096,1486342143,AZ -1486342144,1486344191,RU -1486344192,1486346239,ES -1486346240,1486348287,GB -1486348288,1486349311,NL -1486349312,1486350335,US -1486350336,1486352383,FR -1486352384,1486354431,BE -1486354432,1486356479,RU -1486356480,1486487551,DE -1486487552,1486618623,UA -1486618624,1486684159,PL -1486684160,1486749695,PT -1486749696,1486815231,RO -1486815232,1486880767,NL -1486880768,1488977919,FR -1488977920,1489240063,FI -1489240064,1489305599,EE -1489305600,1489338367,GR -1489338368,1489371135,BE -1489371136,1489436671,DE -1489436672,1489502207,PL -1489502208,1489534975,SI -1489534976,1489567743,RU -1489567744,1489600511,BH -1489600512,1489633279,RU -1489633280,1489634303,FR -1489634304,1489635327,IT -1489635328,1489639423,FR -1489639680,1489640959,FR -1489641216,1489641471,FR -1489641472,1489641599,PT -1489641600,1489641727,GR -1489641728,1489642495,FR -1489642752,1489644031,FR -1489644288,1489644543,FR -1489644544,1489645055,IT -1489645824,1489646079,IT -1489647616,1489648383,FR -1489648384,1489648639,GR -1489649664,1489650687,ZA -1489651200,1489653247,FR -1489655296,1489655551,GR -1489657856,1489658879,CM -1489658880,1489659647,KE -1489659648,1489661951,FR -1489661952,1489662975,NG -1489662976,1489663487,IT -1489664256,1489664511,GB -1489664512,1489664767,LY -1489664768,1489665023,TN -1489665792,1489674239,GB -1489674240,1489676287,NL -1489676288,1489678591,GB -1489678592,1489678847,NL -1489678848,1489678943,GB -1489678944,1489678959,US -1489678960,1489688575,GB -1489688576,1489688831,IL -1489688832,1489689087,GB -1489689088,1489689343,IL -1489689344,1489689599,GB -1489689600,1489689855,IL -1489689856,1489690367,NL -1489690368,1489690623,IL -1489690624,1489692415,GB -1489692416,1489692422,AU -1489692423,1489692423,GB -1489692424,1489692430,AU -1489692431,1489692447,GB -1489692448,1489692463,AU -1489692464,1489693695,GB -1489693696,1489694719,FR -1489694720,1489698815,GB -1489698816,1489731583,MT -1489731584,1489764351,BG -1489764352,1489797119,RU -1489797120,1489829887,KZ -1489829888,1489855555,DE -1489855556,1489855559,US -1489855560,1489855807,DE -1489855808,1489855839,US -1489855840,1489856527,DE -1489856528,1489856543,US -1489856544,1489862655,DE -1489862656,1489928191,RU -1489928192,1489960959,SE -1489960960,1489993727,HR -1489993728,1490026495,LU -1490026496,1490028543,NL -1490028544,1490028671,GB -1490028672,1490028799,DE -1490028800,1490042879,NL -1490042880,1490053375,CZ -1490053376,1490054143,PL -1490054144,1490059263,CZ -1490059264,1490075647,DE -1490075648,1490092031,GB -1490092032,1490108415,DE -1490108416,1490124799,MC -1490124800,1490141183,SA -1490141184,1490153471,HU -1490153472,1490155519,GB -1490155520,1490157567,HU -1490157568,1490173951,RU -1490173952,1490190335,PT -1490190336,1490193616,GB -1490193617,1490193617,DE -1490193618,1490196991,GB -1490196992,1490197247,IE -1490197248,1490206719,GB -1490206720,1490223103,GE -1490223104,1490255871,GB -1490255872,1490272255,NL -1490272256,1490288639,GB -1490288640,1490305023,SK -1490305024,1490321407,DK -1490321408,1490325503,GB -1490325504,1490328575,FR -1490328576,1490336767,GB -1490336768,1490337023,ES -1490337024,1490337279,GB -1490337280,1490337535,ES -1490337536,1490337791,GB -1490337792,1490354175,RU -1490354176,1490386943,SA -1490386944,1490403327,CH -1490403328,1490411519,BG -1490411520,1490419711,FR -1490419712,1490420735,DE -1490420736,1490421759,IR -1490421760,1490436095,DE -1490436096,1490452479,UA -1490452480,1490468863,PT -1490468864,1490473983,GB -1490473984,1490474239,US -1490474240,1490478591,GB -1490478592,1490478847,RU -1490478848,1490480127,GB -1490480128,1490480639,RU -1490480640,1490501631,GB -1490501632,1490518015,DE -1490518016,1490534399,RU -1490534400,1490550783,DE -1490550784,1490616319,LT -1490616320,1490681855,DE -1490681856,1490747391,ES -1490747392,1490812927,FR -1490812928,1490878463,PL -1490878464,1490879487,DE -1490879488,1490880511,US -1490880512,1490881535,FR -1490885632,1490886655,US -1490904064,1490905087,US -1490909184,1490910207,US -1490913280,1490915327,US -1490915328,1490917375,IT -1490917376,1490919423,IL -1490927616,1490929663,FR -1490931712,1490931967,DE -1490931968,1490932223,PL -1490932224,1490933759,DE -1490934528,1490934783,IL -1490944000,1491075071,LT -1491075072,1493172223,TR -1493172224,1493303295,DE -1493303296,1493431622,FR -1493431623,1493431623,GP -1493431624,1493434367,FR -1493434368,1493565439,SA -1493565440,1493696511,ES -1493696512,1493958655,NO -1493958656,1494220799,DE -1494220800,1494221823,MQ -1494221824,1494222079,FR -1494222080,1494222335,MQ -1494222336,1494228991,FR -1494228992,1494237183,RU -1494237184,1494245375,IE -1494245376,1494253567,RU -1494253568,1494261759,DE -1494261760,1494269951,GB -1494269952,1494278143,AT -1494278144,1494286335,GB -1494286336,1494294527,HR -1494294528,1494302719,RU -1494302720,1494310911,FI -1494310912,1494319103,LB -1494319104,1494327295,IS -1494327296,1494335487,IT -1494335488,1494343679,ES -1494343680,1494351871,PL -1494351872,1494360063,RO -1494360064,1494368255,HR -1494368256,1494376447,IE -1494376448,1494384639,SE -1494384640,1494392831,RU -1494392832,1494401023,NL -1494401024,1494409215,LV -1494409216,1494417407,FI -1494417408,1494425599,TR -1494433792,1494441983,IE -1494441984,1494450175,UA -1494450176,1494458367,DK -1494458368,1494474751,RU -1494474752,1494482943,DE -1494482944,1494499327,RU -1494499328,1494507519,NL -1494507520,1494523903,RU -1494523904,1494532095,NL -1494532096,1494540287,GB -1494540288,1494548479,NO -1494548480,1494556671,GB -1494556672,1494564863,DE -1494564864,1494573055,UA -1494573056,1494581247,RO -1494581248,1494589439,RU -1494589440,1494597631,US -1494597632,1494605823,IT -1494605824,1494614015,GB -1494614016,1494615551,RU -1494615552,1494616063,UA -1494616064,1494618111,ES -1494618112,1494622207,RU -1494622208,1494624255,PL -1494624256,1494626303,UA -1494626304,1494626559,CZ -1494626560,1494626815,RO -1494626816,1494627071,RU -1494627072,1494627327,IE -1494627328,1494630399,RU -1494630400,1494638591,CZ -1494638592,1494646783,DE -1494646784,1494663167,RU -1494663168,1494665215,PL -1494665216,1494667263,UA -1494667264,1494669311,PL -1494669312,1494675455,RU -1494675456,1494679551,UA -1494679552,1494695935,RU -1494695936,1494704127,RS -1494704128,1494736895,RU -1494736896,1494745087,DK -1494745088,1494810623,CZ -1494810624,1494843391,BG -1494843392,1494876159,PL -1494876160,1494908927,AT -1494908928,1494941695,PT -1494941696,1494974463,FI -1494974464,1495007231,DE -1495007232,1495039999,MD -1495040000,1495042047,KZ -1495042048,1495044095,DE -1495044096,1495046143,FR -1495046144,1495048191,CH -1495048192,1495050239,RU -1495050240,1495052287,GB -1495052288,1495054335,IE -1495054336,1495056383,GB -1495056384,1495058431,RU -1495058432,1495060479,UA -1495060480,1495062527,GB -1495062528,1495064575,JO -1495064576,1495066623,PL -1495066624,1495068671,GB -1495068672,1495070719,DE -1495070720,1495072767,RU -1495072768,1495105535,CZ -1495105536,1495138303,ES -1495138304,1495139327,FR -1495139344,1495139347,GB -1495140352,1495142399,FR -1495146752,1495147007,US -1495148544,1495150591,FR -1495150848,1495151103,GB -1495151616,1495153663,FR -1495158784,1495159295,GB -1495160240,1495160255,FR -1495160256,1495160263,GB -1495160320,1495160575,FR -1495160576,1495160831,CN -1495161856,1495161983,AE -1495162112,1495162367,DE -1495162496,1495162499,DE -1495162608,1495162623,GB -1495162624,1495162879,FR -1495163400,1495163403,GB -1495163408,1495163411,ES -1495163412,1495163415,IT -1495163552,1495163567,FR -1495165192,1495165195,NL -1495165408,1495165439,FR -1495165696,1495165951,ES -1495167488,1495167503,GB -1495167552,1495167567,DE -1495167568,1495167583,PL -1495167584,1495167599,ES -1495168384,1495168415,FR -1495168640,1495168655,FR -1495169024,1495169279,FR -1495170128,1495170143,FR -1495170760,1495170763,DE -1495170816,1495171071,FR -1495171072,1495203839,NL -1495203840,1495205887,DE -1495205888,1495207935,CZ -1495207936,1495209983,RU -1495212032,1495214079,RU -1495214080,1495216127,CZ -1495216128,1495218175,IT -1495218176,1495220223,NL -1495220224,1495222271,PL -1495222272,1495224319,IT -1495224320,1495228415,RU -1495228416,1495230463,NL -1495230464,1495234559,RU -1495238656,1495240703,DE -1495240704,1495242751,FR -1495242752,1495244799,MK -1495244800,1495246847,CZ -1495246848,1495248895,IE -1495248896,1495250943,GR -1495250944,1495252991,RU -1495252992,1495255039,BH -1495255040,1495257087,IT -1495257088,1495259135,GB -1495259136,1495261183,BE -1495261184,1495263231,PT -1495263232,1495265279,GB -1495265280,1495267327,US -1495267328,1495269375,SE -1495269376,1495277567,IR -1495277568,1495279615,SE -1495279616,1495279871,DE -1495279872,1495283711,RO -1495283712,1495285759,MD -1495285760,1495287807,US -1495287808,1495289855,SE -1495289856,1495291903,ES -1495291904,1495293951,RO -1495293952,1495298047,IR -1495298048,1495300095,ES -1495300096,1495300351,SE -1495300352,1495300607,US -1495300608,1495300863,SE -1495300864,1495303167,RO -1495303168,1495304191,US -1495304192,1495306239,MD -1495306240,1495306573,GB -1495306574,1495306574,RO -1495306575,1495308287,GB -1495308288,1495308799,IT -1495308800,1495309311,RO -1495309312,1495310335,IT -1495310336,1495312383,ES -1495312384,1495312895,IT -1495312896,1495313151,GB -1495313152,1495314431,MD -1495314432,1495316479,RO -1495316480,1495316735,GB -1495316736,1495316991,RO -1495316992,1495317503,IT -1495317504,1495317759,NL -1495317760,1495318015,RO -1495318016,1495318271,ES -1495318272,1495318527,RO -1495318528,1495319039,NO -1495319040,1495319167,FR -1495319168,1495319295,RO -1495319296,1495319551,SE -1495319552,1495320063,IR -1495320064,1495321343,RO -1495321344,1495321599,GB -1495321600,1495322623,RO -1495322624,1495324671,GR -1495324672,1495326719,RO -1495326720,1495332863,MD -1495332864,1495333375,RO -1495333376,1495333631,CH -1495333632,1495333887,RO -1495333888,1495334911,MD -1495334912,1495335167,FR -1495335168,1495335423,IE -1495335424,1495335679,NL -1495335680,1495335935,FR -1495335936,1495336447,RO -1495336448,1495336959,GB -1495336960,1495339007,RO -1495339008,1495339263,DE -1495339264,1495339519,MD -1495339520,1495340031,IR -1495340032,1495342591,RO -1495342592,1495342847,MD -1495342848,1495345151,RO -1495345152,1495345407,FI -1495345408,1495345663,US -1495345664,1495345919,FI -1495345920,1495346687,RO -1495346688,1495347199,GB -1495347200,1495349247,RO -1495349248,1495351295,SY -1495351296,1495351551,GB -1495351552,1495351807,MD -1495351808,1495352319,IQ -1495352320,1495352447,FR -1495352448,1495352831,RO -1495352832,1495353087,FI -1495353088,1495360511,RO -1495360512,1495361535,IR -1495361536,1495362559,RO -1495362560,1495363583,ES -1495363584,1495364607,KZ -1495364608,1495364863,GB -1495364864,1495365119,PT -1495365120,1495365375,SE -1495365376,1495367679,RO -1495367680,1495368191,IR -1495368192,1495368959,RO -1495368960,1495369215,IT -1495369216,1495369471,GB -1495369472,1495369727,RO -1495369728,1495371775,SE -1495371776,1495376383,RO -1495376384,1495376639,GB -1495376640,1495376895,RO -1495376896,1495377407,GB -1495377408,1495382015,RO -1495382016,1495384063,ES -1495384064,1495385599,RO -1495385600,1495386623,GB -1495386624,1495387135,RO -1495387136,1495387647,IR -1495387648,1495388159,GB -1495388160,1495392255,KZ -1495392256,1495394303,SY -1495394304,1495394815,RO -1495394816,1495395327,IR -1495395328,1495396351,RO -1495396352,1495396863,IR -1495396864,1495397895,RO -1495397896,1495397903,HU -1495397904,1495398911,RO -1495398912,1495399423,GB -1495399424,1495399935,RO -1495399936,1495400447,GB -1495400448,1495404543,RO -1495404544,1495405567,NL -1495405568,1495406079,IR -1495406080,1495407615,RO -1495407616,1495408639,ES -1495408640,1495416831,IR -1495416832,1495418879,MD -1495418880,1495420159,RO -1495420160,1495420415,NL -1495420416,1495422975,RO -1495422976,1495423487,IR -1495423488,1495424511,RO -1495424512,1495425023,IR -1495425024,1495425468,GB -1495425469,1495425469,PT -1495425470,1495425533,GB -1495425534,1495425534,PT -1495425535,1495426047,GB -1495426048,1495426559,RO -1495426560,1495426815,GB -1495426816,1495427071,RO -1495427072,1495427583,GB -1495427584,1495428095,RO -1495428096,1495428351,GB -1495428352,1495428863,RO -1495428864,1495429119,DE -1495429120,1495431167,MD -1495431168,1495432191,ES -1495432192,1495432703,GB -1495432704,1495433215,RO -1495433216,1495441407,IR -1495441408,1495441663,RO -1495441664,1495441919,IT -1495441920,1495442431,SY -1495442432,1495442559,FR -1495442560,1495442943,RO -1495442944,1495443199,AE -1495443200,1495443455,RO -1495443456,1495443967,IR -1495443968,1495444223,RO -1495444224,1495444479,GB -1495444480,1495444607,KR -1495444608,1495444735,IN -1495444736,1495445503,RO -1495445504,1495446015,IR -1495446016,1495446271,RO -1495446272,1495446527,ES -1495446528,1495447551,RO -1495447552,1495449599,SE -1495449600,1495451647,MD -1495451648,1495452159,IR -1495452160,1495452671,RO -1495452672,1495453695,MD -1495453696,1495455743,RO -1495455744,1495455999,ES -1495456000,1495456255,NL -1495456256,1495459839,RO -1495459840,1495460863,MD -1495460864,1495461887,RO -1495461888,1495463935,SE -1495463936,1495465983,IR -1495465984,1495466495,RO -1495466496,1495467007,DE -1495467008,1495468031,RO -1495468032,1495470079,MD -1495470080,1495472127,NL -1495472128,1495473151,RO -1495473152,1495474175,GB -1495474176,1495474431,ES -1495474432,1495474687,RO -1495474688,1495474943,MD -1495474944,1495476223,RO -1495476224,1495478271,MD -1495478272,1495479295,RO -1495479296,1495479551,TR -1495479552,1495480319,RO -1495480320,1495480831,NL -1495480832,1495481343,IR -1495481344,1495482367,RO -1495482368,1495484415,IR -1495484416,1495485439,RO -1495485440,1495485695,MD -1495485696,1495485951,RO -1495485952,1495486463,PL -1495486464,1495487231,RO -1495487232,1495487487,IT -1495487488,1495488767,MD -1495488768,1495489279,GB -1495489280,1495489535,MD -1495489536,1495493119,RO -1495493120,1495493375,US -1495493376,1495493631,RO -1495493632,1495494655,AE -1495494656,1495495167,RO -1495495168,1495495423,ES -1495495424,1495496703,RO -1495496704,1495497727,IR -1495497728,1495498239,RO -1495498240,1495498367,IN -1495498368,1495498495,BD -1495498496,1495499775,RO -1495499776,1495500287,IR -1495500288,1495500799,RO -1495500800,1495502847,ES -1495502848,1495503871,PL -1495503872,1495504895,ES -1495504896,1495505151,RO -1495505152,1495505407,GB -1495505408,1495505919,RO -1495505920,1495506431,IR -1495506432,1495507711,RO -1495507712,1495507967,MD -1495507968,1495508991,US -1495508992,1495510015,IT -1495510016,1495510527,RO -1495510528,1495511039,DE -1495511040,1495511551,IR -1495511552,1495511807,LT -1495511808,1495512063,FR -1495512064,1495513087,IR -1495513088,1495515647,RO -1495515648,1495516159,IR -1495516160,1495516287,FR -1495516288,1495516671,RO -1495516672,1495516927,GR -1495516928,1495517183,RO -1495517184,1495518207,MD -1495518208,1495529471,RO -1495529472,1495529727,MD -1495529728,1495530495,RO -1495530496,1495531519,KZ -1495531520,1495533567,ES -1495533568,1495535615,RO -1495535616,1495536127,IR -1495536128,1495537663,RO -1495539712,1495540735,US -1495540736,1495540991,GB -1495540992,1495541247,RO -1495541248,1495541759,GB -1495541760,1495543807,ES -1495543808,1495547903,IR -1495547904,1495548159,US -1495548160,1495548671,RO -1495548672,1495548703,RU -1495548704,1495548735,RO -1495548736,1495548927,RU -1495548928,1495549695,RO -1495549696,1495549951,RU -1495549952,1495550463,RO -1495550464,1495550975,BE -1495550976,1495551999,RO -1495552000,1495554047,ES -1495554048,1495554559,RO -1495554560,1495554815,US -1495554816,1495555071,SE -1495555072,1495556095,RO -1495556096,1495560191,IR -1495560192,1495566335,RO -1495566336,1495566591,GB -1495566592,1495566847,RO -1495566848,1495567359,GB -1495567360,1495567615,RO -1495567616,1495567871,GB -1495567872,1495568127,IE -1495568128,1495571455,RO -1495571456,1495572479,MD -1495572480,1495573503,RO -1495573504,1495574527,KZ -1495574528,1495575039,RO -1495575040,1495575551,CH -1495575552,1495575807,NL -1495575808,1495576575,RO -1495576576,1495580671,IR -1495580672,1495581183,RO -1495581184,1495581695,IR -1495581696,1495582719,RO -1495582720,1495583743,KZ -1495583744,1495585791,IT -1495585792,1495586815,FR -1495586816,1495587839,DE -1495587840,1495588863,GB -1495588864,1495589119,RO -1495589120,1495589375,FI -1495589376,1495589887,IR -1495589888,1495590143,IT -1495590144,1495590655,RO -1495590656,1495592959,US -1495592960,1495596031,RO -1495596032,1495596543,IR -1495596544,1495596799,RO -1495596800,1495597055,MD -1495597056,1495601151,IR -1495601152,1495603199,AZ -1495603200,1495604223,KZ -1495604224,1495604479,DE -1495604480,1495604735,RO -1495604736,1495605247,IR -1495605248,1495607295,AZ -1495607296,1495607551,MD -1495607552,1495607807,RO -1495607808,1495608319,IR -1495608320,1495609343,MD -1495609344,1495613439,RO -1495613440,1495614463,GB -1495614464,1495615487,RO -1495615488,1495618559,ES -1495618560,1495619583,BE -1495619584,1495620607,AT -1495620608,1495621375,GB -1495621376,1495621631,RO -1495621632,1495621887,GB -1495621888,1495622143,BG -1495622144,1495623167,RO -1495623168,1495623679,IR -1495623680,1495623935,MD -1495623936,1495624191,NL -1495624192,1495624447,US -1495624448,1495629823,RO -1495629824,1495631615,GB -1495631616,1495632127,RO -1495632128,1495632383,ES -1495632384,1495632639,IE -1495632640,1495632895,RO -1495632896,1495633151,ES -1495633152,1495633919,RO -1495633920,1495636991,IR -1495636992,1495640063,RO -1495640064,1495641087,IR -1495641088,1495642111,RO -1495642112,1495644159,SE -1495644160,1495645183,RO -1495645184,1495646207,US -1495646208,1495647743,RO -1495647744,1495648255,IR -1495648256,1495650303,LU -1495650304,1495651327,IR -1495651328,1495652351,RO -1495652352,1495652863,US -1495652864,1495653375,IR -1495653376,1495654399,KZ -1495654400,1495654911,RO -1495654912,1495655167,ES -1495655168,1495655423,BG -1495655424,1495656447,US -1495656448,1495656959,RO -1495656960,1495657215,GB -1495657216,1495657471,RO -1495657472,1495658495,US -1495658496,1495662591,IR -1495662592,1495666687,RO -1495666688,1495668735,ES -1495668736,1495669247,IR -1495669248,1495669503,GB -1495669504,1495669759,RO -1495669760,1495670783,IL -1495670784,1495671807,MD -1495671808,1495672319,RO -1495672320,1495672575,GB -1495672576,1495672831,NL -1495672832,1495674879,ES -1495674880,1495677951,RO -1495677952,1495678975,US -1495678976,1495679999,MD -1495680000,1495682047,RO -1495682048,1495683071,MD -1495683072,1495687167,IR -1495687168,1495688191,NL -1495688192,1495688703,RO -1495688704,1495689215,IR -1495689216,1495689727,RO -1495689728,1495690239,DE -1495690240,1495691263,RO -1495691264,1495693311,DE -1495693312,1495695359,GB -1495695360,1495699455,RO -1495699456,1495700479,GB -1495700480,1495701503,FR -1495701504,1495703551,RO -1495703552,1495704575,NL -1495704576,1495705599,KZ -1495705600,1495707647,RO -1495707648,1495709695,ES -1495709696,1495713791,IR -1495713792,1495715839,ES -1495715840,1495716863,RO -1495716864,1495717887,IR -1495717888,1495719935,ES -1495719936,1495723519,RO -1495723520,1495724031,FR -1495724032,1495724287,GB -1495724288,1495724543,RO -1495724544,1495726079,IR -1495726080,1495730175,RO -1495730176,1495731199,IR -1495731200,1495732223,RO -1495732224,1495744511,ES -1495744512,1495745791,RO -1495745792,1495746047,GB -1495746048,1495747583,RO -1495747584,1495748607,MD -1495748608,1495748863,RO -1495748864,1495749119,GB -1495749120,1495749631,RO -1495749632,1495750655,MD -1495750656,1495752703,RO -1495752704,1495754751,MD -1495754752,1495755775,NL -1495755776,1495756031,PL -1495756032,1495756799,RO -1495756800,1495758847,MD -1495758848,1495759359,RO -1495759360,1495759487,TH -1495759488,1495759615,ID -1495759616,1495759871,RO -1495759872,1495760127,ES -1495760128,1495760895,RO -1495760896,1495762943,DE -1495762944,1495763967,GB -1495763968,1495764735,RO -1495764736,1495764991,AU -1495764992,1495765503,BG -1495765504,1495765759,GB -1495765760,1495766015,NL -1495766016,1495766527,RO -1495766528,1495766783,DE -1495766784,1495767039,RO -1495767040,1495769087,ES -1495769088,1495769599,RO -1495769600,1495769855,NL -1495769856,1495770623,IT -1495770624,1495771135,RO -1495771136,1495772159,PL -1495772160,1495772671,US -1495772672,1495774207,RO -1495774208,1495775231,ES -1495775232,1495775743,RO -1495775744,1495776255,IR -1495776256,1495781375,RO -1495781376,1495781631,IR -1495781632,1495781887,RO -1495781888,1495782911,GB -1495782912,1495783167,RO -1495783168,1495783423,GB -1495783424,1495785471,ES -1495785472,1495789567,IT -1495789568,1495789823,PL -1495789824,1495790079,GB -1495790080,1495790335,MD -1495790336,1495790847,GB -1495790848,1495791359,RO -1495791360,1495791615,GB -1495791616,1495793663,RO -1495793664,1495794687,DE -1495794688,1495795199,RO -1495795200,1495795327,FR -1495795328,1495795455,RO -1495795456,1495795711,RU -1495795712,1495803391,RO -1495803392,1495803903,IR -1495803904,1495804671,RO -1495804672,1495805439,GB -1495805440,1495805951,RO -1495805952,1495810047,KZ -1495810048,1495813631,RO -1495813632,1495814143,IR -1495814144,1495815167,RO -1495815168,1495816191,ES -1495816192,1495816703,RO -1495816704,1495817215,IR -1495817216,1495817471,HK -1495817472,1495820799,RO -1495820800,1495821311,IR -1495821312,1495821823,DE -1495821824,1495822335,IR -1495822336,1495823359,FR -1495823360,1495824383,DE -1495824384,1495825407,GB -1495825408,1495826431,DE -1495826432,1495826943,IR -1495826944,1495827967,RO -1495827968,1495828479,DE -1495828480,1495829247,RO -1495829248,1495829503,PL -1495829504,1495830015,GB -1495830016,1495830527,RO -1495830528,1495831551,PL -1495831552,1495832575,RO -1495832576,1495834623,IR -1495834624,1495836159,RO -1495836160,1495836415,GB -1495836416,1495837695,RO -1495837696,1495838719,IT -1495838720,1495839743,US -1495839744,1495839999,FR -1495840000,1495842815,RO -1495842816,1495843839,KZ -1495843840,1495845631,RO -1495845632,1495845887,GB -1495845888,1495846655,RO -1495846656,1495847423,GB -1495847424,1495848191,RO -1495848192,1495848447,PL -1495848448,1495848959,RO -1495848960,1495849471,SE -1495849472,1495849983,RO -1495849984,1495850495,US -1495850496,1495852031,RO -1495852032,1495853055,MD -1495853056,1495853567,RO -1495853568,1495854079,IT -1495854080,1495855103,RO -1495855104,1495859199,IR -1495859200,1495860223,ES -1495860224,1495861247,AZ -1495861248,1495865343,IR -1495865344,1495865599,GB -1495865600,1495866111,RO -1495866112,1495866879,GB -1495866880,1495867391,RO -1495867392,1495867903,IR -1495867904,1495868415,DE -1495868416,1495869439,RO -1495869440,1495870463,IR -1495870464,1495871487,BE -1495871488,1495871743,ES -1495871744,1495872511,GB -1495872512,1495873535,BE -1495873536,1495874047,RO -1495874048,1495874559,IR -1495874560,1495875071,GB -1495875072,1495875583,RO -1495875584,1495891967,MD -1495891968,1495894015,AT -1495894016,1495894527,RO -1495894528,1495896063,SY -1495896064,1495900159,RO -1495900160,1495902207,SE -1495902208,1495906303,RO -1495906304,1495907327,IR -1495907328,1495907583,RO -1495907584,1495908351,GB -1495908352,1495922687,IR -1495922688,1495924735,LU -1495924736,1495926783,IT -1495926784,1495927039,SG -1495927040,1495927295,RO -1495927296,1495927551,GB -1495927552,1495931135,RO -1495931136,1495931391,IT -1495931392,1495931647,RO -1495931648,1495931903,SE -1495931904,1495932159,RO -1495932160,1495932415,US -1495932416,1495932671,RO -1495932672,1495932927,GB -1495932928,1495933439,IR -1495933440,1495934975,RO -1495934976,1495935231,GB -1495935232,1495935743,RO -1495935744,1495935999,ES -1495936000,1495937023,IR -1495937024,1495937535,DE -1495937536,1495938559,RO -1495938560,1495939071,BE -1495939072,1495939583,IR -1495939584,1495940095,RO -1495940096,1495941119,KZ -1495941120,1495942143,MD -1495942144,1495942655,IR -1495942656,1495943167,RO -1495943168,1495945215,MD -1495945216,1495949311,RO -1495949312,1495951359,IR -1495951360,1495952383,MD -1495952384,1495953919,RO -1495953920,1495954175,GB -1495954176,1495955455,RO -1495955456,1495957503,ES -1495957504,1495958527,MD -1495958528,1495959551,RO -1495959552,1495960575,IR -1495960576,1495960831,US -1495960832,1495961087,SE -1495961088,1495961599,RO -1495961600,1495962623,US -1495962624,1495963135,RO -1495963136,1495963647,IR -1495963648,1495964415,GB -1495964672,1495965695,RO -1495965696,1495966719,PL -1495966720,1495967743,ES -1495967744,1495968767,NL -1495968768,1495969279,RO -1495969280,1495969791,FR -1495969792,1495970815,RO -1495970816,1495971839,MD -1495971840,1495973887,IR -1495973888,1495974911,RO -1495974912,1495975935,IR -1495975936,1495976959,RO -1495976960,1495977983,KZ -1495977984,1495979007,IR -1495979008,1495979263,NL -1495979264,1495979519,US -1495979520,1495979775,RO -1495979776,1495980031,GB -1495980032,1495982079,RO -1495982080,1495983103,MD -1495983104,1495983615,IR -1495983616,1495983871,IT -1495983872,1495985663,RO -1495985664,1495985791,FR -1495985792,1495985919,RO -1495985920,1495986175,JP -1495986176,1495990271,RO -1495990272,1495994367,IR -1495994368,1495995391,RO -1495995392,1495996415,KZ -1495996416,1495997439,RO -1495997440,1495998463,TR -1495998464,1495998719,SG -1495998720,1495999487,RO -1495999488,1495999999,IR -1496000000,1496003327,RO -1496003328,1496003583,DE -1496003584,1496004607,RO -1496004608,1496005631,GR -1496005632,1496005887,GB -1496005888,1496006655,RO -1496006656,1496007679,TR -1496007680,1496008191,DE -1496008192,1496008703,IR -1496008704,1496009215,RO -1496009216,1496010239,ES -1496010240,1496010495,TR -1496010496,1496011775,RO -1496011776,1496012799,ES -1496012800,1496016895,IR -1496016896,1496018943,RO -1496018944,1496019967,FR -1496019968,1496020735,RO -1496020736,1496020991,AU -1496020992,1496023039,DE -1496023040,1496024063,MD -1496024064,1496025087,TR -1496025088,1496027135,RO -1496027136,1496029183,IR -1496029184,1496032255,RO -1496032256,1496033279,KZ -1496033280,1496034303,MD -1496034304,1496034815,DE -1496034816,1496036863,RO -1496036864,1496037375,IR -1496037376,1496038399,GR -1496038400,1496038911,IR -1496038912,1496040447,RO -1496040448,1496040959,ES -1496040960,1496041983,RO -1496041984,1496042495,GB -1496042496,1496043007,IR -1496043008,1496045567,RO -1496045568,1496049663,IR -1496049664,1496051711,SE -1496051712,1496055807,RO -1496055808,1496057855,SE -1496057856,1496058111,DE -1496058112,1496058879,RO -1496058880,1496059903,KZ -1496059904,1496063999,ES -1496064000,1496066815,RO -1496066816,1496067071,QA -1496067072,1496068095,RO -1496068096,1496074239,ES -1496074240,1496075263,GR -1496075264,1496079359,RO -1496079360,1496081407,GR -1496081408,1496082175,RO -1496082176,1496082431,GB -1496082432,1496083967,RO -1496083968,1496084479,FR -1496084480,1496084991,IR -1496084992,1496085247,IE -1496085248,1496086015,RO -1496086016,1496086527,IR -1496086528,1496088063,RO -1496088064,1496088319,NL -1496088320,1496088575,ES -1496088576,1496090623,IR -1496090624,1496093183,RO -1496093184,1496093695,IR -1496093696,1496094719,RO -1496094720,1496095743,MD -1496095744,1496096767,GR -1496096768,1496098303,RO -1496098304,1496098815,BE -1496098816,1496100863,LU -1496100864,1496102911,IR -1496102912,1496103935,ES -1496103936,1496104447,RO -1496104448,1496104959,IR -1496104960,1496107519,RO -1496107520,1496108031,IR -1496108032,1496108543,RO -1496108544,1496108799,IT -1496108800,1496109567,RO -1496109568,1496109823,US -1496109824,1496110335,RO -1496110336,1496110591,GB -1496110592,1496111103,RO -1496111104,1496113151,GR -1496113152,1496117247,RO -1496117248,1496118271,IR -1496118272,1496119295,RO -1496119296,1496121343,SE -1496121344,1496122367,MD -1496122368,1496123391,RO -1496123392,1496123647,IE -1496123648,1496124927,RO -1496124928,1496125183,FR -1496125184,1496127487,RO -1496127488,1496127743,IT -1496127744,1496127999,RO -1496128000,1496129535,IT -1496129536,1496130559,RO -1496130560,1496131583,ES -1496131584,1496132607,MD -1496132608,1496133631,RO -1496133632,1496137727,IR -1496137728,1496138495,RO -1496138496,1496138751,BG -1496138752,1496139263,IR -1496139264,1496141823,RO -1496141824,1496142335,IR -1496142336,1496142591,GB -1496142592,1496142847,RO -1496142848,1496143871,CH -1496143872,1496144895,RO -1496144896,1496145151,US -1496145152,1496145407,RO -1496145408,1496145663,TR -1496145664,1496145919,IT -1496145920,1496150015,RO -1496150016,1496152063,IR -1496152064,1496153087,GR -1496153088,1496153599,RO -1496153600,1496154111,IR -1496154112,1496158207,SY -1496158208,1496160255,RO -1496160256,1496162303,IR -1496162304,1496175615,RO -1496175616,1496177663,IT -1496177664,1496178687,ES -1496178688,1496178943,RO -1496178944,1496179199,BG -1496179200,1496179711,SE -1496179712,1496180223,RO -1496180224,1496180735,IR -1496180736,1496182783,SE -1496182784,1496183039,ES -1496183040,1496183551,US -1496183552,1496184063,ES -1496184064,1496184740,US -1496184741,1496184741,ES -1496184742,1496184831,US -1496184832,1496188927,RO -1496188928,1496189951,ES -1496189952,1496190975,RO -1496190976,1496193023,SE -1496193024,1496197119,RO -1496197120,1496197631,MD -1496197632,1496198143,RO -1496198144,1496198655,IR -1496198656,1496199167,GB -1496199168,1496202239,RO -1496202240,1496202751,IR -1496202752,1496203263,RO -1496203264,1496207359,IT -1496207360,1496207615,DE -1496207616,1496208383,SE -1496208384,1496208895,AE -1496208896,1496209151,SE -1496209152,1496209407,AE -1496209408,1496210431,ES -1496210432,1496210943,RO -1496210944,1496211455,IR -1496211456,1496213503,RO -1496213504,1496215551,IT -1496215552,1496216319,RO -1496216320,1496216575,ES -1496216576,1496218879,RO -1496218880,1496219135,DE -1496219136,1496220671,RO -1496220672,1496221695,US -1496221696,1496223743,ES -1496223744,1496225791,PL -1496225792,1496228863,RO -1496228864,1496229887,MD -1496229888,1496231935,RO -1496231936,1496233983,PS -1496233984,1496236031,IR -1496236032,1496238079,IT -1496238080,1496240127,IQ -1496240128,1496242175,RO -1496242176,1496243199,IR -1496243200,1496248575,RO -1496248576,1496248831,MD -1496248832,1496250367,RO -1496250368,1496251391,US -1496251392,1496252415,GR -1496252416,1496252671,RO -1496252672,1496252927,NL -1496252928,1496253439,RO -1496253440,1496254463,ES -1496254464,1496256255,RO -1496256256,1496256511,HK -1496256512,1496260607,ES -1496260608,1496261119,IT -1496261120,1496262655,RO -1496262656,1496263167,BG -1496263168,1496263679,RO -1496263680,1496264703,GR -1496264704,1496268543,RO -1496268544,1496268799,GB -1496268800,1496272895,IR -1496272896,1496274943,SY -1496274944,1496275455,RO -1496275456,1496275711,ES -1496275712,1496276735,RO -1496276736,1496276991,ES -1496276992,1496285183,RO -1496285184,1496293375,IR -1496293376,1496295423,RO -1496295424,1496297471,PL -1496297472,1496297727,MD -1496297728,1496297983,BG -1496297984,1496298239,MD -1496298240,1496298495,RO -1496298496,1496298751,BG -1496298752,1496299263,MD -1496299264,1496299519,IE -1496299520,1496301567,SE -1496301568,1496302591,RO -1496302592,1496304639,IR -1496304640,1496312831,RO -1496312832,1496313855,ES -1496313856,1496315647,RO -1496315648,1496315903,GB -1496315904,1496316159,RO -1496316160,1496316415,GB -1496316416,1496317951,RO -1496317952,1497366527,DE -1497366528,1498415103,PL -1498415104,1499463679,FR -1499463680,1499594751,IT -1499594752,1499725823,NL -1499725824,1499856895,IE -1499856896,1499987967,CZ -1499987968,1499996159,AT -1499996160,1500004351,GB -1500004352,1500020735,RU -1500020736,1500028927,IS -1500028928,1500037119,NL -1500037120,1500045311,DK -1500045312,1500061695,GB -1500061696,1500069887,NO -1500069888,1500078079,IT -1500078080,1500086271,GB -1500086272,1500094463,RU -1500094464,1500102655,AT -1500102656,1500110847,NL -1500110848,1500119039,UA -1500119040,1500127231,TR -1500127232,1500135423,FI -1500135424,1500143615,DE -1500143616,1500151807,BG -1500151808,1500153855,GB -1500153856,1500155903,IE -1500155904,1500157951,GB -1500157952,1500159999,DE -1500160000,1500162047,NL -1500162048,1500164095,RU -1500164096,1500166143,GB -1500166144,1500168191,DE -1500168192,1500170239,RU -1500170240,1500172287,LU -1500172288,1500174335,AT -1500174336,1500176383,DE -1500176384,1500178431,GB -1500178432,1500180479,KZ -1500180480,1500182527,BE -1500182528,1500184575,RU -1500184576,1500186623,IM -1500186624,1500188671,KW -1500188672,1500188735,FR -1500188736,1500188799,GB -1500188800,1500190719,FR -1500192768,1500194815,RU -1500194816,1500196863,GB -1500196864,1500198911,ES -1500198912,1500200959,GB -1500200960,1500203007,DE -1500203008,1500205055,GB -1500205056,1500207103,RU -1500207104,1500209151,IT -1500209152,1500211199,KZ -1500211200,1500213247,IT -1500213248,1500217343,RU -1500217344,1500219391,DE -1500219392,1500221439,RU -1500221440,1500223487,SK -1500223488,1500225535,PL -1500225536,1500227583,DE -1500227584,1500229631,FR -1500229632,1500231679,ES -1500231680,1500233727,DE -1500233728,1500237823,RU -1500237824,1500241919,SE -1500241920,1500243967,TR -1500243968,1500246015,GB -1500246016,1500248063,ES -1500248064,1500250111,HU -1500250112,1500266495,SA -1500266496,1500282879,RU -1500282880,1500299263,LB -1500299264,1500315647,PL -1500315648,1500332031,RU -1500332032,1500348415,PT -1500348416,1500413951,RU -1500413952,1500430335,DE -1500430336,1500446719,RS -1500446720,1500459007,LV -1500459008,1500461055,RU -1500461056,1500463103,LV -1500463104,1500479487,CZ -1500479488,1500495871,RU -1500495872,1500512255,BA -1500512256,1500643327,RU -1500643328,1500774399,PT -1500774400,1500905471,LT -1500905472,1501036543,IT -1501036544,1501298687,RO -1501298688,1501560831,IE -1501560832,1501822975,ES -1501822976,1502085119,HU -1502085120,1502216191,RO -1502216192,1502347263,IL -1502347264,1502478335,ES -1502478336,1502605311,SI -1502605312,1502606335,HR -1502606336,1502609407,SI -1502609408,1502625791,DE -1502625792,1502642175,SA -1502642176,1502658559,IR -1502658560,1502674943,AT -1502674944,1502691327,DE -1502691328,1502707711,GB -1502707712,1502715903,RU -1502715904,1502716927,DE -1502716928,1502717951,CH -1502717952,1502719999,GB -1502720000,1502722047,FR -1502722048,1502724095,TR -1502724096,1502740479,GB -1502740480,1502756863,NL -1502756864,1502773247,UZ -1502773248,1502789631,BA -1502789632,1502806015,DE -1502806016,1502822399,SA -1502822400,1502838783,HU -1502838784,1502855167,SE -1502855168,1502871551,AZ -1502871552,1502887935,BH -1502887936,1502904319,HU -1502904320,1502920703,IT -1502920704,1502937087,RU -1502937088,1502953471,RO -1502953472,1502969855,MD -1502969856,1502972927,IE -1502972928,1502973951,DE -1502973952,1502975231,IE -1502975232,1502975247,GB -1502975248,1502975327,IE -1502975328,1502975359,GB -1502975360,1502975999,IE -1502976000,1502977023,DE -1502977024,1502978047,IE -1502978048,1502979071,US -1502979072,1502979135,IE -1502979136,1502979199,GB -1502979200,1502979215,IE -1502979216,1502979231,CZ -1502979232,1502979311,IE -1502979312,1502979327,FR -1502979328,1502980095,IE -1502980096,1502980223,DE -1502980224,1502980351,IE -1502980352,1502980607,US -1502980608,1502986239,IE -1502986240,1503002623,NL -1503002624,1503006719,GE -1503006720,1503010815,GB -1503010816,1503019007,IT -1503019008,1503051775,DK -1503051776,1503068159,SE -1503068160,1503084543,PL -1503084544,1503100927,GB -1503100928,1503117311,RU -1503117312,1503133695,NO -1503133696,1503370138,PT -1503370139,1503370139,GB -1503370140,1503395839,PT -1503395840,1503491082,FR -1503491083,1503491083,GP -1503491084,1503657983,FR -1503657984,1503690751,SE -1503690752,1503723519,IS -1503723520,1503789055,PL -1503789056,1503821823,NO -1503821824,1503854591,UA -1503854592,1503887359,RU -1503887360,1503895567,DE -1503895568,1503895571,IT -1503895572,1503895679,DE -1503895680,1503895687,IT -1503895688,1503896411,DE -1503896412,1503896415,AT -1503896416,1503897367,DE -1503897368,1503897375,BE -1503897376,1503898175,DE -1503898176,1503898183,IT -1503898184,1503898239,DE -1503898240,1503898303,RO -1503898304,1503898335,DE -1503898336,1503898343,MX -1503898344,1503898351,DE -1503898352,1503898359,CH -1503898360,1503898791,DE -1503898792,1503898799,AT -1503898800,1503898911,DE -1503898912,1503898919,LT -1503898920,1503898935,DE -1503898936,1503898943,IT -1503898944,1503898959,DE -1503898960,1503898967,IT -1503898968,1503899071,DE -1503899072,1503899079,AT -1503899080,1503899687,DE -1503899688,1503899695,IT -1503899696,1503899703,BE -1503899704,1503899927,DE -1503899928,1503899935,IT -1503899936,1503900679,DE -1503900680,1503900687,BE -1503900688,1503900719,DE -1503900720,1503900727,TW -1503900728,1503901567,DE -1503901568,1503901695,TW -1503901696,1503902215,DE -1503902216,1503902223,US -1503902224,1503906343,DE -1503906344,1503906351,AT -1503906352,1503906407,DE -1503906408,1503906415,MX -1503906416,1503920127,DE -1503920128,1503985663,HR -1503985664,1504018431,IR -1504018432,1504051199,RO -1504051200,1504083967,FI -1504083968,1504116735,DE -1504116736,1504149503,PL -1504149504,1504149691,GB -1504149692,1504149693,US -1504149694,1504149694,IE -1504149695,1504149695,US -1504149696,1504149759,GB -1504149760,1504150015,ES -1504150016,1504150271,GB -1504150272,1504150527,DE -1504150528,1504151039,GB -1504151040,1504151295,FR -1504151296,1504154623,GB -1504154624,1504155647,IE -1504155648,1504247807,GB -1504247808,1504313343,RU -1504313344,1504378879,FR -1504378880,1504444415,PL -1504444416,1504509951,HR -1504509952,1504575487,SK -1504575488,1504641023,PL -1504641024,1504706559,RU -1504706560,1504837631,CZ -1504837632,1504968703,RU -1504968704,1505099775,PT -1505099776,1505230847,DE -1505230848,1505239039,RU -1505239040,1505247231,IE -1505247232,1505255423,UA -1505255424,1505263615,IT -1505263616,1505271807,DK -1505271808,1505279999,NL -1505280000,1505288191,IR -1505288192,1505296383,RU -1505296384,1505304575,UA -1505304576,1505312767,FR -1505312768,1505320959,RU -1505320960,1505329151,AT -1505329152,1505337343,IE -1505337344,1505345535,FR -1505345536,1505353727,MK -1505353728,1505361919,CZ -1505361920,1505370111,PL -1505370112,1505378303,SM -1505378304,1505386495,IT -1505386496,1505394687,HU -1505394688,1505402879,DE -1505402880,1505411071,DK -1505411072,1505413119,CH -1505413120,1505415167,BG -1505415168,1505417215,CH -1505417216,1505419263,AT -1505419264,1505427455,RU -1505427456,1505435647,UA -1505435648,1505443839,MD -1505443840,1505460223,GB -1505460224,1505478655,CZ -1505478656,1505482751,DE -1505482752,1505484799,LB -1505484800,1505492991,PL -1505492992,1505501183,NL -1505501184,1505509375,ME -1505509376,1505511423,AT -1505511424,1505517567,DK -1505517568,1505525759,RU -1505525760,1505533951,IT -1505533952,1505542143,RU -1505542144,1505550335,PL -1505550336,1505566719,RU -1505566720,1505574911,IT -1505574912,1505583103,YE -1505583104,1505607679,RU -1505607680,1505615871,SE -1505615872,1505624063,SA -1505624064,1505632255,FI -1505632256,1505644799,CZ -1505644800,1505645055,PL -1505645056,1505646847,CZ -1505646848,1505647103,PL -1505647104,1505648639,CZ -1505648640,1505656831,LT -1505665024,1505666611,IT -1505666612,1505666615,AT -1505666616,1505673215,IT -1505673216,1505681407,BG -1505681408,1505689599,RU -1505689600,1505697791,NO -1505697792,1505705983,IE -1505705984,1505714175,DE -1505714176,1505722367,LV -1505722368,1505738751,PL -1505738752,1505745159,GB -1505745160,1505745160,GR -1505745161,1505745161,HR -1505745162,1505745162,HU -1505745163,1505745163,AE -1505745164,1505745164,JO -1505745165,1505745165,KE -1505745166,1505745166,KW -1505745167,1505745167,KZ -1505745168,1505745343,GB -1505745344,1505745344,US -1505745345,1505745346,GB -1505745347,1505745347,CA -1505745348,1505746943,GB -1505746944,1505748991,RU -1505748992,1505751039,DE -1505751040,1505755135,RU -1505755136,1506017279,GB -1506017280,1506082815,IR -1506082816,1506148351,GB -1506148352,1506279423,IR -1506279424,1506312191,NL -1506312192,1506316287,GB -1506316288,1506322431,PL -1506322432,1506324479,DE -1506324480,1506328575,RU -1506328576,1506330623,FI -1506330624,1506332671,NL -1506332672,1506334719,PL -1506334720,1506336767,GB -1506336768,1506338815,PL -1506338816,1506340863,UA -1506340864,1506342911,RO -1506342912,1506344959,UA -1506344960,1506377727,LV -1506377728,1506410495,HR -1506410496,1506422063,DE -1506422064,1506422079,GB -1506422080,1506443263,DE -1506443264,1506444397,GB -1506444398,1506444398,DE -1506444399,1506444757,GB -1506444758,1506444758,DE -1506444759,1506445103,GB -1506445104,1506445119,DE -1506445120,1506445135,GB -1506445136,1506445151,DE -1506445152,1506445167,GB -1506445168,1506445183,DE -1506445184,1506445199,GB -1506445200,1506445215,DE -1506445216,1506446143,GB -1506446144,1506446151,FR -1506446152,1506446823,GB -1506446824,1506446831,NL -1506446832,1506448319,GB -1506448320,1506448383,IT -1506448384,1506449263,GB -1506449264,1506449279,BE -1506449280,1506449935,GB -1506449936,1506449943,CH -1506449944,1506450047,GB -1506450048,1506450111,CH -1506450112,1506451071,GB -1506451072,1506451135,DK -1506451136,1506451839,GB -1506451840,1506451871,ES -1506451872,1506452095,GB -1506452096,1506452127,PT -1506452128,1506453311,GB -1506453312,1506453319,SE -1506453320,1506455507,GB -1506455508,1506455511,IT -1506455512,1506456533,GB -1506456534,1506456534,IT -1506456535,1506456771,GB -1506456772,1506456775,IE -1506456776,1506456815,GB -1506456816,1506456819,IE -1506456820,1506456959,GB -1506456960,1506456975,IT -1506456976,1506458244,GB -1506458245,1506458245,CH -1506458246,1506458359,GB -1506458360,1506458367,CH -1506458368,1506459207,GB -1506459208,1506459247,BE -1506459248,1506459295,GB -1506459296,1506459327,BE -1506459328,1506459763,GB -1506459764,1506459767,FR -1506459768,1506459968,GB -1506459969,1506459969,FR -1506459970,1506460151,GB -1506460152,1506460159,FR -1506460160,1506460679,GB -1506460680,1506460683,IT -1506460684,1506462511,GB -1506462512,1506462527,FR -1506462528,1506462719,GB -1506462720,1506462975,IT -1506462976,1506463035,GB -1506463036,1506463039,IT -1506463040,1506463551,GB -1506463552,1506463615,DE -1506463616,1506463679,GB -1506463680,1506463695,DE -1506463696,1506463719,GB -1506463720,1506463727,DE -1506463728,1506464999,GB -1506465000,1506465007,NL -1506465008,1506465187,GB -1506465188,1506465188,NL -1506465189,1506466383,GB -1506466384,1506466391,DE -1506466392,1506466431,GB -1506466432,1506466559,DE -1506466560,1506469663,GB -1506469664,1506469695,IT -1506469696,1506469759,GB -1506469760,1506469775,IT -1506469776,1506471423,GB -1506471424,1506471679,IT -1506471680,1506471871,GB -1506471872,1506471903,IT -1506471904,1506475873,GB -1506475874,1506475874,DE -1506475875,1506476031,GB -1506476032,1506508799,KW -1506508800,1506541567,CZ -1506541568,1506574335,RU -1506574336,1506582527,DE -1506582528,1506607103,IE -1506607104,1506639871,MK -1506639872,1506672639,NL -1506672640,1506689023,PL -1506689024,1506705407,CH -1506705408,1506727935,GB -1506727936,1506728959,FR -1506728960,1506740223,GB -1506742272,1506744319,SE -1506744320,1506746367,NL -1506746368,1506750463,RU -1506750464,1506752511,GB -1506752512,1506754559,IE -1506754560,1506758655,RU -1506758656,1506760703,IT -1506760704,1506764799,RU -1506764800,1506766847,IT -1506766848,1506768895,NO -1506768896,1506770943,AT -1506770944,1506772991,NL -1506772992,1506775039,GB -1506775040,1506777087,AT -1506777088,1506783231,GB -1506785280,1506787327,BE -1506787328,1506789375,ME -1506789376,1506791423,DE -1506791424,1506793471,GB -1506793472,1506795519,RU -1506795520,1506799615,CH -1506799616,1506801663,LV -1506801664,1506803711,DE -1506803712,1506869247,RU -1506869248,1506934783,UA -1506934784,1507000319,GR -1507000320,1507065855,QA -1507065856,1507131391,SI -1507131392,1507196927,GB -1507196928,1507262463,PT -1507262464,1507327999,BG -1507328000,1507393535,RS -1507393536,1507459071,CH -1507459072,1507524607,KZ -1507524608,1507525631,EE -1507525632,1507533823,KZ -1507533824,1507540991,AZ -1507540992,1507557375,IR -1507557376,1507558399,EE -1507558400,1507558911,AZ -1507558912,1507564287,EE -1507564288,1507565823,AZ -1507565824,1507566335,EE -1507566336,1507567615,AZ -1507567616,1507567871,EE -1507567872,1507573759,AZ -1507573760,1507590143,IR -1507590144,1507655679,NL -1507655680,1507659775,DE -1507659776,1507663871,RU -1507663872,1507665791,IT -1507665792,1507665919,GR -1507665920,1507667967,IT -1507667968,1507672063,RU -1507672064,1507676159,EE -1507676160,1507680255,IR -1507680256,1507684351,NO -1507684352,1507688447,LV -1507688448,1507696639,IT -1507696640,1507700735,DK -1507700736,1507704831,NL -1507704832,1507708927,RU -1507708928,1507713023,CZ -1507713024,1507717119,RU -1507717120,1507717631,SE -1507717632,1507718911,NO -1507718912,1507721215,SE -1507721216,1507753983,GB -1507753984,1507819519,RU -1507819520,1507852287,HU -1507852288,1508114431,FR -1508114432,1508376575,PL -1508376576,1508392959,GE -1508392960,1508442111,RU -1508442112,1508458495,DK -1508458496,1508466687,DE -1508466688,1508468735,NO -1508468736,1508470783,NL -1508470784,1508474879,SI -1508474880,1508491263,CZ -1508491264,1508507647,SE -1508507648,1508524031,GB -1508524032,1508540415,IE -1508540416,1508546047,FR -1508546048,1508546303,CI -1508546304,1508556799,FR -1508556800,1508573183,PL -1508573184,1508589567,CZ -1508589568,1508605951,IR -1508605952,1508622335,RU -1508622336,1508638719,EE -1508638720,1508642175,SE -1508642176,1508642303,DK -1508642304,1508647691,SE -1508647692,1508647692,DK -1508647693,1508655103,SE -1508655104,1508671487,FI -1508671488,1508687871,CH -1508687872,1508704255,UZ -1508704256,1508720639,RU -1508720640,1508737023,IL -1508737024,1508753407,SA -1508753408,1508769791,KG -1508769792,1508786175,PL -1508786176,1508802559,DE -1508802560,1508807231,GB -1508807232,1508807247,CZ -1508807248,1508811191,GB -1508811192,1508811195,NL -1508811196,1508812519,GB -1508812520,1508812527,CZ -1508812528,1508815103,GB -1508815104,1508815359,NL -1508815360,1508815615,ES -1508815616,1508817151,GB -1508817152,1508817407,NL -1508817408,1508817663,CZ -1508817664,1508818735,GB -1508818736,1508818743,IE -1508818744,1508818943,GB -1508818944,1508830719,RO -1508830720,1508831487,SK -1508831488,1508835327,RO -1508835328,1508843519,CZ -1508843520,1508847615,PS -1508847616,1508851711,US -1508851712,1508868095,PL -1508868096,1508884479,RU -1508884480,1508900863,DK -1508900864,1509163007,GB -1509163008,1509425151,DE -1509425152,1509429247,NO -1509429248,1509433343,GB -1509433344,1509437439,CH -1509437440,1509443583,GB -1509443584,1509445631,FR -1509445632,1509449727,LV -1509449728,1509453823,ES -1509453824,1509457919,RU -1509457920,1509462015,NL -1509462016,1509466111,LI -1509466112,1509469749,SC -1509469750,1509469750,NL -1509469751,1509470207,SC -1509470208,1509478399,RU -1509478400,1509482495,FR -1509482496,1509486591,RU -1509486592,1509490687,CZ -1509490688,1509494783,DK -1509494784,1509498879,RU -1509498880,1509502463,DE -1509502464,1509502719,CH -1509502720,1509502975,DE -1509502976,1509507071,RU -1509507072,1509507199,GB -1509507200,1509507583,DE -1509507584,1509509375,GB -1509509376,1509509503,DE -1509509504,1509509631,BE -1509509632,1509511167,GB -1509511168,1509515263,LT -1509515264,1509519359,HR -1509519360,1509535743,RU -1509535744,1509537791,IT -1509537792,1509539839,AT -1509539840,1509543935,AM -1509543936,1509548031,LB -1509548032,1509564415,RU -1509564416,1509568511,GB -1509568512,1509572607,FI -1509572608,1509576703,NL -1509576704,1509580799,KZ -1509580800,1509584895,CZ -1509584896,1509588991,NO -1509588992,1509593087,DE -1509593088,1509601279,RU -1509601280,1509605375,NL -1509605376,1509609471,PL -1509609472,1509617663,RU -1509617664,1509621759,CZ -1509621760,1509625855,US -1509625856,1509629951,UA -1509629952,1509634047,HU -1509634048,1509638143,FR -1509638144,1509642239,RU -1509642240,1509646335,KW -1509646336,1509650431,RU -1509650432,1509654527,GB -1509654528,1509658623,DE -1509658624,1509666815,RU -1509666816,1509670911,IT -1509670912,1509679103,GB -1509679104,1509683199,ES -1509683200,1509687295,CH -1509687296,1509703679,UA -1509703680,1509720063,RU -1509720064,1509736447,TR -1509736448,1509752831,BG -1509752832,1509769215,RU -1509769216,1509785599,SE -1509785600,1509801983,BG -1509801984,1509818367,RU -1509818368,1509851135,NO -1509851136,1509867519,LV -1509867520,1509883903,RU -1509883904,1509900287,NL -1509900288,1509916671,RU -1509916672,1509933055,GB -1509933056,1509935103,CH -1509935104,1509941247,NL -1509941248,1509947391,SE -1509947392,1509947647,NL -1509947648,1509947903,US -1509947904,1509948159,DE -1509948160,1509948415,US -1509948416,1509948671,ES -1509948672,1509949439,NL -1509949440,1510604799,FR -1510604800,1510605311,RE -1510605312,1510605823,FR -1510605824,1510606079,RE -1510606080,1510607103,FR -1510607104,1510609663,RE -1510609664,1510610175,FR -1510610176,1510610431,RE -1510610432,1510611199,FR -1510611200,1510611711,RE -1510611712,1510611967,FR -1510611968,1510612223,RE -1510612224,1510613247,FR -1510613248,1510614015,RE -1510614016,1510614271,FR -1510614272,1510614783,RE -1510614784,1510615295,FR -1510615296,1510615551,RE -1510615552,1510615807,FR -1510615808,1510616063,RE -1510616064,1510616575,FR -1510616576,1510616831,RE -1510616832,1510617087,FR -1510617088,1510617343,RE -1510617344,1510617599,FR -1510617600,1510618367,RE -1510618368,1510618879,FR -1510618880,1510619135,RE -1510619136,1510619391,FR -1510619392,1510620415,RE -1510620416,1510620671,FR -1510620672,1510620927,RE -1510620928,1510621183,FR -1510621184,1510621439,RE -1510621440,1510621951,FR -1510621952,1510622975,RE -1510622976,1510623999,FR -1510624000,1510624255,RE -1510624256,1510624511,FR -1510624512,1510625279,RE -1510625280,1510625535,FR -1510625536,1510625791,RE -1510625792,1510626047,FR -1510626048,1510626559,RE -1510626560,1510627071,FR -1510627072,1510627327,RE -1510627328,1510627839,FR -1510627840,1510628351,RE -1510628352,1510628863,FR -1510628864,1510630399,RE -1510630400,1510630655,FR -1510630656,1510630911,RE -1510630912,1510631679,FR -1510631680,1510632703,RE -1510632704,1510632959,FR -1510632960,1510635263,RE -1510635264,1510635519,FR -1510635520,1510636031,RE -1510636032,1510636287,FR -1510636288,1510637311,RE -1510637312,1510637567,FR -1510637568,1510637823,RE -1510637824,1510638335,FR -1510638336,1510638591,RE -1510638592,1510638847,FR -1510638848,1510639103,RE -1510639104,1510639871,FR -1510639872,1510640639,RE -1510640640,1510640895,FR -1510640896,1510641151,RE -1510641152,1510641407,FR -1510641408,1510641663,RE -1510641664,1510641919,FR -1510641920,1510642431,RE -1510642432,1510642687,FR -1510642688,1510643455,RE -1510643456,1510644735,FR -1510644736,1510645247,RE -1510645248,1510645503,FR -1510645504,1510648319,RE -1510648320,1510648831,FR -1510648832,1510649087,RE -1510649088,1510649599,FR -1510649600,1510649855,RE -1510649856,1510650111,FR -1510650112,1510650367,RE -1510650368,1510650623,FR -1510650624,1510653183,RE -1510653184,1510653695,FR -1510653696,1510654463,RE -1510654464,1510654719,FR -1510654720,1510655231,RE -1510655232,1510655487,FR -1510655488,1510655743,RE -1510655744,1510655999,FR -1510656000,1510656255,RE -1510656256,1510657279,FR -1510657280,1510657535,RE -1510657536,1510658047,FR -1510658048,1510658303,RE -1510658304,1510658559,FR -1510658560,1510659583,RE -1510659584,1510660095,FR -1510660096,1510661119,RE -1510661120,1510661375,FR -1510661376,1510661887,RE -1510661888,1510662143,FR -1510662144,1510662655,RE -1510662656,1510662911,FR -1510662912,1510663423,RE -1510663424,1510663935,FR -1510663936,1510664191,RE -1510664192,1510664447,FR -1510664448,1510664703,RE -1510664704,1510664959,FR -1510664960,1510665727,RE -1510665728,1510666239,FR -1510666240,1510666495,RE -1510666496,1510667263,FR -1510667264,1510668031,RE -1510668032,1510668403,FR -1510668404,1510668404,RE -1510668405,1510668543,FR -1510668544,1510669311,RE -1510669312,1510669567,FR -1510669568,1510670079,RE -1510670080,1511981311,FR -1511981312,1511984127,GP -1511984128,1511984383,FR -1511984384,1511985919,GP -1511985920,1511986175,FR -1511986176,1511986431,GP -1511986432,1511986943,FR -1511986944,1511987455,GP -1511987456,1511987967,FR -1511987968,1511989759,GP -1511989760,1511990015,FR -1511990016,1511991295,GP -1511991296,1511991807,FR -1511991808,1511993343,GP -1511993344,1511993599,FR -1511993600,1511994623,GP -1511994624,1511994879,FR -1511994880,1511995391,GP -1511995392,1511995647,FR -1511995648,1511996415,GP -1511996416,1511996671,FR -1511996672,1511996927,GP -1511996928,1511997439,FR -1511997440,1511997695,MF -1511997696,1511998719,FR -1511998720,1511998975,MF -1511998976,1511999231,BL -1511999232,1511999743,FR -1511999744,1511999999,BL -1512000000,1512000767,FR -1512000768,1512001023,MF -1512001024,1512001535,FR -1512001536,1512001791,MF -1512001792,1512002559,FR -1512002560,1512002815,MF -1512002816,1512003327,FR -1512003328,1512003583,MF -1512003584,1512004095,FR -1512004096,1512004351,MF -1512004352,1512004607,BL -1512004608,1512004863,FR -1512004864,1512005375,BL -1512005376,1512006143,MF -1512006144,1512006911,BL -1512006912,1512008959,FR -1512008960,1512009215,MF -1512009216,1512012031,FR -1512012032,1512012287,BL -1512012288,1512013823,FR -1512013824,1512015359,GF -1512015360,1512015615,FR -1512015616,1512018431,GF -1512018432,1512018687,FR -1512018688,1512018943,GF -1512018944,1512019711,FR -1512019712,1512021759,GF -1512021760,1512022015,FR -1512022016,1512026623,GF -1512026624,1512026879,FR -1512026880,1512027135,GF -1512027136,1512027391,FR -1512027392,1512027647,GF -1512027648,1512027903,FR -1512027904,1512028671,GF -1512028672,1512028927,FR -1512028928,1512029951,GF -1512029952,1512030207,FR -1512030208,1512046591,MQ -1512046592,1512308735,FR -1512308736,1512309759,GP -1512309760,1512310015,FR -1512310016,1512310271,GP -1512310272,1512310527,FR -1512310528,1512311039,GP -1512311040,1512311295,FR -1512311296,1512312575,GP -1512312576,1512313087,FR -1512313088,1512313343,GP -1512313344,1512313599,FR -1512313600,1512313855,GP -1512313856,1512315135,FR -1512315136,1512315903,GP -1512315904,1512316415,FR -1512316416,1512317695,GP -1512317696,1512317951,FR -1512317952,1512318719,GP -1512318720,1512319231,FR -1512319232,1512319487,GP -1512319488,1512319743,FR -1512319744,1512320511,GP -1512320512,1512321279,FR -1512321280,1512321535,GP -1512321536,1512321791,FR -1512321792,1512322047,GP -1512322048,1512322303,FR -1512322304,1512322559,GP -1512322560,1512322815,FR -1512322816,1512323071,GP -1512323072,1512324095,FR -1512324096,1512324607,GP -1512324608,1512325631,FR -1512325632,1512326143,GP -1512326144,1512329215,FR -1512329216,1512329471,GP -1512329472,1512329983,FR -1512329984,1512330495,GP -1512330496,1512330751,FR -1512330752,1512331263,GP -1512331264,1512331519,FR -1512331520,1512331775,GP -1512331776,1512332031,FR -1512332032,1512332543,GP -1512332544,1512332799,FR -1512332800,1512333055,GP -1512333056,1512337407,FR -1512337408,1512338175,GP -1512338176,1512338431,FR -1512338432,1512338687,GP -1512338688,1512338943,FR -1512338944,1512339967,GP -1512339968,1512340735,FR -1512340736,1512341247,GP -1512341248,1512342015,FR -1512342016,1512343039,GP -1512343040,1512344319,FR -1512344320,1512345855,GP -1512345856,1512346111,FR -1512346112,1512346367,GP -1512346368,1512347391,FR -1512347392,1512348671,GP -1512348672,1512348927,FR -1512348928,1512349951,GP -1512349952,1512350463,FR -1512350464,1512350719,GP -1512350720,1512350975,FR -1512350976,1512353791,GP -1512353792,1512354047,FR -1512354048,1512354559,GP -1512354560,1512355071,FR -1512355072,1512355583,GP -1512355584,1512356095,FR -1512356096,1512356607,GP -1512356608,1512357119,FR -1512357120,1512357887,GP -1512357888,1512358655,FR -1512358656,1512358911,GP -1512358912,1512362239,FR -1512362240,1512362495,GP -1512362496,1512362751,FR -1512362752,1512363263,GP -1512363264,1512363519,FR -1512363520,1512364031,GP -1512364032,1512364287,FR -1512364288,1512365055,GP -1512365056,1512365311,FR -1512365312,1512365567,GP -1512365568,1512365823,FR -1512365824,1512366335,GP -1512366336,1512369151,FR -1512369152,1512370441,GP -1512370442,1512370442,FR -1512370443,1512370943,GP -1512370944,1512371199,FR -1512371200,1512372735,GP -1512372736,1512373247,FR -1512373248,1512374015,GP -1512374016,1513892207,FR -1513892208,1513892208,ES -1513892209,1514143743,FR -1514143744,1514176511,SK -1514176512,1514405887,FR -1514405888,1514536959,ES -1514536960,1514602495,FR -1514602496,1514668031,ES -1514668032,1514799103,FR -1514799104,1514930175,ES -1514930176,1514995711,FR -1514995712,1515061247,ES -1515061248,1515467007,FR -1515467008,1515467263,ES -1515467264,1515467519,FR -1515467520,1515468031,US -1515468032,1515468287,ES -1515468288,1515468543,NL -1515468544,1515468799,DE -1515468800,1515469823,FR -1515469824,1515470079,DE -1515470080,1515470335,FR -1515470336,1515470847,US -1515470848,1515488511,FR -1515488512,1515489023,US -1515489024,1515489039,DE -1515489040,1515489055,FR -1515489056,1515489087,DE -1515489088,1515489151,FR -1515489152,1515489167,ES -1515489168,1515489535,FR -1515489536,1515489791,US -1515489792,1515491007,NL -1515491008,1515511807,FR -1515511808,1515515903,RO -1515515904,1516109823,FR -1516109824,1516175359,ES -1516175360,1516240895,RO -1516240896,1516896255,FR -1516896256,1516961791,ES -1516961792,1518338047,FR -1518338048,1518370815,LV -1518370816,1518419967,NL -1518419968,1518436351,SE -1518436352,1518446874,NL -1518446875,1518446875,NO -1518446876,1518452735,NL -1518452736,1518460927,AT -1518460928,1518469119,LV -1518469120,1518472191,SE -1518472192,1518475263,LT -1518475264,1518476287,SE -1518476288,1518476799,EE -1518476800,1518477311,SE -1518477312,1518481407,EE -1518481408,1518493695,SE -1518493696,1518501887,LV -1518501888,1518503935,EE -1518503936,1518510079,LT -1518510080,1518540543,SE -1518540544,1518540799,LT -1518540800,1518541479,SE -1518541480,1518541480,DE -1518541481,1518542847,SE -1518542848,1518565375,LT -1518565376,1518567423,SE -1518567424,1518575615,LV -1518575616,1518583807,LT -1518583808,1518600191,HR -1518600192,1518641151,SE -1518641152,1518649343,HR -1518649344,1518665727,SE -1518665728,1518698495,LV -1518698496,1518698496,LT -1518698497,1518698960,LV -1518698961,1518698961,LT -1518698962,1518700749,LV -1518700750,1518700750,LT -1518700751,1518706687,LV -1518706688,1518706688,LT -1518706689,1518708837,LV -1518708838,1518708838,LT -1518708839,1518709552,LV -1518709553,1518709553,LT -1518709554,1518723071,LV -1518723072,1518727167,EE -1518727168,1518731263,SE -1518731264,1518780415,LT -1518780416,1518796799,HR -1518796800,1518862335,LT -1518862336,1518927871,SE -1518927872,1518961663,LT -1518961664,1518962175,EE -1518962176,1518962687,LV -1518962688,1518966783,HR -1518966784,1518967807,SE -1518967808,1518977023,HR -1518977024,1518985215,LT -1518985216,1518989311,SE -1518989312,1519058943,LT -1519058944,1519083519,LV -1519083520,1519084879,SE -1519084880,1519084895,EE -1519084896,1519091711,SE -1519091712,1519124479,LV -1519124480,1519198207,LT -1519198208,1519200255,SE -1519200256,1519206399,EE -1519206400,1519208703,SE -1519208704,1519209471,LV -1519209472,1519210495,SE -1519210496,1519222783,LT -1519222784,1519271935,SE -1519271936,1519288319,NL -1519288320,1519292415,SE -1519292416,1519294463,LT -1519294464,1519296511,SE -1519296512,1519304703,LT -1519304704,1519308799,NL -1519308800,1519321087,LT -1519321088,1519337471,KZ -1519337472,1519352822,LT -1519352823,1519352823,KZ -1519352824,1519353855,LT -1519353856,1519370239,KZ -1519370240,1519394815,SE -1519394816,1519398911,HR -1519398912,1519403007,SE -1519403008,1519411199,LT -1519411200,1519419391,NL -1519419392,1519452159,SE -1519452160,1519517695,NL -1519517696,1519583231,AT -1519583232,1519648767,IT -1519648768,1519714303,SA -1519714304,1519779839,NO -1519779840,1519910911,RU -1519910912,1519936191,GB -1519936192,1519936255,DK -1519936256,1519943679,GB -1519943680,1519976447,AT -1519976448,1520009215,DE -1520009216,1520017407,LB -1520017408,1520041983,SY -1520041984,1520074751,RU -1520074752,1520107519,BG -1520107520,1520140287,GB -1520140288,1520173055,RU -1520173056,1520205823,PL -1520205824,1520230399,RU -1520230400,1520234495,NL -1520234496,1520271359,RU -1520271360,1520304127,SI -1520304128,1520435199,TR -1520435200,1521483775,ES -1521483776,1521491967,SK -1521491968,1522008063,CZ -1522008064,1522139135,DK -1522139136,1522270207,DE -1522270208,1522401279,RU -1522401280,1522532351,EE -1522532352,1524629503,GB -1524629504,1525678079,SE -1525678080,1526726655,GB -1526726656,1531183103,DE -1531183104,1531445247,FR -1531445248,1531707391,AE -1531707392,1531969535,RU -1531969536,1532100607,IT -1532100608,1532199935,HU -1532199936,1532200959,RS -1532200960,1532231679,HU -1532231680,1532362751,GB -1532362752,1532493823,BE -1532493824,1532559359,FR -1532559360,1532624895,DE -1532624896,1532626943,ES -1532626944,1532631039,UA -1532631040,1532633087,SE -1532633088,1532635135,RU -1532635136,1532637183,NO -1532637184,1532639231,FI -1532639232,1532641279,PL -1532641280,1532643327,NO -1532643328,1532645375,PL -1532647424,1532649471,PL -1532649472,1532651519,FR -1532651520,1532653567,NO -1532653568,1532655615,PL -1532655616,1532657663,RO -1532657664,1532661759,IL -1532661760,1532665855,DE -1532665856,1532674047,PL -1532674048,1532675071,NL -1532675072,1532682239,UA -1532682240,1532690431,LV -1532690432,1532755967,FR -1532755968,1532756223,GR -1532756224,1532756479,RO -1532756480,1532756735,UA -1532756736,1532756991,BG -1532756992,1532757503,DE -1532757504,1532760319,BG -1532760320,1532761343,DE -1532761344,1532761599,BG -1532761600,1532762111,DE -1532762112,1532774143,BG -1532774144,1532774399,CH -1532774400,1532782591,BG -1532782592,1532782847,IR -1532782848,1532784639,BG -1532784640,1532785151,NL -1532785152,1532785407,IR -1532785408,1532785663,BG -1532785664,1532786687,IT -1532786688,1532786943,BG -1532786944,1532788735,IR -1532788736,1532788991,BG -1532788992,1532790783,IR -1532790784,1532793087,BG -1532793088,1532794879,IR -1532794880,1532795903,BG -1532795904,1532796927,IR -1532796928,1532797951,BG -1532797952,1532798975,IR -1532798976,1532799999,BG -1532800000,1532801023,IR -1532801024,1532801535,SA -1532801536,1532802047,DE -1532802048,1532805631,IR -1532805632,1532808191,BG -1532808192,1532811263,IR -1532811264,1532812031,BG -1532812032,1532812287,RO -1532812288,1532813311,IR -1532813312,1532814335,DE -1532814336,1532814847,IR -1532814848,1532815103,BG -1532815104,1532815359,IR -1532815360,1532816383,BG -1532816384,1532817407,IR -1532817408,1532821503,BG -1532821504,1532887039,TR -1532887040,1532952575,PL -1532952576,1533018111,SE -1533018112,1533149183,DE -1533149184,1533280255,IR -1533280256,1533411327,DK -1533411328,1533413375,GB -1533413376,1533415423,DE -1533415424,1533417471,SA -1533417472,1533419519,NO -1533419520,1533421567,KW -1533421568,1533423615,NL -1533423616,1533425663,IT -1533425664,1533429759,GB -1533429760,1533431807,RU -1533431808,1533433855,IE -1533433856,1533435903,DK -1533435904,1533437951,CZ -1533437952,1533442047,PL -1533442048,1533444095,AE -1533444096,1533446143,IT -1533446144,1533448191,DE -1533448192,1533450239,KW -1533450240,1533452287,RU -1533452288,1533454335,TR -1533454336,1533456383,RS -1533456384,1533458431,UA -1533458432,1533460479,GB -1533460480,1533462527,CH -1533462528,1533464575,RU -1533464576,1533466623,NL -1533466624,1533468671,RU -1533468672,1533470719,RS -1533470720,1533472767,KW -1533472768,1533474815,ES -1533474816,1533476863,FR -1533476864,1533478911,IE -1533480960,1533481983,NL -1533481984,1533482495,GB -1533482496,1533482751,NL -1533482752,1533483007,GB -1533483008,1533485055,AM -1533485056,1533485823,GB -1533485824,1533486335,DE -1533486336,1533486719,NO -1533486720,1533486783,DK -1533486784,1533487103,FI -1533487104,1533488639,FR -1533488640,1533488895,US -1533488896,1533489151,FR -1533489152,1533491199,ES -1533491200,1533493247,AM -1533493248,1533497343,RU -1533499392,1533501439,MT -1533501440,1533503487,LT -1533503488,1533505535,RU -1533505536,1533507583,DE -1533507584,1533509631,UA -1533509632,1533511679,GB -1533511680,1533513727,FR -1533515776,1533517823,RU -1533517824,1533519871,CZ -1533519872,1533526015,GB -1533526016,1533532159,RU -1533532160,1533534207,GB -1533534208,1533536255,RU -1533536256,1533538303,FR -1533538304,1533540351,DE -1533542400,1533607935,HU -1533607936,1533640703,LV -1533640704,1533659135,RU -1533659136,1533660159,LV -1533660160,1533661183,UA -1533661184,1533663231,SE -1533663232,1533665279,NL -1533665280,1533667327,GB -1533667328,1533669375,RU -1533669376,1533671423,DE -1533671424,1533673471,FI -1533673472,1533677567,DE -1533677568,1533679615,ES -1533679616,1533680127,PL -1533680128,1533680383,ES -1533680384,1533681663,PL -1533681664,1533689855,IQ -1533689856,1533698047,IR -1533698048,1533702143,JO -1533702144,1533704191,RU -1533704192,1533722623,DE -1533722624,1533724671,SE -1533724672,1533726719,RU -1533726720,1533728767,CY -1533730816,1533732863,NL -1533732864,1533734911,RU -1533734912,1533739007,CZ -1533739008,1533739263,IR -1533739264,1533757439,RU -1533757440,1533759487,NL -1533759488,1533761535,RU -1533761536,1533763583,NL -1533763584,1533768703,RU -1533768704,1533768959,GB -1533768960,1533769727,RU -1533769728,1533770751,GB -1533770752,1533771519,RU -1533771520,1533771775,GB -1533771776,1533804543,IR -1533804544,1533805567,RU -1533805568,1533807615,NL -1533807616,1533808639,US -1533808640,1533816831,RU -1533816832,1533818879,GB -1533818880,1533819903,NL -1533819904,1533820927,RU -1533820928,1533829119,DE -1533829120,1533833215,NO -1533833216,1533845503,IR -1533845504,1533847551,GB -1533847552,1533849599,RU -1533849600,1533851135,SE -1533851136,1533851391,PL -1533851392,1533851647,SE -1533851648,1533851807,CH -1533851808,1533851839,HK -1533851840,1533851871,CH -1533851872,1533851887,AU -1533851888,1533851903,CH -1533851904,1533851919,DE -1533851920,1533851923,FR -1533851924,1533851935,CH -1533851936,1533851939,GB -1533851940,1533851951,CH -1533851952,1533851955,IT -1533851956,1533851967,CH -1533851968,1533851971,PL -1533851972,1533851983,CH -1533851984,1533851987,BR -1533851988,1533852191,CH -1533852192,1533852195,IN -1533852196,1533852223,CH -1533852224,1533852239,RU -1533852240,1533852675,CH -1533852676,1533852687,ES -1533852688,1533852711,FR -1533852712,1533852719,CH -1533852720,1533852731,AR -1533852732,1533852739,NL -1533852740,1533852757,FR -1533852758,1533852767,GB -1533852768,1533852783,BR -1533852784,1533852829,GB -1533852830,1533852849,ZA -1533852850,1533852864,BE -1533852865,1533852869,CH -1533852870,1533852889,AU -1533852890,1533852909,SG -1533852910,1533852917,ES -1533852918,1533852925,AR -1533852926,1533853695,CH -1533853696,1533854207,GB -1533854208,1533855231,IR -1533855232,1533857791,GB -1533857792,1533859839,IR -1533859840,1533864959,IQ -1533864960,1533874175,GB -1533874176,1533878271,DE -1533878272,1533880319,CZ -1533880320,1533882367,GB -1533882368,1533886463,IT -1533886464,1533894655,RU -1533894656,1533896703,ES -1533896704,1533898751,IR -1533898752,1533899775,PT -1533899776,1533900031,GB -1533900032,1533900799,PT -1533900800,1533902847,FR -1533902848,1533911039,RU -1533911040,1533913087,ES -1533913088,1533915135,IT -1533915136,1533919231,NL -1533919232,1533921279,IT -1533921280,1533923327,RU -1533923328,1533925375,TR -1533925376,1533927423,AF -1533927424,1533929471,RU -1533929472,1533932799,GB -1533932800,1533933055,DE -1533933056,1534066687,GB -1534066688,1534328831,AT -1534328832,1534459903,ES -1534459904,1534590975,AT -1534590976,1534656511,HU -1534656512,1534711807,FR -1534711808,1534712831,BE -1534712832,1534713855,FR -1534713856,1534713887,PT -1534713888,1534714111,FR -1534714112,1534714115,ES -1534714116,1534714119,FR -1534714120,1534714123,FI -1534714124,1534714143,FR -1534714144,1534714159,GB -1534714160,1534714415,FR -1534714416,1534714431,ES -1534714432,1534714639,FR -1534714640,1534714655,IE -1534714656,1534714687,ES -1534714688,1534714691,FR -1534714692,1534714695,GB -1534714696,1534714751,FR -1534714752,1534714767,DE -1534714768,1534714871,FR -1534714872,1534714875,ES -1534714876,1534715207,FR -1534715208,1534715211,GB -1534715212,1534715215,FR -1534715216,1534715231,GB -1534715232,1534715551,FR -1534715552,1534715567,PT -1534715568,1534715583,FR -1534715584,1534715599,GB -1534715600,1534715871,FR -1534715872,1534715875,ES -1534715876,1534716063,FR -1534716064,1534716095,PT -1534716096,1534716099,DE -1534716100,1534716111,FR -1534716112,1534716115,DE -1534716116,1534716239,FR -1534716240,1534716255,GB -1534716256,1534716319,FR -1534716320,1534716351,GB -1534716352,1534716375,FR -1534716376,1534716379,ES -1534716380,1534716391,FR -1534716392,1534716395,ES -1534716396,1534716399,GB -1534716400,1534716495,FR -1534716496,1534716511,ES -1534716512,1534716655,FR -1534716656,1534716663,IE -1534716664,1534717191,FR -1534717192,1534717199,FI -1534717200,1534717215,GB -1534717216,1534717247,FR -1534717248,1534717251,ES -1534717252,1534717263,FR -1534717264,1534717267,ES -1534717268,1534717343,FR -1534717344,1534717359,GB -1534717360,1534717739,FR -1534717740,1534717743,GB -1534717744,1534717963,FR -1534717964,1534717967,PL -1534717968,1534717995,FR -1534717996,1534717999,GB -1534718000,1534718031,FR -1534718032,1534718047,ES -1534718048,1534718087,FR -1534718088,1534718091,ES -1534718092,1534718103,FR -1534718104,1534718111,ES -1534718112,1534718127,FR -1534718128,1534718143,ES -1534718144,1534718415,FR -1534718416,1534718419,ES -1534718420,1534718423,GB -1534718424,1534718719,FR -1534718720,1534718735,GB -1534718736,1534718763,FR -1534718764,1534718767,ES -1534718768,1534718783,FR -1534718784,1534718807,ES -1534718808,1534719071,FR -1534719072,1534719075,FI -1534719076,1534719339,FR -1534719340,1534719343,ES -1534719344,1534719679,FR -1534719680,1534719695,GB -1534719696,1534719703,FR -1534719704,1534719711,GB -1534719712,1534719739,FR -1534719740,1534719743,ES -1534719744,1534719747,FR -1534719748,1534719751,ES -1534719752,1534719783,FR -1534719784,1534719787,ES -1534719788,1534720011,FR -1534720012,1534720015,IE -1534720016,1534720023,FR -1534720024,1534720027,PL -1534720028,1534720079,FR -1534720080,1534720095,ES -1534720096,1534720175,FR -1534720176,1534720179,NL -1534720180,1534720183,ES -1534720184,1534720367,FR -1534720368,1534720375,ES -1534720376,1534720387,FR -1534720388,1534720391,FI -1534720392,1534720655,FR -1534720656,1534720663,ES -1534720664,1534720767,FR -1534720768,1534720783,ES -1534720784,1534720831,FR -1534720832,1534720863,GB -1534720864,1534721807,FR -1534721808,1534721823,GB -1534721824,1534721975,FR -1534721976,1534721979,FI -1534721980,1534722047,FR -1534722048,1534787583,RU -1534787584,1534791679,RO -1534791680,1534795775,RU -1534795776,1534803967,NO -1534803968,1534808063,LV -1534808064,1534812159,RU -1534812160,1534816255,CH -1534816256,1534820351,FR -1534820352,1534824447,FI -1534824448,1534828543,UA -1534828544,1534836735,PL -1534836736,1534840831,SE -1534840832,1534844927,PL -1534844928,1534849023,IE -1534849024,1534853119,NL -1534853120,1534918655,UA -1534918656,1534984191,GB -1534984192,1534988287,NO -1534988288,1535049727,ES -1535049728,1535115263,SK -1535115264,1535116287,AT -1535116288,1535123455,SE -1535123456,1535148031,HR -1535148032,1535197183,AT -1535197184,1535203359,EE -1535203360,1535205375,SE -1535205376,1535213567,EE -1535213568,1535246335,SE -1535246336,1535311871,AT -1535311872,1535344639,EE -1535344640,1535350783,SE -1535350784,1535352831,HR -1535352832,1535377407,EE -1535442944,1535451135,RU -1535451136,1535459327,DK -1535459328,1535475711,AT -1535475712,1535508479,IR -1535508480,1535509151,FR -1535509152,1535509183,IT -1535509184,1535509247,DE -1535509248,1535509279,FR -1535509280,1535509311,ES -1535509312,1535509487,FR -1535509488,1535509503,PT -1535509504,1535511615,FR -1535511616,1535511679,DE -1535511680,1535511871,FR -1535511872,1535511935,ES -1535511936,1535511999,FR -1535512000,1535512015,GB -1535512016,1535512095,FR -1535512096,1535512127,PL -1535512128,1535512779,FR -1535512780,1535512783,PL -1535512784,1535512799,FR -1535512800,1535512831,DE -1535512832,1535514767,FR -1535514768,1535514783,LT -1535514784,1535514895,FR -1535514896,1535514911,NL -1535514912,1535514943,FI -1535514944,1535515007,IE -1535515008,1535515055,FR -1535515056,1535515071,IT -1535515072,1535515231,FR -1535515232,1535515263,CZ -1535515264,1535515331,FR -1535515332,1535515335,ES -1535515336,1535515423,FR -1535515424,1535515455,IT -1535515456,1535515519,PL -1535515520,1535515647,GB -1535515648,1535515727,FR -1535515728,1535515735,NL -1535515736,1535515743,FR -1535515744,1535515775,PT -1535515776,1535515935,FR -1535515936,1535515967,LT -1535515968,1535521407,FR -1535521408,1535521535,NL -1535521536,1535537343,FR -1535537344,1535537407,DE -1535537408,1535537535,FR -1535537536,1535537663,ES -1535537664,1535537819,FR -1535537820,1535537823,PL -1535537824,1535537855,FR -1535537856,1535537919,IT -1535537920,1535538111,FR -1535538112,1535538175,FI -1535538176,1535538815,FR -1535538816,1535538879,IE -1535538880,1535540159,FR -1535540160,1535540223,CZ -1535540224,1535540799,FR -1535540800,1535540863,PL -1535540864,1535540991,BE -1535540992,1535542079,FR -1535542080,1535542143,FI -1535542144,1535542640,FR -1535542641,1535542641,BE -1535542642,1535545551,FR -1535545552,1535545567,PT -1535545568,1535545599,DE -1535545600,1535545855,GB -1535545856,1535545983,FR -1535545984,1535546111,IE -1535546112,1535546239,FR -1535546240,1535546367,IT -1535546368,1535546695,FR -1535546696,1535546703,ES -1535546704,1535547158,FR -1535547159,1535547159,IT -1535547160,1535547167,FR -1535547168,1535547183,IT -1535547184,1535547199,FR -1535547200,1535547207,ES -1535547208,1535547407,FR -1535547408,1535547423,DE -1535547424,1535547471,FR -1535547472,1535547487,LT -1535547488,1535548091,FR -1535548092,1535548095,PL -1535548096,1535548159,IT -1535548160,1535548223,FR -1535548224,1535548415,ES -1535548416,1535548463,FR -1535548464,1535548479,LT -1535548480,1535548991,FR -1535548992,1535549055,PT -1535549056,1535549151,FR -1535549152,1535549183,PL -1535549184,1535549279,FR -1535549280,1535549295,CZ -1535549296,1535549311,FR -1535549312,1535549439,NL -1535549440,1535549631,FR -1535549632,1535549695,PL -1535549696,1535550015,FR -1535550016,1535550079,IT -1535550080,1535550519,FR -1535550520,1535550523,DE -1535550524,1535550547,FR -1535550548,1535550551,DE -1535550552,1535550911,FR -1535550912,1535550927,BE -1535550928,1535551087,FR -1535551088,1535551103,ES -1535551104,1535551679,FR -1535551680,1535551695,GB -1535551696,1535551771,FR -1535551772,1535551772,CZ -1535551773,1535551807,FR -1535551808,1535551823,LT -1535551824,1535551843,FR -1535551844,1535551844,FI -1535551845,1535551903,FR -1535551904,1535551919,NL -1535551920,1535551999,FR -1535552000,1535552127,IT -1535552128,1535552215,FR -1535552216,1535552223,ES -1535552224,1535552463,FR -1535552464,1535552479,NL -1535552480,1535552895,FR -1535552896,1535553023,DE -1535553024,1535553343,FR -1535553344,1535553407,PL -1535553408,1535553471,FR -1535553472,1535553535,ES -1535553536,1535553727,FR -1535553728,1535553791,IT -1535553792,1535553983,FR -1535553984,1535554047,GB -1535554048,1535554287,FR -1535554288,1535554303,PL -1535554304,1535554367,FR -1535554368,1535554431,ES -1535554432,1535554559,DE -1535554560,1535554687,FR -1535554688,1535554815,IT -1535554816,1535554847,FR -1535554848,1535554863,PT -1535554864,1535555103,FR -1535555104,1535555135,LT -1535555136,1535555679,FR -1535555680,1535555711,PL -1535555712,1535555935,FR -1535555936,1535555951,ES -1535555952,1535556095,FR -1535556096,1535556159,ES -1535556160,1535556271,FR -1535556272,1535556287,GB -1535556288,1535556479,FR -1535556480,1535556607,NL -1535556608,1535556863,FR -1535556864,1535557119,GB -1535557120,1535557311,FR -1535557312,1535557375,PL -1535557376,1535558015,FR -1535558016,1535558143,ES -1535558144,1535558591,FR -1535558592,1535558655,DE -1535558656,1535558847,FR -1535558848,1535558911,PL -1535558912,1535559191,FR -1535559192,1535559199,ES -1535559200,1535559695,FR -1535559696,1535559711,IT -1535559712,1535559743,LT -1535559744,1535559807,FR -1535559808,1535559871,FI -1535559872,1535559935,FR -1535559936,1535560191,GB -1535560192,1535560287,FR -1535560288,1535560319,FI -1535560320,1535560511,FR -1535560512,1535560575,PT -1535560576,1535560703,DE -1535560704,1535560915,FR -1535560916,1535560919,PL -1535560920,1535561407,FR -1535561408,1535561471,CZ -1535561472,1535561567,FR -1535561568,1535561599,PL -1535561600,1535561695,FR -1535561696,1535561727,ES -1535561728,1535562303,FR -1535562304,1535562367,PL -1535562368,1535562403,FR -1535562404,1535562407,GB -1535562408,1535562591,FR -1535562592,1535562623,FI -1535562624,1535562699,FR -1535562700,1535562703,PT -1535562704,1535562719,FR -1535562720,1535562751,IT -1535562752,1535562879,FR -1535562880,1535563007,ES -1535563008,1535563371,FR -1535563372,1535563375,FI -1535563376,1535563407,FR -1535563408,1535563411,PL -1535563412,1535563455,FR -1535563456,1535563519,IE -1535563520,1535563711,FR -1535563712,1535563775,IT -1535563776,1535563903,FR -1535563904,1535564031,NL -1535564032,1535564351,FR -1535564352,1535564415,IE -1535564416,1535564543,BE -1535564544,1535564767,FR -1535564768,1535564799,PL -1535564800,1535565503,FR -1535565504,1535565567,IT -1535565568,1535565615,FR -1535565616,1535565623,ES -1535565624,1535565759,FR -1535565760,1535565823,CZ -1535565824,1535566143,FR -1535566144,1535566159,ES -1535566160,1535566655,FR -1535566656,1535566719,PL -1535566720,1535567551,FR -1535567552,1535567615,ES -1535567616,1535567871,GB -1535567872,1535567999,FR -1535568000,1535568127,DE -1535568128,1535568351,FR -1535568352,1535568383,LT -1535568384,1535569023,FR -1535569024,1535569151,ES -1535569152,1535569343,FR -1535569344,1535569407,PL -1535569408,1535570991,FR -1535570992,1535571007,LT -1535571008,1535571015,ES -1535571016,1535571071,FR -1535571072,1535571199,GB -1535571200,1535571263,BE -1535571264,1535571519,FR -1535571520,1535571583,ES -1535571584,1535571711,FR -1535571712,1535571743,PL -1535571744,1535571903,FR -1535571904,1535571967,NL -1535571968,1535572799,FR -1535572800,1535572831,IE -1535572832,1535573203,FR -1535573204,1535573207,FI -1535573208,1535573211,FR -1535573212,1535573215,GB -1535573216,1535573231,FR -1535573232,1535573247,PL -1535573248,1535573307,FR -1535573308,1535573311,NL -1535573312,1535573391,FR -1535573392,1535573407,ES -1535573408,1535573423,FR -1535573424,1535573439,CZ -1535573440,1535573503,PL -1535573504,1535573543,FR -1535573544,1535573547,LT -1535573548,1535574015,FR -1535574016,1535578111,GB -1535578112,1535582207,LV -1535582208,1535590399,NO -1535590400,1535591423,CH -1535591424,1535591679,NL -1535591680,1535593471,CH -1535593472,1535593727,HK -1535593728,1535594495,CH -1535594496,1535598591,LV -1535598592,1535602687,IL -1535602688,1535606783,HU -1535606784,1535610879,NO -1535610880,1535614975,RU -1535614976,1535619071,AT -1535619072,1535623167,FR -1535623168,1535627263,KZ -1535627264,1535631359,RU -1535631360,1535635455,GB -1535635456,1535639551,AZ -1535639552,1535672319,GB -1535672320,1535737855,DE -1535737856,1535770623,HU -1535770624,1535803391,CH -1535803392,1535836159,GR -1535836160,1535868927,CZ -1535868928,1535901695,BG -1535901696,1535934463,GR -1535934464,1535967231,KW -1535967232,1535999999,AT -1536000000,1536032767,NL -1536032768,1536036863,LV -1536036864,1536040959,AT -1536040960,1536045055,GB -1536045056,1536049151,DE -1536049152,1536051199,IT -1536051200,1536057343,RU -1536057344,1536061439,IE -1536061440,1536065535,SE -1536065536,1536065791,GB -1536065792,1536066303,LU -1536066304,1536066815,NL -1536067072,1536067327,GB -1536067328,1536067583,RU -1536067584,1536067839,DK -1536067840,1536068095,PL -1536068096,1536068351,RU -1536068352,1536068607,HR -1536068864,1536069119,RU -1536069120,1536069375,TR -1536069376,1536069631,IT -1536069632,1536073727,RU -1536073728,1536077823,UA -1536077824,1536081919,SE -1536081920,1536086015,PL -1536086016,1536090111,ES -1536090112,1536094207,IE -1536094208,1536098303,NL -1536098304,1536114687,RU -1536114688,1536118783,GB -1536118784,1536122879,DE -1536122880,1536126975,AT -1536126976,1536131071,DK -1536131072,1536143359,RU -1536143360,1536147455,GB -1536147456,1536151551,IT -1536151552,1536152575,RS -1536152576,1536152607,XK -1536152608,1536155135,RS -1536155136,1536155647,XK -1536155648,1536159743,IL -1536159744,1536163839,DE -1536163840,1536180223,SY -1536180224,1536196607,HU -1536196608,1536212991,RU -1536212992,1536229375,DK -1536229376,1536245759,SE -1536245760,1536262143,FI -1536262144,1536278527,PL -1536278528,1536294911,UA -1536294912,1536311295,RU -1536311296,1536319487,EE -1536319488,1536321535,ES -1536321536,1536325631,GB -1536325632,1536327679,CZ -1536327680,1536344063,HU -1536344064,1536360447,PL -1536360448,1536376831,RU -1536376832,1536380927,IR -1536380928,1536393215,KZ -1536393216,1536409599,SA -1536409600,1536425983,HU -1536425984,1536442367,SK -1536442368,1536444927,RS -1536444928,1536448906,XK -1536448907,1536448907,RS -1536448908,1536450230,XK -1536450231,1536450231,RS -1536450232,1536450494,XK -1536450495,1536450495,RS -1536450496,1536450559,XK -1536450560,1536453375,RS -1536453376,1536453631,XK -1536453632,1536453887,RS -1536453888,1536453903,XK -1536453904,1536456191,RS -1536456192,1536456447,XK -1536456448,1536458751,RS -1536458752,1536475135,BG -1536475136,1536476159,NL -1536476160,1536476671,GB -1536476672,1536479231,NL -1536479232,1536483327,GB -1536483328,1536491519,NL -1536491520,1536499711,NO -1536499712,1536503807,SE -1536503808,1536507903,NO -1536507904,1536524287,RU -1536524288,1536540671,BY -1536540672,1536557055,PL -1536557056,1536573439,FI -1536573440,1536574463,RS -1536574464,1536574719,XK -1536574720,1536574975,RS -1536574976,1536575615,XK -1536575616,1536579071,RS -1536579072,1536579327,XK -1536579328,1536579583,RS -1536579584,1536579839,XK -1536579840,1536580351,RS -1536580352,1536580607,XK -1536580608,1536589823,RS -1536589824,1536614399,PL -1536614400,1536622591,DK -1536622592,1536626687,GB -1536626688,1536626943,DE -1536626944,1536627072,AT -1536627073,1536630783,DE -1536630784,1536634879,RU -1536634880,1536643071,FR -1536643072,1536647167,TR -1536647168,1536651263,ES -1536651264,1536655359,FR -1536655360,1536659455,GE -1536659456,1536659711,ZA -1536659712,1536663551,DE -1536663552,1536667647,SA -1536667648,1536675839,RU -1536675840,1536679935,GB -1536679936,1536684031,LB -1536684032,1536688127,GB -1536688128,1537212415,FI -1537212416,1538260991,FR -1538260992,1538785279,BE -1538785280,1538793471,NL -1538793472,1538797567,DE -1538797568,1538801663,NL -1538801664,1538809855,IR -1538809856,1538818047,GE -1538818048,1538826239,NO -1538826240,1538834431,DE -1538834432,1538842623,CY -1538842624,1538850815,RU -1538850816,1538859007,KZ -1538859008,1538875391,RU -1538875392,1538883583,RS -1538883584,1538891775,IR -1538891776,1538897919,GB -1538897920,1538899967,PL -1538899968,1538904031,SI -1538904032,1538904039,BH -1538904040,1538908159,SI -1538908160,1538916351,RU -1538916352,1538924543,GB -1538924544,1538932735,DE -1538932736,1538940927,NO -1538940928,1538949119,RU -1538949120,1538957311,AT -1538957312,1538964991,DE -1538964992,1538965503,GB -1538965504,1538973695,IR -1538973696,1538981887,JO -1538981888,1538990079,BY -1538990080,1538998271,CZ -1538998272,1539006463,AD -1539006464,1539014655,AL -1539014656,1539019775,XK -1539019776,1539020031,RS -1539020032,1539022847,XK -1539022848,1539031039,LT -1539031040,1539039231,IT -1539039232,1539047423,PL -1539047424,1539055615,IT -1539055616,1539063807,LV -1539063808,1539071999,FR -1539072000,1539080191,PL -1539080192,1539088383,UZ -1539088384,1539096575,RU -1539112960,1539115007,PL -1539115008,1539117055,AE -1539117056,1539123199,PL -1539123200,1539125247,SE -1539125248,1539127295,RU -1539127296,1539129343,PL -1539129344,1539131391,IE -1539131392,1539133439,PL -1539133440,1539135487,RU -1539135488,1539136255,GB -1539136256,1539136511,US -1539136512,1539137535,GB -1539137536,1539139583,NL -1539139584,1539141631,FR -1539141632,1539143679,RU -1539143680,1539145727,NO -1539145728,1539147775,UA -1539147776,1539149823,PL -1539149824,1539151871,GB -1539151872,1539153919,UA -1539153920,1539155967,RU -1539155968,1539160063,NO -1539162112,1539164159,DE -1539164160,1539166207,DK -1539168256,1539170303,PL -1539170304,1539172351,NL -1539172352,1539176447,RU -1539176448,1539178495,PL -1539178496,1539186687,CH -1539186688,1539194879,LV -1539194880,1539201023,RU -1539201024,1539203071,IR -1539203072,1539204095,NL -1539204096,1539204096,IN -1539204097,1539205119,US -1539205120,1539206143,NL -1539206144,1539207167,GB -1539207168,1539211263,RU -1539211264,1539213311,CZ -1539213312,1539215359,SE -1539215360,1539219455,DE -1539219456,1539221503,GG -1539221504,1539223551,FR -1539223552,1539225599,RU -1539225600,1539227647,HU -1539227648,1539229695,FI -1539229696,1539231743,DE -1539231744,1539233791,BE -1539233792,1539235839,LU -1539235840,1539237887,DE -1539237888,1539239935,RU -1539239936,1539241983,DE -1539244032,1539260415,BA -1539260416,1539276799,SK -1539276800,1539280895,SE -1539280896,1539282687,FR -1539282688,1539282751,ES -1539282752,1539284543,FR -1539284544,1539284607,ES -1539284608,1539284991,FR -1539284992,1539289087,TR -1539289088,1539290623,RU -1539290624,1539291135,CH -1539291136,1539291391,NL -1539291392,1539291647,CZ -1539291648,1539293183,RU -1539293184,1539297279,AZ -1539297280,1539301375,BG -1539301376,1539309567,RU -1539309568,1539310591,PL -1539312640,1539313663,DE -1539313664,1539314687,GB -1539314688,1539315711,RU -1539316736,1539317759,SE -1539317760,1539318783,CZ -1539318784,1539319807,NL -1539319808,1539320831,DE -1539320832,1539321855,UA -1539321856,1539322879,EG -1539322880,1539323903,DK -1539323904,1539324927,PL -1539324928,1539325951,RU -1539325952,1539326975,KG -1539326976,1539329023,RU -1539329024,1539330047,PL -1539330048,1539330303,RU -1539330304,1539330559,DE -1539330560,1539331071,RU -1539332096,1539333119,PL -1539333120,1539335167,RU -1539335168,1539336191,CH -1539336192,1539336703,UA -1539337216,1539338239,ES -1539338240,1539339263,SE -1539339264,1539340287,NL -1539340288,1539341311,PL -1539341312,1539342335,IT -1539342336,1539345407,UA -1539345408,1539346431,RO -1539346432,1539347455,PL -1539347456,1539348479,RU -1539348480,1539351551,UA -1539351552,1539352575,PL -1539352576,1539354623,RU -1539355648,1539357695,UA -1539357696,1539358719,RU -1539358720,1539359743,GB -1539359744,1539360767,PL -1539360768,1539361279,UA -1539361280,1539361791,DE -1539361792,1539362815,PL -1539362816,1539363839,GB -1539363840,1539364863,DK -1539364864,1539365887,UA -1539365888,1539366911,NO -1539366912,1539368959,PL -1539368960,1539369983,GB -1539369984,1539371007,BG -1539371008,1539373055,RU -1539373056,1539374079,PL -1539374080,1539375103,SE -1539375104,1539376127,NO -1539377152,1539378175,UA -1539378176,1539379199,PL -1539380224,1539381247,CH -1539381248,1539382271,RS -1539382272,1539383295,RO -1539383296,1539384319,UA -1539384320,1539385343,RU -1539385344,1539385855,PL -1539385856,1539386367,BE -1539386368,1539387391,IT -1539387392,1539388415,IL -1539388416,1539389439,PL -1539389440,1539389951,FR -1539389952,1539390463,RU -1539391488,1539392511,LV -1539392512,1539393535,UA -1539393536,1539393791,DE -1539393792,1539394047,PL -1539394048,1539394303,GI -1539394304,1539394559,RS -1539394560,1539396607,UA -1539396608,1539397631,PL -1539397632,1539398143,RU -1539398144,1539398655,PL -1539398656,1539399679,ES -1539399680,1539400703,PL -1539401728,1539402239,GB -1539402240,1539402751,FR -1539402752,1539403263,GB -1539403264,1539403775,RU -1539405824,1539406847,PL -1539406848,1539408895,UA -1539408896,1539409919,CZ -1539409920,1539410943,DK -1539410944,1539411967,RU -1539411968,1539412991,PL -1539412992,1539414015,RU -1539415040,1539416063,BG -1539416064,1539417087,PL -1539417088,1539418111,UA -1539418112,1539419135,RU -1539419136,1539420159,UA -1539420160,1539421183,RU -1539422208,1539423231,PL -1539423232,1539424255,IE -1539425280,1539426303,PL -1539426304,1539427327,BG -1539427328,1539428351,UA -1539428352,1539429375,PL -1539429376,1539434495,RU -1539434496,1539435519,GB -1539435520,1539437567,RU -1539437568,1539438591,GB -1539439616,1539440639,UA -1539441152,1539441663,RU -1539441664,1539442175,IL -1539442176,1539442687,DE -1539442688,1539443199,NL -1539443200,1539444223,RU -1539444736,1539445247,RU -1539445248,1539445759,PL -1539445760,1539446271,FI -1539446272,1539446783,SE -1539447296,1539447807,SE -1539447808,1539448831,RO -1539448832,1539449343,AT -1539449344,1539449855,UA -1539449856,1539450367,DK -1539450368,1539450879,SE -1539450880,1539451391,UA -1539451392,1539451903,GB -1539451904,1539452415,RO -1539452416,1539452927,GB -1539452928,1539453439,CH -1539453440,1539453951,UA -1539454976,1539455487,UA -1539455488,1539455999,RU -1539456000,1539456511,FR -1539456512,1539457023,ES -1539457024,1539457535,RU -1539457536,1539458047,SE -1539458048,1539459071,GB -1539459072,1539459583,UA -1539459584,1539460607,GB -1539460608,1539461631,UA -1539461632,1539462143,RS -1539462144,1539462655,DE -1539462656,1539463167,BE -1539463168,1539463679,UA -1539463680,1539464191,DE -1539464192,1539464703,RO -1539464704,1539465215,DK -1539465216,1539466751,FR -1539466752,1539467263,KW -1539467776,1539468287,PL -1539468288,1539468799,DE -1539468800,1539469823,RU -1539469824,1539470335,IL -1539470336,1539470847,GB -1539471360,1539471871,RU -1539471872,1539472383,PL -1539472896,1539473407,GB -1539473408,1539473919,FR -1539473920,1539474431,KW -1539474432,1539474943,DE -1539474944,1539475455,UA -1539475456,1539475967,NL -1539475968,1539476479,PL -1539476992,1539477503,IT -1539477504,1539478015,PL -1539478016,1539478527,CH -1539478528,1539479039,RO -1539479040,1539480063,GB -1539480064,1539480575,DK -1539480576,1539481087,PL -1539481088,1539481599,GB -1539481600,1539482111,RU -1539482112,1539482623,UA -1539482624,1539483135,RU -1539483648,1539484159,UA -1539484672,1539485695,RU -1539485696,1539485951,LV -1539485952,1539486207,RO -1539486208,1539486719,FR -1539486720,1539487231,DE -1539487744,1539488255,RU -1539488256,1539488767,SE -1539488768,1539489279,PL -1539489280,1539489791,RU -1539490816,1539491327,CH -1539491328,1539491839,PL -1539491840,1539492351,RU -1539492352,1539492863,BE -1539492864,1539493375,NL -1539493376,1539493887,RU -1539493888,1539494399,FR -1539494400,1539494911,PL -1539494912,1539495423,RU -1539495936,1539496447,RS -1539496448,1539496959,NL -1539496960,1539497471,GB -1539497472,1539497983,DE -1539497984,1539498495,NL -1539498496,1539499007,RU -1539499008,1539499519,PL -1539499520,1539500543,DE -1539500544,1539501055,RO -1539501056,1539501567,BE -1539501568,1539502079,UA -1539502592,1539503103,HR -1539503104,1539504127,RU -1539504128,1539504639,AT -1539504640,1539505151,UA -1539505152,1539505663,RU -1539505664,1539506175,AT -1539506176,1539506687,NL -1539506688,1539507199,UA -1539507200,1539508223,RO -1539508224,1539508735,NO -1539508736,1539509247,UA -1539509248,1539509759,PL -1539509760,1539510271,RO -1539510272,1539510783,RU -1539510784,1539511295,LU -1539511296,1539511807,UA -1539511808,1539512319,RU -1539512320,1539512831,BG -1539512832,1539513343,PL -1539513344,1539513855,RO -1539513856,1539514367,RU -1539514368,1539514879,SE -1539514880,1539515391,ES -1539515392,1539515903,FR -1539515904,1539516415,RS -1539516416,1539516927,AT -1539516928,1539517439,PL -1539517440,1539517951,RO -1539517952,1539518463,PL -1539518464,1539518975,DE -1539519488,1539519999,UA -1539520000,1539520511,DE -1539520512,1539521023,PL -1539521024,1539521535,DK -1539521536,1539522047,RU -1539522048,1539522559,RO -1539523584,1539524095,UA -1539524096,1539524607,GB -1539524608,1539525119,FR -1539525120,1539525631,UA -1539525632,1539526143,SE -1539526144,1539526655,DE -1539526656,1539527167,NL -1539527168,1539527679,GB -1539527680,1539528191,RO -1539528192,1539528703,RU -1539528704,1539529215,SA -1539529216,1539529727,UA -1539529728,1539530239,PL -1539530240,1539530751,AT -1539530752,1539531263,UA -1539531264,1539531775,RO -1539531776,1539532543,RU -1539532544,1539532799,CZ -1539532800,1539533311,DE -1539533312,1539533823,CZ -1539533824,1539534335,PL -1539534336,1539534847,RU -1539534848,1539535359,GB -1539535360,1539535871,RU -1539535872,1539536383,AT -1539536384,1539536895,NL -1539536896,1539537407,UA -1539537408,1539537919,GB -1539537920,1539540479,RU -1539540480,1539540991,PL -1539540992,1539541503,RU -1539541504,1539542015,TR -1539542016,1539542527,DE -1539542528,1539543039,CH -1539543040,1539543551,RO -1539543552,1539544063,SI -1539544064,1539544575,RU -1539544576,1539545087,DE -1539545088,1539545599,GR -1539545600,1539546111,SE -1539546112,1539546623,UA -1539546624,1539547135,PL -1539547136,1539547647,NL -1539547648,1539548159,IL -1539548160,1539548671,FR -1539549184,1539549695,GB -1539549696,1539550207,RU -1539550208,1539550719,UA -1539551232,1539551743,RS -1539551744,1539552255,RU -1539552256,1539552767,RO -1539552768,1539553279,GB -1539553280,1539553791,UA -1539553792,1539554303,GB -1539554304,1539554815,CH -1539554816,1539555327,PL -1539555328,1539555839,GB -1539555840,1539556863,RO -1539556864,1539557375,AT -1539557376,1539557887,NL -1539557888,1539558399,CZ -1539558400,1539558911,RU -1539558912,1539559423,FR -1539559424,1539560447,RU -1539560960,1539561471,UA -1539561472,1539561983,RO -1539561984,1539563007,DE -1539563520,1539564031,SE -1539564032,1539564543,KZ -1539564544,1539565055,GB -1539565056,1539565567,UA -1539565568,1539566079,PL -1539566080,1539567103,NL -1539567104,1539567615,CH -1539567616,1539568127,DE -1539568128,1539568639,NL -1539568640,1539569151,UA -1539569152,1539569663,EE -1539569664,1539570175,UA -1539570176,1539570687,PL -1539570688,1539571199,RU -1539571712,1539572735,UA -1539572736,1539573759,RU -1539573760,1539575807,PL -1539576832,1539577855,GB -1539579904,1539580927,RU -1539580928,1539581951,AM -1539582976,1539583999,RO -1539584000,1539585023,PL -1539585024,1539586047,UA -1539586048,1539587071,PL -1539587072,1539588095,UA -1539590144,1539591167,RU -1539591168,1539592191,UZ -1539592192,1539593215,UA -1539593216,1539594239,RU -1539594240,1539598335,UA -1539598336,1539599359,NL -1539599360,1539600383,PL -1539600384,1539601407,HU -1539601408,1539602431,GB -1539602432,1539603455,UA -1539603456,1539604479,BG -1539604480,1539605503,ES -1539605504,1539606527,DE -1539606528,1539607551,GB -1539607552,1539609599,DE -1539609600,1539610623,UA -1539610624,1539611647,RU -1539611648,1539614719,UA -1539614720,1539615743,NL -1539615744,1539616767,DK -1539616768,1539617791,UA -1539618816,1539619839,GB -1539619840,1539620863,RU -1539620864,1539622911,UA -1539623936,1539624959,DE -1539625984,1539627007,PL -1539629056,1539630079,BG -1539630080,1539631103,UA -1539632128,1539633151,RU -1539633152,1539634175,SE -1539634176,1539637247,RU -1539638272,1539639295,UA -1539639296,1539640319,RU -1539640320,1539641343,PL -1539641344,1539642367,UA -1539642368,1539643391,RU -1539643392,1539644415,UA -1539644416,1539645439,DE -1539645440,1539646463,GB -1539648512,1539649023,CY -1539649024,1539649535,LB -1539649536,1539650559,UA -1539650560,1539651583,RU -1539651584,1539651839,UA -1539651840,1539652095,RU -1539652096,1539652607,UA -1539652608,1539653631,IL -1539653632,1539654655,RU -1539655680,1539656703,NL -1539656704,1539657727,RU -1539657728,1539658751,UA -1539658752,1539659775,FI -1539659776,1539660799,PL -1539660800,1539661823,GB -1539661824,1539662847,RU -1539662848,1539663871,IL -1539663872,1539664895,RU -1539664896,1539665919,BE -1539665920,1539666943,RU -1539666944,1539667967,CZ -1539668992,1539670015,RU -1539670016,1539672063,UA -1539672064,1539673087,FR -1539673088,1539674111,GB -1539674112,1539675135,UA -1539675136,1539677183,PL -1539677184,1539679231,RU -1539679232,1539680255,FR -1539680256,1539681279,UA -1539681280,1539684351,RU -1539684352,1539685375,UA -1539685376,1539690495,RU -1539690496,1539691519,FI -1539691520,1539692543,RU -1539692544,1539694591,UA -1539694592,1539695615,PL -1539695616,1539696639,GB -1539696640,1539697663,CZ -1539697664,1539698687,UA -1539699712,1539700735,RO -1539700736,1539701759,DK -1539701760,1539702783,UA -1539702784,1539703039,SI -1539703040,1539703295,UA -1539703296,1539703551,DE -1539703552,1539703807,GB -1539703808,1539704063,UA -1539704064,1539704319,IL -1539704320,1539704575,CH -1539704576,1539704831,HU -1539704832,1539705087,CH -1539705088,1539705343,GB -1539705344,1539705599,UA -1539705600,1539706111,CH -1539706112,1539706367,GB -1539706368,1539706623,RU -1539706624,1539707135,PL -1539707136,1539707391,LT -1539707392,1539707647,GB -1539707648,1539707903,AE -1539707904,1539708159,PL -1539708160,1539708415,DE -1539708416,1539708671,GB -1539708672,1539708927,RO -1539708928,1539709183,IE -1539709184,1539709439,AT -1539709440,1539709695,BE -1539709696,1539709951,NL -1539710208,1539710463,GB -1539710464,1539710719,FR -1539710720,1539710975,UA -1539710976,1539711231,DE -1539711232,1539711487,RU -1539711488,1539711743,UA -1539711744,1539711999,DE -1539712000,1539712255,UA -1539712512,1539713023,RU -1539713024,1539713279,UA -1539713536,1539713791,DK -1539713792,1539714047,DE -1539714048,1539714303,FR -1539714304,1539714559,AT -1539714560,1539714815,RU -1539714816,1539715071,PT -1539715328,1539715583,TR -1539715584,1539715839,UA -1539715840,1539716095,RU -1539716096,1539716351,SI -1539716352,1539716607,PL -1539716608,1539716863,RU -1539716864,1539717375,PL -1539717376,1539717631,DE -1539717632,1539717887,CH -1539717888,1539718143,MK -1539718144,1539718399,DE -1539718400,1539718655,TR -1539718656,1539718911,SA -1539718912,1539719167,KZ -1539719168,1539719423,IE -1539719424,1539719679,PL -1539719680,1539720191,DE -1539720192,1539720703,RU -1539720704,1539720959,IL -1539720960,1539721215,RU -1539721216,1539721727,CH -1539721728,1539721983,PL -1539721984,1539722239,RU -1539722240,1539722495,PL -1539722752,1539723007,DE -1539723008,1539723263,CH -1539723264,1539723519,PL -1539723520,1539723775,GB -1539723776,1539724031,DE -1539724032,1539724287,UA -1539724288,1539724543,IT -1539724544,1539724799,RU -1539724800,1539725055,DE -1539725056,1539725311,NL -1539725312,1539725567,FR -1539725568,1539725823,PL -1539725824,1539726079,PT -1539726080,1539726335,LV -1539726336,1539726591,SE -1539726592,1539726847,AT -1539726848,1539727103,PL -1539727104,1539727359,SE -1539727360,1539727615,SI -1539727616,1539727871,PL -1539727872,1539728127,RU -1539728128,1539728383,GB -1539728384,1539728639,PL -1539728640,1539728895,UA -1539728896,1539729151,SA -1539729152,1539729407,NL -1539729408,1539729663,RU -1539729664,1539729919,FR -1539729920,1539730175,NL -1539730176,1539730431,GB -1539730944,1539731455,PL -1539731456,1539731711,SI -1539731712,1539732223,DE -1539732480,1539732735,UA -1539732736,1539732991,DK -1539732992,1539733247,PL -1539733248,1539733503,BG -1539733504,1539733759,FI -1539733760,1539734015,PL -1539734016,1539734271,FR -1539734528,1539734783,TR -1539734784,1539735039,FR -1539735040,1539735295,BE -1539735296,1539735551,RU -1539735552,1539735807,AT -1539735808,1539736063,IL -1539736064,1539736319,RU -1539736320,1539736575,HU -1539736576,1539736831,BG -1539736832,1539737087,UA -1539737088,1539737343,KW -1539737344,1539737599,SE -1539737600,1539737855,RO -1539737856,1539738111,DE -1539738112,1539738367,DK -1539738368,1539738623,DE -1539738624,1539738879,UA -1539739136,1539739391,AT -1539739392,1539739647,UA -1539739648,1539739903,DK -1539739904,1539740415,PL -1539740672,1539740927,AT -1539740928,1539741183,RU -1539741184,1539741439,PL -1539741440,1539741695,NL -1539741696,1539741951,DE -1539741952,1539742207,UA -1539742208,1539742463,CH -1539742464,1539742719,RU -1539742720,1539742975,LV -1539742976,1539743231,DE -1539743488,1539743743,FR -1539743744,1539743999,RO -1539744000,1539744255,PL -1539744256,1539744511,RO -1539744512,1539744767,DE -1539744768,1539745023,SE -1539745024,1539745279,GB -1539745280,1539745535,GI -1539745792,1539746303,DK -1539747072,1539747327,CH -1539747328,1539747583,NL -1539747584,1539747839,UA -1539747840,1539748095,NO -1539748096,1539748351,PL -1539748352,1539748607,NL -1539748608,1539748863,PL -1539748864,1539749119,GB -1539749120,1539749375,BG -1539749376,1539749631,PT -1539749632,1539749887,GR -1539749888,1539750143,RU -1539750400,1539750655,PL -1539750656,1539750911,DE -1539750912,1539751167,UA -1539751168,1539751423,DE -1539751424,1539751679,SI -1539751680,1539751935,FR -1539752192,1539752447,SE -1539752448,1539752703,PL -1539752704,1539752959,AT -1539753216,1539753471,DE -1539753472,1539753727,HU -1539753728,1539754239,FR -1539754240,1539754495,NO -1539754496,1539754751,SE -1539754752,1539755007,BE -1539755008,1539755263,DK -1539755264,1539755519,IL -1539755520,1539755775,EE -1539755776,1539756031,MT -1539756288,1539756543,PL -1539756800,1539757055,BE -1539757056,1539757567,RU -1539757568,1539757823,SI -1539758080,1539758335,HR -1539758336,1539758591,PL -1539758848,1539759103,BA -1539759360,1539759615,RU -1539759616,1539759871,PL -1539759872,1539760127,SE -1539760128,1539760383,DE -1539760384,1539760639,RU -1539760640,1539760895,PL -1539760896,1539761151,DK -1539761152,1539761407,DE -1539761408,1539761663,CH -1539761920,1539762175,RU -1539762176,1539762431,PL -1539762432,1539762687,UA -1539762688,1539762943,NL -1539762944,1539763199,UA -1539763200,1539763455,MD -1539763456,1539763711,DK -1539763712,1539763967,DE -1539763968,1539764223,PT -1539764224,1539764479,AT -1539764480,1539764735,GB -1539764736,1539764991,RO -1539764992,1539765247,BE -1539765248,1539765503,GB -1539765504,1539766015,PL -1539766016,1539766271,UA -1539766272,1539766527,PL -1539766528,1539766783,UA -1539766784,1539767039,DE -1539767040,1539767295,SA -1539767296,1539767551,DK -1539767552,1539767807,DE -1539768064,1539768319,GB -1539768320,1539768575,FR -1539768576,1539768831,GB -1539768832,1539769087,IT -1539769088,1539769343,BE -1539769344,1539769599,RU -1539769600,1539769855,AT -1539769856,1539770111,FR -1539770112,1539770367,GR -1539770368,1539770623,DE -1539770880,1539771135,RU -1539771136,1539771391,FR -1539771392,1539771647,PL -1539771648,1539771903,UA -1539771904,1539772159,RU -1539772160,1539772415,BE -1539772416,1539772671,RU -1539772672,1539772927,RS -1539773184,1539773439,GB -1539773440,1539773695,KZ -1539773696,1539773951,DE -1539773952,1539774207,PL -1539774208,1539774463,SI -1539774464,1539774719,GB -1539774720,1539774975,PL -1539774976,1539775231,RU -1539775488,1539775743,UA -1539775744,1539775999,NL -1539776256,1539776511,SK -1539776768,1539777023,UA -1539777024,1539777279,RU -1539777280,1539777535,UA -1539777536,1539777791,BG -1539777792,1539778047,UA -1539778048,1539778303,AM -1539778304,1539778559,LB -1539778560,1539778815,RU -1539778816,1539779071,RO -1539779328,1539779583,FR -1539779840,1539780095,NL -1539780096,1539780351,RU -1539780608,1539780863,PL -1539780864,1539781375,RO -1539781376,1539781631,PL -1539781632,1539781887,HU -1539781888,1539782143,IL -1539782144,1539782399,UA -1539782400,1539782655,LT -1539782656,1539782911,GI -1539782912,1539783167,PL -1539783168,1539783679,NL -1539783680,1539783935,DE -1539783936,1539784191,SI -1539784192,1539784447,RU -1539784448,1539784703,NO -1539784704,1539784959,SE -1539784960,1539785215,DE -1539785216,1539785471,CH -1539785472,1539785727,RU -1539785728,1539785983,SE -1539785984,1539786239,IL -1539786240,1539786495,AT -1539786496,1539786751,GB -1539786752,1539787007,HU -1539787008,1539787263,TR -1539787264,1539787519,IE -1539787520,1539787775,DE -1539787776,1539788031,CH -1539788032,1539788287,HR -1539788288,1539788543,GB -1539788544,1539788799,HR -1539788800,1539789055,RU -1539789568,1539789823,DE -1539790080,1539790335,CH -1539790336,1539790591,LV -1539790848,1539791103,DE -1539791104,1539791359,PL -1539791616,1539792383,UA -1539792384,1539792639,IL -1539792640,1539792895,PL -1539792896,1539793151,GR -1539793152,1539793407,PL -1539793408,1539793663,CH -1539793664,1539794175,IL -1539794176,1539794431,PL -1539794688,1539794943,FR -1539794944,1539795199,RO -1539795200,1539795455,PL -1539795456,1539795711,UA -1539795712,1539795967,SA -1539796224,1539796479,MC -1539796480,1539796735,GB -1539796736,1539796991,TR -1539796992,1539797247,UA -1539797248,1539797503,DK -1539797504,1539797759,RU -1539797760,1539798015,UA -1539798016,1539798271,HU -1539798272,1539798527,PL -1539798528,1539798783,GB -1539798784,1539799039,IL -1539799040,1539799295,ES -1539799296,1539799551,DK -1539799552,1539799807,ES -1539800064,1539800319,SI -1539800320,1539800575,GB -1539800576,1539800831,LV -1539800832,1539801087,PL -1539801088,1539801343,BG -1539801344,1539801855,GB -1539801856,1539802111,SI -1539802112,1539802367,PL -1539802368,1539802623,RO -1539802624,1539802879,IS -1539802880,1539803135,NL -1539803136,1539803391,GB -1539803648,1539804159,UA -1539804160,1539804671,PL -1539804672,1539804927,SI -1539804928,1539805183,RU -1539805184,1539805439,UA -1539805440,1539805695,AT -1539805696,1539805951,CH -1539806208,1539806463,FI -1539806464,1539806719,RU -1539806720,1539806975,BG -1539806976,1539807231,GB -1539807232,1539807487,FR -1539807488,1539807743,RU -1539807744,1539807999,GB -1539808000,1539808255,HU -1539808256,1539808511,RU -1539808512,1539808767,GB -1539808768,1539809023,DE -1539809024,1539809279,GB -1539809536,1539809791,SI -1539809792,1539810047,DE -1539810304,1539810559,CZ -1539810560,1539810815,DE -1539810816,1539811071,TR -1539811072,1539811327,NL -1539811584,1539811839,DE -1539811840,1539812095,IT -1539812096,1539812351,RU -1539812608,1539812863,IT -1539812864,1539813119,RU -1539813120,1539813375,AT -1539813376,1539813631,PL -1539813632,1539813887,NL -1539813888,1539814143,RU -1539814400,1539815423,GB -1539815936,1539816191,CH -1539816192,1539816447,SA -1539816448,1539816703,UA -1539816704,1539816959,RU -1539816960,1539817215,DK -1539817216,1539817471,TR -1539817472,1539817727,DE -1539817984,1539818239,UA -1539818240,1539818495,NO -1539818496,1539819007,RU -1539819008,1539819263,CH -1539819264,1539819519,RO -1539819520,1539819775,AT -1539819776,1539820031,SI -1539820032,1539820287,VG -1539820288,1539820543,PL -1539820544,1539820799,ES -1539820800,1539821055,RU -1539821056,1539821311,UA -1539821312,1539821567,CZ -1539821568,1539821823,DK -1539822080,1539822335,RO -1539822592,1539822847,GB -1539822848,1539823103,IE -1539823104,1539823359,DE -1539823360,1539823615,NL -1539823616,1539823871,RO -1539823872,1539824127,DK -1539824128,1539824383,CH -1539824384,1539824639,NL -1539824640,1539824895,HU -1539824896,1539825151,RU -1539825152,1539825407,UA -1539825408,1539825919,RU -1539825920,1539826175,DE -1539826176,1539826431,AM -1539826432,1539826687,NL -1539826688,1539826943,CH -1539826944,1539827199,RU -1539827200,1539827455,ES -1539827456,1539827711,MK -1539827712,1539827967,RU -1539827968,1539828479,FR -1539828480,1539828735,SI -1539828736,1539828991,NL -1539828992,1539829247,BG -1539829248,1539829503,SE -1539829504,1539829759,DE -1539829760,1539830015,PL -1539830016,1539830271,DE -1539830272,1539830527,FR -1539830528,1539830783,RO -1539830784,1539831039,RU -1539831040,1539831295,UA -1539831296,1539831551,PL -1539831552,1539831807,DE -1539832064,1539832319,GB -1539832320,1539832575,PL -1539832576,1539832831,RU -1539832832,1539833087,GB -1539833088,1539833343,RU -1539833344,1539833855,FR -1539833856,1539837951,UA -1539837952,1539838975,NL -1539838976,1539839999,GR -1539840000,1539841023,PL -1539841024,1539842047,RU -1539842048,1539844095,PL -1539844096,1539846143,UA -1539846144,1539847167,NL -1539847168,1539849471,UA -1539849472,1539849727,GB -1539849728,1539850239,RU -1539850240,1539851263,LV -1539851264,1539852287,PL -1539852288,1539853311,UA -1539853312,1539854335,PL -1539854336,1539855103,UA -1539855104,1539855231,US -1539855232,1539855359,UA -1539855360,1539856383,RU -1539857408,1539858431,PL -1539858432,1539859455,RO -1539860480,1539861503,PL -1539861504,1539862527,DE -1539862528,1539863551,UA -1539863552,1539864575,ES -1539864576,1539865599,RO -1539865600,1539866623,UA -1539866624,1539867647,IT -1539867648,1539868671,RO -1539868672,1539869695,RU -1539869696,1539870719,ES -1539870720,1539871743,IL -1539872768,1539873791,SE -1539873792,1539875839,UA -1539875840,1539876863,RU -1539876864,1539877887,ES -1539877888,1539878911,PL -1539879936,1539880959,UA -1539880960,1539881983,PL -1539883008,1539884031,RS -1539884032,1539885055,MT -1539885056,1539886079,UA -1539886080,1539887103,FR -1539887104,1539888127,IT -1539888128,1539889151,UA -1539889152,1539890175,RU -1539890176,1539891199,UA -1539891200,1539893247,RU -1539893248,1539894271,UA -1539894272,1539895295,PL -1539897344,1539898367,UA -1539899392,1539900415,RU -1539901440,1539902463,RU -1539902464,1539903487,LV -1539903488,1539904511,PL -1539904512,1539905535,CZ -1539905536,1539905791,RU -1539905792,1539906047,UA -1539906048,1539906559,RU -1539908608,1539909631,UA -1539909632,1539910655,RU -1539910656,1539911679,PL -1539911680,1539913727,RU -1539913728,1539914751,CH -1539914752,1539915775,SE -1539916800,1539917823,UA -1539917824,1539918847,RU -1539918848,1539920895,RO -1539920896,1539921919,UA -1539921920,1539922943,PL -1539922944,1539923967,SE -1539924992,1539926015,DE -1539927040,1539928063,UA -1539928064,1539930111,RU -1539930112,1539931135,PL -1539932160,1539933183,DE -1539933184,1539934207,ES -1539934208,1539935231,RS -1539936256,1539937279,UA -1539937280,1539938303,CH -1539938304,1539939327,PL -1539939328,1539940351,UA -1539940352,1539941375,GB -1539941376,1539942399,NL -1539942400,1539943423,UA -1539943424,1539944447,BG -1539944448,1539946495,UA -1539946496,1539947519,RU -1539947520,1539948543,UA -1539948544,1539949567,RO -1539950592,1539950847,GB -1539950848,1539951103,RU -1539951104,1539951615,UA -1539951616,1539953663,RU -1539953664,1539954175,CH -1539954176,1539955711,KZ -1539955712,1539956735,RO -1539956736,1539957759,UA -1539957760,1539958783,RU -1539958784,1539959807,UA -1539959808,1539960831,RU -1539960832,1539962879,UA -1539962880,1539964927,RU -1539964928,1539965951,UA -1539965952,1539966975,RU -1539966976,1539967999,UA -1539968000,1539973119,RU -1539974144,1539975167,RU -1539975168,1539976191,DE -1539976192,1539977215,RU -1539977216,1539978239,DE -1539978240,1539979263,CZ -1539979264,1539980287,UA -1539980288,1539981311,VG -1539981312,1539982335,SI -1539982336,1539983359,RU -1539983360,1539984383,UA -1539984384,1539985407,RU -1539985408,1539986431,NO -1539986432,1539987455,RU -1539987456,1539988479,RO -1539988480,1539990527,RU -1539990528,1539991551,PL -1539991552,1539993599,UA -1539993600,1539994623,FI -1539994624,1539995647,AT -1539995648,1539996671,CH -1539996672,1539997695,PL -1539997696,1539999743,UA -1539999744,1540000767,GB -1540000768,1540001791,RU -1540001792,1540002815,UA -1540002816,1540003839,RU -1540003840,1540004863,PL -1540004864,1540005887,SE -1540005888,1540006911,UA -1540006912,1540007935,RU -1540007936,1540008959,IL -1540008960,1540011007,PL -1540011008,1540014079,RU -1540014080,1540015103,PL -1540015104,1540016127,RU -1540016128,1540016135,DE -1540016136,1540016383,BE -1540016384,1540016639,IE -1540016640,1540016895,RO -1540016896,1540017151,PT -1540017152,1540018175,RU -1540018176,1540020223,UA -1540020224,1540022271,RU -1540022272,1540023295,GB -1540023296,1540024319,PL -1540024320,1540025343,RU -1540025344,1540026367,GB -1540026368,1540027391,UA -1540029440,1540031487,RU -1540031488,1540032511,UA -1540032512,1540033535,RU -1540033536,1540034559,UA -1540034560,1540035583,PL -1540035584,1540036607,KZ -1540036608,1540037631,UA -1540037632,1540038655,EE -1540038656,1540039679,FR -1540039680,1540040703,RU -1540040704,1540041727,SE -1540041728,1540042751,RU -1540042752,1540043775,UA -1540043776,1540044799,PL -1540044800,1540045823,GB -1540045824,1540046847,UA -1540046848,1540047871,RU -1540047872,1540048895,LV -1540048896,1540049919,GB -1540050944,1540052991,RU -1540052992,1540054015,UA -1540055040,1540056063,NO -1540057088,1540057343,PL -1540057344,1540057599,RU -1540057600,1540057855,US -1540057856,1540058111,UA -1540058112,1540059135,DE -1540059136,1540060159,UA -1540060160,1540061183,NO -1540062208,1540063231,RU -1540063232,1540064255,DE -1540064256,1540065279,PL -1540065280,1540068351,UA -1540068352,1540069375,FR -1540069376,1540070399,RU -1540070400,1540071423,PL -1540071424,1540072447,SE -1540072448,1540073471,UA -1540073472,1540074495,RU -1540074496,1540075519,UZ -1540075520,1540077567,RU -1540077568,1540078591,FR -1540078592,1540081663,RU -1540081664,1540082687,DE -1540082688,1540083711,NO -1540083712,1540084735,RU -1540084736,1540085759,NL -1540085760,1540087807,PL -1540087808,1540088575,RU -1540088576,1540088831,KZ -1540088832,1540092927,RU -1540092928,1540094975,PL -1540094976,1540095999,RU -1540096000,1540097023,SE -1540097024,1540099071,DE -1540099072,1540099327,UA -1540099328,1540099583,BY -1540099584,1540099711,US -1540099712,1540099839,DE -1540099840,1540103167,RU -1540103168,1540105215,DE -1540105216,1540106239,UA -1540110336,1540111359,RU -1540111360,1540112383,UA -1540112384,1540113407,LV -1540113408,1540115455,RU -1540115456,1540116479,UA -1540116480,1540117503,CH -1540117504,1540118527,UA -1540118528,1540119551,PL -1540119552,1540120575,UA -1540120576,1540124671,RU -1540124672,1540125695,UA -1540125696,1540126719,FR -1540126720,1540127743,UA -1540128768,1540129791,RU -1540129792,1540130815,UA -1540130816,1540131839,RU -1540131840,1540132863,PL -1540132864,1540134911,RU -1540134912,1540135935,PL -1540135936,1540136959,BG -1540136960,1540137983,PL -1540137984,1540139007,RU -1540139008,1540140031,DE -1540140032,1540141055,GB -1540141056,1540142079,RU -1540142080,1540143103,UA -1540143104,1540144127,RU -1540144128,1540145151,AM -1540145152,1540146175,AT -1540146176,1540147199,UA -1540147200,1540148223,RU -1540148224,1540149247,PL -1540149248,1540150271,GB -1540150272,1540151295,UA -1540151296,1540152319,AT -1540154368,1540156415,RU -1540156416,1540157439,UZ -1540157440,1540159487,RU -1540160512,1540162559,RU -1540162560,1540163583,UA -1540163584,1540164607,RU -1540164608,1540165631,DE -1540165632,1540166655,UA -1540166656,1540167679,PL -1540167680,1540168703,RU -1540168704,1540169727,DE -1540169728,1540170751,NL -1540170752,1540171775,DE -1540171776,1540172799,GB -1540172800,1540173823,RU -1540173824,1540174847,KG -1540174848,1540175871,RU -1540175872,1540176895,DE -1540176896,1540177919,SE -1540177920,1540178943,UA -1540178944,1540179967,BA -1540179968,1540180991,PL -1540180992,1540182015,DE -1540182016,1540183039,IT -1540183040,1540184063,RU -1540184064,1540185087,PL -1540186112,1540187135,NL -1540187136,1540188159,US -1540190208,1540191231,PT -1540191232,1540192255,FR -1540192256,1540195327,RU -1540195328,1540198399,AM -1540198400,1540199423,RU -1540199424,1540200447,CH -1540200448,1540201471,IL -1540201472,1540202495,UA -1540202496,1540203519,RU -1540203520,1540204543,UA -1540204544,1540205567,RU -1540205568,1540206591,DE -1540206592,1540208639,RU -1540208640,1540209663,NO -1540210688,1540211455,NL -1540211456,1540211711,CZ -1540212736,1540213759,RU -1540213760,1540214783,UA -1540214784,1540215807,RU -1540215808,1540216831,NL -1540216832,1540217855,UA -1540217856,1540218879,GB -1540218880,1540219903,RU -1540219904,1540220927,PL -1540220928,1540220991,US -1540220992,1540221439,NL -1540221440,1540221567,US -1540221568,1540221951,NL -1540221952,1540223999,RU -1540224000,1540225023,PL -1540225024,1540226047,GB -1540226048,1540227071,RU -1540227072,1540227583,GB -1540227584,1540228095,RU -1540228096,1540228607,UA -1540228608,1540229119,PL -1540229120,1540229631,AT -1540229632,1540230143,NL -1540230144,1540232191,RU -1540232192,1540232703,LU -1540232704,1540233215,RU -1540233216,1540233727,CH -1540233728,1540234239,PL -1540234240,1540234751,DE -1540234752,1540235775,UA -1540235776,1540236287,NO -1540236288,1540236799,RO -1540236800,1540237311,PL -1540237312,1540238847,RO -1540238848,1540239359,DE -1540239360,1540239871,UA -1540239872,1540240383,FR -1540240384,1540240895,CH -1540240896,1540242431,RU -1540242432,1540242943,DE -1540242944,1540243455,RU -1540243968,1540244479,RU -1540244992,1540245503,DE -1540245504,1540246015,RU -1540246016,1540246527,IT -1540246528,1540247551,RO -1540247552,1540248063,NL -1540248064,1540248575,RO -1540248576,1540249087,GB -1540249088,1540249599,PL -1540249600,1540250111,KZ -1540250112,1540250367,PL -1540250368,1540250623,CZ -1540251136,1540251647,GB -1540251648,1540252159,PL -1540252160,1540252671,DE -1540252672,1540253183,RU -1540253184,1540253695,AT -1540253696,1540254207,CH -1540254208,1540254719,RU -1540254720,1540255231,PL -1540255232,1540255743,UA -1540255744,1540256255,AT -1540256256,1540256767,PL -1540256768,1540257279,RU -1540257280,1540257791,GB -1540257792,1540258303,RU -1540258304,1540258815,IR -1540258816,1540259327,UA -1540259328,1540259839,RU -1540259840,1540260351,IT -1540260352,1540260863,RU -1540260864,1540261375,LT -1540261376,1540261887,SA -1540261888,1540262399,NL -1540262400,1540262911,BG -1540263424,1540263935,DE -1540263936,1540264447,GB -1540264448,1540265983,RU -1540265984,1540266495,DE -1540266496,1540267007,PL -1540267008,1540267519,FR -1540267520,1540268543,RO -1540268544,1540269055,RU -1540269056,1540269567,DK -1540269568,1540270079,UA -1540270080,1540270591,GB -1540270592,1540271103,IL -1540271104,1540271615,PL -1540271616,1540272127,SE -1540272128,1540272639,GB -1540272640,1540273663,PL -1540273664,1540274175,GB -1540274176,1540274687,DE -1540274688,1540275199,UA -1540275200,1540275711,DE -1540275712,1540276223,GR -1540276224,1540276735,AT -1540276736,1540277247,RO -1540277248,1540277759,RU -1540277760,1540278271,FR -1540278272,1540278783,UA -1540278784,1540279807,RU -1540279808,1540280319,RO -1540280320,1540280831,MD -1540280832,1540281343,PL -1540281344,1540281855,UA -1540281856,1540282367,DE -1540282368,1540282879,RU -1540282880,1540283391,UA -1540283392,1540284415,RU -1540284416,1540284927,AT -1540284928,1540285439,UA -1540285440,1540285951,DE -1540285952,1540286463,RU -1540286464,1540286975,NL -1540286976,1540287487,GB -1540287488,1540288511,AT -1540288512,1540289535,RU -1540289536,1540290047,PL -1540290048,1540290559,NL -1540290560,1540291071,RU -1540291072,1540291583,BE -1540291584,1540292095,UA -1540292096,1540292607,RU -1540293120,1540293631,DK -1540293632,1540296703,PL -1540296704,1540297215,DE -1540297216,1540298239,FR -1540298240,1540298751,HR -1540298752,1540299263,RU -1540299264,1540299775,UA -1540299776,1540300287,KG -1540300288,1540300799,RU -1540300800,1540301311,DK -1540301312,1540301823,IL -1540301824,1540302847,GB -1540302848,1540303871,RU -1540303872,1540304895,UA -1540304896,1540305407,PL -1540305408,1540305919,GB -1540305920,1540306431,PL -1540306432,1540306943,UA -1540306944,1540307199,GB -1540307200,1540307455,BE -1540307456,1540307967,RU -1540307968,1540308479,UA -1540308480,1540308991,RS -1540308992,1540309503,PL -1540309504,1540310015,UA -1540310016,1540310527,PL -1540311040,1540313087,RU -1540313088,1540313599,SE -1540313600,1540315135,RU -1540315136,1540315647,UA -1540315648,1540316159,IL -1540316160,1540316671,DE -1540316672,1540317183,RO -1540317696,1540318207,UA -1540318208,1540318719,RU -1540318720,1540319231,RO -1540319232,1540319743,UA -1540319744,1540320255,RU -1540320768,1540321279,GB -1540321280,1540321791,SE -1540321792,1540322303,RU -1540322304,1540322815,UA -1540322816,1540323327,DE -1540323328,1540323839,RO -1540323840,1540324351,UA -1540324352,1540324863,RO -1540324864,1540325375,PL -1540325376,1540325887,DE -1540325888,1540326399,LI -1540326400,1540326911,RU -1540326912,1540327423,AT -1540327424,1540327935,RU -1540327936,1540328447,IR -1540328448,1540329983,RU -1540329984,1540330495,UA -1540330496,1540331007,PL -1540331008,1540331519,IT -1540331520,1540332031,GB -1540332544,1540333055,PL -1540333056,1540333567,NO -1540333568,1540334079,RO -1540334080,1540334591,DE -1540334592,1540335103,RU -1540335104,1540336127,PL -1540336128,1540336639,RU -1540337664,1540338175,FR -1540338688,1540339199,RU -1540339200,1540339711,UA -1540339712,1540340735,PL -1540340736,1540341247,CZ -1540341248,1540341759,BG -1540341760,1540342271,GB -1540342272,1540342783,UA -1540343296,1540343807,GB -1540343808,1540344831,PL -1540344832,1540345343,UA -1540345344,1540345855,IL -1540345856,1540346367,FR -1540346368,1540346879,UA -1540346880,1540347391,GB -1540347392,1540347903,DK -1540347904,1540348415,RO -1540348416,1540348927,UA -1540348928,1540349439,GB -1540349952,1540350463,UA -1540350464,1540350975,NO -1540350976,1540351487,DK -1540352000,1540352511,NL -1540353024,1540353535,GR -1540353536,1540354047,RU -1540354048,1540354559,IL -1540354560,1540355071,PL -1540355072,1540355583,UA -1540355584,1540356351,RU -1540356352,1540356607,UA -1540356608,1540357119,DE -1540357120,1540357631,RU -1540357632,1540358143,FR -1540358400,1540358655,GB -1540358656,1540358911,SE -1540358912,1540359167,GB -1540359168,1540359423,SA -1540359424,1540359679,DE -1540359680,1540359935,GB -1540359936,1540360191,AT -1540360192,1540360447,NO -1540360448,1540360703,FR -1540360704,1540360959,PL -1540360960,1540361215,GB -1540361216,1540361471,BE -1540361472,1540361727,DE -1540361728,1540361983,IT -1540361984,1540362239,EE -1540362240,1540363263,DE -1540363264,1540363519,RU -1540363776,1540364031,IS -1540364032,1540364287,RU -1540364288,1540364543,NO -1540364544,1540364799,UA -1540364800,1540365055,EE -1540365056,1540365311,SI -1540365312,1540365567,GB -1540365568,1540365823,RU -1540365824,1540366079,CH -1540366336,1540366591,PL -1540366592,1540366847,RU -1540366848,1540367103,AT -1540367104,1540367359,RU -1540367360,1540367615,HU -1540367616,1540367871,BE -1540367872,1540368127,DE -1540368128,1540368383,RU -1540368384,1540368639,FR -1540368640,1540368895,SK -1540368896,1540369407,RU -1540369408,1540369663,PL -1540369664,1540369919,DE -1540370176,1540370431,DE -1540370432,1540370687,LB -1540370688,1540370943,NL -1540370944,1540371199,PL -1540371200,1540371455,BE -1540371456,1540371711,UA -1540371712,1540371967,GB -1540371968,1540372223,NO -1540372224,1540372479,PL -1540372736,1540372991,GR -1540372992,1540373247,DE -1540373248,1540373503,UA -1540373504,1540373759,NL -1540373760,1540374015,TR -1540374016,1540374271,NL -1540374272,1540374527,BG -1540374528,1540374783,RU -1540374784,1540375039,UA -1540375040,1540375551,GB -1540375552,1540375807,DE -1540376064,1540376319,TR -1540376320,1540376575,DK -1540376576,1540376831,PL -1540376832,1540377087,RU -1540377088,1540377343,DE -1540377344,1540377599,RO -1540377600,1540377855,AM -1540377856,1540378111,ES -1540378112,1540378367,PL -1540378368,1540378623,CH -1540378624,1540378879,AT -1540378880,1540379135,SE -1540379136,1540379391,CH -1540379392,1540379647,DE -1540379648,1540379903,RU -1540380160,1540380415,IL -1540380416,1540380671,NL -1540380672,1540380927,SI -1540380928,1540381183,RS -1540381184,1540381439,RO -1540381440,1540381695,AT -1540381696,1540381951,RO -1540381952,1540382207,PL -1540382208,1540382463,UA -1540382464,1540382719,GB -1540382720,1540382975,LB -1540382976,1540383231,UA -1540383232,1540383487,AT -1540383488,1540383743,GB -1540383744,1540383999,RO -1540384000,1540384255,SI -1540384256,1540384511,FR -1540384512,1540384767,SE -1540385024,1540385279,GB -1540385280,1540385535,PL -1540385536,1540385791,DE -1540385792,1540386303,FR -1540386304,1540386559,NL -1540386560,1540386815,GB -1540386816,1540387071,NL -1540387328,1540387583,GB -1540387584,1540388095,UA -1540388096,1540388351,GB -1540388352,1540388607,IL -1540388608,1540388863,RU -1540388864,1540389119,RO -1540389120,1540389375,RU -1540389376,1540389631,GB -1540389632,1540389887,RO -1540389888,1540390143,GB -1540390144,1540390399,SI -1540390400,1540390655,RU -1540390656,1540390911,UA -1540391168,1540391423,IL -1540391424,1540391679,CH -1540391680,1540391935,NL -1540391936,1540392191,RU -1540392192,1540392447,PL -1540392448,1540392703,RU -1540392704,1540392959,PL -1540392960,1540393215,GB -1540393472,1540393727,UA -1540393728,1540394239,IL -1540394240,1540394495,GB -1540394496,1540394751,RO -1540394752,1540395007,DK -1540395008,1540395263,GE -1540395264,1540395519,UA -1540395520,1540395775,GB -1540395776,1540396031,IL -1540396032,1540396287,NO -1540396288,1540396543,RU -1540396544,1540396799,PL -1540397056,1540397311,IT -1540397312,1540397823,UA -1540397824,1540398079,DE -1540398080,1540398335,SA -1540398336,1540398591,DK -1540398592,1540399359,DE -1540399360,1540399615,RU -1540399872,1540400127,GB -1540400128,1540400383,NL -1540400384,1540400639,IR -1540400640,1540400895,RU -1540400896,1540401151,NL -1540401152,1540401407,SI -1540401408,1540401663,AT -1540401664,1540401919,GB -1540401920,1540402175,RU -1540402176,1540402431,FR -1540402432,1540402687,CH -1540402688,1540402943,SE -1540402944,1540403199,NL -1540403200,1540403455,AT -1540403712,1540404223,RO -1540404224,1540404479,CH -1540404480,1540404735,FR -1540404736,1540404991,PL -1540404992,1540405247,RU -1540405248,1540405503,GB -1540405504,1540405759,RU -1540405760,1540406015,PL -1540406016,1540406271,RU -1540406272,1540406527,SE -1540406528,1540407039,PL -1540407040,1540407807,DE -1540407808,1540408063,UA -1540408064,1540408319,IT -1540408320,1540408575,NL -1540408832,1540409087,UA -1540409088,1540409343,TR -1540409344,1540409599,SI -1540409600,1540409855,AT -1540409856,1540410111,DE -1540410112,1540410367,KW -1540410368,1540410623,CH -1540410624,1540410879,RU -1540411136,1540411391,NL -1540411648,1540411903,FR -1540411904,1540412159,RU -1540412160,1540412415,BE -1540412416,1540412671,DE -1540412672,1540412927,RO -1540412928,1540413183,FR -1540413184,1540413439,RO -1540413440,1540413695,RU -1540413696,1540413951,AT -1540413952,1540414207,IL -1540414208,1540414463,GB -1540414464,1540414719,BE -1540414720,1540414975,SE -1540414976,1540415231,FR -1540415232,1540415487,RO -1540415488,1540415743,FR -1540415744,1540415999,SI -1540416000,1540416255,FR -1540416256,1540416511,CH -1540416768,1540417023,NL -1540417280,1540417535,UA -1540417536,1540417791,RU -1540417792,1540418047,HR -1540418048,1540418559,RO -1540418816,1540419071,FR -1540419072,1540419327,RU -1540419328,1540419583,GB -1540419840,1540420095,NL -1540420096,1540420607,GB -1540420608,1540420863,DE -1540420864,1540421119,GB -1540421376,1540421631,PL -1540421632,1540422143,RU -1540422144,1540422399,PL -1540422656,1540422911,GB -1540422912,1540423423,RU -1540423424,1540423679,BA -1540423680,1540423935,SE -1540423936,1540424191,CZ -1540424192,1540424447,AT -1540424448,1540424703,ES -1540424704,1540424959,PL -1540424960,1540425215,RO -1540425216,1540425471,US -1540425472,1540425727,NL -1540425728,1540425983,BG -1540425984,1540426239,RU -1540426240,1540426495,IE -1540426496,1540426751,UA -1540426752,1540427263,NL -1540427520,1540427775,FR -1540427776,1540428287,RU -1540428288,1540428543,SI -1540428544,1540428799,FR -1540428800,1540429055,PL -1540429568,1540429823,RO -1540429824,1540430079,UA -1540430080,1540430335,FR -1540430336,1540430591,DE -1540430592,1540430847,PL -1540430848,1540431103,CH -1540431104,1540431359,FI -1540431360,1540431615,NO -1540431616,1540431871,GB -1540431872,1540432127,HR -1540432128,1540432383,AT -1540432384,1540432639,GB -1540432640,1540432895,FR -1540432896,1540433151,UA -1540433152,1540433407,GB -1540433408,1540433663,AM -1540433664,1540433919,DK -1540434176,1540434431,CH -1540434432,1540434687,DE -1540434688,1540434943,GB -1540434944,1540435199,FR -1540435200,1540435455,RO -1540435456,1540435967,GR -1540436224,1540436479,SI -1540436736,1540436991,UA -1540436992,1540437247,DE -1540437248,1540437503,CH -1540437504,1540437759,RU -1540437760,1540438015,UA -1540438016,1540438271,PL -1540438272,1540438527,US -1540438784,1540439039,RU -1540439040,1540439295,GB -1540439296,1540439551,RO -1540440064,1540440319,UA -1540440320,1540440575,RU -1540440576,1540440831,MD -1540440832,1540441087,RU -1540441344,1540441855,RU -1540441856,1540442111,GB -1540442112,1540442367,RU -1540442368,1540442623,GB -1540442624,1540442879,IE -1540442880,1540443135,AT -1540443136,1540443391,RU -1540443392,1540443647,CZ -1540443648,1540443903,FR -1540443904,1540444159,GB -1540444160,1540444415,RU -1540444416,1540444671,DE -1540444672,1540445183,GB -1540445184,1540445439,CH -1540445440,1540445695,RU -1540445696,1540445951,GB -1540445952,1540446207,DE -1540446208,1540446463,NO -1540446464,1540446719,AT -1540446720,1540446975,UA -1540446976,1540447231,RU -1540447232,1540447487,DE -1540447488,1540447743,PL -1540447744,1540447999,RU -1540448000,1540448255,PL -1540448256,1540448511,UA -1540448512,1540448767,IT -1540448768,1540449023,CH -1540449536,1540449791,CZ -1540449792,1540450047,RO -1540450048,1540450303,FR -1540450304,1540450559,GB -1540450816,1540451071,IE -1540451072,1540451327,FR -1540451328,1540451583,ES -1540451584,1540451839,RO -1540451840,1540452095,NL -1540452096,1540452351,CH -1540452352,1540452607,AT -1540452608,1540452863,IL -1540452864,1540453119,HU -1540453376,1540453631,PL -1540453632,1540453887,FR -1540453888,1540454143,UA -1540454144,1540454399,RU -1540454400,1540454911,DE -1540454912,1540455167,RU -1540455168,1540455423,RO -1540455424,1540455679,RU -1540455680,1540455935,GB -1540455936,1540456191,UA -1540456192,1540457215,RU -1540457216,1540457471,GE -1540457472,1540457727,SI -1540457728,1540457983,BE -1540457984,1540458239,DE -1540458240,1540458495,ES -1540458496,1540458751,HR -1540458752,1540459007,NL -1540459008,1540459519,UA -1540459520,1540459775,GB -1540459776,1540460031,PL -1540460032,1540460287,GB -1540460288,1540460543,NL -1540460544,1540460799,GB -1540460800,1540461055,SI -1540461056,1540461311,BG -1540461312,1540461823,RU -1540462080,1540462335,SI -1540462592,1540463103,PL -1540463104,1540463359,FR -1540463360,1540463615,PL -1540463616,1540463871,DK -1540463872,1540464127,UA -1540464128,1540464383,CH -1540464384,1540464895,DE -1540464896,1540465407,GB -1540465664,1540465919,NL -1540465920,1540466175,UA -1540466176,1540466431,DK -1540466432,1540466687,RU -1540466688,1540466943,NL -1540466944,1540467455,CH -1540467456,1540467711,RO -1540467712,1540467967,KW -1540467968,1540468223,GR -1540468224,1540468735,FR -1540468736,1540468991,UA -1540468992,1540469247,PL -1540469248,1540469503,GB -1540469760,1540470015,PL -1540470016,1540470271,SI -1540470272,1540470527,IL -1540471040,1540471295,DE -1540471552,1540471807,GB -1540471808,1540472063,SI -1540472064,1540472319,RO -1540472320,1540472575,DK -1540472576,1540472831,FR -1540472832,1540473087,NL -1540473088,1540473343,UA -1540473344,1540473599,IT -1540473600,1540473855,RO -1540473856,1540474367,GB -1540474368,1540474623,RO -1540474624,1540474879,PL -1540474880,1540475135,GB -1540475136,1540475903,UA -1540475904,1540476159,CH -1540476160,1540476415,DE -1540476416,1540476671,UA -1540476672,1540476927,SI -1540476928,1540477183,NL -1540477440,1540477695,UA -1540477696,1540477951,DE -1540477952,1540478207,NO -1540478208,1540478463,NL -1540478464,1540478719,UA -1540478976,1540479231,HR -1540479232,1540479487,GB -1540479488,1540479743,RU -1540479744,1540479999,AT -1540480000,1540480255,GB -1540480256,1540480767,PL -1540480768,1540481023,GB -1540481280,1540481535,GB -1540481536,1540481791,UA -1540482048,1540482303,DK -1540482304,1540482559,FR -1540482816,1540483071,DE -1540483072,1540483327,SE -1540483328,1540483839,RU -1540483840,1540484095,UA -1540484096,1540484351,DK -1540484352,1540484607,SI -1540484608,1540484863,GB -1540484864,1540485119,UA -1540485120,1540485375,SE -1540485376,1540485631,RO -1540485632,1540485887,IR -1540485888,1540486143,ES -1540486144,1540486399,GB -1540486400,1540486655,FR -1540486656,1540486911,GB -1540486912,1540487167,SK -1540487168,1540487423,PS -1540487424,1540487679,UA -1540487680,1540487935,DE -1540487936,1540488191,SI -1540488192,1540488447,GB -1540488448,1540488703,SA -1540488704,1540488959,DE -1540488960,1540489215,RO -1540489216,1540491263,RU -1540491264,1540492287,UA -1540492288,1540493311,PL -1540493312,1540494335,CZ -1540494336,1540495359,UA -1540495360,1540496383,RU -1540496384,1540499455,UA -1540499456,1540500479,AM -1540500480,1540501503,RU -1540501504,1540502527,PL -1540502528,1540503551,RU -1540504576,1540505599,SE -1540506624,1540507647,GB -1540507648,1540508671,RU -1540509696,1540510719,RO -1540510720,1540511743,RU -1540511744,1540512767,BG -1540512768,1540514815,RU -1540515840,1540516863,RU -1540516864,1540517887,UA -1540517888,1540518911,RU -1540518912,1540519935,UA -1540519936,1540521983,RU -1540521984,1540523007,PL -1540523008,1540524031,RU -1540524032,1540525055,AL -1540525056,1540526079,AT -1540526080,1540527359,UA -1540527360,1540529151,RU -1540529152,1540530175,UA -1540530176,1540531199,RU -1540531200,1540532223,UA -1540532224,1540533247,RU -1540533248,1540534271,KZ -1540534272,1540535295,UA -1540535296,1540536319,SK -1540536320,1540537343,RU -1540537344,1540538367,UA -1540538368,1540542463,RU -1540542464,1540543487,PL -1540543488,1540544511,DE -1540544512,1540545535,RU -1540545536,1540546559,AT -1540546560,1540548607,RU -1540548608,1540549631,IE -1540549632,1540552703,PL -1540552704,1540553727,UA -1540553728,1540554751,RU -1540554752,1540555775,SE -1540555776,1540556799,UZ -1540556800,1540557823,DE -1540557824,1540558848,UA -1540558849,1540562943,RU -1540562944,1540563967,AT -1540563968,1540564991,RU -1540564992,1540566015,DE -1540566016,1540567039,RU -1540567040,1540568063,MD -1540568064,1540571135,RU -1540572160,1540573183,UA -1540573184,1540574207,NL -1540574208,1540576255,RU -1540576256,1540577279,PL -1540578304,1540579327,RU -1540579328,1540580351,IE -1540580352,1540581375,PL -1540581376,1540582399,RU -1540582400,1540583423,BG -1540583424,1540584447,DE -1540584448,1540586495,UA -1540586496,1540588543,RU -1540588544,1540589567,UA -1540589568,1540593663,RU -1540594688,1540595711,IT -1540596736,1540597759,FR -1540597760,1540598783,SE -1540598784,1540600831,UA -1540600832,1540602879,RU -1540602880,1540603903,BG -1540603904,1540604927,RU -1540605952,1540606975,MD -1540606976,1540607999,UA -1540608000,1540609023,RU -1540609024,1540610047,UA -1540610048,1540611071,RU -1540611072,1540612095,PL -1540613120,1540614143,RU -1540614144,1540615167,BG -1540615168,1540616191,RU -1540616192,1540617215,AT -1540617216,1540618239,LT -1540619264,1540620287,PL -1540620288,1540620543,NL -1540620544,1540620799,LB -1540620800,1540621055,PL -1540621056,1540621311,DE -1540621312,1540621567,BA -1540621568,1540621823,PL -1540621824,1540622335,RU -1540622336,1540622591,KW -1540622592,1540622847,PL -1540622848,1540623103,RU -1540623360,1540623615,GB -1540623616,1540623871,BG -1540624128,1540624383,RS -1540624384,1540624639,IR -1540624640,1540624895,BG -1540624896,1540625151,GB -1540625664,1540625919,FR -1540625920,1540626175,UA -1540626176,1540626431,RO -1540626432,1540626687,SI -1540626688,1540626943,PL -1540626944,1540627199,FR -1540627456,1540627711,DK -1540627712,1540627967,CH -1540627968,1540628223,PL -1540628224,1540628479,HR -1540628480,1540628735,KW -1540628736,1540628991,PL -1540628992,1540629247,UA -1540629248,1540629503,RO -1540629504,1540629759,DK -1540629760,1540630015,BG -1540630272,1540630527,RO -1540631040,1540631295,NL -1540631296,1540631551,CH -1540631552,1540631807,HR -1540632064,1540632319,AT -1540632320,1540632575,RU -1540632576,1540632831,DK -1540633088,1540633343,RU -1540633600,1540633855,IE -1540633856,1540634111,AE -1540634624,1540634879,UA -1540634880,1540635135,RU -1540635136,1540635391,FR -1540635392,1540635647,RO -1540635648,1540636159,RU -1540636160,1540636415,RO -1540636416,1540636671,LV -1540636672,1540636927,RU -1540637184,1540637439,RO -1540637440,1540637695,SA -1540637696,1540637951,RU -1540637952,1540638207,RS -1540638208,1540638463,RO -1540638464,1540638719,AM -1540639232,1540639487,RO -1540639488,1540639743,CH -1540639744,1540639999,IL -1540640000,1540640255,CH -1540640256,1540640511,FR -1540640512,1540640767,ES -1540640768,1540641023,UA -1540641024,1540641535,RU -1540641536,1540641791,DE -1540641792,1540642047,PL -1540642048,1540642303,DE -1540642304,1540642559,PL -1540642560,1540642815,DE -1540642816,1540643071,IE -1540643072,1540643327,UZ -1540643328,1540643583,GB -1540643584,1540643839,CH -1540643840,1540644095,NO -1540644096,1540644607,GB -1540644608,1540644863,DE -1540644864,1540645119,NL -1540645120,1540645375,RU -1540645376,1540645631,BE -1540645632,1540645887,NL -1540646144,1540646399,RO -1540646400,1540646655,PS -1540646656,1540646911,SE -1540646912,1540647167,RU -1540647168,1540647423,GB -1540647424,1540647679,RU -1540647936,1540648191,GB -1540648192,1540648447,CH -1540648448,1540648959,RO -1540648960,1540649215,SK -1540649216,1540649471,DE -1540649472,1540649727,IL -1540649728,1540649983,GB -1540649984,1540650239,FR -1540650240,1540650495,CH -1540650496,1540650751,RU -1540650752,1540651007,FR -1540651264,1540651519,CH -1540651520,1540651775,MK -1540652032,1540652543,UA -1540652544,1540652799,TR -1540652800,1540653055,PL -1540653056,1540653311,FR -1540653312,1540653567,DK -1540653568,1540653823,DE -1540653824,1540654079,GB -1540654336,1540654591,RU -1540654592,1540654847,SI -1540655104,1540655359,AT -1540655360,1540655615,RU -1540655616,1540655871,GB -1540655872,1540656383,NL -1540656896,1540657151,RO -1540657152,1540657407,DE -1540657408,1540657663,CY -1540657664,1540657919,RU -1540657920,1540658175,FR -1540658176,1540658431,RO -1540658688,1540659199,RU -1540659200,1540659455,FR -1540659712,1540659967,UA -1540659968,1540660223,PL -1540660224,1540660479,RU -1540660480,1540660735,FR -1540660736,1540660991,RU -1540661760,1540662015,RO -1540662272,1540662527,RO -1540662528,1540662783,PL -1540662784,1540663039,GB -1540663040,1540663295,IT -1540663296,1540663551,RU -1540663552,1540664063,PL -1540664064,1540664319,RU -1540664320,1540664575,PL -1540664576,1540665087,UA -1540665088,1540665343,ES -1540665344,1540665599,NL -1540665600,1540665855,UA -1540665856,1540666111,TR -1540666112,1540666367,RU -1540666368,1540666623,UZ -1540666624,1540666879,DE -1540666880,1540667135,GB -1540667136,1540667647,NL -1540667648,1540668159,BE -1540668160,1540668415,AT -1540668416,1540668671,SE -1540668672,1540668927,IL -1540668928,1540669695,RO -1540669696,1540669951,KZ -1540669952,1540670207,UA -1540670208,1540670463,RU -1540670464,1540670719,CH -1540670720,1540670975,RU -1540671232,1540671487,SI -1540671488,1540671743,CH -1540672000,1540672255,FR -1540672256,1540672511,UA -1540672512,1540672767,DE -1540672768,1540673023,FR -1540673024,1540673279,DE -1540673280,1540673535,SE -1540673536,1540673791,SI -1540673792,1540674047,SE -1540674048,1540674303,NL -1540674304,1540674559,FR -1540674560,1540674815,GB -1540674816,1540675071,GE -1540675072,1540675327,UA -1540675328,1540675583,NL -1540675584,1540675839,GB -1540675840,1540676351,RU -1540676352,1540676607,IT -1540676864,1540677119,RU -1540677120,1540677375,GB -1540677376,1540677631,PL -1540677632,1540677887,DK -1540677888,1540678143,GE -1540678400,1540678655,RO -1540678656,1540678911,SE -1540678912,1540679111,RU -1540679112,1540679159,NL -1540679160,1540679162,RU -1540679163,1540679167,NL -1540679168,1540679423,RU -1540679680,1540679935,LT -1540679936,1540680191,BG -1540680192,1540680447,CH -1540680448,1540680703,BG -1540680704,1540680959,FR -1540680960,1540681215,NL -1540681216,1540681471,FR -1540681472,1540681727,RU -1540681984,1540682239,IT -1540682240,1540682495,PL -1540682496,1540682751,DE -1540682752,1540683007,EE -1540683008,1540683263,DE -1540683520,1540683775,HR -1540683776,1540684031,UA -1540684032,1540684287,IT -1540684288,1540684543,HU -1540684544,1540684799,SI -1540684800,1540685055,IR -1540685056,1540685311,UA -1540685312,1540685567,RO -1540685568,1540685823,FR -1540685824,1540686079,SE -1540686080,1540686335,TR -1540686336,1540686591,CH -1540686592,1540686847,GB -1540686848,1540687103,CH -1540687104,1540687359,RU -1540687360,1540687615,AT -1540687616,1540687871,IT -1540687872,1540688127,UA -1540688128,1540688383,HU -1540688384,1540688639,CZ -1540688640,1540688895,RO -1540688896,1540689151,BG -1540689152,1540689407,NL -1540689408,1540689663,RU -1540689664,1540689919,FR -1540689920,1540690175,RO -1540690176,1540690431,DK -1540690432,1540690687,SA -1540690688,1540690943,RO -1540690944,1540691711,DE -1540691712,1540691967,RU -1540691968,1540692223,CH -1540692224,1540692735,FR -1540692736,1540692991,DE -1540692992,1540693247,GB -1540693504,1540693759,ES -1540693760,1540694015,UZ -1540694016,1540694271,CH -1540694272,1540694527,UA -1540694528,1540694783,RO -1540695040,1540695295,DE -1540695296,1540695551,NL -1540695552,1540695807,PL -1540695808,1540696063,RU -1540696064,1540696319,HU -1540696320,1540696575,FR -1540696576,1540696831,GB -1540696832,1540697087,EE -1540697088,1540697343,RU -1540697344,1540697599,GB -1540697600,1540697855,ES -1540697856,1540698111,NO -1540698112,1540698367,DE -1540698880,1540699135,RU -1540699136,1540699391,GR -1540699392,1540699647,NL -1540699648,1540699903,AT -1540699904,1540700159,RO -1540700160,1540700415,DE -1540700416,1540700671,RO -1540700672,1540700927,PL -1540700928,1540701183,UA -1540701184,1540701695,DE -1540701696,1540701951,UA -1540701952,1540702207,GB -1540702208,1540702463,PL -1540702464,1540702719,PT -1540702720,1540702975,DK -1540702976,1540703231,RU -1540703232,1540703487,GB -1540703488,1540703743,NL -1540703744,1540703999,DK -1540704000,1540704255,PL -1540704512,1540704767,IE -1540705280,1540705535,RO -1540705536,1540705791,AT -1540705792,1540706047,NL -1540706048,1540706303,FR -1540706304,1540706559,SI -1540706560,1540706815,GB -1540706816,1540707071,FR -1540707072,1540707327,AT -1540707328,1540707583,HR -1540707584,1540707839,NL -1540707840,1540708095,MD -1540708096,1540708351,RU -1540708352,1540708607,PL -1540708608,1540708863,SI -1540708864,1540709119,FR -1540709120,1540709375,DE -1540709376,1540709631,UA -1540710144,1540710399,NL -1540710400,1540710655,PL -1540710656,1540710911,FI -1540710912,1540711423,DE -1540711424,1540711679,CH -1540711680,1540711935,RO -1540711936,1540712191,FR -1540712192,1540712447,DE -1540712448,1540712703,RU -1540712704,1540713215,LV -1540713216,1540713727,PL -1540713728,1540713983,RU -1540713984,1540714239,GB -1540714496,1540714751,NL -1540714752,1540715263,RU -1540715264,1540715519,NL -1540715520,1540715775,DE -1540716032,1540716287,PL -1540716288,1540716543,UA -1540717056,1540717311,CZ -1540717312,1540717823,PL -1540717824,1540718079,UA -1540718080,1540718335,RU -1540718336,1540718591,NO -1540718592,1540718847,CH -1540718848,1540719103,IT -1540719104,1540719359,RU -1540719360,1540719615,SI -1540719616,1540719871,AT -1540719872,1540720127,CH -1540720128,1540720383,NL -1540720384,1540720639,RO -1540720640,1540720895,CH -1540720896,1540721151,PL -1540721408,1540721663,RU -1540721664,1540721919,GB -1540721920,1540722431,RU -1540722432,1540722687,CZ -1540722688,1540722943,RU -1540722944,1540723455,FR -1540723456,1540723711,SI -1540723968,1540724223,UA -1540724224,1540724479,HU -1540724736,1540724991,CH -1540724992,1540725247,IT -1540725248,1540725503,UA -1540725504,1540725759,SE -1540725760,1540726015,PL -1540726272,1540726527,RU -1540726528,1540726783,CH -1540726784,1540727039,CZ -1540727040,1540727295,FI -1540727296,1540727551,PL -1540727552,1540727807,RU -1540727808,1540728063,GB -1540728064,1540728319,NL -1540728320,1540728575,RU -1540728832,1540729343,RU -1540729344,1540729599,PL -1540729600,1540729855,CH -1540729856,1540730111,RU -1540730112,1540730367,GB -1540730624,1540730879,UA -1540730880,1540731135,IL -1540731136,1540731391,DE -1540731392,1540731647,NL -1540731648,1540731903,SE -1540731904,1540732159,FR -1540732160,1540732415,MD -1540732416,1540732671,UA -1540732672,1540732927,GB -1540732928,1540733183,RU -1540733184,1540733439,UA -1540733440,1540733695,RU -1540733696,1540733951,UA -1540733952,1540734207,GB -1540734464,1540734719,NL -1540734720,1540734975,IQ -1540734976,1540735231,UA -1540735232,1540735487,PL -1540735488,1540735743,CH -1540735744,1540735999,NL -1540736000,1540736255,RU -1540736256,1540736511,IT -1540736512,1540736767,DE -1540736768,1540737791,GB -1540737792,1540738047,NO -1540738048,1540738303,AT -1540738304,1540738559,SA -1540738560,1540738815,PL -1540738816,1540739071,DE -1540739328,1540739583,UA -1540739584,1540739839,IT -1540739840,1540740095,CZ -1540740096,1540740351,GB -1540740352,1540740607,SA -1540740608,1540740863,NL -1540740864,1540741119,ES -1540741120,1540741375,GB -1540741632,1540742143,NL -1540742400,1540742655,DE -1540742656,1540742911,AT -1540743168,1540743423,NO -1540743424,1540743679,GB -1540743680,1540743935,PL -1540743936,1540744191,CH -1540744192,1540744447,GR -1540744448,1540744703,FR -1540744704,1540744959,GB -1540744960,1540745215,UA -1540745216,1540745471,DE -1540745472,1540745727,KG -1540745728,1540746239,AT -1540746240,1540746495,FR -1540746496,1540747263,PL -1540747264,1540747519,RU -1540747520,1540747775,SI -1540747776,1540748031,FR -1540748032,1540748287,RU -1540748288,1540748543,CZ -1540748544,1540748799,TR -1540748800,1540749055,SE -1540749056,1540749311,RU -1540749312,1540749567,UZ -1540749568,1540749823,RU -1540749824,1540750079,SE -1540750080,1540750335,BE -1540750336,1540750591,DE -1540750592,1540751103,TR -1540751104,1540752383,PL -1540752384,1540753407,GB -1540753408,1540754431,DE -1540754432,1540755455,RO -1540755456,1540756479,UA -1540756480,1540757503,DK -1540757504,1540758527,PL -1540758528,1540759551,UA -1540760576,1540761599,PL -1540761600,1540762623,EE -1540762624,1540763647,LU -1540763648,1540764671,UA -1540764672,1540765695,PL -1540765696,1540766719,RU -1540766720,1540767743,IT -1540768768,1540769791,RU -1540769792,1540770815,IT -1540770816,1540771839,RU -1540771840,1540773887,UA -1540773888,1540774911,SE -1540775936,1540776959,RU -1540776960,1540777983,IL -1540777984,1540779007,HR -1540779008,1540780031,NL -1540780032,1540781055,UA -1540781056,1540783103,RU -1540783104,1540787199,UA -1540787200,1540789247,RU -1540790272,1540791295,KW -1540791296,1540792319,CZ -1540792320,1540793343,UA -1540793344,1540794367,FI -1540794368,1540795391,CH -1540795392,1540795647,RU -1540795648,1540795903,IE -1540795904,1540796159,KZ -1540796160,1540796415,RU -1540796416,1540798463,UA -1540798464,1540799487,RU -1540799488,1540800511,RO -1540800512,1540801535,CZ -1540801536,1540802559,RU -1540802560,1540803583,MD -1540803584,1540804607,RU -1540804608,1540805631,UA -1540805632,1540806655,RU -1540807680,1540809727,RU -1540809728,1540810751,GB -1540810752,1540811775,UA -1540811776,1540812799,PL -1540812800,1540813823,RU -1540813824,1540815871,UA -1540815872,1540816895,DE -1540816896,1540817919,PL -1540817920,1540818943,NL -1540818944,1540819967,UA -1540819968,1540820991,CZ -1540820992,1540823039,RU -1540823040,1540824063,UA -1540824064,1540825087,RU -1540825088,1540826111,PL -1540826112,1540828159,RU -1540828160,1540829183,PL -1540829184,1540830207,RU -1540830208,1540833279,UA -1540833280,1540834303,ES -1540834304,1540835327,UA -1540835328,1540836351,DE -1540836352,1540837375,RU -1540837376,1540838399,PL -1540838400,1540840447,RU -1540840448,1540841471,SE -1540841472,1540842495,KZ -1540842496,1540843519,DE -1540843520,1540844543,PL -1540844544,1540846591,RU -1540846592,1540847615,DE -1540847616,1540848639,RU -1540848640,1540849663,UA -1540849664,1540850687,RU -1540850688,1540851711,FI -1540851712,1540852239,KZ -1540852240,1540852240,RU -1540852241,1540852735,KZ -1540852736,1540853759,RU -1540853760,1540854783,UA -1540854784,1540855807,NL -1540855808,1540856831,BG -1540856832,1540857855,NL -1540857856,1540858879,DK -1540858880,1540859903,GB -1540859904,1540861951,RU -1540861952,1540862975,BY -1540862976,1540865023,GB -1540865024,1540872191,RU -1540872192,1540873215,BG -1540873216,1540875263,RU -1540875264,1540876287,PL -1540876288,1540877311,RU -1540877312,1540878335,PL -1540878336,1540879359,AT -1540879360,1540880383,RU -1540880384,1540881407,UA -1540881408,1540882431,RU -1540882432,1540882687,SE -1540882688,1540883199,LV -1540883200,1540883455,RU -1540883456,1540883711,IR -1540883712,1540883967,PL -1540883968,1540884223,IE -1540884224,1540884479,SE -1540884480,1540884735,RO -1540884736,1540884991,GB -1540884992,1540885247,BE -1540885504,1540885759,ES -1540885760,1540886015,DE -1540886016,1540886271,DK -1540886272,1540886527,UA -1540886528,1540886783,PL -1540886784,1540887039,IT -1540887040,1540887295,GB -1540887296,1540887551,FR -1540887552,1540887807,BE -1540887808,1540888063,MD -1540888064,1540888319,UA -1540888320,1540888575,DE -1540888576,1540888831,SE -1540888832,1540889087,PL -1540889088,1540889343,FR -1540889344,1540889599,RO -1540889600,1540889855,UA -1540889856,1540890111,FR -1540890112,1540890367,PL -1540890368,1540890623,IL -1540890624,1540890879,SE -1540890880,1540891135,DE -1540891136,1540891391,NL -1540891392,1540891647,DE -1540891648,1540891903,CH -1540891904,1540892159,GB -1540892160,1540892415,IT -1540892672,1540892927,GB -1540892928,1540893183,BE -1540893184,1540893439,GB -1540893440,1540893695,FR -1540893696,1540893951,HU -1540893952,1540894207,DE -1540894208,1540894463,RU -1540894464,1540894719,MD -1540894720,1540895487,RU -1540895488,1540895743,PL -1540895744,1540895999,RO -1540896000,1540896255,RU -1540896256,1540896511,SI -1540896512,1540896767,GB -1540897024,1540897279,GB -1540897280,1540897535,FR -1540897536,1540897791,SC -1540897792,1540898047,HU -1540898048,1540898303,UA -1540898304,1540898559,SE -1540898560,1540898815,ES -1540898816,1540899071,PL -1540899072,1540899327,SE -1540899328,1540899583,RU -1540899584,1540899839,FR -1540899840,1540900351,RU -1540900352,1540900607,HU -1540900608,1540900863,BG -1540900864,1540901119,RU -1540901376,1540901631,SI -1540901632,1540901887,RO -1540901888,1540902143,GR -1540902400,1540902655,RO -1540902656,1540902911,CH -1540902912,1540903167,RO -1540903168,1540903423,RU -1540903424,1540903679,GB -1540903680,1540904447,FR -1540904448,1540904703,EE -1540904704,1540904959,SI -1540904960,1540905471,GB -1540905472,1540905727,DE -1540905728,1540905983,TR -1540905984,1540906239,AT -1540906240,1540906495,GB -1540906496,1540906751,UA -1540906752,1540907007,BG -1540907008,1540907263,RU -1540907264,1540907519,MD -1540907520,1540907775,TR -1540907776,1540908031,PL -1540908032,1540908287,NL -1540908288,1540908543,DK -1540908544,1540908799,IT -1540908800,1540909055,DK -1540909056,1540909311,NL -1540909312,1540909567,GB -1540909568,1540909823,UA -1540909824,1540910079,FR -1540910080,1540910335,DE -1540910336,1540910591,SI -1540910592,1540910847,FR -1540910848,1540911103,SE -1540911104,1540911359,GB -1540911360,1540911615,NL -1540911616,1540911871,RU -1540911872,1540912127,PL -1540912128,1540912383,GB -1540912384,1540912639,PT -1540912640,1540912895,DK -1540912896,1540913151,TR -1540913152,1540913407,AT -1540913408,1540913663,RU -1540913920,1540914175,RU -1540914176,1540914687,PL -1540914688,1540914943,RU -1540914944,1540915199,IT -1540915200,1540915455,DE -1540915456,1540915967,RU -1540915968,1540916479,NL -1540916480,1540916735,UA -1540916736,1540916991,PL -1540916992,1540917247,UA -1540917248,1540917503,FI -1540917504,1540917759,GB -1540917760,1540918015,RO -1540918016,1540918527,FR -1540918528,1540919039,NL -1540919040,1540919295,GB -1540919296,1540919551,RO -1540919552,1540919807,BE -1540919808,1540920063,GB -1540920064,1540920319,RU -1540920320,1540920575,TR -1540920576,1540920831,PL -1540920832,1540921087,HU -1540921088,1540921599,RO -1540921600,1540922111,MT -1540922112,1540922367,ES -1540922368,1540922879,RO -1540922880,1540923135,DE -1540923136,1540923391,GB -1540923392,1540923647,PL -1540923648,1540923903,UA -1540923904,1540924159,NL -1540924160,1540924415,LT -1540924416,1540924671,RU -1540924672,1540924927,UA -1540924928,1540925183,MD -1540925184,1540925439,RU -1540925440,1540925695,CZ -1540925952,1540926207,TR -1540926208,1540926463,FR -1540926464,1540926719,SI -1540926720,1540926975,UA -1540926976,1540927231,BG -1540927232,1540927487,RU -1540927488,1540927743,GE -1540927744,1540927999,RO -1540928000,1540928255,KZ -1540928256,1540928511,CZ -1540928512,1540928767,GR -1540928768,1540929023,GB -1540929024,1540929279,DK -1540929280,1540929535,GB -1540929536,1540929791,NL -1540929792,1540930047,CZ -1540930048,1540930303,FR -1540930304,1540930559,RU -1540930560,1540930815,KW -1540930816,1540931071,KZ -1540931328,1540931839,PL -1540931840,1540932095,GB -1540932096,1540932351,PL -1540932352,1540932607,FR -1540932608,1540932863,UA -1540932864,1540933119,GB -1540933120,1540933375,RU -1540933376,1540933631,RO -1540933632,1540933887,NL -1540933888,1540934143,TR -1540934144,1540934399,PL -1540934400,1540934655,FR -1540934656,1540934911,PL -1540934912,1540935167,RU -1540935168,1540935423,GR -1540935424,1540935679,NL -1540935680,1540935935,RU -1540935936,1540936191,FR -1540936192,1540936447,CY -1540936448,1540936959,RU -1540936960,1540937471,PL -1540937728,1540937983,DE -1540937984,1540938239,RU -1540938240,1540938751,ES -1540938752,1540939007,KZ -1540939008,1540939263,FR -1540939264,1540939519,IL -1540939520,1540939775,TR -1540939776,1540940031,PL -1540940032,1540940287,RO -1540940288,1540940543,DK -1540940544,1540940799,RO -1540940800,1540941055,FR -1540941056,1540941311,CH -1540941312,1540941567,AT -1540941568,1540942079,UA -1540942080,1540942335,RO -1540942336,1540942591,FR -1540942592,1540942847,DE -1540942848,1540943103,IE -1540943104,1540943359,UA -1540943360,1540943615,BE -1540943616,1540943871,PL -1540943872,1540944127,UA -1540944128,1540944383,IE -1540944384,1540944639,AT -1540944640,1540944895,DE -1540944896,1540945151,UA -1540945152,1540945407,DE -1540945408,1540945663,GB -1540945664,1540945919,AT -1540945920,1540946175,DE -1540946176,1540946431,AT -1540946432,1540946943,UA -1540946944,1540947199,IL -1540947200,1540947455,BG -1540947456,1540947711,PL -1540947712,1540947967,IS -1540947968,1540948479,PL -1540948480,1540948991,RU -1540948992,1540949503,UA -1540950016,1540950527,RU -1540950528,1540951551,UA -1540951552,1540952063,RS -1540952064,1540952575,RU -1540952576,1540953087,PL -1540953088,1540953599,RU -1540953600,1540954623,PL -1540954624,1540955135,DE -1540955136,1540955647,RO -1540955648,1540956159,NL -1540956160,1540956671,SK -1540956672,1540957183,RU -1540957184,1540957695,DE -1540957696,1540958207,AT -1540958208,1540958719,PL -1540958720,1540959231,RU -1540959232,1540959743,FR -1540959744,1540960255,RU -1540960256,1540960767,PL -1540960768,1540961279,RU -1540961280,1540961791,CZ -1540961792,1540962303,AT -1540962304,1540962815,NL -1540962816,1540963839,UA -1540963840,1540964351,RU -1540964352,1540964863,IR -1540964864,1540965887,UA -1540965888,1540966399,RU -1540966400,1540966911,GB -1540966912,1540967935,RU -1540967936,1540968447,UA -1540968960,1540969471,RO -1540969472,1540969983,GB -1540969984,1540970495,DE -1540970496,1540971007,IE -1540971008,1540971519,UA -1540971520,1540972031,SI -1540972032,1540972543,FR -1540972544,1540973055,CZ -1540973056,1540973567,PL -1540973568,1540974079,UA -1540974080,1540974591,RU -1540974592,1540975103,PL -1540975104,1540975615,UA -1540975616,1540976639,RU -1540976640,1540977151,UA -1540977152,1540977663,PL -1540977664,1540978175,FI -1540978176,1540978687,AT -1540979200,1540979711,SI -1540979712,1540980223,RU -1540980224,1540980735,SI -1540980736,1540980991,CH -1540980992,1540981247,RU -1540981248,1540981503,RO -1540981504,1540981759,DE -1540981760,1540982015,PL -1540982016,1540982271,DK -1540982272,1540982527,GB -1540982784,1540983295,RU -1540983296,1540983551,ME -1540983808,1540984063,FR -1540984064,1540984319,DE -1540984320,1540984575,PL -1540984576,1540984831,RU -1540984832,1540985087,UA -1540985088,1540985343,DE -1540985344,1540985599,NL -1540985600,1540985855,TR -1540985856,1540986111,BG -1540986112,1540986367,AT -1540986368,1540986623,PL -1540986624,1540986879,FR -1540986880,1540987135,PL -1540987136,1540987391,LV -1540987392,1540987647,FR -1540987648,1540987903,GR -1540987904,1540988159,RU -1540988160,1540988415,AM -1540988416,1540988671,PL -1540988672,1540988927,RU -1540988928,1540989183,GB -1540989184,1540989439,PL -1540989696,1540989951,PL -1540989952,1540990207,FR -1540990208,1540990463,DE -1540990464,1540990719,UA -1540990976,1540991231,FR -1540991232,1540991487,HU -1540991488,1540991743,CH -1540991744,1540991999,PL -1540992000,1540992255,FR -1540992256,1540992511,AT -1540992512,1540993279,DE -1540993280,1540993535,LB -1540993536,1540993791,RU -1540993792,1540994047,UA -1540994048,1540994303,RU -1540994304,1540994559,SE -1540994560,1540994815,PL -1540994816,1540995071,UA -1540995072,1540995327,RU -1540995328,1540995583,IQ -1540995584,1540995839,SE -1540995840,1540996095,RO -1540996096,1540996351,DE -1540996352,1540996607,SE -1540996608,1540996863,RU -1540996864,1540997119,NL -1540997120,1540997375,RU -1540997376,1540997631,TR -1540997632,1540997887,RU -1540998144,1540998399,RU -1540998400,1540998655,UA -1540998656,1540998911,PL -1540998912,1540999167,DE -1540999424,1540999679,DK -1540999680,1540999935,RU -1540999936,1541000191,RO -1541000192,1541000447,PL -1541000448,1541000703,BG -1541000704,1541000959,DE -1541001216,1541001471,PL -1541001472,1541001727,SE -1541001728,1541001983,NL -1541001984,1541002239,FI -1541002240,1541002495,RU -1541002496,1541002751,AT -1541002752,1541003007,DE -1541003008,1541003263,BG -1541003264,1541003519,GB -1541003520,1541004031,PL -1541004032,1541004287,IL -1541004288,1541004543,RU -1541004544,1541004799,PL -1541004800,1541005055,SI -1541005312,1541005567,PL -1541005568,1541006079,AT -1541006080,1541006335,RU -1541006336,1541006591,PL -1541006592,1541006847,AT -1541006848,1541007103,DE -1541007104,1541007359,GB -1541007360,1541007615,DE -1541007616,1541007871,RU -1541007872,1541008127,FR -1541008128,1541008383,NL -1541008384,1541008639,RU -1541008640,1541008895,GB -1541008896,1541009151,TR -1541009408,1541009663,UA -1541009664,1541009919,CH -1541009920,1541010175,PL -1541010176,1541010431,GR -1541010432,1541010687,UA -1541010688,1541010943,GB -1541010944,1541011199,CY -1541011200,1541011455,CH -1541011456,1541011711,FI -1541012224,1541012479,DE -1541012480,1541012735,FI -1541012992,1541013247,UA -1541013248,1541013503,SI -1541013504,1541014527,RO -1541014528,1541015551,AM -1541015552,1541016575,RU -1541016576,1541018623,UA -1541019648,1541020671,RU -1541020672,1541022719,UA -1541023418,1541023418,UA -1541023744,1541024767,RU -1541024768,1541026815,UA -1541026816,1541027839,LV -1541028864,1541029887,PL -1541030912,1541031935,PL -1541031936,1541032959,UA -1541032960,1541033983,PL -1541033984,1541035007,BG -1541035008,1541036031,RU -1541036032,1541037055,UA -1541037056,1541038079,RU -1541038080,1541039103,UA -1541039104,1541040127,RU -1541040128,1541041151,UA -1541041152,1541044223,RU -1541044224,1541045247,US -1541045248,1541046271,NL -1541046272,1541051391,RU -1541051392,1541052415,NL -1541052416,1541053439,RO -1541053440,1541054463,PL -1541054464,1541055487,TJ -1541055488,1541056511,PL -1541056512,1541057535,TJ -1541057536,1541058559,RS -1541058560,1541059583,RU -1541059584,1541060607,AM -1541060608,1541061631,NO -1541061632,1541062655,CZ -1541062656,1541063679,UA -1541063680,1541065727,PL -1541065728,1541066751,NL -1541066752,1541067775,PL -1541067776,1541068799,UA -1541068800,1541069823,PL -1541069824,1541070847,RU -1541070848,1541071871,IT -1541071872,1541072895,RU -1541072896,1541073919,CZ -1541073920,1541074943,GB -1541074944,1541075967,PL -1541075968,1541078015,RU -1541078016,1541079039,RO -1541079040,1541080063,PL -1541080064,1541081087,RU -1541081088,1541082111,DE -1541082112,1541083135,RU -1541083136,1541084159,RO -1541084160,1541086207,RU -1541086208,1541086463,NL -1541086464,1541086975,UA -1541086976,1541087231,RU -1541087232,1541088255,UA -1541088256,1541089279,RU -1541089280,1541090303,GB -1541090304,1541091327,CZ -1541091328,1541092351,RU -1541092352,1541093375,UA -1541093376,1541094399,RU -1541094400,1541095423,UA -1541095424,1541096447,RU -1541096448,1541097471,AT -1541097472,1541098495,RU -1541098496,1541099519,NL -1541099520,1541100543,UA -1541100544,1541101567,HU -1541101568,1541102591,RU -1541102592,1541103615,SA -1541103616,1541105663,RU -1541105664,1541106687,PL -1541106688,1541107711,NL -1541107712,1541108735,PL -1541108736,1541109759,ES -1541109760,1541110783,PL -1541110784,1541111807,RU -1541111808,1541112831,PL -1541112832,1541113855,SK -1541113856,1541114879,RU -1541114880,1541116927,UA -1541116928,1541117951,RU -1541117952,1541118975,DK -1541118976,1541122047,RU -1541122048,1541123071,UA -1541123072,1541124095,FI -1541124096,1541126143,RU -1541126144,1541127167,PL -1541127168,1541129215,RU -1541129216,1541130239,UA -1541130240,1541132287,RU -1541132288,1541133311,PL -1541133312,1541134335,RO -1541134336,1541135359,SE -1541135360,1541136383,UA -1541136384,1541139455,RU -1541139456,1541140479,HU -1541140480,1541142527,CZ -1541142528,1541143551,RU -1541143552,1541144575,UA -1541144576,1541144831,PL -1541144832,1541145087,RU -1541145088,1541145343,AT -1541145344,1541145599,UA -1541145600,1541145855,IT -1541145856,1541146111,RU -1541146112,1541146367,UA -1541146368,1541146623,DK -1541146624,1541146879,AT -1541146880,1541147135,IL -1541147136,1541147391,PL -1541147392,1541147903,RU -1541147904,1541148415,RO -1541148416,1541148671,US -1541148672,1541148927,RU -1541148928,1541149439,PL -1541149440,1541149695,SE -1541149696,1541149951,LT -1541149952,1541150207,NL -1541150208,1541150463,IL -1541150464,1541150719,CH -1541150720,1541151231,GB -1541151232,1541151487,RO -1541151488,1541151743,FR -1541152000,1541152255,HU -1541152256,1541152511,NL -1541152512,1541152767,RU -1541152768,1541153023,PL -1541153024,1541153279,RU -1541153280,1541153535,DE -1541153792,1541154047,DE -1541154048,1541154303,NL -1541154304,1541154559,RU -1541154560,1541154815,PL -1541154816,1541155071,CH -1541155072,1541155327,CY -1541155328,1541155583,GB -1541155584,1541155839,LV -1541155840,1541156095,PL -1541156096,1541156351,IE -1541156352,1541156607,RU -1541156608,1541156863,SE -1541156864,1541157119,RO -1541157120,1541157375,DE -1541157376,1541157631,TR -1541157632,1541157887,KZ -1541157888,1541158143,GB -1541158144,1541158399,NL -1541158400,1541158655,PL -1541158656,1541158911,SI -1541158912,1541159167,DE -1541159168,1541159423,RU -1541159424,1541159679,SE -1541159680,1541159935,LT -1541159936,1541160447,UA -1541160448,1541160703,RU -1541160704,1541160959,RO -1541160960,1541161215,CH -1541161216,1541161471,TR -1541161472,1541161727,ES -1541161728,1541161983,DE -1541161984,1541162239,BE -1541162240,1541162495,RU -1541162496,1541162751,GB -1541163008,1541163263,RO -1541163264,1541163519,PL -1541163520,1541163775,DE -1541163776,1541164031,RO -1541164032,1541164287,RU -1541164288,1541164543,CH -1541164544,1541164799,SI -1541164800,1541165055,IR -1541165056,1541165311,UA -1541165312,1541165567,RU -1541165568,1541165823,NL -1541165824,1541166079,GB -1541166336,1541166591,FR -1541166592,1541166847,RO -1541166848,1541167103,RU -1541167104,1541167359,NL -1541167360,1541167615,AT -1541167872,1541168127,UA -1541168128,1541168639,RU -1541168640,1541168895,MD -1541168896,1541169151,MK -1541169152,1541169407,RO -1541169408,1541169663,PL -1541169664,1541169919,SE -1541169920,1541170431,CH -1541170432,1541170687,NL -1541170688,1541170943,BE -1541170944,1541171199,PL -1541171200,1541171455,UA -1541171456,1541171711,PL -1541171712,1541171967,UA -1541171968,1541172223,SI -1541172224,1541172479,GR -1541172480,1541172735,RU -1541172736,1541172991,IS -1541172992,1541173247,BE -1541173248,1541173503,RU -1541173504,1541173759,UA -1541173760,1541174015,LT -1541174016,1541174271,DE -1541174272,1541174527,FR -1541174528,1541174783,SE -1541174784,1541175039,GB -1541175040,1541175295,SI -1541175296,1541175551,RU -1541175552,1541175807,RO -1541175808,1541176063,CZ -1541176064,1541176319,NL -1541176320,1541176575,AM -1541176576,1541176831,DE -1541177088,1541177343,GB -1541177344,1541177599,CH -1541177600,1541177855,DE -1541177856,1541178111,RO -1541178368,1541178623,GB -1541178624,1541178879,RU -1541178880,1541179135,DE -1541179136,1541179391,RU -1541179392,1541179647,BE -1541179648,1541179903,RU -1541179904,1541180159,IS -1541180160,1541180415,MT -1541180416,1541180671,UA -1541180672,1541180927,GB -1541180928,1541181183,IT -1541181184,1541181439,NO -1541181440,1541181695,MD -1541181696,1541182207,RU -1541182208,1541182463,NL -1541182464,1541182719,DE -1541182720,1541182975,RO -1541182976,1541183231,SE -1541183232,1541183487,UA -1541183488,1541183743,RU -1541183744,1541183999,DE -1541184000,1541184255,BE -1541184256,1541184511,RU -1541184512,1541184767,SI -1541184768,1541185023,DE -1541185024,1541185279,ES -1541185280,1541185535,DE -1541185536,1541185791,GB -1541185792,1541186047,UA -1541186048,1541186303,CH -1541186304,1541186559,UA -1541186560,1541186815,PL -1541186816,1541187071,NO -1541187072,1541187327,RU -1541187328,1541187583,RO -1541187584,1541187839,IT -1541187840,1541188351,RU -1541188608,1541188863,HU -1541188864,1541189119,RU -1541189120,1541189375,UA -1541189376,1541189631,GB -1541189888,1541190143,PL -1541190144,1541190399,GB -1541190400,1541190655,AT -1541190656,1541190911,GB -1541190912,1541191167,RU -1541191168,1541191423,TR -1541191424,1541191679,RO -1541191680,1541192191,NL -1541192448,1541192703,ME -1541192704,1541192959,RU -1541192960,1541193215,BG -1541193216,1541193471,UA -1541193472,1541193727,BE -1541193728,1541193983,SE -1541193984,1541194239,IL -1541194240,1541194495,SI -1541194496,1541194751,JO -1541194752,1541195007,NO -1541195008,1541195263,FR -1541195264,1541195519,UA -1541195520,1541195775,GB -1541195776,1541196031,FR -1541196032,1541196287,CZ -1541196800,1541197055,UA -1541197056,1541197311,PL -1541197312,1541197567,RU -1541197568,1541197823,MD -1541197824,1541198079,GR -1541198080,1541198335,LT -1541198336,1541198591,AT -1541198592,1541198847,RU -1541198848,1541199103,GB -1541199104,1541199359,SI -1541199360,1541199615,GB -1541199616,1541199871,RU -1541199872,1541200127,GB -1541200128,1541200383,NO -1541200384,1541201151,RU -1541201152,1541201407,SI -1541201408,1541201663,PL -1541201920,1541202175,IE -1541202176,1541202431,PL -1541202432,1541202687,ES -1541202688,1541202943,SE -1541202944,1541203199,DE -1541203456,1541203711,UA -1541203712,1541203967,GB -1541203968,1541204223,RO -1541204224,1541204479,RU -1541204480,1541204735,GB -1541204736,1541204991,UA -1541204992,1541205247,GR -1541205248,1541205503,SK -1541205504,1541205759,PL -1541205760,1541206015,AT -1541206016,1541206271,SI -1541206272,1541206527,FI -1541206528,1541206783,TR -1541206784,1541207039,NO -1541207040,1541207295,DE -1541207296,1541207807,FR -1541207808,1541208063,HU -1541208064,1541208319,FR -1541208320,1541208575,NL -1541208576,1541208831,BY -1541208832,1541209087,HU -1541209088,1541209599,UA -1541209600,1541209855,SE -1541209856,1541210111,UA -1541210112,1541210623,RU -1541210624,1541211135,CZ -1541211136,1541211647,SK -1541211648,1541212159,UA -1541212160,1541212671,DE -1541212672,1541213183,MT -1541213184,1541213695,DE -1541213696,1541214207,UA -1541214208,1541215231,RU -1541215232,1541215743,LV -1541215744,1541216255,SA -1541216256,1541216767,RU -1541216768,1541217279,PL -1541217280,1541218303,RU -1541218304,1541218815,IT -1541218816,1541219839,RU -1541219840,1541220351,CZ -1541220352,1541221375,RU -1541221376,1541221887,PL -1541221888,1541222399,CZ -1541222400,1541222911,RU -1541222912,1541223423,DK -1541223424,1541223935,RU -1541223936,1541224447,GB -1541224448,1541224959,RU -1541224960,1541225471,DE -1541225472,1541225983,RU -1541225984,1541226495,LV -1541226496,1541227007,UA -1541227008,1541227519,FI -1541227520,1541227775,RU -1541227776,1541228031,NL -1541228032,1541228543,RU -1541228544,1541229055,CZ -1541229056,1541229567,UA -1541230080,1541230591,RO -1541230592,1541231103,RU -1541231104,1541231615,GB -1541231616,1541232127,UA -1541232128,1541232639,RU -1541232640,1541233151,PL -1541233152,1541233663,RU -1541234176,1541234687,RO -1541234688,1541235199,NL -1541235200,1541235455,RU -1541235456,1541235711,NL -1541235712,1541236223,AT -1541236224,1541236735,RU -1541236736,1541237247,DE -1541237445,1541237445,RU -1541237760,1541238271,RU -1541238272,1541239295,SK -1541239296,1541239807,PL -1541240320,1541240831,CH -1541240832,1541241343,DE -1541241344,1541241855,PL -1541241856,1541242367,UA -1541242368,1541242879,PL -1541242880,1541243391,KW -1541243392,1541243903,NO -1541243904,1541244415,UA -1541244416,1541244927,RS -1541244928,1541245439,UA -1541245440,1541245951,AT -1541245952,1541246463,RU -1541246464,1541246975,DK -1541246976,1541247487,PL -1541247488,1541247999,FR -1541248000,1541248511,CZ -1541248512,1541249023,NL -1541249024,1541249535,GB -1541249536,1541250047,UA -1541250048,1541250559,RU -1541250560,1541251071,PL -1541251072,1541251583,NL -1541251584,1541252607,RU -1541252608,1541253119,UA -1541253120,1541253631,GB -1541253632,1541254143,SI -1541254144,1541254655,PL -1541254656,1541255679,RU -1541255680,1541256191,UA -1541256192,1541256703,RU -1541256704,1541257215,DE -1541257216,1541257727,SA -1541257728,1541258239,EE -1541258240,1541258751,RU -1541258752,1541259263,UA -1541259264,1541259775,CH -1541259776,1541260287,RU -1541260288,1541260799,DK -1541260800,1541261823,RU -1541261824,1541262335,SA -1541262336,1541262847,DE -1541262848,1541263359,DK -1541263360,1541263871,NL -1541263872,1541264383,UA -1541264384,1541264895,CZ -1541264896,1541265407,PL -1541265408,1541265919,RS -1541265920,1541266431,UA -1541266432,1541266943,KW -1541266944,1541267455,CY -1541267456,1541267967,FR -1541267968,1541268479,DE -1541268480,1541268991,AM -1541268992,1541269503,NL -1541269504,1541270015,RU -1541270016,1541270527,UA -1541270528,1541271039,IT -1541271040,1541271551,FI -1541271552,1541272063,RO -1541272064,1541272575,RU -1541272576,1541273087,FR -1541273088,1541274623,RU -1541274624,1541275135,UA -1541275136,1541275647,FR -1541275648,1541276671,UA -1541276672,1541277695,RS -1541277696,1541278719,GB -1541278720,1541280767,UA -1541280768,1541281791,BG -1541281792,1541282815,PL -1541282816,1541283839,RU -1541283840,1541285887,UA -1541285888,1541286911,CZ -1541286912,1541287935,DE -1541287936,1541288959,RU -1541288960,1541289983,CZ -1541289984,1541291007,PL -1541291008,1541293055,UA -1541293056,1541295103,PL -1541295104,1541297151,UA -1541297152,1541298175,CH -1541298176,1541299199,KZ -1541299200,1541300223,AT -1541300224,1541301247,DE -1541301248,1541302271,PL -1541302272,1541303295,SK -1541303296,1541304319,PL -1541304320,1541305343,UA -1541305344,1541306367,PL -1541306368,1541307391,RU -1541307392,1541308415,PL -1541308416,1541309439,RU -1541309440,1541310463,CH -1541310464,1541311487,UA -1541311488,1541314559,PL -1541314560,1541315583,UA -1541315584,1541316607,RU -1541316608,1541317631,PL -1541317632,1541318655,RU -1541318656,1541319679,UA -1541319680,1541320703,CZ -1541320704,1541321727,DE -1541321728,1541322751,UA -1541322752,1541323775,PL -1541323776,1541324799,FI -1541324800,1541325823,PL -1541325824,1541326847,IR -1541326848,1541327871,SA -1541327872,1541328895,IR -1541328896,1541329919,RU -1541329920,1541330943,PL -1541330944,1541331967,RU -1541331968,1541332991,UA -1541332992,1541334015,PL -1541334016,1541335039,RU -1541335040,1541336063,DE -1541336064,1541338111,RU -1541338112,1541341183,UA -1541341184,1541341439,TR -1541341440,1541341695,RU -1541341696,1541341951,DE -1541341952,1541342463,PL -1541342464,1541342719,FR -1541342720,1541342975,PL -1541342976,1541343231,RU -1541343232,1541343487,TR -1541343488,1541343743,IE -1541343744,1541343999,GB -1541344000,1541344255,IL -1541344256,1541344511,IT -1541344512,1541345023,PL -1541345024,1541345279,RU -1541345280,1541345535,GB -1541345536,1541345791,CH -1541345792,1541346047,DE -1541346048,1541346303,UA -1541346304,1541346559,DE -1541346560,1541346815,BE -1541346816,1541347071,FR -1541347072,1541347327,PL -1541347328,1541347583,HR -1541347584,1541347839,RU -1541347840,1541348095,SI -1541348096,1541348351,UA -1541348608,1541348863,HR -1541348864,1541349119,UA -1541349120,1541349375,PL -1541349376,1541349631,RU -1541349632,1541349887,PL -1541349888,1541350143,RU -1541350144,1541350399,FR -1541350400,1541350655,NO -1541350656,1541350911,RU -1541350912,1541351167,AT -1541351168,1541351423,SI -1541351424,1541351679,FR -1541351680,1541351935,DE -1541351936,1541352191,GR -1541352192,1541352447,SI -1541352448,1541352703,RU -1541352704,1541352959,RO -1541352960,1541353215,GB -1541353216,1541353471,SE -1541353472,1541353727,UA -1541353728,1541353983,SI -1541353984,1541354239,RO -1541354240,1541354495,SE -1541354496,1541354751,PL -1541354752,1541355007,UA -1541355008,1541355263,IL -1541355264,1541355519,PL -1541355520,1541355775,NL -1541355776,1541356031,PL -1541356032,1541356287,GB -1541356288,1541356543,UA -1541356544,1541356799,RU -1541356800,1541357055,ES -1541357056,1541357311,FR -1541357312,1541357567,RU -1541357568,1541357823,PL -1541357824,1541358079,HR -1541358080,1541358335,BG -1541358336,1541358591,GB -1541358592,1541358847,PL -1541358848,1541359103,SK -1541359360,1541359615,FR -1541359616,1541359871,PL -1541359872,1541360127,FR -1541360128,1541360383,CZ -1541360640,1541360895,FR -1541360896,1541361151,UA -1541361152,1541361407,PL -1541361408,1541361663,CH -1541361664,1541361919,SI -1541361920,1541362175,PL -1541362176,1541362431,NL -1541362432,1541362687,PL -1541362688,1541362943,FR -1541362944,1541363199,DK -1541363200,1541363455,UA -1541363456,1541363711,IE -1541363712,1541363967,UA -1541364224,1541364479,RU -1541364480,1541364735,AT -1541364736,1541364991,SE -1541364992,1541365247,RU -1541365248,1541365503,GB -1541365504,1541365759,NL -1541365760,1541366015,DE -1541366016,1541366271,UA -1541366272,1541366527,RU -1541366784,1541367039,NO -1541367040,1541367295,AT -1541367296,1541367551,UA -1541367552,1541367807,RU -1541367808,1541368063,GR -1541368064,1541368319,RU -1541368320,1541368575,IL -1541368576,1541368831,FI -1541368832,1541369343,RU -1541369344,1541369599,UA -1541369600,1541369855,GB -1541369856,1541370111,UA -1541370112,1541370367,SI -1541370368,1541370623,DE -1541370624,1541370879,SI -1541370880,1541371135,FI -1541371136,1541371391,RO -1541371392,1541371647,RU -1541371648,1541371903,PL -1541371904,1541372159,RU -1541372160,1541372415,CH -1541372416,1541372671,UA -1541372672,1541373183,NL -1541373184,1541373439,FR -1541373696,1541373951,UA -1541373952,1541374207,RU -1541374208,1541374463,DE -1541374464,1541374719,PL -1541374720,1541374975,NL -1541374976,1541375231,GR -1541375232,1541375487,UA -1541375488,1541375999,PL -1541376000,1541376255,UA -1541376256,1541376767,RU -1541376768,1541377023,FR -1541377024,1541377279,NL -1541377280,1541377535,DE -1541377536,1541377791,PL -1541377792,1541378047,ES -1541378048,1541378303,RU -1541378304,1541378559,DE -1541378560,1541378815,GB -1541378816,1541379071,AT -1541379072,1541379327,RO -1541379328,1541379583,UA -1541379584,1541379839,FR -1541379840,1541380095,DE -1541380096,1541380351,UA -1541380352,1541380607,RU -1541380608,1541380863,CH -1541380864,1541381119,IT -1541381120,1541381375,RO -1541381376,1541381631,TR -1541381632,1541381887,RO -1541381888,1541382143,FR -1541382144,1541382399,PL -1541382400,1541382655,SE -1541382656,1541382911,RS -1541383168,1541383423,CY -1541383424,1541383679,LV -1541383680,1541383935,SI -1541383936,1541384447,PL -1541384704,1541384959,RU -1541384960,1541385215,PL -1541385216,1541385471,NL -1541385472,1541385727,SK -1541385728,1541385983,SI -1541385984,1541386239,PL -1541386240,1541386495,RU -1541386496,1541386751,UA -1541386752,1541387007,RU -1541387008,1541387263,CH -1541387264,1541387519,UA -1541387520,1541387775,RU -1541387776,1541388031,SI -1541388032,1541388287,RO -1541388288,1541388543,PL -1541388544,1541388799,RO -1541388800,1541389055,CH -1541389056,1541389311,NL -1541389312,1541389567,RU -1541389568,1541389823,SI -1541389824,1541390079,RO -1541390080,1541390335,NL -1541390336,1541390591,DK -1541390592,1541390847,SI -1541390848,1541391103,RU -1541391104,1541391359,BE -1541391360,1541391615,PL -1541391616,1541391871,SI -1541391872,1541392127,DE -1541392128,1541392383,RU -1541392384,1541392639,RO -1541392640,1541392895,AT -1541392896,1541393151,DE -1541393152,1541393407,GB -1541393408,1541393663,DE -1541393664,1541393919,UA -1541393920,1541394175,ES -1541394176,1541394431,FR -1541394432,1541394687,CY -1541394688,1541394943,SK -1541394944,1541395199,SA -1541395200,1541395455,DE -1541395456,1541395711,PL -1541395712,1541395967,NO -1541395968,1541396223,UA -1541396224,1541396479,LB -1541396480,1541396735,UA -1541396736,1541396991,RU -1541396992,1541397247,GB -1541397248,1541397503,SE -1541397504,1541397759,SM -1541397760,1541398015,PL -1541398016,1541398271,HU -1541398272,1541398527,UA -1541398528,1541398783,RU -1541398784,1541399039,PL -1541399040,1541399295,RU -1541399296,1541399551,UA -1541399552,1541399807,DE -1541399808,1541400063,RU -1541400064,1541400319,SI -1541400320,1541400831,SE -1541400832,1541401087,NL -1541401088,1541401343,UA -1541401344,1541401599,DK -1541401856,1541402111,HR -1541402112,1541402367,SI -1541402368,1541402623,RU -1541402624,1541402879,FR -1541402880,1541403135,PL -1541403136,1541403391,RU -1541403392,1541403647,EE -1541403648,1541403903,RU -1541403904,1541404159,GE -1541404160,1541404415,RU -1541404416,1541404671,DE -1541404672,1541404927,AT -1541404928,1541405183,HR -1541405184,1541405439,PL -1541405440,1541405951,RU -1541405952,1541406207,FR -1541406208,1541406463,RU -1541406464,1541406719,GB -1541406720,1541407231,LV -1541407232,1541407743,UA -1541407744,1541408255,FI -1541408256,1541408767,FR -1541408768,1541409791,UA -1541409792,1541410303,LV -1541410304,1541410815,RU -1541410816,1541411327,UA -1541411328,1541412863,RU -1541412864,1541413375,UA -1541413376,1541413887,GB -1541413888,1541414399,PL -1541414400,1541414655,UA -1541414656,1541415935,RU -1541415936,1541416447,SE -1541416448,1541416959,PL -1541416960,1541417471,RO -1541417472,1541417983,SK -1541417984,1541418495,UA -1541418496,1541419007,PL -1541419008,1541419519,CZ -1541419520,1541420031,RO -1541420032,1541420543,RU -1541420544,1541421055,NL -1541421056,1541421567,PL -1541421568,1541422079,CZ -1541422080,1541422591,PL -1541422592,1541423103,RU -1541423616,1541424127,AT -1541424128,1541424639,UA -1541424640,1541425151,AT -1541425152,1541425663,IT -1541425664,1541426175,UA -1541426176,1541426687,RU -1541426688,1541427199,UA -1541427200,1541428223,RU -1541428224,1541428735,UA -1541428736,1541429247,RU -1541429248,1541429759,FI -1541429760,1541430271,CZ -1541430272,1541430783,LT -1541430784,1541431295,CH -1541431296,1541431807,UA -1541431808,1541432319,RU -1541432832,1541433343,RU -1541433344,1541433855,PL -1541433856,1541434367,RU -1541434368,1541434879,GB -1541434880,1541435391,IR -1541435392,1541435903,UA -1541435904,1541436415,RU -1541436416,1541437951,PL -1541437952,1541438463,NL -1541438464,1541439487,RU -1541439488,1541439999,PL -1541440000,1541441023,RU -1541441024,1541441535,LT -1541441536,1541442559,RU -1541442560,1541443071,NL -1541443072,1541444607,PL -1541444608,1541445119,FR -1541445120,1541445631,ES -1541445632,1541446143,GB -1541446144,1541446655,RU -1541446656,1541447167,UA -1541447168,1541447679,DE -1541447680,1541448191,NL -1541448192,1541448703,FR -1541448704,1541449215,NL -1541449216,1541449727,RU -1541449728,1541450239,UA -1541450240,1541450751,RU -1541450752,1541451263,SI -1541451264,1541451775,DK -1541451776,1541452287,IR -1541452288,1541452799,UA -1541452800,1541453311,PL -1541453312,1541453823,RU -1541453824,1541454335,PL -1541454336,1541454847,GB -1541454848,1541455359,EE -1541455360,1541455871,GB -1541455872,1541456383,PL -1541456384,1541456895,RU -1541456896,1541457919,PL -1541457920,1541458943,UA -1541458944,1541460479,RU -1541460480,1541460991,DK -1541460992,1541461503,RO -1541461504,1541462527,PL -1541462528,1541463039,RU -1541463040,1541463551,PL -1541463552,1541464063,UA -1541464064,1541464575,PL -1541464576,1541465087,DE -1541465600,1541466111,FR -1541466112,1541467135,RU -1541467136,1541467647,PL -1541467648,1541468159,SI -1541468160,1541468671,ES -1541468672,1541469183,NL -1541469184,1541469695,SE -1541470208,1541470719,NL -1541470720,1541471231,RS -1541471232,1541472255,UA -1541472256,1541473279,GB -1541473280,1541474303,UA -1541474304,1541475327,PL -1541475328,1541476351,RO -1541476352,1541477375,GB -1541477376,1541479423,RU -1541479424,1541480447,PL -1541480448,1541480959,US -1541480960,1541481471,RO -1541481472,1541485567,UA -1541485568,1541486591,IR -1541486592,1541487615,UA -1541487616,1541488639,NO -1541488640,1541489663,PL -1541489664,1541490687,FI -1541490688,1541491711,UA -1541491712,1541492735,RU -1541492736,1541493759,UA -1541493760,1541494783,CZ -1541494784,1541496831,UA -1541496832,1541497855,SI -1541497856,1541498879,RU -1541498880,1541499903,LT -1541499904,1541500927,UA -1541500928,1541501951,RU -1541501952,1541503999,UA -1541504000,1541506047,RU -1541506048,1541507071,PL -1541507072,1541510143,UA -1541510144,1541512191,RU -1541512192,1541513215,PL -1541513216,1541517311,UA -1541517312,1541518335,PL -1541518336,1541519359,IT -1541519360,1541521407,PL -1541521408,1541522431,RU -1541522432,1541524479,UA -1541524480,1541525503,SA -1541525504,1541527551,RU -1541527552,1541528575,SC -1541528576,1541530623,UA -1541530624,1541531647,RU -1541531648,1541532671,UA -1541532672,1541533695,RU -1541533696,1541534719,PL -1541534720,1541535743,IT -1541535744,1541536767,IE -1541536768,1541537791,RU -1541537792,1541538303,GB -1541538304,1541538815,RO -1541538816,1541539327,UA -1541539328,1541539839,PL -1541539840,1541540351,HR -1541540352,1541541375,RU -1541541376,1541541887,UA -1541541888,1541542399,PL -1541542400,1541542911,FR -1541542912,1541543423,MK -1541543424,1541543935,PL -1541543936,1541544447,GB -1541544448,1541544959,PL -1541544960,1541545471,FR -1541545472,1541545983,RU -1541545984,1541546495,LV -1541546496,1541547007,UA -1541547008,1541547519,SE -1541547520,1541548543,PL -1541548544,1541549055,UA -1541549056,1541549567,PL -1541549568,1541550079,DE -1541550080,1541550591,RU -1541550592,1541551103,PL -1541551104,1541552127,RO -1541552128,1541553151,UA -1541553152,1541555199,RU -1541555200,1541556223,PL -1541556480,1541556735,RU -1541556736,1541557247,IT -1541557504,1541557759,SI -1541558016,1541558271,HU -1541558272,1541559295,RU -1541560320,1541561343,DE -1541561344,1541562367,RU -1541562624,1541562879,UA -1541562880,1541563135,FR -1541563136,1541563391,NL -1541563392,1541564415,PL -1541564416,1541565439,RU -1541565440,1541565951,IT -1541565952,1541566463,PL -1541566464,1541567487,SK -1541567488,1541567743,RU -1541567744,1541567999,PL -1541568000,1541568511,SE -1541568512,1541569535,RU -1541569536,1541570559,NL -1541570560,1541573119,RU -1541573120,1541573631,UA -1541573632,1541574655,RU -1541574656,1541575167,SE -1541575168,1541575423,PL -1541575424,1541575679,IT -1541575680,1541577727,RU -1541577728,1541578751,AT -1541579008,1541579263,RU -1541579264,1541579775,DE -1541579776,1541580799,RU -1541580800,1541581311,KZ -1541581312,1541581567,HR -1541581568,1541582847,RU -1541582848,1541583359,ES -1541583360,1541583615,RU -1541583616,1541583871,GE -1541583872,1541584127,SE -1541584128,1541584383,GB -1541584384,1541584895,NL -1541585152,1541585663,RU -1541585664,1541585919,UA -1541585920,1541586431,RU -1541586432,1541587199,UA -1541587200,1541587455,FR -1541587456,1541588991,PL -1541588992,1541589247,RU -1541589248,1541589503,UA -1541589504,1541590015,CH -1541590016,1541590527,RU -1541590528,1541590783,GB -1541590784,1541591039,UA -1541591040,1541592063,RU -1541592064,1541592575,UA -1541592576,1541593087,FR -1541593088,1541594111,CZ -1541594112,1541594367,AL -1541594624,1541595135,RU -1541595136,1541595647,IR -1541595648,1541596159,BG -1541596160,1541597695,PL -1541597696,1541597951,RU -1541597952,1541598207,AM -1541598208,1541599231,PL -1541599232,1541600255,RS -1541600256,1541600511,HR -1541600512,1541600767,IL -1541600768,1541601023,SI -1541601024,1541601279,RU -1541601280,1541601791,DE -1541601792,1541602047,RU -1541602048,1541602303,PL -1541602304,1541603327,UA -1541603328,1541604351,PL -1541604352,1541605119,TR -1541605120,1541605375,CZ -1541605376,1541606911,RU -1541606912,1541607423,UZ -1541607424,1541608447,RU -1541608448,1541608703,DE -1541608704,1541608959,PL -1541608960,1541609215,SA -1541609216,1541609471,RU -1541609472,1541609983,SA -1541609984,1541610239,GB -1541610240,1541610495,NL -1541610496,1541611775,RU -1541611776,1541612031,RO -1541612032,1541612543,RU -1541612544,1541614079,PL -1541614080,1541614335,UA -1541614336,1541614591,SI -1541614592,1541615615,RU -1541615616,1541615871,CH -1541615872,1541616127,SE -1541616128,1541617663,RU -1541617664,1541619199,PL -1541619200,1541619455,GB -1541619456,1541620735,PL -1541620736,1541620991,RU -1541620992,1541621247,UA -1541621248,1541621759,IL -1541621760,1541622271,RO -1541622272,1541622527,RU -1541622528,1541622783,NL -1541622784,1541623295,PL -1541623296,1541623551,GB -1541623552,1541623807,RU -1541623808,1541624831,PL -1541624832,1541625855,IR -1541625856,1541626367,PL -1541626368,1541626623,RO -1541626624,1541627903,RU -1541627904,1541628415,CZ -1541628416,1541628927,DE -1541628928,1541629183,PT -1541629184,1541629439,LV -1541629440,1541630975,PL -1541630976,1541631231,GR -1541631232,1541631487,IT -1541631488,1541631999,SI -1541632000,1541632511,RU -1541632512,1541632767,NL -1541632768,1541634303,PL -1541634304,1541634559,MD -1541634560,1541635071,PL -1541635072,1541636095,GB -1541636096,1541636863,AT -1541636864,1541637119,RO -1541637632,1541638143,CZ -1541638144,1541638399,RU -1541638656,1541639167,HU -1541639168,1541640191,RU -1541640192,1541641215,KZ -1541641216,1541641727,RU -1541641728,1541642239,UA -1541642240,1541643263,RU -1541643264,1541644287,PL -1541644288,1541645311,RU -1541645312,1541645823,IL -1541645824,1541646079,RO -1541646080,1541646335,PL -1541646336,1541648383,RU -1541648384,1541648639,PL -1541648640,1541648895,DK -1541648896,1541649151,GB -1541649152,1541649407,NL -1541649408,1541650431,UA -1541650432,1541650687,RU -1541650688,1541650943,MD -1541650944,1541651199,SE -1541651200,1541651455,FI -1541651456,1541652479,RU -1541652480,1541652991,FI -1541652992,1541653247,FR -1541653248,1541653503,CZ -1541653504,1541654015,PL -1541654016,1541654271,RU -1541654272,1541655551,PL -1541655552,1541656063,AT -1541656064,1541656575,UA -1541656576,1541656831,SE -1541656832,1541657087,BE -1541657088,1541657599,RU -1541657600,1541659647,PL -1541659648,1541660671,GB -1541660672,1541661695,SK -1541661696,1541661951,RU -1541661952,1541662207,NL -1541662208,1541662719,AT -1541662720,1541663743,CZ -1541663744,1541664767,AT -1541664768,1541665279,GB -1541665280,1541666047,RU -1541666048,1541666303,GB -1541666816,1541667839,NO -1541667840,1541668095,CH -1541668352,1541668607,UA -1541668608,1541668863,GE -1541668864,1541670911,GB -1541670912,1541671423,PL -1541671424,1541671679,RU -1541671680,1541671935,PL -1541671936,1541672959,UA -1541672960,1541674495,RS -1541674496,1541675007,KG -1541675008,1541675519,IE -1541675520,1541676031,RU -1541676032,1541676287,PL -1541676288,1541676543,RO -1541676544,1541677055,RU -1541677056,1541678079,PL -1541678080,1541678591,RO -1541678592,1541678847,BG -1541678848,1541679103,KZ -1541679104,1541679615,RU -1541679616,1541680127,PL -1541680128,1541681151,CZ -1541681152,1541682175,RU -1541682176,1541682687,DE -1541682688,1541683199,RU -1541683200,1541683455,PL -1541683456,1541683711,RU -1541683712,1541684223,UA -1541684224,1541684735,CH -1541684736,1541686271,RU -1541686272,1541687295,UA -1541687296,1541688319,GB -1541688320,1541688831,RU -1541688832,1541689343,GB -1541689344,1541690367,PL -1541690368,1541691391,LT -1541691392,1541691903,PL -1541691904,1541692159,SE -1541692160,1541692415,ES -1541692416,1541693439,PL -1541693440,1541694463,RU -1541694464,1541694719,CZ -1541694720,1541694975,DE -1541694976,1541695487,RU -1541695488,1541696511,DE -1541696512,1541697535,MD -1541697536,1541698047,PL -1541698048,1541698303,DK -1541698304,1541698559,GB -1541698560,1541699327,RU -1541699328,1541699583,RO -1541699584,1541700095,RU -1541700096,1541700607,UA -1541700608,1541700863,RU -1541700864,1541701119,PL -1541701120,1541701631,IL -1541701632,1541702655,SA -1541703424,1541703679,RU -1541703680,1541704703,PL -1541704704,1541705727,RO -1541705728,1541705983,DE -1541705984,1541706239,RO -1541706240,1541706751,UA -1541706752,1541707263,RU -1541707264,1541707519,DE -1541707520,1541707775,NL -1541707776,1541708799,DE -1541708800,1541709823,PL -1541710080,1541710335,RU -1541710336,1541710847,IL -1541710848,1541711871,SK -1541711872,1541712127,FR -1541712128,1541712383,TR -1541712384,1541712895,DE -1541713920,1541714175,NL -1541714176,1541716223,RU -1541716224,1541716479,PL -1541716480,1541716991,GB -1541716992,1541717247,FR -1541717248,1541717503,IR -1541717504,1541718015,DE -1541718016,1541718271,KZ -1541718272,1541719039,NO -1541719040,1541720063,PL -1541720064,1541721087,RU -1541721088,1541721343,PL -1541721344,1541721599,RU -1541721600,1541721855,GB -1541721856,1541722111,SI -1541722112,1541723135,RU -1541723136,1541723647,HU -1541723648,1541723903,NO -1541723904,1541724159,BE -1541724160,1541725183,UA -1541725184,1541727487,RU -1541727488,1541727743,UA -1541727744,1541727999,RU -1541728256,1541729023,GB -1541729024,1541729279,DE -1541729280,1541729535,UA -1541729536,1541729791,PL -1541729792,1541730303,RU -1541730304,1541730815,ES -1541730816,1541731071,GB -1541731072,1541731327,DE -1541731328,1541731839,SK -1541731840,1541732351,RU -1541732352,1541732607,IL -1541732608,1541732863,RO -1541732864,1541733119,RU -1541733376,1541734143,RS -1541734144,1541734399,TR -1541734400,1541734911,RO -1541734912,1541735167,RU -1541735168,1541735423,DE -1541735424,1541735679,GB -1541735936,1541736447,RO -1541736448,1541737471,RU -1541737472,1541739519,RO -1541739520,1541739775,FR -1541739776,1541740031,NO -1541740032,1541740287,PL -1541740288,1541740543,NL -1541740544,1541740799,CZ -1541741056,1541741567,PL -1541741568,1541742079,SK -1541742080,1541742591,RO -1541742592,1541743103,SA -1541743104,1541743615,TR -1541743616,1541744639,SK -1541744640,1541745663,PL -1541745664,1541746175,TR -1541746688,1541746943,RU -1541746944,1541747199,NL -1541747200,1541747711,RU -1541747712,1541748735,UA -1541748992,1541749247,AT -1541749248,1541749503,ES -1541749504,1541749759,RU -1541749760,1541750783,NL -1541750784,1541751295,AE -1541751296,1541751807,UA -1541751808,1541752831,PL -1541752832,1541753087,SI -1541753088,1541753343,GB -1541753344,1541753855,RU -1541753856,1541754879,UA -1541754880,1541757439,PL -1541757952,1541758207,GB -1541758208,1541758463,HU -1541758464,1541758719,BY -1541758720,1541758975,FR -1541758976,1541760255,RU -1541760256,1541760511,UA -1541760512,1541761023,CH -1541761024,1541761535,KG -1541761536,1541762047,PL -1541762048,1541763583,RU -1541763584,1541763839,SE -1541763840,1541764095,UA -1541764096,1541765119,RU -1541765120,1541766143,UA -1541766144,1541767167,GB -1541767168,1541767679,UA -1541767680,1541768191,FR -1541769216,1541769471,FR -1541769472,1541770239,FI -1541770240,1541770495,CH -1541770496,1541770751,SE -1541770752,1541771263,NO -1541771264,1541771775,NL -1541771776,1541772031,RU -1541772032,1541772287,RO -1541772288,1541773311,KZ -1541773312,1541773823,NL -1541773824,1541774079,RU -1541774080,1541774335,TR -1541774336,1541775359,RO -1541775360,1541776895,UZ -1541776896,1541777151,GB -1541777152,1541777407,UA -1541777408,1541778431,DE -1541778432,1541778687,FR -1541778688,1541779455,GB -1541779456,1541779967,RU -1541779968,1541780479,DE -1541780480,1541780735,ES -1541780736,1541780991,GB -1541781248,1541781503,RO -1541781504,1541781759,TR -1541781760,1541782015,RU -1541782016,1541782271,RO -1541782272,1541782527,GB -1541782528,1541783551,RU -1541783552,1541783807,IE -1541783808,1541784063,PL -1541784064,1541784575,DE -1541784576,1541785855,RU -1541785856,1541786111,GB -1541786112,1541786623,RU -1541786624,1541787647,UA -1541787648,1541788671,RU -1541788672,1541789183,PL -1541789184,1541789695,IR -1541789696,1541790719,UA -1541790720,1541790975,SA -1541790976,1541791231,RU -1541791232,1541791743,GB -1541791744,1541792255,KG -1541792256,1541792511,UA -1541792512,1541792767,FR -1541792768,1541793023,RO -1541793280,1541793791,FR -1541793792,1541794047,NL -1541794048,1541794815,RU -1541794816,1541795071,CH -1541795072,1541795327,RU -1541795328,1541795583,PL -1541795584,1541795839,ES -1541795840,1541796863,UA -1541796864,1541797375,RU -1541797376,1541797887,GB -1541797888,1541798911,PL -1541798912,1541799935,CZ -1541799936,1541800447,FR -1541800448,1541800959,AT -1541800960,1541801471,FI -1541801472,1541801983,BG -1541801984,1541802495,PL -1541802496,1541803007,RU -1541803008,1541804031,LT -1541804032,1541804287,GB -1541804288,1541804543,PL -1541804544,1541805567,RU -1541805568,1541805823,DE -1541805824,1541806079,RU -1541806080,1541806335,PL -1541806336,1541806591,UA -1541806592,1541806847,RU -1541807104,1541808127,UA -1541808128,1541808383,IR -1541808384,1541809151,NL -1541809152,1541809663,PL -1541809664,1541810175,GB -1541810176,1541810431,PT -1541810432,1541810687,AE -1541810688,1541811199,PL -1541811200,1541811711,SK -1541811712,1541811967,NL -1541811968,1541812991,RU -1541812992,1541813247,NL -1541813248,1541813759,LT -1541813760,1541814015,RU -1541814016,1541814783,ES -1541814784,1541815295,PL -1541815296,1541816319,RU -1541816320,1541816575,BE -1541816576,1541816831,RU -1541816832,1541817343,FR -1541817344,1541818367,DK -1541818368,1541818623,RU -1541818624,1541818879,TR -1541818880,1541819903,PL -1541819904,1541820159,SE -1541820160,1541820415,IL -1541820416,1541820671,MD -1541820672,1541820927,TR -1541820928,1541821183,RU -1541821184,1541821439,DE -1541821440,1541821695,RU -1541821696,1541821951,TR -1541821952,1541822975,PL -1541822976,1541823231,SI -1541823232,1541823487,RU -1541823488,1541823999,UA -1541824000,1541824511,RU -1541824512,1541824767,IT -1541824768,1541825023,GB -1541825024,1541825535,PL -1541825536,1541826047,RU -1541826048,1541826559,IT -1541826560,1541827071,ES -1541827072,1541827327,LV -1541827328,1541827583,RU -1541827584,1541828095,SE -1541828608,1541830911,PL -1541830912,1541831167,UA -1541831168,1541831423,PL -1541831424,1541831679,RO -1541831680,1541832191,SA -1541832192,1541833983,SE -1541833984,1541834239,RU -1541834496,1541834751,RU -1541835776,1541836287,CH -1541836288,1541836543,AT -1541836800,1541837055,CZ -1541837056,1541837311,IT -1541837312,1541837567,RU -1541837824,1541838079,PL -1541838080,1541839871,RU -1541839872,1541840383,PL -1541840384,1541840639,RU -1541840640,1541840895,PL -1541840896,1541841407,DE -1541841408,1541842943,PL -1541842944,1541843199,GB -1541843200,1541843455,FR -1541843456,1541843967,BE -1541843968,1541844991,DE -1541844992,1541846015,BE -1541846016,1541846271,PL -1541846272,1541846527,GB -1541847040,1541848063,RU -1541848064,1541848319,HU -1541848320,1541848575,GB -1541848576,1541849087,RU -1541849088,1541850111,BG -1541850112,1541850623,RU -1541850624,1541851135,UA -1541851136,1541852671,PL -1541852672,1541853183,RO -1541853184,1541854207,RU -1541854208,1541854463,FR -1541854464,1541854719,KW -1541854720,1541854975,MD -1541854976,1541855999,RU -1541856000,1541856255,MK -1541856256,1541856511,UA -1541856512,1541857279,PL -1541857280,1541857535,RU -1541857536,1541857791,KW -1541857792,1541858303,RU -1541858816,1541859327,BG -1541859328,1541859583,RO -1541859584,1541859839,PL -1541859840,1541860095,RO -1541860096,1541860351,FR -1541860352,1541860607,IL -1541860608,1541860863,NL -1541860864,1541861119,SI -1541861120,1541861375,DK -1541861376,1541861887,RO -1541861888,1541862143,AT -1541862144,1541862399,GB -1541862400,1541862911,NL -1541862912,1541863167,GB -1541863168,1541863423,RU -1541863424,1541863679,RO -1541863680,1541863935,CH -1541863936,1541864191,ES -1541864192,1541864447,GB -1541864448,1541864959,RU -1541864960,1541865471,AL -1541865472,1541865727,RO -1541865728,1541865983,UA -1541865984,1541866239,PL -1541866240,1541866495,FR -1541866496,1541867263,NL -1541867264,1541867519,RO -1541867520,1541867775,RU -1541867776,1541868031,PL -1541868032,1541868287,MT -1541868288,1541868543,AE -1541868544,1541869567,PL -1541869568,1541870079,RU -1541870080,1541871103,PL -1541871104,1541871359,AT -1541871360,1541872639,PL -1541872640,1541873663,CZ -1541873664,1541874175,PL -1541874176,1541874687,RU -1541874688,1541875711,PL -1541875712,1541876735,UA -1541876736,1541877247,PL -1541877248,1541877503,GB -1541877760,1541878783,SA -1541878784,1541879295,PL -1541879296,1541879807,UA -1541879808,1541880831,UZ -1541880832,1541881343,PL -1541881344,1541881599,IT -1541881600,1541881855,SE -1541881856,1541882879,RU -1541882880,1541883135,LV -1541883136,1541883391,UA -1541883392,1541884927,PL -1541884928,1541885951,LT -1541885952,1541886975,PL -1541886976,1541887999,UA -1541888000,1541888255,RS -1541888512,1541889023,GB -1541889024,1541889535,PL -1541889536,1541890303,RU -1541890304,1541890559,DE -1541890560,1541891071,UA -1541891072,1541893119,PL -1541893120,1541893631,BE -1541893632,1541894143,PL -1541894144,1541895167,RU -1541895168,1541897727,PL -1541897984,1541898239,UA -1541898240,1541900799,RU -1541900800,1541901055,RO -1541901056,1541901311,FR -1541901312,1541901567,PL -1541901568,1541901823,RU -1541901824,1541902335,UA -1541902336,1541902847,GB -1541902848,1541903103,RU -1541903104,1541903359,DK -1541903360,1541904383,UA -1541904384,1541904639,PL -1541904640,1541904895,SE -1541904896,1541905407,GB -1541905664,1541905919,PL -1541905920,1541906431,RS -1541906432,1541906687,UA -1541906688,1541907455,RU -1541907456,1541908479,IT -1541908480,1541908991,PL -1541908992,1541909247,UA -1541909248,1541909503,CZ -1541909504,1541910015,NL -1541910016,1541910527,FR -1541910528,1541911039,RU -1541911040,1541911295,PL -1541911296,1541911551,IT -1541911552,1541912575,RU -1541912576,1541912831,NL -1541912832,1541913087,UA -1541913088,1541914623,RU -1541914624,1541915647,IL -1541915648,1541916671,RU -1541917696,1541917951,CH -1541917952,1541918207,PL -1541918208,1541918463,UA -1541918464,1541919743,RO -1541919744,1541919999,DK -1541920000,1541920767,RU -1541920768,1541921279,PT -1541921280,1541921791,RU -1541921792,1541922047,DE -1541922048,1541922303,PL -1541922304,1541922559,RU -1541922560,1541923839,RO -1541923840,1541924095,FR -1541924096,1541924351,UA -1541924352,1541924863,PL -1541924864,1541925119,RO -1541925120,1541926911,RU -1541926912,1541927167,UA -1541927168,1541927679,PL -1541927680,1541927935,DE -1541927936,1541929983,PL -1541929984,1541931007,RU -1541931008,1541932031,UA -1541932032,1541932543,PL -1541932544,1541935103,RU -1541935104,1541936383,RO -1541936384,1541936639,UA -1541936640,1541936895,DE -1541936896,1541937151,FR -1541937152,1541937663,NL -1541937664,1541937919,GE -1541937920,1541938175,PL -1541938176,1541939199,UA -1541939200,1541939967,RU -1541939968,1541940223,ES -1541940224,1541940479,GB -1541940480,1541940735,CH -1541940736,1541940991,PL -1541940992,1541941247,RU -1541941248,1541942271,FR -1541942272,1541944831,PL -1541944832,1541945087,DE -1541945088,1541945855,RO -1541945856,1541946111,PL -1541946112,1541946879,SE -1541946880,1541947391,PL -1541947392,1541948927,IR -1541948928,1541949183,RU -1541949184,1541949439,ES -1541949440,1541950463,IR -1541950464,1541951487,ES -1541951488,1541951743,RU -1541951744,1541951999,ES -1541952000,1541952255,CZ -1541952256,1541952511,NO -1541952512,1541953535,CZ -1541953536,1541954047,LU -1541954048,1541954559,PL -1541954560,1541955583,RU -1541955584,1541956095,DE -1541956096,1541956351,RO -1541956608,1541957119,LB -1541957120,1541957375,PL -1541957376,1541957631,UA -1541957632,1541957887,GB -1541957888,1541958143,NL -1541958144,1541958655,RS -1541958656,1541959679,RU -1541959680,1541959935,PL -1541959936,1541960191,RU -1541960192,1541960703,NL -1541960704,1541962751,RU -1541962752,1541963263,GB -1541963264,1541963519,RU -1541963520,1541963775,PL -1541963776,1541964031,UA -1541964288,1541964543,NL -1541964544,1541965823,RU -1541965824,1541966847,US -1541966848,1541967871,PL -1541967872,1541968895,RU -1541968896,1541969919,GB -1541969920,1541970175,RO -1541970176,1541970431,GB -1541970432,1541971199,FI -1541971200,1541971967,UA -1541971968,1541972479,PL -1541972480,1541972735,RU -1541972736,1541972991,AT -1541972992,1541974015,PL -1541974016,1541975551,RU -1541975552,1541975807,TR -1541975808,1541976319,PL -1541976320,1541977087,UA -1541977088,1541977343,IT -1541977344,1541977599,GB -1541977600,1541977855,RO -1541977856,1541978111,PL -1541978112,1541978879,RO -1541978880,1541979135,FR -1541979136,1541979647,RU -1541979648,1541981183,PL -1541981184,1541981951,RU -1541981952,1541982207,UA -1541982208,1541982719,RS -1541982720,1541984255,RU -1541984512,1541984767,BG -1541984768,1541985279,RO -1541985280,1541986303,CZ -1541986304,1541986815,RU -1541986816,1541988351,SK -1541988352,1541988607,FR -1541988608,1541988863,RU -1541988864,1541989631,RO -1541989632,1541989887,LI -1541989888,1541990399,RU -1541990400,1541990911,AT -1541990912,1541991167,SI -1541991424,1541991935,RS -1541991936,1541992191,UA -1541992192,1541992447,SI -1541992448,1541992959,UA -1541992960,1541993215,FR -1541993216,1541994239,RU -1541994240,1541994495,CZ -1541994496,1541995519,PL -1541995520,1541996031,RU -1541996032,1541996287,RO -1541996544,1541997567,RO -1541997568,1541997823,RU -1541997824,1541998079,GB -1541998080,1541998335,NL -1541998336,1541998591,AT -1541998592,1541999615,DE -1541999616,1542000127,AT -1542000128,1542000383,NO -1542000384,1542000639,GE -1542000640,1542000895,GB -1542000896,1542001151,UA -1542001152,1542001663,PL -1542001920,1542002175,HU -1542002176,1542002687,NL -1542002688,1542002943,RS -1542002944,1542003199,PL -1542003200,1542003711,RO -1542003712,1542004735,RU -1542004736,1542004991,BG -1542004992,1542005247,GB -1542005248,1542005503,PL -1542005504,1542005759,DE -1542005760,1542006271,HR -1542006272,1542008831,RU -1542008832,1542009343,UA -1542009344,1542009599,SE -1542009600,1542009855,FR -1542009856,1542010367,NL -1542010368,1542010879,RU -1542010880,1542011903,IR -1542011904,1542012159,PL -1542012160,1542012415,RU -1542012416,1542012671,GB -1542012672,1542013951,RU -1542013952,1542014207,FR -1542014208,1542017023,PL -1542017024,1542017279,TR -1542017280,1542017535,GB -1542017536,1542017791,RU -1542017792,1542018047,GB -1542018048,1542019071,DE -1542019072,1542019327,RU -1542019584,1542020095,UA -1542020096,1542021119,RU -1542021120,1542023167,UA -1542023168,1542023423,PL -1542023424,1542023679,NL -1542023680,1542023935,RO -1542023936,1542024191,PL -1542024192,1542025215,UA -1542025216,1542026239,PL -1542026240,1542026751,FI -1542026752,1542027007,BE -1542027008,1542027263,FR -1542027776,1542028031,FR -1542028032,1542028287,UA -1542028288,1542028543,GB -1542028544,1542028799,FI -1542028800,1542029055,CH -1542029056,1542029311,UA -1542029312,1542029823,GB -1542030336,1542031359,RU -1542031360,1542032383,PL -1542032384,1542032639,UA -1542032640,1542032895,SA -1542032896,1542033407,DK -1542033408,1542035199,RU -1542035200,1542035455,UA -1542035456,1542036479,GB -1542036480,1542038271,PL -1542038272,1542038527,SI -1542038528,1542040575,RU -1542040576,1542041087,UA -1542041088,1542041343,SA -1542041344,1542041599,RU -1542041600,1542042623,LT -1542042624,1542043135,IT -1542043136,1542043391,CH -1542043392,1542043647,GB -1542043648,1542044671,PL -1542044672,1542045183,RU -1542045184,1542045439,RO -1542045440,1542045695,AT -1542045696,1542046719,RO -1542046720,1542047743,PL -1542047744,1542048767,RO -1542048768,1542049279,PL -1542049280,1542049791,BE -1542049792,1542050815,CZ -1542050816,1542051327,RU -1542051328,1542051839,LV -1542051840,1542053887,RU -1542053888,1542054399,NL -1542054400,1542054655,RU -1542054656,1542054911,AT -1542054912,1542055423,PL -1542055424,1542055935,RU -1542055936,1542057471,PL -1542057472,1542060031,RU -1542060032,1542060287,SK -1542060288,1542060543,RO -1542060544,1542061055,PL -1542061056,1542062079,IT -1542062080,1542064127,UA -1542064128,1542064383,PL -1542064384,1542064639,FR -1542064640,1542065151,RU -1542065152,1542066175,PL -1542066176,1542066431,RU -1542066432,1542066687,NL -1542066688,1542066943,GB -1542066944,1542067199,BG -1542067456,1542067711,BG -1542067712,1542067967,US -1542067968,1542068223,GB -1542068224,1542069759,UA -1542069760,1542070015,DE -1542070016,1542071295,UA -1542071296,1542071551,CN -1542071552,1542071807,UA -1542071808,1542072319,DE -1542072320,1542073343,UA -1542073344,1542073855,PL -1542073856,1542074111,HR -1542074112,1542074367,UA -1542074368,1542074623,GB -1542074624,1542074879,PL -1542074880,1542075391,NL -1542075392,1542075647,CH -1542075648,1542075903,RU -1542075904,1542076159,IE -1542076160,1542076415,DE -1542076416,1542077439,RO -1542077440,1542078975,RU -1542078976,1542079487,PL -1542079488,1542080511,RU -1542080512,1542082559,UA -1542082560,1542083583,RU -1542083584,1542085631,UA -1542085632,1542086655,BG -1542086656,1542087423,RU -1542087424,1542087679,NL -1542087680,1542088703,PL -1542088704,1542089727,FR -1542089728,1542090751,RU -1542090752,1542091775,PL -1542091776,1542092799,RU -1542092800,1542093823,RO -1542093824,1542095871,PL -1542095872,1542096895,RS -1542096896,1542098431,UA -1542098432,1542099199,PL -1542099200,1542099455,RU -1542099456,1542099711,PL -1542099712,1542099967,RU -1542099968,1542100223,NL -1542100224,1542100479,DK -1542100480,1542100991,RO -1542100992,1542102015,RU -1542102016,1542103039,RO -1542103040,1542103295,CH -1542103296,1542103551,RU -1542103552,1542104063,CZ -1542104064,1542105087,RU -1542105088,1542105599,RO -1542105600,1542105855,RU -1542105856,1542106111,DE -1542106112,1542107135,RU -1542107136,1542107391,PL -1542107392,1542107903,RU -1542107904,1542108159,AT -1542108160,1542109183,RU -1542109184,1542109695,GB -1542109696,1542110207,PL -1542110208,1542110463,RU -1542110464,1542110719,CH -1542110720,1542111231,RS -1542111232,1542111487,SE -1542111488,1542111743,NL -1542111744,1542112255,FR -1542112256,1542113279,UA -1542113280,1542113535,LT -1542113536,1542113791,GB -1542113792,1542114047,RU -1542114048,1542114303,BE -1542114304,1542114815,FI -1542114816,1542115071,NL -1542115072,1542115327,PL -1542115328,1542116351,UA -1542116352,1542116607,RO -1542116608,1542116863,DE -1542116864,1542117119,GB -1542117120,1542117631,DE -1542117632,1542117887,PL -1542117888,1542118399,UZ -1542118400,1542119423,RO -1542119424,1542119935,RU -1542119936,1542120447,UA -1542120448,1542120703,GE -1542120704,1542120959,AT -1542120960,1542121471,BE -1542121472,1542121727,PL -1542121728,1542123519,FR -1542123520,1542123775,SE -1542123776,1542124543,RO -1542124544,1542124799,DE -1542124800,1542125567,PL -1542125568,1542126591,CZ -1542126592,1542127103,PL -1542127104,1542127359,GB -1542127616,1542128127,PL -1542128128,1542128383,RU -1542128384,1542129151,RO -1542129152,1542129407,IS -1542129408,1542129663,RU -1542129664,1542130687,DE -1542130688,1542131711,UA -1542131712,1542134271,PL -1542134272,1542136319,RU -1542136320,1542136831,DE -1542136832,1542137855,RU -1542137856,1542138367,ES -1542138368,1542138623,RU -1542138624,1542138879,RO -1542138880,1542139135,GB -1542139136,1542139391,DE -1542139392,1542139647,UA -1542139648,1542139903,DE -1542139904,1542140927,ES -1542140928,1542141951,SK -1542141952,1542142975,GB -1542142976,1542143999,NO -1542144000,1542144255,TR -1542144256,1542144511,GB -1542144512,1542144767,RU -1542144768,1542146047,UA -1542146048,1542147583,RU -1542147584,1542148095,FR -1542148096,1542148607,RU -1542148608,1542148863,SI -1542148864,1542149119,NL -1542149120,1542150143,UA -1542150144,1542152191,RU -1542152192,1542153215,IE -1542153216,1542153471,DK -1542153472,1542153727,RU -1542153728,1542153983,UA -1542153984,1542154239,RU -1542154240,1542154751,TR -1542154752,1542155007,RU -1542155008,1542155263,IL -1542155264,1542156287,ES -1542156288,1542156543,RU -1542156544,1542156799,RO -1542156800,1542157311,DE -1542157312,1542157567,RO -1542157568,1542157823,IE -1542157824,1542158079,AZ -1542158080,1542158335,RU -1542158336,1542158847,IT -1542158848,1542159359,RO -1542159360,1542160127,PL -1542160128,1542160383,RU -1542160384,1542160639,UA -1542160640,1542160726,NL -1542160727,1542160727,UA -1542160728,1542160847,NL -1542160848,1542160848,UA -1542160849,1542160895,NL -1542160896,1542161407,GB -1542161408,1542162431,NL -1542162432,1542162943,RU -1542162944,1542163199,FR -1542163200,1542163455,DK -1542163456,1542163711,GB -1542163712,1542163967,FR -1542163968,1542164479,UA -1542164480,1542165503,RU -1542165760,1542166015,PL -1542166016,1542166527,IL -1542166528,1542167551,PL -1542167552,1542168319,RU -1542168320,1542168575,AE -1542168576,1542169599,PL -1542169600,1542169855,BG -1542169856,1542170623,RO -1542170624,1542170879,SE -1542170880,1542171135,RU -1542171136,1542171647,HR -1542171648,1542172159,GB -1542172160,1542172415,NL -1542172416,1542172671,RU -1542172672,1542173695,KZ -1542173696,1542174207,RU -1542174208,1542174719,CZ -1542174720,1542176767,RU -1542176768,1542177791,PL -1542177792,1542178815,UA -1542178816,1542179327,CZ -1542179328,1542179583,PL -1542179584,1542179839,RU -1542179840,1542180863,PL -1542180864,1542181887,DE -1542181888,1542182143,CH -1542182144,1542182399,RU -1542182400,1542182655,GB -1542182656,1542182911,FR -1542182912,1542183935,PL -1542183936,1542184191,GB -1542184192,1542184447,RU -1542184448,1542184959,PL -1542184960,1542185983,UA -1542185984,1542187007,PL -1542187008,1542187263,DK -1542187264,1542187519,RU -1542187520,1542188031,GB -1542188032,1542188287,DE -1542188288,1542188543,NL -1542188544,1542189055,PL -1542189056,1542189311,DE -1542189568,1542189823,SI -1542189824,1542190079,DE -1542190080,1542191103,RU -1542191104,1542192127,BG -1542192128,1542193407,PL -1542193408,1542193663,SI -1542193664,1542194175,RU -1542194176,1542195711,PL -1542195712,1542196479,RU -1542196480,1542196735,PL -1542196736,1542197247,RU -1542197248,1542197503,DK -1542197504,1542198015,GB -1542198016,1542198271,NL -1542198272,1542198783,PL -1542198784,1542199551,RU -1542199552,1542199807,FR -1542199808,1542200319,GB -1542200320,1542200575,DK -1542200576,1542200831,US -1542200832,1542201343,RU -1542201344,1542202367,PL -1542202368,1542202623,UA -1542202624,1542202879,HR -1542202880,1542203391,EE -1542203392,1542204415,CZ -1542204416,1542204671,EE -1542204672,1542204927,CH -1542204928,1542205439,RO -1542205440,1542206463,RU -1542206464,1542207487,PL -1542207488,1542207743,GB -1542207744,1542207999,PL -1542208000,1542208255,RO -1542208256,1542208511,ES -1542208512,1542209535,RU -1542209536,1542211583,SK -1542211584,1542212607,PL -1542212608,1542213119,RO -1542213120,1542213375,CH -1542213376,1542213631,RO -1542213632,1542214143,RU -1542214144,1542214399,SK -1542214400,1542214655,NL -1542214656,1542215679,PL -1542215680,1542216703,RO -1542216704,1542217727,RU -1542217728,1542218751,UA -1542218752,1542220031,RU -1542220032,1542220287,PL -1542220288,1542220799,DE -1542220800,1542222847,RU -1542222848,1542223103,SE -1542223104,1542223359,GB -1542223360,1542223871,UA -1542224384,1542224639,DE -1542224640,1542224895,DK -1542224896,1542225151,RU -1542225152,1542225407,PL -1542225408,1542225919,UA -1542225920,1542227455,PL -1542227456,1542227967,UA -1542227968,1542228223,RU -1542228224,1542228479,PL -1542228480,1542228991,UA -1542228992,1542230015,RU -1542230016,1542231039,BG -1542231040,1542232063,RU -1542232064,1542232319,GB -1542232320,1542232575,FR -1542232576,1542233087,RU -1542233088,1542234111,UA -1542234112,1542234367,AT -1542234368,1542234623,FR -1542234624,1542234879,AE -1542234880,1542235135,PL -1542235136,1542236159,RU -1542236160,1542236671,IR -1542236672,1542236927,RO -1542236928,1542237183,UA -1542237184,1542238207,PL -1542238208,1542239743,RU -1542239744,1542239999,HU -1542240000,1542240255,RU -1542240256,1542240767,UA -1542240768,1542241023,DK -1542241024,1542241279,GB -1542241280,1542241535,LV -1542241536,1542241791,NL -1542241792,1542242303,GB -1542242304,1542243071,NL -1542243072,1542244863,RU -1542244864,1542245375,NL -1542245376,1542245887,RU -1542245888,1542246143,GB -1542246144,1542246911,SE -1542246912,1542247423,DK -1542247424,1542247679,SE -1542247936,1542248447,NL -1542248448,1542249471,RO -1542249472,1542249727,RU -1542249728,1542249983,UA -1542249984,1542250239,EE -1542250240,1542250495,RO -1542250496,1542251519,UA -1542251520,1542251775,RO -1542251776,1542252031,PL -1542252032,1542252543,RO -1542252544,1542253055,PL -1542253056,1542253567,RU -1542253568,1542253823,LB -1542253824,1542254079,RO -1542254080,1542254335,RU -1542254336,1542254591,FR -1542254592,1542255615,RO -1542255616,1542256127,BE -1542256128,1542256639,RU -1542256640,1542257663,UA -1542257664,1542258175,RU -1542258176,1542258687,FR -1542258688,1542262783,UA -1542262784,1542263295,IT -1542263296,1542263807,PL -1542263808,1542264063,RU -1542264064,1542264831,SA -1542264832,1542265855,UA -1542265856,1542266879,SA -1542266880,1542267135,RU -1542267136,1542267391,SI -1542267392,1542267903,NO -1542267904,1542268159,PL -1542268160,1542268415,RU -1542268416,1542268927,FR -1542268928,1542269439,UA -1542269440,1542269695,LV -1542269696,1542269951,NL -1542269952,1542271487,RO -1542271488,1542271743,PS -1542271744,1542271999,CZ -1542272000,1542272255,PL -1542272512,1542273023,RU -1542273024,1542274047,BG -1542274048,1542275071,PL -1542275072,1542275327,UA -1542275328,1542275583,AT -1542275584,1542276095,SE -1542276096,1542277631,PL -1542277632,1542278143,GB -1542278144,1542278399,RU -1542278400,1542278655,PL -1542278656,1542278911,NL -1542278912,1542279679,PL -1542279680,1542280191,RU -1542280192,1542280959,PL -1542280960,1542281215,GB -1542281216,1542281727,DE -1542281728,1542281983,SE -1542281984,1542282751,RO -1542282752,1542283007,RU -1542283008,1542283263,SE -1542283264,1542283519,AT -1542283520,1542283775,RU -1542283776,1542284287,LV -1542284288,1542284799,DE -1542284800,1542285311,BG -1542285312,1542285823,RU -1542285824,1542286079,SE -1542286080,1542287359,UA -1542287360,1542287871,PL -1542287872,1542288639,UA -1542288640,1542288895,DE -1542288896,1542289151,PL -1542289152,1542291967,UA -1542291968,1542292479,RO -1542292480,1542293503,SI -1542293504,1542294527,PL -1542294528,1542295039,SE -1542295040,1542295295,UA -1542295296,1542295551,AT -1542295552,1542296831,RU -1542296832,1542297087,PL -1542297088,1542297343,RU -1542297344,1542297599,FI -1542297600,1542297855,UA -1542298112,1542300159,PL -1542300160,1542300671,RU -1542300672,1542301695,UA -1542301696,1542302463,SK -1542302464,1542303231,PL -1542303232,1542303999,GB -1542304000,1542304255,FR -1542304256,1542305279,RU -1542305280,1542305791,UA -1542305792,1542306047,FR -1542306048,1542306303,GB -1542306304,1542307327,RU -1542307328,1542307583,PL -1542307584,1542307839,SE -1542307840,1542308095,RU -1542308096,1542308863,RO -1542308864,1542309119,PL -1542309120,1542309375,GB -1542309632,1542310911,RU -1542310912,1542312191,UA -1542312192,1542312447,RU -1542312448,1542312959,GB -1542312960,1542313215,FR -1542313216,1542313471,RU -1542313472,1542313727,DE -1542313984,1542314495,TR -1542314496,1542314751,CH -1542314752,1542315007,PL -1542315008,1542316031,RU -1542316032,1542317567,PL -1542317568,1542317823,RU -1542317824,1542318079,GB -1542318080,1542319103,UA -1542319104,1542320127,CZ -1542320128,1542322175,UA -1542322176,1542322431,RO -1542322432,1542322687,RU -1542322944,1542323199,IL -1542323200,1542323711,RU -1542323712,1542324479,IR -1542324736,1542325247,RU -1542325248,1542325759,UA -1542325760,1542326271,RS -1542326272,1542326527,CH -1542326528,1542326783,UA -1542326784,1542327295,RU -1542327296,1542328319,MD -1542328320,1542328831,UA -1542329088,1542329343,AT -1542329344,1542329855,NL -1542329856,1542330111,GB -1542330112,1542330367,UA -1542330368,1542331903,RU -1542331904,1542332671,BE -1542332928,1542333439,RU -1542333440,1542333695,PL -1542333696,1542335487,RO -1542335488,1542337023,RU -1542337024,1542337279,RO -1542337280,1542337535,SE -1542337536,1542339839,PL -1542339840,1542340095,RS -1542340096,1542340607,PL -1542340608,1542342143,RU -1542342144,1542342655,RO -1542342656,1542343167,FR -1542343168,1542343679,UA -1542343680,1542344447,PL -1542344448,1542345727,RU -1542345984,1542346239,PL -1542346240,1542347775,RU -1542348288,1542348799,MD -1542348800,1542349823,RU -1542349824,1542350847,UA -1542350848,1542351359,CZ -1542351360,1542351615,BG -1542351616,1542351871,PL -1542351872,1542353151,RU -1542353152,1542353407,SA -1542353664,1542353919,RU -1542353920,1542354943,IT -1542354944,1542355711,RU -1542355712,1542355967,GB -1542355968,1542356479,PL -1542356480,1542356735,ES -1542356736,1542357503,RU -1542357504,1542357759,GB -1542357760,1542358015,FR -1542358016,1542358271,UA -1542358272,1542358527,RU -1542358528,1542359039,PL -1542359040,1542360319,RU -1542360320,1542360575,NL -1542360576,1542361087,PL -1542361088,1542361343,CH -1542361344,1542361599,PL -1542361600,1542362111,UA -1542362112,1542362623,RO -1542362624,1542363135,FR -1542363136,1542363647,DK -1542363648,1542364159,NL -1542364160,1542365183,RU -1542365184,1542366719,GB -1542366720,1542367231,PL -1542367232,1542368255,RU -1542368256,1542369279,PL -1542369280,1542369791,NL -1542369792,1542370303,PL -1542370304,1542370815,DE -1542370816,1542371839,RU -1542371840,1542372351,RO -1542372352,1542373375,RU -1542373376,1542374399,UA -1542374400,1542375167,GB -1542375168,1542375423,BG -1542375424,1542376447,RU -1542376448,1542376959,BG -1542376960,1542377215,DK -1542377472,1542377983,GB -1542377984,1542378495,RU -1542378496,1542378751,DK -1542379008,1542379519,GB -1542379520,1542379775,PL -1542380032,1542380287,RO -1542380288,1542380543,BE -1542380544,1542380799,FR -1542380800,1542381055,GB -1542381056,1542381823,RU -1542381824,1542382079,AT -1542382080,1542382335,BE -1542382336,1542383615,RU -1542383616,1542384639,PL -1542384640,1542384895,DE -1542384896,1542385151,RU -1542385152,1542385663,CH -1542385664,1542386687,PL -1542386688,1542387199,RU -1542387200,1542387711,PL -1542387712,1542388223,RU -1542388224,1542388479,IT -1542388480,1542388735,BG -1542388736,1542389247,RU -1542389248,1542389503,PL -1542389504,1542389759,BG -1542389760,1542390783,RO -1542390784,1542391295,RU -1542391296,1542391807,FR -1542391808,1542392831,MD -1542392832,1542393087,RO -1542393088,1542393343,BG -1542393344,1542393599,IR -1542393856,1542394879,RU -1542394880,1542395135,DE -1542395136,1542395391,ES -1542395392,1542395647,RU -1542395648,1542395903,AT -1542395904,1542396159,GR -1542396160,1542396415,NO -1542396416,1542396927,RU -1542396928,1542397951,PL -1542397952,1542398463,NL -1542398464,1542398975,DE -1542398976,1542399231,PL -1542399488,1542399999,DK -1542400000,1542401535,RU -1542401536,1542401791,GB -1542401792,1542402047,BG -1542402048,1542403071,UA -1542403072,1542403327,CH -1542403328,1542403583,RU -1542403584,1542404095,IR -1542404096,1542405375,RU -1542405376,1542405631,PL -1542405632,1542405887,GB -1542405888,1542406143,RU -1542406144,1542406655,NL -1542406656,1542407167,PL -1542407168,1542408191,RU -1542408192,1542408703,GB -1542408704,1542408959,UA -1542408960,1542409215,CH -1542409216,1542411263,UA -1542411264,1542411519,DE -1542411520,1542411775,RU -1542411776,1542412031,LT -1542412032,1542412287,GB -1542412288,1542412799,RU -1542412800,1542413055,PL -1542413056,1542413311,GB -1542413312,1542413823,DE -1542413824,1542414079,RU -1542414080,1542414335,UA -1542414336,1542414847,SI -1542414848,1542415359,RU -1542415360,1542415615,DK -1542415616,1542415871,KZ -1542415872,1542416383,RU -1542416384,1542417407,UA -1542417408,1542418431,IR -1542418432,1542418687,RU -1542418688,1542420735,PL -1542420736,1542420991,RU -1542420992,1542421247,DK -1542421248,1542421503,RO -1542421504,1542422015,GB -1542422016,1542422527,RU -1542422528,1542422783,RO -1542422784,1542423039,PL -1542423296,1542424575,RU -1542424576,1542425599,UA -1542425600,1542426623,RU -1542426624,1542426879,PL -1542426880,1542427135,GB -1542427136,1542427391,PT -1542427392,1542427647,IE -1542428160,1542428415,UA -1542428416,1542428671,RS -1542428672,1542429695,PL -1542429696,1542429951,GB -1542430208,1542430719,RU -1542430720,1542431743,UA -1542431744,1542432767,RO -1542432768,1542433791,PL -1542433792,1542434047,RU -1542434048,1542434303,RO -1542434304,1542434815,NL -1542434816,1542435071,RU -1542435072,1542435327,DE -1542435328,1542435839,RO -1542435840,1542436863,PL -1542436864,1542437119,RU -1542437120,1542437375,PL -1542437376,1542437631,NL -1542437632,1542437887,UA -1542437888,1542438399,SE -1542438400,1542438655,UA -1542438656,1542438911,RU -1542438912,1542439167,KZ -1542439168,1542439423,SI -1542439424,1542439679,RO -1542439680,1542439935,CY -1542439936,1542440959,PL -1542440960,1542441983,CZ -1542441984,1542442239,TR -1542442240,1542442495,PL -1542442496,1542443007,GE -1542443008,1542444031,GB -1542444032,1542444543,NL -1542444544,1542444799,IR -1542444800,1542445055,RU -1542445056,1542445567,SE -1542445568,1542446079,IL -1542446080,1542447871,RO -1542447872,1542448639,RU -1542448640,1542448895,RO -1542448896,1542449151,AT -1542449152,1542450175,UA -1542450176,1542450687,CZ -1542450944,1542451199,RU -1542451200,1542451455,BG -1542451456,1542451711,UA -1542451712,1542451967,TR -1542451968,1542452223,AU -1542452224,1542454271,PL -1542454272,1542454783,NO -1542454784,1542455039,PL -1542455040,1542455295,SE -1542455296,1542455551,US -1542455552,1542455807,RO -1542455808,1542456319,GB -1542456320,1542456831,RO -1542456832,1542457343,RS -1542457344,1542458367,RO -1542458368,1542459391,UZ -1542459392,1542459647,RU -1542459648,1542459903,GB -1542459904,1542460415,UA -1542460416,1542461439,LT -1542461440,1542461695,GB -1542461696,1542461951,RU -1542461952,1542462207,TR -1542462208,1542462463,GE -1542462464,1542463487,PL -1542463488,1542463743,FR -1542464000,1542464255,DE -1542464256,1542464511,CZ -1542464512,1542464767,RU -1542464768,1542465023,TR -1542465024,1542465535,RU -1542465536,1542466559,RS -1542466560,1542466815,PL -1542466816,1542467071,RU -1542467072,1542467583,PL -1542467584,1542468607,UA -1542468608,1542469631,SI -1542469632,1542470655,ES -1542470656,1542471679,IR -1542471680,1542472703,SE -1542472704,1542472959,PL -1542472960,1542473215,LB -1542473216,1542473471,PL -1542473472,1542473727,GB -1542473728,1542473983,FR -1542473984,1542474239,AE -1542474240,1542474751,RU -1542474752,1542475007,PL -1542475008,1542475263,DE -1542475264,1542475775,FR -1542475776,1542476799,LB -1542476800,1542477823,RU -1542477824,1542478079,DK -1542478336,1542479103,RU -1542479104,1542479359,PL -1542479360,1542479615,RO -1542479616,1542479871,RU -1542479872,1542480895,UA -1542480896,1542481407,PL -1542481408,1542481919,RU -1542481920,1542482431,CH -1542482432,1542482943,PL -1542482944,1542483199,TR -1542483200,1542483455,FR -1542483456,1542484991,RU -1542484992,1542486015,NL -1542486016,1542488063,RU -1542488320,1542488575,DE -1542488576,1542491135,PL -1542491136,1542492159,UA -1542492160,1542492415,RU -1542492416,1542492671,CZ -1542492672,1542493183,IL -1542493184,1542493439,PS -1542493440,1542494207,RO -1542494208,1542494719,PL -1542494720,1542494975,RO -1542494976,1542495231,RU -1542495232,1542496255,RO -1542496256,1542496767,DE -1542496768,1542497023,RU -1542497280,1542497535,DE -1542497536,1542497791,NL -1542497792,1542498303,IT -1542498304,1542499583,RU -1542499584,1542499839,ES -1542499840,1542500095,GB -1542500352,1542500607,GB -1542500608,1542500863,RO -1542500864,1542501119,GB -1542501120,1542501375,RU -1542501376,1542502399,IR -1542502400,1542502655,RO -1542502656,1542503423,DK -1542503424,1542503679,RO -1542503680,1542503935,DK -1542503936,1542504447,UA -1542504448,1542504703,GB -1542504704,1542504959,PL -1542504960,1542505215,SE -1542505216,1542505471,NO -1542505472,1542506495,PL -1542506496,1542507007,NL -1542507008,1542507263,RU -1542507264,1542507519,CY -1542507520,1542508543,NO -1542508544,1542509567,RU -1542509568,1542510079,CY -1542510592,1542510847,SI -1542510848,1542511103,DE -1542511104,1542511871,RU -1542511872,1542512127,GB -1542512128,1542512383,RU -1542512384,1542512639,PL -1542512640,1542512895,GB -1542512896,1542513151,RU -1542513152,1542513663,GB -1542513664,1542513919,FR -1542513920,1542514175,GB -1542514176,1542514687,IT -1542514688,1542515199,RU -1542515200,1542515711,IL -1542515712,1542516223,RO -1542516224,1542516735,PL -1542516736,1542516991,NL -1542516992,1542517247,FR -1542517248,1542517759,RU -1542517760,1542518015,UA -1542518016,1542518271,SK -1542518272,1542518783,LV -1542518784,1542519807,PL -1542519808,1542520319,SE -1542520320,1542520575,PL -1542520576,1542520831,BG -1542520832,1542521343,GB -1542521344,1542521599,PL -1542521600,1542521855,PT -1542521856,1542522111,RU -1542522112,1542522367,PL -1542522368,1542522879,NL -1542522880,1542523903,CZ -1542523904,1542524415,RU -1542524928,1542525951,RU -1542525952,1542526463,IR -1542526464,1542526719,RU -1542526720,1542526975,CZ -1542526976,1542527999,PL -1542528000,1542528255,LU -1542528256,1542528511,NL -1542528512,1542528767,BE -1542528768,1542531583,PL -1542531584,1542531839,FR -1542531840,1542532095,RU -1542532096,1542532351,DE -1542532352,1542533119,RU -1542534144,1542534399,DE -1542534400,1542534655,HR -1542534656,1542535167,DE -1542535168,1542535423,GB -1542535424,1542535679,FR -1542535680,1542536191,RU -1542536192,1542537215,PL -1542537216,1542538239,LV -1542538240,1542538751,RU -1542538752,1542539007,GB -1542539008,1542539263,UA -1542539264,1542540287,DE -1542540288,1542540799,IT -1542540800,1542541055,GB -1542541056,1542541311,BE -1542541312,1542542335,UA -1542542336,1542542847,RU -1542542848,1542543359,IT -1542543360,1542544383,RU -1542544384,1542544639,IR -1542544896,1542545407,GR -1542545408,1542563839,UA -1542563840,1542565887,RU -1542565888,1542586367,UA -1542586368,1542594559,AZ -1542594560,1542597631,RU -1542597632,1542598143,IR -1542598144,1542599679,RO -1542599680,1542600703,UA -1542600704,1542602751,PL -1542602752,1542619135,MD -1542619136,1542619391,GB -1542619392,1542627327,ES -1542627328,1542627583,NL -1542627584,1542627839,RU -1542627840,1542628095,FR -1542628096,1542630399,RU -1542630400,1542630655,GB -1542630656,1542630911,DE -1542630912,1542631423,PL -1542631424,1542635519,RU -1542635520,1542637567,UA -1542637568,1542639615,NO -1542639616,1542640639,UA -1542640640,1542640895,DE -1542640896,1542641151,RU -1542641152,1542641663,DE -1542641664,1542641919,RO -1542642176,1542642431,PL -1542642688,1542643199,PL -1542643200,1542643455,UA -1542643456,1542643711,NL -1542643712,1542660095,UA -1542660096,1542661119,RU -1542661120,1542662143,UA -1542662144,1542668287,RU -1542668288,1542668799,NL -1542668800,1542669311,PL -1542669312,1542669567,RU -1542669568,1542669823,NO -1542669824,1542670079,DE -1542670080,1542670335,CH -1542670336,1542670591,US -1542670592,1542670847,ES -1542670848,1542671359,NL -1542671360,1542671871,FR -1542671872,1542672383,AT -1542672384,1542674431,NL -1542674432,1542674687,RU -1542674688,1542674943,US -1542674944,1542675455,RU -1542675456,1542675711,US -1542675712,1542675967,RU -1542675968,1542676223,US -1542676224,1542681087,RU -1542681088,1542681343,GB -1542681600,1542683135,RU -1542683136,1542683391,SK -1542683392,1542683647,RS -1542683648,1542684159,RU -1542684160,1542684671,IR -1542684672,1542685695,LT -1542685696,1542685951,RU -1542685952,1542686719,LT -1542686720,1542687743,US -1542687744,1542688767,LT -1542688768,1542689791,FR -1542689792,1542690815,LT -1542690816,1542691327,ES -1542691328,1542691839,PT -1542691840,1542692863,LT -1542692864,1542696959,IR -1542701056,1542709247,UA -1542709248,1542717439,RU -1542717440,1542733823,UA -1542733824,1542734847,RU -1542734848,1542735103,GB -1542735104,1542735359,UA -1542735360,1542735871,PL -1542735872,1542742015,RU -1542742016,1542746111,RO -1542746112,1542747135,RU -1542747136,1542747391,TR -1542747392,1542747647,GB -1542747648,1542748159,UA -1542748160,1542749183,IR -1542749184,1542749439,UA -1542749440,1542749695,DE -1542749696,1542749951,GB -1542749952,1542758399,UA -1542758400,1542763519,RU -1542763520,1542763775,DE -1542763776,1542764031,BG -1542764288,1542764543,RU -1542764544,1542766591,PL -1542770688,1542774783,PL -1542774784,1542775039,NL -1542775040,1542775295,PL -1542775296,1542775807,TR -1542775808,1542776063,RU -1542776064,1542776319,GB -1542776320,1542776831,PL -1542776832,1542777855,UA -1542777856,1542778367,GB -1542778368,1542778623,FR -1542778624,1542778879,GB -1542778880,1542780159,RU -1542780160,1542780927,GB -1542780928,1542781951,PL -1542781952,1542782975,RU -1542782976,1542791167,CZ -1542791168,1542801407,RU -1542801408,1542803455,UA -1542803456,1542805503,PL -1542805504,1542807551,RO -1542807552,1542815743,UA -1542815744,1542823935,RU -1542823936,1542832127,RO -1542832128,1542832383,BG -1542832384,1542832639,SI -1542832640,1542832895,LV -1542832896,1542833151,GR -1542833152,1542834175,RO -1542834176,1542836223,ES -1542836224,1542836735,RO -1542836736,1542837247,RU -1542837248,1542837503,GB -1542837504,1542837759,UA -1542837760,1542838015,RS -1542838016,1542838271,DE -1542838272,1542838783,GB -1542838784,1542839039,DK -1542839040,1542839295,PL -1542839296,1542839551,DE -1542839808,1542840063,CY -1542840064,1542840319,UA -1542848512,1542849535,RU -1542849536,1542850559,UA -1542850560,1542851583,GB -1542851584,1542851839,BG -1542852096,1542852351,KW -1542852352,1542852607,PL -1542852608,1542855167,RU -1542855168,1542856191,GB -1542856192,1542856703,RU -1542856704,1542864895,UA -1542864896,1542868991,PL -1542868992,1542875135,RU -1542875136,1542877183,PL -1542877184,1542881279,RU -1542881280,1542889471,UA -1542889472,1542891519,RU -1542891520,1542892543,PL -1542892544,1542900223,RO -1542900224,1542900479,DE -1542900480,1542901759,RO -1542901760,1542903807,PL -1542903808,1542904319,RO -1542904320,1542904575,IL -1542904576,1542904831,RU -1542904832,1542914047,UA -1542914048,1542923263,RU -1542923264,1542923775,BG -1542923776,1542929407,UA -1542929408,1542930431,KG -1542930432,1542930943,CZ -1542930944,1542931455,IR -1542931456,1542932479,RU -1542932480,1542932735,LV -1542932736,1542932991,GB -1542932992,1542933247,NO -1542933248,1542933503,FR -1542933504,1542938623,UA -1542938624,1542942719,RU -1542942720,1542944767,UA -1542944768,1542950911,RU -1542950912,1542951423,DE -1542951424,1542951679,RO -1542951680,1542951935,PL -1542951936,1542955007,RU -1542955008,1542963199,UA -1542963200,1542970623,RU -1542970624,1542970879,UA -1542970880,1542971391,RU -1542971392,1542972415,UA -1542972416,1542973439,NO -1542973440,1542975487,RU -1542975488,1542977535,RO -1542977536,1542978559,RU -1542978560,1542978815,PL -1542978816,1542979071,CH -1542979072,1542979583,RU -1542979584,1543110655,DE -1543110656,1543127039,UA -1543127040,1543143423,DE -1543143424,1543159807,ES -1543159808,1543167999,SE -1543168000,1543172095,IR -1543172096,1543173119,RO -1543173120,1543173375,GB -1543173376,1543173631,MD -1543173632,1543176191,RO -1543176192,1543241727,IR -1543241728,1543503871,IT -1543503872,1545601023,GB -1545601024,1545674495,SE -1545674496,1545674751,FI -1545674752,1545863167,SE -1545863168,1545895935,RU -1545895936,1545928703,BA -1545928704,1545961471,SI -1545961472,1545995519,RU -1545995520,1545996287,CZ -1545996288,1545998335,RU -1545998336,1545999359,MD -1545999360,1546000383,CZ -1546000384,1546001407,UZ -1546001408,1546002943,RU -1546002944,1546003199,UA -1546003200,1546003967,RU -1546003968,1546004479,CZ -1546004480,1546004735,UA -1546004736,1546004795,CZ -1546004796,1546004796,UA -1546004797,1546004991,CZ -1546004992,1546006527,RU -1546006528,1546007551,UA -1546007552,1546008575,UZ -1546008576,1546014719,BY -1546014720,1546015487,RU -1546015488,1546015743,GB -1546015744,1546015999,CZ -1546016000,1546016255,DE -1546016256,1546017279,RU -1546017280,1546017791,CZ -1546017792,1546017969,RU -1546017970,1546017970,CZ -1546017971,1546018303,RU -1546018304,1546018815,FR -1546018816,1546027007,UA -1546027008,1546028543,RU -1546028544,1546028799,KR -1546028800,1546035711,RU -1546035712,1546036223,LU -1546036224,1546059775,RU -1546059776,1546063871,SE -1546063872,1546067967,DE -1546067968,1546072063,SE -1546072064,1546076159,MD -1546076160,1546080255,RU -1546080256,1546084351,AZ -1546084352,1546088447,RU -1546088448,1546088959,BR -1546088960,1546089471,GB -1546089472,1546089727,BR -1546089728,1546092543,GB -1546092544,1546096639,RU -1546096640,1546100735,IT -1546100736,1546104314,AT -1546104315,1546104315,DE -1546104316,1546104831,AT -1546104832,1546108927,IE -1546108928,1546113023,IM -1546113024,1546121215,RU -1546121216,1546121727,ES -1546121728,1546121983,IT -1546121984,1546122463,ES -1546122464,1546122479,DZ -1546122480,1546122633,ES -1546122634,1546122641,GB -1546122642,1546122642,DE -1546122643,1546122649,ES -1546122650,1546122650,PT -1546122651,1546124191,ES -1546124192,1546124223,DZ -1546124224,1546125311,ES -1546125312,1546256383,GB -1546256384,1546264575,RU -1546264576,1546266623,TR -1546268672,1546270719,IR -1546270720,1546272767,GB -1546272768,1546274815,NO -1546274816,1546276863,SE -1546276864,1546278911,IT -1546278912,1546280959,RU -1546280960,1546283007,IT -1546283008,1546283463,DE -1546283464,1546283471,FR -1546283472,1546283521,DE -1546283522,1546283523,FR -1546283524,1546283827,DE -1546283828,1546283835,FR -1546283836,1546284287,DE -1546284288,1546284291,FR -1546284292,1546285055,DE -1546285056,1546287103,PL -1546287104,1546289151,GB -1546289152,1546291199,RU -1546291200,1546292279,AT -1546292280,1546292287,US -1546292288,1546293247,AT -1546293248,1546295295,GB -1546295296,1546297343,SE -1546297344,1546299391,RU -1546299392,1546301439,GB -1546301440,1546303487,LU -1546303488,1546305535,CH -1546305536,1546307583,DE -1546307584,1546311679,RU -1546311680,1546313727,FR -1546313728,1546315775,DE -1546315776,1546317823,NL -1546317824,1546319871,CH -1546319872,1546321919,RS -1546321920,1546323967,RU -1546323968,1546326015,NO -1546326016,1546328063,GB -1546328064,1546330111,CZ -1546330112,1546332159,SE -1546332160,1546334207,GB -1546334208,1546336255,DE -1546336256,1546338303,CZ -1546338304,1546340351,GB -1546340352,1546342399,DK -1546344448,1546346495,DK -1546346496,1546348543,AT -1546348544,1546348607,DE -1546348608,1546348623,CH -1546348624,1546350591,DE -1546350592,1546352639,PL -1546352640,1546354687,DK -1546354688,1546356735,FR -1546356736,1546358783,AM -1546358784,1546360831,PL -1546360832,1546363903,RU -1546363904,1546364415,MD -1546364416,1546364927,RU -1546364928,1546366975,SA -1546366976,1546369023,DK -1546369024,1546371071,RU -1546371072,1546373119,IS -1546373120,1546375167,HU -1546375168,1546377215,GB -1546377216,1546379263,CH -1546379264,1546381311,ES -1546381312,1546383359,DK -1546383360,1546385407,IT -1546385408,1546387455,FR -1546387456,1546518527,TR -1546518528,1546649599,KZ -1546649600,1546665983,SA -1546665984,1546682367,GB -1546682368,1546698751,BE -1546698752,1546715135,NL -1546715136,1546731519,LV -1546731520,1546732543,FR -1546732544,1546733567,MQ -1546733568,1546735615,GP -1546735616,1546737663,MQ -1546737664,1546741759,GP -1546741760,1546743807,FR -1546743808,1546747903,MQ -1546747904,1546764287,RU -1546764288,1546780671,KZ -1546780672,1546797055,IR -1546797056,1546813439,DE -1546813440,1546860543,RU -1546860544,1546862591,MD -1546862592,1546874879,GE -1546874880,1546875135,RU -1546875136,1546876927,GE -1546876928,1546878975,RU -1546878976,1546895359,DE -1546895360,1546911743,IE -1546911744,1546928127,SK -1546928128,1546944511,GB -1546944512,1546960895,UA -1546960896,1546977279,HU -1546977280,1546993663,MK -1546993664,1547010047,RU -1547010048,1547026431,SI -1547026432,1547034623,ES -1547034624,1547036671,RU -1547036672,1547038719,SE -1547038720,1547040767,GB -1547040768,1547042815,NL -1547042816,1547059199,ES -1547059200,1547075583,RU -1547075584,1547091967,GB -1547091968,1547108351,GE -1547108352,1547124735,RU -1547124736,1547141119,MK -1547141120,1547149311,RO -1547149312,1547157503,KZ -1547157504,1547173887,PL -1547173888,1547436031,ES -1547436032,1547440127,AT -1547440128,1547444223,AL -1547448320,1547452415,SK -1547452416,1547456511,IT -1547456512,1547460607,RU -1547460608,1547468799,GB -1547468800,1547472895,PL -1547472896,1547476991,DK -1547476992,1547481087,ES -1547481088,1547485183,UA -1547485184,1547489279,IE -1547489280,1547493375,DE -1547493376,1547497471,RS -1547497472,1547498495,NL -1547498496,1547501567,GB -1547501568,1547505663,TR -1547505664,1547509759,RU -1547509760,1547513855,LT -1547513856,1547517951,AT -1547517952,1547522047,RU -1547522048,1547526143,CZ -1547526144,1547534335,HU -1547534336,1547538431,FR -1547542528,1547546623,FR -1547546624,1547550719,IR -1547550720,1547554815,IE -1547554816,1547558911,AT -1547558912,1547563007,IL -1547563008,1547564031,NL -1547564032,1547564287,GB -1547564288,1547567103,NL -1547567104,1547571199,GB -1547571200,1547575295,AT -1547575296,1547579391,NO -1547579392,1547583487,RU -1547583488,1547587583,KG -1547587584,1547591679,IT -1547591680,1547595775,EE -1547599872,1547603967,LT -1547603968,1547608063,RU -1547608064,1547612159,LB -1547612160,1547616255,IR -1547616256,1547620351,DK -1547620352,1547620375,JE -1547620376,1547620383,NG -1547620384,1547620399,JE -1547620400,1547620407,NG -1547620408,1547620599,JE -1547620600,1547620607,NG -1547620608,1547620919,JE -1547620920,1547620927,NG -1547620928,1547621015,JE -1547621016,1547621023,NG -1547621024,1547621047,JE -1547621048,1547621055,NG -1547621056,1547621183,JE -1547621184,1547621191,NG -1547621192,1547621215,JE -1547621216,1547621223,NG -1547621224,1547621231,JE -1547621232,1547621239,NG -1547621240,1547621255,JE -1547621256,1547621263,NG -1547621264,1547621271,JE -1547621272,1547621279,NG -1547621280,1547621447,JE -1547621448,1547621455,NG -1547621456,1547621463,JE -1547621464,1547621471,NG -1547621472,1547622919,JE -1547622920,1547622935,NG -1547622936,1547623167,JE -1547623168,1547623423,NG -1547623424,1547623479,JE -1547623480,1547623487,NG -1547623488,1547624447,JE -1547624448,1547628543,CZ -1547628544,1547632639,BG -1547632640,1547636735,TR -1547636736,1547640831,SI -1547640832,1547644927,PL -1547644928,1547649023,CZ -1547649024,1547653119,RU -1547653120,1547657215,LV -1547657216,1547661311,RU -1547661312,1547665407,ES -1547665408,1547669503,GB -1547669504,1547673599,AT -1547673600,1547677695,NL -1547677696,1547683839,RU -1547683840,1547683967,PL -1547683968,1547684031,EE -1547684032,1547684095,LV -1547684096,1547685887,RU -1547685888,1547689983,AT -1547689984,1547694079,IT -1547694080,1547698175,HU -1547698176,1548158599,NL -1548158600,1548158607,GB -1548158608,1548159231,NL -1548159232,1548159235,ES -1548159236,1548159487,NL -1548159488,1548159999,GB -1548160000,1548160567,NL -1548160568,1548160575,DE -1548160576,1548160607,NL -1548160608,1548160639,GB -1548160640,1548161375,NL -1548161376,1548161407,GB -1548161408,1548161727,NL -1548161728,1548161791,GB -1548161792,1548162463,NL -1548162464,1548162495,FR -1548162496,1548169215,NL -1548169216,1548171263,DE -1548171264,1548172287,FR -1548172288,1548173311,GB -1548173312,1548174335,BE -1548174336,1548174847,LU -1548174848,1548175359,IE -1548175360,1548175871,ES -1548175872,1548176383,PT -1548176384,1548176895,IT -1548176896,1548177407,CH -1548177408,1548177919,AT -1548177920,1548178431,PL -1548178432,1548178943,DK -1548178944,1548179455,NO -1548179456,1548179967,SE -1548179968,1548180479,FI -1548180480,1548180991,SK -1548180992,1548181503,TR -1548181504,1548182015,US -1548182016,1548182527,HK -1548182528,1548222463,NL -1548222464,1548746751,DE -1548746752,1549271039,RO -1549271040,1549795327,FR -1549795328,1550057471,AE -1550057472,1550188543,RU -1550188544,1550319615,FR -1550319616,1550581759,CH -1550581760,1550843903,NL -1550843904,1550974975,UA -1550974976,1550975231,NL -1550975232,1550975999,RO -1550976000,1550976255,EG -1550976256,1550976767,RO -1550976768,1550977023,US -1550977024,1550979071,RO -1550979072,1550983167,IR -1550983168,1550983935,RO -1550983936,1550984191,GB -1550984192,1550984447,KR -1550984448,1550984703,RO -1550984704,1550984959,BG -1550984960,1550985215,RO -1550985216,1550987263,PS -1550987264,1550988287,IR -1550988288,1550988543,RO -1550988544,1550988799,JP -1550988800,1550990335,RO -1550990336,1550991359,AU -1550991360,1550995455,IR -1550995456,1550995967,RO -1550995968,1550996223,BG -1550996224,1550996479,AU -1550996480,1550998527,RO -1550998528,1550998783,IT -1550998784,1551000575,RO -1551000576,1551001599,NL -1551001600,1551007743,RO -1551007744,1551106047,MD -1551106048,1551237119,DE -1551237120,1551302655,GR -1551368192,1551450111,NL -1551450112,1551452159,SG -1551452160,1551454207,NL -1551454208,1551456255,US -1551456256,1551499263,NL -1551503360,1551504383,GB -1551504384,1551505407,FR -1551516672,1551517695,IT -1551517696,1551518719,ES -1551528960,1551529983,FR -1551544320,1551547391,DE -1551548416,1551551487,DE -1551556608,1551558655,FR -1551560704,1551561727,DE -1551561728,1551562751,FR -1551564800,1551572991,FR -1551577088,1551580159,NL -1551580350,1551580350,US -1551604480,1551604735,SE -1551630336,1551892479,RU -1551892480,1554514250,FR -1554514251,1554514251,RE -1554514252,1554971045,FR -1554971046,1554971046,ES -1554971047,1555038207,FR -1555038208,1555169279,ES -1555169280,1555628031,FR -1555628032,1555824639,ES -1555824640,1555890175,FR -1555890176,1556086783,ES -1556086784,1557069823,DE -1557069824,1557135359,GB -1557135360,1557313279,DE -1557313280,1557313535,US -1557313536,1557921791,DE -1557921792,1558052863,NO -1558052864,1558053760,FR -1558053761,1558053761,PT -1558053762,1558054351,FR -1558054352,1558054352,PT -1558054353,1558054399,FR -1558054400,1558054655,DE -1558054656,1558056102,FR -1558056103,1558056103,ES -1558056104,1558079407,FR -1558079408,1558079415,PL -1558079416,1558079423,GB -1558079424,1558079871,FR -1558079872,1558079887,GB -1558079888,1558081175,FR -1558081176,1558081183,BE -1558081184,1558082139,FR -1558082140,1558082143,ES -1558082144,1558082943,FR -1558082944,1558082959,PL -1558082960,1558083775,FR -1558083776,1558083791,DE -1558083792,1558083959,FR -1558083960,1558083963,CZ -1558083964,1558084208,FR -1558084209,1558084209,ES -1558084210,1558084649,FR -1558084650,1558084650,IT -1558084651,1558084655,FR -1558084656,1558084659,BE -1558084660,1558085055,FR -1558085056,1558085071,GB -1558085072,1558088319,FR -1558088320,1558088323,ES -1558088324,1558091351,FR -1558091352,1558091352,ES -1558091353,1558093531,FR -1558093532,1558093532,HR -1558093533,1558093609,FR -1558093610,1558093610,ES -1558093611,1558097919,FR -1558097920,1558098175,GB -1558098176,1558102501,FR -1558102502,1558102502,DE -1558102503,1558102507,FR -1558102508,1558102508,DE -1558102509,1558103159,FR -1558103160,1558103167,GB -1558103168,1558103967,FR -1558103968,1558103999,ES -1558104000,1558106901,FR -1558106902,1558106902,DE -1558106903,1558107391,FR -1558107392,1558107455,NL -1558107456,1558112095,FR -1558112096,1558112127,ES -1558112128,1558112191,FR -1558112192,1558112192,ES -1558112193,1558112198,FR -1558112199,1558112199,ES -1558112200,1558112207,FR -1558112208,1558112208,ES -1558112209,1558112209,FR -1558112210,1558112211,ES -1558112212,1558115327,FR -1558115328,1558115455,NL -1558115456,1558118399,FR -1558118400,1558119423,DE -1558119424,1558122495,RU -1558122496,1558123007,SG -1558123008,1558123519,RU -1558123520,1558125567,LU -1558125568,1558126079,SG -1558126080,1558126335,DE -1558126336,1558126591,LU -1558126592,1558128639,RU -1558128640,1558128895,US -1558128896,1558129151,LU -1558129152,1558129407,RU -1558129408,1558129663,LU -1558129664,1558130687,US -1558130688,1558132735,LU -1558132736,1558133247,US -1558133248,1558133759,LU -1558133760,1558134015,RU -1558134016,1558134271,KR -1558134272,1558134783,JP -1558134784,1558135039,RU -1558135040,1558135295,LU -1558135296,1558135551,US -1558135552,1558135552,RU -1558135553,1558135807,LU -1558135808,1558136319,US -1558136320,1558136575,LU -1558136576,1558136831,DE -1558136832,1558137087,RU -1558137088,1558137343,KR -1558137344,1558137855,CZ -1558137856,1558138879,LU -1558138880,1558139135,RU -1558139136,1558139391,NL -1558139392,1558139647,US -1558139648,1558139903,LU -1558139904,1558140159,DE -1558140160,1558140415,RU -1558140416,1558141183,LU -1558141184,1558141184,CY -1558141185,1558141439,LU -1558141440,1558141695,CY -1558141696,1558141951,LU -1558141952,1558142463,PL -1558142464,1558142719,US -1558142720,1558142975,SG -1558142976,1558143231,US -1558143232,1558143743,LU -1558143744,1558143999,RU -1558144000,1558144255,LU -1558144256,1558145023,RU -1558145024,1558145535,LU -1558145536,1558145791,RU -1558145792,1558146047,US -1558146048,1558146815,RU -1558146816,1558147583,LU -1558147584,1558147839,RU -1558147840,1558148095,LU -1558148096,1558148607,SG -1558148608,1558149631,US -1558149632,1558150143,RU -1558150144,1558150655,DE -1558150656,1558151167,NL -1558151168,1558172927,IT -1558172928,1558173099,US -1558173100,1558173100,IT -1558173101,1558173183,US -1558173184,1558179871,IT -1558179872,1558179955,NL -1558179956,1558179959,IT -1558179960,1558180023,NL -1558180024,1558180039,IT -1558180040,1558180071,NL -1558180072,1558180079,IT -1558180080,1558180095,NL -1558180096,1558180111,IT -1558180112,1558180287,NL -1558180288,1558180367,IT -1558180368,1558180863,NL -1558180864,1558183935,IT -1558183936,1558708223,DE -1558708224,1558904831,GB -1558904832,1558921215,IE -1558921216,1558937599,HU -1558937600,1558970367,NL -1558970368,1559236607,GB -1559236608,1559240703,IL -1559240704,1559248895,BA -1559248896,1559257087,LV -1559257088,1559265279,UA -1559265280,1559269375,RU -1559269376,1559270399,NL -1559270400,1559271423,US -1559271424,1559273471,FI -1559273472,1559281663,CZ -1559281664,1559289855,RU -1559289856,1559298047,SK -1559298048,1559306239,RU -1559306240,1559314431,JO -1559314432,1559322623,GE -1559322624,1559330815,RU -1559330816,1559339007,BA -1559339008,1559347199,RU -1559347200,1559355391,DK -1559355392,1559379455,RU -1559379456,1559379711,US -1559379712,1559388159,RU -1559388160,1559396351,UA -1559396352,1559404543,GB -1559412736,1559420927,IR -1559420928,1559429119,HR -1559429120,1559437311,FR -1559437312,1559445503,AT -1559445504,1559461887,RU -1559461888,1559470079,IT -1559470080,1559478271,RU -1559478272,1559486463,CZ -1559486464,1559494655,DK -1559494656,1559502847,SE -1559502848,1559511039,PL -1559511040,1559519231,SI -1559519232,1559527423,UA -1559527424,1559535615,RS -1559535616,1559543807,GB -1559543808,1559551999,SE -1559552000,1559560191,RU -1559560192,1559568383,SK -1559568384,1559576575,RU -1559576576,1559584767,HU -1559584768,1559592959,KG -1559592960,1559601151,FR -1559601152,1559609343,IT -1559609344,1559617535,SK -1559617536,1559625727,GB -1559625728,1559633919,DK -1559633920,1559642111,IT -1559650304,1559658495,IT -1559658496,1559662591,RU -1559662592,1559663615,IR -1559663616,1559665663,RU -1559665664,1559666687,IR -1559666688,1559683071,RU -1559683072,1559691263,IE -1559691264,1559756799,BG -1559756800,1559789567,AT -1559789568,1559822335,RU -1559838720,1559855103,UA -1559855104,1559887871,HU -1559887872,1559920639,PT -1559920640,1559921407,LU -1559921408,1559921663,FR -1559921664,1559923711,LU -1559923712,1559924735,FR -1559924736,1559932159,LU -1559932160,1559932415,FR -1559932416,1559932927,LU -1559932928,1559934975,DE -1559934976,1559937023,LU -1559937024,1559941631,DE -1559941632,1559941887,LU -1559941888,1559943167,DE -1559943168,1559944191,LU -1559944192,1559945215,FR -1559945216,1559945727,LU -1559945728,1559946751,GB -1559946752,1559947519,DE -1559947520,1559948287,LU -1559948288,1559948288,GB -1559948289,1559949311,LU -1559949312,1559950335,DE -1559950336,1559951359,LU -1559951360,1559952383,DE -1559952384,1559953407,LU -1559953408,1559986175,MT -1559986176,1560018943,IE -1560018944,1560051711,DE -1560051712,1560084479,RU -1560084480,1560117247,JO -1560117248,1560125439,CZ -1560125440,1560135679,RU -1560135680,1560135807,UA -1560135808,1560136447,IR -1560136448,1560138239,GB -1560138240,1560139775,RU -1560139776,1560140287,CZ -1560140288,1560140799,RU -1560140800,1560141823,CZ -1560141824,1560143871,SY -1560143872,1560144895,CZ -1560144896,1560150015,UA -1560150016,1560182783,NL -1560182784,1560215551,SE -1560215552,1560281087,RU -1560281088,1562378239,FR -1562378240,1564999679,IT -1564999680,1565222911,UA -1565222912,1565229055,BG -1565229056,1565299711,UA -1565299712,1565300735,PT -1565300736,1565372415,UA -1565372416,1565374463,RU -1565374464,1565523967,UA -1565523968,1565655039,RU -1565655040,1565786111,AT -1565786112,1565917183,BY -1565917184,1565960191,RS -1565960192,1565960703,XK -1565960704,1565974527,RS -1565974528,1565975551,XK -1565975552,1566019583,RS -1566019584,1566020607,XK -1566020608,1566048255,RS -1566048256,1566052351,RU -1566056448,1566060543,IT -1566060544,1566064639,UA -1566064640,1566067199,IR -1566067200,1566067711,NL -1566067712,1566068735,RU -1566068736,1566072831,AZ -1566072832,1566081023,IT -1566081024,1566085119,RU -1566085120,1566089215,NL -1566089216,1566097407,RU -1566097408,1566101503,HU -1566101504,1566105599,RU -1566105600,1566109695,DE -1566109696,1566113791,CH -1566113792,1566117887,DE -1566117888,1566121983,TR -1566121984,1566126079,NO -1566126080,1566130175,IT -1566130176,1566134271,TR -1566134272,1566138367,GB -1566138368,1566142463,CZ -1566142464,1566146559,NO -1566146560,1566150655,GB -1566150656,1566154751,CZ -1566154752,1566158847,HU -1566158848,1566162943,RU -1566162944,1566167039,PL -1566167040,1566171135,UA -1566171136,1566175231,CY -1566175232,1566179327,IE -1566179328,1566183423,DK -1566183424,1566187519,ES -1566187520,1566191615,RU -1566191616,1566195711,FI -1566199808,1566207999,RU -1566208000,1566212095,DK -1566212096,1566216191,DE -1566216192,1566220287,SE -1566220288,1566224383,CZ -1566224384,1566232575,DE -1566232576,1566248959,RU -1566248960,1566257151,GB -1566257152,1566261247,CZ -1566261248,1566265343,TR -1566265344,1566265599,US -1566265600,1566269407,DE -1566269408,1566269439,US -1566269440,1566271487,NO -1566271488,1566271999,FI -1566272000,1566272511,SE -1566272512,1566273535,NO -1566273536,1566277631,RU -1566277632,1566281727,IT -1566281728,1566285823,CZ -1566285824,1566289919,RU -1566289920,1566294015,FI -1566294016,1566298111,IQ -1566298112,1566302207,PL -1566302208,1566306303,RU -1566306304,1566310399,CZ -1566310400,1566312447,SE -1566312448,1566314495,IE -1566314496,1566316543,BE -1566316544,1566318591,NL -1566318592,1566320639,RU -1566320640,1566322687,DE -1566322688,1566324735,CZ -1566324736,1566326783,HU -1566326784,1566328831,RU -1566328832,1566330879,IT -1566330880,1566334975,RU -1566334976,1566337023,NL -1566337024,1566339071,FR -1566339072,1566341119,RU -1566341120,1566343167,GB -1566343168,1566345215,DE -1566345216,1566347263,RU -1566347264,1566349311,DE -1566349312,1566351359,IT -1566351360,1566353407,AT -1566353408,1566355455,ES -1566355456,1566357503,RU -1566357504,1566359551,IT -1566359552,1566363647,RU -1566363648,1566365695,GB -1566365696,1566367743,RU -1566369792,1566371839,ES -1566371840,1566373887,IT -1566373888,1566375935,RS -1566375936,1566377983,DE -1566377984,1566380031,BG -1566380032,1566382079,IT -1566382080,1566384127,TR -1566384128,1566386175,CZ -1566386176,1566388223,FR -1566388224,1566388479,HK -1566388480,1566390015,LU -1566390016,1566390271,US -1566390272,1566392319,LT -1566392320,1566394367,ES -1566394368,1566394528,NO -1566394529,1566394529,FR -1566394530,1566394530,NO -1566394531,1566394531,DE -1566394532,1566394532,PL -1566394533,1566394533,NL -1566394534,1566394534,SE -1566394535,1566394535,PT -1566394536,1566394536,GB -1566394537,1566394538,NO -1566394539,1566394539,RU -1566394540,1566396415,NO -1566396416,1566398463,GB -1566398464,1566400511,RU -1566400512,1566400607,NO -1566400608,1566400639,GB -1566400640,1566400671,NO -1566400672,1566400703,DE -1566400704,1566400735,NL -1566400736,1566401023,NO -1566401024,1566401087,US -1566401088,1566401151,NO -1566401152,1566401279,US -1566401280,1566401599,NO -1566401600,1566401631,HK -1566401632,1566401663,NO -1566401664,1566401695,SG -1566401696,1566401727,NO -1566401728,1566401759,AU -1566401760,1566402303,NO -1566402304,1566402559,SG -1566404608,1566406655,ES -1566406656,1566408703,NL -1566408704,1566410751,GB -1566410752,1566412799,RU -1566412800,1566414847,JO -1566414848,1566416895,FR -1566416896,1566418943,IT -1566420992,1566423039,ES -1566423040,1566425087,FR -1566425088,1566427135,RS -1566427136,1566429183,IT -1566429184,1566437375,GB -1566439424,1566443519,DE -1566443520,1566445567,NO -1566445568,1566447615,PL -1566447616,1566451711,IT -1566451712,1566452032,IL -1566452033,1566452033,IT -1566452034,1566452034,FR -1566452035,1566452035,DE -1566452036,1566452036,BE -1566452037,1566452037,ES -1566452038,1566452038,IL -1566452039,1566452039,AT -1566452040,1566452042,IL -1566452043,1566452043,NL -1566452044,1566452045,GB -1566452046,1566452046,SE -1566452047,1566452047,CH -1566452048,1566452049,DK -1566452050,1566452050,IL -1566452051,1566452051,IE -1566452052,1566452052,CH -1566452053,1566452053,GB -1566452054,1566452057,UA -1566452058,1566452479,IL -1566452480,1566452735,IE -1566452736,1566453759,IL -1566453760,1566455807,IQ -1566455808,1566457855,PT -1566457856,1566459903,CH -1566459904,1566461951,GB -1566461952,1566463999,DE -1566464000,1566466047,IT -1566466048,1566468095,ES -1566468096,1566470143,BE -1566470144,1566471007,GB -1566471008,1566471011,IE -1566471012,1566471143,GB -1566471144,1566471147,IE -1566471148,1566474239,GB -1566474240,1566476287,DE -1566476288,1566478335,BG -1566478336,1566482431,RU -1566482432,1566484479,FR -1566484480,1566486527,SE -1566486528,1566488575,RU -1566488576,1566490623,PL -1566490624,1566492671,TR -1566492672,1566494719,NL -1566494720,1566496767,SE -1566496768,1566498815,AM -1566498816,1566500863,NL -1566500864,1566502911,RU -1566502912,1566504959,CH -1566504960,1566507007,TR -1566507008,1566509055,NL -1566509056,1566511103,GB -1566511104,1566513151,GG -1566513152,1566515199,BH -1566515200,1566517247,CZ -1566517248,1566519295,RU -1566519296,1566521343,BE -1566521344,1566523391,FR -1566523392,1566525439,MK -1566525440,1566527487,IS -1566527488,1566529535,IE -1566529536,1566531583,PL -1566531584,1566533631,RU -1566533632,1566535679,GB -1566535680,1566537727,NL -1566537728,1566539775,GB -1566539776,1566541823,DE -1566541824,1566543871,RU -1566543872,1566545919,NL -1566545920,1566552063,RU -1566552064,1566554111,TR -1566554112,1566556159,UA -1566556160,1566558207,RU -1566558208,1566560255,JO -1566560256,1566564351,IT -1566564352,1566566399,IS -1566566400,1566568447,FR -1566568448,1566570495,KZ -1566570496,1566572543,NL -1566572544,1566703615,GB -1566703616,1566769151,SA -1566769152,1566834687,CZ -1566834688,1566900223,RU -1566900224,1566965759,IT -1566965760,1567031295,PT -1567031296,1567096831,SI -1567096832,1567162367,DE -1567162368,1567227903,PL -1567227904,1567293439,FI -1567293440,1567358975,IE -1567358976,1567424511,PT -1567424512,1567490047,CY -1567490048,1567531007,IR -1567531008,1567532031,GB -1567532032,1567535103,IR -1567535104,1567539199,GB -1567539200,1567555583,IR -1567555584,1567621119,AT -1567621120,1567686655,SA -1567686656,1567690751,RO -1567690752,1567692799,ES -1567692800,1567693311,RO -1567693312,1567693823,ES -1567693824,1567696383,RO -1567696384,1567696639,FR -1567696640,1567696895,ES -1567696896,1567698175,RO -1567698176,1567698431,SE -1567698432,1567698943,RO -1567698944,1567699967,ES -1567699968,1567702015,RO -1567702016,1567703039,TR -1567703040,1567705087,MD -1567705088,1567707135,BG -1567707136,1567709183,MD -1567709184,1567709439,RO -1567709440,1567709695,IT -1567709696,1567710207,RO -1567710208,1567711231,MD -1567711232,1567711487,TR -1567711488,1567711743,PL -1567711744,1567712511,RO -1567712512,1567712767,PL -1567712768,1567713023,GB -1567713024,1567714815,RO -1567714816,1567715327,GB -1567715328,1567717375,MD -1567717376,1567718399,GR -1567718400,1567719167,RO -1567719168,1567719423,GB -1567719424,1567720191,RO -1567720192,1567720447,NO -1567720448,1567721471,RO -1567721472,1567723519,ES -1567723520,1567727359,RO -1567727360,1567727615,GB -1567727616,1567728639,RO -1567728640,1567729663,SY -1567729664,1567733759,RO -1567733760,1567735807,US -1567735808,1567739391,RO -1567739392,1567739903,FR -1567739904,1567740927,DE -1567740928,1567741951,RO -1567741952,1567742975,GR -1567742976,1567743231,IE -1567743232,1567743487,ES -1567743488,1567743999,RO -1567744000,1567748095,IR -1567748096,1567749119,RO -1567749120,1567750143,MD -1567750144,1567750655,RO -1567750656,1567751167,BG -1567751168,1567752191,RO -1567752192,1567756287,MD -1567756288,1567760383,IR -1567760384,1567765247,RO -1567765248,1567766271,GB -1567766272,1567767039,RO -1567767040,1567767551,GB -1567767552,1567768575,ES -1567768576,1567769343,RO -1567769344,1567769599,NL -1567769600,1567769855,RO -1567769856,1567770111,GB -1567770112,1567773951,RO -1567773952,1567774207,ES -1567774208,1567774719,GB -1567774720,1567775743,RO -1567775744,1567776767,AU -1567776768,1567778815,RO -1567778816,1567780863,IR -1567780864,1567785471,RO -1567785472,1567785727,TR -1567785728,1567785983,ES -1567785984,1567786239,FR -1567786240,1567789055,RO -1567789056,1567793151,ES -1567793152,1567795455,RO -1567795456,1567795711,GB -1567795712,1567799295,RO -1567799296,1567799467,GB -1567799468,1567799468,RO -1567799469,1567799807,GB -1567799808,1567802367,RO -1567802368,1567803391,GR -1567803392,1567805439,ES -1567805440,1567807487,SY -1567807488,1567809535,RO -1567809536,1567811583,ES -1567811584,1567812095,RO -1567812096,1567812607,GB -1567812608,1567813631,US -1567813632,1567814655,ES -1567814656,1567816703,RO -1567816704,1567817727,ES -1567817728,1567819775,RO -1567819776,1567820031,GB -1567820032,1567820287,RO -1567820288,1567820543,TR -1567820544,1567820799,LT -1567820800,1567823871,RO -1567823872,1567825919,LT -1567825920,1567826175,RO -1567826176,1567826431,DE -1567826432,1567827455,RO -1567827456,1567827711,BG -1567827712,1567830015,RO -1567830016,1567831039,US -1567831040,1567832831,RO -1567832832,1567833087,GB -1567833088,1567833599,NL -1567833600,1567834111,IT -1567834112,1567837183,RO -1567837184,1567838207,TR -1567838208,1567842303,RO -1567842304,1567842815,FR -1567842816,1567843839,RO -1567843840,1567844351,DE -1567844352,1567846143,RO -1567846144,1567846399,GB -1567846400,1567848447,RO -1567848448,1567850495,IR -1567850496,1567852543,ES -1567852544,1567854591,MD -1567854592,1567856639,IR -1567856640,1567857407,RO -1567857408,1567857663,US -1567857664,1567858687,ES -1567858688,1567860735,SE -1567860736,1567861247,BE -1567861248,1567861759,IT -1567861760,1567862783,RO -1567862784,1567866879,GB -1567866880,1567867135,IN -1567867136,1567867391,RO -1567867392,1567867519,GB -1567867520,1567867903,RO -1567867904,1567868927,ES -1567868928,1567869183,RO -1567869184,1567869439,GB -1567869440,1567869951,RO -1567869952,1567870975,ES -1567870976,1567871999,RO -1567872000,1567873023,ES -1567873024,1567879167,IR -1567879168,1567880191,RO -1567880192,1567880703,BG -1567880704,1567883263,RO -1567883264,1567948799,MD -1567948800,1567961087,IR -1567961088,1567965183,MD -1567965184,1567966207,RO -1567966208,1567969279,MD -1567969280,1567973375,ES -1567973376,1567981567,IR -1567981568,1567983615,MD -1567983616,1567983871,ES -1567983872,1567984127,GB -1567984128,1567984639,RO -1567984640,1567987711,MD -1567987712,1567988223,IT -1567988224,1567988735,RO -1567988736,1567992831,MD -1567992832,1567993343,IT -1567993344,1567993599,GB -1567993600,1567993855,RO -1567993856,1567997951,IR -1567997952,1568014335,NL -1568014336,1568022527,DE -1568022528,1568023551,FR -1568023552,1568023807,RO -1568023808,1568024063,IT -1568024064,1568024319,SG -1568024320,1568024575,RO -1568024576,1568025599,US -1568025600,1568026623,RO -1568026624,1568030719,SY -1568030720,1568034815,ES -1568034816,1568038911,RO -1568038912,1568059391,IR -1568059392,1568060415,MD -1568060416,1568062463,IR -1568062464,1568063487,MD -1568063488,1568083967,RO -1568083968,1568084223,CN -1568084224,1568084991,RO -1568084992,1568086015,CN -1568086016,1568087039,RO -1568087040,1568088063,ES -1568088064,1568104447,IR -1568104448,1568106495,MD -1568106496,1568107519,RO -1568107520,1568108543,MD -1568108544,1568109055,GB -1568109056,1568110079,RO -1568110080,1568111103,GB -1568111104,1568111359,RO -1568111360,1568111615,NL -1568111616,1568112127,GB -1568112128,1568112639,RO -1568112640,1568114687,MD -1568114688,1568115711,RO -1568115712,1568118783,MD -1568118784,1568119807,RO -1568119808,1568120831,ES -1568120832,1568122879,MD -1568122880,1568130047,RO -1568130048,1568133119,MD -1568133120,1568137215,IR -1568137216,1568138239,RO -1568138240,1568141311,MD -1568141312,1568145407,DE -1568145408,1568178175,RO -1568178176,1568210943,RU -1568210944,1568243711,GB -1568243712,1568276479,GP -1568276480,1568309247,DE -1568309248,1568342015,RO -1568342016,1568369043,BG -1568369044,1568369044,DE -1568369045,1568369049,BG -1568369050,1568369050,DE -1568369051,1568369062,BG -1568369063,1568369063,DE -1568369064,1568369076,BG -1568369077,1568369077,DE -1568369078,1568374783,BG -1568374784,1568440319,RU -1568440320,1568473087,NO -1568473088,1568505855,BY -1568505856,1568538623,NL -1568538624,1568555007,IR -1568555008,1568571391,UA -1568571392,1568604159,LB -1568604160,1568636927,UA -1568636928,1568661503,DE -1568661504,1568669695,US -1568669696,1569193983,DE -1569193984,1569718271,HR -1569718272,1570242559,IT -1570242560,1570275327,GB -1570275328,1570308095,BG -1570308096,1570340863,CZ -1570340864,1570373631,RU -1570373632,1570406399,NL -1570406400,1570439167,PL -1570439168,1570471935,TR -1570471936,1570504703,BG -1570504704,1570570239,ES -1570570240,1570572287,NL -1570572288,1570574335,UA -1570574336,1570576383,RU -1570576384,1570578431,UA -1570578432,1570580479,CH -1570580480,1570582527,RU -1570582528,1570584575,DE -1570584576,1570586623,RU -1570586624,1570590719,PL -1570590720,1570592767,IL -1570592768,1570596863,PL -1570598912,1570600959,PL -1570600960,1570603007,RU -1570603008,1570605055,CZ -1570605056,1570607103,NL -1570607104,1570609151,RU -1570609152,1570611199,PL -1570611200,1570619391,RU -1570619392,1570621439,BA -1570621440,1570625535,RU -1570625536,1570627583,GB -1570627584,1570629631,KG -1570629632,1570635775,RU -1570635776,1570644991,FR -1570644992,1570645247,GB -1570645248,1570652159,FR -1570652160,1570660863,SE -1570660864,1570661375,NO -1570661376,1570661631,GB -1570661632,1570662143,SE -1570662144,1570662399,DE -1570662400,1570668543,SE -1570668544,1570686975,RU -1570686976,1570693119,NL -1570693120,1570695167,RU -1570695168,1570696191,PL -1570696192,1570697215,NL -1570697216,1570701311,RU -1570701312,1570717695,PL -1570717696,1570725887,HR -1570725888,1570734079,DE -1570734080,1570750463,PL -1570750464,1570752511,AL -1570752512,1570754559,GB -1570754560,1570756607,ES -1570756608,1570764799,RU -1570764800,1570766847,DE -1570766848,1571291135,DK -1571291136,1571422207,SA -1571422208,1571422463,CZ -1571422464,1571422719,UA -1571422720,1571423231,RU -1571423232,1571423487,UA -1571423488,1571424255,RU -1571424256,1571424511,KG -1571424512,1571424767,AM -1571424768,1571425023,CZ -1571425024,1571425024,RU -1571425025,1571425148,CZ -1571425149,1571425149,RU -1571425150,1571425231,CZ -1571425232,1571425232,RU -1571425233,1571425279,CZ -1571425280,1571425535,RU -1571425536,1571425791,NL -1571425792,1571425871,CZ -1571425872,1571425872,RU -1571425873,1571426047,CZ -1571426048,1571426303,UA -1571426304,1571428351,RU -1571428352,1571429375,UA -1571429376,1571430399,BY -1571430400,1571430911,UA -1571430912,1571431167,BY -1571431168,1571431423,UA -1571431424,1571432447,KZ -1571432448,1571434495,RU -1571434496,1571435519,UA -1571435520,1571436031,RU -1571436032,1571436543,UA -1571436544,1571438591,BA -1571438592,1571440639,UA -1571440640,1571440895,RU -1571440896,1571441151,CZ -1571441152,1571441407,RU -1571441408,1571441663,UA -1571441664,1571441919,RU -1571441920,1571442175,CZ -1571442176,1571442687,NL -1571442688,1571443199,UA -1571443200,1571443711,RU -1571443712,1571444991,CZ -1571444992,1571445247,UA -1571445248,1571446271,NL -1571446272,1571446783,RU -1571446784,1571447039,GB -1571447040,1571447295,UA -1571447296,1571447807,RU -1571447808,1571448063,CZ -1571448064,1571448339,RU -1571448340,1571448340,US -1571448341,1571448831,RU -1571448832,1571449343,NL -1571449344,1571449855,CZ -1571449856,1571451391,RU -1571451392,1571452927,UA -1571452928,1571455999,RU -1571456000,1571456511,UA -1571456512,1571456767,CZ -1571456768,1571457023,UA -1571457024,1571457535,CZ -1571457536,1571458559,RU -1571458560,1571458815,CZ -1571458816,1571459071,BY -1571459072,1571463167,UA -1571463168,1571464191,UZ -1571464192,1571465215,BY -1571465216,1571466239,CZ -1571466240,1571467007,RU -1571467008,1571467263,UA -1571467264,1571467775,RU -1571467776,1571468287,CZ -1571468288,1571469311,RU -1571469312,1571469823,BY -1571469824,1571470079,CZ -1571470080,1571470335,LT -1571470336,1571470847,UA -1571470848,1571475455,RU -1571475456,1571475967,UA -1571475968,1571476479,UZ -1571476480,1571477503,RU -1571477504,1571477506,CZ -1571477507,1571477507,RU -1571477508,1571478015,CZ -1571478016,1571478271,RU -1571478272,1571478527,UA -1571478528,1571479551,RU -1571479552,1571483647,CZ -1571483648,1571484159,RU -1571484160,1571484671,CZ -1571484672,1571486719,RU -1571486720,1571486975,BY -1571486976,1571487231,NL -1571487232,1571488767,RU -1571488768,1571489023,CZ -1571489024,1571489279,UA -1571489280,1571489535,BY -1571489536,1571491071,RU -1571491072,1571491327,CZ -1571491328,1571495935,UA -1571495936,1571496447,RU -1571496448,1571497983,BY -1571497984,1571500031,RU -1571500032,1571504127,BY -1571504128,1571508223,UA -1571508224,1571514367,RU -1571514368,1571520511,BY -1571520512,1571521535,UA -1571521536,1571521894,GB -1571521895,1571521895,RU -1571521896,1571522047,GB -1571522048,1571522815,RU -1571522816,1571523583,CZ -1571523584,1571525631,RU -1571525632,1571526655,UZ -1571526656,1571526911,UA -1571526912,1571527167,KZ -1571527168,1571527423,UA -1571527424,1571527679,SK -1571527680,1571528191,RU -1571528192,1571528703,UA -1571528704,1571529215,BY -1571529216,1571529471,CZ -1571529472,1571529727,UA -1571529728,1571531007,RU -1571531008,1571531263,CZ -1571531264,1571532031,UA -1571532032,1571532287,RU -1571532288,1571532543,CZ -1571532544,1571532799,RU -1571532800,1571534079,CZ -1571534080,1571534847,RU -1571534848,1571535103,LV -1571535104,1571535359,UA -1571535360,1571535617,CZ -1571535618,1571535618,RU -1571535619,1571535871,CZ -1571535872,1571540479,RU -1571540480,1571540693,CZ -1571540694,1571540695,RU -1571540696,1571540696,CZ -1571540697,1571540697,RU -1571540698,1571540991,CZ -1571540992,1571541247,RU -1571541248,1571541503,UA -1571541504,1571542015,CZ -1571542016,1571542527,RU -1571542528,1571542783,SK -1571542784,1571543039,CZ -1571543040,1571543551,NL -1571543552,1571543807,UA -1571543808,1571545343,RU -1571545344,1571545599,UA -1571545600,1571545855,CZ -1571545856,1571546111,RU -1571546112,1571546623,UZ -1571546624,1571546879,NL -1571546880,1571547135,RU -1571547136,1571548159,UA -1571548160,1571549183,RU -1571549184,1571550207,UA -1571550208,1571550463,RU -1571550464,1571553279,UA -1571553280,1571684351,IL -1571684352,1571686399,ES -1571686400,1571688447,GB -1571688448,1571690495,CH -1571690496,1571692543,PL -1571692544,1571694591,FR -1571694592,1571696639,LU -1571696640,1571700735,RU -1571700736,1571702783,IT -1571702784,1571704831,RU -1571704832,1571706879,GB -1571706880,1571708179,SC -1571708180,1571708180,NL -1571708181,1571708338,SC -1571708339,1571708339,NL -1571708340,1571708677,SC -1571708678,1571708679,NL -1571708680,1571708927,SC -1571708928,1571709439,GB -1571709440,1571709567,DE -1571709568,1571709695,GB -1571709696,1571709823,FR -1571709824,1571709951,GB -1571709952,1571710079,NL -1571710080,1571710207,GB -1571710208,1571710335,ES -1571710336,1571710463,GB -1571710464,1571710591,IT -1571710592,1571710975,GB -1571710976,1571713023,NL -1571713024,1571715071,RU -1571715072,1571717119,GR -1571717120,1571719167,RU -1571719168,1571721215,GB -1571721216,1571723263,FR -1571723264,1571725311,GB -1571725312,1571727359,RO -1571727360,1571729407,IE -1571729408,1571731455,SK -1571731456,1571733503,CH -1571733504,1571735551,FI -1571735552,1571737599,NL -1571738112,1571738367,NL -1571739648,1571741695,GB -1571741696,1571743743,RU -1571743744,1571745791,GB -1571745792,1571747839,RU -1571747840,1571748095,GB -1571748096,1571748351,US -1571748352,1571748607,SG -1571748608,1571748863,GB -1571748864,1571749119,US -1571749120,1571749375,SG -1571749376,1571749887,US -1571749888,1571758079,RU -1571758080,1571766271,IL -1571766272,1571786751,PL -1571790848,1571794943,PL -1571794944,1571799039,NL -1571799040,1571815423,UA -1571815424,1571831807,FR -1571831808,1571848191,DK -1571848192,1571864575,ES -1571864576,1571880959,PL -1571880960,1571897343,RU -1571913728,1571930111,GE -1571930112,1571946495,LV -1571946496,1571962879,SA -1571962880,1571979263,RU -1571979264,1571995647,DK -1571995648,1572012031,UA -1572012032,1572020223,NO -1572020224,1572028415,SE -1572028416,1572028927,RU -1572028928,1572029183,UA -1572029184,1572034815,RU -1572034816,1572034943,BY -1572034944,1572035071,US -1572035072,1572035199,CZ -1572035200,1572035327,NG -1572035328,1572035455,US -1572035456,1572044799,RU -1572044800,1572061183,IT -1572061184,1572077567,PL -1572077568,1572093951,RU -1572093952,1572095999,NL -1572096000,1572098047,DE -1572098048,1572100095,DK -1572100096,1572102143,CH -1572102144,1572110335,BA -1572110336,1572110591,US -1572110592,1572112383,GB -1572112384,1572114431,RU -1572114432,1572116479,BA -1572116480,1572118527,DE -1572118528,1572126719,PL -1572126720,1572143103,UA -1572143104,1572159487,DE -1572159488,1572175871,CZ -1572175872,1572192255,PL -1572192256,1572225023,RU -1572225024,1572241407,TR -1572241408,1572257791,SE -1572257792,1572274175,FR -1572274176,1572276223,FI -1572276224,1572277247,US -1572277248,1572290559,SG -1572290560,1572306943,RU -1572306944,1572323327,BG -1572323328,1572339711,UA -1572339712,1572343807,PS -1572343808,1572347903,CH -1572347904,1572351999,FR -1572352000,1572356095,DE -1572356096,1572360191,SK -1572360192,1572362751,XK -1572362752,1572364287,RS -1572364288,1572368383,NL -1572368384,1572372479,NO -1572372480,1572376575,DE -1572376576,1572380671,TR -1572380672,1572384767,RU -1572384768,1572388863,DE -1572388864,1572392959,DK -1572392960,1572393471,NL -1572393472,1572393983,GB -1572393984,1572394495,DE -1572394496,1572394751,FR -1572394752,1572395263,US -1572395264,1572395519,NL -1572395520,1572397055,US -1572397056,1572401151,AZ -1572401152,1572405247,GB -1572405248,1572409343,CZ -1572409344,1572413439,RU -1572413440,1572417535,AM -1572417536,1572421631,CZ -1572421632,1572425727,KZ -1572425728,1572429823,LB -1572429824,1572433919,CZ -1572433920,1572438015,IT -1572438016,1572442111,AT -1572442112,1572446207,RU -1572450304,1572458495,RU -1572458496,1572462591,UA -1572462592,1572466687,LB -1572466688,1572470783,EE -1572470784,1572474879,DE -1572474880,1572475391,ZA -1572475392,1572483071,GB -1572483072,1572487167,RU -1572487168,1572491007,RS -1572491008,1572491263,LU -1572491264,1572495359,IT -1572495360,1572499455,RU -1572499456,1572503551,TR -1572503552,1572505983,IT -1572505984,1572506623,GR -1572506624,1572507199,IT -1572507200,1572507207,GB -1572507208,1572507647,IT -1572507648,1572511743,GB -1572511744,1572515839,DE -1572515840,1572519935,NL -1572519936,1572520447,DE -1572520448,1572520703,ES -1572520704,1572524031,DE -1572524032,1572528127,GE -1572528128,1572532223,RU -1572532224,1572536319,IT -1572536320,1572538367,GG -1572538368,1572540415,NL -1572540416,1572542463,GB -1572542464,1572544511,IT -1572544512,1572546559,IQ -1572546560,1572548607,FR -1572548608,1572550655,NL -1572550656,1572552703,DE -1572552704,1572554751,TR -1572554752,1572556799,RU -1572556800,1572558847,NO -1572558848,1572560895,IT -1572560896,1572562943,RU -1572562944,1572564991,CZ -1572564992,1572567039,DE -1572567040,1572569087,RU -1572571136,1572573183,US -1572573184,1572574207,GG -1572574208,1572575231,GB -1572575232,1572577279,RU -1572577280,1572579327,AM -1572579328,1572581375,GB -1572581376,1572585471,RU -1572585472,1572587519,CH -1572587520,1572589567,TR -1572589568,1572591615,CH -1572591616,1572593663,NL -1572593664,1572595711,GB -1572595712,1572597759,DE -1572597760,1572599807,RS -1572599808,1572601855,DE -1572601856,1572603903,SE -1572603904,1572605951,GE -1572605952,1572607999,RU -1572608000,1572610047,DE -1572610048,1572612095,UA -1572612096,1572614143,RU -1572614144,1572616191,ES -1572618240,1572620287,NL -1572620288,1572622335,CH -1572622336,1572624383,RU -1572624384,1572626431,NO -1572626432,1572628479,IT -1572628480,1572630527,DE -1572630528,1572632575,IT -1572632576,1572634623,RU -1572634624,1572634879,BE -1572634880,1572635135,PT -1572635136,1572635391,RO -1572635392,1572635647,FR -1572635648,1572635903,ES -1572635904,1572636159,DE -1572636160,1572636415,IT -1572636416,1572636671,NL -1572636672,1572638719,ES -1572638720,1572640767,FR -1572640768,1572642815,RU -1572642816,1572644863,US -1572644864,1572646911,FR -1572646912,1572648959,GB -1572648960,1572651007,RU -1572651008,1572653055,BH -1572653056,1572657151,RU -1572657152,1572659199,DE -1572659200,1572661247,IT -1572661248,1572663295,NO -1572663296,1572665343,DE -1572665344,1572667391,NL -1572667392,1572669439,GB -1572669440,1572673535,RU -1572673536,1572675583,AT -1572675584,1572677631,ES -1572677632,1572681727,RU -1572681728,1572682751,NL -1572682752,1572683007,DE -1572683008,1572683263,NL -1572683264,1572683519,DE -1572683520,1572683775,RU -1572683776,1572685823,CH -1572685824,1572689919,RU -1572689920,1572691967,ES -1572691968,1572694015,SA -1572694016,1572696063,GB -1572696064,1572698111,HU -1572700160,1572702207,NL -1572702208,1572704255,IT -1572704256,1572706303,RU -1572706304,1572708351,DE -1572708352,1572710399,GG -1572710400,1572712447,DE -1572712448,1572714495,ES -1572714496,1572716543,IT -1572716544,1572718591,SA -1572718592,1572720639,RU -1572720640,1572722687,IT -1572722688,1572724735,RU -1572724736,1572726783,BY -1572726784,1572728831,CH -1572728832,1572730879,SE -1572730880,1572732927,RU -1572732928,1572734975,HU -1572737024,1572739071,RU -1572739072,1572741119,IR -1572743168,1572745215,UA -1572745216,1572749311,CZ -1572749312,1572751359,DE -1572751360,1572753407,CH -1572753408,1572755455,NO -1572755456,1572757503,DE -1572757504,1572759551,FI -1572759552,1572761599,RU -1572761600,1572763647,GB -1572763648,1572765695,TR -1572765696,1572767743,CZ -1572767744,1572769791,NL -1572769792,1572771839,RO -1572771840,1572773887,ES -1572773888,1572775935,RS -1572775936,1572777983,GB -1572777984,1572780031,UA -1572780032,1572782079,NL -1572782080,1572784127,SE -1572784128,1572786175,RU -1572786176,1572788223,FR -1572788224,1572790271,TR -1572790272,1572792319,RU -1572792320,1572794367,DE -1572794368,1572796415,RU -1572796416,1572798463,DE -1572798464,1572800511,NL -1572800512,1572800738,RU -1572800739,1572800740,UA -1572800741,1572800741,RU -1572800742,1572800742,UA -1572800743,1572804607,RU -1572804608,1572808703,GB -1572808704,1572810751,FR -1572810752,1572812799,DE -1572812800,1572814847,RU -1572814848,1572816895,KW -1572816896,1572818943,RU -1572818944,1572820991,FR -1572820992,1572823039,CH -1572823040,1572825087,BY -1572825088,1572827135,RU -1572829184,1572831231,FI -1572831232,1572833279,NL -1572833280,1572835327,ES -1572835328,1572837375,IE -1572837376,1572839423,DK -1572839424,1572841471,DE -1572841728,1572841983,GB -1572842752,1572843007,NL -1572843520,1572845567,JO -1572845568,1572847615,FR -1572847616,1572849663,GI -1572849664,1572851711,JE -1572851712,1572853759,DE -1572853760,1572855807,BE -1572855808,1572857855,KZ -1572857856,1572859903,SE -1572859904,1572861951,IT -1572861952,1572863999,CH -1572864000,1577058303,DE -1577058304,1578106879,GB -1578106880,1578115071,DE -1578115072,1578123263,AT -1578123264,1578139647,DE -1578139648,1578172415,CH -1578172416,1578237951,MT -1578237952,1578303487,DK -1578303488,1578369023,RU -1578369024,1578434559,AZ -1578434560,1578500095,HU -1578500096,1578565631,FI -1578565632,1578579321,FR -1578579322,1578579322,HR -1578579323,1578582015,FR -1578582016,1578584063,IT -1578584064,1578584355,FR -1578584356,1578584356,IT -1578584357,1578584575,FR -1578584576,1578585299,PT -1578585300,1578585300,FR -1578585301,1578586111,PT -1578586112,1578588159,ES -1578588160,1578590207,PL -1578590208,1578590283,FR -1578590284,1578590287,GB -1578590288,1578590787,FR -1578590788,1578590791,ES -1578590792,1578590815,FR -1578590816,1578590831,GB -1578590832,1578590851,FR -1578590852,1578590855,ES -1578590856,1578590863,FR -1578590864,1578590879,BE -1578590880,1578590895,FR -1578590896,1578590911,FI -1578590912,1578590935,FR -1578590936,1578590943,ES -1578590944,1578591143,FR -1578591144,1578591151,GB -1578591152,1578591247,FR -1578591248,1578591263,GB -1578591264,1578591407,FR -1578591408,1578591411,ES -1578591412,1578591579,FR -1578591580,1578591583,ES -1578591584,1578591695,FR -1578591696,1578591699,ES -1578591700,1578591791,FR -1578591792,1578591795,ES -1578591796,1578591999,FR -1578592000,1578592031,DE -1578592032,1578592071,FR -1578592072,1578592079,ES -1578592080,1578592111,FR -1578592112,1578592127,ES -1578592128,1578592175,FR -1578592176,1578592183,CZ -1578592184,1578592191,PT -1578592192,1578592199,BE -1578592200,1578592207,CH -1578592208,1578592375,FR -1578592376,1578592379,GB -1578592380,1578592423,FR -1578592424,1578592431,IE -1578592432,1578592539,FR -1578592540,1578592543,ES -1578592544,1578592803,FR -1578592804,1578592807,PL -1578592808,1578593023,FR -1578593024,1578593279,DE -1578593280,1578593319,FR -1578593320,1578593323,PT -1578593324,1578593375,FR -1578593376,1578593407,GB -1578593408,1578593439,FR -1578593440,1578593443,ES -1578593444,1578593495,FR -1578593496,1578593499,PT -1578593500,1578593695,FR -1578593696,1578593703,GB -1578593704,1578593887,FR -1578593888,1578593895,ES -1578593896,1578593955,FR -1578593956,1578593959,ES -1578593960,1578594055,FR -1578594056,1578594059,ES -1578594060,1578594063,FR -1578594064,1578594079,PL -1578594080,1578594271,FR -1578594272,1578594303,BE -1578594304,1578594307,FR -1578594308,1578594311,FI -1578594312,1578594351,FR -1578594352,1578594355,GB -1578594356,1578594479,FR -1578594480,1578594495,ES -1578594496,1578594559,FR -1578594560,1578594815,ES -1578594816,1578594879,FR -1578594880,1578594895,DE -1578594896,1578595039,FR -1578595040,1578595055,GB -1578595056,1578595103,FR -1578595104,1578595119,GB -1578595120,1578595127,FR -1578595128,1578595131,PL -1578595132,1578595151,FR -1578595152,1578595167,ES -1578595168,1578595275,FR -1578595276,1578595279,ES -1578595280,1578595419,FR -1578595420,1578595423,GB -1578595424,1578595447,FR -1578595448,1578595455,ES -1578595456,1578595471,FR -1578595472,1578595479,ES -1578595480,1578595487,GB -1578595488,1578595535,FR -1578595536,1578595543,LT -1578595544,1578595643,FR -1578595644,1578595647,GB -1578595648,1578595711,FR -1578595712,1578595743,GB -1578595744,1578595763,FR -1578595764,1578595767,DE -1578595768,1578595807,FR -1578595808,1578595823,ES -1578595824,1578595987,FR -1578595988,1578595991,ES -1578595992,1578596107,FR -1578596108,1578596111,ES -1578596112,1578596123,FR -1578596124,1578596127,ES -1578596128,1578596175,FR -1578596176,1578596183,ES -1578596184,1578596255,FR -1578596256,1578596287,GB -1578596288,1578596319,FR -1578596320,1578596327,ES -1578596328,1578596351,FR -1578596352,1578596863,GB -1578596864,1578602495,FR -1578602496,1578604543,NL -1578604544,1578606591,GB -1578606592,1578608639,DE -1578608640,1578610687,CZ -1578610688,1578610695,FR -1578610696,1578610703,ES -1578610704,1578611039,FR -1578611040,1578611043,ES -1578611044,1578611167,FR -1578611168,1578611175,DE -1578611176,1578611183,FR -1578611184,1578611191,ES -1578611192,1578611423,FR -1578611424,1578611439,CZ -1578611440,1578611871,FR -1578611872,1578611887,GB -1578611888,1578611967,FR -1578611968,1578611971,DE -1578611972,1578611979,FR -1578611980,1578611983,DE -1578611984,1578611999,FR -1578612000,1578612007,ES -1578612008,1578612059,FR -1578612060,1578612063,ES -1578612064,1578612247,FR -1578612248,1578612255,ES -1578612256,1578612319,FR -1578612320,1578612351,IT -1578612352,1578612495,FR -1578612496,1578612499,DE -1578612500,1578612907,FR -1578612908,1578612911,ES -1578612912,1578613436,FR -1578613437,1578613437,ES -1578613438,1578613491,FR -1578613492,1578613495,IE -1578613496,1578613679,FR -1578613680,1578613695,ES -1578613696,1578613735,FR -1578613736,1578613739,ES -1578613740,1578614203,FR -1578614204,1578614271,GB -1578614272,1578614319,FR -1578614320,1578614323,RU -1578614324,1578614327,HU -1578614328,1578614399,FR -1578614400,1578614403,EE -1578614404,1578614423,FR -1578614424,1578614427,IS -1578614428,1578614431,LV -1578614432,1578614435,BG -1578614436,1578614459,FR -1578614460,1578614463,NO -1578614464,1578614471,FR -1578614472,1578614475,SI -1578614476,1578614479,UA -1578614480,1578614495,FR -1578614496,1578614511,DE -1578614512,1578614583,FR -1578614584,1578614591,GB -1578614592,1578615915,FR -1578615916,1578615916,GB -1578615917,1578631167,FR -1578631168,1578637311,IR -1578637312,1578638335,RO -1578638336,1578638591,PL -1578638592,1578638847,RO -1578638848,1578639359,US -1578639360,1578640383,ES -1578640384,1578640895,RO -1578640896,1578643455,ES -1578643456,1578645503,RO -1578645504,1578647551,AT -1578647552,1578649599,US -1578649600,1578651391,RO -1578651392,1578651647,PL -1578651648,1578657791,IR -1578657792,1578658815,ES -1578658816,1578659327,US -1578659328,1578659839,RO -1578659840,1578663935,ES -1578663936,1578762239,RU -1578762240,1578768383,BG -1578768384,1578768895,US -1578768896,1578778623,BG -1578778624,1578779135,US -1578779136,1578786047,BG -1578786048,1578786303,GI -1578786304,1578786559,BG -1578786560,1578786815,GI -1578786816,1578787071,BG -1578787072,1578787839,GI -1578787840,1578788095,BG -1578788096,1578788351,GI -1578788352,1578788607,BG -1578788608,1578788863,GI -1578788864,1578790143,BG -1578790144,1578790399,GI -1578790400,1578790911,US -1578790912,1578795007,PS -1578795008,1578827775,RU -1578827776,1578860543,UA -1578860544,1578893311,HU -1578893312,1578991615,RU -1578991616,1579024383,KW -1579024384,1579057151,GB -1579057152,1579089919,LV -1579089920,1579106303,GB -1579106304,1579122687,DE -1579122688,1579155455,RU -1579155456,1579679743,IT -1579679744,1579745279,PL -1579745280,1579810815,RU -1579810816,1579876351,PL -1579876352,1579941887,GE -1579941888,1580007423,HU -1580007424,1580015615,RU -1580015616,1580048383,UA -1580048384,1580064767,RU -1580064768,1580072959,GB -1580072960,1580075007,TR -1580075008,1580075199,SE -1580075200,1580075231,PT -1580075232,1580076031,SE -1580076032,1580077055,PT -1580077056,1580078079,ES -1580078080,1580081151,PT -1580081152,1580083199,TR -1580083200,1580087565,US -1580087566,1580087566,SE -1580087567,1580087807,US -1580087808,1580088063,BE -1580088064,1580089102,US -1580089103,1580089103,SE -1580089104,1580089343,US -1580089344,1580097535,DE -1580097536,1580098047,GB -1580098048,1580098303,US -1580098304,1580101955,GB -1580101956,1580101956,SE -1580101957,1580102718,GB -1580102719,1580102719,SE -1580102720,1580105007,GB -1580105008,1580105008,SE -1580105009,1580105727,GB -1580105728,1580107775,PT -1580107776,1580109055,SE -1580109056,1580109567,PT -1580109568,1580109823,SE -1580109824,1580113919,US -1580113920,1580120063,PT -1580120064,1580121087,GB -1580121088,1580122111,NL -1580122112,1580123135,GB -1580123136,1580125183,CY -1580125184,1580125695,NL -1580125696,1580125951,TR -1580125952,1580126207,GB -1580126208,1580128255,CY -1580128256,1580129279,NL -1580129280,1580130303,GB -1580130304,1580134399,CY -1580134400,1580135423,SE -1580135424,1580136447,GB -1580136448,1580137215,SE -1580137216,1580137471,PT -1580137472,1580138495,SE -1580138496,1580204031,SY -1580204032,1580335103,SA -1580335104,1580466175,RU -1580466176,1580597247,RO -1580597248,1580728319,TR -1580728320,1580990463,AE -1580990464,1581252607,PT -1581252608,1581776895,GR -1581776896,1581793279,RU -1581793280,1581809663,PL -1581809664,1581826047,BG -1581826048,1581842431,GB -1581842432,1581858815,BG -1581858816,1581875199,IT -1581875200,1581891583,TR -1581891584,1581907967,RU -1581907968,1581924351,IT -1581924352,1581940735,UA -1581940736,1581957119,IR -1581957120,1581973503,CZ -1581973504,1581989887,RU -1581989888,1582006271,PL -1582006272,1582022655,RU -1582022656,1582039039,NL -1582039040,1582055423,BH -1582055424,1582071807,UA -1582071808,1582088191,ES -1582088192,1582104575,GB -1582104576,1582153727,RU -1582153728,1582170111,SA -1582170112,1582186495,CH -1582186496,1582194271,TR -1582194272,1582194303,CY -1582194304,1582202879,TR -1582202880,1582219263,PL -1582219264,1582252031,RU -1582252032,1582268415,TR -1582268416,1582284799,DE -1582284800,1582301183,BH -1582301184,1583349759,IT -1583349760,1583611903,SA -1583611904,1583615999,LV -1583616000,1583617791,NL -1583617792,1583618047,US -1583618048,1583620095,NL -1583620096,1583624191,IT -1583624192,1583628287,RS -1583628288,1583632383,DE -1583632384,1583636479,RU -1583636480,1583640575,MK -1583640576,1583644671,NL -1583644672,1583648767,DE -1583648768,1583652863,CH -1583652864,1583656959,FR -1583656960,1583665151,RU -1583665152,1583669247,UA -1583669248,1583670271,GE -1583670272,1583670527,RU -1583670528,1583670655,GE -1583670656,1583671295,RU -1583671296,1583673343,GE -1583673344,1583677439,DE -1583677440,1583681535,FI -1583681536,1583685631,PL -1583685632,1583689727,DE -1583689728,1583693823,IT -1583693824,1583697919,RU -1583697920,1583702015,TR -1583702016,1583706111,RU -1583710208,1583714303,IR -1583714304,1583722495,GB -1583722496,1583726591,IR -1583726592,1583730687,BG -1583730688,1583734783,DK -1583734784,1583738879,LV -1583738880,1583742975,IR -1583742976,1583747071,TR -1583747072,1583751167,RU -1583751168,1583755263,NO -1583755264,1583756031,SC -1583756032,1583756287,NL -1583756288,1583759359,SC -1583759360,1583763455,TR -1583763456,1583765503,SY -1583765504,1583766015,RU -1583766016,1583766527,TR -1583766528,1583767551,SY -1583767552,1583771647,AT -1583771648,1583775743,RU -1583775744,1583779839,IT -1583779840,1583779847,GB -1583779848,1583779855,IT -1583779856,1583780423,GB -1583780424,1583780431,IT -1583780432,1583780743,GB -1583780744,1583780751,IT -1583780752,1583781343,GB -1583781344,1583781351,IT -1583781352,1583781359,GB -1583781360,1583781367,IT -1583781368,1583781671,GB -1583781672,1583781679,IT -1583781680,1583781863,GB -1583781864,1583781871,IT -1583781872,1583782415,GB -1583782416,1583782423,IT -1583782424,1583782431,GB -1583782432,1583782439,IT -1583782440,1583782975,GB -1583782976,1583782983,IT -1583782984,1583783935,GB -1583788032,1583792127,TM -1583792128,1583796223,IE -1583796224,1583800319,DE -1583800320,1583804415,ME -1583804416,1583808511,GB -1583808512,1583810559,MD -1583810560,1583810815,US -1583810816,1583811583,MD -1583811584,1583811839,RU -1583811840,1583812607,MD -1583812608,1583816351,NL -1583816352,1583816367,GB -1583816368,1583816703,NL -1583816704,1583817312,TR -1583817313,1583817344,GB -1583817345,1583820799,TR -1583820800,1583824895,LV -1583824896,1583828991,SI -1583828992,1583833087,RU -1583833088,1583837183,CH -1583841280,1583845375,FR -1583845376,1583849471,NL -1583849472,1583853567,DE -1583853568,1583857663,RU -1583857664,1583861759,SE -1583861760,1583865855,LU -1583865856,1583869951,RU -1583869952,1583874047,KZ -1583874048,1584398335,BE -1584398336,1584529407,CZ -1584529408,1584660479,DE -1584660480,1584857087,GB -1584857088,1584857855,DE -1584857856,1584857863,HR -1584857864,1584857871,GR -1584857872,1584857879,CZ -1584857880,1584857887,HU -1584857888,1584857895,PT -1584857896,1584857903,RS -1584857904,1584857911,GB -1584857912,1584857919,IE -1584857920,1584858111,DE -1584858112,1584859007,GB -1584859008,1584859135,NL -1584859136,1584922623,GB -1584922624,1585184767,TR -1585184768,1585190911,PL -1585190912,1585192959,ES -1585192960,1585195007,IT -1585195008,1585197055,CZ -1585197056,1585199103,IT -1585199104,1585201151,NL -1585201152,1585202687,GB -1585202688,1585202943,IT -1585202944,1585203199,GB -1585203200,1585205247,IT -1585205248,1585207295,FR -1585207296,1585209343,NL -1585211392,1585213439,CZ -1585215488,1585217535,NL -1585217536,1585219583,FR -1585219584,1585221631,NL -1585221632,1585223679,SK -1585223680,1585224447,FR -1585224448,1585224703,GP -1585224704,1585225727,FR -1585225728,1585227007,UA -1585227008,1585227263,RU -1585227264,1585227775,UA -1585227776,1585231871,RU -1585231872,1585233919,CZ -1585233920,1585238015,RU -1585238016,1585240063,DE -1585240064,1585241087,FR -1585241088,1585242111,MQ -1585242112,1585244159,RU -1585244160,1585246207,FR -1585246208,1585248255,RU -1585248256,1585249279,CZ -1585249280,1585249791,DE -1585249792,1585250303,CZ -1585250304,1585254399,RU -1585254400,1585256447,GB -1585256448,1585258495,DE -1585258496,1585260543,GB -1585260544,1585264639,RU -1585264640,1585265663,MT -1585265664,1585265967,IM -1585265968,1585265983,FR -1585265984,1585266687,IM -1585266688,1585270783,DE -1585270784,1585272831,IT -1585272832,1585274879,RU -1585276928,1585278975,FR -1585278976,1585281023,AL -1585281024,1585283071,UA -1585283072,1585285119,GB -1585285120,1585287167,ES -1585287168,1585289215,CY -1585289216,1585291263,DE -1585291264,1585295359,FR -1585295360,1585297407,HU -1585297408,1585299455,RU -1585299456,1585301503,GB -1585301504,1585303551,LU -1585303552,1585305599,DE -1585305600,1585307647,CZ -1585307648,1585309695,QA -1585309696,1585311743,IT -1585311744,1585313791,RU -1585313792,1585315839,HU -1585315840,1585317887,DK -1585317888,1585319935,IT -1585319936,1585321983,CH -1585321984,1585324031,RU -1585324032,1585324543,IE -1585324544,1585324799,FR -1585324800,1585326079,NL -1585326080,1585328127,GB -1585328128,1585330175,BE -1585330176,1585332223,IT -1585332224,1585334271,NL -1585334272,1585336319,DE -1585336320,1585338367,SE -1585338368,1585340415,RU -1585340416,1585342463,AT -1585342464,1585344511,GB -1585344512,1585346559,FR -1585346560,1585348607,GB -1585348608,1585350655,CH -1585350656,1585352703,IT -1585352704,1585354751,PT -1585354752,1585356799,RU -1585356800,1585358847,FI -1585358848,1585360895,PT -1585360896,1585362943,DK -1585362944,1585364991,IT -1585364992,1585367039,GB -1585367040,1585369087,RU -1585369088,1585371135,GB -1585371136,1585375231,SE -1585375232,1585377279,GB -1585377280,1585379327,ES -1585379328,1585381375,CH -1585381376,1585383423,RS -1585383424,1585385471,FR -1585385472,1585387519,DE -1585387520,1585389567,SI -1585389568,1585391615,SE -1585391616,1585393663,IT -1585393664,1585395711,DK -1585395712,1585397759,NO -1585397760,1585399807,RU -1585400832,1585401087,DE -1585401344,1585401599,DE -1585401600,1585401855,GB -1585401856,1585403903,IT -1585403904,1585405951,RU -1585405952,1585407999,GB -1585408000,1585410047,PL -1585410048,1585412095,GB -1585412096,1585414143,NO -1585414144,1585416191,CZ -1585416192,1585422335,RU -1585422336,1585424383,ES -1585424384,1585428479,RU -1585428480,1585432575,ES -1585432576,1585434623,RU -1585434624,1585436671,JO -1585436672,1585438719,RU -1585438720,1585440767,DE -1585440768,1585442815,IT -1585442816,1585446911,RU -1585446912,1585577983,KW -1585577984,1585643519,DE -1585643520,1585709055,UA -1585709056,1585840127,PT -1585840128,1585971199,DE -1585971200,1585979391,AT -1585979392,1585987583,GB -1585987584,1585995775,SE -1585995776,1586003967,AT -1586003968,1586012159,SK -1586012160,1586020351,DE -1586020352,1586028543,RU -1586028544,1586036735,GB -1586036736,1586061311,RU -1586061312,1586069503,SE -1586069504,1586073599,DK -1586073600,1586077695,DE -1586077696,1586085887,GE -1586085888,1586110463,RU -1586110464,1586118655,IT -1586118656,1586126847,DK -1586126848,1586135039,CZ -1586135040,1586143231,RU -1586143232,1586151423,IT -1586151424,1586159615,TR -1586159616,1586167807,MT -1586167808,1586175999,DE -1586176000,1586177023,FR -1586177024,1586184191,BE -1586184192,1586192383,NO -1586192384,1586200575,RU -1586200576,1586208767,MD -1586208768,1586216959,IR -1586216960,1586225151,BG -1586225152,1586233343,RU -1586233344,1586241535,FR -1586241536,1586249727,SE -1586249728,1586257919,SI -1586257920,1586263039,SE -1586263040,1586265087,LV -1586265088,1586266111,SE -1586266112,1586274303,RU -1586274304,1586282495,BE -1586282496,1586298879,RU -1586298880,1586307071,IT -1586307072,1586315263,RU -1586315264,1586323455,UZ -1586323456,1586331647,RU -1586331648,1586339839,PL -1586339840,1586348031,RU -1586348032,1586356223,SY -1586356224,1586372607,RU -1586372608,1586380799,JO -1586380800,1586388991,GB -1586388992,1586389503,ES -1586389504,1586389759,US -1586389760,1586392831,ES -1586392832,1586392895,NL -1586392896,1586393607,ES -1586393608,1586393615,GB -1586393616,1586393631,FR -1586393632,1586393663,NL -1586393664,1586397183,ES -1586399232,1586401279,RU -1586401280,1586403327,IT -1586403328,1586405375,IS -1586405376,1586407423,AT -1586407424,1586409471,GB -1586411520,1586413567,GB -1586413568,1586415615,IT -1586415616,1586417663,ES -1586417664,1586419711,NL -1586419712,1586421759,DE -1586421760,1586423807,SE -1586423808,1586425855,CZ -1586425856,1586427903,NL -1586427904,1586431999,CH -1586432000,1586434047,DK -1586434048,1586436095,FR -1586436096,1586438143,ES -1586438144,1586446335,RU -1586446336,1586448383,NO -1586448384,1586450431,ES -1586450432,1586452479,FR -1586452480,1586454527,CH -1586454528,1586456575,IT -1586456576,1586458623,GB -1586458624,1586458911,FR -1586458912,1586458943,BE -1586458944,1586458975,CH -1586458976,1586459007,DE -1586459008,1586459039,ES -1586459040,1586459071,GB -1586459072,1586459103,IT -1586459104,1586459135,NL -1586459136,1586460527,FR -1586460528,1586460543,ES -1586460544,1586460671,FR -1586462720,1586464767,RU -1586464768,1586466815,ES -1586466816,1586468863,RU -1586468864,1586470911,IT -1586472960,1586475007,CZ -1586475008,1586477055,GR -1586477056,1586479103,BE -1586479104,1586481151,KG -1586481152,1586483199,ES -1586483200,1586485247,NL -1586485248,1586487295,FR -1586487296,1586489343,SA -1586489344,1586491391,CZ -1586491392,1586493439,RU -1586493440,1586495487,GB -1586495488,1587019775,DK -1587019776,1587085311,PL -1587085312,1587150847,UA -1587150848,1587154943,RU -1587154944,1587159039,PL -1587159040,1587163135,UA -1587165184,1587167231,PL -1587167232,1587175423,RU -1587175424,1587177471,PL -1587177472,1587179519,RS -1587200000,1587216383,UA -1587216384,1587289087,BG -1587289088,1587290111,DE -1587290112,1587322367,BG -1587322368,1587322623,RS -1587322624,1587334143,BG -1587334144,1587335167,DE -1587335168,1587340287,BG -1587340288,1587341311,DE -1587341312,1587347455,BG -1587347456,1587412991,NL -1587412992,1587417087,RU -1587421184,1587425279,UA -1587425280,1587425535,RU -1587425536,1587425791,UZ -1587425792,1587427327,RU -1587427328,1587429375,UZ -1587429376,1587437567,UA -1587437568,1587445759,RU -1587445760,1587449855,PL -1587449856,1587453951,UA -1587453952,1587470335,RU -1587470336,1587474431,PL -1587478528,1587511295,RU -1587511296,1587544063,IL -1587544064,1588068351,IT -1588068352,1588396031,NL -1588396032,1588592639,GB -1588592640,1588593663,RO -1588593664,1588593919,IE -1588593920,1588594687,RO -1588594688,1588602879,IR -1588602880,1588603135,RO -1588603136,1588603391,FR -1588603392,1588603903,RO -1588603904,1588604927,IT -1588604928,1588609023,IR -1588609024,1588613119,MD -1588613120,1588617215,IR -1588617216,1588617727,RO -1588617728,1588618239,BE -1588618240,1588619775,RO -1588619776,1588620287,SG -1588620288,1588621311,RO -1588621312,1588625407,MD -1588625408,1588627455,RO -1588627456,1588629503,ES -1588629504,1588636671,RO -1588636672,1588637695,US -1588637696,1588638719,ES -1588638720,1588640767,RO -1588640768,1588641279,LT -1588641280,1588641535,RO -1588641536,1588641791,GB -1588641792,1588642303,BG -1588642304,1588642559,DE -1588642560,1588642815,NL -1588642816,1588643839,BG -1588643840,1588649983,RO -1588649984,1588652031,SE -1588652032,1588652159,NL -1588652160,1588654079,LT -1588654080,1588658175,DE -1588658176,1588659199,RO -1588659200,1588659711,GB -1588659712,1588661247,RO -1588661248,1588661503,NL -1588661504,1588662783,RO -1588662784,1588663295,IT -1588663296,1588663807,RO -1588663808,1588664063,GB -1588664064,1588664319,RO -1588664320,1588664575,TH -1588664576,1588664831,EE -1588664832,1588665087,RO -1588665088,1588665343,GB -1588665344,1588673535,RO -1588673536,1588673791,NL -1588673792,1588674047,FR -1588674048,1588674303,IE -1588674304,1588674559,NL -1588674560,1588674815,RO -1588674816,1588675071,US -1588675072,1588675583,RO -1588675584,1588676607,IT -1588676608,1588678655,IR -1588678656,1588680703,RO -1588680704,1588682751,LU -1588682752,1588684799,RO -1588684800,1588685055,TH -1588685056,1588685311,NL -1588685312,1588686847,RO -1588686848,1588687103,NO -1588687104,1588687359,GB -1588687360,1588688383,RO -1588688384,1588688639,GB -1588688640,1588689407,RO -1588689408,1588689663,GB -1588689664,1588689919,RU -1588689920,1588690687,GB -1588690688,1588690943,IT -1588690944,1588692991,PL -1588692992,1588697087,RO -1588697088,1588699135,ES -1588699136,1588715519,IT -1588715520,1588717567,DE -1588717568,1588720639,FR -1588720640,1588721663,DE -1588721664,1588723711,GB -1588723712,1588854783,UA -1588854784,1588985855,RU -1588985856,1589182463,IR -1589182464,1589198847,OM -1589198848,1589200895,FR -1589200896,1589202943,IT -1589202944,1589204991,SE -1589204992,1589207039,DE -1589207040,1589215231,IT -1589215232,1589224447,GB -1589224448,1589224703,BE -1589224704,1589247999,GB -1589248000,1589256191,EE -1589256192,1589258239,SE -1589258240,1589260287,LV -1589260288,1589261311,SE -1589261312,1589262335,LV -1589262336,1589264383,SE -1589264384,1589278719,LV -1589278720,1589280767,SE -1589280768,1589313535,DE -1589313536,1589346303,LB -1589346304,1589379071,KW -1589379072,1589411839,RU -1589411840,1589444607,IL -1589444608,1589477375,DK -1589477376,1589510143,RS -1589510144,1589542911,RU -1589542912,1589547007,BG -1589547008,1589551103,EE -1589551104,1589560319,BG -1589560320,1589561343,GI -1589561344,1589563391,NL -1589563392,1589571583,HK -1589571584,1589573631,GB -1589573632,1589574143,US -1589574144,1589574399,CA -1589574400,1589574655,US -1589574656,1589575679,BG -1589575680,1589608447,CN -1589608448,1589616639,SE -1589616640,1589624831,DK -1589624832,1589626879,SE -1589626880,1589641215,DK -1589641216,1590034431,GB -1590034432,1590036479,RU -1590036480,1590038527,GB -1590038528,1590040575,RU -1590040576,1590042623,NL -1590042624,1590044671,RU -1590046720,1590048767,RU -1590048768,1590050815,DE -1590050816,1590052863,SE -1590052864,1590054911,IT -1590054912,1590056959,GB -1590056960,1590059007,ES -1590059008,1590061055,IT -1590061056,1590063103,RU -1590063104,1590065151,CZ -1590065152,1590067199,IE -1590067200,1590069247,RU -1590069248,1590071295,AT -1590071296,1590073343,FR -1590073344,1590075391,NL -1590075392,1590077439,BE -1590077440,1590079487,GB -1590079488,1590079743,MQ -1590079744,1590080511,GP -1590080512,1590081535,MQ -1590081536,1590083583,GB -1590083584,1590085631,RU -1590085632,1590087679,FR -1590087680,1590089727,IT -1590089728,1590091775,RU -1590091776,1590093823,CZ -1590093824,1590095871,RU -1590095872,1590097919,CZ -1590097920,1590099967,CH -1590099968,1590102015,RU -1590102016,1590104063,IT -1590104064,1590106111,TJ -1590106112,1590108159,GB -1590108160,1590110207,TR -1590110208,1590112255,CZ -1590112256,1590114303,HU -1590114304,1590116351,FI -1590116352,1590120447,RU -1590120448,1590122495,IT -1590122496,1590124543,DE -1590126592,1590128639,RU -1590128640,1590130687,FI -1590130688,1590132735,FR -1590132736,1590134783,GB -1590136832,1590138879,GB -1590138880,1590140927,FR -1590140928,1590142975,UA -1590142976,1590145023,AT -1590145024,1590147071,HU -1590147072,1590149119,GB -1590149120,1590151167,CZ -1590151168,1590153215,TR -1590153216,1590155263,DE -1590155264,1590157311,RU -1590157312,1590161407,GB -1590161408,1590163455,DE -1590163456,1590165503,NL -1590165504,1590689791,AE -1590689792,1591214079,NL -1591214080,1591738367,DE -1591738368,1592000511,BE -1592000512,1592004607,ES -1592004608,1592008703,AM -1592008704,1592012799,GB -1592012800,1592016895,CH -1592016896,1592020991,GB -1592020992,1592025087,SK -1592025088,1592029183,DE -1592029184,1592033279,RU -1592033280,1592037375,NL -1592037376,1592041471,CH -1592041472,1592045567,RU -1592045568,1592045595,FR -1592045596,1592045599,GB -1592045600,1592046107,FR -1592046108,1592046111,GB -1592046112,1592049663,FR -1592049664,1592053759,RU -1592053760,1592057855,NL -1592057856,1592061951,RS -1592061952,1592066047,RU -1592066048,1592066559,CY -1592066560,1592067583,US -1592067584,1592070143,CY -1592070144,1592074239,RU -1592074240,1592078335,SK -1592078336,1592082431,NL -1592082432,1592086527,GB -1592086528,1592087551,CZ -1592087552,1592088063,PL -1592088064,1592088191,CZ -1592088192,1592088319,PL -1592088320,1592090623,CZ -1592090624,1592094719,RU -1592094720,1592098815,RS -1592098816,1592102911,GB -1592102912,1592107007,DE -1592107008,1592111103,GB -1592111104,1592115199,DE -1592115200,1592119295,ES -1592119296,1592123391,PL -1592123392,1592135679,RU -1592135680,1592139775,PL -1592139776,1592143871,RU -1592143872,1592147967,DE -1592147968,1592152063,IT -1592152064,1592156159,IL -1592156160,1592160255,IE -1592160256,1592168447,RU -1592168448,1592172543,CZ -1592172544,1592176639,RU -1592176640,1592180735,RS -1592180736,1592184831,UA -1592184832,1592188927,CH -1592188928,1592193023,UZ -1592193024,1592197119,RU -1592197120,1592201215,PL -1592201216,1592205311,RU -1592205312,1592209407,UA -1592209408,1592213503,PL -1592213504,1592217599,UA -1592217600,1592221695,CH -1592221696,1592225791,DK -1592225792,1592242175,RU -1592242176,1592246271,UA -1592246272,1592250367,RU -1592254464,1592258559,PL -1592258560,1592262655,NL -1592262656,1592268799,RU -1592268800,1592269823,UZ -1592269824,1592270335,VG -1592270336,1592270591,MD -1592270592,1592270847,RU -1592270848,1592272895,PL -1592272896,1592281087,RU -1592281088,1592283135,UA -1592283136,1592285183,GR -1592285184,1592287231,RU -1592287232,1592289279,RO -1592289280,1592291327,RU -1592291328,1592293375,SM -1592293376,1592295423,LT -1592295424,1592299519,RU -1592299520,1592303615,PL -1592303616,1592305663,NL -1592305664,1592307711,IR -1592307712,1592309759,UA -1592309760,1592311807,RU -1592311808,1592313855,DE -1592313856,1592315903,RU -1592315904,1592317951,UA -1592317952,1592319999,PL -1592320000,1592322047,LT -1592322048,1592324095,RU -1592328192,1592393727,RU -1592393728,1592459263,SE -1592459264,1592524799,TR -1592524800,1592557567,GB -1592557568,1592576511,BG -1592576512,1592577023,FR -1592577024,1592590335,BG -1592590336,1592594431,FI -1592594432,1592598527,DE -1592598528,1592600575,FI -1592600576,1592601599,NL -1592601600,1592606719,FI -1592606720,1592608767,SG -1592608768,1592610815,FI -1592610816,1592612863,DE -1592612864,1592623103,FI -1592623104,1592655871,RU -1592655872,1592786943,FR -1592786944,1592803327,PL -1592803328,1592819711,RU -1592819712,1592836095,UA -1592836096,1592840191,GE -1592840192,1592842239,RU -1592842240,1592852479,GE -1592852480,1592868863,RU -1592868864,1592885247,CZ -1592885248,1592901631,IR -1592901632,1592934399,RU -1592934400,1592950783,CZ -1592950784,1592967167,RU -1592967168,1592980223,LU -1592980224,1592980479,DE -1592980480,1592983551,LU -1592983552,1592999935,RU -1592999936,1593016319,MD -1593016320,1593049087,RU -1593049088,1593065471,UA -1593065472,1593081855,LT -1593081856,1593098239,UA -1593098240,1593114623,CH -1593114624,1593131007,SE -1593131008,1593131023,CH -1593131024,1593131039,SE -1593131040,1593131263,GB -1593131264,1593132031,CH -1593132032,1593132287,GB -1593132288,1593132543,AT -1593132544,1593132799,FR -1593132800,1593133055,GB -1593133056,1593133311,FR -1593133312,1593133567,GB -1593133568,1593133823,FR -1593133824,1593134591,AT -1593134592,1593135103,SE -1593135104,1593135359,GB -1593135360,1593135615,IE -1593135616,1593136639,GB -1593136640,1593139199,IE -1593139200,1593140223,NL -1593140224,1593147391,IE -1593147392,1593163775,RU -1593163776,1593180159,AT -1593180160,1593196543,NO -1593196544,1593203103,SE -1593203104,1593203135,FI -1593203136,1593206783,SE -1593206784,1593207039,FI -1593207040,1593212927,SE -1593212928,1593229311,PL -1593229312,1593245695,EE -1593245696,1593247743,NL -1593247744,1593249791,IT -1593249792,1593251839,RU -1593251840,1593253631,FR -1593253632,1593253887,ES -1593253888,1593255935,CZ -1593255936,1593257983,DE -1593257984,1593260031,IE -1593260032,1593262079,RU -1593262080,1593264127,KZ -1593264128,1593266175,NL -1593266176,1593267199,GB -1593267200,1593267711,BZ -1593267712,1593268223,GB -1593268224,1593270271,HU -1593270272,1593272319,GB -1593272320,1593274367,RU -1593274368,1593276415,DE -1593276416,1593278463,RU -1593278464,1593280511,KZ -1593282560,1593284607,AT -1593284608,1593286655,GB -1593286656,1593288703,FR -1593288704,1593290751,SE -1593290752,1593292799,FR -1593292800,1593294847,IT -1593294848,1593296895,NL -1593296896,1593298943,RS -1593298944,1593300991,RU -1593300992,1593303039,CH -1593303040,1593305087,UA -1593305088,1593307135,FR -1593307136,1593311231,RU -1593311232,1593327615,UA -1593327616,1593343999,ES -1593344000,1593376767,HU -1593376768,1593409535,JO -1593409536,1593412095,DE -1593412096,1593412351,GB -1593412352,1593420927,DE -1593420928,1593421055,US -1593421056,1593421311,GB -1593421312,1593421567,FR -1593421568,1593421823,GB -1593421824,1593422591,DE -1593422592,1593422847,GB -1593422848,1593423359,DE -1593423360,1593423423,US -1593423424,1593423439,DE -1593423440,1593423615,US -1593423616,1593431167,DE -1593431168,1593431295,GB -1593431296,1593438719,DE -1593438720,1593438847,US -1593438848,1593438863,DE -1593438864,1593438975,US -1593438976,1593442303,DE -1593442304,1593475071,BA -1593475072,1593491455,HR -1593491456,1593499647,DE -1593499648,1593503743,GB -1593503744,1593505791,CZ -1593505792,1593540607,RU -1593540608,1593573375,PL -1593573376,1593606143,LU -1593606144,1593638911,SY -1593638912,1593671679,RU -1593671680,1593704447,HR -1593704448,1593737215,SE -1593737216,1593769983,PL -1593769984,1593802751,RU -1593802752,1593835519,SE -1593835520,1594884095,TR -1594884096,1595408383,ES -1595408384,1595998207,RU -1595998208,1596063743,DE -1596063744,1596129279,NO -1596129280,1596194815,IL -1596194816,1596260351,NL -1596260352,1596325887,RU -1596325888,1596391423,IR -1596391424,1596456959,ES -1596456960,1596588031,PL -1596588032,1596719103,BG -1596719104,1596850175,IE -1596850176,1596850431,CZ -1596850432,1596850687,RU -1596850688,1596851199,UA -1596851200,1596851455,RU -1596851456,1596851711,CZ -1596851712,1596851967,UA -1596851968,1596852223,LV -1596852224,1596852479,UA -1596852480,1596852735,RU -1596852736,1596852991,UA -1596852992,1596853247,KZ -1596853248,1596854271,RU -1596854272,1596858367,BY -1596858368,1596858879,CZ -1596858880,1596859391,RU -1596859392,1596859903,CZ -1596859904,1596861439,RU -1596861440,1596861951,UA -1596861952,1596862207,CZ -1596862208,1596866559,RU -1596866560,1596868607,UZ -1596868608,1596869631,RU -1596869632,1596869887,UA -1596869888,1596873215,RU -1596873216,1596873471,UZ -1596873472,1596873727,RU -1596873728,1596873983,UZ -1596873984,1596874751,RU -1596874752,1596875007,UA -1596875008,1596875263,RU -1596875264,1596875775,UA -1596875776,1596876799,UZ -1596876800,1596877311,RU -1596877312,1596877596,CZ -1596877597,1596877597,UA -1596877598,1596877823,CZ -1596877824,1596878079,UA -1596878080,1596879615,RU -1596879616,1596879871,CZ -1596879872,1596880895,RU -1596880896,1596882175,UA -1596882176,1596882431,RU -1596882432,1596882687,UA -1596882688,1596882943,CZ -1596882944,1596886015,RU -1596886016,1596886527,UA -1596886528,1596887295,RU -1596887296,1596887551,KZ -1596887552,1596889599,RU -1596889600,1596889855,KG -1596889856,1596890111,UA -1596890112,1596890367,RU -1596890368,1596890619,UA -1596890620,1596890620,RU -1596890621,1596890623,UA -1596890624,1596890879,CZ -1596890880,1596891135,RU -1596891136,1596892159,UA -1596892160,1596893183,RU -1596893184,1596895231,UA -1596895232,1596900863,RU -1596900864,1596901375,NL -1596901376,1596907519,BY -1596907520,1596909567,RU -1596909568,1596911615,KZ -1596911616,1596912639,BY -1596912640,1596923903,RU -1596923904,1596924927,ES -1596924928,1596925951,RU -1596925952,1596927999,CZ -1596928000,1596930047,RU -1596930048,1596930303,UA -1596930304,1596930559,TM -1596930560,1596931071,CZ -1596931072,1596931583,BY -1596931584,1596931839,CZ -1596931840,1596940287,RU -1596940288,1596940543,CZ -1596940544,1596940799,RU -1596940800,1596941055,UA -1596941056,1596941311,BY -1596941312,1596942079,RU -1596942080,1596942335,PT -1596942336,1596945663,UA -1596945664,1596945919,CZ -1596945920,1596947455,RU -1596947456,1596948479,UA -1596948480,1596950527,BY -1596950528,1596951551,UA -1596951552,1596951807,RU -1596951808,1596952063,NL -1596952064,1596952831,UA -1596952832,1596953087,RU -1596953088,1596953599,CZ -1596953600,1596954623,UA -1596954624,1596955647,RU -1596955648,1596956159,CZ -1596956160,1596956671,RU -1596956672,1596956927,CZ -1596956928,1596957183,RU -1596957184,1596957951,UA -1596957952,1596958207,CZ -1596958208,1596958463,RU -1596958464,1596958719,UA -1596958720,1596961279,RU -1596961280,1596961791,SK -1596961792,1596962815,RU -1596962816,1596963327,AM -1596963328,1596963839,CZ -1596963840,1596964095,KZ -1596964096,1596964607,CZ -1596964608,1596967167,RU -1596967168,1596967423,CZ -1596967424,1596967935,RU -1596967936,1596968959,UA -1596968960,1596973055,BA -1596973056,1596975103,BY -1596975104,1596975359,CZ -1596975360,1596979199,RU -1596979200,1596979711,CZ -1596979712,1596980223,UA -1596980224,1596980479,RU -1596980480,1596980735,UA -1596980736,1596980991,CZ -1596980992,1596981247,UA -1596981248,1597243391,PL -1597243392,1597505535,RU -1597505536,1597767679,KZ -1597767680,1598029823,ES -1598029824,1598062591,RO -1598062592,1598095359,RU -1598095360,1598128127,MD -1598128128,1598160895,TR -1598160896,1598193663,KW -1598193664,1598226431,RU -1598226432,1598259199,UA -1598259200,1598291967,RU -1598291968,1598324735,LV -1598324736,1598357503,RU -1598357504,1598390271,PT -1598390272,1598423039,UA -1598423040,1598455807,RU -1598455808,1598488575,TR -1598488576,1598685183,RU -1598685184,1598816255,IT -1598816256,1598947327,RO -1598947328,1599078399,RU -1599078400,1599094783,SE -1599094784,1599111167,RU -1599111168,1599127551,IR -1599127552,1599143935,CZ -1599143936,1599160319,UA -1599160320,1599176703,IR -1599176704,1599188991,FR -1599188992,1599189503,DE -1599189504,1599190797,FR -1599190798,1599190798,DE -1599190799,1599190807,FR -1599190808,1599190815,DE -1599190816,1599193087,FR -1599193088,1599209471,RU -1599209472,1599237375,IR -1599237376,1599237631,GB -1599237632,1599242239,IR -1599242240,1599258623,CZ -1599258624,1599324159,RU -1599324160,1599340543,IE -1599340544,1599356927,RU -1599356928,1599373311,BH -1599373312,1599406079,RU -1599406080,1599422463,NL -1599422464,1599426559,RU -1599426560,1599426815,GB -1599426816,1599427071,US -1599427072,1599427327,RU -1599427328,1599427583,UA -1599427584,1599430655,RU -1599430656,1599438847,TM -1599438848,1599455231,RS -1599455232,1599471615,CZ -1599471616,1599487999,MK -1599488000,1599504383,IL -1599504384,1599520767,AZ -1599520768,1599537151,RU -1599537152,1599550719,BG -1599550720,1599550975,RS -1599550976,1599553535,BG -1599553536,1599561727,KG -1599561728,1599565823,GB -1599565824,1599567871,SY -1599567872,1599569919,IT -1599569920,1599586303,SI -1599586304,1599602687,BG -1599602688,1599864831,DE -1599864832,1600126975,PT -1600126976,1600389119,NL -1600397312,1600401407,DE -1600442368,1600446463,DE -1600453120,1600453631,IT -1600456704,1600457727,DE -1600520192,1600651263,SK -1600651264,1600684031,GE -1600684032,1600749567,RU -1600749568,1600782335,SK -1600782336,1600880639,RU -1600880640,1600913407,AL -1600913408,1600946175,PL -1600946176,1600978943,RU -1600978944,1601011711,SE -1601011712,1601044479,UA -1601044480,1601077247,RU -1601077248,1601110015,IT -1601110016,1601142783,BG -1601142784,1601175551,UA -1601175552,1601699839,DE -1601699840,1602224127,ES -1602224128,1602226175,NL -1602226176,1602228223,GB -1602228224,1602230270,FR -1602230271,1602230271,DE -1602230272,1602232319,DK -1602232320,1602234367,CH -1602234368,1602235903,FR -1602235904,1602236159,ES -1602236160,1602236415,FR -1602236416,1602238463,GB -1602238464,1602240511,TR -1602240512,1602242559,BY -1602242560,1602244607,FR -1602244608,1602246655,CH -1602246656,1602248703,NL -1602248704,1602250751,BE -1602250752,1602252799,NO -1602252800,1602254847,SE -1602254848,1602256895,LU -1602256896,1602258943,GB -1602258944,1602260991,RU -1602260992,1602263039,FR -1602263040,1602265087,ES -1602265088,1602267135,RU -1602267136,1602269183,RO -1602269184,1602271231,RU -1602271232,1602273279,MK -1602273280,1602273535,FR -1602273536,1602273791,GB -1602273792,1602274559,IN -1602274560,1602274815,IE -1602274816,1602275071,GB -1602275072,1602279423,DE -1602279424,1602281471,GB -1602281472,1602283519,RU -1602283520,1602285567,HR -1602285568,1602287615,RU -1602287616,1602289663,DE -1602289664,1602291711,LB -1602291712,1602293759,SA -1602293760,1602295807,GB -1602295808,1602297855,NL -1602297856,1602299903,IL -1602299904,1602301951,GR -1602301952,1602303999,DE -1602304000,1602306047,RU -1602306048,1602308095,GB -1602308096,1602310143,RU -1602310144,1602312191,NL -1602312192,1602314239,RU -1602314240,1602316287,CZ -1602316288,1602318335,GB -1602318336,1602320383,ES -1602320384,1602324479,NL -1602324480,1602328575,RU -1602328576,1602330623,ES -1602330624,1602336767,RU -1602336768,1602338815,GB -1602338816,1602340863,EE -1602340864,1602342911,AT -1602342912,1602344959,DE -1602344960,1602347007,ES -1602347008,1602349055,PL -1602349056,1602351103,RU -1602351104,1602353151,CZ -1602353152,1602355199,ES -1602357248,1602359295,FR -1602359296,1602361343,DE -1602361344,1602363391,FI -1602363392,1602365439,LV -1602365440,1602367487,BE -1602367488,1602369535,ES -1602369536,1602371583,IR -1602371584,1602373631,SE -1602373632,1602375679,GB -1602375680,1602377727,BY -1602377728,1602379775,PS -1602379776,1602383871,GB -1602383872,1602385919,DE -1602385920,1602387967,AT -1602387968,1602390015,RU -1602390016,1602392063,IT -1602392064,1602394111,GB -1602394112,1602396159,FR -1602396160,1602398207,DE -1602398208,1602400255,TR -1602400256,1602402303,RU -1602402304,1602404351,LU -1602404352,1602406399,GB -1602406400,1602408447,DE -1602408448,1602410495,DK -1602410496,1602412543,NO -1602414592,1602416639,NL -1602416640,1602418687,IR -1602418688,1602420735,DE -1602420736,1602424831,RU -1602424832,1602426879,FR -1602426880,1602428927,RU -1602428928,1602430975,PL -1602430976,1602433023,IT -1602433024,1602435071,HU -1602435072,1602437119,IT -1602437120,1602439167,GB -1602439168,1602441215,RU -1602441216,1602443263,GB -1602443264,1602445311,RU -1602445312,1602447359,DE -1602447360,1602449407,GB -1602449408,1602451455,LV -1602451456,1602453503,DE -1602453504,1602455551,SK -1602455552,1602457599,FR -1602457600,1602459647,RU -1602459648,1602461695,GB -1602461696,1602465791,ES -1602465792,1602467839,RU -1602467840,1602468095,GB -1602468096,1602469887,GI -1602469888,1602471935,AT -1602471936,1602473983,SE -1602473984,1602476031,RU -1602476032,1602478079,GB -1602478080,1602480127,RU -1602480128,1602482175,MT -1602482176,1602484223,FR -1602484224,1602486271,GB -1602486272,1602748415,UA -1602748416,1602781183,PT -1602781184,1602813951,FR -1602813952,1602846719,RU -1602846720,1602879487,GE -1602879488,1602896924,MQ -1602896925,1602896925,RE -1602896926,1602912255,MQ -1602912256,1602928639,GB -1602928640,1602930687,HU -1602930688,1602932735,GB -1602932736,1602936831,DK -1602936832,1603010559,RU -1603010560,1603014655,FR -1603014656,1603018751,RU -1603018752,1603022847,HU -1603022848,1603026943,GB -1603026944,1603031039,SE -1603031040,1603035135,RU -1603035136,1603039231,SY -1603039232,1603043327,RS -1603043328,1603047423,IT -1603047424,1603051519,RU -1603051520,1603055615,JO -1603055616,1603059711,SE -1603059712,1603063807,AM -1603063808,1603067903,BG -1603067904,1603071999,GB -1603072000,1603076095,CZ -1603076096,1603080191,RU -1603080192,1603080703,DE -1603080704,1603080831,US -1603080832,1603080959,SE -1603080960,1603081215,DE -1603081216,1603081247,GB -1603081248,1603081255,NO -1603081256,1603081263,FI -1603081264,1603081279,GB -1603081280,1603081295,US -1603081296,1603081407,DE -1603081408,1603081471,ES -1603081472,1603082495,DE -1603082496,1603082751,GT -1603082752,1603083007,ES -1603083008,1603083263,UA -1603083264,1603083535,DE -1603083536,1603083551,LU -1603083552,1603083554,NL -1603083555,1603083555,LU -1603083556,1603083560,NL -1603083561,1603083561,LU -1603083562,1603083567,NL -1603083568,1603083583,LU -1603083584,1603083615,DE -1603083616,1603083647,LU -1603083648,1603084031,DE -1603084032,1603088383,IT -1603088384,1603092479,LB -1603092480,1603100671,NO -1603100672,1603108863,FR -1603108864,1603112959,KZ -1603112960,1603121151,GB -1603121152,1603129343,RU -1603129344,1603133439,JO -1603133440,1603137535,RU -1603137536,1603141631,KW -1603141632,1603145727,ES -1603145728,1603146239,IL -1603146240,1603146751,US -1603146752,1603149311,IL -1603149312,1603149567,NL -1603149568,1603149823,IL -1603149824,1603153919,RU -1603153920,1603158015,NL -1603158016,1603162111,DE -1603162112,1603166207,TJ -1603166208,1603168159,NL -1603168160,1603168167,US -1603168168,1603168615,NL -1603168616,1603168623,US -1603168624,1603170303,NL -1603170304,1603174399,IE -1603174400,1603178495,TR -1603178496,1603182591,GB -1603182592,1603186687,FR -1603186688,1603190783,IT -1603190784,1603194879,RU -1603194880,1603198975,IT -1603198976,1603203071,IR -1603203072,1603207167,PL -1603207168,1603215359,RU -1603215360,1603219455,DE -1603219456,1603223551,CH -1603223552,1603226255,FR -1603226256,1603226263,DE -1603226264,1603226271,NL -1603226272,1603227647,FR -1603227648,1603231743,AT -1603231744,1603235839,IT -1603235840,1603239935,RU -1603239936,1603244031,CZ -1603244032,1603248127,SI -1603248128,1603252223,DE -1603252224,1603256319,RU -1603256320,1603260415,SE -1603260416,1603264511,RU -1603264512,1603268607,AT -1603268608,1603272703,PL -1603272704,1603796991,GB -1603796992,1603813375,RU -1603813376,1603829759,CH -1603829760,1603846143,NL -1603846144,1603862527,GB -1603862528,1603878911,EE -1603878912,1603895295,MD -1603895296,1603928063,RU -1603928064,1603944447,DK -1603944448,1603977215,RU -1603977216,1603993599,GB -1603993600,1604009983,ME -1604009984,1604026367,PL -1604026368,1604042751,NL -1604042752,1604059135,SE -1604059136,1604075519,MK -1604075520,1604091903,RU -1604091904,1604108287,BA -1604108288,1604111103,DE -1604111104,1604112383,ES -1604112384,1604114431,DE -1604114432,1604115455,IR -1604115456,1604115967,DE -1604115968,1604116479,IR -1604116480,1604118783,DE -1604118784,1604120063,IR -1604120064,1604120575,DE -1604120576,1604122623,PL -1604122624,1604123135,IR -1604123136,1604123647,DE -1604123648,1604124671,IR -1604124672,1604141055,DE -1604141056,1604157439,IT -1604157440,1604190207,FR -1604190208,1604206591,UA -1604206592,1604222975,PL -1604222976,1604239359,BG -1604239360,1604255743,RU -1604255744,1604272127,SY -1604272128,1604288511,IQ -1604288512,1604304895,RU -1604304896,1604321279,SI -1604321280,1604386815,PL -1604386816,1604433919,RU -1604433920,1604434943,KZ -1604434944,1604444159,RU -1604444160,1604444245,KZ -1604444246,1604444246,US -1604444247,1604445183,KZ -1604445184,1604452351,RU -1604452352,1604517887,IR -1604517888,1604583423,RU -1604583424,1604601727,UA -1604601728,1604601855,PL -1604601856,1604648959,UA -1604648960,1604714495,RU -1604714496,1604780031,DK -1604780032,1604845567,RU -1604845568,1604853759,FR -1604853760,1604870143,HU -1604870144,1604878335,HR -1604878336,1604886527,DE -1604886528,1604886783,NL -1604886784,1604887039,DE -1604887040,1604887295,NL -1604887296,1604888063,DE -1604888064,1604888831,NL -1604888832,1604889599,TR -1604889600,1604890111,DE -1604890112,1604890367,NL -1604890368,1604890879,TR -1604890880,1604891967,DE -1604891968,1604892159,NL -1604892160,1604892927,DE -1604892928,1604893183,HK -1604893184,1604893375,NL -1604893376,1604893951,DE -1604893952,1604894463,TR -1604894464,1604894719,DE -1604894720,1604902911,CZ -1604902912,1604911103,BG -1604911104,1604919295,UA -1604919296,1604927487,NO -1604927488,1604935679,IT -1604935680,1604952063,RU -1604952064,1604960255,DE -1604960256,1604968447,BG -1604968448,1604976639,ES -1604976640,1604993023,FR -1604993024,1605001215,NL -1605001216,1605025791,RU -1605025792,1605033983,IQ -1605033984,1605042175,SK -1605042176,1605050367,RU -1605050368,1605058559,IT -1605058560,1605066751,HU -1605066752,1605074943,PL -1605074944,1605083135,FR -1605083136,1605091327,BE -1605091328,1605099519,PL -1605099520,1605107711,RU -1605107712,1605109495,GB -1605109496,1605109503,IT -1605109504,1605110303,GB -1605110304,1605110311,IT -1605110312,1605110375,GB -1605110376,1605110383,IT -1605110384,1605111023,GB -1605111024,1605111031,IT -1605111032,1605111903,GB -1605111904,1605111911,IT -1605111912,1605113383,GB -1605113384,1605113391,IT -1605113392,1605113407,GB -1605113408,1605113415,IT -1605113416,1605113567,GB -1605113568,1605113583,IT -1605113584,1605114215,GB -1605114216,1605114223,IT -1605114224,1605114287,GB -1605114288,1605114295,IT -1605114296,1605114327,GB -1605114328,1605114335,IT -1605114336,1605115007,GB -1605115008,1605115015,IT -1605115016,1605115191,GB -1605115192,1605115199,IT -1605115200,1605115903,GB -1605115904,1605124095,RU -1605124096,1605125263,GB -1605125264,1605125275,DE -1605125276,1605125276,GB -1605125277,1605125279,DE -1605125280,1605125887,GB -1605125888,1605125919,DE -1605125920,1605126701,GB -1605126702,1605126702,US -1605126703,1605126911,GB -1605126912,1605127167,DE -1605127168,1605130239,GB -1605130240,1605130271,NL -1605130272,1605131263,GB -1605131264,1605131519,DE -1605131520,1605132287,GB -1605132288,1605148671,RU -1605148672,1605156863,PT -1605156864,1605165055,JO -1605165056,1605173247,GB -1605173248,1605181439,TR -1605181440,1605189631,LT -1605189632,1605197823,CZ -1605197824,1605206015,DE -1605206016,1605214207,RU -1605214208,1605222399,TR -1605222400,1605230591,CZ -1605230592,1605238783,TR -1605238784,1605246975,IT -1605246976,1605255167,PL -1605257216,1605259263,FR -1605259264,1605261311,DE -1605261312,1605271551,RU -1605271552,1605279743,DE -1605279744,1605287935,FR -1605287936,1605296127,RU -1605296128,1605304319,CH -1605304320,1605312511,PL -1605312512,1605320703,IL -1605320704,1605328895,KW -1605328896,1605337087,FI -1605337088,1605345279,GB -1605345280,1605353471,FR -1605353472,1605361663,GB -1605361664,1605369855,RU -1605369856,1605402623,FR -1605402624,1605435391,SI -1605435392,1605468159,GB -1605468160,1605500927,SA -1605500928,1605533695,PL -1605533696,1605566463,HR -1605566464,1605599231,RU -1605599232,1605631999,GR -1605632000,1605664767,RS -1605664768,1605697535,MK -1605697536,1605742591,RU -1605742592,1605742847,LV -1605742848,1605743103,PL -1605743104,1605744127,RU -1605744128,1605744383,UA -1605744384,1605753343,RU -1605753344,1605753471,US -1605753472,1605753855,RU -1605753856,1605754879,FR -1605754880,1605763071,RU -1605763072,1605769215,KZ -1605769216,1605771263,PL -1605771264,1605782527,RU -1605782528,1605782783,CZ -1605782784,1605795839,RU -1605795840,1605828607,BE -1605828608,1605828863,GB -1605828864,1605829631,US -1605829632,1605829887,GB -1605829888,1605830143,US -1605830144,1605830399,IL -1605830400,1605830655,US -1605830656,1605840895,RU -1605840896,1605844991,CH -1605844992,1605861375,RU -1605861376,1605894143,TR -1605894144,1606156287,SA -1606156288,1606418431,RU -1606418432,1607100682,SE -1607100683,1607100683,DE -1607100684,1607467007,SE -1607467008,1607532543,DE -1607532544,1607569407,SE -1607569408,1607573503,DK -1607573504,1607575551,SE -1607575552,1607577599,GB -1607577600,1607581695,SE -1607581696,1607598079,DK -1607598080,1607599103,GB -1607600384,1607600639,DE -1607600640,1607600895,AT -1607600896,1607601151,CH -1607601152,1607601919,IT -1607601920,1607602175,GB -1607602432,1607602687,SE -1607602688,1607602943,NO -1607602944,1607603199,DK -1607603200,1607603455,FI -1607604224,1607605247,NG -1607605248,1607606015,ZA -1607606016,1607606271,FR -1607606272,1607606783,DE -1607606784,1607607039,GB -1607607296,1607607551,PL -1607607552,1607608319,IT -1607608320,1607608575,HU -1607608576,1607608831,SK -1607610368,1607611391,GR -1607611392,1607612415,IE -1607614464,1607617535,GB -1607618560,1607621631,ES -1607621632,1607622655,IT -1607622656,1607624703,ES -1607624704,1607625727,IT -1607625728,1607625986,ES -1607625987,1607625987,PT -1607625988,1607626751,ES -1607626752,1607627519,FR -1607627520,1607627775,FI -1607627776,1607628543,IT -1607630848,1607631871,TZ -1607631872,1607632895,UG -1607634432,1607636479,IT -1607639040,1607640805,IT -1607640806,1607640806,CH -1607640807,1607642388,IT -1607642389,1607642389,NL -1607642390,1607647231,IT -1607647232,1607651327,DE -1607651328,1607655423,FR -1607655424,1607657471,GB -1607657472,1607663615,IT -1607663616,1607729151,NL -1607729152,1607745535,SY -1607745536,1607761919,EG -1607761920,1607770111,SY -1607770112,1607774207,EG -1607774208,1607786495,SY -1607786496,1607794687,EG -1607794688,1607860223,RU -1607925760,1607926783,RU -1607926784,1607927807,UA -1607927808,1607929855,RU -1607929856,1607930879,SE -1607930880,1607933951,PL -1607933952,1607934975,DE -1607934976,1607937023,UA -1607937024,1607938047,SE -1607938048,1607939071,UA -1607939072,1607940095,PL -1607940096,1607941119,RU -1607941120,1607942143,ES -1607942144,1607944191,RU -1607944192,1607945215,FR -1607945216,1607946239,PL -1607947264,1607948287,RU -1607948288,1607949311,GB -1607949312,1607950335,UA -1607950336,1607952383,RU -1607952384,1607953407,UA -1607953408,1607956479,RU -1607956480,1607957503,ES -1607957504,1607958527,UA -1607958528,1607959551,PS -1607959552,1607960575,EE -1607960576,1607961599,RU -1607962624,1607963647,UA -1607963648,1607965695,RU -1607965696,1607966719,UA -1607966720,1607967743,IR -1607967744,1607968767,UA -1607968768,1607969791,SE -1607969792,1607970047,RU -1607970048,1607970303,IR -1607970304,1607970815,GB -1607970816,1607972863,RU -1607972864,1607974911,NL -1607974912,1607976959,PL -1607976960,1607980031,RU -1607980032,1607981055,DE -1607981056,1607982079,UA -1607982080,1607982847,RO -1607982848,1607983103,UA -1607983104,1607984127,GB -1607984128,1607985151,RU -1607985152,1607986175,PL -1607986176,1607986431,FR -1607986432,1607986687,GB -1607986688,1607988223,RU -1607988224,1607989247,KG -1607989248,1607991295,RU -1607991296,1608122367,FI -1608122368,1608253439,SA -1608253440,1608384511,RU -1608384512,1608515583,DE -1608515584,1610612735,IT -1610612736,1610678271,US -1610678272,1610743807,CA -1610743808,1611006975,US -1611006976,1611007999,NL -1611008000,1611009023,US -1611009024,1611010047,NL -1611010048,1611036671,US -1611036672,1611037183,NL -1611037184,1611042815,US -1611042816,1611046911,NL -1611046912,1611084543,US -1611084544,1611085311,NL -1611085312,1611086335,US -1611086336,1611086847,NL -1611086848,1611087871,US -1611087872,1611091967,NL -1611091968,1611112447,US -1611112448,1611117567,NL -1611117568,1611218943,US -1611218944,1611227135,KH -1611227136,1611235327,CA -1611235328,1611243519,OM -1611243520,1611247615,MY -1611247616,1611247871,HK -1611247872,1611248127,AU -1611248128,1611251711,HK -1611251712,1611692543,US -1611692544,1611693567,NL -1611693568,1611764735,US -1611764736,1611764991,NL -1611764992,1611765759,US -1611765760,1611766015,NL -1611766016,1611777023,US -1611777024,1611777279,NL -1611777280,1611778047,US -1611778048,1611778559,NL -1611778560,1611923455,US -1611923456,1612185599,CA -1612185600,1612595199,US -1612595200,1612611327,TH -1612611328,1612636159,CA -1612636160,1613471743,US -1613471744,1613479935,JM -1613479936,1613480191,CA -1613480192,1613488127,US -1613488128,1613492223,CA -1613492224,1613504511,US -1613504512,1613529087,CA -1613529088,1613545471,US -1613545472,1613565951,CA -1613570048,1613584639,US -1613584640,1613584895,HK -1613584896,1613585407,US -1613585408,1613585663,DE -1613585664,1613585919,GB -1613585920,1613606911,US -1613606912,1613615103,CA -1613615104,1613635583,US -1613635584,1613640191,CA -1613640192,1613640319,US -1613640320,1613640447,CA -1613640448,1613640575,US -1613640576,1613643263,CA -1613643264,1613643391,US -1613643392,1613643775,CA -1613643776,1613676543,US -1613676544,1613680639,CA -1613680640,1613737983,US -1613737984,1613742079,CA -1613742080,1613758463,US -1613758464,1614282751,CA -1614282752,1614741503,US -1614741504,1614757887,CA -1614757888,1614774271,US -1614774272,1614786559,CA -1614786560,1618837503,US -1618837504,1618841599,CA -1618841600,1618845695,DE -1618845696,1618849791,US -1618849792,1618862079,CA -1618862080,1618866175,US -1618866176,1618870271,CA -1618870272,1618984959,US -1618984960,1619001343,CA -1619001344,1632305151,US -1632305152,1632321535,CA -1632321536,1632354303,US -1632354304,1632362495,CA -1632362496,1634414591,US -1634414592,1634418687,CA -1634418688,1634447359,US -1634447360,1634451455,CA -1634451456,1634455551,US -1634455552,1634459647,CA -1634459648,1634459903,US -1634459904,1634460671,CA -1634460672,1634467839,US -1634467840,1634729983,CA -1634729984,1652293631,US -1652293632,1652310015,CA -1652310016,1652481279,US -1652481280,1652481791,CN -1652481792,1653500927,US -1653500928,1653501103,FR -1653501104,1653501111,IN -1653501112,1653501175,FR -1653501176,1653534719,US -1653534720,1653538815,CA -1653538816,1653555199,US -1653555200,1653567487,CA -1653567488,1653571583,US -1653571584,1653575679,CA -1653575680,1653579775,US -1653583872,1653592063,US -1653592064,1653596159,CA -1653596160,1653600255,US -1653600256,1653604351,CA -1653604352,1654542335,US -1654542336,1654546431,CA -1654546432,1654550527,VG -1654550528,1654554623,US -1654554624,1654558719,CA -1654558720,1654582015,US -1654582016,1654582271,CN -1654582272,1654595583,US -1654595584,1654596095,CA -1654596096,1654648831,US -1654648832,1654652927,CA -1654652928,1666731329,US -1666731330,1666731330,FR -1666731331,1673527295,US -1673527296,1673560063,CA -1673560064,1673986047,US -1673986048,1674051583,CA -1674051584,1674575871,US -1674575872,1677721599,CA -1677721600,1677787392,US -1677787393,1677787405,CN -1677787406,1678377256,US -1678377257,1678377257,UG -1678377258,1678377258,US -1678377259,1678377259,UG -1678377260,1678377264,ZA -1678377265,1678377269,US -1678377270,1678377270,UG -1678377271,1678377271,ZA -1678377272,1678377278,US -1678377279,1678377282,UG -1678377283,1678377314,US -1678377315,1678377315,CZ -1678377316,1680479231,US -1680479232,1680480255,CA -1680480256,1680535551,US -1680535552,1680539647,CA -1680539648,1680564223,US -1680564224,1680572415,CA -1680572416,1681915903,US -1686110208,1694498815,US -1694498816,1694499839,CN -1694499840,1694500863,ID -1694500864,1694507007,JP -1694507008,1694515199,IN -1694515200,1694531583,AU -1694531584,1694564351,TW -1694564352,1694565375,CN -1694565376,1694566399,HK -1694566400,1694568447,KR -1694568448,1694572543,HK -1694572544,1694580735,KR -1694580736,1694629887,JP -1694629888,1694662655,IN -1694662656,1694670847,JP -1694670848,1694672895,BD -1694672896,1694673919,AU -1694673920,1694674943,CN -1694674944,1694679039,LK -1694679040,1694695423,AU -1694695424,1694760959,TW -1694760960,1695023103,CN -1695023104,1695547391,TW -1695547392,1697775615,CN -1697775616,1697776639,ID -1697776640,1697777663,JP -1697777664,1697779711,CN -1697779712,1697783807,ID -1697783808,1697789951,JP -1697789952,1697790975,CN -1697790976,1697791999,JP -1697792000,1697808383,PK -1697808384,1697841151,JP -1697841152,1697906687,TH -1697906688,1697972223,CN -1697972224,1697988607,VN -1697988608,1697996799,KR -1697996800,1697997823,JP -1697997824,1697998847,CN -1697998848,1698004991,JP -1698004992,1698013183,IN -1698013184,1698021375,US -1698021376,1698029567,NZ -1698029568,1698037759,PK -1698037760,1698103295,CN -1698103296,1698136063,KR -1698136064,1698160639,JP -1698160640,1698162687,CN -1698162688,1698168831,JP -1698168832,1698693119,IN -1698693120,1699611647,CN -1699611648,1699612671,JP -1699612672,1699614719,LA -1699614720,1699618815,MY -1699618816,1699627007,CN -1699627008,1699643391,SG -1699643392,1699676159,HK -1699676160,1699713023,KR -1699713024,1699713535,TW -1699713536,1699713791,MM -1699713792,1699714047,PH -1699714048,1699714815,AU -1699714816,1699715327,HK -1699715328,1699715583,KR -1699715584,1699715839,SG -1699715840,1699716351,TW -1699716352,1699716607,KR -1699716608,1699716863,AE -1699716864,1699717119,TW -1699717120,1699741695,KR -1699741696,1700793343,CN -1700793344,1700794367,VN -1700794368,1700798463,CN -1700798464,1700806655,JP -1700806656,1700823039,VN -1700823040,1700855807,CN -1700855808,1700921343,JP -1700921344,1700986879,NZ -1700986880,1701003263,VN -1701003264,1701011455,MY -1701011456,1701019647,CN -1701019648,1701052415,GU -1701052416,1701093375,NZ -1701093376,1701117951,SG -1701117952,1701134335,NC -1701134336,1701142527,CN -1701142528,1701143551,HK -1701143552,1701143807,CN -1701143808,1701144063,AU -1701144064,1701150719,CN -1701150720,1701183487,KR -1701183488,1701199871,JP -1701199872,1701208063,CN -1701208064,1701209087,JP -1701209088,1701209855,CN -1701209856,1701210111,AU -1701210112,1701216255,CN -1701216256,1701249023,JP -1701249024,1701314559,AU -1701314560,1701576703,CN -1701576704,1701707775,TH -1701707776,1701724159,JP -1701724160,1701736447,CN -1701736448,1701737471,NZ -1701737472,1701740543,CN -1701740544,1701838847,JP -1701838848,1702363135,AU -1702363136,1702821887,CN -1702821888,1702887423,SG -1702887424,1702888447,CN -1702888448,1702889471,AU -1702889472,1702903807,CN -1702903808,1702920191,ID -1702920192,1702952959,JP -1702952960,1703411711,CN -1703411712,1703673855,TW -1703673856,1703935999,JP -1703936000,1704984575,CN -1704984576,1705488383,AU -1705488384,1705489407,HK -1705489408,1705490431,SG -1705490432,1705491455,GB -1705491456,1705494527,HK -1705494528,1705497599,SG -1705497600,1705500671,GB -1705500672,1707081727,AU -1707081728,1707737087,CN -1707737088,1707802623,KR -1707802624,1707835391,JP -1707835392,1707845631,CN -1707845632,1707846655,ID -1707846656,1707851775,CN -1707851776,1707868159,JP -1707868160,1708130303,CN -1708130304,1709178879,IN -1709178880,1709834239,CN -1709834240,1709850623,SG -1709850624,1709852671,CN -1709852672,1709853695,AU -1709853696,1709867007,CN -1709867008,1709899775,AU -1709899776,1709965311,KR -1709965312,1710882815,CN -1710882816,1710948351,KR -1710948352,1710949375,CN -1710949376,1710950399,NP -1710950400,1710972671,CN -1710972672,1710972927,TW -1710972928,1711210495,CN -1711210496,1711276031,ID -1721761792,1722023935,MU -1722286080,1722810367,TN -1722896384,1722898431,TZ -1722899456,1722925055,ZA -1722925056,1722941439,ZW -1722941440,1723138047,BF -1723138048,1723195391,SD -1723195392,1723203583,CI -1723203584,1723269119,ZA -1723269120,1723334655,LR -1723334656,1723858943,EG -1724715556,1724715556,MU -1725956096,1727004671,MU -1727004672,1727266815,TN -1727266816,1727528959,CM -1727528960,1728053247,ZA -1728053248,1728120063,AU -1728120064,1728120319,SG -1728120320,1728120575,IN -1728120576,1728120831,AU -1728120832,1728121855,CN -1728121856,1728123903,HK -1728123904,1728125951,CN -1728125952,1728126975,LA -1728126976,1728132095,HK -1728132096,1728134399,AU -1728134400,1728134655,US -1728134656,1728135167,AU -1728135168,1728136191,HK -1728136192,1728137215,MY -1728137216,1728138239,CN -1728138240,1728139263,AU -1728139264,1728140287,IN -1728140288,1728141311,SG -1728141312,1728142335,CN -1728142336,1728143359,NP -1728143360,1728144383,MP -1728144384,1728145407,IN -1728145408,1728146431,MY -1728146432,1728147455,AU -1728147456,1728148479,IN -1728148480,1728149503,PH -1728149504,1728150527,JP -1728150528,1728152575,IN -1728152576,1728153599,MY -1728153600,1728154623,SG -1728154624,1728155647,JP -1728155648,1728157695,MY -1728157696,1728157951,HK -1728157952,1728158463,MY -1728158464,1728158719,NL -1728158720,1728159743,HK -1728159744,1728161791,TH -1728161792,1728162815,CN -1728162816,1728163839,SG -1728163840,1728164863,LK -1728164864,1728165887,FJ -1728165888,1728168959,AU -1728168960,1728169983,IN -1728169984,1728171007,VN -1728171008,1728172031,AU -1728172032,1728173055,VN -1728173056,1728175103,AU -1728175104,1728176127,TW -1728176128,1728177151,HK -1728177152,1728178175,AU -1728178176,1728179199,LA -1728179200,1728180223,VN -1728180224,1728181247,AU -1728181248,1728203775,JP -1728203776,1728204799,KR -1728204800,1728205823,IN -1728205824,1728206847,KR -1728206848,1728207871,SB -1728207872,1728208895,KR -1728208896,1728210943,JP -1728210944,1728211967,SG -1728211968,1728212991,CN -1728212992,1728214015,TH -1728214016,1728215039,AU -1728215040,1728216063,NZ -1728216064,1728218111,JP -1728218112,1728219135,IN -1728219136,1728220159,JP -1728220160,1728221183,NZ -1728221184,1728222207,ID -1728222208,1728224255,LK -1728224256,1728225279,CN -1728225280,1728226303,JP -1728226304,1728227327,CN -1728227328,1728230399,AU -1728230400,1728231423,SG -1728231424,1728232447,NC -1728232448,1728235519,AU -1728235520,1728239615,CN -1728239616,1728240639,TW -1728240640,1728243711,VN -1728243712,1728246783,IN -1728246784,1728254975,JP -1728254976,1728255999,MY -1728256000,1728257023,HK -1728257024,1728258047,JP -1728258048,1728259071,IN -1728259072,1728260095,KR -1728260096,1728261119,IN -1728261120,1728262143,ID -1728262144,1728264191,JP -1728264192,1728265215,ID -1728265216,1728266239,SG -1728266240,1728267263,TH -1728267264,1728268287,ID -1728268288,1728269311,MY -1728269312,1728270335,ID -1728270336,1728271359,PH -1728271360,1728286719,CN -1728286720,1728287743,AU -1728287744,1728290815,CN -1728290816,1728291839,AU -1728291840,1728292863,SG -1728292864,1728293887,PG -1728293888,1728294911,MY -1728294912,1728295935,TH -1728295936,1728299007,JP -1728299008,1728300031,TW -1728300032,1728301055,AU -1728301056,1728302079,SG -1728302080,1728303103,IN -1728303104,1728305151,ID -1728305152,1728306175,AU -1728306176,1728307199,ID -1728307200,1728308223,BD -1728308224,1728309247,IN -1728309248,1728310271,NZ -1728310272,1728310783,AU -1728310784,1728311295,US -1728311296,1728312319,MP -1728312320,1728315391,VN -1728315392,1728316415,ID -1728316416,1728317439,MY -1728317440,1728319487,JP -1728319488,1728320511,AU -1728320512,1728322559,HK -1728322560,1728323583,MY -1728323584,1728324607,JP -1728324608,1728325631,SG -1728325632,1728326655,JP -1728326656,1728327679,MY -1728327680,1728328703,KR -1728328704,1728329727,ID -1728329728,1728330751,CN -1728330752,1728331775,AU -1728331776,1728332799,BD -1728332800,1728333823,JP -1728333824,1728334847,PF -1728334848,1728335871,JP -1728336896,1728337919,AU -1728337920,1728338943,MY -1728338944,1728339967,PK -1728339968,1728340991,SG -1728340992,1728342015,AU -1728342016,1728343039,TW -1728343040,1728344063,SG -1728344064,1728344575,HK -1728344576,1728345087,SG -1728345088,1728346111,BD -1728346112,1728346367,AU -1728346368,1728346623,NZ -1728346624,1728347147,AU -1728347148,1728347148,SG -1728347149,1728347416,AU -1728347417,1728347417,SG -1728347418,1728347421,AU -1728347422,1728347422,SG -1728347423,1728348159,AU -1728348160,1728349183,VN -1728349184,1728350207,AU -1728350208,1728351231,NZ -1728351232,1728352255,MY -1728352256,1728353279,BD -1728353280,1728354303,KR -1728354304,1728355327,NZ -1728355328,1728356351,TH -1728356352,1728357375,AU -1728357376,1728358399,ID -1728358400,1728359423,CN -1728359424,1728359935,AU -1728359936,1728360447,ID -1728360448,1728362495,KR -1728362496,1728363519,CN -1728363520,1728364543,BN -1728364544,1728365567,AU -1728365568,1728366591,SG -1728366592,1728367615,JP -1728367616,1728367871,IN -1728367872,1728368127,AU -1728368128,1728368639,ID -1728368640,1728369663,IN -1728369664,1728370687,AU -1728370688,1728371711,TH -1728371712,1728372735,IN -1728372736,1728373759,CN -1728373760,1728374783,TH -1728374784,1728375039,SG -1728375040,1728375295,IN -1728375296,1728376831,AU -1728376832,1728377855,ID -1728377856,1728378623,HK -1728378624,1728378879,US -1728378880,1728380927,IN -1728380928,1728382975,PH -1728382976,1728383999,SG -1728384000,1728385023,HK -1728385024,1728386047,IN -1728386048,1728387071,JP -1728387072,1728388095,TH -1728388096,1728388351,NZ -1728388352,1728388607,AU -1728388608,1728389119,VN -1728389120,1728390143,TW -1728390144,1728391167,CN -1728391168,1728392191,JP -1728392192,1728393215,TW -1728393216,1728394239,ID -1728394240,1728396287,CN -1728396288,1728397311,PH -1728397312,1728398335,JP -1728398336,1728398847,AU -1728398848,1728399103,IN -1728399104,1728400383,NZ -1728400384,1728400895,AU -1728400896,1728401151,IN -1728401152,1728401407,HK -1728401408,1728402431,NZ -1728402432,1728403455,IN -1728403456,1728406527,AU -1728406528,1728407551,TW -1728407552,1728407807,AU -1728407808,1728408063,MY -1728408064,1728408319,AU -1728408320,1728408575,ID -1728408576,1728409599,NZ -1728409600,1728410623,IN -1728410624,1728411647,JP -1728411648,1728412671,TH -1728412672,1728413695,KH -1728413696,1728414719,KR -1728414720,1728415743,IN -1728415744,1728416767,PK -1728416768,1728417791,JP -1728417792,1728418815,KR -1728418816,1728419071,ID -1728419072,1728419327,HK -1728419328,1728419583,NP -1728419584,1728419839,SG -1728419840,1728420863,CN -1728420864,1728421887,NZ -1728421888,1728422911,JP -1728422912,1728423935,AU -1728423936,1728424959,CN -1728424960,1728425983,AF -1728425984,1728427007,JP -1728427008,1728428031,MY -1728428032,1728430079,IN -1728430080,1728431103,CN -1728431104,1728431615,AF -1728431616,1728431871,HK -1728431872,1728432127,SG -1728432128,1728433151,IN -1728433152,1728435199,VN -1728435200,1728435967,AU -1728435968,1728436223,ID -1728436224,1728437247,IN -1728437248,1728438271,HK -1728438272,1728439295,NZ -1728439296,1728439807,NP -1728439808,1728440319,KH -1728440320,1728441343,BD -1728441344,1728442367,MY -1728442368,1728443391,SG -1728443392,1728444415,IN -1728444416,1728444671,HK -1728444672,1728444927,JP -1728444928,1728445183,HK -1728445184,1728445439,JP -1728445440,1728446463,CN -1728446464,1728446975,ID -1728446976,1728447231,IN -1728447232,1728447487,AU -1728447488,1728448511,HK -1728448512,1728449535,KH -1728449536,1728450559,AU -1728450560,1728452607,JP -1728452608,1728453119,AU -1728453120,1728453631,IN -1728453632,1728454655,NZ -1728454656,1728455167,IN -1728455168,1728455423,ID -1728455424,1728455679,AU -1728455680,1728457727,ID -1728457728,1728458751,JP -1728458752,1728459775,HK -1728459776,1728460799,ID -1728460800,1728462847,JP -1728462848,1728463871,US -1728463872,1728464895,JP -1728464896,1728465919,KR -1728465920,1728466943,CN -1728466944,1728467967,KR -1728467968,1728468735,HK -1728468736,1728469247,IN -1728469248,1728469503,NZ -1728469504,1728470015,IN -1728470016,1728471039,JP -1728471040,1728472063,PH -1728472064,1728473087,KR -1728473088,1728473343,PH -1728473344,1728473599,AU -1728473600,1728474111,SG -1728474112,1728475135,CN -1728475136,1728476159,JP -1728476160,1728476415,AU -1728476416,1728476927,ID -1728476928,1728477183,IN -1728479232,1728480255,HK -1728480256,1728481279,IN -1728481280,1728483327,HK -1728483328,1728484351,NZ -1728484352,1728485375,SG -1728485376,1728486399,HK -1728486400,1728487423,IN -1728487424,1728487935,HK -1728487936,1728488191,TH -1728488192,1728488447,MY -1728488448,1728488703,IN -1728488704,1728488959,TH -1728489216,1728490495,IN -1728490496,1728491519,KR -1728491520,1728492543,HK -1728492544,1728492799,ID -1728492800,1728493055,PH -1728493056,1728493567,TH -1728493568,1728494591,IN -1728494592,1728495615,AU -1728495616,1728496639,HK -1728496640,1728497663,MY -1728497664,1728499711,ID -1728499712,1728500735,AU -1728500736,1728501247,NZ -1728501248,1728501503,ID -1728501504,1728502783,AU -1728502784,1728503807,CN -1728503808,1728504831,JP -1728504832,1728505855,CN -1728505856,1728506879,NL -1728506880,1728507903,MY -1728507904,1728508927,JP -1728508928,1728509951,MY -1728509952,1728510975,PH -1728510976,1728511999,AU -1728512000,1728512511,ID -1728512512,1728512767,SG -1728512768,1728513023,IN -1728513024,1728513279,CN -1728513280,1728514047,HK -1728514048,1728515071,SG -1728515072,1728516095,ID -1728516096,1728517119,TH -1728517120,1728518143,JP -1728518144,1728519167,KH -1728519168,1728520191,CN -1728520192,1728521215,KR -1728521216,1728523263,VN -1728523264,1728525311,AU -1728525312,1728525823,ID -1728525824,1728526335,HK -1728526336,1728527359,TH -1728527360,1728528383,PK -1728528384,1728529407,IN -1728529408,1728530431,MY -1728530432,1728531455,AU -1728531456,1728532479,PK -1728532480,1728533503,IN -1728533504,1728534527,ID -1728534528,1728535551,AU -1728535552,1728536575,JP -1728536576,1728537087,NZ -1728537088,1728537599,AU -1728537600,1728538623,GU -1728538624,1728539647,AF -1728539648,1728540671,IN -1728540672,1728541695,BD -1728541696,1728542719,JP -1728543744,1728544767,SG -1728544768,1728545791,IN -1728545792,1728546815,JP -1728546816,1728547839,AU -1728547840,1728548863,CN -1728548864,1728549119,KH -1728549120,1728549375,IN -1728549376,1728549631,PH -1728549632,1728549887,AU -1728549888,1728550911,IN -1728550912,1728551935,JP -1728551936,1728552959,SG -1728552960,1728553983,HK -1728553984,1728555007,AU -1728555008,1728556031,NZ -1728556032,1728556287,VN -1728556288,1728556543,ID -1728556544,1728557055,VN -1728557056,1728557311,ID -1728557312,1728557567,VN -1728557568,1728558079,ID -1728558080,1728559103,IN -1728559104,1728560127,ID -1728560128,1728560639,AU -1728560640,1728561151,KR -1728561152,1728562175,AU -1728562176,1728562431,VN -1728562432,1728562687,VU -1728562688,1728563199,JP -1728563200,1728564223,SG -1728564224,1728565247,IN -1728565248,1728566271,JP -1728566272,1728569343,CN -1728569344,1728569599,PH -1728569600,1728571391,ID -1728571392,1728572415,AU -1728572416,1728573439,JP -1728573440,1728574463,HK -1728574464,1728575487,KR -1728575488,1728576511,BD -1728576512,1728577535,BT -1728577536,1728580607,CN -1728580608,1728580863,ID -1728580864,1728581119,VN -1728581120,1728581631,PK -1728581632,1728582655,NZ -1728582656,1728583679,JP -1728583680,1728584703,MY -1728584704,1728585215,AU -1728585216,1728585727,SG -1728585728,1728586751,CN -1728586752,1728589823,IN -1728589824,1728590847,JP -1728590848,1728591871,CN -1728591872,1728592895,ID -1728592896,1728593151,MN -1728593152,1728593407,AU -1728593408,1728593663,IN -1728593664,1728593919,ID -1728594944,1728595967,CN -1728595968,1728596479,NZ -1728596480,1728598015,ID -1728598016,1728599039,NZ -1728599040,1728602111,JP -1728602112,1728603135,ID -1728603136,1728604159,KR -1728604160,1728605183,TW -1728605184,1728606207,CN -1728606208,1728607231,PK -1728607232,1728608255,IN -1728608256,1728608511,SG -1728608512,1728608767,BD -1728608768,1728609023,ID -1728609024,1728610303,IN -1728610304,1728611327,TH -1728611328,1728613375,AU -1728613376,1728614399,NZ -1728614400,1728615423,MY -1728615424,1728616447,IN -1728616448,1728617471,SG -1728617472,1728618495,CN -1728618496,1728619519,MY -1728619520,1728620543,IN -1728620544,1728622591,AU -1728622592,1728624639,JP -1728625664,1728626175,IN -1728626176,1728626431,JP -1728626432,1728626687,HK -1728626688,1728627711,IN -1728627712,1728628735,JP -1728628736,1728630783,CN -1728630784,1728631807,TH -1728631808,1728632319,SG -1728632320,1728632575,PK -1728632576,1728633855,IN -1728633856,1728634879,CN -1728634880,1728636159,ID -1728636160,1728636415,AU -1728636416,1728636671,KR -1728636672,1728636927,PK -1728636928,1728637951,NZ -1728637952,1728638463,AU -1728638464,1728638719,ID -1728638720,1728638975,AU -1728638976,1728639999,JP -1728640000,1728641023,ID -1728641024,1728642047,IN -1728642048,1728643071,NZ -1728643072,1728645119,VN -1728645120,1728646143,CN -1728646144,1728647167,IN -1728647168,1728648703,AU -1728648704,1728648959,ID -1728648960,1728649215,PK -1728649216,1728650239,CN -1728650240,1728651263,JP -1728651264,1728652287,KR -1728652288,1728653311,ID -1728653312,1728654335,NZ -1728654336,1728655359,ID -1728655360,1728655871,AU -1728655872,1728656127,SB -1728656128,1728656383,MY -1728656384,1728661503,AU -1728661504,1728662527,IN -1728662528,1728665599,VN -1728665600,1728666623,MN -1728666624,1728668671,JP -1728668672,1728669695,SG -1728669696,1728670207,BD -1728670208,1728670463,NZ -1728670464,1728670719,ID -1728670720,1728671743,CN -1728671744,1728672767,BD -1728672768,1728673791,TW -1728673792,1728674815,JP -1728674816,1728675839,ID -1728675840,1728676863,KR -1728676864,1728678911,BD -1728678912,1728679935,PG -1728679936,1728680959,ID -1728680960,1728681983,MY -1728681984,1728683007,CN -1728683008,1728684031,VN -1728684032,1728685055,AU -1728685056,1728686079,JP -1728686080,1728687103,AU -1728687104,1728688127,JP -1728688128,1728689151,KR -1728689152,1728689407,JP -1728689408,1728689663,BD -1728689664,1728689919,PK -1728689920,1728690175,ID -1728690176,1728691199,BD -1728691200,1728692223,KH -1728692224,1728693247,CN -1728693248,1728698367,VN -1728698368,1728699391,NZ -1728699392,1728699903,BD -1728699904,1728700415,IN -1728700416,1728700671,BD -1728700672,1728700927,IN -1728700928,1728701183,PG -1728701184,1728701439,ID -1728701440,1728702463,WS -1728702464,1728703487,IN -1728703488,1728704511,NZ -1728704512,1728705535,AU -1728705536,1728706559,HK -1728706560,1728709631,CN -1728709632,1728710655,TW -1728710656,1728710911,AU -1728710912,1728711167,IN -1728711424,1728711679,AU -1728711680,1728712703,HK -1728712704,1728713727,CN -1728713728,1728714751,MN -1728714752,1728715775,IN -1728715776,1728716799,NP -1728716800,1728717823,AU -1728717824,1728718847,JP -1728718848,1728719871,MY -1728719872,1728720895,VN -1728720896,1728721919,AU -1728721920,1728722943,BD -1728722944,1728723199,ID -1728723200,1728723455,AU -1728723456,1728726015,ID -1728727040,1728728063,AU -1728728064,1728729087,BD -1728729088,1728729599,ID -1728729600,1728730111,AU -1728730112,1728731135,CN -1728731136,1728732159,VN -1728732160,1728733183,KR -1728733184,1728734207,ID -1728734208,1728735231,SG -1728735232,1728736255,ID -1728736512,1728736767,IN -1728736768,1728737023,ID -1728737280,1728738303,JP -1728738304,1728739327,IN -1728739328,1728740351,ID -1728740352,1728740607,SG -1728740608,1728741119,AU -1728741120,1728741375,IN -1728741376,1728742399,ID -1728742400,1728743423,IN -1728743424,1728744447,ID -1728744448,1728745471,CN -1728745472,1728747519,ID -1728747520,1728748543,PH -1728748544,1728750591,MY -1728750592,1728751615,JP -1728751616,1728751871,IN -1728751872,1728752639,ID -1728752640,1728753663,HK -1728753664,1728754687,PH -1728754688,1728755711,IN -1728755712,1728756735,ID -1728756736,1728757759,IN -1728758784,1728759039,MY -1728759040,1728759807,HK -1728759808,1728760831,PH -1728760832,1728761855,TW -1728761856,1728762879,IN -1728762880,1728763903,VN -1728763904,1728764927,KR -1728764928,1728765439,SG -1728765440,1728765695,IN -1728765696,1728765951,ID -1728765952,1728766975,IN -1728766976,1728767999,TH -1728768000,1728768255,AU -1728768256,1728768511,NZ -1728768512,1728769023,IN -1728769024,1728770047,HK -1728770048,1728772095,JP -1728772096,1728773375,IN -1728773376,1728773631,ID -1728773632,1728774143,PH -1728774144,1728775167,PK -1728775168,1728776191,JP -1728776192,1728777215,AU -1728777216,1728778239,TH -1728778240,1728779263,CN -1728779264,1728779519,IN -1728779520,1728780287,ID -1728780288,1728781311,KR -1728781312,1728782335,ID -1728782336,1728783359,LK -1728783360,1728783615,HK -1728783616,1728783871,TW -1728783872,1728784383,HK -1728784384,1728785407,PH -1728785408,1728786431,KR -1728786432,1728787455,SG -1728787456,1728788479,AU -1728788480,1728789503,KR -1728789504,1728790527,PK -1728790528,1728791551,US -1728791552,1728792575,PK -1728792576,1728793087,HK -1728793088,1728793599,ID -1728793600,1728794623,AU -1728794624,1728796671,IN -1728796672,1728798719,HK -1728798720,1728799743,ID -1728799744,1728801279,HK -1728801280,1728801791,ID -1728801792,1728802815,HK -1728802816,1728803839,PH -1728803840,1728804863,IN -1728804864,1728805887,JP -1728805888,1728806911,NZ -1728806912,1728807935,KR -1728807936,1728808959,ID -1728808960,1728809983,BD -1728809984,1728810495,SG -1728810496,1728810751,AU -1728810752,1728811007,SG -1728811008,1728812031,AU -1728812032,1728812543,ID -1728812544,1728813055,SG -1728813056,1728814079,IN -1728814080,1728815103,JP -1728815104,1728815359,AU -1728815360,1728815871,PG -1728815872,1728816127,AU -1728816128,1728816383,SG -1728816384,1728817151,AU -1728817152,1728818175,CN -1728818176,1728819199,VN -1728819200,1728819711,ID -1728819712,1728819967,NZ -1728819968,1728820223,ID -1728820224,1728821247,CN -1728821248,1728821759,AU -1728821760,1728822271,ID -1728822272,1728823295,SG -1728823296,1728824319,MN -1728825344,1728826367,SG -1728826368,1728827391,AU -1728827392,1728828415,JP -1728828416,1728829439,AU -1728829440,1728830463,KH -1728830464,1728830719,PK -1728830720,1728830975,JP -1728830976,1728831487,ID -1728831488,1728832511,IN -1728832512,1728833535,HK -1728833536,1728834559,IN -1728834560,1728835583,JP -1728835584,1728836607,NZ -1728836608,1728837631,HK -1728837632,1728838655,KR -1728838656,1728839679,ID -1728839936,1728840191,IN -1728840192,1728840447,SG -1728840448,1728842751,AU -1728842752,1728843775,ID -1728843776,1728844799,JP -1728844800,1728845311,ID -1728845312,1728845567,AU -1728845568,1728845823,ID -1728845824,1728846847,IN -1728846848,1728847871,ID -1728847872,1728848895,CN -1728848896,1728849919,AU -1728849920,1728850943,PK -1728850944,1728851967,BD -1728851968,1728852991,HK -1728852992,1728854015,JP -1728854016,1728854527,AU -1728854528,1728854783,PK -1728854784,1728855039,AU -1728855040,1728855551,TH -1728855552,1728857087,MY -1728857088,1728858111,CN -1728858112,1728859135,BD -1728859136,1728860159,HK -1728860160,1728860671,ID -1728860672,1728861183,BD -1728861184,1728861439,ID -1728861440,1728862207,AU -1728862208,1728863231,PH -1728863232,1728864255,CN -1728864256,1728865279,AF -1728865280,1728866303,AU -1728866304,1728867327,VN -1728867328,1728868351,AU -1728868352,1728869375,ID -1728869376,1728870399,IN -1728870400,1728871423,PK -1728871424,1728872447,IN -1728872448,1728873471,AU -1728873472,1728874495,IN -1728874496,1728875519,CN -1728875520,1728877567,MY -1728877568,1728878591,HK -1728878592,1728879615,MY -1728879616,1728880127,IN -1728880128,1728880383,JP -1728880384,1728880639,AU -1728880640,1728881663,KH -1728881664,1728881919,ID -1728881920,1728882175,AU -1728882176,1728882431,BD -1728882432,1728882687,ID -1728882688,1728883711,IN -1728883712,1728885759,BD -1728886784,1728887807,CN -1728887808,1728888831,AU -1728888832,1728889855,IN -1728889856,1728890879,PK -1728890880,1728891903,AU -1728891904,1728892927,BD -1728892928,1728893439,BN -1728893440,1728893695,SG -1728893696,1728893951,IN -1728893952,1728894463,US -1728894464,1728894975,SG -1728894976,1728895999,HK -1728896000,1728897023,ID -1728898048,1728899071,BD -1728899072,1728900095,CN -1728900096,1728901119,BD -1728901120,1728901375,ID -1728901376,1728901631,AU -1728901632,1728902143,ID -1728902400,1728902911,IN -1728902912,1728903167,BD -1728903168,1728905215,KR -1728905216,1728905471,IN -1728905472,1728905727,PK -1728905728,1728906239,IN -1728906240,1728907263,MY -1728907264,1728908287,NZ -1728908288,1728909311,CN -1728909312,1728912383,JP -1728912384,1728913407,TH -1728913408,1728914431,MM -1728914432,1728915199,ID -1728915200,1728915455,NZ -1728915456,1728917503,JP -1728917504,1728918527,HK -1728918528,1728919551,KR -1728919552,1728920575,AU -1728920576,1728921599,JP -1728921600,1728922623,AF -1728922624,1728923647,AU -1728923648,1728924159,CN -1728924160,1728924671,MY -1728924672,1728925695,VN -1728925696,1728927743,AU -1728927744,1728928767,LA -1728928768,1728929791,JP -1728929792,1728930815,IN -1728930816,1728931839,AU -1728931840,1728933887,IN -1728933888,1728934911,US -1728934912,1728935935,NZ -1728935936,1728936959,MY -1728936960,1728937983,CN -1728937984,1728939007,SG -1728939008,1728939519,BD -1728939520,1728939775,PH -1728939776,1728940031,IN -1728941056,1728942079,JP -1728942080,1728943103,CN -1728943104,1728944127,BD -1728944128,1728945151,JP -1728945152,1728946175,BD -1728946176,1728947199,KR -1728948224,1728949247,JP -1728949248,1728950271,SG -1728950272,1728950783,HK -1728950784,1728951551,IN -1728951552,1728951807,ID -1728951808,1728952063,SG -1728952064,1728952319,IN -1728952320,1728952831,PH -1728952832,1728953343,AU -1728953344,1728954367,HK -1728955392,1728956415,CN -1728956416,1728957439,ID -1728958464,1728959487,JP -1728959488,1728960511,TH -1728960512,1728961279,AU -1728961280,1728961535,IN -1728961536,1728962559,CN -1728962560,1728963583,BD -1728963584,1728964607,TH -1728965632,1728966655,BD -1728966656,1728966911,HK -1728966912,1728967423,IN -1728967424,1728967679,HK -1728967680,1728968703,CN -1728968704,1728970751,JP -1728970752,1728971007,IN -1728971008,1728971263,AU -1728971264,1728971519,IN -1728971520,1728971775,NZ -1728971776,1728972799,AU -1728972800,1728973823,TH -1728973824,1728974847,JP -1728974848,1728976393,ID -1728976394,1728976394,AU -1728976395,1728976895,ID -1728976896,1728977151,TH -1728977152,1728977407,AU -1728977408,1728977919,BD -1728977920,1728978943,MY -1728978944,1728979967,CN -1728979968,1728980991,MN -1728980992,1728982015,AU -1728982016,1728982527,ID -1728982528,1728982783,IN -1728982784,1728985087,AU -1728986112,1728987135,PH -1728987136,1728987391,JP -1728987392,1728988159,AU -1728988160,1728988191,NZ -1728988192,1728988199,US -1728988200,1728989183,NZ -1728989184,1728989695,BD -1728989696,1728990207,ID -1728990208,1728990335,MY -1728990336,1728990463,ID -1728990464,1728990975,KR -1728990976,1728991231,SG -1728991232,1728992255,JP -1728992256,1728993279,CN -1728993280,1728994303,PG -1728994304,1728995327,AU -1728995328,1728996095,IN -1728996096,1728996351,SG -1728996352,1728997375,CN -1728997376,1728997887,DE -1728997888,1728998143,IE -1728998144,1728998399,IN -1728998400,1728998655,ID -1728998656,1728998911,BD -1728998912,1728999423,ID -1728999424,1729001471,HK -1729001472,1729003519,IN -1729003520,1729004543,BD -1729004544,1729006591,CN -1729006592,1729007615,NZ -1729007616,1729008639,HK -1729008640,1729010687,JP -1729010688,1729011711,CN -1729011712,1729012735,IN -1729012736,1729013759,TH -1729014784,1729015807,AU -1729015808,1729016831,JP -1729016832,1729017855,IN -1729017856,1729018111,MY -1729018112,1729018367,SG -1729018368,1729018879,AU -1729018880,1729019903,IN -1729019904,1729020159,ID -1729020160,1729020415,BD -1729020416,1729020671,PH -1729020672,1729020927,ID -1729020928,1729021951,IN -1729021952,1729022975,AU -1729022976,1729023999,BD -1729024000,1729025023,IN -1729025024,1729026047,SG -1729026048,1729027071,NZ -1729027072,1729027327,HK -1729027328,1729027583,AU -1729027584,1729027839,JP -1729027840,1729028095,HK -1729029120,1729029375,AU -1729029376,1729029631,ID -1729029632,1729029887,AU -1729029888,1729030143,PK -1729030144,1729031167,IN -1729031168,1729032191,SG -1729032192,1729033215,CN -1729033216,1729033727,SG -1729033728,1729034239,GB -1729034240,1729035263,KH -1729035264,1729036287,AU -1729036288,1729037311,JP -1729037312,1729039359,CN -1729040384,1729041407,CN -1729041408,1729042687,HK -1729042688,1729042943,SG -1729042944,1729044479,HK -1729044480,1729045503,JP -1729045504,1729046015,ID -1729046272,1729046527,JP -1729046528,1729047551,BD -1729047552,1729048575,AU -1729048576,1729049599,VN -1729049600,1729053695,IN -1729053696,1729054719,JP -1729054720,1729055231,AU -1729055232,1729055487,IN -1729055488,1729055743,NZ -1729055744,1729056767,JP -1729056768,1729057791,IN -1729057792,1729058815,HK -1729060864,1729061887,CN -1729061888,1729062911,SG -1729062912,1729063935,MY -1729063936,1729064959,JP -1729064960,1729065983,PG -1729065984,1729067007,JP -1729067008,1729068031,HK -1729068032,1729068287,IN -1729068288,1729068543,US -1729068544,1729069055,NZ -1729069056,1729070079,AU -1729070080,1729071103,HK -1729071104,1729072127,MY -1729072128,1729072895,BD -1729072896,1729073151,ID -1729073152,1729074175,TH -1729074176,1729075199,AU -1729075200,1729076223,NZ -1729076224,1729076735,AU -1729076736,1729076991,HK -1729076992,1729077247,IN -1729077248,1729078271,JP -1729078272,1729079295,BD -1729079296,1729080319,AU -1729080320,1729081343,ID -1729081344,1729081599,IN -1729081600,1729082111,AU -1729082112,1729082367,IN -1729082368,1729083391,HK -1729083392,1729085439,JP -1729085440,1729087487,HK -1729087488,1729088511,CN -1729088512,1729090559,AU -1729090560,1729091583,JP -1729091584,1729092607,HK -1729093632,1729094143,BD -1729094144,1729094399,ID -1729094656,1729095679,IN -1729095680,1729096703,SG -1729096704,1729097215,AU -1729097216,1729097727,AF -1729097728,1729098751,ID -1729098752,1729099775,BD -1729099776,1729100543,IN -1729100544,1729100799,ID -1729100800,1729101823,IN -1729101824,1729102847,VN -1729102848,1729103871,IN -1729103872,1729104895,JP -1729104896,1729105663,IN -1729105664,1729105919,VU -1729105920,1729106943,SG -1729106944,1729107967,NZ -1729107968,1729108479,BD -1729108480,1729108991,HK -1729108992,1729111039,IN -1729111040,1729112063,JP -1729112064,1729113087,MY -1729113088,1729114111,IN -1729114112,1729114623,ID -1729114624,1729114879,IN -1729114880,1729115135,AU -1729115136,1729116159,CN -1729116160,1729117183,IN -1729117184,1729118207,KH -1729118208,1729119231,AU -1729119232,1729120255,IN -1729120256,1729121279,BD -1729121280,1729121535,IN -1729121536,1729122303,ID -1729122304,1729125375,CN -1729125376,1729127423,AU -1729127424,1729127935,IN -1729127936,1729128447,SG -1729128448,1729129471,IN -1729129472,1729130495,CN -1729130496,1729131519,ID -1729132544,1729133567,BN -1729133568,1729134591,CN -1729134592,1729135615,AU -1729135616,1729136127,ID -1729136128,1729136639,AU -1729136640,1729137663,ID -1729137664,1729139711,IN -1729139712,1729140735,AU -1729140736,1729141759,BD -1729141760,1729142783,PG -1729142784,1729143807,JP -1729143808,1729144831,IN -1729144832,1729145855,PH -1729145856,1729146879,NZ -1729146880,1729147903,IN -1729147904,1729148415,NZ -1729148416,1729148927,MY -1729148928,1729149951,HK -1729149952,1729150975,ID -1729150976,1729151999,AU -1729152000,1729152255,IN -1729152256,1729153023,ID -1729153024,1729154047,IN -1729154048,1729155071,TH -1729155072,1729155583,IN -1729155584,1729156095,AU -1729157120,1729158143,HK -1729158144,1729158399,ID -1729158400,1729158911,IN -1729158912,1729159167,ID -1729159168,1729160191,JP -1729160192,1729161215,HK -1729161216,1729162239,ID -1729162240,1729163263,JP -1729163264,1729165311,TW -1729166336,1729166671,SG -1729166672,1729166687,PH -1729166688,1729166847,SG -1729166848,1729167359,HK -1729167360,1729168383,IN -1729169408,1729170431,TW -1729170432,1729170687,HK -1729170688,1729171199,CN -1729171200,1729171455,IN -1729171456,1729171967,AU -1729171968,1729172223,IN -1729172224,1729172479,MY -1729172480,1729173503,PH -1729173504,1729174527,BN -1729174528,1729175551,HK -1729176576,1729177599,BD -1729177600,1729178623,CN -1729178624,1729179647,NC -1729179648,1729180671,IN -1729180672,1729181695,ID -1729181696,1729182207,AU -1729182208,1729182463,ID -1729182464,1729182719,AU -1729182720,1729183743,AF -1729183744,1729184767,CN -1729184768,1729185791,BD -1729185792,1729186815,HK -1729186816,1729187327,ID -1729187328,1729187583,MY -1729187584,1729187839,ID -1729187840,1729189887,IN -1729189888,1729190911,VN -1729190912,1729191935,HK -1729191936,1729195007,IN -1729195008,1729195519,MN -1729195520,1729196031,IN -1729196032,1729197055,GU -1729197056,1729198079,HK -1729198080,1729199103,CN -1729199104,1729199615,MY -1729199616,1729199871,JP -1729199872,1729200127,TH -1729200128,1729201151,IN -1729201152,1729202175,AU -1729202176,1729203199,CN -1729203200,1729205247,SG -1729206272,1729207295,AU -1729207296,1729208319,IN -1729208320,1729209343,CN -1729209344,1729209599,ID -1729209600,1729210367,AF -1729210368,1729211391,MY -1729211392,1729212415,ID -1729212416,1729213439,JP -1729213440,1729213951,BD -1729213952,1729214463,ID -1729214464,1729216511,JP -1729216512,1729216767,ID -1729216768,1729217023,AU -1729217024,1729217535,IN -1729217536,1729217791,JP -1729217792,1729218047,VN -1729218048,1729218175,MY -1729218176,1729218303,SG -1729218304,1729218431,JP -1729218432,1729218559,KR -1729218560,1729219583,PK -1729219584,1729220607,CN -1729220608,1729221631,MY -1729221632,1729222655,KH -1729222656,1729225727,AU -1729225728,1729226751,CN -1729226752,1729227775,AU -1729227776,1729228799,VN -1729228800,1729229823,TW -1729229824,1729230847,ID -1729230848,1729231103,PH -1729231104,1729231359,TH -1729231360,1729232895,AU -1729232896,1729233919,MY -1729233920,1729234943,VN -1729234944,1729236991,PK -1729236992,1729238015,ID -1729238016,1729239039,PK -1729239040,1729240063,JP -1729240064,1729242111,ID -1729242112,1729244159,AU -1729245184,1729247231,AU -1729247232,1729247487,NZ -1729247488,1729247743,AU -1729247744,1729248255,NZ -1729248256,1729249279,JP -1729249280,1729252351,IN -1729252352,1729253375,ID -1729253376,1729254399,BD -1729254400,1729255423,AU -1729255424,1729257471,MY -1729257472,1729258495,ID -1729258496,1729259519,JP -1729259520,1729260543,IN -1729260544,1729261567,AU -1729261568,1729262591,JP -1729262592,1729262847,PK -1729262848,1729263103,ID -1729263104,1729263615,NZ -1729263616,1729264639,IN -1729264640,1729265663,AU -1729265664,1729266687,TW -1729266688,1729267711,ID -1729267712,1729268735,NZ -1729268736,1729269759,IN -1729269760,1729270783,ID -1729270784,1729271807,AU -1729271808,1729272063,IN -1729272064,1729272319,ID -1729272320,1729272831,AU -1729272832,1729273855,IN -1729273856,1729274879,AF -1729274880,1729276927,IN -1729276928,1729277951,BN -1729277952,1729278975,VN -1729278976,1729279231,BD -1729279232,1729279487,ID -1729279488,1729279999,HK -1729281024,1729281535,AU -1729281536,1729282047,ID -1729282048,1729283071,CN -1729283072,1729284095,AU -1729284096,1729285119,NZ -1729285120,1729286143,AU -1729286144,1729288191,CN -1729288192,1729289215,IN -1729289216,1729290239,ID -1729290240,1729291263,CN -1729291264,1729292287,PH -1729293312,1729294591,ID -1729294592,1729294847,AU -1729294848,1729295103,IN -1729295104,1729295359,PK -1729295360,1729296383,MY -1729296384,1729297407,IN -1729297408,1729298431,AU -1729298432,1729299455,JP -1729299456,1729299519,NZ -1729299520,1729299583,AU -1729299584,1729300479,NZ -1729300480,1729300991,SG -1729300992,1729301503,NZ -1729301504,1729302527,CN -1729302528,1729302783,PH -1729302784,1729303551,IN -1729303552,1729304575,SG -1729304576,1729305599,HK -1729306624,1729307647,PH -1729307648,1729307903,BD -1729307904,1729308159,ID -1729308160,1729308415,HK -1729308416,1729308671,IN -1729308672,1729310719,CN -1729311744,1729312767,IN -1729312768,1729313791,ID -1729313792,1729314815,AU -1729314816,1729317887,CN -1729317888,1729319423,ID -1729319424,1729319935,SG -1729319936,1729320959,US -1729320960,1729321983,IN -1729321984,1729323007,AU -1729323008,1729324031,VN -1729324032,1729325055,NZ -1729325056,1729326079,TH -1729326080,1729327103,ID -1729327104,1729328127,AU -1729328128,1729329151,JP -1729330176,1729331199,KR -1729331200,1729331711,IN -1729331712,1729332223,BD -1729332224,1729335295,IN -1729335296,1729336319,AU -1729336320,1729338367,IN -1729339392,1729340415,JP -1729340416,1729341439,VN -1729341440,1729341951,IN -1729341952,1729343487,AU -1729343488,1729346559,ID -1729346560,1729347583,HK -1729347584,1729348607,AU -1729348608,1729350655,IN -1729350656,1729352703,ID -1729352704,1729353471,IN -1729353472,1729353727,JP -1729353728,1729353983,AU -1729353984,1729354239,IN -1729354240,1729354495,AU -1729354496,1729354751,MY -1729354752,1729355775,VN -1729355776,1729356799,IN -1729356800,1729357823,ID -1729357824,1729358847,CN -1729358848,1729359871,HK -1729359872,1729360895,JP -1729360896,1729361919,AU -1729361920,1729362943,IN -1729362944,1729363967,BD -1729363968,1729364991,PK -1729364992,1729367039,JP -1729367040,1729368063,CN -1729368064,1729369343,AU -1729369344,1729369599,ID -1729369600,1729370111,AU -1729370112,1729371135,BN -1729371136,1729372159,IN -1729372160,1729373183,CN -1729373184,1729374207,JP -1729374208,1729375231,TW -1729375232,1729376255,CN -1729376256,1729376767,AU -1729376768,1729377023,SG -1729377024,1729377279,ID -1729377280,1729378303,BD -1729378304,1729378559,AU -1729378560,1729378815,IN -1729378816,1729379071,KR -1729379072,1729379327,SG -1729379328,1729380351,HK -1729380352,1729381375,IN -1729381376,1729382399,CN -1729382400,1729383423,JP -1729383424,1729384447,PG -1729384448,1729385471,KH -1729385472,1729386495,JP -1729386496,1729386751,NZ -1729386752,1729387007,BD -1729387008,1729387519,ID -1729387520,1729388543,SG -1729390592,1729391103,IN -1729391104,1729391615,ID -1729392640,1729393663,CN -1729393664,1729394687,KR -1729394688,1729395711,TH -1729395712,1729395967,NR -1729395968,1729396735,IN -1729396736,1729397759,CN -1729397760,1729398783,PK -1729398784,1729399807,NZ -1729399808,1729400831,BD -1729400832,1729402879,VN -1729402880,1729403903,MN -1729403904,1729404927,JP -1729404928,1729405951,CN -1729405952,1729406207,IN -1729406208,1729406463,HK -1729406464,1729406975,ID -1729406976,1729407999,SG -1729408000,1729409023,HK -1729409024,1729410047,TW -1729410048,1729411071,BD -1729411072,1729413119,ID -1729413120,1729414143,HK -1729414144,1729414655,ID -1729415168,1729416191,AU -1729416192,1729417215,TH -1729417216,1729418239,AU -1729418240,1729419263,IN -1729419264,1729419519,AU -1729419520,1729419775,SG -1729419776,1729420031,IN -1729420288,1729421311,HK -1729421312,1729422335,MY -1729423360,1729423871,VU -1729423872,1729424383,AU -1729424384,1729425407,HK -1729426432,1729427455,AU -1729427456,1729428479,CN -1729428480,1729430527,AU -1729431552,1729432575,HK -1729432576,1729433599,PH -1729433600,1729433855,IN -1729433856,1729434111,AU -1729434112,1729434623,IN -1729434624,1729435647,AU -1729435648,1729436671,TH -1729436672,1729437695,SG -1729437696,1729438719,MY -1729438720,1729439743,JP -1729439744,1729440767,BD -1729440768,1729441791,MY -1729441792,1729442815,AU -1729442816,1729443839,IN -1729443840,1729444351,AU -1729444352,1729444863,IN -1729444864,1729445887,TW -1729445888,1729446399,SG -1729446400,1729446911,IN -1729446912,1729447935,SG -1729447936,1729448959,BD -1729448960,1729449983,IN -1729449984,1729450495,SG -1729450496,1729451007,IN -1729451008,1729452031,ID -1729452032,1729453055,MY -1729453056,1729454079,ID -1729455104,1729457151,JP -1729457152,1729458175,AU -1729458176,1729460223,CN -1729460224,1729461247,VN -1729461248,1729462271,IN -1729462272,1729464319,AU -1729464320,1729466367,CN -1729466368,1729467391,AU -1729467392,1729468415,VN -1729468416,1729469439,MY -1729469440,1729470463,AU -1729470464,1729471487,IN -1729471488,1729472511,LK -1729472512,1729473535,PH -1729473536,1729474559,NZ -1729474560,1729475583,CN -1729475584,1729476607,MY -1729476608,1729477631,IN -1729478656,1729478911,BD -1729478912,1729479423,NZ -1729479680,1729480703,TW -1729480704,1729481727,KR -1729481728,1729482751,ID -1729482752,1729483775,CN -1729483776,1729485823,ID -1729486848,1729488383,ID -1729488384,1729488895,SB -1729488896,1729490943,IN -1729490944,1729491967,CN -1729491968,1729492223,US -1729492224,1729492479,AU -1729492480,1729492991,US -1729492992,1729494015,SB -1729494016,1729495039,MY -1729495040,1729527807,CN -1729527808,1729528831,SG -1729528832,1729530879,ID -1729530880,1729531903,IN -1729531904,1729532927,AU -1729532928,1729533951,MY -1729533952,1729534975,JP -1729534976,1729535999,TW -1729536000,1729537023,MY -1729537024,1729537791,ID -1729537792,1729538047,JP -1729538048,1729538559,ID -1729538560,1729538815,SG -1729538816,1729539071,ID -1729539072,1729540095,IN -1729540096,1729541119,AU -1729541120,1729542143,TH -1729542144,1729543167,AU -1729543168,1729544191,CN -1729544192,1729545215,IN -1729545216,1729546239,AU -1729546240,1729546495,JP -1729546496,1729546751,US -1729546752,1729547007,NZ -1729547008,1729547263,HK -1729547264,1729548287,ID -1729548288,1729549311,AU -1729549312,1729550335,TW -1729551360,1729552383,KR -1729552384,1729553407,AU -1729553408,1729554431,CN -1729554432,1729554943,ID -1729554944,1729555455,NZ -1729555456,1729556479,IN -1729556480,1729557503,ID -1729557504,1729558527,NZ -1729558528,1729559551,ID -1729559552,1729560575,CN -1729560576,1729561599,AU -1729561600,1729562623,JP -1729562624,1729563647,CN -1729563648,1729564671,JP -1729564672,1729565695,NZ -1729565696,1729566719,ID -1729566720,1729568255,IN -1729568256,1729568511,ID -1729568512,1729568767,BD -1729568768,1729569791,ID -1729569792,1729570815,AF -1729570816,1729571839,BD -1729571840,1729572863,MY -1729572864,1729573887,MN -1729573888,1729574911,NC -1729574912,1729575935,CN -1729575936,1729576959,BD -1729576960,1729577983,AU -1729577984,1729578495,HK -1729578496,1729578751,AU -1729578752,1729579007,NZ -1729579008,1729580031,JP -1729580032,1729581055,SG -1729581056,1729583103,KR -1729585152,1729586175,PH -1729586176,1729587199,ID -1729587200,1729588223,AU -1729588224,1729589247,TW -1729589248,1729590271,AU -1729590272,1729590783,ID -1729590784,1729591295,IN -1729591296,1729592319,TH -1729592320,1729593343,IN -1729593344,1729594367,JP -1729594368,1729596415,KH -1729596416,1729596671,IN -1729596672,1729596927,ID -1729596928,1729597439,NZ -1729597440,1729598463,VN -1729598464,1729599231,IN -1729599232,1729599487,ID -1729599488,1729600511,AU -1729600512,1729601535,VN -1729601536,1729603583,CN -1729603584,1729604607,HK -1729605120,1729605375,AU -1729605376,1729605631,ID -1729605632,1729606655,CN -1729606656,1729607679,ID -1729607680,1729609727,AU -1729609728,1729609983,PH -1729609984,1729609999,HK -1729610000,1729610003,JP -1729610004,1729610063,HK -1729610064,1729610071,SG -1729610072,1729610751,HK -1729611776,1729612799,ID -1729612800,1729613823,BD -1729613824,1729614847,SG -1729614848,1729615103,NZ -1729615104,1729615359,KH -1729615360,1729615615,IN -1729615616,1729615871,MY -1729615872,1729616895,AU -1729616896,1729617919,JP -1729617920,1729618943,ID -1729618944,1729619967,CN -1729619968,1729620991,ID -1729620992,1729622015,IN -1729622016,1729623295,ID -1729623296,1729623551,AU -1729623552,1729623807,TH -1729624064,1729625087,JP -1729626112,1729627135,HK -1729627136,1729628159,SG -1729628160,1729629183,KR -1729629184,1729629695,ID -1729629696,1729629951,AU -1729629952,1729630207,HK -1729630208,1729631231,PH -1729631232,1729632255,IN -1729632256,1729633279,CN -1729633280,1729634303,NZ -1729634304,1729635327,KH -1729635328,1729636351,IN -1729636352,1729637375,NZ -1729637376,1729637887,SG -1729637888,1729638143,IN -1729638144,1729638399,AU -1729638400,1729639423,ID -1729639424,1729640447,JP -1729640448,1729641471,ID -1729641472,1729642495,IN -1729642496,1729643519,AU -1729643520,1729644543,JP -1729644544,1729645823,ID -1729645824,1729646079,SG -1729646592,1729649663,IN -1729649664,1729650687,HK -1729650688,1729651711,PK -1729651712,1729652735,TW -1729652736,1729653759,ID -1729653760,1729654783,IN -1729654784,1729655807,NC -1729655808,1729656831,CN -1729656832,1729657855,AU -1729657856,1729658879,IN -1729658880,1729659903,CN -1729659904,1729660415,AU -1729660416,1729660671,MY -1729660672,1729660927,IN -1729660928,1729662975,NZ -1729662976,1729663999,CN -1729664000,1729665023,ID -1729665024,1729666047,HK -1729666048,1729667071,SG -1729667072,1729668095,JP -1729668096,1729669119,SG -1729669120,1729670143,JP -1729670144,1729671167,IN -1729671168,1729672191,CN -1729672192,1729673215,IN -1729673216,1729674239,CN -1729674240,1729675263,IN -1729675264,1729676287,JP -1729676288,1729677311,AU -1729677312,1729677439,IN -1729677440,1729677567,NL -1729677568,1729678079,IN -1729678080,1729678271,NL -1729678272,1729678335,IN -1729678336,1729679359,HK -1729679360,1729680383,AU -1729680384,1729681407,ID -1729681408,1729682431,HK -1729682432,1729683455,CN -1729683456,1729684479,HK -1729684480,1729685503,CN -1729685504,1729687551,IN -1729687552,1729688575,AU -1729688576,1729689599,VN -1729689600,1729691647,CN -1729691648,1729693695,IN -1729693696,1729694207,CN -1729694208,1729694719,IN -1729694720,1729695743,MM -1729695744,1729696767,KR -1729696768,1729702911,CN -1729702912,1729703935,IN -1729703936,1729704959,CN -1729704960,1729705215,SG -1729705216,1729705471,AU -1729705472,1729705983,ID -1729705984,1729707007,AU -1729707008,1729708031,HK -1729708032,1729710079,CN -1729710080,1729711103,HK -1729711104,1729712127,MM -1729712128,1729713151,BD -1729713152,1729714175,IN -1729714176,1729715199,JP -1729715200,1729716223,IN -1729716224,1729717247,TH -1729717248,1729718271,JP -1729718272,1729719295,HK -1729719296,1729720319,ID -1729720320,1729721343,AU -1729721344,1729722367,NZ -1729722368,1729723391,BD -1729723392,1729726463,IN -1729726464,1729727487,PK -1729727488,1729728511,KI -1729728512,1729729535,BD -1729729536,1729730559,CN -1729730560,1729731583,IN -1729731584,1729732607,CN -1729732608,1729733631,AU -1729733632,1729734655,ID -1729734656,1729736703,IN -1729736704,1729737727,PH -1729737728,1729738751,AU -1729738752,1729739775,BD -1729739776,1729740799,NZ -1729740800,1729742335,ID -1729742336,1729742847,PH -1729742848,1729743871,SG -1729743872,1729744895,IN -1729744896,1729745919,ID -1729745920,1729746943,AU -1729746944,1729747967,CN -1729748224,1729748479,AU -1729748480,1729748991,ID -1729748992,1729750015,IN -1729750016,1729750527,VU -1729750528,1729751039,IN -1729751040,1729753087,TW -1729753088,1729754111,TH -1729754112,1729755135,NZ -1729755136,1729756159,BD -1729756160,1729756671,HK -1729756672,1729757183,JP -1729757184,1729758207,CN -1729758208,1729759231,ID -1729759232,1729760255,IN -1729760256,1729761279,ID -1729761280,1729762303,NZ -1729762304,1729763327,TH -1729763328,1729764351,SG -1729765376,1729766399,JP -1729766400,1729767423,PH -1729767424,1729768447,SG -1729768448,1729769471,MY -1729769472,1729772543,IN -1729772544,1729773567,AU -1729773568,1729774591,CN -1729774592,1729775615,AU -1729775616,1729776127,IN -1729776128,1729776639,MY -1729776640,1729777663,CN -1729777664,1729779711,PK -1729779712,1729780735,AU -1729780736,1729780991,HK -1729780992,1729781247,ID -1729781248,1729781503,HK -1729781504,1729781759,TL -1729781760,1729782783,IN -1729782784,1729783551,ID -1729783552,1729783807,NZ -1729783808,1729785855,IN -1729785856,1729786879,BD -1729786880,1729787903,CN -1729787904,1729789951,HK -1729789952,1729790975,ID -1729790976,1729791999,CN -1729792000,1729793023,BD -1729793024,1729794047,IN -1729794048,1729795071,HK -1729795072,1729796095,MY -1729796096,1729797119,JP -1729797120,1729799167,CN -1729799168,1729800191,JP -1729800192,1729800703,IN -1729800704,1729801215,MY -1729801216,1729802239,AU -1729802240,1729803263,MY -1729803264,1729804287,TH -1729804288,1729805311,PK -1729806336,1729807359,MN -1729807360,1729808383,MY -1729808384,1729808895,IN -1729808896,1729809407,AU -1729809408,1729809663,IN -1729809664,1729809919,US -1729809920,1729810175,AU -1729810176,1729810431,IN -1729810432,1729812479,ID -1729812480,1729813503,IN -1729813504,1729814527,SG -1729814528,1729815551,IN -1729815552,1729816575,CN -1729816576,1729817599,IN -1729817600,1729818623,AU -1729818624,1729819647,CN -1729819648,1729820671,BD -1729820672,1729821695,MY -1729821696,1729822719,VN -1729822720,1729822975,HK -1729822976,1729823231,AU -1729823232,1729823487,IN -1729823488,1729823743,ID -1729823744,1729824767,CN -1729824768,1729825791,IN -1729825792,1729826815,CN -1729826816,1729827839,IN -1729827840,1729828863,PK -1729828864,1729829887,CN -1729829888,1729831935,AU -1729831936,1729832191,ID -1729832192,1729832447,NZ -1729832448,1729832959,AU -1729832960,1729833983,JP -1729833984,1729835007,SG -1729835008,1729836031,IN -1729836032,1729837055,NZ -1729837056,1729838079,CN -1729838080,1729840127,VN -1729840128,1729841151,JP -1729841152,1729842175,MY -1729842176,1729842334,HK -1729842335,1729842335,US -1729842336,1729843199,HK -1729843200,1729844223,JP -1729844224,1729845247,IN -1729845248,1729846271,NZ -1729846272,1729847295,AU -1729847296,1729848319,CN -1729848320,1729849343,TH -1729849344,1729850367,MY -1729850368,1729851391,HK -1729851392,1729852415,MY -1729852416,1729853439,MM -1729853440,1729853695,IN -1729853696,1729853951,NZ -1729853952,1729854463,PH -1729854464,1729855487,HK -1729855488,1729856511,KR -1729856512,1729857535,AU -1729857536,1729858559,JP -1729858560,1729859583,IN -1729859584,1729860607,PH -1729860608,1729861631,KR -1729861632,1729862655,AU -1729862656,1729863679,JP -1729863680,1729864703,AU -1729864704,1729866751,IN -1729866752,1729867775,AU -1729867776,1729869823,HK -1729869824,1729870847,JP -1729870848,1729871871,AU -1729872896,1729873919,AU -1729873920,1729874943,TH -1729874944,1729875455,MY -1729875456,1729875967,ID -1729875968,1729876991,CN -1729876992,1729878015,HK -1729878016,1729879039,NZ -1729879040,1729879295,AU -1729879296,1729879423,KR -1729879424,1729879551,JP -1729879552,1729879807,AU -1729879808,1729879935,JP -1729879936,1729880063,KR -1729880064,1729880831,AU -1729880832,1729881087,NZ -1729881088,1729881215,PH -1729881216,1729881343,TH -1729881344,1729881471,ID -1729881472,1729881599,VN -1729881600,1729881727,TH -1729881728,1729881855,PH -1729881856,1729881983,VN -1729881984,1729882111,ID -1729882112,1729883135,IN -1729883136,1729884159,VN -1729884160,1729885183,CN -1729885184,1729886207,JP -1729886208,1729887743,ID -1729887744,1729887999,JP -1729888000,1729888255,IN -1729888256,1729889279,KH -1729889280,1729891327,CN -1729891328,1729892351,ID -1729892352,1729893375,PH -1729893376,1729893631,AU -1729893632,1729894399,ID -1729894400,1729896447,JP -1729896448,1729898495,VN -1729898496,1729899519,AU -1729899520,1729900543,HK -1729900544,1729901567,AU -1729901568,1729902079,ID -1729902080,1729902591,SG -1729902592,1729903615,ID -1729903616,1729905663,KR -1729905664,1729906687,US -1729906688,1729906943,AU -1729906944,1729907199,JP -1729907200,1729907711,ID -1729907712,1729908735,HK -1729908736,1729909759,ID -1729909760,1729910783,NP -1729910784,1729911807,MY -1729911808,1729912063,AU -1729912064,1729912831,ID -1729912832,1729913855,JP -1729913856,1729914879,TH -1729914880,1729915135,ID -1729915136,1729915391,IN -1729915392,1729918975,ID -1729918976,1729919999,BD -1729920000,1729921023,TH -1729921024,1729922047,AU -1729922048,1729923071,AF -1729923072,1729924095,VN -1729924096,1729925119,IN -1729925120,1729926143,HK -1729926144,1729926655,ID -1729926656,1729928191,PK -1729928192,1729929215,IN -1729929216,1729929471,AU -1729929472,1729929727,ID -1729929728,1729929983,MY -1729929984,1729930239,ID -1729930240,1729932287,JP -1729932288,1729933311,VN -1729933312,1729934335,ID -1729934336,1729935359,IN -1729935360,1729936383,CN -1729936384,1729938431,ID -1729938432,1729939455,AU -1729939456,1729939967,TW -1729939968,1729940479,PH -1729940480,1729941503,CN -1729941504,1729942527,SG -1729942528,1729943551,CN -1729943552,1729944063,AU -1729944064,1729946623,ID -1729946624,1729949695,JP -1729949696,1729950207,IN -1729950208,1729950719,KH -1729950720,1729951743,IN -1729951744,1729951999,SG -1729952000,1729952255,JP -1729952256,1729952511,AU -1729952512,1729952767,NZ -1729952768,1729953791,IN -1729954816,1729955839,ID -1729956864,1729957887,HK -1729957888,1729958911,CN -1729958912,1729959935,PH -1729959936,1729960959,SG -1729960960,1729961215,IN -1729961472,1729961983,NZ -1729961984,1729964031,IN -1729964032,1729965055,AU -1729965056,1729966079,IN -1729966080,1729967103,JP -1729967104,1729968127,AU -1729968128,1729969151,MY -1729970176,1729971199,AU -1729971200,1729972223,JP -1729972224,1729973247,HK -1729973248,1729974271,AU -1729975296,1729976831,AU -1729976832,1729977343,MM -1729977344,1729978367,HK -1729978368,1729979391,IN -1729979392,1729980415,AU -1729980416,1729980927,BD -1729980928,1729982463,SG -1729982464,1729982719,AU -1729982720,1729982975,JP -1729982976,1729983231,SG -1729983232,1729983487,AU -1729983488,1729984511,IN -1729984512,1729985535,ID -1729985536,1729986559,BD -1729986560,1729989631,CN -1729989632,1729990655,HK -1729990656,1729991679,MN -1729991680,1729992703,ID -1729992704,1729993727,NC -1729993728,1729994751,IN -1729994752,1729995519,AU -1729995520,1729995775,PK -1729995776,1729996799,ID -1729996800,1729997311,AU -1729997312,1729997823,ID -1729997824,1729998847,AU -1729998848,1729999871,JP -1730000896,1730001919,ID -1730001920,1730002943,TH -1730002944,1730003967,AU -1730003968,1730004223,ID -1730004224,1730004479,IN -1730004480,1730004735,MY -1730004736,1730004991,MN -1730004992,1730007039,AU -1730007040,1730008063,IN -1730008064,1730009087,ID -1730009088,1730010111,AU -1730010112,1730011135,IN -1730011136,1730012159,BT -1730012160,1730013183,ID -1730013184,1730014207,IN -1730015232,1730016255,MY -1730016256,1730017279,NZ -1730017280,1730017791,IN -1730017792,1730019327,PH -1730019328,1730020351,ID -1730020352,1730021375,HK -1730022400,1730023423,IN -1730023424,1730024447,HK -1730024448,1730025471,CN -1730025472,1730026495,HK -1730026496,1730027519,BD -1730027520,1730028543,SG -1730028544,1730029567,VN -1730029568,1730030591,HK -1730030592,1730031615,TW -1730031616,1730032639,HK -1730032640,1730033663,JP -1730033664,1730034687,ID -1730035712,1730036735,IN -1730036736,1730037759,HK -1730037760,1730038783,JP -1730038784,1730039807,HK -1730039808,1730040831,IN -1730040832,1730043903,ID -1730043904,1730044927,CN -1730044928,1730045951,HK -1730046976,1730047999,KR -1730048000,1730049023,TL -1730049024,1730050047,IN -1730050048,1730050303,AU -1730050304,1730050559,SG -1730050560,1730051071,ID -1730051072,1730052095,TH -1730052096,1730054143,TW -1730054144,1730055167,AF -1730055168,1730056191,IN -1730056192,1730057215,ID -1730057216,1730058239,CN -1730058240,1730059263,IN -1730059264,1730061311,KR -1730061312,1730062335,JP -1730062336,1730062591,AU -1730062592,1730062847,BD -1730062848,1730064383,ID -1730064384,1730065407,IN -1730065408,1730066431,ID -1730066432,1730067455,AU -1730067456,1730068479,BD -1730068480,1730069503,IN -1730069504,1730070527,KH -1730070528,1730071551,CN -1730071552,1730072575,KR -1730072576,1730073343,SG -1730073344,1730073599,HK -1730073856,1730074111,MY -1730074112,1730074367,AU -1730074368,1730074623,SG -1730074624,1730075647,AU -1730075648,1730076671,ID -1730076672,1730077695,IN -1730077696,1730078719,CN -1730078720,1730079743,HK -1730079744,1730080767,CN -1730080768,1730081791,HK -1730081792,1730082815,ID -1730082816,1730083839,PW -1730083840,1730084863,IN -1730084864,1730085887,CN -1730085888,1730086399,TW -1730086400,1730086911,US -1730087936,1730088959,JP -1730088960,1730091007,HK -1730091008,1730091519,SG -1730091520,1730091775,AU -1730091776,1730092031,MY -1730092032,1730093055,AU -1730093056,1730093567,ID -1730093568,1730094079,MY -1730094080,1730095103,ID -1730096128,1730097151,ID -1730097152,1730103295,CN -1730103296,1730104319,HK -1730104320,1730105343,JP -1730105344,1730106367,PK -1730106368,1730107391,MV -1730107392,1730108415,AU -1730108416,1730109439,PK -1730109440,1730110463,HK -1730110464,1730112511,PK -1730112512,1730112767,BD -1730112768,1730113535,ID -1730113536,1730114559,AU -1730115584,1730117631,VN -1730117632,1730118655,KH -1730118656,1730119679,ID -1730119680,1730120703,HK -1730120704,1730121727,JP -1730121728,1730122751,IN -1730122752,1730123775,CN -1730123776,1730124799,BD -1730124800,1730125823,ID -1730125824,1730126847,CN -1730126848,1730127871,ID -1730127872,1730128895,CN -1730128896,1730129919,SG -1730129920,1730130943,BD -1730130944,1730131967,KR -1730131968,1730132799,HK -1730132800,1730132831,RO -1730132832,1730132991,HK -1730132992,1730134015,IN -1730134016,1730135039,JP -1730135040,1730136063,TW -1730136064,1730137087,CN -1730137088,1730138111,ID -1730138112,1730139135,BD -1730139136,1730140159,IN -1730140160,1730141183,JP -1730141184,1730142207,HK -1730142208,1730143231,ID -1730143232,1730144255,SG -1730144256,1730145279,ID -1730145280,1730146303,CN -1730146304,1730147327,HK -1730147328,1730148351,JP -1730148352,1730149375,ID -1730149376,1730150399,JP -1730150400,1730360319,CN -1730360320,1730361343,IN -1730361344,1730362367,SG -1730362368,1730363391,JP -1730363392,1730364415,VN -1730364416,1730365439,IN -1730365440,1730367487,HK -1730367488,1730368511,AU -1730368512,1730369535,HK -1730369536,1730370047,NZ -1730370048,1730370303,IN -1730370304,1730370559,JP -1730370560,1730371583,AU -1730371584,1730372607,TH -1730372608,1730373631,IN -1730373632,1730374655,CN -1730374656,1730375679,BD -1730375680,1730376191,AU -1730376704,1730377727,CN -1730377728,1730378239,IN -1730378240,1730378495,HK -1730378496,1730378751,IN -1730378752,1730379775,US -1730379776,1730380799,AU -1730380800,1730381823,IN -1730381824,1730382847,MY -1730382848,1730383359,ID -1730383360,1730383615,IN -1730383616,1730383871,MY -1730383872,1730385919,HK -1730385920,1730386943,AU -1730386944,1730387967,BD -1730387968,1730388479,CA -1730388480,1730388735,MX -1730388736,1730388991,DE -1730388992,1730389503,IN -1730389504,1730390015,AF -1730390016,1730391039,BD -1730391040,1730392063,HK -1730392064,1730393087,AU -1730393088,1730393599,SG -1730393600,1730394111,CN -1730394112,1730395135,HK -1730395136,1730396159,JP -1730396160,1730398207,IN -1730398208,1730399231,CN -1730399232,1730400255,TW -1730400256,1730402303,PK -1730402560,1730402815,IN -1730402816,1730403071,ID -1730403072,1730403327,AU -1730403328,1730404351,CN -1730404352,1730406399,AU -1730406400,1730407423,IN -1730407424,1730408447,ID -1730408448,1730410495,IN -1730410496,1730411519,SG -1730411520,1730412543,HK -1730412544,1730414591,AU -1730414592,1730415615,ID -1730415616,1730416127,AU -1730416128,1730416639,ID -1730416640,1730417663,PH -1730417664,1730418687,CN -1730418688,1730419711,BD -1730419712,1730420735,CN -1730420736,1730421759,ID -1730421760,1730422783,CN -1730422784,1730423807,ID -1730423808,1730425855,IN -1730425856,1730426879,HK -1730426880,1730429951,CN -1730429952,1730430207,ID -1730430208,1730430463,AU -1730430464,1730430719,HK -1730430720,1730430975,IN -1730430976,1730431999,CN -1730432000,1730435071,IN -1730435072,1730436095,HK -1730436096,1730437119,SG -1730437120,1730438143,CN -1730438144,1730439167,BD -1730439168,1730440191,IN -1730440192,1730441215,NL -1730441216,1730442239,HK -1730442240,1730443263,TW -1730443264,1730445311,IN -1730445312,1730445567,NZ -1730445568,1730446335,AU -1730446336,1730448383,CN -1730448384,1730449407,JP -1730449408,1730450431,VU -1730450432,1730450687,AU -1730450688,1730450943,IN -1730450944,1730451455,PH -1730451456,1730451711,AU -1730451712,1730452479,HK -1730452480,1730453503,ID -1730453504,1730476031,CN -1730476032,1730476543,AU -1730476544,1730476799,NZ -1730476800,1730477055,IN -1730477056,1730478079,AU -1730478080,1730479103,CN -1730480128,1730480639,AU -1730480640,1730481151,JP -1730481152,1730483199,CN -1730483200,1730483711,IN -1730484224,1730485247,CN -1730485248,1730487295,VN -1730487296,1730488319,TW -1730488320,1730489343,HK -1730489344,1730490367,CN -1730490368,1730491391,PH -1730491392,1730493439,CN -1730493440,1730494463,HK -1730494464,1730495487,JP -1730495488,1730496511,AU -1730496512,1730497535,CN -1730497536,1730499583,IN -1730499584,1730500607,HK -1730501632,1730502655,JP -1730503424,1730503679,AU -1730503680,1730505727,CN -1730505728,1730508799,JP -1730508800,1730509823,AU -1730509824,1730510591,CN -1730510592,1730510847,HK -1730510848,1730511871,AU -1730511872,1730512895,JP -1730512896,1730521087,CN -1730521088,1730522111,ID -1730522112,1730524159,CN -1730524160,1730525183,IN -1730526208,1730527231,CN -1730527232,1730528255,HK -1730528256,1730529279,SG -1730529280,1730529791,IN -1730530304,1730531327,NZ -1730531328,1730535423,CN -1730535424,1730536447,ID -1730536448,1730536703,AU -1730536704,1730537471,ID -1730537472,1730538495,HK -1730538496,1730540543,JP -1730540544,1730541567,ID -1730541568,1730544639,CN -1730544640,1730545919,IN -1730545920,1730546687,AU -1730546688,1730547711,IN -1730547712,1730548735,BD -1730548736,1730549247,MY -1730549248,1730549759,ID -1730549760,1730550783,KR -1730550784,1730551807,HK -1730551808,1730552831,CN -1730552832,1730553855,IN -1730553856,1730555903,CN -1730555904,1730556927,IN -1730557952,1730558975,CN -1730558976,1730559999,MY -1730560000,1730561023,HK -1730561024,1730562047,IN -1730562048,1730563071,SG -1730563072,1730564095,CN -1730564096,1730565119,HK -1730565120,1730566143,CN -1730566144,1730566655,IN -1730566656,1730567167,HK -1730567168,1730569215,CN -1730569216,1730570239,ID -1730570240,1730571263,HK -1730572288,1730573311,KH -1730573312,1730574335,CN -1730574336,1730575359,AU -1730575360,1730577407,IN -1730577408,1730578431,CN -1730578432,1730579455,VN -1730579456,1730580479,CN -1730580480,1730580735,HK -1730580736,1730580991,AU -1730580992,1730581503,TW -1730581504,1730582015,AU -1730582016,1730582271,IN -1730582272,1730582527,PH -1730582528,1730585599,HK -1730585600,1730586623,NZ -1730586624,1730587647,HK -1730587648,1730588671,PH -1730588672,1730589695,IN -1730590720,1730591743,SG -1730591744,1730591999,PH -1730592000,1730592767,IN -1730592768,1730593791,MY -1730593792,1730594815,NP -1730594816,1730596863,IN -1730597888,1730598911,PH -1730599424,1730599935,VU -1730599936,1730605055,CN -1730605056,1730607103,IN -1730608128,1730609151,CN -1730609152,1730610687,IN -1730610688,1730610943,MY -1730610944,1730611199,SG -1730611200,1730612223,IN -1730612224,1730613247,ID -1730613248,1730614271,CN -1730614272,1730615295,NZ -1730615296,1730616319,HK -1730616320,1730617343,IN -1730618368,1730619391,KR -1730619392,1730619903,TW -1730619904,1730620415,SG -1730620416,1730621439,NZ -1730621440,1730622719,ID -1730622720,1730622975,AU -1730622976,1730623231,IN -1730623232,1730623487,AU -1730623488,1730624511,HK -1730624512,1730625535,AU -1730625536,1730626559,CN -1730628608,1730629631,HK -1730629632,1730630655,PK -1730630656,1730631679,AU -1730631680,1730632703,CN -1730632704,1730634751,VN -1730634752,1730637823,CN -1730637824,1730638079,AU -1730638080,1730638335,JP -1730638336,1730638847,NZ -1730638848,1730639871,IN -1730640384,1730640895,MY -1730641920,1730643967,IN -1730643968,1730644735,AU -1730644736,1730644991,IN -1730644992,1730646015,MY -1730647040,1730649087,HK -1730649088,1730650111,IN -1730650112,1730658303,CN -1730658304,1730659327,JP -1730660352,1730669567,CN -1730669568,1730670079,IN -1730670080,1730670591,AU -1730670592,1730672639,IN -1730672640,1730673407,AU -1730673408,1730673663,IN -1730673664,1730674687,FM -1730674688,1730675711,AU -1730675712,1730677759,HK -1730677760,1730686975,CN -1730686976,1730687999,IN -1730688512,1730689023,ID -1730689024,1730692095,IN -1730692096,1730692607,ID -1730692608,1730693119,AU -1730693120,1730694143,IN -1730694144,1730695167,BD -1730695168,1730695423,IN -1730695424,1730695679,NZ -1730695680,1730696191,BD -1730696192,1730697215,HK -1730697216,1730698239,CN -1730698240,1730699263,ID -1730699264,1730700287,JP -1730700288,1730701311,CN -1730701312,1730702335,JP -1730702336,1730702591,ID -1730702592,1730702847,AU -1730702848,1730703359,HK -1730703360,1730704383,CN -1730704384,1730705407,TH -1730705408,1730706431,ID -1730706432,1730708479,JP -1730708480,1730713599,TH -1730713600,1730714623,HK -1730715648,1730716671,HK -1730716672,1730717183,PH -1730717696,1730718719,IN -1730718720,1730720767,HK -1730720768,1730723839,TH -1730723840,1730724863,CN -1730724864,1730727935,IN -1730727936,1730728959,HK -1730728960,1730729983,CN -1730729984,1730731007,JP -1730731008,1730732031,CN -1730732032,1730732287,AU -1730732288,1730732543,HK -1730732544,1730733055,BD -1730733056,1730741247,CN -1730741248,1730742271,HK -1730742272,1730742783,AF -1730742784,1730743295,IN -1730743296,1730744319,SG -1730744320,1730745343,CN -1730745344,1730752511,IN -1730752512,1730753535,HK -1730753536,1730754559,CN -1730754560,1730755071,IN -1730755072,1730755583,TH -1730755584,1730756607,JP -1730756608,1730757631,HK -1730757632,1730758655,SG -1730760704,1730761727,HK -1730761728,1730762751,TH -1730762752,1730766847,IN -1730766848,1730767871,HK -1730767872,1730768127,AU -1730768128,1730768639,ID -1730768640,1730768895,BD -1730769920,1730770943,HK -1730770944,1730771967,ID -1730771968,1730772991,HK -1730772992,1730774015,SG -1730774016,1730775039,HK -1730775040,1730776063,JP -1730776064,1730777087,CN -1730777088,1730778111,IN -1730778112,1730780159,CN -1730780160,1730781183,AU -1730781184,1730783231,CN -1730783232,1730783487,IN -1730783488,1730783743,ID -1730783744,1730783999,IN -1730784000,1730784255,ID -1730784256,1730785279,HK -1730785280,1730785535,NL -1730785536,1730786303,AU -1730786304,1730787583,HK -1730787584,1730788351,CN -1730788352,1730790399,ID -1730790400,1730791423,IN -1730791424,1730794495,ID -1730794496,1730795007,BD -1730795008,1730795519,IN -1730795520,1730796543,AU -1730796544,1730800639,CN -1730800640,1730801663,IN -1730801664,1730802687,JP -1730802688,1730803199,BD -1730803200,1730803711,ID -1730804736,1730805759,JP -1730805760,1730806783,AF -1730807808,1730808831,CN -1730808832,1730809855,HK -1730809856,1730810367,IN -1730810624,1730811903,AU -1730811904,1730814975,CN -1730814976,1730815999,HK -1730816000,1730817023,ID -1730817024,1730818047,JP -1730818048,1730818559,AU -1730818816,1730819071,IN -1730820096,1730821119,VN -1730822144,1730824191,CN -1730824192,1730825215,IN -1730825216,1730826239,CN -1730826240,1730827263,JP -1730827264,1730829311,IN -1730829312,1730831359,PH -1730831360,1730832383,HK -1730832384,1730833407,CN -1730833408,1730834431,AU -1730834432,1730834943,TW -1730834944,1730835455,IN -1730835456,1730837503,ID -1730837504,1730838527,IN -1730839552,1730840575,AU -1730840576,1730841599,PH -1730841600,1730842623,AU -1730842624,1730844671,TW -1730844672,1730845695,BD -1730845696,1730847743,IN -1730848768,1730849791,JP -1730849792,1730850815,IN -1730850816,1730851839,HK -1730851840,1730852863,CN -1730852864,1730853887,KR -1730853888,1730854143,IN -1730854144,1730854399,AU -1730854400,1730854655,NZ -1730854656,1730854911,HK -1730854912,1730856959,IN -1730857984,1730858239,AU -1730858240,1730858495,ID -1730858496,1730859007,IN -1730859008,1730860031,BN -1730860032,1730861055,HK -1730861056,1730862079,MM -1730863104,1730864127,AU -1730865152,1730866175,CN -1730866176,1730867199,AU -1730869248,1730870271,IN -1730870272,1730871807,ID -1730871808,1730873343,IN -1730873344,1730875391,HK -1730875392,1730876415,CN -1730876416,1730877439,HK -1730878464,1730879487,HK -1730879488,1730881023,IN -1730881024,1730881535,AU -1730881536,1730882559,IN -1730882560,1730883583,ID -1730883584,1730884607,TW -1730884608,1730885631,BD -1730885632,1730886655,AU -1730886656,1730887679,HK -1730887680,1730887935,KR -1730887936,1730888191,IN -1730888192,1730888703,ID -1730888704,1730889727,HK -1730889728,1730890751,AU -1730890752,1730891775,LA -1730891776,1730892799,IN -1730892800,1730893823,CN -1730893824,1730895103,AU -1730895104,1730895359,BD -1730895360,1730895871,NL -1730895872,1730898943,CN -1730898944,1730899967,MO -1730899968,1730900991,IN -1730900992,1730901247,AU -1730901248,1730901503,SG -1730901504,1730901759,DE -1730901760,1730902015,AU -1730902016,1730903039,KR -1730903040,1730904063,CN -1730904064,1730905087,ID -1730905088,1730906111,HK -1730906112,1730906367,TH -1730906368,1730907135,AU -1730907136,1730908159,JP -1730908160,1730909183,PG -1730909184,1730910207,BD -1730910208,1730911231,IN -1730911232,1730912255,NC -1730912256,1730913279,IN -1730914304,1730915327,NP -1730915328,1730916351,HK -1730916352,1730918399,AU -1730918400,1730919423,CN -1730919424,1730920447,SG -1730920448,1730922495,CN -1730922496,1730923519,IN -1730923520,1730924031,NF -1730924032,1730924543,NZ -1730924544,1730925567,CN -1730925568,1730926591,NZ -1730926592,1730927615,HK -1730927616,1730929663,CN -1730929664,1730929919,IN -1730929920,1730930175,TH -1730930176,1730930431,BD -1730930432,1730930687,IN -1730930688,1730931711,CN -1730931712,1730932735,HK -1730932736,1730933759,CN -1730933760,1730934783,HK -1730934784,1730936063,IN -1730936064,1730936831,AU -1730936832,1730937855,IN -1730937856,1730938879,SG -1730939904,1730940927,IN -1730940928,1730941439,JP -1730941440,1730941695,IN -1730941952,1730942975,HK -1730942976,1730943487,AU -1730943488,1730943999,ID -1730944000,1730945023,HK -1730945024,1730946047,AU -1730946048,1730947071,ID -1730947072,1730948095,AU -1730948096,1730948351,TH -1730948352,1730948607,NZ -1730948608,1730949119,AU -1730949120,1730951167,IN -1730951168,1730952191,CN -1730952192,1730954239,HK -1730954240,1730955263,SG -1730955264,1730956031,BD -1730956032,1730956287,NL -1730956288,1730957311,BD -1730957312,1730958335,CN -1730958336,1730959359,JP -1730959360,1730960383,CN -1730960384,1730961407,AU -1730961408,1730962431,IN -1730962432,1730962687,ID -1730962688,1730962943,AU -1730962944,1730963199,JP -1730963200,1730963455,HK -1730963456,1730964479,IN -1730964480,1730964735,MY -1730964736,1730964991,HK -1730964992,1730965503,NZ -1730965504,1730966527,SG -1730966528,1730967551,IN -1730967552,1730969599,CN -1730969600,1730970623,JP -1730970624,1730971647,CN -1730971648,1730973695,IN -1730973696,1730974719,CN -1730974720,1730974975,AU -1730974976,1730975231,ID -1730975232,1730975743,BD -1730976768,1730977791,IN -1730977792,1730978815,HK -1730978816,1730979839,NZ -1730979840,1730980863,CN -1730980864,1730981887,IN -1730981888,1730990079,CN -1730990080,1730992127,JP -1730992128,1730993151,TH -1730993152,1730993407,SG -1730993408,1730993663,IN -1730993664,1730993919,NZ -1730993920,1730994175,PK -1730994176,1730995199,CN -1730995200,1730996223,AU -1730996224,1730997247,PH -1730997248,1731018751,CN -1731018752,1731020799,HK -1731020800,1731060735,CN -1731060736,1731063807,VN -1731063808,1731064831,NZ -1731064832,1731065855,JP -1731065856,1731066879,CN -1731066880,1731067391,PH -1731067392,1731067903,AU -1731067904,1731103743,CN -1731103744,1731103871,TH -1731103872,1731103999,FR -1731104000,1731104127,KR -1731104128,1731104255,JP -1731104256,1731104511,CN -1731104512,1731104639,MY -1731104640,1731104767,SG -1731104768,1731105791,TW -1731105792,1731106815,BD -1731106816,1731115007,CN -1731115008,1731116031,HK -1731116032,1731117055,TW -1731117056,1731118847,IN -1731118848,1731119103,AU -1731119104,1731120127,IN -1731120128,1731121151,JP -1731121152,1731122175,AF -1731122176,1731123199,AU -1731123200,1731124223,PF -1731124224,1731125247,AU -1731125248,1731126271,HK -1731126272,1731127039,AU -1731127040,1731127295,NZ -1731127296,1731130367,IN -1731130368,1731132415,CN -1731132416,1731133951,AU -1731133952,1731134207,JP -1731134208,1731134463,NZ -1731134464,1731135487,CN -1731136512,1731138559,IN -1731138560,1731139583,CN -1731139584,1731140607,HK -1731140608,1731141631,SG -1731141632,1731142655,IN -1731142656,1731144703,CN -1731144704,1731145727,IN -1731145728,1731146751,CN -1731146752,1731148799,IN -1731148800,1731149055,ID -1731149056,1731149311,HK -1731149312,1731149823,US -1731149824,1731152895,IN -1731152896,1731153407,SG -1731153408,1731153919,IN -1731153920,1731154943,CN -1731154944,1731155967,TH -1731155968,1731156479,HK -1731156480,1731158015,IN -1731158016,1731159039,CN -1731159040,1731160063,JP -1731160064,1731161087,IN -1731161088,1731162111,CN -1731162112,1731163135,HK -1731163136,1731165183,CN -1731165184,1731166207,IN -1731167232,1731168255,ID -1731168256,1731170303,CN -1731170304,1731170559,AU -1731170560,1731170687,HK -1731170688,1731170815,MY -1731170816,1731171071,AU -1731171072,1731171327,HK -1731171328,1731172863,IN -1731172864,1731173119,MY -1731173120,1731173375,SG -1731173376,1731178495,IN -1731178496,1731179519,HK -1731179520,1731180543,JP -1731180544,1731181055,MM -1731181056,1731181311,IN -1731181312,1731181567,AU -1731181568,1731182591,KH -1731182592,1731183615,VN -1731183616,1731184639,IN -1731184640,1731185663,JP -1731185664,1731186687,US -1731186688,1731187711,SG -1731187712,1731188735,CN -1731188736,1731189759,IN -1731189760,1731190783,HK -1731190784,1731191807,SG -1731191808,1731192831,ID -1731192832,1731193087,SG -1731193088,1731193855,AU -1731193856,1731194879,IN -1731194880,1731196159,SG -1731196160,1731196927,AU -1731196928,1731197951,HK -1731197952,1731199999,MY -1731200000,1731201023,HK -1731201024,1731202047,NZ -1731202048,1731202303,TH -1731202304,1731202559,ID -1731202560,1731203071,AU -1731203072,1731204095,BD -1731204096,1731205119,CN -1731205120,1731205631,PK -1731205632,1731205887,HK -1731205888,1731206143,ID -1731206144,1731206655,HK -1731206656,1731206911,PH -1731206912,1731207167,JP -1731207168,1731208191,IN -1731208192,1731209215,JP -1731210240,1731211263,IN -1731211264,1731211775,HK -1731211776,1731212287,IN -1731212288,1731213311,CN -1731213312,1731218431,IN -1731218432,1731221503,VN -1731221504,1731221759,NP -1731221760,1731222015,AU -1731222016,1731222527,IN -1731222528,1731223551,CN -1731223552,1731228671,IN -1731228672,1731228927,MN -1731228928,1731229183,AU -1731229184,1731229439,NZ -1731229440,1731229695,BD -1731229696,1731230719,JP -1731230720,1731231743,IN -1731231744,1731232767,ID -1731232768,1731233791,HK -1731233792,1731234815,JP -1731234816,1731235839,HK -1731235840,1731239935,CN -1731240960,1731241983,JP -1731241984,1731243007,HK -1731243008,1731244031,SG -1731244032,1731245055,GB -1731245056,1731247103,IN -1731247104,1731249151,VN -1731249152,1731250175,IN -1731250432,1731250687,AU -1731250688,1731251199,CN -1731251200,1731252223,TH -1731252224,1731253247,AU -1731253248,1731253759,IN -1731253760,1731254271,AU -1731254272,1731262463,CN -1731262464,1731263487,JP -1731263488,1731264511,IN -1731264512,1731265535,JP -1731265536,1731266559,AU -1731266560,1731267583,HK -1731267584,1731268607,CN -1731268608,1731269631,AU -1731269632,1731270655,CN -1731270656,1731271679,MY -1731271680,1731272703,ID -1731272704,1731273727,SG -1731273728,1731273983,PH -1731273984,1731274239,ID -1731274240,1731274751,AU -1731274752,1731275775,KH -1731275776,1731276799,KR -1731276800,1731279871,IN -1731279872,1731280895,HK -1731280896,1731281919,TH -1731281920,1731282175,IN -1731282176,1731282431,PK -1731282432,1731282943,PH -1731282944,1731284991,CN -1731284992,1731286015,AU -1731286016,1731288063,JP -1731288064,1731290111,CN -1731290112,1731291135,PH -1731291136,1731291647,ID -1731291648,1731292159,AU -1731292160,1731293183,CN -1731293184,1731294207,SG -1731294208,1731296255,IN -1731296768,1731297023,HK -1731297024,1731297279,AU -1731297280,1731298303,CN -1731298304,1731299327,HK -1731299328,1731300351,PK -1731300352,1731301375,JP -1731301376,1731302143,AU -1731302144,1731302399,IN -1731302400,1731302911,TH -1731302912,1731303167,NZ -1731303168,1731303423,AU -1731303424,1731304447,IN -1731304448,1731306495,HK -1731306496,1731307519,SG -1731307520,1731308543,BD -1731308544,1731308799,NZ -1731308800,1731309567,NR -1731309568,1731311615,CN -1731311616,1731314687,ID -1731314688,1731315711,CN -1731315712,1731316735,BD -1731316736,1731316991,IN -1731316992,1731317247,NZ -1731317248,1731317503,IN -1731317504,1731317759,PG -1731317760,1731319807,HK -1731319808,1731320831,JP -1731320832,1731321855,ID -1731321856,1731322879,IN -1731322880,1731323903,ID -1731323904,1731324927,IN -1731325952,1731327487,IN -1731327488,1731327999,HK -1731328000,1731329023,CN -1731329024,1731330047,IN -1731330048,1731331071,SG -1731331072,1731332095,IN -1731332096,1731333119,HK -1731333120,1731333631,AU -1731333632,1731334143,SG -1731334144,1731335167,HK -1731336192,1731337215,ID -1731337216,1731338239,JP -1731338240,1731338751,IN -1731338752,1731339263,AU -1731339264,1731340287,CN -1731340288,1731341311,KR -1731341312,1731349503,CN -1731349504,1731351551,IN -1731351552,1731352575,JP -1731352576,1731353599,HK -1731353600,1731354623,SG -1731354624,1731355647,HK -1731355648,1731356671,AU -1731356672,1731357695,MV -1731357696,1731362815,CN -1731362816,1731363839,ID -1731363840,1731366911,CN -1731366912,1731369983,IN -1731369984,1731371007,PK -1731371008,1731372031,IN -1731372032,1731373055,MY -1731373056,1731374079,BD -1731374080,1731382271,CN -1731382272,1731383295,MN -1731383296,1731385343,IN -1731385344,1731386111,ID -1731386112,1731386367,IN -1731386368,1731394559,CN -1731394560,1731395583,HK -1731395584,1731396095,IN -1731396096,1731396607,BD -1731396608,1731397631,JP -1731397632,1731398143,IN -1731398144,1731398655,TH -1731398656,1731399679,CN -1731399680,1731400703,NP -1731400704,1731404799,IN -1731404800,1731405823,JP -1731405824,1731406079,AU -1731406080,1731406335,MY -1731406336,1731406591,AU -1731406592,1731406847,MY -1731406848,1731407871,ID -1731407872,1731408895,MY -1731408896,1731410943,IN -1731410944,1731411199,MN -1731411200,1731411455,AU -1731411456,1731411711,SG -1731411968,1731412991,TH -1731412992,1731414015,AU -1731414016,1731416063,IN -1731416064,1731417087,JP -1731418112,1731421183,IN -1731421184,1731421695,NZ -1731421696,1731421951,IN -1731421952,1731422207,ID -1731422208,1731424255,BD -1731424256,1731425279,AU -1731425280,1731426303,IN -1731427328,1731428351,KH -1731428352,1731428607,IN -1731428864,1731429119,AU -1731429120,1731429375,ID -1731429376,1731431423,IN -1731431424,1731431935,TR -1731431936,1731432191,HK -1731432192,1731432447,TR -1731432448,1731433471,HK -1731433472,1731435519,IN -1731435520,1731436031,NZ -1731436032,1731436287,ID -1731436288,1731436543,AU -1731436544,1731437567,SG -1731437568,1731438591,ID -1731438592,1731441663,KR -1731441664,1731442687,JP -1731442688,1731448831,KR -1731448832,1731449855,IN -1731449856,1731450879,JP -1731450880,1731451903,IN -1731451904,1731452159,PK -1731452160,1731452415,AU -1731452416,1731452927,IN -1731452928,1731453951,TH -1731453952,1731454975,BD -1731454976,1731457023,IN -1731457024,1731461119,KR -1731461120,1731461375,IN -1731461376,1731461631,AU -1731461632,1731462143,ID -1731462912,1731463167,ID -1731463168,1731464191,IN -1731464192,1731465215,MM -1731465216,1731466239,ID -1731466240,1731467263,JP -1731467264,1731469311,NP -1731469312,1731470335,SG -1731470336,1731471359,IN -1731471360,1731472383,CN -1731472384,1731473407,ID -1731473408,1731475455,IN -1731475456,1731476479,MY -1731476480,1731476991,ID -1731476992,1731477247,PH -1731477248,1731477503,AU -1731477504,1731479551,ID -1731479552,1731483647,CN -1731483648,1731484671,FJ -1731484672,1731485695,VN -1731485696,1731488767,CN -1731488768,1731489791,JP -1731489792,1731490559,HK -1731490560,1731490815,TW -1731490816,1731491839,AU -1731491840,1731492863,ID -1731492864,1731493887,IN -1731493888,1731495167,JP -1731495424,1731495935,BD -1731495936,1731496959,IN -1731496960,1731497983,BD -1731497984,1731499007,ID -1731499008,1731500031,JP -1731500032,1731501055,HK -1731501056,1731502079,NZ -1731502080,1731504127,CN -1731504128,1731504639,AU -1731504640,1731505151,ID -1731505152,1731507199,CN -1731507200,1731508223,IN -1731508224,1731509247,CN -1731509248,1731510271,HK -1731510272,1731510527,MY -1731510528,1731510783,AU -1731510784,1731511039,IN -1731511040,1731511295,US -1731511296,1731512319,CN -1731512320,1731513343,KR -1731513344,1731514367,NZ -1731514368,1731515391,IN -1731515392,1731515647,AU -1731515648,1731515903,ID -1731515904,1731516159,HK -1731516160,1731516415,US -1731516416,1731517439,HK -1731517440,1731519487,IN -1731519488,1731520511,MM -1731520512,1731523583,JP -1731523584,1731526655,IN -1731526656,1731527679,ID -1731527680,1731528703,CN -1731528704,1731529727,HK -1731529728,1731530751,JP -1731530752,1731531775,AF -1731531776,1731532031,ID -1731532032,1731532287,IN -1731532288,1731532799,NZ -1731532800,1731533823,AF -1731534848,1731535871,MY -1731535872,1731536895,BD -1731536896,1731537919,IN -1731537920,1731538943,PK -1731538944,1731539967,HK -1731539968,1731540991,IN -1731540992,1731542015,PH -1731542016,1731543039,IN -1731543040,1731545087,CN -1731545088,1731546111,IN -1731546112,1731547135,ID -1731547136,1731548159,IN -1731548160,1731548671,BD -1731548672,1731549183,IN -1731549184,1731550207,VN -1731550208,1731551231,CN -1731551232,1731552255,JP -1731552256,1731553279,CN -1731553280,1731555839,IN -1731555840,1731556095,KR -1731556096,1731557375,AU -1731557376,1731558399,JP -1731558400,1731564543,CN -1731564544,1731565567,NZ -1731565568,1731565600,HK -1731565601,1731565605,JP -1731565606,1731565611,HK -1731565612,1731565613,JP -1731565614,1731566079,HK -1731566080,1731566591,PH -1731567616,1731568639,CN -1731568640,1731569663,IN -1731569664,1731570687,VN -1731570688,1731571711,SG -1731571712,1731572735,PG -1731572736,1731573759,CN -1731573760,1731574271,ID -1731574272,1731574527,MY -1731574528,1731574783,AU -1731574784,1731576831,ID -1731576832,1731577087,AU -1731577088,1731577599,SG -1731577600,1731577855,HK -1731577856,1731578879,AU -1731578880,1731582975,CN -1731582976,1731583999,PH -1731584000,1731585023,HK -1731585024,1731586047,VN -1731586048,1731587071,IN -1731587072,1731588095,CN -1731588096,1731590143,IN -1731590144,1731591167,CN -1731591168,1731592191,VN -1731592192,1731593215,ID -1731593216,1731594239,HK -1731594240,1731595263,CN -1731595264,1731601407,IN -1731601408,1731603455,BD -1731603456,1731604479,HK -1731604480,1731605503,CN -1731605504,1731606527,MY -1731606528,1731607551,JP -1731607552,1731608575,CN -1731608576,1731609599,IN -1731609600,1731610623,AU -1731610624,1731611647,KR -1731613696,1731614719,PH -1731614720,1731615743,JP -1731615744,1731616767,ID -1731616768,1731620351,IN -1731620352,1731620607,MY -1731620608,1731620863,AU -1731620864,1731621887,KH -1731621888,1731625983,HK -1731625984,1731626495,AU -1731626496,1731626751,ID -1731626752,1731628543,IN -1731628544,1731628799,PH -1731628800,1731630079,IN -1731630080,1731631103,BD -1731631104,1731632127,SG -1731632128,1731633151,JP -1731633152,1731635199,CN -1731635200,1731636223,IN -1731636224,1731636479,ID -1731636480,1731637247,IN -1731638272,1731639295,IN -1731639296,1731640319,JP -1731640320,1731641343,IN -1731641344,1731642367,HK -1731642368,1731644415,IN -1731644416,1731646463,JP -1731646464,1731647487,CN -1731647488,1731648511,ID -1731648512,1731649535,IN -1731649536,1731649791,NZ -1731649792,1731650559,ID -1731650560,1731651583,CN -1731651584,1731652607,AU -1731652608,1731653119,IN -1731653120,1731653631,AU -1731653632,1731654655,CN -1731654656,1731655679,IN -1731655680,1731657727,VN -1731657728,1731658751,TH -1731658752,1731659775,JP -1731659776,1731660031,HK -1731660032,1731660287,ID -1731660288,1731660543,MY -1731660544,1731660799,SG -1731660800,1731661823,JP -1731661824,1731662847,AU -1731663872,1731665919,HK -1731665920,1731666175,AU -1731666176,1731666431,ID -1731666432,1731666687,AU -1731666688,1731666943,KR -1731666944,1731667967,ID -1731667968,1731668991,IN -1731668992,1731669786,AU -1731669787,1731669787,GS -1731669788,1731669927,AU -1731669928,1731669928,CC -1731669929,1731670015,AU -1731670016,1731671039,TL -1731671040,1731671551,AU -1731671552,1731672063,TH -1731672064,1731672575,ID -1731672576,1731672831,AU -1731672832,1731673087,TH -1731673088,1731675135,IN -1731675136,1731676159,PK -1731676160,1731677183,IN -1731677184,1731678207,AU -1731678208,1731679231,CN -1731679232,1731681279,IN -1731681280,1731682303,AU -1731682304,1731686399,IN -1731686400,1731686911,HK -1731686912,1731688447,AU -1731688448,1731689471,CN -1731689472,1731690495,SG -1731690496,1731691519,HK -1731691520,1731691775,AU -1731691776,1731692031,PK -1731692032,1731692543,AU -1731692544,1731693055,PK -1731693056,1731693311,SG -1731693312,1731693567,ID -1731693568,1731694591,TH -1731694592,1731695615,BD -1731695616,1731696639,AU -1731696640,1731697663,CN -1731697664,1731698687,JP -1731698688,1731698943,ID -1731698944,1731699199,PH -1731699200,1731699711,AU -1731699712,1731701759,IN -1731701760,1731702783,CN -1731702784,1731703295,AU -1731703552,1731703807,NZ -1731703808,1731705855,IN -1731705856,1731706879,KR -1731706880,1731708927,JP -1731708928,1731709951,HK -1731709952,1731711999,CN -1731712000,1731712255,AU -1731712256,1731713023,IN -1731713024,1731713279,ID -1731713280,1731713535,AU -1731713536,1731713791,HK -1731713792,1731714047,AU -1731714048,1731715071,ID -1731716096,1731717119,CN -1731717120,1731718143,AU -1731718144,1731720191,CN -1731720192,1731721215,IN -1731722240,1731723263,IN -1731723264,1731724287,AU -1731724288,1731725311,BD -1731725312,1731726335,CN -1731726336,1731727359,AU -1731727360,1731729407,CN -1731729408,1731730431,HK -1731730432,1731731199,IN -1731731200,1731731455,AU -1731731456,1731732479,CN -1731732480,1731734527,IN -1731734528,1731735551,HK -1731735552,1731736575,JP -1731736576,1731737599,HK -1731737600,1731739647,CN -1731739648,1731741183,IN -1731741184,1731741439,ID -1731741440,1731741695,AU -1731741696,1731743743,CN -1731743744,1731747839,IN -1731747840,1731748863,JP -1731748864,1731750911,HK -1731750912,1731751935,JP -1731751936,1731753983,HK -1731753984,1731755007,IN -1731755008,1731756031,SG -1731756032,1731757055,PH -1731757056,1731758079,JP -1731758080,1731759103,HK -1731759104,1731760127,CN -1731760128,1731761663,ID -1731761664,1731762175,AU -1731762176,1731763199,CN -1731763200,1731767295,VN -1731767296,1731767807,IN -1731767808,1731768063,KH -1731768064,1731770367,IN -1731770368,1731771391,CN -1731771392,1731772415,ID -1731772416,1731773439,HK -1731773440,1731774463,IN -1731774464,1731775487,CN -1731775488,1731776511,ID -1731776512,1731777023,BD -1731777024,1731777535,IN -1731777536,1731778559,JP -1731778560,1731779071,HK -1731779072,1731779583,JP -1731779584,1731782655,IN -1731782656,1731783679,ID -1731783680,1731788799,IN -1731788800,1731789823,AU -1731789824,1731790847,JP -1731790848,1731791871,ID -1731791872,1731792895,CN -1731792896,1731793919,IN -1731793920,1731794943,BD -1731794944,1731795967,HK -1731795968,1731796991,JP -1731796992,1731798015,AU -1731798016,1731799039,ID -1731799040,1731800063,BD -1731800064,1731802111,JP -1731802112,1731804159,CN -1731804160,1731805183,KR -1731806208,1731806463,AU -1731806464,1731807231,IN -1731807232,1731807743,SG -1731807744,1731807999,SE -1731808000,1731808255,DK -1731808256,1731809279,CN -1731809280,1731811583,IN -1731811584,1731811839,AU -1731811840,1731812095,HK -1731812096,1731812351,AU -1731812352,1731813375,MN -1731814400,1731815423,JP -1731815424,1731816447,VN -1731816448,1731817471,HK -1731817472,1731818495,VN -1731818496,1731820543,BD -1731820544,1731821567,IN -1731822592,1731823615,IN -1731823616,1731824639,CN -1731824640,1731825663,IN -1731825664,1731826687,JP -1731826688,1731827199,AU -1731827200,1731827455,IN -1731827456,1731827711,BD -1731827712,1731828735,PK -1731828736,1731829759,SG -1731829760,1731830783,IN -1731830784,1731831039,SG -1731831040,1731831807,AU -1731831808,1731832831,PK -1731832832,1731836927,IN -1731836928,1731837439,MY -1731837440,1731837951,SG -1731837952,1731838975,ID -1731838976,1731839999,CN -1731840000,1731841023,HK -1731841024,1731842047,NP -1731842048,1731843071,VN -1731843072,1731845119,IN -1731845120,1731846143,VN -1731846656,1731846911,IN -1731846912,1731847167,PH -1731847168,1731848191,HK -1731848192,1731849215,MP -1731849216,1731858431,IN -1731858432,1731859455,MY -1731859456,1731860479,FJ -1731860480,1731861503,CN -1731861504,1731862527,IN -1731862528,1731862783,AU -1731862784,1731863039,ID -1731863040,1731863551,AU -1731863552,1731871743,IN -1731871744,1731872767,JP -1731872768,1731873791,BD -1731873792,1731877887,IN -1731877888,1731878911,BD -1731878912,1731879935,IN -1731879936,1731881983,ID -1731881984,1731882495,BD -1731882496,1731882751,SG -1731882752,1731883007,ID -1731883008,1731883263,SG -1731883264,1731883519,MY -1731883520,1731891199,IN -1731891200,1731891711,NP -1731891712,1731892223,ID -1731892224,1731893247,TH -1731893248,1731895295,IN -1731895296,1731896319,ID -1731896320,1731899391,IN -1731899392,1731900415,HK -1731900416,1731900671,IN -1731900928,1731901439,CN -1731901440,1731903487,IN -1731903488,1731904511,AU -1731905536,1731908607,IN -1731908608,1731908863,AU -1731908864,1731909631,NZ -1731909632,1731911679,AU -1731911680,1731912703,KH -1731912704,1731913727,NZ -1731913728,1731913983,AU -1731913984,1731928063,IN -1731928064,1731929087,JP -1731929088,1731930111,BD -1731930112,1731933183,HK -1731933184,1731934207,LA -1731934208,1731939327,IN -1731939328,1731940351,CN -1731940352,1731942655,IN -1731942656,1731942911,JP -1731942912,1731943423,HK -1731943424,1731944258,KR -1731944259,1731944259,CH -1731944260,1731944302,KR -1731944303,1731944303,CH -1731944304,1731944447,KR -1731944448,1731945471,IN -1731945472,1731946495,CN -1731946496,1731947519,IN -1731947520,1731948543,AU -1731948544,1731953663,CN -1731953664,1731954687,IN -1731954688,1731955711,JP -1731955712,1731956735,IN -1731956736,1731957759,HK -1731957760,1731958783,CN -1731958784,1731959807,IN -1731959808,1731960831,KR -1731961856,1731962879,CN -1731962880,1731963903,BD -1731963904,1731964927,KH -1731964928,1731965951,BD -1731965952,1731966463,IN -1731966464,1731966975,AU -1731966976,1731975167,IN -1731976192,1731977215,TW -1731977216,1731979519,IN -1731979520,1731979775,BD -1731979776,1731980287,ID -1731980288,1731986431,IN -1731987456,1731987711,HK -1731987712,1731987967,ID -1731987968,1731988479,SG -1731988480,1731989503,US -1731989504,1731990527,VN -1731990528,1731990783,AU -1731990784,1731991039,IN -1731991040,1731991551,AU -1731991552,1731992575,MY -1731992576,1731993599,IN -1731993600,1731994623,CN -1731994624,1731995647,JP -1731995648,1731996671,IN -1731996672,1731997695,CN -1731997696,1731999743,IN -1731999744,1732000767,HK -1732000768,1732001791,SG -1732001792,1732002815,HK -1732002816,1732007935,IN -1732009984,1732010239,AU -1732010240,1732010495,MN -1732010496,1732010751,AU -1732010752,1732011007,NZ -1732011008,1732012287,IN -1732012288,1732013055,AU -1732013056,1732014079,HK -1732014080,1732016127,IN -1732016128,1732018175,KR -1732018176,1732019199,IN -1732019200,1732019967,AU -1732019968,1732022271,IN -1732022272,1732024319,HK -1732024320,1732025343,AU -1732025344,1732026367,IN -1732026368,1732027391,BD -1732027392,1732028415,CN -1732028416,1732029439,PH -1732029440,1732030463,BD -1732030464,1732031487,IN -1732031488,1732032511,ID -1732032512,1732032767,PH -1732032768,1732033023,TH -1732033024,1732033535,IN -1732034560,1732035583,KR -1732035584,1732036607,IN -1732036608,1732037631,AU -1732038656,1732040703,IN -1732040704,1732040959,AU -1732040960,1732041215,SG -1732041216,1732041727,IN -1732041728,1732042751,HK -1732042752,1732043775,JP -1732043776,1732044799,CN -1732044800,1732045823,HK -1732045824,1732046847,CN -1732047872,1732048895,IN -1732048896,1732049919,HK -1732049920,1732050943,PH -1732050944,1732051967,HK -1732052992,1732054015,MM -1732054016,1732055039,IN -1732056064,1732057087,HK -1732057088,1732058111,KH -1732058112,1732059135,HK -1732059136,1732060159,IN -1732060160,1732061183,HK -1732061440,1732061695,ID -1732061696,1732062207,AU -1732062208,1732064255,VN -1732064256,1732066303,IN -1732066304,1732067327,CN -1732067328,1732068607,IN -1732068608,1732068863,NZ -1732068864,1732069119,AU -1732069120,1732069375,ID -1732069376,1732074495,IN -1732074496,1732075519,KH -1732075520,1732076543,AU -1732076544,1732077567,IN -1732077568,1732078591,CN -1732078592,1732080639,IN -1732080640,1732081663,ID -1732081664,1732082687,HK -1732082688,1732083711,MY -1732083712,1732084735,AU -1732084736,1732085759,IN -1732085760,1732086783,TW -1732086784,1732087807,CN -1732087808,1732088831,HK -1732088832,1732089599,IN -1732089600,1732089855,JP -1732089856,1732092927,CN -1732092928,1732093951,IN -1732093952,1732094975,HK -1732094976,1732097023,CN -1732097024,1732098047,IN -1732098048,1732100095,CN -1732100096,1732100607,SG -1732100608,1732107263,IN -1732107264,1732108287,HK -1732108288,1732109823,AU -1732109824,1732110335,IN -1732111360,1732113407,HK -1732113408,1732114431,JP -1732114432,1732115455,ID -1732115456,1732116479,IN -1732116480,1732117503,JP -1732117504,1732118527,SG -1732118528,1732119551,VN -1732119552,1732122623,IN -1732122624,1732123647,CN -1732123648,1732124159,AU -1732124160,1732124671,PH -1732124672,1732124927,AU -1732124928,1732125183,JP -1732125184,1732125951,AU -1732125952,1732126207,SG -1732126208,1732126719,AU -1732126720,1732127743,IN -1732127744,1732128767,HK -1732128768,1732129023,SG -1732129024,1732129279,NZ -1732129280,1732129791,AU -1732129792,1732130815,CN -1732130816,1732134911,IN -1732134912,1732140031,CN -1732140032,1732141055,IN -1732141056,1732151295,CN -1732151296,1732152319,IN -1732152320,1732153855,BD -1732153856,1732154367,IN -1732155392,1732156415,PH -1732156416,1732166655,CN -1732166656,1732167167,ID -1732167168,1732167679,IN -1732167680,1732168191,AU -1732168192,1732168703,ID -1732168704,1732174847,CN -1732174848,1732175871,KR -1732175872,1732176895,PK -1732176896,1732177919,IN -1732177920,1732178943,SG -1732178944,1732179967,JP -1732179968,1732182015,IN -1732182016,1732184063,HK -1732184064,1732188671,IN -1732188672,1732188927,AU -1732188928,1732189183,WS -1732189184,1732190207,IN -1732190208,1732205567,CN -1732205568,1732206591,NZ -1732206592,1732207615,ID -1732207616,1732207871,AU -1732207872,1732208127,IN -1732208128,1732208383,PH -1732208384,1732208639,AU -1732208640,1732213759,VN -1732213760,1732215807,IN -1732215808,1732217855,HK -1732217856,1732219903,CN -1732219904,1732220927,IN -1732220928,1732221951,CN -1732221952,1732222975,BD -1732222976,1732230143,CN -1732230144,1732230399,NZ -1732230400,1732230655,AU -1732230656,1732230911,KH -1732230912,1732231167,AU -1732231168,1732236287,CN -1732236288,1732237311,VN -1732237312,1732238335,TH -1732238336,1732240383,JP -1732240384,1732241407,AU -1732241664,1732241919,ID -1732241920,1732242431,BD -1732242432,1732243455,HK -1732243456,1732249599,CN -1732249600,1732250623,SG -1732250624,1732250879,HK -1732250880,1732251135,MY -1732251136,1732251647,ID -1732251648,1732252671,SG -1732252672,1732253695,MM -1732253696,1732280319,CN -1732280320,1732281343,IN -1732281344,1732282367,JP -1732282368,1732283391,HK -1732283392,1732285439,CN -1732285440,1732286463,AU -1732286464,1732318207,CN -1732318208,1732318719,IN -1732318720,1732318975,AU -1732318976,1732322303,IN -1732322304,1732322559,SG -1732322560,1732324351,CN -1732324352,1732325375,JP -1732325376,1732337663,CN -1732337664,1732338175,ID -1732338176,1732338687,HK -1732338688,1732342783,CN -1732348928,1732349951,IN -1732349952,1732358143,CN -1732358144,1732359167,MY -1732359168,1732360191,HK -1732360192,1732361215,PH -1732361216,1732362239,MY -1732362240,1732364287,IN -1732364288,1732364799,NP -1732364800,1732365311,IN -1732365312,1732366335,GB -1732366336,1732367359,JP -1732367360,1732368383,ID -1732368384,1732369407,HK -1732369408,1732370431,BS -1732371456,1732372479,IN -1732372480,1732372991,AU -1732372992,1732373503,IN -1732373504,1732374271,ID -1732374272,1732374527,NZ -1732375552,1732376575,AU -1732376576,1732377599,US -1732377600,1732377855,AU -1732377856,1732378111,NZ -1732378112,1732378623,AU -1732378624,1732384767,IN -1732384768,1732385279,BD -1732385280,1732385791,AU -1732385792,1732386815,US -1732386816,1732387839,CN -1732387840,1732388095,HK -1732388096,1732388351,AU -1732388352,1732388607,IN -1732388608,1732388863,AU -1732388864,1732389887,CN -1732389888,1732390911,ID -1732390912,1732391935,IN -1732391936,1732392447,AU -1732392448,1732392703,IN -1732392704,1732392959,ID -1732392960,1732393983,HK -1732393984,1732395007,SG -1732395008,1732395135,CZ -1732395136,1732395263,BG -1732395264,1732395391,HU -1732395392,1732395519,RS -1732395520,1732395647,SI -1732395648,1732395775,BA -1732395776,1732395903,HR -1732395904,1732396031,SK -1732396032,1732397055,ID -1732397056,1732400639,IN -1732400640,1732400895,ID -1732400896,1732401151,IN -1732401152,1732402175,PH -1732402176,1732403199,CN -1732403200,1732404223,IN -1732404224,1732405247,HK -1732405248,1732406271,IN -1732406272,1732407295,CN -1732407296,1732410367,IN -1732410368,1732411391,NZ -1732411392,1732412415,TH -1732412416,1732413439,AU -1732413440,1732417535,IN -1732417536,1732418559,VN -1732418560,1732422143,IN -1732422144,1732422399,AU -1732422400,1732422655,JP -1732422656,1732423679,IN -1732423680,1732424703,BD -1732424704,1732424711,HK -1732424712,1732424719,CN -1732424720,1732424751,HK -1732424752,1732424755,CN -1732424756,1732424767,HK -1732424768,1732424831,CN -1732424832,1732424839,HK -1732424840,1732424847,CN -1732424848,1732424855,HK -1732424856,1732424879,CN -1732424880,1732424919,HK -1732424920,1732424927,CN -1732424928,1732424935,HK -1732424936,1732424943,CN -1732424944,1732424999,HK -1732425000,1732425015,CN -1732425016,1732425727,HK -1732425728,1732426751,KH -1732426752,1732428799,KR -1732428800,1732429823,ID -1732429824,1732430847,CN -1732430848,1732433919,IN -1732433920,1732434175,CN -1732434176,1732434943,HK -1732434944,1732435199,AU -1732435200,1732435455,IN -1732435456,1732435967,PH -1732435968,1732440063,IN -1732440064,1732447231,CN -1732447232,1732449279,IN -1732449280,1732450303,LA -1732450304,1732450815,AU -1732450816,1732451071,MV -1732451072,1732451327,IN -1732451328,1732452351,JP -1732452352,1732452863,US -1732452864,1732453375,IN -1732453376,1732454399,MY -1732468736,1732483071,CN -1732483072,1732483839,IN -1732483840,1732484095,AU -1732484096,1732485119,BD -1732486144,1732486399,AU -1732486400,1732486655,PH -1732486656,1732486911,SG -1732486912,1732487167,AU -1732487168,1732488191,SG -1732488192,1732489215,CN -1732489216,1732489471,ID -1732489472,1732489727,AU -1732489728,1732493311,IN -1732493312,1732494335,CN -1732494336,1732495359,BD -1732495360,1732495615,SG -1732495616,1732496383,US -1732496384,1732497407,TW -1732497408,1732498431,KH -1732498432,1732499455,CN -1732499456,1732499711,ID -1732499712,1732499967,IN -1732499968,1732500479,ID -1732500480,1732501503,JP -1732501504,1732502527,HK -1732502528,1732503551,PH -1732503552,1732504063,IN -1732504064,1732504575,AU -1732504576,1732505599,IN -1732505600,1732506623,ID -1732506624,1732507647,IN -1732507648,1732508671,AU -1732508672,1732509695,HK -1732509696,1732510719,ID -1732510720,1732511743,BD -1732511744,1732512767,IN -1732512768,1732513791,JP -1732513792,1732524543,IN -1732524544,1732525055,NZ -1732525056,1732527103,HK -1732527104,1732531199,VN -1732531200,1732532223,IN -1732532224,1732533247,CN -1732533248,1732533759,AU -1732533760,1732534015,SG -1732534016,1732534271,IN -1732534272,1732535295,KR -1732535296,1732536319,CN -1732536320,1732536575,BD -1732536576,1732536831,IN -1732536832,1732537087,AU -1732537088,1732537343,MN -1732537344,1732537799,AT -1732537800,1732537807,US -1732537808,1732537855,AT -1732537856,1732538111,BZ -1732538112,1732538367,LT -1732538368,1732539391,IN -1732539392,1732540415,BD -1732540416,1732541439,US -1732541440,1732541695,AU -1732541696,1732541951,SG -1732542464,1732543487,CN -1732543488,1732544511,SG -1732544512,1732545023,ID -1732545024,1732545279,TW -1732545536,1732546559,AU -1732546560,1732547583,JP -1732547584,1732549631,KR -1732549632,1732550655,PH -1732550656,1732552703,AU -1732552704,1732554751,HK -1732554752,1732555263,IN -1732555264,1732555775,AU -1732555776,1732556799,HK -1732556800,1732557823,IN -1732557824,1732558847,AU -1732558848,1732559871,CN -1732559872,1732560127,IN -1732560128,1732560639,NZ -1732560640,1732560895,IN -1732560896,1732561919,SG -1732561920,1732562431,AU -1732562432,1732562943,IN -1732562944,1732563967,AU -1732563968,1732564991,NZ -1732564992,1732566527,IN -1732566528,1732566783,AU -1732566784,1732567039,SG -1732567040,1732568063,MM -1732568064,1732569087,NZ -1732570112,1732571135,KH -1732571136,1732575231,VN -1732575232,1732575743,AU -1732575744,1732579327,IN -1732579328,1732580351,CN -1732580352,1732583167,IN -1732583168,1732583423,AU -1732583424,1732590591,IN -1732590592,1732591615,GB -1732591616,1732592639,SG -1732592640,1732593663,KH -1732593664,1732594687,AU -1732594688,1732602879,IN -1732602880,1732603135,PH -1732603136,1732603391,IN -1732603392,1732603903,PK -1732603904,1732604927,IN -1732604928,1732605951,CN -1732605952,1732606975,HK -1732606976,1732607999,NP -1732608000,1732608255,HK -1732608512,1732609023,SG -1732609024,1732610047,CN -1732610048,1732611071,HK -1732611072,1732612095,SG -1732612096,1732613119,IN -1732613120,1732614143,BD -1732614144,1732615167,CN -1732615168,1732615423,MX -1732615424,1732615551,SK -1732615552,1732615679,IE -1732615680,1732615807,FI -1732615808,1732615935,SE -1732615936,1732616191,NO -1732616192,1732617215,VG -1732617216,1732618239,AU -1732618240,1732619263,IN -1732619264,1732620287,MY -1732620288,1732621311,ID -1732621312,1732623359,IN -1732623360,1732625407,VN -1732625408,1732625663,IN -1732625664,1732625919,ID -1732625920,1732626175,AU -1732626176,1732626431,PH -1732626432,1732627455,IN -1732627456,1732628479,GB -1732628480,1732629503,MY -1732629504,1732630527,CN -1732630528,1732633599,IN -1732633600,1732634623,NZ -1732634624,1732634879,ID -1732634880,1732635135,AU -1732635136,1732635647,NZ -1732635648,1732638719,IN -1732638720,1732639743,MM -1732639744,1732640255,AU -1732640256,1732640511,PH -1732640512,1732640767,AU -1732640768,1732641791,SG -1732641792,1732642815,TH -1732642816,1732643839,CN -1732643840,1732644863,BD -1732644864,1732645887,ID -1732645888,1732646911,SG -1732646912,1732647935,NZ -1732647936,1732648959,VN -1732648960,1732653055,IN -1732653056,1732654079,US -1732654080,1732655103,TW -1732655104,1732655615,AU -1732655616,1732655871,IN -1732655872,1732656127,HK -1732656128,1732657151,IN -1732657152,1732658175,SG -1732658176,1732658431,ID -1732658432,1732658687,IN -1732658688,1732660223,AU -1732660224,1732660735,HK -1732660736,1732660991,IN -1732660992,1732661247,ID -1732661248,1732662271,IN -1732662272,1732663295,PK -1732663296,1732663807,NZ -1732663808,1732675583,IN -1732675584,1732676095,PK -1732676096,1732676351,NZ -1732676352,1732676607,IN -1732676608,1732677631,BD -1732677632,1732678655,IN -1732678656,1732679679,CN -1732679680,1732684287,IN -1732684288,1732684799,BD -1732684800,1732686847,AU -1732686848,1732687871,HK -1732687872,1732688895,CN -1732688896,1732689919,IN -1732689920,1732690943,AU -1732690944,1732695039,IN -1732695040,1732696063,HK -1732696064,1732697087,MM -1732697088,1732699135,CN -1732699136,1732700159,BD -1732700160,1732701183,AU -1732701184,1732702207,CN -1732702208,1732703231,JP -1732703232,1732704255,TH -1732704256,1732704511,IN -1732704512,1732704767,MM -1732704768,1732705279,PK -1732705280,1732707327,CN -1732707328,1732708351,AU -1732708352,1732709375,ID -1732709376,1732710143,HK -1732710144,1732710399,JP -1732710400,1732712447,IN -1732712448,1732712703,HK -1732712704,1732712959,AF -1732712960,1732713215,SG -1732713216,1732713471,AU -1732713472,1732714495,HK -1732714496,1732715519,CN -1732715520,1732716543,JP -1732716544,1732717567,BD -1732717568,1732718079,ID -1732718080,1732718591,BD -1732718592,1732719615,CN -1732719616,1732720639,IN -1732720640,1732720895,NL -1732720896,1732721151,MV -1732721152,1732721407,MY -1732721408,1732721663,AF -1732721664,1732723711,IN -1732723712,1732725759,CN -1732725760,1732726783,IN -1732726784,1732729855,CN -1732729856,1732730879,PH -1732730880,1732737023,IN -1732737024,1732740095,CN -1732740096,1732741119,SG -1732741120,1732742143,KR -1732742144,1732743167,TW -1732743168,1732744191,CN -1732744192,1732746239,HK -1732746240,1732747263,JP -1732747264,1732748287,ID -1732748288,1732750847,IN -1732750848,1732751359,NL -1732751360,1732752383,HK -1732752384,1732754431,VN -1732754432,1732754687,AU -1732754688,1732754943,IN -1732754944,1732755455,ID -1732755456,1732756479,IN -1732756480,1732758527,CN -1732758528,1732758783,FJ -1732758784,1732759039,IN -1732759040,1732759551,AU -1732759552,1732762623,IN -1732762624,1732763647,NZ -1732763648,1732764671,ID -1732764672,1732765695,HK -1732765696,1732766719,CN -1732766720,1732767743,HK -1732767744,1732768255,ID -1732768256,1732768767,NP -1732768768,1732769791,SG -1732769792,1732770815,MM -1732770816,1732771327,HK -1732771328,1732771583,SG -1732771584,1732771839,ID -1732771840,1732772863,PK -1732772864,1732773119,SG -1732773120,1732773375,HK -1732773376,1732774911,IN -1732774912,1732786175,CN -1732786176,1732791295,IN -1732791296,1732792319,BD -1732792320,1732793343,US -1732793344,1732794367,PK -1732794368,1732794623,AU -1732794624,1732794879,HK -1732794880,1732795391,VU -1732795392,1732796415,MY -1732796416,1732797439,VN -1732797440,1732799487,IN -1732799488,1732799743,AU -1732799744,1732799999,BD -1732800000,1732800511,ID -1732800512,1732806655,CN -1732806656,1732808703,IN -1732808704,1732809727,CN -1732809728,1732809983,US -1732809984,1732810751,CN -1732810752,1732811775,HK -1732811776,1732812799,IN -1732812800,1732813311,HK -1732813312,1732813823,MY -1732813824,1732814847,HK -1732814848,1732815871,IN -1732815872,1732816895,CN -1732816896,1732817919,IN -1732817920,1732818943,CN -1732818944,1732819967,AU -1732819968,1732820991,PH -1732820992,1732821247,SG -1732821248,1732823039,IN -1732823040,1732824063,AU -1732824064,1732825087,IN -1732825088,1732825599,NZ -1732825600,1732826111,AU -1732826112,1732829183,IN -1732829184,1732845567,CN -1732845568,1732846591,IN -1732846592,1732847615,BD -1732847616,1732848639,AU -1732848640,1732849663,BD -1732849664,1732850687,CN -1732850688,1732851967,BD -1732851968,1732852223,AU -1732852224,1732852479,PH -1732852480,1732852735,AU -1732852736,1732853759,ID -1732853760,1732854271,AU -1732854272,1732854783,HK -1732854784,1732855807,PH -1732855808,1732857855,ID -1732857856,1732858367,KI -1732858368,1732859903,AU -1732859904,1732860927,CN -1732860928,1732861951,IN -1732861952,1732862975,CN -1732862976,1732863999,PK -1732864000,1732865023,BD -1732865024,1732867071,AU -1732867072,1732869119,CN -1732869120,1732869375,AU -1732869376,1732869631,ID -1732869632,1732869887,AU -1732869888,1732870143,IN -1732870144,1732875263,CN -1732875264,1732877567,IN -1732877568,1732877823,US -1732877824,1732878335,IN -1732878336,1732879359,HK -1732879360,1732880383,KH -1732880384,1732881407,CN -1732881408,1732882431,IN -1732882432,1732883455,CN -1732883456,1732884479,IN -1732885504,1732887039,IN -1732887040,1732887551,HK -1732887552,1732888575,BD -1732888576,1732889599,AU -1732889600,1732891647,CN -1732891648,1732894719,IN -1732894720,1732895743,BD -1732895744,1732896767,NZ -1732896768,1732897279,SG -1732897280,1732897535,PK -1732897536,1732897791,ID -1732897792,1732898815,MM -1732898816,1732901887,CN -1732901888,1732902911,US -1732902912,1732903935,KR -1732903936,1732904191,IN -1732904192,1732904447,AU -1732904448,1732904959,ID -1732904960,1732905983,IN -1732905984,1732906495,ID -1732906496,1732907007,NP -1732907008,1732908031,IN -1732908032,1732909055,PK -1732909056,1732916223,CN -1732916224,1732916735,HK -1732916736,1732917247,IN -1732917248,1732919295,CN -1732919296,1732919807,IN -1732919808,1732920319,AU -1732920320,1732922367,IN -1732922368,1732923391,NL -1732923392,1732924415,CN -1732924416,1732925439,BD -1732925440,1732928511,IN -1732928512,1732930559,VN -1732930560,1732931583,IN -1732931584,1732934655,VN -1732934656,1732935679,CN -1732935680,1732936703,HK -1732936704,1732937727,BD -1732937728,1732939263,IN -1732939264,1732939519,AU -1732939520,1732939775,ID -1732939776,1732940799,IN -1732940800,1732943871,CN -1732943872,1732944895,JP -1732944896,1732945919,ID -1732945920,1732946175,AU -1732946176,1732946431,IN -1732946432,1732946687,ID -1732946688,1732946943,AU -1732946944,1732947967,HK -1732947968,1732948991,BD -1732948992,1732950015,IN -1732950016,1732952063,AU -1732952064,1732953087,HK -1732953088,1732954111,IN -1732954112,1732954367,PK -1732954368,1732954879,LT -1732954880,1732955135,NZ -1732955136,1732956159,CN -1732956160,1732957183,NZ -1732957184,1732957695,ID -1732957696,1732958207,IN -1732958208,1732959231,AU -1732959232,1732960511,IN -1732960768,1732961023,AU -1732961024,1732961279,IN -1732961280,1732962303,BD -1732962304,1732963327,CN -1732963328,1732964351,IN -1732964352,1732965375,AU -1732965376,1732966399,IN -1732966400,1732967423,HK -1732967424,1732968447,TH -1732968448,1732969471,HK -1732969472,1732970495,AU -1732970496,1732971519,IN -1732971520,1732972543,HK -1732972544,1732973567,CN -1732973568,1732974079,VU -1732974080,1732974335,PH -1732974336,1732974591,AU -1732974592,1732975615,ID -1732975616,1732979711,IN -1732979712,1732980735,HK -1732980736,1732981247,NP -1732981248,1732982783,ID -1732982784,1732989951,IN -1732989952,1732993023,CN -1732993024,1732995071,ID -1732995072,1732998143,CN -1732998144,1732998399,AU -1732998400,1732998655,HK -1732998656,1732998911,JP -1732998912,1732999167,NZ -1732999168,1733000191,CN -1733000192,1733001215,IN -1733001216,1733002239,CN -1733002240,1733003263,AU -1733003264,1733004287,PH -1733004288,1733005311,IN -1733005312,1733006335,CN -1733006336,1733006847,NP -1733006848,1733007103,ID -1733007104,1733007359,SG -1733007360,1733008383,CN -1733008384,1733011455,IN -1733011456,1733012479,ID -1733012480,1733013247,IN -1733013248,1733013503,SG -1733013504,1733016575,VN -1733016576,1733017599,MY -1733017600,1733019647,IN -1733019648,1733020159,TH -1733020160,1733020415,AU -1733020416,1733020671,IN -1733020672,1733021695,AU -1733021696,1733022719,ID -1733022720,1733023743,JP -1733023744,1733024767,SG -1733024768,1733025791,BD -1733025792,1733026815,IN -1733026816,1733027839,MY -1733027840,1733028863,ID -1733028864,1733029119,CN -1733029120,1733029375,ID -1733029376,1733029887,BD -1733029888,1733030911,HK -1733030912,1733031935,PK -1733031936,1733032959,IN -1733032960,1733033983,JP -1733033984,1733034495,IN -1733034496,1733034751,MV -1733034752,1733035007,PK -1733035008,1733037055,IN -1733037056,1733041151,ID -1733041152,1733041663,PK -1733041664,1733041919,SG -1733041920,1733042175,NC -1733042176,1733043199,HK -1733043200,1733044223,SG -1733044224,1733045247,AU -1733045248,1733046271,BD -1733046272,1733046783,AU -1733046784,1733047039,ID -1733047040,1733047295,AU -1733047296,1733049343,IN -1733049344,1733053439,CN -1733053440,1733055487,IN -1733055488,1733055999,HK -1733056000,1733056511,CN -1733056512,1733057023,MY -1733057024,1733057279,AU -1733057280,1733057535,IN -1733057536,1733058559,CN -1733058560,1733060607,IN -1733060608,1733061631,US -1733061632,1733062655,IN -1733062656,1733063679,HK -1733063680,1733064703,TH -1733064704,1733065727,IN -1733065728,1733065983,SG -1733065984,1733066751,AU -1733066752,1733067775,IN -1733067776,1733068799,ID -1733068800,1733070847,IN -1733070848,1733071871,NZ -1733071872,1733072895,ID -1733072896,1733073919,BD -1733073920,1733074175,AU -1733074176,1733074431,FJ -1733074432,1733074943,AU -1733074944,1733075455,PH -1733075456,1733076479,AU -1733076480,1733076991,IN -1733076992,1733079039,ID -1733079040,1733079807,AU -1733079808,1733080063,MM -1733080064,1733081087,TH -1733081088,1733081599,MM -1733081600,1733084159,IN -1733084160,1733085183,BD -1733085184,1733086463,ID -1733086464,1733086719,NZ -1733086720,1733089279,IN -1733089280,1733092351,CN -1733092352,1733094399,IN -1733094400,1733096447,BD -1733096448,1733097215,AU -1733097216,1733097471,NZ -1733097472,1733100543,IN -1733100544,1733101055,NZ -1733101056,1733101311,PH -1733101312,1733101567,AU -1733101568,1733102591,PK -1733102592,1733102847,NZ -1733102848,1733103103,AU -1733103104,1733103615,IN -1733103616,1733104639,BD -1733104640,1733105663,IN -1733105664,1733106175,PG -1733106176,1733106687,IN -1733106688,1733107711,CN -1733107712,1733111807,IN -1733111808,1733112831,ID -1733112832,1733114879,CN -1733114880,1733115903,BD -1733115904,1733116927,LK -1733116928,1733117951,AU -1733117952,1733118975,CN -1733118976,1733119999,ID -1733120000,1733120255,AU -1733120256,1733120511,IN -1733120512,1733121023,TH -1733121024,1733122047,KR -1733122048,1733124095,CN -1733124096,1733125119,IN -1733125120,1733126143,BD -1733126144,1733127167,ID -1733127168,1733128191,IN -1733128192,1733128447,SG -1733128448,1733128703,AU -1733128704,1733128959,IN -1733128960,1733129215,AU -1733129216,1733130239,TH -1733130240,1733131263,AU -1733131264,1733132287,IN -1733132288,1733132543,AU -1733132544,1733132799,PH -1733132800,1733133311,SG -1733133312,1733134335,CN -1733134336,1733135359,IN -1733135360,1733136383,SG -1733136384,1733137407,AU -1733137408,1733138431,CN -1733138432,1733139455,IN -1733139456,1733140479,ID -1733140480,1733143551,VN -1733143552,1733146623,IN -1733146624,1733146879,HK -1733146880,1733147135,ID -1733147136,1733147647,IN -1733147648,1733148671,BD -1733148672,1733149695,HK -1733149696,1733150207,IN -1733150208,1733150975,AU -1733150976,1733151231,MM -1733151232,1733151743,AU -1733151744,1733152767,ID -1733152768,1733155839,IN -1733155840,1733156863,CN -1733156864,1733157119,AU -1733157120,1733157375,FJ -1733157376,1733157887,ID -1733157888,1733158911,IN -1733158912,1733159935,AU -1733159936,1733163007,IN -1733163008,1733164031,ID -1733164032,1733164543,BD -1733164544,1733167103,IN -1733167104,1733168127,ID -1733168128,1733171199,IN -1733171200,1733172223,ID -1733172224,1733173247,IN -1733173248,1733174271,MY -1733174272,1733175295,ID -1733175296,1733176319,HK -1733176320,1733176831,ID -1733176832,1733177087,IN -1733177088,1733177855,MY -1733177856,1733178111,AU -1733178112,1733178367,US -1733178368,1733179391,BD -1733179392,1733183487,CN -1733183488,1733184511,ID -1733184512,1733185535,VN -1733185536,1733186559,ID -1733186560,1733189631,VN -1733189632,1733192447,ID -1733192448,1733192703,IN -1733192704,1733193215,AU -1733193216,1733193471,ID -1733193472,1733193727,BT -1733193728,1733194751,ID -1733194752,1733195263,BT -1733195264,1733195775,JP -1733195776,1733196799,US -1733196800,1733197823,CN -1733197824,1733198847,KH -1733198848,1733199359,KR -1733199360,1733199871,PK -1733199872,1733200127,AU -1733200128,1733200383,IN -1733200384,1733202943,ID -1733202944,1733204223,IN -1733204224,1733204479,AU -1733204480,1733204991,IN -1733204992,1733205503,AU -1733205504,1733205759,TH -1733205760,1733206015,IN -1733206016,1733207039,BD -1733207040,1733209087,IN -1733209088,1733211135,CN -1733211136,1733212415,IN -1733212416,1733212671,AU -1733212672,1733213183,IN -1733213184,1733214207,BD -1733214208,1733214719,ID -1733214720,1733214975,AU -1733214976,1733215231,ID -1733215232,1733216255,CN -1733216256,1733218303,IN -1733218304,1733221375,ID -1733221376,1733221631,AU -1733221632,1733221887,IN -1733221888,1733222399,PH -1733222400,1733223423,BD -1733223424,1733224447,CN -1733224448,1733225471,ID -1733225472,1733226751,IN -1733226752,1733227007,AU -1733227008,1733227519,MY -1733227520,1733228543,IN -1733228544,1733230591,BD -1733230592,1733231615,IN -1733231616,1733232639,AU -1733232640,1733233663,IN -1733233664,1733234687,JP -1733234688,1733235711,PK -1733235712,1733235967,AU -1733235968,1733236223,IN -1733236224,1733236479,AU -1733236480,1733236735,NZ -1733236736,1733238783,CN -1733238784,1733239807,IN -1733239808,1733242879,CN -1733242880,1733243903,JP -1733243904,1733249023,CN -1733249024,1733249279,AU -1733249280,1733249791,IN -1733249792,1733250047,AU -1733250048,1733251071,US -1733251072,1733253119,CN -1733253120,1733253631,AU -1733253632,1733254143,ID -1733254144,1733255167,SG -1733255168,1733255423,ID -1733255424,1733255679,IN -1733255680,1733256191,ID -1733256192,1733257215,IN -1733257216,1733258751,AU -1733258752,1733259263,PH -1733259264,1733260543,IN -1733260544,1733261055,BD -1733261056,1733261311,IN -1733261312,1733262335,CN -1733262336,1733263359,AU -1733263360,1733264383,TH -1733264384,1733265407,KR -1733265408,1733266431,CN -1733266432,1733268479,VN -1733268480,1733269503,SG -1733269504,1733270527,ID -1733270528,1733271295,IN -1733271296,1733271551,AU -1733271552,1733274623,IN -1733274624,1733275647,AU -1733275648,1733276671,HK -1733276672,1733277183,AU -1733277184,1733277695,BD -1733277696,1733278719,HK -1733278720,1733285887,CN -1733285888,1733286911,BD -1733286912,1733287935,IN -1733287936,1733288959,BD -1733288960,1733289471,IN -1733289472,1733289727,NZ -1733289728,1733289983,AU -1733289984,1733292031,IN -1733292032,1733293055,CN -1733293056,1733296127,IN -1733296128,1733297151,BD -1733297152,1733298175,JP -1733298176,1733299199,HK -1733299200,1733300223,IN -1733300224,1733301247,HK -1733301248,1733301759,AU -1733301760,1733302271,IN -1733302272,1733304319,CN -1733304320,1733305343,IN -1733305344,1733306367,MM -1733306368,1733307391,AU -1733307392,1733308415,CN -1733308416,1733309439,TH -1733309440,1733309695,IN -1733309696,1733309951,AU -1733309952,1733313791,IN -1733313792,1733314047,SG -1733314048,1733314559,BD -1733314560,1733315583,CN -1733315584,1733315839,NZ -1733315840,1733316095,ID -1733316096,1733316351,AU -1733316352,1733316607,IN -1733316608,1733317631,ID -1733317632,1733318655,ES -1733318656,1733321727,ID -1733321728,1733322239,TH -1733322240,1733322751,AU -1733322752,1733323775,JP -1733323776,1733324799,BT -1733324800,1733326847,IN -1733326848,1733327871,AU -1733327872,1733328895,HK -1733328896,1733329151,AU -1733329152,1733329407,TH -1733329408,1733329919,IN -1733329920,1733330943,HK -1733330944,1733331967,AU -1733331968,1733332991,PH -1733332992,1733334015,HK -1733334016,1733338111,IN -1733338112,1733338367,AU -1733338368,1733338623,ID -1733338624,1733339135,IN -1733339136,1733340159,HK -1733340160,1733341183,IN -1733341184,1733344255,CN -1733344256,1733345279,ID -1733345280,1733346303,CN -1733346304,1733347327,IN -1733347328,1733348351,CN -1733348352,1733349375,JP -1733349376,1733349631,NZ -1733349632,1733349887,AU -1733349888,1733350399,MN -1733350400,1733351423,CN -1733351424,1733352447,TH -1733352448,1733353471,HK -1733353472,1733354495,BD -1733354496,1733355519,AU -1733355520,1733356543,CN -1733356544,1733358591,ID -1733358592,1733359615,AU -1733359616,1733360383,IN -1733360384,1733360639,AU -1733360640,1733361151,HK -1733361152,1733361663,AU -1733361664,1733362687,IN -1733362688,1733364735,CN -1733364736,1733365759,IN -1733365760,1733367807,CN -1733367808,1733371903,IN -1733371904,1733372927,AU -1733372928,1733374975,CN -1733374976,1733375743,AU -1733375744,1733377023,IN -1733377024,1733379071,ID -1733379072,1733380095,BD -1733380096,1733381119,JP -1733381120,1733381375,AU -1733381376,1733382143,IN -1733382144,1733384191,VN -1733384192,1733386239,IN -1733386240,1733387263,CN -1733387264,1733387775,ID -1733387776,1733388031,AU -1733388032,1733388287,IN -1733388288,1733388799,BD -1733388800,1733390591,IN -1733390592,1733391359,MM -1733391360,1733392383,IN -1733392384,1733393407,CN -1733393408,1733394431,AU -1733394432,1733395455,SG -1733395456,1733396479,ID -1733396480,1733396735,NP -1733396736,1733396991,IN -1733396992,1733397247,ID -1733397248,1733397503,IN -1733397504,1733399551,JP -1733399552,1733400575,CN -1733400576,1733402879,IN -1733402880,1733403135,AU -1733403136,1733403391,MY -1733403392,1733403647,SG -1733403648,1733405695,CN -1733405696,1733406719,BD -1733406720,1733407743,JP -1733407744,1733407999,NZ -1733408000,1733408511,IN -1733408512,1733408767,CN -1733408768,1733409023,HK -1733409024,1733409279,TW -1733409280,1733409535,SG -1733409536,1733409791,CN -1733409792,1733411327,IN -1733411328,1733411839,ID -1733411840,1733412863,BD -1733412864,1733413887,CN -1733413888,1733414911,BD -1733414912,1733416959,IN -1733416960,1733417471,AU -1733417472,1733417727,ID -1733417728,1733417983,AU -1733417984,1733419007,ID -1733419008,1733420031,NZ -1733420032,1733420287,SG -1733420288,1733421055,IN -1733421056,1733422079,CN -1733422080,1733424127,IN -1733424128,1733424383,AU -1733424384,1733424639,IN -1733424640,1733424895,ID -1733424896,1733425151,US -1733425152,1733425663,ID -1733425664,1733427199,IN -1733427200,1733428223,GB -1733428224,1733428735,US -1733428736,1733429247,ID -1733429248,1733430271,BD -1733430272,1733431295,ID -1733431296,1733432319,HK -1733432320,1733437439,VN -1733437440,1733438975,IN -1733438976,1733439487,PH -1733439488,1733440511,IN -1733440512,1733441535,CN -1733441536,1733442559,LA -1733442560,1733443583,CN -1733443584,1733444095,GB -1733444096,1733444607,IN -1733444608,1733445631,CN -1733445632,1733448703,IN -1733448704,1733449727,CN -1733449728,1733450751,JP -1733450752,1733453823,IN -1733453824,1733454847,CN -1733454848,1733455871,AU -1733455872,1733456895,JP -1733456896,1733457919,PH -1733457920,1733458943,PK -1733458944,1733459199,AU -1733459200,1733459455,IN -1733459456,1733459967,ID -1733459968,1733460991,GB -1733460992,1733462015,VN -1733462016,1733463039,AU -1733463040,1733464063,HK -1733464064,1733466111,IN -1733466112,1733467135,AU -1733467136,1733469183,IN -1733469184,1733469439,ID -1733469440,1733469695,TH -1733469696,1733470207,ID -1733470208,1733471231,HK -1733471232,1733472255,BD -1733472256,1733473279,IN -1733473280,1733474303,ID -1733474304,1733476351,IN -1733476352,1733478399,VN -1733478400,1733479423,IN -1733479424,1733479935,VN -1733479936,1733481471,IN -1733481472,1733483519,HK -1733483520,1733484543,IN -1733484544,1733485567,CN -1733485568,1733486591,MY -1733486592,1733486847,MM -1733486848,1733487103,ID -1733487104,1733487615,US -1733487616,1733488639,CN -1733488640,1733490175,ID -1733490176,1733490431,NZ -1733490432,1733490687,PG -1733490688,1733491711,US -1733491712,1733492735,PK -1733492736,1733492991,HK -1733492992,1733493759,IN -1733493760,1733494783,ID -1733494784,1733496319,IN -1733496320,1733496575,AU -1733496576,1733496831,BD -1733496832,1733497343,HK -1733497344,1733497855,AF -1733497856,1733498879,PK -1733498880,1733499903,JP -1733499904,1733500927,IN -1733500928,1733501439,PG -1733501440,1733501951,MM -1733501952,1733502975,US -1733502976,1733503999,PH -1733504000,1733505023,CN -1733505024,1733506047,ID -1733506048,1733507071,CN -1733507072,1733507327,AU -1733507328,1733508095,IN -1733508096,1733510143,CN -1733510144,1733511167,IN -1733511168,1733512191,CN -1733512192,1733513727,IN -1733513728,1733514495,TH -1733514496,1733514751,AU -1733514752,1733515263,IN -1733515264,1733516287,US -1733516288,1733518847,ID -1733518848,1733519103,AU -1733519104,1733519359,SG -1733519360,1733521407,IN -1733521408,1733522431,CN -1733522432,1733523455,ID -1733523456,1733524479,CN -1733524480,1733525247,AU -1733525248,1733526527,IN -1733527552,1733528575,IN -1733528576,1733529599,ID -1733529600,1733532671,IN -1733532672,1733533951,SG -1733533952,1733534207,IN -1733534208,1733534719,AU -1733534720,1733535743,BD -1733535744,1733536767,MY -1733536768,1733538815,ID -1733538816,1733539839,CN -1733539840,1733540863,IN -1733540864,1733541887,MM -1733541888,1733542911,IN -1733542912,1733543167,BD -1733543168,1733543423,PG -1733543424,1733543679,ID -1733543680,1733543935,IN -1733543936,1733544959,TH -1733544960,1733545983,BD -1733545984,1733546495,AU -1733546496,1733550079,IN -1733550080,1733551103,PH -1733551104,1733551615,NP -1733551616,1733551871,AU -1733551872,1733552127,HK -1733552128,1733553151,BD -1733553152,1733554175,GB -1733554176,1733555199,BD -1733555200,1733558271,IN -1733558272,1733559295,CN -1733559296,1733561343,ID -1733561344,1733566463,CN -1733566464,1733567487,HK -1733567488,1733568511,BD -1733568512,1733569535,AU -1733569536,1733570559,HK -1733570560,1733571583,CN -1733571584,1733572607,PK -1733572608,1733573631,CN -1733573632,1733574655,IN -1733574656,1733575679,CN -1733575680,1733576703,IN -1733576704,1733577727,CN -1733577728,1733578751,VN -1733578752,1733579775,IN -1733579776,1733581823,HK -1733581824,1733582847,CN -1733582848,1733583103,IN -1733583104,1733583359,AF -1733583360,1733583871,AU -1733583872,1733584895,TH -1733584896,1733585919,MM -1733585920,1733586943,CN -1733586944,1733587967,GB -1733587968,1733588991,ID -1733588992,1733590015,IN -1733590016,1733591039,JP -1733591040,1733592063,IN -1733592064,1733592319,MV -1733592320,1733592575,BD -1733592576,1733592831,MV -1733592832,1733593087,AU -1733593088,1733594111,HK -1733594112,1733596159,ID -1733596160,1733597183,PK -1733597184,1733598207,US -1733598208,1733599231,BD -1733599232,1733600255,LK -1733600256,1733601023,IN -1733601024,1733602303,JP -1733602304,1733603327,BD -1733603328,1733603839,PH -1733603840,1733604351,IN -1733604352,1733605375,AU -1733605376,1733607423,IN -1733607424,1733608447,ID -1733608448,1733609471,JP -1733609472,1733609983,ID -1733609984,1733611519,IN -1733611520,1733612543,ID -1733612544,1733613567,IN -1733613568,1733614591,SG -1733614592,1733615615,HK -1733615616,1733616639,AU -1733616640,1733618687,ID -1733618688,1733620735,IN -1733620736,1733621759,BD -1733621760,1733622015,AU -1733622016,1733622271,ID -1733622272,1733622783,IN -1733622784,1733623807,BD -1733623808,1733624831,NZ -1733624832,1733625855,ID -1733625856,1733626879,IN -1733626880,1733627903,ID -1733627904,1733628927,IN -1733628928,1733630975,CN -1733630976,1733631999,NZ -1733632000,1733633023,BD -1733633024,1733634047,AU -1733634048,1733634559,IN -1733634560,1733635071,US -1733635072,1733639167,CN -1733639168,1733641215,ID -1733641216,1733642239,PH -1733642240,1733643263,HK -1733643264,1733644287,IN -1733644288,1733645311,KR -1733645312,1733646335,CN -1733646336,1733647871,IN -1733647872,1733648383,ID -1733648384,1733650431,IN -1733650432,1733651455,MM -1733651456,1733652479,MY -1733652480,1733653503,BD -1733653504,1733654015,ID -1733654016,1733654527,IN -1733654528,1733655551,ID -1733655552,1733656575,IN -1733656576,1733657599,PK -1733657600,1733657855,MN -1733657856,1733658111,IN -1733658112,1733658367,PH -1733658368,1733658623,AU -1733658624,1733659647,CN -1733659648,1733660671,IN -1733660672,1733661695,CN -1733661696,1733662719,ID -1733662720,1733663231,PK -1733663232,1733663487,IN -1733663488,1733663743,NZ -1733663744,1733665791,BD -1733665792,1733669887,CN -1733669888,1733670911,IN -1733670912,1733671423,SG -1733671424,1733671679,HK -1733671680,1733671935,US -1733671936,1733672959,HK -1733672960,1733675007,BD -1733675008,1733675263,DK -1733675264,1733675519,ES -1733675520,1733675775,CA -1733675776,1733676031,ES -1733676032,1733678079,IN -1733678080,1733678335,HK -1733678336,1733678591,SG -1733678592,1733679103,AU -1733679104,1733680127,BD -1733680128,1733681151,ID -1733681152,1733682175,CN -1733682176,1733683199,IN -1733683200,1733686271,BD -1733686272,1733687295,HK -1733687296,1733688319,AU -1733688320,1733689343,HK -1733689344,1733691391,IN -1733691392,1733692415,PK -1733692416,1733695487,IN -1733695488,1733695999,ID -1733696000,1733696255,IN -1733696256,1733696511,AU -1733696512,1733698559,CN -1733698560,1733699583,PK -1733699584,1733700607,IN -1733700608,1733701631,KR -1733701632,1733702655,TH -1733702656,1733703679,PK -1733703680,1733704191,NP -1733704192,1733704703,AU -1733704704,1733705727,CN -1733705728,1733706751,HK -1733706752,1733707007,JP -1733707008,1733707263,CN -1733707264,1733707775,US -1733707776,1733709823,HK -1733709824,1733712895,CN -1733712896,1733713407,AU -1733713408,1733713663,ID -1733713664,1733713919,IN -1733713920,1733714431,AU -1733714432,1733714687,JP -1733714688,1733714943,SG -1733714944,1733715455,ID -1733715456,1733715711,AU -1733715712,1733715967,ID -1733715968,1733716991,IN -1733716992,1733718015,BD -1733718016,1733719039,AU -1733719040,1733720063,IN -1733720064,1733721087,PH -1733721088,1733722111,AF -1733722112,1733722367,AU -1733722368,1733722623,CN -1733722624,1733723135,MY -1733723136,1733724159,PK -1733724160,1733724415,AU -1733724416,1733724671,IN -1733724672,1733731327,ID -1733731328,1733732351,IN -1733732352,1733733375,AU -1733733376,1733734911,IN -1733734912,1733735423,MY -1733735424,1733736447,IN -1733736448,1733737471,PH -1733737472,1733738495,AU -1733738496,1733741567,BD -1733741568,1733756927,CN -1733756928,1733757951,HK -1733757952,1733758975,LK -1733758976,1733759999,ID -1733760000,1733761023,CN -1733761024,1733763071,IN -1733763072,1733764095,CN -1733764096,1733764351,BD -1733764352,1733764607,ID -1733764608,1733765119,AU -1733765120,1733770239,IN -1733770240,1733771263,ID -1733771264,1733771775,IN -1733771776,1733772287,ID -1733772288,1733772543,AU -1733772544,1733772799,MN -1733772800,1733773311,ID -1733773312,1733774335,CN -1733774336,1733777407,ID -1733777408,1733777663,AF -1733777664,1733778175,IN -1733778176,1733778431,AU -1733778432,1733779455,IN -1733779456,1733780479,CN -1733780480,1733782527,IN -1733782528,1733782783,JP -1733782784,1733783551,US -1733783552,1733784575,BD -1733784576,1733785599,KR -1733785600,1733785855,IN -1733785856,1733786111,NZ -1733786112,1733786623,IN -1733786624,1733787647,LK -1733787648,1733788671,IN -1733788672,1733789695,CN -1733789696,1733790719,BD -1733790720,1733791743,IN -1733791744,1733792767,JP -1733793792,1733794815,ID -1733794816,1733795839,HK -1733795840,1733796351,ID -1733796352,1733796607,PK -1733796608,1733796863,AU -1733796864,1733799935,IN -1733799936,1733800959,JP -1733800960,1733801983,CN -1733801984,1733803007,ID -1733803008,1733803263,MV -1733803264,1733804031,SG -1733804032,1733805055,PK -1733805056,1733806079,ID -1733806080,1733806335,IN -1733806336,1733806591,ID -1733806592,1733806847,IN -1733806848,1733807103,AU -1733807104,1733808127,IN -1733808128,1733809151,AU -1733809152,1733810175,BD -1733810176,1733810431,AU -1733810432,1733810687,TH -1733810688,1733811199,AU -1733811200,1733812223,VN -1733812224,1733813247,CN -1733813248,1733814271,ID -1733814272,1733816063,BD -1733816064,1733816319,NZ -1733816320,1733817343,HK -1733817344,1733819391,BD -1733819392,1733819903,IN -1733819904,1733820159,AU -1733820160,1733820415,MN -1733820416,1733821439,IN -1733821440,1733826559,CN -1733826560,1733827583,BD -1733827584,1733828607,IN -1733828608,1733830655,CN -1733830656,1733831167,IN -1733831168,1733831423,PH -1733831424,1733831679,SG -1733831680,1733832703,JP -1733832704,1733833727,MM -1733833728,1733835775,IN -1733835776,1733837823,CN -1733837824,1733838847,PH -1733838848,1733839871,CN -1733839872,1733840383,IN -1733840384,1733840639,AU -1733840640,1733840895,SG -1733840896,1733843967,IN -1733843968,1733844991,HK -1733844992,1733847039,CN -1733847040,1733848063,NZ -1733848064,1733852159,VN -1733852160,1733855231,IN -1733855232,1733855743,BD -1733855744,1733855999,IN -1733856000,1733856255,CN -1733856256,1733857279,BD -1733857280,1733859327,AU -1733859328,1733859839,CN -1733859840,1733860095,AU -1733860096,1733860351,KH -1733860352,1733861887,IN -1733861888,1733862143,KH -1733862144,1733862399,AU -1733862400,1733863423,CN -1733863424,1733864447,ID -1733864448,1733865471,IN -1733865472,1733866495,CN -1733866496,1733867007,AU -1733867008,1733867263,IN -1733867264,1733867519,AU -1733867520,1733869567,CN -1733869568,1733870591,AF -1733870592,1733874687,ID -1733874688,1733875711,CN -1733875712,1733879039,IN -1733879040,1733879295,ID -1733879296,1733879807,NZ -1733879808,1733880831,BD -1733880832,1733882879,IN -1733882880,1733887999,ID -1733888000,1733888255,IN -1733888256,1733889023,AU -1733889024,1733890047,PH -1733890048,1733890559,IN -1733890560,1733891071,NZ -1733891072,1733892095,TW -1733892096,1733893119,BD -1733893120,1733894143,CN -1733894144,1733895167,ID -1733895168,1733895679,IN -1733895680,1733896191,AU -1733896192,1733897215,IN -1733897216,1733898239,KR -1733898240,1733899263,MM -1733899264,1733903359,IN -1733903360,1733904383,US -1733904384,1733904639,HK -1733904640,1733904895,AU -1733904896,1733905407,IN -1733905408,1733906431,ID -1733906432,1733907455,AU -1733907456,1733910527,VN -1733910528,1733916671,CN -1733916672,1733917695,VN -1733917696,1733918719,ID -1733918720,1733919743,HK -1733919744,1733920767,GB -1733920768,1733921023,IN -1733921024,1733921279,HK -1733921280,1733921791,ID -1733921792,1733922815,SG -1733922816,1733923839,HK -1733923840,1733924863,CN -1733924864,1733925375,AF -1733925376,1733925887,ID -1733925888,1733926911,NP -1733926912,1733928703,ID -1733928704,1733928959,AU -1733928960,1733929983,IN -1733929984,1733931007,CN -1733931008,1733933055,MM -1733933056,1733945343,CN -1733945344,1733946367,IN -1733946368,1733948415,PH -1733948416,1733949439,BD -1733949440,1733949695,ID -1733949696,1733949951,IN -1733949952,1733950463,ID -1733950464,1733951487,IN -1733951488,1733952255,BD -1733952256,1733952511,AU -1733952512,1733953279,IN -1733953280,1733953535,PK -1733953536,1733954559,ID -1733954560,1733955071,BD -1733955072,1733955327,NZ -1733955328,1733955583,AU -1733955584,1733956607,JP -1733956608,1733957631,AU -1733957632,1733958655,ID -1733958656,1733959679,JP -1733959680,1733961727,IN -1733961728,1733962751,TH -1733962752,1733963775,IN -1733963776,1733964543,AU -1733964544,1733964799,HK -1733964800,1733965823,CN -1733965824,1733966335,HK -1733966336,1733966847,AU -1733966848,1733967871,IN -1733967872,1733968127,ID -1733968128,1733968895,AU -1733968896,1733970943,IN -1733970944,1733971199,HK -1733971200,1733971455,AU -1733971456,1733971711,NZ -1733971712,1733971967,IN -1733971968,1733972991,HK -1733972992,1733974015,NP -1733974016,1733975039,AU -1733975040,1733976063,CN -1733976064,1733977087,IN -1733977088,1733986303,CN -1733986304,1733987327,HK -1733987328,1733988351,AU -1733988352,1733989375,NP -1733989376,1733990399,KH -1733990400,1733991423,CN -1733991424,1733993471,IN -1733993472,1733994495,JP -1733994496,1733995519,CN -1733995520,1733995775,HK -1733995776,1733996031,CN -1733996032,1733996543,NZ -1733996544,1733997567,CN -1733997568,1733998591,IN -1733998592,1733999103,NZ -1733999104,1733999615,IN -1733999616,1734001663,CN -1734001664,1734002687,ID -1734002688,1734003199,IN -1734003200,1734003455,PH -1734003456,1734003711,HK -1734003712,1734004735,IN -1734004736,1734004991,AU -1734004992,1734005247,KR -1734005248,1734005503,ID -1734005504,1734005759,AU -1734005760,1734006783,BD -1734006784,1734007807,AU -1734007808,1734011903,VN -1734011904,1734013951,IN -1734013952,1734014975,KR -1734014976,1734018047,ID -1734018048,1734019071,JP -1734019072,1734020095,HK -1734020096,1734021119,ID -1734021120,1734022143,IN -1734022144,1734026239,ID -1734026240,1734028287,CN -1734028288,1734029311,ID -1734029312,1734030335,IN -1734030336,1734031103,BD -1734031104,1734031359,PH -1734031360,1734032383,US -1734032384,1734032895,MM -1734032896,1734033407,IN -1734033408,1734034431,MY -1734034432,1734039295,IN -1734039296,1734039551,ID -1734039552,1734043647,IN -1734043648,1734044159,BD -1734044160,1734044191,PR -1734044192,1734044255,CN -1734044256,1734044287,KR -1734044288,1734044447,CN -1734044448,1734044479,US -1734044480,1734044511,CN -1734044512,1734044543,US -1734044544,1734045695,CN -1734045696,1734046207,PH -1734046208,1734046719,PG -1734046720,1734049023,IN -1734049024,1734049279,SG -1734049280,1734049535,HK -1734049536,1734049791,IN -1734049792,1734050815,BD -1734050816,1734052863,IN -1734052864,1734053887,PH -1734053888,1734054911,BD -1734054912,1734055935,AU -1734055936,1734056959,CN -1734056960,1734057983,HK -1734057984,1734059007,IN -1734059008,1734060031,AU -1734060032,1734061055,BD -1734061056,1734062079,NZ -1734062080,1734063103,CN -1734063104,1734064127,IN -1734064128,1734064383,JP -1734064384,1734064639,AU -1734064640,1734065151,IN -1734065152,1734066175,TH -1734066176,1734066687,AU -1734066688,1734066943,MY -1734066944,1734067199,BD -1734067200,1734068223,NZ -1734068224,1734069247,CN -1734069248,1734070271,TH -1734070272,1734072319,CN -1734072320,1734072575,AU -1734072576,1734072831,HK -1734072832,1734073087,IN -1734073088,1734073343,CN -1734073344,1734075391,IN -1734075392,1734077439,BD -1734077440,1734078463,CN -1734078464,1734079487,MY -1734079488,1734081535,IN -1734081536,1734086655,CN -1734086656,1734086911,NZ -1734086912,1734087167,AU -1734087168,1734087423,MY -1734087424,1734087679,IN -1734087680,1734088703,PK -1734088704,1734091775,VN -1734091776,1734092799,ID -1734092800,1734094847,IN -1734094848,1734104063,CN -1734104064,1734104575,BD -1734104576,1734104831,CN -1734104832,1734105087,AU -1734105088,1734106111,CN -1734106112,1734107135,AU -1734107136,1734108159,SG -1734108160,1734109183,IN -1734109184,1734109439,ID -1734109440,1734109695,TH -1734109696,1734110207,BD -1734110208,1734111231,CN -1734111232,1734114303,IN -1734114304,1734115583,CN -1734115584,1734115839,HK -1734115840,1734116095,VG -1734116096,1734116351,AU -1734116352,1734117375,CN -1734117376,1734118399,HK -1734118400,1734119423,AU -1734119424,1734120447,PH -1734120448,1734121471,MY -1734121472,1734122495,BD -1734122496,1734123519,CN -1734123520,1734124031,BD -1734124032,1734124543,IN -1734124544,1734132735,CN -1734132736,1734133759,SG -1734133760,1734134783,IN -1734134784,1734136063,BD -1734136064,1734136319,ID -1734136320,1734136831,US -1734136832,1734138879,BD -1734138880,1734139903,AU -1734139904,1734140927,ID -1734140928,1734141951,JP -1734141952,1734142463,ID -1734142464,1734142719,BD -1734142720,1734142975,IN -1734142976,1734150143,CN -1734150144,1734151167,IN -1734151168,1734152191,PK -1734152192,1734154239,IN -1734154240,1734155007,AU -1734155008,1734155263,IN -1734155264,1734156287,CN -1734156288,1734157311,NZ -1734157312,1734159871,IN -1734159872,1734160127,HK -1734160128,1734161407,IN -1734161408,1734163455,ID -1734163456,1734164479,JP -1734164480,1734165503,ID -1734165504,1734166527,AU -1734166528,1734167551,HK -1734167552,1734167807,JP -1734167808,1734168575,CN -1734168576,1734169343,AU -1734169344,1734169599,IN -1734169600,1734170623,CN -1734170624,1734171135,IN -1734171136,1734171391,BD -1734171392,1734171647,AU -1734171648,1734171903,AF -1734171904,1734172159,BD -1734172160,1734172415,IN -1734172416,1734172671,PK -1734172672,1734175743,IN -1734175744,1734176767,AU -1734176768,1734178815,IN -1734178816,1734179071,BD -1734179072,1734179327,CN -1734179328,1734179839,NP -1734179840,1734180863,HK -1734180864,1734182911,ID -1734182912,1734183423,IN -1734183424,1734183679,SG -1734183680,1734183935,AU -1734183936,1734184959,MY -1734184960,1734185983,NZ -1734185984,1734187007,AU -1734187008,1734188031,CN -1734188032,1734188543,AU -1734188544,1734190591,ID -1734190592,1734190847,TH -1734190848,1734191103,SG -1734191104,1734192127,AU -1734192128,1734194175,IN -1734194176,1734195199,CN -1734195200,1734197247,ID -1734197248,1734200319,IN -1734200320,1734201343,CN -1734201344,1734201599,PK -1734201600,1734201855,IN -1734201856,1734202367,ID -1734202368,1734203391,TH -1734203392,1734204415,PK -1734204416,1734205439,PH -1734205440,1734207487,ID -1734207488,1734208511,AU -1734208512,1734209279,ID -1734209280,1734209535,AU -1734209536,1734210559,IN -1734210560,1734211583,ID -1734211584,1734212607,IN -1734212608,1734213119,SG -1734213120,1734213375,AF -1734213376,1734213631,SG -1734213632,1734216703,ID -1734216704,1734217727,CN -1734217728,1734218751,VN -1734218752,1734219775,CN -1734219776,1734220287,AF -1734220288,1734220543,AU -1734220544,1734220799,IN -1734220800,1734225919,CN -1734225920,1734226943,AU -1734226944,1734227967,MM -1734227968,1734228991,IN -1734228992,1734230015,AU -1734230016,1734231039,IN -1734231040,1734232063,MM -1734232064,1734233087,CN -1734233088,1734234111,HK -1734234112,1734236159,IN -1734236160,1734237183,CN -1734237184,1734238207,NZ -1734238208,1734239231,ID -1734239232,1734239743,IN -1734239744,1734239999,PK -1734240000,1734240255,HK -1734240256,1734243327,IN -1734243328,1734244351,CN -1734244352,1734246399,ID -1734246400,1734247423,BD -1734247424,1734247935,ID -1734247936,1734248447,BD -1734248448,1734249471,IN -1734249472,1734250495,JP -1734250496,1734251519,MM -1734251520,1734252543,HK -1734252544,1734253823,AU -1734253824,1734254079,CA -1734254080,1734254591,NP -1734254592,1734255615,CN -1734255616,1734255871,ID -1734255872,1734256127,AU -1734256128,1734256639,IN -1734256640,1734257663,ID -1734257664,1734258687,IN -1734258688,1734259711,VN -1734259712,1734260735,CN -1734260736,1734260991,HK -1734260992,1734261247,US -1734261248,1734261503,PK -1734261504,1734261759,IN -1734261760,1734262783,ID -1734262784,1734263807,IN -1734263808,1734264831,BD -1734264832,1734265855,CN -1734265856,1734266623,IN -1734266624,1734267903,AU -1734267904,1734268415,ID -1734268416,1734268927,HK -1734268928,1734269951,BD -1734269952,1734270975,NP -1734270976,1734271999,SG -1734272000,1734273023,JP -1734273024,1734274047,HK -1734274048,1734274559,IN -1734274560,1734275071,ID -1734275072,1734276095,IN -1734276096,1734276607,PK -1734276608,1734277119,BD -1734277120,1734278143,AU -1734278144,1734279167,NP -1734279168,1734280191,AU -1734280192,1734280703,PK -1734280704,1734282239,ID -1734282240,1734283263,IN -1734283264,1734284287,NP -1734284288,1734285311,BD -1734285312,1734286335,LA -1734286336,1734287359,CN -1734287360,1734288383,MY -1734288384,1734288639,IN -1734288640,1734288895,MY -1734288896,1734289151,BD -1734289152,1734289407,AU -1734289408,1734290431,ID -1734290432,1734291455,TW -1734291456,1734291711,IN -1734291712,1734291967,ID -1734291968,1734292479,IN -1734292480,1734293503,CN -1734293504,1734294527,HK -1734294528,1734295551,NZ -1734295552,1734297599,CN -1734297600,1734298623,AU -1734298624,1734298879,SG -1734298880,1734299647,AU -1734299648,1734301695,IN -1734301696,1734303743,CN -1734303744,1734304767,BD -1734304768,1734305023,IN -1734305024,1734305279,ID -1734305280,1734305791,HK -1734305792,1734306815,JP -1734306816,1734307327,HK -1734307328,1734308863,AU -1734308864,1734309887,CN -1734309888,1734310911,IN -1734310912,1734311935,BD -1734311936,1734312959,CN -1734312960,1734313983,KH -1734313984,1734317055,CN -1734317056,1734318079,PH -1734318080,1734319103,CN -1734319104,1734320127,VN -1734320128,1734320895,ID -1734320896,1734321151,JP -1734321152,1734322175,IN -1734322176,1734323199,VN -1734323200,1734324223,IN -1734324224,1734325247,AU -1734325248,1734327295,JP -1734327296,1734328831,IN -1734328832,1734329343,AU -1734329344,1734330367,VN -1734330368,1734331391,IN -1734331392,1734331903,AU -1734331904,1734332159,JP -1734332160,1734332415,CN -1734332416,1734333439,BD -1734333440,1734333951,PH -1734333952,1734334207,AU -1734334208,1734334463,SG -1734334464,1734337535,CN -1734337536,1734338559,TH -1734338560,1734339071,PH -1734339072,1734339583,IN -1734339584,1734344703,CN -1734344704,1734345727,JP -1734345728,1734346751,AU -1734346752,1734347775,CN -1734347776,1734349823,IN -1734349824,1734352383,AU -1734352384,1734352895,IN -1734352896,1734353919,NP -1734353920,1734354943,BD -1734354944,1734359039,IN -1734359040,1734360063,AU -1734360064,1734361087,MO -1734361088,1734362111,JP -1734362112,1734363135,BD -1734363136,1734364159,HK -1734364160,1734365183,KH -1734365184,1734366207,CN -1734366208,1734367231,NZ -1734367232,1734368255,BD -1734368256,1734371327,IN -1734371328,1734372351,BD -1734372352,1734372863,SG -1734372864,1734373119,NZ -1734373120,1734373375,ID -1734373376,1734374399,JP -1734374400,1734374655,ID -1734374656,1734374911,NZ -1734374912,1734375423,ID -1734375424,1734375424,HK -1734375425,1734376446,JP -1734376447,1734376447,HK -1734376448,1734377471,CN -1734377472,1734378495,HK -1734378496,1734378751,AU -1734378752,1734379007,IN -1734379008,1734379519,PG -1734379520,1734380799,CN -1734380800,1734381055,AU -1734381056,1734381567,IN -1734381568,1734382591,AU -1734382592,1734401023,CN -1734401024,1734403327,IN -1734403328,1734403583,JP -1734403584,1734404351,MM -1734404352,1734404607,AF -1734404608,1734405119,BD -1734405120,1734406655,IN -1734406656,1734407167,MY -1734407168,1734408191,NP -1734408192,1734408447,MY -1734408448,1734408703,AU -1734408704,1734409215,IN -1734409216,1734410239,JP -1734410240,1734411263,HK -1734411264,1734412287,ID -1734412288,1734421503,CN -1734421504,1734422015,BD -1734422016,1734422527,IN -1734422528,1734423551,TW -1734423552,1734424575,AU -1734424576,1734429695,CN -1734429696,1734430719,ID -1734430720,1734431743,CN -1734431744,1734435839,IN -1734435840,1734436607,ID -1734436608,1734438399,IN -1734438400,1734438655,MM -1734438656,1734438911,ID -1734438912,1734440959,CN -1734440960,1734441983,BD -1734441984,1734443007,VN -1734443008,1734444031,CN -1734444032,1734445055,VN -1734445056,1734446079,IN -1734446080,1734446591,ID -1734446592,1734447103,MY -1734447104,1734449151,CN -1734449152,1734449407,MY -1734449408,1734449663,IN -1734449664,1734449919,PK -1734449920,1734450175,AU -1734450176,1734451199,TW -1734451200,1734452223,BD -1734452224,1734453247,IN -1734453248,1734453759,PK -1734453760,1734455039,AU -1734455040,1734456319,HK -1734456320,1734458367,IN -1734458368,1734460415,CN -1734460416,1734461439,IN -1734461440,1734461951,HK -1734461952,1734462207,ID -1734462208,1734462463,IN -1734462464,1734463487,BD -1734463488,1734463999,JP -1734464000,1734465791,IN -1734465792,1734467583,AU -1734467584,1734469119,CN -1734469120,1734469375,AU -1734469376,1734469631,IN -1734469632,1734471679,JP -1734471680,1734474239,IN -1734474240,1734474495,US -1734474496,1734474751,ID -1734474752,1734475775,AU -1734475776,1734476799,IN -1734476800,1734477823,TH -1734477824,1734478847,HK -1734478848,1734479359,AU -1734479360,1734480383,HK -1734480384,1734480639,JP -1734480640,1734480895,HK -1734480896,1734481919,IN -1734481920,1734482943,TH -1734482944,1734483455,CN -1734483456,1734483967,ID -1734483968,1734486015,IN -1734486016,1734489087,CN -1734489088,1734489343,PG -1734489344,1734489855,IN -1734489856,1734490111,SG -1734490112,1734491135,CN -1734491136,1734491391,IN -1734491392,1734491647,ID -1734491648,1734492159,IN -1734492160,1734493183,BD -1734493184,1734494207,MN -1734494208,1734495231,TW -1734495232,1734495743,HK -1734495744,1734496255,IN -1734496256,1734497279,CN -1734497280,1734497535,MY -1734497536,1734497791,IN -1734497792,1734498303,AU -1734498304,1734502399,CN -1734502400,1734502911,ID -1734502912,1734503423,BD -1734503424,1734504447,IN -1734504448,1734504703,HK -1734504704,1734504959,SG -1734504960,1734505471,HK -1734505472,1734507007,ID -1734507008,1734507263,MN -1734507264,1734507519,ID -1734507520,1734508543,CN -1734508544,1734509567,NP -1734509568,1734510335,SG -1734510336,1734510591,BD -1734510592,1734513663,CN -1734513664,1734515711,VN -1734515712,1734516735,IN -1734516736,1734517759,VN -1734517760,1734519807,CN -1734519808,1734520831,US -1734520832,1734521855,ID -1734521856,1734522879,CN -1734522880,1734523903,AU -1734523904,1734525951,IN -1734525952,1734526975,CN -1734526976,1734529023,BD -1734529024,1734529535,AU -1734529536,1734530047,IN -1734530048,1734531071,JP -1734531072,1734536191,CN -1734536192,1734536447,AU -1734536448,1734536703,MY -1734536704,1734536959,AU -1734536960,1734537215,ID -1734537216,1734541311,CN -1734541312,1734542335,VN -1734542336,1734543359,SG -1734543360,1734544127,IN -1734544128,1734544383,BD -1734544384,1734546431,IN -1734546432,1734547199,AU -1734547200,1734547455,HK -1734547456,1734547967,ID -1734547968,1734548223,TL -1734548480,1734549503,MM -1734549504,1734551551,IN -1734551552,1734552063,CN -1734552064,1734552319,IN -1734552320,1734552575,FJ -1734552576,1734553599,AU -1734553600,1734554111,MY -1734554112,1734554623,SG -1734554624,1734557695,CN -1734557696,1734558719,AU -1734558720,1734559743,IN -1734559744,1734560767,HK -1734560768,1734561791,CN -1734561792,1734562815,JP -1734562816,1734563327,ID -1734563328,1734563839,AU -1734563840,1734564863,TW -1734564864,1734565887,IN -1734565888,1734566911,SG -1734566912,1734567167,LK -1734567168,1734567679,IN -1734567680,1734567935,MN -1734567936,1734568959,CN -1734568960,1734569983,IN -1734569984,1734570495,ID -1734570496,1734570751,AU -1734570752,1734571007,US -1734571008,1734573055,CN -1734573056,1734574079,JP -1734574080,1734575103,BD -1734575104,1734579199,CN -1734579200,1734580223,IN -1734580224,1734581247,CN -1734581248,1734582271,IN -1734582272,1734583295,PH -1734583296,1734584319,TL -1734584320,1734585343,JP -1734585344,1734585855,IN -1734585856,1734586367,PG -1734586368,1734586879,BD -1734586880,1734587391,US -1734587392,1734588415,BD -1734588416,1734589183,IN -1734589184,1734589439,GB -1734589440,1734594559,IN -1734594560,1734595327,HK -1734595328,1734595583,AU -1734595584,1734596607,ID -1734596608,1734597631,IN -1734597632,1734598655,CN -1734598656,1734599679,AU -1734599680,1734599935,TW -1734599936,1734600703,VN -1734600704,1734602751,CN -1734602752,1734603775,AU -1734603776,1734604799,VN -1734604800,1734605823,BD -1734605824,1734606847,VN -1734606848,1734607871,CN -1734607872,1734609407,IN -1734609408,1734609663,VU -1734609664,1734609919,AU -1734609920,1734612991,IN -1734612992,1734613503,AU -1734613504,1734613759,NZ -1734613760,1734614015,ID -1734614016,1734615039,AU -1734615040,1734616063,CN -1734616064,1734617087,IN -1734617088,1734618111,CN -1734618112,1734618623,AU -1734618624,1734619135,MY -1734619136,1734625279,CN -1734625280,1734626303,JP -1734626304,1734628351,IN -1734628352,1734628863,ID -1734628864,1734629375,NZ -1734629376,1734630399,CN -1734630400,1734631423,BD -1734631424,1734632447,ID -1734632448,1734632959,PH -1734632960,1734633215,NZ -1734633216,1734633471,PK -1734633472,1734633983,NZ -1734633984,1734634239,IN -1734634240,1734634495,AU -1734634496,1734635519,PH -1734635520,1734636543,HK -1734636544,1734637567,CN -1734637568,1734638591,AU -1734638592,1734639615,TW -1734639616,1734641663,ID -1734641664,1734642175,PH -1734642176,1734642687,HK -1734642688,1734644735,CN -1734644736,1734645247,AU -1734645248,1734645759,IN -1734645760,1734647807,HK -1734647808,1734648831,VN -1734648832,1734649855,TW -1734649856,1734650879,IN -1734650880,1734651903,ID -1734651904,1734652927,AU -1734652928,1734653951,ID -1734653952,1734654975,NZ -1734654976,1734655231,PK -1734655232,1734655999,JP -1734656000,1734656255,HK -1734656256,1734656511,ID -1734656512,1734656767,AU -1734656768,1734657023,ID -1734657024,1734658047,AU -1734658048,1734658303,MY -1734658304,1734658559,IN -1734658560,1734659071,PK -1734659072,1734660095,MY -1734660096,1734661119,HK -1734661120,1734664191,IN -1734664192,1734665215,AU -1734665216,1734666239,VN -1734666240,1734667263,BD -1734667264,1734669311,CN -1734669312,1734669567,BD -1734669568,1734669823,IN -1734669824,1734670335,ID -1734670336,1734672383,CN -1734672384,1734673407,US -1734673408,1734676479,CN -1734676480,1734677503,MM -1734677504,1734678527,ID -1734678528,1734679551,IN -1734679552,1734680575,CN -1734680576,1734681599,VN -1734681600,1734682623,NP -1734682624,1734683135,AU -1734683136,1734683391,NZ -1734683392,1734683647,IN -1734683648,1734684671,PH -1734684672,1734685695,MY -1734685696,1734685951,ID -1734685952,1734686719,BD -1734686720,1734687743,IN -1734687744,1734688767,CN -1734688768,1734689023,IN -1734689024,1734689279,AU -1734689280,1734689791,ID -1734689792,1734690815,IN -1734690816,1734691839,JP -1734691840,1734692863,VN -1734692864,1734693887,KH -1734693888,1734694911,BD -1734694912,1734696447,IN -1734696448,1734696703,AU -1734696704,1734696959,ID -1734696960,1734697983,HK -1734697984,1734699007,IN -1734699008,1734700031,ID -1734700032,1734703103,IN -1734703104,1734705151,CN -1734705152,1734706175,AU -1734706176,1734706431,IN -1734706432,1734706687,AU -1734706688,1734706943,IN -1734706944,1734707199,AU -1734707200,1734708223,ID -1734708224,1734709247,IN -1734709248,1734711295,CN -1734711296,1734711551,SG -1734711552,1734711807,US -1734711808,1734712319,ID -1734712320,1734713343,KH -1734713344,1734714367,VN -1734714368,1734714879,AF -1734714880,1734716415,AU -1734716416,1734716671,IN -1734716672,1734716927,AU -1734716928,1734717439,IN -1734717440,1734718463,GB -1734718464,1734720511,CN -1734720512,1734720767,KR -1734720768,1734721535,HK -1734721536,1734721791,VU -1734721792,1734722047,AU -1734722048,1734722559,ID -1734722560,1734723583,BD -1734723584,1734724607,SG -1734724608,1734725631,HK -1734725632,1734726655,KH -1734726656,1734727167,IN -1734727168,1734727423,AU -1734727424,1734727679,HK -1734727680,1734728703,MN -1734728704,1734729727,JP -1734729728,1734731775,ID -1734731776,1734732031,PK -1734732032,1734732287,IN -1734732288,1734732799,AU -1734732800,1734733311,NP -1734733312,1734733567,SG -1734733568,1734733823,ID -1734733824,1734734847,FJ -1734734848,1734735871,MY -1734735872,1734736127,HK -1734736128,1734736895,BD -1734736896,1734737151,NP -1734737152,1734737407,BD -1734737408,1734737919,MY -1734737920,1734738431,ID -1734738432,1734738687,IN -1734738688,1734738943,JP -1734738944,1734739967,HK -1734739968,1734740991,AU -1734740992,1734742015,ID -1734742016,1734743039,US -1734743040,1734744063,VN -1734744064,1734744319,AU -1734744320,1734744831,IN -1734744832,1734745087,BD -1734745088,1734746111,IN -1734746112,1734747135,HK -1734747136,1734747647,NP -1734747648,1734747903,PK -1734747904,1734748159,AU -1734748160,1734748671,PK -1734748672,1734749183,BD -1734749184,1734749439,HK -1734749440,1734750207,GI -1734750208,1734750719,HK -1734750720,1734751487,NZ -1734751488,1734751743,AU -1734751744,1734753279,IN -1734753280,1734754303,ID -1734754304,1734757375,IN -1734757376,1734759423,CN -1734759424,1734764799,IN -1734764800,1734765055,AU -1734765056,1734765567,IN -1734765568,1734766591,NZ -1734766592,1734767615,ID -1734767616,1734768127,IN -1734768128,1734768383,AU -1734768384,1734769663,IN -1734769664,1734770687,PH -1734770688,1734771711,VN -1734771712,1734773759,BD -1734773760,1734774783,ID -1734774784,1734775295,IN -1734775296,1734775551,ID -1734775552,1734775807,IN -1734775808,1734777855,ID -1734777856,1734778879,PK -1734778880,1734779903,US -1734779904,1734780415,AU -1734780416,1734780671,US -1734780672,1734780927,ID -1734780928,1734782975,CN -1734782976,1734783487,ID -1734783488,1734783999,AU -1734784000,1734790143,CN -1734790144,1734791167,BD -1734791168,1734793215,CN -1734793216,1734794239,BD -1734794240,1734794751,AF -1734794752,1734797823,AU -1734797824,1734798079,IN -1734798080,1734798335,SG -1734798336,1734799359,BD -1734799360,1734800383,MY -1734800384,1734800639,IN -1734800640,1734800895,AU -1734800896,1734801407,BD -1734801408,1734802175,ID -1734802176,1734802431,IN -1734802432,1734803455,BD -1734803456,1734803711,PH -1734803712,1734803967,AU -1734803968,1734804991,IN -1734804992,1734805503,BD -1734805504,1734806527,IN -1734806528,1734808575,CN -1734808576,1734810623,ID -1734810624,1734811135,IN -1734811136,1734811647,ID -1734811648,1734812671,BD -1734812672,1734813695,CN -1734813696,1734814207,NZ -1734814208,1734814719,PK -1734814720,1734815743,NZ -1734815744,1734816767,US -1734816768,1734818815,IN -1734818816,1734819839,SG -1734819840,1734820351,HK -1734820352,1734820607,MV -1734820608,1734820863,TH -1734820864,1734822911,CN -1734822912,1734823935,AU -1734823936,1734824959,TW -1734824960,1734825983,AU -1734825984,1734826495,BD -1734826496,1734828031,IN -1734828032,1734828543,NZ -1734828544,1734830079,BD -1734830080,1734832127,AU -1734832128,1734832383,PK -1734832384,1734832639,IN -1734832640,1734832895,AU -1734832896,1734833151,CH -1734833152,1734834175,VN -1734834176,1734835199,IN -1734835200,1734836223,BD -1734836224,1734837247,TW -1734837248,1734838271,IN -1734838272,1734839295,ID -1734839296,1734839807,AU -1734839808,1734840319,IN -1734840320,1734841343,ID -1734841344,1734842367,AU -1734842368,1734843391,SG -1734843392,1734844415,MY -1734844416,1734845439,IN -1734845440,1734847487,JP -1734847488,1734848255,IN -1734848256,1734848511,ID -1734848512,1734849535,CN -1734849536,1734850047,ID -1734850048,1734850559,PG -1734850560,1734851583,AU -1734851584,1734852607,CN -1734852608,1734853119,ID -1734853120,1734853375,MM -1734853376,1734854655,IN -1734854656,1734856703,CN -1734856704,1734857215,IN -1734857216,1734857727,AU -1734857728,1734858751,IN -1734858752,1734859263,AU -1734859264,1734859519,NZ -1734859520,1734859775,IN -1734859776,1734863871,CN -1734863872,1734864383,IN -1734864384,1734864639,AU -1734864640,1734864895,BD -1734864896,1734865151,SG -1734865152,1734865407,HK -1734865408,1734865663,CN -1734865664,1734865919,SG -1734865920,1734866943,HK -1734866944,1734871039,CN -1734871040,1734871551,AU -1734871552,1734871807,ID -1734871808,1734872063,HK -1734872064,1734873087,ID -1734873088,1734874111,PH -1734874112,1734875135,JP -1734875136,1734876159,VN -1734876160,1734877183,NP -1734877184,1734877695,AU -1734877696,1734878207,ID -1734878208,1734880255,CN -1734880256,1734883583,IN -1734883584,1734883839,ID -1734883840,1734884351,IN -1734884352,1734885375,AU -1734885376,1734886399,CN -1734886400,1734886655,IN -1734886656,1734886911,MY -1734886912,1734889471,IN -1734889472,1734890495,AU -1734890496,1734891007,PK -1734891008,1734891263,BD -1734891264,1734891519,PK -1734891520,1734892543,JP -1734892544,1734893567,IN -1734893568,1734894079,PK -1734894080,1734894335,SG -1734894336,1734894591,ID -1734894592,1734895615,PH -1734895616,1734896639,CN -1734896640,1734898687,IN -1734898688,1734900735,VN -1734900736,1734902271,IN -1734902272,1734902527,ID -1734902528,1734902783,US -1734902784,1734904831,ID -1734904832,1734905855,BD -1734905856,1734906367,ID -1734906368,1734906879,AF -1734906880,1734907903,TW -1734907904,1734908927,CN -1734908928,1734909951,AU -1734909952,1734910975,PK -1734910976,1734911999,AU -1734912000,1734914047,CN -1734914304,1734914559,ID -1734914560,1734914815,HK -1734914816,1734915071,TH -1734915072,1734916095,IN -1734916096,1734917119,BD -1734917120,1734918143,CN -1734918144,1734919167,MY -1734919168,1734919423,SG -1734919424,1734919679,NP -1734919680,1734920191,CN -1734920192,1734920703,AU -1734920704,1734921215,IN -1734921216,1734922239,ID -1734922240,1734923263,IN -1734923264,1734924287,PK -1734924288,1734925311,BD -1734925312,1734925567,HK -1734925568,1734927359,IN -1734927360,1734927615,KH -1734927616,1734927871,SG -1734927872,1734928127,AU -1734928128,1734928383,IN -1734928384,1734929407,NP -1734929408,1734930943,AU -1734930944,1734931455,BD -1734931456,1734931967,HK -1734931968,1734932479,NL -1740636160,1740644351,CN -1740644352,1740645375,IN -1740645376,1740647423,HK -1740647424,1740648447,MO -1740648448,1740651519,CN -1740651520,1740653567,IN -1740653568,1740654591,JP -1740654592,1740655615,IN -1740655616,1740656639,NP -1740656640,1740656895,NZ -1740656896,1740657151,AF -1740657152,1740657663,AU -1740657664,1740665855,CN -1740665856,1740666879,IN -1740666880,1740667903,JP -1740667904,1740668927,PH -1740668928,1740674047,CN -1740674048,1740675071,JP -1740675072,1740676095,AU -1740676096,1740677119,BD -1740677120,1740678143,HK -1740678144,1740679167,CN -1740679168,1740680447,IN -1740680448,1740680703,AU -1740680704,1740680959,MM -1740680960,1740681215,AU -1740681216,1740682239,HK -1740682240,1740683263,KH -1740683264,1740684287,PH -1740684288,1740685311,CN -1740685312,1740686591,AU -1740686592,1740686847,NZ -1740686848,1740687359,IN -1740687360,1740688383,HK -1740688384,1740689407,IN -1740689408,1740692479,CN -1740692480,1740693503,IN -1740693504,1740694527,HK -1740694528,1740696575,JP -1740696576,1740697599,VN -1740697600,1740698623,NZ -1740698624,1740700671,IN -1740700672,1740701695,CN -1740701696,1740702719,IN -1740702720,1740703743,SG -1740703744,1740704255,NZ -1740704256,1740704767,AU -1740704768,1740705791,JP -1740705792,1740706047,NZ -1740706048,1740706303,AU -1740706304,1740706559,PK -1740706560,1740706815,ID -1740706816,1740709887,IN -1740709888,1740710911,HK -1740710912,1740711423,IN -1740711424,1740711935,NZ -1740711936,1740713983,CN -1740713984,1740719103,IN -1740719104,1740720127,HK -1740721152,1740721407,AU -1740721408,1740721663,IN -1740721664,1740721919,AU -1740721920,1740722175,IN -1740722176,1740723199,AU -1740723200,1740731391,IN -1740731392,1740732415,ID -1740732416,1740733439,CN -1740733440,1740733695,SG -1740733696,1740733951,HK -1740733952,1740734207,SG -1740734208,1740736511,HK -1740736512,1740737535,NZ -1740737536,1740740607,CN -1740740608,1740742655,IN -1740742656,1740743679,CN -1740743936,1740744191,PH -1740744192,1740744703,AU -1740744704,1740745727,BD -1740745728,1740746751,HK -1740747776,1740748799,KH -1740748800,1740749823,HK -1740749824,1740751871,CN -1740751872,1740753919,IN -1740753920,1740754943,KH -1740754944,1740755967,AU -1740755968,1740764159,CN -1740764160,1740766207,HK -1740766208,1740767231,IN -1740767232,1740769279,AU -1740769280,1740771327,IN -1740771328,1740772351,CN -1740772352,1740776447,IN -1740776448,1740777471,HK -1740777472,1740778239,JP -1740778240,1740778495,HK -1740778496,1740779519,IN -1740779520,1740780543,AU -1740780544,1740784639,IN -1740784640,1740784895,AU -1740784896,1740785663,IN -1740785664,1740786687,JP -1740786688,1740787711,SG -1740787712,1740788735,MY -1740788736,1740789759,KH -1740789760,1740790783,IN -1740790784,1740791807,PK -1740791808,1740792831,IN -1740792832,1740794879,HK -1740794880,1740795903,KR -1740795904,1740796159,NZ -1740796160,1740796415,AU -1740796416,1740796671,IN -1740796672,1740796927,AU -1740796928,1740798207,IN -1740798208,1740798463,AU -1740798464,1740798975,IN -1740798976,1740799999,AU -1740800000,1740800511,IN -1740800512,1740800767,ID -1740800768,1740805119,IN -1740805120,1740806143,HK -1740806144,1740809215,IN -1740809216,1740810239,JP -1740810240,1740811263,NL -1740811264,1740812287,ID -1740812288,1740813311,MN -1740813312,1740814335,IN -1740814336,1740815359,HK -1740815360,1740816383,VN -1740816384,1740821503,IN -1740821504,1740822015,HK -1740822016,1740822527,AU -1740822528,1740825599,IN -1740825856,1740826111,AU -1740826112,1740826623,SG -1740826624,1740827647,IN -1740827648,1740828671,HK -1740828672,1740829695,IN -1740829696,1740830719,HK -1740830720,1740831743,IN -1740831744,1740832767,KR -1740832768,1740833791,BD -1740833792,1740834815,HK -1740834816,1740835839,NZ -1740835840,1740836863,AU -1740836864,1740837119,IN -1740837376,1740837887,ID -1740837888,1740838911,MY -1740838912,1740839935,IN -1740839936,1740840959,ID -1740840960,1740841983,SG -1740841984,1740845055,IN -1740845056,1740846079,HK -1740846080,1740846591,AU -1740846592,1740847103,BD -1740847104,1740848127,ID -1740848128,1740849407,AU -1740849408,1740849663,ID -1740849664,1740850175,AU -1740850176,1740855295,IN -1740855296,1740856319,ID -1740856320,1740858367,IN -1740858368,1740859391,US -1740859392,1740860415,CN -1740860416,1740861439,HK -1740861440,1740862463,CN -1740862464,1740863487,HK -1740863488,1740865535,IN -1740865536,1740866559,AU -1740866560,1740867583,HK -1740867584,1740868607,CN -1740868608,1740869119,BD -1740869120,1740869375,ID -1740869376,1740869631,MY -1740869632,1740870655,JP -1740870656,1740872703,CN -1740872704,1740873727,ID -1740873728,1740874751,CN -1740874752,1740876287,ID -1740876288,1740876799,AU -1740876800,1740880639,IN -1740880640,1740880895,HK -1740880896,1740881919,SG -1740881920,1740882943,CN -1740882944,1740884991,IN -1740884992,1740885503,BD -1740885504,1740886015,AU -1740886016,1740893183,IN -1740893184,1740895231,VN -1740895232,1740901375,IN -1740901376,1740901887,TH -1740901888,1740902143,ID -1740902400,1740903423,VN -1740903424,1740904447,US -1740904448,1740904959,NZ -1740904960,1740907519,IN -1740907520,1740908543,US -1740908544,1740909055,PK -1740909056,1740910591,ID -1740910592,1740911615,CN -1740911616,1740912639,IN -1740912640,1740913663,PH -1740913664,1740915711,CN -1740915712,1740916735,AU -1740916736,1740917759,CN -1740917760,1740918783,IN -1740918784,1740920063,AU -1740920320,1740920831,HK -1740920832,1740923903,CN -1740923904,1740924927,HK -1740924928,1740925951,PH -1740925952,1740926463,NZ -1740926464,1740926719,IN -1740926720,1740926975,AU -1740926976,1740927999,SG -1740928000,1740928255,ID -1740928256,1740928511,IN -1740928512,1740929023,AU -1740929024,1740931071,HK -1740931072,1740932095,PH -1740932096,1740933119,IN -1740933120,1740934143,PH -1740934144,1740935167,SG -1740936192,1740937215,AU -1740938240,1740938495,AU -1740938496,1740938751,IN -1740938752,1740939263,TH -1740939264,1740940287,PK -1740941312,1740942335,CN -1740942336,1740943359,TW -1740944384,1740945407,US -1740946432,1740947967,IN -1740947968,1740948223,AU -1740948224,1740948479,MY -1740948480,1740950527,IN -1740950528,1740951551,CN -1740951552,1740957695,IN -1740957696,1740958719,BD -1740958720,1740959743,VN -1740959744,1740960767,NL -1740960768,1740962303,VN -1740962304,1740962559,TW -1740962560,1740962815,VN -1740962816,1740964863,SG -1740964864,1740965887,HK -1740965888,1740966399,IN -1740966400,1740966655,VN -1740966656,1740966911,HK -1740966912,1740967935,JP -1740967936,1740968959,IN -1740968960,1740969983,MY -1740969984,1740971007,HK -1740971008,1740975103,IN -1740975104,1740976127,PK -1740976128,1740976639,BD -1740976896,1740977151,IN -1740977152,1740977663,NZ -1740977664,1740977919,GB -1740977920,1740978175,NZ -1740978176,1740979199,MY -1740979200,1740980223,NZ -1740980224,1740981247,AU -1740981248,1740982271,HK -1740982272,1740985343,IN -1740985344,1740986367,PH -1740986368,1740986623,AU -1740986624,1740986879,ID -1740986880,1740987391,IN -1740987392,1740988415,ID -1740988416,1740989184,AU -1740989185,1740989439,SG -1740989440,1740990463,IN -1740990464,1740991487,KH -1740991488,1741000703,IN -1741000704,1741001727,AU -1741001728,1741002751,HK -1741002752,1741003775,BD -1741004800,1741005823,AU -1741005824,1741006847,MV -1741006848,1741007871,HK -1741007872,1741008895,TW -1741008896,1741009919,BT -1741009920,1741010943,CN -1741010944,1741011455,IN -1741011456,1741011967,AU -1741011968,1741012991,ID -1741012992,1741014015,HK -1741014016,1741015039,MM -1741015040,1741016063,PH -1741016064,1741017087,BD -1741017088,1741018111,JP -1741018112,1741019135,AU -1741019136,1741020159,HK -1741020160,1741022207,IN -1741022208,1741023231,CN -1741023232,1741025279,AU -1741025280,1741026303,IN -1741026304,1741027327,TH -1741027328,1741028351,BD -1741028352,1741028519,CN -1741028520,1741028520,HK -1741028521,1741028607,CN -1741029376,1741029631,SG -1741029632,1741029887,HK -1741029888,1741030399,BD -1741030400,1741031423,JP -1741031424,1741031935,NP -1741031936,1741032447,IN -1741032448,1741033471,JP -1741033472,1741033983,MY -1741033984,1741034495,HK -1741034496,1741035519,CN -1741035520,1741036031,AU -1741036544,1741037567,IN -1741037568,1741038079,AU -1741038080,1741038591,IN -1741038592,1741039615,JP -1741039616,1741040639,AU -1741040640,1741042687,HK -1741042688,1741043199,MY -1741043200,1741043711,AU -1741043712,1741044735,HK -1741044736,1741046783,CN -1741046784,1741047807,MY -1741047808,1741048831,CN -1741048832,1741049855,SG -1741049856,1741050367,IN -1741050368,1741050623,HK -1741050624,1741050879,IN -1741050880,1741051903,MY -1741051904,1741052927,PH -1741052928,1741053183,AU -1741053184,1741053439,ID -1741053952,1741055999,IN -1741056000,1741056511,NZ -1741056512,1741057023,AU -1741057024,1741058047,JP -1741058048,1741058559,AU -1741058560,1741061119,ID -1741061120,1741062143,CN -1741062144,1741062655,IN -1741062656,1741062911,AU -1741062912,1741063167,ID -1741063168,1741065215,BD -1741065216,1741067263,SG -1741067264,1741068287,MM -1741069312,1741070335,CN -1741070336,1741071359,JP -1741071360,1741072383,IN -1741072384,1741073407,BD -1741073408,1741074431,IN -1741074432,1741075455,TL -1741075456,1741076479,CN -1741076480,1741077247,NZ -1741077248,1741077503,IN -1741077504,1741079551,HK -1741079552,1741081599,CN -1741081600,1741082623,HK -1741082624,1741084671,JP -1741084672,1741092863,CN -1741092864,1741093887,HK -1741093888,1741094911,BD -1741094912,1741095423,NZ -1741095424,1741095935,ID -1741095936,1741115391,VN -1741115392,1741115647,AU -1741115648,1741115903,NZ -1741115904,1741116415,AU -1741116416,1741117439,BD -1741117440,1741119487,IN -1741119488,1741119743,AU -1741119744,1741120511,IN -1741120512,1741122559,HK -1741122560,1741123583,BD -1741123584,1741125119,IN -1741125120,1741125375,ID -1741125376,1741125631,AU -1741125632,1741128703,IN -1741128704,1741129727,JP -1741129728,1741130751,IN -1741131776,1741132799,IN -1741132800,1741133823,MY -1741133824,1741134847,BD -1741134848,1741136895,IN -1741136896,1741137919,CN -1741137920,1741138431,BD -1741138432,1741138943,TH -1741138944,1741145087,IN -1741145088,1741146111,CN -1741146112,1741150207,IN -1741150208,1741151231,MY -1741151232,1741152255,JP -1741152256,1741153279,IN -1741153280,1741154303,CN -1741154304,1741155327,BD -1741155328,1741156351,ID -1741156352,1741157375,IN -1741157376,1741158399,HK -1741158400,1741160447,CN -1741160448,1741161471,TW -1741161472,1741161727,SG -1741161728,1741162239,HK -1741162240,1741162495,ID -1741162496,1741164543,AU -1741164544,1741165567,ID -1741165568,1741167615,VN -1741167616,1741168639,HK -1741168640,1741169663,CN -1741169664,1741170687,BD -1741170688,1741173759,IN -1741173760,1741174783,CN -1741174784,1741175807,IN -1741175808,1741176831,VN -1741176832,1741178879,CN -1741178880,1741183999,IN -1741184000,1741185023,BD -1741185024,1741185279,HK -1741185280,1741185535,JP -1741185536,1741186047,HK -1741186048,1741188607,IN -1741188608,1741188863,US -1741188864,1741189119,IN -1741189120,1741191167,HK -1741191168,1741192191,VN -1741192192,1741193215,HK -1741193216,1741194239,ID -1741194240,1741195263,MM -1741195264,1741210623,CN -1741210624,1741211647,PK -1741211648,1741212415,TW -1741212416,1741212671,SG -1741213696,1741214719,SG -1741214720,1741215743,IN -1741215744,1741216767,SG -1741216768,1741232127,CN -1741232128,1741233151,HK -1741233152,1741243391,CN -1741243392,1741245439,HK -1741245440,1741257727,CN -1741257728,1741258751,IN -1741258752,1741259007,JP -1741259008,1741259263,HK -1741259264,1741259775,JP -1741259776,1741264895,IN -1741264896,1741303807,CN -1741303808,1741304831,HK -1741304832,1741305855,BD -1741305856,1741329407,CN -1741329408,1741330431,MH -1741330432,1741344767,CN -1741344768,1741345791,AU -1741345792,1741346815,CN -1741346816,1741347327,JP -1741347328,1741347583,PH -1741347584,1741347839,AU -1741347840,1741348863,BD -1741348864,1741349375,PH -1741349376,1741349631,IN -1741349632,1741349887,ID -1741349888,1741350911,CN -1741350912,1741351935,US -1741351936,1741366271,CN -1741366272,1741367295,IN -1741367296,1741368319,US -1741368320,1741369343,PK -1741369344,1741370367,HK -1741370368,1741372415,CN -1741372416,1741376511,IN -1741376512,1741377535,ID -1741377536,1741379583,IN -1741380352,1741380607,ID -1741380608,1741381631,BD -1741381632,1741390847,CN -1741390848,1741391871,MM -1741391872,1741392895,IN -1741392896,1741393919,CN -1741393920,1741394943,IN -1741394944,1741395967,HK -1741395968,1741396991,SG -1741396992,1741398015,JP -1741398016,1741398783,ID -1741398784,1741399039,AU -1741399040,1741401087,CN -1741401088,1741402111,IN -1741402112,1741403135,BD -1741403136,1741404159,HK -1741404160,1741405183,IN -1741405184,1741405439,NZ -1741405440,1741405695,ID -1741405696,1741406207,AU -1741406208,1741407231,CN -1741407232,1741408255,AU -1741408256,1741409279,CN -1741409280,1741411327,IN -1741411328,1741413375,CN -1741413376,1741413631,HK -1741413632,1741413887,SG -1741413888,1741414143,JP -1741414144,1741414399,HK -1741414400,1741423615,IN -1741423616,1741425663,MY -1741425664,1741425919,TH -1741425920,1741426175,JP -1741426176,1741426687,AU -1741426688,1741427711,MM -1741427712,1741428735,IN -1741428736,1741429759,CN -1741429760,1741436927,IN -1741436928,1741437951,JP -1741437952,1741438975,PH -1741438976,1741439999,JP -1741440000,1741440511,SG -1741440512,1741440767,IN -1741441024,1741442047,CN -1741442048,1741443071,HK -1741443072,1741445119,BD -1741445120,1741446143,CN -1741446144,1741446175,US -1741446176,1741447167,SG -1741447168,1741448191,HK -1741448192,1741449215,MM -1741449216,1741450239,AU -1741450240,1741451263,HK -1741451264,1741452287,CN -1741452544,1741452799,AU -1741452800,1741453055,ID -1741453056,1741455359,IN -1741455360,1741456383,BD -1741456384,1741457407,IN -1741457408,1741462527,CN -1741462528,1741466623,IN -1741466624,1741466879,JP -1741466880,1741467391,HK -1741467392,1741467647,JP -1741467648,1741469695,HK -1741469696,1741472767,IN -1741472768,1741473791,CN -1741473792,1741474815,BD -1741474816,1741475839,IN -1741475840,1741476863,BD -1741476864,1741477887,AU -1741477888,1741478655,IN -1741478656,1741478911,AU -1741478912,1741479935,NP -1741479936,1741480447,AU -1741480448,1741480959,NZ -1741480960,1741481471,AU -1741481472,1741481727,JP -1741481728,1741481983,IN -1741481984,1741484031,CN -1741484032,1741485055,AU -1741485056,1741486079,BD -1741486080,1741487103,NZ -1741487104,1741489151,HK -1741489152,1741490175,CN -1741490176,1741490687,HK -1741490688,1741490943,CN -1741490944,1741491199,HK -1741491200,1741492223,IN -1741492224,1741493247,LA -1741493248,1741494271,HK -1741494272,1741495295,KH -1741495296,1741497343,AU -1741497856,1741498111,NZ -1741498112,1741498367,IN -1741498368,1741500415,CN -1741500416,1741501439,JP -1741501440,1741502463,CN -1741502464,1741502975,ID -1741502976,1741503487,BD -1741503488,1741505535,IN -1741505536,1741506559,BD -1741506560,1741507583,JP -1741507584,1741508607,SG -1741508608,1741508863,AU -1741508864,1741509119,SG -1741509120,1741509375,ID -1741509376,1741509631,IN -1741509632,1741510655,US -1741510656,1741511679,JP -1741511680,1741512703,IN -1741512704,1741515775,VN -1741515776,1741516799,CN -1741516800,1741517823,IN -1741517824,1741519871,CN -1741519872,1741521919,IN -1741521920,1741522943,BD -1741522944,1741523967,CN -1741523968,1741528063,IN -1741528064,1741529087,PH -1741529088,1741529599,TH -1741529600,1741529855,CN -1741529856,1741530111,IN -1741530112,1741531135,HK -1741531136,1741532159,JP -1741532160,1741533183,IN -1741533184,1741534207,PK -1741534208,1741535231,BD -1741535232,1741535487,JP -1741535488,1741535743,IN -1741535744,1741536255,SG -1741536256,1741540351,CN -1741540352,1741541375,AU -1741541376,1741542399,MY -1741542400,1741546495,IN -1741546496,1741547519,AU -1741547520,1741548543,BD -1741548544,1741549567,CN -1741549568,1741550591,HK -1741550592,1741551103,IN -1741551104,1741551615,AU -1741551616,1741554687,CN -1741554688,1741557759,IN -1741557760,1741558783,CA -1741558784,1741559807,HK -1741559808,1741560831,SG -1741560832,1741561087,AU -1741561088,1741561855,SG -1741561856,1741562879,NZ -1741562880,1741563903,HK -1741563904,1741564927,SG -1741564928,1741565951,CN -1741565952,1741572607,IN -1741572608,1741573119,KR -1741573120,1741574143,JP -1741574144,1741575167,PH -1741575168,1741576191,US -1741576192,1741577215,JP -1741577216,1741578239,HK -1741578240,1741578751,IN -1741578752,1741579007,SG -1741579008,1741581311,IN -1741581312,1741582335,CN -1741582336,1741584383,IN -1741584384,1741586431,HK -1741586432,1741591551,IN -1741591552,1741592575,CN -1741592576,1741593087,MN -1741593600,1741594111,HK -1741594368,1741596671,IN -1741596672,1741597695,ID -1741597696,1741597951,IN -1741597952,1741598207,MM -1741598208,1741600767,IN -1741600768,1741601279,BD -1741601280,1741601535,ID -1741601536,1741601791,AU -1741601792,1741602815,HK -1741602816,1741603839,MN -1741603840,1741604863,JP -1741604864,1741605887,KH -1741605888,1741606911,TH -1741606912,1741607935,IN -1741607936,1741609983,VN -1741609984,1741612031,IN -1741612032,1741613055,BD -1741613056,1741614079,HK -1741614080,1741615103,AU -1741615104,1741617151,ID -1741617152,1741618175,IN -1741618176,1741619199,ID -1741619200,1741623295,IN -1741623296,1741623551,NZ -1741623552,1741623807,IN -1741623808,1741624063,AU -1741624064,1741624319,MY -1741624320,1741625343,JP -1741625344,1741626367,HK -1741626368,1741627391,AU -1741627392,1741629439,VN -1741629440,1741631487,IN -1741631488,1741632511,CN -1741632512,1741636607,IN -1741636608,1741637631,HK -1741637632,1741638655,MY -1741638656,1741639679,NZ -1741639680,1741640703,NP -1741640704,1741641727,PK -1741642752,1741643007,AU -1741643008,1741643263,HK -1741643264,1741643775,AU -1741643776,1741644799,ID -1741644800,1741645311,IN -1741645312,1741645567,AU -1741645568,1741645823,IN -1741645824,1741646847,CN -1741646848,1741647871,SG -1741647872,1741648895,KH -1741648896,1741649919,HK -1741649920,1741658111,IN -1741658112,1741658623,BD -1741658624,1741659135,AU -1741659136,1741659647,SG -1741659648,1741659903,PH -1741659904,1741660159,HK -1741660160,1741661183,US -1741661184,1741662207,CN -1741662208,1741666303,IN -1741666304,1741674495,CN -1741674496,1741675519,JP -1741675520,1741676543,CN -1741676544,1741677567,IN -1741677568,1741679615,CN -1741679616,1741680639,ID -1741680640,1741683711,IN -1741683712,1741684735,TW -1741684736,1741685247,HK -1741685248,1741685503,AU -1741685504,1741685759,SG -1741685760,1741686783,AU -1741686784,1741687807,HK -1741687808,1741689855,CN -1741689856,1741690367,IN -1741690368,1741690623,AU -1741690624,1741690879,ID -1741690880,1741691903,TH -1741691904,1741692927,CN -1741692928,1741693951,HK -1741693952,1741694975,TL -1741694976,1741698047,CN -1741698048,1741706239,IN -1741706240,1741706751,SG -1741706752,1741707263,NZ -1741707264,1741708287,IN -1741708288,1741708799,AU -1741708800,1741709311,ID -1741709312,1741710335,JP -1741710336,1741711359,ID -1741711360,1741718527,IN -1741718528,1741719551,BD -1741719552,1741720063,ID -1741720064,1741720575,TH -1741720576,1741721599,NZ -1741721600,1741722623,IN -1741722624,1741723647,CN -1741723648,1741724415,IN -1741724416,1741724671,AU -1741724672,1741725695,IN -1741725696,1741726719,ID -1741726720,1741726975,NZ -1741726976,1741727743,AU -1741727744,1741729791,IN -1741729792,1741730815,HK -1741730816,1741731839,BD -1741731840,1741733887,AU -1741733888,1741734911,HK -1741734912,1741735423,TW -1741735424,1741735679,IN -1741735680,1741735935,AU -1741735936,1741736959,IN -1741736960,1741737983,ID -1741737984,1741739007,IN -1741739008,1741740031,TH -1741740032,1741741055,AU -1741741056,1741742079,JP -1741742080,1741747358,IN -1741747359,1741747359,NL -1741747360,1741749247,IN -1741749248,1741750527,SG -1741750528,1741750783,ID -1741750784,1741751807,AU -1741751808,1741752831,ID -1741752832,1741753087,NZ -1741753088,1741753343,BD -1741753344,1741754367,NZ -1741754368,1741755391,IN -1741755392,1741756415,BD -1741756416,1741756927,AU -1741756928,1741757439,IN -1741757440,1741758463,HK -1741759488,1741760511,IN -1741760512,1741761535,HK -1741761536,1741762559,AU -1741762560,1741763583,TH -1741763584,1741764095,PK -1741764096,1741764351,PG -1741764352,1741764607,AU -1741764608,1741765631,PH -1741765632,1741766655,HK -1741766656,1741768703,IN -1741768704,1741769727,AU -1741769728,1741770239,GB -1741770240,1741770495,PK -1741770496,1741770751,PR -1741770752,1741771775,BD -1741771776,1741772799,PK -1741772800,1741774591,IN -1741774592,1741774847,ID -1741774848,1741775359,IN -1741775360,1741775615,ID -1741775616,1741775871,IN -1741775872,1741776895,HK -1741776896,1741777919,MY -1741778432,1741778943,IN -1741778944,1741779967,CN -1741779968,1741780991,JP -1741780992,1741782015,SG -1741782016,1741783039,AU -1741783040,1741783551,SG -1741783552,1741784063,ID -1741784064,1741785087,IN -1741785088,1741786111,CN -1741786112,1741788159,IN -1741788160,1741789183,JP -1741789184,1741789695,AU -1741790208,1741791231,MY -1741791232,1741792255,AU -1741792256,1741794303,SG -1741794304,1741795327,KR -1741795328,1741797375,IN -1741797376,1741798399,ID -1741798400,1741798911,AU -1741798912,1741799167,SG -1741799168,1741799423,AU -1741799424,1741800447,NZ -1741800448,1741801471,BD -1741801472,1741802495,CN -1741802496,1741803519,IN -1741803520,1741804543,CN -1741804544,1741805567,IN -1741805568,1741806591,CN -1741806592,1741807615,IN -1741807616,1741808639,NZ -1741808640,1741809663,BD -1741809664,1741810687,HK -1741810688,1741811711,JP -1741811712,1741812223,IN -1741812224,1741813759,AU -1741813760,1741814783,ID -1741814784,1741815807,JP -1741815808,1741816831,CN -1741816832,1741817855,PK -1741817856,1741818367,PH -1741818368,1741819902,AU -1741819903,1741819903,PK -1741819904,1741820927,BD -1741820928,1741821951,CN -1741821952,1741822975,AU -1741822976,1741824511,IN -1741824512,1741825023,ID -1741825024,1741830143,IN -1741830144,1741832191,BD -1741832192,1741833215,IN -1741834240,1741835263,IN -1741835264,1741836287,AU -1741836288,1741837311,IN -1741837312,1741838335,JP -1741838336,1741840383,IN -1741840384,1741841407,CN -1741841408,1741842687,IN -1741842688,1741842943,ID -1741842944,1741843455,IN -1741843456,1741844479,JP -1741844480,1741844991,IN -1741845504,1741847551,ID -1741847552,1741848063,AU -1741849600,1741850623,IN -1741850624,1741851647,AU -1741851648,1741853695,IN -1741853696,1741854719,AU -1741854720,1741855231,TH -1741855232,1741855743,AU -1741855744,1741864959,CN -1741864960,1741865215,AU -1741865216,1741865471,ID -1741865472,1741869055,IN -1741869056,1741869311,NZ -1741869312,1741869567,AU -1741869568,1741869823,DE -1741869824,1741870079,NZ -1741870080,1741871103,SG -1741871104,1741872127,CN -1741872128,1741872383,HK -1741872384,1741872639,IN -1741872640,1741872895,PH -1741872896,1741873151,AU -1741873152,1741874175,IN -1741874176,1741875199,ID -1741875200,1741879295,HK -1741879296,1741879807,AU -1741879808,1741880063,IN -1741880064,1741880319,AU -1741880320,1741881343,IN -1741881344,1741882367,US -1741882368,1741882879,IN -1741882880,1741883391,AU -1741883392,1741887487,IN -1741887488,1741887999,NZ -1741888000,1741888255,IN -1741888256,1741888511,US -1741888512,1741889535,BD -1741889536,1741890559,HK -1741890560,1741892607,IN -1741892608,1741893631,CN -1741893632,1741893887,AU -1741893888,1741894655,ID -1741894656,1741897727,IN -1741897728,1741898751,SG -1741898752,1741899775,HK -1741899776,1741900799,JP -1741900800,1741902335,IN -1741902336,1741902847,ID -1741902848,1741904895,IN -1741904896,1741905919,HK -1741905920,1741907967,CN -1741907968,1741911039,IN -1741911040,1741911551,JP -1741911552,1741912063,SG -1741912064,1741913087,NZ -1741913088,1741914111,HK -1741914112,1741917183,IN -1741917184,1741917951,AU -1741917952,1741918207,ID -1741918208,1741918463,IT -1741918464,1741918591,ES -1741918592,1741918719,PT -1741918720,1741918847,SI -1741918848,1741918975,GR -1741918976,1741919103,CZ -1741919104,1741919231,HU -1741919232,1741920255,NP -1741920256,1741921279,IN -1741921280,1741922303,CN -1741922304,1741923327,US -1741923328,1741923583,TH -1741923584,1741923839,CN -1741923840,1741924095,TH -1741924096,1741925375,CN -1741925376,1741925631,AU -1741925632,1741925887,HK -1741925888,1741926399,PH -1741926400,1741927423,IN -1741927424,1741928447,US -1741928448,1741928959,BD -1741928960,1741930495,IN -1741930496,1741931519,CN -1741931520,1741932031,IN -1741932032,1741932287,HK -1741932288,1741932543,AU -1741934592,1741935615,AU -1741935616,1741936639,VN -1741936640,1741937151,IN -1741937152,1741937663,SC -1741937664,1741940479,CN -1741940480,1741940735,HK -1741940736,1741941759,ID -1741941760,1741942271,HK -1741942272,1741942527,AU -1741942528,1741942783,MY -1741942784,1741943807,AU -1741943808,1741944831,HK -1741944832,1741945855,CN -1741945856,1741946879,US -1741946880,1741950975,CN -1741950976,1741953023,IN -1741953024,1741954047,GU -1741954048,1741955071,IN -1741955072,1741956095,HK -1741956096,1741957119,TH -1741957120,1741957375,PG -1741957376,1741957631,MY -1741957632,1741957887,AU -1741957888,1741958143,ID -1741958144,1741960191,CN -1741960192,1741961215,NZ -1741961216,1741961471,HK -1741961472,1741961727,JP -1741961728,1741962239,HK -1741962240,1741963263,SG -1741963264,1741963775,NP -1741963776,1741964287,AU -1741964288,1741965311,MY -1741965312,1741966335,HK -1741966336,1741967359,JP -1741967360,1741968383,BD -1741968384,1741969407,CN -1741969408,1741971455,IN -1741971456,1741972479,HK -1741972480,1741975551,CN -1741975552,1741976575,AU -1741976576,1741977599,MN -1741977600,1741978111,IN -1741978112,1741978367,AU -1741978368,1741978623,NZ -1741978624,1741979647,KR -1741979648,1741984767,IN -1741984768,1741985791,CN -1741985792,1741987839,IN -1741988864,1741989887,CN -1741989888,1741990143,GB -1741990144,1741990911,SG -1741991936,1741992191,MY -1741992192,1741992447,IN -1741992960,1741993983,TH -1741993984,1741995007,HK -1741995008,1741996031,JP -1741996032,1741996543,NZ -1741996544,1741997055,AU -1741997056,1741999103,CN -1741999104,1742000639,IN -1742000640,1742000895,AU -1742000896,1742001151,ID -1742001152,1742002175,IN -1742002176,1742003199,AU -1742003200,1742004223,KR -1742004224,1742004479,NZ -1742004480,1742004991,AU -1742004992,1742005247,NZ -1742005248,1742006271,CN -1742006272,1742007039,ID -1742007040,1742007295,IN -1742007296,1742008319,ID -1742008320,1742009343,AU -1742009344,1742011391,KR -1742011392,1742012415,CN -1742012416,1742019583,IN -1742019584,1742020095,BD -1742020096,1742020351,MM -1742020352,1742020607,NP -1742020608,1742022655,IN -1742022656,1742038015,CN -1742038016,1742039039,AU -1742039040,1742040063,AF -1742040064,1742042111,PK -1742042112,1742043135,ID -1742043136,1742043647,AU -1742043648,1742044159,VN -1742044160,1742045183,NP -1742045184,1742046207,ID -1742046208,1742061567,CN -1742061568,1742062591,IN -1742063616,1742063871,AU -1742063872,1742064639,IN -1742064640,1742065663,TH -1742065664,1742070783,IN -1742070784,1742071039,MM -1742071040,1742071295,JP -1742071296,1742071807,MM -1742072832,1742074879,BD -1742074880,1742076927,HK -1742076928,1742077951,CN -1742077952,1742078975,BD -1742078976,1742079999,NL -1742080000,1742081023,VN -1742081024,1742082047,PH -1742082048,1742083071,HK -1742083072,1742083327,AU -1742083328,1742084095,IN -1742084096,1742085119,KR -1742085120,1742086143,AU -1742086144,1742087167,CN -1742087168,1742088191,JP -1742088192,1742088447,IN -1742088448,1742088703,HK -1742088704,1742089215,AU -1742089216,1742089727,IN -1742089728,1742090239,GB -1742090240,1742091263,CN -1742091264,1742092287,ID -1742092288,1742093311,HK -1742093312,1742095359,IN -1742095360,1742095615,KR -1742095616,1742095871,US -1742095872,1742096127,LT -1742096128,1742096383,AU -1742096384,1742097407,JP -1742097408,1742098431,NP -1742098432,1742099455,BD -1742099456,1742100479,CN -1742100480,1742101503,KR -1742101504,1742101759,DE -1742101760,1742102015,PL -1742102016,1742102271,AT -1742102272,1742102527,CH -1742103040,1742103295,AU -1742103296,1742104575,ID -1742104576,1742105599,NZ -1742105600,1742106623,US -1742106624,1742107135,ID -1742107136,1742108671,IN -1742108672,1742109183,ID -1742109184,1742113791,IN -1742113792,1742115839,HK -1742115840,1742116863,KH -1742116864,1742117887,JP -1742117888,1742118911,BD -1742119936,1742120959,HK -1742120960,1742121983,CN -1742121984,1742123007,HK -1742123008,1742123263,AU -1742123264,1742124031,IN -1742124032,1742125055,SG -1742125056,1742126079,ID -1742126080,1742127103,IN -1742127104,1742128127,HK -1742128128,1742129151,MY -1742129152,1742130175,BD -1742130176,1742130687,NZ -1742130688,1742132223,AU -1742132224,1742133247,CN -1742133248,1742134271,BD -1742134272,1742135295,AU -1742135296,1742136319,CN -1742136320,1742136575,FR -1742136576,1742136831,ID -1742136832,1742138367,IN -1742138368,1742139391,ID -1742139392,1742141439,CN -1742141440,1742142463,HK -1742142464,1742143487,SG -1742143488,1742146559,HK -1742146560,1742146815,AU -1742146816,1742147071,ID -1742147072,1742147327,SG -1742147328,1742147583,AU -1742147584,1742148607,ID -1742148608,1742149631,AU -1742149632,1742150655,ID -1742150656,1742153727,CN -1742153728,1742154751,HK -1742154752,1742156799,CN -1742156800,1742157823,IN -1742157824,1742158847,JP -1742158848,1742159871,SG -1742159872,1742160895,AU -1742160896,1742162431,ID -1742162432,1742162687,AU -1742162688,1742162943,PK -1742162944,1742164991,HK -1742164992,1742166015,JP -1742166016,1742167039,AU -1742167040,1742169087,IN -1742169088,1742172159,CN -1742172160,1742173183,IN -1742173184,1742175231,CN -1742175232,1742176255,HK -1742176256,1742177791,AU -1742177792,1742178303,IN -1742178304,1742179327,MY -1742179328,1742180351,CN -1742180352,1742181375,KR -1742181376,1742182399,IN -1742182400,1742183423,KR -1742183424,1742184447,IN -1742184448,1742185471,AU -1742185472,1742187519,IN -1742187520,1742188543,JP -1742188544,1742189567,ID -1742189568,1742190591,CA -1742190592,1742191615,CN -1742191616,1742192639,HK -1742192640,1742193663,MM -1742193664,1742197247,IN -1742197248,1742197759,AF -1742197760,1742198783,HK -1742198784,1742199807,NL -1742199808,1742200831,IR -1742200832,1742201855,IN -1742201856,1742202879,HK -1742202880,1742207999,IN -1742208000,1742209023,JP -1742209024,1742210047,IN -1742210048,1742221311,CN -1742221312,1742222335,KH -1742222336,1742223359,IN -1742223360,1742224383,BD -1742224384,1742225407,IR -1742225408,1742226431,CN -1742226432,1742227455,IN -1742227456,1742228479,VN -1742228480,1742230527,IN -1742230528,1742231039,SG -1742231040,1742231295,IN -1742231296,1742231551,ID -1742231552,1742233599,IN -1742233600,1742234111,TH -1742234112,1742234623,IN -1742234624,1742235647,HK -1742235648,1742236671,PK -1742236672,1742237695,CN -1742237696,1742242815,VN -1742242816,1742243071,NZ -1742243072,1742243327,AU -1742243328,1742243583,HK -1742243584,1742243839,PK -1742243840,1742244863,CN -1742244864,1742247935,IN -1742247936,1742248959,CN -1742248960,1742249983,IN -1742249984,1742250239,AF -1742250240,1742257151,IN -1742257152,1742257407,ID -1742257408,1742257663,NZ -1742257664,1742258175,AU -1742258176,1742259199,US -1742259200,1742260223,AU -1742260224,1742260735,IN -1742260736,1742261247,KR -1742261248,1742264319,IN -1742264320,1742265343,HK -1742265344,1742266367,AU -1742266368,1742268415,CN -1742268416,1742270463,IN -1742270464,1742290943,CN -1742290944,1742293503,IN -1742293504,1742294015,AU -1742294016,1742298111,IN -1742298112,1742299135,MY -1742299136,1742299647,NZ -1742300160,1742301183,AU -1742301184,1742301695,BD -1742301696,1742302207,AU -1742302208,1742304255,BD -1742304256,1742314495,IN -1742314496,1742315519,MM -1742315520,1742316543,HK -1742316544,1742317567,AU -1742317568,1742318591,CN -1742318592,1742319103,ID -1742319104,1742319615,AU -1742319616,1742320639,PK -1742320640,1742327807,CN -1742327808,1742328831,ID -1742328832,1742329855,IN -1742329856,1742330879,ID -1742330880,1742331903,IN -1742331904,1742332927,HK -1742332928,1742338047,IN -1742338048,1742338303,AU -1742338304,1742338559,IN -1742338560,1742339071,AU -1742339072,1742339327,US -1742339328,1742339583,SG -1742339584,1742339839,AU -1742339840,1742340095,US -1742340096,1742341119,CN -1742341120,1742342143,HK -1742342144,1742346239,CN -1742346240,1742347263,BD -1742347264,1742364671,CN -1742364672,1742365695,PH -1742365696,1742366719,IN -1742367744,1742380031,IN -1742380032,1742382079,KR -1742382080,1742382335,BD -1742382336,1742383103,ID -1742383104,1742387199,IN -1742387200,1742388223,CN -1742388224,1742389247,BD -1742389248,1742396415,CN -1742396416,1742397439,SG -1742397440,1742401535,IN -1742401536,1742402559,HK -1742402560,1742407167,IN -1742407168,1742407423,ID -1742407424,1742407679,AU -1742407680,1742410751,IN -1742410752,1742411263,SG -1742411264,1742411775,GB -1742411776,1742415871,CN -1742415872,1742419967,IN -1742419968,1742420991,HK -1742420992,1742421503,IN -1742421504,1742422015,AU -1742422016,1742423039,CN -1742423040,1742424063,PH -1742424064,1742425343,ID -1742425344,1742425599,US -1742425600,1742426111,SG -1742426112,1742427135,HK -1742427136,1742432255,CN -1742432256,1742433279,HK -1742433280,1742434303,MM -1742434304,1742434559,ID -1742434560,1742434815,NZ -1742434816,1742435327,BD -1742435328,1742436351,MY -1742436352,1742437375,AU -1742437376,1742439423,KR -1742439424,1742442495,IN -1742442496,1742443263,AU -1742443264,1742443519,BD -1742443520,1742444543,IN -1742444544,1742445567,NL -1742445568,1742446591,MM -1742446592,1742447615,BD -1742447616,1742448639,IN -1742448640,1742449663,BD -1742449664,1742450687,HK -1742450688,1742451711,CN -1742451712,1742452735,VN -1742452736,1742453759,CN -1742453760,1742454783,PH -1742454784,1742455295,HK -1742455296,1742455551,US -1742455552,1742455807,HK -1742455808,1742456063,TH -1742456064,1742456831,ID -1742456832,1742460415,IN -1742460416,1742460671,AU -1742460672,1742461951,IN -1742461952,1742462975,US -1742464000,1742465023,IN -1742465024,1742466047,BD -1742466048,1742466559,MY -1742466560,1742467071,IN -1742467072,1742467583,AU -1742467584,1742469119,IN -1742469120,1742470399,ID -1742470400,1742470655,IN -1742470656,1742471167,ID -1742471168,1742472191,IN -1742472192,1742473215,MY -1742473216,1742474239,HK -1742474240,1742482431,IN -1742482432,1742482687,NZ -1742482688,1742483199,AU -1742483200,1742483455,ID -1742483456,1742488575,CN -1742488576,1742489599,VN -1742489600,1742491647,HK -1742491648,1742492671,IN -1742492672,1742493695,VN -1742493696,1742494719,IN -1742494720,1742499839,CN -1742499840,1742500863,ID -1742500864,1742511103,CN -1742511104,1742512127,IN -1742512128,1742523391,CN -1742523392,1742524415,BD -1742524416,1742528767,IN -1742528768,1742529279,AU -1742529280,1742532607,IN -1742532608,1742550015,CN -1742550016,1742551039,BD -1742551040,1742551295,NL -1742551296,1742551551,BE -1742551552,1742551807,DK -1742551808,1742552063,NO -1742552064,1742553087,MY -1742553088,1742554111,JP -1742554112,1742558207,IN -1742558208,1742558719,AU -1742558720,1742558975,VN -1742558976,1742559231,AU -1742559232,1742589951,CN -1742589952,1742590975,IN -1742590976,1742596095,VN -1742596096,1742597119,IN -1742597120,1742598143,AU -1742598144,1742599167,SG -1742599168,1742599423,IN -1742599424,1742599679,AU -1742599680,1742600191,PK -1742600192,1742601215,IN -1742601216,1742602239,BD -1742602240,1742607359,CN -1742607360,1742608383,BD -1742608384,1742662655,CN -1742662656,1742663167,MY -1742663168,1742663423,SG -1742663424,1742663679,ID -1742663680,1742665727,CN -1742665728,1742666751,TW -1742666752,1742667775,IN -1742667776,1742668799,ID -1742668800,1742669823,VN -1742669824,1742671871,IN -1742671872,1742702591,CN -1742702592,1742703615,AU -1742703616,1742714879,CN -1742714880,1742715903,AU -1742715904,1742734335,CN -1742734336,1742735359,IN -1742735360,1742736383,JP -1742736384,1742737407,PK -1742737408,1742738431,CN -1742738432,1742738687,HK -1742738688,1742738943,AU -1742738944,1742739455,AE -1742739456,1742740479,IN -1742740480,1742741503,KH -1742741504,1742743551,IN -1742743552,1742745599,CN -1742745600,1742745855,IN -1742745856,1742746111,AU -1742746112,1742746623,IN -1742746624,1742747135,AU -1742747136,1742747391,IN -1742747648,1742748671,HK -1742748672,1742749695,CN -1742749696,1742750719,ID -1742750720,1742751743,IN -1742751744,1742752767,HK -1742752768,1742753791,NZ -1742753792,1742754815,HK -1742754816,1742756863,AU -1742757888,1742758911,BN -1742758912,1742759935,ID -1742759936,1742760191,AU -1742760192,1742760447,IN -1742760448,1742760703,HK -1742760704,1742760959,NZ -1742760960,1742761983,IN -1742761984,1742763007,AU -1742763008,1742764031,SG -1742764032,1742764287,AU -1742764288,1742764543,SG -1742764544,1742765055,AU -1742765824,1742766079,AF -1742766080,1742767103,NZ -1742767104,1742768127,TW -1742768128,1742769663,ID -1742769664,1742769919,AU -1742769920,1742770175,JP -1742770176,1742774271,IN -1742774272,1742774527,AU -1742774528,1742774783,NZ -1742774784,1742775295,AU -1742775296,1742776319,SG -1742776320,1742777343,VN -1742778368,1742779647,ID -1742779648,1742779903,IN -1742779904,1742780415,AU -1742780416,1742782463,IN -1742782464,1742783487,TW -1742783488,1742784511,MY -1742784512,1742786559,TW -1742786560,1742788095,AU -1742788096,1742788607,AF -1742788608,1742789631,IN -1742789632,1742793727,CN -1742793728,1742796799,IN -1742796800,1742797823,HK -1742797824,1742798847,JP -1742798848,1742799871,TW -1742799872,1742800895,NZ -1742800896,1742801919,HK -1742801920,1742802943,IN -1742802944,1742804991,HK -1742804992,1742807039,IN -1742807040,1742808063,AU -1742808064,1742809087,PH -1742809088,1742810111,IN -1742810112,1742810623,AU -1742810624,1742811135,IN -1742811136,1742812159,PK -1742812160,1742813183,JP -1742813184,1742815231,IN -1742815232,1742815743,SG -1742815744,1742815999,ID -1742816000,1742817279,AU -1742817280,1742818815,IN -1742818816,1742819327,KH -1742819328,1742820351,JP -1742820352,1742821375,CN -1742821376,1742822399,ID -1742822400,1742823423,BD -1742823424,1742823679,AU -1742823680,1742823935,IN -1742823936,1742824191,ID -1742824192,1742826495,IN -1742826496,1742827519,HK -1742827520,1742828543,IN -1742828544,1742829567,BS -1742829568,1742830591,JP -1742830592,1742833663,IN -1742833664,1742834687,PH -1742834688,1742835711,AU -1742835712,1742836735,JP -1742836736,1742837759,ID -1742837760,1742838783,JP -1742838784,1742841855,AU -1742841856,1742842367,TH -1742842368,1742843391,ID -1742843392,1742843647,IN -1742843648,1742843903,ID -1742843904,1742845951,IN -1742845952,1742846463,ID -1742846464,1742846975,AU -1742846976,1742847999,IN -1742848000,1742849023,JP -1742849024,1742850047,HK -1742850048,1742851071,NL -1742851072,1742852095,IN -1742852096,1742852607,ID -1742852608,1742853119,NZ -1742853120,1742854143,HK -1742854144,1742855167,AF -1742855168,1742856191,PK -1742856192,1742857215,IN -1742857216,1742858239,BD -1742858240,1742859263,AU -1742859264,1742860287,VN -1742860288,1742860799,AU -1742860800,1742861055,ID -1742861312,1742862335,NP -1742862336,1742862847,IN -1742862848,1742863359,HK -1742864384,1742866431,IN -1742866432,1742867199,AU -1742867200,1742867455,IN -1742867456,1742868479,PH -1742868480,1742869503,CN -1742869504,1742870015,IN -1742870016,1742870527,VU -1742870528,1742872575,IN -1742872576,1742873343,NZ -1742873344,1742873599,AU -1742873600,1742873855,NZ -1742873856,1742874623,PH -1742874624,1742875647,CN -1742875648,1742876671,JP -1742876672,1742877695,ID -1742877696,1742877951,IN -1742877952,1742878207,AU -1742878208,1742878463,JP -1742878464,1742878719,ID -1742878720,1742880767,CN -1742880768,1742881791,NZ -1742881792,1742882815,AU -1742882816,1742884863,KR -1742884864,1742885887,CN -1742885888,1742887935,IN -1742887936,1742888959,HK -1742888960,1742889983,KR -1742889984,1742891007,TW -1742891008,1742892031,AU -1742892032,1742893055,VN -1742893056,1742894079,NZ -1742894080,1742895103,CN -1742895104,1742895615,SG -1742895616,1742895871,BD -1742895872,1742896127,AU -1742896128,1742897151,HK -1742897152,1742898175,AU -1742898176,1742899199,CN -1742899200,1742900223,ID -1742900224,1742903295,IN -1742903296,1742904319,HK -1742904320,1742905343,CN -1742905344,1742907391,AU -1742907392,1742908415,IN -1742908416,1742908927,SG -1742908928,1742909183,ID -1742909184,1742909439,IN -1742909440,1742910463,AU -1742910464,1742911487,CN -1742911488,1742914559,IN -1742914560,1742915583,CN -1742915584,1742918655,IN -1742918656,1742919679,TW -1742919680,1742920191,PK -1742920192,1742920447,ID -1742920448,1742921727,AU -1742921728,1742923775,IN -1742923776,1742924799,ID -1742924800,1742926847,IN -1742926848,1742927359,AU -1742927360,1742927615,SG -1742927616,1742927871,AU -1742927872,1742928895,VN -1742928896,1742929919,NZ -1742929920,1742930431,IN -1742930432,1742930943,PH -1742930944,1742931967,GB -1742931968,1742932991,JP -1742932992,1742933503,SG -1742933504,1742933759,ID -1742933760,1742934015,NZ -1742934016,1742935039,AF -1742935040,1742938111,AU -1742938112,1742939135,TW -1742939136,1742940159,IN -1742940160,1742941183,JP -1742941184,1742942207,PH -1742942208,1742943231,CN -1742943232,1742945279,IN -1742945280,1742945791,AU -1742945792,1742946047,IN -1742946048,1742947327,AU -1742947328,1742948351,IN -1742948352,1742951423,CN -1742951424,1742952703,HK -1742952704,1742952704,SG -1742952705,1742953471,HK -1742954496,1742955519,IN -1742955520,1742956543,CN -1742956544,1742957567,HK -1742957568,1742958591,AU -1742958592,1742959615,VN -1742959616,1742960639,IN -1742960640,1742961663,CN -1742961664,1742962687,IN -1742962688,1742963711,HK -1742963712,1742965759,CN -1742965760,1742966015,MY -1742966016,1742968319,ID -1742968320,1742970879,IN -1742970880,1742971903,JP -1742971904,1742972927,SG -1742972928,1742973439,AU -1742973440,1742973951,NZ -1742973952,1742974975,KH -1742974976,1742975999,SG -1742976000,1742977023,AU -1742978048,1742979071,JP -1742979072,1742980095,HK -1742980096,1742981119,CN -1742981120,1742982143,AU -1742982144,1742983167,CN -1742983168,1742984191,IN -1742984192,1742985215,CN -1742985216,1742986239,VN -1742986240,1742987263,ID -1742987264,1742988287,TW -1742988288,1742989311,CN -1742989312,1742989567,AU -1742989568,1742989823,PH -1742989824,1742990335,AU -1742990336,1742991359,IN -1742991360,1742992383,ID -1742992384,1742993407,LK -1742994432,1742995455,ID -1742995456,1742996479,BD -1742996480,1742997503,TH -1742997504,1742998527,US -1742998528,1742999551,CN -1742999552,1742999807,AU -1742999808,1743000063,ID -1743000320,1743000575,IN -1743000576,1743001599,VN -1743001600,1743002623,ID -1743002624,1743003647,CN -1743003648,1743007743,IN -1743008000,1743008255,BD -1743008256,1743008767,IN -1743008768,1743010815,MY -1743010816,1743011839,JP -1743011840,1743012863,HK -1743012864,1743013887,CN -1743013888,1743015935,IN -1743015936,1743016447,ID -1743016448,1743016703,HK -1743016704,1743017983,IN -1743017984,1743019007,CN -1743019008,1743020031,HK -1743020032,1743020287,KR -1743020288,1743020543,BE -1743020544,1743020799,AU -1743020800,1743021055,HK -1743021056,1743021311,SG -1743021312,1743021567,NZ -1743021568,1743021823,PH -1743021824,1743022079,IN -1743022080,1743023103,US -1743023104,1743024127,HK -1743024128,1743025151,IN -1743025152,1743026175,ID -1743026176,1743027199,BD -1743027200,1743028223,AU -1743028224,1743029247,CN -1743029248,1743029503,IN -1743029504,1743029759,AU -1743029760,1743030271,BD -1743030272,1743031295,CN -1743031296,1743035391,IN -1743035392,1743036415,PK -1743036416,1743037439,CN -1743037440,1743038463,AU -1743038464,1743039487,HK -1743039488,1743040511,IN -1743040512,1743041535,CN -1743041536,1743042559,HK -1743042560,1743043583,IN -1743043584,1743044607,AU -1743044608,1743045119,IN -1743045120,1743045631,AU -1743045632,1743046655,JP -1743046656,1743047679,BD -1743047680,1743049727,CN -1743049728,1743050751,AU -1743050752,1743051775,TW -1743051776,1743052799,IN -1743052800,1743053823,US -1743053824,1743055871,CN -1743055872,1743059199,ID -1743059200,1743059967,IN -1743059968,1743060991,LA -1743061248,1743061503,AU -1743061504,1743062015,IN -1743062016,1743062271,AU -1743062272,1743062527,IN -1743062528,1743063039,AU -1743063040,1743064063,SG -1743064064,1743064575,ID -1743065088,1743065599,TW -1743065600,1743066111,IN -1743066112,1743067135,CN -1743067136,1743068159,IN -1743068160,1743069183,HK -1743069184,1743070207,MY -1743070208,1743071231,US -1743071232,1743072255,VN -1743072256,1743073279,BD -1743073280,1743073791,AU -1743073792,1743074047,TW -1743074048,1743074303,IN -1743075328,1743076351,MY -1743076352,1743077375,CN -1743077376,1743078399,IN -1743078400,1743079423,HK -1743079424,1743080959,ID -1743080960,1743081471,IN -1743081472,1743083519,BD -1743083520,1743084543,SG -1743084544,1743085567,TH -1743085568,1743085823,SG -1743086080,1743086591,NZ -1743086592,1743087615,TW -1743087616,1743088639,PH -1743088640,1743089663,TH -1743089664,1743090687,MY -1743090688,1743091711,HK -1743091712,1743092735,MN -1743092736,1743093759,TW -1743093760,1743094015,SG -1743094016,1743094271,IN -1743094272,1743094527,NZ -1743094784,1743095807,TW -1743095808,1743096831,CN -1743096832,1743098879,HK -1743098880,1743099903,CN -1743099904,1743100927,AU -1743100928,1743101951,KR -1743101952,1743103999,ID -1743104000,1743105023,IN -1743105024,1743106047,CN -1743106048,1743107071,MN -1743107072,1743108095,HK -1743108096,1743108607,IN -1743108608,1743108863,SG -1743108864,1743109119,AU -1743110144,1743111167,VN -1743111168,1743111423,SG -1743111424,1743111679,MY -1743111680,1743111935,ID -1743111936,1743112191,HK -1743112192,1743113215,ID -1743113216,1743114239,SG -1743114240,1743115263,IN -1743115264,1743118335,CN -1743118336,1743119359,IN -1743119360,1743120383,CN -1743121408,1743123455,CN -1743123456,1743124479,IN -1743124480,1743124991,NZ -1743124992,1743125503,IN -1743125504,1743126527,JP -1743126528,1743127551,CN -1743127552,1743128575,BD -1743128576,1743129599,PH -1743129600,1743130367,HK -1743130368,1743130623,JP -1743130624,1743131647,BD -1743131648,1743132671,IN -1743132672,1743133695,JP -1743133696,1743134719,CN -1743134720,1743134975,HK -1743134976,1743135231,IN -1743135232,1743135743,HK -1743135744,1743136767,SG -1743136768,1743138815,CN -1743138816,1743139327,ID -1743139328,1743139839,SG -1743139840,1743140863,IN -1743140864,1743141887,MY -1743141888,1743142911,BD -1743142912,1743143935,BN -1743143936,1743144959,US -1743144960,1743145983,AU -1743145984,1743147007,NZ -1743147008,1743147263,AU -1743147264,1743147519,NZ -1743147776,1743148031,ID -1743148032,1743149055,IN -1743149056,1743150079,KR -1743151104,1743152127,CN -1743152128,1743152383,ID -1743152384,1743153151,IN -1743153152,1743154175,BD -1743154176,1743155199,HK -1743155200,1743156223,KR -1743156224,1743157247,PH -1743157248,1743158271,HK -1743158272,1743159295,MY -1743160320,1743161343,TH -1743161344,1743162367,HK -1743162368,1743162623,AU -1743162624,1743162879,AQ -1743162880,1743163135,KR -1743163136,1743163391,BZ -1743163392,1743166463,IN -1743166464,1743167487,AU -1743167488,1743168511,HK -1743168512,1743169535,IN -1743169536,1743170559,JP -1743170560,1743171583,AU -1743172608,1743173631,BD -1743173632,1743174655,AU -1743174656,1743175679,ID -1743175680,1743176703,HK -1743176704,1743179775,CN -1743179776,1743180799,BD -1743180800,1743181823,CN -1743181824,1743182847,HK -1743182848,1743184895,IN -1743184896,1743185919,HK -1743185920,1743186943,SG -1743186944,1743187967,CN -1743187968,1743188991,HK -1743190016,1743190111,SG -1743190112,1743190119,IE -1743190120,1743191039,SG -1743191040,1743192063,AF -1743192064,1743195135,IN -1743195136,1743196159,HK -1743196160,1743198207,CN -1743198720,1743198975,AU -1743198976,1743199231,US -1743199232,1743200255,HK -1743200256,1743201279,IN -1743201280,1743202303,PH -1743202304,1743204351,IN -1743204352,1743205375,TW -1743205376,1743206399,SG -1743206400,1743207423,HK -1743207424,1743208447,KH -1743208448,1743210495,CN -1743210496,1743211519,JP -1743211520,1743212543,IN -1743212544,1743213567,ID -1743213568,1743214591,HK -1743214592,1743215103,AU -1743215104,1743215359,NZ -1743215360,1743215615,AU -1743215616,1743216639,MM -1743216640,1743217151,SG -1743217152,1743217663,JP -1743217664,1743218687,IN -1743218688,1743219711,HK -1743219712,1743221759,ID -1743221760,1743222783,IN -1743222784,1743223807,ID -1743223808,1743224831,IN -1743224832,1743225855,KR -1743225856,1743226367,IN -1743226368,1743226623,PH -1743226624,1743226879,BD -1743226880,1743227903,IR -1743227904,1743228927,HK -1743228928,1743229951,CN -1743229952,1743230975,VN -1743230976,1743231999,HK -1743232000,1743232511,NZ -1743232512,1743233023,AU -1743233024,1743234047,BD -1743234048,1743235071,HK -1743235072,1743235583,AU -1743235584,1743236095,ID -1743236096,1743237119,US -1743237120,1743238143,BD -1743238144,1743240191,CN -1743240192,1743241215,SG -1743241216,1743242239,JP -1743242240,1743244287,ID -1743244288,1743244799,AU -1743244800,1743245311,AF -1743245312,1743248383,IN -1743248384,1743248895,SG -1743248896,1743249407,IN -1743249408,1743250431,MY -1743250432,1743251455,BD -1743251456,1743252479,IN -1743252480,1743253503,JP -1743253504,1743254527,PH -1743254528,1743255551,CN -1743255552,1743256063,SE -1743256064,1743256319,SG -1743256320,1743256575,MY -1743256576,1743258623,HK -1743258624,1743259647,CN -1743259648,1743260671,IN -1743260672,1743261703,JP -1743261704,1743261711,PH -1743261712,1743262719,HK -1743262720,1743264767,IN -1743264768,1743265279,MY -1743265280,1743265535,ID -1743265536,1743265791,AU -1743265792,1743266303,ID -1743266304,1743267839,HK -1743267840,1743268863,TH -1743268864,1743269887,SG -1743269888,1743270911,MY -1743270912,1743273983,VN -1743273984,1743275007,ID -1743275008,1743276031,HK -1743276032,1743277055,JP -1743277056,1743278079,AU -1743278080,1743279103,LA -1743279104,1743281151,HK -1743281152,1743283199,AU -1743283200,1743284223,BD -1743284224,1743286271,NZ -1743286272,1743287295,IN -1743287296,1743288319,AU -1743288320,1743289343,VN -1743289344,1743291391,IN -1743291392,1743292415,AU -1743292416,1743292543,ID -1743292544,1743292671,HK -1743292672,1743292927,US -1743292928,1743293055,TH -1743293056,1743293183,JP -1743293184,1743293311,CH -1743293312,1743293439,AT -1743293440,1743293951,AU -1743293952,1743294463,MY -1743294464,1743295487,CN -1743295488,1743296511,IN -1743296512,1743297535,NP -1743297536,1743298303,NZ -1743298304,1743299583,AU -1743300608,1743301631,AU -1743301632,1743303679,IN -1743303680,1743304703,NZ -1743304704,1743305727,IN -1743305728,1743306751,CN -1743306752,1743307775,KH -1743307776,1743308799,AU -1743308800,1743309823,JP -1743309824,1743310335,NZ -1743310336,1743310847,US -1743310848,1743311871,AU -1743311872,1743312895,CN -1743312896,1743313663,AU -1743313664,1743313919,MY -1743313920,1743314943,HK -1743314944,1743315199,IN -1743315200,1743315455,PK -1743315456,1743315967,NZ -1743315968,1743316991,NP -1743316992,1743319039,IN -1743319040,1743319295,ID -1743319296,1743319551,IN -1743319552,1743320063,ID -1743320064,1743321087,IN -1743321088,1743323135,AU -1743323136,1743324159,MY -1743324160,1743325183,CN -1743325184,1743326207,HK -1743326208,1743328255,AU -1743328256,1743329279,NZ -1743329280,1743330303,IN -1743330304,1743331327,AU -1743331328,1743333375,PH -1743333376,1743334399,JP -1743334400,1743335423,CN -1743335424,1743336447,VN -1743336448,1743337471,CN -1743337472,1743338495,NP -1743338496,1743339519,NZ -1743339520,1743340543,IN -1743340544,1743341567,TW -1743341568,1743341823,HK -1743341824,1743342079,IN -1743342080,1743342591,AU -1743342592,1743343615,IN -1743343616,1743344639,TH -1743344640,1743345663,IN -1743345664,1743346687,ID -1743346688,1743347711,IN -1743347712,1743348735,HK -1743348736,1743348991,ID -1743348992,1743349247,IN -1743349248,1743349759,ID -1743349760,1743350783,CN -1743350784,1743351807,ID -1743351808,1743354111,IN -1743354112,1743354367,BD -1743354368,1743355903,IN -1743355904,1743356927,CN -1743356928,1743357951,NZ -1743357952,1743358975,CN -1743358976,1743359487,IN -1743359488,1743361023,ID -1743361024,1743362047,AU -1743362048,1743364095,ID -1743364096,1743364607,IN -1743365120,1743366143,HK -1743366144,1743367167,IN -1743367168,1743368191,SG -1743368192,1743369215,TH -1743369216,1743369727,MY -1743369728,1743369983,NP -1743369984,1743370239,AF -1743370240,1743371263,HK -1743371264,1743372287,MO -1743372288,1743373311,TH -1743373312,1743374335,JP -1743374336,1743375359,TH -1743375360,1743376383,MM -1743376384,1743377407,AU -1743377408,1743378431,JP -1743378432,1743379455,IN -1743379456,1743380479,NZ -1743380480,1743381503,AU -1743381504,1743382527,CN -1743382528,1743383551,HK -1743383552,1743384575,AU -1743384576,1743385087,SG -1743385088,1743385343,AU -1743385344,1743386623,IN -1743386624,1743388671,HK -1743388672,1743389695,CN -1743389696,1743390719,KR -1743390720,1743391743,HK -1743391744,1743391999,PK -1743392000,1743392767,AU -1743392768,1743393791,HK -1743393792,1743394815,CN -1743394816,1743395839,BD -1743397888,1743398911,VN -1743398912,1743399935,TW -1743399936,1743400959,JP -1743400960,1743401983,PG -1743401984,1743403007,HK -1743403008,1743404031,CN -1743404032,1743405055,AU -1743405056,1743407103,IN -1743407104,1743408127,HK -1743408128,1743410175,TW -1743410176,1743411199,SG -1743411200,1743412223,VN -1743412224,1743412479,AU -1743412480,1743412991,IN -1743413248,1743414271,HK -1743414272,1743415295,MY -1743415296,1743416319,SG -1743416320,1743417855,AU -1743417856,1743418879,IN -1743418880,1743419391,AU -1743419392,1743420415,ID -1743420416,1743422463,CN -1743422464,1743423487,NZ -1743423488,1743424511,IN -1743424512,1743425535,HK -1743425536,1743426559,PK -1743426560,1743426815,SG -1743426816,1743430399,IN -1743430400,1743430655,AU -1743430656,1743431679,BD -1743431680,1743432703,SG -1743432704,1743433727,CN -1743433728,1743434751,JP -1743434752,1743435775,CN -1743435776,1743437823,IN -1743437824,1743438335,BD -1743438336,1743438591,AU -1743438592,1743438847,ID -1743438848,1743439871,JP -1743439872,1743440895,BD -1743440896,1743441919,TW -1743441920,1743442943,ID -1743442944,1743443967,IN -1743443968,1743444991,ID -1743444992,1743446015,HK -1743446016,1743448063,TW -1743448064,1743449087,AU -1743449088,1743451135,IN -1743451136,1743452159,CN -1743452160,1743453183,AU -1743453184,1743454207,ID -1743454208,1743455231,IN -1743455232,1743456255,HK -1743456256,1743457279,IN -1743457280,1743458303,JP -1743458304,1743459327,CN -1743459328,1743459583,AU -1743459584,1743459839,ID -1743459840,1743460095,AU -1743460096,1743460351,IN -1743460352,1743461375,KR -1743461376,1743462399,MY -1743462400,1743463423,ID -1743463424,1743464447,AU -1743464448,1743465471,JP -1743465472,1743466495,HK -1743466496,1743467519,CN -1743467520,1743468543,AU -1743468544,1743470591,CN -1743470592,1743470847,IN -1743470848,1743471103,AU -1743471104,1743471615,ID -1743471616,1743472639,IN -1743472640,1743473663,ID -1743473664,1743474687,PK -1743474688,1743476735,CN -1743476736,1743477759,TW -1743477760,1743479807,AU -1743479808,1743480831,HK -1743480832,1743481855,IN -1743481856,1743482111,AU -1743482112,1743482367,ID -1743482368,1743482879,WF -1743482880,1743483903,JP -1743483904,1743484927,AU -1743484928,1743485951,IN -1743485952,1743486975,JP -1743486976,1743493119,CN -1743493120,1743493631,ID -1743493632,1743493887,AU -1743493888,1743495167,IN -1743496192,1743497215,IN -1743497216,1743499263,HK -1743499264,1743500287,AF -1743500288,1743501311,JP -1743501312,1743502335,CN -1743502336,1743503359,AU -1743503360,1743504383,CN -1743504384,1743505407,NP -1743505408,1743506431,CN -1743506432,1743506943,SG -1743506944,1743507455,IN -1743507456,1743509503,VN -1743509504,1743510527,HK -1743510528,1743545343,CN -1743545344,1743546367,HK -1743546368,1743549951,IN -1743549952,1743550207,AU -1743550208,1743550463,SG -1743550464,1743551487,CN -1743551488,1743552511,IN -1743552512,1743553535,JP -1743553536,1743554559,PK -1743554560,1743555583,HK -1743555584,1743557631,JP -1743557632,1743557887,SG -1743557888,1743558143,US -1743558144,1743558655,ID -1743558656,1743560703,IN -1743560704,1743561215,ID -1743561216,1743561727,AU -1743561728,1743564799,IN -1743564800,1743565823,PH -1743565824,1743566847,JP -1743566848,1743567871,CN -1743567872,1743569151,ID -1743569152,1743569919,IN -1743569920,1743570943,SG -1743570944,1743571199,IN -1743571200,1743571455,ID -1743571456,1743571967,AU -1743571968,1743574015,IN -1743574528,1743574783,US -1743575040,1743576063,HK -1743576064,1743577087,CN -1743577088,1743578111,JP -1743578112,1743579135,MY -1743579136,1743580159,CN -1743580160,1743581183,IN -1743581184,1743589375,CN -1743589376,1743590399,AU -1743590400,1743591423,KR -1743591424,1743593471,CN -1743593472,1743594495,ID -1743594496,1743595519,BD -1743595520,1743596543,NZ -1743596544,1743597567,IN -1743598592,1743599103,KH -1743599104,1743599615,US -1743599616,1743600639,IN -1743600640,1743602687,VN -1743602688,1743603711,CN -1743603712,1743604735,HK -1743604736,1743605759,BD -1743605760,1743606015,SG -1743606016,1743606527,AU -1743606528,1743606783,AF -1743607808,1743608831,CN -1743608832,1743609855,AU -1743609856,1743610879,VN -1743610880,1743611903,MO -1743611904,1743613951,AU -1743613952,1743615999,IN -1743616000,1743617023,JP -1743617024,1743618047,MO -1743618048,1743619071,HK -1743619072,1743619583,SG -1743619584,1743619839,ID -1743619840,1743620095,IN -1743620096,1743621119,AU -1743621120,1743621631,ID -1743621632,1743622143,SG -1743622144,1743624191,VN -1743624192,1743625215,CN -1743625216,1743626239,IN -1743626240,1743627263,AU -1743627264,1743628287,NZ -1743628288,1743628799,SG -1743628800,1743629055,IN -1743629056,1743629311,AU -1743629312,1743630335,IN -1743630336,1743652863,CN -1743652864,1743654911,IN -1743654912,1743666175,CN -1743666176,1743666431,NZ -1743666432,1743666687,IN -1743666688,1743666943,AU -1743666944,1743667199,BD -1743667200,1743672319,VN -1743672320,1743673343,NZ -1743673344,1743676415,CN -1743676416,1743677439,US -1743677440,1743679487,IN -1743680512,1743681535,TL -1743681536,1743682559,AU -1743682560,1743683583,MY -1743683584,1743683839,JP -1743683840,1743684095,AU -1743684096,1743684351,JP -1743684352,1743684607,AU -1743684608,1743685631,CN -1743685632,1743686655,ID -1743686656,1743688703,CN -1743688704,1743689727,MY -1743689728,1743690751,IN -1743690752,1743691263,AS -1743691264,1743691775,IN -1743691776,1743699967,CN -1743699968,1743700479,IN -1743700480,1743700735,NZ -1743700736,1743700991,AU -1743700992,1743702015,CN -1743702016,1743703039,ID -1743703040,1743704063,CN -1743704064,1743706111,VN -1743707136,1743708159,IN -1743708160,1743709183,HK -1743709184,1743711231,IN -1743711232,1743712255,JP -1743712256,1743713279,IN -1743713280,1743714303,JP -1743714304,1743715327,KR -1743715328,1743717375,CN -1743717376,1743718399,BD -1743718400,1743719423,NZ -1743720448,1743721471,JP -1743722496,1743723519,AU -1743723520,1743724543,HK -1743724544,1743725567,VN -1743725568,1743726591,IN -1743727616,1743728639,CN -1743728640,1743729151,AU -1743729152,1743729407,IN -1743729408,1743729663,AU -1743729664,1743730687,KH -1743730688,1743731711,IN -1743731712,1743732735,TW -1743733760,1743734783,CN -1743734784,1743735807,HK -1743735808,1743736319,AU -1743736320,1743736575,IN -1743736576,1743736831,AU -1743736832,1743738879,IN -1743739904,1743740927,JP -1743740928,1743741951,CN -1743741952,1743742975,HK -1743742976,1743743487,NZ -1743743488,1743743999,AU -1743744000,1743745023,JP -1743745024,1743746047,KR -1743746048,1743748095,VN -1743748096,1743748607,IN -1743748608,1743748863,HK -1743748864,1743749119,MY -1743749120,1743751167,AU -1743751168,1743754239,IN -1743755264,1743757311,CN -1743757312,1743758335,TO -1743758336,1743758591,HK -1743758592,1743758847,ID -1743758848,1743759359,AU -1743759360,1743761407,IN -1743761408,1743764479,CN -1743764480,1743765503,ID -1743765504,1743767551,CN -1743767552,1743768575,PH -1743768576,1743770623,CN -1743770624,1743770879,AU -1743770880,1743771135,IN -1743771648,1743772671,JP -1743772672,1743773695,SG -1743773696,1743774719,CN -1743774720,1743775743,NZ -1743775744,1743776767,IN -1743776768,1743778815,KR -1743778816,1743779839,CN -1743779840,1743780863,MY -1743780864,1743781887,BD -1743783936,1743784959,IN -1743784960,1743785983,JP -1743785984,1743787007,CN -1743787008,1743788031,JP -1743789056,1743790079,KR -1743790080,1743791103,IN -1743791104,1743792127,CN -1743792128,1743793151,HK -1743793152,1743794175,BD -1743794176,1743795199,KR -1743795200,1743796223,NZ -1743797248,1743798271,TH -1743798272,1743799295,HK -1743800320,1743801343,CN -1743801344,1743802367,IN -1743802368,1743803391,HK -1743803392,1743804415,CN -1743804416,1743804671,AU -1743804672,1743805439,IN -1743805440,1743806463,HK -1743806464,1743809535,IN -1743809536,1743810559,ID -1743810560,1743811583,KH -1743811584,1743812607,JP -1743812608,1743813631,PH -1743813632,1743814655,CN -1743814656,1743815679,SG -1743815680,1743815935,AU -1743815936,1743816191,NZ -1743816192,1743816703,AU -1743816704,1743817727,IN -1743817728,1743818751,HK -1743818752,1743819775,IN -1743819776,1743820799,HK -1743820800,1743821823,NZ -1743821824,1743822847,CN -1743822848,1743825919,IN -1743825920,1743826943,CN -1743826944,1743827967,MY -1743827968,1743828991,HK -1743828992,1743830015,NZ -1743830016,1743831039,CN -1743831040,1743832063,IN -1743832064,1743834111,HK -1743834112,1743838207,IN -1743838208,1743838463,PK -1743838464,1743838719,US -1743838720,1743841279,AU -1743841280,1743843327,IN -1743843328,1743844351,LA -1743844352,1743845375,CN -1743845376,1743846399,BD -1743846400,1743847423,JP -1743847424,1743848447,AU -1743848448,1743848959,ID -1743848960,1743849471,AU -1743849472,1743850495,IN -1743850496,1743851519,CN -1743851520,1743852543,HK -1743852544,1743853567,IN -1743853568,1743853823,ID -1743853824,1743854079,IN -1743854080,1743854335,AU -1743854336,1743854591,LK -1743854592,1743856639,TH -1743856640,1743857663,NZ -1743858688,1743859711,IN -1743859712,1743860735,HK -1743860736,1743861759,IN -1743861760,1743862783,NZ -1743862784,1743863807,SG -1743863808,1743864831,JP -1743864832,1743865855,TW -1743865856,1743866879,CN -1743866880,1743867903,KR -1743867904,1743868927,IN -1743868928,1743870975,NZ -1743870976,1743873023,CN -1743873024,1743874047,AU -1743874048,1743874303,JP -1743874304,1743875071,SG -1743875072,1743876095,HK -1743876096,1743877119,IN -1743877120,1743878143,KR -1743878144,1743879167,NZ -1743879168,1743881215,JP -1743881216,1743885311,IN -1743885312,1743885823,AU -1743885824,1743886207,MY -1743886208,1743886335,SG -1743886336,1743887359,JP -1743887360,1743888383,AF -1743888384,1743889407,CN -1743889408,1743890431,HK -1743890432,1743891455,IN -1743892480,1743892991,AU -1743892992,1743893503,ID -1743893504,1743894527,IN -1743894528,1743896575,CN -1743897600,1743899647,AU -1743899648,1743900671,ID -1743900672,1743901695,JP -1743901696,1743901951,AU -1743901952,1743902207,US -1743902208,1743902463,AU -1743902464,1743902719,US -1743902720,1743903743,AU -1743903744,1743904767,CN -1743904768,1743905791,IN -1743905792,1743906815,HK -1743906816,1743908863,IN -1743908864,1743909375,AU -1743909376,1743910911,IN -1743910912,1743911935,VN -1743911936,1743912959,AU -1743912960,1743913983,HK -1743913984,1743915007,JP -1743915008,1743916031,CN -1743916032,1743917055,KH -1743917056,1743918079,MY -1743918080,1743919103,BD -1743919104,1743920127,NZ -1743920128,1743921151,JP -1743921152,1743922175,AU -1743922176,1743923199,NZ -1743923200,1743924223,KH -1743924224,1743925247,MN -1743925248,1743925503,NZ -1743925504,1743925759,AU -1743925760,1743926271,AF -1743926272,1743927295,VN -1743927296,1743928319,KH -1743928320,1743929343,IN -1743929344,1743930367,CN -1743930368,1743931391,NZ -1743931392,1743932415,HK -1743933440,1743934463,AU -1743934464,1743934975,ID -1743935232,1743935487,IN -1743935488,1743936511,SG -1743936512,1743937535,AU -1743937536,1743938559,MM -1743938560,1743939583,HK -1743939584,1743940607,ID -1743940608,1743941631,HK -1743941632,1743942655,JP -1743942656,1743944703,IN -1743944704,1743945215,ID -1743945216,1743945727,TO -1743945728,1743947775,CN -1743947776,1743948799,IN -1743948800,1743949823,HK -1743949824,1743950847,TH -1743950848,1743951359,HK -1743951360,1743951871,SG -1743951872,1743953919,IN -1743953920,1743954943,CN -1743954944,1743955967,PG -1743955968,1743959039,CN -1743959040,1743959551,ID -1743959552,1743960063,AU -1743960064,1743964159,IN -1743964160,1743965183,CN -1743965184,1743966719,ID -1743966720,1743967231,AU -1743967232,1743968255,CN -1743968256,1743969279,BD -1743969280,1743970303,CN -1743970304,1743971327,IN -1743971328,1743972351,NZ -1743972352,1743972607,IN -1743972608,1743972863,ID -1743973120,1743973375,AU -1743973376,1743974399,IN -1743974400,1743975423,CN -1743975424,1743976447,NZ -1743976448,1743977471,AU -1743977472,1743978495,JP -1743978496,1743979519,HK -1743979520,1743980543,IN -1743981568,1743981823,AU -1743981824,1743982079,SG -1743982080,1743982335,HK -1743982336,1743982591,SG -1743982592,1743983359,AU -1743983616,1743984639,KR -1743984640,1743985663,HK -1743985664,1743990783,IN -1743990784,1743991807,ID -1743991808,1743994879,IN -1743994880,1743995903,AU -1743995904,1743997951,IN -1743997952,1743999999,BD -1744000000,1744001023,AU -1744001024,1744001535,IN -1744001536,1744001791,NZ -1744001792,1744002047,AU -1744002048,1744003071,HK -1744003072,1744004095,NZ -1744004096,1744005119,HK -1744005120,1744006143,VN -1744006144,1744006655,ID -1744006656,1744006911,AU -1744006912,1744009215,IN -1744009216,1744010239,JP -1744010240,1744011263,IN -1744011264,1744012287,HK -1744012288,1744013311,IN -1744013312,1744014335,CN -1744014336,1744015359,BD -1744015360,1744016383,IN -1744016384,1744017407,AU -1744017408,1744018431,JP -1744018432,1744019455,MY -1744019456,1744020479,NZ -1744020480,1744021503,HK -1744022528,1744023551,SG -1744023808,1744024319,ID -1744024320,1744024575,AF -1744024576,1744025599,HK -1744025600,1744026623,IN -1744026624,1744027647,SG -1744027648,1744028671,MY -1744028672,1744029695,JP -1744029696,1744030719,KR -1744030720,1744031743,NZ -1744031744,1744032767,JP -1744032768,1744033791,MY -1744033792,1744034815,VN -1744034816,1744035839,SG -1744035840,1744039423,IN -1744039424,1744039679,PH -1744039680,1744039935,AU -1744039936,1744040959,JP -1744040960,1744041471,AU -1744041472,1744041983,ID -1744041984,1744043007,TW -1744043008,1744044031,CN -1744044032,1744045055,HK -1744045056,1744046079,IN -1744046080,1744047103,SG -1744047104,1744048127,BD -1744048128,1744049151,CN -1744051200,1744051711,PH -1744051712,1744051967,SA -1744051968,1744052223,PH -1744052224,1744053247,IN -1744053248,1744054271,ID -1744054272,1744055295,KR -1744055296,1744056319,JP -1744056320,1744056575,IN -1744056576,1744056831,MY -1744056832,1744057087,NZ -1744057088,1744057343,ID -1744057344,1744058879,HK -1744058880,1744066559,CN -1744066560,1744067583,HK -1744067584,1744068607,JP -1744068608,1744069631,ID -1744069632,1744070655,SG -1744070656,1744071679,JP -1744071680,1744072703,KR -1744072704,1744073727,HK -1744073728,1744074751,CN -1744074752,1744076799,IN -1744076800,1744077823,AU -1744077824,1744078847,PK -1744078848,1744079871,VN -1744079872,1744080895,BD -1744080896,1744081919,AF -1744081920,1744082943,HK -1744082944,1744083967,IN -1744083968,1744084991,HK -1744084992,1744085503,ID -1744085504,1744085759,BD -1744085760,1744086015,MY -1744086016,1744087039,CN -1744087040,1744088063,IN -1744088064,1744090111,PK -1744090112,1744091135,NZ -1744091136,1744092159,BD -1744092160,1744092671,MY -1744092672,1744092927,IN -1744092928,1744093183,MY -1744093184,1744094207,PH -1744094208,1744096255,AU -1744096256,1744097279,ID -1744097280,1744098303,JP -1744098304,1744099327,NZ -1744099328,1744101375,JP -1744102400,1744103423,FJ -1744103424,1744104447,CN -1744104448,1744105471,AU -1744105472,1744106751,IN -1744106752,1744107007,ID -1744107008,1744107519,SG -1744107520,1744108543,KH -1744108544,1744109567,CN -1744109568,1744110591,IN -1744110592,1744111615,JP -1744111616,1744113663,IN -1744113664,1744114687,ID -1744114688,1744115455,IN -1744115456,1744115711,CN -1744115712,1744116735,MY -1744116736,1744117759,HK -1744117760,1744118783,IN -1744118784,1744119807,SG -1744119808,1744120831,JP -1744120832,1744122879,IN -1744122880,1744123903,CN -1744123904,1744124927,JP -1744124928,1744125951,CN -1744125952,1744127999,IN -1744128000,1744128511,ID -1744128512,1744128767,IN -1744128768,1744129023,AU -1744129024,1744130047,KH -1744130048,1744131071,CN -1744131072,1744132095,AU -1744132096,1744133119,MY -1744133120,1744134143,SG -1744134144,1744135167,BD -1744135168,1744137215,IN -1744137216,1744138239,BD -1744138240,1744140287,IN -1744140288,1744140799,MY -1744140800,1744141311,ID -1744141312,1744143359,CN -1744143360,1744144383,PK -1744144384,1744145407,ID -1744145408,1744146431,BD -1744146432,1744146687,IN -1744146688,1744147199,AU -1744147200,1744147455,IN -1744147456,1744148479,VN -1744148480,1744149503,AU -1744149504,1744150527,IN -1744150528,1744151551,TO -1744151552,1744152319,LA -1744152320,1744152575,TH -1744153600,1744154623,NZ -1744154624,1744154879,SG -1744154880,1744155135,ID -1744155648,1744156671,ID -1744156672,1744158207,IN -1744158208,1744158719,HK -1744158720,1744159743,PK -1744159744,1744161791,IN -1744161792,1744162815,BD -1744162816,1744163839,HK -1744163840,1744166655,AU -1744166656,1744166911,AE -1744166912,1744167167,JP -1744167168,1744167679,ID -1744167680,1744167935,AU -1744167936,1744171007,JP -1744171008,1744172031,BT -1744172032,1744175103,VN -1744175104,1744176127,ID -1744176128,1744177151,AU -1744177152,1744179199,CN -1744179200,1744180223,TH -1744180224,1744181247,PH -1744181248,1744182271,TH -1744182272,1744184575,AU -1744184576,1744184831,SG -1744184832,1744185087,HK -1744185088,1744185343,JP -1744185344,1744187903,IN -1744187904,1744188159,TH -1744188160,1744188415,AU -1744188416,1744189439,NZ -1744189440,1744190463,KR -1744191488,1744192511,IN -1744192512,1744193535,JP -1744194560,1744194815,ID -1744194816,1744195071,HK -1744195072,1744195327,SG -1744195328,1744195583,HK -1744195584,1744196607,JP -1744196608,1744197631,IN -1744197632,1744198655,MY -1744198656,1744199679,SG -1744199680,1744201727,AU -1744201728,1744201983,VN -1744202240,1744202495,IN -1744202496,1744202751,ID -1744202752,1744203775,PK -1744203776,1744204799,HK -1744204800,1744205823,ID -1744205824,1744207871,CN -1744207872,1744208127,AU -1744208128,1744208383,ID -1744208384,1744208895,AU -1744208896,1744209919,CN -1744209920,1744210943,AU -1744210944,1744211199,JP -1744211200,1744211455,HK -1744211456,1744211967,SG -1744211968,1744212991,KH -1744212992,1744213503,SG -1744213504,1744214015,JP -1744214016,1744216063,CN -1744216064,1744217087,HK -1744217088,1744218111,JP -1744218368,1744218623,ID -1744218624,1744219135,IN -1744219136,1744220159,KR -1744220160,1744220927,HK -1744220928,1744221183,JP -1744221184,1744222207,NZ -1744222208,1744222719,ID -1744222720,1744222975,AU -1744222976,1744223231,IN -1744223232,1744224255,TH -1744224256,1744226303,IN -1744226304,1744227327,SG -1744227328,1744228351,MY -1744228352,1744229375,TW -1744229376,1744230399,IN -1744230400,1744230655,GB -1744230656,1744230911,MY -1744230912,1744231423,TW -1744231424,1744232447,VN -1744232448,1744233471,IN -1744233472,1744234495,KH -1744234496,1744234751,JP -1744234752,1744235519,AU -1744235520,1744236543,KR -1744236544,1744237567,IN -1744237568,1744238591,HK -1744238592,1744238847,US -1744238848,1744239615,NZ -1744239616,1744240639,JP -1744240640,1744241663,AU -1744241664,1744242687,IN -1744242688,1744245503,ID -1744245504,1744245759,IN -1744245760,1744247807,ID -1744247808,1744248831,IN -1744248832,1744249855,ID -1744249856,1744250367,US -1744250368,1744250879,PH -1744250880,1744251903,ID -1744251904,1744252927,BD -1744252928,1744253951,LK -1744253952,1744254975,IN -1744254976,1744255999,NZ -1744256000,1744257023,TH -1744257024,1744257535,AU -1744257536,1744257791,PK -1744257792,1744258047,AU -1744258048,1744259071,JP -1744259072,1744260095,NZ -1744260096,1744261119,AU -1744261120,1744262143,IN -1744262144,1744264191,JP -1744264192,1744265215,HK -1744265216,1744266239,IN -1744266240,1744267263,ID -1744267264,1744268287,IN -1744268288,1744269311,SG -1744269312,1744270335,TW -1744270336,1744270591,AU -1744270592,1744270847,ID -1744270848,1744271359,AU -1744271360,1744272383,ID -1744272384,1744272895,PK -1744272896,1744273407,ID -1744273408,1744274431,AU -1744274432,1744275455,SG -1744275456,1744276223,HK -1744276224,1744276479,NL -1744276480,1744278527,HK -1744278528,1744279551,IN -1744279552,1744280575,NZ -1744280576,1744283647,HK -1744283648,1744286719,CN -1744286720,1744286975,SG -1744286976,1744287231,JP -1744287232,1744287743,ID -1744287744,1744288767,AU -1744288768,1744289791,JP -1744289792,1744290815,NZ -1744290816,1744291327,ID -1744291328,1744291583,AF -1744291584,1744291839,SG -1744291840,1744292863,CN -1744292864,1744293887,SG -1744293888,1744294655,IN -1744294656,1744294911,ID -1744294912,1744295935,CN -1744295936,1744296959,ID -1744296960,1744297983,KR -1744297984,1744298495,AU -1744298496,1744299007,ID -1744299008,1744300031,HK -1744300032,1744301055,KR -1744301056,1744301567,AU -1744301568,1744302079,BD -1744303104,1744303615,ID -1744303616,1744303871,IN -1744303872,1744304127,NZ -1744304128,1744305151,AU -1744305152,1744306175,PH -1744306176,1744306687,CN -1744306688,1744308223,AU -1744309248,1744310271,BD -1744310272,1744312319,AU -1744312320,1744312575,IN -1744312576,1744312831,ID -1744312832,1744313343,AU -1744313344,1744315391,IN -1744315392,1744316415,HK -1744316416,1744317439,KH -1744317440,1744318463,AU -1744319488,1744320511,NL -1744320512,1744321535,ID -1744321536,1744322559,IN -1744322560,1744323583,CN -1744323584,1744324607,JP -1744324608,1744325631,IN -1744325632,1744326655,HK -1744326656,1744328703,IN -1744328704,1744329727,HK -1744329728,1744330751,IN -1744330752,1744331263,AU -1744331264,1744331775,SG -1744331776,1744332799,CN -1744332800,1744333823,KR -1744333824,1744334847,HK -1744334848,1744337919,IN -1744337920,1744338943,CN -1744338944,1744339967,AU -1744339968,1744340991,SG -1744340992,1744342015,HK -1744343040,1744343551,SG -1744343552,1744343807,ID -1744343808,1744344063,AU -1744344064,1744345087,JP -1744345088,1744346111,CN -1744346112,1744347135,IN -1744347136,1744349183,VN -1744349184,1744350207,CN -1744350208,1744351231,IN -1744351232,1744352255,NZ -1744352256,1744354303,HK -1744354304,1744355327,AU -1744355328,1744356351,CN -1744356352,1744357375,ID -1744357376,1744357631,NZ -1744357632,1744357887,AU -1744357888,1744358399,IN -1744358400,1744359423,BD -1744359424,1744360447,IN -1744360448,1744361471,CN -1744361472,1744362495,ID -1744362496,1744365567,CN -1744365568,1744366591,IN -1744366592,1744367615,BD -1744368640,1744369663,IN -1744369664,1744369919,ID -1744369920,1744370175,NL -1744370432,1744370687,JP -1744370688,1744371711,HK -1744371712,1744372735,BD -1744372736,1744373759,IN -1744373760,1744375807,CN -1744375808,1744376319,IN -1744376832,1744377855,VN -1744377856,1744378879,IN -1744378880,1744379903,KR -1744379904,1744383999,IN -1744384000,1744384000,AU -1744384001,1744384031,GU -1744384032,1744384039,AU -1744384040,1744384047,GU -1744384048,1744385023,AU -1744385024,1744386047,CN -1744386048,1744386303,BD -1744386304,1744386559,AU -1744386560,1744387071,ID -1744387072,1744388095,NZ -1744388096,1744388607,ID -1744388608,1744389631,AU -1744389632,1744390143,RO -1744390144,1744391167,HK -1744391168,1744393215,IN -1744393216,1744394239,MY -1744394240,1744395263,IN -1744395264,1744396287,MY -1744396288,1744397311,IN -1744397312,1744398335,VN -1744398336,1744399359,CN -1744399360,1744400383,HK -1744400384,1744401407,JP -1744402432,1744403455,IN -1744403456,1744404479,AU -1744404480,1744405503,CN -1744405504,1744406527,IN -1744406528,1744407551,CN -1744407552,1744408575,AU -1744408576,1744409599,CN -1744409600,1744410623,AU -1744410624,1744411647,PK -1744411648,1744412671,LA -1744412672,1744413695,TW -1744413696,1744417791,CN -1744417792,1744418559,IN -1744418560,1744418815,AU -1744418816,1744419839,JP -1744419840,1744421887,CN -1744421888,1744422911,HK -1744423936,1744424959,IN -1744424960,1744425471,MY -1744425472,1744425727,ID -1744425728,1744425983,IN -1744425984,1744428031,JP -1744428032,1744429567,AU -1744429568,1744429823,IN -1744429824,1744430079,ID -1744430080,1744431103,PK -1744431104,1744434175,IN -1744434176,1744435199,CN -1744435200,1744436223,IN -1744436224,1744437247,CN -1744437248,1744438271,KI -1744438272,1744439295,HK -1744439296,1744439807,AU -1744439808,1744440319,IN -1744440320,1744441343,HK -1744441344,1744442367,IN -1744442368,1744443391,AU -1744443392,1744444415,VN -1744444416,1744445439,IN -1744445440,1744446463,CN -1744446464,1744447487,IN -1744447744,1744447999,HK -1744448000,1744448511,BD -1744448512,1744449535,IN -1744449536,1744450559,NZ -1744450560,1744451583,HK -1744451584,1744452607,SG -1744452608,1744453119,AU -1744453120,1744453375,IN -1744453376,1744453631,AU -1744453632,1744454655,SG -1744454656,1744455679,BD -1744455680,1744456703,JP -1744456704,1744459775,IN -1744459776,1744460799,NZ -1744460800,1744461823,JP -1744463872,1744464895,CN -1744464896,1744465919,JP -1744465920,1744466943,IN -1744466944,1744467967,NZ -1744468992,1744470015,CN -1744470016,1744471039,TH -1744471040,1744472063,NP -1744472064,1744473087,IN -1744473088,1744473343,PH -1744473344,1744473599,VN -1744473600,1744473855,ID -1744473856,1744474111,TH -1744474112,1744481279,IN -1744481280,1744482303,JP -1744482304,1744483327,HK -1744483328,1744484351,CN -1744484352,1744486399,IN -1744486400,1744487423,CN -1744487936,1744488191,NZ -1744488192,1744488447,ID -1744488448,1744489471,JP -1744489472,1744490495,NZ -1744490496,1744491519,IN -1744491520,1744492543,AU -1744492544,1744493567,CN -1744494080,1744494591,PK -1744494592,1744495615,CN -1744495616,1744497663,NZ -1744497664,1744498687,CN -1744498688,1744500735,AU -1744500736,1744502783,CN -1744502784,1744503807,MY -1744503808,1744504831,AU -1744505856,1744506367,AU -1744506368,1744506623,ID -1744506624,1744506879,AU -1744506880,1744510975,IN -1744510976,1744511999,CN -1744512000,1744512767,HK -1744512768,1744513023,CN -1744513024,1744513535,ID -1744513536,1744513791,AU -1744513792,1744514047,IN -1744514048,1744514559,ID -1744514560,1744514815,IN -1744514816,1744515071,AU -1744515072,1744519167,IN -1744519168,1744520191,AU -1744520192,1744521215,TH -1744521216,1744523263,JP -1744523264,1744524287,IN -1744524288,1744525311,CN -1744525312,1744526335,HK -1744526336,1744527359,IN -1744527360,1744528383,CN -1744528384,1744529407,IN -1744529408,1744530431,KR -1744530432,1744530943,SG -1744530944,1744531455,AU -1744531456,1744532479,HK -1744532480,1744533503,JP -1744533504,1744534527,BD -1744534528,1744536575,CN -1744536576,1744537087,PW -1744537088,1744538623,AU -1744538624,1744539647,IN -1744539648,1744540671,AU -1744540672,1744541695,IN -1744541696,1744542719,ID -1744542720,1744543743,JP -1744543744,1744544767,CN -1744544768,1744545791,NL -1744545792,1744546047,NZ -1744546048,1744547839,AU -1744547840,1744548863,AF -1744548864,1744549887,ID -1744549888,1744551935,IN -1744551936,1744552959,CN -1744552960,1744553471,SG -1744553472,1744553983,HK -1744553984,1744555007,MY -1744555008,1744556031,CN -1744556032,1744562175,IN -1744562176,1744563199,BD -1744563200,1744564223,HK -1744564224,1744565247,CN -1744565248,1744566271,BD -1744566272,1744567295,IN -1744568320,1744569343,VN -1744569344,1744570367,IN -1744570368,1744571391,AU -1744571392,1744571903,ID -1744571904,1744572415,AU -1744572416,1744573439,HK -1744573440,1744574463,ID -1744574464,1744575487,IN -1744575488,1744576511,CN -1744576512,1744577535,PH -1744577536,1744578559,CN -1744578560,1744580607,IN -1744580864,1744581119,SG -1744581120,1744581631,ID -1744581632,1744582655,IN -1744582656,1744583679,AU -1744583680,1744584703,IN -1744584704,1744585727,CN -1744585728,1744586751,TW -1744586752,1744588799,HK -1744588800,1744589823,PK -1744589824,1744590079,BT -1744590080,1744590335,ID -1744590336,1744590591,IN -1744590592,1744590847,AU -1744590848,1744591871,DE -1744591872,1744592895,IN -1744592896,1744593919,CN -1744593920,1744594431,ID -1744594432,1744594943,AU -1744594944,1744595967,CN -1744595968,1744596991,IN -1744596992,1744597023,AU -1744597024,1744597123,SG -1744597124,1744597124,US -1744597125,1744597151,SG -1744597152,1744597183,IN -1744597184,1744597215,JP -1744597216,1744598015,SG -1744598016,1744599039,IN -1744600064,1744601087,JP -1744601088,1744602111,TW -1744602112,1744603135,HK -1744604160,1744607231,IN -1744607232,1744608255,AU -1744608256,1744609279,IN -1744609536,1744609791,IN -1744609792,1744610047,HK -1744610048,1744610303,ID -1744610304,1744612351,IN -1744612352,1744613375,CN -1744613376,1744614399,PH -1744615424,1744616447,IN -1744616448,1744616959,ID -1744616960,1744617471,AU -1744617472,1744618495,IN -1744618496,1744619519,TW -1744619520,1744620543,SG -1744620544,1744622591,CN -1744622592,1744624639,IN -1744624640,1744625663,NL -1744625664,1744626687,BD -1744626688,1744627711,KR -1744627712,1744628735,CN -1744628736,1744629759,IN -1744629760,1744630783,HK -1744630784,1744631039,TW -1744631040,1744631295,IN -1744631296,1744631551,AU -1744631552,1744631807,NZ -1744631808,1744632831,CN -1744632832,1744633855,VN -1744633856,1744634879,ID -1744634880,1744635903,CN -1744635904,1744636927,HK -1744636928,1744637951,MY -1744640000,1744641023,SG -1744641024,1744643583,IN -1744643584,1744644095,BD -1744644096,1744645119,HK -1744645120,1744646143,BD -1744646144,1744647167,NZ -1744647168,1744648191,IN -1744648192,1744649215,KR -1744649216,1744650239,CN -1744650240,1744651263,AU -1744651264,1744651775,ID -1744651776,1744652287,IN -1744652288,1744653311,TH -1744653312,1744655871,JP -1744655872,1744656383,ID -1744656384,1744657407,VN -1744657408,1744658431,AU -1744658432,1744659455,CA -1744659456,1744660479,JP -1744660480,1744660735,IN -1744660736,1744660991,MY -1744660992,1744661503,ID -1744661504,1744662527,MY -1744662528,1744663551,ID -1744663552,1744663807,NZ -1744663808,1744664063,TH -1744664064,1744664575,AU -1744664576,1744665599,HK -1744665600,1744665855,ID -1744665856,1744666111,IN -1744666112,1744666367,AU -1744666624,1744667647,IN -1744667648,1744668671,TH -1744668672,1744669695,NZ -1744669696,1744670719,HK -1744670720,1744671743,SG -1744671744,1744673791,IN -1744673792,1744674815,PK -1744674816,1744675839,BD -1744675840,1744676351,SG -1744676352,1744678911,IN -1744678912,1744679935,JP -1744679936,1744680959,KH -1744680960,1744681983,TW -1744681984,1744683007,JP -1744683008,1744685055,AU -1744685056,1744686079,IN -1744686080,1744687103,CN -1744687104,1744688127,IN -1744688128,1744689151,ID -1744689152,1744690175,JP -1744690176,1744692223,CN -1744693248,1744694271,CN -1744694272,1744695295,HK -1744695296,1744696319,KR -1744697344,1744698367,HK -1744698368,1744699391,KH -1744699392,1744700415,NZ -1744700416,1744701439,AU -1744701440,1744702463,CN -1744702464,1744704511,VN -1744704512,1744705535,CN -1744705536,1744705791,AU -1744705792,1744706047,ID -1744706048,1744706303,BD -1744706304,1744708607,IN -1744708608,1744709631,PH -1744709632,1744710655,VN -1744710656,1744711679,SG -1744711680,1744712191,ID -1744712192,1744712447,AU -1744712448,1744712703,ID -1744712704,1744714751,IN -1744714752,1744715775,JP -1744715776,1744719871,CN -1744719872,1744720895,IN -1744720896,1744721919,BD -1744721920,1744723455,AU -1744723456,1744723711,BD -1744723712,1744723967,ID -1744723968,1744726015,IN -1744726016,1744727039,ID -1744727040,1744728063,HK -1744728064,1744729087,CN -1744730112,1744731135,MN -1744731648,1744732159,ID -1744732160,1744733183,IN -1744733184,1744734207,NZ -1744734208,1744736255,AU -1744736256,1744737279,JP -1744737280,1744738303,HK -1744738304,1744739327,SG -1744739328,1744740351,NZ -1744740352,1744741375,IN -1744741376,1744741887,AU -1744741888,1744742143,AF -1744742144,1744742399,BD -1744742400,1744743423,ID -1744743424,1744744447,IN -1744744448,1744745471,CN -1744745472,1744747519,NP -1744747520,1744748543,CN -1744748544,1744749055,IN -1744749056,1744749567,NZ -1744749568,1744749823,CN -1744750080,1744750591,US -1744750592,1744752639,IN -1744752640,1744753663,HK -1744754688,1744755711,VN -1744755712,1744756735,HK -1744756736,1744757759,PF -1744757760,1744758271,NZ -1744758272,1744758527,IN -1744758528,1744758783,NZ -1744758784,1744759807,PF -1744759808,1744762879,IN -1744762880,1744763903,KR -1744763904,1744764927,SG -1744764928,1744765951,JP -1744765952,1744766975,PK -1744766976,1744767999,IN -1744768000,1744768255,ID -1744768256,1744768511,TH -1744768512,1744769023,ID -1744769024,1744770047,AU -1744770048,1744771071,JP -1744771072,1744772095,NZ -1744772352,1744772607,ID -1744772608,1744772863,BD -1744772864,1744773119,AU -1744773120,1744774143,SG -1744774144,1744775167,IN -1744776192,1744777215,HK -1744777216,1744778239,AU -1744778240,1744778751,ID -1744778752,1744779263,AU -1744779264,1744781311,HK -1744782336,1744783359,CN -1744783360,1744786431,IN -1744786432,1744787455,VN -1744787456,1744789503,CN -1744789504,1744794623,IN -1744794624,1744795647,KH -1744795648,1744797183,ID -1744797184,1744797439,NP -1744797440,1744797695,HK -1744797696,1744798719,PK -1744799744,1744801791,CN -1744801792,1744802815,IN -1744802816,1744803839,PK -1744803840,1744804863,PH -1744804864,1744805375,ID -1744805376,1744805887,IN -1744807936,1744808447,IN -1744808448,1744808959,MY -1744808960,1744809983,MM -1744809984,1744811007,HK -1744811008,1744812031,IN -1744812032,1744813055,CN -1744813056,1744814079,IN -1744816128,1744817151,CN -1744819200,1744820223,CN -1744820224,1744821247,IN -1744822272,1744823295,IN -1744823296,1744824319,CN -1744824320,1744825343,IN -1744825344,1744826367,VN -1744826368,1744827391,ID -1744827392,1744828415,JP -1744828416,1744828927,AU -1744828928,1744829183,SG -1744829184,1744829439,AU -1744829440,1744830463,HK -1744830464,1745410303,US -1745410304,1745410463,PL -1745410464,1745410471,US -1745410472,1745410559,PL -1745410560,1747191807,US -1747191808,1747193855,CA -1747193856,1747215359,US -1747215360,1747216383,CA -1747216384,1747219455,US -1747219456,1747220479,CA -1747220480,1747227647,US -1747227648,1747228671,CA -1747228672,1747235839,US -1747235840,1747236863,CA -1747236864,1747255807,US -1747255808,1747256063,PR -1747256064,1747256319,US -1747256320,1747256575,IE -1747256576,1747256831,AU -1747256832,1747257087,AE -1747257088,1747257343,IN -1747257344,1747260415,US -1747260416,1747261439,CA -1747261440,1747269887,US -1747269888,1747270143,AT -1747270144,1747270655,US -1747270656,1747272703,CA -1747272704,1747273727,US -1747273728,1747274751,CA -1747274752,1747275775,US -1747275776,1747276799,CA -1747276800,1747283967,US -1747283968,1747284991,CA -1747284992,1747293183,US -1747293184,1747294207,CA -1747294208,1747304447,US -1747304448,1747308543,CA -1747308544,1747316735,US -1747316736,1747317759,CA -1747317760,1747484671,US -1747484672,1747500223,NL -1747500224,1747500224,IE -1747500225,1747517439,NL -1747517440,1747533823,BR -1747533824,1747550207,IE -1747550208,1747558399,US -1747558400,1747566591,JP -1747566592,1747582975,IE -1747582976,1747648511,US -1747648512,1747681279,SG -1747681280,1747716671,US -1747716672,1747716683,NL -1747716684,1747734535,US -1747734536,1747734539,SE -1747734540,1747734543,US -1747734544,1747734547,SE -1747734548,1747734551,US -1747734552,1747734555,SE -1747734556,1747735679,US -1747735680,1747735743,SG -1747735744,1747736063,US -1747736064,1747736319,IE -1747736320,1747736575,HK -1747736576,1747736639,US -1747736640,1747736671,IE -1747736672,1747736767,US -1747736768,1747736799,HK -1747736800,1747736831,JP -1747736832,1747736863,US -1747736864,1747736895,SG -1747736896,1747736991,US -1747736992,1747737023,NL -1747737024,1747737055,US -1747737056,1747737119,GB -1747737120,1747737215,AU -1747737216,1747737247,SG -1747737248,1747737279,KR -1747737280,1747737311,NL -1747737312,1747737343,HK -1747737344,1747737407,US -1747737408,1747737439,IE -1747737440,1747737535,US -1747737536,1747737567,HK -1747737568,1747737631,JP -1747737632,1747737663,SG -1747737664,1747737727,US -1747737728,1747737791,IN -1747737792,1747737823,IE -1747737824,1747737855,US -1747737856,1747737887,NL -1747737888,1747737951,CA -1747737952,1747738015,AU -1747738016,1747738047,US -1747738048,1747738079,NL -1747738080,1747738111,IN -1747738112,1747738143,US -1747738144,1747738159,IE -1747738160,1747738207,US -1747738208,1747738223,HK -1747738224,1747738255,JP -1747738256,1747738271,SG -1747738272,1747738303,US -1747738304,1747738335,IN -1747738336,1747738367,KR -1747738368,1747738383,US -1747738384,1747738415,CA -1747738416,1747738447,AU -1747738448,1747738479,NL -1747738480,1747738495,IN -1747738496,1747738559,US -1747738560,1747738575,SG -1747738576,1747738591,US -1747738592,1747738607,SG -1747738608,1747738815,US -1747738816,1747739135,SG -1747739136,1747740159,US -1747740160,1747740671,AU -1747740672,1747741183,JP -1747741184,1747741215,US -1747741216,1747741311,IN -1747741312,1747741343,AT -1747741344,1747741375,IE -1747741376,1747741407,NL -1747741408,1747741439,BR -1747741440,1747741471,AU -1747741472,1747741503,SG -1747741504,1747741551,IN -1747741552,1747741823,US -1747741824,1747741887,IE -1747741888,1747741919,CL -1747741920,1747743487,US -1747743488,1747743743,NL -1747743744,1747743999,IE -1747744000,1747744255,SG -1747744256,1747744511,HK -1747744512,1747744767,US -1747744768,1747746815,SG -1747746816,1747763679,US -1747763680,1747763711,AU -1747763712,1747763839,HK -1747763840,1747765919,US -1747765920,1747765951,IE -1747765952,1747765983,SG -1747765984,1747766047,CA -1747766048,1747766151,US -1747766152,1747766159,IE -1747766160,1747766167,HK -1747766168,1747766207,US -1747766208,1747766271,HK -1747766272,1747767423,US -1747767424,1747767439,NL -1747767440,1747767455,US -1747767456,1747767487,HK -1747767488,1747767551,SG -1747767552,1747767615,HK -1747767616,1747767743,IN -1747767744,1747767759,US -1747767760,1747767807,NL -1747767808,1747767871,US -1747767872,1747767887,IE -1747767888,1747767903,AU -1747767904,1747767919,JP -1747767920,1747767935,AU -1747767936,1747767951,JP -1747767952,1747767983,US -1747767984,1747767999,NL -1747768000,1747768031,US -1747768032,1747768063,NL -1747768064,1747770239,US -1747770240,1747770367,IN -1747770368,1747770623,US -1747770624,1747770655,JP -1747770656,1747770687,SG -1747770688,1747770719,JP -1747770720,1747770751,IE -1747770752,1747770815,AT -1747770816,1747770943,US -1747770944,1747771007,SE -1747771008,1747771135,AU -1747771136,1747777679,US -1747777680,1747777743,CA -1747777744,1747777791,NL -1747777792,1747778047,US -1747778048,1747778175,NL -1747778176,1747778303,IE -1747778304,1747779071,US -1747779072,1747779135,IN -1747779136,1747779199,SG -1747779200,1747779455,NL -1747779456,1747779519,IE -1747779520,1747779583,US -1747779584,1747800063,NL -1747800064,1747812351,IE -1747812352,1747847167,US -1747847168,1747849215,IE -1747849216,1747851263,NL -1747851264,1747852287,HK -1747852288,1747853311,AU -1747853312,1747861503,NL -1747861504,1747869695,IE -1747869696,1747877887,US -1747877888,1747886079,SG -1747886080,1747894271,HK -1747894272,1747898367,US -1747898368,1747906559,JP -1747906560,1747910655,AU -1747910656,1747910911,FI -1747910912,1747911167,AT -1747911168,1747911423,IE -1747911424,1747911679,US -1747911680,1747911935,NL -1747911936,1747912191,FI -1747912192,1747912703,US -1747912704,1747912959,NL -1747912960,1747913215,AT -1747913216,1747913471,IE -1747913472,1747913727,US -1747913728,1747913983,IE -1747913984,1747914239,FI -1747914240,1747914495,AT -1747914496,1747915775,US -1747915776,1747916287,GB -1747916288,1747926015,US -1747926016,1747926527,CA -1747926528,1747934207,US -1747934208,1747934719,JP -1747934720,1747936255,US -1747936256,1747936767,IN -1747936768,1747938303,US -1747938304,1747938815,KR -1747938816,1747940351,US -1747940352,1747940607,AU -1747940608,1747941375,US -1747941376,1747941631,HK -1747941632,1747941887,SG -1747941888,1747942143,MY -1747942144,1747942655,US -1747942656,1747942911,SG -1747942912,1747943167,KR -1747943168,1747943423,US -1747943424,1747959807,NL -1747959808,1747964415,US -1747964416,1747965951,IN -1747965952,1747966015,US -1747966016,1747966079,NL -1747966080,1747966095,IE -1747966096,1747966463,US -1747966464,1747966975,IE -1747966976,1749061631,US -1749061632,1749069823,NL -1749069824,1749094399,US -1749094400,1749098495,NL -1749098496,1749172223,US -1749172224,1749188607,NL -1749188608,1749196799,US -1749196800,1749204991,NL -1749204992,1749221375,US -1749221376,1749229567,NL -1749229568,1749327871,US -1749327872,1749336063,NL -1749336064,1749340159,US -1749340160,1749344255,NL -1749344256,1749364735,US -1749364736,1749381119,NL -1749381120,1749397503,US -1749397504,1749406719,NL -1749406720,1749413887,US -1749413888,1749422079,NL -1749422080,1749449727,US -1749449728,1749450239,NL -1749450240,1749465087,US -1749465088,1749465599,NL -1749465600,1749497855,US -1749497856,1749499391,NL -1749499392,1749508095,US -1749508096,1749516287,NL -1749516288,1749516799,US -1749516800,1749517055,NL -1749517056,1749517311,US -1749517312,1749518335,NL -1749518336,1749537791,US -1749537792,1749539327,NL -1749539328,1749567121,US -1749567122,1749567122,AU -1749567123,1749567130,US -1749567131,1749567131,AU -1749567132,1749586943,US -1749586944,1749588479,NL -1749588480,1749590015,US -1749590016,1749598207,NL -1749598208,1749618175,US -1749618176,1749618687,NL -1749618688,1749635071,US -1749635072,1749636095,NL -1749636096,1749647359,US -1749647360,1749655551,NL -1749655552,1749686527,US -1749686528,1749686783,NL -1749686784,1749696511,US -1749696512,1749698047,NL -1749698048,1749698559,US -1749698560,1749718015,NL -1749718016,1749749247,US -1749749248,1749749759,NL -1749749760,1749757951,US -1749757952,1749767167,NL -1749767168,1749767679,US -1749767680,1749769215,NL -1749769216,1749770239,US -1749770240,1749778431,NL -1749778432,1749816831,US -1749816832,1749818367,NL -1749818368,1749819391,US -1749819392,1749827583,NL -1749827584,1749862143,US -1749862144,1749863167,NL -1749863168,1749863423,US -1749863424,1749864191,NL -1749864192,1749864447,US -1749864448,1749865727,NL -1749865728,1749865983,US -1749865984,1749866495,NL -1749866496,1749867263,US -1749867264,1749868287,NL -1749868288,1749901311,US -1749901312,1749901567,NL -1749901568,1749925887,US -1749925888,1749926143,NL -1749926144,1749931007,US -1749931008,1749932031,NL -1749932032,1749934079,US -1749934080,1749942271,NL -1749942272,1750079999,US -1750080000,1750080511,NL -1750080512,1750096383,US -1750096384,1750106111,NL -1750106112,1750123007,US -1750123008,1750126079,NL -1750126080,1750126591,US -1750126592,1750142975,NL -1750142976,1750147071,US -1750147072,1750151167,NL -1750151168,1750152191,US -1750152192,1750153727,NL -1750153728,1750154239,US -1750154240,1750159359,NL -1750159360,1750163455,US -1750163456,1750172671,NL -1750172672,1750174719,US -1750174720,1750175743,NL -1750175744,1750192127,US -1750192128,1750201855,NL -1750201856,1750221311,US -1750221312,1750224383,NL -1750224384,1750224895,US -1750224896,1750252543,NL -1750252544,1750253055,US -1750253056,1750294015,NL -1750294016,1750294527,US -1750294528,1750310911,NL -1750310912,1750315007,US -1750315008,1750320127,NL -1750320128,1750321151,US -1750321152,1750321663,NL -1750321664,1750323199,US -1750323200,1750327295,NL -1750327296,1750350847,US -1750350848,1750351871,NL -1750351872,1750372351,US -1750372352,1750373375,NL -1750373376,1750374399,US -1750374400,1750394367,NL -1750394368,1750395903,US -1750395904,1750396927,NL -1750396928,1750405119,US -1750405120,1750415359,NL -1750415360,1750417407,US -1750417408,1750425599,NL -1750425600,1750443519,US -1750443520,1750444031,NL -1750444032,1750463487,US -1750463488,1750482943,NL -1750482944,1750492159,US -1750492160,1750492671,NL -1750492672,1750493183,US -1750493184,1750494207,NL -1750494208,1750494719,US -1750494720,1750503423,NL -1750503424,1750515199,US -1750515200,1750515711,NL -1750515712,1750523903,US -1750523904,1750534655,NL -1750534656,1750536191,US -1750536192,1750544383,NL -1750544384,1750573055,US -1750573056,1750581247,NL -1750581248,1750585343,US -1750585344,1750593535,NL -1750593536,1750664191,US -1750664192,1750665727,NL -1750665728,1750667263,US -1750667264,1750675455,NL -1750675456,1750694911,US -1750694912,1750695423,NL -1750695424,1750705151,US -1750705152,1750706687,NL -1750706688,1750708223,US -1750708224,1750716415,NL -1750716416,1750754815,US -1750754816,1750757375,NL -1750757376,1750761471,US -1750761472,1750778367,NL -1750778368,1750781439,US -1750781440,1750781951,NL -1750781952,1750877695,US -1750877696,1750879231,NL -1750879232,1750880255,US -1750880256,1750888447,NL -1750888448,1750926335,US -1750926336,1750926847,NL -1750926848,1750946303,US -1750946304,1750946815,NL -1750946816,1750977535,US -1750977536,1750978559,NL -1750978560,1750986751,US -1750986752,1750996991,NL -1750996992,1750998527,US -1750998528,1751007231,NL -1751007232,1751015423,US -1751015424,1751016703,NL -1751016704,1751016959,US -1751016960,1751027711,NL -1751027712,1751031807,US -1751031808,1751040511,NL -1751040512,1751104511,US -1751104512,1751105023,NL -1751105024,1751121919,US -1751121920,1751124479,NL -1751124480,1751125503,US -1751125504,1751134207,NL -1751134208,1751144959,US -1751144960,1751146495,NL -1751146496,1751154687,US -1751154688,1751163391,NL -1751163392,1751253503,US -1751253504,1751253759,NL -1751253760,1751255551,US -1751255552,1751256063,NL -1751256064,1751285759,US -1751285760,1751289855,NL -1751289856,1751293951,US -1751293952,1751298047,NL -1751298048,1751490559,US -1751490560,1751498751,NL -1751498752,1751505919,US -1751505920,1751506175,IN -1751506176,1751506431,HK -1751506432,1751510015,US -1751510016,1751521279,NL -1751521280,1751523327,US -1751523328,1751531519,NL -1751531520,1751598847,US -1751598848,1751621631,NL -1751621632,1751625727,US -1751625728,1751640319,NL -1751640320,1751641087,US -1751641088,1751641599,NL -1751641600,1751642111,US -1751642112,1751650303,NL -1751650304,1751682047,US -1751682048,1751683071,NL -1751683072,1751691263,US -1751691264,1751699455,NL -1751699456,1751724031,US -1751724032,1751728127,NL -1751728128,1751798271,US -1751798272,1751800319,NL -1751800320,1751801855,US -1751801856,1751810047,NL -1751810048,1751834623,US -1751834624,1751838719,NL -1751838720,1751879679,US -1751879680,1751883775,NL -1751883776,1751884799,US -1751884800,1751885823,NL -1751885824,1751896063,US -1751896064,1751896831,NL -1751896832,1751897087,US -1751897088,1751928831,NL -1751928832,1751946239,US -1751946240,1751947263,NL -1751947264,1751949311,US -1751949312,1751957503,NL -1751957504,1751987711,US -1751987712,1752007167,NL -1752007168,1752037887,US -1752037888,1752038143,NL -1752038144,1752087807,US -1752087808,1752088063,NL -1752088064,1752159231,US -1752159232,1752161279,NL -1752161280,1752162303,US -1752162304,1752170495,NL -1752170496,1752300031,US -1752300032,1752300287,NL -1752300288,1752330239,US -1752330240,1752338431,NL -1752338432,1752458239,US -1752458240,1752458495,NL -1752458496,1752495103,US -1752495104,1752495359,NL -1752495360,1752563711,US -1752563712,1752564223,NL -1752564224,1752566783,US -1752566784,1752568831,NL -1752568832,1752570367,US -1752570368,1752570623,NL -1752570624,1752618495,US -1752618496,1752619007,NL -1752619008,1752619263,US -1752619264,1752619519,NL -1752619520,1752637951,US -1752637952,1752638463,NL -1752638464,1752675839,US -1752675840,1752676351,NL -1752676352,1752730111,US -1752730112,1752730367,NL -1752730368,1752750079,US -1752750080,1752751615,NL -1752751616,1752756223,US -1752756224,1752768511,NL -1752768512,1752776703,US -1752776704,1752778239,NL -1752778240,1752779775,US -1752779776,1752780799,NL -1752780800,1752788991,US -1752788992,1752798463,NL -1752798464,1752798719,US -1752798720,1752818687,NL -1752818688,1752834047,US -1752834048,1752838143,NL -1752838144,1752847359,US -1752847360,1752847871,NL -1752847872,1752875007,US -1752875008,1752879103,NL -1752879104,1752880127,US -1752880128,1752881151,NL -1752881152,1752882175,US -1752882176,1752882687,NL -1752882688,1752883199,US -1752883200,1752891391,NL -1752891392,1752895487,US -1752895488,1752903679,NL -1752903680,1752911871,US -1752911872,1752929279,NL -1752929280,1752931327,US -1752931328,1752932351,NL -1752932352,1752940543,US -1752940544,1752946175,NL -1752946176,1752948735,US -1752948736,1752952831,NL -1752952832,1752971007,US -1752971008,1752971263,NL -1752971264,1752982527,US -1752982528,1753005055,NL -1753005056,1753006079,US -1753006080,1753014271,NL -1753014272,1753022975,US -1753022976,1753026047,NL -1753026048,1753026559,US -1753026560,1753042943,NL -1753042944,1753046015,US -1753046016,1753046271,NL -1753046272,1753077247,US -1753077248,1753077503,NL -1753077504,1753097727,US -1753097728,1753117183,NL -1753117184,1753128959,US -1753128960,1753133055,NL -1753133056,1753157631,US -1753157632,1753169919,NL -1753169920,1753251839,US -1753251840,1753252095,MN -1753252096,1753252351,SY -1753252352,1753252607,BY -1753252608,1753252863,PK -1753252864,1753253119,SD -1753253120,1753253375,LK -1753253376,1753253631,ID -1753253632,1753253887,LB -1753253888,1753254143,OM -1753254144,1753254399,MT -1753254400,1753254655,MK -1753254656,1753254911,MY -1753254912,1753255167,AL -1753255168,1753255423,US -1753255424,1753255679,DZ -1753255680,1753255935,KZ -1753255936,1753260031,CA -1753260032,1753280511,US -1753280512,1753284607,CA -1753284608,1753309183,US -1753309184,1753317375,CA -1753317376,1753325055,US -1753325056,1753325567,CA -1753325568,1753330687,US -1753330688,1753331711,CA -1753331712,1753341951,US -1753341952,1753346047,CA -1753346048,1753481727,US -1753481728,1753481983,SG -1753481984,1753482751,US -1753482752,1753483007,PL -1753483008,1753483263,US -1753483264,1753483519,IE -1753483520,1753483775,IL -1753483776,1753484031,PH -1753484032,1753484607,US -1753484608,1753484655,BR -1753484656,1753485567,US -1753485568,1753485823,GH -1753485824,1753487359,US -1753487360,1753487615,CH -1753487616,1753487679,US -1753487680,1753487727,GB -1753487728,1753489407,US -1753489408,1753489663,GB -1753489664,1753489919,HK -1753489920,1753490175,US -1753490176,1753490431,AU -1753490432,1753490687,IL -1753490688,1753492799,US -1753492800,1753492847,GB -1753492848,1753494527,US -1753494528,1753494783,IL -1753494784,1753497407,US -1753497408,1753497455,PH -1753497456,1753497599,US -1753497600,1753498111,RU -1753498112,1753499391,US -1753499392,1753499647,PH -1753499648,1753499903,AE -1753499904,1753500159,US -1753500160,1753500415,SK -1753500416,1753500991,US -1753500992,1753501039,CA -1753501040,1753507391,US -1753507392,1753507439,KR -1753507440,1753512703,US -1753512704,1753512959,SG -1753512960,1753515007,US -1753515008,1753516031,AU -1753516032,1753516543,US -1753516544,1753516799,ES -1753516800,1753517567,US -1753517568,1753517823,NO -1753517824,1753518079,US -1753518080,1753519103,JP -1753519104,1753520447,US -1753520448,1753520495,GB -1753520496,1753522431,US -1753522432,1753522687,FR -1753522688,1753526015,US -1753526016,1753526271,DE -1753526272,1753527039,US -1753527040,1753527295,NL -1753527296,1753529087,US -1753529088,1753529343,NZ -1753529344,1753532415,US -1753532416,1753532671,JP -1753532672,1753538815,US -1753538816,1753539071,PH -1753539072,1753539327,US -1753539328,1753539583,IE -1753539584,1753539839,CH -1753539840,1753541631,US -1753541632,1753541887,DE -1753541888,1753735167,US -1753735168,1753743359,IE -1753743360,1754136575,US -1754136576,1754169343,CA -1754169344,1754206335,US -1754206336,1754206463,WS -1754206464,1754206719,US -1754206720,1754206975,GW -1754206976,1754207231,RW -1754207232,1754207487,GA -1754207488,1754207743,KI -1754207744,1754207999,MM -1754208000,1754208255,VU -1754208256,1754208326,NA -1754208327,1754208327,AO -1754208328,1754208353,NA -1754208354,1754208354,AO -1754208355,1754208511,NA -1754208512,1754208767,DJ -1754208768,1754209023,BF -1754209024,1754209279,BW -1754209280,1754209535,PW -1754209536,1754209791,BR -1754209792,1754210047,AR -1754210048,1754210303,BJ -1754210304,1754223615,US -1754223616,1754223623,MX -1754223624,1754223631,AU -1754223632,1754251519,US -1754251520,1754251775,LY -1754251776,1754252031,US -1754252032,1754252287,MR -1754252288,1754252543,US -1754252544,1754252799,MZ -1754252800,1754253055,US -1754253056,1754253311,GN -1754253312,1754253567,US -1754253568,1754253823,ML -1754253824,1754254079,US -1754254080,1754254335,SO -1754254336,1754254591,CD -1754254592,1754254847,US -1754254848,1754255103,VE -1754255104,1754255359,US -1754255360,1754255615,EC -1754255616,1754255871,US -1754255872,1754256127,PY -1754256128,1754256383,US -1754256384,1754256639,BO -1754256640,1754256895,US -1754256896,1754257151,UY -1754257152,1754257407,US -1754257408,1754257663,TZ -1754257664,1754257919,US -1754257920,1754258175,TD -1754258176,1754258431,US -1754258432,1754258687,MG -1754258688,1754258943,US -1754258944,1754259199,TN -1754259200,1754267647,US -1754267648,1754267719,CA -1754267720,1754267727,US -1754267728,1754267935,CA -1754267936,1754267943,US -1754267944,1754267951,CA -1754267952,1754267959,FI -1754267960,1754267991,US -1754267992,1754268007,CA -1754268008,1754268015,US -1754268016,1754268063,CA -1754268064,1754268079,US -1754268080,1754268095,CA -1754268096,1754268159,US -1754268160,1754269055,CA -1754269056,1754269087,US -1754269088,1754269103,CA -1754269104,1754269119,US -1754269120,1754269151,CA -1754269152,1754269183,US -1754269184,1754269247,CA -1754269248,1754269311,US -1754269312,1754269327,CA -1754269328,1754269343,US -1754269344,1754269375,CA -1754269376,1754269423,US -1754269424,1754269567,CA -1754269568,1754269599,US -1754269600,1754269615,CA -1754269616,1754269631,US -1754269632,1754269647,CA -1754269648,1754269663,US -1754269664,1754271135,CA -1754271136,1754271167,US -1754271168,1754271231,CA -1754271232,1754271743,US -1754271744,1754271999,CA -1754272000,1754272127,US -1754272128,1754272143,CA -1754272144,1754272159,US -1754272160,1754272191,CA -1754272192,1754272207,US -1754272208,1754272223,CA -1754272224,1754272255,US -1754272256,1754272383,CA -1754272384,1754272415,US -1754272416,1754272431,CA -1754272432,1754272479,US -1754272480,1754272495,CA -1754272496,1754272511,US -1754272512,1754272655,CA -1754272656,1754272671,US -1754272672,1754272703,CA -1754272704,1754272719,US -1754272720,1754272735,CA -1754272736,1754272895,US -1754272896,1754272927,CA -1754272928,1754272975,US -1754272976,1754272991,CA -1754272992,1754273023,US -1754273024,1754273151,CA -1754273152,1754273183,US -1754273184,1754273199,CA -1754273200,1754273247,US -1754273248,1754273263,CA -1754273264,1754273279,US -1754273280,1754273407,CA -1754273408,1754273439,US -1754273440,1754273455,CA -1754273456,1754273487,US -1754273488,1754273839,CA -1754273840,1754273871,US -1754273872,1754273887,CA -1754273888,1754274175,US -1754274176,1754274559,CA -1754274560,1754274815,US -1754274816,1754274959,CA -1754274960,1754274991,US -1754274992,1754275007,CA -1754275008,1754275023,US -1754275024,1754275039,CA -1754275040,1754275199,US -1754275200,1754276127,CA -1754276128,1754276159,US -1754276160,1754276223,CA -1754276224,1754276287,US -1754276288,1754276863,CA -1754276864,1754277119,US -1754277120,1754281223,CA -1754281224,1754281231,NO -1754281232,1754281279,CA -1754281280,1754281343,US -1754281344,1754281407,CA -1754281408,1754281455,US -1754281456,1754281535,CA -1754281536,1754281663,US -1754281664,1754281727,CA -1754281728,1754281983,US -1754281984,1754282495,CA -1754282496,1754282751,US -1754282752,1754282895,CA -1754282896,1754282927,US -1754282928,1754282943,CA -1754282944,1754282959,US -1754282960,1754282967,CA -1754282968,1754282975,SE -1754282976,1754283007,US -1754283008,1754283263,CA -1754283264,1754283519,US -1754283520,1754284607,CA -1754284608,1754284671,US -1754284672,1754284703,CA -1754284704,1754284735,US -1754284736,1754285151,CA -1754285152,1754285167,US -1754285168,1754285951,CA -1754285952,1754286015,US -1754286016,1754286591,CA -1754286592,1754286847,US -1754286848,1754288143,CA -1754288144,1754288159,US -1754288160,1754288191,CA -1754288192,1754288207,US -1754288208,1754288223,CA -1754288224,1754288239,US -1754288240,1754288255,CA -1754288256,1754288383,US -1754288384,1754288447,CA -1754288448,1754288575,US -1754288576,1754288911,CA -1754288912,1754288927,US -1754288928,1754288943,CA -1754288944,1754288991,US -1754288992,1754289007,CA -1754289008,1754289055,US -1754289056,1754289071,CA -1754289072,1754289087,US -1754289088,1754289471,CA -1754289472,1754289487,US -1754289488,1754289495,CA -1754289496,1754289503,NO -1754289504,1754289519,US -1754289520,1754289535,CA -1754289536,1754289663,US -1754289664,1754290431,CA -1754290432,1754290447,US -1754290448,1754290479,CA -1754290480,1754290511,US -1754290512,1754290527,CA -1754290528,1754290543,US -1754290544,1754290559,CA -1754290560,1754290591,US -1754290592,1754290607,CA -1754290608,1754290623,US -1754290624,1754290943,CA -1754290944,1754290975,US -1754290976,1754290991,CA -1754290992,1754291023,US -1754291024,1754291039,CA -1754291040,1754291103,US -1754291104,1754291119,CA -1754291120,1754291135,US -1754291136,1754291471,CA -1754291472,1754291503,US -1754291504,1754291519,CA -1754291520,1754291535,US -1754291536,1754291551,CA -1754291552,1754291711,US -1754291712,1754292031,CA -1754292032,1754292095,US -1754292096,1754292543,CA -1754292544,1754292607,US -1754292608,1754292639,CA -1754292640,1754292671,US -1754292672,1754293343,CA -1754293344,1754293439,US -1754293440,1754294015,CA -1754294016,1754294063,US -1754294064,1754294079,CA -1754294080,1754294095,US -1754294096,1754294111,CA -1754294112,1754294127,US -1754294128,1754294143,CA -1754294144,1754294271,US -1754294272,1754294527,CA -1754294528,1754294655,US -1754294656,1754294943,CA -1754294944,1754294959,US -1754294960,1754294967,CA -1754294968,1754294975,US -1754294976,1754295951,CA -1754295952,1754295983,US -1754295984,1754295999,CA -1754296000,1754296015,US -1754296016,1754296031,CA -1754296032,1754296063,US -1754296064,1754296383,CA -1754296384,1754296407,US -1754296408,1754296415,CA -1754296416,1754296527,US -1754296528,1754296543,CA -1754296544,1754296575,US -1754296576,1754297471,CA -1754297472,1754297487,US -1754297488,1754297503,CA -1754297504,1754297535,US -1754297536,1754297551,CA -1754297552,1754297583,US -1754297584,1754298623,CA -1754298624,1754299135,US -1754299136,1754299647,CA -1754299648,1754299695,US -1754299696,1754299775,CA -1754299776,1754299791,US -1754299792,1754299839,CA -1754299840,1754299903,US -1754299904,1754300543,CA -1754300544,1754300575,US -1754300576,1754300591,CA -1754300592,1754300639,US -1754300640,1754300671,CA -1754300672,1754300751,US -1754300752,1754300767,CA -1754300768,1754300783,US -1754300784,1754300799,CA -1754300800,1754300879,US -1754300880,1754300895,CA -1754300896,1754300927,US -1754300928,1754303231,CA -1754303232,1754303247,US -1754303248,1754303359,CA -1754303360,1754303375,US -1754303376,1754303391,CA -1754303392,1754303487,US -1754303488,1754303551,CA -1754303552,1754303567,US -1754303568,1754303575,CA -1754303576,1754303679,US -1754303680,1754304543,CA -1754304544,1754304551,US -1754304552,1754304767,CA -1754304768,1754304783,US -1754304784,1754304799,CA -1754304800,1754304895,US -1754304896,1754304911,CA -1754304912,1754304943,US -1754304944,1754304959,CA -1754304960,1754304991,US -1754304992,1754305663,CA -1754305664,1754305695,US -1754305696,1754305711,CA -1754305712,1754305743,US -1754305744,1754305767,CA -1754305768,1754305791,US -1754305792,1754306047,CA -1754306048,1754306559,US -1754306560,1754306975,CA -1754306976,1754307031,US -1754307032,1754307039,CA -1754307040,1754307071,US -1754307072,1754307327,CA -1754307328,1754307391,US -1754307392,1754307423,CA -1754307424,1754307439,US -1754307440,1754307455,CA -1754307456,1754307487,US -1754307488,1754307503,CA -1754307504,1754307583,US -1754307584,1754307895,CA -1754307896,1754307903,SE -1754307904,1754308015,US -1754308016,1754308103,CA -1754308104,1754308111,US -1754308112,1754308127,CA -1754308128,1754308143,US -1754308144,1754308159,CA -1754308160,1754308191,US -1754308192,1754308239,CA -1754308240,1754308255,US -1754308256,1754308271,CA -1754308272,1754308303,US -1754308304,1754308311,CA -1754308312,1754308319,US -1754308320,1754308351,CA -1754308352,1754308367,US -1754308368,1754308383,CA -1754308384,1754308415,US -1754308416,1754308431,CA -1754308432,1754308447,US -1754308448,1754308455,CA -1754308456,1754308463,US -1754308464,1754308479,CA -1754308480,1754308543,US -1754308544,1754308559,CA -1754308560,1754308575,US -1754308576,1754308863,CA -1754308864,1754308879,US -1754308880,1754308895,CA -1754308896,1754308943,US -1754308944,1754308951,CA -1754308952,1754308959,SE -1754308960,1754308975,CA -1754308976,1754308991,US -1754308992,1754309023,CA -1754309024,1754309055,US -1754309056,1754309439,CA -1754309440,1754309471,US -1754309472,1754309479,CA -1754309480,1754309487,US -1754309488,1754309503,CA -1754309504,1754309583,US -1754309584,1754309615,CA -1754309616,1754309631,US -1754309632,1754309887,CA -1754309888,1754309903,US -1754309904,1754309935,CA -1754309936,1754309951,US -1754309952,1754309983,CA -1754309984,1754309999,US -1754310000,1754310079,CA -1754310080,1754310111,US -1754310112,1754310127,CA -1754310128,1754310143,US -1754310144,1754310415,CA -1754310416,1754310431,US -1754310432,1754310463,CA -1754310464,1754310479,US -1754310480,1754310495,CA -1754310496,1754310527,US -1754310528,1754310911,CA -1754310912,1754310943,US -1754310944,1754310975,CA -1754310976,1754310991,US -1754310992,1754311055,CA -1754311056,1754311119,US -1754311120,1754311151,CA -1754311152,1754311167,US -1754311168,1754311423,CA -1754311424,1754311487,US -1754311488,1754311503,CA -1754311504,1754311519,US -1754311520,1754311615,CA -1754311616,1754311647,US -1754311648,1754311663,CA -1754311664,1754311679,US -1754311680,1754311695,CA -1754311696,1754311711,US -1754311712,1754311743,CA -1754311744,1754311759,US -1754311760,1754311791,CA -1754311792,1754311967,US -1754311968,1754311975,CA -1754311976,1754311983,US -1754311984,1754311999,CA -1754312000,1754312191,US -1754312192,1754312447,CA -1754312448,1754312463,US -1754312464,1754312495,CA -1754312496,1754312575,US -1754312576,1754312639,CA -1754312640,1754312655,US -1754312656,1754312671,CA -1754312672,1754312703,US -1754312704,1754312719,CA -1754312720,1754312735,US -1754312736,1754312767,CA -1754312768,1754312783,US -1754312784,1754312815,CA -1754312816,1754312831,US -1754312832,1754312847,CA -1754312848,1754312863,US -1754312864,1754312879,CA -1754312880,1754312959,US -1754312960,1754313023,CA -1754313024,1754313055,US -1754313056,1754313071,CA -1754313072,1754313119,US -1754313120,1754313135,CA -1754313136,1754313151,US -1754313152,1754313247,CA -1754313248,1754313327,US -1754313328,1754313343,CA -1754313344,1754313391,US -1754313392,1754313535,CA -1754313536,1754313583,US -1754313584,1754313599,CA -1754313600,1754313615,US -1754313616,1754313663,CA -1754313664,1754313679,US -1754313680,1754313791,CA -1754313792,1754313807,US -1754313808,1754313823,CA -1754313824,1754313839,US -1754313840,1754313847,CA -1754313848,1754313903,US -1754313904,1754314031,CA -1754314032,1754314079,US -1754314080,1754314127,CA -1754314128,1754314143,US -1754314144,1754314175,CA -1754314176,1754314191,US -1754314192,1754314207,CA -1754314208,1754314239,US -1754314240,1754314255,CA -1754314256,1754314415,US -1754314416,1754314431,CA -1754314432,1754314463,US -1754314464,1754314511,CA -1754314512,1754314527,US -1754314528,1754314559,CA -1754314560,1754314575,US -1754314576,1754314623,CA -1754314624,1754314719,US -1754314720,1754314735,CA -1754314736,1754314767,US -1754314768,1754314815,CA -1754314816,1754314847,US -1754314848,1754314863,CA -1754314864,1754314991,US -1754314992,1754315071,CA -1754315072,1754315087,US -1754315088,1754315103,CA -1754315104,1754315135,US -1754315136,1754315199,CA -1754315200,1754315215,US -1754315216,1754315223,CA -1754315224,1754315263,US -1754315264,1754315311,CA -1754315312,1754315343,US -1754315344,1754315407,CA -1754315408,1754315423,US -1754315424,1754315471,CA -1754315472,1754315519,US -1754315520,1754315535,CA -1754315536,1754315551,US -1754315552,1754315559,CA -1754315560,1754315615,US -1754315616,1754315623,CA -1754315624,1754315631,US -1754315632,1754315647,CA -1754315648,1754316287,US -1754316288,1754317839,CA -1754317840,1754317903,US -1754317904,1754317919,CA -1754317920,1754317935,US -1754317936,1754317943,CA -1754317944,1754318111,US -1754318112,1754318119,CA -1754318120,1754318143,US -1754318144,1754318159,CA -1754318160,1754318175,US -1754318176,1754318207,CA -1754318208,1754318335,US -1754318336,1754319103,CA -1754319104,1754319119,US -1754319120,1754319135,CA -1754319136,1754319167,US -1754319168,1754319207,CA -1754319208,1754319215,US -1754319216,1754319247,CA -1754319248,1754319263,US -1754319264,1754319295,CA -1754319296,1754319311,US -1754319312,1754319327,CA -1754319328,1754319391,US -1754319392,1754319479,CA -1754319480,1754319487,US -1754319488,1754319551,CA -1754319552,1754319567,US -1754319568,1754319599,CA -1754319600,1754319615,US -1754319616,1754319663,CA -1754319664,1754319727,US -1754319728,1754319935,CA -1754319936,1754319951,US -1754319952,1754319983,CA -1754319984,1754319999,US -1754320000,1754320063,CA -1754320064,1754320095,US -1754320096,1754320111,CA -1754320112,1754320127,US -1754320128,1754320167,CA -1754320168,1754320223,US -1754320224,1754320231,CA -1754320232,1754320255,US -1754320256,1754320319,CA -1754320320,1754320415,US -1754320416,1754320447,CA -1754320448,1754320479,US -1754320480,1754320495,CA -1754320496,1754320527,US -1754320528,1754320543,CA -1754320544,1754320559,US -1754320560,1754320623,CA -1754320624,1754320639,US -1754320640,1754320655,CA -1754320656,1754320671,US -1754320672,1754320703,CA -1754320704,1754320719,US -1754320720,1754320767,CA -1754320768,1754320799,US -1754320800,1754320815,CA -1754320816,1754320895,US -1754320896,1754320911,CA -1754320912,1754320927,US -1754320928,1754320951,CA -1754320952,1754320975,US -1754320976,1754321023,CA -1754321024,1754321055,US -1754321056,1754321103,CA -1754321104,1754321119,US -1754321120,1754321151,CA -1754321152,1754321167,US -1754321168,1754321199,CA -1754321200,1754321231,US -1754321232,1754321239,CA -1754321240,1754321439,US -1754321440,1754321447,CA -1754321448,1754321487,US -1754321488,1754321511,CA -1754321512,1754321519,US -1754321520,1754321535,CA -1754321536,1754321551,US -1754321552,1754321567,CA -1754321568,1754321615,US -1754321616,1754322695,CA -1754322696,1754322703,US -1754322704,1754322719,CA -1754322720,1754322767,US -1754322768,1754322783,CA -1754322784,1754322847,US -1754322848,1754322863,CA -1754322864,1754322879,US -1754322880,1754323207,CA -1754323208,1754323215,US -1754323216,1754323231,CA -1754323232,1754323247,US -1754323248,1754323263,CA -1754323264,1754323279,US -1754323280,1754323287,CA -1754323288,1754323327,US -1754323328,1754323391,CA -1754323392,1754323455,US -1754323456,1754324095,CA -1754324096,1754324735,US -1754324736,1754324999,CA -1754325000,1754325007,US -1754325008,1754325039,CA -1754325040,1754325071,US -1754325072,1754325079,CA -1754325080,1754325087,US -1754325088,1754325119,CA -1754325120,1754325247,US -1754325248,1754325279,CA -1754325280,1754325343,US -1754325344,1754325391,CA -1754325392,1754325407,US -1754325408,1754325439,CA -1754325440,1754325487,US -1754325488,1754325599,CA -1754325600,1754325631,US -1754325632,1754325695,CA -1754325696,1754325759,US -1754325760,1754325767,CA -1754325768,1754325775,US -1754325776,1754325839,CA -1754325840,1754325855,US -1754325856,1754325887,CA -1754325888,1754325919,US -1754325920,1754325927,CA -1754325928,1754325935,US -1754325936,1754326079,CA -1754326080,1754326127,US -1754326128,1754326207,CA -1754326208,1754326239,US -1754326240,1754326255,CA -1754326256,1754326271,US -1754326272,1754326335,CA -1754326336,1754326399,US -1754326400,1754326415,CA -1754326416,1754326431,US -1754326432,1754326463,CA -1754326464,1754326495,US -1754326496,1754326511,CA -1754326512,1754326527,US -1754326528,1754326535,CA -1754326536,1754326543,US -1754326544,1754326591,CA -1754326592,1754326655,US -1754326656,1754326719,CA -1754326720,1754326751,US -1754326752,1754326759,CA -1754326760,1754326783,US -1754326784,1754326799,CA -1754326800,1754326815,US -1754326816,1754326847,CA -1754326848,1754327039,US -1754327040,1754327103,CA -1754327104,1754327231,US -1754327232,1754327551,CA -1754327552,1754328063,US -1754328064,1754328079,CA -1754328080,1754328111,US -1754328112,1754328127,CA -1754328128,1754328143,US -1754328144,1754328151,CA -1754328152,1754328319,US -1754328320,1754328575,CA -1754328576,1754329087,US -1754329088,1754329151,CA -1754329152,1754329183,US -1754329184,1754329215,CA -1754329216,1754329247,US -1754329248,1754329279,CA -1754329280,1754329311,US -1754329312,1754329335,CA -1754329336,1754329343,US -1754329344,1754329407,CA -1754329408,1754329455,US -1754329456,1754329471,CA -1754329472,1754329599,US -1754329600,1754329607,CA -1754329608,1754329631,US -1754329632,1754329663,CA -1754329664,1754329679,US -1754329680,1754329695,CA -1754329696,1754329711,US -1754329712,1754329743,CA -1754329744,1754329759,US -1754329760,1754329791,CA -1754329792,1754329839,US -1754329840,1754329871,CA -1754329872,1754329887,US -1754329888,1754329919,CA -1754329920,1754329935,US -1754329936,1754329951,CA -1754329952,1754330111,US -1754330112,1754330879,CA -1754330880,1754331135,US -1754331136,1754331263,CA -1754331264,1754331295,US -1754331296,1754331303,CA -1754331304,1754331375,US -1754331376,1754331407,CA -1754331408,1754331423,US -1754331424,1754331455,CA -1754331456,1754331487,US -1754331488,1754331495,CA -1754331496,1754331647,US -1754331648,1754331791,CA -1754331792,1754331823,US -1754331824,1754331839,CA -1754331840,1754331855,US -1754331856,1754331871,CA -1754331872,1754332191,US -1754332192,1754332199,CA -1754332200,1754332223,US -1754332224,1754332239,CA -1754332240,1754332271,US -1754332272,1754332287,CA -1754332288,1754332671,US -1754332672,1754332687,CA -1754332688,1754332703,US -1754332704,1754332735,CA -1754332736,1754332751,US -1754332752,1754332767,CA -1754332768,1754332927,US -1754332928,1754337279,CA -1754337280,1754394367,US -1754394368,1754394623,CA -1754394624,1754402815,US -1754402816,1754402879,NL -1754402880,1754402943,IE -1754402944,1754403135,NL -1754403136,1754403327,IE -1754403328,1754403519,NL -1754403520,1754403711,IE -1754403712,1754403775,HK -1754403776,1754403839,SG -1754403840,1754404415,NL -1754404416,1754404863,IE -1754404864,1754405375,US -1754405376,1754405567,NL -1754405568,1754405759,HK -1754405760,1754405887,US -1754405888,1754405903,NL -1754405904,1754405919,IE -1754405920,1754405951,NL -1754405952,1754405967,IE -1754405968,1754405983,HK -1754405984,1754405999,SG -1754406000,1754406031,NL -1754406032,1754406063,IE -1754406064,1754406399,US -1754406400,1754406719,IE -1754406720,1754406911,SG -1754406912,1754407103,US -1754407104,1754407167,NL -1754407168,1754407231,IE -1754407232,1754407615,US -1754407616,1754407807,NL -1754407808,1754407999,IE -1754408000,1754408383,US -1754408384,1754408575,NL -1754408576,1754408767,IE -1754408768,1754408831,HK -1754408832,1754408895,SG -1754408896,1754409919,US -1754409920,1754410495,NL -1754410496,1754411071,IE -1754411072,1754413103,US -1754413104,1754413119,NL -1754413120,1754413127,IE -1754413128,1754413231,US -1754413232,1754413279,NL -1754413280,1754413327,IE -1754413328,1754413423,US -1754413424,1754413471,NL -1754413472,1754413519,IE -1754413520,1754413535,HK -1754413536,1754413551,SG -1754413552,1754413807,US -1754413808,1754413951,NL -1754413952,1754414095,IE -1754414096,1754415231,US -1754415232,1754415359,NL -1754415360,1754415487,IE -1754415488,1754415615,US -1754415616,1754415743,NL -1754415744,1754415999,US -1754416000,1754416127,NL -1754416128,1754416255,IE -1754416256,1754416383,HK -1754416384,1754416511,SG -1754416512,1754416895,US -1754416896,1754417151,NL -1754417152,1754417407,IE -1754417408,1754429455,US -1754429456,1754429471,NL -1754429472,1754429487,IE -1754429488,1754429503,US -1754429504,1754429519,NL -1754429520,1754429551,US -1754429552,1754429567,NL -1754429568,1754429583,IE -1754429584,1754429599,HK -1754429600,1754429615,SG -1754429616,1754429663,US -1754429664,1754429695,NL -1754429696,1754429727,IE -1754429728,1754431487,US -1754431488,1754433023,IE -1754433024,1754434047,US -1754434048,1754434559,HK -1754434560,1754435583,US -1754435584,1754436095,IE -1754436096,1754436607,US -1754436608,1754437119,NL -1754437120,1754437631,US -1754437632,1754438143,IE -1754438144,1754439679,US -1754439680,1754440703,NL -1754440704,1754441727,AU -1754441728,1754442751,US -1754442752,1754443775,IN -1754443776,1754444031,IE -1754444032,1754444287,JP -1754444288,1754444799,SG -1754444800,1754445055,HK -1754445056,1754445311,JP -1754445312,1754445567,NL -1754445568,1754445823,CA -1754445824,1754446079,US -1754446080,1754446335,IE -1754446336,1754447871,US -1754447872,1754448127,NL -1754448128,1754448383,CA -1754448384,1754448639,US -1754448640,1754448895,GB -1754448896,1754449407,JP -1754449408,1754449919,SG -1754449920,1754451199,NL -1754451200,1754453247,US -1754453248,1754453503,BR -1754453504,1754454271,IE -1754454272,1754455551,US -1754455552,1754456063,HK -1754456064,1754456319,US -1754456320,1754456575,IE -1754456576,1754456831,US -1754456832,1754457087,NL -1754457088,1754457343,SG -1754457344,1754457855,US -1754457856,1754458111,GB -1754458112,1754458623,US -1754458624,1754458879,NL -1754458880,1754459903,US -1754459904,1754460159,IE -1754460160,1754461183,US -1754461184,1754461951,NL -1754461952,1754462719,US -1754462720,1754463231,IE -1754463232,1754465791,US -1754465792,1754466303,NL -1754466304,1754466815,IE -1754466816,1754469887,US -1754469888,1754471423,NL -1754471424,1754472959,IE -1754472960,1754476031,US -1754476032,1754477567,NL -1754477568,1754479103,IE -1754479104,1754479615,HK -1754479616,1754480127,SG -1754480128,1754488319,US -1754488320,1754492927,NL -1754492928,1754497535,IE -1754497536,1754515711,US -1754515712,1754515967,IE -1754515968,1754521791,US -1754521792,1754521855,NL -1754521856,1754521919,IE -1754521920,1754522303,US -1754522304,1754522495,NL -1754522496,1754522687,IE -1754522688,1754523071,US -1754523072,1754523263,NL -1754523264,1754523455,IE -1754523456,1754523519,HK -1754523520,1754523583,SG -1754523584,1754524607,US -1754524608,1754525183,NL -1754525184,1754525951,IE -1754525952,1754526143,US -1754526144,1754526335,NL -1754526336,1754527295,US -1754527296,1754527487,HK -1754527488,1754527679,US -1754527680,1754527871,SG -1754527872,1754528063,IE -1754528064,1754528255,NL -1754528256,1754792959,US -1754792960,1754793983,CA -1754793984,1754799103,US -1754799104,1754800127,CA -1754800128,1754822655,US -1754822656,1754823679,CA -1754823680,1754830847,US -1754830848,1754831871,CA -1754831872,1754832895,US -1754832896,1754835967,CA -1754835968,1754845183,US -1754845184,1754846207,CA -1754846208,1754849279,US -1754849280,1754850303,CA -1754850304,1754852351,US -1754852352,1754853375,JM -1754853376,1754863615,US -1754863616,1754864639,CA -1754864640,1754869759,US -1754869760,1754870783,CA -1754870784,1754871807,US -1754871808,1754872831,CA -1754872832,1754890239,US -1754890240,1754892287,BB -1754892288,1754894335,CA -1754894336,1754899455,US -1754899456,1754900479,CA -1754900480,1754911743,US -1754911744,1754912767,CA -1754912768,1754920959,US -1754920960,1754921983,DM -1754921984,1755062271,US -1755062272,1755066367,CA -1755066368,1755070463,US -1755070464,1755074559,CA -1755074560,1755075071,US -1755075072,1755075327,BR -1755075328,1755076607,US -1755076608,1755077119,AU -1755077120,1755077887,US -1755077888,1755078143,FR -1755078144,1755078399,CA -1755078400,1755103487,US -1755103488,1755103743,MH -1755103744,1755103999,US -1755104000,1755104255,ZM -1755104256,1755104511,US -1755104512,1755104767,HT -1755104768,1755105023,US -1755105024,1755105279,BB -1755105280,1755106047,US -1755106048,1755106303,SR -1755106304,1755106559,US -1755106560,1755106815,BZ -1755106816,1755107071,US -1755107072,1755107327,MW -1755107328,1755107583,US -1755107584,1755107839,DM -1755107840,1755108095,US -1755108096,1755108351,NE -1755108352,1755108607,US -1755108608,1755108863,AG -1755108864,1755109119,US -1755109120,1755109375,TL -1755109376,1755109631,US -1755109632,1755109887,HN -1755109888,1755110143,US -1755110144,1755110399,SB -1755110400,1755110655,US -1755110656,1755110911,JO -1755110912,1755111167,US -1755111168,1755111423,SD -1755111424,1755113471,US -1755113472,1755113983,AU -1755113984,1755115007,US -1755115008,1755115519,JP -1755115520,1755119615,US -1755119616,1755283455,CA -1755283456,1755319807,US -1755319808,1755320319,DK -1755320320,1755320575,IE -1755320576,1755320831,US -1755320832,1755321343,EE -1755321344,1755321599,NO -1755321600,1755321855,DK -1755321856,1755322367,US -1755322368,1755322879,NZ -1755322880,1755356159,US -1755356160,1755356415,AU -1755356416,1755365375,US -1755365376,1755373567,CA -1755373568,1755374847,US -1755374848,1755375103,DE -1755375104,1755391231,US -1755391232,1755391487,BD -1755391488,1755405951,US -1755405952,1755406015,CN -1755406016,1755512831,US -1755512832,1755578367,CA -1755578368,1755717631,US -1755717632,1755721727,BS -1755721728,1755734271,US -1755734272,1755734527,LB -1755734528,1755734783,BS -1755734784,1755735295,US -1755735296,1755735551,KE -1755735552,1755735807,MA -1755735808,1755736063,CN -1755736064,1755736319,US -1755736320,1755736575,MX -1755736576,1755736831,AW -1755736832,1755737087,US -1755737088,1755737343,GH -1755737344,1755737599,IN -1755737600,1755737855,MO -1755737856,1755738111,MT -1755738112,1755738367,QA -1755738368,1755738623,YE -1755738624,1755738879,GR -1755738880,1755739135,US -1755739136,1755739391,BH -1755739392,1755739647,CO -1755739648,1755739903,OM -1755739904,1755740159,BN -1755740160,1755740415,SC -1755740416,1755740671,SY -1755740672,1755741183,US -1755741184,1755741439,PA -1755741440,1755741695,BZ -1755741696,1755741951,IM -1755741952,1755742207,NG -1755742208,1755799551,US -1755799552,1755807743,CA -1755807744,1755824127,US -1755824128,1755824383,TV -1755824384,1755824639,SY -1755824640,1755824895,ZW -1755824896,1755825151,US -1755825152,1755825407,GM -1755825408,1755825663,AO -1755825664,1755825919,LB -1755825920,1755826175,MW -1755826176,1755826431,CV -1755826432,1755826687,TZ -1755826688,1755826943,KM -1755826944,1755827199,MN -1755827200,1755827455,CG -1755827456,1755827711,FM -1755827712,1755827967,SB -1755827968,1755828223,BI -1755828224,1755828479,CD -1755828480,1755828735,NE -1755828736,1755828991,NP -1755828992,1755829247,PK -1755829248,1755829503,KZ -1755829504,1755829759,OM -1755829760,1755830015,GB -1755830016,1755830271,ST -1755830272,1755830527,LR -1755830528,1755830783,JP -1755830784,1755831039,SD -1755831040,1755831295,MU -1755831296,1755831551,GQ -1755831552,1755831807,MK -1755831808,1755832063,GB -1755832064,1755832319,ML -1755832320,1755832575,DZ -1755832576,1755832831,MM -1755832832,1755833087,NR -1755833088,1755833343,SA -1755833344,1755833599,IN -1755833600,1755833855,BY -1755833856,1755834111,SZ -1755834112,1755834367,CN -1755834368,1755834623,TN -1755834624,1755834879,AS -1755834880,1755835135,PG -1755835136,1755835391,GB -1755835392,1755835647,BA -1755835648,1755835903,US -1755835904,1755836159,GN -1755836160,1755836415,FJ -1755836416,1755836671,MH -1755836672,1755836927,SL -1755836928,1755837183,GB -1755837184,1755837439,MG -1755837440,1755837695,ME -1755837696,1755837951,MR -1755837952,1755838207,SO -1755838208,1755838463,UA -1755838464,1755838719,LY -1755838720,1755838975,TO -1755838976,1755839231,TD -1755839232,1755839487,MZ -1755839488,1755839743,ZM -1755839744,1755839999,ER -1755840000,1755840255,AL -1755840256,1755840511,RU -1755840512,1755846623,US -1755846624,1755846631,GB -1755846632,1755863327,US -1755863328,1755863335,GB -1755863336,1756049407,US -1756049408,1756053503,CA -1756053504,1756086271,US -1756086272,1756090367,CA -1756090368,1757417471,US -1757417472,1757419519,CA -1757419520,1757424639,US -1757424640,1757425663,CA -1757425664,1757426687,US -1757426688,1757427711,CA -1757427712,1757432831,US -1757432832,1757433855,CA -1757433856,1757441023,US -1757441024,1757441535,CN -1757441536,1757443071,US -1757443072,1757446143,CA -1757446144,1757447167,US -1757447168,1757447343,CA -1757447344,1757447344,US -1757447345,1757448191,CA -1757448192,1757450239,US -1757450240,1757451263,CA -1757451264,1757452287,US -1757452288,1757453311,CA -1757453312,1757457407,US -1757457408,1757458431,CA -1757458432,1757460479,US -1757460480,1757462527,VI -1757462528,1757466623,US -1757466624,1757468671,CA -1757468672,1757472767,US -1757472768,1757473791,CA -1757473792,1757487103,US -1757487104,1757489151,CA -1757489152,1757491199,US -1757491200,1757497343,CA -1757497344,1757501683,US -1757501684,1757501684,CN -1757501685,1757502463,US -1757502464,1757503487,CA -1757503488,1757505535,US -1757505536,1757506559,CA -1757506560,1757512703,US -1757512704,1757513727,CA -1757513728,1757522943,US -1757522944,1757523967,CA -1757523968,1757529087,US -1757529088,1757530111,AI -1757530112,1757532159,US -1757532160,1757533183,CA -1757533184,1757543295,US -1757543296,1757543327,AU -1757543328,1757552639,US -1757552640,1757560831,CA -1757560832,1757596415,US -1757596416,1757596671,AU -1757596672,1757642751,US -1757642752,1757675519,CA -1757675520,1757916815,US -1757916816,1757916816,AU -1757916817,1757937663,US -1757937664,1757941759,CA -1757941760,1757957631,US -1757957632,1757957887,NL -1757957888,1757958143,US -1757958144,1757962239,CA -1757962240,1757966335,BB -1757966336,1757996287,US -1757996288,1757996543,GB -1757996544,1758002431,US -1758002432,1758002687,GB -1758002688,1758199807,US -1758199808,1758330879,CA -1758330880,1758392319,US -1758392320,1758393343,NL -1758393344,1758412799,US -1758412800,1758413055,BG -1758413056,1758413311,SE -1758413312,1758413567,PS -1758413568,1758414335,US -1758414336,1758414591,LV -1758414592,1758414847,IN -1758414848,1758415103,US -1758415104,1758415359,GB -1758415360,1758415615,FR -1758415616,1758415871,CY -1758415872,1758416127,IT -1758416128,1758416383,US -1758416384,1758416639,CF -1758416640,1758416895,US -1758416896,1758417151,VC -1758417152,1758417407,ID -1758417408,1758417663,CL -1758417664,1758417919,HK -1758417920,1758418175,DE -1758418176,1758418431,US -1758418432,1758418687,CN -1758418688,1758418943,BL -1758418944,1758419199,US -1758419200,1758419455,CR -1758419456,1758420223,US -1758420224,1758420479,HU -1758420480,1758420735,CH -1758420736,1758420991,MM -1758420992,1758429695,US -1758429696,1758430207,DE -1758430208,1758478335,US -1758478336,1758494719,HK -1758494720,1758543871,US -1758543872,1758552063,AU -1758552064,1758609407,US -1758609408,1758625791,AU -1758625792,1758674943,US -1758674944,1758724095,IN -1758724096,1758887935,US -1758887936,1758896127,JP -1758896128,1758904319,HK -1758904320,1758920703,NL -1758920704,1758937087,JP -1758937088,1758953471,US -1758953472,1758986239,SG -1758986240,1759128575,US -1759128576,1759129599,CA -1759129600,1759131647,US -1759131648,1759133695,CA -1759133696,1759138815,US -1759138816,1759139839,CA -1759139840,1759140863,US -1759140864,1759141887,CA -1759141888,1759148031,US -1759148032,1759148543,NL -1759148544,1759149055,US -1759149056,1759150079,CA -1759150080,1759160319,US -1759160320,1759162367,BM -1759162368,1759163391,BB -1759163392,1759166463,US -1759166464,1759167511,CA -1759167512,1759172607,US -1759172608,1759173631,LC -1759173632,1759178751,US -1759178752,1759179775,PR -1759179776,1759184895,US -1759184896,1759186943,CA -1759186944,1759188991,US -1759188992,1759190015,VC -1759190016,1759191039,PR -1759191040,1759201279,US -1759201280,1759202303,VG -1759202304,1759208447,US -1759208448,1759209471,CA -1759209472,1759212543,US -1759212544,1759217663,CA -1759217664,1759222783,US -1759222784,1759223807,CA -1759223808,1759230975,US -1759230976,1759233023,CA -1759233024,1759234047,US -1759234048,1759236095,CA -1759236096,1759239167,US -1759239168,1759240191,CA -1759240192,1759313919,US -1759313920,1759346687,CA -1759346688,1759408127,US -1759408128,1759412223,CA -1759412224,1759412991,US -1759412992,1759413247,AU -1759413248,1759414271,US -1759414272,1759414527,SE -1759414528,1759415295,US -1759415296,1759415551,SG -1759415552,1759416575,US -1759416576,1759416831,HK -1759416832,1759417599,US -1759417600,1759417855,FR -1759417856,1759428607,US -1759428608,1759428863,LB -1759428864,1759429119,US -1759429120,1759429375,LK -1759429376,1759429631,MO -1759429632,1759429887,CN -1759429888,1759430143,DK -1759430144,1759430399,QA -1759430400,1759430655,BA -1759430656,1759430911,AR -1759430912,1759431167,MX -1759431168,1759431423,AW -1759431424,1759431679,BZ -1759431680,1759431935,BS -1759431936,1759432191,IN -1759432192,1759432447,HR -1759432448,1759432703,OM -1759432704,1759432959,PK -1759432960,1759433215,PS -1759433216,1759433471,SA -1759433472,1759433983,US -1759433984,1759434239,MA -1759434240,1759434495,DE -1759434496,1759434751,JP -1759434752,1759435007,SY -1759435008,1759435263,US -1759435264,1759435519,HK -1759435520,1759435775,IQ -1759435776,1759436031,KE -1759436032,1759436287,AE -1759436288,1759510527,US -1759510528,1759510783,VE -1759510784,1759511039,AG -1759511040,1759511295,GT -1759511296,1759511551,VC -1759511552,1759511807,PY -1759511808,1759512063,JM -1759512064,1759512319,MS -1759512320,1759512575,GD -1759512576,1759512831,LC -1759512832,1759513087,HT -1759513088,1759513343,EC -1759513344,1759513599,KN -1759513600,1759513855,SR -1759513856,1759514111,NI -1759514112,1759514367,BB -1759514368,1759514623,PE -1759514624,1759514879,KY -1759514880,1759515135,TT -1759515136,1759515391,GY -1759515392,1759515647,BO -1759515648,1759515903,CU -1759515904,1759516159,DM -1759516160,1759516415,SH -1759516416,1759516671,BM -1759516672,1759516927,FJ -1759516928,1759517183,HN -1759517184,1759517439,GL -1759517440,1759517695,MQ -1759517696,1759517951,GF -1759517952,1759518207,MF -1759518208,1759518463,BZ -1759518464,1759518719,GP -1759518720,1759518975,AW -1759518976,1759519231,AI -1759519232,1759519487,BL -1759519488,1759519743,CO -1759519744,1759519999,TC -1759520000,1759520255,VG -1759520256,1759520511,WF -1759520512,1759520767,US -1759520768,1759521023,SV -1759521024,1759521279,TK -1759521280,1759521535,SJ -1759521536,1759521791,PM -1759521792,1759522047,GS -1759522048,1759522303,DO -1759522304,1759522559,RE -1759522560,1759522815,PN -1759522816,1759523071,MP -1759523072,1759523327,NF -1759523328,1759523583,PR -1759523584,1759523839,NU -1759523840,1759524095,NC -1759524096,1759524351,NL -1759524352,1759524607,CX -1759524608,1759524863,BS -1759524864,1759525119,PF -1759525120,1759525375,CK -1759525376,1759525631,TF -1759525632,1759525887,FK -1759525888,1759526143,GG -1759526144,1759526399,CC -1759526400,1759526655,JE -1759526656,1759526911,FO -1759526912,1759531007,US -1759531008,1759533055,SG -1759533056,1759533311,US -1759533312,1759533567,GB -1759533568,1759533823,FR -1759533824,1759534079,SG -1759534080,1759534335,FR -1759534336,1759534591,GB -1759534592,1759535103,SG -1759535104,1759543295,CA -1759543296,1759547391,US -1759547392,1759548415,NL -1759548416,1759617023,US -1759617024,1759617279,MX -1759617280,1759707391,US -1759707392,1759707655,CA -1759707656,1759707663,US -1759707664,1759707679,CA -1759707680,1759707687,US -1759707688,1759707711,CA -1759707712,1759707719,US -1759707720,1759707727,CA -1759707728,1759707735,US -1759707736,1759707743,NO -1759707744,1759707759,CA -1759707760,1759707783,US -1759707784,1759707807,CA -1759707808,1759707823,US -1759707824,1759707855,CA -1759707856,1759707863,US -1759707864,1759707879,CA -1759707880,1759707887,US -1759707888,1759707911,CA -1759707912,1759707919,US -1759707920,1759707935,CA -1759707936,1759707943,US -1759707944,1759707975,CA -1759707976,1759707991,US -1759707992,1759708031,CA -1759708032,1759708159,US -1759708160,1759708351,CA -1759708352,1759708399,US -1759708400,1759708407,CA -1759708408,1759708751,US -1759708752,1759708759,CA -1759708760,1759709439,US -1759709440,1759710207,CA -1759710208,1759710463,US -1759710464,1759711231,CA -1759711232,1759711487,US -1759711488,1759711615,CA -1759711616,1759711703,US -1759711704,1759711711,CA -1759711712,1759711727,US -1759711728,1759711743,CA -1759711744,1759712255,US -1759712256,1759712271,CA -1759712272,1759712287,US -1759712288,1759712319,CA -1759712320,1759712335,US -1759712336,1759712351,CA -1759712352,1759712511,US -1759712512,1759712639,CA -1759712640,1759712767,US -1759712768,1759713279,CA -1759713280,1759713791,US -1759713792,1759714815,CA -1759714816,1759715071,US -1759715072,1759715327,CA -1759715328,1759715375,US -1759715376,1759715391,CA -1759715392,1759715407,US -1759715408,1759715439,CA -1759715440,1759715839,US -1759715840,1759715903,CA -1759715904,1759715967,US -1759715968,1759716159,CA -1759716160,1759716223,US -1759716224,1759716255,CA -1759716256,1759716287,US -1759716288,1759716991,CA -1759716992,1759717023,US -1759717024,1759717039,CA -1759717040,1759717055,US -1759717056,1759717071,CA -1759717072,1759717119,US -1759717120,1759718399,CA -1759718400,1759718655,US -1759718656,1759719519,CA -1759719520,1759719615,US -1759719616,1759719807,CA -1759719808,1759719839,US -1759719840,1759719855,CA -1759719856,1759719919,US -1759719920,1759719935,CA -1759719936,1759719967,US -1759719968,1759719999,CA -1759720000,1759720015,US -1759720016,1759720063,CA -1759720064,1759720095,US -1759720096,1759720127,CA -1759720128,1759720159,US -1759720160,1759720207,CA -1759720208,1759720223,US -1759720224,1759720255,CA -1759720256,1759720271,US -1759720272,1759720287,CA -1759720288,1759720319,US -1759720320,1759720383,CA -1759720384,1759720415,US -1759720416,1759720431,CA -1759720432,1759720543,US -1759720544,1759720575,CA -1759720576,1759720703,US -1759720704,1759720767,CA -1759720768,1759720783,US -1759720784,1759720791,CA -1759720792,1759720815,US -1759720816,1759720831,CA -1759720832,1759721183,US -1759721184,1759721215,CA -1759721216,1759721375,US -1759721376,1759721391,CA -1759721392,1759721423,US -1759721424,1759721439,CA -1759721440,1759721471,US -1759721472,1759721535,CA -1759721536,1759721647,US -1759721648,1759721663,CA -1759721664,1759721695,US -1759721696,1759721727,CA -1759721728,1759721743,US -1759721744,1759721759,CA -1759721760,1759721823,US -1759721824,1759721831,CA -1759721832,1759721839,NO -1759721840,1759722047,US -1759722048,1759722079,CA -1759722080,1759722271,US -1759722272,1759722367,CA -1759722368,1759722383,US -1759722384,1759722431,CA -1759722432,1759722479,US -1759722480,1759722495,CA -1759722496,1759722511,US -1759722512,1759722527,CA -1759722528,1759722559,US -1759722560,1759722607,CA -1759722608,1759722655,US -1759722656,1759722687,CA -1759722688,1759722895,US -1759722896,1759722911,CA -1759722912,1759722975,US -1759722976,1759722991,CA -1759722992,1759723007,US -1759723008,1759723071,CA -1759723072,1759723151,US -1759723152,1759723167,CA -1759723168,1759723199,US -1759723200,1759723231,CA -1759723232,1759723247,US -1759723248,1759723279,CA -1759723280,1759723295,US -1759723296,1759723327,CA -1759723328,1759723343,US -1759723344,1759723359,CA -1759723360,1759723551,US -1759723552,1759723583,CA -1759723584,1759723599,US -1759723600,1759723615,CA -1759723616,1759723631,US -1759723632,1759723647,CA -1759723648,1759723823,US -1759723824,1759723831,CA -1759723832,1759723839,US -1759723840,1759723887,CA -1759723888,1759723999,US -1759724000,1759724159,CA -1759724160,1759724223,US -1759724224,1759724239,CA -1759724240,1759724255,US -1759724256,1759725055,CA -1759725056,1759726079,US -1759726080,1759726975,CA -1759726976,1759727007,US -1759727008,1759727023,CA -1759727024,1759727087,US -1759727088,1759727095,CA -1759727096,1759727103,US -1759727104,1759727359,CA -1759727360,1759727615,US -1759727616,1759727679,CA -1759727680,1759727807,US -1759727808,1759727935,CA -1759727936,1759728063,US -1759728064,1759728383,CA -1759728384,1759728639,US -1759728640,1759728671,CA -1759728672,1759728703,US -1759728704,1759728767,CA -1759728768,1759728799,US -1759728800,1759728831,CA -1759728832,1759728895,US -1759728896,1759729151,CA -1759729152,1759729663,US -1759729664,1759729711,CA -1759729712,1759729743,US -1759729744,1759729751,CA -1759729752,1759729967,US -1759729968,1759730015,CA -1759730016,1759730175,US -1759730176,1759730191,CA -1759730192,1759730207,US -1759730208,1759730239,CA -1759730240,1759730303,US -1759730304,1759730367,CA -1759730368,1759730399,US -1759730400,1759730415,CA -1759730416,1759730463,US -1759730464,1759730495,CA -1759730496,1759730519,US -1759730520,1759730543,CA -1759730544,1759730559,US -1759730560,1759730623,CA -1759730624,1759730839,US -1759730840,1759730847,CA -1759730848,1759730879,US -1759730880,1759730895,CA -1759730896,1759730911,US -1759730912,1759730927,CA -1759730928,1759731711,US -1759731712,1759734079,CA -1759734080,1759734159,US -1759734160,1759734167,CA -1759734168,1759734207,US -1759734208,1759734271,CA -1759734272,1759734279,US -1759734280,1759734303,CA -1759734304,1759734351,US -1759734352,1759734367,CA -1759734368,1759734383,US -1759734384,1759734399,CA -1759734400,1759734431,US -1759734432,1759734463,CA -1759734464,1759734607,US -1759734608,1759734639,CA -1759734640,1759734735,US -1759734736,1759734751,CA -1759734752,1759734783,US -1759734784,1759735967,CA -1759735968,1759736015,US -1759736016,1759736031,CA -1759736032,1759736063,US -1759736064,1759736383,CA -1759736384,1759736447,US -1759736448,1759736575,CA -1759736576,1759737007,US -1759737008,1759737015,CA -1759737016,1759737071,US -1759737072,1759737087,CA -1759737088,1759737343,US -1759737344,1759737407,CA -1759737408,1759737423,US -1759737424,1759737431,CA -1759737432,1759737535,US -1759737536,1759738879,CA -1759738880,1759739023,US -1759739024,1759739055,CA -1759739056,1759739103,US -1759739104,1759739455,CA -1759739456,1759739519,US -1759739520,1759739551,CA -1759739552,1759739567,US -1759739568,1759739575,CA -1759739576,1759739583,US -1759739584,1759739999,CA -1759740000,1759740015,US -1759740016,1759740023,CA -1759740024,1759740031,US -1759740032,1759740287,CA -1759740288,1759740351,US -1759740352,1759743999,CA -1759744000,1759744255,US -1759744256,1759746047,CA -1759746048,1759746303,US -1759746304,1759747135,CA -1759747136,1759747151,US -1759747152,1759747159,CA -1759747160,1759747263,US -1759747264,1759747391,CA -1759747392,1759747407,US -1759747408,1759747415,CA -1759747416,1759747455,US -1759747456,1759747647,CA -1759747648,1759747663,US -1759747664,1759747671,CA -1759747672,1759747775,US -1759747776,1759747839,CA -1759747840,1759747927,US -1759747928,1759747935,CA -1759747936,1759748095,US -1759748096,1759748159,CA -1759748160,1759748175,US -1759748176,1759748183,CA -1759748184,1759748287,US -1759748288,1759748407,CA -1759748408,1759748431,US -1759748432,1759748439,CA -1759748440,1759748479,US -1759748480,1759748607,CA -1759748608,1759748647,US -1759748648,1759748655,SE -1759748656,1759748863,US -1759748864,1759749119,CA -1759749120,1759749631,US -1759749632,1759749903,CA -1759749904,1759749919,US -1759749920,1759749935,CA -1759749936,1759749975,US -1759749976,1759749983,CA -1759749984,1759750191,US -1759750192,1759750207,CA -1759750208,1759750223,US -1759750224,1759750239,CA -1759750240,1759750335,US -1759750336,1759750351,CA -1759750352,1759750367,US -1759750368,1759750399,CA -1759750400,1759750415,US -1759750416,1759750431,CA -1759750432,1759750463,US -1759750464,1759750479,CA -1759750480,1759750495,US -1759750496,1759750511,CA -1759750512,1759751167,US -1759751168,1759751823,CA -1759751824,1759751839,US -1759751840,1759752191,CA -1759752192,1759752447,US -1759752448,1759752543,CA -1759752544,1759752639,US -1759752640,1759753023,CA -1759753024,1759753047,US -1759753048,1759753055,CA -1759753056,1759753087,US -1759753088,1759753103,CA -1759753104,1759753135,US -1759753136,1759753151,CA -1759753152,1759753215,US -1759753216,1759754239,CA -1759754240,1759754495,US -1759754496,1759754639,CA -1759754640,1759754719,US -1759754720,1759754735,CA -1759754736,1759754751,US -1759754752,1759754879,CA -1759754880,1759755007,US -1759755008,1759755151,CA -1759755152,1759755167,US -1759755168,1759755199,CA -1759755200,1759755263,US -1759755264,1759755663,CA -1759755664,1759755775,US -1759755776,1759755903,CA -1759755904,1759755935,US -1759755936,1759755943,CA -1759755944,1759755967,US -1759755968,1759755983,CA -1759755984,1759755999,US -1759756000,1759756159,CA -1759756160,1759756239,US -1759756240,1759756247,CA -1759756248,1759764479,US -1759764480,1759768575,CA -1759768576,1759768831,US -1759768832,1759772671,CA -1759772672,1760034815,US -1760038912,1760047103,US -1760047104,1760051199,CA -1760051200,1760083967,US -1760083968,1760086015,SE -1760086016,1760088063,GB -1760088064,1760116735,US -1760116736,1760133119,CA -1760133120,1760165887,US -1760165888,1760231423,CA -1760231424,1760383743,US -1760383744,1760383999,MO -1760384000,1760384255,GB -1760384256,1760384511,BZ -1760384512,1760384767,US -1760384768,1760385023,KE -1760385024,1760385279,US -1760385280,1760385535,SG -1760385536,1760385791,US -1760385792,1760386047,HK -1760386048,1760386303,US -1760386304,1760386559,GB -1760386560,1760386815,US -1760386816,1760387071,HK -1760387072,1760440831,US -1760440832,1760441343,AU -1760441344,1760443391,US -1760443392,1760444415,DE -1760444416,1760465919,US -1760465920,1760466943,JP -1760466944,1760468479,US -1760468480,1760468991,DE -1760468992,1760469503,JP -1760469504,1760470527,US -1760470528,1760471039,DE -1760471040,1760473087,GB -1760473088,1760473599,DE -1760473600,1760475135,US -1760475136,1760476159,GB -1760476160,1760477183,FR -1760477184,1760657407,US -1760657408,1760673791,CA -1760673792,1760690175,US -1760690176,1760755711,CA -1760755712,1760776191,US -1760776192,1760784383,CA -1760784384,1760811007,US -1760811008,1760812031,NL -1760812032,1760812543,US -1760812544,1760813055,CA -1760813056,1760817151,US -1760817152,1760817407,MO -1760817408,1760817663,BZ -1760817664,1760817919,BS -1760817920,1760818175,PA -1760818176,1760818431,AR -1760818432,1760818687,MX -1760818688,1760818943,AW -1760818944,1760819199,US -1760819200,1760819455,RO -1760819456,1760819711,AM -1760819712,1760819967,MA -1760819968,1760820479,US -1760820480,1760820735,CA -1760820736,1760822271,US -1760823296,1760824319,PT -1760824320,1760837631,US -1760837632,1760839679,CA -1760839680,1760841727,LU -1760841728,1760867327,US -1760867328,1760868351,PR -1760868352,1760869375,US -1760869376,1760870399,CA -1760870400,1760871423,US -1760871424,1760872447,CA -1760872448,1760878591,US -1760878592,1760880639,JM -1760880640,1760883711,US -1760883712,1760884735,CA -1760884736,1760886783,US -1760886784,1760888831,CA -1760888832,1760889087,US -1760889088,1760889343,JP -1760889344,1760889599,GB -1760889600,1760890623,US -1760890624,1760890879,SG -1760890880,1760896255,US -1760896256,1760896511,CA -1760896512,1760899071,US -1760899072,1760900095,GD -1760900096,1760903167,US -1760903168,1760904191,CA -1760904192,1760909311,US -1760909312,1760910335,VG -1760910336,1760911359,GD -1760911360,1760915455,US -1760915456,1760917503,MQ -1760917504,1760923647,US -1760923648,1760924671,CA -1760924672,1760925695,US -1760925696,1760929791,CA -1760929792,1760937983,US -1760937984,1760939007,CA -1760939008,1760940031,DM -1760940032,1760944127,US -1760944128,1760945151,CA -1760945152,1760985087,US -1760985088,1761017855,CA -1761017856,1761019647,US -1761019648,1761019903,VE -1761019904,1761023231,US -1761023232,1761023487,JP -1761023488,1761035263,US -1761035264,1761035519,CA -1761035520,1761038335,US -1761038336,1761039871,CA -1761039872,1761043711,US -1761043712,1761043967,PH -1761043968,1761044479,US -1761044480,1761044735,AU -1761044736,1761046527,US -1761046528,1761046783,JP -1761046784,1761048063,US -1761048064,1761048319,IN -1761048320,1761075199,US -1761075200,1761083391,CA -1761083392,1761181695,US -1761181696,1761181951,MX -1761181952,1761182207,US -1761182208,1761182463,GB -1761182464,1761183487,US -1761183488,1761183743,GB -1761183744,1761183999,AU -1761184000,1761185023,US -1761185024,1761185279,RU -1761185280,1761185535,GB -1761185536,1761185791,AE -1761185792,1761186047,MX -1761186048,1761186303,US -1761186304,1761186559,DE -1761186560,1761186815,GB -1761186816,1761187071,MX -1761187072,1761187327,US -1761187328,1761187583,PK -1761187584,1761188095,US -1761188096,1761188351,RU -1761188352,1761188863,US -1761188864,1761189119,FR -1761189120,1761189631,US -1761189632,1761189887,DE -1761189888,1761190143,JP -1761190144,1761191679,US -1761191680,1761191935,MX -1761191936,1761192703,US -1761192704,1761192959,AU -1761192960,1761193727,US -1761193728,1761193983,DE -1761193984,1761194239,US -1761194240,1761194495,PH -1761194496,1761194751,HK -1761194752,1761195007,US -1761195008,1761195263,HK -1761195264,1761198079,US -1761198080,1761214463,CA -1761214464,1761221375,MF -1761221376,1761222655,GP -1761222656,1761230847,US -1761230848,1761239039,CA -1761239040,1761241343,US -1761241344,1761241599,ID -1761241600,1761241633,US -1761241634,1761241634,HK -1761241635,1761255423,US -1761255424,1761255679,IN -1761255680,1761255935,NZ -1761255936,1761256191,DK -1761256192,1761256447,HR -1761256448,1761256703,LI -1761256704,1761256959,ME -1761256960,1761257215,AM -1761257216,1761257471,GE -1761257472,1761257727,MC -1761257728,1761257983,BA -1761257984,1761258239,RS -1761258240,1761258495,SI -1761258496,1761258751,IT -1761258752,1761259007,LU -1761259008,1761259031,PT -1761259032,1761259032,US -1761259033,1761259263,PT -1761259264,1761259519,US -1761259520,1761259775,KH -1761259776,1761260031,AZ -1761260032,1761260287,ET -1761260288,1761260543,CU -1761260544,1761260799,EC -1761260800,1761261055,MU -1761261056,1761261311,JM -1761261312,1761261567,PR -1761261568,1761261823,VG -1761261824,1761262079,SG -1761262080,1761262335,US -1761262336,1761262591,PK -1761262592,1761273087,US -1761273088,1761273343,PH -1761273344,1761273599,US -1761273600,1761273855,AU -1761273856,1761275391,US -1761275392,1761275647,JP -1761275648,1761288191,US -1761288192,1761292287,CA -1761292288,1761302015,US -1761302016,1761302271,CA -1761302272,1761302527,US -1761302528,1761302783,CA -1761302784,1761304575,US -1761304576,1761308671,CA -1761308672,1761328639,US -1761328640,1761328895,AU -1761328896,1761341183,US -1761341184,1761341439,HK -1761341440,1761478655,US -1761478656,1761479679,CA -1761479680,1761484799,US -1761484800,1761485823,CA -1761485824,1761488895,US -1761488896,1761489919,CA -1761489920,1761499135,US -1761499136,1761501183,CA -1761501184,1761501695,VG -1761501696,1761505279,US -1761505280,1761507327,HK -1761507328,1761507615,US -1761507616,1761507711,GB -1761507712,1761508351,US -1761508352,1761509375,VG -1761509376,1761515519,US -1761515520,1761517567,CA -1761517568,1761519615,US -1761519616,1761521663,PR -1761521664,1761522687,US -1761522688,1761523711,CA -1761523712,1761526783,US -1761526784,1761527807,CA -1761527808,1761544191,US -1761544192,1761546239,CA -1761546240,1761554431,US -1761554432,1761555455,CA -1761555456,1761581055,US -1761581056,1761583103,CA -1761583104,1761587199,US -1761587200,1761588223,AI -1761588224,1761589247,PR -1761589248,1761595391,US -1761595392,1761596415,CA -1761596416,1761601535,US -1761601536,1761602559,VC -1761602560,1761606655,US -1761606656,1761607679,LC -1761607680,1762613861,ZA -1762613862,1762613862,US -1762613863,1762656255,ZA -1762656256,1762660351,MU -1762660352,1762661375,KE -1762661376,1762661887,MU -1762661888,1762662399,TZ -1762662400,1762662911,MZ -1762662912,1762664447,ZA -1762664448,1762664959,FR -1762664960,1762665471,GB -1762665472,1762680063,MU -1762680064,1762680575,NL -1762680576,1762681087,SE -1762681088,1762681599,DE -1762681600,1762684927,MU -1762684928,1762689023,KE -1762689024,1762691071,DJ -1762691072,1762693119,TZ -1762693120,1762695167,MZ -1762695168,1762701311,ZA -1762701312,1762703359,FR -1762703360,1762705407,GB -1762705408,1762764799,MU -1762764800,1762766847,NL -1762766848,1762768895,SE -1762768896,1762770943,DE -1762770944,1762783231,MU -1762783232,1762791423,KE -1762791424,1762795519,DJ -1762795520,1762799615,TZ -1762799616,1762803711,MZ -1762803712,1762820095,ZA -1762820096,1762824191,GB -1762824192,1762942975,MU -1762942976,1762947071,NL -1762947072,1762951167,SE -1762951168,1762955263,DE -1762955264,1762983935,MU -1762983936,1763000319,KE -1763000320,1763008511,UG -1763008512,1763016703,RW -1763016704,1763024895,DJ -1763024896,1763041279,TZ -1763041280,1763049471,MZ -1763049472,1763074047,ZA -1763074048,1763082239,FR -1763082240,1763090431,GB -1763090432,1763172351,MU -1763172352,1763180543,ZA -1763180544,1763270655,MU -1763270656,1763278847,US -1763278848,1763287039,ZA -1763287040,1763319807,MU -1763319808,1763327999,IN -1763328000,1763336191,NL -1763336192,1763344383,SE -1763344384,1763344895,UG -1763344896,1763352575,DE -1763352576,1763385343,MU -1763385344,1763393535,AE -1763393536,1763401727,GB -1763401728,1763402239,MU -1763402240,1763402751,KE -1763402752,1763405823,MU -1763405824,1763407871,ZA -1763407872,1763409919,MU -1763409920,1763429887,ZA -1763429888,1763438591,KE -1763438592,1763442687,UG -1763442688,1763446783,RW -1763446784,1763450879,DJ -1763450880,1763459071,TZ -1763459072,1763463167,MZ -1763463168,1763475455,ZA -1763475456,1763479551,FR -1763479552,1763483647,GB -1763483648,1763524607,MU -1763524608,1763532799,ZA -1763532800,1763573759,MU -1763573760,1763581951,ZA -1763581952,1763598335,MU -1763598336,1763602431,IN -1763602432,1763606527,NL -1763606528,1763610623,SE -1763610624,1763614719,DE -1763614720,1763631103,MU -1763631104,1763635199,AE -1763635200,1763639295,ZA -1763639296,1763657727,MU -1763657728,1763659775,ZA -1763659776,1763661823,MU -1763661824,1763663871,FR -1763663872,1763688447,MU -1763688448,1763696639,ZA -1763696640,1763704831,MU -1763704832,1764753407,EG -1764753408,1765801983,KE -1765801984,1766850559,MA -1766850560,1767899135,EG -1767899136,1768947711,DZ -1768947712,1769996287,NG -1769996288,1772093439,MA -1772093440,1772617727,KE -1772617728,1773142015,AO -1773142016,1773207551,LR -1773207552,1773273087,ZA -1773273088,1773404159,RW -1773404160,1773666303,EG -1773666304,1773928447,ZA -1773928448,1774190591,MA -1774190592,1775239167,EG -1775239168,1776680959,ZA -1776680960,1776812031,KE -1776812032,1776877567,NA -1776877568,1776943103,ZA -1776943104,1777008639,MW -1777008640,1777041407,CI -1777041408,1777045503,DZ -1777045504,1777049599,MU -1777049600,1777053695,ZA -1777053696,1777057791,BF -1777057792,1777061887,NG -1777061888,1777063935,SS -1777063936,1777065983,MZ -1777065984,1777070079,GQ -1777070080,1777074175,BW -1777074176,1777205247,ZA -1777205248,1777336319,SD -1777336320,1778384895,ZA -1778384896,1778385151,CN -1778385152,1778385407,AU -1778385408,1778393087,CN -1778393088,1778396159,IN -1778396160,1778397183,CN -1778397184,1778398207,ID -1778398208,1778399231,BD -1778399232,1778400255,IN -1778400256,1778401279,BD -1778401280,1778417663,CN -1778417664,1778450431,TH -1778450432,1778515967,TW -1778515968,1779040255,CN -1779040256,1779073023,KR -1779073024,1779105791,SG -1779105792,1781727231,CN -1781727232,1781792767,IN -1781792768,1782579199,CN -1782579200,1782710271,TW -1782710272,1782841343,IN -1782841344,1783103487,AU -1783103488,1783234559,JP -1783234560,1783365631,CN -1783365632,1783627775,IN -1783627776,1784676351,CN -1784676352,1785200639,KR -1785200640,1785462783,TW -1785462784,1786773503,CN -1786773504,1790967807,JP -1790967808,1793064959,IN -1793064960,1794113535,CN -1794113536,1795162111,KR -1795162112,1795555327,US -1795555328,1795555583,CA -1795555584,1795555839,US -1795555840,1795557375,CA -1795557376,1795557887,US -1795557888,1795558143,CA -1795558144,1795558911,US -1795558912,1795559423,CA -1795559424,1795559679,AR -1795559680,1795559743,CA -1795559744,1795559775,US -1795559776,1795559935,CA -1795559936,1795560191,US -1795560192,1795560959,CA -1795560960,1795561247,US -1795561248,1795563519,CA -1795563520,1795564031,US -1795564032,1795564799,CA -1795564800,1795565567,US -1795565568,1795566591,CA -1795566592,1795567359,US -1795567360,1795569551,CA -1795569552,1795569567,US -1795569568,1795570943,CA -1795570944,1795571087,US -1795571088,1795571103,CA -1795571104,1795571199,US -1795571200,1795571711,CA -1795571712,1795583999,US -1795584000,1795588095,SG -1795588096,1795591167,US -1795591168,1795592191,NL -1795592192,1795593727,US -1795593728,1795595775,NL -1795595776,1795596287,US -1795596288,1795603455,NL -1795603456,1804863743,US -1804863744,1804863999,CN -1804864000,1805000058,US -1805000059,1805000059,CA -1805000060,1805010175,US -1805010176,1805010431,CA -1805010432,1805010687,KR -1805010688,1805016319,US -1805016320,1805016575,RU -1805016576,1805016831,NZ -1805016832,1805017087,TR -1805017088,1805018111,CN -1805018112,1805021183,US -1805021184,1805021439,SG -1805021440,1805021695,KR -1805021696,1805021951,TW -1805021952,1805022207,TH -1805022208,1805022463,US -1805022464,1805022719,DE -1805022720,1805024767,US -1805024768,1805025279,KR -1805025280,1805033983,US -1805033984,1805035007,TR -1805035008,1805035519,US -1805035520,1805036031,TR -1805036032,1805037055,US -1805037056,1805037311,TR -1805037312,1805037567,US -1805037568,1805038591,TR -1805038592,1805046271,US -1805046272,1805046783,GB -1805046784,1805048831,US -1805048832,1805049343,NL -1805049344,1805049855,DE -1805049856,1805058047,CA -1805058048,1805144063,US -1805144064,1805148159,CA -1805148160,1805150463,US -1805150464,1805150719,GB -1805150720,1805156351,US -1805156352,1805156479,CA -1805156480,1805156487,FI -1805156488,1805156511,CA -1805156512,1805156519,US -1805156520,1805156599,CA -1805156600,1805156607,US -1805156608,1805156719,CA -1805156720,1805156815,US -1805156816,1805156823,CA -1805156824,1805156863,US -1805156864,1805156871,CA -1805156872,1805156879,US -1805156880,1805156911,CA -1805156912,1805156919,US -1805156920,1805156927,CA -1805156928,1805156935,US -1805156936,1805156951,CA -1805156952,1805156959,US -1805156960,1805156999,CA -1805157000,1805157015,US -1805157016,1805157079,CA -1805157080,1805157095,US -1805157096,1805157159,CA -1805157160,1805157279,US -1805157280,1805157311,CA -1805157312,1805157375,US -1805157376,1805157547,CA -1805157548,1805157551,US -1805157552,1805157951,CA -1805157952,1805158031,US -1805158032,1805158047,CA -1805158048,1805158079,US -1805158080,1805158399,CA -1805158400,1805158655,US -1805158656,1805158823,CA -1805158824,1805158831,US -1805158832,1805158895,CA -1805158896,1805158903,US -1805158904,1805158911,CA -1805158912,1805159039,US -1805159040,1805159055,CA -1805159056,1805159071,US -1805159072,1805159119,CA -1805159120,1805159127,US -1805159128,1805159167,CA -1805159168,1805159175,US -1805159176,1805159191,CA -1805159192,1805159199,US -1805159200,1805159247,CA -1805159248,1805159279,US -1805159280,1805159359,CA -1805159360,1805159423,US -1805159424,1805160191,CA -1805160192,1805160215,US -1805160216,1805160271,CA -1805160272,1805160279,US -1805160280,1805160295,CA -1805160296,1805160303,US -1805160304,1805160319,CA -1805160320,1805160335,US -1805160336,1805160343,CA -1805160344,1805160351,US -1805160352,1805160359,CA -1805160360,1805160367,US -1805160368,1805160407,CA -1805160408,1805160415,US -1805160416,1805160423,CA -1805160424,1805160439,US -1805160440,1805160447,CA -1805160448,1805160703,US -1805160704,1805160719,CA -1805160720,1805160735,US -1805160736,1805160767,CA -1805160768,1805160783,US -1805160784,1805160799,CA -1805160800,1805160895,US -1805160896,1805160911,CA -1805160912,1805160943,US -1805160944,1805162255,CA -1805162256,1805162495,US -1805162496,1805164111,CA -1805164112,1805164127,US -1805164128,1805164159,CA -1805164160,1805164223,US -1805164224,1805164239,CA -1805164240,1805164287,US -1805164288,1805164351,CA -1805164352,1805164367,US -1805164368,1805164383,CA -1805164384,1805164799,US -1805164800,1805164839,CA -1805164840,1805164847,FI -1805164848,1805164863,CA -1805164864,1805164879,US -1805164880,1805164895,CA -1805164896,1805164975,US -1805164976,1805164991,CA -1805164992,1805165055,US -1805165056,1805165311,CA -1805165312,1805165439,US -1805165440,1805165455,CA -1805165456,1805165823,US -1805165824,1805166079,CA -1805166080,1805166335,US -1805166336,1805166687,CA -1805166688,1805166703,US -1805166704,1805166751,CA -1805166752,1805166783,US -1805166784,1805167103,CA -1805167104,1805167359,FR -1805167360,1805167439,CA -1805167440,1805167455,US -1805167456,1805167551,CA -1805167552,1805167583,US -1805167584,1805167823,CA -1805167824,1805167839,US -1805167840,1805167887,CA -1805167888,1805167903,US -1805167904,1805167935,CA -1805167936,1805168223,US -1805168224,1805168255,CA -1805168256,1805168671,US -1805168672,1805168703,CA -1805168704,1805168751,US -1805168752,1805168783,CA -1805168784,1805168847,US -1805168848,1805168855,CA -1805168856,1805168863,SE -1805168864,1805169183,CA -1805169184,1805169199,US -1805169200,1805169215,CA -1805169216,1805169663,US -1805169664,1805170063,CA -1805170064,1805170079,US -1805170080,1805170303,CA -1805170304,1805170311,US -1805170312,1805170403,CA -1805170404,1805170407,US -1805170408,1805171231,CA -1805171232,1805171247,US -1805171248,1805171311,CA -1805171312,1805171327,US -1805171328,1805171343,CA -1805171344,1805171351,US -1805171352,1805171367,CA -1805171368,1805171375,US -1805171376,1805171383,CA -1805171384,1805171391,US -1805171392,1805171551,CA -1805171552,1805171559,US -1805171560,1805171583,CA -1805171584,1805171591,US -1805171592,1805171607,CA -1805171608,1805171615,US -1805171616,1805171655,CA -1805171656,1805171663,US -1805171664,1805171687,CA -1805171688,1805171703,US -1805171704,1805171711,CA -1805171712,1805171759,US -1805171760,1805171839,CA -1805171840,1805171887,US -1805171888,1805171903,CA -1805171904,1805171951,US -1805171952,1805171967,CA -1805171968,1805172047,US -1805172048,1805172095,CA -1805172096,1805172159,US -1805172160,1805172175,CA -1805172176,1805172191,US -1805172192,1805173007,CA -1805173008,1805173039,US -1805173040,1805173055,CA -1805173056,1805173079,US -1805173080,1805173087,CA -1805173088,1805173247,US -1805173248,1805173567,CA -1805173568,1805173599,US -1805173600,1805173615,CA -1805173616,1805173759,US -1805173760,1805173791,CA -1805173792,1805174271,US -1805174272,1805174287,CA -1805174288,1805174303,US -1805174304,1805174335,CA -1805174336,1805174527,US -1805174528,1805174783,CA -1805174784,1805174815,US -1805174816,1805174823,CA -1805174824,1805174831,US -1805174832,1805174863,CA -1805174864,1805174911,US -1805174912,1805174943,CA -1805174944,1805175103,US -1805175104,1805175119,CA -1805175120,1805175159,US -1805175160,1805175167,CA -1805175168,1805175807,US -1805175808,1805177343,CA -1805177344,1805177375,US -1805177376,1805177423,CA -1805177424,1805177439,US -1805177440,1805177455,CA -1805177456,1805177471,US -1805177472,1805177599,CA -1805177600,1805177855,US -1805177856,1805181951,CA -1805181952,1805182207,US -1805182208,1805182719,CA -1805182720,1805183039,US -1805183040,1805183071,CA -1805183072,1805183135,US -1805183136,1805183167,CA -1805183168,1805183199,US -1805183200,1805183231,CA -1805183232,1805183743,US -1805183744,1805184063,CA -1805184064,1805184127,US -1805184128,1805184159,CA -1805184160,1805184191,US -1805184192,1805184511,CA -1805184512,1805184527,US -1805184528,1805184535,CA -1805184536,1805184543,US -1805184544,1805184575,CA -1805184576,1805184607,US -1805184608,1805184639,CA -1805184640,1805184687,US -1805184688,1805184703,CA -1805184704,1805184735,US -1805184736,1805184783,CA -1805184784,1805184799,US -1805184800,1805184831,CA -1805184832,1805184863,US -1805184864,1805184895,CA -1805184896,1805184927,US -1805184928,1805184943,CA -1805184944,1805185023,US -1805185024,1805185071,CA -1805185072,1805185103,US -1805185104,1805185119,CA -1805185120,1805185151,US -1805185152,1805185159,CA -1805185160,1805185167,FI -1805185168,1805185215,CA -1805185216,1805185231,US -1805185232,1805185247,CA -1805185248,1805185279,US -1805185280,1805185343,CA -1805185344,1805185359,US -1805185360,1805185375,CA -1805185376,1805185407,US -1805185408,1805185423,CA -1805185424,1805185439,US -1805185440,1805185471,CA -1805185472,1805185519,US -1805185520,1805185535,CA -1805185536,1805185599,US -1805185600,1805185615,CA -1805185616,1805185647,US -1805185648,1805185655,CA -1805185656,1805185663,US -1805185664,1805185679,CA -1805185680,1805185759,US -1805185760,1805185775,CA -1805185776,1805185919,US -1805185920,1805185959,CA -1805185960,1805185967,NO -1805185968,1805185999,US -1805186000,1805186063,CA -1805186064,1805186095,US -1805186096,1805186127,CA -1805186128,1805186143,US -1805186144,1805186239,CA -1805186240,1805186287,US -1805186288,1805186319,CA -1805186320,1805186335,US -1805186336,1805186351,CA -1805186352,1805186495,US -1805186496,1805186511,CA -1805186512,1805186551,US -1805186552,1805186575,CA -1805186576,1805186687,US -1805186688,1805186719,CA -1805186720,1805186783,US -1805186784,1805186799,CA -1805186800,1805186879,US -1805186880,1805186911,CA -1805186912,1805186943,US -1805186944,1805186959,CA -1805186960,1805186975,US -1805186976,1805186991,CA -1805186992,1805186999,US -1805187000,1805187023,CA -1805187024,1805187071,US -1805187072,1805187111,CA -1805187112,1805187119,NO -1805187120,1805187127,CA -1805187128,1805187327,US -1805187328,1805187391,CA -1805187392,1805187455,US -1805187456,1805187503,CA -1805187504,1805187551,US -1805187552,1805187567,CA -1805187568,1805187871,US -1805187872,1805187887,CA -1805187888,1805188175,US -1805188176,1805188255,CA -1805188256,1805188287,US -1805188288,1805188295,CA -1805188296,1805188367,US -1805188368,1805188375,CA -1805188376,1805188383,FI -1805188384,1805188447,CA -1805188448,1805188479,US -1805188480,1805188511,CA -1805188512,1805188575,US -1805188576,1805188647,CA -1805188648,1805188671,US -1805188672,1805188735,CA -1805188736,1805188751,US -1805188752,1805188767,CA -1805188768,1805188863,US -1805188864,1805188879,CA -1805188880,1805188911,US -1805188912,1805188927,CA -1805188928,1805189039,US -1805189040,1805189055,CA -1805189056,1805189071,US -1805189072,1805189087,CA -1805189088,1805189103,US -1805189104,1805189119,CA -1805189120,1805190399,US -1805190400,1805190655,ES -1805190656,1805190911,DE -1805190912,1805194239,US -1805194240,1805194495,AU -1805194496,1805195263,US -1805195264,1805196031,JP -1805196032,1805196287,US -1805196288,1805196543,DE -1805196544,1805197823,US -1805197824,1805198079,DE -1805198080,1805198591,US -1805198592,1805199103,AU -1805199104,1805201151,US -1805201152,1805201407,NL -1805201408,1805202943,US -1805202944,1805203199,NL -1805203200,1805207039,US -1805207040,1805207551,BR -1805207552,1805209855,US -1805209856,1805210623,CA -1805210624,1805210879,EG -1805210880,1805212415,US -1805212416,1805213183,CN -1805213184,1805214975,US -1805214976,1805215743,AE -1805215744,1805217279,US -1805217280,1805217535,DE -1805217536,1805221375,US -1805221376,1805221631,DE -1805221632,1805226239,US -1805226240,1805226495,NL -1805226496,1805234175,US -1805234176,1805234431,NL -1805234432,1805251583,US -1805251584,1805251839,DE -1805251840,1805252095,GB -1805252096,1805252351,DE -1805252352,1805252607,GB -1805252608,1805252863,DE -1805252864,1805253119,GB -1805253120,1805253375,DE -1805253376,1805253631,GB -1805253632,1805253887,DE -1805253888,1805254143,US -1805254144,1805254399,DE -1805254400,1805254655,GB -1805254656,1805283327,US -1805283328,1805283583,GB -1805283584,1805284863,US -1805284864,1805285119,ES -1805285120,1805321727,US -1805321728,1805321983,VN -1805321984,1805322751,US -1805322752,1805323007,RU -1805323008,1805323263,JP -1805323264,1805324287,US -1805324288,1805324543,DE -1805324544,1805325055,US -1805325056,1805325311,ES -1805325312,1805325567,AE -1805325568,1805325823,ID -1805325824,1805326079,FR -1805326080,1805326335,US -1805326336,1805326591,SG -1805326592,1805326847,US -1805326848,1805327103,MY -1805327104,1805327359,TH -1805327360,1805327615,KR -1805327616,1805327871,JP -1805327872,1805328127,TW -1805328128,1805328383,US -1805328384,1805328639,TH -1805328640,1805328895,ID -1805328896,1805329663,US -1805329664,1805329919,SG -1805329920,1805330431,TH -1805330432,1805331199,US -1805331200,1805331455,KR -1805331456,1805331711,US -1805331712,1805331967,KR -1805331968,1805332479,US -1805332480,1805332735,DE -1805332736,1805332991,FR -1805332992,1805333247,TH -1805333248,1805333503,ES -1805333504,1805334271,US -1805334272,1805334783,SG -1805334784,1805335039,TW -1805335040,1805335295,MY -1805335296,1805335551,TH -1805335552,1805335807,AE -1805335808,1805337287,US -1805337288,1805337295,IT -1805337296,1805373439,US -1805373440,1805375487,HK -1805375488,1805582335,US -1805582336,1805647871,CA -1805647872,1805713407,US -1805713408,1805717503,CA -1805717504,1805721599,US -1805721600,1805725695,CA -1805725696,1805729791,US -1805729792,1805733887,CA -1805733888,1805737983,US -1805737984,1805742079,CA -1805742080,1805752575,US -1805752576,1805753087,CA -1805753088,1805754175,US -1805754176,1805754367,CA -1805754368,1805756415,US -1805756672,1806135130,US -1806135131,1806135132,IN -1806135133,1806168831,US -1806168832,1806169087,CA -1806169088,1806172159,US -1806172160,1806172415,DE -1806172416,1806172671,GB -1806172672,1806172927,DE -1806172928,1806173183,GB -1806173184,1806173695,CN -1806173696,1806174207,US -1806174208,1806174463,BR -1806174464,1806180351,US -1806180352,1806180607,AU -1806180608,1806182911,US -1806182912,1806183167,BR -1806183168,1806183679,US -1806183680,1806183935,NL -1806183936,1806184447,US -1806184448,1806184959,AU -1806184960,1806186239,US -1806186240,1806186751,GB -1806186752,1806190079,US -1806190080,1806190591,JP -1806190592,1806198271,US -1806198272,1806198527,JP -1806198528,1806203391,US -1806203392,1806203647,AU -1806203648,1806205183,US -1806205184,1806205439,CA -1806205440,1806235903,US -1806235904,1806236159,NL -1806236160,1806263551,US -1806263552,1806263807,KR -1806263808,1806401535,US -1806401536,1806434303,CA -1806434304,1806514463,US -1806514464,1806514495,GB -1806514496,1806515231,US -1806515232,1806515263,GB -1806515264,1806532927,US -1806532928,1806532959,GB -1806532960,1806925823,US -1806925824,1806958591,CA -1806958592,1806996479,US -1806996480,1806999551,CO -1806999552,1807044095,US -1807044096,1807044351,NL -1807044352,1807056895,US -1807056896,1807057151,AU -1807057664,1807057919,GB -1807057920,1807058431,US -1807058688,1807058943,US -1807058944,1807059199,GB -1807059200,1807059455,NL -1807062016,1807062271,US -1807063040,1807072255,US -1807072256,1807073023,CA -1807073024,1807548415,US -1807548416,1807548927,LU -1807548928,1807597567,US -1807597568,1807646719,CA -1807646720,1807655679,US -1807655680,1807655935,IE -1807655936,1807656447,US -1807656448,1807656703,NL -1807656704,1807657983,US -1807657984,1807658239,SG -1807658240,1807658495,GB -1807658496,1807658751,BS -1807658752,1807691263,US -1807691264,1807691775,FR -1807691776,1807692799,US -1807692800,1807693311,JP -1807693312,1807693823,US -1807693824,1807694079,AU -1807694080,1807694847,US -1807694848,1807695359,JP -1807695360,1807695871,FR -1807695872,1807706793,US -1807706794,1807706794,CN -1807706795,1807707311,US -1807707312,1807707312,JP -1807707313,1807732735,US -1807732736,1807736831,GP -1807736832,1815822335,US -1815822336,1815826431,CA -1815826432,1815871487,US -1815871488,1815879679,CA -1815879680,1815912447,US -1815912448,1815920639,CA -1815920640,1815928831,US -1815928832,1815937023,BS -1815937024,1815961599,US -1815961600,1815961855,AU -1815961856,1815962111,ES -1815962112,1815962623,NL -1815962624,1815963391,US -1815963392,1815963647,NL -1815963648,1815963903,US -1815963904,1815964159,FR -1815964160,1815964415,DK -1815964416,1815964671,PL -1815964672,1815965695,US -1815965696,1815966207,DE -1815966208,1815966719,US -1815966720,1815966975,GB -1815966976,1815967231,NL -1815967232,1815967487,CA -1815967488,1815968255,US -1815968256,1815968767,FR -1815968768,1815969279,US -1815969280,1815969791,JP -1815969792,1815977983,US -1815977984,1815979007,JP -1815979008,1815980031,NL -1815980032,1815980543,AU -1815980544,1815981055,DE -1815981056,1815982079,GB -1815982080,1815982591,FR -1815982592,1815983103,DE -1815983104,1815984127,JP -1815984128,1815984639,AU -1815984640,1815985151,JP -1815985152,1815985663,NL -1815985664,1815985919,DE -1815985920,1815987199,US -1815987200,1815987711,GB -1815987712,1815988223,NL -1815988224,1815988735,JP -1815988736,1815990271,US -1815990272,1815990503,FR -1815990504,1815990504,TF -1815990505,1815990783,FR -1815990784,1815991295,DE -1815991296,1815991807,AU -1815991808,1815993599,US -1815993600,1815993855,GB -1815993856,1815994111,US -1815994112,1815994367,JP -1815994368,1815994623,US -1815994624,1815994655,DE -1815994656,1815994879,GB -1815994880,1815995135,US -1815995136,1815995391,AU -1815995392,1815995903,US -1815995904,1815996159,GB -1815996160,1815996415,CA -1815996416,1815997695,US -1815997696,1815997951,FR -1815997952,1815999999,US -1816000000,1816000511,JP -1816000512,1816001023,US -1816001024,1816001279,JP -1816001280,1816001535,AU -1816001536,1816001791,US -1816001792,1816002559,NL -1816002560,1816068095,US -1816068096,1816133631,CA -1816133632,1819976622,US -1819976623,1819976623,RE -1819976624,1822429183,US -1822429184,1822433279,CA -1822433280,1822445567,US -1822445568,1822451199,CA -1822451200,1822451455,US -1822451456,1822451711,BB -1822451712,1822486527,US -1822486528,1822490623,CA -1822490624,1822498815,US -1822498816,1822502911,CA -1822502912,1822519295,US -1822519296,1822523391,CA -1822523392,1822531583,US -1822531584,1822535679,CA -1822535680,1822552575,US -1822552576,1822553087,AT -1822553088,1822553343,US -1822553344,1822553599,BR -1822553600,1822553855,US -1822553856,1822554111,HK -1822554112,1822572543,US -1822572544,1822605311,CA -1822605312,1822613247,US -1822613248,1822613503,HK -1822613504,1822614015,US -1822614016,1822614527,JP -1822614528,1822615039,FR -1822615040,1822617343,US -1822617344,1822618367,CA -1822618368,1822619391,US -1822619392,1822621183,AU -1822621184,1822621439,US -1822621440,1822621695,AU -1822621696,1822654463,US -1822654464,1822662143,CA -1822662144,1822662399,US -1822662400,1822670847,CA -1822670848,1822877695,US -1822877696,1822881791,HK -1822881792,1822882815,ID -1822882816,1822949375,US -1822949376,1822982143,CA -1822982144,1823113215,US -1823113216,1823129599,CA -1823129600,1823162367,US -1823162368,1823170559,CA -1823170560,1823178751,US -1823178752,1823179007,GB -1823179008,1823179167,DE -1823179168,1823179199,US -1823179200,1823179263,DE -1823179264,1823180287,US -1823180288,1823180543,AU -1823180544,1823181055,US -1823181056,1823181311,DK -1823181312,1823181567,BR -1823181568,1823181823,FR -1823181824,1823182079,CA -1823182080,1823182335,SG -1823182336,1823182591,JP -1823182592,1823182847,HK -1823182848,1823183103,US -1823183104,1823183359,ZA -1823183360,1823186687,US -1823186688,1823186943,IN -1823186944,1823211519,US -1823211520,1823342591,CA -1823342592,1823346687,US -1823346688,1823350783,CA -1823350784,1823355647,US -1823355648,1823355903,NL -1823355904,1823356159,US -1823356160,1823356415,NL -1823356416,1823356671,US -1823356672,1823356927,NL -1823356928,1823358799,US -1823358800,1823358807,GB -1823358808,1823361791,US -1823361792,1823362303,CA -1823362304,1823375359,US -1823375360,1823379455,CA -1823379456,1823383551,US -1823383552,1823387647,CA -1823387648,1823422463,US -1823422464,1823423487,LU -1823423488,1823428607,US -1823428608,1823432703,CA -1823432704,1823465471,US -1823465472,1823469567,CA -1823469568,1823735807,US -1823735808,1823866879,CA -1823866880,1824130623,US -1824130624,1824130655,CN -1824130656,1828716543,US -1828716544,1830813695,FR -1830813696,1831337983,NL -1831337984,1831862271,DE -1831862272,1832124415,PT -1832124416,1832386559,IT -1832386560,1832392191,DK -1832392192,1832392703,SE -1832392704,1832461567,DK -1832461568,1832461823,SE -1832461824,1832473599,DK -1832473600,1832473855,SE -1832473856,1832475391,DK -1832475392,1832475647,SE -1832475648,1832550399,DK -1832550400,1832558591,SE -1832558592,1832648703,DK -1832648704,1832681471,HR -1832681472,1832714239,RU -1832714240,1832747007,HU -1832747008,1832779775,RU -1832779776,1832780799,FR -1832780800,1832783871,MQ -1832783872,1832785919,GP -1832785920,1832787967,GF -1832787968,1832795391,FR -1832795392,1832795647,GF -1832795648,1832797439,FR -1832797440,1832797471,MQ -1832797472,1832797503,GP -1832797504,1832797567,GF -1832797568,1832797695,MQ -1832797696,1832798207,FR -1832798208,1832799231,GP -1832799232,1832800767,FR -1832800768,1832801023,MQ -1832801024,1832801279,FR -1832801280,1832802303,MQ -1832802304,1832804351,FR -1832804352,1832806399,MQ -1832806400,1832808447,GP -1832808448,1832812543,FR -1832812544,1832845311,RU -1832845312,1832878079,BH -1832878080,1832910847,RU -1832910848,1833172991,IL -1833172992,1833177087,GB -1833177088,1833179135,RU -1833179136,1833181183,IT -1833181184,1833183231,GB -1833183232,1833185279,UA -1833185280,1833187327,DE -1833187328,1833189375,NL -1833189376,1833191423,GB -1833191424,1833193471,RU -1833193472,1833195519,ES -1833195520,1833197567,NO -1833197568,1833199615,DE -1833199616,1833201663,AT -1833201664,1833203711,RU -1833203712,1833205759,AM -1833205760,1833207807,FI -1833207808,1833209855,RU -1833209856,1833211903,GR -1833211904,1833213951,IT -1833213952,1833215999,BE -1833216000,1833218047,RU -1833218048,1833220095,NO -1833220096,1833222143,RU -1833222144,1833223679,GB -1833223680,1833223743,GG -1833223744,1833223807,GB -1833223808,1833223935,GG -1833223936,1833224191,GB -1833224192,1833228287,RU -1833228288,1833232383,DE -1833232384,1833234431,TJ -1833234432,1833236479,GB -1833236480,1833238527,FI -1833238528,1833240575,AL -1833240576,1833242623,ES -1833242624,1833246719,RU -1833246720,1833248767,FI -1833248768,1833250815,MK -1833250816,1833252863,ES -1833252864,1833254911,GB -1833254912,1833256959,DE -1833256960,1833259007,RU -1833259008,1833261055,GB -1833261056,1833263103,PL -1833263104,1833265151,DE -1833265152,1833267199,GB -1833267200,1833269247,HU -1833269248,1833271295,FI -1833271296,1833273343,IT -1833275392,1833277439,IT -1833277440,1833279487,CH -1833279488,1833281535,AL -1833281536,1833283583,AT -1833283584,1833285631,RU -1833285632,1833289727,FR -1833289728,1833291775,IT -1833291776,1833293823,CZ -1833293824,1833295871,BE -1833295872,1833297919,NL -1833297920,1833299967,GB -1833299968,1833302015,LU -1833302016,1833304063,AT -1833304064,1833308159,NL -1833308160,1833310207,FR -1833310208,1833312255,RU -1833312256,1833314303,ES -1833314304,1833315963,IM -1833315964,1833315967,GB -1833315968,1833316351,IM -1833316352,1833318399,DK -1833318400,1833320447,GB -1833320448,1833321282,IQ -1833321283,1833321283,AE -1833321284,1833322495,IQ -1833322496,1833324543,IT -1833324544,1833326591,NO -1833326592,1833327103,GB -1833327104,1833328639,US -1833328640,1833330687,AT -1833330688,1833332735,UA -1833332736,1833334783,CH -1833334784,1833336831,IT -1833336832,1833338879,ES -1833338880,1833342975,GB -1833342976,1833345023,CH -1833345024,1833347071,FI -1833347072,1833349119,FR -1833349120,1833351167,FI -1833351168,1833353215,RU -1833353216,1833355263,DE -1833355264,1833357311,IT -1833357312,1833357587,GB -1833357588,1833357631,IE -1833357632,1833357823,GB -1833357824,1833357903,IE -1833357904,1833359359,GB -1833359360,1833361407,DE -1833361408,1833363455,GB -1833365504,1833367551,IT -1833367552,1833369599,RU -1833369600,1833370111,NL -1833370112,1833370367,BG -1833370368,1833370623,SE -1833370624,1833370879,CN -1833370880,1833371135,US -1833371136,1833371391,RU -1833371392,1833371647,BR -1833371648,1833373695,RU -1833373696,1833377791,DE -1833377792,1833379839,KZ -1833379840,1833381887,PT -1833381888,1833383935,NL -1833383936,1833385983,DK -1833385984,1833388031,SK -1833390080,1833392127,GB -1833392128,1833396223,CH -1833396224,1833398271,NL -1833398272,1833400319,DE -1833400320,1833402367,GB -1833402368,1833406463,FR -1833406464,1833408511,GB -1833410560,1833412607,LU -1833412608,1833414655,GB -1833414656,1833416703,RU -1833416704,1833418751,NL -1833418752,1833422847,RU -1833422848,1833424895,CZ -1833424896,1833426943,DE -1833426944,1833428991,KG -1833428992,1833431039,IT -1833431040,1833433087,RU -1833435136,1833439231,CZ -1833439232,1833443327,GB -1833443328,1833447423,NL -1833447424,1833451519,RS -1833451520,1833455615,RU -1833455616,1833459711,NL -1833459712,1833463807,ME -1833463808,1833467903,UA -1833467904,1833468671,RU -1833468672,1833471999,CH -1833472000,1833473023,NL -1833474048,1833475071,UA -1833476096,1833484287,NL -1833484288,1833488383,IR -1833488384,1833492479,GB -1833492480,1833504767,RU -1833504768,1833508863,DE -1833508864,1833512959,RU -1833512960,1833517055,DE -1833517056,1833521151,GB -1833521152,1833525247,IT -1833525248,1833529343,LV -1833529344,1833533439,GB -1833535488,1833537535,RU -1833537536,1833541631,AT -1833541632,1833541887,GB -1833541888,1833542143,IN -1833542144,1833542655,GB -1833542656,1833542911,IN -1833542912,1833543167,GB -1833543168,1833543423,IN -1833543424,1833544887,GB -1833544888,1833544888,AE -1833544889,1833544959,GB -1833544960,1833545001,IN -1833545002,1833545002,GB -1833545003,1833545087,IN -1833545088,1833545215,GB -1833545216,1833545471,NL -1833545472,1833545727,GB -1833545728,1833549823,IT -1833549824,1833553919,RU -1833553920,1833558015,CZ -1833558016,1833562111,US -1833562112,1833566207,PS -1833566208,1833570303,SE -1833574400,1833578495,YE -1833578496,1833582591,HU -1833582592,1833586687,TJ -1833586688,1833590783,FR -1833590784,1833594879,PL -1833594880,1833603071,RU -1833603072,1833607167,SK -1833607168,1833611263,RU -1833611264,1833615359,NO -1833615360,1833619455,GB -1833619456,1833623551,RU -1833623552,1833627647,IR -1833627648,1833631743,GB -1833631744,1833635839,CZ -1833635840,1833639935,DE -1833639936,1833640959,AM -1833640960,1833641215,RU -1833641216,1833644031,AM -1833644032,1833648127,TJ -1833648128,1833652223,LB -1833652224,1833660415,DE -1833660416,1833664511,IT -1833664512,1833668607,RU -1833668608,1833672703,CZ -1833672704,1833676799,GB -1833676800,1833680895,DE -1833680896,1833684991,UA -1833684992,1833689087,DE -1833689088,1833693183,FI -1833693184,1833697279,RU -1833697280,1833959423,IE -1833959424,1834090495,CZ -1834090496,1834221567,SA -1834221568,1834352639,DE -1834352640,1834483711,UA -1834483712,1834614783,BE -1834614784,1834745855,DE -1834745856,1834786815,RS -1834786816,1834787327,XK -1834787328,1834805247,RS -1834805248,1834806271,XK -1834806272,1834876927,RS -1834876928,1834885119,RU -1834885120,1834893311,FR -1834893312,1834901503,RU -1834901504,1834903551,RS -1834903552,1834904575,BA -1834904576,1834905087,RS -1834905088,1834905343,BG -1834905344,1834909695,RS -1834909696,1834913791,GB -1834913792,1834917887,US -1834917888,1834921983,UA -1834921984,1834930175,RU -1834934272,1834938367,RS -1834938368,1834944511,PL -1834944512,1834946559,RO -1834946560,1834948607,RU -1834948608,1834950655,PL -1834950656,1834956799,UA -1834956800,1834960895,IR -1834960896,1834964991,RU -1834964992,1834967039,PL -1834967040,1834971135,RU -1834971136,1834973183,PL -1834973184,1834974207,UA -1834975232,1834977279,IL -1834977280,1834983423,PL -1834983424,1834985471,RU -1834985472,1834989567,PL -1834989568,1834991615,GB -1834991616,1834993663,RU -1834993664,1834995711,PL -1834995712,1835001855,RU -1835001856,1835003903,PL -1835003904,1835005951,CH -1835005952,1835007999,RU -1835008000,1835532287,RO -1835532288,1835540479,SE -1835540480,1835548671,DE -1835548672,1835565055,GB -1835565056,1835573247,AL -1835573248,1835581439,UA -1835581440,1835589631,BG -1835589632,1835597823,IT -1835597824,1835606015,HU -1835606016,1835614207,CZ -1835614208,1835622399,RU -1835622400,1835627007,SE -1835627008,1835627263,DK -1835627264,1835630591,SE -1835630592,1835634687,RU -1835634688,1835638527,LU -1835638528,1835638783,AM -1835638784,1835646975,RU -1835646976,1835655167,BA -1835655168,1835663359,CY -1835663360,1835671551,UA -1835671552,1835679743,CH -1835679744,1835687935,FR -1835687936,1835696127,IE -1835696128,1835704319,RU -1835712512,1835720703,RU -1835720704,1835728895,RS -1835728896,1835737087,PL -1835737088,1835745279,GB -1835745280,1835753471,BG -1835753472,1835761663,ES -1835761664,1835769855,JO -1835769856,1835778047,RU -1835778048,1835786239,CZ -1835786240,1835794431,JO -1835794432,1835802623,FI -1835802624,1835810815,RU -1835810816,1835819007,UA -1835819008,1835827199,CZ -1835827200,1835835391,GB -1835835392,1835843583,IR -1835843584,1835851775,NO -1835851776,1835859967,UA -1835859968,1835868159,DE -1835868160,1835876351,IR -1835876352,1835884543,NO -1835884544,1835892735,NL -1835892736,1835909119,GB -1835909120,1835911167,RS -1835911168,1835913215,DE -1835913216,1835917311,RU -1835917312,1835917919,GB -1835917920,1835917927,IT -1835917928,1835918439,GB -1835918440,1835918447,IT -1835918448,1835918519,GB -1835918520,1835918527,IT -1835918528,1835918711,GB -1835918712,1835918719,IT -1835918720,1835918735,GB -1835918736,1835918743,IT -1835918744,1835919415,GB -1835919416,1835919423,IT -1835919424,1835921111,GB -1835921112,1835921127,IT -1835921128,1835922559,GB -1835922560,1835922567,IT -1835922568,1835922647,GB -1835922648,1835922655,IT -1835922656,1835922671,GB -1835922672,1835922679,IT -1835922680,1835923151,GB -1835923152,1835923159,IT -1835923160,1835923519,GB -1835923520,1835923527,IT -1835923528,1835923679,GB -1835923680,1835923687,IT -1835923688,1835923719,GB -1835923720,1835923727,IT -1835923728,1835924287,GB -1835924288,1835924295,IT -1835924296,1835924815,GB -1835924816,1835924823,IT -1835924824,1835925007,GB -1835925008,1835925015,IT -1835925016,1835925111,GB -1835925112,1835925119,IT -1835925120,1835925191,GB -1835925192,1835925199,IT -1835925200,1835925479,GB -1835925480,1835925487,IT -1835925488,1835925503,GB -1835925504,1835933695,LV -1835933696,1835941887,RU -1835941888,1835950079,UA -1835950080,1835958271,LB -1835958272,1835966463,HU -1835966464,1835974655,IR -1835974656,1835982847,HU -1835982848,1835991039,CY -1835991040,1835999231,RU -1835999232,1836007423,IR -1836007424,1836015615,RU -1836015616,1836017968,AD -1836017969,1836017969,ES -1836017970,1836023807,AD -1836023808,1836040191,RU -1836040192,1836048383,GB -1836048384,1836056575,RS -1836056576,1836450337,IT -1836450338,1836450338,CN -1836450339,1836450371,IT -1836450372,1836450372,CN -1836450373,1836450450,IT -1836450451,1836450451,CN -1836450452,1836450470,IT -1836450471,1836450471,CN -1836450472,1836450511,IT -1836450512,1836450512,CN -1836450513,1836450869,IT -1836450870,1836450870,CN -1836450871,1836450881,IT -1836450882,1836450882,CN -1836450883,1836450883,IT -1836450884,1836450884,CN -1836450885,1836450926,IT -1836450927,1836450927,CN -1836450928,1836450931,IT -1836450932,1836450932,CN -1836450933,1836450940,IT -1836450941,1836450941,CN -1836450942,1836450955,IT -1836450956,1836450956,CN -1836450957,1836451346,IT -1836451347,1836451348,CN -1836451349,1836451350,IT -1836451351,1836451351,CN -1836451352,1836451406,IT -1836451407,1836451407,CN -1836451408,1836451417,IT -1836451418,1836451418,CN -1836451419,1836451461,IT -1836451462,1836451462,CN -1836451463,1836451463,IT -1836451464,1836451464,CN -1836451465,1836451521,IT -1836451522,1836451522,CN -1836451523,1836452122,IT -1836452123,1836452123,CN -1836452124,1836452147,IT -1836452148,1836452148,CN -1836452149,1836452186,IT -1836452187,1836452187,CN -1836452188,1836452315,IT -1836452316,1836452316,CN -1836452317,1836452343,IT -1836452344,1836452345,CN -1836452346,1836452445,IT -1836452446,1836452446,CN -1836452447,1836452447,IT -1836452448,1836452448,CN -1836452449,1836452450,IT -1836452451,1836452451,CN -1836452452,1836452546,IT -1836452547,1836452547,CN -1836452548,1836452751,IT -1836452752,1836452752,CN -1836452753,1836452755,IT -1836452756,1836452757,CN -1836452758,1836453483,IT -1836453484,1836453484,CN -1836453485,1836453539,IT -1836453540,1836453540,CN -1836453541,1836453573,IT -1836453574,1836453574,CN -1836453575,1836454695,IT -1836454696,1836454696,CN -1836454697,1836454740,IT -1836454741,1836454741,CN -1836454742,1836454755,IT -1836454756,1836454756,CN -1836454757,1836455219,IT -1836455220,1836455220,CN -1836455221,1836455228,IT -1836455229,1836455229,CN -1836455230,1836455233,IT -1836455234,1836455234,CN -1836455235,1836455263,IT -1836455264,1836455264,CN -1836455265,1836455272,IT -1836455273,1836455274,CN -1836455275,1836455281,IT -1836455282,1836455282,CN -1836455283,1836455305,IT -1836455306,1836455306,CN -1836455307,1836455309,IT -1836455310,1836455310,CN -1836455311,1836455378,IT -1836455379,1836455379,CN -1836455380,1836455454,IT -1836455455,1836455455,CN -1836455456,1836455458,IT -1836455459,1836455460,CN -1836455461,1836455516,IT -1836455517,1836455517,CN -1836455518,1836455546,IT -1836455547,1836455547,CN -1836455548,1836455556,IT -1836455557,1836455557,CN -1836455558,1836455562,IT -1836455563,1836455563,CN -1836455564,1836455565,IT -1836455566,1836455566,CN -1836455567,1836455568,IT -1836455569,1836455570,CN -1836455571,1836455589,IT -1836455590,1836455590,CN -1836455591,1836455631,IT -1836455632,1836455632,CN -1836455633,1836455987,IT -1836455988,1836455988,CN -1836455989,1836455993,IT -1836455994,1836455995,CN -1836455996,1836455997,IT -1836455998,1836455998,CN -1836455999,1836456001,IT -1836456002,1836456002,CN -1836456003,1836456021,IT -1836456022,1836456022,CN -1836456023,1836456097,IT -1836456098,1836456098,CN -1836456099,1836456117,IT -1836456118,1836456118,CN -1836456119,1836456131,IT -1836456132,1836456135,CN -1836456136,1836456136,IT -1836456137,1836456137,CN -1836456138,1836458047,IT -1836458048,1836458048,CN -1836458049,1836459294,IT -1836459295,1836459295,CN -1836459296,1836459383,IT -1836459384,1836459384,CN -1836459385,1836459399,IT -1836459400,1836459400,CN -1836459401,1836466454,IT -1836466455,1836466455,CN -1836466456,1836466465,IT -1836466466,1836466466,CN -1836466467,1836466529,IT -1836466530,1836466530,CN -1836466531,1836466532,IT -1836466533,1836466533,CN -1836466534,1836466551,IT -1836466552,1836466552,CN -1836466553,1836580863,IT -1836580864,1836597247,RU -1836597248,1836598271,LU -1836598272,1836605439,FR -1836605440,1836606463,GB -1836606464,1836611583,LU -1836611584,1836613631,DE -1836613632,1836630015,RU -1836630016,1836646399,BG -1836646400,1836679167,RS -1836679168,1836680703,BG -1836680704,1836681215,MK -1836681216,1836687359,BG -1836687360,1836689151,MK -1836689152,1836711935,BG -1836711936,1836728319,UA -1836728320,1836744703,RS -1836744704,1836747263,FR -1836747264,1836747775,RE -1836747776,1836749823,FR -1836749824,1836750335,RE -1836750336,1836752895,FR -1836752896,1836756223,RE -1836756224,1836756479,FR -1836756480,1836756991,RE -1836756992,1836759039,FR -1836759040,1836760575,RE -1836760576,1836761087,FR -1836761088,1836777471,IR -1836777472,1836793855,SI -1836793856,1836794567,GB -1836794568,1836794587,FR -1836794588,1836794588,GB -1836794589,1836794592,FR -1836794593,1836794594,GB -1836794595,1836794595,FR -1836794596,1836797951,GB -1836797952,1836798207,DE -1836798208,1836807087,GB -1836807088,1836807088,CN -1836807089,1836810239,GB -1836810240,1836826623,RU -1836826624,1836843007,CZ -1836843008,1836875775,RU -1836875776,1836876863,SE -1836876864,1836876895,NO -1836876896,1836892159,SE -1836892160,1836908543,RU -1836908544,1836924927,IE -1836924928,1836941311,DE -1836941312,1836957695,IR -1836957696,1836974079,PL -1836974080,1836990463,RU -1836990464,1837006847,AT -1837006848,1837023231,BY -1837023232,1837039615,RU -1837039616,1837055999,AZ -1837056000,1837072383,IQ -1837072384,1837088767,RU -1837088768,1837105151,SI -1837105152,1837500953,BE -1837500954,1837500954,CN -1837500955,1837501019,BE -1837501020,1837501020,CN -1837501021,1837501040,BE -1837501041,1837501041,CN -1837501042,1837501584,BE -1837501585,1837501585,CN -1837501586,1837501588,BE -1837501589,1837501589,CN -1837501590,1837501623,BE -1837501624,1837501624,CN -1837501625,1837501643,BE -1837501644,1837501644,CN -1837501645,1837501998,BE -1837501999,1837501999,CN -1837502000,1837502022,BE -1837502023,1837502023,CN -1837502024,1837502041,BE -1837502042,1837502042,CN -1837502043,1837502052,BE -1837502053,1837502053,CN -1837502054,1837502126,BE -1837502127,1837502127,CN -1837502128,1837502164,BE -1837502165,1837502165,CN -1837502166,1837502539,BE -1837502540,1837502540,CN -1837502541,1837502574,BE -1837502575,1837502575,CN -1837502576,1837502606,BE -1837502607,1837502607,CN -1837502608,1837502610,BE -1837502611,1837502611,CN -1837502612,1837502639,BE -1837502640,1837502640,CN -1837502641,1837502702,BE -1837502703,1837502703,CN -1837502704,1837502818,BE -1837502819,1837502819,CN -1837502820,1837502913,BE -1837502914,1837502914,CN -1837502915,1837502931,BE -1837502932,1837502932,CN -1837502933,1837503116,BE -1837503117,1837503117,CN -1837503118,1837503125,BE -1837503126,1837503127,CN -1837503128,1837503129,BE -1837503130,1837503131,CN -1837503132,1837503136,BE -1837503137,1837503137,CN -1837503138,1837503153,BE -1837503154,1837503154,CN -1837503155,1837503156,BE -1837503157,1837503157,CN -1837503158,1837503163,BE -1837503164,1837503165,CN -1837503166,1837503166,BE -1837503167,1837503167,CN -1837503168,1837503175,BE -1837503176,1837503176,CN -1837503177,1837503184,BE -1837503185,1837503185,CN -1837503186,1837503186,BE -1837503187,1837503187,CN -1837503188,1837503188,BE -1837503189,1837503189,CN -1837503190,1838153727,BE -1838153728,1839202303,GB -1839202304,1839235071,BG -1839235072,1839267839,IL -1839267840,1839300607,RU -1839300608,1839333375,BH -1839333376,1839366143,UA -1839366144,1839398911,IR -1839398912,1839431679,NO -1839431680,1839448063,BA -1839448064,1839450111,KZ -1839450112,1839452159,NO -1839452160,1839454207,FI -1839454208,1839456255,RU -1839456256,1839459327,RO -1839459328,1839459599,DE -1839459600,1839459615,RO -1839459616,1839460031,DE -1839460032,1839460039,RO -1839460040,1839460351,DE -1839460352,1839462399,RU -1839462400,1839464447,FI -1839464448,1839497215,CZ -1839497216,1839529983,CH -1839529984,1839562751,RU -1839562752,1839595519,BA -1839595520,1839603711,SA -1839603712,1839609855,RO -1839609856,1839618047,KZ -1839618048,1839628287,SA -1839628288,1839661055,RO -1839661056,1839693823,ES -1839693824,1839726591,RU -1839726592,1839759359,IT -1839759360,1839792127,RU -1839792128,1839794847,GB -1839794848,1839794879,CH -1839794880,1839816703,GB -1839816704,1839824895,NO -1839824896,1839890431,RU -1839890432,1839923199,GB -1839923200,1839955967,RU -1839955968,1839988735,SA -1839988736,1840021503,RU -1840021504,1840054271,GE -1840054272,1840087039,RU -1840087040,1840119807,PL -1840119808,1840152575,RU -1840152576,1840185343,GB -1840185344,1840218111,BA -1840218112,1840232447,GB -1840232448,1840232703,NL -1840232704,1840247007,GB -1840247008,1840247023,NL -1840247024,1840316415,GB -1840316416,1840381951,AE -1840381952,1840447487,GR -1840447488,1840513023,NO -1840513024,1840644095,GB -1840644096,1840709631,SI -1840709632,1840775167,CZ -1840775168,1840840703,RU -1840840704,1840906239,MD -1840906240,1840971775,IL -1840971776,1841102847,RU -1841102848,1841168383,NO -1841168384,1841233418,FR -1841233419,1841233419,GB -1841233420,1841233919,FR -1841233920,1841299455,RU -1841299456,1841430527,DE -1841430528,1841561599,RU -1841561600,1841565695,PL -1841565696,1841569791,RU -1841569792,1841577983,PL -1841577984,1841582079,RU -1841582080,1841586175,PL -1841586176,1841590271,RU -1841590272,1841594367,PL -1841594368,1841598463,RU -1841598464,1841602559,PL -1841606656,1841610751,UA -1841610752,1841618943,RU -1841618944,1841627135,PL -1841627136,1841629183,SE -1841629184,1841635327,RU -1841635328,1841639423,PL -1841639424,1841641471,RU -1841641472,1841645567,PL -1841645568,1841647615,RU -1841647616,1841649663,RO -1841649664,1841651711,RU -1841651712,1841653759,PL -1841653760,1841655807,FR -1841655808,1841668095,RU -1841668096,1841668607,SE -1841668608,1841669119,RU -1841669120,1841669375,PL -1841669376,1841669631,BE -1841669632,1841670143,UA -1841670144,1841672191,PL -1841672192,1841674239,FR -1841674240,1841676287,PL -1841676288,1841680383,RU -1841680384,1841682431,LV -1841682432,1841684479,UA -1841684480,1841686527,RU -1841686528,1841688575,RO -1841688576,1841690623,FR -1841690624,1841692671,RU -1841692672,1841700863,RS -1841700864,1841709055,MD -1841709056,1841725439,RU -1841725440,1841733631,DK -1841733632,1841758207,RU -1841758208,1841766399,PL -1841766400,1841774591,HU -1841774592,1841782783,PL -1841782784,1841790975,US -1841790976,1841799167,BG -1841799168,1841807359,DE -1841807360,1841815551,NO -1841815552,1841823743,BG -1841823744,1841831935,GB -1841831936,1841840127,MT -1841840128,1841848319,PL -1841848320,1841856511,RU -1841856512,1841864703,UA -1841864704,1841872895,YE -1841872896,1841878015,NL -1841878016,1841879039,AU -1841879040,1841879807,NL -1841879808,1841880063,GB -1841880064,1841881087,JP -1841881088,1841889279,UA -1841889280,1841897471,IR -1841897472,1841905663,KZ -1841905664,1841922047,RU -1841922048,1841926099,NL -1841926100,1841926100,DE -1841926101,1841930239,NL -1841930240,1841938431,KG -1841938432,1841946623,RU -1841946624,1841946658,PT -1841946659,1841946659,UA -1841946660,1841948671,PT -1841948672,1841948927,UA -1841948928,1841954815,PT -1841954816,1841971199,RU -1841971200,1841979391,CZ -1841979392,1841982975,NL -1841982976,1841983103,BE -1841983104,1841983487,NL -1841983488,1841985535,IM -1841985536,1841987583,SI -1841987584,1841995775,DK -1841995776,1842003967,RU -1842003968,1842012159,CH -1842012160,1842017023,GB -1842017024,1842017279,BE -1842017280,1842020351,GB -1842020352,1842028543,NO -1842028544,1842036735,CH -1842036736,1842042879,FR -1842042880,1842044927,LU -1842044928,1842053119,GB -1842053120,1842069503,IR -1842069504,1842077695,RU -1842077696,1842079743,FR -1842079744,1842081791,GP -1842081792,1842082815,MQ -1842082816,1842083839,GP -1842083840,1842084351,MQ -1842084352,1842084863,GP -1842084864,1842085887,MQ -1842085888,1842118655,GB -1842118656,1842151423,FI -1842151424,1842153471,FR -1842153472,1842153983,NO -1842153984,1842154239,US -1842154240,1842154271,NO -1842154272,1842154303,HK -1842154304,1842154335,NO -1842154336,1842154343,SG -1842154344,1842154351,NO -1842154352,1842154367,SG -1842154368,1842154495,NO -1842154496,1842155007,US -1842155008,1842155263,AU -1842155264,1842155519,NL -1842155520,1842157567,IT -1842157568,1842159615,AE -1842159616,1842161663,BA -1842161664,1842163711,GE -1842163712,1842165759,PL -1842165760,1842167807,RU -1842167808,1842169855,FR -1842169856,1842171903,CZ -1842171904,1842173951,RU -1842173952,1842175999,RO -1842176000,1842178047,FI -1842178048,1842180095,IT -1842180096,1842182143,IQ -1842182144,1842184191,LV -1842184192,1842186239,DE -1842186240,1842188287,ES -1842188288,1842190335,RU -1842190336,1842192383,GB -1842192384,1842194431,AZ -1842194432,1842196479,CH -1842196480,1842198527,DE -1842198528,1842200575,GB -1842200576,1842202623,NL -1842202624,1842204671,CH -1842204672,1842206719,AZ -1842206720,1842208767,SE -1842208768,1842210815,GB -1842210816,1842212863,LT -1842212864,1842213375,CZ -1842213376,1842213631,RU -1842213632,1842213887,SK -1842213888,1842214911,CZ -1842214912,1842216959,RU -1842216960,1842225151,KZ -1842225152,1842233343,UA -1842233344,1842241535,SA -1842241536,1842249727,RS -1842249728,1842257919,RU -1842257920,1842266111,NL -1842266112,1842274303,PL -1842282496,1842286591,RU -1842286592,1842290687,GB -1842290688,1842294783,RS -1842294784,1842298879,PL -1842302976,1842307071,RU -1842307072,1842311167,PL -1842311168,1842315263,UA -1842315264,1842319359,RO -1842319360,1842323455,PL -1842323456,1842331647,RU -1842331648,1842335743,UA -1842335744,1842339839,RO -1842339840,1842343935,RU -1842343936,1842348031,UZ -1842348032,1843396607,FR -1843396608,1843412991,IQ -1843412992,1843429375,CZ -1843429376,1843462143,GB -1843462144,1843478527,RU -1843478528,1843494911,SE -1843494912,1843511295,IR -1843511296,1843527679,RU -1843527680,1843544063,IL -1843544064,1843560447,RU -1843560448,1843576831,DE -1843576832,1843593215,RU -1843593216,1843609599,HR -1843609600,1843625983,UA -1843625984,1843642367,ES -1843642368,1843658751,RU -1843658752,1843675135,GB -1843675136,1843679231,RU -1843679232,1843691519,ME -1843691520,1843707903,SE -1843707904,1843724287,TR -1843724288,1843732479,UA -1843732480,1843765247,RU -1843765248,1843773439,KZ -1843773440,1843781631,LV -1843781632,1843789823,RU -1843789824,1843806207,SK -1843806208,1843822591,IR -1843822592,1843838975,RU -1843838976,1843839487,IR -1843839488,1843839743,ES -1843839744,1843839999,DE -1843840000,1843840255,TR -1843840256,1843840767,DE -1843840768,1843841023,SE -1843841024,1843841279,IR -1843841280,1843841791,DE -1843841792,1843842047,GB -1843842048,1843843071,IR -1843843072,1843843327,DE -1843843328,1843843583,GB -1843843584,1843843839,AT -1843843840,1843844095,DE -1843844096,1843844351,IT -1843844352,1843844863,DE -1843844864,1843845119,GB -1843845120,1843845631,ES -1843845632,1843845887,GB -1843845888,1843846143,DE -1843846144,1843846399,GB -1843846400,1843846655,IR -1843846656,1843846911,ES -1843846912,1843847167,IR -1843847168,1843851775,DE -1843851776,1843852031,IR -1843852032,1843852799,DE -1843852800,1843853311,IR -1843853312,1843853823,DE -1843853824,1843854079,ES -1843854080,1843854335,IR -1843854336,1843855359,DE -1843855360,1843871743,PL -1843871744,1843888127,GB -1843888128,1843904511,CZ -1843904512,1843920895,GB -1843920896,1843922943,IR -1843922944,1843924991,NL -1843924992,1843927039,ES -1843927040,1843929087,PL -1843929088,1843931135,IT -1843931136,1843933183,NL -1843933184,1843935231,IT -1843935232,1843937279,GB -1843937280,1843939327,ES -1843939328,1843941375,DK -1843941376,1843943423,FI -1843943424,1843945471,CH -1843945472,1843947519,FR -1843947520,1843949567,RU -1843949568,1843951615,ES -1843951616,1843955711,DE -1843955712,1843957759,IT -1843957760,1843959807,CZ -1843959808,1843961855,GB -1843963904,1843965951,DE -1843965952,1843967487,GB -1843967488,1843967743,ZA -1843967744,1843967999,GB -1843968000,1843970047,RU -1843970048,1843972095,FR -1843972096,1843974143,HU -1843974144,1843976191,ES -1843976192,1843978239,TR -1843978240,1843980287,NL -1843980288,1843982335,FR -1843982336,1843984383,PL -1843984384,1843986431,RU -1843986432,1843988479,NO -1843988480,1843990527,GB -1843990528,1843992575,LB -1843992576,1843994623,AT -1843994624,1844000767,GB -1844000768,1844002815,NO -1844002816,1844006911,CZ -1844006912,1844008959,SM -1844008960,1844011007,PL -1844011008,1844013055,IT -1844015104,1844017151,GB -1844017152,1844021247,IT -1844021248,1844027391,DE -1844027392,1844029439,CZ -1844029440,1844031487,RU -1844033536,1844035583,RS -1844035584,1844037631,MD -1844037632,1844041727,RU -1844041728,1844043775,IT -1844043776,1844049919,RU -1844049920,1844051967,DE -1844051968,1844054015,FR -1844054016,1844056063,RU -1844056064,1844058111,IL -1844058112,1844062207,RU -1844062208,1844064255,CZ -1844064256,1844068351,IT -1844068352,1844070399,ES -1844070400,1844072447,LU -1844072448,1844076543,ES -1844076544,1844078591,IE -1844078592,1844080639,DE -1844080640,1844082687,GE -1844082688,1844084735,DE -1844084736,1844086783,RU -1844086784,1844088831,IT -1844088832,1844090879,AT -1844090880,1844092927,RU -1844092928,1844094975,FR -1844094976,1844099071,GB -1844099072,1844101119,DE -1844101120,1844105215,GB -1844105216,1844107263,ES -1844107264,1844109311,DE -1844109312,1844109567,US -1844109568,1844111359,GB -1844111360,1844113407,AL -1844113408,1844115455,FI -1844115456,1844117503,DE -1844117504,1844119551,CZ -1844119552,1844121599,UA -1844121600,1844123647,ES -1844123648,1844125695,RU -1844125696,1844127743,NL -1844127744,1844129791,DE -1844129792,1844131839,NL -1844131840,1844133887,DE -1844133888,1844135935,LT -1844135936,1844137983,NL -1844137984,1844140031,FR -1844140032,1844142079,RU -1844142080,1844144127,RS -1844144128,1844144383,IT -1844144384,1844144639,SM -1844144640,1844144895,IT -1844144896,1844145407,SM -1844145408,1844146175,IT -1844146176,1844148223,NO -1844148224,1844150271,GB -1844150272,1844152319,ES -1844152320,1844154367,DE -1844154368,1844156415,GB -1844156416,1844158463,IT -1844158464,1844160511,RU -1844160512,1844162559,SE -1844162560,1844164607,CZ -1844164608,1844166655,RU -1844166656,1844168703,AZ -1844168704,1844169471,SE -1844169472,1844169487,AF -1844169488,1844169519,US -1844169520,1844169567,SE -1844169568,1844169583,US -1844169584,1844169599,SE -1844169600,1844169647,US -1844169648,1844169655,AF -1844169656,1844169679,US -1844169680,1844169687,ZM -1844169688,1844169695,IQ -1844169696,1844169703,KZ -1844169704,1844169707,ZA -1844169708,1844169727,SE -1844169728,1844170751,DE -1844170752,1844174847,RU -1844174848,1844178943,DE -1844178944,1844180991,EE -1844180992,1844183039,TR -1844183040,1844185087,IT -1844185088,1844186111,IE -1844186112,1844191231,IT -1844191232,1844195327,AL -1844199424,1844203519,RU -1844203520,1844207615,NL -1844207616,1844211711,RU -1844211712,1844215807,SK -1844215808,1844219903,BE -1844219904,1844221951,US -1844221952,1844222975,DE -1844222976,1844223999,US -1844224000,1844228095,GB -1844228096,1844232191,DK -1844232192,1844236287,ES -1844236288,1844252671,RU -1844252672,1844256767,GB -1844256768,1844260863,BA -1844260864,1844264959,CH -1844264960,1844269055,NL -1844269056,1844273151,UA -1844273152,1844277247,RU -1844277248,1844281343,AZ -1844281344,1844285439,DE -1844285440,1844289535,RU -1844289536,1844293631,IT -1844293632,1844297727,DE -1844297728,1844301823,IQ -1844301824,1844305919,NL -1844305920,1844310015,RU -1844310016,1844318207,FR -1844318208,1844322303,IT -1844322304,1844326399,CZ -1844326400,1844330495,DK -1844330496,1844334591,GB -1844334592,1844342783,RU -1844342784,1844346879,IT -1844346880,1844350975,SE -1844350976,1844355071,SY -1844355072,1844359167,KZ -1844359168,1844363263,IR -1844363264,1844367359,RU -1844367360,1844371455,CZ -1844371456,1844375551,GE -1844375552,1844379647,RU -1844379648,1844383743,IR -1844383744,1844387839,AZ -1844387840,1844391935,KZ -1844391936,1844396031,DE -1844396032,1844400127,CZ -1844400128,1844408319,GB -1844408320,1844412415,FR -1844412416,1844414463,RU -1844414464,1844414719,NL -1844414720,1844414975,US -1844414976,1844416511,RU -1844416512,1844420607,FR -1844420608,1844424703,DE -1844424704,1844428799,SI -1844428800,1844432895,DE -1844432896,1844436991,RU -1844436992,1844441087,NO -1844441088,1844445183,IT -1844445184,1844464672,FI -1844464673,1844464673,ES -1844464674,1844510719,FI -1844510720,1844576255,PL -1844576256,1844641791,GR -1844641792,1844707327,PL -1844707328,1844772863,CN -1844772864,1844838399,RS -1844838400,1844903935,GB -1844903936,1844969471,NO -1844969472,1845006335,RU -1845006336,1845010431,KZ -1845010432,1845022719,RU -1845022720,1845023743,KZ -1845023744,1845024255,RU -1845024256,1845024767,GB -1845024768,1845025535,RU -1845025536,1845025791,KZ -1845025792,1845026303,UZ -1845026304,1845027583,RU -1845027584,1845027839,ES -1845027840,1845029887,RU -1845029888,1845030143,KZ -1845030144,1845035007,RU -1845035008,1845100543,GB -1845100544,1845166079,DE -1845166080,1845231615,UA -1845231616,1845297151,RU -1845297152,1845362687,IL -1845362688,1845428223,UA -1845428224,1845493759,IE -1845493760,1845755903,JP -1845755904,1845764095,HK -1845764096,1845766143,JP -1845766144,1845768191,MY -1845768192,1845772287,JP -1845772288,1845788671,KR -1845788672,1845837823,JP -1845837824,1845839871,PH -1845839872,1845841919,IN -1845841920,1845846015,AU -1845846016,1845850111,ID -1845850112,1845851135,WS -1845851136,1845852159,AU -1845852160,1845854207,JP -1845854208,1845886975,KR -1845886976,1846018047,CN -1846018048,1846542335,KR -1846542336,1846804479,CN -1846804480,1847066623,AU -1847066624,1847590911,TW -1847590912,1847721983,AU -1847721984,1847730175,NP -1847730176,1847732223,PK -1847732224,1847734271,CN -1847734272,1847735295,NZ -1847735296,1847736319,AU -1847736320,1847738367,JP -1847738368,1847754751,KR -1847754752,1847757823,TH -1847757824,1847758847,CN -1847758848,1847770111,TH -1847770112,1847771135,SG -1847771136,1847783423,TH -1847783424,1847787519,US -1847787520,1847803903,KR -1847803904,1847807999,VN -1847808000,1847810047,ID -1847810048,1847812095,FJ -1847812096,1847853055,KR -1847853056,1848115199,PK -1848115200,1848377343,CN -1848377344,1848378367,BD -1848378368,1848380415,IN -1848380416,1848381439,CN -1848381440,1848382463,NZ -1848382464,1848383487,JP -1848383488,1848385535,AU -1848385536,1848393727,KR -1848393728,1848401919,JP -1848401920,1848406015,PH -1848406016,1848410111,NP -1848410112,1848411135,JP -1848411136,1848411391,PH -1848411392,1848412415,JP -1848412416,1848412671,PH -1848412672,1848413439,JP -1848413440,1848413951,PH -1848413952,1848414207,JP -1848414208,1848418303,CN -1848418304,1848420351,AU -1848420352,1848422399,ID -1848422400,1848424447,JP -1848424448,1848426495,VN -1848426496,1848639487,KR -1848639488,1848705023,CN -1848705024,1848770559,TH -1848770560,1848774655,JP -1848774656,1848776703,AU -1848776704,1848778751,JP -1848778752,1848786943,IN -1848786944,1848791039,JP -1848791040,1848793087,ID -1848793088,1848803327,JP -1848803328,1848819711,TW -1848819712,1848827903,JP -1848827904,1848831999,PH -1848832000,1848836095,JP -1848836096,1849032703,CN -1849032704,1849065471,JP -1849065472,1849092607,PH -1849092608,1849092863,US -1849092864,1849163775,PH -1849163776,1849819135,CN -1849819136,1849950207,JP -1849950208,1850212351,KR -1850212352,1850343423,CN -1850343424,1850376191,JP -1850376192,1850392575,MY -1850392576,1850400767,KH -1850400768,1850408959,JP -1850408960,1850490879,CN -1850490880,1850507263,KR -1850507264,1850508287,BD -1850508288,1850509311,CN -1850509312,1850510335,AU -1850510336,1850511359,KR -1850511360,1850513407,ID -1850513408,1850514431,TH -1850514432,1850515455,CN -1850515456,1850519551,IN -1850519552,1850520575,AU -1850520576,1850521599,JP -1850521600,1850522623,CN -1850522624,1850523647,HK -1850523648,1850572799,CN -1850572800,1850671103,TH -1850671104,1850736639,HK -1850736640,1851523071,CN -1851523072,1851527167,JP -1851527168,1851528191,NZ -1851528192,1851529215,KR -1851529216,1851531263,PH -1851531264,1851539455,JP -1851539456,1851540479,HK -1851540480,1851541503,CN -1851541504,1851542527,ID -1851542528,1851543551,HK -1851543552,1851547647,JP -1851547648,1851555839,SG -1851555840,1851588607,KR -1851588608,1851590655,JP -1851590656,1851591679,AU -1851591680,1851592703,ID -1851592704,1851594751,AU -1851594752,1851596799,KR -1851596800,1851604991,CN -1851604992,1851613183,PH -1851613184,1851617279,JP -1851617280,1851637759,KR -1851637760,1851654143,PK -1851654144,1853882367,CN -1853882368,1854406655,JP -1854406656,1854668799,ID -1854668800,1855455231,AU -1855455232,1855848447,CN -1855848448,1855913983,JP -1855913984,1855979519,MY -1855979520,1856241663,JP -1856241664,1856307199,TH -1856307200,1856315391,KR -1856315392,1856323583,CN -1856323584,1856339967,KR -1856339968,1856372735,JP -1856372736,1856503807,CN -1856503808,1856765951,TH -1856765952,1856770047,JP -1856770048,1856774143,IN -1856774144,1856779263,JP -1856779264,1856780287,IN -1856780288,1856782335,JP -1856782336,1856798719,KR -1856798720,1856815103,IN -1856815104,1856843775,CN -1856843776,1856847871,HK -1856847872,1856864255,CN -1856864256,1856872447,AU -1856872448,1856876543,NZ -1856876544,1856880639,IN -1856880640,1856888831,CN -1856888832,1856892927,AU -1856892928,1856897023,JP -1856897024,1857028095,AU -1857028096,1860173823,CN -1860173824,1860435967,IN -1860435968,1860698111,CN -1860698112,1860706303,JP -1860706304,1860714495,CN -1860714496,1860722687,ID -1860722688,1860726783,KR -1860726784,1860728831,AU -1860728832,1860733951,JP -1860733952,1860734975,AU -1860734976,1860735999,NZ -1860736000,1860737023,AU -1860737024,1860743167,JP -1860743168,1860743423,HK -1860743424,1860743679,JP -1860743680,1860743935,US -1860743936,1860744191,AU -1860744192,1860745215,IN -1860745216,1860746239,AU -1860746240,1860747263,PK -1860747264,1860759551,JP -1860759552,1860761599,AU -1860761600,1860763647,IN -1860763648,1860829183,JP -1860829184,1860960255,IN -1860960256,1861091327,CN -1861091328,1861222399,AU -1861222400,1866465279,CN -1866465280,1866530815,JP -1866530816,1866563583,SG -1866563584,1866579967,KR -1866579968,1866588159,JP -1866588160,1866592255,NZ -1866592256,1866596351,VN -1866596352,1866661887,CN -1866661888,1866666656,AU -1866666657,1866666657,NZ -1866666658,1866670079,AU -1866670080,1866674175,MY -1866674176,1866678271,TW -1866678272,1866686463,ID -1866686464,1866690559,KH -1866690560,1866711039,JP -1866711040,1866715135,CN -1866715136,1866727423,KR -1866727424,1866731519,HK -1866731520,1866733567,JP -1866733568,1866735615,ID -1866735616,1866743807,PH -1866743808,1866751999,CN -1866752000,1866756095,PK -1866756096,1866760191,ID -1866760192,1866792959,JP -1866792960,1866858495,NZ -1866858496,1866989567,TW -1866989568,1867513855,CN -1867513856,1867775999,TW -1867776000,1867825151,TH -1867825152,1867826175,MM -1867826176,1867841535,TH -1867841536,1867907071,CN -1867907072,1868038143,JP -1868038144,1868103679,PK -1868103680,1868201983,JP -1868201984,1868210175,MY -1868210176,1868212223,JP -1868212224,1868214271,IN -1868214272,1868218367,KH -1868218368,1868234751,SG -1868234752,1868267519,IN -1868267520,1868283903,KR -1868283904,1868292095,CN -1868292096,1868294143,IN -1868294144,1868295167,VN -1868295168,1868296191,HK -1868296192,1868300287,JP -1868300288,1868333055,IN -1868333056,1868341247,PK -1868341248,1868345343,ID -1868345344,1868346367,GU -1868346368,1868347391,TH -1868347392,1868348415,HK -1868348416,1868349439,KR -1868349440,1868357631,SG -1868357632,1868361727,HK -1868361728,1868362751,KH -1868362752,1868363775,JP -1868363776,1868365823,CN -1868365824,1868431359,IN -1868431360,1868562431,ID -1868562432,1869611007,JP -1869611008,1869645422,CN -1869645423,1869645423,CZ -1869645424,1869645429,UG -1869645430,1869645430,CN -1869645431,1869645431,UG -1869645432,1869645433,CN -1869645434,1869645434,CZ -1869645435,1869645444,CN -1869645445,1869645445,CZ -1869645446,1869645511,CN -1869645512,1869645512,UG -1869645513,1869645520,CN -1869645521,1869645521,KR -1869645522,1869645522,CN -1869645523,1869645523,KR -1869645524,1869645544,CN -1869645545,1869645547,KR -1869645548,1870004223,CN -1870004224,1870036991,KR -1870036992,1870045183,KH -1870045184,1870049279,AU -1870049280,1870053375,IN -1870053376,1870055423,AU -1870055424,1870057471,CN -1870057472,1870058495,AU -1870058496,1870059519,IN -1870059520,1870065663,AU -1870065664,1870069759,IN -1870069760,1870077951,JP -1870077952,1870086143,NP -1870086144,1870110719,CN -1870110720,1870118911,PK -1870118912,1870135295,IN -1870135296,1870462975,CN -1870462976,1870479359,JP -1870479360,1870495743,PH -1870495744,1870497791,TW -1870497792,1870499839,IN -1870499840,1870501887,JP -1870501888,1870503935,AF -1870503936,1870512127,AU -1870512128,1870528511,IN -1870528512,1873281023,CN -1873281024,1873412095,JP -1873412096,1873477631,CN -1873477632,1873510399,KR -1873510400,1873543167,JP -1873543168,1874329599,CN -1874329600,1874460671,TW -1874460672,1874591743,CN -1874591744,1874853887,JP -1874853888,1876426751,CN -1876426752,1876557823,JP -1876557824,1876688895,KR -1876688896,1876754431,AU -1876754432,1876756479,BD -1876756480,1876760575,SG -1876760576,1876761199,JP -1876761200,1876761343,SG -1876761344,1876761599,JP -1876761600,1876761855,CN -1876761856,1876762623,HK -1876762624,1876764671,KR -1876764672,1876765695,ID -1876765696,1876766719,SG -1876766720,1876768767,MY -1876768768,1876769791,AU -1876769792,1876770815,JP -1876770816,1876772351,HK -1876772352,1876773887,SG -1876773888,1876774911,HK -1876774912,1876783103,SG -1876783104,1876784127,HK -1876784128,1876785151,SG -1876785152,1876786175,HK -1876786176,1876787199,SG -1876787200,1876885503,CN -1876885504,1876886527,IN -1876886528,1876890623,CN -1876890624,1876893695,IN -1876893696,1876901887,TH -1876901888,1876918271,SG -1876918272,1876934655,LK -1876934656,1876942847,JP -1876942848,1876946943,AU -1876946944,1876947967,CN -1876947968,1876948991,HK -1876948992,1876950015,CN -1876950016,1876951039,ID -1876951040,1877475327,CN -1877475328,1877688319,JP -1877688320,1877691391,IN -1877691392,1877692415,JP -1877692416,1877696511,PH -1877696512,1877704703,CN -1877704704,1877705727,AU -1877705728,1877706751,MY -1877706752,1877707775,SG -1877707776,1877709823,AU -1877709824,1877710847,IN -1877710848,1877711871,HK -1877711872,1877721087,CN -1877721088,1877737471,TW -1877737472,1877999615,JP -1877999616,1879048191,TW -1879048192,1883504639,CN -1883504640,1883766783,JP -1883766784,1883770879,MN -1883770880,1883783167,KR -1883783168,1883799551,VN -1883799552,1883832319,KR -1883832320,1884028927,CN -1884028928,1884159999,KR -1884160000,1884164095,VN -1884164096,1884168191,TW -1884168192,1884172287,ID -1884172288,1884176383,PH -1884176384,1884184575,TW -1884184576,1884186623,ID -1884186624,1884188671,TW -1884188672,1884192767,JP -1884192768,1884209151,ID -1884209152,1884217343,JP -1884217344,1884225535,SG -1884225536,1884291071,IN -1884291072,1885863935,CN -1885863936,1885995007,TW -1885995008,1886191615,KR -1886191616,1886195455,JP -1886195456,1886195711,PH -1886195712,1886197759,ID -1886197760,1886199807,JP -1886199808,1886207999,KR -1886208000,1886214143,NZ -1886214144,1886216191,VN -1886216192,1886224383,IN -1886224384,1886257151,CN -1886257152,1886322687,IN -1886322688,1886781439,CN -1886781440,1886978047,HK -1886978048,1886986239,KR -1886986240,1886990335,TW -1886990336,1886994431,IN -1886994432,1887010815,TW -1887010816,1887019007,TH -1887019008,1887027199,HK -1887027200,1887043583,KR -1887043584,1887764479,CN -1887764480,1887813631,KR -1887813632,1887830015,IN -1887830016,1887961087,LK -1887961088,1887993855,JP -1887993856,1888026623,KR -1888026624,1888030719,BD -1888030720,1888030975,HK -1888030976,1888031231,GB -1888031232,1888034815,HK -1888034816,1888038911,JP -1888038912,1888040959,CN -1888040960,1888059391,JP -1888059392,1888063487,VN -1888063488,1888067583,JP -1888067584,1888071679,MY -1888071680,1888073727,KR -1888073728,1888239615,JP -1888239616,1888255999,KR -1888256000,1888260095,JP -1888260096,1888264191,KR -1888264192,1888266239,ID -1888266240,1888268287,JP -1888268288,1888270335,AU -1888270336,1888271359,SG -1888271360,1888272383,IN -1888272384,1888288767,KR -1888288768,1888354303,AU -1888354304,1888485375,TH -1888485376,1891631103,KR -1891631104,1891893247,CN -1891893248,1891942399,IN -1891942400,1891950591,KR -1891950592,1891958783,PH -1891958784,1892024319,VN -1892024320,1892122623,PH -1892122624,1892155391,SG -1892155392,1892941823,PH -1892941824,1893015551,KR -1893015552,1893017599,AU -1893017600,1893019647,NZ -1893019648,1893023743,TW -1893023744,1893027839,HK -1893027840,1893031935,VN -1893031936,1893040127,HK -1893040128,1893072895,AU -1893072896,1893138431,KR -1893138432,1893203967,ID -1893203968,1893728255,KR -1893728256,1896480767,CN -1896480768,1896497151,KR -1896497152,1896513535,SG -1896513536,1896546303,HK -1896546304,1896579071,BD -1896579072,1896587263,ID -1896587264,1896591359,SG -1896591360,1896593407,ID -1896593408,1896594431,AU -1896594432,1896595455,MY -1896595456,1896603647,CN -1896603648,1896605695,IN -1896605696,1896606719,AU -1896606720,1896607743,MY -1896607744,1896609791,VU -1896609792,1896611839,SG -1896611840,1897070591,CN -1897070592,1897136127,IN -1897136128,1897140223,AU -1897140224,1897141247,IN -1897141248,1897142271,HK -1897142272,1897143295,AU -1897143296,1897144319,ID -1897144320,1897152511,NC -1897152512,1897160703,FJ -1897160704,1897168895,VN -1897168896,1897169919,AU -1897169920,1897170943,HK -1897170944,1897172991,ID -1897172992,1897175039,PH -1897175040,1897176063,JP -1897176064,1897176319,SG -1897176320,1897176575,HK -1897176576,1897176831,JP -1897176832,1897177087,SG -1897177088,1897201663,JP -1897201664,1897209855,KR -1897209856,1897213951,AU -1897213952,1897218047,JP -1897218048,1897222143,IN -1897222144,1897226239,TW -1897226240,1897234431,NC -1897234432,1897242623,SG -1897242624,1897250815,TW -1897250816,1897259007,HK -1897259008,1897260031,NZ -1897260032,1897261055,BD -1897261056,1897263103,CN -1897263104,1897265151,TH -1897265152,1897267199,JP -1897267200,1897365503,VN -1897365504,1897398271,MY -1897398272,1897660415,CN -1897660416,1897725951,HK -1897725952,1897729792,JP -1897729793,1897730047,US -1897730048,1897733888,AU -1897733889,1897734143,US -1897734144,1897734849,CN -1897734850,1897734850,HK -1897734851,1897735295,CN -1897735296,1897735423,HK -1897735424,1897735999,CN -1897736000,1897736031,HK -1897736032,1897736223,CN -1897736224,1897736255,US -1897736256,1897736351,CN -1897736352,1897736415,HK -1897736416,1897737984,CN -1897737985,1897742335,US -1897742336,1897743359,SI -1897743360,1897743871,SG -1897743872,1897744575,SI -1897744576,1897744607,SG -1897744608,1897746176,SI -1897746177,1897746431,US -1897746432,1897748511,CN -1897748512,1897748514,HK -1897748515,1897750527,CN -1897750528,1897758719,US -1897758720,1897779199,KR -1897779200,1897781247,AU -1897781248,1897783295,JP -1897783296,1897784319,SG -1897784320,1897784831,HK -1897784832,1897785343,KR -1897785344,1897787391,SG -1897787392,1897789439,AU -1897789440,1897790463,KH -1897790464,1897791487,HK -1897791488,1897824255,KR -1897824256,1897857023,IN -1897857024,1897922559,CN -1897922560,1898708991,JP -1898708992,1899233279,CN -1899233280,1899237375,AU -1899237376,1899241471,JP -1899241472,1899249663,VN -1899249664,1899266047,MO -1899266048,1899267071,AU -1899267072,1899268095,HK -1899268096,1899270143,KR -1899270144,1899271167,AU -1899271168,1899272191,ID -1899272192,1899273215,SG -1899273216,1899274239,JP -1899274240,1899282431,CN -1899282432,1899290623,KR -1899290624,1899291647,JP -1899291648,1899292671,CN -1899292672,1899294719,AU -1899294720,1899298815,JP -1899298816,1899364351,TH -1899364352,1899724799,CN -1899724800,1899741183,KR -1899741184,1899749375,LK -1899749376,1899750399,CN -1899750400,1899751423,JP -1899751424,1899753471,ID -1899753472,1899757567,HK -1899757568,1899831295,KR -1899831296,1899839487,PH -1899839488,1899849727,AU -1899849728,1899850751,KR -1899850752,1899851775,VN -1899851776,1899855871,JP -1899855872,1899888639,TW -1899888640,1904345087,CN -1904345088,1904361471,JP -1904361472,1904369663,KR -1904369664,1904375807,CN -1904375808,1904376831,NZ -1904376832,1904377855,KH -1904377856,1904476159,KR -1904476160,1905262591,CN -1905262592,1906311167,JP -1906311168,1908408319,VN -1908408320,1908424703,AU -1908424704,1908441087,KR -1908441088,1908473855,JP -1908473856,1908539391,IN -1908539392,1908670463,CN -1908670464,1908735999,TW -1908736000,1908740095,AU -1908740096,1908744191,JP -1908744192,1908746239,SG -1908746240,1908748287,JP -1908748288,1908750335,PK -1908750336,1908752383,JP -1908752384,1908753407,NZ -1908753408,1908754431,PF -1908754432,1908756479,PH -1908756480,1908760575,KR -1908760576,1908761599,NZ -1908761600,1908762623,CN -1908762624,1908762879,IN -1908762880,1908763135,US -1908763136,1908763391,AU -1908763392,1908763647,US -1908763648,1908764671,ID -1908764672,1908768767,AU -1908768768,1908801535,JP -1908801536,1908899839,KR -1908899840,1908932607,NP -1908932608,1909129215,CN -1909129216,1909161983,AE -1909161984,1909194751,PK -1909194752,1909456895,CN -1909456896,1909473279,JP -1909473280,1909474303,HK -1909474304,1909475327,PH -1909475328,1909479423,HK -1909479424,1909481471,SG -1909481472,1909587967,CN -1909587968,1909719039,MY -1909719040,1909735423,CN -1909743616,1909744639,AU -1909744640,1909745663,CN -1909745664,1909746687,JP -1909747712,1909751807,ID -1909751808,1909759999,JP -1909760000,1909762047,ID -1909762048,1909764095,AU -1909764096,1909766143,PH -1909766144,1909768191,CN -1909768192,1909784575,HK -1909784576,1909817343,CN -1909817344,1909850111,JP -1909850112,1909981183,CN -1909981184,1910112255,KR -1910112256,1912340479,CN -1912340480,1912602623,HK -1912602624,1913651199,ID -1913651200,1914109951,JP -1914109952,1914175487,NZ -1914175488,1914437631,TW -1914437632,1914503167,CN -1914503168,1914552319,KR -1914552320,1914560511,SG -1914560512,1914564607,IN -1914564608,1914566655,TW -1914566656,1914567679,IN -1914567680,1914568703,MY -1914568704,1914576895,KR -1914576896,1914580991,TW -1914580992,1914585087,KR -1914585088,1914587135,AU -1914587136,1914589183,IN -1914589184,1914593279,ID -1914593280,1914601471,AU -1914601472,1914634239,KR -1914634240,1914642431,BD -1914642432,1914650623,KR -1914650624,1914652671,CN -1914652672,1914654719,AU -1914654720,1914658815,JP -1914658816,1914660863,AU -1914660864,1914662911,JP -1914662912,1914667007,KR -1914667008,1914683391,IN -1914683392,1914687487,AU -1914687488,1914688511,US -1914688512,1914689535,NZ -1914689536,1914691583,JP -1914691584,1914695679,IN -1914695680,1914697727,ID -1914697728,1914699775,IN -1914699776,1915748351,TW -1915748352,1916010495,JP -1916010496,1916141567,KR -1916141568,1916272639,CN -1916272640,1916534783,ID -1916534784,1917124607,CN -1917124608,1917169663,JP -1917169664,1917181951,NC -1917181952,1917190143,IN -1917190144,1917321215,KR -1917321216,1917779967,AU -1917779968,1917796351,ID -1917796352,1917812735,CN -1917812736,1917845503,IN -1917845504,1919680511,CN -1919680512,1919729663,KR -1919729664,1919746047,PH -1919746048,1919811583,TH -1919811584,1919815679,CN -1919815680,1919817727,ID -1919817728,1919819775,KR -1919819776,1919820543,NZ -1919820544,1919820799,AU -1919820800,1919821823,NZ -1919821824,1919823871,ID -1919823872,1919827967,JP -1919827968,1919844351,CN -1919844352,1919877119,KR -1919877120,1919885311,CN -1919885312,1919893503,KR -1919893504,1919909887,JP -1919909888,1919918079,AU -1919918080,1919926271,CN -1919926272,1919942655,KR -1919942656,1919975935,CN -1919975936,1919976191,JP -1919976192,1919999999,CN -1920000000,1920002047,HK -1920002048,1920003071,CN -1920003072,1920008191,HK -1920008192,1920057343,CN -1920057344,1920058111,HK -1920058112,1920069631,CN -1920069632,1920071167,HK -1920071168,1920072703,CN -1920072704,1920073727,HK -1920073728,1920466943,CN -1920466944,1920991231,ID -1920991232,1921056767,TH -1921056768,1921058815,JP -1921058816,1921060863,BD -1921060864,1921062911,ID -1921062912,1921064959,LA -1921064960,1921069055,SG -1921069056,1921073151,JP -1921073152,1921089535,KR -1921089536,1921105919,AU -1921105920,1921122303,KR -1921122304,1921187839,BD -1921187840,1921253375,TH -1921253376,1921318911,CN -1921318912,1921384447,MY -1921384448,1921388543,NZ -1921388544,1921391615,IN -1921391616,1921400831,JP -1921400832,1921404927,ID -1921404928,1921406463,HK -1921406464,1921406719,GB -1921406720,1921406975,HK -1921406976,1921409023,BD -1921409024,1921425407,JP -1921425408,1921431551,NZ -1921431552,1921433599,KH -1921433600,1921449983,JP -1921449984,1921515519,CN -1921515520,1921646591,TW -1921646592,1921777663,CN -1921777664,1921843199,TW -1921843200,1921851391,KR -1921851392,1921853439,JP -1921853440,1921855487,KR -1921855488,1921859583,ID -1921859584,1921861631,CN -1921861632,1921863679,SG -1921863680,1921865727,CN -1921865728,1921867775,ID -1921867776,1921871871,AU -1921871872,1921872895,US -1921872896,1921873151,NZ -1921873152,1921873407,US -1921873408,1921874687,NZ -1921874688,1921875967,US -1921875968,1921892351,CN -1921892352,1921896447,AU -1921896448,1921898495,SG -1921898496,1921900543,PH -1921900544,1921908735,KR -1921908736,1921943551,JP -1921943552,1921945599,IN -1921945600,1921949695,HK -1921949696,1921950719,AU -1921950720,1921951743,IN -1921951744,1921953791,ID -1921953792,1921957887,JP -1921957888,1921974271,GU -1921974272,1922039807,IN -1922039808,1925447679,JP -1925447680,1925578751,CN -1925578752,1925611519,AU -1925611520,1925619711,PH -1925619712,1925627903,TW -1925627904,1925638143,JP -1925638144,1925640191,PK -1925640192,1925642239,ID -1925642240,1925644287,CN -1925644288,1925660671,KR -1925660672,1925662463,HK -1925662464,1925663743,TW -1925663744,1925664767,HK -1925664768,1925677055,ID -1925677056,1926234111,KR -1926234112,1929379839,CN -1929379840,1930952703,KR -1930952704,1931345919,CN -1931345920,1931354111,JP -1931354112,1931362303,AU -1931362304,1931378687,TW -1931378688,1931427839,JP -1931427840,1931431935,CN -1931431936,1931433983,JP -1931433984,1931436031,AU -1931436032,1931444223,KR -1931444224,1931449343,TH -1931449344,1931449855,RU -1931449856,1931460607,TH -1931460608,1931468799,JP -1931468800,1931476991,SG -1931476992,1931739135,CN -1931739136,1932001279,JP -1932001280,1932132351,KR -1932132352,1932140543,AU -1932140544,1932145663,IN -1932145664,1932146687,BD -1932146688,1932147711,CN -1932147712,1932148735,HK -1932148736,1932152831,PK -1932152832,1932156927,TW -1932156928,1932161023,JP -1932161024,1932163071,TW -1932163072,1932165119,PH -1932165120,1932197887,SG -1932197888,1932263423,TW -1932263424,1933574143,CN -1933574144,1933639679,AU -1933639680,1933705215,JP -1933705216,1933770751,SG -1933770752,1933836287,TH -1933836288,1933901823,KR -1933901824,1933918207,AU -1933918208,1933922303,CN -1933922304,1933926399,IN -1933926400,1933934591,KR -1933934592,1933942783,IN -1933942784,1933950975,NZ -1933950976,1933955071,JP -1933955072,1933957119,BD -1933957120,1933959167,ID -1933959168,1933963263,JP -1933963264,1933967359,IN -1933967360,1934032895,AU -1934032896,1934098431,KR -1934098432,1934622719,VN -1934622720,1934884863,TW -1934884864,1934901247,CN -1934901248,1934917631,LA -1934917632,1934925823,MV -1934925824,1934927871,KR -1934927872,1934929919,PH -1934929920,1934931967,VN -1934931968,1934934015,JP -1934934016,1934942207,CN -1934942208,1934966783,PH -1934966784,1934974975,ID -1934974976,1934983167,JP -1934983168,1934983423,MY -1934983424,1934984447,AU -1934984448,1934984671,US -1934984672,1934984959,AU -1934984960,1934985215,US -1934985216,1934987263,JP -1934987264,1934991359,TW -1934991360,1934999551,KR -1934999552,1935015935,CN -1935015936,1935081471,KR -1935081472,1935147007,TH -1935147008,1935671295,KR -1935671296,1935933439,IN -1935933440,1936457727,CN -1936457728,1937244159,IN -1937244160,1937506303,CN -1937506304,1937510399,AU -1937510400,1937514495,CN -1937514496,1937515519,AU -1937516544,1937518591,IN -1937518592,1937522687,JP -1937522688,1937530879,ID -1937530880,1937534463,IN -1937534464,1937534975,GB -1937534976,1937535999,IN -1937536000,1937536511,GB -1937536512,1937537023,US -1937537024,1937539071,IN -1937539072,1937637375,JP -1937637376,1937670143,HK -1937670144,1937672191,NZ -1937672192,1937678335,JP -1937678336,1937686527,NC -1937686528,1937702911,KR -1937702912,1937760255,BD -1937760256,1937768447,JP -1937768448,1938030591,AU -1938030592,1938292735,MY -1938292736,1938948095,KR -1938948096,1938964479,JP -1938964480,1938972671,AU -1938972672,1938976767,MY -1938976768,1938978815,SG -1938978816,1938980863,VN -1938980864,1939079167,PH -1939079168,1939865599,CN -1939865600,1939898367,KR -1939898368,1939914751,HK -1939914752,1939931135,IN -1939931136,1939996671,KR -1939996672,1940127743,JP -1940127744,1940193279,MY -1940193280,1940234239,JP -1940234240,1940236287,VN -1940236288,1940238335,AU -1940238336,1940240383,KR -1940240384,1940242431,JP -1940242432,1940258815,TW -1940258816,1940275199,AU -1940275200,1940283391,CN -1940283392,1940291583,ID -1940291584,1940295679,IN -1940295680,1940324351,JP -1940324352,1940357119,PK -1940357120,1940389887,JP -1940389888,1940914175,CN -1940914176,1941045247,JP -1941045248,1941045759,HK -1941045760,1941046783,JP -1941046784,1941048319,HK -1941048320,1941049343,SG -1941049344,1941051391,AU -1941051392,1941052415,KH -1941052416,1941053439,AU -1941053440,1941057535,KR -1941057536,1941059583,ID -1941059584,1941061631,TH -1941061632,1941069823,KR -1941069824,1941071871,IN -1941071872,1941073919,AU -1941073920,1941075967,JP -1941075968,1941110783,ID -1941110784,1941176319,JP -1941176320,1941438463,CN -1941438464,1941569535,IN -1941569536,1941618687,PK -1941618688,1941635071,AU -1941635072,1941639167,CN -1941639168,1941643263,NP -1941643264,1941651455,IN -1941651456,1941652167,JP -1941652168,1941652175,CA -1941652176,1941655551,JP -1941655552,1941657599,KR -1941657600,1941658623,MN -1941658624,1941659647,JP -1941659648,1941667839,NZ -1941667840,1941700607,AU -1941700608,1941831679,NZ -1941831680,1945108479,CN -1945108480,1946157055,IN -1946157056,1946159103,ID -1946159104,1946161151,CN -1946161152,1946163199,AU -1946163200,1946165247,CN -1946165248,1946173439,PK -1946173440,1946173567,PG -1946173568,1946173599,HK -1946173600,1946173695,PG -1946173696,1946174463,SG -1946174464,1946174727,TW -1946174728,1946175487,SG -1946175488,1946175615,HK -1946175616,1946175743,CN -1946175744,1946175759,SG -1946175760,1946175791,HK -1946175792,1946175999,SG -1946176000,1946176255,JP -1946176256,1946176511,SG -1946176512,1946176767,AU -1946176768,1946178047,SG -1946178048,1946178303,HK -1946178304,1946178335,SG -1946178336,1946178343,US -1946178344,1946179583,SG -1946179584,1946179839,AU -1946179840,1946181631,SG -1946181632,1946189823,MY -1946189824,1946222591,JP -1946222592,1946943487,CN -1946943488,1946951679,JP -1946951680,1946953727,BD -1946953728,1946955775,ID -1946955776,1946957823,SG -1946957824,1946959871,NZ -1946959872,1946976255,LK -1946976256,1947009023,SG -1947009024,1947074559,CN -1947074560,1947205631,SG -1947205632,1948254207,CN -1948254208,1949302783,KR -1949302784,1949433855,HK -1949433856,1949437951,CN -1949437952,1949439999,AU -1949440000,1949442047,ID -1949442048,1949446143,TW -1949446144,1949448191,JP -1949448192,1949448447,IN -1949448448,1949448703,HK -1949448704,1949448959,AU -1949448960,1949449215,IN -1949449216,1949449395,SG -1949449396,1949449396,IN -1949449397,1949449471,SG -1949449472,1949449727,JP -1949449728,1949466623,IN -1949466624,1949499391,PH -1949499392,1949564927,SG -1949564928,1949958143,CN -1949958144,1949990911,PK -1949990912,1949995007,CN -1949995008,1950007295,JP -1950007296,1950009343,ID -1950009344,1950011391,BD -1950011392,1950015487,CN -1950015488,1950023679,TH -1950023680,1950089215,TW -1950089216,1950351359,CN -1950351360,1950482431,JP -1950482432,1950515199,CN -1950515200,1950515455,US -1950515456,1950515967,IN -1950515968,1950516223,US -1950516224,1950516735,IN -1950516736,1950518271,US -1950518272,1950519295,IN -1950519296,1950520319,US -1950520320,1950521343,PH -1950521344,1950523391,IN -1950523392,1950527487,AU -1950527488,1950528511,CN -1950528512,1950530559,HK -1950530560,1950531583,IN -1950531584,1950533631,NP -1950533632,1950535679,ID -1950535680,1950539775,HK -1950539776,1950541823,AU -1950541824,1950543871,HK -1950543872,1950545919,NZ -1950545920,1950547967,PH -1950547968,1950580735,KR -1950580736,1950613503,JP -1950613504,1950621695,GU -1950621696,1950629887,KR -1950629888,1950646271,IN -1950646272,1950648319,VN -1950648320,1950650367,CN -1950650368,1950654463,TH -1950654464,1950658559,ID -1950658560,1950660607,CN -1950660608,1950662655,HK -1950662656,1950666751,BD -1950666752,1950668799,NP -1950668800,1950670847,JP -1950670848,1950672895,ID -1950672896,1950674943,KR -1950674944,1950676991,IN -1950676992,1950679039,ID -1950679040,1950777343,CN -1950777344,1950810111,JP -1950810112,1950875647,PK -1950875648,1951137791,IN -1951137792,1951399935,CN -1951399936,1951662079,JP -1951662080,1951727615,KR -1951727616,1951793151,CN -1951793152,1952022527,SG -1952022528,1952026623,TW -1952026624,1952030719,CN -1952030720,1952038911,KR -1952038912,1952047103,JP -1952047104,1952051199,NZ -1952051200,1952052223,CN -1952052224,1952053247,AU -1952053248,1952054271,HK -1952054272,1952055295,TH -1952055296,1952071679,AU -1952071680,1952073727,HK -1952073728,1952074751,AU -1952074752,1952075775,NZ -1952075776,1952079871,CN -1952079872,1952088063,PK -1952088064,1952092159,NZ -1952092160,1952096255,JP -1952096256,1952102399,ID -1952102400,1952104447,CN -1952104448,1952108543,JP -1952108544,1952110591,ID -1952110592,1952112639,KR -1952112640,1952116735,NP -1952116736,1952120831,IN -1952120832,1952186367,JP -1952186368,1952186623,HK -1952186624,1952186879,JP -1952186880,1952187135,HK -1952187136,1952188927,JP -1952188928,1952189183,HK -1952189184,1952189951,JP -1952189952,1952190207,HK -1952190208,1952190463,JP -1952190464,1952196607,HK -1952196608,1952219135,JP -1952219136,1952219903,HK -1952219904,1952220415,JP -1952220416,1952220671,HK -1952220672,1952233471,JP -1952233472,1952249855,HK -1952249856,1952251903,JP -1952251904,1952284671,PH -1952284672,1952288767,NZ -1952288768,1952292863,JP -1952292864,1952317439,KR -1952317440,1952382975,JP -1952382976,1952448511,CN -1952448512,1953497087,VN -1953497088,1953890303,CN -1953890304,1953923071,VN -1953923072,1953939455,TW -1953939456,1953951743,JP -1953951744,1953955839,AU -1953955840,1954021375,IN -1954021376,1954545663,KR -1954545664,1958805503,CN -1958805504,1958807551,SG -1958807552,1958809599,MO -1958809600,1958821887,CN -1958821888,1958825983,VN -1958825984,1958830079,KR -1958830080,1958838271,JP -1958838272,1958842367,IN -1958842368,1958844415,NZ -1958844416,1958845439,CN -1958845440,1958845951,MY -1958845952,1958846463,HK -1958846464,1958847487,IN -1958847488,1958848511,CN -1958848512,1958849535,HK -1958849536,1958850559,ID -1958850560,1958852607,CN -1958852608,1958853631,AU -1958853632,1958854655,ID -1958854656,1958860799,AU -1958860800,1958862847,BD -1958862848,1958871039,JP -1958871040,1959067647,CN -1959067648,1959100415,MY -1959100416,1959102463,ID -1959102464,1959104511,JP -1959104512,1959106559,AU -1959106560,1959107583,IN -1959107584,1959108607,NZ -1959108608,1959110655,CN -1959110656,1959112703,JP -1959112704,1959113215,HK -1959113216,1959113471,IN -1959113472,1959113727,HK -1959113728,1959113983,CN -1959113984,1959116799,HK -1959116800,1959133183,SG -1959133184,1959239679,CN -1959239680,1959241727,KR -1959241728,1959243775,IN -1959243776,1959247871,JP -1959247872,1959249919,ID -1959251968,1959256063,NZ -1959256064,1959260159,AU -1959260160,1959264255,JP -1959264256,1959395327,KR -1959395328,1959526399,IN -1959526400,1959657471,CN -1959657472,1959657727,US -1959657728,1959658495,HK -1959658496,1959661567,ID -1959661568,1959662591,IN -1959662592,1959663615,LK -1959663616,1959664639,SG -1959664640,1959668735,ID -1959668736,1959669759,BD -1959669760,1959670015,MX -1959670016,1959670143,CO -1959670144,1959670271,AR -1959670272,1959670399,TH -1959670400,1959670527,SG -1959670528,1959670655,FI -1959670656,1959670783,NO -1959670784,1959671807,HK -1959671808,1959673855,BD -1959673856,1959674879,PK -1959674880,1959675903,JP -1959675904,1959676927,TW -1959676928,1959677951,SG -1959677952,1959678975,AU -1959678976,1959679999,PK -1959680000,1959681023,BD -1959681024,1959681024,HK -1959681025,1959681279,CN -1959681280,1959681280,HK -1959681281,1959681535,CN -1959681536,1959681536,HK -1959681537,1959681791,CN -1959681792,1959681792,HK -1959681793,1959682047,CN -1959682048,1959683071,IN -1959683072,1959684095,US -1959684096,1959685119,SC -1959685120,1959686143,PH -1959686144,1959687167,TH -1959687168,1959688191,HK -1959688192,1959689215,JP -1959689216,1959690239,TH -1959690240,1959691263,AU -1959691264,1959692287,BD -1959692288,1959693311,MM -1959693312,1959694335,PK -1959694336,1959698431,IN -1959698432,1959699455,NZ -1959699456,1959700479,PK -1959700480,1959701503,SE -1959701504,1959702527,NZ -1959702528,1959703551,CN -1959703552,1959704575,LK -1959704576,1959705599,AU -1959705600,1959707647,BD -1959707648,1959708671,ID -1959708672,1959709695,IN -1959709696,1959710719,SG -1959710720,1959711743,HK -1959711744,1959712767,ID -1959712768,1959713791,AU -1959713792,1959714815,IN -1959714816,1959715839,PH -1959715840,1959716095,AU -1959716096,1959716351,NZ -1959716352,1959716863,AU -1959716864,1959719935,ID -1959719936,1959720959,LK -1959720960,1959721983,MY -1959721984,1959723007,BD -1959723008,1960050687,CN -1960050688,1960058879,KR -1960058880,1960067071,VN -1960067072,1960069119,AU -1960069120,1960071167,ID -1960071168,1960075263,TW -1960075264,1960077311,ID -1960077312,1960079359,BD -1960079360,1960083455,HK -1960083456,1960091647,KH -1960091648,1960095743,CN -1960095744,1960097791,IN -1960097792,1960099839,BD -1960099840,1960121343,AU -1960121344,1960122367,JP -1960122368,1960124415,ID -1960124416,1960125439,PK -1960125440,1960126463,HK -1960126464,1960128511,CN -1960128512,1960132607,ID -1960132608,1960181759,CN -1960181760,1960185855,TW -1960185856,1960187903,JP -1960187904,1960189951,KH -1960189952,1960202239,CN -1960202240,1960206335,JP -1960206336,1960210431,SG -1960210432,1960210943,TH -1960210944,1960211199,IN -1960211200,1960211455,SG -1960211456,1960211903,AU -1960211904,1960211967,SG -1960211968,1960212479,AU -1960212480,1960212991,IN -1960212992,1960214015,SG -1960214016,1960214271,IN -1960214272,1960214527,SG -1960214528,1960574975,CN -1960574976,1960837119,JP -1960837120,1961885695,CN -1961885696,1961951231,AU -1961951232,1962016767,TW -1962016768,1962541055,CN -1962541056,1962622975,AU -1962622976,1962639359,CN -1962639360,1962658815,NZ -1962658816,1962659839,HK -1962659840,1962663935,SG -1962663936,1962672127,HK -1962672128,1962803199,CN -1962803200,1962827775,JP -1962827776,1962829823,ID -1962829824,1962831871,CN -1962831872,1962835967,ID -1962835968,1962868735,CN -1962868736,1962885119,AU -1962885120,1962901503,KR -1962901504,1962934271,CN -1962934272,1963458559,VN -1963458560,1963982847,CN -1963982848,1964113919,KR -1964113920,1964118015,HK -1964118016,1964120063,ID -1964120064,1964122111,JP -1964122112,1964122367,SG -1964122368,1964122879,JP -1964122880,1964123135,HK -1964123136,1964123391,GB -1964123392,1964123647,US -1964123648,1964123903,CN -1964123904,1964126207,SG -1964126208,1964126463,HK -1964126464,1964129279,SG -1964129280,1964129535,HK -1964129536,1964130303,SG -1964130304,1964134399,HK -1964134400,1964136447,AU -1964136448,1964138495,JP -1964138496,1964146687,HK -1964146688,1964171263,JP -1964173312,1964173567,US -1964173568,1964173823,JP -1964173824,1964174079,US -1964174080,1964174335,AU -1964174336,1964174591,SG -1964174592,1964174620,US -1964174621,1964174621,TW -1964174622,1964175359,US -1964175360,1964176383,GB -1964176384,1964178431,PK -1964178432,1964179455,FR -1964179456,1964179456,AU -1964179457,1964244991,TW -1964244992,1964249087,AU -1964249088,1964253183,PK -1964253184,1964255231,WF -1964255232,1964257279,SG -1964257280,1964261375,ID -1964261376,1964263423,AU -1964263424,1964265471,JP -1964265472,1964269567,KR -1964269568,1964273663,JP -1964273664,1964275711,KH -1964275712,1964277759,GU -1964277760,1964294143,SG -1964294144,1964310527,KR -1964310528,1965948927,CN -1965948928,1966014463,JP -1966014464,1966079999,TH -1966080000,1966342143,CN -1966342144,1966407679,KR -1966407680,1966417919,JP -1966417920,1966418943,PK -1966418944,1966419967,ID -1966419968,1966424063,CN -1966424064,1966440447,KR -1966440448,1966444543,AU -1966444544,1966446591,ID -1966446592,1966447615,MY -1966447616,1966448639,NZ -1966448640,1966452735,AU -1966452736,1966456831,CN -1966456832,1966473215,KR -1966473216,1966538751,ID -1966538752,1966571519,JP -1966571520,1966587903,KR -1966587904,1966591999,AF -1966592000,1966596095,JP -1966596096,1966600191,AU -1966600192,1966602239,IN -1966602240,1966604287,KH -1966604288,1966669823,TW -1966669824,1966768127,CN -1966768128,1966772223,KR -1966772224,1966776319,JP -1966776320,1966784511,SG -1966784512,1966792703,PH -1966792704,1966796799,JP -1966796800,1966798847,BD -1966798848,1966800895,AU -1966800896,1967783935,CN -1967783936,1967800319,JP -1967800320,1967808511,CN -1967808512,1967812607,AU -1967812608,1967816703,ID -1967816704,1969225727,CN -1969225728,1969487871,IN -1969487872,1969618943,CN -1969618944,1969635327,PK -1969635328,1969651711,ID -1969651712,1969659903,AU -1969659904,1969661951,ID -1969661952,1969676287,JP -1969676288,1969688575,ID -1969688576,1969692671,CN -1969692672,1969694719,ID -1969694720,1969696767,CN -1969696768,1969702911,ID -1969702912,1969704959,CN -1969704960,1969707007,BD -1969707008,1969709055,MH -1969709056,1969713151,TW -1969713152,1969713663,AU -1969713664,1969714687,ID -1969714688,1969715199,AU -1969715200,1969716223,SG -1969716224,1969716735,HK -1969716736,1969717247,IN -1969717248,1969721343,CN -1969721344,1969725439,HK -1969725440,1969727487,JP -1969727488,1969729535,ID -1969729536,1969733631,JP -1969733632,1969750015,VN -1969750016,1969790975,JP -1969790976,1969793023,AU -1969793024,1969795071,CN -1969795072,1969797119,NZ -1969797120,1969797631,SG -1969797632,1969798143,BD -1969798144,1969798399,CN -1969798400,1969798655,HK -1969798656,1969798911,KR -1969798912,1969799167,HK -1969799168,1969807359,ID -1969807360,1969809407,AF -1969809408,1969811455,IN -1969811456,1969815551,PH -1969815552,1969881087,SG -1969881088,1970012159,CN -1970012160,1970143231,JP -1970143232,1970274303,KR -1970274304,1970798591,CN -1970798592,1970800639,SG -1970800640,1970802943,AU -1970802944,1970803199,SG -1970803200,1970803455,AU -1970803456,1970803711,IN -1970803712,1970803967,HK -1970803968,1970804223,SG -1970804224,1970804519,AU -1970804520,1970804520,SG -1970804521,1970804735,AU -1970804736,1970806783,KH -1970806784,1970808831,NZ -1970808832,1970810879,AU -1970810880,1970812927,JP -1970812928,1970813951,IN -1970813952,1970814975,HK -1970814976,1970915327,CN -1970915328,1970917375,ID -1970917376,1970921471,TH -1970921472,1970925567,NP -1970925568,1970925823,MY -1970925824,1970926079,SG -1970926080,1970926335,AU -1970926336,1970926591,US -1970926592,1970926847,SG -1970926848,1970927103,FR -1970927104,1970927359,SG -1970927360,1970927615,US -1970927616,1970929663,AU -1970929664,1970962431,VN -1970962432,1970995199,CN -1970995200,1971060735,KR -1971060736,1975517183,CN -1975517184,1979711487,IN -1979711488,1981284351,JP -1981284352,1981480959,CN -1981480960,1981546495,JP -1981546496,1981808639,CN -1981808640,1983905791,KR -1983905792,1984102399,CN -1984102400,1984118783,AU -1984118784,1984131071,JP -1984131072,1984135167,CN -1984135168,1984151551,KR -1984151552,1984153599,NZ -1984153600,1984155647,KH -1984155648,1984159743,BD -1984159744,1984167935,IN -1984167936,1984430079,VN -1984430080,1985085439,CN -1985085440,1985093631,ID -1985093632,1985097727,AU -1985097728,1985118207,JP -1985118208,1985150975,NZ -1985150976,1985216511,JP -1985216512,1985347583,CN -1985347584,1985478655,JP -1985478656,1985480703,IN -1985480704,1985482751,PH -1985482752,1985486847,AU -1985486848,1985609727,CN -1985609728,1985675263,NZ -1985675264,1985708031,KR -1985708032,1985712127,ID -1985712128,1985716223,KR -1985716224,1985720319,NP -1985720320,1985724415,IN -1985724416,1985732607,JP -1985732608,1985734655,ID -1985734656,1985736703,IN -1985736704,1985740799,CN -1985740800,1985871871,NZ -1985871872,1986002943,IN -1986002944,1986199551,ID -1986199552,1986202623,HK -1986202624,1986202879,TW -1986202880,1986215935,HK -1986215936,1986232319,ID -1986232320,1986265087,TW -1986265088,1986396159,MY -1986396160,1986398207,VN -1986398208,1986400255,HK -1986400256,1986406399,CN -1986406400,1986412543,JP -1986412544,1986428927,AU -1986428928,1986461695,IN -1986461696,1986496511,JP -1986496512,1986498559,BT -1986498560,1986502655,HK -1986502656,1986503679,IN -1986503680,1986507775,CN -1986507776,1986508799,SG -1986508800,1986509823,AU -1986509824,1986510847,JP -1986510848,1986519039,KR -1986519040,1986523135,PK -1986523136,1986525183,CN -1986525184,1986527231,BN -1986527232,1986723839,JP -1986723840,1986740223,AU -1986740224,1986756607,VN -1986756608,1986760703,PK -1986760704,1986762751,AU -1986762752,1986764799,JP -1986764800,1986768895,KR -1986768896,1986769151,SG -1986769152,1986769919,TW -1986769920,1986770943,HK -1986770944,1986772991,AU -1986772992,1986789375,MY -1986789376,1987051519,JP -1987051520,1988034559,CN -1988034560,1988067327,AU -1988067328,1988075519,CN -1988075520,1988083711,AU -1988083712,1988362239,KR -1988362240,1988624383,CN -1988624384,1988755455,ID -1988755456,1988861951,AU -1988861952,1988870143,SG -1988870144,1988886527,KR -1988886528,1989148671,HK -1989148672,1989410815,CN -1989410816,1989541887,NZ -1989541888,1989607423,TW -1989607424,1989660671,JP -1989660672,1989661695,IN -1989661696,1989662719,ID -1989662720,1989663743,AU -1989663744,1989664767,ID -1989664768,1990197247,JP -1990197248,1990983679,TW -1990983680,1991245823,TH -1991245824,1991311359,KR -1991311360,1991376895,JP -1991376896,1991442431,CN -1991442432,1991499775,BD -1991499776,1991507967,NC -1991507968,1991776255,CN -1991776256,1991776511,HK -1991776512,1991835647,CN -1991835648,1991901183,IN -1991901184,1992097791,CN -1992097792,1992163327,SG -1992163328,1992364031,CN -1992364032,1992368127,HK -1992368128,1992380415,CN -1992380416,1992384511,HK -1992384512,1992398967,CN -1992398968,1992398968,HK -1992398969,1992406228,CN -1992406229,1992406229,HK -1992406230,1992417279,CN -1992417280,1992417535,HK -1992417536,1992818687,CN -1992818688,1992949759,SG -1992949760,1993342975,CN -1993342976,1993605119,AU -1993605120,1993736191,CN -1993736192,1993850879,SG -1993850880,1993867263,CN -1993867264,1994391551,KR -1994391552,1994850303,CN -1994850304,1995046911,TW -1995046912,1995177983,KR -1995177984,1995374591,JP -1995374592,1995440127,CN -1995440128,1995571199,JP -1995571200,1995636735,CN -1995636736,1995702271,JP -1995702272,1996627967,CN -1996627968,1996630015,PH -1996630016,1996634111,ID -1996634112,1996636159,AU -1996636160,1996644351,ID -1996644352,1996652543,BT -1996652544,1997078527,CN -1997078528,1997094911,AU -1997094912,1997111295,HK -1997111296,1997127679,AU -1997127680,1997144063,HK -1997144064,1997176831,CN -1997176832,1997180927,AU -1997180928,1997185023,HK -1997185024,1997187071,JP -1997187072,1997188095,HK -1997188096,1997189119,BD -1997189120,1997191167,ID -1997191168,1997209599,JP -1997209600,1997242367,AU -1997242368,1997275135,ID -1997275136,1997406207,AU -1997406208,1997471743,TW -1997471744,1997479935,NZ -1997479936,1997488127,JP -1997488128,1997488383,AU -1997488384,1997488639,NZ -1997488640,1997492223,AU -1997492224,1997496319,KH -1997496320,1997500415,AU -1997500416,1997504511,JP -1997504512,1997506559,ID -1997506560,1997508607,CN -1997508608,1997510655,JP -1997510656,1997512703,BD -1997512704,1997520895,VN -1997520896,1997537279,TW -1997537280,1997602815,CN -1997602816,1997611007,KR -1997611008,1997619199,AU -1997619200,1997635583,KR -1997635584,1997651967,AU -1997651968,1997668351,VN -1997668352,1997680639,AU -1997680640,1997684735,IN -1997684736,1997701119,KR -1997701120,1997705215,VN -1997705216,1997707263,BD -1997707264,1997709311,ID -1997709312,1997715455,JP -1997715456,1997717503,VN -1997717504,1997723647,CN -1997723648,1997725695,JP -1997725696,1998061567,CN -1998061568,1998271271,JP -1998271272,1998271272,AU -1998271273,1998274047,JP -1998274048,1998274303,US -1998274304,1998274559,JP -1998274560,1998454783,CN -1998454784,1998456831,AU -1998456832,1998458879,JP -1998458880,1998462975,TW -1998462976,1998467071,BD -1998467072,1998471167,CN -1998471168,1998487551,PK -1998487552,1998503935,KR -1998503936,1998520319,JP -1998520320,1998553087,TH -1998553088,1998561279,JP -1998561280,1998562559,IN -1998562560,1998562815,CN -1998562816,1998562863,IN -1998562864,1998562864,HK -1998562865,1998565375,IN -1998565376,1998569471,TW -1998569472,1998577663,CN -1998577664,1998579711,AU -1998579712,1998581759,SG -1998581760,1998584063,KR -1998584064,1998584319,IN -1998584320,1998584575,OM -1998584576,1998584831,IN -1998584832,1998585087,ZA -1998585088,1998585343,SG -1998585344,1998585599,JP -1998585600,1998585855,KR -1998585856,1999130623,CN -1999130624,1999134719,BD -1999134720,1999136767,MN -1999136768,1999138815,AU -1999138816,1999142911,MY -1999142912,1999249407,CN -1999249408,1999250431,AU -1999250432,1999250943,BR -1999250944,1999251455,AR -1999251456,1999252479,VG -1999252480,1999253503,GB -1999253504,1999254527,MY -1999254528,1999255551,CN -1999255552,1999256575,IN -1999256576,1999257599,HK -1999257600,1999273983,TH -1999273984,1999278079,CN -1999278080,1999280127,HK -1999280128,1999282175,IN -1999282176,1999290367,KR -1999290368,1999298559,SG -1999298560,1999306751,CN -1999306752,1999372287,IN -1999372288,1999503359,CN -1999503360,1999568895,TH -1999568896,1999589375,JP -1999589376,1999591423,HK -1999591424,1999593471,ID -1999593472,1999597567,JP -1999597568,1999601663,NZ -1999601664,1999634431,JP -1999634432,2000158719,CN -2000158720,2000191487,SG -2000191488,2000224255,KR -2000224256,2000355327,CN -2000355328,2000371711,KR -2000371712,2000373759,JP -2000373760,2000375807,HK -2000375808,2000377855,AF -2000377856,2000379903,JP -2000379904,2000388095,TH -2000388096,2000617471,CN -2000617472,2000621567,PH -2000621568,2000625663,JP -2000625664,2000633855,CN -2000633856,2000642047,TH -2000642048,2000646143,HK -2000646144,2000650239,JP -2000650240,2000654335,PK -2000654336,2000668671,JP -2000668672,2000674815,AU -2000674816,2001207295,KR -2001207296,2001272831,JP -2001272832,2001305599,PK -2001305600,2001420287,SG -2001420288,2001453055,KR -2001453056,2001457151,SG -2001457152,2001461247,CN -2001461248,2001465343,JP -2001465344,2001469439,TW -2001469440,2001534975,TH -2001534976,2001559551,AU -2001559552,2001567743,KR -2001567744,2001600511,TW -2001600512,2001797119,CN -2001797120,2001798849,SG -2001798850,2001798850,KR -2001798851,2001817673,SG -2001817674,2001817674,US -2001817675,2001829887,SG -2001829888,2001841247,HK -2001841248,2001841248,SA -2001841249,2001846271,HK -2001846272,2001854463,SG -2001854464,2001862655,HK -2001862656,2001864703,AU -2001864704,2001870847,JP -2001870848,2001879039,KR -2001879040,2001895423,IN -2001895424,2001899519,VN -2001899520,2001901567,AU -2001901568,2001915903,JP -2001915904,2001919999,CN -2001920000,2001926143,ID -2001926144,2001928191,KH -2001928192,2001993727,JP -2001993728,2002518015,CN -2002518016,2002575325,PH -2002575326,2002575326,US -2002575327,2002780159,PH -2002780160,2003273727,CN -2003273728,2003273983,BT -2003273984,2003304447,CN -2003304448,2003566591,JP -2003566592,2003697663,CN -2003697664,2003714047,MY -2003714048,2003720191,ID -2003720192,2003722239,JP -2003722240,2003726335,MY -2003726336,2003730431,ID -2003730432,2003763199,MY -2003763200,2003828735,PH -2003828736,2006188031,CN -2006188032,2006204415,BD -2006204416,2006212607,AU -2006212608,2006214655,TH -2006214656,2006216703,JP -2006216704,2006228991,KR -2006228992,2006237183,CN -2006237184,2006253567,JP -2006253568,2006319103,KR -2006319104,2006384639,JP -2006384640,2006433791,IN -2006433792,2006450175,CN -2006450176,2007007231,PK -2007007232,2007023615,BN -2007023616,2007025663,IN -2007025664,2007027711,CN -2007027712,2007031807,TH -2007031808,2007033855,NZ -2007035904,2007039999,TW -2007040000,2007048191,KR -2007048192,2007064575,AU -2007064576,2007065599,IN -2007065600,2007066623,SG -2007066624,2007070719,JP -2007070720,2007498751,CN -2007498752,2007499008,JP -2007499009,2007499009,PH -2007499010,2008023039,JP -2008023040,2009071615,CN -2009071616,2011168767,KR -2011168768,2011205631,NZ -2011205632,2011209727,AU -2011209728,2011234303,JP -2011234304,2011299839,AU -2011299840,2011430911,IN -2011430912,2011693055,JP -2011693056,2011824127,CN -2011824128,2011889663,SG -2011889664,2011893759,LK -2011893760,2011897855,ID -2011897856,2011899903,NZ -2011899904,2011901951,HK -2011901952,2011906047,IN -2011906048,2011916287,FJ -2011916288,2011922431,JP -2011922432,2011938815,CN -2011938816,2011942911,KR -2011942912,2011947007,ID -2011947008,2011951103,JP -2011951104,2011953151,KR -2011953152,2011955199,ID -2011955200,2012086271,HK -2012086272,2012610559,JP -2012610560,2012741631,HK -2012741632,2013003775,CN -2013003776,2013011967,AU -2013011968,2013020159,JP -2013020160,2013028351,AU -2013028352,2013030399,CN -2013030400,2013032447,ID -2013032448,2013036543,FM -2013036544,2013038591,ID -2013038592,2013040639,HK -2013040640,2013044735,IN -2013044736,2013048831,ID -2013048832,2013052927,AU -2013052928,2013061119,IN -2013061120,2013065215,PG -2013065216,2014314495,CN -2014314496,2014838783,AU -2014838784,2015100927,CN -2015100928,2015166463,PH -2015166464,2015182847,AU -2015182848,2015199231,PH -2015199232,2015203327,KR -2015203328,2015205375,JP -2015205376,2015207423,ID -2015207424,2015215615,JP -2015215616,2015216383,IN -2015216384,2015216639,AU -2015216640,2015217663,IN -2015217664,2015219456,GU -2015219457,2015219967,IN -2015219968,2015220223,PH -2015220224,2015220479,IN -2015220480,2015220735,JP -2015220736,2015223807,IN -2015223808,2015225855,ID -2015225856,2015227903,IN -2015227904,2015231999,AU -2015232000,2016542719,CN -2016542720,2016550911,BD -2016550912,2016555007,SG -2016555008,2016559103,MY -2016559104,2016583679,KR -2016583680,2016587775,JP -2016587776,2016589823,BD -2016589824,2016591871,VN -2016591872,2016673791,JP -2016673792,2016935935,CN -2016935936,2017460223,IN -2017460224,2017984511,CN -2017984512,2017988607,JP -2017988608,2017992703,PH -2017992704,2018000895,CN -2018000896,2018004991,JP -2018004992,2018007039,VN -2018007040,2018009087,IN -2018009088,2018017279,VN -2018017280,2018050047,CN -2018050048,2018115583,KR -2018115584,2018246655,JP -2018246656,2019033087,CN -2019033088,2019035135,AU -2019035136,2019037183,CN -2019037184,2019041279,JP -2019041280,2019045375,IN -2019045376,2019049471,JP -2019049472,2019078143,AU -2019078144,2019082239,IN -2019082240,2019098623,HK -2019098624,2019115007,PH -2019117056,2019119103,IN -2019119104,2019121151,NZ -2019121152,2019123199,ID -2019123200,2019131391,NP -2019131392,2019164159,JP -2019164160,2019360767,CN -2019360768,2019426303,JP -2019426304,2019557375,CN -2019557376,2021654527,TW -2021654528,2022178815,CN -2022178816,2022180863,NZ -2022180864,2022182911,JP -2022182912,2022184959,CN -2022184960,2022187007,KH -2022187008,2022187951,HK -2022187952,2022187959,US -2022187960,2022188103,HK -2022188104,2022188111,US -2022188112,2022191103,HK -2022191104,2022194175,NZ -2022194176,2022194687,AU -2022194688,2022195199,NZ -2022195200,2022211583,KR -2022211584,2022227967,CN -2022227968,2022244351,JP -2022244352,2022277119,CN -2022277120,2022309887,JP -2022309888,2022313983,IN -2022313984,2022318079,NZ -2022318080,2022319135,AU -2022319136,2022319151,SG -2022319152,2022319359,AU -2022319360,2022319615,IN -2022319616,2022320127,AU -2022320128,2022320383,HK -2022320384,2022320675,AU -2022320676,2022320676,CN -2022320677,2022320677,ID -2022320678,2022320678,PH -2022320679,2022321151,AU -2022321152,2022321407,SG -2022321408,2022322175,AU -2022322176,2022322431,JP -2022322432,2022322695,AU -2022322696,2022322696,TW -2022322697,2022323199,AU -2022323200,2022323455,KR -2022323456,2022324223,AU -2022324224,2022324224,TH -2022324225,2022324483,AU -2022324484,2022324484,MY -2022324485,2022326271,AU -2022326272,2022330367,VN -2022330368,2022334463,MY -2022334464,2022342655,IN -2022342656,2022359039,JP -2022359040,2022375423,IN -2022375424,2022572031,MY -2022572032,2022637567,KR -2022637568,2022670335,JP -2022670336,2022678527,CN -2022678528,2022703103,KR -2022703104,2023751679,AU -2023751680,2025848831,ID -2025848832,2030043135,CN -2030043136,2030045183,AU -2030045184,2030051327,CN -2030051328,2030059519,JP -2030059520,2030108671,KR -2030108672,2030125055,PH -2030125056,2030141439,KR -2030141440,2030305279,JP -2030305280,2030436351,CN -2030436352,2030567423,SG -2030567424,2032926719,CN -2032926720,2033057791,AU -2033057792,2033074175,CN -2033074176,2033075199,PK -2033075200,2033076223,BD -2033077248,2033078271,CN -2033078272,2033079295,HK -2033079296,2033088511,IN -2033088512,2033089535,AU -2033089536,2033090559,US -2033090560,2033319935,CN -2033319936,2033321983,IN -2033321984,2033324031,CN -2033324032,2033328127,KR -2033328128,2033330175,ID -2033330176,2033336319,JP -2033336320,2033352703,KR -2033352704,2033356799,ID -2033356800,2033358847,TW -2033358848,2033362943,JP -2033362944,2033363967,HK -2033363968,2033364991,VN -2033364992,2033369087,TW -2033369088,2033377279,AU -2033377280,2033385471,KR -2033385472,2033451007,CN -2033451008,2033487871,ID -2033487872,2033491967,PK -2033491968,2033500159,CN -2033500160,2033502207,AU -2033502208,2033504255,SG -2033504256,2033516543,CN -2033516544,2033582079,KR -2033582080,2033614847,PH -2033614848,2033623039,AU -2033623040,2033624063,HK -2033624064,2033625087,MM -2033625088,2033627135,HK -2033627136,2033629183,CN -2033629184,2033630207,AU -2033630208,2033631231,CN -2033631232,2033647615,KR -2033647616,2033663999,CN -2033664000,2033696767,KR -2033696768,2033713151,GU -2033713152,2033876991,CN -2033876992,2033879039,JP -2033879040,2033887231,CN -2033887232,2033889279,IN -2033889280,2033891327,JP -2033891328,2033893375,ID -2033893376,2033909759,PH -2033909760,2034237439,CN -2034237440,2034499583,KR -2034499584,2034761727,CN -2034761728,2035023871,NZ -2035023872,2035154943,CN -2035154944,2035220479,KR -2035220480,2035253247,AU -2035253248,2035269631,CN -2035269632,2035286015,NZ -2035286016,2035810303,JP -2035810304,2035875839,KR -2035875840,2035941375,CN -2035941376,2036006911,NZ -2036006912,2036072447,AU -2036072448,2036334591,JP -2036334592,2036465663,PH -2036465664,2036596735,NZ -2036596736,2036598783,ID -2036598784,2036600831,JP -2036600832,2036604927,ID -2036604928,2036609023,SG -2036609024,2036611071,AF -2036611072,2036613119,JP -2036613120,2036629503,KR -2036629504,2036678655,CN -2036678656,2036695039,JP -2036695040,2036697087,ID -2036697088,2036699135,AU -2036699136,2036703231,IN -2036703232,2036705279,AU -2036705280,2036707327,HK -2036707328,2036709375,MN -2036709376,2036711423,ID -2036711424,2036715519,KR -2036715520,2036719615,CN -2036719616,2036727807,KR -2036727808,2037346158,JP -2037346159,2037346162,CZ -2037346163,2037346163,JP -2037346164,2037346164,CZ -2037346165,2037907455,JP -2037907456,2038169599,MY -2038169600,2038366207,KR -2038366208,2038374399,PH -2038374400,2038382591,AF -2038382592,2038415359,KR -2038415360,2038423551,AU -2038423552,2038431743,HK -2038431744,2042626047,KR -2042626048,2043150335,CN -2043150336,2043162623,AU -2043162624,2043165695,IN -2043165696,2043166719,BD -2043166720,2043183103,KR -2043183104,2043199487,JP -2043199488,2043201535,CN -2043201536,2043203583,JP -2043203584,2043205631,AU -2043205632,2043207679,JP -2043207680,2043211775,AU -2043211776,2043215871,SG -2043215872,2043281407,CN -2043281408,2043412479,HK -2043412480,2043674623,CN -2043674624,2044723199,AU -2044723200,2045771775,CN -2045771776,2046296063,IN -2046296064,2046558207,CN -2046558208,2046705663,KR -2046705664,2046722047,TW -2046722048,2046754815,KR -2046754816,2046820351,CN -2046820352,2046822399,TH -2046822400,2046824447,KR -2046824448,2046828543,MY -2046828544,2046836735,KR -2046836736,2046885887,CN -2046885888,2046951423,JP -2046951424,2047082495,PH -2047082496,2047344895,CN -2047344896,2047345151,PK -2047345152,2047346175,CN -2047346176,2047346687,PK -2047346688,2047347199,CN -2047347200,2047366143,PK -2047366144,2047366655,CN -2047366656,2047367423,PK -2047367424,2047367935,CN -2047367936,2047410175,PK -2047410176,2047492095,HK -2047492096,2047496191,KR -2047496192,2047506431,HK -2047506432,2047508479,US -2047508480,2047574015,CN -2047574016,2047606783,SG -2047606784,2047770879,CN -2047770880,2047773184,HK -2047773185,2047803391,CN -2047803392,2047868927,IN -2047868928,2048917503,JP -2048917504,2049966079,KR -2049966080,2050047999,CN -2050048000,2050064383,KR -2050064384,2050080767,AU -2050080768,2050082815,JP -2050082816,2050084863,AU -2050084864,2050088959,PH -2050088960,2050091007,ID -2050091008,2050097151,JP -2050097152,2050098175,PK -2050098176,2050099199,ID -2050099200,2050101247,SG -2050101248,2050129919,JP -2050129920,2050162687,IN -2050162688,2050228223,CN -2050228224,2050490367,PH -2050490368,2051014655,NZ -2051014656,2053242879,CN -2053242880,2053308415,IN -2053308416,2053324799,TW -2053324800,2053332991,AU -2053332992,2053335039,BD -2053335040,2053337087,JP -2053337088,2053340159,AU -2053340160,2053341183,IN -2053341184,2053373951,KR -2053373952,2053378047,AU -2053378048,2053382143,JP -2053382144,2053390335,KR -2053390336,2053406719,TW -2053406720,2053439487,MO -2053439488,2053505023,KR -2053505024,2053509119,CN -2053509120,2053511167,AU -2053511168,2053513215,IN -2053513216,2053515263,BD -2053515264,2053519359,ID -2053519360,2053521407,JP -2053521408,2053529599,CN -2053529600,2053532671,AU -2053532672,2053533183,NZ -2053533184,2053533695,AU -2053533696,2053534719,VN -2053534720,2053537791,IN -2053537792,2053636095,JP -2053636096,2054160383,AU -2054160384,2054376447,CN -2054376448,2054377471,HK -2054377472,2054422527,CN -2054422528,2054619135,TW -2054619136,2054684671,CN -2054684672,2055208959,TW -2055208960,2055213055,JP -2055213056,2055217151,ID -2055217152,2055229439,KR -2055229440,2055231487,TW -2055231488,2055233535,AU -2055233536,2055234047,JP -2055234048,2055234559,HK -2055234560,2055235583,CN -2055235584,2055237631,HK -2055237632,2055239679,JP -2055239680,2055241727,CN -2055241728,2055274495,KR -2055274496,2055290879,VN -2055290880,2055299071,PK -2055299072,2055305215,ID -2055305216,2055307263,MY -2055307264,2055315455,AU -2055315456,2055323647,JP -2055323648,2055327743,ID -2055327744,2055329791,KR -2055329792,2055331839,AU -2055331840,2055335935,JP -2055335936,2055340031,KR -2055340032,2055733247,JP -2055733248,2056257535,CN -2056257536,2056259583,ID -2056259584,2056261631,BD -2056261632,2056263679,IN -2056263680,2056265727,TH -2056265728,2056273919,TW -2056273920,2056290303,PH -2056290304,2056323071,CN -2056323072,2056388607,JP -2056388608,2056519679,TW -2056519680,2056781823,AU -2056781824,2056794111,JP -2056794112,2056796159,BD -2056796160,2056806399,JP -2056806400,2056814591,KR -2056814592,2056815215,JP -2056815216,2056815231,HK -2056815232,2056816863,JP -2056816864,2056816895,MY -2056816896,2056817335,JP -2056817336,2056817343,HK -2056817344,2056817727,JP -2056817728,2056817791,AU -2056817792,2056819087,JP -2056819088,2056819103,SG -2056819104,2056823849,JP -2056823850,2056823850,SG -2056823851,2056824831,JP -2056824832,2056824847,AU -2056824848,2056830975,JP -2056830976,2056847359,CN -2056847360,2056912895,KR -2056912896,2057043967,TH -2057043968,2057306111,CN -2057306112,2059141119,IN -2059141120,2059665407,CN -2059665408,2059796479,JP -2059796480,2059862015,CN -2059862016,2059878399,AU -2059878400,2059927551,KR -2059927552,2059931647,ID -2059931648,2059933695,IN -2059933696,2059935743,AU -2059935744,2059937791,JP -2059937792,2059939839,CN -2059939840,2059941887,ID -2059941888,2059943935,AU -2059943936,2059960319,CN -2059960320,2059961343,JP -2059961344,2059962367,HK -2059962368,2059964415,JP -2059964416,2059966463,ID -2059966464,2059968511,TW -2059968512,2059976703,AU -2059976704,2059990899,JP -2059990900,2059990900,PH -2059990901,2059995135,JP -2059995136,2059997183,VN -2059997184,2060001279,MN -2060001280,2060002559,HK -2060002560,2060002815,ID -2060002816,2060004399,HK -2060004400,2060004415,AF -2060004416,2060005375,HK -2060005376,2060009471,CN -2060009472,2060025855,AU -2060025856,2060058623,TW -2060058624,2060062719,AU -2060062720,2060066815,JP -2060066816,2060075007,KR -2060075008,2060083199,AU -2060083200,2060091391,JP -2060091392,2060189695,KR -2060189696,2060451839,CN -2060451840,2061500415,JP -2061500416,2063073279,CN -2063073280,2063077375,BD -2063077376,2063079423,HK -2063079424,2063081471,CN -2063081472,2063085567,ID -2063085568,2063089663,CN -2063089664,2063097855,JP -2063097856,2063106047,MM -2063106048,2063106559,SG -2063106560,2063107071,AU -2063107072,2063107655,SG -2063107656,2063107663,HK -2063107664,2063108095,SG -2063108096,2063110143,HK -2063110144,2063111167,JP -2063111168,2063114239,AU -2063114240,2063115263,IN -2063115264,2063116871,JP -2063116872,2063116879,KR -2063116880,2063118159,JP -2063118160,2063118191,PH -2063118192,2063118287,JP -2063118288,2063118303,PH -2063118304,2063118335,JP -2063118336,2063118591,IN -2063118592,2063120383,JP -2063120384,2063120863,AU -2063120864,2063120895,TW -2063120896,2063121407,AU -2063121408,2063122331,JP -2063122332,2063122335,IN -2063122336,2063122431,JP -2063122432,2063138815,SG -2063138816,2063335423,JP -2063335424,2063341567,AU -2063341568,2063343615,SG -2063343616,2063351807,US -2063351808,2063368191,KR -2063368192,2063370239,US -2063370240,2063372287,JP -2063372288,2063374335,AU -2063374336,2063376383,NZ -2063376384,2063380479,TW -2063380480,2063382527,KH -2063382528,2063384575,NZ -2063384576,2063392767,KR -2063392768,2063400959,IN -2063400960,2063466495,JP -2063466496,2063482879,TW -2063482880,2063483135,MN -2063483136,2063483391,JP -2063483392,2063484927,MN -2063484928,2063485183,JP -2063485184,2063485695,MN -2063485696,2063485951,JP -2063485952,2063486975,MN -2063486976,2063487231,JP -2063487232,2063492607,MN -2063492608,2063492863,JP -2063492864,2063494399,MN -2063494400,2063494655,JP -2063494656,2063499263,MN -2063499264,2063532031,KR -2063532032,2063548415,LK -2063548416,2063550463,CN -2063550464,2063551487,IN -2063551488,2063552511,JP -2063552512,2063556607,TW -2063556608,2063564799,MY -2063564800,2063597567,JP -2063597568,2063601663,KR -2063601664,2063605759,BD -2063605760,2063613951,TW -2063613952,2063630335,JP -2063630336,2063646719,CN -2063646720,2063663103,TW -2063663104,2063695871,JP -2063695872,2063728639,HK -2063728640,2063859711,AU -2063859712,2064646143,CN -2064646144,2065694719,VN -2065694720,2066743295,KR -2066743296,2066808831,JP -2066808832,2066825215,BD -2066825216,2066841599,SG -2066841600,2066874367,CN -2066874368,2066882559,JP -2066882560,2066890751,TW -2066890752,2066907135,PF -2066907136,2066915327,AU -2066915328,2066923519,CN -2066923520,2066939903,JP -2066939904,2066972671,AU -2066972672,2067005439,TW -2067005440,2067529727,CN -2067529728,2067595263,HK -2067595264,2067726335,CN -2067726336,2067791871,IN -2067791872,2070052863,CN -2070052864,2070056959,AU -2070056960,2070061055,JP -2070061056,2070077439,KR -2070077440,2070085631,JP -2070085632,2070102015,TW -2070102016,2070118399,KR -2070118400,2070159359,CN -2070159360,2070167551,AU -2070167552,2070183935,NZ -2070183936,2070192127,AU -2070192128,2070200319,KR -2070200320,2070208511,JP -2070208512,2070209279,MY -2070209280,2070209535,SG -2070209536,2070210559,AU -2070210560,2070210815,SG -2070210816,2070211071,AU -2070211072,2070216703,SG -2070216704,2070282239,CN -2070282240,2070347775,AU -2070347776,2070380543,CN -2070380544,2070396927,JP -2070396928,2070405119,AU -2070405120,2070409215,JP -2070409216,2070413311,HK -2070413312,2070677503,JP -2070677504,2070679551,ID -2070679552,2070683647,KR -2070683648,2070691839,IN -2070691840,2070692863,ID -2070692864,2070693887,AU -2070693888,2070695935,HK -2070700032,2070702079,ID -2070702080,2070703103,AU -2070703104,2070704127,HK -2070704128,2070708223,PH -2070708224,2070712319,CN -2070712320,2070714367,NZ -2070714368,2070716415,JP -2070716416,2070724607,KR -2070724608,2070726655,JP -2070726656,2070728703,IN -2070728704,2070732799,CN -2070732800,2070734847,IN -2070734848,2070736895,JP -2070736896,2070738943,BD -2070738944,2070740991,KH -2070740992,2070806527,KR -2070806528,2070872063,TW -2070872064,2070937599,KR -2070937600,2072510463,CN -2072510464,2072514559,HK -2072514560,2072516607,IN -2072516608,2072518655,BD -2072518656,2072526847,AU -2072526848,2072528895,SG -2072528896,2072530943,PH -2072530944,2072535039,CN -2072535040,2072543231,MY -2072543232,2072575999,IN -2072576000,2072772607,CN -2072772608,2073034751,KR -2073034752,2075131903,CN -2075131904,2075140095,MV -2075140096,2075144191,IN -2075144192,2075146239,JP -2075146240,2075147263,BD -2075147264,2075148287,CN -2075148288,2075150335,PH -2075150336,2075152383,WS -2075152384,2075156479,CN -2075156480,2075158527,HK -2075158528,2075160575,JP -2075160576,2075162623,AU -2075162624,2075164671,ID -2075164672,2075197439,JP -2075197440,2076180479,CN -2076180480,2076442623,TW -2076442624,2076573695,CN -2076573696,2076639231,JP -2076639232,2076671999,KR -2076672000,2076704767,CN -2076704768,2076712959,BD -2076712960,2076721151,JP -2076721152,2076737535,KR -2076737536,2076770303,AU -2076770304,2076835839,IN -2076835840,2076966911,HK -2076966912,2077097983,TW -2077097984,2077229055,CN -2077229056,2077491199,AU -2077491200,2077753343,KR -2077753344,2078539775,JP -2078539776,2078670847,KR -2078670848,2078736383,JP -2078736384,2078769151,LK -2078769152,2078801919,ID -2078801920,2079064063,CN -2079064064,2079326207,IN -2079326208,2079457279,TW -2079457280,2079490047,CN -2079490048,2079506431,TH -2079506432,2079508479,CN -2079508480,2079510527,PH -2079510528,2079514623,JP -2079514624,2079516671,HK -2079516672,2079518719,JP -2079518720,2079522815,IN -2079522816,2079588351,AU -2079588352,2079850495,CN -2079850496,2079916031,KR -2079916032,2079981567,CN -2079981568,2080112639,KR -2080112640,2080145407,TW -2080145408,2080178175,IN -2080243712,2080260095,JP -2080260096,2080268287,KR -2080268288,2080270335,CN -2080270336,2080272383,HK -2080272384,2080276479,AU -2080276480,2080309247,KR -2080309248,2080325631,NZ -2080325632,2080342015,HK -2080342016,2080360447,JP -2080360448,2080362495,ID -2080362496,2080366591,AU -2080366592,2080368639,TW -2080368640,2080372735,JP -2080372736,2080374783,IN -2080374784,2080636927,KR -2080636928,2080702463,IN -2080702464,2080767999,KR -2080768000,2080776191,TW -2080776192,2080777215,HK -2080777216,2080777471,GB -2080777472,2080777727,FR -2080777728,2080777983,NL -2080777984,2080778239,GB -2080778240,2080780287,US -2080780288,2080780799,ID -2080780800,2080781311,MY -2080781312,2080781823,JP -2080781824,2080784383,SG -2080784384,2080800767,CN -2080800768,2080817151,PH -2080817152,2080825343,NZ -2080825344,2080829439,BD -2080829440,2080833535,LK -2080833536,2080899071,IN -2080899072,2081226751,TW -2081226752,2081292287,MY -2081292288,2081554431,CN -2081554432,2081619967,JP -2081619968,2081652735,AU -2081652736,2081685503,PH -2081685504,2081947647,CN -2081947648,2082209791,JP -2082209792,2082258943,KR -2082258944,2082308095,CN -2082308096,2082324479,TW -2082324480,2082340863,PK -2082340864,2082406399,IN -2082406400,2082471935,CN -2082471936,2083024895,JP -2083024896,2083053567,CN -2083053568,2083057663,TH -2083057664,2083058687,CN -2083058688,2083059711,IN -2083059712,2083061759,ID -2083061760,2083110911,JP -2083110912,2083127295,NP -2083127296,2083192831,CN -2083192832,2083258367,LK -2083258368,2083389439,JP -2083389440,2083454975,KR -2083454976,2083471359,CN -2083471360,2083487743,JP -2083487744,2083491583,AU -2083491584,2083491839,US -2083491840,2083492863,AU -2083492864,2083493375,US -2083493376,2083504127,AU -2083504128,2083520511,JP -2083520512,2083966719,KR -2083966720,2083966975,JP -2083966976,2084569087,KR -2084569088,2084732927,CN -2084732928,2084741119,SG -2084741120,2084743167,ID -2084743168,2084745215,IN -2084745216,2084749311,KR -2084749312,2084753407,JP -2084753408,2084757503,KR -2084757504,2084765695,JP -2084765696,2085617663,CN -2085617664,2085683199,KR -2085683200,2085748735,ID -2085748736,2085814271,MY -2085814272,2085847039,PH -2085847040,2086141951,JP -2086141952,2086666239,CN -2086666240,2087190527,JP -2087190528,2087452671,PH -2087452672,2087453695,AU -2087453696,2087454719,KH -2087454720,2087456767,CN -2087456768,2087457791,IN -2087457792,2087458815,HK -2087458816,2087460863,FJ -2087460864,2087462911,JP -2087462912,2087464959,CN -2087464960,2087467007,KH -2087467008,2087471103,JP -2087471104,2087472127,SG -2087472128,2087472639,HK -2087472640,2087473151,SG -2087473152,2087474687,HK -2087474688,2087475199,JP -2087475200,2087476223,HK -2087476224,2087477247,TW -2087477248,2087477855,AU -2087477856,2087477887,NZ -2087477888,2087478271,AU -2087478272,2087485439,HK -2087485440,2087501823,TW -2087501824,2087518207,JP -2087518208,2087519231,TH -2087519232,2087520255,SG -2087520256,2087522303,FM -2087522304,2087523327,KH -2087523328,2087524351,ID -2087524352,2087526399,TH -2087526400,2087534591,PK -2087534592,2087542783,AU -2087542784,2087544831,CN -2087544832,2087545855,BD -2087545856,2087546879,JP -2087546880,2087550975,TW -2087550976,2087649279,JP -2087649280,2087714815,KR -2087714816,2088239103,CN -2088239104,2088435711,TH -2088435712,2088632319,IN -2088632320,2089287679,CN -2089287680,2089549823,KR -2089549824,2089943039,JP -2089943040,2089959423,KR -2089959424,2090041343,JP -2090041344,2090074111,CN -2090074112,2090237951,AU -2090237952,2090239999,TW -2090240256,2090240511,CN -2090240512,2090240767,AU -2090240768,2090241023,NZ -2090241024,2090242047,MY -2090242048,2090246143,JP -2090246144,2090250239,NZ -2090250240,2090270719,JP -2090270720,2090401791,CN -2090401792,2090418175,ID -2090418176,2090434559,IN -2090434560,2090467327,KR -2090467328,2090565631,JP -2090565632,2090582015,TW -2090582016,2090590207,SG -2090590208,2090594303,NZ -2090594304,2090598399,IN -2090598400,2090663935,CN -2090663936,2090680319,VN -2090680320,2090696703,NZ -2090696704,2090729471,TH -2090729472,2090733567,VN -2090733568,2090736639,AU -2090736640,2090737663,IN -2090737664,2090745855,PH -2090745856,2090762239,MN -2090762240,2090778623,ID -2090778624,2090786815,HK -2090786816,2090795007,MY -2090795008,2090860543,JP -2090860544,2091384831,CN -2091384832,2091646975,AU -2091646976,2091909119,CN -2091909120,2092957695,AU -2092957696,2093088767,CN -2093088768,2093154303,KR -2093154304,2093187071,ID -2093187072,2093191167,MY -2093191168,2093195263,JP -2093195264,2093203455,KR -2093203456,2093211647,MV -2093211648,2093219839,KR -2093219840,2093285375,CN -2093285376,2093301759,NZ -2093301760,2093318143,SG -2093318144,2093342719,KR -2093342720,2093350911,MY -2093350912,2093383679,KR -2093383680,2093416447,NZ -2093416448,2093432831,KR -2093432832,2093445119,TW -2093445120,2093449215,AF -2093449216,2093481983,KR -2093481984,2094006271,CN -2094006272,2094530559,JP -2094530560,2094596095,KR -2094596096,2094628863,PH -2094628864,2094645247,HK -2094645248,2094653439,KR -2094653440,2094656767,MY -2094656768,2094657535,SG -2094657536,2094661631,MY -2094661632,2094759935,TW -2094759936,2094792703,JP -2094792704,2096152575,CN -2096152576,2096160767,PG -2096160768,2096234495,JP -2096234496,2096300031,CN -2096300032,2096332799,KR -2096332800,2096349183,AU -2096349184,2096365567,CN -2096365568,2096431103,HK -2096431104,2096496639,JP -2096496640,2096513023,AU -2096513024,2096529407,SG -2096529408,2096611327,JP -2096611328,2096627711,IN -2096627712,2096660479,CN -2096660480,2096664575,NZ -2096664576,2096668671,JP -2096668672,2096676863,KH -2096676864,2096693247,HK -2096693248,2096889855,CN -2096889856,2096902143,BE -2096902144,2096955391,AU -2096955392,2097020927,IN -2097020928,2097037311,CN -2097037312,2097053695,AU -2097053696,2097086463,KR -2097086464,2097479679,JP -2097479680,2097545215,PH -2097545216,2097610751,JP -2097610752,2097643519,AU -2097643520,2097676287,KR -2097676288,2098200575,JP -2098200576,2098593791,IN -2098593792,2098594303,SG -2098594304,2098724863,IN -2098724864,2098987007,TH -2098987008,2099183615,JP -2099183616,2099199999,MO -2099200000,2099216383,JP -2099216384,2099232767,KR -2099232768,2100297727,CN -2100297728,2100854783,JP -2100854784,2100887551,US -2100887552,2100953087,KR -2100953088,2100969471,VN -2100969472,2100985855,JP -2100985856,2101018623,CN -2101018624,2101084159,HK -2101084160,2101116927,KR -2101116928,2101149695,PH -2101149696,2101182463,KR -2101182464,2101231615,CN -2101231616,2101232639,GB -2101232640,2101233663,HK -2101233664,2101234687,GB -2101234688,2101235711,AU -2101239808,2101270527,IN -2101270528,2101272575,KR -2101272576,2101276671,TW -2101276672,2101280767,JP -2101280768,2101288959,AU -2101288960,2101293055,JP -2101293056,2101297151,AU -2101297152,2101313535,IN -2101313536,2101346303,AU -2101346304,2103640063,CN -2103640064,2103705599,IN -2103705600,2103967743,JP -2103967744,2105540607,CN -2105540608,2107637759,KR -2107637760,2108162047,ID -2108162048,2108218879,AU -2108218880,2108219391,NZ -2108219392,2108227583,AU -2108227584,2108293119,CN -2108293120,2108358655,JP -2108358656,2108424191,CN -2108424192,2108686335,JP -2108686336,2109734911,KR -2109734912,2110783487,JP -2110783488,2110799871,CN -2110799872,2110816255,KR -2110816256,2110832639,ID -2110832640,2110865407,KR -2110865408,2110881791,PK -2110881792,2110898175,AU -2110898176,2110914559,KR -2110914560,2111045631,CN -2111045632,2111078399,PH -2111078400,2111111167,VN -2111111168,2111143935,CN -2111143936,2111152127,ID -2111152128,2111160319,AU -2111160320,2111168511,AF -2111168512,2111176703,TH -2111176704,2111193087,VN -2111193088,2111201279,AU -2111201280,2111209471,CN -2111209472,2111217663,JP -2111217664,2111225855,LK -2111225856,2111242239,HK -2111242240,2111258623,CN -2111258624,2111275007,JP -2111275008,2111307775,HK -2111307776,2111832063,CN -2111832064,2112487423,TW -2112487424,2112618495,VN -2112618496,2112880639,NZ -2112880640,2113560063,KR -2113560064,2113560319,SG -2113560320,2113683455,KR -2113683456,2113684607,JP -2113684608,2113684671,TW -2113684672,2113685663,JP -2113685664,2113685695,SG -2113685696,2113687999,JP -2113688000,2113688031,AU -2113688032,2113688959,JP -2113688960,2113688991,SG -2113688992,2113691135,JP -2113691136,2113691391,SG -2113691392,2113693599,JP -2113693600,2113693615,HK -2113693616,2113693879,JP -2113693880,2113693887,AU -2113693888,2113693951,JP -2113693952,2113694207,HK -2113694208,2113695279,JP -2113695280,2113695287,SG -2113695288,2113716223,JP -2113716224,2113724927,SG -2113724928,2113725183,IN -2113725184,2113728511,SG -2113728512,2113732607,JP -2113732608,2113761279,AU -2113761280,2113765375,VN -2113765376,2113798143,HK -2113798144,2113811455,AU -2113811456,2113812479,GB -2113812480,2113813503,JP -2113813504,2113830911,AU -2113830912,2113863679,CN -2113863680,2113929215,AU -2113929216,2130706431,JP -2147483648,2147483903,NL -2147483904,2147484671,RO -2147484672,2147485695,TR -2147485696,2147487743,DK -2147487744,2147489791,NO -2147489792,2147491839,RU -2147491840,2147494911,DE -2147494912,2147495167,RO -2147495168,2147495423,DE -2147495424,2147496959,RO -2147496960,2147497215,ES -2147497216,2147497471,RO -2147497472,2147497727,PL -2147497728,2147498239,DE -2147498240,2147498495,RO -2147498496,2147500031,DE -2147500032,2147501055,NL -2147501056,2147501311,SK -2147501312,2147501567,NL -2147501568,2147501823,GL -2147501824,2147502079,US -2147502080,2147504127,DK -2147504128,2147508223,RU -2147508224,2147510271,DE -2147510272,2147510783,UA -2147510784,2147511039,RU -2147511040,2147512319,CY -2147512320,2147514879,DE -2147514880,2147516415,IT -2147516416,2147520511,RU -2147520512,2147524607,DE -2147524608,2147526655,RU -2147526656,2147528703,UA -2147528704,2147532799,CZ -2147532800,2147534847,DE -2147534848,2147549183,CY -2147549184,2147557375,US -2147557376,2147557631,TW -2147557632,2147557887,SG -2147557888,2147558143,DE -2147558144,2147558399,TH -2147558400,2147558655,KR -2147558656,2147558911,TW -2147558912,2147559167,SG -2147559168,2147559423,TH -2147559424,2147559679,SG -2147559680,2147559935,US -2147559936,2147560191,DE -2147560192,2147560447,RU -2147560448,2147560703,TH -2147560704,2147560959,TW -2147560960,2147562239,US -2147562240,2147562495,RU -2147562496,2147563263,US -2147563264,2147563519,RU -2147563520,2147564287,US -2147564288,2147564543,AE -2147564544,2147564799,US -2147564800,2147565055,SG -2147565056,2147565311,HK -2147565312,2147566079,TW -2147566080,2147569407,US -2147569408,2147569663,TH -2147569664,2147570431,US -2147570432,2147570687,JP -2147570688,2147571455,US -2147571456,2147571711,SG -2147571712,2147573503,US -2147573504,2147573759,SG -2147573760,2147575039,US -2147575040,2147575551,TW -2147575552,2147575807,SG -2147575808,2147576831,US -2147576832,2147577087,TH -2147577088,2147577599,ID -2147577600,2147579647,US -2147579648,2147579903,ID -2147579904,2147580927,US -2147580928,2147581183,ID -2147581184,2147581439,TH -2147581440,2147592703,US -2147592704,2147592959,HK -2147592960,2147600127,US -2147600128,2147600383,SG -2147600384,2147942399,US -2147942400,2148007935,DE -2148007936,2148220515,US -2148220516,2148220535,AU -2148220536,2148229151,US -2148229152,2148229183,CA -2148229184,2148532223,US -2148532224,2148597759,GB -2148597760,2148925439,US -2148925440,2148990975,JP -2148990976,2149253119,US -2149253120,2149384191,JP -2149384192,2150039551,US -2150039552,2150105087,NO -2150105088,2150203391,GB -2150203392,2150236159,AF -2150236160,2150301695,US -2150301696,2150367231,CA -2150367232,2150432767,US -2150432768,2150498303,IT -2150498304,2150957055,US -2150957056,2151022591,JP -2151022592,2151743487,US -2151743488,2151759871,BY -2151759872,2151768063,US -2151768064,2151770111,GB -2151770112,2151772159,BA -2151772160,2151776255,IT -2151776256,2151778303,AT -2151778304,2151780351,RU -2151780352,2151782399,DE -2151782400,2151784447,ES -2151784448,2151792639,IR -2151792640,2151794687,CH -2151794688,2151796735,IT -2151796736,2151800831,DE -2151800832,2151809023,PT -2151809024,2151940095,IT -2151940096,2152464383,RU -2152464384,2152529919,DK -2152529920,2152562687,NO -2152562688,2152595455,DK -2152595456,2152726527,FR -2152726528,2153119743,US -2153119744,2153185279,GB -2153185280,2153250815,SE -2153250816,2153381887,US -2153381888,2153382143,JP -2153382144,2153383679,US -2153383680,2153383935,HK -2153383936,2153384447,US -2153384448,2153385471,GB -2153385472,2153385599,AT -2153385600,2153385663,CZ -2153385664,2153385727,FI -2153385728,2153385791,PL -2153385792,2153385855,PT -2153385856,2153385919,TR -2153385920,2153385983,US -2153385984,2153387007,GB -2153387008,2153387263,CH -2153387264,2153387519,IS -2153387520,2153387775,IE -2153387776,2153388031,CH -2153388032,2153388287,ES -2153388288,2153388543,PL -2153388544,2153391615,US -2153391616,2153391871,HK -2153391872,2153394431,US -2153394432,2153394943,SG -2153394944,2153395455,US -2153395456,2153395711,VN -2153395712,2153396991,US -2153396992,2153397247,IL -2153397248,2153397503,IN -2153397504,2153397759,SA -2153397760,2153398015,QA -2153398016,2153398271,BH -2153398272,2153398783,JP -2153398784,2153399551,US -2153399552,2153399807,KR -2153399808,2153400319,HK -2153400320,2153401087,TW -2153401088,2153401599,MO -2153401600,2153402111,VN -2153402112,2153402367,PH -2153402368,2153406463,US -2153406464,2153407487,JP -2153407488,2153407743,HK -2153407744,2153407999,AE -2153408000,2153408511,BR -2153408512,2153408767,AU -2153408768,2153409023,PA -2153409024,2153409279,AR -2153409280,2153409535,CR -2153409536,2153409791,CO -2153409792,2153410047,MX -2153410048,2153410303,CA -2153410304,2153410559,TW -2153410560,2153410815,PA -2153410816,2153411071,AR -2153411072,2153411327,CR -2153411328,2153411583,CO -2153411584,2153411839,MX -2153411840,2153412095,SV -2153412096,2153412351,TW -2153412352,2153412607,UY -2153412608,2153413119,AU -2153413120,2153413631,BR -2153413632,2153578495,US -2153578496,2153644031,FR -2153644032,2153906175,US -2153906176,2153971711,GB -2153971712,2154037247,US -2154037248,2154102783,CA -2154102784,2154430463,US -2154430464,2154495999,SG -2154496000,2154561535,US -2154561536,2154627071,CN -2154627072,2155610111,US -2155610112,2155675647,UA -2155675648,2155806719,US -2155806720,2155808767,IT -2155810816,2155812863,FR -2155812864,2155814911,GB -2155814912,2155819007,NL -2155819008,2155821055,DE -2155821056,2155823103,IT -2155823104,2155825151,DE -2155825152,2155827199,AE -2155827200,2155831295,PL -2155831296,2155833343,RU -2155833344,2155833855,SE -2155833856,2155834623,NL -2155834624,2155834879,LU -2155834880,2155835391,NL -2155835392,2155839487,RO -2155839488,2155843583,FR -2155843584,2155845631,RU -2155845632,2155847679,DE -2155847680,2155849727,ES -2155849728,2155851775,TR -2155853824,2155855871,SE -2155855872,2155872255,SA -2155872256,2156003327,US -2156003328,2156134399,AT -2156134400,2156265471,US -2156265472,2156331007,KR -2156331008,2156593151,US -2156593152,2156658687,IL -2156658688,2156691455,IR -2156691456,2156697599,FR -2156697600,2156699647,GR -2156699648,2156703743,RU -2156703744,2156707839,BG -2156707840,2156709887,RU -2156709888,2156711935,ES -2156711936,2156713983,DE -2156713984,2156716031,NL -2156716032,2156718079,RO -2156718080,2156720127,IS -2156720128,2156724223,BY -2156724224,2156855295,CH -2156855296,2156920831,US -2156920832,2156986367,CA -2156986368,2159017983,US -2159017984,2159083519,DE -2159083520,2159149055,US -2159149056,2159280127,CH -2159280128,2159542271,US -2159542272,2159607807,AU -2159607808,2159673343,IN -2159673344,2159869951,US -2159869952,2159935487,CA -2159935488,2160525311,US -2160525312,2160533503,SG -2160533504,2160541695,NL -2160541696,2160590847,SG -2160590848,2160656383,US -2160656384,2160657407,BR -2160657408,2160658431,HN -2160658432,2160661503,BR -2160661504,2160662527,AR -2160662528,2160664575,BR -2160664576,2160666623,CL -2160666624,2160676863,BR -2160676864,2160677887,AR -2160677888,2160678911,BR -2160678912,2160679935,GF -2160679936,2160684031,BR -2160684032,2160685055,AR -2160685056,2160686079,DO -2160686080,2160687103,CL -2160687104,2160690175,BR -2160690176,2160691199,AR -2160691200,2160693247,BR -2160693248,2160694271,CR -2160694272,2160697343,BR -2160697344,2160698367,EC -2160698368,2160699391,BR -2160699392,2160700415,AR -2160700416,2160713727,BR -2160713728,2160714751,CL -2160714752,2160716799,BR -2160716800,2160717823,AR -2160717824,2160721919,BR -2160721920,2160852991,US -2160852992,2160885759,RU -2160885760,2160893951,AT -2160893952,2160902143,RU -2160902144,2160906239,NL -2160906240,2160908287,FR -2160908288,2160910335,PL -2160910336,2160914431,NL -2160914432,2160918527,SA -2160918528,2161508351,US -2161508352,2161573887,FI -2161573888,2162687999,US -2162688000,2162753535,GB -2162753536,2162819071,CA -2162819072,2162884607,SA -2162884608,2163212287,US -2163212288,2163277823,GB -2163277824,2163408895,US -2163408896,2163474431,GB -2163474432,2163605503,US -2163605504,2163638271,DE -2163638272,2163638527,US -2163638528,2163671039,DE -2163671040,2163867647,US -2163867648,2163933183,AU -2163933184,2164260863,US -2164260864,2164326399,CM -2164326400,2164981759,US -2164981760,2165112831,GB -2165112832,2165178367,DE -2165178368,2165309439,US -2165309440,2165374975,SE -2165374976,2165440511,US -2165440512,2165506047,NG -2165506048,2165571583,US -2165571584,2165637119,FR -2165637120,2165964799,US -2165964800,2166030335,DE -2166030336,2166095871,AT -2166095872,2166161407,CN -2166161408,2166292479,US -2166292480,2166358015,GB -2166358016,2166562559,US -2166562560,2166562815,FI -2166562816,2166571007,US -2166571008,2166575103,GB -2166575104,2166594559,US -2166594560,2166594815,PL -2166594816,2166729471,US -2166729472,2166729727,CA -2166729728,2167209983,US -2167209984,2167242751,DZ -2167242752,2167275519,BF -2167275520,2167930879,US -2167930880,2167996415,NG -2167996416,2168193023,US -2168193024,2168258559,JP -2168258560,2168651775,US -2168651776,2168717311,GB -2168717312,2168782847,US -2168782848,2168913919,DE -2168913920,2169372671,US -2169372672,2169438207,AU -2169438208,2170028031,US -2170028032,2170093567,FR -2170093568,2170159103,US -2170159104,2170224639,VE -2170224640,2170421247,US -2170421248,2170486783,AU -2170486784,2170552319,US -2170552320,2170617855,AU -2170617856,2170683391,CA -2170683392,2170814463,US -2170814464,2170879999,CA -2170880000,2170945535,US -2170945536,2171011071,FR -2171011072,2171076607,DE -2171076608,2171142143,FR -2171142144,2172256255,US -2172256256,2172272639,GH -2172272640,2172274687,RE -2172274688,2172275711,FR -2172275712,2172275967,RE -2172275968,2172276735,FR -2172276736,2172289023,RE -2172289024,2172321791,AO -2172321792,2172452863,US -2172452864,2172518399,NL -2172518400,2172583935,SG -2172583936,2172649471,AU -2172649472,2172715007,CA -2172715008,2172780543,CH -2172780544,2172911615,US -2172911616,2172977151,CH -2172977152,2173173759,US -2173173760,2173239295,JP -2173239296,2173435903,US -2173435904,2173501439,MW -2173501440,2173566975,US -2173566976,2173632511,DK -2173632512,2173698047,DE -2173698048,2175336447,US -2175336448,2175401983,GB -2175401984,2175598591,US -2175598592,2175664127,CA -2175664128,2175729663,US -2175729664,2175795199,FR -2175795200,2175860735,US -2175860736,2175926271,NO -2175926272,2175991807,SE -2175991808,2176057343,US -2176057344,2176122879,AU -2176122880,2176425983,FR -2176425984,2176434175,DE -2176434176,2176450559,FR -2176450560,2176516095,US -2176516096,2176581631,DE -2176581632,2176862975,US -2176862976,2176863231,SG -2176863232,2176868607,US -2176868608,2176868863,IT -2176868864,2176897023,US -2176897024,2176897535,AU -2176897536,2176974847,US -2176974848,2177105919,CH -2177105920,2177302527,US -2177302528,2177368063,FR -2177368064,2177695743,US -2177695744,2177703935,UG -2177703936,2177720319,ZA -2177720320,2177728511,NG -2177728512,2177744895,ZA -2177744896,2177761279,BW -2177761280,2177826815,DE -2177826816,2177892351,US -2177892352,2177957887,SA -2177957888,2178285567,US -2178285568,2178351103,DE -2178351104,2178416639,GB -2178416640,2178482175,US -2178482176,2178547711,DE -2178547712,2179398399,US -2179398400,2179398655,GB -2179398656,2179465215,US -2179465216,2179497983,LS -2179497984,2179530751,ZA -2179530752,2179596287,DE -2179596288,2179661823,GB -2179661824,2179989503,US -2179989504,2180186111,NO -2180186112,2180448255,US -2180448256,2180513791,DE -2180513792,2180579327,US -2180579328,2180644863,JP -2180644864,2180645417,US -2180645418,2180645418,ES -2180645419,2180645769,US -2180645770,2180645770,DE -2180645771,2180645991,US -2180645992,2180645992,ES -2180645993,2180646024,US -2180646025,2180646025,GB -2180646026,2180646616,US -2180646617,2180646617,DE -2180646618,2180646952,US -2180646953,2180646953,ES -2180646954,2180649005,US -2180649006,2180649006,ES -2180649007,2180907007,US -2180907008,2180972543,KR -2180972544,2181038079,US -2181038080,2181040127,GB -2181040128,2181042175,AZ -2181042176,2181044223,DE -2181044224,2181046271,AL -2181046272,2181054463,UA -2181054464,2181056511,AT -2181056512,2181058559,DE -2181058560,2181060607,GB -2181060608,2181062655,BA -2181062656,2181070847,FR -2181070848,2181087231,IT -2181087232,2181089279,FR -2181089280,2181091327,SE -2181091328,2181093375,IT -2181093376,2181095423,RU -2181095424,2181097471,GB -2181097472,2181099519,UA -2181099520,2181103615,SY -2181103616,2181824511,US -2181824512,2181890047,CA -2181890048,2182021119,US -2182021120,2182086655,CA -2182086656,2182610943,US -2182610944,2182676479,GB -2182676480,2182742015,IT -2182742016,2182807551,IN -2182807552,2182873087,US -2182873088,2182938623,SE -2182938624,2183135231,US -2183135232,2183200767,GB -2183200768,2183266303,US -2183266304,2183331839,JP -2183331840,2183416575,US -2183416576,2183416831,GB -2183416832,2183462911,US -2183462912,2183528447,NL -2183528448,2183856127,US -2183856128,2183888895,GR -2183888896,2183905279,GB -2183905280,2183921663,HU -2183921664,2184577023,US -2184577024,2184642559,JP -2184642560,2184708095,US -2184708096,2184773631,AU -2184773632,2184803839,US -2184803840,2184804351,GB -2184804352,2184904703,US -2184904704,2185035775,CH -2185035776,2185166847,US -2185166848,2185232383,CA -2185232384,2185363455,US -2185363456,2185428991,FR -2185428992,2185494527,NO -2185494528,2185560063,US -2185560064,2185625599,JP -2185625600,2185822207,US -2185822208,2185887743,DE -2185887744,2185953279,US -2185953280,2186018815,DE -2186018816,2186149887,US -2186149888,2186215423,NL -2186215424,2186280959,FR -2186280960,2186412031,US -2186412032,2186477567,CH -2186477568,2186543103,DE -2186543104,2186608639,FR -2186608640,2186739711,US -2186739712,2186805247,JP -2186805248,2186870783,GB -2186870784,2186936319,NL -2186936320,2187067391,US -2187067392,2187132927,CH -2187132928,2187182079,FR -2187182080,2187198463,HU -2187198464,2187263999,US -2187264000,2187329535,AU -2187329536,2187331583,US -2187331584,2187332607,CA -2187332608,2187333631,US -2187333632,2187334143,DE -2187334144,2187334655,US -2187334656,2187335167,CA -2187335168,2187460607,US -2187460608,2187526143,FR -2187526144,2187591679,US -2187591680,2187657215,SE -2187657216,2187722751,US -2187722752,2187788287,AU -2187788288,2187853823,US -2187853824,2187919359,BE -2187919360,2187984895,PH -2187984896,2188378111,US -2188378112,2188443647,NL -2188443648,2188509183,CA -2188509184,2188574719,US -2188574720,2188640255,NL -2188640256,2188705791,AU -2188706154,2188706154,SI -2188717312,2188717567,FR -2188718162,2188718162,SI -2188718338,2188718338,AT -2188718474,2188718474,AT -2188719360,2188719615,NL -2188719616,2188719743,FR -2188719744,2188719871,DE -2188724464,2188724464,NL -2188736512,2188737535,GB -2188738307,2188738307,GB -2188738560,2188746751,GB -2188749568,2188749823,FR -2188754688,2188754943,BE -2188763136,2188769471,IT -2188769472,2188769503,DE -2188769504,2188769599,IT -2188769600,2188769631,DE -2188769632,2188769663,IT -2188769664,2188770175,DE -2188770176,2188771327,IT -2188771328,2188901753,US -2188901754,2188901754,GB -2188901755,2188902399,US -2188902400,2188967935,FR -2188967936,2189099007,US -2189099008,2189164543,NZ -2189164544,2189230079,US -2189230080,2189295615,CH -2189295616,2189557759,US -2189557760,2189623295,AU -2189623296,2189754367,US -2189754368,2189819903,DE -2189819904,2189950975,US -2189950976,2190016511,IT -2190016512,2190082047,US -2190082048,2190737407,NL -2190737408,2190802943,GB -2190802944,2190868479,DE -2190868480,2191065087,US -2191065088,2191130623,JP -2191130624,2191196159,US -2191196160,2191261695,AU -2191261696,2191392767,US -2191392768,2191458303,JP -2191458304,2191523839,GB -2191523840,2191589375,US -2191589376,2191654911,NL -2191654912,2192769023,US -2192769024,2192834559,CA -2192834560,2192867327,DE -2192867328,2192883711,SY -2192883712,2192885759,PL -2192885760,2192887807,GB -2192887808,2192891903,UA -2192891904,2192900095,RS -2192900096,2193031167,US -2193031168,2193096703,DE -2193096704,2193162239,US -2193162240,2193178623,UA -2193178624,2193180671,GB -2193180672,2193182719,IR -2193182720,2193184767,PT -2193184768,2193186815,ES -2193186816,2193188863,PL -2193188864,2193189119,DE -2193189120,2193189247,CZ -2193189248,2193189375,DE -2193189376,2193189631,CZ -2193189632,2193189919,DE -2193189920,2193189935,GB -2193189936,2193189951,DE -2193189952,2193189983,IT -2193189984,2193190015,DE -2193190016,2193190079,CZ -2193190080,2193190911,DE -2193195008,2193199103,DK -2193199104,2193201151,GB -2193201152,2193202687,SE -2193202688,2193202943,FI -2193202944,2193203199,SE -2193203200,2193205247,GB -2193205248,2193205759,FR -2193205760,2193206015,US -2193206016,2193206271,FR -2193206272,2193207295,MX -2193207296,2193208831,CZ -2193208832,2193209343,US -2193209344,2193211391,FR -2193211392,2193223423,BG -2193223424,2193223679,GB -2193223680,2193226495,BG -2193226496,2193226751,GB -2193226752,2193227775,BG -2193227776,2193293311,IT -2193293312,2193358847,US -2193358848,2193424383,FI -2193424384,2193489919,US -2193489920,2193555455,FR -2193555456,2193620991,US -2193620992,2193686527,IT -2193686528,2193688575,FR -2193688576,2193692671,CZ -2193692672,2193694719,FR -2193694720,2193704959,RU -2193704960,2193707007,IT -2193707008,2193707495,GB -2193707496,2193707503,IT -2193707504,2193707655,GB -2193707656,2193707663,IT -2193707664,2193707839,GB -2193707840,2193707847,IT -2193707848,2193708375,GB -2193708376,2193708383,IT -2193708384,2193709199,GB -2193709200,2193709215,IT -2193709216,2193711103,GB -2193711104,2193713151,DE -2193713152,2193715199,ES -2193715200,2193717247,DE -2193717248,2193719295,AM -2193719296,2193752063,IQ -2193752064,2193817599,AU -2193817600,2193883135,NZ -2193883136,2194031007,US -2194031008,2194031023,JP -2194031024,2194033887,US -2194033888,2194033903,CN -2194033904,2194407423,US -2194407424,2194472959,BG -2194472960,2194538495,US -2194538496,2194604031,ES -2194604032,2194669567,US -2194669568,2194735103,IS -2194735104,2194800639,GB -2194800640,2194879034,US -2194879035,2194879035,BE -2194879036,2194880213,US -2194880214,2194880214,BE -2194880215,2194888509,US -2194888510,2194888510,IE -2194888511,2194891198,US -2194891199,2194891199,BE -2194891200,2195095551,US -2195095552,2195128319,DE -2195128320,2195193855,US -2195193856,2195324927,NZ -2195324928,2195455999,US -2195456000,2195521535,AU -2195521536,2195652607,US -2195652608,2195718143,CH -2195718144,2195783679,US -2195783680,2196045823,DK -2196045824,2196111359,SE -2196111360,2196439039,FI -2196439040,2197094399,SE -2197094400,2197159935,US -2197159936,2197225471,GB -2197225472,2197487615,US -2197487616,2197553151,IT -2197553152,2197749759,US -2197749760,2197751807,IQ -2197751808,2197753855,RU -2197753856,2197754879,GB -2197754880,2197755135,DK -2197755136,2197756159,GB -2197756160,2197756175,PT -2197756176,2197757951,GB -2197757952,2197766143,RU -2197766144,2197768191,PS -2197768192,2197770239,DE -2197770240,2197772287,RU -2197772288,2197774335,IQ -2197774336,2197776383,IT -2197776384,2197778431,DE -2197778432,2197780479,IT -2197780480,2197782527,DE -2197782528,2197786623,UA -2197786624,2197788671,IT -2197788672,2197790719,PL -2197790720,2197792767,SE -2197792768,2197794815,IT -2197794816,2197796863,SA -2197796864,2197798911,DE -2197798912,2197815295,IR -2197815296,2197816319,BO -2197816320,2197828607,BR -2197828608,2197829631,CL -2197829632,2197833727,BR -2197833728,2197834751,CR -2197834752,2197841919,BR -2197841920,2197842943,AR -2197842944,2197843967,CL -2197843968,2197847039,BR -2197847040,2197848063,MX -2197848064,2197849087,AR -2197849088,2197850111,BR -2197850112,2197851135,CO -2197851136,2197858303,BR -2197858304,2197858431,CO -2197858432,2197858447,CW -2197858448,2197859327,CO -2197859328,2197860351,CL -2197860352,2197865471,BR -2197865472,2197866495,ES -2197866496,2197869567,BR -2197869568,2197870591,UY -2197870592,2197874687,BR -2197874688,2197875711,AR -2197875712,2197876735,MX -2197876736,2197880831,BR -2197880832,2197946367,IT -2197946368,2202533887,US -2202533888,2202534911,AR -2202534912,2202540031,BR -2202540032,2202541055,PY -2202541056,2202542079,AR -2202542080,2202552319,BR -2202552320,2202553343,AR -2202553344,2202554367,TT -2202554368,2202562559,BR -2202562560,2202563583,CW -2202563584,2202567679,BR -2202567680,2202568703,AR -2202568704,2202569727,NL -2202569728,2202573823,BR -2202573824,2202574847,AR -2202574848,2202576895,BR -2202576896,2202577919,VE -2202577920,2202586111,BR -2202586112,2202587135,AR -2202587136,2202587231,HN -2202587232,2202587239,NL -2202587240,2202587647,HN -2202587648,2202587903,US -2202587904,2202588159,HN -2202588160,2202589183,MX -2202589184,2202591231,BR -2202591232,2202592255,PA -2202592256,2202593279,MX -2202593280,2202595327,CL -2202595328,2202596351,AR -2202596352,2202599423,BR -2202599424,2204172287,US -2204172288,2204237823,SE -2204237824,2204303359,US -2204303360,2204368895,DE -2204368896,2204369407,PA -2204369408,2204369663,US -2204369664,2204369919,PA -2204370944,2204376063,BR -2204376064,2204377087,CL -2204377088,2204378111,BR -2204378112,2204379135,TT -2204379136,2204385279,BR -2204385280,2204386303,AR -2204386304,2204391423,BR -2204391424,2204392447,AR -2204392448,2204394495,BR -2204394496,2204395519,AR -2204395520,2204396543,BR -2204396544,2204397567,AR -2204397568,2204404735,BR -2204404736,2204405759,SV -2204405760,2204409855,BR -2204409856,2204410879,TT -2204410880,2204414975,BR -2204414976,2204415999,AR -2204416000,2204417023,PY -2204417024,2204420095,BR -2204420096,2204421119,BO -2204421120,2204434431,BR -2204434432,2204499967,US -2204499968,2204565503,CH -2204565504,2204631039,US -2204631040,2204696575,CA -2204696576,2204893183,US -2204893184,2204894207,AR -2204894208,2204895231,PA -2204895232,2204897279,BR -2204897280,2204897447,HN -2204897448,2204897455,CA -2204897456,2204898095,HN -2204898096,2204898111,CR -2204898112,2204898303,HN -2204898304,2204899327,PA -2204899328,2204902399,BR -2204902400,2204903423,CR -2204903424,2204904447,AR -2204904448,2204910591,BR -2204910592,2204911615,CL -2204911616,2204913663,BR -2204913664,2204914687,AR -2204914688,2204929023,BR -2204929024,2204930047,AR -2204930048,2204936191,BR -2204936192,2204937215,CO -2204937216,2204942335,BR -2204942336,2204943359,PY -2204943360,2204946431,BR -2204946432,2204947455,CL -2204947456,2204952575,BR -2204952576,2204952767,HN -2204952768,2204952775,US -2204952776,2204953599,HN -2204954624,2204958719,BR -2204958720,2205089791,US -2205089792,2205155327,GB -2205155328,2205286399,JP -2205286400,2205351935,IT -2205351936,2205483007,SE -2205483008,2205515775,CH -2205515776,2205519871,AZ -2205519872,2205523967,DE -2205523968,2205526015,YE -2205526016,2205528063,GB -2205528064,2205530111,SE -2205530112,2205532159,GB -2205532160,2205534207,CZ -2205534208,2205536255,FR -2205536256,2205538303,CZ -2205538304,2205540351,RU -2205540352,2205548543,IQ -2205548544,2206269439,US -2206269440,2206334975,JP -2206334976,2206400511,AT -2206400512,2206466047,US -2206466048,2207121407,CA -2207121408,2207449087,US -2207449088,2207514623,JP -2207514624,2207647487,CA -2207647488,2207647743,US -2207647744,2207648511,CA -2207648512,2207649791,US -2207649792,2207653631,CA -2207653632,2207653887,US -2207653888,2207659775,CA -2207659776,2207660031,US -2207660032,2207661567,CA -2207661568,2207661823,US -2207661824,2207666175,CA -2207666176,2207667199,US -2207667200,2207678975,CA -2207678976,2207679487,US -2207679488,2207682559,CA -2207682560,2207686655,US -2207686656,2207694335,CA -2207694336,2207694591,US -2207694592,2207711231,CA -2207711232,2207776767,US -2207776768,2207842303,CH -2207842304,2207846399,US -2207846400,2207848447,NL -2207848448,2207852543,US -2207852544,2207853055,RS -2207853056,2207854079,US -2207854080,2207855615,SG -2207855616,2207907839,US -2207907840,2207973375,IT -2207973376,2208038911,NL -2208038912,2208235519,US -2208235520,2208301055,DE -2208301056,2208366591,FI -2208366592,2208368639,BR -2208368640,2208369663,HK -2208369664,2208379903,BR -2208379904,2208380927,HN -2208380928,2208381951,CL -2208381952,2208387071,BR -2208387072,2208388095,HN -2208388096,2208389119,SX -2208389120,2208390143,AR -2208390144,2208392191,BR -2208392192,2208393215,PE -2208393216,2208404479,BR -2208404480,2208405503,BZ -2208405504,2208406527,AR -2208406528,2208413695,BR -2208413696,2208414719,AR -2208414720,2208417791,BR -2208417792,2208418815,CL -2208418816,2208425983,BR -2208425984,2208428031,AR -2208428032,2208429055,BR -2208429056,2208430079,MX -2208430080,2208431103,BR -2208431104,2208432127,PY -2208432128,2208563199,CA -2208563200,2208694271,DK -2208694272,2208759807,LU -2208759808,2208890879,US -2208890880,2208956415,DE -2208956416,2209021951,AU -2209021952,2209087487,US -2209087488,2209153023,AU -2209153024,2209218559,DE -2209218560,2209284095,NL -2209284096,2209349632,IT -2209349633,2209415167,US -2209415168,2209480703,FI -2209480704,2209546239,MX -2209546240,2209611775,US -2209611776,2209677311,NL -2209677312,2209742847,AU -2209742848,2209939455,US -2209939456,2210004991,AU -2210004992,2210136063,US -2210136064,2210201599,DE -2210201600,2210594815,US -2210594816,2210660351,CA -2210660352,2210661375,AR -2210661376,2210662399,BR -2210662400,2210664447,EC -2210664448,2210667519,BR -2210667520,2210668543,CL -2210668544,2210669567,CR -2210669568,2210670591,AR -2210670592,2210673663,BR -2210673664,2210674687,HN -2210674688,2210675711,BR -2210675712,2210676735,EC -2210676736,2210678783,BR -2210678784,2210679807,AR -2210679808,2210680831,BR -2210680832,2210681855,AR -2210681856,2210689023,BR -2210689024,2210690047,EC -2210690048,2210692095,BR -2210692096,2210693119,MX -2210693120,2210696191,BR -2210696192,2210697215,MX -2210697216,2210705407,BR -2210705408,2210706431,CL -2210706432,2210707455,AR -2210707456,2210708479,BR -2210708480,2210709503,AR -2210709504,2210710527,PY -2210710528,2210713599,BR -2210713600,2210715647,CO -2210715648,2210722815,BR -2210722816,2210725887,MX -2210725888,2211053567,US -2211053568,2211119103,CA -2211119104,2211184639,NZ -2211184640,2211250175,US -2211250176,2211315711,SE -2211315712,2211381247,JP -2211381248,2211446783,FI -2211446784,2211643391,US -2211643392,2211708927,NL -2211708928,2211774463,US -2211774464,2211839999,JP -2211840000,2212036607,US -2212036608,2212102143,AU -2212102144,2212233215,US -2212233216,2212298751,DE -2212298752,2212299775,AR -2212299776,2212300799,DO -2212300800,2212301823,HN -2212301824,2212302847,BR -2212302848,2212303871,AR -2212303872,2212304895,BR -2212304896,2212305919,PA -2212305920,2212306943,TT -2212306944,2212307967,CL -2212307968,2212308991,BR -2212308992,2212310015,CO -2212310016,2212315135,BR -2212315136,2212316159,AR -2212316160,2212327423,BR -2212327424,2212328447,VE -2212328448,2212335615,BR -2212335616,2212336639,CW -2212336640,2212337663,BR -2212337664,2212338687,PE -2212338688,2212340735,BR -2212340736,2212341759,CL -2212341760,2212364287,BR -2212364288,2212495359,US -2212495360,2212560895,NL -2212560896,2212691967,US -2212691968,2212757503,GB -2212757504,2212759551,FI -2212759552,2212760575,US -2212760576,2212761599,FI -2212761600,2212762623,GB -2212762624,2212764927,US -2212764928,2212765183,GB -2212765184,2212765695,US -2212765696,2212766719,DE -2212766720,2212767743,GB -2212767744,2212773887,US -2212773888,2212774911,IN -2212774912,2212775423,US -2212775424,2212775935,IN -2212775936,2212779519,US -2212779520,2212780031,FI -2212780032,2212788223,US -2212788224,2212796415,FI -2212796416,2212798463,NL -2212798464,2212804095,FI -2212804096,2212804351,NL -2212804352,2212806655,FI -2212806656,2212808703,US -2212808704,2212810751,FI -2212810752,2212814847,DE -2212814848,2212816383,FI -2212816384,2212816639,SG -2212816640,2212816895,IN -2212816896,2212817151,KR -2212817152,2212823039,FI -2212823040,2212954111,US -2212954112,2213019647,GB -2213019648,2213085183,CA -2213085184,2213150719,US -2213150720,2213216255,DE -2213216256,2213281791,CA -2213281792,2213347327,AU -2213347328,2213412863,NL -2213412864,2213675007,US -2213675008,2213740543,AU -2213740544,2213806079,US -2213806080,2213937151,AU -2213937152,2214002687,DE -2214002688,2214068223,US -2214068224,2214133759,JP -2214133760,2214264831,US -2214264832,2214330367,GB -2214330368,2214398975,US -2214398976,2214398983,CN -2214398984,2214399047,US -2214399048,2214399055,IE -2214399056,2214399071,CN -2214399072,2214399135,SG -2214399136,2214399215,US -2214399216,2214399223,CN -2214399224,2214399295,US -2214399296,2214399303,SG -2214399304,2214399331,US -2214399332,2214399339,HK -2214399340,2214399343,IE -2214399344,2214399887,US -2214399888,2214399903,IE -2214399904,2214404607,US -2214404608,2214404735,SG -2214404736,2214405055,US -2214405056,2214405119,HK -2214405120,2214405375,US -2214405376,2214405631,IE -2214405632,2214405735,US -2214405736,2214405743,IE -2214405744,2214405751,SG -2214405752,2214428671,US -2214428672,2214428927,IN -2214428928,2214429375,US -2214429376,2214429439,NL -2214429440,2214432767,US -2214432768,2214432895,HK -2214432896,2214433023,IE -2214433024,2214433919,US -2214433920,2214434175,CA -2214434176,2214434303,AU -2214434304,2214436863,US -2214436864,2214436991,IN -2214436992,2214438463,US -2214438464,2214438527,IE -2214438528,2214439039,US -2214439040,2214439103,CA -2214439104,2214439167,AU -2214439168,2214441759,US -2214441760,2214441791,IE -2214441792,2214441823,NL -2214441824,2214441983,US -2214441984,2214442047,IN -2214442048,2214453247,US -2214453248,2214453503,NL -2214453504,2214454015,US -2214454016,2214454079,NL -2214454080,2214454271,US -2214454272,2214454335,NL -2214454336,2214455295,US -2214455296,2214456031,NL -2214456032,2214456063,IE -2214456064,2214460415,US -2214460416,2214461439,NL -2214461440,2214526975,FR -2214528000,2214528333,AR -2214528334,2214528334,NL -2214528335,2214529023,AR -2214529024,2214530047,BR -2214530048,2214531071,AR -2214531072,2214537215,BR -2214537216,2214538239,BZ -2214538240,2214542335,BR -2214542336,2214543359,AR -2214543360,2214553599,BR -2214553600,2214554623,VE -2214554624,2214561791,BR -2214561792,2214562815,PE -2214562816,2214573055,BR -2214573056,2214574079,AR -2214574080,2214576127,BR -2214576128,2214577151,PE -2214577152,2214588415,BR -2214589440,2214590463,BR -2214590464,2214591487,AR -2214591488,2214592511,BR -2214592512,2214795597,US -2214795598,2214795599,DE -2214795600,2216231118,US -2216231119,2216231119,DE -2216231120,2218786815,US -2218786816,2219769855,IL -2219769856,2220613631,US -2220613632,2220621823,GU -2220621824,2224160767,US -2224160768,2224226303,GB -2224226304,2224242687,US -2224242688,2224259071,SG -2224259072,2224357375,US -2224357376,2224422911,FR -2224422912,2224488447,NO -2224488448,2224619519,US -2224619520,2224685055,GB -2224685056,2224750591,IN -2224750592,2224816127,FI -2224816128,2224881663,CA -2224881664,2224947199,PE -2224947200,2225340415,US -2225340416,2225733631,FR -2225733632,2225799167,US -2225799168,2225864703,FI -2225864704,2226126847,US -2226126848,2226192383,DE -2226192384,2226323455,US -2226323456,2226388991,JP -2226388992,2226454527,DE -2226454528,2226520063,NZ -2226520064,2226585599,JP -2226585600,2226651135,US -2226651136,2226716671,PE -2226716672,2226782207,GB -2226782208,2226847743,ZA -2226847744,2226913279,DE -2226913280,2227109887,US -2227109888,2227175423,PE -2227175424,2227372031,US -2227372032,2227437567,DE -2227437568,2227503103,SE -2227503104,2227634175,US -2227634176,2227699711,DE -2227699712,2227830783,US -2227830784,2229141503,CA -2229141504,2229207039,JP -2229207040,2229338111,US -2229338112,2229403647,CA -2229403648,2229469183,US -2229469184,2229534719,FR -2229534720,2229600255,US -2229600256,2229665791,NL -2229665792,2229796863,DE -2229796864,2229862399,CN -2229862400,2229927935,US -2229927936,2229993471,AU -2229993472,2230583295,US -2230583296,2230603775,GB -2230603776,2230607871,US -2230607872,2230637567,GB -2230637568,2230638591,SG -2230638592,2230648831,GB -2230648832,2230649695,US -2230649696,2230649727,IE -2230649728,2230653063,US -2230653064,2230653135,BR -2230653136,2230655559,US -2230655560,2230655575,IE -2230655576,2230655583,US -2230655584,2230655711,IE -2230655712,2230655775,US -2230655776,2230655791,IE -2230655792,2230656351,US -2230656352,2230656423,AT -2230656424,2230656431,US -2230656432,2230656495,FI -2230656496,2230656983,US -2230656984,2230656991,IE -2230656992,2230657007,US -2230657008,2230657023,IE -2230657024,2230657215,US -2230657216,2230657231,FI -2230657232,2230657239,US -2230657240,2230657343,FI -2230657344,2230657559,US -2230657560,2230657591,IE -2230657592,2230657599,US -2230657600,2230657727,IE -2230657728,2230657775,US -2230657776,2230657815,FI -2230657816,2230657879,US -2230657880,2230658047,AT -2230658048,2230658143,US -2230658144,2230658159,AT -2230658160,2230658175,IE -2230658176,2230658815,US -2230658816,2230658935,AT -2230658936,2230659199,US -2230659200,2230659327,IE -2230659328,2230659383,US -2230659384,2230659391,SG -2230659392,2230659423,US -2230659424,2230659583,SG -2230659584,2230659783,US -2230659784,2230659791,SG -2230659792,2230659823,US -2230659824,2230659919,SG -2230659920,2230659935,US -2230659936,2230660095,HK -2230660096,2230660215,US -2230660216,2230660223,NL -2230660224,2230660255,US -2230660256,2230660287,NL -2230660288,2230660863,US -2230660864,2230660903,NL -2230660904,2230661135,US -2230661136,2230661151,FI -2230661152,2230661167,AT -2230661168,2230661607,US -2230661608,2230661631,NL -2230661632,2230661695,US -2230661696,2230661759,NL -2230661760,2230661935,US -2230661936,2230662023,IE -2230662024,2230662903,US -2230662904,2230663079,AT -2230663080,2230663167,NL -2230663168,2230663263,US -2230663264,2230663311,IE -2230663312,2230663423,US -2230663424,2230663431,SG -2230663432,2230663607,FI -2230663608,2230663679,SG -2230663680,2230663695,HK -2230663696,2230663743,US -2230663744,2230663751,NL -2230663752,2230664103,US -2230664104,2230664191,IE -2230664192,2230664647,US -2230664648,2230664703,AT -2230664704,2230664727,US -2230664728,2230664735,IE -2230664736,2230664743,US -2230664744,2230664871,IE -2230664872,2230665087,US -2230665088,2230665183,AT -2230665184,2230665295,US -2230665296,2230665359,SG -2230665360,2230665679,US -2230665680,2230665775,SG -2230665776,2230665927,US -2230665928,2230666023,SG -2230666024,2230666031,US -2230666032,2230666063,SG -2230666064,2230666383,US -2230666384,2230666447,NL -2230666448,2230666479,US -2230666480,2230666495,NL -2230666496,2230666559,SG -2230666560,2230666647,NL -2230666648,2230666719,US -2230666720,2230666815,IN -2230666816,2230667527,US -2230667528,2230667583,AT -2230667584,2230667647,JP -2230667648,2230667695,AT -2230667696,2230667871,US -2230667872,2230668047,FI -2230668048,2230668495,US -2230668496,2230668543,FI -2230668544,2230668559,US -2230668560,2230668735,IE -2230668736,2230668799,US -2230668800,2230668927,FI -2230668928,2230669271,US -2230669272,2230669311,NL -2230669312,2230672407,US -2230672408,2230672415,IE -2230672416,2230672431,US -2230672432,2230672575,IE -2230672576,2230681599,US -2230681600,2230682247,HK -2230682248,2230682343,JP -2230682344,2230682351,US -2230682352,2230682543,JP -2230682544,2230685695,US -2230685696,2230685727,AT -2230685728,2230685855,JP -2230685856,2230685871,HK -2230685872,2230688255,US -2230688256,2230688767,SG -2230688768,2230688991,BR -2230688992,2230689039,US -2230689040,2230689071,BR -2230689072,2230689199,US -2230689200,2230689247,BR -2230689248,2230689959,US -2230689960,2230689991,SG -2230689992,2230689999,US -2230690000,2230690007,AU -2230690008,2230690463,US -2230690464,2230690639,AU -2230690640,2230690679,US -2230690680,2230690823,AU -2230690824,2230690831,US -2230690832,2230690863,AU -2230690864,2230690959,US -2230690960,2230690975,AU -2230690976,2230691007,SG -2230691008,2230691039,MY -2230691040,2230691071,AU -2230691072,2230691199,SG -2230691200,2230691215,AU -2230691216,2230693887,US -2230693888,2230693919,NL -2230693920,2230693951,US -2230693952,2230693967,IE -2230693968,2230694063,US -2230694064,2230694095,NL -2230694096,2230698903,US -2230698904,2230698999,FI -2230699000,2230699007,US -2230699008,2230699055,FI -2230699056,2230702079,US -2230702080,2230707199,IE -2230707200,2230707711,NL -2230707712,2230710303,US -2230710304,2230710439,NL -2230710440,2230710511,AT -2230710512,2230710559,US -2230710560,2230710671,JP -2230710672,2230710719,BR -2230710720,2230710735,US -2230710736,2230710751,BR -2230710752,2230710783,KR -2230710784,2230710799,US -2230710800,2230710831,BR -2230710832,2230710847,US -2230710848,2230710879,BR -2230710880,2230710895,US -2230710896,2230711071,IN -2230711072,2230711167,US -2230711168,2230711727,IN -2230711728,2230711903,US -2230711904,2230711935,IE -2230711936,2230712007,US -2230712008,2230712183,BR -2230712184,2230712191,US -2230712192,2230712239,IE -2230712240,2230713135,US -2230713136,2230713311,AT -2230713312,2230713487,NL -2230713488,2230713503,US -2230713504,2230713535,NL -2230713536,2230713647,CA -2230713648,2230713663,US -2230713664,2230713695,HK -2230713696,2230713887,US -2230713888,2230713919,IE -2230713920,2230713935,US -2230713936,2230713983,SG -2230713984,2230714047,KR -2230714048,2230714079,BR -2230714080,2230714119,MY -2230714120,2230714127,US -2230714128,2230714255,MY -2230714256,2230714287,BR -2230714288,2230714303,US -2230714304,2230714311,CL -2230714312,2230714367,BR -2230714368,2230779903,CA -2230779904,2230910975,MX -2230910976,2231042047,US -2231042048,2231099391,PE -2231099392,2231107583,BO -2231107584,2231173119,DE -2231173120,2231238655,US -2231238656,2231304191,MX -2231304192,2231305215,PE -2231305216,2231307263,AR -2231307264,2231309311,BR -2231309312,2231310335,CO -2231310336,2231321599,BR -2231321600,2231322623,CL -2231322624,2231332863,BR -2231332864,2231333887,AR -2231333888,2231335935,BR -2231335936,2231336959,MX -2231337984,2231338639,HN -2231338640,2231338647,US -2231338648,2231338695,HN -2231338696,2231338703,US -2231338704,2231339007,HN -2231339008,2231346175,BR -2231346176,2231347199,PY -2231347200,2231349765,BR -2231349766,2231349766,US -2231349767,2231355391,BR -2231355392,2231356415,AR -2231356416,2231357439,BR -2231357440,2231358463,SV -2231358464,2231361535,BR -2231361536,2231362559,AR -2231362560,2231364607,BR -2231364608,2231365631,CL -2231365632,2231369727,BR -2231369728,2239889407,JP -2239889408,2239890431,US -2239890432,2248146943,JP -2248146944,2248148991,IT -2248148992,2248151039,ES -2248151040,2248153087,GB -2248153088,2248155135,DE -2248155136,2248163327,AL -2248163328,2248163839,US -2248163840,2248165375,GB -2248165376,2248167423,US -2248167424,2248169471,IE -2248169472,2248171519,NL -2248171520,2248177663,RU -2248177664,2248179711,DE -2248179712,2248212479,OM -2248212480,2248409087,DE -2248409088,2248605695,US -2248605696,2248671231,AU -2248671232,2249261055,US -2249261056,2249326591,BY -2249326592,2249392127,AU -2249392128,2249424895,DE -2249424896,2249426943,RU -2249426944,2249428991,SK -2249428992,2249433087,RU -2249433088,2249435135,GB -2249435136,2249437183,IT -2249437184,2249441279,NL -2249441280,2249443327,FR -2249443328,2249445375,TR -2249445376,2249449471,AZ -2249449472,2249457663,GE -2249457664,2249523199,US -2249523200,2249588735,CH -2249588736,2249654271,CA -2249654272,2249724671,US -2249724672,2249724927,CA -2249724928,2249785343,US -2249785344,2249850879,SE -2249850880,2249916415,US -2249916416,2249981951,NL -2249981952,2250047487,DE -2250047488,2250113023,US -2250113024,2250178559,DE -2250178560,2250244095,CA -2250244096,2250282239,US -2250282240,2250282495,GB -2250282496,2250375167,US -2250375168,2250440703,DE -2250440704,2250506239,YE -2250506240,2250571775,GB -2250571776,2250637311,FI -2250637312,2250833919,US -2250833920,2250899455,CA -2250899456,2250956799,US -2250956800,2250957055,HK -2250957056,2250957311,SG -2250957312,2250957567,AU -2250957568,2250957823,JP -2250957824,2251227135,US -2251227136,2251292671,NO -2251292672,2251685887,US -2251685888,2251751423,BE -2251751424,2251948031,US -2251948032,2252013567,BE -2252013568,2252079103,FR -2252079104,2252210175,DE -2252210176,2253062143,US -2253062144,2253127679,KR -2253127680,2253193215,DE -2253193216,2253455359,US -2253455360,2253520895,DE -2253520896,2253586431,US -2253586432,2253651967,GB -2253651968,2253848575,US -2253848576,2253914111,CA -2253914112,2254045183,US -2254045184,2254077951,GE -2254077952,2254079999,BA -2254080000,2254082047,FR -2254082048,2254082559,NO -2254082560,2254082815,NL -2254082816,2254083071,NO -2254083072,2254083327,US -2254083328,2254083583,DK -2254083584,2254084095,NO -2254084096,2254094335,RU -2254094336,2254098431,GB -2254098432,2254100479,RU -2254100480,2254102527,CH -2254102528,2254110719,IT -2254110720,2254774271,DE -2254774272,2254798847,CH -2254798848,2255421439,DE -2255421440,2255683583,US -2255683584,2255749119,AU -2255749120,2255814655,US -2255814656,2255880191,CA -2255880192,2255945727,US -2255945728,2255990783,DE -2255990784,2256003071,FR -2256003072,2256006655,DE -2256006656,2256006911,FR -2256006912,2256011263,DE -2256011264,2256535551,US -2256535552,2256543743,GB -2256543744,2256551935,US -2256551936,2256601087,GB -2256601088,2256666623,US -2256666624,2256732159,DE -2256732160,2256815103,US -2256815104,2256815359,AU -2256815360,2257190911,US -2257190912,2257256447,SE -2257256448,2257453055,US -2257453056,2257518591,GB -2257518592,2257584127,NL -2257584128,2257649663,AU -2257649664,2257717503,NL -2257717504,2257717759,GB -2257717760,2257776639,NL -2257776640,2257776895,IN -2257776896,2257780735,NL -2257780736,2257846271,DE -2257846272,2257911807,AU -2257911808,2257977343,US -2257977344,2258042879,CA -2258042880,2258108415,GB -2258108416,2258173951,US -2258173952,2258239487,CA -2258239488,2258305023,US -2258305024,2258370559,DE -2258370560,2258436095,US -2258436096,2258567167,FR -2258567168,2258568191,AU -2258568192,2258568447,HK -2258568448,2258569215,AU -2258569216,2258570239,US -2258570240,2258571647,AU -2258571648,2258571711,US -2258571712,2258571719,AU -2258571720,2258571735,US -2258571736,2258571743,AU -2258571744,2258571751,US -2258571752,2258571763,AU -2258571764,2258571767,US -2258571768,2258579463,AU -2258579464,2258579467,US -2258579468,2258579967,AU -2258579968,2258580031,US -2258580032,2258582783,AU -2258582784,2258582791,GB -2258582792,2258583551,AU -2258583552,2258589695,GB -2258589696,2258589696,KR -2258589697,2258590975,GB -2258590976,2258591487,AU -2258591488,2258591743,GB -2258591744,2258591935,AU -2258591936,2258591967,HK -2258591968,2258591999,AU -2258592000,2258592255,HK -2258592256,2258592271,AU -2258592272,2258592279,JP -2258592280,2258592287,AU -2258592288,2258592291,JP -2258592292,2258592439,AU -2258592440,2258592447,JP -2258592448,2258592767,AU -2258592768,2258593023,HK -2258593024,2258593087,TW -2258593088,2258593279,AU -2258593280,2258593535,HK -2258593536,2258593983,AU -2258593984,2258593991,NZ -2258593992,2258594047,AU -2258594048,2258594111,HK -2258594112,2258594143,AU -2258594144,2258594175,HK -2258594176,2258594303,AU -2258594304,2258594607,HK -2258594608,2258594623,AU -2258594624,2258594751,HK -2258594752,2258595071,AU -2258595072,2258595087,TW -2258595088,2258595103,AU -2258595104,2258595167,TW -2258595168,2258595231,AU -2258595232,2258595263,TW -2258595264,2258595295,AU -2258595296,2258595327,TW -2258595328,2258595383,AU -2258595384,2258595391,KR -2258595392,2258595887,AU -2258595888,2258595895,NZ -2258595896,2258595967,AU -2258595968,2258595983,TW -2258595984,2258596095,AU -2258596096,2258597071,HK -2258597072,2258597079,TW -2258597080,2258597215,HK -2258597216,2258597263,AU -2258597264,2258597303,HK -2258597304,2258597311,AU -2258597312,2258597367,HK -2258597368,2258597371,AU -2258597372,2258597535,HK -2258597536,2258597567,AU -2258597568,2258597583,HK -2258597584,2258597599,AU -2258597600,2258597631,HK -2258597632,2258597903,AU -2258597904,2258597919,JP -2258597920,2258597927,AU -2258597928,2258597935,JP -2258597936,2258598079,AU -2258598080,2258598087,TW -2258598088,2258598095,AU -2258598096,2258598111,TW -2258598112,2258598143,JP -2258598144,2258598495,AU -2258598496,2258598511,NZ -2258598512,2258598519,AU -2258598520,2258598527,JP -2258598528,2258598623,AU -2258598624,2258598655,TW -2258598656,2258599183,AU -2258599184,2258599187,JP -2258599188,2258599675,AU -2258599676,2258599679,JP -2258599680,2258599935,AU -2258599936,2258599971,HK -2258599972,2258599975,AU -2258599976,2258600447,HK -2258600448,2258600515,AU -2258600516,2258600519,IN -2258600520,2258600523,AU -2258600524,2258600527,IN -2258600528,2258600959,AU -2258600960,2258601087,SG -2258601088,2258601167,AU -2258601168,2258601175,NZ -2258601176,2258601215,AU -2258601216,2258601343,TW -2258601344,2258601471,AU -2258601472,2258601983,JP -2258601984,2258602239,AU -2258602240,2258602495,HK -2258602496,2258602751,AU -2258602752,2258603071,HK -2258603072,2258603087,AU -2258603088,2258603103,HK -2258603104,2258603135,AU -2258603136,2258603139,HK -2258603140,2258603199,AU -2258603200,2258603207,HK -2258603208,2258603775,AU -2258603776,2258603839,HK -2258603840,2258603903,AU -2258603904,2258603943,HK -2258603944,2258603951,AU -2258603952,2258603967,HK -2258603968,2258604031,AU -2258604032,2258604543,HK -2258604544,2258604671,AU -2258604672,2258604735,SG -2258604736,2258604831,AU -2258604832,2258605039,HK -2258605040,2258605047,AU -2258605048,2258605311,HK -2258605312,2258605439,SG -2258605440,2258605567,HK -2258605568,2258606079,AU -2258606080,2258606367,HK -2258606368,2258606415,AU -2258606416,2258606423,HK -2258606424,2258606463,AU -2258606464,2258606471,HK -2258606472,2258606487,AU -2258606488,2258606535,HK -2258606536,2258606963,AU -2258606964,2258606967,NZ -2258606968,2258607091,AU -2258607092,2258607095,NZ -2258607096,2258607351,AU -2258607352,2258607359,NZ -2258607360,2258607615,AU -2258607616,2258607879,HK -2258607880,2258607903,AU -2258607904,2258607999,HK -2258608000,2258608063,AU -2258608064,2258608127,HK -2258608128,2258608183,AU -2258608184,2258608187,TW -2258608188,2258608255,AU -2258608256,2258608259,JP -2258608260,2258608279,AU -2258608280,2258608283,JP -2258608284,2258608383,AU -2258608384,2258608639,HK -2258608640,2258608655,AU -2258608656,2258608663,JP -2258608664,2258608671,AU -2258608672,2258608687,JP -2258608688,2258610179,AU -2258610180,2258610183,IN -2258610184,2258610239,AU -2258610240,2258610303,IN -2258610304,2258610687,AU -2258610688,2258610943,TW -2258610944,2258611071,AU -2258611072,2258611103,JP -2258611104,2258611119,AU -2258611120,2258611167,JP -2258611168,2258611215,AU -2258611216,2258611223,NZ -2258611224,2258611711,AU -2258611712,2258611967,NZ -2258611968,2258612223,HK -2258612224,2258614783,AU -2258614784,2258614815,IN -2258614816,2258615039,AU -2258615040,2258615055,IN -2258615056,2258620415,AU -2258620416,2258621951,HK -2258621952,2258622207,NZ -2258622208,2258622719,AU -2258622720,2258623231,NZ -2258623232,2258623487,KR -2258623488,2258632703,AU -2258632704,2258698239,JP -2258698240,2259222527,US -2259222528,2259288063,DE -2259288064,2259304447,US -2259304448,2259304959,NL -2259304960,2259304967,US -2259304968,2259304975,NL -2259304976,2259304991,US -2259304992,2259305407,NL -2259305408,2259305439,US -2259305440,2259306239,NL -2259306240,2259306367,US -2259306368,2259306431,NL -2259306432,2259308543,US -2259308544,2259312639,IE -2259312640,2259314687,NL -2259314688,2259321855,US -2259321856,2259322111,SG -2259322112,2259322879,US -2259322880,2259324927,HK -2259324928,2259331071,US -2259331072,2259333119,IE -2259333120,2259337215,US -2259337216,2259339263,HK -2259339264,2259340287,US -2259340288,2259340799,NL -2259340800,2259341311,IE -2259341312,2259342335,US -2259342336,2259342847,NL -2259342848,2259343359,IE -2259343360,2259343615,HK -2259343616,2259343871,BR -2259343872,2259352575,US -2259352576,2259353343,IE -2259353344,2259353599,US -2259353600,2259419135,DE -2259419136,2259615743,US -2259615744,2259681279,CN -2259681280,2259746815,DE -2259746816,2259812351,US -2259812352,2259877887,AU -2259877888,2259943423,US -2259943424,2260008959,JP -2260008960,2260140031,US -2260140032,2260205567,GB -2260205568,2260271103,BE -2260271104,2260467711,US -2260467712,2260533247,NL -2260533248,2260598783,US -2260598784,2260664319,CA -2260664320,2260723711,GB -2260723712,2260723967,IL -2260723968,2260729343,GB -2260729344,2260729599,IL -2260729600,2260729855,GB -2260729856,2260991999,US -2260992000,2261057535,TH -2261057536,2261188607,US -2261188608,2261254143,CA -2261254144,2261385215,US -2261385216,2261450751,PR -2261450752,2261516287,NL -2261516288,2261647359,US -2261647360,2261712895,FR -2261712896,2261778431,US -2261778432,2261843967,TW -2261843968,2261975039,US -2261975040,2262040575,AU -2262040576,2262106111,FR -2262106112,2262171647,GB -2262171648,2262237183,FR -2262237184,2262414335,US -2262414336,2262415359,IN -2262415360,2262499327,US -2262499328,2262630399,GB -2262630400,2262724071,NL -2262724072,2262724073,IE -2262724074,2262761471,NL -2262761472,2262892543,US -2262892544,2262958079,GB -2262958080,2263023615,IE -2263023616,2263089151,FR -2263089152,2263613439,US -2263613440,2263678975,TH -2263678976,2263744511,JP -2263744512,2263810047,US -2263810048,2263875583,SA -2263875584,2264203263,US -2264203264,2264268799,DE -2264268800,2264334335,FR -2264334336,2264399871,DE -2264399872,2264465407,US -2264465408,2264530943,UA -2264530944,2264858623,US -2264858624,2264891391,HU -2264891392,2264899583,RU -2264899584,2264905727,IT -2264905728,2264907775,ES -2264907776,2264908799,DE -2264908800,2264909311,IR -2264909312,2264909567,DE -2264909568,2264909823,TR -2264909824,2264911871,IR -2264911872,2264912383,DE -2264912384,2264912895,ES -2264912896,2264913663,DE -2264913664,2264913919,ES -2264913920,2264920319,DE -2264920320,2264920831,ES -2264920832,2264921087,GB -2264921088,2264921343,DE -2264921344,2264921855,IR -2264921856,2264922111,DE -2264922112,2264922623,IR -2264922624,2264922879,ES -2264922880,2264924159,DE -2264924160,2264989695,CA -2264989696,2265605887,US -2265605888,2265606143,GB -2265606144,2265710847,US -2265710848,2265776127,CA -2265776128,2266169343,US -2266169344,2266234879,CA -2266234880,2266431487,US -2266431488,2266497023,CA -2266497024,2266694655,US -2266694656,2266694911,SG -2266694912,2270442495,US -2270442496,2270443519,NL -2270443520,2270455807,US -2270455808,2270456831,CA -2270456832,2270463999,US -2270464000,2270465023,CA -2270465024,2270467071,US -2270467072,2270468095,NL -2270468096,2270474239,US -2270474240,2270476287,CA -2270476288,2270476543,US -2270476544,2270478335,CA -2270478336,2270482687,US -2270482688,2270482943,GB -2270482944,2270483967,US -2270483968,2270484223,GB -2270484224,2270488575,US -2270488576,2270490623,MO -2270490624,2270494719,IN -2270494720,2276786175,US -2276786176,2276851711,CA -2276851712,2277769215,US -2277769216,2277834751,GB -2277834752,2281007103,US -2281007104,2281007359,IN -2281007360,2281023487,US -2281023488,2281023743,IN -2281023744,2281024767,US -2281024768,2281025023,IN -2281025024,2281701375,US -2281701376,2281705471,CH -2281705472,2281709567,US -2281709568,2281725951,CN -2281725952,2281729023,US -2281729024,2281729535,CN -2281729536,2281733119,US -2281733120,2281733375,CN -2281733376,2281750527,US -2281750528,2281758719,CN -2281758720,2281760511,US -2281760512,2281760767,CH -2281760768,2282226175,US -2282226176,2282226243,CN -2282226244,2282226245,US -2282226246,2282226247,CN -2282226248,2282226248,AU -2282226249,2282226431,CN -2282226432,2282234111,US -2282234112,2282234367,GB -2282234368,2283151359,US -2283151360,2283159551,IN -2283159552,2291142655,US -2291142656,2291144191,CN -2291144192,2291144703,NL -2291144704,2291144959,ES -2291144960,2291145215,IE -2291145216,2291145471,FR -2291145472,2291145727,IE -2291145728,2291146751,NL -2291146752,2291147775,CN -2291147776,2291148799,CH -2291148800,2291150847,NL -2291150848,2291154943,US -2291154944,2291171327,GB -2291171328,2291204095,NL -2291204096,2291269631,PR -2291269632,2291281919,US -2291281920,2291286015,JP -2291286016,2291400703,US -2291400704,2291466239,GB -2291466240,2291728383,US -2291728384,2291859455,AU -2291859456,2291924991,SE -2291924992,2291990527,GB -2291990528,2292056063,US -2292056064,2292121599,NO -2292121600,2292187135,CA -2292187136,2292383743,US -2292383744,2292449279,SE -2292449280,2292514815,NO -2292514816,2292776959,US -2292776960,2292809727,LV -2292809728,2292842495,RU -2292842496,2292908031,GB -2292908032,2292973567,US -2292973568,2293039103,DE -2293080576,2293080831,BE -2293085184,2293085439,BE -2293104640,2293825535,US -2293825536,2293891071,IN -2293891072,2293956607,AU -2293956608,2294022143,JP -2294022144,2294677503,US -2294677504,2294743039,JP -2294743040,2294808575,DE -2294808576,2294874111,US -2294874112,2294939647,IE -2294939648,2295201791,US -2295201792,2295267327,IE -2295267328,2296446975,US -2296446976,2296512511,SE -2296512512,2296774655,US -2296774656,2296840191,DE -2296840192,2296905727,NL -2296905728,2297036799,IN -2297036800,2297167871,US -2297167872,2297233407,AU -2297233408,2297237503,US -2297237504,2297237759,BE -2297237760,2297298943,US -2297298944,2297364479,CH -2297364480,2297626623,US -2297626624,2297661437,DE -2297661438,2297661438,NL -2297661439,2297692159,DE -2297692160,2299461631,US -2299461632,2299527167,CA -2299527168,2299592703,US -2299592704,2299658239,NL -2299658240,2300641279,US -2300641280,2300706815,FI -2300706816,2300772351,CH -2300837888,2301296639,US -2301296640,2301362175,IE -2301362176,2301427711,GB -2301427712,2301558783,US -2301558784,2301624319,NO -2301624320,2301755391,US -2301755392,2301820927,GB -2301820928,2302083071,US -2302083072,2302214143,NL -2302214144,2302279679,US -2302279680,2302345215,SE -2302345216,2302346239,IN -2302346240,2302347263,BD -2302347264,2302348287,IN -2302348288,2302349311,ID -2302349312,2302351359,HK -2302351360,2302357503,VN -2302357504,2302358527,BD -2302358528,2302360319,IN -2302360320,2302360575,CN -2302360576,2302363647,IN -2302363648,2302364671,AU -2302364672,2302365695,IN -2302365696,2302365951,MY -2302365952,2302366719,ID -2302366720,2302367743,IN -2302367744,2302368767,CN -2302368768,2302370815,IN -2302370816,2302371839,HK -2302371840,2302372863,VN -2302372864,2302373887,MY -2302373888,2302374911,TH -2302374912,2302375935,VN -2302375936,2302376959,AF -2302376960,2302377983,ID -2302377984,2302382079,IN -2302382080,2302383103,PK -2302383104,2302384127,IN -2302384128,2302385151,BD -2302385152,2302386175,IN -2302386176,2302387199,ID -2302387200,2302388223,IN -2302388224,2302389247,AU -2302389248,2302391295,IN -2302391296,2302392319,BD -2302392320,2302393343,HK -2302393344,2302394367,AU -2302394368,2302395391,PK -2302395392,2302396415,AU -2302396416,2302398463,IN -2302398464,2302399487,HK -2302399488,2302400511,IN -2302400512,2302404607,PK -2302404608,2302405631,JP -2302405632,2302406655,HK -2302406656,2302408703,IN -2302408704,2302410751,AU -2302410752,2302541823,SE -2302541824,2302607359,CH -2302607360,2302625761,SC -2302625762,2302625762,CA -2302625763,2302640127,SC -2302640128,2302672895,UG -2302672896,2302738431,MW -2302738432,2302935039,US -2302935040,2303000575,KR -2303000576,2303262719,US -2303262720,2303328255,GB -2303328256,2303330303,PL -2303330304,2303330591,FR -2303330592,2303330623,GB -2303330624,2303330687,FR -2303330688,2303330815,DE -2303330816,2303331263,FR -2303331264,2303331327,FI -2303331328,2303331903,FR -2303331904,2303331967,ES -2303331968,2303332799,FR -2303332800,2303332831,GB -2303332832,2303333303,FR -2303333304,2303333311,ES -2303333312,2303333871,FR -2303333872,2303333887,CZ -2303333888,2303333951,FR -2303333952,2303334015,PL -2303334016,2303334143,IT -2303334144,2303334239,FR -2303334240,2303334271,LT -2303334272,2303334399,ES -2303334400,2303336543,FR -2303336544,2303336575,PL -2303336576,2303336943,FR -2303336944,2303336959,PL -2303336960,2303338111,FR -2303338112,2303338239,DE -2303338240,2303338247,FR -2303338248,2303338255,ES -2303338256,2303340639,FR -2303340640,2303340671,FI -2303340672,2303340799,IT -2303340800,2303341283,FR -2303341284,2303341287,FI -2303341288,2303341951,FR -2303341952,2303341967,ES -2303341968,2303342031,FR -2303342032,2303342039,ES -2303342040,2303342279,FR -2303342280,2303342287,ES -2303342288,2303342459,FR -2303342460,2303342463,DE -2303342464,2303342975,FR -2303342976,2303343007,CZ -2303343008,2303343039,FR -2303343040,2303343103,PT -2303343104,2303343183,FR -2303343184,2303343199,PL -2303343200,2303343231,LT -2303343232,2303343359,BE -2303343360,2303343435,FR -2303343436,2303343439,GB -2303343440,2303343487,FR -2303343488,2303343615,IE -2303343616,2303343675,FR -2303343676,2303343679,PL -2303343680,2303343827,FR -2303343828,2303343831,DE -2303343832,2303344127,FR -2303344128,2303344191,CZ -2303344192,2303344471,FR -2303344472,2303344479,IE -2303344480,2303344511,PL -2303344512,2303344559,FR -2303344560,2303344575,PL -2303344576,2303348863,FR -2303348864,2303348991,GB -2303348992,2303349119,FR -2303349120,2303349247,ES -2303349248,2303349383,FR -2303349384,2303349391,NL -2303349392,2303349431,FR -2303349432,2303349439,ES -2303349440,2303350079,FR -2303350080,2303350143,CZ -2303350144,2303350399,FR -2303350400,2303350527,IT -2303350528,2303350783,FR -2303350784,2303351039,ES -2303351040,2303351055,FR -2303351056,2303351071,GB -2303351072,2303351775,FR -2303351776,2303351807,CZ -2303351808,2303352523,FR -2303352524,2303352524,GB -2303352525,2303353183,FR -2303353184,2303353215,IT -2303353216,2303353343,GB -2303353344,2303353783,FR -2303353784,2303353787,GB -2303353788,2303354555,FR -2303354556,2303354559,FI -2303354560,2303355147,FR -2303355148,2303355151,DE -2303355152,2303356863,FR -2303356864,2303356927,DE -2303356928,2303361535,FR -2303361536,2303361599,GB -2303361600,2303362063,FR -2303362064,2303362079,DE -2303362080,2303362303,FR -2303362304,2303362559,DE -2303362560,2303363871,FR -2303363872,2303363903,PL -2303363904,2303365279,FR -2303365280,2303365295,GB -2303365296,2303365679,FR -2303365680,2303365695,NL -2303365696,2303367923,FR -2303367924,2303367927,DE -2303367928,2303368579,FR -2303368580,2303368583,ES -2303368584,2303368799,FR -2303368800,2303368831,PT -2303368832,2303373431,FR -2303373432,2303373439,ES -2303373440,2303374399,FR -2303374400,2303374463,NL -2303374464,2303374591,DE -2303374592,2303374745,FR -2303374746,2303374746,ES -2303374747,2303376783,FR -2303376784,2303376799,PT -2303376800,2303376807,FR -2303376808,2303376815,ES -2303376816,2303377311,FR -2303377312,2303377343,GB -2303377344,2303381631,FR -2303381632,2303381663,ES -2303381664,2303382879,FR -2303382880,2303382895,ES -2303382896,2303383151,FR -2303383152,2303383167,LT -2303383168,2303383503,FR -2303383504,2303383519,GB -2303383520,2303383807,FR -2303383808,2303383935,ES -2303383936,2303384959,FR -2303384960,2303384991,GB -2303384992,2303385087,FR -2303385088,2303385103,FI -2303385104,2303386879,FR -2303386880,2303387007,BE -2303387008,2303387535,FR -2303387536,2303387551,PT -2303387552,2303387567,FI -2303387568,2303387591,FR -2303387592,2303387599,ES -2303387600,2303387763,FR -2303387764,2303387767,PL -2303387768,2303387839,FR -2303387840,2303387871,LT -2303387872,2303388351,FR -2303388352,2303388415,CZ -2303388416,2303388543,ES -2303388544,2303390655,FR -2303390656,2303390719,PL -2303390720,2303391007,FR -2303391008,2303391039,IE -2303391040,2303391103,FR -2303391104,2303391231,GB -2303391232,2303392575,FR -2303392576,2303392607,PT -2303392608,2303392615,ES -2303392616,2303392695,FR -2303392696,2303392703,ES -2303392704,2303392843,FR -2303392844,2303392847,FI -2303392848,2303392895,FR -2303392896,2303392899,DE -2303392900,2303393247,FR -2303393248,2303393263,GB -2303393264,2303393535,FR -2303393536,2303393567,PT -2303393568,2303393791,FR -2303393792,2303459327,US -2303459328,2303524863,AU -2303524864,2303852543,US -2303852544,2303918079,CA -2303918080,2304507903,US -2304507904,2304573439,AU -2304573440,2304638975,NO -2304638976,2304704511,CA -2304704512,2304770047,US -2304770048,2304835583,FI -2304835584,2304901119,IN -2304901120,2304966655,CZ -2304966656,2305097727,US -2305097728,2305163263,ES -2305163264,2305359871,US -2305359872,2305425407,GB -2305425408,2305556479,US -2305556480,2305622015,GB -2305622016,2305687551,AU -2305687552,2305753087,US -2305753088,2305818623,AU -2305818624,2306015231,US -2306015232,2306080767,MW -2306080768,2306113535,US -2306113536,2306121727,SG -2306121728,2306125823,HK -2306125824,2306129919,US -2306129920,2306138111,NL -2306138112,2306146303,IE -2306146304,2306179071,US -2306179072,2306211839,NL -2306211840,2306342911,US -2306342912,2306408447,NL -2306408448,2306473983,FR -2306473984,2306539519,CA -2306539520,2306932735,US -2306932736,2306998271,FR -2306998272,2307129343,US -2307129344,2307194879,SG -2307194880,2307195903,BR -2307195904,2307196927,IT -2307196928,2307197951,FI -2307197952,2307198975,DE -2307198976,2307199999,SE -2307200000,2307260415,NO -2307260416,2307278847,US -2307278848,2307280895,AU -2307280896,2307358719,US -2307358720,2307391487,IE -2307391488,2307522559,US -2307522560,2307588095,CH -2307588096,2308112383,US -2308112384,2308177919,AU -2308177920,2308243455,US -2308243456,2308308991,CA -2308308992,2308505599,US -2308505600,2308571135,JP -2308571136,2308636671,AU -2308636672,2308702207,US -2308702208,2308767743,CH -2308767744,2308833279,AU -2308833280,2308898815,ZA -2308898816,2309160959,US -2309160960,2309226495,FI -2309226496,2309357567,US -2309357568,2309423103,AU -2309423104,2309685247,US -2309685248,2309750783,ZA -2309750784,2309816319,AU -2309816320,2309881855,US -2309881856,2309947391,NL -2309947392,2309948223,US -2309948224,2309948231,CN -2309948232,2309980159,US -2309980160,2310012927,CA -2310012928,2310668287,US -2310668288,2310733823,CA -2310733824,2310864895,US -2310864896,2310930431,HK -2310930432,2310995967,US -2310995968,2311061503,IE -2311061504,2311127039,US -2311127040,2311192575,DE -2311192576,2311258111,FR -2311258112,2311315455,GB -2311315456,2311319551,MY -2311319552,2311323647,GB -2311323648,2311389183,MW -2311389184,2311847935,US -2311847936,2311913471,IT -2311913472,2311979007,GB -2311979008,2312044543,US -2312044544,2312110079,CA -2312110080,2312175615,AT -2312175616,2312437759,US -2312437760,2312503295,GB -2312503296,2312634367,ZA -2312634368,2312699903,US -2312699904,2312765439,NO -2312765440,2312830975,GB -2312830976,2312896511,AU -2312896512,2312962047,US -2312962048,2312968191,GB -2312968192,2312970239,NO -2312970240,2312978431,DE -2312978432,2312994815,FR -2312994816,2313093119,GB -2313093120,2313158655,IE -2313158656,2313224191,NL -2313224192,2313289727,US -2313289728,2313355263,DE -2313355264,2314731519,US -2314731520,2314797055,DE -2314797056,2314862591,US -2314862592,2314993663,DE -2314993664,2315059199,US -2315059200,2315124735,GB -2315124736,2315190271,US -2315190272,2315255807,BJ -2315255808,2315257855,BR -2315257856,2315259135,AR -2315259136,2315259903,CL -2315259904,2315266047,BR -2315266048,2315267071,CO -2315267072,2315270143,BR -2315270144,2315271167,AR -2315271168,2315278335,BR -2315278336,2315279359,CO -2315279360,2315282431,BR -2315282432,2315283455,AR -2315283456,2315285503,BR -2315285504,2315286527,PA -2315286528,2315287551,CL -2315287552,2315294719,BR -2315294720,2315296255,AR -2315296256,2315296767,MX -2315296768,2315302911,BR -2315302912,2315303935,AR -2315303936,2315314175,BR -2315314176,2315315199,HN -2315315200,2315317247,BR -2315317248,2315318271,HN -2315318272,2315321343,BR -2315321344,2315452415,US -2315452416,2315517951,GB -2315517952,2315583487,ES -2315583488,2315649023,US -2315649024,2315714559,SE -2315714560,2315780095,AU -2315780096,2315911167,US -2315911168,2316042239,CA -2316042240,2316173311,US -2316173312,2316238847,SE -2316238848,2316500991,US -2316500992,2316566527,HK -2316566528,2316613887,US -2316613888,2316614143,GB -2316614144,2316632063,US -2316632064,2316697599,FR -2316697600,2316763135,AT -2316763136,2316828671,US -2316828672,2316959743,AU -2316959744,2317221887,US -2317221888,2317287423,JP -2317287424,2317357567,US -2317357568,2317357823,AU -2317357824,2317393919,US -2317393920,2317398015,NO -2317398016,2317398271,GB -2317398272,2317413375,US -2317413376,2317413631,ID -2317413632,2317414655,US -2317414656,2317414911,AU -2317414912,2317484031,US -2317484032,2317487359,CA -2317487360,2317487615,US -2317487616,2317549567,CA -2317549568,2317615103,US -2317615104,2317619199,BR -2317619200,2317620223,AR -2317620224,2317621247,BR -2317621248,2317622271,DO -2317622272,2317628415,BR -2317628416,2317629439,AR -2317629440,2317631487,BR -2317631488,2317632511,CO -2317632512,2317634559,BR -2317634560,2317635583,BO -2317635584,2317638655,BR -2317638656,2317638863,HN -2317638864,2317638871,BR -2317638872,2317639679,HN -2317639680,2317640703,AR -2317640704,2317649919,BR -2317649920,2317649991,HN -2317649992,2317649999,US -2317650000,2317650943,HN -2317650944,2317651967,BR -2317651968,2317652991,PE -2317652992,2317654015,AR -2317654016,2317655039,MX -2317655040,2317671423,BR -2317671424,2317672447,AR -2317672448,2317675519,BR -2317675520,2317676543,AR -2317676544,2317679615,BR -2317679616,2317680639,CL -2317680640,2317811711,GB -2317811712,2317877247,US -2317877248,2317942783,GB -2317942784,2318008319,IT -2318008320,2318139391,US -2318139392,2318204927,AU -2318204928,2318401535,US -2318401536,2318467071,BE -2318467072,2318598143,US -2318598144,2318663679,CA -2318663680,2319122431,US -2319122432,2319123455,AR -2319123456,2319123999,HN -2319124000,2319124007,US -2319124008,2319124479,HN -2319124480,2319125503,VE -2319125504,2319126527,UY -2319126528,2319127551,CR -2319127552,2319128575,BR -2319128576,2319129599,TT -2319129600,2319138815,BR -2319138816,2319139839,PE -2319139840,2319150079,BR -2319150080,2319151103,EC -2319151104,2319152127,BR -2319152128,2319153151,VE -2319153152,2319156223,BR -2319156224,2319157247,CR -2319157248,2319158271,BR -2319158272,2319159295,AR -2319159296,2319160319,BR -2319160320,2319161343,PA -2319162368,2319164415,BR -2319164416,2319165439,PY -2319165440,2319167487,AR -2319167488,2319168511,HN -2319169536,2319174655,BR -2319174656,2319175583,HN -2319175584,2319175591,BR -2319175592,2319175647,HN -2319175648,2319175663,BR -2319175664,2319175679,HN -2319175680,2319184895,BR -2319184896,2319185919,AR -2319185920,2319187967,BR -2319187968,2319319039,US -2319319040,2319384575,NO -2319384576,2319450111,FR -2319450112,2319581183,US -2319581184,2319646719,IT -2319646720,2319728639,US -2319728640,2319741951,DE -2319741952,2319742975,GB -2319742976,2319743999,NL -2319744000,2319745023,DE -2319745024,2319761407,GB -2319761408,2319764479,US -2319764480,2319765503,NL -2319765504,2319843327,US -2319843328,2319908863,IT -2319908864,2319974399,AU -2319974400,2320039935,US -2320039936,2320105471,CA -2320105472,2320171007,US -2320171008,2320236543,SG -2320236544,2320302079,US -2320302080,2320367615,AU -2320367616,2320433151,US -2320433152,2320564223,AU -2320564224,2320629759,CH -2320629760,2320695295,CA -2320695296,2321219583,US -2321219584,2321227775,JP -2321227776,2321231871,SG -2321231872,2321235967,IE -2321235968,2321416191,US -2321416192,2321417215,CO -2321417216,2321419263,BR -2321419264,2321420287,AR -2321420288,2321430527,BR -2321430528,2321431551,CR -2321431552,2321446911,BR -2321446912,2321447263,HN -2321447264,2321447279,NL -2321447280,2321447647,HN -2321447648,2321447679,NL -2321447680,2321447727,HN -2321447728,2321447743,NL -2321447744,2321447935,HN -2321447936,2321452031,BR -2321452032,2321453055,MX -2321453056,2321453359,HN -2321453360,2321453367,NL -2321453368,2321453487,HN -2321453488,2321453495,CA -2321453496,2321454079,HN -2321454080,2321467136,BR -2321467137,2321467137,US -2321467138,2321471487,BR -2321471488,2321472039,HN -2321472040,2321472047,CA -2321472048,2321472391,HN -2321472392,2321472399,UY -2321472400,2321472511,HN -2321472512,2321477631,BR -2321477632,2321478655,TT -2321478656,2321479679,SV -2321479680,2321480703,GY -2321480704,2321481727,GT -2321481728,2321547263,US -2321547264,2321612799,FR -2321612800,2321627135,BR -2321627136,2321628159,CO -2321628160,2321633279,BR -2321633280,2321634303,CO -2321634304,2321648639,BR -2321648640,2321649663,SV -2321649664,2321652735,BR -2321652736,2321653223,BZ -2321653224,2321653231,ES -2321653232,2321653759,BZ -2321653760,2321654783,NI -2321654784,2321655807,BR -2321655808,2321656831,MX -2321656832,2321657855,BR -2321657856,2321658879,AR -2321658880,2321663999,BR -2321664000,2321665023,AR -2321665024,2321673215,BR -2321673216,2321674239,AR -2321674240,2321676287,BR -2321676288,2321677311,DO -2321677312,2321678335,BR -2321678336,2321743871,US -2321743872,2321744895,SV -2321744896,2321745919,AR -2321745920,2321753087,BR -2321753088,2321753359,HN -2321753360,2321753375,NL -2321753376,2321753599,HN -2321753600,2321753607,NL -2321753608,2321753727,HN -2321753728,2321753735,NL -2321753736,2321753927,HN -2321753928,2321753935,NL -2321753936,2321754111,HN -2321754112,2321755135,BR -2321755136,2321756159,UY -2321756160,2321769471,BR -2321769472,2321770495,PY -2321770496,2321774719,BR -2321774720,2321774847,PE -2321774848,2321774975,AR -2321774976,2321775103,VE -2321775104,2321775231,PE -2321775232,2321775359,BR -2321775360,2321775487,EC -2321775488,2321775615,AR -2321775616,2321776639,VE -2321776640,2321777663,AR -2321777664,2321778687,BR -2321778688,2321779711,PA -2321779712,2321780735,BR -2321780736,2321780991,PA -2321780992,2321781247,BR -2321781248,2321781503,PA -2321781504,2321781759,BR -2321781760,2321782783,MX -2321782784,2321787903,BR -2321787904,2321788927,AR -2321788928,2321789951,CL -2321789952,2321790975,SV -2321790976,2321791999,AR -2321792000,2321797119,BR -2321797120,2321797375,NO -2321797376,2321797631,GR -2321797632,2321797887,SE -2321797888,2321798143,NL -2321798144,2321799167,CW -2321799168,2321800191,BZ -2321800192,2321801215,AR -2321801216,2321802239,CL -2321803264,2321804287,BR -2321804288,2321805311,DO -2321805312,2321809407,BR -2321809408,2321874943,ES -2321874944,2321940479,JP -2321940480,2322006015,FR -2322006016,2322010383,SE -2322010384,2322010399,US -2322010400,2322071551,SE -2322071552,2322129919,GB -2322129920,2322130175,IN -2322130176,2322130431,GB -2322130432,2322130687,SG -2322130688,2322137087,GB -2322137088,2322202623,US -2322202624,2322268159,SE -2322268160,2322333695,JP -2322333696,2322368511,US -2322368512,2322368767,MY -2322368768,2322923519,US -2322923520,2322924543,BR -2322924544,2322925567,NI -2322925568,2322929663,AR -2322929664,2322933759,BR -2322933760,2322934783,CO -2322934784,2322935807,VE -2322935808,2322936831,AR -2322936832,2322940927,BR -2322940928,2322941951,CL -2322941952,2322942975,BR -2322942976,2322943999,AR -2322944000,2322945023,BR -2322945024,2322946047,CO -2322946048,2322948095,BR -2322948096,2322949119,HN -2322949120,2322951167,BR -2322951168,2322952191,CO -2322952192,2322953215,AR -2322953216,2322956287,BR -2322956288,2322957311,AR -2322957312,2322958335,BR -2322958336,2322959359,CO -2322959360,2322960383,GT -2322960384,2322961407,BR -2322961408,2322962431,CL -2322962432,2322963455,BR -2322963456,2322964479,AR -2322964480,2322965503,PE -2322965504,2322974719,BR -2322974720,2322975743,AR -2322975744,2322980863,BR -2322989056,2322991103,BR -2322991104,2322992127,CL -2322992128,2322998271,BR -2322998272,2322999295,AR -2322999296,2323001343,BR -2323001344,2323002367,AR -2323002368,2323009535,BR -2323009536,2323010559,CR -2323010560,2323015679,BR -2323015680,2323016703,GT -2323016704,2323017727,BR -2323017728,2323018751,AR -2323018752,2323020799,BR -2323020800,2323021823,PA -2323021824,2323025919,BR -2323025920,2323026943,AR -2323026944,2323028991,BR -2323028992,2323030015,CR -2323030016,2323042303,BR -2323042304,2323045375,AR -2323045376,2323054591,BR -2323054592,2323120127,CA -2323120128,2323185663,US -2323185664,2323186687,BR -2323186688,2323187711,CO -2323187712,2323188735,BR -2323188736,2323189759,CO -2323189760,2323205119,BR -2323205120,2323209215,AR -2323209216,2323210239,BR -2323210240,2323211263,CL -2323211264,2323213311,AR -2323213312,2323214335,CL -2323214336,2323215359,AR -2323215360,2323217407,BR -2323217408,2323218431,AR -2323218432,2323221503,BR -2323221504,2323222527,CR -2323222528,2323225599,BR -2323225600,2323226623,CO -2323226624,2323227647,AR -2323227648,2323228671,BR -2323228672,2323229695,CL -2323229696,2323230719,BR -2323230720,2323231743,CL -2323231744,2323236863,BR -2323236864,2323237887,CO -2323237888,2323244031,BR -2323244032,2323245055,AR -2323245056,2323247103,BR -2323247104,2323248127,AR -2323248128,2323252223,BR -2323252224,2323253247,VE -2323253248,2323257343,BR -2323257344,2323258367,CR -2323258368,2323275775,BR -2323275776,2323276799,MX -2323276800,2323278847,BR -2323278848,2323279871,EC -2323279872,2323283967,BR -2323283968,2323284991,AR -2323284992,2323288063,BR -2323288064,2323289087,MX -2323289088,2323291135,BR -2323291136,2323292159,AR -2323292160,2323293183,PY -2323293184,2323298303,BR -2323298304,2323299327,PY -2323299328,2323300351,AR -2323300352,2323301375,HN -2323301376,2323302399,BR -2323302400,2323303423,CO -2323303424,2323308543,BR -2323308544,2323309567,CL -2323309568,2323310591,AR -2323310592,2323313663,BR -2323313664,2323314687,CR -2323314688,2323315711,BR -2323315712,2323316735,MX -2323316736,2323382271,US -2323382272,2323447807,NO -2323447808,2323644431,US -2323644432,2323644495,CA -2323644496,2323644511,US -2323644512,2323644543,CA -2323644544,2323644575,US -2323644576,2323644607,CA -2323644608,2323644631,US -2323644632,2323644639,CA -2323644640,2323644719,US -2323644720,2323644799,CA -2323644800,2323644895,US -2323644896,2323644927,CA -2323644928,2323645071,US -2323645072,2323645087,CA -2323645088,2323645119,US -2323645120,2323645135,CA -2323645136,2323645151,US -2323645152,2323645191,CA -2323645192,2323645199,SE -2323645200,2323645263,US -2323645264,2323645279,CA -2323645280,2323645471,US -2323645472,2323645503,CA -2323645504,2323645535,US -2323645536,2323645567,CA -2323645568,2323645663,US -2323645664,2323645695,CA -2323645696,2323645951,US -2323645952,2323645983,CA -2323645984,2323645999,US -2323646000,2323646015,CA -2323646016,2323646079,US -2323646080,2323646119,CA -2323646120,2323646127,FI -2323646128,2323646335,US -2323646336,2323646383,CA -2323646384,2323646415,US -2323646416,2323646431,CA -2323646432,2323646463,US -2323646464,2323646479,CA -2323646480,2323646495,US -2323646496,2323646527,CA -2323646528,2323646783,US -2323646784,2323646799,CA -2323646800,2323646815,US -2323646816,2323646831,CA -2323646832,2323646911,US -2323646912,2323646975,CA -2323646976,2323647119,US -2323647120,2323647135,CA -2323647136,2323647199,US -2323647200,2323647215,CA -2323647216,2323647311,US -2323647312,2323647407,CA -2323647408,2323647487,US -2323647488,2323647519,CA -2323647520,2323647535,US -2323647536,2323647583,CA -2323647584,2323647743,US -2323647744,2323647775,CA -2323647776,2323647791,US -2323647792,2323647807,CA -2323647808,2323647871,US -2323647872,2323647903,CA -2323647904,2323647999,US -2323648000,2323648007,CA -2323648008,2323648015,FI -2323648016,2323648031,US -2323648032,2323648063,CA -2323648064,2323648319,US -2323648320,2323648335,CA -2323648336,2323648351,US -2323648352,2323648367,CA -2323648368,2323648639,US -2323648640,2323648655,CA -2323648656,2323648671,US -2323648672,2323648703,CA -2323648704,2323648767,US -2323648768,2323648943,CA -2323648944,2323648951,US -2323648952,2323649023,CA -2323649024,2323649279,US -2323649280,2323649751,CA -2323649752,2323649759,US -2323649760,2323649775,CA -2323649776,2323649783,US -2323649784,2323649823,CA -2323649824,2323649831,NO -2323649832,2323649855,CA -2323649856,2323649863,US -2323649864,2323649919,CA -2323649920,2323649935,US -2323649936,2323649951,CA -2323649952,2323649959,US -2323649960,2323649999,CA -2323650000,2323650007,US -2323650008,2323650015,RO -2323650016,2323650023,CA -2323650024,2323650031,US -2323650032,2323650039,CA -2323650040,2323650047,US -2323650048,2323650087,CA -2323650088,2323650095,US -2323650096,2323650135,CA -2323650136,2323650151,US -2323650152,2323650167,CA -2323650168,2323650175,US -2323650176,2323650183,CA -2323650184,2323650191,FI -2323650192,2323650223,CA -2323650224,2323650231,US -2323650232,2323650239,CA -2323650240,2323650255,US -2323650256,2323650263,CA -2323650264,2323650271,US -2323650272,2323651327,CA -2323651328,2323651583,US -2323651584,2323652287,CA -2323652288,2323652335,US -2323652336,2323653119,CA -2323653120,2323653135,US -2323653136,2323653151,CA -2323653152,2323653375,US -2323653376,2323653631,CA -2323653632,2323653887,US -2323653888,2323655423,CA -2323655424,2323655503,US -2323655504,2323655511,CA -2323655512,2323655519,US -2323655520,2323655551,CA -2323655552,2323655823,US -2323655824,2323655871,CA -2323655872,2323655935,US -2323655936,2323655967,CA -2323655968,2323655983,US -2323655984,2323655991,CA -2323655992,2323655999,US -2323656000,2323656031,CA -2323656032,2323656207,US -2323656208,2323656255,CA -2323656256,2323656271,US -2323656272,2323656287,CA -2323656288,2323656447,US -2323656448,2323656607,CA -2323656608,2323656639,US -2323656640,2323656719,CA -2323656720,2323656735,US -2323656736,2323656767,CA -2323656768,2323656815,US -2323656816,2323656831,CA -2323656832,2323656895,US -2323656896,2323656927,CA -2323656928,2323656959,US -2323656960,2323657215,CA -2323657216,2323657263,US -2323657264,2323657279,CA -2323657280,2323657311,US -2323657312,2323657343,CA -2323657344,2323657535,US -2323657536,2323657551,CA -2323657552,2323657559,US -2323657560,2323657663,CA -2323657664,2323657695,US -2323657696,2323657711,CA -2323657712,2323657759,US -2323657760,2323657775,CA -2323657776,2323657839,US -2323657840,2323657919,CA -2323657920,2323658495,US -2323658496,2323658751,CA -2323658752,2323659263,US -2323659264,2323659775,CA -2323659776,2323660191,US -2323660192,2323661143,CA -2323661144,2323661151,US -2323661152,2323661199,CA -2323661200,2323661223,US -2323661224,2323661239,CA -2323661240,2323661271,US -2323661272,2323661311,CA -2323661312,2323661567,US -2323661568,2323661607,CA -2323661608,2323661615,FI -2323661616,2323661623,CA -2323661624,2323661823,US -2323661824,2323662399,CA -2323662400,2323662527,US -2323662528,2323662655,CA -2323662656,2323662719,US -2323662720,2323662751,CA -2323662752,2323662767,US -2323662768,2323662775,CA -2323662776,2323662783,US -2323662784,2323663103,CA -2323663104,2323663679,US -2323663680,2323663759,CA -2323663760,2323663767,US -2323663768,2323663791,CA -2323663792,2323663799,US -2323663800,2323663839,CA -2323663840,2323663871,US -2323663872,2323664959,CA -2323664960,2323665039,US -2323665040,2323665047,CA -2323665048,2323665087,US -2323665088,2323665919,CA -2323665920,2323666687,US -2323666688,2323668223,CA -2323668224,2323668991,US -2323668992,2323669759,CA -2323669760,2323670015,US -2323670016,2323670271,CA -2323670272,2323671039,US -2323671040,2323671295,CA -2323671296,2323671551,US -2323671552,2323672063,CA -2323672064,2323672127,US -2323672128,2323672191,CA -2323672192,2323672383,US -2323672384,2323672463,CA -2323672464,2323672479,US -2323672480,2323672511,CA -2323672512,2323672575,US -2323672576,2323672591,CA -2323672592,2323672607,US -2323672608,2323672639,CA -2323672640,2323672735,US -2323672736,2323672767,CA -2323672768,2323672831,US -2323672832,2323672847,CA -2323672848,2323672863,US -2323672864,2323672895,CA -2323672896,2323672959,US -2323672960,2323673055,CA -2323673056,2323673351,US -2323673352,2323673359,CA -2323673360,2323673375,US -2323673376,2323673391,CA -2323673392,2323673455,US -2323673456,2323673487,CA -2323673488,2323673503,US -2323673504,2323673983,CA -2323673984,2323674047,US -2323674048,2323674111,CA -2323674112,2323674175,US -2323674176,2323674575,CA -2323674576,2323674591,US -2323674592,2323674767,CA -2323674768,2323674775,US -2323674776,2323674799,CA -2323674800,2323674879,US -2323674880,2323675135,CA -2323675136,2323675519,US -2323675520,2323675647,CA -2323675648,2323675839,US -2323675840,2323675903,CA -2323675904,2323676927,US -2323676928,2323676991,CA -2323676992,2323690495,US -2323690496,2323690751,IN -2323690752,2323699711,US -2323699712,2323700735,NL -2323700736,2323701759,US -2323701760,2323703295,VG -2323703296,2323775487,US -2323775488,2323841023,AU -2323841024,2323906559,CH -2323906560,2323972095,IT -2323972096,2324021247,US -2324021248,2324021503,MY -2324021504,2324037631,US -2324037632,2324103167,IL -2324103168,2327379967,US -2327379968,2327380991,MX -2327380992,2327383039,BR -2327383040,2327384063,CL -2327384064,2327387135,BR -2327387136,2327388159,NI -2327388160,2327396351,BR -2327396352,2327398399,VE -2327398400,2327399423,BR -2327399424,2327400447,BZ -2327400448,2327401471,AR -2327401472,2327402495,BR -2327403520,2327406591,BR -2327406592,2327407615,NI -2327407616,2327408639,BR -2327408640,2327409663,AR -2327409664,2327410687,PE -2327410688,2327414783,BR -2327414784,2327415807,EC -2327415808,2327416831,AR -2327416832,2327432191,BR -2327432192,2327433215,AR -2327433216,2327434239,BQ -2327434240,2327437311,BR -2327437312,2327438335,MX -2327438336,2327443455,BR -2327443456,2327444479,CR -2327444480,2327446527,BR -2327446528,2327447551,VE -2327447552,2327448575,CL -2327448576,2327449599,PA -2327449600,2327450623,BR -2327450624,2327451647,CO -2327451648,2327452671,BR -2327452672,2327453695,MX -2327453696,2327460863,BR -2327460864,2327461887,PY -2327461888,2327462911,MX -2327462912,2327468031,BR -2327468032,2327469055,PA -2327469056,2327471103,BR -2327471104,2327472127,MX -2327472128,2327476223,BR -2327476224,2327477247,CL -2327477248,2327480319,BR -2327480320,2327481007,HN -2327481008,2327481023,US -2327481024,2327481055,HN -2327481056,2327481071,US -2327481072,2327481135,HN -2327481136,2327481143,US -2327481144,2327481343,HN -2327481344,2327481599,MX -2327481600,2327482367,AR -2327482368,2327483391,BR -2327483392,2327485439,AR -2327485440,2327486463,BR -2327486464,2327487487,AR -2327487488,2327490559,BR -2327490560,2327491583,VE -2327491584,2327493631,BR -2327493632,2327494655,CO -2327494656,2327496703,BR -2327496704,2327497727,MX -2327497728,2327498751,BR -2327498752,2327499055,HN -2327499056,2327499063,CL -2327499064,2327499343,HN -2327499344,2327499351,CL -2327499352,2327499623,HN -2327499624,2327499631,CL -2327499632,2327499639,HN -2327499640,2327499647,CL -2327499648,2327499655,HN -2327499656,2327499663,CL -2327499664,2327499775,HN -2327499776,2327501823,AR -2327501824,2327507967,BR -2327507968,2327508991,AR -2327508992,2327510015,SV -2327510016,2327511039,AR -2327511040,2327838719,CH -2327838720,2327969791,US -2327969792,2328035327,AU -2328035328,2328100863,FR -2328100864,2328199167,US -2328199168,2328211455,CA -2328211456,2328215551,DE -2328215552,2328227839,US -2328227840,2328230911,CA -2328230912,2328231935,US -2328231936,2328297471,GB -2328313856,2328317951,NL -2328342528,2328342783,DE -2328362752,2328485437,DE -2328485438,2328485438,NL -2328485439,2328494079,DE -2328494080,2328559615,US -2328559616,2328625151,BE -2328625152,2328627199,AR -2328627200,2328628223,BR -2328628224,2328629247,BZ -2328629248,2328635391,BR -2328635392,2328636415,AR -2328636416,2328652799,BR -2328652800,2328653823,PA -2328653824,2328664063,BR -2328664064,2328667135,AR -2328667136,2328668159,BR -2328668160,2328669183,MX -2328669184,2328671231,BR -2328671232,2328672255,HN -2328672256,2328677375,BR -2328677376,2328678399,MX -2328678400,2328680447,BR -2328680448,2328681471,AR -2328681472,2328683519,BR -2328683520,2328684543,CL -2328684544,2328686079,BR -2328686080,2328686591,CO -2328686592,2328687615,BR -2328687616,2328690687,AR -2328690688,2328756223,BE -2328756224,2328766591,CH -2328766592,2328766655,HK -2328766656,2328794239,CH -2328794240,2328794303,JP -2328794304,2328797183,CH -2328797184,2328805375,AU -2328805376,2328808063,CH -2328808064,2328808127,HK -2328808128,2328821759,CH -2328821760,2329083903,US -2329083904,2329149439,NZ -2329149440,2329214975,JP -2329280512,2329346047,CA -2329346048,2329411583,SE -2329411584,2329477119,FI -2329477120,2329542655,AU -2329542656,2329608191,CA -2329608192,2329610239,AR -2329610240,2329611263,PY -2329611264,2329612287,SV -2329612288,2329613311,AR -2329613312,2329617407,BR -2329617408,2329618431,MX -2329618432,2329619455,AR -2329619456,2329622527,BR -2329622528,2329623551,CL -2329623552,2329624575,AR -2329624576,2329626623,BR -2329626624,2329627647,HN -2329627648,2329628671,BR -2329628672,2329629695,AR -2329629696,2329638911,BR -2329638912,2329639071,HN -2329639072,2329639087,NL -2329639088,2329639935,HN -2329639936,2329644031,BR -2329644032,2329645055,CW -2329645056,2329648127,BR -2329648128,2329649151,SV -2329649152,2329650175,AR -2329650176,2329652223,BR -2329652224,2329652735,US -2329652736,2329653247,HN -2329653248,2329662463,BR -2329662464,2329664511,AR -2329664512,2329666559,BR -2329666560,2329667583,CL -2329667584,2329668607,AR -2329668608,2329671679,BR -2329671680,2329672703,AR -2329672704,2329673727,BR -2329673728,2329739263,US -2329739264,2329804799,SE -2329804800,2329870335,DE -2329870336,2329935871,CH -2329935872,2330001407,DE -2330001408,2330066943,CH -2330066944,2330132479,US -2330132480,2330198015,SE -2330198016,2330263551,CH -2330263552,2330267647,US -2330267648,2330271743,CA -2330271744,2330288127,US -2330288128,2330290175,CN -2330290176,2330394623,US -2330394624,2330460159,FR -2330460160,2330525695,AT -2330525696,2330591231,SE -2330591232,2330656767,US -2330656768,2330722303,NZ -2330722304,2330956287,US -2330956288,2330956543,GB -2330956544,2330956799,US -2330956800,2330957311,NZ -2330957312,2330968063,US -2330968064,2330968319,IN -2330968320,2331181055,US -2331181056,2331246591,JP -2331246592,2331443199,DE -2331443200,2331508735,US -2331508736,2331574271,GB -2331574272,2331639807,FI -2331639808,2331770879,GB -2331836416,2331901951,GB -2331901952,2331967487,US -2331967488,2331980799,BR -2331980800,2331981567,PA -2331981568,2331981823,US -2331981824,2331982847,BR -2331982848,2331983871,MX -2331983872,2331987967,BR -2331987968,2331988991,AR -2331988992,2331990015,BR -2331990016,2331991039,AR -2331991040,2331992063,BR -2331992064,2331992319,CO -2331992320,2331994111,CL -2331994112,2331997183,BR -2331997184,2331998207,MX -2331998208,2332006399,BR -2332006400,2332007423,SV -2332007424,2332010495,BR -2332010496,2332011519,AR -2332011520,2332030975,BR -2332030976,2332031999,DO -2332032000,2332033023,AW -2332033024,2332098559,ID -2332098560,2332360703,DE -2332360704,2332374015,IN -2332374016,2332375039,AU -2332375040,2332377087,CN -2332377088,2332378111,IN -2332378112,2332380159,NP -2332380160,2332381183,AU -2332381184,2332382207,CN -2332382208,2332383231,US -2332383232,2332384255,JP -2332384256,2332385279,CN -2332385280,2332387327,IN -2332387328,2332388351,BD -2332388352,2332388863,HK -2332388864,2332389375,CN -2332389376,2332393471,AU -2332393472,2332394495,CN -2332394496,2332395519,BD -2332395520,2332396543,GU -2332396544,2332397567,IN -2332397568,2332398591,TH -2332398592,2332400639,ID -2332400640,2332401663,LA -2332401664,2332402687,CN -2332402688,2332403711,NZ -2332403712,2332404735,JP -2332404736,2332405759,AU -2332405760,2332406783,MY -2332406784,2332407807,HK -2332407808,2332408575,US -2332408576,2332408831,GB -2332408832,2332409855,BD -2332409856,2332410879,CN -2332410880,2332411903,IN -2332411904,2332412927,HK -2332412928,2332415999,CN -2332416000,2332417023,MN -2332417024,2332418047,IN -2332418048,2332419071,KR -2332419072,2332423167,IN -2332423168,2332424191,CN -2332424192,2332426239,IN -2332426240,2332622847,DE -2332622848,2332688383,CN -2332688384,2332753919,NL -2332753920,2333736959,DE -2333736960,2333802495,RE -2333802496,2333868031,DE -2333933568,2334064639,DE -2334064640,2334916607,US -2334916608,2334982143,AU -2334982144,2335113215,US -2335113216,2335154175,ES -2335154176,2335178751,DE -2335178752,2335244287,CA -2335244288,2335309823,US -2335309824,2335375359,DE -2335375360,2335506431,US -2335506432,2335571967,ZA -2335571968,2335637503,FR -2335637504,2335768575,US -2335768576,2335834111,CA -2335834112,2335899647,SE -2335899648,2335924223,IN -2335924224,2335932415,SG -2335932416,2335940607,DE -2335940608,2335948799,GB -2335948800,2335949823,SG -2335949824,2335951871,GB -2335951872,2335954943,DE -2335954944,2335965183,SG -2335965184,2335970303,US -2335970304,2335971327,CA -2335971328,2335994879,US -2335994880,2335995903,CA -2335995904,2336008191,US -2336008192,2336009215,CA -2336009216,2336010239,US -2336010240,2336014335,PR -2336014336,2336161791,US -2336161792,2336227327,NL -2336227328,2336260095,CA -2336260096,2336358399,US -2336358400,2336411647,FI -2336411648,2336412671,SG -2336412672,2336423935,FI -2336423936,2336882687,US -2336882688,2336948223,FI -2336948224,2337013759,DE -2337013760,2337210367,US -2337210368,2337275903,CH -2337275904,2337341439,NZ -2337341440,2337406975,US -2337406976,2337472511,BR -2337472512,2337538047,PT -2337538048,2337669119,US -2337669120,2337734655,AU -2337734656,2337865727,US -2337865728,2337931263,DE -2337931264,2337996799,BE -2337996800,2338062335,GR -2338064384,2338066431,NL -2338066432,2338069247,GB -2338079488,2338079743,SE -2338083840,2338084095,TR -2338084352,2338084863,FR -2338086912,2338087423,DE -2338088960,2338089727,GB -2338091008,2338092031,SE -2338092288,2338092543,SE -2338093568,2338093823,IE -2338100224,2338100479,FI -2338104576,2338104831,DK -2338104832,2338105087,GR -2338108928,2338109183,FI -2338109184,2338109439,GB -2338113536,2338113791,FR -2338115072,2338115839,IL -2338120448,2338120959,DE -2338123008,2338123519,AT -2338123520,2338123775,IT -2338124800,2338125055,GB -2338125056,2338125311,FR -2338125312,2338125567,GB -2338127872,2338324479,US -2338324480,2338390015,SE -2338390016,2338455551,FI -2338455552,2338521087,NO -2338521088,2338553855,SG -2338553856,2338586623,AU -2338586624,2338652159,FR -2338652160,2338717695,JP -2338717696,2338783231,US -2338783232,2338848767,CA -2338848768,2338914303,US -2338914304,2339962879,NO -2339962880,2340028415,US -2340028416,2340093951,SE -2340093952,2340159487,FI -2340159488,2340225023,FR -2340225024,2340421631,US -2340421632,2340487167,IT -2340487168,2340552703,CN -2340552704,2340618239,AU -2340618240,2340683775,US -2340683776,2340749311,AU -2340749312,2340814847,GB -2340814848,2340880383,AU -2340880384,2341126143,US -2341126144,2341134335,CY -2341134336,2341134591,IN -2341134592,2341134847,US -2341134848,2341135103,AU -2341135104,2341135359,GB -2341135360,2341135615,SG -2341135616,2341135871,JP -2341135872,2341136127,CN -2341136128,2341273599,US -2341273600,2341339135,KW -2341339136,2341404671,CA -2341404672,2341470207,GB -2341470208,2341535743,US -2341535744,2341601279,NO -2341601280,2341732351,US -2341732352,2341797887,CN -2341797888,2341863423,GB -2341863424,2341928959,KR -2341928960,2341994495,US -2341994496,2342060031,JP -2342060032,2342125567,GB -2342125568,2342191103,JP -2342191104,2342256639,CN -2342256640,2342322175,NL -2342322176,2342387711,FI -2342387712,2342453247,FR -2342453248,2342518783,CN -2342518784,2342584319,FR -2342584320,2342649855,US -2342649856,2342666239,SG -2342666240,2342682623,JP -2342682624,2342699007,DE -2342699008,2342715391,GB -2342715392,2342780927,AU -2342780928,2342846463,NO -2342846464,2342911999,BE -2342912000,2342977535,GB -2342977536,2343043071,IN -2343043072,2343108607,AU -2343108608,2343174143,US -2343174144,2343239679,CN -2343239680,2343370751,US -2343370752,2343436287,CA -2343436288,2343501823,DE -2343501824,2343567359,TW -2343567360,2343632895,CN -2343632896,2343698431,US -2343698432,2343763967,NL -2343763968,2343829503,TR -2343829504,2343924735,US -2343924736,2343925759,IL -2343925760,2343934975,US -2343934976,2343935999,IL -2343936000,2344026111,US -2344026112,2344091647,CN -2344091648,2344157183,GB -2344157184,2344222719,US -2344222720,2344288255,CN -2344288256,2344353791,US -2344353792,2344419327,AU -2344419328,2344484863,CN -2344484864,2344550399,PK -2344615936,2344878079,ID -2344878080,2346188799,CN -2346188800,2346254335,AU -2346254336,2346319871,CN -2346319872,2346385407,AU -2346385408,2346582015,CN -2346582016,2346647551,GB -2346647552,2346713087,TW -2346713088,2346778623,CN -2346778624,2346844159,US -2346844160,2346975231,CN -2346975232,2347040767,ID -2347040768,2347106303,US -2347106304,2347171839,AU -2347171840,2348744703,US -2348744704,2348875775,ID -2348875776,2353725439,US -2353725440,2353790975,CN -2353790976,2353856511,US -2353856512,2353922047,FR -2353922048,2353987583,AT -2353987584,2354053119,AU -2354053120,2354118655,CA -2354184192,2354249727,US -2354249728,2354315263,AU -2354315264,2354446335,US -2354446336,2354511871,FR -2354511872,2354839551,US -2354839552,2354905087,TW -2354905088,2355036159,FR -2355036160,2355101695,US -2355101696,2355167231,TW -2355167232,2355232767,GB -2355232768,2355437551,US -2355437552,2355437567,GB -2355437568,2355470319,US -2355470320,2355470335,SG -2355470336,2355482607,US -2355482608,2355482623,HK -2355482624,2355491311,US -2355491312,2355491327,AU -2355491328,2355691519,US -2355691520,2355757055,IT -2355757056,2355953663,US -2355953664,2357919743,TW -2357919744,2358181887,US -2358181888,2358247423,CN -2358247424,2358509567,US -2358509568,2358575103,MX -2358575104,2358640639,TH -2358640640,2358706175,SE -2358706176,2358771711,FI -2358771712,2359230463,US -2359230464,2359295999,AU -2359296000,2359361535,US -2359361536,2359427071,CA -2359427072,2359558143,US -2359558144,2359623679,IT -2359623680,2359689215,US -2359689216,2359754751,SE -2359754752,2359820287,CA -2359820288,2359885823,AU -2359885824,2360672255,US -2360672256,2360737791,DE -2360737792,2360868863,US -2360868864,2360934399,CA -2360934400,2361327615,US -2361327616,2361393151,AR -2361393152,2361458687,US -2361458688,2361524223,CA -2361524224,2361917439,US -2361917440,2361982975,NZ -2361982976,2362114047,US -2362114048,2362179583,IE -2362179584,2362245119,US -2362245120,2362441727,CN -2362441728,2362572799,US -2362572800,2362638335,CN -2362638336,2362769407,US -2362769408,2362834943,ID -2362834944,2363490303,US -2363490304,2363555839,CN -2363555840,2363686911,US -2363686912,2363752447,JP -2363752448,2363883519,US -2363883520,2363949055,CA -2363949056,2364342271,US -2364342272,2364407807,CN -2364407808,2364538879,US -2364538880,2364604415,CN -2364604416,2364671487,US -2364671488,2364671743,HK -2364671744,2364675839,US -2364675840,2364676095,CA -2364676096,2364676863,US -2364676864,2364676867,GB -2364676868,2364725503,US -2364725504,2364725759,IN -2364725760,2364727807,US -2364727808,2364728063,DE -2364728064,2364735487,US -2364735488,2364801023,CN -2364801024,2364932095,US -2364932096,2364997631,CN -2364997632,2365128703,US -2365128704,2365259775,CN -2365259776,2365390847,US -2365390848,2365456383,AU -2365456384,2365521919,US -2365521920,2365587455,CN -2365587456,2365589503,JO -2365589504,2365590527,SG -2365590528,2365591039,ZA -2365591040,2365591551,US -2365591552,2365593599,DE -2365593600,2365595647,NL -2365595648,2365603839,GB -2365603840,2365624319,NO -2365624320,2365630463,GB -2365630464,2365632511,NL -2365632512,2365634559,RU -2365634560,2365636607,FR -2365636608,2365638655,GB -2365638656,2365640703,FR -2365640704,2365644799,GB -2365644800,2365652991,NO -2365652992,2366032895,DE -2366032896,2366033151,GB -2366033152,2366111743,DE -2366111744,2366144511,MT -2366144512,2366147967,RU -2366147968,2366148095,DE -2366148096,2366148351,RU -2366148352,2366148479,TR -2366148480,2366148607,US -2366148608,2366149375,RU -2366149376,2366149407,DE -2366149408,2366149423,PL -2366149424,2366149439,SK -2366149440,2366149455,PT -2366149456,2366149471,ES -2366149472,2366149487,FR -2366149488,2366149495,MD -2366149496,2366149503,LT -2366149504,2366149511,LV -2366149512,2366149519,EE -2366149520,2366149527,BG -2366149528,2366149535,RS -2366149536,2366149543,UA -2366149544,2366149551,BY -2366149552,2366149559,KZ -2366149560,2366160223,RU -2366160224,2366160255,DE -2366160256,2366162943,RU -2366162944,2366164991,AL -2366164992,2366167039,GE -2366167040,2366169087,GB -2366169088,2366171135,CH -2366171136,2366308351,DE -2366308352,2366373887,GB -2366373888,2367487999,DE -2367488000,2367553535,SI -2367553536,2370895871,DE -2370895872,2370961407,SE -2370961408,2371158015,DE -2371158016,2371223551,RO -2371223552,2371289087,US -2371289088,2371616767,DE -2371616768,2371682303,GB -2371682304,2371747839,NL -2371747840,2371813887,GB -2371813888,2371814143,US -2371814144,2371814144,CH -2371814145,2371878911,GB -2371878912,2371944447,BE -2371944448,2372009983,GB -2372075520,2372206591,DE -2372206592,2372214783,UA -2372214784,2372218879,DE -2372218880,2372221951,FR -2372221952,2372222975,CH -2372222976,2372223487,NL -2372223488,2372224511,FR -2372224512,2372225023,GB -2372225024,2372225791,US -2372225792,2372226559,NL -2372226560,2372227071,US -2372227072,2372227583,RU -2372227584,2372228607,KR -2372228608,2372229119,US -2372229120,2372229375,FR -2372229376,2372230655,US -2372230656,2372231679,CZ -2372231680,2372232191,GB -2372232192,2372233215,CL -2372233216,2372233727,NL -2372233728,2372234239,GB -2372234240,2372235263,CO -2372239360,2372239564,SK -2372239565,2372239580,IT -2372239581,2372240383,SK -2372240384,2372240511,NL -2372240512,2372240639,LU -2372240640,2372240895,NL -2372240896,2372241151,DE -2372241152,2372241407,PK -2372241408,2372243199,RU -2372243200,2372243455,RO -2372243456,2372243711,DK -2372243712,2372243967,AM -2372243968,2372244223,NO -2372244224,2372244479,BN -2372244480,2372251391,US -2372251392,2372258815,RU -2372258816,2372259327,TJ -2372259328,2372272127,RU -2372272128,2372337663,US -2372337664,2372403199,ID -2372403200,2372468735,US -2372468736,2372472831,NL -2372472832,2372474879,PL -2372474880,2372483071,RU -2372483072,2372485119,JO -2372485120,2372487167,RU -2372487168,2372489215,FR -2372489216,2372493311,LB -2372493312,2372497407,ES -2372497408,2372499455,IE -2372499456,2372501503,NL -2372501504,2372505599,UA -2372505600,2372507647,NL -2372507648,2372509695,IT -2372509696,2372510335,AE -2372510336,2372510336,ES -2372510337,2372511743,AE -2372511744,2372512815,OM -2372512816,2372512816,BA -2372512817,2372513791,OM -2372513792,2372534271,GB -2372534272,2372665343,US -2372665344,2372730879,IT -2372730880,2372796415,CA -2372796416,2372993023,US -2372993024,2373025791,DE -2373025792,2373026047,SG -2373026048,2373029887,DE -2373029888,2373033983,US -2373033984,2373036031,DE -2373036032,2373038079,US -2373038080,2373058559,DE -2373058560,2373124095,US -2373124096,2373189631,FR -2373189632,2373255167,US -2373255168,2373451775,CA -2373451776,2373517311,AU -2373517312,2373582847,US -2373582848,2373648383,CH -2373648384,2373911041,US -2373911042,2373911042,FI -2373911043,2374107135,US -2374107136,2374172671,DE -2374172672,2374238207,US -2374238208,2374303743,AU -2374303744,2374369279,US -2374369280,2374500351,BE -2374500352,2374502399,LV -2374502400,2374504447,MK -2374504448,2374508543,US -2374508544,2374512639,LT -2374512640,2374514687,SK -2374514688,2374516735,ES -2374516736,2374524927,AM -2374524928,2374525717,FR -2374525718,2374525718,BE -2374525719,2374528261,FR -2374528262,2374528262,PL -2374528263,2374529023,FR -2374529024,2374531071,RU -2374531072,2374533119,NL -2374533120,2374565887,HR -2374565888,2374631423,SE -2374631424,2374647807,HR -2374647808,2374651903,BE -2374651904,2374653951,IT -2374653952,2374655999,FR -2374656000,2374664191,UA -2374664192,2374666239,GB -2374666240,2374670335,NL -2374670336,2374672383,FR -2374672384,2374674431,PL -2374674432,2374676479,NL -2374676480,2374680575,LB -2374680576,2374684671,NL -2374684672,2374686719,GB -2374686720,2374688767,NL -2374688768,2374696959,GB -2374696960,2374959103,US -2374959104,2375008255,GB -2375008256,2375012351,NL -2375012352,2375024639,GB -2375024640,2375090175,DK -2375090176,2375102259,NO -2375102260,2375102260,GB -2375102261,2375155711,NO -2375155712,2375221247,US -2375221248,2375286783,SE -2375286784,2375352319,CH -2375352320,2376083199,US -2376083200,2376083455,CA -2376083456,2376083711,US -2376083712,2376083967,AU -2376083968,2376269823,US -2376269824,2376335359,GB -2376335360,2376597503,US -2376597504,2376663039,AU -2376663040,2376728575,DE -2376728576,2376761343,GB -2376761344,2376777727,CZ -2376777728,2376781823,BA -2376781824,2376782847,DZ -2376782848,2376785919,FR -2376785920,2376794111,UA -2376794112,2376859647,CH -2376859648,2376925183,FI -2376925184,2377056255,US -2377056256,2377121791,FR -2377121792,2377187327,NL -2377187328,2377252863,US -2377252864,2377318399,JP -2377318400,2377449471,US -2377449472,2377515007,FR -2377515008,2377842687,US -2377842688,2377908223,GB -2377908224,2378022911,US -2378022912,2378023423,HK -2378023424,2378025983,US -2378025984,2378026239,NL -2378026240,2378026495,US -2378026496,2378027007,FR -2378027008,2378170367,US -2378170368,2378203135,FI -2378203136,2378203647,NO -2378203648,2378210559,FI -2378210560,2378211071,NO -2378211072,2378235903,FI -2378235904,2378236415,CA -2378236416,2378238975,ES -2378238976,2378239487,CA -2378239488,2378240511,US -2378240512,2378242047,ES -2378242048,2378242559,US -2378242560,2378248191,ES -2378248192,2378250751,US -2378250752,2378301439,ES -2378301440,2378366975,FR -2378366976,2378432511,US -2378432512,2378498047,TR -2378498048,2378500607,US -2378500608,2378500863,GB -2378500864,2378694655,US -2378694656,2378760191,DE -2378760192,2378825727,AT -2378825728,2378891263,US -2378891264,2378956799,AT -2378956800,2379131391,US -2379131392,2379131647,IN -2379131648,2379218943,US -2379218944,2379284479,FI -2379284480,2380201983,US -2380201984,2380267519,KR -2380267520,2380398591,US -2380398592,2380420095,IL -2380420096,2380420863,GB -2380420864,2380423167,IL -2380423168,2380427263,US -2380427264,2380428799,GB -2380428800,2380430847,IL -2380430848,2380431103,GB -2380431104,2380431615,IL -2380431616,2380431871,US -2380431872,2380432127,TH -2380432128,2380432383,US -2380432384,2380433407,IL -2380433408,2380434175,US -2380434176,2380434431,IL -2380434432,2380435455,US -2380435456,2380455935,IL -2380455936,2380456447,US -2380456448,2380456959,IL -2380456960,2380457215,NL -2380457216,2380457727,US -2380457728,2380457983,HK -2380457984,2380464127,IL -2380464128,2380464639,FR -2380464640,2380465151,US -2380465152,2380465439,FR -2380465440,2380465443,SG -2380465444,2380529663,FR -2380529664,2380558335,GB -2380558336,2380562431,ZA -2380562432,2380595199,GB -2380660736,2380726271,US -2380726272,2380791807,GB -2380791808,2381119487,US -2381119488,2381185023,GR -2381185024,2381381631,US -2381381632,2381447167,GB -2381447168,2381512703,US -2381512704,2381578239,AU -2381578240,2381643775,AT -2381643776,2381709311,GB -2381709312,2381905919,US -2381905920,2381971455,CH -2381971456,2382036991,IT -2382036992,2382102527,US -2382102528,2382168063,NL -2382168064,2382233599,BE -2382233600,2382299135,US -2382299136,2382331903,GR -2382331904,2382335999,FR -2382336000,2382340095,NL -2382340096,2382342143,CH -2382342144,2382344191,AT -2382344192,2382346239,NL -2382346240,2382348287,SE -2382348288,2382364671,SI -2382364672,2382368767,US -2382368768,2382372863,CA -2382372864,2382381055,US -2382381056,2382383209,CA -2382383210,2382383210,AE -2382383211,2382385151,CA -2382385152,2382401535,US -2382401536,2382405631,CA -2382405632,2382422015,US -2382422016,2382426111,JM -2382426112,2382430207,US -2382430208,2382626815,CA -2382626816,2382654207,US -2382654208,2382654463,CN -2382654464,2382657023,US -2382657024,2382657535,CN -2382657536,2382657791,US -2382657792,2382658559,CN -2382658560,2382658815,CA -2382658816,2382675967,US -2382675968,2382676107,CA -2382676108,2382676111,US -2382676112,2382677987,CA -2382677988,2382677991,US -2382677992,2382678015,CA -2382678016,2382678527,US -2382678528,2382679150,CA -2382679151,2382679151,IO -2382679152,2382679342,CA -2382679343,2382679343,IO -2382679344,2382684159,CA -2382684160,2382692351,US -2382692352,2383085567,CA -2383085568,2383151103,US -2383151104,2385031167,CA -2385031168,2385032191,BR -2385032192,2385032703,CA -2385032704,2385035263,BR -2385035264,2385293087,CA -2385293088,2385293111,US -2385293112,2385307727,CA -2385307728,2385307735,US -2385307736,2385903615,CA -2385903616,2385908735,US -2385908736,2385909759,VG -2385909760,2385915903,US -2385915904,2385919999,CA -2385920000,2385952767,US -2385952768,2385954815,BM -2385954816,2385955839,US -2385955840,2385956863,TC -2385956864,2385969151,US -2385969152,2386624511,CA -2386624512,2386690047,US -2386690048,2386988287,CA -2386988288,2386988543,CH -2386988544,2386989055,CA -2386989056,2386989311,CH -2386989312,2387003391,CA -2387003392,2387003647,CH -2387003648,2387003903,CA -2387003904,2387004159,CH -2387004160,2387344127,CA -2387344128,2387344895,US -2387344896,2387345151,CA -2387345152,2387345407,US -2387345408,2387410943,CA -2387410944,2387476479,US -2387476480,2387542015,CA -2387542016,2387607551,US -2387607552,2388328447,CA -2388328448,2388330495,US -2388330496,2388332543,NL -2388332544,2388350207,US -2388350208,2388350463,LK -2388350464,2388359167,US -2388359168,2388361215,NL -2388361216,2388367359,US -2388367360,2388369407,NL -2388369408,2388393983,US -2388393984,2389245951,CA -2389245952,2389311487,US -2389311488,2389639167,CA -2389639168,2389671935,US -2389671936,2389688319,CN -2389688320,2389704703,US -2389704704,2390818815,CA -2390818816,2390884351,US -2390884352,2390995455,CA -2390995456,2391015423,US -2391015424,2391277567,CA -2391277568,2391343103,US -2391343104,2391998463,CA -2391998464,2392002303,US -2392002304,2392010751,CA -2392010752,2392011263,US -2392011264,2392011519,CA -2392011520,2392011775,US -2392011776,2392012543,CA -2392012544,2392014079,US -2392014080,2392014335,CA -2392015360,2392015871,CA -2392015872,2392017407,US -2392017408,2392017663,CA -2392017664,2392018431,US -2392018432,2392018687,CA -2392018688,2392018943,US -2392018944,2392019199,CA -2392019200,2392019455,US -2392019456,2392019711,CA -2392019712,2392021759,US -2392021760,2392022015,NL -2392022016,2392022271,FR -2392022272,2392022527,DE -2392022528,2392022783,GB -2392022784,2392024063,US -2392024064,2392024319,CA -2392024320,2392024575,US -2392024576,2392025087,VI -2392025088,2392063999,US -2392064000,2392096767,CA -2392096768,2392129535,US -2392129536,2392457215,CA -2392457216,2392489983,SA -2392489984,2392514559,US -2392514560,2394947583,CA -2394947584,2395013119,US -2395013120,2395209727,CA -2395209728,2395340799,US -2395340800,2395807743,CA -2395807744,2395815935,US -2395815936,2395841023,CA -2395841024,2395841535,GB -2395841536,2397700095,CA -2397700096,2397708287,US -2397708288,2397710335,NL -2397710336,2397765631,US -2397765632,2398748671,CA -2398748672,2398945279,US -2398945280,2399010815,CA -2399010816,2399109119,US -2399109120,2399141887,PR -2399141888,2399148031,BR -2399148032,2399149055,DO -2399149056,2399150079,BR -2399150080,2399151103,BQ -2399151104,2399158271,BR -2399158272,2399159295,AR -2399159296,2399161343,BR -2399161344,2399163391,AR -2399163392,2399165439,BR -2399165440,2399166463,CO -2399166464,2399167487,VE -2399167488,2399167743,AR -2399167744,2399167999,BO -2399168000,2399168511,CO -2399168512,2399169535,SV -2399169536,2399170559,CO -2399170560,2399182847,BR -2399182848,2399183871,CR -2399183872,2399184895,BR -2399184896,2399185919,AR -2399185920,2399186943,TT -2399186944,2399202303,BR -2399202304,2399202591,HN -2399202592,2399202623,NL -2399202624,2399203031,HN -2399203032,2399203039,UY -2399203040,2399203327,HN -2399203328,2399204351,CL -2399204352,2399205375,AR -2399205376,2399206399,PE -2399206400,2399207423,BR -2399207424,2401828863,US -2401828864,2401894399,GB -2401894400,2402222079,US -2402222080,2402287615,IE -2402287616,2402418687,US -2402418688,2402484223,AT -2402484224,2402549759,FI -2402549760,2402680831,GB -2402680832,2402746367,BR -2402746368,2402945023,US -2402945024,2402945279,GB -2402945280,2403401727,US -2403401728,2403467263,GB -2403467264,2404974591,US -2404974592,2405040127,HK -2405040128,2405105663,JP -2405105664,2405171199,US -2405171200,2405236735,AU -2405236736,2405302271,DE -2405302272,2405367807,JP -2405367808,2405433343,US -2405433344,2405498879,NZ -2405498880,2405564415,NO -2405564416,2405629951,US -2405629952,2405695487,CH -2405695488,2406088703,US -2406088704,2406285311,BR -2406285312,2406809599,US -2406809600,2406875135,GB -2406875136,2406940671,SE -2406940672,2407006207,AU -2407006208,2407071743,US -2407071744,2407137279,NL -2407137280,2407333887,US -2407333888,2407399423,JP -2407399424,2407464959,FR -2407464960,2407530495,US -2407530496,2407596031,ZA -2407596032,2407661567,BE -2407661568,2407727103,AT -2407727104,2408054783,US -2408054784,2408120319,JP -2408120320,2408125439,BR -2408125440,2408126463,AR -2408126464,2408127487,NI -2408127488,2408140799,BR -2408140800,2408141823,DO -2408141824,2408144895,BR -2408144896,2408145919,CO -2408145920,2408147967,BR -2408147968,2408148991,MX -2408148992,2408150015,BO -2408150016,2408157183,BR -2408157184,2408158207,PE -2408158208,2408159231,CR -2408159232,2408162303,BR -2408162304,2408164279,HN -2408164280,2408164287,IT -2408164288,2408164351,HN -2408165376,2408169471,BR -2408169472,2408170495,TT -2408170496,2408178687,BR -2408178688,2408178695,IT -2408178696,2408179375,HN -2408179376,2408179391,IT -2408179392,2408179423,HN -2408179424,2408179431,IT -2408179432,2408179711,HN -2408179712,2408182783,BR -2408182784,2408183807,AR -2408183808,2408185855,BR -2408185856,2409562111,US -2409562112,2409568255,GB -2409568256,2409569279,US -2409569280,2409599231,GB -2409599232,2409599487,US -2409599488,2409612799,GB -2409612800,2409613311,US -2409613312,2409617407,GB -2409617408,2409618431,US -2409618432,2409621503,GB -2409621504,2409622527,US -2409622528,2409623039,GB -2409623040,2409624575,US -2409624576,2409627647,GB -2409627648,2409693183,ZA -2409693184,2409758719,AT -2409758720,2409824255,US -2409824256,2409955327,DE -2409955328,2410086399,US -2410086400,2410151935,GB -2410151936,2410217471,US -2410217472,2410283007,BE -2410283008,2410348543,US -2410414080,2410545151,US -2410545152,2410610687,AU -2410610688,2410676223,US -2410676224,2410938367,NL -2410938368,2411003903,CH -2411003904,2411363583,US -2411363584,2411363839,GB -2411363840,2411462655,US -2411462656,2411528191,AU -2411528192,2411593727,JP -2411593728,2411749375,US -2411749376,2411753471,MY -2411753472,2411757567,SG -2411757568,2411986943,US -2411986944,2412052479,FR -2412052480,2412314623,US -2412380160,2412383231,BR -2412383232,2412384255,CL -2412384256,2412387327,AR -2412387328,2412388351,BR -2412388352,2412389375,AR -2412389376,2412399615,BR -2412399616,2412400639,MX -2412400640,2412402687,BR -2412402688,2412403711,AR -2412403712,2412404735,BR -2412404736,2412405759,AR -2412405760,2412414975,BR -2412414976,2412415999,AR -2412416000,2412417023,CL -2412417024,2412418047,AR -2412418048,2412419071,BR -2412419072,2412420095,PA -2412420096,2412421119,MX -2412421120,2412422143,CR -2412422144,2412429311,BR -2412429312,2412430335,AR -2412430336,2412431359,HN -2412431360,2412432383,AR -2412432384,2412433407,MX -2412433408,2412433663,PY -2412433664,2412433919,BR -2412433920,2412434431,PY -2412434432,2412444671,BR -2412444672,2412445695,NI -2412445696,2412576767,US -2412576768,2412642303,AT -2412642304,2412773375,US -2412773376,2412777471,BR -2412777472,2412778495,HN -2412778496,2412782591,BR -2412782592,2412783615,AR -2412783616,2412784639,BR -2412784640,2412786687,AR -2412786688,2412787711,CL -2412787712,2412788735,GT -2412788736,2412789759,BR -2412789760,2412790783,CO -2412790784,2412807167,BR -2412807168,2412808191,PE -2412808192,2412815359,BR -2412815360,2412816383,DO -2412816384,2412817407,CR -2412817408,2412819455,BR -2412819456,2412820479,GT -2412820480,2412838911,BR -2412838912,2412904447,US -2412904448,2412969983,GB -2412969984,2413297663,US -2413297664,2413363199,AU -2413363200,2413428735,SE -2413428736,2413494271,AU -2413494272,2413625343,US -2413625344,2413690879,JP -2413690880,2413758463,US -2413758464,2413758975,GB -2413758976,2413759487,US -2413759488,2413759743,GB -2413759744,2413821951,US -2413821952,2413887487,AT -2413887488,2413953023,IT -2413953024,2414411775,US -2414411776,2414477311,GR -2414477312,2414542847,GB -2414542848,2414673919,US -2414673920,2414739455,SE -2414739456,2414804991,AU -2414804992,2414870527,IE -2414870528,2415198207,US -2415198208,2415263743,AT -2415263744,2415394815,US -2415394816,2415460351,KR -2415460352,2415656959,US -2415656960,2415722495,GB -2415722496,2415788031,JP -2415788032,2415853567,US -2415853568,2415859711,BR -2415859712,2415860735,CL -2415860736,2415861759,CR -2415861760,2415862783,HN -2415862784,2415863807,AR -2415863808,2415864831,MX -2415864832,2415867903,BR -2415867904,2415868927,MX -2415868928,2415875071,BR -2415875072,2415876095,VE -2415876096,2415880191,BR -2415880192,2415881215,CL -2415881216,2415888383,BR -2415888384,2415889407,AR -2415889408,2415890431,PY -2415890432,2415892479,BR -2415892480,2415893503,AR -2415893504,2415894527,PA -2415894528,2415898623,BR -2415898624,2415899647,CL -2415899648,2415904767,BR -2415904768,2415905023,US -2415905024,2415917055,BR -2415917056,2415918079,EC -2415918080,2415919103,BR -2415919104,2415984639,CN -2416050176,2416058367,US -2416058368,2416066559,IE -2416066560,2416082943,CH -2416082944,2416083967,GB -2416083968,2416084223,US -2416084224,2416084991,GB -2416084992,2416085247,AU -2416085248,2416085503,GB -2416085504,2416085759,US -2416085760,2416086015,GB -2416086016,2416086271,SG -2416086272,2416087039,GB -2416087040,2416091135,US -2416091136,2416093183,ES -2416093184,2416095231,NL -2416095232,2416111615,US -2416111616,2416113663,IE -2416113664,2416114687,ES -2416114688,2416115711,NL -2416115712,2416181247,US -2416181248,2416246783,FI -2416246784,2416261993,US -2416261994,2416261994,TH -2416261995,2416312319,US -2416312320,2416377855,AU -2416377856,2416443391,CN -2416443392,2416705535,US -2416705536,2416771071,CN -2416771072,2416916479,US -2416916480,2416916991,SG -2416916992,2416967679,US -2416967680,2417033215,IN -2417033216,2417229823,US -2417229824,2417295359,ES -2417295360,2417360895,US -2417360896,2417491967,CR -2417491968,2417557503,GB -2417557504,2417688575,US -2417688576,2417754111,SE -2417754112,2418016255,US -2418016256,2418081791,GB -2418081792,2418278655,US -2418278656,2418278911,ZA -2418278912,2418279487,US -2418279488,2418279491,ES -2418279492,2418281151,US -2418281152,2418281215,IN -2418281216,2418281983,US -2418281984,2418282239,ES -2418282240,2418284543,US -2418284544,2418285055,CA -2418285056,2418285567,MX -2418285568,2418286335,US -2418286336,2418286591,MX -2418286592,2418287103,CA -2418287104,2418287295,US -2418287296,2418287359,GB -2418287360,2418291199,US -2418291200,2418292223,AR -2418292224,2418292735,PH -2418292736,2418294015,US -2418294016,2418294783,AR -2418294784,2418294911,US -2418294912,2418295039,GB -2418295040,2418295807,US -2418295808,2418295935,GB -2418295936,2418295947,US -2418295948,2418295951,GB -2418295952,2418296063,US -2418296064,2418296319,DE -2418296320,2418297343,IN -2418297344,2418297855,US -2418297856,2418298367,BR -2418298368,2418298623,ZA -2418298624,2418301439,US -2418301440,2418301695,PH -2418301696,2418302463,US -2418302464,2418302719,PH -2418302720,2418302975,US -2418302976,2418303231,IN -2418303232,2418303487,ZA -2418303488,2418303871,US -2418303872,2418303879,GB -2418303880,2418304511,US -2418304512,2418304671,GB -2418304672,2418304767,US -2418304768,2418304895,DE -2418304896,2418305151,US -2418305152,2418305279,IN -2418305280,2418305535,ES -2418305536,2418306303,US -2418306304,2418306559,GB -2418306560,2418307327,MU -2418307328,2418307455,US -2418307456,2418307583,PH -2418307584,2418308095,LV -2418308096,2418308351,PH -2418308352,2418308383,GB -2418308384,2418308607,US -2418308608,2418309119,RO -2418309120,2418309631,PL -2418309632,2418310143,US -2418310144,2418310655,PH -2418310656,2418311167,US -2418311168,2418311679,IN -2418311680,2418312703,CZ -2418312704,2418313215,IN -2418313216,2418314239,PH -2418314240,2418314751,IN -2418314752,2418315007,PH -2418315008,2418315135,IN -2418315136,2418315263,US -2418315264,2418315775,IN -2418315776,2418316287,CN -2418316288,2418316799,IN -2418316800,2418317055,AU -2418317056,2418317311,JP -2418317312,2418317823,PH -2418317824,2418318079,US -2418318080,2418318335,IN -2418318336,2418319871,PH -2418319872,2418320127,KR -2418320128,2418320191,US -2418320192,2418320255,AU -2418320256,2418320319,IN -2418320320,2418320383,PH -2418320384,2418321407,US -2418321408,2418322431,PH -2418322432,2418322687,US -2418322688,2418322847,IN -2418322848,2418323455,US -2418323456,2418323711,IN -2418323712,2418323967,US -2418323968,2418324479,IN -2418324480,2418324735,PH -2418324736,2418324799,IN -2418324800,2418324991,US -2418324992,2418326015,IN -2418326016,2418326527,PH -2418326528,2418327039,IN -2418327040,2418327423,US -2418327424,2418327487,PH -2418327488,2418328063,US -2418328064,2418328831,SK -2418328832,2418329599,US -2418329600,2418330367,SK -2418330368,2418331135,US -2418331136,2418331647,IN -2418331648,2418332159,US -2418332160,2418332671,IN -2418332672,2418333183,PH -2418333184,2418334207,IN -2418334208,2418334463,CN -2418334464,2418334719,PH -2418334720,2418339071,IN -2418339072,2418339839,MU -2418339840,2418340351,CN -2418340352,2418340863,US -2418340864,2418341375,IN -2418341376,2418341887,PH -2418341888,2418342911,IN -2418342912,2418343423,PH -2418343424,2418343935,IN -2418343936,2418606079,US -2418606080,2418671615,DE -2418671616,2418737151,US -2418737152,2418802687,NL -2418868224,2419064831,US -2419064832,2419065855,BD -2419065856,2419067903,HK -2419067904,2419068927,CN -2419068928,2419069951,NL -2419069952,2419071999,VN -2419072000,2419073023,PH -2419073024,2419074047,HK -2419074048,2419074303,AU -2419074304,2419074559,IN -2419074560,2419075071,AU -2419075072,2419077119,KR -2419077120,2419079167,IN -2419079168,2419080191,CN -2419080192,2419080703,GB -2419080704,2419081215,SG -2419081216,2419082239,CN -2419082240,2419083263,HK -2419083264,2419085311,IN -2419085312,2419086079,MM -2419086080,2419086335,AU -2419086336,2419087359,BD -2419087360,2419088383,CN -2419088384,2419089407,KR -2419089408,2419089919,AU -2419089920,2419090175,KR -2419090176,2419090431,JP -2419090432,2419091455,KR -2419091456,2419091711,US -2419091712,2419091967,SG -2419091968,2419092479,US -2419092480,2419094527,BD -2419095552,2419096575,PK -2419096576,2419097599,HK -2419097600,2419099647,PK -2419099648,2419100671,SG -2419100672,2419101695,HK -2419101696,2419102719,MY -2419102720,2419103743,BD -2419103744,2419104767,AU -2419104768,2419105791,CN -2419105792,2419106815,BD -2419106816,2419107839,AU -2419107840,2419108863,IN -2419108864,2419109887,CN -2419109888,2419110911,IN -2419110912,2419112959,CN -2419112960,2419116031,HK -2419116032,2419117055,PH -2419117056,2419120127,CN -2419120128,2419121151,HK -2419121152,2419122175,CN -2419122176,2419123199,IN -2419123200,2419124223,SG -2419124224,2419125247,AU -2419125248,2419127295,HK -2419127296,2419128319,AU -2419128320,2419129343,IN -2419129344,2419130367,CN -2419130368,2419326975,US -2419326976,2419392511,CN -2419392512,2419458047,AU -2419458048,2419523583,NL -2419523584,2419589119,AU -2419589120,2419654655,FR -2419654656,2419720191,SE -2419720192,2420047871,US -2420047872,2420113407,SE -2420113408,2420178943,PT -2420178944,2420244479,AT -2420244480,2420310015,NZ -2420310016,2420899839,US -2420899840,2420932299,DE -2420932300,2420932300,NL -2420932301,2420965375,DE -2420965376,2421096447,US -2421161984,2421293055,US -2421293056,2421358591,GB -2421358592,2421424127,US -2421424128,2421489663,NO -2421489664,2421555199,CH -2421555200,2421620735,US -2421620736,2421686271,GB -2421686272,2422145023,US -2422145024,2422154239,NL -2422154240,2422155263,US -2422155264,2422161407,NL -2422161408,2422163455,GB -2422163456,2422165503,US -2422165504,2422167551,HK -2422167552,2422210559,NL -2422210560,2422276095,US -2422276096,2422341631,AU -2422341632,2422407167,GB -2422407168,2423128063,US -2423128064,2423193599,AU -2423193600,2423717887,US -2423717888,2423783423,NL -2423783424,2423848959,FJ -2423848960,2423914495,US -2423914496,2423980031,TR -2423980032,2424045567,CN -2424045568,2424111103,GB -2424111104,2424242175,US -2424242176,2424307711,NO -2424307712,2424438783,US -2424438784,2424471551,AU -2424471552,2424475647,US -2424475648,2425159679,AU -2425159680,2425421823,US -2425421824,2425487359,DE -2425487360,2426667007,US -2426667008,2426732543,NO -2426732544,2426798079,FR -2426798080,2426942463,US -2426942464,2426943487,CA -2426943488,2426961919,US -2426961920,2426994687,CA -2426994688,2427224063,US -2427224064,2427256831,CA -2427256832,2427322367,GB -2427322368,2427453439,US -2427453440,2427536895,NO -2427536896,2427537151,US -2427537152,2427584511,NO -2427584512,2427584579,US -2427584580,2427584639,GB -2427584640,2427584677,US -2427584678,2427584679,GB -2427584680,2427584743,US -2427584744,2427584765,CA -2427584766,2427584767,GB -2427584768,2427584807,US -2427584808,2427584831,GB -2427584832,2427584851,US -2427584852,2427584895,GB -2427584896,2427584903,US -2427584904,2427585023,GB -2427585024,2427585097,US -2427585098,2427585151,GB -2427585152,2427585235,US -2427585236,2427585271,CA -2427585272,2427585275,BR -2427585276,2427585277,MX -2427585278,2427585279,GB -2427585280,2427585313,US -2427585314,2427585343,GB -2427585344,2427585377,US -2427585378,2427585407,GB -2427585408,2427585431,US -2427585432,2427585471,GB -2427585472,2427585527,US -2427585528,2427585631,GB -2427585632,2427585663,ES -2427585664,2427585679,SE -2427585680,2427585683,TR -2427585684,2427585695,GB -2427585696,2427585711,AE -2427585712,2427585791,GB -2427585792,2427585799,NL -2427585800,2427585863,IT -2427585864,2427585887,GB -2427585888,2427585917,DE -2427585918,2427585919,GB -2427585920,2427585959,FR -2427585960,2427585983,GB -2427585984,2427585989,NL -2427585990,2427585999,GB -2427586000,2427586007,CH -2427586008,2427586015,GB -2427586016,2427586017,BE -2427586018,2427586047,GB -2427586048,2427586057,JP -2427586058,2427586059,GB -2427586060,2427586061,JP -2427586062,2427586063,GB -2427586064,2427586065,JP -2427586066,2427586111,GB -2427586112,2427586123,HK -2427586124,2427586129,GB -2427586130,2427586131,SG -2427586132,2427586145,GB -2427586146,2427586147,TW -2427586148,2427586151,GB -2427586152,2427586153,MO -2427586154,2427586175,GB -2427586176,2427586217,AU -2427586218,2427586219,GB -2427586220,2427586221,AU -2427586222,2427586303,GB -2427586304,2427586309,AU -2427586310,2427586311,US -2427586312,2427586337,AU -2427586338,2427586339,US -2427586340,2427586341,AU -2427586342,2427586343,US -2427586344,2427586345,AU -2427586346,2427586347,GB -2427586348,2427586349,AU -2427586350,2427591679,GB -2427591680,2427591936,US -2427591937,2427591937,GB -2427591938,2427591945,US -2427591946,2427591946,AT -2427591947,2427591947,BE -2427591948,2427591948,CZ -2427591949,2427591949,DK -2427591950,2427591950,FI -2427591951,2427591951,FR -2427591952,2427591952,DE -2427591953,2427591953,HU -2427591954,2427591954,IT -2427591955,2427591955,NO -2427591956,2427591956,PL -2427591957,2427591957,PT -2427591958,2427591958,RU -2427591959,2427591959,SA -2427591960,2427591960,ES -2427591961,2427591961,SE -2427591962,2427591962,CH -2427591963,2427591963,NL -2427591964,2427591964,TR -2427591965,2427591965,AE -2427591966,2427591999,US -2427592000,2427592015,IE -2427592016,2427592031,IL -2427592032,2427592047,IN -2427592048,2427592191,US -2427592192,2427592207,SG -2427592208,2427592223,JP -2427592224,2427592239,AU -2427592240,2427592255,CN -2427592256,2427617279,GB -2427617280,2427633663,ES -2427633664,2427650047,GB -2427650048,2427846655,NO -2427846656,2428567551,US -2428567552,2428633087,NO -2428633088,2428698623,CA -2428698624,2428960767,US -2428960768,2429026303,MY -2429026304,2429091839,CH -2429091840,2429288447,US -2429288448,2429353983,FR -2429353984,2429419519,AU -2429419520,2429485055,RU -2429485056,2429550591,US -2429550592,2429566975,AT -2429566976,2429571071,US -2429571072,2429572095,CA -2429572096,2429573119,US -2429573120,2429573375,CA -2429573376,2429575167,US -2429575168,2429577215,CA -2429577216,2429579263,US -2429579264,2429580287,CA -2429580288,2429583359,US -2429583360,2429616127,AT -2429616128,2429643519,NL -2429643520,2429643775,RU -2429643776,2429681663,NL -2429681664,2429796607,US -2429796608,2429797375,GB -2429797376,2429878271,US -2429878272,2429943807,JP -2429943808,2430009343,HK -2430009344,2430140415,US -2430140416,2430152552,CA -2430152553,2430152553,US -2430152554,2430168575,CA -2430168576,2430168591,US -2430168592,2430205951,CA -2430271488,2430918655,US -2430918656,2430922751,BR -2430922752,2431845631,US -2431845632,2431845887,SG -2431845888,2431846143,US -2431846144,2431846399,GB -2431846400,2432172031,US -2432172032,2432237567,BE -2432237568,2432565247,US -2432565248,2432630783,NL -2432630784,2432696319,CN -2432696320,2432794623,NL -2432794624,2432827391,ES -2432827392,2433247231,NL -2433247232,2433247487,GB -2433247488,2433614847,NL -2433614848,2433617919,SI -2433617920,2433626111,EE -2433626112,2433628159,SI -2433628160,2433630207,NL -2433630208,2433638399,GB -2433638400,2433646591,SE -2433646592,2433647359,DE -2433647360,2433647615,US -2433647616,2433648639,CA -2433648640,2433650687,DE -2433650688,2433654783,US -2433654784,2433662975,IT -2433662976,2433667071,DE -2433667072,2433671167,CH -2433671168,2433675263,DE -2433675264,2433677311,PL -2433677312,2433679359,AT -2433679360,2433810431,NL -2433810432,2433875967,GB -2433875968,2435055615,NL -2435055616,2435121151,GB -2435121152,2436300799,NL -2436300800,2436366335,GB -2436366336,2436628479,NL -2436628480,2436630527,BE -2436630528,2436632575,NL -2436632576,2436634623,DK -2436634624,2436694015,BE -2436694016,2436759551,NL -2436759552,2436767743,GB -2436767744,2436767999,NL -2436768000,2436775935,GB -2436775936,2436784127,DE -2436784128,2436825087,GB -2436825088,2441196707,NL -2441196708,2441196708,BE -2441196709,2446983167,NL -2447048704,2447376383,NL -2447376384,2447441919,GB -2447441920,2447507455,DE -2447507456,2447572991,FR -2447572992,2447638527,GB -2447638528,2447704063,DE -2447704064,2447769599,GB -2447769600,2447835135,DE -2447835136,2447900671,FR -2447900672,2447966207,CH -2447966208,2448031743,GB -2448031744,2448097279,CH -2448097280,2448162815,SE -2448162816,2448183295,HU -2448183296,2448183551,BG -2448183552,2448228351,HU -2448228352,2448293887,PL -2448293888,2448359423,FR -2448359424,2448360447,DE -2448360448,2448361471,GB -2448361472,2448363583,FR -2448363584,2448363711,PL -2448363712,2448363839,FR -2448363840,2448363903,PL -2448363904,2448363967,FR -2448363968,2448364159,PL -2448364160,2448364231,FR -2448364232,2448364239,PL -2448364240,2448364287,FR -2448364288,2448364351,PL -2448364352,2448364415,FR -2448364416,2448364543,PL -2448364544,2448364607,FR -2448364608,2448364735,PL -2448364736,2448364863,FR -2448364864,2448364927,PL -2448364928,2448365047,FR -2448365048,2448365051,PL -2448365052,2448365183,FR -2448365184,2448365247,PL -2448365248,2448365311,FR -2448365312,2448365375,PL -2448365376,2448365439,FR -2448365440,2448365503,PL -2448365504,2448365631,FR -2448365632,2448365695,PL -2448365696,2448365759,FR -2448365760,2448365823,PL -2448365824,2448365951,FR -2448365952,2448366015,PL -2448366016,2448366143,FR -2448366144,2448366271,PL -2448366272,2448366591,FR -2448366592,2448367615,PL -2448367616,2448369507,FR -2448369508,2448369511,DE -2448369512,2448369887,FR -2448369888,2448369903,GB -2448369904,2448370015,FR -2448370016,2448370047,FI -2448370048,2448370719,FR -2448370720,2448370727,ES -2448370728,2448371031,FR -2448371032,2448371039,ES -2448371040,2448372031,FR -2448372032,2448372047,ES -2448372048,2448373087,FR -2448373088,2448373095,ES -2448373096,2448374335,FR -2448374336,2448374351,ES -2448374352,2448374399,FR -2448374400,2448374527,GB -2448374528,2448374747,FR -2448374748,2448374751,GB -2448374752,2448375759,FR -2448375760,2448375775,ES -2448375776,2448379903,FR -2448379904,2448383999,PL -2448384000,2448386047,FR -2448386048,2448386175,GB -2448386176,2448387199,FR -2448387200,2448387327,DE -2448387328,2448387359,FR -2448387360,2448387391,CZ -2448387392,2448387527,FR -2448387528,2448387535,ES -2448387536,2448388351,FR -2448388352,2448388479,ES -2448388480,2448389631,FR -2448389632,2448389759,NL -2448389760,2448389887,GB -2448389888,2448390399,FR -2448390400,2448390527,ES -2448390528,2448390655,DE -2448390656,2448390911,FR -2448390912,2448391039,IE -2448391040,2448391167,FR -2448391168,2448391175,ES -2448391176,2448393471,FR -2448393472,2448393983,PL -2448393984,2448394239,FR -2448394240,2448394303,DE -2448394304,2448394463,FR -2448394464,2448394479,DE -2448394480,2448394767,FR -2448394768,2448394771,DE -2448394772,2448394775,FR -2448394776,2448394783,DE -2448394784,2448394943,FR -2448394944,2448395007,DE -2448395008,2448395011,FR -2448395012,2448395015,DE -2448395016,2448395047,FR -2448395048,2448395051,DE -2448395052,2448397311,FR -2448397312,2448398335,DE -2448398336,2448401847,FR -2448401848,2448401855,GB -2448401856,2448401879,FR -2448401880,2448401887,ES -2448401888,2448402783,FR -2448402784,2448402799,ES -2448402800,2448402935,FR -2448402936,2448402943,ES -2448402944,2448403071,GB -2448403072,2448403199,FR -2448403200,2448403455,GB -2448403456,2448404183,FR -2448404184,2448404191,ES -2448404192,2448404415,FR -2448404416,2448404447,GB -2448404448,2448404479,FR -2448404480,2448404511,GB -2448404512,2448405359,FR -2448405360,2448405367,ES -2448405368,2448406623,FR -2448406624,2448406655,FI -2448406656,2448407511,FR -2448407512,2448407519,ES -2448407520,2448407807,FR -2448407808,2448407935,ES -2448407936,2448410623,FR -2448410624,2448410687,GB -2448410688,2448411003,FR -2448411004,2448411007,GB -2448411008,2448411183,FR -2448411184,2448411199,GB -2448411200,2448411439,FR -2448411440,2448411455,GB -2448411456,2448411647,FR -2448411648,2448412415,GB -2448412416,2448412671,FR -2448412672,2448412799,DE -2448412800,2448413855,FR -2448413856,2448413887,FI -2448413888,2448413919,FR -2448413920,2448413927,ES -2448413928,2448414375,FR -2448414376,2448414383,ES -2448414384,2448414591,FR -2448414592,2448414719,DE -2448414720,2448414751,FR -2448414752,2448414783,PL -2448414784,2448414893,FR -2448414894,2448414894,PL -2448414895,2448415487,FR -2448415488,2448415615,IT -2448415616,2448415983,FR -2448415984,2448415991,ES -2448415992,2448417311,FR -2448417312,2448417319,ES -2448417320,2448417967,FR -2448417968,2448417975,ES -2448417976,2448418559,FR -2448418560,2448418687,NL -2448418688,2448418783,FR -2448418784,2448418791,ES -2448418792,2448419087,FR -2448419088,2448419091,DE -2448419092,2448419263,FR -2448419264,2448419327,DE -2448419328,2448419767,FR -2448419768,2448419771,DE -2448419772,2448419799,FR -2448419800,2448419807,DE -2448419808,2448419839,FR -2448419840,2448419903,PL -2448419904,2448419975,FR -2448419976,2448419979,PL -2448419980,2448419987,FR -2448419988,2448419991,PL -2448419992,2448420031,FR -2448420032,2448420095,PL -2448420096,2448420159,FR -2448420160,2448420415,PL -2448420416,2448420543,FR -2448420544,2448420607,PL -2448420608,2448420671,FR -2448420672,2448420735,PL -2448420736,2448420783,FR -2448420784,2448420863,PL -2448420864,2448421887,FR -2448421888,2448422911,DE -2448422912,2448423167,FR -2448423168,2448423423,GB -2448423424,2448423679,FR -2448423680,2448424959,GB -2448424960,2448490495,FR -2448490496,2448556031,AT -2448556032,2448621567,FR -2448621568,2448687103,DE -2448687104,2448752639,AT -2448752640,2448818175,CH -2448818176,2448850943,GB -2448850944,2448851967,US -2448851968,2448883711,GB -2448883712,2448949247,FI -2448949248,2449014783,FR -2449014784,2449031167,IR -2449031168,2449039359,SY -2449039360,2449041407,RO -2449041408,2449042431,NL -2449042432,2449042687,GB -2449042944,2449043199,RO -2449043200,2449043455,FR -2449043456,2449043967,MD -2449043968,2449044223,GB -2449044224,2449044479,RU -2449044480,2449045503,GB -2449045504,2449080319,KZ -2449080320,2449145855,CH -2449145856,2449211391,SE -2449211392,2449276927,CH -2449276928,2449407999,DE -2449408000,2449420287,RU -2449420288,2449422335,DE -2449422336,2449424383,DK -2449424384,2449440767,OM -2449440768,2449442815,NL -2449442816,2449444863,RU -2449444864,2449448959,SK -2449448960,2449457151,KZ -2449457152,2449465343,BG -2449465344,2449467391,GB -2449467392,2449469439,RU -2449469440,2449471487,GB -2449471488,2449473535,RU -2449473536,2449477631,DE -2449477632,2449479679,AL -2449479680,2449481727,FR -2449481728,2449485567,DE -2449485568,2449485823,PL -2449485824,2449487871,IE -2449487872,2449488383,GB -2449488384,2449488895,LU -2449488896,2449489919,KZ -2449489920,2449490943,FR -2449490944,2449491199,DE -2449491200,2449491967,FR -2449491968,2449494015,NL -2449494016,2449496063,UA -2449496064,2449498111,FR -2449498112,2449506303,DE -2449506304,2449522687,LU -2449522688,2449526783,KZ -2449526784,2449527807,IT -2449527808,2449530879,LU -2449530880,2449539071,DE -2449539072,2449604607,US -2449604608,2449670143,NO -2449670144,2449735679,LU -2449735680,2449801215,CH -2449801216,2450194431,US -2450194432,2450259967,AU -2450259968,2450718719,US -2450718720,2450784255,FR -2450784256,2450849791,US -2450849792,2450915327,SE -2450915328,2451032063,US -2451032064,2451032575,AU -2451032576,2452619263,US -2452619264,2452684799,IT -2452684800,2452750335,US -2452750336,2452815871,NL -2452815872,2452881407,JP -2452881408,2452946943,DE -2452946944,2453143551,US -2453143552,2453192703,JP -2453192704,2453209087,CN -2453209088,2453274623,US -2453340160,2453405695,NO -2453405696,2453471231,DE -2453471232,2453536767,US -2453602304,2453667839,US -2453667840,2453733375,ZA -2453733376,2453798911,US -2453798912,2453800959,GB -2453800960,2453803007,RU -2453803008,2453805055,KZ -2453805056,2453807103,FI -2453807104,2453815295,GB -2453815296,2453831679,US -2453831680,2453833727,IR -2453833728,2453835775,ES -2453835776,2453837823,FR -2453837824,2453838591,LU -2453838592,2453838847,AT -2453838848,2453839359,SE -2453839360,2453839871,LU -2453839872,2453852159,RU -2453852160,2453856255,RO -2453856256,2453858303,DE -2453858304,2453860351,SE -2453860352,2453864447,ES -2453864448,2453929983,CH -2453929984,2454061055,US -2454061056,2454126591,GB -2454126592,2454149631,US -2454149632,2454150655,CA -2454150656,2454151167,AE -2454151168,2454192127,US -2454192128,2454257663,NO -2454257664,2454388735,US -2454388736,2454454271,SE -2454454272,2454519807,US -2454519808,2454585343,GB -2454585344,2454716415,US -2454716416,2454781951,GB -2454781952,2454847487,FI -2454847488,2454851583,US -2454851584,2454851839,DK -2454851840,2454853119,US -2454853120,2454853375,DK -2454853376,2454887423,US -2454887424,2454887679,DK -2454887680,2454905919,US -2454905920,2454905951,AR -2454905952,2454913023,US -2454913024,2454978559,CL -2454978560,2455175167,US -2455175168,2455240703,GB -2455240704,2455244799,US -2455244800,2455244943,AU -2455244944,2455244945,US -2455244946,2455245055,AU -2455245056,2455245311,US -2455245312,2455245567,AU -2455245568,2455245823,NL -2455245824,2455246847,AU -2455246848,2455247871,IN -2455247872,2455248127,AU -2455248128,2455248895,US -2455248896,2455257087,TH -2455257088,2455261183,PH -2455261184,2455262207,MY -2455262208,2455263231,KR -2455263232,2455265279,PH -2455265280,2455273471,US -2455273472,2455275519,AU -2455275520,2455277567,US -2455277568,2455278079,AU -2455278080,2455278591,NZ -2455278592,2455279615,US -2455279616,2455280127,MO -2455280128,2455280383,MY -2455280384,2455281663,MO -2455281664,2455285759,IN -2455285760,2455290879,US -2455290880,2455291903,MY -2455291904,2455293951,KH -2455293952,2455300095,US -2455300096,2455302143,FR -2455302144,2455371775,US -2455371776,2455437311,GB -2455437312,2455830527,US -2455830528,2455896063,GB -2455896064,2455961599,US -2455961600,2456027135,JP -2456027136,2456092671,IT -2456092672,2456158207,GB -2456158208,2456223743,CZ -2456223744,2456289279,BE -2456289280,2456354815,NL -2456354816,2456406015,GB -2456406016,2456408063,FR -2456408064,2456420351,GB -2456485888,2456551423,DE -2456551424,2456616959,AT -2456616960,2456682495,CH -2456682496,2456748031,HU -2456748032,2456813567,US -2456846336,2456846591,FR -2456846592,2456846847,CZ -2456862720,2456862975,NL -2456862976,2456863743,US -2456863744,2456863999,DE -2456864000,2456864255,HK -2456864256,2456864511,US -2456864512,2456864767,GB -2456864768,2456865791,US -2456865792,2456866047,AU -2456866048,2456866559,CA -2456866560,2456866815,ZA -2456866816,2456867071,JP -2456875264,2456875775,CA -2456875776,2456876031,JP -2456876032,2456876287,NL -2456876288,2456876543,US -2456876544,2456876799,ZA -2456876800,2456877311,US -2456877312,2456877567,AU -2456877568,2456877823,US -2456877824,2456878079,HK -2456879104,2457075711,US -2457075712,2457141247,AU -2457206784,2457272319,AU -2457272320,2457337855,FI -2457337856,2457339903,RU -2457339904,2457340927,BA -2457340928,2457341183,GB -2457341184,2457341951,BY -2457341952,2457342975,UZ -2457342976,2457343999,RU -2457344000,2457346047,UA -2457346048,2457348095,BY -2457348096,2457360383,RU -2457360384,2457360895,CZ -2457360896,2457361151,RU -2457361152,2457361407,CZ -2457361408,2457362175,RU -2457362176,2457362431,UA -2457362432,2457362687,GB -2457362688,2457362943,UA -2457362944,2457363455,RU -2457363456,2457363967,UA -2457363968,2457364479,GB -2457364480,2457365503,RU -2457365504,2457366015,CZ -2457366016,2457366527,RU -2457366528,2457367551,GB -2457367552,2457368575,RU -2457368576,2457370623,CZ -2457370624,2457376767,BY -2457376768,2457377791,DE -2457377792,2457378047,FR -2457378048,2457378815,DE -2457378816,2457380095,NL -2457380096,2457380863,RU -2457380864,2457381631,UA -2457381632,2457382399,RU -2457382400,2457382911,UA -2457382912,2457383935,RU -2457383936,2457384959,UA -2457384960,2457388543,RU -2457388544,2457388799,UA -2457388800,2457390591,CZ -2457390592,2457392127,RU -2457392128,2457392639,KG -2457392640,2457392895,PL -2457392896,2457393151,UA -2457393152,2457394175,RU -2457394176,2457394431,UA -2457394432,2457394687,RU -2457394688,2457394943,UA -2457394944,2457395455,RU -2457395456,2457395711,UA -2457395712,2457395967,CZ -2457395968,2457396223,RU -2457396224,2457397247,DE -2457397248,2457399295,RU -2457399296,2457399551,UA -2457399552,2457399807,RU -2457399808,2457400319,CZ -2457400320,2457400575,UA -2457400576,2457400831,CZ -2457400832,2457402367,RU -2457402368,2457403391,SY -2457403392,2457520895,US -2457520896,2457521151,BE -2457521152,2457599999,US -2457600000,2457665535,GR -2457665536,2458058751,US -2458058752,2458124287,CA -2458124288,2458189823,US -2458189824,2458255359,IT -2458255360,2458320895,BR -2458320896,2458386431,US -2458386432,2458451967,CH -2458451968,2458648575,US -2458648576,2458714111,DE -2458714112,2458779647,ZA -2458779648,2459631615,US -2459631616,2459697151,CL -2459697152,2459828223,US -2459828224,2459846655,RU -2459846656,2459847167,FR -2459847168,2459847679,UA -2459847680,2459848191,RU -2459848192,2459848703,FR -2459848704,2459860991,RU -2459860992,2459893759,ES -2459893760,2459959295,CH -2459959296,2460024831,JP -2460024832,2460090367,FI -2460090368,2460155903,GB -2460155904,2460221439,US -2460221440,2460286975,BR -2460286976,2460549119,US -2460549120,2460614655,GB -2460614656,2460680191,US -2460680192,2460745727,NZ -2460745728,2460811263,NO -2460811264,2460876799,SE -2460876800,2460942335,US -2460942336,2461007871,BE -2461007872,2461138943,GB -2461138944,2461204479,AU -2461204480,2461270015,GB -2461270016,2461401087,US -2461401088,2461466623,ZA -2461466624,2461597695,US -2461597696,2461599743,CH -2461599744,2461601791,SE -2461601792,2461605887,GB -2461605888,2461607935,LB -2461607936,2461609983,FR -2461609984,2461611007,BE -2461611008,2461611519,NL -2461611520,2461611775,BE -2461611776,2461612031,NL -2461612032,2461613567,IL -2461613568,2461613823,PS -2461613824,2461614079,IL -2461614080,2461622271,CH -2461622272,2461630463,DE -2461630464,2461646847,NL -2461646848,2461648895,RU -2461648896,2461649023,BY -2461649024,2461649919,RU -2461649920,2461650047,US -2461650048,2461650175,RS -2461650176,2461650303,PT -2461650304,2461650431,TW -2461650432,2461650559,MA -2461650560,2461650687,NZ -2461650688,2461659391,RU -2461659392,2461659647,UA -2461659648,2461662463,RU -2461662464,2461662719,NL -2461662720,2461663231,RU -2461663232,2461794303,US -2461794304,2461859839,GB -2461859840,2461990911,US -2461990912,2462056447,GB -2462056448,2462121983,NO -2462121984,2462187519,PT -2462187520,2462253055,GB -2462253056,2462326783,AU -2462326784,2462328831,IN -2462328832,2462329855,ID -2462329856,2462330879,IN -2462330880,2462331903,BD -2462331904,2462332927,HK -2462332928,2462333951,CN -2462333952,2462334975,IN -2462334976,2462335999,VN -2462336000,2462339071,CN -2462339072,2462342143,HK -2462342144,2462343167,CN -2462343168,2462344191,ID -2462344192,2462345215,US -2462345216,2462347263,ID -2462347264,2462349311,CN -2462349312,2462350335,IN -2462350336,2462351359,CN -2462351360,2462384127,GM -2462384128,2462449663,US -2462449664,2462455807,GB -2462455808,2462456831,US -2462456832,2462457343,GB -2462457344,2462457855,US -2462457856,2462458879,GB -2462458880,2462459391,US -2462459392,2462463999,GB -2462464000,2462464767,US -2462464768,2462467071,GB -2462467072,2462467327,US -2462467328,2462467583,GB -2462467584,2462468095,US -2462468096,2462469631,GB -2462469632,2462470143,US -2462470144,2462471423,GB -2462471424,2462472447,US -2462472448,2462489599,GB -2462489600,2462490111,US -2462490112,2462490367,GB -2462490368,2462490623,US -2462490624,2462519039,GB -2462519040,2462519295,US -2462519296,2462520319,GB -2462520320,2462521343,US -2462521344,2462526602,GB -2462526603,2462526603,US -2462526604,2462542847,GB -2462542848,2462544383,US -2462544384,2462547455,GB -2462547456,2462547967,US -2462547968,2462550015,GB -2462550016,2462552063,US -2462552064,2462553087,GB -2462553088,2462553599,US -2462553600,2462554111,GB -2462554112,2462554735,US -2462554736,2462554736,GB -2462554737,2462555135,US -2462555136,2462572543,GB -2462572544,2462576639,US -2462576640,2462578687,GB -2462578688,2462580735,US -2462580736,2462580736,GB -2462580737,2462597266,US -2462597267,2462597267,GB -2462597268,2462614527,US -2462614528,2462614783,GB -2462614784,2462616574,US -2462616575,2462616575,GB -2462616576,2463236095,US -2463236096,2463301631,AT -2463301632,2463367167,FI -2463367168,2463432703,SI -2463432704,2463498239,NO -2463498240,2463629311,US -2463629312,2463694847,CH -2463694848,2463825919,US -2463825920,2463891455,ES -2463891456,2463911935,LU -2463911936,2463916031,FR -2463916032,2463956991,LU -2463956992,2464022527,AU -2464022528,2464153599,US -2464153600,2464219135,NO -2464219136,2464284671,US -2464284672,2464350207,VI -2464350208,2464415743,GB -2464415744,2464481279,CH -2464481280,2464546815,US -2464546816,2464743423,ZA -2464743424,2464808959,US -2464808960,2464874495,DE -2464874496,2465267711,US -2465267712,2465333247,IT -2465333248,2465338879,US -2465338880,2465339135,SG -2465339136,2465660927,US -2465660928,2465662975,RU -2465662976,2465665023,CH -2465665024,2465667071,IT -2465667072,2465669119,SI -2465669120,2465671167,RU -2465671168,2465672703,IE -2465672704,2465672959,BG -2465672960,2465673215,IE -2465673216,2465677311,IM -2465677312,2465679359,IT -2465679360,2465681407,NL -2465681408,2465683455,SE -2465683456,2465685503,FR -2465685504,2465690367,DE -2465690368,2465693695,IT -2465693696,2465697791,NO -2465697792,2465718271,SE -2465718272,2465722367,NO -2465722368,2465726463,SE -2465726464,2465791999,CH -2465792000,2465857535,FR -2465857536,2465923071,US -2465923072,2465988607,SA -2465988608,2466054143,US -2466054144,2466185215,SE -2466185216,2466189311,GB -2466189312,2466189567,ES -2466189568,2466191103,NL -2466191104,2466191167,ES -2466191168,2466191359,NL -2466191360,2466193407,CZ -2466193408,2466199551,NL -2466199552,2466201599,AT -2466201600,2466209791,MK -2466209792,2466211839,ES -2466211840,2466213887,GB -2466215936,2466216703,US -2466216704,2466216959,DE -2466216960,2466217727,SG -2466217728,2466217983,DE -2466217984,2466226175,BA -2466226176,2466228223,IT -2466228224,2466230271,FR -2466230272,2466232319,EE -2466232320,2466234367,ES -2466234368,2466242559,RU -2466242560,2466250751,GE -2466250752,2466318335,US -2466318336,2466318591,SG -2466318592,2466323455,US -2466323456,2466323711,SG -2466323712,2466326015,US -2466326016,2466326271,SG -2466326272,2466336767,US -2466336768,2466337023,SG -2466337024,2466643967,US -2466643968,2466709503,KR -2466709504,2466775039,HU -2466775040,2466840575,HK -2466840576,2466906111,US -2466906112,2466971647,AU -2466971648,2467037183,US -2467037184,2467102719,NL -2467102720,2467233791,SE -2467233792,2468020223,US -2468020224,2468085759,GR -2468085760,2468151295,US -2468151296,2468216831,DK -2468216832,2468282367,KZ -2468282368,2468347903,US -2468347904,2468478975,CZ -2468478976,2468937727,US -2468937728,2469003263,AU -2469003264,2469068799,US -2469068800,2469134335,KR -2469134336,2469199871,SE -2469199872,2469265407,RU -2469265408,2469396479,KR -2469396480,2469527551,US -2469527552,2469593087,TH -2469593088,2469658623,US -2469658624,2469724159,GR -2469724160,2469789695,US -2469789696,2469855231,DE -2469855232,2470182911,US -2470182912,2470248447,CH -2470248448,2470510591,US -2470510592,2470576127,BR -2470576128,2470641663,AU -2470641664,2470649855,BE -2470649856,2470707199,LU -2470707200,2470772735,GB -2470772736,2470838271,AU -2470838272,2471194623,US -2471194624,2471198719,CO -2471198720,2471218175,US -2471218176,2471218687,NL -2471218688,2471219199,US -2471219200,2471219455,CA -2471219456,2471219711,GB -2471219712,2471223295,IL -2471223296,2471231487,US -2471231488,2471297023,AU -2471297024,2471362559,GB -2471428096,2471624703,US -2471624704,2471690239,SA -2471690240,2471821311,ES -2471821312,2471886847,US -2471886848,2472083455,CH -2472083456,2472148991,GB -2472148992,2472214527,US -2472214528,2472280063,RS -2472280064,2472296447,US -2472296448,2472300543,CA -2472300544,2472302591,PR -2472302592,2472312831,US -2472312832,2472345599,JP -2472345600,2472411135,BE -2472411136,2472476671,FR -2472476672,2472542207,GR -2472542208,2472607743,ES -2472607744,2472673279,US -2472673280,2472869887,FR -2472869888,2472935423,US -2472935424,2473000959,GR -2473000960,2473332735,US -2473332736,2473333247,AE -2473333248,2473336831,US -2473336832,2473338879,AU -2473338880,2473342975,US -2473342976,2473345023,GB -2473345024,2473345535,US -2473345536,2473346047,AE -2473346048,2473348095,US -2473348096,2473348607,SA -2473348608,2473379839,US -2473379840,2473381887,AU -2473381888,2473394175,US -2473394176,2473459711,AU -2473459712,2473525247,ZA -2473525248,2473656319,NO -2473656320,2473721855,US -2473721856,2473785708,GB -2473785709,2473785709,HK -2473785710,2473787391,GB -2473787392,2474049535,US -2474049536,2474115071,GB -2474115072,2474246143,US -2474246144,2474377215,IT -2474377216,2474442751,US -2474442752,2474508287,AT -2474508288,2474573823,US -2474573824,2474639359,FR -2474639360,2474901503,US -2474901504,2474967039,AU -2474967040,2475130879,US -2475130880,2475135487,FR -2475135488,2475135495,ES -2475135496,2475135719,FR -2475135720,2475135727,DE -2475135728,2475136391,FR -2475136392,2475136395,IT -2475136396,2475139391,FR -2475139392,2475139455,ES -2475139456,2475141935,FR -2475141936,2475141951,FI -2475141952,2475143295,FR -2475143296,2475143359,DE -2475143360,2475143423,IE -2475143424,2475143551,GB -2475143552,2475143615,BE -2475143616,2475143647,CZ -2475143648,2475143679,PT -2475143680,2475143743,DE -2475143744,2475143783,FR -2475143784,2475143791,ES -2475143792,2475143807,FR -2475143808,2475143935,DE -2475143936,2475143999,FR -2475144000,2475144063,IT -2475144064,2475145087,FR -2475145088,2475145151,BE -2475145152,2475145215,ES -2475145216,2475145343,DE -2475145344,2475145471,GB -2475145472,2475145615,FR -2475145616,2475145631,LT -2475145632,2475145727,FR -2475145728,2475145855,GB -2475145856,2475145919,DE -2475145920,2475146063,FR -2475146064,2475146079,LT -2475146080,2475146239,FR -2475146240,2475146303,IT -2475146304,2475146495,FR -2475146496,2475146559,NL -2475146560,2475146943,FR -2475146944,2475146975,PT -2475146976,2475148351,FR -2475148352,2475148415,PL -2475148416,2475148521,FR -2475148522,2475148522,PL -2475148523,2475148543,FR -2475148544,2475148607,PL -2475148608,2475148671,FR -2475148672,2475148735,PL -2475148736,2475148796,FR -2475148797,2475148797,PL -2475148798,2475149119,FR -2475149120,2475149247,PL -2475149248,2475149279,FR -2475149280,2475149311,PL -2475149312,2475149375,ES -2475149376,2475149567,FR -2475149568,2475149583,CH -2475149584,2475149599,LT -2475149600,2475149695,FR -2475149696,2475149823,IE -2475149824,2475149951,DE -2475149952,2475150207,FR -2475150208,2475150335,GB -2475150336,2475150495,FR -2475150496,2475150527,FI -2475150528,2475151231,FR -2475151232,2475151359,IT -2475151360,2475152383,PL -2475152384,2475153471,FR -2475153472,2475153535,GB -2475153536,2475153663,FR -2475153664,2475153919,GB -2475153920,2475155807,FR -2475155808,2475155839,GB -2475155840,2475156063,FR -2475156064,2475156095,FI -2475156096,2475156479,FR -2475156480,2475156607,ES -2475156608,2475157887,FR -2475157888,2475158015,BE -2475158016,2475158303,FR -2475158304,2475158335,PL -2475158336,2475159423,FR -2475159424,2475159551,DE -2475159552,2475159711,FR -2475159712,2475159743,ES -2475159744,2475160063,FR -2475160064,2475160079,GB -2475160080,2475160351,FR -2475160352,2475160383,PL -2475160384,2475160447,FR -2475160448,2475160575,NL -2475160576,2475160767,FR -2475160768,2475160799,FI -2475160800,2475161087,FR -2475161088,2475161215,ES -2475161216,2475161407,FR -2475161408,2475161439,FI -2475161440,2475161471,PL -2475161472,2475161983,FR -2475161984,2475161999,LT -2475162000,2475162351,FR -2475162352,2475162367,ES -2475162368,2475162495,DE -2475162496,2475162623,IT -2475162624,2475163647,FR -2475163648,2475556863,US -2475556864,2475622399,DE -2475622400,2475687935,GB -2475687936,2475884543,US -2475884544,2476277759,GB -2476277760,2476474367,US -2476474368,2476539903,ES -2476539904,2476605439,JP -2476605440,2476670975,MY -2476670976,2476802047,US -2476802048,2476867583,IL -2476867584,2476998655,IT -2476998656,2477195263,US -2477195264,2477260799,CH -2477260800,2477457407,US -2477457408,2477522943,FR -2477522944,2477588479,DE -2477588480,2477654015,FR -2477654016,2477719551,US -2477719552,2477785087,SK -2477785088,2477850623,JP -2477850624,2478047231,US -2478047232,2478112767,SE -2478112768,2478178303,NL -2478178304,2478309375,US -2478309376,2478374911,GB -2478374912,2478440447,US -2478440448,2478505983,SE -2478505984,2478571519,US -2478571520,2478655487,GB -2478655488,2478656511,FR -2478656512,2478702591,GB -2478702592,2478899199,US -2478899200,2478964735,GB -2478964736,2479030271,CA -2479030272,2479095807,US -2479095808,2479161343,FR -2479161344,2479226879,GB -2479226880,2479357951,US -2479357952,2479423487,AU -2479423488,2479489023,GB -2479489024,2479620095,US -2479620096,2479685631,DE -2479685632,2479947775,US -2479947776,2480013311,AU -2480013312,2480078847,FR -2480078848,2480144383,AU -2480209920,2480275455,SK -2480275456,2480340991,SE -2480340992,2480406527,FR -2480406528,2480668671,US -2480668672,2480734207,SE -2480734208,2481192959,US -2481192960,2481455103,CZ -2481455104,2481520639,SK -2481520640,2481586687,IL -2481586688,2481587199,GB -2481587200,2481848319,IL -2481848320,2482175999,US -2482176000,2482241535,GB -2482241536,2482634751,US -2482634752,2482700287,FR -2482700288,2482765823,CZ -2482765824,2482831359,IE -2482831360,2483027967,US -2483027968,2483093503,DO -2483093504,2483159039,US -2483159040,2483224575,SE -2483224576,2483290111,ES -2483290112,2483421183,US -2483421184,2483486719,HU -2483486720,2486566911,US -2486566912,2486632447,CH -2486632448,2486697983,US -2486697984,2486763519,ES -2486763520,2486927359,US -2486927360,2486928127,CA -2486928128,2486928895,US -2486928896,2486929151,CA -2486929152,2486929407,US -2486929408,2486929663,CA -2486929664,2486932735,US -2486932736,2486932991,CA -2486932992,2486940671,US -2486940672,2486941183,CA -2486941184,2486945279,US -2486945280,2486945791,CA -2486945792,2486946815,US -2486946816,2486947327,CA -2486947328,2486949887,US -2486949888,2486951423,CA -2486951424,2486952959,US -2486952960,2486953471,CA -2486953472,2486956543,US -2486956544,2486957055,CA -2486957056,2486960127,US -2486960128,2487025663,FR -2487025664,2487156735,US -2487156736,2487222271,PT -2487222272,2487222527,HK -2487222528,2487222783,JP -2487222784,2487223039,AU -2487223040,2487223295,SG -2487223296,2487224319,US -2487224320,2487224831,GB -2487224832,2487227391,US -2487227392,2487227647,MX -2487227648,2487236607,US -2487236608,2487237631,GB -2487237632,2487238143,MF -2487238144,2487238655,US -2487238656,2487246847,CA -2487246848,2487353343,US -2487353344,2487361535,HK -2487361536,2487363583,US -2487363584,2487365631,CA -2487365632,2487369727,HK -2487369728,2487386111,PF -2487386112,2487394303,SG -2487394304,2487418879,US -2487418880,2487549951,JP -2487549952,2487615487,PT -2487615488,2487681023,CN -2487681024,2487746559,PT -2487746560,2488066047,US -2488066048,2488074239,IL -2488074240,2488205311,US -2488205312,2488270847,GB -2488270848,2488336383,US -2488336384,2488401919,PL -2488401920,2488532991,NO -2488532992,2488795135,US -2488795136,2488860671,GB -2488860672,2489647103,US -2489647104,2489712639,DO -2489712640,2489745407,PE -2489745408,2489778175,HT -2489778176,2489843711,DO -2489843712,2490007551,US -2490007552,2490014011,GB -2490014012,2490014012,US -2490014013,2490015743,GB -2490015744,2490043391,US -2490043392,2490043647,GB -2490043648,2490236927,US -2490236928,2490302463,LU -2490302464,2490695679,US -2490695680,2490761215,CA -2490761216,2491154431,NO -2491154432,2491875327,US -2491875328,2492006399,SE -2492006400,2492071935,US -2492071936,2492137471,SE -2492137472,2492203007,US -2492203008,2492268543,NO -2492268544,2492399615,US -2492399616,2492465151,FR -2492465152,2492530687,US -2492530688,2492596223,AU -2492596224,2492727295,US -2492727296,2492792831,SE -2492792832,2492923903,US -2492923904,2492989439,OM -2492989440,2493513727,US -2493513728,2493579263,SE -2493579264,2493644799,JP -2493644800,2493740031,US -2493740032,2493740095,CN -2493740096,2493756415,US -2493756416,2493757439,CA -2493759488,2494103551,US -2494103552,2494169087,FR -2494169088,2494562303,US -2494562304,2494627839,GB -2494627840,2494676991,US -2494676992,2494683391,AU -2494683392,2494683647,US -2494683648,2494685183,AU -2494685184,2494689791,US -2494689792,2494690047,IN -2494690048,2494889983,US -2494889984,2494955519,GB -2494955520,2495021055,AU -2495021056,2495152127,US -2495217664,2495283199,US -2495283200,2495348735,CH -2495348736,2495807487,US -2495807488,2495873023,AU -2495873024,2495938559,CH -2495938560,2496004095,GB -2496004096,2496069631,AT -2496069632,2496135167,US -2496135168,2496200703,NL -2496200704,2497682431,MX -2497682432,2497683455,EC -2497683456,2498475007,MX -2498475008,2498476031,EC -2498476032,2499477503,MX -2499477504,2499543039,DE -2499543040,2499545087,GB -2499545088,2499547135,IE -2499547136,2499559423,GB -2499559424,2499575807,NO -2499575808,2499612671,GB -2499612672,2499616767,NL -2499616768,2499616801,US -2499616802,2499616830,ES -2499616831,2499617023,US -2499617024,2499617279,IE -2499617280,2499617535,NL -2499617536,2499624959,US -2499624960,2499641343,FR -2499641344,2499665919,GB -2499665920,2499667455,US -2499667456,2499668735,FR -2499668736,2499668991,US -2499668992,2499670527,GB -2499670528,2499739647,US -2499739648,2499805183,DO -2499805184,2499870719,TR -2499870720,2500001791,US -2500001792,2500034559,GE -2500034560,2500038655,GB -2500038656,2500040703,IT -2500040704,2500042751,LB -2500042752,2500046847,SA -2500046848,2500047615,IT -2500047616,2500047871,GR -2500047872,2500048895,IT -2500048896,2500050943,MD -2500050944,2500067327,KZ -2500067328,2500132991,US -2500132992,2500133023,NL -2500133024,2500135679,US -2500135680,2500135935,NL -2500135936,2500138367,US -2500138368,2500138399,BE -2500138400,2500141055,US -2500141056,2500141311,IE -2500141312,2500141823,US -2500141824,2500142847,IE -2500142848,2500143103,GB -2500143104,2500144127,IE -2500144128,2500144895,US -2500144896,2500145151,IE -2500145152,2500149247,US -2500149248,2500150271,GB -2500150272,2500150559,US -2500150560,2500150591,GB -2500150592,2500150655,US -2500150656,2500150719,GB -2500150720,2500154751,US -2500154752,2500154815,GB -2500154816,2500155199,US -2500155200,2500155391,GB -2500155392,2500155647,US -2500155648,2500155903,GB -2500155904,2500161023,US -2500161024,2500161535,GB -2500161536,2500161791,US -2500161792,2500162047,GB -2500162048,2500166207,US -2500166208,2500166223,GB -2500166224,2500170751,US -2500170752,2500170752,FI -2500170753,2500177935,US -2500177936,2500177943,PL -2500177944,2500180735,US -2500180736,2500181503,HR -2500181504,2500188223,US -2500188224,2500188287,CH -2500188288,2500188415,US -2500188416,2500188447,CH -2500188448,2500188679,US -2500188680,2500188687,CH -2500188688,2500188831,US -2500188832,2500188863,CH -2500188864,2500190207,US -2500190208,2500194303,FR -2500194304,2500194399,US -2500194400,2500194431,FI -2500194432,2500196351,US -2500196352,2500198399,FI -2500198400,2500199471,GB -2500199472,2500199475,IE -2500199476,2500202495,GB -2500202496,2500202879,US -2500202880,2500203007,ES -2500203008,2500203519,US -2500203520,2500204543,IT -2500204544,2500205567,US -2500205568,2500205823,PL -2500205824,2500211671,US -2500211672,2500211679,RO -2500211680,2500211728,US -2500211729,2500211730,SI -2500211731,2500212415,US -2500212416,2500212423,CH -2500212424,2500212991,US -2500212992,2500213247,ES -2500213248,2500213279,US -2500213280,2500213287,FI -2500213288,2500221455,US -2500221456,2500221459,FR -2500221460,2500222975,US -2500222976,2500225551,FR -2500225552,2500225559,ES -2500225560,2500226615,FR -2500226616,2500226623,NL -2500226624,2500230041,FR -2500230042,2500230042,GB -2500230043,2500231167,FR -2500231168,2500235775,DK -2500235776,2500236031,ES -2500236032,2500236837,DK -2500236838,2500236838,ES -2500236839,2500237791,DK -2500237792,2500237799,IT -2500237800,2500238047,DK -2500238048,2500238055,FR -2500238056,2500239359,DK -2500239360,2500243455,FR -2500243456,2500246271,US -2500246272,2500246527,GB -2500246528,2500247551,US -2500247552,2500248575,ES -2500248576,2500249599,US -2500249600,2500249855,ES -2500249856,2500251135,US -2500251136,2500251647,ES -2500251648,2500263935,US -2500263936,2500272127,ES -2500272128,2500272625,US -2500272626,2500272626,GB -2500272627,2500273663,US -2500273664,2500273919,GB -2500273920,2500275465,US -2500275466,2500275467,GB -2500275468,2500275711,US -2500275712,2500277503,GB -2500277504,2500278751,US -2500278752,2500278783,GB -2500278784,2500288511,US -2500288512,2500290815,FR -2500290816,2500291327,US -2500291328,2500291583,FR -2500291584,2500292607,US -2500292608,2500296703,DE -2500296704,2500313855,US -2500313856,2500314111,AT -2500314112,2500319231,US -2500319232,2500321279,ES -2500321280,2500321535,US -2500321536,2500321791,SK -2500321792,2500392959,US -2500392960,2500393215,IN -2500393216,2500393983,US -2500393984,2500394239,GB -2500394240,2500532749,US -2500532750,2500532750,GR -2500532751,2500535327,US -2500535328,2500535335,IE -2500535336,2500535371,US -2500535372,2500535375,IE -2500535376,2500535399,US -2500535400,2500535407,IE -2500535408,2500535807,US -2500535808,2500536319,NL -2500536320,2500538367,GB -2500538368,2500542751,US -2500542752,2500542755,NL -2500542756,2500544767,US -2500544768,2500545023,GR -2500545024,2500545703,US -2500545704,2500545711,SE -2500545712,2500546559,US -2500546560,2500549271,GB -2500549272,2500549279,ES -2500549280,2500552703,GB -2500552704,2500553727,US -2500553728,2500554239,GB -2500554240,2500554379,US -2500554380,2500554487,DE -2500554488,2500554751,US -2500554752,2500556295,FR -2500556296,2500556303,CZ -2500556304,2500558847,FR -2500558848,2500560895,US -2500560896,2500562943,GB -2500562944,2500563199,ES -2500563200,2500567039,US -2500567040,2500569687,GB -2500569688,2500569695,BE -2500569696,2500575231,GB -2500575232,2500591615,US -2500591616,2500596223,GB -2500596224,2500596735,CH -2500596736,2500599807,GB -2500599808,2500599935,US -2500599936,2500599951,DK -2500599952,2500616191,US -2500616192,2500624383,IT -2500624384,2500632575,US -2500632576,2500640767,GB -2500640768,2500644863,US -2500644864,2500646911,FR -2500646912,2500648959,ES -2500648960,2500653567,US -2500653568,2500654079,NL -2500654080,2500661247,US -2500661248,2500664319,ES -2500664320,2500665087,US -2500665088,2500665343,ES -2500665344,2500666463,US -2500666464,2500666471,LU -2500666472,2500674623,US -2500674624,2500674687,DE -2500674688,2500680447,US -2500680448,2500680703,SE -2500680704,2500681759,US -2500681760,2500681767,PL -2500681768,2500682495,US -2500682496,2500682751,PL -2500682752,2500687103,US -2500687104,2500687359,FR -2500687360,2500687871,US -2500687872,2500689919,FR -2500689920,2500694271,US -2500694272,2500697087,IT -2500697088,2500702463,US -2500702464,2500702471,GB -2500702472,2500702719,US -2500702720,2500702975,NL -2500702976,2500719103,US -2500719104,2500721151,IE -2500721152,2500723799,US -2500723800,2500723807,ES -2500723808,2500726783,US -2500726784,2500727807,GB -2500727808,2500728063,US -2500728064,2500728319,GB -2500728320,2500732063,US -2500732064,2500732071,GB -2500732072,2500739599,US -2500739600,2500739607,DE -2500739608,2500740417,US -2500740418,2500740418,DE -2500740419,2500743167,US -2500743168,2500744191,GB -2500744192,2500746239,US -2500746240,2500747263,GB -2500747264,2500748543,US -2500748544,2500748799,ES -2500748800,2500755455,US -2500755456,2500756647,GB -2500756648,2500756655,IT -2500756656,2500759159,GB -2500759160,2500759167,NL -2500759168,2500761631,GB -2500761632,2500761639,FR -2500761640,2500761879,GB -2500761880,2500761887,FR -2500761888,2500763647,GB -2500763648,2500777983,US -2500777984,2500777991,FR -2500777992,2500984831,US -2500984832,2500993023,GB -2500993024,2501000721,US -2501000722,2501000722,GB -2501000723,2501001215,US -2501001216,2501033983,GB -2501033984,2501321471,US -2501321472,2501321727,CZ -2501321728,2501574655,US -2501574656,2501640191,KZ -2501640192,2502033407,US -2502033408,2502037503,LU -2502037504,2502041599,US -2502041600,2502045695,ES -2502045696,2502047743,US -2502047744,2502049791,ES -2502049792,2502098943,US -2502098944,2502164479,IT -2502164480,2502166527,GB -2502166528,2502173695,US -2502173696,2502174207,DE -2502174208,2502180863,US -2502180864,2502181119,FI -2502181120,2502221823,US -2502221824,2502222591,ES -2502222592,2502222847,US -2502222848,2502223871,ES -2502223872,2502224895,US -2502224896,2502225151,ES -2502225152,2503016447,US -2503016448,2503147519,IL -2503147520,2503344127,US -2503344128,2503376895,AF -2503376896,2503409663,JP -2503409664,2503475199,US -2503475200,2503477487,CA -2503477488,2503477503,US -2503477504,2503486015,CA -2503486016,2503486023,US -2503486024,2503492479,CA -2503492480,2503492543,US -2503492544,2503518078,CA -2503518079,2503518079,US -2503518080,2503518080,CA -2503518081,2503518082,US -2503518083,2503525055,CA -2503525056,2503525119,US -2503525120,2503530911,CA -2503530912,2503530943,US -2503530944,2503533375,CA -2503533376,2503533376,US -2503533377,2503540735,CA -2503540736,2503671807,US -2503671808,2503737343,NL -2503737344,2503868415,US -2503868416,2503876607,RU -2503880704,2503882751,RU -2503882752,2503884799,DE -2503884800,2503901183,SI -2503901184,2503905279,IT -2503905280,2503907327,CZ -2503907328,2503909375,FR -2503909376,2503911423,RU -2503911424,2503915519,ES -2503915520,2503917567,IT -2503917568,2503933951,BG -2503933952,2504180735,US -2504180736,2504180991,ES -2504180992,2504468479,US -2504468480,2504470527,ES -2504470528,2504472575,IT -2504472576,2504472831,US -2504472832,2504473599,ES -2504473600,2504474623,US -2504474624,2504482815,HR -2504482816,2504486911,ES -2504486912,2504491007,US -2504491008,2504499199,IT -2504499200,2504499967,IE -2504499968,2504501385,US -2504501386,2504501386,ES -2504501387,2504501759,US -2504501760,2504502015,GB -2504502016,2504502271,US -2504502272,2504502527,ES -2504502528,2504502730,US -2504502731,2504502731,ES -2504502732,2504918642,US -2504918643,2504918643,IL -2504918644,2504919670,US -2504919671,2504919671,IL -2504919672,2504941293,US -2504941294,2504941294,IL -2504941295,2504945432,US -2504945433,2504945433,IL -2504945434,2504949759,US -2504949760,2504982527,IL -2504982528,2505457663,US -2505457664,2505459711,IE -2505459712,2505465855,US -2505465856,2505467903,GB -2505467904,2505469439,US -2505469440,2505469951,ES -2505469952,2505474047,NL -2505474048,2505482239,US -2505482240,2505484287,NL -2505484288,2505486335,US -2505486336,2505490431,FR -2505490432,2505498623,HR -2505498624,2505502719,US -2505502720,2505504767,UA -2505504768,2505506815,FI -2505506816,2505572351,US -2505572352,2505637887,IL -2505637888,2505703423,US -2505703424,2505768959,PT -2505768960,2505770495,US -2505770496,2505771007,ES -2505771008,2505772543,US -2505772544,2505772799,GB -2505772800,2505789439,US -2505789440,2505792511,FR -2505792512,2505793535,US -2505793536,2505803775,ES -2505803776,2506293247,US -2506293248,2506358783,CA -2506358784,2506359039,ES -2506359040,2506359295,GB -2506359296,2506361343,ES -2506361344,2506361855,US -2506361856,2506362879,ES -2506362880,2506363903,US -2506363904,2506364415,ES -2506364416,2506364671,US -2506364672,2506366975,ES -2506366976,2506399743,US -2506399744,2506401023,IT -2506401024,2506401279,US -2506401280,2506405887,IT -2506405888,2506498047,US -2506498048,2506499071,FR -2506499072,2506503167,US -2506503168,2506504191,ES -2506504192,2506506239,US -2506506240,2506514431,NO -2506514432,2506522623,ES -2506522624,2506526719,GB -2506526720,2506817535,US -2506817536,2506820351,ES -2506820352,2506821119,US -2506821120,2506821631,ES -2506821632,2507124735,US -2507124736,2507124991,IN -2507124992,2507145215,US -2507173888,2507174143,US -2507175936,2507177983,CA -2507183360,2507183615,US -2507210752,2507350015,US -2507350016,2507354111,CA -2507354112,2508062719,US -2508062720,2508064767,CH -2508064768,2508066815,ES -2508066816,2508068863,RU -2508068864,2508070911,HU -2508070912,2508075007,ES -2508075008,2508077055,CH -2508077056,2508079103,BE -2508079104,2508081151,DE -2508081152,2508081407,NL -2508081408,2508081445,IL -2508081446,2508081446,US -2508081447,2508081663,IL -2508081664,2508081919,GB -2508081920,2508081920,NL -2508081921,2508082431,GB -2508082432,2508082687,DE -2508082688,2508083199,GB -2508083200,2508085247,IS -2508085248,2508087295,PS -2508087296,2508089343,RU -2508089344,2508091391,GB -2508091392,2508095487,AZ -2508095488,2508103679,SI -2508103680,2508105727,ES -2508105728,2508107775,RU -2508107776,2508109823,FI -2508109824,2508111871,DE -2508111872,2508128255,RU -2508128256,2508259327,US -2508259328,2508263423,KR -2508263424,2508292095,SG -2508292096,2508308479,IN -2508308480,2508324863,ID -2508324864,2508455935,US -2508455936,2508521471,IT -2508521472,2508587007,CH -2508587008,2508652543,BE -2508652544,2508718079,AU -2508718080,2508914687,US -2508914688,2508980223,IT -2508980224,2509045759,TR -2509045760,2509242367,US -2509242368,2509307903,AU -2509307904,2509373439,US -2509373440,2509438975,NL -2509438976,2509504511,KW -2509504512,2509570047,AT -2509570048,2509832191,US -2509832192,2509897727,IE -2509897728,2509914111,US -2509914112,2509916159,RU -2509916160,2509918207,DE -2509918208,2509920255,FR -2509920256,2509922303,IT -2509922304,2509924351,AT -2509924352,2509928447,RU -2509928448,2509930495,FI -2509930496,2509934591,RU -2509934592,2509936639,DE -2509936640,2509937919,AT -2509937920,2509938175,IT -2509938176,2509938431,US -2509938432,2509938687,DE -2509938688,2509942783,GB -2509942784,2509946879,UA -2509946880,2509963263,BE -2509963264,2510028799,GB -2510028800,2510094335,PL -2510094336,2510159871,IE -2510159872,2510749695,US -2510749696,2510815231,AU -2510815232,2510946303,US -2510946304,2511011839,GB -2511011840,2511077375,AU -2511077376,2511142911,DE -2511142912,2511339519,US -2511339520,2511405055,AU -2511405056,2512715775,GB -2512715776,2512781311,FI -2512781312,2512872447,US -2512872448,2512872959,SG -2512872960,2512912383,US -2512912384,2512945151,HU -2512945152,2512977919,JO -2512977920,2513043455,DE -2513043456,2513043615,FR -2513043616,2513043647,GB -2513043648,2513044095,FR -2513044096,2513044223,DE -2513044224,2513044287,FR -2513044288,2513044351,IT -2513044352,2513044767,FR -2513044768,2513044799,ES -2513044800,2513045247,FR -2513045248,2513045255,CZ -2513045256,2513046591,FR -2513046592,2513046623,ES -2513046624,2513046911,FR -2513046912,2513047039,GB -2513047040,2513047695,FR -2513047696,2513047699,PL -2513047700,2513048047,FR -2513048048,2513048063,ES -2513048064,2513049551,FR -2513049552,2513049567,ES -2513049568,2513049919,FR -2513049920,2513049983,NL -2513049984,2513049987,PL -2513049988,2513050391,FR -2513050392,2513050399,PT -2513050400,2513051487,FR -2513051488,2513051519,GB -2513051520,2513052735,FR -2513052736,2513052751,ES -2513052752,2513057045,FR -2513057046,2513057046,PT -2513057047,2513068287,FR -2513068288,2513068351,ES -2513068352,2513068415,GB -2513068416,2513068448,FR -2513068449,2513068449,DE -2513068450,2513068631,FR -2513068632,2513068635,PT -2513068636,2513069375,FR -2513069376,2513069439,DE -2513069440,2513069631,FR -2513069632,2513069663,NL -2513069664,2513069823,FR -2513069824,2513069887,IT -2513069888,2513070559,FR -2513070560,2513070591,ES -2513070592,2513070623,FR -2513070624,2513070655,ES -2513070656,2513071435,FR -2513071436,2513071439,NL -2513071440,2513071583,FR -2513071584,2513071587,PL -2513071588,2513071595,FR -2513071596,2513071599,FI -2513071600,2513073375,FR -2513073376,2513073391,BE -2513073392,2513073791,FR -2513073792,2513073855,IT -2513073856,2513073951,FR -2513073952,2513073983,ES -2513073984,2513073999,FR -2513074000,2513074015,ES -2513074016,2513074319,FR -2513074320,2513074327,LT -2513074328,2513075247,FR -2513075248,2513075263,GB -2513075264,2513075455,FR -2513075456,2513075487,PL -2513075488,2513075791,FR -2513075792,2513075807,ES -2513075808,2513075871,FR -2513075872,2513075887,ES -2513075888,2513076175,FR -2513076176,2513076191,ES -2513076192,2513076239,FR -2513076240,2513076255,ES -2513076256,2513076335,FR -2513076336,2513076351,IE -2513076352,2513076479,ES -2513076480,2513077247,FR -2513077248,2513077311,DE -2513077312,2513078151,FR -2513078152,2513078159,NL -2513078160,2513078367,FR -2513078368,2513078371,GB -2513078372,2513078431,FR -2513078432,2513078463,PT -2513078464,2513078671,FR -2513078672,2513078687,IE -2513078688,2513078887,FR -2513078888,2513078891,GB -2513078892,2513078911,FR -2513078912,2513079039,GB -2513079040,2513079250,FR -2513079251,2513079254,ES -2513079255,2513079327,FR -2513079328,2513079343,IE -2513079344,2513080031,FR -2513080032,2513080063,IT -2513080064,2513080255,FR -2513080256,2513080319,DE -2513080320,2513080395,FR -2513080396,2513080399,GB -2513080400,2513080543,FR -2513080544,2513080575,NL -2513080576,2513081151,FR -2513081152,2513081215,IT -2513081216,2513081327,FR -2513081328,2513081343,ES -2513081344,2513081403,FR -2513081404,2513081407,PL -2513081408,2513081935,FR -2513081936,2513081939,DE -2513081940,2513082463,FR -2513082464,2513082495,NL -2513082496,2513082623,GB -2513082624,2513083199,FR -2513083200,2513083263,DE -2513083264,2513083279,FR -2513083280,2513083295,PT -2513083296,2513083327,FR -2513083328,2513083391,ES -2513083392,2513083455,FR -2513083456,2513083519,IE -2513083520,2513083743,FR -2513083744,2513083775,IT -2513083776,2513084215,FR -2513084216,2513084223,NL -2513084224,2513084399,FR -2513084400,2513084415,NL -2513084416,2513101919,FR -2513101920,2513101951,PT -2513101952,2513102047,FR -2513102048,2513102063,ES -2513102064,2513102899,FR -2513102900,2513102903,CZ -2513102904,2513103007,FR -2513103008,2513103039,DE -2513103040,2513103895,FR -2513103896,2513103935,PT -2513103936,2513103967,IE -2513103968,2513104223,FR -2513104224,2513104255,IT -2513104256,2513105311,FR -2513105312,2513105343,NL -2513105344,2513106239,FR -2513106240,2513106303,IE -2513106304,2513106367,FR -2513106368,2513106431,DE -2513106432,2513107079,FR -2513107080,2513107083,FI -2513107084,2513107087,ES -2513107088,2513107103,BE -2513107104,2513107135,FR -2513107136,2513107199,DE -2513107200,2513107231,FR -2513107232,2513107263,GB -2513107264,2513107279,ES -2513107280,2513107295,FR -2513107296,2513107311,PL -2513107312,2513107327,PT -2513107328,2513107391,FR -2513107392,2513107423,DE -2513107424,2513107455,FR -2513107456,2513107583,GB -2513107584,2513108991,FR -2513108992,2513502207,DE -2513502208,2513567743,NO -2513567744,2513600511,GR -2513600512,2513633279,NL -2513633280,2513698815,DE -2513698816,2513764351,DK -2513764352,2514419711,DE -2514419712,2514485247,GB -2514485248,2515140607,DE -2515140608,2515142655,US -2515142656,2515173375,DE -2515173376,2515189759,SG -2515189760,2515206143,US -2515206144,2515271679,GB -2515271680,2515599359,DE -2515599360,2515664895,GB -2515664896,2516037631,DE -2516037632,2516038143,DK -2516038144,2516058111,DE -2516058112,2516123647,CA -2516123648,2516254719,DE -2516254720,2516320255,FR -2516320256,2516451327,US -2516451328,2516516863,GB -2516516864,2516525055,RU -2516525056,2516525183,US -2516525184,2516525247,NL -2516525248,2516525391,US -2516525392,2516525407,NL -2516525408,2516525519,US -2516525520,2516525551,NL -2516525552,2516525727,US -2516525728,2516525823,NL -2516525824,2516526079,US -2516526080,2516526143,NL -2516526144,2516526335,US -2516526336,2516527103,NL -2516527104,2516529151,GB -2516529152,2516529279,CH -2516529280,2516529343,FR -2516529344,2516529375,BE -2516529376,2516531199,CH -2516531200,2516533247,GB -2516533248,2516541439,CZ -2516541440,2516545535,GB -2516545536,2516547583,RU -2516547584,2516549631,GB -2516549632,2516551679,RU -2516551680,2516553727,FR -2516553728,2516557823,AZ -2516557824,2516559871,RU -2516559872,2516561919,GB -2516561920,2516563967,LI -2516563968,2516566015,GB -2516566016,2516582399,IQ -2516582400,2516647935,CN -2516647936,2522812415,JP -2522812416,2522813439,VN -2522813440,2522814463,TH -2522814464,2522815487,SG -2522815488,2522816511,TH -2522816512,2522824703,JP -2522824704,2522834943,SG -2522834944,2522841087,VN -2522841088,2523201535,JP -2523201536,2523267071,AU -2523267072,2523463679,US -2523463680,2523529215,CA -2523529216,2523594751,NO -2523594752,2523595775,HK -2523595776,2523596799,KH -2523596800,2523597823,IN -2523597824,2523598847,TH -2523598848,2523601919,IN -2523601920,2523602943,TH -2523602944,2523603967,NZ -2523603968,2523604991,AU -2523604992,2523606015,IN -2523606016,2523607039,HK -2523607040,2523609087,BD -2523609088,2523612159,TW -2523612160,2523613183,KR -2523613184,2523614207,AU -2523614208,2523615231,MY -2523615232,2523617279,KR -2523617280,2523621375,IN -2523621376,2523621887,ID -2523621888,2523622399,US -2523622400,2523623423,ID -2523623424,2523626495,IN -2523626496,2523628543,SG -2523628544,2523631615,ID -2523631616,2523632639,IN -2523632640,2523633663,ID -2523633664,2523634687,SG -2523634688,2523635711,MY -2523635712,2523636735,NZ -2523636736,2523638783,IN -2523638784,2523639807,NZ -2523639808,2523645951,IN -2523645952,2523646975,NL -2523646976,2523647999,NP -2523648000,2523651071,IN -2523651072,2523652095,AU -2523652096,2523657215,IN -2523657216,2523659263,ID -2523659264,2523660287,IN -2523660288,2523725823,US -2523725824,2523791359,CN -2523791360,2524119039,US -2524119040,2524184575,CN -2524184576,2524315647,TW -2524315648,2524512255,US -2524512256,2524643327,CN -2524643328,2524963071,US -2524963072,2524963311,GB -2524963312,2524971007,US -2524971008,2525036543,ES -2525036544,2525037567,IN -2525037568,2525038591,PK -2525038592,2525039615,NL -2525039616,2525040639,AU -2525040640,2525041151,BD -2525041152,2525041407,ID -2525041408,2525041663,IN -2525041664,2525042687,KH -2525042688,2525044735,IN -2525044736,2525045759,HK -2525045760,2525046783,TW -2525046784,2525047807,HK -2525047808,2525050879,IN -2525050880,2525051903,ID -2525051904,2525053951,IN -2525053952,2525054975,MY -2525054976,2525055999,TW -2525056000,2525058047,HK -2525058048,2525059071,AU -2525059072,2525060095,IN -2525060096,2525061119,AU -2525061120,2525062143,TW -2525062144,2525071359,IN -2525071360,2525072383,CN -2525072384,2525073407,MN -2525073408,2525075455,IN -2525075456,2525076479,HK -2525076480,2525077503,IN -2525077504,2525078527,ID -2525078528,2525083647,IN -2525083648,2525084671,MY -2525084672,2525085695,ID -2525085696,2525086719,CN -2525086720,2525089791,IN -2525089792,2525090815,HK -2525090816,2525091839,IN -2525091840,2525092863,CN -2525092864,2525093887,BD -2525093888,2525094911,KR -2525094912,2525095935,TW -2525095936,2525101055,IN -2525101056,2525102079,CN -2525102080,2525118463,US -2525118464,2525122559,SG -2525122560,2525126655,US -2525126656,2525130751,GB -2525130752,2525131775,IL -2525131776,2525132799,HK -2525132800,2525233151,US -2525233152,2525298687,SE -2525298688,2525626367,US -2525626368,2525757439,CN -2525757440,2525822975,GR -2525822976,2525954047,US -2525954048,2526019583,GB -2526019584,2526085119,US -2526085120,2526216191,IT -2526216192,2526281727,JP -2526281728,2526412799,US -2526412800,2526478335,KR -2526478336,2526543871,AU -2526543872,2526937087,US -2526937088,2527002623,BE -2527002624,2527133695,US -2527133696,2527461375,BR -2527461376,2527920127,US -2527920128,2527985663,AU -2527985664,2528051199,US -2528051200,2528116735,FR -2528116736,2528247807,US -2528247808,2528313343,IT -2528313344,2528575487,US -2528575488,2528641023,KR -2528641024,2528706559,US -2528706560,2529034239,VE -2529034240,2529099775,US -2529099776,2529165311,AU -2529165312,2529492991,US -2529492992,2529558527,KR -2529558528,2529886207,US -2529886208,2529951743,AU -2529951744,2530017279,GB -2530017280,2530082815,CH -2530082816,2530148351,NZ -2530148352,2530213887,AU -2530213888,2530541567,US -2530541568,2530607103,CH -2530607104,2530672639,ES -2530672640,2530803711,US -2530803712,2530869247,IT -2530869248,2531196927,US -2531196928,2531262463,CN -2531262464,2531459071,US -2531459072,2531524607,SE -2531524608,2531590143,US -2531590144,2531655679,AU -2531655680,2532048895,US -2532048896,2532114431,SE -2532114432,2532179967,GB -2532179968,2532376575,US -2532376576,2532442111,ES -2532442112,2532445183,CN -2532445184,2532449279,IN -2532449280,2532450303,CN -2532450304,2532451327,AU -2532451328,2532452351,HK -2532452352,2532453375,NZ -2532453376,2532457471,CN -2532457472,2532461567,IN -2532461568,2532463615,CN -2532463616,2532465663,IN -2532465664,2532467711,CN -2532467712,2532468735,TW -2532468736,2532469759,BD -2532469760,2532470783,TL -2532470784,2532473855,CN -2532473856,2532474879,HK -2532474880,2532475903,NZ -2532475904,2532476927,KR -2532476928,2532477951,AU -2532477952,2532478463,IN -2532478464,2532478975,AE -2532478976,2532479999,KR -2532480000,2532481023,IN -2532481024,2532486143,CN -2532486144,2532488191,IN -2532488192,2532489215,MY -2532489216,2532492287,CN -2532492288,2532495359,IN -2532495360,2532496383,HK -2532496384,2532497407,CN -2532497408,2532498431,HK -2532498432,2532499455,US -2532499456,2532506623,CN -2532506624,2532507647,IN -2532507648,2532573183,US -2532573184,2532638719,ES -2532638720,2532704255,US -2532704256,2532769791,JP -2532769792,2532900863,US -2532900864,2532966399,JP -2532966400,2533031935,US -2533031936,2533032191,HK -2533032192,2533032447,SG -2533032448,2533032703,FR -2533032704,2533032959,US -2533032960,2533033215,BR -2533033216,2533033471,NL -2533033472,2533097471,BE -2533097472,2533228543,US -2533228544,2533294079,PL -2533294080,2533359615,CN -2533359616,2533375999,UA -2533376000,2533392383,HU -2533392384,2538602495,IT -2538602496,2538602687,FR -2538602688,2538602751,DE -2538602752,2538603519,FR -2538603520,2538603583,DE -2538603584,2538603711,FR -2538603712,2538603775,DE -2538603776,2538604327,FR -2538604328,2538604335,NL -2538604336,2538604967,FR -2538604968,2538604975,ES -2538604976,2538605271,FR -2538605272,2538605279,ES -2538605280,2538605375,FR -2538605376,2538605379,GB -2538605380,2538605471,FR -2538605472,2538605503,PT -2538605504,2538605567,DE -2538605568,2538605631,FR -2538605632,2538605647,LT -2538605648,2538605903,FR -2538605904,2538605919,ES -2538605920,2538606027,FR -2538606028,2538606031,DE -2538606032,2538606039,ES -2538606040,2538606043,FR -2538606044,2538606047,DE -2538606048,2538606343,FR -2538606344,2538606351,PL -2538606352,2538606403,FR -2538606404,2538606407,GB -2538606408,2538606847,FR -2538606848,2538606911,IT -2538606912,2538606943,CZ -2538606944,2538607007,PT -2538607008,2538607039,FR -2538607040,2538607103,ES -2538607104,2538613134,FR -2538613135,2538613135,NL -2538613136,2538616287,FR -2538616288,2538616319,NL -2538616320,2538616383,FR -2538616384,2538616447,ES -2538616448,2538616575,FR -2538616576,2538616639,IT -2538616640,2538618487,FR -2538618488,2538618495,ES -2538618496,2538619359,FR -2538619360,2538619375,ES -2538619376,2538619431,FR -2538619432,2538619435,DE -2538619436,2538619563,FR -2538619564,2538619567,ES -2538619568,2538619775,FR -2538619776,2538619807,LT -2538619808,2538619903,FR -2538619904,2538619911,ES -2538619912,2538620231,FR -2538620232,2538620239,ES -2538620240,2538620255,FR -2538620256,2538620287,NL -2538620288,2538620847,FR -2538620848,2538620863,CZ -2538620864,2538621007,FR -2538621008,2538621023,LT -2538621024,2538621167,FR -2538621168,2538621183,CZ -2538621184,2538621471,FR -2538621472,2538621503,BE -2538621504,2538622351,FR -2538622352,2538622367,LT -2538622368,2538622599,FR -2538622600,2538622607,IE -2538622608,2538622735,FR -2538622736,2538622751,FI -2538622752,2538623711,FR -2538623712,2538623727,NL -2538623728,2538624447,FR -2538624448,2538624511,ES -2538624512,2538624671,FR -2538624672,2538624703,PL -2538624704,2538625279,FR -2538625280,2538625311,GB -2538625312,2538625527,FR -2538625528,2538625535,DE -2538625536,2538625571,FR -2538625572,2538625575,PL -2538625576,2538625583,FR -2538625584,2538625599,PT -2538625600,2538626543,FR -2538626544,2538626559,LT -2538626560,2538626687,FR -2538626688,2538626703,ES -2538626704,2538629727,FR -2538629728,2538629759,ES -2538629760,2538631583,FR -2538631584,2538631615,FI -2538631616,2538633551,FR -2538633552,2538633567,IE -2538633568,2538633695,FR -2538633696,2538633727,CZ -2538633728,2538634227,FR -2538634228,2538634231,DE -2538634232,2538634331,FR -2538634332,2538634335,DE -2538634336,2538634559,FR -2538634560,2538634623,GB -2538634624,2538634687,FR -2538634688,2538634751,NL -2538634752,2538634879,FR -2538634880,2538635007,GB -2538635008,2538644015,FR -2538644016,2538644039,ES -2538644040,2538644927,FR -2538644928,2538644991,IE -2538644992,2538645607,FR -2538645608,2538645615,PL -2538645616,2538645695,FR -2538645696,2538645727,CZ -2538645728,2538645775,FR -2538645776,2538645783,ES -2538645784,2538645855,FR -2538645856,2538645871,ES -2538645872,2538646063,FR -2538646064,2538646079,PT -2538646080,2538646135,FR -2538646136,2538646139,DE -2538646140,2538646143,FR -2538646144,2538646155,DE -2538646156,2538646219,FR -2538646220,2538646227,DE -2538646228,2538646271,FR -2538646272,2538646399,BE -2538646400,2538646783,FR -2538646784,2538647039,CZ -2538647040,2538647823,FR -2538647824,2538647831,FI -2538647832,2538648015,FR -2538648016,2538648031,ES -2538648032,2538648591,FR -2538648592,2538648623,BE -2538648624,2538649767,FR -2538649768,2538649775,DE -2538649776,2538649991,FR -2538649992,2538649995,DE -2538649996,2538650059,FR -2538650060,2538650063,DE -2538650064,2538650103,FR -2538650104,2538650107,DE -2538650108,2538650199,FR -2538650200,2538650203,DE -2538650204,2538651135,FR -2538651136,2538651139,DE -2538651140,2538651183,FR -2538651184,2538651187,DE -2538651188,2538651255,FR -2538651256,2538651259,DE -2538651260,2538651279,FR -2538651280,2538651283,DE -2538651284,2538651967,FR -2538651968,2538651999,PT -2538652000,2538652727,FR -2538652728,2538652731,DE -2538652732,2538652991,FR -2538652992,2538653055,DE -2538653056,2538653327,FR -2538653328,2538653331,CZ -2538653332,2538653379,FR -2538653380,2538653383,DE -2538653384,2538653387,ES -2538653388,2538653927,FR -2538653928,2538653931,ES -2538653932,2538653935,FR -2538653936,2538653939,GB -2538653940,2538655071,FR -2538655072,2538655103,FI -2538655104,2538656959,FR -2538656960,2538656975,ES -2538656976,2538657135,FR -2538657136,2538657139,RO -2538657140,2538657439,FR -2538657440,2538657443,ES -2538657444,2538657855,FR -2538657856,2538657919,ES -2538657920,2538657935,FR -2538657936,2538657943,ES -2538657944,2538657967,FR -2538657968,2538657983,IE -2538657984,2538658347,FR -2538658348,2538658351,DE -2538658352,2538658495,FR -2538658496,2538658499,DE -2538658500,2538658623,FR -2538658624,2538658655,NL -2538658656,2538659071,FR -2538659072,2538659135,NL -2538659136,2538659331,FR -2538659332,2538659335,PL -2538659336,2538659711,FR -2538659712,2538659719,ES -2538659720,2538663299,FR -2538663300,2538663303,IT -2538663304,2538663455,FR -2538663456,2538663471,ES -2538663472,2538663551,FR -2538663552,2538663567,IT -2538663568,2538663791,FR -2538663792,2538663799,ES -2538663800,2538666111,FR -2538666112,2538666175,GB -2538666176,2538667775,FR -2538667776,2538667839,ES -2538667840,2538668031,FR -2538668032,2539978751,IT -2539978752,2539980799,US -2539980800,2539981823,SG -2539981824,2539982847,DE -2539982848,2539983871,GB -2539983872,2539985919,US -2539985920,2539986943,AU -2539986944,2539987967,US -2539987968,2539988991,NL -2539988992,2539994111,US -2539994112,2539995135,GB -2539995136,2539997183,US -2539997184,2539998207,JP -2539998208,2539999231,HK -2539999232,2540000255,AU -2540000256,2540001279,SE -2540001280,2540002303,JP -2540002304,2540003327,BR -2540003328,2540004351,AU -2540004352,2540005375,US -2540005376,2540006399,AU -2540006400,2540007423,IL -2540007424,2540008447,DE -2540008448,2540009471,US -2540009472,2540010495,FR -2540010496,2540011519,CA -2540011520,2540012543,US -2540012544,2540013567,ES -2540013568,2540014591,CA -2540014592,2540015615,AE -2540015616,2540017663,US -2540017664,2540019711,IN -2540019712,2540020735,US -2540020736,2540021759,NZ -2540021760,2540022783,US -2540022784,2540023807,ZA -2540023808,2540024831,BR -2540024832,2540033023,US -2540033024,2540034047,CA -2540034048,2540035071,AR -2540035072,2540036095,CL -2540036096,2540037119,ZA -2540037120,2540038143,JP -2540038144,2540240895,US -2540240896,2540306431,FI -2540306432,2540314623,FR -2540314624,2540339199,DE -2540339200,2540347391,GB -2540347392,2540355583,US -2540355584,2540363775,GB -2540363776,2540896255,US -2540896256,2540961791,FR -2540961792,2541223935,US -2541223936,2541289471,CH -2541289472,2541682687,US -2541682688,2541748223,FR -2541748224,2541813759,US -2541813760,2541879295,GB -2541879296,2541944831,AU -2541944832,2542075903,US -2542075904,2542141439,GB -2542141440,2542206975,US -2542206976,2542272511,TR -2542272512,2542338047,DE -2542338048,2543583231,US -2543583232,2543648767,SE -2543648768,2543714303,NO -2543779840,2544500735,US -2544500736,2544566271,GB -2544566272,2544631807,US -2544697344,2544730111,US -2544730112,2544762879,SA -2544762880,2544828415,US -2544893952,2544959487,GB -2544959488,2545025023,SE -2545025024,2545090559,AU -2545090560,2545156095,US -2545156096,2545221631,GB -2545221632,2545287167,US -2545287168,2545352703,ES -2545352704,2545418239,CH -2545418240,2545483775,NL -2545483776,2545614847,US -2545614848,2545680383,NO -2545680384,2545745919,US -2545745920,2545811455,DE -2545811456,2547154943,US -2547154944,2547187711,NZ -2547187712,2547318783,GB -2547318784,2547515391,US -2547515392,2547515903,RU -2547517440,2547524607,DE -2547524608,2547525631,IR -2547525632,2547535871,GB -2547548160,2547580927,NO -2547580928,2547646463,DE -2548039680,2548072320,GB -2548072321,2548072321,US -2548072322,2548563967,GB -2548563968,2548826111,IR -2548826112,2548829695,AT -2548829696,2548829951,NL -2548829952,2548830207,DE -2548830208,2548830463,US -2548830464,2548830719,DE -2548830720,2548830975,IT -2548830976,2548831231,GB -2548831232,2548831487,HK -2548831488,2548831743,FR -2548831744,2548831999,US -2548832000,2548832255,ES -2548832256,2548832511,IS -2548832512,2548832767,PL -2548832768,2548833279,CH -2548833280,2548833791,NL -2548833792,2548834303,AT -2548834304,2548842495,GB -2548842496,2548848639,RU -2548848640,2548848895,UA -2548848896,2548858879,RU -2548858880,2548867071,NL -2548867072,2548875263,IQ -2548875264,2548877311,KZ -2548877312,2548879359,SE -2548879360,2548883455,GB -2548883456,2548887551,SK -2548887552,2548891647,MK -2548891648,2548905983,BG -2548905984,2548907007,ES -2548907008,2548908031,BG -2548908032,2548908543,ES -2548908544,2548924927,BG -2548924928,2548926463,ES -2548926464,2548928511,BG -2548928512,2548932607,KZ -2548932608,2548934655,NL -2548934656,2548936703,RU -2548936704,2548938239,SE -2548938240,2548938495,GB -2548938496,2548938751,CH -2548938752,2548939519,SE -2548939520,2548939775,ES -2548939776,2548940799,SE -2548940800,2548948991,ES -2548948992,2548951039,CZ -2548951040,2548953087,GB -2548953088,2548955135,RU -2548955136,2548957183,DE -2548957184,2549612543,IR -2549612544,2549614447,SE -2549614448,2549614463,NL -2549614464,2549614591,SE -2549614592,2549616639,IT -2549616640,2549618687,BE -2549618688,2549620735,US -2549620736,2549624831,PL -2549624832,2549626879,BE -2549626880,2549628927,PL -2549628928,2549637119,RO -2549637120,2549641215,KW -2549641216,2549645311,RU -2549645312,2549678079,CH -2549678080,2549698559,GB -2549698560,2549700607,PL -2549700608,2549700863,FR -2549700864,2549701375,DE -2549701376,2549701631,SE -2549701632,2549701887,PL -2549701888,2549702143,FR -2549702144,2549702399,GB -2549702400,2549702655,FR -2549702656,2549704703,UA -2549704704,2549706751,CZ -2549706752,2549710847,NO -2549710848,2549743615,BY -2549743616,2549809151,TR -2549809152,2549874687,BG -2549874688,2549876735,GB -2549876736,2549878783,NO -2549878784,2549880831,DE -2549880832,2549881327,SE -2549881328,2549881343,NL -2549881344,2549882335,SE -2549882336,2549882351,FI -2549882352,2549882383,SE -2549882384,2549882399,FI -2549882400,2549882879,SE -2549882880,2549884927,CH -2549884928,2549886207,DE -2549886208,2549886463,CH -2549886464,2549891071,DE -2549891072,2549899263,RU -2549899264,2549901311,PS -2549901312,2549903359,RU -2549903360,2549905407,ES -2549905408,2549907455,GB -2549907456,2549923839,SE -2549923840,2549927935,BG -2549927936,2549929983,HR -2549929984,2549932031,DE -2549932032,2549940223,HR -2549940224,2550005759,AE -2550005760,2550136831,SA -2550136832,2550202367,DO -2550202368,2553544703,US -2553544704,2553610239,IN -2553610240,2553806847,US -2553806848,2554068991,IN -2554068992,2554227711,US -2554227712,2554227967,IE -2554227968,2554462207,US -2554462208,2554527743,HU -2554527744,2554789887,US -2554789888,2554855423,GB -2554855424,2554920959,US -2554920960,2554986495,DK -2554986496,2555052031,CL -2555052032,2555117567,US -2555117568,2555183103,AU -2555183104,2555248639,FR -2555248640,2555314175,GB -2555314176,2555445247,US -2555445248,2555510783,FR -2555510784,2555576319,US -2555576320,2555641855,AU -2555641856,2555707391,BR -2555707392,2555903999,US -2555904000,2555969535,CH -2556035072,2556100607,NO -2556100608,2556166143,AU -2556166144,2556231679,BR -2556231680,2556362751,NO -2556362752,2556428287,DK -2556428288,2556493823,CH -2556493824,2556559359,US -2556559360,2556624895,AU -2556624896,2556690431,KR -2556690432,2556755967,US -2556755968,2556757247,HK -2556757248,2556757503,TW -2556757504,2556757759,HK -2556757760,2556758015,SG -2556758016,2556761087,HK -2556761088,2556761343,JP -2556761344,2556762367,HK -2556762368,2556763135,TW -2556763136,2556763903,HK -2556763904,2556764159,SG -2556764160,2556764415,TW -2556764416,2556766207,HK -2556766208,2556766719,DE -2556766720,2556768767,HK -2556768768,2556769023,TW -2556769024,2556773887,HK -2556773888,2556774143,SG -2556774144,2556776703,HK -2556776704,2556776959,DE -2556776960,2556780031,HK -2556780032,2556780799,SG -2556780800,2556787967,HK -2556787968,2556788223,JP -2556788224,2556790783,HK -2556790784,2556791807,ZA -2556791808,2556800511,HK -2556800512,2556800767,TW -2556800768,2556807423,HK -2556807424,2556807679,JP -2556807680,2556821503,HK -2556821504,2556887039,SG -2556887040,2556985343,HK -2556985344,2557018111,CN -2557018112,2557083647,GB -2557083648,2557214719,ZA -2557214720,2557280255,SC -2557280256,2557542399,ZA -2557542400,2557607935,US -2557607936,2557673471,GB -2557673472,2557739007,DK -2557739008,2557870079,US -2557870080,2557935615,ID -2557935616,2558658499,US -2558658500,2558658500,PR -2558658501,2558918655,US -2558918656,2558984191,GB -2558984192,2559246335,US -2559246336,2559311871,CL -2559311872,2559508479,US -2559508480,2559574015,DE -2559574016,2559770623,US -2559770624,2559836159,AU -2559836160,2559901695,US -2559901696,2559967231,KR -2559967232,2560032767,GB -2560032768,2560098303,US -2560098304,2560163839,BE -2560229376,2560360447,US -2560360448,2560425983,UY -2560425984,2560950271,US -2560950272,2561015807,JP -2561015808,2561146879,DO -2561146880,2561409023,AR -2561409024,2561671167,CL -2561671168,2562867199,US -2562867200,2562868223,DE -2562868224,2563244031,US -2563244032,2563637247,CO -2563637248,2563768319,CU -2563768320,2564947967,US -2564947968,2565013503,SG -2565013504,2565210111,US -2565210112,2565275647,CL -2565275648,2565279743,HN -2565279744,2565281791,AR -2565281792,2565283839,CO -2565283840,2565287935,NI -2565287936,2565292031,AR -2565292032,2565308415,CL -2565308416,2565341183,CR -2565341184,2566914047,BR -2566914048,2566979583,CN -2566979584,2567045119,FI -2567045120,2567110655,US -2567110656,2567176191,CN -2567176192,2567241727,US -2567241728,2567307263,SI -2567307264,2567897087,US -2567897088,2567962623,NO -2567962624,2568028159,US -2568028160,2568093695,DE -2568093696,2568159231,US -2568159232,2568224767,PL -2568224768,2568290303,SG -2568290304,2569142271,US -2569142272,2569404415,CN -2569404416,2569797631,US -2569797632,2569863167,NO -2569863168,2569885183,US -2569885184,2569885439,CH -2569885440,2569928703,US -2569928704,2569936383,CH -2569936384,2569936895,US -2569936896,2569970175,CH -2569970176,2569970687,US -2569970688,2569994239,CH -2569994240,2570125311,US -2570125312,2570190847,BE -2570190848,2572681215,US -2572681216,2572746751,SE -2572746752,2572944127,US -2572944128,2572944383,LT -2572944384,2572945407,US -2572945408,2572947455,ID -2572947456,2572950271,PL -2572950272,2572950527,ES -2572950528,2572951551,DE -2572951552,2572953599,US -2572953600,2572953855,CA -2572953856,2572954111,DE -2572954112,2572954367,ES -2572954368,2572954623,HK -2572954624,2572954879,AU -2572954880,2572955135,HK -2572955136,2572955388,GB -2572955389,2572955390,HK -2572955391,2572955391,GB -2572955392,2572955647,DE -2572955648,2572959743,FR -2572959744,2572960255,DE -2572960256,2572960511,SE -2572960512,2572960767,BE -2572960768,2572961023,FR -2572961024,2572961279,CH -2572961280,2572961535,IT -2572961536,2572961791,ES -2572961792,2572967935,DE -2572967936,2572968447,FR -2572968448,2572968959,CZ -2572968960,2572972031,FR -2572972032,2572974079,AT -2572974080,2572975103,ES -2572975104,2572975615,DE -2572975616,2572975871,SE -2572975872,2572976127,NL -2572976128,2572984319,IS -2572984320,2572984575,DE -2572984576,2572984831,NL -2572984832,2572985087,AT -2572985088,2572985343,GB -2572985344,2572985599,KR -2572985600,2572985855,RU -2572985856,2572986111,CZ -2572986112,2572986367,IE -2572986368,2572986623,PL -2572986624,2572986879,PT -2572986880,2572987391,DE -2572987392,2572987647,NO -2572987648,2572987903,LU -2572987904,2572988159,DE -2572988160,2572988415,KR -2572988416,2572989439,IT -2572989440,2572989695,GR -2572989696,2572989823,PL -2572989824,2572989887,EE -2572989888,2572989951,LV -2572989952,2572991487,DE -2572991488,2572991615,IT -2572991616,2572991743,CH -2572991744,2572991871,PT -2572991872,2572991999,ES -2572992000,2572992127,BE -2572992128,2572992255,NL -2572992256,2572992383,HU -2572992384,2572992447,RS -2572992448,2572992511,UA -2572992512,2572996607,DE -2572996608,2572997631,GB -2572997632,2573000703,US -2573000704,2573008895,FR -2573008896,2573336575,DE -2573352960,2573361151,BE -2573369344,2573402111,DE -2573402112,2573467647,CN -2573467648,2573533183,DE -2573533184,2573598719,CN -2573598720,2573926399,US -2573926400,2573991935,AU -2573991936,2574123007,CH -2574123008,2574188543,NO -2574188544,2574254079,NZ -2574254080,2574306303,SE -2574306304,2574307327,BE -2574307328,2574311167,SE -2574311168,2574311423,US -2574311424,2574319615,SE -2574319616,2574647295,US -2574647296,2574778367,CN -2574778368,2583582207,JP -2583582208,2583582463,HK -2583582464,2583691263,JP -2583691264,2583695359,ZA -2583695360,2583697407,BW -2583697408,2583699455,CI -2583699456,2583707647,GA -2583707648,2583724031,AO -2583724032,2583728127,UG -2583728128,2583729919,NG -2583729920,2583732223,TZ -2583732224,2583736319,ZA -2583736320,2583740415,GA -2583740416,2583756799,NA -2583756800,2584018943,US -2584018944,2584084479,CA -2584084480,2584215551,US -2584215552,2584227839,GB -2584227840,2584231935,JP -2584231936,2584248319,GB -2584248320,2584281087,CN -2584281088,2584346623,US -2584346624,2584412159,KR -2584412160,2584477695,CA -2584477696,2584608767,US -2584608768,2584674303,CH -2584674304,2584739839,GB -2584739840,2584739903,AU -2584739904,2584739935,DE -2584739936,2584740095,ZA -2584740096,2584740351,US -2584740352,2584740415,AU -2584740416,2584740607,ZA -2584740608,2584740863,NL -2584740864,2584740927,AU -2584740928,2584741119,ZA -2584741120,2584741375,US -2584741376,2584741439,AU -2584741440,2584741503,ZA -2584741504,2584741519,IE -2584741520,2584741631,DE -2584741632,2584741887,GB -2584741888,2584741951,AU -2584741952,2584742143,ZA -2584742144,2584742399,US -2584742400,2584742463,AU -2584742464,2584742655,ZA -2584742656,2584742911,US -2584742912,2584742975,KR -2584742976,2584743167,ZA -2584743168,2584743423,US -2584743424,2584743487,KR -2584743488,2584743679,ZA -2584743680,2584743935,US -2584743936,2584743999,AU -2584744000,2584744191,ZA -2584744192,2584744447,NL -2584744448,2584744511,AU -2584744512,2584744703,ZA -2584744704,2584744959,US -2584744960,2584745023,AU -2584745024,2584745215,ZA -2584745216,2584745471,US -2584745472,2584745535,AU -2584745536,2584745727,ZA -2584745728,2584745983,US -2584745984,2584746047,AU -2584746048,2584746239,ZA -2584746240,2584746495,US -2584746496,2584746559,AU -2584746560,2584746751,ZA -2584746752,2584747007,US -2584747008,2584747071,MY -2584747072,2584747263,ZA -2584747264,2584747519,US -2584747520,2584747583,MY -2584747584,2584747775,ZA -2584747776,2584748031,US -2584748032,2584748095,MY -2584748096,2584748287,ZA -2584748288,2584748543,US -2584748544,2584748607,MY -2584748608,2584748799,ZA -2584748800,2584749055,US -2584749056,2584749119,MY -2584749120,2584749311,ZA -2584749312,2584749567,NL -2584749568,2584749631,MY -2584749632,2584749823,ZA -2584749824,2584750079,US -2584750080,2584750143,MY -2584750144,2584750335,ZA -2584750336,2584750591,US -2584750592,2584750655,MY -2584750656,2584750687,DE -2584750688,2584750719,ZA -2584750720,2584750847,DE -2584750848,2584751103,US -2584751104,2584751167,AE -2584751168,2584751231,ZA -2584751232,2584751359,DE -2584751360,2584751615,US -2584751616,2584751679,AE -2584751680,2584751743,ZA -2584751744,2584751871,DE -2584751872,2584752127,US -2584752128,2584752191,AE -2584752192,2584752207,SE -2584752208,2584752255,ZA -2584752256,2584752383,DE -2584752384,2584752639,US -2584752640,2584752703,AE -2584752704,2584752767,ZA -2584752768,2584752895,DE -2584752896,2584753151,US -2584753152,2584753215,AE -2584753216,2584753279,ZA -2584753280,2584753407,DE -2584753408,2584753663,US -2584753664,2584753727,AE -2584753728,2584753791,ZA -2584753792,2584753919,DE -2584753920,2584754175,US -2584754176,2584754303,ZA -2584754304,2584754431,DE -2584754432,2584754687,US -2584754688,2584754751,ZA -2584754752,2584754943,DE -2584754944,2584755199,US -2584755200,2584755263,AR -2584755264,2584755279,DE -2584755280,2584755327,ZA -2584755328,2584755455,DE -2584755456,2584755711,US -2584755712,2584755775,AR -2584755776,2584755839,ZA -2584755840,2584755967,DE -2584755968,2584756223,GB -2584756224,2584756351,ZA -2584756352,2584756479,DE -2584756480,2584756735,US -2584756736,2584756991,ZA -2584756992,2584757247,US -2584757248,2584757311,SG -2584757312,2584757503,ZA -2584757504,2584757759,US -2584757760,2584757823,HK -2584757824,2584758015,ZA -2584758016,2584758271,US -2584758272,2584758335,SG -2584758336,2584758527,ZA -2584758528,2584758783,US -2584758784,2584758847,HK -2584758848,2584759039,ZA -2584759040,2584759295,US -2584759296,2584759359,SG -2584759360,2584759551,ZA -2584759552,2584759807,US -2584759808,2584759871,HK -2584759872,2584760063,ZA -2584760064,2584760319,US -2584760320,2584760383,SG -2584760384,2584760575,ZA -2584760576,2584760831,US -2584760832,2584760895,HK -2584760896,2584761087,ZA -2584761088,2584761343,US -2584761344,2584761407,SG -2584761408,2584761599,ZA -2584761600,2584761855,US -2584761856,2584761919,HK -2584761920,2584762111,ZA -2584762112,2584762367,US -2584762368,2584762431,SG -2584762432,2584762623,ZA -2584762624,2584762879,US -2584762880,2584762943,HK -2584762944,2584763135,ZA -2584763136,2584763391,US -2584763392,2584763455,SG -2584763456,2584763903,ZA -2584763904,2584763967,HK -2584763968,2584763999,DE -2584764000,2584764415,ZA -2584764416,2584764671,MA -2584764672,2584764927,DZ -2584764928,2584766975,US -2584766976,2584767231,NL -2584767232,2584767487,TR -2584767488,2584768511,US -2584768512,2584770559,IL -2584770560,2584772448,US -2584772449,2584772449,GB -2584772450,2584773631,US -2584773632,2584773887,GB -2584773888,2584775423,US -2584775424,2584775679,KE -2584775680,2584776703,MA -2584776704,2584778751,US -2584778752,2584779775,DE -2584779776,2584780031,NL -2584780032,2584780287,US -2584780288,2584780543,ES -2584780544,2584782079,US -2584782080,2584782335,TR -2584782336,2584789759,US -2584789760,2584790015,NL -2584790016,2584790783,US -2584790784,2584791039,HK -2584791040,2584791295,US -2584791296,2584791551,FR -2584791552,2584791807,DE -2584791808,2584796159,US -2584796160,2584796415,RU -2584796416,2585001983,US -2585001984,2585067519,CA -2585067520,2585330440,US -2585330441,2585330442,SI -2585330443,2585330468,US -2585330469,2585330470,SI -2585330471,2585788415,US -2585788416,2585853951,GB -2585853952,2585985023,JP -2585985024,2586378239,US -2586378240,2586386431,UA -2586386432,2586480639,US -2586480640,2586484735,IL -2586484736,2586492927,GB -2586492928,2586509823,US -2586509824,2586510079,ES -2586510080,2586510335,US -2586510336,2586511359,ES -2586511360,2586517503,US -2586517504,2586525695,FR -2586525696,2586544127,US -2586544128,2586546175,SE -2586546176,2586566655,US -2586566656,2586566687,FR -2586566688,2586610175,US -2586610176,2586610431,GB -2586610432,2586610687,US -2586610688,2586611711,ES -2586611712,2586622463,US -2586622464,2586622975,ES -2586622976,2586640383,US -2586640384,2586640399,MC -2586640400,2586640895,US -2586640896,2586641407,FR -2586641408,2586650687,US -2586650688,2586650703,DE -2586650704,2586694655,US -2586694656,2586694911,FR -2586694912,2586714879,US -2586714880,2586715135,NL -2586715136,2586716159,US -2586716160,2586716671,ES -2586716672,2586717183,US -2586717184,2586718207,ES -2586718208,2586726655,US -2586726656,2586726911,GB -2586726912,2586733567,US -2586733568,2586733823,LT -2586733824,2586734591,US -2586734592,2586735615,LT -2586735616,2586758143,US -2586758144,2586758655,DE -2586758656,2586787839,US -2586787840,2586796031,GB -2586796032,2586804223,US -2586804224,2586804479,ES -2586804480,2586804735,US -2586804736,2586805247,ES -2586805248,2586805503,US -2586805504,2586805759,ES -2586805760,2586806271,US -2586806272,2586807295,ES -2586807296,2586814463,US -2586814464,2586816511,RO -2586816512,2586828799,US -2586828800,2586828863,CH -2586828864,2586829311,US -2586829312,2586829567,CH -2586829568,2586853887,US -2586853888,2586854143,ES -2586854144,2586854399,US -2586854400,2586855423,ES -2586855424,2586869759,US -2586869760,2586875903,ES -2586875904,2586876415,US -2586876416,2586876671,ES -2586876672,2586876927,US -2586876928,2586882559,ES -2586882560,2586884095,US -2586884096,2586884351,ES -2586884352,2586885119,US -2586885120,2586886143,ES -2586886144,2586887167,DE -2586887168,2586888191,US -2586888192,2586888447,DE -2586888448,2586890239,US -2586890240,2586890751,DE -2586890752,2586891263,US -2586891264,2586891519,GB -2586891520,2586927103,US -2586927104,2586935295,GB -2586935296,2586952191,US -2586952192,2586952447,FR -2586952448,2586952703,US -2586952704,2586953471,FR -2586953472,2586953727,ES -2586953728,2586953983,MX -2586953984,2586954239,PE -2586954240,2586956287,US -2586956288,2586957311,FR -2586957312,2586968127,US -2586968128,2586968319,FR -2586968320,2587018239,US -2587018240,2587020799,IE -2587020800,2587021823,US -2587021824,2587022847,IE -2587022848,2587049983,US -2587049984,2587058175,GB -2587058176,2587066367,US -2587066368,2587069439,GB -2587069440,2587070463,US -2587070464,2587082751,GB -2587082752,2587128522,US -2587128523,2587128523,TR -2587128524,2587131903,US -2587131904,2587132415,FR -2587132416,2587164671,US -2587164672,2587172863,CH -2587172864,2587197439,US -2587197440,2587197695,ES -2587197696,2587214847,US -2587214848,2587215871,GB -2587215872,2587217919,US -2587217920,2587218943,CG -2587218944,2587240389,US -2587240390,2587240390,FR -2587240391,2587249417,US -2587249418,2587249418,FR -2587249419,2587361791,US -2587361792,2587362047,MD -2587362048,2587377663,US -2587377664,2587385855,FR -2587385856,2587394047,US -2587394048,2587399423,ES -2587399424,2587399679,US -2587399680,2587402239,ES -2587402240,2587410431,US -2587410432,2587418623,IT -2587418624,2587427839,US -2587427840,2587429887,GR -2587429888,2587443199,US -2587443200,2587447295,CH -2587447296,2587476760,US -2587476761,2587476761,LB -2587476762,2587479119,US -2587479120,2587479120,LB -2587479121,2587481969,US -2587481970,2587481970,LB -2587481971,2587484159,US -2587484160,2587492351,GB -2587492352,2587497471,ES -2587497472,2587498495,US -2587498496,2587499007,ES -2587499008,2587504639,US -2587504640,2587508735,ES -2587508736,2587525119,GB -2587525120,2587542527,US -2587542528,2587544575,ES -2587544576,2587545599,US -2587545600,2587549695,ES -2587549696,2587582463,US -2587582464,2587587071,NL -2587587072,2587592703,US -2587592704,2587594751,GB -2587594752,2587596799,US -2587596800,2587598847,GB -2587598848,2587607295,US -2587607296,2587607551,DE -2587607552,2587623423,US -2587623424,2587631615,BG -2587631616,2587631871,US -2587631872,2587632127,ES -2587632128,2587639807,US -2587639808,2587647999,GB -2587648000,2587648511,US -2587648512,2587649023,ES -2587649024,2587650815,US -2587650816,2587651071,ES -2587651072,2587674623,US -2587674624,2587676671,IT -2587676672,2587680767,US -2587680768,2587684863,ES -2587684864,2587686911,US -2587686912,2587688959,ES -2587688960,2587697151,US -2587697152,2587697407,GB -2587697408,2587698175,US -2587698176,2587699199,GB -2587699200,2587700223,US -2587700224,2587700735,GB -2587700736,2587713535,US -2587713536,2587714559,ES -2587714560,2587717631,US -2587717632,2587721727,ES -2587721728,2587738111,US -2587738112,2587738623,RS -2587738624,2587740159,US -2587740160,2587742207,RS -2587742208,2587746303,US -2587746304,2587747327,ES -2587747328,2587926527,US -2587926528,2587930623,BG -2587930624,2587938815,US -2587938816,2587939327,PR -2587939328,2587941375,US -2587941376,2587941631,PR -2587941632,2587951103,US -2587951104,2587952127,ZA -2587952128,2587953151,NG -2587953152,2587954175,MU -2587954176,2587955199,ZA -2587955200,2587959295,KE -2587959296,2587961343,SN -2587961344,2587962367,ZA -2587962368,2587963391,SS -2587963392,2587963647,GS -2587963648,2587964415,SS -2587964416,2587965439,ZA -2587966464,2587967487,BF -2587967488,2587975679,ZA -2587975680,2587983871,GH -2587983872,2588016639,AO -2588016640,2588033023,NG -2588033024,2588037119,ZA -2588037120,2588038143,AO -2588038144,2588039167,GN -2588039168,2588041215,ZA -2588042240,2588043263,SS -2588043264,2588044287,AO -2588044288,2588045311,LS -2588045312,2588046335,ZA -2588046336,2588047359,TD -2588047360,2588049407,MW -2588049408,2588053503,BJ -2588053504,2588057599,ZA -2588057600,2588061695,BF -2588061696,2588070911,ZA -2588070912,2588071935,TZ -2588071936,2588072959,UG -2588072960,2588073983,NE -2588073984,2588075007,TZ -2588075008,2588076031,MU -2588076032,2588078079,GA -2588078080,2588078335,KE -2588078336,2588078591,ZA -2588078592,2588078847,FR -2588078848,2588079103,TZ -2588079104,2588079359,ZA -2588079360,2588079615,DJ -2588079616,2588079871,GB -2588079872,2588080127,MU -2588080128,2588082175,ZA -2588082176,2588147711,RE -2588147712,2588164095,CI -2588164096,2588180479,RW -2588180480,2588188671,TD -2588188672,2588196863,ZA -2588196864,2588213247,NG -2588213248,2588278783,ZA -2588278784,2588295167,KE -2588295168,2588299263,GH -2588299264,2588303359,TG -2588303360,2588311551,CM -2588311552,2588315647,ZA -2588315648,2588317695,BW -2588317696,2588318719,ZA -2588318720,2588319743,UG -2588319744,2588327935,SC -2588327936,2588328959,ML -2588328960,2588329983,BI -2588329984,2588332031,MA -2588332032,2588343039,ZA -2588343040,2588343295,BI -2588343296,2588344319,ZA -2588344320,2588409855,MU -2588409856,2588410879,KE -2588410880,2588412927,ZA -2588412928,2588413951,ST -2588413952,2588414975,UG -2588414976,2588415999,TZ -2588416000,2588417023,SO -2588417024,2588418047,KE -2588418048,2588420095,NG -2588420096,2588422143,ZA -2588422144,2588423167,SO -2588423168,2588424191,CD -2588424192,2588426239,ZA -2588426240,2588434431,TZ -2588434432,2588438527,ZA -2588438528,2588442623,BJ -2588442624,2588459007,CM -2588459008,2588467199,UG -2588467200,2588471295,TN -2588471296,2588477439,ZA -2588477440,2588478463,NG -2588478464,2588479487,UG -2588479488,2588480511,ZA -2588480512,2588481535,CD -2588481536,2588482559,SO -2588482560,2588483583,LY -2588483584,2588484607,ZA -2588484608,2588485631,BW -2588485632,2588486655,BI -2588486656,2588487679,SO -2588487680,2588487711,SC -2588487712,2588487743,FR -2588487744,2588487807,BF -2588487808,2588487839,NE -2588487840,2588487871,SC -2588487872,2588487935,MW -2588487936,2588488703,SC -2588488704,2588489727,LY -2588489728,2588490751,GQ -2588490752,2588491775,GW -2588491776,2588492799,TZ -2588492800,2588494847,ZA -2588494848,2588495871,SO -2588495872,2588496895,ZW -2588496896,2588497919,BW -2588497920,2588498943,SS -2588498944,2588499967,DZ -2588499968,2588500991,ZA -2588500992,2588502015,CI -2588502016,2588503039,BI -2588503040,2588504063,LY -2588504064,2588505087,TD -2588505088,2588505599,CG -2588505600,2588505855,US -2588505856,2588506111,CG -2588506112,2588507135,ZA -2588507136,2588508159,SO -2588508160,2588510207,LY -2588510208,2588512255,ZA -2588512256,2588514303,TZ -2588514304,2588516351,ZA -2588516352,2588518399,TD -2588518400,2588519423,TZ -2588519424,2588520447,SN -2588520448,2588521471,SL -2588521472,2588526591,ZA -2588526592,2588528639,CM -2588528640,2588534783,ZA -2588534784,2588535807,ZM -2588535808,2588536831,NG -2588536832,2588540927,ZA -2588540928,2588671999,TZ -2588672000,2588934143,KE -2588934144,2588999679,ZA -2588999680,2589234175,US -2589234176,2589234431,AT -2589234432,2589234687,BD -2589234688,2589234943,BR -2589234944,2589235199,CY -2589235200,2589235455,CZ -2589235456,2589235711,FI -2589235712,2589235967,GR -2589235968,2589236223,HU -2589236224,2589236479,IN -2589236480,2589236735,ID -2589236736,2589236991,IR -2589236992,2589237247,IQ -2589237248,2589237503,IE -2589237504,2589237759,JP -2589237760,2589238015,JO -2589238016,2589238271,KE -2589238272,2589238527,LU -2589238528,2589238783,MY -2589238784,2589239039,MX -2589239040,2589239295,PH -2589239296,2589239551,PL -2589239552,2589239807,PT -2589239808,2589240063,QA -2589240064,2589240319,RU -2589240320,2589240575,SA -2589240576,2589240831,SK -2589240832,2589241087,HK -2589241088,2589241343,SE -2589241344,2589241599,CH -2589241600,2589241855,BR -2589241856,2589242111,TW -2589242112,2589242367,TR -2589242368,2589242623,UA -2589242624,2589242879,VN -2589242880,2589523967,US -2589523968,2589589503,HK -2589589504,2589655039,US -2589655040,2589720575,HK -2589720576,2589982719,US -2589982720,2590507007,SD -2590507008,2591031295,TN -2591031296,2591096831,GA -2591096832,2591162367,NG -2591162368,2591195135,ZA -2591195136,2591227903,GH -2591227904,2591260671,ZA -2591260672,2591264767,SN -2591264768,2591268863,ZA -2591268864,2591277055,KE -2591277056,2591293439,SO -2591293440,2591326207,GA -2591326208,2591358975,AO -2591358976,2591375359,GH -2591375360,2591391743,NG -2591391744,2591408127,ZA -2591408128,2591424511,BI -2591424512,2591457279,NG -2591457280,2591473663,ML -2591473664,2591477759,AO -2591477760,2591481855,PT -2591481856,2591483903,TZ -2591483904,2591485951,KE -2591485952,2591486975,SO -2591486976,2591487999,ZA -2591488000,2591489023,GA -2591489024,2591490047,ZA -2591490048,2591498239,BI -2591498240,2591510527,ZA -2591510528,2591514623,ZW -2591514624,2591522815,SZ -2591522816,2591526911,LR -2591526912,2591539199,ZA -2591539200,2591547391,GA -2591547392,2591555583,ZA -2591555584,2591571967,GH -2591571968,2591588351,NG -2591588352,2591604735,MG -2591604736,2591605759,ZA -2591605760,2591606783,KE -2591606784,2591610879,MU -2591610880,2591612927,ZM -2591612928,2591621119,ZW -2591621120,2591686655,DZ -2591686656,2591817727,KE -2591817728,2591948799,SN -2591948800,2591981567,MG -2591981568,2591997951,CM -2591997952,2592006143,ZA -2592006144,2592022527,TZ -2592022528,2592026623,BJ -2592026624,2592026879,US -2592026880,2592027391,ZA -2592027392,2592027647,GB -2592027648,2592028671,US -2592028672,2592028799,NG -2592028800,2592028927,KE -2592028928,2592029183,ZA -2592029184,2592029311,CI -2592029312,2592030207,ZA -2592030208,2592030335,GH -2592030336,2592030463,CM -2592030464,2592030591,UG -2592030592,2592030719,ZA -2592030720,2592034815,LY -2592034816,2592038911,NE -2592038912,2592043007,DZ -2592043008,2592047103,ZA -2592047104,2592079871,AO -2592079872,2593128447,EG -2593128448,2593522687,MA -2593522688,2593522943,EH -2593522944,2593652735,MA -2593652736,2594177023,KE -2594177024,2595225599,GH -2595225600,2596274175,EG -2596274176,2597322751,ZA -2597322752,2598361599,US -2598361600,2598362111,CI -2598362112,2598371327,US -2598371328,2598895615,UG -2598895616,2599157759,CI -2599157760,2599419903,EG -2599419904,2599508735,DZ -2599508736,2599508991,EH -2599508992,2600468479,DZ -2600468480,2600534015,ZM -2600534016,2600665087,US -2600665088,2600730623,CA -2600730624,2600779775,SE -2600779776,2600780031,NO -2600780032,2600781311,SE -2600781312,2600781567,NO -2600781568,2600788735,SE -2600788736,2600788991,NO -2600788992,2600791807,SE -2600791808,2600792063,NO -2600792064,2600796159,SE -2600796160,2601123839,US -2601123840,2601189375,CA -2601189376,2601254911,EG -2601254912,2601287679,TZ -2601287680,2601304063,EG -2601304064,2601312255,CM -2601312256,2601320447,GH -2601320448,2601451519,US -2601451520,2601517055,CA -2601517056,2602565631,US -2602565632,2602631167,NZ -2602631168,2602762495,US -2602762496,2602762751,IN -2602762752,2602770943,US -2602770944,2602771455,IN -2602771456,2602774015,US -2602774016,2602774527,IN -2602774528,2602819583,US -2602819584,2602827775,AU -2602827776,2603417599,US -2603417600,2603483135,DE -2603483136,2604007423,US -2604007424,2604072959,ES -2604072960,2604138495,NO -2604138496,2604204031,DE -2604204032,2604335103,US -2604335104,2604400639,NZ -2604400640,2604466175,AU -2604466176,2604648447,US -2604648448,2604648959,NZ -2604648960,2604649983,US -2604649984,2604650495,CA -2604650496,2604793855,US -2604793856,2604859391,CH -2604859392,2604990463,US -2604990464,2605055999,SG -2605056000,2605121535,US -2605121536,2605187071,AU -2605187072,2605252607,US -2605252608,2605318143,AT -2605318144,2606301183,US -2606301184,2606366719,AO -2606366720,2606563327,US -2606563328,2606596095,NG -2606596096,2606628863,ZA -2606628864,2607349759,US -2607349760,2607415295,CH -2607415296,2609053695,US -2609053696,2609119231,GB -2609119232,2609184767,FR -2609184768,2609217535,PL -2609217536,2609219583,FR -2609219584,2609233919,PL -2609233920,2609234175,ES -2609234176,2609234431,PL -2609234432,2609234687,PT -2609234688,2609234943,PL -2609234944,2609235711,US -2609235712,2609235839,SI -2609235840,2609235967,HR -2609235968,2609242111,DE -2609242112,2609246207,PL -2609246208,2609246719,LU -2609246720,2609247231,SE -2609247232,2609247487,HK -2609247488,2609247743,JP -2609247744,2609248255,ES -2609248256,2609248511,NL -2609248512,2609248767,CL -2609248768,2609249279,PE -2609249280,2609249535,SE -2609249536,2609250303,PL -2609250304,2609381375,US -2609381376,2609446911,GB -2609446912,2609512447,DK -2609512448,2609643519,US -2609643520,2609708799,FR -2609708800,2609708839,HK -2609708840,2609708843,FR -2609708844,2609709055,HK -2609709056,2609840127,US -2609840128,2609971199,AU -2609971200,2610036735,GB -2610036736,2610823167,US -2610823168,2610888703,PL -2610888704,2610954239,ZA -2610954240,2611019775,JP -2611019776,2612592639,US -2612592640,2612658175,IT -2612658176,2612723711,US -2612723712,2612789247,AU -2612789248,2613051391,US -2613051392,2613116927,GB -2613116928,2613182463,US -2613182464,2613247999,CA -2613248000,2613313535,US -2613313536,2613379071,SD -2613379072,2613444607,US -2613444608,2613510143,GB -2613510144,2613706751,US -2613706752,2613772287,GB -2613772288,2613837823,US -2613837824,2613903359,NL -2613903360,2613968895,AU -2613968896,2614034431,US -2614034432,2614099967,GR -2614099968,2614165503,US -2614165504,2614231039,NO -2614231040,2614296575,ES -2614296576,2614362111,BR -2614362112,2615083007,US -2615083008,2615148543,TR -2615148544,2615345151,US -2615345152,2615410687,NO -2615410688,2615476223,CH -2615476224,2615541759,US -2615541760,2615607295,KR -2615607296,2615672831,GB -2615672832,2616262655,ZA -2616262656,2616524799,US -2616524800,2616590335,GB -2616590336,2616786943,US -2616786944,2616852479,GB -2616852480,2616918015,DE -2616918016,2616983551,GM -2616983552,2617049087,US -2617049088,2617114623,IT -2617114624,2617115135,US -2617115136,2617115647,CA -2617115648,2617123839,US -2617123840,2617124095,DE -2617124352,2617124607,US -2617124864,2617126911,NL -2617129984,2617130239,US -2617130496,2617130751,US -2617131008,2617139199,CA -2617139200,2617139455,PE -2617139456,2617139711,SZ -2617139712,2617139967,AU -2617139968,2617140223,PA -2617140224,2617140479,CO -2617140480,2617140735,SC -2617140736,2617140991,CA -2617140992,2617141247,LC -2617141248,2617141503,SV -2617141504,2617141759,US -2617141760,2617142015,ZW -2617142016,2617142271,KR -2617142272,2617142527,US -2617142528,2617142783,LU -2617142784,2617143039,US -2617143040,2617143295,UG -2617143296,2617143551,US -2617143552,2617143807,TT -2617143808,2617144063,US -2617144064,2617144319,ZA -2617144320,2617144575,US -2617144576,2617144831,FJ -2617144832,2617145343,US -2617145344,2617145599,NI -2617145600,2617145855,UA -2617145856,2617146111,US -2617146112,2617146367,CI -2617146368,2617146623,US -2617146624,2617146879,GY -2617146880,2617147135,DE -2617147136,2617149439,US -2617149440,2617151487,CA -2617151488,2617157119,US -2617157120,2617157631,RU -2617157632,2617158655,US -2617158656,2617159679,SE -2617159680,2617162751,US -2617162752,2617163263,SE -2617163264,2617163775,US -2617163776,2617164031,SK -2617164032,2617164287,MC -2617164288,2617164543,AZ -2617164544,2617164799,FI -2617164800,2617165055,CZ -2617165056,2617165311,UZ -2617165312,2617165567,BT -2617165568,2617165823,CN -2617165824,2617166079,ME -2617166080,2617166335,YE -2617166336,2617166591,KH -2617166592,2617166847,TJ -2617166848,2617167103,KG -2617167104,2617167359,IN -2617167360,2617167615,DK -2617167616,2617167871,IL -2617167872,2617168127,PL -2617168128,2617168383,LA -2617168384,2617168639,GH -2617168640,2617168895,BD -2617168896,2617169151,LI -2617169152,2617169407,ET -2617169408,2617169663,SM -2617169664,2617169919,BH -2617169920,2617170175,CY -2617170176,2617170431,NZ -2617170432,2617170687,PS -2617170688,2617170943,GI -2617170944,2617171199,RS -2617171200,2617171455,HK -2617171456,2617171711,HR -2617171712,2617171967,SN -2617171968,2617172223,MV -2617172224,2617172479,AF -2617172480,2617172735,JP -2617172736,2617172991,CM -2617172992,2617173247,VA -2617173248,2617173503,JP -2617173504,2617173759,TM -2617173760,2617174015,GE -2617174016,2617174271,TR -2617174272,2617174527,TW -2617174528,2617174783,KW -2617174784,2617175039,EE -2617175040,2617175295,CN -2617175296,2617175551,MA -2617175552,2617175807,BA -2617175808,2617176063,IQ -2617176064,2617176319,NO -2617176320,2617176575,AU -2617176576,2617176831,TH -2617176832,2617177087,VN -2617177088,2617177343,US -2617177344,2617177599,RU -2617177600,2617177855,IN -2617177856,2617178111,BE -2617178112,2617178367,IM -2617178368,2617178623,BN -2617178624,2617178879,US -2617178880,2617179135,LT -2617179136,2617179391,MD -2617179392,2617179647,SI -2617179648,2617179903,KE -2617179904,2617180159,NG -2617180160,2617245695,UG -2617245696,2617262079,LS -2617262080,2617266175,ZA -2617268224,2617269247,CD -2617270272,2617278463,ZA -2617278464,2617286655,GH -2617286656,2617296383,ZA -2617296384,2617296639,CD -2617296640,2617296895,AO -2617296896,2617299967,ZA -2617299968,2617300991,BJ -2617300992,2617305087,ZA -2617305088,2617305599,KE -2617305600,2617306111,GH -2617306112,2617307135,ZA -2617307136,2617308159,SZ -2617308160,2617309183,ZA -2617309184,2617310207,NG -2617310208,2617310719,ZA -2617310720,2617310975,AO -2617310976,2617311231,NG -2617311232,2617769983,US -2617769984,2617835519,ZA -2617835520,2617901055,US -2617901056,2617966591,FI -2617966592,2618028031,CA -2618028032,2618028543,IE -2618028544,2618029055,GB -2618029056,2618032127,CA -2618032128,2618097663,US -2618097664,2618115583,NZ -2618115584,2618116095,SG -2618116096,2618163199,NZ -2618163200,2618228735,IT -2618228736,2618294271,US -2618359808,2618425343,PL -2618425344,2618490879,FR -2618490880,2618687487,US -2618687488,2618753023,AU -2618753024,2618884095,US -2618884096,2618949631,CH -2618949632,2619080703,US -2619080704,2619146239,FR -2619146240,2619277311,US -2619277312,2619342847,BN -2619342848,2619473919,US -2619473920,2619539455,CA -2619539456,2619604991,ES -2619604992,2619736063,US -2619736064,2619737087,ZA -2619737088,2619738111,BW -2619738112,2619740159,RW -2619740160,2619744255,BW -2619744256,2619752447,LY -2619752448,2619760639,TG -2619760640,2619768831,GH -2619768832,2619801599,ZA -2619801600,2620063743,US -2620063744,2620078591,GB -2620078592,2620078847,US -2620078848,2620129279,GB -2620129280,2620194815,CA -2620194816,2620315039,US -2620315040,2620315063,DE -2620315064,2620391423,US -2620391424,2620456959,GB -2620456960,2620522495,SE -2620522496,2620588031,AU -2620588032,2620653567,SE -2620653568,2620719103,NO -2620719104,2620784639,US -2620784640,2620850175,IT -2620850176,2620981247,US -2620981248,2621046783,CA -2621046784,2621112319,AT -2621112320,2621177855,NZ -2621177856,2621243391,US -2621243392,2621308927,GB -2621308928,2621374463,NZ -2621374464,2621636863,US -2621636864,2621636991,CZ -2621636992,2621637055,MD -2621637056,2621637119,BG -2621637120,2621637631,US -2621637632,2621638159,DE -2621638160,2621638167,GB -2621638168,2621638655,DE -2621638656,2621639679,CH -2621639680,2621640191,DE -2621640192,2621640703,NL -2621640704,2621641727,DE -2621641728,2621642751,IT -2621642752,2621644799,DE -2621644800,2621645823,GB -2621645824,2621646335,DE -2621646336,2621646591,CH -2621646592,2621648895,DE -2621648896,2621649919,UA -2621649920,2621651967,DE -2621651968,2621652991,ES -2621652992,2621669375,PL -2621669376,2621685759,DE -2621685760,2621685887,NO -2621685888,2621686015,DK -2621686016,2621686271,GB -2621686272,2621686527,AU -2621686528,2621686783,GB -2621686784,2621687039,AU -2621687040,2621687295,GB -2621687296,2621687423,CZ -2621687424,2621687551,PL -2621687552,2621687807,GB -2621687808,2621687935,AT -2621687936,2621688063,IE -2621688064,2621688319,AU -2621688320,2621688575,MX -2621688576,2621688831,AU -2621688832,2621689087,GB -2621689088,2621689151,HU -2621689152,2621689215,SK -2621689216,2621689279,PL -2621689280,2621689343,CZ -2621689344,2621689599,AU -2621689600,2621689855,CA -2621689856,2621692927,SG -2621692928,2621693951,CY -2621693952,2621698047,DE -2621698048,2621702143,GB -2621702144,2621767679,US -2621767680,2621833215,NZ -2621833216,2621936895,US -2621936896,2621937151,SG -2621937152,2622685183,US -2622685184,2622750719,NL -2622750720,2623602687,US -2623602688,2623668223,CL -2623668224,2624192511,US -2624192512,2624258047,CH -2624258048,2624265727,US -2624265728,2624266239,SG -2624266240,2624269313,US -2624269314,2624269314,AU -2624269315,2624269317,US -2624269318,2624269318,AU -2624269319,2624269321,US -2624269322,2624269322,AU -2624269323,2624269345,US -2624269346,2624269346,AU -2624269347,2624269349,US -2624269350,2624269350,AU -2624269351,2624269353,US -2624269354,2624269354,AU -2624269355,2624269377,US -2624269378,2624269378,AU -2624269379,2624269381,US -2624269382,2624269382,AU -2624269383,2624269385,US -2624269386,2624269386,AU -2624269387,2624270335,US -2624270336,2624270847,AU -2624270848,2624277503,US -2624277504,2624278015,AU -2624278016,2624279039,US -2624279040,2624279071,IN -2624279072,2624279095,US -2624279096,2624279111,IN -2624279112,2624286719,US -2624286720,2624287231,IN -2624287232,2624291839,US -2624291840,2624292351,CN -2624292352,2624292863,US -2624292864,2624292883,SG -2624292884,2624292887,HK -2624292888,2624292891,SG -2624292892,2624292895,TW -2624292896,2624292899,KR -2624292900,2624292903,VN -2624292904,2624292907,JP -2624292908,2624292911,ID -2624292912,2624292915,MY -2624292916,2624292919,PH -2624292920,2624292923,TH -2624292924,2624293003,SG -2624293004,2624293007,HK -2624293008,2624293011,SG -2624293012,2624293015,TW -2624293016,2624293019,KR -2624293020,2624293023,VN -2624293024,2624293027,JP -2624293028,2624293031,ID -2624293032,2624293035,MY -2624293036,2624293039,PH -2624293040,2624293043,TH -2624293044,2624293139,SG -2624293140,2624293143,HK -2624293144,2624293147,SG -2624293148,2624293151,TW -2624293152,2624293155,KR -2624293156,2624293159,VN -2624293160,2624293163,JP -2624293164,2624293167,ID -2624293168,2624293171,MY -2624293172,2624293175,PH -2624293176,2624293179,TH -2624293180,2624293375,SG -2624293376,2624293385,US -2624293386,2624293386,SG -2624293387,2624297983,US -2624297984,2624297999,SG -2624298000,2624298003,CN -2624298004,2624298007,HK -2624298008,2624298011,SG -2624298012,2624298015,TW -2624298016,2624298019,KR -2624298020,2624298023,VN -2624298024,2624298027,JP -2624298028,2624298031,ID -2624298032,2624298035,MY -2624298036,2624298039,PH -2624298040,2624298043,TH -2624298044,2624298119,SG -2624298120,2624298123,CN -2624298124,2624298127,HK -2624298128,2624298131,SG -2624298132,2624298135,TW -2624298136,2624298139,KR -2624298140,2624298143,VN -2624298144,2624298147,JP -2624298148,2624298151,ID -2624298152,2624298155,MY -2624298156,2624298159,PH -2624298160,2624298163,TH -2624298164,2624298255,SG -2624298256,2624298259,CN -2624298260,2624298263,HK -2624298264,2624298267,SG -2624298268,2624298271,TW -2624298272,2624298275,KR -2624298276,2624298279,VN -2624298280,2624298283,JP -2624298284,2624298287,ID -2624298288,2624298291,MY -2624298292,2624298295,PH -2624298296,2624298299,TH -2624298300,2624298495,SG -2624298496,2624302081,US -2624302082,2624302082,AU -2624302083,2624302085,US -2624302086,2624302086,AU -2624302087,2624302089,US -2624302090,2624302090,AU -2624302091,2624302113,US -2624302114,2624302114,AU -2624302115,2624302117,US -2624302118,2624302118,AU -2624302119,2624302121,US -2624302122,2624302122,AU -2624302123,2624302149,US -2624302150,2624302150,AU -2624302151,2624302153,US -2624302154,2624302154,AU -2624302155,2624302591,US -2624302592,2624303103,AU -2624303104,2624303615,US -2624303616,2624304639,CN -2624304640,2624395263,US -2624395264,2624395775,GB -2624395776,2624716799,US -2624716800,2624782335,NL -2624782336,2624847871,CH -2624847872,2624913407,NO -2624913408,2624978943,US -2624978944,2625044479,FR -2625044480,2625134559,US -2625134560,2625134591,UA -2625134592,2625961983,US -2625961984,2626027519,LU -2626027520,2626093055,US -2626093056,2626158591,CH -2626158592,2626879487,US -2626879488,2626945023,KR -2626945024,2627010559,IT -2627010560,2627076095,NZ -2627076096,2627141631,NL -2627141632,2627354706,US -2627354707,2627354707,HK -2627354708,2627403775,US -2627403776,2627469311,ZA -2627469312,2627731455,TZ -2627731456,2631925759,EG -2631925760,2632450047,ZA -2632450048,2632974335,US -2632974336,2634022911,ZA -2634022912,2634088447,CN -2634088448,2635202559,JP -2635202560,2635268095,CN -2635268096,2635333631,JP -2635399168,2635530239,US -2635530240,2635595775,FR -2635595776,2635661311,FI -2635661312,2635726847,PL -2635726848,2635792383,CH -2635792384,2635988991,IT -2635988992,2636120063,US -2636120064,2637430783,IN -2637430784,2637438975,CA -2637438976,2637447679,US -2637447680,2637447935,CA -2637447936,2637448191,US -2637448192,2637448447,ZA -2637448448,2637448703,ES -2637448704,2637448959,NZ -2637448960,2637449215,SG -2637449216,2637449727,BR -2637449728,2637451519,US -2637451520,2637451775,HK -2637451776,2637452031,US -2637452032,2637452543,IN -2637452544,2637452799,CA -2637452800,2637453311,US -2637453312,2637453567,AR -2637453568,2637453823,CL -2637453824,2637454079,US -2637454080,2637454335,JP -2637454336,2637627391,US -2637627392,2637627551,IE -2637627552,2637627583,US -2637627584,2637628031,IE -2637628032,2637628095,US -2637628096,2637628927,IE -2637628928,2637628959,US -2637628960,2637629007,IE -2637629008,2637629023,US -2637629024,2637629311,IE -2637629312,2637629375,US -2637629376,2637629439,IE -2637629440,2637629599,NL -2637629600,2637629631,IE -2637629632,2637629663,NL -2637629664,2637629807,IE -2637629808,2637629823,US -2637629824,2637629951,IE -2637629952,2637630111,US -2637630112,2637630119,IE -2637630120,2637630127,US -2637630128,2637630143,IE -2637630144,2637630207,US -2637630208,2637630335,NL -2637630336,2637630479,US -2637630480,2637630495,IE -2637630496,2637630655,US -2637630656,2637630783,IE -2637630784,2637630847,US -2637630848,2637631487,IE -2637631488,2637637887,US -2637637888,2637638143,IE -2637638144,2637638399,US -2637638400,2637638463,IE -2637638464,2637638503,US -2637638504,2637638511,IE -2637638512,2637638671,US -2637638672,2637638815,IE -2637638816,2637638879,US -2637638880,2637638911,IE -2637638912,2637638943,US -2637638944,2637639039,IE -2637639040,2637639359,US -2637639360,2637639423,IE -2637639424,2637639551,US -2637639552,2637639679,IE -2637639680,2637641535,US -2637641536,2637641567,IE -2637641568,2637641663,US -2637641664,2637641671,IE -2637641672,2637654591,US -2637654592,2637654655,IE -2637654656,2637654783,US -2637654784,2637655039,IE -2637655040,2637679743,US -2637679744,2637679871,IE -2637679872,2637684735,US -2637684736,2637684991,IE -2637684992,2637685183,US -2637685184,2637685215,IE -2637685216,2637685247,US -2637685248,2637685631,IE -2637685632,2637685663,US -2637685664,2637685695,IE -2637685696,2637686271,US -2637686272,2637686463,IE -2637686464,2637686495,US -2637686496,2637686503,IE -2637686504,2637686511,NL -2637686512,2637686655,US -2637686656,2637686783,IE -2637686784,2637686855,US -2637686856,2637686975,IE -2637686976,2637687215,US -2637687216,2637687615,IE -2637687616,2637687679,US -2637687680,2637688319,IE -2637688320,2637688479,US -2637688480,2637688831,IE -2637688832,2637722143,US -2637722144,2637722175,IE -2637722176,2637722943,US -2637722944,2637722975,NL -2637722976,2637723647,US -2637723648,2637725695,IE -2637725696,2637733119,US -2637733120,2637733375,JP -2637733376,2637733631,SG -2637733632,2637742079,US -2637742080,2637744127,IE -2637744128,2637746175,US -2637746176,2637746183,FI -2637746184,2637746191,IE -2637746192,2637746199,NL -2637746200,2637746207,FI -2637746208,2637746215,IE -2637746216,2637746223,US -2637746224,2637746231,AT -2637746232,2637746247,US -2637746248,2637746255,FI -2637746256,2637746263,AT -2637746264,2637746279,NL -2637746280,2637746687,US -2637746688,2637746703,KR -2637746704,2637746743,US -2637746744,2637746751,HK -2637746752,2637746759,SG -2637746760,2637746767,KR -2637746768,2637756415,US -2637756416,2637757439,NL -2637757440,2637758463,IE -2637758464,2637997055,US -2637997056,2637997311,AU -2637997312,2637998591,US -2637998592,2637998847,AU -2637998848,2638000127,US -2638000128,2638000255,AU -2638000256,2638002175,US -2638002176,2638002687,AU -2638002688,2638020607,US -2638020608,2638086143,CN -2638086144,2638151679,US -2638151680,2638818303,JP -2638818304,2638818559,SO -2638818560,2638838783,JP -2638838784,2638839039,SO -2638839040,2639331327,JP -2639396864,2639462399,JP -2639462400,2639593471,GB -2639593472,2639659007,AU -2639659008,2639724543,BR -2639724544,2639790079,US -2639790080,2639855615,ES -2639855616,2640052223,US -2640052224,2640117759,AR -2640117760,2640183295,US -2640183296,2640248831,FI -2640248832,2640314367,US -2640314368,2640379903,GB -2640379904,2640388095,IS -2640388096,2640392191,DE -2640392192,2640396287,NL -2640396288,2640397311,ES -2640397312,2640398335,AT -2640398336,2640400383,DE -2640400384,2640404479,ES -2640404480,2640404735,NL -2640404736,2640404991,US -2640404992,2640405503,NL -2640405504,2640406527,US -2640406528,2640408575,DE -2640408576,2640410623,NL -2640410624,2640411135,US -2640411136,2640411391,MX -2640411392,2640412671,US -2640412672,2640413695,GB -2640413696,2640413951,NL -2640413952,2640414463,US -2640414464,2640414719,DE -2640414720,2640416767,FR -2640416768,2640417023,NL -2640417024,2640417279,CA -2640417280,2640417791,NL -2640417792,2640418815,CH -2640418816,2640420863,NO -2640420864,2640421631,IT -2640421632,2640421887,DE -2640421888,2640422911,SE -2640422912,2640423935,NL -2640423936,2640429055,ES -2640429056,2640445439,NL -2640445440,2640510975,US -2640510976,2640576511,FR -2640576512,2640642047,EC -2640642048,2641740287,JP -2641740288,2641740543,BI -2641740544,2641821695,JP -2641821696,2641822719,CN -2641822720,2641823743,JP -2641823744,2641826815,CN -2641826816,2641827839,HK -2641827840,2641828095,IN -2641828096,2641828351,US -2641828352,2641828863,IN -2641828864,2641829887,CN -2641829888,2641831935,KR -2641831936,2641833983,IN -2641833984,2641835007,BD -2641835008,2641836031,JP -2641836032,2641837055,ID -2641837056,2641838079,NZ -2641838080,2641839103,JP -2641839104,2641840127,CN -2641840128,2641841151,HK -2641841152,2641842175,MM -2641842176,2641845247,IN -2641845248,2641846271,HK -2641846272,2641847295,NL -2641847296,2641848319,IR -2641848320,2641850367,IN -2641850368,2641851391,HK -2641851392,2641854463,IN -2641854464,2641855487,JP -2641855488,2641864703,CN -2641864704,2641865727,IN -2641865728,2641866751,CN -2641866752,2641867775,IN -2641867776,2641868799,LA -2641868800,2641869823,BD -2641869824,2641870847,IR -2641870848,2641872895,CN -2641872896,2641878015,IN -2641878016,2641879039,ID -2641879040,2641881087,IN -2641881088,2641882111,HK -2641882112,2641883135,BD -2641883136,2641884159,CN -2641884160,2641886207,VN -2641886208,2641887231,CN -2641887232,2641928191,JP -2641928192,2641936383,SG -2641936384,2641944575,US -2641944576,2641946625,JP -2641946626,2641946626,HK -2641946627,2641952767,JP -2641952768,2642018303,US -2642018304,2642083839,CN -2642083840,2642149375,US -2642149376,2642214911,FI -2642214912,2642280447,GB -2642280448,2642411519,US -2642411520,2642477055,AU -2642477056,2642542591,FI -2642542592,2642739199,US -2642739200,2642743295,RU -2642743296,2642751487,US -2642751488,2642755583,CA -2642755584,2642757631,DE -2642757632,2642759679,US -2642759680,2642761727,AE -2642761728,2642763775,SA -2642763776,2642767871,AU -2642767872,2642771967,DE -2642771968,2642776063,NL -2642776064,2642780159,JP -2642780160,2642935807,US -2642935808,2643001343,FR -2643001344,2643066879,US -2643066880,2643132415,IT -2643132416,2643197951,US -2643197952,2643263487,GB -2643263488,2643460095,US -2643460096,2643525631,FI -2643525632,2643722239,US -2643722240,2643787775,CN -2643787776,2644180991,US -2644180992,2644246527,AU -2644246528,2644312063,CN -2644312064,2644377599,IS -2644377600,2644443135,PL -2644443136,2644508671,FR -2644508672,2644574207,US -2644574208,2644639743,CH -2644639744,2644770815,DE -2644770816,2644836351,BE -2644836352,2644967423,US -2645032960,2645098495,CH -2645098496,2645164031,FR -2645164032,2645229567,US -2645229568,2645295103,SE -2645295104,2645360639,FR -2645360640,2645426175,GB -2645426176,2645622783,US -2645622784,2645688319,AT -2645688320,2645753855,US -2645753856,2645819391,TH -2645819392,2645884927,SE -2645884928,2645950463,HU -2645950464,2646196223,US -2646196224,2646212607,JP -2646212608,2646278143,RU -2646278144,2646474751,US -2646474752,2646540287,IE -2646540288,2646546953,US -2646546954,2646546954,CA -2646546955,2646547013,US -2646547014,2646547014,MX -2646547015,2646547017,US -2646547018,2646547018,MX -2646547019,2646547021,US -2646547022,2646547022,CA -2646547023,2646547077,US -2646547078,2646547078,CA -2646547079,2646547081,US -2646547082,2646547082,CA -2646547083,2646547209,US -2646547210,2646547210,CA -2646547211,2646547269,US -2646547270,2646547270,MX -2646547271,2646547273,US -2646547274,2646547274,MX -2646547275,2646547277,US -2646547278,2646547278,CA -2646547279,2646547333,US -2646547334,2646547334,CA -2646547335,2646547337,US -2646547338,2646547338,CA -2646547339,2646551561,US -2646551562,2646551562,CA -2646551563,2646551621,US -2646551622,2646551622,MX -2646551623,2646551625,US -2646551626,2646551626,MX -2646551627,2646551629,US -2646551630,2646551630,CA -2646551631,2646551685,US -2646551686,2646551686,CA -2646551687,2646551689,US -2646551690,2646551690,CA -2646551691,2646551749,US -2646551750,2646551750,CO -2646551751,2646551751,US -2646551752,2646551753,CR -2646551754,2646551754,PA -2646551755,2646551755,CR -2646551756,2646551757,US -2646551758,2646551758,CR -2646551759,2646551761,US -2646551762,2646551764,CR -2646551765,2646551817,US -2646551818,2646551818,CA -2646551819,2646551877,US -2646551878,2646551878,MX -2646551879,2646551881,US -2646551882,2646551882,MX -2646551883,2646551885,US -2646551886,2646551886,CA -2646551887,2646551941,US -2646551942,2646551942,CA -2646551943,2646551945,US -2646551946,2646551946,CA -2646551947,2646552005,US -2646552006,2646552006,CO -2646552007,2646552007,US -2646552008,2646552009,CR -2646552010,2646552010,PA -2646552011,2646552011,CR -2646552012,2646552013,US -2646552014,2646552014,CR -2646552015,2646552017,US -2646552018,2646552020,CR -2646552021,2646561033,US -2646561034,2646561034,CA -2646561035,2646561093,US -2646561094,2646561094,MX -2646561095,2646561097,US -2646561098,2646561098,MX -2646561099,2646561101,US -2646561102,2646561102,CA -2646561103,2646561157,US -2646561158,2646561158,CA -2646561159,2646561161,US -2646561162,2646561162,CA -2646561163,2646561221,US -2646561222,2646561222,CO -2646561223,2646561223,US -2646561224,2646561225,CR -2646561226,2646561226,PA -2646561227,2646561227,CR -2646561228,2646561229,US -2646561230,2646561230,CR -2646561231,2646561233,US -2646561234,2646561236,CR -2646561237,2646565129,US -2646565130,2646565130,CA -2646565131,2646565189,US -2646565190,2646565190,MX -2646565191,2646565193,US -2646565194,2646565194,MX -2646565195,2646565197,US -2646565198,2646565198,CA -2646565199,2646565253,US -2646565254,2646565254,CA -2646565255,2646565257,US -2646565258,2646565258,CA -2646565259,2646585089,US -2646585090,2646585090,AR -2646585091,2646585093,US -2646585094,2646585094,PE -2646585095,2646585097,US -2646585098,2646585098,BR -2646585099,2646585101,US -2646585102,2646585102,CL -2646585103,2646585105,US -2646585106,2646585106,SV -2646585107,2646585109,US -2646585110,2646585110,BR -2646585111,2646585113,US -2646585114,2646585114,BR -2646585115,2646585117,US -2646585118,2646585118,CO -2646585119,2646585121,US -2646585122,2646585122,PA -2646585123,2646585125,US -2646585126,2646585126,CR -2646585127,2646585129,US -2646585130,2646585132,CR -2646585133,2646585135,US -2646585136,2646585139,CR -2646585140,2646585153,US -2646585154,2646585154,AR -2646585155,2646585157,US -2646585158,2646585158,PE -2646585159,2646585161,US -2646585162,2646585162,BR -2646585163,2646585165,US -2646585166,2646585166,CL -2646585167,2646585169,US -2646585170,2646585170,SV -2646585171,2646585173,US -2646585174,2646585174,BR -2646585175,2646585177,US -2646585178,2646585178,BR -2646585179,2646585181,US -2646585182,2646585182,CO -2646585183,2646585185,US -2646585186,2646585186,PA -2646585187,2646585189,US -2646585190,2646585190,CR -2646585191,2646585193,US -2646585194,2646585196,CR -2646585197,2646585199,US -2646585200,2646585203,CR -2646585204,2646585217,US -2646585218,2646585218,AR -2646585219,2646585221,US -2646585222,2646585222,PE -2646585223,2646585225,US -2646585226,2646585226,BR -2646585227,2646585229,US -2646585230,2646585230,CL -2646585231,2646585233,US -2646585234,2646585234,SV -2646585235,2646585237,US -2646585238,2646585238,BR -2646585239,2646585241,US -2646585242,2646585242,BR -2646585243,2646585245,US -2646585246,2646585246,CO -2646585247,2646585249,US -2646585250,2646585250,PA -2646585251,2646585253,US -2646585254,2646585254,CR -2646585255,2646585257,US -2646585258,2646585260,CR -2646585261,2646585263,US -2646585264,2646585267,CR -2646585268,2646602497,US -2646602498,2646602498,AR -2646602499,2646602501,US -2646602502,2646602502,PE -2646602503,2646602505,US -2646602506,2646602506,BR -2646602507,2646602509,US -2646602510,2646602510,CL -2646602511,2646602513,US -2646602514,2646602514,SV -2646602515,2646602521,US -2646602522,2646602522,BR -2646602523,2646602561,US -2646602562,2646602562,AR -2646602563,2646602565,US -2646602566,2646602566,PE -2646602567,2646602569,US -2646602570,2646602570,BR -2646602571,2646602573,US -2646602574,2646602574,CL -2646602575,2646602577,US -2646602578,2646602578,SV -2646602579,2646602581,US -2646602582,2646602582,BR -2646602583,2646602585,US -2646602586,2646602586,BR -2646602587,2646602625,US -2646602626,2646602626,AR -2646602627,2646602629,US -2646602630,2646602630,PE -2646602631,2646602633,US -2646602634,2646602634,BR -2646602635,2646602637,US -2646602638,2646602638,CL -2646602639,2646602641,US -2646602642,2646602642,SV -2646602643,2646602645,US -2646602646,2646602646,BR -2646602647,2646602649,US -2646602650,2646602650,BR -2646602651,2646605823,US -2646605824,2646671359,JP -2646671360,2646736895,BE -2646736896,2646933503,US -2646933504,2646999039,KR -2646999040,2647130111,US -2647130112,2647195647,FI -2647195648,2647326719,US -2647326720,2647392255,GB -2647392256,2647457791,US -2647457792,2647523327,JP -2647523328,2647605503,US -2647605504,2647605759,GB -2647605760,2647851007,US -2647851008,2647916543,AU -2647916544,2648899583,US -2648899584,2648965119,IN -2648965120,2649030655,GB -2649030656,2649489407,US -2649489408,2649554943,GB -2649554944,2649620479,NO -2649620480,2649948159,US -2649948160,2650013695,FR -2650013696,2650079231,CA -2650079232,2650210303,US -2650210304,2650275839,AT -2650275840,2650341375,US -2650341376,2650406911,NO -2650406912,2650423295,US -2650423296,2650472447,JP -2650472448,2650603519,US -2650603520,2650669055,CO -2650669056,2650734591,US -2650734592,2650800127,CN -2650800128,2652528639,US -2652528640,2652528895,AR -2652528896,2652541183,US -2652541184,2652541439,NL -2652541440,2653159423,US -2653159424,2653421567,NO -2653421568,2653487103,AU -2653487104,2653552639,GB -2653552640,2653618175,ES -2653618176,2653683711,GB -2653683712,2653749247,KR -2653749248,2653814783,AU -2653814784,2653847551,RU -2653847552,2653849599,IN -2653849600,2653851647,FR -2653851648,2653855743,GB -2653855744,2653856767,KR -2653856768,2653863935,TH -2653863936,2653872127,IN -2653872128,2653880319,RU -2653880320,2653945855,IT -2653945856,2654011391,US -2654011392,2654076927,ES -2654076928,2654085119,FR -2654085120,2654089215,HK -2654089216,2654093311,FR -2654093312,2654097407,US -2654097408,2654142463,FR -2654208000,2654339071,US -2654339072,2654404607,AU -2654404608,2654601215,US -2654601216,2654633983,IR -2654633984,2654636031,RU -2654636032,2654638079,IT -2654638080,2654640127,DE -2654640128,2654642175,NO -2654642176,2654644223,GB -2654644224,2654646271,IT -2654646272,2654648319,FR -2654648320,2654650367,IR -2654650368,2654666751,BG -2654666752,2654994431,US -2654994432,2655059967,LU -2655059968,2655125503,US -2655125504,2655191039,PL -2655256576,2655322111,US -2655322112,2655326287,CA -2655326288,2655326303,US -2655326304,2655326591,CA -2655326592,2655326595,US -2655326596,2655329371,CA -2655329372,2655329375,US -2655329376,2655332295,CA -2655332296,2655332303,US -2655332304,2655336703,CA -2655336704,2655336959,US -2655336960,2655349943,CA -2655349944,2655349951,US -2655349952,2655352517,CA -2655352518,2655352518,US -2655352519,2655358207,CA -2655358208,2655358463,US -2655358464,2655360143,CA -2655360144,2655360151,US -2655360152,2655369863,CA -2655369864,2655369871,US -2655369872,2655387647,CA -2655387648,2655715327,US -2655715328,2655780863,PL -2655780864,2656387071,US -2656387072,2656403455,CA -2656403456,2656632831,US -2656632832,2656698367,AU -2656698368,2656763903,FI -2656763904,2656829439,US -2656829440,2656894975,SE -2656894976,2656960511,US -2656960512,2657026047,GB -2657026048,2657157119,US -2657157120,2657222655,MX -2657222656,2657288191,US -2657288192,2657353727,ES -2657353728,2657484799,US -2657484800,2657550335,IT -2657550336,2657681407,US -2657681408,2657746943,SE -2657746944,2657763327,US -2657763328,2657779711,CA -2657779712,2657804287,US -2657804288,2657810431,CA -2657810432,2657878015,US -2657878016,2657943551,TH -2657943552,2658009087,ES -2658009088,2658074623,IT -2658074624,2658140159,US -2658140160,2658205695,NO -2658205696,2658454491,US -2658454492,2658454492,IN -2658454493,2658459355,US -2658459356,2658459356,IN -2658459357,2658459903,US -2658459904,2658460159,HU -2658460160,2658598911,US -2658598912,2658664447,GB -2658664448,2658926591,US -2658926592,2659057663,GB -2659057664,2659123199,SE -2659123200,2659180543,FI -2659180544,2659181823,NL -2659181824,2659182079,BE -2659182080,2659184639,NL -2659184640,2659188735,FI -2659188736,2659254271,CA -2659254272,2659319807,LT -2659319808,2659385343,US -2659385344,2659450879,FI -2659450880,2659516415,HK -2659516416,2659581951,CH -2659581952,2659979263,US -2659979264,2659983359,PS -2659983360,2659991551,US -2659991552,2660007935,PS -2660007936,2660016127,SG -2660016128,2660024319,ID -2660024320,2660032511,AU -2660032512,2660039679,NZ -2660039680,2660040703,AU -2660040704,2660106239,CA -2660106240,2660171775,US -2660171776,2660237311,GB -2660237312,2660302847,IN -2660302848,2660499455,US -2660499456,2660564991,IT -2660564992,2660696063,NO -2660696064,2660761599,US -2660761600,2660827135,GB -2660827136,2661023743,US -2661023744,2661089279,FR -2661089280,2661285887,US -2661285888,2661351423,VE -2661351424,2661416959,BN -2661416960,2661482495,PT -2661482496,2661548031,CA -2661548032,2661679103,US -2661679104,2661885951,LU -2661885952,2661886207,BE -2661886208,2661914111,LU -2661914112,2661914367,BE -2661914368,2661941247,LU -2661941248,2662006783,CL -2662006784,2662072319,US -2662072320,2662137855,ES -2662137856,2662203391,DK -2662203392,2662268927,SE -2662268928,2662287391,US -2662287392,2662287407,AF -2662287408,2662287519,US -2662287520,2662287551,AF -2662287552,2662300879,US -2662300880,2662300895,JP -2662300896,2662366271,US -2662366272,2662366287,IE -2662366288,2662366591,US -2662366592,2662366607,AF -2662366608,2662416463,US -2662416464,2662416471,SE -2662416472,2662417947,US -2662417948,2662417951,DE -2662417952,2662418815,US -2662418816,2662418819,DE -2662418820,2662420103,US -2662420104,2662420111,SE -2662420112,2662421647,US -2662421648,2662421655,IT -2662421656,2662421887,US -2662421888,2662422015,DE -2662422016,2662422543,US -2662422544,2662422559,HU -2662422560,2662423183,US -2662423184,2662423199,IT -2662423200,2662498303,US -2662498304,2662662143,GB -2662662144,2662670335,KG -2662670336,2662674431,AZ -2662674432,2662677087,DE -2662677088,2662677279,US -2662677280,2662677375,DE -2662677376,2662678527,US -2662678528,2662686719,DE -2662686720,2662694911,CH -2662694912,2662727679,KG -2662727680,2662793215,HK -2662793216,2663251967,US -2663251968,2663448575,FR -2663448576,2663514111,SK -2663514112,2663579647,CZ -2663579648,2663645183,SK -2663645184,2663710719,CZ -2663710720,2663776255,SK -2663776256,2664955903,JP -2664955904,2665021439,CH -2665021440,2665086975,JP -2665086976,2665152511,GB -2665152512,2665218047,US -2665218048,2665283583,CH -2665283584,2665359359,US -2665359360,2665359871,MF -2665359872,2665375743,US -2665375744,2665377791,CA -2665377792,2665414655,US -2665414656,2665480191,GB -2665480192,2665545727,US -2665545728,2665611263,DE -2665611264,2665676799,CH -2665676800,2665742335,ES -2665742336,2665873407,US -2665873408,2665938943,GB -2665938944,2666004479,FR -2666004480,2666070015,CH -2666070016,2666133880,SE -2666133881,2666133881,DK -2666133882,2666133882,SE -2666133883,2666133883,FI -2666133884,2666133884,NO -2666133885,2666133885,PL -2666133886,2666133886,DK -2666133887,2666133887,SE -2666133888,2666133888,FI -2666133889,2666133889,NO -2666133890,2666133890,PL -2666133891,2666135551,SE -2666135552,2666201087,GB -2666201088,2667053055,US -2667053056,2667085823,NO -2667085824,2667118591,DK -2667118592,2667184127,HU -2667184128,2667249663,RU -2667249664,2667315199,CL -2667315200,2667511807,US -2667511808,2667513855,RU -2667513856,2667515903,GB -2667515904,2667517951,CZ -2667517952,2667519999,SK -2667520000,2667522047,CZ -2667522048,2667524095,GB -2667524096,2667526143,RU -2667526144,2667528191,LV -2667528192,2667532287,FR -2667532288,2667534335,RU -2667534336,2667536383,PL -2667536384,2667536575,AT -2667536576,2667536583,FR -2667536584,2667536615,AT -2667536616,2667536623,FR -2667536624,2667537087,AT -2667537088,2667537119,FR -2667537120,2667537151,AT -2667537152,2667537215,FR -2667537216,2667537231,AT -2667537232,2667537239,FR -2667537240,2667537279,AT -2667537280,2667541503,FR -2667541504,2667542527,AT -2667542528,2667544575,FR -2667544576,2667560959,RU -2667560960,2667565055,IT -2667565056,2667565311,HK -2667565312,2667565421,AT -2667565422,2667565422,PT -2667565423,2667565423,ES -2667565424,2667565424,US -2667565425,2667565425,CR -2667565426,2667565426,KN -2667565427,2667565427,BR -2667565428,2667565428,FI -2667565429,2667565429,CH -2667565430,2667565430,GB -2667565431,2667566335,AT -2667566336,2667566591,US -2667566592,2667566847,DE -2667566848,2667567103,FR -2667567104,2667569151,SE -2667569152,2667571199,GB -2667571200,2667573247,ES -2667573248,2667575295,IT -2667575296,2667577343,SK -2667577344,2667642879,SA -2667642880,2667712511,US -2667712512,2667773951,CA -2667773952,2667970559,US -2667970560,2668036095,CA -2668036096,2668101631,SE -2668101632,2668118015,NL -2668118016,2668134399,FR -2668134400,2668150783,GB -2668150784,2668167167,NL -2668167168,2668363775,US -2668363776,2668412927,CH -2668412928,2668417023,SG -2668417024,2668429311,CH -2668429312,2668494847,AU -2668494848,2668560383,US -2668560384,2668625919,GB -2668625920,2668691455,MX -2668691456,2668756991,US -2668756992,2668822527,CA -2668822528,2668888063,US -2668888064,2668890111,DK -2668890112,2668892159,FR -2668892160,2668894207,BA -2668894208,2668896255,MT -2668896256,2668904447,GB -2668904448,2668912639,TR -2668912640,2668916735,IR -2668916736,2668918783,TR -2668918784,2668920831,ES -2668920832,2668953599,IT -2668953600,2668969983,US -2668969984,2668971007,GB -2668971008,2668987135,US -2668987136,2668987391,AU -2668987392,2668989951,US -2668989952,2668990463,NZ -2668990464,2668991487,IN -2668991488,2669019135,US -2669019136,2669084671,CH -2669084672,2669215743,US -2669215744,2669281279,DE -2669281280,2669428735,US -2669428736,2669477887,JP -2669477888,2669543423,CH -2669543424,2669608959,GB -2669608960,2669674495,FR -2669674496,2669805567,CA -2669805568,2669871103,GB -2669871104,2670067711,US -2670067712,2670133247,SE -2670133248,2670591999,US -2670592000,2670657535,NL -2670657536,2670854143,US -2670854144,2670919679,FR -2670919680,2670985215,DE -2670985216,2671050751,AU -2671050752,2671181823,US -2671181824,2671247359,CA -2671247360,2671378431,US -2671378432,2671443967,NO -2671443968,2671509503,US -2671509504,2671575039,NL -2671575040,2671711479,US -2671711480,2671711483,DE -2671711484,2671711573,US -2671711574,2671711574,GB -2671711575,2671712029,US -2671712030,2671712030,AR -2671712031,2671712147,US -2671712148,2671712151,GB -2671712152,2671718827,US -2671718828,2671718831,GB -2671718832,2671720289,US -2671720290,2671720290,GB -2671720291,2671749119,US -2671749120,2671750143,CA -2671750144,2672295935,US -2672295936,2672296959,ES -2672296960,2672361471,SE -2672361472,2672427007,AU -2672427008,2672820223,US -2672820224,2672885759,JP -2672885760,2672951295,NO -2672951296,2673082367,US -2673082368,2673147903,FR -2673147904,2673213439,US -2673213440,2673278975,GB -2673278976,2673410485,US -2673410486,2673410486,DE -2673410487,2673451007,US -2673451008,2673455103,IN -2673455104,2673463295,US -2673463296,2673464319,SG -2673464320,2673475583,US -2673475584,2673541119,VE -2673541120,2673606655,US -2673606656,2673672191,GB -2673672192,2673737727,RU -2673737728,2673803263,US -2673803264,2673868799,FR -2673868800,2674130943,US -2674130944,2674137087,DE -2674137088,2674138111,AT -2674138112,2674139135,DE -2674139136,2674143231,FR -2674143232,2674144255,CH -2674144256,2674144767,US -2674144768,2674145023,GB -2674145024,2674145791,US -2674145792,2674146047,GB -2674146048,2674146303,US -2674146304,2674147327,TR -2674147328,2674163711,NL -2674163712,2674164175,GB -2674164176,2674164191,FR -2674164192,2674171903,GB -2674171904,2674177286,US -2674177287,2674177287,GB -2674177288,2674192383,US -2674192384,2674196479,CH -2674196480,2674249727,GB -2674249728,2674251775,US -2674251776,2674262015,GB -2674262016,2674327551,US -2674327552,2674393087,CH -2674393088,2674589695,US -2674589696,2674655231,SE -2674655232,2674720767,US -2674720768,2674786303,BE -2674786304,2675048447,US -2675048448,2675113983,GB -2675113984,2675245055,US -2675245056,2675255295,NZ -2675255296,2675257343,PH -2675257344,2675261439,US -2675261440,2675269631,TW -2675269632,2675271679,PH -2675271680,2675278847,NZ -2675278848,2675279359,MY -2675279360,2675279871,TH -2675279872,2675281919,MY -2675281920,2675286015,IN -2675286016,2675294207,US -2675294208,2675294463,SG -2675294464,2675294719,NL -2675294720,2675294975,DE -2675294976,2675295231,US -2675295232,2675296255,NL -2675296256,2675296511,NZ -2675296512,2675296767,MY -2675296768,2675298303,NL -2675298304,2675301375,US -2675301376,2675302143,NZ -2675302144,2675302399,MY -2675302400,2675310591,HK -2675310592,2675574239,US -2675574240,2675574271,IT -2675574272,2675574895,US -2675574896,2675574903,NL -2675574904,2675575951,US -2675575952,2675575953,SA -2675575954,2675576703,US -2675576704,2675576711,JO -2675576712,2675589119,US -2675589120,2675605503,DE -2675605504,2675605791,US -2675605792,2675605799,IT -2675605800,2675605807,US -2675605808,2675605811,IT -2675605812,2675605951,US -2675605952,2675605961,CZ -2675605962,2675605962,DE -2675605963,2675605963,CZ -2675605964,2675605964,DE -2675605965,2675605967,CZ -2675605968,2675606271,US -2675606272,2675606527,IT -2675606528,2675606571,US -2675606572,2675606575,IT -2675606576,2675606975,US -2675606976,2675607039,IT -2675607040,2675608735,US -2675608736,2675608739,IT -2675608740,2675608751,US -2675608752,2675608767,HK -2675608768,2675608983,US -2675608984,2675608991,AU -2675608992,2675609011,US -2675609012,2675609015,JP -2675609016,2675609487,US -2675609488,2675609503,CN -2675609504,2675610191,US -2675610192,2675610207,IL -2675610208,2675611295,US -2675611296,2675611359,IT -2675611360,2675612715,US -2675612716,2675612719,IT -2675612720,2675612743,US -2675612744,2675612747,IT -2675612748,2675613119,US -2675613120,2675613151,IT -2675613152,2675613279,US -2675613280,2675613311,IT -2675613312,2675613463,US -2675613464,2675613471,IL -2675613472,2675613599,US -2675613600,2675613631,JP -2675613632,2675614975,US -2675614976,2675614991,NL -2675614992,2675615743,US -2675615744,2675615871,IT -2675615872,2675616419,US -2675616420,2675616422,IT -2675616423,2675616423,US -2675616424,2675616426,IT -2675616427,2675616427,US -2675616428,2675616430,IT -2675616431,2675616431,US -2675616432,2675616434,IT -2675616435,2675616435,US -2675616436,2675616438,IT -2675616439,2675616439,US -2675616440,2675616441,IT -2675616442,2675621301,US -2675621302,2675621302,IT -2675621303,2675626239,US -2675626240,2675626271,GB -2675626272,2675627791,US -2675627792,2675627807,GB -2675627808,2675628399,US -2675628400,2675628447,GB -2675628448,2675630095,US -2675630096,2675630111,GB -2675630112,2675631327,US -2675631328,2675631343,GB -2675631344,2675633183,US -2675633184,2675633215,GB -2675633216,2675636170,US -2675636171,2675636171,GB -2675636172,2675965951,US -2675965952,2676031487,CA -2676031488,2676097023,US -2676097024,2676162559,NO -2676162560,2676359167,US -2676359168,2676424703,IE -2676424704,2676457471,US -2676457472,2676465663,DE -2676465664,2676621311,US -2676621312,2676626431,HK -2676626432,2676686847,SG -2676686848,2677014527,US -2677014528,2677080063,CH -2677080064,2677145599,US -2677145600,2677178367,TR -2677178368,2677211135,UA -2677211136,2677276671,ES -2677276672,2677342207,LV -2677342208,2677407743,IT -2677407744,2677473279,US -2677473280,2677538815,FR -2677538816,2677604351,FI -2677604352,2677635071,US -2677635072,2677636095,CN -2677636096,2677640959,US -2677640960,2677641471,CA -2677641472,2677642239,US -2677642240,2677642495,ES -2677642496,2677642751,CA -2677642752,2677643007,SE -2677643008,2677643263,IE -2677643264,2677644287,US -2677644288,2677645311,GB -2677645312,2677648383,US -2677648384,2677649407,JP -2677649408,2677650431,GB -2677650432,2677650687,RO -2677650688,2677650943,DE -2677650944,2677651455,US -2677651456,2677652479,SG -2677652480,2677658367,US -2677658368,2677658623,AU -2677658624,2677659647,US -2677659648,2677659903,AU -2677659904,2677660159,IN -2677660160,2677669887,US -2677669888,2677735423,DE -2677735424,2677800959,US -2677800960,2677866495,CH -2677866496,2677924863,US -2677924864,2677925119,GB -2677925120,2677997567,US -2677997568,2678063103,CA -2678063104,2678128639,UA -2678128640,2678194175,US -2678194176,2678259711,NO -2678259712,2678521855,US -2678521856,2678587391,GB -2678587392,2678652927,CH -2678652928,2678718463,US -2678718464,2678783999,GB -2678784000,2678849535,NO -2678849536,2678851583,US -2678851584,2678851839,GB -2678851840,2678862847,US -2678862848,2678863103,BR -2678863104,2678865919,US -2678865920,2678866175,AU -2678866176,2678876159,US -2678876160,2678878207,FR -2678878208,2678885375,US -2678885376,2678885631,GB -2678885632,2678885887,US -2678885888,2678886143,DE -2678886144,2678886399,NL -2678886400,2678886655,GB -2678886656,2678893567,US -2678893568,2678893823,CL -2678893824,2678901759,US -2678901760,2678902015,NZ -2678902016,2678902271,SG -2678902272,2678911231,US -2678911232,2678911487,NL -2678911488,2678911743,AU -2678911744,2678915071,US -2678915072,2678980607,FR -2678980608,2679046143,US -2679046144,2679111679,CA -2679111680,2679177215,US -2679177216,2679242751,CA -2679242752,2679308287,US -2679308288,2679373823,CH -2679373824,2679374079,SI -2679374080,2679374335,HR -2679374336,2679374591,BA -2679374592,2679374847,RS -2679374848,2679375103,AL -2679375104,2679375359,ME -2679375360,2679375615,MK -2679375616,2679375871,BG -2679375872,2679376127,HU -2679376128,2679376383,MD -2679376384,2679376639,LU -2679376640,2679376895,RU -2679376896,2679377151,UY -2679377152,2679377407,NO -2679377408,2679377663,NL -2679377664,2679377919,GB -2679377920,2679378175,TR -2679378176,2679378431,SK -2679378432,2679378687,LV -2679378688,2679378943,EE -2679378944,2679379199,IL -2679379200,2679379455,CL -2679379456,2679379711,ES -2679379712,2679379967,DK -2679379968,2679380223,CZ -2679380224,2679380479,BE -2679380480,2679380735,VE -2679380736,2679380991,GB -2679380992,2679381247,AE -2679381248,2679381503,PK -2679381504,2679381759,SA -2679381760,2679382015,ZA -2679382016,2679382527,GB -2679382528,2679382783,JP -2679382784,2679383039,FR -2679383040,2679383295,GB -2679383296,2679383551,CH -2679383552,2679383807,CO -2679383808,2679384063,GB -2679384064,2679384319,GR -2679384320,2679384575,GB -2679384576,2679384831,PE -2679384832,2679385087,GB -2679385088,2679385343,UA -2679385344,2679385599,GB -2679385600,2679385855,BR -2679385856,2679386111,IT -2679386112,2679386367,PL -2679386368,2679386623,GB -2679386624,2679386879,PL -2679386880,2679387135,DE -2679387136,2679387391,RU -2679387392,2679387647,AU -2679387648,2679387903,GB -2679387904,2679388159,TW -2679388160,2679388415,GB -2679388416,2679388671,ES -2679388672,2679388927,AT -2679388928,2679389183,AU -2679389184,2679389439,MX -2679389440,2679389695,TH -2679389696,2679389951,AU -2679389952,2679390207,AR -2679390208,2679391231,US -2679391232,2679391487,NL -2679391488,2679391743,GB -2679391744,2679391999,FR -2679392000,2679394047,US -2679394048,2679394303,DE -2679394304,2679394559,GB -2679394560,2679398399,US -2679398400,2679406591,GB -2679406592,2679414783,US -2679414784,2679415307,PR -2679415308,2679415308,DE -2679415309,2679418879,PR -2679418880,2679420927,SG -2679420928,2679422975,PR -2679422976,2679431167,US -2679431168,2679439359,FR -2679439360,2679515391,US -2679515392,2679515903,GB -2679515904,2679523327,US -2679523328,2679525375,GB -2679525376,2679535615,US -2679535616,2679537663,GB -2679537664,2680029183,US -2680029184,2680094719,SE -2680094720,2680160255,US -2680160256,2680225791,TH -2680225792,2680356863,SE -2680356864,2680422399,DK -2680422400,2680487935,AU -2680487936,2680553471,GB -2680553472,2680684543,US -2680684544,2680750079,SE -2680750080,2680881151,US -2680881152,2680897535,CA -2680897536,2681012223,US -2681012224,2681077759,PL -2681077760,2681143295,CA -2681143296,2681208831,AU -2681208832,2681274367,CA -2681274368,2681339903,US -2681339904,2681405439,IT -2681405440,2681470975,JP -2681470976,2681536511,US -2681536512,2681602047,IT -2681602048,2681700863,US -2681700864,2681701119,HK -2681701120,2681703423,US -2681703424,2681703935,JP -2681703936,2681731071,US -2681731072,2681733119,FR -2681733120,2681798655,NO -2681798656,2681864191,FR -2681864192,2681929727,US -2681929728,2681995263,GB -2681995264,2681999467,US -2681999468,2681999468,SG -2681999469,2681999871,US -2681999872,2682000383,SG -2682000384,2682001407,US -2682001408,2682002431,GB -2682002432,2682008575,US -2682008576,2682008831,GB -2682008832,2682014207,US -2682014208,2682014719,GB -2682014720,2682014725,US -2682014726,2682014727,SG -2682014728,2682055167,US -2682055168,2682055423,SG -2682055424,2682118143,US -2682118144,2682126335,AU -2682126336,2682257407,US -2682257408,2682322943,UA -2682322944,2682388479,US -2682388480,2682454015,CN -2682454016,2682519551,US -2682585088,2682716159,US -2682716160,2682781695,CA -2682781696,2682847231,CH -2682847232,2683043839,US -2683043840,2683109375,GB -2683109376,2683174911,ES -2683174912,2683240447,US -2683240448,2683305983,GB -2683305984,2683371519,US -2683371520,2683437055,CH -2683437056,2683568127,US -2683568128,2683633663,GB -2683637760,2683641855,NL -2683641856,2683645951,US -2683645952,2683650047,SG -2683650048,2683658239,US -2683699200,2683830271,US -2683830272,2683895807,AU -2683895808,2684157951,US -2684157952,2684159999,NL -2684160000,2684162047,NO -2684162048,2684164095,EE -2684164096,2684165119,SE -2684165120,2684165375,GB -2684165376,2684166143,SE -2684166144,2684170239,TR -2684170240,2684178431,GB -2684178432,2684180479,TR -2684180480,2684182527,DK -2684182528,2684184575,IT -2684184576,2684186623,SK -2684186624,2684188671,DE -2684188672,2684189695,RU -2684189696,2684198911,NL -2684198912,2684200959,GB -2684200960,2684203007,RU -2684203008,2684205055,GB -2684205056,2684207103,IT -2684207104,2684213247,GB -2684213248,2684215295,SE -2684215296,2684217343,BE -2684217344,2684219391,CZ -2684219392,2684221439,PL -2684221440,2684223487,IL -2684223488,2684289023,GB -2684289024,2684297215,RU -2684297216,2684299263,IR -2684299264,2684301311,CY -2684301312,2684305407,PT -2684305408,2684321791,RU -2684321792,2684329983,IT -2684329984,2684332031,IQ -2684332032,2684334079,DE -2684334080,2684338175,PL -2684338176,2684340223,ES -2684340224,2684344319,GB -2684344320,2684346367,NL -2684346368,2684354559,FI -2684354560,2684387327,MU -2684387328,2684403711,SN -2684403712,2684411903,ZA -2684411904,2684420095,BJ -2684420096,2684616703,US -2684616704,2684682239,NZ -2684682240,2684747775,GB -2684747776,2684813311,IE -2684813312,2684878847,US -2684878848,2684944383,SE -2684944384,2685009919,GB -2685009920,2685075455,US -2685075456,2685599743,JP -2685599744,2685603839,US -2685604864,2685605887,PK -2685605888,2685607935,US -2685608960,2685609983,ZA -2685611008,2685612031,BR -2685612032,2685613055,HK -2685613056,2685614079,TW -2685615104,2685616127,NG -2685616128,2685617151,ID -2685624320,2685626367,LY -2685626368,2685627391,US -2685628416,2685636607,ZA -2685638656,2685639679,SL -2685640704,2685641727,US -2685642752,2685644799,BR -2685647872,2685648383,ZA -2685648384,2685648895,MZ -2685648896,2685649919,RW -2685649920,2685650943,ZA -2685650944,2685651967,CL -2685652992,2685656063,CN -2685656064,2685657087,IN -2685657088,2685658111,ID -2685659136,2685660159,ZA -2685660160,2685661183,CM -2685661184,2685665279,BR -2685665280,2685668351,IN -2685668352,2685669375,SG -2685670400,2685671423,BR -2685671424,2685673471,ZA -2685673472,2685674495,BR -2685675520,2685676543,PH -2685676544,2685677567,JP -2685677568,2685678591,CN -2685678592,2685681663,HK -2685681664,2685683711,BR -2685683712,2685684735,BD -2685685760,2685686783,AR -2685686784,2685688831,BR -2685688832,2685689855,CL -2685706240,2685707263,BR -2685707264,2685708287,EC -2685708288,2685709311,BR -2685709312,2685710335,CL -2685710336,2685713407,BR -2685713408,2685714431,CL -2685714432,2685718527,BR -2685718528,2685719551,US -2685722112,2685722623,ID -2685724672,2685726719,CA -2685729792,2685730815,ZA -2685730816,2685796351,JP -2685861888,2686320639,JP -2686386176,2686844927,US -2686844928,2686910463,GB -2686910464,2686975999,US -2686976000,2687041535,GR -2687041536,2687238143,US -2687238144,2687297215,DE -2687297216,2687297231,HU -2687297232,2687560191,DE -2687560192,2687560447,ZA -2687560448,2687762431,DE -2687762432,2687827967,AT -2687827968,2687893503,CH -2687893504,2688221183,DE -2688221184,2688286719,CH -2688286720,2688352255,DE -2688352256,2688420095,CH -2688420096,2688420351,US -2688420352,2688420607,CN -2688420608,2688548863,CH -2688548864,2688614399,AU -2688614400,2688679935,US -2688679936,2688745471,IT -2688745472,2688876543,NO -2688876544,2688942079,US -2688942080,2689007615,DE -2689007616,2689073151,FI -2689073152,2689204223,US -2689204224,2689269759,JP -2689269760,2689335295,TR -2689335296,2689400831,US -2689400832,2689466367,MA -2689466368,2689531903,IT -2689531904,2689535999,US -2689536000,2689536511,GB -2689536512,2689541631,US -2689541632,2689541887,GB -2689541888,2689545727,US -2689545728,2689546239,GB -2689546240,2689566207,US -2689566208,2689566719,GB -2689566720,2689568255,US -2689568256,2689568767,GB -2689568768,2689586687,US -2689586688,2689587199,GB -2689587200,2689593343,US -2689593344,2689593855,GB -2689593856,2689594111,US -2689594112,2689594879,GB -2689594880,2689597439,US -2689597440,2689662975,IT -2689662976,2689801904,US -2689801905,2689801905,DE -2689801906,2689802239,US -2689802240,2689802751,GB -2689802752,2689803263,TR -2689803264,2689810431,GB -2689810432,2689818879,US -2689818880,2689819135,IN -2689819136,2689835007,US -2689835008,2689835263,AU -2689835264,2689925119,US -2689925120,2689990655,CH -2689990656,2690056191,JP -2690056192,2690187263,US -2690187264,2690318335,MA -2690318336,2690383871,US -2690383872,2690449407,FR -2690449408,2690646015,US -2690646016,2690711551,SG -2690711552,2690777087,IT -2690777088,2690842623,CH -2690842624,2690908159,RS -2690908160,2690973695,GB -2690973696,2691104767,US -2691104768,2691170303,FR -2691170304,2691235839,GB -2691235840,2691301375,MA -2691301376,2691366911,CA -2691366912,2691760127,US -2691760128,2691825663,CG -2691825664,2691891199,HU -2691891200,2691956735,SA -2691956736,2692169727,ZA -2692169728,2692173823,SC -2692173824,2692175871,ZA -2692175872,2692177919,SC -2692177920,2692179967,ZA -2692179968,2692180991,GA -2692180992,2692182015,GH -2692182016,2692184063,MZ -2692184064,2692185087,ZA -2692185088,2692186111,NG -2692186112,2692188159,GN -2692188160,2692190207,ZA -2692190208,2692191231,BJ -2692191232,2692192255,UG -2692192256,2692193279,ZA -2692193280,2692194303,MZ -2692194304,2692202495,GA -2692202496,2692203519,ZA -2692203520,2692204543,NG -2692204544,2692205567,SC -2692205568,2692206591,GH -2692206592,2692207615,SZ -2692207616,2692208639,ZA -2692208640,2692209663,KE -2692209664,2692214783,ZA -2692214784,2692215807,AO -2692215808,2692216319,KE -2692216320,2692216831,NG -2692216832,2692218879,ZA -2692218880,2692284415,CI -2692284416,2692546559,ZA -2692546560,2694316031,US -2694316032,2694381567,NG -2694381568,2694447103,US -2694447104,2694578175,CI -2694578176,2694840319,TN -2694840320,2695920283,MA -2695920284,2695920284,EH -2695920285,2696151039,MA -2696151040,2696216575,IT -2696216576,2696282111,BG -2696282112,2696413183,GM -2696413184,2696478719,US -2696478720,2696609791,JP -2696675328,2697594879,JP -2697594880,2697596927,IN -2697601024,2697602047,KH -2697602048,2697603071,IN -2697603072,2697604095,ID -2697604096,2697605119,HK -2697605120,2697607167,IN -2697607168,2697608191,HK -2697608192,2697609215,CN -2697609216,2697625599,US -2697626624,2697627647,JP -2697627648,2697627903,US -2697627904,2697628671,SG -2697628672,2697629695,AU -2697629696,2697630719,BD -2697630720,2697632767,CN -2697632768,2697633791,IN -2697633792,2697634815,KR -2697634816,2697635583,US -2697635584,2697635839,NZ -2697635840,2697636863,CN -2697636864,2697638911,KR -2697638912,2697647103,IN -2697647104,2697658367,CN -2697658368,2697789439,JP -2697789440,2697854975,US -2697854976,2697887743,AU -2697887744,2697887999,ES -2697888000,2697889791,AU -2697889792,2697891839,US -2697891840,2697892095,GB -2697892096,2697892863,AU -2697892864,2697894399,US -2697894400,2697920511,AU -2697920512,2698117119,US -2698117120,2698182655,IS -2698182656,2698248191,DE -2698248192,2698313727,US -2698313728,2698379263,DE -2698379264,2698444799,ES -2698444800,2698510335,JP -2698510336,2698706943,CZ -2698706944,2698709503,CH -2698709504,2698709759,GB -2698709760,2698772479,CH -2698772480,2698838015,IT -2698838016,2698903551,BE -2698903552,2698969087,AU -2698969088,2699034623,CA -2699034624,2699165695,AO -2699165696,2699198463,NG -2699198464,2699211263,ZA -2699211264,2699211519,KE -2699211520,2699211775,GH -2699212800,2699213823,BF -2699213824,2699231231,ZA -2699231232,2699296767,US -2699296768,2699362303,FR -2699362304,2699526143,US -2699526144,2699542527,AU -2699542528,2699624447,US -2699624448,2699689983,JP -2699755520,2699821055,JP -2699886592,2699955199,JP -2699955200,2699956223,TH -2699956224,2699957247,BD -2699957248,2699957503,JP -2699957760,2699958271,US -2699959808,2699960063,JP -2699960320,2699960831,JP -2699960832,2699961343,HK -2699961344,2699962879,JP -2699962880,2699964415,US -2699964416,2699966975,JP -2699966976,2699967487,HK -2699967488,2699968511,JP -2699968512,2699969535,CN -2699969536,2699972607,IN -2699972608,2699973631,NZ -2699973632,2699974655,HK -2699974656,2699976703,IN -2699977728,2699977983,JP -2699978240,2699978751,US -2699978752,2699980799,BR -2699984896,2699986943,BR -2699986944,2699987967,BZ -2699987968,2699995135,BR -2699995136,2699996159,AR -2699996160,2699999231,BR -2699999232,2700000255,PY -2700000256,2700004351,BR -2700004352,2700005375,AR -2700005376,2700006399,BR -2700006400,2700007423,CL -2700007424,2700014591,BR -2700014592,2700015615,VE -2700015616,2700016639,BR -2700016640,2700017663,CL -2700017664,2700214271,JP -2700214272,2700247039,NA -2700247040,2700263423,UG -2700263424,2700279807,TG -2700279808,2700935167,JP -2700935168,2701066239,US -2701066240,2701131775,BG -2701131776,2701131807,HN -2701131808,2701131823,CA -2701131824,2701132159,HN -2701132160,2701132175,CR -2701132176,2701132391,HN -2701132392,2701132399,CR -2701132400,2701133631,HN -2701133632,2701133647,ES -2701133648,2701134447,HN -2701134448,2701134463,US -2701134464,2701135583,HN -2701135584,2701135599,US -2701135600,2701136095,HN -2701136096,2701136111,US -2701136112,2701137903,HN -2701137904,2701137911,BR -2701137912,2701138607,HN -2701138608,2701138615,UY -2701138616,2701139135,HN -2701139136,2701139151,UY -2701139152,2701139479,HN -2701139480,2701139487,NL -2701139488,2701139967,HN -2701139968,2701148159,NI -2701148160,2701149183,AR -2701149184,2701150207,HN -2701150208,2701152255,AR -2701152256,2701156351,BQ -2701156352,2701160447,CW -2701160448,2701162495,TT -2701162496,2701164543,UY -2701164544,2701170687,HT -2701170688,2701172735,TT -2701172736,2701176831,CL -2701176832,2701178879,AR -2701178880,2701180927,CL -2701180928,2701189119,HN -2701189120,2701197311,TT -2701197312,2701262847,US -2701262848,2701328383,GB -2701328384,2701393919,FR -2701393920,2701459455,NO -2701459456,2701524991,AT -2701524992,2701656063,US -2701656064,2701688831,RU -2701688832,2701721087,US -2701721088,2701721599,RU -2701721600,2701787135,TR -2701787136,2701852671,CO -2701852672,2701918207,US -2701918208,2701983743,GB -2701983744,2702245887,US -2702245888,2702311423,GB -2702311424,2702376959,CO -2702376960,2702442495,CA -2702442496,2702508031,CH -2702508032,2702573567,US -2702573568,2702581759,AR -2702581760,2702583807,VE -2702583808,2702585855,MX -2702585856,2702586111,PA -2702586112,2702587903,CW -2702587904,2702589951,BR -2702589952,2702606335,GF -2702606336,2702639103,BO -2702639104,2702704639,GB -2702704640,2702770175,BR -2702770176,2702835711,CL -2702835712,2702901247,US -2702901248,2702966783,IT -2702966784,2703032319,US -2703032320,2703097855,AU -2703097856,2703105023,GB -2703105024,2703105535,US -2703105536,2703127039,GB -2703127040,2703127295,US -2703127296,2703163391,GB -2703163392,2703359999,US -2703360000,2703425535,JP -2703425536,2703556607,US -2703556608,2703622143,ES -2703622144,2703818751,US -2703818752,2703884287,FI -2703884288,2703949823,DE -2703949824,2704015359,AU -2704015360,2704277503,US -2704277504,2704343039,FR -2704343040,2704408575,US -2704408576,2704474111,AU -2704474112,2704476159,US -2704476160,2704476415,GB -2704476416,2704476927,US -2704476928,2704477183,GB -2704477184,2704478207,US -2704478208,2704478463,SG -2704478464,2704484351,US -2704484352,2704485375,AU -2704485376,2704539647,US -2704539648,2704605183,SE -2704605184,2704670719,HR -2704670720,2704736255,SE -2704736256,2704801791,US -2704801792,2704867327,BO -2704867328,2704998399,US -2704998400,2705063935,BE -2705063936,2705195007,US -2705195008,2705260543,CH -2705260544,2705326079,US -2705326080,2705391615,MO -2705391616,2705399807,AU -2705399808,2705407999,NZ -2705408000,2705432575,AU -2705432576,2705440767,NZ -2705440768,2705457151,AU -2705457152,2705522687,NZ -2705522688,2705588223,ES -2705588224,2705596159,US -2705596160,2705596415,CA -2705596416,2705688319,US -2705688320,2705688575,DE -2705688576,2705691647,US -2705691648,2705692671,GB -2705692672,2705710079,US -2705710080,2705711103,IN -2705711104,2705850367,US -2705850368,2705915903,ES -2705915904,2706046975,GB -2706046976,2706112511,JP -2706112512,2706178047,GB -2706178048,2706243583,US -2706243584,2706309119,CH -2706309120,2706374655,BR -2706374656,2706571263,US -2706571264,2706694143,NL -2706694144,2706702335,US -2706702336,2706960383,NL -2706960384,2706964479,US -2706964480,2707226623,NL -2707226624,2707488767,JP -2707488768,2707947519,US -2707947520,2708144127,FR -2708144128,2708340735,US -2708340736,2708406271,AT -2708406272,2708471807,ES -2708471808,2708537343,GB -2708537344,2708733951,US -2708733952,2708799487,ES -2708799488,2708865023,SG -2708865024,2708930559,JP -2708930560,2709127167,US -2709127168,2709192703,KR -2709192704,2709225471,ZA -2709225472,2709225727,ES -2709225728,2709225983,ZA -2709225984,2709226239,ES -2709226240,2709226495,ZA -2709226496,2709226511,DE -2709226512,2709228767,ZA -2709228768,2709228783,DE -2709228784,2709229695,ZA -2709229696,2709229711,DE -2709229712,2709230799,ZA -2709230800,2709230815,DE -2709230816,2709231103,ZA -2709231104,2709231119,DE -2709231120,2709232127,ZA -2709232128,2709232383,DE -2709232384,2709232639,ZA -2709232640,2709232895,DE -2709232896,2709233151,ZA -2709233152,2709233407,DE -2709233408,2709235199,ZA -2709235200,2709235455,DE -2709235456,2709235711,ZA -2709235712,2709235967,DE -2709235968,2709236223,ZA -2709236224,2709236479,DE -2709236480,2709238271,ZA -2709238272,2709238527,DE -2709238528,2709238783,ZA -2709238784,2709239039,DE -2709239040,2709240319,ZA -2709240320,2709240575,DE -2709240576,2709240831,ZA -2709240832,2709241087,DE -2709241088,2709241343,ZA -2709241344,2709241599,DE -2709241600,2709241855,ZA -2709241856,2709242111,DE -2709242112,2709242367,US -2709242368,2709242623,DE -2709242624,2709242879,US -2709242880,2709243135,DE -2709243136,2709243391,US -2709243392,2709243647,DE -2709243648,2709243903,US -2709243904,2709244159,ZA -2709244160,2709244415,US -2709244416,2709244671,ZA -2709244672,2709244927,US -2709244928,2709245183,ZA -2709245184,2709245439,US -2709245440,2709245695,DE -2709245696,2709245951,US -2709245952,2709246207,ZA -2709246208,2709246463,US -2709246464,2709247231,ZA -2709247232,2709247487,MY -2709247488,2709247743,DE -2709247744,2709247999,US -2709248000,2709248255,ZA -2709248256,2709248511,US -2709248512,2709249535,ZA -2709249536,2709249791,DE -2709249792,2709250047,ZA -2709250048,2709250303,DE -2709250304,2709251071,ZA -2709251072,2709251327,DE -2709251328,2709251583,ZA -2709251584,2709251839,DE -2709251840,2709252095,ZA -2709252096,2709252351,DE -2709252352,2709256703,ZA -2709256704,2709256959,DE -2709256960,2709257215,ZA -2709257216,2709257471,DE -2709257472,2709258239,ZA -2709258240,2709389311,US -2709389312,2709454847,SG -2709454848,2709585919,US -2709651456,2709716991,US -2709716992,2709782527,CL -2709782528,2709848063,PE -2709848064,2710175743,US -2710175744,2710241279,BO -2710241280,2710306815,MY -2710306816,2710372351,VE -2710372352,2710437887,CA -2710437888,2710503423,MY -2710503424,2710568959,AU -2710568960,2710700031,US -2710700032,2710765567,AU -2710765568,2710831103,IT -2710831104,2710896639,BR -2710896640,2711093247,US -2711093248,2711158783,AU -2711158784,2711486463,US -2711486464,2711551999,NL -2711552000,2712535039,US -2712535040,2712535551,CA -2712535552,2713190399,US -2713190400,2713255935,CA -2713255936,2713387007,US -2713387008,2713452543,CA -2713452544,2713583615,US -2713583616,2713649151,AR -2713649152,2713946367,US -2713946368,2713946623,CA -2713946624,2713947395,US -2713947396,2713947396,DE -2713947397,2713976831,US -2713976832,2714042367,VE -2714042368,2714238975,US -2714238976,2714304511,TH -2714304512,2714370263,US -2714370264,2714370271,SG -2714370272,2714371679,US -2714371680,2714371711,CA -2714371712,2714372415,US -2714372416,2714372431,PH -2714372432,2714372967,US -2714372968,2714372971,IN -2714372972,2714373127,US -2714373128,2714373128,SG -2714373129,2714373743,US -2714373744,2714373759,IN -2714373760,2714374927,US -2714374928,2714374943,SG -2714374944,2714375039,US -2714375040,2714375055,ID -2714375056,2714376223,US -2714376224,2714376239,JP -2714376240,2714377103,US -2714377104,2714377119,IN -2714377120,2714377439,US -2714377440,2714377471,SG -2714377472,2714378463,US -2714378464,2714378495,HK -2714378496,2714379103,US -2714379104,2714379135,HK -2714379136,2714380031,US -2714380032,2714380287,HK -2714380288,2714381311,US -2714381312,2714381567,HK -2714381568,2714381951,US -2714381952,2714381983,HK -2714381984,2714382530,US -2714382531,2714382531,HK -2714382532,2714382580,US -2714382581,2714382581,HK -2714382582,2714384907,US -2714384908,2714384911,HK -2714384912,2714386431,US -2714386432,2714419743,JP -2714419744,2714419775,SG -2714419776,2714419871,JP -2714419872,2714419903,SG -2714419904,2714420479,JP -2714420480,2714420511,SG -2714420512,2714421439,JP -2714421440,2714421471,SG -2714421472,2714421567,JP -2714421568,2714421599,SG -2714421600,2714422879,JP -2714422880,2714422911,SG -2714422912,2714435583,JP -2714435584,2714697727,US -2714697728,2714763263,CN -2714763264,2715025407,US -2715025408,2715090943,VE -2715090944,2715287551,US -2715287552,2715353087,CA -2715353088,2715418623,US -2715418624,2715484159,DE -2715484160,2716139519,US -2716139520,2716205055,SG -2716205056,2716270591,PT -2716270592,2716336127,US -2716336128,2716401663,CA -2716401664,2716467199,US -2716467200,2716532735,VE -2716532736,2716729343,US -2716729344,2716794879,CL -2716794880,2717253631,US -2717253632,2717319167,TH -2717319168,2717384703,US -2717450240,2717581311,US -2717581312,2717646847,SA -2717646848,2717712383,KW -2717712384,2717843455,US -2717843456,2717908991,VE -2717908992,2717974527,CA -2717974528,2718629887,US -2718629888,2718695423,GB -2718695424,2718745599,US -2718745600,2718746623,AR -2718748672,2718749695,PK -2718749696,2718750719,BD -2718750720,2718750975,US -2718750976,2718751231,BL -2718751232,2718752767,US -2718752768,2718754815,PR -2718754816,2718756863,US -2718756864,2718758911,IN -2718758912,2718760959,US -2718760960,2718826495,GB -2718826496,2719285247,US -2719285248,2719350783,CH -2719350784,2719416319,US -2719416320,2719481855,CH -2719481856,2719547391,US -2719547392,2719612927,AT -2719612928,2719678463,CH -2719678464,2720399359,US -2720399360,2720464895,FR -2720464896,2720849919,US -2720849920,2720850175,GB -2720850176,2721382399,US -2721382400,2721447935,CA -2721447936,2721579007,US -2721579008,2721644543,IN -2721644544,2721972223,US -2721972224,2722037759,CN -2722037760,2722496511,US -2722496512,2722562047,CA -2722562048,2722693119,US -2722693120,2722758655,CA -2722758656,2723479551,US -2723479552,2723545087,CA -2723545088,2723610623,CH -2723610624,2723692735,US -2723692736,2723692767,HK -2723692768,2723693759,US -2723693760,2723693791,SG -2723693792,2723694783,US -2723694784,2723694815,AU -2723694816,2723695807,US -2723695808,2723695839,JP -2723695840,2723696831,US -2723696832,2723696863,IN -2723696864,2723697855,US -2723697856,2723697887,DE -2723697888,2723698879,US -2723698880,2723698911,GB -2723698912,2723699903,US -2723699904,2723699935,NL -2723699936,2723700927,US -2723700928,2723700959,PL -2723700960,2723707071,US -2723707072,2723707103,BR -2723707104,2723832575,US -2723832576,2723832831,GB -2723832832,2724268287,US -2724268288,2724268415,MX -2724268416,2724303947,US -2724303948,2724303951,GB -2724303952,2724303989,US -2724303990,2724303990,GB -2724303991,2724304013,US -2724304014,2724304014,GB -2724304015,2724304281,US -2724304282,2724304282,VE -2724304283,2724304707,US -2724304708,2724304711,DE -2724304712,2724790271,US -2724790272,2724855807,CN -2724855808,2724921343,CA -2724921344,2725249023,US -2725249024,2725314559,NZ -2725314560,2725904383,US -2725904384,2725969919,VE -2725969920,2726117375,US -2726117376,2726117631,GB -2726117632,2726117887,NL -2726117888,2726118143,DE -2726118144,2726121471,US -2726121472,2726121727,JP -2726121728,2726121983,SG -2726121984,2726122239,HK -2726122240,2727018495,US -2727018496,2727084031,CA -2727084032,2727411711,US -2727411712,2727608319,AU -2727608320,2728132607,US -2728132608,2728263679,CA -2728263680,2728264703,AU -2728264704,2728265727,JP -2728265728,2728266751,QA -2728266752,2728267775,KW -2728267776,2728268799,RO -2728268800,2728269823,FR -2728269824,2728270847,MY -2728270848,2728271871,OM -2728271872,2728272895,GB -2728272896,2728273919,IE -2728273920,2728274943,KE -2728274944,2728278015,IN -2728278016,2728284671,US -2728284672,2728288255,DE -2728288256,2728289279,AE -2728289280,2728290303,PL -2728290304,2728291327,US -2728291328,2728292351,NL -2728292352,2728293375,DE -2728293376,2728294399,JP -2728294400,2728295423,US -2728295424,2728296447,CA -2728296448,2728297471,EG -2728297472,2728298495,DK -2728298496,2728299519,PH -2728299520,2728300543,US -2728300544,2728301567,CA -2728301568,2728302591,CH -2728302592,2728304639,GB -2728304640,2728306687,SG -2728306688,2728308735,US -2728308736,2728309759,HK -2728309760,2728310783,SE -2728310784,2728311807,US -2728311808,2728312831,KR -2728312832,2728313087,FR -2728313088,2728313855,US -2728313856,2728314879,IT -2728314880,2728315903,DE -2728315904,2728316927,US -2728316928,2728317951,BG -2728317952,2728319999,US -2728320000,2728321023,NO -2728321024,2728322047,US -2728322048,2728323071,PH -2728323072,2728324095,BE -2728324096,2728325119,FI -2728325120,2728326143,TW -2728326144,2728327167,US -2728327168,2728328191,UA -2728328192,2728329215,US -2728394752,2731543551,US -2731543552,2731544575,CA -2731544576,2731549695,US -2731549696,2731550719,CA -2731550720,2731555839,US -2731555840,2731556863,CA -2731556864,2731560959,US -2731560960,2731561983,CA -2731561984,2731563007,US -2731563008,2731564031,CA -2731564032,2731566079,US -2731566080,2731567103,CA -2731567104,2731573247,US -2731573248,2731606015,CA -2731606016,2731667455,US -2731667456,2731671551,HK -2731671552,2731673599,US -2731673600,2731674623,CA -2731674624,2731679743,US -2731679744,2731680767,CA -2731680768,2731681791,US -2731681792,2731682815,PR -2731682816,2731685887,US -2731685888,2731686911,CA -2731686912,2731688959,US -2731688960,2731689471,VG -2731689472,2731711487,US -2731711488,2731712511,AG -2731712512,2731714559,CA -2731714560,2731717631,US -2731717632,2731718655,CA -2731718656,2731728895,US -2731728896,2731729919,CA -2731729920,2731739647,US -2731739648,2731740159,CA -2731740160,2731761663,US -2731761664,2731763711,CA -2731763712,2731765759,US -2731765760,2731767807,CA -2731767808,2731771903,US -2731771904,2731772927,KY -2731772928,2731784191,US -2731784192,2731785215,CA -2731785216,2731786239,US -2731786240,2731788287,CA -2731788288,2731790335,US -2731790336,2731792383,CA -2731792384,2731795455,US -2731795456,2731796479,DE -2731796480,2731797503,CA -2731797504,2731800575,US -2731800576,2731801599,CA -2731801600,2731804671,US -2731804672,2731805695,CA -2731805696,2731805951,TC -2731805952,2731806015,BB -2731806016,2731806079,VC -2731806080,2731806463,BB -2731806464,2731806719,VG -2731806720,2731807743,US -2731807744,2731808767,CA -2731808768,2731817727,US -2731817728,2731817751,AU -2731817752,2731819007,US -2731819008,2731821055,CA -2731821056,2731828223,US -2731828224,2731829247,CA -2731829248,2731831295,US -2731831296,2731832319,CA -2731832320,2731836927,US -2731836928,2731837183,IS -2731837184,2731843583,US -2731843584,2731845631,PR -2731845632,2731847679,FR -2731847680,2731853823,US -2731853824,2731855871,CA -2731855872,2731856383,LC -2731856384,2731856895,VC -2731856896,2731862015,US -2731862016,2731864063,CA -2731864064,2731870207,US -2731870208,2731871231,CA -2731871232,2731894783,US -2731894784,2731896831,CA -2731896832,2731900927,US -2731900928,2731901439,CA -2731901440,2731902975,US -2731902976,2731903999,CA -2731904000,2731908095,US -2731908096,2731909119,CA -2731909120,2731911167,US -2731911168,2731912191,DM -2731912192,2731917567,US -2731917568,2731917575,AU -2731917576,2731921663,US -2731921664,2731921727,BE -2731921728,2732086271,US -2732086272,2732087295,CA -2732087296,2732105727,US -2732105728,2732107775,JM -2732107776,2732109823,US -2732110848,2732111871,US -2732111872,2732113919,CA -2732113920,2732128767,US -2732128768,2732129023,NL -2732129024,2732131327,US -2732131328,2732132351,CA -2732132352,2732137215,US -2732137216,2732137471,DE -2732137472,2732138239,US -2732138240,2732138495,DE -2732138496,2732145663,US -2732145664,2732146687,CA -2732146688,2732189695,US -2732189696,2732192767,CA -2732192768,2732194559,US -2732194816,2732201983,US -2732201984,2732203007,VG -2732203008,2732204031,US -2732204032,2732206079,CA -2732206080,2732227583,US -2732227584,2732228607,CA -2732228608,2732261375,US -2732261376,2732265471,CA -2732265472,2732273663,US -2732273664,2732275711,CA -2732275712,2732278783,US -2732278784,2732279807,CA -2732279808,2732301311,US -2732301312,2732301823,CA -2732301824,2732302335,US -2732302336,2732303359,CA -2732303360,2732306431,US -2732306432,2732307455,CA -2732307456,2732308479,US -2732308480,2732310527,CA -2732310528,2732320767,US -2732320768,2732321023,AU -2732321024,2732321279,BM -2732321280,2732321535,CA -2732321536,2732321791,GB -2732321792,2732322047,US -2732322048,2732322815,CA -2732322816,2732336127,US -2732336128,2732337151,CA -2732337152,2732351487,US -2732351488,2732353535,PR -2732353536,2732361727,US -2732361728,2732363775,BB -2732363776,2732375039,US -2732375040,2732376063,CA -2732376064,2732379135,US -2732379136,2732380159,CA -2732380160,2732389375,US -2732389888,2732390143,IT -2732390144,2732390399,US -2732390400,2732391423,CA -2732391424,2732395519,US -2732395520,2732396543,CA -2732396544,2732423167,US -2732423168,2732425215,CA -2732425216,2732443647,US -2732443648,2732445695,CA -2732445696,2732446719,US -2732446720,2732447743,BM -2732447744,2732455935,US -2732455936,2732457983,CA -2732457984,2732472319,US -2732472320,2732474367,CA -2732474368,2732478463,US -2732478464,2732479487,CA -2732479488,2732480511,AG -2732480512,2732480767,TR -2732480768,2732481023,US -2732481024,2732481279,TR -2732481280,2732485631,US -2732485632,2732486655,PR -2732486656,2732488703,US -2732488704,2732490751,CA -2732492800,2732493823,CA -2732493824,2732494847,US -2732494848,2732495871,CA -2732495872,2732497919,US -2732497920,2732499967,CA -2732499968,2732500479,TW -2732500480,2732515327,US -2732515328,2732515583,VG -2732515584,2732523519,US -2732523520,2732525567,CA -2732525568,2732534783,US -2732534784,2732536831,CA -2732536832,2732549119,US -2732549120,2732550143,CA -2732550144,2732554239,US -2732554240,2732554495,CA -2732554496,2732555007,US -2732555008,2732555263,CA -2732555264,2732556031,US -2732556032,2732556287,CA -2732556288,2732580863,US -2732580864,2732582911,CA -2732582912,2733903871,US -2733903872,2733904895,PR -2733904896,2733907967,CA -2733907968,2733911039,US -2733911040,2733912063,CA -2733912064,2733920483,US -2733920484,2733920486,RO -2733920487,2733920488,US -2733920489,2733920491,RO -2733920492,2733920495,US -2733920496,2733920497,RO -2733920498,2733920498,US -2733920499,2733920506,RO -2733920507,2733920682,US -2733920683,2733920686,RO -2733920687,2733920688,US -2733920689,2733920690,RO -2733920691,2733920691,US -2733920692,2733920692,RO -2733920693,2733920744,US -2733920745,2733920750,RO -2733920751,2733920927,US -2733920928,2733920935,RO -2733920936,2733922303,US -2733922304,2733923327,CA -2733923328,2733930495,US -2733930496,2733931519,CA -2733931520,2733942783,US -2733942784,2733943807,PR -2733943808,2733953023,US -2733953024,2733954047,CA -2733954048,2733958143,US -2733958144,2733959167,CA -2733959168,2733960191,US -2733960192,2733961215,CA -2733961216,2733963263,US -2733963264,2733964287,CA -2733964288,2733979647,US -2733979648,2733980671,CA -2733980672,2733981695,US -2733983744,2733984767,US -2733984768,2733985791,LC -2733985792,2734002175,US -2734002176,2734003199,CA -2734003200,2734004223,US -2734004224,2734005247,GD -2734005248,2734018559,US -2734018560,2734020607,CA -2734020608,2734026751,US -2734026752,2734030847,CA -2734030848,2734031871,JM -2734031872,2734032895,US -2734032896,2734034943,CA -2734034944,2734044159,US -2734044160,2734045183,CA -2734045184,2734057471,US -2734057472,2734059519,BB -2734059520,2734063615,US -2734063616,2734064639,CA -2734064640,2734070783,US -2734070784,2734071807,CA -2734071808,2734074879,US -2734074880,2734075903,PR -2734075904,2734077951,US -2734077952,2734078207,GB -2734078208,2734099455,US -2734099456,2734102527,CA -2734102528,2734104575,VI -2734104576,2734105599,US -2734105600,2734106623,CA -2734106624,2734119935,US -2734119936,2734120959,CA -2734120960,2734125055,US -2734125056,2734129151,CA -2734129152,2734139391,US -2734139392,2734140415,CA -2734140416,2734152447,US -2734152448,2734152703,CA -2734152704,2734153727,KY -2734153728,2734155775,CA -2734155776,2734163967,US -2734163968,2734164991,CA -2734164992,2734170111,US -2734170112,2734172159,CA -2734172160,2734173183,US -2734173184,2734174207,PR -2734174208,2734192639,US -2734192640,2734194687,CA -2734194688,2734197759,US -2734197760,2734198783,CA -2734198784,2734200831,US -2734200832,2734205951,CA -2734205952,2734206975,US -2734206976,2734209023,CA -2734209024,2734218239,US -2734218240,2734218751,CA -2734218752,2734219263,US -2734221312,2734224415,US -2734224416,2734224431,GB -2734224432,2734229503,US -2734229504,2734230527,CA -2734230528,2734237695,US -2734237696,2734238719,CA -2734238720,2734249983,US -2734249984,2734252031,CA -2734252032,2734260223,US -2734260224,2734262271,KY -2734262272,2734268415,US -2734268416,2734269439,CA -2734269440,2734287871,US -2734287872,2734288895,CA -2734288896,2734296063,US -2734296064,2734297087,CA -2734297088,2734304255,US -2734304256,2734305279,CA -2734305280,2734330623,US -2734330624,2734330879,IT -2734330880,2734335999,US -2734336000,2734338047,CA -2734338048,2734341119,US -2734341120,2734344191,CA -2734344192,2734349311,US -2734349312,2734350335,CA -2734350336,2734362623,US -2734362624,2734363647,CA -2734363648,2734373887,US -2734373888,2734374911,CA -2734374912,2734376959,US -2734376960,2734379007,CA -2734379008,2734380799,US -2734380800,2734381055,VG -2734381056,2734398463,US -2734398464,2734399487,PR -2734399488,2734407679,US -2734407680,2734409727,CA -2734409728,2734413823,US -2734413824,2734413847,AR -2734413848,2734413855,TT -2734413856,2734413863,AR -2734413864,2734414078,US -2734414079,2734414079,MX -2734414080,2734414083,PA -2734414084,2734414087,MX -2734414088,2734414091,CR -2734414092,2734414095,PA -2734414096,2734414143,MX -2734414144,2734414159,PA -2734414160,2734414175,MX -2734414176,2734414183,PA -2734414184,2734414295,MX -2734414296,2734414299,US -2734414300,2734414319,MX -2734414320,2734414327,PA -2734414328,2734414328,US -2734414329,2734414329,MX -2734414330,2734414334,US -2734414335,2734414335,MX -2734414336,2734432255,US -2734433280,2734435327,US -2734435328,2734436351,CA -2734436352,2734447615,US -2734447616,2734448639,CA -2734448640,2734452735,US -2734452736,2734454783,CA -2734454784,2734457855,US -2734457856,2734458879,CA -2734458880,2734467327,US -2734467328,2734467583,CA -2734467584,2734467839,US -2734467840,2734468095,GB -2734468096,2734471167,US -2734471168,2734472191,CA -2734472192,2734473215,AG -2734473216,2734479359,US -2734479360,2734481407,CA -2734481408,2734485503,US -2734485504,2734486527,CA -2734486528,2734488575,US -2734488576,2734489599,CA -2734489600,2734491647,US -2734491648,2734492671,CA -2734492672,2734493695,US -2734493696,2734494719,MY -2734494720,2734502911,US -2734502912,2734503935,CA -2734503936,2734515199,US -2734515200,2734516223,DM -2734516224,2734522367,US -2734522368,2734523391,CA -2734523392,2734524415,US -2734524416,2734526463,CA -2734526464,2734532607,US -2734532608,2734533631,VI -2734533632,2734553087,US -2734553088,2734555135,CA -2734555136,2734565375,US -2734565376,2734566399,CA -2734566400,2734577151,US -2734577152,2734577167,LU -2734577168,2734588927,US -2734588928,2734589951,CA -2734589952,2734599167,US -2734599168,2734600191,CA -2734601216,2734605311,US -2734605312,2734605567,GB -2734605568,2734605823,DE -2734605824,2734606079,SE -2734606080,2734607179,US -2734607180,2734607181,KW -2734607182,2734608351,US -2734608352,2734608367,DE -2734608368,2734633983,US -2734633984,2734635007,CA -2734635008,2734649343,US -2734649344,2734650367,CA -2734650368,2734657535,US -2734657536,2734658559,VG -2734658560,2734659583,CA -2734659584,2734665727,US -2734665728,2734666751,CA -2734666752,2734672895,US -2734672896,2734675967,CA -2734675968,2734678015,BM -2734678016,2734679039,US -2734679040,2734680063,CA -2734680064,2734684159,US -2734684160,2734686207,CA -2734686208,2734751743,CN -2734751744,2734817279,GB -2734817280,2734882815,US -2734882816,2734948351,SE -2734948352,2735013887,US -2735013888,2735079423,FR -2735079424,2735144959,US -2735144960,2735210495,NZ -2735210496,2735276031,AU -2735276032,2735341567,FR -2735341568,2735407103,AR -2735407104,2735538175,US -2735538176,2736848895,TW -2736848896,2736914431,US -2736914432,2736979967,NO -2736979968,2737438719,US -2737438720,2737594367,JP -2737594368,2737602559,US -2737602560,2737610751,SG -2737610752,2737618943,JP -2737618944,2737619967,VN -2737619968,2737620991,TH -2737620992,2737621247,VN -2737621248,2737622015,SG -2737622016,2737623039,VN -2737623040,2737767423,JP -2737767424,2737768447,CN -2737768448,2737769471,SG -2737769472,2737770495,IN -2737770496,2737771263,AU -2737771264,2737771519,JP -2737771520,2737771775,AU -2737771776,2737772031,NZ -2737772288,2737774591,JP -2737774592,2737776639,BD -2737776640,2737777663,AU -2737777664,2737778175,HK -2737778432,2737781759,AU -2737781760,2737782783,US -2737782784,2737785855,AU -2737785856,2737788927,BD -2737788928,2737789951,MY -2737789952,2737793023,AU -2737793024,2737794047,NZ -2737794048,2737795071,AU -2737795072,2737796095,NZ -2737796096,2737799167,AU -2737799168,2737800191,NZ -2737800192,2737802239,AU -2737802240,2737803263,IN -2737803264,2737804287,BD -2737804288,2737805311,NP -2737805312,2737806335,IN -2737806336,2737807359,BD -2737807360,2737808383,AF -2737808384,2737809407,NZ -2737809408,2737810431,AU -2737810432,2737811455,KH -2737811456,2737811711,SG -2737811712,2737811967,HK -2737811968,2737812223,GB -2737812224,2737812479,US -2737812480,2737813503,AU -2737813504,2737815551,NZ -2737815552,2737816575,MY -2737816576,2737817599,AU -2737817600,2737818111,MY -2737818112,2737818367,AU -2737818368,2737818623,MY -2737818624,2737819647,NZ -2737819648,2737821695,IN -2737821696,2737822719,AU -2737822720,2737823743,NZ -2737823744,2737824767,NC -2737824768,2737829887,NZ -2737829888,2737830911,NC -2737830912,2737831935,AU -2737831936,2738094079,JP -2738159616,2738163711,CN -2738163712,2738164735,HK -2738164736,2738165759,AU -2738165760,2738166783,NP -2738166784,2738167807,KH -2738167808,2738168831,AU -2738168832,2738177023,CN -2738177024,2738178047,AU -2738178048,2738182143,IN -2738182144,2738195455,CN -2738195456,2738196479,BD -2738196480,2738197503,AU -2738197504,2738198527,BD -2738198528,2738199551,MY -2738199552,2738200575,KR -2738200576,2738204671,CN -2738204672,2738205695,IN -2738205696,2738206719,BD -2738206720,2738207743,ID -2738207744,2738208767,CN -2738208768,2738209791,ID -2738209792,2738210815,KH -2738210816,2738214911,IN -2738214912,2738215935,HK -2738215936,2738216959,CN -2738216960,2738217983,MY -2738217984,2738220031,AU -2738220032,2738222079,CN -2738222080,2738223103,MO -2738223104,2738224127,AU -2738224128,2738225151,IN -2738225152,2738683903,JP -2738749440,2741370879,FR -2741370880,2741436415,US -2741436416,2742353919,FR -2742353920,2742419455,ES -2742419456,2742484991,US -2742484992,2742550527,GB -2742550528,2742616063,US -2742616064,2742681599,EG -2742681600,2742747135,IN -2742747136,2742779903,CA -2742779904,2742878207,US -2742878208,2742943743,CN -2742943744,2743009279,US -2743140352,2743205887,US -2743205888,2743992319,JP -2743992320,2744057855,CN -2744057856,2744516607,JP -2744516608,2744647679,US -2744647680,2744713215,KR -2744713216,2744844287,US -2744844288,2744909823,CA -2744909824,2744975359,GB -2744975360,2744975871,DE -2744975872,2745040895,SE -2745040896,2745106431,NL -2745106432,2745171967,SI -2745171968,2745237503,GB -2745237504,2745303039,CH -2745303040,2745368575,IT -2745368576,2745434111,BE -2745434112,2745499647,GB -2745499648,2745548799,BE -2745548800,2745565183,DE -2745565184,2745696255,GB -2745696256,2745761791,CH -2745761792,2745909247,GB -2745909248,2745958399,US -2745958400,2746011647,FR -2746011648,2746015743,NL -2746015744,2746089471,FR -2746089472,2746155007,NO -2746155008,2746220543,NL -2746220544,2746286079,US -2746286080,2746351615,CN -2746351616,2746417151,CR -2746417152,2746482687,CN -2746482688,2746548223,KR -2746548224,2746662911,US -2746662912,2746679295,CA -2746679296,2747072511,US -2747072512,2747138047,AU -2747138048,2747465727,US -2747465728,2748055551,ZA -2748055552,2748121087,CN -2748121088,2748317695,US -2748317696,2748645375,JP -2748645376,2748710911,KR -2748710912,2749235199,JP -2749235200,2749300735,KR -2749366272,2749628415,JP -2749628416,2749693951,US -2749693952,2749759487,KR -2749759488,2749890559,US -2749890560,2750021631,AU -2750021632,2750349311,US -2750349312,2750414847,KR -2750414848,2750723071,US -2750723072,2750723327,IN -2750723328,2750723583,US -2750723584,2750723839,IN -2750723840,2750724607,US -2750724608,2750724863,IN -2750724864,2750739967,US -2750739968,2750740223,CN -2750740224,2750873599,US -2750873600,2750939135,CL -2750939136,2751070207,US -2751070208,2751135743,CL -2751135744,2751196929,US -2751196930,2751196930,JP -2751196931,2751397887,US -2751397888,2751463423,KR -2751463424,2751528959,KZ -2751528960,2751660031,FR -2751660032,2751716351,AT -2751716352,2751716607,US -2751716608,2751725567,AT -2751725568,2751791103,SE -2751791104,2751856639,FI -2751856640,2751922175,GB -2751922176,2751987711,FR -2751987712,2752053247,SI -2752053248,2752184319,SE -2752184320,2752315391,GB -2752315392,2752380927,FI -2752380928,2752446463,CH -2752446464,2752511999,BE -2752512000,2753757183,DE -2753757184,2753822719,BE -2753822720,2753888255,GB -2753888256,2753953791,SE -2753953792,2754084863,GB -2754084864,2754117631,KZ -2754117632,2754117823,NL -2754117824,2754125823,GB -2754125824,2754127871,DE -2754127872,2754129919,SK -2754129920,2754131967,SE -2754134016,2754138111,DE -2754138112,2754142207,GB -2754142208,2754144255,BA -2754144256,2754146303,DE -2754146304,2754148351,PL -2754148352,2754150399,MK -2754150400,2754215935,BR -2754215936,2754281471,PR -2754281472,2754347007,JP -2754347008,2754478079,US -2754478080,2754543615,JP -2754543616,2754609151,US -2754609152,2754674687,SE -2754674688,2754871295,US -2754871296,2754904063,HK -2754904064,2754920447,US -2754920448,2754928639,IN -2754928640,2754936831,US -2754936832,2755002367,AU -2755002368,2755330047,US -2755330048,2755526655,DE -2755526656,2755985407,US -2755985408,2756182015,JP -2756182016,2756247551,US -2756247552,2756313087,UY -2756313088,2756378623,US -2756378624,2756444159,AU -2756444160,2756509695,US -2756509696,2756556543,CL -2756556544,2756556799,PE -2756556800,2756575231,CL -2756575232,2756640767,SG -2756640768,2756706303,US -2756706304,2756771839,AU -2756771840,2756837375,FR -2756837376,2757033983,US -2757033984,2757099519,BR -2757099520,2757230591,US -2757230592,2757296127,ZA -2757296128,2757754879,US -2757754880,2757820415,CL -2757820416,2757885951,AU -2757885952,2757951487,CL -2757951488,2758017023,US -2758017024,2758082559,IN -2758082560,2758148095,US -2758148096,2758213631,CA -2758213632,2758541311,US -2758541312,2758606847,AU -2758606848,2758803455,US -2758803456,2758868991,AU -2758868992,2759000063,US -2759000064,2759065599,TH -2759065600,2759589887,US -2759589888,2759720959,KR -2759720960,2759852031,PL -2759852032,2759917567,CH -2759917568,2759983103,FR -2759983104,2760048639,IT -2760048640,2760114811,FR -2760114812,2760114815,PL -2760114816,2760114847,FI -2760114848,2760115007,FR -2760115008,2760115071,DE -2760115072,2760115327,FR -2760115328,2760115455,GB -2760115456,2760115711,FR -2760115712,2760115719,IE -2760115720,2760115775,FR -2760115776,2760115839,ES -2760115840,2760115903,FR -2760115904,2760115967,IT -2760115968,2760116063,FR -2760116064,2760116095,PL -2760116096,2760116207,FR -2760116208,2760116223,FI -2760116224,2760116507,FR -2760116508,2760116511,ES -2760116512,2760116759,FR -2760116760,2760116767,PT -2760116768,2760116799,PL -2760116800,2760116831,FR -2760116832,2760116847,GB -2760116848,2760116879,FR -2760116880,2760116895,IT -2760116896,2760117183,FR -2760117184,2760117247,NL -2760117248,2760117375,FR -2760117376,2760117503,GB -2760117504,2760117567,FR -2760117568,2760117631,DE -2760117632,2760117679,FR -2760117680,2760117695,FI -2760117696,2760117727,FR -2760117728,2760117759,FI -2760117760,2760117871,FR -2760117872,2760117887,LT -2760117888,2760117999,FR -2760118000,2760118015,IT -2760118016,2760118303,FR -2760118304,2760118335,PL -2760118336,2760118439,FR -2760118440,2760118463,LT -2760118464,2760118543,FR -2760118544,2760118559,GB -2760118560,2760118799,FR -2760118800,2760118815,ES -2760118816,2760118847,FI -2760118848,2760118911,BE -2760118912,2760118975,FR -2760118976,2760119039,ES -2760119040,2760119263,FR -2760119264,2760119295,PL -2760119296,2760119327,FR -2760119328,2760119359,IT -2760119360,2760119423,DE -2760119424,2760119495,FR -2760119496,2760119499,ES -2760119500,2760119967,FR -2760119968,2760119983,GB -2760119984,2760120543,FR -2760120544,2760120575,ES -2760120576,2760120751,FR -2760120752,2760120759,ES -2760120760,2760120839,FR -2760120840,2760120843,PT -2760120844,2760121663,FR -2760121664,2760121727,ES -2760121728,2760121827,FR -2760121828,2760121831,ES -2760121832,2760122047,FR -2760122048,2760122111,DE -2760122112,2760122303,FR -2760122304,2760122367,NL -2760122368,2760129887,FR -2760129888,2760129919,CZ -2760129920,2760129999,FR -2760130000,2760130015,ES -2760130016,2760130399,FR -2760130400,2760130431,ES -2760130432,2760130559,GB -2760130560,2760130975,FR -2760130976,2760131007,IT -2760131008,2760131071,BE -2760131072,2760131263,FR -2760131264,2760131327,IT -2760131328,2760132159,FR -2760132160,2760132223,ES -2760132224,2760132767,FR -2760132768,2760132783,DE -2760132784,2760132911,FR -2760132912,2760132927,PT -2760132928,2760132959,FR -2760132960,2760132991,DE -2760132992,2760133599,FR -2760133600,2760133631,PL -2760133632,2760134783,FR -2760134784,2760134799,ES -2760134800,2760134879,FR -2760134880,2760134887,ES -2760134888,2760134975,FR -2760134976,2760135039,ES -2760135040,2760135231,FR -2760135232,2760135295,IT -2760135296,2760135615,FR -2760135616,2760135679,DE -2760135680,2760135687,FR -2760135688,2760135695,CZ -2760135696,2760135935,FR -2760135936,2760136191,PT -2760136192,2760136767,FR -2760136768,2760136831,BE -2760136832,2760137215,FR -2760137216,2760137471,GB -2760137472,2760137535,FR -2760137536,2760137599,ES -2760137600,2760137647,FR -2760137648,2760137663,PL -2760137664,2760137935,FR -2760137936,2760137951,PL -2760137952,2760138271,FR -2760138272,2760138303,PL -2760138304,2760143039,FR -2760143040,2760143103,ES -2760143104,2760143295,FR -2760143296,2760143359,DE -2760143360,2760143615,FR -2760143616,2760143871,GB -2760143872,2760145215,FR -2760145216,2760145279,ES -2760145280,2760145327,FR -2760145328,2760145343,PL -2760145344,2760145599,FR -2760145600,2760145663,NL -2760145664,2760145855,FR -2760145856,2760145919,GB -2760145920,2760146111,FR -2760146112,2760146143,FI -2760146144,2760146159,FR -2760146160,2760146175,PL -2760146176,2760147423,FR -2760147424,2760147455,DE -2760147456,2760147463,FR -2760147464,2760147467,GB -2760147468,2760147647,FR -2760147648,2760147711,ES -2760147712,2760148551,FR -2760148552,2760148559,FI -2760148560,2760148895,FR -2760148896,2760148927,CZ -2760148928,2760148991,DE -2760148992,2760149039,FR -2760149040,2760149055,LT -2760149056,2760149215,FR -2760149216,2760149247,BE -2760149248,2760149263,FR -2760149264,2760149279,PT -2760149280,2760149327,FR -2760149328,2760149343,LT -2760149344,2760149375,FR -2760149376,2760149503,GB -2760149504,2760150087,FR -2760150088,2760150095,ES -2760150096,2760150111,FR -2760150112,2760150143,NL -2760150144,2760150207,BE -2760150208,2760150239,FR -2760150240,2760150271,PL -2760150272,2760150335,FR -2760150336,2760150399,BE -2760150400,2760150847,FR -2760150848,2760150911,DE -2760150912,2760151039,FR -2760151040,2760151055,GB -2760151056,2760151199,FR -2760151200,2760151231,CZ -2760151232,2760151247,FR -2760151248,2760151263,LT -2760151264,2760151295,NL -2760151296,2760151335,FR -2760151336,2760151339,GB -2760151340,2760151343,FR -2760151344,2760151359,GB -2760151360,2760151423,IT -2760151424,2760151679,FR -2760151680,2760151743,IT -2760151744,2760151903,FR -2760151904,2760151935,PT -2760151936,2760152591,FR -2760152592,2760152607,PL -2760152608,2760152639,FI -2760152640,2760152647,FR -2760152648,2760152655,LT -2760152656,2760152751,FR -2760152752,2760152767,LT -2760152768,2760153439,FR -2760153440,2760153471,ES -2760153472,2760153535,FR -2760153536,2760153599,DE -2760153600,2760154223,FR -2760154224,2760154239,DE -2760154240,2760154303,FR -2760154304,2760154367,NL -2760154368,2760154951,FR -2760154952,2760154955,GB -2760154956,2760154959,FR -2760154960,2760154975,IT -2760154976,2760155007,PL -2760155008,2760155135,GB -2760155136,2760159279,FR -2760159280,2760159295,LT -2760159296,2760159423,FR -2760159424,2760159487,DE -2760159488,2760159615,FR -2760159616,2760159743,GB -2760159744,2760159775,FR -2760159776,2760159807,IT -2760159808,2760159903,FR -2760159904,2760159935,CZ -2760159936,2760160831,FR -2760160832,2760160895,IT -2760160896,2760160959,FR -2760160960,2760161023,DE -2760161024,2760161983,FR -2760161984,2760162047,IE -2760162048,2760162399,FR -2760162400,2760162431,ES -2760162432,2760162495,FR -2760162496,2760162559,BE -2760162560,2760162671,FR -2760162672,2760162687,PL -2760162688,2760163135,FR -2760163136,2760163199,ES -2760163200,2760163263,FR -2760163264,2760163327,DE -2760163328,2760166682,FR -2760166683,2760166683,DE -2760166684,2760167583,FR -2760167584,2760167599,ES -2760167600,2760167647,FR -2760167648,2760167679,GB -2760167680,2760167951,FR -2760167952,2760167967,ES -2760167968,2760167999,FR -2760168000,2760168063,BE -2760168064,2760168095,FR -2760168096,2760168127,PL -2760168128,2760168191,IE -2760168192,2760168319,FR -2760168320,2760168447,GB -2760168448,2760169183,FR -2760169184,2760169215,ES -2760169216,2760169343,FR -2760169344,2760169471,IT -2760169472,2760169503,FI -2760169504,2760169679,FR -2760169680,2760169695,ES -2760169696,2760169983,FR -2760169984,2760170047,ES -2760170048,2760170111,FI -2760170112,2760170815,FR -2760170816,2760170847,PT -2760170848,2760170975,FR -2760170976,2760170991,IT -2760170992,2760171279,FR -2760171280,2760171295,PL -2760171296,2760171439,FR -2760171440,2760171455,CZ -2760171456,2760174591,FR -2760174592,2760174623,GB -2760174624,2760175007,FR -2760175008,2760175039,PL -2760175040,2760175295,FR -2760175296,2760175359,ES -2760175360,2760175423,FR -2760175424,2760175487,DE -2760175488,2760175615,GB -2760175616,2760178111,FR -2760178112,2760178175,ES -2760178176,2760178559,FR -2760178560,2760178687,IT -2760178688,2760178751,FR -2760178752,2760178767,GB -2760178768,2760179711,FR -2760179712,2760245247,DE -2760245248,2760310783,GB -2760310784,2760376319,SE -2760376320,2760507391,GB -2760507392,2760511487,RU -2760511488,2760513535,IR -2760513536,2760515583,NL -2760515584,2760517631,RU -2760517632,2760519679,KZ -2760519680,2760521727,IT -2760521728,2760523775,FR -2760523776,2760527871,CH -2760527872,2760529919,GB -2760529920,2760531967,RU -2760534016,2760536063,BE -2760536064,2760540159,IL -2760540160,2760556543,IR -2760556544,2760558591,DE -2760558592,2760562687,ES -2760562688,2760564735,BG -2760564736,2760566783,GB -2760566784,2760568831,IQ -2760568832,2760570879,FR -2760570880,2760572927,NL -2760572928,2760638463,DE -2760638464,2760703999,NL -2760704000,2760769535,FI -2760769536,2760835071,IT -2760835072,2760898559,GB -2760898560,2760899583,US -2760899584,2760900607,GB -2760900608,2761031679,US -2761031680,2761424895,ZA -2761424896,2761621503,US -2761621504,2761687039,ZA -2761687040,2761949183,US -2761949184,2761950207,TN -2761950208,2761951231,UG -2761951232,2761952255,LR -2761952256,2761953279,ZM -2761953280,2761954303,CG -2761954304,2761956351,ZA -2761956352,2761957375,TZ -2761957376,2761958399,CI -2761958400,2761959423,ZA -2761959424,2761960447,CI -2761960448,2761961471,ZA -2761961472,2761962495,CD -2761962496,2761963519,ZA -2761963520,2761964543,ZM -2761964544,2761965567,ZA -2761965568,2761966591,EG -2761966592,2761967615,RE -2761967616,2761970687,ZA -2761970688,2761971711,GQ -2761971712,2761973759,ZA -2761973760,2761974783,AO -2761974784,2761975807,RW -2761975808,2761976831,EG -2761976832,2761977855,NA -2761977856,2761978879,UG -2761978880,2761981951,ZA -2761981952,2761982975,NG -2761982976,2761983999,GH -2761984000,2761985023,KM -2761985024,2761986047,BJ -2761986048,2761987071,LY -2761987072,2761989119,ZA -2761989120,2761990143,CG -2761990144,2761992191,UG -2761992192,2761996287,ZA -2761996288,2761997311,ET -2761997312,2761998335,ZA -2761998336,2762000383,NG -2762000384,2762006527,ZA -2762006528,2762010623,RE -2762010624,2762014719,GH -2762014720,2762145791,JP -2762145792,2762147839,BR -2762147840,2762148863,PA -2762148864,2762156031,BR -2762156032,2762157055,AR -2762157056,2762158079,BR -2762158080,2762159103,EC -2762159104,2762160127,BR -2762160128,2762161151,AR -2762161152,2762164223,BR -2762164224,2762165247,HN -2762165248,2762166271,BR -2762166272,2762167295,CL -2762167296,2762168319,BR -2762168320,2762169343,CL -2762169344,2762176511,BR -2762176512,2762177535,AR -2762177536,2762178559,HN -2762178560,2762179583,AR -2762179584,2762180607,EC -2762180608,2762186751,BR -2762186752,2762187775,EC -2762187776,2762192895,BR -2762192896,2762193919,PY -2762193920,2762194943,MX -2762194944,2762201087,BR -2762201088,2762202111,AR -2762202112,2762207231,BR -2762207232,2762207487,AR -2762207488,2762207743,PE -2762207744,2762208255,BR -2762208256,2762209279,PA -2762209280,2762211327,BR -2762211328,2762276863,IN -2762276864,2762342399,US -2762342400,2762407935,CA -2762407936,2763063295,US -2763063296,2763096063,FR -2763096064,2763104255,GB -2763104256,2763108351,DE -2763108352,2763110399,RU -2763110400,2763112447,NL -2763112448,2763128831,BY -2763128832,2763194367,CA -2763194368,2765553663,US -2765553664,2765561855,CY -2765561856,2765563903,FI -2765563904,2765565951,IR -2765565952,2765567999,RU -2765568000,2765570047,IR -2765570048,2765578239,RU -2765578240,2765580287,AZ -2765580288,2765582335,GB -2765582336,2765586431,CZ -2765586432,2765619199,IR -2765619200,2768240639,US -2768240640,2768306175,ZA -2768306176,2768437247,US -2768437248,2768633855,ZA -2768633856,2768764927,US -2768764928,2769027071,ZA -2769027072,2769092607,AU -2769092608,2769158143,US -2769158144,2769223679,JP -2769289216,2769321983,LY -2769321984,2769338367,ZA -2769338368,2769340415,TZ -2769340416,2769342463,ZA -2769342464,2769346559,BF -2769346560,2769354751,ZA -2769485824,2769616895,US -2769616896,2769682431,SG -2769682432,2769747967,US -2769747968,2769813503,CA -2769813504,2769879039,US -2769879040,2769944575,ZA -2769944576,2770272255,US -2770272256,2770337791,AU -2770337792,2770993151,US -2770993152,2771124223,IN -2771124224,2771451903,US -2771451904,2771517439,ZA -2771517440,2771648511,TN -2771648512,2771910655,US -2771910656,2772434943,ZM -2772434944,2772762623,US -2772762624,2772828159,AU -2772828160,2772959231,US -2772959232,2773024767,CZ -2773024768,2773058559,ZA -2773058560,2773059583,SZ -2773059584,2773061631,ZA -2773061632,2773065727,CM -2773065728,2773073919,ZA -2773073920,2773082111,NG -2773082112,2773085183,ZA -2773085184,2773086207,SL -2773086208,2773090303,ZA -2773090304,2773221375,US -2773221376,2773286911,JP -2773286912,2773745663,US -2773745664,2773778431,NZ -2773778432,2773794815,HK -2773794816,2773798911,IN -2773798912,2773803007,US -2773803008,2773803263,GB -2773803264,2773804031,US -2773804032,2773804287,GB -2773804288,2773804799,US -2773804800,2773805055,GB -2773805056,2773807103,JP -2773807104,2773811199,IN -2773811200,2773876735,US -2773876736,2773942271,AU -2773942272,2774138879,US -2774138880,2774142719,KE -2774142720,2774143231,UG -2774143232,2774147071,KE -2774147072,2774155263,ZA -2774155264,2774163455,MZ -2774163456,2774171647,CV -2774171648,2774188031,RE -2774188032,2774192127,ZA -2774192128,2774196223,ML -2774196224,2774200319,ZA -2774200320,2774204415,NG -2774204416,2774335487,US -2774335488,2774401023,JP -2774401024,2774532095,US -2774532096,2774597631,JP -2774597632,2774663167,US -2774663168,2774728703,NI -2774794240,2774990847,JP -2774990848,2775318527,US -2775318528,2775384063,JP -2775384064,2775711743,US -2775711744,2775777279,NL -2775777280,2775842815,CA -2775842816,2775973887,US -2775973888,2776039423,AU -2776039424,2776104959,US -2776104960,2776170495,GB -2776170496,2776478975,US -2776478976,2776479231,AU -2776479232,2776891391,US -2776891392,2777022463,KR -2777022464,2777481215,US -2777481216,2777546751,KR -2777546752,2777612287,AU -2777612288,2778071039,ZA -2778071040,2778333183,US -2778333184,2778398719,CA -2778398720,2779054079,US -2779054080,2779119615,ZA -2779119616,2779316223,US -2779316224,2779381759,RE -2779381760,2779906047,US -2779906048,2779971583,CA -2779971584,2780037119,US -2780037120,2780039167,ZA -2780039168,2780043263,US -2780043264,2780073471,ZA -2780073472,2780073727,AU -2780073728,2780075007,ZA -2780075008,2780075519,US -2780075520,2780082175,ZA -2780082176,2780083455,CA -2780083456,2780083967,ZA -2780083968,2780084223,CA -2780084224,2780102655,ZA -2780102656,2780168191,US -2780168192,2780299263,CL -2780299264,2780364799,US -2780364800,2780430335,CA -2780430336,2780495871,KR -2780495872,2780561407,AU -2780561408,2780758015,US -2780758016,2780823551,AU -2780823552,2780925951,US -2780925952,2780926207,GB -2780926208,2780926975,US -2780926976,2780927487,GB -2780927488,2780927743,US -2780927744,2780927999,GB -2780928000,2780929023,US -2780929024,2780929279,GB -2780929280,2780929791,FR -2780929792,2780930047,US -2780930048,2780930559,GB -2780930560,2780931071,US -2780931072,2780932095,GB -2780932096,2780932607,US -2780932608,2780933119,GB -2780933120,2780933375,US -2780933376,2780933631,GB -2780933632,2780933887,US -2780933888,2780934143,GB -2780934144,2780934911,US -2780934912,2780935167,GB -2780935168,2780954623,US -2780954624,2781020159,KR -2781020160,2781206527,US -2781206528,2781207551,GB -2781207552,2781208575,DE -2781208576,2781478911,US -2781478912,2781544447,HK -2781544448,2781614591,US -2781614592,2781615103,MX -2781615104,2781623807,US -2781623808,2781624319,CA -2781624320,2781626367,US -2781626368,2781626879,NL -2781626880,2781627391,IT -2781627392,2781628415,US -2781628416,2781628927,DE -2781628928,2781630463,US -2781630464,2781631487,MY -2781631488,2781635583,US -2781635584,2781636095,JP -2781636096,2781643775,US -2781643776,2781644287,KR -2781644288,2781644799,TW -2781644800,2781645823,IN -2781645824,2781646335,SG -2781646336,2781675519,US -2781675520,2781741055,NZ -2781741056,2781937663,US -2781937664,2782003199,TH -2782003200,2782134271,CM -2782134272,2782199807,US -2782199808,2782265343,KR -2782265344,2782372863,US -2782372864,2782373887,GB -2782373888,2782658559,US -2782658560,2782724095,PH -2782724096,2782789631,US -2782789632,2782855167,CH -2782855168,2782990335,US -2782990336,2782990847,GB -2782990848,2782995455,US -2782995456,2782995519,CA -2782995520,2782995527,US -2782995528,2782995531,CA -2782995532,2782995535,US -2782995536,2782995587,CA -2782995588,2783002623,US -2783002624,2783002879,DK -2783002880,2783003135,US -2783003136,2783003647,RU -2783003648,2783003903,SE -2783003904,2783004159,US -2783004160,2783004671,CH -2783004672,2783004927,US -2783004928,2783005695,DE -2783005696,2783005951,FR -2783005952,2783006719,US -2783006720,2783007487,GB -2783007488,2783007743,US -2783007744,2783008255,PL -2783008256,2783008767,IT -2783008768,2783009279,BE -2783009280,2783010889,US -2783010890,2783010890,HK -2783010891,2783010943,US -2783010944,2783011071,HK -2783011072,2783011327,US -2783011328,2783011839,AU -2783011840,2783012351,JP -2783012352,2783012607,TW -2783012608,2783012863,US -2783012864,2783013887,IN -2783013888,2783125729,US -2783125730,2783125730,CA -2783125731,2783126051,US -2783126052,2783126052,CA -2783126053,2783126581,US -2783126582,2783126582,CA -2783126583,2783126603,US -2783126604,2783126604,CA -2783126605,2783126647,US -2783126648,2783126648,CA -2783126649,2783126649,US -2783126650,2783126650,CA -2783126651,2783126682,US -2783126683,2783126683,CA -2783126684,2783126684,US -2783126685,2783126685,CA -2783126686,2783126692,US -2783126693,2783126693,CA -2783126694,2783126701,US -2783126702,2783126702,CA -2783126703,2783126760,US -2783126761,2783126761,CA -2783126762,2783126771,US -2783126772,2783126772,CA -2783126773,2783127050,US -2783127051,2783127051,CA -2783127052,2783127578,US -2783127579,2783127579,CA -2783127580,2783128073,US -2783128074,2783128074,CA -2783128075,2783128142,US -2783128143,2783128143,CA -2783128144,2783128616,US -2783128617,2783128617,CA -2783128618,2783128622,US -2783128623,2783128623,CA -2783128624,2783128647,US -2783128648,2783128648,CA -2783128649,2783128728,US -2783128729,2783128729,CA -2783128730,2783150079,US -2783150080,2783158271,DE -2783158272,2783158802,US -2783158803,2783158803,DE -2783158804,2783159015,US -2783159016,2783159016,DE -2783159017,2783160412,US -2783160413,2783160413,DE -2783160414,2783162286,US -2783162287,2783162287,DE -2783162288,2783182847,US -2783182848,2783248383,AU -2783248384,2783313919,KR -2783313920,2783379455,US -2783379456,2783380991,SC -2783380992,2783381503,NZ -2783381504,2783383551,SC -2783383552,2783387647,CA -2783387648,2783391743,GB -2783391744,2783395839,US -2783395840,2783399935,DE -2783399936,2783404031,FR -2783404032,2783408127,NL -2783408128,2783412223,NO -2783412224,2783416319,SE -2783416320,2783420415,RU -2783420416,2783424511,EE -2783424512,2783428607,JP -2783428608,2783436799,US -2783436800,2783440895,IT -2783440896,2783444991,IN -2783444992,2783510527,US -2783510528,2783576063,ZA -2783576064,2783969279,US -2783969280,2784034815,AU -2784034816,2784165887,JP -2784165888,2784296959,KR -2784296960,2784362495,US -2784362496,2784428031,KR -2784428032,2784952063,US -2784952064,2784952319,NL -2784952320,2785017855,ZA -2785017856,2785804287,US -2785804288,2786066431,CH -2786066432,2788163583,US -2788163584,2788229119,CA -2788229120,2788261887,US -2788261888,2788294655,GB -2788294656,2789113855,US -2789113856,2789146623,CA -2789146624,2789212159,US -2789212160,2789277695,AU -2789277696,2789343231,NZ -2789343232,2789933055,US -2789933056,2789998591,CL -2789998592,2790195199,US -2790195200,2790260735,KR -2790260736,2790326271,US -2790326272,2790391807,HK -2790391808,2790457343,US -2790457344,2790522879,NZ -2790522880,2790588415,US -2790588416,2790653951,ZA -2790653952,2790719487,US -2790719488,2790785023,SA -2790785024,2790816511,US -2790816512,2790816767,DE -2790816768,2790834431,US -2790834432,2790834687,CH -2790834688,2791571455,US -2791571456,2791636991,JP -2791636992,2791768063,US -2791768064,2791899135,KR -2791899136,2791964671,US -2792030208,2792226815,US -2792226816,2792292351,CL -2792292352,2792357887,CN -2792357888,2792488959,US -2792488960,2792554495,BO -2792554496,2792751103,US -2792751104,2792882175,JP -2792882176,2792947711,AU -2792947712,2793013247,SG -2793013248,2793209855,US -2793209856,2793275391,KR -2793275392,2796806911,US -2796806912,2796807167,NZ -2796807168,2796807935,US -2796807936,2796808191,NZ -2796808192,2798838015,US -2798838016,2798838271,CO -2798838272,2801795071,US -2801795072,2801860607,CO -2801860608,2802515967,US -2802515968,2802581503,CA -2802581504,2802909183,US -2802909184,2802974719,CA -2802974720,2803630079,US -2803630080,2803695615,CL -2803695616,2803761151,US -2803761152,2803826687,AU -2803826688,2803892223,US -2803892224,2805465087,CA -2805465088,2805989375,UY -2805989376,2806012937,US -2806012938,2806012938,HK -2806012939,2806644735,US -2806644736,2806710271,CA -2806710272,2807103487,US -2807103488,2807169023,NL -2807169024,2807271679,US -2807271680,2807271935,AU -2807271936,2807496703,US -2807496704,2807562239,DE -2807562240,2807566335,US -2807566336,2807574527,CA -2807578624,2807587071,US -2807587072,2807587327,IT -2807587328,2807587583,QA -2807587584,2807587839,IN -2807587840,2807588095,AE -2807588096,2807588223,US -2807588224,2807588351,ES -2807588352,2807588863,CN -2807588864,2807589119,JP -2807589120,2807589375,RO -2807589376,2807589631,FR -2807589632,2807589887,PT -2807589888,2807590143,AT -2807590144,2807590399,MT -2807590400,2807590655,GR -2807590656,2807590911,SA -2807590912,2807595007,US -2807595008,2807599103,CA -2807599104,2807607295,US -2807607296,2807611391,CA -2807611392,2807824383,US -2807824384,2807889919,CA -2807889920,2808217599,US -2808217600,2808283135,GB -2808283136,2808545279,US -2808545280,2808610815,AU -2808610816,2808872959,US -2808872960,2808938495,UY -2808938496,2809069567,US -2809069568,2809135103,SA -2809135104,2809266175,US -2809266176,2809269025,CA -2809269026,2809269026,US -2809269027,2809274367,CA -2809274368,2809274623,US -2809274624,2809276083,CA -2809276084,2809276087,US -2809276088,2809277375,CA -2809277376,2809277407,FR -2809277408,2809281575,CA -2809281576,2809281583,US -2809281584,2809282652,CA -2809282653,2809282653,US -2809282654,2809286975,CA -2809286976,2809286991,US -2809286992,2809287979,CA -2809287980,2809287983,US -2809287984,2809291732,CA -2809291733,2809291733,US -2809291734,2809291823,CA -2809291824,2809291824,US -2809291825,2809291891,CA -2809291892,2809291892,US -2809291893,2809297711,CA -2809297712,2809297712,US -2809297713,2809297845,CA -2809297846,2809297846,US -2809297847,2809302815,CA -2809302816,2809302831,US -2809302832,2809308599,CA -2809308600,2809308607,US -2809308608,2809316607,CA -2809316608,2809316623,US -2809316624,2809321007,CA -2809321008,2809321015,US -2809321016,2809323519,CA -2809323520,2809327569,FR -2809327570,2809327570,RU -2809327571,2809331711,FR -2809331712,2809397247,US -2809397248,2809462783,UY -2809462784,2809855999,US -2809856000,2809921535,AU -2809921536,2809987071,US -2809987072,2810052607,CA -2810052608,2810249215,US -2810249216,2810314751,CA -2810314752,2810380287,AU -2810380288,2810576895,US -2810576896,2810642431,VE -2810642432,2810904575,US -2810904576,2810970111,CN -2810970112,2811428863,US -2811428864,2811494399,CA -2811494400,2811559935,US -2811559936,2811625471,CH -2811625472,2812084223,US -2812084224,2812149759,BO -2812149760,2812280831,US -2812280832,2812283391,NL -2812283392,2812283647,US -2812283648,2812283903,NL -2812283904,2812284159,US -2812284160,2812285695,NL -2812285696,2812285951,US -2812285952,2812286207,NL -2812286208,2812286463,US -2812286464,2812288511,NL -2812288512,2812291071,US -2812291072,2812292095,DE -2812292096,2812293119,US -2812293120,2812295167,IN -2812295168,2812297215,GB -2812297216,2812311295,US -2812311296,2812311551,RO -2812311552,2812411903,US -2812411904,2812477439,AU -2812477440,2812805119,US -2812805120,2812870655,CH -2812870656,2812936191,JP -2812936192,2813067263,US -2813067264,2813132799,GB -2813132800,2813263871,US -2813263872,2813329407,JP -2813329408,2813526015,US -2813526016,2813591551,NZ -2813591552,2814181375,US -2814181376,2814246911,CN -2814246912,2815082495,US -2815082496,2815090687,NL -2815090688,2815098879,US -2815098880,2815164415,GB -2815164416,2815229951,US -2815229952,2815295487,ID -2815295488,2815986943,US -2815986944,2815987199,GB -2815987200,2815988383,US -2815988384,2815988415,GB -2815988416,2815988863,US -2815988864,2815988895,GB -2815988896,2816159743,US -2816159744,2816163839,IN -2816163840,2816246783,US -2816246784,2816247807,IL -2816247808,2816262143,US -2816262144,2816263167,IE -2816263168,2816264191,GB -2816264192,2816264447,IE -2816264448,2816264703,GB -2816264704,2816264959,US -2816264960,2816264983,IE -2816264984,2816270335,US -2816270336,2816271615,SG -2816271616,2816271871,JP -2816271872,2816272127,IN -2816272128,2816272383,AU -2816272384,2816272415,JP -2816272416,2816272543,SG -2816272544,2816273407,JP -2816273408,2816274431,IN -2816274432,2816275455,AU -2816275456,2816276479,CN -2816276480,2816278527,SG -2816278528,2816671743,US -2816671744,2816737279,CA -2816737280,2817064959,US -2817064960,2817130495,DE -2817130496,2817277951,US -2817277952,2817294335,NL -2817294336,2817933055,US -2817933056,2817933311,CA -2817933312,2818002943,US -2818002944,2818003722,GB -2818003723,2818003723,US -2818003724,2818004991,GB -2818004992,2818113535,US -2818113536,2818115583,BR -2818115584,2818116607,PE -2818116608,2818118655,BR -2818118656,2818119679,SV -2818119680,2818121727,BR -2818121728,2818122751,VE -2818122752,2818123775,BR -2818123776,2818124799,CO -2818124800,2818125823,AR -2818125824,2818126847,BR -2818126848,2818127871,AR -2818127872,2818143231,BR -2818143232,2818144255,MX -2818144256,2818162687,BR -2818162688,2818164735,AR -2818164736,2818165759,BZ -2818165760,2818168831,BR -2818168832,2818169855,AR -2818169856,2818178047,BR -2818178048,2818179071,MX -2818179072,2818180095,BR -2818180096,2818181119,AR -2818181120,2818188287,BR -2818188288,2818189311,PY -2818189312,2818191359,BR -2818191360,2818192383,VE -2818192384,2818193407,CL -2818193408,2818198527,BR -2818198528,2818199551,MX -2818199552,2818206719,BR -2818206720,2818207743,HN -2818207744,2818208767,PA -2818208768,2818209791,AR -2818209792,2818210815,CO -2818210816,2818212863,BR -2818212864,2818213887,CL -2818213888,2818222079,BR -2818222080,2818223103,AR -2818223104,2818225151,BR -2818225152,2818226175,EC -2818226176,2818228223,BR -2818228224,2818229247,CR -2818229248,2818231295,BR -2818231296,2818232319,PE -2818232320,2818233343,AR -2818233344,2818233911,HN -2818233912,2818233919,IT -2818233920,2818234095,HN -2818234096,2818234111,IT -2818234112,2818234367,HN -2818234368,2818235391,BR -2818235392,2818236415,GT -2818236416,2818244607,BR -2818244608,2818310143,US -2818310144,2818375679,AR -2818375680,2818572287,US -2818572288,2818575359,BR -2818575360,2818576383,PE -2818576384,2818586623,BR -2818586624,2818587647,AR -2818587648,2818593791,BR -2818593792,2818594815,SX -2818594816,2818619391,BR -2818619392,2818620415,AR -2818620416,2818623487,BR -2818623488,2818625535,AR -2818625536,2818626559,BR -2818626560,2818626783,HN -2818626784,2818626799,BR -2818626800,2818627583,HN -2818627584,2818628607,BR -2818628608,2818629631,MX -2818629632,2818634751,BR -2818634752,2818635775,CO -2818635776,2818637823,BR -2818637824,2818670591,AU -2818670592,2818670633,US -2818670634,2818670639,AU -2818670640,2818670881,US -2818670882,2818670887,AU -2818670888,2818671423,US -2818671424,2818671439,AU -2818671440,2818671999,US -2818672000,2818672127,AU -2818672128,2818672191,US -2818672192,2818672207,AU -2818672208,2818687299,US -2818687300,2818687303,JP -2818687304,2818687952,US -2818687953,2818687959,AU -2818687960,2818688903,US -2818688904,2818688927,NL -2818688928,2818689479,US -2818689480,2818689487,AU -2818689488,2821932367,US -2821932368,2821932371,NO -2821932372,2822584319,US -2822584320,2822586367,NL -2822586368,2822590463,US -2822590464,2822591629,IE -2822591630,2822591630,US -2822591631,2822602751,IE -2822602752,2822701055,US -2822701056,2822709247,NL -2822709248,2822723583,IE -2822723584,2822724095,US -2822724096,2822724415,SG -2822724416,2822724607,US -2822724608,2822725631,IE -2822725632,2822731894,NL -2822731895,2822731895,GB -2822731896,2822732102,NL -2822732103,2822732103,IE -2822732104,2822733823,NL -2822733824,2822742015,HK -2822742016,2822750207,SG -2822750208,2822758399,HK -2822758400,2822766591,SG -2822766592,2823159807,US -2823159808,2823225343,HK -2823225344,2823553023,US -2823553024,2823618559,ZA -2823618560,2823684095,PA -2823684096,2823749631,KR -2823815168,2823888895,SC -2823888896,2823897087,ZA -2823897088,2823946239,SC -2823946240,2824011775,US -2824011776,2824077311,AR -2824077312,2824404991,US -2824404992,2824470527,ZA -2824470528,2824472575,BR -2824472576,2824473599,AR -2824473600,2824474623,CO -2824474624,2824487935,BR -2824487936,2824488959,MX -2824488960,2824489983,AR -2824489984,2824492031,BR -2824492032,2824493055,AR -2824493056,2824494079,BR -2824494080,2824495103,CO -2824495104,2824495215,HN -2824495216,2824495231,DE -2824495232,2824495263,HN -2824495264,2824495279,DE -2824495280,2824495943,HN -2824495944,2824495951,NL -2824495952,2824496087,HN -2824496088,2824496095,NL -2824496096,2824496127,HN -2824496128,2824498175,BR -2824498176,2824498303,HN -2824498304,2824498319,FR -2824498320,2824498527,HN -2824498528,2824498535,FR -2824498536,2824498895,HN -2824498896,2824498903,UY -2824498904,2824499119,HN -2824499120,2824499127,UY -2824499128,2824499199,HN -2824499200,2824503295,BR -2824503296,2824504319,AR -2824504320,2824510463,BR -2824510464,2824511487,CL -2824511488,2824512511,AR -2824512512,2824515583,BR -2824515584,2824516607,PY -2824516608,2824520703,BR -2824520704,2824521727,HN -2824521728,2824526847,BR -2824526848,2824527871,CL -2824527872,2824529919,BR -2824529920,2824530943,CL -2824530944,2824532991,BR -2824532992,2824533247,DK -2824533248,2824533503,BR -2824533504,2824533631,SE -2824533632,2824533759,NO -2824533760,2824534015,US -2824534016,2824535039,BR -2824535040,2824536063,AR -2824536064,2824798207,US -2824798208,2824863743,TW -2824863744,2824929279,AR -2824929280,2825191423,US -2825191424,2825256959,AR -2825256960,2825519103,US -2825519104,2825584639,HK -2825584640,2826108927,US -2826108928,2826174463,KR -2826174464,2826436607,US -2826436608,2826502143,TH -2826502144,2826510335,BR -2826510336,2826512383,AR -2826512384,2826513407,BR -2826513408,2826515455,PE -2826515456,2826516479,BR -2826516480,2826517503,AR -2826517504,2826518527,MX -2826518528,2826522623,BR -2826522624,2826523647,CL -2826523648,2826524671,SR -2826524672,2826531839,BR -2826531840,2826532863,AR -2826532864,2826534911,BR -2826534912,2826535935,PA -2826535936,2826549247,BR -2826549248,2826550271,UY -2826550272,2826555391,BR -2826555392,2826557439,AR -2826557440,2826558463,BR -2826558464,2826559487,PE -2826559488,2826562559,BR -2826562560,2826563583,PE -2826563584,2826565631,MX -2826565632,2826567679,BR -2826567680,2826633215,US -2826633216,2826698751,GU -2826698752,2826829823,US -2826829824,2826895359,KR -2826895360,2826962943,US -2826962944,2826964991,DE -2826964992,2826969087,US -2826969088,2826971135,AU -2826971136,2826973183,NL -2826973184,2826975231,AU -2826975232,2826977791,ZA -2826977792,2826978047,NL -2826978048,2826985471,ZA -2826985472,2826987519,NZ -2826987520,2826989567,GB -2826989568,2826991615,ZA -2826991616,2826993663,CA -2826993664,2827024895,ZA -2827024896,2827025407,US -2827025408,2827026431,ZA -2827026432,2827091967,US -2827091968,2827157503,AU -2827157504,2827223039,KR -2827223040,2827288575,AU -2827288576,2827354111,US -2827354112,2827419647,AU -2827419648,2827681791,US -2827681792,2827747327,TR -2827747328,2827812863,AU -2827812864,2827878399,US -2827878400,2827943935,ZA -2827943936,2828009471,US -2828009472,2828075007,CA -2828075008,2828533759,US -2828533760,2828599551,AU -2828599552,2828599807,IN -2828599808,2828626687,AU -2828626688,2828627711,US -2828627712,2828627967,AU -2828627968,2828628223,PH -2828628224,2828664831,AU -2828664832,2828730367,KR -2828730368,2828795903,ZA -2828795904,2829029375,US -2829029376,2829029631,CN -2829029632,2829041663,US -2829041664,2829045759,AU -2829045760,2829058047,US -2829058048,2829123583,CN -2829123584,2829148415,US -2829148416,2829148671,HK -2829148672,2829174783,US -2829174784,2829175807,GB -2829175808,2829184767,US -2829184768,2829185023,GB -2829185024,2829254655,US -2829254656,2829320191,CH -2829320192,2829385727,ZA -2829385728,2829451263,MX -2829451264,2829516799,US -2829516800,2829582335,BW -2829582336,2829593343,US -2829593344,2829593591,CH -2829593592,2829593595,US -2829593596,2829593599,CH -2829593600,2829844479,US -2829844480,2829910015,ZA -2829910016,2830106623,US -2830106624,2830172159,CO -2830172160,2830434303,US -2830434304,2830436351,BR -2830436352,2830437375,PE -2830437376,2830440447,BR -2830440448,2830441471,AR -2830441472,2830445567,BR -2830445568,2830446591,AR -2830446592,2830447615,BR -2830447616,2830447647,HN -2830447648,2830447655,US -2830447656,2830448639,HN -2830448640,2830452735,BR -2830452736,2830453759,AR -2830453760,2830454783,MX -2830454784,2830457855,BR -2830457856,2830458879,MX -2830458880,2830459903,BR -2830459904,2830460927,MX -2830460928,2830465023,BR -2830465024,2830466047,HN -2830466048,2830475263,BR -2830475264,2830476287,CR -2830476288,2830479359,BR -2830479360,2830480383,AR -2830480384,2830481407,BR -2830481408,2830482431,AR -2830482432,2830486527,BR -2830486528,2830488575,AR -2830488576,2830492671,BR -2830492672,2830492799,HN -2830492800,2830492815,UY -2830492816,2830492895,HN -2830492896,2830492927,UY -2830492928,2830492935,US -2830492936,2830493695,HN -2830493696,2830499839,BR -2830499840,2830761983,US -2830761984,2830827519,AU -2830827520,2830893055,KW -2830893056,2830958591,KR -2830958592,2831155575,US -2831155576,2831155576,SG -2831155577,2831286271,US -2831286272,2831287295,MX -2831287296,2831294463,BR -2831294464,2831295487,AR -2831295488,2831299583,BR -2831299584,2831300607,AR -2831300608,2831304703,BR -2831304704,2831305727,GT -2831305728,2831308799,BR -2831308800,2831309823,MX -2831309824,2831311871,BR -2831311872,2831312895,PE -2831312896,2831313919,BR -2831313920,2831314943,VE -2831314944,2831322111,BR -2831322112,2831323135,AR -2831323136,2831324159,BR -2831324160,2831325183,EC -2831325184,2831329279,BR -2831329280,2831330303,CL -2831330304,2831332351,BR -2831332352,2831333375,AR -2831333376,2831336447,BR -2831336448,2831337471,CL -2831337472,2831338495,BR -2831338496,2831339519,AR -2831339520,2831341567,BR -2831341568,2831342591,AR -2831342592,2831345663,BR -2831345664,2831346687,AR -2831346688,2831347711,BR -2831347712,2831348735,PY -2831348736,2831361023,BR -2831361024,2831362047,AR -2831362048,2831365119,BR -2831365120,2831367167,AR -2831367168,2831368191,CL -2831368192,2831371263,BR -2831371264,2831371999,BZ -2831372000,2831372015,GB -2831372016,2831372287,BZ -2831372288,2831379455,BR -2831379456,2831380479,AR -2831380480,2831381503,BR -2831381504,2831382527,AR -2831382528,2831383551,TT -2831383552,2831384575,CR -2831384576,2831385599,CL -2831385600,2831398911,BR -2831398912,2831399935,AR -2831399936,2831403007,BR -2831403008,2831405055,MX -2831405056,2831407103,BR -2831407104,2831408127,SR -2831408128,2831409151,BR -2831409152,2831410175,PY -2831410176,2831417343,BR -2831417344,2831418367,AR -2831418368,2831423487,BR -2831423488,2831424511,AR -2831424512,2831425535,BR -2831425536,2831426559,AR -2831426560,2831446015,BR -2831446016,2831447039,AR -2831447040,2831449087,BR -2831449088,2831450111,DO -2831450112,2831453183,BR -2831453184,2831454207,AR -2831454208,2831457279,BR -2831457280,2831458303,AR -2831458304,2831464447,BR -2831464448,2831465471,CL -2831465472,2831468543,BR -2831468544,2831469567,CL -2831469568,2831474687,BR -2831474688,2831475711,AR -2831475712,2831476735,CL -2831476736,2831477759,BR -2831477760,2831478167,HN -2831478168,2831478175,US -2831478176,2831479807,HN -2831479808,2831480831,AR -2831480832,2831481855,BR -2831481856,2831482879,AR -2831482880,2831493119,BR -2831493120,2831494143,MX -2831494144,2831496191,AR -2831496192,2831500287,BR -2831500288,2831501311,CO -2831501312,2831505407,BR -2831505408,2831506431,CL -2831506432,2831507455,BR -2831507456,2831508479,CR -2831508480,2831509503,HT -2831509504,2831510527,BR -2831510528,2831511551,SX -2831511552,2831513599,BR -2831513600,2831515647,MX -2831515648,2831516671,BR -2831516672,2831517695,CR -2831517696,2831524863,BR -2831524864,2831525887,AR -2831525888,2831526911,BR -2831526912,2831527935,HN -2831527936,2831528959,BR -2831528960,2831529983,CL -2831529984,2831531007,BR -2831531008,2831531135,EC -2831531136,2831531263,GT -2831531264,2831531519,EC -2831531520,2831531775,PA -2831531776,2831532031,EC -2831532032,2831533055,BR -2831533056,2831535103,AR -2831535104,2831536127,BR -2831536128,2831537151,BZ -2831537152,2831538175,BR -2831538176,2831539199,AR -2831539200,2831544319,BR -2831544320,2831545343,BO -2831545344,2831546367,BR -2831546368,2831547391,AR -2831547392,2831548415,BR -2831548416,2831613951,AU -2831613952,2831810559,US -2831810560,2831876095,IT -2831876096,2832007167,US -2832007168,2832008191,AR -2832008192,2832009215,BR -2832009216,2832010239,PA -2832010240,2832023551,BR -2832023552,2832024575,CR -2832024576,2832025599,BR -2832025600,2832025903,HN -2832025904,2832025919,DE -2832025920,2832026015,HN -2832026016,2832026031,DE -2832026032,2832026623,HN -2832026624,2832030719,BR -2832030720,2832031743,AR -2832031744,2832032767,BO -2832032768,2832036863,BR -2832036864,2832038911,AR -2832038912,2832040959,BR -2832040960,2832041983,PE -2832041984,2832048127,BR -2832048128,2832049151,HN -2832049152,2832054271,BR -2832054272,2832055295,AR -2832055296,2832059391,BR -2832059392,2832060415,CL -2832060416,2832072703,BR -2832072704,2832138239,ZA -2832138240,2832269311,US -2832269312,2832400383,ZA -2832400384,2832793599,US -2832793600,2832859135,AU -2832859136,2832924671,US -2832924672,2832990207,KR -2832990208,2833383423,US -2833383424,2833448959,AR -2833448960,2833449983,CO -2833449984,2833451007,AR -2833451008,2833454079,BR -2833454080,2833455103,SV -2833455104,2833456127,AR -2833456128,2833458175,BR -2833458176,2833459199,MX -2833459200,2833466367,BR -2833466368,2833467391,MX -2833467392,2833473535,BR -2833473536,2833474559,AR -2833474560,2833475583,BR -2833475584,2833476607,CO -2833476608,2833481727,BR -2833481728,2833482679,HN -2833482680,2833482687,CL -2833482688,2833482751,HN -2833482752,2833484799,BR -2833484800,2833485519,US -2833485520,2833485527,BE -2833485528,2833485823,US -2833485824,2833486847,AR -2833486848,2833501183,BR -2833501184,2833502207,AR -2833502208,2833511423,BR -2833511424,2833512447,CO -2833512448,2833513471,BR -2833513472,2833514495,AR -2833514496,2833525759,BR -2833525760,2833526639,HN -2833526640,2833526655,FR -2833526656,2833526783,HN -2833526784,2833527807,CR -2833527808,2833528831,MX -2833528832,2833529855,AR -2833529856,2833542143,BR -2833542144,2833543167,CO -2833543168,2833546239,BR -2833546240,2833547263,CO -2833547264,2833548287,BR -2833548288,2833549311,BO -2833549312,2833550335,BR -2833550336,2833552383,AR -2833552384,2833563647,BR -2833563648,2833564671,HN -2833564672,2833571839,BR -2833571840,2833572863,AR -2833572864,2833573887,BR -2833573888,2833574911,DO -2833574912,2833577983,BR -2833577984,2833579007,CL -2833579008,2833580031,BR -2833580032,2833707007,US -2833707008,2833707263,GB -2833707264,2833711103,US -2833711104,2833776639,CL -2833776640,2833783807,BR -2833783808,2833784831,CR -2833784832,2833785855,CL -2833785856,2833786879,SV -2833786880,2833788927,BR -2833788928,2833789951,SV -2833789952,2833796095,BR -2833796096,2833797119,GT -2833797120,2833799167,BR -2833799168,2833800191,AR -2833800192,2833801215,BR -2833801216,2833804287,AR -2833804288,2833805311,DO -2833805312,2833812479,BR -2833812480,2833813503,AR -2833813504,2833814527,GY -2833814528,2833818623,BR -2833818624,2833819647,CL -2833819648,2833820671,HN -2833820672,2833840127,BR -2833840128,2833841151,AR -2833841152,2833842175,BR -2833842176,2833907711,US -2833907712,2833973247,GT -2833973248,2833992901,US -2833992902,2833992902,MX -2833992903,2834010111,US -2834010112,2834014207,CA -2834014208,2834030591,US -2834030592,2834034687,CA -2834034688,2834497535,US -2834497536,2834563071,SV -2834563072,2834661887,US -2834661888,2834662399,CA -2834662400,2834668799,US -2834668800,2834669055,CA -2834669056,2834676735,US -2834676736,2834677759,SG -2834677760,2834678783,US -2834678784,2834679295,ES -2834679296,2834679807,CA -2834679808,2834681599,US -2834681600,2834681855,CA -2834681856,2834689535,US -2834689536,2834694143,CA -2834694144,2834825215,US -2834825216,2834956287,KR -2834956288,2835087359,US -2835087360,2835152895,AU -2835152896,2835161087,LR -2835161088,2835169279,ZW -2835169280,2835177471,ZA -2835177472,2835181567,DZ -2835181568,2835183615,NG -2835183616,2835185663,ZA -2835185664,2835196927,RE -2835196928,2835197695,YT -2835197696,2835202047,RE -2835202048,2835206143,ZA -2835206144,2835208191,NG -2835208192,2835210239,ZA -2835210240,2835218431,MW -2835218432,2835283967,US -2835283968,2835349503,MX -2835349504,2835415445,ZA -2835415446,2835415446,US -2835415447,2835480575,ZA -2835480576,2837446655,US -2837446656,2837839871,CH -2837839872,2837856255,US -2837856256,2837872639,IN -2837872640,2837905407,US -2837905408,2837970943,CH -2837970944,2838036479,US -2838036480,2838233087,CH -2838233088,2838237183,GB -2838237184,2838255167,US -2838255168,2838255199,JP -2838255200,2838260095,US -2838260096,2838260127,IE -2838260128,2838261759,US -2838261760,2838265855,GB -2838265856,2838276159,US -2838276160,2838276191,NL -2838276192,2838284303,US -2838284304,2838284319,IL -2838284320,2838298623,US -2838298624,2838298655,NL -2838298656,2838298687,US -2838298688,2838299439,NL -2838299440,2838299455,US -2838299456,2838299695,NL -2838299696,2838299775,US -2838299776,2838300335,NL -2838300336,2838300351,US -2838300352,2838300511,NL -2838300512,2838300543,US -2838300544,2838300671,NL -2838300672,2838300927,US -2838300928,2838301119,NL -2838301120,2838301183,US -2838301184,2838301191,NL -2838301192,2838301199,US -2838301200,2838301695,NL -2838301696,2838301951,US -2838301952,2838304127,NL -2838304128,2838304159,US -2838304160,2838304319,NL -2838304320,2838304383,US -2838304384,2838304479,NL -2838304480,2838304511,US -2838304512,2838304703,NL -2838304704,2838304767,US -2838304768,2838305119,NL -2838305120,2838305151,US -2838305152,2838305247,NL -2838305248,2838305279,US -2838305280,2838305647,NL -2838305648,2838305727,US -2838305728,2838307295,NL -2838307296,2838307303,US -2838307304,2838307311,NL -2838307312,2838307327,US -2838307328,2838307647,NL -2838307648,2838307679,US -2838307680,2838307903,NL -2838307904,2838307935,US -2838307936,2838308175,NL -2838308176,2838308183,US -2838308184,2838308191,NL -2838308192,2838308223,US -2838308224,2838308255,NL -2838308256,2838308271,US -2838308272,2838315007,NL -2838315008,2838331391,US -2838331392,2838331535,NL -2838331536,2838331551,US -2838331552,2838331567,NL -2838331568,2838331583,US -2838331584,2838331711,NL -2838331712,2838331727,US -2838331728,2838332879,NL -2838332880,2838332895,US -2838332896,2838333651,NL -2838333652,2838333654,US -2838333655,2838333655,NL -2838333656,2838333658,US -2838333659,2838333659,NL -2838333660,2838333661,US -2838333662,2838333903,NL -2838333904,2838333919,US -2838333920,2838334335,NL -2838334336,2838334351,US -2838334352,2838337279,NL -2838337280,2838337295,US -2838337296,2838337759,NL -2838337760,2838337761,IN -2838337762,2838337763,US -2838337764,2838338111,NL -2838338112,2838338127,US -2838338128,2838338271,NL -2838338272,2838338303,JP -2838338304,2838338567,NL -2838338568,2838338575,US -2838338576,2838338703,NL -2838338704,2838338719,IN -2838338720,2838338771,NL -2838338772,2838338773,IN -2838338774,2838338783,US -2838338784,2838338815,NL -2838338816,2838338823,US -2838338824,2838339743,NL -2838339744,2838339759,US -2838339760,2838339855,NL -2838339856,2838339871,US -2838339872,2838340015,NL -2838340016,2838340031,US -2838340032,2838340351,NL -2838340352,2838340383,US -2838340384,2838340431,NL -2838340432,2838340463,US -2838340464,2838340719,NL -2838340720,2838340735,US -2838340736,2838340959,NL -2838340960,2838340991,US -2838340992,2838341151,NL -2838341152,2838341167,US -2838341168,2838341903,NL -2838341904,2838341919,US -2838341920,2838341951,NL -2838341952,2838341967,US -2838341968,2838342303,NL -2838342304,2838342319,US -2838342320,2838342879,NL -2838342880,2838342895,US -2838342896,2838343071,NL -2838343072,2838343103,US -2838343104,2838344319,NL -2838344320,2838344335,US -2838344336,2838344451,NL -2838344452,2838344455,US -2838344456,2838344463,NL -2838344464,2838344479,US -2838344480,2838344917,NL -2838344918,2838344918,US -2838344919,2838344919,NL -2838344920,2838344927,US -2838344928,2838345215,NL -2838345216,2838345231,US -2838345232,2838345239,NL -2838345240,2838345247,US -2838345248,2838345743,NL -2838345744,2838345751,US -2838345752,2838345759,NL -2838345760,2838345775,US -2838345776,2838346559,NL -2838346560,2838346591,US -2838346592,2838346687,NL -2838346688,2838346719,US -2838346720,2838347031,NL -2838347032,2838347039,US -2838347040,2838347487,NL -2838347488,2838347519,US -2838347520,2838348031,NL -2838348032,2838396927,US -2838396928,2838397007,NL -2838397008,2838397023,US -2838397024,2838397071,NL -2838397072,2838397087,US -2838397088,2838397247,NL -2838397248,2838397279,JP -2838397280,2838397311,NL -2838397312,2838397343,US -2838397344,2838397935,NL -2838397936,2838397951,US -2838397952,2838398575,NL -2838398576,2838398591,US -2838398592,2838400191,NL -2838400192,2838400195,US -2838400196,2838400703,NL -2838400704,2838400735,US -2838400736,2838400895,NL -2838400896,2838400959,US -2838400960,2838401023,NL -2838401024,2838405119,GB -2838405120,2838405183,NL -2838405184,2838405215,US -2838405216,2838405767,NL -2838405768,2838405775,US -2838405776,2838405855,NL -2838405856,2838405887,US -2838405888,2838406087,NL -2838406088,2838406095,US -2838406096,2838406271,NL -2838406272,2838406279,US -2838406280,2838406577,NL -2838406578,2838406578,US -2838406579,2838406687,NL -2838406688,2838406703,US -2838406704,2838407103,NL -2838407104,2838407119,US -2838407120,2838407863,NL -2838407864,2838407871,US -2838407872,2838409439,NL -2838409440,2838409471,US -2838409472,2838409479,NL -2838409480,2838409503,US -2838409504,2838409599,NL -2838409600,2838409615,US -2838409616,2838409871,NL -2838409872,2838409879,US -2838409880,2838410367,NL -2838410368,2838410399,US -2838410400,2838410895,NL -2838410896,2838410911,US -2838410912,2838411327,NL -2838411328,2838411359,US -2838411360,2838414207,NL -2838414208,2838414271,US -2838414272,2838414783,NL -2838414784,2838414911,US -2838414912,2838415167,NL -2838415168,2838415183,US -2838415184,2838415391,NL -2838415392,2838415487,US -2838415488,2838415655,NL -2838415656,2838415663,US -2838415664,2838415839,NL -2838415840,2838415871,US -2838415872,2838416623,NL -2838416624,2838416639,AF -2838416640,2838417119,NL -2838417120,2838417151,US -2838417152,2838419455,NL -2838419456,2838420479,CA -2838420480,2838421503,NL -2838421504,2838421567,US -2838421568,2838422527,NL -2838422528,2838423551,CA -2838423552,2838429695,NL -2838429696,2838469631,US -2838469632,2838478975,NL -2838478976,2838479007,US -2838479008,2838479207,NL -2838479208,2838479215,US -2838479216,2838479431,NL -2838479432,2838479439,US -2838479440,2838479455,NL -2838479456,2838479487,US -2838479488,2838479807,NL -2838479808,2838479823,US -2838479824,2838480319,NL -2838480320,2838480323,IE -2838480324,2838481855,NL -2838481856,2838481887,US -2838481888,2838482305,NL -2838482306,2838482307,US -2838482308,2838482383,NL -2838482384,2838482399,US -2838482400,2838482547,NL -2838482548,2838482551,US -2838482552,2838482695,NL -2838482696,2838482703,US -2838482704,2838482959,NL -2838482960,2838482967,IE -2838482968,2838482975,US -2838482976,2838482991,NL -2838482992,2838483007,US -2838483008,2838483011,NL -2838483012,2838483015,IE -2838483016,2838483087,NL -2838483088,2838483103,US -2838483104,2838483135,NL -2838483136,2838483199,IE -2838483200,2838483327,NL -2838483328,2838483335,US -2838483336,2838483487,NL -2838483488,2838483519,US -2838483520,2838484839,NL -2838484840,2838484843,US -2838484844,2838485151,NL -2838485152,2838485183,US -2838485184,2838485695,NL -2838485696,2838485727,US -2838485728,2838486463,NL -2838486464,2838486495,US -2838486496,2838486567,NL -2838486568,2838486575,US -2838486576,2838486583,NL -2838486584,2838486591,US -2838486592,2838487327,NL -2838487328,2838487343,US -2838487344,2838487743,NL -2838487744,2838487807,US -2838487808,2838488663,NL -2838488664,2838488671,US -2838488672,2838488943,NL -2838488944,2838488959,US -2838488960,2838489999,NL -2838490000,2838490007,US -2838490008,2838491943,NL -2838491944,2838491951,US -2838491952,2838492479,NL -2838492480,2838492511,US -2838492512,2838492679,NL -2838492680,2838492687,US -2838492688,2838492959,NL -2838492960,2838492967,US -2838492968,2838493711,NL -2838493712,2838493727,US -2838493728,2838494655,NL -2838494656,2838494671,US -2838494672,2838511871,NL -2838511872,2838511903,US -2838511904,2838511935,NL -2838511936,2838511951,JP -2838511952,2838511983,NL -2838511984,2838511999,JP -2838512000,2838512047,NL -2838512048,2838512079,US -2838512080,2838512151,NL -2838512152,2838512159,US -2838512160,2838512255,NL -2838512256,2838512271,US -2838512272,2838512303,NL -2838512304,2838512319,US -2838512320,2838512351,NL -2838512352,2838512367,AF -2838512368,2838512527,NL -2838512528,2838512543,US -2838512544,2838512639,NL -2838512640,2838512675,US -2838512676,2838512703,NL -2838512704,2838512705,US -2838512706,2838512727,NL -2838512728,2838512735,US -2838512736,2838512751,NL -2838512752,2838512759,US -2838512760,2838512831,NL -2838512832,2838512847,US -2838512848,2838512879,NL -2838512880,2838512895,US -2838512896,2838513199,NL -2838513200,2838513215,US -2838513216,2838513295,NL -2838513296,2838513311,US -2838513312,2838513343,NL -2838513344,2838513347,US -2838513348,2838513487,NL -2838513488,2838513503,US -2838513504,2838513583,NL -2838513584,2838513599,US -2838513600,2838513807,NL -2838513808,2838513871,US -2838513872,2838513983,NL -2838513984,2838513999,US -2838514000,2838514071,NL -2838514072,2838514111,US -2838514112,2838514248,NL -2838514249,2838514251,US -2838514252,2838514287,NL -2838514288,2838514303,US -2838514304,2838514399,NL -2838514400,2838514431,JP -2838514432,2838514511,NL -2838514512,2838514527,US -2838514528,2838514767,NL -2838514768,2838514783,US -2838514784,2838515087,NL -2838515088,2838515103,BR -2838515104,2838515295,NL -2838515296,2838515327,US -2838515328,2838515391,NL -2838515392,2838515455,US -2838515456,2838515543,NL -2838515544,2838515551,US -2838515552,2838515647,NL -2838515648,2838515663,US -2838515664,2838519807,NL -2838519808,2838519823,US -2838519824,2838519935,NL -2838519936,2838520063,US -2838520064,2838520071,NL -2838520072,2838520079,US -2838520080,2838520805,NL -2838520806,2838520807,US -2838520808,2838520831,NL -2838520832,2838522879,US -2838522880,2838522895,NL -2838522896,2838522911,US -2838522912,2838523111,NL -2838523112,2838523119,US -2838523120,2838523391,NL -2838523392,2838523423,US -2838523424,2838523615,NL -2838523616,2838523663,US -2838523664,2838523679,NL -2838523680,2838523711,JP -2838523712,2838523967,NL -2838523968,2838524031,JP -2838524032,2838524191,NL -2838524192,2838524223,AF -2838524224,2838524431,NL -2838524432,2838524447,US -2838524448,2838524631,NL -2838524632,2838524655,US -2838524656,2838524735,NL -2838524736,2838524799,US -2838524800,2838525999,NL -2838526000,2838526015,US -2838526016,2838526151,NL -2838526152,2838526159,US -2838526160,2838526639,NL -2838526640,2838526655,US -2838526656,2838526983,NL -2838526984,2838526991,US -2838526992,2838527055,NL -2838527056,2838527071,US -2838527072,2838527223,NL -2838527224,2838527231,US -2838527232,2838527279,NL -2838527280,2838527295,US -2838527296,2838527391,NL -2838527392,2838527407,US -2838527408,2838527439,NL -2838527440,2838527455,US -2838527456,2838527535,NL -2838527536,2838527551,US -2838527552,2838527615,NL -2838527616,2838527631,US -2838527632,2838527695,NL -2838527696,2838527711,US -2838527712,2838528279,NL -2838528280,2838528287,US -2838528288,2838528319,NL -2838528320,2838528335,US -2838528336,2838530095,NL -2838530096,2838530111,US -2838530112,2838530271,NL -2838530272,2838530287,US -2838530288,2838530407,NL -2838530408,2838530415,US -2838530416,2838530527,NL -2838530528,2838530559,US -2838530560,2838531367,NL -2838531368,2838531375,US -2838531376,2838536207,NL -2838536208,2838536239,US -2838536240,2838537375,NL -2838537376,2838537407,US -2838537408,2838537863,NL -2838537864,2838537871,US -2838537872,2838538063,NL -2838538064,2838538079,US -2838538080,2838538319,NL -2838538320,2838538327,US -2838538328,2838538559,NL -2838538560,2838538591,US -2838538592,2838540111,NL -2838540112,2838540119,US -2838540120,2838540367,NL -2838540368,2838540383,US -2838540384,2838540551,NL -2838540552,2838540575,US -2838540576,2838540687,NL -2838540688,2838540703,US -2838540704,2838541807,NL -2838541808,2838541823,US -2838541824,2838542047,NL -2838542048,2838542063,US -2838542064,2838542095,NL -2838542096,2838542111,US -2838542112,2838542247,NL -2838542248,2838542255,US -2838542256,2838542271,NL -2838542272,2838542303,US -2838542304,2838542767,NL -2838542768,2838542783,US -2838542784,2838543223,NL -2838543224,2838543231,US -2838543232,2838543623,NL -2838543624,2838543631,US -2838543632,2838543759,NL -2838543760,2838543775,US -2838543776,2838543855,NL -2838543856,2838543871,US -2838543872,2838544575,NL -2838544576,2838544607,US -2838544608,2838544655,NL -2838544656,2838544671,US -2838544672,2838544703,NL -2838544704,2838544767,US -2838544768,2838544839,NL -2838544840,2838544847,US -2838544848,2838545279,NL -2838545280,2838545295,US -2838545296,2838545407,NL -2838545408,2838546431,US -2838546432,2838546815,NL -2838546816,2838546817,US -2838546818,2838546819,NL -2838546820,2838546823,US -2838546824,2838547231,NL -2838547232,2838547263,US -2838547264,2838547343,NL -2838547344,2838547359,US -2838547360,2838547743,NL -2838547744,2838547775,US -2838547776,2838547807,NL -2838547808,2838547823,US -2838547824,2838548359,NL -2838548360,2838548367,US -2838548368,2838549119,NL -2838549120,2838549135,US -2838549136,2838549407,NL -2838549408,2838549415,US -2838549416,2838549855,NL -2838549856,2838549887,US -2838549888,2838550111,NL -2838550112,2838550159,US -2838550160,2838550719,NL -2838550720,2838550799,US -2838550800,2838550855,NL -2838550856,2838550863,US -2838550864,2838560767,NL -2838560768,2838626303,CH -2838626304,2838626399,US -2838626400,2838626431,SA -2838626432,2838626575,US -2838626576,2838626591,CN -2838626592,2838627631,US -2838627632,2838627647,CN -2838627648,2838628319,US -2838628320,2838628351,DE -2838628352,2838631367,US -2838631368,2838631375,SA -2838631376,2838631423,US -2838631424,2838631431,CN -2838631432,2838631871,US -2838631872,2838631903,DE -2838631904,2838631935,SA -2838631936,2838631967,US -2838631968,2838631999,DE -2838632000,2838632095,US -2838632096,2838632127,DE -2838632128,2838633295,US -2838633296,2838633311,SA -2838633312,2838634047,US -2838634048,2838634111,DE -2838634112,2838636095,US -2838636096,2838636111,HU -2838636112,2838641351,US -2838641352,2838641359,SE -2838641360,2838641831,US -2838641832,2838641839,IT -2838641840,2838642239,US -2838642240,2838642303,DE -2838642304,2838642575,US -2838642576,2838642583,IT -2838642584,2838642623,US -2838642624,2838642639,CN -2838642640,2838642719,US -2838642720,2838642723,AE -2838642724,2838643407,US -2838643408,2838643408,GB -2838643409,2838643487,US -2838643488,2838643519,HK -2838643520,2838643696,US -2838643697,2838643697,GB -2838643698,2838644943,US -2838644944,2838644951,AE -2838644952,2838645839,US -2838645840,2838645871,GB -2838645872,2838646191,US -2838646192,2838646239,GB -2838646240,2838647103,US -2838647104,2838647111,AE -2838647112,2838647807,US -2838647808,2838647839,GB -2838647840,2838650527,US -2838650528,2838650559,GB -2838650560,2838653631,US -2838653632,2838653639,GB -2838653640,2838657295,US -2838657296,2838657299,AE -2838657300,2838658181,US -2838658182,2838658182,GB -2838658183,2838658607,US -2838658608,2838658623,NL -2838658624,2838659007,US -2838659008,2838659023,GB -2838659024,2838659431,US -2838659432,2838659439,GB -2838659440,2838661759,US -2838661760,2838661791,NL -2838661792,2838663167,US -2838663168,2838663175,NL -2838663176,2838664167,US -2838664168,2838664175,VN -2838664176,2838665759,US -2838665760,2838665791,JP -2838665792,2838669519,US -2838669520,2838669535,NL -2838669536,2838672007,US -2838672008,2838672015,RO -2838672016,2838683615,US -2838683616,2838683631,CN -2838683632,2838683887,US -2838683888,2838683903,GH -2838683904,2838700063,US -2838700064,2838700079,GR -2838700080,2838700751,US -2838700752,2838700767,RO -2838700768,2838708223,US -2838708224,2838724607,NO -2838724608,2838757375,US -2838757376,2838822911,CH -2838822912,2838840095,US -2838840096,2838840127,HK -2838840128,2838843295,US -2838843296,2838843327,HK -2838843328,2838859777,US -2838859778,2838859779,HK -2838859780,2838865007,US -2838865008,2838865015,CA -2838865016,2838865019,US -2838865020,2838865023,CA -2838865024,2838866247,US -2838866248,2838866255,CA -2838866256,2838867855,US -2838867856,2838867863,CA -2838867864,2838871295,US -2838871296,2838871311,CA -2838871312,2838871327,US -2838871328,2838871343,CA -2838871344,2838871503,US -2838871504,2838871511,CA -2838871512,2838881055,US -2838881056,2838881087,AT -2838881088,2838881407,US -2838881408,2838881423,IN -2838881424,2838887271,US -2838887272,2838887279,IN -2838887280,2838887871,US -2838887872,2838887887,EC -2838887888,2838904831,US -2838904832,2838921215,CA -2838921216,2838924687,US -2838924688,2838924703,HK -2838924704,2838930495,US -2838930496,2838930511,HK -2838930512,2838931007,US -2838931008,2838931012,CZ -2838931013,2838931013,US -2838931014,2838931015,CZ -2838931016,2838931016,US -2838931017,2838931023,CZ -2838931024,2838933919,US -2838933920,2838933951,NL -2838933952,2838937743,US -2838937744,2838937759,ZA -2838937760,2838938991,US -2838938992,2838939007,AU -2838939008,2838946431,US -2838946432,2838946447,KE -2838946448,2838946735,US -2838946736,2838946751,CA -2838946752,2838957535,US -2838957536,2838957551,HK -2838957552,2838960815,US -2838960816,2838960819,CZ -2838960820,2838960821,US -2838960822,2838960827,CZ -2838960828,2838960829,US -2838960830,2838960831,CZ -2838960832,2838968671,US -2838968672,2838968687,CN -2838968688,2838969167,US -2838969168,2838969183,AF -2838969184,2838969456,US -2838969457,2838969457,HK -2838969458,2838969535,US -2838969536,2838969536,IL -2838969537,2838969587,US -2838969588,2838969588,AF -2838969589,2838969591,US -2838969592,2838969592,HK -2838969593,2838969710,US -2838969711,2838969711,HK -2838969712,2838969737,US -2838969738,2838969738,ES -2838969739,2838969814,US -2838969815,2838969815,JP -2838969816,2838969828,US -2838969829,2838969829,NL -2838969830,2838969903,US -2838969904,2838969904,NL -2838969905,2838988639,US -2838988640,2838988671,CA -2838988672,2838988687,US -2838988688,2838988703,CA -2838988704,2838989671,US -2838989672,2838989679,CA -2838989680,2838989727,US -2838989728,2838989743,CA -2838989744,2838990719,US -2838990720,2838990751,CA -2838990752,2838991055,US -2838991056,2838991071,CA -2838991072,2838996063,US -2838996064,2838996095,HK -2838996096,2838999087,US -2838999088,2838999103,CA -2838999104,2838999407,US -2838999408,2838999423,AF -2838999424,2839001263,US -2839001264,2839001279,CA -2839001280,2839019687,US -2839019688,2839019695,JP -2839019696,2839021219,US -2839021220,2839021222,JP -2839021223,2839021223,US -2839021224,2839021226,JP -2839021227,2839021227,US -2839021228,2839021230,JP -2839021231,2839021231,US -2839021232,2839021234,JP -2839021235,2839021235,US -2839021236,2839021238,JP -2839021239,2839021239,US -2839021240,2839021242,JP -2839021243,2839035903,US -2839035904,2839052287,KR -2839052288,2839085055,US -2839085056,2839117823,MX -2839117824,2839150591,BR -2839150592,2839297023,US -2839297024,2839298047,CA -2839298048,2839300031,US -2839300032,2839300047,AF -2839300048,2839315471,US -2839315472,2839315487,JP -2839315488,2839363903,US -2839363904,2839363911,AU -2839363912,2840015359,US -2840015360,2840015615,GB -2840015616,2843803647,US -2843803648,2843869183,ZA -2843869184,2844524543,US -2844524544,2844590079,KR -2844590080,2844862975,US -2844862976,2844863231,CA -2844863232,2845114367,US -2845114368,2845179903,IN -2845179904,2845704191,US -2845704192,2845769727,CU -2845769728,2845786111,GA -2845786112,2845802495,NG -2845802496,2845822975,ZA -2845822976,2845827071,CD -2845827072,2845835263,ZA -2845835264,2848211967,US -2848211968,2848212223,HK -2848212224,2848212991,US -2848212992,2848215039,GB -2848215040,2848244735,US -2848244736,2848245759,GB -2848245760,2848522239,US -2848587776,2848653311,ZA -2848653312,2848980991,US -2848980992,2850029567,KR -2850029568,2851012607,US -2851012608,2851013631,TZ -2851013632,2851015679,ZA -2851015680,2851016703,CV -2851016704,2851017727,NG -2851017728,2851018751,SC -2851018752,2851019775,ZW -2851019776,2851020799,ZA -2851020800,2851021823,AO -2851021824,2851022847,EG -2851022848,2851023871,CM -2851023872,2851024895,ZA -2851024896,2851025919,NG -2851025920,2851026943,GH -2851026944,2851027967,NG -2851027968,2851028991,ZA -2851028992,2851030015,CI -2851030016,2851031039,ZA -2851031040,2851032063,CD -2851032064,2851033087,AO -2851033088,2851035135,ZA -2851035136,2851036159,UG -2851036160,2851037183,LY -2851037184,2851038207,CF -2851038208,2851039231,ML -2851039232,2851040255,MZ -2851040256,2851041279,AO -2851041280,2851042303,GQ -2851042304,2851043327,LY -2851043328,2851044351,TD -2851044352,2851046399,ZA -2851046400,2851047423,AO -2851047424,2851048447,SN -2851048448,2851049471,MU -2851049472,2851050495,MZ -2851050496,2851051519,GA -2851051520,2851052543,ZA -2851052544,2851053567,CD -2851053568,2851054591,KE -2851054592,2851055615,ZA -2851055616,2851057663,KE -2851057664,2851060735,ZA -2851060736,2851062783,NG -2851062784,2851063807,SL -2851063808,2851064319,FR -2851064320,2851064575,SC -2851064576,2851064831,FR -2851064832,2851065855,SC -2851065856,2851066879,ZA -2851066880,2851067903,CD -2851067904,2851071999,ZA -2851072000,2851074047,NG -2851074048,2851075071,ZA -2851075072,2851076095,SL -2851076096,2851077119,GH -2851077120,2851078143,KE -2851078144,2851995647,US -2852061184,2852062207,ZA -2852062208,2852063231,CM -2852063232,2852064255,KE -2852064256,2852065279,ZA -2852065280,2852066303,GH -2852066304,2852067327,ZA -2852067328,2852068351,SS -2852068352,2852071423,ZA -2852071424,2852072447,NG -2852072448,2852073471,ZA -2852073472,2852074495,TZ -2852074496,2852075519,MW -2852075520,2852075775,ZA -2852075776,2852076031,NG -2852076032,2852077567,ZA -2852077568,2852078591,CD -2852078592,2852079615,TN -2852079616,2852080639,CG -2852080640,2852081663,ZA -2852081664,2852082687,BW -2852082688,2852083711,EG -2852083712,2852084735,AO -2852084736,2852085759,TN -2852085760,2852086783,KE -2852086784,2852087807,SD -2852087808,2852088831,KE -2852088832,2852089855,LY -2852089856,2852090879,TZ -2852090880,2852091903,ZA -2852091904,2852092671,CD -2852092672,2852092927,CG -2852092928,2852093951,NG -2852093952,2852094975,ZA -2852094976,2852095999,MZ -2852096000,2852097023,SS -2852097024,2852098047,NG -2852098048,2852099071,ZA -2852099072,2852100095,GA -2852100096,2852101119,TD -2852101120,2852102143,LY -2852102144,2852103167,MU -2852103168,2852106239,ZA -2852106240,2852107263,MA -2852107264,2852108287,NG -2852108288,2852109311,TZ -2852109312,2852110335,CD -2852110336,2852111103,ZA -2852111104,2852111359,NG -2852111360,2852112383,ZA -2852112384,2852113407,KE -2852113408,2852114431,CD -2852114432,2852115455,NG -2852115456,2852116479,KE -2852116480,2852118527,ZA -2852118528,2852119551,NG -2852119552,2852121599,ZA -2852121600,2852122623,NG -2852122624,2852126719,ZA -2852126720,2852127743,BR -2852127744,2852127983,HN -2852127984,2852127991,NL -2852127992,2852128087,HN -2852128088,2852128095,NL -2852128096,2852128767,HN -2852128768,2852129791,AR -2852129792,2852130815,MX -2852130816,2852131839,SX -2852131840,2852147199,BR -2852147200,2852148223,PE -2852148224,2852149247,AR -2852149248,2852150271,BR -2852150272,2852151295,AR -2852151296,2852171775,BR -2852171776,2852172799,SV -2852172800,2852173823,BZ -2852173824,2852185087,BR -2852185088,2852186111,MX -2852186112,2852187135,PE -2852187136,2852189183,BR -2852189184,2852190207,TT -2852190208,2852192255,BR -2852192256,2852810751,US -2852810752,2852814847,DE -2852814848,2852839423,US -2852839424,2852847615,CA -2852847616,2853306367,US -2853306368,2853371903,CL -2853371904,2853765119,US -2853765120,2853830655,MX -2853830656,2854289407,US -2854289408,2854290431,CN -2854290432,2854293503,SG -2854293504,2854295551,US -2854295552,2854354943,SG -2854354944,2854617087,US -2854617088,2854682623,MY -2854748160,2855288831,US -2855288832,2855305215,GB -2855305216,2855309311,HK -2855309312,2855469055,US -2855469056,2855473151,PY -2855473152,2855481343,AR -2855481344,2855484415,PY -2855484416,2855484671,AR -2855484672,2855485183,PY -2855485184,2855489535,UY -2855489536,2855497727,AR -2855497728,2855499775,PY -2855499776,2855501823,UY -2855501824,2855518207,AR -2855518208,2855520255,UY -2855520256,2855534591,AR -2855534592,2855550975,US -2855550976,2855567359,CA -2855567360,2856058879,US -2856058880,2856124415,CH -2856124416,2856184831,US -2856184832,2856185855,GB -2856185856,2856438783,US -2856438784,2856439039,BR -2856439040,2856439295,US -2856439296,2856439551,BR -2856439552,2856452095,US -2856452096,2856517631,BR -2856517632,2856714239,US -2856714240,2856779775,MX -2856779776,2857082879,US -2857082880,2857086975,CA -2857086976,2857140223,US -2857140224,2857140735,CA -2857140736,2857152511,US -2857152512,2857152767,AU -2857152768,2857153023,NZ -2857153024,2857153279,AE -2857153280,2857153535,SA -2857153536,2857238527,US -2857238528,2857248767,BR -2857248768,2857249791,CO -2857249792,2857250815,AR -2857250816,2857252863,BR -2857252864,2857253887,CO -2857253888,2857256959,BR -2857256960,2857257471,AR -2857257472,2857257727,US -2857257728,2857257983,AR -2857257984,2857261055,BR -2857261056,2857262079,AR -2857262080,2857266175,BR -2857266176,2857267199,AR -2857267200,2857268223,CL -2857268224,2857270271,BR -2857270272,2857271295,AR -2857271296,2857273343,BR -2857273344,2857274367,AR -2857274368,2857285631,BR -2857285632,2857285887,AR -2857285888,2857286143,CO -2857286144,2857286655,BR -2857286656,2857287679,MX -2857287680,2857288703,AR -2857288704,2857289727,BR -2857289728,2857290751,AR -2857290752,2857294847,BR -2857294848,2857295871,AR -2857295872,2857303039,BR -2857303040,2857304063,CL -2857304064,2857308159,BR -2857308160,2857309183,AR -2857309184,2857313279,BR -2857313280,2857314303,PE -2857314304,2857315327,CL -2857315328,2857324031,BR -2857324032,2857324543,US -2857324544,2857326591,BR -2857326592,2857327615,CO -2857327616,2857329663,BR -2857329664,2857330687,CL -2857330688,2857331711,BR -2857331712,2857332735,PA -2857332736,2857335807,BR -2857335808,2857336831,MX -2857336832,2857340927,BR -2857340928,2857341951,DO -2857341952,2857350143,BR -2857350144,2857351167,AR -2857351168,2857363455,BR -2857363456,2857364479,CL -2857364480,2857368575,BR -2857368576,2857369599,AR -2857369600,2857371647,BR -2857371648,2857372671,CO -2857372672,2857373695,BR -2857373696,2857374719,NI -2857374720,2857374975,SV -2857374976,2857375743,GT -2857375744,2857376767,AR -2857376768,2857377791,MX -2857377792,2857388031,BR -2857388032,2857389055,CL -2857389056,2857392127,BR -2857392128,2857393151,CR -2857393152,2857394175,CL -2857394176,2857395199,CO -2857395200,2857397247,BR -2857397248,2857398271,AR -2857398272,2857399295,BR -2857399296,2857400319,AR -2857400320,2857404415,BR -2857404416,2857405439,AR -2857405440,2857406463,HN -2857406464,2857412607,BR -2857412608,2857414655,AR -2857414656,2857420799,BR -2857420800,2857421823,AR -2857421824,2857427967,BR -2857427968,2857428991,AR -2857428992,2857431039,BR -2857431040,2857432063,MX -2857432064,2857433087,BR -2857433088,2857434111,HT -2857434112,2857437183,BR -2857437184,2857438207,DO -2857438208,2857441279,BR -2857441280,2857442303,CO -2857442304,2857443327,CL -2857443328,2857444351,CR -2857444352,2857448447,BR -2857448448,2857449471,HN -2857449472,2857466879,BR -2857466880,2857467903,HN -2857467904,2857470719,BR -2857470720,2857470975,AR -2857470976,2857471999,MX -2857472000,2857473023,VE -2857473024,2857485311,BR -2857485312,2857486335,HN -2857486336,2857489407,BR -2857489408,2857490431,AR -2857490432,2857493503,BR -2857493504,2857494527,AR -2857494528,2857496575,BR -2857496576,2857497599,PE -2857497600,2857499647,BR -2857499648,2857500671,CO -2857500672,2857501183,HN -2857501184,2857501695,US -2857501696,2857506815,BR -2857506816,2857507839,DO -2857507840,2857509887,BR -2857509888,2857510911,HN -2857510912,2857511423,CO -2857511424,2857525247,BR -2857525248,2857526271,PE -2857526272,2857529343,BR -2857529344,2857530367,EC -2857530368,2857533439,BR -2857533440,2857534463,CL -2857534464,2857537535,BR -2857537536,2857538559,PY -2857538560,2857540607,BR -2857540608,2857541631,EC -2857541632,2857548799,BR -2857548800,2857549823,CL -2857549824,2857553919,BR -2857553920,2857554943,TT -2857554944,2857555967,BR -2857555968,2857556991,TT -2857556992,2857558015,BR -2857558016,2857559039,CL -2857559040,2857563135,BR -2857563136,2857563647,BO -2857563648,2857563903,BR -2857563904,2857564159,PA -2857564160,2857567231,BR -2857567232,2857568255,AR -2857568256,2857569279,CR -2857569280,2857574399,BR -2857574400,2857575423,AR -2857575424,2857579519,BR -2857579520,2857580543,AR -2857580544,2857581055,BR -2857581056,2857581311,AR -2857581312,2857581567,CO -2857581568,2857585663,BR -2857585664,2857586687,VE -2857586688,2857593855,BR -2857593856,2857594879,AR -2857594880,2857595903,BR -2857595904,2857596927,HN -2857596928,2857597951,BR -2857597952,2857598975,AR -2857598976,2857611263,BR -2857611264,2857612287,US -2857612288,2857615359,BR -2857615360,2857616383,HT -2857616384,2857621503,BR -2857621504,2857622527,EC -2857622528,2857623551,AR -2857623552,2857625599,BR -2857625600,2857627135,HN -2857627136,2857627647,US -2857627648,2857628671,PY -2857628672,2857633791,BR -2857633792,2857634815,TT -2857634816,2857643007,BR -2857643008,2857644031,AR -2857644032,2857659391,BR -2857659392,2857660415,CR -2857660416,2857663487,BR -2857663488,2857665535,AR -2857665536,2857666559,NI -2857666560,2857667583,VE -2857667584,2857674751,BR -2857674752,2857675775,AR -2857675776,2857676799,PY -2857676800,2857679871,BR -2857679872,2857680895,MX -2857680896,2857683967,BR -2857683968,2857684991,AR -2857684992,2857686015,CL -2857686016,2857687039,AR -2857687040,2857690111,BR -2857690112,2857691135,HN -2857691136,2857692159,AR -2857692160,2857696255,BR -2857696256,2857697279,AR -2857697280,2859007999,US -2859008000,2859073535,JP -2859073536,2859139071,CN -2859139072,2861842431,US -2861842432,2861843851,HK -2861843852,2861843853,US -2861843854,2861844479,HK -2861844480,2861858815,US -2861858816,2861859974,HK -2861859975,2861859976,US -2861859977,2861860863,HK -2861860864,2861957119,US -2861957120,2861959167,BR -2861959168,2861960191,AR -2861960192,2861961215,MX -2861961216,2861964287,BR -2861964288,2861965311,GT -2861965312,2861966335,AR -2861966336,2861968383,BR -2861968384,2861969407,AR -2861969408,2861971455,BR -2861971456,2861972479,CR -2861972480,2861974527,AR -2861974528,2861979647,BR -2861979648,2861980671,VE -2861980672,2861986815,BR -2861986816,2861987839,AR -2861987840,2861988863,CL -2861988864,2861992959,BR -2861992960,2861993983,CL -2861993984,2861996031,BR -2861996032,2861997055,AR -2861997056,2861998079,CL -2861998080,2861999103,MX -2861999104,2862003199,BR -2862003200,2862004223,HN -2862004224,2862007295,BR -2862007296,2862008319,AR -2862008320,2862022655,BR -2862022656,2862284799,US -2862284800,2862350335,AR -2862350336,2862415871,US -2862415872,2862481407,AU -2862481408,2863202303,US -2863202304,2863267839,MX -2863267840,2863595519,US -2863595520,2863661055,CA -2863661056,2863857663,US -2863857664,2863923199,CN -2863923200,2864844799,US -2864844800,2864845055,NL -2864845056,2864848895,US -2864848896,2864857087,GB -2864857088,2865252095,US -2865252096,2865252351,GB -2865252352,2865577983,US -2865577984,2865610751,BE -2865610752,2865889279,US -2865889280,2865954815,AR -2865954816,2867265535,US -2867265536,2867274751,BR -2867274752,2867275775,AR -2867275776,2867278847,BR -2867278848,2867279871,HN -2867279872,2867282943,BR -2867282944,2867283967,AR -2867283968,2867284991,BR -2867284992,2867286015,AR -2867286016,2867287039,PE -2867287040,2867297279,BR -2867297280,2867298303,AR -2867298304,2867300351,BR -2867300352,2867301375,AR -2867301376,2867306495,BR -2867306496,2867307519,AR -2867307520,2867308543,BR -2867308544,2867309567,PE -2867309568,2867310591,BR -2867310592,2867311615,AR -2867311616,2867317759,BR -2867317760,2867318783,AR -2867318784,2867323903,BR -2867323904,2867324927,MX -2867324928,2867325951,BR -2867325952,2867326975,PA -2867326976,2867329023,BR -2867329024,2867329295,HN -2867329296,2867329311,NL -2867329312,2867330047,HN -2867330048,2867331071,BR -2867331072,2867396607,US -2867396608,2867403775,BR -2867403776,2867404799,AR -2867404800,2867414015,BR -2867414016,2867415039,AR -2867415040,2867416063,GF -2867416064,2867420159,BR -2867420160,2867421183,AR -2867421184,2867426303,BR -2867426304,2867427327,AR -2867427328,2867428351,BR -2867428352,2867429375,AR -2867429376,2867433471,BR -2867433472,2867434495,PE -2867434496,2867435519,BR -2867435520,2867436543,CL -2867436544,2867441663,BR -2867441664,2867442687,AR -2867442688,2867445759,BR -2867445760,2867446783,CL -2867446784,2867449855,BR -2867449856,2867450879,AR -2867450880,2867451903,BR -2867451904,2867452927,PY -2867452928,2867455999,BR -2867456000,2867457023,AR -2867457024,2867462143,BR -2867462144,2867593215,US -2867593216,2867724287,CH -2867724288,2867725311,EC -2867725312,2867726335,BR -2867726336,2867727359,AR -2867727360,2867728383,BR -2867728384,2867729407,PY -2867729408,2867730431,AR -2867730432,2867731455,CL -2867731456,2867732479,BR -2867732480,2867733503,CL -2867733504,2867734527,BR -2867734528,2867735551,AR -2867735552,2867740671,BR -2867740672,2867741183,CO -2867741184,2867741695,AR -2867741696,2867751935,BR -2867751936,2867752959,HN -2867752960,2867756031,BR -2867756032,2867757055,AR -2867757056,2867767295,BR -2867767296,2867767807,CO -2867767808,2867768319,EC -2867768320,2867775487,BR -2867775488,2867776511,CL -2867776512,2867777535,AR -2867777536,2867780607,BR -2867780608,2867781631,MX -2867781632,2867782143,BR -2867782144,2867782655,CO -2867782656,2867784703,BR -2867784704,2867785727,CO -2867785728,2867787775,AR -2867787776,2867788799,BR -2867788800,2867789823,MX -2867789824,2867792895,BR -2867792896,2867793919,HT -2867793920,2867796991,BR -2867796992,2867799039,AR -2867799040,2867802111,BR -2867802112,2867803135,AR -2867803136,2867804159,BR -2867804160,2867805183,GT -2867805184,2867806207,BR -2867806208,2867807231,CL -2867807232,2867811327,BR -2867811328,2867812351,CL -2867812352,2867813375,AR -2867813376,2867815423,BR -2867815424,2867816447,PE -2867816448,2867820543,BR -2867820544,2867821567,BO -2867821568,2867822591,BR -2867822592,2867823615,AR -2867823616,2867827711,BR -2867827712,2867828735,MX -2867828736,2867829759,CL -2867829760,2867831807,BR -2867831808,2867832831,DO -2867832832,2867834879,AR -2867834880,2867835903,BR -2867835904,2867836927,AR -2867836928,2867837951,BR -2867837952,2867838975,CL -2867838976,2867842047,BR -2867842048,2867843071,EC -2867843072,2867850239,BR -2867850240,2867851263,SV -2867851264,2867852287,BR -2867852288,2867853311,AR -2867853312,2867855359,BR -2867855360,2868057087,US -2868057088,2868058111,BR -2868058112,2868117503,US -2868117504,2868127743,BR -2868127744,2868128767,HN -2868128768,2868129791,BR -2868129792,2868130815,AR -2868130816,2868131839,VE -2868131840,2868132863,AR -2868132864,2868137983,BR -2868137984,2868139007,DO -2868139008,2868140031,BR -2868140032,2868141055,VE -2868141056,2868142079,HN -2868142080,2868145151,BR -2868145152,2868146175,MX -2868146176,2868148223,BR -2868148224,2868150271,MX -2868150272,2868151295,AR -2868151296,2868154367,BR -2868154368,2868155391,HN -2868155392,2868157439,BR -2868157440,2868158463,HN -2868158464,2868160511,BR -2868160512,2868161535,CR -2868161536,2868164607,BR -2868164608,2868166655,AR -2868166656,2868170751,BR -2868170752,2868171775,EC -2868171776,2868178943,BR -2868178944,2868179967,HN -2868179968,2868183039,BR -2868183040,2868184063,CW -2868184064,2868191743,BR -2868191744,2868191999,VE -2868192000,2868192255,BO -2868192256,2868193279,BR -2868193280,2868194303,HN -2868194304,2868195327,BR -2868195328,2868195583,CL -2868195584,2868195839,GB -2868195840,2868196351,CL -2868196352,2868197375,BR -2868197376,2868198399,HN -2868198400,2868205567,BR -2868205568,2868206591,MX -2868206592,2868225023,BR -2868225024,2868226047,DO -2868226048,2868227071,AR -2868227072,2868230143,BR -2868230144,2868232191,MX -2868232192,2868236287,BR -2868236288,2868237311,AR -2868237312,2868242431,BR -2868242432,2868243455,AR -2868243456,2868244479,BR -2868244480,2868245503,CR -2868245504,2868253695,BR -2868253696,2868254719,AR -2868254720,2868257791,BR -2868257792,2868259839,AR -2868259840,2868260863,BR -2868260864,2868261887,AR -2868261888,2868263935,HN -2868263936,2868264959,BR -2868264960,2868265983,CL -2868265984,2868268031,BR -2868268032,2868268287,AR -2868268288,2868268543,VE -2868268544,2868268799,AR -2868268800,2868269055,VE -2868269056,2868270079,BR -2868270080,2868271103,EC -2868271104,2868272127,AR -2868272128,2868273151,VE -2868273152,2868274175,BR -2868274176,2868275199,CR -2868275200,2868277247,BR -2868277248,2868278271,CO -2868278272,2868286463,BR -2868286464,2868287487,CR -2868287488,2868288511,NI -2868288512,2868289535,CR -2868289536,2868290559,TT -2868290560,2868292607,BR -2868292608,2868293631,CL -2868293632,2868295679,AR -2868295680,2868304895,BR -2868304896,2868305919,PA -2868305920,2868311039,BR -2868311040,2868312063,AR -2868312064,2868314111,BR -2868314112,2868315135,CO -2868315136,2868328447,BR -2868328448,2868329471,AR -2868329472,2868333567,BR -2868333568,2868334591,AR -2868334592,2868335615,BR -2868335616,2868336639,HN -2868336640,2868337663,AR -2868337664,2868338687,CL -2868338688,2868339711,AR -2868339712,2868344831,BR -2868344832,2868345855,AR -2868345856,2868346879,BR -2868346880,2868348927,MX -2868348928,2868349951,CL -2868349952,2868350975,AR -2868350976,2868353023,BR -2868353024,2868354047,PA -2868354048,2868355071,BR -2868355072,2868356095,BO -2868356096,2868357119,CL -2868357120,2868358143,UY -2868358144,2868360191,MX -2868360192,2868361215,BR -2868361216,2868363263,MX -2868363264,2868366335,BR -2868366336,2868367359,CL -2868367360,2868368383,BR -2868368384,2868369407,VE -2868369408,2868370431,CL -2868370432,2868371455,BZ -2868371456,2868373503,MX -2868373504,2868379647,BR -2868379648,2868380159,IN -2868380160,2868380671,BR -2868380672,2868380927,US -2868380928,2868381055,MX -2868381056,2868381183,IN -2868381184,2868381695,MX -2868381696,2868382463,US -2868382464,2868382719,CL -2868382720,2868383231,IN -2868383232,2868383743,US -2868383744,2868384255,PH -2868384256,2868384767,BR -2868384768,2868390143,US -2868390144,2868390399,GB -2868390400,2868390911,IN -2868390912,2868391423,US -2868391424,2868391935,IN -2868391936,2868399615,US -2868399616,2868399871,BR -2868399872,2868400127,US -2868400128,2868400639,BR -2868400640,2868401151,US -2868401152,2868401663,BR -2868401664,2868401919,PH -2868401920,2868402175,AR -2868402176,2868410367,US -2868410368,2868410879,BR -2868410880,2868411391,AR -2868411392,2868411903,PL -2868411904,2868414719,US -2868414720,2868414975,MU -2868414976,2868415487,IN -2868415488,2868415999,US -2868416000,2868416255,AU -2868416256,2868416767,US -2868416768,2868417023,PL -2868417024,2868417535,JP -2868417536,2868418815,US -2868418816,2868419071,TR -2868419072,2868419327,PH -2868419328,2868419583,IN -2868419584,2868420607,PH -2868420608,2868423679,IN -2868423680,2868428287,US -2868428288,2868428799,IN -2868428800,2868432895,US -2868432896,2868433407,AR -2868433408,2868437503,US -2868437504,2868437759,BR -2868437760,2868578815,US -2868578816,2868579327,IN -2868579328,2868581375,US -2868581376,2868581887,IN -2868581888,2868586495,US -2868586496,2868588543,IN -2868588544,2868591615,US -2868591616,2868592127,IN -2868592128,2868599295,US -2868599296,2868599807,BR -2868599808,2868604415,US -2868604416,2868604927,IN -2868604928,2868612607,US -2868612608,2868613119,IN -2868613120,2868619775,US -2868619776,2868620287,IN -2868620288,2868620799,US -2868620800,2868621311,IN -2868621312,2868632575,US -2868632576,2868633087,BR -2868633088,2868674336,US -2868674337,2868674337,SE -2868674338,2868678655,US -2868678656,2868678911,JP -2868678912,2868731903,US -2868731904,2868740095,CA -2868740096,2868772863,US -2868772864,2868773887,CO -2868773888,2868776959,BR -2868776960,2868777983,BZ -2868777984,2868780031,BR -2868780032,2868781055,EC -2868781056,2868785151,BR -2868785152,2868786175,PA -2868786176,2868788223,BR -2868788224,2868789247,AR -2868789248,2868790271,DO -2868790272,2868796415,BR -2868796416,2868797439,AR -2868797440,2868803583,BR -2868803584,2868804607,AR -2868804608,2868805631,BR -2868805632,2868806655,AR -2868806656,2868812799,BR -2868812800,2868813823,AR -2868813824,2868814847,BR -2868814848,2868815871,AR -2868815872,2868816895,BR -2868816896,2868817919,VE -2868817920,2868818047,HN -2868818048,2868818063,FR -2868818064,2868818095,HN -2868818096,2868818111,FR -2868818112,2868818887,HN -2868818888,2868818895,IT -2868818896,2868818943,HN -2868818944,2868825087,BR -2868825088,2868826111,AR -2868826112,2868828159,BR -2868828160,2868829183,PY -2868829184,2868831231,BR -2868831232,2868832255,CO -2868832256,2868833279,PE -2868833280,2868838399,BR -2868838400,2868903935,BE -2868903936,2869035007,SG -2869035008,2869166079,JP -2869166080,2869428223,TH -2869428224,2869952511,CN -2869952512,2870018047,FR -2870018048,2870083583,DE -2870083584,2870089727,FR -2870089728,2870090751,BE -2870090752,2870091775,DE -2870091776,2870149119,FR -2870149120,2870214655,HU -2870214656,2870228223,DK -2870228224,2870228991,US -2870228992,2870280191,DK -2870280192,2870345727,NL -2870345728,2870411263,GB -2870411264,2870476799,NO -2870476800,2870542335,DE -2870542336,2870575103,CH -2870575104,2870583295,SE -2870583296,2870584319,NO -2870584320,2870585343,RU -2870585344,2870586367,UA -2870586368,2870587391,RU -2870587392,2870587647,CZ -2870587648,2870587903,RU -2870587904,2870588159,DE -2870588160,2870588415,NL -2870588416,2870588927,HU -2870588928,2870589439,PL -2870589440,2870591231,RU -2870591232,2870591487,IT -2870591488,2870591743,PL -2870591744,2870591999,SE -2870592000,2870592511,RU -2870592512,2870593535,PL -2870593536,2870594047,GB -2870594048,2870594559,RU -2870594560,2870595583,UA -2870595584,2870596607,FR -2870596608,2870597631,RU -2870597632,2870597887,PL -2870597888,2870598143,BE -2870598144,2870598655,LV -2870598656,2870599423,CZ -2870599424,2870599679,RO -2870599680,2870599935,KW -2870599936,2870600191,DE -2870600192,2870600703,PL -2870600704,2870600959,DK -2870600960,2870601215,BE -2870601216,2870601727,PL -2870601728,2870602751,RU -2870602752,2870603775,UA -2870603776,2870604031,LT -2870604032,2870604287,UA -2870604288,2870607871,RU -2870607872,2870673407,BE -2870673408,2870738943,CH -2870738944,2870935551,GB -2870935552,2871001087,HU -2871001088,2871066623,SE -2871066624,2871083007,CH -2871083008,2871099391,FR -2871099392,2871101439,NL -2871101440,2871103487,CZ -2871103488,2871104063,GB -2871104064,2871105535,NL -2871105536,2871107583,FR -2871107584,2871111679,GB -2871111680,2871115775,DE -2871115776,2871123967,GB -2871123968,2871126015,NL -2871126016,2871128063,ES -2871130112,2871132159,RU -2871132160,2872049663,CN -2872049664,2873098239,IN -2873098240,2873884671,US -2873884672,2874146815,IN -2874146816,2875195391,CN -2875195392,2875719679,TH -2875719680,2877292543,CN -2877292544,2882469887,US -2882469888,2882535423,SG -2882535424,2883583999,CN -2883584000,2885681151,VN -2885681152,2886729727,US -2887778304,2889522431,US -2889522432,2889522687,PR -2889522688,2889523071,US -2889523072,2889523199,PR -2889523200,2890137599,US -2890137600,2890138623,AU -2890138624,2890139647,TH -2890139648,2890141695,RU -2890141696,2890145791,BR -2890145792,2890147839,US -2890147840,2890148863,AO -2890148864,2890149887,US -2890149888,2890150911,AT -2890150912,2890152959,US -2890152960,2890153983,GR -2890153984,2890158079,US -2890158080,2890158847,AU -2890158848,2890159103,US -2890159104,2890160127,AU -2890160128,2890161151,US -2890161152,2890162175,ES -2890162176,2890163199,PA -2890163200,2890164223,PT -2890164224,2890165247,TH -2890165248,2890166271,DE -2890166272,2890167295,CL -2890167296,2890168319,AU -2890168320,2890169343,CW -2890169344,2890170367,AM -2890170368,2890171391,DJ -2890171392,2890172415,US -2890172416,2890173439,PL -2890173440,2890174463,US -2890174464,2890175231,SG -2890175232,2890176511,US -2890176512,2890177535,RS -2890177536,2890178559,US -2890178560,2890179583,IN -2890179584,2890182655,US -2890182656,2890183679,EC -2890183680,2890184703,SE -2890184704,2890185727,ZA -2890185728,2890187775,US -2890187776,2890188799,IT -2890188800,2890189823,LK -2890189824,2890191871,US -2890191872,2890192895,CZ -2890192896,2890193919,BR -2890193920,2890194943,HR -2890194944,2890195967,HU -2890195968,2890196991,US -2890196992,2890198015,TH -2890198016,2890199039,UA -2890199040,2890200063,TH -2890200064,2890201087,RU -2890201088,2890203135,HK -2890203136,2890204159,AT -2890204160,2890216447,US -2890216448,2890217471,NL -2890217472,2890218495,GR -2890218496,2890956799,US -2890956800,2890989567,AE -2890989568,2891017215,US -2891017216,2891017471,JP -2891017472,2891022847,US -2891022848,2891023103,GB -2891023104,2891034623,US -2891034624,2891036671,CA -2891036672,2891038719,US -2891038720,2891055103,CN -2891055104,2891056383,US -2891056384,2891056639,ES -2891056640,2891058943,US -2891058944,2891059199,FR -2891059200,2891120639,US -2891251712,2891272191,US -2891272192,2891274239,CA -2891274240,2891277823,US -2891277824,2891278079,GB -2891278080,2891279103,US -2891279104,2891279359,GB -2891279360,2891282431,US -2891282432,2891283455,PR -2891283456,2891284479,CA -2891284480,2891364351,US -2891364352,2891374591,CA -2891378688,2891380735,CA -2891380736,2891403263,US -2891403264,2891407359,CA -2891407360,2891780095,US -2891780096,2891786239,CA -2891786240,2891790335,US -2891790336,2891791359,CA -2891791360,2891796479,US -2891796480,2891800575,CA -2891800576,2891807231,US -2891807232,2891807487,GB -2891807488,2891807743,US -2891807744,2891808767,CA -2891808768,2891841535,US -2891841536,2891841791,SE -2891841792,2891842303,US -2891842304,2891842559,GB -2891842560,2891842815,BN -2891842816,2891843327,GB -2891843328,2891844095,US -2891844096,2891844351,GE -2891844352,2891845119,US -2891845120,2891845631,DE -2891845632,2891845887,US -2891845888,2891846399,DE -2891846400,2891846655,NL -2891846656,2891846911,US -2891846912,2891847167,NL -2891847168,2891848447,US -2891848448,2891848703,JP -2891848704,2891848959,US -2891848960,2891849215,BN -2891849216,2891850239,US -2891850240,2891850495,TH -2891850496,2891850751,AM -2891850752,2891851007,US -2891851008,2891851263,EE -2891851264,2891851519,AM -2891851520,2891853567,US -2891853568,2891853823,SG -2891853824,2891854079,US -2891854080,2891854335,TR -2891854336,2891854591,MY -2891854592,2891854847,PL -2891854848,2891855103,US -2891855104,2891855359,FR -2891855360,2891855615,BE -2891855616,2891855871,CH -2891855872,2891856127,JP -2891856128,2891856383,LU -2891856384,2891857663,US -2891857664,2891857919,DE -2891857920,2891858175,DZ -2891858176,2891858431,DK -2891858432,2891858687,CA -2891858688,2891859455,US -2891859456,2891859711,NO -2891859712,2891859967,AT -2891859968,2891860223,US -2891860224,2891860479,NL -2891860480,2891860735,CH -2891860736,2891860991,GB -2891860992,2891861247,BM -2891861248,2891861503,BO -2891861504,2891862527,US -2891862528,2891863039,KR -2891863040,2891863295,FR -2891863296,2891863551,AU -2891863552,2891863807,JP -2891863808,2891864063,FR -2891864064,2891864319,SG -2891864320,2891865087,US -2891865088,2891865343,NL -2891865344,2891865599,US -2891865600,2891865855,HK -2891865856,2891866111,US -2891866112,2891866367,AU -2891866368,2891866623,BB -2891866624,2891867391,AU -2891867392,2891867647,AT -2891867648,2891867903,US -2891867904,2891868159,AU -2891868160,2891868671,IT -2891868672,2891868927,AU -2891868928,2891869439,US -2891869440,2891869695,AT -2891869696,2891869951,US -2891869952,2891870207,DE -2891870208,2891870463,RU -2891870464,2891870719,KY -2891870720,2891870975,NO -2891870976,2891871231,US -2891871232,2891871487,CA -2891871488,2891874047,US -2891874048,2891874303,CA -2891874304,2891976535,US -2891976536,2891976543,CA -2891976544,2891982847,US -2891982848,2891984895,CA -2891984896,2891997695,US -2891997696,2891997951,IE -2891997952,2892015615,US -2892015616,2892016639,PR -2892016640,2892017663,US -2892017664,2892019711,CA -2892019712,2892019967,NL -2892019968,2892021759,CA -2892021760,2892040191,US -2892040192,2892042239,CA -2892042240,2892050431,US -2892050432,2892052479,CA -2892052480,2892053503,US -2892053504,2892054527,CA -2892054528,2892059775,US -2892059776,2892059903,BI -2892059904,2892060031,US -2892060032,2892060159,CC -2892060160,2892060799,US -2892060800,2892060927,WS -2892060928,2892061055,US -2892061056,2892061183,MU -2892061184,2892061311,AD -2892061312,2892061439,SL -2892061440,2892061567,US -2892061568,2892061695,PA -2892061696,2892062079,US -2892062080,2892062207,GU -2892062208,2892068863,US -2892068864,2892069887,CA -2892069888,2892070911,US -2892070912,2892103679,CA -2892103680,2892120575,US -2892120576,2892121087,CA -2892121088,2892122367,US -2892122368,2892122623,CA -2892122624,2892124927,US -2892124928,2892125183,NL -2892125184,2892126719,US -2892126720,2892126975,GB -2892126976,2892140543,US -2892140544,2892144895,CA -2892144896,2892145407,US -2892145408,2892145663,CA -2892145664,2892146943,US -2892146944,2892147199,NL -2892147200,2892149503,US -2892149504,2892149759,NL -2892149760,2892150271,US -2892150272,2892150783,CA -2892150784,2892154343,US -2892154344,2892154351,HN -2892154352,2892155903,US -2892155904,2892156927,CA -2892156928,2892171263,US -2892171264,2892172287,CA -2892172288,2892174335,US -2892174336,2892177407,CA -2892177408,2892369919,US -2892369920,2892374015,CA -2892374016,2892399103,US -2892399104,2892399231,TG -2892399232,2892399615,US -2892399616,2892399743,FJ -2892399744,2892399871,US -2892399872,2892399999,CW -2892400000,2892401023,US -2892401024,2892401151,ER -2892401152,2892401279,NR -2892401280,2892401407,US -2892401408,2892401535,MR -2892401536,2892401919,US -2892401920,2892402047,MF -2892402048,2892402175,US -2892402176,2892402303,MP -2892402304,2892414975,US -2892414976,2892415231,GB -2892415232,2892417791,US -2892417792,2892418047,GB -2892418048,2892420607,US -2892420608,2892420863,CA -2892420864,2892421631,US -2892421632,2892421887,CA -2892421888,2892423167,US -2892423168,2892424191,VI -2892424192,2892425215,CA -2892425216,2892443647,US -2892443648,2892447743,CA -2892447744,2892464127,US -2892464128,2892496895,CA -2892496896,2892505087,US -2892505088,2892513279,SG -2892513280,2892529663,JP -2892529664,2892537855,DE -2892537856,2892546047,SG -2892546048,2892906495,US -2892906496,2892910591,CA -2892910592,2892943743,US -2892943744,2892943871,LR -2892943872,2892943999,MC -2892944000,2892944127,SZ -2892944128,2892944255,US -2892944256,2892944383,BT -2892944384,2892944767,US -2892944768,2892944895,GQ -2892944896,2892945023,US -2892945024,2892945151,LS -2892945152,2892945279,US -2892945280,2892945407,LI -2892945408,2892945791,US -2892945792,2892945919,CV -2892945920,2892946047,US -2892946048,2892946175,LA -2892946176,2892946303,US -2892946304,2892946431,CF -2892946432,2892946815,US -2892946816,2892946943,SM -2892946944,2892947327,US -2892947328,2892947455,TO -2892947456,2892988415,US -2892988416,2892988671,SC -2892988672,2892988927,HU -2892988928,2892989183,RO -2892989184,2892989439,PE -2892989440,2892989695,CO -2892989696,2892989951,VE -2892989952,2892990207,US -2892990208,2892990463,CA -2892990464,2892990719,US -2892990720,2892990975,IT -2892990976,2892991231,GB -2892991232,2892991487,US -2892991488,2892991999,GB -2892992000,2892992511,HK -2892992512,2892993023,IT -2892993024,2892993279,JP -2892993280,2892993535,US -2892993536,2892993791,BE -2892993792,2892994047,PA -2892994048,2892994303,GB -2892994304,2892994559,US -2892994560,2892994815,JO -2892994816,2892995327,GB -2892995328,2892995839,AU -2892995840,2892996095,GB -2892996096,2892996607,US -2892996608,2892996863,CA -2892996864,2892996910,AU -2892996911,2892996911,GS -2892996912,2892997119,AU -2892997120,2892997375,CA -2892997376,2892997631,BG -2892997632,2892997887,AU -2892997888,2892998143,JP -2892998144,2892998399,US -2892998400,2892998655,GB -2892998656,2892998911,HK -2892998912,2892999167,MX -2892999168,2892999423,CR -2892999424,2892999935,US -2892999936,2893000191,IT -2893000192,2893000447,US -2893000448,2893000703,HK -2893000704,2893000959,US -2893000960,2893001215,CA -2893001216,2893001727,GB -2893001728,2893002239,IT -2893002240,2893002495,EE -2893002496,2893002751,PA -2893002752,2893003007,NZ -2893003008,2893003263,KR -2893003264,2893003775,GB -2893003776,2893004031,DE -2893004032,2893004287,JP -2893004288,2893004543,DK -2893004544,2893004799,US -2893004800,2893005311,HK -2893005312,2893005567,US -2893005568,2893005823,FR -2893005824,2893006079,NO -2893006080,2893006335,BE -2893006336,2893006591,US -2893006592,2893006847,BR -2893006848,2893007103,DE -2893007104,2893007359,US -2893007360,2893007615,IE -2893007616,2893007871,DE -2893007872,2893008639,GB -2893008640,2893008895,US -2893008896,2893009151,AF -2893009152,2893009663,US -2893009664,2893010175,GB -2893010176,2893010431,IT -2893010432,2893010687,DE -2893010688,2893010943,US -2893010944,2893011199,AT -2893011200,2893011455,US -2893011456,2893011711,SG -2893011712,2893011967,US -2893011968,2893012223,FR -2893012224,2893012479,ES -2893012480,2893012735,BE -2893012736,2893015039,US -2893015040,2893015295,CA -2893015296,2893015551,BS -2893015552,2893016575,US -2893016576,2893016831,SE -2893016832,2893017343,CA -2893017344,2893017599,SG -2893017600,2893017855,DE -2893017856,2893018111,FR -2893018112,2893018623,BE -2893018624,2893019135,SE -2893019136,2893019647,AU -2893019648,2893019903,DE -2893019904,2893020159,SG -2893020160,2893020415,NL -2893020416,2893020671,AT -2893020672,2893676543,US -2893676544,2893807615,JP -2893807616,2894921727,US -2894921728,2895118335,GB -2895118336,2895301887,US -2895301888,2895302143,AR -2895302144,2895642623,US -2895642624,2895708159,FR -2895708160,2896035839,US -2896035840,2896101375,DE -2896101376,2896166911,GB -2896166912,2896301499,US -2896301500,2896301500,DE -2896301501,2896429280,US -2896429281,2896429281,CA -2896429282,2897018879,US -2897018880,2897149951,DE -2897149952,2897215487,US -2897215488,2897739775,DE -2897739776,2898001919,FR -2898001920,2898132991,GB -2898132992,2898264063,US -2898264064,2898788351,AU -2898788352,2899050495,GB -2899050496,2899116031,FR -2899116032,2899148799,VN -2899148800,2899181567,AU -2899181568,2899312639,GB -2899312640,2899378175,FR -2899378176,2899443711,GB -2899443712,2899574783,FR -2899574784,2899902463,GB -2899902464,2899967999,US -2899968000,2900099071,CA -2900099072,2901475327,US -2901475328,2901477375,NL -2901477376,2901485567,US -2901485568,2901489663,NL -2901489664,2901491711,US -2901491712,2901493759,NL -2901493760,2901496831,US -2901496832,2901497855,NL -2901497856,2901538815,US -2901538816,2901540863,SG -2901540864,2901737983,US -2901737984,2901738239,CA -2901738240,2901740455,US -2901740456,2901740463,CA -2901740464,2901751295,US -2901751296,2901751551,GB -2901751552,2901876735,US -2901876736,2901877759,CN -2901877760,2901878271,DE -2901878272,2901878783,CN -2901878784,2902200319,US -2902200320,2902201855,CN -2902201856,2902202111,US -2902202112,2902203135,CN -2902203136,2902203391,US -2902203392,2902204159,CN -2902204160,2902208767,US -2902208768,2902211327,CN -2902211328,2902211583,US -2902211584,2902212607,CN -2902212608,2902228479,US -2902228480,2902228991,DE -2902228992,2902230015,CN -2902230016,2902230271,US -2902230272,2902231039,CN -2902231040,2902231295,US -2902231296,2902232319,CN -2902232320,2902232575,US -2902232576,2902232831,CN -2902232832,2902233087,US -2902233088,2902233343,CN -2902233344,2902233599,US -2902233600,2902235135,CN -2902235136,2902235391,US -2902235392,2902236415,CN -2902236416,2902236927,US -2902236928,2902237951,CN -2902237952,2902238207,US -2902238208,2902239999,CN -2902240000,2902240511,US -2902240512,2902241535,CN -2902241536,2902241791,US -2902241792,2902242047,CN -2902242048,2902242303,US -2902242304,2902243327,CN -2902243328,2902243583,US -2902243584,2902245375,CN -2902245376,2902246143,US -2902246144,2902246399,CN -2902246400,2902392831,US -2902392832,2902396927,NL -2902396928,2902405119,US -2902405120,2902407679,CA -2902407680,2902407935,US -2902407936,2902408191,CA -2902408192,2902409215,GB -2902409216,2902417407,US -2902417408,2902421503,NL -2902421504,2902427647,US -2902427648,2902429695,NL -2902429696,2902441983,US -2902441984,2902446079,NL -2902446080,2902450175,US -2902450176,2902454271,NL -2902454272,2902456319,US -2902456320,2902458367,NL -2902458368,2902476543,US -2902476544,2902476799,CW -2902476800,2902507519,US -2902507520,2902515711,CA -2902515712,2904555519,US -2904555520,2904817663,CA -2904817664,2904981503,US -2904981504,2905002152,NL -2905002153,2905002153,US -2905002154,2905014271,NL -2905014272,2905038847,IN -2905038848,2905047039,SG -2905047040,2905079807,HK -2905079808,2905345279,US -2905345280,2905345535,AU -2905345536,2905346815,US -2905346816,2905347071,JP -2905347072,2905348095,US -2905348096,2905348351,PH -2905348352,2905348863,US -2905348864,2905349119,NZ -2905349120,2905376207,US -2905376208,2905376223,GB -2905376224,2905390879,US -2905390880,2905390895,GB -2905390896,2905391599,US -2905391600,2905391615,GB -2905391616,2905402519,US -2905402520,2905402527,IN -2905402528,2905415679,US -2905415680,2905415935,GB -2905415936,2905473023,US -2905473024,2905481215,CA -2905481216,2905494783,US -2905494784,2905495039,DE -2905495040,2905510911,US -2905510912,2905511935,CA -2905511936,2905512959,US -2905512960,2905513471,CA -2905513472,2913992703,US -2913992704,2914516991,CA -2914516992,2915105791,US -2915105792,2915106047,NL -2915106048,2915106303,US -2915106304,2915106559,SG -2915106560,2915195647,US -2915195648,2915195903,CL -2915195904,2915196159,NL -2915196160,2915196415,TW -2915196416,2915196927,US -2915196928,2915197183,IE -2915197184,2915197439,US -2915197440,2915197695,FI -2915197696,2915215359,US -2915215360,2915215615,JP -2915215616,2915216127,NL -2915216128,2915216383,TW -2915216384,2915250175,US -2915250176,2915254271,CA -2915254272,2915516415,US -2915516416,2915516671,NL -2915516672,2915516927,CA -2915516928,2915517439,US -2915517440,2915518434,DK -2915518435,2915518435,FR -2915518436,2915518463,DK -2915518464,2915520511,GB -2915520512,2915520639,AU -2915520640,2915520647,US -2915520648,2915520671,AU -2915520672,2915520767,US -2915520768,2915521023,AU -2915521024,2915521279,JP -2915521280,2915521535,PL -2915521536,2915526911,US -2915526912,2915527167,DE -2915527168,2915527423,US -2915527424,2915527679,DE -2915527680,2915528703,NL -2915528704,2915528735,US -2915528736,2915528751,NL -2915528752,2915528783,US -2915528784,2915528791,NL -2915528792,2915528815,US -2915528816,2915528823,NL -2915528824,2915528863,US -2915528864,2915528879,NL -2915528880,2915528927,US -2915528928,2915528943,NL -2915528944,2915528959,US -2915528960,2915529023,NL -2915529024,2915529151,US -2915529152,2915529215,NL -2915529216,2915795013,US -2915795014,2915795014,MX -2915795015,2915894575,US -2915894576,2915894591,CA -2915894592,2915958783,US -2915958784,2916024319,CA -2916024320,2916163583,US -2916163584,2916168159,CA -2916168160,2916168167,US -2916168168,2916171775,CA -2916171776,2916184063,US -2916184064,2916196351,CA -2916196352,2916253695,US -2916253696,2916286463,CA -2916286464,2916287487,US -2916287488,2916287743,NL -2916287744,2916287999,CA -2916288000,2916290047,US -2916290048,2916290303,FR -2916290304,2916302847,US -2916302848,2916303359,CA -2916303360,2916303871,DE -2916303872,2916304383,CA -2916304384,2916304895,US -2916304896,2916305919,GB -2916305920,2916306943,US -2916306944,2916308991,ES -2916308992,2916310015,US -2916310016,2916310271,FR -2916310272,2916310527,US -2916310528,2916310783,GB -2916310784,2916311039,IT -2916311040,2916312063,US -2916312064,2916313087,IT -2916313088,2916314111,HK -2916314112,2916315135,DE -2916315136,2916316159,US -2916316160,2916317183,CN -2916317184,2916317439,US -2916317440,2916317695,CN -2916317696,2916317951,US -2916317952,2916318207,CN -2916318208,2916319231,GB -2916319232,2916335615,PR -2916335616,2916368383,US -2916368384,2916401151,CA -2916401152,2916417535,DE -2916417536,2916515839,US -2916515840,2916519935,CA -2916519936,2916581375,US -2916581376,2916599039,PR -2916599040,2916599295,US -2916599296,2916614143,PR -2916614144,2917031935,US -2917031936,2917032959,NL -2917032960,2917035007,US -2917035008,2917035519,NL -2917035520,2917040127,US -2917040128,2917041407,NL -2917041408,2917045503,US -2917045504,2917045759,NL -2917045760,2917058559,US -2917058560,2917059583,NL -2917059584,2917060607,US -2917060608,2917061631,NL -2917061632,2917068799,US -2917068800,2917069823,NL -2917069824,2917075455,US -2917075456,2917075967,NL -2917075968,2917078527,US -2917078528,2917079039,NL -2917079040,2917080063,US -2917080064,2917081087,NL -2917081088,2917099519,US -2917099520,2917100543,NL -2917100544,2917101567,US -2917101568,2917106175,NL -2917106176,2917112831,US -2917112832,2917113855,NL -2917113856,2917115903,US -2917115904,2917116927,NL -2917116928,2917167905,US -2917167906,2917167906,BZ -2917167907,2917171199,US -2917171200,2917175295,CA -2917175296,2917195775,US -2917195776,2917203967,CA -2917203968,2917257215,US -2917257216,2917261311,KY -2917261312,2917265407,US -2917265408,2917267775,JM -2917267776,2917267839,VG -2917267840,2917267967,AG -2917267968,2917268223,JM -2917268224,2917268479,BB -2917268480,2917269113,JM -2917269114,2917269114,TC -2917269115,2917269503,JM -2917269504,2917445887,US -2917445888,2917446143,DE -2917446144,2917449727,US -2917449728,2917457919,PR -2917457920,2917458943,US -2917458944,2917466111,PR -2917466112,2917572607,US -2917572608,2917580799,CA -2917580800,2917593295,US -2917593296,2917593303,CO -2917593304,2917597439,US -2917597440,2917597695,GB -2917597696,2917621759,US -2917621760,2917629951,CA -2917629952,2917646847,US -2917646848,2917647103,CN -2917647104,2917647359,US -2917647360,2917648383,CN -2917648384,2917648639,US -2917648640,2917648895,CN -2917648896,2917652223,US -2917652224,2917652479,AU -2917652480,2917653503,US -2917653504,2917654015,GB -2917654016,2917654271,US -2917654272,2917654527,CN -2917654528,2917654783,US -2917654784,2917655039,DE -2917655040,2917655551,US -2917655552,2917655807,CN -2917655808,2917656063,US -2917656064,2917656319,CN -2917656320,2917656831,US -2917656832,2917657087,CN -2917657088,2917660671,US -2917660672,2917661183,GB -2917661184,2917675263,US -2917675264,2917675519,CN -2917675520,2917676031,US -2917676032,2917676287,IN -2917676288,2917687295,US -2917687296,2917687551,RO -2917687552,2917688063,US -2917688064,2917688319,RO -2917688320,2917693951,US -2917693952,2917694207,CN -2917694208,2917699839,US -2917699840,2917700351,CA -2917700352,2917700959,US -2917700960,2917700967,CN -2917700968,2917704191,US -2917704192,2917704447,CA -2917704448,2917707519,US -2917707520,2917707775,CA -2917707776,2917710591,US -2917710592,2917710847,CA -2917710848,2917713919,US -2917713920,2917714175,CA -2917714176,2917826559,US -2917826560,2917828351,NL -2917828352,2917828479,IN -2917828480,2917828607,NL -2917828608,2917842175,US -2917842176,2917842431,CA -2917842432,2918014975,US -2918014976,2918023167,CA -2918023168,2918043647,US -2918043648,2918047743,CA -2918047744,2918051839,US -2918051840,2918121471,CA -2918121472,2918136831,US -2918136832,2918137087,CA -2918137088,2918154239,US -2918154240,2918170623,CA -2918170624,2918172790,US -2918172791,2918172793,MX -2918172794,2918172794,US -2918172795,2918172800,AR -2918172801,2918174463,US -2918174464,2918174719,MX -2918174720,2918180351,US -2918180352,2918180863,CA -2918180864,2918187007,US -2918187008,2918188031,CA -2918188032,2918232063,US -2918232064,2918236159,CA -2918236160,2918260735,US -2918260736,2918264831,CA -2918264832,2918277119,US -2918277120,2918281215,CA -2918281216,2918287359,US -2918287360,2918289407,GB -2918289408,2918314216,US -2918314217,2918314217,GB -2918314218,2918371327,US -2918371328,2918375423,CA -2918375424,2918391807,US -2918391808,2918395903,CA -2918395904,2918404095,US -2918404096,2918408191,PR -2918408192,2918432767,US -2918432768,2918436863,CA -2918436864,2918459391,US -2918459392,2918459647,CA -2918459648,2918463231,US -2918463232,2918463487,CA -2918463488,2918469631,US -2918469632,2918471423,CA -2918471424,2918471679,US -2918471680,2918472703,CA -2918472704,2918473215,US -2918473216,2918473727,CA -2918473728,2918477823,US -2918477824,2918481919,CA -2918481920,2918498431,US -2918498432,2918498435,JP -2918498436,2918498447,US -2918498448,2918498463,JP -2918498464,2918498499,US -2918498500,2918498501,JP -2918498502,2918498535,US -2918498536,2918498539,JP -2918498540,2918502911,US -2918502912,2918503167,SG -2918503168,2918514943,US -2918514944,2918515079,CA -2918515080,2918515199,US -2918515200,2918515327,CA -2918515328,2918527231,US -2918527232,2918527487,FR -2918527488,2918530559,US -2918530560,2918530815,HK -2918530816,2918536719,US -2918536720,2918536727,CA -2918536728,2918570239,US -2918570240,2918570495,JP -2918570496,2918580223,US -2918580224,2918588415,CA -2918588416,2918596607,US -2918596608,2918604287,CA -2918604288,2918612991,US -2918612992,2918621183,CA -2918621184,2918628351,US -2918628352,2918628607,DE -2918628608,2918653951,US -2918653952,2918662143,CA -2918662144,2918678527,US -2918678528,2918686719,CA -2918686720,2918699007,US -2918699008,2918703103,CA -2918703104,2918768639,US -2918768640,2918776831,HK -2918776832,2918793215,DE -2918793216,2918815999,US -2918816000,2918817023,GB -2918817024,2918817791,US -2918825984,2918828031,US -2918828032,2918828543,UA -2918828544,2918829055,ES -2918829056,2918829823,US -2918829824,2918830079,CN -2918830080,2918834175,CA -2918834176,2918842367,US -2918842368,2918875135,CA -2918875136,2918973439,US -2918973440,2918989823,CA -2918989824,2919021503,US -2919021504,2919021535,CA -2919021536,2919055359,US -2919055360,2919057407,CN -2919057408,2919059455,IN -2919059456,2919063551,CN -2919063552,2919064063,MX -2919064064,2919067647,CN -2919067648,2919068247,US -2919068248,2919068255,AU -2919068256,2919070983,US -2919070984,2919070991,GB -2919070992,2919174143,US -2919174144,2919178239,CA -2919178240,2919186431,US -2919186432,2919190527,CA -2919190528,2919204527,US -2919204528,2919204535,NL -2919204536,2919204543,US -2919204544,2919204551,NL -2919204552,2919204747,US -2919204748,2919204755,NL -2919204756,2919205027,US -2919205028,2919205031,NL -2919205032,2919206655,US -2919206656,2919206911,SG -2919206912,2919211007,CA -2919211008,2919235583,US -2919235584,2919759871,CA -2919759872,2921512703,US -2921512704,2921512959,CA -2921512960,2921530367,US -2921530368,2921530623,DE -2921530624,2921536561,US -2921536562,2921536569,CZ -2921536570,2921537434,US -2921537435,2921537435,CZ -2921537436,2921539583,US -2921539584,2921539839,PL -2921539840,2921540095,SE -2921540096,2921540351,DE -2921540352,2921541119,US -2921541120,2921541631,DE -2921541632,2921542143,US -2921542144,2921542399,CA -2921542400,2921542655,GB -2921542656,2921544959,US -2921544960,2921545727,DE -2921545728,2921545983,GB -2921545984,2921546239,IT -2921546240,2921546751,FR -2921546752,2921547007,GB -2921547008,2921547263,FR -2921547264,2921547519,US -2921547520,2921547775,DE -2921547776,2921549055,US -2921549056,2921549311,GB -2921549312,2921549823,NL -2921549824,2921550079,GB -2921550080,2921550335,DE -2921550336,2921550591,IT -2921550592,2921550847,US -2921550848,2921551103,IT -2921551104,2921551359,US -2921551360,2921551615,AR -2921551616,2921551871,BR -2921551872,2921552127,AR -2921552128,2921552383,US -2921552384,2921552639,MX -2921552640,2921552895,US -2921552896,2921553663,BR -2921553664,2921559039,US -2921559040,2921559295,NL -2921559296,2921559551,US -2921559552,2921559553,NL -2921559554,2921559557,GB -2921559558,2921559562,NL -2921559563,2921559802,GB -2921559803,2921559807,NL -2921559808,2921562111,US -2921562112,2921594879,CA -2921594880,2925002751,US -2925002752,2925527039,CA -2925527040,2926575615,US -2926575616,2927099903,CA -2927099904,2927577599,US -2927577600,2927577855,SG -2927577856,2927578623,US -2927578624,2927578879,SG -2927578880,2927581183,US -2927581184,2927581439,SG -2927581440,2927582863,US -2927582864,2927582879,SG -2927582880,2927582935,US -2927582936,2927582943,SG -2927582944,2927981567,US -2927981568,2927982591,SG -2927982592,2928175551,US -2928175552,2928175559,VN -2928175560,2928177151,US -2928177152,2928181247,CA -2928181248,2928200191,US -2928200192,2928200447,AU -2928200448,2928201983,US -2928201984,2928202239,JP -2928202240,2928204799,US -2928204800,2928205055,NZ -2928205056,2928206335,US -2928206336,2928206591,PH -2928206592,2928226303,US -2928226304,2928230399,CA -2928230400,2928261375,US -2928261376,2928261695,CA -2928261696,2928261711,NL -2928261712,2928261887,CA -2928261888,2928263167,US -2928263168,2928279551,CA -2928279552,2928283647,US -2928283648,2928287743,SG -2928287744,2928304127,US -2928304128,2928305151,NL -2928305152,2928306175,US -2928306176,2928307199,NL -2928307200,2928308223,US -2928308224,2928309247,CA -2928309248,2928312319,US -2928312320,2928316415,CA -2928316416,2928320511,HK -2928320512,2928328703,US -2928328704,2928336895,CA -2928336896,2928455679,US -2928455680,2928459775,CA -2928459776,2928474623,US -2928474624,2928474879,GB -2928474880,2928475135,FR -2928475136,2928541695,US -2928541696,2928553303,CA -2928553304,2928553311,HU -2928553312,2928555831,CA -2928555832,2928555839,SE -2928555840,2928558943,CA -2928558944,2928558951,PE -2928558952,2928564447,CA -2928564448,2928564455,MX -2928564456,2928570671,CA -2928570672,2928570687,FR -2928570688,2928579543,CA -2928579544,2928579551,HU -2928579552,2928583735,CA -2928583736,2928583743,SY -2928583744,2928583983,CA -2928583984,2928583991,SE -2928583992,2928588399,CA -2928588400,2928588407,AE -2928588408,2928595959,CA -2928595960,2928595967,US -2928595968,2928598919,CA -2928598920,2928598927,SA -2928598928,2928607231,CA -2928607232,2928633199,US -2928633200,2928633215,CA -2928633216,2936012799,US -2936012800,2937847807,CN -2937847808,2937848831,KH -2937848832,2937849855,JP -2937849856,2937850879,SG -2937850880,2937851903,MY -2937851904,2937855999,JP -2937856000,2937860095,KR -2937860096,2937864191,JP -2937864192,2937880575,SG -2937880576,2937913343,JP -2937913344,2937978879,BD -2937978880,2938109951,CN -2938109952,2938634239,AU -2938634240,2938699775,IN -2938699776,2938700031,PH -2938700032,2938700033,ID -2938700034,2938700043,TW -2938700044,2938700044,ID -2938700045,2938700046,TW -2938700047,2938700161,ID -2938700162,2938700173,TW -2938700174,2938700174,ID -2938700175,2938700183,TW -2938700184,2938700184,ID -2938700185,2938700190,TW -2938700191,2938700193,ID -2938700194,2938700222,TW -2938700223,2938700287,ID -2938700288,2938700543,AE -2938700544,2938700586,SG -2938700587,2938700589,HK -2938700590,2938700590,SG -2938700591,2938700592,HK -2938700593,2938700596,SG -2938700597,2938700597,HK -2938700598,2938700600,SG -2938700601,2938700601,HK -2938700602,2938700649,SG -2938700650,2938700670,HK -2938700671,2938701055,SG -2938701056,2938701311,IQ -2938701312,2938701567,HK -2938701568,2938702079,IN -2938702080,2938703103,HK -2938703104,2938703359,IL -2938703360,2938703615,EG -2938703616,2938703871,IN -2938703872,2938707967,HK -2938707968,2938710015,JP -2938710016,2938711039,AU -2938711040,2938712063,BD -2938712064,2938716159,TW -2938716160,2938732543,JP -2938732544,2938748927,SG -2938748928,2938765311,JP -2938765312,2938961919,CN -2938961920,2938978303,HK -2938978304,2938986495,AU -2938986496,2938986751,NZ -2938986752,2938988031,AU -2938988032,2938988287,NZ -2938988288,2938996735,AU -2938996736,2938998783,JP -2938998784,2939002879,AU -2939002880,2939004927,KR -2939004928,2939006975,JP -2939006976,2939007999,KP -2939008000,2939009023,IN -2939009024,2939011071,ID -2939011072,2939027455,KR -2939027456,2942304255,CN -2942304256,2942566399,TW -2942566400,2942599167,KH -2942599168,2942608383,IN -2942608384,2942608639,HK -2942608640,2942608895,US -2942608896,2942609407,HK -2942609408,2942615551,IN -2942615552,2942619647,HK -2942619648,2942631935,JP -2942631936,2942697471,IN -2942697472,2942763007,CN -2942763008,2942767103,JP -2942767104,2942771199,AU -2942771200,2942779391,ID -2942779392,2942795775,VN -2942795776,2942959615,JP -2942959616,2942960639,VN -2942960640,2942961663,AU -2942961664,2942965759,ID -2942965760,2942967807,AU -2942967808,2942975999,AF -2942976000,2942992383,KR -2942992384,2943025151,CN -2943025152,2943041535,PK -2943041536,2943057919,KR -2943057920,2943074303,AU -2943074304,2943090687,PK -2943090688,2943221759,JP -2943221760,2943291391,PK -2943291392,2943295487,KR -2943295488,2943303679,TW -2943303680,2943309823,JP -2943309824,2943310847,ID -2943310848,2943311871,JP -2943311872,2943312895,HK -2943312896,2943313919,NZ -2943313920,2943314943,SG -2943314944,2943315967,CN -2943315968,2943318015,ID -2943318016,2943320063,JP -2943320064,2943324159,IN -2943324160,2943332351,CN -2943332352,2943333375,AU -2943333376,2943334399,IN -2943334400,2943335423,CN -2943335424,2943336447,IN -2943336448,2943352831,TW -2943352832,2944401407,KR -2944401408,2944925695,JP -2944925696,2945581055,MY -2945581056,2946236415,CN -2946236416,2946301951,SG -2946301952,2946367487,LK -2946367488,2946375679,KR -2946375680,2946383871,ID -2946383872,2946392063,IN -2946392064,2946393087,CN -2946393088,2946394111,HK -2946394112,2946396159,AU -2946396160,2946400255,JP -2946400256,2946416639,NC -2946416640,2946433023,PH -2946433024,2946498559,HK -2946498560,2947547135,CN -2947547136,2947579903,PH -2947579904,2947583999,KR -2947584000,2947586047,TO -2947586048,2947587071,HK -2947587072,2947588095,CN -2947588096,2947590143,ID -2947590144,2947590655,JP -2947590656,2947590911,SG -2947590912,2947590927,HK -2947590928,2947591023,SG -2947591024,2947591031,HK -2947591032,2947591039,SG -2947591040,2947591071,HK -2947591072,2947591090,SG -2947591091,2947591091,HK -2947591092,2947591167,SG -2947591168,2947591183,HK -2947591184,2947591679,SG -2947591680,2947591695,JP -2947591696,2947592191,SG -2947592192,2947593215,CN -2947593216,2947594239,HK -2947594240,2947595263,IN -2947595264,2947596287,CN -2947597312,2947598335,JP -2947598336,2947602431,AU -2947602432,2947603455,NZ -2947603456,2947604479,TH -2947604480,2947609855,HK -2947609856,2947610111,AF -2947610112,2947612671,HK -2947612672,2947678207,JP -2947678208,2947743743,CN -2947743744,2947809279,JP -2947809280,2948071423,TW -2948071424,2948104191,JP -2948104192,2948120575,CN -2948120576,2948128767,AU -2948128768,2948132863,ID -2948132864,2948134911,TW -2948134912,2948135935,ID -2948135936,2948136959,IN -2948136960,2948595711,CN -2948595712,2952790015,KR -2952790016,2953314303,DE -2953314304,2953379839,UA -2953379840,2953445375,DE -2953445376,2953453567,IT -2953453568,2953455615,IS -2953455616,2953457663,SK -2953457664,2953459711,DE -2953459712,2953461759,IT -2953461760,2953465855,ES -2953465856,2953466127,GB -2953466368,2953466879,GB -2953466880,2953467135,RO -2953467392,2953467903,GB -2953467904,2953469951,BE -2953469952,2953478143,CH -2953478144,2953503551,SE -2953503552,2953503559,NO -2953503560,2953510911,SE -2953510912,2953576447,NO -2953576448,2953592831,BG -2953592832,2953596927,IR -2953596928,2953598975,ES -2953598976,2953601023,IT -2953601024,2953603071,RU -2953603072,2953605119,GB -2953605120,2953609215,CZ -2953609216,2953707519,IL -2953707520,2953838591,RU -2953838592,2954100735,SA -2954100736,2954362879,DK -2954362880,2954625023,GB -2954625024,2954641407,DE -2954641408,2954643455,RU -2954643456,2954645503,IQ -2954645504,2954647551,AZ -2954647552,2954657791,ES -2954657792,2954756095,JO -2954756096,2954821631,TR -2954821632,2954821947,FR -2954821948,2954821951,DE -2954821952,2954822079,FR -2954822080,2954822143,ES -2954822144,2954822279,FR -2954822280,2954822283,ES -2954822284,2954822323,FR -2954822324,2954822327,FI -2954822328,2954822447,FR -2954822448,2954822455,ES -2954822456,2954822591,FR -2954822592,2954822599,GB -2954822600,2954822927,FR -2954822928,2954822931,DE -2954822932,2954823259,FR -2954823260,2954823263,GB -2954823264,2954823687,FR -2954823688,2954823695,NL -2954823696,2954823887,FR -2954823888,2954823891,ES -2954823892,2954823999,FR -2954824000,2954824015,ES -2954824016,2954824095,FR -2954824096,2954824127,FI -2954824128,2954824255,FR -2954824256,2954824259,ES -2954824260,2954824287,FR -2954824288,2954824319,ES -2954824320,2954824351,DE -2954824352,2954824415,FR -2954824416,2954824431,GB -2954824432,2954824511,FR -2954824512,2954824527,FI -2954824528,2954824639,FR -2954824640,2954824655,GB -2954824656,2954824687,FR -2954824688,2954824703,FI -2954824704,2954824923,FR -2954824924,2954824927,ES -2954824928,2954824991,FR -2954824992,2954825007,ES -2954825008,2954825063,FR -2954825064,2954825067,ES -2954825068,2954825183,FR -2954825184,2954825191,ES -2954825192,2954825247,FR -2954825248,2954825263,GB -2954825264,2954825267,PL -2954825268,2954825311,FR -2954825312,2954825315,GB -2954825316,2954825319,ES -2954825320,2954825387,FR -2954825388,2954825391,ES -2954825392,2954825403,FR -2954825404,2954825407,ES -2954825408,2954825535,FR -2954825536,2954825539,ES -2954825540,2954825663,FR -2954825664,2954825727,GB -2954825728,2954826015,FR -2954826016,2954826019,PT -2954826020,2954826031,FR -2954826032,2954826035,ES -2954826036,2954826143,FR -2954826144,2954826147,CZ -2954826148,2954826159,FR -2954826160,2954826163,ES -2954826164,2954826471,FR -2954826472,2954826475,GB -2954826476,2954826759,FR -2954826760,2954826763,ES -2954826764,2954826775,FR -2954826776,2954826779,ES -2954826780,2954826815,FR -2954826816,2954826879,GB -2954826880,2954827007,FR -2954827008,2954827135,ES -2954827136,2954827599,FR -2954827600,2954827615,BE -2954827616,2954827647,NL -2954827648,2954827799,FR -2954827800,2954827807,DE -2954827808,2954827939,FR -2954827940,2954827943,PT -2954827944,2954828335,FR -2954828336,2954828339,ES -2954828340,2954828511,FR -2954828512,2954828543,CZ -2954828544,2954828847,FR -2954828848,2954828863,GB -2954828864,2954828975,FR -2954828976,2954828979,GB -2954828980,2954829007,FR -2954829008,2954829023,IE -2954829024,2954829407,FR -2954829408,2954829423,ES -2954829424,2954829623,FR -2954829624,2954829631,ES -2954829632,2954829647,GB -2954829648,2954829679,FR -2954829680,2954829695,NL -2954829696,2954829711,ES -2954829712,2954829739,FR -2954829740,2954829743,GB -2954829744,2954829751,FR -2954829752,2954829752,ES -2954829753,2954829759,FR -2954829760,2954829823,ES -2954829824,2954829843,FR -2954829844,2954829847,DE -2954829848,2954829855,FI -2954829856,2954830111,FR -2954830112,2954830127,IE -2954830128,2954830163,FR -2954830164,2954830167,PT -2954830168,2954830395,FR -2954830396,2954830399,ES -2954830400,2954830523,FR -2954830524,2954830527,DE -2954830528,2954831247,FR -2954831248,2954831251,ES -2954831252,2954831807,FR -2954831808,2954831823,ES -2954831824,2954832003,FR -2954832004,2954832007,BE -2954832008,2954832031,FR -2954832032,2954832063,PL -2954832064,2954832151,FR -2954832152,2954832155,DE -2954832156,2954832159,FR -2954832160,2954832167,PT -2954832168,2954832255,FR -2954832256,2954832287,GB -2954832288,2954832343,FR -2954832344,2954832347,CH -2954832348,2954832351,ES -2954832352,2954832399,FR -2954832400,2954832415,FI -2954832416,2954832447,FR -2954832448,2954832479,CZ -2954832480,2954832607,FR -2954832608,2954832639,PT -2954832640,2954832767,FR -2954832768,2954832771,DE -2954832772,2954832843,FR -2954832844,2954832847,GB -2954832848,2954832891,FR -2954832892,2954832895,ES -2954832896,2954833343,FR -2954833344,2954833375,GB -2954833376,2954833419,FR -2954833420,2954833423,PL -2954833424,2954833455,FR -2954833456,2954833471,ES -2954833472,2954833567,FR -2954833568,2954833571,ES -2954833572,2954833727,FR -2954833728,2954833731,ES -2954833732,2954833823,FR -2954833824,2954833855,GB -2954833856,2954833967,FR -2954833968,2954833983,ES -2954833984,2954834143,FR -2954834144,2954834151,GB -2954834152,2954834519,FR -2954834520,2954834523,ES -2954834524,2954834611,FR -2954834612,2954834615,ES -2954834616,2954834671,FR -2954834672,2954834675,ES -2954834676,2954834847,FR -2954834848,2954834863,ES -2954834864,2954835039,FR -2954835040,2954835043,DE -2954835044,2954835067,FR -2954835068,2954835071,FI -2954835072,2954835295,FR -2954835296,2954835299,ES -2954835300,2954835419,FR -2954835420,2954835423,GB -2954835424,2954835443,FR -2954835444,2954835447,ES -2954835448,2954835451,FR -2954835452,2954835455,ES -2954835456,2954835511,FR -2954835512,2954835519,ES -2954835520,2954835619,FR -2954835620,2954835620,ES -2954835621,2954835647,FR -2954835648,2954835655,ES -2954835656,2954836963,FR -2954836964,2954836967,IE -2954836968,2954836983,FR -2954836984,2954836991,PT -2954836992,2954837071,FR -2954837072,2954837075,ES -2954837076,2954837279,FR -2954837280,2954837295,DE -2954837296,2954837311,FR -2954837312,2954837319,FI -2954837320,2954837327,FR -2954837328,2954837335,GB -2954837336,2954837439,FR -2954837440,2954837471,GB -2954837472,2954837535,FR -2954837536,2954837543,PT -2954837544,2954837579,FR -2954837580,2954837583,GB -2954837584,2954837599,FR -2954837600,2954837607,GB -2954837608,2954837667,FR -2954837668,2954837671,ES -2954837672,2954837743,FR -2954837744,2954837751,CZ -2954837752,2954837759,BE -2954837760,2954837827,FR -2954837828,2954837831,DE -2954837832,2954837867,FR -2954837868,2954837871,ES -2954837872,2954838103,FR -2954838104,2954838107,DE -2954838108,2954838155,FR -2954838156,2954838159,BE -2954838160,2954838175,FR -2954838176,2954838179,GB -2954838180,2954838215,FR -2954838216,2954838219,GB -2954838220,2954838247,FR -2954838248,2954838255,ES -2954838256,2954838599,FR -2954838600,2954838607,GB -2954838608,2954838655,FR -2954838656,2954838687,BE -2954838688,2954838911,FR -2954838912,2954838915,DE -2954838916,2954838991,FR -2954838992,2954838995,DE -2954838996,2954839071,FR -2954839072,2954839087,LT -2954839088,2954839111,FR -2954839112,2954839119,ES -2954839120,2954839243,FR -2954839244,2954839247,ES -2954839248,2954839267,FR -2954839268,2954839271,ES -2954839272,2954839319,FR -2954839320,2954839327,GB -2954839328,2954839527,FR -2954839528,2954839535,GB -2954839536,2954839543,FR -2954839544,2954839547,NL -2954839548,2954840095,FR -2954840096,2954840103,ES -2954840104,2954840255,FR -2954840256,2954840447,GB -2954840448,2954840515,FR -2954840516,2954840519,NL -2954840520,2954840611,FR -2954840612,2954840615,GB -2954840616,2954840767,FR -2954840768,2954840775,GB -2954840776,2954840927,FR -2954840928,2954840931,DE -2954840932,2954841023,FR -2954841024,2954841087,ES -2954841088,2954841095,FR -2954841096,2954841103,GB -2954841104,2954841111,ES -2954841112,2954841259,FR -2954841260,2954841263,GB -2954841264,2954841583,FR -2954841584,2954841591,ES -2954841592,2954841707,FR -2954841708,2954841711,NL -2954841712,2954841851,FR -2954841852,2954841855,ES -2954841856,2954841999,FR -2954842000,2954842015,LT -2954842016,2954842075,FR -2954842076,2954842079,GB -2954842080,2954842111,FR -2954842112,2954842143,FI -2954842144,2954842175,FR -2954842176,2954842239,BE -2954842240,2954842243,ES -2954842244,2954842247,FR -2954842248,2954842251,ES -2954842252,2954842375,FR -2954842376,2954842383,ES -2954842384,2954842411,FR -2954842412,2954842415,GB -2954842416,2954842471,FR -2954842472,2954842479,GB -2954842480,2954843043,FR -2954843044,2954843047,GB -2954843048,2954843187,FR -2954843188,2954843191,GB -2954843192,2954843479,FR -2954843480,2954843487,NL -2954843488,2954843503,FR -2954843504,2954843507,ES -2954843508,2954843759,FR -2954843760,2954843771,ES -2954843772,2954844147,FR -2954844148,2954844151,DE -2954844152,2954844191,FR -2954844192,2954844223,NL -2954844224,2954844239,DE -2954844240,2954844263,FR -2954844264,2954844267,IE -2954844268,2954844275,FR -2954844276,2954844279,GB -2954844280,2954844943,FR -2954844944,2954844947,GB -2954844948,2954844999,FR -2954845000,2954845003,ES -2954845004,2954845055,FR -2954845056,2954845059,PT -2954845060,2954845087,FR -2954845088,2954845091,FI -2954845092,2954845283,FR -2954845284,2954845287,GB -2954845288,2954845291,PL -2954845292,2954845363,FR -2954845364,2954845367,ES -2954845368,2954845951,FR -2954845952,2954845967,ES -2954845968,2954846107,FR -2954846108,2954846111,ES -2954846112,2954846119,FR -2954846120,2954846123,IE -2954846124,2954846139,FR -2954846140,2954846143,ES -2954846144,2954854415,FR -2954854416,2954854431,GB -2954854432,2954854607,FR -2954854608,2954854615,ES -2954854616,2954854751,FR -2954854752,2954854783,PT -2954854784,2954855051,FR -2954855052,2954855055,ES -2954855056,2954855059,FR -2954855060,2954855063,ES -2954855064,2954855075,FR -2954855076,2954855079,ES -2954855080,2954855167,FR -2954855168,2954855183,ES -2954855184,2954855507,FR -2954855508,2954855511,DE -2954855512,2954855515,FR -2954855516,2954855519,ES -2954855520,2954855527,FR -2954855528,2954855535,ES -2954855536,2954855647,FR -2954855648,2954855651,CZ -2954855652,2954855663,FR -2954855664,2954855679,PT -2954855680,2954855743,FR -2954855744,2954855807,BE -2954855808,2954855871,DE -2954855872,2954855879,FR -2954855880,2954855887,ES -2954855888,2954856179,FR -2954856180,2954856183,ES -2954856184,2954856447,FR -2954856448,2954856511,ES -2954856512,2954856559,FR -2954856560,2954856563,ES -2954856564,2954856631,FR -2954856632,2954856635,GB -2954856636,2954857119,FR -2954857120,2954857135,PT -2954857136,2954857583,FR -2954857584,2954857599,ES -2954857600,2954857823,FR -2954857824,2954857855,ES -2954857856,2954857983,IE -2954857984,2954858031,FR -2954858032,2954858035,GB -2954858036,2954858043,FR -2954858044,2954858047,PT -2954858048,2954858079,FR -2954858080,2954858095,ES -2954858096,2954858431,FR -2954858432,2954858439,GB -2954858440,2954858495,FR -2954858496,2954858751,ES -2954858752,2954858827,FR -2954858828,2954858831,GB -2954858832,2954858911,FR -2954858912,2954858943,ES -2954858944,2954859027,FR -2954859028,2954859031,PT -2954859032,2954859043,FR -2954859044,2954859047,ES -2954859048,2954859315,FR -2954859316,2954859319,ES -2954859320,2954859323,FR -2954859324,2954859327,ES -2954859328,2954859455,FR -2954859456,2954859471,DE -2954859472,2954859871,FR -2954859872,2954859903,ES -2954859904,2954859959,FR -2954859960,2954859963,ES -2954859964,2954860459,FR -2954860460,2954860463,GB -2954860464,2954861651,FR -2954861652,2954861655,GB -2954861656,2954861763,FR -2954861764,2954861767,GB -2954861768,2954861867,FR -2954861868,2954861871,CZ -2954861872,2954861875,FR -2954861876,2954861879,CH -2954861880,2954861959,FR -2954861960,2954861967,GB -2954861968,2954861975,ES -2954861976,2954861987,FR -2954861988,2954861991,BE -2954861992,2954862079,FR -2954862080,2954862095,ES -2954862096,2954862287,FR -2954862288,2954862303,LT -2954862304,2954862415,FR -2954862416,2954862419,ES -2954862420,2954862479,FR -2954862480,2954862495,ES -2954862496,2954865663,FR -2954865664,2954865919,ES -2954865920,2954867041,FR -2954867042,2954867043,PT -2954867044,2954870799,FR -2954870800,2954870803,ES -2954870804,2954870843,FR -2954870844,2954870847,ES -2954870848,2954870903,FR -2954870904,2954870907,ES -2954870908,2954871615,FR -2954871616,2954871623,BE -2954871624,2954871679,FR -2954871680,2954871695,FI -2954871696,2954871759,FR -2954871760,2954871775,PL -2954871776,2954871807,FR -2954871808,2954871823,ES -2954871824,2954871955,FR -2954871956,2954871959,PT -2954871960,2954871983,FR -2954871984,2954871999,PT -2954872000,2954872331,FR -2954872332,2954872335,GB -2954872336,2954872551,FR -2954872552,2954872555,GB -2954872556,2954872607,FR -2954872608,2954872639,ES -2954872640,2954872679,FR -2954872680,2954872687,ES -2954872688,2954873351,FR -2954873352,2954873355,GB -2954873356,2954873695,FR -2954873696,2954873727,FI -2954873728,2954873839,FR -2954873840,2954873847,ES -2954873848,2954873879,FR -2954873880,2954873887,PT -2954873888,2954873919,FR -2954873920,2954873983,IE -2954873984,2954874111,GB -2954874112,2954874127,FR -2954874128,2954874135,ES -2954874136,2954874347,FR -2954874348,2954874355,ES -2954874356,2954874415,FR -2954874416,2954874419,GB -2954874420,2954874431,FR -2954874432,2954874447,GB -2954874448,2954874527,FR -2954874528,2954874559,FI -2954874560,2954874655,FR -2954874656,2954874663,DE -2954874664,2954874943,FR -2954874944,2954874975,ES -2954874976,2954875075,FR -2954875076,2954875079,BE -2954875080,2954875135,FR -2954875136,2954875167,GB -2954875168,2954875467,FR -2954875468,2954875471,GB -2954875472,2954875583,FR -2954875584,2954875587,ES -2954875588,2954875711,FR -2954875712,2954875775,DE -2954875776,2954875879,FR -2954875880,2954875883,ES -2954875884,2954875891,FR -2954875892,2954875895,ES -2954875896,2954875967,FR -2954875968,2954875999,FI -2954876000,2954876043,FR -2954876044,2954876047,GB -2954876048,2954876247,FR -2954876248,2954876255,ES -2954876256,2954876351,FR -2954876352,2954876383,ES -2954876384,2954876559,FR -2954876560,2954876575,LT -2954876576,2954876655,FR -2954876656,2954876663,BE -2954876664,2954876871,FR -2954876872,2954876875,ES -2954876876,2954876887,FR -2954876888,2954876891,ES -2954876892,2954877103,FR -2954877104,2954877107,PL -2954877108,2954877163,FR -2954877164,2954877167,ES -2954877168,2954877523,FR -2954877524,2954877527,ES -2954877528,2954877535,PT -2954877536,2954877727,FR -2954877728,2954877743,IE -2954877744,2954877759,FR -2954877760,2954877775,CZ -2954877776,2954877819,FR -2954877820,2954877823,ES -2954877824,2954877967,FR -2954877968,2954877983,PT -2954877984,2954878143,FR -2954878144,2954878207,ES -2954878208,2954878271,FR -2954878272,2954878335,IT -2954878336,2954878471,FR -2954878472,2954878475,GB -2954878476,2954878607,FR -2954878608,2954878623,FI -2954878624,2954878695,FR -2954878696,2954878703,IE -2954878704,2954878855,FR -2954878856,2954878863,IE -2954878864,2954878899,FR -2954878900,2954878903,GB -2954878904,2954878907,FR -2954878908,2954878911,ES -2954878912,2954878931,FR -2954878932,2954878935,GB -2954878936,2954887167,FR -2954887168,2954891263,UA -2954891264,2954895359,IT -2954895360,2954897407,RU -2954897408,2954899455,DE -2954899456,2954901503,ES -2954901504,2954903551,IT -2954903552,2954911743,JP -2954911744,2954913791,US -2954913792,2954915839,IE -2954915840,2954918911,US -2954918912,2954919167,NL -2954919168,2954919295,US -2954919296,2954919423,NL -2954919424,2954919935,IE -2954919936,2954928127,RU -2954928128,2954932223,PL -2954932224,2954936319,RU -2954936320,2954938367,AM -2954938368,2954940415,HU -2954940416,2954944511,DE -2954944512,2954946559,GB -2954946560,2954948607,DE -2954948608,2954950655,RU -2954950656,2954952703,ES -2954952704,2955018239,TR -2955018240,2955027726,JP -2955027727,2955027727,IE -2955027728,2955034623,JP -2955034624,2955083775,IE -2955083776,2955149311,GB -2955149312,2955411455,UA -2955411456,2955673599,TR -2955673600,2955804671,SA -2955804672,2955837439,EE -2955837440,2955845631,IR -2955845632,2955853823,GB -2955853824,2955870207,CH -2955870208,2955935743,SA -2955935744,2956230655,RU -2956230656,2956238847,SI -2956238848,2956240383,ES -2956240384,2956240895,HK -2956240896,2956242943,ES -2956244992,2956245247,FR -2956245248,2956245503,RO -2956245504,2956245759,GB -2956245760,2956246015,DE -2956246016,2956247039,FR -2956247040,2956251135,DE -2956251136,2956253183,GB -2956253184,2956255231,IE -2956255232,2956259327,FR -2956259328,2956261375,DE -2956261376,2956263423,ES -2956263424,2956296191,TR -2956312576,2956328959,RU -2956328960,2956460031,TR -2956460032,2956468223,RU -2956468224,2956470271,LV -2956472320,2956474367,RU -2956474368,2956476415,GB -2956476416,2956492799,ES -2956492800,2956496895,CH -2956496896,2956500991,IR -2956500992,2956503039,NL -2956503040,2956504063,CY -2956504064,2956504319,CH -2956504320,2956504575,NL -2956504576,2956504831,CH -2956504832,2956506111,NL -2956506112,2956506367,GB -2956506368,2956509183,NL -2956509184,2956517375,GB -2956517376,2956521471,NL -2956521472,2956525567,SE -2956525568,2956533759,JO -2956533760,2956535807,FR -2956535808,2956537855,LV -2956537856,2956541951,UA -2956544000,2956546047,RU -2956546048,2956548095,FR -2956548096,2956549119,SE -2956549120,2956550143,SI -2956550144,2956554239,ES -2956554240,2956558335,IT -2956558336,2956574719,DE -2956574720,2956576767,SE -2956576768,2956578815,ES -2956578816,2956582911,RU -2956582912,2956587007,IS -2956587008,2956589055,FR -2956589056,2956593151,GB -2956593152,2956595199,ES -2956595200,2956597247,PL -2956597248,2956599295,NL -2956599296,2956602367,RU -2956602368,2956602623,NL -2956602624,2956602879,SE -2956602880,2956603135,GB -2956603136,2956604671,RU -2956604672,2956604927,NL -2956604928,2956605183,RU -2956605184,2956605439,NL -2956605440,2956605695,DE -2956605696,2956607487,RU -2956607488,2956611583,PS -2956611584,2956613631,IT -2956614912,2956615167,NL -2956615168,2956615423,FR -2956615680,2956623871,GB -2956623872,2956656639,GR -2956656640,2956722175,RU -2956722176,2956787711,BY -2956787712,2956820479,IE -2956820480,2956822527,NL -2956822528,2956823807,SE -2956823808,2956824063,BE -2956824064,2956824575,SE -2956824576,2956826623,PT -2956826624,2956828671,HR -2956828672,2956833279,BA -2956833280,2956833791,AT -2956833792,2956836863,BA -2956836864,2956853247,SK -2956853248,2956865535,HR -2956865536,2956869631,IT -2956869632,2956886015,RU -2956886016,2956888063,GB -2956888064,2956890111,BE -2956890112,2956892159,IR -2956892160,2956894207,IT -2956894208,2956898303,BE -2956898304,2956902399,RU -2956902400,2956904447,NL -2956904448,2956906495,DK -2956906496,2956908543,GB -2956908544,2956910591,RU -2956910592,2956914687,CZ -2956914688,2956918783,RU -2956918784,2956984319,HU -2956984320,2957049855,SE -2957049856,2957058047,PS -2957058048,2957066239,RU -2957066240,2957068287,GB -2957068288,2957070335,LU -2957070336,2957074431,IT -2957074432,2957082623,RU -2957082624,2957090815,DE -2957090816,2957115391,IR -2957115392,2957180927,AT -2957180928,2957189119,UA -2957189120,2957193215,LV -2957193216,2957195263,RU -2957195264,2957197311,PS -2957197312,2957201407,IR -2957201408,2957201423,GB -2957201424,2957202679,US -2957202680,2957202680,PT -2957202681,2957202687,US -2957202688,2957202691,RU -2957202692,2957202699,IE -2957202700,2957202703,JP -2957202704,2957202944,US -2957202945,2957202947,AL -2957202948,2957202951,AD -2957202952,2957202955,AR -2957202956,2957202959,AU -2957202960,2957202963,BY -2957202964,2957202967,BE -2957202968,2957202971,BA -2957202972,2957202975,BR -2957202976,2957202979,BG -2957202980,2957202983,CL -2957202984,2957202987,CN -2957202988,2957202991,CO -2957202992,2957202995,CR -2957202996,2957202999,HR -2957203000,2957203003,CY -2957203004,2957203007,CZ -2957203008,2957203011,DK -2957203012,2957203015,EG -2957203016,2957203019,EE -2957203020,2957203023,FJ -2957203024,2957203027,FI -2957203028,2957203031,FR -2957203032,2957203035,GE -2957203036,2957203039,DE -2957203040,2957203043,GR -2957203044,2957203047,HK -2957203048,2957203051,HU -2957203052,2957203055,IS -2957203056,2957203059,IN -2957203060,2957203063,IE -2957203064,2957203067,IL -2957203068,2957203071,IT -2957203072,2957203075,JP -2957203076,2957203079,KR -2957203080,2957203083,LV -2957203084,2957203087,LI -2957203088,2957203091,LT -2957203092,2957203095,LU -2957203096,2957203099,MK -2957203100,2957203103,MY -2957203104,2957203107,MX -2957203108,2957203111,NL -2957203112,2957203115,NZ -2957203116,2957203119,NO -2957203120,2957203123,US -2957203124,2957203127,MT -2957203128,2957203131,XK -2957203132,2957203196,GB -2957203197,2957203199,US -2957203200,2957203455,GB -2957203456,2957205503,FR -2957205504,2957213695,PS -2957213696,2957221887,FR -2957221888,2957223935,GB -2957223936,2957223999,FR -2957224000,2957224063,GB -2957224064,2957224191,FR -2957224192,2957224447,DE -2957224448,2957224959,GB -2957224960,2957225215,FR -2957225216,2957228031,GB -2957228032,2957230079,DK -2957230080,2957238271,RS -2957238272,2957240319,CZ -2957240320,2957242367,BG -2957242368,2957244415,RU -2957244416,2957246463,HU -2957246464,2957336575,SE -2957336576,2957344767,KZ -2957344768,2957352959,SE -2957352960,2957361151,KZ -2957361152,2957508607,SE -2957508608,2957574143,FI -2957574144,2957639679,GE -2957639680,2957641727,GB -2957641728,2957643775,RU -2957643776,2957647871,GB -2957647872,2957649919,FR -2957649920,2957651967,CH -2957651968,2957654015,AE -2957654016,2957656063,DE -2957656064,2957672447,GE -2957672448,2957680639,CZ -2957680640,2957688831,GB -2957688832,2957690879,SE -2957690880,2957692927,RU -2957692928,2957694975,NO -2957694976,2957697023,CZ -2957697024,2957705215,NL -2957705216,2957770751,NO -2957770752,2957836287,SI -2957836288,2957869055,RU -2957869056,2957901823,HU -2957901824,2958032895,PT -2958032896,2958557183,ES -2958557184,2958819327,TR -2958819328,2958884863,GR -2958884864,2958950399,FI -2958950400,2959081471,DE -2959081472,2959089663,RU -2959089664,2959093759,PL -2959093760,2959097855,RO -2959097856,2959099903,RU -2959099904,2959101951,UA -2959101952,2959103999,RU -2959104000,2959106047,RO -2959106048,2959114239,AT -2959114240,2959118335,RU -2959118336,2959120383,PL -2959120384,2959122431,AT -2959122432,2959126527,PL -2959126528,2959128575,RO -2959128576,2959130623,RU -2959130624,2959138815,UA -2959138816,2959147007,RU -2959147008,2959149055,UA -2959149056,2959151103,CZ -2959151104,2959155199,PL -2959155200,2959159295,RU -2959159296,2959161343,PL -2959161344,2959163391,UA -2959163392,2959167487,GB -2959167488,2959171583,PL -2959171584,2959175679,RU -2959175680,2959179775,UA -2959179776,2959181823,RU -2959181824,2959183871,PL -2959183872,2959185919,RO -2959186944,2959187455,CY -2959187456,2959187711,AT -2959187712,2959187967,FR -2959187968,2959204351,RU -2959204352,2959208447,ES -2959208448,2959210495,CZ -2959210496,2959212543,PL -2959212544,2959220735,UA -2959224832,2959226879,RU -2959226880,2959228927,RO -2959228928,2959237119,UA -2959237120,2959241215,CZ -2959241216,2959245311,PL -2959245312,2959253503,RU -2959253504,2959255551,DE -2959255552,2959261695,RU -2959261696,2959265791,KZ -2959265792,2959269887,ES -2959269888,2959275007,KZ -2959275008,2959278079,CZ -2959278080,2959282175,RU -2959282176,2959286271,SA -2959286272,2959290367,RO -2959290368,2959292415,PL -2959292416,2959302655,RU -2959302656,2959308877,UA -2959308878,2959308878,RU -2959308879,2959310847,UA -2959310848,2959343615,RU -2959343616,2959351807,UA -2959353856,2959355903,RU -2959355904,2959357951,KZ -2959357952,2959359999,UA -2959360000,2959384575,RU -2959384576,2959392767,UA -2959392768,2959394815,PL -2959394816,2959398911,ES -2959398912,2959400959,RU -2959400960,2959405055,ES -2959405056,2959413247,RU -2959413248,2959417343,ES -2959417344,2959423487,IR -2959423488,2959427583,RU -2959427584,2959429631,ES -2959429632,2959431679,PL -2959431680,2959433727,RU -2959433728,2959441919,UA -2959441920,2959446015,PL -2959446016,2959450111,CZ -2959450112,2959452159,PL -2959454208,2959456255,SK -2959456256,2959466495,UA -2959466496,2959474687,RU -2959474688,2959491071,UA -2959491072,2959493119,NL -2959493120,2959495167,CZ -2959495168,2959499263,PL -2959499264,2959505407,SK -2959505408,2959507455,RO -2959507456,2959515647,CZ -2959515648,2959517695,RU -2959517696,2959519743,DE -2959519744,2959523839,PL -2959523840,2959532031,UA -2959532032,2959540223,IR -2959540224,2959548415,UA -2959548416,2959552511,PL -2959552512,2959558655,UA -2959558656,2959560703,PL -2959560704,2959568895,RU -2959568896,2959570943,UA -2959570944,2959572991,RO -2959572992,2959581183,RU -2959581184,2959585279,PL -2959585280,2959591423,LV -2959591424,2959595519,UA -2959595520,2959597567,RS -2959597568,2959601663,UA -2959601664,2959603711,RO -2959603712,2959605759,IT -2959605760,2959632383,UA -2959632384,2959634431,RS -2959634432,2959636479,PL -2959636480,2959648767,RU -2959648768,2959650815,UA -2959650816,2959652863,PL -2959652864,2959654911,UA -2959654912,2959663103,RU -2959663104,2959704063,UA -2959704064,2959708159,PL -2959712256,2959728639,UA -2959736832,2959738879,UA -2959738880,2959745023,RU -2959745024,2959747071,PL -2959747072,2959749119,PS -2959749120,2959753215,LV -2959753216,2959761407,RU -2959761408,2959763455,LV -2959763456,2959765503,PL -2959765504,2959767551,GB -2959767552,2959769599,RS -2959769600,2959777791,RU -2959777792,2959783935,LV -2959783936,2959785983,SK -2959785984,2959794175,UA -2959794176,2959796223,IL -2959796224,2959806463,RU -2959806464,2959810559,SK -2959810560,2959814655,PL -2959814656,2959818751,UA -2959818752,2959822847,RO -2959822848,2959824895,RU -2959824896,2959826943,UA -2959826944,2959828991,RU -2959828992,2959833087,PL -2959833088,2959835135,CZ -2959835136,2959843327,IT -2959843328,2959845375,RU -2959845376,2959847423,PL -2959847424,2959853567,UA -2959853568,2959867903,RU -2959867904,2959876095,UA -2959876096,2959880191,RS -2959880192,2959882239,RU -2959882240,2959884287,BA -2959884288,2959892479,KZ -2959892480,2959900671,UA -2959900672,2959902719,PL -2959902720,2959915007,RU -2959915008,2959917055,UA -2959917056,2959925247,RU -2959925248,2959927295,RO -2959927296,2959929343,UA -2959929344,2959935487,RU -2959935488,2959937535,UA -2959937536,2959945727,RU -2959945728,2959947775,PL -2959947776,2959949823,SK -2959949824,2959966207,RU -2959966208,2959968255,PL -2959968256,2959970303,RS -2959970304,2959974399,RU -2959974400,2959976447,PL -2959976448,2960015359,UA -2960015360,2960023551,RU -2960023552,2960024575,IT -2960024576,2960024831,SA -2960025088,2960025599,UA -2960025600,2960025855,NL -2960025856,2960026111,FR -2960026112,2960026623,RO -2960026624,2960027647,IR -2960027648,2960028671,RO -2960028672,2960029183,NO -2960029184,2960029439,GB -2960029440,2960029695,KW -2960029696,2960030975,RU -2960030976,2960031231,KZ -2960031232,2960035839,RU -2960035840,2960039935,PL -2960039936,2960054271,RU -2960054272,2960056319,RO -2960056320,2960064511,RU -2960064512,2960066559,RO -2960066560,2960068607,RU -2960068608,2960072703,PL -2960072704,2960080895,UA -2960080896,2960084991,RU -2960084992,2960089087,UA -2960089088,2960091135,RU -2960091136,2960093183,PT -2960093184,2960105471,PL -2960105472,2960107519,RO -2960109568,2960113663,UA -2960113664,2960117759,NO -2960117760,2960119807,RU -2960119808,2960121855,CH -2960121856,2960125951,PL -2960125952,2960127999,UA -2960128000,2960130047,RU -2960130048,2960138239,UA -2960138240,2960148479,RU -2960148480,2960150527,PL -2960150528,2960152575,RO -2960152576,2960158719,RU -2960158720,2960160767,PL -2960160768,2960162815,UA -2960162816,2960175103,RU -2960175104,2960179199,SK -2960179200,2960211967,RU -2960220160,2960224255,RO -2960224256,2960228351,RU -2960228352,2960232447,TJ -2960232448,2960240639,UA -2960240640,2960244735,RO -2960244736,2960248831,PL -2960248832,2960265215,UA -2960265216,2960269311,RU -2960269312,2960273407,UA -2960273408,2960275455,RU -2960275456,2960277503,RO -2960277504,2960285695,RU -2960285696,2960289791,GB -2960289792,2960320511,RU -2960320512,2960322559,PL -2960322560,2960326655,CZ -2960326656,2960334847,PL -2960334848,2960347135,RU -2960347136,2960349183,PL -2960349184,2960351231,RU -2960351232,2960353279,UA -2960353280,2960369663,RU -2960369664,2960371711,IT -2960371712,2960375807,US -2960375808,2960383999,RU -2960384000,2960388095,RO -2960388096,2960392191,PL -2960392192,2960397311,TR -2960397312,2960400383,DE -2960400384,2960404479,RO -2960404480,2960408575,RU -2960408576,2960416767,UA -2960416768,2960424959,SK -2960424960,2960427007,RO -2960427008,2960429055,RU -2960429056,2960429311,BG -2960429312,2960429567,NL -2960429568,2960430079,UA -2960430080,2960431103,PL -2960431104,2960441343,RU -2960441344,2960443391,UA -2960443392,2960445439,PL -2960445440,2960449535,RU -2960449536,2960453631,RO -2960453632,2960472063,RU -2960472064,2960472319,BE -2960472320,2960473343,NL -2960473344,2960473599,LT -2960473600,2960474111,NL -2960474112,2960482303,UA -2960482304,2960484351,TR -2960484352,2960486399,DE -2960486400,2960498687,RU -2960498688,2960506879,UA -2960506880,2960531455,RU -2960533504,2960537599,UA -2960537600,2960539647,RO -2960539648,2960543743,RU -2960543744,2960547839,RO -2960547840,2960551935,SK -2960551936,2960558079,RU -2960558080,2960560127,PL -2960560128,2960562175,UA -2960562176,2960564223,BY -2960574464,2960576511,RO -2960576512,2960588799,RU -2960588800,2960592895,UA -2960592896,2960594943,RU -2960594944,2960596991,UA -2960596992,2960605183,PL -2960605184,2960621567,UA -2960629760,2960646143,RU -2960646144,2960648191,KZ -2960648192,2960650239,UA -2960650240,2960652287,RU -2960652288,2960654335,PS -2960654336,2960658431,RU -2960658432,2960660479,US -2960660480,2960662527,RU -2960662528,2960670719,UA -2960670720,2960678911,RU -2960678912,2960685055,UA -2960685056,2960687103,PL -2960687104,2960695295,FR -2960695296,2960697343,AT -2960697344,2960699391,ES -2960699392,2960719871,RU -2960719872,2960723455,UA -2960723456,2960723711,CZ -2960723712,2960723967,UA -2960723968,2960726015,RU -2960726016,2960732159,RO -2960732160,2960736255,RU -2960736256,2960738303,ES -2960738304,2960740351,UA -2960740352,2960742399,PL -2960742400,2960744447,US -2960744448,2960748543,RO -2960748544,2960752639,PL -2960752640,2960769023,RU -2960769024,2960773119,UA -2960773120,2960777215,RU -2960777216,2960789503,UA -2960789504,2960793599,RU -2960793600,2960797695,CZ -2960797696,2960805887,RU -2960805888,2960807935,KZ -2960807936,2960818175,UA -2960818176,2960834559,US -2960834560,2960835071,GB -2960835072,2960835583,CH -2960835584,2960836351,IT -2960836352,2960836607,PL -2960836608,2960838655,RU -2960839168,2960839679,IR -2960839680,2960846847,PL -2960846848,2960847871,DE -2960847872,2960848383,PL -2960848384,2960848639,GB -2960848640,2960850943,RU -2960850944,2960859135,MD -2960859136,2960863231,GB -2960863232,2960863487,DE -2960863488,2960863743,RU -2960863744,2960863999,GB -2960864000,2960864255,DE -2960864256,2960864767,GB -2960864768,2960865279,DE -2960865280,2960865535,RU -2960865536,2960865791,HR -2960865792,2960866303,GB -2960866304,2960866815,PL -2960866816,2960867071,GB -2960867072,2960867327,FR -2960867328,2960883711,IR -2960883712,2960904191,RU -2960904192,2960906239,RS -2960906240,2960907263,RU -2960907264,2960907775,UA -2960907776,2960908031,GB -2960908032,2960908287,PL -2960908288,2960916479,KG -2960916480,2960924671,UA -2960932864,2960933887,IR -2960933888,2960934655,GB -2960934656,2960934911,NL -2960934912,2960936959,RO -2960936960,2960941055,KZ -2960941056,2960943103,AM -2960943104,2960945151,RO -2960945152,2960945663,GB -2960945664,2960949247,RU -2960949248,2960951295,UA -2960951296,2960951807,RU -2960951808,2960952319,UA -2960952320,2960953343,PL -2960953344,2960954367,RU -2960954368,2960954623,SE -2960954624,2960954879,DE -2960954880,2960960511,RU -2960960512,2960963583,RO -2960963584,2960964607,CZ -2960964608,2960965119,RU -2960965120,2960965375,PL -2960965376,2960965631,GB -2960965632,2960973823,RU -2960973824,2960974335,SE -2960974336,2960974847,RU -2960974848,2960977919,UA -2960977920,2960979455,PL -2960979456,2960979711,IE -2960979712,2960979967,EE -2960979968,2960980223,RU -2960980224,2960980479,AT -2960980480,2960980991,SE -2960980992,2960981247,PT -2960981248,2960982015,NL -2960982016,2960990207,DE -2960990208,2960998399,UA -2960998400,2961057023,RU -2961057024,2961057279,IE -2961057280,2961057535,GR -2961057536,2961057791,AT -2961057792,2961061887,RU -2961061888,2961062911,PL -2961062912,2961063935,UA -2961063936,2961064191,DE -2961064192,2961064447,NL -2961064448,2961064703,RU -2961064704,2961064959,DE -2961064960,2961065215,HK -2961065216,2961065471,AU -2961065472,2961065727,SE -2961065728,2961066239,HK -2961066240,2961066495,DE -2961066496,2961066751,BG -2961066752,2961067519,DE -2961067520,2961067775,GB -2961067776,2961068543,DE -2961068544,2961068799,NL -2961068800,2961069055,IT -2961069056,2961069311,SE -2961069312,2961069567,NL -2961069568,2961069823,SE -2961069824,2961072127,US -2961072128,2961088511,UA -2961088512,2961088767,SE -2961088768,2961089023,RU -2961089024,2961089535,UA -2961089536,2961090559,KG -2961090560,2961091583,NL -2961091584,2961091839,RO -2961091840,2961092095,SE -2961092096,2961096703,RO -2961096704,2961097471,GB -2961097472,2961102847,RO -2961102848,2961103871,DE -2961103872,2961104895,RO -2961104896,2961106943,GB -2961106944,2961107967,NL -2961107968,2961108991,RO -2961108992,2961111039,GB -2961111040,2961112063,PL -2961112064,2961113087,RO -2961113088,2961178623,CH -2961178624,2965372927,FR -2965372928,2965766143,RU -2965766144,2965897215,DE -2965897216,2966028287,IT -2966028288,2966159359,QA -2966159360,2966290431,AE -2966290432,2966421503,IT -2966421504,2966945791,RU -2966945792,2967268351,TR -2967268352,2967269375,IN -2967269376,2967273471,TR -2967273472,2967277567,RU -2967277568,2967281663,IR -2967281664,2967283711,PT -2967283712,2967285759,DE -2967285760,2967287807,IT -2967287808,2967289855,GB -2967289856,2967291903,IR -2967291904,2967293951,RS -2967293952,2967295999,SE -2967296000,2967298047,NO -2967298048,2967306239,PL -2967306240,2967339007,GE -2967339008,2967343103,BG -2967343104,2967345151,RU -2967345152,2967347199,ES -2967347200,2967351295,HR -2967351296,2967355391,FR -2967355392,2967363583,ES -2967363584,2967371775,SE -2967371776,2967388159,KZ -2967388160,2967392255,RU -2967392256,2967394303,FR -2967394304,2967396351,RU -2967396352,2967398399,CZ -2967398400,2967400447,DK -2967400448,2967404543,RU -2967404544,2967421183,RO -2967421184,2967421439,BG -2967421440,2967421695,RO -2967421696,2967421951,ES -2967421952,2967422975,US -2967422976,2967425023,KZ -2967425024,2967427071,IR -2967427072,2967428095,NL -2967428096,2967429119,BG -2967429120,2967430143,RO -2967430144,2967430302,KZ -2967430303,2967430303,US -2967430304,2967431167,KZ -2967431168,2967432191,US -2967432192,2967432447,GB -2967432448,2967432959,RO -2967432960,2967433727,CH -2967433728,2967434239,RO -2967434240,2967435007,GB -2967435008,2967435263,IE -2967435264,2967437311,RO -2967437312,2967441407,PL -2967441408,2967445503,BG -2967445504,2967446015,GB -2967446016,2967446527,RO -2967446528,2967446783,IT -2967446784,2967447039,DE -2967447040,2967448575,RO -2967448576,2967450623,US -2967450624,2967450879,RO -2967450880,2967451135,US -2967451136,2967451647,RO -2967451648,2967452671,KZ -2967452672,2967453183,RO -2967453184,2967453439,GB -2967453440,2967453695,RO -2967468032,2967470079,US -2967470080,2967601151,SA -2967601152,2967633919,HU -2967633920,2967666687,RU -2967666688,2967699455,TR -2967699456,2967703551,GB -2967703552,2967707647,ES -2967707648,2967709695,PL -2967709696,2967711743,IT -2967711744,2967715839,RU -2967715840,2967724031,GB -2967724032,2967728127,CY -2967730176,2967732223,CZ -2967732224,2967994367,IL -2967994368,2968584191,TR -2968584192,2968600575,HU -2968600576,2968602623,IQ -2968602624,2968604671,PL -2968604672,2968608767,IQ -2968608768,2968610815,RU -2968610816,2968612863,UA -2968612864,2968614143,IL -2968614144,2968614911,US -2968614912,2968616959,FR -2968616960,2968625151,UA -2968625152,2968629247,DE -2968629248,2968631295,BH -2968631296,2968633343,SA -2968633344,2968643583,RU -2968643584,2968645631,NO -2968645632,2968647679,PL -2968647680,2968648223,FR -2968648224,2968648255,CH -2968648256,2968648287,GB -2968648288,2968648319,BE -2968648320,2968648479,FR -2968648480,2968648511,CH -2968648512,2968648543,GB -2968648544,2968648575,BE -2968648576,2968649727,FR -2968649728,2969042943,IT -2969042944,2969567231,GB -2969567232,2972098569,BR -2972098570,2972098570,US -2972098571,2975594495,BR -2975594496,2975596543,PE -2975596544,2977726975,BR -2977726976,2977727231,US -2977727232,2984247295,BR -2984247296,2984935423,MX -2984935424,2984936447,AR -2984936448,2984937471,BR -2984937472,2984937503,HN -2984937504,2984937511,US -2984937512,2984937607,HN -2984937608,2984937615,US -2984937616,2984938079,HN -2984938080,2984938095,US -2984938096,2984938239,HN -2984938240,2984938255,US -2984938256,2984938759,HN -2984938760,2984938767,CA -2984938768,2984938847,HN -2984938848,2984938863,CA -2984938864,2984939519,HN -2984939520,2984951807,BR -2984951808,2984968191,EC -2984968192,2985033727,BR -2985033728,2985951231,MX -2985951232,2986082303,PY -2986082304,2986344447,CO -2986344448,2987393023,DE -2987393024,2987397119,IM -2987397120,2987401215,LV -2987401216,2987405311,LT -2987405312,2987409407,DE -2987409408,2987413503,NO -2987413504,2987415807,UA -2987415808,2987417599,RU -2987417600,2987425791,PL -2987425792,2987429887,BG -2987429888,2987433983,RU -2987433984,2987438079,FR -2987438080,2987442175,FI -2987442176,2987446271,IE -2987446272,2987450367,SE -2987450368,2987454463,GB -2987454464,2987458559,FR -2987458560,2987462655,CZ -2987462656,2987466751,RS -2987466752,2987470847,GB -2987470848,2987474943,IQ -2987474944,2987479039,GB -2987479040,2987487231,CZ -2987487232,2987491327,HR -2987491328,2987495423,RU -2987495424,2987499519,NO -2987499520,2987500199,MD -2987500200,2987500207,AQ -2987500208,2987503615,MD -2987503616,2987511807,RU -2987515904,2987516159,US -2987516160,2987517951,DE -2987517952,2987519999,US -2987520000,2987524095,GB -2987524096,2987528191,RU -2987528192,2987532287,US -2987532288,2987536383,MD -2987536384,2987540479,FR -2987540480,2987544575,SK -2987544576,2987548671,NL -2987548672,2987552767,RU -2987552768,2987556863,GB -2987556864,2987560959,NL -2987560960,2987565055,DE -2987565056,2987569151,AT -2987569152,2987573247,FR -2987573248,2987577343,TR -2987577344,2987585535,RU -2987585536,2987589631,DE -2987589632,2987593727,FR -2987593728,2987597823,LT -2987597824,2987601919,ES -2987601920,2987606015,IS -2987606016,2987610111,DE -2987610112,2987614207,RU -2987614208,2987618303,PL -2987618304,2987622399,NL -2987622400,2987626495,FR -2987626496,2987634687,IT -2987634688,2987638783,PL -2987638784,2987642879,FO -2987642880,2987651071,DE -2987651072,2987655167,RU -2987655168,2987659263,DE -2987659264,2987661311,OM -2987663360,2987665407,IT -2987665408,2987667455,RU -2987667456,2987669503,FR -2987669504,2987671551,NL -2987671552,2987673599,FR -2987673600,2987675647,IT -2987675648,2987677695,IE -2987677696,2987681791,DE -2987681792,2987683839,NO -2987683840,2987685887,IT -2987685888,2987687935,GR -2987687936,2987689983,RU -2987689984,2987692031,CZ -2987692032,2987694079,SA -2987694080,2987696127,UA -2987696128,2987698175,RS -2987698176,2987700223,NL -2987700224,2987702271,RU -2987702272,2987704319,JO -2987704320,2987706367,GB -2987706368,2987708415,RS -2987710464,2987712511,DK -2987712512,2987714559,TR -2987714560,2987716607,RU -2987716608,2987718655,FR -2987718656,2987720703,NL -2987720704,2987722751,DE -2987722752,2987724799,RU -2987724800,2987726847,NL -2987726848,2987728895,RU -2987728896,2987730943,GB -2987730944,2987732991,IR -2987732992,2987735039,HU -2987735040,2987736577,ES -2987736578,2987736578,BY -2987736579,2987737087,ES -2987737088,2987739135,RU -2987739136,2987742982,SE -2987742983,2987742983,DK -2987742984,2987743231,SE -2987743232,2987745279,DK -2987745280,2987747327,IT -2987747328,2987749375,ES -2987749376,2987751423,NL -2987751424,2987753471,RO -2987753472,2987755519,NO -2987755520,2987757567,PL -2987757568,2987759615,DE -2987759616,2987761663,PL -2987761664,2987763711,IR -2987763712,2987765759,GR -2987765760,2987767807,FR -2987767808,2987769855,CZ -2987769856,2987771903,FI -2987771904,2987773951,IT -2987773952,2987775487,FR -2987775488,2987775999,GB -2987776000,2987778047,NL -2987778048,2987780095,CH -2987780096,2987782143,GB -2987782144,2987784191,EE -2987784192,2987786239,DK -2987786240,2987788287,FR -2987788288,2987789052,TR -2987789053,2987789054,US -2987789055,2987789055,TR -2987789056,2987789311,GB -2987789312,2987790335,TR -2987790336,2987792383,GB -2987792384,2987794431,CH -2987794432,2987796479,IQ -2987796480,2987800575,RU -2987800576,2987802623,NL -2987802624,2987804671,CH -2987804672,2987806463,IR -2987806464,2987806719,TR -2987806720,2987808767,NL -2987808768,2987810815,RU -2987810816,2987812863,NO -2987812864,2987814911,CH -2987814912,2987816959,CZ -2987816960,2987819007,IR -2987819008,2987821055,FR -2987821056,2987823103,GB -2987823104,2987827199,FR -2987827200,2987829247,GB -2987829248,2987831295,KZ -2987831296,2987833343,FR -2987833344,2987835391,IT -2987835392,2987837439,RU -2987837440,2987839487,SE -2987839488,2987841535,GB -2987841536,2987843583,RS -2987843584,2987845631,HU -2987845632,2987847679,NL -2987847680,2987849727,FR -2987849728,2987851775,IT -2987851776,2987853823,RU -2987853824,2987855871,IT -2987855872,2987857919,QA -2987857920,2987859967,DE -2987859968,2987862015,FR -2987862016,2987864063,BE -2987864064,2987866111,DE -2987866112,2987868159,ES -2987868160,2987870207,RO -2987870208,2987872255,GR -2987872256,2987874303,AT -2987874304,2987876351,SK -2987876352,2987878399,NO -2987878400,2987880447,PL -2987880448,2987882495,EE -2987882496,2987884543,DE -2987884544,2987886591,GB -2987886592,2987888639,UA -2987888640,2987890687,RU -2987890688,2987892735,FR -2987892736,2987894783,GB -2987894784,2987896831,CH -2987896832,2987898879,DK -2987898880,2987900927,NL -2987900928,2987902975,PL -2987902976,2987905023,IT -2987905024,2987907071,ES -2987907072,2987909119,CZ -2987909120,2987911167,RU -2987911168,2987913215,CZ -2987913216,2987915263,DK -2987915264,2987917311,IT -2987917312,2988179455,DE -2988179456,2988411647,SE -2988411648,2988411775,DE -2988411776,2988441599,SE -2988441600,2988441839,FR -2988441840,2988441843,IE -2988441844,2988441939,FR -2988441940,2988441943,ES -2988441944,2988442075,FR -2988442076,2988442079,ES -2988442080,2988442207,FR -2988442208,2988442239,ES -2988442240,2988442511,FR -2988442512,2988442519,ES -2988442520,2988442719,FR -2988442720,2988442751,FI -2988442752,2988442847,FR -2988442848,2988442863,IT -2988442864,2988442999,FR -2988443000,2988443007,GB -2988443008,2988443103,FR -2988443104,2988443119,GB -2988443120,2988443263,FR -2988443264,2988443295,ES -2988443296,2988443543,FR -2988443544,2988443547,ES -2988443548,2988443671,FR -2988443672,2988443675,ES -2988443676,2988443687,FR -2988443688,2988443695,ES -2988443696,2988443703,PT -2988443704,2988443895,FR -2988443896,2988443903,BE -2988443904,2988444115,FR -2988444116,2988444119,IT -2988444120,2988444208,FR -2988444209,2988444209,FI -2988444210,2988444223,FR -2988444224,2988444231,BE -2988444232,2988444239,FI -2988444240,2988444247,CZ -2988444248,2988444255,PL -2988444256,2988444671,FR -2988444672,2988444679,ES -2988444680,2988444719,FR -2988444720,2988444735,ES -2988444736,2988444739,GB -2988444740,2988444815,FR -2988444816,2988444831,ES -2988444832,2988445223,FR -2988445224,2988445231,ES -2988445232,2988446175,FR -2988446176,2988446207,FI -2988446208,2988446399,FR -2988446400,2988446431,PL -2988446432,2988446719,FR -2988446720,2988446723,DE -2988446724,2988446863,FR -2988446864,2988446879,IE -2988446880,2988447103,FR -2988447104,2988447167,GB -2988447168,2988448543,FR -2988448544,2988448547,GB -2988448548,2988448607,FR -2988448608,2988448639,ES -2988448640,2988448799,FR -2988448800,2988448815,ES -2988448816,2988449127,FR -2988449128,2988449135,ES -2988449136,2988449207,FR -2988449208,2988449215,ES -2988449216,2988449327,FR -2988449328,2988449331,PL -2988449332,2988449631,FR -2988449632,2988449639,ES -2988449640,2988451839,FR -2988451840,2988453887,BE -2988453888,2988457983,GB -2988457984,2988458063,FR -2988458064,2988458067,ES -2988458068,2988458279,FR -2988458280,2988458283,ES -2988458284,2988458331,FR -2988458332,2988458335,GB -2988458336,2988459087,FR -2988459088,2988459103,GB -2988459104,2988459119,FR -2988459120,2988459127,IT -2988459128,2988459135,PL -2988459136,2988459167,FR -2988459168,2988459171,IE -2988459172,2988459179,FR -2988459180,2988459183,ES -2988459184,2988459231,FR -2988459232,2988459235,GB -2988459236,2988459495,FR -2988459496,2988459503,ES -2988459504,2988459535,FR -2988459536,2988459539,ES -2988459540,2988459599,FR -2988459600,2988459603,GB -2988459604,2988459619,FR -2988459620,2988459623,GB -2988459624,2988459647,FR -2988459648,2988459679,GB -2988459680,2988459687,FR -2988459688,2988459691,PL -2988459692,2988459695,FR -2988459696,2988459699,IE -2988459700,2988459715,FR -2988459716,2988459719,FI -2988459720,2988459863,FR -2988459864,2988459867,ES -2988459868,2988459967,FR -2988459968,2988459999,ES -2988460000,2988460143,FR -2988460144,2988460147,GB -2988460148,2988460151,FR -2988460152,2988460159,ES -2988460160,2988460575,FR -2988460576,2988460591,PT -2988460592,2988460607,GB -2988460608,2988460651,FR -2988460652,2988460655,ES -2988460656,2988460735,FR -2988460736,2988460751,PT -2988460752,2988460863,FR -2988460864,2988460895,CZ -2988460896,2988461263,FR -2988461264,2988461279,ES -2988461280,2988461307,FR -2988461308,2988461311,ES -2988461312,2988461423,FR -2988461424,2988461439,IE -2988461440,2988461495,FR -2988461496,2988461499,ES -2988461500,2988461703,FR -2988461704,2988461707,GB -2988461708,2988462331,FR -2988462332,2988462335,ES -2988462336,2988462747,FR -2988462748,2988462751,ES -2988462752,2988463111,FR -2988463112,2988463119,ES -2988463120,2988463143,FR -2988463144,2988463151,ES -2988463152,2988463223,FR -2988463224,2988463227,ES -2988463228,2988463747,FR -2988463748,2988463751,GB -2988463752,2988463759,LT -2988463760,2988463915,FR -2988463916,2988463919,ES -2988463920,2988463947,FR -2988463948,2988463951,GB -2988463952,2988463999,FR -2988464000,2988464007,IE -2988464008,2988464015,LT -2988464016,2988464019,PT -2988464020,2988464023,FR -2988464024,2988464027,GB -2988464028,2988464271,FR -2988464272,2988464275,ES -2988464276,2988464359,FR -2988464360,2988464360,NL -2988464361,2988464519,FR -2988464520,2988464527,DE -2988464528,2988464615,FR -2988464616,2988464619,IE -2988464620,2988464623,FR -2988464624,2988464627,ES -2988464628,2988464787,FR -2988464788,2988464791,ES -2988464792,2988465191,FR -2988465192,2988465195,PL -2988465196,2988465215,FR -2988465216,2988465219,ES -2988465220,2988465551,FR -2988465552,2988465563,ES -2988465564,2988465575,FR -2988465576,2988465583,ES -2988465584,2988466059,FR -2988466060,2988466063,CZ -2988466064,2988466087,FR -2988466088,2988466095,PT -2988466096,2988466111,BE -2988466112,2988474535,FR -2988474536,2988474543,GB -2988474544,2988474687,FR -2988474688,2988474703,FI -2988474704,2988474959,FR -2988474960,2988474975,FI -2988474976,2988475215,FR -2988475216,2988475223,ES -2988475224,2988475343,FR -2988475344,2988475351,ES -2988475352,2988476415,FR -2988476416,2988478463,IT -2988478464,2988478579,FR -2988478580,2988478583,DE -2988478584,2988478587,FR -2988478588,2988478591,DE -2988478592,2988478719,FR -2988478720,2988478751,CZ -2988478752,2988478795,FR -2988478796,2988478799,ES -2988478800,2988479003,FR -2988479004,2988479007,ES -2988479008,2988479155,FR -2988479156,2988479159,ES -2988479160,2988479343,FR -2988479344,2988479359,GB -2988479360,2988479603,FR -2988479604,2988479607,GB -2988479608,2988479727,FR -2988479728,2988479735,DE -2988479736,2988479791,FR -2988479792,2988479807,GB -2988479808,2988479903,FR -2988479904,2988479935,PL -2988479936,2988480011,FR -2988480012,2988480015,GB -2988480016,2988480063,FR -2988480064,2988480095,ES -2988480096,2988480207,FR -2988480208,2988480223,ES -2988480224,2988480439,FR -2988480440,2988480443,NL -2988480444,2988480447,GB -2988480448,2988480799,FR -2988480800,2988480803,GB -2988480804,2988480927,FR -2988480928,2988480959,ES -2988480960,2988481059,FR -2988481060,2988481063,FI -2988481064,2988481343,FR -2988481344,2988481407,NL -2988481408,2988481695,FR -2988481696,2988481711,ES -2988481712,2988481743,FR -2988481744,2988481759,ES -2988481760,2988482095,FR -2988482096,2988482099,GB -2988482100,2988482103,FR -2988482104,2988482111,FI -2988482112,2988482143,DE -2988482144,2988482159,FR -2988482160,2988482163,ES -2988482164,2988482167,FR -2988482168,2988482175,ES -2988482176,2988482235,FR -2988482236,2988482255,GB -2988482256,2988482311,FR -2988482312,2988482315,GB -2988482316,2988482411,FR -2988482412,2988482415,PT -2988482416,2988482575,FR -2988482576,2988482579,CZ -2988482580,2988482799,FR -2988482800,2988482807,ES -2988482808,2988482863,FR -2988482864,2988482871,ES -2988482872,2988482875,PT -2988482876,2988482879,FR -2988482880,2988482883,PL -2988482884,2988483027,FR -2988483028,2988483031,ES -2988483032,2988483111,FR -2988483112,2988483115,ES -2988483116,2988483119,FR -2988483120,2988483127,ES -2988483128,2988483159,FR -2988483160,2988483167,ES -2988483168,2988483175,FR -2988483176,2988483183,PL -2988483184,2988483279,FR -2988483280,2988483283,ES -2988483284,2988483375,FR -2988483376,2988483379,GB -2988483380,2988483595,FR -2988483596,2988483599,FI -2988483600,2988483967,FR -2988483968,2988483983,GB -2988483984,2988484047,FR -2988484048,2988484051,ES -2988484052,2988484127,FR -2988484128,2988484131,PT -2988484132,2988484339,FR -2988484340,2988484343,PT -2988484344,2988484399,FR -2988484400,2988484403,PT -2988484404,2988484831,FR -2988484832,2988484847,GB -2988484848,2988484863,FR -2988484864,2988484879,NL -2988484880,2988484883,GB -2988484884,2988484891,FR -2988484892,2988484895,GB -2988484896,2988485455,FR -2988485456,2988485471,GB -2988485472,2988485503,FR -2988485504,2988485519,GB -2988485520,2988485563,FR -2988485564,2988485567,ES -2988485568,2988485631,FR -2988485632,2988485663,ES -2988485664,2988485799,FR -2988485800,2988485803,PT -2988485804,2988486083,FR -2988486084,2988486087,PT -2988486088,2988486095,FR -2988486096,2988486099,GB -2988486100,2988486135,FR -2988486136,2988486139,ES -2988486140,2988486195,FR -2988486196,2988486199,PT -2988486200,2988486323,FR -2988486324,2988486327,PT -2988486328,2988486335,FR -2988486336,2988486343,ES -2988486344,2988486351,FR -2988486352,2988486367,ES -2988486368,2988486607,FR -2988486608,2988486615,FI -2988486616,2988486623,ES -2988486624,2988486679,FR -2988486680,2988486687,ES -2988486688,2988486711,FR -2988486712,2988486719,IE -2988486720,2988486747,FR -2988486748,2988486751,GB -2988486752,2988486887,FR -2988486888,2988486891,PT -2988486892,2988487043,FR -2988487044,2988487047,PT -2988487048,2988487071,FR -2988487072,2988487075,ES -2988487076,2988487095,FR -2988487096,2988487099,ES -2988487100,2988487103,GB -2988487104,2988487303,FR -2988487304,2988487311,NL -2988487312,2988487375,FR -2988487376,2988487383,ES -2988487384,2988487839,FR -2988487840,2988487871,CZ -2988487872,2988487919,FR -2988487920,2988487923,DE -2988487924,2988487979,FR -2988487980,2988487983,ES -2988487984,2988488491,FR -2988488492,2988488495,ES -2988488496,2988488543,FR -2988488544,2988488555,GB -2988488556,2988488639,FR -2988488640,2988488647,ES -2988488648,2988488971,FR -2988488972,2988488975,MT -2988488976,2988488983,ES -2988488984,2988488991,FR -2988488992,2988489023,ES -2988489024,2988489167,FR -2988489168,2988489175,PT -2988489176,2988489375,FR -2988489376,2988489379,ES -2988489380,2988489451,FR -2988489452,2988489455,DE -2988489456,2988489475,FR -2988489476,2988489479,GB -2988489480,2988489483,DE -2988489484,2988489675,FR -2988489676,2988489679,ES -2988489680,2988489935,FR -2988489936,2988489943,ES -2988489944,2988490179,FR -2988490180,2988490191,ES -2988490192,2988490291,FR -2988490292,2988490295,DE -2988490296,2988490303,ES -2988490304,2988490367,FR -2988490368,2988490371,ES -2988490372,2988490686,FR -2988490687,2988490687,BE -2988490688,2988490719,ES -2988490720,2988490967,FR -2988490968,2988490975,CZ -2988490976,2988491251,FR -2988491252,2988491252,ES -2988491253,2988491839,FR -2988491840,2988491919,FI -2988491920,2988491935,DE -2988491936,2988491951,PL -2988491952,2988491967,FR -2988491968,2988492031,GB -2988492032,2988492799,FR -2988492800,2988494847,PL -2988494848,2988495199,FR -2988495200,2988495231,IT -2988495232,2988495967,FR -2988495968,2988495999,ES -2988496000,2988496767,FR -2988496768,2988496799,CZ -2988496800,2988496831,FR -2988496832,2988496895,NL -2988496896,2988498975,FR -2988498976,2988498983,ES -2988498984,2988499347,FR -2988499348,2988499351,GB -2988499352,2988499535,FR -2988499536,2988499551,ES -2988499552,2988499567,FR -2988499568,2988499575,IE -2988499576,2988499583,FR -2988499584,2988499599,ES -2988499600,2988499635,FR -2988499636,2988499639,GB -2988499640,2988499671,FR -2988499672,2988499675,GB -2988499676,2988499711,FR -2988499712,2988499715,PL -2988499716,2988499729,FR -2988499730,2988499730,GB -2988499731,2988499736,FR -2988499737,2988499737,NL -2988499738,2988500223,FR -2988500224,2988500255,ES -2988500256,2988500371,FR -2988500372,2988500375,LT -2988500376,2988500415,FR -2988500416,2988500447,CZ -2988500448,2988500479,ES -2988500480,2988500519,FR -2988500520,2988500523,ES -2988500524,2988500815,FR -2988500816,2988500831,PL -2988500832,2988500855,FR -2988500856,2988500859,ES -2988500860,2988500887,FR -2988500888,2988500895,ES -2988500896,2988500939,FR -2988500940,2988500943,ES -2988500944,2988501683,FR -2988501684,2988501687,GB -2988501688,2988502031,FR -2988502032,2988502035,IE -2988502036,2988502051,FR -2988502052,2988502055,PL -2988502056,2988502263,FR -2988502264,2988502267,ES -2988502268,2988502479,FR -2988502480,2988502483,ES -2988502484,2988502495,FR -2988502496,2988502511,ES -2988502512,2988502655,FR -2988502656,2988502719,DE -2988502720,2988502751,FR -2988502752,2988502783,ES -2988502784,2988502823,FR -2988502824,2988502831,ES -2988502832,2988502881,FR -2988502882,2988502882,IT -2988502883,2988502983,FR -2988502984,2988502991,ES -2988502992,2988503375,FR -2988503376,2988503383,PT -2988503384,2988503471,FR -2988503472,2988503487,ES -2988503488,2988503919,FR -2988503920,2988503927,CZ -2988503928,2988504023,FR -2988504024,2988504031,PT -2988504032,2988504159,FR -2988504160,2988504191,LT -2988504192,2988504239,FR -2988504240,2988504255,GB -2988504256,2988504287,PL -2988504288,2988504359,FR -2988504360,2988504363,GB -2988504364,2988504367,FI -2988504368,2988504371,FR -2988504372,2988504375,PL -2988504376,2988504467,FR -2988504468,2988504471,ES -2988504472,2988504527,FR -2988504528,2988504543,PL -2988504544,2988504559,FR -2988504560,2988504563,FI -2988504564,2988504983,FR -2988504984,2988504987,ES -2988504988,2988505151,FR -2988505152,2988505167,GB -2988505168,2988505215,FR -2988505216,2988505247,ES -2988505248,2988505279,FR -2988505280,2988505311,ES -2988505312,2988505375,FR -2988505376,2988505391,GB -2988505392,2988505395,ES -2988505396,2988505535,FR -2988505536,2988505567,ES -2988505568,2988505919,FR -2988505920,2988505935,GB -2988505936,2988506191,FR -2988506192,2988506207,GB -2988506208,2988506367,FR -2988506368,2988506375,IE -2988506376,2988506523,FR -2988506524,2988506527,IE -2988506528,2988506887,FR -2988506888,2988506891,ES -2988506892,2988507163,FR -2988507164,2988507167,ES -2988507168,2988507263,FR -2988507264,2988507279,ES -2988507280,2988507335,FR -2988507336,2988507339,ES -2988507340,2988507551,FR -2988507552,2988507560,GB -2988507561,2988507561,FR -2988507562,2988507567,GB -2988507568,2988507583,FR -2988507584,2988507591,ES -2988507592,2988507687,FR -2988507688,2988507695,ES -2988507696,2988508079,FR -2988508080,2988508095,ES -2988508096,2988508135,FR -2988508136,2988508143,GB -2988508144,2988508155,FR -2988508156,2988508159,ES -2988508160,2988508439,FR -2988508440,2988508443,GB -2988508444,2988508607,FR -2988508608,2988508639,ES -2988508640,2988508851,FR -2988508852,2988508855,GB -2988508856,2988509151,FR -2988509152,2988509183,IT -2988509184,2988509191,FR -2988509192,2988509199,CZ -2988509200,2988509491,FR -2988509492,2988509495,IE -2988509496,2988509511,FR -2988509512,2988509515,PL -2988509516,2988509747,FR -2988509748,2988509751,LT -2988509752,2988509779,FR -2988509780,2988509783,GB -2988509784,2988510015,FR -2988510016,2988510023,ES -2988510024,2988510079,FR -2988510080,2988510087,ES -2988510088,2988510095,FR -2988510096,2988510099,ES -2988510100,2988510175,FR -2988510176,2988510191,DE -2988510192,2988510311,FR -2988510312,2988510319,GB -2988510320,2988510639,FR -2988510640,2988510655,LT -2988510656,2988511023,FR -2988511024,2988511027,GB -2988511028,2988511747,FR -2988511748,2988511751,GB -2988511752,2988512127,FR -2988512128,2988512143,ES -2988512144,2988512199,FR -2988512200,2988512207,ES -2988512208,2988512247,FR -2988512248,2988512251,GB -2988512252,2988512307,FR -2988512308,2988512311,GB -2988512312,2988512399,FR -2988512400,2988512403,ES -2988512404,2988512407,LT -2988512408,2988512639,FR -2988512640,2988512647,GB -2988512648,2988512655,FR -2988512656,2988512663,PT -2988512664,2988512903,FR -2988512904,2988512907,GB -2988512908,2988512943,FR -2988512944,2988512951,ES -2988512952,2988512995,FR -2988512996,2988512999,GB -2988513000,2988513003,FR -2988513004,2988513007,ES -2988513008,2988513167,FR -2988513168,2988513171,PT -2988513172,2988513283,FR -2988513284,2988513287,ES -2988513288,2988513311,FR -2988513312,2988513327,PT -2988513328,2988513519,FR -2988513520,2988513535,GB -2988513536,2988513583,FR -2988513584,2988513599,IE -2988513600,2988513679,FR -2988513680,2988513683,ES -2988513684,2988513687,GB -2988513688,2988513739,FR -2988513740,2988513743,ES -2988513744,2988514183,FR -2988514184,2988514191,ES -2988514192,2988514207,FR -2988514208,2988514215,PT -2988514216,2988514231,FR -2988514232,2988514239,ES -2988514240,2988514287,FR -2988514288,2988514303,ES -2988514304,2988514519,FR -2988514520,2988514523,ES -2988514524,2988514527,FR -2988514528,2988514543,GB -2988514544,2988514739,FR -2988514740,2988514743,GB -2988514744,2988514943,FR -2988514944,2988514959,ES -2988514960,2988515327,FR -2988515328,2988517375,DE -2988517376,2988519423,FR -2988519424,2988521471,PL -2988521472,2988521567,FR -2988521568,2988521599,PL -2988521600,2988521775,FR -2988521776,2988521791,LT -2988521792,2988521951,FR -2988521952,2988521983,ES -2988521984,2988523551,FR -2988523552,2988523559,ES -2988523560,2988523599,FR -2988523600,2988523603,ES -2988523604,2988523631,FR -2988523632,2988523635,DE -2988523636,2988523663,FR -2988523664,2988523667,IE -2988523668,2988523679,FR -2988523680,2988523711,ES -2988523712,2988523743,FR -2988523744,2988523759,DE -2988523760,2988524075,FR -2988524076,2988524079,ES -2988524080,2988524155,FR -2988524156,2988524159,PT -2988524160,2988524199,FR -2988524200,2988524203,IE -2988524204,2988524211,FR -2988524212,2988524215,ES -2988524216,2988524231,FR -2988524232,2988524239,ES -2988524240,2988524359,FR -2988524360,2988524363,ES -2988524364,2988524383,FR -2988524384,2988524415,PL -2988524416,2988524447,CZ -2988524448,2988524603,FR -2988524604,2988524607,ES -2988524608,2988524623,FR -2988524624,2988524627,GB -2988524628,2988524767,FR -2988524768,2988524783,ES -2988524784,2988525887,FR -2988525888,2988525951,GB -2988525952,2988526135,FR -2988526136,2988526143,GB -2988526144,2988526175,FR -2988526176,2988526239,ES -2988526240,2988526415,FR -2988526416,2988526423,ES -2988526424,2988526703,FR -2988526704,2988526707,GB -2988526708,2988526867,FR -2988526868,2988526871,PT -2988526872,2988527187,FR -2988527188,2988527191,ES -2988527192,2988527487,FR -2988527488,2988527503,GB -2988527504,2988527547,FR -2988527548,2988527551,IE -2988527552,2988527591,FR -2988527592,2988527595,IE -2988527596,2988527723,FR -2988527724,2988527727,ES -2988527728,2988527831,FR -2988527832,2988527839,ES -2988527840,2988527887,FR -2988527888,2988527891,ES -2988527892,2988528079,FR -2988528080,2988528095,ES -2988528096,2988528227,FR -2988528228,2988528231,IE -2988528232,2988528447,FR -2988528448,2988528455,IE -2988528456,2988528467,FR -2988528468,2988528471,GB -2988528472,2988528591,FR -2988528592,2988528607,FI -2988528608,2988528699,FR -2988528700,2988528703,CZ -2988528704,2988528999,FR -2988529000,2988529003,GB -2988529004,2988529175,FR -2988529176,2988529179,ES -2988529180,2988529331,FR -2988529332,2988529335,GB -2988529336,2988529383,FR -2988529384,2988529387,ES -2988529388,2988529583,FR -2988529584,2988529591,ES -2988529592,2988529775,FR -2988529776,2988529783,ES -2988529784,2988529823,FR -2988529824,2988529855,ES -2988529856,2988530047,FR -2988530048,2988530049,GB -2988530050,2988530067,FR -2988530068,2988530071,DE -2988530072,2988530087,FR -2988530088,2988530091,NL -2988530092,2988530399,FR -2988530400,2988530403,ES -2988530404,2988530423,FR -2988530424,2988530431,ES -2988530432,2988530703,FR -2988530704,2988530719,PT -2988530720,2988531023,FR -2988531024,2988531027,ES -2988531028,2988531179,FR -2988531180,2988531183,GB -2988531184,2988531187,FR -2988531188,2988531191,IE -2988531192,2988531275,FR -2988531276,2988531279,PT -2988531280,2988532991,FR -2988532992,2988533119,GB -2988533120,2988533183,IE -2988533184,2988533247,BE -2988533248,2988535807,FR -2988535808,2988537855,ES -2988537856,2988539935,FR -2988539936,2988539967,GB -2988539968,2988539971,FR -2988539972,2988539975,ES -2988539976,2988540207,FR -2988540208,2988540211,GB -2988540212,2988540219,FR -2988540220,2988540223,GB -2988540224,2988540271,FR -2988540272,2988540275,ES -2988540276,2988540563,FR -2988540564,2988540567,CZ -2988540568,2988540623,FR -2988540624,2988540631,GB -2988540632,2988540759,FR -2988540760,2988540763,ES -2988540764,2988541103,FR -2988541104,2988541119,ES -2988541120,2988541243,FR -2988541244,2988541247,GB -2988541248,2988541351,FR -2988541352,2988541355,IE -2988541356,2988541455,FR -2988541456,2988541467,ES -2988541468,2988541791,FR -2988541792,2988541807,ES -2988541808,2988541863,FR -2988541864,2988541867,GB -2988541868,2988541955,FR -2988541956,2988541959,DE -2988541960,2988542051,FR -2988542052,2988542055,ES -2988542056,2988542063,FR -2988542064,2988542067,GB -2988542068,2988542271,FR -2988542272,2988542335,ES -2988542336,2988542339,FR -2988542340,2988542340,PT -2988542341,2988542519,FR -2988542520,2988542523,GB -2988542524,2988543127,FR -2988543128,2988543135,ES -2988543136,2988543179,FR -2988543180,2988543183,ES -2988543184,2988543199,FR -2988543200,2988543203,GB -2988543204,2988543403,FR -2988543404,2988543407,ES -2988543408,2988543559,FR -2988543560,2988543563,PT -2988543564,2988543871,FR -2988543872,2988543935,ES -2988543936,2988544055,FR -2988544056,2988544063,FI -2988544064,2988544307,FR -2988544308,2988544311,GB -2988544312,2988544375,FR -2988544376,2988544383,ES -2988544384,2988544447,GB -2988544448,2988544527,FR -2988544528,2988544535,ES -2988544536,2988544671,FR -2988544672,2988544687,GB -2988544688,2988544767,FR -2988544768,2988544775,ES -2988544776,2988544799,FR -2988544800,2988544831,FI -2988544832,2988544835,FR -2988544836,2988544843,ES -2988544844,2988545515,FR -2988545516,2988545519,GB -2988545520,2988545579,FR -2988545580,2988545583,ES -2988545584,2988545663,FR -2988545664,2988545695,ES -2988545696,2988545791,FR -2988545792,2988545795,NL -2988545796,2988545799,ES -2988545800,2988545995,FR -2988545996,2988545999,FI -2988546000,2988546119,FR -2988546120,2988546123,IE -2988546124,2988546159,FR -2988546160,2988546175,ES -2988546176,2988546327,FR -2988546328,2988546335,ES -2988546336,2988546351,FR -2988546352,2988546367,ES -2988546368,2988546575,FR -2988546576,2988546579,ES -2988546580,2988546599,FR -2988546600,2988546603,PT -2988546604,2988546615,FR -2988546616,2988546619,FI -2988546620,2988546623,FR -2988546624,2988546687,FI -2988546688,2988546691,CH -2988546692,2988546727,FR -2988546728,2988546731,ES -2988546732,2988547003,FR -2988547004,2988547007,ES -2988547008,2988547067,FR -2988547068,2988547071,ES -2988547072,2988547095,FR -2988547096,2988547099,ES -2988547100,2988547431,FR -2988547432,2988547435,ES -2988547436,2988547451,FR -2988547452,2988547455,PT -2988547456,2988547471,ES -2988547472,2988547583,FR -2988547584,2988547599,ES -2988547600,2988547619,FR -2988547620,2988547623,PT -2988547624,2988547751,FR -2988547752,2988547759,ES -2988547760,2988547775,FR -2988547776,2988547807,ES -2988547808,2988547871,FR -2988547872,2988547903,GB -2988547904,2988547967,FR -2988547968,2988547971,GB -2988547972,2988548015,FR -2988548016,2988548019,ES -2988548020,2988548023,GB -2988548024,2988548095,FR -2988548096,2988548338,ES -2988548339,2988548339,FR -2988548340,2988550143,ES -2988550144,2988550163,FR -2988550164,2988550167,GB -2988550168,2988550183,FR -2988550184,2988550191,PL -2988550192,2988550255,FR -2988550256,2988550259,ES -2988550260,2988550355,FR -2988550356,2988550359,GB -2988550360,2988550363,ES -2988550364,2988550367,FR -2988550368,2988550399,PL -2988550400,2988550407,FR -2988550408,2988550411,GB -2988550412,2988550438,FR -2988550439,2988550439,GB -2988550440,2988550463,FR -2988550464,2988550527,DE -2988550528,2988550595,FR -2988550596,2988550599,PT -2988550600,2988550643,FR -2988550644,2988550647,ES -2988550648,2988550699,FR -2988550700,2988550703,ES -2988550704,2988550975,FR -2988550976,2988551007,PL -2988551008,2988551171,FR -2988551172,2988551175,FI -2988551176,2988551179,ES -2988551180,2988551183,GB -2988551184,2988551191,FR -2988551192,2988551199,ES -2988551200,2988551431,FR -2988551432,2988551439,ES -2988551440,2988551443,FR -2988551444,2988551451,ES -2988551452,2988551455,FR -2988551456,2988551471,GB -2988551472,2988551535,FR -2988551536,2988551551,DE -2988551552,2988551567,FR -2988551568,2988551583,IE -2988551584,2988551671,FR -2988551672,2988551675,DE -2988551676,2988551903,FR -2988551904,2988551911,GB -2988551912,2988552591,FR -2988552592,2988552595,FI -2988552596,2988552631,FR -2988552632,2988552635,IE -2988552636,2988552687,FR -2988552688,2988552711,ES -2988552712,2988552751,FR -2988552752,2988552767,ES -2988552768,2988552959,FR -2988552960,2988552975,ES -2988552976,2988552991,FR -2988552992,2988552995,ES -2988552996,2988553007,FR -2988553008,2988553023,IE -2988553024,2988553055,FR -2988553056,2988553087,PL -2988553088,2988553199,FR -2988553200,2988553215,BE -2988553216,2988553223,FR -2988553224,2988553231,PL -2988553232,2988553279,FR -2988553280,2988553283,ES -2988553284,2988553311,FR -2988553312,2988553315,ES -2988553316,2988553531,FR -2988553532,2988553535,ES -2988553536,2988553855,FR -2988553856,2988553919,BE -2988553920,2988553971,FR -2988553972,2988553975,ES -2988553976,2988554035,FR -2988554036,2988554039,ES -2988554040,2988554187,FR -2988554188,2988554191,PL -2988554192,2988554239,FR -2988554240,2988554495,ES -2988554496,2988554499,NL -2988554500,2988554815,FR -2988554816,2988554879,GB -2988554880,2988554931,FR -2988554932,2988554935,ES -2988554936,2988555087,FR -2988555088,2988555091,FI -2988555092,2988555103,FR -2988555104,2988555107,GB -2988555108,2988555163,FR -2988555164,2988555167,IE -2988555168,2988555527,FR -2988555528,2988555531,DE -2988555532,2988555551,FR -2988555552,2988555559,PT -2988555560,2988556139,FR -2988556140,2988556143,DE -2988556144,2988556203,FR -2988556204,2988556207,FI -2988556208,2988556211,DE -2988556212,2988556223,FR -2988556224,2988556227,ES -2988556228,2988556255,FR -2988556256,2988556259,ES -2988556260,2988556263,FR -2988556264,2988556271,GB -2988556272,2988556283,FR -2988556284,2988556287,GB -2988556288,2988556319,FR -2988556320,2988556351,GB -2988556352,2988556359,FR -2988556360,2988556363,ES -2988556364,2988557023,FR -2988557024,2988557039,IE -2988557040,2988557095,FR -2988557096,2988557103,ES -2988557104,2988557111,PT -2988557112,2988557395,FR -2988557396,2988557399,PL -2988557400,2988557423,FR -2988557424,2988557427,ES -2988557428,2988557507,FR -2988557508,2988557511,ES -2988557512,2988557515,GB -2988557516,2988557539,FR -2988557540,2988557543,ES -2988557544,2988557631,FR -2988557632,2988557635,GB -2988557636,2988558075,FR -2988558076,2988558079,NL -2988558080,2988558203,FR -2988558204,2988558207,DE -2988558208,2988558239,PL -2988558240,2988558463,FR -2988558464,2988558527,BE -2988558528,2988558731,FR -2988558732,2988558735,PT -2988558736,2988558803,FR -2988558804,2988558807,ES -2988558808,2988558887,FR -2988558888,2988558891,GB -2988558892,2988559015,FR -2988559016,2988559023,DE -2988559024,2988559199,FR -2988559200,2988559231,PT -2988559232,2988559615,FR -2988559616,2988559619,ES -2988559620,2988559631,FR -2988559632,2988559647,GB -2988559648,2988559663,FR -2988559664,2988559679,ES -2988559680,2988560543,FR -2988560544,2988560575,GB -2988560576,2988560639,FR -2988560640,2988560703,ES -2988560704,2988560759,FR -2988560760,2988560767,FI -2988560768,2988560783,FR -2988560784,2988560799,NL -2988560800,2988560815,DE -2988560816,2988560879,FR -2988560880,2988560895,GB -2988560896,2988561051,FR -2988561052,2988561055,GB -2988561056,2988561175,FR -2988561176,2988561179,ES -2988561180,2988561215,FR -2988561216,2988561231,ES -2988561232,2988561235,PT -2988561236,2988561399,FR -2988561400,2988561403,ES -2988561404,2988561583,FR -2988561584,2988561591,GB -2988561592,2988561683,FR -2988561684,2988561687,ES -2988561688,2988561759,FR -2988561760,2988561763,PL -2988561764,2988561767,IT -2988561768,2988561939,FR -2988561940,2988561943,FI -2988561944,2988562495,FR -2988562496,2988562527,FI -2988562528,2988562595,FR -2988562596,2988562599,GB -2988562600,2988562847,FR -2988562848,2988562863,GB -2988562864,2988563527,FR -2988563528,2988563535,ES -2988563536,2988563671,FR -2988563672,2988563675,DE -2988563676,2988563967,FR -2988563968,2988563999,GB -2988564000,2988564023,FR -2988564024,2988564027,IE -2988564028,2988564143,FR -2988564144,2988564159,ES -2988564160,2988564175,FR -2988564176,2988564179,GB -2988564180,2988564191,FR -2988564192,2988564195,ES -2988564196,2988564215,FR -2988564216,2988564219,GB -2988564220,2988564279,FR -2988564280,2988564287,ES -2988564288,2988564367,FR -2988564368,2988564383,GB -2988564384,2988564403,FR -2988564404,2988564407,ES -2988564408,2988566331,FR -2988566332,2988566332,GB -2988566333,2988572671,FR -2988572672,2988612607,RU -2988612608,2988613247,UA -2988613248,2988613248,RU -2988613249,2988613631,UA -2988613632,2988703743,RU -2988703744,2988834815,PL -2988834816,2988965887,CH -2988965888,2989096959,SK -2989096960,2989228031,PL -2989228032,2989490175,RU -2989490176,2989555711,HU -2989555712,2989588479,RU -2989588480,2989588735,CO -2989588736,2989588991,RU -2989588992,2989589503,CO -2989589504,2989621247,RU -2989621248,2989752319,BE -2989752320,2989785087,LB -2989785088,2989817855,SY -2989817856,2989883391,KW -2989883392,2989948927,UA -2989948928,2990014463,FI -2990014464,2990079999,PL -2990080000,2990096895,RU -2990096896,2990097023,KZ -2990097024,2990097151,US -2990097152,2990097279,KZ -2990097280,2990112767,RU -2990112768,2990129151,ES -2990129152,2990145535,RU -2990145536,2990211071,SI -2990211072,2990276607,GR -2990276608,2990342143,ES -2990342144,2990407679,KW -2990407680,2990440447,GB -2990440448,2990473215,NL -2990473216,2990475674,DE -2990475675,2990475675,HR -2990475676,2990538751,DE -2990538752,2991063039,RU -2991063040,2991067135,SE -2991067136,2991071231,DK -2991071232,2991079423,NO -2991079424,2991095807,RU -2991095808,2991103999,AM -2991104000,2991106047,RU -2991106048,2991112191,AM -2991112192,2991128575,CZ -2991128576,2991144959,PL -2991144960,2991161343,SA -2991161344,2991177727,FR -2991177728,2991179503,SE -2991179504,2991179507,ES -2991179508,2991191807,SE -2991191808,2991192063,FI -2991192064,2991194111,SE -2991194112,2991210495,NO -2991210496,2991243263,RU -2991243264,2991259647,UA -2991259648,2991292415,RU -2991292416,2991308799,FI -2991308800,2991325183,BG -2991325184,2991341567,AZ -2991341568,2991357951,MD -2991357952,2991374335,DE -2991374336,2991390719,RU -2991390720,2991407103,BA -2991407104,2991423487,DE -2991423488,2991439871,JO -2991439872,2991456255,CZ -2991456256,2991472639,RU -2991472640,2991489023,GB -2991489024,2991505407,AM -2991505408,2991521791,SE -2991521792,2991527935,RS -2991527936,2991529983,XK -2991529984,2991538175,RS -2991538176,2991554559,SI -2991554560,2991570943,GB -2991570944,2991581183,IT -2991581184,2991582207,DE -2991582208,2991583231,FR -2991583232,2991585279,DE -2991585280,2991587327,GB -2991587328,2991718399,SA -2991718400,2991849471,CH -2991849472,2991980543,NL -2991980544,2992111615,SA -2992111616,2992156159,KZ -2992156160,2992156415,RU -2992156416,2992373759,KZ -2992373760,2992635903,UA -2992635904,2993684479,GB -2993684480,2993946623,AT -2993946624,2994208767,BE -2994208768,2994733055,BY -2994733056,2994798591,GR -2994798592,2994929663,RU -2994929664,2994995199,IR -2994995200,2994997247,NL -2994997248,2994999295,BE -2994999296,2995003391,FR -2995003392,2995007487,BH -2995007488,2995009535,TR -2995009536,2995011583,ES -2995011584,2995013631,DE -2995013632,2995015679,SE -2995015680,2995017727,BG -2995017728,2995019775,IT -2995019776,2995021823,RU -2995021824,2995023871,IT -2995023872,2995044351,MD -2995044352,2995046399,ES -2995046400,2995048447,RU -2995048448,2995050495,NL -2995050496,2995050561,AL -2995050562,2995050562,XK -2995050563,2995052543,AL -2995052544,2995056639,DK -2995056640,2995058687,DE -2995058688,2995060735,SE -2995060736,2995126271,UA -2995126272,2995191807,GE -2995191808,2995257343,LB -2995257344,2995388415,UA -2995388416,2995453951,RO -2995453952,2995519487,ES -2995519488,2995650559,RU -2995650560,2995716095,DE -2995716096,2995781631,SK -2995781632,2995912703,BE -2995912704,2996043775,GR -2996043776,2996171263,RS -2996171264,2996171775,XK -2996171776,2996174847,RS -2996174848,2996305919,UA -2996305920,2996436991,QA -2996436992,2996469759,BY -2996469760,2996502399,RU -2996502400,2996502431,TR -2996502432,2996535295,RU -2996535296,2996568063,DK -2996568064,2996600831,ES -2996600832,2996633599,RO -2996633600,2996634111,IR -2996634112,2996634623,IT -2996634624,2996635647,IR -2996635648,2996637695,TR -2996637696,2996645887,FR -2996645888,2996649983,IR -2996649984,2996666367,RO -2996666368,2996682751,RU -2996682752,2996699135,DK -2996699136,2996764671,UA -2996764672,2996768767,GB -2996768768,2996773631,RU -2996773632,2996773887,KZ -2996773888,2996774399,RU -2996774400,2996774911,UA -2996774912,2996775423,RU -2996775424,2996775935,UA -2996775936,2996776959,BY -2996776960,2996781055,RU -2996781056,2996785151,RO -2996785152,2996789247,RU -2996789248,2996789503,UA -2996789504,2996789759,RU -2996789760,2996790015,UA -2996790016,2996790271,US -2996790272,2996790527,TR -2996790528,2996792063,UA -2996792064,2996792319,US -2996792320,2996797439,UA -2996797440,2996801535,PL -2996801536,2996805631,RO -2996805632,2996809727,PL -2996809728,2996813823,UA -2996813824,2996817919,PL -2996817920,2996826111,UA -2996826112,2996828159,BY -2996828160,2996830207,RU -2996830208,2996862975,HR -2996862976,2996895743,AM -2996895744,2996928511,KW -2996928512,2996994047,RU -2996994048,2997010431,NL -2997010432,2997026815,DE -2997026816,2997059583,RU -2997059584,2997092351,BY -2997092352,2997125119,NO -2997125120,2997157887,HU -2997157888,2997190655,UA -2997190656,2997223423,AT -2997223424,2997256191,PT -2997256192,2997321727,RU -2997321728,2997354495,IE -2997354496,2997387263,MD -2997387264,2997420031,BY -2997420032,2997428223,IR -2997428224,2997452799,RU -2997452800,2997485567,BG -2997485568,2997500415,FR -2997500416,2997500671,NL -2997500672,2997506559,FR -2997506560,2997506815,GB -2997506816,2997507071,ES -2997507072,2997507327,IT -2997507328,2997507583,DE -2997507584,2997508095,PT -2997508096,2997508351,DE -2997508352,2997508607,IT -2997508608,2997508863,ES -2997508864,2997509119,GB -2997509120,2997513345,FR -2997513346,2997513346,IT -2997513347,2997513347,ES -2997513348,2997513348,DE -2997513349,2997513349,PT -2997513350,2997513350,BE -2997513351,2997513351,LU -2997513352,2997513352,AT -2997513353,2997513353,NL -2997513354,2997513354,IE -2997513355,2997515683,FR -2997515684,2997515684,GB -2997515685,2997518335,FR -2997518336,2997519359,US -2997519360,2997520383,GL -2997520384,2997520895,NL -2997520896,2997521151,MT -2997521152,2997521407,US -2997521408,2997521663,UY -2997521664,2997521919,IN -2997521920,2997522431,GB -2997522432,2997522687,IT -2997522688,2997522943,BE -2997522944,2997523199,NO -2997523200,2997523455,GL -2997523456,2997525503,NL -2997525504,2997526527,TR -2997526528,2997543167,RU -2997543168,2997543423,NL -2997543424,2997543679,RU -2997543680,2997544191,NL -2997544192,2997544447,RU -2997544448,2997544959,NL -2997544960,2997551103,RU -2997551104,2997555199,AU -2997555200,2997557247,SG -2997557248,2997559295,TW -2997559296,2997560319,IN -2997560320,2997560831,KR -2997560832,2997561343,RU -2997561344,2997563391,TH -2997563392,2997567487,RU -2997567488,2997568511,IN -2997568512,2997569535,RU -2997569536,2997570559,IN -2997570560,2997573631,JP -2997573632,2997574655,IN -2997574656,2997576703,KR -2997576704,2997576959,NL -2997576960,2997577471,GB -2997577472,2997578239,RU -2997578240,2997578751,FR -2997578752,2997579775,RU -2997579776,2997581823,NL -2997581824,2997583871,TW -2997583872,2997616639,SY -2997616640,2997649407,SI -2997649408,2997682175,BY -2997682176,2997714943,RU -2997714944,2997739519,IR -2997739520,2997747711,AU -2997747712,2997780479,CH -2997780480,2997813247,SE -2997813248,2997846015,AL -2997846016,2997848665,MD -2997848666,2997848666,UM -2997848667,2997878783,MD -2997878784,2998140927,RU -2998140928,2998403071,PL -2998403072,2998665215,RU -2998665216,2998927359,AT -2998927360,2999451647,CH -2999451648,2999713791,DE -2999713792,2999975935,RU -2999975936,2999984127,FR -2999984128,2999989007,BE -2999989008,2999989015,NL -2999989016,2999989031,BE -2999989032,2999989055,NL -2999989056,2999989059,LU -2999989060,2999989119,BE -2999989120,2999989247,FR -2999989248,2999992319,BE -2999992320,3000000511,RU -3000000512,3000008703,DE -3000008704,3000016895,RU -3000016896,3000020991,GB -3000020992,3000021247,DZ -3000021248,3000021503,DE -3000021504,3000021759,GB -3000021760,3000022015,DE -3000022016,3000022271,BE -3000022272,3000022527,PT -3000022528,3000022783,DE -3000022784,3000025087,GB -3000025088,3000033279,GI -3000033280,3000041471,RU -3000041472,3000049919,BA -3000049920,3000057855,CH -3000057856,3000066047,UA -3000066048,3000074239,RU -3000074240,3000082431,CZ -3000082432,3000090623,DK -3000090624,3000131583,RU -3000131584,3000139775,DE -3000139776,3000147967,UA -3000147968,3000156159,TR -3000156160,3000164351,UA -3000164352,3000172543,HU -3000172544,3000180735,RU -3000180736,3000188927,TR -3000188928,3000197119,IT -3000197120,3000213503,UA -3000213504,3000221695,RU -3000221696,3000229887,TR -3000229888,3000238079,CH -3000238080,3000240127,KZ -3000240128,3000242175,RU -3000242176,3000244223,AT -3000244224,3000246271,PL -3000248320,3000252415,PL -3000252416,3000254463,RO -3000254464,3000256511,UA -3000256512,3000260607,RU -3000260608,3000262655,RS -3000262656,3000266751,UA -3000266752,3000268799,DE -3000268800,3000270847,PL -3000270848,3000272895,RU -3000272896,3000274943,IT -3000274944,3000283135,PL -3000283136,3000285183,RU -3000285184,3000287231,RO -3000287232,3000289279,UA -3000289280,3000291327,RO -3000291328,3000293375,RU -3000293376,3000295423,PL -3000295424,3000297471,RU -3000297472,3000301567,UA -3000301568,3000302591,RU -3000302592,3000303103,LV -3000303104,3000303359,CH -3000303360,3000303615,DE -3000303616,3000305663,UA -3000305664,3000313855,RU -3000313856,3000315903,CZ -3000315904,3000317951,LV -3000317952,3000319999,PL -3000320000,3000322047,FR -3000322048,3000322303,PL -3000322304,3000322559,GB -3000322560,3000322815,DE -3000322816,3000323071,RU -3000323072,3000323583,DE -3000323584,3000326143,RU -3000326144,3000330239,PL -3000330240,3000332287,UA -3000332288,3000334335,RU -3000334336,3000336383,PL -3000336384,3000338431,AM -3000338432,3000340479,PL -3000340480,3000342527,RU -3000342528,3000344575,CZ -3000344576,3000346623,PL -3000346624,3000348671,UA -3000348672,3000350719,RO -3000350720,3000352767,UA -3000352768,3000358911,RU -3000358912,3000360959,PL -3000360960,3000363007,RU -3000363008,3000365055,FI -3000365056,3000369151,RU -3000369152,3000377343,PL -3000377344,3000385535,RU -3000385536,3000393727,PS -3000393728,3000401919,NL -3000401920,3000410111,PL -3000410112,3000426495,UA -3000426496,3000434687,RU -3000434688,3000451071,IR -3000451072,3000467455,RU -3000467456,3000471551,GB -3000471552,3000475647,RU -3000475648,3000483839,UA -3000483840,3000487935,PL -3000487936,3000492031,PS -3000496128,3000506367,UA -3000506368,3000508415,PL -3000508416,3000510463,RU -3000510464,3000512511,PL -3000512512,3000513791,SE -3000513792,3000514047,PT -3000514048,3000514303,SE -3000514304,3000514559,BE -3000514560,3000516607,SI -3000516608,3000520703,RU -3000520704,3000522751,CZ -3000522752,3000524799,PL -3000524800,3000526847,UA -3000526848,3000528895,PL -3000528896,3000530943,IE -3000530944,3000532991,UA -3000532992,3000535039,UZ -3000535040,3000537087,PL -3000537088,3000539135,CZ -3000539136,3000543231,RU -3000543232,3000545279,UA -3000545280,3000547327,RU -3000547328,3000549375,UA -3000549376,3000551423,SE -3000551424,3000553471,PL -3000553472,3000555519,KG -3000555520,3000557567,RU -3000557568,3000561663,UA -3000563712,3000565759,IR -3000565760,3000567807,RU -3000567808,3000569855,RS -3000569856,3000571903,BE -3000571904,3000573951,RU -3000573952,3000575999,PL -3000576000,3000586239,RU -3000586240,3000588287,NL -3000590336,3000594431,RU -3000594432,3000596479,PL -3000596480,3000598527,RU -3000598528,3000600575,FI -3000600576,3000602623,PL -3000602624,3000604671,CZ -3000604672,3000606719,RU -3000606720,3000608767,UA -3000608768,3000610815,KG -3000610816,3000612863,RU -3000612864,3000612930,PL -3000612931,3000612931,PT -3000612932,3000613022,PL -3000613023,3000613023,PT -3000613024,3000613241,PL -3000613242,3000613242,PT -3000613243,3000616959,PL -3000616960,3000621055,UA -3000621056,3000623103,PL -3000623104,3000625151,RU -3000627200,3000629247,CZ -3000629248,3000631295,PL -3000631296,3000647679,RU -3000647680,3000651775,UA -3000651776,3000664063,RU -3000664064,3000668159,RO -3000672256,3000676351,HR -3000676352,3000680447,SA -3000682496,3000684543,UZ -3000684544,3000688639,RU -3000688640,3000692735,PL -3000696832,3000700927,RS -3000700928,3000705023,PL -3000705024,3000709119,RU -3000709120,3000713215,AM -3000713216,3000717311,IT -3000717312,3000721407,UA -3000721408,3000733695,PL -3000733696,3000737791,RU -3000737792,3000741887,UA -3000741888,3000745983,RU -3000745984,3000750079,UA -3000750080,3000754175,RU -3000754176,3000758271,IR -3000758272,3000762367,UA -3000762368,3000781311,RS -3000781312,3000781439,XK -3000781440,3000928767,RS -3000928768,3000929279,XK -3000929280,3001024511,RS -3001024512,3001548799,NL -3001548800,3001614335,NO -3001614336,3001679871,TR -3001679872,3001745407,RU -3001745408,3001810943,PL -3001810944,3001815039,IE -3001815040,3001819135,RU -3001819136,3001823231,IR -3001823232,3001827327,GE -3001827328,3001831423,SE -3001831424,3001835519,BA -3001835520,3001839615,IR -3001839616,3001843711,ES -3001843712,3001845759,RU -3001845760,3001846238,GB -3001846239,3001846239,RU -3001846240,3001846527,GB -3001846528,3001847807,RU -3001847808,3001851903,GB -3001851904,3001855999,IT -3001856000,3001857023,NL -3001857024,3001857279,MD -3001857280,3001859071,NL -3001859072,3001860095,MD -3001860096,3001861119,LV -3001861120,3001862143,LT -3001862144,3001863167,EE -3001863168,3001864191,LT -3001864192,3001868287,RU -3001868288,3001869311,US -3001869312,3001870591,FR -3001870592,3001870847,CA -3001870848,3001871103,FR -3001871104,3001871359,ID -3001871360,3001872383,US -3001872384,3001876479,RU -3001876480,3001880575,IT -3001880576,3001884671,RU -3001884672,3001888767,NL -3001892864,3001896959,AZ -3001896960,3001901055,CH -3001901056,3001905151,FR -3001905152,3001909247,GB -3001909248,3001917439,ES -3001917440,3001919487,GB -3001919488,3001919999,AU -3001920000,3001920255,GB -3001920256,3001920511,AU -3001920512,3001921535,GB -3001921536,3001929727,RU -3001929728,3001933823,RS -3001933824,3001937919,ES -3001937920,3001942015,RU -3001946112,3001950207,RU -3001950208,3001954303,CZ -3001954304,3001958399,IT -3001958400,3001962495,KZ -3001962496,3001966335,GB -3001966336,3001966591,DE -3001966592,3001970687,NL -3001970688,3001974783,RU -3001974784,3001982975,GB -3001982976,3001987071,CH -3001987072,3001991167,JO -3001991168,3001995263,IR -3001995264,3001999359,HU -3001999360,3002003455,DE -3002003456,3002011647,PL -3002011648,3002015743,BA -3002015744,3002019839,IT -3002019840,3002021271,NL -3002021272,3002021279,MT -3002021280,3002023935,NL -3002023936,3002028031,DE -3002028032,3002036223,GB -3002036224,3002040319,BG -3002040320,3002044415,PL -3002044416,3002048511,IR -3002048512,3002052607,GB -3002052608,3002056703,IT -3002056704,3002060799,FI -3002060800,3002064895,ES -3002064896,3002068991,BG -3002068992,3002073087,ES -3002073088,3002597375,TR -3002597376,3002599423,RU -3002599424,3002601471,CZ -3002601472,3002603519,IS -3002603520,3002605567,SE -3002605568,3002607615,GB -3002607616,3002609663,IR -3002609664,3002611711,GB -3002611712,3002613759,CZ -3002613760,3002615807,RU -3002615808,3002617855,PL -3002617856,3002619903,RU -3002619904,3002621951,IT -3002621952,3002623999,NO -3002624000,3002626047,GB -3002626048,3002626303,IN -3002626304,3002628095,DE -3002628096,3002630143,NO -3002630144,3002632191,GB -3002632192,3002634239,EE -3002634240,3002636287,IT -3002636288,3002638335,NL -3002638336,3002640383,BE -3002640384,3002642431,NL -3002642432,3002644479,IT -3002644480,3002648575,FR -3002648576,3002650623,HU -3002650624,3002652671,FR -3002652672,3002654719,DE -3002654720,3002656767,NL -3002656768,3002657068,RU -3002657069,3002657069,EE -3002657070,3002658815,RU -3002658816,3002660863,DE -3002660864,3002662911,CZ -3002662912,3002664959,DE -3002664960,3002667007,ES -3002667008,3002669055,GE -3002669056,3002671103,DE -3002671104,3002673151,LV -3002673152,3002675199,GB -3002675200,3002677247,DK -3002677248,3002683391,RU -3002683392,3002685439,DE -3002685440,3002687487,PL -3002687488,3002688511,GB -3002688512,3002689535,NL -3002689536,3002691583,IL -3002691584,3002693631,MK -3002693632,3002695679,NO -3002695680,3002697727,RU -3002697728,3002699775,DE -3002699776,3002701823,SE -3002701824,3002703871,NL -3002703872,3002705919,FR -3002705920,3002707967,BG -3002707968,3002710015,KW -3002710016,3002712063,IT -3002712064,3002714111,LU -3002714112,3002716159,IT -3002716160,3002718207,CZ -3002718208,3002722303,IT -3002724352,3002726399,RU -3002726400,3002728447,NL -3002728448,3002730495,FR -3002730496,3002732543,DE -3002732544,3002734591,NL -3002734592,3002736639,CH -3002736640,3002738687,LT -3002738688,3002740735,PL -3002740736,3002742783,GB -3002742784,3002744831,LI -3002744832,3002746879,IT -3002746880,3002748927,GB -3002748928,3002750975,DE -3002750976,3002753023,TR -3002753024,3002755071,GB -3002755072,3002757119,FR -3002757120,3002759167,IE -3002759168,3002761215,DE -3002761216,3002763263,CH -3002763264,3002765311,RS -3002765312,3002767359,NL -3002767360,3002769407,RU -3002769408,3002773503,DE -3002773504,3002775551,GB -3002775552,3002777599,RO -3002777600,3002779647,NL -3002779648,3002781695,IT -3002781696,3002783743,FR -3002783744,3002785791,NO -3002785792,3002789887,DE -3002789888,3002791935,RU -3002791936,3002793983,AE -3002793984,3002796031,DK -3002796032,3002798079,DE -3002798080,3002800127,FR -3002800128,3002802175,NL -3002802176,3002804223,GB -3002804224,3002806271,TR -3002806272,3002808319,DE -3002808320,3002810367,FI -3002810368,3002812415,AT -3002812416,3002814463,IT -3002814464,3002816511,FR -3002816512,3002818559,DE -3002818560,3002820607,RU -3002820608,3002822655,UA -3002822656,3002824703,DE -3002826752,3002828799,SE -3002828800,3002830847,RU -3002830848,3002834943,FI -3002834944,3002835063,BE -3002835064,3002835067,LU -3002835068,3002836319,BE -3002836320,3002836335,LU -3002836336,3002836991,BE -3002836992,3002841087,GB -3002841088,3002843135,CZ -3002843136,3002845183,NL -3002845184,3002847231,FR -3002847232,3002849279,IR -3002849280,3002851327,RU -3002851328,3002853375,DE -3002853376,3002855423,GB -3002855424,3002857471,SE -3002857472,3002859519,FR -3002859520,3002875903,PL -3002875904,3002892287,RU -3002892288,3002908671,IR -3002908672,3002925055,RU -3002925056,3002941439,IR -3002941440,3002957823,SY -3002957824,3002974207,SK -3002974208,3002990591,RS -3002990592,3003006975,DE -3003006976,3003023359,LU -3003023360,3003039743,RS -3003039744,3003056127,BG -3003056128,3003058175,DE -3003058176,3003060223,EE -3003060224,3003062271,DE -3003062272,3003064319,NL -3003064320,3003066367,RO -3003066368,3003068415,PL -3003068416,3003070463,NL -3003070464,3003074559,GB -3003074560,3003076607,IT -3003076608,3003078143,GB -3003078144,3003078151,US -3003078152,3003078155,IN -3003078156,3003080703,GB -3003080704,3003082751,FR -3003082752,3003084799,ES -3003086848,3003088895,RU -3003088896,3003090943,FR -3003090944,3003092991,DE -3003092992,3003095039,NO -3003095040,3003095295,AT -3003095296,3003095551,CH -3003095552,3003095807,CZ -3003095808,3003096063,IT -3003096064,3003097087,AT -3003097088,3003099135,FR -3003099136,3003101183,CZ -3003101184,3003103231,UA -3003103232,3003105279,IT -3003105280,3003109375,NL -3003109376,3003111423,FR -3003111424,3003113471,IT -3003113472,3003115519,ES -3003115520,3003117567,RU -3003117568,3003119615,IT -3003119616,3003121663,RU -3003121664,3003122175,AR -3003122176,3003122687,CL -3003122688,3003123711,AR -3003123712,3003123967,CL -3003123968,3003124479,CO -3003124480,3003124735,AR -3003124736,3003125247,SV -3003125248,3003125503,AR -3003125504,3003125759,CO -3003125760,3003126783,CL -3003126784,3003127807,CR -3003127808,3003128063,CO -3003128064,3003128319,AR -3003128320,3003128575,PY -3003128576,3003128831,CO -3003128832,3003129087,TT -3003129088,3003129343,CO -3003129344,3003129599,BO -3003129600,3003129855,HN -3003129856,3003138047,MX -3003138048,3003146239,HN -3003146240,3003150335,GT -3003150336,3003154431,SV -3003154432,3003154687,CL -3003154688,3003154943,EC -3003154944,3003159039,AR -3003159040,3003159295,CO -3003159296,3003159807,AR -3003159808,3003160063,BR -3003160064,3003160575,AR -3003160576,3003160831,CL -3003160832,3003161087,PE -3003161088,3003161343,CO -3003161344,3003161599,CL -3003161600,3003162623,UY -3003162624,3003170815,CR -3003170816,3003171071,GT -3003171072,3003171327,AR -3003171328,3003171839,PA -3003171840,3003172863,TT -3003172864,3003173375,PA -3003173376,3003173631,CR -3003173632,3003173887,AR -3003173888,3003174143,EC -3003174144,3003174399,CO -3003174400,3003174911,BR -3003174912,3003179007,CR -3003179008,3003187199,AR -3003187200,3003189215,CO -3003189216,3003189247,AT -3003189248,3003252735,CO -3003252736,3003449343,CL -3003449344,3003514879,SV -3003514880,3003645951,PE -3003645952,3003777023,CL -3003777024,3003908095,BR -3003908096,3004170239,CO -3004170240,3004301311,BR -3004301312,3004432383,CO -3004432384,3004694527,VE -3004694528,3005218815,UY -3005218816,3005349887,CO -3005349888,3005480959,BR -3005480960,3005874175,AR -3005874176,3005890559,PA -3005890560,3005890815,CO -3005890816,3005893887,PA -3005893888,3005894655,CO -3005894656,3005895423,PA -3005895424,3005896191,CO -3005896192,3005896703,PA -3005896704,3005897215,CO -3005897216,3005897471,PA -3005897472,3005899519,CO -3005899520,3005900031,PA -3005900032,3005901055,CO -3005901056,3005901567,PA -3005901568,3005903103,CO -3005903104,3005903359,PA -3005903360,3005905407,CO -3005905408,3005905663,PA -3005905664,3005906687,CO -3005906688,3005911039,PA -3005911040,3005911807,CO -3005911808,3005912319,PA -3005912320,3005912575,CO -3005912576,3005912831,PA -3005912832,3005913087,CO -3005913088,3005913599,PA -3005913600,3005913855,CO -3005913856,3005914623,PA -3005914624,3005915135,CO -3005915136,3005918207,AR -3005918208,3005919231,CO -3005919232,3005923327,AR -3005923328,3005939711,BZ -3005956096,3005960191,AR -3005960192,3005965311,PE -3005965312,3005966335,AR -3005966336,3005968383,CO -3005968384,3005972479,AR -3005972480,3005988863,CH -3005988864,3006005247,DO -3006005248,3006267391,VE -3006267392,3006283775,PA -3006283776,3006284287,CR -3006284288,3006284543,PA -3006284544,3006284799,CR -3006284800,3006285055,PA -3006285056,3006285567,CR -3006285568,3006286335,PA -3006286336,3006286591,CR -3006286592,3006286847,PA -3006286848,3006287103,CR -3006287104,3006287871,PA -3006287872,3006288383,CR -3006288384,3006288639,PA -3006288640,3006289151,CR -3006289152,3006289663,PA -3006289664,3006291711,CR -3006291712,3006308351,PA -3006308352,3006308863,CR -3006308864,3006309631,PA -3006309632,3006311167,CR -3006311168,3006311423,PA -3006311424,3006312191,CR -3006312192,3006312447,PA -3006312448,3006312703,CR -3006312704,3006312959,PA -3006312960,3006313983,CR -3006313984,3006314239,PA -3006314240,3006315007,CR -3006315008,3006315263,PA -3006315264,3006315775,CR -3006315776,3006316031,PA -3006316032,3006316543,CR -3006316544,3006320639,PA -3006320640,3006320895,CR -3006320896,3006321151,PA -3006321152,3006321407,CR -3006321408,3006322175,PA -3006322176,3006322431,CR -3006322432,3006323199,PA -3006323200,3006324735,CR -3006324736,3006328831,PA -3006328832,3006329599,NI -3006329600,3006329855,PA -3006329856,3006330111,NI -3006330112,3006330623,PA -3006330624,3006330879,NI -3006330880,3006331903,CR -3006331904,3006332927,AR -3006332928,3006349311,EC -3006349312,3006349847,PE -3006349848,3006349855,BO -3006349856,3006351359,PE -3006351360,3006353407,AR -3006353408,3006357503,DO -3006357504,3006361599,AR -3006361600,3006363647,HN -3006363648,3006365695,AR -3006365696,3006431231,CO -3006431232,3006463999,CR -3006464000,3006480383,SV -3006480384,3006484479,DO -3006484480,3006488575,AR -3006488576,3006496767,CO -3006496768,3006521343,CR -3006521344,3006527487,AR -3006527488,3006528511,BR -3006528512,3006529535,BZ -3006529536,3006660607,DO -3006660608,3006791679,BR -3006791680,3006922751,CL -3006922752,3007053823,BO -3007053824,3007062015,AR -3007062016,3007066111,CO -3007066112,3007070207,EC -3007070208,3007078399,CL -3007078400,3007082495,AR -3007082496,3007086591,BO -3007090688,3007091199,NL -3007091200,3007092223,RU -3007092224,3007092479,VE -3007092480,3007092735,IR -3007092736,3007094783,AR -3007094784,3007096831,CR -3007096832,3007098879,AR -3007098880,3007099463,HN -3007099464,3007099471,IN -3007099472,3007099631,HN -3007099632,3007099639,GB -3007099640,3007100055,HN -3007100056,3007100063,BR -3007100064,3007100407,HN -3007100408,3007100415,PH -3007100416,3007100463,HN -3007100464,3007100471,IN -3007100472,3007100927,HN -3007100928,3007102975,AR -3007102976,3007103999,US -3007104000,3007106047,AR -3007106048,3007107071,PE -3007107072,3007108095,AR -3007108096,3007109119,TT -3007109120,3007111167,AR -3007111168,3007112191,PE -3007112192,3007115263,AR -3007115264,3007116287,CO -3007116288,3007117311,EC -3007117312,3007122431,AR -3007122432,3007122943,CL -3007122944,3007123199,PE -3007123200,3007123455,CO -3007123456,3007143935,AR -3007143936,3007148031,CL -3007148032,3007152127,CO -3007152128,3007152383,DE -3007152384,3007152639,US -3007152640,3007153279,DE -3007153280,3007153407,US -3007153408,3007153919,DE -3007153920,3007154175,US -3007154176,3007154303,DE -3007154304,3007154687,US -3007154688,3007154943,DE -3007154944,3007155199,US -3007155200,3007155327,DE -3007155328,3007155711,US -3007155712,3007155967,DE -3007155968,3007156223,AT -3007156224,3007156351,DE -3007156352,3007156479,US -3007156480,3007156495,ES -3007156496,3007156543,DE -3007156544,3007156607,GB -3007156608,3007156991,DE -3007156992,3007157007,HR -3007157008,3007157055,DE -3007157056,3007157119,GB -3007157120,3007157375,DE -3007157376,3007157503,US -3007157504,3007157519,IE -3007157520,3007157567,DE -3007157568,3007157631,GB -3007157632,3007157759,US -3007157760,3007158015,DE -3007158016,3007158031,BE -3007158032,3007158079,DE -3007158080,3007158143,GB -3007158144,3007158399,DE -3007158400,3007158527,US -3007158528,3007158543,GB -3007158544,3007158591,DE -3007158592,3007158655,GB -3007158656,3007159039,DE -3007159040,3007159055,GB -3007159056,3007159103,DE -3007159104,3007159167,GB -3007159168,3007159295,US -3007159296,3007159423,DE -3007159424,3007159551,US -3007159552,3007159567,RU -3007159568,3007159615,DE -3007159616,3007159679,GB -3007159680,3007160063,DE -3007160064,3007160079,HR -3007160080,3007160127,DE -3007160128,3007160191,GB -3007160192,3007160447,DE -3007160448,3007160575,US -3007160576,3007160591,IE -3007160592,3007160607,US -3007160608,3007160639,DE -3007160640,3007160655,GB -3007160656,3007160703,DE -3007160704,3007160831,US -3007160832,3007161087,DE -3007161088,3007161103,GB -3007161104,3007161151,DE -3007161152,3007161167,GB -3007161168,3007161471,DE -3007161472,3007161599,US -3007161600,3007161615,GB -3007161616,3007161663,DE -3007161664,3007161679,GB -3007161680,3007162111,DE -3007162112,3007162127,ES -3007162128,3007162175,DE -3007162176,3007162191,GB -3007162192,3007162239,DE -3007162240,3007162367,US -3007162368,3007162495,DE -3007162496,3007162623,US -3007162624,3007162639,NL -3007162640,3007162687,DE -3007162688,3007162703,GB -3007162704,3007163135,DE -3007163136,3007163151,GB -3007163152,3007163519,DE -3007163520,3007163647,US -3007163648,3007163663,ES -3007163664,3007163775,DE -3007163776,3007163903,US -3007163904,3007164159,DE -3007164160,3007164175,SK -3007164176,3007164543,DE -3007164544,3007164671,US -3007164672,3007164687,SE -3007164688,3007165183,DE -3007165184,3007165199,GB -3007165200,3007165311,DE -3007165312,3007165439,US -3007165440,3007165567,DE -3007165568,3007165695,US -3007165696,3007165711,DK -3007165712,3007166207,DE -3007166208,3007166223,TR -3007166224,3007166591,DE -3007166592,3007166719,US -3007166720,3007166735,GB -3007166736,3007166847,DE -3007166848,3007166975,US -3007166976,3007167231,DE -3007167232,3007167247,ES -3007167248,3007167615,DE -3007167616,3007167743,US -3007167744,3007167759,AU -3007167760,3007168127,DE -3007168128,3007168255,US -3007168256,3007168271,GR -3007168272,3007168383,DE -3007168384,3007168511,US -3007168512,3007168767,QA -3007168768,3007169023,CL -3007169024,3007169151,US -3007169152,3007169279,CL -3007169280,3007170047,US -3007170048,3007170303,MX -3007170304,3007170559,US -3007170560,3007171071,DE -3007171072,3007171327,US -3007171328,3007171583,ES -3007171584,3007171839,US -3007171840,3007171855,CL -3007171856,3007171871,US -3007171872,3007171873,BR -3007171874,3007171875,CL -3007171876,3007172095,BR -3007172096,3007172351,US -3007172352,3007172383,FR -3007172384,3007172415,BE -3007172416,3007172447,CL -3007172448,3007172607,BR -3007172608,3007172863,US -3007172864,3007173023,BR -3007173024,3007173055,NZ -3007173056,3007173119,BR -3007173120,3007173375,US -3007173376,3007173407,NO -3007173408,3007173439,SE -3007173440,3007173631,BR -3007173632,3007173663,NO -3007173664,3007173695,NZ -3007173696,3007173887,BR -3007173888,3007174015,US -3007174016,3007174047,NL -3007174048,3007174079,FR -3007174080,3007174271,BR -3007174272,3007174303,FI -3007174304,3007174335,NL -3007174336,3007174431,BR -3007174432,3007174463,IT -3007174464,3007174655,BR -3007174656,3007175679,US -3007175680,3007175935,GB -3007175936,3007175967,NZ -3007175968,3007175999,BE -3007176000,3007176319,BR -3007176320,3007176351,SE -3007176352,3007176383,FR -3007176384,3007176447,BR -3007176448,3007176703,US -3007176704,3007177727,IN -3007177728,3007178751,US -3007178752,3007179007,NL -3007179008,3007179263,KR -3007179264,3007179775,US -3007179776,3007180031,SG -3007180032,3007181055,US -3007181056,3007181183,BR -3007181184,3007181215,IT -3007181216,3007181247,IS -3007181248,3007181311,BR -3007181312,3007181567,US -3007181568,3007181599,NL -3007181600,3007181631,AU -3007181632,3007181823,BR -3007181824,3007181855,BE -3007181856,3007181887,NO -3007181888,3007182079,BR -3007182080,3007182335,US -3007182336,3007182591,BR -3007182592,3007182623,SE -3007182624,3007182655,NL -3007182656,3007182847,BR -3007182848,3007183103,US -3007183104,3007183231,BR -3007183232,3007183263,NZ -3007183264,3007183295,IT -3007183296,3007183359,BR -3007183360,3007183615,AU -3007183616,3007183871,IE -3007183872,3007184127,US -3007184128,3007184383,KW -3007184384,3007184895,BR -3007184896,3007250431,AR -3007250432,3007283199,CR -3007283200,3007283455,PA -3007283456,3007283711,CR -3007283712,3007284223,PA -3007284224,3007284735,CR -3007284736,3007285247,PA -3007285248,3007285503,CR -3007285504,3007285759,PA -3007285760,3007286015,CR -3007286016,3007286271,PA -3007286272,3007286783,CR -3007286784,3007287295,PA -3007287296,3007299583,CR -3007299584,3007301631,PA -3007301632,3007305727,AR -3007305728,3007307775,BZ -3007307776,3007310847,CL -3007310848,3007312895,AR -3007312896,3007313919,CL -3007313920,3007314943,AR -3007314944,3007315967,HN -3007315968,3019898879,BR -3019898880,3024093183,JP -3024093184,3024617471,KR -3024617472,3024879615,MY -3024879616,3025141759,CN -3025141760,3025403903,KR -3025403904,3025600511,CN -3025600512,3025601663,IN -3025601664,3025601791,HK -3025601792,3025601919,IN -3025601920,3025602047,CN -3025602048,3025602303,HK -3025602304,3025602559,IN -3025602560,3025602815,SG -3025602816,3025603071,IN -3025603072,3025603091,HK -3025603092,3025603103,CN -3025603104,3025603215,HK -3025603216,3025603231,CN -3025603232,3025603247,HK -3025603248,3025603257,CN -3025603258,3025603259,IN -3025603260,3025603271,HK -3025603272,3025603327,IN -3025603328,3025603335,GU -3025603336,3025603583,IN -3025603584,3025603839,SG -3025603840,3025604095,HK -3025604096,3025604351,IN -3025604352,3025606655,SG -3025606656,3025606815,IN -3025606816,3025606831,SG -3025606832,3025607167,IN -3025607168,3025607423,SG -3025607424,3025607679,HK -3025607680,3025608191,IN -3025608192,3025608203,JP -3025608204,3025608207,IN -3025608208,3025608223,SG -3025608224,3025608447,IN -3025608448,3025608703,HK -3025608704,3025610751,IN -3025610752,3025612799,SG -3025612800,3025612815,IN -3025612816,3025612831,SG -3025612832,3025612895,IN -3025612896,3025613087,SG -3025613088,3025613119,IN -3025613120,3025613351,SG -3025613352,3025613367,IN -3025613368,3025613375,SG -3025613376,3025613455,IN -3025613456,3025613463,SG -3025613464,3025616895,IN -3025616896,3025617439,SG -3025617440,3025617447,IN -3025617448,3025617455,SG -3025617456,3025617487,IN -3025617488,3025617503,SG -3025617504,3025617663,IN -3025617664,3025617919,SG -3025617920,3025618175,MY -3025618176,3025618179,TH -3025618180,3025618431,IN -3025618432,3025618687,TW -3025618688,3025618943,IN -3025618944,3025619535,SG -3025619536,3025619551,IN -3025619552,3025619719,SG -3025619720,3025619967,IN -3025619968,3025620243,TW -3025620244,3025620991,IN -3025620992,3025621247,PH -3025621248,3025621503,IN -3025621504,3025621759,PH -3025621760,3025622015,IN -3025622016,3025622447,SG -3025622448,3025622527,IN -3025622528,3025622783,ID -3025622784,3025623055,IN -3025623056,3025623103,SG -3025623104,3025623247,IN -3025623248,3025623251,HK -3025623252,3025623295,IN -3025623296,3025623551,JP -3025623552,3025623807,SG -3025623808,3025624063,IN -3025624064,3025624319,TW -3025624320,3025624335,IN -3025624336,3025624343,HK -3025624344,3025625343,IN -3025625344,3025625375,SG -3025625376,3025625391,IN -3025625392,3025625395,CA -3025625396,3025625399,IN -3025625400,3025625407,TH -3025625408,3025625471,SG -3025625472,3025625503,MY -3025625504,3025625535,SG -3025625536,3025625599,CA -3025625600,3025625855,SG -3025625856,3025625887,IN -3025625888,3025625915,SG -3025625916,3025625919,IN -3025625920,3025625927,KR -3025625928,3025625935,IN -3025625936,3025626015,SG -3025626016,3025626047,IN -3025626048,3025626079,SG -3025626080,3025626111,IN -3025626112,3025626623,SG -3025626624,3025629439,IN -3025629440,3025629567,HK -3025629568,3025629695,IN -3025629696,3025629951,HK -3025629952,3025630031,AU -3025630032,3025630207,IN -3025630208,3025630719,AU -3025630720,3025630975,JP -3025630976,3025631239,IN -3025631240,3025631247,AU -3025631248,3025631487,IN -3025631488,3025631743,HK -3025631744,3025631747,IN -3025631748,3025631767,HK -3025631768,3025631775,IN -3025631776,3025631839,HK -3025631840,3025631999,IN -3025632000,3025632255,HK -3025632256,3025632439,SG -3025632440,3025632447,IN -3025632448,3025632463,SG -3025632464,3025632479,HK -3025632480,3025632511,IN -3025632512,3025633151,SG -3025633152,3025633535,IN -3025633536,3025633791,HK -3025633792,3025633807,AU -3025633808,3025633823,IN -3025633824,3025633855,AU -3025633856,3025633919,IN -3025633920,3025634047,MY -3025634048,3025636351,IN -3025636352,3025636607,SG -3025636608,3025637151,IN -3025637152,3025637183,MY -3025637184,3025637375,IN -3025637376,3025637631,HK -3025637632,3025637887,MY -3025637888,3025638015,IN -3025638016,3025638047,HK -3025638048,3025638063,MY -3025638064,3025638143,IN -3025638144,3025638175,MY -3025638176,3025638183,SG -3025638184,3025638199,IN -3025638200,3025638207,SG -3025638208,3025638279,IN -3025638280,3025638303,SG -3025638304,3025638399,IN -3025638400,3025638655,SG -3025638656,3025638783,IN -3025638784,3025638791,HK -3025638792,3025639167,IN -3025639168,3025639175,SG -3025639176,3025639295,IN -3025639296,3025639327,AU -3025639328,3025639423,IN -3025639424,3025639535,SG -3025639536,3025639551,HK -3025639552,3025639679,SG -3025639680,3025639807,HK -3025639808,3025639839,IN -3025639840,3025639871,HK -3025639872,3025639883,CN -3025639884,3025639903,HK -3025639904,3025639943,IN -3025639944,3025639951,JP -3025639952,3025639967,IN -3025639968,3025639999,SG -3025640000,3025640191,IN -3025640192,3025640447,JP -3025640448,3025640835,MY -3025640836,3025640839,IN -3025640840,3025640855,MY -3025640856,3025640863,IN -3025640864,3025640895,MY -3025640896,3025641727,IN -3025641728,3025641751,HK -3025641752,3025641759,IN -3025641760,3025641779,HK -3025641780,3025641983,IN -3025641984,3025642495,HK -3025642496,3025642751,SG -3025642752,3025643039,IN -3025643040,3025643071,HK -3025643072,3025647103,IN -3025647104,3025647359,SG -3025647360,3025647615,AU -3025647616,3025647775,IN -3025647776,3025647791,SG -3025647792,3025647839,IN -3025647840,3025647871,SG -3025647872,3025647903,HK -3025647904,3025647935,IN -3025647936,3025647967,SG -3025647968,3025648079,IN -3025648080,3025648087,SG -3025648088,3025648091,US -3025648092,3025648095,SG -3025648096,3025648127,IN -3025648128,3025648383,SG -3025648384,3025649151,IN -3025649152,3025649663,HK -3025649664,3025666047,IN -3025666048,3025928191,CN -3025928192,3025932287,TW -3025932288,3025944575,JP -3025944576,3025960959,KR -3025960960,3025969151,PK -3025969152,3025973247,IN -3025973248,3025974271,AU -3025974272,3025975295,HK -3025975296,3025977343,SG -3025977344,3025979391,AU -3025979392,3025981439,IN -3025981440,3025982463,AU -3025982464,3025983487,ID -3025983488,3025985535,AU -3025985536,3025989631,BD -3025989632,3025993727,KR -3025993728,3026059263,VN -3026059264,3026067455,PH -3026067456,3026068479,IN -3026068480,3026069503,PH -3026069504,3026071551,JP -3026071552,3026073599,AU -3026073600,3026075647,CN -3026075648,3026083839,AF -3026083840,3026087935,CN -3026087936,3026089983,AU -3026089984,3026092031,CN -3026092032,3026104319,MO -3026104320,3026106367,CN -3026106368,3026108415,MO -3026108416,3026116607,JP -3026116608,3026118655,HK -3026118656,3026120703,AU -3026120704,3026124799,JP -3026124800,3026157567,AU -3026157568,3028287487,CN -3028287488,3028353023,TH -3028353024,3028385791,SG -3028385792,3028484095,CN -3028484096,3028500479,KR -3028500480,3028516863,JP -3028516864,3028518911,AU -3028518912,3028520959,JP -3028520960,3028521983,ID -3028521984,3028523007,LA -3028523008,3028525055,JP -3028525056,3028533247,HK -3028533248,3028549631,JP -3028549632,3028811775,KR -3028811776,3029336063,CN -3029336064,3029598207,JP -3029598208,3029600255,VN -3029600256,3029601279,AU -3029601280,3029602303,IN -3029602304,3029604351,CN -3029604352,3029605375,AU -3029605376,3029606399,JP -3029606400,3029614591,IN -3029614592,3029622783,AU -3029622784,3029630975,NZ -3029630976,3029635071,VN -3029635072,3029637119,JP -3029637120,3029639167,CN -3029639168,3029643263,JP -3029643264,3029644287,AU -3029644288,3029645311,KR -3029645312,3029651455,JP -3029651456,3029653503,BD -3029653504,3029663743,CN -3029663744,3029671935,BD -3029671936,3029680127,IN -3029680128,3029696511,MN -3029696512,3029704703,CN -3029704704,3029712895,JP -3029712896,3029714943,AU -3029714944,3029715199,JP -3029715200,3029715455,AU -3029715456,3029716991,JP -3029716992,3029721087,PK -3029721088,3029722111,IN -3029722112,3029722623,AU -3029722624,3029722879,JP -3029722880,3029723135,NZ -3029723136,3029724159,BD -3029724160,3029725183,CN -3029725184,3029727231,IN -3029727232,3029728255,AU -3029728256,3029729279,HK -3029729280,3029762047,AU -3029762048,3029770239,HK -3029770240,3029778431,CN -3029778432,3029788671,KR -3029788672,3029790719,ID -3029790720,3029791743,IN -3029791744,3029792767,ID -3029792768,3029793791,IN -3029793792,3029794815,PG -3029794816,3029860351,IN -3029860352,3031433215,CN -3031433216,3031564287,TW -3031564288,3031572479,IN -3031572480,3031580671,HK -3031580672,3031581695,AU -3031581696,3031582719,JP -3031582720,3031584767,SG -3031584768,3031587839,JP -3031587840,3031592959,ID -3031592960,3031595007,CN -3031595008,3031596031,AU -3031596032,3031597055,KH -3031597056,3031613439,PK -3031613440,3031629823,CN -3031629824,3031695359,IN -3031695360,3031760895,TH -3031760896,3031826431,AU -3031826432,3031891967,KR -3031891968,3031957503,TH -3031957504,3032252415,CN -3032252416,3032271871,HK -3032271872,3032272895,AU -3032272896,3032276991,JP -3032276992,3032285183,IN -3032285184,3032289279,JP -3032289280,3032293375,AU -3032293376,3032301567,JP -3032301568,3032317951,KR -3032317952,3032319999,JP -3032320000,3032323071,AU -3032323072,3032324095,CN -3032324096,3032326143,AU -3032326144,3032330239,TL -3032330240,3032334335,KR -3032334336,3032342527,NZ -3032342528,3032350719,JP -3032350720,3032743935,PH -3032743936,3033038847,JP -3033038848,3033063423,AU -3033063424,3033065471,JP -3033065472,3033066495,MY -3033066496,3033067519,BD -3033067520,3033068543,IN -3033068544,3033069567,AU -3033069568,3033070591,JP -3033070592,3033268223,CN -3033268224,3033530367,TW -3033530368,3033661439,CN -3033661440,3033694207,KR -3033694208,3033710591,BD -3033710592,3033712639,KR -3033712640,3033714687,SG -3033714688,3033715711,NZ -3033715712,3033716735,CN -3033716736,3033717759,TH -3033717760,3033718783,BD -3033718784,3033719807,HK -3033719808,3033726975,CN -3033726976,3033743359,KR -3033743360,3033745407,IN -3033745408,3033747455,JP -3033747456,3033748479,IN -3033748480,3033749503,JP -3033749504,3033751551,ID -3033751552,3033759743,IN -3033759744,3033792511,BD -3033792512,3033923583,CN -3033923584,3033939967,JP -3033939968,3033948159,AU -3033948160,3033956351,NC -3033956352,3033964543,IN -3033964544,3033966591,HK -3033966592,3033968639,AU -3033968640,3033972735,TW -3033972736,3033980927,TH -3033980928,3033982975,JP -3033982976,3033983999,ID -3033984000,3033985023,VN -3033985024,3033989119,ID -3033989120,3034054655,IN -3034054656,3034120191,AU -3034120192,3034251263,TW -3034251264,3034316799,HK -3034316800,3034447871,JP -3034447872,3034456063,AU -3034456064,3034464255,JP -3034464256,3034466303,NZ -3034466304,3034472447,JP -3034472448,3034478591,IN -3034478592,3034479615,TH -3034479616,3034480639,NZ -3034480640,3034482687,SG -3034482688,3034484735,AF -3034484736,3034488831,TH -3034488832,3034492927,AU -3034492928,3034497023,JP -3034497024,3034499071,AU -3034499072,3034500095,HK -3034500096,3034501118,PH -3034501119,3034501119,TW -3034501120,3034502143,VU -3034502144,3034503167,IN -3034503168,3034504191,ID -3034504192,3034505215,KR -3034505216,3034578943,CN -3034578944,3035103231,KR -3035103232,3035168767,PH -3035168768,3035193343,CN -3035193344,3035197439,JP -3035197440,3035198463,SG -3035198464,3035198719,KR -3035198720,3035198975,SG -3035198976,3035199487,HK -3035199488,3035200511,IN -3035200512,3035202559,AU -3035202560,3035205631,JP -3035205632,3035206655,CN -3035206656,3035207679,IN -3035207680,3035209727,ID -3035209728,3035217919,HK -3035217920,3035234303,KR -3035234304,3035299839,BD -3035299840,3035316223,JP -3035316224,3035324415,CN -3035324416,3035326463,JP -3035326464,3035327487,NZ -3035327488,3035328511,AU -3035328512,3035329535,CN -3035329536,3035330559,MM -3035330560,3035331583,IN -3035331584,3035332607,JP -3035332608,3035333631,AU -3035333632,3035334655,HK -3035334656,3035334911,DE -3035334912,3035335423,JP -3035335424,3035335679,US -3035335680,3035337727,JP -3035337728,3035338751,ID -3035338752,3035339775,SG -3035339776,3035340799,AU -3035340800,3035348991,MN -3035348992,3035357183,AU -3035357184,3035365375,JP -3035365376,3035627519,KR -3035627520,3035660287,ID -3035660288,3035673343,SG -3035673344,3035673599,US -3035673600,3035676671,SG -3035676672,3035676927,US -3035676928,3035693055,SG -3035693056,3036610559,ID -3036610560,3036676095,SG -3036676096,3037697047,AR -3037697048,3037697055,US -3037697056,3037790207,AR -3037790208,3037986815,VE -3037986816,3038773247,AR -3038773248,3038904319,CO -3038904320,3039035391,VE -3039035392,3039166463,DO -3039166464,3039231999,PA -3039232000,3039297535,EC -3039297536,3039363071,PY -3039363072,3039379455,AW -3039379456,3039395839,GY -3039395840,3039396351,US -3039396352,3039396607,NL -3039396608,3039398911,US -3039398912,3039399935,BZ -3039399936,3039407103,US -3039407104,3039408127,BZ -3039408128,3039410175,US -3039410176,3039411199,BZ -3039411200,3039412223,CA -3039412224,3039412351,CL -3039412352,3039412479,BR -3039412480,3039412735,SG -3039412736,3039412991,TW -3039412992,3039413503,US -3039413504,3039414015,BR -3039414016,3039414527,US -3039414528,3039414783,BR -3039414784,3039415039,IT -3039415040,3039415295,BR -3039415296,3039415551,US -3039415552,3039415807,BR -3039415808,3039416575,US -3039416576,3039416591,BR -3039416592,3039416607,SG -3039416608,3039416713,BR -3039416714,3039416715,US -3039416716,3039416719,SG -3039416720,3039416735,BR -3039416736,3039416739,US -3039416740,3039416741,SG -3039416742,3039417087,BR -3039417088,3039417343,DE -3039417344,3039417599,BR -3039417600,3039417855,US -3039417856,3039418111,BR -3039418112,3039418623,US -3039418624,3039418879,BR -3039418880,3039419135,US -3039419136,3039419583,BR -3039419584,3039419647,SG -3039419648,3039419839,BR -3039419840,3039419903,SG -3039419904,3039420415,BR -3039420416,3039428607,AR -3039428608,3039559679,CL -3039559680,3039821823,AR -3039821824,3040870399,CO -3040870400,3041132543,PE -3041132544,3041394687,CO -3041394688,3041656831,CL -3041656832,3041787903,BR -3041787904,3041796095,CO -3041796096,3044016127,AR -3044016128,3044147199,EC -3044147200,3044155391,GT -3044155392,3044161535,AR -3044161536,3044162559,HN -3044162560,3044163583,AR -3044163584,3044179967,BO -3044179968,3044188159,AR -3044188160,3044196351,BO -3044196352,3044206591,AR -3044206592,3044208639,CL -3044208640,3044212735,BZ -3044212736,3044245503,HN -3044245504,3044278271,BO -3044278272,3044417535,AR -3044417536,3044418047,CY -3044418048,3044421631,PA -3044421632,3044425727,CY -3044425728,3044446207,AR -3044446208,3044450303,CO -3044450304,3044454399,CL -3044454400,3044482559,AR -3044482560,3044482687,CO -3044482688,3044540415,AR -3044540416,3045064703,PY -3045064704,3047161855,CO -3047161856,3047423999,CL -3047424000,3047948287,AR -3047948288,3048079359,CL -3048079360,3048095743,CO -3048095744,3048112127,GT -3048112128,3048120319,AR -3048120320,3048121343,PY -3048121344,3048122367,PA -3048122368,3048123007,CR -3048123008,3048123071,PL -3048123072,3048123391,CR -3048123392,3048126463,AR -3048126464,3048128511,ES -3048128512,3048132607,AR -3048132608,3048144895,CR -3048144896,3048210431,EC -3048210432,3048275967,PE -3048275968,3048292351,AR -3048292352,3048292799,CA -3048292800,3048292807,ES -3048292808,3048293271,CA -3048293272,3048293279,ES -3048293280,3048293599,CA -3048293600,3048293615,ES -3048293616,3048294627,CA -3048294628,3048294631,BR -3048294632,3048294759,CA -3048294760,3048294767,BR -3048294768,3048296447,CA -3048296448,3048296751,US -3048296752,3048296759,CA -3048296760,3048297407,US -3048297408,3048297423,CA -3048297424,3048299487,US -3048299488,3048299503,BR -3048299504,3048299599,US -3048299600,3048299607,BR -3048299608,3048299655,US -3048299656,3048299663,BR -3048299664,3048300863,US -3048300864,3048300895,CA -3048300896,3048301311,US -3048301312,3048301343,CA -3048301344,3048301471,US -3048301472,3048301503,CA -3048301504,3048301935,US -3048301936,3048301951,CA -3048301952,3048302295,US -3048302296,3048302303,CA -3048302304,3048302815,US -3048302816,3048302823,NL -3048302824,3048303303,US -3048303304,3048303311,NL -3048303312,3048304031,US -3048304032,3048304047,NL -3048304048,3048304663,US -3048304664,3048304671,CR -3048304672,3048304919,US -3048304920,3048304927,CR -3048304928,3048304999,US -3048305000,3048305007,CR -3048305008,3048305063,US -3048305064,3048305071,CR -3048305072,3048307607,US -3048307608,3048307615,CA -3048307616,3048307743,US -3048307744,3048307751,CA -3048307752,3048307967,US -3048307968,3048307983,CA -3048307984,3048308103,US -3048308104,3048308111,CA -3048308112,3048308727,US -3048308728,3048308735,CR -3048308736,3048325119,BO -3048325120,3048331263,AR -3048331264,3048332287,GY -3048332288,3048333311,CL -3048333312,3048341503,PE -3048341504,3048472575,PA -3048472576,3048996863,VE -3048996864,3049029631,TT -3049029632,3049046015,BO -3049046016,3049062399,EC -3049062400,3049078271,CR -3049078272,3049078527,MX -3049078528,3049095167,CR -3049095168,3049103359,GT -3049103360,3049107455,AR -3049107456,3049111551,SV -3049111552,3049119743,AR -3049119744,3049127935,HN -3049127936,3049193471,CL -3049193472,3049199615,BR -3049199616,3049201663,AR -3049201664,3049202687,BR -3049202688,3049203711,AR -3049203712,3049209855,BR -3049209856,3049210879,AR -3049210880,3049211903,BO -3049211904,3049213951,BR -3049213952,3049214975,AR -3049214976,3049225215,BR -3049225216,3049226239,AR -3049226240,3049229311,BR -3049229312,3049230335,AR -3049230336,3049233407,BR -3049233408,3049234431,AR -3049234432,3049238527,BR -3049238528,3049239551,CL -3049239552,3049241087,BR -3049241088,3049241599,AR -3049241600,3049242623,MX -3049242624,3049249791,BR -3049249792,3049250815,AR -3049250816,3049251839,CL -3049251840,3049252863,BR -3049252864,3049253887,EC -3049253888,3049255935,BR -3049255936,3049259007,MX -3049259008,3049291775,AR -3049291776,3049324543,CO -3049324544,3049362175,CR -3049362176,3049362431,NI -3049362432,3049521151,CR -3049521152,3049586687,EC -3049586688,3049635839,PA -3049635840,3049652223,AR -3049652224,3049750527,EC -3049750528,3049754623,PE -3049754624,3049762815,AR -3049762816,3049766911,HN -3049766912,3049775103,ES -3049775104,3049783295,PA -3049783296,3050045439,CL -3050045440,3050307583,CO -3050307584,3050373119,VE -3050373120,3050405887,AR -3050405888,3050438655,GT -3050438656,3050504191,HN -3050504192,3050569727,EC -3050569728,3050635263,CL -3050635264,3050700799,BR -3050700800,3050700815,JP -3050700816,3050701055,BR -3050701056,3050701311,DE -3050701312,3050701327,IE -3050701328,3050701439,BR -3050701440,3050701503,US -3050701504,3050701567,BR -3050701568,3050701823,DE -3050701824,3050701839,SG -3050701840,3050702079,BR -3050702080,3050702335,US -3050702336,3050702351,DK -3050702352,3050702591,BR -3050702592,3050702847,US -3050702848,3050702863,FR -3050702864,3050703103,BR -3050703104,3050703359,US -3050703360,3050703375,AT -3050703376,3050703615,BR -3050703616,3050703871,US -3050703872,3050703887,PE -3050703888,3050704127,BR -3050704128,3050704383,US -3050704384,3050704399,KR -3050704400,3050704639,BR -3050704640,3050704895,US -3050704896,3050704911,IT -3050704912,3050705151,BR -3050705152,3050705407,US -3050705408,3050705423,JP -3050705424,3050705663,BR -3050705664,3050705919,SG -3050705920,3050705935,AU -3050705936,3050705983,BR -3050705984,3050706047,US -3050706048,3050706175,BR -3050706176,3050706431,US -3050706432,3050706447,NL -3050706448,3050706687,BR -3050706688,3050706943,US -3050706944,3050706959,HK -3050706960,3050707199,BR -3050707200,3050707455,US -3050707456,3050707471,IT -3050707472,3050707711,BR -3050707712,3050707967,US -3050707968,3050707983,CH -3050707984,3050708223,BR -3050708224,3050708479,US -3050708480,3050708495,FR -3050708496,3050708735,BR -3050708736,3050708991,US -3050708992,3050709007,AT -3050709008,3050709247,BR -3050709248,3050709503,DE -3050709504,3050709519,TH -3050709520,3050709759,BR -3050709760,3050710015,NL -3050710016,3050710031,ES -3050710032,3050710079,BR -3050710080,3050710143,US -3050710144,3050710271,BR -3050710272,3050710527,US -3050710528,3050710543,FR -3050710544,3050710783,BR -3050710784,3050711039,US -3050711040,3050711055,AU -3050711056,3050711295,BR -3050711296,3050711551,US -3050711552,3050711567,EE -3050711568,3050711615,BR -3050711616,3050711679,US -3050711680,3050711807,BR -3050711808,3050712063,US -3050712064,3050712079,FR -3050712080,3050712127,BR -3050712128,3050712191,US -3050712192,3050712319,BR -3050712320,3050712575,US -3050712576,3050712591,PL -3050712592,3050712831,BR -3050712832,3050713087,US -3050713088,3050713103,LV -3050713104,3050713215,BR -3050713216,3050713599,US -3050713600,3050713855,NL -3050713856,3050714367,US -3050714368,3050714623,GB -3050714624,3050714879,BR -3050714880,3050715135,ES -3050715136,3050724351,US -3050724352,3050724607,BG -3050724608,3050748159,US -3050748160,3050748415,GB -3050748416,3050753023,US -3050753024,3050753279,DE -3050753280,3050753385,PE -3050753386,3050753386,DE -3050753387,3050753535,PE -3050753536,3050754047,US -3050754048,3050755071,DE -3050755072,3050755327,CO -3050755328,3050755583,CL -3050755584,3050759935,US -3050759936,3050760191,GB -3050760192,3050766335,US -3050766336,3050766351,NO -3050766352,3050766591,BR -3050766592,3050766847,US -3050766848,3050766863,KR -3050766864,3050767103,BR -3050767104,3050767359,NL -3050767360,3050767375,AT -3050767376,3050767615,BR -3050767616,3050767871,US -3050767872,3050767887,MY -3050767888,3050768127,BR -3050768128,3050768383,US -3050768384,3050768399,AT -3050768400,3050768511,BR -3050768512,3050768575,US -3050768576,3050768639,BR -3050768640,3050768895,US -3050768896,3050768911,CZ -3050768912,3050769151,BR -3050769152,3050769407,US -3050769408,3050769423,AU -3050769424,3050769663,BR -3050769664,3050769919,US -3050769920,3050769935,MY -3050769936,3050770175,BR -3050770176,3050770431,US -3050770432,3050770447,LV -3050770448,3050770687,BR -3050770688,3050770943,US -3050770944,3050770959,HK -3050770960,3050771199,BR -3050771200,3050771455,US -3050771456,3050771471,SG -3050771472,3050771583,BR -3050771584,3050771967,US -3050771968,3050771983,EE -3050771984,3050772223,BR -3050772224,3050772479,US -3050772480,3050772495,MY -3050772496,3050772735,BR -3050772736,3050772991,US -3050772992,3050773007,HK -3050773008,3050773247,BR -3050773248,3050773503,US -3050773504,3050773519,NL -3050773520,3050773759,BR -3050773760,3050774015,US -3050774016,3050774031,TR -3050774032,3050774271,BR -3050774272,3050774527,US -3050774528,3050774543,ES -3050774544,3050774783,BR -3050774784,3050775039,US -3050775040,3050775055,KR -3050775056,3050775295,BR -3050775296,3050775551,US -3050775552,3050775567,FR -3050775568,3050775807,BR -3050775808,3050776063,US -3050776064,3050776079,MY -3050776080,3050776319,BR -3050776320,3050776575,US -3050776576,3050776591,TH -3050776592,3050776831,BR -3050776832,3050777087,US -3050777088,3050777103,AU -3050777104,3050777343,BR -3050777344,3050777599,RO -3050777600,3050777615,HK -3050777616,3050777855,BR -3050777856,3050778111,US -3050778112,3050778127,KR -3050778128,3050778367,BR -3050778368,3050778623,US -3050778624,3050778639,TR -3050778640,3050778879,BR -3050778880,3050800383,US -3050800384,3050800399,AL -3050800400,3050800415,AD -3050800416,3050800431,AI -3050800432,3050800447,AG -3050800448,3050800463,AR -3050800464,3050800479,AM -3050800480,3050800495,AZ -3050800496,3050800511,BS -3050800512,3050800639,US -3050800640,3050800655,BB -3050800656,3050800671,BY -3050800672,3050800687,BZ -3050800688,3050800703,BM -3050800704,3050800719,BO -3050800720,3050800735,BA -3050800736,3050800751,VG -3050800752,3050800767,KY -3050800768,3050800895,US -3050800896,3050800911,CN -3050800912,3050800927,CO -3050800928,3050800943,GG -3050800944,3050800959,CU -3050800960,3050800975,CY -3050800976,3050800991,DK -3050800992,3050801007,DO -3050801008,3050801023,EC -3050801024,3050801151,US -3050801152,3050801167,EG -3050801168,3050801175,GQ -3050801176,3050801183,NZ -3050801184,3050801199,GF -3050801200,3050801215,PF -3050801216,3050801231,GE -3050801232,3050801247,SV -3050801248,3050801263,GD -3050801264,3050801279,GT -3050801280,3050801407,US -3050801408,3050801423,HN -3050801424,3050801439,IR -3050801440,3050801455,JM -3050801456,3050801471,JO -3050801472,3050801487,KG -3050801488,3050801503,LB -3050801504,3050801519,LI -3050801520,3050801535,MG -3050801536,3050801663,US -3050801664,3050801679,MT -3050801680,3050801695,MQ -3050801696,3050801703,MU -3050801704,3050801711,CL -3050801712,3050801727,MX -3050801728,3050801743,MC -3050801744,3050801759,ME -3050801760,3050801775,NC -3050801776,3050801791,NI -3050801792,3050802175,US -3050802176,3050802191,OM -3050802192,3050802207,PK -3050802208,3050802223,PE -3050802224,3050802239,PH -3050802240,3050802255,PR -3050802256,3050802271,QA -3050802272,3050802279,LC -3050802280,3050802287,IN -3050802288,3050802303,RS -3050802304,3050802431,US -3050802432,3050802447,SC -3050802448,3050802463,SI -3050802464,3050802479,KR -3050802480,3050802495,LK -3050802496,3050802511,TW -3050802512,3050802519,TT -3050802520,3050802527,CR -3050802528,3050802543,UY -3050802544,3050802559,VE -3050802560,3050802687,US -3050802688,3050802751,NZ -3050802752,3050802815,NO -3050802816,3050803199,US -3050803200,3050803263,NL -3050803264,3050803327,SE -3050803328,3050803775,US -3050803776,3050803839,FR -3050803840,3050804223,US -3050804224,3050804287,BE -3050804288,3050804351,NZ -3050804352,3050805247,US -3050805248,3050805311,NL -3050805312,3050805375,FI -3050805376,3050805759,US -3050805760,3050805791,DK -3050805792,3050811391,US -3050811392,3050811647,HK -3050811648,3050812415,US -3050812416,3050813439,BR -3050813440,3050815487,DE -3050815488,3050816255,US -3050816256,3050816511,NL -3050816512,3050827263,US -3050827264,3050827519,BR -3050827520,3050829567,US -3050829568,3050829823,UA -3050829824,3050831871,US -3050831872,3051356159,BR -3051356160,3051372799,CR -3051372800,3051374591,PA -3051374592,3051374847,CR -3051374848,3051375103,PA -3051375104,3051375359,CR -3051375360,3051375871,PA -3051375872,3051380735,CR -3051380736,3051388927,AR -3051388928,3051389183,US -3051389184,3051390207,NL -3051390208,3051390719,US -3051390720,3051390975,NL -3051390976,3051394047,US -3051394048,3051394303,NL -3051394304,3051395071,US -3051395072,3051395327,NL -3051395328,3051395839,PA -3051395840,3051396351,US -3051396352,3051396607,PA -3051396608,3051396863,US -3051396864,3051397119,PA -3051397120,3051398143,CO -3051398144,3051399167,AR -3051399168,3051400191,DO -3051400192,3051401215,EC -3051401216,3051405311,AR -3051405312,3051407359,CR -3051407360,3051408383,PE -3051408384,3051409407,DO -3051409408,3051411455,AR -3051411456,3051413503,CR -3051413504,3051421695,PE -3051421696,3051429887,AR -3051429888,3051438079,VE -3051438080,3051450367,CO -3051450368,3051454463,CL -3051454464,3051456511,SV -3051456512,3051457535,AR -3051457536,3051460607,CL -3051462656,3051470847,PE -3051470848,3051479039,AR -3051479040,3051487231,CU -3051487232,3051552767,CL -3051552768,3051618303,BO -3051618304,3051880447,AR -3051880448,3051913215,CO -3051913216,3051983871,CR -3051983872,3051984895,BR -3051984896,3051995135,CR -3051995136,3052011519,PE -3052011520,3052273663,CO -3052273664,3052404735,AR -3052404736,3053453311,CO -3053453312,3054501887,ID -3054501888,3054534655,HK -3054534656,3054537727,PH -3054537728,3054538751,SG -3054538752,3054540799,CN -3054540800,3054541823,NZ -3054541824,3054542847,BD -3054542848,3054551039,ID -3054551040,3054559231,CN -3054559232,3054561279,JP -3054561280,3054562303,SG -3054562304,3054563327,JP -3054563328,3054567423,ID -3054567424,3054632959,TH -3054632960,3054665727,CN -3054665728,3054682111,IN -3054682112,3054698495,PH -3054698496,3054731263,IN -3054731264,3054764031,SG -3054764032,3054960639,JP -3054960640,3054993407,ID -3054993408,3054997503,IN -3054997504,3055001599,SG -3055001600,3055005695,ID -3055005696,3055007743,NZ -3055007744,3055009791,CN -3055009792,3055011839,AU -3055011840,3055013887,CN -3055013888,3055014911,JP -3055014912,3055015935,AU -3055015936,3055026175,JP -3055026176,3055484927,ID -3055484928,3055550463,KR -3055550464,3056599039,CN -3056599040,3056615423,JP -3056615424,3056623615,BD -3056623616,3056631807,CN -3056631808,3056639999,NZ -3056640000,3056648191,ID -3056648192,3056664575,IN -3056664576,3056734207,CN -3056734208,3056746495,KR -3056746496,3056747519,NP -3056747520,3056748543,IN -3056748544,3056749567,WS -3056749568,3056749595,SG -3056749596,3056749596,US -3056749597,3056750591,SG -3056750592,3056754687,TH -3056754688,3056758783,JP -3056758784,3056762879,CN -3056762880,3056771071,SG -3056771072,3056772095,NZ -3056772096,3056773119,JP -3056773120,3056774143,WS -3056774144,3056775167,JP -3056775168,3056779263,NO -3056779264,3056791551,JP -3056791552,3056795647,ID -3056795648,3056861183,CN -3056861184,3056992255,TH -3056992256,3057025023,CN -3057025024,3057026047,SG -3057026048,3057027071,US -3057027072,3057028095,TW -3057028096,3057029119,ID -3057029120,3057030143,SG -3057030144,3057031167,IN -3057031168,3057032191,BD -3057032192,3057033215,NP -3057033216,3057037311,NZ -3057037312,3057041407,JP -3057041408,3057049599,MY -3057049600,3057050623,AU -3057050624,3057051647,SG -3057051648,3057052415,AU -3057052416,3057052671,ES -3057052672,3057052927,IL -3057052928,3057053183,GB -3057053184,3057053439,US -3057053440,3057053695,SG -3057053696,3057054719,JP -3057054720,3057055743,CN -3057055744,3057057791,JP -3057057792,3057123327,SG -3057123328,3057451007,IN -3057451008,3057516543,CN -3057516544,3057647615,MY -3057647616,3058696191,IN -3058696192,3059548159,CN -3059548160,3059564543,MO -3059564544,3059572735,NP -3059572736,3059580927,JP -3059580928,3059613695,TH -3059613696,3059744767,IN -3059744768,3063414783,CN -3063414784,3063545855,HK -3063545856,3063611391,NZ -3063611392,3063676927,TW -3063676928,3063742463,IN -3063742464,3063807999,CN -3063808000,3063939071,JP -3063939072,3063955455,MN -3063955456,3063963647,CN -3063963648,3063971839,BD -3063971840,3063988223,AU -3063988224,3064004607,JP -3064004608,3064012799,LK -3064012800,3064013823,CA -3064013824,3064015871,HK -3064015872,3064016895,AU -3064016896,3064017919,SG -3064017920,3064018943,IN -3064018944,3064019967,NZ -3064019968,3064020991,HK -3064020992,3064021503,AU -3064021504,3064021759,HK -3064022016,3064023039,HK -3064023040,3064024063,SG -3064024064,3064025087,JP -3064025088,3064029183,VN -3064029184,3064135679,KR -3064135680,3064160255,JP -3064160256,3064168447,BD -3064168448,3064201215,KR -3064201216,3064725503,JP -3064725504,3064791039,KR -3064791040,3064807423,TW -3064807424,3064808447,IN -3064808448,3064808703,VG -3064808704,3064808959,JP -3064808960,3064809215,VN -3064809216,3064809471,VG -3064809472,3064810495,MY -3064810496,3064811519,HK -3064811520,3064823807,KR -3064823808,3064831999,JP -3064832000,3064840191,KR -3064840192,3064856575,GU -3064856576,3064987647,CN -3064987648,3066036223,PK -3066036224,3066560511,KR -3066560512,3067084799,CN -3067084800,3068657663,KR -3068657664,3068723199,TH -3068723200,3068919807,TW -3068919808,3068948479,JP -3068948480,3068949503,VN -3068949504,3068949759,AU -3068949760,3068949763,PG -3068949764,3068949937,AU -3068949938,3068949938,PG -3068949939,3068950527,AU -3068950528,3068952575,NZ -3068952576,3068985343,CN -3068985344,3068986367,HK -3068986368,3068987391,AU -3068987392,3068990463,IN -3068990464,3068991487,VN -3068991488,3068993535,CN -3068993536,3069018111,KR -3069018112,3069034495,IN -3069034496,3069050879,KR -3069050880,3069124607,CN -3069124608,3069126655,PH -3069126656,3069127679,MY -3069127680,3069128703,TW -3069128704,3069149183,HK -3069149184,3069181951,AU -3069181952,3069706239,CN -3069706240,3069968383,JP -3069968384,3069984767,KR -3069984768,3070001151,BD -3070001152,3070033919,KR -3070033920,3070099455,ID -3070099456,3070164991,CN -3070164992,3070167039,ID -3070167040,3070169087,TH -3070169088,3070170111,ID -3070170112,3070171135,MY -3070171136,3070172159,HK -3070172160,3070174207,AU -3070174208,3070175231,CN -3070175232,3070176255,PH -3070176256,3070177279,HK -3070177280,3070178303,PK -3070178304,3070179327,MM -3070179328,3070180351,IN -3070180352,3070181375,CN -3070181376,3070185471,JP -3070185472,3070197759,AU -3070197760,3070230527,KR -3070230528,3074949119,CN -3074949120,3075342335,JP -3075342336,3075375103,MY -3075375104,3075383295,KR -3075383296,3075385343,CN -3075385344,3075386367,MY -3075386368,3075387391,AU -3075387392,3075388415,HK -3075388416,3075389439,CN -3075389440,3075390463,IN -3075390464,3075391487,JP -3075391488,3075407871,KR -3075407872,3075473407,JP -3075473408,3075571711,VN -3075571712,3075575807,FJ -3075575808,3075577855,AU -3075577856,3075579903,ID -3075579904,3075581951,MY -3075581952,3075582975,MN -3075582976,3075583999,CN -3075584000,3075585023,JP -3075585024,3075586047,CN -3075586048,3075588095,KH -3075588096,3075604479,SG -3075604480,3075735551,IN -3075735552,3075866623,CN -3075866624,3075915775,JP -3075915776,3075932159,KR -3075932160,3075997695,IN -3075997696,3076128767,TH -3076128768,3076161535,SG -3076161536,3076169727,KR -3076169728,3076171775,VN -3076171776,3076173823,TH -3076173824,3076175871,JP -3076175872,3076177919,HK -3076177920,3076194303,JP -3076194304,3076202495,VN -3076202496,3076210687,HK -3076210688,3076218879,ID -3076218880,3076227071,JP -3076227072,3076228095,CN -3076228096,3076229119,NP -3076229120,3076235263,CN -3076235264,3076243455,VN -3076243456,3076259839,KR -3076259840,3076521983,CN -3076521984,3078619135,KR -3078619136,3081437183,CN -3081437184,3081502719,MY -3081502720,3081764863,CN -3081764864,3081842687,JP -3081842688,3081846783,AU -3081846784,3081847807,TW -3081847808,3081848831,KR -3081848832,3081850879,SG -3081850880,3081851903,HK -3081851904,3081852927,JP -3081852928,3081854975,HK -3081854976,3081859071,MN -3081859072,3081861119,PH -3081861120,3081862143,AU -3081862144,3081863167,IN -3081863168,3081895935,JP -3081895936,3082027007,HK -3082027008,3082158079,JP -3082158080,3082166271,CN -3082166272,3082174463,JP -3082174464,3082178559,BZ -3082178560,3082178823,HK -3082178824,3082178824,SG -3082178825,3082179047,HK -3082179048,3082179055,SG -3082179056,3082179079,HK -3082179080,3082179083,JP -3082179084,3082179583,HK -3082179584,3082181631,IN -3082181632,3082182655,ID -3082182656,3082190847,LA -3082190848,3082289151,JP -3082289152,3087007743,CN -3087007744,3088449535,US -3088449536,3088515071,TH -3088515072,3088629759,US -3088629760,3088633855,NL -3088633856,3088686591,US -3088686592,3088687103,NL -3088687104,3088708607,US -3088708608,3088709631,NL -3088709632,3088710655,US -3088710656,3088711167,NL -3088711168,3088785407,US -3088785408,3088786431,NL -3088786432,3088812031,US -3088812032,3088813055,NL -3088813056,3088827135,US -3088827136,3088827391,NL -3088827392,3088829951,US -3088829952,3088830463,NL -3088830464,3088830975,US -3088830976,3088831487,NL -3088831488,3088856063,US -3088856064,3088856575,NL -3088856576,3088857087,US -3088857088,3088857599,NL -3088857600,3088858111,US -3088858112,3088858623,NL -3088858624,3088863231,US -3088863232,3088863743,NL -3088863744,3088863999,US -3088864000,3088864255,NL -3088864256,3088867839,US -3088867840,3088868351,NL -3088868352,3088868607,US -3088868608,3088868863,NL -3088868864,3088869375,US -3088869376,3088870143,NL -3088870144,3088871423,US -3088871424,3088871935,NL -3088871936,3088880639,US -3088880640,3088881663,NL -3088881664,3088882687,US -3088882688,3088883199,NL -3088883200,3088902143,US -3088902144,3088902655,NL -3088902656,3088913663,US -3088913664,3088913919,NL -3088913920,3089027071,US -3089027072,3089031167,NL -3089031168,3089059839,US -3089059840,3089063935,NL -3089063936,3090292223,US -3090292224,3090292735,NL -3090292736,3090308863,US -3090308864,3090309119,NL -3090309120,3090325503,US -3090325504,3090329599,NL -3090329600,3090388223,US -3090388224,3090388479,NL -3090388480,3090389503,US -3090389504,3090389631,CA -3090389632,3090401791,US -3090401792,3090402047,IN -3090402048,3090415103,US -3090415104,3090415615,NL -3090415616,3091202047,US -3091202048,3091726335,CA -3091726336,3091955711,US -3091955712,3091959807,CA -3091959808,3091976191,US -3091976192,3091980287,CA -3091980288,3092381695,US -3092381696,3092447231,TH -3092447232,3092623359,US -3092623360,3092627455,NL -3092627456,3092634367,US -3092634368,3092634623,NL -3092634624,3092635391,US -3092635392,3092635647,NL -3092635648,3092643839,US -3092643840,3092647935,NL -3092647936,3092656127,US -3092656128,3092660223,NL -3092660224,3092664319,US -3092664320,3092665343,NL -3092665344,3092666367,US -3092666368,3092667391,NL -3092667392,3092669439,US -3092669440,3092669951,NL -3092669952,3092671487,US -3092671488,3092672511,NL -3092672512,3092673023,US -3092673024,3092673535,NL -3092673536,3092697087,US -3092697088,3092697599,NL -3092697600,3092701183,US -3092701184,3092702207,NL -3092702208,3092704255,US -3092704256,3092705279,NL -3092705280,3092754431,US -3092754432,3092758527,NL -3092758528,3093168127,US -3093168128,3093200895,CA -3093200896,3093213183,US -3093213184,3093217279,CA -3093217280,3093233663,US -3093233664,3093237759,PR -3093237760,3093282815,US -3093282816,3093299199,CA -3093299200,3093907199,US -3093907200,3093907455,CA -3093907456,3093909528,US -3093909529,3093909529,AT -3093909530,3093909597,US -3093909598,3093909598,DE -3093909599,3093909656,US -3093909657,3093909657,FR -3093909658,3093909812,US -3093909813,3093909813,AT -3093909814,3093935103,US -3093935104,3093935359,CA -3093935360,3093943785,US -3093943786,3093943786,CZ -3093943787,3093945989,US -3093945990,3093945990,AT -3093945991,3094020095,US -3094020096,3094023303,CA -3094023304,3094023311,BD -3094023312,3094032759,CA -3094032760,3094032767,GI -3094032768,3094041359,CA -3094041360,3094041367,DZ -3094041368,3094045663,CA -3094045664,3094045671,CO -3094045672,3094077751,CA -3094077752,3094077759,US -3094077760,3094085631,CA -3094085632,3096444927,US -3096444928,3096898618,CA -3096898619,3096898619,US -3096898620,3096969215,CA -3096969216,3097143823,US -3097143824,3097143831,BD -3097143832,3097493503,US -3097493504,3097772031,CA -3097772032,3098095615,US -3098095616,3098099711,CA -3098099712,3098099967,US -3098099968,3098100735,SE -3098100736,3098101247,SG -3098101248,3098103295,US -3098103296,3098103551,NL -3098103552,3098103807,DE -3098103808,3098104063,FR -3098104064,3098104319,GB -3098104320,3098104575,IL -3098104576,3098104831,AU -3098104832,3098105087,JP -3098105088,3098105855,ES -3098105856,3098106111,HK -3098106112,3098106623,IN -3098106624,3098106879,NL -3098106880,3098107135,DE -3098107136,3098107391,FR -3098107392,3098107647,US -3098107648,3098107903,SE -3098107904,3098148863,US -3098148864,3098165247,JM -3098165248,3098181631,US -3098181632,3098185727,CA -3098185728,3098263551,US -3098263552,3098271743,CA -3098271744,3098412031,US -3098412032,3098413055,CN -3098413056,3098415104,US -3098415105,3098421247,CN -3098421248,3098422271,US -3098422272,3098422527,FR -3098422528,3098422783,US -3098422784,3098423039,IT -3098423040,3098423295,GB -3098423296,3098424319,FR -3098424320,3098425343,CN -3098425344,3098426367,RU -3098426368,3098427391,FR -3098427392,3098428415,US -3098428416,3098428671,NL -3098428672,3098428927,CA -3098428928,3098429439,SE -3098429440,3098431487,GB -3098431488,3098435071,US -3098435072,3098435327,NL -3098435328,3098435583,CA -3098435584,3098441215,US -3098441216,3098441727,FR -3098441728,3098476543,US -3098476544,3098492927,CA -3098492928,3098494719,US -3098494720,3098495743,CA -3098495744,3098495999,US -3098496000,3098496255,CA -3098496256,3098503423,US -3098503424,3098503679,CA -3098503680,3098507263,US -3098507264,3098507519,CA -3098507520,3103784959,US -3103850496,3103850751,RU -3103850752,3103851007,PS -3103851008,3103851519,FR -3103851520,3103852543,PL -3103852544,3103852799,AE -3103852800,3103853567,PL -3103853568,3103853823,NO -3103853824,3103854079,RU -3103854080,3103854335,FR -3103854336,3103854591,AE -3103854592,3103854847,UA -3103854848,3103855103,PL -3103855104,3103855359,DE -3103855360,3103855615,RU -3103855616,3103855871,ES -3103855872,3103856127,AT -3103856128,3103856383,PL -3103856384,3103856639,RU -3103856640,3103856895,HU -3103856896,3103857151,CZ -3103857152,3103857407,FR -3103857408,3103857663,RS -3103857664,3103857919,FR -3103857920,3103858175,PL -3103858176,3103858431,BG -3103858432,3103858687,AT -3103858688,3103858943,NL -3103858944,3103859199,GB -3103859200,3103859455,SK -3103859456,3103859711,DE -3103859712,3103859967,RO -3103859968,3103860223,PL -3103860224,3103860479,FR -3103860480,3103860735,UA -3103860736,3103860991,BG -3103860992,3103861247,RU -3103861248,3103861503,PL -3103861504,3103861759,AT -3103861760,3103862015,ME -3103862016,3103862271,MD -3103862272,3103862527,IT -3103862528,3103862783,FR -3103862784,3103863039,TR -3103863040,3103863295,RU -3103863296,3103863807,UA -3103863808,3103864063,NL -3103864064,3103864319,GB -3103864320,3103864575,DE -3103864576,3103864831,NO -3103864832,3103865087,BG -3103865088,3103865343,DK -3103865344,3103865599,DE -3103865600,3103865855,BG -3103865856,3103866367,DE -3103866368,3103866879,UA -3103866880,3103867135,RU -3103867136,3103867391,NO -3103867392,3103867647,FR -3103867648,3103867903,RU -3103867904,3103868159,ES -3103868160,3103868415,IE -3103868416,3103868671,RS -3103868672,3103868927,GB -3103868928,3103869183,LB -3103869184,3103869439,AL -3103869440,3103869695,DE -3103869696,3103869951,PL -3103869952,3103870207,RU -3103870208,3103870463,IR -3103870464,3103870719,MD -3103870720,3103870975,SE -3103870976,3103871231,IT -3103871232,3103871487,RU -3103871488,3103871743,SE -3103871744,3103871999,CZ -3103872000,3103872511,UA -3103872512,3103872767,FI -3103872768,3103873023,HR -3103873024,3103873279,SE -3103873280,3103873535,FR -3103873536,3103873791,CZ -3103873792,3103874047,PL -3103874048,3103874303,LT -3103874304,3103874559,CH -3103874560,3103875071,NL -3103875072,3103875327,UA -3103875328,3103875583,IT -3103875584,3103875839,IQ -3103875840,3103876095,UA -3103876096,3103876351,AL -3103876352,3103876607,GB -3103876608,3103876863,DE -3103876864,3103877119,RO -3103877120,3103877375,GB -3103877376,3103877631,CH -3103877632,3103877887,IT -3103916032,3103917055,CH -3103917056,3103918079,IT -3103918080,3103919103,DE -3103919104,3103920127,IR -3103920128,3103921151,DE -3103921152,3103922175,CH -3103922176,3103923199,NL -3103923200,3103923455,SE -3103923456,3103924223,NL -3103924224,3103924479,DE -3103924480,3103925247,RU -3103925248,3103926271,PL -3103926272,3103926783,CZ -3103926784,3103927039,SK -3103927040,3103927119,CZ -3103927120,3103927135,GB -3103927136,3103927167,CZ -3103927168,3103927295,SK -3103927296,3103929343,NL -3103929344,3103930367,BE -3103930368,3103931391,DE -3103931392,3103932415,PL -3103932416,3103933439,IE -3103933440,3103934463,ES -3103934464,3103935487,RU -3103935488,3103936511,PL -3103936512,3103937535,NL -3103937536,3103938559,PT -3103938560,3103939583,RU -3103939584,3103940607,BE -3103940608,3103941631,CY -3103941632,3103942655,DE -3103942656,3103943679,RU -3103943680,3103944703,UA -3103944704,3103945727,PL -3103945728,3103947775,DE -3103947776,3103948799,RU -3103948800,3103949823,GB -3103949824,3103950847,DE -3103950848,3103951871,GB -3103951872,3103952895,DE -3103952896,3103953919,IT -3103953920,3103954431,NL -3103954432,3103954943,ES -3103954944,3103955967,SE -3103955968,3103956991,AT -3103956992,3103958015,DE -3103958016,3103960063,GB -3103960064,3103961087,NL -3103961088,3103961343,TR -3103961344,3103961599,AE -3103961600,3103961855,AR -3103961856,3103962111,AT -3103962112,3103963135,DE -3103963136,3103964159,RU -3103964160,3103965183,MK -3103965184,3103967231,GB -3103967232,3103968255,CH -3103968256,3103969279,GB -3103969280,3103970303,BG -3103970304,3103971327,UA -3103971328,3103972351,GB -3103972352,3103972863,IE -3103972864,3103973375,GB -3103973376,3103974399,KZ -3103974400,3103974919,LT -3103974920,3103974943,SE -3103974944,3103975167,LT -3103975168,3103975423,SE -3103975424,3103976447,SA -3103976448,3103977471,GB -3103977472,3103978495,NL -3103978496,3103979519,QA -3103979520,3103980543,DE -3103980544,3103981567,FR -3103981568,3103983615,NO -3103983616,3103984639,CZ -3103984640,3103985663,DK -3103985664,3103986687,RU -3103986688,3103987711,LB -3103987712,3103988735,FR -3103989760,3103990783,RU -3103990784,3103991807,IT -3103991808,3103992831,DE -3103992832,3103993855,LU -3103993856,3103994879,SE -3103994880,3103995903,JE -3103995904,3103996927,TR -3103996928,3103997951,PL -3103997952,3103998975,FR -3103998976,3103999999,RU -3104000000,3104002047,GB -3104002048,3104003071,DE -3104003072,3104004863,GB -3104005120,3104006143,GB -3104006144,3104007167,DE -3104007168,3104008191,GG -3104008192,3104009215,NL -3104009216,3104010239,IT -3104010240,3104011263,PL -3104011264,3104012287,ES -3104012288,3104012799,BH -3104012800,3104013311,SA -3104013312,3104014335,IR -3104014336,3104015359,FR -3104015360,3104016383,SE -3104016384,3104017407,HU -3104017408,3104018431,RU -3104018432,3104019455,IL -3104019456,3104020479,UA -3104020480,3104021503,AE -3104021504,3104022527,CZ -3104022528,3104023551,BE -3104023552,3104024575,GB -3104024576,3104025599,FR -3104025600,3104026623,RU -3104026624,3104027647,NL -3104027648,3104028671,RU -3104028672,3104029695,DE -3104029696,3104029951,AM -3104029952,3104030719,IT -3104030720,3104031743,HR -3104031744,3104032767,FR -3104032768,3104033791,IR -3104033792,3104035839,NL -3104035840,3104036863,IR -3104036864,3104037887,BE -3104037888,3104038911,GR -3104038912,3104039935,PL -3104039936,3104040959,LT -3104040960,3104041983,DE -3104041984,3104043007,ES -3104043008,3104044031,RU -3104044032,3104045055,HU -3104045056,3104046079,GB -3104046080,3104047103,IT -3104047104,3104048127,IR -3104048128,3104049151,GB -3104049152,3104050175,SE -3104050176,3104051199,GB -3104051200,3104052223,IR -3104052224,3104053247,FR -3104053248,3104054271,GB -3104054272,3104055295,IR -3104055296,3104056319,ES -3104056320,3104057343,NO -3104057344,3104058367,UA -3104058368,3104059391,FR -3104059392,3104060415,GB -3104060416,3104061439,AD -3104061440,3104062463,RU -3104062464,3104063487,FR -3104063488,3104064511,RU -3104064512,3104065535,TR -3104065536,3104066559,EE -3104066560,3104067583,FR -3104067584,3104068607,BG -3104068608,3104069631,SY -3104069632,3104070655,GR -3104070656,3104071679,ES -3104071680,3104073727,GB -3104073728,3104074751,IR -3104074752,3104075775,RU -3104075776,3104076799,NL -3104076800,3104077823,GB -3104077824,3104078847,AT -3104078848,3104079871,FR -3104079872,3104080895,GB -3104080896,3104081919,GR -3104081920,3104082943,DK -3104082944,3104083967,IT -3104083968,3104084991,RU -3104084992,3104085247,NL -3104085248,3104085503,HR -3104085504,3104086015,NL -3104086016,3104087039,IT -3104087040,3104088063,GB -3104088064,3104089087,UZ -3104089088,3104090111,GB -3104090112,3104091135,CH -3104091136,3104092159,NO -3104093184,3104094207,RU -3104094208,3104096255,ES -3104096256,3104097279,IE -3104097280,3104098303,GB -3104098304,3104099327,CZ -3104099328,3104100351,RU -3104100352,3104101375,TR -3104101376,3104102399,PL -3104102400,3104103423,DK -3104103424,3104104447,IR -3104104448,3104105471,TR -3104105472,3104106495,FI -3104106496,3104107519,DE -3104107520,3104108543,UA -3104108544,3104109567,GB -3104109568,3104110591,ES -3104110592,3104111615,FR -3104111616,3104112639,LB -3104112640,3104113663,GB -3104113664,3104114687,MK -3104114688,3104116735,DE -3104116736,3104117759,RU -3104117760,3104118783,SE -3104118784,3104120831,DE -3104120832,3104121855,CH -3104121856,3104122879,GB -3104122880,3104123903,RU -3104123904,3104124159,SE -3104124160,3104124415,LU -3104124416,3104124671,RO -3104124672,3104124927,CZ -3104124928,3104125951,MT -3104125952,3104126975,LT -3104126976,3104127999,CH -3104128000,3104129023,IT -3104129024,3104130047,GB -3104130048,3104131071,CZ -3104131072,3104132095,CY -3104132096,3104133119,GR -3104133120,3104134143,DE -3104134144,3104135167,ES -3104135168,3104136191,GB -3104136192,3104137215,IT -3104137216,3104138239,PL -3104138240,3104139263,DE -3104139264,3104140287,UA -3104140288,3104141311,FR -3104141312,3104142335,IT -3104142336,3104143359,BG -3104143360,3104144383,NL -3104144384,3104145407,ES -3104145408,3104146431,RU -3104146432,3104147455,NL -3104147456,3104149503,RU -3104149504,3104150527,GB -3104150528,3104151551,RU -3104151552,3104152575,SA -3104152576,3104153599,IR -3104153600,3104154623,RU -3104154624,3104155647,DK -3104155648,3104156671,DE -3104156672,3104156927,GB -3104156928,3104156959,RO -3104156960,3104156991,US -3104156992,3104157695,RO -3104157696,3104158719,TR -3104158720,3104159743,IT -3104159744,3104160767,CH -3104160768,3104161791,GB -3104161792,3104162815,RU -3104162816,3104164863,IT -3104164864,3104165887,RU -3104165888,3104166911,IT -3104166912,3104167935,FR -3104167936,3104168959,PL -3104168960,3104169983,PS -3104169984,3104171007,CZ -3104171008,3104172031,HU -3104172032,3104172451,NO -3104172452,3104172452,US -3104172453,3104173055,NO -3104173056,3104174079,ES -3104174080,3104175103,IE -3104175104,3104176127,IT -3104176128,3104177151,RU -3104177152,3104178175,UA -3104178176,3104179199,PL -3104179200,3104180223,ES -3104180224,3104181247,SE -3104181248,3104182271,RU -3104182272,3104183295,PS -3104183296,3104184319,MK -3104184320,3104185343,BY -3104185344,3104186367,PL -3104186368,3104187391,ES -3104187392,3104188415,IE -3104188416,3104189439,UZ -3104189440,3104190463,RU -3104190464,3104191487,NL -3104191488,3104192511,PL -3104192512,3104193535,PS -3104193536,3104194559,FR -3104194560,3104195071,IL -3104195072,3104195327,US -3104195328,3104195583,IL -3104195584,3104196607,DE -3104196608,3104197631,IT -3104197632,3104198655,GR -3104198656,3104199679,RU -3104199680,3104200703,NL -3104200704,3104201727,IT -3104201728,3104202751,FR -3104202752,3104203775,DE -3104203776,3104204799,HU -3104204800,3104205823,BA -3104205824,3104206079,NL -3104206080,3104206335,GB -3104206336,3104206847,NL -3104206848,3104207871,PL -3104207872,3104208895,RU -3104208896,3104209919,DE -3104209920,3104210943,RU -3104211968,3104212991,GB -3104212992,3104214015,HU -3104214016,3104215039,FR -3104215040,3104216063,DE -3104216064,3104217087,LB -3104217088,3104218111,GB -3104218112,3104219135,HU -3104219136,3104220159,NL -3104220160,3104221183,RU -3104221184,3104222207,CH -3104222208,3104223231,RU -3104223232,3104224255,EE -3104224256,3104225279,FI -3104225280,3104226303,UA -3104226304,3104227327,RS -3104227328,3104228351,IT -3104228352,3104229375,GB -3104229376,3104230399,ES -3104230400,3104231423,NL -3104231424,3104233471,FR -3104233472,3104234495,RU -3104234496,3104235519,OM -3104235520,3104236543,GB -3104236544,3104237567,RU -3104237568,3104238591,LU -3104238592,3104239615,RU -3104239616,3104240639,IT -3104240640,3104242687,RU -3104242688,3104243711,DE -3104243712,3104244735,TR -3104244736,3104245759,FR -3104245760,3104246783,BH -3104246784,3104247807,FR -3104247808,3104248831,AT -3104248832,3104250879,CZ -3104250880,3104251903,RU -3104251904,3104252415,SE -3104252416,3104252671,NL -3104252672,3104252927,LU -3104252928,3104253951,FR -3104253952,3104254975,RU -3104254976,3104255999,CZ -3104256000,3104257023,RU -3104257024,3104258047,HR -3104258048,3104259071,DE -3104259072,3104260095,NO -3104260096,3104261119,FR -3104261120,3104262143,DE -3104262144,3104263167,FR -3104263168,3104264191,NL -3104264192,3104265215,GB -3104265216,3104266239,RU -3104266240,3104267263,GB -3104267264,3104268287,RU -3104268288,3104269311,NL -3104269312,3104270335,FR -3104270336,3104271359,PL -3104271360,3104272383,FR -3104272384,3104273407,IT -3104273408,3104274431,RU -3104274432,3104275455,PS -3104275456,3104276479,AT -3104276480,3104277503,LB -3104277504,3104280575,NO -3104280576,3104281599,RU -3104281600,3104282623,GB -3104282624,3104283647,RU -3104283648,3104284671,CY -3104284672,3104285695,FR -3104285696,3104286719,GB -3104286720,3104287743,PL -3104287744,3104288767,RU -3104288768,3104289791,TR -3104289792,3104290815,RU -3104290816,3104291839,IE -3104291840,3104292863,GB -3104292864,3104293887,NO -3104293888,3104294911,DE -3104294912,3104295935,RU -3104295936,3104296959,BG -3104296960,3104297983,DE -3104297984,3104299007,FR -3104299008,3104300031,BG -3104300032,3104301055,NO -3104301056,3104301823,US -3104301824,3104302079,NL -3104302080,3104303103,GB -3104303104,3104304127,RU -3104304128,3104305151,LV -3104305152,3104306175,FR -3104306176,3104307199,GB -3104307200,3104308223,NL -3104308224,3104309247,EE -3104309248,3104310271,AM -3104310272,3104311295,RU -3104311296,3104312319,DE -3104312320,3104313343,TR -3104313344,3104314367,NO -3104314368,3104315391,RU -3104315392,3104316415,IT -3104316416,3104317439,FR -3104317440,3104318463,CY -3104318464,3104319487,IT -3104319488,3104320511,UA -3104320512,3104321535,BE -3104321536,3104322559,FR -3104322560,3104323583,BE -3104323584,3104324607,CZ -3104324608,3104325631,LV -3104325632,3104326655,FR -3104326656,3104327679,MD -3104327680,3104328703,HU -3104328704,3104329727,FR -3104329728,3104330751,SE -3104330752,3104331775,DE -3104331776,3104333823,GB -3104333824,3104334847,FR -3104334848,3104335871,SE -3104335872,3104336895,LT -3104336896,3104337919,GB -3104337920,3104338943,IE -3104338944,3104339967,DE -3104339968,3104340991,IT -3104340992,3104342015,RU -3104342016,3104343039,TR -3104343040,3104344063,GB -3104344064,3104345087,DE -3104345088,3104346111,ES -3104346112,3104347135,FR -3104347136,3104348159,IT -3104348160,3104349183,RO -3104349184,3104350207,RU -3104350208,3104352255,CZ -3104352256,3104353279,DE -3104353280,3104354303,IR -3104354304,3104355327,NL -3104355328,3104356351,RU -3104356352,3104357375,AT -3104357376,3104358399,CZ -3104358400,3104359423,IE -3104359424,3104360447,IT -3104360448,3104361471,RU -3104361472,3104362495,GB -3104362496,3104363519,CH -3104363520,3104364543,UZ -3104364544,3104366591,RU -3104366592,3104368639,DE -3104368640,3104369663,KZ -3104369664,3104370687,CZ -3104370688,3104372735,ES -3104372736,3104373759,NO -3104373760,3104374783,FR -3104374784,3104375807,SE -3104375808,3104376831,DK -3104376832,3104377855,FI -3104377856,3104378879,DE -3104378880,3104379215,GB -3104379216,3104379223,CZ -3104379224,3104379391,GB -3104379392,3104379647,CH -3104379648,3104379903,AT -3104379904,3104380927,FR -3104380928,3104381951,DK -3104381952,3104382975,DE -3104382976,3104383999,GB -3104384000,3104385023,TR -3104385024,3104386047,UA -3104386048,3104387071,AL -3104387072,3104388095,GB -3104388096,3104389119,IT -3104389120,3104390143,PL -3104390144,3104391167,SE -3104391168,3104392191,DE -3104392192,3104393215,IQ -3104393216,3104397311,RU -3104397312,3104398335,NO -3104398336,3104399359,GB -3104399360,3104400383,FR -3104400384,3104401407,MT -3104401408,3104403455,DE -3104403456,3104404479,SK -3104404480,3104405503,CZ -3104405504,3104405759,KZ -3104405760,3104406015,RU -3104406016,3104406527,KZ -3104406528,3104407551,PL -3104407552,3104408575,DE -3104408576,3104409599,AT -3104409600,3104410623,LB -3104410624,3104411647,DK -3104411648,3104412671,RU -3104412672,3104413695,IT -3104413696,3104414719,FR -3104414720,3104415743,TR -3104415744,3104416767,RU -3104416768,3104417791,SE -3104417792,3104418815,US -3104418816,3104419839,GB -3104419840,3104421887,DE -3104421888,3104422911,RU -3104422912,3104423935,LU -3104423936,3104424959,ES -3104424960,3104425983,KW -3104425984,3104428031,RU -3104428032,3104429055,IT -3104429056,3104430079,GI -3104430080,3104431103,DE -3104431104,3104432127,TR -3104432128,3104433151,DE -3104433152,3104434175,RU -3104434176,3104435199,GB -3104435200,3104437247,RO -3104437248,3104438271,LU -3104438272,3104439295,FR -3104439296,3104440319,NL -3104440320,3104441343,RU -3104441344,3104442367,IL -3104442368,3104443391,DK -3104443392,3104444415,GB -3104444416,3104445439,FR -3104445440,3104446463,MD -3104446464,3104447487,PL -3104447488,3104448511,NO -3104448512,3104449535,IT -3104449536,3104450559,DE -3104450560,3104451583,HR -3104451584,3104452607,RU -3104452608,3104453631,NL -3104453632,3104454655,CH -3104454656,3104455679,NL -3104455680,3104456703,RU -3104456704,3104457727,IL -3104457728,3104457983,SC -3104457984,3104458495,DE -3104458496,3104459775,IR -3104459776,3104460799,IT -3104460800,3104461823,ES -3104461824,3104462847,CZ -3104462848,3104463871,GB -3104463872,3104464895,DE -3104464896,3104465919,NL -3104465920,3104466943,GB -3104467968,3104468991,DE -3104468992,3104470015,SA -3104470016,3104471039,IE -3104471040,3104472063,PL -3104472064,3104473087,HU -3104473088,3104474111,RU -3104474112,3104475135,SE -3104475136,3104476159,RU -3104476160,3104477183,RS -3104477184,3104478207,GB -3104478208,3104479231,DE -3104479232,3104480255,RU -3104480256,3104482303,NL -3104482304,3104484351,ES -3104484352,3104485375,RU -3104485376,3104486399,FR -3104486400,3104488447,RU -3104488448,3104489471,IT -3104489472,3104490495,DE -3104490496,3104491519,FI -3104491520,3104492543,GB -3104492544,3104493567,RS -3104493568,3104494591,UA -3104494592,3104495615,DK -3104495616,3104496639,JO -3104496640,3104497663,DK -3104497664,3104498687,CH -3104498688,3104500735,NL -3104500736,3104501759,CZ -3104501760,3104502783,LY -3104502784,3104503807,DE -3104503808,3104504831,ES -3104504832,3104505855,FR -3104505856,3104506879,NO -3104506880,3104507903,RU -3104507904,3104508927,YE -3104508928,3104509951,TR -3104509952,3104510975,DE -3104510976,3104511999,IT -3104512000,3104513023,LT -3104513024,3104514047,UA -3104514048,3104515071,RU -3104515072,3104516095,GB -3104516096,3104516351,CY -3104516352,3104516607,LU -3104516608,3104516863,CY -3104516864,3104517119,LU -3104517120,3104518143,IL -3104518144,3104519167,RU -3104519168,3104520191,IT -3104520192,3104521215,CH -3104521216,3104522239,RU -3104522240,3104523263,IE -3104523264,3104524287,IR -3104524288,3104525311,RU -3104525312,3104526335,BY -3104526336,3104527359,UA -3104527360,3104528383,AT -3104528384,3104529407,IR -3104529408,3104530431,GB -3104530432,3104531455,SE -3104531456,3104532479,PL -3104532480,3104533503,GB -3104533504,3104534527,PL -3104534528,3104535551,SE -3104535552,3104536575,ES -3104536576,3104537599,SA -3104537600,3104538623,US -3104538624,3104539647,PL -3104539648,3104540671,RU -3104540672,3104541695,DE -3104541696,3104542719,GB -3104542720,3104543743,NL -3104543744,3104544767,RU -3104544768,3104545791,IT -3104545792,3104546815,DE -3104546816,3104547839,FR -3104547840,3104548863,PT -3104548864,3104549887,CH -3104549888,3104550911,HU -3104550912,3104551935,IR -3104551936,3104552959,NO -3104552960,3104553983,GB -3104553984,3104555007,FR -3104555008,3104556031,IT -3104556032,3104557055,RU -3104557056,3104558079,ES -3104558080,3104559103,GB -3104559104,3104560127,FI -3104560128,3104561151,TR -3104561152,3104561919,NL -3104561920,3104562047,FR -3104562048,3104562175,NL -3104562176,3104563199,ES -3104563200,3104564223,IT -3104564224,3104565247,RU -3104565248,3104566271,IT -3104566272,3104567295,ES -3104567296,3104568319,GB -3104568320,3104569343,RU -3104569344,3104570367,TR -3104570368,3104571391,DE -3104571392,3104572415,FR -3104572416,3104573439,CH -3104573440,3104574463,UA -3104574464,3104575487,NL -3104575488,3104576511,AZ -3104576512,3104577535,PL -3104577536,3104578559,IQ -3104578560,3104579583,RU -3104579584,3104580607,FR -3104581632,3104582655,ME -3104582656,3104583679,CH -3104583680,3104584703,FR -3104584704,3104585727,RU -3104585728,3104586751,NO -3104586752,3104587775,IR -3104587776,3104588799,DE -3104588800,3104589823,RU -3104589824,3104590847,NO -3104590848,3104591871,BA -3104591872,3104592895,IE -3104592896,3104593919,RU -3104593920,3104594943,DE -3104594944,3104595967,RU -3104595968,3104596991,FR -3104596992,3104598015,IR -3104598016,3104599039,ES -3104599040,3104600063,TR -3104600064,3104601087,UA -3104601088,3104602111,PT -3104602112,3104603135,NL -3104603136,3104604159,RU -3104604160,3104605183,CH -3104605184,3104606207,NL -3104606208,3104607231,GB -3104607232,3104608255,UA -3104608256,3104609279,NL -3104609280,3104609503,SE -3104609504,3104609535,NL -3104609536,3104609759,SE -3104609760,3104609791,NL -3104609792,3104610303,SE -3104610304,3104611327,RU -3104611328,3104612351,IE -3104612352,3104613375,GB -3104613376,3104614399,SA -3104614400,3104615423,BA -3104615424,3104616447,SA -3104616448,3104617471,DE -3104617472,3104618495,AT -3104618496,3104619519,PS -3104619520,3104621567,GB -3104621568,3104622591,CZ -3104622592,3104623615,GB -3104623616,3104624639,FR -3104624640,3104625663,RU -3104625664,3104625919,NL -3104625920,3104626687,CY -3104626688,3104627711,NL -3104627712,3104628735,LB -3104628736,3104629759,TR -3104629760,3104630783,RU -3104630784,3104631807,GB -3104631808,3104632831,EE -3104632832,3104633855,NL -3104633856,3104634879,JO -3104634880,3104635903,SE -3104635904,3104637951,RU -3104637952,3104638975,UA -3104638976,3104639999,RS -3104640000,3104641023,GB -3104641024,3104642047,EE -3104642048,3104643071,KZ -3104643072,3104644095,RU -3104644096,3104645119,DE -3104645120,3104646143,RU -3104646144,3104647167,FR -3104647168,3104648191,GB -3104648192,3104649215,RU -3104649216,3104650239,GB -3104650240,3104651263,SI -3104651264,3104652287,TR -3104652288,3104653311,ES -3104653312,3104654335,FR -3104654336,3104655359,DE -3104655360,3104656383,GB -3104656384,3104657407,ES -3104657408,3104658431,GB -3104658432,3104659455,JO -3104659456,3104660479,LU -3104660480,3104661503,NO -3104661504,3104662527,SE -3104662528,3104663551,FR -3104663552,3104664255,GB -3104664256,3104664263,CH -3104664264,3104664271,PL -3104664272,3104665599,GB -3104665600,3104668671,RU -3104668672,3104669695,NO -3104669696,3104670719,FR -3104670720,3104672767,RU -3104672768,3104673791,GB -3104673792,3104674815,PL -3104674816,3104675839,DE -3104675840,3104676863,LV -3104676864,3104677887,DE -3104677888,3104678911,RU -3104678912,3104679935,IT -3104679936,3104681983,PL -3104681984,3104683007,RU -3104683008,3104684031,FR -3104684032,3104685055,PL -3104685056,3104686079,GB -3104686080,3104687103,IL -3104687104,3104688127,AM -3104688128,3104689151,ES -3104689152,3104690175,GB -3104690176,3104691199,DE -3104691200,3104693247,FR -3104693248,3104694271,IT -3104694272,3104695295,NL -3104695296,3104696319,IR -3104696320,3104697343,PL -3104697344,3104698367,MK -3104698368,3104699391,BA -3104699392,3104700415,GB -3104700416,3104701439,UA -3104701440,3104702463,IT -3104702464,3104703487,FR -3104703488,3104704511,RU -3104704512,3104705535,IT -3104705536,3104706559,DE -3104706560,3104707583,UA -3104707584,3104708607,TR -3104708608,3104709631,ES -3104709632,3104710655,NL -3104710656,3104711679,RU -3104711680,3104712703,ES -3104712704,3104714751,RU -3104714752,3104715775,DE -3104715776,3104716799,AT -3104716800,3104717823,ES -3104718848,3104719871,TR -3104719872,3104720895,RU -3104720896,3104721919,PL -3104721920,3104722943,IT -3104722944,3104723967,IR -3104723968,3104724991,GB -3104724992,3104726015,RU -3104726016,3104727039,DE -3104727040,3104727295,FR -3104727296,3104727551,DE -3104727552,3104727807,ES -3104727808,3104728063,IT -3104728064,3104729087,KZ -3104729088,3104730111,FR -3104730112,3104731135,CH -3104731136,3104732159,PL -3104732160,3104733183,SK -3104733184,3104734207,FR -3104734208,3104735231,BA -3104735232,3104736255,FR -3104736256,3104737279,JO -3104737280,3104740351,GB -3104740352,3104741375,PL -3104741376,3104742399,GB -3104742400,3104743423,CH -3104743424,3104744447,IR -3104744448,3104745471,GB -3104745472,3104746495,NL -3104746496,3104747519,TR -3104747520,3104749567,FR -3104749568,3104750591,NL -3104750592,3104751615,CZ -3104751616,3104751871,GB -3104751872,3104752127,CA -3104752128,3104752255,GB -3104752256,3104752383,RU -3104752384,3104752639,UA -3104752640,3104753663,SA -3104753664,3104754687,GR -3104754688,3104755711,MK -3104755712,3104757759,GB -3104757760,3104758783,EE -3104758784,3104759807,GB -3104759808,3104760831,CZ -3104760832,3104761855,FR -3104761856,3104762879,CZ -3104762880,3104763903,IT -3104763904,3104764927,SE -3104764928,3104765951,FR -3104765952,3104766975,IQ -3104766976,3104767999,CZ -3104768000,3104769023,PL -3104769024,3104770047,UA -3104770048,3104771071,DE -3104771072,3104772095,NL -3104772096,3104773119,FR -3104773120,3104774143,PT -3104774144,3104775167,FR -3104775168,3104776191,HR -3104776192,3104776703,GB -3104776704,3104777215,IE -3104777216,3104778239,RU -3104778240,3104779263,TR -3104779264,3104780287,PL -3104780288,3104782335,FR -3104782336,3104783359,NL -3104783360,3104784383,RU -3104784384,3104785407,BA -3104785408,3104786431,FR -3104786432,3104787455,DK -3104787456,3104788479,ES -3104788480,3104789503,PL -3104789504,3104791551,RU -3104791552,3104792575,DE -3104792576,3104793599,RU -3104793600,3104794623,ES -3104794624,3104795647,GB -3104795648,3104796671,CZ -3104796672,3104797695,GE -3104797696,3104798719,RU -3104798720,3104799743,SE -3104799744,3104800767,DK -3104800768,3104801280,FR -3104801281,3104801281,IT -3104801282,3104801791,FR -3104801792,3104802815,PL -3104802816,3104803839,AE -3104803840,3104804863,FR -3104804864,3104805887,CZ -3104805888,3104806911,ES -3104806912,3104807935,NO -3104807936,3104808959,BY -3104808960,3104809983,IT -3104809984,3104811007,NL -3104811008,3104812031,IT -3104812032,3104813055,RU -3104813056,3104816127,DE -3104816128,3104817151,RU -3104817152,3104818175,DE -3104818176,3104819199,TR -3104819200,3104820223,CH -3104820224,3104821247,GB -3104821248,3104821503,RU -3104821504,3104822271,NL -3104822272,3104823295,FI -3104823296,3104824319,NO -3104824320,3104825343,NL -3104825344,3104826367,GB -3104826368,3104827391,CH -3104827392,3104828415,PL -3104828416,3104829439,AT -3104829440,3104830463,GB -3104830464,3104831487,DE -3104831488,3104832511,NL -3104832512,3104833535,CZ -3104833536,3104834559,GB -3104834560,3104835583,KW -3104835584,3104836607,RU -3104836608,3104837631,BA -3104837632,3104838655,DK -3104838656,3104839679,NL -3104839680,3104840703,IQ -3104840704,3104841727,UA -3104841728,3104843775,PL -3104843776,3104844799,GB -3104844800,3104846847,FR -3104846848,3104847871,AT -3104847872,3104848895,RU -3104848896,3104849919,DE -3104849920,3104850943,RU -3104850944,3104851199,GB -3104851200,3104851455,JE -3104851456,3104851967,GB -3104851968,3104852991,DE -3104852992,3104854015,AT -3104854016,3104855039,GI -3104855040,3104855295,SE -3104855296,3104855551,GB -3104855552,3104856063,SE -3104856064,3104857087,IL -3104857088,3104858111,SE -3104858112,3104859135,FI -3104859136,3104861183,RU -3104861184,3104862207,DE -3104862208,3104863231,AT -3104863232,3104864255,RU -3104864256,3104865279,ES -3104865280,3104866303,UA -3104866304,3104867327,PL -3104867328,3104868351,IT -3104868352,3104869375,RU -3104869376,3104870399,DK -3104870400,3104871423,PL -3104871424,3104872447,RU -3104872448,3104873471,GB -3104873472,3104874495,DK -3104874496,3104875519,GB -3104875520,3104876543,GR -3104876544,3104877567,FI -3104877568,3104878591,CH -3104878592,3104879615,RU -3104879616,3104880639,CZ -3104880640,3104881663,DE -3104881664,3104882687,AT -3104882688,3104883711,MT -3104883712,3104884735,DE -3104884736,3104885759,SE -3104885760,3104886783,GB -3104886784,3104887807,ES -3104887808,3104888831,RU -3104888832,3104889855,US -3104889856,3104890879,FR -3104890880,3104891903,GB -3104891904,3104892927,UA -3104892928,3104893951,IR -3104893952,3104894975,TR -3104894976,3104895999,BE -3104896000,3104897023,RU -3104897024,3104898047,ES -3104898048,3104899071,FR -3104899072,3104900095,RU -3104900096,3104901119,DE -3104901120,3104902143,RU -3104902144,3104903167,AT -3104903168,3104904191,RU -3104904192,3104905215,IT -3104905216,3104906239,GB -3104906240,3104907263,RU -3104907264,3104908287,DE -3104908288,3104909311,RU -3104909312,3104910335,PL -3104910336,3104911359,GB -3104911360,3104912383,IT -3104912384,3104913407,DK -3104913408,3104914431,FR -3104914432,3104915455,NL -3104915456,3104916479,RU -3104916480,3104917503,CH -3104917504,3104918527,NL -3104918528,3104919551,RU -3104919552,3104920575,NL -3104920576,3104922623,RU -3104922624,3104923647,NO -3104924672,3104925695,CZ -3104925696,3104926719,IT -3104926720,3104927743,FR -3104927744,3104928767,TR -3104928768,3104929791,CZ -3104929792,3104930815,RU -3104930816,3104931839,UA -3104931840,3104933887,RU -3104933888,3104934911,TR -3104934912,3104935935,RU -3104935936,3104936959,DE -3104936960,3104937983,GB -3104937984,3104939007,RU -3104939008,3104940031,IT -3104940032,3104941055,PL -3104941056,3104942079,GB -3104942080,3104943103,RU -3104943104,3104944127,GB -3104944128,3104945151,CH -3104945152,3104946175,GB -3104946176,3104947199,NL -3104947200,3104948223,RS -3104948224,3104949247,DK -3104949248,3104950271,GB -3104950272,3104951295,RU -3104951296,3104952319,DE -3104952320,3104953343,CH -3104953344,3104954367,CZ -3104954368,3104955391,DK -3104955392,3104956415,VA -3104956416,3104957439,MD -3104957440,3104958463,PT -3104958464,3104959487,PS -3104959488,3104961535,FR -3104961536,3104962559,DE -3104962560,3104963583,FR -3104963584,3104964607,GB -3104964608,3104965631,DK -3104965632,3104966655,RU -3104966656,3104967679,BE -3104967680,3104968703,RS -3104968704,3104969727,ES -3104969728,3104970751,RU -3104970752,3104971775,IT -3104971776,3104972799,CZ -3104972800,3104973823,GB -3104973824,3104974847,DE -3104975872,3104976895,RU -3104976896,3104977919,GB -3104977920,3104978431,NL -3104978432,3104978943,DE -3104978944,3104979967,BG -3104979968,3104980991,HR -3104980992,3104982015,SK -3104982016,3104983039,PL -3104983040,3104984063,AM -3104984064,3104985087,FI -3104985088,3104986111,FR -3104986112,3104987135,SE -3104987136,3104988159,RU -3104988160,3104989183,DE -3104989184,3104990207,FR -3104990208,3104991231,DE -3104991232,3104992255,BE -3104992256,3104995327,RU -3104995328,3104996351,GB -3104996352,3104997375,RU -3104997376,3104998399,DE -3104998400,3104999423,PL -3104999424,3105000447,GB -3105000448,3105001471,PL -3105001472,3105002495,GB -3105002496,3105003519,BE -3105003520,3105004543,BA -3105004544,3105005567,IR -3105005568,3105006591,EE -3105006592,3105007615,SE -3105007616,3105008639,FR -3105008640,3105009663,CH -3105009664,3105010687,PL -3105010688,3105011711,AT -3105011712,3105012229,CY -3105012230,3105012230,US -3105012231,3105012231,CY -3105012232,3105012235,US -3105012236,3105012257,CY -3105012258,3105012258,US -3105012259,3105012259,CY -3105012260,3105012267,US -3105012268,3105012485,CY -3105012486,3105012486,GB -3105012487,3105012487,CY -3105012488,3105012491,GB -3105012492,3105012543,CY -3105012544,3105012557,DE -3105012558,3105012559,US -3105012560,3105012560,CY -3105012561,3105012563,DE -3105012564,3105012735,CY -3105012736,3105013759,GL -3105013760,3105014783,SE -3105014784,3105015807,ES -3105015808,3105016831,RU -3105016832,3105017855,IL -3105017856,3105018879,FR -3105018880,3105019903,IR -3105019904,3105020927,GB -3105020928,3105021439,NL -3105021440,3105021951,IN -3105021952,3105022975,RO -3105022976,3105023999,BG -3105024000,3105025023,IT -3105025024,3105026047,NL -3105026048,3105027071,IT -3105027072,3105028095,AZ -3105028096,3105029119,ES -3105029120,3105030143,KZ -3105030144,3105031167,CZ -3105031168,3105032191,UA -3105032192,3105033215,DE -3105033216,3105035263,GB -3105035264,3105036287,RU -3105036288,3105037311,ES -3105037312,3105038335,CH -3105038336,3105040383,DE -3105040384,3105041407,GB -3105041408,3105042431,GR -3105042432,3105043455,FR -3105043456,3105044479,DE -3105044480,3105045503,NL -3105045504,3105046527,DE -3105046528,3105047295,NO -3105047296,3105047551,DK -3105047552,3105048575,ES -3105048576,3105049599,SK -3105049600,3105050623,KW -3105050624,3105051647,TR -3105051648,3105052671,CH -3105052672,3105053695,GB -3105053696,3105054719,TR -3105054720,3105055743,GE -3105055744,3105056047,NL -3105056048,3105056055,GB -3105056056,3105056243,NL -3105056244,3105056244,DE -3105056245,3105056767,NL -3105056768,3105057791,SC -3105057792,3105058815,GB -3105058816,3105059839,JO -3105059840,3105060863,PL -3105060864,3105061887,CH -3105061888,3105062911,SY -3105062912,3105063935,IT -3105063936,3105064959,DK -3105064960,3105065983,FR -3105065984,3105067007,IT -3105067008,3105069055,GB -3105069056,3105070079,TR -3105070080,3105071103,ES -3105071104,3105072127,FR -3105072128,3105073151,IT -3105073152,3105074175,CH -3105074176,3105075199,DE -3105075200,3105076223,RU -3105076224,3105077247,BE -3105077248,3105078271,IT -3105078272,3105079295,ES -3105079296,3105080319,KZ -3105080320,3105081343,DE -3105081344,3105082367,GB -3105082368,3105083391,RU -3105083392,3105084415,GB -3105084416,3105085439,ES -3105085440,3105086463,DE -3105086464,3105087487,PS -3105087488,3105088511,FR -3105088512,3105089535,JO -3105089536,3105090559,DE -3105090560,3105091583,NL -3105091584,3105092607,FR -3105092608,3105093631,UA -3105093632,3105095679,SE -3105095680,3105097727,GB -3105097728,3105098751,FR -3105098752,3105099775,SE -3105099776,3105100799,FR -3105100800,3105101823,PL -3105101824,3105102847,IQ -3105102848,3105103871,HR -3105103872,3105104895,GB -3105104896,3105105919,CY -3105105920,3105106943,FR -3105106944,3105107967,RU -3105107968,3105110015,GB -3105110016,3105111039,EE -3105111040,3105112063,GB -3105112064,3105113087,IT -3105113088,3105113343,NL -3105113344,3105113599,ES -3105113600,3105113855,IE -3105113856,3105114111,FR -3105114112,3105115135,SA -3105115136,3105117183,RU -3105117184,3105118207,FR -3105118208,3105119231,BG -3105119232,3105120255,IM -3105120256,3105121279,GB -3105121280,3105122303,EE -3105122304,3105123327,NO -3105123328,3105124351,ES -3105124352,3105125375,BY -3105125376,3105126399,ES -3105126400,3105127423,KG -3105127424,3105128447,KZ -3105128448,3105129471,GB -3105129472,3105130495,RU -3105130496,3105131519,FI -3105131520,3105132543,DK -3105132544,3105133567,CH -3105133568,3105134591,PL -3105134592,3105135615,SA -3105135616,3105136639,BG -3105136640,3105137663,IR -3105137664,3105138687,GB -3105138688,3105139711,NO -3105139712,3105140735,PL -3105140736,3105142783,RU -3105142784,3105143807,NL -3105143808,3105144831,DE -3105144832,3105145855,ES -3105145856,3105146879,IQ -3105146880,3105147903,CH -3105147904,3105148927,DK -3105148928,3105149951,CH -3105149952,3105150975,CY -3105150976,3105151999,UA -3105152000,3105153023,US -3105153024,3105154047,RU -3105154048,3105156095,DE -3105156096,3105157119,AT -3105157120,3105158143,DK -3105158144,3105159167,NO -3105159168,3105161215,GB -3105161216,3105162239,FI -3105162240,3105163263,TR -3105163264,3105164287,IL -3105164288,3105165311,GB -3105165312,3105166335,IS -3105166336,3105167359,GB -3105167360,3105168383,IT -3105168384,3105169407,DE -3105169408,3105170431,ES -3105170432,3105171455,PL -3105171456,3105172479,DK -3105172480,3105173503,ES -3105173504,3105174527,FR -3105174528,3105177599,NL -3105177600,3105178623,RU -3105178624,3105179647,IR -3105179648,3105180671,IT -3105180672,3105181695,IR -3105181696,3105182719,FR -3105182720,3105183743,PL -3105183744,3105184767,SE -3105184768,3105185791,RO -3105185792,3105186815,AT -3105186816,3105187839,DE -3105187840,3105188863,US -3105188864,3105189887,GB -3105189888,3105190911,FR -3105190912,3105191935,SM -3105191936,3105192959,PS -3105192960,3105193983,DE -3105193984,3105195007,FR -3105195008,3105196031,GB -3105196032,3105197055,IQ -3105197056,3105198079,RU -3105198080,3105199103,SE -3105199104,3105200127,PL -3105200128,3105201151,FR -3105201152,3105202175,RU -3105202176,3105203199,CZ -3105203200,3105204223,DE -3105204224,3105205247,NL -3105205248,3105206271,IT -3105206272,3105207295,UA -3105207296,3105208319,RO -3105208320,3105210367,NL -3105210368,3105211391,FR -3105211392,3105212415,CZ -3105212416,3105213439,NL -3105213440,3105214463,TR -3105214464,3105215487,GB -3105215488,3105216511,GP -3105216512,3105217535,GB -3105217536,3105218559,CZ -3105218560,3105219583,DE -3105219584,3105220607,GL -3105220608,3105221631,DK -3105221632,3105222655,AT -3105222656,3105223679,NL -3105223680,3105224575,DE -3105224576,3105224703,AE -3105224704,3105225727,IT -3105225728,3105226751,AM -3105226752,3105227775,RO -3105228800,3105229823,PL -3105229824,3105230847,NL -3105230848,3105231871,UA -3105231872,3105232895,AT -3105232896,3105233919,RU -3105233920,3105234943,IR -3105234944,3105235967,LB -3105235968,3105236991,IT -3105236992,3105238015,FR -3105238016,3105239039,DE -3105239040,3105240063,FR -3105240064,3105241087,CH -3105241088,3105242111,TR -3105242112,3105243135,RU -3105243136,3105244159,KZ -3105244160,3105245183,DE -3105245184,3105246207,DK -3105246208,3105248255,GB -3105248256,3105249279,IT -3105249280,3105250303,RS -3105250304,3105251327,ES -3105251328,3105252351,CZ -3105252352,3105253375,TR -3105253376,3105254399,CH -3105254400,3105255423,FR -3105255424,3105256447,PL -3105256448,3105257471,FR -3105257472,3105258495,NO -3105258496,3105259519,CZ -3105259520,3105260543,FR -3105260544,3105261567,FI -3105261568,3105262591,PL -3105262592,3105263615,DE -3105263616,3105264639,RS -3105264640,3105265663,DE -3105265664,3105266687,RU -3105266688,3105267711,IE -3105267712,3105268735,TR -3105268736,3105269759,GB -3105269760,3105270783,FR -3105270784,3105271807,RU -3105271808,3105272831,SK -3105272832,3105273855,RU -3105273856,3105274879,TR -3105274880,3105276927,NL -3105276928,3105277951,FR -3105277952,3105278975,ES -3105278976,3105279999,RU -3105280000,3105281023,GB -3105281024,3105282047,SK -3105282048,3105283071,FR -3105283072,3105284095,DE -3105284096,3105285119,GB -3105285120,3105286143,IT -3105286144,3105287167,RU -3105287168,3105288191,CZ -3105288192,3105289215,GB -3105289216,3105290239,AT -3105290240,3105291263,TR -3105292288,3105293311,AT -3105293312,3105294335,GB -3105294336,3105295359,RU -3105295360,3105296383,PL -3105296384,3105297407,LT -3105297408,3105298431,PL -3105298432,3105299455,NL -3105299456,3105300479,IT -3105300480,3105301503,RU -3105301504,3105302527,ES -3105302528,3105303551,FR -3105304576,3105305599,GE -3105305600,3105308671,GB -3105308672,3105309695,RU -3105309696,3105310719,ES -3105310720,3105311743,TR -3105312768,3105313791,RU -3105313792,3105314815,IT -3105314816,3105315839,GR -3105315840,3105317887,FR -3105317888,3105318911,GB -3105318912,3105319935,UA -3105319936,3105320959,HU -3105320960,3105321983,SK -3105321984,3105323007,GB -3105323008,3105324031,ES -3105324032,3105325055,SA -3105325056,3105326079,IR -3105326080,3105328127,FR -3105328128,3105329151,NL -3105329152,3105330175,NO -3105330176,3105331199,PL -3105331200,3105332223,IQ -3105332224,3105333247,DE -3105333248,3105334271,LV -3105334272,3105335295,UA -3105335296,3105336319,GR -3105336320,3105337343,IL -3105337344,3105339391,GB -3105339392,3105340415,SY -3105340416,3105341439,FR -3105341440,3105342463,ES -3105342464,3105343487,AE -3105345536,3105346559,DE -3105346560,3105347583,NL -3105347584,3105348607,DK -3105348608,3105349631,ES -3105349632,3105350655,DE -3105350656,3105351679,RU -3105351680,3105352703,GB -3105352704,3105353727,DE -3105353728,3105353983,GB -3105353984,3105354751,DE -3105354752,3105355775,BE -3105355776,3105356799,NL -3105356800,3105357823,GB -3105357824,3105358847,IS -3105358848,3105359871,ES -3105359872,3105360895,CZ -3105360896,3105361919,GB -3105361920,3105362943,FR -3105362944,3105363967,CZ -3105363968,3105364991,PL -3105364992,3105366015,FR -3105366016,3105367039,AL -3105367040,3105368063,SI -3105368064,3105370111,RU -3105370112,3105371135,NL -3105371136,3105373183,RU -3105373184,3105374207,SY -3105374208,3105375231,GB -3105375232,3105375295,IT -3105375296,3105375327,DE -3105375328,3105375359,CA -3105375360,3105375375,DE -3105375376,3105375391,US -3105375392,3105375551,IT -3105375552,3105375615,DE -3105375616,3105375743,IT -3105375744,3105376255,DE -3105376256,3105377279,GB -3105377280,3105378303,IL -3105378304,3105380351,GB -3105380352,3105381375,PL -3105381376,3105382399,RU -3105382400,3105383423,GB -3105383424,3105383679,BY -3105383680,3105383935,SK -3105383936,3105384447,AT -3105384448,3105385471,IT -3105385472,3105387519,RU -3105387520,3105388543,IT -3105388544,3105389567,GB -3105389568,3105390591,TR -3105390592,3105391615,JO -3105391616,3105392639,NL -3105392640,3105393663,IR -3105393664,3105395711,FR -3105395712,3105396735,IR -3105396736,3105398783,FR -3105398784,3105399807,GB -3105399808,3105400831,PL -3105400832,3105401855,DK -3105401856,3105402879,NL -3105402880,3105404927,RU -3105404928,3105404928,FR -3105404929,3105404929,RE -3105404930,3105405122,FR -3105405123,3105405123,RE -3105405124,3105405378,FR -3105405379,3105405379,RE -3105405380,3105405634,FR -3105405635,3105405635,RE -3105405636,3105405890,FR -3105405891,3105405891,RE -3105405892,3105405951,FR -3105405952,3105406975,NO -3105406976,3105407999,FR -3105408000,3105410047,PL -3105410048,3105411071,IL -3105411072,3105412095,BA -3105412096,3105413119,RU -3105413120,3105414143,PL -3105414144,3105416191,NL -3105416192,3105417215,IR -3105417216,3105418239,IE -3105418240,3105419263,CZ -3105419264,3105420287,NL -3105420288,3105421311,RU -3105421312,3105421823,US -3105421824,3105422335,NL -3105422336,3105423359,IR -3105423360,3105423487,VN -3105423488,3105423615,NO -3105423616,3105423871,FI -3105423872,3105424127,RU -3105424128,3105424383,IL -3105424384,3105426431,RU -3105426432,3105427455,QA -3105427456,3105428479,RU -3105428480,3105429503,GR -3105429504,3105430527,ES -3105430528,3105431551,CH -3105431552,3105432575,GB -3105432576,3105433599,DE -3105433600,3105434623,FR -3105434624,3105435647,SE -3105435648,3105436671,LT -3105437696,3105438719,GB -3105438720,3105439743,RU -3105439744,3105440767,GB -3105440768,3105441791,RU -3105441792,3105442815,IT -3105442816,3105443839,FI -3105443840,3105444863,NL -3105444864,3105445119,GB -3105445120,3105445631,US -3105445632,3105445887,GB -3105445888,3105446911,RU -3105446912,3105447935,CH -3105447936,3105448959,DE -3105448960,3105449983,TR -3105449984,3105451007,AE -3105451008,3105452031,PL -3105452032,3105453055,ES -3105453056,3105454079,UA -3105454080,3105455103,PL -3105455104,3105456127,AT -3105456128,3105457151,IT -3105457152,3105458175,DE -3105458176,3105459199,IT -3105459200,3105460223,DK -3105460224,3105461247,GB -3105461248,3105462271,PL -3105462272,3105463295,RU -3105464320,3105465343,NL -3105465344,3105466367,DE -3105466368,3105467391,MT -3105467392,3105468415,GB -3105468416,3105469439,RU -3105469440,3105469951,SE -3105469952,3105470207,AT -3105470208,3105470463,AE -3105470464,3105471487,CZ -3105471488,3105472511,GB -3105472512,3105473535,CH -3105473536,3105474559,ES -3105474560,3105475583,FI -3105475584,3105476607,IT -3105476608,3105477631,GB -3105477632,3105478655,DK -3105478656,3105479679,PL -3105479680,3105480703,GB -3105480704,3105481727,CH -3105481728,3105482751,NL -3105482752,3105483775,IT -3105483776,3105486847,GB -3105486848,3105487871,SK -3105487872,3105488895,IS -3105488896,3105489407,BG -3105489408,3105489663,FR -3105489664,3105489919,BG -3105489920,3105490943,ES -3105490944,3105491967,SE -3105491968,3105494015,GB -3105494016,3105495039,BE -3105495040,3105495807,AE -3105495808,3105496063,LU -3105496064,3105497087,RU -3105497088,3105498111,IR -3105498112,3105499135,DE -3105499136,3105500159,RU -3105501184,3105502207,FI -3105502208,3105503231,RU -3105503232,3105504255,NL -3105504256,3105505279,DK -3105505280,3105506303,IT -3105506304,3105507327,TR -3105507328,3105508351,RU -3105508352,3105510399,DE -3105510400,3105511423,SA -3105511424,3105512447,FR -3105512448,3105513471,GB -3105513472,3105514495,DE -3105514496,3105515519,RU -3105515520,3105516543,FR -3105516544,3105517567,NL -3105517568,3105518591,RU -3105518592,3105519615,RS -3105519616,3105520639,RU -3105520640,3105521663,LU -3105521664,3105522687,NO -3105522688,3105523711,LT -3105523712,3105524735,ES -3105524736,3105525759,IT -3105525760,3105526783,TR -3105526784,3105527807,GB -3105527808,3105528063,NL -3105528064,3105528319,US -3105528320,3105528831,NL -3105528832,3105529855,DE -3105529856,3105530879,LU -3105530880,3105531903,NO -3105531904,3105532927,RU -3105532928,3105533951,RS -3105533952,3105534975,BA -3105534976,3105535231,ZA -3105535232,3105535794,US -3105535795,3105535795,RU -3105535796,3105535999,US -3105536000,3105537023,AZ -3105537024,3105538047,AT -3105538048,3105539071,RU -3105539072,3105540095,IT -3105540096,3105541119,DE -3105541120,3105542143,RU -3105542144,3105543167,IR -3105543168,3105544191,NL -3105544192,3105545215,RU -3105545216,3105546239,FR -3105546240,3105547263,ES -3105547264,3105548287,GB -3105548288,3105549311,IR -3105549312,3105550079,AT -3105550080,3105550335,FR -3105550336,3105551359,GB -3105551360,3105552383,US -3105552384,3105553407,FR -3105553408,3105554431,DE -3105554432,3105555455,DK -3105555456,3105556479,CH -3105556480,3105557503,DE -3105557504,3105558527,GB -3105558528,3105558591,US -3105558592,3105559551,NL -3105559552,3105560575,GB -3105560576,3105561599,NO -3105561600,3105563647,NL -3105563648,3105564671,IS -3105564672,3105565695,NL -3105565696,3105567743,RU -3105567744,3105568767,PL -3105568768,3105569791,MT -3105569792,3105570815,HU -3105570816,3105571839,LI -3105571840,3105572863,KZ -3105572864,3105573887,IT -3105573888,3105574911,FR -3105574912,3105575935,RU -3105575936,3105576959,DE -3105576960,3105577983,OM -3105577984,3105579007,LV -3105579008,3105580031,SE -3105580032,3105581055,RU -3105581056,3105582079,IL -3105582080,3105583103,CH -3105583104,3105584127,DK -3105584128,3105585151,DE -3105585152,3105586175,AT -3105586176,3105587199,ES -3105587200,3105588223,RS -3105588224,3105589247,GB -3105589248,3105590271,ES -3105590272,3105591295,NL -3105591296,3105592319,GB -3105592320,3105593343,RU -3105593344,3105595391,DE -3105595392,3105596415,RU -3105596416,3105598463,SE -3105598464,3105599487,NL -3105599488,3105600511,GB -3105600512,3105601535,DE -3105601536,3105602559,CH -3105602560,3105603583,PL -3105603584,3105604607,RU -3105604608,3105605631,GB -3105605632,3105606655,ES -3105606656,3105607679,DK -3105607680,3105608703,RU -3105608704,3105609727,DE -3105609728,3105610751,IQ -3105610752,3105611775,SA -3105611776,3105612799,FR -3105612800,3105613823,US -3105613824,3105614847,SE -3105614848,3105615871,NL -3105615872,3105616895,SE -3105616896,3105617919,GB -3105617920,3105617967,NL -3105617968,3105617999,AF -3105618000,3105618015,NL -3105618016,3105618031,AF -3105618032,3105618047,NL -3105618048,3105618063,AF -3105618064,3105618111,NL -3105618112,3105618127,AF -3105618128,3105618943,NL -3105618944,3105619967,DE -3105619968,3105620991,TR -3105620992,3105622015,DE -3105622016,3105623039,SI -3105623040,3105624063,GB -3105624064,3105625087,PL -3105625088,3105626111,US -3105626112,3105627135,GB -3105627136,3105628159,FR -3105628160,3105629183,GB -3105629184,3105629695,BE -3105629696,3105629951,NL -3105629952,3105630207,BE -3105630208,3105631231,FR -3105631232,3105632255,GB -3105632256,3105633279,ES -3105633280,3105634303,IT -3105634304,3105635327,NL -3105635328,3105636351,TR -3105636352,3105636863,IT -3105637376,3105637631,NL -3105637632,3105637887,DE -3105637888,3105638399,US -3105638400,3105639423,IM -3105639424,3105640447,DE -3105640448,3105641471,IT -3105641472,3105642495,NL -3105642496,3105644543,GB -3105644544,3105645567,DE -3105645568,3105646591,SK -3105646592,3105647615,MD -3105647616,3105648639,UA -3105648640,3105649663,GB -3105649664,3105650687,PL -3105650688,3105651199,EE -3105651200,3105651455,PL -3105651456,3105651711,EE -3105651712,3105652735,SK -3105652736,3105653759,NO -3105653760,3105654783,TR -3105654784,3105655807,SE -3105655808,3105656831,ES -3105656832,3105657855,SK -3105657856,3105658879,NL -3105658880,3105659903,IL -3105659904,3105660927,DE -3105660928,3105661951,TR -3105661952,3105662975,GB -3105662976,3105663999,ES -3105664000,3105665023,DE -3105665024,3105666047,PL -3105666048,3105667071,NL -3105667072,3105668095,DE -3105668096,3105669119,NL -3105669120,3105670143,CZ -3105670144,3105671167,IE -3105671168,3105673215,GB -3105673216,3105674239,DE -3105674240,3105675263,GB -3105675264,3105676287,ES -3105676288,3105678335,NL -3105678336,3105679359,DE -3105679360,3105680383,FR -3105680384,3105681407,UA -3105681408,3105682431,GB -3105682432,3105683455,FI -3105683456,3105684479,PL -3105684480,3105686527,GB -3105686528,3105687551,BE -3105687552,3105688319,SE -3105688320,3105688575,NL -3105688576,3105689599,PL -3105689600,3105690623,SI -3105690624,3105691647,SE -3105691648,3105692671,GR -3105692672,3105693695,DE -3105693696,3105696767,FR -3105696768,3105697791,GB -3105697792,3105698815,FR -3105698816,3105700863,RU -3105700864,3105701887,BE -3105701888,3105702911,FR -3105702912,3105703935,ES -3105703936,3105704959,IT -3105704960,3105705983,DK -3105705984,3105707007,HU -3105707008,3105708031,PL -3105708032,3105709055,AT -3105709056,3105710079,SA -3105710080,3105711103,IT -3105711104,3105712127,RS -3105712128,3105713151,IT -3105713152,3105714175,NL -3105714176,3105715199,SE -3105715200,3105716223,DE -3105716224,3105717247,TR -3105717248,3105719295,RU -3105719296,3105721343,GB -3105721344,3105722367,OM -3105722368,3105723391,IT -3105723392,3105724415,FR -3105724416,3105725439,CH -3105725440,3105726463,SK -3105726464,3105727487,IT -3105727488,3105727743,NO -3105727744,3105727999,BE -3105728000,3105728127,AT -3105728128,3105728191,FI -3105728192,3105728255,PT -3105728256,3105728319,TR -3105728320,3105728383,PL -3105728384,3105728447,CZ -3105728448,3105728511,LT -3105728512,3105729535,DE -3105729536,3105731583,GB -3105731584,3105732607,FR -3105732608,3105733631,KG -3105733632,3105734655,DE -3105734656,3105735679,TR -3105735680,3105736703,IS -3105736704,3105737727,NL -3105737728,3105738751,IT -3105738752,3105739775,GB -3105739776,3105740799,ES -3105740800,3105741823,DE -3105741824,3105742847,IR -3105742848,3105744895,GB -3105744896,3105745919,FR -3105745920,3105746943,UA -3105746944,3105747967,DE -3105747968,3105748991,FR -3105748992,3105750015,IT -3105750016,3105751039,UA -3105751040,3105752063,PL -3105752064,3105753087,IR -3105753088,3105754111,GB -3105754112,3105756159,RU -3105756160,3105757183,US -3105757184,3105758207,GB -3105758208,3105759231,FR -3105759232,3105760255,DE -3105760256,3105761279,LB -3105761280,3105762303,RU -3105762304,3105763327,IT -3105763328,3105764351,FR -3105764352,3105765375,BE -3105765376,3105766399,NL -3105766400,3105769471,IT -3105769472,3105770495,IE -3105770496,3105771519,IR -3105771520,3105772543,IT -3105772544,3105773567,UA -3105773568,3105774591,AZ -3105774592,3105775615,FR -3105775616,3105776639,RU -3105776640,3105777663,DK -3105777664,3105778687,RU -3105778688,3105780735,IT -3105780736,3105781759,RU -3105781760,3105782783,SK -3105782784,3105783807,PL -3105783808,3105785855,FR -3105785856,3105786879,SI -3105786880,3105787903,ES -3105787904,3105788927,AL -3105788928,3105789951,SA -3105789952,3105790975,SE -3105790976,3105791999,DE -3105793024,3105794047,NL -3105795072,3105796095,LU -3105796096,3105797119,NL -3105797120,3105798143,IT -3105798144,3105799167,IS -3105799168,3105800191,IT -3105800192,3105801215,RU -3105801216,3105802239,ES -3105802240,3105803263,UA -3105803264,3105804287,NL -3105804288,3105805311,FR -3105805312,3105806335,GB -3105806336,3105807167,FR -3105807168,3105807175,KM -3105807176,3105807359,FR -3105807360,3105808383,RU -3105808384,3105809407,NO -3105809408,3105810431,RU -3105810432,3105812479,NL -3105812480,3105814527,ES -3105814528,3105815551,JO -3105815552,3105816575,BE -3105816576,3105817599,FR -3105817600,3105818623,DE -3105818624,3105819647,NL -3105819648,3105820671,GB -3105820672,3105820927,NL -3105820928,3105821183,DE -3105821184,3105821695,GB -3105821696,3105822719,ES -3105822720,3105823743,PL -3105823744,3105824767,AT -3105824768,3105825791,RS -3105825792,3105826815,CZ -3105826816,3105827839,FR -3105827840,3105828863,LV -3105828864,3105829887,PL -3105829888,3105830911,AT -3105830912,3105831167,IT -3105831168,3105831423,US -3105831424,3105831679,SG -3105831680,3105831935,BR -3105831936,3105832959,DE -3105832960,3105833983,IT -3105833984,3105835007,FI -3105835008,3105836031,KZ -3105836032,3105837055,DK -3105837056,3105838079,PL -3105838080,3105839103,UA -3105839104,3105840127,PL -3105840128,3105841151,EE -3105841152,3105842175,IE -3105842176,3105843199,CH -3105843200,3105844223,ES -3105844224,3105847295,RU -3105847296,3105848319,BG -3105848320,3105849343,IR -3105849344,3105850367,US -3105850368,3105851391,RU -3105851392,3105852415,FI -3105852416,3105853439,SE -3105853440,3105854463,NL -3105854464,3105855487,FR -3105855488,3105856511,GB -3105856512,3105857535,PT -3105857536,3105859583,RU -3105859584,3105860607,GB -3105860608,3105861631,NL -3105861632,3105862655,DK -3105862656,3105863679,CH -3105863680,3105864703,PL -3105864704,3105865727,AE -3105865728,3105866199,NL -3105866200,3105866200,RU -3105866201,3105866210,NL -3105866211,3105866211,RU -3105866212,3105866239,NL -3105866240,3105866751,RU -3105866752,3105867775,SE -3105867776,3105868799,NL -3105868800,3105869823,GB -3105869824,3105870847,DE -3105870848,3105871871,AT -3105871872,3105872895,PL -3105872896,3105873919,IM -3105873920,3105874943,GB -3105874944,3105875967,NL -3105875968,3105876991,GB -3105876992,3105878015,ES -3105878016,3105879039,EE -3105879040,3105880063,NL -3105880064,3105881087,CH -3105881088,3105882111,GB -3105882112,3105883135,MD -3105883136,3105884159,PL -3105884160,3105885183,SE -3105885184,3105886207,TR -3105886208,3105887231,ES -3105887232,3105888255,AL -3105888256,3105889279,RO -3105889280,3105890303,ES -3105890304,3105891327,DE -3105891328,3105892351,PT -3105892352,3105893375,GB -3105893376,3105894399,AZ -3105894400,3105895423,PL -3105895424,3105896447,GB -3105896448,3105897471,RU -3105897472,3105898495,UA -3105898496,3105898751,CZ -3105898752,3105899263,RU -3105899264,3105899519,CZ -3105899520,3105900543,RU -3105900544,3105901567,GB -3105901568,3105901823,US -3105901824,3105902591,GB -3105902592,3105903615,DE -3105903616,3105904639,RU -3105904640,3105905663,NO -3105905664,3105906687,IE -3105906688,3105908735,FR -3105908736,3105910783,GB -3105910784,3105911807,IL -3105911808,3105912831,DE -3105912832,3105913855,RU -3105913856,3105914879,CH -3105914880,3105915903,IR -3105915904,3105916927,RU -3105916928,3105917951,ES -3105917952,3105918975,NL -3105918976,3105919999,PL -3105921024,3105922047,IE -3105922048,3105923071,PL -3105923072,3105924095,CZ -3105924096,3105925119,RU -3105925120,3105926143,BE -3105926144,3105927167,BA -3105927168,3105928191,IL -3105928192,3105928447,NL -3105928448,3105929215,CZ -3105929216,3105930239,RU -3105930240,3105931263,PT -3105931264,3105932287,US -3105932288,3105933311,SE -3105933312,3105933847,GB -3105933848,3105933855,IT -3105933856,3105934215,GB -3105934216,3105934223,IT -3105934224,3105934335,GB -3105934336,3105935359,SE -3105935360,3105936383,FR -3105936384,3105937407,CH -3105937408,3105938431,FR -3105938432,3105939455,CH -3105939456,3105940479,BY -3105940480,3105941503,GR -3105941504,3105942527,NL -3105942528,3105943039,LU -3105943040,3105943295,BE -3105943296,3105943551,LU -3105943552,3105944575,NL -3105944576,3105945599,DE -3105945600,3105946623,RU -3105946624,3105947647,IE -3105947648,3105948671,AD -3105948672,3105949695,GB -3105949696,3105950719,AT -3105950720,3105951743,FR -3105951744,3105952767,LU -3105952768,3105953791,CH -3105953792,3105954815,FR -3105954816,3105955839,JO -3105955840,3105956863,AL -3105956864,3105957887,PL -3105957888,3105958911,FR -3105958912,3105959935,IQ -3105959936,3105960959,SI -3105960960,3105961983,HU -3105961984,3105963007,IT -3105963008,3105964031,TR -3105964032,3105965055,ES -3105965056,3105966079,NL -3105966080,3105967103,FI -3105967104,3105968127,GB -3105968128,3105969151,HU -3105969152,3105970175,NL -3105970176,3105971199,FR -3105971200,3105972223,GB -3105972224,3105973247,DK -3105973248,3105974048,US -3105974049,3105974271,NL -3105974272,3105975295,MD -3105976320,3105977343,LB -3105977344,3105978367,NL -3105978368,3105979391,RU -3105979392,3105980415,KW -3105980416,3105981439,TR -3105981440,3105982463,ES -3105982464,3105983487,CZ -3105983488,3105984511,UA -3105984512,3105985279,CZ -3105985280,3105985535,HU -3105985536,3105986559,GB -3105986560,3105987583,NL -3105987584,3105988607,CZ -3105988608,3105989631,RU -3105989632,3105990655,NL -3105990656,3105990911,PS -3105990912,3105991679,US -3105992704,3105993727,BH -3105993728,3105994751,DE -3105994752,3105995775,GB -3105995776,3105996799,DE -3105996800,3105997823,GB -3105997824,3105999871,RU -3105999872,3106000895,DE -3106000896,3106001919,GB -3106001920,3106002943,FR -3106002944,3106003967,DE -3106004992,3106006015,CH -3106006016,3106007039,RU -3106007040,3106008063,CY -3106008064,3106009087,RU -3106009088,3106010111,GB -3106010112,3106011135,RU -3106011136,3106012159,CH -3106012160,3106013183,AT -3106013184,3106014207,DE -3106014208,3106015231,NO -3106015232,3106016255,GB -3106016256,3106017279,DK -3106017280,3106018303,IQ -3106018304,3106019327,RU -3106019328,3106019839,LV -3106019840,3106020351,NL -3106020352,3106021375,PL -3106021376,3106022399,FR -3106022400,3106023423,IT -3106023424,3106023679,NL -3106023680,3106023807,DE -3106023808,3106023935,AE -3106023936,3106024063,US -3106024064,3106024191,DE -3106024192,3106024319,US -3106024320,3106024447,DE -3106024448,3106025471,GB -3106025472,3106026495,PL -3106026496,3106027519,LT -3106027520,3106027535,PL -3106027536,3106027551,FR -3106027552,3106027567,CH -3106027568,3106027583,DE -3106027584,3106027599,CZ -3106027600,3106027615,IT -3106027616,3106027631,NL -3106027632,3106029567,GB -3106030592,3106031615,NL -3106031616,3106032639,AZ -3106032640,3106033663,PL -3106033664,3106034687,GB -3106034688,3106035711,IT -3106035712,3106036735,DE -3106036736,3106037759,RS -3106037760,3106038783,GB -3106038784,3106039807,AZ -3106039808,3106041855,IE -3106041856,3106042879,DE -3106042880,3106043903,GB -3106043904,3106044927,IE -3106044928,3106045951,GB -3106045952,3106046975,TR -3106046976,3106047999,DK -3106048000,3106048255,NL -3106048256,3106049023,IT -3106049024,3106050047,FR -3106050048,3106051071,NL -3106051072,3106052095,LI -3106052096,3106053119,RU -3106053120,3106054143,NL -3106054144,3106055167,IR -3106055168,3106056191,GB -3106056192,3106057215,NL -3106057216,3106058239,GB -3106058240,3106059263,NL -3106059264,3106060287,RU -3106060288,3106061311,DE -3106061312,3106062335,NL -3106062336,3106063359,ES -3106063360,3106064383,DE -3106064384,3106065407,NL -3106065408,3106066431,IT -3106066432,3106067455,GB -3106067456,3106068479,DE -3106068480,3106070527,NL -3106070528,3106071551,UA -3106071552,3106072575,BH -3106072576,3106073599,GB -3106073600,3106074623,PL -3106074624,3106076671,RU -3106076672,3106078463,GB -3106078464,3106078719,JP -3106078720,3106080767,RU -3106080768,3106081791,UA -3106081792,3106082815,DE -3106082816,3106083839,KZ -3106083840,3106084863,TR -3106084864,3106085887,GB -3106085888,3106086911,CH -3106086912,3106087935,NL -3106087936,3106091007,RU -3106091008,3106092031,GB -3106092032,3106093055,BE -3106093056,3106094079,GB -3106094080,3106095103,CH -3106095104,3106096127,FR -3106096128,3106097151,LV -3106097152,3106098175,GB -3106098176,3106098431,NL -3106098432,3106098687,GB -3106098688,3106098943,US -3106098944,3106099199,GB -3106099200,3106100223,NO -3106100224,3106101247,SE -3106101248,3106102271,GB -3106102272,3106103295,ES -3106103296,3106104319,NL -3106104320,3106105343,UA -3106105344,3106106367,AE -3106106368,3106106623,US -3106106624,3106107391,DE -3106107392,3106108415,NL -3106108416,3106110463,RU -3106110464,3106111487,GB -3106111488,3106112511,RU -3106112512,3106113535,US -3106113536,3106114559,NL -3106114560,3106115583,ES -3106115584,3106116607,DE -3106116608,3106117631,GB -3106117632,3106118655,AT -3106118656,3106119679,BA -3106119680,3106120703,RU -3106120704,3106121727,BE -3106121728,3106122751,RU -3106122752,3106123775,BE -3106123776,3106124799,BG -3106124800,3106125823,AT -3106125824,3106126847,NO -3106126848,3106127871,ES -3106127872,3106128895,RU -3106128896,3106129919,PL -3106129920,3106130175,SE -3106130176,3106130943,NO -3106130944,3106131967,FR -3106131968,3106132991,DE -3106132992,3106134015,NO -3106134016,3106135039,DE -3106135040,3106136063,RU -3106137088,3106138111,GB -3106138112,3106139135,DE -3106139136,3106140159,SE -3106140160,3106141183,DE -3106141184,3106142207,IS -3106142208,3106143231,GB -3106143232,3106144255,CH -3106144256,3106145279,ES -3106145280,3106146303,BE -3106146304,3106147327,GB -3106147328,3106148351,FR -3106148352,3106149375,AT -3106149632,3106149887,DE -3106149888,3106150143,GB -3106150400,3106151423,GB -3106151424,3106152447,NO -3106152448,3106153471,GB -3106153472,3106154495,AM -3106154496,3106155519,NL -3106155520,3106156543,DE -3106156544,3106157567,NO -3106157568,3106158591,IT -3106158592,3106159615,UA -3106159616,3106160639,RU -3106160640,3106161663,IT -3106161664,3106162687,BA -3106162688,3106163711,IT -3106163712,3106164991,GB -3106164992,3106165247,LT -3106165248,3106165759,GB -3106165760,3106166783,BA -3106166784,3106167807,BH -3106167808,3106168831,RO -3106168832,3106169855,FI -3106169856,3106170879,NL -3106170880,3106171903,RU -3106171904,3106172927,GB -3106172928,3106173951,NL -3106173952,3106175999,DE -3106176000,3106177023,NO -3106177024,3106178047,IT -3106178048,3106179071,NL -3106179072,3106180095,DE -3106180096,3106181119,NO -3106181120,3106182143,ES -3106182144,3106183167,AX -3106183168,3106184191,PL -3106184192,3106185215,RU -3106185216,3106186239,CZ -3106186240,3106187263,BE -3106187264,3106188287,PL -3106188288,3106189311,RU -3106189312,3106190335,KW -3106190336,3106191359,LU -3106191360,3106192383,DK -3106192384,3106193407,NL -3106193408,3106194431,IR -3106194432,3106195455,UA -3106195456,3106196479,AZ -3106196480,3106198527,ES -3106198528,3106199551,NO -3106199552,3106200575,FR -3106200576,3106202623,CH -3106202624,3106203647,RU -3106203648,3106204671,GR -3106204672,3106205695,MT -3106205696,3106205951,SE -3106205952,3106206719,NO -3106206720,3106207743,GE -3106207744,3106208767,GB -3106208768,3106209791,RO -3106209792,3106210815,CH -3106210816,3106211839,NL -3106211840,3106212863,BE -3106212864,3106213887,PS -3106213888,3106214911,DE -3106214912,3106215935,NL -3106215936,3106216959,RS -3106216960,3106217983,FR -3106219008,3106220031,US -3106220032,3106221055,FR -3106221056,3106222079,IT -3106222080,3106223103,RU -3106223104,3106224127,IR -3106224128,3106226175,RU -3106226176,3106228223,NL -3106228224,3106229247,CH -3106229248,3106230271,GG -3106230272,3106231295,IT -3106231296,3106232319,DK -3106232320,3106233343,IQ -3106233344,3106234367,IT -3106234368,3106235391,QA -3106235392,3106235647,BA -3106235648,3106235903,RU -3106235904,3106236159,RO -3106236160,3106236415,TR -3106236416,3106237439,AT -3106237440,3106238463,QA -3106238464,3106239487,PL -3106239488,3106240511,IT -3106240512,3106241535,IE -3106241536,3106242559,NL -3106242560,3106243583,RU -3106243584,3106244607,FI -3106244608,3106245631,DE -3106245632,3106245887,DK -3106245888,3106246655,SE -3106246656,3106247679,DE -3106247680,3106248703,IL -3106248704,3106249727,DE -3106249728,3106250751,FR -3106250752,3106251775,IQ -3106251776,3106252799,RU -3106252800,3106253823,RS -3106253824,3106255871,GB -3106255872,3106256895,IT -3106256896,3106257919,TR -3106257920,3106258943,RU -3106258944,3106259967,UA -3106259968,3106260991,GB -3106260992,3106261247,DE -3106261248,3106262015,AT -3106262016,3106263039,IT -3106263040,3106264063,PT -3106264064,3106265087,ES -3106265088,3106266111,GB -3106266112,3106266367,FR -3106266368,3106266399,HK -3106266400,3106266431,SG -3106266432,3106266463,JP -3106266464,3106266527,US -3106266528,3106266543,FR -3106266544,3106266559,HK -3106266560,3106266591,FR -3106266592,3106266607,US -3106266608,3106266623,FR -3106266624,3106266879,US -3106266880,3106266927,FR -3106266928,3106266943,AU -3106266944,3106266975,FR -3106266976,3106267007,US -3106267008,3106267135,JP -3106267136,3106269183,ES -3106270208,3106271231,GB -3106271232,3106272255,SK -3106272256,3106273279,NL -3106273280,3106274303,DE -3106274304,3106275327,CH -3106275328,3106276351,FI -3106276352,3106277375,AT -3106277376,3106278399,DE -3106278400,3106279423,NL -3106279424,3106280447,RU -3106280448,3106281471,FR -3106281472,3106282495,DK -3106282496,3106283519,LB -3106283520,3106285567,GB -3106285568,3106286591,DE -3106286592,3106287615,GB -3106287616,3106289663,DE -3106289664,3106290687,LV -3106290688,3106291711,IE -3106291712,3106292735,CH -3106292736,3106293759,NO -3106293760,3106294783,UA -3106294784,3106295807,DE -3106295808,3106296831,GB -3106296832,3106297855,RU -3106297856,3106298879,NL -3106298880,3106299903,FR -3106299904,3106300159,GB -3106300160,3106300415,DE -3106300416,3106300927,GB -3106300928,3106301951,NL -3106301952,3106302975,GB -3106302976,3106303999,CZ -3106304000,3106305023,GB -3106305024,3106306047,DE -3106306048,3106307071,NO -3106307072,3106308095,HU -3106308096,3106309119,ES -3106309120,3106310143,GB -3106310144,3106311167,IT -3106311168,3106312191,PT -3106312192,3106313215,BA -3106313216,3106314239,GB -3106314240,3106316287,NL -3106316288,3106317311,RU -3106317312,3106318335,LT -3106318336,3106319359,AT -3106319360,3106320383,DK -3106320384,3106321407,HR -3106321408,3106321919,SE -3106321920,3106322431,DK -3106322432,3106323455,ME -3106323456,3106324479,CZ -3106324480,3106325503,AL -3106325504,3106326527,FR -3106326528,3106326783,NL -3106326784,3106327039,US -3106327040,3106327295,GB -3106327296,3106327551,NL -3106327552,3106328575,RU -3106328576,3106329087,UA -3106329088,3106329599,US -3106329600,3106330623,IQ -3106330624,3106331647,UA -3106331648,3106333695,PL -3106333696,3106334719,GB -3106334720,3106335743,NL -3106335744,3106336767,NO -3106336768,3106337791,DE -3106337792,3106338815,GB -3106338816,3106339839,PL -3106339840,3106340863,IT -3106340864,3106341887,BA -3106341888,3106342911,RU -3106342912,3106343935,CH -3106343936,3106344959,DE -3106344960,3106345983,RU -3106345984,3106347007,DE -3106347008,3106348031,IT -3106348032,3106349055,UA -3106349056,3106350079,CH -3106350080,3106351103,SA -3106351104,3106352127,ES -3106352128,3106353151,NL -3106353152,3106354175,DE -3106354176,3106354316,NL -3106354317,3106354317,BE -3106354318,3106354431,NL -3106354432,3106354439,GB -3106354440,3106354447,AT -3106354448,3106354511,NL -3106354512,3106354519,GB -3106354520,3106354527,AT -3106354528,3106354943,NL -3106354944,3106354951,GB -3106354952,3106354959,AT -3106354960,3106355023,NL -3106355024,3106355031,GB -3106355032,3106355039,AT -3106355040,3106355051,NL -3106355052,3106355103,GB -3106355104,3106355199,NL -3106355200,3106356223,DE -3106356224,3106357247,ES -3106357248,3106358271,DE -3106358272,3106359295,ES -3106359296,3106360319,UA -3106360320,3106361343,IQ -3106361344,3106362367,RU -3106362368,3106364415,DE -3106364416,3106365439,CH -3106365440,3106366463,ES -3106366464,3106367487,IT -3106367488,3106369535,DE -3106369536,3106371583,RU -3106371584,3106372607,NL -3106372608,3106373631,SE -3106373632,3106374655,FI -3106374656,3106375679,RU -3106375680,3106376703,ES -3106376704,3106377727,FR -3106377728,3106378751,SE -3106378752,3106379775,RU -3106379776,3106380799,BE -3106380800,3106381823,FR -3106381824,3106382847,PL -3106382848,3106383871,IE -3106383872,3106384895,FR -3106384896,3106385919,AT -3106385920,3106386943,DE -3106386944,3106387967,IR -3106387968,3106388991,FI -3106388992,3106390015,IT -3106390016,3106391039,RU -3106391040,3106392063,UA -3106392064,3106393087,NO -3106393088,3106394111,RU -3106394112,3106395135,PT -3106395136,3106396159,NO -3106396160,3106397183,FR -3106397184,3106398207,DE -3106398208,3106399231,UA -3106399232,3106400255,CH -3106400256,3106402303,GB -3106402304,3106403327,IT -3106403328,3106405375,GB -3106405376,3106406399,DE -3106406400,3106408447,RU -3106408448,3106409471,GB -3106409472,3106411519,IT -3106411520,3106412543,HU -3106412544,3106413567,GB -3106413568,3106414591,RU -3106414592,3106415615,AZ -3106415616,3106416639,ES -3106416640,3106417663,RU -3106417664,3106418687,DK -3106418688,3106419711,UA -3106419712,3106420735,AT -3106420736,3106421759,NL -3106421760,3106422783,LU -3106422784,3106423807,IE -3106423808,3106424831,BE -3106424832,3106425855,TR -3106425856,3106426879,RU -3106426880,3106427903,CZ -3106427904,3106428927,TR -3106428928,3106429951,FI -3106429952,3106431999,NL -3106432000,3106433023,FR -3106434048,3106435071,NL -3106435072,3106436095,PL -3106436096,3106437119,DE -3106437120,3106438143,IS -3106438144,3106439167,GB -3106439168,3106440191,RU -3106440192,3106440706,DE -3106440707,3106440707,CH -3106440708,3106441215,DE -3106441216,3106442239,HU -3106442240,3106442495,GG -3106442496,3106443263,GB -3106443264,3106445311,ES -3106445312,3106446335,RU -3106446336,3106447359,AZ -3106447360,3106448383,DE -3106448384,3106449407,BG -3106449408,3106450431,AT -3106450432,3106451455,DE -3106451456,3106452479,AZ -3106452480,3106453503,NL -3106453504,3106454527,SE -3106454528,3106455551,ME -3106455552,3106456575,PS -3106456576,3106457599,PL -3106457600,3106458623,FI -3106458624,3106459647,GB -3106459648,3106460671,LB -3106460672,3106461695,IT -3106461696,3106462719,CH -3106462720,3106463743,IT -3106463744,3106464767,IR -3106464768,3106465791,PL -3106466816,3106467839,EE -3106467840,3106468863,IR -3106468864,3106470911,DE -3106470912,3106471935,NL -3106471936,3106472959,IR -3106472960,3106473983,FR -3106473984,3106475007,GB -3106475008,3106476031,DE -3106476032,3106477055,NO -3106477056,3106478079,UA -3106478080,3106479103,GB -3106479104,3106480127,FR -3106480128,3106481151,IT -3106481152,3106482175,NL -3106482176,3106483199,RU -3106483200,3106483423,GB -3106483424,3106483424,ES -3106483425,3106483425,NL -3106483426,3106483426,FR -3106483427,3106483429,GB -3106483430,3106483430,IE -3106483431,3106483761,GB -3106483762,3106483762,DE -3106483763,3106483763,CZ -3106483764,3106483765,GB -3106483766,3106483766,IT -3106483767,3106483767,DE -3106483768,3106483768,CZ -3106483769,3106483769,BE -3106483770,3106483770,PL -3106483771,3106483771,FR -3106483772,3106483772,IE -3106483773,3106483773,IT -3106483774,3106483774,PL -3106483775,3106483775,IE -3106483776,3106483815,GB -3106483816,3106483816,FR -3106483817,3106483826,GB -3106483827,3106483827,FR -3106483828,3106484223,GB -3106484224,3106485247,NL -3106485248,3106486271,CZ -3106486272,3106488319,DE -3106488320,3106489343,NO -3106489344,3106490367,PL -3106490368,3106491391,IT -3106491392,3106492415,CH -3106492416,3106493439,PL -3106493440,3106494463,SY -3106494464,3106495487,IT -3106495488,3106496511,PL -3106496512,3106497535,ES -3106497536,3106498559,RU -3106498560,3106500607,DE -3106500608,3106501631,RU -3106501632,3106502655,PT -3106502656,3106503679,RU -3106503680,3106504703,NL -3106504704,3106505727,PL -3106505728,3106506751,CH -3106506752,3106507775,NL -3106507776,3106508287,CZ -3106508288,3106509823,NL -3106509824,3106510847,SE -3106510848,3106511871,FR -3106511872,3106512895,GE -3106512896,3106513919,RU -3106513920,3106514943,IT -3106514944,3106515967,RU -3106515968,3106516991,SE -3106516992,3106518015,SI -3106518016,3106519039,FR -3106519040,3106520063,RU -3106520064,3106521087,GB -3106521088,3106522111,UA -3106522112,3106523135,RU -3106523136,3106524159,AZ -3106524160,3106525183,RU -3106525184,3106526207,CY -3106526208,3106527231,IT -3106527232,3106528255,KW -3106528256,3106532351,GB -3106532352,3106533375,BE -3106533376,3106533887,SE -3106533888,3106534143,GB -3106534144,3106534399,NO -3106534400,3106535423,ES -3106535424,3106536447,UA -3106536448,3106537471,IT -3106537472,3106538495,GB -3106538496,3106539519,SK -3106539520,3106540543,NL -3106540544,3106541567,RU -3106541568,3106542591,GB -3106542592,3106543615,ES -3106543616,3106544639,IR -3106544640,3106545663,FR -3106545664,3106546687,CY -3106546688,3106547711,MK -3106547712,3106548735,UA -3106548736,3106549759,PL -3106549760,3106550783,RU -3106550784,3106551807,GB -3106551808,3106552831,NL -3106552832,3106553855,RU -3106553856,3106554879,GB -3106554880,3106556927,NL -3106556928,3106558975,RU -3106558976,3106559999,NL -3106560000,3106562047,RU -3106562048,3106563071,TJ -3106564096,3106565119,ES -3106565120,3106566143,RU -3106566144,3106568191,FR -3106568192,3106569215,ES -3106569216,3106570239,RU -3106570240,3106571263,UA -3106571264,3106572287,FR -3106572288,3106573311,SE -3106573312,3106575359,RU -3106575360,3106577407,GB -3106577408,3106578431,RU -3106578432,3106579455,IT -3106579456,3106580479,RU -3106580480,3106581503,NO -3106581504,3106582527,TR -3106582528,3106583551,FR -3106583552,3106584575,RU -3106584576,3106585599,PL -3106585600,3106586623,FR -3106586624,3106587647,IQ -3106587648,3106589695,NL -3106590720,3106591743,GR -3106591744,3106592767,IR -3106592768,3106593791,LU -3106593792,3106594815,GB -3106594816,3106595839,IR -3106595840,3106596095,EE -3106596096,3106596863,RU -3106596864,3106597887,FR -3106597888,3106598911,GB -3106598912,3106599935,ES -3106599936,3106601983,CH -3106601984,3106603007,DE -3106603008,3106604031,BE -3106604032,3106606079,RU -3106606080,3106607103,AT -3106607104,3106608127,IT -3106608128,3106609151,NL -3106609152,3106611199,DE -3106611200,3106612223,GB -3106612224,3106613247,FR -3106613248,3106614271,GB -3106614272,3106615295,FR -3106615296,3106616319,GB -3106616320,3106617343,DE -3106617344,3106618367,BG -3106618368,3106619391,FR -3106619392,3106620415,NL -3106620416,3106621439,FR -3106621440,3106622463,ES -3106622464,3106623487,GB -3106623488,3106624511,NL -3106624512,3106625535,RU -3106625536,3106626559,FI -3106626560,3106627583,RU -3106627584,3106628607,GB -3106628608,3106629631,RU -3106629632,3106630655,EE -3106630656,3106630911,US -3106630912,3106631423,GB -3106631424,3106631679,US -3106631680,3106632703,SK -3106632704,3106633727,DE -3106633728,3106634751,FI -3106634752,3106635775,BE -3106635776,3106636799,GB -3106636800,3106637823,CZ -3106637824,3106638847,PL -3106638848,3106639871,DK -3106639872,3106640895,GB -3106640896,3106641919,IT -3106641920,3106642943,BE -3106642944,3106643967,GB -3106643968,3106644991,PL -3106644992,3106646015,IT -3106646016,3106647039,DE -3106647040,3106648063,HU -3106648064,3106649087,DE -3106649088,3106649855,ES -3106649856,3106649863,FR -3106649864,3106649983,ES -3106649984,3106649999,GB -3106650000,3106650015,ES -3106650016,3106650031,DE -3106650032,3106650111,ES -3106650112,3106651135,GB -3106651136,3106652159,AZ -3106652160,3106653183,IE -3106653184,3106654207,RU -3106654208,3106655231,CH -3106655232,3106656255,HU -3106656256,3106657279,GB -3106657280,3106658303,NL -3106658304,3106659327,GB -3106659328,3106660351,NL -3106660352,3106661375,UA -3106661376,3106662399,TR -3106662400,3106663423,IE -3106663424,3106664447,UA -3106664448,3106665471,FR -3106665472,3106666495,CH -3106666496,3106667519,UA -3106667520,3106668543,ES -3106668544,3106669567,RU -3106669568,3106670591,DE -3106670592,3106672639,RU -3106672640,3106673663,ES -3106673664,3106674687,CH -3106674688,3106676735,ES -3106676736,3106677759,DE -3106677760,3106678783,IR -3106678784,3106680831,FR -3106680832,3106682879,AT -3106682880,3106683903,LU -3106683904,3106684927,ES -3106684928,3106685951,GB -3106685952,3106686975,RU -3106686976,3106687999,LT -3106688000,3106688255,GB -3106688256,3106688511,FR -3106688512,3106689023,GB -3106689024,3106690047,CH -3106690048,3106691071,UA -3106691072,3106692095,FR -3106692096,3106693119,NL -3106693120,3106694143,NO -3106694144,3106695167,IR -3106695168,3106697215,DE -3106697216,3106698239,IR -3106698240,3106698303,BG -3106698304,3106698367,GE -3106698368,3106698495,BG -3106698496,3106698751,GE -3106698752,3106699263,BG -3106699264,3106700287,RU -3106700288,3106701311,BG -3106701312,3106702335,NL -3106702336,3106703359,DE -3106703360,3106704383,NL -3106704384,3106705407,FR -3106705408,3106706431,GR -3106706432,3106707455,DE -3106707456,3106708479,LB -3106708480,3106709503,LI -3106709504,3106710527,NL -3106710528,3106711551,RU -3106711552,3106712575,NL -3106712576,3106713599,PL -3106713600,3106714623,DE -3106714624,3106715647,IT -3106715648,3106716671,SE -3106716672,3106717695,CZ -3106717696,3106718719,TR -3106718720,3106719743,CH -3106719744,3106720245,DE -3106720246,3106720246,US -3106720247,3106720767,DE -3106720768,3106722815,AT -3106722816,3106723839,IT -3106723840,3106724863,PL -3106724864,3106725887,IT -3106725888,3106726911,NL -3106726912,3106727935,AM -3106727936,3106728959,ES -3106728960,3106729983,RU -3106729984,3106731007,IS -3106731008,3106732031,NL -3106732032,3106735167,GB -3106735168,3106735199,IE -3106735200,3106735263,DE -3106735264,3106735295,FR -3106735296,3106735327,IE -3106735328,3106736127,GB -3106736128,3106737151,IE -3106737152,3106738175,RO -3106738176,3106739199,DE -3106739200,3106740223,DK -3106740224,3106741247,GB -3106741248,3106742271,ES -3106742272,3106743295,FR -3106743296,3106744319,NO -3106744320,3106745343,SM -3106745344,3106746367,NL -3106746368,3106747391,DK -3106747392,3106748415,BE -3106748416,3106749439,CZ -3106749440,3106750463,RU -3106750464,3106751487,BG -3106751488,3106751805,IT -3106751806,3106751806,SM -3106751807,3106751999,IT -3106752000,3106752255,SM -3106752256,3106752511,IT -3106752512,3106753535,ES -3106753536,3106754559,IS -3106754560,3106755583,RU -3106755584,3106756607,SE -3106756608,3106757631,DE -3106757632,3106758655,RU -3106758656,3106759679,GB -3106759680,3106760703,RU -3106760704,3106761727,IE -3106761728,3106762751,DE -3106762752,3106763007,NL -3106763008,3106763775,DE -3106763776,3106764799,NL -3106764800,3106765823,SE -3106765824,3106766847,CZ -3106766848,3106767871,SE -3106767872,3106768895,DE -3106768896,3106769919,CZ -3106769920,3106770943,EE -3106770944,3106771967,RU -3106771968,3106772991,DK -3106772992,3106774015,BG -3106774016,3106775039,AE -3106775040,3106776063,GB -3106776064,3106777087,ES -3106777088,3106778111,GB -3106778112,3106779135,FR -3106779136,3106780159,NO -3106780160,3106781183,FR -3106781184,3106782207,DK -3106782208,3106783231,IR -3106783232,3106784255,NL -3106784256,3106785279,HU -3106785280,3106786303,CZ -3106786304,3106787327,DE -3106787328,3106788351,GB -3106788352,3106789375,AT -3106789376,3106790399,PL -3106790400,3106792447,GB -3106792448,3106793471,FR -3106793472,3106794495,AT -3106794496,3106795519,CH -3106795520,3106796543,DE -3106796544,3106797567,UA -3106797568,3106798591,DE -3106798592,3106799615,FR -3106799616,3106800639,IR -3106801664,3106804735,RU -3106804736,3106805759,EE -3106805760,3106806783,IT -3106806784,3106807807,NL -3106807808,3106808831,HR -3106808832,3106809855,DK -3106809856,3106810879,TR -3106810880,3106812927,RU -3106812928,3106813951,TR -3106813952,3106814975,CH -3106814976,3106815999,MD -3106816000,3106817023,NL -3106817024,3106818047,IT -3106818048,3106819071,IE -3106819072,3106820095,IL -3106820096,3106821247,CH -3106821248,3106821375,PL -3106821376,3106821631,US -3106821632,3106821759,HK -3106821760,3106821887,CN -3106821888,3106822015,RU -3106822016,3106822143,JP -3106822144,3106823167,CH -3106823168,3106824191,PL -3106824192,3106825215,RU -3106825216,3106826239,IT -3106826240,3106827263,PL -3106827264,3106828287,IR -3106828288,3106829311,GB -3106829312,3106830335,NL -3106830336,3106831359,US -3106831360,3106832383,ES -3106832384,3106833407,DE -3106833408,3106834431,NO -3106834432,3106835455,DE -3106835456,3106836479,IT -3106836480,3106837503,KW -3106837504,3106838527,UA -3106838528,3106838783,KZ -3106838784,3106839551,RU -3106839552,3106840575,NL -3106840576,3106841599,BG -3106841600,3106842623,FR -3106842624,3106843647,PL -3106843648,3106844671,GB -3106844672,3106845695,GE -3106845696,3106846719,NL -3106846720,3106847743,RU -3106847744,3106848767,UA -3106848768,3106849791,NL -3106849792,3106850815,RU -3106850816,3106851839,GB -3106851840,3106852863,PL -3106852864,3106853887,GB -3106853888,3106854399,NL -3106854400,3106854911,CH -3106854912,3106855935,IR -3106855936,3106856959,UA -3106856960,3106857983,NO -3106857984,3106859007,FR -3106859008,3106860031,NL -3106860032,3106861055,UA -3106861056,3106863103,PL -3106863104,3106864127,UA -3106864128,3106865151,IE -3106865152,3106866175,NL -3106866176,3106867199,AZ -3106867200,3106868223,LV -3106868224,3106870271,ES -3106870272,3106871295,NL -3106871296,3106872319,CH -3106872320,3106873343,BE -3106873344,3106874367,ES -3106874368,3106875391,RU -3106875392,3106876415,NO -3106876416,3106876671,US -3106876672,3106876735,BG -3106876736,3106876799,MD -3106876800,3106876927,CZ -3106876928,3106877439,US -3106877440,3106878463,IR -3106878464,3106879487,RU -3106879488,3106880511,MK -3106880512,3106881535,NL -3106881536,3106882559,PL -3106882560,3106883583,BE -3106883584,3106884607,IE -3106884608,3106885631,FI -3106885632,3106886655,FR -3106886656,3106887679,US -3106887680,3106888703,RS -3106888704,3106889727,LV -3106889728,3106890751,IT -3106890752,3106891775,NL -3106891776,3106892799,GB -3106892800,3106893823,IT -3106893824,3106894847,NL -3106894848,3106895871,GB -3106895872,3106896895,NL -3106896896,3106897919,DE -3106897920,3106898943,ES -3106898944,3106899967,NL -3106899968,3106900991,IT -3106900992,3106902015,DE -3106902016,3106903039,IE -3106903040,3106904063,BE -3106904064,3106904575,BY -3106904576,3106905087,RU -3106905088,3106906111,LU -3106906112,3106907135,HU -3106907136,3106908159,SE -3106908160,3106909183,NL -3106909184,3106910207,IL -3106910208,3106911231,CZ -3106911232,3106912255,IQ -3106912256,3106913279,HU -3106913280,3106914303,AL -3106914304,3106915327,SE -3106915328,3106917375,NL -3106917376,3106918399,RU -3106918400,3106919423,RS -3106919424,3106920447,ES -3106920448,3106921471,GB -3106921472,3106922495,CZ -3106922496,3106923519,NL -3106923520,3106924543,IT -3106924544,3106925567,DE -3106925568,3106926591,NL -3106926592,3106927615,FR -3106927616,3106928639,ES -3106928640,3106929663,NO -3106929664,3106930687,FR -3106930688,3106931711,DE -3106931712,3106932735,AT -3106932736,3106933759,PL -3106933760,3106934783,BE -3106934784,3106935807,RU -3106935808,3106936831,CZ -3106936832,3106937855,TR -3106937856,3106938879,PL -3106938880,3106939903,IT -3106939904,3106940927,RU -3106940928,3106941951,HU -3106941952,3106943999,FR -3106944000,3106945023,IT -3106945024,3106946047,NL -3106946048,3106946559,JE -3106946560,3106946815,GB -3106946816,3106946943,JE -3106946944,3106947071,GB -3106947072,3106948095,AE -3106948096,3106949119,NL -3106949120,3106950143,RU -3106950144,3106951167,IM -3106951168,3106952191,SE -3106952192,3106954239,ES -3106954240,3106955263,DE -3106956288,3106957311,NL -3106957312,3106958335,DE -3106958336,3106959359,GB -3106959360,3106960383,RU -3106960384,3106961407,DE -3106961408,3106962431,IE -3106962432,3106963455,KZ -3106963456,3106964479,PL -3106964480,3106965503,FR -3106965504,3106966527,KG -3106966528,3106967551,IT -3106967552,3106968575,CH -3106968576,3106969599,KZ -3106969600,3106969631,DK -3106969632,3106970623,NO -3106970624,3106970879,DE -3106970880,3106971135,SG -3106971136,3106971647,DE -3106971648,3106973695,GB -3106973696,3106974719,PL -3106974720,3106975743,BA -3106975744,3106976767,PL -3106976768,3106977791,TR -3106977792,3106978815,RU -3106978816,3106979839,KW -3106979840,3106980863,ES -3106980864,3106981887,UA -3106981888,3106982911,FR -3106982912,3106984959,DE -3106984960,3106985983,TR -3106985984,3106989055,DE -3106989056,3106990079,CH -3106990080,3106991103,PL -3106991104,3106992127,RU -3106992128,3106993151,AM -3106993152,3106994175,DE -3106994176,3106995199,SK -3106995200,3106996223,FR -3106996224,3106997247,SI -3106997248,3106998271,NO -3106998272,3106999295,IT -3106999296,3107000319,PL -3107000320,3107001343,DE -3107001344,3107002367,FR -3107002368,3107003391,AL -3107003392,3107004415,PL -3107004416,3107007487,GB -3107007488,3107008511,TR -3107008512,3107009535,NL -3107009536,3107010559,AT -3107010560,3107011583,IT -3107011584,3107012607,IE -3107012608,3107013631,RU -3107013632,3107014655,DE -3107014656,3107015679,GB -3107015680,3107016703,DE -3107016704,3107017087,GB -3107017088,3107017107,NL -3107017108,3107017108,GB -3107017109,3107017127,NL -3107017128,3107017128,GB -3107017129,3107017151,NL -3107017152,3107017215,GB -3107017216,3107017727,NL -3107017728,3107018751,IR -3107018752,3107019775,BG -3107019776,3107020799,GB -3107020800,3107021823,IR -3107021824,3107022847,IL -3107022848,3107023871,IR -3107023872,3107024895,RU -3107024896,3107025919,GB -3107025920,3107026943,SI -3107026944,3107027967,NL -3107027968,3107028991,GB -3107028992,3107030015,TR -3107030016,3107031039,SE -3107031040,3107032063,DE -3107032064,3107034111,NL -3107034112,3107035135,PL -3107035136,3107036159,CH -3107036160,3107037183,ES -3107037184,3107038207,BH -3107038208,3107039231,GE -3107039232,3107040255,ES -3107040256,3107041279,GB -3107041280,3107042303,AT -3107042304,3107043327,BE -3107043328,3107044351,ES -3107044352,3107045375,CZ -3107045376,3107046399,ES -3107046400,3107047423,NO -3107047424,3107048447,PL -3107048448,3107049471,IT -3107049472,3107050495,FR -3107050496,3107051519,IT -3107051520,3107052543,GB -3107052544,3107053567,CH -3107053568,3107054591,ES -3107054592,3107057663,GB -3107057664,3107058687,RU -3107058688,3107059711,LU -3107059712,3107060735,IT -3107060736,3107061759,DK -3107061760,3107062783,ES -3107062784,3107063807,MD -3107063808,3107064831,RU -3107064832,3107065855,HR -3107065856,3107067903,GB -3107067904,3107068927,RU -3107068928,3107069951,HU -3107069952,3107070975,FR -3107070976,3107071231,SE -3107071232,3107071999,IR -3107072000,3107073023,SE -3107073024,3107074047,ES -3107074048,3107075071,PL -3107075072,3107076095,FR -3107076096,3107077119,BA -3107077120,3107078143,NL -3107078144,3107079167,FR -3107079168,3107080191,TR -3107080192,3107082239,FR -3107082240,3107083263,RU -3107083264,3107084287,LU -3107084288,3107085311,FI -3107085312,3107086335,NL -3107086336,3107087359,EE -3107087360,3107088383,IE -3107088384,3107089407,BR -3107089408,3107090431,IT -3107090432,3107091455,FR -3107091456,3107092479,ES -3107092480,3107093503,DE -3107093504,3107094527,CZ -3107094528,3107095551,FR -3107095552,3107096575,CY -3107096576,3107097599,RU -3107097600,3107098623,DE -3107098624,3107099647,ES -3107099648,3107099903,UA -3107099904,3107100159,CZ -3107100160,3107100415,RU -3107100416,3107100671,SK -3107100672,3107101695,GB -3107101696,3107102719,RU -3107102720,3107103743,GB -3107103744,3107104767,PL -3107104768,3107105791,ES -3107105792,3107106815,NL -3107106816,3107107839,ES -3107107840,3107108863,AL -3107108864,3107109887,RS -3107109888,3107110911,CH -3107110912,3107111935,DE -3107111936,3107112959,ES -3107112960,3107113983,RU -3107113984,3107115007,ES -3107115008,3107116031,NL -3107116032,3107117055,SK -3107117056,3107118079,RU -3107118080,3107120127,CH -3107120128,3107121151,CZ -3107121152,3107122175,AT -3107122176,3107123199,CH -3107123200,3107124223,GB -3107124224,3107125247,FI -3107125248,3107125503,RO -3107125504,3107126271,UA -3107126272,3107127295,FR -3107127296,3107128319,SE -3107128320,3107129343,US -3107129344,3107130111,AT -3107130112,3107130367,CH -3107130368,3107131391,IT -3107131392,3107132415,GE -3107132416,3107133439,RU -3107133440,3107134463,CY -3107134464,3107135487,CZ -3107135488,3107136511,DE -3107136512,3107137535,TR -3107137536,3107138559,IR -3107138560,3107139583,ES -3107139584,3107140607,MX -3107140608,3107142655,NL -3107142656,3107143679,RU -3107143680,3107144703,HU -3107144704,3107145727,CH -3107145728,3107146751,IE -3107146752,3107147775,DK -3107147776,3107148799,GB -3107148800,3107149823,DE -3107149824,3107150847,PL -3107150848,3107151871,PT -3107151872,3107152895,PL -3107152896,3107153919,GE -3107153920,3107154943,IE -3107154944,3107155967,ES -3107155968,3107156991,TR -3107156992,3107158015,PL -3107158016,3107159039,IT -3107159040,3107160063,RU -3107160064,3107161087,AT -3107161088,3107162111,GR -3107162112,3107163135,IT -3107163136,3107164159,RU -3107164160,3107164213,FR -3107164214,3107164214,SE -3107164215,3107164777,FR -3107164778,3107164778,SE -3107164779,3107165183,FR -3107165184,3107166207,NL -3107166208,3107167231,AE -3107167232,3107168255,RU -3107168256,3107169279,ES -3107169280,3107170303,TR -3107170304,3107171327,IT -3107171328,3107172351,GB -3107172352,3107173375,FR -3107173376,3107174399,PL -3107174400,3107175423,DE -3107175424,3107176447,HU -3107176448,3107176703,NL -3107176704,3107177471,GB -3107177472,3107178495,AT -3107178496,3107179519,IR -3107179520,3107180543,SA -3107180544,3107181567,RU -3107181568,3107182591,JO -3107182592,3107183615,FR -3107183616,3107184639,IQ -3107184640,3107185663,SE -3107185664,3107185919,GB -3107185920,3107186431,US -3107186432,3107186687,GB -3107186688,3107187711,NO -3107187712,3107188735,MT -3107188736,3107189759,CZ -3107189760,3107190271,GB -3107190272,3107190783,UA -3107190784,3107191807,CZ -3107191808,3107192063,AE -3107192064,3107192831,GB -3107192832,3107194879,NL -3107194880,3107195903,IT -3107195904,3107196927,NL -3107196928,3107197951,ES -3107197952,3107198975,AT -3107198976,3107199999,GB -3107200000,3107201023,RU -3107201024,3107202047,FR -3107202048,3107203071,GB -3107203072,3107204095,NO -3107204096,3107205119,FR -3107205120,3107206143,BG -3107206144,3107207167,NL -3107207168,3107208191,RU -3107208192,3107209215,NL -3107209216,3107210239,IT -3107210240,3107213311,RU -3107213312,3107214335,GE -3107214336,3107215359,FR -3107215360,3107216383,CY -3107216384,3107217407,IE -3107217408,3107218431,CZ -3107218432,3107219455,IQ -3107219456,3107220479,NL -3107220480,3107221503,GB -3107221504,3107222527,IT -3107222528,3107223551,IQ -3107223552,3107224575,AT -3107224576,3107225599,FR -3107225600,3107226623,AZ -3107226624,3107227647,RU -3107227648,3107228671,US -3107228672,3107229695,RU -3107229696,3107231743,GB -3107231744,3107232767,RU -3107232768,3107233023,GB -3107233024,3107233791,SE -3107233792,3107234815,DE -3107234816,3107235839,FI -3107235840,3107236863,PL -3107236864,3107237887,CZ -3107237888,3107238911,NL -3107238912,3107239935,SE -3107239936,3107241983,AT -3107241984,3107243007,PL -3107243008,3107244031,GB -3107244032,3107244543,RU -3107244544,3107245055,GB -3107245056,3107246079,BG -3107246080,3107248127,NL -3107248128,3107249151,CZ -3107249152,3107250175,GB -3107250176,3107251199,NL -3107251200,3107252223,TR -3107252224,3107253247,SY -3107253248,3107254271,NL -3107254272,3107255295,IT -3107255296,3107257343,DE -3107257344,3107258367,GB -3107258368,3107259391,IT -3107259392,3107260415,CZ -3107260416,3107261439,NL -3107261440,3107262463,SI -3107262464,3107263487,GB -3107263488,3107264511,RU -3107264512,3107265535,FR -3107265536,3107266559,GB -3107266560,3107267583,IE -3107267584,3107268607,IT -3107268608,3107270655,DE -3107270656,3107271679,NL -3107271680,3107271680,AE -3107271681,3107271935,CY -3107271936,3107272703,AE -3107272704,3107273727,GB -3107273728,3107274751,TR -3107274752,3107275775,SE -3107275776,3107276799,IT -3107276800,3107277823,BY -3107277824,3107278847,UA -3107278848,3107279871,FR -3107279872,3107280895,FI -3107280896,3107281919,NL -3107281920,3107282943,GB -3107282944,3107283967,PL -3107283968,3107284991,AL -3107284992,3107286015,KG -3107286016,3107287039,AT -3107287040,3107288063,RS -3107288064,3107289087,NO -3107289088,3107290111,IT -3107290112,3107291135,PL -3107291136,3107292159,NL -3107292160,3107293183,PL -3107293184,3107294207,FR -3107295232,3107296255,PL -3107296256,3107297279,IT -3107297280,3107298303,PL -3107298304,3107299327,DE -3107299328,3107300351,NL -3107300352,3107301375,SE -3107301376,3107302399,DE -3107302400,3107303423,GB -3107303424,3107304447,DE -3107304448,3107305471,AT -3107305472,3107306495,FR -3107306496,3107307519,NO -3107307520,3107308543,IT -3107308544,3107310591,RO -3107310592,3107311615,DE -3107311616,3107311871,IL -3107311872,3107312127,US -3107312128,3107312383,FR -3107312384,3107312639,NL -3107312640,3107313663,SE -3107313664,3107315711,DE -3107315712,3107316735,GB -3107316736,3107317759,KG -3107317760,3107318783,RU -3107318784,3107318799,IE -3107318800,3107318871,NL -3107318872,3107318879,FR -3107318880,3107319039,NL -3107319040,3107319295,GB -3107319296,3107319807,NL -3107319808,3107320831,OM -3107320832,3107321855,SA -3107321856,3107322879,NL -3107322880,3107323903,IT -3107323904,3107324927,ES -3107324928,3107325951,CH -3107325952,3107326975,FR -3107326976,3107327999,LT -3107328000,3107329023,AE -3107329024,3107330047,RU -3107331072,3107332095,NO -3107332096,3107333119,IT -3107333120,3107334143,FR -3107334144,3107335167,RU -3107335168,3107336191,NL -3107336192,3107337215,RU -3107337216,3107339263,PL -3107339264,3107340287,LB -3107340288,3107341311,GB -3107341312,3107342335,NL -3107342336,3107343359,GB -3107343360,3107344383,DE -3107344384,3107345407,CH -3107345408,3107346431,GB -3107346432,3107347455,TR -3107347456,3107348479,NL -3107348480,3107349503,LB -3107349504,3107350527,PL -3107350528,3107351551,IE -3107351552,3107352575,DE -3107352576,3107353599,NL -3107353600,3107355647,DE -3107355648,3107356671,GB -3107356672,3107357695,SI -3107357696,3107358719,SY -3107358720,3107359743,RU -3107359744,3107360767,NL -3107360768,3107361791,AT -3107361792,3107362815,DE -3107362816,3107363839,IT -3107363840,3107364863,IQ -3107364864,3107365375,CY -3107365376,3107365631,NL -3107365632,3107365887,BE -3107365888,3107366911,IQ -3107366912,3107367935,GB -3107367936,3107368959,CH -3107368960,3107369983,RU -3107369984,3107371007,NL -3107371008,3107372031,PL -3107372032,3107373055,DE -3107373056,3107374079,ES -3107374080,3107375103,SE -3107375104,3107376127,GB -3107376128,3107377151,NL -3107377152,3107378175,AT -3107378176,3107379199,IT -3107379200,3107380223,NL -3107380224,3107380735,RU -3107380736,3107381247,GB -3107381248,3107383295,IE -3107383296,3107384319,DE -3107384320,3107385343,RU -3107385344,3107386367,DE -3107386368,3107387391,RU -3107387392,3107388415,BE -3107388416,3107389439,KG -3107389440,3107390463,RU -3107390464,3107391487,RO -3107391488,3107392511,SE -3107392512,3107393535,HU -3107393536,3107394559,GB -3107394560,3107395583,NL -3107395584,3107396607,AT -3107396608,3107397631,GR -3107397632,3107398655,FI -3107398656,3107399679,AZ -3107399680,3107400703,RU -3107400704,3107401727,AL -3107401728,3107402751,EE -3107402752,3107402819,US -3107402820,3107402821,NL -3107402822,3107402823,GB -3107402824,3107402839,US -3107402840,3107402843,GB -3107402844,3107402845,US -3107402846,3107402849,GB -3107402850,3107402855,JO -3107402856,3107402857,GB -3107402858,3107402859,DE -3107402860,3107402863,US -3107402864,3107402865,DE -3107402866,3107402877,US -3107402878,3107402883,GB -3107402884,3107402885,US -3107402886,3107402887,IQ -3107402888,3107402899,GB -3107402900,3107402903,MY -3107402904,3107402909,FR -3107402910,3107402911,CN -3107402912,3107402915,US -3107402916,3107402921,HK -3107402922,3107402925,NL -3107402926,3107402927,GB -3107402928,3107402929,GI -3107402930,3107402931,AU -3107402932,3107402939,CN -3107402940,3107402945,JO -3107402946,3107402947,IQ -3107402948,3107402949,GB -3107402950,3107402951,IQ -3107402952,3107402959,DO -3107402960,3107403775,GB -3107403776,3107404799,ES -3107404800,3107405823,GB -3107405824,3107406847,PL -3107406848,3107408895,DE -3107408896,3107409919,GB -3107409920,3107410943,IT -3107410944,3107411967,FI -3107411968,3107412991,IT -3107412992,3107414015,BE -3107414016,3107415039,FR -3107415040,3107416063,DE -3107416064,3107417087,NO -3107417088,3107419135,NL -3107419136,3107422207,DE -3107422208,3107423231,NL -3107423232,3107424255,GB -3107424256,3107425279,NL -3107425280,3107426303,RO -3107426304,3107427327,FR -3107427328,3107428351,AL -3107428352,3107429375,DE -3107429376,3107430399,RS -3107431424,3107432447,FR -3107432448,3107433471,IT -3107433472,3107434495,RU -3107434496,3107435519,FI -3107435520,3107436543,DE -3107436544,3107437567,IQ -3107437568,3107438591,GB -3107438592,3107439615,DE -3107439616,3107440639,DK -3107440640,3107442687,IE -3107443712,3107444735,IT -3107444736,3107445759,ES -3107445760,3107446783,DE -3107446784,3107447807,IR -3107447808,3107448831,BG -3107448832,3107449855,DE -3107449856,3107450879,AT -3107450880,3107451903,DE -3107451904,3107452927,FR -3107452928,3107453951,ES -3107453952,3107454975,GB -3107454976,3107455999,IT -3107456000,3107457023,GB -3107457024,3107458047,IT -3107458048,3107459071,IS -3107459072,3107460095,UA -3107460096,3107461119,GB -3107461120,3107462143,CH -3107462144,3107464191,NL -3107464192,3107465215,PL -3107465216,3107467263,GB -3107467264,3107468287,FR -3107468288,3107469311,NL -3107469312,3107470335,DK -3107470336,3107471359,NL -3107471360,3107473407,GB -3107473408,3107474431,IL -3107474432,3107475455,ES -3107475456,3107475610,SC -3107475611,3107475611,NL -3107475612,3107476479,SC -3107476480,3107477503,US -3107477504,3107478527,AE -3107478528,3107480575,IR -3107480576,3107481599,DK -3107481600,3107482623,DE -3107482624,3107483647,ES -3107483648,3107484671,DE -3107484672,3107485695,RU -3107485696,3107486719,IT -3107486720,3107487743,AT -3107487744,3107489791,DE -3107489792,3107490815,NL -3107490816,3107491839,US -3107491840,3107492863,NL -3107492864,3107493887,DE -3107493888,3107494911,FR -3107494912,3107495935,IT -3107495936,3107496191,FR -3107496192,3107496255,DE -3107496256,3107496287,BS -3107496288,3107496319,VG -3107496320,3107496399,NL -3107496400,3107496415,JP -3107496416,3107496431,NL -3107496432,3107496447,UA -3107496448,3107496463,CL -3107496464,3107496479,ES -3107496480,3107496495,RO -3107496496,3107496511,IN -3107496512,3107496703,NL -3107496704,3107496719,PE -3107496720,3107496735,PK -3107496736,3107496751,FJ -3107496752,3107496783,PA -3107496784,3107496799,BE -3107496800,3107496815,IL -3107496816,3107496831,CN -3107496832,3107496847,BR -3107496848,3107496863,NL -3107496864,3107496879,HK -3107496880,3107496895,IS -3107496896,3107496911,US -3107496912,3107496927,PL -3107496928,3107496959,FR -3107496960,3107497983,DK -3107497984,3107499007,IT -3107499008,3107500031,PL -3107500032,3107501055,FR -3107501056,3107502079,ES -3107502080,3107503103,NO -3107503104,3107504127,PL -3107504128,3107505151,IQ -3107505152,3107506175,SA -3107506176,3107507199,GB -3107507200,3107508223,FR -3107508224,3107509247,PL -3107509248,3107510271,SE -3107510272,3107511295,IT -3107511296,3107511807,RS -3107511808,3107512319,SI -3107512320,3107513343,NL -3107513344,3107514367,DE -3107514368,3107515391,NL -3107515392,3107516415,TR -3107516416,3107517439,FR -3107517440,3107518463,PL -3107518464,3107519487,MK -3107519488,3107520511,MT -3107520512,3107521535,DE -3107521536,3107522559,SE -3107522560,3107523583,NL -3107523584,3107524607,FR -3107524608,3107525631,SI -3107525632,3107526655,IT -3107526656,3107527679,DE -3107527680,3107528703,RU -3107528704,3107531775,GB -3107531776,3107532799,MD -3107532800,3107533823,AT -3107533824,3107534847,FR -3107534848,3107536895,NL -3107536896,3107537919,TR -3107537920,3107538943,AM -3107538944,3107539967,KZ -3107539968,3107540991,GB -3107540992,3107542015,RO -3107542016,3107543039,SE -3107543040,3107544063,DE -3107544064,3107545087,GB -3107545088,3107546111,NL -3107546112,3107547135,GB -3107547136,3107548159,SE -3107548160,3107549183,IT -3107549184,3107551231,IE -3107551232,3107552255,JO -3107552256,3107553279,FR -3107553280,3107554303,BE -3107554304,3107555327,IR -3107555328,3107556351,SE -3107556352,3107557375,NL -3107557376,3107558399,SI -3107558400,3107559423,FR -3107559424,3107561471,GB -3107561472,3107562495,GL -3107562496,3107563519,IR -3107563520,3107564543,SE -3107564544,3107565567,NL -3107565568,3107566591,AT -3107566592,3107567615,FI -3107567616,3107568639,DE -3107568640,3107569663,GB -3107569664,3107571711,ES -3107571712,3107572735,IR -3107572736,3107573759,ES -3107573760,3107574783,IT -3107574784,3107575807,JE -3107575808,3107576831,DE -3107576832,3107577855,FR -3107577856,3107578879,SI -3107578880,3107579391,CZ -3107579392,3107579903,RU -3107579904,3107580927,IT -3107580928,3107581951,RU -3107581952,3107582975,DE -3107582976,3107583999,TR -3107584000,3107585023,RU -3107585024,3107586047,NO -3107586048,3107587071,DE -3107587072,3107588095,IT -3107588096,3107589119,FR -3107589120,3107590143,IQ -3107590144,3107591167,IE -3107591168,3107592191,BG -3107592192,3107593215,GB -3107593216,3107594239,DE -3107594240,3107595263,FI -3107595264,3107596287,DE -3107596288,3107597311,CZ -3107597312,3107598335,IT -3107598336,3107599359,PL -3107599360,3107600383,AT -3107600384,3107601407,NL -3107601408,3107602431,DK -3107602432,3107603455,LT -3107603456,3107604479,NO -3107604480,3107605503,HR -3107605504,3107606527,SE -3107606528,3107607551,PT -3107607552,3107609599,GB -3107609600,3107610623,BA -3107610624,3107611647,BE -3107611648,3107612671,SK -3107612672,3107613695,IT -3107613696,3107614719,DE -3107614720,3107615743,RU -3107615744,3107617791,IT -3107617792,3107618815,RU -3107618816,3107619839,CH -3107619840,3107620863,IT -3107620864,3107621887,NO -3107621888,3107622911,JP -3107622912,3107623935,SE -3107623936,3107624959,NL -3107624960,3107625983,RU -3107625984,3107627007,DE -3107627008,3107628031,PL -3107628032,3107629055,GB -3107629056,3107630079,DE -3107630080,3107631103,ES -3107631104,3107632127,GB -3107632128,3107633151,SI -3107633152,3107634175,FR -3107634176,3107635199,RU -3107635200,3107636223,IT -3107636224,3107637247,ES -3107637248,3107638271,LB -3107638272,3107639295,RU -3107639296,3107640319,ES -3107640320,3107641343,DK -3107641344,3107643391,RU -3107643392,3107644415,GB -3107644416,3107645439,FR -3107645440,3107646463,IE -3107646464,3107647487,NL -3107647488,3107648511,IR -3107648512,3107649535,TR -3107649536,3107651583,RU -3107651584,3107652607,CZ -3107652608,3107653631,PL -3107653632,3107654655,FR -3107654656,3107655679,DE -3107655680,3107656703,BE -3107656704,3107657727,IT -3107657728,3107658751,SI -3107658752,3107659775,TR -3107659776,3107660799,EE -3107660800,3107661823,NL -3107661824,3107662847,FR -3107662848,3107663871,TR -3107663872,3107664895,ES -3107664896,3107665919,CH -3107665920,3107666943,RU -3107666944,3107667967,GB -3107667968,3107668991,ES -3107668992,3107670015,AM -3107670016,3107671039,TR -3107671040,3107672063,NL -3107672064,3107673087,IT -3107673088,3107674111,AE -3107674112,3107675135,PL -3107675136,3107676159,GB -3107676160,3107677183,IT -3107677184,3107678207,DE -3107678208,3107679231,DK -3107679232,3107680255,PL -3107680256,3107681279,IR -3107681280,3107682303,FI -3107682304,3107683327,CZ -3107683328,3107684351,GB -3107684352,3107685375,DE -3107685376,3107686399,IT -3107686400,3107688447,RU -3107688448,3107689471,CZ -3107689472,3107690495,GB -3107690496,3107691519,IT -3107691520,3107692543,UA -3107692544,3107693567,PL -3107693568,3107694591,IT -3107694592,3107695615,BE -3107695616,3107696639,RU -3107696640,3107698687,GB -3107698688,3107699711,SK -3107699712,3107700735,SA -3107700736,3107701759,RU -3107701760,3107702783,BE -3107702784,3107703807,DE -3107703808,3107704831,GB -3107704832,3107705855,CZ -3107705856,3107706879,NO -3107706880,3107707903,RU -3107707904,3107708159,DE -3107708160,3107708415,GB -3107708416,3107708671,NL -3107708672,3107708927,US -3107708928,3107709951,PL -3107709952,3107710975,DK -3107710976,3107711999,RU -3107712000,3107713023,NO -3107713024,3107714047,RO -3107714048,3107715071,RU -3107715072,3107716095,DE -3107716096,3107717119,LV -3107717120,3107718143,DE -3107718144,3107719167,GB -3107719168,3107720191,FR -3107720192,3107721215,RU -3107721216,3107723263,DE -3107723264,3107724287,FR -3107724288,3107725311,GB -3107725312,3107726335,IR -3107726336,3107727359,DE -3107727360,3107728383,ES -3107728384,3107730431,RU -3107730432,3107731455,CH -3107731456,3107732479,DE -3107732480,3107733503,NL -3107733504,3107734527,BG -3107734528,3107735551,HU -3107735552,3107737599,DE -3107737600,3107738623,NL -3107738624,3107738879,DE -3107738880,3107739135,DK -3107739136,3107739391,RO -3107739392,3107739647,PL -3107739648,3107740671,IM -3107740672,3107741695,FR -3107741696,3107742719,DE -3107742720,3107743743,HU -3107743744,3107744767,CZ -3107744768,3107746815,FR -3107746816,3107747839,SI -3107747840,3107748863,GB -3107748864,3107749887,IE -3107749888,3107750911,SE -3107750912,3107751935,RU -3107751936,3107752959,IR -3107752960,3107753983,IT -3107753984,3107755007,CH -3107755008,3107756031,FR -3107756032,3107757055,RU -3107757056,3107758079,NL -3107758080,3107759103,NO -3107759104,3107760127,FR -3107760128,3107761151,IL -3107761152,3107762175,NO -3107762176,3107763199,FR -3107763200,3107764223,CH -3107764224,3107765247,PL -3107765248,3107767295,IT -3107767296,3107768319,DE -3107768320,3107768575,US -3107768576,3107769343,RO -3107769344,3107770367,DK -3107770368,3107771391,DE -3107771392,3107772415,RU -3107772416,3107773439,IE -3107773440,3107774463,GB -3107774464,3107775487,TR -3107775488,3107776511,PL -3107776512,3107777535,FR -3107777536,3107778559,CY -3107778560,3107779583,IT -3107779584,3107780607,PL -3107780608,3107781631,DE -3107781632,3107782655,NL -3107782656,3107783679,IE -3107783680,3107784703,PL -3107784704,3107785727,DE -3107785728,3107786751,IT -3107786752,3107787775,SK -3107787776,3107788799,PS -3107788800,3107789823,RU -3107789824,3107791871,DE -3107791872,3107792895,RU -3107792896,3107793919,DE -3107793920,3107794943,TR -3107794944,3107795967,LB -3107795968,3107796991,NL -3107796992,3107798015,RS -3107798016,3107799039,IE -3107799040,3107800063,LT -3107800064,3107801087,NL -3107801088,3107802111,BE -3107802112,3107803135,RU -3107803136,3107804159,ES -3107804160,3107805183,CZ -3107805184,3107806207,GB -3107806208,3107807231,RU -3107807232,3107808255,GB -3107808256,3107809279,DE -3107809280,3107810303,BY -3107810304,3107811327,SE -3107811328,3107812351,GB -3107812352,3107813375,FR -3107813376,3107814399,DE -3107814400,3107815423,ES -3107815424,3107816447,RU -3107816448,3107817471,GB -3107817472,3107818495,NL -3107818496,3107819519,GB -3107819520,3107820543,FR -3107820544,3107821311,LV -3107821312,3107821567,SE -3107821568,3107822591,GB -3107822592,3107823615,UA -3107823616,3107824639,FR -3107824640,3107825663,GB -3107825664,3107826687,IT -3107826688,3107827711,RU -3107827712,3107828735,FR -3107828736,3107829759,IT -3107829760,3107831807,FR -3107831808,3107832831,RU -3107832832,3107833855,NL -3107833856,3107834879,PS -3107834880,3107835903,ES -3107835904,3107837951,GB -3107837952,3107839999,RU -3107840000,3107841023,NL -3107841024,3107842047,CZ -3107842048,3107843071,FI -3107843072,3107844095,SE -3107844096,3107845119,CY -3107845120,3107846143,RU -3107847168,3107848191,RU -3107848192,3107849215,IT -3107849216,3107850239,BE -3107850240,3107851263,CZ -3107851264,3107853311,NL -3107853312,3107854335,ES -3107854336,3107855359,DE -3107855360,3107856383,IT -3107856384,3107857407,SM -3107857408,3107858431,NL -3107858432,3107859455,FR -3107859456,3107860479,GB -3107860480,3107862527,IT -3107862528,3107863551,NL -3107863552,3107864575,IS -3107864576,3107865599,DE -3107865600,3107866623,NL -3107866624,3107867647,HR -3107867648,3107868671,GB -3107868672,3107869695,CH -3107869696,3107870719,GB -3107870720,3107871743,DE -3107871744,3107872767,PL -3107872768,3107873791,LV -3107873792,3107874815,RU -3107874816,3107875839,CH -3107875840,3107876863,CZ -3107876864,3107877887,RS -3107877888,3107878911,GB -3107878912,3107879935,IL -3107879936,3107880959,DE -3107880960,3107881983,HU -3107881984,3107883007,RS -3107883008,3107884031,US -3107884032,3107885055,NO -3107885056,3107887103,DE -3107887104,3107888127,BG -3107888128,3107889151,GB -3107889152,3107890175,NO -3107890176,3107891199,IE -3107891200,3107892223,CH -3107892224,3107893247,AL -3107893248,3107894271,SA -3107894272,3107895295,PL -3107895296,3107896319,FR -3107896320,3107897343,NL -3107897344,3107898367,RU -3107898368,3107899391,LV -3107899392,3107899903,RU -3107899904,3107900159,KZ -3107900160,3107900415,RU -3107900416,3107900927,DE -3107900928,3107901439,SE -3107901440,3107902463,NL -3107902464,3107904511,GB -3107904512,3107907583,FR -3107907584,3107908607,IR -3107908608,3107909631,US -3107909632,3107910655,IT -3107910656,3107911679,DE -3107911680,3107912703,IT -3107912704,3107913727,SE -3107913728,3107914751,AT -3107914752,3107915775,RO -3107915776,3107916799,DE -3107916800,3107917823,IT -3107917824,3107918847,HU -3107918848,3107919871,NL -3107919872,3107920895,CZ -3107920896,3107921919,ES -3107921920,3107922943,UA -3107922944,3107923967,CH -3107923968,3107924991,IT -3107924992,3107926015,HU -3107926016,3107927039,FR -3107927040,3107928063,IT -3107928064,3107929087,NL -3107929088,3107930111,RU -3107930112,3107931135,CH -3107931136,3107932159,NL -3107932160,3107932415,SE -3107932416,3107934207,MT -3107934208,3107935231,GB -3107935232,3107936255,PL -3107936256,3107937279,IT -3107937280,3107938303,FR -3107938304,3107939327,CZ -3107939328,3107940351,IT -3107940352,3107941375,CZ -3107941376,3107942399,PL -3107942400,3107943423,RU -3107943424,3107944447,NL -3107944448,3107945471,FR -3107945472,3107947519,DE -3107947520,3107948543,IT -3107948544,3107949567,RO -3107949568,3107950591,GB -3107950592,3107951615,IE -3107951616,3107952639,CH -3107952640,3107953663,NL -3107953664,3107954687,SK -3107954688,3107955711,IT -3107955712,3107956735,NL -3107956736,3107957759,IT -3107957760,3107958783,FR -3107958784,3107959807,AL -3107959808,3107960831,PT -3107960832,3107961855,IM -3107961856,3107962879,RU -3107962880,3107963903,FR -3107963904,3107964927,RU -3107964928,3107965951,PL -3107965952,3107966975,DE -3107966976,3107967999,NO -3107968000,3107969023,DE -3107969024,3107970047,RU -3107970048,3107971071,GB -3107971072,3107972095,UZ -3107972096,3107973119,IT -3107973120,3107974143,SA -3107974144,3107975167,IR -3107976192,3107977215,NL -3107977216,3107978239,AT -3107978240,3107979263,NL -3107979264,3107980287,ME -3107980288,3107981311,BE -3107981312,3107981823,IL -3107981824,3107982335,US -3107982336,3107983359,GB -3107983360,3107984383,IE -3107984384,3107985407,BG -3107985408,3107986431,OM -3107986432,3107987455,PL -3107987456,3107988479,NL -3107988480,3107989503,GB -3107989504,3107990527,CZ -3107990528,3107991551,RU -3107991552,3107992575,AT -3107992576,3107993599,RU -3107993600,3107994623,MT -3107994624,3107995647,AT -3107995648,3107996671,BE -3107996672,3107997695,IT -3107997696,3107998719,SE -3107998720,3107999743,AE -3107999744,3108000767,TR -3108000768,3108001791,MK -3108001792,3108002815,GB -3108002816,3108003839,RO -3108003840,3108004863,DE -3108004864,3108005375,US -3108005376,3108005631,CA -3108005632,3108005887,US -3108005888,3108006911,LT -3108006912,3108007935,NL -3108007936,3108008959,DE -3108008960,3108009983,CH -3108009984,3108011007,NL -3108011008,3108012031,DE -3108012032,3108013055,FR -3108013056,3108014079,HR -3108014080,3108015103,NL -3108015104,3108015359,GB -3108015360,3108015615,NL -3108015616,3108015871,HK -3108015872,3108016127,JP -3108016128,3108017151,DE -3108017152,3108018175,FR -3108018176,3108019199,AT -3108019200,3108020223,DE -3108020224,3108021247,US -3108021248,3108022271,AT -3108022272,3108023295,DE -3108023296,3108024319,RS -3108024320,3108025343,IR -3108025344,3108026367,BE -3108026368,3108027391,CH -3108027392,3108028415,GB -3108028416,3108029439,NL -3108029440,3108030463,CH -3108030464,3108031487,KW -3108031488,3108032511,IT -3108032512,3108033535,RU -3108033536,3108034559,GB -3108034560,3108036607,CZ -3108036608,3108037631,GB -3108037632,3108038655,RU -3108038656,3108039679,ES -3108039680,3108040703,MD -3108040704,3108041727,ES -3108041728,3108044799,GB -3108044800,3108045823,LU -3108045824,3108046847,DE -3108046848,3108047871,HU -3108047872,3108050943,RU -3108050944,3108051967,GB -3108051968,3108052991,FR -3108052992,3108054015,GB -3108054016,3108055039,LV -3108055040,3108056063,GB -3108056064,3108057087,IT -3108057088,3108058111,LT -3108058112,3108059135,NL -3108059136,3108060159,FR -3108060160,3108061183,CH -3108061184,3108062207,ES -3108062208,3108063231,TR -3108063232,3108064255,BE -3108064256,3108065279,CZ -3108065280,3108066303,FR -3108066304,3108067327,GB -3108067328,3108068351,DE -3108068352,3108069375,CZ -3108069376,3108070399,FR -3108070400,3108071423,GB -3108072448,3108073471,GB -3108073472,3108074495,FR -3108074496,3108075519,DK -3108075520,3108076543,BA -3108076544,3108077567,NL -3108077568,3108078591,GB -3108078592,3108079103,SE -3108079104,3108079359,NL -3108079360,3108079615,SE -3108079616,3108080639,RU -3108080640,3108081663,SE -3108081664,3108082687,GB -3108082688,3108083711,RU -3108083712,3108084735,NO -3108084736,3108085759,ES -3108085760,3108086783,LV -3108086784,3108087807,GB -3108087808,3108088831,CH -3108088832,3108089599,NL -3108089600,3108089615,AE -3108089616,3108089855,NL -3108089856,3108090879,SE -3108090880,3108091903,BE -3108091904,3108092927,ES -3108092928,3108093951,SE -3108093952,3108095999,DE -3108096000,3108096511,LT -3108096512,3108097023,RU -3108097024,3108098047,TR -3108098048,3108099071,DE -3108099072,3108100095,NL -3108100096,3108101119,IT -3108101120,3108102143,SK -3108102144,3108103167,FR -3108103168,3108104191,BA -3108104192,3108105215,AT -3108105216,3108106239,GB -3108106240,3108107263,DE -3108107264,3108108287,UA -3108108288,3108109311,FR -3108109312,3108110335,IQ -3108110336,3108111359,DK -3108111360,3108112383,GB -3108112384,3108113407,US -3108113408,3108114431,RU -3108114432,3108115455,AE -3108115456,3108116479,GB -3108116480,3108117503,IT -3108117504,3108118527,RU -3108118528,3108119551,GB -3108119552,3108120575,CZ -3108120576,3108122623,ES -3108122624,3108123647,AT -3108123648,3108123903,HU -3108123904,3108124159,SK -3108124160,3108124671,HU -3108124672,3108126719,ES -3108126720,3108127743,DE -3108127744,3108128767,BY -3108128768,3108129791,ES -3108129792,3108130815,DE -3108130816,3108131839,NL -3108131840,3108132863,RU -3108133888,3108134911,NL -3108134912,3108135935,LU -3108135936,3108136959,FR -3108136960,3108137215,NL -3108137216,3108137471,LU -3108137472,3108137983,NL -3108137984,3108139007,RO -3108139008,3108141055,GB -3108141056,3108142079,PL -3108142080,3108143103,TR -3108143104,3108144127,AL -3108144128,3108145151,DE -3108145152,3108146175,RO -3108146176,3108147199,NL -3108147200,3108148223,RU -3108148224,3108149247,SI -3108149248,3108150271,FR -3108150272,3108151295,CH -3108151296,3108152319,CY -3108152320,3108152575,GB -3108152576,3108152831,DE -3108152832,3108153343,GB -3108153344,3108154367,NL -3108154368,3108155391,ES -3108155392,3108156415,DE -3108156416,3108157439,GB -3108157440,3108158463,DK -3108158464,3108159487,CZ -3108159488,3108161535,DE -3108161536,3108162559,SK -3108162560,3108164607,GB -3108164608,3108165631,PL -3108165632,3108166655,RU -3108166656,3108167679,DE -3108167680,3108169727,IR -3108169728,3108170751,FR -3108170752,3108171775,DE -3108172800,3108173823,DE -3108173824,3108174847,NL -3108174848,3108175871,KG -3108175872,3108176127,NL -3108176128,3108176895,UA -3108176896,3108177919,NL -3108177920,3108178943,PL -3108178944,3108179967,IR -3108179968,3108180991,NO -3108180992,3108182015,IE -3108182016,3108183039,DE -3108183040,3108184063,ES -3108184064,3108185087,TR -3108185088,3108186111,DE -3108186112,3108187135,NO -3108187136,3108188159,NL -3108188160,3108189183,GB -3108189184,3108190207,RU -3108190208,3108191231,SE -3108191232,3108193279,NL -3108193280,3108194303,PL -3108194304,3108195327,FR -3108195328,3108196351,ES -3108196352,3108197375,FI -3108197376,3108198399,IS -3108198400,3108199423,FR -3108199424,3108200447,RU -3108200448,3108201471,ES -3108201472,3108202495,IR -3108202496,3108203519,ES -3108203520,3108204543,AT -3108204544,3108205567,ES -3108205568,3108206591,NO -3108206592,3108208639,TR -3108208640,3108209663,DK -3108209664,3108210687,CZ -3108210688,3108211711,CN -3108211712,3108212735,GB -3108212736,3108216831,FR -3108216832,3108217855,RU -3108217856,3108218111,GB -3108218112,3108218623,US -3108218624,3108218879,GB -3108218880,3108219903,RU -3108219904,3108220927,AT -3108220928,3108221951,AL -3108221952,3108222975,IS -3108222976,3108223999,GB -3108224000,3108225023,CZ -3108225024,3108227071,CH -3108227072,3108228095,NL -3108228096,3108229119,TR -3108229120,3108230143,ES -3108230144,3108231167,IR -3108231168,3108232191,PL -3108232192,3108233215,DE -3108233216,3108234239,NL -3108234240,3108235263,AT -3108235264,3108236287,GB -3108236288,3108237311,IT -3108237312,3108238335,LT -3108238336,3108239359,RU -3108239360,3108240383,GB -3108240384,3108240639,UA -3108240640,3108240895,RU -3108240896,3108241407,KG -3108241408,3108242431,GB -3108242432,3108243455,AT -3108243456,3108244479,GE -3108244480,3108245503,PL -3108245504,3108246527,UA -3108246528,3108247551,RU -3108247552,3108248575,PL -3108248576,3108249599,CZ -3108249600,3108250623,CH -3108250624,3108251647,LT -3108251648,3108252671,DE -3108252672,3108253695,LU -3108253696,3108254719,ME -3108254720,3108255743,CH -3108255744,3108256767,FI -3108256768,3108257791,RS -3108257792,3108258815,CH -3108258816,3108259839,CZ -3108259840,3108260863,HU -3108260864,3108261887,DE -3108262912,3108263935,GB -3108263936,3108264959,NL -3108264960,3108265983,RU -3108265984,3108267007,NL -3108267008,3108268031,RU -3108268032,3108269055,GB -3108269056,3108270079,ES -3108270080,3108271103,GB -3108271104,3108272127,RU -3108272128,3108273151,RO -3108273152,3108274175,DE -3108274176,3108275199,CY -3108275200,3108276223,HR -3108276224,3108277247,DE -3108277248,3108278271,GB -3108278272,3108279295,RU -3108279296,3108280319,FR -3108280320,3108281343,RU -3108281344,3108281855,US -3108281856,3108281919,IT -3108281920,3108281983,NO -3108281984,3108282047,SE -3108282048,3108282111,BR -3108282112,3108282367,US -3108282368,3108283391,NL -3108283392,3108284415,CZ -3108284416,3108285439,NO -3108285440,3108286463,NL -3108286464,3108287487,IT -3108287488,3108288511,NL -3108288512,3108289535,RU -3108289536,3108290559,RO -3108290560,3108291583,IT -3108291584,3108292607,NL -3108292608,3108293631,GB -3108293632,3108294655,CH -3108294656,3108295679,EE -3108295680,3108297727,CZ -3108297728,3108298751,TR -3108298752,3108300799,FR -3108300800,3108301823,GB -3108301824,3108302847,CH -3108302848,3108303871,NL -3108303872,3108304895,RU -3108304896,3108305919,GB -3108305920,3108306943,DE -3108306944,3108307967,PL -3108307968,3108308991,IQ -3108308992,3108310015,ES -3108310016,3108311039,GB -3108312064,3108313087,PL -3108313088,3108314111,LV -3108314112,3108315135,BA -3108315136,3108316159,NL -3108316160,3108317183,FI -3108317184,3108318207,CH -3108318208,3108319231,SE -3108319232,3108320255,SK -3108320256,3108321279,LT -3108321280,3108322303,RO -3108322304,3108323327,NL -3108323328,3108324351,GB -3108324352,3108325375,CZ -3108325376,3108326399,FI -3108326400,3108327423,FR -3108327424,3108328447,RU -3108328448,3108329471,GB -3108329472,3108330495,NL -3108330496,3108331519,CH -3108331520,3108332543,HU -3108332544,3108333567,NL -3108333568,3108334591,SK -3108334592,3108335615,IR -3108335616,3108336639,NL -3108336640,3108337151,GB -3108337152,3108337407,ES -3108337408,3108337663,GB -3108337664,3108338687,IR -3108338688,3108339711,RU -3108340736,3108341759,RU -3108341760,3108342783,CH -3108342784,3108343807,FI -3108343808,3108344831,GB -3108344832,3108345855,SI -3108345856,3108346879,UA -3108346880,3108347903,NL -3108347904,3108348927,AT -3108348928,3108349951,BE -3108349952,3108350207,SE -3108350208,3108350463,US -3108350464,3108350975,SE -3108350976,3108351999,GE -3108352000,3108354047,DE -3108354048,3108355071,TM -3108355072,3108356095,IT -3108356096,3108358143,PL -3108358144,3108359167,DE -3108359168,3108360191,NL -3108360192,3108361215,SA -3108361216,3108362239,IE -3108362240,3108363263,LU -3108363264,3108364287,RU -3108364288,3108365311,LU -3108365312,3108366335,FR -3108366336,3108367359,NL -3108367360,3108368383,AT -3108368384,3108368639,RO -3108368640,3108368895,US -3108368896,3108369151,SG -3108369152,3108369407,RO -3108369408,3108370431,AT -3108370432,3108371455,FR -3108371456,3108372479,ES -3108372480,3108373503,SK -3108373504,3108374527,NL -3108374528,3108375551,GB -3108375552,3108376575,BY -3108376576,3108377599,UA -3108377600,3108378623,DE -3108378624,3108379647,CZ -3108379648,3108380671,IE -3108380672,3108381695,GB -3108381696,3108382719,PL -3108382720,3108383743,CH -3108383744,3108384767,BE -3108384768,3108385791,CH -3108385792,3108386815,GE -3108386816,3108387839,GB -3108387840,3108388863,IR -3108388864,3108389887,NL -3108389888,3108390911,CH -3108390912,3108391935,BE -3108391936,3108392959,GR -3108392960,3108393983,LI -3108393984,3108395007,TR -3108395008,3108396031,GB -3108396032,3108397055,ES -3108397056,3108398079,TR -3108398080,3108399103,PT -3108399104,3108400127,RU -3108400128,3108401151,UA -3108401152,3108402175,NL -3108403200,3108404223,DE -3108404224,3108405247,SE -3108405248,3108406271,UA -3108406272,3108407295,GB -3108407296,3108408319,ES -3108408320,3108409343,TR -3108409344,3108410367,DE -3108410368,3108411391,IT -3108411392,3108412415,ES -3108412416,3108414463,GB -3108414464,3108415487,RU -3108415488,3108416511,GB -3108416512,3108417535,ES -3108417536,3108418559,FR -3108418560,3108419583,PL -3108419584,3108420607,NL -3108420608,3108421631,MD -3108421632,3108422655,GB -3108422656,3108423679,IR -3108423680,3108424703,IT -3108424704,3108425727,DE -3108425728,3108427775,NL -3108427776,3108428799,CZ -3108428800,3108429823,DE -3108429824,3108430847,LB -3108430848,3108433919,NL -3108433920,3108434943,GB -3108434944,3108435967,CH -3108435968,3108436991,IL -3108436992,3108438015,GB -3108438016,3108439039,US -3108439040,3108440063,DE -3108440064,3108441087,IT -3108441088,3108443135,CH -3108443136,3108444159,PL -3108444160,3108445183,GB -3108445184,3108446207,ES -3108446208,3108447231,DE -3108447232,3108448255,GB -3108448256,3108449279,CZ -3108449280,3108450303,IT -3108450304,3108451327,GB -3108451328,3108452351,RU -3108452352,3108453375,LU -3108453376,3108454399,NL -3108454400,3108456447,RU -3108456448,3108457471,GB -3108457472,3108458495,RU -3108458496,3108459519,UA -3108459520,3108460543,DE -3108460544,3108461567,RS -3108461568,3108462591,DE -3108462592,3108463615,RU -3108463616,3108464639,GB -3108464640,3108465663,HU -3108465664,3108466687,GB -3108466688,3108467711,CH -3108467712,3108468735,TR -3108468736,3108470783,DE -3108470784,3108471807,LV -3108471808,3108472831,YE -3108472832,3108473855,GB -3108473856,3108474879,PS -3108474880,3108475903,RU -3108475904,3108476927,FR -3108476928,3108477951,IR -3108477952,3108478975,FR -3108478976,3108479999,IE -3108480000,3108481023,AT -3108481024,3108482047,DE -3108482048,3108483071,SI -3108483072,3108484095,SE -3108484096,3108485119,AL -3108485120,3108486143,GB -3108486144,3108486655,FR -3108486656,3108486911,RU -3108486912,3108487167,FR -3108487168,3108488191,IR -3108488192,3108489215,RU -3108489216,3108490239,ES -3108490240,3108491263,AE -3108491264,3108492287,NO -3108492288,3108493311,RU -3108493312,3108494335,CY -3108494336,3108495359,IT -3108495360,3108496383,NL -3108496384,3108496895,AU -3108496896,3108497151,NZ -3108497152,3108497407,US -3108497408,3108498431,CZ -3108498432,3108499455,HR -3108499456,3108500479,PL -3108500480,3108501503,IT -3108501504,3108502527,DE -3108502528,3108503551,AT -3108503552,3108504575,ES -3108504576,3108505599,FR -3108505600,3108506623,RU -3108506624,3108507647,ES -3108507648,3108508671,HU -3108508672,3108509695,CH -3108509696,3108510719,IR -3108510720,3108511743,SI -3108511744,3108512767,PL -3108512768,3108513791,DK -3108513792,3108514815,IT -3108514816,3108515839,ES -3108515840,3108516863,UA -3108516864,3108517887,ES -3108517888,3108518911,BG -3108518912,3108519935,SI -3108519936,3108520959,CH -3108520960,3108521727,US -3108521728,3108521855,SK -3108521856,3108521919,MK -3108521920,3108521983,BA -3108521984,3108523007,AT -3108523008,3108524031,IT -3108524032,3108525055,FR -3108525056,3108526079,LV -3108526080,3108527103,FR -3108527104,3108528127,GB -3108528128,3108529151,NO -3108529152,3108530175,JO -3108530176,3108531199,SI -3108531200,3108532223,GB -3108532224,3108533247,ES -3108533248,3108534271,FI -3108534272,3108536319,NL -3108536320,3108537343,GB -3108537344,3108538367,NL -3108538368,3108539391,AT -3108539392,3108540415,DK -3108540416,3108541439,RU -3108541440,3108542463,GR -3108542464,3108543487,PT -3108543488,3108544511,US -3108544512,3108546559,NL -3108546560,3108547583,BE -3108547584,3108548607,GB -3108548608,3108549631,RO -3108549632,3108550655,NL -3108550656,3108551679,PL -3108551680,3108552703,RU -3108552704,3108553727,CH -3108553728,3108554751,PL -3108554752,3108555775,DE -3108555776,3108556799,LV -3108556800,3108557823,DK -3108557824,3108558847,ES -3108558848,3108559871,LB -3108559872,3108560895,NO -3108560896,3108562943,RU -3108562944,3108563967,DE -3108563968,3108564991,CH -3108564992,3108566015,RO -3108566016,3108567039,DE -3108567040,3108568063,FR -3108568064,3108569087,IQ -3108569088,3108570111,IR -3108570112,3108571135,SI -3108571136,3108572159,GB -3108572160,3108573183,NO -3108573184,3108574207,RU -3108574208,3108575231,DE -3108575232,3108576255,NO -3108576256,3108578303,NL -3108578304,3108579327,GB -3108579328,3108580351,GR -3108580352,3108581375,GB -3108581376,3108582399,DE -3108582400,3108583423,FR -3108583424,3108584447,BG -3108584448,3108585471,PL -3108585472,3108586495,GB -3108586496,3108587519,EE -3108587520,3108588543,DK -3108588544,3108589567,IR -3108589568,3108590591,DE -3108590592,3108591615,GB -3108591616,3108592639,PL -3108592640,3108593663,NL -3108593664,3108594687,ES -3108594688,3108597759,CZ -3108597760,3108598015,NL -3108598016,3108598271,IR -3108598272,3108598527,GB -3108598528,3108598783,IR -3108598784,3108600831,CH -3108600832,3108601855,NL -3108601856,3108602879,US -3108602880,3108603903,EE -3108603904,3108604927,IT -3108604928,3108605951,GB -3108606976,3108609023,GB -3108609024,3108610047,LI -3108610048,3108611071,CZ -3108611072,3108612095,IT -3108612096,3108615167,ES -3108615168,3108616191,RU -3108616192,3108617215,GB -3108617216,3108618239,ES -3108618240,3108619263,RU -3108619264,3108620287,DK -3108620288,3108621311,TR -3108621312,3108622335,FR -3108622336,3108623359,PL -3108623360,3108625407,RU -3108625408,3108626431,NL -3108626432,3108627455,CZ -3108627456,3108628479,PL -3108628480,3108629503,FR -3108629504,3108630527,BG -3108630528,3108631551,CH -3108631552,3108633599,IT -3108633600,3108634623,FR -3108634624,3108635647,AT -3108635648,3108636671,UZ -3108636672,3108637695,FR -3108637696,3108638719,DE -3108638720,3108639743,ES -3108639744,3108640767,TR -3108640768,3108641791,GB -3108641792,3108642815,CH -3108642816,3108643839,FR -3108643840,3108644863,IT -3108644864,3108645887,FR -3108645888,3108646911,US -3108646912,3108647935,DK -3108647936,3108648959,FR -3108648960,3108649983,IM -3108649984,3108651007,CZ -3108651008,3108652031,DE -3108652032,3108653055,CH -3108653056,3108654079,GI -3108654080,3108654335,DE -3108654336,3108654591,NL -3108654592,3108654847,GB -3108654848,3108655103,DK -3108655104,3108656127,ES -3108656128,3108657151,PL -3108657152,3108658175,RS -3108658176,3108659199,GE -3108659200,3108660223,FR -3108660224,3108661247,UZ -3108661248,3108662271,RU -3108662272,3108676607,CH -3108676608,3108677631,IR -3108677632,3108678655,GB -3108678656,3108679679,FI -3108679680,3108680703,GB -3108680704,3108681727,DE -3108681728,3108682751,SE -3108682752,3108683775,IT -3108683776,3108684799,ES -3108684800,3108685823,SK -3108685824,3108686847,FR -3108686848,3108687871,CZ -3108687872,3108688895,FO -3108688896,3108689919,CH -3108689920,3108690943,DE -3108690944,3108691967,RU -3108691968,3108692991,DE -3108692992,3108694015,RU -3108694016,3108696063,GB -3108696064,3108697087,ES -3108697088,3108698111,DE -3108698112,3108699135,IT -3108699136,3108700159,DE -3108700160,3108701183,PL -3108701184,3108702207,RU -3108702208,3108703231,AT -3108703232,3108704255,ES -3108704256,3108705279,SA -3108705280,3108706303,ES -3108706304,3108707327,DE -3108707328,3108708351,GB -3108708352,3108709375,CH -3108709376,3108710399,PL -3108710400,3108711423,SE -3108711424,3108712447,RU -3108712448,3108713471,BG -3108713472,3108714495,RO -3108714496,3108715519,XK -3108715520,3108716543,GB -3108716544,3108717567,RU -3108717568,3108718591,FR -3108718592,3108719615,DE -3108719616,3108720639,NL -3108720640,3108721663,GI -3108721664,3108723711,RU -3108723712,3108724735,GB -3108724736,3108725759,IQ -3108725760,3108726783,DE -3108726784,3108727807,GB -3108727808,3108728831,IT -3108728832,3108729855,NL -3108729856,3108730879,CZ -3108730880,3108731903,GB -3108731904,3108732927,FR -3108732928,3108733951,FI -3108733952,3108734975,RU -3108734976,3108735999,CZ -3108736000,3108737023,FR -3108737024,3108738047,IE -3108738048,3108739071,DE -3108739072,3108740095,CH -3108740096,3108741119,NL -3108741120,3108742143,PL -3108742144,3108743167,DE -3108743168,3108744191,NL -3108744192,3108745215,GB -3108745216,3108746239,ES -3108746240,3108747263,RU -3108747264,3108748287,DE -3108748288,3108749055,RU -3108749056,3108749311,KZ -3108749312,3108750335,HU -3108750336,3108751359,IR -3108751360,3108752383,RU -3108752384,3108753407,IR -3108753408,3108754431,NL -3108754432,3108755455,GB -3108755456,3108756479,AT -3108756480,3108757503,NL -3108758528,3108759551,DE -3108759552,3108760575,CZ -3108760576,3108761599,LV -3108761600,3108762111,AT -3108762112,3108762623,GB -3108762624,3108763647,NL -3108763648,3108764671,RU -3108764672,3108765695,NL -3108765696,3108766719,FR -3108766720,3108767743,PT -3108767744,3108767999,SK -3108768000,3108768255,SE -3108768256,3108768511,NL -3108768512,3108768767,CZ -3108769792,3108770815,NL -3108770816,3108772863,FR -3108772864,3108773887,RO -3108773888,3108774911,IQ -3108774912,3108775935,GB -3108775936,3108776959,DE -3108776960,3108779007,GB -3108779008,3108780031,RO -3108780032,3108781055,IT -3108781056,3108782079,RO -3108782080,3108783103,SE -3108783104,3108784127,UA -3108784128,3108785151,NL -3108785152,3108786175,ES -3108786176,3108787199,UA -3108787200,3108788223,NO -3108788224,3108789247,NL -3108789248,3108790271,GB -3108790272,3108791295,DE -3108791296,3108792319,IT -3108792320,3108793343,PL -3108793344,3108794367,RU -3108794368,3108795391,FR -3108795392,3108796415,DE -3108796416,3108797439,FR -3108797440,3108798463,NL -3108798464,3108799487,AE -3108799488,3108800511,NL -3108800512,3108801535,SA -3108801536,3108802559,TR -3108802560,3108803583,RU -3108803584,3108804607,GB -3108804608,3108805631,TR -3108805632,3108808703,DE -3108808704,3108809727,NL -3108809728,3108810751,DE -3108810752,3108811775,LB -3108811776,3108812799,CH -3108812800,3108813823,GB -3108813824,3108814847,DE -3108814848,3108815871,FR -3108815872,3108817919,TR -3108817920,3108818943,AE -3108818944,3108819967,GB -3108819968,3108822015,ES -3108822016,3108823039,RU -3108823040,3108825087,IE -3108825088,3108826111,RU -3108826112,3108827135,NL -3108827136,3108828159,RU -3108828160,3108829183,MT -3108829184,3108830207,IR -3108830208,3108831231,RU -3108831232,3108832255,TR -3108832256,3108833279,GB -3108833280,3108834303,RU -3108834304,3108835327,BE -3108835328,3108836351,RU -3108836352,3108837375,GB -3108837376,3108838399,NL -3108838400,3108839423,GE -3108839424,3108840447,IT -3108840448,3108841471,GR -3108841472,3108842495,TR -3108842496,3108843519,LI -3108843520,3108844543,IT -3108844544,3108845567,LI -3108845568,3108846591,GB -3108846592,3108847615,BE -3108847616,3108848639,GB -3108848640,3108849663,CH -3108849664,3108850687,GB -3108850688,3108851711,PL -3108851712,3108852039,GB -3108852040,3108852047,IT -3108852048,3108852735,GB -3108852736,3108853759,IT -3108853760,3108854783,TR -3108854784,3108855807,CH -3108855808,3108856831,LT -3108856832,3108857855,UA -3108857856,3108858879,DE -3108858880,3108859903,AT -3108859904,3108860927,FR -3108860928,3108861951,NO -3108861952,3108862975,NL -3108862976,3108863999,BG -3108864000,3108865023,NL -3108865024,3108866047,ES -3108866048,3108867071,RU -3108867072,3108868095,GB -3108868096,3108869119,SK -3108869120,3108870143,RU -3108870144,3108871167,GB -3108871168,3108872191,ES -3108872192,3108873215,IT -3108873216,3108873343,SG -3108873344,3108873471,MY -3108873472,3108873599,SG -3108873600,3108873727,MY -3108873728,3108873855,SG -3108873856,3108873983,ID -3108873984,3108874111,SG -3108874112,3108874239,ID -3108874240,3108875263,ES -3108875264,3108875439,GB -3108875440,3108875447,IT -3108875448,3108876287,GB -3108876288,3108877311,ES -3108877312,3108878335,FR -3108878336,3108879359,ES -3108879360,3108880383,NL -3108880384,3108881407,AM -3108881408,3108882431,BE -3108882432,3108883455,GB -3108883456,3108884479,RU -3108884480,3108885503,NL -3108885504,3108886527,BE -3108886528,3108888575,RU -3108888576,3108889599,VA -3108889600,3108893695,RU -3108893696,3108894719,FI -3108894720,3108894975,IL -3108894976,3108895743,US -3108895744,3108896767,AT -3108896768,3108897791,ES -3108897792,3108899839,GB -3108899840,3108900863,CZ -3108900864,3108901887,IT -3108901888,3108902911,IR -3108902912,3108903935,ES -3108903936,3108905983,RU -3108905984,3108907007,BG -3108907008,3108907263,DE -3108907264,3108907279,NL -3108907280,3108907295,BE -3108907296,3108907311,GB -3108907312,3108907327,DK -3108907328,3108907343,ES -3108907344,3108907359,IT -3108907360,3108907375,FR -3108907376,3108907391,AT -3108907392,3108907407,CH -3108907408,3108907423,US -3108907424,3108908031,DE -3108908032,3108909055,EE -3108909056,3108910079,IT -3108910080,3108911103,GB -3108911104,3108912127,CZ -3108912128,3108913151,DE -3108913152,3108914175,IT -3108914176,3108915199,NO -3108915200,3108916223,PL -3108916224,3108917247,RU -3108917248,3108918271,FR -3108918272,3108919295,TR -3108919296,3108920319,GB -3108920320,3108921343,RU -3108921344,3108922367,NL -3108922368,3108923391,CZ -3108923392,3108924415,IR -3108924416,3108927487,RU -3108927488,3108929535,CH -3108929536,3108930559,CY -3108930560,3108931583,PL -3108931584,3108932607,UZ -3108932608,3108933631,FR -3108933632,3108934655,AM -3108934656,3108935679,PL -3108935680,3108936703,SK -3108936704,3108937727,FR -3108937728,3108938751,NL -3108938752,3108940799,GB -3108941824,3108942847,DE -3108942848,3108943871,BE -3108943872,3108944895,DE -3108944896,3108945919,CH -3108945920,3108946943,GB -3108946944,3108946944,IT -3108946945,3108947199,NL -3108947200,3108947200,IT -3108947201,3108947455,NL -3108947456,3108947456,IT -3108947457,3108947711,NL -3108947712,3108947712,IT -3108947713,3108947967,NL -3108947968,3108948991,RU -3108948992,3108950015,GB -3108950016,3108951039,NO -3108951040,3108952063,ES -3108952064,3108953087,GB -3108953088,3108954111,GR -3108954112,3108955135,AL -3108955136,3108956159,NO -3108956160,3108956671,UA -3108956672,3108957183,TJ -3108957184,3108958207,RU -3108958208,3108959231,SI -3108959232,3108960255,AE -3108960256,3108961279,NL -3108961280,3108962303,DE -3108962304,3108963327,AM -3108963328,3108964351,ES -3108964352,3108965375,NL -3108965376,3108966399,TR -3108966400,3108967423,BY -3108967424,3108968447,ES -3108968448,3108969471,DE -3108969472,3108970495,ES -3108970496,3108971519,PL -3108971520,3108972543,ES -3108972544,3108973567,NL -3108973568,3108974591,DE -3108974592,3108975615,RU -3108975616,3108976639,IT -3108976640,3108977663,GB -3108977664,3108978687,IR -3108978688,3108979711,DE -3108979712,3108980735,RU -3108980736,3108981759,DE -3108981760,3108982783,RU -3108982784,3108983807,NL -3108983808,3108984063,AE -3108984064,3108984831,NO -3108984832,3108985855,CH -3108985856,3108986879,HU -3108986880,3108987903,IR -3108987904,3108988927,RU -3108989952,3108991999,GB -3108992000,3108993023,RU -3108993024,3108994047,BG -3108994048,3108995071,DE -3108995072,3108996095,ES -3108996096,3108998143,RU -3108998144,3108999167,GB -3108999168,3109000191,ES -3109000192,3109001215,FR -3109001216,3109002239,NL -3109002240,3109003263,IR -3109003264,3109004287,NL -3109004288,3109005311,SE -3109005312,3109006335,DE -3109006336,3109007359,ES -3109007360,3109008383,GB -3109008384,3109009407,CH -3109009408,3109010431,GB -3109010432,3109011455,GR -3109011456,3109012479,FR -3109012480,3109013503,DE -3109013504,3109015551,CH -3109015552,3109016575,DE -3109016576,3109017599,KZ -3109017600,3109018623,DE -3109018624,3109019647,FR -3109019648,3109020671,PT -3109020672,3109021695,BA -3109021696,3109022719,CH -3109022720,3109023743,RU -3109023744,3109024767,PL -3109024768,3109025791,LT -3109025792,3109026493,IT -3109026494,3109026526,SA -3109026527,3109026815,IT -3109026816,3109027839,CH -3109027840,3109028863,BG -3109028864,3109029887,ES -3109029888,3109030911,NL -3109030912,3109031935,GB -3109031936,3109032959,FR -3109032960,3109033983,TR -3109033984,3109035007,JO -3109035008,3109036031,RU -3109036032,3109037055,PL -3109037056,3109038079,NL -3109038080,3109039103,IQ -3109039104,3109040127,YE -3109040128,3109041151,HU -3109041152,3109042175,NL -3109042176,3109043199,PL -3109043200,3109044223,NO -3109044224,3109045247,CH -3109045248,3109046271,RS -3109046272,3109047295,TR -3109047296,3109048319,PT -3109048320,3109049343,KZ -3109049344,3109050367,GB -3109050368,3109051391,CH -3109051392,3109052415,DE -3109052416,3109053439,ME -3109053440,3109054463,IR -3109054464,3109055487,JO -3109055488,3109056511,IL -3109056512,3109058559,GB -3109058560,3109059583,DE -3109059584,3109060095,LU -3109060096,3109060351,CY -3109060352,3109060607,LU -3109060608,3109061631,LT -3109061632,3109062655,GB -3109062656,3109063679,TR -3109063680,3109064703,YE -3109064704,3109065727,DE -3109065728,3109066751,RU -3109066752,3109067775,UA -3109067776,3109068799,NO -3109068800,3109069823,PL -3109069824,3109070847,MK -3109070848,3109071871,DE -3109071872,3109072895,AZ -3109073920,3109074943,NO -3109074944,3109075967,DE -3109075968,3109076991,AT -3109076992,3109078015,HR -3109078016,3109079039,IR -3109079040,3109080063,US -3109080064,3109081087,RU -3109081088,3109082111,SE -3109082112,3109083135,PL -3109083136,3109084159,SE -3109084160,3109085183,NL -3109085184,3109086207,AL -3109086208,3109087231,RU -3109087232,3109088255,NL -3109088256,3109089279,LV -3109089280,3109090303,AT -3109090304,3109091327,NL -3109091328,3109092351,RU -3109092352,3109093375,SE -3109093376,3109095423,IT -3109095424,3109096447,NL -3109096448,3109097471,NO -3109097472,3109098495,GB -3109098496,3109099519,HU -3109099520,3109100543,RU -3109100544,3109101567,SI -3109101568,3109102591,TR -3109102592,3109103615,DK -3109103616,3109104639,IR -3109104640,3109105663,FR -3109105664,3109106687,LV -3109106688,3109107711,FR -3109107712,3109108735,PL -3109108736,3109109759,RS -3109109760,3109110783,RU -3109110784,3109111807,FI -3109111808,3109112831,IE -3109112832,3109113855,ES -3109113856,3109115903,AZ -3109115904,3109116927,AU -3109116928,3109117951,GE -3109117952,3109118463,IR -3109118464,3109118719,NL -3109118720,3109118975,IR -3109118976,3109119999,DE -3109120000,3109121023,PL -3109121024,3109122047,SE -3109122048,3109122559,GB -3109122560,3109123071,NL -3109123072,3109124095,DK -3109124096,3109126143,ES -3109126144,3109127167,LV -3109127168,3109128191,ES -3109128192,3109128207,NL -3109128208,3109128215,GB -3109128216,3109128223,AT -3109128224,3109128231,DK -3109128232,3109128239,SE -3109128240,3109128319,NL -3109128320,3109128383,GB -3109128384,3109128463,NL -3109128464,3109128471,DK -3109128472,3109128479,SE -3109128480,3109128487,IE -3109128488,3109128495,DK -3109128496,3109128503,SE -3109128504,3109128511,IE -3109128512,3109128719,NL -3109128720,3109128727,GB -3109128728,3109128735,AT -3109128736,3109128743,DK -3109128744,3109128751,SE -3109128752,3109128759,IE -3109128760,3109128760,IT -3109128761,3109128831,NL -3109128832,3109128895,BE -3109128896,3109128975,NL -3109128976,3109128983,DK -3109128984,3109128991,SE -3109128992,3109128999,IT -3109129000,3109129007,DK -3109129008,3109129015,SE -3109129016,3109129023,IE -3109129024,3109129215,NL -3109129216,3109130239,LB -3109130240,3109131263,RU -3109131264,3109132287,DE -3109132288,3109133311,TR -3109133312,3109134335,FR -3109134336,3109135359,GB -3109135360,3109136383,LT -3109136384,3109137407,GB -3109137408,3109138431,RU -3109138432,3109139455,GB -3109139456,3109140479,ES -3109140480,3109141503,RU -3109141504,3109143551,GB -3109143552,3109144575,GR -3109144576,3109145599,FR -3109145600,3109148671,AT -3109148672,3109149695,AZ -3109149696,3109150719,RU -3109150720,3109151743,BE -3109151744,3109152767,HR -3109152768,3109153791,GB -3109153792,3109154815,TR -3109154816,3109155839,AT -3109155840,3109156863,GB -3109156864,3109157887,RU -3109157888,3109158911,GB -3109158912,3109159935,IT -3109159936,3109160959,DE -3109160960,3109161983,GB -3109161984,3109163007,RU -3109163008,3109164031,AT -3109164032,3109165055,DE -3109165056,3109166079,RU -3109166080,3109167103,IR -3109167104,3109168127,LB -3109168128,3109169151,BG -3109169152,3109170175,DE -3109170176,3109171199,IE -3109171200,3109172223,GI -3109172224,3109172991,IL -3109172992,3109173247,US -3109173248,3109174271,ES -3109174272,3109175295,GB -3109175296,3109176319,IR -3109176320,3109177343,IL -3109177344,3109178367,IE -3109178368,3109179391,GB -3109179392,3109180415,ES -3109180416,3109181439,DE -3109181440,3109182463,NL -3109182464,3109183487,LT -3109183488,3109184255,LB -3109184256,3109184511,GB -3109184512,3109185535,CH -3109185536,3109187583,RS -3109187584,3109188607,IT -3109188608,3109189631,SA -3109189632,3109190655,AT -3109190656,3109191679,SE -3109191680,3109192703,CH -3109192704,3109193727,IT -3109193728,3109194751,IR -3109194752,3109195775,NL -3109195776,3109196799,FI -3109196800,3109197823,FR -3109197824,3109198847,NL -3109198848,3109199871,GB -3109199872,3109200895,DE -3109200896,3109201919,IR -3109201920,3109202943,IT -3109202944,3109203967,RO -3109203968,3109204991,RU -3109204992,3109206015,IR -3109206016,3109209087,NL -3109210112,3109211135,NL -3109211136,3109212159,CH -3109212160,3109213183,NL -3109213184,3109214207,CZ -3109214208,3109215231,BG -3109215232,3109216255,TR -3109216256,3109217279,IT -3109217280,3109218303,DK -3109218304,3109219327,HU -3109219328,3109220351,CZ -3109220352,3109221375,IE -3109222400,3109223423,PL -3109223424,3109224447,TR -3109224448,3109225471,RU -3109225472,3109226495,EE -3109226496,3109227519,NL -3109227520,3109228543,GB -3109228544,3109230591,NO -3109230592,3109231615,FR -3109231616,3109232639,IR -3109232640,3109233663,NL -3109233664,3109234687,GE -3109234688,3109235711,GB -3109235712,3109236735,PL -3109236736,3109237759,BE -3109237760,3109238783,GB -3109238784,3109239807,CZ -3109239808,3109240831,CH -3109240832,3109241855,GB -3109241856,3109242879,FR -3109242880,3109245951,IR -3109245952,3109246975,GB -3109246976,3109247999,IR -3109248000,3109249023,SE -3109249024,3109250047,NL -3109250048,3109251071,GB -3109251072,3109252095,ES -3109252096,3109253119,CH -3109253120,3109254143,IR -3109254144,3109255167,FI -3109255168,3109256191,GB -3109256192,3109257215,AZ -3109257216,3109258239,GB -3109258240,3109259263,ES -3109259264,3109260287,BE -3109260288,3109261311,DE -3109261312,3109262335,TR -3109262336,3109263359,GI -3109263360,3109264383,GB -3109264384,3109265407,US -3109265408,3109266431,ES -3109266432,3109267455,NO -3109267456,3109268479,GB -3109268480,3109269503,IT -3109269504,3109270527,GB -3109270528,3109272575,IR -3109272576,3109273599,FR -3109273600,3109274623,NO -3109274624,3109276671,IR -3109276672,3109277695,FI -3109277696,3109278719,IR -3109278720,3109279487,PT -3109279488,3109280767,NL -3109280768,3109281791,IL -3109281792,3109282815,HU -3109282816,3109283839,DE -3109283840,3109284863,IE -3109284864,3109285887,FR -3109285888,3109286911,RU -3109286912,3109287935,TR -3109287936,3109288959,PT -3109288960,3109289983,MK -3109289984,3109291007,NL -3109291008,3109292031,CH -3109292032,3109293055,IE -3109293056,3109294591,GB -3109294592,3109294847,FR -3109294848,3109295103,GB -3109295104,3109296127,DE -3109296128,3109297151,BE -3109297152,3109298175,SE -3109298176,3109299199,RU -3109299200,3109300223,NO -3109300224,3109301247,RU -3109301248,3109302271,ES -3109302272,3109303295,SY -3109303296,3109304319,SE -3109304320,3109305343,DE -3109305344,3109305599,DK -3109305600,3109305855,US -3109305856,3109306111,DK -3109306112,3109306367,LT -3109306368,3109307391,RO -3109307392,3109308415,IQ -3109308416,3109309439,NL -3109309440,3109310463,CH -3109310464,3109311487,DE -3109311488,3109312511,GB -3109312512,3109313535,IT -3109313536,3109314559,GB -3109314560,3109315583,IT -3109315584,3109316607,SI -3109316608,3109317631,LB -3109317632,3109318655,RU -3109318656,3109319679,FR -3109319680,3109320703,ES -3109320704,3109321727,DE -3109321728,3109322751,GR -3109322752,3109323775,ES -3109323776,3109324799,DK -3109324800,3109325823,PL -3109325824,3109326847,NL -3109326848,3109327871,BA -3109327872,3109328895,UA -3109328896,3109329919,CZ -3109329920,3109330943,RU -3109330944,3109331967,IR -3109331968,3109332991,SA -3109332992,3109334015,IT -3109334016,3109335039,RU -3109335040,3109336063,IT -3109336064,3109337087,TR -3109337088,3109339135,RU -3109339136,3109340159,CH -3109340160,3109341183,NL -3109341184,3109342207,GB -3109342208,3109343231,ES -3109343232,3109344255,CH -3109344256,3109345279,SE -3109345280,3109346303,DE -3109346304,3109347327,IR -3109347328,3109348351,LB -3109348352,3109349375,IT -3109349376,3109350399,CZ -3109350400,3109351423,SY -3109351424,3109352447,SE -3109352448,3109353471,RU -3109353472,3109354495,SE -3109354496,3109355519,IE -3109355520,3109356543,DE -3109356544,3109357567,DK -3109357568,3109358079,RU -3109358080,3109358591,GB -3109358592,3109359615,RU -3109359616,3109360639,NL -3109360640,3109362687,IT -3109362688,3109364735,AT -3109364736,3109365759,SK -3109365760,3109366783,GB -3109366784,3109367807,DK -3109367808,3109368831,DE -3109368832,3109369855,FI -3109369856,3109371903,GB -3109371904,3109372927,AT -3109372928,3109373951,IR -3109373952,3109374975,TR -3109374976,3109375999,FR -3109376000,3109377023,NL -3109377024,3109379071,GB -3109379072,3109380095,CZ -3109380096,3109381119,GB -3109381120,3109382143,SE -3109382144,3109383167,TR -3109383168,3109384191,CH -3109384192,3109385215,NL -3109385216,3109386239,GB -3109386240,3109387263,RU -3109387264,3109388287,CH -3109388288,3109389311,NO -3109389312,3109390335,DE -3109390336,3109391359,IR -3109391360,3109392383,NL -3109392384,3109393407,CH -3109393408,3109394431,SI -3109394432,3109395455,AL -3109395456,3109396479,SE -3109396480,3109397503,RU -3109397504,3109398527,CZ -3109398528,3109399551,CH -3109399552,3109400575,BE -3109400576,3109402623,RO -3109402624,3109403647,GB -3109403648,3109404671,TR -3109404672,3109405695,IT -3109405696,3109406719,GB -3109406720,3109407743,RO -3109407744,3109408767,TR -3109408768,3109409791,IR -3109409792,3109410815,IT -3109410816,3109411839,RU -3109411840,3109412863,DE -3109412864,3109413887,FR -3109413888,3109414911,CH -3109414912,3109415935,FR -3109415936,3109416959,TR -3109416960,3109419007,GB -3109419008,3109420031,CH -3109420032,3109421055,IT -3109421056,3109422079,UA -3109422080,3109423103,TR -3109423104,3109424127,ES -3109424128,3109425151,TR -3109425152,3109426175,BE -3109426176,3109426431,GB -3109426432,3109426687,US -3109426688,3109427199,GB -3109427200,3109427711,AT -3109427712,3109428223,GB -3109428224,3109429247,CH -3109429248,3109430271,ES -3109430272,3109431295,IR -3109431296,3109431807,IL -3109431808,3109432319,IT -3109432320,3109432831,MT -3109432832,3109433087,SE -3109433088,3109433343,MT -3109433344,3109435391,FR -3109435392,3109436415,UA -3109436416,3109437439,SM -3109437440,3109438463,RO -3109438464,3109439487,DK -3109439488,3109440511,ES -3109440512,3109441535,UA -3109441536,3109442559,TR -3109442560,3109443583,IT -3109443584,3109444607,FR -3109444608,3109445631,RU -3109445632,3109446655,CZ -3109446656,3109448703,SE -3109448704,3109449727,GB -3109449728,3109453823,RU -3109453824,3109454847,IT -3109454848,3109455871,RU -3109455872,3109456895,FR -3109456896,3109457919,PS -3109457920,3109458943,RU -3109458944,3109459711,SE -3109459712,3109459771,GB -3109459772,3109459772,LV -3109459773,3109459869,GB -3109459870,3109459870,LV -3109459871,3109459967,GB -3109459968,3109460991,TR -3109460992,3109462015,DE -3109462016,3109463039,LB -3109463040,3109464063,TR -3109464064,3109465087,FR -3109465088,3109466111,DE -3109466112,3109467135,FR -3109467136,3109468159,IR -3109468160,3109468415,ES -3109468416,3109468543,GB -3109468544,3109469183,ES -3109469184,3109470207,DE -3109470208,3109471231,AM -3109471232,3109472255,FR -3109472256,3109473279,IT -3109473280,3109474303,IL -3109474304,3109476351,ES -3109477376,3109478399,IS -3109478400,3109480447,CH -3109480448,3109481471,DE -3109481472,3109482495,MK -3109482496,3109483519,RS -3109483520,3109484543,TR -3109484544,3109485567,ES -3109485568,3109486591,FR -3109486592,3109487615,DE -3109487616,3109488639,BE -3109488640,3109489663,JE -3109489664,3109490687,SK -3109490688,3109491711,AT -3109491712,3109492735,DE -3109492736,3109493759,TR -3109493760,3109494783,IT -3109494784,3109495807,GB -3109495808,3109497335,AD -3109497336,3109497336,ES -3109497337,3109498879,AD -3109498880,3109499903,RU -3109499904,3109500927,NO -3109500928,3109502975,GB -3109502976,3109503999,LB -3109504000,3109505023,IT -3109505024,3109506047,DE -3109506048,3109507071,IT -3109507072,3109508095,DK -3109508096,3109509119,ES -3109509120,3109511167,FR -3109511168,3109512191,ES -3109512192,3109513215,FR -3109513216,3109514239,NL -3109514240,3109515263,FI -3109515264,3109516287,CH -3109516288,3109517311,NL -3109517312,3109518335,TR -3109518336,3109519359,BE -3109519360,3109520383,ES -3109520384,3109521407,DE -3109521408,3109522431,PL -3109522432,3109523455,CZ -3109523456,3109524479,PL -3109525504,3109527551,NL -3109527552,3109528575,IL -3109528576,3109529599,SE -3109529600,3109530623,LB -3109530624,3109531647,TR -3109531648,3109532671,DE -3109532672,3109533695,IR -3109533696,3109534719,NL -3109534720,3109535743,ES -3109535744,3109537791,RU -3109537792,3109538815,NL -3109538816,3109539839,LV -3109539840,3109541887,GB -3109541888,3109542911,EE -3109542912,3109543935,GB -3109543936,3109544959,DE -3109544960,3109545983,FR -3109545984,3109547007,PL -3109547008,3109548031,AT -3109548032,3109549055,IT -3109549056,3109550079,FI -3109550080,3109551103,NL -3109551104,3109552127,CY -3109552128,3109553151,ES -3109553152,3109554175,TR -3109554176,3109555199,RU -3109555200,3109556223,CZ -3109556224,3109557247,PT -3109557248,3109558271,GR -3109558272,3109559295,IQ -3109559296,3109560319,RO -3109560320,3109561343,KG -3109561344,3109562367,RU -3109562368,3109563391,NO -3109563392,3109564415,GB -3109564416,3109565439,IR -3109565440,3109566463,ES -3109566464,3109567487,GB -3109567488,3109568511,DE -3109568512,3109569535,NL -3109569536,3109570559,FR -3109570560,3109571583,CZ -3109571584,3109572607,CH -3109572608,3109573631,PS -3109573632,3109574655,IT -3109574656,3109575679,PS -3109575680,3109576703,DE -3109576704,3109578751,RU -3109578752,3109579775,FR -3109579776,3109580799,GB -3109580800,3109581823,SE -3109581824,3109582847,CH -3109582848,3109583871,BE -3109583872,3109584895,RU -3109584896,3109585919,RO -3109585920,3109586943,NL -3109586944,3109587967,SE -3109587968,3109588991,NL -3109588992,3109590015,DE -3109590016,3109591039,NL -3109591040,3109592063,IR -3109592064,3109594111,RU -3109594112,3109595135,NL -3109595136,3109596159,IT -3109596160,3109597183,TR -3109597184,3109598207,IR -3109598208,3109599231,NL -3109599232,3109600255,IT -3109600256,3109601279,NL -3109601280,3109602303,GB -3109602304,3109603327,FR -3109603328,3109604351,ES -3109604352,3109605375,IT -3109605376,3109606399,RU -3109606400,3109607423,DE -3109607424,3109608447,GB -3109608448,3109610495,DE -3109610496,3109611519,FO -3109611520,3109612543,ES -3109612544,3109613567,CH -3109613568,3109614591,IT -3109614592,3109615615,DE -3109615616,3109616639,CZ -3109616640,3109617663,IR -3109617664,3109618687,NO -3109618688,3109619711,NL -3109619712,3109621759,RU -3109621760,3109622783,NL -3109622784,3109623807,US -3109623808,3109624831,DE -3109624832,3109625855,ES -3109625856,3109626879,GB -3109626880,3109627903,DE -3109627904,3109628927,RU -3109628928,3109629951,IT -3109629952,3109630975,LV -3109630976,3109631999,FI -3109632000,3109633023,DE -3109633024,3109634047,ES -3109634048,3109635071,PL -3109635072,3109636095,FR -3109636096,3109637119,IE -3109637120,3109637887,NL -3109637888,3109638143,RU -3109638144,3109639167,NL -3109639168,3109640191,LB -3109640192,3109641215,IQ -3109641216,3109642239,NO -3109643264,3109643391,DE -3109643392,3109643519,UA -3109643520,3109643775,RU -3109643776,3109644031,UA -3109644032,3109644287,ES -3109644288,3109646335,RU -3109646336,3109647359,IR -3109647360,3109648383,CZ -3109648384,3109649407,GB -3109649408,3109650431,BG -3109650432,3109651455,FR -3109651456,3109652479,NL -3109652480,3109653503,MT -3109653504,3109654527,GB -3109654528,3109655551,CH -3109655552,3109656575,AT -3109656576,3109657599,NL -3109657600,3109658623,AL -3109658624,3109659647,AT -3109659648,3109661695,FR -3109661696,3109662719,NL -3109662720,3109663743,PL -3109663744,3109664767,IT -3109664768,3109665791,PL -3109665792,3109666815,CH -3109666816,3109667839,PT -3109667840,3109668863,DE -3109668864,3109669887,CH -3109669888,3109670911,GB -3109670912,3109671935,DE -3109671936,3109672959,HR -3109672960,3109673215,US -3109673216,3109673450,GB -3109673451,3109673451,NO -3109673452,3109673703,GB -3109673704,3109673704,IN -3109673705,3109673727,GB -3109673728,3109673983,AU -3109673984,3109675007,FR -3109675008,3109677055,DE -3109677056,3109678079,BE -3109678080,3109679103,MT -3109679104,3109680127,RO -3109680128,3109681151,MK -3109681152,3109681407,TR -3109681408,3109681663,MX -3109681664,3109681919,BR -3109681920,3109682175,CZ -3109682176,3109683199,CH -3109683200,3109684223,GB -3109684224,3109685247,TR -3109685248,3109686271,IT -3109686272,3109687295,GB -3109687296,3109688319,SA -3109688320,3109689343,AT -3109689344,3109690367,SE -3109690368,3109691391,ES -3109691392,3109692415,GB -3109692416,3109693439,CH -3109693440,3109694463,AT -3109694464,3109695487,GR -3109695488,3109696511,DE -3109696512,3109697535,DK -3109697536,3109698559,PT -3109698560,3109699071,NO -3109699072,3109699199,DE -3109699200,3109699583,CA -3109699584,3109700607,DK -3109700608,3109701631,IT -3109701632,3109702655,KZ -3109702656,3109703679,IE -3109703680,3109704703,TR -3109704704,3109705727,HU -3109705728,3109706751,SA -3109706752,3109707775,AT -3109707776,3109708799,FR -3109708800,3109709823,RU -3109709824,3109710847,IQ -3109710848,3109711871,CH -3109711872,3109712895,DK -3109712896,3109713919,IT -3109713920,3109714943,GB -3109714944,3109715967,PS -3109715968,3109716991,DE -3109716992,3109718015,RS -3109718016,3109719039,NL -3109719040,3109720063,GB -3109720064,3109721087,RU -3109721088,3109722111,ES -3109722112,3109723135,CH -3109723136,3109725183,DE -3109725184,3109726207,SK -3109726208,3109727231,LB -3109727232,3109728255,DE -3109728256,3109729279,SE -3109729280,3109730303,NO -3109730304,3109731327,BE -3109731328,3109732351,IT -3109732352,3109733375,GB -3109733376,3109734399,NL -3109734400,3109735423,DE -3109735424,3109737471,ES -3109737472,3109738495,NO -3109738496,3109739519,GB -3109739520,3109740543,NL -3109740544,3109741567,RU -3109741568,3109743615,DE -3109743616,3109744639,HU -3109744640,3109745663,TR -3109745664,3109746687,US -3109747712,3109748735,ES -3109748736,3109749759,MT -3109749760,3109750783,DE -3109750784,3109752831,NL -3109752832,3109753855,IQ -3109753856,3109754879,GB -3109754880,3109755903,DE -3109755904,3109756927,NL -3109756928,3109757951,AT -3109757952,3109758975,FR -3109758976,3109759999,GB -3109760000,3109762047,DE -3109762048,3109763071,RU -3109763072,3109765119,IT -3109765120,3109766143,NO -3109766144,3109767167,ES -3109768192,3109769215,GB -3109769216,3109770239,AT -3109770240,3109771263,GB -3109771264,3109772287,FR -3109772288,3109773311,NL -3109773312,3109774335,LB -3109774336,3109775359,GB -3109775360,3109776383,DE -3109776384,3109777407,ES -3109777408,3109778431,GB -3109778432,3109779455,CZ -3109779456,3109782527,GB -3109782528,3109783551,KG -3109783552,3109784575,ES -3109784576,3109785599,HU -3109785600,3109786623,AT -3109786624,3109787647,IT -3109787648,3109788671,NO -3109788672,3109789695,BA -3109789696,3109790719,IT -3109790720,3109792767,CZ -3109792768,3109795839,RU -3109795840,3109796863,HU -3109796864,3109797887,IT -3109797888,3109798911,ES -3109798912,3109799935,DE -3109799936,3109800959,SK -3109800960,3109801983,CZ -3109801984,3109803007,AZ -3109803008,3109804031,PL -3109804032,3109805055,GB -3109805056,3109807103,FR -3109807104,3109808127,ES -3109808128,3109809151,RE -3109809152,3109810175,GB -3109810176,3109811199,IT -3109811200,3109812223,DE -3109812224,3109813247,NL -3109813248,3109814271,RU -3109814272,3109815295,TR -3109815296,3109817343,IR -3109817344,3109818367,TR -3109818368,3109819391,NL -3109819392,3109820415,FR -3109820416,3109820671,KR -3109820672,3109820927,GB -3109820928,3109821183,CA -3109821184,3109821439,GB -3109821440,3109822463,SY -3109822464,3109823487,RU -3109823488,3109824511,FR -3109824512,3109825535,IR -3109825536,3109826559,ES -3109826560,3109827583,PL -3109827584,3109828607,NO -3109828608,3109829631,GE -3109829632,3109830655,NL -3109830656,3109831679,CH -3109831680,3109833727,NL -3109833728,3109834751,DE -3109834752,3109835775,ES -3109835776,3109836799,AM -3109836800,3109837823,SY -3109837824,3109838847,ES -3109838848,3109839871,PT -3109839872,3109840895,AT -3109840896,3109841919,IT -3109841920,3109842943,ES -3109842944,3109843967,FI -3109843968,3109844991,HU -3109844992,3109845503,DE -3109845504,3109845759,GB -3109845760,3109846015,DE -3109846016,3109847039,CH -3109847040,3109848063,AE -3109848064,3109849087,BG -3109849088,3109852159,RU -3109852160,3109853183,NL -3109853184,3109854207,DE -3109854208,3109855231,PL -3109855232,3109856255,DE -3109856256,3109857279,IT -3109857280,3109858303,DE -3109859328,3109860351,SI -3109860352,3109861375,DE -3109861376,3109862399,RU -3109862400,3109863423,DE -3109863424,3109864447,RO -3109864448,3109865471,BE -3109865472,3109866495,AT -3109866496,3109867519,DE -3109867520,3109868543,CH -3109868544,3109869567,TR -3109869568,3109870591,CZ -3109870592,3109871615,NL -3109871616,3109872639,AZ -3109872640,3109872895,SI -3109872896,3109873151,SE -3109873152,3109874687,SI -3109874688,3109875711,ES -3109875712,3109876735,DK -3109876736,3109877759,ES -3109877760,3109878783,PL -3109878784,3109879807,GB -3109879808,3109880319,US -3109880320,3109880575,FR -3109880576,3109880831,ES -3109880832,3109881855,FR -3109881856,3109882879,AT -3109882880,3109883903,NL -3109883904,3109884927,RO -3109884928,3109885951,GL -3109885952,3109886975,NL -3109886976,3109887999,GB -3109888000,3109888255,CZ -3109888256,3109888767,PL -3109888768,3109889023,RU -3109889024,3109890047,FR -3109890048,3109891071,RU -3109891072,3109892095,ES -3109892096,3109893119,FI -3109893120,3109894143,TR -3109894144,3109894399,DE -3109894400,3109894655,HK -3109894656,3109895167,DE -3109895168,3109896191,CZ -3109896192,3109897215,HU -3109897216,3109898239,TR -3109898240,3109899263,PL -3109899264,3109900287,NL -3109900288,3109901311,ES -3109901312,3109902335,DK -3109902336,3109903359,GB -3109903360,3109904383,PL -3109904384,3109905407,RO -3109905408,3109906431,RS -3109906432,3109907455,SI -3109907456,3109908479,RU -3109908480,3109909503,ES -3109909504,3109910527,DE -3109910528,3109911551,ES -3109911552,3109912575,UZ -3109912576,3109913599,FR -3109913600,3109914623,PL -3109914624,3109916671,DE -3109916672,3109917695,IT -3109917696,3109918719,IE -3109918720,3109919743,ES -3109919744,3109920767,IS -3109920768,3109921791,SE -3109921792,3109922815,IR -3109922816,3109923839,GB -3109924864,3109925887,IT -3109925888,3109926143,DE -3109926144,3109926175,FR -3109926176,3109926207,IT -3109926208,3109926255,ES -3109926256,3109926271,IT -3109926272,3109926279,GB -3109926280,3109926287,DE -3109926288,3109926335,ES -3109926336,3109926399,GB -3109926400,3109926655,ES -3109926656,3109926911,IT -3109926912,3109927935,UA -3109927936,3109928959,DE -3109928960,3109929983,DK -3109929984,3109931007,AE -3109931008,3109932031,DE -3109932032,3109933055,IT -3109933056,3109934079,RU -3109934080,3109935103,AT -3109935104,3109937151,CH -3109937152,3109938175,ES -3109938176,3109939199,GB -3109939200,3109940223,ES -3109940224,3109941247,DE -3109941248,3109942271,PL -3109942272,3109943295,AE -3109943296,3109944319,TR -3109944320,3109945343,RU -3109945344,3109946367,LU -3109946368,3109947391,CZ -3109947392,3109948415,CH -3109948416,3109949439,SE -3109949440,3109949695,IT -3109949696,3109950207,GB -3109950208,3109950463,DE -3109950464,3109951487,IT -3109951488,3109952511,DE -3109952512,3109952767,US -3109952768,3109953023,NL -3109953024,3109953279,CA -3109953280,3109953280,GB -3109953281,3109953282,US -3109953283,3109953283,GB -3109953284,3109953287,IT -3109953288,3109953291,US -3109953292,3109953292,HK -3109953293,3109953319,GB -3109953320,3109953323,MX -3109953324,3109953359,GB -3109953360,3109953363,SG -3109953364,3109953375,GB -3109953376,3109953383,US -3109953384,3109953471,GB -3109953472,3109953475,HK -3109953476,3109953483,GB -3109953484,3109953487,AU -3109953488,3109953491,GB -3109953492,3109953495,AU -3109953496,3109953531,GB -3109953532,3109953535,CA -3109953536,3109954559,RU -3109954560,3109955583,DE -3109956608,3109957631,IE -3109957632,3109958655,ES -3109958656,3109959679,CZ -3109959680,3109960703,FR -3109960704,3109961727,SE -3109962752,3109963775,PL -3109963776,3109964799,SE -3109964800,3109965823,GI -3109965824,3109966847,IT -3109966848,3109967871,RU -3109967872,3109968895,IT -3109968896,3109969919,NL -3109969920,3109970943,IR -3109970944,3109971967,CH -3109971968,3109972991,DE -3109972992,3109974015,RU -3109974016,3109975039,EE -3109975040,3109976063,GB -3109976064,3109977087,NL -3109977088,3109978111,GB -3109978112,3109979135,SE -3109979136,3109980159,IT -3109980160,3109981183,BE -3109981184,3109982207,FR -3109982208,3109984255,CH -3109984256,3109985279,RU -3109985280,3109986303,SK -3109986304,3109987327,IT -3109987328,3109988351,RU -3109988352,3109989375,NL -3109989376,3109990399,RU -3109990400,3109991423,GB -3109991424,3109992447,NL -3109992448,3109993471,GB -3109993472,3109993727,NL -3109993728,3109993983,FR -3109993984,3109994239,HU -3109994240,3109994495,GB -3109994496,3109994751,BG -3109994752,3109995007,IT -3109995008,3109995136,DE -3109995137,3109995285,GB -3109995286,3109995287,US -3109995288,3109995313,GB -3109995314,3109995315,US -3109995316,3109995519,GB -3109995520,3109996543,NL -3109996544,3109997567,IE -3109997568,3109998591,GB -3109998592,3109999615,NL -3109999616,3110001663,UA -3110001664,3110002687,FR -3110002688,3110003711,RU -3110003712,3110004735,NL -3110004736,3110005759,GB -3110005760,3110006783,NL -3110006784,3110007807,NO -3110007808,3110008831,NL -3110008832,3110009855,ES -3110009856,3110010879,DE -3110010880,3110011903,TR -3110011904,3110012927,KW -3110012928,3110013951,FR -3110013952,3110014975,NL -3110014976,3110015999,GB -3110016000,3110017023,UA -3110017024,3110018303,NL -3110018304,3110018559,US -3110018560,3110019071,NL -3110019072,3110020095,DE -3110020096,3110021119,IT -3110021120,3110022143,IE -3110022144,3110023167,NL -3110023168,3110024191,GB -3110024192,3110025215,IT -3110025216,3110026239,ES -3110026240,3110027263,IR -3110027264,3110028287,BE -3110028288,3110029311,NL -3110029312,3110030335,BE -3110030336,3110031359,GB -3110031360,3110032383,DE -3110032384,3110033407,TR -3110033408,3110035455,SE -3110035456,3110036479,DE -3110036480,3110038527,RU -3110038528,3110039551,GB -3110039552,3110040575,DE -3110040576,3110041599,CZ -3110041600,3110042623,TR -3110043648,3110044671,DE -3110044672,3110046719,IT -3110046720,3110047743,SA -3110047744,3110048767,IT -3110048768,3110049791,SE -3110049792,3110050815,IR -3110050816,3110051839,BG -3110051840,3110052863,SE -3110052864,3110054911,TR -3110054912,3110055935,GB -3110055936,3110056959,NL -3110056960,3110057983,IR -3110057984,3110059007,IQ -3110059008,3110060031,RU -3110060032,3110061055,DE -3110061056,3110062079,PL -3110062080,3110063103,DE -3110063104,3110063871,IQ -3110063872,3110064127,US -3110064128,3110065151,AT -3110065152,3110066175,DE -3110066176,3110067199,CH -3110067200,3110068223,PT -3110068224,3110069247,IT -3110069248,3110070271,RU -3110070272,3110073343,IT -3110073344,3110074367,GB -3110074368,3110075391,BG -3110075392,3110076415,LB -3110076416,3110077439,RU -3110077440,3110078463,NL -3110078464,3110079487,PL -3110079488,3110080511,DE -3110080512,3110081535,GB -3110081536,3110082559,IT -3110082560,3110083583,ES -3110084608,3110085631,GR -3110085632,3110086655,RU -3110086656,3110087679,NO -3110087680,3110088703,NL -3110088704,3110089727,GB -3110090752,3110091775,DE -3110091776,3110093823,GB -3110093824,3110094847,JO -3110094848,3110095871,NO -3110095872,3110096895,CH -3110096896,3110098943,RU -3110098944,3110099967,DK -3110099968,3110100991,GB -3110100992,3110102015,IT -3110102016,3110103039,AT -3110103040,3110104063,FR -3110104064,3110105087,SY -3110105088,3110106111,TR -3110106112,3110107135,IT -3110107136,3110108159,PL -3110108160,3110109183,AZ -3110109184,3110110207,IT -3110110208,3110111231,RU -3110111232,3110112255,TR -3110112256,3110113279,NL -3110113280,3110114303,SE -3110114304,3110115327,NL -3110115328,3110116351,SE -3110116352,3110117375,FR -3110117376,3110118399,RO -3110118400,3110119423,BG -3110119424,3110120447,TR -3110120448,3110121471,PT -3110121472,3110122495,MD -3110122496,3110123519,DK -3110123520,3110124543,FR -3110124544,3110125567,UA -3110125568,3110126591,TR -3110126592,3110127615,DE -3110127616,3110128639,GB -3110128640,3110129663,IT -3110129664,3110130687,RS -3110130688,3110131711,DE -3110131712,3110132735,IT -3110132736,3110133759,GB -3110133760,3110134783,QA -3110134784,3110135807,KW -3110135808,3110136831,ES -3110136832,3110137855,DE -3110137856,3110138879,IR -3110138880,3110139903,GB -3110139904,3110140927,SE -3110140928,3110141951,BG -3110141952,3110142975,RU -3110142976,3110143999,DE -3110144000,3110145023,TR -3110145024,3110146047,IT -3110146048,3110147071,PL -3110147072,3110148095,GB -3110148096,3110149119,CZ -3110149120,3110150143,GB -3110150144,3110151167,SE -3110151168,3110152191,EE -3110152192,3110153215,DE -3110153216,3110154239,LT -3110154240,3110155263,LB -3110155264,3110156287,SI -3110156288,3110157311,KZ -3110157312,3110158335,GB -3110158336,3110159359,PS -3110159360,3110160383,SI -3110160384,3110161407,BG -3110161408,3110162431,RU -3110162432,3110163455,IE -3110163456,3110164479,NO -3110164480,3110165503,GB -3110165504,3110166527,LB -3110166528,3110167551,DE -3110167552,3110168575,FR -3110168576,3110169599,LB -3110169600,3110170623,IT -3110170624,3110171647,KZ -3110171648,3110172671,IR -3110172672,3110173695,IT -3110173696,3110173951,IL -3110173952,3110174207,PS -3110174208,3110174719,IL -3110174720,3110175743,SE -3110175744,3110176767,PS -3110176768,3110177791,CH -3110177792,3110178815,FR -3110178816,3110179839,GB -3110179840,3110180863,LT -3110180864,3110181887,GB -3110181888,3110182911,IT -3110182912,3110183935,GB -3110183936,3110184959,RU -3110184960,3110185984,ES -3110185985,3110187007,DE -3110187008,3110187263,BE -3110187264,3110189055,DE -3110189056,3110190079,FR -3110190080,3110193151,NO -3110193152,3110194175,RU -3110194176,3110195199,FR -3110195200,3110196223,HU -3110196224,3110196479,LT -3110196480,3110196735,GB -3110196736,3110196991,SE -3110196992,3110197247,NO -3110197248,3110199295,IT -3110199296,3110200319,DE -3110200320,3110201343,NL -3110201344,3110202367,IT -3110202368,3110203391,IE -3110203392,3110204415,DE -3110204416,3110205439,BE -3110205440,3110206463,EE -3110206464,3110207487,RU -3110207488,3110208511,BA -3110208512,3110209535,KZ -3110209536,3110210559,IT -3110210560,3110211583,HR -3110211584,3110212607,ES -3110212608,3110213631,FR -3110213632,3110214655,IQ -3110214656,3110215679,CH -3110215680,3110216703,ES -3110216704,3110217215,DK -3110217216,3110217471,DE -3110217472,3110217727,DK -3110217728,3110218751,RU -3110218752,3110219775,GB -3110219776,3110220799,DE -3110220800,3110221823,NL -3110221824,3110222847,DE -3110222848,3110223871,TR -3110223872,3110224895,FR -3110224896,3110225919,AT -3110225920,3110226943,CH -3110226944,3110227967,KZ -3110227968,3110230015,RU -3110230016,3110231039,KZ -3110231040,3110232063,DE -3110232064,3110233087,DK -3110233088,3110233119,NL -3110233120,3110234111,GR -3110234880,3110235135,CY -3110235136,3110236159,GB -3110236160,3110237183,IR -3110237184,3110238207,FR -3110238208,3110239231,CH -3110239232,3110240255,NL -3110240256,3110241279,FR -3110241280,3110242303,GR -3110242304,3110243327,FR -3110243328,3110244351,DE -3110244352,3110245375,NL -3110245376,3110246399,GB -3110246400,3110247423,CH -3110247424,3110249471,GB -3110249472,3110250495,IT -3110250496,3110254591,GB -3110254592,3110255615,DE -3110255616,3110256639,GB -3110256640,3110257663,SE -3110257664,3110259711,GB -3110259712,3110260735,LB -3110260736,3110261759,SK -3110261760,3110262783,GB -3110262784,3110263807,TR -3110263808,3110265855,JO -3110265856,3110266879,FI -3110266880,3110267903,ES -3110267904,3110269951,DE -3110269952,3110270975,SE -3110270976,3110271999,PT -3110272000,3110273023,TR -3110273024,3110274047,BA -3110274048,3110277119,RU -3110277120,3110278143,LB -3110278144,3110279167,TR -3110279168,3110279199,PL -3110279200,3110279231,DE -3110279232,3110279295,GB -3110279296,3110279303,FR -3110279304,3110279311,IT -3110279312,3110279319,SE -3110279320,3110279327,BE -3110279328,3110279335,IE -3110279336,3110279343,CZ -3110279344,3110279347,NO -3110279348,3110279351,LI -3110279352,3110279355,AT -3110279356,3110279359,DK -3110279360,3110279363,FI -3110279364,3110279367,PT -3110279368,3110279371,GR -3110279372,3110279375,RO -3110279376,3110279379,HU -3110279380,3110279383,LU -3110279384,3110279387,BG -3110279388,3110279391,HR -3110279392,3110279395,SI -3110279396,3110279399,LT -3110279400,3110279403,LV -3110279404,3110279407,EE -3110279408,3110279411,CY -3110279412,3110279415,MT -3110279416,3110279419,SK -3110279420,3110279423,IS -3110279424,3110279455,ES -3110279456,3110279487,NL -3110279488,3110279679,GB -3110279680,3110279711,ES -3110279712,3110279743,NL -3110279744,3110279807,GB -3110279808,3110279815,FR -3110279816,3110279823,IT -3110279824,3110279831,SE -3110279832,3110279839,BE -3110279840,3110279847,IE -3110279848,3110279855,CZ -3110279856,3110279859,NO -3110279860,3110279863,LI -3110279864,3110279867,AT -3110279868,3110279871,DK -3110279872,3110279875,FI -3110279876,3110279879,PT -3110279880,3110279883,GR -3110279884,3110279887,RO -3110279888,3110279891,HU -3110279892,3110279895,LU -3110279896,3110279899,BG -3110279900,3110279903,HR -3110279904,3110279907,SI -3110279908,3110279911,LT -3110279912,3110279915,LV -3110279916,3110279919,EE -3110279920,3110279923,CY -3110279924,3110279927,MT -3110279928,3110279931,SK -3110279932,3110279935,IS -3110279936,3110279967,PL -3110279968,3110279999,DE -3110280000,3110280191,GB -3110280192,3110281215,RU -3110281216,3110282239,LB -3110282240,3110283263,SE -3110284288,3110285311,PS -3110285312,3110286335,BE -3110286336,3110288383,DE -3110288384,3110289407,ES -3110289408,3110291455,CZ -3110291456,3110292479,AT -3110292480,3110293503,GB -3110293504,3110294527,AT -3110294528,3110295551,GB -3110295552,3110296575,RO -3110297600,3110298623,NL -3110298624,3110299647,SY -3110299648,3110300671,PL -3110300672,3110301695,IE -3110301696,3110302719,FR -3110302720,3110303743,CZ -3110303744,3110304767,DK -3110304768,3110305791,KZ -3110305792,3110306815,NL -3110306816,3110307327,NZ -3110307328,3110307452,GB -3110307453,3110307453,NL -3110307454,3110307583,GB -3110307584,3110307683,BY -3110307684,3110307684,BR -3110307685,3110307839,BY -3110307840,3110308863,IE -3110308864,3110309887,RU -3110309888,3110310911,DE -3110310912,3110311935,FR -3110311936,3110315007,UA -3110315008,3110316031,GB -3110316032,3110317055,RU -3110317056,3110318079,PL -3110318080,3110319103,CZ -3110319104,3110320127,US -3110320128,3110321151,ES -3110321152,3110322175,SE -3110322176,3110323199,PL -3110323200,3110324223,IT -3110324224,3110325247,GB -3110325248,3110326271,NL -3110326272,3110327295,DE -3110327296,3110328319,IR -3110328320,3110329343,FR -3110329344,3110330367,LB -3110330368,3110331391,IT -3110331392,3110332415,DE -3110332416,3110333439,PT -3110333440,3110334463,GB -3110334464,3110335487,ES -3110335488,3110336511,GB -3110336512,3110337535,GE -3110337536,3110338559,US -3110338560,3110339583,CH -3110339584,3110340607,FR -3110340608,3110341631,DE -3110341632,3110343679,IT -3110343680,3110344703,IQ -3110344704,3110345727,RU -3110345728,3110346751,FR -3110346752,3110347775,IT -3110347776,3110348799,NL -3110348800,3110349823,US -3110349824,3110350847,IR -3110350848,3110351871,DE -3110351872,3110352895,RU -3110352896,3110353919,NL -3110353920,3110354943,GB -3110354944,3110355967,KZ -3110355968,3110356991,GB -3110356992,3110358015,ES -3110358016,3110359039,GE -3110359040,3110360063,IT -3110360064,3110360575,RO -3110360576,3110360831,FI -3110360832,3110361087,RO -3110361088,3110362111,ES -3110362112,3110363135,CZ -3110363136,3110364159,KW -3110364160,3110364671,RU -3110364672,3110364927,UA -3110364928,3110366207,RU -3110366208,3110371327,IT -3110371328,3110372351,NL -3110372352,3110373375,LU -3110373376,3110374399,ES -3110374400,3110375423,NL -3110375424,3110376447,AT -3110376448,3110377471,GB -3110377472,3110378495,SA -3110378496,3110379519,RU -3110379520,3110380543,DE -3110380544,3110381567,IT -3110381568,3110382591,LB -3110382592,3110382847,GB -3110382848,3110383103,US -3110383104,3110383359,GB -3110383360,3110383615,US -3110383616,3110384639,IT -3110384640,3110385663,ES -3110385664,3110386687,FR -3110386688,3110387711,GB -3110387712,3110388735,NL -3110388736,3110389759,CZ -3110389760,3110390783,LB -3110390784,3110391807,NO -3110391808,3110392831,AE -3110392832,3110393087,GB -3110393088,3110393343,IE -3110393344,3110393599,GB -3110393600,3110393855,IE -3110393856,3110394879,LB -3110394880,3110395391,GB -3110395392,3110395647,RU -3110395648,3110395648,SA -3110395649,3110395903,RU -3110395904,3110396927,KZ -3110396928,3110397951,PL -3110397952,3110398975,NL -3110398976,3110399999,IT -3110400000,3110401023,AT -3110401024,3110402047,MK -3110402048,3110403071,GB -3110403072,3110404095,IT -3110404096,3110405119,NO -3110405120,3110406143,DE -3110406144,3110407167,LI -3110407168,3110408191,GB -3110408192,3110409215,LB -3110409216,3110410239,KZ -3110410240,3110411263,RU -3110411264,3110412287,FR -3110412288,3110413311,NO -3110413312,3110414335,IT -3110414336,3110415359,NL -3110415360,3110416383,GB -3110416384,3110417407,LI -3110417408,3110418431,DE -3110418432,3110419455,SE -3110419456,3110420479,NL -3110420480,3110421503,FR -3110421504,3110422015,RU -3110422016,3110422271,US -3110422272,3110422527,RU -3110422528,3110423551,PL -3110423552,3110425599,GB -3110425600,3110426623,IE -3110426624,3110427647,DK -3110427648,3110428671,DE -3110428672,3110429695,US -3110429696,3110430719,DE -3110430720,3110431743,RO -3110431744,3110432767,NL -3110432768,3110433791,DE -3110433792,3110434815,CH -3110434816,3110435839,GB -3110435840,3110436863,SE -3110436864,3110437887,PL -3110437888,3110438911,DE -3110438912,3110439935,GE -3110439936,3110440959,SK -3110440960,3110441983,BE -3110441984,3110443007,GB -3110443008,3110444031,DK -3110444032,3110445055,CH -3110445056,3110447103,ES -3110447104,3110448127,RO -3110448128,3110449151,DE -3110449152,3110450175,PT -3110450176,3110451199,FR -3110451200,3110452223,DE -3110452224,3110453247,PL -3110453248,3110454271,GB -3110454272,3110455295,NL -3110455296,3110457343,RU -3110457344,3110458367,FR -3110458368,3110459391,IT -3110459392,3110459392,IL -3110459393,3110459647,EE -3110459648,3110459903,FR -3110459904,3110460159,US -3110460160,3110460415,IT -3110460416,3110461439,CZ -3110461440,3110462463,GB -3110462464,3110463487,IR -3110463488,3110464511,PL -3110464512,3110465535,IQ -3110465536,3110466559,IE -3110466560,3110467583,NL -3110467584,3110468607,DE -3110468608,3110469631,NL -3110469632,3110470655,IL -3110470656,3110471679,NL -3110471680,3110472703,RU -3110472704,3110473727,AT -3110473728,3110474751,SE -3110474752,3110475775,CZ -3110475776,3110476799,NL -3110476800,3110477823,NO -3110477824,3110478847,SE -3110478848,3110479871,TR -3110479872,3110480895,IT -3110480896,3110481919,NL -3110481920,3110482943,RO -3110482944,3110483967,NO -3110483968,3110487039,DE -3110487040,3110488063,NL -3110488064,3110489087,KZ -3110489088,3110490111,CZ -3110490112,3110491135,FR -3110491136,3110492159,GB -3110492160,3110493183,RO -3110493184,3110494207,DE -3110494208,3110495231,CZ -3110495232,3110496255,SE -3110496256,3110497279,DE -3110497280,3110498303,NO -3110498304,3110499327,RU -3110499328,3110500351,KZ -3110500352,3110501375,RU -3110501376,3110502399,RS -3110502400,3110503423,KZ -3110503424,3110504447,GB -3110504448,3110505471,RU -3110505472,3110506495,IT -3110506496,3110507519,GE -3110507520,3110508543,GB -3110508544,3110509567,DE -3110509568,3110510591,RO -3110510592,3110511615,FR -3110511616,3110512639,UA -3110512640,3110514687,ES -3110514688,3110515711,FR -3110515712,3110516735,RU -3110516736,3110517759,UA -3110517760,3110518783,PL -3110518784,3110521855,GB -3110521856,3110523903,ES -3110523904,3110524927,SE -3110524928,3110525439,US -3110525440,3110525695,NL -3110525696,3110525951,DE -3110526976,3110527999,DE -3110528000,3110529023,AT -3110529024,3110530047,FI -3110530048,3110531071,RS -3110531072,3110532095,DE -3110532096,3110534143,GB -3110534144,3110535167,DE -3110535168,3110536191,LU -3110536192,3110537215,GB -3110537216,3110538239,ES -3110538240,3110539263,LB -3110539264,3110540287,NL -3110540288,3110541311,LB -3110541312,3110542335,RU -3110542336,3110543359,HK -3110543360,3110544383,NL -3110544384,3110545407,ES -3110545408,3110546431,UA -3110546432,3110547455,DE -3110547456,3110547967,SE -3110547968,3110548223,JP -3110548224,3110548479,DE -3110548480,3110549503,IT -3110549504,3110550527,NL -3110550528,3110551551,RU -3110551552,3110552575,FR -3110552576,3110553599,RU -3110553600,3110554623,DE -3110554624,3110555647,NL -3110555648,3110556671,IT -3110556672,3110557695,IR -3110557696,3110558719,LB -3110558720,3110559743,DE -3110559744,3110560767,GB -3110560768,3110561791,RU -3110561792,3110562815,IE -3110562816,3110563071,RU -3110563072,3110563327,US -3110563328,3110563583,FI -3110563584,3110563839,RU -3110563840,3110564863,IT -3110564864,3110565887,GB -3110565888,3110566911,DK -3110566912,3110567935,ES -3110567936,3110568959,IR -3110568960,3110569983,RU -3110569984,3110571007,RS -3110571008,3110572031,FR -3110572032,3110573055,SK -3110573056,3110574079,ES -3110574080,3110575103,PL -3110575104,3110575359,NL -3110575360,3110575615,US -3110575616,3110576127,NL -3110576128,3110578175,RU -3110578176,3110579199,KZ -3110579200,3110580223,NL -3110580224,3110581247,KZ -3110581248,3110582271,ES -3110582272,3110583295,KZ -3110583296,3110584319,SE -3110584320,3110585343,DE -3110585344,3110586367,TR -3110586368,3110587391,NL -3110587392,3110588415,ES -3110588416,3110590463,SE -3110590464,3110591487,HR -3110591488,3110592511,GB -3110592512,3110593535,DE -3110593536,3110594303,GB -3110594304,3110594559,SE -3110594560,3110595583,DE -3110595584,3110596607,NL -3110596608,3110597119,SE -3110597120,3110597631,NL -3110597632,3110599679,IR -3110599680,3110600191,RU -3110600192,3110600703,UA -3110600704,3110601727,GR -3110601728,3110602751,RU -3110602752,3110603775,NL -3110603776,3110604799,RU -3110604800,3110605823,CH -3110605824,3110606847,TR -3110606848,3110607871,IT -3110607872,3110608895,NL -3110608896,3110611967,RO -3110611968,3110612991,GB -3110612992,3110615039,RO -3110615040,3110616063,QA -3110616064,3110617087,ES -3110617088,3110618111,PL -3110618112,3110619135,LB -3110619136,3110620159,DE -3110620160,3110621183,FR -3110621184,3110622207,GB -3110622208,3110623231,CH -3110623232,3110624255,DE -3110624256,3110625279,RU -3110625280,3110626303,GB -3110626304,3110627327,NL -3110627328,3110628351,RU -3110628352,3110629375,LU -3110629376,3110630399,RU -3110630400,3110631423,IT -3110631424,3110632447,GB -3110632448,3110633471,IT -3110633472,3110634495,NL -3110634496,3110635007,ES -3110635008,3110636543,NL -3110636544,3110637567,DE -3110637568,3110638591,GR -3110638592,3110639615,RU -3110639616,3110640639,ES -3110640640,3110641663,IQ -3110641664,3110642687,DE -3110642688,3110643711,ES -3110643712,3110644735,LU -3110644736,3110645759,RU -3110645760,3110646783,LT -3110646784,3110647807,RO -3110647808,3110648047,DE -3110648048,3110648055,PL -3110648056,3110648063,DK -3110648064,3110648319,FR -3110648320,3110648575,BE -3110648576,3110648831,HU -3110648832,3110649855,NL -3110649856,3110650879,IR -3110650880,3110651903,RO -3110651904,3110652927,GG -3110652928,3110653951,DE -3110653952,3110654975,CZ -3110654976,3110655999,RU -3110656000,3110657023,IE -3110657024,3110658047,GI -3110658048,3110659071,AT -3110659072,3110661119,IR -3110661120,3110662143,ES -3110662144,3110663167,IR -3110663168,3110664191,LB -3110664192,3110665215,RU -3110665216,3110666239,LB -3110667264,3110668287,RO -3110668288,3110669311,PL -3110669312,3110671359,ES -3110671360,3110672383,AT -3110672384,3110673407,ES -3110673408,3110674431,FR -3110674432,3110675455,GB -3110675456,3110676479,RO -3110676480,3110677503,DE -3110677504,3110679551,RU -3110679552,3110680575,BE -3110680576,3110681599,GB -3110681600,3110682623,SE -3110682624,3110683647,GB -3110684672,3110685695,GB -3110685696,3110686719,NL -3110686720,3110687743,BE -3110687744,3110688767,RO -3110688768,3110689791,UA -3110689792,3110690815,IT -3110690816,3110691839,GB -3110691840,3110692863,IR -3110692864,3110693887,IT -3110693888,3110694911,RU -3110694912,3110695935,DE -3110695936,3110696959,UA -3110696960,3110697983,IR -3110697984,3110699007,GB -3110699008,3110700031,IT -3110700032,3110701055,CH -3110701056,3110702079,FR -3110702080,3110703103,PL -3110703104,3110704127,CH -3110704128,3110705151,GE -3110705152,3110706175,FR -3110706176,3110707199,BE -3110707200,3110708223,NL -3110708224,3110709247,GB -3110709248,3110710271,RU -3110710272,3110711295,CY -3110711296,3110712319,IL -3110712320,3110713343,DK -3110713344,3110714367,IR -3110714368,3110715391,RO -3110715392,3110716415,NL -3110716416,3110717439,AZ -3110717440,3110718463,BE -3110718464,3110719487,NL -3110719488,3110721535,IT -3110721536,3110723087,NL -3110723088,3110723103,DE -3110723104,3110723583,NL -3110723584,3110724607,RU -3110724608,3110725631,TJ -3110725632,3110726655,ES -3110726656,3110726911,IR -3110726912,3110726943,AE -3110726944,3110727679,IR -3110727680,3110728703,IT -3110728704,3110729727,SE -3110729728,3110730751,NL -3110730752,3110731775,DE -3110731776,3110733823,RO -3110733824,3110734847,DE -3110735872,3110736895,GR -3110736896,3110737919,TR -3110737920,3110738943,LU -3110738944,3110739967,IQ -3110739968,3110740991,IL -3110740992,3110742015,RO -3110742016,3110743039,RU -3110743040,3110744063,ES -3110744064,3110745087,AT -3110745088,3110746111,NL -3110747136,3110748159,NL -3110748160,3110749183,CH -3110749184,3110750207,BE -3110750208,3110751231,NL -3110751232,3110752255,DE -3110752256,3110753279,NL -3110753280,3110754303,DE -3110754304,3110755327,IE -3110755328,3110756351,RU -3110756352,3110757375,HU -3110757376,3110758399,CY -3110758400,3110759423,RU -3110759424,3110760447,AT -3110760448,3110761471,HU -3110762496,3110763007,NL -3110763008,3110763263,RO -3110763264,3110763519,NL -3110763520,3110764543,AD -3110764544,3110765567,IL -3110765568,3110766591,PL -3110766592,3110767615,IR -3110767616,3110768639,NL -3110768640,3110769663,IR -3110769664,3110770687,DE -3110770688,3110771711,NL -3110771712,3110772735,KZ -3110773760,3110774783,DE -3110774784,3110775807,PL -3110775808,3110776831,RU -3110776832,3110777855,GB -3110777856,3110778879,SE -3110778880,3110779903,DE -3110779904,3110780927,AT -3110780928,3110781951,PS -3110781952,3110782975,RU -3110782976,3110783999,PT -3110784000,3110784255,US -3110784256,3110785023,RU -3110785024,3110786047,TR -3110786048,3110787071,NL -3110787072,3110788095,FR -3110788096,3110789119,ES -3110789120,3110790143,NL -3110790144,3110791167,IR -3110791168,3110792191,DE -3110792192,3110793215,BE -3110793216,3110794239,NL -3110794240,3110795263,DE -3110795264,3110796287,AT -3110796288,3110797311,DE -3110797312,3110798335,ES -3110798336,3110799359,DE -3110799360,3110800383,GB -3110800384,3110801407,DK -3110801408,3110802431,ES -3110802432,3110803455,DE -3110803456,3110804479,NL -3110804480,3110806527,IR -3110806528,3110809599,NL -3110809600,3110810623,LB -3110810624,3110811647,DE -3110811648,3110812671,NL -3110812672,3110813695,IS -3110813696,3110814207,PL -3110814208,3110815743,NL -3110815744,3110816767,RU -3110816768,3110817791,QA -3110817792,3110818815,NL -3110818816,3110819839,FR -3110819840,3110821887,NL -3110821888,3110822911,DE -3110822912,3110823935,NL -3110823936,3110825983,ES -3110825984,3110829055,NL -3110829056,3110830079,UA -3110830080,3110831103,RU -3110831104,3110832127,TR -3110832128,3110833151,UA -3110833152,3110834175,PL -3110834176,3110836223,IT -3110836224,3110837247,ES -3110837248,3110838271,UA -3110838272,3110839295,ES -3110839296,3110840319,UA -3110840320,3110841343,DK -3110841344,3110842367,KZ -3110842368,3110843391,DK -3110843392,3110845439,IT -3110845440,3110846463,NL -3110846464,3110847487,DE -3110847488,3110848511,GB -3110848512,3110849535,DK -3110849536,3110850559,IT -3110850560,3110851583,BE -3110851584,3110852607,NL -3110852608,3110853631,MK -3110853632,3110854655,DE -3110854656,3110855679,NL -3110855680,3110856703,GB -3110856704,3110857727,FR -3110857728,3110858751,IT -3110858752,3110859775,RU -3110859776,3110861823,IR -3110861824,3110864895,RU -3110864896,3110865919,DE -3110865920,3110866943,GB -3110866944,3110868991,RU -3110868992,3110870015,PS -3110870016,3110871039,CZ -3110871040,3110872063,FR -3110872064,3110873087,MD -3110873088,3110874111,IE -3110874112,3110875135,GB -3110876160,3110878207,GB -3110878208,3110879231,CZ -3110879232,3110880255,LV -3110880256,3110881279,PL -3110881280,3110883327,DE -3110883328,3110884351,IL -3110884352,3110886399,RU -3110886400,3110887423,GB -3110887424,3110888447,IR -3110888448,3110889471,DK -3110890496,3110891519,DK -3110891520,3110892543,RO -3110892544,3110893567,NL -3110893568,3110894591,CZ -3110894592,3110895615,TR -3110895616,3110896639,IE -3110896640,3110897663,GB -3110897664,3110898687,MD -3110898688,3110899711,BG -3110899712,3110900735,MD -3110900736,3110901759,TR -3110901760,3110902783,MD -3110903808,3110904831,RU -3110904832,3110905855,IR -3110905856,3110906879,GB -3110906880,3110907903,DE -3110907904,3110908927,GB -3110908928,3110909951,MD -3110909952,3110910975,DE -3110910976,3110911999,BG -3110912000,3110914047,RU -3110914048,3110915071,AT -3110915072,3110916095,ES -3110916096,3110918143,RU -3110918144,3110919167,DE -3110919168,3110920191,RU -3110920192,3110921215,NL -3110921216,3110922239,DE -3110922240,3110923263,GB -3110923264,3110924287,FR -3110924288,3110925311,SA -3110925312,3110926335,CH -3110926336,3110927359,LU -3110927360,3110928383,DK -3110928384,3110929407,CH -3110929408,3110930431,IE -3110930432,3110931455,GB -3110931456,3110932479,DK -3110932480,3110933503,RO -3110933504,3110934015,US -3110934016,3110934527,RU -3110934528,3110935551,IT -3110935552,3110936575,TR -3110936576,3110937599,DE -3110937600,3110938623,CH -3110938624,3110941695,GB -3110941696,3110942719,UA -3110942720,3110943743,IT -3110943744,3110944767,IR -3110944768,3110945791,DK -3110945792,3110946815,IT -3110946816,3110947839,IR -3110947840,3110948863,DK -3110948864,3110949887,IR -3110949888,3110950911,SE -3110950912,3110951935,DK -3110951936,3110952959,GB -3110952960,3110953983,NL -3110953984,3110955007,IS -3110955008,3110956031,GB -3110956032,3110957055,DE -3110957056,3110958079,RU -3110958080,3110959103,GB -3110959104,3110960127,JO -3110960128,3110961151,GB -3110961152,3110962175,IR -3110962176,3110963199,DK -3110963200,3110965247,GB -3110965248,3110966271,NL -3110966272,3110967295,IL -3110968320,3110969343,DE -3110969344,3110970367,NL -3110970368,3110971391,CH -3110971392,3110972415,GB -3110972416,3110973439,FR -3110973440,3110974463,SA -3110974464,3110975487,DE -3110975488,3110977535,IT -3110977536,3110978559,JO -3110978560,3110979583,DE -3110979584,3110980607,FR -3110980608,3110982655,RU -3110982656,3110982677,RO -3110982678,3110983679,SY -3110983680,3110986751,SE -3110986752,3110987775,GB -3110987776,3110988799,NL -3110988800,3110989055,CN -3110989056,3110989823,DE -3110989824,3110990335,CA -3110990336,3110990847,CH -3110990848,3110992895,IR -3110992896,3110993919,RO -3110993920,3110994943,GB -3110994944,3110995967,PL -3110995968,3110996991,RU -3110996992,3110998015,DE -3110998016,3110999039,ES -3110999040,3111000063,IT -3111000064,3111001087,RO -3111001088,3111002111,IR -3111002112,3111003135,DE -3111003136,3111004159,GG -3111004160,3111005183,DE -3111005184,3111006207,RU -3111006208,3111007231,PL -3111007232,3111008255,GB -3111008256,3111009279,RU -3111009280,3111010303,BG -3111010304,3111012351,ES -3111012352,3111013375,CH -3111013376,3111014399,ES -3111014400,3111015423,DK -3111015424,3111016447,FR -3111016448,3111017471,CH -3111017472,3111018495,NL -3111018496,3111019519,FR -3111019520,3111020543,CH -3111020544,3111021567,SY -3111021568,3111022591,IL -3111022592,3111023615,NL -3111023616,3111024639,IT -3111024640,3111025663,AT -3111025664,3111026687,DE -3111026688,3111027967,RU -3111027968,3111028735,UA -3111028736,3111029759,AT -3111029760,3111031807,SK -3111031808,3111032831,NO -3111032832,3111033343,DE -3111033344,3111033599,CH -3111033600,3111033855,DE -3111033856,3111035903,ES -3111035904,3111036927,GE -3111036928,3111037951,RU -3111037952,3111038975,NL -3111038976,3111041023,GB -3111041024,3111042047,CH -3111042048,3111043071,GB -3111043072,3111044095,FR -3111044096,3111045119,CH -3111045120,3111046143,NL -3111046144,3111047167,CZ -3111047168,3111048191,RU -3111048192,3111049215,ES -3111049216,3111050239,IR -3111050240,3111051263,CH -3111051264,3111052287,ES -3111052288,3111053311,IR -3111053312,3111054335,SA -3111054336,3111055359,IR -3111055360,3111056383,TR -3111056384,3111057407,IR -3111057408,3111058431,GB -3111058432,3111059455,IR -3111059456,3111060479,ES -3111060480,3111061503,LB -3111061504,3111063551,IR -3111063552,3111064575,FR -3111064576,3111065599,GB -3111065600,3111066623,RU -3111066624,3111067647,NL -3111067648,3111068671,DE -3111068672,3111069695,IS -3111069696,3111070719,IR -3111070720,3111071743,FR -3111071744,3111072767,RU -3111072768,3111074815,FR -3111074816,3111075839,DE -3111075840,3111076863,IR -3111076864,3111077887,DE -3111077888,3111078911,NL -3111078912,3111079935,IT -3111079936,3111080959,IR -3111080960,3111081983,RU -3111081984,3111083007,HU -3111083008,3111084031,CA -3111084032,3111085055,CZ -3111085056,3111086079,RU -3111086080,3111087103,KZ -3111087104,3111088127,CZ -3111088128,3111089151,IE -3111089152,3111090175,UA -3111090176,3111091199,NL -3111091200,3111092223,AT -3111092224,3111093247,IR -3111093248,3111094271,PL -3111094272,3111095295,IR -3111095296,3111096319,IE -3111096320,3111097343,AT -3111097344,3111098367,ES -3111098368,3111099391,SE -3111099392,3111100415,CH -3111100416,3111101439,LB -3111101440,3111102463,RU -3111102464,3111103487,DE -3111103488,3111104511,DK -3111104512,3111105535,CH -3111105536,3111106559,LT -3111106560,3111107583,ES -3111107584,3111108607,HR -3111108608,3111109631,DE -3111109632,3111110655,BE -3111110656,3111111679,US -3111111680,3111112703,BE -3111112704,3111113727,HU -3111113728,3111114751,BG -3111114752,3111115775,RU -3111115776,3111116799,DE -3111116800,3111117823,GB -3111117824,3111117824,ES -3111117825,3111118079,FR -3111118080,3111118847,ES -3111118848,3111119614,CY -3111119615,3111119871,TR -3111119872,3111120895,FR -3111120896,3111121919,SE -3111121920,3111122943,TR -3111122944,3111123967,IT -3111123968,3111126015,ES -3111126016,3111127039,IT -3111127040,3111128063,CH -3111128064,3111129087,UA -3111129088,3111130111,FR -3111130112,3111131135,RS -3111131136,3111132159,NO -3111132160,3111133183,CZ -3111133184,3111135231,IR -3111135232,3111136255,PL -3111136256,3111137279,NL -3111137280,3111139327,CH -3111139328,3111140351,RU -3111140352,3111141375,IT -3111141376,3111142399,NL -3111142400,3111143423,DE -3111143424,3111144447,CH -3111144448,3111145471,ES -3111145472,3111145983,RU -3111145984,3111146239,FI -3111146240,3111146495,US -3111146496,3111146635,IT -3111146636,3111146639,FR -3111146640,3111149567,IT -3111149568,3111150591,GB -3111150592,3111151359,RU -3111151360,3111151615,US -3111151616,3111152639,OM -3111152640,3111153663,NL -3111153664,3111154687,SE -3111154688,3111155711,PL -3111155712,3111156735,UA -3111156736,3111157759,DE -3111157760,3111158783,IR -3111158784,3111159807,CH -3111159808,3111160831,SE -3111160832,3111161855,RU -3111161856,3111162879,IS -3111162880,3111163903,IR -3111163904,3111164927,DE -3111164928,3111165951,HU -3111165952,3111166975,GB -3111166976,3111167999,CZ -3111168000,3111169023,IR -3111169024,3111170047,UA -3111170048,3111171071,DE -3111171072,3111172095,PL -3111172096,3111173119,RO -3111173120,3111173631,IQ -3111173632,3111173887,KR -3111173888,3111174143,IQ -3111174144,3111175167,AZ -3111175168,3111176191,IT -3111176192,3111177215,YE -3111177216,3111178239,IS -3111178240,3111179263,DK -3111179264,3111180287,IT -3111180288,3111181311,DE -3111181312,3111182335,GB -3111182336,3111183359,RU -3111183360,3111184383,FR -3111184384,3111185407,IQ -3111185408,3111186431,RU -3111187456,3111189503,GB -3111189504,3111190527,DE -3111190528,3111191551,GB -3111191552,3111192575,DE -3111192576,3111193599,TR -3111193600,3111194623,RU -3111194624,3111195647,GB -3111195648,3111196671,CH -3111196672,3111197695,GB -3111197696,3111198719,RU -3111198720,3111199743,PL -3111199744,3111200767,KZ -3111200768,3111201791,ES -3111201792,3111202815,SK -3111202816,3111203839,FR -3111203840,3111204863,NL -3111204864,3111205887,IR -3111205888,3111206911,GB -3111206912,3111207935,FR -3111207936,3111208959,GB -3111208960,3111211007,RU -3111211008,3111212031,GB -3111212032,3111214079,NL -3111214080,3111215103,GB -3111215104,3111216127,SE -3111216128,3111217151,AT -3111217152,3111218175,IR -3111218176,3111219199,RU -3111219200,3111220223,IR -3111220224,3111221247,RU -3111221248,3111223295,DE -3111223296,3111224319,GB -3111224320,3111225343,KZ -3111225344,3111226367,PL -3111226368,3111227391,PT -3111227392,3111228415,DE -3111228416,3111230463,IR -3111230464,3111231487,PT -3111231488,3111232511,FR -3111232512,3111233535,DE -3111233536,3111234559,LV -3111234560,3111235583,NL -3111235584,3111236607,SE -3111236608,3111237631,GB -3111237632,3111238655,ES -3111238656,3111239679,GB -3111239680,3111240703,ES -3111240704,3111241727,NL -3111241728,3111242751,RU -3111242752,3111243775,GB -3111243776,3111244799,RU -3111244800,3111245823,NL -3111245824,3111246847,GB -3111246848,3111247871,TR -3111247872,3111248127,BE -3111248128,3111248383,SE -3111248384,3111248639,ES -3111248640,3111248895,NL -3111248896,3111249919,DK -3111249920,3111250943,IE -3111250944,3111251967,ES -3111251968,3111252991,GB -3111252992,3111254015,RU -3111254016,3111255039,IE -3111255040,3111256063,EE -3111256064,3111257087,IT -3111257088,3111259135,FR -3111259136,3111260159,DE -3111260160,3111261183,IE -3111261184,3111262207,TR -3111262208,3111264511,NL -3111264512,3111264767,AU -3111264768,3111265279,HK -3111265280,3111265334,NL -3111265335,3111265335,US -3111265336,3111266303,NL -3111266304,3111267327,DE -3111267328,3111268351,DK -3111268352,3111269375,BE -3111269376,3111270399,RO -3111270400,3111271423,NO -3111271424,3111272447,GB -3111272448,3111273471,ES -3111273472,3111274495,SA -3111274496,3111275519,IR -3111275520,3111276543,NL -3111276544,3111277567,IT -3111277568,3111278591,RO -3111278592,3111279615,LB -3111279616,3111280639,PL -3111280640,3111281663,GB -3111281664,3111282687,FR -3111282688,3111283711,SE -3111283712,3111284223,IT -3111284224,3111284735,ES -3111284736,3111285759,AL -3111285760,3111286783,IT -3111286784,3111287039,IL -3111287040,3111287295,DE -3111287296,3111287551,NL -3111287552,3111287807,GB -3111287808,3111288831,DE -3111288832,3111289855,FR -3111289856,3111290879,DE -3111290880,3111291903,UA -3111291904,3111292927,NL -3111292928,3111293951,SI -3111293952,3111294975,CY -3111294976,3111295999,US -3111296000,3111297023,NL -3111297024,3111298047,IE -3111298048,3111299071,NL -3111299072,3111300095,DE -3111300096,3111301119,ES -3111301120,3111302143,EE -3111302144,3111303167,BG -3111303168,3111304191,NL -3111304192,3111305215,IR -3111305216,3111306239,TR -3111306240,3111307263,NL -3111307264,3111308287,DE -3111308288,3111309311,GB -3111309312,3111310335,CH -3111310336,3111311359,DE -3111312384,3111313407,DE -3111313408,3111313523,GB -3111313524,3111313524,SA -3111313525,3111313663,GB -3111313664,3111313919,NL -3111313920,3111314175,DE -3111314176,3111314431,GB -3111314432,3111314687,PT -3111314688,3111315455,GB -3111315456,3111316479,IT -3111316480,3111317503,NL -3111317504,3111318527,SY -3111318528,3111319551,UA -3111319552,3111320575,SE -3111320576,3111321599,LB -3111321600,3111322623,CZ -3111322624,3111323647,GE -3111323648,3111324671,CZ -3111324672,3111325695,MT -3111325696,3111326719,FI -3111326720,3111327743,HU -3111327744,3111328767,DE -3111328768,3111329791,RO -3111329792,3111330815,NL -3111330816,3111331839,UA -3111331840,3111332863,TR -3111332864,3111333887,PL -3111333888,3111334911,DE -3111334912,3111335935,ES -3111335936,3111336959,HR -3111336960,3111337983,GB -3111337984,3111339007,RO -3111339008,3111340031,GB -3111340032,3111341055,CZ -3111341056,3111342079,IR -3111342080,3111343103,DE -3111343104,3111344127,GB -3111344128,3111344383,NL -3111344384,3111344639,DE -3111344640,3111345151,US -3111345152,3111346175,RO -3111346176,3111347199,RU -3111347200,3111348223,LB -3111348224,3111349247,DE -3111349248,3111350271,GB -3111350272,3111351295,PL -3111351296,3111353343,GB -3111353344,3111353599,AT -3111353600,3111353855,FR -3111353856,3111355391,GB -3111355392,3111356415,IT -3111356416,3111357439,GE -3111357440,3111358463,RU -3111358464,3111358719,ES -3111358720,3111358975,IE -3111358976,3111359231,FR -3111359232,3111359487,IE -3111359488,3111360511,IR -3111360512,3111361535,PL -3111361536,3111363583,RU -3111363584,3111365631,IR -3111365632,3111367679,DE -3111367680,3111368703,CZ -3111368704,3111369727,AT -3111369728,3111370751,NL -3111370752,3111371007,DE -3111371008,3111371263,US -3111371264,3111371519,GB -3111371520,3111371775,DE -3111371776,3111373823,GB -3111373824,3111374847,GR -3111374848,3111375871,TR -3111375872,3111376895,IL -3111376896,3111377919,BE -3111377920,3111378943,RO -3111378944,3111379967,IL -3111379968,3111380991,GB -3111380992,3111382015,ES -3111382016,3111383039,DE -3111383040,3111383295,GB -3111383296,3111383551,US -3111383552,3111383807,TR -3111383808,3111384063,NL -3111384064,3111387135,NO -3111387136,3111388159,IT -3111388160,3111389183,NO -3111389184,3111390207,DK -3111390208,3111390463,ES -3111390464,3111390719,IE -3111390720,3111390975,FR -3111390976,3111391231,NL -3111391232,3111392255,DE -3111392256,3111394303,IR -3111394304,3111395327,AT -3111395328,3111396351,FI -3111396352,3111397375,DE -3111397376,3111398399,NL -3111398400,3111399423,IR -3111399424,3111400447,CZ -3111400448,3111402495,GB -3111402496,3111403519,KE -3111403520,3111404543,IE -3111404544,3111405567,GB -3111405568,3111406591,BE -3111406592,3111407615,CZ -3111407616,3111408639,NL -3111408640,3111409663,IT -3111409664,3111410687,FR -3111410688,3111411711,BG -3111411712,3111412735,AT -3111412736,3111413759,IL -3111413760,3111414783,FR -3111414784,3111416831,GB -3111416832,3111417855,LB -3111417856,3111418879,SE -3111418880,3111419903,NL -3111419904,3111421951,FR -3111421952,3111422975,PL -3111422976,3111423999,KZ -3111424000,3111425023,NL -3111425024,3111426047,DK -3111426048,3111427071,TR -3111427072,3111428095,DE -3111428096,3111429119,IR -3111429120,3111430143,NL -3111430144,3111431167,IE -3111431168,3111432191,GB -3111432192,3111433215,FR -3111433216,3111434239,ES -3111434240,3111436287,DK -3111436288,3111437311,KZ -3111437312,3111439359,RU -3111439360,3111440383,BG -3111440384,3111441407,DE -3111441408,3111442431,GB -3111442432,3111443455,NL -3111443456,3111444479,DE -3111444480,3111445503,SA -3111445504,3111446527,RU -3111446528,3111447551,DE -3111447552,3111447775,NL -3111447776,3111447807,AT -3111447808,3111448063,GB -3111448064,3111448319,BG -3111448320,3111448575,GB -3111448576,3111448960,NO -3111448961,3111449502,BE -3111449503,3111449599,NO -3111449600,3111451647,DE -3111451648,3111452671,PL -3111452672,3111453695,MY -3111453696,3111454719,NL -3111454720,3111455743,IQ -3111455744,3111456255,CH -3111456256,3111456767,DE -3111456768,3111457791,FR -3111457792,3111458815,GB -3111458816,3111459839,NL -3111459840,3111460863,RU -3111460864,3111461887,GR -3111461888,3111462911,FR -3111462912,3111463935,AT -3111463936,3111464959,ES -3111464960,3111465983,IR -3111465984,3111467007,US -3111467008,3111469055,FR -3111469056,3111470079,EE -3111470080,3111471103,AE -3111471104,3111473151,NL -3111473152,3111474175,BG -3111474176,3111475199,PL -3111475200,3111475711,SE -3111475712,3111476223,NL -3111476224,3111477247,FR -3111477248,3111478271,IR -3111478272,3111479295,RU -3111479296,3111480319,SE -3111480320,3111481343,NL -3111482368,3111482879,RU -3111482880,3111483391,FI -3111483392,3111484415,TR -3111484416,3111485439,NL -3111485440,3111486463,SA -3111486464,3111487487,CY -3111487488,3111488511,IR -3111488512,3111490559,RU -3111490560,3111491583,KG -3111491584,3111493631,RU -3111493632,3111494655,DE -3111494656,3111495679,LI -3111495680,3111496703,CH -3111496704,3111498751,ES -3111498752,3111499775,DE -3111499776,3111500799,IT -3111500800,3111501823,BG -3111501824,3111502847,NO -3111502848,3111504895,GB -3111504896,3111505919,IR -3111505920,3111506943,NL -3111506944,3111507967,DE -3111507968,3111508991,IT -3111508992,3111510015,FI -3111510016,3111511039,LB -3111511040,3111512063,GR -3111512064,3111513087,RU -3111513088,3111514111,GB -3111514112,3111515135,UA -3111515136,3111516159,RU -3111516160,3111519231,DE -3111519232,3111520255,RO -3111520256,3111521279,IQ -3111521280,3111522303,IR -3111522304,3111523327,FR -3111523328,3111524351,DE -3111524352,3111525375,LB -3111525376,3111526399,GB -3111526400,3111527423,IS -3111527424,3111528447,SE -3111528448,3111529471,DK -3111529472,3111530495,IQ -3111530496,3111531519,AZ -3111531520,3111533567,ES -3111533568,3111534591,NL -3111534592,3111535615,RU -3111535616,3111536639,FR -3111536640,3111537663,IT -3111537664,3111538687,LV -3111538688,3111539711,CZ -3111539712,3111540735,GE -3111540736,3111541759,NL -3111541760,3111542783,FR -3111542784,3111543807,IQ -3111543808,3111544831,DE -3111546880,3111547903,PT -3111547904,3111548927,FR -3111548928,3111549951,SA -3111549952,3111550975,NL -3111550976,3111551999,IQ -3111552000,3111553023,NL -3111553024,3111554047,IR -3111554048,3111555071,TR -3111555072,3111556095,DE -3111556096,3111557119,AL -3111557120,3111558143,IR -3111558144,3111559167,ES -3111559168,3111560191,EE -3111560192,3111561215,RU -3111561216,3111562239,RS -3111562240,3111563263,DE -3111563264,3111564287,TR -3111564288,3111565311,DK -3111565312,3111566335,IT -3111566336,3111567359,ES -3111567360,3111568383,TR -3111568384,3111569407,DE -3111569408,3111570431,RO -3111570432,3111571455,IE -3111571456,3111572479,DE -3111572480,3111573503,PL -3111573504,3111574527,LU -3111574528,3111575551,LB -3111575552,3111576575,FI -3111576576,3111577599,IE -3111577600,3111578623,FI -3111578624,3111579647,US -3111579648,3111580671,BG -3111580672,3111581695,AT -3111581696,3111582719,DK -3111582720,3111583743,IL -3111583744,3111584767,RU -3111584768,3111585791,IR -3111585792,3111586815,DE -3111586816,3111587839,PL -3111587840,3111588863,DE -3111588864,3111589887,GB -3111589888,3111590911,FR -3111590912,3111591935,NL -3111591936,3111592959,DE -3111592960,3111593983,CH -3111593984,3111595007,US -3111595008,3111596031,AT -3111596032,3111597055,ES -3111597056,3111598079,GB -3111598080,3111599103,RU -3111599104,3111600127,GB -3111600128,3111601151,RU -3111601152,3111602175,GB -3111602176,3111603199,DE -3111603200,3111604223,UA -3111604224,3111605247,TR -3111605248,3111606271,CH -3111606272,3111607039,RS -3111607040,3111607295,BG -3111607296,3111608319,DE -3111608320,3111609343,CZ -3111609344,3111610367,SE -3111610368,3111611391,CH -3111611392,3111612415,GB -3111612416,3111613439,ES -3111613440,3111614463,AT -3111614464,3111615487,PL -3111615488,3111616511,IS -3111616512,3111617535,FI -3111617536,3111618559,GB -3111618560,3111619583,DE -3111619584,3111621631,GB -3111621632,3111622655,PL -3111622656,3111623679,GB -3111623680,3111624703,BE -3111624704,3111625727,AT -3111625728,3111626751,IR -3111626752,3111627775,FR -3111627776,3111628799,GB -3111628800,3111629823,CH -3111629824,3111630847,HU -3111630848,3111631871,PL -3111631872,3111633919,NL -3111633920,3111636991,FR -3111636992,3111638015,PL -3111638016,3111639039,UA -3111639040,3111640063,CZ -3111640064,3111641087,NL -3111641088,3111643135,IT -3111643136,3111644159,GB -3111644160,3111645183,ES -3111645184,3111646207,IR -3111646208,3111647231,IT -3111647232,3111648255,ES -3111648256,3111648767,GB -3111648768,3111649023,NL -3111649024,3111650559,GB -3111650560,3111650815,SG -3111650816,3111651071,TR -3111651072,3111651327,GB -3111651328,3111652351,RO -3111652352,3111652863,GB -3111652864,3111653119,NL -3111653120,3111653375,DK -3111653376,3111654399,RO -3111654400,3111654911,GB -3111654912,3111655167,DE -3111655168,3111655423,FR -3111655424,3111656447,NO -3111656448,3111657471,LB -3111657472,3111658239,GB -3111658240,3111658495,NL -3111658496,3111659519,AL -3111659520,3111660543,IT -3111660544,3111661567,ES -3111661568,3111662591,FI -3111662592,3111663615,GB -3111663616,3111664639,RU -3111664640,3111665663,DE -3111665664,3111666687,PL -3111666688,3111667711,CZ -3111667712,3111668735,GB -3111668736,3111669759,KZ -3111669760,3111670783,IT -3111670784,3111671807,ES -3111671808,3111672831,RU -3111672832,3111673855,MK -3111673856,3111674879,GI -3111674880,3111675903,NO -3111675904,3111676927,ES -3111676928,3111677951,AE -3111677952,3111678975,ES -3111678976,3111679231,GB -3111679232,3111679487,NL -3111679488,3111679999,GB -3111680000,3111681023,IR -3111681024,3111682047,IL -3111682048,3111683071,GB -3111683072,3111684095,UA -3111684096,3111685119,IR -3111685120,3111686143,CH -3111686144,3111687167,RO -3111687168,3111688191,DE -3111688192,3111689215,GB -3111689216,3111690239,DE -3111690240,3111691263,IR -3111691264,3111692287,BE -3111692288,3111693311,IR -3111693312,3111694335,GB -3111694336,3111695359,FR -3111695360,3111696383,RU -3111696384,3111697407,CY -3111697408,3111698431,RU -3111698432,3111701503,IR -3111701504,3111702527,GB -3111702528,3111713791,IR -3111713792,3111714303,RU -3111714304,3111714559,US -3111714560,3111714815,RU -3111714816,3111715839,TJ -3111715840,3111716863,GB -3111716864,3111717887,NL -3111717888,3111718911,AD -3111718912,3111719935,GB -3111719936,3111720959,CY -3111720960,3111721983,GB -3111721984,3111723007,SE -3111723008,3111725055,IT -3111725056,3111726079,AT -3111726080,3111727103,SE -3111727104,3111728127,HR -3111728128,3111729151,AT -3111729152,3111730175,IR -3111730176,3111731199,DK -3111731200,3111732223,SK -3111732224,3111733247,DE -3111733248,3111734271,RU -3111734272,3111735295,GB -3111735296,3111736319,KZ -3111736320,3111737343,RU -3111737344,3111738367,GB -3111738368,3111739391,NL -3111739392,3111740415,DE -3111740416,3111741439,IT -3111741440,3111743487,UA -3111743488,3111744511,NL -3111744512,3111745535,UA -3111745536,3111746559,MD -3111746560,3111747583,TR -3111747584,3111748607,IR -3111748608,3111750655,GB -3111750656,3111751679,FR -3111751680,3111752703,GB -3111752704,3111753727,IT -3111753728,3111754751,BG -3111754752,3111755775,IT -3111755776,3111756543,NO -3111756544,3111756799,US -3111756800,3111757823,NL -3111757824,3111758335,NZ -3111758336,3111758591,NL -3111758592,3111758847,FR -3111758848,3111759871,DK -3111759872,3111760127,IS -3111760128,3111760383,AQ -3111760384,3111760639,GB -3111760640,3111760895,LT -3111760896,3111761919,NL -3111761920,3111762943,SY -3111762944,3111763967,NL -3111763968,3111766015,DE -3111766016,3111767039,HR -3111767040,3111768063,SE -3111768064,3111769087,IT -3111769088,3111770111,DE -3111770112,3111771135,FI -3111771136,3111772159,GB -3111772160,3111773183,NL -3111773184,3111774207,IQ -3111774208,3111775231,ES -3111775232,3111776255,AM -3111776256,3111778303,RU -3111778304,3111779327,GB -3111779328,3111780351,SA -3111780352,3111780607,GB -3111780608,3111781375,US -3111781376,3111782399,DE -3111782400,3111783423,IL -3111783424,3111784447,TR -3111784448,3111785471,GB -3111785472,3111786495,NL -3111786496,3111787519,IT -3111787520,3111788543,RU -3111788544,3111789567,KZ -3111789568,3111790335,GB -3111790336,3111790591,TR -3111790592,3111791615,CZ -3111791616,3111792639,IT -3111792640,3111793663,CH -3111793664,3111794687,SK -3111794688,3111795711,GB -3111795712,3111796735,PL -3111796736,3111798783,GB -3111798784,3111799807,SE -3111799808,3111800831,CH -3111800832,3111801855,IR -3111801856,3111802879,DE -3111802880,3111803903,PL -3111803904,3111804927,LB -3111804928,3111805951,PL -3111805952,3111806975,FR -3111806976,3111807999,PL -3111808000,3111809023,FI -3111809024,3111810047,NO -3111810048,3111811071,NL -3111811072,3111812095,SA -3111812096,3111814143,GB -3111814144,3111815167,IE -3111815168,3111816191,PL -3111816192,3111816447,LT -3111816448,3111816703,GB -3111816704,3111816959,LT -3111816960,3111817215,GB -3111817216,3111819263,PL -3111819264,3111821311,NL -3111821312,3111822335,FR -3111822336,3111823359,GB -3111823360,3111824383,NL -3111824384,3111825407,PL -3111825408,3111825919,GB -3111825920,3111826175,LT -3111826176,3111826431,RU -3111826432,3111827455,DE -3111827456,3111828479,ES -3111828480,3111829503,DK -3111829504,3111830527,NL -3111830528,3111831551,NO -3111831552,3111832575,TR -3111832576,3111836671,GB -3111836672,3111837439,RO -3111837440,3111837695,DE -3111837696,3111838719,IT -3111838720,3111839743,AL -3111839744,3111840767,GB -3111840768,3111841791,CH -3111841792,3111842815,BG -3111843840,3111844863,BE -3111844864,3111845887,IQ -3111845888,3111846911,TR -3111846912,3111847935,GB -3111847936,3111848959,IT -3111848960,3111849983,RU -3111849984,3111851007,KZ -3111851008,3111852031,SA -3111852032,3111853055,FR -3111854080,3111855103,NO -3111855104,3111856127,IT -3111856128,3111858175,RU -3111858176,3111859199,PL -3111859200,3111860223,EE -3111860224,3111861247,ES -3111861248,3111862271,NL -3111863296,3111864319,IR -3111864320,3111865343,FR -3111865344,3111866367,RU -3111866368,3111867391,GB -3111867392,3111868415,FR -3111868416,3111869439,DE -3111869440,3111870463,NO -3111870464,3111871487,GB -3111871488,3111873535,TR -3111873536,3111874559,AT -3111874560,3111875583,GB -3111875584,3111876607,FI -3111876608,3111877631,ES -3111877632,3111878655,PL -3111878656,3111879679,CZ -3111879680,3111880703,FI -3111880704,3111881727,ES -3111881728,3111882751,RO -3111882752,3111886847,GB -3111886848,3111887871,PL -3111887872,3111888895,RU -3111888896,3111889919,IE -3111889920,3111890943,RU -3111890944,3111891967,AT -3111891968,3111892991,FR -3111892992,3111894015,BY -3111894016,3111895039,BG -3111895040,3111896063,RU -3111896064,3111897087,IS -3111897088,3111899135,ES -3111899136,3111900159,IR -3111900160,3111901183,IT -3111901184,3111902207,LU -3111902208,3111903231,RO -3111903232,3111904255,DE -3111904256,3111905279,SE -3111905280,3111906303,IT -3111906304,3111908351,GB -3111908352,3111909375,RO -3111909376,3111912447,GB -3111912448,3111913471,ES -3111913472,3111914495,GB -3111914496,3111915519,RU -3111915520,3111916543,DE -3111916544,3111919615,ES -3111919616,3111920639,RO -3111920640,3111921663,ES -3111922688,3111923711,IT -3111923712,3111924735,DE -3111924736,3111925759,NO -3111925760,3111927807,GB -3111927808,3111928831,DE -3111928832,3111929728,CH -3111929729,3111930879,DE -3111930880,3111931903,NO -3111931904,3111932927,CZ -3111932928,3111933951,TR -3111933952,3111935999,FI -3111936000,3111937023,NO -3111937024,3111940095,ES -3111940096,3111941119,IR -3111941120,3111942143,PL -3111942144,3111943167,DE -3111943168,3111944191,PT -3111944192,3111945215,PL -3111945216,3111946239,CH -3111946240,3111948287,ES -3111948288,3111949311,AT -3111949312,3111950335,IQ -3111950336,3111951359,RU -3111951360,3111952383,IR -3111952384,3111953407,GB -3111953408,3111954431,RU -3111954432,3111955455,UA -3111955456,3111956479,IR -3111956480,3111957503,RU -3111957504,3111958527,IT -3111958528,3111959551,PL -3111959552,3111960575,RU -3111960576,3111962623,DE -3111962624,3111963647,NL -3111963648,3111964671,IE -3111964672,3111965695,RU -3111965696,3111966719,LB -3111966720,3111967743,FR -3111967744,3111969791,DE -3111969792,3111970815,RU -3111970816,3111971839,DE -3111971840,3111972863,FR -3111972864,3111973887,CH -3111973888,3111974911,LB -3111974912,3111975935,RO -3111975936,3111976959,IT -3111976960,3111977983,DE -3111977984,3111979007,PL -3111979008,3111980031,NL -3111980032,3111981055,IL -3111981056,3111982079,RU -3111982080,3111983103,IR -3111983104,3111984127,UA -3111985152,3111986175,TR -3111986176,3111987199,RU -3111987200,3111988223,NL -3111988224,3111989247,KZ -3111989248,3111990015,RU -3111990016,3111990271,US -3111990272,3111991295,FR -3111991296,3111992319,RU -3111992320,3111993343,RS -3111993344,3111994367,US -3111994368,3111995391,IT -3111995392,3111996415,RU -3111996416,3111997439,ES -3111997440,3111998463,DK -3111998464,3111999487,GB -3111999488,3112000511,KZ -3112000512,3112001535,DE -3112001536,3112002559,DK -3112002560,3112003583,RU -3112003584,3112004607,GB -3112004608,3112005631,RO -3112005632,3112006655,RU -3112006656,3112007679,NL -3112007680,3112008703,BA -3112008704,3112009727,PL -3112009728,3112010751,CZ -3112010752,3112011775,PL -3112012800,3112013823,GB -3112013824,3112014847,IT -3112014848,3112017919,LB -3112017920,3112018943,NO -3112018944,3112019967,CH -3112019968,3112020991,NO -3112020992,3112022015,DE -3112022016,3112023039,RS -3112023040,3112024063,LU -3112024064,3112025087,US -3112025088,3112026111,GB -3112026112,3112027135,RU -3112027136,3112028159,CH -3112028160,3112029183,RU -3112029184,3112030207,GB -3112030208,3112031231,AT -3112031232,3112032255,CH -3112032256,3112033279,RU -3112033280,3112034303,DK -3112034304,3112034305,DE -3112034306,3112034306,GB -3112034307,3112034307,PL -3112034308,3112034308,FR -3112034309,3112034309,NL -3112034310,3112034310,AT -3112034311,3112034311,IT -3112034312,3112034312,CH -3112034313,3112034313,CZ -3112034314,3112034314,DK -3112034315,3112034315,ES -3112034316,3112034316,PT -3112034317,3112034317,HU -3112034318,3112034318,SK -3112034319,3112034319,BE -3112034320,3112034320,IE -3112034321,3112034321,NO -3112034322,3112034322,SE -3112034323,3112034323,FI -3112034324,3112034333,DE -3112034334,3112034334,RO -3112034335,3112034335,RS -3112034336,3112034336,IL -3112034337,3112034337,AE -3112034338,3112034338,SA -3112034339,3112034559,DE -3112034560,3112034579,US -3112034580,3112034580,VE -3112034581,3112034581,CO -3112034582,3112034582,BR -3112034583,3112034583,PE -3112034584,3112034584,BO -3112034585,3112034585,CL -3112034586,3112034586,AR -3112034587,3112034587,PY -3112034588,3112034588,UY -3112034589,3112034589,MX -3112034590,3112034817,US -3112034818,3112034818,GB -3112034819,3112034819,PL -3112034820,3112034820,FR -3112034821,3112034821,NL -3112034822,3112034822,AT -3112034823,3112034823,IT -3112034824,3112034824,CH -3112034825,3112034825,CZ -3112034826,3112034826,DK -3112034827,3112034827,ES -3112034828,3112034828,PT -3112034829,3112034829,HU -3112034830,3112034830,SK -3112034831,3112034831,BE -3112034832,3112034832,IE -3112034833,3112034833,NO -3112034834,3112034834,SE -3112034835,3112034835,FI -3112034836,3112034837,DE -3112034838,3112034838,TR -3112034839,3112034839,GR -3112034840,3112034845,US -3112034846,3112034846,RO -3112034847,3112034847,RS -3112034848,3112034848,IL -3112034849,3112034849,AE -3112034850,3112034850,SA -3112034851,3112034857,US -3112034858,3112034858,GB -3112034859,3112034859,PL -3112034860,3112034860,FR -3112034861,3112034861,NL -3112034862,3112034862,AT -3112034863,3112034863,IT -3112034864,3112034864,CH -3112034865,3112034865,CZ -3112034866,3112034866,DK -3112034867,3112034867,ES -3112034868,3112034868,PT -3112034869,3112034869,HU -3112034870,3112034870,SK -3112034871,3112034871,BE -3112034872,3112034872,IE -3112034873,3112034873,NO -3112034874,3112034874,SE -3112034875,3112034875,FI -3112034876,3112034877,DE -3112034878,3112034878,TR -3112034879,3112034879,GR -3112034880,3112034885,US -3112034886,3112034886,RO -3112034887,3112034887,RS -3112034888,3112034888,IL -3112034889,3112034889,AE -3112034890,3112034890,SA -3112034891,3112035091,US -3112035092,3112035092,CA -3112035093,3112035093,US -3112035094,3112035097,CA -3112035098,3112035327,US -3112035328,3112036351,RU -3112036352,3112038399,NL -3112038400,3112039423,IS -3112039424,3112047615,IR -3112047616,3112048639,AT -3112048640,3112049663,GB -3112049664,3112050687,DE -3112051712,3112052735,NO -3112052736,3112053759,IR -3112053760,3112054783,LB -3112054784,3112055807,BE -3112055808,3112056831,DK -3112056832,3112057855,NL -3112057856,3112058879,IS -3112058880,3112059903,NL -3112059904,3112062975,RO -3112062976,3112063999,ES -3112064000,3112065023,RU -3112065024,3112066047,PT -3112066048,3112067071,RU -3112067072,3112068095,ES -3112068096,3112069119,DE -3112069120,3112070143,ES -3112070144,3112071167,DK -3112071168,3112072191,UA -3112072192,3112073215,RO -3112073216,3112074239,NL -3112074240,3112075263,IR -3112075264,3112076287,RU -3112076288,3112077311,IR -3112077312,3112078335,GB -3112078336,3112079359,IT -3112079360,3112080383,IR -3112080384,3112081407,GB -3112081408,3112082431,DK -3112082432,3112083455,IR -3112083456,3112085503,GB -3112085504,3112086527,DE -3112086528,3112087551,GB -3112087552,3112088575,TR -3112088576,3112089599,RU -3112089600,3112090623,NO -3112090624,3112091647,PL -3112091648,3112092671,RU -3112092672,3112093695,SK -3112093696,3112094719,IR -3112094720,3112095743,IT -3112095744,3112096767,AT -3112096768,3112097791,DE -3112097792,3112098815,TR -3112098816,3112099839,CH -3112099840,3112100863,GB -3112100864,3112101887,FR -3112102912,3112103935,GB -3112103936,3112104959,DE -3112104960,3112105983,FR -3112105984,3112107007,GB -3112107008,3112108031,UA -3112108032,3112109055,LT -3112109056,3112110079,FR -3112110080,3112111103,IL -3112111104,3112112127,NL -3112112128,3112113151,GB -3112113152,3112114175,PL -3112114176,3112115199,RU -3112115200,3112116223,DE -3112116224,3112118271,IT -3112118272,3112119295,NO -3112119296,3112120319,GB -3112120320,3112121343,DK -3112121344,3112122367,ES -3112122368,3112123391,GB -3112123392,3112124415,FI -3112124416,3112125439,AM -3112125440,3112126463,GB -3112126464,3112127487,FI -3112127488,3112128511,GB -3112128512,3112129535,FR -3112129536,3112130559,FI -3112130560,3112131583,DK -3112131584,3112132607,GB -3112132608,3112133631,DK -3112133632,3112134655,NO -3112134656,3112136703,NL -3112136704,3112137727,CH -3112137728,3112138751,ES -3112138752,3112139775,PL -3112139776,3112140799,LB -3112140800,3112141569,ES -3112141570,3112141570,FR -3112141571,3112141571,DE -3112141572,3112141823,ES -3112141824,3112142847,IT -3112142848,3112143871,NL -3112143872,3112144895,GB -3112144896,3112145919,ES -3112145920,3112146943,RU -3112146944,3112148991,GB -3112148992,3112150015,PT -3112150016,3112151039,RU -3112151040,3112152063,NO -3112152064,3112153087,CH -3112153088,3112154111,IR -3112154112,3112155135,LB -3112155136,3112156159,NL -3112156160,3112157183,LB -3112157184,3112158207,GB -3112158208,3112159231,IT -3112159232,3112160255,NL -3112160256,3112161279,CH -3112161280,3112162303,DE -3112162304,3112163327,IT -3112163328,3112164351,RS -3112164352,3112165375,IT -3112165376,3112166399,RU -3112166400,3112167423,SE -3112167424,3112168447,IR -3112168448,3112169471,IT -3112169472,3112170495,FR -3112170496,3112171519,UA -3112171520,3112172543,GB -3112172544,3112173567,NO -3112173568,3112174591,SE -3112174592,3112175615,RU -3112175616,3112176639,UA -3112176640,3112177663,ES -3112177664,3112178687,FI -3112178688,3112179711,PL -3112180736,3112181759,IT -3112181760,3112182783,NL -3112182784,3112183807,IQ -3112183808,3112184831,CH -3112184832,3112185855,DE -3112185856,3112186879,IR -3112186880,3112187903,ES -3112187904,3112188927,GB -3112188928,3112189951,ES -3112189952,3112190975,NL -3112190976,3112191999,DE -3112192000,3112193023,DK -3112193024,3112194047,IT -3112194048,3112195071,IR -3112195072,3112196095,RU -3112196096,3112197119,NL -3112197120,3112198143,UA -3112198144,3112199167,RO -3112199168,3112200191,DK -3112200192,3112200959,RU -3112200960,3112201215,GB -3112201216,3112202239,DE -3112202240,3112203263,TR -3112203264,3112205311,DE -3112205312,3112206335,LB -3112206336,3112207359,ES -3112207360,3112208383,GB -3112208384,3112209407,IR -3112209408,3112210431,FR -3112210432,3112211455,NO -3112211456,3112212479,IT -3112212480,3112213503,IR -3112213504,3112214527,PL -3112214528,3112215551,FI -3112215552,3112216575,IR -3112216576,3112217599,ES -3112217600,3112218623,CH -3112218624,3112219647,GB -3112219648,3112220671,SY -3112220672,3112221695,NL -3112221696,3112222719,DE -3112222720,3112223743,ES -3112223744,3112224767,RU -3112224768,3112225791,BY -3112225792,3112227839,GB -3112227840,3112228863,RU -3112228864,3112229887,DE -3112229888,3112231935,GB -3112231936,3112232959,HU -3112232960,3112233983,UA -3112233984,3112235007,FR -3112235008,3112236031,RO -3112236032,3112237055,AT -3112237056,3112238079,SI -3112238080,3112239103,FI -3112239104,3112240127,AZ -3112240128,3112241151,IQ -3112241152,3112242175,GB -3112242176,3112243199,HR -3112243200,3112244223,TR -3112244224,3112245247,GB -3112245248,3112246271,NO -3112246272,3112247295,ES -3112247296,3112248319,PL -3112248320,3112249343,RO -3112249344,3112250367,ES -3112250368,3112251391,FR -3112251392,3112252415,KZ -3112252416,3112253439,CH -3112253440,3112254463,RU -3112254464,3112255487,DK -3112255488,3112256511,NO -3112256512,3112257535,NL -3112257536,3112258559,GB -3112258560,3112259583,PL -3112259584,3112260607,IR -3112260608,3112261631,DE -3112261632,3112262655,IT -3112262656,3112263679,AZ -3112263680,3112265727,RU -3112265728,3112266751,ES -3112266752,3112267775,IR -3112267776,3112268799,PL -3112268800,3112269823,IR -3112269824,3112270847,RS -3112270848,3112271871,IR -3112271872,3112272895,UA -3112272896,3112273919,IE -3112273920,3112274943,CZ -3112274944,3112275967,IR -3112275968,3112276991,RU -3112276992,3112278015,LV -3112278016,3112279039,FI -3112279040,3112280063,NO -3112281088,3112282111,FR -3112282112,3112283135,IR -3112283136,3112284159,AT -3112284160,3112285183,GB -3112285184,3112286207,DE -3112286208,3112288255,IR -3112288256,3112289279,KZ -3112289280,3112291327,IR -3112291328,3112292351,RU -3112292352,3112293375,GB -3112293376,3112295423,IR -3112295424,3112296575,GB -3112296576,3112296639,ES -3112296640,3112296687,GB -3112296688,3112296703,US -3112296704,3112297471,GB -3112297472,3112301567,IR -3112301568,3112302591,DE -3112302592,3112303615,ES -3112303616,3112304639,DE -3112304640,3112305663,SE -3112306688,3112307711,DE -3112307712,3112308735,IS -3112308736,3112309759,HR -3112309760,3112310783,DE -3112310784,3112312831,ES -3112312832,3112313855,DE -3112313856,3112315903,GB -3112315904,3112316927,PL -3112316928,3112317951,IQ -3112317952,3112318975,UA -3112320000,3112321023,IQ -3112321024,3112322047,FI -3112322048,3112323071,NO -3112323072,3112324095,NL -3112324096,3112325119,IR -3112325120,3112326143,RU -3112326144,3112327167,IL -3112327168,3112328191,RU -3112328192,3112329215,GB -3112329216,3112330239,DK -3112330240,3112331263,GB -3112331264,3112331519,RU -3112331520,3112332287,NL -3112332288,3112333311,PL -3112333312,3112334335,RU -3112334336,3112335359,FR -3112335360,3112336383,GB -3112336384,3112337407,RS -3112337408,3112338431,BE -3112338432,3112339455,MK -3112339456,3112340479,LB -3112340480,3112341503,CH -3112341504,3112342527,ES -3112342528,3112343551,BE -3112343552,3112344575,ES -3112344576,3112345599,GB -3112345600,3112346623,DK -3112346624,3112347647,SE -3112347648,3112349695,NL -3112349696,3112350719,HU -3112350720,3112351743,PL -3112352768,3112353791,DK -3112353792,3112354815,DE -3112354816,3112355839,GB -3112355840,3112356863,ES -3112356864,3112357887,DE -3112357888,3112358911,PL -3112358912,3112359935,RU -3112359936,3112360959,ES -3112360960,3112361983,SK -3112361984,3112364031,NL -3112364032,3112365055,RU -3112365056,3112366079,US -3112366080,3112367103,NL -3112367104,3112368127,NO -3112368128,3112369151,RU -3112369152,3112370175,AT -3112370176,3112371199,LU -3112371200,3112372223,CH -3112372224,3112373247,GB -3112373248,3112374271,ES -3112374272,3112375295,IT -3112375296,3112376319,SE -3112376320,3112377343,NL -3112377344,3112378367,IR -3112378368,3112379391,PL -3112379392,3112380415,LB -3112380416,3112382463,FR -3112382464,3112383487,TR -3112383488,3112384511,ES -3112384512,3112385535,AE -3112385536,3112386559,CZ -3112386560,3112386815,RU -3112386816,3112387071,DE -3112387072,3112387327,NL -3112387328,3112387583,RU -3112387584,3112388607,HK -3112388608,3112389631,DE -3112389632,3112390655,SA -3112390656,3112391679,FR -3112391680,3112394751,IR -3112394752,3112395775,SA -3112395776,3112396799,IR -3112396800,3112397823,RU -3112397824,3112400895,IR -3112400896,3112401919,DE -3112401920,3112403967,IR -3112403968,3112404991,ES -3112404992,3112407039,IR -3112407040,3112408063,AE -3112408064,3112411135,IR -3112411136,3112412159,IT -3112412160,3112414207,IR -3112414208,3112415231,RU -3112415232,3112416255,AE -3112416256,3112417279,RU -3112417280,3112419327,ES -3112419328,3112420351,FR -3112420352,3112421375,DE -3112421376,3112423423,GB -3112423424,3112424447,TR -3112424448,3112425471,IT -3112425472,3112426495,FI -3112426496,3112427519,FR -3112427520,3112428543,PL -3112428544,3112430591,GB -3112430592,3112431615,DE -3112431616,3112432639,PL -3112432640,3112433663,CZ -3112433664,3112435711,IT -3112435712,3112436735,UA -3112436736,3112437759,BG -3112437760,3112439807,GB -3112439808,3112440831,CH -3112440832,3112441855,RU -3112441856,3112442879,DE -3112442880,3112443903,RU -3112443904,3112447999,DE -3112448000,3112449023,LT -3112449024,3112450047,PL -3112450048,3112451071,IT -3112451072,3112452095,LU -3112452096,3112453119,FR -3112453120,3112454143,IT -3112454144,3112455167,FR -3112455168,3112456191,GB -3112456192,3112457215,IR -3112457216,3112458239,GB -3112458240,3112459263,ES -3112459264,3112460287,AL -3112460288,3112461311,AT -3112461312,3112462335,FR -3112462336,3112463359,FI -3112463360,3112464383,RO -3112464384,3112465407,CZ -3112465408,3112466431,FR -3112466432,3112468479,TR -3112468480,3112469503,CH -3112469504,3112470527,AE -3112470528,3112472575,ES -3112472576,3112473599,RS -3112473600,3112474623,LB -3112474624,3112475647,GB -3112475648,3112476671,IL -3112476672,3112477695,ME -3112477696,3112479743,AE -3112479744,3112480767,RO -3112480768,3112481791,AE -3112481792,3112482815,NL -3112482816,3112485887,AE -3112485888,3112486911,RU -3112486912,3112487935,AE -3112487936,3112488959,KW -3112488960,3112489983,DE -3112489984,3112491007,IR -3112491008,3112492031,SE -3112492032,3112494079,DE -3112494080,3112495103,IT -3112497152,3112498175,RU -3112498176,3112499199,GB -3112499200,3112500223,PS -3112500224,3112501247,NL -3112501248,3112502271,RU -3112502272,3112503295,ES -3112503296,3112505343,DE -3112505344,3112506367,EG -3112506368,3112507391,BG -3112507392,3112508415,DE -3112508416,3112509439,CH -3112509440,3112511487,NL -3112511488,3112512511,RU -3112512512,3112514559,CH -3112514560,3112515583,FR -3112515584,3112516607,CZ -3112516608,3112517631,SK -3112517632,3112518655,RO -3112518656,3112519679,SE -3112519680,3112520191,NL -3112520192,3112520447,GB -3112520448,3112520703,US -3112520704,3112521727,PT -3112521728,3112522751,FR -3112522752,3112523775,SA -3112523776,3112524799,PL -3112524800,3112525823,IT -3112525824,3112526847,ES -3112526848,3112527871,CZ -3112527872,3112528895,DE -3112528896,3112529919,NL -3112529920,3112530943,DE -3112530944,3112531967,FR -3112531968,3112532991,ES -3112532992,3112534015,KW -3112534016,3112535039,FR -3112535040,3112536063,HR -3112536064,3112537087,CZ -3112537088,3112538111,NO -3112538112,3112539135,CZ -3112539136,3112540159,NL -3112540160,3112541183,IR -3112541184,3112542207,GB -3112542208,3112543231,PL -3112543232,3112544255,IR -3112544256,3112545279,GB -3112545280,3112546303,DE -3112546304,3112547327,GB -3112547328,3112548351,SA -3112548352,3112549375,SI -3112549376,3112550399,CZ -3112550400,3112550911,GB -3112550912,3112551167,RO -3112551168,3112551423,US -3112551424,3112552447,CZ -3112552448,3112553471,ES -3112553472,3112554495,SE -3112554496,3112555519,CH -3112555520,3112556543,IR -3112556544,3112557567,IT -3112557568,3112558591,GB -3112558592,3112559615,IQ -3112559616,3112560639,RU -3112560640,3112561663,FR -3112561664,3112562687,DE -3112562688,3112563711,CZ -3112563712,3112564735,AE -3112564736,3112565759,GB -3112565760,3112566783,US -3112566784,3112567807,CZ -3112567808,3112568831,DE -3112568832,3112569855,IT -3112569856,3112571903,SE -3112571904,3112572927,DE -3112572928,3112573951,BE -3112573952,3112574975,DK -3112574976,3112577023,RU -3112577024,3112578047,ES -3112578048,3112579071,DE -3112579072,3112580095,GB -3112580096,3112581119,IT -3112581120,3112582143,NL -3112582144,3112583167,CZ -3112583168,3112584191,NL -3112584192,3112585215,IT -3112585216,3112586239,RU -3112586240,3112587263,LU -3112587264,3112588287,HU -3112588288,3112589311,DE -3112589312,3112590335,FI -3112590336,3112591359,SE -3112591360,3112592383,IR -3112592384,3112593407,FI -3112593408,3112594431,GB -3112594432,3112595455,DE -3112595456,3112596479,GR -3112596480,3112597503,CY -3112597504,3112598527,RU -3112598528,3112599551,NO -3112599552,3112600575,DE -3112600576,3112601599,SY -3112601600,3112602623,ES -3112602624,3112603647,IT -3112603648,3112604671,IE -3112604672,3112605695,RU -3112605696,3112606719,IT -3112606720,3112607743,FR -3112607744,3112608767,CZ -3112608768,3112609791,CH -3112609792,3112610815,TJ -3112610816,3112611839,GE -3112611840,3112612863,LB -3112612864,3112613887,GB -3112613888,3112614911,TR -3112614912,3112615935,SK -3112615936,3112616959,BG -3112616960,3112617983,CH -3112617984,3112620031,RU -3112620032,3112621055,NL -3112621056,3112622079,SK -3112622080,3112623103,NL -3112623104,3112624127,DE -3112624128,3112625151,GB -3112625152,3112626175,BG -3112626176,3112627199,RU -3112627200,3112628223,KZ -3112628224,3112629247,DE -3112629248,3112630271,NO -3112630272,3112631295,NL -3112631296,3112632319,DK -3112632320,3112633343,PL -3112633344,3112634367,CZ -3112634368,3112635135,DE -3112635136,3112635263,BY -3112635264,3112635391,DE -3112635392,3112636415,BE -3112636416,3112637439,AT -3112637440,3112637951,CZ -3112637952,3112638463,SK -3112638464,3112639487,DE -3112639488,3112640511,IR -3112640512,3112641535,DE -3112641536,3112642559,GB -3112642560,3112644607,TR -3112644608,3112645631,SY -3112645632,3112646655,DE -3112646656,3112647679,GB -3112647680,3112648703,DK -3112648704,3112649727,RO -3112649728,3112650751,IQ -3112650752,3112652799,IR -3112652800,3112653823,RU -3112653824,3112654847,IR -3112654848,3112655871,PL -3112655872,3112656895,IT -3112656896,3112657919,TR -3112657920,3112658943,IT -3112658944,3112659967,GB -3112659968,3112660991,TR -3112660992,3112662015,IT -3112662016,3112663039,ES -3112663040,3112664063,PL -3112664064,3112665087,FR -3112665088,3112666111,GB -3112666112,3112667135,CZ -3112669184,3112670207,CZ -3112670208,3112671231,RU -3112671232,3112672255,US -3112672256,3112673279,DE -3112673280,3112674303,FR -3112674304,3112676351,GB -3112676352,3112677375,RU -3112677376,3112678399,FR -3112678400,3112679423,RU -3112679424,3112680447,NO -3112680448,3112681471,IQ -3112681472,3112682495,PL -3112682496,3112683519,CZ -3112683520,3112684543,JO -3112684544,3112685567,ES -3112685568,3112687615,GB -3112687616,3112688639,FR -3112688640,3112689663,TR -3112689664,3112690687,PL -3112690688,3112691711,IR -3112691712,3112692735,RU -3112692736,3112693759,FR -3112693760,3112694783,NL -3112694784,3112695807,GB -3112695808,3112696831,LU -3112696832,3112697855,US -3112697856,3112699903,NL -3112699904,3112700927,RO -3112700928,3112701951,KZ -3112701952,3112702975,MD -3112702976,3112703231,SE -3112703232,3112703487,FI -3112703488,3112703743,DK -3112703744,3112703999,NO -3112704000,3112705023,DE -3112705024,3112706047,ES -3112706048,3112707071,RU -3112707072,3112708095,FI -3112708096,3112709119,FR -3112709120,3112710143,DK -3112710144,3112711167,NO -3112711168,3112712191,PT -3112712192,3112713215,TR -3112713216,3112714239,AT -3112714240,3112715263,NL -3112715264,3112717311,GB -3112717312,3112718335,RU -3112718336,3112719359,AT -3112719360,3112720383,TR -3112720384,3112721407,ES -3112721408,3112722431,PL -3112722432,3112722687,US -3112722688,3112722943,BG -3112722944,3112723199,US -3112723200,3112723455,BG -3112723456,3112724479,IR -3112724480,3112725503,GB -3112725504,3112726527,CZ -3112726528,3112727551,DE -3112727552,3112728575,DK -3112728576,3112729599,CH -3112729600,3112730623,IT -3112730624,3112731647,NO -3112731648,3112732671,PL -3112732672,3112733695,IT -3112733696,3112734719,DE -3112734720,3112735743,SY -3112735744,3112736767,IQ -3112736768,3112737791,PL -3112737792,3112741887,DE -3112741888,3112742911,IR -3112742912,3112743935,RO -3112743936,3112744959,IR -3112744960,3112745983,US -3112745984,3112747007,NL -3112747008,3112748031,IR -3112748032,3112750079,CZ -3112750080,3112751103,TR -3112751104,3112752127,BE -3112752128,3112753151,AT -3112753152,3112754175,ES -3112754176,3112755199,IR -3112755200,3112756223,PL -3112756224,3112757247,AT -3112757248,3112758271,GB -3112758272,3112759295,NL -3112759296,3112760319,IQ -3112760320,3112762367,GB -3112762368,3112763391,IE -3112763392,3112764415,GB -3112764416,3112765439,NO -3112765440,3112766463,GB -3112766464,3112767487,DE -3112767488,3112768018,NL -3112768019,3112768019,RU -3112768020,3112768511,NL -3112768512,3112769535,IE -3112769536,3112770559,IR -3112770560,3112771583,DE -3112771584,3112772607,NL -3112772608,3112773631,UA -3112773632,3112774655,BE -3112774656,3112775679,ES -3112775680,3112776703,PL -3112776704,3112778751,ES -3112778752,3112779775,IR -3112779776,3112780799,GB -3112780800,3112781823,ES -3112781824,3112782847,FR -3112782848,3112783871,RU -3112783872,3112784895,NL -3112784896,3112785919,IT -3112785920,3112786943,TR -3112786944,3112787967,DE -3112787968,3112788991,LU -3112788992,3112791039,ES -3112791040,3112792063,IR -3112792064,3112793087,DK -3112793088,3112794111,BY -3112794112,3112795135,DE -3112795136,3112796159,CZ -3112796160,3112797183,GB -3112797184,3112798207,RO -3112798208,3112799231,DE -3112799232,3112800255,ES -3112800256,3112801279,CZ -3112801280,3112802303,PL -3112802304,3112803327,ES -3112803328,3112804351,RO -3112804352,3112805375,RU -3112805376,3112806399,CH -3112806400,3112807423,DE -3112807424,3112808447,CH -3112808448,3112809471,RU -3112809472,3112809727,GB -3112809728,3112809983,BG -3112809984,3112810495,NL -3112810496,3112811519,DE -3112811520,3112812543,SE -3112812544,3112814591,GB -3112814592,3112815615,NL -3112815616,3112816639,IT -3112816640,3112817663,NL -3112817664,3112818687,TR -3112818688,3112819711,UA -3112819712,3112820735,GB -3112820736,3112821759,IT -3112821760,3112822783,FR -3112822784,3112823807,RU -3112823808,3112824831,CH -3112824832,3112825855,GB -3112825856,3112826879,SA -3112826880,3112827903,PL -3112827904,3112828927,FR -3112828928,3112829951,GB -3112829952,3112830975,DE -3112830976,3112831999,RU -3112832000,3112833023,AZ -3112833024,3112834047,ES -3112834048,3112835071,CH -3112835072,3112836095,DE -3112836096,3112836607,ES -3112836608,3112836863,SE -3112836864,3112837119,ES -3112837120,3112838143,NO -3112838144,3112839167,IT -3112839168,3112840191,GR -3112840192,3112841215,CZ -3112841216,3112842239,FI -3112842240,3112843263,DE -3112843264,3112844287,NL -3112844288,3112845311,GB -3112845312,3112846335,SE -3112846336,3112847359,CZ -3112847360,3112848383,NO -3112848384,3112849407,UA -3112849408,3112850431,NL -3112850432,3112851455,TR -3112851456,3112852479,RU -3112852480,3112853503,ES -3112853504,3112854527,BE -3112854528,3112855551,KG -3112855552,3112856575,FR -3112856576,3112857599,CZ -3112857600,3112858623,IE -3112858624,3112859647,FR -3112859648,3112860671,IQ -3112860672,3112861695,AT -3112861696,3112862719,RU -3112862720,3112863743,GB -3112863744,3112865791,DE -3112865792,3112866815,DK -3112866816,3112867839,FR -3112867840,3112869887,GB -3112869888,3112870911,RU -3112870912,3112871935,DE -3112871936,3112872959,IL -3112872960,3112873983,IS -3112873984,3112875007,BG -3112875008,3112876031,RU -3112876032,3112877055,KG -3112877056,3112878079,CZ -3112878080,3112880127,GB -3112880128,3112882175,RU -3112882176,3112883199,NL -3112883200,3112884223,RU -3112884224,3112885247,IT -3112885248,3112886271,CZ -3112886272,3112887295,PL -3112887296,3112888319,UA -3112888320,3112889343,GB -3112889344,3112890367,PL -3112890368,3112891391,NL -3112891392,3112892415,CZ -3112892416,3112893439,NL -3112893440,3112894463,RU -3112894464,3112895487,DE -3112895488,3112896511,BG -3112896512,3112897535,SA -3112897536,3112898559,LB -3112898560,3112899583,PL -3112899584,3112900607,FR -3112900608,3112901631,GB -3112901632,3112902655,IT -3112902656,3112903679,DE -3112903680,3112904703,GB -3112904704,3112905727,PL -3112905728,3112906751,BE -3112906752,3112907775,IT -3112907776,3112908799,UA -3112908800,3112909823,GE -3112909824,3112910847,ES -3112910848,3112911871,IR -3112911872,3112912895,RO -3112912896,3112914943,DE -3112914944,3112916991,DK -3112916992,3112918015,NO -3112918016,3112920063,DE -3112920064,3112921087,DK -3112921088,3112922111,IT -3112922112,3112923135,RU -3112923136,3112924159,DE -3112924160,3112925183,GE -3112925184,3112926207,SA -3112926208,3112927231,PL -3112927232,3112928255,US -3112928256,3112929279,FR -3112929280,3112930303,UZ -3112930304,3112931327,GB -3112931328,3112932351,US -3112932352,3112933375,NL -3112933376,3112934399,NO -3112934400,3112935423,DE -3112935424,3112937471,NO -3112937472,3112938495,FI -3112938496,3112939519,NO -3112939520,3112940543,ES -3112940544,3112941567,IT -3112941568,3112942591,CH -3112942592,3112943615,NO -3112943616,3112944639,ES -3112944640,3112945663,TR -3112945664,3112946687,UA -3112946688,3112947711,DE -3112947712,3112948735,AT -3112948736,3112949759,RU -3112949760,3112950783,CZ -3112950784,3112951807,JO -3112951808,3112952831,SK -3112952832,3112953855,IL -3112953856,3112954879,DK -3112954880,3112954917,RS -3112954918,3112954918,DE -3112954919,3112955007,RS -3112955008,3112955008,DE -3112955009,3112955135,AE -3112955136,3112955263,QA -3112955264,3112955391,KW -3112955392,3112955903,DE -3112955904,3112956927,IL -3112956928,3112958975,FR -3112958976,3112959999,EE -3112960000,3112961023,DK -3112961024,3112962047,IR -3112962048,3112963071,GB -3112963072,3112964095,IR -3112964096,3112965119,GB -3112965120,3112966143,NL -3112966144,3112967167,PL -3112967168,3112968191,SK -3112968192,3112969215,ES -3112969216,3112970239,DE -3112970240,3112971263,SK -3112971264,3112972287,FR -3112972288,3112973311,US -3112973312,3112973567,SE -3112973568,3112973823,DE -3112973824,3112974079,UA -3112974080,3112974083,HU -3112974084,3112974087,AT -3112974088,3112974335,HU -3112974336,3112975359,IR -3112975360,3112977407,ES -3112977408,3112978431,FR -3112978432,3112979455,NL -3112979456,3112980479,PL -3112980480,3112981503,GB -3112981504,3112982527,AT -3112982528,3112983551,CH -3112983552,3112984575,IE -3112984576,3112985599,AE -3112985600,3112986623,PL -3112986624,3112987647,DE -3112987648,3112988927,HU -3112988928,3112989042,NL -3112989043,3112989043,AT -3112989044,3112989183,NL -3112989184,3112989439,ES -3112989440,3112989695,AT -3112989696,3112990719,SE -3112990720,3112991743,PL -3112991744,3112992767,TR -3112992768,3112993791,FR -3112993792,3112994815,RU -3112994816,3112995839,FR -3112995840,3112996863,AT -3112996864,3112997887,GB -3112997888,3112998911,RU -3112998912,3112999935,IT -3112999936,3113000959,NL -3113000960,3113001983,RU -3113001984,3113003007,NL -3113003008,3113004031,IT -3113004032,3113006079,US -3113006080,3113007103,PS -3113007104,3113008127,NL -3113008128,3113009151,ES -3113009152,3113010175,IQ -3113010176,3113011199,FR -3113011200,3113012223,DE -3113012224,3113013247,US -3113013248,3113014271,RU -3113014272,3113016319,ES -3113017344,3113018367,NL -3113018368,3113019391,LT -3113019392,3113020415,IR -3113020416,3113021439,CZ -3113021440,3113022463,IR -3113022464,3113023487,CZ -3113023488,3113024511,AE -3113024512,3113025535,DE -3113025536,3113026559,CH -3113026560,3113027583,FR -3113027584,3113028607,IQ -3113028608,3113029631,AE -3113029632,3113030655,ES -3113030656,3113031679,CH -3113031680,3113032447,RO -3113032448,3113032703,NL -3113032704,3113033727,SE -3113033728,3113034751,TR -3113034752,3113035775,IR -3113035776,3113036799,RU -3113036800,3113037823,ES -3113037824,3113038847,IR -3113038848,3113039871,LV -3113039872,3113040895,GB -3113041920,3113042943,DE -3113042944,3113043967,DK -3113043968,3113044991,NO -3113044992,3113046015,RU -3113046016,3113047039,FI -3113047040,3113048063,IT -3113048064,3113049087,NO -3113049088,3113050111,RU -3113050112,3113051135,FI -3113052160,3113053183,IR -3113053184,3113054207,TR -3113054208,3113055231,SE -3113055232,3113056255,FR -3113056256,3113057279,DE -3113057280,3113058303,RU -3113058304,3113059327,FR -3113059328,3113060351,IR -3113060352,3113061375,PL -3113061376,3113062399,GB -3113062400,3113063423,DK -3113063424,3113064447,DE -3113064448,3113065471,SE -3113065472,3113066495,NO -3113066496,3113067519,LT -3113067520,3113067935,DE -3113067936,3113067936,US -3113067937,3113068543,DE -3113068544,3113069567,IR -3113069568,3113070591,IT -3113070592,3113071615,GB -3113071616,3113072639,RU -3113072640,3113073663,IT -3113073664,3113074687,RS -3113074688,3113074943,GB -3113074944,3113075199,GR -3113075200,3113075455,CY -3113075456,3113075711,GB -3113075712,3113076735,HU -3113076736,3113077759,DE -3113077760,3113078015,GB -3113078016,3113078271,NL -3113078272,3113078783,GB -3113078784,3113079807,BE -3113079808,3113080831,IR -3113080832,3113081855,TR -3113081856,3113082879,ES -3113083904,3113084927,IT -3113084928,3113086975,RU -3113086976,3113087999,ES -3113088000,3113089023,IR -3113089024,3113090047,MT -3113090048,3113091071,GB -3113091072,3113093119,NL -3113093120,3113094143,DE -3113094144,3113095167,ES -3113095168,3113096191,GB -3113096192,3113097215,IT -3113097216,3113097471,DE -3113097472,3113097727,GB -3113097728,3113097983,DE -3113097984,3113098239,GB -3113098240,3113099263,IE -3113099264,3113100287,NL -3113100288,3113102335,LB -3113102336,3113103359,ES -3113103360,3113104383,SK -3113104384,3113105407,FR -3113105408,3113106431,PS -3113106432,3113107455,ES -3113107456,3113108479,RU -3113108480,3113109503,IT -3113109504,3113110527,SE -3113110528,3113111551,NL -3113111552,3113112575,NO -3113112576,3113113599,GB -3113113600,3113114623,IT -3113114624,3113115647,IR -3113116672,3113117695,NL -3113117696,3113118719,KW -3113118720,3113120767,DE -3113120768,3113121791,GB -3113121792,3113122815,IT -3113122816,3113123839,IR -3113123840,3113124863,GB -3113124864,3113125887,VG -3113125888,3113126911,FR -3113126912,3113127167,DE -3113127168,3113127423,GB -3113127424,3113127935,AT -3113127936,3113128959,NL -3113128960,3113129983,CH -3113129984,3113131007,IT -3113131008,3113132031,IR -3113132032,3113133055,PL -3113133056,3113134079,UA -3113134080,3113136127,IT -3113136128,3113139199,DE -3113139200,3113140223,FR -3113140224,3113141247,ES -3113141248,3113142271,NO -3113142272,3113143295,ES -3113143296,3113144319,PL -3113144320,3113145343,CZ -3113145344,3113146367,CH -3113146368,3113147391,RO -3113147392,3113148415,ES -3113148416,3113149439,BE -3113149440,3113150463,DE -3113150464,3113151487,IR -3113151488,3113151743,NL -3113151744,3113151999,SE -3113152000,3113152511,NL -3113152512,3113153535,SG -3113153536,3113154559,IT -3113154560,3113156607,NL -3113156608,3113157631,ES -3113157632,3113160703,DE -3113160704,3113160959,IE -3113160960,3113161727,DE -3113161728,3113162751,KZ -3113162752,3113163775,SA -3113163776,3113164799,NL -3113164800,3113165823,PL -3113165824,3113166847,GB -3113166848,3113167871,IQ -3113167872,3113168895,RS -3113168896,3113169919,HU -3113169920,3113170943,NL -3113170944,3113171967,UA -3113171968,3113172991,FI -3113172992,3113175039,DE -3113175040,3113176063,IR -3113176064,3113177087,GB -3113177088,3113178111,BG -3113178112,3113179135,GB -3113179136,3113180159,RU -3113180160,3113182207,ES -3113182208,3113183231,UA -3113183232,3113184255,NL -3113184256,3113185279,RU -3113185280,3113186303,CZ -3113186304,3113187327,PL -3113187328,3113188351,RS -3113188352,3113189375,BH -3113190400,3113191423,NL -3113191424,3113193471,ES -3113193472,3113194495,UA -3113194496,3113195519,SE -3113195520,3113196543,IT -3113196544,3113197567,NL -3113197568,3113198591,PL -3113198592,3113200639,DE -3113200640,3113201663,RU -3113201664,3113202687,GE -3113202688,3113203711,AT -3113203712,3113204735,GB -3113204736,3113205759,BE -3113205760,3113206783,HR -3113206784,3113207807,AZ -3113207808,3113208831,HU -3113208832,3113209855,IR -3113209856,3113210879,NO -3113210880,3113211903,GB -3113211904,3113212927,NO -3113213952,3113214975,GB -3113214976,3113215087,DE -3113215088,3113215091,GB -3113215092,3113215359,DE -3113215360,3113215391,GB -3113215392,3113215471,DE -3113215472,3113215487,GB -3113215488,3113215615,DE -3113215616,3113215647,GB -3113215648,3113215727,DE -3113215728,3113215743,FI -3113215744,3113215839,DE -3113215840,3113215871,GB -3113215872,3113215983,DE -3113215984,3113215999,GB -3113216000,3113217023,US -3113217024,3113218047,FR -3113218048,3113219071,NL -3113219072,3113220095,FR -3113220096,3113221119,GB -3113221120,3113222143,DK -3113222144,3113223167,GB -3113223168,3113224191,NL -3113224192,3113225215,DE -3113225216,3113226239,TR -3113226240,3113227263,DE -3113227264,3113228287,NL -3113228288,3113230335,RU -3113230336,3113231359,FR -3113231360,3113232383,CH -3113232384,3113233407,LB -3113233408,3113234431,FR -3113234432,3113235455,DE -3113235456,3113236479,ES -3113236480,3113237503,NL -3113237504,3113238527,RU -3113238528,3113239551,IR -3113239552,3113240575,US -3113240576,3113241599,IT -3113241600,3113242623,TR -3113242624,3113243647,RO -3113243648,3113244671,US -3113244672,3113245695,GB -3113245696,3113245951,AT -3113245952,3113246719,DE -3113246720,3113246975,SK -3113246976,3113247231,RU -3113247232,3113247487,FR -3113247488,3113247743,RU -3113247744,3113247999,NL -3113248000,3113248767,GB -3113248768,3113249791,NL -3113249792,3113250815,GB -3113250816,3113251839,FR -3113251840,3113252863,LT -3113252864,3113253887,IT -3113253888,3113254911,IE -3113254912,3113255935,NO -3113255936,3113256959,GB -3113256960,3113257983,RU -3113257984,3113259007,GB -3113259008,3113260031,SE -3113260032,3113261055,GB -3113261056,3113262079,FR -3113262080,3113263103,US -3113263104,3113264127,AT -3113264128,3113265151,SK -3113265152,3113266175,IL -3113266176,3113267199,PL -3113267200,3113268223,CZ -3113268224,3113269247,GB -3113269248,3113270271,LV -3113270272,3113271295,DE -3113271296,3113272319,FR -3113272320,3113273343,NL -3113273344,3113274367,RU -3113274368,3113275391,DE -3113275392,3113276415,ES -3113276416,3113277439,IT -3113277440,3113278463,US -3113278464,3113279487,GB -3113279488,3113280511,NL -3113280512,3113281535,GB -3113281536,3113282559,ES -3113282560,3113283583,DE -3113283584,3113284607,GB -3113284608,3113285631,PL -3113285632,3113286655,TR -3113286656,3113287679,FR -3113287680,3113288703,AL -3113288704,3113289727,EE -3113289728,3113290751,IR -3113290752,3113292799,NL -3113292800,3113293823,AT -3113293824,3113294847,NL -3113294848,3113295871,IL -3113295872,3113296895,FR -3113296896,3113297119,DE -3113297120,3113297151,GB -3113297152,3113297343,DE -3113297344,3113297375,GB -3113297376,3113297391,DE -3113297392,3113297407,ES -3113297408,3113297567,DE -3113297568,3113297599,GB -3113297600,3113297647,DE -3113297648,3113297663,GB -3113297664,3113297887,DE -3113297888,3113297919,GB -3113297920,3113298943,ES -3113298944,3113299199,RU -3113299200,3113299455,NL -3113299456,3113300991,GB -3113300992,3113303039,RU -3113303040,3113304063,NL -3113304064,3113304895,DE -3113304896,3113304959,GB -3113304960,3113305087,DE -3113305088,3113306111,ES -3113306112,3113307135,UA -3113307136,3113308159,FR -3113308160,3113309183,DE -3113309184,3113310207,IT -3113310208,3113311231,GB -3113311232,3113312255,SE -3113312256,3113313279,BG -3113313280,3113314303,IT -3113314304,3113315327,UA -3113315328,3113316351,CH -3113316352,3113317375,RO -3113317376,3113318399,AT -3113318400,3113319423,GE -3113319424,3113320447,RU -3113320448,3113321471,NL -3113321472,3113322495,AT -3113323520,3113324543,RU -3113324544,3113325567,HU -3113325568,3113326591,CH -3113326592,3113328639,GB -3113328640,3113329663,CZ -3113329664,3113330687,GR -3113330688,3113331711,DE -3113331712,3113332735,FI -3113332736,3113333759,ES -3113333760,3113334783,UA -3113334784,3113335807,IR -3113335808,3113336831,NO -3113336832,3113337855,NL -3113337856,3113338879,DE -3113338880,3113339903,GB -3113339904,3113340927,HU -3113340928,3113341951,NL -3113341952,3113342975,IL -3113342976,3113343231,GB -3113343232,3113343487,DE -3113343488,3113343743,FR -3113343744,3113343999,IT -3113344000,3113345023,DE -3113345024,3113347071,ES -3113347072,3113348095,CY -3113348096,3113349119,SY -3113349120,3113350143,DE -3113350144,3113351167,NL -3113351168,3113352191,FR -3113352192,3113353215,NL -3113353216,3113354239,KZ -3113354240,3113355263,CZ -3113355264,3113356287,PL -3113356288,3113357311,FI -3113357312,3113358335,KZ -3113358336,3113359359,CZ -3113359360,3113360383,FR -3113360384,3113361407,BG -3113361408,3113362431,US -3113362432,3113363455,DE -3113363456,3113364479,FR -3113364480,3113365503,GB -3113365504,3113366527,DE -3113366528,3113367551,PL -3113367552,3113368575,ES -3113368576,3113369599,DE -3113370624,3113371647,NL -3113371648,3113372671,RU -3113372672,3113373695,FR -3113373696,3113374719,CH -3113374720,3113375743,RO -3113375744,3113376767,TR -3113376768,3113377791,PT -3113377792,3113378815,PL -3113378816,3113379839,NO -3113379840,3113380863,NL -3113380864,3113381887,US -3113381888,3113382911,AZ -3113382912,3113383935,RU -3113383936,3113384959,UA -3113384960,3113385983,US -3113385984,3113388031,IT -3113388032,3113389055,SY -3113389056,3113390079,SE -3113390080,3113391103,BG -3113391104,3113392127,CZ -3113392128,3113393151,GB -3113393152,3113394175,RU -3113394176,3113396223,TR -3113396224,3113397247,RU -3113397248,3113398271,SE -3113398272,3113399295,GE -3113399296,3113401343,IE -3113401344,3113402367,NL -3113402368,3113403391,GB -3113403392,3113404415,DE -3113404416,3113405439,NO -3113405440,3113406463,DE -3113406464,3113407487,DK -3113407488,3113408511,RU -3113408512,3113409535,NL -3113409536,3113410559,FR -3113410560,3113411583,PL -3113411584,3113412607,DE -3113412608,3113413631,RO -3113413632,3113414655,DE -3113414656,3113415679,KW -3113415680,3113416703,PL -3113416704,3113417727,DE -3113417728,3113418751,SI -3113418752,3113419775,FR -3113419776,3113420799,DE -3113420800,3113421823,CH -3113421824,3113422847,NL -3113422848,3113423871,ES -3113423872,3113424895,FI -3113424896,3113425151,AZ -3113425152,3113425407,SK -3113425408,3113425919,CZ -3113425920,3113426943,KW -3113426944,3113427199,FR -3113427200,3113427455,SG -3113427456,3113427711,NL -3113427712,3113427967,US -3113427968,3113428991,RU -3113428992,3113430015,IR -3113430016,3113431039,CZ -3113431040,3113432063,MD -3113432064,3113433087,PL -3113433088,3113434111,LV -3113434112,3113435135,TR -3113435136,3113436159,FR -3113436160,3113437183,PL -3113437184,3113437439,DK -3113437440,3113437567,GB -3113437568,3113438207,DK -3113438208,3113439231,DE -3113439232,3113440255,RU -3113440256,3113441279,IR -3113441280,3113442303,GB -3113442304,3113443327,RU -3113443328,3113444351,UA -3113444352,3113446399,DE -3113446400,3113447423,GB -3113447424,3113448447,NL -3113448448,3113449471,IT -3113449472,3113450495,EE -3113450496,3113452543,RU -3113452544,3113453567,GB -3113453568,3113454591,IS -3113454592,3113455615,RO -3113455616,3113456639,DK -3113456640,3113457663,FR -3113457664,3113458687,NL -3113458688,3113459711,US -3113459712,3113460735,IR -3113460736,3113461759,IT -3113461760,3113462783,DE -3113462784,3113463807,IE -3113463808,3113464831,IR -3113464832,3113465855,IS -3113465856,3113466879,GB -3113466880,3113467903,CH -3113467904,3113468927,RU -3113468928,3113469951,TR -3113469952,3113470975,ME -3113470976,3113471999,FR -3113472000,3113473023,GB -3113473024,3113473279,FR -3113473280,3113473535,SE -3113473536,3113473791,ES -3113473792,3113475071,DE -3113475072,3113479167,FR -3113479168,3113480191,SE -3113480192,3113481215,FR -3113481216,3113482239,GB -3113482240,3113483263,CZ -3113483264,3113484287,PL -3113484288,3113485311,FI -3113485312,3113486335,GB -3113486336,3113487359,IT -3113487360,3113488383,IR -3113488384,3113489407,NO -3113489408,3113490431,NL -3113490432,3113491455,RU -3113491456,3113492479,GE -3113492480,3113493503,TR -3113493504,3113494527,RU -3113494528,3113497599,NL -3113497600,3113498623,ES -3113498624,3113499647,TR -3113499648,3113500671,BG -3113500672,3113501695,PL -3113501696,3113502719,DE -3113502720,3113503743,SI -3113503744,3113504767,CH -3113504768,3113505791,RU -3113505792,3113506815,TR -3113506816,3113507839,GB -3113507840,3113508863,AT -3113508864,3113509887,DE -3113509888,3113510911,IT -3113510912,3113511935,RU -3113511936,3113512959,IT -3113512960,3113513983,PT -3113513984,3113515007,IT -3113515008,3113516031,FR -3113516032,3113517055,CH -3113517056,3113518079,CZ -3113518080,3113519103,GB -3113519104,3113520127,CH -3113520128,3113521151,SE -3113521152,3113522175,BG -3113522176,3113523199,SA -3113523200,3113524223,IT -3113524224,3113525247,AT -3113525248,3113526271,BG -3113526272,3113527295,FR -3113527296,3113528319,DE -3113528320,3113529343,CZ -3113529344,3113530367,NO -3113530368,3113531391,US -3113531392,3113532415,DE -3113532416,3113533439,IT -3113533440,3113534463,SY -3113534464,3113535487,GB -3113535488,3113536511,RS -3113536512,3113537535,IT -3113537536,3113538559,RU -3113538560,3113539583,CZ -3113539584,3113541631,RU -3113541632,3113542655,FR -3113542656,3113543679,CH -3113543680,3113544703,NL -3113544704,3113545727,AT -3113545728,3113546751,TR -3113546752,3113547775,FR -3113547776,3113548799,DE -3113548800,3113549823,FR -3113549824,3113550847,PL -3113550848,3113551871,GB -3113551872,3113552895,UZ -3113552896,3113553919,UA -3113553920,3113554943,NO -3113554944,3113555967,UA -3113555968,3113556991,NL -3113556992,3113558015,DE -3113558016,3113559039,IT -3113559040,3113560063,NL -3113560064,3113561087,UA -3113561088,3113562111,SE -3113562112,3113563135,RU -3113563136,3113564159,DE -3113564160,3113565183,NL -3113565184,3113566207,FR -3113566208,3113567231,RU -3113567232,3113568255,US -3113568256,3113569279,ES -3113569280,3113570303,NL -3113570304,3113571327,ES -3113571328,3113573375,NL -3113573376,3113574399,CH -3113575424,3113576447,TR -3113576448,3113577471,BG -3113577472,3113578495,GB -3113578496,3113579519,CZ -3113579520,3113580543,GB -3113580544,3113581567,PL -3113581568,3113582591,RU -3113582592,3113583615,CZ -3113583616,3113584639,NL -3113584640,3113585663,LU -3113585664,3113586687,AM -3113586688,3113587199,RU -3113587200,3113587455,LU -3113587456,3113587711,RU -3113587712,3113588735,DE -3113588736,3113589759,LT -3113589760,3113590783,DE -3113590784,3113591807,RU -3113591808,3113592831,DE -3113592832,3113593855,GE -3113593856,3113594879,LU -3113594880,3113595903,GB -3113595904,3113596927,SA -3113596928,3113597951,CZ -3113597952,3113598975,IT -3113598976,3113599999,GB -3113600000,3113601023,UA -3113601024,3113602047,PL -3113602048,3113603071,CZ -3113603072,3113604095,GB -3113604096,3113605119,DE -3113605120,3113606143,FR -3113606144,3113607167,GB -3113607168,3113608191,DE -3113608192,3113609215,DK -3113609216,3113610239,SA -3113610240,3113611263,GB -3113611264,3113613311,RU -3113613312,3113614335,DE -3113614336,3113615359,IL -3113615360,3113616383,TR -3113616384,3113617407,CH -3113617408,3113618431,AT -3113618432,3113619455,RU -3113619456,3113620479,RO -3113620480,3113621503,GB -3113621504,3113622527,NL -3113622528,3113623551,CH -3113623552,3113624575,DE -3113624576,3113625599,IT -3113625600,3113626623,LT -3113626624,3113627647,PL -3113627648,3113628671,DE -3113628672,3113629695,CH -3113629696,3113630719,NL -3113630720,3113631743,GB -3113631744,3113632767,IT -3113632768,3113633791,NL -3113633792,3113634815,DK -3113634816,3113636863,ES -3113636864,3113637887,DE -3113637888,3113638911,FR -3113638912,3113639935,BG -3113639936,3113640959,DE -3113640960,3113641983,ES -3113641984,3113643007,SA -3113643008,3113644031,IR -3113644032,3113645055,NO -3113645056,3113646079,IR -3113646080,3113647103,FR -3113647104,3113648127,CZ -3113648128,3113649151,TR -3113649152,3113650175,PL -3113650176,3113651199,GB -3113651200,3113652223,SY -3113652224,3113653759,GB -3113653760,3113653763,DE -3113653764,3113653767,FR -3113653768,3113653771,GB -3113653772,3113653775,IT -3113653776,3113653779,ES -3113653780,3113653781,NL -3113653782,3113653783,BE -3113653784,3113653785,GR -3113653786,3113653787,PT -3113653788,3113653789,SE -3113653790,3113653791,AT -3113653792,3113653793,CH -3113653794,3113653795,DK -3113653796,3113653797,FI -3113653798,3113653799,NO -3113653800,3113653801,IE -3113653802,3113653803,IS -3113653804,3113653805,FO -3113653806,3113653887,GB -3113653888,3113653889,DE -3113653890,3113653891,FR -3113653892,3113653893,GB -3113653894,3113653895,IT -3113653896,3113653897,ES -3113653898,3113653898,NL -3113653899,3113653899,BE -3113653900,3113653900,GR -3113653901,3113653901,PT -3113653902,3113653902,SE -3113653903,3113653903,AT -3113653904,3113653904,CH -3113653905,3113653905,DK -3113653906,3113653906,FI -3113653907,3113653907,NO -3113653908,3113653908,IE -3113653909,3113653909,IS -3113653910,3113653910,FO -3113653911,3113654015,GB -3113654016,3113654019,DE -3113654020,3113654023,FR -3113654024,3113654027,GB -3113654028,3113654031,IT -3113654032,3113654035,ES -3113654036,3113654037,NL -3113654038,3113654039,BE -3113654040,3113654041,GR -3113654042,3113654043,PT -3113654044,3113654045,SE -3113654046,3113654047,AT -3113654048,3113654049,CH -3113654050,3113654051,DK -3113654052,3113654053,FI -3113654054,3113654055,NO -3113654056,3113654057,IE -3113654058,3113654059,IS -3113654060,3113654061,FO -3113654062,3113654271,GB -3113654272,3113655295,RU -3113655296,3113656319,NL -3113656320,3113657343,FR -3113657344,3113658367,AM -3113658368,3113659391,IE -3113659392,3113660415,FR -3113660416,3113661439,GB -3113661440,3113662463,UA -3113662464,3113664511,NL -3113664512,3113665535,BA -3113665536,3113666559,DK -3113666560,3113667583,GB -3113667584,3113668607,TR -3113668608,3113669631,NL -3113669632,3113670655,CZ -3113670656,3113671679,KW -3113671680,3113672703,IE -3113672704,3113673727,GB -3113673728,3113674751,IT -3113674752,3113675775,HR -3113675776,3113676799,PL -3113676800,3113677823,FR -3113677824,3113678847,DE -3113678848,3113679871,PL -3113679872,3113680895,FR -3113680896,3113681919,SK -3113681920,3113682943,AE -3113682944,3113683967,NO -3113683968,3113684991,US -3113684992,3113686015,NO -3113686016,3113687039,AT -3113687040,3113688063,IT -3113688064,3113689087,GB -3113689088,3113690111,IT -3113691136,3113692159,KZ -3113692160,3113693183,GB -3113693184,3113694207,DE -3113694208,3113695227,FR -3113695228,3113695228,GB -3113695229,3113695231,FR -3113695232,3113695347,DE -3113695348,3113695351,GB -3113695352,3113695359,DE -3113695360,3113695615,GB -3113695616,3113695647,DE -3113695648,3113695679,GB -3113695680,3113695727,DE -3113695728,3113695743,GB -3113695744,3113695775,DE -3113695776,3113695807,GB -3113695808,3113695839,DE -3113695840,3113695855,GB -3113695856,3113696031,DE -3113696032,3113696063,GB -3113696064,3113696111,DE -3113696112,3113696127,CH -3113696128,3113696255,DE -3113696256,3113697279,NL -3113697280,3113698303,DE -3113698304,3113699327,FR -3113699328,3113700351,PL -3113700352,3113701375,FI -3113701376,3113702399,SY -3113702400,3113703423,UA -3113703424,3113704447,DK -3113704448,3113705471,IT -3113705472,3113706495,IR -3113706496,3113707519,DE -3113707520,3113708543,UA -3113708544,3113709567,ES -3113709568,3113710317,BE -3113710318,3113710318,CA -3113710319,3113710591,BE -3113710592,3113711615,PL -3113711616,3113712639,RU -3113712640,3113713663,IT -3113713664,3113714687,UA -3113714688,3113715711,HR -3113715712,3113716735,GE -3113716736,3113717759,DE -3113717760,3113718783,IT -3113718784,3113719807,SY -3113719808,3113720831,DE -3113720832,3113721855,BG -3113721856,3113722623,US -3113722624,3113722879,GB -3113722880,3113723903,CH -3113723904,3113725951,CZ -3113725952,3113726975,ES -3113726976,3113727999,FR -3113728000,3113729023,UA -3113729024,3113730047,FR -3113730048,3113731071,DK -3113731072,3113732095,IL -3113732096,3113734143,DE -3113734144,3113735167,ES -3113735168,3113736191,FR -3113736192,3113737215,ES -3113737216,3113738239,NL -3113738240,3113739263,GB -3113739264,3113740287,FR -3113740288,3113741311,NL -3113741312,3113742335,IR -3113742336,3113743359,RU -3113743360,3113744383,PL -3113744384,3113745407,FI -3113745408,3113746431,CZ -3113746432,3113747455,GB -3113747456,3113748479,IE -3113748480,3113749503,GB -3113749504,3113750527,ES -3113750528,3113751551,CH -3113751552,3113752575,TR -3113752576,3113753599,FR -3113753600,3113754623,SK -3113754624,3113755135,DK -3113755136,3113755647,NO -3113755648,3113756671,GB -3113756672,3113758719,IT -3113758720,3113759743,GB -3113759744,3113760767,FR -3113760768,3113761791,BE -3113761792,3113762815,ES -3113762816,3113763327,CZ -3113763328,3113763839,US -3113763840,3113764863,VA -3113764864,3113765887,IE -3113766912,3113767935,RU -3113767936,3113768959,NL -3113768960,3113769983,TR -3113769984,3113771007,RU -3113771008,3113772031,DE -3113772032,3113773055,CZ -3113773056,3113774079,DE -3113774080,3113775103,NL -3113775104,3113776127,SK -3113776128,3113777151,IS -3113777152,3113778175,PL -3113778176,3113779199,TR -3113779200,3113780223,GB -3113780224,3113781247,RU -3113781248,3113782271,BY -3113782272,3113783295,IT -3113783296,3113784319,TR -3113784320,3113785343,IT -3113785344,3113786367,CZ -3113786368,3113787391,IT -3113787392,3113788415,GB -3113788416,3113789439,ES -3113789440,3113790463,FR -3113790464,3113791487,ES -3113791488,3113792511,SE -3113792512,3113793535,HU -3113793536,3113794559,RU -3113794560,3113795583,ES -3113795584,3113796607,RU -3113796608,3113797631,SK -3113797632,3113798655,DK -3113798656,3113800703,DE -3113800704,3113801727,NL -3113801728,3113802751,GB -3113802752,3113803775,DE -3113803776,3113804799,CH -3113804800,3113805823,SE -3113805824,3113807871,DE -3113807872,3113808895,IT -3113808896,3113809919,DE -3113809920,3113810943,GB -3113810944,3113812991,IT -3113812992,3113814015,SE -3113814016,3113815039,FR -3113815040,3113816063,GB -3113816064,3113817087,ES -3113818112,3113819135,SI -3113819136,3113820159,FR -3113820160,3113822207,PL -3113822208,3113823231,BE -3113823232,3113824255,RU -3113824256,3113825279,MK -3113825280,3113826303,GE -3113826304,3113827327,IE -3113827328,3113828351,NL -3113828352,3113829375,DE -3113829376,3113830399,BE -3113830400,3113831423,CZ -3113831424,3113832447,IT -3113832448,3113833471,CZ -3113833472,3113834495,LB -3113834496,3113835519,DE -3113836544,3113837567,FR -3113837568,3113838591,GB -3113838592,3113839615,CH -3113839616,3113840639,IT -3113840640,3113841663,FR -3113841664,3113842687,ES -3113842688,3113843711,UA -3113843712,3113844735,IT -3113844736,3113845759,GB -3113845760,3113846783,RU -3113846784,3113847807,ES -3113847808,3113848831,DE -3113848832,3113849855,EE -3113849856,3113850879,IL -3113850880,3113851903,DK -3113851904,3113852927,SE -3113852928,3113853951,PS -3113853952,3113854975,US -3113854976,3113855999,ES -3113856000,3113857023,GB -3113857024,3113857279,BR -3113857280,3113857535,MX -3113857536,3113857791,US -3113857792,3113858047,CA -3113858048,3113859071,UA -3113859072,3113860095,IR -3113860096,3113861119,NL -3113861120,3113862143,CZ -3113862144,3113863167,MD -3113863168,3113864191,LT -3113864192,3113865215,GB -3113865216,3113866239,IR -3113866240,3113867263,LB -3113867264,3113868287,HU -3113868288,3113869311,TR -3113869312,3113870335,ES -3113870336,3113871359,TR -3113871360,3113872383,FR -3113872384,3113873407,GB -3113873408,3113874431,RU -3113874432,3113875455,FR -3113875456,3113876479,TR -3113876480,3113877503,DK -3113877504,3113878527,ES -3113878528,3113879551,US -3113879552,3113880575,ES -3113880576,3113881599,NL -3113881600,3113882623,RO -3113882624,3113883647,RU -3113883648,3113884671,ES -3113884672,3113885695,DE -3113885696,3113886719,FR -3113886720,3113887743,CH -3113887744,3113888767,AT -3113888768,3113889791,IT -3113889792,3113890815,GB -3113890816,3113891839,RU -3113891840,3113892863,ES -3113892864,3113893887,CZ -3113893888,3113894911,TR -3113894912,3113895935,DK -3113895936,3113896959,RU -3113896960,3113899007,IE -3113899008,3113900031,CH -3113900032,3113901055,IT -3113901056,3113902079,CH -3113902080,3113903103,PL -3113903104,3113904127,CH -3113904128,3113905151,DE -3113905152,3113906175,SE -3113906176,3113907199,DE -3113907200,3113908223,IS -3113908224,3113910271,RU -3113910272,3113911295,TR -3113911296,3113912319,GB -3113912320,3113913343,FR -3113913344,3113914367,BE -3113914368,3113915391,GB -3113915392,3113916415,DE -3113916416,3113916927,FR -3113916928,3113917439,EE -3113917440,3113918463,NL -3113918464,3113919487,ES -3113919488,3113920511,BE -3113920512,3113921535,QA -3113921536,3113922559,GB -3113922560,3113923583,DK -3113923584,3113924607,UA -3113924608,3113925631,IR -3113925632,3113926655,DE -3113926656,3113927679,RU -3113927680,3113928703,ES -3113928704,3113929727,RU -3113929728,3113931775,ES -3113931776,3113932799,UA -3113932800,3113933055,RO -3113933056,3113933567,US -3113933568,3113933823,RO -3113933824,3113934847,EE -3113934848,3113935871,NL -3113935872,3113936895,SE -3113936896,3113937919,AT -3113937920,3113938943,IT -3113938944,3113939967,DK -3113939968,3113940991,GB -3113940992,3113942015,SY -3113942016,3113943039,ES -3113943040,3113944063,FR -3113944064,3113945087,ES -3113945088,3113947135,IR -3113947136,3113948159,RU -3113948160,3113949183,ES -3113949184,3113950207,NO -3113950208,3113951231,CH -3113951232,3113952255,CZ -3113952256,3113953279,DK -3113953280,3113954303,PL -3113954304,3113955327,NL -3113955328,3113956351,SK -3113956352,3113957375,RO -3113957376,3113958399,DE -3113958400,3113961471,ES -3113961472,3113962495,IR -3113962496,3113963519,NL -3113963520,3113964543,DK -3113965568,3113966591,UA -3113966592,3113967615,FR -3113967616,3113968639,EE -3113968640,3113969663,GR -3113969664,3113970687,GB -3113970688,3113971711,DE -3113971712,3113972735,RU -3113972736,3113973759,BG -3113973760,3113974783,IT -3113974784,3113975807,AT -3113975808,3113976831,CZ -3113976832,3113977855,DK -3113977856,3113978879,GB -3113978880,3113979903,FR -3113979904,3113980927,GB -3113980928,3113981951,TR -3113981952,3113982975,FR -3113982976,3113983999,IQ -3113984000,3113985023,SY -3113985024,3113986047,DE -3113986048,3113987071,NL -3113987072,3113988095,FR -3113988096,3113989119,IT -3113989120,3113989631,GB -3113989632,3113989887,DE -3113989888,3113990143,GB -3113990144,3113991167,CH -3113991168,3113993215,DE -3113993216,3113994239,IT -3113994240,3113995263,NL -3113995264,3113996287,ES -3113996288,3113997311,HR -3113997312,3113998335,NO -3113998336,3113999359,HR -3113999360,3114000383,FR -3114000384,3114001407,HR -3114001408,3114002431,RO -3114002432,3114002687,US -3114002688,3114002825,RU -3114002826,3114002826,AM -3114002827,3114003455,RU -3114003456,3114004479,IR -3114004480,3114005503,AE -3114005504,3114006527,GB -3114006528,3114007551,BG -3114007552,3114008575,EE -3114008576,3114009599,RU -3114009600,3114010623,TR -3114010624,3114011647,CH -3114011648,3114012671,AL -3114012672,3114013695,GB -3114013696,3114014719,IS -3114014720,3114015743,FR -3114015744,3114016767,TR -3114016768,3114017791,PL -3114017792,3114018815,CZ -3114018816,3114019839,UA -3114019840,3114020863,IR -3114020864,3114021887,GB -3114021888,3114022911,UA -3114022912,3114023935,BE -3114023936,3114024959,GR -3114024960,3114025983,GB -3114025984,3114027007,DE -3114027008,3114028031,RU -3114028032,3114030079,FR -3114030080,3114031103,DE -3114031104,3114033151,FI -3114033152,3114034175,DK -3114034176,3114035199,ES -3114035200,3114036223,GB -3114036224,3114037247,RU -3114037248,3114038271,NO -3114038272,3114039295,GB -3114039296,3114040319,CZ -3114040320,3114041343,DE -3114042368,3114043391,IT -3114043392,3114045439,GB -3114045440,3114046463,AT -3114046464,3114047487,IT -3114047488,3114048511,HU -3114048512,3114049535,DE -3114049536,3114050559,NL -3114050560,3114051583,GB -3114051584,3114052607,BE -3114052608,3114052863,NL -3114052864,3114053119,FR -3114053120,3114053375,CZ -3114053376,3114053631,CH -3114053632,3114055679,RU -3114055680,3114057727,GB -3114057728,3114058751,IT -3114058752,3114059775,GB -3114059776,3114060799,BZ -3114060800,3114061823,DE -3114061824,3114062847,NL -3114062848,3114063871,LB -3114063872,3114064895,ES -3114064896,3114065919,CH -3114065920,3114066943,DE -3114066944,3114067967,CH -3114067968,3114068991,IT -3114068992,3114070015,BH -3114070016,3114071039,IT -3114071040,3114072063,GB -3114072064,3114073087,ES -3114073088,3114074111,DE -3114074112,3114075135,CH -3114075136,3114076159,ES -3114076160,3114077183,IR -3114077184,3114078207,PL -3114078208,3114079231,DK -3114079232,3114080255,DE -3114080256,3114081279,IT -3114081280,3114083327,DE -3114083328,3114084351,MT -3114084352,3114085375,TR -3114085376,3114086399,RS -3114086400,3114087423,GB -3114087424,3114088447,NL -3114088448,3114089471,NO -3114089472,3114091519,NL -3114091520,3114092543,BE -3114092544,3114093567,CH -3114093568,3114094591,UA -3114094592,3114095359,PL -3114095360,3114095615,DE -3114095616,3114096639,DK -3114096640,3114097663,NO -3114097664,3114098687,ES -3114098688,3114099711,RU -3114099712,3114100735,DE -3114100736,3114101759,RS -3114101760,3114102783,EE -3114102784,3114104831,DK -3114104832,3114105599,GR -3114105600,3114105855,RO -3114105856,3114106879,RU -3114106880,3114107903,ES -3114107904,3114108927,LI -3114108928,3114109951,KG -3114109952,3114110975,BE -3114110976,3114111999,NL -3114113024,3114114047,ES -3114114048,3114115071,DE -3114115072,3114116095,SE -3114116096,3114117119,PL -3114117120,3114118143,SE -3114118144,3114119167,PL -3114119168,3114120191,DE -3114120192,3114121215,IQ -3114121216,3114122239,ES -3114122240,3114123263,RU -3114123264,3114124287,FR -3114124288,3114125311,CZ -3114125312,3114126335,GL -3114126336,3114127359,TR -3114127360,3114128383,NL -3114128384,3114129407,ES -3114129408,3114130431,IT -3114130432,3114131455,SE -3114131456,3114132479,GB -3114132480,3114133503,IT -3114133504,3114134527,GB -3114134528,3114135551,PL -3114135552,3114136575,CZ -3114136576,3114137599,FR -3114137600,3114138623,AT -3114138624,3114139647,RU -3114139648,3114140671,AL -3114140672,3114141695,FR -3114141696,3114142719,ES -3114142720,3114143743,DE -3114143744,3114144767,AT -3114145792,3114146815,AT -3114146816,3114147839,IT -3114147840,3114148863,SY -3114148864,3114149887,IT -3114149888,3114150911,DE -3114150912,3114151935,FR -3114151936,3114152959,DE -3114152960,3114153983,ES -3114153984,3114155007,GB -3114155008,3114156031,DK -3114156032,3114157055,CZ -3114157056,3114158079,RU -3114158080,3114159103,FI -3114159104,3114160127,GB -3114160128,3114161151,HR -3114161152,3114162175,NL -3114162176,3114163199,IT -3114163200,3114164223,SY -3114164224,3114165247,DE -3114165248,3114165439,FR -3114165440,3114165487,DE -3114165488,3114165503,GB -3114165504,3114166015,DE -3114166016,3114166207,FR -3114166208,3114166255,DE -3114166256,3114166271,FR -3114166272,3114166511,DE -3114166512,3114166527,GB -3114166528,3114167295,DE -3114167296,3114168319,FR -3114168320,3114169343,RU -3114169344,3114169583,DE -3114169584,3114169599,GB -3114169600,3114170607,DE -3114170608,3114170623,GB -3114170624,3114171391,DE -3114171392,3114172415,ES -3114172416,3114172927,RU -3114172928,3114173439,GB -3114173440,3114173679,DE -3114173680,3114173695,GB -3114173696,3114174463,DE -3114174464,3114175231,US -3114175232,3114175487,DE -3114175488,3114176511,IT -3114176512,3114177535,NL -3114177536,3114177775,DE -3114177776,3114177791,GB -3114177792,3114178031,DE -3114178032,3114178047,GB -3114178048,3114178271,DE -3114178272,3114178303,GB -3114178304,3114178543,DE -3114178544,3114178559,GB -3114178560,3114179583,RU -3114179584,3114180607,TR -3114180608,3114181631,DK -3114181632,3114182655,NL -3114182656,3114183679,ES -3114183680,3114184703,IR -3114184704,3114185727,EE -3114185728,3114186751,DE -3114186752,3114187775,BE -3114187776,3114188799,IT -3114188800,3114189823,DE -3114189824,3114191871,NL -3114191872,3114192895,IS -3114192896,3114193919,UA -3114193920,3114194943,DE -3114194944,3114195967,BY -3114195968,3114196991,GR -3114196992,3114198015,DE -3114198016,3114199039,AT -3114199040,3114201087,IT -3114201088,3114203135,GB -3114203136,3114203391,RO -3114203392,3114204159,NL -3114204160,3114205183,ES -3114205184,3114206207,IT -3114206208,3114207231,NL -3114207232,3114208255,GB -3114208256,3114209279,FR -3114209280,3114210303,SE -3114210304,3114211327,CH -3114211328,3114212351,GB -3114212352,3114213375,CZ -3114213376,3114214399,DE -3114214400,3114215423,RU -3114215424,3114216447,ES -3114216448,3114217471,RU -3114217472,3114217727,NL -3114217728,3114218495,ZA -3114218496,3114219519,IT -3114219520,3114220543,AT -3114220544,3114221567,IT -3114221568,3114222591,RU -3114222592,3114223615,GB -3114223616,3114224639,TR -3114224640,3114225663,GB -3114225664,3114226175,NL -3114226176,3114226431,RU -3114226432,3114226687,US -3114226688,3114228735,IR -3114228736,3114229759,CZ -3114229760,3114230783,FR -3114230784,3114231807,ES -3114231808,3114233855,FR -3114233856,3114234879,ES -3114234880,3114235903,TR -3114235904,3114236927,DE -3114236928,3114237951,NL -3114237952,3114238975,RU -3114238976,3114239999,CZ -3114240000,3114241023,NL -3114241024,3114242047,UA -3114242048,3114243071,IT -3114243072,3114244095,RU -3114244096,3114245119,IR -3114245120,3114245375,SE -3114245376,3114245631,CH -3114245632,3114245887,IS -3114245888,3114246143,SE -3114246144,3114247167,TR -3114247168,3114248191,CH -3114248192,3114249215,CZ -3114249216,3114250239,RU -3114250240,3114251263,IR -3114251264,3114252287,JO -3114252288,3114253311,NO -3114253312,3114254335,NL -3114254336,3114255359,GB -3114255360,3114256383,SE -3114256384,3114257407,AT -3114257408,3114258431,CH -3114258432,3114259455,DE -3114259456,3114260479,ES -3114260480,3114261503,GB -3114261504,3114262527,BE -3114262528,3114263551,ES -3114263552,3114264575,NL -3114264576,3114265599,GB -3114265600,3114266623,FI -3114266624,3114267647,NL -3114267648,3114267674,US -3114267675,3114267675,FR -3114267676,3114267676,DE -3114267677,3114267677,NL -3114267678,3114267678,PL -3114267679,3114267679,ES -3114267680,3114267680,GB -3114267681,3114267903,US -3114267904,3114268159,GB -3114268160,3114268671,BR -3114268672,3114269695,BE -3114269696,3114270719,ES -3114270720,3114271743,DE -3114271744,3114272767,NL -3114272768,3114273791,LU -3114273792,3114274815,PL -3114274816,3114275839,DE -3114275840,3114276863,CZ -3114276864,3114277887,GB -3114277888,3114278911,TR -3114278912,3114279935,FR -3114279936,3114280959,GB -3114280960,3114281983,DE -3114281984,3114283007,GR -3114283008,3114284031,PL -3114284032,3114285055,FR -3114285056,3114286079,NL -3114286080,3114288127,UA -3114288128,3114289151,IS -3114289152,3114290175,NL -3114290176,3114291199,BG -3114291200,3114291455,ES -3114291456,3114291711,NL -3114291712,3114291967,ES -3114291968,3114292223,IE -3114292224,3114293247,DE -3114293248,3114294271,UA -3114294272,3114295295,RO -3114295296,3114296319,DE -3114296320,3114296447,IE -3114296448,3114296575,GB -3114296576,3114296703,ES -3114296704,3114296831,PT -3114296832,3114296959,PL -3114296960,3114297087,HR -3114297088,3114297215,FR -3114297216,3114297343,IT -3114297344,3114298367,IR -3114298368,3114299391,SK -3114299392,3114300415,IE -3114300416,3114301439,US -3114301440,3114302463,IT -3114302464,3114303487,CH -3114303488,3114304511,BE -3114304512,3114305535,IT -3114305536,3114306559,RU -3114306560,3114307583,LT -3114307584,3114308607,DE -3114308608,3114310655,ES -3114310656,3114311679,NL -3114311680,3114312703,ES -3114312704,3114313727,GB -3114313728,3114314751,ES -3114314752,3114315775,CY -3114315776,3114316799,IR -3114316800,3114318847,GB -3114318848,3114319871,RU -3114319872,3114320895,LB -3114320896,3114321919,TR -3114321920,3114323967,DE -3114323968,3114324991,CZ -3114324992,3114326015,ES -3114326016,3114327039,RU -3114327040,3114328063,BE -3114328064,3114329087,LB -3114329088,3114330111,ES -3114330112,3114331135,RS -3114331136,3114332159,JO -3114332160,3114333183,DE -3114333184,3114334207,CH -3114334208,3114335231,DE -3114335232,3114336255,GB -3114336256,3114337279,US -3114337280,3114338303,BG -3114338304,3114339327,FR -3114339328,3114340351,ES -3114340352,3114341375,GB -3114341376,3114342399,CH -3114342400,3114343423,GB -3114344448,3114345471,RU -3114345472,3114346495,IR -3114346496,3114347519,ES -3114347520,3114348543,FR -3114348544,3114349567,KG -3114349568,3114350591,RU -3114350592,3114351615,NO -3114351616,3114353663,RU -3114353664,3114354687,UA -3114354688,3114355711,HU -3114355712,3114356735,NO -3114356736,3114357759,DE -3114357760,3114358783,EE -3114358784,3114359807,NL -3114359808,3114360831,PL -3114360832,3114361855,ES -3114361856,3114362879,CH -3114362880,3114363135,NL -3114363136,3114363391,DE -3114363392,3114363647,GB -3114363648,3114363903,NL -3114363904,3114364927,TR -3114364928,3114365951,IR -3114365952,3114366975,ES -3114366976,3114367999,GB -3114368000,3114369023,NO -3114369024,3114370047,DE -3114370048,3114371071,GB -3114371072,3114372095,NO -3114372096,3114373119,NL -3114373120,3114374143,DE -3114374144,3114375167,GB -3114375168,3114377215,DE -3114377216,3114378239,TR -3114378240,3114379263,GB -3114379264,3114380287,FR -3114380288,3114381311,SK -3114381312,3114382335,DE -3114382336,3114383359,RU -3114383360,3114384383,ES -3114384384,3114385407,GB -3114385408,3114386431,IT -3114387456,3114387711,JP -3114387712,3114387967,AU -3114387968,3114388479,US -3114388480,3114389503,HU -3114389504,3114390527,NL -3114390528,3114391551,SE -3114391552,3114392575,MD -3114392576,3114393599,IT -3114393600,3114394623,AZ -3114394624,3114395647,DE -3114395648,3114396671,BG -3114396672,3114397695,RU -3114397696,3114398719,CZ -3114398720,3114399743,AT -3114399744,3114400767,GB -3114400768,3114401791,CZ -3114401792,3114402815,HU -3114402816,3114403839,CZ -3114403840,3114404351,NL -3114404352,3114404607,BG -3114404608,3114404863,NL -3114404864,3114405887,RU -3114405888,3114406911,CY -3114406912,3114407935,UA -3114407936,3114408959,CZ -3114408960,3114409983,BE -3114409984,3114411007,RU -3114411008,3114412031,IT -3114412032,3114413055,IR -3114413056,3114413119,LT -3114413120,3114413183,EE -3114413184,3114413247,LV -3114413248,3114413311,PL -3114413312,3114413439,DK -3114413440,3114413567,DE -3114413568,3114413631,CZ -3114413632,3114413695,HU -3114413696,3114413759,BG -3114413760,3114413823,MD -3114413824,3114413951,DE -3114413952,3114414079,CH -3114414080,3114415103,IT -3114415104,3114416127,ES -3114416128,3114417151,NL -3114417152,3114418175,HU -3114418176,3114419199,RO -3114419200,3114420223,GB -3114420224,3114421247,TR -3114421248,3114422271,SK -3114422272,3114423295,FR -3114423296,3114424319,MD -3114424320,3114425343,NL -3114425344,3114426367,RU -3114426368,3114427391,PL -3114427392,3114428415,GB -3114428416,3114429439,DK -3114429440,3114431487,GB -3114431488,3114432511,DE -3114432512,3114433535,MC -3114433536,3114434559,IL -3114434560,3114434815,NL -3114434816,3114435583,US -3114435584,3114436607,MD -3114436608,3114437631,AZ -3114437632,3114438655,MD -3114438656,3114439679,TR -3114439680,3114440703,IL -3114440704,3114441727,NL -3114441728,3114442751,FI -3114442752,3114443775,FR -3114443776,3114444799,SY -3114444800,3114446847,ES -3114446848,3114447871,FR -3114447872,3114448895,PT -3114448896,3114449919,NL -3114449920,3114450943,RU -3114450944,3114451967,MK -3114451968,3114452991,FR -3114452992,3114454015,CZ -3114454016,3114455039,DE -3114455040,3114456063,FR -3114456064,3114457087,DE -3114457088,3114458111,IR -3114458112,3114459135,RO -3114459136,3114460159,GB -3114460160,3114461183,DK -3114461184,3114461951,RU -3114461952,3114462207,NL -3114462208,3114463231,GR -3114463232,3114464255,US -3114464256,3114465279,BE -3114465280,3114466303,DE -3114466304,3114468351,GB -3114468352,3114469375,NL -3114469376,3114470399,DE -3114470400,3114471423,FI -3114471424,3114472447,US -3114472448,3114473471,AT -3114473472,3114474495,UZ -3114474496,3114475519,FR -3114475520,3114476543,TR -3114476544,3114477567,DE -3114477568,3114478591,CZ -3114478592,3114479615,MD -3114479616,3114481663,DE -3114481664,3114482687,FI -3114482688,3114484735,FR -3114484736,3114485759,GB -3114485760,3114486783,US -3114486784,3114487807,DE -3114487808,3114488831,CH -3114488832,3114489855,SE -3114489856,3114490879,IR -3114490880,3114491903,CH -3114491904,3114492159,US -3114492160,3114492927,GB -3114492928,3114493951,NL -3114493952,3114495999,RO -3114496000,3114497023,DE -3114497024,3114498047,LU -3114498048,3114499071,AT -3114499072,3114500095,FR -3114500096,3114501119,TR -3114501120,3114502143,ES -3114502144,3114503167,FR -3114503168,3114504191,BG -3114504192,3114505215,TR -3114505216,3114506239,IL -3114506240,3114507263,FI -3114507264,3114508287,RU -3114508288,3114509311,SA -3114509312,3114510335,ES -3114510336,3114511359,GB -3114511360,3114512383,NL -3114512384,3114513407,RU -3114513408,3114514431,CZ -3114514432,3114516479,DK -3114516480,3114517503,MD -3114517504,3114518527,DK -3114518528,3114519551,GE -3114519552,3114520575,DE -3114520576,3114521599,US -3114521600,3114522623,FR -3114522624,3114523647,SY -3114523648,3114524671,FR -3114524672,3114525695,ME -3114525696,3114526719,FR -3114526720,3114527743,GB -3114527744,3114529791,RU -3114529792,3114530815,BG -3114530816,3114532863,NL -3114532864,3114533887,MD -3114533888,3114534911,AT -3114534912,3114535935,FI -3114535936,3114536959,DK -3114536960,3114537983,IL -3114537984,3114541055,SA -3114541056,3114542079,BA -3114542080,3114542207,SE -3114542208,3114542335,NO -3114542336,3114542399,SI -3114542400,3114542463,SK -3114542464,3114542527,RO -3114542528,3114542591,RS -3114542592,3114542719,BE -3114542720,3114542847,NL -3114542848,3114542911,TH -3114542912,3114542975,ID -3114542976,3114543039,KR -3114543040,3114543103,MY -3114543104,3114544127,ES -3114544128,3114545151,GB -3114545152,3114546175,MD -3114546176,3114547199,DE -3114547200,3114548223,NL -3114548224,3114550271,GB -3114550272,3114551295,CZ -3114551296,3114552319,IR -3114552320,3114553343,LB -3114553344,3114554367,MD -3114554368,3114555391,DE -3114555392,3114556415,ES -3114556416,3114557439,IT -3114558464,3114559487,ES -3114559488,3114560511,LB -3114560512,3114561535,DE -3114561536,3114562559,TR -3114562560,3114563583,ES -3114563584,3114564607,GB -3114564608,3114565631,FR -3114565632,3114566655,LT -3114566656,3114567679,SY -3114567680,3114568703,GB -3114568704,3114569727,PL -3114569728,3114570751,IT -3114570752,3114571775,RU -3114571776,3114572799,CH -3114572800,3114573823,BE -3114573824,3114574847,GB -3114574848,3114575871,FR -3114575872,3114576895,US -3114576896,3114577919,RU -3114577920,3114578943,IT -3114578944,3114579967,GB -3114579968,3114580991,CH -3114580992,3114582015,SA -3114582016,3114583039,IL -3114583040,3114584063,SA -3114584064,3114585087,SY -3114585088,3114586111,AT -3114586112,3114587135,NL -3114587136,3114588159,FR -3114588160,3114589183,IQ -3114589184,3114590207,GB -3114591232,3114592255,DE -3114592256,3114593279,FR -3114593280,3114594303,SA -3114594304,3114595327,BG -3114595328,3114596351,LU -3114596352,3114597375,SY -3114597376,3114598399,IR -3114598400,3114600447,ES -3114600448,3114603519,DE -3114603520,3114604543,TR -3114604544,3114605567,BG -3114605568,3114606591,IR -3114606592,3114607615,FR -3114607616,3114608639,SK -3114608640,3114609663,IR -3114609664,3114610687,TR -3114610688,3114612735,NL -3114612736,3114613759,IT -3114613760,3114613823,JP -3114613824,3114613887,AU -3114613888,3114613951,TW -3114613952,3114614015,SG -3114614016,3114614079,SA -3114614080,3114614143,AE -3114614144,3114614207,PK -3114614208,3114614271,TR -3114614272,3114614399,MX -3114614400,3114614527,IN -3114614528,3114614655,FI -3114614656,3114614783,CA -3114614784,3114615807,FR -3114615808,3114616831,NL -3114616832,3114617855,DK -3114617856,3114618879,GB -3114618880,3114619903,SE -3114619904,3114620927,US -3114620928,3114621951,IT -3114621952,3114622975,PT -3114622976,3114623999,BG -3114624000,3114625023,IR -3114625024,3114626047,PT -3114626048,3114627071,HU -3114627072,3114628095,RU -3114628096,3114629119,IR -3114629120,3114630143,RU -3114630144,3114631167,IT -3114631168,3114632191,CH -3114632192,3114633215,FI -3114633216,3114634239,DE -3114634240,3114635263,SK -3114635264,3114636287,FR -3114636288,3114637311,PL -3114637312,3114639103,NL -3114639104,3114639359,PL -3114639360,3114640383,RU -3114640384,3114641407,ES -3114641408,3114642431,SC -3114642432,3114643455,SE -3114643456,3114644479,BH -3114644480,3114645503,GB -3114645504,3114646527,RO -3114646528,3114648575,NL -3114648576,3114649599,NO -3114649600,3114650623,RU -3114650624,3114651647,IR -3114651648,3114652671,CH -3114652672,3114654719,US -3114654720,3114655743,BG -3114655744,3114656767,RU -3114656768,3114657791,US -3114657792,3114658815,HR -3114658816,3114659071,NL -3114659072,3114659079,GB -3114659080,3114659839,NL -3114659840,3114660863,MD -3114660864,3114661887,DE -3114661888,3114663935,ES -3114663936,3114664959,CH -3114664960,3114667007,DE -3114667008,3114668031,FR -3114668032,3114669055,RU -3114669056,3114670079,TR -3114670080,3114671103,IQ -3114671104,3114672127,FI -3114672128,3114673151,SE -3114673152,3114675199,GB -3114675200,3114676223,NO -3114676224,3114677247,NL -3114677248,3114678271,SK -3114678272,3114679295,TJ -3114679296,3114680319,IR -3114680320,3114681343,CY -3114681344,3114682367,GB -3114682368,3114683391,RU -3114683392,3114684415,FI -3114684416,3114685439,CH -3114685440,3114686463,DE -3114686464,3114687487,NL -3114687488,3114688511,KW -3114688512,3114689535,CH -3114689536,3114690559,FR -3114690560,3114691583,IR -3114692608,3114693631,IR -3114693632,3114694655,CY -3114694656,3114695679,DK -3114695680,3114696703,RS -3114696704,3114697727,GB -3114697728,3114699775,HU -3114699776,3114700799,DE -3114700800,3114701823,UA -3114701824,3114702847,SE -3114702848,3114703871,UA -3114703872,3114704895,GB -3114704896,3114705919,UA -3114705920,3114706943,FR -3114706944,3114707967,PL -3114707968,3114708991,ES -3114708992,3114710015,DE -3114710016,3114711039,NO -3114711040,3114712063,FI -3114712064,3114713087,DE -3114713088,3114714111,CH -3114714112,3114715135,RU -3114715136,3114716159,DE -3114716160,3114718207,SE -3114718208,3114719231,ES -3114719232,3114721279,UA -3114721280,3114722303,GB -3114722304,3114723327,HU -3114723328,3114724351,SE -3114724352,3114725119,NL -3114725120,3114725375,US -3114725376,3114726399,RU -3114726400,3114727423,SE -3114727424,3114728447,BE -3114728448,3114729471,GB -3114729472,3114730495,AU -3114730496,3114731519,GB -3114731520,3114732543,CH -3114732544,3114733567,SY -3114733568,3114734591,FR -3114734592,3114737663,IT -3114737664,3114738687,PL -3114738688,3114740735,GB -3114740736,3114741759,MK -3114741760,3114742783,BE -3114742784,3114743807,IR -3114743808,3114744831,MD -3114744832,3114745855,TR -3114745856,3114746879,CA -3114746880,3114747903,FR -3114747904,3114748927,IR -3114748928,3114749951,GB -3114749952,3114750975,CH -3114750976,3114751999,SE -3114752000,3114753023,ES -3114753024,3114754047,HU -3114754048,3114755071,NL -3114755072,3114756095,IR -3114756096,3114757119,IT -3114757120,3114758143,ES -3114758144,3114759167,IT -3114759168,3114760191,GB -3114760192,3114761215,RU -3114761216,3114762239,IR -3114762240,3114763263,FR -3114763264,3114764287,MD -3114764288,3114765311,SA -3114765312,3114766335,PL -3114766336,3114767359,BG -3114767360,3114768383,DE -3114768384,3114769407,IL -3114769408,3114770431,DE -3114770432,3114771455,UA -3114771456,3114772479,DK -3114772480,3114773503,GB -3114773504,3114774527,BG -3114774528,3114775551,SE -3114775552,3114776575,GB -3114776576,3114777599,CZ -3114777600,3114777855,DE -3114777856,3114778111,US -3114778112,3114778623,DE -3114778624,3114779647,IT -3114779648,3114780671,IE -3114780672,3114781695,LT -3114781696,3114782719,NL -3114782720,3114783743,CZ -3114783744,3114784767,PL -3114784768,3114785791,RU -3114785792,3114786815,FR -3114786816,3114787839,RU -3114787840,3114788863,GB -3114788864,3114790911,CH -3114790912,3114791935,AT -3114791936,3114792959,IT -3114792960,3114793983,FR -3114793984,3114795007,NL -3114795008,3114796031,DE -3114796032,3114797055,NL -3114797056,3114798079,DE -3114798080,3114799103,LT -3114799104,3114800127,RS -3114800128,3114801151,GB -3114801152,3114802175,IT -3114802176,3114803199,IR -3114803200,3114804223,TR -3114804224,3114805247,GR -3114805248,3114806271,HR -3114806272,3114807295,FR -3114807296,3114808319,NL -3114808320,3114809343,GB -3114809344,3114810367,FR -3114810368,3114811391,RU -3114811392,3114812415,DK -3114812416,3114813439,IL -3114813440,3114814463,NO -3114814464,3114815487,IT -3114815488,3114815743,BE -3114815744,3114816511,DE -3114816512,3114817535,NL -3114817536,3114818559,IT -3114818560,3114819583,GB -3114819584,3114820607,IT -3114820608,3114821631,AT -3114821632,3114822655,ES -3114822656,3114823679,UA -3114823680,3114824703,NL -3114824704,3114825727,HR -3114825728,3114826751,GB -3114826752,3114827775,PL -3114827776,3114828799,UA -3114828800,3114830847,GB -3114830848,3114831871,NL -3114831872,3114832895,GB -3114832896,3114833919,FR -3114833920,3114834943,TR -3114834944,3114835967,FR -3114835968,3114836991,NL -3114836992,3114838015,IT -3114838016,3114838271,GB -3114838272,3114839039,DE -3114839040,3114841087,IT -3114841088,3114842111,DK -3114842112,3114843135,RU -3114843136,3114844159,FR -3114844160,3114845183,GB -3114845184,3114846207,DK -3114846208,3114847231,NL -3114847232,3114848255,FI -3114848256,3114849279,RU -3114849280,3114850303,FI -3114850304,3114851327,GB -3114851328,3114852351,UA -3114852352,3114853375,RU -3114853376,3114854399,DE -3114854400,3114855423,GB -3114855424,3114856447,RU -3114856448,3114857471,SE -3114857472,3114858495,DK -3114858496,3114860543,NL -3114860544,3114861567,DE -3114861568,3114862591,AE -3114862592,3114863615,AT -3114863616,3114864639,DK -3114864640,3114865663,UA -3114865664,3114866687,IR -3114866688,3114867711,IT -3114867712,3114869759,GB -3114869760,3114870783,IR -3114870784,3114871807,SE -3114871808,3114872831,IT -3114872832,3114873855,MD -3114873856,3114874879,TR -3114874880,3114875903,DE -3114875904,3114876927,CH -3114876928,3114877951,TR -3114877952,3114878975,EE -3114878976,3114879999,SE -3114880000,3114881023,FR -3114881024,3114882047,NL -3114882048,3114883071,CH -3114883072,3114884095,FR -3114884096,3114885119,CH -3114885120,3114886143,PT -3114886144,3114887167,RU -3114887168,3114888191,DE -3114888192,3114890239,NL -3114890240,3114892287,GB -3114892288,3114893311,DE -3114893312,3114894335,TR -3114894336,3114895359,US -3114895360,3114896383,ES -3114896384,3114897407,LT -3114897408,3114898431,GB -3114898432,3114899455,IL -3114899456,3114900479,RU -3114900480,3114901503,FR -3114901504,3114902527,SY -3114902528,3114903551,ES -3114903552,3114904575,GB -3114904576,3114905599,NO -3114905600,3114906623,IT -3114906624,3114907647,TR -3114907648,3114908671,IT -3114908672,3114909695,IS -3114909696,3114910719,DE -3114910720,3114911231,NL -3114911232,3114911743,GB -3114911744,3114912767,US -3114912768,3114913791,DE -3114913792,3114914815,FR -3114914816,3114915839,DE -3114915840,3114916863,RU -3114916864,3114917887,LB -3114917888,3114918911,IT -3114918912,3114919167,HN -3114919168,3114919423,CH -3114919424,3114919679,CW -3114919680,3114919935,CH -3114919936,3114920703,GB -3114920704,3114920959,NL -3114920960,3114921983,IT -3114921984,3114923007,CH -3114923008,3114924031,GB -3114924032,3114925055,HU -3114925056,3114925311,US -3114925312,3114925567,DE -3114925568,3114925823,US -3114925824,3114926079,GB -3114926080,3114927103,RU -3114927104,3114928127,NL -3114928128,3114929151,GB -3114929152,3114930175,BH -3114930176,3114931199,CH -3114931200,3114932223,FR -3114932224,3114933247,DE -3114933248,3114934271,DK -3114934272,3114935295,PL -3114935296,3114936319,CA -3114936320,3114936575,DE -3114936576,3114936831,PA -3114936832,3114937343,DE -3114938368,3114939391,CH -3114939392,3114940415,RU -3114940416,3114941439,IL -3114941440,3114942463,GB -3114942464,3114943487,DE -3114943488,3114944511,NL -3114944512,3114945535,SE -3114945536,3114946559,NL -3114946560,3114947583,FR -3114947584,3114948607,HU -3114948608,3114949631,CH -3114949632,3114950655,NL -3114950656,3114951679,ES -3114951680,3114952703,GB -3114952704,3114953727,PL -3114953728,3114954751,MD -3114954752,3114955775,DE -3114955776,3114956799,AE -3114956800,3114957823,DE -3114957824,3114958847,RO -3114958848,3114959871,NL -3114959872,3114960895,CH -3114960896,3114961919,IT -3114961920,3114962431,GR -3114962432,3114962687,DE -3114962688,3114962943,GR -3114962944,3114963967,GB -3114963968,3114964991,FR -3114964992,3114966015,GB -3114966016,3114967039,TR -3114967040,3114968063,DE -3114968064,3114969087,MD -3114969088,3114970111,DE -3114970112,3114971135,TR -3114971136,3114972159,GB -3114972160,3114973183,SE -3114973184,3114974207,MD -3114974208,3114975231,GB -3114975232,3114976255,RU -3114976256,3114977279,US -3114977280,3114978303,PL -3114978304,3114979327,RU -3114979328,3114980351,NL -3114980352,3114981375,DE -3114981376,3114982399,US -3114982400,3114983423,JP -3114983424,3114983679,PL -3114983680,3114983935,RO -3114983936,3114984447,PL -3114984448,3114985471,CZ -3114985472,3114986495,CY -3114986496,3114987519,IR -3114987520,3114988543,CZ -3114988544,3114989567,DE -3114989568,3114990591,NO -3114990592,3114991615,LT -3114991616,3114992639,GB -3114992640,3114993663,FR -3114993664,3114994687,ES -3114994688,3114995711,RU -3114995712,3114996735,MD -3114996736,3114997759,FR -3114997760,3114998783,TR -3114998784,3114999807,DE -3114999808,3115000831,NL -3115000832,3115001855,IT -3115001856,3115002879,NL -3115002880,3115003903,DE -3115003904,3115004927,NL -3115004928,3115005951,IR -3115005952,3115006975,GB -3115006976,3115007423,RS -3115007424,3115007487,XK -3115007488,3115007999,RS -3115008000,3115009023,BE -3115009024,3115010047,MD -3115010048,3115011071,SY -3115011072,3115012095,DE -3115012096,3115013119,RU -3115013120,3115014143,FR -3115014144,3115016191,TR -3115016192,3115017215,DE -3115017216,3115018239,RU -3115018240,3115019263,ES -3115019264,3115020287,LB -3115020288,3115021311,FR -3115021312,3115022335,AE -3115022336,3115023359,GB -3115023360,3115024383,CZ -3115024384,3115025407,NL -3115025408,3115026431,SY -3115026432,3115027455,DE -3115027456,3115028479,SK -3115028480,3115029503,AL -3115029504,3115030527,RU -3115030528,3115031551,SA -3115031552,3115032575,FR -3115032576,3115033599,RU -3115033600,3115034623,ES -3115034624,3115035647,BE -3115035648,3115036671,FO -3115036672,3115037695,FI -3115037696,3115038719,HR -3115038720,3115039743,RO -3115039744,3115040767,GB -3115040768,3115041791,RU -3115041792,3115042815,DK -3115043840,3115044863,DE -3115044864,3115045887,NL -3115045888,3115046911,IT -3115046912,3115047935,DE -3115047936,3115048959,GB -3115048960,3115049983,DE -3115049984,3115051007,MD -3115051008,3115052031,LV -3115052032,3115055103,NL -3115055104,3115056127,DE -3115056128,3115057151,NL -3115057152,3115058175,IR -3115058176,3115059199,BE -3115059200,3115060223,DE -3115060224,3115062271,FR -3115062272,3115063295,US -3115063296,3115064319,EE -3115064320,3115066367,MD -3115066368,3115067391,NL -3115067392,3115068415,US -3115068416,3115069439,HU -3115069440,3115070463,NL -3115070464,3115071487,US -3115071488,3115071743,NL -3115071744,3115071999,LB -3115072000,3115072511,DE -3115072512,3115073535,ES -3115073536,3115074559,DE -3115074560,3115075583,IR -3115075584,3115076607,SY -3115076608,3115077631,SE -3115077632,3115078655,IL -3115078656,3115079679,PL -3115079680,3115080703,MD -3115080704,3115081727,LI -3115081728,3115082751,ES -3115082752,3115083775,UA -3115083776,3115084799,SK -3115084800,3115085823,NL -3115085824,3115086847,GB -3115086848,3115087871,PL -3115087872,3115088895,GB -3115088896,3115089919,DE -3115089920,3115090943,RU -3115090944,3115091967,NL -3115091968,3115092991,RU -3115092992,3115094015,IT -3115094016,3115094527,DE -3115094528,3115094783,TR -3115094784,3115095039,NL -3115095040,3115095551,DE -3115095552,3115096063,CH -3115096064,3115097087,FR -3115097088,3115098111,LT -3115098112,3115099391,NL -3115099392,3115099647,US -3115099648,3115100159,NL -3115100160,3115101183,ES -3115101184,3115102207,GB -3115102208,3115103231,ES -3115103232,3115104255,IT -3115104256,3115105279,ES -3115105280,3115106303,US -3115106304,3115107327,DE -3115107328,3115108351,CH -3115108352,3115110399,IT -3115110400,3115111423,PL -3115111424,3115112447,IR -3115112448,3115114495,NL -3115114496,3115115519,FR -3115115520,3115116543,IQ -3115116544,3115117567,FR -3115117568,3115118591,SY -3115118592,3115119615,PL -3115119616,3115120639,GB -3115120640,3115121663,PL -3115121664,3115122687,CZ -3115122688,3115123711,RU -3115123712,3115124735,SE -3115124736,3115125759,GB -3115125760,3115126783,NL -3115126784,3115127807,RO -3115127808,3115128831,NL -3115128832,3115129855,DE -3115129856,3115130879,BA -3115130880,3115131234,DE -3115131235,3115131235,US -3115131236,3115131903,DE -3115131904,3115132927,RU -3115132928,3115133951,KW -3115133952,3115134975,ES -3115134976,3115135999,GB -3115136000,3115137023,SI -3115137024,3115138047,JO -3115138048,3115139071,LB -3115139072,3115140095,GB -3115140096,3115141119,FR -3115141120,3115142143,RU -3115142144,3115143167,DE -3115143168,3115144191,RU -3115144192,3115145215,IT -3115145216,3115146239,CH -3115146240,3115147263,RU -3115147264,3115148287,FR -3115148288,3115149311,UA -3115149312,3115150335,IR -3115150336,3115151359,US -3115151360,3115152383,UA -3115152384,3115154431,GB -3115154432,3115155455,FR -3115155456,3115156479,DE -3115156480,3115157503,NL -3115157504,3115159551,AT -3115159552,3115160575,MD -3115160576,3115161599,CZ -3115161600,3115162623,FI -3115162624,3115162879,RU -3115162880,3115163135,CY -3115163136,3115164671,RU -3115164672,3115165695,IE -3115165696,3115166719,IR -3115166720,3115167743,SY -3115167744,3115168767,RU -3115168768,3115169791,LU -3115169792,3115170815,IE -3115170816,3115171839,TR -3115171840,3115172863,GB -3115172864,3115173887,SE -3115173888,3115174911,FR -3115174912,3115175935,AL -3115175936,3115176959,FI -3115176960,3115177983,IT -3115177984,3115179007,NL -3115179008,3115180031,SE -3115180032,3115180287,US -3115180288,3115180543,DE -3115180544,3115180799,CY -3115180800,3115181055,MT -3115181056,3115182079,DE -3115182080,3115183103,NL -3115183104,3115184127,IT -3115184128,3115185151,DE -3115185152,3115186175,MD -3115186176,3115187199,CZ -3115187200,3115188223,FR -3115188224,3115189247,IT -3115189248,3115190271,BE -3115190272,3115191295,SE -3115191296,3115192319,PL -3115192320,3115193343,HU -3115193344,3115194367,TR -3115194368,3115195391,FI -3115195392,3115196415,TR -3115196416,3115197439,LI -3115197440,3115198463,DE -3115198464,3115199487,NL -3115199488,3115200511,CZ -3115200512,3115201535,DE -3115201536,3115202559,FR -3115202560,3115203583,GR -3115203584,3115204607,DE -3115204608,3115205631,BE -3115205632,3115206655,TR -3115206656,3115207679,DE -3115207680,3115208703,GB -3115208704,3115209727,ES -3115209728,3115210751,NO -3115210752,3115211775,FR -3115211776,3115212799,CZ -3115212800,3115213823,GE -3115213824,3115214847,US -3115214848,3115215871,CH -3115215872,3115216895,GB -3115216896,3115217919,PL -3115217920,3115218943,DK -3115218944,3115219967,PL -3115219968,3115220991,NL -3115220992,3115222015,RU -3115222016,3115223039,IR -3115223040,3115223807,RU -3115223808,3115224063,US -3115224064,3115225087,SE -3115225088,3115226111,UA -3115226112,3115227135,DE -3115227136,3115228159,PL -3115228160,3115228671,AT -3115228672,3115229183,IL -3115229184,3115230207,EE -3115230208,3115231231,RU -3115231232,3115232255,CZ -3115232256,3115232767,NL -3115232768,3115233279,UA -3115233280,3115234303,IS -3115234304,3115235327,ES -3115235328,3115236351,BE -3115236352,3115237375,NL -3115237376,3115238399,RU -3115238400,3115239423,BE -3115239424,3115240447,IR -3115240448,3115241471,US -3115241472,3115242495,AL -3115242496,3115243519,ES -3115243520,3115244543,CH -3115244544,3115245567,UA -3115245568,3115246591,GB -3115246592,3115247615,SY -3115247616,3115248639,GB -3115248640,3115249663,SY -3115249664,3115250687,LB -3115250688,3115251711,SE -3115251712,3115252735,IR -3115252736,3115253759,US -3115253760,3115254783,SI -3115254784,3115255807,NL -3115256832,3115257855,GB -3115257856,3115258879,RU -3115258880,3115259903,AT -3115259904,3115260927,NL -3115260928,3115261951,GB -3115261952,3115262975,MD -3115262976,3115263999,GB -3115264000,3115265023,CY -3115265024,3115266047,RU -3115266048,3115267071,GB -3115267072,3115268095,SY -3115268096,3115269119,NL -3115269120,3115270143,ES -3115270144,3115271167,NO -3115271168,3115271423,US -3115271424,3115271679,AU -3115271680,3115271935,JP -3115271936,3115272191,HK -3115272192,3115273215,RU -3115273216,3115274239,HK -3115274240,3115275263,MD -3115275264,3115276287,CZ -3115276288,3115277311,NL -3115277312,3115277823,ES -3115277824,3115278335,UA -3115278336,3115279359,NO -3115279360,3115280383,CN -3115280384,3115281407,PL -3115281408,3115282431,IL -3115282432,3115283455,GB -3115283456,3115284479,RU -3115284480,3115285503,FR -3115285504,3115286527,IT -3115286528,3115287551,RU -3115287552,3115288575,SK -3115288576,3115289599,GB -3115289600,3115290623,CZ -3115290624,3115291647,GB -3115291648,3115292671,FR -3115292672,3115293695,GB -3115293696,3115293951,US -3115293952,3115294463,RU -3115294464,3115294719,IN -3115294720,3115295743,GB -3115295744,3115296767,NL -3115296768,3115297791,IE -3115297792,3115298815,RU -3115298816,3115299839,FI -3115299840,3115300863,BE -3115300864,3115301887,PT -3115301888,3115302911,NL -3115302912,3115303935,LT -3115303936,3115305983,NL -3115305984,3115306495,TR -3115306496,3115307007,BE -3115307008,3115307519,DE -3115307520,3115308031,CA -3115308032,3115309055,IT -3115309056,3115310079,BE -3115310080,3115311103,CZ -3115311104,3115312127,RU -3115312128,3115313151,SY -3115313152,3115314175,DE -3115314176,3115315199,UA -3115315200,3115316223,IR -3115316224,3115317247,UA -3115317248,3115318271,JO -3115318272,3115319295,AL -3115319296,3115320319,IE -3115320320,3115322367,ES -3115322368,3115323391,IE -3115323392,3115324415,DE -3115324416,3115325439,IT -3115325440,3115326463,RU -3115326464,3115327487,SE -3115327488,3115328511,IR -3115328512,3115329535,NO -3115329536,3115330559,BG -3115330560,3115331583,JO -3115331584,3115332607,NL -3115332608,3115333631,IS -3115333632,3115334655,IR -3115334656,3115335679,LV -3115335680,3115336703,FR -3115336704,3115337727,ES -3115337728,3115338751,SK -3115338752,3115340799,GB -3115340800,3115341823,ES -3115341824,3115342079,US -3115342080,3115342847,GB -3115342848,3115343871,RU -3115343872,3115344895,SE -3115344896,3115345919,IE -3115345920,3115346943,ES -3115346944,3115347967,UA -3115347968,3115348991,GB -3115348992,3115350015,LV -3115350016,3115351039,PL -3115351040,3115352063,GB -3115352064,3115353087,IE -3115353088,3115354111,GB -3115354112,3115355135,CZ -3115355136,3115356159,NL -3115356160,3115357183,LB -3115357184,3115358207,FR -3115358208,3115362303,DE -3115362304,3115363327,FR -3115363328,3115364351,GB -3115364352,3115365375,FR -3115365376,3115366399,ES -3115366400,3115367423,SE -3115367424,3115368447,ES -3115368448,3115369471,BG -3115369472,3115370495,MT -3115370496,3115371519,IT -3115371520,3115372543,GB -3115372544,3115373567,LB -3115373568,3115374591,NO -3115374592,3115375615,BG -3115375616,3115376639,LV -3115376640,3115377663,UA -3115377664,3115378687,DE -3115378688,3115379711,FR -3115379712,3115380735,CH -3115380736,3115381759,GB -3115381760,3115382271,NO -3115382272,3115382783,SE -3115382784,3115383807,GB -3115383808,3115384831,DE -3115384832,3115385855,TJ -3115385856,3115387903,SK -3115387904,3115388927,MK -3115388928,3115389951,AT -3115389952,3115390719,GB -3115390720,3115390975,NL -3115390976,3115391999,GB -3115392000,3115393023,AL -3115393024,3115395071,IT -3115395072,3115396095,ES -3115396096,3115397119,FR -3115397120,3115398143,MT -3115398144,3115399167,RU -3115399168,3115400191,BG -3115400192,3115401215,RU -3115401216,3115402239,GB -3115402240,3115403263,NL -3115403264,3115404287,ES -3115404288,3115405567,GB -3115405568,3115405823,DE -3115405824,3115406335,GB -3115406336,3115407359,DE -3115407360,3115408383,CY -3115408384,3115409407,MD -3115409408,3115410431,RU -3115410432,3115411455,NL -3115411456,3115412479,AM -3115412480,3115414527,RU -3115414528,3115415551,DE -3115415552,3115416575,DK -3115416576,3115417599,MD -3115417600,3115418367,DE -3115418368,3115418623,HK -3115418624,3115419647,IS -3115419648,3115420671,NL -3115420672,3115421695,DE -3115421696,3115422719,NL -3115422720,3115423743,DE -3115423744,3115424767,ES -3115424768,3115425791,IR -3115425792,3115426815,DK -3115426816,3115427839,TR -3115427840,3115428863,ES -3115428864,3115429887,US -3115429888,3115430399,NL -3115430400,3115430911,FI -3115430912,3115431935,FR -3115431936,3115432959,AE -3115432960,3115433983,UA -3115433984,3115435007,IT -3115435008,3115436031,ES -3115436032,3115437055,GB -3115437056,3115438079,DE -3115438080,3115439103,GB -3115439104,3115440127,IT -3115440128,3115441151,RU -3115441152,3115442175,NL -3115442176,3115443199,FR -3115443200,3115444223,GB -3115444224,3115445247,IR -3115445248,3115446271,RU -3115446272,3115447295,UA -3115447296,3115448319,IT -3115448320,3115449343,DE -3115449344,3115450367,BG -3115450368,3115451391,AT -3115451392,3115452415,BG -3115452416,3115453439,IT -3115453440,3115454463,MD -3115454464,3115455487,ES -3115455488,3115456511,DK -3115456512,3115457535,DE -3115457536,3115458559,FR -3115458560,3115461631,DE -3115461632,3115462655,UA -3115462656,3115462911,FR -3115462912,3115463167,GB -3115463168,3115463423,DE -3115463424,3115463679,US -3115463680,3115464703,FR -3115464704,3115465727,TR -3115465728,3115466751,CH -3115466752,3115468799,IE -3115468800,3115469823,DE -3115469824,3115470847,FR -3115470848,3115471871,ES -3115471872,3115472895,PL -3115472896,3115473919,UA -3115473920,3115474943,IT -3115474944,3115475967,PL -3115475968,3115476991,IT -3115476992,3115478015,IR -3115478016,3115479039,DE -3115479040,3115480063,DK -3115480064,3115481087,DE -3115481088,3115482111,CH -3115482112,3115483135,SE -3115483136,3115484159,RU -3115484160,3115485183,FR -3115485184,3115486207,ES -3115486208,3115487231,SE -3115487232,3115488255,NL -3115488256,3115489279,SY -3115489280,3115490303,US -3115490304,3115491327,PL -3115491328,3115492351,ES -3115492352,3115493375,GB -3115493376,3115494399,ES -3115494400,3115495423,CZ -3115495424,3115496447,GR -3115496448,3115497471,SE -3115497472,3115498495,FR -3115498496,3115499519,GB -3115499520,3115501567,DE -3115501568,3115502591,NL -3115502592,3115504639,RU -3115504640,3115505663,DE -3115505664,3115506687,GB -3115506688,3115507711,IR -3115507712,3115508735,SI -3115508736,3115509759,RO -3115509760,3115510783,NL -3115510784,3115511807,PL -3115511808,3115512831,TR -3115512832,3115513855,RU -3115513856,3115514879,FR -3115514880,3115515903,IT -3115515904,3115517951,RU -3115517952,3115518975,KZ -3115518976,3115519999,UA -3115520000,3115521023,CH -3115521024,3115522047,GB -3115522048,3115523071,TR -3115523072,3115524095,AL -3115524096,3115525119,CZ -3115525120,3115526143,RU -3115526144,3115527167,IE -3115527168,3115528191,BE -3115528192,3115529215,SI -3115529216,3115530239,ME -3115530240,3115531263,PL -3115531264,3115532287,AT -3115532288,3115533311,DE -3115533312,3115534335,MT -3115534336,3115535359,RU -3115535360,3115536383,IS -3115536384,3115537407,BY -3115537408,3115538431,RU -3115538432,3115539455,NL -3115539456,3115540479,ME -3115540480,3115541503,DK -3115541504,3115542527,DE -3115542528,3115543551,ES -3115543552,3115544575,IS -3115544576,3115545599,NL -3115545600,3115546623,FI -3115546624,3115547647,GB -3115547648,3115548671,RU -3115548672,3115549695,NO -3115549696,3115550719,PL -3115550720,3115551743,RS -3115551744,3115552767,ES -3115552768,3115553791,RU -3115553792,3115554815,FR -3115554816,3115555839,DE -3115555840,3115556863,RO -3115556864,3115557887,RU -3115557888,3115558911,DE -3115558912,3115559935,IR -3115559936,3115560959,RU -3115560960,3115561983,FR -3115561984,3115563007,DE -3115563008,3115564031,ES -3115564032,3115565055,RU -3115565056,3115566079,FR -3115566080,3115567103,RU -3115567104,3115567615,ZA -3115567616,3115568127,AE -3115568128,3115569151,NL -3115569152,3115570175,GB -3115570176,3115571199,UA -3115571200,3115572223,SI -3115572224,3115573247,IR -3115573248,3115574271,RU -3115574272,3115575295,GB -3115575296,3115576319,ES -3115576320,3115577343,FI -3115577344,3115578367,IL -3115578368,3115579391,GB -3115579392,3115580415,US -3115580416,3115581439,GB -3115581440,3115582463,CZ -3115582464,3115583487,GB -3115583488,3115584511,NL -3115584512,3115584767,AT -3115584768,3115585023,US -3115585024,3115585535,CZ -3115585536,3115586559,RU -3115586560,3115587583,CH -3115587584,3115588607,DE -3115588608,3115589631,TR -3115589632,3115590655,GB -3115590656,3115591679,GR -3115591680,3115592703,CH -3115592704,3115593727,BE -3115593728,3115593983,ES -3115593984,3115594751,GB -3115594752,3115595775,IR -3115595776,3115596799,RU -3115596800,3115597823,IQ -3115597824,3115598847,NO -3115598848,3115599871,BE -3115599872,3115600895,HU -3115600896,3115601919,BE -3115601920,3115602943,JO -3115602944,3115603967,AE -3115603968,3115604991,HU -3115604992,3115606015,FR -3115606016,3115607039,NL -3115607040,3115608063,MD -3115608064,3115609087,NL -3115609088,3115610111,RU -3115610112,3115611135,PL -3115611136,3115612159,GB -3115612160,3115613183,IT -3115613184,3115614207,LT -3115614208,3115615231,IR -3115615232,3115616255,FR -3115616256,3115618303,SK -3115618304,3115619327,ES -3115619328,3115621375,NL -3115621376,3115622399,GB -3115622400,3115623423,RU -3115623424,3115624447,DE -3115624448,3115625471,IM -3115625472,3115626495,NL -3115626496,3115627519,RU -3115627520,3115628543,IT -3115628544,3115629567,GB -3115629568,3115630591,RU -3115630592,3115631615,GB -3115631616,3115631871,NL -3115631872,3115632639,US -3115632640,3115633663,RU -3115633664,3115635711,PL -3115635712,3115636735,RU -3115636736,3115637759,GB -3115637760,3115638783,US -3115638784,3115639807,DE -3115639808,3115640831,RU -3115640832,3115641855,NO -3115641856,3115642879,RU -3115642880,3115643903,IE -3115643904,3115644927,FR -3115644928,3115645951,RU -3115645952,3115647999,SE -3115648000,3115649023,FR -3115649024,3115649279,NL -3115649280,3115649535,GB -3115649536,3115649791,DE -3115649792,3115650047,GB -3115650048,3115651071,DE -3115651072,3115652095,UA -3115652096,3115653119,DK -3115653120,3115654143,DE -3115654144,3115655167,GR -3115655168,3115656191,ES -3115656192,3115657215,UA -3115657216,3115658239,MD -3115658240,3115659263,SE -3115659264,3115660287,MD -3115660288,3115661311,IQ -3115661312,3115662335,CZ -3115662336,3115663359,NO -3115663360,3115664383,SA -3115664384,3115665407,RS -3115665408,3115666431,NL -3115666432,3115667455,FR -3115667456,3115668479,NO -3115668480,3115669503,NL -3115669504,3115670527,SE -3115670528,3115671551,IT -3115671552,3115672575,SE -3115672576,3115673599,RO -3115673600,3115674623,DE -3115674624,3115675647,SY -3115675648,3115676671,DE -3115676672,3115677695,GB -3115677696,3115678719,DE -3115678720,3115679743,GB -3115679744,3115681791,NL -3115681792,3115682815,IT -3115682816,3115683839,NL -3115683840,3115684863,GB -3115684864,3115685887,BG -3115685888,3115687935,FR -3115687936,3115689983,UA -3115689984,3115691007,DE -3115691008,3115692031,IE -3115692032,3115693055,CZ -3115693056,3115694079,IR -3115694080,3115695103,CZ -3115695104,3115697151,DE -3115697152,3115698175,GB -3115698176,3115699199,RS -3115699200,3115700223,CH -3115700224,3115701247,TR -3115701248,3115702271,NL -3115702272,3115703295,SE -3115703296,3115704319,GR -3115704320,3115705343,DE -3115705344,3115706367,MD -3115706368,3115707391,NL -3115707392,3115708415,ES -3115708416,3115709439,RO -3115709440,3115710463,RU -3115710464,3115711487,GE -3115711488,3115714559,ES -3115715584,3115717631,RU -3115717632,3115718655,UA -3115718656,3115719679,CH -3115719680,3115720703,GB -3115720704,3115722751,DE -3115722752,3115723775,FR -3115723776,3115724799,DE -3115724800,3115725311,GB -3115725312,3115725567,DE -3115725568,3115725823,CH -3115725824,3115726847,GB -3115726848,3115727871,NL -3115727872,3115728703,GB -3115728704,3115728735,NL -3115728736,3115728895,GB -3115728896,3115729919,FR -3115729920,3115730943,GB -3115730944,3115731967,IE -3115731968,3115732991,MD -3115732992,3115734015,DE -3115734016,3115735039,SE -3115735040,3115736063,GB -3115736064,3115737087,LV -3115737088,3115738111,PL -3115738112,3115739135,UA -3115739136,3115740159,NL -3115740160,3115741183,RU -3115741184,3115742207,LB -3115742208,3115743231,IT -3115743232,3115744255,AM -3115745280,3115746303,RU -3115746304,3115747327,BE -3115747328,3115748351,JO -3115748352,3115749375,IT -3115749376,3115750399,GB -3115750400,3115751423,GE -3115751424,3115752447,ES -3115752448,3115753471,GB -3115753472,3115754495,RS -3115754496,3115755519,RU -3115755520,3115756543,FR -3115756544,3115757567,IT -3115757568,3115758591,AT -3115758592,3115759615,ES -3115759616,3115760639,US -3115760640,3115761663,TR -3115761664,3115762687,MD -3115762688,3115763711,IT -3115763712,3115764735,GB -3115764736,3115765759,DK -3115765760,3115766783,IT -3115766784,3115767807,HU -3115767808,3115768831,KZ -3115768832,3115769855,IR -3115769856,3115770879,PL -3115770880,3115771903,GB -3115771904,3115772927,DE -3115772928,3115773951,TR -3115773952,3115774975,GB -3115776000,3115777023,IR -3115777024,3115779071,FR -3115779072,3115780095,IT -3115780096,3115781119,CZ -3115781120,3115782143,RU -3115782144,3115783167,ES -3115783168,3115784191,GB -3115784192,3115785215,DE -3115785216,3115786239,NL -3115786240,3115787263,MD -3115787264,3115788287,PL -3115788288,3115789311,DK -3115789312,3115790335,UA -3115790336,3115791359,RU -3115791360,3115792383,DE -3115792384,3115793407,SE -3115793408,3115795455,FR -3115795456,3115796479,IT -3115796480,3115797503,CZ -3115797504,3115798015,UA -3115798016,3115798527,RU -3115798528,3115799551,MD -3115799552,3115801599,DE -3115801600,3115802623,LB -3115802624,3115802879,NL -3115802880,3115803135,RO -3115803136,3115803391,NL -3115803392,3115803647,RO -3115803648,3115804671,GB -3115804672,3115804927,CH -3115804928,3115805183,IT -3115805184,3115805439,ES -3115805440,3115805695,AT -3115805696,3115806719,UA -3115806720,3115807743,NL -3115807744,3115808767,BE -3115808768,3115809791,BY -3115809792,3115810815,DE -3115810816,3115811839,IR -3115811840,3115812863,IL -3115812864,3115813887,MD -3115813888,3115814911,FR -3115814912,3115815935,SE -3115815936,3115816959,RS -3115816960,3115817983,SE -3115817984,3115819007,DE -3115819008,3115820031,RU -3115820032,3115822079,TR -3115822080,3115823103,RU -3115823104,3115824127,DE -3115824128,3115824639,US -3115824640,3115824895,DE -3115824896,3115825151,GB -3115825152,3115826175,GR -3115826176,3115828223,CH -3115828224,3115829247,RU -3115829248,3115830271,NL -3115830272,3115831295,DE -3115831296,3115832319,FR -3115832320,3115833343,GB -3115833344,3115834367,FR -3115834368,3115835391,ES -3115835392,3115836415,PL -3115836416,3115837439,FR -3115837440,3115838463,SK -3115838464,3115839487,PL -3115839488,3115840511,UZ -3115840512,3115841535,IE -3115841536,3115842559,MK -3115842560,3115843583,FR -3115843584,3115844607,ES -3115844608,3115845631,FR -3115845632,3115846655,PL -3115846656,3115847679,CH -3115847680,3115848703,IL -3115848704,3115849727,AE -3115849728,3115850751,TR -3115850752,3115851775,SK -3115851776,3115852799,IR -3115852800,3115853823,IT -3115853824,3115854847,RU -3115854848,3115855871,FI -3115855872,3115856895,IR -3115856896,3115857919,RU -3115857920,3115858943,LU -3115858944,3115859967,BG -3115859968,3115860991,FI -3115860992,3115862015,DE -3115862016,3115863039,NL -3115863040,3115864063,RU -3115864064,3115865087,PL -3115865088,3115866111,LB -3115866112,3115867135,ES -3115867136,3115868159,SE -3115868160,3115869183,NL -3115869184,3115870207,DE -3115870208,3115871231,SY -3115871232,3115872255,NL -3115872256,3115873279,GB -3115873280,3115874303,CH -3115874304,3115875327,GB -3115875328,3115876351,PL -3115876352,3115877375,RU -3115877376,3115878399,CH -3115878400,3115879423,IT -3115879424,3115879679,GB -3115879680,3115880447,CR -3115880448,3115881471,LT -3115881472,3115882495,ES -3115882496,3115884543,GB -3115884544,3115885567,DE -3115885568,3115886591,NL -3115886592,3115887615,UA -3115887616,3115888639,ES -3115888640,3115889663,CH -3115889664,3115889919,PL -3115889920,3115890175,CZ -3115890176,3115890431,GB -3115890432,3115890687,PL -3115890688,3115891711,FR -3115891712,3115892735,NL -3115892736,3115893759,GB -3115893760,3115894783,IQ -3115894784,3115895807,DE -3115895808,3115896831,NL -3115896832,3115897855,TR -3115897856,3115898879,DE -3115898880,3115899903,IQ -3115899904,3115900927,GB -3115900928,3115901951,DE -3115901952,3115902975,IT -3115902976,3115903999,RU -3115904000,3115905023,GB -3115905024,3115906047,RO -3115906048,3115907071,MD -3115907072,3115908095,GB -3115908096,3115909119,CZ -3115909120,3115910143,UA -3115910144,3115912191,FR -3115912192,3115913215,MD -3115913216,3115914239,IR -3115914240,3115915263,RU -3115915264,3115916287,DE -3115916288,3115917311,NL -3115917312,3115918335,CH -3115918336,3115919359,ES -3115919360,3115920383,NL -3115920384,3115921407,IT -3115921408,3115922431,NL -3115923456,3115924479,RU -3115924480,3115925503,TR -3115925504,3115926527,ES -3115926528,3115927551,RU -3115927552,3115928575,SY -3115928576,3115929599,GB -3115929600,3115930623,US -3115930624,3115931647,GB -3115931648,3115932671,SI -3115932672,3115933695,ES -3115933696,3115934719,DK -3115934720,3115935743,RO -3115935744,3115936767,RU -3115936768,3115937791,GB -3115937792,3115938815,TR -3115938816,3115939839,FR -3115939840,3115940863,RU -3115940864,3115941119,CU -3115941120,3115941887,DE -3115941888,3115942911,CZ -3115942912,3115943935,IL -3115943936,3115948031,RU -3115948032,3115949055,GB -3115949056,3115950079,GR -3115950080,3115951103,GB -3115951104,3115952127,NL -3115952128,3115953151,FI -3115953152,3115954175,IQ -3115954176,3115955199,LB -3115955200,3115956223,UA -3115956224,3115957247,CY -3115957248,3115959295,DE -3115959296,3115960319,ES -3115960320,3115961343,CH -3115961344,3115962367,NL -3115962368,3115963391,AT -3115963392,3115964415,NL -3115964416,3115965439,CZ -3115965440,3115966463,SY -3115966464,3115967487,GB -3115967488,3115968511,BE -3115968512,3115969535,TR -3115969536,3115970559,CH -3115970560,3115971583,IR -3115971584,3115972607,NL -3115972608,3115973119,CR -3115973120,3115973375,GB -3115973376,3115973631,US -3115973632,3115974655,UA -3115974656,3115975679,RU -3115975680,3115976703,GB -3115976704,3115977727,US -3115977728,3115978751,IT -3115978752,3115980799,PL -3115980800,3115981823,DE -3115981824,3115982847,ES -3115982848,3115983871,SE -3115983872,3115984895,CZ -3115984896,3115985919,FI -3115985920,3115986943,NO -3115986944,3115987967,IR -3115987968,3115988991,GB -3115988992,3115990015,SE -3115990016,3115991039,RO -3115991040,3115991551,NL -3115991552,3115991807,BE -3115991808,3115992063,NL -3115992064,3115993087,IT -3115993088,3115994111,FR -3115994112,3115994367,CH -3115994368,3115994623,GB -3115994624,3115994879,SE -3115994880,3115995135,DK -3115995136,3115996159,AL -3115996160,3115997183,GR -3115997184,3115998207,FR -3115998208,3115999231,IT -3115999232,3116000255,PL -3116000256,3116002303,GB -3116002304,3116003327,TR -3116003328,3116004351,BG -3116004352,3116005375,NL -3116005376,3116006399,DE -3116006400,3116007423,GB -3116007424,3116008447,RO -3116008448,3116009471,NO -3116009472,3116010495,BG -3116010496,3116011519,RU -3116011520,3116012031,DE -3116012032,3116012543,US -3116012544,3116013567,BE -3116013568,3116015615,PL -3116015616,3116016639,CZ -3116016640,3116017663,GB -3116017664,3116019711,NL -3116019712,3116020735,PS -3116020736,3116021759,ES -3116021760,3116022783,RU -3116022784,3116023807,ES -3116023808,3116024831,RU -3116024832,3116025855,CZ -3116025856,3116026879,ES -3116026880,3116027903,OM -3116027904,3116028927,BY -3116028928,3116029951,BE -3116029952,3116030975,PL -3116030976,3116033023,DE -3116033024,3116034047,FR -3116034048,3116035071,RU -3116035072,3116036095,DE -3116036096,3116037119,IR -3116037120,3116038143,NL -3116038144,3116039167,CZ -3116039168,3116040191,PL -3116040192,3116041215,AL -3116041216,3116042239,BA -3116042240,3116043263,SI -3116043264,3116044287,NL -3116044288,3116045311,TR -3116045312,3116046335,NL -3116046336,3116047359,NO -3116047360,3116048383,FR -3116048384,3116049407,MD -3116049408,3116050431,IL -3116050432,3116052479,IT -3116052480,3116053503,IR -3116053504,3116054527,PL -3116054528,3116055551,GB -3116055552,3116057599,DE -3116057600,3116058623,ES -3116058624,3116059647,HU -3116059648,3116060671,OM -3116060672,3116061695,UA -3116061696,3116062719,IR -3116062720,3116063743,RU -3116063744,3116064767,LB -3116064768,3116065791,ES -3116065792,3116066047,BE -3116066048,3116066815,NL -3116066816,3116067839,TR -3116067840,3116068863,NL -3116068864,3116069887,RU -3116069888,3116070911,GB -3116070912,3116071935,CH -3116071936,3116072959,NL -3116072960,3116073983,LB -3116073984,3116075007,GB -3116075008,3116076031,HR -3116076032,3116077055,CZ -3116077056,3116078079,DK -3116078080,3116080383,GB -3116080384,3116080639,US -3116080640,3116080895,HK -3116080896,3116081151,GB -3116081152,3116082175,IL -3116082176,3116083199,FR -3116083200,3116084223,US -3116084224,3116085247,IT -3116085248,3116085503,KW -3116085504,3116085759,SA -3116085760,3116086015,EG -3116086016,3116086271,JO -3116086272,3116087295,ES -3116087296,3116088319,TR -3116088320,3116089343,RU -3116089344,3116090367,SY -3116090368,3116091391,RU -3116091392,3116092415,DE -3116092416,3116093439,IQ -3116093440,3116094463,FR -3116094464,3116095487,CZ -3116095488,3116096511,FR -3116096512,3116097535,SY -3116097536,3116098559,NL -3116098560,3116099583,CH -3116099584,3116100607,US -3116100608,3116101631,CZ -3116101632,3116102143,DE -3116102144,3116102655,GB -3116102656,3116103679,FR -3116103680,3116104703,HU -3116104704,3116105727,SE -3116105728,3116107007,DE -3116107008,3116107263,US -3116107264,3116107775,DE -3116107776,3116108799,ES -3116108800,3116109823,RU -3116109824,3116110847,ES -3116110848,3116111871,DK -3116111872,3116112895,IT -3116112896,3116113919,US -3116113920,3116114943,DE -3116114944,3116115967,TR -3116115968,3116116991,NL -3116116992,3116118015,CH -3116118016,3116120063,DE -3116120064,3116121087,HU -3116121088,3116122111,GB -3116122112,3116123135,DE -3116123136,3116124159,PL -3116124160,3116125183,DE -3116125184,3116126207,NL -3116126208,3116127231,CH -3116127232,3116128255,TR -3116128256,3116130303,FR -3116130304,3116131327,RU -3116131328,3116132351,CZ -3116132352,3116133375,IR -3116133376,3116134399,DE -3116134400,3116135423,IR -3116135424,3116136447,PL -3116136448,3116137471,DE -3116137472,3116138495,NL -3116138496,3116139519,TR -3116139520,3116140543,DE -3116140544,3116141567,AT -3116141568,3116142591,NL -3116142592,3116143615,TR -3116143616,3116144639,ES -3116144640,3116145663,CH -3116145664,3116147711,FR -3116147712,3116148735,PL -3116148736,3116149759,FR -3116149760,3116150783,GB -3116150784,3116151807,FR -3116151808,3116152831,RU -3116153856,3116154879,SK -3116154880,3116155903,RU -3116155904,3116156927,CH -3116156928,3116157951,DE -3116157952,3116158975,RU -3116158976,3116161023,ES -3116161024,3116162047,AL -3116162048,3116163071,GB -3116163072,3116164095,SE -3116164096,3116165119,BG -3116165120,3116166143,GB -3116166144,3116167167,SK -3116167168,3116169215,DE -3116169216,3116170239,US -3116170240,3116171263,GB -3116171264,3116172287,DE -3116172288,3116173311,CZ -3116173312,3116174335,NL -3116174336,3116176383,RU -3116176384,3116177407,FR -3116177408,3116177919,US -3116177920,3116178431,DE -3116178432,3116179455,SE -3116179456,3116180479,CZ -3116180480,3116181503,US -3116181504,3116182527,GB -3116182528,3116183551,US -3116183552,3116184575,SE -3116184576,3116185599,TR -3116185600,3116185855,US -3116185856,3116186623,GB -3116186624,3116187647,IT -3116187648,3116188671,ES -3116188672,3116189695,MD -3116189696,3116190719,NL -3116190720,3116191743,IT -3116191744,3116192767,AT -3116192768,3116193791,SE -3116193792,3116194815,LB -3116194816,3116195839,CZ -3116195840,3116196863,DE -3116196864,3116197887,RU -3116197888,3116198911,NL -3116198912,3116199935,ES -3116199936,3116200191,DE -3116200192,3116200447,FR -3116200448,3116200703,HU -3116200704,3116200959,CZ -3116200960,3116201983,DE -3116201984,3116203007,IR -3116203008,3116204031,PL -3116204032,3116205055,TR -3116205056,3116206079,RU -3116206080,3116207103,PL -3116207104,3116208127,UA -3116208128,3116209151,GB -3116209152,3116210175,CH -3116210176,3116211199,LT -3116211200,3116212223,FR -3116212224,3116213247,NL -3116213248,3116214271,RU -3116214272,3116215295,RO -3116215296,3116216319,FR -3116216320,3116217343,ES -3116217344,3116218367,NL -3116218368,3116219391,UA -3116219392,3116220415,FR -3116220416,3116221439,RU -3116221440,3116222463,BG -3116222464,3116223487,GB -3116223488,3116224511,PL -3116224512,3116225535,GE -3116225536,3116226559,PL -3116226560,3116227583,GE -3116227584,3116228607,DE -3116228608,3116229631,ES -3116229632,3116230655,DE -3116230656,3116231679,GB -3116231680,3116232703,FR -3116232704,3116233727,NL -3116233728,3116234751,UA -3116234752,3116235775,GB -3116235776,3116238847,RU -3116238848,3116239871,UA -3116239872,3116240895,IE -3116240896,3116241151,US -3116241152,3116241407,FR -3116241408,3116241663,US -3116241664,3116241919,TR -3116241920,3116242943,IR -3116242944,3116243967,NL -3116243968,3116244991,LB -3116244992,3116246015,CH -3116246016,3116247039,BG -3116247040,3116248063,RU -3116248064,3116249087,GB -3116249088,3116249343,AT -3116249344,3116249599,DE -3116249600,3116249855,CH -3116249856,3116250111,AT -3116250112,3116251135,DE -3116251136,3116251391,US -3116251392,3116251519,GB -3116251520,3116251647,DE -3116251648,3116252159,US -3116252160,3116253183,MD -3116253184,3116254207,NL -3116254208,3116255231,DE -3116255232,3116256255,GB -3116256256,3116257279,AT -3116257280,3116257535,CR -3116257536,3116258303,AT -3116258304,3116259327,NL -3116259328,3116260351,FR -3116260352,3116261375,DE -3116261376,3116262399,BG -3116262400,3116263423,ES -3116263424,3116264447,RU -3116264448,3116265471,NL -3116265472,3116266495,CZ -3116266496,3116268543,RU -3116268544,3116269567,DE -3116269568,3116270591,GB -3116270592,3116271615,AL -3116271616,3116272639,IT -3116272640,3116273663,US -3116273664,3116274687,SE -3116274688,3116275711,UA -3116275712,3116276735,RS -3116276736,3116277759,DE -3116277760,3116278783,IT -3116278784,3116279807,RU -3116279808,3116281855,NO -3116281856,3116282879,ES -3116282880,3116285951,RU -3116285952,3116286975,DE -3116286976,3116287999,GB -3116288000,3116290047,IE -3116290048,3116294143,IT -3116294144,3116295167,US -3116295168,3116297215,NL -3116297216,3116298239,DE -3116298240,3116299263,ES -3116299264,3116300287,CH -3116300288,3116301311,CZ -3116301312,3116302335,ES -3116302336,3116303359,NL -3116303360,3116304383,PT -3116304384,3116305407,ES -3116305408,3116306431,NL -3116306432,3116307455,EE -3116307456,3116308479,ES -3116308480,3116309503,NO -3116309504,3116310527,KZ -3116310528,3116311551,RU -3116311552,3116312575,FR -3116312576,3116314623,ES -3116314624,3116315647,FR -3116315648,3116316671,TJ -3116316672,3116317695,RU -3116317696,3116318719,IT -3116318720,3116319743,ES -3116319744,3116320767,CH -3116320768,3116321791,NL -3116321792,3116322815,IR -3116322816,3116323839,UA -3116323840,3116324863,GB -3116324864,3116325887,ES -3116325888,3116326911,FR -3116326912,3116327935,IT -3116327936,3116328959,NL -3116328960,3116329983,IT -3116329984,3116331007,DE -3116331008,3116332031,UA -3116332032,3116333055,US -3116333056,3116334079,DE -3116334080,3116335103,NL -3116335104,3116336127,BE -3116336128,3116337151,NL -3116337152,3116338175,SA -3116338176,3116339199,RU -3116339200,3116340223,CH -3116340224,3116341247,UA -3116341248,3116342271,FR -3116342272,3116343295,IE -3116343296,3116344319,GB -3116344320,3116345343,AL -3116345344,3116346367,MD -3116346368,3116347391,DE -3116347392,3116348415,UA -3116348416,3116349439,IT -3116349440,3116350463,CZ -3116350464,3116351487,HU -3116351488,3116352511,FI -3116352512,3116353535,RU -3116353536,3116354559,FR -3116354560,3116355583,IL -3116355584,3116356607,GB -3116356608,3116357631,RU -3116357632,3116358655,DE -3116358656,3116359679,GE -3116359680,3116360703,DE -3116360704,3116361727,US -3116361728,3116362751,IS -3116362752,3116363775,CH -3116363776,3116364799,NL -3116364800,3116365823,PL -3116365824,3116367871,ES -3116367872,3116368895,NL -3116368896,3116369919,GI -3116369920,3116370943,IR -3116370944,3116371967,FI -3116371968,3116372991,NL -3116372992,3116374015,RU -3116374016,3116375039,FI -3116375040,3116376063,DE -3116376064,3116377087,BE -3116377088,3116378111,DE -3116378112,3116379135,GB -3116379136,3116380159,BE -3116380160,3116381183,DE -3116381184,3116382207,LB -3116382208,3116382463,JP -3116382464,3116382719,GU -3116382720,3116382975,AQ -3116382976,3116383231,DE -3116383232,3116384255,RU -3116384256,3116385279,DE -3116385280,3116386047,US -3116386048,3116386303,GB -3116386304,3116387327,ES -3116387328,3116388351,DE -3116388352,3116389375,GB -3116389376,3116390399,BG -3116390400,3116391423,IE -3116391424,3116392447,GB -3116392448,3116393471,US -3116393472,3116394495,PL -3116394496,3116395519,NL -3116395520,3116396543,RU -3116396544,3116397567,IR -3116397568,3116398591,ES -3116398592,3116399615,RO -3116399616,3116400639,NL -3116400640,3116401663,FI -3116401664,3116402687,NL -3116402688,3116403711,IT -3116403712,3116404735,DE -3116404736,3116405759,NL -3116405760,3116406783,FR -3116406784,3116407807,IE -3116407808,3116408831,RU -3116408832,3116409855,LB -3116409856,3116410879,GB -3116410880,3116412927,DE -3116412928,3116413951,GB -3116413952,3116414975,ES -3116414976,3116415231,NL -3116415232,3116415999,BE -3116416000,3116417023,NL -3116417024,3116418047,CH -3116418048,3116419071,FI -3116419072,3116420095,DE -3116420096,3116421119,BE -3116421120,3116422143,ES -3116422144,3116423167,NL -3116423168,3116424191,UA -3116424192,3116425215,ES -3116425216,3116426239,AT -3116426240,3116427263,GB -3116427264,3116428287,NO -3116428288,3116429311,KW -3116429312,3116430335,PL -3116430336,3116431359,RU -3116431360,3116432383,UA -3116432384,3116433407,HU -3116433408,3116434431,ES -3116434432,3116435455,TR -3116435456,3116436479,ES -3116436480,3116437503,AM -3116437504,3116439551,RU -3116439552,3116440575,LT -3116440576,3116441599,MD -3116441600,3116442879,GB -3116442880,3116443135,US -3116443136,3116443391,FR -3116443392,3116443647,GB -3116443648,3116444671,DE -3116444672,3116445695,FR -3116445696,3116446719,US -3116446720,3116447743,RO -3116447744,3116448767,BG -3116448768,3116449791,EE -3116449792,3116450815,US -3116450816,3116451839,ES -3116451840,3116452863,NL -3116452864,3116453887,FI -3116453888,3116454911,DE -3116454912,3116455935,CZ -3116455936,3116456959,RU -3116456960,3116457983,NO -3116457984,3116459007,MD -3116459008,3116460031,CZ -3116460032,3116461055,ES -3116461056,3116462079,FR -3116462080,3116464127,PL -3116464128,3116465151,DK -3116465152,3116466175,SE -3116466176,3116467199,CZ -3116467200,3116468223,AZ -3116468224,3116470271,RU -3116470272,3116471295,DE -3116471296,3116472319,GB -3116472320,3116473343,AE -3116473344,3116474367,GB -3116474368,3116475391,PL -3116475392,3116476415,TR -3116476416,3116477439,GB -3116477440,3116478463,ES -3116478464,3116479487,JO -3116479488,3116480511,CH -3116480512,3116481535,NL -3116481536,3116482559,IT -3116482560,3116483583,AT -3116483584,3116484607,RU -3116484608,3116485631,ES -3116485632,3116486655,RU -3116486656,3116488703,IR -3116488704,3116489727,NL -3116489728,3116490751,HU -3116490752,3116491775,CH -3116491776,3116492799,DE -3116492800,3116493823,IR -3116493824,3116494847,DK -3116494848,3116495871,NL -3116495872,3116496895,CH -3116496896,3116497919,RU -3116497920,3116498943,IT -3116498944,3116499967,NL -3116499968,3116500991,IT -3116500992,3116502015,IQ -3116502016,3116504063,NL -3116504064,3116505087,AT -3116505088,3116507135,ES -3116507136,3116508159,RU -3116508160,3116509183,DE -3116509184,3116510207,GB -3116510208,3116511231,CZ -3116511232,3116512255,ES -3116512256,3116513279,GB -3116513280,3116515327,ES -3116515328,3116516351,UA -3116516352,3116517375,CZ -3116517376,3116518399,SY -3116518400,3116519423,IR -3116519424,3116520447,RU -3116520448,3116521471,BE -3116521472,3116522495,GB -3116522496,3116523519,LU -3116523520,3116524543,TR -3116524544,3116525567,ES -3116525568,3116526591,RU -3116526592,3116527615,ES -3116527616,3116528639,GB -3116528640,3116529663,NL -3116529664,3116530687,UA -3116530688,3116531711,SY -3116531712,3116532735,FR -3116532736,3116533759,SA -3116533760,3116534783,NL -3116534784,3116535807,DE -3116535808,3116536831,AT -3116536832,3116537855,DE -3116537856,3116538879,LB -3116538880,3116539903,FR -3116539904,3116540927,NL -3116540928,3116541951,FR -3116541952,3116542975,GB -3116542976,3116543999,TR -3116544000,3116545023,ES -3116545024,3116546047,CH -3116546048,3116546079,FR -3116546080,3116546111,GB -3116546112,3116546143,DE -3116546144,3116546175,LU -3116546176,3116546207,ES -3116546208,3116546223,DK -3116546224,3116546239,FI -3116546240,3116546255,NL -3116546256,3116546271,PT -3116546272,3116546287,SE -3116546288,3116546303,AU -3116546304,3116546319,CH -3116546320,3116546335,HR -3116546336,3116546351,IE -3116546352,3116546367,LU -3116546368,3116546383,BE -3116546384,3116546399,GR -3116546400,3116546415,NO -3116546416,3116546431,SI -3116546432,3116546815,LU -3116546816,3116547071,BE -3116547072,3116548095,UA -3116548096,3116549119,NL -3116549120,3116550143,TJ -3116550144,3116551167,IT -3116551168,3116552191,FR -3116552192,3116553215,ES -3116553216,3116554239,PL -3116554240,3116555263,US -3116555264,3116557311,PL -3116557312,3116558335,NL -3116558336,3116559359,FR -3116559360,3116560383,DE -3116560384,3116561407,IL -3116561408,3116562431,IR -3116562432,3116563455,NL -3116563456,3116564479,GB -3116564480,3116565503,DK -3116565504,3116566527,MD -3116566528,3116567551,UA -3116567552,3116568575,GB -3116568576,3116569599,RO -3116569600,3116570623,EE -3116570624,3116571647,RU -3116571648,3116572671,BE -3116572672,3116573695,SA -3116573696,3116574719,ES -3116574720,3116575743,UA -3116575744,3116576767,ES -3116576768,3116577791,TR -3116577792,3116578815,HU -3116578816,3116579839,GB -3116579840,3116580863,AT -3116580864,3116581887,US -3116581888,3116582911,CH -3116582912,3116583935,IR -3116583936,3116584959,TR -3116584960,3116587007,CZ -3116587008,3116588031,FR -3116588032,3116589055,SE -3116589056,3116590079,ES -3116590080,3116591103,DE -3116591104,3116592127,GB -3116592128,3116593151,ES -3116593152,3116594175,DE -3116594176,3116595199,GB -3116595200,3116596223,DK -3116596224,3116597247,GB -3116597248,3116598271,IT -3116598272,3116599295,GB -3116599296,3116600319,BE -3116600320,3116601343,NO -3116601344,3116602367,RU -3116602368,3116603391,DE -3116603392,3116604415,RU -3116604416,3116605439,SI -3116605440,3116606463,MD -3116606464,3116607487,GB -3116607488,3116608511,RU -3116608512,3116609535,DK -3116609536,3116610559,ES -3116610560,3116611583,DE -3116611584,3116612607,MD -3116612608,3116613631,RU -3116613632,3116614655,PL -3116614656,3116615679,CH -3116615680,3116616703,GB -3116616704,3116617727,ES -3116617728,3116618751,NO -3116618752,3116619775,NL -3116619776,3116620799,DE -3116620800,3116621823,NL -3116621824,3116622847,CZ -3116622848,3116623871,TR -3116623872,3116624895,SE -3116624896,3116625151,AT -3116625152,3116625407,EE -3116625408,3116625663,GL -3116625664,3116625919,NZ -3116625920,3116626943,RU -3116626944,3116627967,NL -3116627968,3116628991,FR -3116628992,3116630015,TR -3116630016,3116631039,UA -3116631040,3116632063,FI -3116632064,3116633087,CH -3116633088,3116634111,RO -3116634112,3116635135,ES -3116635136,3116635903,DE -3116635904,3116636159,GB -3116636160,3116637183,US -3116637184,3116638207,NL -3116638208,3116639231,ES -3116639232,3116640255,SE -3116640256,3116641279,ES -3116641280,3116642303,NL -3116642304,3116643327,IT -3116643328,3116644351,HU -3116644352,3116645375,ES -3116645376,3116646399,NL -3116646400,3116647423,ES -3116647424,3116648447,UA -3116648448,3116649471,FR -3116649472,3116650495,DK -3116650496,3116651519,GB -3116651520,3116652543,CH -3116652544,3116653567,NO -3116653568,3116654591,US -3116654592,3116656639,GB -3116656640,3116657663,CH -3116657664,3116658687,DE -3116658688,3116659711,ES -3116659712,3116660735,RU -3116660736,3116661759,DE -3116661760,3116662783,UA -3116662784,3116663807,CH -3116663808,3116664831,GB -3116664832,3116665855,CH -3116665856,3116667903,SY -3116667904,3116668927,IR -3116668928,3116669951,SE -3116669952,3116670975,AT -3116670976,3116673023,IT -3116673024,3116674047,RU -3116674048,3116675071,NL -3116675072,3116676095,AT -3116676096,3116677119,AL -3116677120,3116678143,RU -3116678144,3116679167,NL -3116679168,3116681215,MD -3116681216,3116682239,ES -3116682240,3116684287,GB -3116684288,3116686335,UZ -3116686336,3116687359,NL -3116687360,3116688383,US -3116688384,3116689407,PL -3116689408,3116690431,FI -3116690432,3116691455,RU -3116691456,3116692479,AT -3116692480,3116693503,RU -3116693504,3116696575,ES -3116696576,3116697599,MK -3116697600,3116698623,IT -3116698624,3116699647,RU -3116699648,3116700671,NL -3116700672,3116701695,SY -3116701696,3116702719,NL -3116702720,3116703231,US -3116703232,3116703487,NL -3116703488,3116703743,GB -3116703744,3116704767,RU -3116704768,3116705791,BE -3116705792,3116706815,CH -3116706816,3116707839,AT -3116707840,3116708863,ES -3116708864,3116711935,GB -3116711936,3116712959,ES -3116712960,3116713983,IR -3116713984,3116715007,RU -3116715008,3116716031,ES -3116716032,3116717055,NL -3116717056,3116718079,FR -3116718080,3116719103,ES -3116719104,3116720127,SE -3116720128,3116721151,LU -3116721152,3116724223,FR -3116724224,3116725247,IR -3116725248,3116726271,NO -3116726272,3116727295,MD -3116727296,3116728319,TR -3116728320,3116729343,IT -3116729344,3116729599,DE -3116729600,3116730367,NL -3116730368,3116731391,DK -3116731392,3116732415,IT -3116732416,3116733439,RU -3116733440,3116734463,DK -3116734464,3116735487,BG -3116735488,3116736511,FR -3116736512,3116737535,GB -3116737536,3116738559,DE -3116738560,3116739583,DK -3116739584,3116740607,DE -3116740608,3116741631,JO -3116742656,3116743679,FR -3116743680,3116744703,NL -3116744704,3116745727,US -3116745728,3116746751,TR -3116746752,3116747775,ES -3116747776,3116748799,IL -3116748800,3116749823,NO -3116749824,3116750847,IT -3116750848,3116751871,ES -3116751872,3116752895,NO -3116752896,3116753919,SE -3116753920,3116754943,IT -3116754944,3116755967,RU -3116755968,3116756991,DE -3116756992,3116758015,NL -3116758016,3116759039,ES -3116759040,3116760063,US -3116760064,3116761087,FR -3116761088,3116762111,PL -3116762112,3116763135,SE -3116763136,3116764159,US -3116764160,3116765183,GB -3116765184,3116766207,PL -3116766208,3116767231,FR -3116767232,3116767743,US -3116767744,3116767999,NL -3116768000,3116769279,GB -3116769280,3116770303,LT -3116770304,3116772351,RU -3116772352,3116773375,MD -3116773376,3116774399,ES -3116774400,3116775423,TR -3116775424,3116775679,RO -3116775680,3116776447,NL -3116776448,3116777471,IT -3116777472,3116778495,ES -3116778496,3116779519,GB -3116779520,3116780543,TR -3116780544,3116781567,FR -3116781568,3116782591,SE -3116782592,3116783615,GB -3116783616,3116784639,DE -3116784640,3116785663,NO -3116785664,3116786687,IT -3116786688,3116787711,ES -3116787712,3116788735,CY -3116788736,3116789759,ES -3116789760,3116790783,RU -3116790784,3116792831,IT -3116792832,3116793855,TR -3116793856,3116794879,FR -3116794880,3116795903,GB -3116795904,3116796927,LT -3116796928,3116797951,CH -3116797952,3116798975,IS -3116798976,3116799999,DE -3116800000,3116801023,RU -3116801024,3116802047,IT -3116802048,3116803071,IR -3116803072,3116804095,NL -3116804096,3116805119,HU -3116805120,3116806143,SY -3116806144,3116809215,ES -3116809216,3116810239,GB -3116810240,3116811263,SE -3116811264,3116812287,TR -3116812288,3116813311,DE -3116813312,3116814335,CH -3116814336,3116815359,IT -3116815360,3116816383,MD -3116816384,3116818431,DE -3116818432,3116819455,FR -3116819456,3116820479,GB -3116820480,3116822527,AT -3116822528,3116823039,US -3116823040,3116823295,AU -3116823296,3116824575,US -3116824576,3116825599,FR -3116825600,3116826623,IR -3116826624,3116827647,DE -3116827648,3116829695,RU -3116829696,3116830719,CY -3116830720,3116831743,GB -3116831744,3116832767,MD -3116832768,3116833791,IT -3116833792,3116834815,HU -3116834816,3116835839,FR -3116835840,3116836863,BG -3116836864,3116837887,FR -3116837888,3116838911,ES -3116838912,3116839935,IT -3116839936,3116841983,GB -3116841984,3116843007,SC -3116843008,3116844031,IR -3116844032,3116845055,DE -3116845056,3116846079,IT -3116846080,3116847103,DE -3116847104,3116848127,AT -3116848128,3116849151,CZ -3116849152,3116850175,TR -3116850176,3116851199,NL -3116851200,3116852223,UA -3116852224,3116853247,US -3116853248,3116854271,DE -3116854272,3116855295,NL -3116855296,3116856319,IT -3116856320,3116857343,NL -3116857344,3116858367,RS -3116858368,3116859391,NL -3116859392,3116860415,GB -3116860416,3116861439,DE -3116861440,3116862463,SE -3116862464,3116863487,DE -3116863488,3116864511,RU -3116864512,3116865535,ES -3116865536,3116866559,AT -3116866560,3116867583,ES -3116867584,3116868607,RU -3116868608,3116869631,GB -3116869632,3116870655,SE -3116870656,3116871679,RO -3116871680,3116872703,CH -3116872704,3116873727,BE -3116873728,3116874751,FR -3116874752,3116875775,NL -3116875776,3116876799,DE -3116876800,3116877823,IR -3116877824,3116878847,FR -3116878848,3116879871,DE -3116879872,3116880895,IR -3116880896,3116881919,ES -3116881920,3116882943,DE -3116882944,3116883967,GB -3116883968,3116884991,US -3116884992,3116886015,ES -3116886016,3116887039,NL -3116887040,3116888063,DK -3116888064,3116889087,GB -3116889088,3116890111,SY -3116890112,3116891135,LU -3116891136,3116892159,PL -3116892160,3116893183,HR -3116893184,3116895231,DE -3116895232,3116896255,ES -3116896256,3116897279,RU -3116897280,3116898303,TR -3116898304,3116899327,ES -3116899328,3116900351,TR -3116900352,3116901375,DE -3116901376,3116902399,GB -3116902400,3116903423,BG -3116903424,3116905471,PL -3116905472,3116906495,AE -3116906496,3116907519,DE -3116907520,3116908543,UA -3116908544,3116909567,GB -3116909568,3116910591,EE -3116910592,3116911615,DK -3116911616,3116912639,ES -3116912640,3116913663,PL -3116913664,3116914687,IE -3116914688,3116915711,IT -3116915712,3116916735,GB -3116916736,3116919807,NL -3116919808,3116920831,CZ -3116920832,3116921855,ES -3116921856,3116922367,SG -3116922368,3116922623,GB -3116922624,3116922879,NL -3116922880,3116923903,PL -3116923904,3116924927,OM -3116924928,3116925951,JO -3116925952,3116926975,NL -3116926976,3116927999,DE -3116928000,3116929023,RU -3116929024,3116930047,FR -3116930048,3116931071,IT -3116931072,3116932095,RU -3116932096,3116933119,BG -3116933120,3116934143,RU -3116934144,3116935167,FR -3116935168,3116936191,RU -3116936192,3116937215,GB -3116937216,3116938239,US -3116938240,3116939263,IT -3116939264,3116940287,SE -3116940288,3116941055,RU -3116941056,3116941311,FI -3116941312,3116942335,FR -3116942336,3116943359,CY -3116943360,3116944383,FR -3116944384,3116945407,US -3116945408,3116945919,DE -3116945920,3116946431,CN -3116946432,3116947455,AL -3116947456,3116948479,RU -3116948480,3116949503,CH -3116949504,3116950527,DE -3116950528,3116951551,ES -3116951552,3116952575,NL -3116952576,3116953599,FR -3116953600,3116954623,RU -3116954624,3116955391,NL -3116955392,3116955647,US -3116955648,3116956671,AL -3116956672,3116957695,NO -3116957696,3116958719,GB -3116958720,3116959743,ES -3116959744,3116960767,DE -3116960768,3116961791,CZ -3116961792,3116962815,NL -3116962816,3116963839,DE -3116963840,3116964863,GE -3116964864,3116965887,RU -3116965888,3116966911,GB -3116966912,3116967935,BG -3116967936,3116968959,DE -3116968960,3116969983,RU -3116969984,3116971007,IR -3116971008,3116972031,RU -3116972032,3116973055,GR -3116973056,3116974079,GB -3116974080,3116975103,IT -3116975104,3116976127,PL -3116976128,3116977151,ES -3116977152,3116978175,IT -3116978176,3116979199,BG -3116979200,3116980223,DE -3116980224,3116981247,RU -3116981248,3116982271,NO -3116982272,3116983295,GB -3116983296,3116984319,OM -3116984320,3116985343,NL -3116985344,3116986367,DE -3116986368,3116987391,PL -3116987392,3116988415,AT -3116988416,3116990463,NO -3116990464,3116991487,GB -3116991488,3116992511,TR -3116992512,3116993535,UA -3116993536,3116994559,IT -3116994560,3116995583,DE -3116995584,3116996607,GB -3116996608,3116997631,ES -3116997632,3116998655,AT -3116998656,3116999679,DE -3116999680,3117000703,GB -3117000704,3117001727,RU -3117001728,3117002751,SE -3117002752,3117003775,ES -3117003776,3117004799,GB -3117004800,3117005823,IT -3117005824,3117005855,PT -3117006848,3117007871,KW -3117007872,3117008895,HR -3117008896,3117009919,NL -3117009920,3117010943,SE -3117010944,3117011967,GB -3117011968,3117012991,TR -3117012992,3117014015,CH -3117014016,3117015039,TR -3117015040,3117016063,DE -3117016064,3117017087,NL -3117017088,3117018111,CZ -3117018112,3117019135,SK -3117019136,3117020159,IT -3117020160,3117021183,US -3117021184,3117022207,CH -3117022208,3117023231,NL -3117023232,3117024255,FR -3117024256,3117025279,AT -3117025280,3117026303,DK -3117026304,3117027327,RU -3117027328,3117028351,IE -3117028352,3117029375,DE -3117029376,3117030399,FR -3117030400,3117031423,GB -3117031424,3117034495,UA -3117034496,3117035519,US -3117035520,3117036543,UA -3117036544,3117037567,FR -3117037568,3117038591,IR -3117038592,3117039615,FR -3117039616,3117040639,SE -3117040640,3117041663,IE -3117041664,3117042687,GB -3117042688,3117043711,BA -3117043712,3117044735,CH -3117044736,3117045759,RO -3117045760,3117046783,MD -3117046784,3117047807,IR -3117047808,3117048831,NL -3117048832,3117049855,UA -3117049856,3117052927,NL -3117052928,3117053951,ES -3117053952,3117054975,IT -3117054976,3117055999,PL -3117056000,3117057023,IT -3117057024,3117058047,CH -3117058048,3117059071,HU -3117059072,3117060095,SA -3117060096,3117061119,GB -3117061120,3117062143,AT -3117062144,3117063167,NL -3117063168,3117064191,DE -3117064192,3117066239,ES -3117066240,3117067263,TR -3117067264,3117068287,US -3117068288,3117069311,SE -3117069312,3117070335,FR -3117070336,3117071359,NG -3117071360,3117073407,ES -3117073408,3117074431,DE -3117074432,3117075455,NL -3117075456,3117076479,ES -3117076480,3117077503,SE -3117077504,3117078527,RU -3117078528,3117079551,PL -3117079552,3117080575,US -3117080576,3117081599,BE -3117081600,3117082623,SA -3117082624,3117083647,GB -3117083648,3117084671,US -3117084672,3117085695,TR -3117085696,3117086719,IT -3117086720,3117087743,LU -3117087744,3117088767,NL -3117088768,3117089791,DK -3117089792,3117090815,GB -3117090816,3117091839,IT -3117091840,3117092863,GB -3117092864,3117093887,HR -3117093888,3117094911,ES -3117094912,3117095935,IT -3117095936,3117096959,FR -3117096960,3117097983,NL -3117097984,3117099007,UA -3117099008,3117100031,CH -3117100032,3117101055,CZ -3117101056,3117102079,DE -3117102080,3117103103,IQ -3117103104,3117104127,NL -3117104128,3117105151,GB -3117105152,3117106175,IE -3117106176,3117107199,SY -3117107200,3117108223,CH -3117108224,3117109247,IT -3117109248,3117110271,AT -3117110272,3117111295,CZ -3117111296,3117112319,RU -3117112320,3117113343,DE -3117113344,3117114367,RU -3117114368,3117115391,MD -3117115392,3117116415,IT -3117116416,3117117439,SA -3117117440,3117118463,CH -3117118464,3117119487,BG -3117119488,3117119999,DE -3117120000,3117120255,IN -3117120256,3117120511,DE -3117120512,3117121535,IT -3117121536,3117122559,PL -3117122560,3117123583,CH -3117123584,3117124607,GB -3117124608,3117125631,FR -3117125632,3117126655,RU -3117126656,3117127679,US -3117127680,3117128703,BY -3117128704,3117129727,CZ -3117129728,3117130751,IR -3117130752,3117131775,ES -3117131776,3117132799,TR -3117132800,3117133823,IT -3117133824,3117135871,FR -3117135872,3117136895,GB -3117136896,3117137919,NL -3117137920,3117138943,IE -3117138944,3117139967,IR -3117139968,3117142015,DE -3117142016,3117143039,ES -3117143040,3117144063,GB -3117144064,3117145087,US -3117145088,3117147135,ES -3117147136,3117147391,GR -3117147392,3117148159,AE -3117148160,3117149183,DK -3117149184,3117150207,RU -3117150208,3117151231,NL -3117151232,3117152255,UA -3117152256,3117153279,RO -3117153280,3117154303,PL -3117154304,3117154559,RU -3117154560,3117154815,FI -3117154816,3117155327,RU -3117155328,3117156351,GB -3117156352,3117157375,SE -3117157376,3117158399,US -3117158400,3117159423,CZ -3117159424,3117160447,RU -3117160448,3117161471,UA -3117161472,3117162495,MD -3117162496,3117163519,AL -3117163520,3117164543,NL -3117164544,3117165567,FR -3117165568,3117166591,GB -3117166592,3117167615,LB -3117167616,3117168639,NL -3117168640,3117169663,MK -3117169664,3117172735,ES -3117172736,3117173759,TR -3117173760,3117174783,GB -3117174784,3117175807,SY -3117175808,3117176831,IT -3117176832,3117177855,SY -3117177856,3117178879,IE -3117178880,3117179903,DE -3117179904,3117180927,PT -3117180928,3117181951,FR -3117181952,3117182975,RU -3117182976,3117183999,DK -3117184000,3117185023,BY -3117185024,3117186047,FR -3117186048,3117187071,RU -3117187072,3117188095,DE -3117188096,3117189119,IT -3117189120,3117190143,IE -3117190144,3117191167,MD -3117191168,3117192191,SE -3117192192,3117193215,US -3117193216,3117194239,GB -3117194240,3117195263,RU -3117195264,3117196287,FR -3117196288,3117197311,BG -3117197312,3117198335,IR -3117198336,3117199359,FR -3117199360,3117200383,ES -3117200384,3117201407,IR -3117201408,3117202431,NL -3117202432,3117203455,FR -3117203456,3117204479,PL -3117204480,3117204991,NL -3117204992,3117205247,US -3117205248,3117205503,NL -3117205504,3117206527,ES -3117206528,3117208575,FR -3117208576,3117209599,GB -3117209600,3117210623,PL -3117210624,3117211647,IT -3117211648,3117212671,PL -3117212672,3117214719,TR -3117214720,3117215743,MD -3117215744,3117216767,DE -3117216768,3117217791,ES -3117217792,3117218815,DK -3117218816,3117219839,FR -3117219840,3117220863,FI -3117220864,3117221887,ES -3117221888,3117222911,IT -3117222912,3117223935,US -3117223936,3117224959,TR -3117224960,3117225983,NO -3117225984,3117227007,SA -3117227008,3117228031,GB -3117228032,3117229055,FR -3117229056,3117230079,GB -3117230080,3117231103,IT -3117231104,3117232127,UA -3117232128,3117233151,SE -3117233152,3117234175,NL -3117234176,3117235199,ES -3117235200,3117235455,LV -3117235456,3117235711,GB -3117235712,3117236223,LV -3117236224,3117237247,RU -3117237248,3117238271,NL -3117238272,3117239295,HU -3117239296,3117240319,CY -3117240320,3117241343,DE -3117241344,3117242367,PL -3117242368,3117243391,GE -3117243392,3117244415,TR -3117244416,3117245439,GR -3117245440,3117246463,TR -3117246464,3117247487,DE -3117247488,3117248511,CH -3117248512,3117249535,ES -3117249536,3117250559,SI -3117250560,3117251583,CH -3117251584,3117252607,US -3117252608,3117253631,RU -3117253632,3117254655,DE -3117254656,3117255679,CZ -3117255680,3117256703,IR -3117256704,3117257727,UA -3117257728,3117258751,ES -3117258752,3117259775,PL -3117259776,3117260799,DE -3117260800,3117261823,IE -3117261824,3117262847,IT -3117262848,3117263871,AL -3117263872,3117264895,GB -3117264896,3117265919,RO -3117265920,3117266943,GB -3117266944,3117267967,CY -3117267968,3117268223,ES -3117268224,3117268479,IE -3117268480,3117268735,FR -3117268736,3117268991,IE -3117268992,3117269503,US -3117269504,3117270015,DE -3117270016,3117271039,TR -3117271040,3117272063,RU -3117272064,3117273087,GB -3117273088,3117274111,BG -3117274112,3117276159,DE -3117276160,3117277183,IR -3117277184,3117278207,SE -3117278208,3117279231,IE -3117279232,3117280255,BE -3117280256,3117281279,RU -3117281280,3117282303,NL -3117282304,3117283327,US -3117283328,3117284351,HU -3117284352,3117285375,ES -3117285376,3117286399,CH -3117286400,3117287423,NO -3117287424,3117288447,IT -3117288448,3117289471,IE -3117289472,3117290495,GB -3117290496,3117291519,US -3117291776,3117292031,DE -3117292032,3117292287,FR -3117292288,3117292543,ES -3117292544,3117293567,SA -3117293568,3117294591,KZ -3117294592,3117295615,UA -3117295616,3117296639,GB -3117296640,3117297663,DE -3117297664,3117298687,NO -3117298688,3117299711,RO -3117299712,3117300735,DE -3117300736,3117301759,ES -3117301760,3117302783,GB -3117302784,3117303807,IR -3117303808,3117304831,MD -3117304832,3117305855,ES -3117305856,3117306879,RO -3117306880,3117307903,IT -3117307904,3117308927,DE -3117308928,3117309951,IR -3117309952,3117310975,KW -3117310976,3117311999,RU -3117312000,3117313023,NL -3117313024,3117314047,SE -3117314048,3117315071,PL -3117315072,3117316095,FR -3117316096,3117317119,RU -3117317120,3117318143,IQ -3117318144,3117319167,US -3117319168,3117320191,SA -3117320192,3117321215,FR -3117321216,3117322239,NL -3117322240,3117323263,BG -3117323264,3117324287,GB -3117324288,3117325311,DE -3117325312,3117326335,DK -3117326336,3117327359,DE -3117327360,3117328383,RU -3117328384,3117329407,NL -3117329408,3117330431,IQ -3117330432,3117331455,FI -3117331456,3117332479,DE -3117332480,3117333503,SI -3117333504,3117334527,DE -3117334528,3117335551,IE -3117335552,3117336575,DE -3117336576,3117337599,LB -3117337600,3117338623,RU -3117338624,3117339647,DE -3117339648,3117340671,NL -3117340672,3117341695,GB -3117341696,3117342719,TR -3117342720,3117342975,DK -3117342976,3117343231,NO -3117343232,3117344767,GB -3117344768,3117345791,NL -3117345792,3117346815,IR -3117346816,3117347839,US -3117347840,3117348863,CH -3117348864,3117349887,ES -3117349888,3117350911,IL -3117350912,3117351935,RU -3117351936,3117352959,IR -3117352960,3117353983,HU -3117353984,3117356031,DE -3117356032,3117357055,NL -3117357056,3117358079,RU -3117358080,3117359103,SA -3117359104,3117360127,LT -3117360128,3117361151,TR -3117361152,3117362175,ES -3117362176,3117363199,FR -3117363200,3117364223,GB -3117364224,3117365247,IR -3117365248,3117366271,TR -3117366272,3117367295,DE -3117367296,3117368319,RU -3117368320,3117369343,GB -3117369344,3117370367,IR -3117370368,3117371391,CH -3117371392,3117372415,FR -3117372416,3117373439,FI -3117373440,3117374463,RU -3117374464,3117375487,IE -3117375488,3117376511,TR -3117376512,3117378559,DE -3117378560,3117379583,GB -3117379584,3117380607,DE -3117380608,3117381631,CH -3117381632,3117383679,GB -3117383680,3117384703,GE -3117384704,3117385727,US -3117385728,3117386751,UA -3117386752,3117387775,GB -3117387776,3117388799,ES -3117388800,3117389823,PL -3117389824,3117390847,US -3117390848,3117391871,DE -3117391872,3117392895,CY -3117392896,3117393919,NL -3117393920,3117394943,CZ -3117394944,3117395967,ES -3117395968,3117396479,GB -3117396480,3117396735,US -3117396736,3117396991,TR -3117396992,3117398015,MD -3117398016,3117399039,UA -3117399040,3117400063,LT -3117400064,3117401087,NL -3117401088,3117402111,IR -3117402112,3117403135,GB -3117403136,3117404159,NL -3117404160,3117405183,DE -3117405184,3117406207,CH -3117406208,3117407231,DE -3117407232,3117408255,NL -3117408256,3117409279,IE -3117409280,3117410303,DE -3117410304,3117411327,BG -3117411328,3117412351,MD -3117412352,3117413375,UA -3117413376,3117414399,DE -3117414400,3117415423,US -3117415424,3117416447,RU -3117416448,3117417471,FR -3117417472,3117418495,IE -3117418496,3117419519,FR -3117419520,3117420543,AT -3117420544,3117421567,IT -3117421568,3117422591,ES -3117422592,3117423615,UA -3117423616,3117424639,CH -3117424640,3117426687,DE -3117426688,3117427711,FR -3117427712,3117428735,IT -3117428736,3117429759,BG -3117429760,3117430783,SE -3117430784,3117431807,NL -3117431808,3117432831,FR -3117432832,3117433855,ES -3117433856,3117434879,SE -3117434880,3117435903,RU -3117435904,3117436927,IR -3117436928,3117437951,DK -3117437952,3117438975,FR -3117438976,3117439999,GB -3117440000,3117441023,NO -3117441024,3117442047,TJ -3117442048,3117443071,TR -3117443072,3117444095,IT -3117444096,3117445119,CY -3117445120,3117446143,EE -3117446144,3117447167,FR -3117447168,3117448191,CH -3117448192,3117449215,NL -3117449216,3117450239,MD -3117450240,3117451263,AT -3117451264,3117452287,IT -3117452288,3117453311,FR -3117453312,3117454335,ES -3117454336,3117455359,IR -3117455360,3117456383,CZ -3117456384,3117457407,BG -3117457408,3117458431,DE -3117458432,3117459455,PL -3117459456,3117459711,US -3117459712,3117460479,GB -3117460480,3117461503,IR -3117461504,3117462527,UZ -3117462528,3117463551,IR -3117463552,3117464575,ES -3117464576,3117465599,IT -3117465600,3117466623,RU -3117466624,3117467647,IL -3117467648,3117468671,RU -3117468672,3117469695,US -3117469696,3117470719,NL -3117470720,3117471743,DK -3117471744,3117473791,ES -3117473792,3117474815,HU -3117474816,3117475839,UA -3117475840,3117476863,IT -3117476864,3117477887,US -3117477888,3117478911,GB -3117478912,3117479935,IT -3117479936,3117480959,MD -3117480960,3117481983,CH -3117481984,3117483007,LV -3117483008,3117484031,DE -3117484032,3117485055,ES -3117485056,3117486079,RU -3117486080,3117487103,FR -3117487104,3117488127,NL -3117488128,3117489151,CZ -3117489152,3117490175,RU -3117490176,3117491199,SY -3117491200,3117492223,ES -3117492224,3117493247,GB -3117493248,3117494271,RU -3117494272,3117495295,SA -3117495296,3117496319,FR -3117496320,3117497343,UA -3117497344,3117498367,ES -3117498368,3117499391,DE -3117499392,3117500415,PL -3117500416,3117502463,ES -3117502464,3117503999,RU -3117504000,3117504511,DE -3117504512,3117505535,RU -3117505536,3117506559,IE -3117506560,3117507583,EE -3117507584,3117508607,ES -3117508608,3117509631,DE -3117509632,3117510655,PS -3117510656,3117511679,RU -3117511680,3117512703,DE -3117512704,3117513727,ES -3117513728,3117514751,DE -3117514752,3117515775,US -3117515776,3117516799,DE -3117516800,3117517823,LT -3117517824,3117518847,FR -3117518848,3117519871,DE -3117519872,3117520895,NL -3117520896,3117521919,GB -3117521920,3117522943,DE -3117522944,3117523199,RU -3117523200,3117523967,US -3117523968,3117524991,GB -3117524992,3117526015,CH -3117526016,3117527039,AT -3117527040,3117528063,UA -3117528064,3117530111,FR -3117530112,3117531135,IR -3117531136,3117532159,ES -3117532160,3117533183,SE -3117533184,3117534207,SY -3117534208,3117535231,AT -3117535232,3117536255,FR -3117536256,3117537279,CH -3117537280,3117538303,GB -3117538304,3117539327,US -3117539328,3117540351,UA -3117540352,3117541375,US -3117541376,3117542399,BG -3117542400,3117543423,DE -3117543424,3117544447,PT -3117544448,3117545471,DE -3117545472,3117546495,PL -3117546496,3117547519,US -3117547520,3117548543,CH -3117548544,3117549567,NO -3117549568,3117550591,DE -3117550592,3117551615,AT -3117551616,3117553663,ES -3117553664,3117554687,NL -3117554688,3117555711,GB -3117555712,3117556735,CH -3117556736,3117557759,PL -3117557760,3117558783,US -3117558784,3117559807,RU -3117559808,3117560831,IT -3117560832,3117561855,DE -3117561856,3117562879,RU -3117562880,3117563903,ES -3117563904,3117565951,CH -3117565952,3117566975,ES -3117566976,3117567999,TR -3117568000,3117569023,DE -3117569024,3117570047,UA -3117570048,3117571071,ES -3117571072,3117572095,TR -3117572096,3117573119,CH -3117573120,3117574143,DE -3117574144,3117575167,GB -3117575168,3117576191,FR -3117576192,3117577215,IT -3117577216,3117578239,GB -3117578240,3117579263,NL -3117579264,3117580287,PL -3117580288,3117581311,NL -3117581312,3117582335,DK -3117582336,3117583359,US -3117583360,3117584383,RU -3117584384,3117585407,US -3117585408,3117586431,AT -3117586432,3117587455,ES -3117587456,3117589503,RU -3117589504,3117590527,CZ -3117590528,3117591551,GB -3117591552,3117592575,IT -3117592576,3117593599,DK -3117593600,3117594623,BA -3117594624,3117595647,ES -3117595648,3117596671,DE -3117596672,3117597695,ES -3117597696,3117598719,GB -3117598720,3117599743,IR -3117599744,3117600767,FR -3117600768,3117601791,DE -3117601792,3117602815,IE -3117602816,3117603071,RO -3117603072,3117603327,BE -3117603328,3117603583,RO -3117603584,3117603839,AT -3117603840,3117604863,SE -3117604864,3117605119,AT -3117605120,3117605631,ES -3117605632,3117605887,AT -3117605888,3117606911,GB -3117606912,3117607935,ES -3117607936,3117608959,DK -3117608960,3117609983,RU -3117609984,3117611007,ES -3117611008,3117612031,IT -3117612032,3117613055,TR -3117613056,3117614079,RU -3117614080,3117615103,US -3117615104,3117616127,ES -3117616128,3117617151,IT -3117617152,3117618175,DE -3117618176,3117619199,GB -3117619200,3117620223,FR -3117620224,3117621247,PL -3117621248,3117622271,US -3117622272,3117623295,SK -3117623296,3117624319,HU -3117624320,3117625599,GB -3117625600,3117626111,US -3117626112,3117626367,GB -3117626368,3117627391,NO -3117627392,3117628415,IR -3117628416,3117629439,DE -3117629440,3117630463,RS -3117630464,3117631487,ES -3117631488,3117632511,NO -3117632512,3117634559,IT -3117634560,3117636607,IR -3117636608,3117637631,CH -3117637632,3117638655,LV -3117638656,3117639679,DE -3117639680,3117640703,KW -3117640704,3117641727,CZ -3117641728,3117642751,RU -3117642752,3117643007,ES -3117643008,3117643263,IE -3117643264,3117643519,FR -3117643520,3117643775,IE -3117643776,3117644799,US -3117644800,3117645823,DE -3117645824,3117646847,UZ -3117646848,3117647871,DE -3117647872,3117648895,SE -3117648896,3117649919,GB -3117649920,3117650943,US -3117650944,3117651967,DE -3117651968,3117652991,US -3117652992,3117654015,RU -3117654016,3117655039,IT -3117655040,3117656063,RU -3117656064,3117659135,GB -3117659136,3117660159,ES -3117660160,3117661183,NL -3117661184,3117663231,CZ -3117663232,3117664255,ES -3117664256,3117665279,BG -3117665280,3117666303,DK -3117666304,3117667327,NL -3117667328,3117668351,ES -3117668352,3117669375,AT -3117669376,3117670399,DE -3117670400,3117671423,RU -3117671424,3117672447,KG -3117672448,3117673471,LU -3117673472,3117674495,DE -3117674496,3117676543,RU -3117676544,3117677567,NL -3117677568,3117678591,IE -3117678592,3117679615,RU -3117679616,3117680639,NL -3117680640,3117681663,MD -3117681664,3117682687,CZ -3117682688,3117683711,IT -3117683712,3117684735,FR -3117684736,3117685759,SE -3117685760,3117686783,RU -3117686784,3117687807,NL -3117687808,3117688831,DE -3117688832,3117689855,PL -3117689856,3117690879,DE -3117690880,3117691903,IR -3117691904,3117692927,DE -3117692928,3117693951,GB -3117693952,3117694975,IR -3117694976,3117695999,PL -3117696000,3117697023,GB -3117697024,3117698047,FR -3117698048,3117699071,DE -3117699072,3117700095,GB -3117700096,3117701119,ES -3117701120,3117702143,RU -3117702144,3117703167,DE -3117703168,3117704191,FR -3117704192,3117705215,AT -3117705216,3117706239,DE -3117706240,3117707263,BA -3117707264,3117709311,RU -3117709312,3117710335,IR -3117710336,3117711359,ES -3117711360,3117712383,NL -3117712384,3117713407,PL -3117713408,3117714431,ES -3117714432,3117715455,MD -3117715456,3117716479,GB -3117716480,3117716735,RU -3117716736,3117716991,FI -3117716992,3117717503,RU -3117717504,3117718527,IT -3117718528,3117719551,GB -3117719552,3117720575,FR -3117720576,3117721599,PL -3117721600,3117721855,GB -3117721856,3117722111,DK -3117722112,3117722367,CH -3117722368,3117722623,NL -3117722624,3117723647,TR -3117723648,3117724671,IE -3117724672,3117725695,GR -3117725696,3117726719,IE -3117726720,3117727743,AL -3117727744,3117728767,IR -3117728768,3117729791,DE -3117729792,3117730815,NL -3117730816,3117731839,ES -3117731840,3117732863,DK -3117732864,3117733887,FR -3117733888,3117734911,GB -3117734912,3117735935,LB -3117735936,3117736959,FR -3117736960,3117737983,IE -3117737984,3117739007,NL -3117739008,3117743103,UA -3117743104,3117744127,GE -3117744128,3117745151,RU -3117745152,3117746175,IT -3117746176,3117747199,IR -3117747200,3117748223,NL -3117748224,3117749247,US -3117749248,3117749503,IT -3117749504,3117750271,CA -3117750272,3117751295,NL -3117751296,3117752319,RU -3117752320,3117753343,DE -3117753344,3117754367,PL -3117754368,3117755391,UA -3117755392,3117756415,GB -3117756416,3117757439,ES -3117757440,3117758463,NO -3117758464,3117759487,CH -3117759488,3117760511,HK -3117760512,3117762559,NL -3117762560,3117763583,MD -3117763584,3117764607,DE -3117764608,3117765631,US -3117765632,3117766655,ES -3117766656,3117767679,NL -3117767680,3117768703,GB -3117768704,3117769727,DE -3117769728,3117771775,NL -3117771776,3117772799,ES -3117772800,3117773823,IT -3117773824,3117775871,GB -3117775872,3117776895,NO -3117776896,3117777919,DE -3117777920,3117778943,IE -3117778944,3117779967,RU -3117779968,3117780991,US -3117780992,3117782015,SK -3117782016,3117783039,GB -3117783040,3117784063,SE -3117784064,3117785087,RU -3117785088,3117786111,FR -3117786112,3117787135,IR -3117787136,3117788159,TR -3117788160,3117788927,NL -3117788928,3117789183,DE -3117789184,3117790207,UA -3117790208,3117791231,LB -3117791232,3117792255,LU -3117792256,3117794303,DE -3117794304,3117795327,ES -3117795328,3117796351,LV -3117796352,3117797375,CH -3117797376,3117798399,NL -3117798400,3117799423,RU -3117799424,3117800447,IT -3117800448,3117801471,IE -3117801472,3117802495,FI -3117802496,3117803519,RU -3117803520,3117804543,UA -3117804544,3117805567,DE -3117805568,3117806591,HR -3117806592,3117807615,GB -3117807616,3117808639,NO -3117808640,3117809663,IL -3117809664,3117810687,IT -3117810688,3117811711,NL -3117811712,3117811967,FR -3117811968,3117812223,IE -3117812224,3117812735,CN -3117812736,3117813759,ES -3117813760,3117814783,NO -3117814784,3117816831,NL -3117816832,3117817855,HU -3117817856,3117818879,PT -3117818880,3117819903,IR -3117819904,3117820927,RO -3117820928,3117821951,IT -3117821952,3117822975,GB -3117822976,3117823999,FR -3117824000,3117826047,RU -3117826048,3117827071,DE -3117827072,3117827327,AT -3117827328,3117827583,GB -3117827584,3117828095,AT -3117828096,3117829119,NL -3117829120,3117830143,RU -3117830144,3117832191,ES -3117832192,3117833215,NL -3117833216,3117834239,HR -3117834240,3117835263,US -3117835264,3117836287,ES -3117836288,3117837311,RO -3117837312,3117838335,ES -3117838336,3117839359,NL -3117839360,3117840383,CZ -3117840384,3117842431,DE -3117842432,3117843455,NL -3117843456,3117844479,US -3117844480,3117845503,ES -3117845504,3117846015,GB -3117846016,3117846527,US -3117846528,3117847551,ES -3117847552,3117848575,NL -3117848576,3117849599,CH -3117849600,3117850623,FI -3117850624,3117851647,RU -3117851648,3117852671,RS -3117852672,3117853695,ES -3117853696,3117853951,HU -3117853952,3117854335,CZ -3117854336,3117854463,HR -3117854464,3117854591,SI -3117854592,3117854719,AT -3117854720,3117855743,ES -3117855744,3117856767,GB -3117856768,3117857791,RU -3117857792,3117858815,TR -3117858816,3117859839,SK -3117859840,3117860863,UA -3117860864,3117861887,IT -3117861888,3117862911,ES -3117862912,3117863935,FR -3117863936,3117864447,NL -3117864448,3117864959,ES -3117864960,3117865983,FR -3117865984,3117867007,GB -3117867008,3117868031,FR -3117868032,3117871103,DE -3117871104,3117872127,US -3117872128,3117875199,RU -3117875200,3117876223,ES -3117876224,3117877247,DK -3117877248,3117878271,SE -3117879296,3117880319,DE -3117880320,3117881343,CZ -3117881344,3117882367,FR -3117882368,3117883391,AT -3117883392,3117884415,NO -3117884416,3117885439,GB -3117885440,3117886463,NL -3117886464,3117887487,TR -3117887488,3117888511,LV -3117888512,3117889535,AM -3117889536,3117890559,DE -3117890560,3117891583,RU -3117891584,3117892607,FR -3117892608,3117893631,LU -3117893632,3117894655,PL -3117894656,3117896703,DE -3117896704,3117897727,ES -3117897728,3117898751,BA -3117898752,3117899775,DK -3117899776,3117900799,NL -3117900800,3117901823,DE -3117901824,3117902847,ES -3117902848,3117903871,IE -3117903872,3117904895,PT -3117904896,3117905919,IE -3117905920,3117906943,CH -3117906944,3117907967,IR -3117907968,3117908991,GB -3117908992,3117910015,ES -3117910016,3117911039,FR -3117911040,3117913087,IT -3117913088,3117914111,NL -3117914112,3117915135,IR -3117915136,3117916159,DE -3117916160,3117917183,KZ -3117917184,3117918207,US -3117918208,3117919231,FR -3117919232,3117920255,IT -3117920256,3117921279,RU -3117921280,3117922303,US -3117922304,3117923327,EE -3117923328,3117924351,DE -3117924352,3117925375,IT -3117925376,3117926399,SE -3117926400,3117927423,AT -3117927424,3117929471,DE -3117929472,3117929727,GB -3117929728,3117930239,DE -3117930240,3117930495,TW -3117930496,3117931519,AT -3117931520,3117933567,US -3117933568,3117936639,IR -3117936640,3117937663,IT -3117937664,3117938687,IR -3117938688,3117939711,DK -3117939712,3117940735,NL -3117940736,3117941759,CN -3117941760,3117942783,CY -3117942784,3117943807,IQ -3117943808,3117945855,RU -3117945856,3117946879,SK -3117946880,3117947903,FR -3117947904,3117949055,ES -3117949056,3117949183,BG -3117949184,3117949439,DE -3117949440,3117949695,AT -3117949696,3117949951,CZ -3117949952,3117950975,FR -3117950976,3117951999,SA -3117952000,3117953023,EE -3117953024,3117954047,GB -3117954048,3117955071,NL -3117955072,3117956095,ES -3117956096,3117957119,RU -3117957120,3117958143,IT -3117958144,3117959167,DE -3117959168,3117960191,US -3117960192,3117961215,GB -3117961216,3117962239,RU -3117962240,3117963263,DE -3117963264,3117964287,IT -3117964288,3117965311,FR -3117965312,3117966335,GB -3117966336,3117967359,RU -3117967360,3117969407,GB -3117969408,3117970431,TR -3117970432,3117972479,DE -3117972480,3117973503,IR -3117973504,3117974527,ES -3117974528,3117975551,SY -3117975552,3117976575,RO -3117976576,3117977599,NL -3117977600,3117978623,GB -3117978624,3117979647,FR -3117979648,3117980671,SE -3117980672,3117981695,DK -3117981696,3117982719,NL -3117982720,3117983743,SK -3117983744,3117984767,ES -3117984768,3117985791,PL -3117985792,3117986815,AT -3117986816,3117987839,PL -3117987840,3117988863,IT -3117988864,3117989887,RO -3117989888,3117990911,RU -3117990912,3117991935,SY -3117991936,3117992959,US -3117992960,3117993983,RU -3117993984,3117995007,LT -3117995008,3117996031,DE -3117996032,3117997055,ES -3117997056,3117998079,CZ -3117998080,3117999103,DE -3117999104,3117999871,US -3117999872,3118002175,DE -3118002176,3118003199,FR -3118003200,3118004223,RU -3118004224,3118005247,NL -3118005248,3118006271,ES -3118006272,3118007295,SE -3118007296,3118008319,AX -3118008320,3118009343,SA -3118009344,3118010367,ES -3118010368,3118011391,KZ -3118011392,3118012415,IE -3118012416,3118013439,US -3118013440,3118014463,IT -3118014464,3118016511,NL -3118016512,3118017535,GB -3118017536,3118018559,DE -3118018560,3118019583,GB -3118019584,3118020607,DE -3118020608,3118021631,GB -3118021632,3118022655,NL -3118022656,3118023679,UA -3118023680,3118023935,RO -3118023936,3118024191,US -3118024192,3118024447,SG -3118024448,3118024703,IT -3118024704,3118025727,HU -3118025728,3118026751,IQ -3118026752,3118027775,DE -3118027776,3118028799,LB -3118028800,3118029823,IQ -3118029824,3118030847,NL -3118030848,3118031871,IL -3118031872,3118032895,SA -3118032896,3118033919,GB -3118033920,3118034943,IR -3118034944,3118035967,ES -3118035968,3118036735,GB -3118036736,3118037759,CN -3118037760,3118038015,GB -3118038016,3118039039,US -3118039040,3118041087,GB -3118041088,3118042111,PL -3118042112,3118043135,NL -3118043136,3118044159,DE -3118044160,3118045183,US -3118045184,3118046207,FR -3118046208,3118047231,GB -3118047232,3118048255,IR -3118048256,3118049279,NL -3118049280,3118050303,DE -3118050304,3118051327,SY -3118051328,3118052351,DE -3118052352,3118053375,KZ -3118053376,3118054399,LB -3118054400,3118055423,KZ -3118055424,3118056447,DE -3118056448,3118057471,RU -3118057472,3118058495,FR -3118058496,3118059519,ES -3118059520,3118060543,NL -3118060544,3118061567,PL -3118061568,3118062591,IE -3118062592,3118063615,ES -3118063616,3118064639,SE -3118064640,3118065663,GB -3118065664,3118066687,CZ -3118066688,3118067711,FI -3118067712,3118068735,BG -3118068736,3118069759,FR -3118069760,3118072831,DE -3118072832,3118073855,GB -3118073856,3118074879,RU -3118074880,3118075903,PT -3118075904,3118077951,ES -3118077952,3118078975,SE -3118078976,3118079999,SK -3118080000,3118081023,FR -3118081024,3118082047,NL -3118082048,3118083071,DK -3118083072,3118084095,IT -3118084096,3118085119,CH -3118085120,3118086143,US -3118086144,3118088191,DE -3118088192,3118089215,BG -3118089216,3118090239,RU -3118090240,3118091263,NL -3118091264,3118092287,AT -3118092288,3118093311,DK -3118093312,3118094335,DE -3118094336,3118095359,FI -3118095360,3118096383,CZ -3118096384,3118098431,ES -3118098432,3118099455,IT -3118099456,3118100479,RU -3118100480,3118101503,IE -3118101504,3118102271,CH -3118102272,3118102287,DE -3118102288,3118102527,CH -3118102528,3118103551,GB -3118103552,3118104575,US -3118104576,3118107647,DE -3118107648,3118108671,CH -3118108672,3118109695,FR -3118109696,3118110719,US -3118110720,3118111743,FR -3118111744,3118112767,PL -3118112768,3118113791,ES -3118113792,3118114815,NL -3118114816,3118115839,DE -3118115840,3118116863,FR -3118116864,3118118911,RU -3118118912,3118119935,DE -3118119936,3118120959,ES -3118120960,3118121983,FI -3118121984,3118123007,PT -3118123008,3118124031,UA -3118124032,3118125055,NL -3118125056,3118127103,FR -3118127104,3118128127,TR -3118128128,3118129151,DE -3118129152,3118130175,NL -3118130176,3118131199,DK -3118131200,3118132223,US -3118132224,3118133247,ES -3118133248,3118134271,CH -3118134272,3118135295,TR -3118135296,3118136319,FR -3118136320,3118137343,ES -3118137344,3118138367,IT -3118138368,3118139391,RU -3118139392,3118140415,ES -3118140416,3118141439,FR -3118141440,3118142463,CZ -3118142464,3118143487,US -3118143488,3118144511,ES -3118144512,3118145535,NL -3118145536,3118146559,IE -3118146560,3118147583,PL -3118147584,3118148607,RU -3118148608,3118149631,IT -3118149632,3118150655,HU -3118150656,3118151679,IQ -3118151680,3118152703,ES -3118152704,3118153727,CZ -3118153728,3118154751,GB -3118154752,3118155775,BG -3118155776,3118156799,GB -3118156800,3118157823,UA -3118157824,3118158847,NL -3118158848,3118159871,IT -3118159872,3118160895,DE -3118160896,3118161919,GB -3118161920,3118162943,BE -3118162944,3118166015,GB -3118166016,3118167039,DE -3118167040,3118168063,IT -3118168064,3118169087,ES -3118169088,3118170111,DE -3118170112,3118171135,PT -3118171136,3118172159,TR -3118172160,3118173183,ES -3118173184,3118174207,US -3118174208,3118175231,GB -3118175232,3118176255,IS -3118176256,3118177279,DE -3118177280,3118178303,RU -3118178304,3118179327,NO -3118179328,3118181375,CZ -3118181376,3118182399,FR -3118182400,3118183423,TR -3118183424,3118184447,IT -3118184448,3118185471,LB -3118185472,3118186495,SE -3118186496,3118187519,NL -3118187520,3118188543,DE -3118188544,3118189567,PL -3118189568,3118190591,FR -3118190592,3118191615,DE -3118191616,3118192639,FR -3118192640,3118193663,ES -3118193664,3118194687,DE -3118194688,3118195711,IT -3118195712,3118196735,FR -3118196736,3118197759,IT -3118197760,3118198783,GB -3118198784,3118199807,FR -3118199808,3118200831,DE -3118200832,3118201855,CH -3118201856,3118203903,DE -3118203904,3118204927,FR -3118204928,3118205951,ES -3118205952,3118206975,GB -3118206976,3118207999,GR -3118208000,3118209023,US -3118209024,3118210047,HR -3118210048,3118211071,CZ -3118211072,3118214143,RU -3118214144,3118215167,ES -3118215168,3118217215,IT -3118217216,3118218239,NL -3118218240,3118219263,GB -3118219264,3118220287,PL -3118220288,3118220543,SG -3118220544,3118220799,US -3118220800,3118221055,DE -3118221056,3118221311,IT -3118221312,3118222335,FR -3118222336,3118223359,FI -3118223360,3118224383,US -3118224384,3118225407,ES -3118225408,3118226431,GB -3118226432,3118227455,LV -3118227456,3118229503,DE -3118229504,3118231551,NL -3118231552,3118232575,IQ -3118232576,3118233599,LV -3118233600,3118234623,SK -3118234624,3118235647,LB -3118235648,3118236671,RS -3118236672,3118237695,EE -3118237696,3118238719,LB -3118238720,3118239743,GB -3118239744,3118240767,UA -3118240768,3118241791,DE -3118241792,3118242815,TR -3118242816,3118243839,CH -3118243840,3118244863,GB -3118244864,3118245887,ES -3118245888,3118246911,SY -3118246912,3118247935,NL -3118247936,3118248959,GB -3118248960,3118249983,AZ -3118249984,3118251007,RO -3118251008,3118252031,HU -3118252032,3118253055,DE -3118253056,3118254079,LV -3118254080,3118255103,DE -3118255104,3118256127,IL -3118256128,3118257151,NO -3118257152,3118258175,NL -3118258176,3118259199,IR -3118259200,3118260223,CZ -3118260224,3118261247,IR -3118261248,3118262271,DE -3118262272,3118263295,AT -3118263296,3118264319,IR -3118264320,3118265343,ES -3118265344,3118266367,CH -3118266368,3118267391,ES -3118267392,3118268415,MD -3118268416,3118269439,NO -3118269440,3118270463,GB -3118270464,3118271487,ES -3118271488,3118272511,IT -3118272512,3118275583,ES -3118275584,3118276607,DK -3118276608,3118277631,BG -3118277632,3118278655,DK -3118278656,3118279679,CH -3118279680,3118280703,RU -3118280704,3118281727,DE -3118281728,3118282751,NO -3118282752,3118283775,SI -3118283776,3118284799,IS -3118284800,3118285823,DE -3118285824,3118286079,AU -3118286080,3118286335,SG -3118286336,3118286847,DE -3118286848,3118287871,IT -3118287872,3118288895,IR -3118288896,3118289919,PL -3118289920,3118290943,DE -3118290944,3118291967,FR -3118291968,3118294015,GB -3118294016,3118295039,DK -3118295040,3118296063,DE -3118296064,3118297087,PL -3118297088,3118298111,IR -3118298112,3118300159,RU -3118300160,3118301183,CZ -3118301184,3118302207,ES -3118302208,3118302719,US -3118302720,3118304255,DE -3118304256,3118305279,HU -3118305280,3118306303,GB -3118306304,3118307327,DE -3118307328,3118308351,RU -3118308352,3118309375,NL -3118309376,3118311423,RU -3118311424,3118312447,DE -3118312448,3118313471,IT -3118313472,3118314495,IS -3118314496,3118315519,UA -3118315520,3118316543,NL -3118316544,3118317567,ES -3118317568,3118318591,IR -3118318592,3118319615,RU -3118319616,3118320639,NL -3118320640,3118321663,GB -3118321664,3118322687,DE -3118322688,3118323711,RU -3118323712,3118324735,GB -3118324736,3118325759,RO -3118325760,3118327807,FR -3118327808,3118328831,IS -3118328832,3118329855,FR -3118329856,3118330879,IT -3118330880,3118331903,DK -3118331904,3118332927,NL -3118332928,3118333951,AL -3118333952,3118334975,AT -3118334976,3118335999,PL -3118336000,3118337023,PT -3118337024,3118338047,CH -3118338048,3118339071,GB -3118339072,3118340095,NL -3118340096,3118341119,GB -3118341120,3118342143,ES -3118342144,3118343167,CH -3118343168,3118344191,US -3118344192,3118345215,NL -3118345216,3118346239,AT -3118346240,3118347263,LB -3118347264,3118348287,RU -3118348288,3118349311,NL -3118349312,3118350335,FR -3118350336,3118351359,DE -3118351360,3118352383,IT -3118352384,3118353407,RS -3118353408,3118354431,MT -3118354432,3118355455,NL -3118355456,3118356479,NO -3118356480,3118357503,FR -3118357504,3118358527,AZ -3118358528,3118359551,BG -3118359552,3118360575,NL -3118360576,3118361599,RU -3118361600,3118362623,NL -3118362624,3118363647,GB -3118363648,3118364671,CH -3118364672,3118365695,IR -3118365696,3118366719,DE -3118366720,3118367743,MD -3118367744,3118368767,US -3118368768,3118369791,DE -3118369792,3118370815,NL -3118370816,3118371839,FR -3118371840,3118372863,ES -3118372864,3118373887,RU -3118373888,3118374911,ES -3118374912,3118375935,DE -3118375936,3118376959,ES -3118376960,3118377983,GB -3118377984,3118379007,US -3118379008,3118380031,SE -3118380032,3118382079,IR -3118382080,3118383103,ES -3118383104,3118384127,FR -3118384128,3118385151,PT -3118385152,3118386175,UA -3118386176,3118387199,DE -3118387200,3118388223,GB -3118388224,3118389247,FR -3118389248,3118390271,GB -3118390272,3118391295,MD -3118391296,3118394367,NL -3118394368,3118395391,RU -3118395392,3118396415,DE -3118396416,3118397439,ES -3118397440,3118398463,IT -3118398464,3118399487,GE -3118399488,3118400511,IL -3118400512,3118401535,HU -3118401536,3118402559,GB -3118402560,3118403583,DK -3118403584,3118404607,HU -3118404608,3118405631,AT -3118405632,3118406655,DK -3118406656,3118407679,DE -3118407680,3118409727,NL -3118409728,3118410751,US -3118410752,3118411775,AE -3118411776,3118412799,NL -3118412800,3118413823,LB -3118413824,3118414847,RO -3118414848,3118415871,ES -3118415872,3118416895,DE -3118416896,3118417919,GB -3118417920,3118418943,FR -3118418944,3118420991,ES -3118420992,3118422015,NL -3118422016,3118423039,GB -3118423040,3118423807,US -3118423808,3118424063,NL -3118424064,3118425087,ES -3118425088,3118426111,NO -3118426112,3118428159,DE -3118428160,3118429183,UA -3118429184,3118430207,RU -3118430208,3118431231,ES -3118431232,3118432255,AM -3118432256,3118434303,NL -3118434304,3118435327,ES -3118435328,3118436351,NL -3118436352,3118437375,DE -3118437376,3118438399,FR -3118438400,3118439423,ES -3118439424,3118440447,FR -3118440448,3118442495,RU -3118442496,3118443519,MD -3118443520,3118444543,GB -3118444544,3118445567,UA -3118445568,3118446591,FR -3118446592,3118447615,GB -3118447616,3118448639,UA -3118448640,3118449663,GB -3118449664,3118451711,IT -3118451712,3118452735,RU -3118452736,3118453759,IT -3118453760,3118454783,RU -3118454784,3118456831,ES -3118456832,3118457855,BE -3118457856,3118458879,FR -3118458880,3118459903,GB -3118459904,3118460927,SE -3118460928,3118461951,ES -3118461952,3118462975,UA -3118462976,3118463999,RU -3118464000,3118464511,US -3118464512,3118465023,DE -3118465024,3118466047,TR -3118466048,3118467071,HU -3118467072,3118468095,RU -3118468096,3118469119,GB -3118469120,3118470143,DK -3118470144,3118471167,IE -3118471168,3118472191,AT -3118472192,3118473215,GB -3118473216,3118474239,FR -3118474240,3118475263,ES -3118475264,3118476287,CH -3118476288,3118477311,HU -3118477312,3118478335,ES -3118478336,3118479359,NL -3118479360,3118480383,SE -3118480384,3118481407,UA -3118481408,3118482431,RO -3118482432,3118483455,GB -3118483456,3118484479,FI -3118484480,3118485503,ES -3118485504,3118486527,NL -3118486528,3118487551,MD -3118487552,3118488575,NL -3118488576,3118489599,ES -3118489600,3118490623,RU -3118490624,3118491647,AL -3118491648,3118492671,UA -3118492672,3118493695,NL -3118493696,3118494719,CZ -3118494720,3118495743,DE -3118495744,3118496767,AT -3118496768,3118497791,SY -3118497792,3118500863,NL -3118500864,3118502911,US -3118502912,3118504959,DE -3118504960,3118505983,FI -3118505984,3118507007,BG -3118507008,3118508031,PT -3118508032,3118509055,NL -3118509056,3118510079,FR -3118510080,3118511103,IR -3118511104,3118512127,CH -3118512128,3118513151,ES -3118513152,3118514175,GB -3118514176,3118515199,ES -3118515200,3118516223,GB -3118516224,3118517247,AT -3118517248,3118518271,IR -3118518272,3118519295,GB -3118519296,3118520319,KZ -3118520320,3118521343,NL -3118521344,3118522367,ES -3118522368,3118523391,US -3118523392,3118524415,RU -3118524416,3118525439,GB -3118525440,3118526463,NL -3118526464,3118527487,DE -3118527488,3118528511,CH -3118528512,3118529535,RU -3118529536,3118530559,GB -3118530560,3118531583,ES -3118531584,3118532607,IT -3118532608,3118533631,RU -3118533632,3118533887,HK -3118533888,3118534143,GB -3118534144,3118534655,US -3118534656,3118535679,RO -3118535680,3118536703,ES -3118536704,3118537727,RU -3118537728,3118538751,MK -3118538752,3118539775,RU -3118539776,3118540799,TR -3118540800,3118541823,SY -3118541824,3118542847,NL -3118542848,3118544895,SE -3118544896,3118545919,SA -3118545920,3118546943,IT -3118546944,3118547967,FR -3118547968,3118548991,HU -3118548992,3118550015,DE -3118550016,3118551039,RO -3118551040,3118552063,IR -3118552064,3118553087,BG -3118553088,3118554111,AT -3118554112,3118555135,CH -3118555136,3118556159,AT -3118556160,3118557183,PL -3118557184,3118557247,RO -3118557248,3118557311,GB -3118557312,3118557439,RO -3118557440,3118557471,FI -3118557472,3118557487,ES -3118557488,3118557503,IT -3118557504,3118557519,GR -3118557520,3118557535,CH -3118557536,3118557551,SE -3118557552,3118557567,RU -3118557568,3118558015,RO -3118558016,3118558079,NL -3118558080,3118558207,RO -3118558208,3118559231,PL -3118559232,3118560255,NL -3118560256,3118561279,PS -3118561280,3118562303,FI -3118562304,3118563327,RU -3118563328,3118564351,MD -3118564352,3118567423,DE -3118567424,3118568447,MD -3118568448,3118569471,ES -3118569472,3118570495,RU -3118570496,3118571519,GB -3118571520,3118572543,BE -3118572544,3118573567,TR -3118573568,3118574591,ES -3118574592,3118575615,IL -3118575616,3118576639,RU -3118576640,3118577663,IR -3118577664,3118578687,FR -3118578688,3118579711,RU -3118579712,3118580735,AE -3118580736,3118582783,RU -3118582784,3118583807,GB -3118583808,3118584831,DE -3118584832,3118585855,UA -3118585856,3118586879,IT -3118586880,3118587903,NL -3118587904,3118588927,SE -3118588928,3118589951,PL -3118589952,3118590975,DE -3118590976,3118591999,BG -3118592000,3118593023,IR -3118593024,3118594047,ES -3118594048,3118595071,PL -3118595072,3118596095,GB -3118596096,3118597119,MK -3118597120,3118598143,SE -3118598144,3118599167,ES -3118599168,3118600191,MD -3118600192,3118601215,FR -3118601216,3118602239,LU -3118602240,3118603263,UA -3118603264,3118604287,ES -3118604288,3118604543,FR -3118604544,3118604799,CF -3118604800,3118605311,FR -3118605312,3118606335,UA -3118606336,3118607359,AT -3118607360,3118608383,PL -3118608384,3118609407,FR -3118609408,3118610431,RU -3118610432,3118611455,SE -3118611456,3118612479,PL -3118612480,3118613503,GR -3118613504,3118614527,RO -3118614528,3118614783,DE -3118614784,3118615039,BG -3118615040,3118615295,GB -3118615296,3118615551,BG -3118615552,3118616575,NL -3118616576,3118617599,RO -3118617600,3118618623,UA -3118618624,3118619647,AL -3118619648,3118619903,TR -3118619904,3118620159,US -3118620160,3118620671,TR -3118620672,3118621695,RU -3118621696,3118622719,NO -3118622720,3118623743,ES -3118623744,3118624767,NL -3118624768,3118625791,UA -3118625792,3118626815,IR -3118626816,3118627839,DE -3118627840,3118628863,OM -3118628864,3118629887,RU -3118629888,3118630911,IR -3118630912,3118631935,NL -3118631936,3118632959,IR -3118632960,3118633983,DE -3118633984,3118635007,NO -3118635008,3118636031,ES -3118636032,3118637055,GB -3118637056,3118638079,TR -3118638080,3118639103,RU -3118639104,3118640127,ES -3118640128,3118641151,DE -3118641152,3118643199,ES -3118643200,3118644223,DE -3118644224,3118646271,ES -3118646272,3118647295,TR -3118647296,3118648319,NO -3118648320,3118649343,NL -3118649344,3118650367,GB -3118650368,3118651391,DE -3118651392,3118652415,IE -3118652416,3118653439,GB -3118653440,3118657535,ES -3118657536,3118658559,DE -3118658560,3118659583,RU -3118659584,3118660607,PL -3118660608,3118661631,MD -3118661632,3118662655,FR -3118662656,3118663679,NO -3118663680,3118664703,ES -3118664704,3118665727,DE -3118665728,3118666751,FR -3118666752,3118667775,CH -3118667776,3118668799,SE -3118668800,3118669823,IT -3118669824,3118670847,ES -3118670848,3118671871,RU -3118671872,3118672895,RO -3118672896,3118673919,FI -3118673920,3118674943,BG -3118674944,3118675967,UA -3118675968,3118676991,CH -3118676992,3118678015,GB -3118678016,3118679039,IR -3118679040,3118680063,GB -3118680064,3118681087,MD -3118681088,3118682111,SE -3118682112,3118682947,NL -3118682948,3118682951,AD -3118682952,3118683135,NL -3118683136,3118684159,RU -3118684160,3118685183,AT -3118685184,3118686207,ES -3118686208,3118687231,BY -3118687232,3118688255,ES -3118688256,3118690303,NL -3118690304,3118691327,DE -3118691328,3118692351,IR -3118692352,3118693375,IT -3118693376,3118694399,NO -3118694400,3118695423,ES -3118695424,3118696447,DE -3118696448,3118696703,RO -3118696704,3118697471,IR -3118697472,3118698495,SY -3118698496,3118699519,ES -3118699520,3118700543,CH -3118700544,3118702591,DE -3118702592,3118703615,GB -3118703616,3118704639,CH -3118704640,3118705663,SK -3118705664,3118707711,ES -3118707712,3118708735,TR -3118708736,3118709759,ES -3118709760,3118711807,PL -3118711808,3118713855,GB -3118713856,3118714879,ES -3118714880,3118715903,IE -3118715904,3118717951,ES -3118717952,3118718975,IE -3118718976,3118719999,DE -3118720000,3118721023,GB -3118721024,3118722047,FR -3118722048,3118723071,IQ -3118723072,3118724095,GB -3118724096,3118725119,MD -3118725120,3118726143,GB -3118726144,3118726399,HK -3118726400,3118727167,GB -3118727168,3118728191,ES -3118728192,3118730239,DE -3118730240,3118731263,SY -3118731264,3118732287,DE -3118732288,3118733311,FR -3118733312,3118734335,BG -3118734336,3118735359,SE -3118735360,3118736383,AT -3118736384,3118737407,NL -3118737408,3118738431,AT -3118738432,3118739455,US -3118739456,3118740479,RU -3118740480,3118741503,ES -3118741504,3118742527,NL -3118742528,3118743551,UA -3118743552,3118744575,ES -3118744576,3118745599,DK -3118745600,3118746623,ES -3118746624,3118747647,UA -3118747648,3118748671,NL -3118748672,3118749695,FR -3118749696,3118750719,RU -3118750720,3118751743,US -3118751744,3118752767,ES -3118752768,3118754815,UA -3118754816,3118755839,PL -3118755840,3118756863,RU -3118756864,3118759935,ES -3118759936,3118760959,MD -3118760960,3118761983,RU -3118761984,3118763007,DE -3118763008,3118764031,PL -3118764032,3118765055,DE -3118765056,3118766079,AT -3118766080,3118767103,ES -3118767104,3118768127,FR -3118768128,3118769151,ES -3118769152,3118770175,CZ -3118770176,3118771199,IE -3118771200,3118772223,ES -3118772224,3118773247,DE -3118773248,3118774271,GB -3118774272,3118775295,HK -3118775296,3118776319,NL -3118776320,3118777343,UA -3118777344,3118781439,NL -3118781440,3118782463,SK -3118782464,3118783487,RO -3118783488,3118784511,IT -3118784512,3118785535,MD -3118785536,3118786559,FR -3118786560,3118787583,RU -3118787584,3118788607,IR -3118788608,3118789631,DE -3118789632,3118790655,IR -3118790656,3118791679,IT -3118791680,3118792703,GB -3118792704,3118793727,IR -3118793728,3118794751,TR -3118794752,3118795775,RU -3118795776,3118796799,TR -3118796800,3118797823,IT -3118797824,3118798847,GB -3118798848,3118799871,MK -3118799872,3118800895,IR -3118800896,3118801919,NL -3118801920,3118802943,KG -3118802944,3118803967,GB -3118803968,3118804991,ES -3118804992,3118806015,GB -3118806016,3118807039,NL -3118807040,3118807807,DE -3118807808,3118808063,US -3118808064,3118809087,PT -3118809088,3118810111,RU -3118810112,3118811135,CH -3118811136,3118812159,MK -3118812160,3118813183,GB -3118813184,3118814207,NL -3118814208,3118815231,UA -3118815232,3118816255,DE -3118816256,3118817279,DK -3118817280,3118818303,ES -3118818304,3118819327,DE -3118819328,3118820351,MD -3118820352,3118821375,GE -3118821376,3118823423,DE -3118823424,3118824447,RU -3118824448,3118825471,PL -3118825472,3118826495,FI -3118826496,3118827519,SE -3118827520,3118828543,BG -3118828544,3118829567,AT -3118829568,3118832639,DK -3118832640,3118833663,ES -3118833664,3118834687,FR -3118834688,3118835711,SA -3118835712,3118836735,DE -3118836736,3118837759,IT -3118837760,3118838783,FR -3118838784,3118839807,ES -3118839808,3118840831,RU -3118840832,3118841343,GB -3118841344,3118841855,CZ -3118841856,3118842879,RU -3118842880,3118843903,ES -3118843904,3118844927,HR -3118844928,3118845951,DE -3118845952,3118846975,NL -3118846976,3118849023,ES -3118849024,3118850047,NL -3118850048,3118850815,IL -3118850816,3118851071,NL -3118851072,3118852095,NO -3118852096,3118853119,RU -3118853120,3118854143,IT -3118854144,3118855167,NL -3118855168,3118856191,DE -3118856192,3118857215,RU -3118857216,3118858239,BG -3118858240,3118859263,ES -3118859264,3118860287,BG -3118860288,3118861311,FR -3118861312,3118862335,DE -3118862336,3118863359,RO -3118863360,3118864383,CH -3118864384,3118865407,SE -3118865408,3118866431,PL -3118866432,3118867455,SE -3118867456,3118868479,NL -3118868480,3118869503,IQ -3118869504,3118870527,UA -3118870528,3118872575,ES -3118872576,3118873599,MK -3118873600,3118874623,IL -3118874624,3118875647,ES -3118875648,3118876671,DE -3118876672,3118877695,NO -3118877696,3118878719,FR -3118878720,3118879743,IT -3118879744,3118880767,DE -3118880768,3118882815,UA -3118882816,3118883839,FR -3118883840,3118885887,RU -3118885888,3118886911,PL -3118886912,3118887935,CY -3118887936,3118888959,CH -3118888960,3118889983,CZ -3118889984,3118890239,ES -3118890240,3118890495,CH -3118890496,3118890751,US -3118890752,3118891007,DE -3118891008,3118892031,NO -3118892032,3118893055,AT -3118893056,3118894079,DE -3118894080,3118895103,RU -3118895104,3118896127,ES -3118896128,3118898175,GB -3118898176,3118899199,PL -3118899200,3118900223,DE -3118900224,3118901247,FR -3118901248,3118902271,PL -3118902272,3118903295,CZ -3118903296,3118904319,FI -3118904320,3118905343,US -3118905344,3118906367,CH -3118906368,3118907391,RU -3118907392,3118908415,UA -3118908416,3118909439,RU -3118909440,3118910463,PL -3118910464,3118911487,UZ -3118911488,3118912511,SA -3118912512,3118913535,NL -3118913536,3118914559,AT -3118914560,3118915583,GB -3118915584,3118916607,PL -3118916608,3118917631,GB -3118917632,3118918655,UA -3118918656,3118919679,ES -3118919680,3118920703,RU -3118920704,3118920753,IT -3118920754,3118920804,NL -3118920805,3118921727,IT -3118921728,3118922751,MD -3118922752,3118923775,MK -3118923776,3118924799,CH -3118924800,3118925823,DE -3118925824,3118926847,FR -3118926848,3118927871,PL -3118927872,3118928895,NL -3118928896,3118929919,ES -3118929920,3118932991,NL -3118932992,3118934015,IT -3118934016,3118935039,SA -3118935040,3118936063,SY -3118936064,3118937087,RU -3118937088,3118938111,CH -3118938112,3118939135,RU -3118939136,3118940159,DE -3118940160,3118941183,CY -3118941184,3118942207,NL -3118942208,3118943231,RO -3118943232,3118944255,GB -3118944256,3118945279,PL -3118945280,3118946303,SE -3118946304,3118947327,FI -3118947328,3118948351,ES -3118948352,3118949375,DE -3118949376,3118950399,SE -3118950400,3118951423,CH -3118951424,3118952447,TR -3118952448,3118953471,NL -3118953472,3118954495,ES -3118954496,3118955519,FR -3118955520,3118956543,DE -3118956544,3118957567,RS -3118957568,3118958591,DE -3118958592,3118960639,GB -3118960640,3118961663,FI -3118961664,3118962687,PL -3118962688,3118963711,RU -3118963712,3118964735,MK -3118964736,3118965759,RU -3118965760,3118967807,FR -3118967808,3118968831,US -3118968832,3118969855,SK -3118969856,3118971903,IR -3118971904,3118972927,PL -3118972928,3118973951,NL -3118973952,3118974975,ES -3118974976,3118975999,NL -3118976000,3118977023,RU -3118977024,3118978047,IT -3118978048,3118979071,DE -3118979072,3118980095,GB -3118980096,3118981119,NL -3118981120,3118982143,TR -3118982144,3118983167,LV -3118983168,3118984191,RU -3118984192,3118985215,CZ -3118985216,3118987263,RU -3118987264,3118991359,DE -3118991360,3118992383,ES -3118992384,3118993407,DE -3118993408,3118994431,RU -3118994432,3118994943,NL -3118994944,3118995199,US -3118995200,3118995455,DE -3118995456,3118996479,FR -3118996480,3118997503,EE -3118997504,3118998527,IR -3118998528,3118999551,ES -3118999552,3119001599,RU -3119001600,3119002623,ES -3119002624,3119004671,NL -3119004672,3119005695,RU -3119005696,3119006719,RO -3119006720,3119007743,AT -3119007744,3119008767,NL -3119008768,3119009791,SE -3119009792,3119010815,HU -3119010816,3119012863,RU -3119012864,3119013887,DE -3119013888,3119014911,RU -3119014912,3119015935,DE -3119015936,3119016959,RU -3119016960,3119017983,UA -3119017984,3119019007,NL -3119019008,3119020031,RU -3119020032,3119021055,MK -3119021056,3119022079,FR -3119022080,3119023103,BG -3119023104,3119024127,ES -3119024128,3119025151,RU -3119025152,3119026175,DK -3119026176,3119027199,DE -3119027200,3119028223,DK -3119028224,3119029247,IR -3119029248,3119030271,BG -3119030272,3119031295,NL -3119031296,3119032319,GB -3119032320,3119033343,RU -3119033344,3119034367,ES -3119034368,3119035391,IR -3119035392,3119036415,ES -3119036416,3119037439,NL -3119037440,3119038463,DE -3119038464,3119039487,FR -3119039488,3119040511,GB -3119040512,3119041535,FR -3119041536,3119042559,ES -3119042560,3119043583,RU -3119043584,3119044607,NL -3119044608,3119046655,DE -3119046656,3119047679,GB -3119047680,3119049727,RU -3119049728,3119050751,IT -3119050752,3119051775,GR -3119051776,3119054847,NL -3119054848,3119055871,RU -3119055872,3119056895,GB -3119056896,3119057919,FR -3119057920,3119058943,IR -3119058944,3119059967,PL -3119059968,3119060991,CZ -3119060992,3119062015,PL -3119062016,3119063039,NL -3119063040,3119064063,GB -3119064064,3119067135,UA -3119067136,3119068159,SE -3119068160,3119069183,DE -3119069184,3119070207,DK -3119070208,3119071231,NL -3119071232,3119072255,IT -3119072256,3119073279,CH -3119073280,3119074303,PL -3119074304,3119075327,ES -3119075328,3119077375,RU -3119077376,3119078399,NL -3119078400,3119079423,RU -3119079424,3119080447,ES -3119080448,3119081471,FR -3119081472,3119082495,DE -3119082496,3119083519,GB -3119083520,3119084543,RU -3119084544,3119086591,UA -3119086592,3119087615,GB -3119087616,3119088639,US -3119088640,3119089663,FR -3119089664,3119090687,UA -3119090688,3119091711,DE -3119091712,3119092735,MD -3119092736,3119093759,RO -3119093760,3119094783,UA -3119094784,3119096831,PL -3119096832,3119097855,DE -3119097856,3119098879,OM -3119098880,3119099903,NL -3119099904,3119100927,IE -3119100928,3119101951,AZ -3119101952,3119102975,GB -3119102976,3119103999,NL -3119104000,3119105023,RU -3119105024,3119106047,DK -3119106048,3119107071,RU -3119107072,3119108095,LT -3119108096,3119109119,MK -3119109120,3119110143,NL -3119110144,3119111167,RU -3119111168,3119112191,SY -3119112192,3119113215,ES -3119113216,3119114239,RO -3119114240,3119115263,ES -3119115264,3119116287,RU -3119116288,3119117311,DE -3119117312,3119118335,TR -3119118336,3119119359,IT -3119119360,3119120383,DK -3119120384,3119121407,GB -3119121408,3119122431,RO -3119122432,3119124479,RU -3119124480,3119125503,RO -3119125504,3119126527,ES -3119126528,3119127551,RU -3119127552,3119128575,CZ -3119128576,3119129599,DE -3119130624,3119131647,FR -3119131648,3119132671,DE -3119132672,3119133695,FR -3119133696,3119137791,UA -3119137792,3119138815,DE -3119138816,3119139839,GB -3119139840,3119141887,FR -3119141888,3119142911,SE -3119142912,3119143935,PL -3119143936,3119144959,NO -3119144960,3119145983,NL -3119145984,3119147007,ES -3119147008,3119148031,FR -3119148032,3119152127,RU -3119152128,3119153151,PT -3119153152,3119154175,RO -3119154176,3119155199,CZ -3119155200,3119156223,DE -3119156224,3119157247,FR -3119157248,3119158271,US -3119158272,3119159295,ES -3119159296,3119160319,NL -3119160320,3119161343,ES -3119161344,3119162367,NL -3119162368,3119163391,UA -3119163392,3119164415,GB -3119164416,3119165439,IT -3119165440,3119166463,UA -3119166464,3119167487,HU -3119167488,3119168511,ES -3119168512,3119169535,HU -3119169536,3119170559,IR -3119170560,3119171583,CH -3119171584,3119171839,FR -3119171840,3119172607,EE -3119172608,3119173631,DE -3119173632,3119174655,PL -3119174656,3119175167,HK -3119175168,3119175679,NL -3119175680,3119175935,IE -3119175936,3119176447,PL -3119176448,3119176703,IE -3119176704,3119177727,NL -3119177728,3119178751,ES -3119178752,3119179775,RU -3119179776,3119180799,PL -3119180800,3119181823,IT -3119181824,3119182847,PL -3119182848,3119183871,RU -3119183872,3119184895,SK -3119184896,3119185919,RU -3119185920,3119186943,GB -3119186944,3119187967,FR -3119187968,3119188991,RU -3119188992,3119190015,NL -3119190016,3119191039,SY -3119191040,3119192063,IT -3119192064,3119193087,SY -3119193088,3119195135,RU -3119195136,3119196159,DE -3119196160,3119197183,IR -3119197184,3119198207,TR -3120562176,3120594943,CO -3120594944,3120599039,AR -3120601088,3120602111,AR -3120602112,3120603135,BO -3120603136,3120610303,AR -3120610304,3120611327,PY -3120611328,3120617471,AR -3120617472,3120617727,CL -3120617728,3120627711,AR -3120627712,3120644095,NI -3120644096,3120660479,DO -3120660480,3120676863,CO -3120676864,3120680959,HT -3120680960,3120691199,AR -3120691200,3120693247,CO -3120693248,3120726015,BO -3120726016,3120734207,HN -3120734208,3120734463,BZ -3120734464,3120734719,EC -3120734720,3120735231,BZ -3120735232,3120735487,RU -3120735488,3120735743,NL -3120735744,3120735999,BZ -3120736000,3120736255,RU -3120736256,3120736511,EC -3120736512,3120736767,BZ -3120736768,3120737535,RU -3120737536,3120737791,BZ -3120737792,3120738303,EC -3120738304,3120742399,CW -3120742400,3120754687,PY -3120754688,3120755711,CR -3120755712,3120756735,GF -3120756736,3120757759,BR -3120757760,3120758783,CL -3120758784,3120824319,EC -3120824320,3120840703,CR -3120840704,3120857087,AR -3120857088,3120922623,EC -3120922624,3120930815,PA -3120930816,3120934911,CR -3120934912,3120949247,AR -3120949248,3120951295,CL -3120951296,3120955391,AR -3120955392,3121086463,DO -3121086464,3121151999,UY -3121152000,3121348607,CL -3121348608,3121479679,AR -3121479680,3121545215,VE -3121545216,3121610751,CR -3121610752,3121741823,PY -3121741824,3121872895,AR -3121872896,3122003967,CL -3122003968,3122135039,AR -3122135040,3122282495,VE -3122282496,3122294783,AR -3122294784,3122298879,CR -3122298880,3122331647,VE -3122331648,3122364415,BO -3122364416,3122659327,CO -3122659328,3122675711,CR -3122675712,3122692095,SV -3122692096,3122700287,HN -3122700288,3122716671,CR -3122716672,3122722815,HN -3122722816,3122724863,SV -3122724864,3122741247,AR -3122741248,3122757631,DO -3122757632,3122774015,EC -3122774016,3122790399,AR -3122790400,3123052543,CL -3123052544,3123183615,AR -3123183616,3123314687,CL -3123314688,3123380223,EC -3123380224,3123412991,CO -3123412992,3123445759,EC -3123445760,3123576831,TT -3123576832,3123707903,EC -3123707904,3124232191,UY -3124232192,3124760600,AR -3124760601,3124760601,MX -3124760602,3124783103,AR -3124783104,3124785151,GT -3124785152,3124788223,CL -3124788224,3124789247,PE -3124789248,3124822015,CR -3124822016,3124838399,EC -3124838400,3124840447,AR -3124840448,3124842495,CL -3124842496,3124844543,AR -3124844544,3124845567,BZ -3124846592,3124848639,AR -3124848640,3124849663,BR -3124849664,3124850687,AR -3124850688,3124851855,HN -3124851856,3124851863,IN -3124851864,3124854783,HN -3124854784,3124887551,CL -3124887552,3124953087,EC -3124953088,3125018623,CL -3125018624,3125280767,EC -3125280768,3125542911,PA -3125542912,3125673983,NI -3125673984,3125805055,CL -3125805056,3126329343,CO -3126329344,3126853631,VE -3126853632,3126860415,AR -3126860416,3126860543,US -3126860544,3126863999,AR -3126864000,3126864127,US -3126864128,3126870015,AR -3126870016,3126873343,VE -3126873344,3126873599,PA -3126873600,3126874111,VE -3126874112,3126878207,CR -3126878208,3126886399,PA -3126886400,3126906879,AR -3126906880,3126910975,TT -3126910976,3126918143,AR -3126918144,3126919167,HN -3126919168,3127115775,CO -3127115776,3127181311,AR -3127181312,3127246847,EC -3127246848,3127345151,CO -3127345152,3127640063,CL -3127640064,3127902207,AR -3127902208,3128426495,CO -3128426496,3128492031,DO -3128492032,3128524799,CO -3128524800,3128541183,AR -3128541184,3128557567,BO -3128557568,3129999359,AR -3129999360,3130261503,CO -3130261504,3130277887,CL -3130277888,3130284031,AR -3130284032,3130286079,DO -3130286080,3130290175,PA -3130290176,3130302463,AR -3130302464,3130302975,CY -3130302976,3130310655,CO -3130312704,3130314751,AR -3130314752,3130315775,CL -3130315776,3130316799,CR -3130316800,3130317823,AW -3130317824,3130318847,CW -3130318848,3130327039,AR -3130327040,3130458111,DO -3130458112,3130523647,GT -3130523648,3130654719,AR -3130654720,3130785791,CO -3130785792,3130851327,CL -3130851328,3130982399,AR -3130982400,3131006975,CO -3131006976,3131011071,BQ -3131011072,3131012095,CO -3131012096,3131012479,PA -3131012480,3131012607,CR -3131012608,3131013119,PA -3131013120,3131015167,AR -3131015168,3131047935,CR -3131047936,3131310079,PE -3131310080,3131572223,VE -3131572224,3131834367,CO -3131834368,3132096511,CL -3132096512,3132211199,CR -3132211200,3132227583,AR -3132227584,3132293119,EC -3132293120,3132295647,US -3132295648,3132295679,UY -3132295680,3132296447,US -3132296448,3132296703,HN -3132296704,3132301311,US -3132301312,3132301727,HN -3132301728,3132301743,NL -3132301744,3132302319,HN -3132302320,3132302335,NL -3132302336,3132302975,HN -3132302976,3132302983,NL -3132302984,3132303735,HN -3132303736,3132303743,NL -3132303744,3132304127,HN -3132304128,3132304303,US -3132304304,3132304311,DE -3132304312,3132304383,US -3132304384,3132304607,HN -3132304608,3132304623,DE -3132304624,3132305143,HN -3132305144,3132305151,NL -3132305152,3132306239,HN -3132306240,3132306271,DE -3132306272,3132307823,HN -3132307824,3132307839,US -3132307840,3132308367,HN -3132308368,3132308375,US -3132308376,3132308775,HN -3132308776,3132308783,US -3132308784,3132309503,HN -3132309504,3132313599,CR -3132313600,3132317695,CL -3132317696,3132321791,CO -3132321792,3132325887,PA -3132325888,3132358655,SR -3132358656,3132489727,CO -3132489728,3132510719,AR -3132510720,3132510975,PY -3132510976,3132588031,AR -3132588032,3132620799,CO -3132620800,3132915711,VE -3132915712,3132948479,PA -3132948480,3132964863,AW -3132964864,3132981247,AR -3132981248,3132997631,AW -3132997632,3133014015,AR -3133014016,3133046783,HT -3133046784,3133067263,AR -3133067264,3133071359,PA -3133071360,3133071871,CY -3133071872,3133073407,PA -3133073408,3133074431,CW -3133074432,3133075455,CL -3133075456,3133079551,CW -3133079552,3133145087,AR -3133145088,3133311999,BR -3133312000,3133313023,MX -3133313024,3133317119,BR -3133321216,3136983039,BR -3136984064,3136985087,BR -3136985088,3136985103,AR -3136985104,3136985107,CO -3136985108,3136985127,AR -3136985128,3136985131,CO -3136985132,3136985135,AR -3136985136,3136985143,CO -3136985144,3136985343,AR -3136985344,3136985355,CL -3136985356,3136985359,AR -3136985360,3136985375,CL -3136985376,3136985407,AR -3136985408,3136985415,BR -3136985416,3136985423,AR -3136985424,3136985431,BR -3136985432,3136985439,AR -3136985440,3136985447,BR -3136985448,3136985623,AR -3136985624,3136985631,MX -3136985632,3136985947,AR -3136985948,3136985951,BR -3136985952,3136985979,AR -3136985980,3136985983,BR -3136985984,3136986007,AR -3136986008,3136986047,BR -3136986048,3136986055,PE -3136986056,3136986087,BR -3136986088,3136986095,PE -3136986096,3136986099,BR -3136986100,3136986103,AR -3136986104,3136986105,BR -3136986106,3136986107,AR -3136986108,3140587519,BR -3140599808,3140614143,BR -3140614144,3140616191,CR -3140616192,3145727999,BR -3145728000,3149135871,MX -3149135872,3149398015,BR -3149398016,3149881343,MX -3149881344,3149889535,BR -3149889536,3153327103,MX -3153327104,3153327359,US -3153327360,3154051071,MX -3154051072,3154116607,BR -3154116608,3154124799,RU -3154124800,3154126847,PL -3154126848,3154128895,RU -3154128896,3154132991,EE -3154132992,3154149375,UA -3154149376,3154157567,KZ -3154157568,3154173951,RU -3154173952,3154182143,MD -3154182144,3154247679,DE -3154247680,3154256895,RS -3154256896,3154257919,XK -3154257920,3154274303,RS -3154274304,3154275327,XK -3154275328,3154282495,RS -3154282496,3154284543,XK -3154284544,3154313215,RS -3154313216,3154378751,TR -3154378752,3154444287,GR -3154444288,3154509823,BE -3154509824,3154571519,HU -3154571520,3154571775,BG -3154571776,3154575359,HU -3154575360,3154640895,FR -3154640896,3155165183,IT -3155165184,3155312938,RU -3155312939,3155312939,US -3155312940,3155427327,RU -3155427328,3155689471,AT -3155689472,3155951615,RO -3155951616,3156213759,GB -3156213760,3156279295,RU -3156279296,3156344831,PL -3156344832,3156410367,IR -3156410368,3156475903,RU -3156475904,3156541439,HU -3156541440,3156606975,PT -3156606976,3156672511,TR -3156672512,3156738047,GB -3156738048,3156803583,DE -3156803584,3156869119,TR -3156869120,3156876287,LU -3156876288,3156877311,RU -3156877312,3156877823,LU -3156877824,3156878335,UA -3156878336,3156893695,LU -3156893696,3156894719,IN -3156894720,3156897791,LU -3156897792,3156899839,US -3156899840,3156901887,SG -3156901888,3156906239,NL -3156906240,3156907007,LU -3156907008,3156908031,RU -3156908032,3156910079,LU -3156910080,3156912127,NL -3156912128,3156914175,LU -3156914176,3156916223,RU -3156916224,3156917247,GB -3156917248,3156920319,LU -3156920320,3156921343,SG -3156921344,3156922367,HK -3156922368,3156922623,NL -3156922624,3156922879,US -3156922880,3156923135,LU -3156923136,3156923391,RU -3156923392,3156923647,SG -3156923648,3156924415,LU -3156924416,3156925439,NL -3156925440,3156926463,SG -3156926464,3156927743,NL -3156927744,3156927999,LU -3156928000,3156929535,NL -3156929536,3156930559,LU -3156930560,3156932607,US -3156932608,3156932863,NL -3156932864,3156933119,US -3156933120,3156933631,NL -3156933632,3156934655,SG -3156934656,3157000191,RU -3157000192,3157008383,MK -3157008384,3157016575,RU -3157016576,3157024767,BE -3157024768,3157032959,RU -3157032960,3157065727,HU -3157065728,3157131263,AT -3157131264,3157196799,DE -3157196800,3157262335,PL -3157262336,3157786623,SA -3157786624,3158048767,TR -3158048768,3158070548,CH -3158070549,3158070549,SE -3158070550,3158310911,CH -3158310912,3158312959,FI -3158312960,3158315007,AZ -3158315008,3158316031,DE -3158316032,3158316543,GB -3158316544,3158317055,DE -3158317056,3158319103,SI -3158319104,3158321151,GB -3158321152,3158323199,DE -3158323200,3158325247,BE -3158325248,3158327295,DE -3158327296,3158329343,NL -3158329344,3158331391,BE -3158331392,3158333439,PL -3158333440,3158335487,IT -3158335488,3158337535,IL -3158337536,3158339583,SI -3158339584,3158341631,RU -3158341632,3158343679,IT -3158343680,3158345727,RU -3158345728,3158347775,CY -3158347776,3158349823,RU -3158349824,3158351871,DK -3158351872,3158355967,RU -3158355968,3158358015,LV -3158358016,3158360063,GB -3158360064,3158362111,DE -3158362112,3158364159,IL -3158366208,3158368255,RU -3158368256,3158370303,FR -3158370304,3158372351,BE -3158372352,3158374399,FR -3158374400,3158376447,DE -3158376448,3158378495,IT -3158378496,3158380543,RU -3158382592,3158384639,OM -3158384640,3158386687,GB -3158386688,3158388735,PL -3158388736,3158390783,RU -3158390784,3158392831,GB -3158392832,3158394879,RU -3158394880,3158396927,AT -3158396928,3158398975,IT -3158398976,3158401023,ES -3158401024,3158403071,GB -3158403072,3158405119,RU -3158405120,3158407167,GB -3158407168,3158409215,FR -3158409216,3158411263,RU -3158411264,3158413311,FI -3158413312,3158415359,DE -3158415360,3158417407,SE -3158417408,3158419455,NL -3158419456,3158421503,FR -3158421504,3158423551,GB -3158423552,3158425159,MT -3158425160,3158425167,IE -3158425168,3158425599,MT -3158425600,3158427647,NL -3158427648,3158429695,DE -3158429696,3158431743,RU -3158431744,3158433791,BE -3158433792,3158435839,NL -3158435840,3158439935,RU -3158439936,3158441983,GB -3158441984,3158444031,EE -3158444032,3158446079,BE -3158446080,3158448127,NL -3158450176,3158452223,RU -3158452224,3158454271,DE -3158458368,3158474751,GB -3158474752,3158507519,OM -3158507520,3158573055,FI -3158573056,3158573311,GB -3158573312,3158573823,RU -3158573824,3158574079,CZ -3158574080,3158581247,RU -3158581248,3158589439,DE -3158589440,3158615039,RU -3158615040,3158616063,GB -3158616064,3158630399,RU -3158630400,3158638591,PL -3158638592,3158704127,LT -3158704128,3158835199,KW -3158835200,3158851583,IQ -3158851584,3158852863,NL -3158852864,3158853119,ES -3158853120,3158853631,NL -3158853632,3158855679,RU -3158855680,3158856447,NL -3158856448,3158857471,DE -3158857472,3158857727,SE -3158857728,3158857983,DE -3158857984,3158858239,GB -3158858240,3158858495,SG -3158858496,3158859519,NL -3158859520,3158859775,GB -3158859776,3158859903,NL -3158859904,3158860031,CZ -3158860032,3158860287,GB -3158860288,3158860543,NL -3158860544,3158860799,GB -3158860800,3158861055,NL -3158861056,3158861311,UA -3158861312,3158861567,IE -3158861568,3158861823,AE -3158861824,3158862079,DE -3158862080,3158862463,GB -3158862464,3158862591,NL -3158862592,3158862847,FR -3158862848,3158863103,PL -3158863104,3158863359,IT -3158863360,3158863615,MD -3158863616,3158863871,EE -3158863872,3158864127,SK -3158864128,3158864383,ES -3158864384,3158864639,AT -3158864640,3158864895,RO -3158864896,3158865151,LT -3158865152,3158865407,NL -3158865408,3158865663,AL -3158865664,3158865919,CY -3158865920,3158866943,IT -3158866944,3158867199,DE -3158867200,3158867455,HU -3158867456,3158867711,DE -3158867712,3158867967,NO -3158867968,3158884351,AZ -3158884352,3158900735,NL -3158900736,3158917119,FR -3158917120,3158933503,DE -3158933504,3158949887,RU -3158949888,3158966271,GR -3158966272,3158982655,DE -3158982656,3158999039,GB -3158999040,3159031807,RO -3159031808,3159048191,RU -3159048192,3159064575,IR -3159064576,3159080959,CZ -3159080960,3159097343,RU -3159097344,3159359487,ES -3159359488,3159621631,PT -3159621632,3159883775,ES -3159883776,3160145919,NL -3160145920,3160147967,RU -3160147968,3160150015,CZ -3160150016,3160152063,LV -3160152064,3160154111,IT -3160154112,3160156159,DE -3160156160,3160158207,CZ -3160158208,3160160255,CH -3160160256,3160162303,NL -3160162304,3160164351,FR -3160164352,3160166399,LV -3160166400,3160168447,NO -3160168448,3160170495,GB -3160170496,3160172543,CZ -3160172544,3160174591,RU -3160174592,3160176639,DE -3160178688,3160180735,DE -3160180736,3160182783,GB -3160182784,3160184831,CH -3160184832,3160186879,NL -3160186880,3160188927,EE -3160188928,3160190975,SE -3160190976,3160193023,RU -3160193024,3160195071,IT -3160195072,3160197119,RU -3160197120,3160199167,DE -3160199168,3160201215,GE -3160201216,3160203263,RU -3160203264,3160205311,CH -3160205312,3160207359,GB -3160207360,3160209407,RU -3160209408,3160211455,SE -3160211456,3160213503,IE -3160213504,3160215551,DE -3160215552,3160219647,RU -3160219648,3160221695,ES -3160221696,3160223743,FR -3160223744,3160227839,RU -3160227840,3160229887,IR -3160229888,3160231935,ES -3160231936,3160233983,BE -3160233984,3160236031,GE -3160236032,3160238079,BE -3160238080,3160240127,RU -3160240128,3160242175,BE -3160242176,3160244223,RS -3160244224,3160246271,RU -3160246272,3160248319,IT -3160248320,3160250367,NL -3160250368,3160252415,BE -3160252416,3160254463,PL -3160254464,3160256511,LU -3160256512,3160258559,GB -3160258560,3160260607,NO -3160260608,3160262655,PT -3160262656,3160264703,HU -3160264704,3160266751,RU -3160266752,3160268799,DE -3160268800,3160272895,PT -3160272896,3160274943,RU -3160274944,3160276991,AT -3160276992,3160279039,FR -3160279040,3160281087,ES -3160281088,3160283135,GB -3160283136,3160285183,DE -3160285184,3160287231,RU -3160287232,3160289279,GB -3160289280,3160291327,RU -3160291328,3160293375,ES -3160293376,3160295423,FI -3160295424,3160297471,GB -3160297472,3160299519,MD -3160299520,3160301567,RU -3160301568,3160303615,DE -3160303616,3160305663,GB -3160305664,3160307711,DE -3160307712,3160309759,IT -3160309760,3160311807,GB -3160311808,3160313855,HU -3160313856,3160315903,IT -3160315904,3160317951,KZ -3160317952,3160322047,RU -3160322048,3160324095,CH -3160326144,3160328191,IT -3160328192,3160330239,FR -3160330240,3160332287,RU -3160332288,3160334335,NO -3160334336,3160336383,RU -3160336384,3160338431,CZ -3160338432,3160340479,GB -3160340480,3160346623,DE -3160346624,3160348671,IT -3160348672,3160350719,PL -3160350720,3160352767,SE -3160352768,3160354815,GB -3160354816,3160356863,NL -3160356864,3160358911,CZ -3160358912,3160360959,JO -3160360960,3160363007,IT -3160363008,3160365055,GB -3160367104,3160369151,NL -3160369152,3160371199,RU -3160371200,3160373247,ES -3160373248,3160375295,CZ -3160375296,3160377343,GB -3160377344,3160379391,NL -3160381440,3160383487,UA -3160383488,3160385535,SA -3160385536,3160387583,NL -3160387584,3160389631,RS -3160389632,3160391679,RU -3160391680,3160395775,GB -3160395776,3160397823,EE -3160397824,3160399871,ES -3160399872,3160401919,SE -3160401920,3160403967,DE -3160403968,3160406015,NO -3160406016,3160408063,ES -3160408064,3161456639,DE -3161456640,3161473023,PL -3161473024,3161489407,SK -3161489408,3161505791,LV -3161505792,3161538559,RU -3161538560,3161554943,NO -3161554944,3161571327,RU -3161571328,3161587711,UZ -3161587712,3161604095,RU -3161604096,3161612287,PL -3161612288,3161614335,IT -3161614336,3161614847,US -3161614848,3161615103,ES -3161615104,3161615359,US -3161615360,3161616383,ES -3161616384,3161618431,GB -3161618432,3161620479,IQ -3161620480,3161636863,DK -3161636864,3161637887,UA -3161637888,3161638911,RU -3161638912,3161640959,UA -3161640960,3161645055,RU -3161645056,3161653247,SE -3161653248,3161669631,LU -3161669632,3161673727,MQ -3161673728,3161676799,GP -3161676800,3161677823,FR -3161677824,3161681919,GP -3161681920,3161682943,GF -3161682944,3161686015,FR -3161686016,3161702399,UA -3161702400,3161718783,AM -3161718784,3161735167,PL -3161735168,3161751551,CZ -3161751552,3161767935,RU -3161767936,3161784319,BH -3161784320,3161800703,FI -3161800704,3161817087,SA -3161817088,3161833471,PL -3161833472,3161835519,RS -3161835520,3161841663,AT -3161841664,3161843711,RS -3161843712,3161845759,AT -3161845760,3161846271,GR -3161846272,3161849855,AT -3161849856,3161866239,BE -3161866240,3161882623,IR -3161882624,3161899007,DE -3161899008,3161915391,AT -3161915392,3161931775,TR -3161948160,3161964543,RO -3161964544,3161980927,ES -3161980928,3161989119,SK -3161989120,3161990143,NL -3161990144,3161992191,TR -3161992192,3161993215,NL -3161993216,3161997311,RU -3161997312,3162005503,DK -3162005504,3162013695,RS -3162013696,3162021887,IL -3162021888,3162030079,SE -3162030080,3162038271,CZ -3162038272,3162046463,RU -3162046464,3162054655,PL -3162054656,3162062847,NL -3162062848,3162071039,SE -3162071040,3162087423,IR -3162087424,3162095615,SK -3162095616,3162103807,GE -3162103808,3162104831,FR -3162104832,3162111999,NL -3162112000,3162120191,PL -3162120192,3162128383,GB -3162128384,3162136575,NL -3162136576,3162144767,IR -3162144768,3162152959,SE -3162152960,3162161151,RU -3162161152,3162169343,CZ -3162169344,3162177535,RU -3162177536,3162185727,FI -3162185728,3162193919,RU -3162193920,3162202111,FR -3162202112,3162209535,SK -3162209536,3162209791,CZ -3162209792,3162210303,SK -3162210304,3162218495,GE -3162218496,3162226687,JO -3162226688,3162234879,PL -3162234880,3162243071,RU -3162243072,3162251263,TR -3162251264,3162259455,RU -3162259456,3162267647,BG -3162267648,3162275839,RU -3162275840,3162284031,NO -3162284032,3162292223,PL -3162292224,3162300415,BA -3162300416,3162308607,RU -3162308608,3162316799,HR -3162316800,3162324991,PL -3162324992,3162327039,IE -3162327040,3162329087,CH -3162329088,3162331135,IE -3162331136,3162333183,GB -3162333184,3162341375,IT -3162341376,3162349567,PL -3162349568,3162357759,TR -3162357760,3162365951,PT -3162365952,3162374143,PL -3162374144,3162382335,BG -3162382336,3162390527,RU -3162390528,3162396927,SE -3162396928,3162397183,FI -3162397184,3162398719,SE -3162398720,3162404863,NL -3162404864,3162406911,BE -3162406912,3162415103,IR -3162415104,3162423295,DE -3162423296,3162431487,NO -3162431488,3162439679,SE -3162439680,3162447871,PL -3162447872,3162456063,RU -3162456064,3162464255,BG -3162464256,3162472447,BA -3162472448,3162480639,HU -3162480640,3162488831,ES -3162488832,3162497023,FI -3162497024,3162537983,RU -3162537984,3162570751,PL -3162570752,3162603519,HR -3162603520,3162636287,GE -3162636288,3162669055,FR -3162669056,3162676223,RU -3162676224,3162677247,KZ -3162677248,3162679039,RU -3162679040,3162679295,KZ -3162679296,3162680319,RU -3162680320,3162680575,UZ -3162680576,3162681343,RU -3162681344,3162682367,UA -3162682368,3162682879,MD -3162682880,3162683135,GB -3162683136,3162683391,ES -3162683392,3162685439,EE -3162685440,3162689535,MD -3162689536,3162701823,RU -3162701824,3162734591,MD -3162734592,3162767359,CN -3162767360,3162800127,SA -3162800128,3162832895,TR -3162832896,3162865663,SY -3162865664,3162931199,RU -3162931200,3162963967,CZ -3162963968,3162996735,OM -3162996736,3163029503,IT -3163029504,3163062271,DE -3163062272,3163095039,IR -3163095040,3163127807,PL -3163127808,3163160575,BH -3163160576,3163164927,DE -3163164928,3163165183,FR -3163165184,3163166975,DE -3163166976,3163167231,FR -3163167232,3163170527,DE -3163170528,3163170559,AE -3163170560,3163178854,DE -3163178855,3163178855,SG -3163178856,3163186534,DE -3163186535,3163186535,FR -3163186536,3163186673,DE -3163186674,3163186674,FR -3163186675,3163193343,DE -3163193344,3163226111,MD -3163226112,3163258879,SA -3163258880,3163291647,SY -3163291648,3163324415,PT -3163324416,3163357183,OM -3163357184,3163389951,IE -3163389952,3163422719,FR -3163422720,3163455487,NL -3163455488,3163521023,HU -3163521024,3163553791,RU -3163553792,3163684863,DE -3163684864,3163815935,PL -3163815936,3164078079,NO -3164078080,3164209151,IT -3164209152,3164340223,CH -3164340224,3164471295,HU -3164471296,3164602367,IR -3164602368,3164667903,SY -3164667904,3164733439,PS -3164733440,3164798975,RU -3164798976,3164864511,UA -3164864512,3164864703,GB -3164864704,3164864735,ZA -3164864736,3164864767,IE -3164864768,3164893183,GB -3164893184,3164895231,TR -3164895232,3164897279,GB -3164897280,3164899327,IT -3164899328,3164901375,RU -3164901376,3164903423,PL -3164903424,3164905471,AM -3164905472,3164913663,RU -3164913664,3164915711,ES -3164915712,3164917759,GR -3164917760,3164919807,RU -3164919808,3164921855,AL -3164921856,3164923903,GB -3164923904,3164925951,DE -3164925952,3164927999,PL -3164928000,3164930047,NL -3164930048,3164932095,IE -3164932096,3164932719,FR -3164932720,3164932735,CZ -3164932736,3164932831,FR -3164932832,3164932863,IT -3164932864,3164932879,FR -3164932880,3164932895,LT -3164932896,3164932927,FR -3164932928,3164932991,NL -3164932992,3164933119,GB -3164933120,3164934143,FR -3164934144,3164936191,PL -3164936192,3164937749,LT -3164937750,3164937750,FR -3164937751,3164938239,LT -3164938240,3164939705,FR -3164939706,3164939706,ES -3164939707,3164945919,FR -3164945920,3164945983,NL -3164945984,3164945999,FR -3164946000,3164946015,ES -3164946016,3164946047,GB -3164946048,3164946159,FR -3164946160,3164946175,GB -3164946176,3164946351,FR -3164946352,3164946367,GB -3164946368,3164946479,FR -3164946480,3164946483,ES -3164946484,3164946527,FR -3164946528,3164946559,FI -3164946560,3164946815,FR -3164946816,3164946879,DE -3164946880,3164946943,FR -3164946944,3164947007,IT -3164947008,3164947023,FR -3164947024,3164947039,FI -3164947040,3164947043,FR -3164947044,3164947047,GB -3164947048,3164947591,FR -3164947592,3164947599,ES -3164947600,3164948743,FR -3164948744,3164948747,GB -3164948748,3164948863,FR -3164948864,3164948927,GB -3164948928,3164948959,FR -3164948960,3164948991,ES -3164948992,3164949119,FR -3164949120,3164949123,PT -3164949124,3164949339,FR -3164949340,3164949343,GB -3164949344,3164949371,FR -3164949372,3164949375,GB -3164949376,3164950399,FR -3164950400,3164950407,ES -3164950408,3164950711,FR -3164950712,3164950715,FI -3164950716,3164951423,FR -3164951424,3164951455,ES -3164951456,3164952224,FR -3164952225,3164952231,GB -3164952232,3164952233,FR -3164952234,3164952235,GB -3164952236,3164952236,FR -3164952237,3164952237,GB -3164952238,3164952247,FR -3164952248,3164952271,ES -3164952272,3164952511,FR -3164952512,3164952527,PT -3164952528,3164953007,FR -3164953008,3164953023,LT -3164953024,3164953087,IE -3164953088,3164953583,FR -3164953584,3164953599,ES -3164953600,3164954463,FR -3164954464,3164954471,IT -3164954472,3164954479,IE -3164954480,3164954507,FR -3164954508,3164954511,ES -3164954512,3164958895,FR -3164958896,3164958911,PT -3164958912,3164959247,FR -3164959248,3164959255,ES -3164959256,3164959467,FR -3164959468,3164959471,GB -3164959472,3164959807,FR -3164959808,3164959823,IE -3164959824,3164959839,FI -3164959840,3164960247,FR -3164960248,3164960255,DE -3164960256,3164960263,FR -3164960264,3164960267,ES -3164960268,3164960391,FR -3164960392,3164960395,GB -3164960396,3164960439,FR -3164960440,3164960443,DE -3164960444,3164960499,FR -3164960500,3164960503,CZ -3164960504,3164960671,FR -3164960672,3164960675,ES -3164960676,3164960699,FR -3164960700,3164960703,ES -3164960704,3164960787,FR -3164960788,3164960791,DE -3164960792,3164960799,FR -3164960800,3164960831,PT -3164960832,3164961151,FR -3164961152,3164961159,ES -3164961160,3164961391,FR -3164961392,3164961395,ES -3164961396,3164961551,FR -3164961552,3164961555,ES -3164961556,3164961727,FR -3164961728,3164961735,ES -3164961736,3164962143,FR -3164962144,3164962151,ES -3164962152,3164962283,FR -3164962284,3164962287,ES -3164962288,3164962455,FR -3164962456,3164962459,IE -3164962460,3164962471,FR -3164962472,3164962475,ES -3164962476,3164962647,FR -3164962648,3164962655,PT -3164962656,3164962815,FR -3164962816,3164964863,ES -3164964864,3164966911,FI -3164966912,3164967135,FR -3164967136,3164967151,ES -3164967152,3164967231,FR -3164967232,3164967239,ES -3164967240,3164967303,FR -3164967304,3164967307,DE -3164967308,3164967935,FR -3164967936,3164967967,DE -3164967968,3164968223,FR -3164968224,3164968255,GB -3164968256,3164968319,FR -3164968320,3164968447,GB -3164968448,3164968835,FR -3164968836,3164968839,ES -3164968840,3164969135,FR -3164969136,3164969143,ES -3164969144,3164969147,FR -3164969148,3164969151,GB -3164969152,3164969179,FR -3164969180,3164969183,ES -3164969184,3164969191,FR -3164969192,3164969199,PT -3164969200,3164970223,FR -3164970224,3164970239,GB -3164970240,3164970413,FR -3164970414,3164970415,IT -3164970416,3164970607,FR -3164970608,3164970615,ES -3164970616,3164970631,FR -3164970632,3164970639,ES -3164970640,3164970719,FR -3164970720,3164970751,PL -3164970752,3164970927,FR -3164970928,3164970943,ES -3164970944,3164971011,FR -3164971012,3164971015,IE -3164971016,3164971479,FR -3164971480,3164971483,FI -3164971484,3164971579,FR -3164971580,3164971583,ES -3164971584,3164971615,FR -3164971616,3164971619,ES -3164971620,3164971807,FR -3164971808,3164971839,ES -3164971840,3164972399,FR -3164972400,3164972407,ES -3164972408,3164972543,FR -3164972544,3164972559,IT -3164972560,3164972599,FR -3164972600,3164972607,IT -3164972608,3164972735,FR -3164972736,3164972751,GB -3164972752,3164973407,FR -3164973408,3164973415,GB -3164973416,3164973419,FR -3164973420,3164973423,ES -3164973424,3164973711,FR -3164973712,3164973727,GB -3164973728,3164974335,FR -3164974336,3164974437,GB -3164974438,3164974438,IT -3164974439,3164974463,GB -3164974464,3164974495,DE -3164974496,3164975199,FR -3164975200,3164975215,ES -3164975216,3164975311,FR -3164975312,3164975327,ES -3164975328,3164975887,FR -3164975888,3164975903,IT -3164975904,3164975991,FR -3164975992,3164975995,PL -3164975996,3164976027,FR -3164976028,3164976031,ES -3164976032,3164976143,FR -3164976144,3164976159,BE -3164976160,3164976231,FR -3164976232,3164976239,ES -3164976240,3164976511,FR -3164976512,3164976527,LT -3164976528,3164977215,FR -3164977216,3164977223,NL -3164977224,3164977231,PT -3164977232,3164977239,BE -3164977240,3164977247,IT -3164977248,3164977255,CZ -3164977256,3164977263,PT -3164977264,3164977271,FI -3164977272,3164977279,IT -3164977280,3164978079,FR -3164978080,3164978111,PT -3164978112,3164978155,FR -3164978156,3164978159,DE -3164978160,3164978623,FR -3164978624,3164978655,ES -3164978656,3164979119,FR -3164979120,3164979135,LT -3164979136,3164979151,FR -3164979152,3164979155,ES -3164979156,3164995345,FR -3164995346,3164995346,GB -3164995347,3164995583,FR -3164995584,3165030399,NL -3165030400,3165031423,GB -3165031424,3165032447,NL -3165032448,3165036543,GB -3165036544,3165038591,DE -3165038592,3165040639,GB -3165040640,3165044735,SG -3165044736,3165045759,DE -3165045760,3165046783,SG -3165046784,3165047807,NL -3165047808,3165061119,SG -3165061120,3165126655,SK -3165126656,3165192191,RU -3165192192,3165257727,GE -3165257728,3165323263,RU -3165323264,3165388799,ES -3165388800,3165417471,MT -3165417472,3165421567,DE -3165421568,3165425663,IE -3165425664,3165437951,GB -3165437952,3165438207,DK -3165438208,3165439487,AT -3165439488,3165439743,GB -3165439744,3165439999,ES -3165440000,3165440255,JP -3165440256,3165440511,HK -3165440512,3165440767,JP -3165440768,3165441023,SG -3165441024,3165442047,AT -3165442048,3165442303,TW -3165442304,3165442559,AU -3165442560,3165442815,KR -3165442816,3165443071,HK -3165443072,3165443583,CA -3165443584,3165444095,US -3165444096,3165444351,BR -3165444352,3165444607,ZA -3165444608,3165444863,IT -3165444864,3165445119,NL -3165445120,3165445375,AT -3165445376,3165445631,CA -3165445632,3165445887,US -3165445888,3165446143,NO -3165446144,3165447167,DE -3165447168,3165447423,CA -3165447424,3165447679,AT -3165447680,3165448191,FR -3165448192,3165448447,AT -3165448448,3165448703,DE -3165448704,3165448959,US -3165448960,3165449215,CH -3165449216,3165451263,AT -3165451264,3165451519,BR -3165451520,3165451775,FR -3165451776,3165452031,AT -3165452032,3165452287,IL -3165452288,3165452543,AT -3165452544,3165452799,DE -3165452800,3165453055,AT -3165453056,3165453311,US -3165453312,3165453567,PE -3165453568,3165453823,US -3165453824,3165454079,RO -3165454080,3165454335,AE -3165454336,3165519871,RO -3165519872,3165585407,DE -3165585408,3165650943,CZ -3165650944,3166175231,DK -3166175232,3166306303,CH -3166306304,3166437375,RU -3166437376,3166568447,BE -3166568448,3166601215,UA -3166601216,3166609407,RU -3166609408,3166633983,UA -3166633984,3166638079,RU -3166638080,3166646271,UA -3166646272,3166650367,CZ -3166650368,3166654463,UA -3166654464,3166658559,RU -3166658560,3166662655,UA -3166662656,3166666751,RU -3166666752,3166667263,PL -3166667264,3166667775,CZ -3166667776,3166670847,GB -3166670848,3166672895,UA -3166672896,3166674943,GB -3166674944,3166679039,RU -3166679040,3166681087,IR -3166681088,3166685183,RU -3166685184,3166687231,PL -3166687232,3166689279,MD -3166689280,3166691327,PL -3166691328,3166693375,RU -3166693376,3166695423,UA -3166695424,3166697471,RU -3166697472,3166699519,RO -3166699520,3166961663,DE -3166961664,3167223807,SI -3167223808,3167694591,NL -3167694592,3167694847,GB -3167694848,3167748095,NL -3167748096,3167752191,ES -3167752192,3167752959,RO -3167752960,3167753215,IT -3167753216,3167755263,ES -3167755264,3167757311,RO -3167757312,3167757823,BE -3167757824,3167758335,GB -3167758336,3167758463,NL -3167758464,3167760383,ES -3167760384,3167762431,GB -3167762432,3167772671,IR -3167772672,3167773695,MD -3167773696,3167773951,ES -3167773952,3167774207,RO -3167774208,3167774335,KR -3167774336,3167774463,PH -3167774464,3167774719,RO -3167774720,3167775743,MD -3167775744,3167775999,RO -3167776000,3167776255,GB -3167776256,3167776511,RO -3167776512,3167776767,GB -3167776768,3167777791,MD -3167777792,3167778815,RO -3167778816,3167780863,MD -3167780864,3167783935,RO -3167783936,3167784447,ES -3167784448,3167784703,CA -3167784704,3167784959,PT -3167784960,3167797247,IR -3167797248,3167798271,MD -3167798272,3167798783,RO -3167798784,3167799295,FR -3167799296,3167800319,IR -3167800320,3167801343,MD -3167801344,3167803391,IR -3167803392,3167803903,PL -3167803904,3167804415,ES -3167804416,3167805439,GB -3167805440,3167825919,IR -3167825920,3167830015,NL -3167830016,3167834111,IR -3167834112,3167838207,IT -3167838208,3167842303,RO -3167842304,3167843327,ES -3167843328,3167844351,IR -3167844352,3167846399,GB -3167846400,3167866879,IR -3167866880,3167867903,SY -3167867904,3167868927,RO -3167868928,3167879167,MD -3167879168,3167895551,DE -3167895552,3167901695,IR -3167901696,3167902719,RO -3167902720,3167902975,BE -3167902976,3167903231,NL -3167903232,3167903743,DE -3167903744,3167932415,IR -3167932416,3167933439,CH -3167933440,3167933695,RO -3167933696,3167933951,DE -3167933952,3167934207,US -3167934208,3167934463,RO -3167934464,3167935487,ES -3167935488,3167936511,PL -3167936512,3167938559,RO -3167938560,3167939583,IR -3167939584,3167940351,RO -3167940352,3167940607,IT -3167940608,3167943679,MD -3167943680,3167944191,GB -3167944192,3167944447,RO -3167944448,3167944703,GB -3167944704,3167948799,IR -3167948800,3167951359,RO -3167951360,3167951487,IN -3167951488,3167951615,KR -3167951616,3167952895,RO -3167952896,3167985663,IR -3167985664,3167985919,US -3167985920,3167986431,RO -3167986432,3167986687,UA -3167986688,3167987711,RO -3167987712,3167987967,NL -3167987968,3167988223,IE -3167988224,3167988735,BE -3167988736,3167989759,MD -3167989760,3168002047,IR -3168002048,3168003071,RO -3168003072,3168004095,ES -3168004096,3168005887,RO -3168005888,3168006143,NL -3168006144,3168008191,SE -3168008192,3168008447,RO -3168008448,3168010239,US -3168010240,3168011263,MD -3168011264,3168011519,IE -3168011520,3168011775,RO -3168011776,3168012287,IR -3168012288,3168014335,MD -3168014336,3168015359,ES -3168015360,3168015615,BE -3168015616,3168015871,RO -3168015872,3168016127,US -3168016128,3168016383,GB -3168016384,3168018431,MD -3168018432,3168018687,TR -3168018688,3168018943,RO -3168018944,3168019455,GB -3168019456,3168020479,RO -3168020480,3168022527,MD -3168022528,3168035839,IR -3168035840,3168036863,RO -3168036864,3168037887,US -3168037888,3168038399,SE -3168038400,3168038911,RO -3168038912,3168039935,MD -3168039936,3168040959,BE -3168040960,3168041215,DE -3168041216,3168044799,RO -3168044800,3168045055,US -3168045056,3168047103,RO -3168047104,3168049151,IR -3168049152,3168049407,RO -3168049408,3168049663,IT -3168049664,3168050431,RO -3168050432,3168050687,MD -3168050688,3168051199,RO -3168051200,3168059391,IR -3168059392,3168061439,RO -3168061440,3168073727,IR -3168073728,3168075263,RO -3168075264,3168075519,GB -3168075520,3168076799,RO -3168076800,3168079871,ES -3168079872,3168081919,RO -3168081920,3168083967,FR -3168083968,3168084991,RO -3168084992,3168086015,MD -3168086016,3168088063,IT -3168088064,3168089087,RO -3168089088,3168090111,MD -3168090112,3168092159,ES -3168092160,3168096255,IR -3168096256,3168097279,ES -3168097280,3168100351,MD -3168100352,3168108543,IR -3168108544,3168110335,RO -3168110336,3168110591,GB -3168110592,3168110847,IT -3168110848,3168111359,RO -3168111360,3168111615,IT -3168111616,3168112639,FR -3168112640,3168116735,IR -3168116736,3168120831,IT -3168120832,3168126975,IR -3168126976,3168127999,RO -3168128000,3168128255,GB -3168128256,3168128511,RO -3168128512,3168129023,GB -3168129024,3168130047,IR -3168130048,3168130559,RO -3168130560,3168131071,GB -3168131072,3168131583,RO -3168131584,3168131711,IN -3168131712,3168131839,CN -3168131840,3168132095,RO -3168132096,3168133119,MD -3168133120,3168135167,NL -3168135168,3168135679,RO -3168135680,3168136191,CZ -3168136192,3168137215,MD -3168137216,3168137471,RO -3168137472,3168137727,FR -3168137728,3168137983,RO -3168137984,3168138239,NL -3168138240,3168139263,MD -3168139264,3168141311,GB -3168141312,3168142335,IT -3168142336,3168143615,RO -3168143616,3168143871,UA -3168143872,3168144383,RO -3168144384,3168144639,SG -3168144640,3168145151,RO -3168145152,3168145407,UA -3168145408,3168147455,RO -3168147456,3168147967,FR -3168147968,3168151551,RO -3168151552,3168153599,US -3168153600,3168154111,RO -3168154112,3168154367,SG -3168154368,3168155135,RO -3168155136,3168155391,IT -3168155392,3168156415,RO -3168156416,3168156671,ES -3168156672,3168157695,MD -3168157696,3168161791,IR -3168161792,3168162303,RO -3168162304,3168162815,IT -3168162816,3168163839,IR -3168163840,3168164351,RO -3168164352,3168164863,GB -3168164864,3168165119,RO -3168165120,3168165375,DE -3168165376,3168165887,GB -3168165888,3168166911,IR -3168166912,3168167935,FR -3168167936,3168169983,RO -3168169984,3168172031,ES -3168172032,3168172543,IR -3168172544,3168174079,RO -3168174080,3168176127,LT -3168176128,3168177151,MD -3168177152,3168178175,RO -3168178176,3168179199,MD -3168179200,3168182271,RO -3168182272,3168190463,IR -3168190464,3168191999,RO -3168192000,3168192255,GB -3168192256,3168192511,RO -3168192512,3168194559,MD -3168194560,3168196607,RO -3168196608,3168198655,IR -3168198656,3168199167,ES -3168199168,3168199679,RO -3168199680,3168200703,MD -3168200704,3168202751,IR -3168202752,3168203775,ES -3168203776,3168207103,RO -3168207104,3168207359,NL -3168207360,3168208895,RO -3168208896,3168209919,ES -3168209920,3168211455,RO -3168211456,3168211967,CZ -3168211968,3168212223,NL -3168212224,3168212479,US -3168212480,3168212735,RO -3168212736,3168212991,FR -3168212992,3168214015,IR -3168214016,3168214527,GB -3168214528,3168214783,BG -3168214784,3168215295,RO -3168215296,3168215551,GB -3168215552,3168215807,TH -3168215808,3168216063,GB -3168216064,3168216575,RO -3168216576,3168216831,GB -3168216832,3168218111,RO -3168218112,3168219135,IT -3168219136,3168221183,RO -3168221184,3168223231,ES -3168223232,3168223743,RO -3168223744,3168223999,IE -3168224000,3168224255,NL -3168224256,3168227327,RO -3168227328,3168229375,ES -3168229376,3168230399,IR -3168230400,3168230655,GB -3168230656,3168232447,RO -3168232448,3168233471,SY -3168233472,3168235519,ES -3168235520,3168237567,RO -3168237568,3168239615,PS -3168239616,3168243711,IR -3168243712,3168247807,RO -3168247808,3168264191,IR -3168264192,3168265215,ES -3168265216,3168265471,RS -3168265472,3168265727,NL -3168265728,3168265855,FR -3168265856,3168265983,BE -3168265984,3168266239,GR -3168266240,3168267263,RO -3168267264,3168268287,MD -3168268288,3168269311,IR -3168269312,3168270079,RO -3168270080,3168270591,IT -3168270592,3168270847,IE -3168270848,3168271359,RO -3168271360,3168272383,MD -3168272384,3168534527,IT -3168534528,3168796671,GB -3168796672,3168829439,FR -3168829440,3168862207,SA -3168862208,3168872191,RU -3168872192,3168872447,UA -3168872448,3168894975,RU -3168894976,3168927743,PS -3168927744,3168960511,RU -3168960512,3168993279,NL -3168993280,3169026047,RU -3169026048,3169034239,CZ -3169034240,3169042431,GB -3169044480,3169046527,NL -3169046528,3169050623,AZ -3169050624,3169052671,HU -3169052672,3169054719,PS -3169054720,3169056767,GB -3169056768,3169058815,EE -3169058816,3169091583,DK -3169091584,3169124351,IT -3169124352,3169157119,RO -3169157120,3169189887,SY -3169189888,3169222655,UA -3169222656,3169255423,SI -3169255424,3169275903,KW -3169275904,3169277951,CY -3169277952,3169278991,KW -3169278992,3169279007,SA -3169279008,3169279231,KW -3169279232,3169279239,IQ -3169279240,3169279255,SA -3169279256,3169279263,KW -3169279264,3169279295,SA -3169279296,3169279303,KW -3169279304,3169279311,SA -3169279312,3169279319,SD -3169279320,3169279487,GB -3169279488,3169279743,CY -3169279744,3169279759,IQ -3169279760,3169279871,KW -3169279872,3169285119,GB -3169285120,3169285631,KW -3169285632,3169286143,GB -3169286144,3169288191,KW -3169288192,3169320959,UA -3169320960,3169583103,RU -3169583104,3169648639,KW -3169648640,3169714175,MD -3169714176,3169779711,FI -3169779712,3169828607,UA -3169828608,3169828863,CZ -3169828864,3169845247,UA -3169845248,3169845503,RO -3169845504,3169845759,CZ -3169845760,3169849087,RO -3169849088,3169849343,FR -3169849344,3169849855,RO -3169849856,3169850367,SE -3169850368,3169851391,RO -3169851392,3169853439,NL -3169853440,3169854463,AU -3169854464,3169855487,ES -3169855488,3169855999,US -3169856000,3169856511,RO -3169856512,3169857023,IT -3169857024,3169862911,RO -3169862912,3169863167,IT -3169863168,3169863423,MD -3169863424,3169863679,RO -3169863680,3169863935,ES -3169863936,3169864191,NL -3169864192,3169864447,FR -3169864448,3169864703,IE -3169864704,3169866495,RO -3169866496,3169866751,GB -3169866752,3169867775,RO -3169867776,3169868031,GB -3169868032,3169869823,RO -3169869824,3169878015,MD -3169878016,3169882111,ES -3169882112,3169886207,SE -3169886208,3169894399,GB -3169894400,3169895423,ES -3169895424,3169895679,IR -3169895680,3169896447,RO -3169896448,3169896959,BG -3169896960,3169897471,RO -3169897472,3169898495,ES -3169898496,3169899263,RO -3169899264,3169899391,CN -3169899392,3169899519,TW -3169899520,3169899775,IR -3169899776,3169902079,RO -3169902080,3169902591,SE -3169902592,3169905151,RO -3169905152,3169905407,ES -3169905408,3169905663,RO -3169905664,3169906687,ES -3169906688,3169908735,RO -3169908736,3169910783,IR -3169910784,3169911807,RO -3169911808,3169912319,IT -3169912320,3169913855,RO -3169913856,3169914111,GB -3169914112,3169916927,RO -3169916928,3169918975,PL -3169918976,3169920767,RO -3169920768,3169923071,GB -3169923072,3169926143,RO -3169926144,3169927167,ES -3169927168,3169927423,RO -3169927424,3169927679,NL -3169927680,3169928191,RO -3169928192,3169928447,SE -3169928448,3169935359,RO -3169935360,3169937407,ES -3169937408,3169946623,RO -3169946624,3169947135,IT -3169947136,3169950207,RO -3169950208,3169950463,IT -3169950464,3169951743,RO -3169951744,3169955839,SE -3169955840,3169959423,RO -3169959424,3169959935,IT -3169959936,3169960191,RO -3169960192,3169960447,NL -3169960448,3169961471,RO -3169961472,3169961983,SE -3169961984,3169964799,RO -3169964800,3169965055,GB -3169965056,3169976319,RO -3169976320,3170111487,RU -3170111488,3170115583,MD -3170115584,3170119679,RU -3170119680,3170123775,CZ -3170123776,3170127871,DK -3170127872,3170131967,ES -3170136064,3170140159,GB -3170140160,3170172927,RU -3170172928,3170238463,IR -3170238464,3170246655,DE -3170246656,3170252799,RS -3170252800,3170253823,XK -3170253824,3170254847,RS -3170254848,3170263039,BA -3170263040,3170271231,CZ -3170271232,3170279423,PL -3170279424,3170287615,RU -3170287616,3170295807,GB -3170295808,3170303999,RU -3170304000,3170312191,SY -3170312192,3170320383,RU -3170320384,3170327593,JO -3170327594,3170327594,US -3170327595,3170328575,JO -3170328576,3170336767,UA -3170336768,3170338815,RO -3170338816,3170344959,ES -3170344960,3170347007,RO -3170347008,3170349055,ES -3170349056,3170361343,KZ -3170361344,3170369535,RO -3170369536,3170500607,SA -3170500608,3170631679,PT -3170631680,3170664447,PL -3170664448,3170697215,HR -3170697216,3170729983,IR -3170729984,3170762751,AZ -3170762752,3170795519,RU -3170795520,3170828287,BG -3170828288,3170861055,RU -3170861056,3170893823,RS -3170893824,3179105023,BR -3179105024,3179105279,US -3179105280,3179282431,BR -3179282432,3184116735,MX -3184116736,3184123903,BR -3184123904,3184125951,MX -3184125952,3184127999,BR -3184128000,3187671039,MX -3187671040,3187687423,CO -3187687424,3187695615,DO -3187695616,3187703807,AR -3187703808,3187711999,UY -3187712000,3187720191,AR -3187720192,3187728383,GT -3187728384,3187730431,CR -3187730432,3187732479,AR -3187732480,3187734527,CO -3187734528,3187736575,BO -3187736576,3187752959,AR -3187752960,3187761151,CO -3187761152,3187769343,AR -3187769344,3187802111,CO -3187802112,3187818495,AR -3187820544,3187822591,BR -3187822592,3187824639,AR -3187824640,3187826687,CL -3187826688,3187834879,AR -3187834880,3187843071,CW -3187843072,3187846143,AW -3187846144,3187851263,CW -3187851264,3187855359,PY -3187855360,3187857407,PA -3187857408,3187859455,CR -3187859456,3187863551,PA -3187863552,3187908607,AR -3187910656,3187913727,CL -3187913728,3187913815,PT -3187913816,3187913823,CL -3187913824,3187913983,PT -3187913984,3187914751,CL -3187914752,3187916799,BO -3187916800,3187933183,CO -3187933184,3187933341,GT -3187933342,3187933342,HN -3187933343,3187934079,GT -3187934080,3187934207,HN -3187934208,3187935543,GT -3187935544,3187935551,HN -3187935552,3187936591,GT -3187936592,3187936595,HN -3187936596,3187940571,GT -3187940572,3187940575,HN -3187940576,3187940631,GT -3187940632,3187940639,HN -3187940640,3187940823,GT -3187940824,3187940831,HN -3187940832,3187941647,GT -3187941648,3187941655,HN -3187941656,3187941711,GT -3187941712,3187941715,HN -3187941716,3187942271,GT -3187942272,3187942279,HN -3187942280,3187942563,GT -3187942564,3187942567,HN -3187942568,3187942655,GT -3187942656,3187942663,HN -3187942664,3187942975,GT -3187942976,3187942991,HN -3187942992,3187943391,GT -3187943392,3187943399,HN -3187943400,3187943551,GT -3187943552,3187943687,HN -3187943688,3187943715,GT -3187943716,3187943716,HN -3187943717,3187944351,GT -3187944352,3187944359,HN -3187944360,3187944773,GT -3187944774,3187944774,HN -3187944775,3187944855,GT -3187944856,3187944859,HN -3187944860,3187945343,GT -3187945344,3187945471,HN -3187945472,3187946687,GT -3187946688,3187946695,HN -3187946696,3187946735,GT -3187946736,3187946743,HN -3187946744,3187946887,GT -3187946888,3187946895,HN -3187946896,3187946975,GT -3187946976,3187946979,HN -3187946980,3187947999,GT -3187948000,3187948159,HN -3187948160,3187948367,GT -3187948368,3187948375,HN -3187948376,3187948799,GT -3187948800,3187948927,HN -3187948928,3187949115,GT -3187949116,3187949119,HN -3187949120,3187949567,GT -3187949568,3187949816,BQ -3187949817,3187949817,US -3187949818,3187950126,BQ -3187950127,3187950127,CW -3187950128,3187953663,BQ -3187953664,3187955711,CL -3187955712,3187957759,CR -3187957760,3187961855,CL -3187961856,3187965951,AR -3187965952,3187982335,CW -3187982336,3187998719,CL -3187998720,3188006911,AR -3188006912,3188015103,CL -3188015104,3188031487,HN -3188031488,3188039679,SV -3188039680,3188047871,AR -3188047872,3188051967,CO -3188051968,3188054015,CR -3188054016,3188056063,AR -3188056064,3188064255,PA -3188064256,3188080639,VE -3188080640,3188088831,CU -3188088832,3188094975,AR -3188094976,3188097023,CL -3188097024,3188105215,DO -3188105216,3188113407,CO -3188113408,3188117503,HN -3188117504,3188121599,AR -3188121600,3188125695,TT -3188125696,3188146175,AR -3188146176,3188147623,CO -3188147624,3188147631,PE -3188147632,3188148911,CO -3188148912,3188148915,PE -3188148916,3188149335,CO -3188149336,3188149339,PE -3188149340,3188151423,CO -3188151424,3188151439,PE -3188151440,3188152171,CO -3188152172,3188152175,PE -3188152176,3188153015,CO -3188153016,3188153023,EC -3188153024,3188154139,CO -3188154140,3188154143,CL -3188154144,3188170751,CO -3188170752,3188174847,CR -3188174848,3188178943,BR -3188178944,3188187135,CR -3188187136,3188203519,AR -3188203520,3188207615,DO -3188207616,3188211711,AR -3188211712,3188228095,CL -3188228096,3188236287,PE -3188237312,3188239359,VE -3188239360,3188240383,PE -3188240384,3188241407,CO -3188241408,3188242431,EC -3188242432,3188244479,AR -3188244480,3188248575,CO -3188248576,3188248703,CL -3188248704,3188260863,CO -3188260864,3188269055,AR -3188269056,3188275199,PA -3188275200,3188277247,CL -3188277248,3188293631,CO -3188293632,3188301823,VE -3188301824,3188310015,EC -3188310016,3188326399,CO -3188326400,3188359167,CR -3188359168,3188400127,EC -3188400128,3188408319,AR -3188408320,3188409599,BO -3188409600,3188409855,US -3188409856,3188416511,BO -3188416512,3188445183,AR -3188449280,3188453375,HN -3188453376,3188473855,EC -3188473856,3188482047,PE -3188482048,3188490239,AR -3188490240,3188498431,CO -3188498432,3188511103,AR -3188511104,3188511231,US -3188511232,3188523007,AR -3188523008,3188539391,CO -3188539392,3188542207,CL -3188542208,3188542463,US -3188542464,3188543487,CL -3188543488,3188545535,PA -3188545536,3188547583,AR -3188547584,3188551679,CO -3188551680,3188552703,AR -3188552704,3188553727,CL -3188553728,3188555775,CW -3188555776,3188572159,CL -3188572160,3188576255,CO -3188576256,3188597759,AR -3188597760,3188598783,PA -3188598784,3188600831,AR -3188600832,3188604927,CL -3188604928,3188621311,BO -3188621312,3188625407,GT -3188625408,3188627455,AR -3188627456,3188628479,CR -3188628480,3188637695,AR -3188637696,3188645887,PA -3188645888,3188662271,CO -3188662272,3188670463,BR -3188670464,3188671487,KY -3188671488,3188672511,BS -3188672512,3188674559,HN -3188674560,3188678655,AR -3188678656,3188686847,BR -3188686848,3188690943,EC -3188690944,3188695039,CU -3188695040,3188697087,EC -3188697088,3188703231,VE -3188703232,3188981759,AR -3188981760,3189178367,CL -3189178368,3189243903,PY -3189243904,3189637119,CO -3189637120,3189768191,AR -3189768192,3190030335,PA -3190030336,3190292479,VE -3190292480,3190554623,PE -3190554624,3190816767,CL -3190816768,3191078911,AR -3191078912,3191087103,CO -3191087104,3191091199,AR -3191091200,3191093247,BO -3191093248,3191095295,AR -3191095296,3191099391,EC -3191099392,3191103487,AR -3191103488,3191107583,VE -3191107584,3191108271,PE -3191108272,3191108287,MX -3191108288,3191108959,PE -3191108960,3191108991,CO -3191108992,3191109119,PE -3191109120,3191111167,MX -3191111168,3191111679,PE -3191111680,3191128063,PY -3191128064,3191132159,EC -3191132160,3191136255,AR -3191136256,3191144447,DO -3191144448,3191152639,SV -3191152640,3191155711,NI -3191155712,3191156223,SV -3191156224,3191156735,NI -3191156736,3191169023,HN -3191169024,3191193599,SV -3191193600,3191209983,HN -3191209984,3191275519,CL -3191275520,3191341055,AR -3191341056,3191406591,GT -3191406592,3191439359,SV -3191439360,3191455743,EC -3191455744,3191472127,AR -3191472128,3191603199,TT -3191603200,3191603455,CO -3191603456,3191603519,GT -3191603520,3191603647,CO -3191603648,3191603711,SV -3191603712,3191607295,CO -3191607296,3191607551,MX -3191607552,3191610111,CO -3191610112,3191610367,PE -3191610368,3191610879,CO -3191610880,3191611135,PE -3191611136,3191611391,CO -3191611392,3191619583,VE -3191619584,3191619903,CO -3191619904,3191619935,VE -3191619936,3191635967,CO -3191635968,3191652351,AR -3191652352,3191670783,CO -3191670784,3191672831,CL -3191672832,3191673281,CO -3191673282,3191673282,EC -3191673283,3191673343,CO -3191673344,3191674879,CL -3191674880,3191693311,CO -3191693312,3191701503,AR -3191701504,3191709695,CO -3191709696,3191709951,BR -3191709952,3191714815,CO -3191714816,3191715071,AR -3191715072,3191719935,CO -3191719936,3191720015,AR -3191720016,3191720959,CO -3191720960,3191721471,AR -3191721472,3191721983,CO -3191721984,3191722495,AR -3191722496,3191724799,CO -3191724800,3191725311,AR -3191725312,3191732735,CO -3191732736,3191732991,AR -3191732992,3191734271,CO -3191734272,3191799807,SV -3191799808,3191865343,EC -3191865344,3191930879,UY -3191930880,3192389631,CO -3192389632,3192913919,VE -3192913920,3192946687,GY -3192946688,3192979455,DO -3192979456,3193044991,PE -3193044992,3193110527,CL -3193143296,3193176063,TT -3193176064,3193307135,CO -3193307136,3193438207,SV -3193438208,3193503743,CW -3193569280,3193575167,CO -3193575168,3193575295,PE -3193575296,3193575311,CO -3193575312,3193575327,PE -3193575328,3193579263,CO -3193579264,3193579391,EC -3193579392,3193582847,CO -3193582848,3193583103,EC -3193583104,3193590527,CO -3193590528,3193590783,EC -3193590784,3193591807,CO -3193591808,3193592063,EC -3193592064,3193592319,CO -3193592320,3193592575,EC -3193592576,3193595391,CO -3193595392,3193595647,EC -3193595648,3193599743,CO -3193599744,3193599999,EC -3193600000,3193604351,CO -3193604352,3193604607,EC -3193604608,3193606527,CO -3193606528,3193606911,EC -3193606912,3193617151,CO -3193617152,3193617407,EC -3193617408,3193618431,CO -3193618432,3193618559,US -3193618560,3193618943,CO -3193618944,3193619071,EC -3193619072,3193621887,CO -3193621888,3193622271,EC -3193622272,3193622943,CO -3193622944,3193622975,EC -3193622976,3193623039,CO -3193623040,3193623551,EC -3193623552,3193624063,CO -3193624064,3193624575,EC -3193624576,3193625599,CO -3193625600,3193625855,EC -3193625856,3193626623,US -3193626624,3193628671,CO -3193628672,3193628927,EC -3193628928,3193631103,CO -3193631104,3193631231,EC -3193631232,3193634687,CO -3193634688,3193634815,EC -3193634816,3193700351,CL -3193700352,3193724927,HN -3193724928,3193729023,AR -3193729024,3193733119,CU -3193733120,3193735679,AR -3193735680,3193735935,US -3193735936,3193736447,AR -3193736448,3193736959,US -3193736960,3193738239,AR -3193738240,3193739007,US -3193739008,3193739519,AR -3193739520,3193739775,US -3193739776,3193740287,AR -3193740288,3193741055,US -3193741056,3193741311,AR -3193741312,3193741823,US -3193741824,3193743871,AR -3193743872,3193743999,US -3193744000,3193744895,AR -3193744896,3193745151,US -3193745152,3193745279,AR -3193745280,3193745407,US -3193745408,3193749503,AR -3193749504,3193749759,US -3193749760,3193750527,AR -3193750528,3193750783,US -3193750784,3193751295,AR -3193751296,3193751551,US -3193751552,3193752063,AR -3193752064,3193752575,US -3193752576,3193754111,AR -3193754112,3193754239,US -3193754240,3193755007,AR -3193755008,3193755135,US -3193755136,3193765887,AR -3193765888,3193774079,TT -3193775104,3193776127,GY -3193776128,3193777151,AR -3193777152,3193778175,VE -3193778176,3193782271,AR -3193782272,3193798655,TT -3193798656,3193806847,CO -3193806848,3193808895,CR -3193808896,3193809663,US -3193809664,3193810943,CR -3193810944,3193811967,PY -3193815040,3193823231,AR -3193823232,3193827327,CL -3193827328,3193828351,CR -3193829376,3193831423,CR -3193831424,3193864191,DO -3193864192,3193872383,EC -3193872384,3193880575,AR -3193880576,3193896959,VE -3193896960,3193929727,CL -3193929728,3193962495,EC -3193962496,3193987071,CL -3193987072,3193991167,EC -3193991168,3193995263,AR -3193995264,3194028031,CO -3194028032,3194044415,AR -3194044416,3194052607,CO -3194052608,3194056703,TT -3194056704,3194058751,BQ -3194058752,3194060799,AR -3194060800,3194068991,CO -3194068992,3194071039,PA -3194071040,3194072063,CL -3194073088,3194077183,HN -3194077184,3194085375,CO -3194085376,3194093567,VE -3194093568,3194126335,SR -3194126336,3194126591,AR -3194126592,3194126847,NL -3194126848,3194126911,AR -3194126912,3194126975,PE -3194126976,3194127231,AR -3194127232,3194127359,BR -3194127360,3194128127,AR -3194128128,3194128383,BR -3194128384,3194129407,NI -3194129408,3194129663,AR -3194129664,3194129671,BR -3194129672,3194129919,AR -3194129920,3194130047,BR -3194130048,3194130175,CO -3194130176,3194130303,CL -3194130304,3194130431,BR -3194130432,3194130943,AR -3194130944,3194131455,BR -3194131456,3194132991,AR -3194132992,3194133247,CL -3194133248,3194135551,AR -3194135552,3194136063,BR -3194136064,3194136319,AR -3194136320,3194136447,CO -3194136448,3194136575,AR -3194136576,3194137087,BR -3194137088,3194139647,AR -3194139648,3194140159,BR -3194140160,3194142719,CR -3194142720,3194159103,CL -3194159104,3194165247,HN -3194165248,3194175487,SV -3194175488,3194177535,AR -3194177536,3194179583,EC -3194179584,3194181631,AR -3194181632,3194182655,CL -3194182656,3194183679,BO -3194183680,3194187775,UY -3194187776,3194188799,AR -3194188800,3194189823,GT -3194189824,3194191871,CR -3194191872,3194224639,CO -3194224640,3194355711,CL -3194355712,3194363903,SX -3194363904,3194367999,CR -3194368000,3194370047,BO -3194370048,3194372095,PA -3194372096,3194380287,HT -3194380288,3194381311,US -3194381312,3194382335,CA -3194382336,3194388479,US -3194388480,3194396671,PE -3194396672,3194413055,CO -3194413056,3194421247,CL -3194421248,3194428415,AR -3194428416,3194437631,VE -3194437632,3194441727,BO -3194441728,3194445823,AR -3194445824,3194448687,CO -3194448688,3194448695,CL -3194448696,3194449031,CO -3194449032,3194449047,CL -3194449048,3194449175,CO -3194449176,3194449183,PE -3194449184,3194450263,CO -3194450264,3194450271,CL -3194450272,3194451415,CO -3194451416,3194451423,EC -3194451424,3194452375,CO -3194452376,3194452383,PE -3194452384,3194454015,CO -3194454016,3194458111,AR -3194458112,3194462207,CL -3194462208,3194466303,BR -3194466304,3194467327,AR -3194467328,3194468351,DO -3194468352,3194469375,US -3194469376,3194470399,CR -3194470400,3194486783,AR -3194486784,3194494975,BO -3194494976,3194511359,AR -3194511360,3194515455,AW -3194515456,3194519551,GT -3194519552,3194535935,PY -3194535936,3194585087,AR -3194585088,3194589183,HN -3194589184,3194591231,AR -3194591232,3194592255,PA -3194592256,3194593279,GY -3194593280,3194595327,AR -3194595328,3194596351,PA -3194596352,3194597375,HT -3194597376,3194601471,AR -3194601472,3194602495,CW -3194602496,3194610943,AR -3194610944,3194611199,CO -3194611200,3194613503,AR -3194613504,3194613759,CL -3194613760,3194617855,PE -3194617856,3194626047,NI -3194626048,3194630143,AR -3194630144,3194634239,NI -3194634240,3194638335,CR -3194638336,3194640383,AR -3194640384,3194642431,BZ -3194642432,3194646527,AR -3194646528,3194648575,DO -3194648576,3194667007,AR -3194667008,3194675199,GT -3194679296,3194683391,BO -3194683392,3194687487,CU -3194687488,3194691583,CO -3194691584,3194699775,BO -3194699776,3194705919,EC -3194705920,3194707967,CR -3194707968,3194716159,AR -3194716160,3194724351,HN -3194728448,3194729471,CL -3194729472,3194730495,PE -3194730496,3194732543,AR -3194732544,3194736639,BR -3194736640,3194737663,NI -3194737664,3194740735,AR -3194740736,3194742783,CL -3194742784,3194744831,EC -3194744832,3194746879,AR -3194746880,3194748927,BQ -3194748928,3194757119,UY -3194757120,3194765311,AR -3194765312,3194767359,EC -3194767360,3194768383,CR -3194768384,3194769407,AR -3194769408,3194771583,PE -3194771584,3194771591,US -3194771592,3194773503,PE -3194773504,3194781695,BR -3194781696,3194798079,CL -3194798080,3194799103,AR -3194799104,3194804223,GY -3194804224,3194805247,AR -3194805248,3194806271,CR -3194806272,3194814463,AR -3194814464,3194822655,CO -3194822656,3194830847,AR -3194830848,3194838015,BR -3194838016,3194839039,MX -3194839040,3194863615,CO -3194863616,3194871807,HN -3194871808,3194879999,BO -3194880000,3194896383,DO -3194896384,3194904575,CO -3194904576,3194908671,CL -3194908672,3194910719,AR -3194910720,3194925055,CL -3194925056,3194929151,AR -3194929152,3194937343,EC -3194937344,3194945535,AR -3194945536,3194953471,GT -3194953472,3194953599,NI -3194953600,3194953727,GT -3194953728,3194961407,AR -3194961408,3194961663,US -3194961664,3194961919,AR -3194961920,3194970111,EC -3194974208,3194976255,AR -3194976256,3194977279,VE -3194977280,3194978303,AR -3194994688,3195023359,AR -3195023360,3195024383,CL -3195024384,3195025407,UY -3195025408,3195043839,AR -3195056128,3195060223,AR -3195060224,3195061247,US -3195061248,3195062271,AR -3195062272,3195062783,US -3195062784,3195063039,UY -3195063040,3195063295,US -3195063296,3195064319,BR -3195064320,3195066367,PY -3195066368,3195067391,AR -3195067392,3195068415,CR -3195068416,3195076607,CW -3195076608,3195084799,CL -3195084800,3195092991,NI -3195092992,3195097087,DO -3195097088,3195099135,CR -3195099136,3195100159,GT -3195100160,3195101183,PY -3195101184,3195109375,CR -3195109376,3195125759,AR -3195125760,3195133951,PE -3195133952,3195138047,AR -3195138048,3195139071,DO -3195139072,3195140095,CL -3195140096,3195142143,CR -3195142144,3195142655,PA -3195142656,3195142911,VE -3195142912,3195143039,EC -3195143040,3195143167,UY -3195143168,3195143295,GT -3195143296,3195143679,PA -3195143680,3195143935,AR -3195143936,3195144447,PA -3195144448,3195144703,CR -3195144704,3195150335,PA -3195150336,3195158527,CL -3195158528,3195199487,AR -3195199488,3195201535,PY -3195201536,3195203583,AR -3195203584,3195205631,VE -3195205632,3195206655,PE -3195206656,3195207679,CL -3195207680,3195209687,GT -3195209688,3195209695,PR -3195209696,3195211775,GT -3195211776,3195214847,BZ -3195214848,3195215103,RU -3195215104,3195215871,BZ -3195215872,3195224063,AR -3195232256,3195236351,CR -3195236352,3195240447,AR -3195240448,3195256831,HT -3195256832,3195265023,AR -3195265024,3195273215,CO -3195273216,3195535359,PE -3195535360,3195543551,SV -3195547648,3195551743,AR -3195551744,3195559935,EC -3195559936,3195568127,AR -3195568128,3195572223,CO -3195572224,3195576319,AR -3195576320,3195580415,CL -3195580416,3195584511,AR -3195584512,3195592703,HT -3195592704,3195596799,PA -3195596800,3195597823,CR -3195597824,3195598847,AR -3195598848,3195600895,VE -3195600896,3195633663,CL -3195633664,3195641855,CO -3195641856,3195645951,PY -3195645952,3195650047,AR -3195650048,3195654143,GT -3195654144,3195658239,CW -3195658240,3195662335,VE -3195662336,3195666431,CW -3195666432,3195691007,AR -3195691008,3195699199,DO -3195699200,3195707391,AR -3195707392,3195711487,PA -3195711488,3195712511,SV -3195712512,3195713535,AR -3195713536,3195714559,GT -3195714560,3195715583,PA -3195715584,3195721727,AR -3195721728,3195723775,VE -3195723776,3195731967,AR -3195731968,3195736063,EC -3195736064,3195737087,BQ -3195737088,3195738111,CW -3195738112,3195740159,HN -3195740160,3195741055,PA -3195741056,3195741087,HN -3195741088,3195744255,PA -3195744256,3195748351,EC -3195748352,3195752447,CL -3195752448,3195763711,AR -3195763712,3195764735,BO -3195764736,3195768831,CR -3195768832,3195772927,AR -3195772928,3195781119,VE -3195781120,3195782143,BR -3195782144,3195783167,PA -3195783168,3195784191,BR -3195784192,3195785215,PA -3195785216,3195785311,HN -3195785312,3195785343,CA -3195785344,3195785375,HN -3195785376,3195785439,DE -3195785440,3195785735,HN -3195785736,3195785743,GB -3195785744,3195785815,HN -3195785816,3195785823,DE -3195785824,3195786015,HN -3195786016,3195786023,ES -3195786024,3195786191,HN -3195786192,3195786199,US -3195786200,3195786239,HN -3195786240,3195786287,US -3195786288,3195786295,ES -3195786296,3195786479,US -3195786480,3195786487,CA -3195786488,3195786751,US -3195786752,3195787127,HN -3195787128,3195787135,DE -3195787136,3195787215,HN -3195787216,3195787231,US -3195787232,3195787263,HN -3195787264,3195787607,US -3195787608,3195787615,DE -3195787616,3195787775,US -3195787776,3195788159,HN -3195788160,3195788167,CA -3195788168,3195788415,HN -3195788416,3195788423,US -3195788424,3195788919,HN -3195788920,3195788927,CA -3195788928,3195789087,HN -3195789088,3195789119,CA -3195789120,3195789311,HN -3195789312,3195793407,PA -3195793408,3195801599,AR -3195801600,3195803647,HN -3195803648,3195804671,CL -3195804672,3195805695,VE -3195805696,3195807743,NI -3195807744,3195807999,US -3195808000,3195808383,BZ -3195808384,3195808639,US -3195808640,3195808767,BZ -3195808768,3195808895,US -3195808896,3195809407,BZ -3195809408,3195809535,US -3195809536,3195809791,BZ -3195809792,3195811839,PE -3195811840,3195813887,AR -3195813888,3195822079,DO -3195822080,3195830271,CO -3195830272,3195838463,AR -3195838464,3195840511,HN -3195840512,3195842559,AR -3195842560,3195846655,BR -3195846656,3195852799,AR -3195852800,3195853823,SX -3195853824,3195854847,GY -3195854848,3195859967,AR -3195859968,3195862015,CR -3195863040,3196092415,CO -3196092416,3196097113,PY -3196097114,3196097114,IL -3196097115,3196125183,PY -3196125184,3196190719,BO -3196190720,3196207103,HN -3196207104,3196223487,CO -3196223488,3196305407,EC -3196305408,3196317055,CO -3196317056,3196317183,CW -3196317184,3196321791,CO -3196321792,3196583935,UY -3196583936,3196846079,AR -3196846080,3196977151,PA -3196977152,3197042687,VE -3197042688,3197075455,CO -3197075456,3197108223,GT -3197108224,3197370367,CO -3197370368,3197501439,GT -3197501440,3197566975,SV -3197566976,3197599743,CL -3197599744,3197600767,GT -3197600768,3197601791,CR -3197601792,3197612031,AR -3197612032,3197616127,SV -3197616128,3197632511,CO -3197632512,3197698047,EC -3197698048,3197730815,VE -3197730816,3197763583,CL -3197763584,3197894655,EC -3197894656,3198156799,CO -3198156800,3198484479,CL -3198484480,3198550015,CO -3198550016,3198681087,DO -3198681088,3198877695,VE -3198877696,3198894079,CR -3198894080,3198902271,CO -3198902272,3198910463,CR -3198910464,3198926847,CL -3198926848,3198943231,BO -3198943232,3199467519,AR -3199467520,3199500287,BO -3199500288,3199504383,BR -3199504384,3199505407,AR -3199505408,3199506431,BR -3199506432,3199508479,AR -3199508480,3199516671,BR -3199516672,3199533055,CL -3199533056,3199549439,BO -3199549440,3199565823,AR -3199565824,3199582207,NI -3199582208,3199598591,HN -3199598592,3199631359,CO -3199631360,3199729663,AR -3199729664,3199762431,NI -3199762432,3199778815,CO -3199778816,3199779839,AR -3199779840,3199780735,CR -3199780736,3199780863,US -3199780864,3199782911,CO -3199782912,3199784959,AR -3199784960,3199785983,EC -3199785984,3199795199,AR -3199795200,3199811583,CW -3199811584,3199819775,SX -3199819776,3199820799,CR -3199820800,3199822847,AR -3199822848,3199823711,HN -3199823712,3199823719,CL -3199823720,3199827967,HN -3199827968,3199860735,AR -3199860736,3199926271,BO -3199926272,3199991807,PE -3199991808,3200516095,AR -3200516096,3200565247,CL -3200565248,3200569343,HT -3200569344,3200573439,CL -3200573440,3200577535,AR -3200577536,3200578559,BR -3200578560,3200579583,EC -3200579584,3200581631,AR -3200581632,3200614399,BZ -3200614400,3200647167,AR -3200647168,3201302527,VE -3201302528,3201433599,CL -3201433600,3201441791,AR -3201441792,3201442047,US -3201442048,3201499135,AR -3201499136,3201515519,CL -3201515520,3201522687,AR -3201522688,3201531903,CR -3201531904,3201533951,AR -3201533952,3201534975,HN -3201534976,3201535999,CO -3201536000,3201540095,AR -3201540096,3201544191,CL -3201544192,3201548287,DO -3201548288,3201556479,AR -3201556480,3201560575,BO -3201560576,3201561599,PY -3201561600,3201562623,AR -3201562624,3201563647,CL -3201563648,3201563903,CH -3201563904,3201564159,DE -3201564160,3201564415,GB -3201564416,3201564671,NL -3201564672,3201630207,NI -3201630208,3201695743,TT -3201695744,3201761279,EC -3201761280,3201826815,CL -3201826816,3201851391,AR -3201851392,3201855487,EC -3201855488,3201859583,PE -3201859584,3201863679,CO -3201863680,3201865727,CL -3201865728,3201867775,CO -3201867776,3201869831,PE -3201869832,3201870495,AR -3201870496,3201870527,PE -3201870528,3201870815,AR -3201870816,3201870831,PE -3201870832,3201870911,AR -3201870912,3201870959,PE -3201870960,3201870975,AR -3201870976,3201871615,PE -3201871616,3201871695,AR -3201871696,3201871703,PE -3201871704,3201871823,AR -3201871824,3201871839,PE -3201871840,3201871871,AR -3201871872,3201875967,PE -3201875968,3201880063,CO -3201880064,3201884159,EC -3201884160,3201889279,VE -3201889280,3201889535,US -3201889536,3201894399,VE -3201894400,3201904639,AR -3201904640,3201908735,CO -3201908736,3201916927,AR -3201916928,3201917695,CO -3201917696,3201917859,AR -3201917860,3201917863,CO -3201917864,3201917879,AR -3201917880,3201917887,CO -3201917888,3201917951,AR -3201917952,3201920063,CO -3201920064,3201920064,AR -3201920065,3201920068,CO -3201920069,3201920639,AR -3201920640,3201920655,CO -3201920656,3201921279,AR -3201921280,3201921535,CO -3201921536,3201924863,AR -3201924864,3201924991,PA -3201924992,3201925119,AR -3201925120,3201957887,CL -3201957888,3202088959,PA -3202088960,3202127999,AR -3202128000,3202128015,CW -3202128016,3202215167,AR -3202215168,3202215295,PY -3202215296,3202220031,AR -3202220032,3202351103,PE -3202351104,3202875391,AR -3202875392,3203399679,PE -3203399680,3203465215,CO -3203465216,3203530751,CR -3203530752,3203531519,CO -3203531520,3203531775,PA -3203531776,3203532799,CO -3203532800,3203534847,PA -3203534848,3203535871,CO -3203535872,3203536383,PA -3203536384,3203536895,CO -3203536896,3203537919,HN -3203537920,3203538431,GT -3203538432,3203538687,PA -3203538688,3203538943,CO -3203538944,3203539967,BZ -3203539968,3203543551,CO -3203543552,3203544575,GT -3203544576,3203545087,CO -3203545088,3203545599,GT -3203545600,3203547135,CO -3203547136,3203549183,PA -3203549184,3203553279,CO -3203553280,3203553535,CR -3203553536,3203556863,CO -3203556864,3203557119,DO -3203557120,3203561983,CO -3203561984,3203562495,SV -3203562496,3203564543,CO -3203564544,3203564799,DO -3203564800,3203565055,CO -3203565056,3203566079,CR -3203566080,3203566591,CO -3203566592,3203566847,PA -3203566848,3203567103,DO -3203567104,3203568639,CO -3203568640,3203569663,SV -3203569664,3203570303,CO -3203570304,3203570431,SV -3203570432,3203570607,CO -3203570608,3203570623,CR -3203570624,3203571199,CO -3203571200,3203571711,SV -3203571712,3203571967,CO -3203571968,3203572223,SV -3203572224,3203661823,CO -3203661824,3203923967,AR -3203923968,3204448255,CO -3204448256,3208642559,BR -3208642560,3209412607,CO -3209412608,3209413631,US -3209413632,3209691135,CO -3209691136,3210084351,AR -3210084352,3210215423,BR -3210215424,3210739711,CO -3210739712,3210739967,US -3210739968,3210740223,MX -3210740224,3210740479,AR -3210740480,3210740735,US -3210740736,3210742015,BR -3210742016,3210742031,IT -3210742032,3210742047,BR -3210742048,3210742063,CL -3210742064,3210742079,US -3210742080,3210742143,BR -3210742144,3210742527,CL -3210742528,3210742543,KR -3210742544,3210742560,CL -3210742561,3210742561,BR -3210742562,3210742567,CL -3210742568,3210742575,US -3210742576,3210742591,BR -3210742592,3210742783,FR -3210742784,3210743039,CL -3210743040,3210743055,GR -3210743056,3210743079,CL -3210743080,3210743087,US -3210743088,3210743103,CL -3210743104,3210743295,FR -3210743296,3210743551,US -3210743552,3210743567,TH -3210743568,3210743615,BR -3210743616,3210743679,FR -3210743680,3210743807,BR -3210743808,3210744063,US -3210744064,3210744079,TR -3210744080,3210744087,BR -3210744088,3210744095,CL -3210744096,3210744127,BR -3210744128,3210744191,FR -3210744192,3210744255,US -3210744256,3210744319,BR -3210744320,3210744575,US -3210744576,3210744591,BE -3210744592,3210744607,BR -3210744608,3210744703,CL -3210744704,3210744831,US -3210744832,3210744863,NZ -3210744864,3210745087,BR -3210745088,3210745343,US -3210745344,3210745359,RU -3210745360,3210745375,BR -3210745376,3210745407,CL -3210745408,3210745471,BR -3210745472,3210745599,DE -3210745600,3210745855,US -3210745856,3210745871,IT -3210745872,3210745919,BR -3210745920,3210746047,US -3210746048,3210746111,BR -3210746112,3210746367,US -3210746368,3210746383,SE -3210746384,3210746495,BR -3210746496,3210746879,US -3210746880,3210746895,CH -3210746896,3210746943,CL -3210746944,3210747135,BR -3210747136,3210748159,US -3210748160,3210748175,JP -3210748176,3210748191,BR -3210748192,3210748287,CL -3210748288,3210748351,US -3210748352,3210748415,BR -3210748416,3210748671,GB -3210748672,3210748927,CL -3210748928,3210752255,US -3210752256,3210752511,SG -3210752512,3210755839,US -3210755840,3210755855,MY -3210755856,3210756095,BR -3210756096,3210756351,SG -3210756352,3210756607,US -3210756608,3210756863,DE -3210756864,3210757119,RU -3210757120,3210757631,US -3210757632,3210758143,BR -3210758144,3210758911,US -3210758912,3210759167,GH -3210759168,3210764031,US -3210764032,3210764047,IE -3210764048,3210764063,BR -3210764064,3210764095,CL -3210764096,3210764287,BR -3210764288,3210764543,US -3210764544,3210764799,CA -3210764800,3210765055,US -3210765056,3210765071,SE -3210765072,3210765311,BR -3210765312,3210765567,CL -3210765568,3210765823,US -3210765824,3210766079,ES -3210766080,3210766335,CL -3210766336,3210766591,US -3210766592,3210766847,CL -3210766848,3210767103,US -3210767104,3210767359,CL -3210767360,3210768383,US -3210768384,3210768639,NL -3210768640,3210768895,MD -3210768896,3210769151,US -3210769152,3210769407,NL -3210769408,3210770943,US -3210770944,3210771199,AU -3210771200,3210771215,TH -3210771216,3210771263,CL -3210771264,3210771455,BR -3210771456,3210772479,US -3210772480,3210772735,CL -3210772736,3210773247,US -3210773248,3210773503,MY -3210773504,3210773519,PL -3210773520,3210773759,BR -3210773760,3210774271,US -3210774272,3210774287,NO -3210774288,3210774399,BR -3210774400,3210774527,CL -3210774528,3210774783,US -3210774784,3210774799,IT -3210774800,3210774815,BR -3210774816,3210774847,CL -3210774848,3210775039,BR -3210775040,3210775295,US -3210775296,3210775311,CH -3210775312,3210775327,BR -3210775328,3210775551,CL -3210775552,3210775807,US -3210775808,3210775935,CL -3210775936,3210776063,BR -3210776064,3210776191,CL -3210776192,3210776319,BR -3210776320,3210776575,US -3210776576,3210776703,CL -3210776704,3210776831,BR -3210776832,3210777087,MX -3210777088,3210777215,CL -3210777216,3210777343,BR -3210777344,3210777471,CL -3210777472,3210777599,BR -3210777600,3210778367,US -3210778368,3210778623,IE -3210778624,3210781951,US -3210781952,3210782207,IT -3210782208,3210782975,US -3210782976,3210782991,TR -3210782992,3210783039,CL -3210783040,3210783231,BR -3210783232,3210783487,US -3210783488,3210783503,JP -3210783504,3210783551,CL -3210783552,3210783743,BR -3210783744,3210783999,US -3210784000,3210784015,JP -3210784016,3210784063,CL -3210784064,3210784255,BR -3210784256,3210784511,US -3210784512,3210784527,BE -3210784528,3210784575,CL -3210784576,3210784767,BR -3210784768,3210785791,US -3210785792,3210786047,BR -3210786048,3210786063,AU -3210786064,3210786111,CL -3210786112,3210786303,BR -3210786304,3210786559,US -3210786560,3210786575,GR -3210786576,3210786591,BR -3210786592,3210786623,CL -3210786624,3210786687,BR -3210786688,3210786815,CL -3210786816,3210787071,BR -3210787072,3210788351,US -3210788352,3210788607,MX -3210788608,3210788863,US -3210788864,3210789119,HR -3210789120,3210792959,US -3210792960,3210793471,GB -3210793472,3210795007,US -3210795008,3210796031,IL -3210796032,3210798847,US -3210798848,3210799103,ES -3210799104,3210802431,US -3210802432,3210802687,ES -3210802688,3210802943,US -3210802944,3210803039,CL -3210803040,3210803055,AU -3210803056,3210803071,CL -3210803072,3210803087,US -3210803088,3210803199,CL -3210803200,3210803201,US -3210803202,3210803455,BR -3210803456,3210803591,RU -3210803592,3210803592,IL -3210803593,3210803711,RU -3210803712,3210804479,DE -3210804480,3210805247,US -3210805248,3210809343,PA -3210809344,3210810367,VE -3210810368,3210811391,PA -3210811392,3210817535,AR -3210817536,3210821631,PE -3210821632,3210822655,EC -3210822656,3210825727,AR -3210825728,3210827775,BZ -3210827776,3210829823,DO -3210829824,3210830847,AR -3210830848,3210831359,PE -3210831360,3210831871,BR -3210831872,3210832895,DO -3210832896,3210835967,AR -3210835968,3210838015,PY -3210838016,3210868735,AR -3210868736,3210870527,US -3210870528,3210870783,AR -3210870784,3210903551,CO -3210903552,3210919935,PE -3210919936,3210920959,GT -3210920960,3210921983,PA -3210921984,3210924031,CL -3210924032,3210926079,DO -3210926080,3210928127,AR -3210928128,3210936319,NI -3210936320,3211067391,EC -3211067392,3211071487,US -3211071488,3211071743,NL -3211071744,3211071999,DE -3211072000,3211072027,US -3211072028,3211072057,BR -3211072058,3211072127,US -3211072128,3211072255,BR -3211072256,3211072287,US -3211072288,3211072319,NZ -3211072320,3211072511,BR -3211072512,3211073023,NL -3211073024,3211073279,GB -3211073280,3211073535,FR -3211073536,3211074047,US -3211074048,3211074303,CL -3211074304,3211074559,ES -3211074560,3211074815,NL -3211074816,3211075071,US -3211075072,3211075325,DK -3211075326,3211075326,CL -3211075327,3211075327,DK -3211075328,3211075583,NL -3211075584,3211076095,US -3211076096,3211076607,LT -3211076608,3211077631,SG -3211077632,3211079935,US -3211079936,3211080191,NG -3211080192,3211080703,US -3211080704,3211080959,GB -3211080960,3211081215,IQ -3211081216,3211081727,GB -3211081728,3211082239,HK -3211082240,3211082495,BN -3211082496,3211082751,GB -3211082752,3211083007,SG -3211083008,3211083263,US -3211083264,3211083519,BR -3211083520,3211083775,HK -3211083776,3211083791,RU -3211083792,3211083839,CL -3211083840,3211083855,GB -3211083856,3211083903,DE -3211083904,3211084031,FR -3211084032,3211084287,DE -3211084288,3211084303,NL -3211084304,3211084351,CL -3211084352,3211084367,GB -3211084368,3211084383,DE -3211084384,3211084559,CL -3211084560,3211084575,DE -3211084576,3211084671,CL -3211084672,3211084799,BY -3211084800,3211084815,AT -3211084816,3211084863,DE -3211084864,3211084879,GB -3211084880,3211085311,DE -3211085312,3211085327,GB -3211085328,3211085375,CL -3211085376,3211085391,GB -3211085392,3211085407,DE -3211085408,3211085583,CL -3211085584,3211085599,DE -3211085600,3211085695,CL -3211085696,3211085823,GE -3211085824,3211085839,TH -3211085840,3211085887,DE -3211085888,3211085903,GB -3211085904,3211086335,DE -3211086336,3211086351,FR -3211086352,3211086367,DE -3211086368,3211086463,CL -3211086464,3211086591,DE -3211086592,3211086607,CL -3211086608,3211086623,DE -3211086624,3211086847,CL -3211086848,3211086863,PL -3211086864,3211087359,DE -3211087360,3211087375,GB -3211087376,3211087871,DE -3211087872,3211087887,ES -3211087888,3211087999,DE -3211088000,3211088127,US -3211088128,3211088383,DE -3211088384,3211088399,BE -3211088400,3211088895,DE -3211088896,3211088911,DK -3211088912,3211089407,DE -3211089408,3211089423,GB -3211089424,3211089535,DE -3211089536,3211089663,US -3211089664,3211089919,DE -3211089920,3211089935,GB -3211089936,3211090431,DE -3211090432,3211090447,GR -3211090448,3211090943,DE -3211090944,3211090959,TR -3211090960,3211091071,DE -3211091072,3211091199,US -3211091200,3211091455,DE -3211091456,3211091471,FI -3211091472,3211091967,DE -3211091968,3211091983,RU -3211091984,3211092479,DE -3211092480,3211092495,BE -3211092496,3211092607,DE -3211092608,3211092735,US -3211092736,3211092991,DE -3211092992,3211093007,SK -3211093008,3211093503,DE -3211093504,3211093519,HR -3211093520,3211093791,DE -3211093792,3211093807,IN -3211093808,3211094015,DE -3211094016,3211094031,CZ -3211094032,3211094079,DE -3211094080,3211094095,GB -3211094096,3211094143,DE -3211094144,3211094271,US -3211094272,3211094527,DE -3211094528,3211094543,HR -3211094544,3211095039,DE -3211095040,3211095055,ES -3211095056,3211095551,DE -3211095552,3211095567,GB -3211095568,3211095679,DE -3211095680,3211095807,US -3211095808,3211096063,DE -3211096064,3211096079,GB -3211096080,3211097103,DE -3211097104,3211097151,GB -3211097152,3211097215,DE -3211097216,3211097343,GB -3211097344,3211097599,DE -3211097600,3211097855,US -3211097856,3211098111,DE -3211098112,3211098367,US -3211098368,3211098383,CL -3211098384,3211098399,DE -3211098400,3211098623,CL -3211098624,3211098879,DE -3211098880,3211098895,CL -3211098896,3211098911,DE -3211098912,3211099135,CL -3211099136,3211099679,DE -3211099680,3211099711,GB -3211099712,3211099775,DE -3211099776,3211099903,GB -3211099904,3211100159,DE -3211100160,3211101951,US -3211101952,3211102207,SG -3211102208,3211102335,AU -3211102336,3211102463,BR -3211102464,3211102591,AU -3211102592,3211102719,BR -3211102720,3211102847,AU -3211102848,3211102975,BR -3211102976,3211103103,AU -3211103104,3211103231,BR -3211103232,3211104447,AU -3211104448,3211104511,BR -3211104512,3211104703,AU -3211104704,3211104767,BR -3211104768,3211105279,GB -3211105280,3211105791,US -3211105792,3211106303,ES -3211106304,3211109375,US -3211109376,3211109887,DE -3211109888,3211111167,US -3211111168,3211111423,KR -3211111424,3211112447,JP -3211112448,3211112959,US -3211112960,3211113215,CL -3211113216,3211113471,SG -3211113472,3211113727,GB -3211113728,3211113983,LT -3211113984,3211114239,US -3211114240,3211114495,CL -3211114496,3211116031,US -3211116032,3211116287,RU -3211116288,3211118079,US -3211118080,3211118335,VE -3211118336,3211118591,US -3211118592,3211118847,BO -3211118848,3211119103,UY -3211119104,3211120639,US -3211120640,3211121663,AU -3211121664,3211129087,US -3211129088,3211129343,AT -3211129344,3211129599,SG -3211129600,3211129855,NL -3211129856,3211129983,HK -3211129984,3211130111,CL -3211130112,3211130367,US -3211130368,3211130623,GR -3211130624,3211130879,TR -3211130880,3211131391,US -3211131392,3211131903,NL -3211131904,3211132927,SG -3211132928,3211137023,CO -3211137024,3211141119,AR -3211141120,3211142143,CL -3211142144,3211143167,CR -3211143168,3211145215,AR -3211145216,3211147263,NI -3211147264,3211148287,CR -3211148288,3211165695,CO -3211165696,3211165727,HN -3211165728,3211165735,UY -3211165736,3211165951,HN -3211165952,3211165983,UY -3211165984,3211166415,HN -3211166416,3211166431,UY -3211166432,3211166559,HN -3211166560,3211166567,UY -3211166568,3211167487,HN -3211167488,3211167503,US -3211167504,3211167519,HN -3211167520,3211167527,US -3211167528,3211167927,HN -3211167928,3211167935,US -3211167936,3211168767,HN -3211168768,3211169023,US -3211169024,3211169279,HN -3211169280,3211169535,US -3211169536,3211171071,HN -3211171072,3211171327,US -3211171328,3211171487,HN -3211171488,3211171503,ES -3211171504,3211171511,HN -3211171512,3211171519,ES -3211171520,3211171791,HN -3211171792,3211171807,ES -3211171808,3211171839,HN -3211171840,3211172047,US -3211172048,3211172063,NL -3211172064,3211172271,US -3211172272,3211172279,NL -3211172280,3211172351,US -3211172352,3211172607,HN -3211172608,3211172623,NL -3211172624,3211172671,HN -3211172672,3211172687,NL -3211172688,3211173183,HN -3211173184,3211173199,NL -3211173200,3211173279,HN -3211173280,3211173295,NL -3211173296,3211173887,HN -3211173888,3211174183,US -3211174184,3211174191,CA -3211174192,3211174415,US -3211174416,3211174431,CA -3211174432,3211174687,US -3211174688,3211174703,CA -3211174704,3211174719,US -3211174720,3211174735,CA -3211174736,3211175199,US -3211175200,3211175215,BR -3211175216,3211175295,US -3211175296,3211175327,BR -3211175328,3211177831,US -3211177832,3211177847,CR -3211177848,3211177983,US -3211177984,3211178583,HN -3211178584,3211178591,ES -3211178592,3211178671,HN -3211178672,3211178703,ES -3211178704,3211179087,HN -3211179088,3211179103,US -3211179104,3211179199,HN -3211179200,3211179231,US -3211179232,3211180047,HN -3211180048,3211180063,BR -3211180064,3211180103,HN -3211180104,3211180111,BR -3211180112,3211180543,HN -3211180544,3211180687,US -3211180688,3211180695,BR -3211180696,3211180799,US -3211180800,3211180887,HN -3211180888,3211180895,CR -3211180896,3211181119,HN -3211181120,3211181135,CR -3211181136,3211181215,HN -3211181216,3211181231,CR -3211181232,3211181439,HN -3211181440,3211181447,CA -3211181448,3211182079,HN -3211182080,3211194367,CO -3211194368,3211195391,DO -3211195392,3211214847,AR -3211214848,3211223039,HN -3211223040,3211227135,AR -3211227136,3211231231,NI -3211231232,3211788287,CO -3211788288,3212312575,CL -3212312576,3212574719,BR -3212574720,3212836863,CL -3212836864,3213885439,BR -3213885440,3214934015,CO -3214934016,3217340159,BR -3217340160,3217340415,CL -3217340416,3219653127,BR -3219653128,3219653135,US -3219653136,3219653247,BR -3219653248,3219653375,HK -3219653376,3219653715,BR -3219653716,3219653716,US -3219653717,3219673087,BR -3219673088,3219673151,US -3219673152,3219673983,BR -3219673984,3219674015,SG -3219674016,3219687679,BR -3219687680,3219687935,US -3219687936,3219688447,IE -3219688448,3219688703,HK -3219688704,3219720191,BR -3219720192,3219724287,US -3219724288,3219726335,BR -3219726336,3219734527,JP -3219734528,3219750911,NL -3219750912,3219755007,BR -3219755008,3219755279,US -3219755280,3219757055,BR -3219757056,3219765247,US -3219765248,3219783743,BR -3219783744,3219783751,HK -3219783752,3219783935,BR -3219783936,3219784191,US -3219784192,3219784703,HK -3219784704,3219787775,BR -3219787776,3219791871,HK -3219791872,3219800063,US -3219800064,3219800575,BR -3219800576,3219800591,US -3219800592,3219800607,IE -3219800608,3219802148,BR -3219802149,3219802149,US -3219802150,3219802175,BR -3219802176,3219802303,US -3219802304,3219802367,BR -3219802368,3219802399,US -3219802400,3219802431,BR -3219802432,3219802495,US -3219802496,3219802623,BR -3219802624,3219802639,NL -3219802640,3219819007,BR -3219819008,3219819519,JP -3219819520,3219837439,BR -3219837440,3219837695,US -3219837696,3219838497,BR -3219838498,3219838498,US -3219838499,3219851263,BR -3219851264,3219853311,US -3219853312,3219881983,BR -3219881984,3219899391,IE -3219899392,3219902463,BR -3219902464,3219906559,IE -3219906560,3219914495,BR -3219914496,3219914751,IE -3219914752,3220029439,US -3220029440,3220030207,IE -3220030208,3220030463,BR -3220030464,3220030719,IE -3220030720,3220033535,BR -3220033536,3220037631,IE -3220037632,3220039679,US -3220039680,3220040703,NL -3220040704,3220040959,JP -3220040960,3220041215,BR -3220041216,3220041471,HK -3220041472,3220041727,BR -3220041728,3220042239,JP -3220042240,3220042751,BR -3220042752,3220043775,US -3220043776,3220045823,BR -3220045824,3220062207,US -3220062208,3220062719,SG -3220062720,3220063231,AU -3220063232,3220063743,JP -3220063744,3220066303,US -3220066304,3220070399,JP -3220070400,3220078591,IE -3220078592,3220080639,BR -3220080640,3220094975,US -3220094976,3220103167,BR -3220103168,3220127743,US -3220127744,3220135935,AU -3220135936,3220140031,JP -3220140032,3220144127,BR -3220144128,3220152319,JP -3220152320,3220161535,AU -3220161536,3220161807,US -3220161808,3220162559,BR -3220162560,3220163583,NL -3220163584,3220164607,BR -3220164608,3220168703,IE -3220168704,3220172799,US -3220172800,3221196100,BR -3221196101,3221196101,US -3221196102,3221225471,BR -3221226240,3221226495,US -3221226496,3221227519,KY -3221227520,3221243135,US -3221243136,3221243391,DE -3221243392,3221243647,US -3221243648,3221243903,SG -3221243904,3221258239,US -3221258240,3221291007,CA -3221291008,3221334269,US -3221334270,3221334270,DZ -3221334271,3221415935,US -3221415936,3221416191,RU -3221416192,3221464063,US -3221464064,3221464319,BD -3221464320,3221469175,US -3221469176,3221469183,CA -3221469184,3221470463,US -3221470464,3221470719,RO -3221470720,3221471487,US -3221471488,3221471743,RO -3221471744,3221474919,US -3221474920,3221474927,GB -3221474928,3221477375,US -3221477376,3221477631,RO -3221477632,3221560319,US -3221560320,3221561087,GB -3221561088,3221562367,US -3221562368,3221562623,SE -3221562624,3221565951,US -3221565952,3221566207,NL -3221566208,3221568255,US -3221568256,3221568511,NL -3221568512,3221568767,US -3221568768,3221569279,FR -3221569280,3221576191,US -3221576192,3221576447,AU -3221576448,3221577727,US -3221577728,3221577983,CA -3221577984,3221578239,NL -3221578240,3221578313,US -3221578314,3221578314,JP -3221578315,3221589503,US -3221589504,3221589759,FR -3221589760,3221590015,US -3221590016,3221590271,CA -3221590272,3221590527,DE -3221590528,3221594623,US -3221594624,3221594879,AT -3221594880,3221605375,US -3221605376,3221605887,CA -3221605888,3221608447,US -3221608448,3221608703,AU -3221608704,3221609119,US -3221609120,3221609151,CH -3221609152,3221614335,US -3221614336,3221614591,GB -3221614592,3221614847,AU -3221614848,3221618175,US -3221618176,3221618431,GB -3221618432,3221618687,US -3221618688,3221618943,GB -3221618944,3221647103,US -3221647104,3221647359,FR -3221647360,3221656831,US -3221656832,3221657087,AU -3221657088,3221757951,US -3221757952,3221759999,MY -3221760000,3221761023,IN -3221761024,3221779455,US -3221779456,3221780479,IN -3221780480,3221790719,US -3221790720,3221795071,IN -3221795072,3221795583,US -3221795584,3221796095,IN -3221796096,3221796351,US -3221796352,3221796607,IN -3221796608,3221796863,US -3221796864,3221815295,IN -3221815296,3222011903,US -3222011904,3222012159,CA -3222012160,3222012415,GB -3222012416,3222023935,US -3222023936,3222024191,IT -3222024192,3222025727,US -3222025728,3222025983,NL -3222025984,3222027775,US -3222027776,3222028031,CA -3222028032,3222030335,US -3222030336,3222030847,GB -3222030848,3222031359,US -3222031360,3222031615,AU -3222031616,3222031871,IT -3222031872,3222032639,US -3222032640,3222032895,DE -3222032896,3222036479,US -3222036480,3222036735,FR -3222036736,3222036991,US -3222036992,3222037247,CA -3222037248,3222037503,GB -3222037504,3222040575,US -3222040576,3222041599,BR -3222042624,3222044927,US -3222044928,3222045183,CA -3222045184,3222055935,US -3222056192,3222056447,US -3222056448,3222059007,CA -3222059008,3222061055,US -3222061056,3222061823,IT -3222061824,3222066943,US -3222066944,3222067199,CA -3222067200,3222067455,US -3222067456,3222067967,CH -3222067968,3222071039,US -3222071040,3222071295,GB -3222071296,3222071551,PT -3222071552,3222072063,US -3222072064,3222072319,SE -3222072320,3222075135,US -3222075136,3222075391,NL -3222075392,3222208511,US -3222208512,3222274047,AE -3222274048,3222274559,US -3222274560,3222274815,AU -3222274816,3222275071,US -3222275072,3222275583,JP -3222275584,3222277631,US -3222277632,3222278143,IT -3222278144,3222279679,US -3222279680,3222280191,PL -3222280192,3222281215,US -3222281216,3222281727,GB -3222281728,3222284543,US -3222284544,3222285055,BR -3222285056,3222287359,US -3222287360,3222287871,NL -3222287872,3222288383,US -3222288384,3222288895,JP -3222288896,3222305535,US -3222305536,3222309119,SE -3222309120,3222309375,DE -3222309376,3222313727,SE -3222313728,3222316799,CH -3222316800,3222319615,US -3222319616,3222320127,JP -3222320128,3222320383,AU -3222320384,3222320895,US -3222320896,3222326015,NL -3222326016,3222326527,US -3222326528,3222339583,CA -3222339584,3222455039,US -3222455040,3222455295,NL -3222455296,3222524159,US -3222524160,3222524415,JP -3222524416,3222524927,SG -3222524928,3222525183,US -3222525184,3222525439,DE -3222525440,3222806527,US -3222806528,3222814719,CA -3222814720,3222875647,US -3222875648,3222875903,SG -3222875904,3222890751,US -3222890752,3222891007,CA -3222891008,3222936575,US -3222936576,3222940927,CH -3222940928,3222941183,GB -3222941184,3222941695,CH -3222941696,3222952703,US -3222952704,3222952959,AU -3222952960,3222953215,US -3222953216,3222953727,AU -3222953728,3222953983,US -3222953984,3222954239,JP -3222954240,3222956287,US -3222956288,3222962431,FI -3222962432,3222963455,US -3222963456,3222964223,FI -3222964224,3222968831,US -3222968832,3222973951,NL -3222973952,3222979071,DE -3222979072,3222983167,US -3222983168,3222983935,CA -3222983936,3222984447,US -3222984704,3222988543,AU -3222988544,3222988799,PT -3222988800,3222989055,AU -3222989056,3222989311,US -3222989312,3222989567,GB -3222989568,3222989823,CA -3222989824,3222990079,PT -3222990080,3222990591,AT -3222990592,3222990847,PT -3222990848,3223091199,US -3223091200,3223092223,AU -3223092224,3223094271,GB -3223094272,3223201791,US -3223201792,3223202815,PR -3223202816,3223204863,US -3223204864,3223205119,CA -3223205120,3223214079,US -3223214080,3223214591,CA -3223214592,3223216383,US -3223216384,3223217151,CA -3223217152,3223223295,US -3223223296,3223223551,AI -3223223552,3223227903,US -3223227904,3223228159,CA -3223228160,3223229695,US -3223229696,3223229951,CA -3223229952,3223236607,US -3223236608,3223237631,BZ -3223237632,3223243263,US -3223243264,3223243519,CA -3223243520,3223249407,US -3223249408,3223249663,CA -3223249664,3223250943,US -3223250944,3223252991,CA -3223252992,3223258623,US -3223258624,3223258879,CA -3223258880,3223260671,US -3223260672,3223260927,DE -3223260928,3223262719,US -3223262720,3223262975,DE -3223262976,3223263231,BE -3223263232,3223263743,US -3223263744,3223263999,NL -3223264000,3223264255,FR -3223264256,3223265023,US -3223265024,3223265279,NL -3223265280,3223266559,US -3223266560,3223266815,AU -3223266816,3223267327,US -3223267328,3223267583,BE -3223267584,3223270399,US -3223270400,3223271423,CA -3223271424,3223272959,US -3223272960,3223273215,GB -3223273216,3223283199,US -3223283200,3223283455,NL -3223283456,3223286783,US -3223286784,3223289087,JP -3223289088,3223299583,US -3223299584,3223301119,NL -3223301120,3223302399,US -3223302400,3223302655,CA -3223302656,3223303167,US -3223303168,3223303423,CA -3223303424,3223307519,US -3223307520,3223310079,JP -3223310080,3223311103,US -3223311104,3223311359,FR -3223311360,3223315455,US -3223315456,3223315711,CA -3223315712,3223316223,US -3223316224,3223316479,NL -3223316480,3223321343,US -3223321344,3223321599,CA -3223321600,3223321855,FR -3223321856,3223390719,US -3223390720,3223390975,MU -3223390976,3223391999,US -3223392000,3223392255,FR -3223392256,3223392511,GB -3223392512,3223395839,US -3223395840,3223396095,DE -3223396096,3223397375,US -3223397376,3223397631,NL -3223397632,3223410431,US -3223410432,3223416831,CH -3223416832,3223417087,US -3223417088,3223417599,FR -3223417600,3223418367,US -3223418368,3223420927,CH -3223420928,3223421439,US -3223421440,3223421695,GB -3223421696,3223421951,NL -3223421952,3223422719,US -3223422720,3223422975,JP -3223422976,3223424767,US -3223424768,3223425535,FR -3223425536,3223425791,US -3223425792,3223430911,FR -3223430912,3223431423,US -3223431424,3223432191,FR -3223432192,3223433215,US -3223433216,3223435007,FR -3223435008,3223437311,US -3223437312,3223447551,CH -3223447552,3223447807,US -3223447808,3223449599,NL -3223449600,3223453183,US -3223453184,3223453439,DE -3223453440,3223458559,US -3223458560,3223458815,GB -3223458816,3223460351,US -3223460352,3223460863,CA -3223460864,3223462911,US -3223462912,3223463935,CA -3223463936,3223466495,US -3223466496,3223466751,GB -3223466752,3223467007,US -3223467008,3223468031,CA -3223468032,3223471615,US -3223471616,3223471871,CA -3223471872,3223473151,US -3223473152,3223473215,CA -3223473216,3223473231,US -3223473232,3223474175,CA -3223474176,3223477247,US -3223477248,3223478271,CA -3223478272,3223481087,US -3223481088,3223481343,SE -3223481344,3223483391,US -3223483392,3223483647,NL -3223483648,3223499519,US -3223499520,3223499775,FI -3223499776,3223504639,US -3223504640,3223504895,CA -3223504896,3223508991,US -3223508992,3223513087,CA -3223513088,3223514367,US -3223514368,3223514879,GB -3223514880,3223519231,US -3223519232,3223523599,DE -3223523600,3223523600,CH -3223523601,3223524351,DE -3223524352,3223534335,US -3223534336,3223534591,AU -3223534592,3223535359,US -3223535360,3223537919,DE -3223537920,3223542271,US -3223542272,3223542527,DE -3223542528,3223543295,US -3223543296,3223543551,GB -3223543552,3223546879,US -3223546880,3223547135,GB -3223547136,3223552511,US -3223552512,3223553535,NL -3223553536,3223554559,US -3223554560,3223554815,GB -3223554816,3223556095,US -3223556096,3223556351,CA -3223556352,3223556607,US -3223556608,3223556863,IT -3223556864,3223557375,US -3223557376,3223558655,DE -3223558656,3223563263,US -3223563264,3223563519,NL -3223563520,3223566079,US -3223566080,3223568639,NL -3223568640,3223569663,US -3223569664,3223570175,GB -3223570176,3223571711,US -3223572224,3223572479,IE -3223572480,3223577855,US -3223577856,3223578111,DE -3223578112,3223580671,US -3223580672,3223581951,AT -3223581952,3223582207,US -3223582208,3223582212,NL -3223582213,3223582213,PT -3223582214,3223582719,NL -3223582720,3223582975,AU -3223582976,3223584767,US -3223584768,3223585023,GB -3223585024,3223585791,SE -3223585792,3223586047,GB -3223586048,3223586303,SE -3223586304,3223586559,GB -3223586560,3223589119,SE -3223589120,3223589375,US -3223589376,3223594495,SE -3223594496,3223595007,AT -3223595008,3223599103,SE -3223599104,3223599359,AT -3223599360,3223599615,IS -3223599616,3223601663,SE -3223601664,3223602175,GB -3223602176,3223606527,SE -3223606528,3223606783,GB -3223606784,3223607551,SE -3223607552,3223607807,GB -3223607808,3223610367,SE -3223610368,3223610623,IT -3223610624,3223610879,SE -3223610880,3223611135,NO -3223611136,3223611647,SE -3223611648,3223611903,GB -3223611904,3223612927,SE -3223612928,3223613183,FR -3223613184,3223615999,SE -3223616000,3223616767,GB -3223616768,3223617535,SE -3223617536,3223617791,NO -3223617792,3223620863,SE -3223620864,3223621119,DK -3223621120,3223621375,GB -3223621376,3223627775,SE -3223627776,3223628031,DE -3223628032,3223628287,SE -3223628288,3223628543,ES -3223628544,3223630079,SE -3223630080,3223630591,FR -3223630592,3223630847,GB -3223630848,3223634431,SE -3223634432,3223634687,US -3223634688,3223634943,SE -3223634944,3223635455,GB -3223635456,3223637247,SE -3223637248,3223637503,GB -3223637504,3223638271,SE -3223638272,3223638527,GB -3223638528,3223640831,SE -3223640832,3223641087,GB -3223641088,3223644415,SE -3223644416,3223644671,DE -3223644672,3223644927,FR -3223644928,3223646207,SE -3223646208,3223646463,IT -3223646464,3223646975,SE -3223646976,3223647231,IT -3223647232,3223648511,SE -3223648512,3223648767,GB -3223648768,3223650047,SE -3223650048,3223650303,GB -3223650304,3223715839,CH -3223715840,3223781375,DK -3223781376,3223855103,US -3223855104,3223857151,CA -3223857152,3223863807,US -3223863808,3223864319,CA -3223864320,3223864575,US -3223864832,3223865343,HR -3223865344,3223867391,FI -3223867392,3223867647,GB -3223867648,3223867903,CA -3223867904,3223868415,US -3223868416,3223869439,BM -3223869440,3223869695,NO -3223869696,3223869951,DK -3223869952,3223871231,US -3223871232,3223871487,FI -3223871488,3223873535,CA -3223873536,3223881727,US -3223881728,3223882751,CA -3223882752,3223883263,US -3223883264,3223883519,CA -3223883520,3223902463,US -3223902464,3223902719,CA -3223902720,3223905279,US -3223905280,3223905535,FI -3223905536,3223906303,US -3223906304,3223909375,CA -3223909376,3223911935,US -3223911936,3223912191,CA -3223912192,3223938815,US -3223938816,3223946239,GB -3223946240,3223947519,CH -3223947520,3223948287,US -3223948288,3223948543,NL -3223948544,3223949823,CH -3223949824,3223950079,AU -3223950080,3223950335,DE -3223950336,3223950591,CA -3223950592,3223953663,CH -3223953664,3223955967,US -3223955968,3223956223,AU -3223956224,3223958015,US -3223958016,3223963135,JP -3223963136,3223963647,US -3223963648,3223964159,CA -3223964160,3223964415,US -3223964416,3223964671,AU -3223964672,3223965183,US -3223965184,3223965439,AU -3223965440,3223966207,US -3223966208,3223966463,GB -3223966464,3223967743,US -3223967744,3223967999,NL -3223968000,3223968255,US -3223968256,3223968511,NL -3223968512,3223970559,US -3223970560,3223970815,DE -3223970816,3223978239,US -3223978240,3223978495,DE -3223978496,3223979263,US -3223979264,3223979775,CA -3223979776,3223988735,US -3223988736,3223990271,CH -3223990272,3223991295,US -3223991552,3223991807,GB -3223991808,3223992063,CA -3223992064,3223993343,US -3223993344,3223994111,AU -3223994112,3223994623,DE -3223994880,3223995391,US -3223995392,3223995647,CA -3223995648,3223996415,US -3223996416,3223996927,CA -3223996928,3223999487,US -3224000256,3224000511,GB -3224000512,3224001023,US -3224001024,3224001279,CA -3224001280,3224002815,US -3224002816,3224003071,SE -3224003072,3224003327,US -3224003328,3224003583,ZA -3224003584,3224003839,GB -3224003840,3224004095,US -3224004096,3224004351,FR -3224004352,3224005631,JP -3224005632,3224006911,US -3224006912,3224012031,NL -3224012032,3224014591,US -3224014592,3224014847,NL -3224014848,3224016639,US -3224016640,3224016895,AU -3224016896,3224024063,US -3224024064,3224029695,CH -3224029696,3224030463,CA -3224030464,3224030719,US -3224030720,3224030975,CA -3224030976,3224038655,US -3224038656,3224038911,JP -3224038912,3224084735,US -3224084992,3224087551,SE -3224087552,3224090879,US -3224090880,3224091135,AU -3224091136,3224091903,US -3224092160,3224092415,CA -3224092416,3224092671,US -3224092672,3224093951,CH -3224093952,3224094207,US -3224094208,3224094463,AU -3224094464,3224096511,US -3224096512,3224097279,AU -3224097280,3224097535,NL -3224097536,3224097791,US -3224097792,3224098047,NL -3224098048,3224099583,US -3224099584,3224099839,CA -3224099840,3224101375,US -3224101376,3224102399,AU -3224102400,3224103423,US -3224103424,3224103679,GB -3224103680,3224104703,US -3224104704,3224104959,AU -3224104960,3224109055,US -3224109056,3224119551,DE -3224119552,3224126463,FR -3224126464,3224127231,US -3224127232,3224129791,FR -3224129792,3224132351,DE -3224132352,3224170495,US -3224170496,3224173567,SE -3224173568,3224258047,US -3224258048,3224258303,FI -3224258304,3224305663,US -3224305664,3224367615,JP -3224367616,3224368127,US -3224368128,3224369663,CH -3224369664,3224370431,US -3224370432,3224370687,CA -3224370688,3224370943,US -3224370944,3224371199,CA -3224371200,3224373247,US -3224373248,3224373503,AU -3224373504,3224376831,US -3224376832,3224377087,GB -3224377088,3224379135,US -3224379136,3224379391,DE -3224379392,3224398591,US -3224398592,3224398847,DE -3224398848,3224399103,US -3224399104,3224399615,AU -3224399616,3224407295,US -3224407296,3224407551,CA -3224407552,3224408319,US -3224408320,3224408575,DE -3224408576,3224427519,US -3224427520,3224427775,CA -3224427776,3224428543,US -3224428544,3224428799,DE -3224428800,3224428863,US -3224428864,3224428911,SG -3224428912,3224430335,US -3224430336,3224430591,DE -3224430592,3224431103,US -3224431104,3224431359,CA -3224431360,3224435967,US -3224435968,3224436223,ZA -3224436224,3224436735,US -3224436736,3224502271,FI -3224502272,3224567807,JP -3224567808,3224571903,NO -3224571904,3224580095,JP -3224580096,3224580351,US -3224580352,3224616959,JP -3224616960,3224617471,US -3224617472,3224633343,JP -3224633344,3224646399,DE -3224646400,3224651775,US -3224651776,3224652287,AU -3224652288,3224660991,US -3224660992,3224661247,CA -3224661248,3224664063,US -3224672000,3224672255,US -3224672256,3224672511,NL -3224672512,3224674047,US -3224674048,3224674559,DE -3224674560,3224674815,GB -3224674816,3224677119,US -3224677120,3224678655,AU -3224678656,3224689919,US -3224689920,3224690687,NL -3224690688,3224692735,US -3224692736,3224692991,DZ -3224692992,3224694527,US -3224694528,3224694783,CA -3224694784,3224698111,US -3224698112,3224698367,GB -3224698368,3224698623,FR -3224698624,3224699135,US -3224699136,3224699391,BE -3224699392,3224705023,US -3224705024,3224707071,CH -3224707072,3224725247,US -3224725248,3224725503,NL -3224725504,3224725759,CH -3224725760,3224772351,US -3224772352,3224777983,DE -3224777984,3224778239,US -3224779776,3224785151,DE -3224785152,3224791039,US -3224791040,3224791295,DE -3224791296,3224791807,AU -3224791808,3224793343,US -3224793344,3224793599,DE -3224793600,3224793855,US -3224793856,3224795391,DK -3224795392,3224795647,CA -3224795648,3224795903,CH -3224795904,3224796415,US -3224796416,3224797439,DE -3224797440,3224797695,US -3224797696,3224797951,NZ -3224797952,3224798207,US -3224798208,3224798463,CH -3224798464,3224798975,US -3224798976,3224799231,AU -3224799232,3224799487,US -3224799744,3224799999,US -3224800000,3224800255,NL -3224800256,3224800511,US -3224800512,3224816639,FR -3224816640,3224816895,IL -3224816896,3224820735,FR -3224820736,3224820991,PL -3224820992,3224821247,DE -3224821248,3224822015,US -3224822016,3224822271,SE -3224822272,3224826367,US -3224826368,3224826623,CA -3224826624,3224826879,US -3224827136,3224827391,GB -3224827392,3224827647,US -3224827904,3224828671,US -3224828672,3224828927,AU -3224828928,3224829439,US -3224829440,3224829695,DE -3224829696,3224834047,US -3224834048,3224834303,SG -3224834304,3224834559,US -3224834560,3224834815,TH -3224834816,3224851455,US -3224851456,3224851711,NL -3224851712,3224852735,US -3224852736,3224852991,DE -3224852992,3224855039,US -3224855040,3224855551,AU -3224855552,3224855807,US -3224855808,3224856063,IT -3224856064,3224856831,US -3224856832,3224857087,NL -3224857088,3224857855,US -3224857856,3224858111,PL -3224858368,3224858623,US -3224858624,3224858879,AU -3224858880,3224859391,US -3224859392,3224859647,NL -3224859648,3224860159,US -3224860160,3224860415,JP -3224860416,3224860671,CA -3224860672,3224862975,US -3224862976,3224863231,NL -3224863232,3224863487,CA -3224863488,3224863743,US -3224863744,3224863999,GB -3224864000,3224878079,US -3224878080,3224878335,NL -3224878336,3224878591,US -3224878592,3224878847,AU -3224878848,3224879359,US -3224879360,3224879615,NL -3224879616,3224879871,CA -3224879872,3224880383,US -3224880384,3224880639,NL -3224880640,3224880895,AU -3224880896,3224882687,US -3224882688,3224882943,CA -3224882944,3224884223,US -3224884224,3224884479,GB -3224884480,3224885247,US -3224885248,3224885503,CA -3224885504,3224886015,US -3224886016,3224886271,AU -3224886272,3224886527,JP -3224886528,3224887295,US -3224887296,3224887551,CA -3224887552,3224889343,US -3224889344,3224889599,AU -3224889600,3224892415,US -3224892416,3224892671,DE -3224892672,3224899071,US -3224899072,3224899327,AT -3224899328,3224908543,US -3224908544,3224908799,CA -3224908800,3224921087,US -3224921088,3224921343,FI -3224921344,3224928255,US -3224928256,3224928511,FI -3224928512,3224933887,US -3224933888,3224934143,DE -3224934144,3224957951,US -3224957952,3224958207,CA -3224958208,3225028863,US -3225028864,3225031423,JP -3225031424,3225033727,US -3225033728,3225033983,LU -3225033984,3225034239,AE -3225034240,3225034751,FI -3225034752,3225035775,BG -3225035776,3225037055,US -3225037056,3225049599,FI -3225049600,3225057535,US -3225057536,3225057791,CA -3225057792,3225060607,US -3225060608,3225061631,AU -3225061632,3225062399,US -3225062400,3225062911,VC -3225062912,3225063423,LC -3225063424,3225076223,US -3225076224,3225076479,CA -3225076480,3225076991,US -3225076992,3225077247,SE -3225077248,3225081087,US -3225081088,3225081343,CA -3225081344,3225082367,US -3225082368,3225082623,IT -3225082624,3225084415,US -3225084416,3225085183,NL -3225085184,3225085439,ES -3225085440,3225089279,US -3225089280,3225089535,CA -3225089536,3225314303,US -3225314304,3225314559,GB -3225314560,3225420799,US -3225420800,3225423871,CA -3225423872,3225426943,US -3225426944,3225427199,AT -3225427200,3225427455,US -3225427456,3225427967,CA -3225427968,3225428991,US -3225428992,3225431039,CA -3225431040,3225431551,GB -3225431552,3225434111,US -3225434112,3225436159,CA -3225436160,3225445375,US -3225445376,3225446399,BE -3225446400,3225450495,US -3225450496,3225451263,AG -3225451264,3225451519,MS -3225451520,3225452543,US -3225452544,3225456639,CA -3225456640,3225459711,US -3225459712,3225459967,CA -3225459968,3225460991,US -3225460992,3225462015,CA -3225462016,3225468927,US -3225468928,3225470463,CA -3225470464,3225471487,US -3225471488,3225471743,DE -3225471744,3225472255,HK -3225472256,3225498367,US -3225498368,3225503487,NL -3225503488,3225506303,US -3225506304,3225508863,AU -3225508864,3225509631,CH -3225509632,3225509887,US -3225509888,3225510143,NL -3225510144,3225518591,US -3225518592,3225518847,AU -3225518848,3225519103,IT -3225519104,3225519359,NL -3225519360,3225520895,US -3225520896,3225521151,DE -3225521152,3225522175,US -3225522176,3225522943,GB -3225522944,3225524223,US -3225524224,3225524479,VE -3225524480,3225524735,GB -3225524736,3225526271,US -3225526272,3225528319,BB -3225528320,3225528831,US -3225528832,3225529087,VI -3225529088,3225530367,US -3225530368,3225530623,PR -3225530624,3225531903,US -3225531904,3225532159,AU -3225532160,3225535999,CH -3225536000,3225540863,US -3225540864,3225541119,AU -3225541120,3225541375,US -3225541376,3225543935,GB -3225543936,3225544703,US -3225544704,3225546751,CA -3225546752,3225550847,US -3225550848,3225616383,DK -3225616384,3225616639,US -3225616896,3225617151,US -3225617152,3225617407,IE -3225617408,3225617663,GB -3225617664,3225618687,US -3225618688,3225618943,CA -3225618944,3225619455,US -3225619456,3225619711,AU -3225619712,3225624575,US -3225624576,3225625599,CA -3225625600,3225626367,US -3225626368,3225626623,GB -3225626624,3225627391,US -3225627392,3225627647,GB -3225627648,3225627903,US -3225627904,3225628159,CA -3225628160,3225628415,US -3225628416,3225628671,GB -3225628672,3225629183,US -3225629184,3225629439,GB -3225629440,3225629695,US -3225629696,3225629951,GB -3225629952,3225630463,US -3225630464,3225630719,DE -3225630720,3225631231,US -3225631232,3225631487,NL -3225631488,3225635839,US -3225635840,3225636095,PT -3225636096,3225636607,US -3225636608,3225636863,ES -3225636864,3225637887,US -3225637888,3225638143,AU -3225638400,3225638655,US -3225638656,3225638911,GB -3225638912,3225640447,US -3225640448,3225640703,GB -3225640704,3225641983,US -3225641984,3225643263,GB -3225643264,3225643775,CA -3225643776,3225650943,US -3225650944,3225651199,GB -3225651200,3225657343,US -3225658368,3225658879,US -3225659136,3225659391,DE -3225659648,3225659903,US -3225659904,3225660159,DE -3225660160,3225660415,AU -3225660416,3225664767,US -3225664768,3225669887,DE -3225669888,3225671935,US -3225672192,3225672447,DE -3225672448,3225672703,US -3225672704,3225673215,NL -3225673216,3225673471,CA -3225673472,3225673727,GB -3225673728,3225679871,US -3225679872,3225680127,AU -3225680128,3225680383,GR -3225680384,3225680639,CA -3225680640,3225681663,US -3225681664,3225681919,CA -3225681920,3225682943,DE -3225682944,3225683199,AT -3225683200,3225687039,DE -3225687040,3225687807,US -3225687808,3225688063,GB -3225688064,3225689855,US -3225689856,3225694975,NL -3225694976,3225695231,PL -3225695232,3225695487,US -3225695488,3225701119,CA -3225701120,3225701375,US -3225701376,3225709567,NO -3225709568,3225710079,US -3225710592,3225715455,US -3225715456,3225715711,CA -3225715712,3225715967,AU -3225715968,3225716991,US -3225716992,3225717247,CA -3225717248,3225717503,TN -3225717760,3225720575,US -3225720576,3225721343,GB -3225721344,3225723647,US -3225723648,3225723903,CA -3225723904,3225724159,US -3225724160,3225725439,DE -3225725440,3225725695,GB -3225725696,3225726207,AU -3225726208,3225726463,US -3225726464,3225726719,GB -3225726720,3225726975,US -3225726976,3225727231,IT -3225727232,3225727743,US -3225728000,3225728511,US -3225728512,3225728767,NL -3225728768,3225729023,US -3225729024,3225729279,CA -3225729536,3225729791,PT -3225729792,3225730047,US -3225730048,3225730303,CA -3225730304,3225735423,US -3225735424,3225735679,PT -3225735680,3225735935,US -3225735936,3225737215,DE -3225737216,3225737471,PT -3225737472,3225738495,US -3225738496,3225738751,PT -3225738752,3225739263,US -3225739264,3225739519,PT -3225739520,3225740543,US -3225740544,3225740799,CA -3225740800,3225741055,NL -3225741056,3225742079,US -3225742080,3225745919,JP -3225745920,3225746687,NL -3225746688,3225746943,US -3225746944,3225747199,NL -3225747200,3225747711,US -3225747712,3225747967,CA -3225747968,3225757695,US -3225757696,3225758719,CA -3225758720,3225763839,US -3225763840,3225764095,BE -3225764096,3225764863,US -3225764864,3225765887,CA -3225765888,3225766399,US -3225766400,3225766655,CA -3225766656,3225769471,US -3225769472,3225769983,CA -3225769984,3225773311,US -3225773312,3225773567,CA -3225773568,3225776639,US -3225776640,3225777151,CA -3225777152,3225777407,AU -3225777408,3225781247,US -3225781248,3225782271,CA -3225782272,3225807359,US -3225807360,3225807615,DE -3225807616,3225807871,US -3225807872,3225808895,CA -3225808896,3225811711,US -3225811712,3225811967,GB -3225811968,3225812991,US -3225812992,3225843711,FR -3225843712,3225847039,US -3225847040,3225847551,TR -3225847552,3225847807,AU -3225847808,3225848063,IT -3225848064,3225848831,US -3225848832,3225849855,DE -3225849856,3225850111,US -3225850112,3225853951,DE -3225853952,3225857023,US -3225857024,3225857279,CA -3225857280,3225857535,US -3225857536,3225857791,AU -3225857792,3225858047,US -3225858048,3225858559,CA -3225858560,3225858815,US -3225858816,3225859583,JP -3225860096,3225862143,US -3225864192,3225868287,US -3225868288,3225868543,AU -3225868544,3225869055,US -3225869056,3225869311,AU -3225869312,3225869567,CA -3225869568,3225870335,US -3225870336,3225870591,CA -3225870592,3225873663,US -3225873664,3225873919,ZA -3225873920,3225874943,US -3225874944,3225875199,GB -3225875200,3225878527,US -3225878528,3225880319,SE -3225880320,3225880575,US -3225880576,3225881343,SE -3225881344,3225881599,IT -3225881600,3225882367,SE -3225882368,3225882623,DE -3225882624,3225882879,SE -3225882880,3225883391,DE -3225883392,3225884927,SE -3225884928,3225885183,NL -3225885184,3225885695,AT -3225885696,3225886719,SE -3225886720,3225886975,NO -3225886976,3225887231,SE -3225887232,3225887487,DK -3225887488,3225887999,SE -3225888000,3225888255,GB -3225888256,3225892351,SE -3225892352,3225892863,FR -3225892864,3225894399,SE -3225894400,3225895423,GB -3225895424,3225902335,SE -3225902336,3225902591,NL -3225902592,3225902847,SE -3225902848,3225903103,NL -3225903104,3225905407,SE -3225905408,3225905663,IT -3225905664,3225913855,SE -3225913856,3225914111,DE -3225914112,3225915135,SE -3225915136,3225915391,DK -3225915392,3225917183,SE -3225917184,3225917439,NL -3225917440,3225917695,SE -3225917696,3225917951,NL -3225917952,3225918463,SE -3225918464,3225918719,GB -3225918720,3225920767,SE -3225920768,3225921023,GB -3225921024,3225921791,SE -3225921792,3225922047,GB -3225922048,3225922559,SE -3225922560,3225922815,IT -3225922816,3225923327,SE -3225923328,3225923583,IN -3225923584,3225923839,SE -3225923840,3225924095,GB -3225924096,3225929983,SE -3225929984,3225930239,US -3225930240,3225930495,FR -3225930496,3225932543,SE -3225932544,3225932799,IM -3225932800,3225933055,IT -3225933056,3225933311,ES -3225933312,3225934335,SE -3225934336,3225934591,IS -3225934592,3225935359,SE -3225935360,3225935615,US -3225935616,3225936639,SE -3225936640,3225936895,US -3225936896,3225937407,SE -3225937408,3225937663,US -3225937664,3225938175,SE -3225938176,3225938431,CH -3225938432,3225938687,US -3225938688,3225940991,SE -3225940992,3225941247,SI -3225941248,3225941503,IT -3225941504,3225941759,SE -3225941760,3225942015,AT -3225942016,3225942271,SE -3225942272,3225942527,BE -3225942528,3225944063,SE -3225944064,3225944831,US -3225944832,3226008831,TW -3226008832,3226010879,US -3226010880,3226011135,CA -3226011136,3226012671,US -3226012672,3226012927,AU -3226012928,3226014463,US -3226014464,3226014975,GB -3226014976,3226015231,NZ -3226015232,3226015487,AU -3226015488,3226015743,US -3226015744,3226016255,ID -3226016256,3226018303,US -3226018304,3226018559,DE -3226018560,3226021119,CH -3226021120,3226026495,US -3226026496,3226026751,AU -3226026752,3226067455,US -3226067456,3226067711,BE -3226067712,3226068223,US -3226068224,3226068479,GB -3226068480,3226110719,US -3226110720,3226128639,AU -3226128640,3226140927,US -3226140928,3226143487,CA -3226143488,3226143743,US -3226143744,3226145535,CA -3226145536,3226145791,US -3226145792,3226146559,CA -3226146560,3226146815,FR -3226146816,3226155519,CA -3226155520,3226155775,US -3226155776,3226156543,CA -3226156544,3226156799,US -3226156800,3226157567,CA -3226157568,3226157823,US -3226157824,3226167807,CA -3226167808,3226168063,US -3226168064,3226175231,CA -3226175232,3226175743,US -3226176000,3226177535,CA -3226177536,3226178559,US -3226178560,3226188543,CA -3226188544,3226188799,PR -3226188800,3226189055,US -3226189056,3226189823,CA -3226189824,3226191871,US -3226191872,3226194175,CA -3226194176,3226194431,US -3226194432,3226194687,CA -3226194688,3226194943,US -3226194944,3226205439,CA -3226205440,3226205695,AE -3226205696,3226205951,CA -3226205952,3226207743,US -3226207744,3226215423,GB -3226215424,3226237439,US -3226237440,3226237695,AU -3226237696,3226240255,DE -3226240256,3226240511,US -3226240512,3226241535,DE -3226241536,3226241791,NL -3226241792,3226248191,DE -3226248448,3226248703,IE -3226248704,3226250495,DE -3226250496,3226251263,US -3226251264,3226251519,DE -3226251520,3226267903,US -3226267904,3226268159,DE -3226268160,3226268415,PT -3226268416,3226268927,AT -3226268928,3226269951,DE -3226269952,3226270719,US -3226271488,3226273791,US -3226274048,3226274559,US -3226274560,3226274815,CH -3226274816,3226283519,US -3226283520,3226291199,CA -3226291200,3226300927,US -3226300928,3226301439,DE -3226301440,3226302463,US -3226302464,3226303487,FI -3226303488,3226305535,US -3226305536,3226307327,GB -3226307328,3226307583,US -3226307584,3226308095,ES -3226308096,3226333823,US -3226333824,3226333951,NL -3226333952,3226335231,US -3226335232,3226335487,RO -3226335488,3226365439,US -3226365440,3226365951,DE -3226365952,3226374143,US -3226374144,3226375167,DE -3226375168,3226376703,US -3226376704,3226376959,AT -3226376960,3226384639,US -3226384640,3226385407,BE -3226385408,3226397695,US -3226397696,3226398719,DE -3226398720,3226473471,US -3226473472,3226473983,PT -3226473984,3226474495,US -3226474496,3226474751,CL -3226474752,3226476287,US -3226476288,3226479359,CH -3226479360,3226480127,US -3226480128,3226480383,GB -3226480384,3226481407,US -3226481408,3226481663,DE -3226481664,3226488831,US -3226488832,3226489087,CA -3226489088,3226521855,US -3226521856,3226522111,BR -3226522112,3226536959,US -3226536960,3226542079,CA -3226542080,3226547199,US -3226547200,3226548735,CA -3226548736,3226548991,US -3226548992,3226549247,BE -3226549248,3226549503,US -3226549504,3226550015,GB -3226550016,3226550783,US -3226550784,3226551039,CA -3226551040,3226551807,US -3226551808,3226552319,CA -3226552320,3226552831,VI -3226552832,3226555391,US -3226555392,3226555903,CA -3226555904,3226556671,US -3226556672,3226556927,CA -3226556928,3226561791,US -3226561792,3226562047,NO -3226562048,3226564863,US -3226564864,3226565119,DE -3226565120,3226565375,US -3226565376,3226565631,FI -3226565632,3226574847,US -3226574848,3226575103,FI -3226575104,3226575359,US -3226575360,3226576383,CA -3226576384,3226576895,US -3226576896,3226578943,CA -3226578944,3226580479,US -3226580480,3226581247,FI -3226581248,3226582015,US -3226582016,3226582271,GB -3226582272,3226583551,US -3226583552,3226583807,SE -3226583808,3226590207,US -3226590208,3226591231,NL -3226591232,3226592255,CA -3226592256,3226592767,US -3226592768,3226593023,DE -3226593024,3226593791,US -3226593792,3226594047,NL -3226594048,3226626047,US -3226626048,3226626303,CA -3226626304,3226629375,US -3226629376,3226629631,CA -3226629632,3226630399,US -3226630400,3226630655,GB -3226630656,3226631167,US -3226631168,3226631423,SE -3226631424,3226631935,US -3226631936,3226632191,PT -3226632192,3226633215,CA -3226633216,3226635263,US -3226635264,3226635519,AU -3226635520,3226635775,US -3226635776,3226636031,ZA -3226636032,3226636287,AU -3226636288,3226637823,US -3226637824,3226638079,CA -3226638080,3226638591,US -3226638592,3226638847,NL -3226638848,3226639615,US -3226639616,3226640127,AT -3226640128,3226640639,US -3226640640,3226640895,AU -3226640896,3226654207,US -3226654208,3226654463,PT -3226654464,3226655743,US -3226655744,3226656255,NL -3226656256,3226656511,AU -3226656512,3226661119,US -3226661120,3226661375,NL -3226661376,3226664959,US -3226664960,3226690815,FI -3226690816,3226691071,CA -3226691072,3226691327,GB -3226691328,3226695167,US -3226695168,3226695679,AU -3226695680,3226695935,US -3226695936,3226696191,CA -3226696448,3226696703,AU -3226696704,3226697727,US -3226697728,3226701823,CA -3226701824,3226705919,US -3226705920,3226706175,FR -3226706176,3226707199,US -3226707200,3226707455,PL -3226707456,3226715391,TW -3226715392,3226715647,US -3226715648,3226715903,AU -3226715904,3226716159,US -3226716160,3226716415,GB -3226716416,3226716671,US -3226716672,3226716927,GB -3226716928,3226718207,US -3226718208,3226719231,ZA -3226719232,3226720255,KE -3226720768,3226721279,JP -3226721280,3226722047,US -3226722048,3226722303,NL -3226722304,3226722559,AU -3226722560,3226723583,US -3226723584,3226723839,DE -3226723840,3226724095,US -3226724096,3226724351,AU -3226724352,3226725631,US -3226725632,3226726143,AU -3226726144,3226728191,US -3226728192,3226728447,CA -3226728448,3226731775,US -3226731776,3226732031,GB -3226732032,3226733567,US -3226733568,3226733823,MX -3226733824,3226734079,PT -3226734080,3226734493,US -3226734494,3226734494,PT -3226734495,3226736639,US -3226736896,3226737407,US -3226737408,3226737663,AT -3226737664,3226738175,US -3226738176,3226738431,NL -3226738432,3226738687,US -3226738688,3226739199,NO -3226739200,3226746367,US -3226746368,3226746623,PT -3226746624,3226748927,US -3226749440,3226749695,US -3226749696,3226752255,GB -3226752256,3226752767,US -3226752768,3226753023,IT -3226753024,3226753279,US -3226753280,3226753535,AU -3226753536,3226753791,SI -3226753792,3226754815,HR -3226754816,3226755071,SI -3226755072,3226755327,HR -3226755328,3226755583,SI -3226755584,3226755839,HR -3226755840,3226756095,SI -3226756096,3226756351,US -3226756352,3226757375,SI -3226757376,3226757887,HR -3226757888,3226758143,SI -3226758144,3226758399,HR -3226758400,3226758655,SI -3226758656,3226763007,US -3226763008,3226770687,IT -3226770688,3226772991,US -3226772992,3226773247,CH -3226773248,3226774783,US -3226774784,3226775039,GB -3226775040,3226775551,US -3226775552,3226783743,FI -3226783744,3226784767,US -3226784768,3226785023,GB -3226785024,3226786815,US -3226786816,3226787071,DE -3226787072,3226787327,AT -3226787328,3226788351,US -3226788352,3226789375,HU -3226789376,3226789631,AU -3226789632,3226790911,US -3226790912,3226791167,CA -3226791168,3226791679,AU -3226791680,3226792191,US -3226792448,3226792703,AU -3226792704,3226792959,US -3226792960,3226793215,ZA -3226793216,3226793983,DE -3226793984,3226795263,US -3226795264,3226795519,NZ -3226795520,3226800127,US -3226800128,3226800639,DE -3226800640,3226811391,US -3226811392,3226811647,DE -3226811648,3226824191,US -3226824192,3226824447,DE -3226824448,3226861823,US -3226861824,3226862079,CA -3226862080,3226864383,US -3226864384,3226864639,RU -3226864896,3226865151,US -3226865152,3226865407,PL -3226865408,3226866175,US -3226866176,3226866431,GB -3226866432,3226867967,US -3226867968,3226868223,IL -3226868224,3226868479,US -3226868480,3226868735,GB -3226868736,3226884351,US -3226884352,3226884607,IL -3226884608,3226893567,US -3226893568,3226894079,NL -3226894080,3226894335,GB -3226894336,3226895359,US -3226895872,3226896127,GB -3226896128,3226896639,US -3226896640,3226896895,GB -3226896896,3226897151,PT -3226897152,3226903295,US -3226903296,3226903551,DE -3226903552,3226903807,US -3226903808,3226904063,AU -3226904064,3226904319,CH -3226904320,3226904575,FR -3226904576,3226904831,US -3226904832,3226905087,GB -3226905088,3226926591,US -3226926592,3226926847,SE -3226926848,3226927103,US -3226927104,3226992639,NL -3226992640,3226992895,US -3226992896,3226993151,CH -3226993152,3226993663,US -3226993664,3226993919,DE -3226993920,3226994175,US -3226994176,3226994687,AU -3226994688,3226994943,US -3226994944,3226995455,NL -3226995456,3226998527,US -3226998528,3226999039,AT -3226999040,3227013119,US -3227013376,3227013887,US -3227013888,3227014399,NL -3227014400,3227014655,NZ -3227014656,3227014911,FI -3227014912,3227017471,US -3227017472,3227017983,NL -3227018240,3227020287,US -3227020288,3227020543,NL -3227020544,3227022847,US -3227022848,3227023103,GB -3227023360,3227024127,US -3227024128,3227024383,PT -3227024384,3227025407,US -3227025408,3227025663,GB -3227025664,3227025919,US -3227025920,3227026175,GB -3227026176,3227026687,US -3227026688,3227026943,GB -3227026944,3227027455,CA -3227027456,3227040511,US -3227040512,3227040767,AU -3227040768,3227041279,US -3227041280,3227041535,AU -3227041536,3227042815,US -3227042816,3227043071,IT -3227043072,3227044863,US -3227044864,3227045119,PL -3227045120,3227053567,US -3227053568,3227053823,GB -3227053824,3227054079,DE -3227054080,3227056639,US -3227056640,3227057919,PT -3227057920,3227058175,US -3227058176,3227123711,FI -3227123712,3227217151,US -3227217152,3227217407,JP -3227217408,3227225087,US -3227225088,3227225599,LU -3227225600,3227234559,US -3227234560,3227234815,PT -3227234816,3227235071,US -3227235072,3227235327,AU -3227235328,3227236607,US -3227236608,3227236863,AU -3227236864,3227237119,RU -3227237120,3227237631,US -3227237632,3227237887,NO -3227237888,3227238143,US -3227238144,3227238399,GB -3227238400,3227240191,US -3227240192,3227240447,GB -3227240704,3227240959,GB -3227240960,3227243007,US -3227243008,3227243263,CA -3227243264,3227243519,GB -3227243520,3227243775,US -3227244032,3227249151,SE -3227249152,3227249663,US -3227249664,3227252735,CH -3227252736,3227273983,US -3227273984,3227274239,FI -3227274240,3227274495,US -3227274496,3227274751,NL -3227274752,3227276799,US -3227276800,3227277055,FR -3227277056,3227278847,US -3227278848,3227279103,NL -3227279104,3227281407,US -3227281408,3227282175,IT -3227282176,3227282431,US -3227282432,3227282687,NL -3227282688,3227282943,GB -3227282944,3227284479,US -3227284480,3227284735,FI -3227284736,3227286783,US -3227286784,3227287039,AT -3227287040,3227287295,IT -3227287296,3227287551,NL -3227287552,3227287807,CH -3227287808,3227288063,BG -3227288064,3227288319,BE -3227288320,3227288831,NL -3227288832,3227289087,PT -3227289088,3227289343,NL -3227289344,3227289599,PT -3227289600,3227290111,NL -3227290112,3227290367,AT -3227290368,3227290623,CH -3227290624,3227290879,US -3227290880,3227291135,AT -3227291136,3227294207,PT -3227294464,3227294975,GR -3227294976,3227304191,US -3227304192,3227304447,PR -3227304448,3227310079,US -3227310080,3227310335,NO -3227310336,3227312127,US -3227312128,3227312383,DK -3227312384,3227315199,US -3227316224,3227320319,US -3227320320,3227362047,FR -3227362048,3227362303,US -3227362304,3227362559,GB -3227362560,3227385855,FR -3227385856,3227391999,US -3227392000,3227392255,PT -3227392256,3227393023,US -3227393024,3227393279,AT -3227393280,3227396351,US -3227396352,3227396607,AU -3227396608,3227398399,US -3227398400,3227398655,CA -3227398656,3227400447,US -3227400448,3227400703,AT -3227400704,3227400959,GB -3227400960,3227401471,US -3227401472,3227401727,MU -3227401728,3227402495,AU -3227402496,3227403007,US -3227403008,3227403519,GR -3227403520,3227405311,US -3227405312,3227405567,DE -3227406080,3227414271,US -3227414272,3227415551,GB -3227415552,3227415807,US -3227415808,3227416063,GB -3227416064,3227417087,US -3227417088,3227417343,BN -3227417344,3227418111,US -3227418112,3227418367,CA -3227418368,3227425791,US -3227425792,3227427583,DK -3227427584,3227427839,ES -3227427840,3227429119,US -3227429120,3227429375,AU -3227429376,3227429887,US -3227429888,3227430143,GB -3227430144,3227430399,US -3227430400,3227430655,AU -3227430656,3227437055,FR -3227437056,3227439103,US -3227439104,3227439615,AU -3227439616,3227439871,MU -3227439872,3227440127,US -3227440128,3227440383,NL -3227440384,3227442175,US -3227442432,3227442687,RU -3227442688,3227443711,US -3227443712,3227443967,AT -3227443968,3227444223,AU -3227444224,3227445503,US -3227445504,3227445759,RU -3227445760,3227446015,US -3227446016,3227446271,GB -3227446272,3227446783,US -3227447040,3227447295,AT -3227447296,3227447807,ZA -3227447808,3227448063,US -3227448064,3227448575,AU -3227448576,3227448831,US -3227448832,3227449087,ZA -3227449088,3227450111,US -3227450112,3227450367,CA -3227450368,3227451455,US -3227451456,3227451831,CA -3227451832,3227451835,US -3227451836,3227452375,CA -3227452376,3227452382,US -3227452383,3227452735,CA -3227452736,3227452767,US -3227452768,3227453503,CA -3227453504,3227453507,US -3227453508,3227454047,CA -3227454048,3227454079,US -3227454080,3227454687,CA -3227454688,3227454719,US -3227454720,3227455047,CA -3227455048,3227455051,US -3227455052,3227455487,CA -3227455488,3227456255,US -3227456256,3227457023,CA -3227457024,3227457535,US -3227457536,3227459001,CA -3227459002,3227459002,US -3227459003,3227461081,CA -3227461082,3227461082,US -3227461083,3227461119,CA -3227461120,3227461631,US -3227461632,3227461959,CA -3227461960,3227461963,US -3227461964,3227464447,CA -3227464448,3227464575,US -3227464576,3227464663,CA -3227464664,3227464667,US -3227464668,3227465147,CA -3227465148,3227465151,US -3227465152,3227466135,CA -3227466136,3227466143,US -3227466144,3227467775,CA -3227467776,3227468287,US -3227468288,3227468799,CA -3227468800,3227484159,US -3227484160,3227517183,CA -3227517184,3227521279,ZA -3227521280,3227521791,US -3227521792,3227522047,ZA -3227522048,3227522815,MU -3227522816,3227523071,US -3227523072,3227525119,ZA -3227525120,3227525375,MU -3227525376,3227526143,ZA -3227526144,3227526399,US -3227526400,3227527423,ZA -3227527424,3227527935,US -3227527936,3227528191,MU -3227528192,3227528447,US -3227528448,3227528703,ZA -3227528704,3227528959,MU -3227528960,3227531519,ZA -3227531520,3227531775,MU -3227531776,3227532031,ZA -3227532032,3227532287,US -3227532288,3227532799,ZA -3227532800,3227534335,US -3227534336,3227535615,ZA -3227535616,3227535871,US -3227535872,3227536895,ZA -3227536896,3227537151,CA -3227537152,3227539199,ZA -3227539200,3227540735,MU -3227540736,3227540991,ZA -3227540992,3227541503,MU -3227541504,3227541759,ZA -3227541760,3227543295,MU -3227543296,3227543551,US -3227543552,3227544831,ZA -3227544832,3227545087,MU -3227545088,3227547647,ZA -3227547648,3227551743,MU -3227551744,3227552255,MF -3227552256,3227552511,ZA -3227552512,3227553791,MU -3227553792,3227554047,ZA -3227554304,3227554559,ZA -3227554560,3227554815,MU -3227554816,3227556863,ZA -3227556864,3227557375,US -3227557376,3227557631,ZA -3227557632,3227558911,US -3227558912,3227559167,ZA -3227559168,3227559423,GB -3227559424,3227559935,ZA -3227559936,3227562239,US -3227562240,3227566079,ZA -3227566080,3227566335,US -3227566336,3227566847,MU -3227566848,3227568127,ZA -3227568128,3227574271,US -3227574272,3227576575,ZA -3227576576,3227576831,US -3227576832,3227579391,MU -3227579392,3227579647,US -3227579648,3227580159,ZA -3227580160,3227580415,MU -3227580416,3227580927,ZA -3227580928,3227581695,MU -3227581696,3227582207,ZA -3227582208,3227638271,US -3227638272,3227638527,CA -3227638528,3227647999,US -3227648000,3227659775,FI -3227659776,3227660031,JP -3227660032,3227660543,FI -3227660544,3227660799,EE -3227660800,3227678719,FI -3227678720,3227680767,LU -3227680768,3227713535,FI -3227713536,3227722521,CA -3227722522,3227722522,US -3227722523,3227724031,CA -3227724032,3227724287,US -3227724288,3227738367,CA -3227738368,3227738623,US -3227738624,3227738879,CA -3227738880,3227739135,US -3227739136,3227740587,CA -3227740588,3227740591,US -3227740592,3227740795,CA -3227740796,3227740799,US -3227740800,3227740839,CA -3227740840,3227740847,US -3227740848,3227740927,CA -3227740928,3227741183,US -3227741184,3227742079,CA -3227742080,3227742083,US -3227742084,3227742207,CA -3227742208,3227742463,PL -3227742464,3227742691,CA -3227742692,3227742695,US -3227742696,3227743359,CA -3227743360,3227743375,US -3227743376,3227743487,CA -3227743488,3227743743,BR -3227743744,3227743999,CZ -3227744000,3227744119,CA -3227744120,3227744123,US -3227744124,3227744167,CA -3227744168,3227744171,US -3227744172,3227744303,CA -3227744304,3227744311,US -3227744312,3227744827,CA -3227744828,3227744831,US -3227744832,3227744911,CA -3227744912,3227744915,US -3227744916,3227745755,CA -3227745756,3227745759,US -3227745760,3227745867,CA -3227745868,3227745871,US -3227745872,3227746007,CA -3227746008,3227746011,US -3227746012,3227746167,CA -3227746168,3227746175,US -3227746176,3227746431,CA -3227746432,3227746463,US -3227746464,3227746559,CA -3227746560,3227746815,AU -3227746816,3227747071,BR -3227747072,3227748035,CA -3227748036,3227748039,US -3227748040,3227749783,CA -3227749784,3227749787,US -3227749788,3227749839,CA -3227749840,3227749855,BZ -3227749856,3227751868,CA -3227751869,3227751869,US -3227751870,3227754143,CA -3227754144,3227754147,US -3227754148,3227755775,CA -3227755776,3227756031,US -3227756032,3227756505,CA -3227756506,3227756506,US -3227756507,3227757055,CA -3227757056,3227757311,US -3227757312,3227759871,CA -3227759872,3227759887,BZ -3227759888,3227760127,CA -3227760128,3227760383,US -3227760384,3227760415,CA -3227760416,3227760419,US -3227760420,3227760435,CA -3227760436,3227760439,US -3227760440,3227760647,CA -3227760648,3227760655,BZ -3227760656,3227761107,CA -3227761108,3227761111,BZ -3227761112,3227762655,CA -3227762656,3227762671,US -3227762672,3227763483,CA -3227763484,3227763487,US -3227763488,3227764095,CA -3227764096,3227764103,BZ -3227764104,3227764119,CA -3227764120,3227764123,BZ -3227764124,3227764375,CA -3227764376,3227764387,BZ -3227764388,3227765247,CA -3227765248,3227765759,US -3227765760,3227766095,CA -3227766096,3227766099,US -3227766100,3227766343,CA -3227766344,3227766347,US -3227766348,3227767295,CA -3227767296,3227767311,US -3227767312,3227769631,CA -3227769632,3227769635,US -3227769636,3227770587,CA -3227770588,3227770591,BZ -3227770592,3227770719,CA -3227770720,3227770727,BZ -3227770728,3227770735,CA -3227770736,3227770739,BZ -3227770740,3227770963,CA -3227770964,3227770967,US -3227770968,3227771263,CA -3227771264,3227771279,US -3227771280,3227771347,CA -3227771348,3227771351,US -3227771352,3227771619,CA -3227771620,3227771623,US -3227771624,3227772707,CA -3227772708,3227772711,US -3227772712,3227774751,CA -3227774752,3227774783,US -3227774784,3227775059,CA -3227775060,3227775063,US -3227775064,3227775423,CA -3227775424,3227775431,US -3227775432,3227775695,CA -3227775696,3227775707,BZ -3227775708,3227775731,CA -3227775732,3227775743,BZ -3227775744,3227775856,CA -3227775857,3227775857,ES -3227775858,3227775935,CA -3227775936,3227775939,US -3227775940,3227776983,CA -3227776984,3227776984,US -3227776985,3227777083,CA -3227777084,3227777087,US -3227777088,3227777759,CA -3227777760,3227777763,US -3227777764,3227777951,CA -3227777952,3227777967,US -3227777968,3227777983,CA -3227777984,3227777999,US -3227778000,3227778015,CA -3227778016,3227778019,BZ -3227778020,3227778135,CA -3227778136,3227778139,BZ -3227778140,3227779071,CA -3227779072,3227779327,US -3227779328,3227779583,ZA -3227779584,3227779839,AU -3227779840,3227783679,US -3227783680,3227783935,FR -3227783936,3227784703,US -3227784704,3227784959,AU -3227784960,3227785727,AT -3227785728,3227792383,US -3227792384,3227792639,GB -3227792640,3227792895,AU -3227792896,3227794687,US -3227794688,3227794943,GB -3227794944,3227795199,US -3227795200,3227795455,NO -3227795456,3227798783,US -3227798784,3227799039,TH -3227799040,3227799295,GB -3227799296,3227799551,US -3227799552,3227799807,AU -3227799808,3227801343,US -3227801344,3227801599,CA -3227801600,3227803647,US -3227803648,3227804415,DE -3227804416,3227804671,GB -3227804672,3227804927,US -3227804928,3227805183,CA -3227805184,3227805439,SG -3227805440,3227805695,GB -3227805696,3227806463,US -3227806464,3227806719,GB -3227806720,3227806975,US -3227806976,3227807039,SG -3227807040,3227807487,US -3227807488,3227807743,FI -3227807744,3227809023,GB -3227809024,3227809279,IN -3227809280,3227812543,GB -3227812544,3227812575,FI -3227812576,3227813375,GB -3227813376,3227813631,US -3227813632,3227815167,GB -3227815168,3227815935,US -3227815936,3227816191,GB -3227816192,3227818495,US -3227818496,3227818751,GB -3227818752,3227819263,MX -3227819264,3227819519,AR -3227819520,3227822079,MX -3227822336,3227822847,MX -3227822848,3227823103,HN -3227823104,3227824383,MX -3227824384,3227824639,BR -3227824640,3227825663,MX -3227825664,3227825919,CR -3227825920,3227826687,MX -3227826688,3227827199,AR -3227827200,3227829759,MX -3227829760,3227830015,BR -3227830016,3227831807,MX -3227831808,3227832063,BR -3227832064,3227833855,MX -3227833856,3227834367,BR -3227834368,3227837439,MX -3227837440,3227837951,BR -3227837952,3227842303,MX -3227842304,3227842815,BR -3227842816,3227843327,MX -3227843328,3227844095,BR -3227844096,3227844351,AR -3227844352,3227844607,US -3227844608,3227844863,CA -3227844864,3227845119,NL -3227845120,3227845631,US -3227845632,3227845887,RU -3227845888,3227846655,US -3227846656,3227846911,ES -3227846912,3227847423,US -3227847424,3227847679,GB -3227847680,3227848703,US -3227848704,3227848959,NZ -3227848960,3227851775,US -3227851776,3227852031,DE -3227852032,3227853311,US -3227853312,3227853567,GB -3227853568,3227860991,US -3227863296,3227863807,US -3227863808,3227864063,NL -3227864064,3227865343,US -3227865344,3227866111,NL -3227866112,3227866367,HK -3227866368,3227866623,US -3227866624,3227867647,NL -3227867648,3227867903,BR -3227867904,3227868159,TH -3227868160,3227872767,US -3227872768,3227873023,GB -3227873024,3227874047,NL -3227874048,3227874815,US -3227874816,3227875071,PT -3227875072,3227878911,US -3227878912,3227879167,AU -3227879168,3227879679,US -3227879680,3227879935,GB -3227879936,3227880959,US -3227880960,3227881215,EG -3227881216,3227883007,US -3227883008,3227883519,CA -3227883520,3227885823,US -3227885824,3227887871,ES -3227887872,3227888127,PR -3227888128,3227888383,BE -3227888384,3227889663,US -3227889664,3227889919,NL -3227890176,3227890431,US -3227890432,3227890943,DE -3227890944,3227891455,US -3227891456,3227891711,AU -3227891712,3227893759,US -3227893760,3227894015,FI -3227894016,3227895039,US -3227895040,3227895551,DE -3227895552,3227909119,US -3227909120,3227909375,NL -3227909376,3227909631,US -3227909632,3227909887,AU -3227909888,3227910399,US -3227910400,3227910655,AT -3227910656,3227911679,US -3227911680,3227912191,UA -3227912192,3227912447,GB -3227912448,3227912703,MU -3227912704,3227912959,US -3227912960,3227913215,CA -3227913216,3227914495,US -3227914496,3227914751,AT -3227914752,3227918591,FI -3227918592,3227918847,US -3227918848,3227931135,FI -3227931136,3227931391,US -3227931392,3227931647,AU -3227931648,3227931903,PE -3227931904,3227932927,US -3227932928,3227933183,DE -3227933184,3227933695,US -3227933696,3227933951,NZ -3227933952,3227934463,US -3227934464,3227934719,CH -3227934720,3227947519,US -3227947520,3227955711,DE -3227955712,3227964927,US -3227964928,3227965183,NL -3227965184,3227967487,US -3227967488,3227967743,NL -3227967744,3227967999,PL -3227968000,3227968255,US -3227968256,3227968767,GB -3227968768,3227969023,RU -3227969024,3227971327,US -3227971328,3227971583,AU -3227971584,3227974143,US -3227974144,3227974655,AU -3227974656,3227975167,US -3227975168,3227975679,CA -3227975680,3227976191,US -3227976192,3227976447,LU -3227976448,3227977471,US -3227977472,3227977727,FR -3227977728,3227979263,US -3227979264,3227979519,AE -3227979520,3227980799,US -3227980800,3227981055,GR -3227981056,3227981567,US -3227981568,3227981823,DE -3227981824,3227982591,US -3227982592,3227982847,DE -3227982848,3227985919,GB -3227985920,3227986175,DE -3227986176,3227986431,US -3227986688,3227986943,JP -3227986944,3227997439,US -3227997440,3228005631,FI -3228005632,3228008959,US -3228008960,3228009215,AU -3228009216,3228010751,US -3228010752,3228011519,GB -3228011520,3228013311,US -3228013312,3228013567,PT -3228013568,3228045055,US -3228045056,3228045311,KR -3228045312,3228047103,US -3228047104,3228047359,NL -3228047360,3228048383,US -3228048384,3228048895,GB -3228048896,3228050175,US -3228050176,3228050943,PT -3228050944,3228051199,CA -3228051200,3228051455,US -3228051712,3228051967,CH -3228051968,3228052223,US -3228052224,3228052991,AU -3228052992,3228053503,US -3228053504,3228053759,PT -3228053760,3228054783,US -3228054784,3228055039,GB -3228055040,3228055295,US -3228055296,3228055807,NL -3228055808,3228056319,NO -3228056320,3228059647,US -3228059648,3228059903,CH -3228059904,3228060927,US -3228060928,3228061183,DE -3228061184,3228061695,US -3228061952,3228062207,US -3228062208,3228062463,GB -3228062464,3228077055,US -3228077056,3228077311,NL -3228077312,3228077567,US -3228077568,3228077823,NL -3228077824,3228078847,US -3228078848,3228079103,GR -3228079104,3228080639,US -3228080640,3228080895,IE -3228080896,3228081151,FR -3228081152,3228083967,US -3228083968,3228084479,BE -3228084480,3228085247,US -3228085248,3228085503,JP -3228085504,3228100607,US -3228100608,3228101119,JP -3228101120,3228102143,US -3228102144,3228102399,GB -3228102400,3228103423,US -3228103424,3228103679,CA -3228103680,3228103935,US -3228103936,3228104191,FR -3228104192,3228104703,JP -3228104704,3228104959,DK -3228104960,3228105471,US -3228105472,3228105727,CH -3228105728,3228109311,US -3228109312,3228109567,AU -3228109568,3228125951,US -3228125952,3228126207,DE -3228126208,3228133375,US -3228133376,3228134655,CA -3228134656,3228150271,US -3228150272,3228150527,FI -3228150528,3228172287,US -3228172288,3228237823,IT -3228237824,3228238079,US -3228238336,3228238591,GB -3228238592,3228238847,US -3228238848,3228239359,GB -3228239616,3228240127,US -3228240128,3228240383,AU -3228240640,3228241407,GB -3228241408,3228250367,US -3228250624,3228250879,US -3228250880,3228263679,IT -3228263680,3228263935,AU -3228263936,3228264447,US -3228264448,3228264703,NI -3228264704,3228265983,US -3228265984,3228266239,IE -3228266240,3228266495,PR -3228266752,3228267007,NZ -3228267008,3228267263,NL -3228267264,3228269055,US -3228269056,3228269311,PT -3228269312,3228269567,DE -3228269568,3228270079,AT -3228270080,3228271103,GB -3228271104,3228271359,US -3228271360,3228271615,CA -3228271616,3228271871,DE -3228271872,3228272127,CA -3228272128,3228274687,US -3228274688,3228274943,CA -3228274944,3228280831,US -3228280832,3228281087,NL -3228281088,3228281599,US -3228281600,3228282111,AU -3228282112,3228282367,US -3228282368,3228282623,GB -3228282624,3228283135,US -3228283136,3228283391,GR -3228283392,3228283647,GB -3228283648,3228285695,US -3228285696,3228285951,SE -3228285952,3228289023,US -3228289024,3228297215,FI -3228297216,3228297727,AT -3228297728,3228297983,US -3228297984,3228298495,NL -3228298496,3228309247,US -3228309248,3228311039,DE -3228311296,3228311551,DE -3228311808,3228312063,DE -3228312320,3228316159,DE -3228316160,3228316415,US -3228316416,3228327167,DE -3228327168,3228328703,US -3228328704,3228328959,AU -3228328960,3228329471,NO -3228329472,3228330751,US -3228330752,3228331263,SE -3228331264,3228332287,US -3228332544,3228332799,GR -3228332800,3228334079,FR -3228334080,3228334335,GB -3228334336,3228334591,AT -3228334592,3228335359,US -3228335360,3228335615,SK -3228335616,3228335871,CZ -3228335872,3228336127,US -3228336128,3228336639,CZ -3228336640,3228337663,SK -3228337664,3228338431,CZ -3228338432,3228340735,SK -3228340736,3228341247,CZ -3228341248,3228341759,SK -3228341760,3228342271,CZ -3228342272,3228342783,SK -3228342784,3228343039,CZ -3228343040,3228343295,SK -3228343296,3228343551,CZ -3228343552,3228344063,SK -3228344064,3228344575,CZ -3228344576,3228347135,SK -3228347136,3228347391,CZ -3228347392,3228348159,SK -3228348160,3228353279,US -3228353280,3228358399,SE -3228358400,3228362239,US -3228362240,3228362495,TH -3228362496,3228363263,US -3228363264,3228363519,CH -3228363520,3228364287,US -3228364288,3228364543,AT -3228364544,3228368895,US -3228368896,3228379135,DE -3228379648,3228380415,DE -3228380416,3228380671,US -3228380672,3228380927,DE -3228381184,3228387839,DE -3228388096,3228388351,US -3228388352,3228392447,DE -3228392448,3228392959,US -3228392960,3228393727,DE -3228394240,3228394495,US -3228394752,3228395263,DE -3228395264,3228395775,US -3228395776,3228399615,DE -3228399616,3228399871,US -3228399872,3228400383,DE -3228400640,3228403711,DE -3228403968,3228404223,DE -3228404736,3228405503,FR -3228405504,3228405759,DE -3228405760,3228406015,FR -3228406016,3228406271,US -3228406272,3228406527,IN -3228406528,3228406783,BR -3228406784,3228407039,FR -3228407296,3228424703,DE -3228424704,3228424959,US -3228424960,3228426143,DE -3228426144,3228426151,US -3228426152,3228430335,DE -3228430848,3228431103,ZA -3228431872,3228434431,DE -3228434432,3228456191,US -3228456192,3228456447,CA -3228456448,3228457471,US -3228457472,3228457727,CA -3228457728,3228461567,US -3228461568,3228461823,CA -3228461824,3228478463,US -3228478464,3228479487,CA -3228479488,3228508159,US -3228508160,3228508415,AU -3228508416,3228508671,NO -3228508672,3228509951,US -3228509952,3228510207,NL -3228510208,3228511231,US -3228511232,3228511487,CZ -3228511488,3228511999,US -3228512000,3228512511,NL -3228512512,3228522495,US -3228522496,3228522751,GB -3228522752,3228525823,US -3228525824,3228526079,PT -3228526080,3228526335,NZ -3228526336,3228526591,CH -3228526592,3228526847,AT -3228526848,3228527103,AU -3228527104,3228531711,US -3228531712,3228532223,NO -3228532224,3228532479,US -3228532480,3228532735,DE -3228532736,3228533759,US -3228533760,3228534015,CA -3228534016,3228539903,US -3228539904,3228540927,BR -3228540928,3228558591,US -3228558592,3228559103,BR -3228559104,3228564479,US -3228564480,3228564735,AT -3228564736,3228572927,US -3228572928,3228573183,CA -3228573184,3228573951,PT -3228573952,3228577023,US -3228577024,3228577279,NL -3228577280,3228578047,US -3228578048,3228578303,GB -3228578304,3228581119,US -3228581120,3228581375,AT -3228581376,3228583423,US -3228583424,3228585983,ES -3228585984,3228590591,US -3228590592,3228590847,GB -3228590848,3228591103,DK -3228591104,3228591359,GB -3228591360,3228617727,US -3228617728,3228617983,FI -3228617984,3228618239,US -3228618240,3228618495,SE -3228618496,3228618751,US -3228618752,3228619007,DE -3228619008,3228620031,US -3228620032,3228620287,DE -3228620288,3228620543,CH -3228620544,3228620799,AU -3228620800,3228628735,US -3228628736,3228628991,ES -3228628992,3228630527,US -3228630528,3228630783,NL -3228630784,3228631039,US -3228631040,3228647423,NL -3228647424,3228647679,IT -3228647680,3228647935,ES -3228647936,3228696575,NL -3228696576,3228714764,IL -3228714765,3228714765,CA -3228714766,3228830719,IL -3228830720,3228833791,PS -3228833792,3229024255,IL -3229024256,3229089791,US -3229089792,3229090047,CA -3229090048,3229092095,US -3229092096,3229093887,AU -3229093888,3229151487,US -3229151488,3229151743,SE -3229151744,3229155327,US -3229155328,3229155583,GB -3229155584,3229155839,SE -3229155840,3229156095,ES -3229156096,3229159423,SE -3229159424,3229159935,NL -3229159936,3229160959,SE -3229160960,3229161471,DE -3229161472,3229161727,SE -3229161728,3229161983,GB -3229161984,3229163263,SE -3229163264,3229163519,ES -3229163520,3229164287,SE -3229164288,3229164543,DK -3229164544,3229165055,GB -3229165056,3229165311,NO -3229165312,3229167103,SE -3229167104,3229167615,IT -3229167616,3229171711,SE -3229171712,3229172223,GB -3229172224,3229172479,DE -3229172480,3229172735,SE -3229172736,3229172991,CH -3229172992,3229173503,SE -3229173504,3229173759,IT -3229173760,3229176319,SE -3229176320,3229176575,US -3229176576,3229182463,SE -3229182464,3229182975,GB -3229182976,3229183999,SE -3229184000,3229184511,GB -3229184512,3229186559,SE -3229186560,3229186815,IT -3229186816,3229187327,ES -3229187328,3229187583,IT -3229187584,3229187839,DK -3229187840,3229192959,SE -3229192960,3229193727,FR -3229193728,3229194239,SE -3229194240,3229194495,FR -3229194496,3229195007,SE -3229195008,3229195263,NL -3229195264,3229196287,DE -3229196288,3229196799,SE -3229196800,3229197311,NL -3229197312,3229197823,SE -3229197824,3229198335,GB -3229198336,3229198591,US -3229198592,3229198847,ES -3229198848,3229199103,CH -3229199104,3229199359,IT -3229199360,3229200383,SE -3229200384,3229200895,GB -3229200896,3229201151,DE -3229201152,3229201663,SE -3229201664,3229201919,DK -3229201920,3229202431,SE -3229202432,3229202687,ES -3229202688,3229203199,NL -3229203200,3229203967,GB -3229203968,3229204223,SE -3229204224,3229204479,IT -3229204480,3229205503,SE -3229205504,3229206015,GB -3229206016,3229211647,SE -3229211648,3229211903,IT -3229211904,3229212927,SE -3229212928,3229213183,DE -3229213184,3229218047,SE -3229218048,3229218303,CA -3229218304,3229218559,US -3229218560,3229218815,AU -3229218816,3229219583,SE -3229219584,3229219839,DE -3229219840,3229220863,SE -3229220864,3229221119,US -3229221120,3229221375,FR -3229221376,3229245439,GB -3229245440,3229246719,US -3229246720,3229250815,GB -3229250816,3229251071,US -3229251072,3229254399,GB -3229254400,3229256959,SG -3229256960,3229258495,GB -3229258496,3229259519,US -3229259520,3229264639,GB -3229264640,3229264895,AU -3229264896,3229265919,US -3229265920,3229266175,AU -3229266176,3229266943,US -3229266944,3229267199,AU -3229267200,3229273599,US -3229273600,3229273855,CA -3229273856,3229275647,US -3229275648,3229275903,GB -3229275904,3229276159,US -3229276160,3229276415,IE -3229276416,3229277951,GB -3229277952,3229278207,IE -3229278208,3229281023,GB -3229281024,3229281791,US -3229281792,3229283071,PT -3229283072,3229354495,US -3229354496,3229355775,AU -3229355776,3229358079,US -3229358080,3229359359,DE -3229359360,3229359615,US -3229359616,3229359871,CA -3229359872,3229360127,US -3229360128,3229360383,AT -3229360384,3229361919,US -3229361920,3229362175,BE -3229362176,3229363711,US -3229363712,3229363967,NL -3229363968,3229380607,US -3229380608,3229380863,DE -3229380864,3229381375,US -3229381376,3229381631,DE -3229381632,3229381887,PL -3229381888,3229382143,AU -3229382144,3229390847,US -3229390848,3229391103,AU -3229391104,3229391359,US -3229391360,3229391615,CN -3229391616,3229391871,AT -3229391872,3229395455,US -3229395456,3229401087,RU -3229401088,3229405183,GB -3229405184,3229408255,RU -3229408256,3229412095,US -3229412096,3229412351,DE -3229412352,3229412607,US -3229412608,3229414911,DE -3229414912,3229415167,US -3229415168,3229415679,DE -3229415680,3229415935,US -3229415936,3229483007,DE -3229483008,3229483263,US -3229483264,3229499647,FI -3229499648,3229614847,US -3229614848,3229615103,GB -3229615104,3229679871,US -3229679872,3229695487,DE -3229695488,3229700095,US -3229700096,3229700351,AT -3229700352,3229701887,US -3229701888,3229702143,TR -3229702144,3229704703,US -3229704704,3229704959,DE -3229704960,3229745151,US -3229745152,3229810687,FI -3229810688,3229814015,US -3229814016,3229814271,AU -3229814272,3229815807,US -3229815808,3229816063,DE -3229816064,3229817087,US -3229817088,3229817343,AU -3229817344,3229817599,NL -3229817600,3229818623,AU -3229818624,3229818879,US -3229818880,3229820927,JM -3229820928,3229821951,US -3229821952,3229822207,CA -3229822208,3229830911,US -3229830912,3229831167,NL -3229831168,3229833471,US -3229833472,3229833727,GB -3229833728,3229834239,IN -3229834240,3229834495,AU -3229834496,3229834751,US -3229834752,3229835007,CA -3229835008,3229835263,US -3229835264,3229835519,FI -3229835520,3229835775,CA -3229835776,3229838335,US -3229838336,3229838591,GB -3229838592,3229838847,CA -3229838848,3229844479,US -3229844480,3229844735,FR -3229844736,3229844991,US -3229844992,3229845247,BL -3229845248,3229845503,US -3229845504,3229846015,GB -3229846016,3229846527,CA -3229847296,3229870335,US -3229870592,3229870847,CA -3229870848,3229874943,US -3229874944,3229875455,AU -3229875456,3229876223,US -3229876224,3229876479,CA -3229876480,3229878527,US -3229878528,3229878783,GB -3229878784,3229879039,IT -3229879040,3229879295,NO -3229879296,3229880063,US -3229880064,3229880319,KR -3229880320,3229881087,US -3229881088,3229881343,CA -3229881344,3229884159,US -3229884160,3229884415,JP -3229884416,3229884927,US -3229884928,3229885183,NL -3229885184,3229885439,BR -3229885440,3229886719,US -3229886720,3229886975,AU -3229886976,3229889791,US -3229889792,3229890047,PT -3229890048,3229890303,US -3229890304,3229890559,PT -3229890560,3229891583,US -3229891584,3229891839,CA -3229891840,3229900031,US -3229900032,3229900287,AU -3229900288,3229901567,US -3229901568,3229901823,GB -3229901824,3229937407,US -3229937408,3229937663,GB -3229937664,3229937919,US -3229937920,3229938175,CA -3229938176,3229938687,US -3229938688,3229938943,IL -3229938944,3229939199,NL -3229939200,3229939455,US -3229939456,3229940735,KR -3229940736,3229940991,CH -3229940992,3229941247,AU -3229941248,3229945343,US -3229945600,3229945855,PT -3229945856,3229947135,US -3229947136,3229947391,AU -3229947392,3229948927,US -3229948928,3229949183,IT -3229949184,3229949695,US -3229949696,3229949951,AU -3229949952,3229950207,NO -3229950208,3229950975,US -3229950976,3229951231,IL -3229951232,3229952255,US -3229952256,3229952511,AU -3229952512,3229953279,US -3229953280,3229953535,CA -3229953536,3229955327,US -3229955328,3229955583,NL -3229955584,3229956095,PT -3229956096,3229956607,US -3229956608,3229956863,GB -3229956864,3229958143,US -3229958144,3229958399,NO -3229958400,3229958655,US -3229958912,3229959167,SG -3229959168,3229962079,US -3229962080,3229962111,CA -3229962112,3229969407,US -3229969408,3229969663,PT -3229969664,3229969919,AT -3229969920,3229970431,FI -3229970432,3229972735,US -3229972736,3229972991,SE -3229972992,3229975295,US -3229975296,3229975551,GB -3229975552,3230004223,US -3230004224,3230004479,NL -3230004480,3230005759,US -3230005760,3230006015,ZA -3230006016,3230007039,US -3230007040,3230007295,CA -3230007296,3230072831,FR -3230072832,3230074623,US -3230074624,3230074879,DE -3230074880,3230082559,IT -3230082560,3230083071,US -3230083072,3230084095,CA -3230084096,3230084607,US -3230084608,3230084863,NO -3230084864,3230085119,US -3230085120,3230085375,CA -3230085376,3230085887,US -3230085888,3230086143,DE -3230086144,3230086655,GB -3230086656,3230089727,US -3230089728,3230089983,GB -3230089984,3230090239,US -3230090240,3230090495,GB -3230090496,3230092543,US -3230092544,3230092799,CA -3230092800,3230093823,US -3230093824,3230094079,NL -3230094080,3230094335,CA -3230094336,3230095615,US -3230095872,3230096383,PK -3230096640,3230096895,US -3230096896,3230097151,JP -3230097408,3230100735,JP -3230100736,3230100991,US -3230100992,3230101503,PR -3230101504,3230104319,US -3230104320,3230104575,CA -3230104576,3230105855,US -3230105856,3230106111,NL -3230106112,3230106879,US -3230106880,3230107135,AT -3230107136,3230109439,US -3230109440,3230109695,NO -3230109696,3230109951,US -3230109952,3230115071,CH -3230115072,3230115327,IT -3230115328,3230115583,GR -3230115584,3230116095,BE -3230116096,3230117631,US -3230117632,3230117887,FR -3230117888,3230120191,US -3230120448,3230120703,US -3230120704,3230120959,PT -3230120960,3230125823,US -3230125824,3230126335,AU -3230126336,3230126591,US -3230126848,3230128895,US -3230128896,3230129151,PT -3230129152,3230129663,US -3230129664,3230129919,JP -3230129920,3230130431,US -3230130432,3230130687,IE -3230130688,3230131711,US -3230131712,3230131967,CA -3230131968,3230132991,GB -3230132992,3230137599,US -3230137600,3230138111,NL -3230138112,3230140159,US -3230140160,3230140415,MT -3230140416,3230140671,US -3230140672,3230140927,FI -3230140928,3230142975,US -3230142976,3230143231,GB -3230143232,3230143487,BE -3230143488,3230144255,US -3230144256,3230144511,NL -3230144512,3230145279,US -3230145280,3230145535,CA -3230145536,3230145791,US -3230145792,3230146047,GB -3230146048,3230146303,FR -3230146304,3230146559,PT -3230146560,3230148351,US -3230148352,3230148607,AU -3230148608,3230148863,GB -3230148864,3230149119,CH -3230149120,3230150655,NI -3230150656,3230150911,US -3230150912,3230151167,PT -3230151168,3230151423,US -3230151424,3230151679,NL -3230151680,3230151935,PT -3230151936,3230152191,CA -3230152192,3230152447,FR -3230152448,3230153215,BF -3230153216,3230153471,FR -3230153472,3230153727,PF -3230153728,3230153983,US -3230153984,3230154239,RU -3230154240,3230156543,US -3230156544,3230164735,FI -3230164736,3230167551,US -3230167552,3230168063,CA -3230168064,3230177791,US -3230177792,3230178303,GB -3230178304,3230178559,CH -3230178560,3230214911,US -3230214912,3230215167,PR -3230215168,3230219775,US -3230219776,3230220031,NL -3230220032,3230220287,US -3230220288,3230222847,NL -3230222848,3230223103,ES -3230223104,3230223359,GB -3230223360,3230223615,CH -3230223616,3230225919,LU -3230225920,3230226175,AU -3230226176,3230226431,ES -3230226432,3230226687,US -3230226688,3230226943,NO -3230226944,3230228223,GB -3230228224,3230228479,ES -3230228480,3230228735,AU -3230228736,3230229759,US -3230229760,3230230015,DE -3230230016,3230236415,US -3230236416,3230236671,GB -3230236672,3230236927,CA -3230236928,3230240767,US -3230240768,3230241023,DK -3230241024,3230241791,GB -3230241792,3230242303,CH -3230242304,3230243839,US -3230243840,3230244095,HK -3230244096,3230244351,US -3230244352,3230244607,CA -3230244608,3230245119,FR -3230245120,3230246143,SE -3230246144,3230246911,US -3230246912,3230247167,CH -3230247168,3230247935,US -3230247936,3230248191,AU -3230248192,3230251007,US -3230251008,3230251263,CH -3230251264,3230251519,MX -3230251520,3230252031,CH -3230252032,3230254847,US -3230254848,3230255359,SE -3230255360,3230255615,ES -3230255616,3230257919,US -3230257920,3230259199,CH -3230259200,3230263807,US -3230263808,3230264063,SE -3230264064,3230264319,NL -3230264320,3230266111,CH -3230266112,3230267135,US -3230267136,3230267903,CA -3230267904,3230269695,US -3230269696,3230271743,GB -3230271744,3230291455,US -3230291456,3230291711,PT -3230291712,3230295039,US -3230295040,3230295295,AU -3230295296,3230296319,US -3230296320,3230297343,NO -3230297344,3230300159,SE -3230301696,3230309119,US -3230309120,3230309375,NO -3230309376,3230310143,GB -3230310144,3230316287,US -3230316288,3230316543,IT -3230316544,3230316799,US -3230316800,3230317311,CA -3230317312,3230318591,US -3230318592,3230318847,GB -3230318848,3230321663,US -3230321664,3230321919,PT -3230321920,3230323455,US -3230323456,3230323711,AT -3230323712,3230327807,US -3230327808,3230328063,AT -3230328064,3230328319,GB -3230328320,3230329087,CH -3230329088,3230332927,US -3230332928,3230333183,GB -3230333184,3230333695,US -3230333696,3230333951,NZ -3230333952,3230335231,US -3230335232,3230335743,CA -3230335744,3230335999,US -3230336000,3230336255,CA -3230336256,3230336511,US -3230336512,3230339583,CA -3230339584,3230339839,US -3230339840,3230340095,CA -3230340096,3230340351,US -3230340352,3230350847,CA -3230350848,3230351103,US -3230351104,3230354943,CA -3230354944,3230355199,FR -3230355200,3230365183,CA -3230365184,3230365439,US -3230365440,3230367743,CA -3230367744,3230367999,US -3230368000,3230368511,CA -3230368512,3230370303,US -3230370304,3230370559,CA -3230370560,3230370815,US -3230370816,3230372607,CA -3230372608,3230372863,US -3230372864,3230374399,CA -3230374400,3230374655,US -3230374656,3230383359,CA -3230383360,3230383615,US -3230383616,3230384127,CA -3230384128,3230384383,MF -3230384384,3230387455,CA -3230387456,3230387711,US -3230387712,3230400255,CA -3230400256,3230402559,US -3230402560,3230404607,BR -3230404608,3230405631,AR -3230405632,3230406655,CL -3230406656,3230414847,BR -3230414848,3230415871,CL -3230415872,3230416895,AR -3230416896,3230424063,BR -3230424064,3230425087,EC -3230425088,3230432255,BR -3230432256,3230432767,CO -3230432768,3230433023,AR -3230433024,3230433279,BR -3230433280,3230436351,CN -3230436352,3230437375,AU -3230437376,3230439423,PK -3230439424,3230440447,IN -3230440448,3230455807,CN -3230456832,3230457855,IN -3230457856,3230458367,ID -3230458368,3230458879,AU -3230458880,3230459903,IN -3230459904,3230460927,AU -3230460928,3230463999,IN -3230464000,3230465023,AU -3230465024,3230466047,BD -3230466048,3230467071,BR -3230467072,3230468095,HN -3230468096,3230469119,EC -3230469120,3230471167,BR -3230471168,3230472191,AR -3230472192,3230475263,BR -3230475264,3230476287,EC -3230476288,3230477311,PE -3230477312,3230478335,MX -3230478336,3230479359,CL -3230479360,3230482431,BR -3230482432,3230483455,CL -3230483456,3230489599,BR -3230489600,3230490623,AR -3230490624,3230497791,BR -3230497792,3230498815,MX -3230498816,3230499839,DO -3230499840,3230503935,BR -3230503936,3230504959,AR -3230504960,3230508031,BR -3230508032,3230509055,HN -3230509056,3230510079,CL -3230510080,3230511103,BR -3230511104,3230513151,AR -3230513152,3230519295,BR -3230519296,3230520319,AR -3230520320,3230521343,CL -3230521344,3230524415,BR -3230524416,3230525439,AR -3230525440,3230528511,BR -3230528512,3230529535,MX -3230529536,3230531583,BR -3230531584,3230662655,ZA -3230679040,3230681087,BR -3230681088,3230682623,FR -3230682624,3230683135,PK -3230683136,3230686207,BD -3230686208,3230687231,ID -3230687232,3230691327,BR -3230691328,3230692351,PE -3230692352,3230695423,BR -3230695424,3230728191,CN -3230777344,3230784511,BR -3230784512,3230785535,MX -3230785536,3230823679,US -3230823680,3230823935,DK -3230823936,3230824191,US -3230824192,3230824447,FR -3230824448,3230825215,US -3230825216,3230825471,GB -3230825472,3230826239,ES -3230826240,3230827519,US -3230827520,3230827775,AT -3230827776,3230828031,NZ -3230828032,3230828543,HU -3230828544,3230829055,GB -3230829568,3230830079,RU -3230830080,3230832127,US -3230832128,3230832383,NZ -3230832384,3230832639,US -3230832640,3230832895,FI -3230832896,3230833663,US -3230833664,3230833919,CA -3230833920,3230834175,BR -3230834176,3230835455,US -3230835456,3230837503,NO -3230837504,3230837759,US -3230837760,3230838015,ES -3230838016,3230840319,IT -3230840320,3230840575,FR -3230840576,3230840831,US -3230840832,3230841087,JP -3230841088,3230841343,DE -3230841344,3230841599,US -3230841600,3230841855,ES -3230841856,3230843135,US -3230843136,3230843391,NO -3230843392,3230844927,US -3230844928,3230845183,AU -3230845184,3230845951,US -3230845952,3230846207,CZ -3230846208,3230849535,US -3230849536,3230850047,NZ -3230850048,3230851839,US -3230851840,3230852095,NO -3230852096,3230852351,GB -3230852352,3230852607,BR -3230852608,3230853119,CA -3230853376,3230853887,FR -3230853888,3230854399,US -3230854400,3230854655,UY -3230854656,3230855167,NO -3230855168,3230855679,US -3230855680,3230855935,IT -3230855936,3230857983,US -3230857984,3230858751,AU -3230858752,3230865151,US -3230865152,3230865407,GB -3230865408,3230867967,US -3230867968,3230868223,IS -3230868224,3230868479,US -3230868480,3230868735,GB -3230868736,3230870015,US -3230870016,3230870271,PL -3230870272,3230878719,US -3230878720,3230879487,PT -3230879488,3230879743,FR -3230879744,3230895359,US -3230895360,3230895615,PL -3230895616,3230897151,US -3230897408,3230897663,US -3230897664,3230897919,GB -3230898688,3230898943,US -3230898944,3230899199,PT -3230899200,3230902271,US -3230902272,3230902527,NL -3230902528,3230913023,US -3230913024,3230913279,BR -3230913280,3230913535,US -3230913536,3230913791,GB -3230913792,3230914047,CA -3230914048,3230914303,US -3230914304,3230914815,FI -3230914816,3230915071,GB -3230915072,3230915327,BR -3230915328,3230915583,GB -3230915584,3230917631,US -3230917632,3230917887,GB -3230917888,3230918399,US -3230918400,3230918655,LC -3230918656,3230919423,US -3230919424,3230919679,AU -3230919680,3230922239,US -3230922240,3230922495,AU -3230922496,3230922751,IT -3230922752,3230923519,US -3230923776,3230933247,US -3230933248,3230948607,SE -3230948608,3230951167,US -3230951168,3230951423,PT -3230951424,3230953215,US -3230953216,3230954495,CA -3230954496,3230967295,AU -3230967296,3230967551,RU -3230967552,3230967807,ES -3230967808,3230969599,US -3230969600,3230969855,MX -3230969856,3230970111,US -3230970112,3230972671,GB -3230972672,3230973951,US -3230973952,3230974207,NL -3230974208,3230974463,IT -3230974464,3230974719,GB -3230974720,3230975487,US -3230975488,3230975999,GB -3230976000,3230976255,NL -3230976256,3230980095,ES -3230980096,3230980351,GB -3230980352,3230980607,CA -3230980608,3230981119,US -3230981120,3230981375,IT -3230981376,3230981631,AU -3230981632,3230981887,US -3230981888,3230984191,AU -3230984192,3230991103,US -3230991104,3230991359,PL -3230991360,3230991615,US -3230991616,3230991871,FI -3230991872,3230994175,US -3230994176,3230994431,GB -3230994432,3230995199,US -3230995200,3230995455,ES -3230995456,3230995711,AU -3230995712,3230996223,US -3230996224,3230996479,CA -3230996480,3230997247,US -3230997248,3230997503,AT -3230997504,3230997759,US -3230997760,3230999039,NL -3230999040,3230999295,US -3230999296,3230999551,NL -3230999552,3230999807,AU -3230999808,3231000831,US -3231000832,3231001087,FR -3231001088,3231003903,US -3231003904,3231004159,CA -3231004160,3231004415,AU -3231004416,3231004927,US -3231004928,3231005183,GB -3231005184,3231005439,US -3231005440,3231005695,FR -3231005696,3231005951,GB -3231005952,3231006207,US -3231006208,3231007487,CA -3231007488,3231010047,US -3231010048,3231010303,FR -3231010304,3231010815,NO -3231010816,3231011071,CA -3231011328,3231011583,US -3231011584,3231011839,CA -3231011840,3231013375,US -3231013376,3231013887,CA -3231013888,3231015423,US -3231015424,3231015679,GB -3231015680,3231015935,US -3231015936,3231016191,NO -3231016192,3231016447,US -3231016448,3231016703,NO -3231016704,3231016959,US -3231016960,3231017215,CA -3231017216,3231018495,US -3231018496,3231018751,IT -3231018752,3231019007,GB -3231019008,3231020287,US -3231020288,3231020543,GB -3231020544,3231020799,NL -3231020800,3231021567,GB -3231021568,3231021823,US -3231021824,3231022079,CA -3231022080,3231022591,US -3231022592,3231022847,DE -3231022848,3231042047,US -3231042048,3231042303,GU -3231042304,3231043839,US -3231043840,3231044095,JP -3231044096,3231048447,US -3231048448,3231048703,NL -3231048704,3231049727,US -3231049728,3231049983,AT -3231049984,3231051263,US -3231051264,3231051519,GB -3231051776,3231070463,US -3231070720,3231074559,SE -3231074560,3231075071,US -3231075072,3231075583,NL -3231075584,3231075839,US -3231075840,3231077119,SE -3231077120,3231077375,PL -3231077376,3231077631,SE -3231077632,3231078655,US -3231078656,3231078911,GB -3231078912,3231079423,CA -3231079424,3231079679,NL -3231079680,3231079935,US -3231079936,3231080191,NL -3231080192,3231082495,US -3231082496,3231082751,PL -3231082752,3231083007,US -3231083008,3231083263,GB -3231083520,3231087615,US -3231087616,3231087871,NO -3231087872,3231088127,US -3231088128,3231088383,GT -3231088384,3231088895,US -3231088896,3231091711,AU -3231091712,3231091967,GB -3231091968,3231092735,US -3231092992,3231093247,US -3231093248,3231093503,IT -3231093504,3231101183,US -3231101184,3231103231,GB -3231103232,3231103487,CA -3231103488,3231103999,US -3231104000,3231104255,NO -3231104256,3231104767,DE -3231104768,3231105023,US -3231105024,3231105535,PT -3231105536,3231106303,IT -3231106304,3231106559,NO -3231106560,3231106815,GB -3231106816,3231107071,US -3231107328,3231107583,US -3231107584,3231107839,AU -3231107840,3231108095,AT -3231108096,3231108351,GB -3231108352,3231108607,RU -3231108608,3231109119,US -3231109120,3231109375,GB -3231109376,3231109631,NO -3231109632,3231111679,US -3231111680,3231112191,NZ -3231112448,3231112959,US -3231112960,3231113215,NO -3231113216,3231113983,US -3231113984,3231115775,GB -3231115776,3231116799,AU -3231116800,3231117055,HU -3231117056,3231118847,US -3231118848,3231119103,AU -3231119104,3231119359,US -3231119360,3231119615,GB -3231119616,3231120383,TH -3231120384,3231120639,NO -3231120640,3231120895,US -3231120896,3231121151,NO -3231121152,3231149311,US -3231149312,3231149567,CA -3231149568,3231155199,US -3231155200,3231156223,CA -3231156224,3231166463,US -3231166464,3231170559,CA -3231170560,3231174655,US -3231174656,3231178751,CN -3231178752,3231179263,HK -3231179264,3231180287,US -3231180288,3231180799,HK -3231180800,3231181823,US -3231181824,3231182079,CN -3231182080,3231182847,US -3231182848,3231183871,HK -3231183872,3231184895,CN -3231184896,3231185151,US -3231185152,3231185919,CN -3231185920,3231186687,US -3231186688,3231186943,CN -3231186944,3231188479,US -3231188480,3231188735,NO -3231188736,3231190527,US -3231190528,3231190783,GB -3231190784,3231191295,US -3231191296,3231191551,GB -3231191552,3231193599,US -3231193600,3231194111,DE -3231194112,3231197695,US -3231197696,3231197951,FR -3231197952,3231198207,US -3231198208,3231198463,GB -3231198464,3231198975,US -3231198976,3231199231,PT -3231199232,3231199487,GB -3231199488,3231200255,NL -3231200256,3231200767,US -3231200768,3231201023,AT -3231201024,3231202559,US -3231202560,3231203071,GB -3231203072,3231203327,AT -3231203328,3231204351,US -3231204352,3231204607,FI -3231204608,3231204863,JP -3231204864,3231207167,US -3231207168,3231207423,CA -3231207424,3231207935,US -3231207936,3231208191,DE -3231208192,3231208959,US -3231209472,3231210239,US -3231210240,3231210495,CA -3231210496,3231211775,US -3231211776,3231212031,CA -3231212032,3231212287,CH -3231212288,3231214335,US -3231214336,3231214591,CA -3231214592,3231215359,US -3231215360,3231215615,NO -3231215616,3231215871,GB -3231215872,3231217407,US -3231217408,3231217663,AU -3231217664,3231218175,US -3231218176,3231218431,GB -3231218432,3231218687,US -3231218688,3231218943,BE -3231218944,3231223039,US -3231223040,3231223295,IT -3231223296,3231225599,US -3231225600,3231225855,DE -3231225856,3231226879,US -3231226880,3231227135,GB -3231227136,3231227391,US -3231227392,3231227647,CA -3231227648,3231228927,US -3231228928,3231229183,PR -3231229184,3231229439,CA -3231229440,3231229695,IT -3231229696,3231229951,FR -3231229952,3231231487,US -3231231488,3231231743,PT -3231231744,3231234047,US -3231234048,3231235071,GB -3231235072,3231236863,US -3231236864,3231237119,CA -3231237120,3231241215,US -3231241216,3231241471,AU -3231241472,3231241727,CA -3231241728,3231244287,US -3231244288,3231244543,CA -3231244544,3231248639,US -3231248640,3231248895,GB -3231248896,3231249407,US -3231249408,3231249663,GB -3231249664,3231250431,US -3231250432,3231250687,CA -3231250688,3231251711,US -3231251712,3231251967,GB -3231251968,3231252223,AT -3231252224,3231252991,US -3231252992,3231253503,GB -3231253504,3231255551,US -3231255808,3231256063,PT -3231256064,3231257087,US -3231257088,3231257599,HU -3231257600,3231275007,US -3231275008,3231275263,BR -3231275264,3231275519,CH -3231275520,3231276287,US -3231276288,3231276543,AU -3231276544,3231276799,US -3231276800,3231281919,JP -3231281920,3231282175,US -3231282176,3231282431,HU -3231282432,3231282943,US -3231282944,3231283199,CL -3231283200,3231283455,BR -3231283456,3231284991,US -3231284992,3231285247,NL -3231285248,3231291647,US -3231291648,3231291903,NL -3231291904,3231292159,US -3231292160,3231292415,MX -3231292416,3231292927,US -3231292928,3231293183,AU -3231293184,3231294975,US -3231294976,3231295231,NL -3231295232,3231295487,CR -3231295488,3231295743,BE -3231295744,3231296255,US -3231296512,3231296767,US -3231296768,3231299327,AT -3231299328,3231300095,US -3231300096,3231300351,CA -3231300352,3231300607,US -3231300608,3231300863,SE -3231300864,3231301119,GB -3231301120,3231302143,US -3231302144,3231302399,NL -3231302400,3231302655,US -3231302656,3231303167,AU -3231303168,3231307007,US -3231307008,3231307263,GB -3231307264,3231308031,US -3231308032,3231308287,CA -3231308288,3231308799,US -3231308800,3231309055,CA -3231309824,3231316735,US -3231316736,3231316991,NZ -3231316992,3231321343,US -3231321344,3231321599,CA -3231321600,3231322111,US -3231322112,3231322367,JP -3231322368,3231324159,SG -3231324160,3231324671,JP -3231324672,3231325183,US -3231325184,3231326207,CA -3231326208,3231352831,US -3231352832,3231358975,CA -3231358976,3231369215,US -3231369216,3231369471,TW -3231369472,3231383551,US -3231383552,3231383807,CA -3231383808,3231385343,NO -3231385344,3231401215,US -3231401216,3231401471,CA -3231401472,3231408559,US -3231408560,3231408567,AU -3231408568,3231408767,US -3231408768,3231408783,DE -3231408784,3231408871,US -3231408872,3231408879,AU -3231408880,3231411055,US -3231411056,3231411063,AU -3231411064,3231411855,US -3231411856,3231411871,AU -3231411872,3231423999,US -3231424000,3231424511,PR -3231424512,3231475199,US -3231475200,3231475455,PL -3231475456,3231477759,US -3231477760,3231478015,CA -3231478016,3231482879,US -3231482880,3231483135,BE -3231483136,3231484927,US -3231484928,3231487999,JP -3231488512,3231488767,JP -3231489280,3231489535,US -3231489536,3231489791,JP -3231489792,3231490047,AU -3231490048,3231490559,US -3231490560,3231490815,GB -3231490816,3231491327,US -3231491328,3231491583,NZ -3231491584,3231491839,US -3231491840,3231492095,GB -3231492096,3231492351,US -3231492352,3231492607,GB -3231492608,3231493631,US -3231493632,3231493887,CH -3231493888,3231500031,US -3231500032,3231500287,BM -3231500288,3231502079,US -3231502080,3231502335,AU -3231502592,3231502847,US -3231502848,3231503103,PT -3231503104,3231503615,US -3231503616,3231503871,IT -3231503872,3231506687,US -3231506688,3231506943,AU -3231506944,3231507199,US -3231507200,3231507455,BE -3231507456,3231510271,US -3231510272,3231510527,GB -3231510528,3231512575,US -3231512576,3231512831,LU -3231513088,3231514879,US -3231514880,3231515647,NO -3231515648,3231516671,US -3231516672,3231519231,SE -3231519232,3231526911,US -3231526912,3231527423,CA -3231527424,3231528191,US -3231528192,3231528287,CA -3231528288,3231528303,US -3231528304,3231528311,NO -3231528312,3231528383,US -3231528384,3231528703,CA -3231528704,3231528959,US -3231528960,3231528975,CA -3231528976,3231528983,US -3231528984,3231528999,CA -3231529000,3231529015,US -3231529016,3231529191,CA -3231529192,3231529199,US -3231529200,3231529215,CA -3231529216,3231529471,US -3231529472,3231529679,CA -3231529680,3231529687,US -3231529688,3231529727,CA -3231529728,3231529983,US -3231529984,3231530239,CA -3231530240,3231530495,IN -3231530496,3231530751,CA -3231530752,3231539199,US -3231539200,3231547391,CA -3231547392,3231547647,US -3231547648,3231547903,NO -3231547904,3231549951,US -3231549952,3231550207,JP -3231550208,3231550719,DE -3231550720,3231550975,GB -3231550976,3231551231,US -3231551232,3231551999,CA -3231552000,3231553023,US -3231553024,3231553791,JP -3231553792,3231554047,CH -3231554048,3231555327,DE -3231555328,3231555583,CA -3231555584,3231556607,US -3231556608,3231556863,CA -3231556864,3231557631,US -3231557632,3231557887,AT -3231557888,3231558399,GB -3231558400,3231558655,DE -3231558656,3231558911,GB -3231558912,3231559167,CA -3231559168,3231559423,GB -3231559424,3231559679,US -3231559680,3231559935,GB -3231559936,3231561983,US -3231561984,3231562239,IT -3231562240,3231562495,US -3231562496,3231562751,GB -3231562752,3231563007,US -3231563008,3231563263,CH -3231563264,3231563519,ZA -3231563776,3231583231,US -3231583232,3231584255,CA -3231584256,3231588863,US -3231588864,3231589119,GB -3231589120,3231591679,US -3231591680,3231591935,AU -3231591936,3231596031,US -3231596032,3231596543,PR -3231596544,3231634943,US -3231634944,3231635455,CA -3231635456,3231641855,US -3231641856,3231642111,SG -3231642112,3231649791,US -3231649792,3231653631,SG -3231653632,3231663615,US -3231663616,3231663871,FI -3231663872,3231664127,CA -3231664128,3231664383,US -3231664384,3231664639,GB -3231664640,3231665407,US -3231665408,3231665663,IT -3231665664,3231667199,US -3231667200,3231667711,ES -3231667712,3231668735,US -3231668736,3231668991,BE -3231668992,3231669759,US -3231669760,3231670015,CA -3231670016,3231670271,DE -3231670272,3231671039,US -3231671040,3231672319,GB -3231672320,3231672575,US -3231672576,3231672831,NL -3231672832,3231673343,US -3231673344,3231673599,NO -3231673600,3231673855,IE -3231673856,3231674111,US -3231674112,3231674367,CA -3231674368,3231675391,US -3231675392,3231675903,BR -3231675904,3231676159,IE -3231676160,3231676671,US -3231676672,3231676927,FR -3231676928,3231677183,FI -3231677184,3231690751,US -3231690752,3231692799,CA -3231692800,3231694847,US -3231694848,3231711231,CA -3231711232,3231713023,US -3231713024,3231713279,CA -3231713280,3231713791,US -3231713792,3231714047,GB -3231714048,3231715071,US -3231715072,3231715327,NL -3231715328,3231715583,AU -3231715584,3231716095,US -3231716096,3231716351,AU -3231716352,3231716607,US -3231716608,3231716863,TR -3231716864,3231717119,LU -3231717120,3231717375,NO -3231717376,3231718143,US -3231718144,3231718399,IT -3231718400,3231719679,US -3231719680,3231719935,ES -3231720192,3231720703,US -3231720704,3231720959,IT -3231720960,3231722751,US -3231722752,3231723007,BR -3231723008,3231724031,US -3231724032,3231724287,BR -3231724288,3231727871,US -3231727872,3231728127,DE -3231728128,3231728383,US -3231728384,3231728639,AT -3231728640,3231729407,US -3231729408,3231729663,AU -3231729664,3231735551,US -3231735552,3231736063,CH -3231736064,3231737343,US -3231737344,3231737599,CA -3231737600,3231738367,US -3231738368,3231738623,NL -3231738624,3231739135,US -3231739136,3231739391,GB -3231739392,3231739647,PL -3231739904,3231742719,US -3231742720,3231742975,FR -3231742976,3231743487,US -3231743488,3231743743,NO -3231743744,3231743999,US -3231744000,3231744255,BR -3231744256,3231747583,US -3231747584,3231747839,NL -3231747840,3231748095,GB -3231748096,3231750143,US -3231750144,3231750399,NL -3231750400,3231750911,US -3231751168,3231751423,IT -3231751424,3231752191,US -3231752192,3231752447,IT -3231752448,3231752703,AU -3231752704,3231753983,US -3231753984,3231754239,CA -3231754240,3231754495,US -3231754496,3231755263,AU -3231755264,3231755519,HU -3231755520,3231755775,US -3231755776,3231756543,PR -3231756544,3231757311,GB -3231757312,3231759359,US -3231759360,3231759615,BR -3231759616,3231760895,US -3231760896,3231761407,GB -3231761408,3231763711,US -3231763712,3231763967,AU -3231763968,3231768575,US -3231768576,3231768831,RU -3231768832,3231769087,NO -3231769344,3231769855,US -3231769856,3231770111,AU -3231770112,3231770367,US -3231770368,3231770879,AT -3231770880,3231771135,RU -3231771136,3231773951,US -3231773952,3231775231,PT -3231775232,3231775487,KY -3231775488,3231775999,NL -3231776000,3231776511,US -3231776512,3231776767,CA -3231776768,3231793151,US -3231793152,3231793663,BE -3231793664,3231799807,US -3231799808,3231800319,HK -3231800320,3231801343,CN -3231801344,3231809535,CA -3231809536,3231810047,NZ -3231810048,3231842303,US -3231842304,3231843327,RU -3231843328,3231844351,NO -3231844352,3231845375,RU -3231845376,3231846399,ES -3231846400,3231846655,RO -3231846656,3231846911,PT -3231846912,3231847167,GB -3231847168,3231847423,UA -3231847424,3231848447,RU -3231848448,3231849471,ES -3231849472,3231850495,CH -3231850496,3231851519,UA -3231851520,3231853567,RU -3231853568,3231855615,PL -3231855616,3231856639,RS -3231856640,3231857663,RU -3231857664,3231858687,PL -3231858688,3231859711,RU -3231859712,3231860735,FR -3231860736,3231861759,SA -3231861760,3231863807,UA -3231863808,3231864831,DE -3231864832,3231865855,RU -3231865856,3231866879,PL -3231866880,3231867903,CZ -3231867904,3231868927,RU -3231868928,3231869951,LV -3231869952,3231873023,UA -3231873024,3231875071,RU -3231875072,3231876095,PL -3231876096,3231877119,UA -3231877120,3231878143,NL -3231878144,3231879167,UA -3231879168,3231881215,PL -3231881216,3231882239,UA -3231882240,3231884287,RU -3231884288,3231885311,PL -3231885312,3231886335,DE -3231886336,3231888383,PL -3231888384,3231889407,RU -3231889408,3231890431,RO -3231890432,3231892479,RU -3231893504,3231894527,UA -3231895552,3231896575,UA -3231896576,3231897599,RU -3231897600,3231898623,IE -3231898624,3231899647,SE -3231899648,3231900671,UA -3231900672,3231901439,DE -3231901440,3231901695,BG -3231901696,3231903743,UA -3231903744,3231905791,RU -3231905792,3231906047,PL -3231906048,3231907839,RU -3231907840,3231916031,US -3231916032,3231948799,FI -3231948800,3231973375,US -3231973376,3232038911,AT -3232038912,3232039167,SE -3232039168,3232039423,DK -3232039424,3232039679,IT -3232039680,3232047359,SE -3232047360,3232048639,GB -3232048640,3232049151,SE -3232049152,3232049407,GB -3232049408,3232051199,SE -3232051200,3232051455,AT -3232051456,3232051967,SE -3232051968,3232052991,GB -3232052992,3232053247,US -3232053248,3232056063,SE -3232056064,3232056319,IT -3232056320,3232060415,SE -3232060416,3232060671,IE -3232060672,3232060927,IT -3232060928,3232065791,SE -3232065792,3232066303,GB -3232066304,3232066559,SE -3232066560,3232066815,NO -3232066816,3232067839,SE -3232067840,3232068095,PL -3232068096,3232069887,SE -3232069888,3232070143,CH -3232070144,3232070399,SE -3232070400,3232070655,ES -3232070656,3232079871,SE -3232079872,3232080895,GB -3232080896,3232082687,SE -3232082688,3232083199,GB -3232083200,3232083455,SE -3232083456,3232083711,DE -3232083712,3232086271,SE -3232086272,3232087039,GB -3232087040,3232089087,SE -3232089088,3232089343,ES -3232089344,3232090367,SE -3232090368,3232090623,IT -3232090624,3232095231,SE -3232095232,3232096255,GB -3232096256,3232096767,SE -3232096768,3232097023,DK -3232097024,3232098047,SE -3232098048,3232098303,FR -3232098304,3232100095,SE -3232100096,3232100351,IE -3232100352,3232101119,GB -3232101120,3232103167,SE -3232103168,3232103423,FR -3232103424,3232104447,SE -3232104448,3232106495,DE -3232107520,3232108543,RU -3232108544,3232112639,DE -3232116736,3232129023,DE -3232129024,3232130047,NL -3232130048,3232131071,UA -3232131072,3232133119,DE -3232133120,3232133631,UA -3232134144,3232135167,RU -3232135168,3232135679,PL -3232135680,3232135935,RO -3232135936,3232137215,RU -3232137216,3232139263,UA -3232139264,3232140287,GB -3232140288,3232141311,FR -3232141312,3232141823,UA -3232141824,3232142335,DE -3232142336,3232143359,ES -3232143360,3232155968,DE -3232155969,3232155969,GI -3232155970,3232156060,DE -3232156061,3232156061,GI -3232156062,3232156068,DE -3232156069,3232156069,GI -3232156070,3232156159,DE -3232156160,3232156671,PL -3232157696,3232159743,DE -3232159744,3232160767,PL -3232163840,3232165887,RU -3232169216,3232169727,DE -3232169728,3232169983,PL -3232169984,3232170240,IT -3232170241,3232170252,CN -3232170253,3232235519,IT -3232301056,3232309247,US -3232309248,3232311807,SG -3232311808,3232407039,US -3232407040,3232407551,SG -3232407552,3232432383,US -3232433664,3232440319,US -3232440320,3232448511,CA -3232448512,3232461311,US -3232461312,3232461823,CA -3232461824,3232462847,US -3232462848,3232464895,BB -3232464896,3232483327,GB -3232483328,3232492799,US -3232492800,3232493055,NL -3232493056,3232555775,US -3232555776,3232557055,JP -3232557312,3232557567,US -3232557568,3232559103,JP -3232559104,3232559359,US -3232559360,3232560127,JP -3232560896,3232561663,US -3232561664,3232561919,CA -3232561920,3232562431,US -3232562432,3232562687,LU -3232562688,3232562943,CA -3232562944,3232563455,US -3232563456,3232564479,GB -3232564480,3232567295,US -3232567296,3232569599,NZ -3232569600,3232570367,US -3232570368,3232571391,CA -3232571392,3232595967,US -3232595968,3232598015,GB -3232598016,3232629759,US -3232629760,3232630783,CA -3232630784,3232645119,US -3232645120,3232646399,AT -3232646400,3232661503,US -3232661504,3232694271,JP -3232694272,3232695807,US -3232695808,3232696319,CA -3232696320,3232702463,US -3232702464,3232703743,FI -3232703744,3232703999,FR -3232704000,3232704511,CH -3232704512,3232705535,GB -3232705536,3232706559,FI -3232706560,3232716799,US -3232716800,3232724151,CA -3232724152,3232724159,US -3232724160,3232727039,CA -3232727040,3232759807,US -3232759808,3232765951,SE -3232765952,3232766207,NO -3232766208,3232766463,SE -3232766464,3232766719,NO -3232766720,3232767231,DE -3232767232,3232774911,SE -3232774912,3232775167,IE -3232775168,3232792319,SE -3232792320,3232792575,DK -3232792576,3232794879,SE -3232794880,3232795135,DE -3232795136,3232802559,SE -3232802560,3232802815,DK -3232802816,3232803071,SE -3232803072,3232803327,IE -3232803328,3232804351,SE -3232804352,3232804607,DK -3232804608,3232804863,IT -3232804864,3232811007,SE -3232811008,3232812543,GB -3232812544,3232812799,SE -3232812800,3232813055,ES -3232813056,3232820223,SE -3232820224,3232820479,IE -3232820480,3232825343,SE -3232825344,3233288191,US -3233288192,3233292287,CA -3233292288,3233431551,US -3233431552,3233448287,CA -3233448288,3233448295,US -3233448296,3233448447,CA -3233448448,3233448463,US -3233448464,3233448479,CA -3233448480,3233448495,US -3233448496,3233448591,CA -3233448592,3233448607,US -3233448608,3233448823,CA -3233448824,3233448831,US -3233448832,3233448863,CA -3233448864,3233448871,US -3233448872,3233448879,FI -3233448880,3233448903,CA -3233448904,3233448911,US -3233448912,3233449095,CA -3233449096,3233449103,GB -3233449104,3233449199,CA -3233449200,3233449207,US -3233449208,3233449215,GB -3233449216,3233449311,CA -3233449312,3233449319,RO -3233449320,3233449359,CA -3233449360,3233449367,US -3233449368,3233449535,CA -3233449536,3233449567,US -3233449568,3233449615,CA -3233449616,3233449631,US -3233449632,3233449647,CA -3233449648,3233449663,US -3233449664,3233449759,CA -3233449760,3233449775,US -3233449776,3233449823,CA -3233449824,3233449839,US -3233449840,3233450047,CA -3233450048,3233450111,US -3233450112,3233450127,CA -3233450128,3233450135,US -3233450136,3233450199,CA -3233450200,3233450207,GB -3233450208,3233450239,CA -3233450240,3233450751,US -3233450752,3233450783,CA -3233450784,3233450815,US -3233450816,3233450863,CA -3233450864,3233450887,US -3233450888,3233450895,CA -3233450896,3233450911,US -3233450912,3233450927,CA -3233450928,3233450959,US -3233450960,3233451007,CA -3233451008,3233451263,US -3233451264,3233451519,CA -3233451520,3233451775,GB -3233451776,3233451903,CA -3233451904,3233451951,US -3233451952,3233452031,CA -3233452032,3233452287,US -3233452288,3233452303,CA -3233452304,3233452319,US -3233452320,3233452383,CA -3233452384,3233452415,US -3233452416,3233452519,CA -3233452520,3233452527,US -3233452528,3233452543,CA -3233452544,3233452831,US -3233452832,3233452847,CA -3233452848,3233452879,US -3233452880,3233452959,CA -3233452960,3233453007,US -3233453008,3233453023,CA -3233453024,3233453055,US -3233453056,3233453183,CA -3233453184,3233453199,US -3233453200,3233453247,CA -3233453248,3233453263,US -3233453264,3233453271,CA -3233453272,3233453279,US -3233453280,3233453295,CA -3233453296,3233453439,US -3233453440,3233453455,CA -3233453456,3233453471,US -3233453472,3233453567,CA -3233453568,3233453631,IT -3233453632,3233454079,US -3233454080,3233454303,CA -3233454304,3233454335,US -3233454336,3233454399,CA -3233454400,3233454415,US -3233454416,3233454423,CA -3233454424,3233454431,US -3233454432,3233454511,CA -3233454512,3233454527,US -3233454528,3233454559,CA -3233454560,3233454575,US -3233454576,3233454591,CA -3233454592,3233454599,SE -3233454600,3233455039,CA -3233455040,3233455071,US -3233455072,3233455327,CA -3233455328,3233455335,US -3233455336,3233455439,CA -3233455440,3233455447,US -3233455448,3233455471,CA -3233455472,3233455487,US -3233455488,3233455519,CA -3233455520,3233455551,US -3233455552,3233455695,CA -3233455696,3233455711,US -3233455712,3233455743,CA -3233455744,3233455807,US -3233455808,3233455855,CA -3233455856,3233455871,US -3233455872,3233455935,CA -3233455936,3233455967,US -3233455968,3233456015,CA -3233456016,3233456031,US -3233456032,3233456063,CA -3233456064,3233456111,US -3233456112,3233456119,CA -3233456120,3233456191,US -3233456192,3233456255,LV -3233456256,3233456383,US -3233456384,3233456391,UA -3233456392,3233456399,NO -3233456400,3233456447,UA -3233456448,3233456639,US -3233456640,3233456655,CA -3233456656,3233456671,US -3233456672,3233456799,CA -3233456800,3233456847,US -3233456848,3233456863,CA -3233456864,3233456895,US -3233456896,3233456943,CA -3233456944,3233456959,US -3233456960,3233456975,CA -3233456976,3233456999,US -3233457000,3233457023,CA -3233457024,3233457039,US -3233457040,3233457087,CA -3233457088,3233457471,US -3233457472,3233457519,CA -3233457520,3233457535,US -3233457536,3233457631,CA -3233457632,3233457647,US -3233457648,3233457663,CA -3233457664,3233457671,US -3233457672,3233457735,CA -3233457736,3233457775,US -3233457776,3233457831,CA -3233457832,3233457871,US -3233457872,3233457887,CA -3233457888,3233457895,US -3233457896,3233457919,CA -3233457920,3233458191,US -3233458192,3233458223,CA -3233458224,3233458271,US -3233458272,3233458303,CA -3233458304,3233458351,US -3233458352,3233458359,CA -3233458360,3233458399,US -3233458400,3233458431,CA -3233458432,3233458527,US -3233458528,3233458591,CA -3233458592,3233458607,US -3233458608,3233458687,CA -3233458688,3233458943,US -3233458944,3233458959,BG -3233458960,3233458975,US -3233458976,3233459007,BG -3233459008,3233459455,US -3233459456,3233459471,CA -3233459472,3233459631,US -3233459632,3233459679,CA -3233459680,3233459695,US -3233459696,3233459711,CA -3233459712,3233459727,US -3233459728,3233459775,CA -3233459776,3233459807,US -3233459808,3233459823,CA -3233459824,3233459839,US -3233459840,3233459967,CA -3233459968,3233459999,US -3233460000,3233460015,CA -3233460016,3233460047,US -3233460048,3233460223,CA -3233460224,3233460479,US -3233460480,3233460495,CA -3233460496,3233460511,US -3233460512,3233460519,SE -3233460520,3233460671,CA -3233460672,3233461279,US -3233461280,3233461303,CA -3233461304,3233461319,US -3233461320,3233461375,CA -3233461376,3233461407,US -3233461408,3233461487,CA -3233461488,3233461543,US -3233461544,3233461567,CA -3233461568,3233461583,US -3233461584,3233461599,CA -3233461600,3233461615,US -3233461616,3233461639,CA -3233461640,3233461679,US -3233461680,3233461727,CA -3233461728,3233461743,US -3233461744,3233461759,CA -3233461760,3233461823,US -3233461824,3233461839,CA -3233461840,3233461855,US -3233461856,3233461871,CA -3233461872,3233462015,US -3233462016,3233462127,CA -3233462128,3233462143,US -3233462144,3233462527,CA -3233462528,3233462783,US -3233462784,3233463295,CA -3233463296,3233463855,US -3233463856,3233463919,CA -3233463920,3233463999,US -3233464000,3233464063,CA -3233464064,3233484799,US -3233484800,3233487359,ES -3233487360,3233487871,US -3233487872,3233488895,CA -3233488896,3233546751,US -3233546752,3233547007,CA -3233547008,3233548799,US -3233548800,3233549055,PT -3233549056,3233549311,BR -3233549312,3233557247,US -3233557248,3233557503,NZ -3233557504,3233561855,EC -3233561856,3233562367,US -3233562368,3233562879,GB -3233562880,3233563135,FR -3233563136,3233563903,US -3233563904,3233564159,NL -3233564160,3233564415,US -3233564416,3233564671,NZ -3233564672,3233564927,US -3233564928,3233566719,JP -3233567744,3233567999,US -3233568768,3233569023,CA -3233569536,3233569791,US -3233569792,3233570047,JP -3233570048,3233570815,US -3233570816,3233571071,GB -3233571072,3233572095,US -3233572096,3233572351,AU -3233572352,3233573119,US -3233573120,3233573375,NO -3233573376,3233573631,US -3233573632,3233573887,AU -3233573888,3233575679,US -3233575680,3233575935,AU -3233575936,3233576191,RU -3233576192,3233576447,GB -3233576448,3233577215,US -3233577216,3233577727,NL -3233577728,3233578239,US -3233578240,3233578495,GB -3233578496,3233578751,US -3233578752,3233579007,IE -3233579264,3233579519,GB -3233579520,3233580031,US -3233580032,3233580287,GB -3233580288,3233581055,US -3233581056,3233581311,NL -3233581312,3233583359,US -3233583360,3233583615,GB -3233583616,3233584895,US -3233584896,3233585151,AU -3233585152,3233586431,US -3233586432,3233586943,NL -3233586944,3233588223,US -3233588224,3233589247,GA -3233589248,3233589759,CA -3233589760,3233590015,US -3233590016,3233590271,TW -3233590272,3233590527,TH -3233590528,3233590783,US -3233590784,3233591039,PH -3233591040,3233591295,ID -3233591296,3233593599,US -3233593600,3233594111,AU -3233594112,3233594367,RU -3233594368,3233594623,US -3233594624,3233594879,NL -3233594880,3233595903,US -3233595904,3233596927,EC -3233596928,3233605887,US -3233605888,3233607167,PL -3233607168,3233607935,US -3233607936,3233608191,NZ -3233608192,3233609727,HU -3233609728,3233612031,US -3233612032,3233612287,GB -3233612288,3233613823,US -3233613824,3233614847,GB -3233614848,3233615359,US -3233615360,3233615615,NL -3233615616,3233617407,US -3233617408,3233617663,CA -3233617664,3233617919,GB -3233617920,3233618175,JP -3233618176,3233620479,US -3233620480,3233620735,NZ -3233620736,3233620991,US -3233620992,3233622015,CA -3233622016,3233622271,US -3233622272,3233622527,GB -3233622528,3233624831,US -3233624832,3233625343,NL -3233625344,3233625599,US -3233625600,3233625855,AU -3233625856,3233626111,GB -3233626112,3233628415,US -3233628672,3233628927,FR -3233628928,3233629439,CA -3233629440,3233629695,GB -3233629696,3233629951,IL -3233629952,3233630463,US -3233630464,3233630719,NL -3233630720,3233630975,US -3233630976,3233631231,ZA -3233631232,3233631487,DE -3233631488,3233642239,US -3233642240,3233642495,GB -3233642496,3233646591,US -3233646592,3233646847,AU -3233646848,3233647359,US -3233647360,3233647871,GA -3233647872,3233649663,US -3233649664,3233649919,AU -3233649920,3233650431,US -3233650432,3233650687,NL -3233650688,3233651199,US -3233651200,3233651455,IT -3233651456,3233651967,US -3233651968,3233652223,NL -3233652224,3233652479,US -3233652736,3233652991,NL -3233652992,3233654271,US -3233654272,3233655551,GB -3233655552,3233663487,US -3233663488,3233663999,GB -3233664000,3233664255,CA -3233664256,3233665023,US -3233665024,3233666047,AU -3233666048,3233668863,US -3233668864,3233669119,PH -3233669120,3233670399,US -3233670400,3233670655,AU -3233671168,3233676031,US -3233676032,3233676287,DE -3233676288,3233677311,US -3233677312,3233677567,CA -3233677568,3233684991,US -3233684992,3233685503,MX -3233685504,3233688575,US -3233688576,3233688831,GB -3233688832,3233692159,US -3233692160,3233692671,NO -3233692672,3233692927,US -3233692928,3233693183,AU -3233693184,3233693695,US -3233693696,3233693951,GB -3233693952,3233694207,US -3233694208,3233694463,AU -3233694464,3233694719,GB -3233694720,3233694975,US -3233694976,3233695231,FR -3233695232,3233696511,US -3233696512,3233696767,CA -3233696768,3233701631,US -3233701632,3233701887,NO -3233701888,3233704959,US -3233704960,3233705215,AU -3233705216,3233710335,US -3233710336,3233711359,FR -3233711360,3233721599,US -3233721600,3233721855,HU -3233721856,3233722111,PT -3233722112,3233723391,US -3233723392,3233723903,AU -3233723904,3233724415,GB -3233724416,3233725951,US -3233725952,3233726975,NO -3233726976,3233728767,US -3233728768,3233729279,GB -3233729280,3233729535,US -3233729536,3233730047,AU -3233730048,3233730559,US -3233730560,3233732607,AU -3233732608,3233736959,US -3233736960,3233737983,FR -3233737984,3233738751,US -3233738752,3233739007,NL -3233739008,3233739263,US -3233739264,3233739519,FR -3233739520,3233740543,US -3233740544,3233741311,GB -3233741312,3233743359,US -3233743360,3233743615,CA -3233743616,3233744383,US -3233744384,3233744639,PR -3233744640,3233745663,US -3233745664,3233745919,CA -3233745920,3233746943,US -3233746944,3233747199,PR -3233747200,3233748735,US -3233748736,3233748991,PR -3233748992,3233749503,US -3233749504,3233750015,CA -3233750016,3233752831,US -3233752832,3233753087,PR -3233753088,3233763071,US -3233763072,3233763327,CA -3233763328,3233765887,US -3233765888,3233766143,CA -3233766144,3233768447,US -3233768448,3233768703,CA -3233768704,3233768959,PR -3233768960,3233778175,US -3233778176,3233778431,CA -3233778432,3233779455,US -3233779456,3233779711,CA -3233779712,3233781503,US -3233781504,3233781759,PR -3233781760,3233783807,US -3233783808,3233784063,PR -3233784064,3233784319,CA -3233784320,3233786111,US -3233786112,3233786367,PR -3233786368,3233790207,US -3233790208,3233790463,PR -3233790464,3233790719,CA -3233790720,3233790975,PR -3233790976,3233791231,CA -3233791232,3233791487,PR -3233791488,3233793023,US -3233793024,3233793279,PR -3233793280,3233794047,US -3233794048,3233794303,CA -3233794304,3233800447,US -3233800448,3233800703,CA -3233800704,3233800959,US -3233800960,3233801215,CA -3233801216,3233801983,US -3233801984,3233802239,CA -3233802240,3233802495,US -3233802496,3233802751,CA -3233802752,3233803007,US -3233803008,3233803263,CA -3233803264,3233808383,US -3233808384,3233873919,TW -3233873920,3233939455,US -3233939456,3234004991,FI -3234004992,3234005247,US -3234005248,3234005503,GB -3234005760,3234006015,CA -3234006016,3234007039,US -3234007040,3234007295,RU -3234007296,3234007551,US -3234007808,3234008063,US -3234008064,3234008831,NZ -3234008832,3234013695,US -3234013696,3234013951,AU -3234013952,3234014975,US -3234014976,3234015487,KR -3234015488,3234015743,US -3234015744,3234016255,IE -3234016256,3234019327,AU -3234019328,3234023423,US -3234023424,3234023679,NL -3234023680,3234030079,US -3234030080,3234030335,DE -3234030336,3234031103,US -3234031104,3234031359,AU -3234031360,3234031871,US -3234031872,3234032383,NL -3234032384,3234033151,US -3234033152,3234033407,IT -3234033408,3234033663,US -3234033664,3234033919,AU -3234033920,3234034687,US -3234034688,3234035455,GB -3234035456,3234039295,US -3234039296,3234043135,SE -3234043136,3234043903,US -3234043904,3234044159,AU -3234044160,3234047743,US -3234047744,3234047999,GB -3234048000,3234048511,US -3234048512,3234048767,AU -3234048768,3234051839,US -3234051840,3234052095,NL -3234052096,3234052351,DE -3234052352,3234052607,US -3234052864,3234054911,US -3234054912,3234055167,PT -3234055168,3234055423,US -3234055424,3234055679,AU -3234055680,3234056959,US -3234056960,3234057215,CA -3234057216,3234061055,US -3234061056,3234061311,NZ -3234061312,3234065407,US -3234065408,3234065663,GB -3234065664,3234065919,BR -3234065920,3234069247,US -3234069248,3234069503,CA -3234069504,3234070271,US -3234070272,3234070527,CA -3234070528,3234070783,US -3234070784,3234110463,FR -3234110464,3234128455,US -3234128456,3234128463,GB -3234128464,3234130695,US -3234130696,3234130703,AU -3234130704,3234131183,US -3234131184,3234131191,GB -3234131192,3234136063,US -3234136064,3234150911,CA -3234150912,3234151423,US -3234151424,3234158847,CA -3234158848,3234159103,US -3234159104,3234159615,CA -3234159616,3234160127,US -3234160128,3234167295,CA -3234167296,3234167807,US -3234167808,3234172927,CA -3234172928,3234173951,US -3234173952,3234175999,CA -3234176000,3234177279,US -3234177280,3234187007,CA -3234187008,3234187519,US -3234187520,3234189055,CA -3234189056,3234189311,US -3234189312,3234192383,CA -3234192384,3234193663,US -3234193664,3234198783,CA -3234198784,3234199039,US -3234199040,3234201343,CA -3234201344,3234203647,US -3234203648,3234205695,AR -3234205696,3234226175,US -3234226176,3234226263,CA -3234226264,3234226271,US -3234226272,3234226279,CA -3234226280,3234226303,US -3234226304,3234226711,CA -3234226712,3234226751,US -3234226752,3234226847,CA -3234226848,3234226863,US -3234226864,3234226879,CA -3234226880,3234226943,US -3234226944,3234226959,CA -3234226960,3234226967,US -3234226968,3234227007,CA -3234227008,3234227023,US -3234227024,3234227135,CA -3234227136,3234227143,US -3234227144,3234227159,CA -3234227160,3234227167,FI -3234227168,3234227191,CA -3234227192,3234227455,US -3234227456,3234227611,CA -3234227612,3234227615,US -3234227616,3234227619,CA -3234227620,3234227623,US -3234227624,3234227639,CA -3234227640,3234227643,US -3234227644,3234227695,CA -3234227696,3234227699,US -3234227700,3234227707,CA -3234227708,3234227711,US -3234227712,3234227775,CA -3234227776,3234227807,US -3234227808,3234227839,CA -3234227840,3234227879,US -3234227880,3234227903,CA -3234227904,3234227935,US -3234227936,3234227951,CA -3234227952,3234228223,US -3234228224,3234228287,CA -3234228288,3234228383,US -3234228384,3234228463,CA -3234228464,3234228479,US -3234228480,3234228607,CA -3234228608,3234228639,US -3234228640,3234228671,CA -3234228672,3234228703,US -3234228704,3234228719,CA -3234228720,3234228735,US -3234228736,3234229039,CA -3234229040,3234229047,US -3234229048,3234229063,CA -3234229064,3234229079,US -3234229080,3234229111,CA -3234229112,3234229119,US -3234229120,3234229191,CA -3234229192,3234229199,US -3234229200,3234229215,CA -3234229216,3234229223,SE -3234229224,3234229239,CA -3234229240,3234229503,US -3234229504,3234229567,CA -3234229568,3234229599,US -3234229600,3234229607,CA -3234229608,3234229615,US -3234229616,3234229695,CA -3234229696,3234229743,US -3234229744,3234229895,CA -3234229896,3234229903,US -3234229904,3234229911,CA -3234229912,3234229951,US -3234229952,3234230015,CA -3234230016,3234230207,ES -3234230208,3234230271,US -3234230272,3234230399,CA -3234230400,3234230431,US -3234230432,3234230527,CA -3234230528,3234230783,US -3234230784,3234230927,CA -3234230928,3234230991,US -3234230992,3234231007,CA -3234231008,3234231039,US -3234231040,3234231055,CA -3234231056,3234231063,US -3234231064,3234231087,CA -3234231088,3234231103,US -3234231104,3234231143,CA -3234231144,3234231151,US -3234231152,3234231255,CA -3234231256,3234231279,US -3234231280,3234231807,CA -3234231808,3234232111,US -3234232112,3234232127,CA -3234232128,3234232159,US -3234232160,3234232247,CA -3234232248,3234232255,US -3234232256,3234232319,CA -3234232320,3234232575,EG -3234232576,3234233343,US -3234233344,3234233399,CA -3234233400,3234233407,US -3234233408,3234233471,CA -3234233472,3234233487,US -3234233488,3234233519,CA -3234233520,3234233599,US -3234233600,3234233647,CA -3234233648,3234233759,US -3234233760,3234233791,CA -3234233792,3234233823,US -3234233824,3234233855,CA -3234233856,3234234127,US -3234234128,3234234143,CA -3234234144,3234234199,US -3234234200,3234234207,CA -3234234208,3234234239,US -3234234240,3234234247,CA -3234234248,3234234271,US -3234234272,3234234287,CA -3234234288,3234234335,US -3234234336,3234234367,CA -3234234368,3234267135,US -3234267136,3234267391,CA -3234267392,3234268927,US -3234268928,3234269183,SG -3234269184,3234270207,US -3234270208,3234271231,CA -3234271232,3234275327,PT -3234275328,3234279423,AU -3234279424,3234283519,CA -3234283520,3234316287,US -3234316288,3234320383,CA -3234320384,3234338815,US -3234338816,3234339071,CN -3234339072,3234339327,MT -3234339328,3234339583,DE -3234339584,3234339839,PA -3234339840,3234340095,US -3234340096,3234340351,IN -3234340352,3234349055,US -3234349056,3234353151,NZ -3234353152,3234400679,US -3234400680,3234400687,NA -3234400688,3234401511,US -3234401512,3234401519,NA -3234401520,3234529279,US -3234529280,3234529535,PR -3234529536,3234538751,US -3234538752,3234539007,TC -3234539520,3234549759,US -3234549760,3234550015,RU -3234553856,3234556415,US -3234556416,3234556927,CA -3234556928,3234557439,FI -3234557440,3234564607,US -3234564608,3234566911,KR -3234566912,3234568703,US -3234568704,3234568959,NZ -3234568960,3234569215,US -3234569728,3234569983,CL -3234569984,3234574335,US -3234574336,3234574591,AU -3234574592,3234574847,MX -3234574848,3234579711,US -3234579712,3234579967,CA -3234579968,3234581247,US -3234581248,3234581503,CA -3234581504,3234582527,US -3234583040,3234583807,US -3234583808,3234584063,AU -3234584064,3234584575,US -3234584576,3234584831,AU -3234584832,3234587391,US -3234587392,3234587647,SA -3234587648,3234588671,US -3234588672,3234588927,AU -3234588928,3234589439,US -3234589440,3234589695,AU -3234589696,3234590463,US -3234590464,3234590719,CA -3234590720,3234592511,US -3234592512,3234592767,TH -3234592768,3234726143,US -3234726144,3234726399,CA -3234726400,3234726911,US -3234726912,3234727935,CA -3234727936,3234733055,US -3234733056,3234733311,CA -3234733312,3234739711,US -3234739712,3234740223,CA -3234740224,3234745599,US -3234745600,3234746879,GB -3234746880,3234747903,US -3234747904,3234748159,IL -3234748160,3234749695,US -3234749696,3234750207,CA -3234750208,3234762751,US -3234762752,3234764799,CA -3234764800,3234766335,NZ -3234766336,3234772223,US -3234772224,3234772479,CA -3234772480,3234772735,US -3234772992,3234781439,US -3234781440,3234781951,CA -3234781952,3234782719,US -3234782720,3234783999,IL -3234784000,3234794495,US -3234794496,3234794751,CA -3234794752,3234795007,US -3234795264,3234799359,US -3234799360,3234799615,NL -3234799616,3234799871,US -3234799872,3234800127,AU -3234800128,3234800639,US -3234800640,3234800895,AU -3234800896,3234801663,US -3234801664,3234802431,EC -3234802432,3234803711,US -3234803712,3234803967,PR -3234803968,3234806783,US -3234806784,3234807295,CA -3234807296,3234807807,US -3234807808,3234808063,AU -3234808064,3234809087,EC -3234809088,3234810879,US -3234810880,3234811135,CA -3234811136,3234814719,US -3234814720,3234814975,HK -3234814976,3234815999,US -3234816000,3234816767,AU -3234816768,3234820351,US -3234820352,3234820607,AU -3234820608,3234821887,US -3234821888,3234822655,AU -3234822656,3234826751,US -3234826752,3234827007,CA -3234827008,3234827519,US -3234827520,3234828031,NL -3234828032,3234828287,NZ -3234828288,3234828799,US -3234828800,3234829055,CL -3234829056,3234830079,US -3234830080,3234830847,AU -3234831360,3234832127,AU -3234832128,3234832639,US -3234832640,3234832895,AU -3234832896,3234833663,US -3234833664,3234833919,AU -3234833920,3234838271,US -3234838272,3234838527,GT -3234838528,3234839295,US -3234839296,3234839551,AU -3234839552,3234841087,US -3234841088,3234841599,BR -3234841600,3234841855,PT -3234841856,3234842367,AU -3234842368,3234842623,US -3234842624,3234843647,BR -3234843648,3234844159,MX -3234844160,3234844415,BR -3234844416,3234853375,US -3234853376,3234853631,TH -3234853632,3234853887,US -3234853888,3234854143,EC -3234854144,3234854911,US -3234854912,3234855167,AU -3234855168,3234857215,US -3234857216,3234861055,CA -3234861056,3234988287,US -3234988288,3234990847,CA -3234990848,3235004415,US -3235004416,3235020799,CA -3235020800,3235021567,US -3235021568,3235021823,CA -3235021824,3235044375,US -3235044376,3235044383,GB -3235044384,3235046831,US -3235046832,3235046847,AF -3235046848,3235065343,US -3235065344,3235065855,CA -3235065856,3235068511,US -3235068512,3235068575,IT -3235068576,3235085311,US -3235085312,3235086335,CA -3235086336,3235108863,US -3235108864,3235109119,TW -3235109120,3235109375,CN -3235109376,3235184639,US -3235184640,3235184895,CA -3235184896,3235275775,US -3235275776,3235276799,CA -3235276800,3235278847,US -3235278848,3235282943,BB -3235282944,3235315711,CA -3235315712,3235389439,US -3235389440,3235389951,VE -3235389952,3235512319,US -3235512320,3235577855,JP -3235577856,3235641855,CA -3235641856,3235642111,US -3235642112,3235643135,CA -3235643136,3235745791,US -3235745792,3235746047,DE -3235746048,3235746303,US -3235746304,3235746559,DE -3235746560,3235747839,US -3235747840,3235748095,GB -3235748096,3235748351,US -3235748352,3235748607,GB -3235748608,3235753983,US -3235753984,3235754239,SG -3235754240,3235754495,JP -3235754496,3235774719,US -3235774720,3235776767,CA -3235776768,3235800575,US -3235800576,3235801087,CA -3235801088,3235807231,US -3235807232,3235839999,CA -3235840000,3235843071,US -3235843072,3235844031,CA -3235844032,3235844063,US -3235844064,3235844095,CA -3235844096,3235856383,US -3235856384,3235872767,BO -3235872768,3235906303,US -3235906304,3235906559,CA -3235906560,3235908863,US -3235908864,3235909119,CA -3235909120,3235912447,US -3235912448,3235912703,CA -3235912704,3235914495,US -3235914496,3235914751,CA -3235914752,3235916543,US -3235916544,3235916799,VI -3235916800,3235917567,US -3235917568,3235917823,CA -3235917824,3235919359,US -3235919360,3235919615,CA -3235919616,3235921151,US -3235921152,3235921407,PR -3235921408,3235926271,US -3235926272,3235926527,CA -3235926528,3235927295,US -3235927296,3235927807,CA -3235927808,3235928319,US -3235928320,3235929343,CA -3235929344,3235929599,US -3235929600,3235929855,CA -3235929856,3235932159,US -3235932160,3235932415,CA -3235932416,3235932671,US -3235932672,3235932927,CA -3235932928,3235937023,US -3235937024,3235937535,CA -3235937536,3235937791,US -3235937792,3235938047,CA -3235938048,3235941631,US -3235941632,3235941887,CA -3235941888,3235945983,US -3235945984,3235946239,CA -3235946240,3235946751,US -3235946752,3235947007,CA -3235947008,3235949311,US -3235949312,3235950335,CA -3235950336,3235950591,US -3235950592,3235950847,CA -3235950848,3235951871,US -3235951872,3235952127,CA -3235952128,3235957247,US -3235957248,3235957503,PR -3235957504,3235957759,US -3235957760,3235958015,DE -3235958016,3235959551,US -3235959552,3235959807,CA -3235959808,3235960319,US -3235960320,3235960575,CA -3235960576,3235962111,US -3235962112,3235962367,CA -3235962368,3235963647,US -3235963648,3235963903,CA -3235963904,3235966975,US -3235966976,3235967231,PR -3235967232,3235967743,US -3235967744,3235967999,CA -3235968000,3235968511,US -3235968512,3235968767,CA -3235968768,3235970559,US -3235970560,3235970815,CA -3235970816,3235971071,US -3235971072,3235971327,CA -3235971328,3235996671,US -3235996672,3235997183,CA -3235997184,3235997695,US -3235997696,3235998207,CA -3235998208,3235998719,US -3235998720,3235999231,CA -3235999232,3236044799,US -3236044800,3236052991,CA -3236052992,3236069375,US -3236069376,3236102143,CA -3236102144,3236102399,US -3236102400,3236106239,PH -3236106240,3236140543,US -3236140544,3236141055,CA -3236141056,3236142151,US -3236142152,3236142159,CA -3236142160,3236146195,US -3236146196,3236146199,GB -3236146200,3236147063,US -3236147064,3236147071,FR -3236147072,3236156959,US -3236156960,3236156967,GB -3236156968,3236157951,US -3236157952,3236158207,GB -3236158208,3236167935,US -3236167936,3236175871,CA -3236175872,3236200447,US -3236200448,3236233215,MY -3236233216,3236239359,US -3236239360,3236241407,CA -3236241408,3236267519,US -3236267520,3236268031,DE -3236268032,3236268543,ES -3236268544,3236272639,US -3236272640,3236272895,HK -3236272896,3236273919,US -3236273920,3236274175,DE -3236274176,3236275199,US -3236275200,3236275711,FR -3236275712,3236276223,AU -3236276224,3236277759,US -3236277760,3236278783,IN -3236278784,3236279807,US -3236279808,3236280063,GB -3236280064,3236281855,US -3236281856,3236282367,SG -3236282368,3236287487,US -3236287488,3236287743,EC -3236287744,3236287999,CO -3236288000,3236291071,US -3236291072,3236291327,GB -3236291328,3236302847,US -3236306944,3236312063,US -3236312064,3236312319,MO -3236312320,3236312575,GH -3236312576,3236312831,GR -3236312832,3236313087,VG -3236313088,3236314367,US -3236314368,3236314623,GB -3236314624,3236319743,US -3236319744,3236319999,ES -3236320000,3236365567,US -3236365568,3236365823,CA -3236365824,3236368127,US -3236368128,3236368383,NZ -3236368384,3236372991,US -3236372992,3236373247,AU -3236373248,3236373503,US -3236373504,3236373759,BS -3236373760,3236379391,US -3236379392,3236379647,AU -3236379648,3236381183,US -3236381184,3236381439,CA -3236381440,3236381695,AT -3236381696,3236385279,US -3236385280,3236385535,DE -3236385536,3236387071,US -3236387072,3236387327,CA -3236387328,3236387839,US -3236387840,3236389375,PR -3236389376,3236392447,US -3236392448,3236392703,CL -3236392704,3236393471,US -3236393472,3236393983,BR -3236393984,3236395007,CO -3236395008,3236395519,AR -3236395520,3236396799,US -3236396800,3236397055,AU -3236397056,3236398847,US -3236398848,3236399359,AU -3236399616,3236400127,US -3236400128,3236400383,CL -3236400384,3236400639,AU -3236400640,3236406783,US -3236406784,3236407551,AU -3236407552,3236408063,SG -3236408064,3236408319,US -3236408320,3236409087,CA -3236409088,3236409599,BR -3236409600,3236412415,US -3236412416,3236412671,CA -3236412672,3236413695,US -3236413696,3236413951,AU -3236413952,3236416255,US -3236416256,3236416511,AU -3236416512,3236418559,US -3236418560,3236418815,AU -3236418816,3236427519,US -3236427520,3236427775,CA -3236427776,3236429311,US -3236429312,3236429567,MU -3236429568,3236462591,US -3236462592,3236470783,AU -3236470784,3236560895,US -3236560896,3236561151,CA -3236561152,3236566783,US -3236566784,3236567039,CA -3236567040,3236585983,US -3236585984,3236586239,CA -3236586240,3236604671,US -3236604672,3236604927,CA -3236604928,3236611071,US -3236611072,3236612095,CA -3236612096,3236613119,US -3236613120,3236613375,CA -3236613376,3236617983,US -3236617984,3236619775,CA -3236619776,3236620031,US -3236620288,3236623615,US -3236623616,3236623871,AU -3236623872,3236625919,US -3236625920,3236626175,CA -3236626176,3236638719,US -3236638720,3236642815,BB -3236642816,3236659199,US -3236659200,3236691967,CA -3236691968,3236695039,US -3236695040,3236696063,CA -3236696064,3236757503,US -3236757504,3236765695,CA -3236765696,3236774911,US -3236774912,3236775423,HK -3236775424,3236775679,NL -3236775680,3236776191,CA -3236776192,3236776447,DE -3236776448,3236776959,US -3236776960,3236777215,CA -3236777216,3236778239,US -3236778240,3236778751,GB -3236778752,3236780287,US -3236780288,3236780543,FR -3236780544,3236780799,CH -3236780800,3236781599,US -3236781600,3236781615,NL -3236781616,3236781727,US -3236781728,3236781759,NL -3236781760,3236781823,US -3236781824,3236782335,ES -3236782336,3236782719,US -3236782720,3236782751,BE -3236782752,3236782847,US -3236782848,3236782911,LU -3236782912,3236784383,US -3236784384,3236784895,IT -3236784896,3236785663,US -3236785664,3236785919,DE -3236785920,3236786175,ZA -3236786176,3236786431,US -3236786432,3236786687,FR -3236786688,3236787199,CA -3236787200,3236787967,US -3236787968,3236788223,JP -3236788224,3236788479,US -3236788480,3236789503,GB -3236789504,3236823295,US -3236823296,3236825855,CH -3236825856,3236827135,CA -3236827136,3236958207,US -3236958208,3236962303,AU -3236962304,3236985063,US -3236985064,3236985071,AU -3236985072,3236985079,JP -3236985080,3236995623,US -3236995624,3236995631,NL -3236995632,3237003263,US -3237003264,3237003519,GB -3237003520,3237008639,US -3237008640,3237008895,DE -3237008896,3237009663,US -3237009664,3237009919,GB -3237009920,3237010687,US -3237010688,3237010943,NL -3237010944,3237011199,GB -3237011200,3237011711,US -3237011712,3237011967,AU -3237011968,3237012223,US -3237012224,3237012479,NL -3237012480,3237012735,GB -3237012736,3237012991,AU -3237012992,3237013247,US -3237013248,3237013503,NL -3237013504,3237013759,GB -3237013760,3237014015,US -3237014016,3237014271,AU -3237014272,3237014527,NL -3237014528,3237015807,US -3237015808,3237016063,CA -3237016064,3237016319,US -3237016320,3237016575,CA -3237016576,3237016831,US -3237016832,3237017087,GB -3237017088,3237018111,US -3237018112,3237018367,DE -3237018368,3237036063,US -3237036064,3237036095,CA -3237036096,3237036127,US -3237036128,3237036135,CA -3237036136,3237036159,US -3237036160,3237036255,CA -3237036256,3237036351,US -3237036352,3237036367,CA -3237036368,3237036383,US -3237036384,3237036415,CA -3237036416,3237036495,US -3237036496,3237036511,CA -3237036512,3237036543,US -3237036544,3237036799,CN -3237036800,3237037311,US -3237037312,3237037567,CA -3237037568,3237037583,US -3237037584,3237037607,CA -3237037608,3237037631,US -3237037632,3237037703,CA -3237037704,3237037711,US -3237037712,3237037767,CA -3237037768,3237037775,NO -3237037776,3237037815,CA -3237037816,3237037823,US -3237037824,3237037887,CA -3237037888,3237037895,US -3237037896,3237037943,CA -3237037944,3237037959,US -3237037960,3237037967,CA -3237037968,3237037975,US -3237037976,3237037999,CA -3237038000,3237038007,US -3237038008,3237038031,CA -3237038032,3237038047,US -3237038048,3237038367,CA -3237038368,3237038399,US -3237038400,3237038415,CA -3237038416,3237038431,US -3237038432,3237038495,CA -3237038496,3237038575,US -3237038576,3237038607,CA -3237038608,3237038615,US -3237038616,3237038663,CA -3237038664,3237038671,US -3237038672,3237038679,CA -3237038680,3237038687,US -3237038688,3237038743,CA -3237038744,3237038751,US -3237038752,3237038767,CA -3237038768,3237038775,US -3237038776,3237038783,CA -3237038784,3237038791,US -3237038792,3237038831,CA -3237038832,3237038839,US -3237038840,3237038863,CA -3237038864,3237038879,US -3237038880,3237038911,CA -3237038912,3237038927,US -3237038928,3237039007,CA -3237039008,3237039039,US -3237039040,3237039103,CA -3237039104,3237039183,US -3237039184,3237039199,CA -3237039200,3237039215,US -3237039216,3237039295,CA -3237039296,3237039343,US -3237039344,3237039359,CA -3237039360,3237039615,US -3237039616,3237039935,CA -3237039936,3237040063,US -3237040064,3237040143,CA -3237040144,3237040159,US -3237040160,3237040287,CA -3237040288,3237040303,US -3237040304,3237040319,CA -3237040320,3237040335,US -3237040336,3237040351,CA -3237040352,3237040511,US -3237040512,3237040639,CA -3237040640,3237040895,US -3237040896,3237041151,CA -3237041152,3237041183,US -3237041184,3237041199,CA -3237041200,3237041407,US -3237041408,3237041663,CA -3237041664,3237041823,US -3237041824,3237041935,CA -3237041936,3237041983,US -3237041984,3237042047,CA -3237042048,3237042063,US -3237042064,3237042127,CA -3237042128,3237042431,US -3237042432,3237042463,CA -3237042464,3237042471,US -3237042472,3237042479,CA -3237042480,3237042495,US -3237042496,3237042607,CA -3237042608,3237042623,US -3237042624,3237042631,CA -3237042632,3237042639,US -3237042640,3237042647,CA -3237042648,3237042655,US -3237042656,3237042679,CA -3237042680,3237043455,US -3237043456,3237043711,CA -3237043712,3237043967,US -3237043968,3237044223,CH -3237044224,3237044287,US -3237044288,3237044351,CA -3237044352,3237044479,US -3237044480,3237044623,CA -3237044624,3237044631,US -3237044632,3237044639,CA -3237044640,3237044647,US -3237044648,3237044695,CA -3237044696,3237044703,US -3237044704,3237044711,CA -3237044712,3237044719,US -3237044720,3237044727,CA -3237044728,3237044735,US -3237044736,3237044815,CA -3237044816,3237044831,US -3237044832,3237044887,CA -3237044888,3237044895,US -3237044896,3237045031,CA -3237045032,3237045039,US -3237045040,3237045223,CA -3237045224,3237045231,US -3237045232,3237045247,CA -3237045248,3237045663,US -3237045664,3237045671,FI -3237045672,3237046559,US -3237046560,3237046607,CA -3237046608,3237046623,US -3237046624,3237046647,CA -3237046648,3237046655,SE -3237046656,3237046671,CA -3237046672,3237046767,US -3237046768,3237046775,CA -3237046776,3237046815,US -3237046816,3237046879,CA -3237046880,3237046943,US -3237046944,3237047039,CA -3237047040,3237047295,FR -3237047296,3237047807,US -3237047808,3237047839,CA -3237047840,3237047871,US -3237047872,3237047935,CA -3237047936,3237048031,US -3237048032,3237048079,CA -3237048080,3237048111,US -3237048112,3237048127,CA -3237048128,3237048143,US -3237048144,3237048159,CA -3237048160,3237048191,US -3237048192,3237048255,CA -3237048256,3237048575,US -3237048576,3237048767,CA -3237048768,3237048783,US -3237048784,3237049855,CA -3237049856,3237050111,US -3237050112,3237050159,GB -3237050160,3237050175,US -3237050176,3237050303,GB -3237050304,3237051903,US -3237051904,3237052159,TR -3237052160,3237052319,CA -3237052320,3237052367,US -3237052368,3237052415,CA -3237052416,3237125295,US -3237125296,3237125311,CR -3237125312,3237154815,US -3237154816,3237155839,ES -3237155840,3237156863,AU -3237156864,3237170175,US -3237170176,3237171199,CA -3237171200,3237182463,US -3237182464,3237183487,NL -3237183488,3237205503,US -3237205504,3237206015,CA -3237206016,3237216255,US -3237216256,3237281791,JP -3237281792,3237285119,US -3237285120,3237285631,AU -3237285632,3237287935,US -3237287936,3237288191,CA -3237288192,3237289471,US -3237289472,3237289727,BR -3237289728,3237290495,US -3237291008,3237291263,NZ -3237291264,3237294847,US -3237294848,3237295103,CA -3237295104,3237296639,US -3237296640,3237297151,SG -3237297152,3237297407,CL -3237297408,3237305087,US -3237305088,3237305343,CA -3237305344,3237308671,US -3237308672,3237310719,AU -3237310720,3237312767,US -3237312768,3237313023,BO -3237313024,3237319679,US -3237319680,3237319935,DZ -3237319936,3237320703,US -3237320704,3237320959,UA -3237320960,3237321471,US -3237321728,3237322751,US -3237322752,3237323263,CA -3237323264,3237323519,IN -3237323520,3237325055,US -3237325056,3237325311,PL -3237325312,3237325823,US -3237325824,3237326079,CA -3237326080,3237328639,US -3237328640,3237328895,CA -3237328896,3237329151,US -3237329152,3237329407,NZ -3237329408,3237330943,US -3237330944,3237331199,AU -3237331200,3237331967,US -3237331968,3237332223,HK -3237332224,3237335039,US -3237335040,3237335295,AU -3237335296,3237335551,US -3237335552,3237337599,AU -3237337600,3237337855,US -3237338112,3237339391,US -3237339392,3237339647,GB -3237339648,3237340159,US -3237340160,3237340415,CA -3237340416,3237345535,US -3237345536,3237346303,KR -3237346304,3237366015,US -3237366016,3237366271,AU -3237366272,3237412863,US -3237412864,3237413119,CA -3237413120,3237415679,GB -3237415680,3237415935,US -3237415936,3237416959,CA -3237416960,3237478399,US -3237478400,3237511167,LK -3237511168,3237548031,US -3237548032,3237552127,KR -3237552128,3237554431,US -3237554432,3237554434,SG -3237554435,3237554435,US -3237554436,3237554463,SG -3237554464,3237554943,US -3237554944,3237555199,SG -3237555200,3237568511,US -3237568512,3237572607,CA -3237572608,3237576703,US -3237576704,3237609471,CA -3237609472,3237613567,US -3237613568,3237614591,CA -3237614592,3237615615,US -3237615616,3237616895,CA -3237616896,3237642239,US -3237642240,3237650431,AU -3237650432,3237653503,US -3237653504,3237653759,IN -3237653760,3237655039,US -3237655040,3237655551,IN -3237655552,3237675007,US -3237675008,3237675263,CA -3237675264,3237681663,US -3237681664,3237682943,CA -3237682944,3237684991,US -3237684992,3237685247,CL -3237685248,3237688319,US -3237688320,3237689343,CA -3237689344,3237690623,US -3237690624,3237691903,SA -3237691904,3237698303,US -3237698304,3237698559,CA -3237698560,3237712895,US -3237712896,3237713151,AU -3237713152,3237716991,US -3237716992,3237717247,CA -3237717248,3237717503,US -3237717504,3237717759,CA -3237717760,3237724927,US -3237724928,3237725183,AU -3237725184,3237725439,CA -3237725440,3237725695,US -3237725696,3237726207,CA -3237726208,3237726463,US -3237726720,3237726975,GH -3237726976,3237727231,US -3237727232,3237728255,AU -3237728256,3237732863,US -3237732864,3237733119,NL -3237734144,3237734399,CA -3237734400,3237773311,US -3237773312,3237777407,CA -3237777408,3237781503,US -3237781504,3237785599,CA -3237785600,3237797887,US -3237797888,3237801983,CA -3237801984,3237858303,US -3237858304,3237863423,CA -3237863424,3237863431,US -3237863432,3237863439,CN -3237863440,3237863447,US -3237863448,3237863463,CN -3237863464,3237863471,US -3237863472,3237863559,CN -3237863560,3237863567,US -3237863568,3237863591,CN -3237863592,3237863599,US -3237863600,3237863607,CN -3237863608,3237863623,US -3237863624,3237863639,CN -3237863640,3237863655,US -3237863656,3237863663,CN -3237863664,3237863687,US -3237863688,3237863735,CN -3237863736,3237863751,US -3237863752,3237863775,CN -3237863776,3237863791,US -3237863792,3237863823,CN -3237863824,3237863839,US -3237863840,3237863871,CN -3237863872,3237863879,US -3237863880,3237863887,CN -3237863888,3237863903,US -3237863904,3237863927,CN -3237863928,3237863935,US -3237863936,3237863951,CN -3237863952,3237863959,US -3237863960,3237863967,CN -3237863968,3237863975,US -3237863976,3237863983,CN -3237863984,3237863991,US -3237863992,3237864007,CN -3237864008,3237864015,US -3237864016,3237864079,CN -3237864080,3237864087,US -3237864088,3237864127,CN -3237864128,3237864135,US -3237864136,3237864143,CN -3237864144,3237864151,US -3237864152,3237864159,CN -3237864160,3237864167,US -3237864168,3237864199,CN -3237864200,3237864207,US -3237864208,3237864215,CN -3237864216,3237864231,US -3237864232,3237864247,CN -3237864248,3237864255,US -3237864256,3237864263,CN -3237864264,3237864271,US -3237864272,3237864335,CN -3237864336,3237864343,US -3237864344,3237864351,CN -3237864352,3237864359,US -3237864360,3237864375,CN -3237864376,3237864383,US -3237864384,3237864423,CN -3237864424,3237864431,US -3237864432,3237864439,CN -3237864440,3237864447,US -3237864448,3237864527,CN -3237864528,3237864543,US -3237864544,3237864583,CN -3237864584,3237864591,US -3237864592,3237864631,CN -3237864632,3237864639,US -3237864640,3237864679,CN -3237864680,3237864703,US -3237864704,3237864711,CN -3237864712,3237864735,US -3237864736,3237864791,CN -3237864792,3237864799,US -3237864800,3237864807,CN -3237864808,3237864815,US -3237864816,3237864903,CN -3237864904,3237864911,US -3237864912,3237864919,CN -3237864920,3237864935,US -3237864936,3237864975,CN -3237864976,3237864983,US -3237864984,3237864999,CN -3237865000,3237865007,US -3237865008,3237865079,CN -3237865080,3237865111,US -3237865112,3237865127,CN -3237865128,3237865135,US -3237865136,3237865167,CN -3237865168,3237865183,US -3237865184,3237865255,CN -3237865256,3237865263,US -3237865264,3237865311,CN -3237865312,3237865319,US -3237865320,3237865375,CN -3237865376,3237865383,US -3237865384,3237865415,CN -3237865416,3237865463,US -3237865464,3237865471,CN -3237865472,3237865487,US -3237865488,3237865495,CN -3237865496,3237865519,US -3237865520,3237865591,CN -3237865592,3237865599,US -3237865600,3237865631,CN -3237865632,3237865639,US -3237865640,3237865647,CN -3237865648,3237865663,US -3237865664,3237865679,CN -3237865680,3237865687,US -3237865688,3237865767,CN -3237865768,3237865775,US -3237865776,3237865799,CN -3237865800,3237865807,US -3237865808,3237865815,CN -3237865816,3237865839,US -3237865840,3237865855,CN -3237865856,3237865871,US -3237865872,3237865879,CN -3237865880,3237865895,US -3237865896,3237866039,CN -3237866040,3237866055,US -3237866056,3237866071,CN -3237866072,3237866087,US -3237866088,3237866095,CN -3237866096,3237866103,US -3237866104,3237866143,CN -3237866144,3237866151,US -3237866152,3237866215,CN -3237866216,3237866223,US -3237866224,3237866287,CN -3237866288,3237866295,US -3237866296,3237866319,CN -3237866320,3237866327,US -3237866328,3237866391,CN -3237866392,3237866399,US -3237866400,3237866439,CN -3237866440,3237866455,US -3237866456,3237866527,CN -3237866528,3237866535,US -3237866536,3237866591,CN -3237866592,3237866615,US -3237866616,3237866655,CN -3237866656,3237866687,US -3237866688,3237866735,CN -3237866736,3237866759,US -3237866760,3237866767,CN -3237866768,3237866775,US -3237866776,3237866823,CN -3237866824,3237866831,US -3237866832,3237866839,CN -3237866840,3237866855,US -3237866856,3237866863,CN -3237866864,3237866903,US -3237866904,3237866911,CN -3237866912,3237866919,US -3237866920,3237866975,CN -3237866976,3237866983,US -3237866984,3237867007,CN -3237867008,3237867015,US -3237867016,3237867023,CN -3237867024,3237867031,US -3237867032,3237867039,CN -3237867040,3237867055,US -3237867056,3237867063,CN -3237867064,3237867071,US -3237867072,3237867079,CN -3237867080,3237867087,US -3237867088,3237867103,CN -3237867104,3237867119,US -3237867120,3237867175,CN -3237867176,3237867183,US -3237867184,3237867239,CN -3237867240,3237867247,US -3237867248,3237867255,CN -3237867256,3237867279,US -3237867280,3237867287,CN -3237867288,3237867295,US -3237867296,3237867319,CN -3237867320,3237867327,US -3237867328,3237867343,CN -3237867344,3237867359,US -3237867360,3237867407,CN -3237867408,3237867423,US -3237867424,3237867447,CN -3237867448,3237867455,US -3237867456,3237867471,CN -3237867472,3237867479,US -3237867480,3237867495,CN -3237867496,3237867503,US -3237867504,3237867511,CN -3237867512,3237867519,US -3237867520,3237867775,HK -3237867776,3237868031,AU -3237868032,3237868159,HK -3237868160,3237868287,AU -3237868288,3237868543,DK -3237868544,3237868799,GB -3237868800,3237869311,US -3237869312,3237869439,KR -3237869440,3237869567,JP -3237869568,3237869823,AU -3237869824,3237869951,PH -3237869952,3237870079,VN -3237870080,3237870335,IS -3237870336,3237870591,SG -3237870592,3237870847,BN -3237870848,3237871103,RO -3237871104,3237871231,TH -3237871232,3237871359,TW -3237871360,3237871615,RU -3237871616,3237892063,US -3237892064,3237892071,GB -3237892072,3237893631,US -3237893632,3237893887,TW -3237893888,3237894911,US -3237894912,3237895167,HK -3237895168,3237895423,US -3237895424,3237895679,HK -3237895680,3237896191,US -3237896192,3237900287,PR -3237900288,3237955071,US -3237955072,3237955327,NL -3237955328,3237955591,US -3237955592,3237955599,NL -3237955600,3237956367,US -3237956368,3237956383,NL -3237956384,3237957247,US -3237957248,3237957375,NL -3237957376,3237957631,GB -3237957632,3237957887,AU -3237957888,3237958143,CA -3237958144,3237958399,PE -3237958400,3237958655,BS -3237958656,3237958911,PY -3237958912,3237959167,JM -3237959168,3237959423,GY -3237959424,3237959679,NI -3237959680,3237959935,US -3237959936,3237960191,CA -3237960192,3237960447,SR -3237960448,3237960703,GB -3237960704,3237960959,AU -3237960960,3237961215,DE -3237961216,3237961471,US -3237961472,3237961727,CA -3237961728,3237961983,US -3237961984,3237962239,CA -3237962240,3237962495,GB -3237962496,3237962751,AU -3237962752,3237963007,CA -3237963008,3237963519,US -3237963520,3237963775,RO -3237963776,3237964031,AU -3237964032,3237964287,RO -3237964288,3237964799,US -3237964800,3237965055,DE -3237965056,3237965311,US -3237965312,3237965567,DE -3237965568,3237965823,US -3237965824,3237966079,DE -3237966080,3237966591,US -3237966592,3237966847,DE -3237966848,3237967103,US -3237967104,3237967359,IT -3237967360,3237967615,DE -3237967616,3237968639,US -3237968640,3237968895,NL -3237968896,3237969151,US -3237969152,3237969407,RO -3237969408,3238002687,US -3238002688,3238008831,NL -3238008832,3238010879,AE -3238010880,3238017023,CH -3238017024,3238018303,DK -3238018304,3238018559,UA -3238018560,3238018815,FR -3238018816,3238019071,DE -3238019072,3238035711,PL -3238035968,3238037503,RU -3238037504,3238039039,LV -3238039040,3238039551,UA -3238039552,3238039807,PL -3238039808,3238040063,RU -3238040576,3238042623,RU -3238042624,3238042879,IR -3238042880,3238043135,IT -3238043136,3238043647,GB -3238043648,3238043903,NL -3238043904,3238044159,DK -3238044160,3238044671,KZ -3238044672,3238045183,FI -3238045184,3238047743,RU -3238047744,3238048255,GB -3238048256,3238048767,NL -3238048768,3238049791,CH -3238049792,3238050303,RU -3238050304,3238050815,DE -3238050816,3238051071,AT -3238051072,3238051327,GB -3238051328,3238051583,RO -3238051584,3238051839,GB -3238051840,3238053375,PL -3238053376,3238053631,RU -3238053632,3238053887,DE -3238053888,3238054911,RU -3238054912,3238055935,UA -3238055936,3238056959,PL -3238057216,3238057471,BG -3238057472,3238057983,RU -3238057984,3238059519,UA -3238059520,3238059775,NO -3238059776,3238060031,UA -3238060032,3238060287,CH -3238060288,3238060543,RO -3238060544,3238060799,HU -3238061056,3238061311,UA -3238061824,3238062079,CZ -3238062080,3238062591,CH -3238063104,3238063359,PL -3238063360,3238063615,CH -3238063616,3238063871,DE -3238064128,3238064383,UA -3238064384,3238064639,ES -3238064640,3238064895,PL -3238064896,3238065151,DK -3238065152,3238065407,SI -3238065664,3238065919,DE -3238065920,3238066175,UA -3238066176,3238066431,DE -3238066432,3238066687,GB -3238066688,3238066943,DE -3238066944,3238067199,LT -3238067200,3238067455,NO -3238067456,3238067711,SE -3238067712,3238067967,AT -3238067968,3238068223,GB -3238068224,3238133759,IE -3238133760,3238199295,SI -3238199296,3238264831,DK -3238264832,3238330367,IS -3238330368,3238337023,CH -3238337024,3238337535,LI -3238337536,3238395903,CH -3238395904,3238461439,HU -3238461440,3238502399,DE -3238502400,3238504447,RU -3238504448,3238510591,DE -3238518784,3238526975,DE -3238526976,3238527231,RU -3238529024,3238530047,CH -3238531072,3238535167,CH -3238535168,3238536191,SE -3238536192,3238537215,DK -3238537216,3238538495,CH -3238538496,3238538751,PL -3238538752,3238539263,UA -3238539264,3238541311,CH -3238541568,3238541823,PL -3238541824,3238542591,CH -3238542592,3238542847,PL -3238543360,3238545407,CH -3238545920,3238546431,RU -3238546432,3238546943,CH -3238546944,3238547455,UA -3238548992,3238549503,CZ -3238549504,3238555647,CH -3238559232,3238559487,SE -3238559744,3238562303,CH -3238562560,3238562815,IR -3238562816,3238573567,CH -3238573568,3238574079,PL -3238575104,3238578431,CH -3238578432,3238578687,UA -3238578944,3238579199,RU -3238579200,3238579455,CH -3238580224,3238588415,CH -3238589696,3238589951,CH -3238589952,3238590207,LT -3238590464,3238590719,CH -3238590976,3238591231,SA -3238591232,3238592511,CH -3238592512,3238594559,GB -3238594560,3238595583,BE -3238595584,3238595839,SI -3238595840,3238596351,GB -3238596608,3238596863,BG -3238596864,3238597119,RU -3238597120,3238597375,DE -3238597376,3238597631,SI -3238597632,3238597887,GB -3238597888,3238598143,SI -3238598144,3238598399,RU -3238598400,3238598655,NL -3238598656,3238598911,CH -3238598912,3238599167,PL -3238599168,3238599679,HU -3238599680,3238599935,US -3238608896,3238621183,SE -3238623232,3238623487,LV -3238623488,3238623743,PL -3238623744,3238623999,CH -3238624000,3238624255,PL -3238624256,3238625279,HU -3238625280,3238630399,LU -3238630400,3238631423,GR -3238632960,3238633215,UA -3238633216,3238653951,DK -3238653952,3238655999,RU -3238656000,3238656255,GB -3238656256,3238656511,RU -3238656512,3238657023,UA -3238657024,3238657535,AT -3238657536,3238657791,GB -3238658048,3238821887,SE -3238821888,3238823935,HR -3238823936,3238860799,SE -3238860800,3238862847,HR -3238862848,3238903807,SE -3238903808,3238905855,HR -3238905856,3238914047,SE -3238914048,3238916095,HR -3238916096,3238941695,SE -3238941696,3238942719,NL -3238942720,3238967295,SE -3238967296,3238969343,HR -3238969344,3238975487,SE -3238975488,3238977535,HR -3238977536,3238981631,SE -3238981632,3238983679,HR -3238983680,3238993919,SE -3238993920,3238995967,HR -3238995968,3239018495,SE -3239018496,3239020543,HR -3239020544,3239022591,SE -3239022592,3239024639,HR -3239024640,3239026687,SE -3239026688,3239028735,HR -3239028736,3239051263,SE -3239051264,3239059455,DE -3239062272,3239062527,ES -3239062528,3239062783,CH -3239062784,3239063039,UA -3239063040,3239063295,HU -3239063296,3239063551,UA -3239063552,3239075839,DE -3239075840,3239076095,GB -3239076096,3239076351,DE -3239076352,3239076607,CH -3239076608,3239076863,PL -3239076864,3239077119,NL -3239077120,3239077375,UA -3239077376,3239077631,BG -3239077632,3239077887,PT -3239077888,3239078143,CZ -3239078144,3239078399,UA -3239078656,3239078911,PL -3239078912,3239079167,GB -3239079168,3239079423,SI -3239079680,3239079935,MD -3239079936,3239088127,DE -3239088384,3239088639,GB -3239088640,3239088895,DK -3239088896,3239089151,IL -3239089152,3239089407,RO -3239089664,3239089919,GB -3239090176,3239090431,SI -3239090432,3239090687,ES -3239090688,3239090943,NL -3239090944,3239091199,AT -3239091456,3239091711,BG -3239091712,3239091967,UA -3239091968,3239092223,FR -3239092224,3239104511,DE -3239104512,3239105279,RU -3239105280,3239105535,CH -3239105536,3239106559,DE -3239106560,3239106815,ES -3239106816,3239107071,CH -3239107072,3239107327,RO -3239107328,3239107583,GR -3239107584,3239107839,CH -3239108096,3239109887,DE -3239109888,3239110143,PL -3239110144,3239110655,DE -3239110656,3239110911,RU -3239110912,3239111167,UA -3239111168,3239111423,NL -3239111424,3239111679,DE -3239111936,3239112191,AT -3239112192,3239112447,IL -3239112704,3239112959,PL -3239112960,3239113215,CH -3239113216,3239113471,AT -3239113472,3239113727,ES -3239113728,3239113983,AT -3239113984,3239114239,DE -3239114240,3239114495,BG -3239114496,3239114751,UA -3239114752,3239116543,DE -3239116544,3239116799,PL -3239116800,3239117055,PT -3239117056,3239117311,SI -3239117312,3239117567,DE -3239118848,3239119871,DE -3239119872,3239120127,GB -3239120128,3239120383,CZ -3239120384,3239120639,PL -3239120896,3239121663,DE -3239121664,3239121919,FR -3239121920,3239123967,DE -3239127296,3239127551,PL -3239127552,3239127807,IL -3239127808,3239128063,RU -3239128064,3239128319,UA -3239128320,3239128575,IT -3239128576,3239128831,UA -3239128832,3239129087,CZ -3239129088,3239130111,DE -3239130112,3239130367,RU -3239130368,3239130623,JO -3239130624,3239130879,PL -3239132160,3239133183,DE -3239133440,3239133695,GB -3239133696,3239133951,ES -3239133952,3239134207,SE -3239134208,3239134463,IL -3239134464,3239134719,UA -3239134976,3239135231,PL -3239135232,3239135487,SE -3239135488,3239135743,FR -3239135744,3239135999,IL -3239136000,3239136255,UA -3239136256,3239136511,CH -3239136512,3239136767,DE -3239136768,3239137023,MD -3239137024,3239137279,LI -3239138304,3239138559,PL -3239138560,3239138815,CH -3239141376,3239145471,US -3239145472,3239147519,DE -3239147520,3239149567,SG -3239149568,3239160319,GB -3239160320,3239160575,US -3239160576,3239160831,DE -3239160832,3239161087,PL -3239161088,3239161343,BY -3239161344,3239161599,PL -3239161600,3239161855,HU -3239162368,3239162623,DE -3239163904,3239164159,PL -3239164160,3239164671,DE -3239164672,3239164927,GB -3239165952,3239166207,FR -3239166464,3239166719,CH -3239166720,3239166975,RO -3239166976,3239167231,FR -3239167232,3239167487,DE -3239167488,3239167743,FR -3239167744,3239167999,CH -3239168000,3239168255,PL -3239168256,3239168511,CH -3239168512,3239168767,SE -3239168768,3239169023,PL -3239169024,3239169535,DE -3239169536,3239169791,DK -3239169792,3239170047,SE -3239170048,3239170303,UA -3239170304,3239170559,FR -3239170560,3239170815,GB -3239170816,3239171071,SE -3239171072,3239171327,PL -3239171328,3239171583,UA -3239171584,3239171839,PL -3239172096,3239172607,UA -3239172608,3239172863,SE -3239172864,3239172991,DE -3239172992,3239173002,BG -3239173003,3239173119,DE -3239173376,3239173631,DE -3239173632,3239173887,AT -3239173888,3239174143,PL -3239174400,3239174655,US -3239174656,3239174911,GB -3239174912,3239175167,SI -3239175424,3239175679,BG -3239175680,3239175935,DE -3239176192,3239180287,DE -3239180288,3239181311,CZ -3239181312,3239181567,AT -3239181824,3239182079,DE -3239182336,3239205887,DE -3239205888,3239206143,US -3239206144,3239264255,DE -3239264256,3239264767,NO -3239264768,3239266303,RU -3239266816,3239267327,UA -3239267328,3239267839,FR -3239267840,3239268351,CH -3239268352,3239268863,SE -3239268864,3239269375,RU -3239269376,3239270399,UA -3239270400,3239270911,GB -3239270912,3239271423,SA -3239271424,3239271935,AT -3239271936,3239272447,CH -3239272960,3239273471,GB -3239273472,3239274495,RU -3239274496,3239275007,PL -3239275520,3239276543,UA -3239276544,3239277055,LU -3239277056,3239277567,DE -3239277568,3239279103,RU -3239279104,3239280127,PL -3239280128,3239280639,RU -3239281664,3239282687,RU -3239282688,3239283711,FI -3239283712,3239284735,PL -3239284736,3239285247,IR -3239285248,3239285503,SE -3239285504,3239285759,BG -3239286784,3239287807,UA -3239287808,3239288831,GB -3239288832,3239289855,DE -3239289856,3239290879,PL -3239290880,3239291903,RU -3239291904,3239292927,BG -3239292928,3239293951,CZ -3239293952,3239294975,DE -3239294976,3239295999,UA -3239296000,3239297023,GB -3239297024,3239298047,RO -3239298048,3239299071,GB -3239301120,3239302143,FR -3239302144,3239303167,PL -3239303168,3239304191,FR -3239304192,3239305215,HR -3239305216,3239306239,GB -3239306240,3239307263,UA -3239307264,3239308287,EG -3239308288,3239309311,DE -3239309312,3239313407,UA -3239313408,3239445759,DE -3239445760,3239446015,PL -3239446016,3239446271,RU -3239446272,3239446527,FR -3239446528,3239447551,DE -3239448576,3239449599,DE -3239451648,3239451903,PL -3239451904,3239452159,DE -3239452160,3239452415,CY -3239452416,3239452671,HR -3239452672,3239464959,DE -3239465216,3239465471,PL -3239465472,3239465727,AT -3239465728,3239465983,PL -3239465984,3239466239,UA -3239466240,3239466495,AT -3239466752,3239467007,GB -3239467008,3239467263,RU -3239467264,3239467519,GB -3239467520,3239467775,IT -3239467776,3239468031,PL -3239468032,3239468287,FR -3239468288,3239468543,RO -3239468544,3239468799,NO -3239468800,3239469055,RO -3239470080,3239470591,DE -3239470592,3239470847,CH -3239470848,3239471103,BG -3239471872,3239472127,FR -3239472128,3239474943,DE -3239474944,3239475199,ES -3239475200,3239477247,DE -3239480320,3239480575,UA -3239480832,3239481087,CH -3239481088,3239481343,FR -3239485440,3239486719,DE -3239486720,3239486975,ES -3239486976,3239487487,DE -3239487744,3239487999,PL -3239488256,3239488511,CH -3239488512,3239488767,KW -3239488768,3239489023,RO -3239489024,3239489279,DE -3239489280,3239489535,PL -3239489536,3239501823,DE -3239506432,3239506687,RU -3239506688,3239506943,GB -3239507200,3239507455,GB -3239507968,3239508223,BG -3239508224,3239508479,SA -3239508480,3239508735,NO -3239508736,3239508991,DE -3239508992,3239509247,PL -3239509248,3239509503,DE -3239509504,3239509759,CH -3239509760,3239514111,DE -3239518208,3239522303,DE -3239522304,3239522559,PL -3239522560,3239522815,SI -3239523072,3239523327,PL -3239523328,3239523583,BG -3239523584,3239523839,UA -3239523840,3239524095,PL -3239524352,3239524607,DE -3239524608,3239524863,SE -3239524864,3239525119,UA -3239525120,3239525375,LT -3239525632,3239525887,PL -3239525888,3239526143,SI -3239526144,3239526399,PL -3239526400,3239538687,DE -3239538688,3239539199,NL -3239539200,3239539455,IT -3239539456,3239539711,BE -3239539712,3239539967,GB -3239539968,3239540223,SE -3239540480,3239540735,DE -3239540736,3239540991,GB -3239540992,3239541247,FR -3239541248,3239541503,UA -3239541504,3239541759,FR -3239541760,3239542015,GB -3239543808,3239544831,DE -3239544832,3239545087,GB -3239545088,3239545343,SI -3239545344,3239545855,HU -3239545856,3239546111,UA -3239546112,3239546367,GB -3239546368,3239546623,RU -3239546624,3239546879,NL -3239547904,3239549951,DE -3239549952,3239550207,TR -3239550208,3239550463,UA -3239550464,3239550719,FR -3239550720,3239550975,NO -3239550976,3239554047,DE -3239554048,3239554303,SE -3239554560,3239554815,PL -3239554816,3239555071,UA -3239556096,3239556351,SA -3239556352,3239556607,UA -3239556608,3239556863,HR -3239556864,3239557119,UA -3239557120,3239565055,DE -3239565056,3239565311,US -3239565312,3239567359,DE -3239567360,3239567615,GB -3239567616,3239567871,UA -3239567872,3239568127,DE -3239568128,3239568383,FR -3239568384,3239568639,SE -3239568640,3239568895,NO -3239568896,3239574783,DE -3239575040,3239575295,DE -3239575296,3239575551,DK -3239575552,3239577599,DE -3239578624,3239578879,DE -3239579136,3239579391,PL -3239579392,3239581695,DE -3239581696,3239581951,PL -3239581952,3239582207,UA -3239582208,3239582463,GB -3239582464,3239582719,DE -3239582720,3239582975,GB -3239582976,3239583231,IT -3239583232,3239583487,UA -3239583744,3239591935,DE -3239591936,3239592447,FI -3239592448,3239592703,US -3239592704,3239593983,FI -3239593984,3239624703,DE -3239624704,3239625727,CH -3239625728,3239626751,RU -3239626752,3239628799,PL -3239628800,3239629823,DE -3239630848,3239631871,DE -3239631872,3239632895,UA -3239632896,3239636991,DE -3239636992,3239638015,BG -3239638016,3239639039,PL -3239639040,3239639551,SI -3239639552,3239639807,CZ -3239639808,3239640063,SI -3239640064,3239641087,DE -3239641088,3239643135,PL -3239643136,3239645183,RU -3239645184,3239653375,DE -3239653376,3239657471,NL -3239657472,3239665663,DE -3239666176,3239666687,AT -3239666688,3239667199,DE -3239667200,3239667711,CH -3239667712,3239670271,RO -3239670272,3239670783,DE -3239670784,3239671295,GB -3239671296,3239671807,DE -3239671808,3239672319,UA -3239672832,3239673343,TR -3239673344,3239673855,SE -3239673856,3239682047,DE -3239682048,3239682559,PL -3239682560,3239683071,BG -3239683072,3239683583,PT -3239683584,3239684095,PL -3239684096,3239686143,DE -3239686144,3239686655,UA -3239686656,3239687167,IT -3239687168,3239687679,UA -3239687680,3239688191,DE -3239688192,3239688703,PL -3239688704,3239689215,GB -3239689728,3239690239,RU -3239690240,3239690495,ES -3239690496,3239690751,PL -3239691008,3239691263,FR -3239691520,3239691775,FR -3239691822,3239691822,GB -3239692032,3239692287,AT -3239692288,3239696383,DE -3239697408,3239697663,HR -3239697664,3239697919,RU -3239697920,3239698175,PL -3239698432,3239706623,DE -3239706880,3239707135,NL -3239707392,3239707647,UA -3239707648,3239707903,GB -3239707904,3239708159,DE -3239708160,3239708415,SE -3239708416,3239708671,RO -3239708672,3239708927,AT -3239708928,3239709183,NL -3239709184,3239709439,RO -3239709440,3239709695,FR -3239709952,3239710207,UA -3239710464,3239710719,DE -3239710720,3239710975,RU -3239710976,3239711231,SE -3239711232,3239711487,BY -3239711488,3239711743,RU -3239711744,3239711999,UA -3239712512,3239712767,GB -3239712768,3239713023,DE -3239713024,3239713279,PL -3239713280,3239713535,SI -3239713536,3239713791,UA -3239713792,3239714047,DE -3239714048,3239714303,FR -3239714304,3239714559,SE -3239714560,3239714815,HU -3239714816,3239723007,DE -3239723008,3239731199,GB -3239731200,3239739391,DE -3239739392,3239739647,IT -3239739648,3239739903,RO -3239739904,3239740159,CH -3239740160,3239740415,PL -3239740416,3239740671,DK -3239740928,3239741183,UA -3239741184,3239741439,RU -3239741440,3239744511,DE -3239747584,3239759871,DE -3239760128,3239760383,UA -3239761408,3239761663,RU -3239761920,3239762175,BG -3239762176,3239762431,RU -3239762432,3239762687,DK -3239762944,3239763199,SI -3239763200,3239763455,SE -3239763456,3239763711,GB -3239763968,3239772159,DE -3239772160,3239772415,NL -3239772416,3239772671,IE -3239772672,3239773183,DK -3239773184,3239773439,FR -3239773440,3239773951,PL -3239773952,3239774207,SA -3239774464,3239774719,ES -3239774976,3239775231,PT -3239776256,3239778303,DE -3239782400,3239782655,AT -3239782656,3239782911,RU -3239782912,3239783167,GB -3239783168,3239783423,CH -3239783424,3239783679,DK -3239783936,3239784191,DE -3239784192,3239784447,ES -3239784448,3239788543,DE -3239788544,3239788607,GB -3239789056,3239789567,DE -3239789568,3239790079,FR -3239790080,3239790591,RO -3239790592,3239791103,NL -3239791104,3239791615,CH -3239792128,3239792639,FR -3239792640,3239793151,UA -3239793152,3239793663,PL -3239793664,3239794175,RO -3239794176,3239794687,NL -3239794688,3239795199,GB -3239795200,3239795711,PL -3239795712,3239796223,IL -3239796224,3239796735,NO -3239796736,3239821311,DE -3239821312,3239821823,SE -3239821824,3239822335,FR -3239822336,3239822847,UA -3239822848,3239823359,PL -3239823360,3239823871,SE -3239823872,3239824383,IT -3239824384,3239824895,PL -3239824896,3239825407,UZ -3239825408,3239825919,UA -3239825920,3239826431,PL -3239826432,3239826943,GB -3239826944,3239827455,RU -3239827456,3239827967,DK -3239827968,3239828479,CH -3239828480,3239828991,DE -3239828992,3239829503,RU -3239830016,3239830527,CH -3239831040,3239831551,RU -3239832576,3239834623,RU -3239834624,3239835135,AT -3239836160,3239836671,DK -3239836672,3239837183,DE -3239837184,3239837695,SE -3239837696,3239837951,PL -3239838976,3239839231,DE -3239839232,3239839487,RU -3239839744,3239839999,SK -3239840000,3239840511,SA -3239840512,3239840767,DE -3239840768,3239841023,AT -3239841024,3239841279,DE -3239841536,3239846911,DE -3239847936,3239848447,DE -3239848448,3239848703,CH -3239848960,3239849215,RU -3239849216,3239849471,GB -3239849472,3239849727,RU -3239849728,3239849983,NL -3239849984,3239859199,DE -3239859200,3239859455,PL -3239859456,3239859711,UA -3239859712,3239859967,HU -3239859968,3239860223,CA -3239860224,3239860479,DE -3239860480,3239860735,FI -3239860736,3239861247,DE -3239861248,3239861503,UA -3239861760,3239862015,SA -3239862016,3239862271,IT -3239862272,3239874559,DE -3239874816,3239875071,DE -3239875072,3239875327,SI -3239875328,3239875583,DK -3239875840,3239876095,DK -3239876096,3239876351,DE -3239876352,3239876607,RO -3239876608,3239876863,NL -3239876864,3239877119,DE -3239877120,3239877375,GB -3239877376,3239877631,IL -3239877632,3239877887,UA -3239877888,3239878143,IT -3239878144,3239878399,PL -3239878400,3239878655,SE -3239878656,3239882751,DE -3239882752,3239883007,GB -3239883008,3239883263,UA -3239883264,3239883519,GB -3239883520,3239883775,CZ -3239883776,3239884031,DE -3239884032,3239884287,RU -3239884544,3239884799,FR -3239884800,3239885055,UA -3239885056,3239885311,CH -3239885312,3239885567,UA -3239885568,3239885823,PL -3239885824,3239886079,CH -3239886080,3239886335,PL -3239886336,3239886591,RU -3239886848,3239888895,DE -3239888896,3239889151,UA -3239889152,3239889407,GB -3239889664,3239889919,FI -3239889920,3239890175,AT -3239890176,3239890431,FR -3239890432,3239890687,NL -3239890688,3239895039,DE -3239895040,3239895295,DK -3239895296,3239895551,TR -3239895552,3239895807,PL -3239895808,3239896063,DK -3239896064,3239896575,DE -3239896576,3239896831,PL -3239896832,3239897087,HU -3239897088,3239897343,GB -3239897344,3239897599,FR -3239897600,3239897855,RU -3239897856,3239898111,FR -3239898112,3239898367,NO -3239898624,3239898879,DE -3239898880,3239899135,RU -3239899136,3239901695,DE -3239901696,3239901951,BG -3239901952,3239902207,DE -3239902720,3239902975,EE -3239903232,3239907327,DE -3239907328,3239907583,UA -3239908096,3239908351,RU -3239908864,3239910399,DE -3239912960,3239913215,DE -3239913216,3239913471,LT -3239914240,3239914495,DE -3239915520,3239915775,PL -3239915776,3239916031,HU -3239916032,3239916287,SA -3239916288,3239916543,PL -3239916544,3239916799,FR -3239916800,3239917055,KZ -3239917056,3239917311,DE -3239917312,3239917567,BG -3239919616,3239922687,DE -3239922688,3239922943,CZ -3239922944,3239938815,DE -3239938816,3239939071,NL -3239939072,3239948543,DE -3239950848,3239951103,DE -3239951104,3239951359,RO -3239951360,3239951615,DE -3239952384,3239954431,DE -3239954432,3239954687,UA -3239954688,3239954943,DK -3239954944,3239955199,ES -3239955200,3239955711,UA -3239955712,3239955967,PL -3239955968,3239956223,CZ -3239956224,3239956479,PL -3239956480,3239959551,DE -3239959552,3239959807,UA -3239959808,3239960063,BE -3239960064,3239960319,FR -3239960320,3239960575,GB -3239960576,3239966719,DE -3239967232,3239967487,DE -3239967744,3239968255,DE -3239968512,3239968767,PL -3239968768,3239969023,NO -3239969536,3239970047,DE -3239972864,3239974911,DE -3239974912,3239975935,GB -3239975936,3239976191,RO -3239976192,3239976447,DE -3239976448,3239976959,NL -3239977984,3239978751,DE -3239978752,3239979007,RU -3239979264,3239979519,GB -3239979520,3239979775,DE -3239980032,3239993343,DE -3239995392,3239996415,DE -3239996416,3239996671,GB -3239996928,3239997183,BE -3239997184,3239997439,GB -3239997440,3240004863,DE -3240004864,3240005119,FR -3240005120,3240005375,SE -3240005376,3240005631,NL -3240005632,3240009727,DE -3240009728,3240009983,PL -3240009984,3240010239,IL -3240010496,3240010751,AT -3240010752,3240011007,HU -3240011520,3240011775,CH -3240011776,3240026111,DE -3240026112,3240027135,FR -3240027136,3240028159,BG -3240028160,3240029183,GB -3240029184,3240030207,RU -3240030208,3240032255,UA -3240032256,3240033279,RS -3240033280,3240033535,GB -3240033536,3240033791,UA -3240033792,3240034303,GB -3240034304,3240034559,RU -3240034560,3240035327,DE -3240036096,3240037375,DE -3240037888,3240038143,AT -3240038912,3240039423,DE -3240049664,3240050687,DE -3240054784,3240058879,DE -3240067072,3240083455,DE -3240083456,3240085503,RU -3240085504,3240087551,KZ -3240087552,3240091647,IM -3240091648,3240097791,DE -3240098816,3240099327,CH -3240099840,3240101887,GB -3240102144,3240102399,GB -3240102912,3240103935,UA -3240104192,3240104703,GB -3240104704,3240104959,NL -3240104960,3240105215,RU -3240105216,3240105471,UA -3240105472,3240105727,GB -3240105984,3240109055,GB -3240109056,3240109567,PL -3240109568,3240112639,GB -3240112640,3240112895,PL -3240112896,3240113151,AT -3240113152,3240113407,LV -3240113408,3240113663,TR -3240113664,3240113919,RU -3240113920,3240114175,TR -3240114176,3240114431,CZ -3240114432,3240114687,UA -3240114688,3240114943,GB -3240115200,3240116223,RU -3240116224,3240116479,DE -3240116480,3240116735,DK -3240116736,3240117247,GB -3240117261,3240117261,UA -3240118272,3240120319,ES -3240120320,3240120831,IR -3240120832,3240121343,GB -3240122368,3240123391,GB -3240125440,3240125695,RO -3240125696,3240125951,GB -3240126208,3240132607,GB -3240163328,3240165375,GB -3240165376,3240165887,PL -3240165888,3240166399,ES -3240166400,3240166911,PL -3240167424,3240167935,PL -3240167936,3240168447,RU -3240168448,3240168959,FR -3240168960,3240169471,CZ -3240169472,3240169983,IL -3240169984,3240170495,IT -3240170496,3240171007,DE -3240171008,3240171519,CZ -3240171520,3240172031,RO -3240172032,3240173055,RU -3240173056,3240173567,CH -3240173568,3240174079,RO -3240174080,3240174591,PL -3240174592,3240175103,FR -3240175104,3240175615,RU -3240176128,3240176639,PL -3240176640,3240177151,UA -3240177152,3240177663,FR -3240177664,3240178175,UA -3240178688,3240179199,BE -3240179200,3240179711,UA -3240179712,3240180223,FR -3240180736,3240181247,NL -3240181248,3240181759,RU -3240181760,3240182271,UA -3240182784,3240183295,RU -3240183296,3240183807,NL -3240183808,3240184319,GB -3240184320,3240184831,CZ -3240184832,3240185343,GB -3240185344,3240185855,FR -3240185856,3240188415,RU -3240188416,3240188927,RO -3240188928,3240189439,MD -3240189440,3240189951,RO -3240189952,3240190463,DE -3240190464,3240190975,IT -3240190976,3240191487,RU -3240191488,3240191999,AE -3240192000,3240192511,UA -3240193024,3240193535,GB -3240193536,3240194047,PL -3240194560,3240195071,AT -3240195072,3240195583,GB -3240195584,3240196095,RO -3240196096,3240197119,RU -3240197120,3240197631,PL -3240197632,3240198143,CZ -3240198144,3240198655,CH -3240199168,3240199679,RU -3240199680,3240200191,NL -3240200704,3240201215,GB -3240201728,3240202239,CH -3240202240,3240202751,RU -3240202752,3240203263,GB -3240203264,3240203775,DK -3240203776,3240204287,AT -3240204288,3240204799,SE -3240204800,3240205311,RO -3240205312,3240205823,GB -3240205824,3240206335,DE -3240206336,3240206847,RU -3240207872,3240208127,RU -3240208128,3240208895,FR -3240208896,3240209407,GB -3240209408,3240209919,AE -3240209920,3240210943,PL -3240210944,3240211455,GB -3240211456,3240211967,NL -3240211968,3240212479,BE -3240212480,3240212991,RU -3240212992,3240213503,GB -3240213504,3240214015,SE -3240214016,3240214527,DK -3240214528,3240215551,RU -3240215552,3240216063,UA -3240216064,3240216575,GB -3240216576,3240217087,RO -3240217088,3240217599,UA -3240218112,3240218623,UA -3240218624,3240219135,NL -3240219136,3240219647,AT -3240219648,3240220159,UA -3240220160,3240220671,NL -3240220672,3240221183,AT -3240221184,3240221695,SE -3240221696,3240222207,NL -3240222208,3240222719,FR -3240222720,3240223231,KW -3240223232,3240223743,RU -3240223744,3240224255,MT -3240224256,3240225279,RU -3240225280,3240225791,IL -3240225792,3240226303,RU -3240226304,3240226815,CH -3240226816,3240227327,RU -3240227840,3240228351,GB -3240228352,3240228863,SE -3240228864,3240229375,GB -3240229376,3240229887,RO -3240230400,3240230911,GB -3240230912,3240231935,PL -3240231936,3240232959,NL -3240232960,3240235007,RU -3240235008,3240236031,FR -3240236032,3240237055,UA -3240237056,3240239103,DE -3240239104,3240240127,CH -3240240128,3240241151,US -3240241152,3240242175,FI -3240242176,3240243199,PL -3240243200,3240244223,DE -3240244224,3240245247,PL -3240245248,3240246271,IL -3240246272,3240247295,UA -3240247296,3240248319,RS -3240248320,3240249343,DE -3240249344,3240250367,UA -3240251392,3240252415,IE -3240252416,3240253439,LT -3240253440,3240254463,BE -3240254464,3240256511,UA -3240256512,3240257535,DE -3240257536,3240258559,FO -3240258560,3240259583,RO -3240259584,3240260607,PL -3240260608,3240262655,DE -3240262656,3240263679,RU -3240263680,3240264191,UA -3240264192,3240264703,FR -3240264704,3240265215,TR -3240265216,3240265727,HU -3240265728,3240266239,CH -3240266240,3240266751,PL -3240266752,3240267263,UA -3240267264,3240267775,RS -3240267776,3240268287,DE -3240268288,3240269311,GB -3240269312,3240269823,NL -3240269824,3240270335,SE -3240270336,3240270847,UA -3240270848,3240271359,RO -3240271360,3240271871,PL -3240271872,3240272383,RU -3240272384,3240272895,PL -3240272896,3240273407,RU -3240273408,3240273919,NL -3240273920,3240274431,UA -3240274432,3240274943,GB -3240274944,3240275455,UA -3240275456,3240275967,RO -3240275968,3240276479,GR -3240276480,3240276991,PL -3240276992,3240278015,RO -3240278016,3240278527,RU -3240278528,3240279039,GB -3240279040,3240279551,CH -3240279552,3240280063,RU -3240280064,3240280191,DE -3240280192,3240280319,SE -3240280320,3240280447,PL -3240280832,3240280959,GB -3240280960,3240281215,PL -3240281344,3240281471,PL -3240281472,3240281599,FR -3240281600,3240281727,JO -3240281728,3240281855,PL -3240281856,3240281983,NL -3240281984,3240282111,NO -3240282112,3240282239,DE -3240282240,3240282367,RU -3240282368,3240282495,RO -3240282624,3240282879,SE -3240282880,3240283007,UA -3240283008,3240283391,PL -3240283392,3240283647,TR -3240283648,3240283903,AT -3240283904,3240284159,DE -3240284160,3240285183,RU -3240285184,3240286207,PL -3240286208,3240287231,UA -3240287232,3240288255,PL -3240288256,3240296447,GB -3240296448,3240296703,RO -3240298496,3240300543,GB -3240302848,3240303103,UA -3240304640,3240305663,RU -3240305664,3240305919,PL -3240306176,3240306687,RU -3240306688,3240306943,BG -3240306944,3240307199,PL -3240307200,3240307711,RU -3240307712,3240308223,ES -3240308224,3240308479,BG -3240308480,3240308735,PL -3240308736,3240309759,RU -3240309760,3240310783,NO -3240310784,3240311807,GB -3240311808,3240312063,PL -3240312320,3240312575,IR -3240312832,3240316927,SG -3240321024,3240321535,RU -3240321792,3240322047,PL -3240322048,3240322303,RU -3240322560,3240324095,CZ -3240324096,3240324351,RO -3240324352,3240324607,RU -3240324608,3240324863,PL -3240324864,3240325119,SI -3240325120,3240328191,GB -3240328192,3240328447,SG -3240328448,3240361983,GB -3240361984,3240362239,TR -3240362240,3240362495,DE -3240362496,3240362751,GB -3240363008,3240370175,GB -3240370176,3240370431,CH -3240370432,3240370687,DE -3240370688,3240370943,GB -3240370944,3240371199,RU -3240371200,3240371455,CH -3240371456,3240371711,RO -3240371712,3240371967,RU -3240371968,3240372223,TR -3240372224,3240372479,SI -3240372480,3240372735,RU -3240372992,3240373247,IE -3240373248,3240373503,RO -3240373504,3240373759,FR -3240373760,3240374015,DE -3240374016,3240374271,GB -3240378368,3240386559,GB -3240394752,3240403455,GB -3240406272,3240406527,DE -3240407040,3240407295,IL -3240407296,3240407551,NL -3240407552,3240407807,NO -3240408576,3240408831,FR -3240408832,3240409087,PL -3240409088,3240409343,TR -3240409600,3240409855,NL -3240409856,3240410367,DE -3240410368,3240410623,AT -3240410624,3240410879,PT -3240410880,3240411135,NO -3240411136,3240419327,RO -3240419840,3240420095,AT -3240420608,3240420863,NL -3240420864,3240421119,GB -3240423424,3240435711,GB -3240436480,3240436735,GB -3240436736,3240437759,DE -3240443904,3240460287,GB -3240460288,3240461055,IL -3240461056,3240461567,DE -3240461568,3240461823,UA -3240461824,3240462079,RU -3240462080,3240462335,TR -3240462336,3240462591,RO -3240462592,3240462847,RU -3240462848,3240463103,RO -3240463104,3240463615,PL -3240463616,3240463871,UA -3240463872,3240464127,GB -3240464128,3240464383,SA -3240464384,3240464639,AT -3240464640,3240464895,FR -3240464896,3240465151,GB -3240465152,3240465407,CH -3240465408,3240465919,DE -3240465920,3240466175,FR -3240466176,3240466687,DE -3240466688,3240466943,PT -3240466944,3240467199,TR -3240467456,3240467711,UA -3240467712,3240467967,RU -3240467968,3240468223,DE -3240468224,3240468479,CH -3240468480,3240476671,GB -3240484864,3240486911,GB -3240487936,3240488191,CH -3240488192,3240488447,GB -3240488448,3240488703,BG -3240488704,3240488959,NL -3240488960,3240491007,GB -3240493056,3240501247,SE -3240505344,3240505599,PL -3240505600,3240505855,GB -3240506368,3240506623,GB -3240507392,3240575487,GB -3240575488,3240575743,RO -3240575744,3240575999,GB -3240576000,3240576255,DE -3240576256,3240576511,UA -3240576512,3240576767,FR -3240576768,3240577023,PL -3240577024,3240577279,UA -3240577280,3240577535,RO -3240577536,3240577791,DE -3240577792,3240578559,UA -3240578816,3240579071,IL -3240579072,3240581119,GB -3240583168,3240587263,GB -3240587264,3240587519,NL -3240587520,3240587775,RU -3240587776,3240588031,UA -3240588032,3240588287,DE -3240588288,3240588543,RU -3240588544,3240588799,RO -3240588800,3240589055,UA -3240589056,3240589311,RO -3240589312,3240593407,SE -3240593408,3240593663,GB -3240594176,3240594431,DK -3240594432,3240594943,GB -3240595456,3240607743,GB -3240609792,3240611839,DE -3240611840,3240613887,GB -3240615936,3240620031,GB -3240621824,3240622079,GB -3240622080,3240622591,RU -3240622848,3240623103,GB -3240624128,3240689663,EE -3240689664,3240690175,GB -3240690176,3240690687,TR -3240690688,3240691199,UA -3240691200,3240691711,IT -3240691712,3240692735,DE -3240692736,3240693247,DK -3240693248,3240693759,ES -3240693760,3240695807,BE -3240695808,3240697855,SE -3240698112,3240698367,LV -3240698624,3240699135,SI -3240699136,3240699391,DE -3240699904,3240700159,LT -3240700160,3240700415,AT -3240700416,3240700671,BE -3240700672,3240700927,ES -3240700928,3240701183,PL -3240701184,3240701439,LV -3240701440,3240701695,ES -3240701952,3240702975,UA -3240704000,3240705023,GR -3240705024,3240706047,UA -3240706048,3240707071,BG -3240707840,3240709119,FR -3240709120,3240710143,RU -3240710144,3240710399,UA -3240710400,3240710655,LT -3240710912,3240711167,FR -3240711168,3240711679,IT -3240711680,3240711935,RU -3240712192,3240712447,UA -3240712448,3240712703,SI -3240712704,3240712959,CH -3240713472,3240713727,RU -3240713728,3240713983,AT -3240713984,3240714239,FR -3240714240,3240716287,GB -3240716288,3240718335,CH -3240718336,3240718847,PL -3240719360,3240719871,DE -3240719872,3240720383,SE -3240720384,3240720895,DE -3240721408,3240721919,DE -3240721920,3240722431,RO -3240722432,3240723455,UA -3240723456,3240724479,DE -3240724480,3240724991,CH -3240724992,3240725503,AT -3240725504,3240726527,RU -3240726528,3240727039,DE -3240727040,3240727551,DZ -3240727552,3240728063,CH -3240728064,3240728575,GR -3240728576,3240729087,GB -3240729600,3240730111,DK -3240730112,3240730623,BE -3240730624,3240731647,ES -3240731648,3240732671,GB -3240732672,3240733695,SE -3240733696,3240734719,PL -3240734720,3240735743,IT -3240735744,3240736255,FR -3240736256,3240736767,BG -3240736768,3240737791,UA -3240737792,3240738815,BG -3240739072,3240739327,CH -3240739328,3240739583,FR -3240739584,3240739839,LV -3240739840,3240740095,DE -3240740096,3240740351,LT -3240740352,3240740607,IT -3240740864,3240741119,DE -3240741120,3240741375,AT -3240741376,3240741631,IL -3240741632,3240741887,RU -3240742144,3240742399,IT -3240742400,3240742655,RO -3240742656,3240742911,AT -3240742912,3240743423,IL -3240743424,3240743935,PL -3240744448,3240744959,SE -3240744960,3240745471,RO -3240745472,3240745983,UA -3240745984,3240746495,GB -3240746496,3240747007,FR -3240747008,3240747263,SE -3240747264,3240747519,TR -3240747776,3240748031,ES -3240748032,3240748287,AT -3240748288,3240748543,GR -3240748544,3240749055,PL -3240749056,3240749311,AT -3240749312,3240749567,BE -3240749568,3240749823,ES -3240749824,3240750335,IT -3240750592,3240750847,FR -3240750848,3240751103,UA -3240751104,3240752127,ES -3240752128,3240754175,RO -3240754176,3240755199,DE -3240755200,3240787967,IT -3240788992,3240790015,IT -3240790528,3240791551,IT -3240791552,3240791807,RU -3240791808,3240792063,ES -3240792064,3240792319,GB -3240792320,3240792575,RU -3240792576,3240792831,CH -3240792832,3240793087,PL -3240793088,3240793343,UA -3240793600,3240794111,FR -3240794112,3240794367,GB -3240794368,3240794879,PL -3240794880,3240795135,DE -3240795136,3240795391,UA -3240795392,3240795647,RU -3240795648,3240795903,CH -3240795904,3240796159,SE -3240796160,3240808959,IT -3240809216,3240809471,PL -3240809472,3240809727,NL -3240809728,3240809983,FR -3240810240,3240810495,SE -3240810496,3240810751,TR -3240811008,3240811263,PL -3240811520,3240811775,SA -3240811776,3240812031,DE -3240812032,3240812287,HU -3240812288,3240812543,KW -3240813568,3240814591,PL -3240814592,3240816639,IT -3240818688,3240820735,NL -3240820736,3240820799,FR -3240820800,3240820831,CY -3240820832,3240820863,GB -3240820864,3240820991,PL -3240820992,3240822783,IT -3240823808,3240824319,PL -3240824576,3240825855,IT -3240826880,3240827135,IT -3240827136,3240827391,FR -3240827392,3240827647,BG -3240827648,3240827903,CH -3240828160,3240828415,DE -3240828928,3240837119,IT -3240839424,3240839679,IT -3240840192,3240840447,IT -3240840448,3240840703,PL -3240840704,3240840959,RU -3240841216,3240843263,IT -3240843264,3240843775,NL -3240843776,3240844031,PL -3240844288,3240844543,NL -3240844544,3240844799,CH -3240845056,3240845311,UA -3240845312,3240845823,IT -3240846592,3240846847,IT -3240846848,3240847359,VA -3240847360,3240852735,IT -3240852736,3240852991,GB -3240853248,3240853503,RU -3240853504,3240854527,VA -3240854528,3240855039,IT -3240855552,3240857599,IT -3240857600,3240857855,PL -3240858624,3240858879,PL -3240859136,3240859391,NL -3240859392,3240859647,SE -3240859648,3240861183,CH -3240861184,3240861439,AT -3240861696,3240866815,IT -3240866816,3240867071,RU -3240867072,3240867327,PL -3240867328,3240867583,RU -3240867584,3240867839,CH -3240867840,3240873983,IT -3240873984,3240874495,RU -3240874496,3240875007,UA -3240875008,3240875519,AT -3240875520,3240876031,FR -3240876032,3240876543,DK -3240876544,3240877055,NL -3240877056,3240877567,DE -3240877568,3240879103,UA -3240879104,3240880127,PL -3240880128,3240881151,RU -3240882176,3240883199,PL -3240883200,3240884223,IL -3240884224,3240886271,UA -3240886272,3240954495,SE -3240954496,3240954623,DE -3240954624,3240955647,SE -3240955648,3240955903,GB -3240955904,3241017343,SE -3241017600,3241017855,AT -3241017856,3241018111,RU -3241018112,3241018367,FR -3241018368,3241022463,AT -3241027584,3241029119,AT -3241029120,3241029375,UA -3241029376,3241029631,PL -3241029632,3241031679,AT -3241032192,3241032703,AT -3241032704,3241032959,RU -3241032960,3241033215,GB -3241033216,3241033727,DE -3241033728,3241033983,IL -3241033984,3241034239,RU -3241034240,3241034495,UA -3241034752,3241035007,PL -3241035008,3241035263,DK -3241035264,3241035519,RO -3241035520,3241035775,SI -3241035776,3241036031,GB -3241036032,3241036287,CH -3241036544,3241036799,SI -3241036800,3241037055,GB -3241037056,3241037311,RU -3241037824,3241038079,NL -3241038080,3241038335,UA -3241038336,3241038591,DE -3241038592,3241039103,LT -3241039104,3241039359,FR -3241039360,3241039615,UA -3241039616,3241039871,GB -3241039872,3241040127,CH -3241040128,3241040383,UA -3241040384,3241040639,GB -3241040640,3241040895,RO -3241040896,3241062399,AT -3241063424,3241063679,IT -3241063680,3241063935,PL -3241063936,3241064191,DE -3241064192,3241064447,GB -3241064448,3241064703,DE -3241064704,3241065471,PL -3241065472,3241066495,AT -3241068800,3241069311,UA -3241069312,3241069567,FR -3241069824,3241070079,GB -3241070080,3241070335,FR -3241070336,3241070847,RU -3241070848,3241071103,AT -3241071104,3241071359,UA -3241071616,3241071871,PL -3241071872,3241072127,RU -3241072384,3241072639,DE -3241073920,3241074175,GB -3241074688,3241076735,AT -3241077248,3241077759,AT -3241077760,3241078015,LV -3241078016,3241078271,PL -3241078272,3241078527,ES -3241078528,3241078783,DE -3241080832,3241082879,AT -3241082880,3241083135,FR -3241083136,3241091071,CH -3241101056,3241101311,DK -3241101312,3241101567,RO -3241101568,3241101823,DE -3241101824,3241102079,BG -3241102336,3241102591,ES -3241102592,3241102847,DE -3241102848,3241103359,NL -3241103360,3241103615,FR -3241103616,3241103871,DK -3241103872,3241104127,DE -3241104128,3241104383,GB -3241104384,3241104639,ES -3241104640,3241104895,UA -3241105152,3241105407,RU -3241105408,3241108223,CH -3241108224,3241108735,DE -3241108736,3241108991,RO -3241108992,3241109247,SA -3241109248,3241117695,CH -3241117696,3241117951,SI -3241117952,3241118207,UA -3241118208,3241118463,AT -3241118464,3241118719,FR -3241118720,3241118975,CH -3241118976,3241119231,FR -3241119232,3241119487,DK -3241119488,3241119743,LT -3241119744,3241119999,RO -3241120000,3241120255,ES -3241120256,3241120511,RU -3241120512,3241120767,GB -3241120768,3241121023,RU -3241121024,3241121279,CH -3241121536,3241121791,PL -3241121792,3241122047,DE -3241122048,3241122303,CH -3241122304,3241122559,RU -3241122560,3241123327,AT -3241123328,3241124095,PL -3241124096,3241124351,DE -3241124352,3241124607,RO -3241124608,3241124863,PL -3241124864,3241125119,GB -3241125120,3241125375,IL -3241125376,3241125631,UA -3241125632,3241125887,SE -3241125888,3241129983,CH -3241129984,3241130239,FR -3241130240,3241130495,PT -3241130496,3241130751,DK -3241130752,3241131007,DE -3241131008,3241131263,NL -3241131264,3241131519,UA -3241131520,3241131775,CH -3241131776,3241132031,DK -3241132032,3241144319,CH -3241145856,3241146111,HR -3241146112,3241146367,PL -3241146368,3241146623,IL -3241146624,3241146879,RO -3241146880,3241148415,CH -3241148416,3241419519,FR -3241419520,3241419775,GP -3241419776,3241476095,FR -3241476864,3241477375,BE -3241477632,3241477887,GB -3241478144,3241481727,BE -3241481728,3241481983,PT -3241481984,3241482239,DE -3241482240,3241484799,SE -3241484800,3241485055,BE -3241485312,3241486335,BE -3241486336,3241487615,SE -3241487616,3241496575,BE -3241496576,3241496831,AT -3241497344,3241497599,UA -3241497600,3241497855,SE -3241497856,3241498111,DK -3241498112,3241498367,BE -3241498624,3241498879,NO -3241498880,3241499135,UA -3241499648,3241500159,DE -3241500160,3241500671,GB -3241501440,3241501440,GB -3241501696,3241501696,GB -3241501952,3241502463,BE -3241503232,3241503487,RS -3241503488,3241503999,BE -3241504000,3241505023,DE -3241505024,3241508095,BE -3241508096,3241508351,NL -3241508864,3241539839,BE -3241541376,3241541631,PL -3241541632,3241689087,FR -3241693184,3241699327,FR -3241699840,3241700095,SE -3241700352,3241721855,FR -3241722112,3241722367,FR -3241724416,3241724671,RU -3241724672,3241724927,FR -3241725952,3241726975,FR -3241728000,3241728255,DE -3241728256,3241729023,FR -3241730048,3241742335,FR -3241743360,3241743615,DE -3241744384,3241745407,FR -3241746432,3241763071,FR -3241763072,3241763327,DE -3241764864,3241803775,FR -3241803776,3241803823,CY -3241803832,3241803839,GB -3241803840,3241804031,CY -3241804032,3241805823,BE -3241807872,3241820159,BE -3241820160,3241821695,GB -3241821696,3241822207,GR -3241822208,3241824255,CZ -3241824256,3241828351,BE -3241836544,3241840639,BE -3241841664,3241842175,BE -3241843456,3241843711,CH -3241843712,3241848831,BE -3241852928,3241854463,SK -3241854464,3241854975,GB -3241854976,3241855999,DE -3241856000,3241857279,NL -3241857280,3241857535,CH -3241857536,3241859071,AT -3241859072,3241861119,US -3241861120,3241863167,BE -3241863168,3241863423,PL -3241863424,3241863679,FR -3241863680,3241863935,GR -3241863936,3241864191,GB -3241864192,3241864447,TR -3241864704,3241864959,SE -3241864960,3241865215,IT -3241865472,3241865727,NO -3241865728,3241865983,CH -3241865984,3241866239,RO -3241866240,3241866751,DE -3241866752,3241867007,UA -3241867008,3241867263,FR -3241867776,3241868031,NO -3241868032,3241868287,RU -3241868288,3241868543,HR -3241868544,3241868799,DE -3241869056,3241869311,BY -3241869312,3241934847,PL -3241934848,3242196991,GB -3242196992,3242393599,FI -3242393600,3242459135,NL -3242459136,3242467327,BG -3242467328,3242475519,HU -3242475520,3242483711,LV -3242483712,3242524671,BG -3242524672,3242590207,NO -3242590208,3242594463,FR -3242594464,3242594495,ES -3242594496,3242594559,FI -3242594560,3242594635,FR -3242594636,3242594639,GB -3242594640,3242594663,FR -3242594664,3242594667,DE -3242594668,3242595711,FR -3242595712,3242595839,IT -3242595840,3242595967,FR -3242595968,3242596095,ES -3242596096,3242596255,FR -3242596256,3242596287,LT -3242596288,3242596415,FR -3242596416,3242596479,PT -3242596480,3242597087,FR -3242597088,3242597119,CZ -3242597120,3242597343,FR -3242597344,3242597375,NL -3242597376,3242598351,FR -3242598352,3242598367,LT -3242598368,3242602823,FR -3242602824,3242602831,ES -3242602832,3242602975,FR -3242602976,3242603007,PL -3242603008,3242603039,FR -3242603040,3242603071,DE -3242603072,3242603127,FR -3242603128,3242603135,ES -3242603136,3242604095,FR -3242604096,3242604159,PL -3242604160,3242604287,IT -3242604288,3242604671,FR -3242604672,3242604799,NL -3242604800,3242605279,FR -3242605280,3242605311,BE -3242605312,3242606943,FR -3242606944,3242606959,BE -3242606960,3242606975,FR -3242606976,3242607039,ES -3242607040,3242607071,FR -3242607072,3242607103,DE -3242607104,3242607135,FR -3242607136,3242607167,CZ -3242607168,3242607231,PL -3242607232,3242607359,IT -3242607360,3242607375,GB -3242607376,3242607775,FR -3242607776,3242607807,CZ -3242607808,3242608383,FR -3242608384,3242608639,GB -3242608640,3242608767,FR -3242608768,3242608895,DE -3242608896,3242609919,FR -3242609920,3242610047,GB -3242610048,3242610271,FR -3242610272,3242610303,FI -3242610304,3242610431,BE -3242610432,3242614513,FR -3242614514,3242614514,PL -3242614515,3242614527,FR -3242614528,3242614783,PL -3242614784,3242615167,FR -3242615168,3242615295,IE -3242615296,3242615871,FR -3242615872,3242615935,PL -3242615936,3242615999,FR -3242616000,3242616063,NL -3242616064,3242616191,FR -3242616192,3242616319,ES -3242616320,3242616447,FR -3242616448,3242616575,DE -3242616576,3242616959,FR -3242616960,3242617087,IT -3242617088,3242617599,FR -3242617600,3242617727,GB -3242617728,3242617911,FR -3242617912,3242617919,ES -3242617920,3242618239,FR -3242618240,3242618367,NL -3242618368,3242618415,FR -3242618416,3242618431,CZ -3242618432,3242618495,PL -3242618496,3242620199,FR -3242620200,3242620207,ES -3242620208,3242620223,FR -3242620224,3242620239,PT -3242620240,3242620255,ES -3242620256,3242620287,PL -3242620288,3242620351,FR -3242620352,3242620359,ES -3242620360,3242620367,FR -3242620368,3242620383,PL -3242620384,3242622031,FR -3242622032,3242622047,PL -3242622048,3242622207,FR -3242622208,3242622463,PL -3242622464,3242622591,FR -3242622592,3242622623,PL -3242622624,3242622915,FR -3242622916,3242622927,PL -3242622928,3242622959,FR -3242622960,3242622975,PL -3242622976,3242655743,IT -3242655744,3242721279,NO -3242721280,3242852351,CH -3242852352,3242917887,BE -3242917888,3242950655,NO -3242950656,3242983423,BE -3242983424,3243048959,IT -3243048960,3243114495,SI -3243114496,3243245567,NL -3243245568,3243376639,AT -3243376640,3243442175,GB -3243442176,3243507711,AT -3243507712,3243507967,GB -3243509504,3243509759,CZ -3243509760,3243510015,RU -3243510016,3243510271,NL -3243510272,3243510527,CZ -3243510784,3243511807,CZ -3243512064,3243512319,UA -3243512320,3243512575,FR -3243512832,3243513087,DE -3243513088,3243513343,GR -3243513344,3243513855,UA -3243513856,3243514111,BE -3243514112,3243514367,CH -3243514368,3243514623,IE -3243514624,3243514879,DK -3243514880,3243515135,AT -3243515136,3243515391,PL -3243515648,3243515903,RU -3243515904,3243519999,CZ -3243520512,3243520767,UA -3243520768,3243521023,GB -3243521024,3243521279,AT -3243521280,3243521535,CZ -3243521536,3243521791,DE -3243521792,3243524095,CZ -3243524096,3243524351,RO -3243524352,3243524607,AT -3243524608,3243524863,DE -3243524864,3243525119,NL -3243525120,3243525375,CZ -3243525376,3243525631,RO -3243525888,3243526143,PL -3243526144,3243526399,UA -3243526400,3243526655,FR -3243526912,3243527167,SE -3243527168,3243527423,RU -3243527424,3243527679,UA -3243527936,3243528191,PL -3243528192,3243529215,CZ -3243529216,3243529471,BE -3243529728,3243529983,BG -3243529984,3243530239,GB -3243530496,3243530751,FR -3243531008,3243531263,DE -3243531776,3243532031,AT -3243532032,3243532287,DE -3243532288,3243536383,CZ -3243536384,3243536639,AT -3243537408,3243537919,CZ -3243540480,3243540991,CZ -3243544064,3243544319,GB -3243544320,3243544575,NL -3243544576,3243552767,CZ -3243552768,3243553023,NL -3243553024,3243553279,FR -3243553280,3243553535,DE -3243554048,3243554303,DE -3243554304,3243554559,PL -3243554560,3243554815,MD -3243554816,3243555071,LV -3243555072,3243555327,RO -3243555328,3243555583,CZ -3243556864,3243565055,CZ -3243565056,3243569151,GB -3243570432,3243570687,CZ -3243570688,3243570943,PL -3243571968,3243572223,GR -3243572224,3243572479,CZ -3243572992,3243573247,RU -3243573248,3243704319,CZ -3243704320,3243769855,SK -3243769856,3243900927,DK -3243900928,3243966463,NO -3243966464,3243974655,PL -3243974656,3243978751,LU -3243978752,3243982847,NL -3243982848,3243991039,HU -3243991040,3243999231,BE -3243999232,3244031999,NO -3244032000,3244097535,GR -3244097536,3244098559,DE -3244099584,3244100607,FR -3244100608,3244102655,UA -3244102656,3244103679,CH -3244103680,3244104703,BG -3244105728,3244107775,GB -3244107776,3244108799,RO -3244108800,3244109823,GB -3244109824,3244111871,UA -3244111872,3244112895,KZ -3244112896,3244113919,RU -3244113920,3244114943,CH -3244114944,3244115967,PL -3244115968,3244116991,SK -3244116992,3244118015,UA -3244119040,3244120063,GB -3244120064,3244122111,PL -3244123136,3244124159,UA -3244124160,3244125183,PL -3244125184,3244126207,UA -3244126208,3244127231,FR -3244127232,3244128255,UA -3244128256,3244129279,RU -3244129280,3244130303,FR -3244130304,3244131327,NO -3244131328,3244133375,FI -3244133376,3244134399,RO -3244134400,3244135423,PL -3244135424,3244137471,GB -3244137472,3244138495,PL -3244138496,3244139519,UA -3244139520,3244140543,GR -3244140544,3244141567,UA -3244141568,3244142591,NL -3244142592,3244143615,DE -3244143616,3244144639,FR -3244144640,3244146687,UA -3244146688,3244146943,GB -3244146944,3244147711,RU -3244147712,3244149759,GB -3244149760,3244150783,PL -3244150784,3244151807,CH -3244151808,3244152831,KZ -3244152832,3244153855,UA -3244153856,3244154879,NO -3244154880,3244155903,GB -3244155904,3244156927,UA -3244157952,3244158975,RU -3244158976,3244159999,DE -3244160000,3244161023,RU -3244161024,3244162047,SE -3244162048,3244163071,NO -3244163072,3244228607,FI -3244228608,3244261375,TN -3244261376,3244277759,IE -3244277760,3244294143,SI -3244294144,3244818431,DE -3244818432,3244818687,ES -3244818688,3244818943,AT -3244818944,3244819199,PL -3244819200,3244819455,DE -3244819456,3244819711,GB -3244819712,3244819967,RO -3244819968,3244820223,NL -3244820480,3244820735,BE -3244820736,3244820991,DE -3244820992,3244821247,SI -3244821248,3244821503,RU -3244821760,3244822015,TR -3244822016,3244822271,RU -3244822272,3244822527,GB -3244822528,3244822783,UA -3244822784,3244823039,CZ -3244823040,3244823295,DE -3244823296,3244823551,FR -3244823552,3244823807,GE -3244823808,3244824063,RO -3244824064,3244824319,IR -3244824320,3244824575,SI -3244824576,3244824831,RU -3244824832,3244825087,GB -3244825088,3244825343,DE -3244825344,3244826111,RU -3244826112,3244826367,RO -3244826368,3244826623,CH -3244826624,3244826879,DE -3244826880,3244827135,MK -3244827136,3244827391,AT -3244827392,3244827647,GB -3244827648,3244827903,FR -3244827904,3244828159,BE -3244828160,3244828415,FI -3244828416,3244828671,FR -3244828672,3244828927,SA -3244829184,3244829439,CH -3244829440,3244829695,DK -3244829696,3244829951,IL -3244829952,3244830463,PL -3244830464,3244830719,CH -3244830720,3244830975,FR -3244830976,3244831231,DE -3244831232,3244831487,PL -3244831488,3244831743,ES -3244831744,3244831999,PT -3244832000,3244832255,HU -3244832256,3244832511,FR -3244832512,3244832767,AT -3244832768,3244833023,FR -3244833024,3244833279,RU -3244833280,3244833535,UA -3244833536,3244833791,RU -3244833792,3244834047,FR -3244834048,3244834303,CH -3244834304,3244834559,IL -3244834560,3244834815,GB -3244834816,3244835071,RU -3244835072,3244835327,AT -3244835328,3244835583,DE -3244835840,3244836095,RS -3244836096,3244836607,RU -3244836608,3244836863,PL -3244836864,3244837119,FR -3244837120,3244837375,RO -3244837376,3244837887,RU -3244837888,3244838143,CY -3244838144,3244838399,IL -3244838400,3244838655,GB -3244838656,3244838911,BG -3244839168,3244839423,GB -3244839424,3244839679,AT -3244839680,3244839935,DK -3244839936,3244840191,DE -3244840192,3244840447,UA -3244840448,3244840703,IT -3244840704,3244840959,RU -3244840960,3244841215,PL -3244841216,3244841471,GB -3244841472,3244841727,DE -3244841728,3244842239,GB -3244842752,3244843007,DE -3244843008,3244843263,UA -3244843264,3244843519,RU -3244843520,3244843775,NL -3244843776,3244844031,PL -3244844032,3244844287,SE -3244844288,3244844543,GB -3244844544,3244844799,RU -3244844800,3244845055,GB -3244845056,3244845311,NL -3244845312,3244845567,NO -3244845568,3244845823,RO -3244845824,3244846335,GB -3244846336,3244846591,TR -3244846848,3244847103,NL -3244847104,3244847359,SE -3244847360,3244847615,GB -3244847616,3244847871,DK -3244847872,3244848127,IL -3244848128,3244848383,CH -3244848384,3244848639,IL -3244848640,3244848895,DE -3244848896,3244849151,IL -3244849152,3244849407,AT -3244849408,3244849663,RO -3244849664,3244849919,SE -3244849920,3244850175,RO -3244850176,3244850431,TR -3244850432,3244850687,AT -3244850688,3244850943,GB -3244850944,3244851455,RU -3244851456,3244851711,NL -3244851968,3244852223,GB -3244852224,3244852479,CH -3244852480,3244852735,UA -3244852736,3244852991,SI -3244852992,3244853247,DK -3244853248,3244853503,IE -3244853504,3244853759,IT -3244853760,3244854015,TR -3244854016,3244854271,RU -3244854272,3244854527,GB -3244854784,3244855295,RU -3244855296,3244855551,GB -3244855552,3244855807,RU -3244855808,3244856063,DE -3244856064,3244856319,IL -3244856320,3244856575,CH -3244856576,3244856831,RU -3244856832,3244857087,RO -3244857088,3244857343,IT -3244857344,3244857599,GB -3244857856,3244858111,PL -3244858112,3244858367,DE -3244858368,3244858623,PL -3244858624,3244858879,RU -3244858880,3244859135,FR -3244859136,3244859391,BE -3244859392,3244859647,SE -3244859648,3244859903,PL -3244859904,3244860159,FR -3244860160,3244860415,PL -3244860416,3244860671,GB -3244860672,3244860927,BG -3244860928,3244861183,PL -3244861184,3244861439,CH -3244861440,3244861951,GB -3244861952,3244862207,RU -3244862208,3244862463,DK -3244862464,3244862719,CZ -3244862720,3244862975,RO -3244862976,3244863231,DE -3244863232,3244863487,GB -3244863744,3244863999,RU -3244864000,3244864255,UA -3244864256,3244864511,GB -3244864512,3244864767,RO -3244864768,3244865023,RU -3244865024,3244865535,UA -3244865536,3244865791,PL -3244865792,3244866047,CH -3244866048,3244866559,NL -3244866560,3244866815,FI -3244866816,3244867071,UA -3244867328,3244867583,RU -3244867584,3244867839,NL -3244867840,3244868095,BE -3244868096,3244868351,DE -3244868352,3244868607,RU -3244868608,3244868863,FI -3244868864,3244869119,RU -3244869376,3244869631,FR -3244869632,3244869887,GR -3244869888,3244870143,TR -3244870144,3244870399,DK -3244870400,3244870655,UA -3244870656,3244870911,SA -3244870912,3244871167,FR -3244871168,3244871423,LT -3244871424,3244871679,RU -3244871680,3244872703,UA -3244872704,3244872959,IR -3244872960,3244873215,UA -3244873216,3244873471,SE -3244873472,3244873727,IE -3244873728,3244873983,DE -3244873984,3244874239,SE -3244874240,3244874495,ES -3244874496,3244874751,FR -3244874752,3244875007,DE -3244875008,3244875263,PL -3244875520,3244875775,IT -3244875776,3244876799,RU -3244876800,3244877055,DK -3244877056,3244877311,JO -3244877312,3244877567,RU -3244877568,3244877823,FR -3244877824,3244878079,AT -3244878080,3244878335,GB -3244878336,3244878591,RU -3244878592,3244878847,PL -3244878848,3244879103,SI -3244879104,3244879359,RU -3244879360,3244879615,CH -3244879616,3244879871,PL -3244879872,3244880127,SI -3244880128,3244880383,RU -3244880384,3244880639,UA -3244880640,3244880895,RU -3244880896,3244881151,PL -3244881152,3244881407,RU -3244881408,3244881663,DK -3244881664,3244881919,RO -3244881920,3244882175,RU -3244882176,3244882431,UA -3244882432,3244882687,IT -3244882688,3244882943,PL -3244883200,3244883455,KZ -3244883456,3244883711,CZ -3244883712,3244883967,NL -3244883968,3244884223,DE -3244884224,3244884479,FR -3244884480,3244884735,IR -3244884736,3244884991,NL -3244884992,3244885247,GR -3244885248,3244885503,CH -3244885504,3244885759,IR -3244885760,3244886015,UA -3244886016,3244886271,LB -3244886272,3244886527,CH -3244886528,3244886783,DK -3244886784,3244887039,RU -3244887040,3244887295,NL -3244887296,3244887551,GB -3244887552,3244887807,RU -3244887808,3244888063,BE -3244888064,3244888319,PL -3244888320,3244888575,DE -3244888576,3244888831,FR -3244888832,3244889087,DE -3244889088,3244889343,PL -3244889344,3244889599,US -3244889600,3244889855,SI -3244889856,3244890111,HR -3244890112,3244890367,PL -3244890368,3244890623,NL -3244890624,3244890879,FR -3244890880,3244891135,RU -3244891392,3244891647,PL -3244891648,3244891903,UA -3244892160,3244892415,PL -3244892416,3244892671,NL -3244892672,3244892927,ES -3244892928,3244893183,PL -3244893184,3244893439,BE -3244893440,3244893695,RU -3244893696,3244893951,DE -3244893952,3244894463,RU -3244894464,3244894719,UA -3244894720,3244894975,GR -3244894976,3244895231,FR -3244895232,3244895487,DK -3244895488,3244895743,PL -3244895744,3244895999,DE -3244896000,3244896511,GB -3244896512,3244896767,LT -3244896768,3244897023,NL -3244897024,3244897279,GB -3244897280,3244897535,DE -3244897536,3244897791,RU -3244897792,3244898047,GB -3244898048,3244898303,DE -3244898304,3244898559,KW -3244898560,3244898815,GI -3244899072,3244899327,RU -3244899328,3244899583,BG -3244899584,3244899839,GB -3244899840,3244900095,UA -3244900096,3244900351,PL -3244900352,3244900607,RO -3244900608,3244900863,RU -3244900864,3244901119,PL -3244901120,3244901375,SI -3244901376,3244901631,DE -3244901632,3244901887,GB -3244901888,3244902143,UA -3244902144,3244902655,RU -3244902656,3244902911,BE -3244902912,3244903167,DE -3244903168,3244903423,PL -3244903424,3244903679,FI -3244903680,3244903935,NO -3244903936,3244904191,RO -3244904192,3244904447,IT -3244904448,3244904703,GR -3244904960,3244905215,BY -3244905216,3244905471,MD -3244905728,3244905983,GR -3244905984,3244906239,AT -3244906240,3244906495,DE -3244906752,3244907007,SA -3244907008,3244907263,FR -3244907264,3244907519,RO -3244907520,3244907775,UA -3244907776,3244908287,RU -3244908800,3244909055,FI -3244909056,3244909311,GB -3244909312,3244909567,IL -3244909568,3244909823,RU -3244909824,3244910079,NL -3244910336,3244910591,DE -3244910592,3244910847,GB -3244910848,3244911103,DE -3244911104,3244911359,BE -3244911360,3244911615,RU -3244911616,3244911871,GB -3244911872,3244912127,GR -3244912128,3244912383,PL -3244912384,3244912639,NL -3244912640,3244912895,NO -3244912896,3244913151,SE -3244913152,3244913407,RU -3244913408,3244913663,SI -3244913664,3244913919,DK -3244913920,3244914431,RU -3244914432,3244914687,SA -3244914688,3244914943,GB -3244915200,3244915455,PL -3244915456,3244915711,FI -3244915712,3244915967,UA -3244915968,3244916223,PL -3244916224,3244916479,RU -3244916480,3244916735,SI -3244916736,3244916991,FR -3244916992,3244917247,PL -3244917248,3244917503,SE -3244917504,3244917759,AT -3244917760,3244918015,RU -3244918016,3244918271,BE -3244918272,3244918527,SE -3244918528,3244918783,UA -3244918784,3244919039,CH -3244919040,3244919295,DE -3244919296,3244919551,SE -3244919552,3244919807,DE -3244919808,3244920063,RO -3244920320,3244920575,SK -3244920576,3244920831,PL -3244920832,3244921087,NL -3244921088,3244921343,IE -3244921344,3244921599,LT -3244921600,3244921855,DE -3244921856,3244922111,BG -3244922112,3244922367,DK -3244922368,3244922623,GB -3244922880,3244923135,UA -3244923136,3244923391,AT -3244923648,3244923903,LV -3244923904,3244924159,RU -3244924160,3244924927,CZ -3244924928,3244925183,FI -3244925184,3244925439,CH -3244925696,3244925951,RS -3244925952,3244926207,UA -3244926464,3244926719,LV -3244926720,3244926975,PL -3244926976,3244927231,DE -3244927232,3244927487,RU -3244927488,3244927743,GB -3244927744,3244927999,US -3244928000,3244928255,GB -3244928256,3244928511,NL -3244928512,3244929023,RU -3244929024,3244929279,RO -3244929536,3244929791,PL -3244929792,3244930047,RU -3244930048,3244930303,PL -3244930304,3244930559,AT -3244930560,3244930815,CA -3244930816,3244931071,NL -3244931328,3244931583,RO -3244931584,3244931839,FR -3244931840,3244932095,NL -3244932096,3244932351,GB -3244932352,3244932607,UA -3244932608,3244932863,DK -3244932864,3244933375,PL -3244933376,3244933631,HR -3244933632,3244933887,GB -3244933888,3244934143,AT -3244934144,3244934399,BG -3244934400,3244934655,FR -3244934656,3244934911,RU -3244934912,3244935167,IL -3244935168,3244935423,NL -3244935424,3244935679,UA -3244935680,3244935935,PL -3244935936,3244936191,IL -3244936192,3244937215,AT -3244937472,3244937727,GB -3244937728,3244937983,UA -3244937984,3244938239,TR -3244938240,3244938495,GB -3244938496,3244938751,RU -3244938752,3244939007,AT -3244939008,3244939263,NL -3244939264,3244939519,UA -3244939776,3244940031,GB -3244940032,3244940287,UA -3244940288,3244940543,DK -3244940544,3244940799,PL -3244940800,3244941055,RU -3244941056,3244941311,DE -3244941312,3244941567,CY -3244941568,3244941823,FR -3244941824,3244942079,SE -3244942080,3244942335,PL -3244942336,3244942591,IT -3244942592,3244942847,PL -3244942848,3244943103,DE -3244943104,3244943359,GB -3244943360,3244943615,FR -3244943616,3244943871,NL -3244943872,3244944127,TR -3244944128,3244944639,RU -3244944640,3244944895,GE -3244944896,3244945151,FR -3244945152,3244945407,RO -3244945408,3244945663,LV -3244945664,3244945919,NL -3244945920,3244946175,PL -3244946176,3244946431,TR -3244946944,3244947455,DE -3244947456,3244947711,PL -3244947712,3244947967,UA -3244947968,3244948223,DE -3244948224,3244948479,PL -3244948480,3244948735,FR -3244948736,3244948991,IE -3244948992,3244949247,UA -3244949248,3244951551,RU -3244951552,3244952575,FI -3244952576,3244953599,GB -3244953600,3244954623,DE -3244955648,3244957695,UA -3244958720,3244959743,FR -3244959744,3244960767,RU -3244960768,3244961791,RO -3244961792,3244962815,KG -3244962816,3244963839,IL -3244963840,3244966911,UA -3244966912,3244968959,RU -3244968960,3244969983,PL -3244969984,3244971007,UA -3244971008,3244972031,PL -3244972032,3244975103,RU -3244975104,3244977151,PL -3244977152,3244978175,RU -3244978176,3244979199,GB -3244979200,3244980223,FR -3244980224,3244981247,DK -3244981248,3244982271,RO -3244982272,3244983295,PL -3244983296,3244984319,RU -3244984320,3244985343,UA -3244985344,3244986367,DE -3244986368,3244987391,UA -3244987392,3244988415,RU -3244988416,3244990463,PL -3244990464,3244991487,RU -3244991488,3244992511,DK -3244992512,3244994559,RU -3244994560,3244995583,ES -3244995584,3244996607,IT -3244996608,3244997631,UA -3244997632,3244998655,RU -3244998656,3244999679,PL -3244999680,3245000703,IQ -3245000704,3245001727,UA -3245001728,3245002751,IL -3245002752,3245003263,PL -3245003264,3245003519,SE -3245003520,3245003775,UA -3245003776,3245004799,RU -3245004800,3245005823,PL -3245005824,3245006847,UA -3245006848,3245007871,DE -3245007872,3245008895,PL -3245008896,3245009919,RU -3245009920,3245010431,UA -3245010432,3245010687,PL -3245010688,3245010943,FR -3245010944,3245011967,RU -3245011968,3245012991,PL -3245012992,3245014015,UA -3245014016,3245015039,GR -3245015040,3245016063,RU -3245016064,3245017087,RS -3245017088,3245018111,PL -3245018112,3245019135,RU -3245019136,3245019391,UZ -3245019392,3245019462,SC -3245019463,3245019463,UZ -3245019464,3245019647,SC -3245019648,3245020159,UZ -3245020160,3245021183,RU -3245021184,3245022207,UA -3245022208,3245023231,NO -3245023232,3245024255,PL -3245024256,3245025279,BG -3245025280,3245026303,UA -3245026304,3245027327,GB -3245027328,3245029375,RU -3245029376,3245030399,FR -3245030400,3245032447,RU -3245032448,3245033471,BG -3245033472,3245034495,UA -3245035520,3245036543,UA -3245036544,3245037567,IS -3245037568,3245038591,PL -3245038592,3245039615,RU -3245039616,3245040639,MD -3245040640,3245041663,RU -3245041664,3245043711,UA -3245043712,3245044735,RU -3245044736,3245045759,GB -3245045760,3245046783,DE -3245046784,3245047807,FR -3245047808,3245050879,UA -3245050880,3245051903,RU -3245051904,3245052927,DE -3245052928,3245054975,RU -3245054976,3245055999,AT -3245056000,3245057023,CZ -3245057024,3245058047,PL -3245058048,3245061119,UA -3245061120,3245062143,RU -3245063168,3245065215,RU -3245065216,3245066239,PL -3245066240,3245067263,UA -3245067264,3245068287,GB -3245069312,3245070335,PL -3245071360,3245072383,NL -3245072384,3245073407,UA -3245073408,3245076479,RU -3245076480,3245077503,FR -3245077504,3245078527,UA -3245078528,3245079551,PL -3245079552,3245080575,CZ -3245080576,3245082623,SE -3245082624,3245084927,DE -3245084928,3245085183,BE -3245085184,3245085439,GB -3245085440,3245085695,DE -3245085952,3245086207,FR -3245086208,3245086463,AT -3245086464,3245086719,GH -3245086720,3245086975,BG -3245087488,3245087743,NL -3245087744,3245087999,GH -3245088000,3245088255,LV -3245088256,3245088511,KW -3245088512,3245088767,FR -3245088768,3245089279,BG -3245089280,3245089791,PL -3245089792,3245090303,GB -3245090304,3245090815,UA -3245090816,3245091327,AT -3245091328,3245091839,SE -3245091840,3245092351,UA -3245092864,3245093887,UA -3245093888,3245094911,RO -3245094912,3245095935,UA -3245095936,3245096959,IT -3245099008,3245103103,GB -3245105664,3245106175,NL -3245106176,3245106687,AT -3245106688,3245107711,UA -3245107712,3245108735,CZ -3245108736,3245109247,FR -3245110272,3245111295,DE -3245111296,3245112319,UA -3245112320,3245113343,PL -3245113344,3245113855,UA -3245113856,3245114367,RU -3245114368,3245114879,SK -3245114880,3245115391,JO -3245115392,3245115903,CH -3245115904,3245116415,AT -3245116416,3245116927,FR -3245116928,3245117439,KW -3245117440,3245118463,LV -3245118464,3245119487,GB -3245120512,3245121535,GB -3245121536,3245122047,GR -3245122048,3245122559,UA -3245122560,3245123071,DE -3245123072,3245123583,FR -3245123584,3245124095,GB -3245124096,3245124607,UA -3245124608,3245125119,DE -3245125120,3245125631,ES -3245125632,3245125887,DE -3245125888,3245126143,PL -3245126400,3245126655,DE -3245126656,3245126911,FR -3245126912,3245127167,DE -3245127168,3245127423,RU -3245127680,3245127935,DE -3245127936,3245128191,LV -3245128192,3245128447,IT -3245128448,3245128703,CH -3245128704,3245129215,LU -3245129216,3245129471,DK -3245129472,3245129983,GB -3245129984,3245130239,DE -3245130240,3245130495,PL -3245130496,3245130751,IL -3245130752,3245131007,SE -3245131008,3245131263,FR -3245131520,3245132031,GB -3245132032,3245132287,BE -3245132288,3245132543,PL -3245132544,3245132799,FR -3245132800,3245133311,IT -3245134080,3245134335,UA -3245134336,3245134591,NL -3245134848,3245135103,AT -3245135104,3245135359,TR -3245135360,3245135615,UG -3245135872,3245136127,FR -3245136128,3245136383,DE -3245136384,3245136639,GB -3245136896,3245137151,PL -3245137152,3245137407,GB -3245137408,3245137663,DE -3245137664,3245137919,SE -3245137920,3245138431,DK -3245138432,3245138943,UA -3245138944,3245139455,PL -3245139968,3245140479,CH -3245140992,3245141503,UA -3245141504,3245141759,NL -3245141760,3245142015,SE -3245142016,3245143039,UA -3245143040,3245144063,GB -3245144064,3245145087,UA -3245145088,3245146111,UG -3245146112,3245147135,FR -3245147136,3245148159,DE -3245148160,3245149183,UA -3245150208,3245154303,IS -3245154304,3245158399,IT -3245158400,3245158911,CH -3245158912,3245159423,GB -3245159424,3245159935,CH -3245159936,3245160447,BG -3245160448,3245160959,DK -3245160960,3245161471,PL -3245161472,3245161727,RU -3245161728,3245161983,BG -3245161984,3245162495,BE -3245163008,3245163519,KE -3245163520,3245164031,NL -3245164032,3245164543,RU -3245164544,3245165055,BE -3245165056,3245165567,AT -3245165568,3245166079,RU -3245166592,3245166847,UA -3245166848,3245167103,SA -3245167104,3245167359,IL -3245167360,3245167615,GB -3245168128,3245168383,SE -3245168384,3245168639,FR -3245168640,3245168895,AT -3245168896,3245169151,RU -3245169152,3245169407,IT -3245169408,3245169663,PL -3245169920,3245170175,PT -3245170432,3245170687,CH -3245170688,3245171711,DE -3245172736,3245173759,IT -3245174784,3245175039,IT -3245175040,3245175295,DE -3245175296,3245175551,RU -3245175552,3245175807,PL -3245175808,3245176063,GB -3245176064,3245176319,SK -3245176320,3245176575,UA -3245176576,3245176831,FR -3245177088,3245177343,ES -3245177344,3245177599,NL -3245177600,3245177855,PL -3245177856,3245178111,SI -3245178112,3245178623,BE -3245178624,3245178879,PL -3245178880,3245179391,UA -3245179392,3245179903,LU -3245179904,3245180415,DE -3245180416,3245180927,TR -3245181440,3245181951,DE -3245181952,3245182463,AT -3245182464,3245182975,FR -3245182976,3245183999,UA -3245184000,3245187071,AT -3245187072,3245189119,UA -3245190144,3245191167,ES -3245191168,3245193215,CZ -3245193216,3245195263,BE -3245195264,3245197311,GB -3245197312,3245199359,IT -3245199360,3245199615,LU -3245199616,3245199871,SE -3245199872,3245200127,NO -3245200128,3245200383,LV -3245200384,3245200639,PL -3245200896,3245201151,DE -3245201152,3245201407,KW -3245201408,3245201663,UA -3245201920,3245202175,SA -3245202432,3245202687,GB -3245202944,3245203455,DE -3245203712,3245203967,PL -3245204224,3245204479,SI -3245204480,3245204735,BE -3245204736,3245204991,ES -3245205248,3245205503,DE -3245205504,3245205759,AT -3245205760,3245206015,IT -3245206016,3245206271,BE -3245206272,3245206527,LT -3245206528,3245207295,DE -3245207296,3245207551,PL -3245207552,3245208063,UA -3245208064,3245208575,DE -3245208576,3245209087,PL -3245209088,3245209599,RU -3245209600,3245210111,UA -3245210112,3245210623,FR -3245210624,3245211135,HU -3245211136,3245211647,GB -3245212672,3245213183,GB -3245213184,3245213695,DE -3245213696,3245214207,LV -3245214208,3245214719,AT -3245214720,3245215231,SE -3245215232,3245215743,SI -3245215744,3245217791,UA -3245217792,3245218815,DE -3245218816,3245219839,AT -3245219840,3245221887,FI -3245221888,3245223935,DE -3245223936,3245225983,NL -3245225984,3245228031,HU -3245228032,3245229055,FI -3245229056,3245230079,DE -3245230080,3245232127,UA -3245232128,3245232383,PL -3245232384,3245232639,BE -3245232896,3245233151,IT -3245233152,3245233407,DK -3245233408,3245233663,CH -3245233664,3245233919,GR -3245233920,3245234175,DK -3245234176,3245234431,GB -3245234432,3245234687,UA -3245234688,3245234943,DE -3245234944,3245235199,RU -3245235200,3245235455,BE -3245235712,3245235967,AT -3245235968,3245236223,CH -3245236224,3245237247,PL -3245237248,3245237759,UA -3245237760,3245238271,DE -3245238272,3245238783,CD -3245238784,3245239295,UA -3245239296,3245240319,FI -3245240320,3245241343,UA -3245241344,3245242367,DE -3245242368,3245243391,PL -3245243392,3245244415,UA -3245244416,3245244671,ES -3245244672,3245244927,AT -3245244928,3245245183,BE -3245245440,3245245695,BG -3245245696,3245245951,DE -3245246720,3245246975,PL -3245246976,3245247231,GB -3245247232,3245247487,DE -3245247488,3245247743,FR -3245248000,3245248255,PL -3245248512,3245248767,UA -3245248768,3245249023,SI -3245249024,3245249535,NL -3245249792,3245250047,GB -3245250048,3245250303,DE -3245250304,3245250559,IT -3245250560,3245250815,FR -3245250816,3245251071,CH -3245251072,3245251327,ES -3245251328,3245251583,MT -3245251584,3245251839,UA -3245251840,3245252095,NL -3245252352,3245252607,BG -3245253120,3245253631,UA -3245253632,3245254143,LV -3245254144,3245254655,DK -3245254656,3245255167,UA -3245255168,3245255679,TR -3245255680,3245257215,UA -3245257216,3245257727,DE -3245257728,3245258239,GB -3245258240,3245258751,AT -3245258752,3245259263,UA -3245259264,3245259775,SK -3245259776,3245260287,UA -3245260288,3245260799,BE -3245260800,3245261823,DE -3245261824,3245262847,DK -3245263872,3245264895,DE -3245264896,3245266943,TR -3245266944,3245268991,BG -3245268992,3245270015,FI -3245270016,3245271039,PL -3245271040,3245272063,NL -3245272064,3245273087,RU -3245273088,3245275135,GB -3245275136,3245277183,BE -3245277184,3245277695,UA -3245277696,3245278207,RU -3245278720,3245279743,UA -3245279744,3245280255,TJ -3245280256,3245280767,BE -3245280768,3245281279,FR -3245281280,3245281791,RO -3245282304,3245282815,IT -3245282816,3245283327,PL -3245283328,3245283839,GB -3245283840,3245284351,PL -3245284352,3245284863,GB -3245285632,3245285887,GB -3245285888,3245286143,DE -3245286144,3245286399,GB -3245286400,3245287423,PL -3245287424,3245287679,DE -3245287680,3245287935,PL -3245287936,3245288191,PT -3245288192,3245288703,DE -3245288960,3245289215,IT -3245289216,3245289471,AT -3245289472,3245290495,UA -3245291520,3245292543,DE -3245292544,3245293567,UA -3245293568,3245294079,FI -3245294080,3245294591,ES -3245294592,3245295103,RO -3245295104,3245296127,IT -3245296128,3245296639,GB -3245297920,3245298175,NL -3245298176,3245298431,IE -3245298432,3245298687,UA -3245298688,3245298943,GB -3245298944,3245299199,UA -3245299456,3245299711,AT -3245299968,3245300223,BG -3245300736,3245300991,RU -3245300992,3245301247,FI -3245301248,3245301503,NL -3245301504,3245301759,BE -3245301760,3245302783,SK -3245302784,3245303807,DE -3245303808,3245304831,SE -3245304832,3245306367,DE -3245306368,3245306879,UA -3245307392,3245307903,FI -3245307904,3245308415,RO -3245308416,3245308927,ES -3245309440,3245309951,UA -3245309952,3245311999,CZ -3245312000,3245314047,DE -3245314048,3245315071,PL -3245317120,3245318143,UA -3245318400,3245318655,RO -3245318656,3245318911,DK -3245318912,3245319167,DE -3245319168,3245319423,HR -3245319424,3245319679,SE -3245319680,3245319935,PL -3245319936,3245320191,DE -3245320448,3245320703,DE -3245321216,3245321471,NL -3245321472,3245321727,UA -3245321984,3245322239,DE -3245322240,3245323263,RU -3245324288,3245325311,GB -3245325312,3245326335,UA -3245326336,3245326847,SI -3245326848,3245327359,BG -3245327872,3245328383,DE -3245328384,3245328895,GB -3245328896,3245329407,CH -3245329408,3245329919,UA -3245329920,3245333503,DE -3245333504,3245334527,SI -3245334528,3245334783,HU -3245334784,3245335039,BE -3245335296,3245335551,GB -3245335552,3245335807,NL -3245336064,3245336575,GB -3245336576,3245336831,RO -3245337600,3245337855,PL -3245337856,3245338367,DE -3245338368,3245339647,UA -3245339648,3245340671,LV -3245341696,3245342719,RU -3245342720,3245408255,CN -3245408256,3245867007,GB -3245867008,3245916159,IE -3245916160,3245917183,GB -3245917184,3245931263,IE -3245931264,3245931519,GB -3245931520,3245932543,IE -3245932544,3245998079,BE -3245998080,3246129151,US -3246129152,3246129407,RU -3246129408,3246129663,ES -3246129664,3246131711,RU -3246131712,3246132735,SY -3246132736,3246132991,DE -3246132992,3246134271,RU -3246134784,3246135551,RU -3246135552,3246135807,ES -3246135808,3246136831,SY -3246136832,3246137087,RU -3246137088,3246137599,ES -3246137600,3246138623,RU -3246138624,3246138879,ES -3246138880,3246139391,SY -3246139392,3246140159,RU -3246140160,3246140415,ES -3246140416,3246142207,RU -3246142208,3246142463,ES -3246142464,3246142975,SY -3246142976,3246144767,RU -3246144768,3246145023,ES -3246145024,3246145535,SY -3246145536,3246146559,RU -3246146560,3246147071,SY -3246147072,3246147583,ES -3246147584,3246148607,SY -3246148608,3246149631,DE -3246149632,3246149887,RU -3246149888,3246150143,ES -3246150144,3246150655,SY -3246150656,3246150911,DE -3246150912,3246151167,ES -3246151168,3246151679,SY -3246151680,3246153727,RU -3246153728,3246157823,SY -3246157824,3246159871,RU -3246159872,3246160127,ES -3246160128,3246160383,RU -3246160384,3246160895,SY -3246160896,3246161407,RU -3246161408,3246161919,SY -3246161920,3246162943,RU -3246162944,3246163199,ES -3246163200,3246163711,RU -3246163712,3246163967,ES -3246163968,3246168063,DE -3246168064,3246169599,SY -3246169600,3246170111,RU -3246170112,3246174207,SY -3246174208,3246178303,RU -3246178304,3246180351,SY -3246180352,3246182399,RU -3246182400,3246186495,SY -3246186496,3246187519,RU -3246187520,3246190591,SY -3246190592,3246191615,US -3246191616,3246192639,DE -3246192640,3246193663,PS -3246193664,3246194175,SY -3246194176,3246194431,RU -3246194432,3246260223,ES -3246260224,3246325759,PT -3246325760,3246328831,ES -3246329088,3246329855,ES -3246350848,3246351103,ES -3246351616,3246352639,ES -3246359552,3246362623,US -3246362624,3246371073,ES -3246371074,3246371074,PT -3246371075,3246374911,ES -3246378752,3246379007,ES -3246379008,3246381055,GB -3246383872,3246384127,ES -3246385152,3246387199,US -3246387200,3246388223,GB -3246389248,3246390783,ES -3246391296,3246613503,GB -3246613504,3246614527,HU -3246614528,3246784511,GB -3246784512,3246825983,CH -3246825984,3246826239,US -3246826240,3246915583,CH -3246915584,3246979783,PT -3246979784,3246979784,US -3246979785,3247046655,PT -3247046656,3247046911,AT -3247046912,3247047679,SI -3247048192,3247048703,NO -3247048704,3247048959,EE -3247048960,3247049215,SI -3247049216,3247053823,DE -3247054080,3247054335,CH -3247054336,3247054591,LT -3247054592,3247054847,DE -3247054848,3247063039,SI -3247063040,3247063295,FR -3247063296,3247063551,PL -3247063552,3247063807,DE -3247063808,3247064063,BG -3247064064,3247064319,DE -3247064320,3247064575,CH -3247064576,3247064831,RU -3247064832,3247065087,SE -3247065344,3247065599,CH -3247065600,3247065855,SE -3247066112,3247066367,DK -3247066368,3247066623,LV -3247066624,3247066879,CZ -3247066880,3247067135,RU -3247067136,3247067647,DE -3247067648,3247067903,RU -3247067904,3247068159,CH -3247068160,3247068415,UA -3247068672,3247068927,GB -3247068928,3247069183,UA -3247069184,3247069439,DE -3247069440,3247069695,RU -3247069696,3247069951,NL -3247069952,3247070207,DE -3247070208,3247070463,IL -3247070464,3247070719,UA -3247070720,3247070975,AT -3247070976,3247071231,GB -3247071232,3247071487,DE -3247071488,3247072255,RO -3247072256,3247072511,NL -3247072512,3247072767,BE -3247072768,3247073023,SE -3247073024,3247073279,RO -3247073280,3247073535,DE -3247073536,3247073791,AT -3247073792,3247074047,CZ -3247074048,3247074303,GB -3247074304,3247074559,DE -3247074560,3247074815,SE -3247074816,3247075071,PL -3247075328,3247076095,DE -3247076096,3247076351,DK -3247076352,3247076607,TR -3247076608,3247076863,DE -3247076864,3247077119,PL -3247077120,3247077375,DE -3247078144,3247078399,AT -3247078400,3247078655,DK -3247078656,3247078911,HU -3247078912,3247079167,FI -3247079168,3247079423,HU -3247079424,3247080447,RU -3247080448,3247081471,UA -3247081472,3247083519,PL -3247083520,3247084543,UA -3247084544,3247085567,RU -3247085568,3247086591,CZ -3247086592,3247087615,DE -3247087616,3247088639,IT -3247088640,3247089663,DE -3247091712,3247092735,RU -3247092736,3247093759,DE -3247093760,3247094783,UA -3247094784,3247095807,LV -3247095808,3247097855,RO -3247097856,3247098879,FI -3247098880,3247099903,NL -3247099904,3247100927,PL -3247100928,3247101951,CH -3247101952,3247102975,SE -3247102976,3247106047,NL -3247106048,3247107071,RU -3247107072,3247108095,UA -3247108096,3247109119,PL -3247109120,3247110143,UA -3247110144,3247111167,NL -3247112192,3247177727,FR -3247177728,3247243263,TR -3247243264,3247243775,DE -3247243776,3247244031,NL -3247244032,3247244287,DE -3247244288,3247248383,NL -3247248384,3247250431,DE -3247250432,3247253503,NL -3247253504,3247255039,DE -3247255040,3247256831,NL -3247256832,3247260671,DE -3247260672,3247266559,NL -3247266560,3247267071,DE -3247267072,3247267839,NL -3247267840,3247271679,DE -3247271680,3247274239,NL -3247274240,3247274495,DE -3247274496,3247275519,NL -3247275520,3247276031,DE -3247276032,3247278847,NL -3247278848,3247279615,DE -3247279616,3247279871,NL -3247279872,3247280127,DE -3247280128,3247288319,NL -3247288320,3247291647,DE -3247291648,3247292415,NL -3247292416,3247301375,DE -3247301376,3247302143,NL -3247302144,3247302655,DE -3247302656,3247308799,NL -3247308800,3247309055,BG -3247309056,3247309567,FI -3247309824,3247313407,FI -3247313664,3247313919,AM -3247314688,3247315967,FI -3247316480,3247316735,IR -3247316736,3247316991,RU -3247321600,3247322111,FI -3247322368,3247322623,CH -3247322880,3247323135,FI -3247323136,3247323647,RU -3247324416,3247324671,SE -3247324672,3247324927,CH -3247325184,3247333631,FI -3247333632,3247333887,DE -3247333888,3247334399,FI -3247334400,3247334655,NO -3247334656,3247335167,FI -3247335168,3247335423,DK -3247335424,3247336447,DE -3247336448,3247337215,NO -3247337216,3247337471,CH -3247337472,3247337983,PL -3247337984,3247338239,UA -3247338240,3247338495,PL -3247338496,3247338751,SI -3247339008,3247339519,GB -3247339520,3247340543,FI -3247340544,3247340799,UA -3247340800,3247341055,CH -3247341312,3247341567,DE -3247343616,3247345663,FI -3247345920,3247346175,HU -3247346944,3247347199,SI -3247347200,3247347455,FI -3247347456,3247347711,IL -3247347968,3247348223,HU -3247348992,3247349247,DE -3247349248,3247349503,FR -3247349504,3247349759,UA -3247349760,3247353855,SE -3247353856,3247357951,FI -3247361024,3247361279,FI -3247362048,3247362303,RO -3247362304,3247362559,HU -3247362560,3247362815,PL -3247362816,3247363071,DK -3247363072,3247363327,GB -3247363328,3247363583,UA -3247363584,3247363839,HU -3247363840,3247364095,NL -3247364096,3247364351,GB -3247364352,3247364607,ES -3247364608,3247365119,UA -3247365120,3247365375,GB -3247365376,3247365631,UA -3247365632,3247365887,SA -3247366144,3247370495,FI -3247371008,3247371263,PL -3247371264,3247371519,SE -3247371520,3247371775,CA -3247371776,3247372031,RU -3247372032,3247372287,FI -3247372288,3247372543,RO -3247372800,3247373055,RO -3247373056,3247373567,FI -3247374336,3247374591,RU -3247375360,3247375871,FI -3247376384,3247378431,FI -3247379200,3247379455,FI -3247382528,3247390719,FI -3247392256,3247393791,FI -3247394048,3247394303,PL -3247394560,3247397887,FI -3247397888,3247398143,RU -3247398144,3247404799,FI -3247404800,3247405055,RU -3247405056,3247405311,RO -3247405312,3247405567,PL -3247405568,3247405823,DE -3247406080,3247431679,FI -3247431936,3247432191,FI -3247432192,3247432447,TR -3247432704,3247437823,FI -3247438080,3247438335,IT -3247438848,3247439871,FI -3247439872,3247702015,ES -3247702016,3247702271,RO -3247702528,3247703295,ES -3247703552,3247704063,FR -3247705856,3247706111,RU -3247708160,3247711743,ES -3247711744,3247712255,IT -3247713280,3247713535,RU -3247713536,3247713791,BE -3247713792,3247714047,SK -3247726592,3247742975,ES -3247742976,3247751167,DE -3247751168,3247769599,ES -3247769600,3247771647,DE -3247775744,3247783935,DE -3247783936,3247788031,US -3247788032,3247790079,NL -3247790080,3247792127,IE -3247792128,3247800319,FR -3247800320,3247816703,DK -3247823104,3247823359,AT -3247828992,3247833087,BE -3247833088,3247833599,RU -3247833600,3247834111,PL -3247834112,3247834623,DE -3247834624,3247835135,UA -3247835136,3247836159,GB -3247836160,3247837183,CZ -3247837184,3247838207,ES -3247838208,3247838463,RU -3247838464,3247838719,PL -3247838720,3247839231,NO -3247839232,3247839743,CZ -3247839744,3247840255,GB -3247840256,3247841279,UA -3247841280,3247841791,RU -3247841792,3247842047,GB -3247842048,3247842303,CZ -3247842304,3247842815,PL -3247842816,3247843327,CZ -3247843328,3247843583,LT -3247843584,3247845375,PL -3247845376,3247845631,CH -3247845632,3247845887,UA -3247845888,3247846399,PL -3247846400,3247847423,RU -3247847424,3247848447,UA -3247848448,3247849471,IT -3247849472,3247849727,DE -3247849728,3247849983,RU -3247849984,3247850239,SE -3247850240,3247850495,BG -3247850496,3247850751,RU -3247850752,3247851007,PL -3247851008,3247851519,RU -3247851520,3247852543,SK -3247852544,3247853567,PL -3247853568,3247854591,RU -3247854592,3247855615,DK -3247855616,3247856127,UA -3247856128,3247856639,ES -3247856640,3247857663,RU -3247857664,3247858175,UA -3247858688,3247859711,RU -3247859712,3247859967,SE -3247859968,3247861759,RU -3247861760,3247862015,IT -3247862016,3247862271,UA -3247862272,3247863807,RU -3247864064,3247864319,NO -3247864320,3247864575,UA -3247864576,3247864831,PL -3247864832,3247865343,RU -3247865344,3247865599,MT -3247865600,3247865855,IL -3247865856,3247871999,CZ -3247872000,3247875327,NL -3247875328,3247875583,PL -3247875584,3247876095,DE -3247876352,3247876607,FR -3247877120,3247877631,GR -3247877632,3247879167,AT -3247879168,3247882239,GB -3247882240,3247898623,SE -3247898624,3247899647,RU -3247899648,3247900671,DE -3247900672,3247901695,PL -3247901696,3247902719,UA -3247902720,3247903743,GB -3247903744,3247904767,BG -3247904768,3247905791,RU -3247905792,3247906815,RO -3247906816,3247907839,DE -3247907840,3247908863,PL -3247908864,3247909887,BY -3247909888,3247910911,DE -3247910912,3247912959,PL -3247912960,3247913983,UA -3247913984,3247914495,DE -3247914496,3247915007,AT -3247915008,3247917055,PL -3247917056,3247918079,NL -3247918080,3247919103,PL -3247919104,3247920127,BG -3247920128,3247921151,FR -3247921152,3247922175,UA -3247922176,3247923199,SE -3247923200,3247925247,PL -3247925248,3247926271,UA -3247926272,3247927295,RU -3247927296,3247928319,PL -3247928320,3247929343,HU -3247929344,3247931391,GB -3247931392,3247939583,IR -3247947776,3247960063,RU -3247960064,3247962111,UA -3247962112,3247963135,DE -3247963136,3247964159,UA -3247964160,3248095231,ES -3248095232,3248160767,AT -3248160768,3248226303,DE -3248226304,3248357375,NO -3248357376,3248488447,DE -3248488448,3248488703,FR -3248488704,3248490495,NO -3248490752,3248491007,NO -3248491520,3248492031,RU -3248492544,3248496639,NO -3248496896,3248497151,US -3248497152,3248498431,NO -3248498432,3248498687,DE -3248498688,3248504831,NO -3248513280,3248513535,UA -3248513536,3248514047,AT -3248514816,3248515071,FR -3248515072,3248521215,NO -3248521984,3248522239,RU -3248522240,3248522751,NO -3248523264,3248524287,NO -3248526336,3248527359,NO -3248528384,3248528895,NO -3248528896,3248529151,RU -3248529408,3248540671,NO -3248540672,3248541183,RU -3248541184,3248541695,SE -3248545792,3248546815,UA -3248546816,3248547839,RU -3248549632,3248549887,SE -3248551936,3248553215,NO -3248553728,3248553983,RU -3248553984,3248554239,RO -3248557056,3248558079,UA -3248558080,3248560127,NO -3248560896,3248561151,IN -3248561664,3248562080,NO -3248562081,3248562081,DK -3248562082,3248575487,NO -3248575488,3248576511,CZ -3248576512,3248599039,NO -3248599040,3248603135,SE -3248603136,3248603391,BG -3248603392,3248603647,RU -3248603648,3248604159,NO -3248606976,3248619519,NO -3248619520,3248624383,DK -3248624384,3248624639,US -3248624640,3248638463,DK -3248638464,3248638719,GB -3248638720,3248716287,DK -3248716288,3248716799,GB -3248716800,3248750591,DK -3248750592,3248750847,PT -3248752640,3248752895,DE -3248752896,3248753151,TR -3248753408,3248753663,GB -3248753664,3248753919,FR -3248753920,3248754431,GB -3248754432,3248754687,AT -3248758784,3248774143,SE -3248774144,3248775167,UA -3248775168,3248783615,GB -3248783616,3248783871,PL -3248783872,3248784127,UA -3248784128,3248784895,DE -3248785408,3248785535,SI -3248785536,3248785663,RO -3248785664,3248786943,SI -3248786944,3248787199,PL -3248787200,3248787455,DE -3248787456,3248787711,NL -3248787712,3248787967,CH -3248787968,3248788223,RU -3248788224,3248788479,ES -3248788480,3248789503,FR -3248789760,3248790015,FR -3248790016,3248790271,DE -3248790272,3248790527,DK -3248790528,3248790783,FR -3248790784,3248791039,PL -3248791040,3248791295,BE -3248791296,3248791551,DE -3248791552,3248792063,GB -3248792320,3248792343,GB -3248792352,3248792407,GB -3248792416,3248792439,GB -3248792480,3248792527,GB -3248792536,3248792575,GB -3248796608,3248796863,GB -3248798976,3248799231,GB -3248799736,3248799743,GB -3248799744,3248800255,NL -3248800256,3248800767,RU -3248800768,3248801279,FR -3248801280,3248801791,RO -3248801792,3248802303,RU -3248802304,3248802815,FR -3248802816,3248803327,RU -3248803328,3248803839,GB -3248804864,3248805375,DE -3248805376,3248805887,RU -3248805888,3248806399,NL -3248806400,3248806911,CZ -3248806912,3248807423,IE -3248807936,3248808447,AT -3248808448,3248808959,GR -3248808960,3248810111,FR -3248810144,3248810175,CY -3248810176,3248810207,FR -3248810240,3248810495,CH -3248810496,3248812543,AT -3248812544,3248813055,GB -3248813056,3248813567,CH -3248813568,3248814079,DE -3248815104,3248815615,GB -3248815616,3248816127,PL -3248816128,3248881663,CZ -3248881664,3249012735,FI -3249012736,3249012991,DE -3249012992,3249013503,LU -3249014272,3249014783,DE -3249014784,3249025023,LU -3249025536,3249025791,FR -3249026560,3249026815,PL -3249027072,3249045503,LU -3249078272,3249078783,RU -3249078784,3249079295,CH -3249079296,3249079807,RU -3249079808,3249080831,RO -3249080832,3249081343,DE -3249081344,3249081855,LV -3249081856,3249082367,GB -3249082368,3249082879,HU -3249082880,3249083391,PL -3249083392,3249083903,RO -3249083904,3249084927,RU -3249085440,3249085951,RU -3249085952,3249086463,GI -3249086464,3249088511,RU -3249088512,3249089023,NL -3249089024,3249089535,NO -3249089536,3249090047,RU -3249090048,3249090559,FR -3249090560,3249091071,SI -3249091072,3249091327,TR -3249091328,3249091583,NL -3249091584,3249092095,RU -3249092096,3249092607,DE -3249092608,3249093119,IT -3249093120,3249093631,GB -3249093632,3249094655,RU -3249094656,3249095679,FR -3249095680,3249096191,NL -3249096192,3249096703,IL -3249096704,3249097215,DE -3249097216,3249097727,DK -3249097728,3249098239,DE -3249098240,3249098751,PL -3249098752,3249099263,UA -3249099264,3249099775,CH -3249099776,3249100287,FI -3249100288,3249100799,UA -3249100800,3249101311,IL -3249101312,3249101823,GB -3249101824,3249102335,RU -3249102336,3249102847,DE -3249102848,3249103359,RU -3249103360,3249103871,DE -3249103872,3249104383,FI -3249104384,3249104895,RU -3249104896,3249105407,IL -3249105920,3249106431,NL -3249106432,3249106943,RU -3249106944,3249108479,PL -3249108480,3249108991,RU -3249108992,3249109503,GB -3249109504,3249110015,RU -3249110016,3249111039,UA -3249111040,3249111551,RU -3249111552,3249112063,KW -3249112064,3249113087,UA -3249113088,3249113599,RO -3249113600,3249114111,NL -3249114112,3249114623,GB -3249114624,3249115647,RO -3249115648,3249116159,UA -3249116160,3249116671,PL -3249116672,3249117183,IT -3249117184,3249117695,CH -3249117696,3249118207,DK -3249118208,3249118719,RO -3249118720,3249119231,LU -3249119232,3249119743,RU -3249119744,3249120255,IT -3249120256,3249120767,SE -3249120768,3249121279,LV -3249121280,3249121791,DE -3249122304,3249124351,RU -3249124352,3249124863,DE -3249124864,3249125375,CZ -3249125376,3249125887,DE -3249125888,3249126399,CH -3249126400,3249126911,UA -3249126912,3249127423,SA -3249127424,3249127935,GB -3249127936,3249128447,LV -3249128448,3249128959,DE -3249128960,3249129471,BG -3249129984,3249130495,RU -3249130496,3249131007,DE -3249131008,3249131519,GB -3249131520,3249132031,DK -3249132032,3249132543,RU -3249132544,3249133055,DE -3249133056,3249133567,UA -3249133568,3249134079,GB -3249134592,3249135615,RU -3249135616,3249136127,GB -3249136128,3249137151,RU -3249137152,3249137663,FR -3249137664,3249138175,PL -3249138176,3249138687,RU -3249138688,3249139199,GB -3249139712,3249140223,UA -3249140224,3249140735,IT -3249140736,3249141247,NL -3249141248,3249141759,IL -3249141760,3249142271,RU -3249142784,3249143295,UA -3249143808,3249274879,AT -3249274880,3249405951,NL -3249405952,3249521279,DE -3249521280,3249521343,UA -3249521344,3249537023,DE -3249537024,3249537279,PT -3249537792,3249538047,GB -3249538048,3249541119,NL -3249545216,3249551359,NL -3249551360,3249552639,GB -3249552640,3249552895,NL -3249553152,3249553407,NL -3249561600,3249565695,NL -3249569792,3249574143,NL -3249574144,3249574399,RU -3249574400,3249574655,SE -3249574912,3249590527,NL -3249590528,3249590783,FR -3249592320,3249598463,NL -3249600256,3249600511,AT -3249600512,3249601535,UA -3249601536,3249668095,NL -3249668096,3249676287,IE -3249676288,3249676543,GB -3249676800,3249677055,UA -3249677056,3249677311,SE -3249678336,3249678847,IE -3249681664,3249681919,IE -3249683456,3249684479,SE -3249684480,3249696767,IE -3249697280,3249697535,IE -3249697792,3249698047,IE -3249698048,3249698303,PL -3249698304,3249698559,RU -3249698560,3249698815,HU -3249701120,3249701631,SE -3249701632,3249701887,RU -3249701888,3249702143,PL -3249702144,3249702399,FI -3249702400,3249702655,FR -3249702656,3249702911,RU -3249702912,3249704191,FR -3249704192,3249704447,RO -3249704704,3249704959,PL -3249704960,3249705983,UA -3249705984,3249706495,AT -3249706496,3249707007,LV -3249707008,3249707519,BG -3249707520,3249708031,FR -3249708032,3249708543,CH -3249708544,3249709055,RU -3249709056,3249709311,AT -3249709312,3249709567,PL -3249709568,3249709823,UA -3249709824,3249710079,DE -3249710080,3249710335,PL -3249710336,3249710591,RO -3249710592,3249710847,BG -3249710848,3249711103,PL -3249711104,3249711359,HU -3249711872,3249712127,AT -3249712384,3249712639,GB -3249712896,3249713151,DK -3249713152,3249715199,LV -3249715200,3249715455,AT -3249715456,3249715711,DE -3249715712,3249715967,NL -3249715968,3249716223,UA -3249716224,3249716479,SI -3249716480,3249716735,NL -3249716736,3249717247,UA -3249717248,3249718271,LV -3249719296,3249720319,IR -3249720320,3249721343,IT -3249721344,3249721599,AT -3249721600,3249721855,BE -3249721856,3249722367,FR -3249722624,3249723135,PL -3249723136,3249723391,EE -3249723392,3249723647,IT -3249723648,3249723903,GB -3249724160,3249724415,LU -3249724672,3249724927,RU -3249724928,3249725183,BG -3249725184,3249725439,GB -3249725440,3249725951,RO -3249725952,3249726463,DE -3249726464,3249726975,UA -3249727488,3249727999,LV -3249728000,3249728511,IT -3249728512,3249729023,UA -3249729024,3249729535,GB -3249729536,3249730559,PL -3249730560,3249731583,IT -3249731584,3249732607,UA -3249732608,3249733631,IT -3249733632,3249799167,CZ -3249799168,3249802239,SE -3249802240,3249802751,DE -3249802752,3249828607,SE -3249828608,3249828863,AT -3249828864,3249829375,DE -3249829376,3249829631,AT -3249829632,3249829887,SE -3249829888,3249830143,GB -3249830144,3249830399,SE -3249830400,3249830655,IT -3249830656,3249830911,DK -3249830912,3249843711,SE -3249843712,3249843967,GB -3249843968,3249844479,SE -3249844480,3249844735,AT -3249844736,3249844991,AU -3249844992,3249845759,SE -3249845760,3249846271,DE -3249846272,3249850623,SE -3249850624,3249850879,GB -3249850880,3249855487,SE -3249855488,3249856511,NL -3249856512,3249859583,SE -3249859584,3249860095,DE -3249860096,3249861375,SE -3249861376,3249861631,BE -3249861632,3249862143,DE -3249862144,3249862399,BE -3249862400,3249862655,SE -3249862656,3249863167,DE -3249863168,3249863423,BE -3249863424,3249863679,SE -3249863680,3249863935,ES -3249863936,3249864447,SE -3249864448,3249864703,NL -3249864704,3249865471,SE -3249865472,3249865727,GB -3249865728,3249868031,SE -3249868032,3249868287,DK -3249868288,3249868543,SE -3249868544,3249868799,DE -3249868800,3249869823,NL -3249869824,3249871103,SE -3249871104,3249871359,NO -3249871360,3249871615,US -3249871616,3249871871,NO -3249871872,3249872383,SE -3249872384,3249872639,GB -3249872640,3249910271,SE -3249910272,3249910783,NL -3249910784,3249911807,SE -3249911808,3249912319,GB -3249912320,3249924607,SE -3249924608,3249924863,NO -3249924864,3249926143,SE -3249926144,3249926399,AU -3249926400,3249926655,SE -3249926656,3249926911,BE -3249926912,3249929471,SE -3249929472,3249929983,CA -3249929984,3249930239,NO -3249930240,3249931263,SE -3249931264,3249931775,NL -3249931776,3249932287,SE -3249932288,3249934335,US -3249934336,3249934847,IT -3249934848,3249935871,SE -3249935872,3249936383,DE -3249936384,3249960447,SE -3249960448,3249960959,DE -3249960960,3249961215,CA -3249961216,3249961471,SE -3249961472,3249961727,NL -3249961728,3249967103,SE -3249967104,3249967615,IL -3249967616,3249967871,GB -3249967872,3249968127,SE -3249968128,3249969151,FR -3249969152,3249969663,SE -3249969664,3249970175,DE -3249970176,3249970431,SE -3249970432,3249970687,NO -3249970688,3249970943,DK -3249970944,3249971199,FI -3249971200,3249971455,IT -3249971456,3249971711,SE -3249971712,3249972735,DE -3249972736,3249973759,SE -3249973760,3249974015,NL -3249974016,3249974527,SE -3249974528,3249974783,ES -3249974784,3249976063,SE -3249976064,3249976319,FR -3249976320,3249976831,SE -3249976832,3249977087,GB -3249977088,3249991679,SE -3249991680,3249991935,US -3249991936,3249993215,SE -3249993216,3249993471,NL -3249993472,3249993727,SE -3249993728,3249994239,DE -3249994240,3249994495,CH -3249994496,3249995263,SE -3249995264,3249995519,GB -3249995520,3249997055,SE -3249997056,3249997311,US -3249997312,3250000127,SE -3250000128,3250000383,GB -3250000384,3250007295,SE -3250007296,3250007551,GB -3250007552,3250010367,SE -3250010368,3250010879,CH -3250010880,3250012159,SE -3250012160,3250013183,DE -3250013184,3250013976,SE -3250013977,3250013977,NO -3250013978,3250013978,DK -3250013979,3250014207,SE -3250014208,3250014719,DE -3250014720,3250014975,SE -3250014976,3250015231,NO -3250015232,3250015743,FI -3250015744,3250016767,SE -3250016768,3250017023,NL -3250017024,3250017791,SE -3250017792,3250018303,DE -3250018304,3250019071,SE -3250019072,3250019327,GB -3250019328,3250019839,SE -3250019840,3250020095,GB -3250020096,3250020863,SE -3250020864,3250021375,IT -3250021376,3250022399,FR -3250022400,3250023423,SE -3250023424,3250024447,DE -3250024448,3250026495,SE -3250026496,3250027519,FR -3250027520,3250030335,SE -3250030336,3250030591,DK -3250030592,3250031103,DE -3250031104,3250031359,DK -3250031360,3250031615,US -3250031616,3250035455,SE -3250035456,3250035711,US -3250035712,3250038271,SE -3250038272,3250039295,ES -3250039296,3250039807,SE -3250039808,3250040319,GB -3250040320,3250042623,SE -3250042624,3250043135,FR -3250043136,3250051071,SE -3250051072,3250051327,BR -3250051328,3250051583,ES -3250051584,3250061311,SE -3250061312,3250192383,FI -3250192384,3250192639,AT -3250192896,3250193151,IL -3250193152,3250193407,DE -3250193408,3250193663,IE -3250193664,3250194175,AT -3250194176,3250194431,DE -3250194432,3250194687,FR -3250194688,3250194943,UA -3250194944,3250195199,RO -3250195456,3250195711,DE -3250195712,3250195967,GB -3250196224,3250196479,UA -3250196480,3250200575,AT -3250200576,3250200831,HU -3250200832,3250201087,RO -3250201088,3250201343,RU -3250201344,3250201599,DK -3250201600,3250202111,NL -3250202112,3250202367,BG -3250202368,3250202623,PL -3250202624,3250233343,AT -3250233600,3250233855,AT -3250233856,3250234111,GB -3250234112,3250234367,GR -3250234368,3250241535,AT -3250245632,3250245887,TR -3250245888,3250246143,AT -3250246144,3250246399,GB -3250246656,3250257151,AT -3250257408,3250257663,AT -3250257664,3250257919,PL -3250258432,3250271231,AT -3250271232,3250271743,PL -3250271744,3250271999,LB -3250272000,3250272255,GB -3250272256,3250274303,SK -3250274304,3250276351,PL -3250276352,3250276607,GB -3250276608,3250276863,RU -3250276864,3250277375,IT -3250277376,3250277631,UA -3250277632,3250277887,DE -3250277888,3250278399,UA -3250278400,3250279423,RU -3250307072,3250323199,AT -3250323200,3250323455,RU -3250323456,3250323711,PL -3250324480,3250324991,GB -3250324992,3250325247,AE -3250325248,3250325503,MA -3250326528,3250327039,BH -3250331648,3250335743,MT -3250335744,3250339839,KW -3250339840,3250348031,JO -3250348032,3250356223,BH -3250356224,3250357247,LB -3250357248,3250357823,GB -3250357824,3250357855,FR -3250357856,3250357871,EE -3250357872,3250357879,CH -3250357880,3250357887,SE -3250357888,3250357895,DK -3250357904,3250357919,FR -3250357920,3250357927,PL -3250357928,3250357959,CY -3250358016,3250358527,LB -3250358528,3250358783,HU -3250359296,3250359807,HU -3250359808,3250362879,KW -3250362880,3250363391,DE -3250363392,3250363903,SE -3250363904,3250364415,DE -3250364416,3250372607,KW -3250372608,3250373631,HU -3250373632,3250374143,DE -3250374144,3250374655,PL -3250374656,3250375679,SE -3250375680,3250376703,GB -3250376704,3250380799,AT -3250380800,3250386943,CH -3250386944,3250387199,SE -3250387200,3250387455,FR -3250387456,3250387711,DE -3250388224,3250388479,PL -3250388480,3250388735,UA -3250388736,3250388991,FR -3250388992,3250405887,NG -3250405888,3250406399,IE -3250406400,3250406911,RU -3250406912,3250407423,RO -3250407424,3250407935,PL -3250407936,3250408447,GB -3250408448,3250408959,PL -3250408960,3250409471,DE -3250409472,3250409983,GB -3250409984,3250410495,DE -3250411008,3250411519,LT -3250411520,3250412031,RU -3250412544,3250413055,DK -3250413056,3250413567,DE -3250413568,3250414079,UA -3250414080,3250414591,RO -3250414592,3250415103,SE -3250415104,3250415359,GB -3250415360,3250415615,PL -3250415616,3250416127,FR -3250416128,3250417663,DE -3250417664,3250418175,IT -3250418176,3250418687,DE -3250418688,3250419199,PL -3250419712,3250420223,RU -3250420224,3250420735,IR -3250420736,3250421247,FR -3250421248,3250421759,UA -3250421760,3250422015,NG -3250422016,3250423295,GB -3250423296,3250423551,NL -3250423552,3250423807,BE -3250423808,3250424063,AT -3250424064,3250424319,SI -3250424320,3250424575,RU -3250424576,3250424831,NL -3250424832,3250425343,GB -3250425344,3250425599,TR -3250425600,3250425855,FR -3250425856,3250426111,LT -3250426368,3250426623,AT -3250426624,3250426879,FR -3250426880,3250427135,JO -3250427136,3250427391,NL -3250427392,3250429951,DE -3250429952,3250438143,SI -3250438144,3250446335,CH -3250446336,3250454527,DE -3250454528,3250585599,BE -3250585600,3250585855,NL -3250586624,3250588671,PT -3250588800,3250588927,CY -3250588928,3250589183,GB -3250589184,3250589439,DE -3250589696,3250593791,CH -3250593792,3250594815,GB -3250594816,3250595327,UA -3250595328,3250595839,GR -3250595840,3250596351,DE -3250596352,3250597887,RO -3250597888,3250598399,BG -3250598400,3250598911,GB -3250598912,3250599423,RO -3250599424,3250599935,SE -3250599936,3250600447,BG -3250600448,3250601471,DE -3250601472,3250601983,PL -3250601984,3250610175,GB -3250610176,3250618367,TR -3250618368,3250626559,RU -3250626560,3250634751,PL -3250634752,3250642943,GB -3250642944,3250651135,CH -3250651136,3250659327,IT -3250659328,3250660607,GB -3250661376,3250662399,GB -3250667520,3250675711,PL -3250675712,3250683903,GB -3250683904,3250692095,CH -3250692352,3250692607,NL -3250693376,3250693631,NL -3250693632,3250694143,DE -3250694144,3250694399,PL -3250694400,3250694655,GB -3250694656,3250694911,SK -3250695168,3250695679,IT -3250695680,3250697471,DE -3250697472,3250697727,PL -3250697984,3250698239,IT -3250698240,3250698751,GR -3250698752,3250699263,RU -3250699264,3250699775,GB -3250699776,3250700287,DE -3250700288,3250708479,UA -3250708480,3250716671,KZ -3250716672,3250716927,RO -3250716928,3250718207,MA -3250718208,3250720767,DE -3250720768,3250722047,IT -3250722048,3250722303,RO -3250722304,3250724863,GB -3250724864,3250733055,MA -3250733056,3250741247,DZ -3250741248,3250742783,RU -3250742784,3250743551,AT -3250743552,3250743807,RU -3250743808,3250746367,UA -3250746368,3250747391,NL -3250747392,3250747903,SI -3250747904,3250748159,SA -3250748160,3250748415,PL -3250748416,3250749439,UA -3250749440,3250749695,GH -3250749696,3250749951,IT -3250750464,3250751487,FR -3250751488,3250751743,DE -3250752000,3250752511,CH -3250752512,3250753023,BG -3250753536,3250754047,DE -3250754048,3250754303,AT -3250754560,3250755071,DE -3250755584,3250755839,FR -3250755840,3250756351,RU -3250756608,3250756863,BG -3250756864,3250757119,DE -3250757120,3250757375,BE -3250757376,3250757631,HU -3250757632,3250765823,GH -3250765824,3250782207,SE -3250782208,3250847743,GB -3250847744,3250978815,DE -3250978816,3251044351,HR -3251044352,3251109887,FI -3251110656,3251110911,IT -3251110912,3251111167,FR -3251111168,3251111423,CH -3251111424,3251111679,AT -3251111680,3251111935,ES -3251112192,3251112447,SK -3251112448,3251112703,RU -3251112704,3251112959,SE -3251113472,3251113983,BG -3251114496,3251114751,RU -3251114752,3251115007,RO -3251115008,3251115263,PL -3251115264,3251115775,RU -3251115776,3251116031,BE -3251116288,3251116543,GB -3251117056,3251117311,BG -3251117312,3251117567,FR -3251117568,3251117823,IL -3251117824,3251118079,SE -3251118080,3251118591,UA -3251118592,3251119103,RU -3251119104,3251120127,UA -3251120128,3251120639,KW -3251120640,3251121151,FR -3251121152,3251121663,DK -3251121664,3251122175,PL -3251122688,3251123199,PL -3251123712,3251124223,RU -3251124736,3251125247,FR -3251125248,3251125759,BE -3251126272,3251126783,NL -3251126784,3251127295,PL -3251127296,3251127807,UA -3251127808,3251128319,NL -3251129344,3251129855,UA -3251129856,3251130367,CH -3251130368,3251130879,GB -3251130880,3251131391,PL -3251131392,3251131903,UA -3251131904,3251132415,SE -3251132416,3251132927,RU -3251132928,3251133439,DK -3251133440,3251133951,NO -3251133952,3251134463,RU -3251134464,3251136511,GB -3251136512,3251137023,DK -3251137024,3251137535,DE -3251137536,3251138047,PL -3251138048,3251138559,FR -3251138560,3251139071,AT -3251139072,3251139583,GB -3251139584,3251140095,FR -3251140096,3251141631,PL -3251141632,3251142143,LT -3251142144,3251142655,RO -3251142656,3251142911,DE -3251142912,3251143167,RU -3251143424,3251143679,LV -3251143680,3251143935,NL -3251143936,3251144191,GB -3251144448,3251144703,BE -3251144704,3251144959,HU -3251144960,3251145471,DE -3251145472,3251145727,FR -3251145728,3251145983,NL -3251145984,3251146239,RO -3251146240,3251146495,AT -3251146496,3251146751,SK -3251146752,3251147007,CH -3251147008,3251147263,GB -3251147264,3251147519,PL -3251147520,3251147775,NL -3251147776,3251148031,SE -3251148544,3251148799,UA -3251149056,3251149311,NL -3251149312,3251149567,DE -3251149568,3251149823,IE -3251149824,3251150079,DE -3251150080,3251150335,CH -3251150336,3251150591,GB -3251150848,3251151103,DE -3251151104,3251151359,UA -3251151360,3251151615,DE -3251151872,3251152127,NL -3251152128,3251152383,RO -3251152384,3251152639,GB -3251152896,3251153151,RU -3251153408,3251153663,TR -3251153664,3251153919,FR -3251153920,3251154175,DE -3251154176,3251154431,UA -3251154432,3251154687,NL -3251154688,3251154943,UA -3251154944,3251155455,GB -3251155456,3251155711,NL -3251155712,3251155967,UA -3251155968,3251156223,TR -3251156480,3251156735,FR -3251156736,3251156991,UA -3251156992,3251157247,FR -3251157248,3251157503,BE -3251157760,3251158015,PL -3251158016,3251158271,TR -3251158272,3251158527,RU -3251158528,3251158783,UA -3251158784,3251159295,GB -3251159296,3251159551,DE -3251159808,3251160063,DE -3251160320,3251160575,PL -3251160576,3251160831,NL -3251160832,3251161087,RU -3251161088,3251161343,RO -3251161344,3251161599,LV -3251161600,3251161855,SE -3251161856,3251162111,HR -3251162112,3251162367,DK -3251162368,3251162623,UA -3251162624,3251162879,DE -3251162880,3251163135,SI -3251163136,3251163391,SE -3251163392,3251163647,UA -3251163648,3251163903,DE -3251163904,3251164159,RU -3251164160,3251164415,UA -3251164416,3251164671,IT -3251164672,3251164927,GB -3251164928,3251165439,PL -3251165696,3251165951,DE -3251165952,3251166207,UA -3251166208,3251166463,CH -3251166720,3251166975,FR -3251166976,3251167231,CH -3251167232,3251167487,LV -3251167488,3251167743,DK -3251167744,3251168255,PL -3251168256,3251168511,AT -3251168512,3251168767,UA -3251168768,3251169023,DE -3251169024,3251169279,FR -3251169280,3251170047,PL -3251170048,3251170303,NO -3251170304,3251170559,CH -3251170560,3251170815,BG -3251171072,3251171327,RU -3251171328,3251171839,DE -3251171840,3251172095,RO -3251172096,3251172351,ES -3251172608,3251172863,GB -3251173120,3251173375,SA -3251173376,3251173631,UA -3251173632,3251173887,DE -3251173888,3251174143,DK -3251174656,3251174911,DE -3251174912,3251175167,RO -3251175168,3251175423,UA -3251175424,3251175679,FR -3251175680,3251175935,US -3251175936,3251176191,CA -3251176192,3251176959,FR -3251176960,3251177471,US -3251177472,3251179519,DE -3251179520,3251180031,SE -3251180032,3251180543,PL -3251180544,3251181055,RO -3251181056,3251181567,GR -3251181568,3251182079,DE -3251182080,3251182591,FR -3251182592,3251183103,IT -3251183104,3251183615,RU -3251183616,3251183871,LT -3251183872,3251184127,CH -3251184128,3251184383,PL -3251184640,3251184895,PL -3251185408,3251185663,DK -3251185664,3251185919,IT -3251185920,3251186175,AT -3251186176,3251186431,GB -3251186688,3251186943,RO -3251186944,3251187199,SI -3251187456,3251187711,GB -3251187712,3251188735,NL -3251188736,3251189759,DE -3251190784,3251191807,UA -3251191808,3251192319,GB -3251192320,3251192831,LV -3251192832,3251193343,BE -3251193344,3251193855,GB -3251194368,3251194879,NO -3251194880,3251195391,FR -3251195392,3251195903,CZ -3251195904,3251196927,UA -3251196928,3251197951,CH -3251197952,3251198975,RU -3251198976,3251199999,DE -3251200000,3251200511,SE -3251200512,3251200767,UA -3251201024,3251201279,UA -3251201280,3251201535,SI -3251201536,3251201791,AT -3251201792,3251202047,FR -3251202048,3251202303,NL -3251202304,3251202559,UA -3251202560,3251202815,AT -3251202816,3251203327,ES -3251203328,3251203583,SI -3251203584,3251203839,CZ -3251203840,3251204095,RU -3251205120,3251205631,UA -3251205632,3251206143,RU -3251206144,3251206655,GB -3251206656,3251207167,CH -3251207168,3251207679,GB -3251208192,3251209215,CY -3251209216,3251210239,GB -3251210240,3251211263,PL -3251211264,3251212287,PT -3251212288,3251212415,PL -3251212416,3251212671,FI -3251212800,3251212927,FR -3251212928,3251213055,RO -3251213056,3251213119,SE -3251213120,3251213151,NL -3251213152,3251213183,FR -3251213184,3251213215,UA -3251213216,3251213247,CY -3251213280,3251213311,GB -3251213312,3251213375,CY -3251213376,3251213439,DE -3251213504,3251213567,NL -3251213632,3251213695,PL -3251213760,3251213823,CY -3251213824,3251213887,FR -3251213888,3251214015,CY -3251214080,3251214143,CY -3251214272,3251214335,DE -3251214336,3251214463,RU -3251214464,3251214591,UA -3251214592,3251214975,GB -3251214976,3251215103,RO -3251215232,3251215359,IL -3251215360,3251215487,UA -3251215488,3251215615,SE -3251215616,3251215743,CY -3251215872,3251216127,RO -3251216256,3251216383,RU -3251216384,3251216639,GB -3251216640,3251216895,RO -3251216896,3251217151,NL -3251217152,3251217407,GB -3251217408,3251217663,PL -3251217664,3251217919,SI -3251217920,3251218175,GR -3251218176,3251218431,PL -3251218432,3251219199,DE -3251219200,3251219455,IT -3251219456,3251219711,BG -3251219712,3251220223,AT -3251220224,3251220479,UA -3251220480,3251222527,DE -3251222528,3251224575,GB -3251225600,3251226111,GB -3251226112,3251226623,UA -3251226624,3251227135,GB -3251227648,3251228159,GB -3251228160,3251228671,UA -3251229696,3251230719,SI -3251230720,3251231743,UA -3251231744,3251232767,NO -3251232768,3251233791,UA -3251233792,3251234815,RU -3251234816,3251235839,RO -3251235840,3251236863,DE -3251236864,3251237887,BG -3251240960,3251241215,BE -3251241216,3251243007,GB -3251245056,3251245311,DE -3251245312,3251245567,BE -3251245568,3251245823,TR -3251245824,3251246079,DK -3251246080,3251246335,DE -3251246336,3251246591,UA -3251246592,3251246847,RO -3251246848,3251247103,NL -3251247104,3251249151,DE -3251249152,3251251199,NL -3251252736,3251256831,CH -3251256832,3251257343,GB -3251257344,3251259903,BE -3251260416,3251261439,FR -3251263488,3251265535,FR -3251265536,3251267839,NL -3251267840,3251268351,GB -3251268352,3251268607,DE -3251268608,3251268863,BG -3251268864,3251269119,NL -3251269120,3251269375,DK -3251269376,3251269631,FR -3251269888,3251270143,GB -3251270400,3251270655,NO -3251270656,3251270911,DE -3251270912,3251271167,PL -3251271168,3251271423,UA -3251271424,3251271679,DE -3251271680,3251271935,TR -3251271936,3251272191,FR -3251272192,3251272447,NL -3251272448,3251272703,AT -3251272704,3251272959,DE -3251272960,3251273471,FR -3251273472,3251273727,DE -3251273728,3251281919,SG -3251281920,3251286015,DE -3251286016,3251288063,US -3251288064,3251290111,SG -3251290112,3251302399,GB -3251302400,3251306495,LI -3251306496,3251307007,AT -3251307776,3251308031,GB -3251311104,3251311615,RS -3251311616,3251312127,GB -3251312384,3251312639,RS -3251313152,3251313663,RS -3251314688,3251315711,FR -3251315712,3251317759,RU -3251317760,3251318783,PL -3251318784,3251319807,UA -3251320832,3251321855,PL -3251321856,3251322879,RU -3251322880,3251331071,GB -3251331072,3251331583,FR -3251331584,3251332095,PL -3251332096,3251333119,RU -3251333120,3251333631,CH -3251333632,3251334143,PT -3251334144,3251334655,FR -3251335168,3251335679,RU -3251335680,3251336191,RO -3251336192,3251336703,GB -3251336704,3251337215,ES -3251337216,3251337727,CH -3251337728,3251338239,DE -3251338240,3251339263,RU -3251339264,3251347455,IE -3251347456,3251355647,DE -3251355648,3251356159,GB -3251356160,3251356671,AT -3251356672,3251357183,EE -3251357184,3251357695,BG -3251357696,3251358207,ES -3251358208,3251358719,RU -3251358720,3251359231,RO -3251359232,3251360255,PL -3251360256,3251360767,GB -3251360768,3251361279,FR -3251361792,3251362303,AT -3251362304,3251362815,UA -3251362816,3251363327,NL -3251363328,3251363839,PL -3251364096,3251364607,NL -3251364608,3251364863,RO -3251364864,3251366911,IT -3251366912,3251367423,UA -3251367424,3251367935,NZ -3251367936,3251372031,GB -3251372032,3251634175,IT -3251634176,3251896319,FI -3251896320,3252158463,NO -3252158464,3252174847,LT -3252174848,3252175871,NL -3252175872,3252177919,SE -3252177920,3252178943,HR -3252178944,3252191231,SE -3252191232,3252196351,HR -3252196352,3252197119,LT -3252197120,3252197375,SE -3252197376,3252207615,HR -3252207616,3252220927,LT -3252220928,3252221183,SE -3252221184,3252222463,LT -3252222464,3252223487,SE -3252223488,3252232191,LT -3252232192,3252232319,SE -3252232320,3252232576,NL -3252232577,3252240383,SE -3252240384,3252286463,HR -3252286464,3252289535,LT -3252289536,3252289791,BG -3252289792,3252291583,GR -3252291584,3252292607,DE -3252292608,3252293631,FR -3252293632,3252297727,DE -3252297728,3252308223,GR -3252308224,3252308479,DE -3252308480,3252313599,GR -3252313600,3252313855,SI -3252313856,3252314111,DE -3252314112,3252314623,GR -3252314624,3252314879,HU -3252314880,3252315135,GB -3252315136,3252316415,CH -3252316672,3252318463,GR -3252318464,3252318719,TR -3252318720,3252318975,GP -3252318976,3252319231,PL -3252319232,3252319743,AT -3252320256,3252320511,CZ -3252320768,3252321023,GR -3252321280,3252321791,GR -3252321792,3252322303,PL -3252322304,3252323327,NO -3252323328,3252324351,PL -3252324352,3252326399,RU -3252326400,3252327423,DE -3252327424,3252329471,PL -3252329472,3252330495,UA -3252330496,3252334591,GB -3252334592,3252335615,PL -3252335616,3252336639,RU -3252336640,3252337663,UA -3252337664,3252338687,RU -3252338688,3252340735,BE -3252341248,3252341503,DE -3252342016,3252342079,GB -3252342080,3252342239,CY -3252342240,3252342271,CH -3252342272,3252342527,SE -3252342528,3252342543,NO -3252342544,3252342591,DE -3252342592,3252342607,IE -3252342608,3252342655,CY -3252342656,3252342783,IL -3252342784,3252346367,DE -3252346624,3252355071,GR -3252355072,3252356351,LT -3252357120,3252358911,LT -3252358912,3252359167,DE -3252359168,3252362239,DK -3252362240,3252362495,PL -3252362496,3252362751,IT -3252362752,3252363263,DK -3252363264,3252379647,LT -3252379648,3252379903,ES -3252379904,3252380159,GB -3252380160,3252380415,BE -3252380672,3252380927,SI -3252381184,3252381439,IT -3252381440,3252381695,ES -3252381696,3252381951,RU -3252381952,3252382207,DE -3252382208,3252382463,SI -3252382464,3252382719,PL -3252382720,3252382975,GB -3252382976,3252383231,IT -3252383232,3252383743,GB -3252383744,3252383999,SE -3252384000,3252384511,PL -3252384512,3252384767,GB -3252384768,3252385023,NL -3252385024,3252385279,RO -3252385280,3252385535,GB -3252385536,3252385791,RO -3252385792,3252386047,GB -3252386304,3252386559,GB -3252386560,3252386815,BE -3252386816,3252387071,UA -3252387072,3252387327,RU -3252387328,3252387583,PL -3252387584,3252387839,RU -3252387840,3252404223,LT -3252404224,3252405759,NO -3252405760,3252406271,FR -3252406272,3252407295,NO -3252407296,3252415231,FR -3252415232,3252415999,LU -3252416000,3252420607,FR -3252420608,3252424703,NO -3252424704,3252426751,FR -3252426752,3252427775,US -3252427776,3252428321,FR -3252428322,3252428322,AO -3252428323,3252428799,FR -3252428800,3252429823,NO -3252429824,3252448511,FR -3252448512,3252448767,NO -3252448768,3252449791,FR -3252449792,3252450047,DK -3252450048,3252450879,FR -3252450880,3252450911,NO -3252450912,3252461567,FR -3252461568,3252469503,NO -3252469504,3252469759,FR -3252469760,3252473855,NL -3252473856,3252476927,US -3252476928,3252477951,FR -3252477952,3252486143,NO -3252486144,3252490239,BE -3252490240,3252496127,SE -3252496128,3252496383,AU -3252496384,3252500223,SE -3252500224,3252500479,GB -3252500480,3252505343,SE -3252505344,3252505599,US -3252505600,3252507135,SE -3252507136,3252507647,RO -3252507648,3252510719,GB -3252510720,3252514815,FR -3252514816,3252515071,SI -3252515072,3252515327,GB -3252515328,3252515583,NL -3252515584,3252515839,SI -3252515840,3252516095,CH -3252516096,3252516351,FR -3252516352,3252516607,GB -3252516608,3252516863,SE -3252517376,3252517631,PL -3252517888,3252518143,DK -3252518144,3252518399,NL -3252518400,3252518655,PL -3252518656,3252518911,DE -3252518912,3252527103,NL -3252527104,3252535295,BE -3252541952,3252542207,CI -3252543488,3252551679,BE -3252551680,3252563967,CH -3252563968,3252564479,RU -3252564736,3252564991,IR -3252564992,3252566015,UA -3252566016,3252566271,DE -3252566272,3252566527,RO -3252566528,3252566783,RU -3252566784,3252567039,CH -3252567296,3252567551,GB -3252567552,3252567807,RU -3252567808,3252568063,RO -3252568064,3252576255,CH -3252578816,3252579327,CH -3252579328,3252579583,FR -3252579584,3252579839,RU -3252579840,3252580095,SE -3252580352,3252584447,LI -3252584448,3252584703,FR -3252584704,3252584959,IL -3252584960,3252585215,CZ -3252585216,3252585471,PL -3252585472,3252585727,NL -3252585728,3252585983,FI -3252585984,3252586239,FR -3252586240,3252586495,PL -3252586496,3252586751,IT -3252586752,3252587007,NL -3252587008,3252587263,CH -3252587520,3252587775,UA -3252587776,3252588031,SE -3252588544,3252599807,CH -3252600320,3252600575,NL -3252600576,3252600831,RU -3252600832,3252616191,CH -3252616704,3252616959,ES -3252616960,3252617215,CH -3252617216,3252617471,PL -3252617472,3252633599,CH -3252634624,3252634879,RU -3252636672,3252636927,TR -3252636928,3252637183,DE -3252637184,3252637695,GB -3252637696,3252641791,CH -3252642304,3252642559,UA -3252642560,3252642815,DK -3252642816,3252643071,AE -3252643072,3252643327,RO -3252643328,3252643583,CH -3252645120,3252645375,CH -3252645888,3252682751,CH -3252682752,3252813823,HU -3252813824,3252830207,RO -3252830208,3252832255,MD -3252832256,3252832767,RO -3252832768,3252834303,MD -3252834304,3252862975,RO -3252862976,3252879359,HU -3252879360,3252895743,EG -3252895744,3252903935,IT -3252903936,3252904447,UA -3252904448,3252904703,RU -3252904704,3252904959,DE -3252904960,3252905215,PL -3252905216,3252905471,CH -3252905472,3252905727,LT -3252905984,3252906239,IT -3252906240,3252906495,PL -3252906496,3252906751,GB -3252906752,3252907007,FR -3252907008,3252907263,AT -3252907520,3252907775,RO -3252907776,3252908031,GB -3252908032,3252908287,PL -3252908288,3252908543,AT -3252908800,3252909055,UA -3252909056,3252909311,PL -3252909312,3252909567,DE -3252909568,3252909823,GB -3252909824,3252910335,UA -3252910848,3252911103,PL -3252911104,3252911359,DE -3252911616,3252911871,SE -3252911872,3252912127,SA -3252912128,3252912383,EG -3252912640,3252912895,FR -3252912896,3252913151,PL -3252913152,3252913407,ES -3252913408,3252913663,FR -3252913664,3252913919,RU -3252914176,3252916223,FR -3252916224,3252920319,DE -3252920320,3252928511,LB -3252928512,3252929535,DE -3252929536,3252930559,HU -3252930560,3252931071,GB -3252931072,3252931583,DE -3252931584,3252932095,NO -3252932096,3252933631,UA -3252933632,3252934655,IT -3252934656,3252936703,PL -3252936704,3252937215,CH -3252937216,3252937727,RO -3252937728,3252938239,FR -3252938240,3252938751,UA -3252938752,3252939263,RU -3252939264,3252939775,DE -3252940288,3252940799,PT -3252940800,3252941311,RU -3252941824,3252942847,GB -3252942848,3252943359,FR -3252943360,3252943871,UA -3252943872,3252944383,RU -3252944384,3252944895,DE -3252944896,3252945151,AT -3252945152,3252945407,GB -3252945408,3252945663,UA -3252945920,3252947455,AT -3252948992,3252977663,AT -3252980992,3252981247,GB -3252981504,3252981759,SE -3252981760,3252982015,DE -3252982272,3252982527,DE -3252982528,3252982783,FR -3252983040,3252983551,DE -3252983552,3252983807,SI -3252983808,3252984063,BG -3252984064,3252984319,RO -3252984320,3252984575,AT -3252984576,3252984831,GB -3252984832,3252985087,FR -3252985088,3252985343,SE -3252985344,3252985855,RU -3252988416,3252988927,AT -3252989440,3252989695,PL -3252989952,3252994303,AT -3252995072,3252996095,CH -3252996096,3253002239,AT -3253003008,3253003263,AT -3253004288,3253004799,AT -3253004800,3253005055,CZ -3253006336,3253010431,DE -3253010432,3253075967,FI -3253075968,3253139455,RO -3253139456,3253139711,MD -3253139712,3253207039,RO -3253207040,3253223679,RU -3253223680,3253223935,UA -3253223936,3253230591,RU -3253230592,3253230847,BY -3253230848,3253247999,RU -3253248000,3253248255,DE -3253248256,3253270527,RU -3253270528,3253271551,BY -3253271552,3253288703,RU -3253288704,3253288959,AR -3253288960,3253313535,RU -3253313536,3253313791,NL -3253313792,3253338111,RU -3253338112,3253338367,PL -3253338368,3253341695,SE -3253341696,3253341951,NO -3253341952,3253380351,SE -3253380352,3253380607,GB -3253380608,3253380863,SE -3253380864,3253381119,IT -3253381120,3253383935,SE -3253383936,3253384191,NO -3253384192,3253384447,SE -3253384448,3253384703,IT -3253384704,3253388287,SE -3253388288,3253388799,FR -3253388800,3253389055,SE -3253389056,3253389823,FR -3253389824,3253395199,SE -3253395200,3253395455,GB -3253395456,3253395967,IT -3253395968,3253397503,SE -3253397504,3253397759,GB -3253397760,3253398271,SE -3253398272,3253398783,FR -3253398784,3253399039,SE -3253399040,3253399295,FR -3253399296,3253399551,IT -3253399552,3253400575,SE -3253400576,3253401087,IT -3253401088,3253402111,SE -3253402112,3253402367,IT -3253402368,3253402623,JP -3253402624,3253403647,SE -3253403648,3253403903,PL -3253403904,3253409791,SE -3253409792,3253410047,GB -3253410048,3253411839,SE -3253411840,3253412095,US -3253412096,3253412351,SE -3253412352,3253412607,US -3253412608,3253416447,SE -3253416448,3253416703,GB -3253416704,3253416959,US -3253416960,3253419519,SE -3253419520,3253419775,GB -3253419776,3253428223,SE -3253428224,3253428479,DE -3253428480,3253429247,SE -3253429248,3253429759,JP -3253429760,3253430015,ES -3253430016,3253432831,SE -3253432832,3253433087,IT -3253433088,3253433343,DE -3253433344,3253434111,SE -3253434112,3253434367,GB -3253434368,3253434623,IT -3253434624,3253434879,SE -3253434880,3253435135,IT -3253435136,3253435903,SE -3253435904,3253436159,NL -3253436160,3253436415,NO -3253436416,3253440511,SE -3253440512,3253440767,FR -3253440768,3253441023,SE -3253441024,3253441279,CL -3253441280,3253441535,NL -3253441536,3253443839,SE -3253443840,3253444351,NO -3253444352,3253453311,SE -3253453312,3253453567,NO -3253453568,3253454079,SE -3253454080,3253454335,GB -3253454336,3253454847,SE -3253454848,3253454848,NL -3253454849,3253455615,SE -3253455616,3253455871,US -3253455872,3253456383,SE -3253456384,3253456639,US -3253456640,3253460735,SE -3253460736,3253460991,IT -3253460992,3253461247,US -3253461248,3253461759,SE -3253461760,3253462015,PL -3253462016,3253462527,SE -3253462528,3253463039,US -3253463040,3253464063,GB -3253464064,3253464575,SE -3253464576,3253465087,NL -3253465088,3253469183,SE -3253469184,3253534719,PT -3253534720,3253600255,GB -3253601280,3253602303,FI -3253602304,3253603327,DE -3253603328,3253605375,PL -3253605376,3253606399,UA -3253606400,3253606655,PL -3253606656,3253606911,TR -3253606912,3253607423,DE -3253607424,3253608447,NG -3253608448,3253610495,UA -3253610496,3253611519,PL -3253612544,3253613567,RU -3253613568,3253614591,ES -3253614592,3253615615,RO -3253615616,3253616639,DE -3253616640,3253617663,PL -3253617664,3253618687,GB -3253618688,3253619711,UA -3253619712,3253620735,IT -3253620736,3253621759,GB -3253622784,3253623807,DE -3253623808,3253624831,PL -3253624832,3253625855,UA -3253625856,3253626879,IT -3253626880,3253627903,DE -3253627904,3253628927,UA -3253628928,3253629951,GR -3253629952,3253630975,UA -3253632000,3253633023,DE -3253633024,3253635071,RU -3253635072,3253636095,IT -3253636096,3253637119,CH -3253637120,3253638143,ES -3253638144,3253639167,FR -3253639168,3253640191,UA -3253640192,3253641215,AT -3253641216,3253642239,NL -3253642240,3253643263,GB -3253643264,3253645311,PL -3253645312,3253646335,RU -3253646336,3253647359,PL -3253647360,3253648383,DK -3253648384,3253648895,IL -3253648896,3253649407,PL -3253650432,3253651455,DE -3253651456,3253652479,PL -3253652480,3253653503,LI -3253653504,3253654527,IL -3253654528,3253657599,LV -3253657600,3253658623,UA -3253658624,3253659647,DE -3253659648,3253660671,GB -3253661696,3253662719,NL -3253663744,3253664767,NL -3253664768,3253665791,DE -3253665792,3253666815,CZ -3253666816,3253667839,DE -3253667840,3253668863,GB -3253668864,3253669887,ES -3253669888,3253670911,DE -3253670912,3253671935,CH -3253671936,3253672959,UA -3253672960,3253673983,DE -3253675008,3253676031,PL -3253676032,3253677055,AT -3253677056,3253678079,PL -3253678080,3253679103,DK -3253679104,3253680127,IT -3253680128,3253682175,PL -3253682176,3253683199,RO -3253683200,3253685247,UA -3253685248,3253686271,FR -3253686272,3253687295,PL -3253688320,3253690367,NL -3253690368,3253691391,DK -3253691392,3253692415,PL -3253692416,3253693439,DE -3253693440,3253694463,IL -3253694464,3253695487,GB -3253695488,3253696511,NL -3253696512,3253697535,FR -3253697536,3253698559,PL -3253698560,3253699071,UA -3253699072,3253699583,RO -3253699584,3253699839,NL -3253699840,3253700095,RU -3253700096,3253700607,RO -3253700608,3253701119,PL -3253701120,3253702143,RO -3253702144,3253702655,UA -3253702656,3253703167,PL -3253703680,3253704191,HU -3253704704,3253705215,UA -3253705728,3253706239,DE -3253706240,3253706751,RO -3253707264,3253707775,DE -3253707776,3253708287,MD -3253708800,3253709311,DK -3253709312,3253709823,UA -3253709824,3253710335,RO -3253710336,3253710847,GB -3253710848,3253711359,DK -3253711872,3253712383,UA -3253712384,3253712895,MD -3253712896,3253713151,PL -3253713152,3253713407,DE -3253713408,3253713919,NL -3253713920,3253714431,AT -3253714944,3253715455,FR -3253715456,3253715967,RO -3253716480,3253716991,FR -3253716992,3253717503,CH -3253717504,3253718015,NL -3253718016,3253719551,PL -3253719552,3253720063,BE -3253720064,3253720575,RO -3253720576,3253721087,GR -3253721088,3253721599,UA -3253721600,3253722111,RO -3253722112,3253722623,CH -3253722624,3253723135,NL -3253723136,3253723647,PL -3253723648,3253724159,AT -3253724160,3253724671,UA -3253724672,3253725183,RO -3253725184,3253725439,SE -3253725440,3253725695,RU -3253725696,3253726207,UA -3253726720,3253727231,UA -3253727232,3253727743,FR -3253727744,3253728255,RU -3253728768,3253729279,RO -3253729280,3253729791,AT -3253729792,3253730303,UA -3253730304,3253730815,RO -3253730816,3253731327,UA -3253731328,3253731839,DE -3253731840,3253732351,GB -3253732352,3253733375,DE -3253733376,3253734399,GB -3253734400,3253735167,DE -3253735168,3253735423,GB -3253735424,3253737791,DE -3253737792,3253737807,FR -3253737808,3253737823,DE -3253737824,3253737831,PL -3253737832,3253737839,AT -3253737840,3253737847,DE -3253737848,3253737855,HU -3253737856,3253738536,DE -3253738537,3253738537,GB -3253738538,3253738559,DE -3253738560,3253738567,CZ -3253738568,3253738569,BE -3253738570,3253738570,US -3253738571,3253738575,BE -3253738576,3253738751,DE -3253738752,3253739775,GB -3253739776,3253741055,DE -3253741056,3253741679,GB -3253741680,3253741695,RU -3253741696,3253742591,GB -3253742592,3253742847,DE -3253742848,3253743103,GB -3253743104,3253743615,DE -3253743616,3253744415,GB -3253744416,3253744447,CH -3253744448,3253744511,GB -3253744512,3253744512,US -3253744513,3253744911,GB -3253744912,3253745151,DE -3253745152,3253745183,NO -3253745184,3253745663,DE -3253745664,3253745983,GB -3253745984,3253745999,SE -3253746000,3253746007,DK -3253746008,3253746015,IE -3253746016,3253746023,AT -3253746024,3253746031,CH -3253746032,3253746039,FI -3253746040,3253746047,DE -3253746048,3253746111,IT -3253746112,3253746175,DE -3253746176,3253746431,GB -3253746432,3253746559,DE -3253746560,3253746687,GB -3253746688,3253747711,DE -3253747712,3253759999,GB -3253760000,3253760511,DE -3253760512,3253760767,FR -3253760768,3253761407,DE -3253761408,3253761416,ES -3253761417,3253761417,GB -3253761418,3253761471,ES -3253761472,3253762815,DE -3253762816,3253762943,CH -3253762944,3253762948,DE -3253762949,3253762949,GB -3253762950,3253763071,DE -3253763072,3253763327,SE -3253763328,3253764095,DE -3253764096,3253764607,GB -3253764608,3253765119,DE -3253765120,3253765183,ES -3253765184,3253765247,FR -3253765248,3253765279,PL -3253765280,3253765295,NL -3253765296,3253765311,BE -3253765312,3253765375,TR -3253765376,3253766143,DE -3253766144,3253766399,GB -3253766400,3253766463,DE -3253766464,3253766527,NL -3253766528,3253766655,DE -3253766656,3253766911,CH -3253766912,3253767167,DE -3253767168,3253767615,GB -3253767616,3253767675,IE -3253767676,3253767935,DE -3253767936,3253768369,GB -3253768370,3253768370,ES -3253768371,3253768401,GB -3253768402,3253768402,SE -3253768403,3253768565,GB -3253768566,3253768566,DE -3253768567,3253768703,GB -3253768704,3253768831,DE -3253768832,3253768895,GB -3253768896,3253769727,DE -3253769728,3253770239,GB -3253770240,3253770991,DE -3253770992,3253770999,GB -3253771000,3253771199,DE -3253771200,3253771215,IE -3253771216,3253771231,GB -3253771232,3253771263,IE -3253771264,3253771583,DE -3253771584,3253771647,GB -3253771648,3253771792,DE -3253771793,3253771793,GB -3253771794,3253771839,DE -3253771840,3253771903,GB -3253771904,3253772191,DE -3253772192,3253772207,GB -3253772208,3253772287,DE -3253772288,3253772519,GB -3253772520,3253772527,DE -3253772528,3253772543,GB -3253772544,3253774335,DE -3253774336,3253774583,GB -3253774584,3253774591,DE -3253774592,3253774847,GB -3253774848,3253775135,DE -3253775136,3253775151,GB -3253775152,3253775183,DE -3253775184,3253775191,FR -3253775192,3253775599,DE -3253775600,3253775607,IT -3253775608,3253775609,DE -3253775610,3253775610,GB -3253775611,3253776303,DE -3253776304,3253776311,ES -3253776312,3253776383,DE -3253776384,3253776809,GB -3253776810,3253776810,CH -3253776811,3253777407,GB -3253777408,3253777791,DE -3253777792,3253777855,FR -3253777856,3253777887,GB -3253777888,3253777919,DE -3253777920,3253778231,GB -3253778232,3253778239,FR -3253778240,3253778271,GB -3253778272,3253778287,DE -3253778288,3253778391,GB -3253778392,3253778399,IT -3253778400,3253778431,GB -3253778432,3253778751,DE -3253778752,3253778879,BE -3253778880,3253778911,DE -3253778912,3253778943,NL -3253778944,3253779135,GB -3253779136,3253779167,NL -3253779168,3253779199,GB -3253779200,3253779455,DE -3253779456,3253779711,GB -3253779712,3253781415,DE -3253781416,3253781423,GB -3253781424,3253781503,DE -3253781504,3253781615,GB -3253781616,3253781631,FR -3253781632,3253782015,GB -3253782016,3253782527,DE -3253782528,3253782535,FR -3253782536,3253783487,GB -3253783488,3253783519,DE -3253783520,3253784703,GB -3253784704,3253784803,DE -3253784804,3253784804,GB -3253784805,3253785123,DE -3253785124,3253785124,GB -3253785125,3253785343,DE -3253785344,3253785599,NL -3253785600,3253786111,DE -3253786112,3253786367,GB -3253786368,3253786623,DE -3253786624,3253786879,GB -3253786880,3253788079,DE -3253788080,3253788082,GB -3253788083,3253788127,DE -3253788128,3253788143,GB -3253788144,3253788159,DE -3253788160,3253788415,NL -3253788416,3253788447,GB -3253788448,3253788479,DE -3253788480,3253788511,GB -3253788512,3253790207,DE -3253790208,3253790463,GB -3253790464,3253790695,DE -3253790696,3253790703,GB -3253790704,3253791472,DE -3253791473,3253791473,GB -3253791474,3253793007,DE -3253793008,3253793011,ES -3253793012,3253793071,DE -3253793072,3253793087,FR -3253793088,3253793259,DE -3253793260,3253793260,GB -3253793261,3253793261,DE -3253793262,3253793262,GB -3253793263,3253793271,DE -3253793272,3253793275,GB -3253793276,3253793359,DE -3253793360,3253793375,DK -3253793376,3253795839,DE -3253795840,3253796351,GB -3253796352,3253796863,DE -3253796864,3253862399,SE -3253862400,3253862655,GB -3253862656,3253882879,FR -3253882880,3253886975,NL -3253886976,3253887231,GB -3253887232,3253887487,NL -3253887488,3253887743,ES -3253888000,3253888255,PL -3253888256,3253888511,BE -3253888512,3253888767,GB -3253888768,3253889023,SE -3253889024,3253889279,RO -3253889792,3253890047,DK -3253890048,3253890303,NL -3253890560,3253890815,GB -3253890816,3253891071,IE -3253891072,3253891327,DE -3253891328,3253891583,GB -3253891584,3253891839,UA -3253891840,3253892351,GB -3253892352,3253892607,NL -3253892608,3253892863,AT -3253892864,3253893119,NL -3253893120,3253893375,RO -3253893376,3253893631,DE -3253893632,3253893887,SE -3253893888,3253894143,RU -3253894144,3253894399,PT -3253894400,3253894655,NL -3253894656,3253894911,FI -3253894912,3253896703,RU -3253896704,3253896959,AT -3253896960,3253897215,RU -3253897216,3253898239,PL -3253898240,3253898495,GB -3253898496,3253898751,HR -3253898752,3253899263,PL -3253899264,3253899519,MD -3253899520,3253899775,RU -3253899776,3253900287,PL -3253900288,3253901311,RU -3253901312,3253901567,PL -3253901824,3253902079,SI -3253902080,3253902335,DK -3253902336,3253904383,UA -3253904384,3253904895,ES -3253904896,3253905151,UA -3253905152,3253905407,RU -3253905408,3253905919,PL -3253905920,3253906431,RU -3253906432,3253906687,PL -3253906688,3253906943,RU -3253906944,3253907455,FR -3253907456,3253908479,RU -3253908480,3253908991,CZ -3253908992,3253909247,SE -3253909248,3253909503,NL -3253909504,3253910527,SE -3253910528,3253911039,ES -3253911040,3253911551,RU -3253911552,3253911807,FR -3253911808,3253912063,RU -3253912064,3253912575,IR -3253912576,3253913599,RO -3253913600,3253915647,RU -3253915648,3253916159,IR -3253916160,3253916671,NL -3253916672,3253917183,PL -3253917184,3253917439,CY -3253917440,3253917695,PL -3253917696,3253918207,RU -3253918208,3253918719,CH -3253918720,3253919743,IL -3253919744,3253923839,GB -3253923840,3253927935,GR -3253927936,3253961727,GB -3253961728,3253962239,MD -3253962752,3253963263,BE -3253963264,3253963775,RU -3253963776,3253964287,SI -3253964288,3253964799,PL -3253964800,3253965311,SE -3253965312,3253966335,PL -3253966848,3253967359,UA -3253967360,3253967871,PL -3253967872,3253968895,UA -3253968896,3253969151,DE -3253969408,3253969919,AT -3253970688,3253970943,UA -3253970944,3253971967,RS -3253971968,3253972991,RU -3253972992,3253974527,GB -3253974784,3253975039,SE -3253975040,3253977087,DE -3253977088,3253985279,TR -3253985280,3253993471,GB -3253993472,3254067199,BE -3254067200,3254075391,CZ -3254075392,3254083583,HU -3254083584,3254124543,BE -3254124544,3254156799,CH -3254156800,3254157055,LI -3254157056,3254177279,CH -3254177280,3254177535,LI -3254177536,3254255615,CH -3254255616,3254256127,RE -3254256128,3254256639,GP -3254256640,3254257151,YT -3254257152,3254259455,FR -3254259456,3254259967,YT -3254259968,3254260223,GF -3254260224,3254260479,MQ -3254260480,3254260991,FR -3254260992,3254262015,YT -3254262016,3254262527,FR -3254262528,3254263039,YT -3254263040,3254266367,FR -3254266368,3254266623,RE -3254266624,3254277119,FR -3254277120,3254278143,YT -3254278144,3254485879,FR -3254485880,3254485887,CI -3254485888,3254486527,FR -3254486528,3254486543,CH -3254486544,3254487039,FR -3254487040,3254487199,KM -3254487200,3254487263,FR -3254487264,3254487295,KM -3254487296,3254487419,CF -3254487420,3254488431,FR -3254488432,3254488447,MG -3254488448,3254489087,FR -3254489088,3254489343,DZ -3254489344,3254489365,FR -3254489366,3254489367,MR -3254489368,3254489369,FR -3254489370,3254489370,MR -3254489371,3254489373,FR -3254489374,3254489375,MR -3254489376,3254489407,FR -3254489408,3254489439,MR -3254489440,3254489443,FR -3254489444,3254489455,MR -3254489456,3254489463,FR -3254489464,3254489519,MR -3254489520,3254489535,FR -3254489536,3254489567,MR -3254489568,3254489599,FR -3254489600,3254489855,MR -3254489856,3254490111,TD -3254490112,3254490367,FR -3254490368,3254490623,CF -3254490624,3254491135,FR -3254491136,3254491391,DZ -3254491392,3254491903,FR -3254491904,3254492031,CM -3254492032,3254493183,FR -3254493184,3254493253,GP -3254493254,3254493311,FR -3254493312,3254493323,GP -3254493324,3254493343,FR -3254493344,3254493354,GP -3254493355,3254493375,FR -3254493376,3254493410,GP -3254493411,3254493695,FR -3254493696,3254493951,GP -3254493952,3254493999,MQ -3254494000,3254494015,GF -3254494016,3254494207,MQ -3254494208,3254494527,GP -3254494528,3254494975,FR -3254494976,3254494983,DJ -3254494984,3254495055,FR -3254495056,3254495063,DJ -3254495064,3254495487,FR -3254495488,3254495743,DZ -3254495744,3254508799,FR -3254508800,3254508831,MQ -3254508832,3254509412,FR -3254509413,3254509413,GQ -3254509414,3254576383,FR -3254576384,3254576543,DO -3254576544,3254608383,FR -3254608384,3254608895,RE -3254608896,3254609151,FR -3254609152,3254609407,RE -3254609408,3254609663,FR -3254609664,3254610175,RE -3254610176,3254610431,FR -3254610432,3254610687,RE -3254610688,3254610943,FR -3254610944,3254611199,RE -3254611200,3254611455,FR -3254611456,3254611967,YT -3254611968,3254612223,FR -3254612224,3254612991,RE -3254612992,3254613247,FR -3254613248,3254613759,RE -3254613760,3254614015,FR -3254614016,3254615551,RE -3254615552,3254616063,YT -3254616064,3254648831,FR -3254648832,3254649855,AL -3254649856,3254650879,SE -3254653440,3254654847,DE -3254654848,3254654975,FI -3254654976,3254655999,IT -3254656256,3254656511,BG -3254656512,3254656767,DE -3254656768,3254657023,GB -3254657024,3254661119,ES -3254661120,3254665215,GB -3254681600,3254697983,DE -3254697984,3254698495,SE -3254698496,3254699007,GB -3254699008,3254699519,UA -3254700032,3254700543,GR -3254700544,3254701055,DE -3254701568,3254702079,IL -3254702080,3254702591,RU -3254702592,3254703103,GB -3254703104,3254703615,DE -3254703616,3254704127,NL -3254704128,3254704639,UA -3254705152,3254705663,UA -3254705664,3254706175,GR -3254706176,3254707199,RU -3254707200,3254707711,TR -3254707712,3254708223,RO -3254708224,3254708735,UA -3254709248,3254709759,DE -3254709760,3254710271,PL -3254710272,3254710783,IT -3254710784,3254711295,RO -3254711808,3254712319,PL -3254712320,3254712831,RU -3254712832,3254713343,KZ -3254713344,3254713855,TR -3254713856,3254714367,NL -3254714368,3254779903,TR -3254779904,3254780159,DE -3254780160,3254780671,GB -3254780672,3254780927,LT -3254780928,3254781183,GR -3254781184,3254781439,NL -3254781440,3254781951,BE -3254781952,3254782207,LV -3254782208,3254782463,FR -3254782464,3254782719,AT -3254782720,3254782975,DE -3254782976,3254783743,CZ -3254783744,3254783999,SA -3254784000,3254784255,IT -3254784256,3254784511,CH -3254784512,3254785279,LT -3254785280,3254785535,KZ -3254785536,3254785791,DK -3254785792,3254786047,LU -3254786048,3254786815,AT -3254786816,3254787071,SM -3254787072,3254788095,NL -3254788096,3254788351,BG -3254788352,3254789119,ES -3254789120,3254789375,FR -3254789376,3254789631,BE -3254789632,3254790655,TK -3254790656,3254790911,LU -3254790912,3254791423,BE -3254791424,3254791679,SK -3254791680,3254792191,DK -3254792192,3254792959,LV -3254792960,3254793215,EE -3254793216,3254794751,UA -3254794752,3254795007,GB -3254795008,3254795263,SE -3254795264,3254795519,KZ -3254795520,3254795775,SE -3254795776,3254796031,PL -3254796032,3254796287,AT -3254796288,3254797311,SE -3254797312,3254798335,RU -3254798336,3254799359,AT -3254799360,3254800383,IE -3254800384,3254801407,FI -3254801408,3254802431,HR -3254802432,3254803455,UA -3254803456,3254804479,DE -3254804480,3254806527,PL -3254807552,3254808575,KZ -3254808576,3254809599,RU -3254810624,3254811647,RU -3254811648,3254812671,RO -3254812672,3254812927,PL -3254812928,3254813183,RO -3254813184,3254813439,TR -3254813440,3254813695,UA -3254813696,3254813951,DK -3254814208,3254814463,SE -3254814464,3254814719,DE -3254814976,3254815231,CH -3254815232,3254815487,UA -3254815744,3254815999,IT -3254816256,3254816511,TR -3254816512,3254816767,DE -3254816768,3254817279,RU -3254817280,3254817535,CY -3254817536,3254817791,GB -3254817792,3254818047,UA -3254818048,3254818303,DE -3254818304,3254818559,UA -3254818560,3254818815,DE -3254818816,3254819327,FR -3254819328,3254819583,PL -3254819584,3254819839,DK -3254819840,3254820095,GB -3254820096,3254820351,UA -3254820352,3254820607,GB -3254820864,3254821119,LT -3254821120,3254821375,DK -3254821376,3254821631,RU -3254821632,3254821887,DE -3254821888,3254822143,HU -3254822144,3254822399,DE -3254822400,3254822655,FR -3254822656,3254822911,PL -3254823168,3254823423,NO -3254823424,3254823679,NL -3254823680,3254823935,PL -3254823936,3254824191,CH -3254824192,3254824447,RO -3254824448,3254824959,SI -3254824960,3254825215,FR -3254825216,3254825471,RO -3254825472,3254825727,TR -3254825728,3254825983,FR -3254826240,3254826495,PL -3254826496,3254827263,DE -3254827264,3254827519,GR -3254827776,3254828031,UA -3254828544,3254828799,RO -3254828800,3254829055,SI -3254829056,3254829311,NO -3254829568,3254829823,NL -3254829824,3254830079,FR -3254830080,3254830335,IE -3254830336,3254830591,NL -3254830592,3254830847,CH -3254830848,3254831103,PL -3254831104,3254831359,UA -3254831360,3254831615,DE -3254831616,3254831871,TR -3254831872,3254832127,LT -3254832128,3254832383,RO -3254832384,3254832639,BE -3254832640,3254832895,UA -3254833152,3254833407,DE -3254833408,3254833663,RU -3254833664,3254833919,GB -3254833920,3254834175,PL -3254834176,3254834431,CH -3254834432,3254834687,FR -3254834688,3254834943,GB -3254834944,3254835199,NL -3254835200,3254835455,DE -3254835456,3254835711,SE -3254835712,3254835967,UA -3254835968,3254836223,RU -3254836224,3254836479,PL -3254836736,3254836991,AT -3254837248,3254837503,HR -3254837504,3254837759,RU -3254837760,3254838015,IE -3254838528,3254838783,CH -3254838784,3254839039,AT -3254839296,3254839551,DE -3254839552,3254839807,PL -3254839808,3254840063,BE -3254840064,3254840319,BG -3254840320,3254840575,DK -3254840576,3254840831,UA -3254840832,3254841343,GB -3254841344,3254841599,PL -3254841600,3254841855,IE -3254841856,3254842111,LV -3254842880,3254843135,SE -3254843136,3254843391,DE -3254843648,3254843903,FR -3254843904,3254844159,NL -3254844160,3254844415,PL -3254844416,3254844671,GB -3254844672,3254844927,RO -3254844928,3254845183,DE -3254845184,3254845439,FR -3254845440,3254882303,SK -3254882304,3254882559,PL -3254882560,3254882815,IL -3254882816,3254883071,PL -3254883072,3254883583,GB -3254883584,3254883839,AL -3254883840,3254884351,GB -3254884352,3254884607,RU -3254884608,3254884863,PL -3254884864,3254885119,SE -3254885120,3254885375,DE -3254885376,3254885631,RU -3254885632,3254885887,SK -3254885888,3254886143,AT -3254886144,3254886399,UA -3254886400,3254886655,IT -3254886656,3254886911,RU -3254886912,3254887423,CH -3254887424,3254888191,GB -3254888192,3254888447,RO -3254888448,3254888703,RU -3254888704,3254888959,RO -3254888960,3254889471,RU -3254889472,3254890495,SK -3254890496,3254890751,DE -3254891008,3254891263,RO -3254891520,3254891775,GB -3254891776,3254892031,DE -3254892032,3254892287,GB -3254892288,3254892543,BE -3254892800,3254893055,SK -3254893568,3254894079,CZ -3254894080,3254894335,CH -3254894336,3254894591,SK -3254894848,3254895103,UA -3254895104,3254895359,GB -3254895360,3254895615,UA -3254895616,3254895871,PL -3254895872,3254896127,SE -3254896128,3254896383,RU -3254896384,3254896639,PL -3254896640,3254896895,DK -3254896896,3254897151,PL -3254897152,3254897407,RU -3254897408,3254897663,FR -3254897664,3254897919,NL -3254897920,3254898175,BE -3254898176,3254898431,AT -3254898432,3254898687,DE -3254898688,3254898943,IT -3254898944,3254899199,EE -3254899200,3254899455,GB -3254899456,3254899967,SE -3254899968,3254900479,RU -3254900480,3254900991,SK -3254900992,3254901247,PL -3254901504,3254901759,DK -3254901760,3254902271,UA -3254902272,3254904831,SK -3254904832,3254907903,RU -3254908160,3254908415,CH -3254908416,3254908671,PL -3254908672,3254908927,SE -3254908928,3254909951,RU -3254909952,3254910719,PL -3254910720,3254910975,HR -3254910976,3254930602,FR -3254930603,3254930603,RE -3254930604,3254962380,FR -3254962381,3254962381,NL -3254962382,3254962421,FR -3254962422,3254962422,NL -3254962423,3255019519,FR -3255019520,3255019775,GP -3255019776,3255107583,FR -3255111680,3255117823,FR -3255120640,3255120895,DE -3255121664,3255121919,FR -3255123712,3255123967,DE -3255126016,3255126527,FR -3255128064,3255128575,FR -3255129856,3255130111,HR -3255130112,3255130623,FR -3255132160,3255160831,FR -3255166976,3255169023,FR -3255172352,3255172607,DE -3255173120,3255173631,SH -3255173648,3255173711,GB -3255173760,3255173823,GB -3255173840,3255174151,GB -3255174160,3255174167,GB -3255174200,3255174207,GB -3255174216,3255174247,GB -3255174272,3255174279,GB -3255174312,3255174319,GB -3255174328,3255174335,GB -3255174376,3255174383,GB -3255174400,3255175167,GB -3255175200,3255175231,GB -3255175248,3255175263,GB -3255175280,3255175295,GB -3255175312,3255175327,GB -3255175432,3255175447,GB -3255175456,3255175503,GB -3255175512,3255175535,GB -3255175552,3255175559,GB -3255175592,3255175607,GB -3255176192,3255177215,GB -3255177472,3255177855,GB -3255177984,3255187199,GB -3255187200,3255187455,DE -3255187456,3255187711,GB -3255188480,3255191807,GB -3255192320,3255193343,GB -3255193600,3255193863,GB -3255193888,3255193959,GB -3255193968,3255193975,GB -3255193976,3255193983,GI -3255193984,3255193999,GB -3255194016,3255194039,GB -3255194056,3255194063,GB -3255194072,3255194431,GB -3255194496,3255194559,GB -3255194624,3255194703,GB -3255194720,3255194815,GB -3255194880,3255205887,GB -3255205888,3255214079,FR -3255214080,3255222271,CH -3255222272,3255223295,DE -3255223296,3255224319,RU -3255224320,3255225343,RO -3255225344,3255226367,PL -3255226368,3255227391,DE -3255227392,3255228415,RO -3255228416,3255230463,RU -3255230464,3255230719,MA -3255230720,3255230975,PS -3255230976,3255231231,DE -3255231232,3255231487,BE -3255231488,3255231743,DE -3255231744,3255231999,PT -3255232000,3255232255,RO -3255232256,3255233023,UA -3255233280,3255233535,GB -3255233536,3255233791,SE -3255233792,3255234047,SI -3255234048,3255234303,NO -3255234304,3255234559,DE -3255234560,3255234815,FR -3255234816,3255235071,PL -3255235072,3255235327,SI -3255235328,3255235583,SE -3255235584,3255235839,GB -3255235840,3255236351,PL -3255236608,3255236863,GB -3255236864,3255237119,DE -3255237120,3255237375,AT -3255237888,3255238143,ES -3255238400,3255238655,QA -3255238656,3255245759,BE -3255245760,3255245775,LU -3255245776,3255292311,BE -3255292312,3255292319,LU -3255292320,3255304191,BE -3255304192,3255304447,DE -3255304448,3255305215,LV -3255305216,3255305471,BG -3255305472,3255307263,LV -3255307776,3255308031,PL -3255308032,3255308287,CH -3255308288,3255311359,LV -3255311616,3255311871,SE -3255311872,3255312127,PT -3255312128,3255312383,SE -3255312384,3255315711,LV -3255315712,3255316223,PL -3255316224,3255316479,RU -3255316736,3255316991,GB -3255316992,3255317247,FR -3255317248,3255317503,UA -3255317504,3255317759,BE -3255317760,3255318015,BG -3255318016,3255318271,GB -3255318272,3255318527,RU -3255318528,3255318783,UA -3255318784,3255319295,DE -3255319552,3255319807,BG -3255319808,3255320063,AT -3255320064,3255320319,BE -3255320320,3255320575,AT -3255320576,3255321087,UA -3255321088,3255322111,PL -3255322112,3255323135,RU -3255323136,3255323647,GB -3255323648,3255324159,IL -3255324160,3255324671,CH -3255324672,3255325695,RO -3255325696,3255326207,RU -3255326720,3255327231,IL -3255327232,3255327743,DE -3255327744,3255328255,GB -3255328256,3255328767,SI -3255328768,3255336959,DE -3255336960,3255341055,RU -3255341056,3255342079,UA -3255342080,3255343103,FR -3255343104,3255344127,RU -3255344128,3255345151,UA -3255345152,3255353343,RU -3255353344,3255361535,DE -3255361536,3255362047,RU -3255362048,3255362559,FI -3255362560,3255364607,RU -3255364608,3255365119,NL -3255365120,3255365631,SK -3255365632,3255366143,UA -3255366144,3255367167,DK -3255367168,3255367679,RU -3255367680,3255368191,UA -3255368192,3255368703,FR -3255368704,3255369215,CZ -3255369216,3255369727,GB -3255370240,3255370751,RU -3255370752,3255371263,DE -3255371264,3255371775,BG -3255372288,3255372799,DE -3255372800,3255373311,MC -3255373312,3255373823,UA -3255373824,3255374335,PL -3255374848,3255375359,CY -3255375360,3255375871,RO -3255375872,3255376383,PL -3255376384,3255376895,RU -3255376896,3255377151,GB -3255377152,3255377407,SI -3255377408,3255377919,KZ -3255377920,3255378431,GB -3255378432,3255378943,CH -3255378944,3255379455,UA -3255379456,3255379967,RU -3255379968,3255380479,GB -3255380480,3255380991,NL -3255380992,3255381503,CH -3255381504,3255382015,PL -3255382016,3255382527,NL -3255382528,3255383039,UA -3255383040,3255383551,PL -3255383552,3255384063,CH -3255384576,3255385087,AT -3255385088,3255385599,RO -3255385600,3255386111,FR -3255386112,3255386623,KE -3255386624,3255387391,PL -3255387392,3255387647,RU -3255387648,3255388159,UA -3255388160,3255388671,DE -3255388672,3255389183,SE -3255389184,3255389695,GB -3255389696,3255390207,PL -3255390720,3255391231,KE -3255391232,3255391743,NL -3255391744,3255392255,DK -3255392256,3255392767,DE -3255392768,3255393791,RO -3255393792,3255399679,SE -3255399680,3255400447,DE -3255400448,3255401471,CH -3255401472,3255412479,DE -3255412480,3255412735,RO -3255412736,3255413247,DE -3255413248,3255413503,LV -3255413504,3255413759,RU -3255414528,3255414783,LV -3255415808,3255416319,AT -3255416320,3255416831,DE -3255417856,3255418879,GB -3255418880,3255422975,DE -3255424000,3255425023,LV -3255426048,3255426559,IT -3255426816,3255427071,PL -3255427072,3255431167,RU -3255431168,3255432191,GB -3255432192,3255432447,HU -3255432448,3255435263,GB -3255435264,3255435295,EE -3255435296,3255435327,LT -3255435328,3255435359,LV -3255435360,3255435367,AT -3255435368,3255435375,CZ -3255435392,3255435399,EE -3255435400,3255435407,DE -3255435424,3255435431,HU -3255435432,3255435439,LV -3255435456,3255435463,LT -3255435464,3255435471,NL -3255435488,3255435495,PL -3255435496,3255435503,RO -3255435520,3255435551,IS -3255435552,3255435559,BE -3255435560,3255435567,DK -3255435584,3255435591,FR -3255435592,3255435599,IS -3255435616,3255435623,IE -3255435624,3255435631,LU -3255435648,3255435655,CH -3255435656,3255435663,GB -3255435776,3255435807,IS -3255435808,3255435815,BE -3255435816,3255435823,DK -3255435840,3255435847,FR -3255435848,3255435855,IS -3255435872,3255435879,IE -3255435880,3255435887,LU -3255435904,3255435911,CH -3255435912,3255435919,GB -3255436032,3255436063,EE -3255436064,3255436095,LT -3255436096,3255436127,LV -3255436128,3255436135,AT -3255436136,3255436143,CZ -3255436160,3255436167,EE -3255436168,3255436175,DE -3255436192,3255436199,HU -3255436200,3255436207,LV -3255436224,3255436231,LT -3255436232,3255436239,NL -3255436256,3255436263,PL -3255436264,3255436271,RO -3255436288,3255436319,MT -3255436320,3255436327,BG -3255436328,3255436335,HR -3255436352,3255436359,CY -3255436360,3255436367,FI -3255436384,3255436391,GR -3255436392,3255436399,IT -3255436416,3255436423,MT -3255436424,3255436431,NO -3255436448,3255436455,PT -3255436456,3255436463,SI -3255436480,3255436487,ES -3255436488,3255436495,SE -3255436544,3255436575,MT -3255436576,3255436583,BG -3255436584,3255436591,HR -3255436608,3255436615,CY -3255436616,3255436623,FI -3255436640,3255436647,GR -3255436648,3255436655,IT -3255436672,3255436679,MT -3255436680,3255436687,NO -3255436704,3255436711,PT -3255436712,3255436719,SI -3255436736,3255436743,ES -3255436744,3255436751,SE -3255436800,3255436807,SK -3255438352,3255438359,SK -3255451648,3255452671,FR -3255474176,3255476223,GB -3255483392,3255484415,DE -3255485440,3255486463,FR -3255488512,3255489535,AT -3255492608,3255496703,GB -3255498752,3255500799,FR -3255500800,3255504895,CH -3255504896,3255505919,GB -3255506432,3255506687,PL -3255506688,3255506943,PT -3255506944,3255507199,PL -3255507456,3255507711,FR -3255507712,3255507967,AT -3255507968,3255508223,UA -3255508224,3255508479,RU -3255508480,3255521100,CH -3255521101,3255521101,DE -3255521102,3255544319,CH -3255544320,3255544575,DE -3255544576,3255544831,AT -3255544832,3255558143,CH -3255558400,3255558655,UA -3255558912,3255559167,GB -3255559168,3255559679,CH -3255560192,3255562751,CH -3255562752,3255563007,CZ -3255563008,3255563263,CH -3255563776,3255564031,CH -3255564032,3255564287,RU -3255565312,3255566335,DE -3255566336,3255570431,GB -3255570432,3255574527,CH -3255574528,3255578623,CZ -3255578624,3255582719,RU -3255582720,3255599103,UA -3255599104,3255615487,CH -3255615488,3255623679,DE -3255623680,3255631871,BG -3255631872,3255659519,NL -3255660288,3255660543,GR -3255660544,3255666175,NL -3255666432,3255666687,DE -3255668224,3255697407,NL -3255697408,3255704575,SE -3255704576,3255705087,FR -3255705088,3255710719,SE -3255710720,3255710975,ES -3255710976,3255716351,SE -3255716352,3255716863,CH -3255716864,3255719167,SE -3255719168,3255719423,NO -3255719424,3255719679,SE -3255719680,3255719935,IT -3255719936,3255724543,SE -3255724544,3255725055,US -3255725056,3255725311,ES -3255725312,3255730943,SE -3255730944,3255731199,GB -3255731200,3255743231,SE -3255743232,3255743487,IT -3255743488,3255743743,DE -3255743744,3255743999,US -3255744000,3255752959,SE -3255752960,3255753215,LI -3255753216,3255762431,SE -3255762432,3255762943,BE -3255762944,3255771135,DE -3255779328,3255787519,DE -3255791616,3255792639,UA -3255792640,3255793663,RU -3255793664,3255794943,PL -3255795200,3255795711,RU -3255795712,3255798783,DE -3255799040,3255799295,SE -3255799296,3255800319,DE -3255800576,3255800831,UA -3255800832,3255801855,DE -3255802880,3255817215,DE -3255817216,3255817471,SE -3255817472,3255817727,ES -3255817728,3255820287,DE -3255821312,3255822335,CH -3255822336,3255828479,DE -3255828480,3256025087,SE -3256025088,3256057855,NO -3256057856,3256082431,DK -3256082432,3256090623,LV -3256090624,3256221695,IT -3256221696,3256223743,SE -3256223744,3256225791,NL -3256225792,3256229887,SE -3256229888,3256233983,DE -3256233984,3256238079,SE -3256238080,3256246271,NO -3256246272,3256352767,SE -3256352768,3256385535,CH -3256385536,3256393727,AT -3256393728,3256394239,DE -3256394752,3256395263,PL -3256395264,3256395775,GB -3256395776,3256396287,TR -3256396288,3256396799,GR -3256396800,3256397311,RU -3256397312,3256397823,PL -3256398336,3256398847,RO -3256398848,3256399359,PL -3256399360,3256400895,UA -3256400896,3256401407,GB -3256401408,3256401919,UA -3256401920,3256410111,DE -3256410112,3256410623,TR -3256410624,3256411135,GR -3256411136,3256411647,FR -3256411648,3256412159,CH -3256412672,3256413183,RO -3256413184,3256413695,UA -3256413696,3256414207,PL -3256414208,3256414719,RU -3256414720,3256415231,DE -3256415232,3256415743,PL -3256415744,3256416255,UA -3256416256,3256416767,RS -3256417280,3256417791,NO -3256417792,3256418303,GB -3256418304,3256483839,DE -3256483840,3256487935,NL -3256489472,3256489983,GR -3256489984,3256490239,BE -3256490496,3256490751,CH -3256491008,3256491263,DE -3256492032,3256524287,NL -3256524288,3256524799,DE -3256524800,3256549375,NL -3256549376,3256614911,TR -3256614912,3256615935,FI -3256615936,3256616959,UA -3256616960,3256617983,GB -3256617984,3256619007,PL -3256619008,3256620031,UA -3256620032,3256621055,RU -3256621056,3256622079,DK -3256622080,3256623103,RU -3256623104,3256624127,PL -3256624128,3256625151,UA -3256625152,3256626175,PL -3256627200,3256628223,PL -3256628224,3256629247,UA -3256629248,3256630271,RU -3256630272,3256633343,UA -3256633344,3256634367,RU -3256634368,3256635391,MD -3256635392,3256636415,PL -3256636416,3256638463,UA -3256638464,3256639487,RU -3256640512,3256641535,UA -3256641536,3256642559,PL -3256642560,3256643583,SI -3256643584,3256644607,NL -3256644608,3256645631,IT -3256645632,3256646655,SE -3256646656,3256647679,GB -3256647680,3256648703,RS -3256648704,3256649727,UA -3256649728,3256650751,GB -3256650752,3256652799,UA -3256652800,3256653823,DE -3256653824,3256654847,RU -3256655872,3256656895,RU -3256656896,3256657919,GB -3256657920,3256658943,PL -3256658944,3256662015,UA -3256662016,3256663039,RU -3256663040,3256664063,PL -3256664064,3256665087,RU -3256665088,3256666111,UA -3256666112,3256667135,PL -3256667136,3256671231,RU -3256671232,3256672255,PL -3256672256,3256673279,RU -3256673280,3256674303,PL -3256674304,3256675327,LT -3256675328,3256677375,RU -3256677376,3256678399,GB -3256678400,3256680447,DK -3256680448,3256688639,CH -3256688640,3256692735,IL -3256692736,3256693759,GR -3256694784,3256695807,DE -3256695808,3256696831,UA -3256699136,3256699391,NL -3256700416,3256700671,NL -3256705536,3256705791,BE -3256706048,3256706559,GR -3256711168,3256711423,DE -3256713216,3256727551,PL -3256727552,3256727807,DE -3256727808,3256728063,HU -3256728064,3256728575,RU -3256728576,3256729599,DE -3256729600,3256731647,FI -3256731648,3256732671,NO -3256732672,3256732927,IT -3256732928,3256733183,UA -3256733184,3256733439,FR -3256733440,3256733695,DK -3256733696,3256735743,TR -3256735744,3256737791,GB -3256737792,3256745983,DE -3256745984,3256778751,ES -3256778752,3256786943,CY -3256786944,3256787199,NL -3256787456,3256787711,DE -3256787712,3256787967,UA -3256787968,3256788223,PL -3256788480,3256788735,GB -3256788736,3256788991,DE -3256788992,3256789247,RO -3256789248,3256789503,SE -3256789504,3256789759,UA -3256789760,3256790015,GB -3256790016,3256790271,UA -3256790272,3256790783,DE -3256790784,3256791039,NL -3256791552,3256791807,GR -3256791808,3256792063,PL -3256792064,3256792319,DE -3256792320,3256792575,CH -3256792576,3256792831,NL -3256793088,3256793343,GB -3256793344,3256793599,DE -3256793600,3256793855,GB -3256793856,3256794111,SK -3256794112,3256794367,NL -3256794368,3256794623,GB -3256794624,3256794879,RU -3256794880,3256795135,AT -3256795136,3256811519,GR -3256811520,3256819711,DE -3256819712,3256821503,PL -3256821504,3256821759,NO -3256821760,3256822271,PL -3256822272,3256822527,MD -3256822528,3256822783,PL -3256822784,3256823807,UA -3256823808,3256824319,PL -3256824320,3256824831,GB -3256825856,3256826111,EE -3256826112,3256826367,KW -3256826368,3256826623,IL -3256826624,3256826879,RU -3256826880,3256827135,PL -3256827136,3256827391,IS -3256827392,3256827647,GB -3256827648,3256827903,PL -3256827904,3256844287,DE -3256860672,3256863743,DE -3256864256,3256864511,DE -3256864512,3256864767,CH -3256864768,3256870911,DE -3256870912,3256871167,RU -3256871168,3256871935,DE -3256872448,3256872703,DE -3256872960,3256875007,DE -3256875008,3256875519,UA -3256875520,3256876031,RU -3256876032,3256876287,PL -3256876288,3256876543,RU -3256876544,3256876799,CH -3256877056,3256897535,GB -3256898048,3256898303,GB -3256898560,3256899071,TR -3256899072,3256899583,RU -3256915456,3256915711,RS -3256915712,3256915967,SE -3256918016,3256934399,GB -3256942592,3256944639,GB -3256945408,3256945663,GB -3256945664,3256945919,SI -3256945920,3256946175,GB -3256946176,3256946431,RO -3256946432,3256946687,UA -3256946688,3256947711,DE -3256948736,3256950015,GB -3256950272,3256950527,NO -3256950528,3256958975,GB -3256958976,3256959999,RO -3256960000,3256960255,SA -3256960256,3256960511,HU -3256960512,3256961023,SA -3256961024,3256962559,PL -3256962560,3256962815,FR -3256962816,3256963071,RU -3256963072,3256963327,SE -3256963328,3256963839,RU -3256963840,3256964095,PL -3256964096,3256965119,RU -3256966144,3256967167,RU -3256967168,3256967423,LT -3256967424,3256967679,RU -3256967680,3256968191,CH -3256968192,3256969215,RO -3256969216,3256970239,IR -3256970240,3256970495,AT -3256970496,3256970751,GB -3256970752,3256971007,RU -3256971008,3256971263,PL -3256971264,3256971775,NL -3256971776,3256972031,RU -3256972032,3256972287,DE -3256972288,3256973311,PL -3256973312,3256973823,DE -3256973824,3256975359,IR -3256975360,3256988671,GB -3256988672,3256988927,RU -3256988928,3256989183,UA -3256989440,3256989695,GB -3256989696,3256989951,HU -3256989952,3256990207,PL -3256990208,3256990463,CH -3256990464,3256990719,PL -3256990720,3256991231,UA -3256991232,3256991487,SE -3256991488,3256991743,RU -3256991744,3257011199,GB -3257011200,3257011455,BG -3257011456,3257024511,GB -3257024512,3257032703,AU -3257036800,3257057279,GB -3257058816,3257059071,PL -3257060352,3257065471,GB -3257073664,3257081855,GB -3257090048,3257092351,GB -3257092608,3257092863,RO -3257093888,3257098239,GB -3257106432,3257118719,GB -3257120512,3257120767,GB -3257121280,3257121535,GB -3257122304,3257122559,GB -3257122560,3257122815,US -3257122816,3257139199,GB -3257139200,3257139455,DK -3257139456,3257143295,GB -3257143296,3257143807,RU -3257143808,3257144063,DE -3257144064,3257144319,RU -3257144320,3257144575,DE -3257144576,3257144831,GB -3257144832,3257145087,FR -3257145088,3257145343,GB -3257151488,3257180159,GB -3257180160,3257180415,TR -3257180416,3257180671,RU -3257180672,3257180927,EE -3257180928,3257181183,GB -3257181184,3257181439,SA -3257181440,3257181695,PL -3257181696,3257181951,FR -3257182208,3257182463,PL -3257192448,3257196543,GB -3257196544,3257200639,LU -3257200640,3257204735,GB -3257204736,3257225215,AT -3257226240,3257227263,DE -3257229312,3257268223,AT -3257268224,3257268479,UA -3257268480,3257268735,SE -3257269248,3257269503,IT -3257269504,3257269759,AT -3257270016,3257270271,DE -3257286656,3257294847,CH -3257294848,3257303039,HU -3257303040,3257311231,PT -3257311232,3257335807,CH -3257335808,3257352191,DE -3257354240,3257356799,DE -3257357312,3257357567,PT -3257357568,3257357823,SI -3257357824,3257371903,DE -3257371904,3257372159,BE -3257372416,3257372671,GB -3257372672,3257401343,DE -3257401344,3257453567,CH -3257453568,3257454591,RO -3257454592,3257455103,IT -3257455104,3257455359,RO -3257455360,3257455615,SI -3257455616,3257466879,CH -3257466880,3257467135,DE -3257467392,3257467903,SE -3257467904,3257468927,IT -3257469184,3257469439,IT -3257469952,3257470975,PL -3257470976,3257471999,GB -3257472000,3257472511,SG -3257472512,3257475071,GB -3257476864,3257477119,DE -3257481472,3257481727,DE -3257482240,3257482751,GB -3257482752,3257483007,NL -3257483008,3257491455,CH -3257491456,3257495551,BE -3257499648,3257532415,CH -3257532416,3257542655,CY -3257542656,3257542911,PL -3257542912,3257543423,IT -3257543424,3257543679,PT -3257543680,3257544191,RO -3257544192,3257544703,DE -3257544704,3257544959,CH -3257544960,3257545215,DK -3257545216,3257546495,GR -3257546496,3257546527,DE -3257546528,3257546655,CY -3257546656,3257546687,SE -3257546688,3257546719,DE -3257546720,3257546751,DK -3257546752,3257548799,FI -3257548800,3257551623,GB -3257551624,3257551647,BE -3257551648,3257551711,GB -3257551712,3257551719,BE -3257551720,3257551807,GB -3257551808,3257551871,BE -3257551872,3257552732,GB -3257552733,3257552733,SE -3257552734,3257556991,GB -3257557504,3257558015,LU -3257558016,3257559039,RO -3257559552,3257560063,UA -3257560064,3257560575,DE -3257560576,3257561087,PL -3257561088,3257561599,UA -3257561600,3257562111,DE -3257562112,3257563647,PL -3257563648,3257564159,NL -3257564160,3257564671,GB -3257564672,3257565183,RO -3257565184,3257573375,CY -3257573376,3257574143,CH -3257577472,3257581567,DE -3257581568,3257585663,UA -3257585664,3257586175,BE -3257586176,3257586687,NL -3257586688,3257586943,LU -3257586944,3257587455,ES -3257587456,3257587711,GB -3257587712,3257587967,US -3257587968,3257588223,FR -3257588224,3257588735,BE -3257588736,3257589759,NL -3257589760,3257663487,GB -3257663488,3257729023,UA -3257729024,3257730047,DE -3257730048,3257730559,NL -3257730560,3257731071,DE -3257731072,3257734143,NL -3257734144,3257734911,DE -3257734912,3257735679,NL -3257735680,3257736191,DE -3257736192,3257737471,NL -3257737472,3257738751,DE -3257738752,3257740543,NL -3257740544,3257740799,DE -3257740800,3257741055,FR -3257741056,3257741311,NL -3257741312,3257741567,DE -3257741568,3257741823,NL -3257741824,3257743615,DE -3257743616,3257747199,NL -3257747200,3257747455,DE -3257747456,3257748479,NL -3257748480,3257749503,DE -3257749504,3257753087,NL -3257753088,3257756415,DE -3257756416,3257761279,NL -3257761280,3257761791,DE -3257761792,3257763583,NL -3257763584,3257763839,DE -3257763840,3257765375,NL -3257765376,3257768703,DE -3257768704,3257771263,NL -3257771264,3257772543,DE -3257772544,3257775359,NL -3257775360,3257775615,DE -3257775616,3257776127,NL -3257776128,3257776383,DE -3257776384,3257779199,NL -3257779200,3257780479,DE -3257780480,3257782271,NL -3257782272,3257784831,DE -3257784832,3257787135,NL -3257787136,3257787391,DE -3257787392,3257788415,NL -3257788416,3257789951,DE -3257789952,3257794559,NL -3257794560,3257843711,GB -3257843712,3257860095,IE -3257860096,3257925631,SE -3257925632,3257925887,AT -3257925888,3257926143,SE -3257926144,3257926399,AT -3257926656,3257974783,AT -3257975296,3257975807,DE -3257975808,3257977855,AT -3257977856,3257978111,GB -3257978112,3257978367,SE -3257978368,3257978623,BG -3257978624,3257978879,ES -3257978880,3257979135,CZ -3257979136,3257979391,UA -3257979392,3257979647,GB -3257979904,3257980159,UA -3257980160,3257980415,SE -3257980416,3257980671,NL -3257980672,3257980927,CH -3257980928,3257981183,PL -3257981184,3257981439,GB -3257981440,3257981695,RU -3257981696,3257981951,PL -3257986048,3257987327,AT -3257987328,3257987583,CZ -3257987840,3257988095,AT -3257990656,3257990911,AT -3257992960,3257993215,DE -3257996032,3257996287,DE -3257996544,3257996799,CH -3257996800,3258003967,DE -3258003968,3258004479,RU -3258004992,3258005247,DE -3258006528,3258015743,DE -3258019328,3258019583,DE -3258019840,3258021887,DE -3258021888,3258022911,RU -3258022912,3258023167,PL -3258023168,3258023423,DE -3258023424,3258023679,TR -3258023680,3258023935,RU -3258023936,3258056703,DE -3258057216,3258057471,CZ -3258058240,3258058495,RU -3258059008,3258059263,UA -3258059264,3258059519,RU -3258059520,3258059775,RO -3258062848,3258063103,RU -3258063360,3258063871,CZ -3258063872,3258064127,AT -3258064128,3258064383,FR -3258064384,3258065151,GB -3258065152,3258065407,DE -3258065408,3258065663,CH -3258065664,3258065919,SA -3258065920,3258066175,DE -3258066176,3258066431,PL -3258066432,3258066943,FR -3258066944,3258067199,DK -3258067200,3258067455,GB -3258067456,3258067967,GR -3258067968,3258068223,RO -3258068224,3258068479,CH -3258068736,3258068991,DE -3258069248,3258069503,PL -3258069504,3258069759,RO -3258069760,3258070015,UA -3258070272,3258070527,PL -3258070528,3258071295,GB -3258071296,3258071551,DK -3258071552,3258071807,DE -3258072064,3258072319,FR -3258072320,3258072575,PL -3258072576,3258072831,BE -3258072832,3258073087,RO -3258073088,3258074111,CZ -3258074112,3258074879,DE -3258074880,3258075135,IL -3258075904,3258076159,PL -3258076160,3258076415,BG -3258076416,3258076927,FR -3258076928,3258077183,UA -3258077184,3258077439,GB -3258077440,3258077695,UA -3258077952,3258078207,PL -3258078208,3258078463,TR -3258078464,3258078719,UA -3258078720,3258078975,GB -3258078976,3258079231,RU -3258079232,3258079487,GB -3258079488,3258079743,PL -3258079744,3258079999,GB -3258080000,3258080255,BE -3258080512,3258080767,DE -3258081024,3258081279,FR -3258081280,3258081535,NL -3258081536,3258081791,BE -3258081792,3258082047,UA -3258082304,3258082559,CZ -3258082560,3258082815,HU -3258082816,3258083071,NL -3258083072,3258083583,RU -3258083584,3258083839,LV -3258083840,3258084351,SE -3258084352,3258084607,GB -3258084608,3258084863,AT -3258084864,3258085119,PL -3258085376,3258085631,NL -3258085632,3258085887,DE -3258085888,3258086143,PA -3258086144,3258086399,AT -3258086656,3258086911,PL -3258086912,3258087167,GB -3258087168,3258087423,UA -3258087424,3258087679,RU -3258087680,3258087935,GB -3258087936,3258088191,BG -3258088192,3258088447,PL -3258088448,3258088703,BE -3258088704,3258088959,UA -3258088960,3258089215,RO -3258089216,3258089471,FR -3258089472,3258090495,RU -3258090496,3258091519,PL -3258091520,3258092287,SI -3258092288,3258092543,RU -3258092544,3258092799,SE -3258092800,3258093567,RU -3258093568,3258094591,UA -3258094592,3258095359,RU -3258095360,3258095615,AT -3258095616,3258095871,RU -3258095872,3258096383,GB -3258096384,3258097663,PL -3258097664,3258097919,DE -3258097920,3258098175,UA -3258098176,3258098431,DE -3258098432,3258098687,NL -3258098688,3258098943,DE -3258098944,3258099199,GB -3258099200,3258099455,SI -3258099456,3258099711,UA -3258099712,3258099967,FI -3258099968,3258100223,UA -3258100736,3258100991,CH -3258100992,3258101247,AT -3258101248,3258101503,RO -3258101504,3258101759,IL -3258101760,3258102015,CH -3258102016,3258102271,BE -3258102272,3258102527,CH -3258102528,3258102783,TR -3258103040,3258103295,SE -3258103296,3258103551,DE -3258103552,3258103807,AE -3258104320,3258104575,PL -3258104576,3258104831,DE -3258105600,3258105855,DE -3258107904,3258109951,CZ -3258109952,3258110207,DK -3258110464,3258110975,CZ -3258111488,3258111743,PL -3258111744,3258118399,CZ -3258118400,3258118655,UA -3258118656,3258118911,CZ -3258120192,3258120703,CZ -3258121216,3258121471,PL -3258121728,3258121983,UA -3258121984,3258122239,RU -3258122240,3258187775,FR -3258187776,3258230783,SE -3258230784,3258232831,NO -3258232832,3258249215,SE -3258249216,3258253311,NO -3258253312,3258265599,NL -3258267648,3258268671,NL -3258268672,3258268927,IT -3258269184,3258269695,NL -3258271744,3258272767,NL -3258272768,3258273791,FR -3258273792,3258288127,NL -3258294272,3258297343,NL -3258297344,3258297599,BE -3258297600,3258298111,NL -3258298112,3258298367,GB -3258302464,3258318847,NL -3258318848,3258320895,DE -3258320896,3258321919,GB -3258321920,3258322943,RU -3258322944,3258326015,PL -3258326016,3258327039,SE -3258327040,3258335231,TR -3258335232,3258336255,RU -3258336256,3258337279,NO -3258337280,3258338303,DE -3258339328,3258340351,UA -3258340352,3258341375,PL -3258341376,3258342399,UA -3258342400,3258343423,DE -3258343424,3258351615,NO -3258351616,3258352639,RO -3258352640,3258353663,RU -3258354688,3258355711,BG -3258355712,3258356735,NL -3258356736,3258357759,RU -3258357760,3258360831,UA -3258360832,3258361855,SE -3258361856,3258362879,IL -3258362880,3258362891,IM -3258362892,3258362892,GB -3258362893,3258363903,IM -3258363904,3258364927,RU -3258364928,3258365951,RS -3258365952,3258366975,UA -3258366976,3258367999,PL -3258368000,3258384383,KW -3258384384,3258426367,DE -3258427648,3258427903,RO -3258427904,3258428159,DE -3258428416,3258449919,DE -3258449920,3258486783,CH -3258486784,3258487807,LI -3258488832,3258499071,CH -3258501120,3258503935,CH -3258503936,3258504191,PL -3258504704,3258504959,DE -3258504960,3258505215,IL -3258505728,3258506495,CH -3258506496,3258506751,DE -3258508288,3258509311,CH -3258509568,3258509823,DE -3258509824,3258510079,CH -3258511360,3258515455,CH -3258515456,3258580991,FR -3258580992,3258587135,SY -3258587136,3258588159,US -3258588160,3258588927,ES -3258588928,3258589951,RU -3258589952,3258590207,ES -3258590208,3258593279,RU -3258593280,3258595327,SY -3258595328,3258597375,RU -3258597888,3258599423,RU -3258599424,3258600959,PS -3258600960,3258601471,RU -3258601472,3258601983,ES -3258601984,3258602495,RU -3258602496,3258603519,ES -3258603520,3258613759,RU -3258613760,3258619903,SY -3258619904,3258620415,PS -3258620416,3258620927,RU -3258620928,3258621951,SY -3258621952,3258630143,RU -3258630144,3258634239,SE -3258634240,3258636287,SY -3258636288,3258637311,US -3258637312,3258637823,PS -3258637824,3258638335,RU -3258638336,3258642431,SY -3258642432,3258642687,PS -3258642688,3258642943,RU -3258642944,3258643967,PS -3258643968,3258644223,RU -3258644224,3258644479,PS -3258644480,3258646527,SY -3258646528,3258685439,DE -3258685440,3258685695,CH -3258685696,3258691583,DE -3258691840,3258692351,AT -3258692352,3258692607,DE -3258692608,3258692863,FR -3258693120,3258693375,SI -3258693376,3258693631,DE -3258693632,3258693887,RU -3258693888,3258694143,SI -3258694144,3258694399,RU -3258694656,3258694911,GB -3258694912,3258712063,DE -3258712064,3258728447,GB -3258728448,3258729471,FR -3258729472,3258729727,DE -3258729728,3258729983,UA -3258729984,3258730239,CH -3258730240,3258730495,NL -3258730496,3258730751,RO -3258730752,3258731007,TR -3258731008,3258731263,SI -3258731264,3258731519,NO -3258731776,3258732031,UA -3258732032,3258732287,DE -3258732288,3258732543,PL -3258732544,3258732799,SE -3258732800,3258733055,CH -3258733056,3258733311,RO -3258733312,3258734079,GB -3258734592,3258762239,GB -3258764032,3258764287,GB -3258764288,3258764543,DE -3258764800,3258765055,BE -3258765056,3258765311,NL -3258767360,3258767615,GB -3258767616,3258767871,CH -3258767872,3258769919,GB -3258769920,3258770431,PL -3258770432,3258771455,IR -3258771456,3258772479,KZ -3258772480,3258773503,RU -3258773504,3258774015,FR -3258774016,3258774271,RU -3258774272,3258774527,DK -3258774528,3258776063,RU -3258776064,3258776319,GE -3258776320,3258776575,PL -3258776576,3258777599,UA -3258789888,3258790911,CZ -3258790912,3258792191,RU -3258792192,3258792447,PL -3258792448,3258792703,MK -3258792704,3258792959,NL -3258792960,3258793983,RU -3258793984,3258794495,NL -3258794496,3258794751,PL -3258794752,3258795007,RU -3258795008,3258796031,PL -3258797568,3258798079,GB -3258801152,3258802175,GB -3258802176,3258806271,LU -3258808832,3258809343,GB -3258814464,3258816511,GB -3258818048,3258818303,SE -3258818560,3258843135,GB -3258843136,3258843391,RU -3258844928,3258847231,GB -3258848256,3258848767,GB -3258848768,3258849023,RO -3258849024,3258849279,DE -3258849280,3258859519,GB -3258859520,3258859775,BY -3258859776,3258860031,GB -3258860544,3258900479,GB -3258902528,3258902783,GB -3258903040,3258903295,FR -3258903296,3258903551,GB -3258903552,3258903807,DE -3258903808,3258904063,AT -3258904064,3258904575,GB -3258908672,3258941439,GB -3258941440,3258943487,PL -3258943488,3258944511,BG -3258944512,3258945535,RU -3258946560,3258947583,CH -3258948608,3258949631,RU -3258949632,3258972159,GR -3258972160,3258974207,NO -3258974208,3259039743,DE -3259039744,3259105279,PT -3259105280,3259170815,GB -3259170816,3259236351,RU -3259236352,3259237887,SE -3259237888,3259238143,FR -3259238144,3259243007,SE -3259243008,3259243519,AT -3259243520,3259244543,US -3259244544,3259246591,SE -3259246592,3259247615,IT -3259247616,3259247871,RO -3259247872,3259248127,SE -3259248128,3259248383,GB -3259248384,3259248895,SE -3259248896,3259249151,GB -3259249152,3259258623,SE -3259258624,3259258879,ES -3259258880,3259260927,SE -3259260928,3259261183,DK -3259261184,3259262719,SE -3259262720,3259262975,DK -3259262976,3259265023,SE -3259265024,3259265535,DE -3259265536,3259269375,SE -3259269376,3259269631,FR -3259269632,3259276287,SE -3259276288,3259276543,ES -3259276544,3259278591,SE -3259278592,3259278847,GB -3259278848,3259280639,SE -3259280640,3259280895,US -3259280896,3259281407,SE -3259281408,3259282431,US -3259282432,3259283711,SE -3259283712,3259283967,US -3259283968,3259284479,SE -3259284480,3259284735,US -3259284736,3259285759,SE -3259285760,3259286015,GB -3259286016,3259290623,SE -3259290624,3259290879,NO -3259290880,3259291135,US -3259291136,3259292415,SE -3259292416,3259292671,IT -3259292672,3259293951,SE -3259293952,3259294207,BG -3259294208,3259297535,SE -3259297536,3259297791,GB -3259297792,3259301887,SE -3259301888,3259302143,DE -3259302144,3259302399,AE -3259302400,3259303423,CH -3259303424,3259305983,SE -3259305984,3259310079,NL -3259311104,3259311615,DE -3259312640,3259313151,GB -3259317248,3259318271,CH -3259318272,3259318343,GB -3259318344,3259318351,FR -3259318352,3259318599,GB -3259318600,3259318607,AT -3259318608,3259318663,GB -3259318664,3259318671,DK -3259318672,3259318679,GB -3259318680,3259318687,IT -3259318688,3259318727,GB -3259318728,3259318735,FR -3259318736,3259319055,GB -3259319056,3259319071,IT -3259319072,3259319087,GB -3259319088,3259319095,SE -3259319096,3259319103,DK -3259319104,3259319111,FR -3259319112,3259319199,GB -3259319200,3259319215,DE -3259319216,3259319255,GB -3259319256,3259319263,DK -3259319264,3259319287,GB -3259319288,3259319295,BE -3259319296,3259319303,GB -3259319304,3259319311,BE -3259319312,3259319319,DK -3259319320,3259319367,GB -3259319368,3259319375,BE -3259319376,3259319407,GB -3259319408,3259319423,LU -3259319424,3259319439,GB -3259319440,3259319447,CH -3259319448,3259319463,GB -3259319464,3259319471,DK -3259319472,3259319587,GB -3259319588,3259319591,NL -3259319592,3259319663,GB -3259319664,3259319667,FR -3259319668,3259319823,GB -3259319824,3259319831,FR -3259319832,3259319879,GB -3259319880,3259319887,BY -3259319888,3259319987,GB -3259319988,3259319991,NL -3259319992,3259320011,GB -3259320012,3259320015,BE -3259320016,3259320055,GB -3259320056,3259320063,AT -3259320064,3259320575,GB -3259320576,3259320583,FR -3259320584,3259326975,GB -3259326976,3259327487,IE -3259327488,3259328190,GB -3259328191,3259328191,US -3259328192,3259328511,GB -3259328512,3259328703,EE -3259328704,3259328799,GB -3259328800,3259328863,EE -3259328864,3259334495,GB -3259334496,3259334527,IE -3259334528,3259334543,GB -3259334544,3259334551,IE -3259334552,3259334655,GB -3259334656,3259338751,DE -3259338752,3259339007,GB -3259340800,3259341823,GB -3259342848,3259344895,CH -3259347200,3259347455,DE -3259347456,3259347711,CH -3259348224,3259348479,CH -3259348736,3259348991,CH -3259348992,3259351039,NL -3259351040,3259351551,IT -3259351552,3259352063,FR -3259352064,3259352575,CH -3259352576,3259353087,IE -3259354112,3259354367,NL -3259354368,3259354623,DE -3259354880,3259355135,PL -3259355136,3259359231,NO -3259359232,3259367423,ES -3259367424,3259432959,GB -3259432960,3259435263,SE -3259435264,3259435519,IT -3259435520,3259438079,SE -3259438080,3259438335,ES -3259438336,3259438591,SE -3259438592,3259439103,NO -3259439104,3259457279,SE -3259457280,3259457535,IT -3259457536,3259466239,SE -3259466240,3259466495,HU -3259466496,3259469823,SE -3259469824,3259470335,AX -3259470336,3259470847,SE -3259470848,3259471871,US -3259471872,3259479807,SE -3259479808,3259480063,DK -3259480064,3259480831,SE -3259480832,3259481087,ES -3259481088,3259484671,SE -3259484672,3259485183,ES -3259485184,3259490303,SE -3259490304,3259490559,IN -3259490560,3259490815,NL -3259490816,3259491071,SE -3259491072,3259491327,BE -3259491328,3259495935,SE -3259495936,3259496447,DK -3259496448,3259498495,SE -3259498496,3259541503,GB -3259541504,3259543551,NL -3259543552,3259760639,GB -3259760640,3259811839,DE -3259813888,3259814399,DE -3259814400,3259814655,AT -3259814656,3259817983,DE -3259819008,3259821055,DE -3259821824,3259822079,AT -3259822592,3259823103,DE -3259823104,3259823615,RO -3259823616,3259823871,NO -3259823872,3259824127,IE -3259825408,3259825663,DE -3259826176,3259891711,DE -3259891712,3259957247,BE -3259957248,3259958271,DE -3259958272,3259959295,RU -3259959296,3259960319,UA -3259960320,3259961343,BG -3259961344,3259962367,FI -3259962368,3259963391,UA -3259963392,3259964415,PL -3259964416,3259965023,GB -3259965024,3259965031,DE -3259965032,3259965439,GB -3259965440,3259966463,RU -3259967488,3259968511,RS -3259968512,3259969535,RU -3259970560,3259971583,CZ -3259971584,3259972607,IT -3259972608,3259973631,UA -3259973632,3259981823,PT -3259981824,3259990015,EG -3259990016,3260006399,FR -3260006400,3260014591,IT -3260014592,3260018687,NL -3260018688,3260019711,GB -3260019712,3260021247,DE -3260021248,3260021759,RU -3260021760,3260022271,GR -3260022272,3260022783,NL -3260022784,3260284927,GB -3260284928,3260415487,RU -3260415488,3260415999,BY -3260416000,3260481535,FI -3260481536,3260503039,RU -3260503040,3260504063,US -3260504064,3260506367,RU -3260506368,3260506623,CH -3260506624,3260509439,RU -3260509440,3260509695,CH -3260509696,3260547071,RU -3260547072,3260547327,DE -3260547328,3260547583,UA -3260547584,3260547839,NL -3260547840,3260548095,PL -3260548096,3260548351,IE -3260548352,3260548607,DK -3260549120,3260549375,AT -3260549376,3260549631,CH -3260549632,3260549887,DE -3260550656,3260551167,RU -3260551168,3260553983,DE -3260553984,3260554239,GB -3260554240,3260555263,CH -3260555264,3260563455,HU -3260563456,3260571647,GB -3260571648,3260573695,US -3260573696,3260574719,NL -3260574720,3260575743,IL -3260575744,3260579327,US -3260579328,3260579583,CA -3260579584,3260579839,US -3260579840,3260580351,PL -3260580352,3260580863,HU -3260580864,3260581375,GB -3260581376,3260581887,RO -3260581888,3260582399,IL -3260582400,3260583423,RU -3260583424,3260583679,GB -3260583680,3260583935,IT -3260583936,3260584447,NO -3260584448,3260585471,RO -3260585472,3260586495,UA -3260586496,3260587007,PL -3260587008,3260587519,FR -3260587520,3260588031,PL -3260588032,3260596223,DE -3260596224,3260596735,CH -3260596736,3260597247,SK -3260597248,3260597759,CH -3260597760,3260598271,DE -3260598272,3260598783,RU -3260598784,3260599295,RO -3260599296,3260599807,RU -3260599808,3260600319,UA -3260600320,3260601343,RU -3260601344,3260601855,CH -3260601856,3260602367,PL -3260602368,3260602879,DK -3260602880,3260603903,UA -3260603904,3260604415,FR -3260604416,3260604927,PL -3260605440,3260605951,BG -3260605952,3260606463,NL -3260606464,3260607487,SE -3260607488,3260607999,NL -3260608000,3260608511,RO -3260608512,3260609023,IE -3260609024,3260609535,GB -3260609536,3260610047,PL -3260610048,3260610559,FR -3260610560,3260611071,RO -3260611072,3260611583,BG -3260612096,3260612607,SE -3260612608,3260678143,FI -3260678144,3260743679,IL -3260743680,3260809215,JP -3260809216,3260874751,PL -3260893184,3260894207,SE -3260894208,3260895231,AT -3260895232,3260898303,SE -3260898304,3260899327,ES -3260899328,3260900095,CH -3260900096,3260900351,RU -3260900352,3260900607,RO -3260900608,3260901119,NL -3260901120,3260903423,DE -3260903424,3260906239,CH -3260906368,3260906495,DE -3260906496,3260907519,PL -3260907520,3260915711,GB -3260915712,3260923903,UA -3260923904,3260938751,IT -3260938752,3260939007,US -3260939008,3260940287,IT -3260940288,3261071359,DE -3261071360,3261136895,AT -3261136896,3261150143,DE -3261150144,3261150207,US -3261150208,3261202431,DE -3261202432,3261213439,FR -3261213440,3261213695,AF -3261213696,3261267967,FR -3261267968,3261296639,DE -3261296896,3261297151,DE -3261297664,3261297919,RU -3261297920,3261298175,PL -3261298176,3261333503,DE -3261333504,3261399039,FI -3261399040,3261472767,GB -3261472768,3261503487,RO -3261503488,3261503935,MD -3261503936,3261530111,RO -3261530112,3261531903,SE -3261531904,3261532159,GB -3261532160,3261532415,SE -3261532416,3261532671,GB -3261532672,3261532927,SE -3261532928,3261533183,GB -3261533184,3261533439,SE -3261533440,3261533695,US -3261533696,3261534719,SE -3261534720,3261534975,US -3261534976,3261538559,SE -3261538560,3261538815,GB -3261538816,3261539327,SE -3261539328,3261540351,GB -3261540352,3261555455,SE -3261555456,3261555711,DK -3261555712,3261570303,SE -3261570304,3261570559,IT -3261570560,3261595647,SE -3261595648,3261661183,NL -3261661184,3261669375,RO -3261669376,3261673471,MT -3261673472,3261675519,IT -3261675520,3261675775,LV -3261675776,3261676031,IT -3261676800,3261677055,IT -3261677568,3261685759,GB -3261685760,3261687807,DE -3261687808,3261689855,RO -3261689856,3261691903,GB -3261691904,3261694463,NL -3261694464,3261694975,RU -3261694976,3261695487,PL -3261695488,3261695999,GB -3261696000,3261696511,UA -3261696512,3261697023,NL -3261697024,3261698047,RO -3261698048,3261698559,UA -3261698560,3261699071,DE -3261699072,3261699327,RU -3261699328,3261699583,GB -3261699584,3261700095,NL -3261700096,3261700607,FR -3261700608,3261701119,GB -3261701120,3261701631,RU -3261702144,3261710335,GB -3261710336,3261718527,RU -3261718528,3261726719,IS -3261726720,3261734911,ES -3261734912,3261743103,GB -3261743104,3261751295,MT -3261751296,3261759487,EE -3261759488,3261767679,IE -3261767680,3261775871,RS -3261775872,3261776383,PL -3261776384,3261776895,RU -3261777408,3261777449,GB -3261777450,3261777451,NL -3261777452,3261777919,GB -3261777920,3261778943,PL -3261778944,3261779455,RO -3261779456,3261779967,DE -3261779968,3261780479,UA -3261780480,3261780991,PL -3261780992,3261781503,RO -3261781504,3261782015,PL -3261782016,3261783039,UA -3261783040,3261784063,GB -3261784064,3261796351,AT -3261796352,3261796607,GB -3261796608,3261796863,RU -3261796864,3261797119,PL -3261797120,3261797375,KR -3261797376,3261797631,AT -3261797632,3261797887,RU -3261797888,3261798143,TR -3261798144,3261798399,RU -3261798400,3261805567,AT -3261805568,3261806591,DE -3261806592,3261810687,AT -3261812736,3261812991,RU -3261812992,3261815807,AT -3261816064,3261816575,AT -3261816576,3261816831,DE -3261816832,3261820927,AT -3261820928,3261821183,RO -3261821184,3261821439,AT -3261821440,3261821695,NL -3261821696,3261821951,UA -3261821952,3261822207,RU -3261822208,3261822463,UA -3261822464,3261822719,GB -3261822720,3261822975,SE -3261822976,3261823231,PL -3261823232,3261823487,NL -3261823488,3261823743,RO -3261823744,3261823999,BE -3261824000,3261824255,RU -3261824512,3261824767,FR -3261824768,3261825023,PT -3261825024,3261857791,AT -3261857792,3261923327,CZ -3261923328,3261988863,NL -3261988864,3261989119,SE -3261990400,3261990655,UA -3261993472,3261993727,RU -3261994752,3261995263,FI -3261995264,3261995519,DE -3261995520,3261995775,PL -3261996800,3262005247,FI -3262005248,3262005759,PL -3262005760,3262006015,RU -3262006016,3262006271,NL -3262006272,3262006527,RO -3262006528,3262006783,FR -3262006784,3262007039,SE -3262007040,3262007295,IT -3262007552,3262007807,GR -3262008064,3262008319,GB -3262008320,3262008575,PT -3262008576,3262008831,PL -3262008832,3262009087,AT -3262009088,3262009343,UA -3262013440,3262017535,SE -3262018560,3262018815,PL -3262021120,3262021375,UA -3262021376,3262021631,PL -3262021632,3262021887,CH -3262021888,3262022143,UA -3262022912,3262023167,DE -3262023680,3262023935,DK -3262025216,3262025471,FI -3262027264,3262027519,TR -3262027520,3262027775,BE -3262027776,3262028287,RU -3262028288,3262028543,FR -3262028544,3262028799,AE -3262028800,3262029823,DE -3262029824,3262030847,NL -3262030848,3262031871,FR -3262033920,3262034434,FI -3262034435,3262034435,AX -3262034436,3262034511,FI -3262034512,3262034519,AX -3262034520,3262034943,FI -3262034944,3262035199,AX -3262035200,3262036991,FI -3262036992,3262038015,AX -3262038016,3262038271,FR -3262038528,3262038783,IL -3262038784,3262039039,NO -3262039040,3262039295,DE -3262039296,3262039551,GB -3262039552,3262039807,GR -3262039808,3262040063,SI -3262040320,3262040575,ES -3262040576,3262040831,RU -3262040832,3262041343,GB -3262041344,3262041599,BG -3262041600,3262041855,DK -3262041856,3262042367,FR -3262042368,3262042623,GB -3262042880,3262043135,NL -3262043136,3262043391,RO -3262043392,3262043647,TR -3262043648,3262043903,NL -3262043904,3262044159,GB -3262044160,3262044415,RS -3262044416,3262044671,LU -3262044672,3262044927,GR -3262044928,3262045183,UA -3262045184,3262045439,LT -3262045440,3262045695,NL -3262045696,3262045951,SI -3262045952,3262046207,RU -3262046208,3262049279,FI -3262049280,3262049535,JO -3262049536,3262049791,GB -3262049792,3262050559,PL -3262050560,3262051583,GB -3262051584,3262051839,FR -3262052608,3262052863,IL -3262052864,3262053119,GB -3262053120,3262053375,RU -3262053376,3262053631,UA -3262053632,3262053887,RU -3262054144,3262054399,RU -3262054400,3262122143,FI -3262122144,3262122147,AX -3262122148,3262122175,FI -3262122176,3262122183,SE -3262122184,3262122751,FI -3262122752,3262122815,AX -3262122816,3262124031,FI -3262124032,3262128127,DE -3262128128,3262136319,GB -3262137600,3262137855,DE -3262139392,3262140415,GB -3262140416,3262140671,DE -3262141184,3262141439,DE -3262141440,3262142463,ES -3262142464,3262142719,DE -3262143488,3262143743,GB -3262144000,3262144047,DE -3262145024,3262145279,DE -3262145552,3262145567,DE -3262145616,3262145631,DE -3262146048,3262146815,DE -3262147584,3262147839,DE -3262148608,3262148863,DE -3262148880,3262148919,DE -3262148928,3262149119,DE -3262149120,3262149151,FR -3262149152,3262149159,DE -3262149168,3262149375,FR -3262149632,3262149887,DE -3262150912,3262151047,DE -3262151072,3262151103,DE -3262151136,3262151151,DE -3262151168,3262151423,DE -3262151936,3262152191,DE -3262152664,3262152671,DE -3262152704,3262185471,AT -3262185472,3262222335,DE -3262223360,3262223871,DE -3262224896,3262225151,AT -3262226432,3262227455,DE -3262227712,3262227967,RO -3262228480,3262228735,DE -3262229248,3262229503,NL -3262229760,3262230015,DE -3262230528,3262283775,DE -3262283776,3262284799,RU -3262284800,3262285823,UA -3262286848,3262287871,SE -3262287872,3262288127,MD -3262288128,3262288383,FR -3262288384,3262288895,IL -3262288896,3262289919,PL -3262289920,3262316543,SE -3262316544,3262382079,DE -3262382080,3262414847,IT -3262414848,3262415359,DE -3262415360,3262416895,PL -3262416896,3262417407,RO -3262417408,3262417919,PL -3262417920,3262418431,RU -3262418432,3262419455,FR -3262419456,3262419967,NL -3262419968,3262420479,FR -3262420480,3262420991,CH -3262420992,3262421503,ES -3262422016,3262422527,SE -3262422528,3262423039,AT -3262423040,3262423551,GB -3262423552,3262424063,RU -3262424064,3262424575,IT -3262424576,3262424831,PL -3262424832,3262425087,GB -3262425088,3262425343,GR -3262425344,3262425599,RU -3262425600,3262426111,UA -3262426624,3262427135,GB -3262427136,3262427647,FR -3262427648,3262428159,DK -3262428160,3262428671,CH -3262428672,3262429183,PL -3262429184,3262429695,ES -3262429696,3262430207,DE -3262430208,3262430719,EE -3262431232,3262431743,PL -3262431744,3262432255,UA -3262432256,3262432767,CH -3262432768,3262433279,GB -3262433280,3262433791,RO -3262433792,3262434303,FR -3262434304,3262434815,SI -3262434816,3262435839,DE -3262435840,3262436351,CH -3262436352,3262436863,SE -3262437888,3262438399,FR -3262438400,3262438911,NL -3262438912,3262439423,DK -3262439424,3262439935,AT -3262439936,3262440447,IL -3262440960,3262441471,IL -3262441472,3262441983,UA -3262441984,3262442495,DE -3262443008,3262443519,UA -3262443520,3262444031,ES -3262444032,3262444543,AT -3262444544,3262445055,GB -3262445056,3262445567,RO -3262446592,3262447103,PL -3262447104,3262447615,GB -3262447616,3262460415,PT -3262460544,3262460671,RU -3262460672,3262460927,AE -3262460928,3262461055,CY -3262461056,3262461183,DK -3262461312,3262461439,NO -3262461440,3262461567,DE -3262461568,3262461695,GB -3262461824,3262461951,RO -3262461952,3262463999,IQ -3262464000,3262472191,RU -3262472192,3262472207,DE -3262472208,3262472211,FR -3262472212,3262472215,DE -3262472216,3262472219,NL -3262472220,3262472223,AT -3262472224,3262472231,DE -3262472232,3262472235,AT -3262472236,3262472247,DE -3262472248,3262472251,IT -3262472252,3262472275,DE -3262472276,3262472279,BE -3262472280,3262472307,DE -3262472308,3262472311,ES -3262472312,3262472315,NL -3262472316,3262472351,DE -3262472352,3262472355,NL -3262472356,3262472363,DE -3262472364,3262472367,GB -3262472368,3262472371,NL -3262472372,3262472375,FR -3262472376,3262472379,GB -3262472380,3262472387,DE -3262472388,3262472391,FR -3262472392,3262472395,GB -3262472396,3262472399,DE -3262472400,3262472403,NL -3262472404,3262472415,DE -3262472416,3262472419,ES -3262472420,3262472423,DE -3262472424,3262472427,BE -3262472428,3262472459,DE -3262472460,3262472463,CH -3262472464,3262472479,DE -3262472480,3262472483,IT -3262472484,3262472495,DE -3262472496,3262472499,CH -3262472500,3262472511,DE -3262472512,3262472515,CA -3262472516,3262472519,GB -3262472520,3262472527,DE -3262472528,3262472531,CH -3262472532,3262472547,DE -3262472548,3262472551,NL -3262472552,3262472563,DE -3262472564,3262472567,DK -3262472568,3262472575,DE -3262472576,3262472579,CA -3262472580,3262472583,AT -3262472584,3262472591,US -3262472592,3262472603,DE -3262472604,3262472607,CH -3262472608,3262472615,US -3262472616,3262472631,DE -3262472632,3262472635,ES -3262472636,3262472655,DE -3262472656,3262472659,GB -3262472660,3262472679,DE -3262472680,3262472683,CL -3262472684,3262472687,US -3262472688,3262472695,DE -3262472696,3262472699,IT -3262472700,3262472703,AT -3262472704,3262472715,DE -3262472716,3262472727,NL -3262472728,3262472735,DE -3262472736,3262472739,IT -3262472740,3262472747,DE -3262472748,3262472751,GB -3262472752,3262472763,DE -3262472764,3262472767,CA -3262472768,3262472771,DE -3262472772,3262472775,US -3262472776,3262472779,DE -3262472780,3262472783,US -3262472784,3262472791,DE -3262472792,3262472795,GB -3262472796,3262472799,AT -3262472800,3262472819,DE -3262472820,3262472823,CH -3262472824,3262472835,DE -3262472836,3262472839,DK -3262472840,3262472843,DE -3262472844,3262472847,AT -3262472848,3262472851,DE -3262472852,3262472855,IT -3262472856,3262472859,FR -3262472860,3262472863,US -3262472864,3262472867,FR -3262472868,3262472871,GB -3262472872,3262472875,DE -3262472876,3262472879,FR -3262472880,3262472883,DE -3262472884,3262472887,CA -3262472888,3262472899,DE -3262472900,3262472903,AT -3262472904,3262472927,DE -3262472928,3262472931,NL -3262472932,3262472939,DE -3262472940,3262472943,CH -3262472944,3262472947,DE -3262472948,3262472951,LU -3262472952,3262472963,DE -3262472964,3262472967,AT -3262472968,3262472979,DE -3262472980,3262472983,AT -3262472984,3262472995,DE -3262472996,3262472999,FR -3262473000,3262473039,DE -3262473040,3262473043,GB -3262473044,3262473051,DE -3262473052,3262473055,AT -3262473056,3262473075,DE -3262473076,3262473079,GB -3262473080,3262473083,DE -3262473084,3262473087,US -3262473088,3262473091,NL -3262473092,3262473111,DE -3262473112,3262473115,ES -3262473116,3262473155,DE -3262473156,3262473159,IT -3262473160,3262473163,NL -3262473164,3262473167,CH -3262473168,3262473199,DE -3262473200,3262473203,ES -3262473204,3262473211,DE -3262473212,3262473215,FR -3262473216,3262473231,DE -3262473232,3262473239,JP -3262473240,3262473243,DE -3262473244,3262473247,JP -3262473248,3262473251,DE -3262473252,3262473255,JP -3262473256,3262473271,DE -3262473272,3262473283,JP -3262473284,3262473295,DE -3262473296,3262473299,JP -3262473300,3262473303,DE -3262473304,3262473315,JP -3262473316,3262473319,DE -3262473320,3262473323,JP -3262473324,3262473339,DE -3262473340,3262473347,JP -3262473348,3262473355,DE -3262473356,3262473371,JP -3262473372,3262473379,DE -3262473380,3262473383,JP -3262473384,3262473403,DE -3262473404,3262473415,JP -3262473416,3262473439,DE -3262473440,3262473443,JP -3262473444,3262473459,DE -3262473460,3262473467,JP -3262473468,3262473475,DE -3262473476,3262473476,US -3262473477,3262473482,DE -3262473483,3262473483,US -3262473484,3262473490,DE -3262473491,3262473491,US -3262473492,3262473492,DE -3262473493,3262473493,US -3262473494,3262473496,DE -3262473497,3262473497,US -3262473498,3262473499,DE -3262473500,3262473500,US -3262473501,3262473501,DE -3262473502,3262473502,US -3262473503,3262473503,DE -3262473504,3262473504,US -3262473505,3262473505,DE -3262473506,3262473506,US -3262473507,3262473511,DE -3262473512,3262473512,US -3262473513,3262473515,DE -3262473516,3262473516,US -3262473517,3262473517,CN -3262473518,3262473519,DE -3262473520,3262473523,US -3262473524,3262473527,DE -3262473528,3262473528,US -3262473529,3262473529,DE -3262473530,3262473532,US -3262473533,3262473535,DE -3262473536,3262473536,US -3262473537,3262473537,DE -3262473538,3262473538,US -3262473539,3262473544,DE -3262473545,3262473545,US -3262473546,3262473548,DE -3262473549,3262473549,CA -3262473550,3262473550,US -3262473551,3262473552,DE -3262473553,3262473554,US -3262473555,3262473560,DE -3262473561,3262473562,US -3262473563,3262473566,DE -3262473567,3262473567,US -3262473568,3262473572,DE -3262473573,3262473573,US -3262473574,3262473579,DE -3262473580,3262473581,US -3262473582,3262473587,DE -3262473588,3262473588,US -3262473589,3262473594,DE -3262473595,3262473595,US -3262473596,3262473596,DE -3262473597,3262473597,US -3262473598,3262473603,DE -3262473604,3262473604,US -3262473605,3262473607,DE -3262473608,3262473608,US -3262473609,3262473617,DE -3262473618,3262473618,US -3262473619,3262473628,DE -3262473629,3262473629,US -3262473630,3262473633,DE -3262473634,3262473634,US -3262473635,3262473643,DE -3262473644,3262473644,US -3262473645,3262473646,DE -3262473647,3262473647,US -3262473648,3262473651,DE -3262473652,3262473652,US -3262473653,3262473653,DE -3262473654,3262473654,US -3262473655,3262473659,DE -3262473660,3262473661,US -3262473662,3262473665,DE -3262473666,3262473667,US -3262473668,3262473669,DE -3262473670,3262473671,US -3262473672,3262473675,DE -3262473676,3262473677,US -3262473678,3262473680,DE -3262473681,3262473681,US -3262473682,3262473683,DE -3262473684,3262473686,US -3262473687,3262473691,DE -3262473692,3262473692,CA -3262473693,3262473731,DE -3262473732,3262473733,US -3262473734,3262473736,DE -3262473737,3262473737,US -3262473738,3262473742,DE -3262473743,3262473743,US -3262473744,3262473752,DE -3262473753,3262473753,US -3262473754,3262473754,DE -3262473755,3262473755,US -3262473756,3262473758,DE -3262473759,3262473759,US -3262473760,3262473765,DE -3262473766,3262473766,US -3262473767,3262473777,DE -3262473778,3262473778,US -3262473779,3262473780,DE -3262473781,3262473782,US -3262473783,3262473855,DE -3262473856,3262473859,US -3262473860,3262473903,DE -3262473904,3262473907,US -3262473908,3262473931,DE -3262473932,3262473935,US -3262473936,3262473963,DE -3262473964,3262473967,US -3262473968,3262473971,DE -3262473972,3262473975,US -3262473976,3262473985,DE -3262473986,3262473986,TW -3262473987,3262473987,DE -3262473988,3262473988,SG -3262473989,3262473989,IN -3262473990,3262473990,SG -3262473991,3262473991,DE -3262473992,3262473992,SG -3262473993,3262473993,IN -3262473994,3262473995,TW -3262473996,3262473996,MY -3262473997,3262473997,ID -3262473998,3262473998,DE -3262473999,3262473999,TW -3262474000,3262474000,SG -3262474001,3262474001,TW -3262474002,3262474002,DE -3262474003,3262474003,TW -3262474004,3262474004,SG -3262474005,3262474005,TW -3262474006,3262474007,SG -3262474008,3262474009,TW -3262474010,3262474010,SG -3262474011,3262474011,DE -3262474012,3262474013,SG -3262474014,3262474014,HK -3262474015,3262474016,SG -3262474017,3262474018,MY -3262474019,3262474024,SG -3262474025,3262474025,DE -3262474026,3262474026,SG -3262474027,3262474027,CN -3262474028,3262474030,SG -3262474031,3262474031,IN -3262474032,3262474032,MY -3262474033,3262474033,SG -3262474034,3262474034,MY -3262474035,3262474035,SG -3262474036,3262474036,MY -3262474037,3262474037,SG -3262474038,3262474038,MY -3262474039,3262474039,TW -3262474040,3262474041,MY -3262474042,3262474042,DE -3262474043,3262474043,SG -3262474044,3262474044,DE -3262474045,3262474047,SG -3262474048,3262474048,DE -3262474049,3262474049,IN -3262474050,3262474051,SG -3262474052,3262474052,DE -3262474053,3262474061,SG -3262474062,3262474063,CN -3262474064,3262474064,TW -3262474065,3262474065,IN -3262474066,3262474066,SG -3262474067,3262474067,MY -3262474068,3262474068,SG -3262474069,3262474069,MY -3262474070,3262474070,SG -3262474071,3262474071,TW -3262474072,3262474072,IN -3262474073,3262474075,SG -3262474076,3262474076,MY -3262474077,3262474077,SG -3262474078,3262474078,IN -3262474079,3262474080,DE -3262474081,3262474083,SG -3262474084,3262474084,DE -3262474085,3262474085,SG -3262474086,3262474086,DE -3262474087,3262474087,SG -3262474088,3262474088,MY -3262474089,3262474089,SG -3262474090,3262474091,MY -3262474092,3262474094,SG -3262474095,3262474095,HK -3262474096,3262474097,SG -3262474098,3262474098,MY -3262474099,3262474100,SG -3262474101,3262474101,DE -3262474102,3262474102,SG -3262474103,3262474103,MY -3262474104,3262474104,CN -3262474105,3262474105,DE -3262474106,3262474106,MY -3262474107,3262474107,CN -3262474108,3262474108,HK -3262474109,3262474110,MY -3262474111,3262474111,TH -3262474112,3262474112,SG -3262474113,3262474113,PH -3262474114,3262474114,IN -3262474115,3262474115,SG -3262474116,3262474117,DE -3262474118,3262474118,TH -3262474119,3262474119,TW -3262474120,3262474121,DE -3262474122,3262474122,SG -3262474123,3262474125,MY -3262474126,3262474126,IN -3262474127,3262474127,SG -3262474128,3262474128,DE -3262474129,3262474130,MY -3262474131,3262474131,IN -3262474132,3262474133,DE -3262474134,3262474134,CN -3262474135,3262474136,SG -3262474137,3262474138,DE -3262474139,3262474139,CN -3262474140,3262474140,TW -3262474141,3262474142,SG -3262474143,3262474143,PH -3262474144,3262474150,SG -3262474151,3262474151,MY -3262474152,3262474152,SG -3262474153,3262474156,DE -3262474157,3262474157,SG -3262474158,3262474159,MY -3262474160,3262474161,DE -3262474162,3262474162,SG -3262474163,3262474163,MY -3262474164,3262474164,IN -3262474165,3262474165,CN -3262474166,3262474166,SG -3262474167,3262474167,HK -3262474168,3262474168,TW -3262474169,3262474169,DE -3262474170,3262474170,SG -3262474171,3262474171,DE -3262474172,3262474172,SG -3262474173,3262474173,DE -3262474174,3262474174,TW -3262474175,3262474175,SG -3262474176,3262474176,MY -3262474177,3262474177,DE -3262474178,3262474178,TW -3262474179,3262474179,CN -3262474180,3262474180,MY -3262474181,3262474181,SG -3262474182,3262474182,MY -3262474183,3262474183,SG -3262474184,3262474184,DE -3262474185,3262474185,SG -3262474186,3262474186,MY -3262474187,3262474187,SG -3262474188,3262474188,MY -3262474189,3262474189,SG -3262474190,3262474190,CN -3262474191,3262474192,SG -3262474193,3262474193,DE -3262474194,3262474194,SG -3262474195,3262474195,MY -3262474196,3262474197,DE -3262474198,3262474198,SG -3262474199,3262474199,CN -3262474200,3262474200,DE -3262474201,3262474201,SG -3262474202,3262474203,CN -3262474204,3262474204,IN -3262474205,3262474205,SG -3262474206,3262474206,DE -3262474207,3262474207,MY -3262474208,3262474208,SG -3262474209,3262474211,DE -3262474212,3262474212,MY -3262474213,3262474213,SG -3262474214,3262474214,CN -3262474215,3262474215,DE -3262474216,3262474216,SG -3262474217,3262474217,DE -3262474218,3262474218,SG -3262474219,3262474219,MY -3262474220,3262474220,IN -3262474221,3262474221,DE -3262474222,3262474222,IN -3262474223,3262474223,SG -3262474224,3262474224,MY -3262474225,3262474225,SG -3262474226,3262474226,MY -3262474227,3262474227,DE -3262474228,3262474228,SG -3262474229,3262474230,DE -3262474231,3262474231,SG -3262474232,3262474232,DE -3262474233,3262474233,IN -3262474234,3262474234,DE -3262474235,3262474236,MY -3262474237,3262474237,DE -3262474238,3262474238,SG -3262474239,3262474475,DE -3262474476,3262474479,AU -3262474480,3262474631,DE -3262474632,3262474635,DK -3262474636,3262474795,DE -3262474796,3262474799,JP -3262474800,3262474807,DE -3262474808,3262474815,JP -3262474816,3262474899,DE -3262474900,3262474907,JP -3262474908,3262474911,DE -3262474912,3262474915,JP -3262474916,3262474919,DE -3262474920,3262474935,JP -3262474936,3262474939,DE -3262474940,3262474947,JP -3262474948,3262474951,DE -3262474952,3262474959,JP -3262474960,3262474963,DE -3262474964,3262474971,JP -3262474972,3262474975,DE -3262474976,3262474987,JP -3262474988,3262474991,DE -3262474992,3262475003,JP -3262475004,3262475013,DE -3262475014,3262475014,US -3262475015,3262475020,DE -3262475021,3262475021,US -3262475022,3262475023,DE -3262475024,3262475024,CO -3262475025,3262475027,DE -3262475028,3262475028,US -3262475029,3262475034,DE -3262475035,3262475035,US -3262475036,3262475060,DE -3262475061,3262475061,US -3262475062,3262475068,DE -3262475069,3262475069,US -3262475070,3262475070,DE -3262475071,3262475071,US -3262475072,3262475072,DE -3262475073,3262475074,BR -3262475075,3262475075,DE -3262475076,3262475076,US -3262475077,3262475081,DE -3262475082,3262475082,BR -3262475083,3262475085,DE -3262475086,3262475086,US -3262475087,3262475089,DE -3262475090,3262475090,US -3262475091,3262475092,DE -3262475093,3262475094,BR -3262475095,3262475096,DE -3262475097,3262475098,US -3262475099,3262475100,DE -3262475101,3262475102,US -3262475103,3262475104,DE -3262475105,3262475105,US -3262475106,3262475110,DE -3262475111,3262475112,US -3262475113,3262475113,DE -3262475114,3262475115,US -3262475116,3262475119,DE -3262475120,3262475121,US -3262475122,3262475122,DE -3262475123,3262475123,US -3262475124,3262475125,DE -3262475126,3262475128,US -3262475129,3262475131,DE -3262475132,3262475132,US -3262475133,3262475134,DE -3262475135,3262475135,US -3262475136,3262475136,DE -3262475137,3262475138,US -3262475139,3262475141,DE -3262475142,3262475142,US -3262475143,3262475144,DE -3262475145,3262475152,US -3262475153,3262475155,DE -3262475156,3262475156,US -3262475157,3262475166,DE -3262475167,3262475167,US -3262475168,3262475172,DE -3262475173,3262475174,US -3262475175,3262475175,DE -3262475176,3262475176,US -3262475177,3262475177,DE -3262475178,3262475178,US -3262475179,3262475181,DE -3262475182,3262475185,US -3262475186,3262475186,DE -3262475187,3262475188,US -3262475189,3262475190,DE -3262475191,3262475191,BR -3262475192,3262475192,MX -3262475193,3262475193,US -3262475194,3262475195,DE -3262475196,3262475197,US -3262475198,3262475199,DE -3262475200,3262475200,US -3262475201,3262475202,DE -3262475203,3262475203,BR -3262475204,3262475204,DE -3262475205,3262475205,BR -3262475206,3262475206,DE -3262475207,3262475207,US -3262475208,3262475208,DE -3262475209,3262475209,US -3262475210,3262475211,DE -3262475212,3262475212,US -3262475213,3262475215,DE -3262475216,3262475216,US -3262475217,3262475218,DE -3262475219,3262475219,US -3262475220,3262475220,DE -3262475221,3262475221,US -3262475222,3262475271,DE -3262475272,3262475275,IT -3262475276,3262475279,US -3262475280,3262475283,DE -3262475284,3262475287,NL -3262475288,3262475295,DE -3262475296,3262475303,NL -3262475304,3262475307,DE -3262475308,3262475311,AR -3262475312,3262475315,FR -3262475316,3262475359,DE -3262475360,3262475363,IT -3262475364,3262475371,DE -3262475372,3262475375,NL -3262475376,3262475383,DE -3262475384,3262475387,US -3262475388,3262475391,DE -3262475392,3262475395,AT -3262475396,3262475399,NL -3262475400,3262475403,US -3262475404,3262475415,DE -3262475416,3262475419,CH -3262475420,3262475427,DE -3262475428,3262475431,ES -3262475432,3262475435,IT -3262475436,3262475443,DE -3262475444,3262475447,US -3262475448,3262475451,FR -3262475452,3262475479,DE -3262475480,3262475483,US -3262475484,3262475487,IT -3262475488,3262475491,DE -3262475492,3262475495,CH -3262475496,3262475499,NL -3262475500,3262475503,DE -3262475504,3262475507,FR -3262475508,3262475523,DE -3262475524,3262475527,US -3262475528,3262475531,DE -3262475532,3262475535,US -3262475536,3262475543,DE -3262475544,3262475559,US -3262475560,3262475579,DE -3262475580,3262475583,US -3262475584,3262475587,DE -3262475588,3262475591,US -3262475592,3262475595,DE -3262475596,3262475607,US -3262475608,3262475631,DE -3262475632,3262475635,US -3262475636,3262475643,DE -3262475644,3262475651,US -3262475652,3262475655,DE -3262475656,3262475671,US -3262475672,3262475691,DE -3262475692,3262475695,BR -3262475696,3262475699,US -3262475700,3262475711,DE -3262475712,3262475715,US -3262475716,3262475723,DE -3262475724,3262475727,US -3262475728,3262475735,DE -3262475736,3262475743,US -3262475744,3262475751,DE -3262475752,3262475763,US -3262475764,3262475767,DE -3262475768,3262475771,US -3262475772,3262475783,DE -3262475784,3262475787,BE -3262475788,3262475791,DE -3262475792,3262475807,AE -3262475808,3262475811,US -3262475812,3262475815,IE -3262475816,3262475819,FR -3262475820,3262475823,DE -3262475824,3262475839,RO -3262475840,3262475855,DE -3262475856,3262475871,TR -3262475872,3262475875,BE -3262475876,3262475879,NL -3262475880,3262475883,PL -3262475884,3262475887,BE -3262475888,3262475891,DE -3262475892,3262475895,SA -3262475896,3262475903,CY -3262475904,3262475919,GR -3262475920,3262475935,DE -3262475936,3262475951,FR -3262475952,3262475963,US -3262475964,3262475967,HU -3262475968,3262475975,DE -3262475976,3262475983,BG -3262475984,3262475991,SG -3262475992,3262476015,DE -3262476016,3262476019,ES -3262476020,3262476023,FR -3262476024,3262476027,DE -3262476028,3262476031,FR -3262476032,3262476047,DE -3262476048,3262476055,IL -3262476056,3262476087,DE -3262476088,3262476091,DK -3262476092,3262476095,NL -3262476096,3262476099,US -3262476100,3262476107,DE -3262476108,3262476111,BE -3262476112,3262476119,DE -3262476120,3262476123,FR -3262476124,3262476139,DE -3262476140,3262476143,BE -3262476144,3262476147,CH -3262476148,3262476151,DE -3262476152,3262476155,US -3262476156,3262476159,BE -3262476160,3262476163,GR -3262476164,3262476171,DE -3262476172,3262476175,GB -3262476176,3262476179,ES -3262476180,3262476183,DE -3262476184,3262476187,AT -3262476188,3262476195,DE -3262476196,3262476199,US -3262476200,3262476203,GB -3262476204,3262476211,DE -3262476212,3262476215,CL -3262476216,3262476223,FR -3262476224,3262476227,DE -3262476228,3262476231,SE -3262476232,3262476235,DE -3262476236,3262476239,US -3262476240,3262476243,IT -3262476244,3262476247,ES -3262476248,3262476251,NL -3262476252,3262476255,DE -3262476256,3262476259,US -3262476260,3262476275,DE -3262476276,3262476279,CA -3262476280,3262476283,BE -3262476284,3262476291,DE -3262476292,3262476295,ZA -3262476296,3262476299,DE -3262476300,3262476303,DO -3262476304,3262476315,DE -3262476316,3262476319,BE -3262476320,3262476323,DE -3262476324,3262476327,IT -3262476328,3262476331,NL -3262476332,3262476339,DE -3262476340,3262476343,ES -3262476344,3262476351,DE -3262476352,3262476355,AR -3262476356,3262476359,DE -3262476360,3262476363,US -3262476364,3262476367,DE -3262476368,3262476371,US -3262476372,3262476375,DE -3262476376,3262476379,US -3262476380,3262476383,DE -3262476384,3262476387,US -3262476388,3262476395,DE -3262476396,3262476399,AT -3262476400,3262476423,DE -3262476424,3262476427,ES -3262476428,3262476431,US -3262476432,3262476435,IT -3262476436,3262476439,AT -3262476440,3262476459,DE -3262476460,3262476463,DK -3262476464,3262476471,DE -3262476472,3262476475,CA -3262476476,3262476479,US -3262476480,3262476491,DE -3262476492,3262476495,BE -3262476496,3262476503,DE -3262476504,3262476507,CH -3262476508,3262476519,DE -3262476520,3262476523,GB -3262476524,3262476527,MX -3262476528,3262476531,DE -3262476532,3262476535,IL -3262476536,3262476539,US -3262476540,3262476543,DE -3262476544,3262476547,DK -3262476548,3262476551,DE -3262476552,3262476555,IT -3262476556,3262476559,FR -3262476560,3262476579,DE -3262476580,3262476587,US -3262476588,3262476591,ES -3262476592,3262476595,GB -3262476596,3262476603,DE -3262476604,3262476607,NL -3262476608,3262476619,DE -3262476620,3262476623,NL -3262476624,3262476635,DE -3262476636,3262476639,DK -3262476640,3262476651,DE -3262476652,3262476655,FR -3262476656,3262476663,US -3262476664,3262476667,DE -3262476668,3262476671,GB -3262476672,3262476675,SE -3262476676,3262476679,DE -3262476680,3262476683,NL -3262476684,3262476687,IT -3262476688,3262476691,DE -3262476692,3262476695,FR -3262476696,3262476707,DE -3262476708,3262476711,US -3262476712,3262476719,DE -3262476720,3262476723,IT -3262476724,3262476727,FR -3262476728,3262476735,DE -3262476736,3262476739,CA -3262476740,3262476743,DE -3262476744,3262476747,CH -3262476748,3262476751,BE -3262476752,3262476771,DE -3262476772,3262476775,US -3262476776,3262476783,DE -3262476784,3262476787,IT -3262476788,3262476791,US -3262476792,3262476795,ES -3262476796,3262476827,DE -3262476828,3262476831,LU -3262476832,3262476855,DE -3262476856,3262476859,ES -3262476860,3262476883,DE -3262476884,3262476887,FR -3262476888,3262476899,DE -3262476900,3262476903,FR -3262476904,3262476911,DE -3262476912,3262476915,CH -3262476916,3262476935,DE -3262476936,3262476939,AT -3262476940,3262476951,DE -3262476952,3262476955,NL -3262476956,3262476975,DE -3262476976,3262476979,BE -3262476980,3262476995,DE -3262476996,3262476999,IT -3262477000,3262477015,DE -3262477016,3262477019,CH -3262477020,3262477027,DE -3262477028,3262477035,FR -3262477036,3262477039,DK -3262477040,3262477043,US -3262477044,3262477083,DE -3262477084,3262477087,NL -3262477088,3262477091,DE -3262477092,3262477095,BE -3262477096,3262477151,DE -3262477152,3262477155,CH -3262477156,3262477159,ES -3262477160,3262477163,US -3262477164,3262477167,DE -3262477168,3262477171,NL -3262477172,3262477183,DE -3262477184,3262477187,US -3262477188,3262477191,DE -3262477192,3262477195,GB -3262477196,3262477199,PL -3262477200,3262477203,GB -3262477204,3262477211,DE -3262477212,3262477215,AT -3262477216,3262477223,DE -3262477224,3262477227,BE -3262477228,3262477231,GB -3262477232,3262477239,DE -3262477240,3262477243,CA -3262477244,3262477247,US -3262477248,3262477251,DE -3262477252,3262477255,ES -3262477256,3262477259,DE -3262477260,3262477263,GB -3262477264,3262477267,DE -3262477268,3262477271,NL -3262477272,3262477275,US -3262477276,3262477279,NL -3262477280,3262477283,DE -3262477284,3262477287,FR -3262477288,3262477291,BM -3262477292,3262477299,DE -3262477300,3262477303,IT -3262477304,3262477311,DE -3262477312,3262477315,ES -3262477316,3262477319,DE -3262477320,3262477327,US -3262477328,3262477331,HU -3262477332,3262477335,DE -3262477336,3262477339,CA -3262477340,3262477343,DE -3262477344,3262477347,CH -3262477348,3262477359,DE -3262477360,3262477363,LU -3262477364,3262477367,DE -3262477368,3262477371,US -3262477372,3262477375,FR -3262477376,3262477379,AT -3262477380,3262477383,US -3262477384,3262477387,FR -3262477388,3262477407,DE -3262477408,3262477411,US -3262477412,3262477443,DE -3262477444,3262477447,BE -3262477448,3262477451,AR -3262477452,3262477467,DE -3262477468,3262477471,AT -3262477472,3262477475,DE -3262477476,3262477479,FR -3262477480,3262477483,DE -3262477484,3262477487,NL -3262477488,3262477503,DE -3262477504,3262477507,FR -3262477508,3262477511,CH -3262477512,3262477515,US -3262477516,3262477523,DE -3262477524,3262477527,IT -3262477528,3262477563,DE -3262477564,3262477571,BE -3262477572,3262477575,NL -3262477576,3262477579,DE -3262477580,3262477583,NO -3262477584,3262477587,DE -3262477588,3262477591,FR -3262477592,3262477595,GB -3262477596,3262477599,CH -3262477600,3262477623,DE -3262477624,3262477627,FR -3262477628,3262477631,CH -3262477632,3262477659,DE -3262477660,3262477667,US -3262477668,3262477671,DE -3262477672,3262477675,NL -3262477676,3262477695,DE -3262477696,3262477699,NL -3262477700,3262477703,DE -3262477704,3262477707,IT -3262477708,3262477711,GB -3262477712,3262477727,DE -3262477728,3262477731,AT -3262477732,3262477739,DE -3262477740,3262477743,NL -3262477744,3262477751,CH -3262477752,3262477763,DE -3262477764,3262477767,VE -3262477768,3262477771,DE -3262477772,3262477775,CA -3262477776,3262477779,DE -3262477780,3262477783,GB -3262477784,3262477791,DE -3262477792,3262477795,GB -3262477796,3262477799,FR -3262477800,3262477803,DE -3262477804,3262477807,CH -3262477808,3262477811,CA -3262477812,3262477823,DE -3262477824,3262477827,GB -3262477828,3262477831,US -3262477832,3262477835,DE -3262477836,3262477839,ES -3262477840,3262477843,GB -3262477844,3262477847,DE -3262477848,3262477851,GB -3262477852,3262477867,DE -3262477868,3262477871,HU -3262477872,3262477907,DE -3262477908,3262477911,CH -3262477912,3262477915,US -3262477916,3262477931,DE -3262477932,3262477935,US -3262477936,3262477939,DE -3262477940,3262477943,CA -3262477944,3262477955,DE -3262477956,3262477959,US -3262477960,3262477987,DE -3262477988,3262477991,NL -3262477992,3262478007,DE -3262478008,3262478011,IT -3262478012,3262478015,DE -3262478016,3262478019,CH -3262478020,3262478031,DE -3262478032,3262478035,AT -3262478036,3262478039,DE -3262478040,3262478043,NL -3262478044,3262478211,DE -3262478212,3262478215,NL -3262478216,3262478219,FR -3262478220,3262478223,SE -3262478224,3262478227,GB -3262478228,3262478239,DE -3262478240,3262478243,FR -3262478244,3262478247,DE -3262478248,3262478251,IT -3262478252,3262478255,CH -3262478256,3262478263,DE -3262478264,3262478267,IT -3262478268,3262478271,ES -3262478272,3262478299,DE -3262478300,3262478303,ES -3262478304,3262478307,PT -3262478308,3262478311,ES -3262478312,3262478319,DE -3262478320,3262478323,GB -3262478324,3262478327,DE -3262478328,3262478331,ES -3262478332,3262478335,GB -3262478336,3262478418,DE -3262478419,3262478419,FR -3262478420,3262478563,DE -3262478564,3262478564,RU -3262478565,3262478851,DE -3262478852,3262478852,CH -3262478853,3262478855,DE -3262478856,3262478856,FR -3262478857,3262478857,LI -3262478858,3262478862,DE -3262478863,3262478863,AT -3262478864,3262478865,DE -3262478866,3262478866,CH -3262478867,3262478867,GB -3262478868,3262478868,IT -3262478869,3262478870,FR -3262478871,3262478872,DE -3262478873,3262478873,NL -3262478874,3262478874,AT -3262478875,3262478877,DE -3262478878,3262478878,AT -3262478879,3262478881,DE -3262478882,3262478882,GR -3262478883,3262478887,DE -3262478888,3262478888,DK -3262478889,3262478890,FR -3262478891,3262478893,DE -3262478894,3262478894,AT -3262478895,3262478895,DE -3262478896,3262478896,NL -3262478897,3262478897,FR -3262478898,3262478898,DE -3262478899,3262478899,SE -3262478900,3262478900,GB -3262478901,3262478901,DE -3262478902,3262478902,IT -3262478903,3262478904,DE -3262478905,3262478905,SE -3262478906,3262478910,DE -3262478911,3262478911,BH -3262478912,3262478912,NL -3262478913,3262478913,FR -3262478914,3262478914,DE -3262478915,3262478915,NL -3262478916,3262478920,DE -3262478921,3262478921,AT -3262478922,3262478924,DE -3262478925,3262478925,NL -3262478926,3262478926,AT -3262478927,3262478935,DE -3262478936,3262478937,CH -3262478938,3262478938,NL -3262478939,3262478939,GB -3262478940,3262478940,NL -3262478941,3262478941,DE -3262478942,3262478942,BE -3262478943,3262478947,DE -3262478948,3262478948,IT -3262478949,3262478954,DE -3262478955,3262478955,FR -3262478956,3262478956,DE -3262478957,3262478957,PT -3262478958,3262478958,SE -3262478959,3262478960,DE -3262478961,3262478961,NL -3262478962,3262478966,DE -3262478967,3262478967,NL -3262478968,3262478968,ES -3262478969,3262478969,DE -3262478970,3262478970,BE -3262478971,3262478971,DE -3262478972,3262478972,NO -3262478973,3262478973,CH -3262478974,3262478974,GB -3262478975,3262478983,DE -3262478984,3262478984,CH -3262478985,3262478985,PT -3262478986,3262478986,DE -3262478987,3262478987,GB -3262478988,3262478988,IE -3262478989,3262478989,NL -3262478990,3262478990,DE -3262478991,3262478992,FR -3262478993,3262478993,NL -3262478994,3262478997,DE -3262478998,3262478998,GB -3262478999,3262478999,AT -3262479000,3262479000,DE -3262479001,3262479001,AT -3262479002,3262479002,DE -3262479003,3262479003,FR -3262479004,3262479007,DE -3262479008,3262479008,NL -3262479009,3262479009,DE -3262479010,3262479011,NL -3262479012,3262479012,DE -3262479013,3262479013,NL -3262479014,3262479014,DE -3262479015,3262479015,CH -3262479016,3262479016,SE -3262479017,3262479017,DK -3262479018,3262479018,IT -3262479019,3262479019,DE -3262479020,3262479022,CH -3262479023,3262479024,DE -3262479025,3262479025,NL -3262479026,3262479027,DE -3262479028,3262479028,CH -3262479029,3262479029,DE -3262479030,3262479030,ES -3262479031,3262479031,AT -3262479032,3262479036,DE -3262479037,3262479037,AT -3262479038,3262479038,DK -3262479039,3262479039,DE -3262479040,3262479040,NL -3262479041,3262479041,CH -3262479042,3262479042,DK -3262479043,3262479043,FR -3262479044,3262479047,DE -3262479048,3262479048,NL -3262479049,3262479050,DE -3262479051,3262479051,GB -3262479052,3262479052,DE -3262479053,3262479053,NL -3262479054,3262479056,DE -3262479057,3262479057,GB -3262479058,3262479058,FR -3262479059,3262479063,DE -3262479064,3262479064,FR -3262479065,3262479065,DE -3262479066,3262479066,IT -3262479067,3262479067,DE -3262479068,3262479068,ES -3262479069,3262479069,FR -3262479070,3262479070,ES -3262479071,3262479075,DE -3262479076,3262479076,BE -3262479077,3262479078,DE -3262479079,3262479079,ES -3262479080,3262479080,DE -3262479081,3262479081,CH -3262479082,3262479082,IT -3262479083,3262479083,NL -3262479084,3262479084,CH -3262479085,3262479085,DE -3262479086,3262479086,FR -3262479087,3262479088,DE -3262479089,3262479089,CH -3262479090,3262479090,FR -3262479091,3262479091,DE -3262479092,3262479092,IT -3262479093,3262479093,FR -3262479094,3262479095,GB -3262479096,3262479096,ES -3262479097,3262479097,DE -3262479098,3262479098,GB -3262479099,3262479100,DE -3262479101,3262479101,CH -3262479102,3262479102,IT -3262479103,3262479105,DE -3262479106,3262479106,ES -3262479107,3262479107,DE -3262479108,3262479108,AT -3262479109,3262479110,DE -3262479111,3262479111,LU -3262479112,3262479115,DE -3262479116,3262479116,IT -3262479117,3262479117,DE -3262479118,3262479118,GR -3262479119,3262479121,DE -3262479122,3262479122,FR -3262479123,3262479124,DE -3262479125,3262479125,IL -3262479126,3262479130,DE -3262479131,3262479131,NL -3262479132,3262479132,AT -3262479133,3262479133,NL -3262479134,3262479134,ES -3262479135,3262479139,DE -3262479140,3262479140,NL -3262479141,3262479142,DE -3262479143,3262479143,GB -3262479144,3262479144,CH -3262479145,3262479145,NO -3262479146,3262479146,DE -3262479147,3262479147,IT -3262479148,3262479149,ES -3262479150,3262479151,DE -3262479152,3262479152,NL -3262479153,3262479153,DE -3262479154,3262479154,FR -3262479155,3262479155,NL -3262479156,3262479160,DE -3262479161,3262479161,FR -3262479162,3262479162,DE -3262479163,3262479163,FR -3262479164,3262479164,DE -3262479165,3262479167,CH -3262479168,3262479168,DE -3262479169,3262479169,IT -3262479170,3262479170,CH -3262479171,3262479174,DE -3262479175,3262479175,FR -3262479176,3262479178,DE -3262479179,3262479179,AT -3262479180,3262479180,NL -3262479181,3262479182,DE -3262479183,3262479183,DK -3262479184,3262479184,DE -3262479185,3262479185,IT -3262479186,3262479186,ES -3262479187,3262479187,DE -3262479188,3262479188,CH -3262479189,3262479189,ES -3262479190,3262479191,IT -3262479192,3262479192,FR -3262479193,3262479193,GB -3262479194,3262479199,DE -3262479200,3262479200,NL -3262479201,3262479201,HU -3262479202,3262479202,FR -3262479203,3262479208,DE -3262479209,3262479209,ES -3262479210,3262479212,DE -3262479213,3262479213,NO -3262479214,3262479214,DE -3262479215,3262479215,IT -3262479216,3262479219,DE -3262479220,3262479220,NL -3262479221,3262479226,DE -3262479227,3262479227,NL -3262479228,3262479228,DK -3262479229,3262479233,DE -3262479234,3262479234,GB -3262479235,3262479238,DE -3262479239,3262479239,FR -3262479240,3262479241,DE -3262479242,3262479242,FR -3262479243,3262479243,NL -3262479244,3262479244,IT -3262479245,3262479249,DE -3262479250,3262479250,AT -3262479251,3262479252,DE -3262479253,3262479253,NL -3262479254,3262479254,FR -3262479255,3262479255,DE -3262479256,3262479256,IT -3262479257,3262479257,US -3262479258,3262479261,DE -3262479262,3262479262,CH -3262479263,3262479264,DE -3262479265,3262479265,CH -3262479266,3262479266,FR -3262479267,3262479267,DE -3262479268,3262479268,NL -3262479269,3262479269,DE -3262479270,3262479270,DK -3262479271,3262479271,DE -3262479272,3262479272,IT -3262479273,3262479273,DE -3262479274,3262479274,ES -3262479275,3262479275,IT -3262479276,3262479276,DE -3262479277,3262479277,NL -3262479278,3262479278,DE -3262479279,3262479279,ES -3262479280,3262479280,DE -3262479281,3262479281,FR -3262479282,3262479282,DE -3262479283,3262479283,IT -3262479284,3262479289,DE -3262479290,3262479290,BE -3262479291,3262479293,DE -3262479294,3262479294,FR -3262479295,3262479295,DE -3262479296,3262479296,IT -3262479297,3262479300,DE -3262479301,3262479301,ES -3262479302,3262479303,DE -3262479304,3262479304,AT -3262479305,3262479307,DE -3262479308,3262479308,DK -3262479309,3262479309,SE -3262479310,3262479312,DE -3262479313,3262479313,FR -3262479314,3262479318,DE -3262479319,3262479319,DK -3262479320,3262479324,DE -3262479325,3262479325,ES -3262479326,3262479327,DE -3262479328,3262479328,DK -3262479329,3262479329,ES -3262479330,3262479330,NL -3262479331,3262479332,FR -3262479333,3262479333,HU -3262479334,3262479334,NL -3262479335,3262479335,DE -3262479336,3262479336,FR -3262479337,3262479337,ES -3262479338,3262479338,DE -3262479339,3262479339,NL -3262479340,3262479340,CH -3262479341,3262479342,DE -3262479343,3262479343,NO -3262479344,3262479344,NL -3262479345,3262479345,DE -3262479346,3262479346,DK -3262479347,3262479347,NO -3262479348,3262479350,IT -3262479351,3262479351,DE -3262479352,3262479352,IT -3262479353,3262479355,DE -3262479356,3262479356,CH -3262479357,3262479357,FR -3262479358,3262479361,DE -3262479362,3262479362,PT -3262479363,3262479368,DE -3262479369,3262479369,FR -3262479370,3262479370,CH -3262479371,3262479371,GB -3262479372,3262479372,DE -3262479373,3262479373,IT -3262479374,3262479374,DE -3262479375,3262479375,NL -3262479376,3262479377,FR -3262479378,3262479378,DE -3262479379,3262479379,CH -3262479380,3262479380,AT -3262479381,3262479381,FR -3262479382,3262479385,DE -3262479386,3262479386,NL -3262479387,3262479387,DK -3262479388,3262479389,DE -3262479390,3262479390,DK -3262479391,3262479391,NO -3262479392,3262479393,DE -3262479394,3262479394,FR -3262479395,3262479395,NL -3262479396,3262479396,DE -3262479397,3262479397,IT -3262479398,3262479399,DE -3262479400,3262479400,NL -3262479401,3262479404,DE -3262479405,3262479405,IE -3262479406,3262479406,GB -3262479407,3262479413,DE -3262479414,3262479414,CH -3262479415,3262479415,DE -3262479416,3262479416,DK -3262479417,3262479419,DE -3262479420,3262479420,ES -3262479421,3262479421,DE -3262479422,3262479422,SE -3262479423,3262479426,DE -3262479427,3262479427,IT -3262479428,3262479429,FR -3262479430,3262479430,GB -3262479431,3262479433,DE -3262479434,3262479434,IT -3262479435,3262479437,DE -3262479438,3262479438,IT -3262479439,3262479439,DE -3262479440,3262479440,AT -3262479441,3262479441,DK -3262479442,3262479442,IT -3262479443,3262479443,GR -3262479444,3262479448,DE -3262479449,3262479449,GB -3262479450,3262479452,DE -3262479453,3262479453,CH -3262479454,3262479455,DE -3262479456,3262479456,IT -3262479457,3262479462,DE -3262479463,3262479463,IT -3262479464,3262479464,NL -3262479465,3262479465,DE -3262479466,3262479466,GB -3262479467,3262479470,DE -3262479471,3262479471,GB -3262479472,3262479472,DE -3262479473,3262479473,CH -3262479474,3262479474,BE -3262479475,3262479475,DE -3262479476,3262479476,GB -3262479477,3262479477,BE -3262479478,3262479478,IT -3262479479,3262479481,DE -3262479482,3262479482,IT -3262479483,3262479483,DE -3262479484,3262479484,AT -3262479485,3262479489,DE -3262479490,3262479490,IT -3262479491,3262479494,DE -3262479495,3262479495,BE -3262479496,3262479498,DE -3262479499,3262479499,ES -3262479500,3262479502,IT -3262479503,3262479507,DE -3262479508,3262479508,HU -3262479509,3262479509,FR -3262479510,3262479513,DE -3262479514,3262479514,FR -3262479515,3262479515,ES -3262479516,3262479517,DE -3262479518,3262479518,GB -3262479519,3262479519,GR -3262479520,3262479521,DE -3262479522,3262479522,CH -3262479523,3262479526,DE -3262479527,3262479528,NL -3262479529,3262479529,DE -3262479530,3262479530,BE -3262479531,3262479535,DE -3262479536,3262479536,GB -3262479537,3262479538,DE -3262479539,3262479539,IT -3262479540,3262479540,DE -3262479541,3262479541,CH -3262479542,3262479543,DE -3262479544,3262479544,IT -3262479545,3262479545,BE -3262479546,3262479546,GB -3262479547,3262479547,AT -3262479548,3262479548,DE -3262479549,3262479549,IT -3262479550,3262479552,DE -3262479553,3262479553,IL -3262479554,3262479554,DK -3262479555,3262479555,FR -3262479556,3262479558,DE -3262479559,3262479559,SE -3262479560,3262479560,DE -3262479561,3262479561,BE -3262479562,3262479562,GB -3262479563,3262479563,DE -3262479564,3262479564,GB -3262479565,3262479565,SE -3262479566,3262479566,NL -3262479567,3262479567,CH -3262479568,3262479568,NO -3262479569,3262479575,DE -3262479576,3262479576,NL -3262479577,3262479577,FR -3262479578,3262479578,DE -3262479579,3262479579,ZA -3262479580,3262479580,DE -3262479581,3262479581,IT -3262479582,3262479583,DE -3262479584,3262479584,NL -3262479585,3262479585,DE -3262479586,3262479586,GR -3262479587,3262479588,DE -3262479589,3262479589,IT -3262479590,3262479590,DE -3262479591,3262479591,NL -3262479592,3262479592,DE -3262479593,3262479593,FR -3262479594,3262479594,DE -3262479595,3262479595,FR -3262479596,3262479599,DE -3262479600,3262479600,IT -3262479601,3262479601,DE -3262479602,3262479602,GB -3262479603,3262479604,DE -3262479605,3262479605,SE -3262479606,3262479606,FR -3262479607,3262479607,NL -3262479608,3262479609,DE -3262479610,3262479610,SI -3262479611,3262479611,DE -3262479612,3262479612,ES -3262479613,3262479613,NL -3262479614,3262479617,DE -3262479618,3262479618,NO -3262479619,3262479619,ES -3262479620,3262479620,GB -3262479621,3262479622,DE -3262479623,3262479623,CH -3262479624,3262479624,ES -3262479625,3262479625,NL -3262479626,3262479628,DE -3262479629,3262479629,SI -3262479630,3262479630,NL -3262479631,3262479631,HU -3262479632,3262479632,DE -3262479633,3262479633,LU -3262479634,3262479634,DE -3262479635,3262479636,GB -3262479637,3262479637,ES -3262479638,3262479638,DE -3262479639,3262479639,AT -3262479640,3262479641,DE -3262479642,3262479642,GB -3262479643,3262479643,DE -3262479644,3262479644,NL -3262479645,3262479645,DE -3262479646,3262479646,GB -3262479647,3262479647,DE -3262479648,3262479648,NO -3262479649,3262479653,DE -3262479654,3262479654,ES -3262479655,3262479656,DE -3262479657,3262479657,NL -3262479658,3262479658,DE -3262479659,3262479659,NL -3262479660,3262479660,PT -3262479661,3262479662,FR -3262479663,3262479664,DE -3262479665,3262479665,DK -3262479666,3262479667,DE -3262479668,3262479668,NL -3262479669,3262479669,IT -3262479670,3262479670,DE -3262479671,3262479671,IT -3262479672,3262479673,DE -3262479674,3262479674,BE -3262479675,3262479676,DE -3262479677,3262479677,ES -3262479678,3262479678,IT -3262479679,3262479679,AT -3262479680,3262479680,IT -3262479681,3262479681,DE -3262479682,3262479682,IT -3262479683,3262479683,HU -3262479684,3262479688,DE -3262479689,3262479689,NL -3262479690,3262479690,LU -3262479691,3262479691,DE -3262479692,3262479692,LU -3262479693,3262479693,DE -3262479694,3262479694,CH -3262479695,3262479695,DE -3262479696,3262479696,CH -3262479697,3262479697,GB -3262479698,3262479698,FR -3262479699,3262479699,NL -3262479700,3262479700,DE -3262479701,3262479701,NL -3262479702,3262479702,AT -3262479703,3262479703,FR -3262479704,3262479707,DE -3262479708,3262479708,CH -3262479709,3262479709,NL -3262479710,3262479711,DE -3262479712,3262479712,GB -3262479713,3262479713,DE -3262479714,3262479714,AT -3262479715,3262479716,DE -3262479717,3262479717,BE -3262479718,3262479720,DE -3262479721,3262479721,AT -3262479722,3262479727,DE -3262479728,3262479728,BE -3262479729,3262479729,DE -3262479730,3262479730,ES -3262479731,3262479731,CH -3262479732,3262479732,IT -3262479733,3262479734,DE -3262479735,3262479736,CH -3262479737,3262479737,DE -3262479738,3262479738,AT -3262479739,3262479739,DK -3262479740,3262479740,DE -3262479741,3262479741,NL -3262479742,3262479742,FR -3262479743,3262479745,DE -3262479746,3262479746,GB -3262479747,3262479747,CH -3262479748,3262479748,DE -3262479749,3262479749,FR -3262479750,3262479750,AT -3262479751,3262479753,DE -3262479754,3262479754,FR -3262479755,3262479755,NL -3262479756,3262479756,FR -3262479757,3262479763,DE -3262479764,3262479764,FR -3262479765,3262479765,DE -3262479766,3262479766,CH -3262479767,3262479770,DE -3262479771,3262479771,IT -3262479772,3262479775,DE -3262479776,3262479776,IT -3262479777,3262479777,BE -3262479778,3262479778,NL -3262479779,3262479782,DE -3262479783,3262479783,GB -3262479784,3262479784,AT -3262479785,3262479785,FR -3262479786,3262479786,CH -3262479787,3262479788,DE -3262479789,3262479789,IT -3262479790,3262479790,DE -3262479791,3262479791,IT -3262479792,3262479793,DE -3262479794,3262479794,FR -3262479795,3262479795,CH -3262479796,3262479797,DE -3262479798,3262479799,GB -3262479800,3262479808,DE -3262479809,3262479809,FR -3262479810,3262479816,DE -3262479817,3262479817,HU -3262479818,3262479818,DE -3262479819,3262479819,NL -3262479820,3262479820,DE -3262479821,3262479822,NL -3262479823,3262479823,ES -3262479824,3262479824,GB -3262479825,3262479825,DE -3262479826,3262479826,BE -3262479827,3262479828,DE -3262479829,3262479829,CH -3262479830,3262479832,DE -3262479833,3262479833,ES -3262479834,3262479834,DE -3262479835,3262479835,AT -3262479836,3262479836,NL -3262479837,3262479837,HU -3262479838,3262479838,CH -3262479839,3262479839,NL -3262479840,3262479840,DE -3262479841,3262479841,FR -3262479842,3262479842,DK -3262479843,3262479843,GB -3262479844,3262479846,DE -3262479847,3262479847,LU -3262479848,3262479860,DE -3262479861,3262479861,NO -3262479862,3262479862,BE -3262479863,3262479864,DE -3262479865,3262479865,FR -3262479866,3262479866,DE -3262479867,3262479867,SE -3262479868,3262479873,DE -3262479874,3262479875,FR -3262479876,3262479876,DE -3262479877,3262479877,CH -3262479878,3262479879,DE -3262479880,3262479880,AT -3262479881,3262479883,DE -3262479884,3262479884,GB -3262479885,3262479888,DE -3262479889,3262479889,NL -3262479890,3262479892,DE -3262479893,3262479893,LU -3262479894,3262479894,CH -3262479895,3262479896,ES -3262479897,3262479899,DE -3262479900,3262479900,NL -3262479901,3262479901,AT -3262479902,3262479908,DE -3262479909,3262479909,SE -3262479910,3262479914,DE -3262479915,3262479915,FR -3262479916,3262479917,DE -3262479918,3262479918,GB -3262479919,3262479922,DE -3262479923,3262479923,AT -3262479924,3262479929,DE -3262479930,3262479930,IT -3262479931,3262479932,DE -3262479933,3262479933,NL -3262479934,3262479936,DE -3262479937,3262479937,FR -3262479938,3262479939,DE -3262479940,3262479940,ES -3262479941,3262479941,IT -3262479942,3262479944,DE -3262479945,3262479945,FR -3262479946,3262479946,DE -3262479947,3262479947,HU -3262479948,3262479948,DE -3262479949,3262479949,NL -3262479950,3262479950,CH -3262479951,3262479955,DE -3262479956,3262479956,IT -3262479957,3262479957,BE -3262479958,3262479961,DE -3262479962,3262479962,GB -3262479963,3262479963,ES -3262479964,3262479964,DE -3262479965,3262479965,ES -3262479966,3262479974,DE -3262479975,3262479975,FR -3262479976,3262479976,NL -3262479977,3262479978,DE -3262479979,3262479979,CH -3262479980,3262479980,AT -3262479981,3262479984,DE -3262479985,3262479985,CH -3262479986,3262479987,DE -3262479988,3262479988,FR -3262479989,3262479989,DE -3262479990,3262479990,NL -3262479991,3262479995,DE -3262479996,3262479996,NL -3262479997,3262480001,DE -3262480002,3262480002,BE -3262480003,3262480005,DE -3262480006,3262480006,FR -3262480007,3262480010,DE -3262480011,3262480011,BE -3262480012,3262480012,NL -3262480013,3262480015,DE -3262480016,3262480016,ES -3262480017,3262480018,DE -3262480019,3262480019,BE -3262480020,3262480021,DE -3262480022,3262480022,CH -3262480023,3262480029,DE -3262480030,3262480030,GB -3262480031,3262480031,DE -3262480032,3262480032,CH -3262480033,3262480033,GB -3262480034,3262480034,DE -3262480035,3262480035,LU -3262480036,3262480038,DE -3262480039,3262480039,CH -3262480040,3262480042,DE -3262480043,3262480043,GB -3262480044,3262480044,RS -3262480045,3262480045,GB -3262480046,3262480048,DE -3262480049,3262480049,LU -3262480050,3262480051,DE -3262480052,3262480052,NL -3262480053,3262480057,DE -3262480058,3262480058,NL -3262480059,3262480059,CH -3262480060,3262480060,DE -3262480061,3262480062,GB -3262480063,3262480063,SI -3262480064,3262480066,DE -3262480067,3262480067,NL -3262480068,3262480073,DE -3262480074,3262480074,AT -3262480075,3262480076,DE -3262480077,3262480078,FR -3262480079,3262480082,DE -3262480083,3262480083,NO -3262480084,3262480084,IT -3262480085,3262480087,DE -3262480088,3262480088,FR -3262480089,3262480089,NL -3262480090,3262480090,CH -3262480091,3262480092,DE -3262480093,3262480093,BE -3262480094,3262480094,DE -3262480095,3262480095,AT -3262480096,3262480097,DE -3262480098,3262480098,GB -3262480099,3262480104,DE -3262480105,3262480105,IT -3262480106,3262480106,DE -3262480107,3262480107,DK -3262480108,3262480109,DE -3262480110,3262480110,GB -3262480111,3262480111,AT -3262480112,3262480112,BE -3262480113,3262480113,DE -3262480114,3262480114,IT -3262480115,3262480116,DE -3262480117,3262480117,BE -3262480118,3262480133,DE -3262480134,3262480134,AT -3262480135,3262480135,NL -3262480136,3262480136,FR -3262480137,3262480139,DE -3262480140,3262480140,FR -3262480141,3262480141,AT -3262480142,3262480146,DE -3262480147,3262480147,IT -3262480148,3262480148,GB -3262480149,3262480150,DE -3262480151,3262480151,GB -3262480152,3262480158,DE -3262480159,3262480159,IT -3262480160,3262480161,DE -3262480162,3262480162,NO -3262480163,3262480164,DE -3262480165,3262480165,FR -3262480166,3262480172,DE -3262480173,3262480173,NL -3262480174,3262480174,DE -3262480175,3262480175,NL -3262480176,3262480177,DE -3262480178,3262480178,IT -3262480179,3262480179,DE -3262480180,3262480180,FR -3262480181,3262480181,ES -3262480182,3262480184,DE -3262480185,3262480185,FR -3262480186,3262480187,DE -3262480188,3262480188,FI -3262480189,3262480189,CH -3262480190,3262480194,DE -3262480195,3262480195,GB -3262480196,3262480197,DE -3262480198,3262480198,NL -3262480199,3262480199,GB -3262480200,3262480201,DE -3262480202,3262480202,GB -3262480203,3262480205,DE -3262480206,3262480206,CH -3262480207,3262480212,DE -3262480213,3262480213,FR -3262480214,3262480215,DE -3262480216,3262480216,HU -3262480217,3262480218,DE -3262480219,3262480219,ES -3262480220,3262480220,NL -3262480221,3262480221,BE -3262480222,3262480226,DE -3262480227,3262480227,IE -3262480228,3262480229,DE -3262480230,3262480230,SE -3262480231,3262480232,DE -3262480233,3262480233,SE -3262480234,3262480238,DE -3262480239,3262480239,NL -3262480240,3262480243,DE -3262480244,3262480244,CH -3262480245,3262480246,DE -3262480247,3262480247,NL -3262480248,3262480248,DE -3262480249,3262480249,NL -3262480250,3262480250,DE -3262480251,3262480251,NL -3262480252,3262480264,DE -3262480265,3262480265,GB -3262480266,3262480268,DE -3262480269,3262480269,NL -3262480270,3262480270,DE -3262480271,3262480271,CH -3262480272,3262480272,DK -3262480273,3262480273,DE -3262480274,3262480274,IT -3262480275,3262480275,BE -3262480276,3262480276,ES -3262480277,3262480282,DE -3262480283,3262480283,GB -3262480284,3262480293,DE -3262480294,3262480294,FR -3262480295,3262480295,DE -3262480296,3262480296,NO -3262480297,3262480303,DE -3262480304,3262480304,IT -3262480305,3262480305,DE -3262480306,3262480306,AT -3262480307,3262480311,DE -3262480312,3262480312,NL -3262480313,3262480313,FR -3262480314,3262480314,NL -3262480315,3262480315,DE -3262480316,3262480316,IT -3262480317,3262480317,DE -3262480318,3262480318,IT -3262480319,3262480319,AT -3262480320,3262480320,DK -3262480321,3262480321,DE -3262480322,3262480322,GB -3262480323,3262480324,DE -3262480325,3262480325,ES -3262480326,3262480329,DE -3262480330,3262480330,FR -3262480331,3262480332,DE -3262480333,3262480333,CH -3262480334,3262480334,DE -3262480335,3262480335,GB -3262480336,3262480336,DE -3262480337,3262480337,NL -3262480338,3262480340,DE -3262480341,3262480341,CH -3262480342,3262480342,DE -3262480343,3262480343,DK -3262480344,3262480346,DE -3262480347,3262480347,NL -3262480348,3262480352,DE -3262480353,3262480353,CH -3262480354,3262480354,DE -3262480355,3262480355,GB -3262480356,3262480356,DE -3262480357,3262480357,GB -3262480358,3262480358,CH -3262480359,3262480365,DE -3262480366,3262480366,AT -3262480367,3262480367,DE -3262480368,3262480368,GB -3262480369,3262480369,FR -3262480370,3262480370,ES -3262480371,3262480371,GB -3262480372,3262480372,DE -3262480373,3262480373,AT -3262480374,3262480374,ES -3262480375,3262480375,NL -3262480376,3262480377,DE -3262480378,3262480378,IT -3262480379,3262480379,CH -3262480380,3262480380,GB -3262480381,3262480381,IT -3262480382,3262480383,DE -3262480384,3262488575,GB -3262488576,3262496767,SE -3262496768,3262504959,FR -3262505472,3262505983,GB -3262505984,3262506495,PL -3262506496,3262507007,RO -3262507008,3262507519,DK -3262507520,3262508543,RO -3262509056,3262509567,PL -3262509568,3262510079,RO -3262510080,3262511103,FR -3262511104,3262511615,GB -3262512128,3262512639,UA -3262512640,3262513151,DE -3262513152,3262578687,AT -3262578688,3262583807,FR -3262583808,3262584063,CH -3262584064,3262611455,FR -3262611456,3262627839,GB -3262627840,3262636031,IT -3262636032,3262644223,BE -3262644224,3262648575,NL -3262648576,3262648831,DE -3262648832,3262649855,NL -3262649856,3262650623,DE -3262650624,3262654463,NL -3262654464,3262654719,DE -3262654720,3262658303,NL -3262658304,3262658559,DE -3262658560,3262661119,NL -3262661120,3262661375,DE -3262661376,3262664703,NL -3262664704,3262671359,DE -3262671360,3262672127,NL -3262672128,3262672895,DE -3262672896,3262673919,NL -3262673920,3262674943,DE -3262674944,3262676479,NL -3262676480,3262676735,DE -3262676736,3262678271,NL -3262678272,3262678527,DE -3262678528,3262681087,NL -3262681088,3262681343,DE -3262681344,3262682623,NL -3262682624,3262682879,DE -3262682880,3262686207,NL -3262686208,3262686463,DE -3262686464,3262687743,NL -3262687744,3262689023,DE -3262689024,3262690815,NL -3262690816,3262691583,DE -3262691584,3262692607,NL -3262692608,3262701567,DE -3262701568,3262703103,NL -3262703104,3262704383,DE -3262704384,3262707807,NL -3262707808,3262707839,DE -3262707840,3262707967,NL -3262707968,3262708223,DE -3262708224,3262709759,NL -3262709760,3262710527,DE -3262710528,3262712575,NL -3262712576,3262712831,DE -3262712832,3262716415,NL -3262716416,3262716671,DE -3262716672,3262721535,NL -3262721536,3262723071,DE -3262723072,3262724095,NL -3262724096,3262726911,DE -3262726912,3262732799,NL -3262732800,3262733055,DE -3262733056,3262753791,NL -3262753792,3262754815,DE -3262754816,3262761727,NL -3262761728,3262761983,DE -3262761984,3262774783,NL -3262774784,3262775039,DE -3262775040,3262832639,NL -3262832640,3262840319,DE -3262840320,3262906367,NL -3262906368,3262954495,CH -3262954496,3262955519,LI -3262955520,3262963711,CH -3262964224,3262964479,CH -3262964992,3262965247,DE -3262965248,3262971903,CH -3262971904,3263029247,IE -3263029248,3263030271,UA -3263031296,3263032319,TR -3263032320,3263033343,RU -3263033344,3263033855,LV -3263033856,3263034367,IT -3263034368,3263034879,UA -3263034880,3263035391,GB -3263036416,3263036927,GR -3263036928,3263037439,RU -3263037440,3263045631,LB -3263045632,3263046847,KW -3263046848,3263046911,IQ -3263046912,3263047935,KW -3263047936,3263048191,LB -3263048192,3263053823,KW -3263053824,3263062015,GB -3263062016,3263070207,EE -3263070208,3263070719,FR -3263070720,3263070975,NL -3263072256,3263074303,LB -3263074304,3263074815,CH -3263074816,3263075327,RO -3263075328,3263075839,IT -3263075840,3263076351,GB -3263077376,3263077887,FR -3263077888,3263078399,DE -3263079424,3263080447,PL -3263080448,3263081471,RU -3263081472,3263082495,NL -3263083520,3263084543,UA -3263084544,3263085567,RO -3263085568,3263086591,NL -3263086592,3263086847,DK -3263086848,3263087103,NL -3263087360,3263087871,DE -3263087872,3263088127,SI -3263088128,3263088383,DE -3263088384,3263088639,LV -3263088640,3263089151,CH -3263089408,3263089663,RU -3263089664,3263089919,UA -3263089920,3263090175,RO -3263090176,3263090431,DE -3263090432,3263090687,PL -3263090688,3263090943,DE -3263090944,3263091199,GB -3263091200,3263091455,PL -3263091456,3263091711,NO -3263091712,3263091967,FI -3263091968,3263092479,HR -3263092736,3263092991,PL -3263092992,3263093247,FR -3263093248,3263093503,CH -3263093760,3263094015,RO -3263094016,3263094527,PL -3263094528,3263094783,DK -3263094784,3263095039,UA -3263095040,3263095295,ES -3263095296,3263095551,FR -3263095808,3263096063,DE -3263096064,3263096319,PL -3263096320,3263096575,TR -3263096576,3263096831,SA -3263096832,3263097087,PL -3263097344,3263097599,DK -3263097600,3263097855,NL -3263097856,3263098111,FR -3263098112,3263098367,DE -3263098368,3263098623,PL -3263098624,3263098879,DE -3263098880,3263099135,GB -3263099136,3263099391,NL -3263099392,3263099903,DE -3263099904,3263100159,RO -3263100416,3263100671,DE -3263100672,3263100927,GB -3263100928,3263101183,AT -3263101184,3263101439,US -3263101440,3263101695,DK -3263101952,3263102207,LT -3263102208,3263102463,GB -3263102464,3263102719,PL -3263102720,3263102975,GR -3263102976,3263104030,DE -3263104031,3263104031,FR -3263104032,3263104040,DE -3263104041,3263104041,GB -3263104042,3263108351,DE -3263108352,3263108607,US -3263108608,3263109951,DE -3263109952,3263109959,FR -3263109960,3263137791,DE -3263137792,3263138303,PL -3263138304,3263138559,DE -3263138560,3263138815,AT -3263138816,3263168511,DE -3263168512,3263430655,GB -3263430656,3263433471,SE -3263433472,3263433727,NO -3263433728,3263436543,SE -3263436544,3263436799,ES -3263436800,3263438591,SE -3263438592,3263438847,IT -3263438848,3263443455,SE -3263443456,3263443967,NL -3263443968,3263445759,SE -3263445760,3263446015,GB -3263446016,3263446271,SE -3263446272,3263446527,CH -3263446528,3263447039,DE -3263447040,3263449599,SE -3263449600,3263450111,GB -3263450112,3263450367,DK -3263450368,3263458047,SE -3263458048,3263458303,DE -3263458304,3263459583,SE -3263459584,3263459839,FR -3263459840,3263460095,SE -3263460096,3263460351,GB -3263460352,3263461631,SE -3263461632,3263461887,GB -3263461888,3263467519,SE -3263467520,3263468031,AX -3263468032,3263469567,SE -3263469568,3263469663,SG -3263469664,3263469695,US -3263469696,3263469855,SG -3263469856,3263469887,US -3263469888,3263470591,SG -3263470592,3263475711,SE -3263475712,3263476159,JP -3263476160,3263476191,GB -3263476192,3263476255,JP -3263476256,3263476287,GB -3263476288,3263476415,JP -3263476416,3263476479,GB -3263476480,3263476671,JP -3263476672,3263476703,GB -3263476704,3263476735,JP -3263476736,3263478015,SE -3263478016,3263478271,AU -3263478272,3263478527,SE -3263478528,3263478783,ES -3263478784,3263480831,SE -3263480832,3263481343,JP -3263481344,3263481359,GB -3263481360,3263481455,JP -3263481456,3263481471,GB -3263481472,3263481487,JP -3263481488,3263481503,GB -3263481504,3263481855,JP -3263481856,3263482879,SE -3263482880,3263483903,GB -3263483904,3263496191,SE -3263496192,3263503103,GB -3263503104,3263503359,DE -3263503360,3263511551,GB -3263511552,3263512063,BE -3263512064,3263512575,GB -3263512576,3263512831,ES -3263512832,3263513855,GB -3263513856,3263514111,RU -3263514112,3263520767,GB -3263520768,3263525887,DE -3263525888,3263526143,ZA -3263526144,3263527423,DE -3263527424,3263527679,ZW -3263527680,3263545343,DE -3263545344,3263561727,US -3263561728,3263627263,NL -3263627264,3263627519,ES -3263627520,3263628031,UA -3263628032,3263628287,ES -3263628288,3263631359,RU -3263631360,3263632127,UA -3263632128,3263632383,ES -3263632384,3263633151,RU -3263633152,3263633663,UA -3263633664,3263633919,RU -3263634432,3263634943,ES -3263634944,3263635199,RU -3263635200,3263635455,ES -3263635456,3263636223,UA -3263636224,3263636479,RU -3263636480,3263636991,UA -3263636992,3263637247,RU -3263637248,3263637503,UA -3263637504,3263638527,RU -3263638528,3263639039,UA -3263639040,3263639295,RU -3263639296,3263639551,DE -3263639552,3263640575,US -3263640576,3263641599,RU -3263641600,3263642623,ES -3263642624,3263646719,RU -3263646720,3263647743,ES -3263647744,3263651619,LT -3263651620,3263651620,RU -3263651621,3263651839,LT -3263651840,3263653119,RU -3263653120,3263653631,ES -3263653632,3263654399,RU -3263654400,3263654911,SY -3263654912,3263656959,RU -3263656960,3263657471,SY -3263657472,3263657727,DE -3263657728,3263659263,RU -3263659264,3263660031,ES -3263660032,3263661055,DE -3263661568,3263661823,ES -3263661824,3263666175,RU -3263666176,3263676415,AZ -3263676416,3263677439,RU -3263677440,3263678463,ES -3263678464,3263680511,DE -3263680512,3263690751,RU -3263690752,3263692799,SY -3263692800,3263823871,FI -3263823872,3263886079,DE -3263886080,3263886335,SG -3263886336,3263954943,DE -3263954944,3263979519,ES -3263979520,3263987711,DE -3263987712,3264004095,ES -3264004096,3264012287,HU -3264012544,3264012799,FR -3264012800,3264013055,GB -3264013056,3264013311,TR -3264013312,3264013567,UA -3264013824,3264014079,NL -3264014080,3264014335,DE -3264014336,3264014591,PT -3264014592,3264014847,PL -3264014848,3264015103,IE -3264015104,3264015359,RO -3264015360,3264015615,DK -3264015872,3264016127,PT -3264016128,3264016383,UA -3264016384,3264016639,SE -3264016640,3264016895,PL -3264017152,3264017663,SE -3264017664,3264017919,RO -3264017920,3264018175,NL -3264018176,3264018431,FR -3264018432,3264018687,HU -3264018944,3264019199,PL -3264019200,3264019967,GB -3264019968,3264020223,AT -3264020224,3264020479,PL -3264020480,3264086015,BG -3264086016,3264151551,FI -3264151552,3264184319,NO -3264184320,3264184831,MD -3264184832,3264185343,NL -3264185344,3264185855,FR -3264185856,3264186367,DE -3264186368,3264186879,UA -3264186880,3264187391,RU -3264187392,3264187903,IR -3264187904,3264188415,IT -3264188416,3264189439,UA -3264189440,3264190463,RU -3264190464,3264190975,LV -3264190976,3264191487,GB -3264191488,3264191999,DE -3264192000,3264200703,GB -3264200704,3264208895,ES -3264208896,3264217087,HU -3264217088,3264282623,IS -3264282624,3264290815,GB -3264290816,3264296191,FI -3264296192,3264297727,FR -3264297728,3264298751,DE -3264298752,3264299007,BG -3264299008,3264307199,DE -3264307200,3264311295,PL -3264311808,3264312063,DE -3264312064,3264312319,CH -3264312576,3264312831,UA -3264312832,3264313087,DE -3264313088,3264313343,NL -3264313344,3264313599,RO -3264313600,3264313855,PT -3264313856,3264314623,DE -3264314880,3264315135,GB -3264315392,3264317439,IE -3264318464,3264318975,ES -3264319488,3264319743,FR -3264319744,3264319999,SE -3264320000,3264320255,DE -3264320256,3264321023,GB -3264321024,3264321535,DE -3264321792,3264322047,RS -3264322048,3264322303,FR -3264322560,3264322815,HU -3264322816,3264323071,CH -3264323072,3264323327,RU -3264323328,3264323583,RO -3264323584,3264324607,BG -3264324608,3264325631,SE -3264325632,3264326655,RU -3264326656,3264327679,SE -3264327680,3264328703,AT -3264328704,3264329727,CZ -3264329728,3264330751,PL -3264330752,3264331775,GB -3264331776,3264332287,DE -3264332288,3264332799,NL -3264332800,3264333311,GB -3264333312,3264333823,UA -3264333824,3264334335,NL -3264334336,3264334847,UA -3264334848,3264335359,PL -3264335360,3264335871,SK -3264335872,3264336383,BZ -3264337408,3264338431,UA -3264338432,3264338943,DE -3264338944,3264339455,UA -3264339456,3264339967,GB -3264339968,3264340223,DE -3264340224,3264340479,PL -3264340480,3264340735,DE -3264340736,3264340991,UA -3264340992,3264341503,PL -3264341504,3264341759,DE -3264341760,3264342015,IT -3264342016,3264342783,DE -3264342784,3264343039,FR -3264343040,3264343295,DE -3264343296,3264343551,GB -3264343552,3264343807,RO -3264343808,3264344063,DE -3264344064,3264345087,GB -3264345088,3264346111,NL -3264346112,3264347135,SE -3264347136,3264348159,DE -3264352256,3264356351,FR -3264357632,3264357887,DE -3264359936,3264360191,FR -3264360448,3264369151,FR -3264372736,3264373759,FR -3264374784,3264376063,SE -3264376064,3264376319,HR -3264376320,3264376575,UA -3264376576,3264376831,CH -3264376832,3264377087,UA -3264377088,3264377343,RU -3264377600,3264377855,RU -3264378112,3264378367,SE -3264378368,3264378623,DE -3264378624,3264378879,RU -3264378880,3264379135,PL -3264379136,3264379391,BE -3264379392,3264379647,RU -3264379648,3264379903,PL -3264380160,3264380415,RO -3264380672,3264380927,NL -3264380928,3264381951,PL -3264381952,3264385023,UA -3264385024,3264386047,DE -3264386048,3264387071,IR -3264387072,3264388095,LB -3264389120,3264390143,RU -3264391168,3264392191,SE -3264392192,3264393215,FR -3264393216,3264394239,DE -3264394240,3264395263,UA -3264395264,3264396287,AT -3264396288,3264397311,UA -3264398336,3264399359,UA -3264399360,3264400383,RU -3264401408,3264402431,DE -3264402432,3264403455,CH -3264403456,3264404479,PL -3264405504,3264406527,FR -3264406528,3264407551,UA -3264407552,3264408575,BG -3264408576,3264409599,AE -3264409600,3264410623,RU -3264410624,3264411647,NO -3264411648,3264413695,PL -3264413696,3264430079,CH -3264430592,3264430847,CH -3264431104,3264431615,LI -3264431616,3264431871,CH -3264432128,3264434175,CH -3264438272,3264440575,CH -3264441344,3264441599,PL -3264442368,3264442879,CH -3264447488,3264447743,CH -3264447744,3264447999,DE -3264448000,3264448511,CH -3264449536,3264450559,CH -3264452352,3264452607,CH -3264454656,3264455679,CH -3264456704,3264457215,CH -3264457472,3264457727,AT -3264457984,3264458239,CH -3264458752,3264463871,CH -3264463872,3264466943,LI -3264466944,3264475391,CH -3264476416,3264476671,CH -3264476672,3264477183,RU -3264477184,3264477439,PL -3264477440,3264477695,RU -3264478720,3264478975,CH -3264479232,3264544767,CH -3264544768,3264556799,HU -3264556800,3264557055,BG -3264557056,3264557823,HU -3264557824,3264558079,BG -3264558080,3264561151,HU -3264561152,3264563199,RU -3264563200,3264564223,ES -3264564224,3264565247,IE -3264565248,3264567295,NL -3264567296,3264567551,PL -3264567808,3264568063,RU -3264568320,3264568575,UA -3264568832,3264569087,FR -3264569088,3264569343,RU -3264569344,3264577535,CZ -3264577536,3264585727,MK -3264585728,3264593919,FR -3264593920,3264602111,ES -3264602112,3264603135,RU -3264603136,3264604159,PL -3264604160,3264604671,IT -3264604672,3264605183,RU -3264605184,3264605695,GR -3264605696,3264606207,FI -3264606208,3264606463,PL -3264606464,3264606719,DE -3264606720,3264606975,RU -3264606976,3264607231,BE -3264607232,3264607487,IT -3264607488,3264610303,DE -3264610304,3264612479,GB -3264612480,3264612575,FR -3264612576,3264613027,GB -3264613028,3264613031,FR -3264613032,3264614911,GB -3264614912,3264615167,SE -3264615168,3264615423,GB -3264615424,3264615935,CH -3264615936,3264616263,GB -3264616264,3264616271,CH -3264616272,3264616335,GB -3264616336,3264616337,CH -3264616338,3264617983,GB -3264617984,3264618239,US -3264618240,3264619391,GB -3264619392,3264619519,BE -3264619520,3264623971,GB -3264623972,3264623975,BE -3264623976,3264624639,GB -3264624640,3264624671,US -3264624672,3264626687,GB -3264626688,3264627711,EE -3264628736,3264629759,UA -3264630784,3264631807,DE -3264631808,3264632831,RO -3264632832,3264633855,RU -3264634880,3264636927,PL -3264636928,3264637951,RU -3264637952,3264639999,DK -3264640000,3264641023,BG -3264641024,3264642047,GB -3264643072,3264651263,RU -3264651264,3264651775,CH -3264651776,3264652287,IT -3264652288,3264652799,RU -3264652800,3264653311,PL -3264653312,3264653823,DE -3264653824,3264654335,PL -3264654336,3264654847,DE -3264654848,3264655359,UA -3264655360,3264655871,GB -3264655872,3264656383,RU -3264656896,3264657407,GB -3264657408,3264657919,PL -3264657920,3264658431,RO -3264658432,3264659455,DE -3264659456,3264659967,UA -3264659968,3264660479,GB -3264660480,3264660991,PL -3264660992,3264661503,CH -3264661504,3264662015,GB -3264662016,3264662527,RU -3264663040,3264663551,PL -3264663552,3264664063,NL -3264664064,3264664575,DE -3264664576,3264665087,NO -3264665600,3264666111,RO -3264666112,3264666623,IL -3264666624,3264667135,UA -3264667136,3264667647,RU -3264667648,3264668159,BE -3264668160,3264669183,DE -3264669184,3264669695,PL -3264669696,3264670207,UA -3264670720,3264671231,FR -3264671232,3264671743,PL -3264671744,3264672255,DE -3264672256,3264672511,FR -3264672512,3264672767,RO -3264672768,3264673279,CH -3264673280,3264673791,PL -3264673792,3264674303,CH -3264674304,3264674815,PL -3264674816,3264675327,GB -3264675328,3264675839,RU -3264675840,3264741375,NL -3264741376,3264749567,SI -3264749568,3264750079,LV -3264750080,3264750591,RU -3264750592,3264751103,KG -3264751104,3264751615,DK -3264751616,3264752127,GB -3264752128,3264752639,RO -3264752640,3264753151,AE -3264753152,3264753663,PL -3264753664,3264754175,IT -3264754176,3264754687,PL -3264754688,3264754943,LU -3264754944,3264755199,PL -3264755200,3264755711,DE -3264755712,3264756223,PL -3264756736,3264757247,PL -3264757248,3264757759,RU -3264757760,3264765951,GB -3264765952,3264774143,AT -3264774144,3264782335,HU -3264782336,3264790527,AT -3264790528,3264806911,HR -3264806912,3264815103,GB -3264815104,3264825343,SE -3264825856,3264826111,NL -3264826112,3264826367,GB -3264826880,3264827135,NL -3264827136,3264827391,LV -3264827648,3264828159,GR -3264828160,3264828415,DE -3264828416,3264828671,SE -3264828672,3264828927,MT -3264828928,3264829439,DE -3264829440,3264830207,FR -3264830208,3264830463,SE -3264830464,3264830719,FR -3264830720,3264830975,AT -3264830976,3264831231,CH -3264831232,3264831487,PL -3264831488,3264831743,CH -3264831744,3264831999,FR -3264832000,3264832255,IE -3264832512,3264832767,DE -3264832768,3264833023,IL -3264833536,3264834047,DE -3264834048,3264834303,GB -3264834304,3264834559,PL -3264834560,3264835327,FR -3264835328,3264835583,AT -3264835584,3264835839,RU -3264835840,3264836351,DE -3264836352,3264836607,PL -3264836608,3264836863,DE -3264836864,3264837119,NL -3264837120,3264837375,BG -3264837376,3264837631,PL -3264837632,3264839679,AT -3264839680,3264840191,UA -3264840192,3264840447,DE -3264840448,3264840703,IT -3264840704,3264840959,PT -3264841216,3264841471,PL -3264841472,3264841727,LV -3264841728,3264844031,GB -3264844032,3264844287,BG -3264844288,3264844799,DE -3264844800,3264845311,UA -3264845312,3264845951,DE -3264845952,3264846079,GB -3264846208,3264846335,AE -3264846336,3264846463,GB -3264846464,3264846591,NO -3264846848,3264846911,DK -3264846912,3264847103,CY -3264847232,3264847263,CH -3264847264,3264847295,LI -3264847296,3264847359,CY -3264847488,3264847615,RU -3264847616,3264847679,PL -3264847680,3264847743,FI -3264847872,3264849919,DE -3264849920,3264850431,GB -3264850688,3264850943,LV -3264850944,3264851967,IT -3264851968,3264854015,CH -3264854016,3264854271,GB -3264854528,3264854783,DE -3264854784,3264855039,IT -3264855040,3264855551,CH -3264855552,3264856063,DE -3264856064,3264861695,IT -3264861696,3264862207,FR -3264862208,3264862463,PL -3264862464,3264862719,AT -3264862720,3264862975,GB -3264862976,3264863231,DE -3264863232,3264864255,AT -3264864256,3264872447,RO -3264872448,3264888831,GB -3264888832,3264897023,RU -3264897024,3264905215,GB -3264905216,3264913407,CY -3264913408,3264921599,GB -3264921600,3264929791,LU -3264929792,3264937983,SK -3264937984,3265003519,GB -3265003520,3265005567,DE -3265009664,3265009919,FR -3265009920,3265010175,DE -3265011712,3265018879,DE -3265018880,3265019903,HK -3265036288,3265044479,DE -3265044736,3265044991,DE -3265045760,3265046015,TR -3265046528,3265048575,DE -3265050624,3265052671,DE -3265053696,3265054207,DE -3265055232,3265055743,FR -3265056256,3265056511,DE -3265056768,3265069055,DE -3265069056,3265134591,FI -3265134592,3265134847,CH -3265134848,3265134879,BE -3265134880,3265135017,CH -3265135018,3265135018,BE -3265135019,3265135039,CH -3265135040,3265135071,BE -3265135072,3265137983,CH -3265137984,3265138047,NL -3265138048,3265138303,CH -3265138304,3265138307,NL -3265138308,3265138599,CH -3265138600,3265138607,NL -3265138608,3265139967,CH -3265139968,3265139975,BE -3265139976,3265139999,CH -3265140000,3265140015,BE -3265140016,3265140119,CH -3265140120,3265140143,BE -3265140144,3265140159,CH -3265140160,3265140191,BE -3265140192,3265141551,CH -3265141552,3265141555,IE -3265141556,3265141759,CH -3265141760,3265141775,GB -3265141776,3265141791,CH -3265141792,3265141839,GB -3265141840,3265141855,CH -3265141856,3265141887,GB -3265141888,3265142220,CH -3265142221,3265142221,GB -3265142222,3265142783,CH -3265142784,3265150975,MT -3265150976,3265159167,AD -3265159168,3265167359,FR -3265167360,3265175551,AT -3265175552,3265183743,NL -3265183744,3265191935,BY -3265191936,3265200127,CH -3265200128,3265265663,GB -3265265664,3265331199,SK -3265331200,3265340415,GB -3265340416,3265340671,DE -3265340672,3265340927,GB -3265340928,3265341183,CH -3265341184,3265341279,AT -3265341312,3265341439,FR -3265341440,3265341695,GB -3265341696,3265341951,DE -3265341952,3265343487,GB -3265343488,3265347583,DE -3265347584,3265352703,FR -3265352704,3265352959,BE -3265352960,3265353215,FR -3265353216,3265355263,DE -3265355264,3265355775,FR -3265355776,3265357055,BE -3265357056,3265357311,FR -3265357312,3265357567,DE -3265357568,3265357823,BE -3265357824,3265358847,NL -3265358848,3265359103,BE -3265359104,3265359871,NL -3265359872,3265360127,CH -3265360128,3265360383,GB -3265360384,3265360895,CH -3265360896,3265361919,GB -3265361920,3265363967,IT -3265363968,3265366015,ES -3265366080,3265366271,BE -3265366272,3265366527,HU -3265366528,3265367039,DK -3265367040,3265367295,AT -3265367296,3265367551,ES -3265367552,3265367807,SE -3265367808,3265369343,DK -3265369344,3265369599,IL -3265369600,3265369855,SE -3265369856,3265370111,DE -3265370112,3265370623,DK -3265370880,3265376255,DE -3265376256,3265376511,IT -3265376512,3265378303,GB -3265378304,3265380095,NL -3265380096,3265384447,GB -3265384448,3265386495,DE -3265386496,3265387519,NL -3265388544,3265396735,GB -3265396736,3265527807,DE -3265527808,3265593343,GB -3265593344,3265594367,RU -3265594880,3265595391,UA -3265595392,3265595903,PL -3265596416,3265596927,GB -3265596928,3265597439,FR -3265597440,3265597951,MC -3265597952,3265599999,RU -3265600512,3265601023,GB -3265601024,3265601535,RU -3265601536,3265601791,SE -3265601792,3265602047,CH -3265602048,3265602303,NL -3265602560,3265602815,IT -3265602816,3265603071,IE -3265603328,3265603583,MD -3265603584,3265603839,DE -3265603840,3265604095,PL -3265604096,3265604351,GB -3265604352,3265604607,FR -3265604608,3265604863,CH -3265604864,3265605119,RU -3265605120,3265605375,UA -3265605376,3265605631,CZ -3265605632,3265605887,PL -3265605888,3265606143,FR -3265606144,3265606399,RU -3265606400,3265606655,BE -3265606656,3265606911,AT -3265606912,3265607167,RU -3265607168,3265607423,PL -3265607424,3265607679,DK -3265607936,3265608191,CZ -3265608448,3265608703,SE -3265608704,3265608959,GB -3265608960,3265609471,RU -3265609472,3265609727,UA -3265609728,3265617919,NL -3265617920,3265626111,SI -3265626112,3265634303,JO -3265634304,3265642495,IE -3265642496,3265650687,GB -3265650688,3265658879,SE -3265658880,3265724415,AT -3265724416,3265789951,FR -3265789952,3265867775,GB -3265868288,3265868543,GB -3265868800,3265869055,DE -3265871872,3265875967,GB -3265880064,3265886207,GB -3265887232,3265887487,GB -3265887488,3265887743,PT -3265887744,3265888255,PL -3265888256,3265896447,GB -3265902336,3265902591,FR -3265904384,3265904639,RO -3265904640,3265904895,DE -3265905152,3265905663,GB -3265905920,3265906175,GB -3265906176,3265906431,DE -3265906432,3265906687,CH -3265906688,3265906943,AT -3265906944,3265907199,ES -3265907200,3265907455,DE -3265907456,3265907711,FR -3265907712,3265908735,UA -3265908736,3265908991,NL -3265908992,3265909247,RO -3265909248,3265909503,UA -3265909504,3265909759,DE -3265909760,3265910015,RO -3265910272,3265910527,FR -3265910528,3265910783,PT -3265910784,3265911295,DE -3265911296,3265911551,GB -3265911552,3265911807,CH -3265911808,3265912063,PL -3265912064,3265912319,GB -3265912320,3265912575,DE -3265912832,3265913087,CZ -3265913088,3265913343,SE -3265913344,3265914367,PL -3265914624,3265914879,BG -3265914880,3265915135,GR -3265915136,3265915391,RO -3265915392,3265915647,GB -3265915648,3265915903,RO -3265915904,3265916159,PL -3265916416,3265916671,UA -3265916672,3265916927,DE -3265916928,3265917183,FR -3265917184,3265917439,PL -3265917696,3265917951,SE -3265917952,3265918207,GB -3265918464,3265918719,AT -3265918720,3265918975,RU -3265918976,3265919231,NL -3265919232,3265919487,FR -3265919488,3265919743,RU -3265919744,3265919999,DE -3265920000,3265920255,CZ -3265920512,3265920767,GB -3265920768,3265921023,RU -3265921024,3265986559,AE -3265986560,3266052095,NL -3266052096,3266322431,DE -3266322432,3266330623,LT -3266330624,3266338815,GB -3266338816,3266339071,RU -3266339072,3266339327,UA -3266339840,3266340095,RU -3266340096,3266340607,PL -3266340608,3266340863,FI -3266340864,3266341119,CH -3266341120,3266341375,GB -3266341376,3266341631,DE -3266341888,3266342143,KW -3266342144,3266342399,CH -3266342400,3266342655,BE -3266342656,3266342911,KG -3266342912,3266343167,SI -3266343168,3266343423,GR -3266343424,3266343679,RU -3266343680,3266343935,RO -3266343936,3266344191,CH -3266344448,3266344703,RU -3266344704,3266344959,ES -3266344960,3266345983,DE -3266345984,3266346495,GB -3266346496,3266346751,IT -3266346752,3266347007,FR -3266351360,3266352607,GB -3266352896,3266353567,GB -3266353584,3266353591,GB -3266353664,3266353671,GB -3266353680,3266353687,GB -3266353776,3266353783,US -3266353856,3266353863,GB -3266353880,3266353887,GB -3266353896,3266353903,GB -3266353920,3266354175,GB -3266354688,3266355199,GB -3266355200,3266363391,RO -3266363392,3266371583,GB -3266371584,3266379775,HU -3266379776,3266380799,UA -3266380800,3266381823,PL -3266381824,3266382847,FR -3266382848,3266383871,RU -3266383872,3266384895,IL -3266384896,3266385919,RU -3266385920,3266386943,UA -3266386944,3266387967,PL -3266387968,3266396159,FR -3266396160,3266412543,IT -3266412544,3266420735,AT -3266420736,3266428927,GB -3266428928,3266437119,GR -3266437120,3266445311,GL -3266445312,3266510847,NL -3266510848,3266543615,ES -3266543616,3266576383,IT -3266576384,3266616575,DE -3266617328,3266617343,GB -3266617344,3266627583,DE -3266627584,3266628095,SE -3266628096,3266629119,DE -3266629632,3266633727,DE -3266634392,3266634399,EE -3266635776,3266641919,DE -3266641920,3266707455,PL -3266707456,3266772991,DK -3266772992,3266781183,IT -3266781184,3266789375,PL -3266789376,3266794361,IT -3266794362,3266794362,SM -3266794363,3266797567,IT -3266797568,3266797823,GB -3266797824,3266798207,ES -3266798208,3266798847,GB -3266798848,3266798879,CZ -3266798880,3266802367,GB -3266802368,3266802399,BG -3266802400,3266803215,GB -3266803216,3266803219,FR -3266803220,3266804095,GB -3266804096,3266804127,NL -3266804128,3266804479,GB -3266804480,3266804735,NL -3266804736,3266805759,GB -3266805760,3266813951,AT -3266813952,3266822143,UA -3266822144,3266830335,FR -3266830336,3266838527,BE -3266838528,3266969599,IT -3266969600,3267035135,RU -3267035136,3267039231,NO -3267039232,3267040255,DE -3267040256,3267041279,RO -3267042304,3267043327,UA -3267043328,3267044351,GB -3267045376,3267046399,PL -3267046400,3267047423,NL -3267047424,3267048447,UA -3267048448,3267049471,PL -3267049472,3267050495,GB -3267050496,3267051519,SE -3267051520,3267052543,DE -3267052544,3267053567,LV -3267053568,3267054591,PL -3267054592,3267055615,NL -3267055616,3267056639,PS -3267056640,3267057663,IL -3267057664,3267058687,CH -3267058688,3267059711,AT -3267059712,3267060735,NL -3267060736,3267061759,LV -3267061760,3267063807,UA -3267063808,3267064831,BE -3267064832,3267065855,PL -3267066880,3267067903,IT -3267067904,3267068927,UA -3267068928,3267069951,BG -3267069952,3267070975,KZ -3267070976,3267071999,DE -3267072000,3267073023,PL -3267073024,3267075071,UA -3267075072,3267076095,CH -3267076096,3267078143,DE -3267078144,3267079167,FR -3267079168,3267080191,IT -3267080192,3267081215,AT -3267081216,3267082239,PL -3267082240,3267083263,DE -3267084288,3267085311,FR -3267085312,3267086335,RU -3267086336,3267087359,PL -3267087360,3267088383,RU -3267088384,3267089407,UA -3267089408,3267090431,FI -3267090432,3267091455,UA -3267091456,3267092479,DE -3267092480,3267093503,FR -3267093504,3267094527,RU -3267094528,3267095551,FI -3267095552,3267096575,PL -3267096576,3267097599,DE -3267097600,3267098623,KZ -3267098624,3267098879,GB -3267098880,3267098895,FR -3267098896,3267099007,GB -3267099008,3267099043,FR -3267099044,3267099135,GB -3267099136,3267099263,DE -3267099264,3267099327,NL -3267099328,3267099383,GB -3267099384,3267099387,NL -3267099388,3267099455,BE -3267099456,3267099463,GB -3267099464,3267099647,BE -3267099648,3267100671,IT -3267100672,3267166207,FI -3267166208,3267231743,GB -3267231744,3267297279,RU -3267297280,3267357132,CH -3267357133,3267357133,US -3267357134,3267362815,CH -3267362816,3267428351,DK -3267428352,3267493887,GB -3267501056,3267504127,GB -3267511296,3267512319,FR -3267513344,3267514367,FR -3267514368,3267515391,DE -3267520512,3267521535,DE -3267522560,3267523583,DE -3267527680,3267528703,FR -3267529728,3267530751,AT -3267531776,3267532799,FR -3267534848,3267536895,FR -3267537920,3267538943,FR -3267549184,3267550207,DK -3267559424,3267624959,DE -3267627372,3267627375,DE -3267627408,3267627411,GB -3267628396,3267628415,FR -3267630080,3267631095,GB -3267631096,3267631103,IT -3267634176,3267635199,GB -3267648320,3267648335,GB -3267657552,3267657555,RO -3267657560,3267657563,RO -3267657576,3267657583,RO -3267657696,3267657703,RO -3267657712,3267657727,RO -3267661904,3267661967,ES -3267662784,3267662847,NO -3267662896,3267662911,IE -3267665920,3267666943,GB -3267670016,3267671039,ZA -3267681304,3267681331,FR -3267681340,3267681343,FR -3267681888,3267681903,FR -3267681956,3267681963,FR -3267683936,3267683967,PL -3267690496,3267691519,FI -3267691520,3267692543,SE -3267692544,3267741759,FI -3267741760,3267741791,SE -3267741792,3267756031,FI -3267756032,3267821567,SE -3267821568,3267839177,FR -3267839178,3267839178,RE -3267839179,3267845375,FR -3267845376,3267845631,GP -3267845632,3267846655,FR -3267846656,3267846911,MQ -3267846912,3267887103,FR -3267887104,3268017469,GB -3268017470,3268017470,KE -3268017471,3268149247,GB -3268149248,3268165631,EE -3268165632,3268173823,CH -3268173824,3268182015,MT -3268182016,3268198399,PL -3268198400,3268214783,MA -3268215584,3268215615,GB -3268215648,3268215679,GB -3268215712,3268215743,GB -3268215808,3268216063,GB -3268218112,3268218367,GB -3268219808,3268219823,GB -3268221440,3268221471,GB -3268221504,3268221599,GB -3268221696,3268221951,GB -3268222976,3268223167,GB -3268223200,3268223231,GB -3268224768,3268225023,US -3268226368,3268226399,GB -3268226496,3268226655,GB -3268226688,3268226815,GB -3268227328,3268227391,GB -3268227520,3268227615,GB -3268231168,3268231199,GB -3268231320,3268231359,GB -3268231392,3268231423,GB -3268231648,3268231679,GB -3268231744,3268231807,GB -3268232224,3268232243,GB -3268232352,3268232367,GB -3268232384,3268232415,GB -3268232480,3268232575,GB -3268232960,3268233087,GB -3268233984,3268234047,GB -3268234176,3268234239,GB -3268234560,3268234623,GB -3268235008,3268235263,GB -3268235264,3268235519,DE -3268235520,3268235775,GB -3268235936,3268236031,GB -3268236192,3268236207,GB -3268236544,3268236607,GB -3268236672,3268236799,GB -3268237824,3268237855,GB -3268237904,3268237911,GB -3268238336,3268238359,GB -3268238368,3268238399,GB -3268238472,3268238527,GB -3268238536,3268238543,GB -3268238552,3268238623,GB -3268238632,3268238783,GB -3268238816,3268238831,GB -3268239584,3268240127,GB -3268240160,3268240191,GB -3268240384,3268240399,GB -3268240480,3268240487,GB -3268240688,3268240695,GB -3268240712,3268240735,GB -3268240744,3268240751,GB -3268240976,3268240991,GB -3268241008,3268241023,GB -3268241544,3268241551,GB -3268241640,3268241655,GB -3268242496,3268242523,GB -3268242880,3268243071,GB -3268243328,3268243391,GB -3268244776,3268244783,GB -3268244792,3268244799,GB -3268245504,3268245759,GB -3268246272,3268246783,GB -3268246976,3268246991,GB -3268248320,3268248447,GB -3268248512,3268248543,GB -3268249600,3268251311,GB -3268251312,3268251327,IE -3268251328,3268251583,GB -3268251584,3268251615,DE -3268251616,3268251631,CH -3268251632,3268251647,GB -3268254464,3268254543,GB -3268254624,3268254639,GB -3268254896,3268254903,GB -3268255824,3268255863,GB -3268255896,3268255919,GB -3268255952,3268255959,GB -3268255968,3268255983,GB -3268256896,3268256959,GB -3268257024,3268257055,GB -3268257088,3268257119,GB -3268257416,3268257419,GB -3268257432,3268257439,IT -3268257464,3268257471,GB -3268257488,3268257527,GB -3268258560,3268258623,GB -3268258688,3268258751,GB -3268259520,3268259527,GB -3268259544,3268259551,GB -3268259560,3268259575,GB -3268259808,3268259815,GB -3268259832,3268260095,GB -3268260352,3268260383,GB -3268260416,3268260447,GB -3268260512,3268260607,GB -3268260640,3268260647,GB -3268261936,3268261951,GB -3268262768,3268262783,GB -3268262880,3268262887,GB -3268263232,3268263263,GB -3268263776,3268263783,GB -3268264736,3268264767,GB -3268265416,3268265431,GB -3268265984,3268266495,GB -3268266984,3268266991,GB -3268267536,3268267551,GB -3268267584,3268267599,GB -3268267616,3268267647,GB -3268267744,3268267775,GB -3268267952,3268267959,GB -3268268032,3268272127,GB -3268272728,3268272735,GB -3268273024,3268273151,GB -3268274112,3268274175,GB -3268274456,3268274459,GB -3268274528,3268274543,GB -3268274560,3268274591,GB -3268275984,3268275999,GB -3268276640,3268276655,GB -3268276672,3268276687,GB -3268276864,3268276895,GB -3268277056,3268277119,GB -3268277760,3268278015,GB -3268278464,3268278495,GB -3268280064,3268280319,GB -3268280320,3268345855,FR -3268345856,3268411391,GB -3268411392,3268476927,AT -3268476928,3268542463,CH -3268542464,3268607999,PT -3268608000,3268673535,FI -3268673536,3268739071,CZ -3268739072,3268739327,DE -3268739328,3268739583,PL -3268739584,3268739839,DE -3268739840,3268740095,GB -3268740096,3268740351,IL -3268740352,3268740607,DE -3268740608,3268740863,RO -3268740864,3268741119,CH -3268741376,3268741631,LV -3268741888,3268742143,AT -3268742144,3268742399,RU -3268742656,3268742911,BE -3268742912,3268743167,NL -3268743168,3268743423,RO -3268743680,3268743935,GB -3268743936,3268744191,ES -3268744448,3268744703,RU -3268744704,3268744959,PL -3268744960,3268745215,UA -3268745472,3268745727,RU -3268745728,3268745983,PL -3268745984,3268746239,DE -3268746240,3268746495,GB -3268746496,3268746751,IE -3268746752,3268747007,FR -3268747008,3268747263,DE -3268747264,3268755455,CZ -3268755456,3268763647,SE -3268763648,3268764159,RU -3268764160,3268764671,DE -3268764672,3268765183,LV -3268765184,3268765695,RU -3268765696,3268766719,UA -3268766720,3268767231,IL -3268767232,3268767743,RU -3268767744,3268768255,NL -3268768256,3268768767,BE -3268768768,3268769279,RU -3268769280,3268769791,SE -3268769792,3268770303,UA -3268770304,3268770815,RU -3268770816,3268771327,FR -3268771328,3268771839,NL -3268771840,3268788223,NO -3268788224,3268804607,CZ -3268804608,3268869375,FR -3268869376,3268869631,PF -3268869632,3268870143,FR -3268870144,3268935679,FI -3268935680,3269066751,GB -3269066752,3269132287,SE -3269132288,3269197823,GR -3269197824,3269263359,ES -3269264640,3269264895,DE -3269265856,3269265919,DE -3269265920,3269266175,GB -3269266688,3269266943,DE -3269266944,3269267455,GB -3269272576,3269272583,DE -3269272704,3269272831,DE -3269272832,3269272847,GB -3269272848,3269272863,NL -3269272864,3269272887,GB -3269272896,3269273087,NL -3269273088,3269273343,DE -3269273600,3269273855,GB -3269273856,3269275647,DE -3269275904,3269276159,DE -3269276160,3269276415,GB -3269277184,3269277695,FR -3269277696,3269277759,GB -3269277760,3269278719,NL -3269279232,3269279487,NL -3269279672,3269279679,CH -3269279744,3269280255,GB -3269280256,3269280271,DE -3269280272,3269280767,NL -3269280768,3269281023,GB -3269281024,3269281279,DE -3269281280,3269281535,FR -3269282048,3269282303,DE -3269282304,3269282559,GB -3269282560,3269282815,FR -3269283328,3269283583,DE -3269283872,3269283903,DE -3269284096,3269284351,GB -3269284864,3269285079,FR -3269285088,3269285135,DE -3269285136,3269285151,GB -3269285152,3269285215,DE -3269285216,3269285311,FR -3269285312,3269285327,DE -3269285336,3269285343,FR -3269285344,3269285631,GB -3269285632,3269285887,DE -3269286400,3269286471,DE -3269288688,3269288695,DE -3269288704,3269288959,DE -3269290560,3269290575,DE -3269290592,3269290687,DE -3269290736,3269290743,DE -3269291264,3269291519,DE -3269291520,3269291567,GB -3269291584,3269291647,GB -3269291776,3269292287,ES -3269293120,3269293151,DE -3269293208,3269293215,DE -3269293248,3269293279,DE -3269293376,3269293391,DE -3269293856,3269293887,DE -3269293920,3269293951,DE -3269294080,3269295103,GB -3269296232,3269296235,DE -3269296368,3269296375,DE -3269297152,3269297663,GB -3269298664,3269298671,DE -3269303040,3269303295,DE -3269303296,3269303423,GB -3269303552,3269303679,DE -3269305344,3269305351,DE -3269305856,3269306879,DE -3269307648,3269307903,DE -3269310656,3269310671,DE -3269310976,3269311231,DE -3269311872,3269311999,DE -3269313792,3269314175,DE -3269314192,3269314199,DE -3269315584,3269315591,DE -3269317632,3269317663,GB -3269317664,3269317671,IE -3269317672,3269317887,GB -3269317888,3269318399,DE -3269318400,3269318655,GB -3269318656,3269318983,DE -3269319008,3269319047,DE -3269319056,3269319071,DE -3269319136,3269320447,DE -3269320704,3269321727,GB -3269322240,3269322495,DE -3269322656,3269322671,DE -3269322752,3269323263,DE -3269326848,3269326855,DE -3269326960,3269326971,DE -3269326992,3269326999,DE -3269327024,3269327039,DE -3269327056,3269327103,DE -3269327760,3269327775,DE -3269327864,3269328383,DE -3269328896,3269459967,GB -3269459968,3269525503,ES -3269525504,3269591039,IR -3269591040,3269621759,RU -3269621760,3269623551,BY -3269623552,3269656575,RU -3269656576,3269722111,GB -3269722112,3269787647,CZ -3269787648,3269853183,NL -3269853184,3269918719,CH -3269918720,3269984255,DE -3269984256,3270049791,AT -3270049792,3270115327,DE -3270131712,3270148095,NO -3270148352,3270149887,FI -3270150656,3270151423,FI -3270152704,3270153727,FI -3270166528,3270167551,NO -3270205440,3270207487,ES -3270208512,3270209535,NL -3270234112,3270242303,NL -3270246400,3270377471,SE -3270377472,3270443007,GB -3270443008,3270508543,DK -3270508544,3270639615,FI -3270639616,3270640127,PL -3270640640,3270642175,RU -3270642176,3270642687,NO -3270642688,3270643199,DE -3270643200,3270643711,RU -3270643712,3270644223,AT -3270644224,3270644735,NL -3270644736,3270645247,DE -3270645760,3270646271,IL -3270646272,3270646783,RU -3270647296,3270647807,RU -3270647808,3270648063,TR -3270648064,3270648319,RU -3270648320,3270648575,CH -3270648576,3270648831,AT -3270648832,3270649087,SI -3270649088,3270649343,AT -3270649600,3270649855,PL -3270649856,3270650111,DK -3270650112,3270650367,AT -3270650368,3270650623,DK -3270650624,3270651903,FR -3270652416,3270652927,CH -3270652928,3270653183,PL -3270653184,3270653439,UA -3270653440,3270653695,NL -3270653696,3270653951,GB -3270654464,3270654719,BE -3270654720,3270655231,UA -3270655232,3270655487,IT -3270655488,3270655743,PL -3270655744,3270655999,CH -3270656000,3270664191,NL -3270664192,3270666239,UA -3270666240,3270667263,PL -3270667264,3270668287,SE -3270668288,3270669311,FR -3270669312,3270670335,UA -3270670336,3270672383,RU -3270672384,3270680575,GB -3270680576,3270684671,IL -3270684672,3270688767,FR -3270688768,3270772079,IT -3270772080,3270772087,NL -3270772088,3270836223,IT -3270836224,3270901759,DE -3270901760,3270903807,IT -3270903808,3270905855,SE -3270905856,3270909951,IT -3270911840,3270911871,PL -3270911872,3270911935,DE -3270911968,3270911999,NL -3270913024,3270920703,DE -3270920704,3270921215,UA -3270921216,3270921471,DK -3270921472,3270921727,UA -3270921728,3270922239,GB -3270923264,3270924287,DE -3270926336,3270926591,AT -3270926592,3270926847,CH -3270926848,3270927103,PL -3270927104,3270927359,UA -3270927616,3270927871,FR -3270927872,3270928127,HU -3270928384,3270928895,UA -3270928896,3270929407,PL -3270929408,3270929919,GB -3270929920,3270930431,BG -3270930432,3270931455,RU -3270931456,3270931967,UA -3270931968,3270932479,CH -3270932480,3270932991,UA -3270932992,3270933503,DE -3270933504,3270934015,PL -3270934016,3270934527,IT -3270934528,3270967295,DE -3270967296,3270968319,PL -3270968320,3270968831,DE -3270968832,3270969343,SE -3270969344,3270969855,CH -3270969856,3270970367,AT -3270970368,3270970879,UA -3270970880,3270971391,RU -3270971392,3270972415,UA -3270972416,3270973951,RU -3270973952,3270974463,FR -3270974464,3270974975,IT -3270974976,3270975487,NL -3270975744,3270975999,RU -3270976000,3270976255,FR -3270976256,3270976511,UA -3270976512,3270976767,HU -3270976768,3270977023,UA -3270977024,3270977279,NL -3270977280,3270977535,RS -3270977536,3270977791,RU -3270977792,3270978047,PL -3270978048,3270978303,UA -3270979072,3270979327,PL -3270979328,3270979583,AT -3270979584,3270979839,NO -3270979840,3270980095,GB -3270980096,3270980351,AM -3270980352,3270980607,RU -3270980608,3270980863,MD -3270980864,3270981631,RU -3270981632,3270981887,IT -3270981888,3270982143,AT -3270982400,3270982655,TR -3270982656,3270982911,UA -3270982912,3270983167,DK -3270983168,3270983423,PL -3270983424,3270983679,NL -3270983680,3270991871,GB -3270991872,3271000063,NL -3271000064,3271008255,RU -3271008256,3271008767,BE -3271008768,3271009279,SI -3271009280,3271009791,MD -3271009792,3271010303,IL -3271010304,3271010815,RU -3271010816,3271011327,GB -3271011328,3271013375,UA -3271013376,3271013887,US -3271014400,3271014911,RU -3271015424,3271015935,DK -3271015936,3271016447,RU -3271016448,3271024639,RS -3271024640,3271032831,GB -3271032832,3271098367,NO -3271098368,3271163903,SI -3271163904,3271229439,FR -3271229440,3271360511,FI -3271360512,3271363407,GB -3271363408,3271363415,AT -3271363416,3271363423,GB -3271363424,3271363455,IT -3271363456,3271363471,GB -3271363472,3271363487,ZA -3271363488,3271363519,IT -3271363552,3271363583,FR -3271363584,3271365887,GB -3271365888,3271366143,DE -3271366144,3271366399,GB -3271366400,3271366655,NL -3271366656,3271371263,GB -3271371264,3271371519,IE -3271371520,3271371679,ZA -3271371680,3271371711,DE -3271371712,3271371775,CH -3271371776,3271372031,GB -3271372032,3271372287,BE -3271372288,3271372799,FR -3271372800,3271373055,SE -3271373056,3271373311,BE -3271373312,3271373567,GB -3271373568,3271373823,FR -3271373824,3271374079,DE -3271374080,3271374335,BE -3271374336,3271374847,DE -3271374848,3271375359,GB -3271375360,3271375871,CH -3271375872,3271376383,BE -3271376384,3271376447,GB -3271376448,3271376463,FR -3271376464,3271376479,IT -3271376480,3271376511,FR -3271376512,3271376639,DE -3271376640,3271376895,AT -3271376896,3271377407,ES -3271377408,3271377919,NL -3271377920,3271378687,BE -3271378688,3271378943,SE -3271378944,3271380991,GB -3271380992,3271381247,BE -3271381248,3271381503,NO -3271381504,3271381759,SE -3271381760,3271382527,IT -3271382528,3271383039,IL -3271383040,3271383295,CH -3271383296,3271383551,BE -3271383552,3271384063,GB -3271384064,3271384319,CH -3271384320,3271384575,BE -3271384576,3271384831,GB -3271384832,3271385087,BE -3271385088,3271385159,DE -3271385160,3271385183,GB -3271385184,3271385215,ES -3271385216,3271385343,NL -3271385344,3271391231,DE -3271391232,3271391743,NL -3271391744,3271391999,NO -3271392000,3271392255,DE -3271392256,3271392511,FR -3271392512,3271392767,BE -3271392768,3271393279,FR -3271393280,3271393791,AT -3271393792,3271394047,DK -3271394048,3271394303,DE -3271394304,3271394559,BE -3271394560,3271394815,GB -3271394816,3271395071,DE -3271395072,3271395327,GB -3271395328,3271396863,IT -3271396864,3271397119,GB -3271397120,3271397375,NL -3271397376,3271397887,CH -3271397888,3271397951,FR -3271397952,3271397983,IT -3271397984,3271397999,NL -3271398000,3271398015,FR -3271398016,3271398047,NL -3271398048,3271398079,ZA -3271398080,3271398143,GB -3271398144,3271398303,NL -3271398304,3271398335,DE -3271398336,3271398399,IT -3271398400,3271398911,DE -3271398912,3271399167,GB -3271399168,3271400959,BE -3271400960,3271401215,CH -3271401216,3271401471,DE -3271401472,3271403263,DK -3271403264,3271403519,DE -3271403520,3271403775,NL -3271403776,3271403903,ZA -3271403904,3271403919,GB -3271403920,3271403935,IE -3271403936,3271403967,GB -3271403968,3271403983,ZA -3271403984,3271403991,GB -3271403992,3271403999,ZA -3271404000,3271404031,DE -3271404032,3271405311,NL -3271405312,3271405567,FR -3271405568,3271405823,ES -3271405824,3271406079,AT -3271406080,3271406335,ZA -3271406336,3271406591,RO -3271406592,3271406847,GB -3271406848,3271407615,AT -3271407616,3271407871,DE -3271407872,3271408127,AT -3271408128,3271408383,DE -3271408384,3271408639,FR -3271408640,3271408895,BE -3271408896,3271409151,ES -3271409152,3271409407,IT -3271409408,3271409663,GB -3271409664,3271417855,BE -3271417856,3271424071,FR -3271424072,3271424079,IT -3271424080,3271424095,IE -3271424096,3271424111,GB -3271424112,3271424127,BE -3271424128,3271424191,GB -3271424192,3271424511,FR -3271424512,3271425023,GB -3271425024,3271425279,DE -3271425280,3271425535,DK -3271425536,3271426047,DE -3271426048,3271491583,FR -3271491584,3271557119,DK -3271557120,3271589887,BE -3271589888,3271688191,NO -3271691776,3271692031,US -3271692032,3271692287,GB -3271694080,3271694335,IE -3271694592,3271695103,GB -3271696384,3271698431,GB -3271704576,3271712767,RU -3271712768,3271720959,LV -3271720960,3271729151,GB -3271729152,3271737343,DE -3271737344,3271738367,RU -3271738368,3271738879,RO -3271738880,3271739391,RU -3271739392,3271739903,AT -3271739904,3271740415,IE -3271740416,3271740927,UA -3271740928,3271741439,RU -3271741440,3271741951,PL -3271741952,3271742463,RU -3271742976,3271743999,RU -3271744000,3271744511,RO -3271744512,3271745023,AT -3271745024,3271745535,PL -3271745536,3271746047,GB -3271746048,3271746559,CZ -3271746560,3271747071,US -3271747072,3271747583,KZ -3271747584,3271748095,RU -3271748096,3271748607,GR -3271748608,3271749119,UA -3271749120,3271750143,RU -3271750656,3271751167,GB -3271751168,3271751679,RO -3271751680,3271752191,NL -3271752192,3271752703,GB -3271752704,3271753215,RU -3271753216,3271753727,PL -3271753728,3271770111,FR -3271770112,3271786495,AT -3271786496,3271788543,UA -3271789568,3271790591,RU -3271790592,3271791615,LV -3271791616,3271792639,UA -3271792640,3271793663,PL -3271793664,3271794687,UA -3271794688,3271795711,IT -3271795712,3271796735,NL -3271796736,3271797759,SK -3271797760,3271798783,SA -3271798784,3271799807,NL -3271799808,3271800831,RU -3271800832,3271801855,GB -3271801856,3271802879,PS -3271802880,3271803903,DE -3271803904,3271804927,UA -3271804928,3271805951,PL -3271805952,3271806975,UA -3271808000,3271809023,DE -3271809024,3271810047,RU -3271810048,3271811071,PL -3271811072,3271812095,UA -3271812096,3271813119,ES -3271813120,3271814143,PL -3271814144,3271815167,UA -3271815168,3271816191,RU -3271816192,3271817215,UA -3271817216,3271818239,DE -3271818240,3271819263,RU -3271819264,3271884799,DE -3271884800,3271901183,UA -3271901184,3271909375,ES -3271909888,3271910399,DE -3271910400,3271910911,DK -3271910912,3271911423,LV -3271911424,3271911935,LI -3271911936,3271912959,UA -3271912960,3271913215,SK -3271913216,3271913471,SE -3271913472,3271913983,NO -3271913984,3271914495,RO -3271914496,3271915007,ES -3271915008,3271915519,SE -3271915520,3271916031,DE -3271916032,3271916543,GB -3271916544,3271917311,UA -3271917312,3271925759,RU -3271925760,3271926015,DK -3271926272,3271926527,RU -3271926528,3271926783,NL -3271926784,3271927295,SI -3271927296,3271927551,NO -3271927552,3271927807,GB -3271928064,3271928319,GB -3271928576,3271928831,CH -3271928832,3271929087,IE -3271929088,3271929343,LB -3271929344,3271929599,NO -3271929600,3271929855,GB -3271930112,3271930367,HU -3271930368,3271930623,RU -3271930624,3271930879,GE -3271930880,3271931135,CH -3271931136,3271931647,PL -3271931648,3271931903,NO -3271931904,3271932159,UA -3271932160,3271932415,SE -3271932416,3271932671,CZ -3271932672,3271932927,DE -3271932928,3271933183,PL -3271933184,3271933439,GB -3271933440,3271933695,SE -3271933696,3271933951,DE -3271933952,3272015871,FR -3272019968,3272020991,IT -3272020992,3272024063,DK -3272024064,3272032255,IE -3272032256,3272040447,SE -3272040448,3272048639,FR -3272048640,3272056831,NL -3272056832,3272065023,RU -3272065024,3272073727,GB -3272073728,3272073855,IE -3272073856,3272081407,GB -3272081408,3272087551,PT -3272087552,3272088575,MR -3272088576,3272089599,PT -3272089600,3272090111,NO -3272090112,3272091647,RU -3272091648,3272092671,UA -3272092672,3272093183,RU -3272093184,3272093695,RO -3272094208,3272094719,AM -3272094720,3272095231,PL -3272095232,3272095743,FI -3272095744,3272096255,UA -3272096256,3272096767,PT -3272096768,3272097279,FI -3272097280,3272097791,RU -3272097792,3272106239,GB -3272106240,3272106495,PL -3272106496,3272106751,SE -3272106752,3272107007,PL -3272107008,3272107263,GB -3272107264,3272107519,PL -3272107776,3272108031,GB -3272108032,3272108287,DE -3272108288,3272108543,RO -3272108544,3272109055,PL -3272109056,3272109311,CH -3272109312,3272109567,TR -3272109824,3272110079,FR -3272110336,3272110591,CH -3272110848,3272111103,LV -3272111104,3272111615,GB -3272112128,3272112383,RO -3272112384,3272113151,DE -3272113152,3272113407,FR -3272113408,3272113919,GB -3272113920,3272114175,AT -3272114176,3272122367,PL -3272122368,3272131071,GB -3272131072,3272131583,RO -3272131584,3272132095,GB -3272132096,3272132607,CH -3272132608,3272133119,UA -3272133120,3272133631,GB -3272133632,3272134143,EE -3272134144,3272134655,RO -3272134656,3272135167,NL -3272135168,3272135679,CH -3272135680,3272136191,AT -3272136192,3272136703,FR -3272136704,3272137215,PL -3272137216,3272137727,LT -3272137728,3272138239,PL -3272138240,3272138751,BG -3272138752,3272146943,DE -3272146944,3272212479,RU -3272212480,3272212991,GB -3272212992,3272213375,ES -3272213376,3272213391,IT -3272213392,3272213399,GB -3272213400,3272213407,ES -3272213408,3272213415,NL -3272213416,3272213423,ES -3272213424,3272213431,NL -3272213432,3272213439,GB -3272213440,3272213471,ES -3272213472,3272213487,CY -3272213488,3272213495,GB -3272213496,3272213503,ES -3272213504,3272213567,IT -3272213568,3272213575,GB -3272213576,3272213583,IE -3272213584,3272213599,DE -3272213600,3272213615,IT -3272213632,3272213639,NL -3272213656,3272213663,IT -3272213672,3272213679,IT -3272213696,3272213743,IT -3272213752,3272213759,IT -3272213760,3272214015,NL -3272214016,3272214271,ES -3272214272,3272214351,GB -3272214352,3272214407,FR -3272214432,3272214463,SE -3272214528,3272215039,FR -3272215040,3272215295,ES -3272215296,3272215551,NL -3272215552,3272215807,CH -3272215808,3272215823,NL -3272215872,3272215879,BE -3272215884,3272215919,CH -3272215920,3272215935,NL -3272215936,3272215999,GB -3272216016,3272216031,DE -3272216032,3272216039,IT -3272216040,3272216047,GB -3272216048,3272216055,IT -3272216216,3272216223,FR -3272216320,3272216351,NL -3272216352,3272216383,DE -3272216384,3272216447,CH -3272216452,3272216455,NL -3272216464,3272216479,FR -3272216480,3272216495,IR -3272216512,3272216575,IT -3272216576,3272216895,GB -3272216896,3272216911,FR -3272216912,3272216927,DE -3272216960,3272217007,GB -3272217088,3272217151,GB -3272217152,3272217175,BE -3272217216,3272217279,BE -3272217280,3272217303,DE -3272217304,3272217327,BE -3272217344,3272217599,GB -3272217600,3272217631,CH -3272217856,3272217875,ES -3272217880,3272217895,IT -3272217896,3272217919,ES -3272217920,3272217983,DE -3272217984,3272218079,ES -3272218112,3272218623,GB -3272218632,3272218639,RU -3272218688,3272218719,DE -3272218752,3272218879,GB -3272218880,3272219135,BE -3272219136,3272219391,NL -3272219392,3272219647,GB -3272219648,3272219903,FR -3272219904,3272220159,DE -3272220160,3272220415,FR -3272220416,3272221183,GB -3272221184,3272221439,NL -3272221440,3272221447,SE -3272221448,3272221455,NO -3272221456,3272221463,SE -3272221472,3272221495,SE -3272221504,3272221519,SE -3272221696,3272221951,NL -3272221952,3272222207,GB -3272222208,3272222463,ES -3272222464,3272222719,NL -3272222720,3272223015,GB -3272223024,3272223039,GB -3272223232,3272223487,NL -3272223488,3272223503,SG -3272223520,3272223551,HK -3272223744,3272225023,GB -3272225280,3272225535,IT -3272225536,3272225791,GB -3272225792,3272225815,IT -3272225856,3272225919,GB -3272225920,3272226047,IT -3272226048,3272226815,FR -3272226816,3272227071,GB -3272227072,3272227327,PT -3272227328,3272227359,US -3272227360,3272227511,GB -3272227520,3272227583,GB -3272227584,3272227839,FR -3272227840,3272228095,ES -3272228096,3272228223,GB -3272228224,3272228351,ES -3272228352,3272228607,FR -3272228608,3272228623,NL -3272228624,3272228631,CY -3272228632,3272228639,NL -3272228640,3272228671,IT -3272228672,3272228703,DE -3272228704,3272228735,FR -3272228736,3272228799,NL -3272228800,3272228863,CH -3272228864,3272237055,LU -3272237056,3272245247,IM -3272245248,3272261631,FI -3272261632,3272261887,MT -3272261888,3272262143,BG -3272262144,3272262399,IL -3272262400,3272262655,DE -3272262656,3272262911,NO -3272262912,3272263167,SA -3272263168,3272263423,RU -3272263424,3272263935,GB -3272263936,3272264191,ES -3272264192,3272264447,NL -3272264448,3272264703,DE -3272264704,3272264959,LV -3272264960,3272265215,RU -3272265216,3272265471,AT -3272265472,3272265727,DK -3272265728,3272265983,DE -3272266240,3272266495,UA -3272266496,3272266751,SE -3272266752,3272267007,NL -3272267008,3272267263,GB -3272267264,3272267519,RU -3272267776,3272268031,LV -3272268032,3272268287,MT -3272268288,3272268543,UA -3272268800,3272269055,IL -3272269056,3272269311,GB -3272269568,3272351743,GB -3272351744,3272352767,PL -3272352768,3272353791,UA -3272353792,3272355839,CH -3272355840,3272356351,GB -3272356352,3272356607,ES -3272356608,3272356863,GB -3272356864,3272357887,RO -3272357888,3272358911,UA -3272358912,3272359935,NL -3272359936,3272368127,RU -3272368128,3272376319,KZ -3272376320,3272384511,SK -3272384512,3272392703,LT -3272392704,3272400895,AT -3272401216,3272401247,PL -3272401280,3272401407,NL -3272402048,3272402063,SE -3272402560,3272402623,GB -3272402944,3272403007,HU -3272403072,3272403199,NL -3272403968,3272404991,FR -3272404992,3272406015,DE -3272406016,3272407039,NL -3272409088,3272417279,BE -3272417280,3272418559,FR -3272418560,3272418815,GB -3272418816,3272419327,PL -3272419328,3272420351,DE -3272420864,3272420991,PL -3272420992,3272421119,DK -3272421376,3272421887,RO -3272421888,3272422143,RU -3272422144,3272422399,GB -3272422400,3272422911,CH -3272423424,3272423935,BE -3272423936,3272424447,FR -3272424448,3272425471,DE -3272425472,3272441855,GB -3272441856,3272474623,LV -3272474624,3272474879,FR -3272474880,3272475135,NL -3272475136,3272475391,RU -3272475392,3272475903,PL -3272475904,3272476159,FR -3272476160,3272476415,RO -3272476672,3272476927,DE -3272476928,3272477183,GR -3272477440,3272477695,PL -3272477696,3272477951,RU -3272477952,3272478207,RO -3272478208,3272478463,DK -3272478464,3272478719,FI -3272478720,3272478975,GB -3272478976,3272479231,UA -3272479488,3272479743,SA -3272479744,3272480255,SE -3272480256,3272480511,FR -3272480512,3272480767,CH -3272481024,3272481279,SE -3272481792,3272482047,IT -3272482048,3272482303,NL -3272482304,3272482559,PL -3272482560,3272482815,BE -3272482816,3272491007,RU -3272491008,3272499199,GB -3272499200,3272499711,RU -3272499712,3272500223,NL -3272500224,3272500735,RU -3272500736,3272501247,IT -3272501248,3272502783,RU -3272502784,3272503295,KW -3272503808,3272504319,RU -3272504320,3272504831,PL -3272504832,3272505343,RU -3272505344,3272505855,AT -3272505856,3272506879,UA -3272506880,3272507391,CH -3272507392,3272515583,CY -3272515584,3272523775,LT -3272523776,3272540159,DE -3272540160,3272605695,CH -3272605696,3272613887,BE -3272613888,3272622079,RU -3272623104,3272624127,DE -3272624128,3272625151,RU -3272625152,3272626175,UA -3272626176,3272627199,DE -3272627200,3272628223,NL -3272628224,3272629247,UA -3272629248,3272638463,RU -3272638464,3272646655,ES -3272646656,3272647385,GB -3272647386,3272647386,DE -3272647387,3272654847,GB -3272654848,3272663039,FI -3272663040,3272671231,AT -3272671232,3272736767,SE -3272737792,3272738815,GB -3272738816,3272739839,IL -3272739840,3272741887,UA -3272741888,3272743935,RU -3272743936,3272744959,UA -3272744960,3272753151,RU -3272753152,3272769535,NL -3272769536,3272802303,NO -3272802304,3272867839,RU -3272867840,3272868863,PL -3272868864,3272869887,UA -3272869888,3272870911,NL -3272870912,3272871935,FR -3272871936,3272872959,FI -3272873984,3272875007,BG -3272875008,3272876031,RU -3272876032,3272884223,NL -3272884224,3272892415,DE -3272892416,3272892927,UA -3272893440,3272893951,SE -3272893952,3272894463,RU -3272894976,3272895487,RO -3272895488,3272895999,GB -3272896000,3272896511,PL -3272896512,3272897535,DE -3272897536,3272898047,FI -3272898048,3272898559,UA -3272898560,3272899071,DE -3272899328,3272899583,PL -3272899584,3272900095,UA -3272900096,3272900607,LV -3272900608,3272900863,RU -3272900864,3272901119,AT -3272901120,3272901375,UA -3272901376,3272901631,PL -3272901632,3272901887,AT -3272901888,3272902143,DE -3272902144,3272902399,PL -3272902400,3272902655,RU -3272902656,3272902911,IR -3272902912,3272903167,RU -3272903168,3272903423,PL -3272903424,3272903679,AT -3272903680,3272903935,RU -3272903936,3272904191,DK -3272904192,3272904447,SI -3272904704,3272904959,NL -3272904960,3272905215,RO -3272905216,3272905727,CH -3272905728,3272905983,UA -3272905984,3272906239,FI -3272906240,3272906495,PL -3272906496,3272906751,EE -3272906752,3272907007,HU -3272907008,3272907263,HR -3272907264,3272907519,UA -3272907520,3272907775,GB -3272907776,3272908031,RO -3272908032,3272908287,CH -3272908288,3272908543,AT -3272908544,3272908799,DE -3272908800,3272916991,SK -3272916992,3272917503,MC -3272917504,3272918527,RU -3272918528,3272919039,FR -3272919040,3272919551,PL -3272919552,3272920063,RO -3272920064,3272920575,NL -3272920576,3272921087,SE -3272921088,3272921599,CH -3272921600,3272922111,DE -3272922112,3272922623,PL -3272922624,3272923135,GB -3272923136,3272923647,ES -3272923648,3272924159,PL -3272924160,3272924671,DE -3272924672,3272925183,GB -3272925184,3272933375,DE -3272933376,3272935183,GB -3272935184,3272935199,HU -3272935200,3272941599,GB -3272941600,3272941615,FR -3272941616,3272942335,GB -3272942336,3272942591,ES -3272942592,3272943047,GB -3272943048,3272943055,DE -3272943056,3272943559,GB -3272943560,3272943567,DE -3272943568,3272943903,GB -3272943904,3272943907,HK -3272943908,3272966143,GB -3272966144,3272982527,US -3272982528,3272998911,GB -3272998912,3273007103,PT -3273007104,3273015295,CZ -3273015296,3273023487,SE -3273023488,3273024511,PL -3273024512,3273025535,NL -3273025536,3273026559,RU -3273026560,3273028607,UA -3273028608,3273029631,PL -3273029632,3273029887,CH -3273029888,3273030143,GB -3273030400,3273030655,RU -3273030656,3273031679,PL -3273031680,3273032191,GB -3273032192,3273033215,UA -3273033216,3273033727,GB -3273033728,3273034239,DE -3273034240,3273034751,BE -3273034752,3273035263,UA -3273035264,3273035775,DE -3273035776,3273036287,FR -3273036288,3273036799,BG -3273037312,3273037823,GB -3273038336,3273038847,GR -3273039360,3273039871,GB -3273039872,3273048063,LT -3273048064,3273056255,IT -3273056256,3273064447,MD -3273064448,3273129983,PT -3273129984,3273131519,DK -3273131520,3273131775,SE -3273131776,3273138175,DK -3273138176,3273146367,BG -3273146368,3273148415,RU -3273148416,3273150463,LU -3273150464,3273152511,DZ -3273152512,3273154559,BG -3273154560,3273162751,DE -3273162752,3273170943,UA -3273170944,3273179135,SE -3273179136,3273187327,CM -3273187328,3273187839,SE -3273187840,3273188351,DK -3273188352,3273188863,RU -3273188864,3273189887,GB -3273189888,3273190399,UA -3273190400,3273191935,RO -3273191936,3273192447,UA -3273192448,3273192959,DK -3273192960,3273193471,FR -3273193472,3273193983,PL -3273194496,3273195007,UA -3273195008,3273195519,RU -3273195520,3273200387,FR -3273200388,3273200388,GB -3273200389,3273261055,FR -3273261056,3273261567,NO -3273261568,3273262079,BE -3273262080,3273262591,LU -3273263616,3273264127,SE -3273264128,3273264639,PL -3273264640,3273265151,AT -3273265152,3273266175,UA -3273266176,3273266687,LV -3273266688,3273267455,PL -3273267456,3273267711,CZ -3273267712,3273268223,GB -3273268224,3273268735,SE -3273268736,3273269247,RU -3273269248,3273277439,GB -3273277440,3273278463,UA -3273279488,3273281535,PL -3273281536,3273283583,UA -3273283584,3273284607,GB -3273284608,3273285631,UA -3273285632,3273293823,GB -3273293824,3273302015,MK -3273302016,3273310207,RU -3273310208,3273318399,AT -3273318400,3273326591,GB -3273326984,3273326987,DE -3273326992,3273327047,DE -3273327104,3273327231,DE -3273327264,3273327295,DE -3273327336,3273327351,DE -3273327392,3273327407,IE -3273327488,3273327495,GB -3273327520,3273327551,IE -3273327552,3273327583,GB -3273328512,3273328639,DE -3273328640,3273329199,GB -3273329200,3273329215,DE -3273329216,3273329279,GB -3273329312,3273329327,GB -3273329408,3273329423,GB -3273329424,3273329439,DE -3273329440,3273330175,GB -3273330176,3273330183,IR -3273330200,3273330207,IE -3273330232,3273330235,GB -3273330288,3273330431,IE -3273330432,3273330463,GB -3273330496,3273330519,GB -3273330528,3273330551,GB -3273330560,3273331199,GB -3273331712,3273331743,GB -3273331752,3273331791,GB -3273331808,3273331823,GB -3273331828,3273331831,GB -3273331840,3273331887,GB -3273331904,3273331967,GB -3273331968,3273332031,DE -3273332032,3273332095,GB -3273332096,3273332223,DE -3273332224,3273332479,GB -3273332544,3273332575,DE -3273332608,3273332671,DE -3273333056,3273333119,DE -3273334272,3273334783,DE -3273334784,3273335039,AE -3273335296,3273335423,GB -3273335432,3273335455,GB -3273335512,3273335535,GB -3273335616,3273335623,GB -3273335656,3273335663,GB -3273335696,3273335703,GB -3273335936,3273335999,DE -3273336848,3273336863,DE -3273336864,3273336871,GB -3273336872,3273336895,DE -3273336960,3273337087,DE -3273337856,3273338111,DE -3273338624,3273338879,DE -3273339136,3273339391,DE -3273339392,3273339919,GB -3273339920,3273339943,DE -3273339944,3273339955,GB -3273339956,3273339959,DE -3273339960,3273339967,GB -3273339968,3273339983,DE -3273339984,3273340095,GB -3273340096,3273340111,GI -3273340112,3273340119,GB -3273340120,3273340143,DE -3273340144,3273340415,GB -3273340928,3273341711,FR -3273341752,3273341823,FR -3273341856,3273341879,FR -3273341888,3273341951,FR -3273342022,3273342022,GB -3273342034,3273342034,GB -3273342036,3273342039,GB -3273342080,3273342095,GB -3273342192,3273342207,GB -3273342208,3273342231,AE -3273342240,3273342255,AE -3273342464,3273342975,DE -3273342976,3273343999,GB -3273344000,3273344767,DE -3273345024,3273345279,DE -3273346560,3273346815,OM -3273346816,3273347071,DE -3273347584,3273347839,GB -3273347840,3273348351,DE -3273349120,3273349631,DE -3273350272,3273350287,DE -3273350336,3273350351,DE -3273351168,3273351423,GB -3273351424,3273351455,DE -3273351504,3273351519,DE -3273351872,3273351903,DE -3273351936,3273352191,DE -3273352928,3273352959,DE -3273352992,3273353023,DE -3273357312,3273358335,GB -3273359888,3273359903,DE -3273360016,3273360079,DE -3273361472,3273361535,DE -3273361632,3273361663,DE -3273361792,3273361823,DE -3273361856,3273361919,DE -3273362048,3273362175,DE -3273362240,3273362255,DE -3273363208,3273363211,DE -3273363328,3273363391,DE -3273363456,3273364479,GB -3273364608,3273364735,DE -3273364992,3273365247,DE -3273365504,3273365519,NL -3273365520,3273365543,GB -3273365544,3273365759,NL -3273365760,3273365767,GB -3273365888,3273366015,FR -3273366016,3273366527,DE -3273366528,3273367551,GB -3273367552,3273367567,DE -3273368064,3273368575,DE -3273369344,3273369855,DE -3273369872,3273369887,FR -3273370624,3273371135,DE -3273371712,3273371743,DE -3273371760,3273371775,DE -3273371808,3273371823,DE -3273371872,3273371875,DE -3273372000,3273372055,DE -3273372096,3273372159,DE -3273372672,3273372927,GB -3273372928,3273373183,NL -3273373184,3273373455,GB -3273373456,3273373567,DE -3273373568,3273374847,GB -3273374856,3273374863,GB -3273374896,3273374903,GB -3273374912,3273374931,GB -3273375168,3273375168,GB -3273375232,3273375551,DE -3273375744,3273375871,DE -3273376000,3273376255,DE -3273376536,3273376543,DE -3273377792,3273378095,DE -3273378560,3273378815,DE -3273381888,3273382143,DE -3273382144,3273382399,GB -3273382400,3273382463,DE -3273382480,3273382591,DE -3273382640,3273382687,DE -3273384192,3273384703,DE -3273384960,3273385215,DE -3273385280,3273385343,DE -3273385472,3273385727,DE -3273385760,3273385791,DE -3273385856,3273385919,DE -3273387056,3273387071,DE -3273387216,3273387231,DE -3273387264,3273387519,DE -3273387552,3273387583,DE -3273388160,3273388223,DE -3273388800,3273388807,DE -3273388816,3273388863,DE -3273388872,3273388879,DE -3273388904,3273388911,DE -3273388912,3273388927,GB -3273390080,3273390111,DE -3273390112,3273390143,US -3273390144,3273390207,DE -3273390368,3273390399,DE -3273391104,3273391359,DE -3273391488,3273391615,DE -3273392128,3273392639,PL -3273392640,3273393663,RO -3273394176,3273394687,RO -3273395200,3273395711,DE -3273395712,3273396223,RU -3273396224,3273396735,PL -3273396736,3273397247,RO -3273397248,3273397759,RU -3273397760,3273398271,NL -3273398272,3273398783,RO -3273398784,3273399295,GB -3273399296,3273399807,SE -3273399808,3273400319,UA -3273400320,3273408511,RU -3273408512,3273433087,SK -3273433088,3273433599,LU -3273433600,3273434111,RO -3273434112,3273434623,BE -3273434624,3273435135,IL -3273435648,3273436159,PL -3273436160,3273436671,NO -3273436672,3273437183,DE -3273437184,3273437695,RO -3273438208,3273438719,IL -3273438720,3273439231,UA -3273439232,3273439743,RO -3273439744,3273440255,DE -3273440256,3273440767,RO -3273440768,3273441279,GB -3273441280,3273449471,FR -3273449472,3273457663,CH -3273457664,3273523199,HR -3273523200,3273588735,DE -3273588736,3273687039,IT -3273687040,3273719807,DE -3273719808,3273727079,NL -3273727080,3273727088,GB -3273727089,3273727095,ES -3273727096,3273727103,DE -3273727104,3273727119,NL -3273727120,3273727127,PT -3273727128,3273727135,FI -3273727136,3273727143,NO -3273727144,3273727151,CZ -3273727152,3273727167,IT -3273727168,3273732095,NL -3273732096,3273736191,GB -3273736192,3273744383,FR -3273744384,3273752575,GB -3273752576,3273768959,NL -3273768960,3273785343,TR -3273785344,3273801727,RU -3273801728,3273802239,DE -3273802752,3273803263,SA -3273803776,3273804287,CH -3273804288,3273804799,UA -3273804800,3273805311,RO -3273805312,3273805823,GI -3273805824,3273806335,PL -3273806336,3273806847,DE -3273806848,3273807359,SE -3273807360,3273807871,LU -3273807872,3273808383,CH -3273808384,3273808895,UA -3273808896,3273809407,GB -3273809408,3273809919,UA -3273809920,3273818111,BG -3273818112,3273826303,AT -3273826304,3273834495,DE -3273834496,3273835519,RU -3273835520,3273836543,UA -3273837568,3273838591,UA -3273838592,3273839615,PL -3273839616,3273840639,EE -3273840640,3273841663,PL -3273841664,3273842687,AT -3273842688,3273850879,RU -3273850880,3273867263,DE -3273867264,3273867519,BE -3273867520,3273867775,UA -3273867776,3273868031,PT -3273868288,3273869311,RU -3273869312,3273871359,DE -3273871360,3273871615,PL -3273871616,3273871871,LU -3273871872,3273872383,SE -3273872384,3273872639,BG -3273872640,3273872895,PS -3273872896,3273873151,IE -3273873152,3273873919,DE -3273873920,3273874431,GB -3273874432,3273875455,GR -3273875456,3273875711,PT -3273876224,3273876479,IT -3273876480,3273876991,SE -3273877248,3273877503,DE -3273877536,3273877567,AT -3273877568,3273877759,IT -3273877760,3273878015,GR -3273878016,3273878271,FR -3273878272,3273878527,LV -3273878528,3273878783,RU -3273878784,3273879039,NO -3273879040,3273879551,BE -3273879552,3273880063,GB -3273880064,3273880575,NL -3273880576,3273881087,RU -3273881600,3273881855,GB -3273881856,3273882111,CH -3273882112,3273882367,SI -3273882368,3273883135,GB -3273883136,3273883391,GR -3273883392,3273883647,DE -3273883648,3273916415,NL -3273916416,3273932799,IT -3273932800,3273940991,DE -3273940992,3273943039,GB -3273943040,3273945087,DE -3273945088,3273947135,GB -3273947136,3273949183,DE -3273949184,3273981951,FR -3273981952,3274047487,DE -3274050560,3274051583,PL -3274051584,3274052351,UA -3274052352,3274052607,GB -3274052608,3274052863,DE -3274053120,3274053375,KZ -3274053376,3274053631,RU -3274053632,3274054655,DE -3274054656,3274055167,GB -3274055168,3274055423,MT -3274055424,3274055679,PL -3274055680,3274063871,RU -3274063872,3274072063,GB -3274072064,3274080255,HU -3274080256,3274088447,DE -3274088448,3274096639,KG -3274096640,3274113023,NL -3274113024,3274145791,CZ -3274145792,3274162175,KW -3274162176,3274162687,GB -3274163200,3274163711,UA -3274163712,3274164223,BG -3274164224,3274164735,AT -3274165760,3274166271,RU -3274166272,3274166783,RO -3274166784,3274167295,UA -3274167296,3274167807,BG -3274168320,3274168831,PL -3274168832,3274169343,DZ -3274169856,3274170367,DE -3274170368,3274170879,TR -3274170880,3274171391,DE -3274171392,3274171903,RU -3274171904,3274172415,DE -3274172416,3274172927,UA -3274172928,3274173439,DE -3274173440,3274173951,GR -3274174208,3274174463,CZ -3274174464,3274175487,UA -3274175488,3274175999,BE -3274176512,3274177023,UA -3274178048,3274178559,NL -3274178560,3274244095,GB -3274244096,3274309631,DK -3274309632,3274326015,FR -3274326016,3274334719,RU -3274334720,3274335231,PL -3274335232,3274335743,DE -3274335744,3274336255,NL -3274336256,3274336767,SE -3274336768,3274337279,AT -3274337280,3274337791,DE -3274337792,3274338303,SE -3274338304,3274338815,PL -3274338816,3274339327,DE -3274339328,3274339839,RO -3274339840,3274340351,RU -3274340352,3274340863,DE -3274340864,3274341375,RU -3274341376,3274341887,FR -3274341888,3274342399,UA -3274342400,3274342911,RO -3274342912,3274343423,UA -3274343424,3274343935,US -3274343936,3274344447,NL -3274344448,3274344959,UA -3274344960,3274345471,RO -3274345472,3274345983,PL -3274345984,3274346495,DE -3274346496,3274347007,FR -3274347008,3274347519,RU -3274347520,3274348031,FR -3274348032,3274348543,DK -3274348544,3274349055,PL -3274349056,3274350079,RU -3274350592,3274358783,RU -3274358784,3274366975,SE -3274366976,3274368511,NL -3274368512,3274368767,AT -3274368768,3274369023,FR -3274370048,3274371071,GB -3274373376,3274373631,PL -3274373632,3274374143,FR -3274374144,3274375167,DE -3274375168,3274383359,EG -3274383360,3274384383,RU -3274384384,3274385407,SE -3274385408,3274386431,UA -3274386432,3274388479,GB -3274388480,3274389503,DE -3274389504,3274390527,CH -3274390528,3274391551,NO -3274391552,3274392063,FR -3274392064,3274392575,PL -3274392576,3274393087,RU -3274393088,3274393599,UA -3274393600,3274394111,PL -3274394112,3274394623,AM -3274394624,3274395135,CZ -3274395136,3274395647,DK -3274396160,3274396671,LV -3274396672,3274397183,PL -3274397184,3274397695,EE -3274397696,3274398207,DE -3274398208,3274399743,RU -3274399744,3274407935,LU -3274408192,3274408447,IT -3274408448,3274408703,NL -3274408704,3274408959,SI -3274408960,3274409215,GR -3274409216,3274409471,SI -3274409472,3274409727,CH -3274409728,3274409983,RU -3274409984,3274410239,LT -3274410240,3274410495,SA -3274410496,3274410751,NL -3274410752,3274411007,AT -3274411008,3274411263,CH -3274411264,3274411519,DE -3274411520,3274412031,PL -3274412032,3274412287,RU -3274412288,3274412543,NO -3274412544,3274412799,UA -3274412800,3274413055,RU -3274413056,3274413311,UA -3274413312,3274413567,AT -3274413568,3274413823,FR -3274413824,3274414079,SE -3274414080,3274414335,AT -3274414336,3274414591,CH -3274414592,3274414847,NL -3274414848,3274415103,IE -3274415104,3274415359,PL -3274415360,3274415615,GB -3274415616,3274415871,NL -3274415872,3274416127,SI -3274416128,3274424319,IT -3274424320,3274435711,SE -3274435712,3274435839,US -3274435840,3274440703,SE -3274442752,3274443263,GB -3274443520,3274443647,GB -3274443712,3274443775,GB -3274443808,3274444031,GB -3274446336,3274447871,GB -3274448384,3274448639,GB -3274448896,3274449663,GB -3274449920,3274450231,GB -3274450248,3274450367,GB -3274450376,3274450391,GB -3274450408,3274450415,GB -3274450432,3274450591,GB -3274450656,3274450687,GB -3274451200,3274452255,GB -3274452264,3274452311,GB -3274452320,3274452335,GB -3274452344,3274452367,GB -3274452384,3274452391,GB -3274452400,3274452423,GB -3274452432,3274452439,GB -3274452448,3274452455,GB -3274452464,3274452471,GB -3274452496,3274452543,GB -3274452560,3274452575,GB -3274452656,3274452703,GB -3274452736,3274452927,GB -3274452992,3274453767,GB -3274453784,3274453791,GB -3274453800,3274453847,GB -3274453864,3274453871,GB -3274453888,3274453903,GB -3274453920,3274453935,GB -3274453944,3274453951,GB -3274453960,3274453975,GB -3274453984,3274453991,GB -3274454000,3274454271,GB -3274454656,3274455311,GB -3274455328,3274455335,GB -3274455344,3274455351,GB -3274455360,3274455375,GB -3274455384,3274455391,GB -3274455400,3274455423,GB -3274455432,3274455439,GB -3274455448,3274455503,GB -3274455520,3274455535,GB -3274455744,3274455807,GB -3274455872,3274455935,GB -3274455968,3274456359,GB -3274456368,3274456375,GB -3274456384,3274456391,GB -3274456400,3274456407,GB -3274456416,3274456447,GB -3274456456,3274456511,GB -3274456528,3274456535,GB -3274456544,3274456559,GB -3274456568,3274460223,GB -3274460416,3274462207,GB -3274462464,3274465023,GB -3274465152,3274466351,GB -3274466368,3274466399,GB -3274466416,3274466463,GB -3274466560,3274466735,GB -3274466744,3274466763,GB -3274466768,3274466783,GB -3274466816,3274467099,GB -3274467104,3274467307,GB -3274467328,3274470383,GB -3274470400,3274470535,GB -3274470656,3274471423,GB -3274471536,3274471615,GB -3274471680,3274471935,GB -3274472960,3274483711,GB -3274489600,3274489855,GB -3274490176,3274490895,GB -3274490912,3274491199,GB -3274491208,3274491247,GB -3274491256,3274491295,GB -3274491304,3274491319,GB -3274491328,3274491383,GB -3274491392,3274504447,GB -3274505728,3274505791,GB -3274505793,3274505855,GB -3274506240,3274571775,IT -3274571776,3274579967,GR -3274579968,3274580991,UA -3274580992,3274581503,PL -3274581504,3274581759,NL -3274582016,3274583039,PL -3274583040,3274584063,DE -3274584064,3274585087,GB -3274585088,3274586111,RS -3274586112,3274587135,UA -3274587136,3274588159,GB -3274588160,3274596351,SK -3274596352,3274604543,RU -3274604544,3274612735,TR -3274612736,3274620927,RU -3274620928,3274629119,FR -3274629120,3274635263,LU -3274635264,3274635519,FR -3274635520,3274635775,LU -3274635776,3274636287,FR -3274636288,3274636799,LU -3274636800,3274637311,FR -3274637312,3274670079,CZ -3274670080,3274686463,DK -3274686464,3274686719,RU -3274686720,3274686975,BG -3274686976,3274687231,RO -3274687232,3274687487,DE -3274687488,3274687743,RU -3274687744,3274687999,SI -3274688000,3274688255,GB -3274688256,3274688511,IT -3274688512,3274688767,PT -3274688768,3274689023,PL -3274689024,3274689279,UA -3274689280,3274689535,PL -3274689536,3274689791,RU -3274689792,3274690047,SE -3274690048,3274690303,ES -3274690304,3274690559,GB -3274690560,3274690815,GR -3274690816,3274691071,ES -3274691328,3274691583,SI -3274691840,3274692095,SI -3274692096,3274692351,RO -3274692352,3274692607,BE -3274692864,3274693119,AT -3274693376,3274693631,UA -3274693632,3274693887,RU -3274693888,3274694143,IT -3274694144,3274694399,DK -3274694400,3274694655,GB -3274694656,3274694911,SI -3274694912,3274695167,GB -3274695168,3274695423,SI -3274695424,3274695679,PL -3274695680,3274695935,SI -3274695936,3274696191,DE -3274696448,3274696703,CH -3274696704,3274696959,IT -3274696960,3274697215,GR -3274697216,3274697471,SA -3274697472,3274697727,CZ -3274697728,3274697983,ES -3274697984,3274698239,GB -3274698240,3274698495,SE -3274698752,3274699007,GB -3274699008,3274699263,FR -3274699520,3274699775,SI -3274699776,3274700031,GB -3274700032,3274700287,CH -3274700288,3274700543,PL -3274700544,3274700799,DK -3274700800,3274701055,UA -3274701056,3274701311,DE -3274701568,3274701823,IT -3274701824,3274702079,IL -3274702080,3274702335,UA -3274702336,3274702591,SE -3274702592,3274702847,KZ -3274702848,3274801151,CH -3274802176,3274803199,FR -3274803200,3274804223,DE -3274804224,3274805247,FR -3274805248,3274806271,GB -3274806272,3274807295,UA -3274807296,3274809343,DE -3274809344,3274810367,SE -3274810368,3274811391,UA -3274811392,3274812415,RU -3274812416,3274813439,SE -3274813440,3274814463,ES -3274814464,3274815487,GB -3274815488,3274816511,RU -3274816512,3274817535,SK -3274817536,3274819583,RU -3274819584,3274821631,UA -3274821632,3274823679,KZ -3274823680,3274825727,TR -3274825728,3274827775,DE -3274829824,3274831871,SE -3274831872,3274833919,RO -3274833920,3274842111,BY -3274842112,3274850303,DK -3274850304,3274855487,GB -3274855488,3274855519,AT -3274855520,3274866687,GB -3274866688,3274883071,DE -3274883072,3274899455,EE -3274899456,3274902399,DE -3274902400,3274902423,AT -3274902528,3274909695,DE -3274910208,3274910975,DE -3274911232,3274911743,DE -3274911744,3274911999,FR -3274912000,3274912031,GB -3274912032,3274912063,DE -3274912064,3274912191,FR -3274912192,3274912287,DE -3274912288,3274912295,LU -3274912296,3274912303,GB -3274912304,3274912447,FR -3274912448,3274912511,NL -3274912512,3274912767,FR -3274912768,3274912799,DE -3274912800,3274912831,IT -3274912832,3274912895,FR -3274912896,3274913023,RO -3274913024,3274913279,FR -3274913280,3274914815,DE -3274915072,3274915839,DE -3274915840,3274916735,NL -3274916736,3274916863,DE -3274916864,3274917215,NL -3274917216,3274917311,GB -3274917312,3274917327,ZA -3274917328,3274917335,CH -3274917336,3274917343,GB -3274917344,3274917375,SE -3274917376,3274917887,NL -3274917888,3274918399,BE -3274918400,3274918655,IT -3274918656,3274918911,BE -3274918912,3274919359,CH -3274919392,3274919423,CH -3274919424,3274919935,GB -3274919936,3274921983,BE -3274921984,3274922847,ZA -3274922848,3274922863,BE -3274922864,3274922871,GB -3274922872,3274922879,IT -3274922880,3274922943,ZA -3274922944,3274923007,NL -3274923264,3274924031,NL -3274924032,3274928127,FR -3274928128,3274928511,ES -3274928512,3274928575,RU -3274928576,3274928639,GB -3274928640,3274929151,ES -3274929408,3274929663,FR -3274929664,3274930175,BE -3274930176,3274932223,IT -3274932224,3274932991,GB -3274932992,3274933151,DE -3274933152,3274933183,CH -3274933184,3274933215,ZA -3274933216,3274933247,BE -3274933248,3274936063,GB -3274936064,3274936159,SE -3274936160,3274936175,GB -3274936192,3274936863,GB -3274936864,3274936871,BE -3274936872,3274936879,CH -3274936880,3274936895,SE -3274936896,3274938367,GB -3274938496,3274938535,GB -3274938536,3274938543,FR -3274938544,3274938559,GB -3274938624,3274938879,GB -3274938880,3274939135,DE -3274939136,3274939391,IT -3274939392,3274940415,ZA -3274940416,3274941055,DE -3274941056,3274941087,NL -3274941096,3274941103,IT -3274941104,3274942463,DE -3274942464,3274944511,FR -3274944512,3274948607,NL -3274948608,3274952447,DK -3274952448,3274952479,SE -3274952480,3274952511,FR -3274952512,3274952527,GB -3274952528,3274952543,BE -3274952544,3274952575,GB -3274952576,3274952703,IT -3274952704,3274954239,AT -3274954240,3274954399,NL -3274954400,3274954415,BE -3274954416,3274954431,GB -3274954432,3274954495,PT -3274954496,3274954623,AT -3274954624,3274954751,NL -3274954752,3274955007,SE -3274955264,3274956287,SE -3274956288,3274956543,GB -3274956544,3274956615,BE -3274956616,3274956623,AT -3274956624,3274956639,DE -3274956640,3274956655,GB -3274956656,3274956671,FR -3274956672,3274956735,DE -3274956736,3274956767,DK -3274956768,3274956799,SE -3274956800,3274957055,CH -3274957056,3274957567,AT -3274957568,3274957823,CH -3274957824,3274957831,GR -3274957952,3274957959,BE -3274957968,3274957983,FR -3274957984,3274957999,BE -3274958000,3274958007,GB -3274958008,3274958015,BE -3274958080,3274958279,IE -3274958288,3274958335,IE -3274958336,3274959231,AT -3274959232,3274959247,IT -3274959248,3274959255,GB -3274959256,3274959263,ZA -3274959272,3274959279,GB -3274959280,3274959287,DE -3274959288,3274959295,GB -3274959296,3274959327,ES -3274959328,3274959615,DE -3274960384,3274960447,BE -3274960448,3274960511,ES -3274960512,3274960575,GB -3274960576,3274960639,IT -3274960640,3274961407,AT -3274961408,3274961503,CH -3274961504,3274961535,DK -3274961536,3274961559,CH -3274961568,3274961663,CH -3274961664,3274961727,BY -3274961920,3274962111,AT -3274962112,3274962175,GB -3274962176,3274962431,ZA -3274962432,3274962687,BE -3274962688,3274962879,GR -3274962880,3274963167,GB -3274963168,3274963183,IE -3274963184,3274963191,GB -3274963192,3274963199,NL -3274963200,3274963455,DE -3274963456,3274963711,CH -3274963712,3274963743,DE -3274963744,3274963775,FR -3274963776,3274963783,GB -3274963784,3274963791,BE -3274963792,3274963807,NL -3274963808,3274963839,IT -3274963840,3274963967,DE -3274963968,3274964223,FR -3274964224,3274964735,BE -3274964736,3274964863,GB -3274964864,3274964879,HU -3274964880,3274964895,FR -3274964896,3274964927,NL -3274964928,3274964991,GB -3274964992,3275030527,DE -3275030528,3275096063,ES -3275096064,3275104767,RU -3275104768,3275105279,DE -3275105280,3275105791,GB -3275105792,3275106303,NL -3275106304,3275106815,RU -3275106816,3275107327,UA -3275107328,3275107839,BG -3275107840,3275108351,PL -3275108352,3275108863,FR -3275108864,3275109375,PL -3275109376,3275109887,UA -3275109888,3275110399,RO -3275110400,3275110911,NL -3275110912,3275111423,GB -3275111424,3275111935,IT -3275111936,3275112447,FR -3275112448,3275120639,DK -3275120640,3275137023,SE -3275137536,3275137791,NL -3275137792,3275138047,UA -3275138048,3275138559,DE -3275139072,3275139583,PT -3275140096,3275140607,AT -3275141120,3275141631,RU -3275141632,3275142143,GE -3275142144,3275142655,KG -3275142656,3275143167,SE -3275143168,3275144703,PL -3275144704,3275145215,HR -3275145216,3275153407,RU -3275153408,3275158271,GB -3275158272,3275158527,US -3275158528,3275161599,GB -3275161600,3275227135,ES -3275227136,3275292671,HU -3275292672,3275358207,ES -3275358208,3275374591,RU -3275374592,3275382783,GB -3275382784,3275390975,SE -3275390976,3275399167,GB -3275399168,3275407359,AT -3275407360,3275415551,GB -3275415552,3275423743,UA -3275423744,3275423751,GB -3275423808,3275423839,GB -3275423872,3275424295,GB -3275424320,3275424383,GB -3275424432,3275424439,GB -3275424480,3275424487,GB -3275424496,3275424639,GB -3275424648,3275424703,GB -3275424712,3275424743,GB -3275424752,3275424871,GB -3275424880,3275424895,GB -3275424904,3275424911,GB -3275424960,3275425135,GB -3275425144,3275425311,GB -3275425328,3275425343,GB -3275425536,3275425559,GB -3275425568,3275425583,GB -3275425792,3275426559,GB -3275426576,3275427103,GB -3275427112,3275427263,GB -3275427272,3275427599,GB -3275427616,3275427715,GB -3275427728,3275428367,GB -3275428376,3275428407,GB -3275428416,3275428447,GB -3275428608,3275428863,GB -3275429888,3275430143,GB -3275430592,3275430631,GB -3275430656,3275430911,GB -3275431936,3275432883,GB -3275433984,3275436543,GB -3275436800,3275438655,GB -3275438672,3275438847,GB -3275439104,3275439679,GB -3275439688,3275439935,GB -3275439944,3275439951,GB -3275439968,3275441407,GB -3275441424,3275441439,GB -3275441472,3275441567,GB -3275441600,3275441823,GB -3275441832,3275441835,GB -3275441840,3275442723,GB -3275443200,3275443227,GB -3275443230,3275443230,GB -3275443232,3275443239,GB -3275443248,3275443407,GB -3275443424,3275443727,GB -3275443760,3275443775,GB -3275443840,3275443967,GB -3275444224,3275444735,GB -3275446272,3275446783,GB -3275446800,3275446815,GB -3275446848,3275447039,GB -3275447056,3275447135,GB -3275448320,3275449359,GB -3275449376,3275449399,GB -3275449440,3275449471,GB -3275449488,3275449519,GB -3275449520,3275449527,FR -3275449528,3275449567,GB -3275449584,3275449887,GB -3275449904,3275449911,GB -3275449920,3275449927,GB -3275449936,3275449943,GB -3275450048,3275450071,GB -3275450112,3275450207,GB -3275450224,3275450879,GB -3275451232,3275451263,GB -3275451392,3275451663,GB -3275451680,3275451711,GB -3275451720,3275451727,GB -3275451744,3275451767,GB -3275451776,3275451779,GB -3275451784,3275451791,GB -3275452416,3275453023,GB -3275453056,3275453151,GB -3275453168,3275453399,GB -3275453408,3275453839,GB -3275453848,3275453919,GB -3275453936,3275453951,GB -3275453960,3275454063,GB -3275454096,3275454127,GB -3275454144,3275454175,GB -3275454192,3275454303,GB -3275454336,3275454383,GB -3275454416,3275455231,GB -3275455248,3275455295,GB -3275455360,3275456407,GB -3275456416,3275458303,GB -3275458304,3275458559,FK -3275458560,3275459071,IE -3275459840,3275460095,IE -3275460096,3275460223,GB -3275460224,3275460239,IE -3275460288,3275460295,GB -3275460352,3275460607,IE -3275460608,3275460863,HK -3275460864,3275463183,GB -3275463192,3275463199,GB -3275463216,3275463239,GB -3275463248,3275463279,GB -3275463296,3275463423,GB -3275463456,3275463495,GB -3275463504,3275463523,GB -3275463528,3275463635,GB -3275463640,3275464031,GB -3275464032,3275464047,IE -3275464048,3275468655,GB -3275468656,3275468671,IE -3275468672,3275468735,GB -3275468736,3275468751,IE -3275468752,3275468767,GB -3275468768,3275468799,IE -3275468800,3275469071,GB -3275469072,3275469087,IE -3275469088,3275473151,GB -3275473232,3275473311,GB -3275473328,3275473359,GB -3275473368,3275473895,GB -3275473904,3275474047,GB -3275474088,3275474735,GB -3275474752,3275474887,GB -3275474896,3275474911,GB -3275474936,3275474951,GB -3275474960,3275475039,GB -3275475044,3275475287,GB -3275475292,3275475295,GB -3275475376,3275475399,GB -3275475408,3275475447,GB -3275475456,3275475783,GB -3275475800,3275475807,GB -3275475824,3275475831,GB -3275475840,3275475871,GB -3275475876,3275475879,GB -3275475968,3275476223,GB -3275476288,3275476479,GB -3275476608,3275476631,GB -3275476640,3275476687,GB -3275476704,3275476735,GB -3275476944,3275476959,GB -3275476976,3275477015,GB -3275477024,3275477151,GB -3275477160,3275477567,GB -3275477760,3275478271,GB -3275478528,3275481087,GB -3275481344,3275481599,GB -3275482112,3275482431,GB -3275482480,3275483647,GB -3275484160,3275484415,GB -3275485184,3275485215,GB -3275485224,3275485231,GB -3275485248,3275485375,GB -3275485408,3275485431,GB -3275485440,3275485759,GB -3275485840,3275485855,GB -3275485936,3275485936,GB -3275486208,3275487231,GB -3275487240,3275487243,CZ -3275487248,3275487263,CZ -3275488768,3275489279,CZ -3275489280,3275497471,GB -3275497472,3275505663,DE -3275505664,3275506175,PL -3275506176,3275506687,UA -3275506688,3275507199,SE -3275507200,3275507711,UA -3275507712,3275509759,RO -3275509856,3275509887,PL -3275509888,3275509919,AM -3275509920,3275509951,PL -3275509952,3275509983,GB -3275509984,3275510015,PT -3275510016,3275510079,SE -3275510080,3275510143,ES -3275510208,3275510335,CY -3275510336,3275510399,IE -3275510400,3275510463,NL -3275510464,3275510527,GB -3275510528,3275510559,PL -3275510592,3275510623,CY -3275510624,3275510655,EE -3275510656,3275510687,FR -3275510688,3275510719,CY -3275510720,3275510751,GB -3275510752,3275510783,NL -3275510784,3275510911,CY -3275511040,3275511167,GB -3275511296,3275511551,GB -3275511552,3275511679,NL -3275511680,3275511807,CY -3275511936,3275512063,FR -3275512064,3275512191,CZ -3275512192,3275512319,IT -3275512320,3275512447,FI -3275512448,3275512575,DK -3275512576,3275512703,BE -3275512832,3275512895,SE -3275512896,3275512959,AT -3275512960,3275513023,PL -3275513024,3275513087,UA -3275513088,3275513151,CY -3275513216,3275513279,CH -3275513280,3275513343,CY -3275513344,3275513471,PL -3275513600,3275513727,CY -3275513728,3275513855,GB -3275513856,3275522047,DE -3275522048,3275530239,IT -3275530240,3275530751,DK -3275530752,3275531263,AT -3275531264,3275531775,GB -3275532288,3275532799,UA -3275532800,3275533311,GB -3275533824,3275534335,UA -3275534848,3275535359,RO -3275535360,3275535871,DE -3275535872,3275536383,SE -3275536384,3275536895,UA -3275536896,3275537407,DE -3275537408,3275537919,FR -3275537920,3275538431,IT -3275538432,3275539455,CH -3275539456,3275540479,GB -3275540480,3275541503,UA -3275542528,3275543551,DE -3275543552,3275544575,NL -3275544576,3275545599,PL -3275545600,3275546623,RU -3275546624,3275548671,UA -3275548672,3275549695,IL -3275549696,3275550719,SY -3275550720,3275551743,PL -3275551744,3275552767,RU -3275552768,3275553791,LV -3275553792,3275554815,FI -3275588448,3275588463,BE -3275590656,3275590911,BE -3275612928,3275613183,LU -3275620352,3275622399,RU -3275622400,3275623423,GB -3275623424,3275623935,PL -3275623936,3275624447,UA -3275624448,3275624959,SK -3275624960,3275625471,IL -3275625472,3275625983,DE -3275626496,3275627007,UA -3275627008,3275627519,AT -3275627520,3275628031,GB -3275628032,3275628543,IL -3275628544,3275629311,RU -3275629312,3275629567,TR -3275629568,3275630079,UA -3275630080,3275630591,RU -3275630592,3275631103,PL -3275631104,3275631615,FR -3275631616,3275632127,DE -3275632128,3275633151,RU -3275633152,3275633663,FR -3275633664,3275634687,RU -3275634688,3275635199,RO -3275635200,3275636735,RU -3275636736,3275637247,PL -3275637248,3275637759,SE -3275637760,3275638271,BE -3275638272,3275638783,RU -3275638784,3275639807,FR -3275639808,3275640319,SE -3275640320,3275640831,RU -3275640832,3275641343,DE -3275641344,3275641855,NL -3275641856,3275642367,AT -3275642880,3275643391,RO -3275643392,3275643903,BE -3275643904,3275644415,RU -3275644416,3275644927,RO -3275644928,3275653119,DE -3275653120,3275661311,LV -3275661312,3275669503,IT -3275669504,3275677695,GB -3275677696,3275685887,IT -3275685888,3275751423,DE -3275751424,3275759615,AT -3275759616,3275775999,NL -3275776000,3275784191,DE -3275784704,3275785215,PL -3275785216,3275785727,RO -3275785728,3275786239,CH -3275786240,3275786751,UA -3275786752,3275787263,CH -3275787264,3275787775,RU -3275787776,3275788287,UA -3275788288,3275788799,SE -3275788800,3275789311,AT -3275789312,3275789823,UA -3275789824,3275790335,PL -3275790848,3275791359,UA -3275791360,3275791871,RU -3275791872,3275792383,PL -3275792384,3275792895,BG -3275792896,3275793407,UA -3275793408,3275793919,FR -3275793920,3275794431,UA -3275794432,3275794943,GB -3275794944,3275795455,RS -3275795456,3275795967,GR -3275795968,3275796479,PL -3275796480,3275796991,DE -3275796992,3275797503,RO -3275797504,3275798015,DE -3275798016,3275799039,UA -3275799040,3275799551,ES -3275799552,3275800063,IT -3275800064,3275800575,UA -3275800576,3275808767,RU -3275808768,3275816959,UA -3275816960,3275882495,CH -3275882496,3275884543,DE -3275884544,3275886591,IT -3275886592,3275888639,PL -3275888640,3275890687,GB -3275890688,3275898879,SE -3275898880,3275899135,LV -3275899136,3275899647,UA -3275899648,3275899903,RU -3275899904,3275900159,PL -3275900160,3275900415,SI -3275900416,3275900671,DE -3275900672,3275901183,RU -3275901184,3275901439,PL -3275901440,3275901695,DE -3275901696,3275901951,IE -3275901952,3275902207,DE -3275902208,3275902719,RU -3275902720,3275902975,UA -3275902976,3275903231,FR -3275903232,3275903487,GB -3275903488,3275903743,FR -3275903744,3275903999,DE -3275904000,3275904255,RU -3275904256,3275904511,CH -3275904512,3275904767,PL -3275905024,3275905279,PL -3275905280,3275905535,RU -3275905536,3275905791,NL -3275905792,3275906303,AT -3275906304,3275906559,UA -3275906560,3275907071,SE -3275907072,3275907327,RU -3275907328,3275907583,CH -3275907584,3275907839,PL -3275907840,3275908095,DE -3275908096,3275908351,SA -3275908352,3275908607,SE -3275908608,3275908863,DE -3275908864,3275909119,PL -3275909376,3275909631,UA -3275909632,3275909887,EE -3275909888,3275910143,SI -3275910144,3275910399,RU -3275910400,3275910655,DK -3275910656,3275910911,UA -3275910912,3275911167,DE -3275911168,3275911423,FR -3275911424,3275911679,RO -3275911936,3275912191,BE -3275912192,3275912447,PL -3275912448,3275912703,RU -3275912704,3275912959,IL -3275912960,3275913215,FR -3275913472,3275913983,DE -3275913984,3275914239,CH -3275914240,3275914495,RO -3275914496,3275914751,BG -3275914752,3275915007,RU -3275915008,3275915263,PT -3275915264,3275915775,SA -3275915776,3275916287,SE -3275916288,3275916383,US -3275916384,3275916415,GB -3275916416,3275916799,US -3275916800,3275917311,NL -3275917312,3275918847,UA -3275918848,3275919359,RO -3275919360,3275919871,PL -3275919872,3275920383,UA -3275920384,3275920895,GB -3275920896,3275921407,ES -3275921920,3275922431,DE -3275922432,3275922943,UA -3275922944,3275923455,GR -3275923456,3275924991,ME -3275924992,3275925759,RS -3275925760,3275928927,ME -3275928928,3275928943,RS -3275928944,3275931647,ME -3275931648,3275939839,UA -3275939840,3275948031,GB -3275948032,3276013567,SE -3276013568,3276014239,GB -3276014240,3276014247,FR -3276014248,3276014463,GB -3276014464,3276014479,FR -3276014480,3276014951,GB -3276014952,3276014959,ES -3276014960,3276015055,GB -3276015056,3276015063,FR -3276015064,3276018383,GB -3276018384,3276018399,FR -3276018400,3276019711,GB -3276019712,3276020735,FR -3276020736,3276021055,GB -3276021056,3276021071,FR -3276021072,3276025159,GB -3276025160,3276025167,FR -3276025168,3276028031,GB -3276028032,3276028039,FR -3276028040,3276028279,GB -3276028280,3276028287,FR -3276028288,3276028383,GB -3276028384,3276028391,FR -3276028392,3276028543,GB -3276028544,3276028671,FR -3276028672,3276029375,GB -3276029376,3276029439,FR -3276029440,3276030591,GB -3276030592,3276030607,FR -3276030608,3276031479,GB -3276031480,3276031487,FR -3276031488,3276032311,GB -3276032312,3276032319,FR -3276032320,3276036543,GB -3276036544,3276036607,FR -3276036608,3276039263,GB -3276039264,3276039279,FR -3276039280,3276042087,GB -3276042088,3276042095,FR -3276042096,3276042239,GB -3276042240,3276044287,FR -3276044288,3276045247,GB -3276045248,3276045255,FR -3276045256,3276046335,GB -3276046336,3276062719,RU -3276062720,3276063231,PL -3276063232,3276063743,FR -3276063744,3276064255,UA -3276064256,3276064767,DE -3276064768,3276065279,BG -3276065280,3276065791,UA -3276065792,3276066303,DE -3276066304,3276066815,GB -3276066816,3276067327,PS -3276067328,3276067839,UA -3276067840,3276068351,AT -3276068352,3276068863,BG -3276068864,3276069375,UA -3276069888,3276070399,GB -3276070400,3276070911,UA -3276071936,3276072447,GB -3276072448,3276072959,SK -3276072960,3276073471,PL -3276073472,3276073983,SK -3276073984,3276074495,DE -3276074496,3276075007,GB -3276075008,3276075519,RU -3276075520,3276076031,DE -3276076032,3276076287,NL -3276076288,3276076543,RU -3276076544,3276077055,DE -3276077568,3276078079,FR -3276078080,3276078591,RU -3276079104,3276095487,NO -3276095488,3276096511,RU -3276096512,3276097535,IT -3276097536,3276098559,NL -3276098560,3276099583,UA -3276099584,3276100607,PL -3276100608,3276101631,UA -3276101632,3276102655,LV -3276102656,3276103679,GB -3276103680,3276104703,SI -3276105728,3276106751,AT -3276106752,3276107775,BG -3276107776,3276108799,DE -3276108800,3276109823,SE -3276109824,3276110847,BG -3276110848,3276111871,PL -3276111872,3276112895,DK -3276112896,3276113919,UA -3276115968,3276116991,NL -3276116992,3276118015,RU -3276118016,3276119039,GB -3276119040,3276120063,RU -3276120064,3276121087,GB -3276121088,3276122111,BG -3276122112,3276123135,RU -3276123136,3276124159,AT -3276124160,3276125183,UA -3276125184,3276126207,AT -3276126208,3276127231,UA -3276127232,3276128255,UZ -3276128256,3276129279,AT -3276129280,3276131327,UA -3276131328,3276132351,RU -3276132352,3276133375,PL -3276133376,3276134399,GB -3276134400,3276135423,RU -3276135424,3276136447,UA -3276136448,3276137471,NL -3276138496,3276139519,NL -3276139520,3276140543,RU -3276140544,3276141567,DE -3276141568,3276143615,UA -3276144640,3276152831,CH -3276152832,3276161023,HU -3276161024,3276169215,GB -3276169216,3276177407,AT -3276177408,3276185599,CZ -3276185600,3276193791,NO -3276193792,3276201983,RU -3276201984,3276210175,AT -3276210176,3276234303,DE -3276234304,3276234367,GB -3276234368,3276275711,DE -3276275712,3276283903,SK -3276283904,3276292095,GB -3276292096,3276292479,BE -3276292480,3276292607,CH -3276292608,3276300287,BE -3276300288,3276304383,DE -3276304384,3276304639,BG -3276304640,3276305407,GB -3276305408,3276306431,IL -3276306432,3276308479,NL -3276308480,3276309503,GB -3276309504,3276310527,AT -3276310528,3276311551,PT -3276311552,3276312575,RU -3276312576,3276313599,UA -3276313600,3276314623,PL -3276314624,3276315647,FR -3276315648,3276316671,UA -3276316672,3276324863,GB -3276324864,3276333055,IT -3276333056,3276341247,RU -3276341248,3276406783,NL -3276406784,3276414975,FI -3276414976,3276415999,DK -3276416000,3276417023,SE -3276417024,3276419071,DE -3276419072,3276420095,PL -3276420096,3276421119,GB -3276421120,3276422143,PL -3276422144,3276422655,GB -3276422656,3276423167,RU -3276423168,3276423423,PL -3276423424,3276423679,NL -3276423680,3276423935,SE -3276423936,3276424191,UA -3276424192,3276424447,GB -3276424448,3276424703,PL -3276424704,3276424959,DE -3276424960,3276425215,RO -3276425216,3276425471,UA -3276425472,3276425727,DE -3276425728,3276425983,RU -3276425984,3276426239,IT -3276426240,3276426495,CZ -3276426496,3276426751,NO -3276426752,3276427007,RO -3276427008,3276427263,PL -3276427264,3276427519,FR -3276427520,3276427775,IT -3276427776,3276428031,RU -3276428032,3276428287,GB -3276428288,3276428543,RU -3276428544,3276428799,BG -3276428800,3276429055,DE -3276429056,3276429311,NL -3276430080,3276430591,PL -3276430592,3276430847,GB -3276430848,3276431103,DE -3276431104,3276431359,RU -3276431360,3276447743,GB -3276447744,3276451583,DE -3276455936,3276464127,BE -3276464128,3276472319,GR -3276474880,3276474927,IT -3276474936,3276474939,IT -3276474956,3276474959,IT -3276478064,3276478095,CH -3276478108,3276478111,CH -3276485632,3276486655,GB -3276490776,3276490776,NL -3276490782,3276490782,AT -3276490783,3276490783,CH -3276492232,3276492235,GB -3276492248,3276492259,GB -3276492284,3276492287,GB -3276492296,3276492299,GB -3276492304,3276492307,GB -3276492312,3276492315,GB -3276494476,3276494479,GB -3276495528,3276495547,GB -3276498120,3276498123,GB -3276499504,3276499571,DE -3276499576,3276499579,DE -3276499680,3276499687,DE -3276499744,3276499775,DE -3276500088,3276500091,DE -3276500108,3276500111,DE -3276500160,3276500163,DE -3276500168,3276500171,DE -3276501108,3276501111,DE -3276501116,3276501119,DE -3276501128,3276501135,DE -3276501148,3276501151,DE -3276501172,3276501183,DE -3276501196,3276501199,DE -3276503040,3276505087,DE -3276509088,3276509095,GB -3276509108,3276509115,GB -3276509184,3276510207,IT -3276512256,3276513023,ZA -3276518368,3276518383,NL -3276520704,3276520735,SE -3276522496,3276523519,NL -3276524864,3276524895,PT -3276528128,3276528195,GB -3276528204,3276528215,GB -3276528224,3276528231,GB -3276530544,3276530555,NL -3276530560,3276530571,NL -3276530584,3276530591,NL -3276530688,3276531711,NL -3276532583,3276532583,GB -3276532590,3276532590,GR -3276532608,3276532608,GB -3276533248,3276533311,SI -3276536752,3276536783,HU -3276537344,3276537599,AT -3276537856,3276668927,ES -3276668928,3276677119,MC -3276677120,3276678143,HR -3276678144,3276678655,SE -3276678656,3276679167,UA -3276679168,3276679679,DE -3276679680,3276680191,UA -3276680192,3276680703,SK -3276680704,3276681215,AT -3276681728,3276682239,BE -3276682240,3276682751,AT -3276683776,3276684287,UA -3276684288,3276684799,RU -3276684800,3276685311,DE -3276685312,3276685823,RO -3276685824,3276686335,PL -3276686336,3276686847,UA -3276686848,3276687359,FI -3276687360,3276687871,RU -3276687872,3276688383,KW -3276688384,3276688895,DE -3276688896,3276689407,ES -3276689408,3276690431,GB -3276690432,3276690943,NL -3276690944,3276691455,GR -3276691456,3276691967,RO -3276691968,3276692479,RU -3276692480,3276692991,UA -3276692992,3276693503,GB -3276693504,3276694015,UA -3276694016,3276694527,AT -3276694528,3276695039,UA -3276695040,3276695551,RU -3276695552,3276696063,UA -3276696064,3276696575,RO -3276696576,3276697087,CZ -3276697088,3276697599,GB -3276697600,3276698111,UA -3276698112,3276699647,RU -3276699648,3276700159,NL -3276700160,3276700671,CZ -3276700672,3276701183,RO -3276701184,3276701695,RU -3276701696,3276709887,SE -3276709888,3276718079,DE -3276718080,3276726271,IT -3276726272,3276727295,SE -3276727296,3276728319,ES -3276728320,3276729343,UA -3276729344,3276730367,PL -3276730368,3276731391,DE -3276731392,3276732415,UA -3276732416,3276733439,DE -3276733440,3276734463,UA -3276734464,3276734735,AT -3276734736,3276734751,DK -3276734752,3276734815,AT -3276734816,3276734847,DE -3276734880,3276734895,GB -3276734896,3276734911,NL -3276734912,3276734943,FR -3276734944,3276735455,AT -3276735456,3276735487,NL -3276735488,3276735871,AT -3276735936,3276735999,ES -3276736000,3276736511,AT -3276736512,3276736575,IT -3276736576,3276736735,GB -3276736768,3276736799,IT -3276736800,3276736815,DE -3276736816,3276736831,CZ -3276736832,3276736863,NL -3276736864,3276736871,DE -3276736872,3276736879,NL -3276736880,3276736959,DK -3276736960,3276736991,CH -3276736992,3276737015,GB -3276737016,3276737023,BE -3276737024,3276737343,IT -3276737344,3276737407,DE -3276737408,3276737535,ES -3276737536,3276737615,IT -3276737616,3276737631,DE -3276737632,3276737791,RU -3276737792,3276737935,NL -3276737936,3276737943,DE -3276737944,3276737991,GB -3276737992,3276737999,IT -3276738000,3276738015,GB -3276738016,3276738047,BE -3276738048,3276738079,GB -3276738080,3276738111,ES -3276738112,3276738143,GB -3276738144,3276738175,IT -3276738176,3276738559,GB -3276738560,3276738847,CH -3276739072,3276739151,CH -3276739168,3276740127,CH -3276740128,3276740167,GB -3276740168,3276740175,DE -3276740176,3276740191,NL -3276740224,3276740351,CH -3276740352,3276740703,FR -3276740704,3276740719,IT -3276740720,3276740735,CZ -3276740736,3276740799,PT -3276740800,3276740815,SI -3276740816,3276740831,SK -3276740832,3276740863,DE -3276740864,3276741375,FR -3276741632,3276742655,FR -3276742656,3276742735,RU -3276742736,3276742751,NL -3276742752,3276742783,GR -3276742784,3276742911,HU -3276742912,3276743071,AT -3276743072,3276743103,DE -3276743104,3276743135,HU -3276743136,3276743167,NL -3276743424,3276743903,AT -3276743904,3276743935,BE -3276743936,3276744191,AT -3276744192,3276744703,BE -3276744704,3276744959,IT -3276744960,3276745215,GR -3276745216,3276745295,DK -3276745296,3276745311,NL -3276745312,3276745343,DK -3276745344,3276745407,DE -3276745408,3276745655,DK -3276745664,3276745727,DK -3276745728,3276746047,GB -3276746048,3276746111,DE -3276746112,3276746239,IT -3276746240,3276746335,GB -3276746336,3276746351,BE -3276746352,3276746367,NL -3276746368,3276746751,GB -3276746752,3276748287,CH -3276748288,3276748799,GB -3276748800,3276748951,AT -3276748952,3276748959,GB -3276748960,3276749023,AT -3276749024,3276749055,IT -3276749056,3276749087,AT -3276749088,3276749103,FR -3276749120,3276749183,NL -3276749184,3276749311,DE -3276749312,3276749343,BE -3276749344,3276749375,DE -3276749376,3276749823,BE -3276749824,3276750151,NL -3276750152,3276750159,GB -3276750160,3276750175,FR -3276750176,3276750207,BE -3276750208,3276750335,FR -3276750336,3276750431,GB -3276750464,3276751039,GB -3276751040,3276751071,FR -3276751072,3276751087,GB -3276751088,3276751103,NL -3276751104,3276751175,GB -3276751176,3276751199,SE -3276751232,3276751295,IL -3276751296,3276751359,AT -3276751360,3276753055,GB -3276753056,3276753071,NO -3276753072,3276753119,GB -3276753120,3276753151,IT -3276753152,3276753375,GB -3276753376,3276753407,FI -3276753408,3276753951,GB -3276753952,3276753983,HU -3276753984,3276754991,GB -3276754992,3276755007,DE -3276755008,3276755071,HU -3276755072,3276755199,DE -3276755200,3276755775,GB -3276755776,3276755791,NO -3276755792,3276755807,RU -3276755808,3276755839,GB -3276755840,3276755967,ES -3276755968,3276756031,GB -3276756032,3276756063,NL -3276756064,3276756095,BE -3276756096,3276756287,GB -3276756288,3276756319,SE -3276756320,3276756351,FR -3276756352,3276756671,GB -3276756672,3276756735,DE -3276756736,3276757119,GB -3276757120,3276757135,NO -3276757136,3276757151,NL -3276757152,3276757183,GB -3276757248,3276757503,GB -3276757760,3276757823,GB -3276757824,3276757839,DE -3276757840,3276757855,ES -3276757856,3276757887,CH -3276757888,3276759039,GB -3276759040,3276759695,DE -3276759696,3276759711,NL -3276759712,3276759743,DE -3276759744,3276759775,CH -3276759808,3276761215,DE -3276761216,3276761279,ES -3276761280,3276761919,DE -3276761920,3276761983,GB -3276761984,3276762015,DK -3276762016,3276762111,FR -3276762112,3276762623,DE -3276762880,3276762943,DE -3276762944,3276762959,GB -3276762960,3276762975,IT -3276762976,3276763007,NO -3276763008,3276763327,DE -3276763328,3276763391,SE -3276763392,3276763519,DE -3276763520,3276763551,IT -3276763552,3276763567,CH -3276763568,3276763583,GR -3276763584,3276763647,GB -3276763648,3276763967,DE -3276763968,3276763983,DK -3276763984,3276763991,GB -3276763992,3276763999,BE -3276764000,3276764031,IT -3276764160,3276765183,DE -3276765184,3276766975,GB -3276766976,3276766983,FR -3276766992,3276767015,FR -3276767016,3276767023,DK -3276767024,3276767039,BE -3276767040,3276767079,FR -3276767080,3276767087,GB -3276767088,3276767103,NL -3276767104,3276767231,FR -3276767232,3276767743,ZA -3276767744,3276767807,NL -3276767808,3276767871,DK -3276767872,3276767935,NL -3276767936,3276767967,FR -3276767968,3276767999,AT -3276768000,3276768511,NL -3276768512,3276768767,DE -3276768768,3276768863,ES -3276768864,3276768895,AT -3276768896,3276769023,HU -3276769024,3276769279,DE -3276769280,3276769295,ES -3276769296,3276769311,DE -3276769312,3276769343,CH -3276769344,3276769407,NL -3276769408,3276769919,ES -3276769984,3276770015,AT -3276770016,3276770031,IT -3276770032,3276770047,CH -3276770048,3276770143,ES -3276770144,3276770175,FI -3276770176,3276770239,ES -3276770240,3276770303,DK -3276770304,3276770815,ES -3276770944,3276771135,ES -3276771200,3276771327,ES -3276771328,3276771455,NL -3276771456,3276771583,GB -3276771584,3276772287,NL -3276772288,3276772351,AT -3276772352,3276772567,BE -3276772576,3276773375,BE -3276773376,3276774047,DK -3276774048,3276774079,FI -3276774080,3276774095,DK -3276774112,3276774143,IE -3276774144,3276774271,DK -3276774272,3276774303,DE -3276774304,3276774335,FR -3276774336,3276774399,GB -3276774400,3276774543,SE -3276774544,3276774559,GB -3276774560,3276774591,DE -3276774592,3276774655,CH -3276774656,3276775103,SE -3276775104,3276775167,NL -3276775168,3276775295,SE -3276775296,3276775359,FR -3276775360,3276775391,DK -3276775392,3276775423,DE -3276775424,3276781151,NL -3276781152,3276781247,FR -3276781248,3276781311,BE -3276781312,3276781503,NL -3276781504,3276781567,FR -3276781568,3276782719,BE -3276782784,3276782799,FR -3276782800,3276782815,CZ -3276782816,3276782847,ES -3276782848,3276782975,BE -3276782976,3276783039,GR -3276783040,3276783055,DK -3276783056,3276783071,GB -3276783072,3276783087,PT -3276783088,3276783103,CH -3276783104,3276783615,IT -3276783616,3276784383,FR -3276784640,3276784895,FR -3276784896,3276785151,NO -3276785152,3276785407,IE -3276785408,3276785439,PT -3276785440,3276785455,GR -3276785456,3276785463,GB -3276785464,3276785471,IE -3276785472,3276785535,PT -3276785536,3276785567,BE -3276785568,3276785599,PT -3276785600,3276785607,TR -3276785608,3276785615,PL -3276785616,3276785631,CZ -3276785632,3276785663,IT -3276785664,3276785791,IL -3276785792,3276785823,NL -3276785856,3276785919,GB -3276785920,3276786175,AT -3276786176,3276786431,NO -3276786688,3276786815,HU -3276786816,3276786879,SE -3276786880,3276786911,TR -3276786912,3276786943,BE -3276786944,3276787359,AT -3276787360,3276787391,DE -3276787392,3276787455,BE -3276787456,3276787775,FR -3276787968,3276788735,FR -3276788736,3276788863,IE -3276788864,3276788895,DE -3276788928,3276788991,NL -3276788992,3276789247,NO -3276789248,3276789439,FI -3276789504,3276789567,FR -3276789568,3276789583,ES -3276789584,3276789599,FR -3276789600,3276789615,ES -3276789616,3276789631,NL -3276789632,3276789759,FR -3276789760,3276790015,IT -3276790016,3276790111,ES -3276790112,3276790127,FR -3276790128,3276790143,NL -3276790144,3276790175,IT -3276790176,3276790191,NL -3276790200,3276790207,DE -3276790208,3276790223,NL -3276790224,3276790271,GB -3276790272,3276790527,IE -3276790528,3276790783,HU -3276790784,3276790943,PK -3276790944,3276791007,IT -3276791008,3276791039,NL -3276791040,3276791295,GB -3276791296,3276791327,PT -3276791552,3276792831,GB -3276792832,3276793087,FR -3276793088,3276793279,GB -3276793280,3276793343,IE -3276793344,3276793735,FR -3276793736,3276793743,NL -3276793744,3276793751,BE -3276793752,3276793759,FR -3276793760,3276793791,PL -3276793792,3276793855,FR -3276794112,3276794255,NL -3276794256,3276794271,DE -3276794304,3276794335,DK -3276794336,3276794367,NL -3276794368,3276795903,BE -3276795904,3276797951,AT -3276799104,3276799231,GB -3276799296,3276799359,GB -3276799360,3276799391,NL -3276799392,3276799455,AT -3276799456,3276799471,PL -3276799472,3276799487,NL -3276799488,3276799743,DE -3276799744,3276799775,NL -3276799776,3276799807,GB -3276799808,3276799839,FR -3276799840,3276799871,ES -3276799872,3276799999,NL -3276800000,3276824575,GB -3276824576,3276832767,EE -3276832768,3276834815,PL -3276834816,3276835839,RU -3276835840,3276836351,UA -3276836352,3276836863,RO -3276836864,3276837887,RU -3276837888,3276838911,PL -3276838912,3276840959,FR -3276840960,3276849151,SK -3276849152,3276857343,DE -3276857344,3276857599,RU -3276857600,3276857855,SI -3276857856,3276858111,NL -3276858112,3276858367,KW -3276858368,3276858623,RU -3276858624,3276858879,PL -3276859392,3276859647,UA -3276859648,3276859903,CH -3276859904,3276860159,AT -3276860160,3276860415,CH -3276860416,3276860927,PL -3276860928,3276861183,BE -3276861184,3276861439,DE -3276861440,3276865535,DK -3276865536,3276866559,NL -3276866560,3276868703,GB -3276868704,3276868711,BE -3276868712,3276870719,GB -3276870720,3276870735,IT -3276870736,3276870911,GB -3276870912,3276871679,IT -3276871680,3276873759,GB -3276873760,3276873791,ES -3276873792,3276873983,GB -3276873984,3276874239,ES -3276874240,3276874351,GB -3276874352,3276874367,ES -3276874368,3276874959,GB -3276874960,3276874975,NL -3276874976,3276876279,GB -3276876280,3276876283,DK -3276876284,3276880427,GB -3276880428,3276880431,DK -3276880432,3276881411,GB -3276881412,3276881415,FR -3276881416,3276881811,GB -3276881812,3276881815,FR -3276881816,3276882047,GB -3276882048,3276882687,IT -3276882688,3276883077,GB -3276883078,3276883078,IT -3276883079,3276883639,GB -3276883640,3276883643,IT -3276883644,3276883711,GB -3276883712,3276883839,IT -3276883840,3276884687,GB -3276884688,3276884719,PL -3276884720,3276886363,GB -3276886364,3276886367,DE -3276886368,3276886649,GB -3276886650,3276886650,DE -3276886651,3276886911,GB -3276886912,3276887039,DE -3276887040,3276889087,GB -3276889088,3276889215,IT -3276889216,3276890175,GB -3276890176,3276890191,US -3276890192,3276892287,GB -3276892288,3276892367,IT -3276892368,3276893695,GB -3276893696,3276893951,IT -3276893952,3276897727,GB -3276897728,3276897791,BE -3276897792,3276898671,GB -3276898672,3276898687,CH -3276898688,3276898783,GB -3276898784,3276898799,CH -3276898800,3276899263,GB -3276899264,3276899295,CH -3276899296,3276900207,GB -3276900208,3276900211,CH -3276900212,3276901613,GB -3276901614,3276901614,CH -3276901615,3276902141,GB -3276902142,3276902142,CH -3276902143,3276902367,GB -3276902368,3276902399,CH -3276902400,3276902655,GB -3276902656,3276902911,SE -3276902912,3276903423,GB -3276903424,3276903487,SE -3276903488,3276903551,GB -3276903552,3276903679,SE -3276903680,3276907341,GB -3276907342,3276907342,NL -3276907343,3276908759,GB -3276908760,3276908760,NL -3276908761,3276909831,GB -3276909832,3276909835,NL -3276909836,3276911167,GB -3276911168,3276911199,IT -3276911200,3276911249,GB -3276911250,3276911250,IT -3276911251,3276911679,GB -3276911680,3276911711,IT -3276911712,3276912207,GB -3276912208,3276912215,IT -3276912216,3276912287,GB -3276912288,3276912319,IT -3276912320,3276912383,GB -3276912384,3276912511,IT -3276912512,3276912671,GB -3276912672,3276912687,IT -3276912688,3276912879,GB -3276912880,3276912895,IT -3276912896,3276917231,GB -3276917232,3276917247,FR -3276917248,3276917735,GB -3276917736,3276917739,ES -3276917740,3276919061,GB -3276919062,3276919062,DE -3276919063,3276919375,GB -3276919376,3276919391,DE -3276919392,3276919487,GB -3276919488,3276919535,DE -3276919536,3276922735,GB -3276922736,3276922751,DE -3276922752,3276922879,GB -3276922880,3276924927,FR -3276924928,3276925911,GB -3276925912,3276925919,FR -3276925920,3276925951,GB -3276925952,3276926207,FR -3276926208,3276926683,GB -3276926684,3276926687,FR -3276926688,3276931071,GB -3276931072,3276939263,KZ -3276939264,3276955647,DE -3276955648,3276956159,GB -3276956160,3276958463,ES -3276958464,3276958719,GB -3276958720,3276958975,NL -3276958976,3276959231,GB -3276959232,3276959487,IL -3276959488,3276959743,US -3276959744,3276963071,ES -3276963072,3276963327,GB -3276963328,3276963839,ES -3276963840,3276964351,IL -3276964352,3276964863,RO -3276965376,3276966399,RU -3276966400,3276966911,BH -3276966912,3276968959,RU -3276968960,3276969471,RO -3276969472,3276969983,UA -3276969984,3276970495,DE -3276970496,3276971519,RU -3276971520,3276972031,DE -3276972032,3276980223,PL -3276980224,3276988415,DK -3276988416,3276996607,AT -3276996608,3277062143,FR -3277062144,3277127679,SE -3277127680,3277160447,DK -3277160448,3277176831,NL -3277176832,3277177087,SI -3277177088,3277177343,GB -3277177856,3277178111,PL -3277178368,3277178623,UA -3277178624,3277178879,PL -3277178880,3277179135,ES -3277179392,3277179647,DE -3277179648,3277180159,BE -3277180416,3277180671,RU -3277180928,3277181183,UA -3277181184,3277181439,PL -3277181440,3277181695,DE -3277181696,3277181951,RO -3277181952,3277182207,IT -3277182208,3277182463,RU -3277182464,3277182719,UA -3277182720,3277182975,BG -3277183232,3277183487,DE -3277183744,3277183999,UA -3277184000,3277184255,DE -3277184256,3277184511,PT -3277184512,3277184767,DE -3277185024,3277185279,SA -3277185280,3277185535,RU -3277185792,3277186047,PL -3277186048,3277186303,IT -3277186304,3277186559,DE -3277186560,3277186815,PL -3277186816,3277187071,RU -3277187072,3277187327,GB -3277187584,3277188351,RU -3277188352,3277188607,DE -3277188608,3277188863,RU -3277188864,3277189119,RO -3277189120,3277189375,DE -3277189376,3277189631,PL -3277189632,3277189887,TR -3277189888,3277190143,PL -3277190400,3277190655,GB -3277190656,3277190911,BE -3277190912,3277191167,FR -3277191424,3277191679,PL -3277191680,3277191935,UA -3277191936,3277192191,DK -3277192192,3277192447,PL -3277192448,3277192703,DK -3277192704,3277192959,GB -3277192960,3277193215,TR -3277193216,3277258751,NL -3277258752,3277324287,TR -3277324288,3277324799,RU -3277324800,3277325055,KZ -3277325056,3277325311,RU -3277325312,3277326335,IT -3277326336,3277326847,GB -3277326848,3277327359,AT -3277327360,3277327871,RS -3277327872,3277328383,UA -3277328384,3277328895,RU -3277328896,3277329407,NL -3277329408,3277329919,GB -3277329920,3277330431,RU -3277330944,3277331455,UA -3277331456,3277332479,PL -3277332480,3277332991,NL -3277332992,3277333503,AT -3277333504,3277334015,DK -3277334016,3277334527,RO -3277334528,3277335039,RU -3277335040,3277335551,UA -3277335552,3277336063,DE -3277336064,3277336575,HR -3277336576,3277337087,AT -3277337088,3277337599,PL -3277337600,3277338111,UA -3277338112,3277338623,NO -3277339136,3277339647,RU -3277339648,3277340159,DE -3277340160,3277340671,RU -3277340672,3277341183,RO -3277341184,3277341695,AM -3277341696,3277342207,RU -3277342208,3277342719,GB -3277342720,3277343231,UA -3277343232,3277343743,BG -3277343744,3277344767,UA -3277344768,3277345279,RO -3277345280,3277345791,SI -3277345792,3277346303,FR -3277346304,3277346815,GB -3277346816,3277347327,DE -3277347328,3277347839,PL -3277347840,3277348351,RU -3277348352,3277348863,FR -3277348864,3277349887,RO -3277349888,3277350399,GB -3277350400,3277350911,RU -3277351424,3277351935,NO -3277351936,3277352447,DE -3277352448,3277352959,SE -3277352960,3277353471,RU -3277353472,3277353983,PL -3277353984,3277354495,DE -3277354496,3277355007,GB -3277355008,3277355519,RU -3277355520,3277356031,MK -3277356032,3277356543,UA -3277356544,3277357055,RU -3277357056,3277357567,PL -3277357568,3277358079,SE -3277358080,3277359103,RU -3277359104,3277359615,NL -3277359616,3277360127,UA -3277360128,3277360639,BG -3277360640,3277361151,CZ -3277361152,3277361663,PL -3277362176,3277362687,ES -3277363200,3277363711,ES -3277363712,3277364223,RU -3277364224,3277364735,GB -3277364736,3277365247,UA -3277365248,3277365759,NL -3277365760,3277366271,GR -3277366272,3277366783,CZ -3277366784,3277367295,AT -3277367808,3277368319,RU -3277368320,3277369343,RO -3277369344,3277369855,CY -3277369856,3277370367,RU -3277370368,3277370623,PL -3277370624,3277370879,RU -3277370880,3277371391,RO -3277371392,3277371903,RU -3277371904,3277372415,PL -3277372416,3277372927,IR -3277373440,3277373951,RU -3277373952,3277374463,FR -3277374464,3277375999,RU -3277376000,3277376511,NL -3277377536,3277378047,RU -3277378560,3277379071,HR -3277379072,3277379583,UZ -3277379584,3277380095,RS -3277380608,3277381119,RU -3277381120,3277381631,KW -3277381632,3277382143,RU -3277382656,3277383167,GB -3277383680,3277384191,PL -3277384704,3277385215,GB -3277385216,3277385727,AT -3277385728,3277386239,RU -3277386240,3277386751,UA -3277386752,3277387263,SA -3277387264,3277388287,RU -3277388288,3277388543,RO -3277388544,3277388799,HU -3277388800,3277389311,RU -3277389312,3277389823,AM -3277389824,3277394943,GB -3277394944,3277395455,US -3277395456,3277403135,GB -3277403136,3277403215,FR -3277403216,3277403231,GB -3277403232,3277403311,FR -3277403312,3277403327,GB -3277403328,3277403359,FR -3277403360,3277403375,GB -3277403376,3277403455,FR -3277403456,3277403471,AT -3277403472,3277403487,FR -3277403488,3277403647,GB -3277403648,3277403807,ES -3277403808,3277404159,GB -3277404160,3277404415,DE -3277404416,3277404671,IT -3277404672,3277404735,CH -3277404736,3277404927,GB -3277404928,3277404975,NL -3277404976,3277405183,GB -3277405184,3277405263,SE -3277405264,3277405439,GB -3277405440,3277405471,DE -3277405472,3277452639,GB -3277452640,3277452647,IE -3277452648,3277452655,DK -3277452656,3277455359,GB -3277455360,3277463551,DE -3277463552,3277471743,US -3277471744,3277480447,GB -3277480960,3277481471,DK -3277481472,3277481983,PL -3277481984,3277482495,SE -3277482496,3277483007,PL -3277483008,3277483519,IT -3277483520,3277484031,RO -3277484032,3277484543,CH -3277486080,3277486591,GB -3277487104,3277487615,RO -3277487616,3277488127,PL -3277488128,3277504511,RU -3277504512,3277520895,DE -3277520896,3277553663,SK -3277553664,3277586431,RU -3277586432,3277666815,GB -3277666816,3277667327,US -3277667328,3277676543,DE -3277676544,3277680639,FR -3277680640,3277684735,US -3277684736,3277685247,RU -3277685248,3277685759,DE -3277685760,3277686271,IE -3277686272,3277686783,PL -3277686784,3277687295,RO -3277687296,3277687807,UA -3277687808,3277688319,RO -3277688320,3277688831,PL -3277688832,3277689343,RU -3277689344,3277689855,AT -3277689856,3277690879,RU -3277690880,3277691391,KZ -3277691392,3277691903,UA -3277691904,3277692415,GB -3277692416,3277692927,DE -3277693440,3277693951,PL -3277693952,3277694463,RU -3277694464,3277694975,DE -3277694976,3277695487,IT -3277695488,3277695999,ES -3277696000,3277696511,UA -3277696512,3277697023,AT -3277697536,3277698047,PL -3277698048,3277698559,RU -3277698560,3277699071,DE -3277699584,3277700607,RU -3277700608,3277701119,UA -3277701120,3277701631,DK -3277701632,3277702143,AT -3277702656,3277703679,DE -3277703680,3277704191,PL -3277704192,3277704703,UA -3277704704,3277705215,RU -3277705728,3277706239,ES -3277706240,3277706751,UA -3277707264,3277707775,CZ -3277707776,3277708287,MD -3277708288,3277708799,AT -3277708800,3277709311,PL -3277709312,3277709823,NL -3277709824,3277710335,GB -3277710336,3277710847,RU -3277710848,3277711359,PL -3277711360,3277711871,NO -3277711872,3277712383,IL -3277712384,3277712895,PL -3277712896,3277713407,NL -3277713408,3277713919,RU -3277713920,3277714943,DE -3277714944,3277715967,RU -3277715968,3277716479,PL -3277716480,3277716991,SE -3277716992,3277717503,IT -3277717504,3277725695,YE -3277725696,3277730157,CH -3277730158,3277730158,GB -3277730159,3277730559,CH -3277730560,3277730563,GB -3277730564,3277731103,CH -3277731104,3277731119,DE -3277731120,3277731122,CH -3277731123,3277731123,DE -3277731124,3277731223,CH -3277731224,3277731231,DE -3277731232,3277731247,CH -3277731248,3277731255,DE -3277731256,3277732207,CH -3277732208,3277732223,GB -3277732224,3277733887,CH -3277733888,3277742079,DE -3277742080,3277745151,FI -3277745152,3277746175,CH -3277746176,3277750271,GB -3277750272,3277766655,IT -3277766656,3277774847,PL -3277774848,3277783039,RU -3277783040,3277815807,BE -3277816064,3277816319,PL -3277816576,3277816831,GB -3277816832,3277817087,CH -3277817088,3277817343,GB -3277817600,3277817855,FR -3277817856,3277818111,BE -3277818112,3277818367,DE -3277818368,3277818623,CY -3277818624,3277818879,UA -3277818880,3277819135,SE -3277819136,3277819391,CH -3277819392,3277819647,IT -3277819648,3277819903,GB -3277819904,3277820159,PL -3277820160,3277820415,RO -3277820416,3277820671,DE -3277820672,3277820927,UA -3277820928,3277821183,CH -3277821184,3277821439,TR -3277821440,3277821695,NL -3277821696,3277821951,UA -3277821952,3277822207,RO -3277822208,3277822463,ES -3277822464,3277822719,PL -3277822976,3277823231,ES -3277823232,3277823487,UA -3277823488,3277823743,SI -3277823744,3277823999,UA -3277824000,3277824255,TR -3277824256,3277824511,SI -3277824512,3277825023,AT -3277825024,3277825279,PL -3277825280,3277825535,UA -3277825536,3277826047,RO -3277826048,3277826303,FR -3277826304,3277826815,PL -3277826816,3277827071,UA -3277827072,3277827327,DK -3277827328,3277827583,SI -3277827584,3277828095,NL -3277828096,3277828351,PL -3277828352,3277828607,NL -3277828608,3277828863,RO -3277828864,3277829119,TR -3277829120,3277829375,RO -3277829376,3277829631,DK -3277829632,3277829887,PL -3277829888,3277830143,IL -3277830144,3277830399,SE -3277830656,3277830911,PL -3277830912,3277831167,GB -3277831168,3277831423,PL -3277831424,3277831679,UA -3277831680,3277832191,IE -3277833216,3277833727,BE -3277833728,3277834239,NL -3277834240,3277836287,UA -3277836288,3277836799,FI -3277836800,3277837311,UA -3277837312,3277839103,RU -3277839104,3277839359,AE -3277839360,3277839871,DE -3277839872,3277840383,UA -3277840384,3277840895,FR -3277840896,3277841407,GR -3277841408,3277841919,RO -3277841920,3277842431,IT -3277842432,3277842943,UA -3277842944,3277843455,PL -3277843456,3277843967,PT -3277843968,3277845503,DK -3277845504,3277847039,NL -3277847552,3277848063,RU -3277848064,3277848575,RO -3277848576,3277856767,AT -3277856768,3277864959,DE -3277864960,3277873151,RU -3277873152,3277881343,NL -3277881344,3277886463,IT -3277886464,3277887487,IQ -3277887488,3277889535,IT -3277889536,3277897727,RU -3277897728,3277905919,IT -3277905920,3277914111,BG -3277914112,3277946879,GR -3277946880,3277963263,DK -3277963264,3277979647,GB -3277979648,3277987839,SK -3277987840,3278004223,RU -3278004224,3278012415,FR -3278012416,3278020607,SK -3278020608,3278028799,RU -3278028800,3278036991,DE -3278036992,3278045183,FR -3278045184,3278061567,GB -3278061568,3278065663,NL -3278065664,3278110719,GB -3278110720,3278176255,SE -3278176256,3278241791,FR -3278241792,3278307327,GB -3278307328,3278372863,IT -3278372864,3278635007,GB -3278635008,3278766079,NL -3278767104,3278767615,RO -3278767616,3278768127,UA -3278768128,3278769151,GB -3278769152,3278769663,FR -3278769664,3278770175,DE -3278770176,3278770687,DK -3278770688,3278771711,DE -3278772224,3278772735,BG -3278772736,3278773247,DE -3278773248,3278773759,NO -3278773760,3278774271,GB -3278774272,3278774783,RU -3278774784,3278775295,FR -3278775296,3278775807,GB -3278775808,3278776319,IR -3278776320,3278776831,IL -3278776832,3278777343,DE -3278777344,3278777855,SE -3278777856,3278778367,RU -3278778368,3278779391,PL -3278779392,3278779903,RU -3278779904,3278780415,BE -3278780416,3278780927,UA -3278780928,3278781439,GB -3278781440,3278781951,DE -3278781952,3278782463,RU -3278782464,3278790095,GB -3278790096,3278790111,ES -3278790112,3278790655,GB -3278790656,3278793727,IT -3278793728,3278794751,GB -3278794752,3278807039,IT -3278807040,3278815231,GB -3278815232,3278823423,AT -3278823424,3278831615,FR -3278831616,3278897151,HU -3278897152,3278913535,GB -3278913536,3278921727,CH -3278921728,3278929919,RU -3278929920,3278938111,TR -3278938112,3278938151,DE -3278938152,3278938155,GB -3278938156,3278938159,DE -3278938160,3278938163,ES -3278938164,3278938171,DE -3278938172,3278938175,NL -3278938176,3278938179,FR -3278938180,3278938183,NL -3278938184,3278938191,DE -3278938192,3278938195,ES -3278938196,3278938199,NL -3278938200,3278938203,CH -3278938204,3278938207,DE -3278938208,3278938215,IT -3278938216,3278938227,DE -3278938228,3278938231,FR -3278938232,3278938235,DE -3278938236,3278938239,FR -3278938240,3278938243,LI -3278938244,3278938247,IT -3278938248,3278938251,AT -3278938252,3278938259,DE -3278938260,3278938263,CH -3278938264,3278938267,DE -3278938268,3278938275,FR -3278938276,3278938279,NL -3278938280,3278938283,AT -3278938284,3278938287,DE -3278938288,3278938291,ES -3278938292,3278938299,DE -3278938300,3278938303,ES -3278938304,3278938307,DE -3278938308,3278938311,GB -3278938312,3278938315,DE -3278938316,3278938323,FR -3278938324,3278938335,DE -3278938336,3278938339,CH -3278938340,3278938343,DE -3278938344,3278938347,NL -3278938348,3278938351,FR -3278938352,3278938359,DE -3278938360,3278938363,DK -3278938364,3278938367,BH -3278938368,3278938375,FR -3278938376,3278938399,DE -3278938400,3278938403,AT -3278938404,3278938407,DE -3278938408,3278938411,CH -3278938412,3278938415,DE -3278938416,3278938419,CH -3278938420,3278938423,GB -3278938424,3278938427,DE -3278938428,3278938431,FR -3278938432,3278938439,DE -3278938440,3278938443,IT -3278938444,3278938447,DE -3278938448,3278938451,IT -3278938452,3278938455,DE -3278938456,3278938459,ES -3278938460,3278938463,FR -3278938464,3278938487,DE -3278938488,3278938491,NL -3278938492,3278938495,ES -3278938496,3278938499,NL -3278938500,3278938519,DE -3278938520,3278938523,NL -3278938524,3278938527,FR -3278938528,3278938531,NO -3278938532,3278938563,DE -3278938564,3278938567,FR -3278938568,3278938583,DE -3278938584,3278938587,GB -3278938588,3278938591,CH -3278938592,3278938595,DE -3278938596,3278938599,DK -3278938600,3278938607,DE -3278938608,3278938611,AT -3278938612,3278938615,NL -3278938616,3278938619,DK -3278938620,3278938627,FR -3278938628,3278938631,DE -3278938632,3278938635,NL -3278938636,3278938639,GB -3278938640,3278938643,DE -3278938644,3278938647,GB -3278938648,3278938659,DE -3278938660,3278938663,CH -3278938664,3278938667,GB -3278938668,3278938675,DE -3278938676,3278938679,FR -3278938680,3278938695,DE -3278938696,3278938699,IT -3278938700,3278938703,ES -3278938704,3278938707,FR -3278938708,3278938719,DE -3278938720,3278938723,NL -3278938724,3278938727,BE -3278938728,3278938731,ES -3278938732,3278938735,CH -3278938736,3278938739,DE -3278938740,3278938743,FR -3278938744,3278938751,DE -3278938752,3278938755,CH -3278938756,3278938759,DE -3278938760,3278938763,GB -3278938764,3278938767,DE -3278938768,3278938771,GB -3278938772,3278938775,SE -3278938776,3278938779,GB -3278938780,3278938783,IT -3278938784,3278938787,BE -3278938788,3278938791,ES -3278938792,3278938803,DE -3278938804,3278938807,IT -3278938808,3278938815,GB -3278938816,3278938831,DE -3278938832,3278938835,IT -3278938836,3278938839,FR -3278938840,3278938863,DE -3278938864,3278938871,IT -3278938872,3278938875,DE -3278938876,3278938879,NL -3278938880,3278938887,FR -3278938888,3278938891,ES -3278938892,3278938895,DE -3278938896,3278938903,FR -3278938904,3278938911,GB -3278938912,3278938927,DE -3278938928,3278938931,GB -3278938932,3278938943,DE -3278938944,3278938947,IT -3278938948,3278938951,DE -3278938952,3278938955,FR -3278938956,3278938967,DE -3278938968,3278938971,BE -3278938972,3278938975,DE -3278938976,3278938979,NL -3278938980,3278938987,FR -3278938988,3278938991,AT -3278938992,3278938995,FR -3278938996,3278938999,DE -3278939000,3278939003,ES -3278939004,3278939007,NL -3278939008,3278939011,DE -3278939012,3278939015,RU -3278939016,3278939047,DE -3278939048,3278939055,FR -3278939056,3278939075,DE -3278939076,3278939079,CH -3278939080,3278939083,DE -3278939084,3278939087,IT -3278939088,3278939091,IS -3278939092,3278939095,DE -3278939096,3278939099,IT -3278939100,3278939103,DE -3278939104,3278939107,CH -3278939108,3278939111,FR -3278939112,3278939131,DE -3278939132,3278939135,NL -3278939136,3278939147,US -3278939148,3278939151,AR -3278939152,3278939155,ES -3278939156,3278939195,US -3278939196,3278939199,CL -3278939200,3278939259,US -3278939260,3278939263,BR -3278939264,3278939271,AR -3278939272,3278939279,US -3278939280,3278939283,CO -3278939284,3278939291,US -3278939292,3278939295,AR -3278939296,3278939307,US -3278939308,3278939311,MX -3278939312,3278939315,US -3278939316,3278939319,AR -3278939320,3278939323,US -3278939324,3278939327,CA -3278939328,3278939331,US -3278939332,3278939335,BR -3278939336,3278939339,CA -3278939340,3278939351,US -3278939352,3278939355,BR -3278939356,3278939379,US -3278939380,3278939383,BR -3278939384,3278939391,US -3278939392,3278939403,DE -3278939404,3278939407,CH -3278939408,3278939419,DE -3278939420,3278939423,IE -3278939424,3278939439,DE -3278939440,3278939443,IT -3278939444,3278939459,DE -3278939460,3278939463,DK -3278939464,3278939467,CY -3278939468,3278939471,DE -3278939472,3278939475,PL -3278939476,3278939479,BE -3278939480,3278939483,DE -3278939484,3278939491,NL -3278939492,3278939495,DE -3278939496,3278939499,CH -3278939500,3278939515,DE -3278939516,3278939523,NL -3278939524,3278939527,LU -3278939528,3278939531,FR -3278939532,3278939535,DE -3278939536,3278939539,BE -3278939540,3278939571,DE -3278939572,3278939575,ES -3278939576,3278939579,DE -3278939580,3278939583,NL -3278939584,3278939587,IT -3278939588,3278939591,LU -3278939592,3278939595,DE -3278939596,3278939599,NL -3278939600,3278939603,GB -3278939604,3278939607,DE -3278939608,3278939611,DK -3278939612,3278939615,FR -3278939616,3278939631,DE -3278939632,3278939635,GB -3278939636,3278939639,DK -3278939640,3278939647,DE -3278939648,3278939651,FR -3278939652,3278939663,DE -3278939664,3278939667,IT -3278939668,3278939743,DE -3278939744,3278939747,GB -3278939748,3278939751,DE -3278939752,3278939755,GR -3278939756,3278939759,DE -3278939760,3278939763,FR -3278939764,3278939783,DE -3278939784,3278939787,BE -3278939788,3278939803,DE -3278939804,3278939807,GB -3278939808,3278939823,DE -3278939824,3278939827,HU -3278939828,3278939835,DE -3278939836,3278939839,FR -3278939840,3278939859,DE -3278939860,3278939863,GB -3278939864,3278939867,IT -3278939868,3278939871,DE -3278939872,3278939875,ES -3278939876,3278939879,IT -3278939880,3278939887,DE -3278939888,3278939891,PL -3278939892,3278939899,ES -3278939900,3278939903,IT -3278939904,3278939907,HK -3278939908,3278939911,MY -3278939912,3278939919,DE -3278939920,3278939923,SG -3278939924,3278939927,DE -3278939928,3278939931,SG -3278939932,3278939935,IN -3278939936,3278939939,MY -3278939940,3278939947,DE -3278939948,3278939951,SG -3278939952,3278939955,MY -3278939956,3278939963,DE -3278939964,3278939967,MY -3278939968,3278939971,TW -3278939972,3278939975,MY -3278939976,3278939991,DE -3278939992,3278939995,SG -3278939996,3278939999,DE -3278940000,3278940007,SG -3278940008,3278940015,DE -3278940016,3278940043,SG -3278940044,3278940047,DE -3278940048,3278940059,SG -3278940060,3278940067,CN -3278940068,3278940071,TW -3278940072,3278940079,DE -3278940080,3278940083,SG -3278940084,3278940087,DE -3278940088,3278940091,MY -3278940092,3278940095,SG -3278940096,3278940099,DE -3278940100,3278940103,SG -3278940104,3278940107,MY -3278940108,3278940111,SG -3278940112,3278940115,DE -3278940116,3278940127,SG -3278940128,3278940163,DE -3278940164,3278940167,CH -3278940168,3278940171,DE -3278940172,3278940175,FR -3278940176,3278940179,GB -3278940180,3278940183,CH -3278940184,3278940187,DE -3278940188,3278940195,GB -3278940196,3278940215,DE -3278940216,3278940219,NL -3278940220,3278940223,DE -3278940224,3278940227,CH -3278940228,3278940231,DE -3278940232,3278940235,CH -3278940236,3278940239,ES -3278940240,3278940247,DE -3278940248,3278940251,FR -3278940252,3278940255,IT -3278940256,3278940259,BE -3278940260,3278940263,DE -3278940264,3278940267,ES -3278940268,3278940275,DE -3278940276,3278940279,GB -3278940280,3278940283,CH -3278940284,3278940291,NL -3278940292,3278940295,DE -3278940296,3278940299,IT -3278940300,3278940311,DE -3278940312,3278940315,IT -3278940316,3278940319,DE -3278940320,3278940323,NL -3278940324,3278940327,ES -3278940328,3278940335,DE -3278940336,3278940339,NL -3278940340,3278940347,DE -3278940348,3278940351,GB -3278940352,3278940355,DE -3278940356,3278940359,NL -3278940360,3278940363,DE -3278940364,3278940367,IT -3278940368,3278940371,FR -3278940372,3278940375,GB -3278940376,3278940379,PT -3278940380,3278940383,FR -3278940384,3278940387,NL -3278940388,3278940391,IE -3278940392,3278940395,FR -3278940396,3278940403,DE -3278940404,3278940407,FR -3278940408,3278940411,IT -3278940412,3278940423,DE -3278940424,3278940427,CH -3278940428,3278940431,DE -3278940432,3278940435,CH -3278940436,3278940439,DE -3278940440,3278940443,CH -3278940444,3278940447,DE -3278940448,3278940451,GB -3278940452,3278940463,DE -3278940464,3278940467,FR -3278940468,3278940471,DE -3278940472,3278940475,ES -3278940476,3278940479,FR -3278940480,3278940483,CH -3278940484,3278940487,FR -3278940488,3278940491,ES -3278940492,3278940495,IT -3278940496,3278940499,NL -3278940500,3278940503,FR -3278940504,3278940507,DK -3278940508,3278940511,FR -3278940512,3278940515,DE -3278940516,3278940523,CH -3278940524,3278940531,ES -3278940532,3278940535,DE -3278940536,3278940539,CH -3278940540,3278940543,ES -3278940544,3278940551,DE -3278940552,3278940555,GB -3278940556,3278940563,DE -3278940564,3278940571,FR -3278940572,3278940579,CH -3278940580,3278940587,DE -3278940588,3278940591,IT -3278940592,3278940595,FR -3278940596,3278940599,BE -3278940600,3278940603,DE -3278940604,3278940607,FR -3278940608,3278940611,ES -3278940612,3278940615,PT -3278940616,3278940623,DE -3278940624,3278940631,IT -3278940632,3278940635,GB -3278940636,3278940639,BE -3278940640,3278940643,CH -3278940644,3278940647,IT -3278940648,3278940651,DE -3278940652,3278940655,FR -3278940656,3278940663,DE -3278940664,3278940667,FR -3278940668,3278940683,DE -3278940684,3278940691,NL -3278940692,3278940695,SE -3278940696,3278940707,DE -3278940708,3278940711,ES -3278940712,3278940715,BE -3278940716,3278940719,DE -3278940720,3278940723,ES -3278940724,3278940727,FR -3278940728,3278940731,DE -3278940732,3278940739,FR -3278940740,3278940743,GB -3278940744,3278940747,ES -3278940748,3278940751,DE -3278940752,3278940759,FR -3278940760,3278940763,NL -3278940764,3278940767,DE -3278940768,3278940771,GB -3278940772,3278940783,DE -3278940784,3278940787,CH -3278940788,3278940791,GB -3278940792,3278940795,NL -3278940796,3278940803,DE -3278940804,3278940807,DK -3278940808,3278940815,DE -3278940816,3278940819,IT -3278940820,3278940835,DE -3278940836,3278940839,IT -3278940840,3278940847,DE -3278940848,3278940851,CH -3278940852,3278940859,DE -3278940860,3278940863,NL -3278940864,3278940867,CH -3278940868,3278940871,GB -3278940872,3278940875,DE -3278940876,3278940879,IT -3278940880,3278940883,CH -3278940884,3278940887,ES -3278940888,3278940891,BE -3278940892,3278940899,DE -3278940900,3278940903,FR -3278940904,3278940911,ES -3278940912,3278940919,DE -3278940920,3278940923,PT -3278940924,3278940931,DE -3278940932,3278940935,NL -3278940936,3278940939,ES -3278940940,3278940943,FR -3278940944,3278940947,NL -3278940948,3278940951,FR -3278940952,3278940955,IT -3278940956,3278940959,DK -3278940960,3278940963,FR -3278940964,3278940967,IT -3278940968,3278940983,DE -3278940984,3278940987,IT -3278940988,3278940991,NL -3278940992,3278940999,DE -3278941000,3278941003,NL -3278941004,3278941023,DE -3278941024,3278941027,IT -3278941028,3278941031,FR -3278941032,3278941035,DE -3278941036,3278941039,IT -3278941040,3278941043,DE -3278941044,3278941047,FR -3278941048,3278941051,ES -3278941052,3278941059,DE -3278941060,3278941063,GB -3278941064,3278941067,IT -3278941068,3278941071,ES -3278941072,3278941083,DE -3278941084,3278941087,GB -3278941088,3278941095,DE -3278941096,3278941099,FR -3278941100,3278941107,DE -3278941108,3278941111,DK -3278941112,3278941119,FR -3278941120,3278941127,DE -3278941128,3278941131,BE -3278941132,3278941135,NL -3278941136,3278941143,DE -3278941144,3278941151,IT -3278941152,3278941155,DE -3278941156,3278941159,SE -3278941160,3278941167,DE -3278941168,3278941171,GB -3278941172,3278941175,AT -3278941176,3278941179,IT -3278941180,3278941183,FR -3278941184,3278941191,US -3278941192,3278941195,BR -3278941196,3278941215,US -3278941216,3278941219,BR -3278941220,3278941243,US -3278941244,3278941247,CO -3278941248,3278941255,US -3278941256,3278941259,MX -3278941260,3278941279,US -3278941280,3278941283,BR -3278941284,3278941287,AR -3278941288,3278941303,US -3278941304,3278941307,CO -3278941308,3278941319,US -3278941320,3278941323,CA -3278941324,3278941331,US -3278941332,3278941335,BR -3278941336,3278941343,US -3278941344,3278941347,AR -3278941348,3278941371,US -3278941372,3278941375,CA -3278941376,3278941399,US -3278941400,3278941403,VE -3278941404,3278941407,BR -3278941408,3278941419,US -3278941420,3278941423,DE -3278941424,3278941427,CL -3278941428,3278941431,PE -3278941432,3278941439,US -3278941440,3278941443,AR -3278941444,3278941455,US -3278941456,3278941459,JM -3278941460,3278941475,US -3278941476,3278941479,BR -3278941480,3278941491,US -3278941492,3278941495,MX -3278941496,3278941499,US -3278941500,3278941503,CA -3278941504,3278941587,US -3278941588,3278941591,DE -3278941592,3278941595,US -3278941596,3278941599,PE -3278941600,3278941615,US -3278941616,3278941619,CA -3278941620,3278941639,US -3278941640,3278941643,BR -3278941644,3278941651,US -3278941652,3278941655,VE -3278941656,3278941659,US -3278941660,3278941663,BR -3278941664,3278941667,CA -3278941668,3278941671,US -3278941672,3278941675,VE -3278941676,3278941691,US -3278941692,3278941695,MX -3278941696,3278941735,US -3278941736,3278941739,CA -3278941740,3278941743,US -3278941744,3278941747,CA -3278941748,3278941819,US -3278941820,3278941823,CL -3278941824,3278941847,US -3278941848,3278941855,AR -3278941856,3278941891,US -3278941892,3278941895,CA -3278941896,3278941911,US -3278941912,3278941915,MX -3278941916,3278941943,US -3278941944,3278941947,CO -3278941948,3278941951,US -3278941952,3278941955,GB -3278941956,3278941959,FR -3278941960,3278941963,DE -3278941964,3278941971,GB -3278941972,3278941979,DE -3278941980,3278941983,ES -3278941984,3278941987,DE -3278941988,3278941995,FR -3278941996,3278941999,ES -3278942000,3278942015,DE -3278942016,3278942019,FR -3278942020,3278942023,DE -3278942024,3278942027,FR -3278942028,3278942031,CH -3278942032,3278942035,GR -3278942036,3278942039,CH -3278942040,3278942043,ES -3278942044,3278942055,DE -3278942056,3278942059,ES -3278942060,3278942063,DE -3278942064,3278942071,ES -3278942072,3278942075,FR -3278942076,3278942083,DE -3278942084,3278942087,BE -3278942088,3278942091,DE -3278942092,3278942095,BE -3278942096,3278942099,PL -3278942100,3278942103,GB -3278942104,3278942107,CH -3278942108,3278942111,DE -3278942112,3278942115,FR -3278942116,3278942119,DE -3278942120,3278942123,GB -3278942124,3278942127,AT -3278942128,3278942131,DE -3278942132,3278942135,GB -3278942136,3278942139,UA -3278942140,3278942143,NL -3278942144,3278942147,GB -3278942148,3278942155,DE -3278942156,3278942159,FR -3278942160,3278942163,DE -3278942164,3278942167,IT -3278942168,3278942171,CH -3278942172,3278942179,DE -3278942180,3278942183,FR -3278942184,3278942203,DE -3278942204,3278942207,CH -3278942208,3278942211,TW -3278942212,3278942443,DE -3278942444,3278942447,NZ -3278942448,3278942463,DE -3278942464,3278942467,SG -3278942468,3278942471,MY -3278942472,3278942479,DE -3278942480,3278942483,SG -3278942484,3278942487,DE -3278942488,3278942491,IN -3278942492,3278942495,MY -3278942496,3278942499,DE -3278942500,3278942507,MY -3278942508,3278942511,TH -3278942512,3278942515,SG -3278942516,3278942519,DE -3278942520,3278942523,IN -3278942524,3278942527,DE -3278942528,3278942531,IN -3278942532,3278942551,DE -3278942552,3278942555,TW -3278942556,3278942559,IN -3278942560,3278942563,DE -3278942564,3278942571,MY -3278942572,3278942575,IN -3278942576,3278942591,DE -3278942592,3278942595,TW -3278942596,3278942599,DE -3278942600,3278942603,SG -3278942604,3278942607,TW -3278942608,3278942615,DE -3278942616,3278942627,SG -3278942628,3278942635,MY -3278942636,3278942639,SG -3278942640,3278942651,DE -3278942652,3278942655,MY -3278942656,3278942659,DE -3278942660,3278942667,SG -3278942668,3278942671,DE -3278942672,3278942675,SG -3278942676,3278942679,DE -3278942680,3278942683,TW -3278942684,3278942687,DE -3278942688,3278942691,SG -3278942692,3278942703,DE -3278942704,3278942707,MY -3278942708,3278942719,SG -3278942720,3278942721,DE -3278942722,3278942722,GB -3278942723,3278942724,DE -3278942725,3278942725,GB -3278942726,3278942726,IT -3278942727,3278942727,DE -3278942728,3278942728,CH -3278942729,3278942730,BE -3278942731,3278942731,DE -3278942732,3278942732,ES -3278942733,3278942733,DE -3278942734,3278942734,GB -3278942735,3278942735,DE -3278942736,3278942736,IT -3278942737,3278942739,DE -3278942740,3278942740,NL -3278942741,3278942741,GB -3278942742,3278942742,DE -3278942743,3278942743,ES -3278942744,3278942749,DE -3278942750,3278942750,IT -3278942751,3278942751,FR -3278942752,3278942752,CH -3278942753,3278942754,DE -3278942755,3278942755,GB -3278942756,3278942756,DE -3278942757,3278942757,GB -3278942758,3278942759,IT -3278942760,3278942761,DE -3278942762,3278942762,GB -3278942763,3278942763,NL -3278942764,3278942764,FR -3278942765,3278942765,CH -3278942766,3278942766,PL -3278942767,3278942767,FR -3278942768,3278942768,NO -3278942769,3278942769,GB -3278942770,3278942773,DE -3278942774,3278942774,CH -3278942775,3278942775,FR -3278942776,3278942776,DE -3278942777,3278942778,GB -3278942779,3278942779,SE -3278942780,3278942784,DE -3278942785,3278942785,GR -3278942786,3278942786,SI -3278942787,3278942789,DE -3278942790,3278942790,ES -3278942791,3278942791,IT -3278942792,3278942792,US -3278942793,3278942795,DE -3278942796,3278942796,IT -3278942797,3278942797,GB -3278942798,3278942798,DE -3278942799,3278942799,IT -3278942800,3278942800,FR -3278942801,3278942803,DE -3278942804,3278942804,IT -3278942805,3278942805,DE -3278942806,3278942806,BE -3278942807,3278942807,AT -3278942808,3278942809,DE -3278942810,3278942810,ES -3278942811,3278942811,NL -3278942812,3278942813,DE -3278942814,3278942814,CH -3278942815,3278942815,DE -3278942816,3278942816,AT -3278942817,3278942817,FR -3278942818,3278942818,DK -3278942819,3278942819,DE -3278942820,3278942820,IT -3278942821,3278942824,DE -3278942825,3278942825,NL -3278942826,3278942826,RU -3278942827,3278942827,FR -3278942828,3278942828,ES -3278942829,3278942830,DE -3278942831,3278942831,CH -3278942832,3278942832,IT -3278942833,3278942833,DE -3278942834,3278942834,NL -3278942835,3278942835,AT -3278942836,3278942837,DE -3278942838,3278942838,ES -3278942839,3278942839,FR -3278942840,3278942843,DE -3278942844,3278942844,ES -3278942845,3278942850,DE -3278942851,3278942851,HU -3278942852,3278942852,DE -3278942853,3278942853,ES -3278942854,3278942854,GB -3278942855,3278942857,DE -3278942858,3278942858,IT -3278942859,3278942860,DE -3278942861,3278942861,FR -3278942862,3278942863,DE -3278942864,3278942864,ES -3278942865,3278942865,GB -3278942866,3278942867,NL -3278942868,3278942869,DE -3278942870,3278942870,CH -3278942871,3278942871,IS -3278942872,3278942872,DE -3278942873,3278942873,IT -3278942874,3278942875,DE -3278942876,3278942876,PL -3278942877,3278942878,DE -3278942879,3278942879,DK -3278942880,3278942881,DE -3278942882,3278942882,CH -3278942883,3278942883,GB -3278942884,3278942889,DE -3278942890,3278942890,ES -3278942891,3278942894,DE -3278942895,3278942895,NL -3278942896,3278942896,DE -3278942897,3278942897,CH -3278942898,3278942899,NL -3278942900,3278942903,DE -3278942904,3278942904,BE -3278942905,3278942905,IE -3278942906,3278942907,DE -3278942908,3278942908,GB -3278942909,3278942910,DE -3278942911,3278942911,IT -3278942912,3278942913,DE -3278942914,3278942914,CH -3278942915,3278942922,DE -3278942923,3278942923,NL -3278942924,3278942924,DE -3278942925,3278942925,GB -3278942926,3278942930,DE -3278942931,3278942931,CH -3278942932,3278942932,NL -3278942933,3278942933,BE -3278942934,3278942934,DE -3278942935,3278942936,NL -3278942937,3278942937,DE -3278942938,3278942938,CH -3278942939,3278942940,DE -3278942941,3278942941,IT -3278942942,3278942942,DE -3278942943,3278942944,NL -3278942945,3278942946,DE -3278942947,3278942947,BE -3278942948,3278942948,AT -3278942949,3278942950,DE -3278942951,3278942951,IT -3278942952,3278942957,DE -3278942958,3278942958,CH -3278942959,3278942961,DE -3278942962,3278942963,NL -3278942964,3278942967,DE -3278942968,3278942968,NL -3278942969,3278942969,AT -3278942970,3278942970,ES -3278942971,3278942971,IT -3278942972,3278942978,DE -3278942979,3278942979,FR -3278942980,3278942980,IT -3278942981,3278942984,DE -3278942985,3278942985,ES -3278942986,3278942986,CH -3278942987,3278942987,BE -3278942988,3278942988,DE -3278942989,3278942990,CH -3278942991,3278942992,DE -3278942993,3278942993,GB -3278942994,3278942994,CH -3278942995,3278943002,DE -3278943003,3278943003,CH -3278943004,3278943005,DE -3278943006,3278943006,FR -3278943007,3278943007,DE -3278943008,3278943008,IT -3278943009,3278943009,DE -3278943010,3278943010,NL -3278943011,3278943011,DE -3278943012,3278943012,CZ -3278943013,3278943013,IT -3278943014,3278943014,DE -3278943015,3278943016,ES -3278943017,3278943017,FR -3278943018,3278943018,CH -3278943019,3278943019,DE -3278943020,3278943020,CH -3278943021,3278943021,BE -3278943022,3278943022,ES -3278943023,3278943023,BE -3278943024,3278943024,FR -3278943025,3278943025,DE -3278943026,3278943026,DK -3278943027,3278943027,DE -3278943028,3278943029,GB -3278943030,3278943030,ES -3278943031,3278943031,NL -3278943032,3278943032,FR -3278943033,3278943034,DE -3278943035,3278943035,ES -3278943036,3278943036,DE -3278943037,3278943037,FR -3278943038,3278943039,DE -3278943040,3278943040,IT -3278943041,3278943041,DE -3278943042,3278943042,BE -3278943043,3278943043,SI -3278943044,3278943044,FR -3278943045,3278943048,DE -3278943049,3278943049,GB -3278943050,3278943050,IT -3278943051,3278943056,DE -3278943057,3278943057,CH -3278943058,3278943058,DE -3278943059,3278943059,CH -3278943060,3278943065,DE -3278943066,3278943066,GB -3278943067,3278943069,DE -3278943070,3278943070,PL -3278943071,3278943073,DE -3278943074,3278943074,ES -3278943075,3278943076,FR -3278943077,3278943077,DE -3278943078,3278943079,CH -3278943080,3278943080,BE -3278943081,3278943081,DE -3278943082,3278943082,CH -3278943083,3278943084,DE -3278943085,3278943085,NL -3278943086,3278943087,DE -3278943088,3278943088,NL -3278943089,3278943090,DE -3278943091,3278943091,IT -3278943092,3278943092,ES -3278943093,3278943096,DE -3278943097,3278943097,BE -3278943098,3278943099,DE -3278943100,3278943100,SE -3278943101,3278943101,DE -3278943102,3278943102,ZA -3278943103,3278943105,DE -3278943106,3278943106,FR -3278943107,3278943107,DE -3278943108,3278943108,FR -3278943109,3278943109,IT -3278943110,3278943110,DK -3278943111,3278943111,GB -3278943112,3278943114,DE -3278943115,3278943115,PT -3278943116,3278943117,DE -3278943118,3278943119,IT -3278943120,3278943120,DE -3278943121,3278943121,AT -3278943122,3278943122,GB -3278943123,3278943123,FR -3278943124,3278943124,BE -3278943125,3278943125,CH -3278943126,3278943126,IT -3278943127,3278943127,DE -3278943128,3278943128,GB -3278943129,3278943130,DE -3278943131,3278943131,BE -3278943132,3278943132,FR -3278943133,3278943133,DE -3278943134,3278943135,NL -3278943136,3278943136,FR -3278943137,3278943137,DE -3278943138,3278943138,BE -3278943139,3278943139,DE -3278943140,3278943140,ES -3278943141,3278943141,NL -3278943142,3278943142,FR -3278943143,3278943143,ES -3278943144,3278943146,DE -3278943147,3278943147,NL -3278943148,3278943148,FR -3278943149,3278943150,DE -3278943151,3278943151,NL -3278943152,3278943153,DE -3278943154,3278943154,SE -3278943155,3278943159,DE -3278943160,3278943160,ES -3278943161,3278943161,BE -3278943162,3278943163,DE -3278943164,3278943164,NL -3278943165,3278943165,SE -3278943166,3278943169,DE -3278943170,3278943172,FR -3278943173,3278943173,NL -3278943174,3278943174,DE -3278943175,3278943177,ES -3278943178,3278943178,DE -3278943179,3278943179,CH -3278943180,3278943181,DE -3278943182,3278943182,SE -3278943183,3278943183,FR -3278943184,3278943184,DE -3278943185,3278943185,BE -3278943186,3278943186,NL -3278943187,3278943187,DE -3278943188,3278943188,GB -3278943189,3278943193,DE -3278943194,3278943194,IT -3278943195,3278943195,DE -3278943196,3278943196,CH -3278943197,3278943197,NL -3278943198,3278943198,GR -3278943199,3278943199,GB -3278943200,3278943200,DE -3278943201,3278943202,CH -3278943203,3278943203,SE -3278943204,3278943206,DE -3278943207,3278943207,IT -3278943208,3278943208,DE -3278943209,3278943209,ES -3278943210,3278943211,DE -3278943212,3278943212,IT -3278943213,3278943213,DE -3278943214,3278943214,IT -3278943215,3278943216,DE -3278943217,3278943217,GB -3278943218,3278943218,IT -3278943219,3278943222,DE -3278943223,3278943223,NL -3278943224,3278943225,DE -3278943226,3278943226,FR -3278943227,3278943227,GB -3278943228,3278943235,DE -3278943236,3278943236,ES -3278943237,3278943237,FR -3278943238,3278943239,DE -3278943240,3278943240,NL -3278943241,3278943242,DE -3278943243,3278943243,ES -3278943244,3278943244,FR -3278943245,3278943245,DE -3278943246,3278943246,NL -3278943247,3278943248,DE -3278943249,3278943249,ES -3278943250,3278943251,FR -3278943252,3278943252,IT -3278943253,3278943253,DE -3278943254,3278943254,DK -3278943255,3278943255,DE -3278943256,3278943256,FR -3278943257,3278943257,IT -3278943258,3278943260,DE -3278943261,3278943261,ES -3278943262,3278943262,NL -3278943263,3278943263,FR -3278943264,3278943265,DE -3278943266,3278943266,FR -3278943267,3278943267,NL -3278943268,3278943269,DE -3278943270,3278943270,CH -3278943271,3278943274,DE -3278943275,3278943275,IT -3278943276,3278943279,DE -3278943280,3278943280,FR -3278943281,3278943281,IT -3278943282,3278943283,DE -3278943284,3278943284,IT -3278943285,3278943289,DE -3278943290,3278943290,IT -3278943291,3278943292,DE -3278943293,3278943293,GB -3278943294,3278943294,IT -3278943295,3278943295,DE -3278943296,3278943296,ES -3278943297,3278943297,IT -3278943298,3278943298,PT -3278943299,3278943299,DK -3278943300,3278943300,GB -3278943301,3278943303,DE -3278943304,3278943304,FR -3278943305,3278943305,LU -3278943306,3278943309,DE -3278943310,3278943310,ES -3278943311,3278943311,BE -3278943312,3278943314,DE -3278943315,3278943316,FR -3278943317,3278943319,DE -3278943320,3278943320,BE -3278943321,3278943321,DE -3278943322,3278943322,NL -3278943323,3278943323,FR -3278943324,3278943326,DE -3278943327,3278943328,IT -3278943329,3278943329,DE -3278943330,3278943330,ES -3278943331,3278943331,PL -3278943332,3278943333,DE -3278943334,3278943334,FR -3278943335,3278943335,AT -3278943336,3278943337,IT -3278943338,3278943338,DE -3278943339,3278943339,PT -3278943340,3278943340,ES -3278943341,3278943341,CH -3278943342,3278943343,DE -3278943344,3278943344,GB -3278943345,3278943345,DE -3278943346,3278943346,FR -3278943347,3278943347,DE -3278943348,3278943349,GB -3278943350,3278943351,DE -3278943352,3278943352,NL -3278943353,3278943353,DE -3278943354,3278943355,ES -3278943356,3278943356,FR -3278943357,3278943357,DE -3278943358,3278943358,FR -3278943359,3278943359,ES -3278943360,3278943360,CH -3278943361,3278943361,DE -3278943362,3278943362,IT -3278943363,3278943366,DE -3278943367,3278943367,FR -3278943368,3278943369,DE -3278943370,3278943370,FR -3278943371,3278943371,DE -3278943372,3278943372,CH -3278943373,3278943374,GR -3278943375,3278943375,ES -3278943376,3278943376,NO -3278943377,3278943377,IT -3278943378,3278943378,DE -3278943379,3278943379,CH -3278943380,3278943380,ES -3278943381,3278943381,GB -3278943382,3278943382,ES -3278943383,3278943383,PL -3278943384,3278943384,IT -3278943385,3278943385,DE -3278943386,3278943387,FR -3278943388,3278943388,DE -3278943389,3278943389,BE -3278943390,3278943391,DE -3278943392,3278943392,PL -3278943393,3278943393,CH -3278943394,3278943394,FR -3278943395,3278943395,IT -3278943396,3278943396,NL -3278943397,3278943399,DE -3278943400,3278943400,FR -3278943401,3278943401,DE -3278943402,3278943402,FR -3278943403,3278943403,GB -3278943404,3278943404,DE -3278943405,3278943405,GB -3278943406,3278943406,AT -3278943407,3278943407,DE -3278943408,3278943408,FR -3278943409,3278943409,IT -3278943410,3278943410,NL -3278943411,3278943411,ES -3278943412,3278943412,GB -3278943413,3278943413,DE -3278943414,3278943414,ES -3278943415,3278943415,UA -3278943416,3278943416,NL -3278943417,3278943417,DE -3278943418,3278943418,GB -3278943419,3278943419,ES -3278943420,3278943420,BE -3278943421,3278943422,DE -3278943423,3278943423,IT -3278943424,3278943424,DE -3278943425,3278943425,GB -3278943426,3278943426,DE -3278943427,3278943427,AT -3278943428,3278943428,DE -3278943429,3278943430,IT -3278943431,3278943431,CH -3278943432,3278943435,DE -3278943436,3278943436,ES -3278943437,3278943437,FR -3278943438,3278943438,DE -3278943439,3278943439,SE -3278943440,3278943440,DE -3278943441,3278943441,IT -3278943442,3278943442,FR -3278943443,3278943445,DE -3278943446,3278943446,CH -3278943447,3278943447,DE -3278943448,3278943448,FR -3278943449,3278943449,DE -3278943450,3278943450,CH -3278943451,3278943451,AT -3278943452,3278943452,DE -3278943453,3278943453,PT -3278943454,3278943455,DE -3278943456,3278943456,IT -3278943457,3278943457,GB -3278943458,3278943459,DE -3278943460,3278943460,FR -3278943461,3278943464,DE -3278943465,3278943465,ES -3278943466,3278943466,DE -3278943467,3278943467,ES -3278943468,3278943468,DE -3278943469,3278943469,NL -3278943470,3278943471,ES -3278943472,3278943472,BE -3278943473,3278943477,DE -3278943478,3278943478,NL -3278943479,3278943481,DE -3278943482,3278943482,IT -3278943483,3278943489,DE -3278943490,3278943490,BE -3278943491,3278943491,DE -3278943492,3278943492,CH -3278943493,3278943495,DE -3278943496,3278943496,GB -3278943497,3278943500,DE -3278943501,3278943501,FR -3278943502,3278943505,DE -3278943506,3278943506,AT -3278943507,3278943507,FR -3278943508,3278943509,IT -3278943510,3278943510,DE -3278943511,3278943512,IT -3278943513,3278943513,ES -3278943514,3278943514,BE -3278943515,3278943515,DE -3278943516,3278943517,ES -3278943518,3278943518,FR -3278943519,3278943519,HU -3278943520,3278943520,AT -3278943521,3278943521,ES -3278943522,3278943523,DE -3278943524,3278943524,AT -3278943525,3278943525,BE -3278943526,3278943526,FR -3278943527,3278943529,DE -3278943530,3278943530,AT -3278943531,3278943531,DE -3278943532,3278943532,NL -3278943533,3278943533,ES -3278943534,3278943534,GB -3278943535,3278943535,BR -3278943536,3278943537,ES -3278943538,3278943538,DE -3278943539,3278943539,IT -3278943540,3278943540,ES -3278943541,3278943542,DE -3278943543,3278943543,IT -3278943544,3278943545,DE -3278943546,3278943546,NL -3278943547,3278943547,CH -3278943548,3278943548,GB -3278943549,3278943549,IL -3278943550,3278943553,DE -3278943554,3278943554,FR -3278943555,3278943555,DE -3278943556,3278943556,FR -3278943557,3278943557,DE -3278943558,3278943558,AT -3278943559,3278943560,DE -3278943561,3278943561,FR -3278943562,3278943565,DE -3278943566,3278943566,BE -3278943567,3278943567,AE -3278943568,3278943568,NL -3278943569,3278943570,DE -3278943571,3278943571,BE -3278943572,3278943572,GB -3278943573,3278943575,DE -3278943576,3278943576,NL -3278943577,3278943577,FR -3278943578,3278943578,DE -3278943579,3278943579,BE -3278943580,3278943580,IT -3278943581,3278943581,CH -3278943582,3278943582,DE -3278943583,3278943583,NL -3278943584,3278943585,DE -3278943586,3278943586,NL -3278943587,3278943587,ES -3278943588,3278943590,DE -3278943591,3278943591,NL -3278943592,3278943592,DE -3278943593,3278943593,PL -3278943594,3278943594,ES -3278943595,3278943595,GB -3278943596,3278943596,GR -3278943597,3278943601,DE -3278943602,3278943602,PL -3278943603,3278943603,FR -3278943604,3278943604,ES -3278943605,3278943605,DE -3278943606,3278943606,AT -3278943607,3278943607,DE -3278943608,3278943608,ES -3278943609,3278943609,DE -3278943610,3278943610,BE -3278943611,3278943611,NL -3278943612,3278943613,DE -3278943614,3278943614,IT -3278943615,3278943615,CH -3278943616,3278943616,DE -3278943617,3278943617,ES -3278943618,3278943619,DE -3278943620,3278943620,IT -3278943621,3278943621,CH -3278943622,3278943622,DE -3278943623,3278943623,DK -3278943624,3278943624,DE -3278943625,3278943625,FR -3278943626,3278943628,DE -3278943629,3278943630,FR -3278943631,3278943632,DE -3278943633,3278943633,GB -3278943634,3278943634,DE -3278943635,3278943635,IT -3278943636,3278943636,CH -3278943637,3278943638,IT -3278943639,3278943641,DE -3278943642,3278943642,FR -3278943643,3278943643,NL -3278943644,3278943645,FR -3278943646,3278943646,IT -3278943647,3278943649,DE -3278943650,3278943650,ES -3278943651,3278943651,DE -3278943652,3278943653,IT -3278943654,3278943654,BE -3278943655,3278943655,FR -3278943656,3278943656,AT -3278943657,3278943658,DE -3278943659,3278943659,NL -3278943660,3278943660,CY -3278943661,3278943661,DE -3278943662,3278943662,ES -3278943663,3278943663,CH -3278943664,3278943666,ES -3278943667,3278943667,IT -3278943668,3278943669,DE -3278943670,3278943670,IT -3278943671,3278943672,DE -3278943673,3278943673,ES -3278943674,3278943677,DE -3278943678,3278943678,BE -3278943679,3278943679,FR -3278943680,3278943680,GB -3278943681,3278943681,CH -3278943682,3278943682,DE -3278943683,3278943683,PT -3278943684,3278943684,AD -3278943685,3278943686,DE -3278943687,3278943687,CH -3278943688,3278943689,IT -3278943690,3278943690,ES -3278943691,3278943695,DE -3278943696,3278943696,GB -3278943697,3278943697,DE -3278943698,3278943698,IT -3278943699,3278943699,FR -3278943700,3278943700,CH -3278943701,3278943701,AT -3278943702,3278943702,FR -3278943703,3278943703,PL -3278943704,3278943705,DE -3278943706,3278943706,ES -3278943707,3278943710,DE -3278943711,3278943711,IT -3278943712,3278943713,DE -3278943714,3278943714,ES -3278943715,3278943715,DE -3278943716,3278943716,ES -3278943717,3278943719,DE -3278943720,3278943720,CH -3278943721,3278943726,DE -3278943727,3278943727,PL -3278943728,3278943729,DE -3278943730,3278943730,FR -3278943731,3278943731,DK -3278943732,3278943733,CH -3278943734,3278943734,DE -3278943735,3278943735,AD -3278943736,3278943736,DE -3278943737,3278943737,ES -3278943738,3278943740,DE -3278943741,3278943741,PT -3278943742,3278943742,IL -3278943743,3278943745,DE -3278943746,3278943746,CH -3278943747,3278943747,DE -3278943748,3278943749,ES -3278943750,3278943751,DE -3278943752,3278943752,GR -3278943753,3278943754,DE -3278943755,3278943755,SL -3278943756,3278943756,DE -3278943757,3278943757,FR -3278943758,3278943758,DE -3278943759,3278943759,NL -3278943760,3278943761,DE -3278943762,3278943762,CY -3278943763,3278943763,DE -3278943764,3278943764,FR -3278943765,3278943765,CH -3278943766,3278943766,BE -3278943767,3278943767,ES -3278943768,3278943768,DE -3278943769,3278943769,CZ -3278943770,3278943770,FR -3278943771,3278943772,DE -3278943773,3278943773,IT -3278943774,3278943777,DE -3278943778,3278943778,CH -3278943779,3278943780,DE -3278943781,3278943781,GB -3278943782,3278943782,IT -3278943783,3278943786,DE -3278943787,3278943787,IT -3278943788,3278943788,DE -3278943789,3278943789,ES -3278943790,3278943790,DE -3278943791,3278943791,IT -3278943792,3278943792,FR -3278943793,3278943793,IT -3278943794,3278943794,HU -3278943795,3278943796,DE -3278943797,3278943797,ES -3278943798,3278943798,DE -3278943799,3278943799,IE -3278943800,3278943800,DE -3278943801,3278943801,LU -3278943802,3278943802,DE -3278943803,3278943803,GB -3278943804,3278943804,DE -3278943805,3278943805,DK -3278943806,3278943806,ES -3278943807,3278943807,DE -3278943808,3278943808,IT -3278943809,3278943809,FR -3278943810,3278943810,DE -3278943811,3278943811,GR -3278943812,3278943812,IT -3278943813,3278943813,DE -3278943814,3278943814,ES -3278943815,3278943815,DE -3278943816,3278943816,GB -3278943817,3278943817,FR -3278943818,3278943818,DE -3278943819,3278943819,AT -3278943820,3278943820,DE -3278943821,3278943821,SM -3278943822,3278943823,DE -3278943824,3278943824,CH -3278943825,3278943826,DE -3278943827,3278943827,AT -3278943828,3278943828,ES -3278943829,3278943829,CH -3278943830,3278943830,ES -3278943831,3278943831,US -3278943832,3278943832,BE -3278943833,3278943833,DE -3278943834,3278943835,GB -3278943836,3278943838,DE -3278943839,3278943839,IT -3278943840,3278943845,DE -3278943846,3278943846,GB -3278943847,3278943847,DE -3278943848,3278943848,IT -3278943849,3278943849,DE -3278943850,3278943851,FR -3278943852,3278943852,BE -3278943853,3278943853,GB -3278943854,3278943854,ES -3278943855,3278943859,DE -3278943860,3278943860,FR -3278943861,3278943863,DE -3278943864,3278943864,DK -3278943865,3278943865,GB -3278943866,3278943866,IT -3278943867,3278943867,ES -3278943868,3278943868,IT -3278943869,3278943869,IE -3278943870,3278943870,NL -3278943871,3278943871,FR -3278943872,3278943873,DE -3278943874,3278943874,CH -3278943875,3278943875,IL -3278943876,3278943882,DE -3278943883,3278943883,CH -3278943884,3278943884,DE -3278943885,3278943885,IT -3278943886,3278943888,DE -3278943889,3278943889,BE -3278943890,3278943890,NL -3278943891,3278943891,ES -3278943892,3278943895,DE -3278943896,3278943896,PL -3278943897,3278943897,ES -3278943898,3278943898,IT -3278943899,3278943899,GB -3278943900,3278943900,ES -3278943901,3278943901,DE -3278943902,3278943902,GB -3278943903,3278943903,IT -3278943904,3278943904,DE -3278943905,3278943905,FR -3278943906,3278943906,IT -3278943907,3278943907,DE -3278943908,3278943908,GB -3278943909,3278943909,HU -3278943910,3278943910,FR -3278943911,3278943911,DE -3278943912,3278943913,IT -3278943914,3278943914,DE -3278943915,3278943915,PL -3278943916,3278943916,DE -3278943917,3278943917,FR -3278943918,3278943918,ES -3278943919,3278943920,FR -3278943921,3278943923,DE -3278943924,3278943924,IT -3278943925,3278943926,ES -3278943927,3278943929,DE -3278943930,3278943930,IT -3278943931,3278943932,DE -3278943933,3278943933,ES -3278943934,3278943939,DE -3278943940,3278943940,DK -3278943941,3278943941,DE -3278943942,3278943942,NL -3278943943,3278943943,AT -3278943944,3278943944,IT -3278943945,3278943945,NL -3278943946,3278943946,LU -3278943947,3278943950,DE -3278943951,3278943951,LU -3278943952,3278943953,DE -3278943954,3278943954,FR -3278943955,3278943956,DE -3278943957,3278943957,GB -3278943958,3278943967,DE -3278943968,3278943968,ES -3278943969,3278943969,DE -3278943970,3278943970,ES -3278943971,3278943971,BE -3278943972,3278943972,IT -3278943973,3278943973,DE -3278943974,3278943974,GR -3278943975,3278943975,CH -3278943976,3278943976,DE -3278943977,3278943977,DK -3278943978,3278943978,DE -3278943979,3278943979,ES -3278943980,3278943980,GB -3278943981,3278943981,DE -3278943982,3278943982,ES -3278943983,3278943984,DE -3278943985,3278943985,NL -3278943986,3278943987,IT -3278943988,3278943988,ES -3278943989,3278943990,DE -3278943991,3278943991,NL -3278943992,3278943996,DE -3278943997,3278943997,CH -3278943998,3278944001,DE -3278944002,3278944002,GB -3278944003,3278944003,LU -3278944004,3278944006,DE -3278944007,3278944007,NL -3278944008,3278944008,IT -3278944009,3278944009,CH -3278944010,3278944010,NL -3278944011,3278944012,DE -3278944013,3278944013,DK -3278944014,3278944014,DE -3278944015,3278944015,IS -3278944016,3278944020,DE -3278944021,3278944021,IT -3278944022,3278944022,FR -3278944023,3278944024,DE -3278944025,3278944025,CH -3278944026,3278944026,DE -3278944027,3278944027,FR -3278944028,3278944028,DE -3278944029,3278944029,IT -3278944030,3278944033,DE -3278944034,3278944034,GR -3278944035,3278944035,FR -3278944036,3278944036,US -3278944037,3278944037,FR -3278944038,3278944039,DE -3278944040,3278944040,FR -3278944041,3278944043,DE -3278944044,3278944045,FR -3278944046,3278944046,NL -3278944047,3278944047,GB -3278944048,3278944048,BE -3278944049,3278944049,IT -3278944050,3278944050,DE -3278944051,3278944051,BE -3278944052,3278944052,AT -3278944053,3278944053,IT -3278944054,3278944058,DE -3278944059,3278944059,ES -3278944060,3278944060,BE -3278944061,3278944061,FR -3278944062,3278944063,DE -3278944064,3278944064,FR -3278944065,3278944065,IT -3278944066,3278944066,GB -3278944067,3278944067,DE -3278944068,3278944068,ES -3278944069,3278944069,PL -3278944070,3278944071,DE -3278944072,3278944072,AT -3278944073,3278944073,FR -3278944074,3278944075,ES -3278944076,3278944076,DE -3278944077,3278944077,GB -3278944078,3278944078,DE -3278944079,3278944079,GB -3278944080,3278944080,DE -3278944081,3278944081,GB -3278944082,3278944082,IT -3278944083,3278944084,ES -3278944085,3278944085,DE -3278944086,3278944086,NL -3278944087,3278944087,DE -3278944088,3278944088,IT -3278944089,3278944089,DE -3278944090,3278944090,IT -3278944091,3278944091,DE -3278944092,3278944092,GR -3278944093,3278944094,DE -3278944095,3278944095,AT -3278944096,3278944097,DE -3278944098,3278944098,SE -3278944099,3278944099,GB -3278944100,3278944102,DE -3278944103,3278944104,IT -3278944105,3278944105,DE -3278944106,3278944106,AT -3278944107,3278944108,DE -3278944109,3278944109,ES -3278944110,3278944111,DE -3278944112,3278944112,NL -3278944113,3278944113,DE -3278944114,3278944114,IT -3278944115,3278944116,ES -3278944117,3278944118,IT -3278944119,3278944119,ES -3278944120,3278944121,DE -3278944122,3278944122,FR -3278944123,3278944123,IT -3278944124,3278944124,DE -3278944125,3278944125,SE -3278944126,3278944127,DE -3278944128,3278944128,PT -3278944129,3278944129,BE -3278944130,3278944130,DE -3278944131,3278944131,FR -3278944132,3278944132,IE -3278944133,3278944133,IT -3278944134,3278944134,DE -3278944135,3278944135,NL -3278944136,3278944137,DE -3278944138,3278944138,GB -3278944139,3278944139,FR -3278944140,3278944140,PT -3278944141,3278944141,FR -3278944142,3278944142,GB -3278944143,3278944144,DE -3278944145,3278944145,SE -3278944146,3278944147,DE -3278944148,3278944148,ES -3278944149,3278944149,DE -3278944150,3278944150,IE -3278944151,3278944158,DE -3278944159,3278944159,CH -3278944160,3278944160,FR -3278944161,3278944163,DE -3278944164,3278944164,IT -3278944165,3278944166,DE -3278944167,3278944167,IT -3278944168,3278944168,CH -3278944169,3278944169,DE -3278944170,3278944171,CH -3278944172,3278944172,DE -3278944173,3278944173,FR -3278944174,3278944174,GB -3278944175,3278944175,DE -3278944176,3278944176,ES -3278944177,3278944177,LU -3278944178,3278944179,DE -3278944180,3278944180,GB -3278944181,3278944181,IT -3278944182,3278944182,DE -3278944183,3278944184,ES -3278944185,3278944185,NL -3278944186,3278944192,DE -3278944193,3278944193,FR -3278944194,3278944194,GB -3278944195,3278944195,IT -3278944196,3278944197,DE -3278944198,3278944198,IT -3278944199,3278944199,AT -3278944200,3278944200,DE -3278944201,3278944201,SE -3278944202,3278944202,NO -3278944203,3278944203,NL -3278944204,3278944207,DE -3278944208,3278944208,NL -3278944209,3278944209,PL -3278944210,3278944210,AT -3278944211,3278944211,DE -3278944212,3278944212,FR -3278944213,3278944213,DE -3278944214,3278944214,GB -3278944215,3278944215,IT -3278944216,3278944216,DE -3278944217,3278944217,IT -3278944218,3278944219,DE -3278944220,3278944220,GB -3278944221,3278944221,GR -3278944222,3278944224,DE -3278944225,3278944225,NL -3278944226,3278944226,RU -3278944227,3278944227,IT -3278944228,3278944230,DE -3278944231,3278944231,CH -3278944232,3278944232,NL -3278944233,3278944233,GB -3278944234,3278944234,AT -3278944235,3278944238,DE -3278944239,3278944239,SE -3278944240,3278944240,FR -3278944241,3278944241,IT -3278944242,3278944242,ES -3278944243,3278944243,DE -3278944244,3278944244,ES -3278944245,3278944245,BE -3278944246,3278944246,NL -3278944247,3278944247,ES -3278944248,3278944248,NL -3278944249,3278944249,DE -3278944250,3278944250,IT -3278944251,3278944251,AT -3278944252,3278944252,IT -3278944253,3278944254,GB -3278944255,3278944257,DE -3278944258,3278944258,US -3278944259,3278944262,DE -3278944263,3278944264,US -3278944265,3278944268,DE -3278944269,3278944269,US -3278944270,3278944272,DE -3278944273,3278944273,CA -3278944274,3278944279,DE -3278944280,3278944280,US -3278944281,3278944288,DE -3278944289,3278944289,US -3278944290,3278944291,DE -3278944292,3278944292,US -3278944293,3278944293,DE -3278944294,3278944294,CA -3278944295,3278944295,US -3278944296,3278944298,DE -3278944299,3278944301,US -3278944302,3278944302,DE -3278944303,3278944303,US -3278944304,3278944312,DE -3278944313,3278944346,US -3278944347,3278944347,AR -3278944348,3278944360,US -3278944361,3278944361,AR -3278944362,3278944365,US -3278944366,3278944366,MX -3278944367,3278944367,US -3278944368,3278944368,CA -3278944369,3278944379,US -3278944380,3278944380,DE -3278944381,3278944385,US -3278944386,3278944386,DE -3278944387,3278944388,US -3278944389,3278944389,CA -3278944390,3278944390,AR -3278944391,3278944391,CA -3278944392,3278944395,US -3278944396,3278944396,CA -3278944397,3278944399,US -3278944400,3278944400,BR -3278944401,3278944401,US -3278944402,3278944402,CA -3278944403,3278944412,US -3278944413,3278944413,CA -3278944414,3278944418,US -3278944419,3278944419,DE -3278944420,3278944420,CA -3278944421,3278944421,DE -3278944422,3278944432,US -3278944433,3278944433,DE -3278944434,3278944444,US -3278944445,3278944449,DE -3278944450,3278944451,CA -3278944452,3278944460,DE -3278944461,3278944461,US -3278944462,3278944470,DE -3278944471,3278944471,US -3278944472,3278944513,DE -3278944514,3278944517,US -3278944518,3278944518,DE -3278944519,3278944520,US -3278944521,3278944521,CA -3278944522,3278944522,US -3278944523,3278944523,CA -3278944524,3278944524,US -3278944525,3278944525,CL -3278944526,3278944526,US -3278944527,3278944527,CA -3278944528,3278944528,US -3278944529,3278944529,CA -3278944530,3278944537,US -3278944538,3278944538,AR -3278944539,3278944544,US -3278944545,3278944545,CA -3278944546,3278944555,US -3278944556,3278944556,CL -3278944557,3278944559,US -3278944560,3278944560,AR -3278944561,3278944561,US -3278944562,3278944562,CA -3278944563,3278944563,US -3278944564,3278944564,CA -3278944565,3278944569,US -3278944570,3278944570,DE -3278944571,3278944572,US -3278944573,3278944573,DE -3278944574,3278944574,US -3278944575,3278944575,DE -3278944576,3278944578,US -3278944579,3278944579,DE -3278944580,3278944580,AR -3278944581,3278944581,US -3278944582,3278944583,DE -3278944584,3278944588,US -3278944589,3278944589,DE -3278944590,3278944599,US -3278944600,3278944600,SA -3278944601,3278944606,US -3278944607,3278944608,DE -3278944609,3278944611,US -3278944612,3278944612,DE -3278944613,3278944626,US -3278944627,3278944627,DE -3278944628,3278944633,US -3278944634,3278944634,DE -3278944635,3278944638,US -3278944639,3278944640,DE -3278944641,3278944642,US -3278944643,3278944643,CL -3278944644,3278944650,US -3278944651,3278944651,DE -3278944652,3278944654,US -3278944655,3278944657,AR -3278944658,3278944659,US -3278944660,3278944660,AR -3278944661,3278944661,US -3278944662,3278944663,DE -3278944664,3278944665,AR -3278944666,3278944667,US -3278944668,3278944668,AR -3278944669,3278944670,US -3278944671,3278944671,CL -3278944672,3278944672,DE -3278944673,3278944673,PE -3278944674,3278944674,DE -3278944675,3278944677,US -3278944678,3278944678,CA -3278944679,3278944679,US -3278944680,3278944680,CA -3278944681,3278944683,US -3278944684,3278944686,DE -3278944687,3278944687,US -3278944688,3278944688,AR -3278944689,3278944693,US -3278944694,3278944695,DE -3278944696,3278944696,US -3278944697,3278944697,CA -3278944698,3278944706,US -3278944707,3278944707,DE -3278944708,3278944708,PE -3278944709,3278944709,US -3278944710,3278944710,DE -3278944711,3278944712,CL -3278944713,3278944713,DE -3278944714,3278944714,JM -3278944715,3278944715,CA -3278944716,3278944716,DE -3278944717,3278944718,US -3278944719,3278944719,CA -3278944720,3278944720,US -3278944721,3278944721,CA -3278944722,3278944727,US -3278944728,3278944728,DE -3278944729,3278944730,US -3278944731,3278944731,DE -3278944732,3278944734,US -3278944735,3278944735,DE -3278944736,3278944736,AR -3278944737,3278944739,US -3278944740,3278944740,CA -3278944741,3278944741,DE -3278944742,3278944743,US -3278944744,3278944745,DE -3278944746,3278944749,US -3278944750,3278944750,DE -3278944751,3278944751,US -3278944752,3278944752,DE -3278944753,3278944753,US -3278944754,3278944754,BR -3278944755,3278944755,AR -3278944756,3278944758,US -3278944759,3278944760,DE -3278944761,3278944761,UY -3278944762,3278944763,DE -3278944764,3278944764,AR -3278944765,3278944765,US -3278944766,3278944767,DE -3278944768,3278944771,DO -3278944772,3278944819,US -3278944820,3278944823,AR -3278944824,3278944827,BR -3278944828,3278944851,US -3278944852,3278944855,CA -3278944856,3278944863,US -3278944864,3278944867,MX -3278944868,3278944871,US -3278944872,3278944875,DE -3278944876,3278944887,US -3278944888,3278944891,CO -3278944892,3278944903,US -3278944904,3278944907,BR -3278944908,3278944919,US -3278944920,3278944923,CO -3278944924,3278944935,US -3278944936,3278944939,BR -3278944940,3278944947,US -3278944948,3278944951,CO -3278944952,3278944963,US -3278944964,3278944971,CA -3278944972,3278944975,US -3278944976,3278944995,CA -3278944996,3278944999,CO -3278945000,3278945007,US -3278945008,3278945011,CO -3278945012,3278945015,PE -3278945016,3278945023,US -3278945024,3278945027,BR -3278945028,3278945031,CW -3278945032,3278945087,US -3278945088,3278945091,BR -3278945092,3278945099,US -3278945100,3278945107,BR -3278945108,3278945111,DO -3278945112,3278945127,US -3278945128,3278945131,AR -3278945132,3278945135,BR -3278945136,3278945151,US -3278945152,3278945155,CA -3278945156,3278945159,BR -3278945160,3278945171,US -3278945172,3278945175,AR -3278945176,3278945191,US -3278945192,3278945199,CA -3278945200,3278945203,US -3278945204,3278945207,AR -3278945208,3278945227,US -3278945228,3278945235,CA -3278945236,3278945247,US -3278945248,3278945255,CA -3278945256,3278945267,US -3278945268,3278945271,AR -3278945272,3278945275,US -3278945276,3278945279,CL -3278945280,3278945283,CA -3278945284,3278945299,US -3278945300,3278945303,DE -3278945304,3278945307,CO -3278945308,3278945311,CA -3278945312,3278945319,US -3278945320,3278945323,MX -3278945324,3278945327,AR -3278945328,3278945331,CA -3278945332,3278945335,US -3278945336,3278945339,CA -3278945340,3278945343,US -3278945344,3278945347,BR -3278945348,3278945363,US -3278945364,3278945367,PR -3278945368,3278945395,US -3278945396,3278945399,AR -3278945400,3278945403,MX -3278945404,3278945427,US -3278945428,3278945431,CA -3278945432,3278945435,AR -3278945436,3278945439,MX -3278945440,3278945451,US -3278945452,3278945455,BR -3278945456,3278945459,US -3278945460,3278945463,MX -3278945464,3278945479,US -3278945480,3278945483,CL -3278945484,3278945491,BR -3278945492,3278945503,US -3278945504,3278945507,MX -3278945508,3278945515,AR -3278945516,3278945519,BR -3278945520,3278945523,US -3278945524,3278945527,CA -3278945528,3278945531,US -3278945532,3278945535,CW -3278945536,3278945539,AR -3278945540,3278945579,US -3278945580,3278945583,AR -3278945584,3278945587,US -3278945588,3278945591,DO -3278945592,3278945659,US -3278945660,3278945663,AR -3278945664,3278945667,US -3278945668,3278945671,UY -3278945672,3278945675,DE -3278945676,3278945687,US -3278945688,3278945691,BR -3278945692,3278945699,US -3278945700,3278945703,AR -3278945704,3278945715,US -3278945716,3278945719,CO -3278945720,3278945723,US -3278945724,3278945727,AR -3278945728,3278945743,US -3278945744,3278945747,MX -3278945748,3278945763,US -3278945764,3278945767,MX -3278945768,3278945771,CO -3278945772,3278945779,US -3278945780,3278945783,PE -3278945784,3278945791,US -3278945792,3278945794,DE -3278945795,3278945795,CH -3278945796,3278945796,DE -3278945797,3278945797,BE -3278945798,3278945798,NL -3278945799,3278945799,LU -3278945800,3278945800,DE -3278945801,3278945801,NL -3278945802,3278945802,PT -3278945803,3278945803,GB -3278945804,3278945804,DE -3278945805,3278945805,DK -3278945806,3278945806,FR -3278945807,3278945807,DE -3278945808,3278945808,RU -3278945809,3278945809,DE -3278945810,3278945810,CH -3278945811,3278945815,DE -3278945816,3278945816,GB -3278945817,3278945822,DE -3278945823,3278945823,CH -3278945824,3278945827,DE -3278945828,3278945828,FR -3278945829,3278945829,DE -3278945830,3278945831,NL -3278945832,3278945832,DE -3278945833,3278945833,GB -3278945834,3278945834,DE -3278945835,3278945835,CH -3278945836,3278945844,DE -3278945845,3278945845,ES -3278945846,3278945846,CH -3278945847,3278945847,DE -3278945848,3278945848,GB -3278945849,3278945849,DE -3278945850,3278945850,NL -3278945851,3278945852,DE -3278945853,3278945853,CH -3278945854,3278945854,FR -3278945855,3278945855,DE -3278945856,3278945856,DK -3278945857,3278945858,DE -3278945859,3278945859,GB -3278945860,3278945860,FR -3278945861,3278945861,IT -3278945862,3278945862,BE -3278945863,3278945863,ES -3278945864,3278945864,IE -3278945865,3278945866,DE -3278945867,3278945867,FR -3278945868,3278945868,NO -3278945869,3278945870,DE -3278945871,3278945871,IT -3278945872,3278945872,FR -3278945873,3278945873,DE -3278945874,3278945874,IT -3278945875,3278945875,ES -3278945876,3278945876,NL -3278945877,3278945877,SE -3278945878,3278945878,FR -3278945879,3278945880,DE -3278945881,3278945881,BE -3278945882,3278945886,DE -3278945887,3278945888,IT -3278945889,3278945890,DE -3278945891,3278945891,CH -3278945892,3278945892,BE -3278945893,3278945893,DE -3278945894,3278945894,AT -3278945895,3278945895,ES -3278945896,3278945896,GB -3278945897,3278945897,IT -3278945898,3278945898,ES -3278945899,3278945906,DE -3278945907,3278945907,GB -3278945908,3278945908,DE -3278945909,3278945909,FR -3278945910,3278945910,DE -3278945911,3278945911,NL -3278945912,3278945917,DE -3278945918,3278945918,IT -3278945919,3278946049,DE -3278946050,3278946054,US -3278946055,3278946055,CA -3278946056,3278946059,US -3278946060,3278946060,CN -3278946061,3278946061,US -3278946062,3278946062,DE -3278946063,3278946067,US -3278946068,3278946068,DE -3278946069,3278946084,US -3278946085,3278946085,DE -3278946086,3278946091,US -3278946092,3278946092,DE -3278946093,3278946108,US -3278946109,3278946109,GB -3278946110,3278946142,US -3278946143,3278946143,DE -3278946144,3278946166,US -3278946167,3278946167,DE -3278946168,3278946208,US -3278946209,3278946213,DE -3278946214,3278946214,US -3278946215,3278946221,DE -3278946222,3278946222,US -3278946223,3278946224,DE -3278946225,3278946225,US -3278946226,3278946229,DE -3278946230,3278946231,US -3278946232,3278946239,DE -3278946240,3278946263,US -3278946264,3278946267,DE -3278946268,3278946271,US -3278946272,3278946275,SV -3278946276,3278946279,DO -3278946280,3278946283,DE -3278946284,3278946287,US -3278946288,3278946291,DE -3278946292,3278946299,US -3278946300,3278946303,DE -3278946304,3278954495,LB -3278954496,3278962687,RU -3278962688,3279028223,CZ -3279028224,3279028735,PL -3279028736,3279029247,RU -3279029760,3279030271,RU -3279030784,3279031295,DE -3279031296,3279031807,NL -3279032320,3279032831,HU -3279032832,3279033343,FR -3279033344,3279033855,RU -3279033856,3279034367,DE -3279034368,3279035391,FR -3279035392,3279035903,PS -3279035904,3279036415,UA -3279036416,3279044607,LV -3279044608,3279052799,FR -3279052800,3279053311,UA -3279053312,3279053823,DE -3279053824,3279054335,NL -3279054336,3279054847,GB -3279054848,3279055359,RU -3279055360,3279055871,SA -3279056896,3279057151,RU -3279057408,3279057919,FR -3279058944,3279059455,UA -3279059456,3279060479,RU -3279060992,3279069183,UA -3279069184,3279077375,PL -3279077376,3279085567,ES -3279085568,3279089663,NL -3279089664,3279093759,KG -3279093760,3279123455,FR -3279123456,3279123967,RE -3279123968,3279159295,FR -3279159296,3279290367,PL -3279290368,3279291391,NL -3279291392,3279291647,GB -3279291648,3279294463,NL -3279294720,3279294975,IE -3279294976,3279295231,SE -3279295232,3279295487,ES -3279295488,3279295743,PT -3279295744,3279295999,IL -3279296000,3279296511,ZA -3279296512,3279297279,ES -3279297280,3279297535,ZA -3279297536,3279298047,SE -3279298048,3279298559,ZA -3279298560,3279305471,DE -3279305488,3279305503,DE -3279305504,3279305535,GB -3279305536,3279305631,DE -3279305632,3279305663,GB -3279305664,3279305727,ES -3279305728,3279306751,DE -3279306752,3279310847,FR -3279310848,3279311871,DE -3279312896,3279313415,DE -3279313424,3279313919,DE -3279313920,3279314943,GB -3279314944,3279315711,CH -3279315712,3279315967,BE -3279315968,3279316223,DE -3279316224,3279316479,BE -3279316480,3279317759,IT -3279317760,3279317887,DE -3279317888,3279317951,IT -3279317952,3279317967,DE -3279317968,3279317983,IT -3279317984,3279318015,NL -3279318016,3279318271,DE -3279318272,3279318527,GB -3279318528,3279318559,CZ -3279318560,3279318655,FR -3279318656,3279318687,CZ -3279318688,3279318719,FR -3279318720,3279318751,ZA -3279318752,3279318783,GB -3279318784,3279319039,NL -3279319040,3279320063,AT -3279320064,3279321087,FR -3279321088,3279322623,DK -3279322624,3279322663,NL -3279322664,3279322671,AT -3279322672,3279322687,GB -3279322688,3279322879,DE -3279322880,3279322975,NL -3279322976,3279323071,DE -3279323072,3279330079,GB -3279330080,3279330111,DK -3279330112,3279330815,GB -3279331072,3279335295,GB -3279335296,3279335423,BE -3279335424,3279339519,GB -3279339520,3279340031,ES -3279340032,3279340543,IT -3279340544,3279340671,FR -3279340800,3279341055,FR -3279341056,3279341567,IT -3279341568,3279341823,SE -3279341824,3279342079,ZA -3279342080,3279342335,IT -3279342336,3279342591,ZA -3279342592,3279342847,SE -3279342848,3279343103,HR -3279343104,3279343359,SI -3279343360,3279343615,ZA -3279343616,3279345151,BE -3279345152,3279345663,SE -3279345664,3279346943,GB -3279346944,3279347711,FR -3279347712,3279348223,SE -3279348224,3279348735,IT -3279348736,3279348991,GB -3279348992,3279349247,ES -3279349248,3279349503,IT -3279349504,3279349759,FR -3279349760,3279351039,DE -3279351040,3279351295,FR -3279351296,3279351807,GB -3279351808,3279352319,DK -3279352320,3279352575,GB -3279352576,3279352831,BE -3279352832,3279352855,SE -3279353088,3279353343,GB -3279353344,3279354879,DK -3279354880,3279355647,AT -3279355648,3279355903,BE -3279373312,3279374335,FI -3279374592,3279375359,FI -3279388672,3279396863,GR -3279402752,3279403007,CZ -3279403264,3279403903,CZ -3279404288,3279404415,CZ -3279404800,3279405055,CZ -3279421440,3279486975,IT -3279486976,3279552511,NL -3279552512,3279559028,LV -3279559029,3279559029,US -3279559030,3279560703,LV -3279560704,3279568895,GB -3279568896,3279577087,IT -3279577088,3279585279,BE -3279585280,3279586815,GB -3279586816,3279587327,DE -3279587328,3279587583,GB -3279587584,3279588095,DE -3279588096,3279590399,GB -3279590400,3279590655,US -3279590656,3279590911,GB -3279590912,3279591167,DE -3279591168,3279592447,GB -3279592448,3279592959,DE -3279592960,3279593593,GB -3279593594,3279593594,DE -3279593595,3279593599,GB -3279593600,3279593727,DE -3279593728,3279593919,GB -3279593920,3279593983,DE -3279593984,3279596543,GB -3279596544,3279597311,DE -3279597312,3279598591,GB -3279598592,3279599615,DE -3279599616,3279601663,GB -3279601664,3279609855,CZ -3279609856,3279618047,RU -3279618048,3279671295,UA -3279671296,3279673343,LV -3279673344,3279675391,NL -3279675392,3279677439,BG -3279677440,3279678463,US -3279678464,3279679487,SG -3279679488,3279683583,UA -3279683584,3279946751,DE -3279946752,3279947775,SE -3279947776,3279948799,NL -3279949824,3279950847,UA -3279950848,3279951871,DE -3279952896,3279953919,PL -3279953920,3279955967,TR -3279955968,3279958015,DE -3279958016,3279970303,RU -3279972352,3279974399,AT -3279974400,3279976447,PL -3279976448,3279978495,RU -3279978496,3279978751,SI -3279978752,3279979007,NL -3279979008,3279979263,RO -3279979264,3279979519,SA -3279979520,3279979775,BG -3279979776,3279980031,RU -3279980032,3279980287,BG -3279980288,3279980543,PL -3279980544,3279980799,RO -3279980800,3279981055,RU -3279981056,3279981311,GB -3279981312,3279981567,UA -3279981568,3279981823,PL -3279981824,3279982079,SI -3279982080,3279982335,PL -3279982336,3279982591,FR -3279982592,3279982847,DE -3279982848,3279983103,IL -3279983104,3279983615,FR -3279983616,3279983871,PL -3279983872,3279984127,FR -3279984128,3279984383,AT -3279984384,3279984639,RO -3279984640,3279985151,RU -3279985152,3279985407,PL -3279985408,3279985663,CZ -3279985664,3279985919,DE -3279985920,3279986687,RU -3279986688,3279987199,NL -3279987712,3279988223,RO -3279988224,3279988735,AM -3279988736,3279989247,RO -3279989248,3279989759,AT -3279989760,3279990271,PL -3279990272,3279990783,DK -3279990784,3279991295,IL -3279991808,3279992319,PL -3279992320,3279992831,UA -3279992832,3279993855,NL -3279993856,3279994367,RO -3279994368,3279994879,GB -3279994880,3280003071,CZ -3280003072,3280003583,BG -3280003584,3280004095,GB -3280004096,3280004607,PL -3280004608,3280005119,UA -3280005120,3280005631,HU -3280005632,3280006143,IT -3280006144,3280006655,DK -3280006656,3280007167,GB -3280007680,3280008191,PL -3280008192,3280009215,RU -3280009216,3280009727,UA -3280009728,3280010239,GB -3280010240,3280010751,UA -3280023552,3280024575,IT -3280076800,3280084991,GB -3280084992,3280093183,BA -3280093184,3280109567,GR -3280109568,3280117759,BE -3280117760,3280125951,CH -3280126208,3280126463,IS -3280126464,3280126719,SI -3280126720,3280126975,IT -3280126976,3280127231,CH -3280127232,3280127487,PL -3280127488,3280127743,AT -3280127744,3280127999,NL -3280128000,3280128255,SE -3280128256,3280128511,GB -3280128512,3280129023,HU -3280129280,3280129535,LV -3280129792,3280130047,FR -3280130304,3280130559,RU -3280130560,3280130815,GB -3280130816,3280131071,IS -3280131072,3280131327,PL -3280131328,3280131583,IT -3280131584,3280131839,RU -3280131840,3280132095,RO -3280132096,3280132351,RU -3280132352,3280132607,GB -3280132608,3280132863,CH -3280132864,3280133119,UA -3280133120,3280133375,IT -3280133376,3280133631,DE -3280133632,3280133887,FR -3280133888,3280134143,NL -3280134144,3280142335,IT -3280142336,3280207871,RU -3280207872,3280273407,FR -3280273408,3280325119,RU -3280325120,3280325631,US -3280325632,3280326655,ES -3280326656,3280327167,US -3280327168,3280327679,RU -3280327680,3280328703,ES -3280328704,3280329727,RU -3280329728,3280330751,IQ -3280330752,3280338943,RU -3280338944,3280347135,GB -3280347136,3280355327,NO -3280355328,3280371711,GR -3280371712,3280379903,CH -3280379904,3280381951,FR -3280381952,3280383999,NL -3280384000,3280386047,IT -3280386048,3280388095,SA -3280388096,3280396287,GB -3280396288,3280404479,US -3280404480,3280437247,IT -3280437248,3280453631,DE -3280453632,3280454655,IT -3280454656,3280455679,UA -3280455680,3280456703,IT -3280456704,3280457727,RU -3280457728,3280458751,GB -3280458752,3280459775,RU -3280459776,3280460799,DK -3280460800,3280462847,DE -3280462848,3280463871,PL -3280463872,3280466943,RU -3280467968,3280468991,ES -3280470016,3280535551,PL -3280535552,3280568319,GB -3280568320,3280576511,IT -3280576512,3280576767,BY -3280576768,3280577279,PL -3280577280,3280577535,DE -3280577792,3280578047,NL -3280578048,3280578303,RO -3280578304,3280578559,UA -3280578816,3280579071,NL -3280579072,3280579327,DE -3280579328,3280579583,RU -3280579584,3280579839,CH -3280579840,3280580095,HR -3280580096,3280580351,KW -3280580352,3280580607,CH -3280580608,3280580863,GB -3280580864,3280581119,DE -3280581120,3280581375,DK -3280581376,3280581631,EE -3280581632,3280581887,BY -3280581888,3280582143,FR -3280582144,3280582399,CZ -3280582400,3280582655,DK -3280582656,3280582911,FR -3280582912,3280583167,UA -3280583424,3280583679,RU -3280583936,3280584191,PL -3280584192,3280584447,KW -3280584448,3280584703,DE -3280585216,3280585727,DK -3280585728,3280585983,UA -3280585984,3280586239,PL -3280586240,3280586751,DE -3280586752,3280587263,RU -3280587264,3280587775,UA -3280588288,3280588799,UA -3280588800,3280589311,PL -3280589312,3280590335,DE -3280590336,3280590847,NL -3280590848,3280591359,DE -3280591360,3280591871,UA -3280591872,3280592383,US -3280592384,3280592895,TR -3280592896,3280593407,DE -3280593408,3280593919,UA -3280593920,3280594431,LU -3280594432,3280594943,NL -3280594944,3280595455,UA -3280595456,3280595967,DE -3280595968,3280596479,DK -3280596480,3280596991,AT -3280596992,3280597503,UA -3280597504,3280597759,NL -3280597760,3280598015,BE -3280598016,3280598527,UA -3280598528,3280599039,PL -3280599040,3280599551,FR -3280599552,3280600063,UA -3280600064,3280600575,BG -3280600576,3280601087,UA -3280601088,3280609279,PT -3280609280,3280617471,DE -3280617472,3280625663,UA -3280625664,3280633855,MD -3280633856,3280642047,BG -3280642048,3280650239,UA -3280650240,3280650495,RO -3280650496,3280650751,UA -3280650752,3280651263,GB -3280651264,3280651519,SI -3280651520,3280651775,FR -3280651776,3280652031,UA -3280652032,3280652287,NO -3280652288,3280652543,PL -3280652544,3280652799,SI -3280652800,3280653055,FR -3280653056,3280653311,CH -3280653312,3280653823,GB -3280653824,3280654079,RU -3280654080,3280654591,PL -3280654592,3280654847,ES -3280654848,3280655103,RU -3280655104,3280655359,PL -3280655360,3280655615,SE -3280655616,3280655871,FI -3280655872,3280656127,RO -3280656128,3280656639,CH -3280656640,3280657407,UA -3280657664,3280657919,SE -3280657920,3280658175,RO -3280658176,3280658431,DE -3280658432,3280660479,MT -3280660480,3280662527,RU -3280662528,3280662591,DE -3280662592,3280662607,IT -3280662608,3280662623,DE -3280662624,3280662655,IT -3280662656,3280662687,AR -3280662688,3280662703,AT -3280662704,3280662783,DE -3280662784,3280663295,CZ -3280663296,3280663327,AR -3280663328,3280663343,DE -3280663344,3280663391,IT -3280663392,3280663407,HK -3280663408,3280663423,IT -3280663424,3280663999,DE -3280664000,3280664063,IT -3280664064,3280664319,CZ -3280664320,3280664831,DE -3280664832,3280665087,CZ -3280665088,3280666623,DE -3280666624,3280732159,NO -3280732160,3280764927,DE -3280765952,3280766975,DK -3280766976,3280767999,AT -3280768000,3280769023,FR -3280770048,3280771071,FR -3280771072,3280772095,PL -3280772096,3280773119,ES -3280773120,3280774143,UA -3280774144,3280775167,ME -3280775168,3280776191,UA -3280776192,3280777215,SE -3280777216,3280778239,UA -3280778240,3280779263,RU -3280779264,3280780287,DE -3280780288,3280781311,PL -3280781312,3280782335,FI -3280782336,3280783359,TR -3280783360,3280784383,SE -3280784384,3280785407,RU -3280785408,3280786431,DE -3280786432,3280788479,GB -3280788480,3280789503,PL -3280790528,3280791551,UA -3280791552,3280792575,DE -3280792576,3280793599,PL -3280793600,3280794623,NL -3280794624,3280795647,UA -3280795648,3280796671,MZ -3280796672,3280797695,CZ -3280797696,3280863231,CH -3280863232,3280928767,TR -3280928768,3280934927,GB -3280934928,3280934935,DE -3280934936,3280935055,GB -3280935056,3280935063,IT -3280935064,3280935087,GB -3280935088,3280935095,ES -3280935096,3280935119,GB -3280935120,3280935127,FR -3280935128,3280940787,GB -3280940788,3280940791,DE -3280940792,3280941387,GB -3280941388,3280941395,DE -3280941396,3280942191,GB -3280942192,3280942207,DK -3280942208,3280952331,GB -3280952332,3280952335,DE -3280952336,3280952783,GB -3280952784,3280952799,DE -3280952800,3280955707,GB -3280955708,3280955711,DE -3280955712,3280958919,GB -3280958920,3280958927,DE -3280958928,3280963375,GB -3280963376,3280963383,DE -3280963384,3280985279,GB -3280985280,3280985343,CH -3280985344,3280991231,GB -3280991232,3280991743,DE -3280991744,3280994559,GB -3280994560,3280994815,RU -3280994816,3280995071,NL -3280995072,3280995327,DE -3280995328,3280995583,SE -3280995584,3280995839,GB -3280995840,3280996095,RU -3280996096,3280996351,CH -3280996352,3280996607,GB -3280996608,3280996863,PL -3280996864,3280997119,NL -3280997120,3280997375,FR -3280997376,3280997631,PL -3280997632,3280997887,SE -3280997888,3280998143,UA -3280998144,3280998399,DE -3280998400,3280998655,GR -3280998656,3280999423,GB -3280999424,3280999679,HU -3280999680,3280999935,UA -3280999936,3281000191,DE -3281000448,3281000703,FR -3281000704,3281000959,UA -3281000960,3281001215,SI -3281001472,3281001727,UA -3281001728,3281001983,RU -3281001984,3281002239,CH -3281002240,3281002495,DE -3281002496,3281010687,CH -3281010688,3281018879,BE -3281018880,3281027071,CZ -3281027080,3281027087,GB -3281027136,3281027151,GB -3281027200,3281027215,GB -3281027280,3281027287,GB -3281027304,3281027311,GB -3281027320,3281027327,GB -3281027584,3281027615,GB -3281027632,3281027679,GB -3281027696,3281027743,GB -3281027776,3281027807,GB -3281027840,3281027903,GB -3281028064,3281028159,GB -3281028992,3281029055,GB -3281030400,3281035263,GB -3281035264,3281043455,CH -3281043456,3281049615,RU -3281049616,3281049622,GI -3281049623,3281059839,RU -3281059840,3281125375,DE -3281125376,3281127167,SK -3281127168,3281127423,CZ -3281127424,3281133567,SK -3281133568,3281141759,IR -3281141760,3281149951,RU -3281149952,3281158143,CZ -3281158144,3281166335,SK -3281166336,3281174527,GB -3281174528,3281190911,FR -3281190912,3281256447,GB -3281256448,3281321983,FI -3281321984,3281338367,GB -3281338368,3281338623,PL -3281338624,3281338879,SA -3281338880,3281339135,FR -3281339392,3281339647,PL -3281339648,3281339903,GB -3281339904,3281340159,UA -3281340160,3281340415,BG -3281340416,3281340671,RO -3281340928,3281341183,DE -3281341184,3281341439,AT -3281341440,3281341695,DE -3281341696,3281341951,PL -3281341952,3281342207,DK -3281342208,3281343231,DE -3281343232,3281343487,FI -3281343488,3281343743,GB -3281343744,3281343999,TR -3281344000,3281344255,NL -3281344256,3281344511,RU -3281344512,3281344767,UA -3281344768,3281345023,RU -3281345280,3281345535,SA -3281346048,3281346303,SI -3281346304,3281346559,PL -3281346560,3281346815,UA -3281346816,3281347071,DE -3281347072,3281347327,PL -3281347328,3281347583,DE -3281347584,3281347839,PL -3281347840,3281348095,SE -3281348096,3281348351,DE -3281348352,3281348607,GB -3281348608,3281349119,RU -3281349120,3281349375,UA -3281349376,3281349631,NL -3281349632,3281350143,UA -3281350144,3281350655,RU -3281350656,3281350911,UA -3281350912,3281351167,ES -3281351168,3281351423,UA -3281351424,3281351679,CH -3281351680,3281351935,TR -3281351936,3281352191,UA -3281352192,3281352447,PL -3281352704,3281352959,DE -3281352960,3281353215,GB -3281353216,3281353471,DE -3281353472,3281353727,SE -3281353728,3281353983,PL -3281353984,3281354239,UA -3281354240,3281354751,GB -3281354752,3281371135,SE -3281371136,3281372159,RS -3281372160,3281372671,RU -3281372672,3281373183,PL -3281373184,3281375231,RU -3281375232,3281377279,ES -3281377280,3281379327,AT -3281379328,3281383423,PL -3281383424,3281385471,AT -3281385472,3281387519,BG -3281387520,3281453055,PL -3281453056,3281518591,RU -3281518592,3281649663,GB -3281649664,3281696171,FR -3281696172,3281696172,PL -3281696173,3281715199,FR -3281715200,3281780735,TR -3281780736,3281846271,FI -3281846272,3281911807,GB -3281911808,3281919999,UZ -3281920000,3281928191,DE -3281928192,3281944575,MT -3281944576,3281960959,DE -3281960960,3281969151,JO -3281969152,3281969663,RU -3281969664,3281970175,PL -3281970176,3281970687,RU -3281970688,3281971199,CH -3281971200,3281971711,RU -3281971712,3281972223,RO -3281972224,3281972735,DE -3281972736,3281973247,RU -3281973248,3281973759,FR -3281973760,3281974271,DK -3281974784,3281975295,PL -3281975296,3281976319,RU -3281976320,3281976831,DE -3281976832,3281977343,RU -3281977344,3282042879,NO -3282042880,3282083839,CH -3282083840,3282084351,DE -3282084352,3282084863,RO -3282084864,3282085375,RU -3282085376,3282085887,BE -3282085888,3282086399,DE -3282086400,3282086911,LV -3282086912,3282087423,DE -3282087424,3282087935,PL -3282087936,3282088447,SE -3282088448,3282089471,PL -3282089472,3282089983,SK -3282089984,3282090495,PL -3282091008,3282091519,FR -3282091520,3282092031,CH -3282092032,3282093055,UA -3282093056,3282095103,DE -3282095104,3282096127,UA -3282096128,3282097151,IT -3282097152,3282098175,GB -3282098176,3282099199,NL -3282099200,3282100223,UA -3282100224,3282101247,ES -3282101248,3282102271,DE -3282102272,3282103295,UA -3282103296,3282104319,GB -3282104320,3282105343,IL -3282105344,3282106367,RU -3282106368,3282107391,DE -3282107392,3282107654,NL -3282107655,3282107655,CH -3282107656,3282108415,NL -3282108416,3282173951,RU -3282173952,3282174463,UA -3282174464,3282174975,GB -3282174976,3282175487,DE -3282176000,3282177023,RU -3282177024,3282177535,GB -3282177536,3282178047,KZ -3282178048,3282178559,PL -3282178560,3282179071,ES -3282179072,3282179583,GB -3282179584,3282180095,RU -3282180096,3282180607,PL -3282180608,3282181119,KZ -3282181120,3282181631,GB -3282181632,3282182143,DE -3282182144,3282190335,RU -3282190336,3282190847,UA -3282190848,3282191359,IL -3282191360,3282191871,NL -3282191872,3282192383,UA -3282192384,3282192895,BG -3282192896,3282193407,UA -3282193408,3282193919,PL -3282193920,3282194431,RU -3282194432,3282195455,UA -3282195456,3282196479,IE -3282196480,3282197503,UA -3282198272,3282198527,HR -3282198528,3282206719,GB -3282206720,3282223103,CH -3282223104,3282231295,BE -3282231296,3282239487,DE -3282239488,3282305023,SE -3282305024,3282370559,PL -3282370560,3282436095,FI -3282436096,3282468095,GB -3282468096,3282468351,DE -3282468352,3282477055,GB -3282477056,3282485247,RU -3282485248,3282493439,GI -3282501632,3282534399,GR -3282534400,3282538495,GB -3282538496,3282542591,PL -3282542592,3282546687,US -3282546688,3282550783,GB -3282550784,3282554879,FR -3282554880,3282558975,DE -3282558976,3282563071,FR -3282563072,3282567167,GB -3282567168,3282622871,SK -3282622872,3282622879,AT -3282622880,3282632703,SK -3282632704,3282698239,NL -3282698240,3282706431,GR -3282706432,3282714623,RU -3282714624,3282722815,AT -3282722816,3282731007,DE -3282731008,3282739199,FI -3282739200,3282739455,CH -3282739456,3282739711,RO -3282739712,3282739967,FR -3282739968,3282740223,IR -3282740224,3282740479,FR -3282740736,3282740991,BG -3282741248,3282741503,PT -3282741504,3282741759,GB -3282741760,3282742015,ES -3282742016,3282742271,RO -3282742528,3282742783,GB -3282742784,3282743039,RU -3282743040,3282743295,CH -3282743296,3282743551,CY -3282743552,3282743807,SI -3282743808,3282744063,BG -3282744064,3282744319,UA -3282744320,3282744575,SA -3282744576,3282744831,LT -3282744832,3282745087,PL -3282745088,3282745343,RS -3282745344,3282745599,HU -3282745600,3282745855,DE -3282745856,3282746111,PL -3282746112,3282746367,SE -3282746368,3282746623,PL -3282746624,3282746879,SE -3282747136,3282747391,PL -3282747392,3282763775,RU -3282763776,3282960383,GB -3282960384,3283091455,TR -3283091456,3283111935,CH -3283111936,3283113471,LI -3283113472,3283156991,CH -3283156992,3283173375,DE -3283173376,3283174399,PL -3283174400,3283175423,GB -3283175424,3283176447,UA -3283177472,3283178495,BE -3283178496,3283179519,PL -3283180544,3283181567,UA -3283181568,3283182591,NO -3283182592,3283183615,PL -3283183616,3283184639,RU -3283186688,3283187711,UA -3283187712,3283188735,RU -3283188736,3283189759,UA -3283189760,3283206143,DE -3283206144,3283206655,GB -3283207168,3283207679,PL -3283207680,3283208191,AT -3283208192,3283208703,DE -3283208704,3283209215,NO -3283209216,3283209727,RU -3283209728,3283210239,TR -3283210240,3283210751,UA -3283210752,3283211263,PL -3283211264,3283211775,GB -3283211776,3283212287,NL -3283212288,3283212799,PL -3283212800,3283213311,BG -3283213312,3283213823,ES -3283213824,3283214335,UA -3283214336,3283214847,RO -3283214848,3283215359,RU -3283215360,3283215871,AT -3283216384,3283216895,DE -3283216896,3283217407,CH -3283217408,3283218943,UA -3283218944,3283219455,NL -3283219456,3283219967,GB -3283219968,3283220479,BE -3283220480,3283220991,BG -3283220992,3283221503,AT -3283221504,3283222015,GB -3283222016,3283223039,DE -3283223040,3283223551,RU -3283223552,3283224063,NL -3283224576,3283225087,BG -3283225088,3283225599,UA -3283225600,3283226111,RU -3283226112,3283226623,DK -3283226624,3283227135,RU -3283227136,3283227647,UA -3283227648,3283229183,RU -3283229184,3283229695,PL -3283229696,3283230207,IT -3283230208,3283230719,UA -3283230720,3283238911,RS -3283238912,3283247103,CZ -3283247104,3283247615,LV -3283247616,3283248127,BG -3283248128,3283248639,DE -3283248640,3283249151,RO -3283249152,3283249663,UA -3283249664,3283249919,MD -3283249920,3283250175,RO -3283250176,3283250687,RU -3283251200,3283251711,FR -3283251712,3283252223,PL -3283252224,3283252735,BG -3283252736,3283253247,SI -3283253760,3283254271,PL -3283255296,3283263487,UA -3283263488,3283271679,SE -3283271680,3283279871,RU -3283279872,3283288063,SE -3283288064,3283419135,DE -3283419136,3283451903,IR -3283451904,3283460095,NO -3283460096,3283460607,GB -3283460608,3283460863,US -3283460864,3283461631,GB -3283461632,3283461887,SE -3283461888,3283462143,GB -3283462144,3283462399,US -3283462400,3283462655,GB -3283462656,3283462911,DE -3283462912,3283463167,GB -3283463168,3283463679,NL -3283463680,3283464191,DE -3283464192,3283468287,IT -3283468288,3283472383,FI -3283472384,3283476479,CZ -3283476480,3283480575,LU -3283480576,3283482623,LT -3283482624,3283483647,SK -3283483648,3283484159,ES -3283484160,3283484415,DE -3283484416,3283484671,ES -3283484672,3283484927,UA -3283484928,3283485183,NL -3283485184,3283485439,DE -3283485440,3283485695,RU -3283485696,3283485951,GB -3283485952,3283486207,SE -3283486208,3283486463,AT -3283486464,3283486719,UA -3283486720,3283486975,RU -3283486976,3283487231,PL -3283487488,3283487743,DE -3283487744,3283487999,CH -3283488000,3283488255,NL -3283488256,3283488511,PL -3283488768,3283489279,FR -3283489280,3283489535,DE -3283489792,3283490047,RU -3283490048,3283490559,UA -3283490560,3283490815,PL -3283491072,3283491327,TR -3283491328,3283491583,AT -3283491840,3283492095,RU -3283492352,3283492607,ES -3283492608,3283492863,SA -3283492864,3283493119,DK -3283493120,3283493375,IL -3283493376,3283493887,PL -3283493888,3283494911,DK -3283494912,3283495167,PL -3283495168,3283495423,BG -3283495424,3283495679,TR -3283495680,3283495935,NL -3283495936,3283496191,BG -3283496192,3283496447,DE -3283496448,3283496703,HR -3283496704,3283496959,LV -3283496960,3283497215,DE -3283497216,3283497471,PL -3283497472,3283497727,DE -3283497728,3283498239,PL -3283498240,3283498495,CH -3283498496,3283498751,PL -3283498752,3283499007,AT -3283499008,3283499263,DE -3283499264,3283499519,RU -3283499520,3283499775,DE -3283499776,3283500031,GB -3283500032,3283500287,DE -3283500288,3283500543,SI -3283500544,3283500799,GB -3283500800,3283501055,UA -3283501056,3283509247,LT -3283509248,3283517439,DE -3283517440,3283525631,RU -3283525632,3283533823,GB -3283533824,3283534847,UA -3283534848,3283535359,DE -3283536384,3283536895,UA -3283537408,3283537919,PL -3283537920,3283538431,RO -3283538432,3283538943,IT -3283538944,3283539455,RO -3283539456,3283539967,RS -3283539968,3283540479,DK -3283540480,3283540991,PL -3283540992,3283541503,RO -3283541504,3283542015,CH -3283542016,3283550207,IT -3283552268,3283552271,IT -3283561472,3283562495,GB -3283563520,3283564543,GB -3283568640,3283569663,GB -3283576832,3283579903,DE -3283593216,3283595263,IT -3283615744,3283623935,HU -3283623936,3283632127,DK -3283632128,3283632639,NL -3283632640,3283633151,GB -3283633152,3283633663,SE -3283633664,3283634175,UA -3283634688,3283635199,RU -3283635200,3283635711,GB -3283635712,3283636223,RU -3283636224,3283636735,UA -3283636736,3283637759,PL -3283638272,3283638783,PL -3283639296,3283639807,CH -3283639808,3283640319,DE -3283640320,3283648511,DK -3283648512,3283649023,GB -3283649024,3283656703,BE -3283656704,3283664895,HU -3283664896,3283673087,UA -3283673088,3283681279,GB -3283681280,3283746815,DE -3283746816,3283812351,CH -3283812352,3283877887,PL -3283877888,3283943423,GB -3283943424,3283944447,CZ -3283944448,3283945471,AT -3283945472,3283946495,UA -3283946496,3283947519,GB -3283947520,3283948543,UA -3283948544,3283949567,NL -3283949568,3283950591,SE -3283950592,3283951615,KZ -3283951616,3283952639,PL -3283952640,3283953663,UA -3283953664,3283954687,PL -3283954688,3283955326,UA -3283955327,3283955327,CY -3283955328,3283956735,UA -3283956736,3283957759,PL -3283957760,3283958783,GR -3283958784,3283959807,UA -3283959808,3283960831,FR -3283960832,3283961855,KZ -3283962880,3283963903,PL -3283963904,3283964927,BG -3283964928,3283966975,PL -3283966976,3283967999,DE -3283968000,3283970047,RU -3283970048,3283971071,UA -3283971072,3283972095,RU -3283972096,3283973119,SE -3283973120,3283974143,NL -3283974144,3283975167,RU -3283975168,3283976191,NL -3283976192,3283976703,IE -3283976704,3283977215,DK -3283977216,3283977727,UA -3283977728,3283978751,RU -3283978752,3283979263,RO -3283979264,3283979775,IL -3283979776,3283980287,NL -3283980288,3283980799,RO -3283980800,3283981823,CH -3283981824,3283982335,RO -3283982848,3283983103,SE -3283983104,3283983359,RO -3283983360,3283983871,CY -3283983872,3283984383,GB -3283984384,3283984895,SE -3283984896,3283985407,GR -3283985920,3283986431,AT -3283986944,3283987455,AT -3283987456,3283987967,GB -3283988480,3283988735,RO -3283988736,3283988991,GB -3283988992,3283989503,FR -3283989504,3283990015,RU -3283990016,3283990527,SE -3283991040,3283991551,RO -3283991552,3283992063,SE -3283992576,3283993087,IL -3283993088,3283993599,RO -3283993600,3283994111,UA -3283994112,3283994623,AT -3283994624,3283995135,UA -3283995136,3283995647,BE -3283995648,3283996159,CH -3283996160,3283996671,MK -3283996672,3283997183,ES -3283997184,3283997695,PS -3283997696,3283998207,SA -3283998208,3283998719,UA -3283998720,3283999231,NL -3283999232,3283999743,RU -3283999744,3284000255,GB -3284000256,3284000767,RU -3284000768,3284001279,BG -3284001280,3284002303,UA -3284002304,3284002815,PL -3284002816,3284003327,DK -3284003328,3284003839,UA -3284003840,3284004351,DE -3284004352,3284004863,RU -3284004864,3284005375,UA -3284005376,3284005887,PA -3284005888,3284006399,DE -3284006400,3284007423,UA -3284007424,3284007935,RO -3284007936,3284008447,CH -3284008448,3284008959,NO -3284008960,3284009215,NL -3284009216,3284009471,PL -3284009472,3284009727,DE -3284009728,3284009983,FR -3284009984,3284010239,CH -3284010240,3284010751,FR -3284010752,3284011519,DE -3284011520,3284011775,HR -3284011776,3284012031,DE -3284012032,3284012287,RU -3284012288,3284012543,UA -3284012544,3284012799,RU -3284012800,3284013311,AT -3284013312,3284013567,PL -3284013568,3284013823,DK -3284013824,3284014079,IL -3284014080,3284014335,TR -3284014336,3284014591,IT -3284014592,3284014847,GB -3284014848,3284015103,IL -3284015104,3284015359,US -3284015360,3284015615,DK -3284015616,3284015871,AT -3284015872,3284016127,FR -3284016128,3284016383,NL -3284016384,3284016639,CH -3284016640,3284017151,DK -3284017152,3284025343,GR -3284025344,3284028139,GB -3284028140,3284028143,US -3284028144,3284028287,GB -3284028288,3284028319,US -3284028320,3284029183,GB -3284029184,3284029199,US -3284029200,3284029295,GB -3284029296,3284029311,US -3284029312,3284029439,GB -3284029440,3284030463,US -3284030464,3284030471,GB -3284030472,3284030479,IL -3284030480,3284030495,FR -3284030496,3284030575,GB -3284030576,3284030583,DE -3284030584,3284030615,GB -3284030616,3284030623,SE -3284030624,3284030775,GB -3284030776,3284030783,SE -3284030784,3284030799,GB -3284030800,3284030815,SE -3284030816,3284030991,GB -3284030992,3284031007,FR -3284031008,3284033535,GB -3284033536,3284041727,RU -3284041728,3284041983,DK -3284041984,3284042239,SI -3284042496,3284042751,AT -3284042752,3284043007,RU -3284043008,3284043263,TH -3284043264,3284043519,EE -3284043520,3284043775,DE -3284043776,3284044031,HR -3284044032,3284044287,FR -3284044288,3284044543,DE -3284044800,3284045055,CZ -3284045056,3284045311,EE -3284045312,3284045567,DE -3284045568,3284045823,AT -3284046080,3284046335,DE -3284046336,3284046591,NL -3284046592,3284046847,SE -3284046848,3284047103,DE -3284047616,3284047871,NL -3284047872,3284048127,UA -3284048128,3284048383,DK -3284048640,3284049151,FR -3284049408,3284049663,SI -3284049664,3284049919,RO -3284049920,3284058111,CH -3284058112,3284066303,SE -3284066304,3284075007,NL -3284075008,3284075519,DE -3284075520,3284076031,RU -3284076032,3284076543,SA -3284076544,3284077055,PL -3284077056,3284077567,RU -3284077568,3284078079,UA -3284078080,3284078591,DE -3284078592,3284079103,NL -3284079104,3284079615,RU -3284079616,3284080127,DE -3284080640,3284081151,UA -3284081152,3284081663,DE -3284081664,3284082175,IE -3284082176,3284082687,NO -3284082688,3284083199,RU -3284083200,3284083711,BG -3284083712,3284084223,RU -3284084224,3284084735,UA -3284084736,3284085247,RU -3284085248,3284085759,DE -3284086272,3284086783,RO -3284086784,3284087295,CZ -3284087296,3284087807,RU -3284087808,3284088319,IL -3284088832,3284089855,UA -3284089856,3284090367,BG -3284090368,3284090879,PL -3284090880,3284091391,RU -3284091392,3284091903,GB -3284091904,3284092415,DE -3284092416,3284092927,GB -3284092928,3284093439,UA -3284093440,3284093951,IR -3284093952,3284094975,RU -3284094976,3284095487,UA -3284095488,3284095999,RU -3284096000,3284096511,IT -3284096512,3284097023,GB -3284097024,3284097535,RU -3284098048,3284098559,DE -3284098560,3284099071,BG -3284099072,3284099327,SI -3284099328,3284099583,HU -3284099584,3284100095,GR -3284100096,3284100607,AM -3284101120,3284101631,UA -3284101632,3284102143,GB -3284102144,3284102655,DK -3284102656,3284103167,AT -3284103168,3284103679,NL -3284103680,3284104191,DE -3284104192,3284104703,NO -3284104704,3284105215,TR -3284105216,3284105727,NL -3284105728,3284106239,FI -3284106240,3284106751,RO -3284106752,3284107263,UA -3284107264,3284107775,DE -3284107776,3284108287,RU -3284108288,3284108799,CH -3284108800,3284109311,FR -3284109312,3284109823,RU -3284109824,3284110335,UA -3284110848,3284111359,DK -3284111360,3284111871,SE -3284111872,3284112383,RU -3284112384,3284112895,BG -3284112896,3284113919,NL -3284113920,3284114431,AM -3284114432,3284114943,GB -3284114944,3284115455,RU -3284115456,3284115967,RO -3284115968,3284116479,PL -3284116480,3284116991,NL -3284116992,3284117503,RU -3284117504,3284118015,UA -3284118016,3284118527,PL -3284118528,3284119039,FR -3284119040,3284119551,RU -3284120064,3284120575,UA -3284120576,3284121087,PL -3284121088,3284121599,RU -3284121600,3284122111,PL -3284122112,3284122623,AM -3284122624,3284123135,CH -3284123136,3284124159,RU -3284124160,3284124671,UA -3284124672,3284125183,DE -3284125696,3284126207,UA -3284126208,3284127231,CZ -3284127744,3284128255,RU -3284128256,3284128767,GB -3284128768,3284129279,SE -3284129280,3284129791,UA -3284129792,3284130303,DE -3284130304,3284130815,GB -3284130816,3284131327,RU -3284131328,3284131839,HU -3284131840,3284132351,DE -3284132352,3284132863,UA -3284132864,3284133375,HU -3284133376,3284133887,TM -3284133888,3284134399,PL -3284134400,3284134655,NL -3284134656,3284134911,UA -3284134912,3284135935,RU -3284135936,3284136447,CH -3284136448,3284136959,RU -3284136960,3284137471,FR -3284137472,3284137983,UA -3284137984,3284138495,PL -3284138496,3284139007,RU -3284139008,3284172799,AT -3284172800,3284193279,DE -3284193280,3284195327,AT -3284195328,3284197375,DE -3284197376,3284199423,IL -3284199424,3284200447,DK -3284200448,3284201471,FR -3284201472,3284202495,PL -3284202496,3284203519,RS -3284203520,3284204031,DK -3284204032,3284204543,FI -3284204544,3284205311,DE -3284205312,3284205567,ES -3284205568,3284257535,NL -3284257536,3284257791,GB -3284257792,3284271103,NL -3284271104,3284399155,GB -3284399156,3284399159,BG -3284399160,3284402175,GB -3284402176,3284467711,SE -3284467712,3284533247,FI -3284533248,3284598783,SE -3284598784,3284664319,HU -3284664320,3284672511,GB -3284672512,3284680703,DE -3284680704,3284681215,UA -3284681728,3284682239,FI -3284682240,3284682751,DE -3284682752,3284683263,SE -3284683264,3284683775,KZ -3284683776,3284684287,GB -3284684288,3284684799,FR -3284684800,3284685311,DE -3284685312,3284685823,NL -3284685824,3284686335,DE -3284686336,3284686847,RO -3284686848,3284687359,PL -3284687360,3284687871,UA -3284687872,3284688383,NG -3284688384,3284688895,IT -3284688896,3284697087,FR -3284697088,3284705279,GB -3284705280,3284713471,FR -3284713472,3284713727,DE -3284713728,3284713983,GR -3284713984,3284714239,DE -3284714240,3284714495,FR -3284714496,3284714751,UA -3284714752,3284715007,AT -3284715008,3284715263,GB -3284715264,3284715519,PL -3284715520,3284715775,SI -3284715776,3284716031,BE -3284716032,3284716287,IT -3284716288,3284716543,RU -3284716544,3284716799,GR -3284716800,3284717055,IL -3284717056,3284717311,PL -3284717312,3284717567,DE -3284717568,3284717823,FR -3284717824,3284718079,RU -3284718336,3284718591,GB -3284718592,3284718847,PL -3284718848,3284719103,RU -3284719104,3284719359,PL -3284719616,3284719871,RU -3284719872,3284720127,FR -3284720128,3284720383,CH -3284720384,3284720895,SE -3284721152,3284721407,TR -3284721408,3284721663,NL -3284721664,3284722175,BE -3284722176,3284722687,RU -3284722688,3284723199,FR -3284723200,3284723711,GB -3284724224,3284724735,PL -3284724736,3284725247,RU -3284725248,3284725759,GR -3284725760,3284726271,LU -3284726272,3284726783,DE -3284726784,3284727295,UA -3284727296,3284727807,MK -3284727808,3284728319,RU -3284728320,3284728831,UA -3284728832,3284729343,PT -3284729344,3284729855,FR -3284729856,3284795391,DE -3284795392,3284803583,FR -3284803584,3284811775,DE -3284811776,3284819967,KE -3284819968,3284822272,GB -3284822273,3284822273,NL -3284822274,3284822274,IT -3284822275,3284822275,CH -3284822276,3284822276,ES -3284822277,3284822277,BE -3284822278,3284822278,RU -3284822279,3284822279,SE -3284822280,3284822280,IT -3284822281,3284822281,GB -3284822282,3284822282,FR -3284822283,3284822447,GB -3284822448,3284822479,NL -3284822480,3284828159,GB -3284828160,3284844543,AT -3284844544,3284860927,CH -3284860928,3284926463,DE -3284926464,3284991999,NO -3284992000,3285057535,PL -3285057536,3285065727,IT -3285065728,3285073919,RU -3285073920,3285074431,NL -3285074432,3285074687,GB -3285074688,3285076607,NL -3285076608,3285076767,BE -3285076768,3285078111,NL -3285078112,3285078143,GB -3285078144,3285078175,NL -3285078176,3285078191,GB -3285078192,3285079423,NL -3285079424,3285079551,DE -3285079552,3285079967,NL -3285079968,3285079999,DE -3285080000,3285082111,NL -3285082112,3285084159,AT -3285086208,3285088255,PL -3285088256,3285088511,RO -3285088512,3285088767,DK -3285088768,3285089279,RU -3285089280,3285090303,PL -3285090304,3285098495,DE -3285098496,3285114879,GB -3285114880,3285115903,RU -3285115904,3285116415,SI -3285116928,3285117439,UA -3285117952,3285118463,FR -3285118464,3285118975,UA -3285118976,3285119487,RU -3285119488,3285119999,RO -3285120000,3285120511,RU -3285121024,3285121535,SE -3285121536,3285122047,CY -3285122048,3285123071,RU -3285123072,3285188607,BE -3285188608,3285292799,RU -3285292800,3285293055,UA -3285293056,3285319679,RU -3285319680,3285320191,HU -3285320192,3285320703,RU -3285320704,3285321215,RO -3285321216,3285321727,DE -3285321728,3285322239,RU -3285322240,3285322751,DE -3285322752,3285323263,PL -3285323264,3285323775,CZ -3285323776,3285324287,CH -3285324288,3285324799,DK -3285324800,3285325311,RU -3285325312,3285325823,GB -3285325824,3285326335,PL -3285326336,3285326847,DE -3285326848,3285327359,SK -3285327360,3285328383,RU -3285328384,3285328895,PL -3285328896,3285329407,SE -3285329408,3285329919,GB -3285329920,3285330431,RO -3285330432,3285330943,FR -3285330944,3285331455,RO -3285331456,3285331967,KZ -3285331968,3285332991,DE -3285332992,3285333503,SE -3285333504,3285334015,GB -3285334016,3285334527,NL -3285334528,3285335039,DE -3285335040,3285335551,PL -3285335552,3285336063,SE -3285336064,3285344255,IT -3285344256,3285352447,GB -3285352448,3285368831,RU -3285368832,3285385215,SI -3285385216,3285386239,PL -3285386240,3285387263,RU -3285387264,3285388287,PL -3285388288,3285389311,CH -3285389312,3285390335,FI -3285390336,3285393407,RU -3285393408,3285394431,AT -3285394432,3285396479,RU -3285396480,3285397503,IR -3285397504,3285398527,NL -3285398528,3285399551,CZ -3285399552,3285400575,NL -3285400576,3285401599,UA -3285401600,3285402623,RU -3285402624,3285403647,IL -3285403648,3285404671,NL -3285404672,3285406719,RU -3285406720,3285407743,UA -3285407744,3285408767,RU -3285408768,3285409791,GB -3285409792,3285410815,UA -3285410816,3285412863,RU -3285412864,3285413887,UA -3285413888,3285414978,RU -3285414979,3285414979,UA -3285414980,3285419007,RU -3285419008,3285420031,SE -3285420032,3285425151,UA -3285425152,3285426175,LV -3285426176,3285427199,RU -3285427200,3285428223,GB -3285429248,3285430271,UA -3285430272,3285431295,DK -3285431296,3285432319,UZ -3285432320,3285434367,UA -3285434368,3285436415,RU -3285436416,3285437439,GR -3285437440,3285438463,RU -3285438464,3285440511,UA -3285440512,3285442559,RU -3285442560,3285443583,IE -3285443584,3285444607,UA -3285444608,3285446655,RU -3285446656,3285447679,UA -3285447680,3285449215,RU -3285449216,3285449471,GB -3285449472,3285449727,RU -3285449728,3285450751,UA -3285451456,3285451471,GB -3285452496,3285452511,GB -3285453440,3285453567,GB -3285453664,3285453695,GB -3285458176,3285458431,GB -3285461280,3285461299,NL -3285461432,3285461435,NL -3285461808,3285461839,NL -3285461844,3285461847,NL -3285461856,3285461859,NL -3285461864,3285461871,NL -3285461884,3285461887,NL -3285463168,3285463199,LU -3285467040,3285467103,BG -3285472256,3285472271,US -3285472272,3285472287,DE -3285472288,3285472511,US -3285477136,3285477151,IT -3285479396,3285479399,FR -3285480960,3285481215,CH -3285485568,3285485571,SK -3285488576,3285488639,CY -3285495296,3285495807,ES -3285501312,3285501363,CZ -3285501364,3285501367,US -3285501368,3285501383,CZ -3285501744,3285501759,GB -3285501920,3285501923,CZ -3285501928,3285501935,CZ -3285501944,3285501947,CZ -3285510144,3285512191,GB -3285515776,3285515799,GR -3285515816,3285515823,GR -3285516032,3285516095,HR -3285516288,3285581823,BE -3285581824,3285596159,DE -3285596160,3285596191,US -3285596192,3285596223,DE -3285596224,3285596255,US -3285596256,3285596287,DE -3285596288,3285596319,US -3285596320,3285596351,DE -3285596352,3285596383,FR -3285596384,3285597183,DE -3285597184,3285597215,US -3285597216,3285606399,DE -3285606400,3285614591,GB -3285614592,3285630975,TR -3285630976,3285633023,UA -3285633024,3285635071,NO -3285635072,3285637119,UA -3285637120,3285638143,DE -3285638144,3285639167,UA -3285639168,3285641215,FR -3285641216,3285642239,RU -3285642240,3285643263,UA -3285643264,3285645311,FR -3285645312,3285647359,BG -3285647360,3285712895,DK -3285712896,3285721087,GB -3285721088,3285729279,SE -3285729280,3285737471,CH -3285737472,3285745663,PL -3285753856,3285762047,LV -3285762048,3285762559,FR -3285762560,3285763071,RU -3285763072,3285763583,GB -3285763584,3285764095,DE -3285764096,3285764607,RU -3285765120,3285766143,UA -3285766656,3285767679,UA -3285767680,3285768191,FR -3285768192,3285768703,RU -3285768704,3285768959,RO -3285769216,3285769727,DE -3285769728,3285770239,RO -3285770240,3285770495,NL -3285770496,3285770751,US -3285770752,3285771007,UA -3285771008,3285771263,CH -3285771264,3285771519,BG -3285771520,3285771775,AT -3285771776,3285772031,RO -3285772032,3285772287,SE -3285772288,3285772543,TR -3285772544,3285772799,LT -3285773056,3285773311,DE -3285773312,3285773567,LV -3285773568,3285773823,KG -3285774080,3285774335,RO -3285774336,3285774591,CZ -3285774592,3285774847,RU -3285774848,3285775103,FR -3285775104,3285775615,RU -3285775872,3285776127,NL -3285776384,3285776639,UA -3285776640,3285776895,FR -3285776896,3285777151,PL -3285777152,3285777407,HU -3285777408,3285777663,IL -3285777664,3285777919,SI -3285777920,3285778175,PL -3285778176,3285778431,DE -3285778432,3285843967,GB -3285843968,3285852159,LU -3285852160,3285860351,GB -3285860352,3285868543,FI -3285868544,3285876735,IE -3285876736,3285909503,RU -3285910336,3285910399,ES -3285911552,3285912575,GB -3285913648,3285913655,IE -3285913656,3285913703,GB -3285913704,3285913711,FI -3285913712,3285913991,GB -3285914008,3285914015,GB -3285914624,3285914879,GB -3285915904,3285916159,AT -3285916416,3285916671,YE -3285917696,3285917703,GB -3285917712,3285917807,GB -3285917952,3285918463,GB -3285919744,3285921791,QA -3285921792,3285923839,FR -3285924352,3285924415,ES -3285924912,3285924919,CH -3285924920,3285924927,FI -3285924928,3285924943,DE -3285924944,3285924947,IT -3285924948,3285924951,AT -3285924952,3285924955,CH -3285924956,3285924959,PL -3285924960,3285924991,DE -3285924992,3285924995,FR -3285924996,3285924999,CZ -3285925000,3285925007,RU -3285925008,3285925059,DE -3285925060,3285925063,CH -3285925064,3285925071,RU -3285925072,3285925079,PL -3285925080,3285925087,IT -3285925088,3285925103,DE -3285925164,3285925171,CH -3285926432,3285926463,CH -3285926592,3285926623,DE -3285928304,3285928311,GB -3285929216,3285929231,DE -3285930752,3285931007,GB -3285931520,3285931527,HU -3285931528,3285931559,DE -3285931560,3285931567,HU -3285931568,3285931599,DE -3285931600,3285931775,HU -3285935872,3285936127,GB -3285936136,3285936147,FR -3285936152,3285936227,FR -3285939136,3285939175,GB -3285939184,3285939191,GB -3285939744,3285939759,GB -3285939840,3285939967,GB -3285940736,3285940767,IT -3285941248,3285941503,ES -3285943808,3285944063,CH -3285947136,3285947159,NL -3285947168,3285947175,NL -3285949604,3285949607,CH -3285949856,3285949887,ES -3285950208,3285950463,IT -3285951648,3285951679,ES -3285953536,3285953665,GB -3285953672,3285953735,GB -3285953792,3285953919,GB -3285954048,3285954303,AE -3285954560,3285954567,IT -3285954568,3285954575,PL -3285954576,3285954815,GB -3285958144,3285958399,BG -3285961984,3285961995,GB -3285962752,3285963775,DE -3285964800,3285964935,DE -3285964944,3285964991,DE -3285964992,3285965007,HU -3285965056,3285966079,DE -3285968896,3285970943,GB -3285975040,3286013695,FR -3286013696,3286013951,RE -3286013952,3286106111,FR -3286106112,3286114303,EE -3286114304,3286122495,BA -3286122496,3286130687,BY -3286130688,3286131711,RS -3286131712,3286132735,PL -3286132736,3286133759,RO -3286133760,3286134783,IE -3286134784,3286135807,PL -3286135808,3286136831,NL -3286136832,3286137855,AT -3286137856,3286138879,UA -3286138880,3286155263,RU -3286155264,3286171647,DE -3286171648,3286237183,IT -3286237184,3286302719,GB -3286302720,3286310911,NO -3286310912,3286311423,CH -3286311424,3286311935,NL -3286311936,3286312447,PL -3286312448,3286312959,RU -3286312960,3286313983,RO -3286313984,3286314495,CH -3286314496,3286315007,IL -3286315008,3286315519,UA -3286315520,3286315775,SI -3286315776,3286316031,BG -3286316032,3286316543,UA -3286316544,3286317055,NL -3286317056,3286317567,RU -3286317568,3286318079,RO -3286318080,3286318591,CH -3286320128,3286321151,PL -3286321152,3286322175,CZ -3286322176,3286323199,PL -3286323200,3286324223,GB -3286324224,3286325247,RO -3286325248,3286326271,DK -3286326272,3286327295,PL -3286327296,3286329343,NL -3286329344,3286330367,DE -3286330368,3286331391,RU -3286331392,3286332415,UA -3286332416,3286333439,CH -3286333440,3286334463,PL -3286334464,3286335487,BG -3286335488,3286336511,RU -3286336512,3286337535,DE -3286337536,3286338559,PL -3286338560,3286339583,RO -3286339584,3286340607,UA -3286340608,3286342655,DE -3286342656,3286343679,UA -3286343680,3286344703,RU -3286344704,3286345727,BE -3286345728,3286346751,IT -3286346752,3286347775,UA -3286347776,3286348799,PA -3286349824,3286350847,SE -3286350848,3286351871,GB -3286351872,3286352895,CH -3286352896,3286353919,DE -3286353920,3286354943,LI -3286354944,3286355967,FR -3286355968,3286356991,DE -3286356992,3286358015,PL -3286358016,3286359039,GB -3286360064,3286361087,IT -3286361088,3286362111,UA -3286362112,3286363135,RU -3286363136,3286364159,AT -3286364160,3286365183,DE -3286365184,3286367231,PL -3286367232,3286368255,BG -3286368256,3286376447,CH -3286376448,3286384639,GB -3286384640,3286401023,DE -3286401024,3286407167,GB -3286407168,3286408191,GG -3286408192,3286409215,GB -3286409216,3286417407,DE -3286417408,3286417663,UA -3286417664,3286417919,IT -3286417920,3286418175,DE -3286418176,3286418431,AT -3286418432,3286418687,TR -3286418944,3286419199,PL -3286419200,3286419455,DK -3286419456,3286419711,DE -3286419712,3286419967,GB -3286419968,3286420223,FI -3286420224,3286420735,RU -3286420736,3286420991,NL -3286420992,3286421247,RO -3286421248,3286421503,PL -3286421504,3286421759,KZ -3286421760,3286422015,RU -3286422016,3286422271,MD -3286422272,3286422527,FR -3286422528,3286422783,RO -3286422784,3286423039,UA -3286423040,3286423295,RO -3286423552,3286423807,RU -3286423808,3286424063,CZ -3286424064,3286424319,LV -3286424320,3286424575,FR -3286424832,3286425087,TR -3286425088,3286425343,RU -3286425344,3286425599,IT -3286425600,3286433791,KW -3286433792,3286499327,DE -3286499328,3286499583,HU -3286499584,3286499839,BG -3286499840,3286502143,HU -3286502144,3286502399,BG -3286502400,3286510335,HU -3286510336,3286510591,BG -3286510592,3286514431,HU -3286514432,3286514687,RO -3286514688,3286552575,HU -3286552576,3286553087,BG -3286553088,3286564863,HU -3286564864,3286566655,AE -3286566656,3286567423,KW -3286567424,3286630399,AE -3286630400,3286638591,BG -3286638592,3286646783,AT -3286646784,3286654975,RU -3286654976,3286655231,UA -3286655488,3286655743,LT -3286655744,3286655999,RU -3286656000,3286656255,CH -3286656256,3286656511,RU -3286656512,3286656767,GR -3286656768,3286657023,UA -3286657024,3286657279,BE -3286657536,3286657791,HU -3286658048,3286658303,DE -3286658304,3286658559,RU -3286658560,3286658815,NL -3286658816,3286659327,RU -3286659328,3286659583,PL -3286659584,3286659839,DE -3286659840,3286660095,UA -3286660096,3286660351,DE -3286660352,3286660607,CH -3286660608,3286660863,GB -3286660864,3286661119,UA -3286661120,3286661375,PL -3286661376,3286661631,SI -3286661632,3286661887,GB -3286661888,3286662143,RU -3286662144,3286662399,SK -3286662400,3286662655,UA -3286662656,3286662911,DE -3286662912,3286671359,UA -3286671360,3286679551,AT -3286679552,3286695935,IT -3286695936,3286761471,DK -3286761472,3286761727,DE -3286761728,3286769663,GB -3286769664,3286769919,DE -3286769920,3286773759,GB -3286773760,3286777855,DE -3286777856,3286781951,FR -3286781952,3286782207,GB -3286782208,3286782463,DE -3286782464,3286782535,GB -3286782536,3286782543,FR -3286782544,3286782575,GB -3286782576,3286782583,DE -3286782584,3286783599,GB -3286783600,3286783615,CH -3286783616,3286783679,DE -3286783680,3286784511,GB -3286784512,3286784767,CH -3286784768,3286785023,DE -3286785024,3286787071,GB -3286787072,3286787327,FR -3286787328,3286787583,DE -3286787584,3286788095,GB -3286788096,3286788351,DE -3286788352,3286788607,FR -3286788608,3286789119,GB -3286789120,3286789631,DE -3286789632,3286790143,FR -3286790144,3286790655,GB -3286790656,3286790911,DE -3286790912,3286791679,GB -3286791680,3286791935,AT -3286791936,3286794239,GB -3286794240,3286888447,DE -3286888448,3286889471,IE -3286889472,3286891007,DE -3286891008,3286891014,HU -3286891015,3286891015,DE -3286891016,3286891263,HU -3286891264,3286892543,DE -3286892544,3286893055,LI -3286893056,3286893567,RU -3286893568,3286894591,UA -3286894592,3286895103,PL -3286895104,3286895615,GB -3286895616,3286896127,DE -3286896128,3286896639,SE -3286896640,3286897151,PL -3286897152,3286897663,AT -3286897664,3286898175,PL -3286898176,3286898687,HR -3286899712,3286900223,DE -3286900224,3286900735,RO -3286900736,3286900991,BE -3286900992,3286901503,DE -3286901504,3286902015,FR -3286902016,3286902527,CH -3286902528,3286902783,GB -3286902784,3286903039,PL -3286903040,3286903551,FR -3286903552,3286903807,CH -3286903808,3286904063,AT -3286904064,3286904319,BE -3286904320,3286904575,FR -3286904576,3286904831,PT -3286904832,3286905087,GB -3286905088,3286905343,GR -3286905344,3286905599,DE -3286905600,3286905855,MT -3286906112,3286906367,BE -3286906368,3286906879,RO -3286906880,3286907135,RU -3286907136,3286907391,SE -3286907392,3286907647,AT -3286907648,3286907903,ES -3286907904,3286908159,CH -3286908160,3286908415,ES -3286908928,3286909951,CH -3286909952,3286913023,UA -3286913024,3286913535,GB -3286914048,3286915071,BG -3286915072,3286916095,FR -3286917120,3286918143,RU -3286918144,3286919167,AT -3286919168,3286920191,DE -3286921216,3286922239,UA -3286922240,3286923263,GB -3286925312,3286925823,DE -3286926080,3286926335,LV -3286926336,3286926591,UA -3286926592,3286926847,DE -3286926848,3286927103,PT -3286927104,3286927359,FI -3286927360,3286927615,DE -3286927616,3286927871,SI -3286927872,3286928127,BG -3286928128,3286928383,DE -3286928640,3286928895,PL -3286928896,3286929151,FI -3286929408,3286929663,LV -3286929664,3286929919,BE -3286929920,3286930175,SE -3286930432,3286930687,UA -3286930688,3286930943,DE -3286930944,3286931199,SE -3286931200,3286931455,AT -3286931456,3286931711,DE -3286931712,3286931967,GB -3286931968,3286932223,FR -3286932224,3286932479,DK -3286932736,3286932991,AT -3286932992,3286933247,IL -3286933504,3286933759,DK -3286934016,3286934271,BE -3286934272,3286934527,CH -3286934528,3286934783,PL -3286934784,3286935039,TR -3286935040,3286935551,ES -3286935552,3286935807,EG -3286936064,3286936319,RU -3286936320,3286936575,IT -3286936576,3286936831,RO -3286936832,3286937087,NL -3286937088,3286937343,UA -3286937344,3286937599,GB -3286937600,3286937855,CH -3286937856,3286938111,RO -3286938112,3286938367,DE -3286938624,3286938879,CH -3286939136,3286939391,RO -3286939392,3286939647,DE -3286939648,3286939903,BE -3286939904,3286940159,EG -3286940160,3286940415,BE -3286940416,3286940671,NL -3286940672,3286940927,RO -3286941184,3286941439,RU -3286941696,3286942719,DE -3286942720,3286943743,FI -3286943744,3286944767,RU -3286944768,3286945791,CZ -3286945792,3286946815,RU -3286946816,3286947839,UA -3286947840,3286948863,DE -3286948864,3286949887,UA -3286949888,3286950911,CH -3286950912,3286951935,DE -3286951936,3286952959,IT -3286952960,3286953983,BG -3286953984,3286955007,GB -3286955008,3286956031,DE -3286956032,3286957055,FR -3286957056,3286958079,EG -3286958080,3287023615,ES -3287023616,3287154687,FI -3287154688,3287162879,BE -3287162880,3287164927,US -3287164928,3287165183,DE -3287165184,3287165439,US -3287165440,3287165695,SA -3287165696,3287165951,US -3287165952,3287166207,SA -3287166208,3287167487,US -3287167488,3287167743,SA -3287167744,3287168767,US -3287168768,3287169279,SA -3287169280,3287169535,US -3287169536,3287169791,SA -3287169792,3287170303,US -3287170304,3287170559,DE -3287170560,3287171071,US -3287171072,3287171583,EE -3287171584,3287172095,PL -3287172608,3287173119,PL -3287173120,3287173631,RU -3287173632,3287174143,NL -3287174144,3287174655,SE -3287175168,3287176191,RO -3287176192,3287176703,BG -3287176704,3287177215,NL -3287177216,3287178239,RO -3287178240,3287178751,UA -3287179264,3287180287,FR -3287180288,3287181311,RU -3287181312,3287182335,UZ -3287182336,3287185407,UA -3287187456,3287196671,DE -3287196672,3287198719,PL -3287198720,3287199743,GB -3287199744,3287201791,UA -3287201792,3287202815,PL -3287202816,3287203839,UA -3287203840,3287212031,FI -3287212032,3287212543,DE -3287212544,3287212799,FR -3287212800,3287213311,PL -3287213312,3287213567,FR -3287213568,3287213823,RU -3287214080,3287214335,GB -3287214336,3287214591,DE -3287214592,3287214847,NO -3287214848,3287215103,IT -3287215104,3287215359,PL -3287215360,3287215615,GB -3287215616,3287215871,DE -3287215872,3287216127,RU -3287216384,3287216639,GB -3287217152,3287217407,NL -3287217408,3287217663,PL -3287217664,3287217919,RU -3287218432,3287218687,GB -3287218688,3287218943,RU -3287218944,3287219199,FR -3287219456,3287219711,CH -3287219712,3287220223,SE -3287220224,3287285759,RU -3287285760,3287416831,NL -3287416832,3287425023,RU -3287425024,3287433215,SE -3287433216,3287433727,PL -3287433728,3287434239,DE -3287434240,3287434751,PL -3287434752,3287435263,GB -3287435264,3287435775,NL -3287436288,3287436799,RS -3287436800,3287437311,RO -3287437312,3287437823,UA -3287437824,3287438335,RU -3287438336,3287438847,CH -3287438848,3287439359,GB -3287439360,3287439871,RO -3287439872,3287440895,PL -3287440896,3287441407,UA -3287441408,3287442431,NL -3287443456,3287443967,DE -3287443968,3287444479,BG -3287444480,3287444991,PL -3287445504,3287446527,UA -3287446528,3287447039,PL -3287447552,3287448063,DK -3287448064,3287448575,GB -3287448576,3287449087,PL -3287449088,3287449599,BG -3287449600,3287450111,PL -3287450112,3287450623,DK -3287450624,3287451135,SE -3287451136,3287451647,PL -3287451648,3287452159,ES -3287452160,3287452671,PL -3287452672,3287453183,CH -3287453184,3287454207,RU -3287454208,3287454719,SE -3287455232,3287455743,UA -3287455744,3287456255,NL -3287456256,3287457279,GB -3287457280,3287457791,RO -3287457792,3287458047,NL -3287458048,3287458303,UA -3287458304,3287458559,DE -3287458560,3287459327,CH -3287459328,3287459583,AT -3287459584,3287459839,DE -3287459840,3287460095,AT -3287460096,3287460351,ME -3287460352,3287460607,CY -3287460608,3287460863,NL -3287460864,3287461119,BE -3287461120,3287461375,DE -3287461376,3287461631,CH -3287461632,3287461887,AT -3287461888,3287462143,PL -3287462656,3287462911,UA -3287462912,3287463167,FR -3287463168,3287463423,IT -3287463680,3287463935,PL -3287463936,3287464191,AT -3287464192,3287464447,SK -3287464448,3287464703,PL -3287464960,3287465215,SA -3287465216,3287465471,SE -3287465472,3287465727,DE -3287465728,3287465983,FR -3287465984,3287467007,DK -3287467008,3287468031,SA -3287468032,3287469055,UA -3287469056,3287470079,DE -3287471360,3287471615,CH -3287472128,3287472639,RU -3287472640,3287473151,UA -3287473152,3287474175,GB -3287474176,3287476223,DE -3287476224,3287477247,PL -3287477248,3287478271,GB -3287479296,3287480319,RO -3287480320,3287481343,LI -3287481344,3287482367,PL -3287482368,3287548415,DE -3287548928,3287549439,UA -3287549440,3287549951,SE -3287549952,3287550463,UA -3287550464,3287550975,DE -3287550976,3287551487,LT -3287552000,3287552511,GB -3287553024,3287553535,FR -3287553536,3287554047,IL -3287554048,3287554559,RU -3287554560,3287555071,PL -3287555072,3287555583,GB -3287555584,3287556095,US -3287556096,3287563007,TR -3287563008,3287563263,US -3287563264,3287564287,TR -3287564288,3287572479,FI -3287572480,3287580671,DE -3287580672,3287588863,LV -3287588864,3287597055,BE -3287597056,3287605247,GI -3287605248,3287630335,DE -3287630336,3287631359,PL -3287631360,3287631871,IR -3287631872,3287632383,RU -3287632384,3287632895,SE -3287632896,3287633407,RU -3287633408,3287633919,SK -3287633920,3287634431,UA -3287634432,3287634943,RO -3287634944,3287635455,PL -3287635456,3287635967,DE -3287636480,3287636991,IE -3287636992,3287637503,AT -3287637504,3287638015,PL -3287639040,3287639551,GB -3287640064,3287640575,PL -3287640576,3287641087,SI -3287642112,3287642623,NL -3287642624,3287643135,BE -3287643136,3287643647,IT -3287643648,3287644671,UA -3287644672,3287645183,NL -3287646208,3287662591,PT -3287662592,3287662847,DE -3287662848,3287663103,DK -3287663104,3287663359,LV -3287663616,3287663871,NL -3287663872,3287664127,PT -3287664128,3287664383,PL -3287664384,3287664639,US -3287664640,3287664895,UA -3287664896,3287665151,GB -3287665152,3287665407,NO -3287665408,3287665919,PL -3287665920,3287666431,RU -3287666688,3287666943,SI -3287666944,3287667199,CZ -3287667200,3287667455,DK -3287667456,3287667711,RU -3287667712,3287667967,ES -3287667968,3287668223,PL -3287668224,3287668479,RU -3287668480,3287668735,UA -3287668736,3287668991,SI -3287668992,3287669247,PL -3287669248,3287669503,LI -3287669760,3287670015,RO -3287670016,3287670271,UA -3287670272,3287670527,PL -3287670528,3287670783,GB -3287670784,3287671039,PL -3287671040,3287671295,AT -3287671296,3287671551,PL -3287671552,3287671807,TR -3287671808,3287672063,CH -3287672320,3287672575,DE -3287672576,3287672831,NL -3287672832,3287673087,RU -3287673088,3287673343,SK -3287673344,3287673599,PT -3287673600,3287673855,GB -3287673856,3287674111,NL -3287674112,3287674367,CH -3287674880,3287675135,SE -3287675648,3287675903,DE -3287675904,3287676159,RU -3287676160,3287676415,DE -3287676672,3287676927,GB -3287676928,3287677183,ES -3287677184,3287677439,RU -3287677440,3287677695,SI -3287677696,3287677951,RO -3287677952,3287678207,GB -3287678208,3287678463,UA -3287678464,3287678719,DE -3287678720,3287678975,HR -3287678976,3287687167,SI -3287687168,3287695359,EG -3287695360,3287703551,CH -3287703552,3287704063,CZ -3287704064,3287704575,NL -3287704576,3287705087,LU -3287705088,3287705599,TJ -3287705600,3287706111,SA -3287706112,3287706623,RU -3287706624,3287707135,GB -3287707648,3287708159,BE -3287708160,3287709183,NL -3287709184,3287709695,RU -3287709696,3287710207,SE -3287710208,3287710719,RU -3287710720,3287711231,UA -3287711232,3287711743,PL -3287711744,3287719935,GB -3287719936,3287728127,DE -3287728128,3287729407,IT -3287729664,3287729919,DK -3287729920,3287730175,HU -3287732224,3287734271,IT -3287734272,3287734527,PL -3287734528,3287734783,UA -3287734784,3287735039,RU -3287735296,3287736319,IT -3287736320,3287736831,PL -3287736832,3287737343,LV -3287737344,3287737855,GB -3287737856,3287738367,FR -3287738368,3287738879,GB -3287738880,3287739391,DE -3287739392,3287739903,NL -3287739904,3287740415,PT -3287740416,3287740927,BG -3287740928,3287741439,RO -3287741440,3287741951,CH -3287742976,3287743487,RO -3287743488,3287743999,DE -3287744512,3287810047,DE -3287810048,3287818239,FR -3287818240,3287826431,AT -3287826432,3287826687,LV -3287826688,3287826943,RO -3287826944,3287827199,RU -3287827200,3287827455,DE -3287827456,3287827711,SI -3287827712,3287827967,RU -3287827968,3287828223,GB -3287828224,3287828479,DE -3287828480,3287828735,PL -3287828736,3287828991,AT -3287828992,3287829247,DE -3287829248,3287829503,GB -3287829504,3287829759,RO -3287829760,3287830015,NL -3287830016,3287830271,NO -3287830272,3287830527,RO -3287830528,3287830783,IE -3287830784,3287831039,GB -3287831040,3287831295,RU -3287831296,3287831551,CH -3287831808,3287832063,AT -3287832064,3287832319,FI -3287832320,3287832575,NL -3287832576,3287832831,PL -3287832832,3287833087,DE -3287833088,3287833343,GB -3287833344,3287833855,CH -3287833856,3287834111,UA -3287834112,3287834367,RU -3287834368,3287834623,HU -3287834624,3287842815,GB -3287842816,3287851007,DE -3287851008,3287859199,UA -3287859200,3287859455,GB -3287859968,3287860479,GB -3287861248,3287862015,GB -3287863808,3287864063,GB -3287866384,3287866439,GB -3287866496,3287866591,GB -3287866608,3287866623,GB -3287867392,3287867903,UA -3287867904,3287868415,PL -3287868416,3287868927,RO -3287868928,3287869439,ES -3287869440,3287869951,RU -3287869952,3287870463,UA -3287870464,3287870975,RU -3287870976,3287871487,NL -3287873024,3287873535,PL -3287873536,3287874047,RU -3287874048,3287874559,FR -3287874560,3287875071,DE -3287875072,3287875583,PL -3287875584,3287941119,DK -3287941120,3287949311,IT -3287949312,3287949567,AT -3287949568,3287949823,IL -3287949824,3287950079,IT -3287950080,3287950335,DE -3287950336,3287950591,UA -3287950592,3287951103,PL -3287951104,3287951359,HU -3287951360,3287951615,FR -3287951616,3287951871,CH -3287951872,3287952127,RU -3287952128,3287952383,UA -3287952384,3287953151,CH -3287953152,3287953407,UA -3287953408,3287953663,DE -3287953664,3287953919,GB -3287953920,3287954175,DE -3287954176,3287954431,RU -3287954432,3287954687,CH -3287954688,3287954943,RO -3287954944,3287955199,PL -3287955456,3287955711,RU -3287955712,3287955967,DE -3287955968,3287956223,SI -3287956224,3287956479,RO -3287956480,3287956735,BG -3287956736,3287956991,SE -3287956992,3287957247,UA -3287957504,3287965695,AM -3287965696,3287973887,RS -3287973888,3287982079,CZ -3287982080,3287990271,EE -3287990272,3287994367,SI -3287994368,3287995391,BA -3287995392,3287996415,SI -3287996416,3287998463,BA -3287998464,3288006655,IT -3288006656,3288072191,GR -3288072192,3288088575,SE -3288088576,3288104959,RS -3288104960,3288159231,DE -3288159232,3288160255,NL -3288160256,3288236031,DE -3288236032,3288236543,LI -3288236544,3288237055,FR -3288237056,3288238591,RO -3288238592,3288239103,PL -3288239104,3288239615,RO -3288240128,3288240639,CH -3288240640,3288241151,FR -3288241152,3288241663,ES -3288241664,3288242175,UA -3288242176,3288242687,RO -3288243200,3288243711,PL -3288243712,3288244735,FR -3288244736,3288245247,DE -3288245248,3288245759,GB -3288245760,3288246271,RO -3288246272,3288246783,DK -3288246784,3288247295,KW -3288247296,3288247807,NO -3288247808,3288248831,PL -3288248832,3288249855,GB -3288249856,3288250367,RO -3288250368,3288250879,PL -3288251392,3288251903,RU -3288251904,3288252415,AT -3288252416,3288260607,NO -3288260608,3288268799,IT -3288268800,3288334335,FI -3288334336,3288399871,UG -3288399872,3288400127,MU -3288400128,3288400383,IN -3288400384,3288400639,PR -3288400640,3288400895,SA -3288400896,3288401151,KE -3288401152,3288401407,RU -3288401408,3288401663,SA -3288401664,3288401919,MU -3288401920,3288403711,ZA -3288403712,3288403967,AO -3288403968,3288406527,ZA -3288406528,3288407039,KE -3288407040,3288408063,NA -3288408064,3288413183,ZA -3288413184,3288414207,TZ -3288414208,3288416255,ZA -3288416256,3288417279,SA -3288417280,3288417535,IN -3288417536,3288418047,KW -3288418048,3288418303,ZA -3288418304,3288418815,US -3288418816,3288423423,ZA -3288423424,3288425727,SN -3288425728,3288426495,ZA -3288426496,3288427263,IN -3288427264,3288427519,BM -3288427520,3288428543,IN -3288428544,3288428799,CU -3288428800,3288429311,IN -3288429312,3288429567,ZA -3288429568,3288430079,KE -3288430080,3288430335,GH -3288430592,3288432639,SC -3288432640,3288433407,ZA -3288433408,3288433919,KE -3288433920,3288434175,NG -3288434176,3288434431,IN -3288434432,3288434687,CU -3288434688,3288434943,JM -3288434944,3288435199,CD -3288435200,3288435711,JM -3288435712,3288435967,US -3288435968,3288436223,PR -3288436224,3288436479,US -3288436480,3288436735,EG -3288436736,3288440831,ZA -3288440832,3288441343,VC -3288441344,3288442879,BB -3288442880,3288443135,KN -3288443136,3288443647,VC -3288443648,3288444927,BB -3288444928,3288449023,NG -3288449024,3288465407,SD -3288465408,3288465919,JM -3288465920,3288466431,ZA -3288466432,3288467455,SY -3288467456,3288469503,BI -3288469504,3288481791,ZA -3288481792,3288482303,ZW -3288482304,3288485631,ZA -3288485632,3288485887,ZW -3288485888,3288489983,MA -3288489984,3288514559,ZA -3288514560,3288522751,EG -3288522752,3288530943,ZA -3288530944,3288532991,JM -3288532992,3288534527,PR -3288534528,3288535039,EG -3288535040,3288539135,CW -3288539136,3288543871,US -3288543872,3288543983,GB -3288543984,3288543986,US -3288543987,3288543987,CH -3288543988,3288544767,US -3288544768,3288545023,MX -3288545024,3288545279,FR -3288545280,3288545535,US -3288545536,3288545791,ZA -3288545792,3288546303,KE -3288547072,3288547327,NG -3288547328,3288547583,GH -3288547584,3288547839,IN -3288547840,3288548095,SA -3288548096,3288549375,AE -3288549376,3288549631,PK -3288549632,3288549887,GD -3288549888,3288553983,DO -3288553984,3288554239,CM -3288554240,3288554495,IR -3288554496,3288555007,ZA -3288555008,3288555263,NA -3288555264,3288555519,JM -3288555520,3288557567,MZ -3288557568,3288557823,JM -3288557824,3288558079,ZA -3288558080,3288558335,DO -3288558336,3288558847,ZA -3288558848,3288559103,MU -3288559104,3288564735,ZA -3288564736,3288568831,TT -3288568832,3288569855,ZA -3288569856,3288570111,CU -3288570112,3288570367,JM -3288570368,3288577023,ZA -3288578048,3288580095,JM -3288580096,3288588287,BB -3288588288,3288608255,ZA -3288608256,3288608264,US -3288608265,3288608265,DE -3288608266,3288614655,US -3288614656,3288616959,ZA -3288616960,3288617215,ZW -3288617216,3288661759,ZA -3288661760,3288662015,LS -3288662016,3288753919,ZA -3288753920,3288754175,NG -3288754176,3288758271,ZA -3288758272,3288758527,EG -3288758528,3288774911,ZA -3288774912,3288775167,EG -3288775168,3288777727,NG -3288777728,3288778239,TZ -3288778240,3288778495,ZA -3288778496,3288778751,MU -3288778752,3288779007,EG -3288779008,3288779263,ZA -3288779264,3288779775,KE -3288779776,3288780799,NG -3288780800,3288782591,ZA -3288782592,3288782847,KE -3288782848,3288783359,NG -3288783872,3288784127,KE -3288784128,3288785407,ZA -3288785408,3288785663,UG -3288785664,3288785919,TZ -3288785920,3288786175,NG -3288786176,3288786431,KE -3288786432,3288787967,ZA -3288787968,3288788223,EG -3288788224,3288792831,ZA -3288792832,3288793087,AO -3288793088,3289002751,ZA -3289002752,3289003007,AO -3289003008,3289004031,ZA -3289004032,3289005055,NG -3289005056,3289005311,TZ -3289005312,3289014527,ZA -3289014528,3289014783,EG -3289014784,3289015295,ZA -3289015296,3289015551,CM -3289015552,3289020159,ZA -3289020160,3289020415,UG -3289020416,3289020671,EG -3289020672,3289020927,ZA -3289020928,3289021439,CI -3289021440,3289024767,ZA -3289024768,3289025023,GH -3289025024,3289025535,UG -3289025536,3289027327,ZA -3289027328,3289027583,TZ -3289027584,3289027839,MZ -3289027840,3289044735,ZA -3289044736,3289044991,GH -3289044992,3289047039,ML -3289047040,3289048063,ZA -3289048064,3289048319,UG -3289048320,3289048831,ZA -3289048832,3289049087,NG -3289049088,3289053951,ZA -3289053952,3289055231,NG -3289055232,3289070591,ZA -3289070592,3289070847,NA -3289070848,3289071103,ZA -3289071104,3289071359,SO -3289071360,3289074431,ZA -3289074432,3289074687,DZ -3289074688,3289075711,ZA -3289075712,3289077759,MW -3289077760,3289078271,KE -3289078272,3289078527,GH -3289078528,3289081855,ZA -3289081856,3289082111,NG -3289082112,3289086975,ZA -3289086976,3289087231,SZ -3289087232,3289089791,ZA -3289089792,3289090047,MZ -3289090048,3289093631,ZA -3289093632,3289094143,NG -3289094144,3289100031,ZA -3289100032,3289100287,LS -3289100288,3289102335,ZA -3289102336,3289103359,NG -3289103360,3289103615,ZA -3289103616,3289103871,AO -3289103872,3289104383,KE -3289104384,3289107967,ZA -3289107968,3289108479,GH -3289108480,3289114367,ZA -3289114368,3289114623,NG -3289114624,3289115135,ZA -3289115136,3289115391,AO -3289115392,3289120511,ZA -3289120512,3289120767,TZ -3289120768,3289123327,PR -3289123328,3289123583,NA -3289123584,3289123839,EG -3289123840,3289124863,ZM -3289124864,3289128959,ZA -3289128960,3289137151,IN -3289137152,3289153535,BM -3289153536,3289156607,MU -3289156608,3289158655,RW -3289158656,3289161727,MU -3289161728,3289169919,PR -3289169920,3289186303,MA -3289186304,3289186559,NG -3289186560,3289212159,ZA -3289212160,3289212415,MZ -3289212416,3289212927,NG -3289212928,3289213183,ZM -3289213184,3289213439,TZ -3289213440,3289213951,ZA -3289213952,3289214207,MA -3289214208,3289214463,AO -3289214464,3289214719,CD -3289214720,3289215231,NG -3289215232,3289217279,ZA -3289217280,3289217535,KE -3289217536,3289217791,UG -3289217792,3289218047,GH -3289218048,3289218303,ZA -3289218304,3289218559,MU -3289218560,3289220351,ZA -3289220352,3289220607,TZ -3289220608,3289221119,ZA -3289221120,3289221631,KE -3289221632,3289227519,ZA -3289227520,3289227775,NG -3289227776,3289229311,ZA -3289229312,3289229567,SZ -3289229568,3289230591,ZA -3289230592,3289230847,KE -3289230848,3289231359,GH -3289231360,3289233919,ZA -3289233920,3289234175,TZ -3289234176,3289235455,ZA -3289235456,3289237503,GH -3289237504,3289238015,ZA -3289238016,3289238271,KE -3289238272,3289238527,UG -3289238528,3289238783,AO -3289238784,3289239039,ZA -3289239040,3289239295,EG -3289239296,3289239551,BF -3289239552,3289239807,SC -3289239808,3289240063,KE -3289240064,3289243391,ZA -3289243392,3289243647,BI -3289243648,3289248255,ZA -3289248256,3289248511,NG -3289248512,3289248767,AO -3289248768,3289249023,EG -3289249024,3289249279,NG -3289249280,3289250815,ZA -3289250816,3289251071,GH -3289251072,3289251327,EG -3289251328,3289251583,ZA -3289251584,3289251839,KE -3289251840,3289319423,ZA -3289319424,3289319679,MU -3289319680,3289319935,ZA -3289319936,3289320447,MU -3289320448,3289321471,ZA -3289321472,3289325567,IN -3289325568,3289333759,SA -3289333760,3289382911,ZA -3289382912,3289387007,NL -3289387008,3289399295,US -3289399296,3289400319,SC -3289400320,3289401343,US -3289401344,3289402367,SC -3289402368,3289403391,US -3289403392,3289404415,SC -3289404416,3289405439,US -3289405440,3289406463,SC -3289406464,3289409535,US -3289409536,3289410047,BE -3289410048,3289410559,CH -3289410560,3289411583,US -3289411584,3289412607,NL -3289412608,3289413631,US -3289413632,3289414655,GB -3289414656,3289415679,US -3289415680,3289424895,SC -3289424896,3289430015,US -3289430016,3289431039,GB -3289431040,3289434111,US -3289434112,3289434367,GB -3289434368,3289435135,SC -3289435136,3289436159,US -3289436160,3289437183,AU -3289437184,3289438207,SC -3289438208,3289439231,AU -3289439232,3289439487,DE -3289439488,3289439743,GB -3289439744,3289439999,US -3289440000,3289440255,SC -3289440256,3289440511,ZA -3289440512,3289441023,US -3289441024,3289441279,ZA -3289441280,3289441535,US -3289441536,3289441791,ZA -3289441792,3289442047,US -3289442048,3289442303,ZA -3289442304,3289445375,US -3289445376,3289445631,DE -3289445632,3289445887,US -3289445888,3289446143,ZA -3289446144,3289446399,US -3289446400,3289446655,ZA -3289446656,3289446911,US -3289446912,3289447167,ZA -3289447168,3289447423,US -3289447424,3289448447,ZA -3289448448,3289465855,US -3289465856,3289466879,SC -3289466880,3289467903,US -3289467904,3289468927,SC -3289468928,3289469951,US -3289469952,3289470975,SC -3289470976,3289471999,US -3289472000,3289472511,SC -3289472512,3289472767,NL -3289472768,3289473023,GB -3289473024,3289475071,US -3289475072,3289475583,HU -3289475584,3289475839,GB -3289475840,3289476095,SC -3289476096,3289477119,US -3289477120,3289478143,GB -3289478144,3289481215,US -3289481216,3289490431,SC -3289490432,3289491455,US -3289491456,3289492479,GB -3289492480,3289493503,US -3289493504,3289494527,GB -3289494528,3289495551,US -3289495552,3289496575,GB -3289496576,3289499647,US -3289499648,3289499903,GB -3289499904,3289500671,SC -3289500672,3289501695,US -3289501696,3289502719,AU -3289502720,3289503743,SC -3289503744,3289504767,AU -3289504768,3289505535,SC -3289505536,3289505791,DE -3289505792,3289506047,US -3289506048,3289507839,SC -3289507840,3289517055,US -3289517056,3289518079,DE -3289518080,3289530367,US -3289530368,3289538559,NL -3289538560,3289540607,US -3289540608,3289541119,ES -3289541120,3289541631,AU -3289541632,3289542655,US -3289542656,3289543679,GB -3289543680,3289544703,US -3289544704,3289545727,AU -3289545728,3289546751,US -3289546752,3289550847,SC -3289550848,3289553919,US -3289553920,3289554943,GB -3289554944,3289555967,US -3289555968,3289556991,GB -3289556992,3289558015,US -3289558016,3289558527,ID -3289558528,3289558783,GB -3289558784,3289559039,NL -3289559040,3289560063,US -3289560064,3289561087,SC -3289561088,3289562111,US -3289562112,3289563135,SC -3289563136,3289565183,US -3289565184,3289565439,GB -3289565440,3289566207,SC -3289566208,3289567231,US -3289567232,3289568255,AU -3289568256,3289569023,SC -3289569024,3289569279,GB -3289569280,3289571327,AU -3289571328,3289571583,US -3289571584,3289571839,SC -3289571840,3289572095,US -3289572096,3289572351,DE -3289572352,3289572607,US -3289572608,3289572863,SC -3289572864,3289581567,US -3289581568,3289582591,DE -3289582592,3289595903,US -3289595904,3289604095,NL -3289604096,3289606143,US -3289606144,3289606655,AT -3289606656,3289607167,HK -3289607168,3289630719,US -3289630720,3289630975,GB -3289630976,3289631743,SC -3289631744,3289632767,US -3289632768,3289633791,AU -3289633792,3289634815,US -3289634816,3289636863,SC -3289636864,3289637887,CN -3289637888,3289638911,AU -3289638912,3289639935,SC -3289639936,3289640191,AU -3289640192,3289640447,GB -3289640448,3289640959,IE -3289640960,3289641727,SC -3289641728,3289641983,DE -3289641984,3289642239,SC -3289642240,3289642495,US -3289642496,3289644031,SC -3289644032,3289645055,US -3289645056,3289653247,NA -3289653248,3289661439,EG -3289661440,3289677823,DZ -3289677824,3289710591,MU -3289710592,3289777407,ZA -3289777408,3289777663,EG -3289777664,3289777919,NG -3289777920,3289778175,EG -3289779200,3289780223,GW -3289780224,3289788415,ZA -3289788416,3289792511,MZ -3289792512,3289809407,ZA -3289809408,3289809663,EG -3289809664,3289809919,KE -3289809920,3289812991,ZA -3289812992,3289817087,MU -3289817088,3289907199,ZA -3289907200,3289908223,LS -3289908224,3289923583,ZA -3289923584,3289924607,SZ -3289924608,3290031103,ZA -3290031104,3290031359,LS -3290031360,3290060287,ZA -3290060288,3290060543,SZ -3290060544,3290103807,ZA -3290103808,3290110335,CA -3290110336,3290110367,US -3290110368,3290120191,CA -3290120192,3290128383,MU -3290128384,3290136575,ZW -3290136576,3290169343,NG -3290169344,3290171135,ZA -3290171136,3290171391,SZ -3290171392,3290171903,ZA -3290171904,3290172159,NG -3290172160,3290172415,KE -3290172416,3290181631,ZA -3290181632,3290181887,US -3290181888,3290182399,PR -3290182400,3290182655,US -3290182656,3290183423,PR -3290183424,3290183679,US -3290183680,3290184959,PR -3290184960,3290185215,US -3290185216,3290185727,PR -3290185728,3290226687,ZA -3290226688,3290230783,MZ -3290230784,3290234879,BF -3290234880,3290243071,ZA -3290243072,3290245119,ZW -3290245120,3290246143,DZ -3290246144,3290247167,NG -3290247168,3290249215,TZ -3290249216,3290251263,ZA -3290251264,3290259455,TT -3290259456,3290267647,GH -3290267648,3290275839,ZA -3290275840,3290284031,SD -3290284032,3290288127,AO -3290292224,3290296319,GH -3290296320,3290423295,ZA -3290423296,3290427391,NA -3290427392,3290431487,ZA -3290431488,3290433535,JM -3290433536,3290435583,ZA -3290435584,3290439679,DZ -3290439680,3290447871,TT -3290447872,3290456063,AR -3290456064,3290460159,ZA -3290460160,3290464255,ML -3290464256,3290472447,PR -3290480640,3290482687,AO -3290482688,3290484735,CF -3290484736,3290486783,ZA -3290486784,3290488831,MA -3290488832,3290489343,NG -3290489344,3290489855,KE -3290489856,3290490367,EG -3290490368,3290492927,ZA -3290492928,3290494975,TZ -3290494976,3290718975,ZA -3290718976,3290719231,SZ -3290719232,3290955775,ZA -3290955776,3290980351,CR -3290980352,3290984447,ZA -3290984448,3290988543,MZ -3290988544,3290992639,KE -3290992640,3290996735,GH -3290996736,3291000831,NG -3291000832,3291004927,ZA -3291004928,3291021311,NG -3291021312,3291029503,ZA -3291029504,3291037695,TZ -3291037696,3291038463,ZA -3291038464,3291038719,CD -3291038720,3291038975,KE -3291038976,3291039231,NG -3291039232,3291039487,ZA -3291039488,3291039743,BF -3291039744,3291039999,ZA -3291040000,3291040255,EG -3291040256,3291040511,ZM -3291040512,3291040767,CI -3291040768,3291041023,TZ -3291041024,3291041279,AO -3291041280,3291041535,ZA -3291041536,3291041791,TD -3291041792,3291042047,NG -3291042048,3291042303,ZA -3291042304,3291042559,AO -3291042560,3291042815,EG -3291042816,3291043071,NG -3291043072,3291043327,ZA -3291043328,3291043583,TZ -3291043584,3291043839,KE -3291043840,3291044095,ZW -3291044096,3291044351,KE -3291044352,3291044607,GN -3291044608,3291044863,KE -3291044864,3291045119,AO -3291045120,3291045375,KE -3291045376,3291045631,NG -3291045632,3291045887,TN -3291045888,3291078655,ZA -3291078656,3291086847,DZ -3291086848,3291103231,PR -3291103232,3291119615,ZA -3291119616,3291148287,BG -3291148288,3291168767,ZA -3291168768,3291176959,TZ -3291176960,3291185151,ZW -3291185152,3291201535,UG -3291201536,3291201791,KE -3291201792,3291202047,ZM -3291202048,3291202303,GH -3291202304,3291202559,ZA -3291202560,3291202815,GH -3291202816,3291203071,AO -3291203072,3291203327,EG -3291203328,3291203583,ZW -3291203584,3291203839,ZA -3291203840,3291204095,EG -3291204096,3291204351,KE -3291204352,3291204863,ZA -3291204864,3291205119,KE -3291205120,3291205631,GH -3291205632,3291206143,ZA -3291206144,3291206399,AO -3291206400,3291206911,KE -3291206912,3291207167,ZA -3291207168,3291207423,MG -3291207424,3291207679,NG -3291207680,3291207935,BW -3291207936,3291208447,KE -3291208448,3291208703,EG -3291208704,3291208959,KE -3291208960,3291209215,TZ -3291209216,3291209471,KE -3291209472,3291209727,AO -3291209728,3291209983,NG -3291209984,3291210239,GH -3291210240,3291210495,UG -3291210496,3291210751,ZA -3291210752,3291211007,KE -3291211008,3291211263,SL -3291211264,3291211519,TZ -3291211520,3291211775,ZA -3291211776,3291212287,NG -3291212288,3291212543,MZ -3291212544,3291212799,NG -3291212800,3291213055,MA -3291213056,3291213311,EG -3291213312,3291213567,NG -3291213568,3291213823,KE -3291213824,3291214079,CG -3291214080,3291214335,MZ -3291214336,3291214591,GH -3291214592,3291214847,ZA -3291214848,3291215103,NG -3291215104,3291215615,KE -3291215616,3291215871,BF -3291215872,3291216127,KE -3291216128,3291216383,LS -3291216384,3291216639,ZA -3291216640,3291217151,NG -3291217152,3291217407,ZA -3291217408,3291217919,TZ -3291217920,3291242495,ZA -3291242496,3291250687,GH -3291250688,3291258879,NA -3291258880,3291262975,TZ -3291262976,3291267071,ZW -3291267072,3291279359,ZA -3291279360,3291283455,RW -3291287552,3291291647,ZA -3291291648,3291295743,TZ -3291295744,3291299839,NG -3291299840,3291312127,ZA -3291312128,3291313151,MU -3291313152,3291314175,NG -3291314176,3291315199,ZA -3291315200,3291316223,UG -3291316224,3291324415,TZ -3291324416,3291325439,AO -3291325440,3291326463,BW -3291326464,3291330559,ZA -3291330560,3291331583,TZ -3291331584,3291332607,MW -3291332608,3291348991,ZA -3291348992,3291353087,MZ -3291353088,3291353343,KE -3291353344,3291353599,EG -3291353600,3291354111,ZM -3291354112,3291354367,NG -3291354368,3291354623,AO -3291354624,3291354879,EG -3291354880,3291355135,ZA -3291355136,3291355391,EG -3291355392,3291355647,ZA -3291355648,3291355903,EG -3291355904,3291356159,NG -3291356160,3291356415,NA -3291356416,3291356671,EG -3291356672,3291357183,ZA -3291357184,3291365375,MU -3291365376,3291367423,ZA -3291367424,3291369471,AO -3291369472,3291373567,GH -3291373568,3291377663,TZ -3291377664,3291378687,CD -3291378688,3291379711,ZA -3291379712,3291380735,TZ -3291380736,3291381759,ZM -3291381760,3291383807,TZ -3291383808,3291385855,ZA -3291385856,3291386879,NG -3291386880,3291387903,SC -3291387904,3291388927,BJ -3291388928,3291389343,GA -3291389344,3291389347,CG -3291389348,3291389951,GA -3291389952,3291397119,ZA -3291397120,3291398143,EG -3291398144,3291406335,ZM -3291406336,3291408383,ZA -3291408384,3291410431,GM -3291410432,3291412479,NG -3291412480,3291414527,DZ -3291414528,3291426815,ZA -3291426816,3291430911,NA -3291430912,3291432703,ZA -3291432704,3291432959,NA -3291432960,3291435263,ZA -3291435264,3291437823,NA -3291437824,3291438079,ZA -3291438080,3291438847,NA -3291438848,3291439103,ZA -3291439104,3291447295,NG -3291447296,3291463679,CI -3291463680,3291480063,ZA -3291480064,3291545599,SC -3291545600,3291546367,MU -3291546368,3291546623,BI -3291546624,3291546879,SZ -3291546880,3291550207,MU -3291550208,3291550463,MR -3291550464,3291553279,MU -3291553280,3291553535,NG -3291553536,3291611135,MU -3291611136,3291611647,ZA -3291611648,3291611903,MU -3291611904,3291612159,ZA -3291612160,3291613183,NG -3291613184,3291615231,SN -3291615232,3291616255,ML -3291616256,3291616511,TZ -3291616512,3291616767,KE -3291616768,3291617279,EG -3291617280,3291619327,GH -3291619328,3291627519,GA -3291627520,3291643903,ZA -3291643904,3291660287,MZ -3291660288,3291742207,ZA -3291742208,3291742464,US -3291742465,3291742591,GB -3291742592,3291742719,IE -3291742720,3291744767,US -3291744768,3291745023,MX -3291745024,3291745791,US -3291745792,3291746047,MX -3291746048,3291750399,US -3291750400,3291750655,IT -3291750656,3291750911,US -3291750912,3291751167,SG -3291751168,3291751423,US -3291751424,3291751679,SG -3291751680,3291751935,US -3291751936,3291752191,HK -3291752192,3291752447,US -3291752448,3291752959,CA -3291752960,3291753471,US -3291753472,3291753727,GB -3291753728,3291753983,KH -3291753984,3291754239,JP -3291754240,3291754495,US -3291754496,3291754751,AU -3291754752,3291755007,GB -3291755008,3291755263,AU -3291755264,3291755519,US -3291755520,3291755775,AU -3291755776,3291756031,US -3291756032,3291756287,AU -3291756288,3291756543,US -3291756544,3291756799,AU -3291756800,3291757311,US -3291757312,3291757567,GB -3291757568,3291757823,AU -3291757824,3291758079,US -3291758080,3291758335,GB -3291758336,3291760639,US -3291760640,3291760895,AU -3291760896,3291762175,US -3291762176,3291762431,GB -3291762432,3291762687,AU -3291762688,3291763199,US -3291763200,3291763455,GB -3291763456,3291763711,US -3291763712,3291763967,GB -3291763968,3291766015,US -3291766016,3291766271,NL -3291766272,3291766527,AU -3291766528,3291766783,US -3291766784,3291767039,AU -3291767040,3291813375,US -3291813376,3291813631,GB -3291813632,3291813887,US -3291813888,3291814143,GB -3291814144,3291815423,US -3291815424,3291815679,GB -3291815680,3291817471,US -3291817472,3291817983,NL -3291817984,3291819263,US -3291819264,3291819775,NL -3291819776,3291821055,US -3291821056,3291821567,NL -3291821568,3291822847,US -3291822848,3291823103,CH -3291823104,3291823359,DE -3291823360,3291824127,US -3291824128,3291824639,GB -3291824640,3291824895,US -3291824896,3291824896,MX -3291824897,3291826175,US -3291826176,3291826431,CA -3291826432,3291827199,US -3291827200,3291827455,CA -3291827456,3291828735,US -3291828736,3291829247,CA -3291829248,3291830271,US -3291830272,3291832319,KH -3291832320,3291835391,US -3291835392,3291836415,DE -3291836416,3291878655,US -3291878656,3291878911,GB -3291878912,3291879935,US -3291879936,3291880191,AU -3291880192,3291880447,US -3291880448,3291880703,DE -3291880704,3291883775,US -3291883776,3291884031,CA -3291884032,3291884287,US -3291884288,3291884543,NZ -3291884544,3291886335,US -3291886336,3291886591,CA -3291886592,3291887103,US -3291887104,3291887359,GB -3291887360,3291887615,FR -3291887616,3291888127,US -3291888128,3291888383,NZ -3291888384,3291888895,US -3291888896,3291889151,FR -3291889152,3291891455,US -3291891456,3291891711,GB -3291891712,3291893759,US -3291893760,3291894015,CA -3291894016,3291906047,US -3291906048,3291907071,LK -3291907072,3291939063,US -3291939064,3291939064,GB -3291939065,3291939327,US -3291939328,3291939583,IN -3291939584,3291943423,US -3291943424,3291943679,FR -3291943680,3291943935,US -3291943936,3291944959,MX -3291944960,3291945727,US -3291945728,3291945983,GB -3291945984,3291965439,US -3291965440,3291966463,NZ -3291966464,3291971583,US -3291971584,3291972607,JP -3291972608,3292004351,US -3292004352,3292004607,SE -3292004608,3292004863,DK -3292004864,3292005375,US -3292005376,3292005631,CZ -3292005632,3292005887,SC -3292005888,3292006655,US -3292006656,3292006911,SC -3292006912,3292007423,US -3292007424,3292007679,SC -3292007680,3292008191,US -3292008192,3292008447,SC -3292008448,3292009727,US -3292009728,3292009983,SC -3292009984,3292011519,US -3292011520,3292011775,SC -3292011776,3292013055,US -3292013056,3292013311,SC -3292013312,3292013823,US -3292013824,3292014079,SC -3292014080,3292014335,US -3292014336,3292014591,SC -3292014592,3292016127,US -3292016128,3292016383,SC -3292016384,3292018175,US -3292018176,3292018687,SC -3292018688,3292019199,US -3292019200,3292019455,SC -3292019456,3292019711,US -3292019712,3292019967,SC -3292019968,3292020479,US -3292020480,3292020735,SC -3292020736,3292021247,US -3292021248,3292021503,SC -3292021504,3292021759,US -3292021760,3292022271,SC -3292022272,3292023039,US -3292023040,3292023551,SC -3292023552,3292024831,US -3292024832,3292025343,SC -3292025344,3292027647,US -3292027648,3292027903,SC -3292027904,3292028415,US -3292028416,3292028671,SC -3292028672,3292030463,US -3292030464,3292030719,SC -3292030720,3292031487,US -3292031488,3292032511,SC -3292032512,3292033791,US -3292033792,3292034047,SC -3292034048,3292034559,US -3292034560,3292034815,SC -3292034816,3292035071,US -3292035072,3292035327,SC -3292035328,3292035839,US -3292035840,3292036095,SC -3292036096,3292036607,US -3292036608,3292036863,SC -3292036864,3292040959,US -3292040960,3292041471,SC -3292041472,3292043007,US -3292043008,3292043263,SC -3292043264,3292044543,US -3292044544,3292045055,SC -3292045056,3292045311,US -3292045312,3292045567,SC -3292045568,3292047615,US -3292047616,3292047871,SC -3292047872,3292048383,US -3292048384,3292049151,SC -3292049152,3292049663,US -3292049664,3292049919,SC -3292049920,3292051711,US -3292051712,3292051967,SC -3292051968,3292053503,US -3292053504,3292053759,SC -3292053760,3292054015,US -3292054016,3292054527,SC -3292054528,3292055807,US -3292055808,3292056063,SC -3292056064,3292056575,US -3292056576,3292056831,SC -3292056832,3292057087,US -3292057088,3292057855,SC -3292057856,3292058879,US -3292058880,3292059135,SC -3292059136,3292059391,US -3292059392,3292059647,SC -3292059648,3292060415,US -3292060416,3292060671,SC -3292060672,3292061439,US -3292061440,3292061695,SC -3292061696,3292062975,US -3292062976,3292063231,SC -3292063232,3292063487,US -3292063488,3292063743,SC -3292063744,3292063999,US -3292064000,3292064255,SC -3292064256,3292064511,US -3292064512,3292064767,SC -3292064768,3292065791,US -3292065792,3292066047,SC -3292066048,3292066559,US -3292066560,3292066815,SC -3292066816,3292067327,US -3292067328,3292067839,SC -3292067840,3292068607,US -3292068608,3292068863,SC -3292068864,3292069375,US -3292069376,3292069631,DE -3292069632,3292069887,SC -3292069888,3292070143,SE -3292070144,3292070399,DK -3292070400,3292070655,US -3292070656,3292070911,SC -3292070912,3292071167,CZ -3292071168,3292071423,SC -3292071424,3292071935,US -3292071936,3292072191,SC -3292072192,3292073215,US -3292073216,3292073471,SC -3292073472,3292073983,US -3292073984,3292074495,SC -3292074496,3292075263,US -3292075264,3292075775,SC -3292075776,3292076287,US -3292076288,3292076543,SC -3292076544,3292078591,US -3292078592,3292079103,SC -3292079104,3292079359,US -3292079360,3292079615,SC -3292079616,3292080127,US -3292080128,3292080383,SC -3292080384,3292081151,US -3292081152,3292081407,SC -3292081408,3292082431,US -3292082432,3292082687,SC -3292082688,3292084735,US -3292084736,3292084991,SC -3292084992,3292085247,US -3292085248,3292085503,SC -3292085504,3292085759,US -3292085760,3292086015,SC -3292086016,3292088063,US -3292088064,3292088319,SC -3292088320,3292089087,US -3292089088,3292089343,SC -3292089344,3292091903,US -3292091904,3292092159,SC -3292092160,3292093439,US -3292093440,3292093951,SC -3292093952,3292095231,US -3292095232,3292095487,SC -3292095488,3292097023,US -3292097024,3292097535,SC -3292097536,3292098047,US -3292098048,3292098303,SC -3292098304,3292098559,US -3292098560,3292098815,SC -3292098816,3292099327,US -3292099328,3292099583,SC -3292099584,3292100095,US -3292100096,3292100351,SC -3292100352,3292102143,US -3292102144,3292102399,SC -3292102400,3292102911,US -3292102912,3292103167,SC -3292103168,3292103423,US -3292103424,3292103679,SC -3292103680,3292104447,US -3292104448,3292104703,SC -3292104704,3292104959,US -3292104960,3292105471,SC -3292105472,3292105983,US -3292105984,3292106239,SC -3292106240,3292106495,US -3292106496,3292107007,SC -3292107008,3292107519,US -3292107520,3292108543,SC -3292108544,3292108799,US -3292108800,3292109055,SC -3292109056,3292109567,US -3292109568,3292109823,SC -3292109824,3292110079,US -3292110080,3292110591,SC -3292110592,3292111615,US -3292111616,3292111871,SC -3292111872,3292112127,US -3292112128,3292112383,SC -3292112384,3292112895,US -3292112896,3292113151,SC -3292113152,3292113919,US -3292113920,3292114175,SC -3292114176,3292114431,US -3292114432,3292114687,SC -3292114688,3292115967,US -3292115968,3292116223,SC -3292116224,3292116735,US -3292116736,3292116991,SC -3292116992,3292117247,US -3292117248,3292117503,SC -3292117504,3292117759,US -3292117760,3292118015,SC -3292118016,3292119039,US -3292119040,3292119295,SC -3292119296,3292119551,US -3292119552,3292120063,SC -3292120064,3292120575,US -3292120576,3292121087,SC -3292121088,3292121599,US -3292121600,3292122111,SC -3292122112,3292123903,US -3292123904,3292124159,SC -3292124160,3292124927,US -3292124928,3292125183,SC -3292125184,3292125439,US -3292125440,3292125951,SC -3292125952,3292127231,US -3292127232,3292127487,SC -3292127488,3292128767,US -3292128768,3292129023,SC -3292129024,3292129791,US -3292129792,3292130303,SC -3292130304,3292131327,US -3292131328,3292132095,SC -3292132096,3292133887,US -3292133888,3292134143,SC -3292134144,3292134399,US -3292134400,3292134911,SC -3292134912,3292135167,DE -3292135168,3292135423,AU -3292135424,3292135679,SE -3292135680,3292135935,DK -3292135936,3292136191,US -3292136192,3292136447,SC -3292136448,3292136703,CZ -3292136704,3292136959,SC -3292136960,3292137215,US -3292137216,3292137471,SC -3292137472,3292137727,US -3292137728,3292138239,SC -3292138240,3292138495,US -3292138496,3292138751,SC -3292138752,3292139519,US -3292139520,3292139775,SC -3292139776,3292140031,US -3292140032,3292140287,SC -3292140288,3292140799,US -3292140800,3292141055,SC -3292141056,3292141567,US -3292141568,3292142079,SC -3292142080,3292142591,US -3292142592,3292142847,SC -3292142848,3292143103,US -3292143104,3292143359,SC -3292143360,3292143871,US -3292143872,3292144127,SC -3292144128,3292146431,US -3292146432,3292146687,SC -3292146688,3292146943,US -3292146944,3292147455,SC -3292147456,3292147967,US -3292147968,3292148479,SC -3292148480,3292149503,US -3292149504,3292149759,SC -3292149760,3292150271,US -3292150272,3292150527,SC -3292150528,3292152063,US -3292152064,3292152319,SC -3292152320,3292153343,US -3292153344,3292153855,SC -3292153856,3292154111,US -3292154112,3292154623,SC -3292154624,3292157439,US -3292157440,3292157695,SC -3292157696,3292157951,US -3292157952,3292158463,SC -3292158464,3292159999,US -3292160000,3292160511,SC -3292160512,3292161791,US -3292161792,3292162047,SC -3292162048,3292162559,US -3292162560,3292163071,SC -3292163072,3292163327,US -3292163328,3292163583,SC -3292163584,3292165887,US -3292165888,3292166143,SC -3292166144,3292167935,US -3292167936,3292168191,SC -3292168192,3292168703,US -3292168704,3292169727,SC -3292169728,3292171775,US -3292171776,3292172287,SC -3292172288,3292173055,US -3292173056,3292173567,SC -3292173568,3292174335,US -3292174336,3292174591,SC -3292174592,3292175103,US -3292175104,3292175359,SC -3292175360,3292176383,US -3292176384,3292176639,SC -3292176640,3292177151,US -3292177152,3292177407,SC -3292177408,3292178175,US -3292178176,3292178687,SC -3292178688,3292178943,US -3292178944,3292179199,SC -3292179200,3292179711,US -3292179712,3292179967,SC -3292179968,3292180479,US -3292180480,3292180735,SC -3292180736,3292180991,US -3292180992,3292181503,SC -3292181504,3292183039,US -3292183040,3292183551,SC -3292183552,3292184575,US -3292184576,3292184831,SC -3292184832,3292185599,US -3292185600,3292186111,SC -3292186112,3292186367,US -3292186368,3292186879,SC -3292186880,3292187391,US -3292187392,3292187903,SC -3292187904,3292188159,US -3292188160,3292188671,SC -3292188672,3292190975,US -3292190976,3292191231,SC -3292191232,3292193791,US -3292193792,3292194047,SC -3292194048,3292195839,US -3292195840,3292196607,SC -3292196608,3292197119,US -3292197120,3292197375,SC -3292197376,3292198399,US -3292198400,3292198655,SC -3292198656,3292199935,US -3292199936,3292200191,SC -3292200192,3292200447,US -3292200448,3292200703,SC -3292200704,3292200959,AU -3292200960,3292201215,SE -3292201216,3292201471,DK -3292201472,3292201983,US -3292201984,3292202239,CZ -3292202240,3292203007,US -3292203008,3292203519,SC -3292203520,3292204031,US -3292204032,3292204287,SC -3292204288,3292206335,US -3292206336,3292206847,SC -3292206848,3292209151,US -3292209152,3292209407,SC -3292209408,3292209663,US -3292209664,3292209919,SC -3292209920,3292210175,US -3292210176,3292210431,SC -3292210432,3292212479,US -3292212480,3292212735,SC -3292212736,3292213247,US -3292213248,3292213503,SC -3292213504,3292213759,US -3292213760,3292214015,SC -3292214016,3292214783,US -3292214784,3292215039,SC -3292215040,3292215295,US -3292215296,3292215807,SC -3292215808,3292216319,US -3292216320,3292216831,SC -3292216832,3292219391,US -3292219392,3292219647,SC -3292219648,3292220671,US -3292220672,3292221439,SC -3292221440,3292221695,US -3292221696,3292221951,SC -3292221952,3292223743,US -3292223744,3292223999,SC -3292224000,3292227071,US -3292227072,3292227327,SC -3292227328,3292229887,US -3292229888,3292230143,SC -3292230144,3292231935,US -3292231936,3292232191,SC -3292232192,3292233215,US -3292233216,3292233727,SC -3292233728,3292234495,US -3292234496,3292234751,SC -3292234752,3292235775,US -3292235776,3292236031,SC -3292236032,3292237311,US -3292237312,3292237823,SC -3292237824,3292239359,US -3292239360,3292240127,SC -3292240128,3292240639,US -3292240640,3292240895,SC -3292240896,3292241151,US -3292241152,3292241407,SC -3292241408,3292242175,US -3292242176,3292242431,SC -3292242432,3292243199,US -3292243200,3292244223,SC -3292244224,3292244991,US -3292244992,3292245247,SC -3292245248,3292246783,US -3292246784,3292247039,SC -3292247040,3292247551,US -3292247552,3292248063,SC -3292248064,3292249343,US -3292249344,3292249599,SC -3292249600,3292250367,US -3292250368,3292250623,SC -3292250624,3292250879,US -3292250880,3292251135,SC -3292251136,3292251903,US -3292251904,3292252159,SC -3292252160,3292252415,US -3292252416,3292252671,SC -3292252672,3292254975,US -3292254976,3292255743,SC -3292255744,3292257023,US -3292257024,3292257279,SC -3292257280,3292258559,US -3292258560,3292258815,SC -3292258816,3292259327,US -3292259328,3292259583,SC -3292259584,3292260863,US -3292260864,3292261375,SC -3292261376,3292262399,US -3292262400,3292263167,SC -3292263168,3292263935,US -3292263936,3292264191,SC -3292264192,3292264447,US -3292264448,3292264703,SC -3292264704,3292264959,US -3292264960,3292265215,SC -3292265216,3292265983,US -3292265984,3292266239,DE -3292266240,3292266495,SC -3292266496,3292268543,MU -3292268544,3292269055,ZA -3292269056,3292332031,MU -3292332032,3292334079,NG -3292334080,3292336127,TZ -3292336128,3292340223,ZA -3292340224,3292344319,GH -3292344320,3292345343,ZA -3292345344,3292346367,KE -3292346368,3292350463,ZA -3292350464,3292351487,CD -3292351488,3292352511,AO -3292352512,3292364799,ZA -3292364800,3292385279,SC -3292385280,3292387327,BW -3292387328,3292389375,NG -3292389376,3292391423,ZA -3292391424,3292393471,MA -3292393472,3292397567,ZA -3292397568,3292463103,US -3292463104,3292528639,ZA -3292528640,3294625791,MA -3294625792,3295674367,KE -3295674368,3296722943,MA -3296722944,3298820095,EG -3298820096,3299344383,ZA -3299344384,3299606527,TG -3299606528,3299868671,GH -3299868672,3300130815,TN -3300130816,3300392959,CI -3300392960,3300655103,TN -3300655104,3300917247,ET -3300917248,3300921343,MU -3300921344,3300925439,BJ -3300925440,3300929535,MG -3300933632,3300935679,MU -3300935680,3300937727,TZ -3300937728,3300938751,MU -3300938752,3300941823,ZA -3300941824,3300950015,MU -3300953088,3300954111,MU -3300954112,3300958207,NG -3300958208,3301048319,ZA -3301048320,3301081087,PK -3301081088,3301113855,ZA -3301113856,3301117951,AF -3301117952,3301130239,PK -3301130240,3301144319,ZA -3301144320,3301144575,NG -3301144576,3301146623,ZA -3301146624,3301163007,IN -3301163008,3301171199,PK -3301171200,3301172223,NG -3301172224,3301173759,UG -3301173760,3301174271,ZA -3301174272,3301175295,UG -3301175296,3301179391,AF -3301179392,3301179903,RU -3301179904,3301181439,SC -3301181440,3301185535,US -3301185536,3301187583,GB -3301187584,3301189631,FR -3301189632,3301191679,US -3301191680,3301193727,CA -3301193728,3301195775,JP -3301195776,3301197823,DE -3301197824,3301199871,GB -3301199872,3301201919,US -3301201920,3301203967,NL -3301203968,3301204991,DK -3301204992,3301205247,SE -3301205248,3301206015,DK -3301206016,3301208063,CH -3301208064,3301216255,US -3301216256,3301218303,ES -3301218304,3301220351,BE -3301220352,3301222399,IT -3301222400,3301224447,BE -3301224448,3301226495,NO -3301226496,3301228543,US -3301228544,3301230591,IE -3301230592,3301232639,FI -3301232640,3301234687,US -3301234688,3301236735,EE -3301236736,3301238783,CA -3301238784,3301240831,US -3301240832,3301242879,SE -3301242880,3301244927,GB -3301244928,3301246975,US -3301246976,3301247999,SC -3301248000,3301250047,US -3301250048,3301251071,SC -3301251072,3301253119,US -3301253120,3301254143,SC -3301254144,3301256191,US -3301256192,3301257215,SC -3301257216,3301259263,US -3301259264,3301260287,SC -3301260288,3301262335,US -3301262336,3301263359,SC -3301263360,3301267455,US -3301267456,3301268479,SC -3301268480,3301272575,US -3301272576,3301277695,SC -3301277696,3301278719,US -3301278720,3301279743,SC -3301279744,3301280767,PR -3301280768,3301282815,US -3301282816,3301283839,SC -3301283840,3301284863,US -3301284864,3301286911,SC -3301286912,3301287935,NL -3301287936,3301288959,CH -3301288960,3301289983,ES -3301289984,3301291007,PT -3301291008,3301292031,PL -3301292032,3301294079,SC -3301294080,3301295103,LU -3301295104,3301296127,SC -3301296128,3301297151,HK -3301297152,3301298175,SC -3301298176,3301299199,AT -3301299200,3301300223,BE -3301300224,3301301247,LV -3301301248,3301302271,CZ -3301302272,3301303295,DK -3301303296,3301304319,SC -3301304320,3301305343,FR -3301305344,3301306367,AT -3301306368,3301307391,IN -3301307392,3301308415,RU -3301308416,3301309439,SG -3301309440,3301310463,BR -3301310464,3301310975,US -3301310976,3301311487,SC -3301311488,3301311743,DE -3301311744,3301313023,SC -3301313024,3301313279,AU -3301313280,3301314303,SC -3301314304,3301314559,NO -3301314560,3301315071,SC -3301315072,3301315327,ES -3301315328,3301315583,SC -3301315584,3301315839,NL -3301315840,3301317375,SC -3301317376,3301317631,PR -3301317632,3301318655,SC -3301318656,3301318911,US -3301318912,3301319679,SC -3301319680,3301319935,US -3301319936,3301320447,SC -3301320448,3301320959,US -3301320960,3301321215,SC -3301321216,3301321471,US -3301321472,3301322751,SC -3301322752,3301323007,CA -3301323008,3301324287,SC -3301324288,3301324543,US -3301324544,3301325567,SC -3301325568,3301325823,US -3301325824,3301329151,SC -3301329152,3301329407,DK -3301329408,3301330687,SC -3301330688,3301330943,HK -3301330944,3301331199,HU -3301331200,3301331455,SC -3301331456,3301331711,NZ -3301331712,3301332479,SC -3301332480,3301332735,ES -3301332736,3301332991,SC -3301332992,3301333247,NL -3301333248,3301333759,SC -3301333760,3301334015,US -3301334016,3301334527,SC -3301334528,3301334783,US -3301334784,3301335039,PR -3301335040,3301335295,US -3301335296,3301337087,SC -3301337088,3301337343,US -3301337344,3301337855,SC -3301337856,3301338111,US -3301338112,3301340671,SC -3301340672,3301340927,PR -3301340928,3301343231,SC -3301343232,3301343743,US -3301343744,3301344511,SC -3301344512,3301344767,IN -3301344768,3301345023,AT -3301345024,3301345279,FR -3301345280,3301345535,SC -3301345536,3301345791,DK -3301345792,3301346047,CZ -3301346048,3301346303,SC -3301346304,3301346559,BE -3301346560,3301349119,SC -3301349120,3301349375,CH -3301349376,3301351423,SC -3301351424,3301351935,US -3301351936,3301352703,SC -3301352704,3301352959,US -3301352960,3301353727,SC -3301353728,3301354239,US -3301354240,3301355263,SC -3301355264,3301355519,US -3301355520,3301356799,SC -3301356800,3301357055,US -3301357056,3301357823,SC -3301357824,3301358335,US -3301358336,3301359359,SC -3301359360,3301359615,US -3301359616,3301361151,SC -3301361152,3301361407,AT -3301361408,3301361663,FR -3301361664,3301361919,DE -3301361920,3301362175,SC -3301362176,3301362431,CZ -3301362432,3301362687,LV -3301362688,3301362943,SC -3301362944,3301363199,AT -3301363200,3301364479,SC -3301364480,3301364735,NO -3301364736,3301364991,SC -3301364992,3301365247,PT -3301365248,3301367551,SC -3301367552,3301367807,PR -3301367808,3301371391,SC -3301371392,3301372159,US -3301372160,3301373183,SC -3301373184,3301373439,US -3301373440,3301373695,SC -3301373696,3301373951,US -3301373952,3301375231,SC -3301375232,3301375487,US -3301375488,3301375743,SC -3301375744,3301376511,US -3301376512,3301377535,SC -3301377536,3301378559,US -3301378560,3301379071,SC -3301379072,3301379327,US -3301379328,3301379583,SC -3301379584,3301379839,US -3301379840,3301380095,SC -3301380096,3301380351,CA -3301380352,3301382655,US -3301382656,3301382911,SC -3301382912,3301383423,US -3301383424,3301383679,SC -3301383680,3301384959,US -3301384960,3301385215,SC -3301385216,3301385727,US -3301385728,3301386239,SC -3301386240,3301387007,US -3301387008,3301387263,ES -3301387264,3301387519,PT -3301387520,3301388287,US -3301388288,3301388543,LU -3301388544,3301389311,US -3301389312,3301389567,SC -3301389568,3301390079,US -3301390080,3301390335,SC -3301390336,3301391359,US -3301391360,3301391615,SC -3301391616,3301391871,RU -3301391872,3301392895,US -3301392896,3301393151,SC -3301393152,3301393407,US -3301393408,3301393663,SC -3301393664,3301394687,US -3301394688,3301395199,SC -3301395200,3301395455,PR -3301395456,3301396479,US -3301396480,3301398015,SC -3301398016,3301398271,US -3301398272,3301398527,SC -3301398528,3301399039,US -3301399040,3301399551,SC -3301399552,3301400319,US -3301400320,3301400575,SC -3301400576,3301401343,US -3301401344,3301401599,SC -3301401600,3301401855,US -3301401856,3301402111,SC -3301402112,3301402623,US -3301402624,3301402879,GB -3301402880,3301403135,NL -3301403136,3301403391,SC -3301403392,3301403647,ES -3301403648,3301403903,US -3301403904,3301404159,SC -3301404160,3301404415,NO -3301404416,3301404671,NZ -3301404672,3301404927,LU -3301404928,3301405183,HU -3301405184,3301405439,US -3301405440,3301405695,AU -3301405696,3301405951,SC -3301405952,3301406463,US -3301406464,3301406719,CZ -3301406720,3301406975,DK -3301406976,3301407487,US -3301407488,3301408511,SC -3301408512,3301409023,US -3301409024,3301409279,SC -3301409280,3301410047,US -3301410048,3301410303,SC -3301410304,3301410559,US -3301410560,3301410815,SC -3301410816,3301411071,US -3301411072,3301411327,SC -3301411328,3301411583,US -3301411584,3301411839,PR -3301411840,3301412863,US -3301412864,3301413119,CA -3301413120,3301413375,SC -3301413376,3301416191,US -3301416192,3301416447,SC -3301416448,3301416703,PR -3301416704,3301418239,US -3301418240,3301418495,SC -3301418496,3301419007,US -3301419008,3301419519,SC -3301419520,3301419775,CH -3301419776,3301420287,SC -3301420288,3301420543,PL -3301420544,3301421311,US -3301421312,3301421567,HU -3301421568,3301421823,HK -3301421824,3301422847,SC -3301422848,3301423615,US -3301423616,3301423871,FR -3301423872,3301424383,US -3301424384,3301424639,RU -3301424640,3301424895,US -3301424896,3301425151,SC -3301425152,3301426431,US -3301426432,3301426687,SC -3301426688,3301426943,US -3301426944,3301427199,SC -3301427200,3301427711,US -3301427712,3301427967,SC -3301427968,3301428223,PR -3301428224,3301428479,US -3301428480,3301428735,SC -3301428736,3301430271,US -3301430272,3301430527,SC -3301430528,3301432831,US -3301432832,3301433087,PR -3301433088,3301433343,SC -3301433344,3301433855,US -3301433856,3301434111,PR -3301434112,3301435391,US -3301435392,3301435647,SC -3301435648,3301435903,NL -3301435904,3301436159,SC -3301436160,3301436415,ES -3301436416,3301437183,US -3301437184,3301437439,SC -3301437440,3301437695,LU -3301437696,3301439487,US -3301439488,3301439743,DK -3301439744,3301439999,SC -3301440000,3301440767,US -3301440768,3301441023,SC -3301441024,3301441279,US -3301441280,3301441535,SC -3301441536,3301445631,ZA -3301445632,3301453823,KE -3301453824,3301457919,ML -3301457920,3301462015,NG -3301462016,3301466111,ML -3301466112,3301470207,ER -3301470208,3301474303,NG -3301474304,3301490687,MA -3301490688,3301494783,CD -3301494784,3301498879,BW -3301502976,3301507071,MA -3301507328,3301507583,ZW -3301507584,3301507839,GH -3301507840,3301508095,EG -3301508096,3301508607,GH -3301508608,3301509119,ZA -3301509120,3301510143,SS -3301511168,3301512191,ZW -3301512192,3301513215,MU -3301513216,3301515263,EG -3301515264,3301523455,GH -3301523456,3301531647,CI -3301531648,3301539839,ZA -3301539840,3301544191,KE -3301544192,3301544959,DE -3301544960,3301548031,KE -3301556224,3301560319,DJ -3301560320,3301565439,KE -3301565440,3301566463,MU -3301566464,3301568511,ZA -3301568512,3301570559,EG -3301572608,3301605375,EG -3301605376,3301613567,SD -3301613568,3301629951,KE -3301629952,3301631999,ZA -3301632000,3301634047,CM -3301634048,3301636095,LS -3301636096,3301637119,ZA -3301637120,3301638143,AO -3301638144,3301703679,TN -3301703680,3301834751,EG -3301834752,3301900287,MA -3301900288,3301904383,NG -3301904384,3301908479,KE -3301908480,3301912575,ZA -3301912576,3301916671,MU -3301916672,3301933055,IN -3301933056,3301949439,KE -3301949440,3301965823,SN -3301965824,3302490111,ZA -3302490112,3302490367,KE -3302490368,3302490623,US -3302490624,3302491135,ZA -3302491136,3302492159,NG -3302492160,3302494207,MW -3302494208,3302496255,ZA -3302496256,3302498303,EG -3302498304,3302502399,NA -3302502400,3302505471,AO -3302505472,3302505679,NA -3302505680,3302505681,AO -3302505682,3302506495,NA -3302506496,3302508543,KE -3302508544,3302514687,MU -3302514688,3302522879,ZA -3302522880,3302523903,KE -3302523904,3302525951,ZA -3302525952,3302526975,EG -3302526976,3302529023,NG -3302529024,3302530047,ZA -3302530048,3302531071,TN -3302531072,3302531327,CF -3302531328,3302531583,AO -3302531584,3302531839,TZ -3302531840,3302532095,BW -3302532096,3302533119,NA -3302533120,3302533887,ZA -3302533888,3302534143,MU -3302534144,3302535167,ZA -3302535168,3302536191,UG -3302536192,3302537215,GH -3302537216,3302538239,NG -3302538240,3302539263,GH -3302539264,3302540287,ZA -3302540288,3302540799,UG -3302540800,3302541311,AO -3302541312,3302542335,NG -3302542336,3302542847,ZA -3302542848,3302543103,EG -3302543104,3302543359,NA -3302543360,3302544383,NG -3302544384,3302544639,CM -3302544640,3302544895,MU -3302544896,3302545151,GH -3302545152,3302545407,ZA -3302545408,3302545919,CD -3302545920,3302546431,TZ -3302546432,3302546943,SL -3302546944,3302547455,KE -3302547456,3302547967,ZW -3302547968,3302548479,CI -3302548480,3302548991,GH -3302548992,3302549503,ZA -3302549504,3302550015,KE -3302550016,3302550527,TZ -3302550528,3302551551,ZA -3302551552,3302552063,EG -3302552064,3302552575,KE -3302552832,3302553087,KE -3302553088,3302553343,EG -3302553344,3302553599,TZ -3302553600,3302554111,AO -3302554112,3302554367,ZA -3302554368,3302554623,NG -3302554624,3302554879,EG -3302554880,3302555135,NG -3302555392,3302555647,NG -3302555648,3302621183,MA -3302621184,3302684671,EG -3302684672,3302686719,JO -3302686720,3302750207,EG -3302750208,3302752255,JO -3302752256,3302760447,NG -3302760448,3302762495,ZA -3302762496,3302766591,US -3302766592,3302768639,ZA -3302768640,3302776831,NG -3302776832,3302785023,ZW -3302785024,3302793215,NG -3302793216,3302801407,ZA -3302801408,3302805503,NG -3302805504,3302809599,MW -3302809600,3302817791,NG -3302817792,3302883327,EG -3302883328,3302948863,NG -3302948864,3302949119,MU -3302949120,3302949375,AO -3302949376,3302949631,ZM -3302949632,3302949887,BI -3302949888,3302950143,CI -3302950144,3302950655,TZ -3302950656,3302950911,EG -3302950912,3302951423,ZA -3302951424,3302951679,SL -3302951680,3302951935,KE -3302951936,3302952191,RW -3302952192,3302952447,AO -3302952448,3302952959,ZA -3302952960,3302953471,EG -3302953472,3302953727,NA -3302953728,3302953983,AO -3302953984,3302954239,SD -3302954240,3302954495,KE -3302954496,3302955007,ZA -3302955008,3302955263,LS -3302955264,3302955519,UG -3302955520,3302955775,ZW -3302955776,3302956031,MW -3302956032,3302956287,CD -3302956544,3302957055,ZA -3302957056,3302957311,CG -3302957312,3302957567,MZ -3302957568,3302957823,GM -3302957824,3302958079,NA -3302958080,3302958335,BI -3302958336,3302958591,SZ -3302958592,3302958847,DJ -3302958848,3302959103,GA -3302959104,3302959359,BJ -3302959360,3302959615,MG -3302959616,3302959871,TD -3302959872,3302960127,SC -3302960128,3302960383,LR -3302960384,3302960639,MR -3302960896,3302961151,BF -3302961152,3302977535,ZA -3302977536,3302981631,NG -3302981632,3302985727,ZA -3302985728,3302987775,GM -3302987776,3302989823,SD -3302989824,3302993919,KE -3302993920,3302998015,MA -3302998016,3303010303,ZA -3303010304,3303012351,RW -3303012352,3303013375,ZA -3303013376,3303013631,SN -3303013632,3303014399,KE -3303014400,3303537151,TN -3303537152,3303537407,BI -3303537408,3303612415,TN -3303612416,3303620607,ZA -3303620608,3304022271,TN -3304022272,3304022527,CF -3304022528,3304062975,TN -3304062976,3304065279,SC -3304065280,3304065535,US -3304065536,3304066303,SC -3304066304,3304066559,US -3304066560,3304066815,CA -3304066816,3304067071,US -3304067072,3304067327,CA -3304067328,3304071167,SC -3304071168,3304071423,US -3304071424,3304071679,SC -3304071680,3304071935,PR -3304071936,3304072959,SC -3304072960,3304073215,US -3304073216,3304073471,GB -3304073472,3304073727,NL -3304073728,3304073983,SC -3304073984,3304074239,ES -3304074240,3304074495,PT -3304074496,3304075519,SC -3304075520,3304075775,HU -3304075776,3304076031,HK -3304076032,3304076287,AU -3304076288,3304076543,SC -3304076544,3304076799,BE -3304076800,3304077055,LV -3304077056,3304077311,SC -3304077312,3304077567,DK -3304077568,3304077823,SC -3304077824,3304078079,FR -3304078080,3304078335,SC -3304078336,3304078591,IN -3304078592,3304079103,SC -3304079104,3304079359,BR -3304079360,3304080895,SC -3304080896,3304081407,US -3304081408,3304081919,SC -3304081920,3304082175,US -3304082176,3304082431,PR -3304082432,3304082687,US -3304082688,3304083199,SC -3304083200,3304083455,US -3304083456,3304083711,SC -3304083712,3304083967,US -3304083968,3304084991,SC -3304084992,3304085503,US -3304085504,3304086015,SC -3304086016,3304086271,US -3304086272,3304086527,SC -3304086528,3304086783,US -3304086784,3304087295,SC -3304087296,3304087551,US -3304087552,3304089343,SC -3304089344,3304089599,US -3304089600,3304091135,SC -3304091136,3304091391,NO -3304091392,3304091647,SC -3304091648,3304091903,LU -3304091904,3304092159,SC -3304092160,3304092415,HK -3304092416,3304092671,SC -3304092672,3304092927,AT -3304092928,3304093439,SC -3304093440,3304093695,CZ -3304093696,3304094975,SC -3304094976,3304095231,RU -3304095232,3304096255,SC -3304096256,3304096511,US -3304096512,3304098047,SC -3304098048,3304098303,US -3304098304,3304098815,SC -3304098816,3304099071,US -3304099072,3304099327,SC -3304099328,3304099583,CA -3304099584,3304099839,SC -3304099840,3304100095,CA -3304100096,3304100607,SC -3304100608,3304101119,US -3304101120,3304102143,SC -3304102144,3304102399,US -3304102400,3304102655,SC -3304102656,3304103167,US -3304103168,3304103679,SC -3304103680,3304103935,US -3304103936,3304104959,SC -3304104960,3304105215,US -3304105216,3304105727,SC -3304105728,3304105983,US -3304105984,3304106239,GB -3304106240,3304107263,SC -3304107264,3304107519,PL -3304107520,3304107775,NO -3304107776,3304108799,SC -3304108800,3304109055,AU -3304109056,3304109311,SC -3304109312,3304109567,BE -3304109568,3304109823,LV -3304109824,3304111615,SC -3304111616,3304111871,SG -3304111872,3304113151,SC -3304113152,3304113407,US -3304113408,3304113663,SC -3304113664,3304113919,US -3304113920,3304114175,SC -3304114176,3304114431,US -3304114432,3304115199,SC -3304115200,3304115711,US -3304115712,3304115967,SC -3304115968,3304116223,US -3304116224,3304116735,SC -3304116736,3304116991,US -3304116992,3304117759,SC -3304117760,3304118271,US -3304118272,3304118527,SC -3304118528,3304118783,US -3304118784,3304119039,SC -3304119040,3304119551,US -3304119552,3304119807,SC -3304119808,3304120063,PR -3304120064,3304120575,SC -3304120576,3304120831,US -3304120832,3304121087,SC -3304121088,3304121343,US -3304121344,3304122367,SC -3304122368,3304122623,GB -3304122624,3304122879,NL -3304122880,3304125183,SC -3304125184,3304125439,AU -3304125440,3304125695,AT -3304125696,3304126719,SC -3304126720,3304126975,DE -3304126976,3304127231,FR -3304127232,3304194303,SC -3304194304,3304194559,US -3304194560,3304194815,AT -3304194816,3304195071,SC -3304195072,3304195327,DE -3304195328,3304198143,SC -3304198144,3304198399,PL -3304198400,3304198655,PT -3304198656,3304199423,SC -3304199424,3304199679,GB -3304199680,3304201471,SC -3304201472,3304201983,US -3304201984,3304202751,SC -3304202752,3304203007,US -3304203008,3304204543,SC -3304204544,3304204799,US -3304204800,3304205567,SC -3304205568,3304205823,US -3304205824,3304206335,SC -3304206336,3304206591,CA -3304206592,3304207871,SC -3304207872,3304208639,US -3304208640,3304208895,SC -3304208896,3304209151,US -3304209152,3304209407,SC -3304209408,3304209663,US -3304209664,3304210431,SC -3304210432,3304210687,SG -3304210688,3304210943,RU -3304210944,3304212223,SC -3304212224,3304212479,FR -3304212480,3304212735,SC -3304212736,3304212991,DK -3304212992,3304213247,SC -3304213248,3304213503,LV -3304213504,3304213759,SC -3304213760,3304214015,AT -3304214016,3304216831,SC -3304216832,3304217087,GB -3304217088,3304218367,SC -3304218368,3304218623,PR -3304218624,3304218879,US -3304218880,3304222207,SC -3304222208,3304222463,US -3304222464,3304223231,SC -3304223232,3304223487,US -3304223488,3304223999,SC -3304224000,3304224255,US -3304224256,3304225023,SC -3304225024,3304225279,US -3304225280,3304226047,SC -3304226048,3304226559,US -3304226560,3304227839,SC -3304227840,3304228095,RU -3304228096,3304228863,SC -3304228864,3304229119,DE -3304229120,3304229375,DK -3304229376,3304230399,SC -3304230400,3304230655,AU -3304230656,3304230911,SC -3304230912,3304231167,HU -3304231168,3304231423,SC -3304231424,3304231679,NZ -3304231680,3304232191,SC -3304232192,3304232447,PT -3304232448,3304232703,ES -3304232704,3304232959,CH -3304232960,3304233215,NL -3304233216,3304233471,GB -3304233472,3304233983,US -3304233984,3304234751,SC -3304234752,3304235007,PR -3304235008,3304235775,SC -3304235776,3304236031,PR -3304236032,3304237823,SC -3304237824,3304238079,US -3304238080,3304238591,SC -3304238592,3304239103,US -3304239104,3304240383,SC -3304240384,3304240639,US -3304240640,3304240895,SC -3304240896,3304241151,US -3304241152,3304241663,SC -3304241664,3304241919,US -3304241920,3304242431,SC -3304242432,3304242687,US -3304242688,3304244991,SC -3304244992,3304245247,FR -3304245248,3304245503,DE -3304245504,3304246271,SC -3304246272,3304246527,BE -3304246528,3304248063,SC -3304248064,3304248319,NO -3304248320,3304248831,SC -3304248832,3304249087,ES -3304249088,3304249343,SC -3304249344,3304249599,NL -3304249600,3304249855,GB -3304249856,3304250879,SC -3304250880,3304251135,US -3304251136,3304251903,SC -3304251904,3304252159,US -3304252160,3304255231,SC -3304255232,3304255487,US -3304255488,3304255999,SC -3304256000,3304256255,US -3304256256,3304256511,CA -3304256512,3304325375,SC -3304325376,3304325631,US -3304325632,3304326143,SC -3304326144,3304326399,DE -3304326400,3304327423,SC -3304327424,3304327679,AT -3304327680,3304327935,SC -3304327936,3304328191,HK -3304328192,3304328447,HU -3304328448,3304328703,LU -3304328704,3304329215,SC -3304329216,3304329471,PL -3304329472,3304331007,SC -3304331008,3304331263,US -3304331264,3304332543,SC -3304332544,3304332799,US -3304332800,3304333055,SC -3304333056,3304333311,PR -3304333312,3304333823,SC -3304333824,3304334079,US -3304334080,3304336127,SC -3304336128,3304336383,US -3304336384,3304337663,SC -3304337664,3304337919,US -3304337920,3304340735,SC -3304340736,3304340991,US -3304340992,3304341503,SC -3304341504,3304341759,SG -3304341760,3304342783,SC -3304342784,3304343039,IN -3304343040,3304343295,SC -3304343296,3304343551,FR -3304343552,3304343807,DE -3304343808,3304344063,DK -3304344064,3304344319,SC -3304344320,3304344575,LV -3304344576,3304345343,SC -3304345344,3304345599,HK -3304345600,3304345855,SC -3304345856,3304346111,LU -3304346112,3304347135,SC -3304347136,3304347391,ES -3304347392,3304348671,SC -3304348672,3304348927,US -3304348928,3304349183,SC -3304349184,3304349439,US -3304349440,3304349695,PR -3304349696,3304350975,SC -3304350976,3304351487,US -3304351488,3304352511,SC -3304352512,3304352767,US -3304352768,3304353023,SC -3304353024,3304353791,US -3304353792,3304356607,SC -3304356608,3304357119,US -3304357120,3304357887,SC -3304357888,3304358143,US -3304358144,3304358399,SC -3304358400,3304358655,BR -3304358656,3304358911,SC -3304358912,3304359167,RU -3304359168,3304359423,SC -3304359424,3304359679,AT -3304359680,3304360191,SC -3304360192,3304360447,DK -3304360448,3304362495,SC -3304362496,3304362751,NZ -3304362752,3304363007,NO -3304363008,3304363775,SC -3304363776,3304364031,CH -3304364032,3304365055,SC -3304365056,3304365567,US -3304365568,3304365823,SC -3304365824,3304366079,PR -3304366080,3304366335,SC -3304366336,3304366591,US -3304366592,3304367103,SC -3304367104,3304367359,US -3304367360,3304367871,SC -3304367872,3304368127,US -3304368128,3304368895,SC -3304368896,3304369151,US -3304369152,3304370687,SC -3304370688,3304370943,US -3304370944,3304371199,SC -3304371200,3304371455,US -3304371456,3304371967,SC -3304371968,3304372223,US -3304372224,3304373247,SC -3304373248,3304373503,US -3304373504,3304376063,SC -3304376064,3304376319,FR -3304376320,3304376575,SC -3304376576,3304376831,DK -3304376832,3304377087,CZ -3304377088,3304377343,SC -3304377344,3304377599,BE -3304377600,3304380671,SC -3304380672,3304380927,GB -3304380928,3304381695,SC -3304381696,3304381951,US -3304381952,3304382719,SC -3304382720,3304382975,US -3304382976,3304383487,SC -3304383488,3304383743,US -3304383744,3304384511,SC -3304384512,3304384767,US -3304384768,3304385279,SC -3304385280,3304385535,US -3304385536,3304386047,SC -3304386048,3304386303,US -3304386304,3304388095,SC -3304388096,3304388351,PR -3304388352,3304389887,SC -3304389888,3304390143,US -3304390144,3304390399,SC -3304390400,3304390655,US -3304390656,3304391679,SC -3304391680,3304400895,US -3304400896,3304401919,SC -3304401920,3304402943,PR -3304402944,3304403967,US -3304403968,3304404991,SC -3304404992,3304407039,US -3304407040,3304408063,CA -3304408064,3304414207,US -3304414208,3304416255,SC -3304416256,3304421375,US -3304421376,3304424447,SC -3304424448,3304425471,US -3304425472,3304426495,PR -3304426496,3304428543,US -3304428544,3304429567,SC -3304429568,3304430591,US -3304430592,3304431615,SC -3304431616,3304432639,GB -3304432640,3304433663,NL -3304433664,3304434687,SC -3304434688,3304435711,ES -3304435712,3304436735,PT -3304436736,3304437759,PL -3304437760,3304438783,NO -3304438784,3304439807,NZ -3304439808,3304440831,LU -3304440832,3304441855,SC -3304441856,3304442879,HK -3304442880,3304443903,AU -3304443904,3304444927,AT -3304444928,3304445951,SC -3304445952,3304446463,FI -3304446464,3304446719,SC -3304446720,3304446975,FI -3304446976,3304447999,CZ -3304448000,3304449023,DK -3304449024,3304450047,SC -3304450048,3304451071,FR -3304451072,3304452095,AT -3304452096,3304453119,IN -3304453120,3304454143,RU -3304454144,3304455167,SG -3304455168,3304456191,BR -3304456192,3304521727,ZA -3304521728,3304528895,US -3304528896,3304529919,SC -3304529920,3304536063,US -3304536064,3304538111,CA -3304538112,3304562687,US -3304562688,3304563711,GB -3304563712,3304564735,NL -3304564736,3304565759,CH -3304565760,3304566783,ES -3304566784,3304567807,PT -3304567808,3304568831,PL -3304568832,3304569855,NO -3304569856,3304570879,NZ -3304570880,3304571903,LU -3304571904,3304572927,HU -3304572928,3304573951,HK -3304573952,3304574975,AU -3304574976,3304575999,AT -3304576000,3304577023,BE -3304577024,3304578047,LV -3304578048,3304579071,CZ -3304579072,3304580095,DK -3304580096,3304581119,DE -3304581120,3304582143,FR -3304582144,3304583167,AT -3304583168,3304584191,IN -3304584192,3304585215,RU -3304585216,3304586239,US -3304586240,3304587263,BR -3304587264,3304669183,ZA -3304669184,3304685567,TZ -3304685568,3304701951,ZA -3304701952,3304718335,AO -3304718336,3304734719,ZA -3304734720,3304751103,BJ -3304751104,3304759295,ZA -3304759296,3304763391,KE -3304763392,3304767487,LR -3304767488,3304771583,ZA -3304771584,3304773631,KE -3304773632,3304781823,ZA -3304781824,3304782847,AO -3304782848,3304783871,MU -3304783872,3304801023,ZA -3304801024,3304804095,GH -3304804096,3304806399,NG -3304806400,3304806655,ZA -3304806656,3304807167,SC -3304807168,3304807423,ZA -3304807424,3304807935,SC -3304807936,3304808959,ZA -3304808960,3304809215,SC -3304809216,3304809471,ZA -3304809472,3304812543,KE -3304812544,3304812799,SC -3304812800,3304813055,ZA -3304813056,3304813567,SC -3304813568,3304820735,ZA -3304820736,3304821759,KE -3304821760,3304822783,MU -3304822784,3304823807,BJ -3304823808,3304824831,ML -3304824832,3304841215,ZA -3304841216,3304843263,NG -3304843264,3304845311,ZA -3304845312,3304846335,GQ -3304846336,3304847359,SC -3304847360,3304848383,ZA -3304848384,3304849407,MU -3304849408,3305111551,ZA -3305111552,3307208703,TN -3307208704,3309305855,EG -3309305856,3312451583,ZA -3312451584,3312975871,DZ -3312975872,3313500159,EG -3313500160,3313762303,MA -3313762304,3314024447,EG -3314024448,3314286591,KE -3314286592,3314548735,DZ -3314548736,3314750463,MA -3314750464,3314751487,US -3314751488,3314810879,MA -3314810880,3314827263,AO -3314827264,3314829311,ZA -3314829312,3314831359,GM -3314831360,3314833407,NG -3314833408,3314835455,AO -3314835456,3314843647,TG -3314843648,3314860031,MG -3314860032,3314868223,CI -3314868224,3314876415,GH -3314876416,3314892799,MG -3314892800,3314909183,NG -3314909184,3314910207,TD -3314910208,3314911231,NG -3314911232,3314912255,CG -3314912256,3314913279,BI -3314913280,3314914303,ZA -3314914304,3314915327,AO -3314915328,3314916351,MW -3314916352,3314917375,MZ -3314917376,3314918399,ZA -3314918400,3314919423,NG -3314919424,3314920447,GQ -3314921472,3314922495,TZ -3314922496,3314923519,ZA -3314923520,3314924543,CD -3314924544,3314925567,NG -3314925568,3314941951,GN -3314941952,3315073023,EG -3315073024,3315138559,TZ -3315138560,3315204095,MA -3315204096,3315269631,ET -3315269632,3315286015,ZA -3315286016,3315288063,KE -3315288064,3315288319,MU -3315288320,3315288575,KE -3315288576,3315289343,MU -3315289344,3315289599,KE -3315289600,3315291135,MU -3315291136,3315293183,KE -3315293184,3315294207,MU -3315294208,3315302399,ZA -3315302400,3315318783,ML -3315318784,3315322879,LS -3315326976,3315331071,ZW -3315331072,3315333119,GH -3315333120,3315351551,ZA -3315351552,3315367935,ET -3315367936,3315384319,KE -3315384320,3315397095,NG -3315397096,3315397096,ZA -3315397097,3315400703,NG -3315400704,3315417087,UG -3315417088,3315425279,ZA -3315425280,3315433471,SC -3315433472,3315449855,RW -3315449856,3315450879,BI -3315450880,3315451903,AO -3315451904,3315452927,LS -3315452928,3315453951,ZW -3315453952,3315454975,CD -3315454976,3315455999,RW -3315456000,3315457023,NG -3315457024,3315458047,ZA -3315458048,3315459071,SL -3315459072,3315460095,KE -3315460096,3315461119,SL -3315462144,3315463167,ZA -3315463168,3315464191,SO -3315464192,3315465215,CD -3315465216,3315466239,CG -3315466240,3315482623,MZ -3315482624,3315499007,MG -3315499008,3315515391,ZW -3315515392,3315531775,SC -3315531776,3315539967,CM -3315539968,3315548159,ZA -3315548160,3315552255,NG -3315552256,3315556351,ZA -3315556352,3315560447,KE -3315560448,3315564543,TZ -3315564544,3315568639,GH -3315568640,3315572735,MG -3315572736,3315580927,ST -3315580928,3315589119,CI -3315597312,3315656703,EG -3315656704,3315658751,EE -3315658752,3316121599,EG -3316121600,3316645887,ZA -3316645888,3317170175,KE -3317170176,3317301247,ZA -3317301248,3317432319,TZ -3317432320,3317497855,NA -3317497856,3317530623,CD -3317530624,3317547007,LS -3317547008,3317563391,ZA -3317563392,3317694463,GH -3317694464,3318218751,EG -3318218752,3318743039,DZ -3318743040,3318874111,SD -3318874112,3318939647,NG -3318939648,3318947839,KE -3318947840,3318956031,NG -3318956032,3318964223,ZA -3318964224,3318972415,MW -3318972416,3318988799,ZA -3318988800,3319005183,ZW -3319005184,3319136255,ZM -3319136256,3319152639,NE -3319152640,3319156735,GQ -3319156736,3319160831,GW -3319160832,3319164927,NG -3319164928,3319166975,ZA -3319166976,3319169023,ZW -3319169024,3319201791,CG -3319201792,3319234559,SL -3319234560,3319242751,LY -3319242752,3319250943,ZA -3319250944,3319255039,MG -3319255040,3319257087,ZA -3319257088,3319258111,LR -3319258112,3319259135,CD -3319259136,3319263231,ZA -3319263232,3319267327,TZ -3319267328,3319398399,AO -3319398400,3319529471,MZ -3319529472,3319537663,ZM -3319545856,3319554047,SO -3319554048,3319562239,KE -3319562240,3319570431,LS -3319570432,3319578623,GH -3319578624,3319595007,ZM -3319595008,3319611391,ZA -3319611392,3319619583,GH -3319619584,3319627775,ZA -3319627776,3319635967,UG -3319635968,3319644159,ZA -3319644160,3319652351,TZ -3319652352,3319660543,ZW -3319660544,3319791615,EG -3319791616,3320053759,MU -3320053760,3320184831,ZA -3320184832,3320250367,MA -3320250368,3320258559,MR -3320258560,3320266751,LS -3320266752,3320283135,GA -3320283136,3320285183,GM -3320285184,3320287231,GA -3320287232,3320289279,ZA -3320289280,3320291327,LR -3320291328,3320295423,ZA -3320295424,3320297471,KE -3320297472,3320299519,MU -3320299520,3320300543,BW -3320300544,3320301567,ZA -3320301568,3320302591,SO -3320302592,3320303615,GM -3320303616,3320304639,SC -3320304640,3320305663,ZW -3320305664,3320306687,MZ -3320306688,3320307711,LR -3320307712,3320308735,CV -3320308736,3320309759,LY -3320309760,3320310783,ZA -3320310784,3320311807,SS -3320312832,3320313855,ZM -3320313856,3320314879,BI -3320314880,3320315903,CD -3320315904,3320381439,KE -3320381440,3320446975,NA -3320446976,3320451071,SC -3320451072,3320455167,ZA -3320455168,3320463359,NG -3320463360,3320479743,NA -3320479744,3320500223,ZA -3320500224,3320502271,BW -3320502272,3320504319,BJ -3320504320,3320505343,TZ -3320505344,3320506367,NG -3320506368,3320507391,ZA -3320507392,3320508415,KE -3320508416,3320509439,ZA -3320509440,3320510463,RW -3320510464,3320511487,LY -3320512512,3320578047,MZ -3320578048,3320643583,ZA -3320643584,3320709119,KE -3320774656,3320791039,UG -3320791040,3320807423,BF -3320807424,3320823807,ZA -3320823808,3320827903,KE -3320827904,3320831999,MU -3320832000,3320834047,KE -3320834048,3320840191,MU -3320905728,3320938495,DJ -3320938496,3320971263,AO -3320971264,3320979455,GA -3320979456,3320981503,ZA -3320981504,3320981759,KE -3320981760,3320985599,ZA -3320985600,3320985607,KE -3320985608,3320995839,ZA -3320995840,3321004031,NG -3321004032,3321008127,GM -3321008128,3321012223,ZA -3321012224,3321016319,MZ -3321016320,3321018367,CF -3321018368,3321020415,MU -3321020416,3321022463,TZ -3321022464,3321024511,ZA -3321024512,3321028607,KE -3321028608,3321032703,CI -3321032704,3321036799,NG -3321036800,3321069567,RW -3321069568,3321102335,NA -3321167872,3321233407,ZA -3321233408,3321298943,EG -3321298944,3321364479,MA -3321364480,3321430015,KE -3321430016,3321495551,MZ -3321495552,3321561087,TZ -3321561088,3321570815,SD -3321570816,3321571071,SS -3321571072,3321593855,SD -3321593856,3321626623,GH -3321626624,3321692159,SD -3321692160,3321708543,NG -3321708544,3321724927,GH -3321724928,3321757695,MA -3321757696,3321790463,KE -3321790464,3321806847,LS -3321806848,3321823231,SD -3321823232,3321839615,NG -3321839616,3321855999,GH -3321856000,3321860095,CV -3321860096,3321864191,ZA -3321864192,3321868287,NG -3321868288,3321872383,CG -3321872384,3321876479,GM -3321876480,3321880575,NG -3321880576,3321884671,KM -3321884672,3321885695,ZA -3321885696,3321886719,NG -3321886720,3321887743,GA -3321887744,3321888767,NG -3321888768,3321968639,US -3321968640,3321970687,CA -3321970688,3321987071,US -3321987072,3321987615,CN -3321987616,3321987647,US -3321987648,3321987959,CN -3321987960,3321987967,US -3321987968,3321988375,CN -3321988376,3321988391,US -3321988392,3321988519,CN -3321988520,3321988527,US -3321988528,3321988615,CN -3321988616,3321988623,US -3321988624,3321989135,CN -3321989136,3321989151,US -3321989152,3321989159,CN -3321989160,3321989167,US -3321989168,3321989191,CN -3321989192,3321989199,US -3321989200,3321991007,CN -3321991008,3321991039,US -3321991040,3321991303,CN -3321991304,3321991311,US -3321991312,3321992015,CN -3321992016,3321992031,US -3321992032,3321992199,CN -3321992200,3321992223,US -3321992224,3321992295,CN -3321992296,3321992311,US -3321992312,3321992855,CN -3321992856,3321992863,US -3321992864,3321993215,CN -3321993216,3321993223,US -3321993224,3321993239,CN -3321993240,3321993247,US -3321993248,3321993991,CN -3321993992,3321993999,US -3321994000,3321995359,CN -3321995360,3321995391,US -3321995392,3321995999,CN -3321996000,3321996031,US -3321996032,3321996047,CN -3321996048,3321996055,US -3321996056,3321996543,CN -3321996544,3321996551,US -3321996552,3321997047,CN -3321997048,3321997055,US -3321997056,3321998431,CN -3321998432,3321998463,US -3321998464,3321998991,CN -3321998992,3321998999,US -3321999000,3321999519,CN -3321999520,3321999551,US -3321999552,3321999647,CN -3321999648,3321999679,US -3321999680,3321999943,CN -3321999944,3321999951,US -3321999952,3322000303,CN -3322000304,3322000319,US -3322000320,3322001615,CN -3322001616,3322001623,US -3322001624,3322002079,CN -3322002080,3322002111,US -3322002112,3322002687,CN -3322002688,3322002695,US -3322002696,3322002879,CN -3322002880,3322002895,US -3322002896,3322003455,CN -3322003456,3322019839,CA -3322019840,3322023935,US -3322023936,3322028031,CL -3322028032,3322036223,US -3322036224,3322052607,CA -3322052608,3322068991,US -3322068992,3322069047,CN -3322069048,3322069055,US -3322069056,3322069407,CN -3322069408,3322069439,US -3322069440,3322069503,CN -3322069504,3322069535,US -3322069536,3322069575,CN -3322069576,3322069583,US -3322069584,3322069599,CN -3322069600,3322069631,US -3322069632,3322069823,CN -3322069824,3322069855,US -3322069856,3322070399,CN -3322070400,3322070415,US -3322070416,3322070975,CN -3322070976,3322071039,US -3322071040,3322071119,CN -3322071120,3322071167,US -3322071168,3322071295,CN -3322071296,3322071359,US -3322071360,3322071567,CN -3322071568,3322071583,US -3322071584,3322071743,CN -3322071744,3322071775,US -3322071776,3322071919,CN -3322071920,3322071959,US -3322071960,3322071983,CN -3322071984,3322072031,US -3322072032,3322072159,CN -3322072160,3322072191,US -3322072192,3322072207,CN -3322072208,3322072215,US -3322072216,3322072279,CN -3322072280,3322072319,US -3322072320,3322072351,CN -3322072352,3322072367,US -3322072368,3322072479,CN -3322072480,3322072607,US -3322072608,3322072631,CN -3322072632,3322072639,US -3322072640,3322072863,CN -3322072864,3322072895,US -3322072896,3322072927,CN -3322072928,3322072943,US -3322072944,3322072959,CN -3322072960,3322073023,US -3322073024,3322073343,CN -3322073344,3322073599,US -3322073600,3322073871,CN -3322073872,3322073887,US -3322073888,3322074079,CN -3322074080,3322074111,US -3322074112,3322074287,CN -3322074288,3322074303,US -3322074304,3322074335,CN -3322074336,3322074383,US -3322074384,3322074543,CN -3322074544,3322074559,US -3322074560,3322074567,CN -3322074568,3322074591,US -3322074592,3322074783,CN -3322074784,3322074815,US -3322074816,3322074943,CN -3322074944,3322074951,US -3322074952,3322074975,CN -3322074976,3322075007,US -3322075008,3322075103,CN -3322075104,3322075199,US -3322075200,3322075223,CN -3322075224,3322075263,US -3322075264,3322075303,CN -3322075304,3322075311,US -3322075312,3322075319,CN -3322075320,3322075343,US -3322075344,3322075471,CN -3322075472,3322075487,US -3322075488,3322075551,CN -3322075552,3322075647,US -3322075648,3322075679,CN -3322075680,3322075711,US -3322075712,3322079167,CN -3322079168,3322079231,US -3322079232,3322079935,CN -3322079936,3322079999,US -3322080000,3322081919,CN -3322081920,3322082047,US -3322082048,3322084671,CN -3322084672,3322084863,US -3322084864,3322084927,CN -3322084928,3322085119,US -3322085120,3322085375,CN -3322085376,3322167551,US -3322167552,3322167807,GB -3322167808,3322202111,US -3322202112,3322203135,GB -3322203136,3322250975,US -3322250976,3322251007,IL -3322251008,3322251335,US -3322251336,3322251343,IL -3322251344,3322254719,US -3322254720,3322254783,CA -3322254784,3322339583,US -3322339584,3322339839,GB -3322339840,3322354175,US -3322354176,3322354431,JP -3322354432,3322361870,US -3322361871,3322361882,CY -3322361883,3322361890,US -3322361891,3322361906,RS -3322361907,3322361914,GB -3322361915,3322362367,US -3322362368,3322362431,DE -3322362432,3322609663,US -3322609664,3322610687,SA -3322610688,3322678535,US -3322678536,3322678551,SA -3322678552,3322678791,US -3322678792,3322678799,SA -3322678800,3322683391,US -3322683392,3322691583,AR -3322691584,3322691607,US -3322691608,3322691615,RO -3322691616,3322691775,US -3322691776,3322691791,CA -3322691792,3322692103,US -3322692104,3322692111,RO -3322692112,3322692223,US -3322692224,3322692351,CA -3322692352,3322692695,US -3322692696,3322692703,FR -3322692704,3322692775,US -3322692776,3322692783,RO -3322692784,3322692887,US -3322692888,3322692891,RO -3322692892,3322692971,US -3322692972,3322692975,RO -3322692976,3322693247,US -3322693248,3322693263,BR -3322693264,3322693271,US -3322693272,3322693279,BR -3322693280,3322693287,SG -3322693288,3322693307,US -3322693308,3322693311,CA -3322693312,3322694319,US -3322694320,3322694327,CA -3322694328,3322694895,US -3322694896,3322694903,GB -3322694904,3322695423,US -3322695424,3322695679,NL -3322695680,3322695919,US -3322695920,3322695935,CA -3322695936,3322696543,US -3322696544,3322696551,GB -3322696552,3322697215,US -3322697216,3322697223,RO -3322697224,3322697295,US -3322697296,3322697303,MA -3322697304,3322697415,US -3322697416,3322697423,RO -3322697424,3322697431,US -3322697432,3322697439,CA -3322697440,3322697951,US -3322697952,3322697983,CA -3322697984,3322698303,US -3322698304,3322698367,IL -3322698368,3322698383,US -3322698384,3322698391,CA -3322698392,3322698399,RO -3322698400,3322699199,US -3322699200,3322699207,PK -3322699208,3322699215,US -3322699216,3322699223,CA -3322699224,3322699231,RO -3322699232,3322700095,US -3322700096,3322700127,FR -3322700128,3322700287,US -3322700288,3322700543,NL -3322700544,3322706575,US -3322706576,3322706591,CA -3322706592,3322706631,US -3322706632,3322706639,GB -3322706640,3322706651,US -3322706652,3322706655,CA -3322706656,3322707743,US -3322707744,3322707751,CA -3322707752,3322748927,US -3322748928,3322753023,JP -3322753024,3322765415,US -3322765416,3322765431,IN -3322765432,3322765543,US -3322765544,3322765559,IN -3322765560,3322766031,US -3322766032,3322766039,IN -3322766040,3322766543,US -3322766544,3322766551,IN -3322766552,3322766863,US -3322766864,3322766871,IN -3322766872,3322767087,US -3322767088,3322767095,IN -3322767096,3322768223,US -3322768224,3322768239,IN -3322768240,3322768607,US -3322768608,3322768623,IN -3322768624,3322769327,US -3322769328,3322769343,IN -3322769344,3322773503,US -3322773504,3322806271,CA -3322806272,3322875903,US -3322880000,3322888191,AU -3322888192,3322888815,US -3322888816,3322888823,IN -3322888824,3322889183,US -3322889184,3322889191,BR -3322889192,3322889199,US -3322889200,3322889207,CN -3322889208,3322889535,US -3322889536,3322889599,HK -3322889600,3322889607,PE -3322889608,3322889839,US -3322889840,3322889855,PE -3322889856,3322890423,US -3322890424,3322890431,QA -3322890432,3322890439,US -3322890440,3322890447,QA -3322890448,3322890719,US -3322890720,3322890727,QA -3322890728,3322893063,US -3322893064,3322893071,BR -3322893072,3322893087,US -3322893088,3322893119,BR -3322893120,3322893983,US -3322893984,3322893991,BR -3322893992,3322894207,US -3322894208,3322894215,CN -3322894216,3322894703,US -3322894704,3322894719,IN -3322894720,3322897063,US -3322897064,3322897071,QA -3322897072,3322897919,US -3322897920,3322897927,SA -3322897928,3322897935,RO -3322897936,3322898839,US -3322898840,3322898847,BR -3322898848,3322899079,US -3322899080,3322899087,HK -3322899088,3322899103,US -3322899104,3322899135,HK -3322899136,3322899143,IN -3322899144,3322902831,US -3322902832,3322902847,IN -3322902848,3322903375,US -3322903376,3322903383,GB -3322903384,3322903487,US -3322903488,3322903495,GB -3322903496,3322903519,US -3322903520,3322903535,GB -3322903536,3322904575,US -3322904576,3322905407,CN -3322905408,3322905471,US -3322905472,3322905919,CN -3322905920,3322905935,US -3322905936,3322905951,CN -3322905952,3322905983,US -3322905984,3322906055,CN -3322906056,3322906063,US -3322906064,3322906415,CN -3322906416,3322906423,US -3322906424,3322906623,CN -3322906624,3322906631,US -3322906632,3322906735,CN -3322906736,3322906751,US -3322906752,3322907199,CN -3322907200,3322907231,US -3322907232,3322907511,CN -3322907512,3322907519,US -3322907520,3322907855,CN -3322907856,3322907871,US -3322907872,3322907999,CN -3322908000,3322908015,US -3322908016,3322908239,CN -3322908240,3322908255,US -3322908256,3322908911,CN -3322908912,3322908919,US -3322908920,3322909119,CN -3322909120,3322909183,US -3322909184,3322910143,CN -3322910144,3322910159,US -3322910160,3322910799,CN -3322910800,3322910815,US -3322910816,3322910975,CN -3322910976,3322910983,US -3322910984,3322911103,CN -3322911104,3322911135,US -3322911136,3322912863,CN -3322912864,3322912895,US -3322912896,3322912927,CN -3322912928,3322912959,US -3322912960,3322913023,CN -3322913024,3322913031,US -3322913032,3322913039,CN -3322913040,3322913047,US -3322913048,3322913799,CN -3322913800,3322913815,US -3322913816,3322913951,CN -3322913952,3322913975,US -3322913976,3322914895,CN -3322914896,3322914903,US -3322914904,3322915079,CN -3322915080,3322915087,US -3322915088,3322915199,CN -3322915200,3322915263,US -3322915264,3322915631,CN -3322915632,3322915647,US -3322915648,3322916127,CN -3322916128,3322916135,US -3322916136,3322916623,CN -3322916624,3322916639,US -3322916640,3322916823,CN -3322916824,3322916831,US -3322916832,3322917119,CN -3322917120,3322917127,US -3322917128,3322917935,CN -3322917936,3322917951,US -3322917952,3322918143,CN -3322918144,3322918151,US -3322918152,3322919439,CN -3322919440,3322919471,US -3322919472,3322919695,CN -3322919696,3322919711,US -3322919712,3322919775,CN -3322919776,3322919839,US -3322919840,3322919959,CN -3322919960,3322919999,US -3322920000,3322920823,CN -3322920824,3322920831,US -3322920832,3322921583,CN -3322921584,3322921591,US -3322921592,3322921903,CN -3322921904,3322921911,US -3322921912,3322922111,CN -3322922112,3322922143,US -3322922144,3322924047,CN -3322924048,3322924063,US -3322924064,3322924255,CN -3322924256,3322924271,US -3322924272,3322924575,CN -3322924576,3322924607,US -3322924608,3322927247,CN -3322927248,3322927255,US -3322927256,3322927263,CN -3322927264,3322927279,US -3322927280,3322928175,CN -3322928176,3322928191,US -3322928192,3322928463,CN -3322928464,3322928479,US -3322928480,3322928511,CN -3322928512,3322928575,US -3322928576,3322928815,CN -3322928816,3322928831,US -3322928832,3322929591,CN -3322929592,3322929599,US -3322929600,3322931167,CN -3322931168,3322931175,US -3322931176,3322931671,CN -3322931672,3322931679,US -3322931680,3322932335,CN -3322932336,3322932343,US -3322932344,3322932927,CN -3322932928,3322932935,US -3322932936,3322933303,CN -3322933304,3322933311,US -3322933312,3322933503,CN -3322933504,3322933511,US -3322933512,3322935575,CN -3322935576,3322935583,US -3322935584,3322936023,CN -3322936024,3322936031,US -3322936032,3322936095,CN -3322936096,3322936103,US -3322936104,3322937095,CN -3322937096,3322937119,US -3322937120,3322937151,CN -3322937152,3322937167,US -3322937168,3322937343,CN -3322937344,3322945535,US -3322945536,3322951679,CN -3322951680,3322953727,US -3322953728,3322956583,NL -3322956584,3322956591,US -3322956592,3322956599,IN -3322956600,3322956607,SE -3322956608,3322956615,ES -3322956616,3322956623,DE -3322956624,3322962431,NL -3322962432,3322962687,GB -3322962688,3322962943,ES -3322962944,3322963455,NL -3322963456,3322964479,GB -3322964480,3322965247,NL -3322965248,3322965503,DE -3322965504,3322965759,US -3322965760,3322966015,NL -3322966016,3322969343,US -3322969344,3322970111,NL -3322970112,3323002879,CA -3323002880,3323013887,US -3323013888,3323014143,CA -3323014144,3323017727,US -3323017728,3323017983,CA -3323017984,3323020799,US -3323020800,3323021055,SG -3323021056,3323022591,US -3323022592,3323022847,GB -3323022848,3323023103,US -3323023360,3323027455,US -3323027456,3323027711,CA -3323027712,3323031807,US -3323032576,3323032831,US -3323032832,3323033087,IT -3323033344,3323033599,US -3323033600,3323034111,BR -3323034112,3323038719,US -3323038720,3323038975,CA -3323038976,3323048959,US -3323048960,3323049727,NL -3323049728,3323061247,US -3323061504,3323062015,US -3323062016,3323062527,BR -3323062528,3323068415,US -3323199488,3323201535,US -3323201536,3323203583,CA -3323203584,3323207679,US -3323207680,3323215871,CA -3323215872,3323224063,US -3323224064,3323232255,NL -3323232256,3323240959,US -3323240960,3323241215,CA -3323241216,3323241247,GB -3323241248,3323241279,EE -3323241280,3323241311,US -3323241312,3323241343,GB -3323241344,3323241351,CA -3323241352,3323241375,US -3323241376,3323241407,CA -3323241408,3323241439,GB -3323241440,3323241455,US -3323241456,3323241471,CA -3323241472,3323241479,GB -3323241480,3323241487,CN -3323241488,3323241495,CA -3323241496,3323241503,MT -3323241504,3323241511,US -3323241512,3323241519,CA -3323241520,3323241527,TR -3323241528,3323241567,CA -3323241568,3323241575,US -3323241576,3323241583,CA -3323241584,3323241591,CN -3323241592,3323241607,CA -3323241608,3323241623,US -3323241624,3323241631,BR -3323241632,3323241639,US -3323241640,3323241647,GB -3323241648,3323241655,CA -3323241656,3323241663,US -3323241664,3323241671,TR -3323241672,3323241679,PH -3323241680,3323241687,US -3323241688,3323241695,CN -3323241696,3323241703,EE -3323241704,3323241711,CN -3323241712,3323241719,GB -3323241720,3323241727,SA -3323241728,3323241819,CA -3323241820,3323241823,US -3323241824,3323241883,CA -3323241884,3323241887,US -3323241888,3323241983,CA -3323241984,3323242239,US -3323242240,3323242255,CA -3323242256,3323242271,US -3323242272,3323242287,CA -3323242288,3323242303,US -3323242304,3323242311,CA -3323242312,3323242319,SE -3323242320,3323242367,CA -3323242368,3323242511,US -3323242512,3323242527,BD -3323242528,3323242575,CA -3323242576,3323242591,US -3323242592,3323242607,CA -3323242608,3323242623,US -3323242624,3323242703,CA -3323242704,3323243007,US -3323243008,3323243055,CA -3323243056,3323243063,US -3323243064,3323243087,CA -3323243088,3323243095,IE -3323243096,3323243103,GB -3323243104,3323243119,CA -3323243120,3323243127,US -3323243128,3323243135,CA -3323243136,3323243143,US -3323243144,3323243159,CA -3323243160,3323243175,US -3323243176,3323243183,CA -3323243184,3323243199,US -3323243200,3323243207,CN -3323243208,3323243215,CA -3323243216,3323243231,US -3323243232,3323243239,CA -3323243240,3323243255,US -3323243256,3323243263,CA -3323243264,3323243391,CN -3323243392,3323243455,CA -3323243456,3323243487,GB -3323243488,3323243519,CA -3323243520,3323243535,US -3323243536,3323243551,BD -3323243552,3323243583,CA -3323243584,3323243615,US -3323243616,3323243663,CA -3323243664,3323243711,US -3323243712,3323243743,CA -3323243744,3323243791,US -3323243792,3323243799,CA -3323243800,3323243807,US -3323243808,3323243815,CA -3323243816,3323243823,US -3323243824,3323243903,CA -3323243904,3323243967,US -3323243968,3323244031,CA -3323244032,3323244095,LT -3323244096,3323244159,US -3323244160,3323244175,CA -3323244176,3323244255,US -3323244256,3323244287,CA -3323244288,3323244327,US -3323244328,3323244351,CA -3323244352,3323244415,US -3323244416,3323244487,CA -3323244488,3323244503,US -3323244504,3323244511,CA -3323244512,3323244527,US -3323244528,3323244687,CA -3323244688,3323244695,US -3323244696,3323244703,CA -3323244704,3323244735,US -3323244736,3323244767,CA -3323244768,3323244783,US -3323244784,3323244799,CA -3323244800,3323244927,US -3323244928,3323245055,CA -3323245056,3323245087,US -3323245088,3323245119,GB -3323245120,3323245247,US -3323245248,3323245255,CA -3323245256,3323245311,US -3323245312,3323245319,LT -3323245320,3323245327,CA -3323245328,3323245383,US -3323245384,3323245391,IN -3323245392,3323245399,GB -3323245400,3323245407,TR -3323245408,3323245415,AE -3323245416,3323245423,TR -3323245424,3323245439,CA -3323245440,3323245455,GB -3323245456,3323245463,AZ -3323245464,3323245479,CA -3323245480,3323245487,AE -3323245488,3323245495,BE -3323245496,3323245535,US -3323245536,3323245543,SG -3323245544,3323245551,US -3323245552,3323245559,GB -3323245560,3323245567,CN -3323245568,3323245655,US -3323245656,3323245663,CA -3323245664,3323245823,US -3323245824,3323245951,CA -3323245952,3323245959,US -3323245960,3323245983,CA -3323245984,3323246015,US -3323246016,3323246079,CA -3323246080,3323246207,US -3323246208,3323246231,CA -3323246232,3323246239,FI -3323246240,3323246271,CA -3323246272,3323246463,US -3323246464,3323246591,CN -3323246592,3323247359,US -3323247360,3323247423,CA -3323247424,3323247575,US -3323247576,3323247583,CA -3323247584,3323248383,US -3323248384,3323248639,CA -3323248640,3323270420,US -3323270421,3323270421,CH -3323270422,3323339263,US -3323339776,3323340031,CA -3323340288,3323342591,US -3323342592,3323342847,AU -3323343616,3323343871,DE -3323343872,3323346175,US -3323346176,3323346431,AU -3323346432,3323354367,US -3323354368,3323355647,DE -3323355648,3323356671,US -3323356672,3323356927,CA -3323356928,3323378687,US -3323378688,3323378943,CA -3323378944,3323382783,US -3323382784,3323383295,CA -3323383296,3323391231,US -3323391232,3323391487,CA -3323391488,3323394559,US -3323394560,3323395071,CL -3323395072,3323416415,US -3323416416,3323416479,GB -3323416480,3323437823,US -3323437824,3323438079,CA -3323438080,3323440703,US -3323440704,3323440735,GB -3323440736,3323441043,US -3323441044,3323441047,GB -3323441048,3323444847,US -3323444848,3323444863,CA -3323444864,3323446271,US -3323446272,3323446527,GB -3323446528,3323454463,US -3323454464,3323454719,NL -3323454720,3323457791,US -3323457792,3323458047,GB -3323458048,3323458815,US -3323458816,3323459071,NL -3323459072,3323462911,US -3323462912,3323463167,BR -3323463168,3323471615,US -3323471616,3323471623,GB -3323471624,3323471679,US -3323471680,3323471759,GB -3323471760,3323471855,US -3323471856,3323471859,FR -3323471860,3323475423,US -3323475424,3323475455,IN -3323475456,3323477855,US -3323477856,3323477871,KR -3323477872,3323477983,US -3323477984,3323478015,GB -3323478016,3323494895,US -3323494896,3323494911,GB -3323494912,3323495015,US -3323495016,3323495023,QA -3323495024,3323496279,US -3323496280,3323496287,HK -3323496288,3323497023,US -3323497024,3323497031,HK -3323497032,3323497519,US -3323497520,3323497527,QA -3323497528,3323498223,US -3323498224,3323498239,BR -3323498240,3323502031,US -3323502032,3323502039,HK -3323502040,3323502839,US -3323502840,3323502847,PK -3323502848,3323505287,US -3323505288,3323505295,BR -3323505296,3323505311,US -3323505312,3323505343,BR -3323505344,3323505527,US -3323505528,3323505535,PK -3323505536,3323506559,US -3323506560,3323506567,PK -3323506568,3323506647,US -3323506648,3323506655,GB -3323506656,3323507055,US -3323507056,3323507063,GB -3323507064,3323507823,US -3323507824,3323507831,CA -3323507832,3323508639,US -3323508640,3323508647,GB -3323508648,3323659263,US -3323659264,3323660543,NZ -3323660544,3323661311,US -3323661312,3323662335,CA -3323662336,3323674623,US -3323674624,3323677991,CA -3323677992,3323677995,US -3323677996,3323678031,CA -3323678032,3323678047,US -3323678048,3323678055,CA -3323678056,3323678059,MX -3323678060,3323678063,CA -3323678064,3323678079,GB -3323678080,3323678095,CA -3323678096,3323678111,US -3323678112,3323678127,CA -3323678128,3323678143,GB -3323678144,3323678147,CA -3323678148,3323678151,US -3323678152,3323678159,CA -3323678160,3323678167,GB -3323678168,3323678171,CA -3323678172,3323678175,US -3323678176,3323678195,CA -3323678196,3323678199,VE -3323678200,3323678463,US -3323678464,3323678519,CA -3323678520,3323678523,BR -3323678524,3323678527,US -3323678528,3323678583,CA -3323678584,3323678587,US -3323678588,3323678591,ID -3323678592,3323678631,CA -3323678632,3323678635,PL -3323678636,3323678687,CA -3323678688,3323678691,PA -3323678692,3323678695,CA -3323678696,3323678699,PT -3323678700,3323679871,CA -3323679872,3323679903,IN -3323679904,3323679963,CA -3323679964,3323679999,US -3323680000,3323680255,CA -3323680256,3323681023,US -3323681024,3323681327,CA -3323681328,3323681343,US -3323681344,3323681359,CA -3323681360,3323681363,FR -3323681364,3323681399,CA -3323681400,3323681403,IT -3323681404,3323681407,MX -3323681408,3323681415,CA -3323681416,3323681423,BR -3323681424,3323681439,CA -3323681440,3323681455,AE -3323681456,3323681479,CA -3323681480,3323681487,GB -3323681488,3323681519,CA -3323681520,3323681527,SI -3323681528,3323681535,CA -3323681536,3323681567,IN -3323681568,3323681583,US -3323681584,3323681591,CA -3323681592,3323681599,US -3323681600,3323681631,CA -3323681632,3323681663,NO -3323681664,3323681727,CA -3323681728,3323681735,MY -3323681736,3323681747,CA -3323681748,3323681751,VE -3323681752,3323681759,BG -3323681760,3323682559,CA -3323682560,3323682591,US -3323682592,3323682655,CA -3323682656,3323682687,IE -3323682688,3323682751,CA -3323682752,3323682767,US -3323682768,3323682771,CA -3323682772,3323682775,RO -3323682776,3323682787,CA -3323682788,3323682791,AF -3323682792,3323682831,CA -3323682832,3323682839,IN -3323682840,3323682843,BD -3323682844,3323682871,CA -3323682872,3323682875,US -3323682876,3323682955,CA -3323682956,3323682959,US -3323682960,3323682967,CA -3323682968,3323682971,US -3323682972,3323682975,CY -3323682976,3323682991,CA -3323682992,3323682999,CH -3323683000,3323683007,CA -3323683008,3323683039,AU -3323683040,3323683071,CA -3323683072,3323683103,BA -3323683104,3323683123,CA -3323683124,3323683127,BR -3323683128,3323683215,CA -3323683216,3323683223,VN -3323683224,3323683295,CA -3323683296,3323683299,CL -3323683300,3323683359,CA -3323683360,3323683367,MY -3323683368,3323683399,CA -3323683400,3323683403,BR -3323683404,3323683427,CA -3323683428,3323683431,IT -3323683432,3323683435,DE -3323683436,3323683447,CA -3323683448,3323683455,US -3323683456,3323683471,CA -3323683472,3323683479,MX -3323683480,3323683487,BR -3323683488,3323683523,CA -3323683524,3323683527,DE -3323683528,3323683535,CA -3323683536,3323683551,AU -3323683552,3323683583,CA -3323683584,3323683591,PA -3323683592,3323683679,CA -3323683680,3323683683,FR -3323683684,3323683687,BR -3323683688,3323683703,CA -3323683704,3323683707,CO -3323683708,3323683711,US -3323683712,3323683839,GP -3323683840,3323683847,CA -3323683848,3323683851,IN -3323683852,3323683855,GB -3323683856,3323683871,CA -3323683872,3323683903,IL -3323683904,3323683935,CA -3323683936,3323683967,US -3323683968,3323683983,CA -3323683984,3323683991,RO -3323683992,3323684031,CA -3323684032,3323684063,PE -3323684064,3323684223,CA -3323684224,3323684227,MX -3323684228,3323684239,CA -3323684240,3323684243,GB -3323684244,3323684271,CA -3323684272,3323684279,FR -3323684280,3323684287,ES -3323684288,3323684291,IN -3323684292,3323684387,CA -3323684388,3323684391,MX -3323684392,3323684395,CA -3323684396,3323684399,IN -3323684400,3323684431,CA -3323684432,3323684435,US -3323684436,3323684443,CA -3323684444,3323684447,IN -3323684448,3323684451,US -3323684452,3323684455,BR -3323684456,3323684459,PE -3323684460,3323684463,CA -3323684464,3323684479,US -3323684480,3323684511,CA -3323684512,3323684515,GB -3323684516,3323684539,CA -3323684540,3323684559,US -3323684560,3323684615,CA -3323684616,3323684619,US -3323684620,3323684735,CA -3323684736,3323684739,IN -3323684740,3323684783,CA -3323684784,3323684799,CO -3323684800,3323684831,CA -3323684832,3323684835,PE -3323684836,3323684839,MX -3323684840,3323684843,CA -3323684844,3323684847,US -3323684848,3323684855,CA -3323684856,3323684863,US -3323684864,3323684883,CA -3323684884,3323684887,US -3323684888,3323684891,CA -3323684892,3323684895,AR -3323684896,3323684951,CA -3323684952,3323684959,US -3323684960,3323684975,BZ -3323684976,3323684991,US -3323684992,3323685023,CA -3323685024,3323685039,RO -3323685040,3323685167,CA -3323685168,3323685183,MX -3323685184,3323685215,CA -3323685216,3323685231,US -3323685232,3323685239,SI -3323685240,3323685247,GB -3323685248,3323685263,CA -3323685264,3323685271,US -3323685272,3323685275,CA -3323685276,3323685287,US -3323685288,3323685295,CA -3323685296,3323685311,PL -3323685312,3323685315,VG -3323685316,3323685319,CA -3323685320,3323685327,CO -3323685328,3323685343,BR -3323685344,3323685347,BZ -3323685348,3323685351,IN -3323685352,3323685359,US -3323685360,3323685391,CA -3323685392,3323685399,MX -3323685400,3323685407,CA -3323685408,3323685411,MX -3323685412,3323685415,CA -3323685416,3323685419,AR -3323685420,3323685527,CA -3323685528,3323685535,GB -3323685536,3323685551,CA -3323685552,3323685555,BY -3323685556,3323685767,CA -3323685768,3323685775,BR -3323685776,3323685799,CA -3323685800,3323685823,US -3323685824,3323685831,BR -3323685832,3323685847,CA -3323685848,3323685855,DE -3323685856,3323685871,CA -3323685872,3323685887,US -3323685888,3323685899,CA -3323685900,3323685903,US -3323685904,3323685907,CA -3323685908,3323685911,CY -3323685912,3323685919,US -3323685920,3323685923,CA -3323685924,3323685927,BR -3323685928,3323685931,CA -3323685932,3323685935,PE -3323685936,3323685943,CA -3323685944,3323685951,NL -3323685952,3323686047,CA -3323686048,3323686051,US -3323686052,3323686055,AR -3323686056,3323686095,CA -3323686096,3323686111,US -3323686112,3323686135,CA -3323686136,3323686143,MX -3323686144,3323686159,NO -3323686160,3323686163,US -3323686164,3323686191,CA -3323686192,3323686195,PE -3323686196,3323686199,VI -3323686200,3323686255,CA -3323686256,3323686263,DE -3323686264,3323686271,US -3323686272,3323686287,CA -3323686288,3323686303,US -3323686304,3323686367,CA -3323686368,3323686371,IN -3323686372,3323686383,CA -3323686384,3323686391,US -3323686392,3323686439,CA -3323686440,3323686447,BR -3323686448,3323686591,CA -3323686592,3323686595,FR -3323686596,3323686599,CA -3323686600,3323686607,BR -3323686608,3323686623,CA -3323686624,3323686631,NL -3323686632,3323686639,BR -3323686640,3323686655,US -3323686656,3323686659,PE -3323686660,3323686663,US -3323686664,3323686667,CA -3323686668,3323686671,FR -3323686672,3323686683,CA -3323686684,3323686687,IN -3323686688,3323686731,CA -3323686732,3323686735,US -3323686736,3323686783,CA -3323686784,3323686791,BR -3323686792,3323686807,CA -3323686808,3323686811,CR -3323686812,3323686815,PE -3323686816,3323686823,CA -3323686824,3323686827,US -3323686828,3323686847,CA -3323686848,3323686851,US -3323686852,3323686879,CA -3323686880,3323686887,US -3323686888,3323686895,MX -3323686896,3323686911,CA -3323686912,3323686943,BR -3323686944,3323686975,IN -3323686976,3323687031,CA -3323687032,3323687039,US -3323687040,3323687073,CA -3323687074,3323687074,US -3323687075,3323687079,CA -3323687080,3323687103,US -3323687104,3323687111,BR -3323687112,3323687115,PT -3323687116,3323687167,CA -3323687168,3323687183,US -3323687184,3323687199,BR -3323687200,3323687215,CA -3323687216,3323687231,US -3323687232,3323687235,CA -3323687236,3323687239,SK -3323687240,3323687255,CA -3323687256,3323687259,US -3323687260,3323687279,CA -3323687280,3323687287,US -3323687288,3323687427,CA -3323687428,3323687431,BZ -3323687432,3323687567,CA -3323687568,3323687571,PL -3323687572,3323687575,CA -3323687576,3323687583,ES -3323687584,3323687591,CA -3323687592,3323687595,VE -3323687596,3323687711,CA -3323687712,3323687715,US -3323687716,3323687719,CA -3323687720,3323687727,US -3323687728,3323687731,VE -3323687732,3323687735,AE -3323687736,3323687743,CA -3323687744,3323687747,ES -3323687748,3323687815,CA -3323687816,3323687819,US -3323687820,3323687855,CA -3323687856,3323687863,US -3323687864,3323687871,CA -3323687872,3323687887,PK -3323687888,3323687891,BR -3323687892,3323687895,CA -3323687896,3323687903,IN -3323687904,3323687911,BR -3323687912,3323687915,CA -3323687916,3323687919,US -3323687920,3323687923,CA -3323687924,3323687927,VN -3323687928,3323687935,BR -3323687936,3323687999,US -3323688000,3323688051,CA -3323688052,3323688055,MX -3323688056,3323688059,CA -3323688060,3323688063,GB -3323688064,3323688135,CA -3323688136,3323688143,US -3323688144,3323688163,CA -3323688164,3323688175,BR -3323688176,3323688207,CA -3323688208,3323688215,AR -3323688216,3323688255,CA -3323688256,3323688271,BR -3323688272,3323688287,CA -3323688288,3323688303,PA -3323688304,3323688319,CA -3323688320,3323688335,US -3323688336,3323688391,CA -3323688392,3323688395,ID -3323688396,3323688415,CA -3323688416,3323688447,DE -3323688448,3323688463,CA -3323688464,3323688467,BR -3323688468,3323688471,CA -3323688472,3323688479,US -3323688480,3323688531,CA -3323688532,3323688535,EC -3323688536,3323688543,CA -3323688544,3323688551,VE -3323688552,3323688563,CA -3323688564,3323688567,CL -3323688568,3323688571,VE -3323688572,3323688603,CA -3323688604,3323688607,FR -3323688608,3323688655,CA -3323688656,3323688659,IN -3323688660,3323688663,CA -3323688664,3323688671,CH -3323688672,3323688675,CA -3323688676,3323688679,US -3323688680,3323688839,CA -3323688840,3323688843,US -3323688844,3323688847,CA -3323688848,3323688855,PT -3323688856,3323688863,CL -3323688864,3323689055,CA -3323689056,3323689059,FR -3323689060,3323689071,CA -3323689072,3323689079,ID -3323689080,3323689167,CA -3323689168,3323689183,US -3323689184,3323689191,PE -3323689192,3323689247,CA -3323689248,3323689251,IN -3323689252,3323689255,US -3323689256,3323689279,CA -3323689280,3323689295,US -3323689296,3323689347,CA -3323689348,3323689351,VE -3323689352,3323689359,CA -3323689360,3323689367,US -3323689368,3323689383,CA -3323689384,3323689391,BR -3323689392,3323689399,CA -3323689400,3323689403,MX -3323689404,3323689407,BR -3323689408,3323689427,CA -3323689428,3323689431,EC -3323689432,3323689435,CA -3323689436,3323689439,MY -3323689440,3323689491,CA -3323689492,3323689495,BR -3323689496,3323689519,CA -3323689520,3323689527,ES -3323689528,3323689559,CA -3323689560,3323689583,US -3323689584,3323689595,CA -3323689596,3323689663,US -3323689664,3323689711,CA -3323689712,3323689715,BR -3323689716,3323689719,US -3323689720,3323689807,CA -3323689808,3323689823,US -3323689824,3323689863,CA -3323689864,3323689871,PE -3323689872,3323689879,IT -3323689880,3323689903,CA -3323689904,3323689911,BR -3323689912,3323689927,CA -3323689928,3323689935,US -3323689936,3323689983,CA -3323689984,3323690015,RS -3323690016,3323690095,CA -3323690096,3323690111,PK -3323690112,3323690143,CO -3323690144,3323690199,CA -3323690200,3323690207,US -3323690208,3323690223,CA -3323690224,3323690235,US -3323690236,3323690351,CA -3323690352,3323690359,AE -3323690360,3323690363,US -3323690364,3323690463,CA -3323690464,3323690495,PE -3323690496,3323741439,US -3323741440,3323741695,GB -3323741696,3323744255,US -3323744256,3323748351,GB -3323748352,3323805695,US -3323805696,3323805951,GB -3323805952,3324051455,US -3324051456,3324182527,CA -3324182528,3324193279,US -3324193280,3324193791,CA -3324193792,3324196747,US -3324196748,3324196751,NG -3324196752,3324255231,US -3324255232,3324256255,VI -3324256256,3324259327,SA -3324259328,3324259583,US -3324259584,3324260095,SA -3324260096,3324277759,US -3324277760,3324278783,CA -3324278784,3324279071,US -3324279072,3324279079,TR -3324279080,3324279103,US -3324279104,3324279167,ZA -3324279168,3324279175,IN -3324279176,3324279183,US -3324279184,3324279191,CA -3324279192,3324279199,PT -3324279200,3324279303,US -3324279304,3324279311,GB -3324279312,3324279359,US -3324279360,3324279423,CO -3324279424,3324279431,US -3324279432,3324279439,SE -3324279440,3324279567,US -3324279568,3324279583,IN -3324279584,3324279615,BR -3324279616,3324279647,CA -3324279648,3324279679,AU -3324279680,3324279871,US -3324279872,3324279903,BR -3324279904,3324280191,US -3324280192,3324280207,CA -3324280208,3324280223,GB -3324280224,3324280319,US -3324280320,3324280351,AF -3324280352,3324280447,US -3324280448,3324280479,BR -3324280480,3324280511,US -3324280512,3324280575,AF -3324280576,3324280695,US -3324280696,3324280703,ZW -3324280704,3324280767,PH -3324280768,3324354559,US -3324354560,3324362751,CA -3324362752,3324379135,US -3324379136,3324380159,CA -3324380160,3324380927,US -3324380928,3324381183,CA -3324381184,3324449535,US -3324449536,3324449791,GB -3324449792,3324470271,US -3324470272,3324474367,GB -3324474368,3324522495,US -3324522496,3324522751,CN -3324522752,3324523007,US -3324523008,3324523431,CN -3324523432,3324523455,US -3324523456,3324523559,CN -3324523560,3324523567,US -3324523568,3324523575,CN -3324523576,3324523583,US -3324523584,3324524047,CN -3324524048,3324524055,US -3324524056,3324524255,CN -3324524256,3324524287,US -3324524288,3324524439,CN -3324524440,3324524447,US -3324524448,3324524543,CN -3324524544,3324524551,US -3324524552,3324524783,CN -3324524784,3324524791,US -3324524792,3324524991,CN -3324524992,3324525055,US -3324525056,3324525095,CN -3324525096,3324525103,US -3324525104,3324525111,CN -3324525112,3324525119,US -3324525120,3324525583,CN -3324525584,3324525631,US -3324525632,3324525695,CN -3324525696,3324525791,US -3324525792,3324526015,CN -3324526016,3324526335,US -3324526336,3324526591,CN -3324526592,3324579839,US -3324582912,3324583935,CA -3324583936,3324587775,CL -3324587776,3324601087,US -3324601088,3324601343,GB -3324601344,3324604671,US -3324604672,3324604927,GB -3324604928,3324613695,US -3324613696,3324613727,LU -3324613728,3324613759,US -3324613760,3324613855,LU -3324613856,3324624895,US -3324633088,3324634111,PE -3324634112,3324635647,AR -3324635648,3324635903,HK -3324635904,3324636159,US -3324636160,3324637183,NZ -3324637184,3324638207,DE -3324638208,3324638719,IN -3324638720,3324642303,US -3324642304,3324642559,CA -3324642560,3324645887,US -3324645888,3324646143,CA -3324646144,3324647679,US -3324647680,3324647935,CA -3324647936,3324650495,US -3324650496,3324650751,CA -3324650752,3324653311,US -3324653312,3324653567,CA -3324653568,3324655871,US -3324655872,3324656127,CA -3324656128,3324659967,US -3324659968,3324660223,CA -3324660224,3324660479,US -3324660480,3324660735,CA -3324660736,3324662015,US -3324662016,3324662271,CA -3324662272,3324662527,US -3324662528,3324662783,CA -3324662784,3324664319,US -3324664320,3324664575,CA -3324664576,3324665855,US -3324665856,3324666367,CA -3324666368,3324668415,US -3324668416,3324668671,CA -3324668672,3324672767,US -3324672768,3324673023,CA -3324673024,3324674815,US -3324674816,3324675327,CA -3324675328,3324676351,US -3324676352,3324676863,CA -3324676864,3324678911,US -3324678912,3324679167,CA -3324679168,3324679423,US -3324679424,3324679935,CA -3324679936,3324681215,US -3324681216,3324681471,CA -3324681472,3324682495,US -3324682496,3324682751,CA -3324682752,3324684799,US -3324684800,3324685055,CA -3324685056,3324686335,US -3324686336,3324686591,CA -3324686592,3324690687,US -3324690688,3324690943,CA -3324690944,3324692991,US -3324692992,3324693247,CA -3324693248,3324693503,US -3324693504,3324693759,CA -3324693760,3324694527,US -3324694528,3324695039,CA -3324695040,3324695551,US -3324695552,3324695807,CA -3324695808,3324696063,US -3324696064,3324696575,CA -3324696576,3324696831,US -3324696832,3324697087,CA -3324697088,3324698623,US -3324698624,3324699135,CA -3324699136,3324699391,US -3324699392,3324699647,CA -3324699648,3324701183,US -3324701184,3324701695,CA -3324701696,3324701951,US -3324701952,3324702207,CA -3324702208,3324703999,US -3324704000,3324704255,CA -3324704256,3324706303,US -3324706304,3324706559,CA -3324706560,3324805119,US -3324805120,3324805151,CN -3324805152,3324805183,ES -3324805184,3324805207,US -3324805208,3324805215,IN -3324805216,3324805239,US -3324805240,3324805247,CA -3324805248,3324805255,SG -3324805256,3324805279,US -3324805280,3324805295,CN -3324805296,3324805303,US -3324805304,3324805343,CN -3324805344,3324805359,US -3324805360,3324805367,CN -3324805368,3324805375,US -3324805376,3324805383,CN -3324805384,3324805399,US -3324805400,3324805407,CN -3324805408,3324805415,US -3324805416,3324805423,ES -3324805424,3324805439,CN -3324805440,3324805455,US -3324805456,3324805463,ZA -3324805464,3324805471,BR -3324805472,3324805503,CN -3324805504,3324805519,US -3324805520,3324805535,GB -3324805536,3324805583,US -3324805584,3324805591,PK -3324805592,3324805599,US -3324805600,3324805615,CN -3324805616,3324805663,US -3324805664,3324805695,IN -3324805696,3324805703,TR -3324805704,3324805711,BR -3324805712,3324805719,US -3324805720,3324805727,BR -3324805728,3324805791,US -3324805792,3324805807,NL -3324805808,3324805823,US -3324805824,3324805831,NL -3324805832,3324805839,US -3324805840,3324805847,PK -3324805848,3324805951,US -3324805952,3324805967,GB -3324805968,3324805983,US -3324805984,3324805999,NL -3324806000,3324806047,CN -3324806048,3324806127,US -3324806128,3324806135,NO -3324806136,3324806159,US -3324806160,3324806167,CN -3324806168,3324806175,SG -3324806176,3324806183,US -3324806184,3324806191,IL -3324806192,3324806207,US -3324806208,3324806215,CN -3324806216,3324806223,TW -3324806224,3324806231,US -3324806232,3324806239,NO -3324806240,3324806279,CN -3324806280,3324806303,US -3324806304,3324806311,BR -3324806312,3324806327,US -3324806328,3324806335,CN -3324806336,3324806351,IN -3324806352,3324806399,US -3324806400,3324806415,CN -3324806416,3324806423,CA -3324806424,3324806447,US -3324806448,3324806463,IN -3324806464,3324806535,US -3324806536,3324806543,PK -3324806544,3324806551,CA -3324806552,3324806559,NL -3324806560,3324806687,US -3324806688,3324806719,CN -3324806720,3324806751,RU -3324806752,3324806759,US -3324806760,3324806767,GB -3324806768,3324806775,US -3324806776,3324806783,UA -3324806784,3324806799,AU -3324806800,3324806807,SG -3324806808,3324806815,US -3324806816,3324806823,NO -3324806824,3324806831,US -3324806832,3324806847,RU -3324806848,3324806855,US -3324806856,3324806863,CN -3324806864,3324806879,IN -3324806880,3324806895,IL -3324806896,3324806975,US -3324806976,3324806983,GB -3324806984,3324806991,CA -3324806992,3324807007,US -3324807008,3324807023,PK -3324807024,3324807039,CA -3324807040,3324807055,RU -3324807056,3324807103,US -3324807104,3324807111,AE -3324807112,3324807127,US -3324807128,3324807135,AU -3324807136,3324807151,US -3324807152,3324807167,GB -3324807168,3324807175,BR -3324807176,3324807255,US -3324807256,3324807263,BR -3324807264,3324807327,US -3324807328,3324807335,IN -3324807336,3324807343,CR -3324807344,3324807359,BR -3324807360,3324807367,IN -3324807368,3324807391,CN -3324807392,3324807423,US -3324807424,3324807455,BR -3324807456,3324807471,CN -3324807472,3324807487,US -3324807488,3324807495,RO -3324807496,3324807503,QA -3324807504,3324807511,US -3324807512,3324807519,NL -3324807520,3324807535,IN -3324807536,3324807551,BR -3324807552,3324807647,US -3324807648,3324807663,IN -3324807664,3324807671,BR -3324807672,3324807727,US -3324807728,3324807743,CA -3324807744,3324807791,US -3324807792,3324807799,AU -3324807800,3324807807,BR -3324807808,3324807871,US -3324807872,3324807903,IN -3324807904,3324807919,US -3324807920,3324807935,CN -3324807936,3324807959,US -3324807960,3324807967,CA -3324807968,3324807983,IN -3324807984,3324807999,TR -3324808000,3324808007,BR -3324808008,3324808015,US -3324808016,3324808023,QA -3324808024,3324808047,US -3324808048,3324808063,SG -3324808064,3324808079,CN -3324808080,3324808119,US -3324808120,3324808127,IN -3324808128,3324808159,US -3324808160,3324808167,NO -3324808168,3324808183,US -3324808184,3324808191,ZA -3324808192,3324808199,US -3324808200,3324808207,BR -3324808208,3324808247,US -3324808248,3324808255,TR -3324808256,3324808279,US -3324808280,3324808287,SG -3324808288,3324808303,CN -3324808304,3324808311,RO -3324808312,3324808351,US -3324808352,3324808383,TW -3324808384,3324808399,US -3324808400,3324808415,IN -3324808416,3324808503,US -3324808504,3324808511,ES -3324808512,3324808527,US -3324808528,3324808543,GB -3324808544,3324808567,US -3324808568,3324808575,IN -3324808576,3324808583,JM -3324808584,3324808599,US -3324808600,3324808607,CN -3324808608,3324808639,US -3324808640,3324808647,AU -3324808648,3324808663,US -3324808664,3324808671,BR -3324808672,3324808719,US -3324808720,3324808735,MX -3324808736,3324808759,CA -3324808760,3324808767,VN -3324808768,3324808775,US -3324808776,3324808783,CN -3324808784,3324808791,US -3324808792,3324808799,IN -3324808800,3324808831,CA -3324808832,3324808847,US -3324808848,3324808855,CA -3324808856,3324808863,SG -3324808864,3324808935,US -3324808936,3324808943,NL -3324808944,3324808951,US -3324808952,3324808959,GB -3324808960,3324809039,US -3324809040,3324809055,DK -3324809056,3324809087,US -3324809088,3324809119,NO -3324809120,3324809143,US -3324809144,3324809151,AU -3324809152,3324809167,BZ -3324809168,3324809175,AU -3324809176,3324809183,CN -3324809184,3324809191,US -3324809192,3324809199,NL -3324809200,3324809207,US -3324809208,3324809215,ES -3324809216,3324809231,US -3324809232,3324809247,NL -3324809248,3324809263,TR -3324809264,3324809279,GB -3324809280,3324809287,RO -3324809288,3324809295,US -3324809296,3324809303,JM -3324809304,3324809311,US -3324809312,3324809375,CA -3324809376,3324809391,BR -3324809392,3324809407,US -3324809408,3324809423,AR -3324809424,3324809439,ES -3324809440,3324809471,CA -3324809472,3324809519,US -3324809520,3324809535,AU -3324809536,3324809551,ES -3324809552,3324809583,US -3324809584,3324809599,CN -3324809600,3324809615,CA -3324809616,3324809663,US -3324809664,3324809695,CA -3324809696,3324809727,RU -3324809728,3324809743,US -3324809744,3324809759,NO -3324809760,3324809791,IN -3324809792,3324809807,AU -3324809808,3324809855,US -3324809856,3324809871,CN -3324809872,3324809903,US -3324809904,3324809911,CN -3324809912,3324809919,US -3324809920,3324809935,IN -3324809936,3324809967,US -3324809968,3324809983,BR -3324809984,3324809991,IN -3324809992,3324809999,US -3324810000,3324810015,JM -3324810016,3324810063,US -3324810064,3324810079,NL -3324810080,3324810087,US -3324810088,3324810095,AF -3324810096,3324810143,US -3324810144,3324810175,CA -3324810176,3324810231,US -3324810232,3324810239,CN -3324810240,3324810271,HK -3324810272,3324810359,US -3324810360,3324810367,IN -3324810368,3324810375,CA -3324810376,3324810391,US -3324810392,3324810399,BR -3324810400,3324810431,CN -3324810432,3324810447,IN -3324810448,3324810463,NL -3324810464,3324810471,US -3324810472,3324810479,PK -3324810480,3324810487,CN -3324810488,3324810495,US -3324810496,3324810511,IN -3324810512,3324810527,GB -3324810528,3324810607,US -3324810608,3324810623,RO -3324810624,3324810655,AE -3324810656,3324810687,IN -3324810688,3324810719,GB -3324810720,3324810727,CN -3324810728,3324810735,QA -3324810736,3324810751,TW -3324810752,3324810759,US -3324810760,3324810767,CA -3324810768,3324810783,US -3324810784,3324810791,CA -3324810792,3324810799,US -3324810800,3324810807,SG -3324810808,3324810823,US -3324810824,3324810831,CN -3324810832,3324810879,US -3324810880,3324810887,IL -3324810888,3324810895,US -3324810896,3324810903,IN -3324810904,3324810911,ZA -3324810912,3324810927,US -3324810928,3324810935,CA -3324810936,3324810943,ES -3324810944,3324810983,US -3324810984,3324811007,CN -3324811008,3324811023,US -3324811024,3324811039,CM -3324811040,3324811047,US -3324811048,3324811055,AU -3324811056,3324811079,US -3324811080,3324811087,CA -3324811088,3324811103,US -3324811104,3324811119,GB -3324811120,3324811127,CN -3324811128,3324811135,US -3324811136,3324811167,CN -3324811168,3324811199,CA -3324811200,3324811231,CN -3324811232,3324811263,GB -3324811264,3324811279,CN -3324811280,3324811295,US -3324811296,3324811303,SG -3324811304,3324811311,CN -3324811312,3324811335,US -3324811336,3324811343,BR -3324811344,3324811359,US -3324811360,3324811391,BR -3324811392,3324811399,US -3324811400,3324811407,GB -3324811408,3324811423,MY -3324811424,3324811439,US -3324811440,3324811447,VN -3324811448,3324811455,BR -3324811456,3324811471,RU -3324811472,3324811511,US -3324811512,3324811519,GB -3324811520,3324811535,US -3324811536,3324811543,CA -3324811544,3324811599,US -3324811600,3324811607,CN -3324811608,3324811615,TR -3324811616,3324811631,AU -3324811632,3324811647,NO -3324811648,3324811679,US -3324811680,3324811687,IN -3324811688,3324811695,CN -3324811696,3324811703,IN -3324811704,3324811711,VN -3324811712,3324811743,US -3324811744,3324811751,GB -3324811752,3324811759,IE -3324811760,3324811815,US -3324811816,3324811823,AU -3324811824,3324811831,US -3324811832,3324811839,CA -3324811840,3324811871,US -3324811872,3324811887,CA -3324811888,3324811895,IN -3324811896,3324811903,GB -3324811904,3324811911,AU -3324811912,3324811919,IL -3324811920,3324811935,US -3324811936,3324811951,IN -3324811952,3324811967,RU -3324811968,3324811983,US -3324811984,3324811999,CN -3324812000,3324812015,CM -3324812016,3324812023,SG -3324812024,3324812031,MX -3324812032,3324812047,CN -3324812048,3324812079,US -3324812080,3324812095,TR -3324812096,3324812119,US -3324812120,3324812127,TR -3324812128,3324812143,US -3324812144,3324812151,NO -3324812152,3324812191,US -3324812192,3324812207,CN -3324812208,3324812215,IN -3324812216,3324812231,US -3324812232,3324812239,ES -3324812240,3324812247,CA -3324812248,3324812255,GB -3324812256,3324812279,US -3324812280,3324812287,CA -3324812288,3324813311,US -3324813312,3324815383,CN -3324815384,3324815559,US -3324815560,3324815583,CN -3324815584,3324815751,US -3324815752,3324815775,CN -3324815776,3324815871,US -3324815872,3324816207,CN -3324816208,3324816215,US -3324816216,3324817927,CN -3324817928,3324818087,US -3324818088,3324818095,CN -3324818096,3324818127,US -3324818128,3324818135,CN -3324818136,3324818159,US -3324818160,3324818207,CN -3324818208,3324818319,US -3324818320,3324818335,CN -3324818336,3324818431,US -3324818432,3324818455,CN -3324818456,3324818463,US -3324818464,3324820487,CN -3324820488,3324820623,US -3324820624,3324820655,CN -3324820656,3324820687,US -3324820688,3324820719,CN -3324820720,3324822015,US -3324822016,3324822527,CA -3324822528,3324824575,US -3324824576,3324824831,DE -3324824832,3324937087,US -3324937088,3324937095,BD -3324937096,3324937103,KH -3324937104,3324937999,US -3324938000,3324938007,PK -3324938008,3324938159,US -3324938160,3324938167,GB -3324938168,3324939415,US -3324939416,3324939423,RO -3324939424,3324939455,US -3324939456,3324939519,IL -3324939520,3324939735,US -3324939736,3324939739,CA -3324939740,3324942855,US -3324942856,3324942863,RO -3324942864,3324943047,US -3324943048,3324943055,CA -3324943056,3324943215,US -3324943216,3324943231,GB -3324943232,3324953087,US -3324953088,3324953151,EE -3324953152,3324954367,US -3324954368,3324954431,EE -3324954432,3324954495,US -3324954496,3324954559,EE -3324954560,3324956223,US -3324956224,3324956255,IN -3324956256,3324957759,US -3324957760,3324957823,EE -3324957824,3324963579,US -3324963580,3324963583,RO -3324963584,3324963839,US -3324963840,3324963903,NL -3324963904,3324964031,US -3324964032,3324964095,EE -3324964096,3324964159,US -3324964160,3324964223,EE -3324964224,3324964939,US -3324964940,3324964943,GB -3324964944,3324964963,US -3324964964,3324964967,GB -3324964968,3324980223,US -3324980224,3324981247,CA -3324981248,3325034495,US -3325034496,3325035519,NZ -3325035520,3325067263,US -3325067264,3325100287,CA -3325100288,3325100543,US -3325101056,3325117311,US -3325117312,3325117319,AF -3325117320,3325119887,US -3325119888,3325119903,MX -3325119904,3325120076,US -3325120077,3325120081,MX -3325120082,3325120423,US -3325120424,3325120431,IN -3325120432,3325122559,US -3325122560,3325123071,CA -3325123072,3325128703,US -3325128704,3325129215,TH -3325129216,3325131775,US -3325131776,3325132031,AU -3325132032,3325132799,US -3325132800,3325133823,CO -3325133824,3325134335,BR -3325134336,3325136127,US -3325136128,3325136383,CA -3325136384,3325142015,US -3325142016,3325142271,CR -3325142272,3325144831,US -3325144832,3325145087,CA -3325145088,3325169663,US -3325169664,3325171711,AR -3325171712,3325190143,US -3325190144,3325191687,CA -3325191688,3325191695,US -3325191696,3325198367,CA -3325198368,3325198375,MY -3325198376,3325198415,CA -3325198416,3325198419,VE -3325198420,3325198423,US -3325198424,3325198559,CA -3325198560,3325198575,PA -3325198576,3325198579,CA -3325198580,3325198583,BR -3325198584,3325198587,CA -3325198588,3325198591,US -3325198592,3325198619,CA -3325198620,3325198623,AR -3325198624,3325198627,ES -3325198628,3325198639,CA -3325198640,3325198643,BR -3325198644,3325198647,BD -3325198648,3325198655,CA -3325198656,3325198659,PE -3325198660,3325198695,CA -3325198696,3325198703,IL -3325198704,3325198719,US -3325198720,3325198727,CA -3325198728,3325198735,FR -3325198736,3325198751,CA -3325198752,3325198755,LK -3325198756,3325198759,US -3325198760,3325198779,CA -3325198780,3325198783,MX -3325198784,3325198811,CA -3325198812,3325198815,US -3325198816,3325198823,DE -3325198824,3325198831,CA -3325198832,3325198847,US -3325198848,3325198855,HR -3325198856,3325198863,ID -3325198864,3325198895,CA -3325198896,3325198911,BE -3325198912,3325198943,NP -3325198944,3325198947,AU -3325198948,3325198967,CA -3325198968,3325198975,US -3325198976,3325199039,CA -3325199040,3325199043,US -3325199044,3325199055,CA -3325199056,3325199063,US -3325199064,3325199071,CA -3325199072,3325199079,US -3325199080,3325199143,CA -3325199144,3325199147,US -3325199148,3325199151,GT -3325199152,3325199255,CA -3325199256,3325199259,BR -3325199260,3325199291,CA -3325199292,3325199295,US -3325199296,3325199303,BR -3325199304,3325199315,CA -3325199316,3325199319,AU -3325199320,3325199343,CA -3325199344,3325199351,CH -3325199352,3325199359,US -3325199360,3325199391,CA -3325199392,3325199399,US -3325199400,3325199491,CA -3325199492,3325199495,BR -3325199496,3325199559,CA -3325199560,3325199567,US -3325199568,3325199615,CA -3325199616,3325199619,BR -3325199620,3325199623,CA -3325199624,3325199627,BE -3325199628,3325199775,CA -3325199776,3325199779,BR -3325199780,3325199783,US -3325199784,3325199807,CA -3325199808,3325199839,US -3325199840,3325199855,BR -3325199856,3325199903,CA -3325199904,3325199911,IN -3325199912,3325199923,CA -3325199924,3325199927,US -3325199928,3325199931,CA -3325199932,3325199935,CN -3325199936,3325199947,CA -3325199948,3325199951,BR -3325199952,3325199959,PT -3325199960,3325199967,CA -3325199968,3325199983,BZ -3325199984,3325199991,GB -3325199992,3325200063,CA -3325200064,3325200071,US -3325200072,3325200079,CA -3325200080,3325200083,US -3325200084,3325200087,CA -3325200088,3325200091,ES -3325200092,3325200095,CA -3325200096,3325200111,BE -3325200112,3325200127,CA -3325200128,3325200191,BD -3325200192,3325200239,CA -3325200240,3325200255,US -3325200256,3325200259,PE -3325200260,3325200279,CA -3325200280,3325200287,NL -3325200288,3325200291,CA -3325200292,3325200295,FR -3325200296,3325200303,IN -3325200304,3325200311,CA -3325200312,3325200315,IN -3325200316,3325200323,CA -3325200324,3325200327,IL -3325200328,3325200447,CA -3325200448,3325200451,AR -3325200452,3325200455,CA -3325200456,3325200459,US -3325200460,3325200463,CA -3325200464,3325200471,US -3325200472,3325200527,CA -3325200528,3325200543,MX -3325200544,3325200567,CA -3325200568,3325200571,US -3325200572,3325200575,UA -3325200576,3325200583,CA -3325200584,3325200591,IN -3325200592,3325200595,CA -3325200596,3325200599,BR -3325200600,3325200695,CA -3325200696,3325200699,BD -3325200700,3325200727,CA -3325200728,3325200731,US -3325200732,3325200739,CA -3325200740,3325200747,US -3325200748,3325200751,CA -3325200752,3325200759,GB -3325200760,3325200767,CA -3325200768,3325200783,US -3325200784,3325200807,CA -3325200808,3325200811,TR -3325200812,3325200815,IE -3325200816,3325200827,CA -3325200828,3325200831,CO -3325200832,3325200863,BA -3325200864,3325200879,ES -3325200880,3325200891,CA -3325200892,3325200895,US -3325200896,3325200939,CA -3325200940,3325200943,US -3325200944,3325200947,CA -3325200948,3325200951,BZ -3325200952,3325201011,CA -3325201012,3325201015,US -3325201016,3325201039,CA -3325201040,3325201047,BR -3325201048,3325201055,US -3325201056,3325201071,CA -3325201072,3325201075,US -3325201076,3325201087,CA -3325201088,3325201103,ID -3325201104,3325201111,US -3325201112,3325201115,CA -3325201116,3325201119,IN -3325201120,3325201187,CA -3325201188,3325201191,BR -3325201192,3325201247,CA -3325201248,3325201255,CL -3325201256,3325201259,AU -3325201260,3325201427,CA -3325201428,3325201431,US -3325201432,3325201439,CA -3325201440,3325201447,IN -3325201448,3325201531,CA -3325201532,3325201535,US -3325201536,3325201551,CA -3325201552,3325201559,US -3325201560,3325201563,IN -3325201564,3325201591,CA -3325201592,3325201599,PT -3325201600,3325201603,CA -3325201604,3325201615,US -3325201616,3325201627,CA -3325201628,3325201631,US -3325201632,3325201647,CA -3325201648,3325201655,US -3325201656,3325201663,ES -3325201664,3325201671,CO -3325201672,3325201739,CA -3325201740,3325201759,US -3325201760,3325201763,SA -3325201764,3325201795,CA -3325201796,3325201799,DM -3325201800,3325201811,CA -3325201812,3325201815,US -3325201816,3325201847,CA -3325201848,3325201851,BR -3325201852,3325201855,ES -3325201856,3325201919,BR -3325201920,3325202015,CA -3325202016,3325202031,ES -3325202032,3325202039,CA -3325202040,3325202079,US -3325202080,3325202115,CA -3325202116,3325202119,US -3325202120,3325202271,CA -3325202272,3325202275,GB -3325202276,3325202279,US -3325202280,3325202327,CA -3325202328,3325202331,AU -3325202332,3325202367,CA -3325202368,3325202371,PH -3325202372,3325202395,CA -3325202396,3325202399,IN -3325202400,3325204479,CA -3325204480,3325205503,US -3325205504,3325206428,CA -3325206429,3325206429,US -3325206430,3325206531,CA -3325206532,3325206535,CO -3325206536,3325206551,CA -3325206552,3325206555,US -3325206556,3325206559,CZ -3325206560,3325206591,IN -3325206592,3325206623,CA -3325206624,3325206624,RO -3325206625,3325206626,CA -3325206627,3325206627,RO -3325206628,3325206635,CA -3325206636,3325206639,ES -3325206640,3325206671,US -3325206672,3325206679,BR -3325206680,3325206683,CL -3325206684,3325206687,SE -3325206688,3325206719,US -3325206720,3325206799,CA -3325206800,3325206815,US -3325206816,3325206831,CA -3325206832,3325206839,US -3325206840,3325206847,BG -3325206848,3325206863,MX -3325206864,3325206879,CA -3325206880,3325206911,BA -3325206912,3325206915,BR -3325206916,3325206919,US -3325206920,3325206935,CA -3325206936,3325206943,HR -3325206944,3325207023,CA -3325207024,3325207039,US -3325207040,3325207043,CA -3325207044,3325207051,BR -3325207052,3325207055,US -3325207056,3325207059,GB -3325207060,3325207071,CA -3325207072,3325207103,MX -3325207104,3325207131,CA -3325207132,3325207135,US -3325207136,3325207167,BD -3325207168,3325207283,CA -3325207284,3325207287,US -3325207288,3325207379,CA -3325207380,3325207383,US -3325207384,3325207415,CA -3325207416,3325207423,US -3325207424,3325207439,UA -3325207440,3325207503,CA -3325207504,3325207519,US -3325207520,3325207591,CA -3325207592,3325207599,EC -3325207600,3325207699,CA -3325207700,3325207703,LU -3325207704,3325207775,CA -3325207776,3325207783,US -3325207784,3325207791,CA -3325207792,3325207795,GB -3325207796,3325207807,CA -3325207808,3325207935,US -3325207936,3325208063,CA -3325208064,3325208095,BS -3325208096,3325208119,CA -3325208120,3325208123,US -3325208124,3325208171,CA -3325208172,3325208175,BR -3325208176,3325208187,CA -3325208188,3325208191,IN -3325208192,3325208255,CA -3325208256,3325208327,US -3325208328,3325208363,CA -3325208364,3325208367,PA -3325208368,3325208375,US -3325208376,3325208383,BR -3325208384,3325208391,US -3325208392,3325208403,CA -3325208404,3325208415,US -3325208416,3325208487,CA -3325208488,3325208491,AE -3325208492,3325208495,US -3325208496,3325208499,IN -3325208500,3325208543,CA -3325208544,3325208547,US -3325208548,3325208643,CA -3325208644,3325208647,IN -3325208648,3325208747,CA -3325208748,3325208751,CZ -3325208752,3325208767,CA -3325208768,3325208783,US -3325208784,3325208791,CA -3325208792,3325208799,US -3325208800,3325208827,CA -3325208828,3325208831,EG -3325208832,3325208835,CO -3325208836,3325208939,CA -3325208940,3325208943,AU -3325208944,3325208947,BR -3325208948,3325208999,CA -3325209000,3325209003,AU -3325209004,3325209007,BR -3325209008,3325209023,CA -3325209024,3325209055,US -3325209056,3325209083,CA -3325209084,3325209087,US -3325209088,3325209091,CA -3325209092,3325209095,AR -3325209096,3325209099,CA -3325209100,3325209103,DM -3325209104,3325209151,CA -3325209152,3325209155,US -3325209156,3325209163,BZ -3325209164,3325209167,GB -3325209168,3325209183,CA -3325209184,3325209215,AR -3325209216,3325209231,CA -3325209232,3325209247,DE -3325209248,3325209295,CA -3325209296,3325209311,US -3325209312,3325209327,CA -3325209328,3325209343,US -3325209344,3325209359,RO -3325209360,3325209379,CA -3325209380,3325209383,CH -3325209384,3325209387,CA -3325209388,3325209407,US -3325209408,3325209411,GB -3325209412,3325209435,CA -3325209436,3325209439,NG -3325209440,3325209447,CA -3325209448,3325209451,MT -3325209452,3325209475,CA -3325209476,3325209479,US -3325209480,3325209483,GB -3325209484,3325209543,CA -3325209544,3325209551,US -3325209552,3325209567,CA -3325209568,3325209575,US -3325209576,3325209579,CA -3325209580,3325209583,US -3325209584,3325209639,CA -3325209640,3325209647,TR -3325209648,3325209655,CA -3325209656,3325209663,CH -3325209664,3325209679,US -3325209680,3325209695,CA -3325209696,3325209711,SN -3325209712,3325209727,CA -3325209728,3325209759,IE -3325209760,3325209767,GB -3325209768,3325209775,US -3325209776,3325209779,CA -3325209780,3325209783,ID -3325209784,3325209879,CA -3325209880,3325209887,BD -3325209888,3325209915,CA -3325209916,3325209919,FR -3325209920,3325209939,CA -3325209940,3325209943,US -3325209944,3325209951,CA -3325209952,3325209955,ID -3325209956,3325209959,CA -3325209960,3325209963,US -3325209964,3325209967,CA -3325209968,3325209983,US -3325209984,3325209987,DE -3325209988,3325209991,CA -3325209992,3325209995,US -3325209996,3325210011,CA -3325210012,3325210015,US -3325210016,3325210031,CA -3325210032,3325210039,FR -3325210040,3325210043,PK -3325210044,3325210047,BR -3325210048,3325210063,CA -3325210064,3325210067,BR -3325210068,3325210071,IE -3325210072,3325210351,CA -3325210352,3325210367,HK -3325210368,3325210399,CA -3325210400,3325210431,SE -3325210432,3325210435,IN -3325210436,3325210439,CA -3325210440,3325210447,PA -3325210448,3325210451,FR -3325210452,3325210455,ES -3325210456,3325210511,CA -3325210512,3325210519,GB -3325210520,3325210631,CA -3325210632,3325210635,US -3325210636,3325210639,FR -3325210640,3325210643,BR -3325210644,3325210647,US -3325210648,3325210663,CA -3325210664,3325210687,BR -3325210688,3325210703,CA -3325210704,3325210707,US -3325210708,3325210711,CA -3325210712,3325210719,IN -3325210720,3325210751,US -3325210752,3325210755,CA -3325210756,3325210759,PH -3325210760,3325210767,BR -3325210768,3325210771,AR -3325210772,3325210775,CA -3325210776,3325210779,US -3325210780,3325210787,CA -3325210788,3325210791,BR -3325210792,3325210799,US -3325210800,3325210815,AE -3325210816,3325210823,BR -3325210824,3325210847,CA -3325210848,3325210851,US -3325210852,3325210863,CA -3325210864,3325210879,US -3325210880,3325210951,CA -3325210952,3325210955,BR -3325210956,3325210959,VN -3325210960,3325210975,IN -3325210976,3325211071,CA -3325211072,3325211087,BD -3325211088,3325211091,US -3325211092,3325211095,CA -3325211096,3325211103,US -3325211104,3325211115,CA -3325211116,3325211119,BR -3325211120,3325211127,US -3325211128,3325211151,CA -3325211152,3325211155,IN -3325211156,3325211175,CA -3325211176,3325211183,US -3325211184,3325211235,CA -3325211236,3325211239,FR -3325211240,3325211279,CA -3325211280,3325211295,CN -3325211296,3325211299,US -3325211300,3325211411,CA -3325211412,3325211415,IN -3325211416,3325211419,CA -3325211420,3325211423,US -3325211424,3325211647,CA -3325211648,3325211807,US -3325211808,3325211839,CA -3325211840,3325211855,US -3325211856,3325211859,CL -3325211860,3325211863,CA -3325211864,3325211871,NO -3325211872,3325211883,CA -3325211884,3325211887,US -3325211888,3325211895,RO -3325211896,3325211967,CA -3325211968,3325211999,ES -3325212000,3325212007,US -3325212008,3325212063,CA -3325212064,3325212071,US -3325212072,3325212087,CA -3325212088,3325212091,BZ -3325212092,3325212095,US -3325212096,3325212119,CA -3325212120,3325212127,US -3325212128,3325212143,CA -3325212144,3325212151,US -3325212152,3325212155,MX -3325212156,3325212167,CA -3325212168,3325212171,BZ -3325212172,3325212175,IN -3325212176,3325212191,CA -3325212192,3325212199,AR -3325212200,3325212215,CA -3325212216,3325212223,HR -3325212224,3325212295,CA -3325212296,3325212303,IN -3325212304,3325212407,CA -3325212408,3325212411,PE -3325212412,3325212495,CA -3325212496,3325212503,FR -3325212504,3325212511,HU -3325212512,3325212515,CY -3325212516,3325212559,CA -3325212560,3325212575,BR -3325212576,3325212579,PE -3325212580,3325212583,CA -3325212584,3325212587,HN -3325212588,3325212591,BR -3325212592,3325212611,CA -3325212612,3325212615,BR -3325212616,3325212647,CA -3325212648,3325212655,US -3325212656,3325212719,CA -3325212720,3325212727,ID -3325212728,3325212731,RO -3325212732,3325212771,CA -3325212772,3325212775,US -3325212776,3325212927,CA -3325212928,3325212943,LK -3325212944,3325213023,CA -3325213024,3325213055,SE -3325213056,3325213071,US -3325213072,3325213087,NZ -3325213088,3325213103,CA -3325213104,3325213111,US -3325213112,3325213115,CA -3325213116,3325213119,US -3325213120,3325213227,CA -3325213228,3325213231,US -3325213232,3325213423,CA -3325213424,3325213431,US -3325213432,3325213435,CA -3325213436,3325213439,US -3325213440,3325213447,CA -3325213448,3325213451,BD -3325213452,3325213471,CA -3325213472,3325213479,IN -3325213480,3325213483,CA -3325213484,3325213487,VE -3325213488,3325213535,CA -3325213536,3325213543,TR -3325213544,3325213551,CA -3325213552,3325213555,ES -3325213556,3325213567,CA -3325213568,3325213571,IE -3325213572,3325213575,CA -3325213576,3325213591,IN -3325213592,3325213607,CA -3325213608,3325213615,US -3325213616,3325213631,CA -3325213632,3325213639,TR -3325213640,3325213655,CA -3325213656,3325213663,US -3325213664,3325213679,CA -3325213680,3325213687,BR -3325213688,3325213695,US -3325213696,3325213711,CA -3325213712,3325213715,AR -3325213716,3325213951,CA -3325213952,3325213983,BA -3325213984,3325214015,CA -3325214016,3325214063,US -3325214064,3325214071,CA -3325214072,3325214079,AE -3325214080,3325214095,CA -3325214096,3325214111,IN -3325214112,3325214143,CA -3325214144,3325214147,MA -3325214148,3325214151,CA -3325214152,3325214155,US -3325214156,3325214163,CA -3325214164,3325214167,BR -3325214168,3325214187,CA -3325214188,3325214191,US -3325214192,3325214255,CA -3325214256,3325214259,SA -3325214260,3325214263,US -3325214264,3325214375,CA -3325214376,3325214383,US -3325214384,3325214399,CA -3325214400,3325214403,PL -3325214404,3325214463,CA -3325214464,3325214479,AU -3325214480,3325214499,CA -3325214500,3325214503,PA -3325214504,3325214583,CA -3325214584,3325214591,US -3325214592,3325214623,CA -3325214624,3325214639,DE -3325214640,3325214667,CA -3325214668,3325214671,US -3325214672,3325214703,CA -3325214704,3325214719,AU -3325214720,3325214735,CA -3325214736,3325214739,US -3325214740,3325214783,CA -3325214784,3325214791,US -3325214792,3325214815,CA -3325214816,3325214819,US -3325214820,3325214823,IN -3325214824,3325214831,BR -3325214832,3325214999,CA -3325215000,3325215007,BZ -3325215008,3325215055,CA -3325215056,3325215059,IT -3325215060,3325215131,CA -3325215132,3325215135,BZ -3325215136,3325215175,CA -3325215176,3325215183,VI -3325215184,3325215203,CA -3325215204,3325215207,GB -3325215208,3325215211,FR -3325215212,3325215263,CA -3325215264,3325215279,BE -3325215280,3325215299,US -3325215300,3325215303,IN -3325215304,3325215319,CA -3325215320,3325215327,BR -3325215328,3325215335,CA -3325215336,3325215343,US -3325215344,3325215455,CA -3325215456,3325215459,US -3325215460,3325215467,CA -3325215468,3325215471,BR -3325215472,3325215475,ES -3325215476,3325215479,PE -3325215480,3325215495,CA -3325215496,3325215503,BR -3325215504,3325215611,CA -3325215612,3325215615,BR -3325215616,3325215667,CA -3325215668,3325215675,BR -3325215676,3325215719,CA -3325215720,3325215727,MX -3325215728,3325215731,CA -3325215732,3325215735,BR -3325215736,3325215743,CA -3325215744,3325215751,IN -3325215752,3325215759,CA -3325215760,3325215767,BR -3325215768,3325215807,CA -3325215808,3325215839,US -3325215840,3325215863,CA -3325215864,3325215871,BR -3325215872,3325215903,US -3325215904,3325215911,DE -3325215912,3325215915,IN -3325215916,3325215919,GB -3325215920,3325215927,US -3325215928,3325215931,CA -3325215932,3325215935,BR -3325215936,3325215951,CA -3325215952,3325215967,BE -3325215968,3325215983,CA -3325215984,3325215999,VE -3325216000,3325216007,CA -3325216008,3325216015,MX -3325216016,3325216023,CA -3325216024,3325216027,MX -3325216028,3325216031,CA -3325216032,3325216035,IN -3325216036,3325216043,CA -3325216044,3325216047,EG -3325216048,3325216063,CA -3325216064,3325216067,ES -3325216068,3325216071,CA -3325216072,3325216079,US -3325216080,3325216095,BR -3325216096,3325216115,CA -3325216116,3325216119,US -3325216120,3325216127,CA -3325216128,3325216159,MX -3325216160,3325216247,CA -3325216248,3325216251,BR -3325216252,3325216319,CA -3325216320,3325216327,US -3325216328,3325216359,CA -3325216360,3325216363,GB -3325216364,3325216367,CA -3325216368,3325216383,US -3325216384,3325216399,CA -3325216400,3325216415,BR -3325216416,3325216447,CA -3325216448,3325216463,FR -3325216464,3325216527,CA -3325216528,3325216531,US -3325216532,3325216707,CA -3325216708,3325216711,US -3325216712,3325216855,CA -3325216856,3325216859,VG -3325216860,3325216895,CA -3325216896,3325216927,PA -3325216928,3325216975,CA -3325216976,3325216979,FR -3325216980,3325217167,CA -3325217168,3325217183,PE -3325217184,3325217199,CA -3325217200,3325217215,US -3325217216,3325217223,VE -3325217224,3325217227,AU -3325217228,3325217231,CA -3325217232,3325217235,US -3325217236,3325217243,CA -3325217244,3325217247,US -3325217248,3325217279,BA -3325217280,3325217307,CA -3325217308,3325217311,HK -3325217312,3325217403,CA -3325217404,3325217407,FR -3325217408,3325217471,CA -3325217472,3325217503,IE -3325217504,3325217527,CA -3325217528,3325217531,HK -3325217532,3325217651,CA -3325217652,3325217655,AE -3325217656,3325217663,CA -3325217664,3325217667,CO -3325217668,3325217695,CA -3325217696,3325217699,US -3325217700,3325217703,BR -3325217704,3325217707,US -3325217708,3325217711,CA -3325217712,3325217715,US -3325217716,3325217823,CA -3325217824,3325217831,BR -3325217832,3325217835,CA -3325217836,3325217839,CL -3325217840,3325217855,CA -3325217856,3325217887,BR -3325217888,3325217939,CA -3325217940,3325217943,US -3325217944,3325217951,CO -3325217952,3325217959,CA -3325217960,3325217963,US -3325217964,3325217971,CA -3325217972,3325217975,US -3325217976,3325217983,CA -3325217984,3325217987,US -3325217988,3325218015,CA -3325218016,3325218031,US -3325218032,3325218039,CA -3325218040,3325218047,US -3325218048,3325218131,CA -3325218132,3325218135,US -3325218136,3325218139,CA -3325218140,3325218147,GB -3325218148,3325218159,CA -3325218160,3325218167,US -3325218168,3325218207,CA -3325218208,3325218239,US -3325218240,3325218251,CA -3325218252,3325218255,PL -3325218256,3325218447,CA -3325218448,3325218455,AR -3325218456,3325218479,CA -3325218480,3325218483,BR -3325218484,3325218487,CA -3325218488,3325218491,US -3325218492,3325218519,CA -3325218520,3325218523,US -3325218524,3325218527,CA -3325218528,3325218531,BR -3325218532,3325218535,US -3325218536,3325218559,CA -3325218560,3325218567,US -3325218568,3325218583,CA -3325218584,3325218591,IN -3325218592,3325218615,CA -3325218616,3325218623,BR -3325218624,3325218663,CA -3325218664,3325218667,US -3325218668,3325218671,CA -3325218672,3325218687,IT -3325218688,3325218703,CA -3325218704,3325218719,US -3325218720,3325218783,CA -3325218784,3325218815,AU -3325218816,3325219079,CA -3325219080,3325219083,BR -3325219084,3325219087,BZ -3325219088,3325219091,CA -3325219092,3325219095,VE -3325219096,3325219175,CA -3325219176,3325219183,US -3325219184,3325219407,CA -3325219408,3325219411,FR -3325219412,3325219415,CA -3325219416,3325219419,US -3325219420,3325219423,BR -3325219424,3325219455,CA -3325219456,3325219459,US -3325219460,3325219463,BR -3325219464,3325219467,CA -3325219468,3325219471,DE -3325219472,3325219475,US -3325219476,3325219479,CA -3325219480,3325219483,IN -3325219484,3325219503,CA -3325219504,3325219511,VG -3325219512,3325219531,CA -3325219532,3325219535,BR -3325219536,3325219551,PK -3325219552,3325219583,CA -3325219584,3325219599,US -3325219600,3325219615,GB -3325219616,3325219631,CA -3325219632,3325219647,US -3325219648,3325219695,CA -3325219696,3325219699,US -3325219700,3325219759,CA -3325219760,3325219767,US -3325219768,3325219775,GB -3325219776,3325219779,PA -3325219780,3325219791,CA -3325219792,3325219799,UY -3325219800,3325219807,CA -3325219808,3325219811,US -3325219812,3325219839,CA -3325219840,3325219871,TN -3325219872,3325219875,BR -3325219876,3325219903,CA -3325219904,3325219931,US -3325219932,3325219935,CA -3325219936,3325219951,US -3325219952,3325219983,CA -3325219984,3325219999,US -3325220000,3325220011,CA -3325220012,3325220015,AU -3325220016,3325220027,CA -3325220028,3325220031,US -3325220032,3325220039,CA -3325220040,3325220043,US -3325220044,3325220047,BR -3325220048,3325220051,AU -3325220052,3325220055,CA -3325220056,3325220063,GB -3325220064,3325220107,CA -3325220108,3325220111,PE -3325220112,3325220295,CA -3325220296,3325220303,FR -3325220304,3325220407,CA -3325220408,3325220411,US -3325220412,3325220415,BZ -3325220416,3325220511,CA -3325220512,3325220519,BR -3325220520,3325220543,CA -3325220544,3325220559,US -3325220560,3325220579,CA -3325220580,3325220583,BZ -3325220584,3325220587,US -3325220588,3325220607,CA -3325220608,3325220623,US -3325220624,3325220635,CA -3325220636,3325220636,US -3325220637,3325220651,CA -3325220652,3325220655,BR -3325220656,3325220703,CA -3325220704,3325220719,US -3325220720,3325220831,CA -3325220832,3325220879,US -3325220880,3325220895,CA -3325220896,3325220927,FR -3325220928,3325220959,CA -3325220960,3325220967,EC -3325220968,3325221043,CA -3325221044,3325221047,CL -3325221048,3325221051,BR -3325221052,3325221055,CA -3325221056,3325221119,BR -3325221120,3325221183,CA -3325221184,3325221199,US -3325221200,3325221215,BR -3325221216,3325221263,CA -3325221264,3325221279,TW -3325221280,3325221439,CA -3325221440,3325221443,PE -3325221444,3325221451,CA -3325221452,3325221455,US -3325221456,3325221467,CA -3325221468,3325221471,BR -3325221472,3325221503,CA -3325221504,3325221535,PT -3325221536,3325221551,CA -3325221552,3325221555,PE -3325221556,3325221567,CA -3325221568,3325221575,AU -3325221576,3325221583,CA -3325221584,3325221599,US -3325221600,3325221615,CA -3325221616,3325221623,GB -3325221624,3325221627,MX -3325221628,3325221727,CA -3325221728,3325221731,US -3325221732,3325221739,CA -3325221740,3325221743,BR -3325221744,3325221751,CA -3325221752,3325221755,IN -3325221756,3325221759,PE -3325221760,3325221779,CA -3325221780,3325221783,US -3325221784,3325221787,BR -3325221788,3325221791,VN -3325221792,3325221795,CA -3325221796,3325221799,US -3325221800,3325221807,BR -3325221808,3325221831,CA -3325221832,3325221839,BG -3325221840,3325221903,CA -3325221904,3325221907,US -3325221908,3325221911,CA -3325221912,3325221915,ES -3325221916,3325221927,CA -3325221928,3325221931,IN -3325221932,3325221999,CA -3325222000,3325222015,CH -3325222016,3325222143,US -3325222144,3325222179,CA -3325222180,3325222183,US -3325222184,3325222203,CA -3325222204,3325222207,BY -3325222208,3325222351,CA -3325222352,3325222359,US -3325222360,3325222391,CA -3325222392,3325222395,TR -3325222396,3325222399,FR -3325222400,3325222463,US -3325222464,3325222567,CA -3325222568,3325222571,US -3325222572,3325222575,LK -3325222576,3325222607,CA -3325222608,3325222623,US -3325222624,3325222627,DE -3325222628,3325222643,CA -3325222644,3325222647,VN -3325222648,3325222651,LB -3325222652,3325222655,US -3325222656,3325222667,CA -3325222668,3325222671,MX -3325222672,3325222687,CA -3325222688,3325222703,GB -3325222704,3325222719,CA -3325222720,3325222735,AU -3325222736,3325222751,US -3325222752,3325222783,MX -3325222784,3325222843,CA -3325222844,3325222847,US -3325222848,3325222851,CA -3325222852,3325222855,BZ -3325222856,3325222947,CA -3325222948,3325222951,AE -3325222952,3325222963,CA -3325222964,3325222967,VE -3325222968,3325222983,CA -3325222984,3325222987,TW -3325222988,3325223027,CA -3325223028,3325223031,US -3325223032,3325223039,CA -3325223040,3325223043,AR -3325223044,3325223047,US -3325223048,3325223059,CA -3325223060,3325223063,PE -3325223064,3325223079,CA -3325223080,3325223083,US -3325223084,3325223087,BY -3325223088,3325223095,NL -3325223096,3325223099,CA -3325223100,3325223103,BR -3325223104,3325223119,US -3325223120,3325223231,CA -3325223232,3325223239,BR -3325223240,3325223279,CA -3325223280,3325223283,FR -3325223284,3325223303,CA -3325223304,3325223311,RO -3325223312,3325223335,CA -3325223336,3325223343,US -3325223344,3325223347,CA -3325223348,3325223351,IN -3325223352,3325223355,MX -3325223356,3325223375,CA -3325223376,3325223391,US -3325223392,3325223399,CA -3325223400,3325223407,US -3325223408,3325223427,CA -3325223428,3325223431,US -3325223432,3325223435,CA -3325223436,3325223439,MX -3325223440,3325223463,CA -3325223464,3325223471,US -3325223472,3325223535,CA -3325223536,3325223551,AT -3325223552,3325223583,IE -3325223584,3325223619,CA -3325223620,3325223631,BR -3325223632,3325223643,CA -3325223644,3325223647,CZ -3325223648,3325223663,KN -3325223664,3325223723,CA -3325223724,3325223727,US -3325223728,3325223795,CA -3325223796,3325223799,US -3325223800,3325223807,CA -3325223808,3325223811,HK -3325223812,3325223839,CA -3325223840,3325223843,PE -3325223844,3325223847,CA -3325223848,3325223855,MX -3325223856,3325223871,AU -3325223872,3325223907,CA -3325223908,3325223911,VE -3325223912,3325223919,CA -3325223920,3325223935,BR -3325223936,3325223967,CA -3325223968,3325223991,US -3325223992,3325224031,CA -3325224032,3325224039,US -3325224040,3325224043,CO -3325224044,3325224047,CA -3325224048,3325224055,GB -3325224056,3325224063,CA -3325224064,3325224067,FR -3325224068,3325224071,US -3325224072,3325224079,HR -3325224080,3325224087,CA -3325224088,3325224091,BZ -3325224092,3325224383,CA -3325224384,3325224391,GB -3325224392,3325224455,CA -3325224456,3325224463,FR -3325224464,3325224479,CA -3325224480,3325224511,US -3325224512,3325224551,CA -3325224552,3325224559,BR -3325224560,3325224647,CA -3325224648,3325224651,IN -3325224652,3325224671,CA -3325224672,3325224675,US -3325224676,3325224683,CA -3325224684,3325224687,VE -3325224688,3325224695,US -3325224696,3325224699,CA -3325224700,3325224703,BR -3325224704,3325224719,US -3325224720,3325224735,CA -3325224736,3325224751,LK -3325224752,3325224767,CA -3325224768,3325224783,FR -3325224784,3325224795,CA -3325224796,3325224799,HR -3325224800,3325224807,CA -3325224808,3325224815,GB -3325224816,3325224823,FR -3325224824,3325224831,CA -3325224832,3325224847,US -3325224848,3325224855,CA -3325224856,3325224863,MX -3325224864,3325224871,CA -3325224872,3325224875,IL -3325224876,3325224879,CA -3325224880,3325224895,US -3325224896,3325224919,CA -3325224920,3325224927,DJ -3325224928,3325224943,CA -3325224944,3325224947,DE -3325224948,3325224951,CA -3325224952,3325224955,GB -3325224956,3325225087,CA -3325225088,3325225095,US -3325225096,3325225103,IN -3325225104,3325225135,CA -3325225136,3325225139,US -3325225140,3325225203,CA -3325225204,3325225207,US -3325225208,3325225247,CA -3325225248,3325225263,TR -3325225264,3325225287,CA -3325225288,3325225291,GB -3325225292,3325225295,CA -3325225296,3325225299,US -3325225300,3325225315,CA -3325225316,3325225319,ES -3325225320,3325225367,CA -3325225368,3325225371,US -3325225372,3325225407,CA -3325225408,3325225411,IN -3325225412,3325225415,CA -3325225416,3325225419,AU -3325225420,3325225439,CA -3325225440,3325225455,HK -3325225456,3325225463,US -3325225464,3325225467,BR -3325225468,3325225483,CA -3325225484,3325225487,CL -3325225488,3325225495,CA -3325225496,3325225499,MX -3325225500,3325225631,CA -3325225632,3325225647,US -3325225648,3325225671,CA -3325225672,3325225675,US -3325225676,3325225727,CA -3325225728,3325225735,RO -3325225736,3325225743,US -3325225744,3325225775,CA -3325225776,3325225783,US -3325225784,3325225799,CA -3325225800,3325225807,IN -3325225808,3325225819,CA -3325225820,3325225823,US -3325225824,3325225899,CA -3325225900,3325225911,CY -3325225912,3325225915,CA -3325225916,3325225919,BR -3325225920,3325225923,EG -3325225924,3325225927,IN -3325225928,3325225943,CA -3325225944,3325225951,PL -3325225952,3325225967,MX -3325225968,3325225983,US -3325225984,3325226003,CA -3325226004,3325226007,MX -3325226008,3325226023,CA -3325226024,3325226027,FR -3325226028,3325226031,BR -3325226032,3325226039,HK -3325226040,3325226071,CA -3325226072,3325226075,BR -3325226076,3325226087,CA -3325226088,3325226091,EC -3325226092,3325226095,CA -3325226096,3325226099,PL -3325226100,3325226159,CA -3325226160,3325226167,FR -3325226168,3325226179,CA -3325226180,3325226183,BR -3325226184,3325226187,US -3325226188,3325226239,CA -3325226240,3325226255,US -3325226256,3325226287,CA -3325226288,3325226303,GB -3325226304,3325226307,CA -3325226308,3325226311,FR -3325226312,3325226315,DE -3325226316,3325226319,CA -3325226320,3325226323,IN -3325226324,3325226343,CA -3325226344,3325226347,IN -3325226348,3325226435,CA -3325226436,3325226439,MA -3325226440,3325226443,VN -3325226444,3325226447,CA -3325226448,3325226451,LT -3325226452,3325226455,CA -3325226456,3325226463,IN -3325226464,3325226495,CA -3325226496,3325227007,US -3325227008,3325227039,CA -3325227040,3325227071,BR -3325227072,3325227087,US -3325227088,3325227107,CA -3325227108,3325227111,AR -3325227112,3325227119,US -3325227120,3325227223,CA -3325227224,3325227227,GB -3325227228,3325227279,CA -3325227280,3325227295,BR -3325227296,3325227331,CA -3325227332,3325227335,US -3325227336,3325227371,CA -3325227372,3325227375,AU -3325227376,3325227383,CA -3325227384,3325227387,MA -3325227388,3325227391,CA -3325227392,3325227395,PK -3325227396,3325227399,CA -3325227400,3325227403,LK -3325227404,3325227455,CA -3325227456,3325227471,US -3325227472,3325227483,CA -3325227484,3325227487,IT -3325227488,3325227503,RO -3325227504,3325227519,CA -3325227520,3325227527,VG -3325227528,3325227539,CA -3325227540,3325227543,CZ -3325227544,3325227551,BD -3325227552,3325227555,BR -3325227556,3325227567,CA -3325227568,3325227571,IN -3325227572,3325227575,KE -3325227576,3325227583,US -3325227584,3325227587,CA -3325227588,3325227591,IN -3325227592,3325227599,CA -3325227600,3325227615,CY -3325227616,3325227627,CA -3325227628,3325227631,BZ -3325227632,3325227639,BR -3325227640,3325227791,CA -3325227792,3325227799,US -3325227800,3325227871,CA -3325227872,3325227875,BR -3325227876,3325227879,US -3325227880,3325227999,CA -3325228000,3325228015,IN -3325228016,3325228063,CA -3325228064,3325228159,US -3325228160,3325228175,AE -3325228176,3325228255,CA -3325228256,3325228263,US -3325228264,3325228287,CA -3325228288,3325228415,US -3325228416,3325228615,CA -3325228616,3325228623,US -3325228624,3325228675,CA -3325228676,3325228683,US -3325228684,3325228687,CA -3325228688,3325228691,BR -3325228692,3325228735,CA -3325228736,3325228739,FR -3325228740,3325228783,CA -3325228784,3325228787,US -3325228788,3325228807,CA -3325228808,3325228815,PL -3325228816,3325228823,CA -3325228824,3325228831,BR -3325228832,3325228863,US -3325228864,3325228871,CA -3325228872,3325228875,IN -3325228876,3325228931,CA -3325228932,3325228935,LU -3325228936,3325228991,CA -3325228992,3325229007,BR -3325229008,3325229071,CA -3325229072,3325229079,IN -3325229080,3325229083,CA -3325229084,3325229087,US -3325229088,3325229175,CA -3325229176,3325229183,IN -3325229184,3325229247,US -3325229248,3325229255,CA -3325229256,3325229263,BR -3325229264,3325229279,CA -3325229280,3325229295,US -3325229296,3325229311,FR -3325229312,3325229327,CA -3325229328,3325229331,US -3325229332,3325229351,CA -3325229352,3325229359,BR -3325229360,3325229411,CA -3325229412,3325229415,RU -3325229416,3325229459,CA -3325229460,3325229471,BR -3325229472,3325229487,US -3325229488,3325229499,CA -3325229500,3325229503,IN -3325229504,3325229511,CA -3325229512,3325229515,IN -3325229516,3325229519,CA -3325229520,3325229527,US -3325229528,3325229535,CA -3325229536,3325229551,FR -3325229552,3325229555,US -3325229556,3325229591,CA -3325229592,3325229599,US -3325229600,3325229615,CA -3325229616,3325229619,MX -3325229620,3325229627,CA -3325229628,3325229631,US -3325229632,3325229647,CA -3325229648,3325229663,FR -3325229664,3325229695,MX -3325229696,3325229747,CA -3325229748,3325229755,CY -3325229756,3325229795,CA -3325229796,3325229799,PA -3325229800,3325229815,CA -3325229816,3325229823,US -3325229824,3325229831,CA -3325229832,3325229835,US -3325229836,3325229855,CA -3325229856,3325229887,US -3325229888,3325229955,CA -3325229956,3325229959,US -3325229960,3325229975,CA -3325229976,3325229979,IN -3325229980,3325229983,BR -3325229984,3325229991,CA -3325229992,3325229999,IN -3325230000,3325230047,CA -3325230048,3325230055,AE -3325230056,3325230059,CA -3325230060,3325230071,US -3325230072,3325230079,CA -3325230080,3325230095,US -3325230096,3325230103,CA -3325230104,3325230111,US -3325230112,3325230123,CA -3325230124,3325230127,CL -3325230128,3325230135,CA -3325230136,3325230143,FR -3325230144,3325230167,CA -3325230168,3325230171,PK -3325230172,3325230175,US -3325230176,3325230319,CA -3325230320,3325230323,US -3325230324,3325230447,CA -3325230448,3325230455,US -3325230456,3325230495,CA -3325230496,3325230511,US -3325230512,3325230527,CA -3325230528,3325230543,MU -3325230544,3325230559,US -3325230560,3325230715,CA -3325230716,3325230719,AR -3325230720,3325230751,US -3325230752,3325230779,CA -3325230780,3325230783,BR -3325230784,3325230815,CA -3325230816,3325230847,GB -3325230848,3325230983,CA -3325230984,3325230991,US -3325230992,3325231007,FR -3325231008,3325231071,CA -3325231072,3325231079,US -3325231080,3325231095,CA -3325231096,3325231099,US -3325231100,3325231103,BR -3325231104,3325232127,US -3325233152,3325234175,US -3325234176,3325234431,SA -3325234432,3325249279,US -3325249280,3325249535,CO -3325249536,3325250303,US -3325250304,3325250559,CA -3325250560,3325256703,US -3325257216,3325257727,US -3325257728,3325258751,CA -3325258752,3325259775,US -3325259776,3325261311,CA -3325261312,3325265919,US -3325265920,3325266943,CA -3325266944,3325267711,US -3325267712,3325268735,SY -3325268736,3325269759,US -3325269760,3325270015,CA -3325270016,3325271039,US -3325271040,3325271295,CA -3325271296,3325281023,US -3325281024,3325281279,NZ -3325281280,3325284863,US -3325284864,3325285119,AU -3325285376,3325290239,US -3325290240,3325290495,CA -3325290496,3325296383,US -3325296384,3325296639,CA -3325296640,3325304319,US -3325304320,3325304575,AS -3325304576,3325304831,US -3325304832,3325305087,CA -3325305088,3325306111,US -3325306112,3325306367,BR -3325306368,3325307903,US -3325307904,3325308927,GB -3325308928,3325313023,CA -3325313024,3325323687,US -3325323688,3325323695,GB -3325323696,3325337599,US -3325337600,3325338111,GB -3325338112,3325340671,US -3325340672,3325340927,CA -3325340928,3325362175,US -3325362176,3325427711,CA -3325427712,3325427967,US -3325427968,3325430527,ZA -3325430528,3325431551,US -3325431552,3325443583,ZA -3325443584,3325444095,US -3325444096,3325448447,ZA -3325448448,3325448959,US -3325448960,3325450239,ZA -3325450240,3325451007,US -3325451008,3325451263,ZA -3325451264,3325452799,US -3325452800,3325453311,ZA -3325453312,3325454335,CA -3325454336,3325463807,US -3325463808,3325464063,ZA -3325464064,3325465087,NA -3325465088,3325466623,ZA -3325466624,3325467135,US -3325467136,3325469695,ZA -3325469696,3325469951,US -3325469952,3325470207,ZA -3325470208,3325471231,US -3325471232,3325471487,ZA -3325471488,3325471999,US -3325472000,3325474303,ZA -3325474304,3325474559,US -3325474560,3325478911,ZA -3325478912,3325479423,US -3325479424,3325481727,ZA -3325481728,3325481983,US -3325481984,3325483007,CA -3325483008,3325483775,US -3325483776,3325484287,ZA -3325484288,3325484799,US -3325484800,3325485055,ZA -3325485056,3325485311,US -3325485312,3325486591,ZA -3325486592,3325486847,US -3325486848,3325487359,ZA -3325487360,3325487615,US -3325487616,3325487871,ZA -3325487872,3325490943,US -3325490944,3325492991,ZA -3325492992,3325497343,US -3325497344,3325499903,PR -3325499904,3325505535,US -3325505536,3325509631,CA -3325509632,3325551615,US -3325551616,3325552639,CA -3325552640,3325573119,US -3325573120,3325574143,VG -3325574144,3325575167,BB -3325575168,3325630975,US -3325630976,3325631487,CA -3325631488,3325640703,US -3325640704,3325644799,CA -3325644800,3325689855,US -3325689856,3325690367,JM -3325690368,3325691647,US -3325691648,3325691903,CA -3325691904,3325693183,BR -3325693184,3325722623,US -3325722624,3325755391,CA -3325755392,3325956095,US -3325956096,3325960191,CA -3325960192,3325976063,US -3325976064,3325976319,CA -3325976320,3325980671,US -3325980672,3325980927,CA -3325980928,3325992447,US -3325992448,3325992959,CA -3325992960,3325993983,US -3325993984,3325994239,CA -3325994240,3325996799,US -3325996800,3325997055,CA -3325997056,3326325139,US -3326325140,3326325140,MZ -3326325141,3326390527,US -3326390528,3326390535,CA -3326390536,3326402111,US -3326402112,3326402119,PR -3326402120,3326406655,US -3326406656,3326408703,CO -3326408704,3326413823,US -3326413824,3326414335,YE -3326414336,3326420991,US -3326420992,3326423039,PR -3326423040,3326476495,US -3326476496,3326476503,GE -3326476504,3326492239,US -3326492240,3326492255,CA -3326492256,3326526463,US -3326526464,3326526719,CA -3326526720,3326613503,US -3326613504,3326615551,CA -3326615552,3326619647,US -3326619648,3326623743,CA -3326623744,3326631935,US -3326631936,3326640127,CA -3326640128,3326680831,US -3326680832,3326681087,CA -3326681088,3326681343,US -3326681344,3326682623,CA -3326682624,3326682879,US -3326682880,3326697215,CA -3326697216,3326699519,US -3326699520,3326699775,CA -3326699776,3326700799,US -3326700800,3326713343,CA -3326713344,3326714111,US -3326714112,3326716927,CA -3326716928,3326717951,US -3326717952,3326722047,CA -3326722048,3326726143,US -3326726144,3326726399,CA -3326726400,3326726655,US -3326726656,3326729215,CA -3326729216,3326729471,JP -3326729472,3326729727,CA -3326729728,3326734335,US -3326734336,3326734591,CA -3326734592,3326737151,US -3326737152,3326737663,CA -3326737664,3326737919,US -3326737920,3326738175,CA -3326738176,3326764863,US -3326764864,3326764871,GB -3326764872,3326768887,US -3326768888,3326768895,GB -3326768896,3326770863,US -3326770864,3326770871,GB -3326770872,3326952191,US -3326952192,3326952447,AS -3326952448,3326953983,US -3326953984,3326954495,AS -3326954496,3327144959,US -3327144960,3327145983,CA -3327145984,3327162367,US -3327162368,3327162623,GB -3327162624,3327162879,US -3327162880,3327163391,GB -3327163392,3327197183,US -3327197184,3327198207,JP -3327198208,3327199231,US -3327199232,3327200255,BR -3327200256,3327256831,US -3327256832,3327257087,GU -3327257088,3327397375,US -3327397376,3327397887,CA -3327397888,3327426559,US -3327426560,3327459327,CA -3327459328,3327723519,US -3327723520,3327725311,CA -3327725312,3327788543,US -3327788544,3327789055,CA -3327789056,3327806463,US -3327806464,3327811583,CA -3327811584,3327885311,US -3327885312,3327918079,CA -3327918080,3327995903,US -3327995904,3327996927,CW -3327996928,3328028671,US -3328028672,3328030719,CW -3328030720,3328180479,US -3328180480,3328181247,CA -3328181248,3328181759,US -3328181760,3328185855,CA -3328185856,3328186111,US -3328186112,3328187647,CA -3328187648,3328187903,US -3328187904,3328196351,CA -3328196352,3328196607,US -3328196608,3328202751,CA -3328202752,3328204799,US -3328204800,3328214783,CA -3328214784,3328215295,GB -3328215296,3328224255,CA -3328224256,3328224511,US -3328224512,3328235007,CA -3328235008,3328235519,US -3328235520,3328236543,CA -3328236544,3328237311,US -3328237312,3328241663,CA -3328241664,3328243199,US -3328243200,3328245759,CA -3328245760,3328249599,US -3328249600,3328249855,GB -3328249856,3328299775,US -3328299776,3328301055,CA -3328301056,3328306431,US -3328306432,3328306687,CA -3328306688,3328341215,US -3328341216,3328341223,CA -3328341224,3328342815,US -3328342816,3328342847,PK -3328342848,3328358399,US -3328358400,3328360447,CA -3328360448,3328383999,US -3328384000,3328385023,CA -3328385024,3328414719,US -3328414720,3328414975,CH -3328414976,3328420351,US -3328420352,3328420607,CA -3328420608,3328421119,US -3328421120,3328421375,HK -3328421376,3328432639,US -3328432640,3328433663,CA -3328433664,3328433919,CH -3328433920,3328475135,US -3328475136,3328477183,CA -3328477184,3328479231,US -3328479232,3328479623,CA -3328479624,3328479624,US -3328479625,3328481279,CA -3328481280,3328481535,US -3328481536,3328481759,CA -3328481760,3328481760,US -3328481761,3328482303,CA -3328482304,3328482815,US -3328482816,3328483327,CA -3328483328,3328515071,US -3328515072,3328516095,DM -3328516096,3328617983,US -3328617984,3328618239,CA -3328618240,3328629631,US -3328629632,3328629695,GB -3328629696,3328630015,US -3328630016,3328630271,CA -3328630272,3328630783,US -3328630784,3328631807,CA -3328631808,3328638975,US -3328638976,3328704511,CA -3328704512,3328774399,US -3328774400,3328775935,CA -3328775936,3328794623,US -3328795648,3328796671,US -3328798720,3328799743,NL -3328800000,3328800255,NL -3328800256,3328800767,IT -3328800768,3328801023,NZ -3328801024,3328801279,SE -3328801280,3328801791,CZ -3328801792,3328802047,US -3328802048,3328802303,DE -3328802304,3328802815,AU -3328802816,3328811007,US -3328811008,3328811263,CN -3328811264,3328811271,US -3328811272,3328811591,CN -3328811592,3328811599,US -3328811600,3328811711,CN -3328811712,3328811791,US -3328811792,3328811831,CN -3328811832,3328811855,US -3328811856,3328811863,CN -3328811864,3328811871,US -3328811872,3328812319,CN -3328812320,3328812335,US -3328812336,3328812527,CN -3328812528,3328812535,US -3328812536,3328812783,CN -3328812784,3328812799,US -3328812800,3328812847,CN -3328812848,3328812855,US -3328812856,3328813831,CN -3328813832,3328813839,US -3328813840,3328815471,CN -3328815472,3328815487,US -3328815488,3328816023,CN -3328816024,3328816031,US -3328816032,3328818439,CN -3328818440,3328818447,US -3328818448,3328819199,CN -3328819200,3328826623,US -3328826624,3328826879,SG -3328826880,3329230335,US -3329230336,3329230591,JP -3329230592,3329498623,US -3329498624,3329498879,ES -3329498880,3330613247,US -3330613248,3330614783,CA -3330614784,3330617087,US -3330617088,3330617343,CA -3330617344,3330621183,US -3330621184,3330623743,CA -3330623744,3330624255,US -3330624256,3330624511,CA -3330624512,3330625535,US -3330625536,3330627071,GB -3330627072,3330640895,US -3330640896,3330641151,CH -3330641152,3330646527,US -3330646528,3330647295,CA -3330647296,3330649599,US -3330649600,3330649855,CA -3330649856,3330662911,US -3330662912,3330663167,GB -3330663168,3330664191,US -3330664192,3330664447,CA -3330664448,3330677759,US -3330677760,3330678783,CA -3330678784,3330714367,US -3330714368,3330714623,CA -3330714624,3330726655,US -3330726656,3330726911,CA -3330726912,3330754559,US -3330754560,3330754815,CA -3330754816,3330763519,US -3330763520,3330763775,CA -3330763776,3330765823,US -3330765824,3330766335,CA -3330766336,3330771199,US -3330771200,3330771711,CH -3330771712,3330778879,US -3330778880,3330779135,GB -3330779136,3330785279,US -3330785280,3330785791,CA -3330785792,3330791423,US -3330791424,3330791679,CA -3330791680,3330796543,US -3330796544,3330796799,CA -3330796800,3330812927,US -3330812928,3330813951,CA -3330813952,3330814047,US -3330814048,3330814055,LK -3330814056,3330814719,US -3330814720,3330814727,PK -3330814728,3330814807,US -3330814808,3330814815,LK -3330814816,3330814831,US -3330814832,3330814839,LK -3330814840,3330814847,PK -3330814848,3330815743,US -3330815744,3330815999,IN -3330816000,3330817882,US -3330817883,3330817887,CL -3330817888,3330817899,ES -3330817900,3330866943,US -3330866944,3330867199,CA -3330867200,3330883583,US -3330883584,3330884351,NL -3330884352,3330884863,US -3330884864,3330885119,GB -3330885120,3330888063,US -3330888064,3330888127,NL -3330888128,3330888191,US -3330888192,3330888703,AU -3330888704,3330888959,US -3330888960,3330889215,CH -3330889216,3330889471,GB -3330889472,3330890239,JP -3330890240,3330890751,BE -3330890752,3330891263,GB -3330891264,3330892287,US -3330892288,3330892543,FR -3330892544,3330893567,US -3330893568,3330893823,NL -3330893824,3330894079,CA -3330894080,3330894591,GB -3330894592,3330894847,DE -3330894848,3330897919,US -3330897920,3330898175,CA -3330898176,3330898431,DE -3330898432,3330898943,FR -3330898944,3330904575,US -3330904576,3330904831,CA -3330904832,3331098111,US -3331098112,3331098367,CA -3331098368,3331102463,US -3331102464,3331102719,CA -3331102720,3331194879,US -3331194880,3331260415,AU -3331260416,3331269375,US -3331269376,3331269376,AU -3331269377,3331269631,US -3331269632,3331269632,IL -3331269633,3331270399,US -3331270400,3331270400,SG -3331270401,3331270655,US -3331270656,3331270656,IL -3331270657,3331271167,US -3331271168,3331271168,JP -3331271169,3331271679,US -3331271680,3331271680,JP -3331271681,3331271935,US -3331271936,3331271936,ES -3331271937,3331272959,US -3331272960,3331272960,IT -3331272961,3331273471,US -3331273472,3331273472,IL -3331273473,3331273727,US -3331273728,3331273983,AU -3331273984,3331273984,HK -3331273985,3331274239,US -3331274240,3331274240,SE -3331274241,3331274495,US -3331274496,3331274496,PL -3331274497,3331274751,US -3331274752,3331274752,BR -3331274753,3331275263,US -3331275264,3331275264,CH -3331275265,3331275775,US -3331275776,3331275776,CA -3331275777,3331356671,US -3331356672,3331357183,BZ -3331357184,3331358719,US -3331358720,3331362815,JP -3331362816,3331365199,CA -3331365200,3331365207,GB -3331365208,3331366911,CA -3331366912,3331371327,US -3331371328,3331371343,SE -3331371344,3331371519,US -3331371520,3331371583,EE -3331371584,3331371711,US -3331371712,3331371775,EE -3331371776,3331372287,US -3331372288,3331372319,FR -3331372320,3331527167,US -3331527168,3331527679,GB -3331527680,3331528959,US -3331528960,3331528991,CN -3331528992,3331529023,US -3331529024,3331529031,IN -3331529032,3331529039,LB -3331529040,3331529175,US -3331529176,3331529183,VE -3331529184,3331529215,CN -3331529216,3331529247,US -3331529248,3331529255,VE -3331529256,3331529375,US -3331529376,3331529383,IN -3331529384,3331529391,US -3331529392,3331529399,IN -3331529400,3331529599,US -3331529600,3331529727,EE -3331529728,3331530063,US -3331530064,3331530071,IN -3331530072,3331530079,US -3331530080,3331530111,PK -3331530112,3331530175,US -3331530176,3331530183,BR -3331530184,3331530191,MX -3331530192,3331530199,US -3331530200,3331530223,IN -3331530224,3331530231,US -3331530232,3331530239,LB -3331530240,3331563519,US -3331563520,3331563775,IN -3331563776,3331565567,US -3331565568,3331566079,CA -3331566080,3331617855,US -3331617856,3331617919,GB -3331617920,3331620079,US -3331620080,3331620095,GB -3331620096,3331620527,US -3331620528,3331620543,GB -3331620544,3331632639,US -3331632640,3331632895,CA -3331632896,3331633407,US -3331633408,3331633919,CH -3331633920,3331636479,US -3331636480,3331636735,AU -3331636736,3331637247,US -3331637248,3331638271,KR -3331638272,3331638783,AU -3331638784,3331647231,US -3331647232,3331647487,CA -3331647488,3331649279,US -3331649280,3331649535,CA -3331649536,3331818495,US -3331818496,3331818751,MX -3331818752,3331840111,US -3331840112,3331840115,CA -3331840116,3331935231,US -3331935232,3331935583,CA -3331935584,3331935615,US -3331935616,3331936255,CA -3331936256,3331983103,US -3331983104,3331983359,CA -3331983360,3331988479,US -3331988480,3331989503,CA -3331989504,3332001791,US -3332001792,3332002047,CA -3332002048,3332002063,US -3332002064,3332002071,CA -3332002072,3332002079,FI -3332002080,3332002111,CA -3332002112,3332002143,US -3332002144,3332002159,CA -3332002160,3332002215,US -3332002216,3332002223,CA -3332002224,3332002303,US -3332002304,3332002431,CA -3332002432,3332002495,US -3332002496,3332002559,CA -3332002560,3332002815,IN -3332002816,3332003711,US -3332003712,3332003839,IT -3332003840,3332004607,CA -3332004608,3332004671,US -3332004672,3332004863,CA -3332004864,3332005375,US -3332005376,3332005631,IN -3332005632,3332005632,CA -3332005633,3332005886,US -3332005887,3332005887,CA -3332005888,3332028415,US -3332028416,3332030463,CA -3332030464,3332423423,US -3332423424,3332423679,CA -3332423680,3332440319,US -3332440320,3332460543,CA -3332460544,3332460799,US -3332460800,3332461311,CA -3332461312,3332461567,US -3332461568,3332462335,CA -3332462336,3332462591,US -3332462592,3332473855,CA -3332473856,3332477951,US -3332477952,3332482303,CA -3332482304,3332483071,US -3332483072,3332483615,CO -3332483616,3332483711,US -3332483712,3332483743,PE -3332483744,3332483839,US -3332483840,3332484095,BO -3332484096,3332491263,CA -3332491264,3332492031,US -3332492032,3332500735,CA -3332500736,3332500991,US -3332500992,3332501247,CA -3332501248,3332501503,US -3332501504,3332503039,CA -3332503040,3332503551,US -3332503552,3332505343,CA -3332505344,3332505855,US -3332505856,3332508671,CA -3332508672,3332508927,US -3332508928,3332525311,CA -3332525312,3332525574,US -3332525575,3332525575,CA -3332525576,3332526079,US -3332526080,3332526591,CA -3332526592,3332527103,US -3332527104,3332528127,CA -3332528128,3332529663,US -3332529664,3332554751,CA -3332554752,3332558847,US -3332558848,3332562943,CA -3332562944,3332563455,US -3332563456,3332564479,CA -3332564480,3332564735,US -3332564736,3332566783,CA -3332566784,3332567039,US -3332567040,3332570879,CA -3332570880,3332571391,US -3332571392,3332579327,CA -3332579328,3332581375,US -3332581376,3332590079,CA -3332590080,3332590591,US -3332590592,3332594687,CA -3332594688,3332594943,US -3332594944,3332595455,CA -3332595456,3332595711,US -3332595712,3332610559,CA -3332610560,3332611071,US -3332611072,3332611327,CA -3332611328,3332611583,US -3332611584,3332616191,CA -3332616192,3332616959,US -3332616960,3332617727,CA -3332617728,3332624383,US -3332624384,3332636415,CA -3332636416,3332636671,US -3332636672,3332724735,CA -3332724736,3332726783,PM -3332726784,3332737023,CA -3332737024,3332738047,PM -3332738048,3332744191,CA -3332744192,3332745215,PM -3332745216,3332752127,CA -3332752128,3332752383,PM -3332752384,3332833279,CA -3332833280,3332833535,US -3332833536,3332841471,CA -3332841472,3332841727,US -3332841728,3332866303,CA -3332866304,3332874239,US -3332874240,3332875007,CA -3332875008,3332875263,US -3332875264,3332876287,CA -3332876288,3332882431,US -3332882432,3332890623,KN -3332890624,3332897279,US -3332897280,3332898815,CA -3332898816,3332899071,US -3332899072,3332906495,CA -3332906496,3332909567,US -3332909568,3332909823,CA -3332909824,3332910079,US -3332910080,3332922879,CA -3332922880,3332923391,US -3332923392,3332925695,CA -3332925696,3332927487,US -3332928512,3332929023,US -3332929024,3332930047,CA -3332930560,3332931327,US -3332931328,3332947967,CA -3332947968,3332948223,US -3332948224,3332964351,CA -3332964352,3332964607,US -3332964608,3332966143,CA -3332966144,3332966399,US -3332966400,3332979967,CA -3332979968,3332980735,US -3332980736,3332988927,CA -3332988928,3332989951,US -3332989952,3332997119,CA -3332997120,3332997375,US -3332997376,3333008383,CA -3333008384,3333008895,US -3333008896,3333012479,CA -3333012480,3333012991,US -3333012992,3333014015,CA -3333014016,3333014527,US -3333014528,3333017599,CA -3333017600,3333018111,US -3333018112,3333023231,CA -3333023232,3333025279,US -3333025280,3333029631,CA -3333029632,3333385983,US -3333385984,3333386239,JP -3333386240,3333396223,US -3333396224,3333396479,JP -3333396480,3333396673,US -3333396674,3333396674,DE -3333396675,3333427967,US -3333427968,3333428223,GB -3333428224,3333444607,US -3333444608,3333444863,SG -3333444864,3333471999,US -3333472000,3333472255,NL -3333472256,3333480191,US -3333480192,3333481471,DE -3333481472,3333502975,US -3333502976,3333503359,CN -3333503360,3333503391,US -3333503392,3333504271,CN -3333504272,3333504287,US -3333504288,3333504431,CN -3333504432,3333504447,US -3333504448,3333505023,CN -3333505024,3333519359,US -3333519360,3333519871,HK -3333519872,3333520383,US -3333520384,3333520639,NL -3333520640,3333520895,DE -3333520896,3333583871,US -3333583872,3333584895,CA -3333584896,3333593855,US -3333593856,3333594111,CA -3333594112,3333609983,US -3333609984,3333610239,SG -3333610240,3333614591,US -3333614592,3333614847,GB -3333614848,3333621503,US -3333621504,3333621759,CA -3333621760,3333624319,US -3333624320,3333624575,CA -3333624576,3333675775,US -3333675776,3333676031,CA -3333676032,3333677311,US -3333677312,3333677567,HK -3333677568,3333701887,US -3333701888,3333702143,GB -3333702144,3333702399,US -3333702400,3333702655,CH -3333702656,3333705727,US -3333705728,3333709567,GB -3333709568,3333710591,US -3333710592,3333710847,IT -3333710848,3333711359,GB -3333711360,3333712127,DE -3333712128,3333712383,CH -3333712384,3333712639,DE -3333712640,3333716223,US -3333716224,3333716735,CA -3333716736,3333716991,GB -3333716992,3333717247,AU -3333717248,3333717503,FR -3333717504,3333717759,SG -3333717760,3333718015,NL -3333718016,3333721599,US -3333721600,3333721855,JP -3333721856,3333781503,US -3333781504,3333783551,CA -3333783552,3333801727,US -3333801728,3333801983,CA -3333801984,3333829631,US -3333829632,3333830143,IN -3333830144,3333859839,US -3333859840,3333860095,BM -3333860096,3333871103,US -3333871104,3333871359,CA -3333871360,3333939455,US -3333939456,3333939711,CA -3333939712,3333988607,US -3333988608,3333988863,BR -3333988864,3333997823,US -3333997824,3333998079,CA -3333998080,3334006527,US -3334006528,3334006783,NL -3334006784,3334020095,US -3334020096,3334021119,CA -3334021120,3334068479,US -3334068480,3334068735,CA -3334068736,3334138623,US -3334138624,3334138879,BM -3334138880,3334187775,US -3334187776,3334188031,BM -3334188032,3334932223,US -3334932224,3334932479,CA -3334932480,3334934015,US -3334934016,3334934527,CA -3334934528,3334962175,US -3334962176,3334963199,NL -3334963200,3334995967,US -3334995968,3334998527,PH -3334998528,3335004159,US -3335004160,3335004183,CN -3335004184,3335004223,US -3335004224,3335004319,CN -3335004320,3335004327,US -3335004328,3335004335,CN -3335004336,3335004351,US -3335004352,3335004463,CN -3335004464,3335004479,US -3335004480,3335004487,CN -3335004488,3335004495,US -3335004496,3335004503,CN -3335004504,3335004511,US -3335004512,3335004551,CN -3335004552,3335004559,US -3335004560,3335004623,CN -3335004624,3335004639,US -3335004640,3335005311,CN -3335005312,3335005327,US -3335005328,3335005423,CN -3335005424,3335005455,US -3335005456,3335005487,CN -3335005488,3335005503,US -3335005504,3335005519,CN -3335005520,3335005527,US -3335005528,3335005543,CN -3335005544,3335005551,US -3335005552,3335005647,CN -3335005648,3335005663,US -3335005664,3335005759,CN -3335005760,3335005823,US -3335005824,3335008071,CN -3335008072,3335008079,US -3335008080,3335008127,CN -3335008128,3335008255,US -3335008256,3335009175,CN -3335009176,3335009183,US -3335009184,3335009215,CN -3335009216,3335009279,US -3335009280,3335010175,CN -3335010176,3335010239,US -3335010240,3335012351,CN -3335012352,3335028735,CA -3335028736,3335057919,US -3335057920,3335058175,CA -3335058176,3335160319,US -3335160320,3335160575,CA -3335160576,3335252735,US -3335252736,3335252991,CA -3335252992,3335276287,US -3335276288,3335276799,PR -3335276800,3335277311,US -3335277312,3335277567,FR -3335277568,3335278079,US -3335278080,3335278335,JP -3335278336,3335349343,US -3335349344,3335349367,FR -3335349368,3335349368,US -3335349369,3335349375,FR -3335349376,3335352463,US -3335352464,3335352479,CA -3335352480,3335352783,US -3335352784,3335352799,AU -3335352800,3335353855,US -3335353856,3335353863,AU -3335353864,3335354015,US -3335354016,3335354023,AU -3335354024,3335354031,US -3335354032,3335354047,AU -3335354048,3335354111,US -3335354112,3335354143,CN -3335354144,3335354179,AU -3335354180,3335354183,CA -3335354184,3335354191,US -3335354192,3335354195,AU -3335354196,3335354431,US -3335354432,3335354463,AU -3335354464,3335354751,US -3335354752,3335354783,CN -3335354784,3335429631,US -3335429632,3335430143,CA -3335430144,3335439615,US -3335439616,3335439871,CH -3335439872,3335440383,US -3335440384,3335441151,CH -3335441152,3335456767,US -3335458816,3335460863,BM -3335460864,3335475199,US -3335475200,3335475455,DE -3335475456,3335480191,US -3335480192,3335480319,IT -3335480320,3335524351,US -3335524352,3335524607,AU -3335524608,3335559680,US -3335559681,3335559935,IE -3335559936,3335564151,US -3335564152,3335564155,TH -3335564156,3335573759,US -3335573760,3335574015,IN -3335574016,3335665252,US -3335665253,3335665342,TH -3335665343,3335719071,US -3335719072,3335719087,IN -3335719088,3335747071,US -3335747072,3335749631,NL -3335749632,3335784191,US -3335784192,3335784447,CA -3335784448,3335860991,US -3335860992,3335861247,MX -3335861248,3336139775,US -3336139776,3336140799,CA -3336140800,3336854015,US -3336854016,3336854271,CO -3336854272,3336990719,US -3336990720,3336990975,CA -3336990976,3336991231,US -3336991232,3336991487,CA -3336991488,3336993023,US -3336993024,3336993535,CA -3336993536,3336993791,US -3336993792,3336994047,CA -3336994048,3337030655,US -3337030656,3337030911,GB -3337030912,3337044479,US -3337044480,3337044735,CA -3337044736,3337044991,US -3337044992,3337046015,CA -3337046016,3337046527,US -3337046528,3337047551,CA -3337047552,3337050111,US -3337050112,3337051647,CA -3337051648,3337051903,US -3337051904,3337052159,CA -3337052160,3337053183,US -3337053184,3337053695,CA -3337053696,3337055231,US -3337055232,3337060351,CA -3337060352,3337106431,US -3337106432,3337106687,DE -3337106688,3337106943,SG -3337106944,3337107199,HK -3337107200,3337107455,AU -3337107456,3337107711,JP -3337107712,3337107967,GB -3337107968,3337198367,US -3337198368,3337198399,CA -3337198400,3337198703,US -3337198704,3337198707,CA -3337198708,3337201727,US -3337201728,3337201735,CA -3337201736,3337201767,US -3337201768,3337201775,CA -3337201776,3337201791,US -3337201792,3337201823,CA -3337201824,3337209375,US -3337209376,3337209383,CA -3337209384,3337217791,US -3337217792,3337218047,CA -3337218048,3337289983,US -3337289984,3337297919,CA -3337297920,3337302015,US -3337302016,3337303551,CA -3337303552,3337304063,US -3337304064,3337322495,CA -3337322496,3337322751,US -3337322752,3337323007,CA -3337323008,3337324543,US -3337324544,3337335295,CA -3337335296,3337335807,US -3337335808,3337341951,CA -3337341952,3337342463,US -3337342464,3337355007,CA -3337355008,3337650175,US -3337650176,3337650687,GB -3337650688,3337651199,US -3337651200,3337651455,CH -3337651456,3337651711,SG -3337651712,3337653503,CH -3337653504,3337653759,JP -3337653760,3337654783,CH -3337654784,3337655039,AU -3337655040,3337682943,CH -3337682944,3337882111,US -3337882112,3337882623,AU -3337882624,3337891839,US -3337891840,3337892127,IN -3337892128,3337892159,US -3337892160,3337892255,IN -3337892256,3337892351,US -3337892352,3337892607,CN -3337892608,3337892671,HK -3337892672,3337893119,US -3337893120,3337893375,CN -3337893376,3337893631,CA -3337893632,3337893887,IN -3337893888,3337894143,CN -3337894144,3337894399,US -3337894400,3337894463,IN -3337894464,3337894527,US -3337894528,3337894655,IN -3337894656,3337894719,CN -3337894720,3337894783,US -3337894784,3337894911,CN -3337894912,3337895167,IN -3337895168,3337895295,CN -3337895296,3337895551,US -3337895552,3337895615,CN -3337895616,3337895679,US -3337895680,3337895935,CN -3337895936,3337900031,PR -3337900032,3337957375,US -3337957376,3337959423,CA -3337959424,3337960447,US -3337960448,3337961471,CA -3337961472,3337961487,US -3337961488,3337961495,CA -3337961496,3337961519,US -3337961520,3337961527,RO -3337961528,3337961535,US -3337961536,3337961551,LT -3337961552,3337961559,KZ -3337961560,3337961567,ID -3337961568,3337961575,PK -3337961576,3337961583,AZ -3337961584,3337961591,US -3337961592,3337961599,LT -3337961600,3337961615,RO -3337961616,3337961623,CA -3337961624,3337961631,US -3337961632,3337961663,GB -3337961664,3337961687,CA -3337961688,3337961695,US -3337961696,3337961983,CA -3337961984,3337961999,US -3337962000,3337962007,CA -3337962008,3337962015,US -3337962016,3337962047,CA -3337962048,3337962111,US -3337962112,3337962143,CA -3337962144,3337962151,US -3337962152,3337962167,CA -3337962168,3337962175,US -3337962176,3337962215,CA -3337962216,3337962223,US -3337962224,3337962239,CA -3337962240,3337962327,US -3337962328,3337962335,CA -3337962336,3337962431,US -3337962432,3337962511,CA -3337962512,3337962519,US -3337962520,3337962599,CA -3337962600,3337962623,US -3337962624,3337962799,CA -3337962800,3337962807,US -3337962808,3337962831,CA -3337962832,3337962943,US -3337962944,3337962951,CA -3337962952,3337962959,NO -3337962960,3337962967,CA -3337962968,3337962975,US -3337962976,3337962983,CA -3337962984,3337962991,US -3337962992,3337963071,CA -3337963072,3337963167,US -3337963168,3337963271,CA -3337963272,3337963279,US -3337963280,3337963295,CA -3337963296,3337963311,US -3337963312,3337963319,CA -3337963320,3337963327,US -3337963328,3337963335,CA -3337963336,3337963343,US -3337963344,3337963359,CA -3337963360,3337963399,US -3337963400,3337963423,CA -3337963424,3337963439,US -3337963440,3337963447,CA -3337963448,3337963455,US -3337963456,3337963487,CA -3337963488,3337963495,US -3337963496,3337963535,CA -3337963536,3337963631,US -3337963632,3337963647,CA -3337963648,3337963743,US -3337963744,3337963759,CA -3337963760,3337963767,US -3337963768,3337963775,CA -3337963776,3337963783,AZ -3337963784,3337963791,US -3337963792,3337963799,AZ -3337963800,3337963807,US -3337963808,3337963847,CA -3337963848,3337963855,BR -3337963856,3337963863,CA -3337963864,3337963871,MA -3337963872,3337963879,US -3337963880,3337963903,CA -3337963904,3337963911,MA -3337963912,3337963919,CA -3337963920,3337963951,US -3337963952,3337963967,CA -3337963968,3337964031,IN -3337964032,3337964287,US -3337964288,3337964295,CA -3337964296,3337964335,US -3337964336,3337964351,CA -3337964352,3337964415,US -3337964416,3337964543,CA -3337964544,3337964671,US -3337964672,3337964735,IN -3337964736,3337964751,US -3337964752,3337964759,CA -3337964760,3337969663,US -3337969664,3337973759,PR -3337973760,3337977855,CA -3337977856,3337980671,US -3337980672,3337980927,PR -3337980928,3337986047,US -3337986048,3337986303,BB -3337986304,3337990143,US -3337990144,3337990655,CA -3337990656,3338010367,US -3338010368,3338010623,PR -3338010624,3338017791,US -3338017792,3338018815,CA -3338018816,3338021887,US -3338021888,3338022911,CA -3338022912,3338067711,US -3338067712,3338067967,SG -3338067968,3338069247,US -3338069248,3338069759,BB -3338069760,3338207487,US -3338207488,3338207743,CA -3338207744,3338208511,US -3338208512,3338208767,CA -3338208768,3338211583,US -3338211584,3338212095,CA -3338212096,3338215423,US -3338215424,3338215935,CA -3338215936,3338216447,US -3338216448,3338216703,CA -3338216704,3338217215,US -3338217216,3338217471,CA -3338217472,3338220543,US -3338220544,3338221055,CA -3338221056,3338222847,US -3338222848,3338223359,CA -3338223360,3338228735,US -3338228736,3338228991,CA -3338228992,3338229759,US -3338229760,3338230015,CA -3338230016,3338230527,US -3338230528,3338230783,CA -3338230784,3338231807,US -3338231808,3338232063,CA -3338232064,3338233599,US -3338233600,3338233855,VG -3338233856,3338235135,US -3338235136,3338235391,CA -3338235392,3338235647,US -3338235648,3338235903,CA -3338235904,3338236671,US -3338236672,3338236927,CA -3338236928,3338238975,US -3338238976,3338239231,CA -3338239232,3338239999,US -3338240000,3338240255,CA -3338240256,3338241535,US -3338241536,3338242047,CA -3338242048,3338246143,US -3338246144,3338246399,CA -3338246400,3338246655,US -3338246656,3338247167,CA -3338247168,3338247423,US -3338247424,3338247679,CA -3338247680,3338247935,US -3338247936,3338249215,CA -3338249216,3338249727,US -3338249728,3338249983,CA -3338249984,3338250751,US -3338250752,3338251007,CA -3338251008,3338251263,US -3338251264,3338251775,CA -3338251776,3338252543,US -3338252544,3338252799,CA -3338252800,3338253311,US -3338253312,3338253567,CA -3338253568,3338254079,US -3338254080,3338254335,CA -3338254336,3338255615,US -3338255616,3338255871,CA -3338255872,3338257407,US -3338257408,3338257663,CA -3338257664,3338257919,US -3338257920,3338258175,CA -3338258176,3338259455,US -3338259456,3338259711,CA -3338259712,3338260735,US -3338260736,3338261759,CA -3338261760,3338262527,US -3338262528,3338263039,CA -3338263040,3338264063,US -3338264064,3338264575,CA -3338264576,3338265855,US -3338265856,3338266623,CA -3338266624,3338267647,US -3338267648,3338268159,CA -3338268160,3338269183,US -3338269184,3338270207,CA -3338270208,3338270719,US -3338270720,3338271231,CA -3338271232,3338271487,US -3338271488,3338271743,CA -3338271744,3338271999,US -3338272000,3338272255,CA -3338272256,3338350591,US -3338350592,3338354687,CA -3338354688,3338358882,US -3338358883,3338358883,DE -3338358884,3338358908,US -3338358909,3338358909,DE -3338358910,3338358923,US -3338358924,3338358924,DE -3338358925,3338358987,US -3338358988,3338358988,DE -3338358989,3338359015,US -3338359016,3338359016,DE -3338359017,3338359033,US -3338359034,3338359034,DE -3338359035,3338359295,US -3338359296,3338359359,BR -3338359360,3338359817,US -3338359818,3338359818,GB -3338359819,3338359847,US -3338359848,3338359848,RO -3338359849,3338360439,US -3338360440,3338360440,CA -3338360441,3338360479,US -3338360480,3338360483,GB -3338360484,3338360831,US -3338360832,3338361087,RU -3338361088,3338361192,US -3338361193,3338361193,RO -3338361194,3338371071,US -3338371072,3338403839,CA -3338403840,3338424319,US -3338424320,3338428415,CA -3338428416,3338429695,US -3338429696,3338429951,SG -3338429952,3338430719,US -3338430720,3338430975,NL -3338430976,3338431487,US -3338431488,3338431743,CA -3338431744,3338432255,US -3338432256,3338432511,SG -3338432512,3338436607,US -3338436608,3338437631,CA -3338437632,3338446079,US -3338446080,3338446335,CA -3338446336,3338455039,US -3338455040,3338455295,GB -3338455296,3338567679,US -3338567680,3338600447,CA -3338600448,3338600983,US -3338600984,3338600991,CA -3338600992,3338600999,BR -3338601000,3338601007,MX -3338601008,3338601015,JP -3338601016,3338601023,AU -3338601024,3338608175,US -3338608176,3338608183,CN -3338608184,3338608287,US -3338608288,3338608295,CN -3338608296,3338608319,US -3338608320,3338608327,CN -3338608328,3338608335,US -3338608336,3338608343,CN -3338608344,3338608775,US -3338608776,3338608783,CN -3338608784,3338622463,US -3338622464,3338623487,CA -3338623488,3338631679,US -3338631680,3338631935,CA -3338631936,3338686463,US -3338686464,3338688511,AW -3338688512,3338770431,US -3338770432,3338772479,PR -3338772480,3338825727,US -3338825728,3338827775,AW -3338827776,3338849615,US -3338849616,3338849631,FR -3338849632,3338916351,US -3338916352,3338916479,CN -3338916480,3338921219,US -3338921220,3338921220,PT -3338921221,3338964991,US -3338964992,3338965247,CA -3338965248,3338976767,US -3338976768,3338977023,CA -3338977024,3338993407,US -3338993408,3338993663,CA -3338993664,3339043327,US -3339043328,3339043583,CA -3339043584,3339075583,US -3339075584,3339076863,GB -3339076864,3339077631,JP -3339077632,3339077887,SG -3339077888,3339079167,US -3339079168,3339079423,DK -3339079424,3339079679,CA -3339079680,3339080703,IT -3339080704,3339080959,FR -3339080960,3339081727,HK -3339081728,3339081983,NL -3339081984,3339082751,FR -3339082752,3339086335,US -3339086336,3339086591,JP -3339086592,3339091967,US -3339091968,3339092991,NL -3339092992,3339093503,US -3339093504,3339094015,NL -3339094016,3339137279,US -3339137280,3339137535,FR -3339137536,3339138815,US -3339138816,3339139071,NL -3339139072,3339139327,SE -3339139328,3339139583,JP -3339139584,3339139839,GB -3339139840,3339140351,US -3339140352,3339140607,HK -3339140608,3339142911,US -3339142912,3339143167,DE -3339143168,3339147007,US -3339147008,3339147775,CA -3339147776,3339148031,MS -3339148032,3339153407,US -3339153408,3339155455,BB -3339155456,3339159551,US -3339159552,3339160575,CA -3339160576,3339164671,US -3339164672,3339165695,CA -3339165696,3339167743,US -3339167744,3339168767,PR -3339168768,3339177983,US -3339177984,3339178495,PR -3339178496,3339178751,DO -3339178752,3339179007,PR -3339179008,3339180031,US -3339180032,3339181055,CA -3339181056,3339184127,US -3339184128,3339185839,CA -3339185840,3339185843,US -3339185844,3339186175,CA -3339186176,3339261951,US -3339261952,3339263999,HK -3339264000,3339270399,US -3339270400,3339270655,CA -3339271168,3339327999,US -3339328512,3339328831,CA -3339328832,3339328895,US -3339328896,3339328943,CA -3339328944,3339328959,AE -3339328960,3339329279,CA -3339329280,3339329407,US -3339329408,3339329439,CA -3339329440,3339329455,GB -3339329456,3339329535,CA -3339329536,3339338239,US -3339338240,3339338495,CA -3339338496,3339342847,US -3339342848,3339343103,CA -3339343104,3339669503,US -3339669504,3339671807,CA -3339671808,3339672063,US -3339672576,3339678721,US -3339678722,3339678782,CN -3339678783,3339678785,US -3339678786,3339678846,CN -3339678847,3339679487,US -3339679488,3339679743,CN -3339679744,3339707391,US -3339707392,3339708415,BM -3339708416,3339722687,US -3339722688,3339722703,EG -3339722704,3339722719,CA -3339722720,3339727343,US -3339727344,3339727351,CA -3339727352,3339728895,US -3339728896,3339729407,AG -3339729408,3339729919,DM -3339729920,3339743231,US -3339743232,3339744255,CA -3339744256,3339747327,US -3339747328,3339748351,CA -3339748352,3339753471,US -3339753472,3339754495,CA -3339754496,3339760639,US -3339760640,3339761663,CA -3339761664,3339766047,US -3339766048,3339766055,DE -3339766056,3339766071,US -3339766072,3339766079,CA -3339766080,3339766095,US -3339766096,3339766103,GB -3339766104,3339766111,US -3339766112,3339766119,IN -3339766120,3339766183,US -3339766184,3339766191,AU -3339766192,3339766231,US -3339766232,3339766239,GB -3339766240,3339766247,MX -3339766248,3339766343,US -3339766344,3339766351,SA -3339766352,3339766383,US -3339766384,3339766399,AU -3339766400,3339766495,US -3339766496,3339766511,RU -3339766512,3339766543,US -3339766544,3339766547,RO -3339766548,3339766551,US -3339766552,3339766559,RO -3339766560,3339766583,US -3339766584,3339766591,AU -3339766592,3339766599,US -3339766600,3339766607,BR -3339766608,3339766623,US -3339766624,3339766631,NO -3339766632,3339766671,US -3339766672,3339766679,CA -3339766680,3339766687,RO -3339766688,3339766695,US -3339766696,3339766703,PT -3339766704,3339766719,US -3339766720,3339766727,IN -3339766728,3339766743,US -3339766744,3339766751,SE -3339766752,3339766759,BE -3339766760,3339766767,US -3339766768,3339766775,HU -3339766776,3339766879,US -3339766880,3339766887,GB -3339766888,3339766903,US -3339766904,3339766911,NZ -3339766912,3339766919,US -3339766920,3339766927,IL -3339766928,3339766943,US -3339766944,3339766951,RU -3339766952,3339766983,US -3339766984,3339766991,RU -3339766992,3339767007,US -3339767008,3339767015,DE -3339767016,3339767031,US -3339767032,3339767039,CA -3339767040,3339767071,US -3339767072,3339767079,CA -3339767080,3339767087,US -3339767088,3339767095,HU -3339767096,3339767111,US -3339767112,3339767119,GB -3339767120,3339767127,US -3339767128,3339767135,CA -3339767136,3339767143,GB -3339767144,3339767191,US -3339767192,3339767199,RO -3339767200,3339767207,IT -3339767208,3339767231,US -3339767232,3339767239,RU -3339767240,3339767247,PT -3339767248,3339767263,US -3339767264,3339767271,AR -3339767272,3339767335,US -3339767336,3339767343,RO -3339767344,3339767351,US -3339767352,3339767359,IL -3339767360,3339767431,US -3339767432,3339767439,CN -3339767440,3339767447,SA -3339767448,3339767471,US -3339767472,3339767479,CN -3339767480,3339767495,US -3339767496,3339767503,HU -3339767504,3339767511,US -3339767512,3339767519,IN -3339767520,3339767527,US -3339767528,3339767535,CA -3339767536,3339767543,US -3339767544,3339767551,MX -3339767552,3339767615,RO -3339767616,3339767663,US -3339767664,3339767671,RU -3339767672,3339767679,US -3339767680,3339767711,BR -3339767712,3339778047,US -3339778048,3339779071,BM -3339779072,3339923455,US -3339923456,3339927551,CA -3339927552,3339934719,US -3339934720,3339935743,CA -3339935744,3339937279,US -3339937280,3339937535,MX -3339937536,3339937816,US -3339937817,3339937879,CN -3339937880,3339938817,US -3339938818,3339938830,IN -3339938831,3339939130,US -3339939131,3339939191,BR -3339939192,3339939440,US -3339939441,3339939446,TR -3339939447,3339939473,US -3339939474,3339939534,GB -3339939535,3339939582,TR -3339939583,3339952127,US -3339952128,3339956223,CA -3339956224,3339962559,US -3339962560,3339962591,GB -3339962592,3339963167,US -3339963168,3339963199,SC -3339963200,3339965439,US -3339965440,3339968511,CA -3339968512,3339975935,US -3339975936,3339976191,CA -3339976192,3340080127,US -3340080128,3340081151,CA -3340081152,3340084223,US -3340084224,3340085247,KN -3340085248,3340086271,US -3340086272,3340087295,AU -3340087296,3340088319,US -3340088320,3340089343,CA -3340089344,3340097535,US -3340097536,3340098559,CA -3340098560,3340107775,US -3340107776,3340369919,CA -3340369920,3340386815,US -3340387328,3340388351,CA -3340388352,3340390399,US -3340390400,3340391423,CA -3340391424,3340391785,US -3340391786,3340391793,MY -3340391794,3340391817,US -3340391818,3340391825,LK -3340391826,3340392169,US -3340392170,3340392190,LK -3340392191,3340394495,US -3340394496,3340396543,HK -3340396544,3340418559,US -3340418560,3340419071,CA -3340419072,3340429823,US -3340429824,3340430079,PA -3340430080,3340453375,US -3340453376,3340453887,BM -3340453888,3340454911,US -3340454912,3340455167,DE -3340455168,3340460031,US -3340460032,3340462079,PR -3340462080,3340481535,US -3340481536,3340482559,CA -3340482560,3340483583,US -3340484608,3340490751,US -3340490752,3340492799,CA -3340492800,3340493567,US -3340493568,3340493823,HK -3340493824,3340637439,US -3340637440,3340637695,IE -3340637696,3340639231,US -3340639232,3340639295,IE -3340639296,3340677119,US -3340677120,3340679167,CA -3340679168,3340693679,US -3340693680,3340693695,GB -3340693696,3340694783,US -3340694784,3340695039,CA -3340695040,3340846111,US -3340846112,3340846119,CA -3340846120,3340846127,GB -3340846128,3340846131,MX -3340846132,3340846139,BR -3340846140,3340851455,US -3340851456,3340851711,CA -3340851712,3340852735,US -3340852736,3340853247,CA -3340853248,3340857343,US -3340857344,3340858015,CA -3340858016,3340858047,US -3340858048,3340858367,CA -3340858368,3340925095,US -3340925096,3340925103,TR -3340925104,3340925111,US -3340925112,3340925119,CO -3340925120,3340925159,US -3340925160,3340925167,FR -3340925168,3340925175,BE -3340925176,3340925183,TR -3340925184,3340925215,US -3340925216,3340925247,AF -3340925248,3340925255,US -3340925256,3340925263,TR -3340925264,3340925359,US -3340925360,3340925367,IN -3340925368,3340925375,US -3340925376,3340925383,IN -3340925384,3340925391,RU -3340925392,3340925439,US -3340925440,3340925447,GB -3340925448,3340925511,US -3340925512,3340925519,EE -3340925520,3340925527,GB -3340925528,3340925535,PL -3340925536,3340925543,RU -3340925544,3340925567,US -3340925568,3340925575,DE -3340925576,3340925591,US -3340925592,3340925599,VE -3340925600,3340925607,US -3340925608,3340925615,GB -3340925616,3340925631,US -3340925632,3340925639,FR -3340925640,3340925647,CO -3340925648,3340925655,US -3340925656,3340925663,GB -3340925664,3340925695,US -3340925696,3340925703,AU -3340925704,3340925711,ID -3340925712,3340925735,US -3340925736,3340925743,UA -3340925744,3340925783,US -3340925784,3340925791,BR -3340925792,3340925807,US -3340925808,3340925815,RU -3340925816,3340925823,US -3340925824,3340925887,GB -3340925888,3340925895,US -3340925896,3340925903,GR -3340925904,3340925919,US -3340925920,3340925927,PT -3340925928,3340925935,US -3340925936,3340925943,BR -3340925944,3340925951,CA -3340925952,3340925959,BE -3340925960,3340925967,IT -3340925968,3340925999,US -3340926000,3340926007,RU -3340926008,3340926015,US -3340926016,3340926023,RU -3340926024,3340926095,US -3340926096,3340926103,RO -3340926104,3340926127,US -3340926128,3340926135,GB -3340926136,3340926143,US -3340926144,3340926151,RU -3340926152,3340926159,CN -3340926160,3340926167,US -3340926168,3340926175,AR -3340926176,3340926191,US -3340926192,3340926199,BR -3340926200,3340926215,US -3340926216,3340926223,SE -3340926224,3340926231,CA -3340926232,3340926247,US -3340926248,3340926255,AR -3340926256,3340926295,US -3340926296,3340926303,DE -3340926304,3340926319,US -3340926320,3340926327,RU -3340926328,3340926343,US -3340926344,3340926351,TR -3340926352,3340926359,CA -3340926360,3340926367,US -3340926368,3340926375,GB -3340926376,3340926399,US -3340926400,3340926407,CA -3340926408,3340926439,US -3340926440,3340926447,OM -3340926448,3340926455,DE -3340926456,3340926463,US -3340926464,3340926479,MX -3340926480,3340926487,BR -3340926488,3340926495,CA -3340926496,3340926503,DE -3340926504,3340926511,MX -3340926512,3340926527,SE -3340926528,3340926599,US -3340926600,3340926607,CA -3340926608,3340926615,IN -3340926616,3340926623,US -3340926624,3340926655,BR -3340926656,3340926663,RU -3340926664,3340926671,US -3340926672,3340926679,DO -3340926680,3340926783,US -3340926784,3340926791,NO -3340926792,3340926807,US -3340926808,3340926815,IN -3340926816,3340926823,GB -3340926824,3340926959,US -3340926960,3340926967,IL -3340926968,3341057023,US -3341057024,3341058047,CA -3341058048,3341082623,US -3341082624,3341084671,CA -3341084672,3341180927,US -3341180928,3341182975,CA -3341182976,3341186686,US -3341186687,3341186688,IN -3341186689,3341194463,US -3341194464,3341194495,NL -3341194496,3341205503,US -3341205504,3341206589,LC -3341206590,3341206590,BB -3341206591,3341207551,LC -3341207552,3341210263,US -3341210264,3341210271,CA -3341210272,3341216255,US -3341216256,3341216767,JP -3341216768,3341217791,CA -3341217792,3341287423,US -3341287424,3341408511,CZ -3341408512,3341408767,US -3341408768,3341418495,CZ -3341418496,3341444863,US -3341444864,3341445631,DE -3341445632,3341464575,US -3341464576,3341464831,GB -3341464832,3341470207,US -3341470208,3341470463,GB -3341470464,3341472255,US -3341472256,3341472511,DE -3341472512,3341479935,US -3341479936,3341480447,DE -3341480448,3341484287,US -3341484288,3341485055,CA -3341485056,3341488639,US -3341488640,3341489151,JP -3341489152,3341495551,US -3341495552,3341495807,HK -3341495808,3341500159,US -3341500160,3341500415,HK -3341500416,3341511679,US -3341511680,3341517823,CA -3341517824,3341518847,US -3341518848,3341531135,CA -3341531136,3341533951,US -3341533952,3341534207,CA -3341534720,3341535007,US -3341535008,3341535015,ID -3341535016,3341535023,GH -3341535024,3341535031,PA -3341535032,3341535039,VN -3341535040,3341535047,MA -3341535048,3341535055,GH -3341535056,3341535087,US -3341535088,3341535091,GH -3341535092,3341535095,MX -3341535096,3341535167,US -3341535168,3341535171,CN -3341535172,3341535183,US -3341535184,3341535187,ID -3341535188,3341535195,US -3341535196,3341535199,SA -3341535200,3341535231,US -3341535232,3341536255,GB -3341536256,3341536511,US -3341536512,3341536767,CA -3341536768,3341546239,US -3341546240,3341547007,CA -3341547008,3341547519,CH -3341547520,3341549311,CA -3341549312,3341631999,US -3341632000,3341632767,CA -3341632768,3341634815,US -3341634816,3341635071,CA -3341635072,3341643519,US -3341643520,3341643775,CA -3341643776,3341644287,US -3341644288,3341644799,CA -3341644800,3341645055,US -3341645056,3341645567,CA -3341645568,3341646079,US -3341646080,3341646591,CA -3341646592,3341709311,US -3341709312,3341710335,CA -3341710336,3341727999,US -3341728000,3341728255,AU -3341728256,3341758463,US -3341758464,3341759487,CA -3341759488,3341760511,BB -3341760512,3341762559,CA -3341762560,3341777919,US -3341777920,3341778943,CA -3341778944,3341784063,US -3341784064,3341784575,CA -3341784576,3341785087,CH -3341785088,3341795583,US -3341795584,3341795839,GB -3341795840,3341796607,US -3341796608,3341796863,AU -3341796864,3341797375,JP -3341797376,3341807615,US -3341807616,3341807652,CA -3341807653,3341807653,US -3341807654,3341807706,CA -3341807707,3341807815,US -3341807816,3341807822,CA -3341807823,3341807844,US -3341807845,3341807855,CA -3341807856,3341807865,US -3341807866,3341808192,CA -3341808193,3341808206,ID -3341808207,3341808607,CA -3341808608,3341808638,US -3341808639,3341808639,CA -3341808640,3341827071,US -3341827072,3341827327,CA -3341827328,3341828095,US -3341828096,3341829119,CA -3341829120,3341837311,US -3341837312,3341837743,CA -3341837744,3341837747,US -3341837748,3341838335,CA -3341838336,3341838591,GB -3341838592,3341854551,US -3341854552,3341854559,SG -3341854560,3341863935,US -3341863936,3341864959,AG -3341864960,3341867007,US -3341867008,3341869055,CA -3341869056,3341870079,US -3341870080,3341870335,CA -3341870336,3341873407,US -3341873408,3341873663,CA -3341873664,3341881087,US -3341881088,3341881343,SG -3341881344,3341891071,US -3341891072,3341891327,AU -3341891328,3342139391,US -3342139392,3342204927,CH -3342204928,3342470399,US -3342470400,3342470655,CA -3342471168,3342487551,US -3342487552,3342488575,CA -3342488576,3342488639,US -3342488640,3342488703,GB -3342488704,3342488831,SC -3342488832,3342488863,GB -3342488864,3342488872,US -3342488873,3342488882,BG -3342488883,3342488896,US -3342488897,3342488908,GB -3342488909,3342488909,US -3342488910,3342488925,GB -3342488926,3342489087,US -3342489088,3342489215,SC -3342489216,3342489279,GB -3342489280,3342489301,US -3342489302,3342489311,AR -3342489312,3342489450,US -3342489451,3342489463,IL -3342489464,3342489474,US -3342489475,3342489482,NL -3342489483,3342489485,US -3342489486,3342489501,IL -3342489502,3342489503,US -3342489504,3342489567,GB -3342489568,3342496767,US -3342496768,3342497791,CA -3342499840,3342505983,US -3342505984,3342507007,BB -3342507008,3342510079,US -3342510080,3342512127,CA -3342512128,3342516223,US -3342516224,3342516735,CA -3342516736,3342516991,US -3342516992,3342517247,CA -3342517248,3342526463,US -3342526464,3342528511,CA -3342528512,3342552063,US -3342552064,3342553087,CA -3342553088,3342556127,US -3342556128,3342556159,CA -3342556160,3342565375,US -3342565376,3342567423,CA -3342567424,3342570239,US -3342570240,3342570495,CH -3342570496,3342579711,US -3342579712,3342581759,CA -3342581760,3342585599,US -3342585600,3342585855,MU -3342585856,3342595071,US -3342595072,3342595583,CA -3342595584,3342595839,FR -3342595840,3342596095,CA -3342596096,3342598143,US -3342598144,3342603263,CA -3342603264,3342604799,US -3342604800,3342605311,CA -3342605312,3342605567,US -3342605568,3342623743,CA -3342624000,3342624255,US -3342624256,3342627839,CA -3342627840,3342628095,US -3342628096,3342629631,CA -3342629632,3342629887,US -3342629888,3342657535,CA -3342657536,3342657791,US -3342657792,3342663423,CA -3342663424,3342831103,US -3342831104,3342831359,IN -3342831360,3342879487,US -3342879488,3342879551,NL -3342879552,3342879567,US -3342879568,3342879743,NL -3342879744,3343013887,US -3343013888,3343015695,CA -3343015696,3343015727,US -3343015728,3343015935,CA -3343015936,3343046919,US -3343046920,3343046923,IT -3343046924,3343046939,US -3343046940,3343046943,RU -3343046944,3343046955,US -3343046956,3343046959,IT -3343046960,3343046963,BE -3343046964,3343046967,US -3343046968,3343046971,NL -3343046972,3343046987,US -3343046988,3343046991,CA -3343046992,3343047111,US -3343047112,3343047127,SG -3343047128,3343047143,US -3343047144,3343047151,IT -3343047152,3343047327,US -3343047328,3343047343,IT -3343047344,3343047423,US -3343047424,3343047439,RU -3343047440,3343047519,US -3343047520,3343047535,IN -3343047536,3343047751,US -3343047752,3343047759,BR -3343047760,3343047791,US -3343047792,3343047799,PL -3343047800,3343047847,US -3343047848,3343047855,IT -3343047856,3343055871,US -3343055872,3343056895,CA -3343056896,3343117311,US -3343117312,3343117567,JP -3343117568,3343153151,US -3343153152,3343153167,CA -3343153168,3343153175,US -3343153176,3343154943,CA -3343154944,3343167487,US -3343167488,3343169535,CA -3343169536,3343171583,US -3343171584,3343172607,BM -3343172608,3343172695,US -3343172696,3343172703,NL -3343172704,3343319295,US -3343319296,3343342847,CA -3343342848,3343343103,PR -3343343104,3343346175,CA -3343346176,3343346687,US -3343346688,3343355391,CA -3343355392,3343355903,US -3343355904,3343359743,CA -3343359744,3343359999,US -3343360000,3343364095,CA -3343364096,3343365631,US -3343365632,3343366655,CA -3343366656,3343366911,US -3343366912,3343372543,CA -3343372544,3343378431,US -3343378432,3343378447,BR -3343378448,3343378511,US -3343378512,3343378519,GB -3343378520,3343378535,US -3343378536,3343378543,GB -3343378544,3343378559,US -3343378560,3343378583,GB -3343378584,3343378599,US -3343378600,3343378607,RU -3343378608,3343378615,GB -3343378616,3343378751,US -3343378752,3343378759,BR -3343378760,3343378767,CL -3343378768,3343378775,BR -3343378776,3343378791,RU -3343378792,3343378799,US -3343378800,3343378807,VE -3343378808,3343378815,UA -3343378816,3343378823,US -3343378824,3343378839,SE -3343378840,3343378847,RU -3343378848,3343378863,BR -3343378864,3343378879,US -3343378880,3343378887,RU -3343378888,3343378895,BL -3343378896,3343378911,US -3343378912,3343378919,VE -3343378920,3343378927,NL -3343378928,3343378959,US -3343378960,3343378967,RU -3343378968,3343379039,US -3343379040,3343379071,GB -3343379072,3343379079,RU -3343379080,3343379087,SE -3343379088,3343379095,BR -3343379096,3343379103,NL -3343379104,3343379119,US -3343379120,3343379127,NL -3343379128,3343379143,US -3343379144,3343379151,GB -3343379152,3343379183,US -3343379184,3343379199,EE -3343379200,3343379215,US -3343379216,3343379223,BR -3343379224,3343379391,US -3343379392,3343379399,NI -3343379400,3343379407,CO -3343379408,3343380479,US -3343380480,3343384319,CA -3343384320,3343457527,US -3343457528,3343457535,ID -3343457536,3343457607,US -3343457608,3343457615,AU -3343457616,3343457743,US -3343457744,3343457759,CA -3343457760,3343457807,US -3343457808,3343457815,GB -3343457816,3343460863,US -3343460864,3343461375,CA -3343461376,3343465471,US -3343465472,3343466495,JM -3343466496,3343563521,US -3343563522,3343563522,SG -3343563523,3343649791,US -3343649792,3343650815,VI -3343650816,3343653535,US -3343653536,3343653551,CA -3343653552,3343653631,US -3343653632,3343653695,CA -3343653696,3343746047,US -3343746048,3343747071,VI -3343747072,3343763903,US -3343763904,3343763935,CA -3343763936,3343858687,US -3343858688,3343859199,VG -3343859200,3343922975,US -3343922976,3343923007,PA -3343923008,3343923071,US -3343923072,3343923135,CY -3343923136,3343923199,HK -3343923200,3344116223,US -3344116224,3344116735,CA -3344116736,3344126975,US -3344126976,3344127999,CA -3344128000,3344140287,US -3344140288,3344141311,CA -3344141312,3344144383,US -3344144384,3344148479,CA -3344148480,3344154623,US -3344154624,3344156671,GD -3344156672,3344158719,CA -3344158720,3344165631,US -3344165632,3344165663,MX -3344165664,3344166911,US -3344166912,3344168959,CA -3344168960,3344171263,US -3344171264,3344195583,CA -3344195584,3344203775,US -3344203776,3344236287,CA -3344236288,3344237055,US -3344237056,3344238335,CA -3344238336,3344238591,US -3344240640,3344242175,CA -3344242176,3344242687,US -3344242688,3344252671,CA -3344252672,3344252927,US -3344252928,3344255999,CA -3344256000,3344261887,US -3344261888,3344266239,CA -3344266240,3344266751,US -3344266752,3344268543,CA -3344268544,3344268799,IN -3344268800,3344269311,US -3344269312,3344287743,CA -3344287744,3344287999,US -3344288000,3344288767,CA -3344288768,3344289791,PR -3344289792,3344292863,US -3344292864,3344296447,CA -3344296448,3344296959,US -3344296960,3344297983,GD -3344297984,3344299263,US -3344299264,3344299519,CA -3344299520,3344299775,US -3344299776,3344300543,CA -3344300544,3344300799,US -3344300800,3344301823,CA -3344301824,3344379903,US -3344379904,3344380927,CA -3344380928,3344381167,US -3344381168,3344381175,NZ -3344381176,3344381215,US -3344381216,3344381223,NG -3344381224,3344381255,US -3344381256,3344381263,CA -3344381264,3344381271,MX -3344381272,3344381887,US -3344381888,3344381893,ES -3344381894,3344406527,US -3344406528,3344408575,CA -3344408576,3344411135,US -3344411136,3344411647,BM -3344411648,3344415679,US -3344415680,3344415743,AR -3344415744,3344429055,US -3344429056,3344429343,CA -3344429344,3344429375,US -3344429376,3344431103,CA -3344431104,3344486399,US -3344486400,3344488447,NL -3344488448,3344534271,US -3344534272,3344534527,CA -3344534528,3344633855,US -3344633856,3344637951,CH -3344637952,3344648703,US -3344648704,3344648959,SG -3344648960,3344649215,DE -3344649216,3344650239,PR -3344650240,3344652287,CA -3344652288,3344654335,US -3344654336,3344656383,VG -3344656384,3344658431,US -3344658432,3344660479,CA -3344660480,3344670719,US -3344670720,3344670975,MF -3344670976,3344671103,MQ -3344671104,3344671231,GP -3344671232,3344671487,MQ -3344671488,3344671743,BL -3344671744,3344673983,US -3344673984,3344673991,SC -3344673992,3344674079,US -3344674080,3344674087,GB -3344674088,3344674151,US -3344674152,3344674159,TR -3344674160,3344674207,US -3344674208,3344674223,GB -3344674224,3344674279,US -3344674280,3344674287,GB -3344674288,3344674343,US -3344674344,3344674351,TR -3344674352,3344674471,US -3344674472,3344674479,GB -3344674480,3344674751,US -3344674752,3344674767,MO -3344674768,3344676863,US -3344676864,3344677247,CA -3344677248,3344677263,US -3344677264,3344677279,CA -3344677280,3344677295,US -3344677296,3344677407,CA -3344677408,3344677423,US -3344677424,3344678911,CA -3344678912,3344680959,AE -3344680960,3344681983,US -3344681984,3344685055,CA -3344685056,3344691199,US -3344691200,3344693247,CA -3344693248,3344694271,US -3344694272,3344695295,CA -3344695296,3344937471,US -3344937472,3344937983,EG -3344937984,3344938239,US -3344938240,3344938495,UZ -3344938496,3344955391,US -3344955392,3344955647,GB -3344955648,3344964607,US -3344964608,3344965631,CA -3344965632,3344973823,US -3344973824,3344974847,BM -3344974848,3344979967,US -3344979968,3344982015,CA -3344982016,3345007615,US -3345007616,3345008639,CA -3345008640,3345010687,US -3345010688,3345011711,CA -3345011712,3345299455,US -3345299456,3345301503,CA -3345301504,3345303551,US -3345303552,3345304575,CA -3345304576,3345315071,US -3345315072,3345315327,TW -3345315328,3345315583,US -3345315584,3345315839,TW -3345315840,3345318943,US -3345318944,3345318975,CY -3345318976,3345321471,US -3345321472,3345321983,GB -3345321984,3345327103,US -3345327104,3345328127,CA -3345328128,3345332287,US -3345332288,3345332295,GH -3345332296,3345332303,PK -3345332304,3345332311,US -3345332312,3345332319,LK -3345332320,3345332327,PT -3345332328,3345332339,US -3345332340,3345332343,GH -3345332344,3345332347,US -3345332348,3345332351,CY -3345332352,3345332375,US -3345332376,3345332383,CA -3345332384,3345332387,AE -3345332388,3345332403,US -3345332404,3345332407,GH -3345332408,3345332411,ID -3345332412,3345332423,US -3345332424,3345332431,MY -3345332432,3345332435,VN -3345332436,3345332439,GB -3345332440,3345332463,US -3345332464,3345332471,VN -3345332472,3345332487,US -3345332488,3345332495,AU -3345332496,3345332503,CA -3345332504,3345332511,BR -3345332512,3345332535,US -3345332536,3345332539,BR -3345332540,3345332583,US -3345332584,3345332587,CY -3345332588,3345332591,IN -3345332592,3345332595,US -3345332596,3345332599,BD -3345332600,3345332603,US -3345332604,3345332607,ID -3345332608,3345332655,US -3345332656,3345332659,CY -3345332660,3345332663,VN -3345332664,3345332667,US -3345332668,3345332671,ID -3345332672,3345332751,US -3345332752,3345332767,GB -3345332768,3345332799,US -3345332800,3345332815,GB -3345332816,3345332991,US -3345332992,3345333055,VN -3345333056,3345333183,US -3345333184,3345333215,IN -3345333216,3345333219,BR -3345333220,3345333223,GH -3345333224,3345333227,MX -3345333228,3345333231,CY -3345333232,3345333247,US -3345333248,3345333759,GP -3345333760,3345334271,MF -3345334272,3345339391,US -3345339392,3345340415,CA -3345340416,3345375231,US -3345375232,3345377279,CA -3345377280,3345383423,US -3345383424,3345384447,CA -3345384448,3345390591,US -3345390592,3345391615,CA -3345391616,3345398783,US -3345398784,3345399807,BS -3345399808,3345401855,PR -3345401856,3345403903,CA -3345403904,3345408092,US -3345408093,3345408094,GB -3345408095,3345408110,US -3345408111,3345408114,AU -3345408115,3345408189,US -3345408190,3345408193,AR -3345408194,3345408225,US -3345408226,3345408227,GB -3345408228,3345408235,US -3345408236,3345408239,CN -3345408240,3345408319,US -3345408320,3345408323,GB -3345408324,3345408390,US -3345408391,3345408394,GB -3345408395,3345408415,US -3345408416,3345408420,AU -3345408421,3345408460,US -3345408461,3345408464,IN -3345408465,3345408496,US -3345408497,3345408497,GB -3345408498,3345408499,US -3345408500,3345408500,GB -3345408501,3345408534,US -3345408535,3345408538,AU -3345408539,3345408569,US -3345408570,3345408573,CA -3345408574,3345408577,US -3345408578,3345408585,GB -3345408586,3345408634,US -3345408635,3345408639,CA -3345408640,3345408651,US -3345408652,3345408655,CA -3345408656,3345408784,US -3345408785,3345408788,CA -3345408789,3345408903,US -3345408904,3345408907,GB -3345408908,3345409085,US -3345409086,3345409089,CA -3345409090,3345409093,US -3345409094,3345409097,CA -3345409098,3345409175,US -3345409176,3345409179,CN -3345409180,3345409558,US -3345409559,3345409562,CA -3345409563,3345409578,US -3345409579,3345409580,GB -3345409581,3345409706,US -3345409707,3345409710,IN -3345409711,3345409816,US -3345409817,3345409820,GB -3345409821,3345409871,US -3345409872,3345409875,CA -3345409876,3345409887,US -3345409888,3345409891,GB -3345409892,3345409911,US -3345409912,3345409915,CA -3345409916,3345409919,AU -3345409920,3345409945,US -3345409946,3345409949,SG -3345409950,3345412095,US -3345412096,3345413119,CA -3345413120,3345418239,US -3345418240,3345419519,NL -3345419520,3345422847,US -3345423360,3345424383,TC -3345424384,3345430527,US -3345430528,3345431039,CA -3345431040,3345431295,US -3345431296,3345432575,CA -3345432576,3345433599,GB -3345433600,3345433855,SG -3345433856,3345434879,US -3345434880,3345435135,ES -3345435136,3345435391,LU -3345435392,3345436159,DE -3345436160,3345436927,US -3345436928,3345437183,ES -3345437184,3345437695,GB -3345437696,3345437951,US -3345437952,3345438207,CA -3345438208,3345438463,GB -3345438464,3345438975,FR -3345439232,3345439743,US -3345439744,3345439999,FR -3345440000,3345440255,DE -3345440256,3345441023,US -3345441024,3345441791,DE -3345442304,3345442559,CL -3345442560,3345442815,JP -3345442816,3345443327,AT -3345443328,3345443583,CH -3345443584,3345443839,DE -3345443840,3345444607,US -3345444608,3345445119,CH -3345445120,3345446655,US -3345446656,3345446911,IT -3345446912,3345447679,US -3345447680,3345447935,BE -3345447936,3345448447,FR -3345448448,3345448703,BE -3345448704,3345448959,DE -3345448960,3345666623,US -3345666624,3345666639,NO -3345666640,3345667103,US -3345667104,3345667119,IN -3345667120,3346196479,US -3346196480,3346197503,CA -3346197504,3346198527,US -3346198528,3346200575,CA -3346200576,3346201599,US -3346201600,3346202623,CA -3346202624,3346209279,US -3346209792,3346210241,JM -3346210242,3346210242,CA -3346210243,3346210303,JM -3346210304,3346219007,US -3346219008,3346221055,CA -3346221056,3346221583,US -3346221584,3346221591,IT -3346221592,3346221623,US -3346221624,3346221631,RU -3346221632,3346221655,US -3346221656,3346221663,IT -3346221664,3346221671,BE -3346221672,3346221679,US -3346221680,3346221687,NL -3346221688,3346221719,US -3346221720,3346221727,CA -3346221728,3346221871,US -3346221872,3346221887,SG -3346221888,3346221903,US -3346221904,3346221911,IT -3346221912,3346221999,US -3346222000,3346222007,BR -3346222008,3346222039,US -3346222040,3346222047,PL -3346222048,3346225151,US -3346225152,3346227199,CA -3346227200,3346231743,US -3346231744,3346231807,SC -3346231808,3346231810,US -3346231811,3346231827,AR -3346231828,3346231846,US -3346231847,3346231854,GB -3346231855,3346231916,US -3346231917,3346231924,GB -3346231925,3346232460,US -3346232461,3346232468,AR -3346232469,3346232608,US -3346232609,3346232617,AR -3346232618,3346232703,US -3346232704,3346232767,GB -3346232768,3346232831,US -3346232832,3346232895,GB -3346232896,3346232959,US -3346232960,3346232991,GB -3346232992,3346233023,US -3346233024,3346233087,GB -3346233088,3346233279,US -3346233280,3346233311,GB -3346233312,3346234367,US -3346234368,3346234687,CA -3346234688,3346234695,US -3346234696,3346234911,CA -3346234912,3346234919,FR -3346234920,3346235391,CA -3346235392,3346241535,US -3346241536,3346243327,CA -3346243328,3346282495,US -3346282496,3346284543,PR -3346284544,3346319359,US -3346321408,3346322431,US -3346323456,3346325503,CA -3346325504,3346327551,US -3346327552,3346328575,CA -3346328576,3346329599,US -3346329600,3346330623,CA -3346330624,3346332103,US -3346332104,3346332111,GB -3346332112,3346492831,US -3346492832,3346492839,CA -3346492840,3346497535,US -3346497536,3346498559,CA -3346498560,3346505783,US -3346505784,3346505791,GB -3346505792,3346505895,US -3346505896,3346505903,AU -3346505904,3346506111,US -3346506112,3346506119,JM -3346506120,3346506271,US -3346506272,3346506279,GB -3346506280,3346506287,CA -3346506288,3346506311,US -3346506312,3346506319,CO -3346506320,3346506415,US -3346506416,3346506423,IN -3346506424,3346506447,US -3346506448,3346506455,CA -3346506456,3346506487,US -3346506488,3346506495,CA -3346506496,3346506527,US -3346506528,3346506535,GB -3346506536,3346506567,US -3346506568,3346506575,TR -3346506576,3346520063,US -3346520064,3346521087,CA -3346521088,3346523135,US -3346523136,3346523391,BO -3346523392,3346523647,RU -3346523648,3346523903,US -3346523904,3346524159,FR -3346524160,3346525183,CA -3346525184,3346528255,US -3346528256,3346529279,PR -3346529280,3346530303,CA -3346530304,3346591487,US -3346591488,3346591743,CA -3346591744,3346663167,US -3346663168,3346663423,CA -3346663424,3346691071,US -3346691072,3346692095,CA -3346692096,3346793215,US -3346793216,3346793471,CA -3346793472,3346793983,US -3346794496,3346899711,US -3346899712,3346899967,CA -3346899968,3346923519,US -3346923520,3346989055,CA -3346989056,3347013631,US -3347013632,3347014399,CA -3347014400,3347014655,US -3347014656,3347015167,CA -3347015168,3347015295,QA -3347015296,3347015423,KW -3347015424,3347015647,US -3347015648,3347015663,AE -3347015664,3347016703,US -3347016704,3347017727,CA -3347017728,3347021823,US -3347021824,3347022847,CA -3347022848,3347030527,US -3347030528,3347030783,IN -3347030784,3347033087,US -3347033088,3347034111,CA -3347034112,3347039231,US -3347039232,3347040255,DM -3347040256,3349268479,US -3349268480,3349268991,CA -3349268992,3349273087,US -3349273088,3349273343,CA -3349273344,3349341695,US -3349341696,3349341951,CA -3349341952,3349446911,US -3349446912,3349447167,CA -3349447168,3349463039,US -3349463040,3349463295,CA -3349463296,3349479167,US -3349479168,3349479423,CA -3349479424,3349533695,US -3349533696,3349533951,CA -3349533952,3349545215,US -3349545216,3349545727,CA -3349545728,3349545983,US -3349545984,3349551103,CA -3349551104,3349553663,US -3349553664,3349554687,IN -3349554688,3349600255,CA -3349600256,3349601023,US -3349601024,3349605375,CA -3349605376,3349605631,US -3349605632,3349608447,CA -3349608448,3349609471,US -3349609472,3349610239,CA -3349610240,3349614591,US -3349614592,3349614655,CA -3349614656,3349614671,US -3349614672,3349614783,CA -3349614784,3349614847,US -3349614848,3349615551,CA -3349615552,3349615615,US -3349615616,3349616127,CA -3349616128,3349616639,US -3349616640,3349617663,CA -3349617664,3349619343,US -3349619344,3349619391,CA -3349619392,3349619503,US -3349619504,3349619519,PA -3349619520,3349619583,CA -3349619584,3349637119,US -3349637120,3349639167,CA -3349639168,3349640191,US -3349640192,3349641215,CA -3349641216,3349643263,US -3349643264,3349643423,CA -3349643424,3349643431,US -3349643432,3349644287,CA -3349644288,3349645311,US -3349645312,3349647359,CA -3349647360,3349648165,US -3349648166,3349648168,NG -3349648169,3349649407,US -3349649408,3349650687,CA -3349650688,3349650943,GB -3349650944,3349653503,CA -3349653504,3349723175,US -3349723176,3349723183,LK -3349723184,3349723199,US -3349723200,3349723215,PK -3349723216,3349723260,US -3349723261,3349723265,CA -3349723266,3349723360,US -3349723361,3349723367,CA -3349723368,3349723996,US -3349723997,3349724000,LK -3349724001,3349724191,US -3349724192,3349724199,AF -3349724200,3349724207,US -3349724208,3349724215,CA -3349724216,3349724351,US -3349724352,3349724359,PK -3349724360,3349724415,US -3349724416,3349724447,AE -3349724448,3349724985,US -3349724986,3349724999,PK -3349725000,3349731327,US -3349731328,3349732003,CA -3349732004,3349732007,US -3349732008,3349733375,CA -3349733376,3349739519,US -3349739520,3349739551,CA -3349739552,3349739559,US -3349739560,3349740543,CA -3349740544,3349987327,US -3349987328,3349996543,BM -3349996544,3349997055,KY -3349997056,3350002687,BM -3350002688,3350002719,US -3350002720,3350002943,BM -3350002944,3350003007,US -3350003008,3350003711,BM -3350003712,3350042879,US -3350042880,3350043135,KW -3350043136,3350134783,US -3350134784,3350136575,CA -3350136576,3350136831,US -3350136832,3350146047,CA -3350146048,3350150143,US -3350150144,3350160639,CA -3350160640,3350160895,US -3350160896,3350161919,CA -3350161920,3350162431,US -3350162432,3350166527,CA -3350166528,3350167551,US -3350167552,3350169855,CA -3350169856,3350170111,US -3350170112,3350181887,CA -3350181888,3350183167,US -3350183168,3350200063,CA -3350200064,3350469119,US -3350469632,3350470655,CA -3350470656,3350475775,US -3350475776,3350476799,CA -3350476800,3350487039,US -3350487040,3350488063,CA -3350488064,3350488103,US -3350488104,3350488127,CN -3350488128,3350488159,US -3350488160,3350488191,CN -3350488192,3350488207,US -3350488208,3350488223,CN -3350488224,3350488247,US -3350488248,3350488255,CN -3350488256,3350488271,US -3350488272,3350488279,CN -3350488280,3350488319,US -3350488320,3350488327,CN -3350488328,3350488343,US -3350488344,3350488367,CN -3350488368,3350488455,US -3350488456,3350488463,CN -3350488464,3350488471,US -3350488472,3350488479,CN -3350488480,3350488487,US -3350488488,3350488543,CN -3350488544,3350488575,US -3350488576,3350488607,CN -3350488608,3350488743,US -3350488744,3350488751,CN -3350488752,3350488847,US -3350488848,3350488855,CN -3350488856,3350488959,US -3350488960,3350489023,CN -3350489024,3350489063,US -3350489064,3350489071,CN -3350489072,3350492961,US -3350492962,3350492990,GB -3350492991,3350501395,US -3350501396,3350501399,TR -3350501400,3350501403,PH -3350501404,3350503103,US -3350503104,3350503135,PH -3350503136,3350505471,US -3350505472,3350507519,CA -3350507520,3350514639,US -3350514640,3350514655,GB -3350514656,3350514879,US -3350514880,3350514911,GB -3350514912,3350515135,US -3350515136,3350515167,GB -3350515168,3350518887,US -3350518888,3350518891,FR -3350518892,3350518895,US -3350518896,3350518899,CA -3350518900,3350518975,US -3350518976,3350518979,PR -3350518980,3350519035,US -3350519036,3350519039,PA -3350519040,3350519059,US -3350519060,3350519063,IN -3350519064,3350548735,US -3350548736,3350548991,CA -3350548992,3350574591,US -3350574848,3350575103,CA -3350575104,3350593535,US -3350593536,3350605823,CA -3350605824,3350606847,US -3350606848,3350607871,CA -3350607872,3350618111,US -3350618112,3350619135,CA -3350619136,3350620383,US -3350620384,3350620415,GB -3350620416,3350623231,US -3350623232,3350624255,CA -3350624256,3350626303,US -3350626304,3350628351,CA -3350628352,3350642687,US -3350642688,3350643711,TC -3350643712,3350645759,US -3350646784,3350648831,US -3350648832,3350650623,CA -3350650624,3350650631,US -3350650632,3350650879,CA -3350650880,3350762495,US -3350762496,3350762751,GB -3350762752,3350763263,SG -3350763264,3350763519,HK -3350763520,3350790399,US -3350790400,3350814975,CA -3350814976,3350815231,US -3350815232,3350823423,CA -3350823424,3350823935,US -3350823936,3350825727,CA -3350825728,3350825983,GB -3350825984,3350834687,CA -3350834688,3350835199,US -3350835200,3350836223,CA -3350836224,3350836227,US -3350836228,3350836235,GB -3350836236,3350836239,US -3350836240,3350836243,IQ -3350836244,3350836247,EG -3350836248,3350836251,SA -3350836252,3350836255,IT -3350836256,3350836259,NZ -3350836260,3350836263,HK -3350836264,3350836267,CN -3350836268,3350836275,IN -3350836276,3350836279,ZA -3350836280,3350836283,CA -3350836284,3350836991,US -3350836992,3350837247,CA -3350837248,3350837759,US -3350837760,3350843391,CA -3350843392,3350843647,US -3350843648,3350855679,CA -3350855680,3350862079,US -3350862080,3350864639,CL -3350864640,3350952495,US -3350952496,3350952511,PE -3350952512,3350952583,US -3350952584,3350952591,BA -3350952592,3350952799,US -3350952800,3350952815,AZ -3350952816,3350953135,US -3350953136,3350953143,AZ -3350953144,3350953615,US -3350953616,3350953623,AR -3350953624,3350953631,NZ -3350953632,3350953855,US -3350953856,3350953871,AZ -3350953872,3350970367,US -3350970368,3350971391,CA -3350971392,3350978559,US -3350979584,3350980607,CA -3350980608,3350994943,US -3350994944,3350998015,CA -3350998016,3351002111,US -3351002112,3351003135,CA -3351003136,3351004159,US -3351004160,3351005183,CA -3351005184,3351012543,US -3351012544,3351012575,SE -3351012576,3351012995,US -3351012996,3351012999,RO -3351013000,3351013151,US -3351013152,3351013167,KW -3351013168,3351013375,US -3351013376,3351013391,CN -3351013392,3351013407,US -3351013408,3351013439,CN -3351013440,3351013447,US -3351013448,3351014183,CN -3351014184,3351014207,US -3351014208,3351014591,CN -3351014592,3351014655,US -3351014656,3351014663,CN -3351014664,3351014671,US -3351014672,3351014799,CN -3351014800,3351014807,CA -3351014808,3351014815,CN -3351014816,3351014911,US -3351014912,3351014943,CN -3351014944,3351015039,US -3351015040,3351015103,CN -3351015104,3351015135,US -3351015136,3351015151,CN -3351015152,3351015159,US -3351015160,3351015167,CN -3351015168,3351015231,US -3351015232,3351015239,CN -3351015240,3351015247,US -3351015248,3351015263,CN -3351015264,3351015279,US -3351015280,3351015295,CN -3351015296,3351015303,US -3351015304,3351015327,CN -3351015328,3351015343,US -3351015344,3351015359,CN -3351015360,3351015423,US -3351015424,3351016447,CA -3351016448,3351030783,US -3351030784,3351031807,CA -3351031808,3351034879,US -3351034880,3351035903,CA -3351035904,3351043071,US -3351043072,3351043327,CA -3351043328,3351043583,FR -3351043584,3351044095,CA -3351044096,3351045311,US -3351045312,3351045343,EE -3351045344,3351058943,US -3351058944,3351059455,CA -3351059456,3351071743,US -3351071744,3351072767,CA -3351072768,3351074241,US -3351074242,3351074242,MX -3351074243,3351074271,US -3351074272,3351074272,GT -3351074273,3351074301,US -3351074302,3351074302,PT -3351074303,3351074303,BR -3351074304,3351074367,US -3351074368,3351074369,BR -3351074370,3351074373,US -3351074374,3351074374,AR -3351074375,3351074375,BR -3351074376,3351074377,DE -3351074378,3351074378,BD -3351074379,3351074379,US -3351074380,3351074380,DE -3351074381,3351074381,US -3351074382,3351074382,KW -3351074383,3351074383,BR -3351074384,3351074385,US -3351074386,3351074386,RU -3351074387,3351074387,BR -3351074388,3351074388,DE -3351074389,3351074389,US -3351074390,3351074390,DE -3351074391,3351074391,BR -3351074392,3351074392,CL -3351074393,3351074394,US -3351074395,3351074395,TR -3351074396,3351074396,BR -3351074397,3351074397,SE -3351074398,3351074402,US -3351074403,3351074403,BR -3351074404,3351074404,CL -3351074405,3351074405,US -3351074406,3351074406,CA -3351074407,3351074407,US -3351074408,3351074409,BR -3351074410,3351074410,DE -3351074411,3351074415,US -3351074416,3351074417,BR -3351074418,3351074418,US -3351074419,3351074419,IN -3351074420,3351074426,US -3351074427,3351074427,DE -3351074428,3351074429,US -3351074430,3351074430,BR -3351074431,3351074434,US -3351074435,3351074435,BR -3351074436,3351074439,US -3351074440,3351074440,CA -3351074441,3351074444,US -3351074445,3351074445,CA -3351074446,3351074446,CL -3351074447,3351074456,US -3351074457,3351074457,RU -3351074458,3351074463,US -3351074464,3351074466,BR -3351074467,3351074467,US -3351074468,3351074468,RU -3351074469,3351074469,US -3351074470,3351074471,RU -3351074472,3351074472,US -3351074473,3351074473,BR -3351074474,3351074474,RU -3351074475,3351074475,BR -3351074476,3351074480,US -3351074481,3351074482,RU -3351074483,3351074483,US -3351074484,3351074484,CA -3351074485,3351074486,US -3351074487,3351074487,DE -3351074488,3351074488,US -3351074489,3351074489,BR -3351074490,3351074495,RU -3351074496,3351074496,US -3351074497,3351074497,BD -3351074498,3351074498,RU -3351074499,3351074499,CL -3351074500,3351074500,RU -3351074501,3351074504,US -3351074505,3351074505,DE -3351074506,3351074507,US -3351074508,3351074511,RU -3351074512,3351074512,AR -3351074513,3351074516,RU -3351074517,3351074518,CA -3351074519,3351074521,US -3351074522,3351074524,RU -3351074525,3351074528,CA -3351074529,3351074538,US -3351074539,3351074543,RU -3351074544,3351074545,US -3351074546,3351074550,RU -3351074551,3351074551,SK -3351074552,3351074557,US -3351074558,3351074558,CA -3351074559,3351074559,MY -3351074560,3351074690,US -3351074691,3351074691,BR -3351074692,3351074711,US -3351074712,3351074712,TR -3351074713,3351074728,US -3351074729,3351074729,EG -3351074730,3351074731,US -3351074732,3351074732,BR -3351074733,3351074734,US -3351074735,3351074735,BR -3351074736,3351074743,US -3351074744,3351074745,BR -3351074746,3351074746,AU -3351074747,3351074750,US -3351074751,3351074751,HU -3351074752,3351074815,US -3351074816,3351076863,CA -3351076864,3351080959,US -3351080960,3351081727,AG -3351081728,3351081983,DM -3351081984,3351086079,US -3351086080,3351087103,CA -3351087104,3351094271,US -3351094272,3351095295,CA -3351095296,3351100887,US -3351100888,3351100891,CA -3351100892,3351100895,US -3351100896,3351100927,CA -3351100928,3351103487,US -3351103488,3351104511,CA -3351104512,3351112703,US -3351112704,3351113727,CA -3351113728,3351129087,US -3351129088,3351129343,HK -3351129344,3351196159,US -3351196160,3351196671,VG -3351196672,3351197695,US -3351197696,3351197711,PT -3351197712,3351197715,US -3351197716,3351197719,GH -3351197720,3351197735,US -3351197736,3351197739,CY -3351197740,3351197743,US -3351197744,3351197751,VN -3351197752,3351197759,PT -3351197760,3351197767,US -3351197768,3351197775,IN -3351197776,3351197783,BR -3351197784,3351197791,US -3351197792,3351197795,IN -3351197796,3351197799,BR -3351197800,3351197803,CN -3351197804,3351197807,AE -3351197808,3351197835,US -3351197836,3351197839,BR -3351197840,3351197859,US -3351197860,3351197863,CY -3351197864,3351197867,US -3351197868,3351197871,CY -3351197872,3351197879,US -3351197880,3351197887,GH -3351197888,3351197891,MX -3351197892,3351197899,BR -3351197900,3351197903,CY -3351197904,3351198023,US -3351198024,3351198031,GH -3351198032,3351198059,US -3351198060,3351198063,GH -3351198064,3351198071,IN -3351198072,3351198091,US -3351198092,3351198095,GT -3351198096,3351198103,MX -3351198104,3351198111,VN -3351198112,3351198127,US -3351198128,3351198131,IN -3351198132,3351198135,BR -3351198136,3351198155,US -3351198156,3351198159,EG -3351198160,3351198171,US -3351198172,3351198175,GH -3351198176,3351198183,US -3351198184,3351198187,GH -3351198188,3351198215,US -3351198216,3351198223,VN -3351198224,3351198231,US -3351198232,3351198235,CA -3351198236,3351198239,US -3351198240,3351198247,TR -3351198248,3351198251,ID -3351198252,3351198255,GH -3351198256,3351198259,US -3351198260,3351198263,DE -3351198264,3351198335,US -3351198336,3351198351,CA -3351198352,3351198355,GT -3351198356,3351198359,US -3351198360,3351198363,GB -3351198364,3351198371,US -3351198372,3351198383,CA -3351198384,3351198387,GH -3351198388,3351198391,US -3351198392,3351198399,TR -3351198400,3351198403,US -3351198404,3351198407,IN -3351198408,3351198411,US -3351198412,3351198415,GB -3351198416,3351198423,GT -3351198424,3351198427,RO -3351198428,3351198431,US -3351198432,3351198439,IN -3351198440,3351198447,US -3351198448,3351198463,JO -3351198464,3351198475,US -3351198476,3351198479,CY -3351198480,3351198495,US -3351198496,3351198499,CN -3351198500,3351198519,US -3351198520,3351198527,IN -3351198528,3351198535,US -3351198536,3351198539,CY -3351198540,3351198559,US -3351198560,3351198563,ID -3351198564,3351198567,CN -3351198568,3351198575,US -3351198576,3351198579,CY -3351198580,3351198607,US -3351198608,3351198615,GR -3351198616,3351198619,MX -3351198620,3351198623,BD -3351198624,3351198627,CY -3351198628,3351198687,US -3351198688,3351198703,MA -3351198704,3351198711,IN -3351198712,3351232511,US -3351232512,3351232767,IL -3351232768,3351268111,US -3351268112,3351268115,GB -3351268116,3351268131,US -3351268132,3351268135,GB -3351268136,3351268493,US -3351268494,3351268494,DE -3351268495,3351268533,US -3351268534,3351268534,CN -3351268535,3351268537,US -3351268538,3351268538,CN -3351268539,3351268553,US -3351268554,3351268554,CN -3351268555,3351268565,US -3351268566,3351268566,MY -3351268567,3351268613,US -3351268614,3351268614,PA -3351268615,3351268617,US -3351268618,3351268618,IN -3351268619,3351268645,US -3351268646,3351268646,CN -3351268647,3351268653,US -3351268654,3351268654,BR -3351268655,3351268669,US -3351268670,3351268670,CN -3351268671,3351268721,US -3351268722,3351268722,DE -3351268723,3351268789,US -3351268790,3351268790,BR -3351268791,3351268809,US -3351268810,3351268810,CN -3351268811,3351268841,US -3351268842,3351268842,CN -3351268843,3351268953,US -3351268954,3351268954,DE -3351268955,3351268961,US -3351268962,3351268962,CN -3351268963,3351269033,US -3351269034,3351269034,CN -3351269035,3351269065,US -3351269066,3351269066,SE -3351269067,3351269217,US -3351269218,3351269218,DE -3351269219,3351269241,US -3351269242,3351269242,CA -3351269243,3351269257,US -3351269258,3351269258,DE -3351269259,3351269261,US -3351269262,3351269262,CN -3351269263,3351275519,US -3351275520,3351276543,CA -3351276544,3351293951,US -3351293952,3351294975,CA -3351294976,3351295999,US -3351296000,3351298047,CA -3351298048,3351303167,US -3351303168,3351304191,CA -3351304192,3351306239,US -3351306240,3351306751,VC -3351306752,3351307263,LC -3351307264,3351308287,US -3351308288,3351310335,CA -3351310336,3351310895,US -3351310896,3351310911,GB -3351310912,3351326719,US -3351326720,3351328767,CA -3351328768,3351329279,US -3351329280,3351329535,CA -3351329536,3351336959,US -3351336960,3351339007,CA -3351339008,3351353471,US -3351353472,3351353479,TR -3351353480,3351353503,US -3351353504,3351353511,AE -3351353512,3351353575,US -3351353576,3351353583,CA -3351353584,3351353631,US -3351353632,3351353663,TR -3351353664,3351353823,US -3351353824,3351353839,BR -3351353840,3351354111,US -3351354112,3351354367,PK -3351354368,3351357439,US -3351357440,3351359487,CA -3351359488,3351372799,US -3351372800,3351373823,BM -3351373824,3351380223,US -3351380224,3351380479,CA -3351380480,3351380991,US -3351380992,3351381759,CA -3351381760,3351382271,US -3351382272,3351382527,CA -3351382528,3351383039,US -3351383040,3351383295,CA -3351383296,3351384319,US -3351384320,3351384575,CA -3351384576,3351385343,US -3351385344,3351385599,CA -3351385600,3351386111,US -3351386112,3351386367,PR -3351386368,3351386623,US -3351386624,3351386879,CA -3351386880,3351387135,US -3351387136,3351387391,CA -3351387392,3351387903,US -3351387904,3351388159,CA -3351388160,3351388927,US -3351388928,3351389439,CA -3351389440,3351390463,US -3351390464,3351390975,CA -3351390976,3351394815,US -3351394816,3351395071,CA -3351395072,3351396095,US -3351396096,3351396351,CA -3351396352,3351397375,US -3351397376,3351397631,CA -3351397632,3351397887,US -3351397888,3351398143,CA -3351398144,3351398399,US -3351398400,3351398655,CA -3351398656,3351398911,US -3351398912,3351399167,CA -3351399168,3351399423,US -3351399424,3351399935,CA -3351399936,3351400191,US -3351400192,3351400447,CA -3351400448,3351400959,US -3351400960,3351401215,CA -3351401216,3351401983,US -3351401984,3351402239,CA -3351402240,3351402495,US -3351402496,3351403775,CA -3351403776,3351404031,US -3351404032,3351404287,CA -3351404288,3351405311,US -3351405312,3351405567,CA -3351405568,3351405823,US -3351405824,3351406079,CA -3351406080,3351407103,US -3351407104,3351407359,CA -3351407360,3351407615,US -3351407616,3351407871,CA -3351407872,3351408895,US -3351408896,3351409407,CA -3351409408,3351410687,US -3351410688,3351410943,CA -3351410944,3351411711,US -3351411712,3351411967,CA -3351411968,3351412223,US -3351412224,3351412479,CA -3351412480,3351412735,US -3351412736,3351413247,CA -3351413248,3351413503,US -3351413504,3351413759,CA -3351413760,3351414271,US -3351414272,3351414783,CA -3351414784,3351415039,US -3351415040,3351415551,CA -3351415552,3351415807,US -3351415808,3351416063,CA -3351416064,3351417087,US -3351417088,3351417599,CA -3351417600,3351419647,US -3351419648,3351419903,CA -3351419904,3351423743,US -3351423744,3351423999,PR -3351424000,3351428351,US -3351428352,3351428607,CA -3351428608,3351436031,US -3351436032,3351436287,CA -3351436288,3351436543,US -3351436544,3351436799,PR -3351436800,3351437055,US -3351437056,3351437311,CA -3351437312,3351437567,US -3351437568,3351437823,CA -3351437824,3351438079,US -3351438080,3351438335,CA -3351438336,3351438591,US -3351438592,3351439103,CA -3351439104,3351441151,US -3351441152,3351441407,CA -3351441408,3351441919,US -3351441920,3351442175,CA -3351442176,3351474687,US -3351474688,3351475199,CA -3351475200,3351475711,US -3351475712,3351475967,IS -3351475968,3351483391,US -3351483392,3351484415,CA -3351484416,3351486463,US -3351486464,3351488511,CA -3351488512,3351494911,US -3351494912,3351495195,SG -3351495196,3351495196,US -3351495197,3351495679,SG -3351495680,3351495935,US -3351495936,3351495989,SG -3351495990,3351495990,US -3351495991,3351496191,SG -3351496192,3351497727,US -3351497728,3351498751,CA -3351498752,3351501823,US -3351501824,3351502847,JM -3351502848,3351503871,US -3351503872,3351504895,CA -3351504896,3351512575,US -3351512576,3351513087,CA -3351513088,3351524095,US -3351524096,3351524351,GB -3351524352,3351614975,US -3351614976,3351615231,SG -3351615232,3351615487,US -3351615488,3351617535,TW -3351617536,3351619583,DE -3351619584,3351642111,US -3351642112,3351695871,CA -3351695872,3351696383,US -3351696384,3351696639,CA -3351696640,3351697407,US -3351697408,3351698431,CA -3351698432,3351698943,US -3351698944,3351699455,CA -3351699456,3351706367,US -3351706368,3351706623,CA -3351706624,3351855615,US -3351855616,3351855871,GB -3351855872,3351860223,US -3351860224,3351861247,KY -3351861248,3351869439,US -3351869440,3351871487,CA -3351871488,3351895551,US -3351895552,3351895807,CA -3351895808,3351904255,US -3351904256,3351912703,CA -3351912704,3351912959,US -3351912960,3351933951,CA -3351933952,3351939071,US -3351939072,3351959551,CA -3351959552,3351961599,US -3351961600,3351963647,CA -3351963648,3351969279,US -3351969280,3351969535,CA -3351969536,3351969791,US -3351969792,3352035327,IL -3352035328,3352036351,CA -3352036352,3352046591,US -3352046592,3352046783,CA -3352046784,3352046799,US -3352046800,3352049663,CA -3352049664,3352051711,US -3352051712,3352055807,CA -3352055808,3352066047,US -3352066048,3352067071,CA -3352067072,3352068095,US -3352068096,3352069119,CA -3352069120,3352069919,US -3352069920,3352069935,CO -3352069936,3352069943,US -3352069944,3352069951,BD -3352069952,3352088575,US -3352088576,3352090623,CA -3352090624,3352094719,US -3352094720,3352096767,VG -3352096768,3352559871,US -3352559872,3352563199,CA -3352563200,3352563455,US -3352563456,3352573951,CA -3352573952,3352574207,US -3352574464,3352575743,CA -3352575744,3352575999,US -3352576000,3352581631,CA -3352581632,3352582143,US -3352582144,3352583935,CA -3352583936,3352584191,US -3352584192,3352591359,CA -3352591360,3352591615,US -3352591616,3352615423,CA -3352615424,3352616959,US -3352616960,3352887295,CA -3352887296,3352916379,US -3352916380,3352916380,VE -3352916381,3352916479,US -3352916480,3352916506,BR -3352916507,3352916507,US -3352916508,3352916512,BR -3352916513,3352916513,US -3352916514,3352916514,BR -3352916515,3352916515,US -3352916516,3352916527,BR -3352916528,3352916530,US -3352916531,3352916533,BR -3352916534,3352916534,US -3352916535,3352916541,BR -3352916542,3352916542,US -3352916543,3352916557,BR -3352916558,3352916561,US -3352916562,3352916562,GB -3352916563,3352916564,BR -3352916565,3352916566,US -3352916567,3352916584,BR -3352916585,3352916586,US -3352916587,3352916593,BR -3352916594,3352916607,US -3352916608,3352916615,BR -3352916616,3352916619,US -3352916620,3352916635,BR -3352916636,3352916636,US -3352916637,3352916638,BR -3352916639,3352916639,DE -3352916640,3352916640,BR -3352916641,3352916648,US -3352916649,3352916689,BR -3352916690,3352916690,US -3352916691,3352916694,BR -3352916695,3352918015,US -3352918016,3352919039,CA -3352919040,3353335303,US -3353335304,3353335307,NL -3353335308,3353335311,US -3353335312,3353335313,NL -3353335314,3353335315,US -3353335316,3353335323,NL -3353335324,3353335331,US -3353335332,3353335333,NL -3353335334,3353335335,US -3353335336,3353335339,NL -3353335340,3353335341,US -3353335342,3353335347,NL -3353335348,3353335353,US -3353335354,3353335359,NL -3353335360,3353335361,US -3353335362,3353335363,NL -3353335364,3353335374,US -3353335375,3353335376,NL -3353335377,3353335378,US -3353335379,3353335380,NL -3353335381,3353335382,US -3353335383,3353335386,NL -3353335387,3353335388,US -3353335389,3353335390,NL -3353335391,3353335392,US -3353335393,3353335394,NL -3353335395,3353335396,US -3353335397,3353335402,NL -3353335403,3353335407,US -3353335408,3353335411,NL -3353335412,3353335416,US -3353335417,3353335420,NL -3353335421,3353335422,US -3353335423,3353335424,NL -3353335425,3353335426,US -3353335427,3353335435,NL -3353335436,3353335437,US -3353335438,3353335445,NL -3353335446,3353335451,US -3353335452,3353335455,NL -3353335456,3353335458,US -3353335459,3353335460,NL -3353335461,3353335462,US -3353335463,3353335468,NL -3353335469,3353335471,US -3353335472,3353335473,NL -3353335474,3353335474,US -3353335475,3353335476,NL -3353335477,3353335485,US -3353335486,3353335487,NL -3353335488,3353335491,US -3353335492,3353335499,NL -3353335500,3353335505,US -3353335506,3353335507,NL -3353335508,3353335513,US -3353335514,3353335515,NL -3353335516,3353335517,US -3353335518,3353335519,NL -3353335520,3353335521,US -3353335522,3353335529,NL -3353335530,3353335559,US -3353335560,3353335591,NL -3353335592,3353335596,US -3353335597,3353335598,NL -3353335599,3353335600,US -3353335601,3353335606,NL -3353335607,3353335614,US -3353335615,3353335616,NL -3353335617,3353335619,US -3353335620,3353335655,NL -3353335656,3353335662,US -3353335663,3353335664,NL -3353335665,3353335666,US -3353335667,3353335668,NL -3353335669,3353335670,US -3353335671,3353335676,NL -3353335677,3353335681,US -3353335682,3353335683,NL -3353335684,3353335686,US -3353335687,3353335702,NL -3353335703,3353335704,US -3353335705,3353335706,NL -3353335707,3353335708,US -3353335709,3353335710,NL -3353335711,3353335712,US -3353335713,3353335716,NL -3353335717,3353335718,US -3353335719,3353335722,NL -3353335723,3353335728,US -3353335729,3353335739,NL -3353335740,3353335741,US -3353335742,3353335745,NL -3353335746,3353335747,US -3353335748,3353335749,NL -3353335750,3353335750,US -3353335751,3353335758,NL -3353335759,3353335767,US -3353335768,3353335769,NL -3353335770,3353335778,US -3353335779,3353335789,NL -3353335790,3353335792,US -3353335793,3353335794,NL -3353335795,3353653503,US -3353653504,3353653759,GB -3353653760,3353688063,US -3353688064,3353688575,GB -3353688576,3353722367,US -3353722368,3353722623,GB -3353722624,3353726975,US -3353726976,3353727231,IN -3353727232,3353729023,US -3353729024,3353729279,HK -3353729280,3353730047,US -3353730048,3353731071,CA -3353731072,3353731775,US -3353731776,3353731823,IL -3353731824,3353731999,US -3353732000,3353732031,CN -3353732032,3353732159,US -3353732160,3353732191,CA -3353732192,3353732351,US -3353732352,3353732863,DE -3353732864,3353736191,US -3353736192,3353736959,PR -3353736960,3353737215,US -3353737216,3353737471,GB -3353737472,3353739775,US -3353739776,3353740007,HK -3353740008,3353740015,SG -3353740016,3353740031,CN -3353740032,3353740263,HK -3353740264,3353740271,SG -3353740272,3353740287,CN -3353740288,3353752585,US -3353752586,3353752589,BE -3353752590,3353753055,US -3353753056,3353753059,BR -3353753060,3353780223,US -3353780224,3353780479,GB -3353780480,3353821183,US -3353821184,3353821199,CN -3353821200,3353821215,US -3353821216,3353821279,CN -3353821280,3353821284,US -3353821285,3353821295,CN -3353821296,3353821296,US -3353821297,3353821300,CN -3353821301,3353821301,US -3353821302,3353821302,CN -3353821303,3353821303,US -3353821304,3353821306,CN -3353821307,3353821308,US -3353821309,3353821309,CN -3353821310,3353821311,US -3353821312,3353821719,CN -3353821720,3353821727,US -3353821728,3353822375,CN -3353822376,3353822383,US -3353822384,3353822687,CN -3353822688,3353822719,US -3353822720,3353822967,CN -3353822968,3353822975,US -3353822976,3353823231,CN -3353823232,3353836535,US -3353836536,3353836543,RO -3353836544,3353836799,US -3353836800,3353837311,CA -3353837312,3353855999,US -3353856000,3353858047,CA -3353858048,3353861119,US -3353861120,3353862143,CA -3353862144,3353862719,US -3353862720,3353862751,CA -3353862752,3353864959,US -3353864960,3353865215,CA -3353865216,3353884927,US -3353884928,3353885183,GB -3353885184,3353939711,US -3353939712,3353939967,CA -3353939968,3353942527,US -3353942528,3353943039,CA -3353943040,3353960191,US -3353960192,3353960447,CA -3353960448,3353979647,US -3353979648,3353979903,CA -3353979904,3353982719,US -3353982720,3353983231,CA -3353983232,3353989631,US -3353989632,3353989887,CA -3353989888,3354066943,US -3354066944,3354132479,CA -3354132480,3354467748,US -3354467749,3354467749,BL -3354467750,3354467811,US -3354467812,3354467812,BL -3354467813,3354467898,US -3354467899,3354467899,NL -3354467900,3354467966,US -3354467967,3354467967,CA -3354467968,3354467969,US -3354467970,3354467970,CA -3354467971,3354468164,US -3354468165,3354468165,IN -3354468166,3354468299,US -3354468300,3354468300,PK -3354468301,3354468351,US -3354476032,3354484911,US -3354484912,3354484927,GB -3354484928,3354485375,US -3354485376,3354485439,GB -3354485440,3354492927,US -3354492928,3354494975,CA -3354494976,3354499071,US -3354499072,3354501119,AU -3354501120,3354503167,CA -3354503168,3354507263,US -3354507264,3354507267,PK -3354507268,3354507271,US -3354507272,3354507279,ID -3354507280,3354507283,NZ -3354507284,3354507287,US -3354507288,3354507291,CY -3354507292,3354507295,US -3354507296,3354507299,BR -3354507300,3354507303,US -3354507304,3354507315,BR -3354507316,3354507319,US -3354507320,3354507323,PK -3354507324,3354507343,US -3354507344,3354507347,CA -3354507348,3354507351,CN -3354507352,3354507363,US -3354507364,3354507367,CY -3354507368,3354507375,CA -3354507376,3354507383,US -3354507384,3354507387,CN -3354507388,3354507391,US -3354507392,3354507399,CA -3354507400,3354507403,EG -3354507404,3354507407,CN -3354507408,3354507431,US -3354507432,3354507439,BR -3354507440,3354507443,CY -3354507444,3354507451,US -3354507452,3354507455,AU -3354507456,3354507459,US -3354507460,3354507463,BR -3354507464,3354507467,US -3354507468,3354507471,CY -3354507472,3354507475,US -3354507476,3354507479,CY -3354507480,3354507483,MM -3354507484,3354507511,US -3354507512,3354507519,MA -3354507520,3354507535,US -3354507536,3354507539,ID -3354507540,3354507543,HU -3354507544,3354507551,US -3354507552,3354507559,NI -3354507560,3354507567,ID -3354507568,3354507591,US -3354507592,3354507599,CY -3354507600,3354507623,US -3354507624,3354507631,CN -3354507632,3354507639,US -3354507640,3354507643,CN -3354507644,3354507647,MM -3354507648,3354507655,US -3354507656,3354507659,CA -3354507660,3354507667,CY -3354507668,3354507671,BR -3354507672,3354507679,US -3354507680,3354507683,GH -3354507684,3354507687,PT -3354507688,3354507691,CA -3354507692,3354507695,VN -3354507696,3354507703,US -3354507704,3354507711,NZ -3354507712,3354507719,US -3354507720,3354507723,VN -3354507724,3354507727,US -3354507728,3354507735,BR -3354507736,3354507743,IN -3354507744,3354507747,TH -3354507748,3354507751,US -3354507752,3354507759,MX -3354507760,3354507775,US -3354507776,3354507779,CY -3354507780,3354507787,US -3354507788,3354507791,CY -3354507792,3354507803,US -3354507804,3354507807,CY -3354507808,3354507835,US -3354507836,3354507839,CY -3354507840,3354507847,PA -3354507848,3354507855,CY -3354507856,3354507863,US -3354507864,3354507871,GR -3354507872,3354507887,US -3354507888,3354507895,BR -3354507896,3354507903,CY -3354507904,3354507907,US -3354507908,3354507911,IN -3354507912,3354507915,ID -3354507916,3354507919,FR -3354507920,3354507931,US -3354507932,3354507943,CY -3354507944,3354507959,US -3354507960,3354507967,GH -3354507968,3354507983,MX -3354507984,3354507991,AE -3354507992,3354508015,US -3354508016,3354508031,MX -3354508032,3354508043,US -3354508044,3354508047,DK -3354508048,3354508051,US -3354508052,3354508059,VN -3354508060,3354508063,BR -3354508064,3354508071,US -3354508072,3354508075,CY -3354508076,3354508079,RU -3354508080,3354508083,US -3354508084,3354508087,VN -3354508088,3354508095,AU -3354508096,3354508099,CY -3354508100,3354508107,US -3354508108,3354508111,BD -3354508112,3354508115,CY -3354508116,3354508119,US -3354508120,3354508123,BR -3354508124,3354508135,US -3354508136,3354508139,IN -3354508140,3354508143,CY -3354508144,3354508147,MY -3354508148,3354508151,BB -3354508152,3354508159,US -3354508160,3354508163,GH -3354508164,3354508167,CY -3354508168,3354508191,US -3354508192,3354508195,IN -3354508196,3354508199,US -3354508200,3354508203,CA -3354508204,3354508215,US -3354508216,3354508219,MX -3354508220,3354508223,IN -3354508224,3354508235,US -3354508236,3354508239,CA -3354508240,3354508255,US -3354508256,3354508259,EG -3354508260,3354508263,US -3354508264,3354508267,TH -3354508268,3354508271,US -3354508272,3354508275,TW -3354508276,3354508279,US -3354508280,3354508287,AE -3354508288,3354508303,CY -3354508304,3354508311,US -3354508312,3354508319,VN -3354508320,3354508327,US -3354508328,3354508335,AE -3354508336,3354508347,US -3354508348,3354508351,CA -3354508352,3354508375,US -3354508376,3354508383,MA -3354508384,3354508395,US -3354508396,3354508399,VN -3354508400,3354508439,US -3354508440,3354508447,AE -3354508448,3354508487,US -3354508488,3354508491,VN -3354508492,3354508495,CY -3354508496,3354508527,US -3354508528,3354508535,AE -3354508536,3354508543,BD -3354508544,3354508567,US -3354508568,3354508571,GH -3354508572,3354508575,CN -3354508576,3354508579,BR -3354508580,3354508603,US -3354508604,3354508607,CY -3354508608,3354508623,US -3354508624,3354508639,MX -3354508640,3354508679,US -3354508680,3354508683,CY -3354508684,3354508687,PK -3354508688,3354508703,US -3354508704,3354508735,AE -3354508736,3354508743,PK -3354508744,3354508751,IN -3354508752,3354508847,US -3354508848,3354508855,MA -3354508856,3354508863,US -3354508864,3354508895,CY -3354508896,3354508927,US -3354508928,3354508943,GB -3354508944,3354508951,US -3354508952,3354508959,PK -3354508960,3354508991,EG -3354508992,3354508999,RU -3354509000,3354509019,US -3354509020,3354509023,GR -3354509024,3354509027,BR -3354509028,3354509031,US -3354509032,3354509039,CY -3354509040,3354509183,US -3354509184,3354509191,BR -3354509192,3354509247,US -3354509248,3354509255,BR -3354509256,3354509263,US -3354509264,3354509279,BR -3354509280,3354509283,AU -3354509284,3354509287,GH -3354509288,3354509291,CY -3354509292,3354509295,IN -3354509296,3354509299,CA -3354509300,3354509391,US -3354509392,3354509399,CN -3354509400,3354509551,US -3354509552,3354509567,CN -3354509568,3354509631,US -3354509632,3354509647,GB -3354509648,3354509695,US -3354509696,3354509703,GB -3354509704,3354509783,US -3354509784,3354509791,BR -3354509792,3354509807,US -3354509808,3354509823,SG -3354509824,3354509895,US -3354509896,3354509903,BR -3354509904,3354510063,US -3354510064,3354510079,BR -3354510080,3354513151,US -3354513152,3354513407,CA -3354513408,3354515711,US -3354515712,3354515775,CA -3354515776,3354515967,US -3354515968,3354516031,CA -3354516032,3354516223,US -3354516224,3354516287,CA -3354516288,3354534147,US -3354534148,3354534159,IE -3354534160,3354591231,US -3354591232,3354656767,CA -3354656768,3354676223,US -3354676224,3354677247,CA -3354677248,3354686975,US -3354686976,3354687231,CN -3354687232,3354687487,US -3354687488,3354688511,CA -3354688512,3354707455,US -3354707456,3354707967,CA -3354707968,3354708207,US -3354708208,3354708223,CA -3354708224,3354770687,US -3354770688,3354770943,CA -3354770944,3354788095,US -3354788096,3354789887,CA -3354789888,3354790399,US -3354790400,3354806383,CA -3354806384,3354806399,US -3354806400,3354806639,CA -3354806640,3354806655,SE -3354806656,3354807551,CA -3354807552,3354810367,US -3354810368,3354814975,CA -3354814976,3354815231,US -3354815232,3354823423,CA -3354823424,3354823679,US -3354823680,3354853119,CA -3354853120,3354853375,US -3354853376,3354869759,CA -3354869760,3354873855,US -3354873856,3354875391,CA -3354875392,3354875903,US -3354875904,3354918911,CA -3354918912,3354955775,US -3354955776,3354956031,AR -3354956032,3354972159,US -3354972160,3354972415,CA -3354972416,3355012607,US -3355012608,3355017215,CA -3355017216,3355052287,US -3355052288,3355052543,HK -3355052544,3355053055,CA -3355053056,3355249151,US -3355249152,3355249663,CA -3355249664,3355260927,US -3355260928,3355262719,CA -3355262720,3355310591,US -3355310592,3355311103,CA -3355311104,3355319295,US -3355319296,3355320319,CA -3355320320,3355324415,US -3355324416,3355328511,CA -3355328512,3355338751,US -3355338752,3355340799,BB -3355340800,3355351039,US -3355351040,3355351295,CA -3355351296,3355372287,US -3355372288,3355372543,CA -3355372544,3355384095,US -3355384096,3355384127,AR -3355384128,3355384831,US -3355384832,3355385855,CA -3355385856,3355389439,US -3355389440,3355389695,GB -3355389696,3355389951,JP -3355389952,3355407359,US -3355407360,3355408383,PR -3355408384,3355412771,US -3355412772,3355412775,CY -3355412776,3355412791,US -3355412792,3355412795,CY -3355412796,3355412799,US -3355412800,3355412803,CY -3355412804,3355412807,CN -3355412808,3355412815,US -3355412816,3355412823,EG -3355412824,3355412991,US -3355412992,3355413023,IN -3355413024,3355413055,US -3355413056,3355413087,IN -3355413088,3355417799,US -3355417800,3355417803,CN -3355417804,3355417999,US -3355418000,3355418015,BE -3355418016,3355418023,AE -3355418024,3355418063,US -3355418064,3355418071,CA -3355418072,3355418079,IL -3355418080,3355418111,CN -3355418112,3355418367,US -3355418368,3355418371,BR -3355418372,3355418375,US -3355418376,3355418383,GH -3355418384,3355418395,US -3355418396,3355418399,GT -3355418400,3355418431,BE -3355418432,3355418455,GB -3355418456,3355418463,AE -3355418464,3355418527,US -3355418528,3355418535,BR -3355418536,3355418551,US -3355418552,3355418555,CY -3355418556,3355418567,US -3355418568,3355418575,MX -3355418576,3355418591,GB -3355418592,3355418607,US -3355418608,3355418615,MX -3355418616,3355418619,US -3355418620,3355418623,CY -3355418624,3355432959,US -3355432960,3355435007,CA -3355435008,3355443199,US -3355443200,3355445247,EC -3355445248,3355447295,BR -3355447296,3355447551,CU -3355447552,3355447807,AR -3355447808,3355448063,HT -3355448064,3355448319,AR -3355448320,3355448831,CW -3355448832,3355449343,SX -3355449344,3355450367,CU -3355450368,3355451391,EC -3355451392,3355458559,BR -3355458560,3355458591,HN -3355458592,3355458599,US -3355458600,3355459071,HN -3355459072,3355459327,BR -3355459328,3355459583,EC -3355459840,3355460095,VE -3355460096,3355460351,CL -3355460608,3355461119,UY -3355461120,3355461887,BR -3355461888,3355463423,EC -3355463424,3355463935,AR -3355463936,3355464191,BR -3355464192,3355464447,CL -3355464448,3355464959,MX -3355464960,3355465215,BR -3355465216,3355465983,UY -3355465984,3355466239,BR -3355466240,3355467263,MX -3355467264,3355467519,US -3355467520,3355467775,MX -3355467776,3355468799,AR -3355468800,3355469567,BR -3355469568,3355470591,MX -3355470592,3355470847,PE -3355470848,3355471103,CL -3355471104,3355471359,MX -3355471360,3355471615,PE -3355471616,3355472383,MX -3355472384,3355472639,BR -3355472640,3355473407,CL -3355473408,3355473919,PE -3355473920,3355475199,CL -3355475200,3355477503,MX -3355477504,3355478015,BR -3355478016,3355478271,PE -3355478272,3355478783,US -3355478784,3355479039,VE -3355479040,3355479551,CL -3355479552,3355479807,PE -3355479808,3355480063,MX -3355480064,3355485183,CL -3355485184,3355487743,PE -3355487744,3355487999,CL -3355488000,3355488255,AR -3355488256,3355488767,GT -3355488768,3355489023,PA -3355489024,3355489279,CR -3355489280,3355489535,SV -3355489536,3355491071,AR -3355491072,3355491327,CO -3355491328,3355494655,AR -3355494656,3355494911,CO -3355495424,3355496447,UY -3355496448,3355498495,AR -3355498496,3355500543,US -3355500544,3355508735,AR -3355508736,3355510271,VE -3355510272,3355510527,EC -3355510528,3355510783,AR -3355510784,3355512831,VE -3355512832,3355516927,CL -3355516928,3355525119,AR -3355525120,3355535359,CO -3355535360,3355537407,TT -3355537664,3355537919,AR -3355538176,3355538431,CL -3355538432,3355539199,AR -3355539200,3355539455,VE -3355539456,3355540479,CL -3355540480,3355540735,CO -3355540736,3355540991,BR -3355540992,3355541503,CO -3355541504,3355545599,CL -3355545600,3355547647,VE -3355547648,3355547903,NI -3355547904,3355548159,GT -3355548160,3355548671,DO -3355548672,3355549695,SR -3355549696,3355549951,BM -3355549952,3355550207,EC -3355550208,3355552767,VE -3355552768,3355553023,EC -3355553024,3355553279,CO -3355553280,3355553535,CL -3355553536,3355553791,CO -3355553792,3355555839,PE -3355555840,3355557887,VE -3355557888,3355559935,CO -3355559936,3355561983,PY -3355561984,3355564031,SR -3355564032,3355566079,BR -3355566080,3355574271,AR -3355574272,3355576319,CL -3355576320,3355578367,VE -3355578368,3355582463,CL -3355582464,3355590655,UY -3355590656,3355592703,CO -3355592704,3355599871,CL -3355599872,3355600895,BR -3355600896,3355604991,CL -3355604992,3355607039,AR -3355607040,3355608057,HT -3355608058,3355608058,IL -3355608059,3355615231,HT -3355615232,3355623423,SR -3355623424,3355639807,CL -3355639808,3355642367,VE -3355642880,3355643903,UY -3355643904,3355647999,BR -3355648000,3355668991,AR -3355668992,3355669247,PE -3355669248,3355672575,AR -3355672576,3355677183,CO -3355677184,3355677439,GT -3355677440,3355682815,CO -3355682816,3355684863,AR -3355684864,3355686911,TT -3355686912,3355688959,AR -3355688960,3355689471,CO -3355689472,3355689727,HN -3355689728,3355689983,AR -3355691008,3355693055,PA -3355693056,3355695103,CL -3355695104,3355697151,AR -3355697152,3355701503,HN -3355701504,3355702015,PE -3355702016,3355702271,AR -3355702272,3355703295,CO -3355703296,3355705343,PY -3355705344,3355709439,MX -3355709440,3355713535,CO -3355713536,3355720447,MX -3355720448,3355720703,AR -3355720704,3355722751,MX -3355722752,3355723263,AR -3355723264,3355746303,MX -3355746304,3355754495,HT -3355754496,3355770879,PE -3355770880,3355773183,PR -3355773184,3355773439,BR -3355773440,3355773695,AR -3355773696,3355773951,PR -3355773952,3355774975,CU -3355774976,3355779071,VE -3355779072,3355781119,BR -3355781120,3355783167,VE -3355783168,3355787263,CR -3355787264,3355803647,AR -3355803648,3355820031,VE -3355820032,3355836415,AR -3355836416,3355841023,EC -3355841024,3355841279,CL -3355841280,3355843327,EC -3355843328,3355843583,VE -3355843584,3355844863,EC -3355844864,3355845119,CL -3355845120,3355845375,EC -3355845376,3355848959,BR -3355849728,3355849983,PA -3355849984,3355850495,CL -3355850496,3355850751,NI -3355850752,3355852799,CW -3355852800,3355856639,CL -3355856640,3355856895,PA -3355860992,3355869183,CL -3355869184,3355870719,BR -3355870720,3355871231,CR -3355871232,3355873279,BR -3355873280,3355875327,BQ -3355875328,3355877375,PA -3355877376,3355885567,CO -3355885568,3355901951,GT -3355901952,3355902975,BR -3355902976,3355903999,CL -3355904000,3355905535,BR -3355905536,3355905791,PY -3355905792,3355906047,AR -3355906048,3355910143,CL -3355910144,3355918335,SX -3355918336,3355923455,EC -3355923456,3355924479,UY -3355924480,3355926527,TT -3355926528,3355927039,NL -3355927040,3355928063,US -3355928064,3355928575,CA -3355928576,3355929087,GB -3355929088,3355929599,US -3355929600,3355930367,PA -3355930368,3355930623,HK -3355930624,3355934719,BR -3355934720,3355939839,AR -3355939840,3355940863,SR -3355940864,3355942911,AR -3355942912,3355947007,BO -3355947008,3355949055,AR -3355949056,3355951103,CW -3355951104,3355967487,EC -3355967488,3356033023,VE -3356033024,3356033791,BR -3356033792,3356034047,CL -3356034048,3356035071,PY -3356035072,3356037119,MX -3356037120,3356041215,BR -3356041216,3356049407,CR -3356049408,3356049663,CL -3356049664,3356051455,BR -3356051456,3356051711,CO -3356051712,3356051967,CL -3356051968,3356052223,GT -3356052224,3356052479,AR -3356052480,3356053247,BR -3356053248,3356054015,CL -3356054016,3356054527,US -3356054528,3356057087,BR -3356057088,3356057343,CO -3356057344,3356057599,BR -3356057600,3356057855,EC -3356057856,3356059135,CL -3356059136,3356060671,BR -3356060672,3356061695,CL -3356061696,3356062207,BR -3356062208,3356062463,CL -3356062464,3356062719,JM -3356062720,3356063743,CR -3356063744,3356064255,HN -3356064256,3356064511,CL -3356064512,3356065791,BR -3356065792,3356066047,CL -3356066048,3356069119,BR -3356069120,3356069631,CL -3356069632,3356070143,BR -3356070144,3356070655,CL -3356070656,3356070911,AR -3356070912,3356071423,BR -3356071424,3356072447,CL -3356073216,3356073471,AR -3356073472,3356073983,CO -3356073984,3356075263,BR -3356075264,3356076287,BO -3356076288,3356076543,AR -3356076544,3356077567,MX -3356077568,3356078079,BR -3356078080,3356078335,EC -3356078336,3356079359,CL -3356079360,3356079615,AR -3356079616,3356080639,MX -3356080640,3356080895,BR -3356080896,3356082431,NI -3356082432,3356082687,CL -3356082688,3356082943,AR -3356082944,3356083967,CL -3356083968,3356084479,BR -3356084480,3356084735,CL -3356084736,3356085247,BR -3356085248,3356085759,CL -3356085760,3356086271,BR -3356086272,3356086527,AR -3356086528,3356087295,CR -3356087296,3356087807,AR -3356087808,3356088063,BR -3356088064,3356088319,CL -3356088320,3356089087,TT -3356089088,3356089343,AR -3356089344,3356090623,BR -3356090624,3356090879,CL -3356090880,3356091391,AR -3356091392,3356091647,CL -3356091648,3356091903,AR -3356091904,3356093183,CL -3356093184,3356093951,AR -3356093952,3356094975,CL -3356094976,3356096255,AR -3356096256,3356096511,CL -3356096512,3356096767,EC -3356096768,3356097023,BR -3356097024,3356097535,CL -3356097536,3356097791,BR -3356097792,3356098303,AR -3356098304,3356098559,GT -3356098560,3356099583,CL -3356099584,3356100607,BR -3356100608,3356102399,CL -3356102400,3356102655,PA -3356102656,3356105727,CL -3356105728,3356106751,SV -3356106752,3356106975,US -3356106976,3356107007,FR -3356107008,3356107263,US -3356107264,3356107327,BR -3356107328,3356107519,US -3356107520,3356107551,BR -3356107552,3356107775,US -3356107776,3356107975,HN -3356107976,3356107983,IS -3356107984,3356108063,HN -3356108064,3356108071,IT -3356108072,3356108511,HN -3356108512,3356108519,US -3356108520,3356109119,HN -3356109120,3356109135,FR -3356109136,3356110015,HN -3356110016,3356110031,US -3356110032,3356110335,HN -3356110336,3356110847,US -3356110848,3356113919,BR -3356113920,3356114943,UY -3356114944,3356123135,PE -3356123136,3356131839,AR -3356131840,3356132351,PE -3356132352,3356133375,BR -3356133376,3356133887,CO -3356133888,3356134143,BR -3356134144,3356134655,AR -3356134656,3356134911,PY -3356134912,3356135167,DO -3356135168,3356135423,MX -3356135424,3356135679,PA -3356135680,3356135935,CR -3356135936,3356136191,BR -3356136192,3356137471,EC -3356137472,3356137727,JM -3356137728,3356137983,HN -3356137984,3356138239,CO -3356138240,3356138495,US -3356138496,3356139007,BO -3356139008,3356139263,CL -3356139264,3356139519,BR -3356139520,3356139775,US -3356139776,3356140031,AR -3356140032,3356140287,DO -3356140288,3356140543,BR -3356140544,3356140799,CO -3356140800,3356141311,BM -3356141312,3356142847,CL -3356142848,3356143103,GT -3356143104,3356143615,CO -3356143616,3356144127,CR -3356144128,3356144639,BR -3356144640,3356145151,AR -3356145152,3356145407,CL -3356145408,3356145663,BR -3356145664,3356145919,CL -3356145920,3356146175,BR -3356146176,3356146431,AR -3356146432,3356146687,BR -3356146688,3356146943,PE -3356146944,3356147199,BR -3356147200,3356147455,CL -3356147456,3356147711,AR -3356147712,3356148223,BR -3356148224,3356148479,BZ -3356148480,3356148735,CL -3356148736,3356148991,AR -3356148992,3356149503,MX -3356149504,3356149759,AR -3356149760,3356150015,MX -3356150016,3356150527,AR -3356150528,3356150783,PA -3356150784,3356151039,AR -3356151040,3356151295,NI -3356151296,3356151551,BR -3356151552,3356151807,AR -3356151808,3356152063,CL -3356152064,3356152319,EC -3356152320,3356152575,MX -3356152576,3356152831,CL -3356152832,3356154623,MX -3356154624,3356154879,AR -3356154880,3356156671,CL -3356156672,3356156927,BR -3356156928,3356157951,PY -3356157952,3356158207,CL -3356158208,3356158463,MX -3356158464,3356158719,CL -3356158976,3356159743,CL -3356159744,3356159999,BR -3356160000,3356160255,MX -3356160256,3356160511,GT -3356160512,3356160767,CL -3356160768,3356161279,MX -3356161280,3356161535,BR -3356161536,3356162559,MX -3356162560,3356162815,PE -3356162816,3356163583,CL -3356163584,3356163839,VE -3356163840,3356164095,CL -3356164096,3356171519,BR -3356171520,3356171775,AR -3356171776,3356172031,NI -3356172032,3356172287,SV -3356172288,3356174335,PE -3356174336,3356176383,CO -3356176384,3356180479,PE -3356180480,3356190719,CL -3356192768,3356194815,AR -3356196864,3356229631,VE -3356229632,3356233727,BR -3356233728,3356237823,CL -3356237824,3356246015,GT -3356246016,3356262655,MX -3356262656,3356263167,CL -3356263168,3356263423,BR -3356263424,3356263679,CL -3356263680,3356265215,AR -3356265216,3356265471,BR -3356265472,3356267007,CL -3356267008,3356267263,PY -3356267264,3356268799,CL -3356269056,3356269311,AR -3356269312,3356269823,UY -3356269824,3356270079,BR -3356270080,3356272383,MX -3356272384,3356272639,CR -3356272640,3356272895,US -3356272896,3356273151,EC -3356273152,3356273407,CO -3356273408,3356273663,CL -3356273664,3356274431,SV -3356274432,3356278783,CO -3356278784,3356279039,AR -3356279040,3356279295,VE -3356279296,3356279807,CL -3356279808,3356280831,EC -3356280832,3356282879,AR -3356282880,3356284927,PA -3356284928,3356286975,AR -3356286976,3356287487,US -3356287488,3356287743,SV -3356287744,3356288255,HN -3356288256,3356288767,SV -3356288768,3356289023,GT -3356289024,3356289791,SV -3356289792,3356289799,US -3356289800,3356289807,GT -3356289808,3356289823,SV -3356289824,3356289887,US -3356289888,3356289919,SV -3356289920,3356289951,US -3356289952,3356289983,GT -3356289984,3356290303,US -3356290304,3356290559,SV -3356290560,3356291071,CR -3356291072,3356293119,TT -3356293120,3356295167,BO -3356295168,3356297215,CL -3356297216,3356299263,BR -3356299264,3356305663,MX -3356305664,3356307455,AR -3356307456,3356316415,MX -3356316416,3356316671,AR -3356317696,3356328959,MX -3356328960,3356329983,HN -3356329984,3356332031,GF -3356332032,3356334079,CU -3356334080,3356336127,BO -3356336128,3356336895,SV -3356336896,3356337919,HN -3356337920,3356340479,SV -3356340480,3356340735,HN -3356340736,3356340991,SV -3356340992,3356341247,HN -3356341248,3356341503,SV -3356341504,3356342015,HN -3356342016,3356343039,SV -3356343040,3356343295,HN -3356343296,3356344319,SV -3356344320,3356360703,CO -3356360704,3356362751,CL -3356362752,3356364799,VE -3356364800,3356368895,MX -3356368896,3356369407,BR -3356369408,3356369663,EC -3356369664,3356369919,BR -3356369920,3356370175,DO -3356370176,3356370943,AR -3356370944,3356372991,CO -3356372992,3356375039,CU -3356377088,3356379647,CL -3356379648,3356380159,AR -3356380160,3356380927,CL -3356380928,3356381183,DO -3356381184,3356381439,CL -3356381696,3356381951,CL -3356381952,3356382207,EC -3356382208,3356389375,CL -3356389376,3356389887,CO -3356389888,3356390399,CL -3356390400,3356390655,AR -3356390656,3356391167,CL -3356391168,3356391423,PA -3356393472,3356413567,CL -3356413568,3356413951,CO -3356413952,3356419839,CL -3356419840,3356419967,CO -3356419968,3356420287,CL -3356420288,3356420351,CO -3356420352,3356420735,CL -3356420736,3356420991,CO -3356420992,3356421119,CL -3356421120,3356422143,CO -3356422144,3356426239,CL -3356426240,3356427263,BR -3356427264,3356491775,US -3356491776,3356493823,PE -3356493824,3356495871,ZA -3356495872,3356499967,AR -3356499968,3356508159,MX -3356508160,3356508671,AR -3356508672,3356509183,CR -3356509184,3356509439,CO -3356509440,3356509503,US -3356509504,3356510207,CO -3356510208,3356511999,AR -3356512000,3356512255,CO -3356512256,3356514303,AR -3356514304,3356514559,US -3356514560,3356514815,AR -3356514816,3356515327,DO -3356515328,3356515839,CW -3356515840,3356516095,EC -3356516096,3356516351,VE -3356516352,3356520447,AR -3356520448,3356521471,CL -3356521472,3356521727,AR -3356521728,3356522495,CO -3356522496,3356557311,AR -3356557312,3356819455,BR -3356819456,3356884991,CO -3356884992,3356950527,CL -3356950528,3356958463,MX -3356958464,3356958719,BR -3356958720,3356967167,MX -3356967168,3356967423,DO -3356967424,3356967935,MX -3356967936,3356968959,BR -3356968960,3356972031,MX -3356972032,3356972287,AR -3356972288,3356979967,MX -3356979968,3356980223,CO -3356980224,3356980479,BR -3356980480,3356980735,MX -3356980736,3356981247,BR -3356981248,3356988415,MX -3356988416,3356988671,BR -3356988672,3356989439,MX -3356989440,3356989951,BR -3356989952,3356996607,MX -3356996608,3356997631,BR -3356997632,3356998911,MX -3356998912,3356999167,BR -3356999168,3357003007,MX -3357003008,3357003263,BR -3357003264,3357003519,CL -3357003520,3357003775,AR -3357003776,3357007871,MX -3357007872,3357011967,BR -3357011968,3357015551,MX -3357015552,3357016063,BR -3357016064,3357018623,CO -3357018624,3357019135,BR -3357019136,3357020159,CL -3357020160,3357032447,CO -3357032448,3357040639,BR -3357040640,3357048831,CO -3357048832,3357057023,EC -3357057024,3357065215,PE -3357065216,3357073407,EC -3357073408,3357077503,CL -3357077504,3357081599,AR -3357081600,3357114367,CO -3357114368,3357138943,EC -3357138944,3357147135,CO -3357147136,3357179903,AR -3357179904,3357188095,CO -3357188096,3357190143,VE -3357190144,3357192191,DO -3357192192,3357194239,PY -3357194240,3357196287,AR -3357196288,3357204479,CW -3357212672,3357368319,CL -3357368320,3357376511,CO -3357376512,3357403135,CL -3357403136,3357405183,CO -3357405184,3357407231,EC -3357407232,3357409279,AR -3357409280,3357411327,BR -3357411328,3357412351,VE -3357412352,3357412863,PE -3357412864,3357413119,CA -3357413120,3357413375,FR -3357413376,3357414399,US -3357414400,3357415423,PR -3357415424,3357415679,US -3357415680,3357416447,MX -3357416448,3357417215,VE -3357417216,3357417471,US -3357417472,3357418495,CL -3357418496,3357418751,NI -3357418752,3357419007,PR -3357419008,3357419519,GT -3357419520,3357420031,SZ -3357420032,3357421055,CO -3357421056,3357421311,CL -3357421312,3357421567,CO -3357421568,3357422847,NI -3357422848,3357423103,PR -3357423104,3357423359,CO -3357423360,3357424639,VE -3357424640,3357425663,CL -3357425664,3357442047,CO -3357442048,3357442303,NI -3357442304,3357442335,GT -3357442336,3357442343,HN -3357442344,3357442431,GT -3357442432,3357442439,HN -3357442440,3357442655,GT -3357442656,3357442671,NI -3357442672,3357442815,GT -3357442816,3357443071,SV -3357443072,3357443599,GT -3357443600,3357443615,HN -3357443616,3357443735,GT -3357443736,3357443743,HN -3357443744,3357444207,GT -3357444208,3357444215,HN -3357444216,3357444351,GT -3357444352,3357444607,HN -3357444608,3357448311,GT -3357448312,3357448319,SV -3357448320,3357448967,GT -3357448968,3357448975,HN -3357448976,3357449151,GT -3357449152,3357449727,HN -3357449728,3357451167,GT -3357451168,3357451175,HN -3357451176,3357451263,GT -3357451264,3357451519,HN -3357451520,3357451775,NI -3357451776,3357452287,GT -3357452288,3357452543,HN -3357452544,3357452799,GT -3357452800,3357453055,NI -3357453056,3357453311,SV -3357453312,3357453567,HN -3357453568,3357455871,GT -3357455872,3357456127,NI -3357456128,3357456639,GT -3357456640,3357456895,HN -3357456896,3357457919,GT -3357457920,3357458431,HN -3357458432,3357474815,CL -3357474816,3357475071,US -3357475072,3357475887,AR -3357475888,3357475903,VE -3357475904,3357476255,AR -3357476256,3357476271,VE -3357476272,3357476351,AR -3357476352,3357476607,EC -3357476608,3357476863,AR -3357476864,3357477375,EC -3357477376,3357477887,AR -3357477888,3357478911,CO -3357478912,3357479087,AR -3357479088,3357479095,CO -3357479096,3357480031,AR -3357480032,3357480039,CO -3357480040,3357480103,AR -3357480104,3357480111,CO -3357480112,3357480159,AR -3357480160,3357480175,CO -3357480176,3357480407,AR -3357480408,3357480415,CO -3357480416,3357480423,AR -3357480424,3357480427,CO -3357480428,3357480463,AR -3357480464,3357480479,CO -3357480480,3357480559,AR -3357480560,3357480575,CO -3357480576,3357480751,AR -3357480752,3357480767,CO -3357480768,3357480959,AR -3357480960,3357483007,EC -3357483008,3357491199,CL -3357491200,3357499391,CO -3357499392,3357507583,PE -3357507584,3357515775,VE -3357515776,3357523967,SV -3357523968,3357532159,CO -3357532160,3357556735,AR -3357556736,3357556991,VE -3357556992,3357557759,MX -3357557760,3357559295,EC -3357559296,3357559551,CA -3357559552,3357560175,AR -3357560176,3357560183,VE -3357560184,3357560319,AR -3357560320,3357560575,MX -3357560576,3357560831,AR -3357560832,3357561855,CO -3357561856,3357581311,AR -3357581312,3357589503,CL -3357589504,3357605887,BZ -3357605888,3357606911,MX -3357606912,3357607167,AR -3357607168,3357613055,MX -3357613056,3357613311,AR -3357613312,3357618943,MX -3357618944,3357619199,SV -3357619200,3357623039,MX -3357623040,3357623295,AR -3357623296,3357626623,MX -3357626624,3357626879,BR -3357626880,3357627135,AR -3357627136,3357627391,BR -3357627392,3357627647,MX -3357627648,3357627903,CR -3357627904,3357628415,MX -3357628416,3357630719,BR -3357630720,3357633535,MX -3357633536,3357633791,BR -3357633792,3357634815,MX -3357634816,3357635071,BO -3357635072,3357635327,MX -3357635328,3357635583,BR -3357635584,3357635839,MX -3357635840,3357636095,BR -3357636096,3357637887,MX -3357637888,3357638143,PA -3357638144,3357640703,BR -3357640704,3357644799,MX -3357644800,3357646847,BR -3357646848,3357647871,MX -3357647872,3357648895,BR -3357648896,3357650431,MX -3357650432,3357650943,BR -3357650944,3357657855,MX -3357657856,3357658111,AR -3357658112,3357670655,MX -3357670656,3357670911,BR -3357670912,3357671423,MX -3357671424,3357671679,CO -3357671680,3357712383,MX -3357712384,3357713407,BR -3357713408,3357715199,MX -3357715200,3357715455,CO -3357715456,3357726463,MX -3357726464,3357726719,AR -3357726720,3357727743,BR -3357727744,3357728767,MX -3357728768,3357736959,BR -3357736960,3357745151,VE -3357745152,3357753343,CO -3357753344,3357757487,VE -3357757488,3357757495,BO -3357757496,3357773823,VE -3357773824,3357775871,PA -3357775872,3357776127,US -3357776128,3357776383,UY -3357776384,3357776895,US -3357776896,3357777919,CL -3357777920,3357780559,GT -3357780560,3357780575,SV -3357780576,3357784503,GT -3357784504,3357784511,SV -3357784512,3357785535,GT -3357785536,3357785567,SV -3357785568,3357786111,GT -3357786112,3357802495,VE -3357802496,3357868031,MX -3357868032,3357933567,PE -3357933568,3358015487,MX -3358015488,3358023679,BR -3358023680,3358064639,MX -3358064640,3358130175,UY -3358130176,3358131199,EC -3358131200,3358132223,CO -3358132224,3358133631,AR -3358133632,3358133759,VE -3358133760,3358142719,AR -3358142720,3358142975,US -3358142976,3358143231,CO -3358143232,3358143487,VE -3358143488,3358143999,US -3358144000,3358144127,CL -3358144128,3358144255,AR -3358144256,3358144511,CL -3358144512,3358144639,AR -3358144640,3358144767,VE -3358144768,3358144839,AR -3358144840,3358144847,VE -3358144848,3358149735,AR -3358149736,3358149743,CO -3358149744,3358150367,AR -3358150368,3358150399,CO -3358150400,3358151039,AR -3358151040,3358151167,EC -3358151168,3358151423,AR -3358151424,3358151679,EC -3358151680,3358151807,PE -3358151808,3358152063,AR -3358152064,3358152191,PE -3358152192,3358153679,AR -3358153680,3358153695,PR -3358153696,3358153855,AR -3358153856,3358153983,EC -3358153984,3358154239,AR -3358154240,3358154751,CL -3358154752,3358158847,PE -3358158848,3358159423,AR -3358159424,3358159455,EC -3358159456,3358159871,AR -3358159872,3358160895,VE -3358160896,3358236671,AR -3358236672,3358244863,CL -3358244864,3358261247,DO -3358261248,3358264063,AR -3358264064,3358264319,PY -3358264320,3358326783,AR -3358326784,3358392319,VE -3358392320,3358457855,AR -3358457856,3358482175,PA -3358482176,3358482431,BZ -3358482432,3358523391,PA -3358523392,3358526719,AR -3358526720,3358527487,VE -3358527488,3358530047,AR -3358530048,3358530303,VE -3358530304,3358530815,AR -3358530816,3358531583,VE -3358531584,3358532095,AR -3358532096,3358532351,VE -3358532352,3358533119,AR -3358533120,3358533631,VE -3358533632,3358533887,AR -3358533888,3358534143,VE -3358534144,3358543615,AR -3358543616,3358543871,VE -3358543872,3358544127,MX -3358544128,3358547967,AR -3358547968,3358548623,VE -3358548624,3358548639,AR -3358548640,3358548991,VE -3358548992,3358549503,AR -3358549504,3358550015,VE -3358550016,3358563327,AR -3358563328,3358564095,CO -3358564096,3358567423,AR -3358567424,3358568447,CO -3358568448,3358578687,AR -3358578688,3358579711,CO -3358579712,3358587903,AR -3358587904,3358588927,CL -3358588928,3358654463,PE -3358654464,3358658559,AR -3358658560,3358660607,CL -3358660608,3358662655,AR -3358662656,3358670847,BR -3358670848,3358695423,AR -3358695424,3358703615,GT -3358703616,3358715903,AR -3358715904,3358717951,EC -3358717952,3358719999,US -3358720000,3358728191,PR -3358728192,3358736383,CL -3358736384,3358738175,BB -3358738176,3358738687,GD -3358738688,3358739711,BB -3358739712,3358739967,KN -3358739968,3358743039,BB -3358743040,3358743295,TC -3358743296,3358744575,BB -3358744576,3358752767,CL -3358752768,3358756863,BB -3358756864,3358760959,CL -3358760960,3358769151,AR -3358777344,3358779391,CR -3358779392,3358781439,EC -3358781440,3358851071,AR -3358851072,3358855167,MX -3358855168,3358859263,BR -3358859264,3358887935,MX -3358887936,3358892031,HN -3358892032,3358916607,MX -3358916608,3358924799,BR -3358924800,3358965759,MX -3358965760,3358973951,BR -3358973952,3358982143,MX -3358982144,3359047679,CL -3359047680,3359080447,AR -3359080448,3359096831,CU -3359096832,3359105023,CL -3359105024,3359109119,EC -3359109120,3359111167,AR -3359111168,3359113215,EC -3359113216,3359244287,MX -3359244288,3359260671,US -3359260672,3359268863,BO -3359268864,3359277055,AR -3359277056,3359285247,UY -3359285248,3359293439,BO -3359293440,3359305727,CO -3359305728,3359307775,DO -3359309824,3359313919,AR -3359313920,3359315967,CR -3359315968,3359318015,HN -3359318016,3359356927,AR -3359356928,3359358975,VE -3359358976,3359375359,AR -3359375360,3359440895,PE -3359440896,3359463679,AR -3359463680,3359463743,HN -3359463744,3359477759,AR -3359477760,3359478015,UY -3359478016,3359498239,AR -3359498240,3359502335,PY -3359502336,3359505407,AR -3359505408,3359505663,VE -3359505664,3359505919,CW -3359505920,3359506431,AR -3359506432,3359508479,US -3359508480,3359514623,VE -3359514624,3359516671,US -3359516672,3359516927,VG -3359516928,3359517183,US -3359517184,3359517439,VG -3359517440,3359517695,US -3359517696,3359517951,VG -3359517952,3359520255,US -3359520256,3359520767,AR -3359520768,3359521791,VE -3359521792,3359522815,CO -3359522816,3359539199,NI -3359539200,3359571967,PE -3359571968,3359582207,AR -3359582208,3359584255,PA -3359584256,3359586303,AR -3359586304,3359588351,CL -3359588352,3359596543,AR -3359596544,3359598591,CL -3359598592,3359599615,EC -3359599616,3359621119,AR -3359621120,3359637503,EC -3359637504,3359797247,MX -3359797248,3359801343,BR -3359801344,3359899647,MX -3359899648,3359916031,CL -3359916032,3359932415,AR -3359932416,3359948799,MX -3359948800,3359989759,AR -3359989760,3359997951,CO -3359997952,3360006143,AR -3360006144,3360014335,EC -3360014336,3360096255,AR -3360096256,3360104447,UY -3360104448,3360112639,CO -3360112640,3360113663,BR -3360113664,3360114687,CO -3360114688,3360115711,BR -3360115712,3360116735,CO -3360116736,3360118783,BO -3360118784,3360120831,AR -3360124928,3360125951,VE -3360125952,3360127999,BR -3360128000,3360128295,HN -3360128296,3360128303,IT -3360128304,3360128319,HN -3360128320,3360128327,IT -3360128328,3360128543,HN -3360128544,3360128575,US -3360128576,3360128775,HN -3360128776,3360128783,BE -3360128784,3360129023,HN -3360129024,3360145407,VE -3360145408,3360153599,CL -3360153600,3360157695,AR -3360157696,3360159743,VE -3360159744,3360161791,BQ -3360161792,3360251903,CL -3360251904,3360253951,BO -3360253952,3360255999,SV -3360256000,3360260095,CL -3360260096,3360276479,AR -3360276480,3360278527,VE -3360278528,3360280575,EC -3360280576,3360282623,CL -3360284672,3360325631,CL -3360325632,3360333823,CO -3360333824,3360342015,CL -3360342016,3360354303,VE -3360354304,3360356351,PA -3360356352,3360358399,CR -3360358400,3360366591,CL -3360366592,3360382975,CO -3360382976,3360399359,VE -3360399360,3360403455,BO -3360403456,3360405503,BR -3360405504,3360407551,HN -3360407552,3360423935,PA -3360423936,3360534527,MX -3360534528,3360536575,BR -3360536576,3360537599,CL -3360537600,3360538623,EC -3360538624,3360667647,MX -3360667648,3360669695,BR -3360669696,3360686079,MX -3360686080,3360698367,AR -3360698368,3360699135,UY -3360699136,3360707839,AR -3360707840,3360708095,US -3360708096,3360708735,AR -3360708736,3360708863,US -3360708864,3360710527,AR -3360710528,3360710655,US -3360710656,3360718847,HT -3360718848,3360763903,AR -3360765952,3360767999,CO -3360768000,3360772351,AR -3360772352,3360772479,BO -3360772480,3360780991,AR -3360780992,3360780995,BR -3360780996,3360781055,AR -3360781056,3360781071,BR -3360781072,3360781599,AR -3360781600,3360781615,BS -3360781616,3360781791,AR -3360781792,3360781795,MX -3360781796,3360788479,AR -3360788480,3360790527,CL -3360790528,3360849919,AR -3360849920,3360882687,VE -3360882688,3360948223,CL -3360948224,3361013759,VE -3361013760,3361021695,SV -3361021696,3361021951,HN -3361021952,3361030143,PY -3361030144,3361034239,VE -3361034240,3361036287,EC -3361036288,3361046527,AR -3361046528,3361052671,BO -3361052672,3361054463,AR -3361054464,3361054719,PE -3361054720,3361058815,NI -3361058816,3361062911,AR -3361062912,3361071103,CL -3361071104,3361079295,CO -3361079296,3361144831,CL -3361144832,3361210367,BO -3361210368,3361275903,DO -3361275904,3361284095,PE -3361284096,3361296383,CL -3361296384,3361298431,SV -3361298432,3361300479,DO -3361300480,3361308671,CO -3361308672,3361325055,AR -3361325056,3361341439,CO -3361341440,3361374207,VE -3361374208,3361378303,PA -3361378304,3361380351,BO -3361380352,3361382399,EC -3361382400,3361415167,CL -3361415168,3361417215,AR -3361417216,3361419263,CL -3361419264,3361423359,AR -3361423360,3361456127,CR -3361456128,3361472511,CO -3361472512,3361538047,MX -3361538048,3361570815,VE -3361570816,3361587199,CO -3361587200,3361599487,EC -3361599488,3361601535,UY -3361601536,3361603583,EC -3361603584,3361665023,MX -3361665024,3361667071,BR -3361667072,3361668095,GT -3361668096,3361669119,BR -3361669120,3361713151,MX -3361713152,3361716223,BR -3361716224,3361717247,CL -3361717248,3361726463,BR -3361726464,3361734655,MX -3361734656,3362258943,BR -3362258944,3362324479,CL -3362324480,3362337791,AR -3362337792,3362338047,US -3362338048,3362349055,AR -3362349056,3362351103,CR -3362351104,3362353151,AR -3362353152,3362355199,EC -3362355200,3362357247,AR -3362357248,3362381823,BO -3362381824,3362390015,EC -3362390016,3362422783,PE -3362426880,3362427903,PA -3362427904,3362428927,BR -3362428928,3362430975,CL -3362430976,3362447359,CO -3362447360,3362447871,SV -3362447872,3362449407,HN -3362449408,3362450175,SV -3362450176,3362451199,HN -3362451200,3362451455,SV -3362451456,3362452479,AR -3362452480,3362452991,BO -3362452992,3362453247,HN -3362453248,3362453503,NI -3362453504,3362455551,AR -3362455552,3362471935,EC -3362471936,3362476031,CL -3362476032,3362476287,HN -3362476288,3362476543,AR -3362476544,3362477055,CR -3362477056,3362478079,BQ -3362478080,3362484223,AR -3362486272,3362488319,HN -3362488320,3362504703,PE -3362504704,3362506751,VE -3362506752,3362508799,AR -3362508800,3362510847,HN -3362512896,3362514943,AR -3362514944,3362516991,HN -3362516992,3362519039,BO -3362519040,3362521087,EC -3362521088,3362529279,TT -3362529280,3362537471,PA -3362537472,3362545663,AR -3362545664,3362549759,PE -3362549760,3362552431,AR -3362552432,3362552447,MX -3362552448,3362552575,AR -3362552576,3362552591,MX -3362552592,3362552991,AR -3362552992,3362553007,MX -3362553008,3362553167,AR -3362553168,3362553183,DO -3362553184,3362553791,AR -3362553792,3362553807,VI -3362553808,3362553855,AR -3362553856,3362557951,PY -3362557952,3362562047,AR -3362570240,3362586623,UY -3362586624,3362652159,VE -3362652160,3362664447,PE -3362664448,3362668543,BO -3362668544,3362684927,EC -3362684928,3362691071,AR -3362691072,3362692095,PA -3362692096,3362692607,AR -3362692608,3362692863,BR -3362692864,3362695167,AR -3362695168,3362697215,CO -3362697216,3362703359,AR -3362703360,3362705407,CO -3362705408,3362707455,AR -3362707456,3362708203,CO -3362708204,3362708204,AR -3362708205,3362708383,CO -3362708384,3362708384,AR -3362708385,3362708413,CO -3362708414,3362708414,AR -3362708415,3362709503,CO -3362709504,3362711551,AR -3362711552,3362713599,EC -3362713600,3362714623,VE -3362714624,3362714879,HN -3362714880,3362716415,VE -3362716416,3362716671,CR -3362716672,3362717695,VE -3362717696,3362815999,CL -3362816000,3362832383,AR -3362832384,3362838527,CO -3362838528,3362840575,EC -3362840576,3362897919,CL -3362897920,3362903295,HT -3362903296,3362904063,MX -3362904064,3362914303,HT -3362914304,3362930687,CO -3362930688,3362934783,CL -3362934784,3362936831,AR -3362936832,3362938879,CL -3362938880,3362942975,AR -3362942976,3362945023,GT -3362945024,3362983935,AR -3362983936,3362984447,PY -3362984448,3362984703,CR -3362984704,3362984959,PA -3362984960,3362985983,PE -3362985984,3362988031,AR -3362988032,3362992127,EC -3362992128,3362996223,AR -3362996224,3363000319,UY -3363000320,3363004415,AR -3363012608,3363024895,PA -3363024896,3363025151,HN -3363025152,3363025407,PA -3363025408,3363025663,CO -3363025664,3363025919,CW -3363025920,3363026431,CO -3363026432,3363026943,HT -3363026944,3363027199,CL -3363027200,3363027967,AR -3363027968,3363028991,HN -3363028992,3363045375,AR -3363045376,3363110911,CO -3363110912,3363176447,AR -3363176448,3363274751,CO -3363274752,3363291135,GT -3363291136,3363299327,BO -3363299328,3363373055,CL -3363373056,3363438591,PE -3363438592,3363471359,AR -3363471360,3363487743,CR -3363487744,3363504127,CO -3363504128,3363512319,PE -3363512320,3363553919,AR -3363553920,3363554303,US -3363554304,3363554431,BR -3363554432,3363555071,AR -3363555072,3363555327,US -3363555328,3363555839,AR -3363555840,3363556607,US -3363556608,3363557375,AR -3363557376,3363559423,BZ -3363559424,3363561471,AR -3363565568,3363569663,AR -3363569664,3363577855,PA -3363577856,3363586047,CL -3363594240,3363600383,AR -3363600384,3363600639,PY -3363600640,3363600895,VE -3363600896,3363601407,AR -3363601408,3363601919,CO -3363601920,3363602175,AR -3363602176,3363602431,PA -3363602432,3363610623,CW -3363614720,3363617791,AR -3363617792,3363618815,PE -3363618816,3363627007,UY -3363627008,3363635199,EC -3363635200,3363651583,UY -3363651584,3363667967,AR -3363667968,3363676159,EC -3363676160,3363678207,TT -3363682304,3363684351,VE -3363684352,3363708927,EC -3363708928,3363713023,CL -3363713024,3363713279,EC -3363713280,3363714047,CL -3363714048,3363715583,PE -3363715584,3363716095,CL -3363716096,3363716607,PE -3363716608,3363716863,AR -3363716864,3363717119,PE -3363717120,3363733503,CL -3363733504,3363831807,AR -3363831808,3367763967,BR -3367763968,3367804927,MX -3367804928,3367840767,BR -3367840768,3367841023,HN -3367841024,3367841039,CA -3367841040,3367841407,HN -3367841408,3367841423,CA -3367841424,3367841791,HN -3367841792,3368052991,BR -3368052992,3368053247,PE -3368053248,3368053503,CO -3368053504,3368086527,BR -3368086528,3368087551,CR -3368087552,3368157183,BR -3368157184,3368173567,MX -3368173568,3370188799,BR -3370188800,3370196991,MX -3370196992,3370214399,BR -3370214400,3370215423,AR -3370215424,3370487807,BR -3370487808,3370488831,CR -3370488832,3370489855,AR -3370489856,3370490879,VE -3370490880,3370506239,BR -3370506240,3370507263,VE -3370507264,3370512383,BR -3370514432,3370515455,BR -3370515456,3370516479,AR -3370516480,3370926079,BR -3370926080,3370942463,MX -3370942464,3371106303,BR -3371106304,3371122687,MX -3371122688,3378511871,BR -3378511872,3380506879,MX -3380506880,3380507135,BR -3380507136,3380744191,MX -3380744192,3380745215,CO -3380745216,3380746239,BR -3380746240,3380747263,PE -3380747264,3380748287,BR -3380748288,3380761087,MX -3380761088,3380761599,VE -3380761600,3380764671,BR -3380764672,3380808191,MX -3380808192,3380808703,CR -3380808704,3380811775,MX -3380811776,3380813823,BR -3380813824,3380815103,MX -3380815104,3380815359,CR -3380815360,3380815871,CL -3380815872,3380816127,MX -3380816128,3380816383,BO -3380816384,3380816639,SV -3380816640,3380816895,CW -3380816896,3380817151,MX -3380817152,3380817407,BO -3380817408,3380817663,CO -3380817664,3380817919,AR -3380817920,3380818175,MX -3380818176,3380818431,PA -3380818432,3380818687,DO -3380818688,3380818943,PY -3380818944,3380822015,MX -3380822272,3380822527,MX -3380822528,3380822783,NI -3380822784,3380823039,PE -3380823040,3380824063,BR -3380824064,3380824319,MX -3380824320,3380824575,GT -3380824576,3380825087,AR -3380825088,3380825343,MX -3380825344,3380825599,HT -3380825600,3380825855,CO -3380825856,3380826111,AR -3380826112,3380828159,BR -3380828672,3380829183,CO -3380829184,3380830207,BR -3380830208,3380830463,MX -3380830464,3380830719,CO -3380830720,3380831231,PA -3380831232,3380831743,MX -3380831744,3380831999,AR -3380832256,3380832767,MX -3380832768,3380833279,DO -3380833280,3380833791,MX -3380833792,3380834303,SV -3380834304,3380834815,MX -3380834816,3380835071,CO -3380835072,3380835327,NI -3380835328,3380835839,MX -3380835840,3380836351,AR -3380836352,3380836607,MX -3380836608,3380836863,PE -3380836864,3380837375,SV -3380837376,3380840447,MX -3380840448,3380843519,BR -3380843520,3380844543,PA -3380844544,3380853759,BR -3380853760,3380854783,CO -3380854784,3380858879,MX -3380858880,3380860927,BR -3380860928,3380861951,CO -3380861952,3380862975,PE -3380862976,3380865023,BR -3380865024,3380867071,MX -3380867072,3380869119,BR -3380869120,3381350399,MX -3381350400,3381351423,AR -3381351424,3381354495,BR -3381354496,3381373951,MX -3381373952,3381374975,BR -3381374976,3381377023,MX -3381377024,3381379071,BR -3381379072,3381385215,MX -3381385216,3381387263,BR -3381387264,3381448703,MX -3381448704,3381452799,BR -3381452800,3381453823,AR -3381453824,3381455871,BR -3381455872,3381456895,US -3381456896,3381460991,BR -3381460992,3381944319,MX -3381944320,3381946367,BR -3381946368,3381947391,CL -3381947392,3381952511,BR -3381952512,3381960703,MX -3381960704,3381962751,BR -3381962752,3381962991,US -3381962992,3381962999,FR -3381963000,3381963559,US -3381963560,3381963567,FR -3381963568,3381963711,US -3381963712,3381963727,CA -3381963728,3381963775,US -3381963776,3381968895,BR -3381968896,3381972991,MX -3381972992,3381974015,BR -3381974016,3381975039,CL -3381975040,3381979135,BR -3381979136,3381980159,CR -3381980160,3381985279,BR -3381985280,3382009855,MX -3382009856,3382018047,BR -3382018048,3382053887,MX -3382053888,3382057983,BR -3382057984,3382059007,CL -3382059008,3382063103,MX -3382063104,3382066175,BR -3382066176,3382067199,PE -3382067200,3382071295,MX -3382071296,3382072319,BR -3382072320,3382073343,SV -3382073344,3382075391,BR -3382075392,3382076415,CO -3382076416,3382077439,BR -3382077440,3382078463,HT -3382078464,3382083583,BR -3382083584,3382087679,MX -3382087680,3382091775,BR -3382091776,3382099967,BO -3382099968,3382558719,MX -3382558720,3382575103,BR -3382575104,3382577151,MX -3382577152,3382579199,BR -3382579200,3382580223,MX -3382580224,3382583295,BR -3382583296,3382585343,MX -3382585344,3382587391,BR -3382587392,3382588415,HN -3382588416,3382589439,PE -3382589440,3382591487,BR -3382591488,3382599679,MX -3382601728,3382602751,MX -3382602752,3382603775,BR -3382603776,3382605823,MX -3382605824,3382607871,AR -3382607872,3382642687,MX -3382642688,3382644735,AR -3382644736,3382646783,MX -3382646784,3382648831,BR -3382648832,3382653951,MX -3382653952,3382654975,BR -3382654976,3382657023,AR -3382657024,3382659071,MX -3382659072,3382661119,BR -3382661120,3382662143,MX -3382662144,3382665215,BR -3382665216,3382669311,MX -3382669312,3382669567,SV -3382669568,3382669823,GT -3382669824,3382670079,HN -3382670080,3382670335,GT -3382670336,3382672383,BR -3382672384,3382677503,MX -3382677504,3382681599,BR -3382681600,3382683647,MX -3382683648,3382685695,CL -3382685696,3382686655,MX -3382686656,3382686719,US -3382686720,3382689791,BR -3382689792,3382695935,MX -3382695936,3382696959,AR -3382696960,3382697983,EC -3382697984,3382704127,MX -3382704128,3382706175,BR -3382706176,3382853631,MX -3382853632,3382870015,BR -3382870016,3383701503,MX -3383701504,3383705599,BR -3383705600,3383754751,MX -3383754752,3384148991,AR -3384148992,3384153087,BR -3384153088,3384154111,MX -3384154112,3384155135,SV -3384155136,3384162047,BR -3384162048,3384162303,CR -3384162304,3384167423,BR -3384167424,3384168447,CR -3384168448,3384169471,AR -3384169472,3384170495,EC -3384170496,3384175615,BR -3384175616,3384177663,AR -3384177664,3384180735,BR -3384180736,3384184831,AR -3384184832,3384185855,BR -3384185856,3384186879,EC -3384186880,3384196095,BR -3384196096,3384197119,AR -3384197120,3384205823,BR -3384205824,3384206335,CR -3384206336,3384209407,BR -3384209408,3384210431,EC -3384210432,3384211455,BR -3384211456,3384212479,CO -3384212480,3384213503,BR -3384213504,3384279039,EC -3384279040,3384410111,CO -3384410112,3384672255,CL -3384672256,3384688639,HN -3384688640,3384705023,CO -3384705024,3384737791,AR -3384737792,3385851903,CR -3385851904,3386114047,VE -3386114048,3386245119,AR -3386245120,3386376191,CL -3386376192,3386392575,CO -3386408960,3386425343,GT -3386425344,3386441727,AR -3386441728,3386458111,PY -3386458112,3386474495,EC -3386474496,3386490879,UY -3386490880,3386499071,CO -3386499072,3386503167,AR -3386503168,3386504191,CL -3386504192,3386505215,AR -3386505216,3386507263,CL -3386507264,3386523647,EC -3386523648,3386540031,PA -3386540032,3386548223,CL -3386548224,3386556415,CR -3386556416,3386562047,PA -3386562048,3386562303,PE -3386562304,3386571263,PA -3386571264,3386571327,BZ -3386571328,3386571391,PA -3386571392,3386571519,BZ -3386571520,3386572799,PA -3386572800,3386589183,EC -3386589184,3386601471,AR -3386601472,3386605567,CO -3386605568,3386613759,CL -3386613760,3386621951,AR -3386621952,3386630143,CO -3386630144,3386632191,UY -3386632192,3386634239,CL -3386634240,3386636287,CO -3386636288,3386637311,BR -3386637312,3386638335,UY -3386638336,3386640895,SX -3386640896,3386641151,US -3386641152,3386642431,SX -3386642432,3386644735,AR -3386644736,3386644991,PY -3386644992,3386645247,CR -3386645248,3386645503,CL -3386645504,3386645759,AR -3386645760,3386646015,CR -3386646016,3386662911,CO -3386662912,3386671103,CL -3386671104,3386675199,HN -3386675200,3386687487,AR -3386687488,3386695679,CU -3386695680,3386703871,CL -3386703872,3386720255,UY -3386720256,3386728447,TT -3386728448,3386732543,AR -3386732544,3386734591,CL -3386734592,3386734847,AR -3386734848,3386735103,CL -3386735104,3386735359,CO -3386735360,3386735615,CL -3386735616,3386736127,CO -3386736128,3386736383,DO -3386736384,3386736639,EC -3386736640,3386753023,CO -3386753024,3386761215,CL -3386761216,3386769407,PA -3386769408,3386773503,VE -3386773504,3386774527,AR -3386774528,3386777599,BR -3386781696,3386783743,PY -3386783744,3386784767,AR -3386784768,3386785791,GT -3386785792,3386802175,BO -3386802176,3386900479,CL -3386900480,3387162623,PA -3387162624,3387228159,CO -3387228160,3387260927,AW -3387260928,3387293695,DO -3387293696,3387359231,PE -3387359232,3387424767,AR -3387424768,3387502599,CO -3387502600,3387502607,JP -3387502608,3387555839,CO -3387555840,3387568127,AR -3387568128,3387572223,PE -3387572224,3387576319,CO -3387576320,3387578367,EC -3387578368,3387584511,AR -3387584512,3387585535,PE -3387585536,3387586047,AR -3387586048,3387586303,PE -3387586304,3387586431,AR -3387586432,3387587583,PE -3387587584,3387588159,AR -3387588160,3387588175,PE -3387588176,3387600895,AR -3387600896,3387604991,CO -3387604992,3387613183,EC -3387613184,3387613439,US -3387613440,3387617279,VE -3387617280,3387619327,CO -3387619328,3387686911,AR -3387686912,3387736063,CL -3387736064,3387752447,CO -3387752448,3387817983,CR -3387817984,3387834367,VE -3387834368,3387850751,TT -3387850752,3387867135,EC -3387867136,3387949055,CL -3387949056,3388014591,PE -3388014592,3388080127,CL -3388080128,3388211199,VE -3388211200,3388342271,CO -3388342272,3388407807,CL -3388407808,3388473343,SV -3388473344,3388604415,VE -3388604416,3388997631,AR -3388997632,3389001727,AU -3389001728,3389005823,PH -3389005824,3389014015,NZ -3389014016,3389014271,AU -3389014272,3389014783,JP -3389014784,3389015807,AU -3389015808,3389016063,SG -3389016064,3389016575,JP -3389016576,3389017087,AU -3389017088,3389017343,JP -3389017344,3389017599,HK -3389017600,3389017855,AU -3389017856,3389018111,VN -3389018112,3389018367,PG -3389018368,3389019135,AU -3389019136,3389019391,NZ -3389019392,3389020159,AU -3389020160,3389020671,ID -3389020672,3389020927,AU -3389020928,3389021183,PH -3389021184,3389021695,ID -3389021696,3389021951,BD -3389021952,3389022463,AU -3389022464,3389022719,IN -3389022720,3389023231,AU -3389023232,3389023743,CN -3389023744,3389023999,AU -3389024000,3389024255,IN -3389024256,3389024511,SG -3389024512,3389025023,AU -3389025024,3389025279,ID -3389025280,3389025535,AU -3389025536,3389025791,IN -3389025792,3389026047,PK -3389026048,3389026303,TH -3389026304,3389026559,IN -3389026560,3389027071,AU -3389027072,3389027583,IN -3389027584,3389028607,TH -3389028608,3389028863,NZ -3389028864,3389029375,CN -3389029376,3389029887,NZ -3389029888,3389030399,SG -3389030400,3389034495,HK -3389034496,3389035519,PH -3389035520,3389035775,IN -3389035776,3389036031,SG -3389036032,3389036287,AU -3389036288,3389036543,NZ -3389036544,3389037567,AU -3389037568,3389038591,NC -3389038592,3389044735,HK -3389044736,3389046783,AU -3389046784,3389063167,US -3389063168,3389063679,AU -3389063680,3389063935,HK -3389063936,3389064191,AU -3389064192,3389064447,IN -3389064448,3389064703,SG -3389064704,3389065215,HK -3389065216,3389067263,NZ -3389067264,3389071359,AU -3389071360,3389079551,PG -3389079552,3389087743,SG -3389087744,3389087999,HK -3389088000,3389090239,SG -3389090240,3389090303,CN -3389090304,3389092351,SG -3389092352,3389092863,PH -3389092864,3389093887,HK -3389093888,3389095935,IN -3389095936,3389104127,SG -3389104128,3389112319,SB -3389112320,3389116415,MV -3389116416,3389120511,JP -3389122560,3389122815,HK -3389122816,3389123583,AU -3389123584,3389123839,ID -3389123840,3389124351,AU -3389124352,3389124607,SG -3389124608,3389128447,PG -3389128448,3389129727,AU -3389129728,3389132799,NZ -3389132800,3389136895,AU -3389136896,3389142015,HK -3389142016,3389143039,TW -3389143040,3389145087,AU -3389145088,3389151231,HK -3389151232,3389152255,JP -3389152256,3389153023,US -3389153024,3389153279,AU -3389153280,3389161471,TV -3389161472,3389194239,JP -3389194240,3389195775,AU -3389195776,3389196287,HK -3389196288,3389197567,AU -3389197568,3389197823,IN -3389197824,3389198079,ID -3389198080,3389198335,IN -3389198336,3389202431,KR -3389202432,3389210623,AU -3389210624,3389210879,IN -3389210880,3389211135,AU -3389211136,3389211391,IN -3389211392,3389211647,AU -3389211648,3389212671,TH -3389212672,3389213183,IN -3389213184,3389213439,AU -3389213440,3389213695,MY -3389213952,3389214207,IN -3389214208,3389214463,SG -3389214464,3389214719,AU -3389214720,3389218815,NZ -3389218816,3389222911,AU -3389222912,3389223935,US -3389223936,3389226495,IN -3389226496,3389226751,SG -3389226752,3389227007,IN -3389227008,3389227519,CN -3389227520,3389228031,PK -3389228032,3389228799,AU -3389228800,3389229055,SG -3389229056,3389229311,JP -3389229312,3389229567,AU -3389229568,3389230079,SG -3389230080,3389235199,JP -3389235200,3389243391,TW -3389243392,3389247487,AU -3389247488,3389251583,ID -3389251584,3389259775,PF -3389259776,3389263871,PH -3389263872,3389266175,NZ -3389266176,3389266431,IN -3389266432,3389266943,HK -3389266944,3389267967,AU -3389267968,3389276159,WS -3389276160,3389284351,AU -3389284352,3389292543,BD -3389292544,3389300735,CN -3389300736,3389301247,ID -3389301760,3389302015,IN -3389302016,3389302527,AU -3389302528,3389302783,PK -3389302784,3389303039,VN -3389303040,3389303295,IN -3389303296,3389303807,ID -3389303808,3389304063,IN -3389304064,3389304319,BD -3389304320,3389304575,PH -3389304576,3389304831,AU -3389304832,3389305087,VN -3389305088,3389305599,IN -3389305600,3389305855,ID -3389305856,3389306111,IN -3389306112,3389306367,AU -3389306368,3389306623,IN -3389306624,3389306879,AU -3389306880,3389307135,SG -3389307136,3389307647,ID -3389307648,3389307903,IN -3389307904,3389308159,AU -3389308160,3389308415,ID -3389308416,3389308671,AU -3389308672,3389308927,PH -3389308928,3389317119,HK -3389317120,3389322239,AU -3389322240,3389324031,JP -3389324032,3389324287,VU -3389324288,3389325311,CN -3389325312,3389326335,AU -3389326336,3389326847,TW -3389326848,3389327359,AU -3389327360,3389329407,TW -3389329408,3389333503,US -3389333504,3389341695,BD -3389341696,3389345791,JP -3389345792,3389349887,TH -3389349888,3389358079,AU -3389358080,3389366271,PK -3389366272,3389374463,AU -3389374464,3389378559,MN -3389378560,3389381631,CN -3389381632,3389382655,JP -3389382656,3389390847,TW -3389390848,3389391359,HK -3389391360,3389391615,VN -3389391616,3389392127,AU -3389392128,3389392383,NZ -3389392384,3389392895,CN -3389392896,3389394943,JP -3389394944,3389399039,TH -3389399040,3389407743,AU -3389407744,3389408255,CN -3389408256,3389409279,JP -3389409280,3389409791,CN -3389409792,3389411327,AU -3389411328,3389411583,IN -3389411584,3389412351,AU -3389412352,3389412607,NZ -3389412608,3389412863,PH -3389412864,3389413119,AU -3389413120,3389413887,CN -3389413888,3389414143,TH -3389414144,3389414399,AU -3389414400,3389414911,CN -3389414912,3389415167,HK -3389415168,3389415423,KR -3389415424,3389415935,VN -3389415936,3389416191,JP -3389416192,3389416447,IN -3389416448,3389416959,TH -3389416960,3389417215,SG -3389417216,3389417471,CN -3389417472,3389417983,TW -3389417984,3389418239,AU -3389418240,3389418495,TH -3389418496,3389418751,CN -3389418752,3389419007,NZ -3389419008,3389419519,CN -3389419520,3389420031,AU -3389420032,3389420287,CN -3389420288,3389420543,AU -3389420544,3389421311,NZ -3389421312,3389421567,JP -3389421568,3389422591,KI -3389422592,3389431807,AU -3389431808,3389435903,SG -3389435904,3389439999,CN -3389440000,3389444095,HK -3389444096,3389452287,ID -3389452288,3389453311,SG -3389453312,3389454335,JP -3389454336,3389455359,AU -3389455360,3389456383,JP -3389456384,3389456895,NZ -3389456896,3389457407,AU -3389457408,3389458431,NZ -3389458432,3389460479,AU -3389460480,3389464575,JP -3389464576,3389469695,NZ -3389469696,3389470719,KH -3389470720,3389471231,AU -3389471232,3389471487,IN -3389471488,3389471743,US -3389471744,3389472767,NZ -3389472768,3389480959,AU -3389480960,3389489151,JP -3389489152,3389493247,HK -3389493248,3389521919,AU -3389521920,3389522175,CN -3389522176,3389522431,SG -3389522432,3389523455,CN -3389523456,3389523967,JP -3389523968,3389524991,AU -3389524992,3389525247,CN -3389525248,3389525503,NZ -3389525504,3389526015,TW -3389526016,3389528063,JP -3389528064,3389528319,CN -3389528320,3389528575,AU -3389528576,3389529087,JP -3389529088,3389529599,ID -3389529600,3389529855,PH -3389529856,3389530111,HK -3389530112,3389532159,AU -3389532160,3389533183,SG -3389533184,3389534207,NZ -3389534208,3389538303,JP -3389538304,3389538559,AU -3389538560,3389540351,TH -3389540352,3389541375,KH -3389541376,3389541631,AU -3389541632,3389541887,CN -3389541888,3389542399,TH -3389542400,3389543423,JP -3389543424,3389544447,TH -3389544448,3389545471,HK -3389545472,3389545727,AU -3389545728,3389545983,HK -3389545984,3389546495,SG -3389554688,3389562879,CN -3389562880,3389571071,KR -3389571072,3389575167,CN -3389575168,3389579263,JP -3389579264,3389587455,PH -3389587456,3389595647,AU -3389595648,3389595903,CN -3389595904,3389596159,AU -3389596160,3389596671,CN -3389596672,3389597439,SG -3389597440,3389597695,MY -3389597696,3389599743,MN -3389599744,3389600255,CN -3389600256,3389600511,AU -3389600512,3389601535,CN -3389601536,3389601791,IN -3389601792,3389602047,AU -3389602048,3389602815,CN -3389602816,3389603839,HK -3389603840,3389604095,IN -3389604096,3389604351,AU -3389604352,3389604863,SG -3389604864,3389605119,US -3389605120,3389605375,ID -3389605376,3389605631,AU -3389605632,3389605887,SG -3389605888,3389606399,ID -3389606400,3389606655,AU -3389606656,3389606911,IN -3389606912,3389607423,LA -3389607424,3389607679,AU -3389607680,3389608191,VN -3389608192,3389608447,TH -3389608448,3389608703,HK -3389608704,3389608959,AU -3389608960,3389609215,VN -3389609216,3389609471,ID -3389609472,3389609727,SG -3389609728,3389609983,AU -3389609984,3389610239,NZ -3389610240,3389610495,SG -3389610496,3389610751,TH -3389610752,3389611519,IN -3389611520,3389612031,AU -3389612032,3389616127,MY -3389616128,3389617151,AU -3389617152,3389618175,NZ -3389618176,3389640703,IN -3389640704,3389644799,JP -3389644800,3389645823,NZ -3389645824,3389661183,AU -3389661184,3389669375,ID -3389669376,3389673471,CN -3389673472,3389677567,AU -3389677568,3389681663,JP -3389681664,3389685759,CN -3389685760,3389718527,AU -3389718528,3389784063,JP -3389784064,3389784319,NZ -3389784320,3389784831,CN -3389784832,3389785087,NZ -3389785088,3389786111,HK -3389786112,3389788159,JP -3389788160,3389788415,IN -3389788416,3389788927,CN -3389788928,3389789695,US -3389789696,3389790719,AU -3389790720,3389790975,BN -3389790976,3389791231,JP -3389791232,3389791743,AU -3389791744,3389791999,JP -3389792000,3389800447,AU -3389800448,3389801471,JP -3389801472,3389801983,AU -3389801984,3389802239,NZ -3389802240,3389802495,AU -3389802496,3389802751,CN -3389802752,3389803263,TH -3389803264,3389803519,ID -3389803520,3389804543,TW -3389804544,3389805567,IN -3389805568,3389806079,CN -3389806080,3389807359,AU -3389807360,3389807615,NZ -3389807616,3389808127,AU -3389808128,3389808639,SG -3389808640,3389808895,CN -3389808896,3389809151,TH -3389809152,3389809663,CN -3389809664,3389809919,AU -3389809920,3389810175,IN -3389810176,3389810431,AU -3389810432,3389810687,IN -3389810688,3389811199,NZ -3389811200,3389811455,CN -3389811456,3389811711,AU -3389811712,3389811967,NZ -3389811968,3389812479,AU -3389812480,3389812735,CN -3389812736,3389813759,AU -3389813760,3389814015,CN -3389814016,3389814527,TH -3389814528,3389816575,AU -3389816576,3389816831,US -3389816832,3389846527,AU -3389846528,3389847551,JP -3389847552,3389849599,NZ -3389849600,3389915135,JP -3389915136,3389916159,AU -3389916160,3389917183,HK -3389917184,3389919231,SG -3389919232,3389931519,NZ -3389931520,3389932031,CN -3389932032,3389932287,AU -3389932288,3389932799,HK -3389932800,3389933055,CN -3389933056,3389933567,PK -3389933568,3389933823,IN -3389933824,3389934847,CN -3389934848,3389935103,AU -3389935104,3389935615,CN -3389935616,3389935871,HK -3389935872,3389936127,AU -3389936128,3389936895,NZ -3389936896,3389937663,PH -3389937664,3389937919,CN -3389937920,3389938175,AU -3389938176,3389938687,KR -3389938688,3389939199,ID -3389939200,3389939711,AU -3389939712,3389939967,NZ -3389939968,3389940223,CN -3389940224,3389940479,AU -3389940480,3389940991,NZ -3389940992,3389941247,AU -3389941248,3389941503,NZ -3389941504,3389941759,KR -3389941760,3389942271,CN -3389942272,3389942783,NZ -3389942784,3389943295,CN -3389943296,3389943551,AU -3389943552,3389943807,CN -3389943808,3389944319,AU -3389944320,3389944831,CN -3389944832,3389945087,AU -3389945088,3389945343,TH -3389945344,3389945855,CN -3389945856,3389946879,IN -3389946880,3389947391,CN -3389947392,3389947647,AU -3389947648,3389947903,CN -3389947904,3389948159,AU -3389948160,3389948415,CN -3389948416,3389949695,AU -3389949696,3389950207,CN -3389950208,3389950975,AU -3389950976,3389951743,NZ -3389951744,3389953279,AU -3389953280,3389953535,CN -3389953536,3389953791,AU -3389953792,3389954047,CN -3389954048,3389954303,AU -3389954304,3389954815,SG -3389954816,3389955327,AU -3389955328,3389956095,CN -3389956096,3389957119,IN -3389957120,3389957375,TH -3389957376,3389957631,KR -3389957632,3389957887,AU -3389957888,3389958399,NZ -3389958400,3389960447,CN -3389960448,3389962239,AU -3389962240,3389962751,CN -3389962752,3389963007,AU -3389963264,3389966335,AU -3389966336,3389968383,SG -3389968384,3389968895,CN -3389968896,3389969663,AU -3389969664,3389969919,CN -3389969920,3389970431,AU -3389970432,3389971199,NZ -3389971200,3389971711,CN -3389971712,3389971967,AU -3389971968,3389973503,CN -3389973504,3389973759,NZ -3389973760,3389974271,AU -3389974272,3389974527,CN -3389974528,3389975295,AU -3389975296,3389976575,CN -3389976576,3389978111,AU -3389978112,3389978367,CN -3389978368,3389979391,AU -3389979392,3389979647,CN -3389979648,3389980415,NZ -3389980416,3389980671,ID -3389980672,3390308351,JP -3390308352,3390310399,NZ -3390310400,3390316543,AU -3390316544,3390325247,NZ -3390325248,3390325503,CN -3390325504,3390325759,AU -3390325760,3390326015,PG -3390326016,3390327807,AU -3390327808,3390328575,NZ -3390328576,3390328831,CN -3390328832,3390329087,NZ -3390329088,3390329343,AU -3390329344,3390330623,KR -3390330624,3390331647,CN -3390331648,3390332415,NZ -3390332416,3390332927,CN -3390332928,3390333439,NZ -3390333440,3390333695,HK -3390333696,3390333951,KR -3390333952,3390334463,HK -3390334464,3390335231,NZ -3390335232,3390335487,TH -3390335488,3390336511,ID -3390336768,3390337023,HK -3390337024,3390337279,GU -3390337280,3390337535,NZ -3390337536,3390337791,CN -3390337792,3390338303,JP -3390338304,3390338559,CN -3390338560,3390338815,HK -3390338816,3390339071,KR -3390339072,3390339327,CN -3390339328,3390339839,NZ -3390339840,3390340351,JP -3390340352,3390341119,CN -3390341120,3390375935,KR -3390375936,3390377983,AU -3390377984,3390382079,NZ -3390382080,3390386175,IN -3390386176,3390390271,CN -3390390272,3390398463,NZ -3390398464,3390406655,MN -3390406656,3390406911,NZ -3390406912,3390407167,SG -3390407168,3390407423,NZ -3390407424,3390407935,CN -3390407936,3390408191,NZ -3390408192,3390408703,IN -3390408704,3390409727,NZ -3390409728,3390409983,TH -3390409984,3390410495,CN -3390410496,3390410751,NZ -3390410752,3390411007,TH -3390411008,3390411519,JP -3390411520,3390412031,CN -3390412032,3390412287,TH -3390412288,3390413567,CN -3390413568,3390413823,NZ -3390413824,3390414079,CN -3390414080,3390414335,NZ -3390414336,3390414847,SG -3390414848,3390418943,JP -3390418944,3390423039,MV -3390423040,3390429439,SG -3390429440,3390429951,HK -3390429952,3390439423,SG -3390439424,3390441471,NZ -3390441472,3390443519,TH -3390443520,3390447359,NZ -3390447360,3390447615,ID -3390447616,3390455807,KR -3390455808,3390472191,JP -3390472192,3390480383,NC -3390480384,3390484479,AU -3390484480,3390488575,GU -3390488576,3390492671,BD -3390492672,3390496767,JP -3390496768,3390500863,NC -3390500864,3390502911,HK -3390502912,3390504959,CN -3390504960,3390767103,JP -3390767104,3390769407,NZ -3390769408,3390769663,IN -3390769664,3390770175,TH -3390770176,3390770431,CN -3390770432,3390770687,AU -3390770688,3390770943,CN -3390770944,3390771199,AU -3390771200,3390775295,SG -3390775296,3390790399,NZ -3390790400,3390790655,AU -3390790656,3390801919,NZ -3390801920,3390802431,CN -3390802432,3390832639,NZ -3390832640,3390963711,TH -3390963712,3391094783,KR -3391094784,3391356927,JP -3391356928,3391369215,NZ -3391369216,3391373311,AU -3391373312,3391414783,NZ -3391414784,3391415039,CN -3391415040,3391444479,NZ -3391444480,3391444991,VN -3391444992,3391453183,NZ -3391453184,3391453439,ID -3391453440,3391469055,NZ -3391469056,3391469311,AU -3391469312,3391487999,NZ -3391488000,3391489023,CN -3391489024,3391490047,NP -3391490048,3391492095,CN -3391492096,3391496191,HK -3391496192,3391500287,SG -3391500288,3391523583,CN -3391523584,3391523839,AU -3391523840,3391524863,CN -3391524864,3391525375,AU -3391525376,3391525887,CN -3391525888,3391526143,AU -3391526144,3391528191,CN -3391528192,3391528447,AU -3391528448,3391529471,CN -3391529472,3391529983,AU -3391529984,3391532031,CN -3391532032,3391533055,IN -3391533056,3391533567,CN -3391533568,3391534079,HK -3391534080,3391535103,IN -3391535104,3391553535,CN -3391553536,3391619071,TW -3391619072,3391620095,AU -3391620096,3391620607,CN -3391620608,3391620863,IN -3391620864,3391621119,CN -3391621120,3391622911,HK -3391622912,3391623167,CN -3391623168,3391627263,HK -3391627264,3391651839,IN -3391651840,3391653631,HK -3391653632,3391654143,CN -3391654144,3391654911,HK -3391654912,3391655167,CN -3391655168,3391655679,HK -3391655680,3391656447,CN -3391656448,3391657471,HK -3391657472,3391657727,CN -3391657728,3391658751,HK -3391658752,3391659263,CN -3391659264,3391659519,HK -3391659520,3391660031,CN -3391660032,3391660543,HK -3391660544,3391660799,CN -3391660800,3391662079,AU -3391662080,3391663103,HK -3391663104,3391664127,PH -3391664128,3391668223,BD -3391668224,3391676415,HK -3391676416,3391684607,SG -3391684608,3391686655,IN -3391686656,3391687167,CN -3391687168,3391687423,IN -3391687424,3391688191,CN -3391688192,3391688703,AU -3391688704,3391717375,IN -3391717376,3391717631,CN -3391717632,3391717887,IN -3391717888,3391718399,CN -3391718400,3391718911,IN -3391718912,3391719423,JP -3391719424,3391720959,NZ -3391720960,3391721215,CN -3391721216,3391721471,NZ -3391721472,3391721983,AU -3391721984,3391722239,TW -3391722240,3391722495,PH -3391722496,3391723519,IN -3391723520,3391725567,CN -3391725568,3391733759,TH -3391733760,3391734015,CN -3391734016,3391734783,AU -3391734784,3391736831,CN -3391736832,3391737855,IN -3391737856,3391741951,JP -3391741952,3391746047,IN -3391746048,3391750143,CN -3391750144,3391750303,JP -3391750304,3391750335,SG -3391750336,3391750659,JP -3391750660,3391750663,SG -3391750664,3391750667,JP -3391750668,3391750671,SG -3391750672,3391750683,JP -3391750684,3391750687,SG -3391750688,3391750919,JP -3391750920,3391750939,SG -3391750940,3391751071,JP -3391751072,3391751103,SG -3391751104,3391751183,JP -3391751184,3391751231,SG -3391751232,3391751295,JP -3391751296,3391751359,SG -3391751360,3391751903,JP -3391751904,3391751935,SG -3391751936,3391752063,JP -3391752064,3391752095,SG -3391752096,3391752287,JP -3391752288,3391752383,SG -3391752384,3391752463,JP -3391752464,3391752471,SG -3391752472,3391752475,JP -3391752476,3391752511,SG -3391752512,3391752543,JP -3391752544,3391752575,SG -3391752576,3391752591,JP -3391752592,3391752599,SG -3391752600,3391752831,JP -3391752832,3391752863,SG -3391752864,3391752959,JP -3391752960,3391753023,SG -3391753024,3391753055,JP -3391753056,3391753087,SG -3391753088,3391753215,JP -3391753216,3391753247,SG -3391753248,3391753279,JP -3391753280,3391753311,SG -3391753312,3391753343,JP -3391753344,3391753503,SG -3391753504,3391753631,JP -3391753632,3391753695,SG -3391753696,3391753759,JP -3391753760,3391753791,SG -3391753792,3391754015,JP -3391754016,3391754079,SG -3391754080,3391754199,JP -3391754200,3391754207,SG -3391754208,3391755839,JP -3391755840,3391755871,SG -3391755872,3391758335,JP -3391758336,3391759871,SG -3391759872,3391760127,JP -3391760128,3391760639,SG -3391760640,3391761151,JP -3391761152,3391761663,SG -3391761664,3391762175,JP -3391762176,3391762943,SG -3391762944,3391763007,JP -3391763008,3391763103,SG -3391763104,3391763135,JP -3391763136,3391763167,SG -3391763168,3391763199,JP -3391763200,3391763455,SG -3391763456,3391763743,JP -3391763744,3391763807,SG -3391763808,3391763839,JP -3391763840,3391763871,SG -3391763872,3391763903,JP -3391763904,3391764351,SG -3391764352,3391764383,JP -3391764384,3391764991,SG -3391764992,3391765055,JP -3391765056,3391765119,SG -3391765120,3391765183,JP -3391765184,3391765631,SG -3391765632,3391765727,JP -3391765728,3391765791,SG -3391765792,3391765823,JP -3391765824,3391765919,SG -3391765920,3391765951,JP -3391765952,3391766015,SG -3391766016,3391767039,JP -3391767040,3391767199,SG -3391767200,3391767231,JP -3391767232,3391767263,SG -3391767264,3391767295,JP -3391767296,3391767871,SG -3391767872,3391767903,JP -3391767904,3391767967,SG -3391767968,3391767999,JP -3391768000,3391768031,SG -3391768032,3391768047,JP -3391768048,3391768055,SG -3391768056,3391768063,JP -3391768064,3391768319,SG -3391768320,3391768351,JP -3391768352,3391768383,SG -3391768384,3391768415,JP -3391768416,3391768447,SG -3391768448,3391768543,JP -3391768544,3391768571,SG -3391768572,3391768591,JP -3391768592,3391768615,SG -3391768616,3391769087,JP -3391769088,3391769103,SG -3391769104,3391769119,JP -3391769120,3391769143,SG -3391769144,3391769159,JP -3391769160,3391769175,SG -3391769176,3391769199,JP -3391769200,3391769215,SG -3391769216,3391770159,JP -3391770160,3391770167,SG -3391770168,3391774719,JP -3391774720,3391776767,SG -3391776768,3391777039,JP -3391777040,3391777055,SG -3391777056,3391777535,JP -3391777536,3391777543,SG -3391777544,3391777551,JP -3391777552,3391777559,SG -3391777560,3391778047,JP -3391778048,3391778063,SG -3391778064,3391778303,JP -3391778304,3391778311,SG -3391778312,3391782911,JP -3391782912,3391784991,SG -3391784992,3391785119,JP -3391785120,3391785183,SG -3391785184,3391785215,JP -3391785216,3391785471,SG -3391785472,3391786015,JP -3391786016,3391786079,SG -3391786080,3391786112,JP -3391786113,3391786113,SG -3391786114,3391786207,JP -3391786208,3391788207,SG -3391788208,3391788223,JP -3391788224,3391788543,SG -3391788544,3391789055,JP -3391789056,3391789311,SG -3391789312,3391789407,JP -3391789408,3391789439,SG -3391789440,3391789567,JP -3391789568,3391790079,SG -3391790080,3391790335,JP -3391790336,3391791103,SG -3391791104,3391791359,JP -3391791360,3391791743,SG -3391791744,3391792383,JP -3391792384,3391792959,SG -3391792960,3391792991,JP -3391792992,3391793023,SG -3391793024,3391793055,JP -3391793056,3391793151,SG -3391793152,3391793663,JP -3391793664,3391794175,SG -3391794176,3391794431,JP -3391794432,3391794687,SG -3391794688,3391794695,JP -3391794696,3391794711,SG -3391794712,3391794727,JP -3391794728,3391794751,SG -3391794752,3391794767,JP -3391794768,3391794775,SG -3391794776,3391794783,JP -3391794784,3391794799,SG -3391794800,3391794815,JP -3391794816,3391794848,SG -3391794849,3391794879,JP -3391794880,3391794895,SG -3391794896,3391794943,JP -3391794944,3391795455,SG -3391795456,3391795775,JP -3391795776,3391795783,SG -3391795784,3391795791,JP -3391795792,3391795807,SG -3391795808,3391795839,JP -3391795840,3391795871,SG -3391795872,3391795927,JP -3391795928,3391795935,SG -3391795936,3391795975,JP -3391795976,3391796007,SG -3391796008,3391796023,JP -3391796024,3391796047,SG -3391796048,3391796087,JP -3391796088,3391796095,SG -3391796096,3391796199,JP -3391796200,3391796207,SG -3391796208,3391796231,JP -3391796232,3391796239,SG -3391796240,3391796263,JP -3391796264,3391796279,SG -3391796280,3391796303,JP -3391796304,3391796319,SG -3391796320,3391796335,JP -3391796336,3391796343,SG -3391796344,3391796351,JP -3391796352,3391796359,SG -3391796360,3391796367,JP -3391796368,3391796375,SG -3391796376,3391796431,JP -3391796432,3391796447,SG -3391796448,3391796479,JP -3391796480,3391796511,SG -3391796512,3391796543,JP -3391796544,3391796551,SG -3391796552,3391796559,JP -3391796560,3391796567,SG -3391796568,3391796607,JP -3391796608,3391796639,SG -3391796640,3391796663,JP -3391796664,3391796671,SG -3391796672,3391796735,JP -3391796736,3391797055,SG -3391797056,3391797063,JP -3391797064,3391797079,SG -3391797080,3391797087,JP -3391797088,3391797095,SG -3391797096,3391797111,JP -3391797112,3391797119,SG -3391797120,3391797143,JP -3391797144,3391797183,SG -3391797184,3391797191,JP -3391797192,3391797207,SG -3391797208,3391797263,JP -3391797264,3391797295,SG -3391797296,3391797303,JP -3391797304,3391797311,SG -3391797312,3391797343,JP -3391797344,3391797359,SG -3391797360,3391797365,JP -3391797366,3391797375,SG -3391797376,3391797391,JP -3391797392,3391797407,SG -3391797408,3391797423,JP -3391797424,3391797431,SG -3391797432,3391797455,JP -3391797456,3391797471,SG -3391797472,3391797487,JP -3391797488,3391797503,SG -3391797504,3391797519,JP -3391797520,3391797535,SG -3391797536,3391797551,JP -3391797552,3391797567,SG -3391797568,3391797599,JP -3391797600,3391797607,SG -3391797608,3391797695,JP -3391797696,3391797703,SG -3391797704,3391797727,JP -3391797728,3391797839,SG -3391797840,3391797855,JP -3391797856,3391797871,SG -3391797872,3391797887,JP -3391797888,3391797895,SG -3391797896,3391797903,JP -3391797904,3391797967,SG -3391797968,3391798063,JP -3391798064,3391798111,SG -3391798112,3391798143,JP -3391798144,3391798191,SG -3391798192,3391798199,JP -3391798200,3391798215,SG -3391798216,3391798239,JP -3391798240,3391798255,SG -3391798256,3391798263,JP -3391798264,3391798287,SG -3391798288,3391798303,JP -3391798304,3391798319,SG -3391798320,3391798327,JP -3391798328,3391798375,SG -3391798376,3391798383,JP -3391798384,3391798391,SG -3391798392,3391798407,JP -3391798408,3391798431,SG -3391798432,3391798455,JP -3391798456,3391798463,SG -3391798464,3391798495,JP -3391798496,3391798503,SG -3391798504,3391798511,JP -3391798512,3391798519,SG -3391798520,3391798527,JP -3391798528,3391798575,SG -3391798576,3391798583,JP -3391798584,3391798599,SG -3391798600,3391798607,JP -3391798608,3391798615,SG -3391798616,3391798639,JP -3391798640,3391798687,SG -3391798688,3391798703,JP -3391798704,3391798711,SG -3391798712,3391798735,JP -3391798736,3391798743,SG -3391798744,3391798767,JP -3391798768,3391801855,SG -3391801856,3391801887,JP -3391801888,3391801951,SG -3391801952,3391802015,JP -3391802016,3391802047,SG -3391802048,3391802111,JP -3391802112,3391802479,SG -3391802480,3391802623,JP -3391802624,3391802879,SG -3391802880,3391803135,JP -3391803136,3391804671,SG -3391804672,3391805183,JP -3391805184,3391805439,SG -3391805440,3391806207,JP -3391806208,3391806975,SG -3391806976,3391807167,JP -3391807168,3391807199,SG -3391807200,3391807231,JP -3391807232,3391807299,SG -3391807300,3391807327,JP -3391807328,3391807423,SG -3391807424,3391807455,JP -3391807456,3391807471,SG -3391807472,3391807475,JP -3391807476,3391808767,SG -3391808768,3391809279,JP -3391809280,3391809535,SG -3391809536,3391809631,JP -3391809632,3391809663,SG -3391809664,3391809727,JP -3391809728,3391809759,SG -3391809760,3391809791,JP -3391809792,3391810047,SG -3391810048,3391810559,JP -3391810560,3391811071,SG -3391811072,3391811103,JP -3391811104,3391811199,SG -3391811200,3391811263,JP -3391811264,3391815679,SG -3391815680,3391817727,AU -3391817728,3391819775,TO -3391819776,3391823871,JP -3391823872,3391827967,TH -3391827968,3391832063,KR -3391832064,3391832575,ID -3391832576,3391832831,AU -3391832832,3391833087,IN -3391833088,3391834111,JP -3391834112,3391835135,ID -3391835136,3391836159,CN -3391836160,3391836671,AU -3391836672,3391837183,HK -3391837184,3391838207,AU -3391838208,3391838719,ID -3391838720,3391838975,IN -3391838976,3391839231,US -3391839232,3391840255,ID -3391840256,3391841279,JP -3391841280,3391842303,MY -3391842304,3391843327,JP -3391843328,3391844351,VN -3391844352,3391845887,ID -3391845888,3391846399,PK -3391846400,3391847423,IN -3391847424,3391848447,HK -3391848448,3391849215,AU -3391849216,3391849471,IN -3391849472,3391851007,AU -3391851008,3391851263,SG -3391851264,3391851519,JP -3391851520,3391852543,AU -3391852544,3391856639,CN -3391856640,3391864831,ID -3391864832,3391866879,TW -3391866880,3391868927,US -3391868928,3391870975,SG -3391870976,3391873023,US -3391873024,3391877119,AU -3391877120,3391879167,JP -3391879168,3391881215,ID -3391881216,3391885311,TH -3391885312,3391889407,CN -3391889408,3391893503,TH -3391893504,3391894527,CN -3391894528,3391895551,TH -3391895552,3391896575,IN -3391896576,3391897599,NZ -3391897600,3391898367,TH -3391898368,3391898623,CN -3391898624,3391900159,TH -3391900160,3391900415,CN -3391900416,3391901695,AU -3391901696,3391905791,PK -3391905792,3391906047,TH -3391906048,3391906303,CN -3391906304,3391906815,AU -3391906816,3391907839,PH -3391907840,3391909887,BD -3391909888,3391910911,IO -3391910912,3391911935,AU -3391911936,3391913983,HK -3391913984,3391914239,TH -3391914240,3391914495,CN -3391914496,3391915007,TH -3391915008,3391915519,CN -3391915520,3391915775,AU -3391915776,3391916287,TH -3391916288,3391916543,VN -3391916544,3391918591,TH -3391918592,3391919103,CN -3391919104,3391920127,TH -3391920128,3391930367,AU -3391930368,3391946751,TH -3391946752,3391947519,CN -3391947520,3391947775,AU -3391947776,3391948287,HK -3391948288,3391948799,IN -3391948800,3391949311,HK -3391949312,3391949823,IN -3391949824,3391950079,JP -3391950080,3391950335,AU -3391950336,3391950591,HK -3391950592,3391954943,CN -3391954944,3391971327,HK -3391971328,3391979519,AU -3391979520,3391979775,HK -3391979776,3391979951,JP -3391979952,3391979955,CN -3391979956,3391979957,JP -3391979958,3391979959,CN -3391979960,3391980031,JP -3391980032,3391980543,HK -3391980544,3391983615,MY -3391983616,3391984639,NP -3391984640,3391984895,HK -3391984896,3391985151,ID -3391985152,3391986687,AU -3391986688,3391987199,PK -3391987200,3391987455,AU -3391987456,3391987711,BD -3391987712,3391991807,JP -3391991808,3392012287,HK -3392012288,3392016383,ID -3392016384,3392017151,CN -3392017152,3392017407,IN -3392017408,3392017919,CN -3392017920,3392018431,IN -3392018432,3392020479,ID -3392020480,3392028671,CN -3392028672,3392040959,ID -3392040960,3392045055,MY -3392045056,3392045311,CN -3392045312,3392046079,ID -3392046080,3392049151,AU -3392049152,3392053247,ID -3392053248,3392057343,AU -3392057344,3392061439,NZ -3392061440,3392069631,IN -3392069632,3392073727,CN -3392073728,3392077823,ID -3392077824,3392079871,AU -3392079872,3392086015,JP -3392086016,3392094207,PK -3392094208,3392098559,ID -3392098560,3392098815,AU -3392098816,3392099327,CN -3392099328,3392100095,AU -3392100096,3392100351,VN -3392100352,3392100607,ID -3392100608,3392100863,SG -3392100864,3392101887,ID -3392101888,3392102143,PK -3392102144,3392102399,AU -3392102400,3392106495,CN -3392106496,3392108543,IN -3392108544,3392109567,AU -3392109824,3392110079,PH -3392110080,3392110335,CN -3392110336,3392110591,IN -3392110592,3392110847,CN -3392110848,3392111103,PH -3392111104,3392111615,CN -3392111616,3392112127,PH -3392112128,3392112639,AU -3392112640,3392113663,JP -3392113664,3392114175,PH -3392114176,3392114431,VN -3392114432,3392114687,KR -3392114688,3392118783,GU -3392118784,3392126975,MY -3392126976,3392127231,ID -3392127232,3392127487,IN -3392127488,3392129023,ID -3392129024,3392129279,IN -3392129280,3392130303,ID -3392130304,3392130815,TW -3392130816,3392132863,ID -3392132864,3392133119,IN -3392133120,3392134655,ID -3392134656,3392134911,IN -3392134912,3392135167,ID -3392135168,3392143359,TH -3392143360,3392208895,JP -3392208896,3392287743,NZ -3392287744,3392288767,NP -3392288768,3392324607,NZ -3392324608,3392325119,AU -3392325120,3392325631,NZ -3392325632,3392326655,ID -3392326656,3392339967,NZ -3392339968,3392340991,NP -3392340992,3392344063,JP -3392344064,3392348159,ID -3392348160,3392354303,JP -3392354304,3392355327,ID -3392355328,3392356351,DE -3392356352,3392364543,NP -3392364544,3392372735,ID -3392372736,3392380927,HK -3392380928,3392385023,AU -3392385024,3392389119,BD -3392389120,3392401407,ID -3392401408,3392403455,SG -3392403456,3392404479,IN -3392404480,3392405503,ID -3392405504,3392406015,NP -3392406016,3392406527,IN -3392406528,3392407551,TH -3392407552,3392409599,ID -3392409600,3392413695,JP -3392413696,3392413951,PK -3392413952,3392414463,CN -3392414464,3392414719,HK -3392414720,3392415231,AU -3392415232,3392415487,JP -3392415488,3392415743,VN -3392415744,3392415999,BD -3392416000,3392416255,AU -3392416256,3392416767,HK -3392416768,3392417023,IN -3392417024,3392417535,AU -3392417536,3392417791,CN -3392417792,3392418559,ID -3392418560,3392418815,SG -3392418816,3392419071,ID -3392419072,3392419327,IN -3392419328,3392419839,PH -3392419840,3392420351,IN -3392420352,3392420863,ID -3392420864,3392421119,AU -3392421120,3392421375,MY -3392421376,3392421887,IN -3392421888,3392438271,SG -3392438272,3392438527,IN -3392438528,3392438783,AU -3392438784,3392439039,IN -3392439040,3392439551,ID -3392439552,3392439807,PG -3392439808,3392440063,IN -3392440064,3392440319,AU -3392440320,3392440575,HK -3392440576,3392440831,ID -3392440832,3392441343,BD -3392441344,3392441855,ID -3392441856,3392442111,AU -3392442112,3392442367,CN -3392442624,3392442879,AU -3392442880,3392443391,ID -3392443392,3392443647,IN -3392443648,3392443903,MY -3392443904,3392444159,IN -3392444160,3392444415,JP -3392444416,3392444671,NZ -3392444672,3392444927,IN -3392444928,3392445183,JP -3392445184,3392445439,NZ -3392445440,3392445695,ID -3392445696,3392445951,NZ -3392445952,3392446463,AU -3392446464,3392450559,PH -3392450560,3392454655,JP -3392454656,3392462847,HK -3392462848,3392472063,NP -3392472064,3392473087,AU -3392473088,3392475135,IN -3392475136,3392479231,JP -3392479232,3392487423,AU -3392487424,3392499711,IN -3392499712,3392503807,JP -3392503808,3392505343,HK -3392505344,3392505855,IN -3392505856,3392506879,HK -3392506880,3392507135,CN -3392507136,3392507647,HK -3392507648,3392507903,CN -3392507904,3392508927,KH -3392508928,3392510975,HK -3392510976,3392511999,MM -3392512000,3392516095,BD -3392516096,3392519167,AU -3392519168,3392519679,NZ -3392519680,3392524287,AU -3392524288,3392528383,JP -3392528384,3392536575,ID -3392536576,3392602111,IN -3392602112,3392618495,HK -3392618496,3392626687,SG -3392626688,3392630783,NZ -3392630784,3392634879,JP -3392634880,3392635903,PK -3392635904,3392636927,VN -3392636928,3392637951,JP -3392637952,3392638975,TH -3392638976,3392643071,AU -3392643072,3392647167,ID -3392647168,3392651263,MN -3392651264,3392659455,JP -3392659456,3392667647,TW -3392667648,3392668671,IN -3392668672,3392669695,BD -3392669696,3392671743,HK -3392671744,3392675839,JP -3392675840,3392681983,NZ -3392681984,3392682239,SG -3392682240,3392682495,VN -3392682496,3392683007,IN -3392683008,3392683519,AU -3392683520,3392684031,NL -3392684032,3392688127,JP -3392688128,3392692223,MY -3392692224,3392700415,IN -3392700416,3392708607,SG -3392708608,3392712703,ID -3392712704,3392716799,AF -3392716800,3392733183,IN -3392733184,3392741375,ID -3392741376,3392765951,PH -3392765952,3392782335,TH -3392782336,3392786431,CN -3392786432,3392787455,NL -3392787456,3392789503,CN -3392789504,3392790527,HK -3392790528,3392794623,JP -3392794624,3392798975,CN -3392798976,3392799231,JP -3392799232,3392799487,PH -3392799488,3392799743,AU -3392799744,3392800767,JP -3392800768,3392802815,SG -3392802816,3392803839,JP -3392803840,3392806911,HK -3392806912,3392815103,AU -3392815104,3392819199,ID -3392819200,3392823295,MY -3392823296,3392824319,KH -3392824320,3392824575,AU -3392824832,3392825343,IN -3392825344,3392826367,CN -3392826368,3392827391,BD -3392827392,3392828415,CN -3392828416,3392829439,JP -3392829440,3392830463,IN -3392830464,3392830719,ID -3392830720,3392830975,IN -3392830976,3392831231,TH -3392831232,3392831487,IN -3392831488,3392832511,PG -3392832512,3392833535,IN -3392833536,3392835583,AU -3392835584,3392839679,JP -3392839680,3392845823,ID -3392845824,3392847871,HK -3392847872,3392856063,ID -3392856064,3392857087,AU -3392857088,3392857343,IN -3392857344,3392858111,AU -3392858112,3392858367,IN -3392858368,3392858623,AU -3392858624,3392858879,JP -3392858880,3392859135,AU -3392859136,3392859647,PH -3392859648,3392860159,ID -3392860160,3392860671,AU -3392860672,3392861183,ID -3392861184,3392861439,TH -3392861440,3392861695,VN -3392861696,3392862207,AU -3392862208,3392863231,KI -3392863232,3392864255,BD -3392864256,3392864767,CN -3392864768,3392865279,IN -3392865280,3392866303,NU -3392866304,3392867327,MY -3392867328,3392868351,PK -3392868352,3392880639,AU -3392880640,3392888831,PK -3392888832,3392892927,AU -3392892928,3392897023,JP -3392897024,3392901119,BD -3392901120,3392903167,JP -3392903168,3392905215,HK -3392905216,3392909311,ID -3392909312,3392913407,JP -3392913408,3392917503,ID -3392917504,3392918527,BD -3392918528,3392919551,CN -3392919552,3392921599,KR -3392921600,3392921855,NZ -3392921856,3392922623,AU -3392922624,3392922879,IN -3392922880,3392923135,AU -3392923136,3392923391,BN -3392923392,3392923647,IN -3392923648,3392924159,HK -3392924160,3392924671,JP -3392924672,3392924927,CN -3392924928,3392925183,AU -3392925184,3392925695,VN -3392925696,3392925951,CN -3392925952,3392926719,AU -3392926720,3392927231,IN -3392927232,3392927743,AU -3392927744,3392927999,IN -3392928256,3392928767,TW -3392928768,3392929279,VN -3392929280,3392929535,PK -3392929536,3392929791,ID -3392929792,3392931839,MU -3392931840,3392933887,PH -3392933888,3392942079,JP -3392942080,3392944127,CN -3392944128,3392945151,MY -3392945152,3392946175,IN -3392946176,3392954367,AU -3392954368,3392956415,CN -3392956416,3392958463,VN -3392958464,3392962559,CN -3392962560,3392963583,IN -3392963584,3392970751,CN -3392970752,3392978943,JP -3392978944,3392983039,TH -3392983040,3392987135,IN -3392987136,3392995327,HK -3392995328,3392995583,PG -3392995584,3392995839,JP -3392995840,3392996351,NZ -3392996352,3392997375,AU -3392997376,3392998399,IN -3392998400,3392999423,AU -3392999424,3393003519,JP -3393003520,3393011711,PK -3393011712,3393012735,PH -3393012736,3393013759,CN -3393013760,3393014783,AU -3393014784,3393015807,CN -3393015808,3393016831,IN -3393016832,3393017855,HK -3393017856,3393018879,CN -3393018880,3393019903,AU -3393019904,3393021439,ID -3393021440,3393021695,IN -3393021696,3393021951,HK -3393021952,3393022463,ID -3393022464,3393022975,VU -3393023232,3393023487,AU -3393023488,3393023743,SG -3393024000,3393024511,ID -3393024512,3393025023,NZ -3393025024,3393025279,AU -3393025280,3393025535,IN -3393025536,3393025791,PH -3393025792,3393026047,AU -3393026048,3393026559,IN -3393026560,3393026815,AU -3393026816,3393027071,CN -3393027072,3393027839,ID -3393027840,3393028095,CN -3393028096,3393060863,AU -3393060864,3393062911,FJ -3393062912,3393069055,ID -3393069056,3393077247,KH -3393077248,3393085439,IN -3393085440,3393089535,LA -3393089536,3393090559,CN -3393090560,3393091071,IN -3393091072,3393093631,FJ -3393093632,3393101823,AU -3393101824,3393110015,JP -3393110016,3393118207,HK -3393118208,3393122303,IN -3393122304,3393123327,AU -3393123328,3393123583,IN -3393123584,3393123839,NZ -3393123840,3393124351,IN -3393124352,3393125631,CN -3393125632,3393125887,JP -3393125888,3393126143,AU -3393126144,3393126399,CN -3393126400,3393134591,HK -3393134592,3393146879,AU -3393146880,3393150975,CN -3393150976,3393159167,IN -3393159168,3393167359,SG -3393167360,3393175551,CN -3393175552,3393183743,PK -3393183744,3393184255,SG -3393184256,3393184767,PK -3393184768,3393187839,SG -3393187840,3393189887,NP -3393189888,3393190911,CN -3393190912,3393191167,IN -3393191168,3393191423,CN -3393191424,3393191935,SB -3393191936,3393198335,HK -3393198336,3393198591,JP -3393198592,3393206271,HK -3393206272,3393206527,JP -3393206528,3393208063,HK -3393208064,3393208831,JP -3393208832,3393214207,HK -3393214208,3393214463,JP -3393214464,3393217535,HK -3393217536,3393217791,JP -3393217792,3393218047,HK -3393218048,3393218559,JP -3393218560,3393219839,HK -3393219840,3393220607,JP -3393220608,3393222911,HK -3393222912,3393223167,JP -3393223168,3393224703,HK -3393224704,3393224959,JP -3393224960,3393225471,HK -3393225472,3393225617,JP -3393225618,3393225618,HK -3393225619,3393225727,JP -3393225728,3393227007,HK -3393227008,3393227263,JP -3393227264,3393227519,HK -3393227520,3393227775,JP -3393227776,3393231871,HK -3393231872,3393232127,JP -3393232128,3393236479,HK -3393236480,3393236735,JP -3393236736,3393237759,HK -3393237760,3393238015,JP -3393238016,3393241087,HK -3393241088,3393241343,JP -3393241344,3393245695,HK -3393245696,3393245951,JP -3393245952,3393251839,HK -3393251840,3393252095,JP -3393252096,3393253375,HK -3393253376,3393253631,JP -3393253632,3393257471,HK -3393257472,3393260031,CN -3393260032,3393260543,BD -3393260544,3393265663,AU -3393265664,3393273855,CK -3393273856,3393282047,AU -3393282048,3393286143,CN -3393286144,3393290239,ID -3393290240,3393298431,IN -3393298432,3393300479,NZ -3393300480,3393302527,BD -3393302528,3393306623,PH -3393306624,3393314815,HK -3393314816,3393318911,ID -3393318912,3393320959,SG -3393320960,3393359840,HK -3393359841,3393359841,CN -3393359842,3393363967,HK -3393363968,3393364991,AU -3393364992,3393366015,IN -3393366016,3393367039,CN -3393367040,3393372159,IN -3393372160,3393374975,HK -3393374976,3393375743,SG -3393375744,3393375999,HK -3393376000,3393376255,TW -3393376256,3393388543,HK -3393388544,3393389567,CN -3393389568,3393390591,IN -3393390592,3393392639,ID -3393392640,3393396735,JP -3393396736,3393400831,ID -3393400832,3393404927,JP -3393404928,3393421311,AU -3393421312,3393470463,HK -3393470464,3393474559,AU -3393474560,3393478655,NZ -3393478656,3393486847,AU -3393486848,3393495039,IN -3393495040,3393499135,AU -3393499136,3393503231,SG -3393503232,3393507327,HK -3393507328,3393511423,SG -3393511424,3393519615,KR -3393519616,3393520639,HK -3393520640,3393521663,CN -3393521664,3393523711,PK -3393523712,3393527807,CN -3393527808,3393535999,PK -3393536000,3393544191,HK -3393544192,3393548287,ID -3393548288,3393552383,JP -3393552384,3393553407,HK -3393553408,3393554431,AU -3393554432,3393556479,TH -3393556480,3393560575,SG -3393560576,3393568767,PH -3393568768,3393572863,LK -3393572864,3393576959,AU -3393576960,3393581055,JP -3393581056,3393585151,HK -3393585152,3393593343,CN -3393593344,3393597439,MN -3393597440,3393601535,ID -3393601536,3393609727,NP -3393609728,3393613823,CN -3393613824,3393617919,AS -3393617920,3393618431,AU -3393618432,3393618687,NZ -3393618688,3393618943,IN -3393618944,3393620223,ID -3393620224,3393620479,AU -3393620480,3393620735,ID -3393620736,3393620991,AU -3393620992,3393621247,JP -3393621248,3393622015,AU -3393622016,3393626111,PK -3393626112,3393629523,HK -3393629524,3393629525,MO -3393629526,3393630207,HK -3393630208,3393634303,JP -3393634304,3393638399,CN -3393638400,3393650687,JP -3393650688,3393658879,IN -3393658880,3393662975,CN -3393662976,3393675263,JP -3393675264,3393679359,MY -3393679360,3393683455,TH -3393683456,3393691647,IN -3393691648,3393695743,AU -3393695744,3393699839,PH -3393699840,3393717759,HK -3393717760,3393718015,US -3393718016,3393724415,HK -3393724416,3393726463,AU -3393726464,3393728511,CN -3393728512,3393736703,JP -3393736704,3393740799,CN -3393740800,3393741567,US -3393741568,3393741823,MG -3393741824,3393742847,US -3393742848,3393743871,TL -3393743872,3393744895,US -3393744896,3393748991,CN -3393748992,3393765375,AU -3393765376,3393773567,ID -3393773568,3393774591,IN -3393774592,3393775615,HK -3393775616,3393777663,BD -3393777664,3393779711,MN -3393779712,3393780735,IN -3393780736,3393782783,HK -3393782784,3393783807,BD -3393783808,3393785855,MY -3393785856,3393789951,ID -3393789952,3393798143,SG -3393798144,3393806335,JP -3393806336,3393814527,ID -3393814528,3393815551,CN -3393815552,3393816575,KR -3393816576,3393818623,JP -3393818624,3393822719,AU -3393822720,3393830911,PH -3393830912,3393835007,NZ -3393835008,3393839103,JP -3393839104,3393843199,ID -3393843200,3393847295,CN -3393847296,3393848319,HK -3393848320,3393849343,JP -3393849344,3393851391,CN -3393851392,3393855487,JP -3393855488,3393855743,AU -3393855744,3393855999,NZ -3393856000,3393856255,AU -3393856256,3393856511,HK -3393856512,3393856767,CN -3393856768,3393857023,SG -3393857024,3393857535,NZ -3393857536,3393858047,HK -3393858048,3393858303,CN -3393858304,3393858559,ID -3393858560,3393858815,AU -3393858816,3393859071,ID -3393859072,3393859327,AU -3393859328,3393859583,JP -3393859840,3393860095,AU -3393860096,3393860607,HK -3393860608,3393860863,CN -3393860864,3393861375,IN -3393861376,3393861631,US -3393861632,3393861887,VN -3393861888,3393862143,AU -3393862144,3393862655,VN -3393862656,3393862911,NZ -3393862912,3393863167,AU -3393863168,3393863679,SG -3393863680,3393865727,AU -3393865728,3393867775,ID -3393867776,3393871871,CN -3393871872,3393872127,HK -3393872128,3393872383,JP -3393872384,3393872655,HK -3393872656,3393872656,IN -3393872657,3393874943,HK -3393874944,3393875967,AU -3393875968,3393876991,HK -3393876992,3393878015,SG -3393878016,3393879039,IN -3393879040,3393880063,HK -3393880064,3393896447,AU -3393896448,3393906687,NZ -3393906688,3393907711,CN -3393907712,3393908735,ID -3393908736,3393910783,BD -3393910784,3393911807,PH -3393911808,3393912063,AU -3393912064,3393912319,JP -3393912320,3393912831,CN -3393912832,3393913855,HK -3393913856,3393914879,MY -3393914880,3393916927,JP -3393916928,3393921023,ID -3393921024,3393929215,MY -3393929216,3393937407,HK -3393937408,3393941503,ID -3393941504,3393945599,JP -3393945600,3393961983,MY -3393961984,3393966079,IN -3393966080,3393970175,CN -3393970176,3393974271,JP -3393974272,3393976319,SG -3393976320,3393977343,MO -3393977344,3393978367,CN -3393978368,3393995263,HK -3393995264,3393995264,ZA -3393995265,3393995775,HK -3393995776,3393996031,DE -3393996032,3393999615,HK -3393999616,3393999871,JP -3393999872,3394000127,HK -3394000128,3394000383,SG -3394000384,3394000639,TW -3394000640,3394005759,HK -3394005760,3394006015,US -3394006016,3394011135,HK -3394011136,3394027519,AU -3394027520,3394035711,JP -3394035712,3394039807,MY -3394039808,3394040575,SG -3394040576,3394040831,IN -3394040832,3394041087,SG -3394041088,3394041343,MY -3394041344,3394041855,SG -3394041856,3394042879,AU -3394042880,3394043903,CN -3394043904,3394060287,HK -3394060288,3394064383,ID -3394064384,3394066431,CN -3394066432,3394067455,AU -3394067456,3394068479,CN -3394068480,3394076671,ID -3394076672,3394078719,HK -3394078720,3394078975,AU -3394078976,3394079231,IN -3394079232,3394079743,PH -3394079744,3394087471,HK -3394087472,3394087487,CN -3394087488,3394111487,HK -3394111488,3394113535,CN -3394113536,3394116095,SG -3394116096,3394116607,AU -3394116608,3394117631,SG -3394117632,3394121727,AU -3394121728,3394125823,SG -3394125824,3394142207,PH -3394142208,3394150399,NZ -3394150400,3394154495,IN -3394154496,3394158591,JP -3394158592,3394162687,ID -3394162688,3394166783,JP -3394166784,3394168831,VN -3394168832,3394170879,IN -3394170880,3394172927,NZ -3394172928,3394173695,JP -3394173696,3394173951,IN -3394173952,3394174975,HK -3394174976,3394179071,JP -3394179072,3394181119,BD -3394181120,3394183167,KH -3394183168,3394191359,NP -3394191360,3394207743,SG -3394207744,3394215935,JP -3394215936,3394220031,AU -3394220032,3394232319,SG -3394232320,3394234367,CN -3394234368,3394236415,VN -3394236416,3394238463,JP -3394238464,3394239487,CN -3394239488,3394244095,HK -3394244096,3394244607,TW -3394244608,3394248703,HK -3394248704,3394252799,VU -3394252800,3394256895,IN -3394256896,3394265087,AU -3394265088,3394267135,JP -3394267136,3394269183,TW -3394269184,3394273279,ID -3394273280,3394277375,HK -3394277376,3394279423,AU -3394279424,3394281471,PH -3394281472,3394285567,SG -3394285568,3394289663,AU -3394289664,3394293759,CN -3394293760,3394297855,ID -3394297856,3394306047,TH -3394306048,3394307071,CN -3394307072,3394308095,AU -3394308096,3394310143,JP -3394310144,3394314239,AU -3394314240,3394322431,ID -3394322432,3394326527,AU -3394326528,3394330623,JP -3394330624,3394338815,AU -3394338816,3394347007,IN -3394347008,3394351103,PH -3394351104,3394355199,CN -3394355200,3394359295,IN -3394359296,3394363391,AU -3394363392,3394441215,HK -3394441216,3394453503,IN -3394453504,3394461695,AU -3394461696,3394465791,SG -3394465792,3394467839,AU -3394467840,3394468863,ID -3394468864,3394469887,BD -3394469888,3394478079,JP -3394478080,3394482175,PK -3394482176,3394484223,AU -3394484224,3394486271,JP -3394486272,3394494463,HK -3394494464,3394498559,JP -3394498560,3394500607,HK -3394500608,3394501631,SG -3394501632,3394502655,CN -3394502656,3394503679,HK -3394503680,3394507263,CN -3394507264,3394507775,JP -3394507776,3394508287,AU -3394508288,3394508543,CN -3394508544,3394508799,PH -3394508800,3394510847,CN -3394510848,3394514943,BD -3394514944,3394519039,JP -3394519040,3394521087,BD -3394521088,3394523135,KH -3394523136,3394527231,JP -3394527232,3394535423,PH -3394535424,3394621439,HK -3394621440,3394625535,CN -3394625536,3394629631,HK -3394629632,3394631679,AU -3394631680,3394634751,HK -3394634752,3394635775,AU -3394635776,3394637823,KR -3394637824,3394641919,AF -3394641920,3394648063,AU -3394648064,3394650111,JP -3394650112,3394658303,HK -3394658304,3394662399,NZ -3394662400,3394664447,AU -3394664448,3394666495,JP -3394666496,3394682879,MO -3394682880,3394686975,PH -3394686976,3394689023,AU -3394689024,3394691071,BD -3394691072,3394697215,JP -3394697216,3394697471,SG -3394697472,3394697727,CN -3394697728,3394697983,AU -3394697984,3394698239,IN -3394698240,3394699263,CN -3394699264,3394700287,HK -3394700288,3394707455,AU -3394707456,3394715647,IN -3394715648,3394719743,JP -3394719744,3394723839,CN -3394723840,3394732031,MY -3394732032,3394740223,NC -3394740224,3394744319,AU -3394744320,3394752511,ID -3394752512,3394753535,WS -3394753536,3394754559,VN -3394754560,3394756607,MY -3394756608,3394760703,JP -3394760704,3394764799,ID -3394764800,3394765311,HK -3394765312,3394765567,JP -3394765568,3394765823,DE -3394765824,3394766335,HK -3394766336,3394766591,US -3394766592,3394768639,HK -3394768640,3394768895,US -3394768896,3394769151,HK -3394769152,3394769407,SG -3394769408,3394769919,HK -3394769920,3394770431,TW -3394770432,3394770687,HK -3394770688,3394770943,SG -3394770944,3394771711,HK -3394771712,3394771967,TW -3394771968,3394772991,HK -3394772992,3394774015,CN -3394774016,3394775039,HK -3394775040,3394776063,BD -3394776064,3394777087,NZ -3394777088,3394781183,JP -3394781184,3394789375,MP -3394789376,3394791167,HK -3394791168,3394792959,US -3394792960,3394793215,HK -3394793216,3394793216,ZA -3394793217,3394796287,HK -3394796288,3394796288,ZA -3394796289,3394797567,HK -3394797568,3394813951,IN -3394813952,3394815999,JP -3394816000,3394818047,HK -3394818048,3394830335,IN -3394830336,3394831359,HK -3394831360,3394832383,NZ -3394832384,3394834431,CN -3394834432,3394834559,HK -3394834560,3394834575,JP -3394834576,3394834591,SG -3394834592,3394834599,JP -3394834600,3394834607,SG -3394834608,3394834687,HK -3394834688,3394834943,JP -3394834944,3394834959,HK -3394834960,3394834975,JP -3394834976,3394834983,HK -3394834984,3394834991,SG -3394834992,3394835055,HK -3394835056,3394835071,SG -3394835072,3394835199,HK -3394835200,3394835455,JP -3394835456,3394835583,SG -3394835584,3394835711,JP -3394835712,3394835967,CN -3394835968,3394836239,JP -3394836240,3394836247,AS -3394836248,3394836415,JP -3394836416,3394836479,HK -3394836480,3394838527,BT -3394838528,3394846719,NZ -3394846720,3394850815,IN -3394850816,3394854911,JP -3394854912,3394855935,CN -3394855936,3394856959,AU -3394856960,3394857983,IN -3394857984,3394859007,CN -3394859008,3394860031,JP -3394860032,3394860543,ID -3394860544,3394860799,IN -3394860800,3394861055,CN -3394861056,3394861311,IN -3394861312,3394862079,HK -3394862080,3394863103,KR -3394863104,3394871295,NZ -3394871296,3394879487,AU -3394879488,3394883583,PH -3394883584,3394887679,ID -3394887680,3394889727,JP -3394889728,3394891775,CN -3394891776,3394893823,JP -3394893824,3394894847,KR -3394894848,3394895871,HK -3394895872,3394896895,CN -3394896896,3394897919,TH -3394897920,3394899967,JP -3394899968,3394904063,CN -3394904064,3394904319,AU -3394904320,3394904575,IN -3394904576,3394905087,AU -3394905088,3394905343,BN -3394905344,3394905599,CN -3394905600,3394906111,AU -3394906112,3394906367,IN -3394906368,3394906623,AU -3394906624,3394907135,IN -3394907136,3394908159,NZ -3394908160,3394910207,AU -3394910208,3394912255,NZ -3394912256,3394920447,PF -3394920448,3394928639,CN -3394928640,3394936831,PH -3394936832,3394940927,AU -3394940928,3394945023,JP -3394945024,3394945279,IN -3394945280,3394945535,CN -3394945536,3394946047,ID -3394946048,3394946303,CN -3394946304,3394946559,AU -3394946560,3394947071,ID -3394947072,3394948095,BD -3394948096,3394948351,IN -3394948352,3394948607,CN -3394948608,3394949119,AU -3394949120,3394953215,JP -3394953216,3394957311,CN -3394957312,3394959359,AU -3394959360,3394960383,HK -3394960384,3394961407,KR -3394961408,3394962431,CN -3394962432,3394963455,AU -3394963456,3394965503,ID -3394965504,3394967551,TH -3394967552,3394969599,ID -3394969600,3394970623,US -3394970624,3394971647,CN -3394971648,3394972671,BD -3394972672,3394973695,AU -3394973696,3394977791,JP -3394977792,3394985983,IN -3394985984,3394990079,CN -3394990080,3394994175,JP -3394994176,3394995199,CN -3394995200,3394998271,IN -3394998272,3395002367,JP -3395002368,3395006463,PH -3395006464,3395010559,CN -3395010560,3395014655,AU -3395014656,3395018751,JP -3395018752,3395027967,CN -3395027968,3395028991,VN -3395028992,3395031039,CN -3395031040,3395035135,PK -3395035136,3395039231,AU -3395039232,3395043327,CN -3395043328,3395059711,AU -3395059712,3395067903,PH -3395067904,3395076095,HK -3395076096,3395080191,ID -3395080192,3395082239,AU -3395082240,3395084287,NZ -3395084288,3395088383,IN -3395088384,3395091455,AU -3395091456,3395093503,CN -3395093504,3395094015,AU -3395094016,3395094527,KR -3395094528,3395096575,KH -3395096576,3395104767,ID -3395104768,3395108863,TH -3395108864,3395117055,JP -3395117056,3395121151,AU -3395121152,3395129343,ID -3395129344,3395131391,JP -3395131392,3395131647,AU -3395131648,3395131903,KH -3395131904,3395132159,IN -3395132160,3395132415,AU -3395132416,3395133439,VN -3395133440,3395141631,AU -3395141632,3395145727,HK -3395145728,3395149823,BN -3395149824,3395155967,ID -3395155968,3395156991,AU -3395156992,3395158015,CN -3395166208,3395170303,AU -3395170304,3395174399,JP -3395174400,3395174911,AU -3395174912,3395175167,NP -3395175168,3395175423,IN -3395175680,3395175935,AU -3395175936,3395176191,SG -3395176192,3395176703,AU -3395176704,3395176959,TH -3395176960,3395177215,CN -3395177216,3395177471,HK -3395177472,3395177983,TH -3395177984,3395178495,AU -3395178496,3395178751,ID -3395178752,3395179007,CN -3395179008,3395179263,VN -3395179264,3395180031,ID -3395180032,3395180287,JP -3395180288,3395180543,HK -3395180544,3395181055,VN -3395181056,3395181567,TH -3395181568,3395182591,CN -3395182592,3395190783,SG -3395190784,3395198975,JP -3395198976,3395199999,IN -3395200000,3395200511,BD -3395200512,3395200767,TH -3395200768,3395201023,MY -3395201024,3395202047,TH -3395202048,3395203071,IN -3395203072,3395215359,JP -3395215360,3395219455,HK -3395219456,3395223551,TH -3395223552,3395231743,CN -3395231744,3395239935,JP -3395239936,3395254783,SG -3395254784,3395255039,IN -3395255040,3395256319,SG -3395256320,3395264511,ID -3395264512,3395272703,JP -3395272704,3395276799,PG -3395276800,3395280895,JP -3395280896,3395284991,PH -3395284992,3395287039,CN -3395287040,3395287551,JP -3395287552,3395287807,NZ -3395287808,3395288063,IN -3395288064,3396995071,CN -3396995072,3396997119,ID -3396997120,3396999167,IN -3396999168,3397001215,JP -3397001216,3397003263,CN -3397003264,3397005311,TH -3397005312,3397009407,JP -3397009408,3397017599,CN -3397017600,3397021695,HK -3397021696,3397026047,CN -3397026048,3397026303,AU -3397026304,3397026815,TH -3397026816,3397027071,CN -3397027072,3397027327,PH -3397027328,3397027839,IN -3397027840,3397029887,JP -3397029888,3397033983,MY -3397033984,3397038079,ID -3397038080,3397058559,JP -3397058560,3397066751,MU -3397066752,3397070847,IN -3397070848,3397074943,PH -3397074944,3397083135,HK -3397083136,3397087231,CN -3397087232,3397088255,HK -3397088256,3397090303,CN -3397090304,3397091327,TW -3397091328,3397093887,MP -3397093888,3397094399,GU -3397094400,3397097471,MP -3397097472,3397099519,GU -3397099520,3397103615,HK -3397103616,3397105663,LA -3397105664,3397107711,JP -3397107712,3397115903,HK -3397115904,3397119999,ID -3397120000,3397124095,PK -3397124096,3397128191,JP -3397128192,3397131263,CN -3397131264,3397132287,HK -3397132288,3397136383,AU -3397136384,3397140479,JP -3397140480,3397148671,AU -3397148672,3397156863,NZ -3397156864,3397165055,PH -3397165056,3397173247,LK -3397173248,3397173503,AU -3397173504,3397173759,PH -3397173760,3397174015,IN -3397174016,3397174271,AU -3397174272,3397175295,ID -3397175296,3397175807,AU -3397175808,3397176063,IN -3397176064,3397176319,ID -3397176320,3397176575,VN -3397176576,3397176831,ID -3397176832,3397177343,AU -3397177344,3397181439,JP -3397181440,3397185535,PW -3397185536,3397187583,AU -3397187584,3397188607,HK -3397188608,3397189631,PH -3397189632,3397201919,AU -3397201920,3397206015,JP -3397206016,3397210111,BD -3397210112,3397211135,ID -3397211136,3397212159,AU -3397212160,3397212671,ID -3397212672,3397213183,HK -3397213184,3397213439,IN -3397213440,3397213695,AU -3397213696,3397214207,ID -3397214208,3397215231,AU -3397215232,3397215743,ID -3397215744,3397216255,PH -3397216256,3397216767,AU -3397216768,3397217023,IN -3397217024,3397217279,SG -3397217280,3397217535,BD -3397217536,3397217791,CN -3397217792,3397218047,NZ -3397218048,3397218303,AU -3397218304,3397222399,CN -3397222400,3397230591,PK -3397230592,3397234687,AU -3397234688,3397238783,CN -3397238784,3397255167,HK -3397255168,3397263359,JP -3397263360,3397267455,PH -3397267456,3397271551,HK -3397271552,3397275647,TW -3397275648,3397277695,NZ -3397277696,3397279743,MN -3397279744,3397283839,AU -3397283840,3397285887,KR -3397285888,3397287935,BD -3397287936,3397299359,SG -3397299360,3397299375,IN -3397299376,3397304319,SG -3397304320,3397308415,NZ -3397308416,3397312511,HK -3397312512,3397320703,JP -3397320704,3397322751,CN -3397322752,3397323775,NZ -3397323776,3397328895,CN -3397328896,3397330943,ID -3397330944,3397337087,CN -3397337088,3397338039,HK -3397338040,3397338043,SG -3397338044,3397338375,HK -3397338376,3397338379,JP -3397338380,3397338403,HK -3397338404,3397338415,JP -3397338416,3397338423,HK -3397338424,3397338427,JP -3397338428,3397338455,HK -3397338456,3397338457,JP -3397338458,3397338459,HK -3397338460,3397338463,JP -3397338464,3397339647,HK -3397339648,3397339687,SG -3397339688,3397340927,HK -3397340928,3397341183,TH -3397341184,3397345279,JP -3397345280,3397349375,ID -3397349376,3397363711,CN -3397363712,3397365759,HK -3397365760,3397369855,JP -3397369856,3397374463,CN -3397374464,3397374975,AU -3397374976,3397386239,CN -3397386240,3397394431,GU -3397394432,3397402623,PH -3397402624,3397410815,GU -3397410816,3397411327,AU -3397411328,3397411583,SG -3397411584,3397411839,HK -3397411840,3397412351,KR -3397412352,3397412863,AU -3397412864,3397413375,HK -3397413376,3397413631,AU -3397413632,3397413887,IN -3397413888,3397414399,SC -3397414400,3397414911,IN -3397414912,3397419007,AU -3397419008,3397419583,HK -3397419584,3397419599,KR -3397419600,3397419607,HK -3397419608,3397419615,KR -3397419616,3397419647,HK -3397419648,3397419671,KR -3397419672,3397419711,HK -3397419712,3397419719,KR -3397419720,3397427199,HK -3397427200,3397443583,SG -3397443584,3397451775,HK -3397451776,3397468159,TH -3397468160,3397492735,AU -3397492736,3397496831,MY -3397496832,3397498879,JP -3397498880,3397500927,ID -3397500928,3397501951,BD -3397501952,3397503999,IN -3397504000,3397505023,TH -3397505024,3397505279,CN -3397505280,3397506559,IN -3397506560,3397506815,AU -3397506816,3397507071,IN -3397507072,3397507583,ID -3397507584,3397507839,AU -3397507840,3397508095,IN -3397508096,3397509119,PH -3397509120,3397510143,ID -3397510144,3397511167,FJ -3397511168,3397512191,LK -3397512192,3397512447,KH -3397512448,3397512703,AU -3397512704,3397512959,PH -3397512960,3397513727,IN -3397513728,3397514239,SG -3397514240,3397515263,AU -3397515264,3397516287,NP -3397516288,3397516543,AU -3397516544,3397516799,NZ -3397516800,3397517055,JP -3397517056,3397517311,AU -3397517312,3397525503,CN -3397525504,3397526527,AU -3397526528,3397527039,VN -3397527040,3397527295,AU -3397527296,3397527551,CN -3397527552,3397528575,IN -3397528576,3397530623,AU -3397530624,3397531647,ID -3397531648,3397532671,SG -3397532672,3397533695,JP -3397533696,3397566463,HK -3397566464,3397574655,AU -3397574656,3397582847,CN -3397582848,3397584895,MN -3397584896,3397586943,JP -3397586944,3397588991,CN -3397588992,3397591039,KR -3397591040,3397595135,HK -3397595136,3397599231,CN -3397599232,3397603327,HK -3397603328,3397605375,KH -3397605376,3397607423,AU -3397607424,3397623807,IN -3397623808,3397631999,GU -3397632000,3397636095,JP -3397636096,3397640191,CN -3397640192,3397648383,MN -3397648384,3397713919,TW -3397713920,3397715967,ID -3397715968,3397718015,HK -3397718016,3397722111,KR -3397722112,3397726207,CN -3397726208,3397734399,IN -3397734400,3397735423,MY -3397735424,3397736447,MM -3397736448,3397737471,BD -3397737472,3397738495,IN -3397738496,3397742591,MY -3397742592,3397746687,JP -3397746688,3397763071,TH -3397763072,3397771263,SG -3397771264,3397779455,TW -3397779456,3397781503,ID -3397781504,3397783551,BD -3397783552,3397785599,VN -3397785600,3397787647,TO -3397787648,3397791743,AU -3397791744,3397791999,NZ -3397792000,3397792767,AU -3397792768,3397793023,IN -3397793024,3397793279,NZ -3397793280,3397793535,VN -3397793536,3397793791,AU -3397793792,3397794303,PH -3397794304,3397794559,CN -3397794560,3397794815,IN -3397794816,3397812223,HK -3397812224,3397816319,CN -3397816320,3397832703,IN -3397832704,3397836799,CN -3397836800,3397844991,AU -3397844992,3397845247,JP -3397845248,3397845503,AU -3397845504,3397846015,JP -3397846016,3397846271,AU -3397846272,3397848063,JP -3397848064,3397849087,SG -3397849088,3397857791,JP -3397857792,3397858559,AU -3397858560,3397869823,JP -3397869824,3397870079,AU -3397870080,3397871871,JP -3397871872,3397872127,AU -3397872128,3397887999,JP -3397888000,3397889023,IN -3397889024,3397895423,JP -3397895424,3397895679,AU -3397895680,3397906111,JP -3397906112,3397906175,IN -3397906176,3397907455,JP -3397907456,3397908479,HK -3397908480,3397910527,JP -3397910528,3397918719,SG -3397918720,3397922815,AU -3397922816,3397926911,CN -3397926912,3397933055,IN -3397933056,3397934079,BD -3397934080,3397935103,PH -3397935104,3397939199,AU -3397939200,3397951487,KR -3397951488,3397959679,SG -3397959680,3397963775,JP -3397963776,3397971967,CN -3397971968,3397974015,LA -3397974016,3397975039,CN -3397975040,3397976063,AU -3397976064,3397984255,ID -3397984256,3397992447,JP -3397992448,3398004735,AU -3398004736,3398008831,PH -3398008832,3398017023,LA -3398017024,3398021119,AU -3398021120,3398023167,FJ -3398023168,3398025215,JP -3398025216,3398029311,AU -3398029312,3398033407,IN -3398033408,3398033663,NZ -3398033664,3398033919,ID -3398033920,3398034943,IN -3398034944,3398035199,ID -3398035200,3398035455,CN -3398035456,3398037503,IN -3398037504,3398039551,NZ -3398039552,3398040575,IN -3398040576,3398041599,MY -3398041600,3398062079,AU -3398062080,3398066175,JP -3398066176,3398074367,IN -3398074368,3398090751,PH -3398090752,3398098943,AU -3398098944,3398107135,ID -3398107136,3398107586,AU -3398107587,3398107587,US -3398107588,3398156287,AU -3398156288,3398164479,TH -3398164480,3398172671,AU -3398172672,3398180863,JP -3398180864,3398189055,IN -3398189056,3398205439,HK -3398205440,3398208511,IN -3398208512,3398213631,CN -3398213632,3398221823,TW -3398221824,3398230015,JP -3398230016,3398238207,HK -3398238208,3398279167,IN -3398279168,3398287359,CN -3398287360,3398291455,JP -3398291456,3398295551,AU -3398295552,3398303743,PK -3398303744,3398305791,IN -3398305792,3398307839,JP -3398307840,3398311935,CN -3398311936,3398320127,AU -3398320128,3398336511,IN -3398336512,3398340607,AU -3398340608,3398352895,PK -3398352896,3398361087,TH -3398361088,3398369279,JP -3398369280,3398369791,IN -3398369792,3398370303,JP -3398370304,3398371327,CN -3398371328,3398373375,JP -3398373376,3398381567,CN -3398381568,3398383615,AU -3398383616,3398385663,CN -3398385664,3398393855,JP -3398393856,3398394879,IN -3398394880,3398396927,CN -3398396928,3398397951,VN -3398397952,3398402047,PK -3398402048,3398418431,TH -3398418432,3398434815,JP -3398434816,3398467583,IN -3398467584,3398475775,BT -3398475776,3398481919,AU -3398481920,3398483967,LA -3398483968,3398484735,US -3398484736,3398484991,MY -3398484992,3398485247,AQ -3398485248,3398485503,CN -3398485504,3398485759,US -3398485760,3398486015,AQ -3398486016,3398487039,BD -3398487040,3398488063,NZ -3398488064,3398492159,TW -3398492160,3398500351,JP -3398500352,3398504447,ID -3398504448,3398508543,JP -3398508544,3398565887,TW -3398565888,3398567423,ID -3398567424,3398569983,AU -3398569984,3398572031,JP -3398572032,3398574079,AU -3398574080,3398582271,ID -3398582272,3398590463,MY -3398590464,3398598655,HK -3398598656,3398606847,ID -3398606848,3398610943,CN -3398610944,3398612991,ID -3398612992,3398613503,PH -3398613504,3398613759,CN -3398613760,3398614015,AU -3398614016,3398615039,CN -3398615040,3398616063,IN -3398616064,3398619135,CN -3398619136,3398621183,AU -3398621184,3398623231,HK -3398623232,3398631423,ID -3398631424,3398634439,JP -3398634440,3398634447,KR -3398634448,3398636543,JP -3398636544,3398636575,HK -3398636576,3398637119,JP -3398637120,3398637183,HK -3398637184,3398639903,JP -3398639904,3398639907,MY -3398639908,3398640671,JP -3398640672,3398640695,SG -3398640696,3398641663,JP -3398641664,3398643679,AU -3398643680,3398643695,NZ -3398643696,3398643711,AU -3398643712,3398647807,JP -3398647808,3398655999,IN -3398656000,3398668287,AU -3398668288,3398672383,CN -3398672384,3398680575,PK -3398680576,3398684671,ID -3398684672,3398688767,JP -3398688768,3398705151,ID -3398705152,3398709247,CN -3398709248,3398710271,KR -3398710272,3398713343,IN -3398713344,3398729727,CN -3398729728,3398737919,AU -3398737920,3398742015,SG -3398742016,3398746111,TH -3398746112,3398750207,IN -3398750208,3398754303,TW -3398754304,3398758399,AU -3398758400,3398768639,JP -3398768640,3398770687,TH -3398770688,3398778879,CN -3398778880,3398787071,ID -3398787072,3398795263,TH -3398795264,3398803455,ID -3398803456,3398811647,CN -3398811648,3398819839,IN -3398819840,3398828031,CN -3398828032,3398829055,KH -3398829056,3398830079,IN -3398830080,3398831103,KH -3398831104,3398831359,JP -3398831360,3398831615,HK -3398831616,3398832127,JP -3398832128,3398840319,CN -3398840320,3398842367,JP -3398842368,3398843391,CN -3398843392,3398844415,AU -3398844416,3398852607,ID -3398852608,3398860799,NZ -3398860800,3398873087,ID -3398873088,3398877183,KR -3398877184,3398881279,CN -3398881280,3398885375,SG -3398885376,3398894591,CN -3398894592,3398895615,TH -3398895616,3398897663,ID -3398897664,3398901759,FJ -3398901760,3398902015,AU -3398902016,3398902271,CN -3398902272,3398902783,PH -3398902784,3398903807,AU -3398903808,3398905855,TH -3398905856,3398909951,TW -3398909952,3398918143,GU -3398918144,3398926335,JP -3398926336,3398934527,CN -3398934528,3398938623,VN -3398938624,3398942719,TH -3398942720,3398959103,MY -3398959104,3398975487,ID -3398975488,3398983679,BN -3398983680,3398991871,JP -3398991872,3399004159,ID -3399004160,3399008255,CN -3399008256,3399012351,ID -3399012352,3399016447,JP -3399016448,3399024639,ID -3399024640,3399025663,CN -3399025664,3399026175,TW -3399026176,3399026431,SG -3399026432,3399026687,CN -3399026688,3399028735,HK -3399028736,3399032831,ID -3399032832,3399036927,IN -3399036928,3399041023,CN -3399041024,3399045119,AU -3399045120,3399047167,MV -3399047168,3399057407,HK -3399057408,3399065599,ID -3399065600,3399077887,TW -3399077888,3399081983,AU -3399081984,3399106559,ID -3399106560,3399122943,AU -3399122944,3399131135,NZ -3399131136,3399135231,IN -3399135232,3399139327,ID -3399139328,3399147519,TW -3399147520,3399155711,PK -3399155712,3399196671,ID -3399196672,3399204863,AU -3399204864,3399221247,HK -3399221248,3399286783,SG -3399286784,3399303167,JP -3399303168,3399311359,IN -3399311360,3399319551,JP -3399319552,3399332351,SG -3399332352,3399332863,AU -3399332864,3399335935,SG -3399335936,3399344127,CN -3399344128,3399352319,JP -3399352320,3399389183,ID -3399389184,3399393279,KR -3399393280,3399401471,CN -3399401472,3399409663,AU -3399409664,3399413759,JP -3399413760,3399414015,SG -3399414016,3399414271,AU -3399414272,3399414527,CN -3399414528,3399414783,AU -3399414784,3399415807,VN -3399416832,3399417087,ID -3399417088,3399417855,AU -3399417856,3399450623,ID -3399450624,3399467007,AU -3399467008,3399483391,IN -3399483392,3399495679,BN -3399495680,3399499775,NZ -3399499776,3399507967,TW -3399507968,3399512063,AU -3399512064,3399514111,NZ -3399514112,3399515135,SG -3399515136,3399515647,VN -3399515648,3399516159,AU -3399516160,3399517183,SG -3399517184,3399518207,IN -3399518208,3399519231,ID -3399519232,3399520255,CN -3399520256,3399521279,IN -3399521280,3399522303,NZ -3399522304,3399523327,HK -3399523328,3399524351,CN -3399524352,3399528447,IN -3399528448,3399532543,CN -3399532544,3399548927,SG -3399548928,3399557119,AU -3399557120,3399565311,SG -3399565312,3399581695,AU -3399581696,3399584255,US -3399584256,3399584511,BD -3399584512,3399587839,US -3399587840,3399588095,BD -3399588096,3399589631,US -3399589632,3399589887,NP -3399589888,3399593983,HK -3399593984,3399598079,BD -3399598080,3399614463,JP -3399614464,3399622655,MY -3399622656,3399626751,ID -3399626752,3399630847,IN -3399630848,3399631615,AU -3399631616,3399631871,CN -3399631872,3399632895,SG -3399632896,3399633407,NZ -3399633408,3399633663,AU -3399633664,3399633919,CN -3399633920,3399634943,TH -3399634944,3399639039,JP -3399639040,3399643135,AU -3399643136,3399655423,JP -3399655424,3399659519,PH -3399659520,3399661567,NZ -3399661568,3399662591,HK -3399662592,3399663615,IN -3399663616,3399671807,ID -3399671808,3399679999,IN -3399680000,3399680303,HK -3399680304,3399680319,DE -3399680320,3399688191,HK -3399688192,3399696383,SG -3399696384,3399712767,PK -3399712768,3399720959,KR -3399720960,3399729151,JP -3399729152,3399745535,PH -3399745536,3399749631,CN -3399749632,3399751679,AU -3399751680,3399752191,IN -3399752192,3399752447,AU -3399752448,3399752703,HK -3399752704,3399753727,NZ -3399753728,3399761919,IN -3399761920,3399770111,JP -3399770112,3399778303,CN -3399778304,3399786495,IN -3399786496,3399794687,PH -3399794688,3399798783,AU -3399798784,3399800831,BD -3399800832,3399802879,ID -3399802880,3399811071,JP -3399811072,3399819263,MY -3399819264,3399823359,ID -3399823360,3399825407,JP -3399825408,3399826431,KR -3399826432,3399826943,PH -3399826944,3399827455,IN -3399827456,3399835647,AU -3399835648,3399839743,US -3399839744,3399841791,JP -3399841792,3399842815,HK -3399842816,3399843839,AU -3399843840,3399852031,TW -3399852032,3399856127,JP -3399856128,3399860223,CN -3399860224,3399864319,PG -3399864320,3399868415,CN -3399868416,3399872255,PK -3399872256,3399873023,CN -3399873024,3399873279,PK -3399873280,3399873535,CN -3399873536,3399873791,PK -3399873792,3399874047,CN -3399874048,3399875327,PK -3399875328,3399876607,CN -3399876608,3399917567,SG -3399917568,3399921663,PK -3399921664,3399923711,NC -3399923712,3399923967,IN -3399923968,3399924223,JP -3399924224,3399924479,US -3399924480,3399924735,AU -3399924736,3399925759,PH -3399925760,3399933951,NP -3399933952,3399942143,CN -3399942144,3399954943,AU -3399954944,3399974911,US -3399974912,3399979007,HK -3399979008,3399983744,US -3399983745,3399983745,SG -3399983746,3399991295,US -3399991296,3399995391,IN -3399995392,3399999487,KR -3399999488,3400000255,JP -3400000256,3400000511,AU -3400000512,3400002303,JP -3400002304,3400002367,HK -3400002368,3400006143,JP -3400006144,3400006399,HK -3400006400,3400007679,JP -3400007680,3400024063,AU -3400024064,3400028159,MY -3400028160,3400029183,CN -3400029184,3400031231,IN -3400031232,3400031743,SG -3400031744,3400031999,IN -3400032000,3400032255,HK -3400032256,3400040447,AU -3400040448,3400044543,CN -3400044544,3400045567,IN -3400045568,3400047615,HK -3400047616,3400048639,IN -3400048640,3400056831,CN -3400056832,3400060927,TW -3400060928,3400062975,HK -3400062976,3400065023,JP -3400065024,3400073215,BD -3400073216,3400077311,HK -3400077312,3400079359,AU -3400079360,3400081407,MY -3400081408,3400089599,ID -3400089600,3400097791,JP -3400097792,3400105983,AU -3400105984,3400114175,JP -3400114176,3400118271,TW -3400118272,3400120319,AU -3400120320,3400122367,JP -3400122368,3400130559,NZ -3400130560,3400138751,ID -3400138752,3400146943,HK -3400146944,3400151039,FJ -3400151040,3400155135,MY -3400155136,3400163327,MN -3400163328,3400167423,JP -3400167424,3400171519,TH -3400171520,3400179711,CN -3400179712,3400183807,NZ -3400183808,3400187903,JP -3400187904,3400188927,CA -3400188928,3400189951,AU -3400189952,3400191999,IN -3400192000,3400194047,JP -3400194048,3400204287,CN -3400204288,3400212479,ID -3400212480,3400220671,MY -3400220672,3400224767,NC -3400224768,3400228863,JP -3400228864,3400232959,AU -3400232960,3400245247,JP -3400245248,3400253439,AU -3400253440,3400257535,MY -3400257536,3400259583,HK -3400259584,3400261631,CN -3400261632,3400263679,JP -3400263680,3400263935,CN -3400263936,3400264191,ID -3400264192,3400264447,IN -3400264448,3400264703,CN -3400264704,3400265215,ID -3400265216,3400265471,AU -3400265472,3400265727,IN -3400265728,3400267775,PG -3400267776,3400268799,KR -3400268800,3400269823,MO -3400269824,3400270847,CN -3400270848,3400271359,VN -3400271360,3400271615,AU -3400271616,3400271871,CN -3400271872,3400273919,AU -3400273920,3400275967,TH -3400275968,3400278015,JP -3400278016,3400286207,SG -3400286208,3400294399,JP -3400294400,3400310783,AU -3400310784,3400335359,SG -3400335360,3400336383,CN -3400336384,3400336639,PH -3400336640,3400336895,JP -3400336896,3400337151,CN -3400337152,3400337407,PH -3400337408,3400339455,CN -3400339456,3400341503,ID -3400341504,3400343551,AU -3400343552,3400351743,TW -3400351744,3400359935,ID -3400359936,3400364031,JP -3400364032,3400365055,CN -3400365056,3400366079,US -3400367104,3400368127,IN -3400368128,3400388607,AU -3400388608,3400392703,TH -3400392704,3400400895,CN -3400400896,3400401919,MO -3400401920,3400402175,TW -3400402176,3400402431,IN -3400402432,3400402943,NZ -3400402944,3400404991,HK -3400404992,3400409087,TW -3400409088,3400413183,AU -3400413184,3400417279,JP -3400417280,3400421375,CN -3400421376,3400423423,AU -3400423424,3400424447,KR -3400424448,3400425471,IN -3400425472,3400429567,AU -3400429568,3400431615,NZ -3400431616,3400431871,IN -3400431872,3400432127,HK -3400432128,3400432639,IN -3400432640,3400433663,CN -3400433664,3400435711,HK -3400435712,3400436223,BD -3400436224,3400441855,HK -3400441856,3400450047,NZ -3400450048,3400458239,JP -3400458240,3400466431,AU -3400466432,3400491007,MO -3400491008,3400495103,CN -3400495104,3400499199,MO -3400499200,3400503295,NZ -3400503296,3400507391,JP -3400507392,3400515583,MO -3400515584,3400531967,PH -3400531968,3400532991,IN -3400532992,3400534015,MY -3400534016,3400535039,JP -3400535040,3400535551,MY -3400535552,3400536063,AU -3400536064,3400548351,JP -3400548352,3400581119,TH -3400581120,3400589311,SG -3400589312,3400597503,CN -3400597504,3400605695,HK -3400605696,3400607743,JP -3400607744,3400608767,AU -3400608768,3400609791,IN -3400609792,3400630271,JP -3400630272,3400646655,IN -3400646656,3400646911,HK -3400646912,3400647679,JP -3400647680,3400648677,AU -3400648678,3400648678,HK -3400648679,3400648703,AU -3400648704,3400648815,JP -3400648816,3400648831,HK -3400648832,3400649943,JP -3400649944,3400649951,HK -3400649952,3400650143,JP -3400650144,3400650159,HK -3400650160,3400650409,JP -3400650410,3400650410,AU -3400650411,3400650751,JP -3400650752,3400654847,AU -3400654848,3400663039,IN -3400663040,3400683519,MY -3400683520,3400691711,JP -3400691712,3400695807,KH -3400695808,3400728575,TW -3400728576,3400736767,MN -3400736768,3400744959,JP -3400744960,3400753151,IN -3400753152,3400761343,MY -3400761344,3400763391,AU -3400763392,3400764415,ID -3400764416,3400765439,NZ -3400765440,3400766463,AU -3400766464,3400767487,KR -3400767488,3400768511,HK -3400768512,3400769535,IN -3400769536,3400773631,CN -3400773632,3400775679,KR -3400775680,3400777727,ID -3400777728,3400790015,JP -3400790016,3400794111,CN -3400794112,3400802303,ID -3400802304,3400806399,JP -3400806400,3400808447,ID -3400808448,3400810495,JP -3400810496,3400826879,NZ -3400826880,3400835071,CN -3400835072,3400839167,HK -3400839168,3400847359,JP -3400847360,3400849407,CN -3400849408,3400851455,MN -3400851456,3400859647,AU -3400859648,3400860671,HK -3400860928,3400861183,IN -3400861696,3400862719,CN -3400862720,3400864767,BD -3400864768,3400865791,AU -3400865792,3400866815,HK -3400866816,3400867839,CN -3400867840,3400884223,AU -3400884224,3400888319,JP -3400888320,3400892415,CN -3400892416,3400925183,HK -3400925184,3400933375,TH -3400933376,3400937471,CN -3400937472,3400941567,ID -3400941568,3400966143,AU -3400966144,3400974335,ID -3400974336,3400982527,CN -3400982528,3400990719,HK -3400990720,3400998911,ID -3400998912,3401003007,PH -3401003008,3401007103,JP -3401007104,3401008143,CA -3401008144,3401008159,MY -3401008160,3401010175,CA -3401010176,3401010183,MY -3401010184,3401010191,CA -3401010192,3401010207,MY -3401010208,3401011199,CA -3401011200,3401015295,JP -3401015296,3401023487,AU -3401023488,3401056255,TH -3401056256,3401383935,MY -3401383936,3401400319,CN -3401400320,3401404415,AU -3401404416,3401408511,CN -3401408512,3401416703,HK -3401416704,3401416959,KR -3401416960,3401420799,SG -3401420800,3401424895,JP -3401424896,3401428991,NZ -3401428992,3401431039,JP -3401431040,3401433087,CN -3401433088,3401441279,JP -3401441280,3401449471,IN -3401449472,3401515007,MY -3401515008,3401515263,CN -3401515264,3401515519,AU -3401515520,3401516031,ID -3401516032,3401519103,AU -3401519104,3401523199,JP -3401523200,3401527295,NZ -3401527296,3401529343,AU -3401529344,3401530367,VN -3401530368,3401531391,AU -3401531392,3401532415,IN -3401532416,3401539583,CN -3401539584,3401543679,AU -3401543680,3401545727,JP -3401545728,3401547775,BD -3401547776,3401580543,IN -3401580544,3402629119,CN -3402629120,3405774847,JP -3405774848,3405775871,AU -3405775872,3405776895,CN -3405776896,3405777407,AU -3405777408,3405777919,CN -3405777920,3405779455,AU -3405779456,3405779711,CN -3405779712,3405780991,AU -3405780992,3405781247,CN -3405781248,3405785599,AU -3405785600,3405786111,CN -3405786112,3405786367,AU -3405786368,3405787135,CN -3405787136,3405793279,AU -3405793280,3405793535,US -3405793536,3405795583,AU -3405795584,3405796351,CN -3405796352,3405797887,AU -3405797888,3405798399,CN -3405798400,3405799423,AU -3405799424,3405799935,CN -3405799936,3405801471,AU -3405801472,3405803519,CN -3405803520,3405803775,AU -3405804032,3405804543,CN -3405804544,3405806079,AU -3405806080,3405806335,CN -3405806336,3405807615,AU -3405807616,3405807871,CN -3405807872,3405808127,AU -3405808128,3405809663,CN -3405809664,3405809919,AU -3405809920,3405810175,CN -3405810176,3405811199,AU -3405811200,3405811455,CN -3405811456,3405811711,AU -3405811712,3405811967,CN -3405811968,3405812223,AU -3405812224,3405812479,CN -3405812480,3405812735,AU -3405812736,3405812991,CN -3405812992,3405813247,AU -3405813248,3405814015,CN -3405814016,3405820159,AU -3405820160,3405820415,CN -3405820416,3405832191,AU -3405832192,3405832447,CN -3405832448,3405839359,AU -3405839360,3405840383,HK -3405840384,3405841407,AU -3405841408,3405842431,CN -3405842432,3405844991,AU -3405844992,3405845247,CN -3405845248,3405846783,AU -3405846784,3405847039,ID -3405847040,3405847551,CN -3405847552,3405857023,AU -3405857024,3405857791,CN -3405857792,3405858303,AU -3405858304,3405858815,CN -3405858816,3405859839,AU -3405859840,3405860351,CN -3405860352,3405863423,AU -3405863424,3405863679,CN -3405863936,3405865215,AU -3405865216,3405867007,CN -3405867008,3405868031,AU -3405868032,3405868287,CN -3405868288,3405905151,AU -3405905152,3405905663,CN -3405905664,3405922303,AU -3405922304,3405924351,CN -3405924352,3405924607,AU -3405924608,3405924863,CN -3405924864,3405934591,AU -3405934592,3405936639,CN -3405936640,3405938175,AU -3405938176,3405938687,CN -3405938688,3405941759,AU -3405941760,3405942015,CN -3405942016,3405944319,AU -3405944320,3405944575,CN -3405944832,3405946367,CN -3405946368,3405946879,AU -3405946880,3405948927,CN -3405948928,3405951999,AU -3405952000,3405952511,CN -3405952512,3405956095,AU -3405956096,3405956607,CN -3405956608,3405959423,AU -3405959424,3405959679,CN -3405959680,3405960703,AU -3405960704,3405961215,CN -3405961216,3405963775,AU -3405963776,3405964287,CN -3405964288,3405964543,JP -3405964544,3405964799,CN -3405964800,3405966335,AU -3405966336,3405966847,CN -3405966848,3405988863,AU -3405988864,3405989119,CN -3405989120,3405989887,AU -3405989888,3405990399,CN -3405990400,3405990655,AU -3405990656,3405990911,CN -3405990912,3405991935,AU -3405991936,3405993983,CN -3405993984,3405996031,AU -3405996032,3405997055,CN -3405997056,3405998335,AU -3405998336,3405998591,CN -3405998592,3406000127,AU -3406000128,3406002431,CN -3406002432,3406002943,AU -3406002944,3406003199,CN -3406003200,3406005247,AU -3406005248,3406005503,PK -3406005504,3406006015,AU -3406006016,3406006271,CN -3406006272,3406007039,AU -3406007040,3406007295,CN -3406007296,3406008063,AU -3406008064,3406008319,CN -3406008320,3406070783,AU -3406070784,3406071551,CN -3406071552,3406071807,AU -3406071808,3406073855,US -3406073856,3406075647,AU -3406075648,3406076927,CN -3406076928,3406077951,AU -3406077952,3406078207,TH -3406078208,3406081535,AU -3406081536,3406082047,CN -3406082048,3406083071,AU -3406083072,3406083327,CN -3406083328,3406084607,AU -3406084608,3406084863,CN -3406084864,3406085119,BD -3406085120,3406089471,AU -3406089472,3406089727,CN -3406089728,3406090239,AU -3406090240,3406091263,CN -3406091264,3406095103,AU -3406095104,3406095359,CN -3406095360,3406095871,AU -3406095872,3406096383,CN -3406096384,3406103551,AU -3406103552,3406104063,CN -3406104064,3406104319,AU -3406104320,3406105087,CN -3406105088,3406105343,AU -3406105344,3406105599,CN -3406105600,3406107903,AU -3406107904,3406108415,CN -3406108416,3406109695,AU -3406109696,3406109951,NZ -3406109952,3406113791,AU -3406113792,3406114047,CN -3406114048,3406114303,AU -3406114304,3406114815,CN -3406114816,3406115839,AU -3406115840,3406117375,CN -3406117376,3406117887,AU -3406117888,3406118399,CN -3406118400,3406131711,AU -3406131712,3406132223,CN -3406132224,3406132735,AU -3406132736,3406132991,CN -3406132992,3406133247,AU -3406133248,3406133503,CN -3406133504,3406146559,AU -3406146560,3406146815,CN -3406146816,3406148607,AU -3406148608,3406149375,CN -3406149376,3406149887,AU -3406149888,3406150399,CN -3406150400,3406150655,AU -3406150656,3406151423,CN -3406151424,3406152447,AU -3406152448,3406152703,CN -3406152704,3406157311,AU -3406157312,3406157823,CN -3406157824,3406158335,AU -3406158336,3406158847,CN -3406158848,3406201599,AU -3406201600,3406201855,CN -3406201856,3406202879,AU -3406202880,3406203135,CN -3406203136,3406203391,AU -3406203392,3406203903,CN -3406203904,3406204415,AU -3406204416,3406204671,CN -3406204672,3406205951,AU -3406205952,3406206463,ID -3406206464,3406206975,CN -3406206976,3406208255,AU -3406208256,3406208511,CN -3406208512,3406208767,AU -3406208768,3406209023,CN -3406209024,3406225407,AU -3406225408,3406229503,CN -3406229504,3406231039,AU -3406231040,3406231295,NZ -3406231296,3406231551,AU -3406231552,3406232063,CN -3406232064,3406266623,AU -3406266624,3406266879,CN -3406266880,3406268927,AU -3406268928,3406269439,CN -3406269440,3406271231,AU -3406271232,3406271487,CN -3406271488,3406271999,AU -3406272000,3406272511,CN -3406272512,3406274047,AU -3406274048,3406274303,CN -3406274304,3406274559,AU -3406274560,3406276607,HK -3406276608,3406277375,AU -3406277376,3406277631,ID -3406277632,3406282751,AU -3406282752,3406283263,CN -3406283264,3406284799,AU -3406284800,3406285055,CN -3406285056,3406299135,AU -3406299136,3406299391,CN -3406299392,3406301183,AU -3406301184,3406301439,CN -3406301440,3406305023,AU -3406305024,3406305279,CN -3406305280,3406307327,HK -3406307328,3406317055,AU -3406317056,3406317311,CN -3406317312,3406320127,AU -3406320128,3406320383,CN -3406320384,3406321151,AU -3406321152,3406321663,CN -3406321664,3406322431,AU -3406322432,3406322687,CN -3406322688,3406327039,AU -3406327040,3406327295,IN -3406327296,3406327807,CN -3406327808,3406328575,AU -3406328576,3406328831,CN -3406328832,3406329343,IN -3406329344,3406331647,AU -3406331648,3406331903,VN -3406331904,3406341631,AU -3406341632,3406342143,CN -3406342144,3406342399,AU -3406342400,3406342655,CN -3406342656,3406343167,AU -3406343168,3406343423,VN -3406343424,3406343679,CN -3406343680,3406346239,AU -3406346240,3406346495,CN -3406346496,3406346751,AU -3406346752,3406347263,CN -3406347264,3406347775,AU -3406347776,3406348543,CN -3406348544,3406349567,AU -3406349568,3406350335,CN -3406350336,3406350591,AU -3406350592,3406350847,IN -3406350848,3406351103,AU -3406351104,3406351359,CN -3406351360,3406352639,AU -3406352640,3406354431,CN -3406354432,3406354687,AU -3406354688,3406354943,CN -3406354944,3406355455,AU -3406355456,3406355711,CN -3406355712,3406356223,AU -3406356480,3406372863,AU -3406372864,3406373119,CN -3406373120,3406373887,AU -3406373888,3406374399,CN -3406374400,3406379263,AU -3406379264,3406379519,CN -3406379520,3406380799,AU -3406380800,3406381055,CN -3406381056,3406381311,AU -3406381312,3406381567,CN -3406381568,3406382591,AU -3406382592,3406383359,CN -3406383360,3406383871,AU -3406383872,3406384639,CN -3406384640,3406384895,SG -3406384896,3406389247,AU -3406389248,3406390783,CN -3406390784,3406392319,AU -3406392320,3406392575,CN -3406392576,3406405119,AU -3406405120,3406405375,CN -3406405376,3406409727,AU -3406409728,3406411775,NZ -3406411776,3406413311,AU -3406413312,3406413823,JP -3406413824,3406434303,AU -3406434304,3406436351,MY -3406436352,3406438911,AU -3406438912,3406439167,CN -3406439168,3406444543,AU -3406444544,3406444799,CN -3406444800,3406445055,AU -3406445056,3406445311,MY -3406445312,3406449151,AU -3406449152,3406449663,CN -3406449664,3406451711,AU -3406451712,3406452991,CN -3406452992,3406454527,AU -3406454528,3406454783,CN -3406454784,3406462207,AU -3406462208,3406462463,CN -3406462464,3406512383,AU -3406512384,3406512639,PK -3406512640,3406513663,AU -3406513664,3406513919,CN -3406513920,3406514175,AU -3406514176,3406514431,IN -3406514432,3406514687,AU -3406514688,3406514943,TH -3406514944,3406515199,AU -3406515200,3406516223,CN -3406516224,3406516735,AU -3406516736,3406516991,CN -3406516992,3406517247,AU -3406517248,3406518271,CN -3406518272,3406521343,AU -3406521344,3406522367,CN -3406522368,3406523647,AU -3406523648,3406523903,CN -3406523904,3406525695,AU -3406525696,3406525951,CN -3406525952,3406526975,AU -3406526976,3406527231,CN -3406527232,3406527999,AU -3406528000,3406528255,CN -3406528256,3406528511,AU -3406528512,3406529535,HK -3406529536,3406529791,IL -3406529792,3406530559,HK -3406530560,3406531583,CN -3406531584,3406531839,AU -3406531840,3406532607,CN -3406532608,3406541823,AU -3406541824,3406542847,CN -3406542848,3406548991,AU -3406548992,3406550015,CN -3406550016,3406565375,AU -3406565376,3406565631,CN -3406565632,3406565887,AU -3406565888,3406566143,PH -3406566144,3406566399,CN -3406566400,3406566911,ID -3406566912,3406567423,AU -3406567424,3406567679,CN -3406567680,3406572031,AU -3406572032,3406572287,JP -3406572288,3406575871,AU -3406575872,3406576127,CN -3406576128,3406577919,AU -3406577920,3406578431,CN -3406578432,3406579199,AU -3406579200,3406579711,CN -3406579712,3406583295,AU -3406583552,3406583807,CN -3406583808,3406585855,HK -3406585856,3406586111,AU -3406586112,3406586367,JP -3406586368,3406586879,AU -3406586880,3406587391,CN -3406587392,3406587647,AU -3406587648,3406587903,CN -3406587904,3406590463,AU -3406590464,3406590719,CN -3406590720,3406591487,AU -3406591488,3406591743,CN -3406591744,3406594559,AU -3406594560,3406594815,CN -3406594816,3406596351,AU -3406596352,3406596607,CN -3406596608,3406611455,AU -3406611456,3406612479,CN -3406612480,3406614527,HK -3406614528,3406615295,AU -3406615296,3406615551,CN -3406615552,3406617343,AU -3406617344,3406617599,CN -3406617600,3406617855,MY -3406617856,3406618111,AU -3406618112,3406618623,IN -3406618624,3406619135,AU -3406619136,3406619391,CN -3406619392,3406622719,AU -3406622720,3406623743,CN -3406623744,3406625023,AU -3406625024,3406625279,NF -3406625280,3406625791,AU -3406626816,3406631423,AU -3406631424,3406631679,CN -3406631680,3406632959,AU -3406632960,3406633215,CN -3406633216,3406637055,AU -3406637056,3406637311,IN -3406637312,3406638079,AU -3406638080,3406638591,CN -3406638592,3406647295,AU -3406647296,3406649343,HK -3406649344,3406649855,CN -3406649856,3406650367,AU -3406650368,3406651391,CN -3406651392,3406669823,AU -3406669824,3406670847,IN -3406670848,3406671103,AU -3406671104,3406671359,CN -3406671360,3406684159,AU -3406684160,3406684671,CN -3406684672,3406684927,AU -3406684928,3406685183,CN -3406685184,3406686463,AU -3406686464,3406686719,CN -3406686720,3406696959,AU -3406696960,3406697215,IN -3406697216,3406698495,AU -3406698496,3406699519,CN -3406699520,3406700543,AU -3406700544,3406700799,IN -3406700800,3406701055,CN -3406701056,3406706687,AU -3406706688,3406706943,CN -3406706944,3406707967,AU -3406707968,3406708479,CN -3406708480,3406718975,AU -3406718976,3406719231,CN -3406719232,3406721535,AU -3406721536,3406722047,CN -3406722048,3406722559,AU -3406722560,3406722815,CN -3406722816,3406733823,AU -3406733824,3406734079,CN -3406734080,3406734847,AU -3406734848,3406735103,HK -3406735104,3406737407,AU -3406737408,3406737663,ID -3406737664,3406739199,AU -3406739200,3406739455,ID -3406739456,3406740991,HK -3406740992,3406741503,SG -3406741504,3406741759,CN -3406741760,3406742015,AU -3406742016,3406742527,CN -3406742528,3406746623,AU -3406746624,3406746879,JP -3406746880,3406747135,AU -3406747136,3406747391,CN -3406747392,3406751487,AU -3406751488,3406751743,CN -3406751744,3406755327,AU -3406755328,3406755583,CN -3406755584,3406757887,AU -3406757888,3406761983,CN -3406761984,3406763007,AU -3406763008,3406763775,CN -3406763776,3406775295,AU -3406775296,3406775551,JP -3406775552,3406780159,AU -3406780160,3406780927,CN -3406780928,3406784767,AU -3406784768,3406785023,CN -3406785024,3406786559,AU -3406786560,3406788607,CN -3406788608,3406791167,AU -3406791168,3406791679,CN -3406791680,3406796031,AU -3406796032,3406796287,CN -3406796288,3406796543,AU -3406796544,3406796799,CN -3406796800,3406797823,AU -3406797824,3406798847,CN -3406798848,3406802431,AU -3406802432,3406802687,CN -3406802688,3406815999,AU -3406816000,3406816255,CN -3406816256,3406817279,AU -3406817280,3406819839,CN -3406819840,3406820863,AU -3406820864,3406821119,CN -3406821120,3406825983,AU -3406825984,3406826239,CN -3406826496,3406827007,CN -3406827008,3406827519,AU -3406827520,3406829567,CN -3406829568,3406830335,AU -3406830336,3406830591,CN -3406830592,3406832127,AU -3406832128,3406832383,PK -3406832384,3406833151,AU -3406833152,3406833407,CN -3406833408,3406835967,AU -3406835968,3406836735,CN -3406836736,3406838271,AU -3406838272,3406838527,CN -3406838528,3406839551,AU -3406839552,3406839807,CN -3406839808,3406857471,AU -3406857472,3406857727,CN -3406857728,3406864639,AU -3406864640,3406865151,CN -3406865152,3406865663,AU -3406865664,3406865919,IN -3406865920,3406869503,AU -3406869504,3406870527,JP -3406870528,3406871039,AU -3406871040,3406871551,CN -3406871552,3406881791,AU -3406881792,3406882047,CN -3406882048,3406884351,AU -3406884352,3406884607,CN -3406884608,3406884863,HK -3406884864,3406885119,CN -3406885120,3406886143,AU -3406886144,3406886399,CN -3406886400,3406889471,AU -3406889472,3406889727,CN -3406889728,3406893567,AU -3406893568,3406893823,CN -3406893824,3406894335,AU -3406894336,3406894591,ID -3406894592,3406896127,AU -3406896128,3406896383,CN -3406896384,3406896895,AU -3406896896,3406897151,IN -3406897152,3406898943,AU -3406898944,3406899199,CN -3406899200,3406903295,AU -3406903296,3406903551,CN -3406903552,3406905599,AU -3406905600,3406905855,BD -3406905856,3406907903,AU -3406907904,3406908415,CN -3406908416,3406911487,AU -3406911488,3406911999,CN -3406912000,3406923775,AU -3406923776,3406924031,CN -3406924288,3406930431,AU -3406930432,3406930687,JP -3406930688,3406930943,AU -3406930944,3406931199,CN -3406931200,3406936831,AU -3406936832,3406937087,CN -3406937088,3406937343,AU -3406937600,3406938111,CN -3406938112,3406938623,AU -3406938624,3406938879,IN -3406938880,3406946815,AU -3406946816,3406947071,KR -3406947072,3406948095,AU -3406948096,3406948351,CN -3406948352,3406948607,AU -3406948608,3406948863,CN -3406948864,3406950399,AU -3406950400,3406951423,NF -3406951424,3406952447,AU -3406952448,3406952959,CN -3406952960,3406954239,AU -3406954240,3406954495,CN -3406954496,3406955007,AU -3406955008,3406955775,CN -3406955776,3406956287,AU -3406956288,3406956543,CN -3406956544,3406961151,AU -3406961152,3406961407,IN -3406961408,3406962431,AU -3406962432,3406962687,CN -3406962688,3406963967,AU -3406963968,3406964223,CN -3406964224,3406966783,AU -3406966784,3406967295,CN -3406967296,3406967551,HK -3406967552,3406967807,IN -3406967808,3406968063,CN -3406968064,3406972927,AU -3406972928,3406973951,CN -3406973952,3406974975,AU -3406974976,3406975487,CN -3406975488,3406976767,AU -3406976768,3406977023,CN -3406977024,3406980095,AU -3406980096,3406980607,CN -3406980608,3406981119,AU -3406981376,3406981631,CN -3406981632,3406981887,AU -3406981888,3406982143,CN -3406982144,3406982655,AU -3406982656,3406982911,CN -3406983168,3406987519,AU -3406987520,3406987775,CN -3406987776,3406988031,AU -3406988032,3406988799,CN -3406988800,3406989567,AU -3406989568,3406989823,IN -3406989824,3406991359,AU -3406991360,3406991615,CN -3406991616,3406993663,AU -3406993664,3406993919,CN -3406993920,3406994431,AU -3406995456,3407005439,AU -3407005440,3407005695,CN -3407005696,3407007743,AU -3407007744,3407007999,CN -3407008000,3407008511,AU -3407008512,3407008767,CN -3407008768,3407009535,AU -3407009536,3407009791,CN -3407009792,3407020287,AU -3407020288,3407020543,CN -3407020544,3407020799,AU -3407020800,3407021055,IN -3407021056,3407021311,ID -3407021312,3407024639,AU -3407024640,3407024895,CN -3407024896,3407026175,AU -3407026176,3407026431,CN -3407026432,3407027711,AU -3407027712,3407027967,CN -3407027968,3407028223,AU -3407028224,3407030271,HK -3407030272,3407030527,AU -3407030528,3407030783,CN -3407030784,3407031295,AU -3407031296,3407032063,CN -3407032064,3407034879,AU -3407034880,3407035135,CN -3407035136,3407035391,AU -3407035392,3407035903,CN -3407035904,3407036415,AU -3407036416,3407036671,CN -3407036672,3407037439,AU -3407037440,3407037695,CN -3407037696,3407038463,AU -3407038464,3407038719,CN -3407038720,3407045887,AU -3407045888,3407046143,CN -3407046144,3407048447,AU -3407048448,3407048703,CN -3407048704,3407053567,AU -3407053568,3407053823,CN -3407053824,3407054079,AU -3407054080,3407054335,CN -3407054336,3407056895,AU -3407056896,3407057151,CN -3407057152,3407057663,AU -3407057664,3407057919,CN -3407057920,3407058175,AU -3407058176,3407058431,CN -3407058432,3407059967,AU -3407059968,3407060223,CN -3407060224,3407065087,AU -3407065088,3407065343,CN -3407065344,3407065599,AU -3407065600,3407066111,CN -3407066112,3407073279,AU -3407073280,3407073535,CN -3407073536,3407078399,AU -3407078400,3407079423,CN -3407079424,3407079679,AU -3407079680,3407079935,CN -3407079936,3407081471,AU -3407081728,3407081983,AU -3407081984,3407082239,CN -3407082240,3407083519,AU -3407083520,3407084031,CN -3407084032,3407085311,AU -3407085312,3407085567,CN -3407085568,3407089919,AU -3407089920,3407090175,CN -3407090176,3407095807,AU -3407095808,3407096319,CN -3407096576,3407096831,AU -3407096832,3407097087,CN -3407097088,3407097855,AU -3407097856,3407098111,CN -3407098112,3407101183,AU -3407101184,3407101439,CN -3407101440,3407101695,AU -3407101696,3407101951,MY -3407101952,3407102207,AU -3407102208,3407102463,CN -3407102464,3407107071,AU -3407107072,3407107583,CN -3407107584,3407108351,AU -3407108352,3407108607,CN -3407108608,3407112447,AU -3407112448,3407112703,SG -3407112704,3407113215,CN -3407113216,3407115007,AU -3407115008,3407115263,CN -3407115264,3407115519,AU -3407115520,3407116287,CN -3407116288,3407116799,AU -3407116800,3407117055,CN -3407117056,3407117823,AU -3407117824,3407118335,CN -3407118336,3407120127,AU -3407120128,3407120383,CN -3407120384,3407122431,HK -3407122432,3407123967,AU -3407123968,3407124223,CN -3407124224,3407124479,AU -3407124480,3407126527,HK -3407126528,3407144447,AU -3407144448,3407144703,CN -3407144704,3407144959,AU -3407144960,3407145215,CN -3407145216,3407145983,AU -3407145984,3407146239,CN -3407146240,3407147263,AU -3407147264,3407147519,NZ -3407147520,3407151103,AU -3407151104,3407151871,CN -3407151872,3407152895,AU -3407152896,3407153151,IN -3407153152,3407153407,CN -3407153408,3407153663,AU -3407153664,3407153919,CN -3407153920,3407155711,AU -3407155712,3407155967,CN -3407155968,3407159551,AU -3407159552,3407160063,CN -3407160064,3407161599,AU -3407161600,3407161855,CN -3407161856,3407162367,TH -3407162368,3407162623,CN -3407162624,3407168511,AU -3407168512,3407168767,CN -3407168768,3407170047,AU -3407170048,3407170559,ID -3407170560,3407172095,AU -3407172096,3407172351,CN -3407172352,3407175679,AU -3407175680,3407176703,CN -3407176704,3407182847,AU -3407182848,3407183103,CN -3407183104,3407185919,AU -3407185920,3407186431,CN -3407186432,3407188223,AU -3407188224,3407188479,CN -3407188480,3407203839,AU -3407203840,3407204095,CN -3407204096,3407222783,AU -3407222784,3407223039,CN -3407223040,3407223807,AU -3407223808,3407224319,CN -3407224320,3407224575,AU -3407224576,3407224831,CN -3407224832,3407234047,AU -3407234048,3407234303,CN -3407234304,3407236095,AU -3407236096,3407236351,CN -3407236352,3407236607,AU -3407236608,3407236863,CN -3407236864,3407238143,AU -3407238144,3407238399,CN -3407238400,3407238911,AU -3407238912,3407239167,CN -3407239168,3407240191,AU -3407240192,3407241215,CN -3407241216,3407241983,AU -3407241984,3407242239,CN -3407242240,3407243775,AU -3407243776,3407244031,CN -3407244032,3407244287,AU -3407244800,3407247871,AU -3407247872,3407248383,CN -3407248384,3407250175,AU -3407250176,3407250431,CN -3407250432,3407258367,AU -3407258368,3407258623,CN -3407258624,3407259135,AU -3407259136,3407259391,CN -3407259648,3407260159,AU -3407260160,3407260415,CN -3407260416,3407261695,AU -3407261696,3407263743,HK -3407263744,3407264255,AU -3407264256,3407264511,HK -3407264512,3407266303,AU -3407266304,3407266559,CN -3407266560,3407268863,AU -3407268864,3407269119,US -3407269120,3407278591,AU -3407278592,3407279103,CN -3407279104,3407279359,AU -3407279360,3407279871,CN -3407279872,3407281151,AU -3407281152,3407281663,CN -3407281664,3407282175,AU -3407282176,3407282431,CN -3407282688,3407294207,AU -3407294208,3407294463,CN -3407294464,3407300863,AU -3407300864,3407301119,CN -3407301120,3407303935,AU -3407303936,3407304191,CN -3407304192,3407305727,AU -3407305728,3407306751,CN -3407306752,3407307263,AU -3407307264,3407307519,CN -3407307520,3407309567,AU -3407309568,3407309823,CN -3407309824,3407310847,AU -3407310848,3407311103,CN -3407311104,3407314687,AU -3407314688,3407314943,HK -3407314944,3407315455,AU -3407315456,3407315711,CN -3407315712,3407318015,AU -3407318016,3407318527,CN -3407318528,3407326207,AU -3407326208,3407326463,CN -3407326464,3407328767,AU -3407328768,3407329023,CN -3407329024,3407329791,AU -3407329792,3407330303,CN -3407330304,3407331327,AU -3407331328,3407331583,CN -3407331584,3407332607,AU -3407332608,3407333119,CN -3407333120,3407334399,AU -3407334400,3407335423,CN -3407335424,3407339519,AU -3407339520,3407339775,CN -3407339776,3407340031,AU -3407340032,3407341567,CN -3407341568,3407345919,AU -3407345920,3407346175,CN -3407346176,3407346431,AU -3407346432,3407346687,CN -3407346688,3407351039,AU -3407351040,3407351295,CN -3407351296,3407352319,AU -3407352320,3407352575,CN -3407352576,3407354623,AU -3407354624,3407354879,CN -3407354880,3407358719,AU -3407358720,3407358975,CN -3407358976,3407360511,AU -3407360512,3407361023,ID -3407361024,3407362047,AU -3407362048,3407362303,CN -3407362304,3407362559,AU -3407362560,3407362815,CN -3407362816,3407364863,AU -3407364864,3407365119,CN -3407365120,3407366655,AU -3407366656,3407366911,CN -3407366912,3407367167,AU -3407367168,3407367679,ID -3407367680,3407367935,AU -3407367936,3407368703,CN -3407368704,3407369215,AU -3407369216,3407369983,CN -3407369984,3407370239,IN -3407370240,3407370751,AU -3407370752,3407371007,CN -3407371008,3407376127,AU -3407376128,3407376639,CN -3407376640,3407377407,AU -3407377408,3407377663,CN -3407377664,3407378943,AU -3407378944,3407379455,CN -3407379456,3407382015,AU -3407382016,3407382527,JP -3407382528,3407384831,AU -3407384832,3407385087,CN -3407385088,3407386623,AU -3407386624,3407387135,CN -3407387136,3407387903,AU -3407387904,3407388159,CN -3407388160,3407388927,AU -3407388928,3407389183,CN -3407389184,3407390463,AU -3407390464,3407390719,CN -3407390720,3407395327,AU -3407395328,3407395839,CN -3407395840,3407398655,AU -3407398656,3407398911,CN -3407398912,3407399423,AU -3407399424,3407399679,CN -3407399680,3407401983,AU -3407401984,3407402495,CN -3407402496,3407403263,AU -3407403264,3407403519,CN -3407403520,3407403775,AU -3407403776,3407404031,CN -3407404032,3407410175,AU -3407410176,3407410431,CN -3407410432,3407418111,AU -3407418112,3407418879,CN -3407418880,3407425023,AU -3407425024,3407425279,CN -3407425280,3407425535,AU -3407425536,3407427583,HK -3407427584,3407429631,AU -3407429632,3407430143,CN -3407430144,3407436543,AU -3407436544,3407436799,CN -3407436800,3407438591,AU -3407438592,3407439103,CN -3407439104,3407440383,AU -3407440384,3407440639,CN -3407440640,3407440895,AU -3407440896,3407441151,IN -3407441152,3407446783,AU -3407446784,3407447039,CN -3407447040,3407447807,AU -3407447808,3407448063,CN -3407448320,3407448575,AU -3407448576,3407448831,CN -3407448832,3407450879,AU -3407450880,3407451135,CN -3407451136,3407452415,AU -3407452416,3407453183,CN -3407453184,3407455231,AU -3407455232,3407455487,CN -3407455488,3407455743,AU -3407455744,3407455999,CN -3407456000,3407457791,AU -3407457792,3407458303,CN -3407458304,3407459327,AU -3407459328,3407459583,CN -3407459584,3407459839,AU -3407459840,3407460095,CN -3407460096,3407462143,AU -3407462144,3407462399,CN -3407462400,3407464191,AU -3407464192,3407464703,CN -3407464704,3407464959,AU -3407464960,3407465471,CN -3407465472,3407466495,AU -3407466496,3407470591,CN -3407470592,3407471871,AU -3407471872,3407472127,CN -3407472128,3407473407,AU -3407473408,3407473919,CN -3407473920,3407475199,AU -3407475200,3407475455,CN -3407475456,3407480831,AU -3407480832,3407480912,JP -3407480913,3407480913,AU -3407480914,3407481223,JP -3407481224,3407481231,AU -3407481232,3407481343,JP -3407481344,3407481855,AU -3407481856,3407482111,CN -3407482112,3407487487,AU -3407487488,3407487743,CN -3407487744,3407489023,AU -3407489024,3407489279,HK -3407489280,3407491327,AU -3407491328,3407491839,CN -3407491840,3407492863,AU -3407492864,3407493631,CN -3407493632,3407494143,AU -3407494144,3407494399,CN -3407494400,3407495423,AU -3407495424,3407495679,CN -3407495680,3407496191,AU -3407496192,3407496447,CN -3407496448,3407498239,AU -3407498240,3407498495,CN -3407498496,3407498751,PK -3407498752,3407499263,AU -3407499264,3407499519,CN -3407499520,3407500287,AU -3407500288,3407500543,CN -3407500544,3407503615,AU -3407503616,3407503871,CN -3407503872,3407504895,AU -3407504896,3407505407,CN -3407505408,3407508223,AU -3407508224,3407508735,CN -3407508736,3407511807,AU -3407511808,3407512063,CN -3407512064,3407515391,AU -3407515392,3407515903,CN -3407515904,3407516671,AU -3407516672,3407517183,CN -3407517184,3407518207,AU -3407518208,3407518463,CN -3407518464,3407519231,AU -3407519232,3407519743,CN -3407519744,3407522303,AU -3407522304,3407522559,CN -3407522560,3407523071,AU -3407523072,3407523327,CN -3407523328,3407523583,AU -3407523584,3407523839,JP -3407523840,3407524095,CN -3407524096,3407524607,AU -3407524608,3407524863,NZ -3407524864,3407526143,AU -3407526144,3407526399,CN -3407526400,3407530495,AU -3407530496,3407531007,CN -3407531008,3407532543,AU -3407532544,3407532799,CN -3407532800,3407533567,AU -3407533568,3407533823,CN -3407533824,3407535615,AU -3407535616,3407535871,CN -3407535872,3407536127,AU -3407536128,3407536383,CN -3407536384,3407537151,AU -3407537152,3407537407,CN -3407537408,3407538175,AU -3407538176,3407538431,CN -3407538432,3407544319,AU -3407544320,3407544575,CN -3407544576,3407545855,AU -3407545856,3407546367,ID -3407546368,3407546879,AU -3407546880,3407547135,CN -3407547136,3407548159,AU -3407548160,3407548671,CN -3407548672,3407549439,AU -3407549440,3407549695,CN -3407549696,3407549951,AU -3407549952,3407550463,CN -3407550464,3407554559,AU -3407554560,3407554815,CN -3407554816,3407555839,AU -3407555840,3407556095,CN -3407556096,3407557887,AU -3407557888,3407558143,CN -3407558144,3407560959,AU -3407560960,3407561471,CN -3407561472,3407561727,NZ -3407561728,3407561983,AU -3407561984,3407562239,JP -3407562240,3407565055,AU -3407565056,3407565311,CN -3407565312,3407566847,AU -3407566848,3407567103,CN -3407567104,3407568895,AU -3407568896,3407569407,SG -3407569408,3407570431,AU -3407570432,3407570687,CN -3407570688,3407572223,AU -3407572224,3407572479,CN -3407572480,3407574271,AU -3407574272,3407574527,CN -3407574528,3407575295,AU -3407575296,3407576063,CN -3407576064,3407576319,AU -3407576320,3407576575,CN -3407576576,3407595519,AU -3407595520,3407595775,CN -3407595776,3407596031,AU -3407596032,3407596287,CN -3407596288,3407602943,AU -3407602944,3407603199,JP -3407603200,3407603967,AU -3407603968,3407604223,CN -3407604224,3407604479,AU -3407604480,3407604735,IN -3407604736,3407606015,AU -3407606016,3407606271,CN -3407606272,3407608319,AU -3407608320,3407608575,CN -3407608576,3407608715,AU -3407608716,3407608736,JP -3407608737,3407612415,AU -3407612416,3407612671,CN -3407612672,3407612927,AU -3407612928,3407613183,CN -3407613184,3407618303,AU -3407618304,3407619071,CN -3407619072,3407620863,AU -3407620864,3407621375,CN -3407621376,3407623679,AU -3407623680,3407623935,CN -3407623936,3407624191,AU -3407624192,3407624447,CN -3407624704,3407628543,AU -3407628544,3407629055,CN -3407629056,3407629311,AU -3407629312,3407629567,CN -3407629568,3407631871,AU -3407631872,3407632127,CN -3407632128,3407632383,AU -3407632384,3407632639,CN -3407632640,3407638527,AU -3407638528,3407638783,CN -3407638784,3407642623,AU -3407642624,3407643135,TH -3407643136,3407643391,AU -3407643392,3407643647,CN -3407643648,3407644671,AU -3407644672,3407644927,CN -3407644928,3407645695,AU -3407645696,3407645951,CN -3407645952,3407646463,AU -3407646464,3407646719,MY -3407646720,3407646975,AU -3407646976,3407647231,CN -3407647232,3407652095,AU -3407652096,3407652351,CN -3407652352,3407653119,AU -3407653120,3407653631,CN -3407653632,3407655423,AU -3407655424,3407655935,CN -3407655936,3407657215,AU -3407657216,3407657471,CN -3407657472,3407657727,AU -3407657728,3407657983,CN -3407657984,3407660031,AU -3407660032,3407660287,CN -3407660288,3407667711,AU -3407667712,3407668223,CN -3407668224,3407671039,AU -3407671040,3407671295,CN -3407671296,3407675903,AU -3407675904,3407676159,CN -3407676160,3407677439,AU -3407677440,3407677951,CN -3407677952,3407678719,AU -3407678720,3407679231,CN -3407679232,3407682047,AU -3407682048,3407682559,ID -3407682560,3407682815,CN -3407682816,3407687167,AU -3407687168,3407687423,CN -3407687424,3407689983,AU -3407689984,3407690239,CN -3407690240,3407691007,AU -3407691008,3407691263,CN -3407691264,3407691519,AU -3407691520,3407691775,CN -3407691776,3407693055,AU -3407693056,3407693311,CN -3407693312,3407694079,AU -3407694080,3407694335,CN -3407694336,3407696127,AU -3407696128,3407696383,CN -3407696384,3407698431,AU -3407698432,3407698687,CN -3407698688,3407699711,AU -3407699712,3407699967,CN -3407699968,3407700991,AU -3407700992,3407701247,CN -3407701248,3407701759,AU -3407701760,3407702015,CN -3407702016,3407704063,AU -3407704064,3407704319,CN -3407704320,3407706111,AU -3407706112,3407707135,CN -3407707136,3407721983,AU -3407721984,3407722495,CN -3407722496,3407723263,AU -3407723264,3407723519,CN -3407723520,3407723775,AU -3407723776,3407724287,CN -3407724288,3407727871,AU -3407727872,3407728127,CN -3407728128,3407729151,AU -3407729152,3407729407,CN -3407729408,3407730943,AU -3407730944,3407731199,CN -3407731200,3407732223,AU -3407732224,3407732479,HK -3407732480,3407733503,AU -3407733504,3407733759,CN -3407733760,3407734527,AU -3407734528,3407734783,CN -3407734784,3407735039,AU -3407735040,3407735551,CN -3407735552,3407738879,AU -3407738880,3407739135,CN -3407739136,3407740415,AU -3407740416,3407740927,CN -3407740928,3407745023,AU -3407745024,3407745535,CN -3407745536,3407747327,AU -3407747328,3407747583,CN -3407747584,3407747839,AU -3407747840,3407748095,CN -3407748096,3407748351,AU -3407748352,3407748607,CN -3407748608,3407750655,AU -3407750656,3407751167,SG -3407751168,3407753215,AU -3407753216,3407753727,HK -3407753728,3407757823,AU -3407757824,3407758079,CN -3407758080,3407761663,AU -3407761664,3407761919,CN -3407761920,3407763199,AU -3407763200,3407763455,CN -3407763456,3407769343,AU -3407769344,3407769599,CN -3407769600,3407771903,AU -3407771904,3407772159,CN -3407772160,3407772415,AU -3407772416,3407772671,CN -3407772672,3407779839,AU -3407779840,3407780095,CN -3407780096,3407780863,AU -3407780864,3407781119,CN -3407781120,3407782399,AU -3407782400,3407782655,CN -3407782656,3407785215,AU -3407785216,3407785471,CN -3407785472,3407785727,NZ -3407785728,3407785983,CN -3407785984,3407788799,AU -3407788800,3407789055,CN -3407789056,3407790591,AU -3407790592,3407790847,CN -3407790848,3407796479,AU -3407796480,3407796735,CN -3407796736,3407797247,AU -3407797248,3407797503,CN -3407797760,3407798015,CN -3407798016,3407800319,AU -3407800320,3407800831,CN -3407800832,3407801087,AU -3407801088,3407801343,CN -3407801344,3407801855,ID -3407801856,3407802367,AU -3407802368,3407802879,CN -3407802880,3407803903,AU -3407803904,3407804159,CN -3407804160,3407804927,AU -3407804928,3407805439,CN -3407805440,3407805951,AU -3407805952,3407806463,ID -3407806464,3407808511,AU -3407808512,3407809023,IN -3407809024,3407814655,AU -3407814656,3407815167,HK -3407815168,3407817983,AU -3407817984,3407818495,CN -3407818496,3407819007,AU -3407819008,3407819263,CN -3407819264,3407819519,AU -3407819520,3407819775,CN -3407819776,3407820287,AU -3407820288,3407820799,CN -3407820800,3407824127,AU -3407824128,3407824383,CN -3407824384,3407824895,AU -3407824896,3407825151,CN -3407825152,3407826943,AU -3407826944,3407827199,CN -3407827200,3407828223,AU -3407828224,3407828479,CN -3407828480,3407828991,AU -3407828992,3407829503,US -3407829504,3407831295,AU -3407831296,3407831551,CN -3407831552,3407833343,AU -3407833344,3407833855,CN -3407833856,3407834111,AU -3407834112,3407834623,CN -3407834624,3407838207,AU -3407838208,3407838463,CN -3407838464,3407847935,AU -3407847936,3407848191,CN -3407848192,3407848447,AU -3407848448,3407848959,ID -3407848960,3407851007,AU -3407851008,3407851263,CN -3407851264,3407851775,AU -3407851776,3407852031,CN -3407852032,3407852799,AU -3407852800,3407853055,CN -3407853056,3407854335,AU -3407854336,3407854591,CN -3407854592,3407854847,AU -3407854848,3407855103,CN -3407855104,3407858687,AU -3407858688,3407858943,CN -3407858944,3407862783,AU -3407862784,3407863039,CN -3407863040,3407863295,AU -3407863296,3407863807,CN -3407863808,3407864063,AU -3407864064,3407864319,CN -3407864320,3407865087,AU -3407865088,3407865343,CN -3407865344,3407866367,AU -3407866368,3407866623,SG -3407866624,3407869951,AU -3407869952,3407870463,CN -3407870464,3407871231,AU -3407871232,3407871487,CN -3407871488,3407873023,AU -3407873024,3407873535,IN -3407873536,3407877119,AU -3407877120,3407877375,CN -3407877376,3407884287,AU -3407884288,3407884799,CN -3407884800,3407886335,AU -3407886336,3407886591,CN -3407886592,3407887359,AU -3407887360,3407887615,CN -3407887616,3407887871,AU -3407887872,3407888127,CN -3407888128,3407889407,AU -3407889408,3407889919,CN -3407889920,3407891455,AU -3407891456,3407891711,CN -3407891712,3407892735,AU -3407892736,3407892991,CN -3407892992,3407893503,AU -3407893504,3407894015,CN -3407894528,3407896319,AU -3407896320,3407896575,CN -3407896576,3407898111,AU -3407898112,3407898367,CN -3407898368,3407898879,AU -3407898880,3407899135,CN -3407899136,3407905279,AU -3407905280,3407905535,CN -3407905536,3407906047,AU -3407906048,3407906303,CN -3407906304,3407907839,AU -3407907840,3407908095,CN -3407908096,3407910911,AU -3407910912,3407911167,CN -3407911168,3407919615,AU -3407919616,3407920127,CN -3407920128,3407921151,AU -3407921152,3407921407,CN -3407921408,3407922175,AU -3407922176,3407922431,CN -3407922432,3407923967,AU -3407923968,3407924735,CN -3407924736,3407926271,AU -3407926272,3407926527,CN -3407926528,3407928575,AU -3407928576,3407928831,IN -3407928832,3407938559,AU -3407938560,3407938815,CN -3407938816,3407939327,AU -3407939328,3407939583,CN -3407939584,3407940607,SG -3407940608,3407941631,HK -3407941632,3407942911,AU -3407942912,3407943167,CN -3407943168,3407944191,AU -3407944192,3407944447,CN -3407944448,3407945727,AU -3407945728,3407945983,CN -3407945984,3407953663,AU -3407953664,3407954175,CN -3407954176,3407954687,AU -3407954688,3407955199,CN -3407955200,3407956223,AU -3407956224,3407956479,CN -3407956480,3407957759,AU -3407957760,3407958015,CN -3407958016,3407963135,AU -3407963136,3407963391,CN -3407963392,3407968767,AU -3407968768,3407969023,CN -3407969024,3407970559,AU -3407970560,3407970815,CN -3407970816,3407971071,AU -3407971072,3407971327,CN -3407971328,3407974655,AU -3407974656,3407974911,CN -3407974912,3407976447,AU -3407976448,3407976959,US -3407976960,3407977471,AU -3407977472,3407977727,CN -3407977728,3407977983,AU -3407977984,3407978495,CN -3407978496,3407982079,AU -3407982080,3407982335,CN -3407982336,3407984895,AU -3407984896,3407985151,CN -3407985152,3407987711,AU -3407987712,3407987967,PH -3407987968,3407988223,AU -3407988224,3407988735,IN -3407988736,3407988991,CN -3407988992,3407989247,AU -3407989248,3407990015,CN -3407990016,3407990271,AU -3407990272,3407990783,CN -3407990784,3407992319,AU -3407992320,3407992831,CN -3407992832,3407994879,AU -3407994880,3407995647,CN -3407995648,3407997183,AU -3407997184,3407997439,CN -3407997440,3407998975,AU -3407998976,3407999231,TH -3407999232,3407999743,AU -3407999744,3407999999,CN -3408000000,3408001535,AU -3408001536,3408001791,CN -3408001792,3408004095,AU -3408004096,3408004351,CN -3408004352,3408008447,AU -3408008448,3408008703,CN -3408008704,3408009983,AU -3408009984,3408010239,CN -3408010240,3408012543,AU -3408012544,3408012799,MN -3408012800,3408013055,AU -3408013056,3408013311,CN -3408013312,3408015359,AU -3408015360,3408015871,CN -3408015872,3408016895,AU -3408016896,3408017151,CN -3408017152,3408017407,AU -3408017408,3408017919,CN -3408017920,3408020223,AU -3408020224,3408020479,CN -3408020480,3408020735,JP -3408020736,3408020991,CN -3408020992,3408022527,AU -3408022528,3408022783,CN -3408022784,3408023807,AU -3408023808,3408024063,JP -3408024320,3408026623,AU -3408026624,3408026879,CN -3408026880,3408030207,AU -3408030208,3408030463,CN -3408030464,3408031999,AU -3408032000,3408032255,CN -3408032256,3408032767,AU -3408032768,3408033023,LK -3408033024,3408033279,IN -3408033280,3408033791,ID -3408033792,3408039935,AU -3408039936,3408040191,VN -3408040192,3408040703,AU -3408040704,3408040959,CN -3408040960,3408041471,AU -3408041472,3408041727,CN -3408041728,3408041983,AU -3408041984,3408042495,CN -3408042496,3408042751,MY -3408042752,3408044287,AU -3408044288,3408044799,CN -3408044800,3408050943,AU -3408050944,3408051199,CN -3408051200,3408052223,AU -3408052224,3408054271,HK -3408054272,3408055295,AU -3408055296,3408056319,CN -3408056320,3408062463,AU -3408062464,3408062719,CN -3408062720,3408064511,AU -3408064512,3408064767,CN -3408065024,3408065279,CN -3408065280,3408065791,AU -3408065792,3408066047,CN -3408066048,3408066303,PH -3408066304,3408067327,AU -3408067328,3408067583,CN -3408067584,3408111807,AU -3408111808,3408111808,US -3408111809,3409379839,AU -3409379840,3409380607,CN -3409380608,3409381887,AU -3409381888,3409382143,CN -3409382144,3409382655,AU -3409382656,3409382911,CN -3409382912,3409384959,AU -3409384960,3409385215,CN -3409385216,3409387007,AU -3409387008,3409387263,CN -3409387264,3409396479,AU -3409396480,3409396735,PH -3409396736,3409403135,AU -3409403136,3409403391,CN -3409403392,3409405183,AU -3409405184,3409405439,CN -3409405440,3409407231,AU -3409407232,3409407743,CN -3409407744,3409409023,AU -3409409024,3409409535,CN -3409409536,3409409791,AU -3409409792,3409410047,CN -3409410048,3409412095,AU -3409412096,3409412607,CN -3409412608,3409416703,AU -3409416704,3409417215,CN -3409417216,3409418495,AU -3409418496,3409418751,PL -3409418752,3409420287,AU -3409420288,3409420543,IN -3409420544,3409423615,AU -3409423616,3409423871,IN -3409423872,3409428479,AU -3409428480,3409428735,CN -3409428736,3409429503,AU -3409429504,3409429759,CN -3409429760,3409435135,AU -3409435136,3409435647,CN -3409435648,3409435903,AU -3409435904,3409436159,CN -3409436160,3409436671,AU -3409436672,3409436927,CN -3409436928,3409445119,AU -3409445120,3409445375,CN -3409445376,3409445887,AU -3409445888,3409446143,CN -3409446144,3409447935,AU -3409447936,3409448191,CN -3409448192,3409451007,AU -3409451008,3409451263,CN -3409451264,3409453055,AU -3409453056,3409453567,NZ -3409453568,3409454591,AU -3409454592,3409454847,CN -3409454848,3409455103,AU -3409455104,3409455359,CN -3409455360,3409456639,AU -3409456640,3409456895,CN -3409456896,3409457152,AU -3409457153,3409459199,HK -3409459200,3409462271,AU -3409462272,3409462783,CN -3409462784,3409465855,AU -3409465856,3409466879,CN -3409466880,3409467135,AU -3409467136,3409467391,HK -3409467392,3409467903,AU -3409467904,3409468415,HK -3409468416,3409469183,AU -3409469184,3409469439,CN -3409469440,3409473023,AU -3409473024,3409473279,CN -3409473280,3409475839,AU -3409475840,3409476095,CN -3409476096,3409486079,AU -3409486080,3409486335,CN -3409486336,3409488127,AU -3409488128,3409488383,CN -3409488384,3409488895,AU -3409488896,3409489407,CN -3409489408,3409489663,AU -3409489664,3409489919,CN -3409489920,3409491711,AU -3409491712,3409491967,CN -3409491968,3409492223,AU -3409492224,3409492479,CN -3409492480,3409492735,AU -3409492736,3409492991,CN -3409492992,3409494015,AU -3409494016,3409494271,CN -3409494272,3409495551,AU -3409495552,3409495807,CN -3409495808,3409496319,AU -3409496320,3409496575,CN -3409496576,3409498111,AU -3409498112,3409498879,CN -3409498880,3409499647,AU -3409499648,3409499903,CN -3409499904,3409500159,AU -3409500160,3409500415,CN -3409500416,3409502975,AU -3409502976,3409503487,CN -3409503488,3409503999,AU -3409504000,3409504511,CN -3409504512,3409506303,AU -3409506304,3409506559,CN -3409506560,3409506815,PH -3409506816,3409509375,AU -3409509376,3409509631,CN -3409509632,3409509887,HK -3409509888,3409510143,CN -3409510144,3409511679,AU -3409511680,3409512191,CN -3409512192,3409513471,AU -3409513472,3409513983,CN -3409513984,3409516543,AU -3409516544,3409517055,ID -3409517056,3409517567,AU -3409517568,3409517823,CN -3409517824,3409520383,AU -3409520384,3409520639,CN -3409520640,3409522175,AU -3409522176,3409522431,CN -3409522432,3409525247,AU -3409525248,3409525503,CN -3409525504,3409526015,AU -3409526016,3409526271,CN -3409526272,3409527295,AU -3409527296,3409527551,CN -3409527552,3409528063,AU -3409528064,3409528831,CN -3409528832,3409529087,AU -3409529088,3409529343,CN -3409529344,3409533439,AU -3409533440,3409533695,CN -3409533696,3409536255,AU -3409536256,3409536511,CN -3409536512,3409538303,AU -3409538304,3409538559,CN -3409538560,3409541887,AU -3409541888,3409542143,CN -3409542144,3409547519,AU -3409547520,3409547775,NZ -3409547776,3409550591,AU -3409550592,3409550847,CN -3409550848,3409561599,AU -3409561600,3409561855,CN -3409561856,3409562111,AU -3409562112,3409562367,CN -3409562368,3409563135,AU -3409563136,3409563391,CN -3409563392,3409567231,AU -3409567232,3409567487,CN -3409567488,3409567743,AU -3409567744,3409571839,CN -3409571840,3409573375,AU -3409573376,3409573887,CN -3409573888,3409574143,AU -3409574144,3409574399,CN -3409574400,3409575167,AU -3409575168,3409575935,CN -3409575936,3409707007,AU -3409707008,3409772543,HK -3409772544,3409838335,AU -3409838336,3409838591,MY -3409838592,3409838847,CN -3409838848,3409871615,AU -3409871616,3409871871,CN -3409871872,3409873663,AU -3409873664,3409873919,CN -3409873920,3409875967,AU -3409875968,3409876735,JP -3409876736,3409876991,AU -3409876992,3409878015,TH -3409878016,3409879295,AU -3409879296,3409879551,CN -3409879552,3409882111,AU -3409882112,3409883135,IN -3409883136,3409887999,AU -3409888000,3409888255,SG -3409888256,3409888511,AU -3409888512,3409888767,CN -3409888768,3409891327,AU -3409891328,3409891839,GB -3409891840,3409892351,AU -3409892352,3409892863,US -3409892864,3409896447,AU -3409896448,3409897471,CN -3409897472,3409897983,AU -3409897984,3409898239,CN -3409898240,3409901055,AU -3409901056,3409901311,CN -3409901312,3409969151,AU -3409969152,3410755583,TW -3410755584,3410771967,AU -3410771968,3410780159,JP -3410780160,3410788351,BD -3410788352,3410792447,IN -3410792448,3410796543,BD -3410796544,3410797567,CN -3410797568,3410798591,JP -3410798592,3410799615,CN -3410799616,3410800639,SG -3410800640,3410804735,IN -3410804736,3410808831,PH -3410808832,3410811903,CN -3410811904,3410812927,BD -3410812928,3410813951,AU -3410813952,3410814975,IN -3410814976,3410817023,HK -3410817024,3410818047,CN -3410818048,3410818815,JP -3410818816,3410819071,CN -3410819072,3410820095,IN -3410820096,3410821119,LA -3410821120,3410853887,TW -3410853888,3410862079,HK -3410862080,3410866175,AU -3410866176,3410866431,KR -3410866432,3410866687,IN -3410866688,3410866943,VN -3410866944,3410867199,AU -3410867200,3410868223,CN -3410868224,3410870271,JP -3410870272,3410874367,IN -3410874368,3410886655,ID -3410886656,3410887679,TW -3410887680,3410887935,IN -3410887936,3410888703,HK -3410888704,3410890751,SG -3410890752,3410894847,AU -3410894848,3410898943,HK -3410898944,3410903039,CN -3410903040,3410911231,HK -3410911232,3410915327,TH -3410915328,3410919423,ID -3410919424,3410920447,IN -3410920448,3410921471,JP -3410921472,3410923519,HK -3410923520,3410924543,BD -3410924544,3410925567,SG -3410925568,3410926591,MH -3410926592,3410927615,CN -3410927616,3410931711,NP -3410931712,3410935807,TW -3410935808,3410939903,MY -3410939904,3410943999,IN -3410944000,3410952191,JP -3410952192,3410956287,CN -3410956288,3410958335,AU -3410958336,3410958847,IN -3410958848,3410959359,ID -3410959360,3410959615,VN -3410959616,3410959871,ID -3410959872,3410960383,AU -3410960384,3410960447,GB -3410960448,3410960463,SG -3410960464,3410962175,GB -3410962176,3410962207,SG -3410962208,3410962431,GB -3410962432,3410964223,HK -3410964224,3410964479,GB -3410964480,3410968575,JP -3410968576,3410984959,NZ -3410984960,3411017727,TW -3411017728,3411018751,HK -3411018752,3411019263,CN -3411019264,3411019775,JP -3411019776,3411021823,ID -3411021824,3411023871,MY -3411023872,3411025919,JP -3411025920,3411030015,CN -3411030016,3411032063,NC -3411032064,3411032319,TH -3411032320,3411032575,CN -3411032576,3411033087,AU -3411033088,3411034111,NZ -3411034112,3411050495,HK -3411050496,3411050751,PK -3411050752,3411051007,CN -3411051008,3411051263,PK -3411051264,3411051519,SG -3411051520,3411052543,CN -3411052544,3411052544,JP -3411052545,3411052799,HK -3411052800,3411053055,JP -3411053056,3411054591,HK -3411054592,3411058687,CN -3411058688,3411061247,AU -3411061248,3411061759,KH -3411061760,3411062783,AU -3411062784,3411064831,HK -3411064832,3411065087,BD -3411065088,3411065855,HK -3411065856,3411066879,BD -3411066880,3411085311,HK -3411085312,3411086335,KR -3411086336,3411087359,JP -3411087360,3411091455,CN -3411091456,3411092223,SG -3411092224,3411092479,JP -3411092480,3411092735,SG -3411092736,3411092991,JP -3411092992,3411093055,SG -3411093056,3411093087,JP -3411093088,3411093119,SG -3411093120,3411093215,JP -3411093216,3411093247,SG -3411093248,3411093503,JP -3411093504,3411093631,SG -3411093632,3411093695,JP -3411093696,3411093759,SG -3411093760,3411094015,JP -3411094016,3411094279,SG -3411094280,3411094287,JP -3411094288,3411094319,SG -3411094320,3411094334,JP -3411094335,3411094527,SG -3411094528,3411095295,JP -3411095296,3411099647,SG -3411099648,3411107839,MM -3411107840,3411111935,LK -3411111936,3411116031,JP -3411116032,3411124223,KR -3411124224,3411128319,MM -3411128320,3411130367,HK -3411130368,3411132415,ID -3411132416,3411144703,PK -3411144704,3411145727,IN -3411145728,3411146751,CN -3411146752,3411147775,ID -3411147776,3411148799,HK -3411148800,3411149311,CN -3411149312,3411149823,MV -3411149824,3411150847,IN -3411150848,3411154943,HK -3411154944,3411155199,US -3411155200,3411155455,AU -3411155456,3411155711,US -3411155712,3411155967,AU -3411155968,3411156991,HK -3411156992,3411161087,PH -3411161088,3411165183,PK -3411165184,3411173375,MY -3411173376,3411177471,AU -3411177472,3411181567,CN -3411181568,3411189503,JP -3411189504,3411189759,HK -3411189760,3411197951,AU -3411197952,3411202047,BD -3411202048,3411204607,AU -3411204864,3411205631,KR -3411205632,3411206143,HK -3411206144,3411210239,CN -3411210240,3411212287,KR -3411212288,3411213311,IN -3411213312,3411214335,HK -3411214336,3411215359,CN -3411215360,3411216383,AU -3411216384,3411218431,CN -3411218432,3411220479,PG -3411220480,3411226623,ID -3411226624,3411228671,IO -3411228672,3411230719,CN -3411230720,3411247103,HK -3411247104,3411255295,KR -3411255296,3411263487,BD -3411263488,3411269631,AU -3411269632,3411270143,HK -3411270144,3411270399,NZ -3411270400,3411270655,AU -3411270656,3411271679,SG -3411271680,3411275775,CN -3411275776,3411277823,JP -3411277824,3411278335,HK -3411278336,3411278591,SG -3411278592,3411278847,FJ -3411278848,3411296255,HK -3411296256,3411312639,AU -3411312640,3411313151,HK -3411313152,3411313663,SG -3411313664,3411313919,AU -3411313920,3411314175,HK -3411314176,3411314687,NZ -3411314688,3411316735,ID -3411316736,3411318783,TW -3411318784,3411320831,ID -3411320832,3411329023,PH -3411329024,3411337215,HK -3411337216,3411341311,AU -3411341312,3411345407,KR -3411345408,3411354879,HK -3411354880,3411355647,SG -3411355648,3411376127,HK -3411376128,3411376383,US -3411376384,3411410943,HK -3411410944,3411443711,CN -3411443712,3411460095,HK -3411460096,3411464191,NZ -3411464192,3411468287,AU -3411468288,3411470335,JP -3411470336,3411472383,HK -3411472384,3411474943,JP -3411474944,3411475199,CN -3411475200,3411475455,AU -3411475456,3411475967,HK -3411475968,3411476479,CN -3411476480,3411509247,AU -3411509248,3411542015,PH -3411542016,3411550207,IN -3411550208,3411558399,CN -3411558400,3411566591,HK -3411566592,3411567615,IN -3411567616,3411568639,GB -3411568640,3411569663,AU -3411569664,3411570687,HK -3411570688,3411574783,AU -3411574784,3411582975,IN -3411582976,3411587071,HK -3411587072,3411591167,JP -3411591168,3411599359,CN -3411599360,3411607551,AU -3411607552,3411608575,CN -3411608576,3411608831,IN -3411608832,3411609087,AU -3411609088,3411609599,HK -3411609600,3411610623,CN -3411610624,3411611647,HK -3411611648,3411615743,ID -3411615744,3411623935,JP -3411623936,3411632127,AU -3411640320,3411641343,JP -3411641344,3411641599,IN -3411641600,3411641855,CN -3411641856,3411642367,IN -3411642368,3411643391,CN -3411643392,3411644415,VN -3411644416,3411644671,CN -3411644672,3411644927,AU -3411644928,3411645951,ID -3411645952,3411646207,SG -3411646208,3411647487,IN -3411647488,3411648511,AU -3411648512,3411656703,NZ -3411656704,3411673087,AU -3411673088,3411674111,CN -3411674112,3411674623,IN -3411674624,3411675135,HK -3411675136,3411677183,CN -3411677184,3411679231,JP -3411679232,3411681279,AU -3411681280,3411689471,KR -3411689472,3411705855,IN -3411705856,3411730431,CN -3411730432,3411738623,HK -3411738624,3411746815,TW -3411746816,3411755007,CN -3411755008,3411763199,AU -3411763200,3411767295,CN -3411767296,3411769343,MN -3411769344,3411771391,CN -3411771392,3411779583,HK -3411779584,3411787775,JP -3411787776,3411795967,IN -3411795968,3411804159,AU -3411804160,3411805183,CN -3411805184,3411805695,PK -3411805696,3411805951,CN -3411805952,3411806207,AU -3411806208,3411808255,PH -3411808256,3411810303,JP -3411810304,3411810815,NZ -3411810816,3411812351,AU -3411812352,3411820543,IN -3411820544,3411836927,SG -3411836928,3411845119,MY -3411845120,3411853311,CN -3411853312,3411857407,IN -3411857408,3411859249,JP -3411859250,3411859251,AU -3411859252,3411859815,JP -3411859816,3411859816,CN -3411859817,3411861503,JP -3411861504,3411869695,AU -3411869696,3411943423,CN -3411943424,3411951615,NZ -3411951616,3411967999,LK -3411968000,3411984383,AU -3411984384,3412000767,IN -3412000768,3412002815,CN -3412002816,3412004863,GU -3412004864,3412017151,JP -3412017152,3412025343,SG -3412025344,3412049919,CN -3412049920,3412050943,HK -3412050944,3412051967,KH -3412051968,3412055039,CN -3412055040,3412056063,HK -3412056064,3412057087,IN -3412057088,3412058111,BD -3412058112,3412066303,CN -3412066304,3412213759,NZ -3412213760,3412221951,AU -3412221952,3412230143,IN -3412230144,3412246527,HK -3412246528,3412249903,AU -3412249904,3412249919,SG -3412249920,3412253695,AU -3412253696,3412254719,JP -3412254720,3412262911,NR -3412262912,3412264959,JP -3412264960,3412267007,HK -3412267008,3412271103,CN -3412271104,3412273151,NZ -3412273152,3412275199,IN -3412275200,3412279295,PK -3412279296,3412281343,NZ -3412281344,3412283391,JP -3412283392,3412287487,CN -3412287488,3412295679,ID -3412295680,3412296191,NZ -3412296192,3412296703,ID -3412296704,3412297727,NZ -3412297728,3412298751,MY -3412298752,3412299263,TH -3412299264,3412299519,AU -3412299520,3412299775,HK -3412299776,3412302847,AU -3412302848,3412303871,WS -3412303872,3412312063,PK -3412312064,3412320255,IN -3412320256,3412322303,JP -3412322304,3412324351,PH -3412324352,3412326399,JP -3412326400,3412327423,VN -3412327424,3412327935,TH -3412327936,3412328191,HK -3412328192,3412328447,WS -3412328448,3412336639,AU -3412336640,3412340735,CN -3412340736,3412342783,HK -3412342784,3412343039,AU -3412343040,3412343295,HK -3412343296,3412343551,CN -3412343552,3412343807,AU -3412343808,3412344063,CN -3412344064,3412344319,AU -3412344320,3412344575,SG -3412344576,3412344831,CN -3412344832,3412348927,IN -3412348928,3412361215,CN -3412361216,3412369407,JP -3412369408,3412377599,KR -3412377600,3412381695,CN -3412381696,3412385791,NZ -3412385792,3412393983,AU -3412393984,3412426751,IN -3412426752,3412433759,TH -3412433760,3412433775,ID -3412433776,3412433791,TH -3412433792,3412433823,HK -3412433824,3412434943,TH -3412434944,3412443135,PK -3412443136,3412451327,SG -3412451328,3412594687,AU -3412594688,3412596735,IN -3412596736,3412598783,MV -3412598784,3412602879,CN -3412602880,3412606975,NC -3412606976,3412615167,PH -3412615168,3412631551,JP -3412631552,3412639743,SG -3412639744,3412656127,JP -3412656128,3412672511,HK -3412672512,3412680703,JP -3412680704,3412697087,CN -3412697088,3412705279,IN -3412705280,3412713471,AU -3412713472,3412721663,TW -3412721664,3412787199,MY -3412787200,3412819967,CN -3412819968,3412852735,TH -3412852736,3412918271,AU -3412918272,3412926463,KR -3412926464,3412934655,MY -3412934656,3412951039,IN -3412951040,3413000191,NZ -3413000192,3413004287,LA -3413004288,3413008383,IN -3413008384,3413016575,JP -3413016576,3413024767,AU -3413024768,3413032959,CN -3413032960,3413037055,AU -3413037056,3413041151,CN -3413041152,3413043199,JP -3413043200,3413043967,CN -3413043968,3413044223,AU -3413044224,3413045247,HK -3413045248,3413047295,IN -3413047296,3413098495,AU -3413098496,3413102591,JP -3413102592,3413106687,TW -3413106688,3413110783,PH -3413110784,3413112831,JP -3413112832,3413113855,IN -3413113856,3413114879,HK -3413114880,3413133311,JP -3413133312,3413135359,BD -3413135360,3413139455,HK -3413139456,3413147647,AU -3413147648,3413155839,IN -3413155840,3413164031,SG -3413164032,3413172223,BD -3413172224,3413180415,MY -3413180416,3413213183,TH -3413213184,3413229567,VN -3413229568,3413245951,AU -3413245952,3413251071,MY -3413251072,3413262335,JP -3413262336,3413263359,PH -3413263360,3413264383,US -3413264384,3413264639,SG -3413264640,3413264895,AU -3413264896,3413265151,ID -3413265152,3413265407,SG -3413265408,3413266431,AU -3413266432,3413270527,CN -3413270528,3413278719,TH -3413278720,3413295103,NZ -3413295104,3413303295,JP -3413303296,3413304319,ID -3413304320,3413305343,JP -3413305344,3413306367,IN -3413306368,3413307391,PH -3413307392,3413308415,IN -3413308416,3413309439,CN -3413309440,3413310463,JP -3413310464,3413311487,HK -3413311488,3413327871,LK -3413327872,3413344255,IN -3413344256,3413360639,PH -3413360640,3413377023,MY -3413377024,3413524479,SG -3413524480,3413540863,TH -3413540864,3413557247,NZ -3413557248,3413565439,CN -3413565440,3413569535,TW -3413569536,3413569791,SG -3413569792,3413570047,CN -3413570048,3413570303,KH -3413570304,3413570559,AU -3413570560,3413571583,PH -3413571584,3413572607,CN -3413572608,3413573631,JP -3413573632,3413573887,AU -3413573888,3413574143,JP -3413574144,3413574399,HK -3413574400,3413574655,TW -3413574656,3413575679,PH -3413575680,3413576703,VN -3413576704,3413576959,AU -3413576960,3413577215,ID -3413577216,3413577727,AU -3413577728,3413578751,JP -3413578752,3413579007,PK -3413579008,3413579263,AU -3413579264,3413579775,JP -3413579776,3413582847,CN -3413582848,3413583871,VN -3413583872,3413584127,JP -3413584128,3413584383,ID -3413584384,3413584895,AU -3413584896,3413585919,VN -3413585920,3413586175,ID -3413586176,3413586687,IN -3413586688,3413586943,FJ -3413586944,3413587967,ID -3413587968,3413588223,NZ -3413588224,3413588479,MY -3413588480,3413593087,VN -3413593088,3413593599,AU -3413593600,3413593855,SG -3413593856,3413594111,KH -3413594112,3413595135,CN -3413595136,3413595391,NZ -3413595392,3413595647,CN -3413595648,3413595903,AU -3413595904,3413596159,HK -3413596160,3413597183,NP -3413597184,3413597695,AU -3413597696,3413597951,TW -3413597952,3413602303,AU -3413602304,3413602559,ID -3413602560,3413604351,CN -3413604352,3413606399,HK -3413606400,3413639167,CN -3413639168,3413639423,SG -3413639424,3413639679,JP -3413639680,3413640479,SG -3413640480,3413640959,JP -3413640960,3413643519,SG -3413643520,3413643775,JP -3413643776,3413644459,SG -3413644460,3413644479,JP -3413644480,3413644511,SG -3413644512,3413644527,JP -3413644528,3413645055,SG -3413645056,3413645311,JP -3413645312,3413646079,SG -3413646080,3413646399,JP -3413646400,3413646479,SG -3413646480,3413646591,JP -3413646592,3413646847,SG -3413646848,3413646895,JP -3413646896,3413646935,SG -3413646936,3413646943,JP -3413646944,3413646959,SG -3413646960,3413646975,JP -3413646976,3413647047,SG -3413647048,3413647055,JP -3413647056,3413647103,SG -3413647104,3413647423,JP -3413647424,3413647455,SG -3413647456,3413647871,JP -3413647872,3413648383,SG -3413648384,3413648399,JP -3413648400,3413648591,SG -3413648592,3413648607,JP -3413648608,3413648623,SG -3413648624,3413648639,JP -3413648640,3413649375,SG -3413649376,3413649407,JP -3413649408,3413649727,SG -3413649728,3413649743,JP -3413649744,3413649759,SG -3413649760,3413649775,JP -3413649776,3413649807,SG -3413649808,3413649823,JP -3413649824,3413649855,SG -3413649856,3413649871,JP -3413649872,3413649919,SG -3413649920,3413650175,JP -3413650176,3413650943,SG -3413650944,3413651199,JP -3413651200,3413651455,SG -3413651456,3413651967,JP -3413651968,3413652479,SG -3413652480,3413652735,JP -3413652736,3413653247,SG -3413653248,3413653503,JP -3413653504,3413654271,SG -3413654272,3413654783,JP -3413654784,3413655295,SG -3413655296,3413656831,JP -3413656832,3413657087,SG -3413657088,3413657343,JP -3413657344,3413657599,SG -3413657600,3413658879,JP -3413658880,3413659135,SG -3413659136,3413659903,JP -3413659904,3413660159,SG -3413660160,3413661183,JP -3413661184,3413661439,SG -3413661440,3413661951,JP -3413661952,3413662463,SG -3413662464,3413662719,JP -3413662720,3413662975,SG -3413662976,3413664255,JP -3413664256,3413664511,SG -3413664512,3413665023,JP -3413665024,3413665279,SG -3413665280,3413665535,JP -3413665536,3413665983,SG -3413665984,3413666047,JP -3413666048,3413666303,SG -3413666304,3413666815,JP -3413666816,3413667583,SG -3413667584,3413667839,JP -3413667840,3413670399,SG -3413670400,3413670655,JP -3413670656,3413670719,SG -3413670720,3413670735,JP -3413670736,3413670751,SG -3413670752,3413670783,JP -3413670784,3413670815,SG -3413670816,3413670847,JP -3413670848,3413670879,SG -3413670880,3413670911,JP -3413670912,3413671167,SG -3413671168,3413671363,JP -3413671364,3413671395,SG -3413671396,3413671423,JP -3413671424,3413671711,SG -3413671712,3413671743,JP -3413671744,3413672447,SG -3413672448,3413672511,JP -3413672512,3413672703,SG -3413672704,3413672767,JP -3413672768,3413672831,SG -3413672832,3413672959,JP -3413672960,3413674511,SG -3413674512,3413674815,JP -3413674816,3413674911,SG -3413674912,3413674959,JP -3413674960,3413676671,SG -3413676672,3413676831,JP -3413676832,3413676863,SG -3413676864,3413676864,JP -3413676865,3413676991,SG -3413676992,3413677055,JP -3413677056,3413678591,SG -3413678592,3413678847,JP -3413678848,3413679103,SG -3413679104,3413679359,JP -3413679360,3413679615,SG -3413679616,3413679743,JP -3413679744,3413679807,SG -3413679808,3413679871,JP -3413679872,3413680127,SG -3413680128,3413680639,JP -3413680640,3413680895,SG -3413680896,3413681151,JP -3413681152,3413681343,SG -3413681344,3413681407,JP -3413681408,3413683487,SG -3413683488,3413683519,JP -3413683520,3413683663,SG -3413683664,3413683679,JP -3413683680,3413683711,SG -3413683712,3413683967,JP -3413683968,3413685375,SG -3413685376,3413685391,JP -3413685392,3413685407,SG -3413685408,3413685503,JP -3413685504,3413685759,SG -3413685760,3413685823,JP -3413685824,3413685855,SG -3413685856,3413685887,JP -3413685888,3413685919,SG -3413685920,3413685951,JP -3413685952,3413686271,SG -3413686272,3413686335,JP -3413686336,3413686368,SG -3413686369,3413686783,JP -3413686784,3413687807,SG -3413687808,3413687999,JP -3413688000,3413688063,SG -3413688064,3413688319,JP -3413688320,3413688927,SG -3413688928,3413688959,JP -3413688960,3413688991,SG -3413688992,3413689087,JP -3413689088,3413689599,SG -3413689600,3413689847,JP -3413689848,3413689851,SG -3413689852,3413689855,JP -3413689856,3413690367,SG -3413690368,3413690623,JP -3413690624,3413691391,SG -3413691392,3413691647,JP -3413691648,3413693247,SG -3413693248,3413693279,JP -3413693280,3413693311,SG -3413693312,3413693375,JP -3413693376,3413695487,SG -3413695488,3413695999,JP -3413696000,3413696527,SG -3413696528,3413696639,JP -3413696640,3413696671,SG -3413696672,3413696703,JP -3413696704,3413696735,SG -3413696736,3413696831,JP -3413696832,3413696863,SG -3413696864,3413696959,JP -3413696960,3413696967,SG -3413696968,3413696991,JP -3413696992,3413697023,SG -3413697024,3413697119,JP -3413697120,3413697151,SG -3413697152,3413697207,JP -3413697208,3413697215,SG -3413697216,3413697263,JP -3413697264,3413697407,SG -3413697408,3413697535,JP -3413697536,3413699839,SG -3413699840,3413699967,JP -3413699968,3413700063,SG -3413700064,3413700351,JP -3413700352,3413700607,SG -3413700608,3413700639,JP -3413700640,3413700671,SG -3413700672,3413700767,JP -3413700768,3413700863,SG -3413700864,3413700895,JP -3413700896,3413700927,SG -3413700928,3413701023,JP -3413701024,3413701055,SG -3413701056,3413701119,JP -3413701120,3413703167,SG -3413703168,3413703231,JP -3413703232,3413703295,SG -3413703296,3413703359,JP -3413703360,3413704447,SG -3413704448,3413704639,JP -3413704640,3413704703,SG -3413704704,3413737471,MY -3413737472,3413742079,SG -3413742080,3413742591,TH -3413742592,3413744127,SG -3413744128,3413745407,TH -3413745408,3413747455,SG -3413747456,3413747711,JP -3413747712,3413748223,SG -3413748224,3413748479,JP -3413748480,3413749503,SG -3413749504,3413749759,JP -3413749760,3413750079,TH -3413750080,3413750143,JP -3413750144,3413750271,TH -3413750272,3413751039,SG -3413751040,3413751295,JP -3413751296,3413751551,SG -3413751552,3413752063,JP -3413752064,3413752575,SG -3413752576,3413752831,JP -3413752832,3413753087,SG -3413753088,3413753855,TH -3413753856,3413762047,AU -3413762048,3413770239,TW -3413770240,3413786623,IN -3413786624,3413835775,AU -3413835776,3413843967,SG -3413843968,3413848063,IN -3413848064,3413850111,SG -3413850112,3413850623,ID -3413850624,3413850879,CN -3413850880,3413851135,AU -3413851136,3413852159,ID -3413852160,3413868543,AU -3413868544,3413884927,IN -3413884928,3413893119,KR -3413893120,3413901311,ID -3413901312,3413902847,SG -3413902848,3413903359,JP -3413903360,3413905407,HK -3413905408,3413907455,IN -3413907456,3413917695,PK -3413917696,3413925887,JP -3413925888,3413934079,SG -3413934080,3413946367,IN -3413946368,3413950463,AU -3413950464,3413966847,IN -3413966848,3414050303,SG -3414050304,3414050815,US -3414050816,3414155519,SG -3414155520,3414155775,PH -3414155776,3414163455,SG -3414163456,3414171647,PK -3414171648,3414179839,CN -3414179840,3414188031,ID -3414188032,3414196223,CN -3414196224,3414204415,AU -3414204416,3414220799,KR -3414220800,3414222847,HK -3414222848,3414223871,AU -3414223872,3414224895,KR -3414224896,3414226943,VN -3414226944,3414227967,ID -3414227968,3414230015,PK -3414230016,3414230527,PH -3414230528,3414231039,KR -3414231040,3414233087,HK -3414233088,3414245375,AU -3414245376,3414253567,HK -3414253568,3414261759,JP -3414261760,3414269951,AU -3414269952,3414278143,JP -3414278144,3414294527,IN -3414294528,3414302719,PK -3414302720,3414310911,CN -3414310912,3414327295,KR -3414327296,3414335487,TH -3414335488,3414339583,AU -3414339584,3414343679,KR -3414343680,3414360063,ID -3414360064,3414376447,AU -3414376448,3414409215,PH -3414409216,3414413311,JP -3414413312,3414417407,TH -3414417408,3414425599,HK -3414425600,3414431743,AU -3414431744,3414432767,US -3414432768,3414433791,AU -3414433792,3414441983,CN -3414441984,3414450175,AU -3414450176,3414458367,JP -3414458368,3414466559,IN -3414466560,3414474751,KR -3414474752,3414478847,HK -3414478848,3414482943,IN -3414482944,3414491135,AU -3414491136,3414523903,TW -3414523904,3414532095,JP -3414532096,3414540287,KR -3414540288,3414554623,JP -3414554624,3414555647,AU -3414555648,3414556671,PK -3414556672,3414605823,AU -3414605824,3414616063,IN -3414616064,3414618111,ID -3414618112,3414620159,CN -3414620160,3414621183,IN -3414621184,3414638591,PK -3414638592,3414646783,TW -3414646784,3414654975,CN -3414654976,3414663167,HK -3414663168,3414667263,CN -3414667264,3414669311,ID -3414669312,3414670335,AU -3414670336,3414670591,IN -3414670592,3414670847,SG -3414670848,3414671359,MY -3414671360,3415080959,JP -3415080960,3415082239,MY -3415082240,3415083007,SG -3415083008,3415083519,AU -3415083520,3415084031,SG -3415084032,3415084543,CN -3415084544,3415085055,US -3415085056,3415087615,SG -3415087616,3415087871,US -3415087872,3415088127,SG -3415088128,3415089151,HK -3415089152,3415097343,MY -3415097344,3415103487,ID -3415103488,3415113727,HK -3415113728,3415121919,AU -3415121920,3415130111,KR -3415130112,3415136255,JP -3415136256,3415136767,KR -3415136768,3415137023,PK -3415137024,3415137279,CN -3415137280,3415137535,IN -3415137536,3415137791,NF -3415137792,3415138303,AU -3415138304,3415146495,CN -3415146496,3415162879,LK -3415162880,3415171071,AU -3415171072,3415179263,JP -3415179264,3415187455,SG -3415187456,3415191551,AU -3415191552,3415195647,IN -3415195648,3415199743,NZ -3415199744,3415220223,AU -3415220224,3415224319,NZ -3415224320,3415228415,US -3415228416,3415236607,KH -3415236608,3415244799,CN -3415244800,3415277567,TH -3415277568,3415285759,CN -3415285760,3415293951,AU -3415293952,3415302143,HK -3415302144,3415306239,JP -3415306240,3415308287,TH -3415308288,3415310335,JP -3415310336,3415326719,IN -3415326720,3415334911,TW -3415334912,3415343103,JP -3415343104,3415425023,TH -3415425024,3415431167,NC -3415431168,3415432191,IN -3415432192,3415435263,AU -3415435264,3415436287,PH -3415436288,3415436799,AU -3415436800,3415437311,HK -3415437312,3415441407,JP -3415441408,3415474175,AU -3415474176,3415495679,CN -3415495680,3415496191,ID -3415496192,3415496703,CN -3415496704,3415497727,BD -3415497728,3415497983,TW -3415497984,3415498751,AU -3415498752,3415506943,JP -3415506944,3415556095,TH -3415556096,3415563263,AU -3415563264,3415564287,CN -3415564288,3415568383,JP -3415568384,3415572479,KR -3415572480,3415605247,SG -3415605248,3415736319,TH -3415736320,3415737599,SG -3415737600,3415737855,JP -3415737856,3415738879,SG -3415738880,3415739135,JP -3415739136,3415740159,SG -3415740160,3415740415,JP -3415740416,3415741695,SG -3415741696,3415741951,JP -3415741952,3415742207,SG -3415742208,3415742463,JP -3415742464,3415746815,SG -3415746816,3415747071,JP -3415747072,3415747839,SG -3415747840,3415748351,JP -3415748352,3415749375,SG -3415749376,3415749631,JP -3415749632,3415749887,TH -3415749888,3415750143,SG -3415750144,3415750399,JP -3415750400,3415751423,SG -3415751424,3415751679,JP -3415751680,3415752191,TH -3415752192,3415752703,SG -3415752704,3415760895,CN -3415760896,3415769087,NZ -3415769088,3415777279,CN -3415777280,3415785471,KR -3415785472,3415793663,JP -3415793664,3415801855,AU -3415801856,3415802879,CN -3415802880,3415803391,HK -3415803392,3415805951,PH -3415805952,3415806975,AU -3415806976,3415810047,ID -3415810048,3415814399,IN -3415814400,3415814655,ID -3415814656,3415815167,TH -3415815168,3415816191,IN -3415816192,3415817215,JP -3415817216,3415818239,MY -3415818240,3415822335,JP -3415822336,3415822847,MY -3415822848,3415823103,MV -3415823104,3415826431,MY -3415826432,3415834623,ID -3415834624,3415838719,TH -3415838720,3415842815,KR -3415842816,3415851007,TH -3415851008,3415855103,AU -3415855104,3415856127,IN -3415856128,3415858175,ID -3415858176,3415859199,LK -3415859200,3415867391,AU -3415867392,3416047615,TH -3416047616,3416063999,CN -3416064000,3416131583,TH -3416131584,3416133631,PH -3416133632,3416135679,CN -3416135680,3416137727,MY -3416137728,3416145919,AU -3416145920,3416154111,IN -3416154112,3416215551,TH -3416215552,3416219647,NL -3416219648,3416260607,TH -3416260608,3416261119,VN -3416261120,3416261631,AU -3416261632,3416262655,TH -3416262656,3416264703,AU -3416264704,3416268799,JP -3416268800,3416272895,HK -3416272896,3416273919,ID -3416273920,3416274943,HK -3416274944,3416276991,ID -3416276992,3416285183,HK -3416285184,3416285247,VN -3416285248,3416285251,CN -3416285252,3416287231,VN -3416287232,3416289279,HK -3416289280,3416293375,NZ -3416293376,3416293631,ID -3416293632,3416293887,CN -3416293888,3416294399,PH -3416294400,3416295423,VN -3416295424,3416295679,IN -3416295680,3416295935,TH -3416295936,3416296447,IN -3416296448,3416297471,KR -3416297472,3416301567,TW -3416301568,3416309759,PH -3416309760,3416317951,CN -3416317952,3416326143,TW -3416326144,3416327167,CN -3416327168,3416328191,HK -3416328192,3416330239,AU -3416330240,3416334335,ID -3416334336,3416339455,SG -3416339456,3416339711,IN -3416339712,3416342527,SG -3416342528,3416371199,AU -3416371200,3416371711,PH -3416371712,3416371967,VN -3416371968,3416372223,PK -3416372224,3416372479,CN -3416372480,3416372735,SG -3416372736,3416372991,AU -3416372992,3416373247,CN -3416373248,3416373759,ID -3416373760,3416374271,AU -3416374272,3416374527,PH -3416374528,3416374783,IN -3416374784,3416375295,ID -3416375296,3416383487,CN -3416383488,3416391679,HK -3416391680,3416457215,VN -3416457216,3416474583,JP -3416474584,3416474599,AU -3416474600,3416482127,JP -3416482128,3416482133,SG -3416482134,3416489755,JP -3416489756,3416489759,AU -3416489760,3416489983,JP -3416489984,3416506367,VN -3416506368,3416514559,TW -3416514560,3416522751,IN -3416522752,3416588287,AU -3416588288,3416653823,JP -3416653824,3416686591,AU -3416686592,3416694783,SG -3416694784,3416702975,CN -3416702976,3416707071,ID -3416707072,3416709119,KR -3416709120,3416709375,AU -3416709376,3416709631,ID -3416709632,3416710143,AU -3416710144,3416711167,HK -3416711168,3416719359,AU -3416719360,3416721407,PH -3416721408,3416723199,VN -3416723200,3416723455,TW -3416723456,3416724479,KH -3416724480,3416725503,HK -3416725504,3416726527,AU -3416726528,3416727551,CN -3416727552,3416735743,JP -3416735744,3416752127,PH -3416752128,3416784895,NZ -3416784896,3416793087,CN -3416793088,3416801279,AU -3416801280,3416817663,JP -3416817664,3416850431,HK -3416850432,3416851455,PH -3416851456,3416851967,KR -3416851968,3416852479,SG -3416852480,3416854527,JP -3416854528,3416856575,AU -3416856576,3416858623,BD -3416858624,3416862719,HK -3416862720,3416864767,MN -3416864768,3416864895,JP -3416864896,3416865023,SG -3416865024,3416865151,HK -3416865152,3416865279,SG -3416865280,3416865287,JP -3416865288,3416865295,HK -3416865296,3416865303,AU -3416865304,3416865311,HK -3416865312,3416865327,SG -3416865328,3416865343,HK -3416865344,3416865359,JP -3416865360,3416865407,HK -3416865408,3416865599,JP -3416865600,3416865655,HK -3416865656,3416865791,JP -3416865792,3416865919,SG -3416865920,3416866055,HK -3416866056,3416866071,SG -3416866072,3416866079,HK -3416866080,3416866095,SG -3416866096,3416866559,HK -3416866560,3416883199,SG -3416883200,3416915967,HK -3416915968,3416920063,AU -3416920064,3416921087,TH -3416921088,3416922111,PH -3416922112,3416922367,AU -3416922368,3416922623,IN -3416922624,3416923135,VN -3416923136,3416924159,HK -3416924160,3416928255,JP -3416928256,3416928511,IN -3416928512,3416928767,HK -3416928768,3416929279,TH -3416929280,3416930303,JP -3416930304,3416930559,NZ -3416930560,3416930815,AU -3416930816,3416931327,CN -3416931328,3416932351,IN -3416932352,3416936447,PK -3416936448,3416937215,AU -3416937216,3416937471,HK -3416937472,3416939007,AU -3416939008,3416939519,HK -3416939520,3416940543,AU -3416940544,3416948735,KR -3416948736,3416981503,TH -3416981504,3416982527,CN -3416982528,3416982783,NZ -3416982784,3416983039,AU -3416983040,3416983551,PH -3416983552,3416985599,JP -3416985600,3416989695,VN -3416989696,3416997887,NZ -3416997888,3417014271,AU -3417014272,3417022463,JP -3417022464,3417030655,KR -3417030656,3417034751,AU -3417034752,3417035007,CN -3417035008,3417035775,IN -3417035776,3417036799,JP -3417036800,3417037823,ID -3417037824,3417038079,AU -3417038080,3417038335,ID -3417038336,3417038591,IN -3417038592,3417038847,NZ -3417038848,3417042943,CN -3417042944,3417044991,IN -3417044992,3417045247,AU -3417045248,3417045311,CX -3417045312,3417045375,AU -3417045376,3417045759,CX -3417045760,3417045823,AU -3417045824,3417046015,CX -3417046016,3417047039,AU -3417047040,3417055231,PH -3417055232,3417112575,TH -3417112576,3417128959,AU -3417128960,3417135103,JP -3417135104,3417137151,ID -3417137152,3417145343,KR -3417145344,3417178111,NZ -3417178112,3417179135,PH -3417179136,3417179391,CN -3417179392,3417179647,ID -3417179648,3417180159,CN -3417180160,3417182207,ID -3417182208,3417184767,AU -3417184768,3417185023,MN -3417185024,3417185279,AF -3417185280,3417185791,SG -3417185792,3417186303,NZ -3417186304,3417194495,HK -3417194496,3417198591,JP -3417198592,3417200639,SG -3417200640,3417202687,JP -3417202688,3417210879,CN -3417210880,3417227263,AU -3417227264,3417243647,JP -3417243648,3417244671,PH -3417244672,3417245695,IN -3417247744,3417251839,JP -3417251840,3417260031,KR -3417260032,3417264127,PK -3417264128,3417268223,JP -3417272320,3417274367,NZ -3417274368,3417275391,AU -3417275392,3417276415,PH -3417276416,3417284607,CN -3417284608,3417288703,SG -3417288704,3417289215,IN -3417289216,3417289727,AU -3417289728,3417291263,IN -3417291264,3417291775,AU -3417291776,3417292799,KR -3417292800,3417333759,CN -3417333760,3417337855,AU -3417337856,3417338367,IN -3417338368,3417338879,HK -3417339904,3417340415,AU -3417340416,3417340927,NZ -3417340928,3417341951,HK -3417341952,3417346047,KH -3417346048,3417348095,MY -3417348096,3417348351,AU -3417348352,3417348607,IN -3417348608,3417349119,NZ -3417349120,3417349631,IN -3417349632,3417350143,AU -3417350144,3417352191,VN -3417352192,3417354239,CN -3417354240,3417356287,ID -3417356288,3417357311,AU -3417357312,3417357567,NZ -3417357568,3417358335,PK -3417358336,3417374719,HK -3417374720,3417440255,PH -3417440256,3417833471,JP -3417833472,3417849855,NZ -3417849856,3417853951,AU -3417853952,3417858047,CN -3417858048,3417866239,JP -3417866240,3417915391,HK -3417915392,3417939967,TH -3417939968,3417946111,PF -3417946112,3417946137,AU -3417946138,3417946138,HK -3417946139,3417947135,AU -3417947136,3417947391,TH -3417947392,3417947647,CN -3417947648,3417947903,AU -3417947904,3417948159,IN -3417948160,3417964543,AU -3417964544,3418030079,HK -3418030080,3418062847,TW -3418062848,3418071039,US -3418071040,3418079231,CN -3418079232,3418095615,IN -3418095616,3418111999,TH -3418112000,3418128383,HK -3418128384,3418136575,AU -3418136576,3418144767,BD -3418144768,3418148863,TW -3418148864,3418150911,JP -3418150912,3418152959,AU -3418152960,3418155007,IN -3418155008,3418157055,MY -3418157056,3418161151,BD -3418161152,3418161663,CN -3418161664,3418162431,AU -3418162432,3418162687,IN -3418162688,3418163199,CN -3418163200,3418165247,PH -3418165248,3418167295,MY -3418167552,3418167807,AU -3418167808,3418168319,HK -3418168320,3418169343,VN -3418169344,3418177535,JP -3418177536,3418181631,LK -3418181632,3418183679,AU -3418183680,3418184191,ID -3418184192,3418184959,IN -3418184960,3418185727,AU -3418185728,3418189823,JP -3418189824,3418190847,CN -3418191872,3418192895,ID -3418192896,3418193919,AU -3418193920,3418202111,KH -3418202112,3418206207,HK -3418206208,3418208255,IN -3418208256,3418210303,LK -3418210304,3418218495,CN -3418218496,3418220543,BD -3418220544,3418221567,HK -3418221568,3418223615,CN -3418223616,3418226687,IN -3418226688,3418227711,BD -3418227712,3418228735,KR -3418228736,3418230783,BD -3418230784,3418232831,TW -3418232832,3418233343,AU -3418233344,3418233855,KR -3418233856,3418234879,JP -3418234880,3418235903,BD -3418235904,3418236415,ID -3418236416,3418236927,HK -3418236928,3418241023,ID -3418241024,3418243071,JP -3418243072,3418251263,PH -3418251264,3418255359,CN -3418255360,3418257407,ID -3418257408,3418259455,HK -3418259456,3418267647,IN -3418267648,3418271743,VN -3418271744,3418273791,SG -3418273792,3418275839,ID -3418275840,3418279935,AU -3418279936,3418281983,NZ -3418281984,3418282239,NR -3418282496,3418283519,PH -3418283520,3418284031,AU -3418284032,3418286079,JP -3418286080,3418287103,AU -3418287104,3418288127,JP -3418288128,3418290175,ID -3418290176,3418290431,IN -3418290432,3418290687,CN -3418290688,3418291199,TH -3418291200,3418291711,AU -3418291712,3418292223,BD -3418292224,3418292991,CN -3418292992,3418293503,HK -3418293504,3418293759,CN -3418293760,3418294015,AU -3418294016,3418294271,CN -3418294272,3418296319,VN -3418296320,3418297343,HK -3418297344,3418298367,CN -3418298368,3418298623,HK -3418298624,3418298879,CN -3418298880,3418299391,HK -3418299392,3418300415,CN -3418300416,3418300927,BD -3418300928,3418301439,IN -3418301440,3418302463,AU -3418302464,3418304511,ID -3418304512,3418306559,VN -3418306560,3418308607,IN -3418308608,3418324991,CN -3418324992,3418326015,VU -3418326016,3418326271,AU -3418326272,3418326527,CN -3418326528,3418327039,PH -3418327040,3418329087,JP -3418329088,3418333183,CN -3418333184,3418345471,AU -3418345472,3418357759,JP -3418357760,3418365951,CN -3418365952,3418374143,TH -3418374144,3418382335,AU -3418382336,3418393919,JP -3418393920,3418393927,AU -3418393928,3418394367,JP -3418394368,3418394623,TW -3418394624,3418397483,JP -3418397484,3418397487,PH -3418397488,3418399231,JP -3418399232,3418399247,PH -3418399248,3418400861,JP -3418400862,3418400862,SG -3418400863,3418401455,JP -3418401456,3418401459,TW -3418401460,3418401631,JP -3418401632,3418401647,PH -3418401648,3418405935,JP -3418405936,3418405939,PH -3418405940,3418406911,JP -3418406912,3418423295,IN -3418423296,3418444091,HK -3418444092,3418444095,CN -3418444096,3418456063,HK -3418456064,3418472447,IN -3418472448,3418480639,AU -3418480640,3418488831,CN -3418488832,3418505215,AU -3418505216,3418511055,JP -3418511056,3418511071,HK -3418511072,3418512319,JP -3418512320,3418512335,AU -3418512336,3418513407,JP -3418513408,3418517503,IN -3418517504,3418518527,ID -3418518528,3418519551,BD -3418519552,3418554367,HK -3418554368,3418570751,VN -3418570752,3418578943,CN -3418578944,3418583039,TH -3418583040,3418585087,HK -3418585088,3418586111,SG -3418586112,3418586367,AU -3418586368,3418586879,SG -3418586880,3418587135,AU -3418587136,3418621951,CN -3418621952,3418623999,HK -3418624000,3418626047,JP -3418626048,3418627071,VN -3418627072,3418628095,CN -3418628096,3418636287,AU -3418636288,3418642943,JP -3418642944,3418643199,ID -3418643200,3418643455,JP -3418643456,3418644479,AU -3418644480,3418644735,JP -3418644736,3418644863,AU -3418644864,3418650807,JP -3418650808,3418650808,HK -3418650809,3418652671,JP -3418652672,3418750975,IN -3418750976,3418816511,HK -3418816512,3418947583,IN -3418947584,3418955775,AU -3418955776,3418959871,TW -3418959872,3418960383,BD -3418960384,3418960895,ID -3418960896,3418961919,JP -3418961920,3418962943,VN -3418962944,3418963967,IN -3418963968,3418988543,AU -3418988544,3418992639,ID -3418992640,3418993663,SG -3418993664,3418993919,PH -3418993920,3418994431,CN -3418994432,3418994687,AU -3418994688,3418995711,MY -3418995712,3418996735,JP -3418996736,3419013119,IN -3419013120,3419062271,AU -3419062272,3419070463,JP -3419070464,3419072511,HK -3419072512,3419073023,IN -3419073024,3419073279,SG -3419073280,3419073535,FJ -3419073536,3419074559,CN -3419074560,3419078655,BD -3419078656,3419209727,TW -3419209728,3419226111,VN -3419226112,3419234303,CN -3419234304,3419241751,JP -3419241752,3419241752,AU -3419241753,3419242495,JP -3419242496,3419275263,CN -3419275264,3419340799,AU -3419340800,3419344895,TW -3419344896,3419348991,KR -3419348992,3419353087,TW -3419353088,3419354111,JP -3419354112,3419356159,ID -3419356160,3419356671,NZ -3419356672,3419356927,IN -3419356928,3419357183,TH -3419357184,3419411455,CN -3419411456,3419411711,HK -3419411712,3419411967,NZ -3419411968,3419412223,PH -3419412224,3419412479,JP -3419412480,3419414527,PH -3419414528,3419422719,CN -3419422720,3419439103,AU -3419439104,3419442431,SG -3419442432,3419442687,HK -3419442688,3419471871,SG -3419471872,3419504639,TH -3419504640,3419508735,HK -3419508736,3419512831,JP -3419512832,3419516927,AU -3419516928,3419517951,JP -3419517952,3419518975,VN -3419518976,3419519999,JP -3419520000,3419520767,ID -3419520768,3419521023,TH -3419521024,3419529215,AU -3419529216,3419537407,CN -3419537408,3419541503,HK -3419541504,3419553791,KR -3419553792,3419556095,AU -3419556096,3419556351,CN -3419556352,3419556607,AU -3419556608,3419556863,CN -3419556864,3419557119,AU -3419557120,3419557120,HK -3419557121,3419557887,AU -3419557888,3419558399,ID -3419558400,3419558655,AU -3419558656,3419559935,ID -3419559936,3419560959,JP -3419560960,3419561983,IN -3419561984,3419570175,AU -3419570176,3419602943,VN -3419602944,3419611135,TW -3419611136,3419617279,JP -3419617280,3419618303,PH -3419618304,3419619327,SG -3419619328,3419635711,NZ -3419635712,3419643903,SG -3419643904,3419668479,JP -3419668480,3419672575,CN -3419672576,3419674623,AU -3419674624,3419675647,IN -3419675648,3419676671,PK -3419676672,3419684863,JP -3419684864,3419688959,IN -3419688960,3419693055,CN -3419693056,3419701247,KR -3419701248,3419709439,AU -3419709440,3419717631,KR -3419717632,3419734015,IN -3419734016,3419774975,AU -3419774976,3419783167,JP -3419783168,3419791359,PH -3419791360,3419873279,AU -3419873280,3419877375,AF -3419877376,3419877631,ID -3419877888,3419878143,ID -3419878144,3419878399,IN -3419878400,3419879423,GU -3419879424,3419880447,JP -3419880448,3419881471,MM -3419881472,3419897855,PH -3419897856,3419899647,JP -3419899648,3419899903,AU -3419899904,3419900159,GB -3419900160,3419903231,AU -3419903232,3419903487,JP -3419903488,3419906047,AU -3419906048,3419914239,PK -3419914240,3419922431,KR -3419922432,3419924479,JP -3419924480,3419925503,HK -3419925504,3419925759,JP -3419925760,3419930623,HK -3419930624,3419971583,JP -3419971584,3419979775,KR -3419979776,3419996159,JP -3419996160,3420020735,AU -3420020736,3420028927,TW -3420028928,3420029951,MY -3420029952,3420030975,ID -3420030976,3420031487,IN -3420031488,3420031999,MN -3420032000,3420032255,ID -3420032256,3420032511,AU -3420032512,3420033023,NZ -3420033024,3420034047,IN -3420034048,3420035071,AU -3420035072,3420036095,SG -3420036096,3420037119,JP -3420037120,3420038143,AU -3420038144,3420039167,CN -3420039168,3420040191,KH -3420040192,3420040703,ID -3420040704,3420040959,IN -3420040960,3420041215,HK -3420041216,3420042239,MY -3420042240,3420043263,JP -3420043264,3420044287,SG -3420044288,3420045311,ID -3420045312,3420061695,KR -3420061696,3420127231,HK -3420127232,3420323839,AU -3420323840,3420332031,TW -3420332032,3420335039,AU -3420335040,3420335040,HK -3420335041,3420335041,PK -3420335042,3420335047,AU -3420335048,3420335052,HK -3420335053,3420335053,AU -3420335054,3420335054,HK -3420335055,3420337171,AU -3420337172,3420337172,VN -3420337173,3420337173,IN -3420337174,3420337439,AU -3420337440,3420337471,SG -3420337472,3420340048,AU -3420340049,3420340049,NZ -3420340050,3420366063,AU -3420366064,3420366079,TW -3420366080,3420366959,AU -3420366960,3420366975,KR -3420366976,3420369007,AU -3420369008,3420369023,HK -3420369024,3420370559,AU -3420370560,3420370575,JP -3420370576,3420372991,AU -3420372992,3420374527,HK -3420374528,3420374783,ID -3420374784,3420375551,HK -3420375552,3420375807,ID -3420375808,3420377087,HK -3420377088,3420389375,JP -3420389376,3420393471,US -3420393472,3420395519,HK -3420395520,3420397567,JP -3420397568,3420401663,KH -3420401664,3420411903,JP -3420411904,3420412415,TH -3420412416,3420412927,ID -3420412928,3420413951,BD -3420413952,3420422143,KR -3420422144,3420430335,MY -3420430336,3420434431,PK -3420434432,3420434687,IN -3420434688,3420434943,KR -3420434944,3420435199,HK -3420435200,3420435455,AU -3420435456,3420436479,JP -3420436480,3420437503,AU -3420437504,3420438527,IN -3420438528,3420454911,HK -3420454912,3422552063,KR -3422552064,3422846975,US -3422846976,3422855167,GB -3422855168,3422955519,US -3422955520,3422956799,FR -3422956800,3423076351,US -3423076352,3423077375,CA -3423077376,3423092735,US -3423092736,3423092767,VI -3423092768,3423092783,US -3423092784,3423092831,VI -3423092832,3423092847,US -3423092848,3423093759,VI -3423093760,3423094783,US -3423094784,3423095807,CA -3423095808,3423128575,US -3423128576,3423128831,AO -3423128832,3423129087,ZA -3423129088,3423129599,NG -3423129600,3423131647,US -3423131648,3423133695,PL -3423133696,3423135999,US -3423136000,3423136255,CA -3423136256,3423137023,US -3423137024,3423137279,CA -3423137536,3423143935,US -3423143936,3423145983,CA -3423145984,3423162367,US -3423162368,3423163391,CA -3423163392,3423164415,US -3423166464,3423182847,US -3423182848,3423184895,CA -3423184896,3423258623,US -3423258624,3423260671,CA -3423260672,3423268863,US -3423268864,3423269887,CA -3423269888,3423285247,US -3423285248,3423287295,CA -3423287296,3423287807,VG -3423287808,3423303679,US -3423303680,3423304703,CA -3423304704,3423311871,US -3423311872,3423313151,VI -3423313152,3423313407,US -3423313408,3423313919,VI -3423313920,3423366479,US -3423366480,3423366495,IT -3423366496,3423371263,US -3423371264,3423375359,ZA -3423375360,3423379455,CA -3423379456,3423404031,US -3423406080,3423410175,US -3423410176,3423412223,BM -3423412224,3423416319,US -3423416320,3423417343,CA -3423417344,3423430655,US -3423430656,3423431679,TC -3423431680,3423465471,US -3423465472,3423466495,VC -3423466496,3423468543,US -3423468544,3423469567,CA -3423469568,3423473663,US -3423473664,3423474687,CA -3423474688,3423488511,US -3423488512,3423489023,CA -3423489024,3423533055,US -3423533056,3423535103,AI -3423535104,3423543295,US -3423543296,3423545343,CA -3423545344,3423552767,US -3423552768,3423553023,GB -3423553024,3423553279,US -3423553280,3423553535,GB -3423553536,3423571967,US -3423571968,3423574015,PR -3423574016,3423579135,US -3423579136,3423580159,CA -3423580160,3423582207,US -3423582208,3423586303,CA -3423586304,3423588351,US -3423590400,3423602687,US -3423602688,3423603711,KN -3423603712,3423612671,US -3423612672,3423612927,CA -3423612928,3423614975,US -3423614976,3423615487,CA -3423615488,3423626239,US -3423626240,3423627263,CA -3423627264,3423629311,US -3423629312,3423630335,AG -3423630336,3423637503,US -3423637504,3423639551,CA -3423639552,3423651839,US -3423651840,3423653887,CA -3423653888,3423705599,US -3423705600,3423705855,CA -3423705856,3423725423,US -3423725424,3423725427,CA -3423725428,3423731711,US -3423731712,3423797247,AE -3423797248,3423797503,US -3423797504,3423801087,CA -3423801088,3423801343,US -3423801344,3423823359,CA -3423823360,3423823871,US -3423823872,3423827711,CA -3423827712,3423827967,US -3423827968,3423830271,CA -3423830272,3423830527,US -3423830528,3423838719,CA -3423838720,3423838975,US -3423838976,3423846399,CA -3423846400,3423848447,US -3423848448,3423849471,KN -3423849472,3423849983,US -3423849984,3423850495,CA -3423850496,3423850751,US -3423850752,3423854335,CA -3423854336,3423854591,US -3423854592,3423858175,CA -3423858176,3423858687,US -3423858688,3423858943,CA -3423858944,3423859455,US -3423859456,3423859711,CA -3423859712,3423859967,US -3423859968,3423862527,CA -3423862528,3424378879,US -3424378880,3424379135,PR -3424379136,3424412415,US -3424412416,3424412671,CA -3424412672,3424493823,US -3424493824,3424494079,CA -3424494080,3424507135,US -3424507136,3424507391,CA -3424507392,3425173503,US -3425173504,3425304575,CA -3425304576,3425471487,US -3425471488,3425472511,CA -3425472512,3425516799,US -3425516800,3425517055,MX -3425517056,3425697791,US -3425697792,3425699839,CA -3425699840,3425714175,US -3425714176,3425722367,CA -3425722368,3425828863,US -3425828864,3425869167,CA -3425869168,3425869183,US -3425869184,3425894399,CA -3425894400,3426013183,US -3426013184,3426013439,IL -3426013440,3426356991,US -3426356992,3426357247,CA -3426357248,3426369023,US -3426369024,3426369535,CA -3426369536,3426387967,US -3426387968,3426388991,MX -3426388992,3426400255,US -3426400256,3426400511,CA -3426400512,3426418687,US -3426418688,3426420479,GB -3426420480,3426420735,US -3426420736,3426435071,GB -3426435072,3426439167,SG -3426439168,3426441215,AU -3426441216,3426441727,HK -3426441728,3426445823,US -3426445824,3426446335,DE -3426446336,3426482687,US -3426482688,3426484223,CA -3426484224,3426617855,US -3426617856,3426618367,CA -3426618368,3426646527,US -3426646528,3426646783,GB -3426646784,3426725375,US -3426725376,3426725887,CA -3426725888,3426729471,US -3426729472,3426729983,CA -3426729984,3426744319,US -3426744320,3426746367,CA -3426746368,3427112447,US -3427112448,3427112703,CN -3427112704,3427117055,US -3427117056,3427117311,CA -3427117312,3427127295,US -3427127296,3427127551,CA -3427127552,3427487743,US -3427487744,3427487999,GB -3427488000,3427488767,US -3427488768,3427489023,AU -3427489024,3427503615,US -3427503616,3427503871,AU -3427503872,3427504127,SG -3427504128,3427618303,US -3427618304,3427618559,CA -3427618560,3427651071,US -3427651072,3427651327,CA -3427651328,3427729407,US -3427729408,3427729663,CA -3427729664,3427730431,US -3427730432,3427730687,BE -3427730688,3427730943,DE -3427730944,3427731967,US -3427731968,3427732223,DE -3427732224,3427732479,US -3427732480,3427732735,CH -3427732736,3427735039,IE -3427735040,3427735295,US -3427735296,3427736063,HK -3427736064,3427736319,GB -3427736320,3427741951,US -3427741952,3427742207,DE -3427742208,3427742463,US -3427742464,3427742719,AT -3427742720,3427743231,CH -3427743232,3427743487,GB -3427743488,3427743743,DE -3427743744,3427743999,CA -3427744000,3427744255,SE -3427744256,3427745279,DE -3427745280,3427745791,TW -3427745792,3427746047,GB -3427746048,3427746303,DK -3427746304,3427746559,US -3427746560,3427746815,JP -3427746816,3427747071,DE -3427747072,3427747327,US -3427747328,3427747583,DE -3427747584,3427747839,US -3427747840,3427748095,NO -3427748096,3427748351,CH -3427748352,3427748607,JP -3427748608,3427749631,DE -3427749632,3427749887,NL -3427749888,3427750655,DE -3427750656,3427750911,GB -3427750912,3427751423,US -3427751424,3427751519,BE -3427751520,3427752447,US -3427752448,3427752959,GB -3427752960,3427753215,US -3427753216,3427753471,JP -3427753472,3427753727,FI -3427753728,3427753983,IT -3427753984,3427754239,CH -3427754240,3427754495,GB -3427754496,3427754751,DE -3427754752,3427755007,CA -3427755008,3427755263,IT -3427755264,3427755519,US -3427755520,3427755775,DE -3427755776,3427756287,BE -3427756288,3427756543,AU -3427756544,3427756799,DE -3427756800,3427757055,US -3427757056,3427757311,GR -3427757312,3427757567,FR -3427757568,3427757823,JP -3427757824,3427758079,DE -3427758080,3427758335,BE -3427758336,3427758591,US -3427758592,3427758847,IT -3427758848,3427759103,US -3427759104,3427759359,BE -3427759360,3427759871,GB -3427759872,3427760127,US -3427760128,3427760895,CA -3427760896,3427761663,US -3427761664,3427761919,JP -3427761920,3427762175,US -3427762176,3427762431,DE -3427762432,3427762687,CA -3427762688,3427763455,IT -3427763456,3427763711,AU -3427763712,3427763967,GB -3427763968,3427764223,US -3427764224,3427764479,FR -3427764480,3427765503,US -3427765504,3427765759,GB -3427765760,3427766271,US -3427766272,3427766783,GB -3427766784,3427767039,SE -3427767040,3427767807,DE -3427767808,3427769599,US -3427769600,3427770111,JP -3427770112,3427770367,NO -3427770368,3427770623,US -3427770624,3427771391,CH -3427771392,3427771647,US -3427771648,3427771903,CA -3427771904,3427772415,CH -3427772416,3427772671,DE -3427772672,3427772927,HK -3427772928,3427773183,BE -3427773184,3427773439,DE -3427773440,3427773695,US -3427773696,3427773951,FR -3427773952,3427774719,US -3427774720,3427775231,DE -3427775232,3427776511,US -3427776512,3427776767,CZ -3427776768,3427777279,US -3427777280,3427777535,DE -3427777536,3427777791,US -3427777792,3427778047,HK -3427778048,3427778303,US -3427778304,3427778559,SE -3427778560,3427779071,NO -3427779072,3427779327,GB -3427779328,3427780095,US -3427780096,3427780351,GB -3427780352,3427780863,DE -3427780864,3427781631,US -3427781632,3427781887,BE -3427781888,3427782399,US -3427782400,3427782655,GB -3427782656,3427783423,FR -3427783424,3427783679,GB -3427783680,3427783935,US -3427783936,3427784703,FR -3427784704,3427785215,US -3427785216,3427785471,JP -3427785472,3427785727,NO -3427785728,3427786751,US -3427786752,3427787263,LU -3427787264,3427787775,US -3427787776,3427788031,FR -3427788032,3427788287,CH -3427788288,3427788799,GB -3427788800,3427789567,NO -3427789568,3427790079,DE -3427790080,3427790847,US -3427790848,3427791103,IT -3427791104,3427791615,DE -3427791616,3427791871,US -3427791872,3427792383,CA -3427792384,3427792639,NL -3427792640,3427793407,SG -3427793408,3427793919,HK -3427793920,3427794175,US -3427794176,3427794943,NL -3427794944,3427796991,CA -3427796992,3427831551,US -3427831552,3427831807,MX -3427831808,3427860479,US -3427860480,3428057087,CA -3428057088,3428286719,US -3428286720,3428286975,CA -3428286976,3428296959,US -3428296960,3428297215,CL -3428297216,3428299519,US -3428299520,3428299775,ZA -3428299776,3428306175,US -3428306176,3428306431,PE -3428306432,3428318975,US -3428318976,3428319231,CA -3428319232,3428399359,US -3428399360,3428399615,CA -3428399616,3428434943,US -3428434944,3428435199,CA -3428435200,3428437503,US -3428437504,3428437759,MX -3428437760,3428582655,US -3428582656,3428582911,CA -3428582912,3428585215,US -3428585216,3428585471,CA -3428585472,3428585983,US -3428585984,3428586239,CA -3428586240,3428586495,US -3428586496,3428587007,CA -3428587008,3428587263,US -3428587264,3428587519,CA -3428587520,3428587775,US -3428587776,3428588031,CA -3428588032,3428588543,US -3428588544,3428588799,CA -3428588800,3428591871,US -3428591872,3428592127,CA -3428592128,3428592383,US -3428592384,3428593919,CA -3428593920,3428594687,US -3428594688,3428595199,CA -3428595200,3428596223,US -3428596224,3428596735,CA -3428596736,3428597247,US -3428597248,3428597503,CA -3428597504,3428598015,US -3428598016,3428598271,CA -3428598272,3428598591,US -3428598592,3428598623,CA -3428598624,3428598783,US -3428598784,3428599039,CA -3428599040,3428599551,US -3428599552,3428600575,CA -3428600576,3428600831,US -3428600832,3428601599,CA -3428601600,3428602111,US -3428602112,3428602367,CA -3428602368,3428603903,US -3428603904,3428605183,CA -3428605184,3428607999,US -3428608000,3428609023,CA -3428609024,3428610047,US -3428610048,3428610559,CA -3428610560,3428610815,US -3428610816,3428611071,CA -3428611072,3428612607,US -3428612608,3428613887,CA -3428613888,3428614143,US -3428614144,3428620031,CA -3428620032,3428620287,US -3428620288,3428621823,CA -3428621824,3428622335,US -3428622336,3428623615,CA -3428623616,3428623871,US -3428623872,3428624639,CA -3428624640,3428625407,US -3428625408,3428628223,CA -3428628224,3428630015,US -3428630016,3428634623,CA -3428634624,3428634879,US -3428634880,3428635135,CA -3428635136,3428635391,US -3428635392,3428635647,CA -3428635648,3428635903,US -3428635904,3428636927,CA -3428636928,3428637439,US -3428637440,3428637951,CA -3428637952,3428638719,US -3428638720,3428639487,CA -3428639488,3428640255,US -3428640256,3428640511,CA -3428640512,3428640767,US -3428640768,3428643327,CA -3428643328,3428643583,US -3428643584,3428643839,CA -3428643840,3428644351,US -3428644352,3428645631,CA -3428645632,3428646143,US -3428646144,3428646399,CA -3428646400,3428646655,US -3428646656,3428646911,CA -3428646912,3428660735,US -3428660736,3428661503,CA -3428661504,3428721755,US -3428721756,3428721756,NO -3428721757,3428743167,US -3428743168,3428744191,CA -3428744192,3428801467,US -3428801468,3428801468,PR -3428801469,3428931463,US -3428931464,3428931464,QA -3428931465,3428958207,US -3428958208,3428962303,CO -3428962304,3429027839,US -3429027840,3429028351,GB -3429028352,3429028863,DE -3429028864,3429029375,FR -3429029376,3429171199,US -3429171200,3429236735,CA -3429236736,3429381887,US -3429381888,3429382143,DE -3429382144,3429396223,US -3429396224,3429396479,DE -3429396480,3429408511,US -3429408512,3429408767,DE -3429408768,3429411583,US -3429411584,3429411839,DE -3429411840,3429500927,US -3429500928,3429502975,CA -3429502976,3429616639,US -3429616640,3429616895,CA -3429616896,3429775359,US -3429775360,3429777407,TC -3429777408,3429892095,US -3429892096,3429957631,CA -3429957632,3430074111,US -3430074112,3430074367,AU -3430074368,3430340643,US -3430340644,3430340644,CA -3430340645,3430354943,US -3430354944,3430356991,PR -3430356992,3430417151,US -3430417152,3430417167,BR -3430417168,3430468607,US -3430468608,3430468863,AQ -3430468864,3430703871,US -3430703872,3430704127,PR -3430704128,3430705151,US -3430705152,3430706175,MX -3430706176,3430722303,US -3430722304,3430722559,CA -3430722560,3430729471,US -3430729472,3430729727,GB -3430729728,3430747903,US -3430747904,3430748159,CA -3430748160,3430749951,US -3430749952,3430750207,CA -3430750208,3430767615,US -3430767616,3430768127,CA -3430768128,3430768895,US -3430768896,3430769151,CA -3430769152,3430769407,US -3430769408,3430769663,CA -3430769664,3430770943,US -3430770944,3430771199,CA -3430771200,3430771711,US -3430771712,3430772223,CA -3430772224,3430773247,US -3430773248,3430773503,CA -3430773504,3430774271,US -3430774272,3430774527,CA -3430774528,3430777343,US -3430777344,3430777599,CA -3430777600,3430777855,US -3430777856,3430778111,CA -3430778112,3430778623,US -3430778624,3430778879,CA -3430778880,3430779903,US -3430779904,3430780159,CA -3430780160,3430780671,US -3430780672,3430780927,CA -3430780928,3430782463,US -3430782464,3430782719,CA -3430782720,3430793983,US -3430793984,3430794239,PR -3430794240,3430795007,US -3430795008,3430795263,CA -3430795264,3430805759,US -3430805760,3430806015,CA -3430806016,3430807295,US -3430807296,3430807551,CA -3430807552,3430809087,US -3430809088,3430809343,CA -3430809344,3430811135,US -3430811136,3430811263,FI -3430811264,3430811391,SE -3430811392,3430811519,BR -3430811520,3430811647,AR -3430811648,3430812671,US -3430812672,3430813183,MX -3430813184,3430842367,US -3430842368,3430842879,DO -3430842880,3430845439,US -3430845440,3430845951,MX -3430845952,3430849535,US -3430849536,3430850047,CA -3430850048,3431071999,US -3431072000,3431072255,HK -3431072256,3431114495,US -3431114496,3431114751,CA -3431114752,3431468031,US -3431468032,3431469055,CA -3431469056,3431470847,US -3431470848,3431471103,GB -3431471104,3431596287,US -3431596288,3431606271,CA -3431606272,3431609343,US -3431609344,3431613439,CA -3431613440,3431613695,US -3431613696,3431620095,CA -3431620096,3431620351,US -3431620352,3431621375,CA -3431621376,3431622399,US -3431622400,3431622655,CA -3431622656,3431622911,US -3431622912,3431624703,CA -3431624704,3431624959,US -3431624960,3431638783,CA -3431638784,3431639039,US -3431639040,3431641855,CA -3431641856,3431642623,US -3431642624,3431657471,CA -3431657472,3431658751,US -3431658752,3431661311,CA -3431661312,3431745023,US -3431745024,3431745279,BE -3431745280,3431745791,US -3431745792,3431746047,GB -3431746048,3431747071,US -3431747072,3431747327,LU -3431747328,3431748607,US -3431748608,3431749119,FR -3431749120,3431751423,US -3431751424,3431752703,IT -3431752704,3431753215,US -3431753216,3431753471,SG -3431753472,3431753727,US -3431753728,3431755007,CA -3431755008,3431755775,NL -3431755776,3431759615,CA -3431759616,3431759871,DE -3431759872,3431851007,US -3431851008,3431851263,GB -3431851264,3432004607,US -3432004608,3432005631,CA -3432005632,3432009215,US -3432009216,3432009471,PR -3432009472,3432106239,US -3432106240,3432106495,MX -3432106496,3432113407,US -3432113408,3432113663,CA -3432113664,3432133887,US -3432133888,3432134143,GB -3432134144,3432205311,US -3432205312,3432206335,CA -3432206336,3432324607,US -3432324608,3432324863,CA -3432324864,3432329215,US -3432329216,3432330239,DE -3432330240,3432361983,US -3432361984,3432366079,DE -3432366080,3432517119,US -3432517120,3432517631,NA -3432517632,3432520703,US -3432520704,3432520959,GB -3432520960,3432530943,US -3432530944,3432531007,TH -3432531008,3432531071,SG -3432531072,3432531199,JP -3432531200,3432531455,FR -3432531456,3432549559,US -3432549560,3432549595,HK -3432549596,3432570879,US -3432570880,3432572927,HK -3432572928,3432585215,US -3432585216,3432585727,MX -3432585728,3432606463,US -3432606464,3432606719,GB -3432606720,3432613631,US -3432613632,3432613887,CA -3432613888,3432634111,US -3432634112,3432634367,CA -3432634368,3432660991,US -3432660992,3432662527,DE -3432662528,3432662531,PT -3432662532,3432663039,DE -3432663040,3432689151,US -3432689152,3432689663,CA -3432689664,3432695807,US -3432695808,3432697855,CA -3432697856,3432726271,US -3432726272,3432726527,CA -3432726528,3432736255,US -3432736256,3432736511,GB -3432736512,3432737279,US -3432737280,3432737535,SG -3432737536,3432738303,US -3432738304,3432738559,GB -3432738560,3432748799,US -3432748800,3432749055,PA -3432749056,3432749311,US -3432749312,3432749567,BG -3432749568,3432749823,US -3432749824,3432750079,BG -3432750080,3432750335,US -3432750336,3432750591,BG -3432750592,3432807423,US -3432807424,3432808447,CA -3432808448,3433955583,US -3433955584,3433959423,CA -3433959424,3433963519,US -3433963520,3433964799,CA -3433964800,3433965055,US -3433965056,3433967359,CA -3433967360,3433967615,US -3433967616,3433981951,CA -3433981952,3433983999,US -3433984000,3434012671,CA -3434012672,3434012927,US -3434012928,3434014719,CA -3434014720,3434015231,US -3434015232,3434020607,CA -3434020608,3434299391,US -3434299392,3434303487,VE -3434303488,3434380855,US -3434380856,3434380856,ES -3434380857,3434427391,US -3434427392,3434428415,HR -3434428416,3434433279,US -3434433280,3434433535,PR -3434433536,3434480439,US -3434480440,3434480440,CL -3434480441,3434490107,US -3434490108,3434490108,PH -3434490109,3434553343,US -3434553344,3434553599,ES -3434553600,3434571775,US -3434571776,3434573823,CO -3434573824,3434583039,US -3434583040,3434584063,NL -3434584064,3434807551,US -3434807552,3434831359,CA -3434831360,3434831615,US -3434831616,3434872575,CA -3434872576,3435069439,US -3435069440,3435134975,CA -3435134976,3435216383,US -3435216384,3435216637,DE -3435216638,3435216638,US -3435216639,3435216650,DE -3435216651,3435216651,US -3435216652,3435216895,DE -3435216896,3435271423,US -3435271424,3435271679,CA -3435271680,3435507711,US -3435507712,3435511807,CA -3435511808,3436249343,US -3436249344,3436252415,CA -3436252416,3436253183,US -3436253184,3436255743,CA -3436255744,3436256255,US -3436256256,3436278271,CA -3436278272,3436278527,US -3436278528,3436282367,CA -3436282368,3436282623,US -3436282624,3436289791,CA -3436289792,3436290047,US -3436290048,3436314367,CA -3436314368,3436476415,US -3436476416,3436478463,AW -3436478464,3436485103,US -3436485104,3436485104,KZ -3436485105,3436507135,US -3436507136,3436509183,BB -3436509184,3436598647,US -3436598648,3436598648,DZ -3436598649,3436684197,US -3436684198,3436684198,DK -3436684199,3436697087,US -3436697088,3436697343,VE -3436697344,3437232383,US -3437232384,3437232639,CA -3437232640,3437242879,US -3437242880,3437243135,CA -3437243136,3437249279,US -3437249280,3437249535,CA -3437249536,3437259775,US -3437259776,3437260031,CA -3437260032,3437262079,US -3437262080,3437262335,CA -3437262336,3437263615,US -3437263616,3437263871,CA -3437263872,3437266431,US -3437266432,3437266687,CA -3437266688,3437281279,US -3437281280,3437281535,CA -3437281536,3437292799,US -3437292800,3437293055,CA -3437293056,3437297919,US -3437297920,3437301759,CA -3437301760,3437305855,US -3437305856,3437307391,CA -3437307392,3437307903,US -3437307904,3437310975,CA -3437310976,3437311487,US -3437311488,3437331711,CA -3437331712,3437331967,US -3437331968,3437332479,CA -3437332480,3437332735,US -3437332736,3437334015,CA -3437334016,3437334271,US -3437334272,3437334783,CA -3437334784,3437335551,US -3437335552,3437336063,CA -3437336064,3437336319,US -3437336320,3437341695,CA -3437341696,3437341951,US -3437342208,3437343231,CA -3437343232,3437343487,US -3437343488,3437350911,CA -3437350912,3437351423,US -3437351424,3437353471,CA -3437353472,3437353727,SG -3437353728,3437358847,CA -3437358848,3437359103,US -3437359104,3437428735,CA -3437428736,3437691391,US -3437691392,3437691647,HK -3437691648,3437691903,JP -3437691904,3437692415,FR -3437692416,3437692671,US -3437692672,3437693439,CA -3437693440,3437693695,HK -3437693696,3437693951,NO -3437693952,3437694207,ES -3437694208,3437695231,AT -3437695232,3437695999,HK -3437696000,3437696767,NL -3437696768,3437702911,US -3437702912,3437703167,HK -3437703168,3437703423,US -3437703424,3437703679,NL -3437703680,3437703935,ES -3437703936,3437704191,US -3437704192,3437704703,CH -3437704704,3437706495,US -3437706496,3437706751,CH -3437706752,3437707263,US -3437707264,3437707519,DE -3437707520,3437707775,US -3437707776,3437708031,FR -3437708032,3437708287,US -3437708288,3437708799,FI -3437708800,3437710079,US -3437710080,3437710335,GB -3437710336,3437712639,US -3437712640,3437713663,GB -3437713664,3437715199,US -3437715200,3437715455,DE -3437715456,3437715711,JP -3437715712,3437715967,IT -3437715968,3437716991,DE -3437716992,3437717247,US -3437717248,3437718527,BE -3437718528,3437720063,US -3437720064,3437723135,SG -3437723136,3437725183,US -3437725184,3437725695,MN -3437725696,3437726207,DE -3437726208,3437726463,US -3437726464,3437726975,GB -3437726976,3437731583,US -3437731584,3437731615,AF -3437731616,3437734399,US -3437734400,3437734655,SG -3437734656,3437748223,US -3437748224,3437748479,GB -3437748480,3437748991,NL -3437748992,3437749247,US -3437749248,3437749503,DE -3437749504,3437749759,US -3437749760,3437750015,JP -3437750016,3437750271,BE -3437750272,3437750527,GB -3437750528,3437751551,US -3437751552,3437751807,IT -3437751808,3437752063,GB -3437752064,3437752319,ES -3437752320,3437752575,IE -3437752576,3437755135,US -3437755136,3437755647,JP -3437755648,3437755903,GB -3437755904,3437756159,US -3437756160,3437756415,IE -3437756416,3437772799,US -3437772800,3437776895,CA -3437776896,3437789863,US -3437789864,3437789871,AU -3437789872,3437961215,US -3437961216,3437964287,ZA -3437964288,3438006271,US -3438006272,3438010367,CA -3438010368,3438014463,US -3438018560,3438034943,US -3438034944,3438051327,BS -3438051328,3438084095,US -3438084096,3438116863,CA -3438116864,3438132559,US -3438132560,3438132575,CA -3438132576,3438137183,US -3438137184,3438137191,CA -3438137192,3438139391,US -3438139392,3438140415,GB -3438140416,3438143007,US -3438143008,3438143023,KY -3438143024,3438215423,US -3438215424,3438215935,CA -3438215936,3438216191,US -3438216192,3438217983,CA -3438217984,3438218239,US -3438218240,3438218751,CA -3438218752,3438219263,US -3438219264,3438219519,CA -3438219520,3438219775,US -3438219776,3438246911,CA -3438246912,3438247167,US -3438247168,3438252543,CA -3438252544,3438252799,US -3438252800,3438261759,CA -3438261760,3438262015,US -3438262016,3438280703,CA -3438280704,3438542847,US -3438542848,3438608383,CA -3438608384,3438610125,US -3438610126,3438610126,DE -3438610127,3438610167,US -3438610168,3438610171,PL -3438610172,3438610325,US -3438610326,3438610326,GB -3438610327,3438610408,US -3438610409,3438610410,GB -3438610411,3438611455,US -3438611456,3438611711,GB -3438611712,3438611787,US -3438611788,3438611791,HU -3438611792,3438895103,US -3438895104,3438896639,HN -3438896640,3438915605,US -3438915606,3438915606,GT -3438915607,3439059711,US -3439059712,3439059967,PR -3439059968,3439071103,US -3439071104,3439071135,MX -3439071136,3448303615,US -3448303616,3448303871,KY -3448303872,3448338687,US -3448338688,3448339455,GB -3448339456,3448377343,US -3448377344,3448377855,AG -3448377856,3448379647,US -3448379648,3448379903,SG -3448379904,3448380415,US -3448380416,3448380671,SG -3448380672,3448380839,US -3448380840,3448380847,SG -3448380848,3448381183,US -3448381184,3448381439,SG -3448381440,3448398335,US -3448398336,3448399103,CA -3448399104,3448399359,US -3448399360,3448399871,CA -3448399872,3448444143,US -3448444144,3448444159,SG -3448444160,3448500479,US -3448500480,3448500735,SG -3448500736,3448559103,US -3448559104,3448559359,GB -3448559360,3448717311,US -3448717312,3448717567,AU -3448717568,3448838143,US -3448838144,3448838399,CA -3448838400,3448987647,US -3448987648,3448989695,IN -3448989696,3448990719,HK -3448990720,3448991743,IN -3448991744,3449001245,US -3449001246,3449001246,MC -3449001247,3449098751,US -3449098752,3449099263,DE -3449099264,3449100287,US -3449100288,3449100799,HK -3449100800,3449101311,AU -3449101312,3449159679,US -3449159680,3449168639,CA -3449168640,3449168895,US -3449168896,3449169151,CA -3449169152,3449169663,US -3449169664,3449170431,CA -3449170432,3449170687,US -3449170688,3449171199,CA -3449171200,3449171711,US -3449171712,3449172991,CA -3449172992,3449173247,US -3449173248,3449173503,CA -3449173504,3449173759,US -3449173760,3449174783,CA -3449174784,3449175039,US -3449175040,3449175295,CA -3449175296,3449175551,US -3449175552,3449175807,CA -3449175808,3449176063,US -3449176064,3449178367,CA -3449178368,3449178623,US -3449178624,3449179903,CA -3449179904,3449180671,US -3449180672,3449181951,CA -3449181952,3449182015,US -3449182016,3449182031,CA -3449182032,3449182207,US -3449182208,3449186303,CA -3449186304,3449186559,US -3449186560,3449186815,CA -3449186816,3449187071,US -3449187072,3449187583,CA -3449187584,3449187839,US -3449187840,3449188095,CA -3449188096,3449188351,US -3449188352,3449188607,CA -3449188608,3449188671,US -3449188672,3449188703,CA -3449188704,3449188863,US -3449188864,3449189375,CA -3449189376,3449189887,US -3449189888,3449190655,CA -3449190656,3449190911,US -3449190912,3449191167,CA -3449191168,3449191423,US -3449191424,3449191679,CA -3449191680,3449192447,US -3449192448,3449195775,CA -3449195776,3449196031,US -3449196032,3449196287,CA -3449196288,3449198687,US -3449198688,3449198719,CA -3449198720,3449203711,US -3449203712,3449203775,CA -3449203776,3449204223,US -3449204224,3449204479,CA -3449204480,3449204735,US -3449204736,3449205759,CA -3449205760,3449208927,US -3449208928,3449208943,CA -3449208944,3449209343,US -3449209344,3449209599,CA -3449209600,3449210367,US -3449210368,3449212415,CA -3449212416,3449212671,US -3449212672,3449212927,CA -3449212928,3449213183,US -3449213184,3449213695,CA -3449213696,3449214975,US -3449214976,3449215487,CA -3449215488,3449215871,US -3449215872,3449215999,CA -3449216000,3449220607,US -3449220608,3449221375,CA -3449221376,3449222655,US -3449222656,3449224959,CA -3449224960,3449225471,US -3449225472,3449254143,CA -3449254144,3449254911,US -3449254912,3449273599,CA -3449273600,3449273855,US -3449273856,3449278975,CA -3449278976,3449279487,US -3449279488,3449290495,CA -3449290496,3449569279,US -3449569280,3449572068,AU -3449572069,3449572069,US -3449572070,3449573375,AU -3449573376,3449575423,US -3449575424,3449577471,AU -3449577472,3449598207,US -3449598208,3449598463,GB -3449598464,3449638911,US -3449638912,3449639167,GB -3449639168,3449639423,US -3449639424,3449639679,GB -3449639680,3449639935,US -3449639936,3449640191,GB -3449640192,3449640447,NL -3449640448,3449640959,GB -3449640960,3449641215,NL -3449641216,3449641471,GB -3449641472,3449769727,US -3449769728,3449769983,ZA -3449769984,3449823231,US -3449823232,3449824255,CO -3449824256,3449835519,US -3449835520,3449836543,ES -3449836544,3449843199,US -3449843200,3449843711,YE -3449843712,3449874687,US -3449874688,3449874943,AG -3449874944,3449923583,US -3449923584,3449923839,ES -3449923840,3449974783,US -3449974784,3449976831,CA -3449976832,3449994239,US -3449994240,3449994495,MX -3449994496,3449999375,US -3449999376,3449999376,MY -3449999377,3450078911,US -3450078912,3450078943,CN -3450078944,3450086143,US -3450086144,3450086655,CH -3450086656,3450088191,US -3450088192,3450088447,CH -3450088448,3450093055,US -3450093056,3450093311,CH -3450093312,3450217215,US -3450217216,3450217471,LC -3450217472,3450254079,US -3450254080,3450254335,CA -3450254336,3450272511,US -3450272512,3450272767,MX -3450272768,3450275327,US -3450275328,3450275583,GB -3450275584,3450275839,FR -3450275840,3450345279,US -3450345280,3450345287,AT -3450345288,3450345295,DE -3450345296,3450345303,CZ -3450345304,3450345335,US -3450345336,3450345343,CN -3450345344,3450345359,US -3450345360,3450345367,DE -3450345368,3450345407,US -3450345408,3450345415,IT -3450345416,3450345423,CZ -3450345424,3450345439,DE -3450345440,3450612479,US -3450612480,3450612735,CA -3450612736,3450632191,US -3450632192,3450634239,CA -3450634240,3450685183,US -3450685184,3450685439,CA -3450685440,3450699007,US -3450699008,3450699263,CA -3450699264,3450731519,US -3450731520,3450732543,CA -3450732544,3450773503,US -3450773504,3450777599,CA -3450777600,3450852351,US -3450852352,3450853375,CA -3450853376,3450986495,US -3450986496,3450986751,HK -3450986752,3451170303,US -3451170304,3451170559,VE -3451170560,3451187967,US -3451187968,3451188223,AU -3451188224,3451207423,US -3451207424,3451207679,CH -3451207680,3451236351,US -3451236352,3451236607,HU -3451236608,3451371519,US -3451371520,3451371775,GB -3451371776,3451503103,US -3451503104,3451503359,BR -3451503360,3451507199,US -3451507200,3451507711,BR -3451507712,3451715839,US -3451715840,3451724543,CA -3451724544,3451725311,US -3451725568,3451726847,CA -3451726848,3451727359,US -3451727360,3451737343,CA -3451737344,3451737599,US -3451737600,3451740927,CA -3451740928,3451741183,US -3451741184,3451741695,CA -3451741696,3451742207,US -3451742208,3451744255,CA -3451744256,3451745535,US -3451745536,3451749887,CA -3451749888,3451750143,US -3451750144,3451766783,CA -3451766784,3451767295,US -3451767296,3451767551,CA -3451767552,3451767807,US -3451767808,3451780863,CA -3451780864,3451783935,US -3451783936,3451784191,CA -3451784192,3451786751,US -3451786752,3451787007,CA -3451787008,3451788031,US -3451788032,3451788287,CA -3451788288,3451798783,US -3451798784,3451799039,CA -3451799040,3451800063,US -3451800064,3451800319,CA -3451800320,3451807231,US -3451807232,3451807487,CA -3451807488,3451808511,US -3451808512,3451808767,CA -3451808768,3451810815,US -3451810816,3451811327,CA -3451811328,3451821567,US -3451821568,3451821823,PR -3451821824,3451824127,US -3451824128,3451824383,CA -3451824384,3451827455,US -3451827456,3451827711,PR -3451827712,3451828991,US -3451828992,3451829247,CA -3451829248,3451835903,US -3451835904,3451836159,CA -3451836160,3451836927,US -3451836928,3451837183,CA -3451837184,3451837695,US -3451837696,3451837951,CA -3451837952,3451840255,US -3451840256,3451840767,CA -3451840768,3451879423,US -3451879424,3451879935,DE -3451879936,3451890431,US -3451890432,3451890687,AU -3451890688,3451896319,US -3451896320,3451896575,DE -3451896576,3451912191,US -3451912192,3452174335,CA -3452174336,3452436479,US -3452436480,3452502015,CA -3452502016,3452506111,HK -3452506112,3452516095,US -3452516096,3452516351,PL -3452516352,3452658431,US -3452658432,3452658687,HK -3452658688,3452715007,US -3452715008,3452723199,CA -3452723200,3452730623,US -3452730624,3452730879,HK -3452730880,3452764671,US -3452764672,3452765183,CA -3452765184,3452765439,US -3452765440,3452765951,CA -3452765952,3452766207,US -3452766208,3452766463,CA -3452766464,3452766975,US -3452766976,3452767487,CA -3452767488,3452767743,US -3452767744,3452767999,CA -3452768000,3452768607,US -3452768608,3452768639,CA -3452768640,3452769023,US -3452769024,3452769535,CA -3452769536,3452769791,US -3452769792,3452770047,CA -3452770048,3452770303,US -3452770304,3452770559,CA -3452770560,3452770815,US -3452770816,3452771071,CA -3452771072,3452771839,US -3452771840,3452773119,CA -3452773120,3452773375,US -3452773376,3452773887,CA -3452773888,3452774655,US -3452774656,3452774911,CA -3452774912,3452775167,US -3452775168,3452775935,CA -3452775936,3452776191,US -3452776192,3452776703,CA -3452776704,3452776959,US -3452776960,3452777471,CA -3452777472,3452777727,US -3452777728,3452779007,CA -3452779008,3452779263,US -3452779264,3452779519,CA -3452779520,3452780031,US -3452780032,3452780543,CA -3452780544,3452781055,US -3452781056,3452781567,CA -3452781568,3452781823,US -3452781824,3452782079,CA -3452782080,3452782335,US -3452782336,3452783359,CA -3452783360,3452783871,US -3452783872,3452784639,CA -3452784640,3452784895,US -3452784896,3452785151,CA -3452785152,3452785407,US -3452785408,3452785919,CA -3452785920,3452786175,US -3452786176,3452787455,CA -3452787456,3452787711,US -3452787712,3452789503,CA -3452789504,3452789759,US -3452789760,3452790271,CA -3452790272,3452791551,US -3452791552,3452793087,CA -3452793088,3452793343,US -3452793344,3452793599,CA -3452793600,3452793855,US -3452793856,3452795135,CA -3452795136,3452795391,US -3452795392,3452796159,CA -3452796160,3452796415,US -3452796416,3452797183,CA -3452797184,3452797439,US -3452797440,3452798719,CA -3452798720,3452798975,US -3452798976,3452799487,CA -3452799488,3452799743,US -3452799744,3452801535,CA -3452801536,3452801791,US -3452801792,3452802559,CA -3452802560,3452802815,US -3452802816,3452803327,CA -3452803328,3452803583,US -3452803584,3452806143,CA -3452806144,3452806911,US -3452806912,3452807167,CA -3452807168,3452807423,US -3452807424,3452807679,CA -3452807680,3452807935,US -3452807936,3452808191,CA -3452808192,3452808447,US -3452808448,3452809727,CA -3452809728,3452809983,US -3452809984,3452810239,CA -3452810240,3452811007,US -3452811008,3452811519,CA -3452811520,3452811775,US -3452811776,3452812287,CA -3452812288,3452812543,US -3452812544,3452813311,CA -3452813312,3452813567,US -3452813568,3452814079,CA -3452814080,3452814335,US -3452814336,3452815359,CA -3452815360,3452815615,US -3452815616,3452816127,CA -3452816128,3452816511,US -3452816512,3452816527,CA -3452816528,3452816895,US -3452816896,3452817663,CA -3452817664,3452817919,US -3452817920,3452818431,CA -3452818432,3452818687,US -3452818688,3452818943,CA -3452818944,3452819199,US -3452819200,3452819711,CA -3452819712,3452820479,US -3452820480,3452820735,CA -3452820736,3452820991,US -3452820992,3452821503,CA -3452821504,3452822271,US -3452822272,3452822527,CA -3452822528,3452822783,US -3452822784,3452823551,CA -3452823552,3452823807,US -3452823808,3452824063,CA -3452824064,3452824319,US -3452824320,3452824575,CA -3452824576,3452824831,US -3452824832,3452825599,CA -3452825600,3452825855,US -3452825856,3452827135,CA -3452827136,3452827391,US -3452827392,3452828927,CA -3452828928,3452829439,US -3452829440,3452895231,CA -3452895232,3452895487,US -3452895488,3452902399,CA -3452902400,3452902655,US -3452902656,3452912127,CA -3452912128,3452912383,US -3452912384,3452914175,CA -3452914176,3452914431,US -3452914432,3452919551,CA -3452919552,3452919807,US -3452919808,3452920831,CA -3452920832,3452923391,US -3452923392,3452931327,CA -3452931328,3452931583,US -3452931584,3452933119,CA -3452933120,3452933631,US -3452933632,3452934911,CA -3452934912,3452936191,US -3452936192,3452938751,CA -3452938752,3452939023,US -3452939024,3452939039,CA -3452939040,3452939263,US -3452939264,3452942847,CA -3452942848,3452943103,US -3452943104,3452953087,CA -3452953088,3452953343,US -3452953344,3452958207,CA -3452958208,3452958719,US -3452958720,3452960511,CA -3452960512,3453026559,US -3453026560,3453028095,CA -3453028096,3453028351,US -3453028352,3453029375,CA -3453029376,3453092095,US -3453092096,3453096959,CA -3453096960,3453097983,US -3453097984,3453101055,CA -3453101056,3453101311,US -3453101312,3453108223,CA -3453108224,3453109759,US -3453109760,3453123839,CA -3453123840,3453124095,US -3453124096,3453128959,CA -3453128960,3453129215,US -3453129216,3453129983,CA -3453129984,3453130239,US -3453130240,3453133823,CA -3453133824,3453134847,US -3453134848,3453139455,CA -3453139456,3453140991,US -3453140992,3453149183,CA -3453149184,3453149439,US -3453149440,3453151743,CA -3453151744,3453151999,US -3453152000,3453155327,CA -3453155328,3453155583,US -3453155584,3453157119,CA -3453157120,3453157631,US -3453157632,3453159423,CA -3453159424,3453159935,BM -3453159936,3453163519,CA -3453163520,3453164031,US -3453164032,3453180671,CA -3453180672,3453180927,US -3453180928,3453195263,CA -3453195264,3453195519,US -3453195520,3453206527,CA -3453206528,3453207551,HN -3453207552,3453207807,NI -3453207808,3453208575,HN -3453208576,3453208831,NI -3453208832,3453209599,HN -3453209600,3453209855,US -3453209856,3453210367,HN -3453210368,3453210623,SV -3453210624,3453213183,CR -3453213184,3453214719,HN -3453214720,3453215231,GT -3453215232,3453215999,SV -3453216000,3453217023,CR -3453217024,3453217791,SV -3453217792,3453219327,CR -3453219328,3453219583,US -3453219584,3453219839,SV -3453219840,3453220607,US -3453220608,3453222911,HN -3453222912,3453403135,US -3453403136,3453405951,BB -3453405952,3453406207,KN -3453406208,3453406463,TC -3453406464,3453406975,VC -3453406976,3453407231,GD -3453407232,3453407743,BB -3453407744,3453408255,GD -3453408256,3453409023,BB -3453409024,3453409535,KN -3453409536,3453411327,BB -3453411328,3453419519,US -3453419520,3453427711,MO -3453427712,3453551844,US -3453551845,3453551845,GB -3453551846,3453552127,US -3453552128,3453552383,GB -3453552384,3453552639,US -3453552640,3453552895,GB -3453552896,3453553151,US -3453553152,3453553407,GB -3453553408,3453554431,US -3453554432,3453554687,GB -3453554688,3453555967,US -3453555968,3453556031,GB -3453556032,3453599999,US -3453600000,3453600767,GB -3453600768,3453607935,US -3453607936,3453609983,KN -3453609984,3453610495,AG -3453610496,3453611263,KN -3453611264,3453611775,DM -3453611776,3453612031,KN -3453612032,3453612543,DM -3453612544,3453613055,KN -3453613056,3453614591,AG -3453614592,3453615103,DM -3453615104,3453615359,AG -3453615360,3453615615,KN -3453615616,3453616127,AG -3453616128,3454003013,US -3454003014,3454003014,ES -3454003015,3454004997,US -3454004998,3454004998,GB -3454004999,3454287871,US -3454287872,3454296063,GB -3454296064,3454304255,JP -3454304256,3454436351,US -3454436352,3454436607,GU -3454436608,3454497791,US -3454497792,3454498815,MX -3454498816,3454599423,US -3454599424,3454601215,CA -3454601216,3454603007,US -3454603008,3454603519,CA -3454603520,3454604031,US -3454604032,3454604799,CA -3454604800,3454607359,US -3454607360,3454608127,CA -3454608128,3454608383,US -3454608384,3454609151,CA -3454609152,3454611455,US -3454611456,3454617343,CA -3454617344,3454617599,US -3454617600,3454617855,CA -3454617856,3454618111,US -3454618112,3454618367,CA -3454618368,3454618623,US -3454618624,3454619647,DO -3454619648,3454631423,CA -3454631424,3454631935,US -3454631936,3454634751,CA -3454634752,3454636031,US -3454636032,3454636799,CA -3454636800,3454637055,US -3454637056,3454652159,CA -3454652160,3454652415,US -3454652416,3454661631,CA -3454661632,3454662655,US -3454662656,3454664447,CA -3454664448,3454668799,US -3454668800,3454669567,CA -3454669568,3454669823,US -3454669824,3454670847,CA -3454670848,3454672895,US -3454672896,3454681087,CA -3454681088,3454694143,US -3454694144,3454694399,CA -3454694400,3454718767,US -3454718768,3454718775,EG -3454718776,3454721183,US -3454721184,3454721191,EG -3454721192,3454727935,US -3454727936,3454728191,JP -3454728192,3454730239,US -3454730240,3454732287,EC -3454732288,3454796031,US -3454796032,3454808831,CA -3454808832,3454809087,US -3454809088,3454810111,CA -3454810112,3454810367,US -3454810368,3454813951,CA -3454813952,3454814207,US -3454814208,3454814975,CA -3454814976,3454815231,US -3454815232,3454815743,CA -3454815744,3454816255,US -3454816256,3454816511,CA -3454816512,3454816767,US -3454816768,3454828287,CA -3454828288,3454828543,US -3454828544,3454861055,CA -3454861056,3454861567,US -3454861568,3454867711,CA -3454867712,3454867967,US -3454867968,3454881535,CA -3454881536,3454881791,US -3454881792,3454883839,CA -3454883840,3454915071,US -3454915072,3454926847,CA -3454926848,3455017471,US -3455017472,3455017983,GB -3455017984,3455035391,US -3455035392,3455035903,AU -3455035904,3455109119,US -3455109120,3455111167,HN -3455111168,3455115263,SR -3455115264,3455126527,US -3455126528,3455126783,MX -3455126784,3455132159,US -3455132160,3455133695,BO -3455133696,3455320063,US -3455320064,3455322111,FR -3455322112,3455330815,US -3455330816,3455331327,ES -3455331328,3455357951,US -3455357952,3455358975,BB -3455358976,3455359231,US -3455359232,3455359487,ES -3455359488,3455418367,US -3455418368,3455418879,KY -3455418880,3455453439,US -3455453440,3455453695,HT -3455453696,3455488103,US -3455488104,3455488111,CA -3455488112,3455582207,US -3455582208,3455583743,SG -3455583744,3455584255,NL -3455584256,3455584767,GB -3455584768,3455588351,US -3455588352,3455588863,BE -3455588864,3455589119,FR -3455589120,3455589375,US -3455589376,3455589631,BE -3455589632,3455592191,US -3455592192,3455592447,IE -3455592448,3455592703,KR -3455592704,3455594239,US -3455594240,3455594495,DE -3455594496,3455594751,TW -3455594752,3455595519,US -3455595520,3455595775,KR -3455595776,3455596031,FR -3455596032,3455596543,CH -3455596544,3455596799,NL -3455596800,3455597311,US -3455597312,3455597567,FR -3455597568,3455598847,US -3455598848,3455599103,NO -3455599104,3455599359,US -3455599360,3455599615,MX -3455599616,3455600127,TW -3455600128,3455600639,GB -3455600640,3455600895,US -3455600896,3455601151,GB -3455601152,3455601407,US -3455601408,3455601919,GB -3455601920,3455602175,US -3455602176,3455602687,GB -3455602688,3455616511,US -3455616512,3455616767,CA -3455616768,3455617279,US -3455617280,3455619071,GB -3455619072,3455619263,US -3455619264,3455619327,AR -3455619328,3455619839,US -3455619840,3455620095,GB -3455620096,3455620287,US -3455620288,3455620351,VE -3455620352,3455621631,US -3455621632,3455622143,GB -3455622144,3455624191,US -3455624192,3455624447,FR -3455624448,3455627519,US -3455627520,3455628287,DK -3455628288,3455628543,BE -3455628544,3455628799,CA -3455628800,3455630847,GB -3455630848,3455631103,US -3455631104,3455631359,GB -3455631360,3455632639,ES -3455632640,3455632895,US -3455632896,3455633407,GB -3455633408,3455634431,US -3455634432,3455635455,DE -3455635456,3455635711,US -3455635712,3455635967,FR -3455635968,3455636223,DE -3455636224,3455636479,CA -3455636480,3455637759,US -3455637760,3455638271,GB -3455638272,3455638527,BE -3455638528,3455639551,US -3455639552,3455639807,IT -3455639808,3455640063,US -3455640064,3455640319,CA -3455640320,3455640575,GB -3455640576,3455640831,US -3455640832,3455641087,GB -3455641088,3455641343,NL -3455641344,3455641599,GB -3455641600,3455642879,US -3455642880,3455643135,FR -3455643136,3455644159,US -3455644160,3455644415,HK -3455644416,3455644927,US -3455644928,3455645439,GB -3455645440,3455645695,JP -3455645696,3455645951,BE -3455645952,3455646719,FR -3455646720,3455646975,SE -3455646976,3455647231,GB -3455647232,3455647487,HK -3455647488,3455647743,IT -3455647744,3455713279,US -3455713280,3455778815,CA -3455778816,3455802623,US -3455802624,3455802879,EG -3455802880,3455848927,US -3455848928,3455848959,TW -3455848960,3455871999,US -3455872000,3455872255,ZM -3455872256,3455899969,US -3455899970,3455899970,HK -3455899971,3455903967,US -3455903968,3455903983,HK -3455903984,3455905791,US -3455905792,3455906047,MX -3455906048,3455909887,US -3455909888,3455975423,IN -3455975424,3456303103,US -3456303104,3456311295,JP -3456311296,3456360447,US -3456360448,3456364543,BG -3456364544,3456892927,US -3456892928,3456958463,CA -3456958464,3457551871,US -3457551872,3457552127,CA -3457552128,3457553407,US -3457553408,3457553663,CA -3457553664,3457554175,US -3457554176,3457554431,CA -3457554432,3457555711,US -3457555712,3457555967,CA -3457555968,3457564927,US -3457564928,3457565183,CA -3457565184,3457575167,US -3457575168,3457575423,CA -3457575424,3457577727,US -3457577728,3457578239,CA -3457578240,3457580543,US -3457580544,3457580799,CA -3457580800,3457582591,US -3457582592,3457582847,CA -3457582848,3457592319,US -3457592320,3457592575,CA -3457592576,3457595391,US -3457595392,3457595903,CA -3457595904,3457596671,US -3457596672,3457597695,CA -3457597696,3457598207,US -3457598208,3457598463,CA -3457598464,3457600511,US -3457600512,3457600767,CA -3457600768,3457683967,US -3457683968,3457684479,CA -3457684480,3457684735,US -3457684736,3457684991,CA -3457684992,3457756351,US -3457756352,3457756383,GB -3457756384,3457762559,US -3457762560,3457762687,CA -3457762688,3457859839,US -3457859840,3457860095,CA -3457860096,3457892351,US -3457892352,3457892607,IN -3457892608,3458039807,US -3458039808,3458043903,CA -3458043904,3458195455,US -3458195456,3458196479,SG -3458196480,3458233343,US -3458233344,3458234367,CA -3458234368,3458813951,US -3458813952,3458818047,CA -3458818048,3458820095,US -3458820096,3458820351,CA -3458820352,3458820863,US -3458820864,3458821119,JM -3458821120,3458821887,US -3458821888,3458822143,CA -3458822144,3459055615,US -3459055616,3459121151,CA -3459121152,3459186687,US -3459186688,3459230975,CA -3459230976,3459231231,US -3459231232,3459252223,CA -3459252224,3459256831,US -3459256832,3459257087,CO -3459257088,3459257343,US -3459257344,3459258367,AW -3459258368,3459259391,CL -3459259392,3459264767,US -3459264768,3459265023,VE -3459265024,3459266559,US -3459266560,3459267327,AG -3459267328,3459267583,AI -3459267584,3459267839,AG -3459267840,3459268095,DM -3459268096,3459268607,AG -3459268608,3459273727,US -3459273728,3459274751,CL -3459274752,3459277823,US -3459277824,3459278847,AW -3459278848,3459285503,US -3459285504,3459286271,CL -3459286272,3459287807,US -3459287808,3459288063,CL -3459288064,3459290111,US -3459290112,3459290623,CL -3459290624,3459295231,US -3459295232,3459296255,KR -3459296256,3459310591,US -3459310592,3459310847,KY -3459310848,3459312639,US -3459312640,3459312671,MX -3459312672,3459312767,US -3459312768,3459312895,MX -3459312896,3459325951,US -3459325952,3459326207,VE -3459326208,3459326463,SZ -3459326464,3459327487,CA -3459327488,3459327999,CO -3459328000,3459329023,CL -3459329024,3459330047,VE -3459330048,3459334399,US -3459334400,3459334655,CA -3459334656,3459335423,US -3459335424,3459335679,VE -3459335680,3459335935,DO -3459335936,3459336191,VE -3459336192,3459336447,MX -3459336448,3459336703,US -3459336704,3459336959,LK -3459336960,3459337215,AW -3459337216,3459337471,CO -3459337472,3459337727,VE -3459337728,3459337983,MX -3459337984,3459338239,US -3459338240,3459338495,SV -3459338496,3459339263,PH -3459339264,3459339519,ID -3459339520,3459339775,US -3459339776,3459340031,ID -3459340032,3459340287,VE -3459340288,3459340543,MX -3459340544,3459340799,FM -3459340800,3459341055,SK -3459341056,3459341311,MX -3459341312,3459341567,TW -3459341568,3459341823,US -3459341824,3459342079,IL -3459342080,3459342335,LK -3459342336,3459342591,VE -3459342592,3459342847,BY -3459342848,3459343103,VE -3459343104,3459343359,BR -3459343360,3459343615,CA -3459343616,3459344127,OM -3459344128,3459346431,US -3459346432,3459346687,LK -3459346688,3459346943,US -3459346944,3459347455,PR -3459347456,3459347711,US -3459347712,3459348223,PR -3459348224,3459348479,AG -3459348480,3459348735,CO -3459348736,3459348991,BW -3459348992,3459349503,IT -3459349504,3459350527,US -3459350528,3459352575,VE -3459352576,3459352831,US -3459352832,3459353087,FM -3459353088,3459353343,US -3459353344,3459354623,CO -3459354624,3459357183,NI -3459357184,3459357439,VE -3459357440,3459357695,HT -3459357696,3459357951,SV -3459357952,3459358207,TG -3459358208,3459358719,PR -3459358720,3459358975,VE -3459358976,3459359999,US -3459360000,3459360511,VE -3459360512,3459362815,US -3459362816,3459364863,CO -3459364864,3459366911,AR -3459366912,3459367167,VE -3459367168,3459367423,US -3459367424,3459368703,VE -3459368704,3459368959,US -3459368960,3459371007,MX -3459371008,3459373055,PE -3459373056,3459373311,US -3459373312,3459375103,CL -3459375104,3459376127,VE -3459376128,3459448831,US -3459448832,3459449087,PR -3459449088,3459450623,CA -3459450624,3459450879,US -3459450880,3459456511,CA -3459456512,3459456767,US -3459456768,3459457279,CA -3459457280,3459457535,US -3459457536,3459457791,CA -3459457792,3459512319,US -3459512320,3459513855,CA -3459513856,3459592191,US -3459592192,3459596287,CA -3459596288,3459615231,US -3459615232,3459615487,GB -3459615488,3459615743,US -3459615744,3459615999,CA -3459616000,3459616255,DM -3459616256,3459616767,US -3459616768,3459617999,CA -3459618000,3459618000,ID -3459618001,3459620863,CA -3459620864,3459624959,US -3459624960,3459629055,BM -3459629056,3459686399,US -3459686400,3459689471,NL -3459689472,3459690239,US -3459690240,3459690751,NL -3459690752,3459691007,US -3459691008,3459691519,NL -3459691520,3459691775,US -3459691776,3459692543,NL -3459692544,3459731455,US -3459731456,3459735551,CA -3459735552,3459745535,US -3459745536,3459745791,IT -3459745792,3459848959,US -3459848960,3459849215,FR -3459849216,3459873311,US -3459873312,3459873327,MX -3459873328,3460104703,US -3460104704,3460105215,MX -3460105216,3460111971,US -3460111972,3460111972,MX -3460111973,3460114431,US -3460114432,3460116479,SR -3460116480,3460161535,US -3460161536,3460165631,PR -3460165632,3460374527,US -3460374528,3460375551,MX -3460375552,3460453631,US -3460453632,3460453887,BS -3460453888,3460507647,US -3460507648,3460507903,MX -3460507904,3460762367,US -3460762368,3460762623,CA -3460762624,3460763391,US -3460763392,3460763647,VG -3460763648,3460794623,US -3460794624,3460794879,CA -3460794880,3460878335,US -3460878336,3460878591,CA -3460878592,3460880383,US -3460882432,3460893439,US -3460893440,3460893695,IT -3460893696,3460894463,US -3460894464,3460894719,JP -3460894720,3460895231,US -3460895232,3460895487,BE -3460895488,3460896255,US -3460896256,3460896511,ZA -3460896512,3460896767,ES -3460896768,3460897023,FR -3460897024,3460897279,GB -3460897280,3460899327,US -3460899328,3460899583,ZA -3460899584,3460901375,US -3460901376,3460901631,SE -3460901632,3460907263,US -3460907264,3460907519,SG -3460907520,3460908287,US -3460908288,3460908543,FI -3460908544,3460908799,US -3460908800,3460910335,IE -3460910336,3460910591,US -3460910592,3460910847,IE -3460910848,3460912127,US -3460912128,3460912383,IT -3460912384,3460912639,FR -3460912640,3460912895,ES -3460912896,3460916223,US -3460916224,3460916479,CH -3460916480,3460916735,GB -3460916736,3460916991,AR -3460916992,3460917759,US -3460917760,3460918015,CA -3460918016,3460918271,US -3460918272,3460918527,NL -3460918528,3460918783,US -3460918784,3460919039,JP -3460919040,3460919295,NL -3460919296,3460920319,US -3460920320,3460920575,IT -3460920576,3460920831,BE -3460920832,3460921343,US -3460921344,3460921599,DE -3460921600,3460921855,AU -3460921856,3460924671,US -3460924672,3460925183,GB -3460925184,3460925695,US -3460925696,3460925951,ES -3460925952,3460926207,US -3460926208,3460926463,GB -3460926464,3460926719,US -3460926720,3460926975,DE -3460926976,3460927231,US -3460927232,3460929023,BE -3460929024,3460929279,US -3460929280,3460929535,DE -3460929536,3460929791,GB -3460929792,3460930047,DK -3460930048,3460931583,US -3460931584,3460931839,SE -3460931840,3460932095,DE -3460932096,3460932351,GB -3460932352,3460932607,FR -3460932608,3460932863,US -3460932864,3460933119,GB -3460933120,3460933887,US -3460933888,3460934143,DE -3460934144,3460934911,US -3460934912,3460935167,SG -3460935168,3460935679,US -3460935680,3460935935,FI -3460935936,3460936191,FR -3460936192,3460936447,US -3460936448,3460936703,GB -3460936704,3460936959,IT -3460936960,3460937215,DE -3460937216,3460937471,FR -3460937472,3460937727,US -3460937728,3460937983,DK -3460937984,3460938239,IE -3460938240,3460938495,DE -3460938496,3460939263,US -3460939264,3460939519,HK -3460939520,3460941567,US -3460941568,3460941823,AU -3460941824,3460942079,US -3460942080,3460942335,GB -3460942336,3460943359,US -3460943360,3460943615,ID -3460943616,3460943871,HK -3460943872,3460944895,US -3460944896,3460945151,DE -3460945152,3460945663,US -3460945664,3460945919,GB -3460945920,3460946687,US -3460946688,3460946943,DE -3460946944,3460947455,US -3460947456,3460947711,DE -3460947712,3460947967,SE -3460947968,3460950271,US -3460950272,3460950527,DE -3460950528,3460951295,US -3460951296,3460951551,GB -3460951552,3460952319,US -3460952320,3460952575,GB -3460952576,3460952831,ES -3460952832,3460953855,US -3460953856,3460954111,GB -3460954112,3460954623,US -3460954624,3460954879,DE -3460954880,3460955135,LU -3460955136,3461021695,US -3461021696,3461031935,CA -3461031936,3461032191,US -3461032192,3461087231,CA -3461087232,3461330943,US -3461330944,3461331199,SG -3461331200,3461331711,US -3461331712,3461331967,SG -3461331968,3461332223,US -3461332224,3461332479,SG -3461332480,3461332735,US -3461332736,3461332991,SG -3461332992,3461356543,US -3461356544,3461357567,AS -3461357568,3461409023,US -3461410816,3461414911,CA -3461414912,3461462015,US -3461462016,3461462271,AU -3461462272,3461462527,NL -3461462528,3461462783,US -3461462784,3461463039,SG -3461463040,3461513727,US -3461513728,3461513983,BF -3461513984,3461514495,US -3461514496,3461514751,QA -3461514752,3461515775,US -3461515776,3461516031,CA -3461516032,3461516287,US -3461516288,3461516543,IL -3461516544,3461808127,US -3461808128,3461873663,CA -3461873664,3461897727,US -3461897728,3461897983,CA -3461897984,3461905407,US -3461905408,3461905663,CA -3461905664,3461940735,US -3461940736,3461940991,CA -3461940992,3461948159,US -3461948160,3461948415,CA -3461948416,3461948927,US -3461948928,3461949183,CA -3461949184,3461949695,US -3461949696,3461950207,CA -3461950208,3461950719,US -3461950720,3461951231,CA -3461951232,3461953535,US -3461953536,3461953791,CA -3461953792,3461968127,US -3461968128,3461968383,CA -3461968384,3461970431,US -3461970432,3461970687,CA -3461970688,3461972223,US -3461972224,3461972479,CA -3461972480,3461977855,US -3461977856,3461978111,CA -3461978112,3461992703,US -3461992704,3461992959,CA -3461992960,3461999871,US -3461999872,3462000127,PR -3462000128,3462000895,US -3462000896,3462001151,CA -3462001152,3462001919,US -3462001920,3462002431,CA -3462002432,3462148607,US -3462148608,3462148863,CA -3462148864,3462160895,US -3462160896,3462161151,PR -3462161152,3462163967,US -3462163968,3462164223,CA -3462164224,3462168319,US -3462168320,3462168575,CA -3462168576,3462169599,US -3462169600,3462169855,CA -3462169856,3462170623,US -3462170624,3462171135,CA -3462171136,3462171391,US -3462171392,3462171647,CA -3462171648,3462173695,US -3462173696,3462173951,CA -3462173952,3462174463,US -3462174464,3462174719,CA -3462174720,3462179839,US -3462179840,3462180095,CA -3462180096,3462181375,US -3462181376,3462181887,CA -3462181888,3462191871,US -3462191872,3462192127,PR -3462192128,3462194175,US -3462194176,3462194431,CA -3462194432,3462231039,US -3462231040,3462231295,CA -3462231296,3462231807,US -3462231808,3462232063,CA -3462232064,3462268415,US -3462268416,3462268671,CA -3462268672,3462290175,US -3462290176,3462290431,CA -3462290432,3462314239,US -3462314240,3462314495,CA -3462314496,3462321407,US -3462321408,3462321663,CA -3462321664,3462321919,US -3462321920,3462322175,CA -3462322176,3462323711,US -3462323712,3462323967,CA -3462323968,3462339071,US -3462339072,3462339583,CA -3462339584,3462340607,US -3462340608,3462340863,CA -3462340864,3462350847,US -3462350848,3462351103,CA -3462351104,3462593791,US -3462593792,3462594559,GN -3462594560,3462633471,US -3462633472,3462633727,SG -3462633728,3462633823,US -3462633824,3462633855,SG -3462633856,3462633983,US -3462633984,3462634239,SG -3462634240,3462634751,US -3462634752,3462635007,SG -3462635008,3462635263,US -3462635264,3462635519,SG -3462635520,3462660295,US -3462660296,3462660303,SG -3462660304,3462660327,US -3462660328,3462660335,SG -3462660336,3462661375,US -3462661376,3462661631,SG -3462661632,3463004159,US -3463004160,3463006207,CO -3463006208,3463043071,US -3463043072,3463044095,ES -3463044096,3463089151,US -3463089152,3463090175,CA -3463090176,3463116799,US -3463116800,3463118847,CO -3463118848,3463156735,US -3463156736,3463157759,BO -3463157760,3463176447,US -3463176448,3463176703,CW -3463176704,3463184383,US -3463184384,3463194623,CA -3463194624,3463198719,US -3463198720,3463213311,CA -3463213312,3463215103,US -3463215104,3463243775,CA -3463243776,3463245055,US -3463245056,3463249663,CA -3463249664,3463518207,US -3463518208,3463520255,NL -3463520256,3463708671,US -3463708672,3463774207,CA -3463774208,3464108031,US -3464108032,3464108287,DE -3464108288,3464127999,US -3464128000,3464128255,DE -3464128256,3464129535,US -3464129536,3464130047,DE -3464130048,3464167679,US -3464167680,3464169215,CA -3464169216,3464169471,US -3464169472,3464171775,CA -3464171776,3464172031,US -3464172032,3464173567,CA -3464173568,3464173823,US -3464173824,3464175103,CA -3464175104,3464175359,US -3464175360,3464180735,CA -3464180736,3464200703,US -3464200704,3464200959,AU -3464200960,3464202239,US -3464202240,3464202495,CA -3464202496,3464203007,US -3464203008,3464203263,RU -3464203264,3464203519,DE -3464203520,3464204799,US -3464204800,3464205055,DK -3464205056,3464205311,NL -3464205312,3464205567,SE -3464205568,3464205823,US -3464205824,3464205951,AF -3464205952,3464206079,UZ -3464206080,3464206207,TJ -3464206208,3464206335,KG -3464206336,3464206463,KZ -3464206464,3464206591,TM -3464206592,3464206719,LA -3464206720,3464206847,MN -3464206848,3464206975,LK -3464206976,3464207103,BD -3464207104,3464207231,MM -3464207232,3464207359,PG -3464207360,3464207487,TZ -3464207488,3464207615,MG -3464207616,3464207743,AO -3464207744,3464207871,NE -3464207872,3464207999,MR -3464208000,3464208127,SN -3464208128,3464208255,TN -3464208256,3464208383,DZ -3464208384,3464216575,CA -3464216576,3464261631,US -3464261632,3464265727,CA -3464265728,3464340479,US -3464340480,3464341503,CA -3464341504,3464342287,US -3464342288,3464342295,VN -3464342296,3464349695,US -3464349696,3464351743,CA -3464351744,3464384511,US -3464384512,3464388607,CA -3464388608,3464391935,US -3464391936,3464392191,CA -3464392192,3464392703,US -3464392704,3464392959,CA -3464392960,3464394751,US -3464394752,3464396799,LC -3464396800,3464421631,US -3464421632,3464421887,CA -3464421888,3464426495,US -3464426496,3464426751,GD -3464426752,3464429311,US -3464429312,3464429567,CA -3464429568,3464551663,US -3464551664,3464551671,SG -3464551672,3464551679,US -3464551680,3464551711,SG -3464551712,3464626175,US -3464626432,3464626687,CA -3464626688,3464627967,US -3464627968,3464628735,CA -3464628736,3464628991,US -3464628992,3464630271,CA -3464630272,3464631295,US -3464631296,3464639487,CA -3464639488,3464639743,US -3464639744,3464642047,CA -3464642048,3464642559,US -3464642560,3464642815,CA -3464642816,3464643071,US -3464643072,3464647935,CA -3464647936,3464648191,US -3464648192,3464648703,CA -3464648704,3464649215,US -3464649216,3464650239,CA -3464650240,3464664319,US -3464664320,3464684543,CA -3464684544,3464684799,BL -3464684800,3464688383,CA -3464688384,3464688639,US -3464688640,3464691711,CA -3464691712,3464740863,US -3464740864,3464744959,PH -3464744960,3464769535,US -3464769536,3464773631,CA -3464773632,3464781823,US -3464781824,3464782335,GB -3464782336,3464783871,US -3464783872,3464785919,AR -3464785920,3464802303,US -3464802304,3464806399,CA -3464806400,3465154559,US -3465154560,3465158655,BS -3465158656,3465177087,US -3465177088,3465179135,PE -3465179136,3465412607,US -3465412608,3465412863,HK -3465412864,3465462783,US -3465462784,3465463039,GB -3465463040,3465466495,US -3465466496,3465466527,GB -3465466528,3465470207,US -3465470208,3465470463,GB -3465470464,3465474047,US -3465474048,3465476095,GB -3465476096,3465510911,US -3465510912,3465543679,JP -3465543680,3465962495,US -3465962496,3465962751,CA -3465962752,3466067967,US -3466067968,3466068223,CA -3466068224,3466069055,US -3466069056,3466069087,CA -3466069088,3466069343,US -3466069344,3466069375,CA -3466069376,3466069447,US -3466069448,3466069455,CA -3466069456,3466071807,US -3466071808,3466072063,CA -3466072064,3466072431,US -3466072432,3466072439,CA -3466072440,3466072775,US -3466072776,3466072783,CA -3466072784,3466073055,US -3466073056,3466073087,CA -3466073088,3466074367,US -3466074368,3466074623,CA -3466074624,3466080191,US -3466080192,3466080199,CA -3466080200,3466080255,US -3466080256,3466084351,CA -3466084352,3466158079,US -3466158080,3466166271,PA -3466166272,3466290687,US -3466290688,3466290943,CH -3466290944,3466296575,US -3466296576,3466296831,GB -3466296832,3466489855,US -3466489856,3466490111,CA -3466490112,3466564744,US -3466564745,3466564745,BH -3466564746,3466756095,US -3466756096,3466772479,CA -3466772480,3466846207,US -3466846208,3466854399,CA -3466854400,3466860799,US -3466860800,3466861311,FR -3466861312,3466901503,US -3466901504,3466903551,DE -3466903552,3466907647,US -3466907648,3466909695,DE -3466909696,3466914303,US -3466914304,3466914559,FR -3466914560,3466926551,US -3466926552,3466926559,IT -3466926560,3466929407,US -3466929408,3466929663,IT -3466929664,3466937663,US -3466937664,3466937669,DE -3466937670,3466937670,US -3466937671,3466937727,DE -3466937728,3466938807,US -3466938808,3466938811,GB -3466938812,3466958079,US -3466958080,3466958335,CA -3466958336,3466965503,US -3466965504,3466965759,NL -3466965760,3467051007,US -3467051008,3467051263,CA -3467051264,3467051519,US -3467051520,3467056639,CA -3467056640,3467056895,US -3467056896,3467063295,CA -3467063296,3467063551,US -3467063552,3467068927,CA -3467068928,3467069439,US -3467069440,3467116543,CA -3467116544,3467229695,US -3467229696,3467229951,AS -3467229952,3467378687,US -3467378688,3467444223,CA -3467444224,3467554815,US -3467554816,3467567103,CA -3467567104,3467619935,US -3467619936,3467619967,CA -3467619968,3467706367,US -3467706368,3467902975,CA -3467902976,3467964415,US -3467964416,3467968511,CA -3467968512,3468034047,US -3468034048,3468036095,GB -3468036096,3468036351,BE -3468036352,3468036607,DE -3468036608,3468036863,ES -3468036864,3468037375,DE -3468037376,3468037887,US -3468037888,3468038143,IE -3468038144,3468038655,FR -3468038656,3468038911,NL -3468038912,3468039167,SE -3468039168,3468039423,FR -3468039424,3468041215,US -3468041216,3468041471,FI -3468041472,3468041727,US -3468041728,3468041983,TW -3468041984,3468042367,US -3468042368,3468042431,IT -3468042432,3468042495,US -3468042496,3468042751,AT -3468042752,3468043135,US -3468043136,3468043263,DK -3468043264,3468044799,US -3468044800,3468044927,GB -3468044928,3468045055,DK -3468045056,3468045311,DE -3468045312,3468045695,US -3468045696,3468045823,ZA -3468045824,3468046079,NO -3468046080,3468046335,ZA -3468046336,3468046591,FR -3468046592,3468046719,US -3468046720,3468046847,DE -3468046848,3468047103,IT -3468047104,3468047359,US -3468047360,3468047615,DE -3468047616,3468047743,US -3468047744,3468047807,LU -3468047808,3468047871,US -3468047872,3468047887,ES -3468047888,3468047999,US -3468048000,3468048127,DE -3468048128,3468048383,US -3468048384,3468048639,FR -3468048640,3468049407,US -3468049408,3468049663,GB -3468049664,3468049919,US -3468049920,3468050175,IT -3468050176,3468050431,US -3468050432,3468050687,SE -3468050688,3468050943,US -3468050944,3468051007,IT -3468051008,3468051231,US -3468051232,3468051263,DK -3468051264,3468051327,AT -3468051328,3468052479,US -3468052480,3468052735,ES -3468052736,3468052991,GB -3468052992,3468053759,US -3468053760,3468054015,CH -3468054016,3468054271,DE -3468054272,3468055551,US -3468055552,3468055807,IT -3468055808,3468056575,US -3468056576,3468056831,NO -3468056832,3468056959,DK -3468056960,3468057023,IN -3468057024,3468057087,US -3468057088,3468057215,LU -3468057216,3468057375,GB -3468057376,3468057599,US -3468057600,3468057855,IL -3468057856,3468058111,US -3468058112,3468058175,BE -3468058176,3468058239,CH -3468058240,3468058367,GB -3468058368,3468058368,US -3468058369,3468058432,IT -3468058433,3468058559,US -3468058560,3468058623,SG -3468058624,3468058687,US -3468058688,3468058719,ES -3468058720,3468059647,US -3468059648,3468059903,FR -3468059904,3468060159,DE -3468060160,3468060671,FR -3468060672,3468060927,US -3468060928,3468060991,FR -3468060992,3468061119,US -3468061120,3468061183,CH -3468061184,3468061695,US -3468061696,3468061951,JP -3468061952,3468062079,US -3468062080,3468062143,GB -3468062144,3468062335,US -3468062336,3468062399,TW -3468062400,3468062463,DE -3468062464,3468062719,AT -3468062720,3468063231,NL -3468063232,3468063359,US -3468063360,3468063423,RO -3468063424,3468063487,US -3468063488,3468063743,BE -3468063744,3468063999,US -3468064000,3468064255,HK -3468064256,3468064511,US -3468064512,3468064527,BE -3468064528,3468064543,US -3468064544,3468064575,NO -3468064576,3468064639,US -3468064640,3468064703,LU -3468064704,3468064735,US -3468064736,3468064767,CH -3468064768,3468065023,DE -3468065024,3468065279,US -3468065280,3468065535,DE -3468065536,3468065791,US -3468065792,3468065919,IT -3468065920,3468065951,GB -3468065952,3468065983,LU -3468065984,3468065999,CZ -3468066000,3468066015,BE -3468066016,3468066047,DE -3468066048,3468066239,US -3468066240,3468066271,IE -3468066272,3468066319,US -3468066320,3468066327,FR -3468066328,3468066463,US -3468066464,3468066495,SE -3468066496,3468066527,CH -3468066528,3468066559,US -3468066560,3468066623,IT -3468066624,3468068095,US -3468068096,3468068351,MC -3468068352,3468068863,US -3468068864,3468069631,CA -3468069632,3468081407,US -3468081408,3468081663,DE -3468081664,3468081919,AT -3468081920,3468082431,US -3468082432,3468082687,NO -3468082688,3468083967,US -3468083968,3468084223,AU -3468084224,3468084735,US -3468084736,3468084991,SG -3468084992,3468085759,US -3468085760,3468086015,ID -3468086016,3468087807,US -3468087808,3468088063,SG -3468088064,3468091391,US -3468091392,3468091647,NL -3468091648,3468093695,US -3468093696,3468093951,DE -3468093952,3468095231,US -3468095232,3468095487,SE -3468095488,3468096511,US -3468096512,3468096767,NO -3468096768,3468099327,US -3468099328,3468099583,FR -3468099584,3468127743,US -3468127744,3468128255,IN -3468128256,3468296191,US -3468296192,3468361727,CA -3468361728,3468367871,US -3468367872,3468368895,CA -3468368896,3468443647,US -3468443648,3468460031,CA -3468460032,3468468223,BM -3468468224,3468545791,US -3468545792,3468546047,SG -3468546048,3468597759,US -3468597760,3468598391,SG -3468598392,3468598399,NL -3468598400,3468599039,SG -3468599040,3468599295,HK -3468599296,3468613631,US -3468613632,3468614655,PR -3468614656,3468619007,US -3468619008,3468619263,CA -3468619264,3468623871,US -3468623872,3468656639,CA -3468656640,3468658175,US -3468658176,3468658431,KY -3468658432,3468682159,US -3468682160,3468682175,SG -3468682176,3468682191,US -3468682192,3468682207,SG -3468682208,3468682415,US -3468682416,3468682495,SG -3468682496,3468682559,HK -3468682560,3468682575,US -3468682576,3468682591,HK -3468682592,3468682671,SG -3468682672,3468682735,HK -3468682736,3468682751,US -3468682752,3468682911,HK -3468682912,3468682927,US -3468682928,3468683103,HK -3468683104,3468683279,US -3468683280,3468683311,HK -3468683312,3468685311,US -3468685312,3468685663,IE -3468685664,3468685791,NL -3468685792,3468685807,US -3468685808,3468685823,NL -3468685824,3468687087,US -3468687088,3468687263,NL -3468687264,3468687455,US -3468687456,3468687631,IE -3468687632,3468687983,NL -3468687984,3468688159,IE -3468688160,3468688255,US -3468688256,3468688271,IE -3468688272,3468688303,NL -3468688304,3468688335,IE -3468688336,3468688367,NL -3468688368,3468688399,IE -3468688400,3468688431,NL -3468688432,3468688463,IE -3468688464,3468688495,NL -3468688496,3468688527,IE -3468688528,3468688559,NL -3468688560,3468688591,IE -3468688592,3468688623,NL -3468688624,3468688655,IE -3468688656,3468688687,NL -3468688688,3468688719,IE -3468688720,3468688751,NL -3468688752,3468688783,IE -3468688784,3468688815,NL -3468688816,3468688847,IE -3468688848,3468688879,NL -3468688880,3468688911,IE -3468688912,3468688943,NL -3468688944,3468688959,IE -3468688960,3468802303,US -3468802304,3468802559,CA -3468802560,3468894207,US -3468894208,3468902399,DE -3468902400,3469055743,US -3469055744,3469055999,CA -3469056000,3469070335,US -3469070336,3469070591,CA -3469070592,3469176319,US -3469176320,3469176575,MX -3469176576,3469186303,US -3469186304,3469186559,MX -3469186560,3469893631,US -3469893632,3469901823,CA -3469901824,3469989887,US -3469989888,3469990399,CA -3469990400,3470131199,US -3470131200,3470135295,AG -3470135296,3470136319,LC -3470136320,3470137343,AG -3470137344,3470139391,VG -3470139392,3470153727,US -3470153728,3470153983,IN -3470153984,3470192639,US -3470192640,3470194927,CA -3470194928,3470194935,US -3470194936,3470196735,CA -3470196736,3470453247,US -3470453248,3470453503,GB -3470453504,3470458879,US -3470458880,3470475263,KR -3470475264,3470509311,US -3470509312,3470509567,CA -3470509568,3470558207,US -3470558208,3470559231,HK -3470559232,3470572543,US -3470572544,3470575615,CA -3470575616,3470610431,US -3470610432,3470614527,AR -3470614528,3470646831,US -3470646832,3470646847,IL -3470646848,3470651391,US -3470651392,3470655487,CA -3470655488,3470671871,US -3470671872,3470680063,CA -3470680064,3470744063,US -3470744064,3470744575,CA -3470744576,3470745855,US -3470745856,3470746111,CA -3470746112,3470749951,US -3470749952,3470750207,CA -3470750208,3470752767,US -3470752768,3470753023,CO -3470753024,3470753535,US -3470753536,3470753791,CA -3470753792,3470754047,US -3470754048,3470754303,CA -3470754304,3470754559,PE -3470754560,3470755839,US -3470755840,3470756095,MU -3470756096,3470756607,US -3470756608,3470756863,CA -3470756864,3470761983,US -3470761984,3470770175,CA -3470770176,3470778367,US -3470778368,3470778879,GB -3470778880,3470779519,US -3470779520,3470779647,SE -3470779648,3470779903,US -3470779904,3470780159,GB -3470780160,3470780927,US -3470780928,3470781055,GB -3470781056,3470781183,US -3470781184,3470781695,FR -3470781696,3470785023,US -3470785024,3470785791,GB -3470785792,3470794751,US -3470794752,3470802943,PA -3470802944,3470884863,US -3470884864,3470885887,HK -3470885888,3470886655,US -3470886656,3470886911,GB -3470886912,3470912255,US -3470912256,3470912511,AU -3470912512,3471057919,US -3471057920,3471058943,VE -3471058944,3471059967,US -3471059968,3471060223,ES -3471060224,3471060991,US -3471060992,3471061247,NL -3471061248,3471061503,US -3471061504,3471061759,NL -3471061760,3471093615,US -3471093616,3471093616,SK -3471093617,3471263743,US -3471263744,3471265791,CO -3471265792,3471276031,US -3471276032,3471278079,BB -3471278080,3471282779,US -3471282780,3471282780,TH -3471282781,3471529215,US -3471529216,3471529983,CA -3471529984,3471558655,US -3471558656,3471560703,CA -3471560704,3471570943,US -3471570944,3471572991,CA -3471572992,3472249343,US -3472249344,3472249599,CA -3472249600,3472257599,US -3472257600,3472257627,MX -3472257628,3472257628,RU -3472257629,3472257631,MX -3472257632,3472257663,MY -3472257664,3472375807,US -3472375808,3472392191,PR -3472392192,3472408575,CA -3472408576,3472678911,US -3472678912,3472687103,PL -3472687104,3472721919,US -3472721920,3472723967,CA -3472723968,3473039359,US -3473039360,3473040639,BM -3473040640,3473040895,US -3473040896,3473041407,BM -3473041408,3473043455,US -3473047552,3473067007,US -3473067008,3473068031,CA -3473068032,3473276927,US -3473276928,3473342463,CA -3473342464,3473755391,US -3473755392,3473755647,HN -3473755648,3473764729,US -3473764730,3473764730,HK -3473764731,3473765771,US -3473765772,3473765772,UG -3473765773,3473765887,US -3473765888,3473766399,EC -3473766400,3473786059,US -3473786060,3473786060,ZA -3473786061,3473786111,US -3473786112,3473786127,PR -3473786128,3473835659,US -3473835660,3473835660,VE -3473835661,3473843248,US -3473843249,3473843249,ID -3473843250,3473917439,US -3473917440,3473917695,PR -3473917696,3474053119,US -3474053120,3474055167,PE -3474055168,3474193407,US -3474193408,3474193663,PH -3474193664,3474193919,US -3474193920,3474194431,PH -3474194432,3474309119,US -3474309120,3474325503,CA -3474325504,3474391039,US -3474391040,3474456575,CA -3474456576,3474463231,US -3474463232,3474463487,GB -3474463488,3474464255,US -3474464256,3474464767,GB -3474464768,3474548223,US -3474548224,3474548479,JP -3474548480,3475112191,US -3475112192,3475113215,CA -3475113216,3475115007,US -3475115008,3475120127,CA -3475120128,3475124223,US -3475124224,3475243007,CA -3475243008,3475358719,US -3475358720,3475359231,GB -3475359232,3475386367,US -3475386368,3475390463,CA -3475390464,3475569595,US -3475569596,3475569596,TR -3475569597,3475670015,US -3475670016,3475670271,AG -3475670272,3475670527,AI -3475670528,3475670783,LC -3475670784,3475670847,DM -3475670848,3475671039,AG -3475671040,3475681279,US -3475681280,3475685375,HN -3475685376,3475723779,US -3475723780,3475723780,TW -3475723781,3475766769,US -3475766770,3475766770,BR -3475766771,3475882767,US -3475882768,3475882783,FR -3475882784,3475882799,US -3475882800,3475882815,FR -3475882816,3475885951,US -3475885952,3475885999,CA -3475886000,3475896575,US -3475896576,3475896831,FR -3475896832,3475897471,US -3475897472,3475897503,FR -3475897504,3475906711,US -3475906712,3475906715,IE -3475906716,3475907735,US -3475907736,3475907739,SG -3475907740,3475907743,HK -3475907744,3475907791,US -3475907792,3475907795,IN -3475907796,3475908151,US -3475908152,3475908159,CA -3475908160,3475908223,US -3475908224,3475908227,GU -3475908228,3475909139,US -3475909140,3475909143,IE -3475909144,3475909359,US -3475909360,3475909367,IE -3475909368,3475910655,US -3475910656,3475911519,SG -3475911520,3475911551,HK -3475911552,3475912959,SG -3475912960,3475913215,US -3475913216,3475914751,SG -3475914752,3475914815,US -3475914816,3475914847,JP -3475914848,3475914855,US -3475914856,3475914871,JP -3475914872,3475914879,US -3475914880,3475914911,JP -3475914912,3475914919,US -3475914920,3475914923,JP -3475914924,3475914931,US -3475914932,3475914935,JP -3475914936,3475914951,US -3475914952,3475914959,HK -3475914960,3475914967,US -3475914968,3475914975,JP -3475914976,3475915327,US -3475915328,3475915359,JP -3475915360,3475915455,US -3475915456,3475915487,JP -3475915488,3475915647,US -3475915648,3475915679,JP -3475915680,3475915743,HK -3475915744,3475915775,JP -3475915776,3475916031,US -3475916032,3475916047,HK -3475916048,3475916287,US -3475916288,3475916863,HK -3475916864,3475917055,US -3475917056,3475917183,JP -3475917184,3475917231,US -3475917232,3475917311,JP -3475917312,3475917791,US -3475917792,3475917823,JP -3475917824,3475918207,US -3475918208,3475918271,JP -3475918272,3475918319,HK -3475918320,3475919871,US -3475919872,3475920383,JP -3475920384,3475920639,US -3475920640,3475920895,HK -3475920896,3475921167,US -3475921168,3475921183,HK -3475921184,3475921407,US -3475921408,3475922431,JP -3475922432,3475922703,US -3475922704,3475922719,JP -3475922720,3475922751,HK -3475922752,3475930623,US -3475930624,3475930879,HK -3475930880,3475931135,US -3475931136,3475939327,HK -3475939328,3475939427,US -3475939428,3475939431,NL -3475939432,3475939679,US -3475939680,3475939687,GB -3475939688,3475948031,US -3475948032,3475948287,IE -3475948288,3475952511,US -3475952512,3475952639,SG -3475952640,3475952767,US -3475952768,3475953023,JP -3475953024,3475953663,US -3475953664,3475953919,IE -3475953920,3475954175,SG -3475954176,3475954547,US -3475954548,3475954551,PT -3475954552,3475954607,US -3475954608,3475954611,SE -3475954612,3475954631,US -3475954632,3475954639,SG -3475954640,3475954647,US -3475954648,3475954651,CA -3475954652,3475955711,US -3475955712,3475959807,SG -3475959808,3475996671,US -3475996672,3476029439,CA -3476029440,3476111359,US -3476111360,3476111871,CA -3476111872,3476348927,US -3476348928,3476349183,CA -3476349184,3476447231,US -3476447232,3476455423,CA -3476455424,3476881407,US -3476881408,3476946943,CA -3476946944,3477384711,US -3477384712,3477384719,CN -3477384720,3477384735,US -3477384736,3477384743,IE -3477384744,3477384783,US -3477384784,3477384799,IE -3477384800,3477384831,US -3477384832,3477384839,SG -3477384840,3477384847,IE -3477384848,3477384855,SG -3477384856,3477384863,IE -3477384864,3477384871,SG -3477384872,3477384951,US -3477384952,3477384959,IE -3477384960,3478114303,US -3478114304,3478118399,PE -3478118400,3478192127,US -3478192128,3478257663,CA -3478257664,3478261775,US -3478261776,3478261791,SG -3478261792,3478274823,US -3478274824,3478274831,GB -3478274832,3478275983,US -3478275984,3478275999,GB -3478276000,3478277951,US -3478277952,3478277983,GB -3478277984,3478278399,US -3478278400,3478278655,GB -3478278656,3478286591,US -3478286592,3478286847,GB -3478286848,3478288607,US -3478288608,3478288615,GB -3478288616,3478288639,US -3478288640,3478288895,GB -3478288896,3478289663,US -3478289664,3478289919,GB -3478289920,3478721535,US -3478721536,3478721791,CN -3478721792,3478722047,US -3478722048,3478722303,AE -3478722304,3478732799,US -3478732800,3478749183,DE -3478749184,3479207935,US -3479207936,3479240703,CA -3479240704,3479568383,US -3479568384,3479633919,CA -3479633920,3479896063,US -3479896064,3479956479,CA -3479956480,3479956735,US -3479956736,3479961599,CA -3479961600,3479969345,US -3479969346,3479969346,DE -3479969347,3479969409,US -3479969410,3479969410,DE -3479969411,3480223743,US -3480223744,3480256511,CA -3480256512,3480284159,US -3480284160,3480284671,CA -3480284672,3480444927,US -3480444928,3480449023,CA -3480449024,3480551423,US -3480551424,3480551679,JP -3480551680,3480551935,DE -3480551936,3480552191,GB -3480552192,3480552447,US -3480552448,3480552703,CH -3480552704,3480552959,US -3480552960,3480553215,AT -3480553216,3480553471,US -3480553472,3480553727,SG -3480553728,3480553983,HK -3480553984,3480554239,US -3480554240,3480554495,GB -3480554496,3480554751,SG -3480554752,3480555263,US -3480555264,3480555519,NO -3480555520,3480555775,FR -3480555776,3480556287,SG -3480556288,3480556543,HK -3480556544,3480557055,US -3480557056,3480557311,HK -3480557312,3480557567,US -3480557568,3480557823,JP -3480557824,3480558079,CA -3480558080,3480558591,US -3480558592,3480558847,DO -3480558848,3480560895,US -3480560896,3480561151,BR -3480561152,3480561919,US -3480561920,3480562175,JP -3480562176,3480564735,US -3480564736,3480564991,DE -3480564992,3480567039,US -3480567040,3480567551,GB -3480567552,3480568319,US -3480568320,3480568575,HK -3480568576,3480569599,US -3480569600,3480569855,HK -3480569856,3480570111,US -3480570112,3480570367,FR -3480570368,3480570623,ES -3480570624,3480570879,JP -3480570880,3480571391,CH -3480571392,3480571647,BE -3480571648,3480575231,US -3480575232,3480575487,IL -3480575488,3480575743,US -3480575744,3480577023,IT -3480577024,3480580607,US -3480580608,3480580863,SE -3480580864,3480581119,DK -3480581120,3480581631,US -3480581632,3480581887,CL -3480581888,3480582143,NO -3480582144,3480582399,US -3480582400,3480582655,RU -3480582656,3480583423,MX -3480583424,3480588799,US -3480588800,3480589055,SE -3480589056,3480591103,US -3480591104,3480591359,ZA -3480591360,3480591615,US -3480591616,3480592127,ID -3480592128,3480592383,NO -3480592384,3480592639,CH -3480592640,3480592895,IE -3480592896,3480593151,SG -3480593152,3480593407,DK -3480593408,3480593663,SG -3480593664,3480593919,CN -3480593920,3480594175,ZA -3480594176,3480594431,BE -3480594432,3480595711,US -3480595712,3480595967,TH -3480595968,3480596991,SG -3480596992,3480597247,US -3480597248,3480598271,AU -3480598272,3480598527,FR -3480598528,3480599039,AU -3480599040,3480599295,JP -3480599296,3480599551,CA -3480599552,3480599807,SG -3480599808,3480600575,US -3480600576,3480601087,DE -3480601088,3480601343,BE -3480601344,3480601599,AU -3480601600,3480601855,GB -3480601856,3480602111,FR -3480602112,3480602879,US -3480602880,3480603647,IT -3480603648,3480603903,BE -3480603904,3480604159,HK -3480604160,3480604671,ES -3480604672,3480604927,IL -3480604928,3480605183,GB -3480605184,3480605439,MX -3480605440,3480605695,PH -3480605696,3480605951,MX -3480605952,3480606207,PH -3480606208,3480606463,MX -3480606464,3480606719,BE -3480606720,3480606975,GR -3480606976,3480607231,US -3480607232,3480607487,IT -3480607488,3480610303,US -3480610304,3480610559,ES -3480610560,3480611327,US -3480611328,3480611583,JP -3480611584,3480611839,MX -3480611840,3480612095,BR -3480612096,3480612351,LU -3480612352,3480613631,DE -3480613632,3480839423,US -3480839424,3480839935,GB -3480839936,3480907263,US -3480907264,3480907775,FR -3480907776,3480968191,US -3480968192,3480968447,AU -3480968448,3481665535,US -3481665536,3481731071,CA -3481731072,3481796607,US -3481796608,3481812991,AU -3481812992,3481822063,CA -3481822064,3481822079,US -3481822080,3481829375,CA -3481829376,3481951977,US -3481951978,3481951978,DE -3481951979,3481959020,US -3481959021,3481959022,GB -3481959023,3481964575,US -3481964576,3481964579,IE -3481964580,3481993791,US -3481993792,3481993799,CA -3481993800,3481994239,US -3481994240,3481994751,CA -3481994752,3481995007,US -3481995008,3481995263,CA -3481995264,3481996031,US -3481996032,3481996287,CA -3481996288,3481996543,US -3481996544,3481997311,CA -3481997312,3481997567,US -3481997568,3481998591,CA -3481998592,3481998847,AG -3481998848,3481999103,US -3481999104,3481999359,CA -3481999360,3481999615,US -3481999616,3482001663,CA -3482001664,3482001919,US -3482001920,3482002175,CA -3482002176,3482002431,US -3482002432,3482003455,CA -3482003456,3482004479,US -3482004480,3482006015,CA -3482006016,3482007551,US -3482007552,3482008063,CA -3482008064,3482008319,US -3482008320,3482011135,CA -3482011136,3482011647,US -3482011648,3482012159,CA -3482012160,3482012927,US -3482012928,3482013951,CA -3482013952,3482014207,US -3482014208,3482014719,CA -3482014720,3482014863,US -3482014864,3482014879,CA -3482014880,3482016255,US -3482016256,3482016767,CA -3482016768,3482017023,US -3482017024,3482017279,CA -3482017280,3482017535,US -3482017536,3482017791,CA -3482017792,3482018047,US -3482018048,3482018303,CA -3482018304,3482019327,US -3482019328,3482019583,CA -3482019584,3482020607,US -3482020608,3482020863,CA -3482020864,3482021119,US -3482021120,3482022143,CA -3482022144,3482022911,US -3482022912,3482024703,CA -3482024704,3482024959,US -3482024960,3482025215,CA -3482025216,3482025471,US -3482025472,3482028543,CA -3482028544,3482028799,US -3482028800,3482029311,CA -3482029312,3482029567,US -3482029568,3482030335,CA -3482030336,3482030591,US -3482030592,3482032895,CA -3482032896,3482033151,US -3482033152,3482033663,CA -3482033664,3482033919,US -3482033920,3482034431,CA -3482034432,3482035199,US -3482035200,3482035711,CA -3482035712,3482035967,US -3482035968,3482036223,CA -3482036224,3482036479,US -3482036480,3482036735,CA -3482036736,3482036991,US -3482036992,3482037247,CA -3482037248,3482037759,US -3482037760,3482038015,CA -3482038016,3482038271,US -3482038272,3482038783,CA -3482038784,3482039551,US -3482039552,3482040319,CA -3482040320,3482041087,US -3482041088,3482041343,CA -3482041344,3482041599,US -3482041600,3482041855,CA -3482041856,3482042111,US -3482042112,3482042367,CA -3482042368,3482043903,US -3482043904,3482044927,CA -3482044928,3482045183,US -3482045184,3482045695,CA -3482045696,3482046975,US -3482046976,3482047487,CA -3482047488,3482047743,US -3482047744,3482047999,CA -3482048000,3482048511,US -3482048512,3482048767,CA -3482048768,3482049791,US -3482049792,3482050559,CA -3482050560,3482051327,US -3482051328,3482051583,CA -3482051584,3482051839,US -3482051840,3482052863,CA -3482052864,3482053631,US -3482053632,3482053887,CA -3482053888,3482053999,US -3482054000,3482054015,CA -3482054016,3482054143,US -3482054144,3482054655,CA -3482054656,3482058239,US -3482058240,3482058495,CA -3482058496,3482583039,US -3482583040,3482632191,CA -3482632192,3482775551,US -3482775552,3482779647,PR -3482779648,3482910719,US -3482910720,3482927103,CA -3482927104,3483025407,US -3483025408,3483041791,DE -3483041792,3483254783,US -3483254784,3483271167,AU -3483271168,3483296004,US -3483296005,3483296005,BE -3483296006,3483336959,US -3483336960,3483337215,CA -3483337216,3483337983,US -3483337984,3483338239,CA -3483338240,3483339263,US -3483339264,3483339519,CA -3483339520,3483340287,US -3483340288,3483341055,CA -3483341056,3483341311,US -3483341312,3483341567,CA -3483341568,3483342591,US -3483342592,3483344895,CA -3483344896,3483435007,US -3483435008,3483533311,CA -3483533312,3483552255,US -3483552256,3483552511,CA -3483552512,3483631615,US -3483631616,3483697151,CA -3483697152,3483791359,US -3483791360,3483791623,PR -3483791624,3483791631,US -3483791632,3483791815,PR -3483791816,3483791823,US -3483791824,3483793919,PR -3483793920,3483794431,US -3483794432,3483795455,PR -3483795456,3483828223,US -3483828224,3483836415,CA -3483836416,3483844607,US -3483860992,3483877375,US -3483877376,3483893759,CA -3483893760,3484006911,US -3484006912,3484007167,AU -3484007168,3484013055,US -3484013056,3484013567,DE -3484013568,3484320767,US -3484321792,3484322047,PR -3484322048,3484325887,US -3484326912,3484327423,US -3484327424,3484327935,CA -3484327936,3484332031,US -3484332032,3484336127,HK -3484336128,3484438527,US -3484438528,3484438783,ZM -3484438784,3484439551,US -3484439552,3484439807,ZM -3484439808,3484450815,US -3484450816,3484451839,CA -3484451840,3484452095,US -3484452096,3484453631,CA -3484453632,3484453887,US -3484453888,3484454911,CA -3484454912,3484455423,US -3484455424,3484455679,CA -3484455680,3484455935,US -3484455936,3484456191,CA -3484456192,3484456703,US -3484456704,3484457727,CA -3484457728,3484457983,US -3484457984,3484458751,CA -3484458752,3484459007,US -3484459008,3484459775,CA -3484459776,3484460687,US -3484460688,3484460703,CA -3484460704,3484460735,US -3484460736,3484460751,CA -3484460752,3484460799,US -3484460800,3484461055,CA -3484461056,3484461823,US -3484461824,3484462079,CA -3484462080,3484462335,US -3484462336,3484462591,CA -3484462592,3484463359,US -3484463360,3484464127,CA -3484464128,3484464319,US -3484464320,3484464335,CA -3484464336,3484464895,US -3484464896,3484465151,CA -3484465152,3484465663,US -3484465664,3484465919,CA -3484465920,3484466175,US -3484466176,3484466431,CA -3484466432,3484466687,US -3484466688,3484468223,CA -3484468224,3484468479,US -3484468480,3484468991,CA -3484468992,3484469247,US -3484469248,3484469759,CA -3484469760,3484470015,US -3484470016,3484470527,CA -3484470528,3484471807,US -3484471808,3484472063,CA -3484472064,3484472319,US -3484472320,3484472575,CA -3484472576,3484473343,US -3484473344,3484473599,CA -3484473600,3484473855,US -3484473856,3484474879,CA -3484474880,3484475135,US -3484475136,3484477183,CA -3484477184,3484477695,US -3484477696,3484477951,CA -3484477952,3484478719,US -3484478720,3484478975,CA -3484478976,3484479231,US -3484479232,3484479487,CA -3484479488,3484479743,US -3484479744,3484479999,CA -3484480000,3484480255,US -3484480256,3484481279,CA -3484481280,3484481535,US -3484481536,3484482047,CA -3484482048,3484482559,US -3484482560,3484483583,CA -3484483584,3484647423,US -3484647424,3484663807,CA -3484663808,3484762111,US -3484762112,3484778495,CA -3484778496,3484884991,US -3484884992,3484893183,CA -3484893184,3485220863,US -3485220864,3485229055,CA -3485229056,3485270015,US -3485270016,3485270527,FR -3485270528,3485270783,US -3485270784,3485270911,IN -3485270912,3485271039,GB -3485271040,3485271295,IN -3485271296,3485271551,GB -3485271552,3485271679,BS -3485271680,3485271807,US -3485271808,3485271999,GB -3485272000,3485272047,US -3485272048,3485272063,GB -3485272064,3485272159,CA -3485272160,3485272223,US -3485272224,3485272255,CA -3485272256,3485272815,US -3485272816,3485272831,HK -3485272832,3485273071,US -3485273072,3485273079,FR -3485273080,3485273087,US -3485273088,3485273215,RU -3485273216,3485273319,US -3485273320,3485273335,EG -3485273336,3485273343,US -3485273344,3485273599,GB -3485273600,3485273727,FR -3485273728,3485273855,US -3485273856,3485274111,GB -3485274112,3485275135,US -3485275136,3485275647,DE -3485275648,3485313023,US -3485313024,3485314047,HK -3485314048,3485317119,US -3485317120,3485318143,IN -3485318144,3485319167,US -3485319168,3485323263,SE -3485323264,3485335551,CA -3485335552,3485462527,US -3485462528,3485464575,VC -3485464576,3485466623,LC -3485466624,3485597695,US -3485597696,3485695999,CA -3485696000,3485883903,US -3485883904,3485884159,CA -3485884160,3485884671,US -3485884672,3485886463,CA -3485886464,3485888511,US -3485888512,3485889023,CA -3485889024,3485890047,US -3485890048,3485890815,CA -3485890816,3485891327,US -3485891328,3485891839,CA -3485891840,3485958399,US -3485958400,3485958655,CA -3485958656,3485959423,US -3485959424,3485960191,CA -3485960192,3485960703,US -3485960704,3485960959,CA -3485960960,3485962751,US -3485962752,3485963007,CA -3485963008,3485965311,US -3485965312,3485965567,CA -3485965568,3485965568,US -3485965569,3485966335,CA -3485966336,3485967615,US -3485967616,3485967616,GB -3485967617,3485967871,US -3485967872,3485968127,CA -3485968128,3485969151,US -3485969152,3485969152,GB -3485969153,3485969663,US -3485969664,3485969664,GB -3485969665,3485970431,US -3485970432,3485970943,CA -3485970944,3485972991,US -3485972992,3485973247,CA -3485973248,3485973503,US -3485973504,3485974527,CA -3485974528,3486023679,US -3486023680,3486031871,CA -3486031872,3486269439,US -3486269440,3486285823,JM -3486285824,3486302207,PR -3486302208,3486310399,CA -3486310400,3486580735,US -3486580736,3486580991,GB -3486580992,3486581503,DE -3486581504,3486581759,TW -3486581760,3486582015,GB -3486582016,3486582271,NO -3486582272,3486582527,BE -3486582528,3486582783,AU -3486582784,3486583039,DE -3486583040,3486583295,CH -3486583296,3486583807,US -3486583808,3486584063,KR -3486584064,3486584319,US -3486584320,3486584831,CA -3486584832,3486585343,US -3486585344,3486585599,PT -3486585600,3486586367,FR -3486586368,3486586623,NZ -3486586624,3486586879,US -3486586880,3486587135,AU -3486587136,3486587391,FR -3486587392,3486587647,NL -3486587648,3486587903,CL -3486587904,3486588415,GB -3486588416,3486588671,FR -3486588672,3486589119,US -3486589120,3486589151,NL -3486589152,3486589247,US -3486589248,3486589279,ZA -3486589280,3486589951,US -3486589952,3486590207,IT -3486590208,3486590463,US -3486590464,3486591743,GB -3486591744,3486591999,CH -3486592000,3486592063,FI -3486592064,3486592255,US -3486592256,3486592511,NL -3486592512,3486593023,NO -3486593024,3486593279,NL -3486593280,3486593791,DE -3486593792,3486594047,FR -3486594048,3486594303,DE -3486594304,3486594559,BE -3486594560,3486594719,US -3486594720,3486594751,LU -3486594752,3486594783,GB -3486594784,3486594815,US -3486594816,3486594943,AR -3486594944,3486595071,US -3486595072,3486595327,DK -3486595328,3486595583,ID -3486595584,3486595839,PR -3486595840,3486596095,DK -3486596096,3486596351,NL -3486596352,3486596607,NO -3486596608,3486596735,US -3486596736,3486596799,CH -3486596800,3486596863,FR -3486596864,3486597119,GB -3486597120,3486597375,IE -3486597376,3486597631,IT -3486597632,3486597887,GB -3486597888,3486598655,US -3486598656,3486598911,BR -3486598912,3486599167,NO -3486599168,3486599423,SE -3486599424,3486599679,BR -3486599680,3486599935,US -3486599936,3486600447,BR -3486600448,3486601215,US -3486601216,3486601471,BE -3486601472,3486601727,US -3486601728,3486601983,BE -3486601984,3486602239,NZ -3486602240,3486603007,US -3486603008,3486603263,SG -3486603264,3486603519,US -3486603520,3486603775,JP -3486603776,3486604287,US -3486604288,3486604543,BE -3486604544,3486605055,US -3486605056,3486605311,ES -3486605312,3486605567,NL -3486605568,3486606079,US -3486606080,3486606335,MY -3486606336,3486606591,US -3486606592,3486606847,FI -3486606848,3486607359,US -3486607360,3486607615,JP -3486607616,3486607871,US -3486607872,3486608127,PH -3486608128,3486608383,GB -3486608384,3486609151,US -3486609152,3486609663,HK -3486609664,3486609919,AU -3486609920,3486610175,SG -3486610176,3486610431,US -3486610432,3486610687,SE -3486610688,3486610943,NL -3486610944,3486611199,US -3486611200,3486611215,BR -3486611216,3486611455,US -3486611456,3486611711,SG -3486611712,3486611775,EC -3486611776,3486611967,US -3486611968,3486612223,HK -3486612224,3486612479,SG -3486612480,3486612607,US -3486612608,3486612735,FR -3486612736,3486612991,DE -3486612992,3486613247,US -3486613248,3486613759,GB -3486613760,3486614015,ES -3486614016,3486614271,US -3486614272,3486614527,GB -3486614528,3486614783,US -3486614784,3486615039,FR -3486615040,3486615295,BE -3486615296,3486615551,PH -3486615552,3486615871,US -3486615872,3486615903,LU -3486615904,3486615935,US -3486615936,3486615967,CH -3486615968,3486616319,US -3486616320,3486616831,NO -3486616832,3486617215,US -3486617216,3486617343,SE -3486617344,3486617599,US -3486617600,3486617855,CH -3486617856,3486618111,AU -3486618112,3486618367,NO -3486618368,3486618623,ES -3486618624,3486618879,BE -3486618880,3486619135,FR -3486619136,3486619391,SG -3486619392,3486619647,BE -3486619648,3486619903,CA -3486619904,3486620159,US -3486620160,3486620415,SE -3486620416,3486620671,HK -3486620672,3486620927,US -3486620928,3486621183,NL -3486621184,3486621439,US -3486621440,3486621695,NL -3486621696,3486621951,FI -3486621952,3486622207,ES -3486622208,3486622463,ZA -3486622464,3486622719,GB -3486622720,3486622975,MX -3486622976,3486623231,DE -3486623232,3486623487,JP -3486623488,3486623743,DE -3486623744,3486623999,US -3486624000,3486624255,PH -3486624256,3486624511,SG -3486624512,3486624767,SE -3486624768,3486625023,ES -3486625024,3486625055,US -3486625056,3486625087,MX -3486625088,3486625151,US -3486625152,3486625183,MX -3486625184,3486625279,US -3486625280,3486625535,SE -3486625536,3486625791,NO -3486625792,3486626047,NL -3486626048,3486626303,FI -3486626304,3486626559,IL -3486626560,3486626567,CH -3486626568,3486626591,US -3486626592,3486626623,FI -3486626624,3486627071,US -3486627072,3486627327,JP -3486627328,3486627583,US -3486627584,3486627839,BE -3486627840,3486628095,BW -3486628096,3486628351,ZA -3486628352,3486628607,US -3486628608,3486628863,NO -3486628864,3486629375,PT -3486629376,3486629631,US -3486629632,3486629887,CL -3486629888,3486630143,SE -3486630144,3486631679,JP -3486631680,3486631935,ID -3486631936,3486632447,JP -3486632448,3486632703,US -3486632704,3486632959,JP -3486632960,3486633215,IT -3486633216,3486633471,GB -3486633472,3486633983,US -3486633984,3486634239,HK -3486634240,3486634495,US -3486634496,3486634751,KR -3486634752,3486635007,CH -3486635008,3486635263,DK -3486635264,3486635519,FR -3486635520,3486635775,ES -3486635776,3486636031,IL -3486636032,3486636287,ES -3486636288,3486636543,NL -3486636544,3486636799,TW -3486636800,3486637055,DE -3486637056,3486637311,US -3486637312,3486637823,BE -3486637824,3486638335,SE -3486638336,3486638591,FR -3486638592,3486638847,US -3486638848,3486639103,DK -3486639104,3486639359,BE -3486639360,3486639615,SG -3486639616,3486640127,US -3486640128,3486640383,BE -3486640384,3486640639,GB -3486640640,3486642175,US -3486642176,3486642431,BR -3486642432,3486642687,PT -3486642688,3486642943,DK -3486642944,3486646271,US -3486646272,3486662655,CA -3486662656,3486688255,US -3486688256,3486688511,GB -3486688512,3486699519,US -3486699520,3486699775,CA -3486699776,3486702591,US -3486702592,3486702847,CA -3486702848,3487039487,US -3487039488,3487105023,CA -3487105024,3487189247,US -3487189248,3487189503,DK -3487189504,3487216383,US -3487216384,3487216639,SE -3487216640,3487236095,US -3487236096,3487301631,CA -3487301632,3487706367,US -3487706368,3487706623,RU -3487706624,3487750399,US -3487750400,3487750415,HK -3487750416,3487750529,US -3487750530,3487750530,HK -3487750531,3487766527,US -3487766528,3487768575,CA -3487768576,3487842303,US -3487842304,3487858687,CA -3487858688,3487861759,BM -3487861760,3487862015,KY -3487862016,3487875071,BM -3487875072,3487891455,US -3487891456,3487907839,CA -3487907840,3487913471,US -3487913472,3487913983,CA -3487913984,3487920127,US -3487920128,3487920639,NL -3487920640,3487920895,US -3487920896,3487921407,NL -3487921408,3487921663,US -3487921664,3487922431,NL -3487922432,3487922687,US -3487922688,3487924223,NL -3487924224,3487969791,US -3487969792,3487970047,KW -3487970048,3488014335,US -3488014336,3488022527,CA -3488022528,3488071679,US -3488071680,3488072703,CA -3488072704,3488079871,US -3488079872,3488083967,CA -3488083968,3488088063,US -3488088064,3488104447,IL -3488104448,3488112639,US -3488112640,3488120831,CA -3488120832,3488350207,US -3488350208,3488415743,CA -3488415744,3488615935,US -3488615936,3488616191,AU -3488616192,3488910335,US -3488910336,3488911359,CA -3488911360,3488940031,US -3488940032,3488956415,CA -3488956416,3488989183,US -3488989184,3489005567,CA -3489005568,3489058047,US -3489058048,3489058063,GB -3489058064,3489136639,US -3489136640,3489153535,MX -3489153536,3489154047,HN -3489154048,3489155583,MX -3489155584,3489156607,AR -3489156608,3489157375,MX -3489157376,3489157631,CO -3489157632,3489158399,MX -3489158400,3489158655,AR -3489158656,3489158911,NI -3489158912,3489159167,BR -3489159168,3489160191,MX -3489160192,3489161215,AR -3489161216,3489162495,MX -3489162496,3489162751,GT -3489162752,3489163007,CL -3489163008,3489167615,MX -3489167616,3489167871,PE -3489167872,3489168127,MX -3489168128,3489168383,PE -3489168384,3489169407,AR -3489169408,3489185791,MX -3489185792,3489193983,CL -3489193984,3489267711,MX -3489267712,3489341439,US -3489341440,3489345535,CA -3489345536,3489398783,US -3489398784,3489399039,IT -3489399040,3489464319,US -3489464320,3489529855,CA -3489529856,3489535999,US -3489536000,3489538047,IE -3489538048,3489547263,US -3489547264,3489548287,IE -3489548288,3489562623,US -3489566720,3489575935,US -3489575936,3489576191,CN -3489576192,3489576703,US -3489576704,3489576959,CN -3489576960,3489577215,US -3489577216,3489578239,CN -3489578240,3489685503,US -3489685504,3489687551,BB -3489687552,3489718271,US -3489718272,3489718527,DM -3489718528,3489719039,LC -3489719040,3489719551,AG -3489719552,3489719807,VG -3489719808,3489720063,DM -3489720064,3489720319,LC -3489720320,3489738751,US -3489738752,3489740799,PH -3489740800,3489753151,US -3489753152,3489753167,PR -3489753168,3489753179,US -3489753180,3489753180,GB -3489753181,3489775103,US -3489775104,3489775359,BO -3489775360,3489906943,US -3489906944,3489906944,VN -3489906945,3489969151,US -3489969152,3489969663,PR -3489969664,3490020675,US -3490020676,3490020676,MK -3490020677,3490228735,US -3490228736,3490229247,CO -3490229248,3490263039,US -3490263040,3490265087,CO -3490265088,3490265343,EC -3490265344,3490267135,CO -3490267136,3490477967,US -3490477968,3490477968,NG -3490477969,3490488319,US -3490488320,3490489343,PR -3490489344,3490703615,US -3490703616,3490703871,PR -3490703872,3490821127,US -3490821128,3490821128,AE -3490821129,3491239063,US -3491239064,3491239064,JO -3491239065,3491353155,US -3491353156,3491353156,DO -3491353157,3491381247,US -3491381248,3491389439,BM -3491389440,3491447863,US -3491447864,3491447864,IE -3491447865,3491476991,US -3491476992,3491478527,VI -3491478528,3491557907,US -3491557908,3491557908,EC -3491557909,3491585075,US -3491585076,3491585076,EG -3491585077,3491637247,US -3491637248,3491637759,CO -3491637760,3491651583,US -3491651584,3491659775,VI -3491659776,3491743743,US -3491743744,3491745791,CO -3491745792,3491830963,US -3491830964,3491830964,CO -3491830965,3491904267,US -3491904268,3491904268,CR -3491904269,3491943447,US -3491943448,3491943455,BR -3491943456,3491961599,US -3491961600,3491961600,BO -3491961601,3491969023,US -3491969024,3491970047,PR -3491970048,3492151295,US -3492151296,3492162943,CA -3492162944,3492163071,US -3492163072,3492167679,CA -3492167680,3492669951,US -3492669952,3492671487,PA -3492671488,3492807155,US -3492807156,3492807159,SE -3492807160,3492812759,US -3492812760,3492812763,JP -3492812764,3492845823,US -3492845824,3492846079,CH -3492846080,3492865023,US -3492865024,3492865535,GB -3492865536,3492866047,US -3492866048,3492868095,GB -3492868096,3492877954,US -3492877955,3492877955,CA -3492877956,3492880745,US -3492880746,3492880746,ES -3492880747,3492893951,US -3492893952,3492893969,GB -3492893970,3492893971,US -3492893972,3492894207,GB -3492894208,3492904215,US -3492904216,3492904219,AT -3492904220,3492909989,US -3492909990,3492909990,DE -3492909991,3492911103,US -3492911104,3492912383,GB -3492912384,3492912639,US -3492912640,3492913151,GB -3492913152,3492921855,US -3492921856,3492922111,VI -3492922112,3492933375,US -3492933376,3492933503,CH -3492933504,3492933631,CA -3492933632,3492939022,US -3492939023,3492939023,DE -3492939024,3492954111,US -3492954112,3492956159,GB -3492956160,3492957695,US -3492957696,3492958207,VI -3492958208,3492969471,US -3492969472,3492969599,VI -3492969600,3492994815,US -3492994816,3492995071,GB -3492995072,3493039359,US -3493039360,3493039615,AR -3493039616,3493039695,US -3493039696,3493039703,RO -3493039704,3493073151,US -3493073152,3493073407,BO -3493073408,3493073663,US -3493073664,3493073919,BO -3493073920,3493081599,US -3493081600,3493082623,PY -3493082624,3493089023,US -3493089024,3493089279,CM -3493089280,3493140223,US -3493140224,3493140479,DE -3493140480,3493244927,US -3493244928,3493249023,PR -3493249024,3493866495,US -3493866496,3493867519,VG -3493867520,3493881855,US -3493881856,3493882879,CA -3493882880,3493900371,US -3493900372,3493900375,GB -3493900376,3493901023,US -3493901024,3493901031,HK -3493901032,3493936127,US -3493936128,3493937151,CA -3493937152,3493939199,US -3493939200,3493941247,CA -3493941248,3493980159,US -3493980160,3493981183,CA -3493981184,3493982207,US -3493982208,3493984255,CA -3493984256,3493986303,US -3493986304,3493987327,CA -3493987328,3493990399,US -3493990400,3493991423,CA -3493991424,3493998591,US -3493998592,3494000639,AI -3494000640,3494002687,US -3494003712,3494004735,CA -3494004736,3494009855,US -3494009856,3494010879,CA -3494010880,3494014975,US -3494014976,3494017023,CA -3494017024,3494043647,US -3494043648,3494045695,CA -3494045696,3494046719,JP -3494046720,3494047743,ID -3494047744,3494049791,US -3494049792,3494051839,CA -3494051840,3494075391,US -3494075392,3494076415,CA -3494076416,3494080511,US -3494080512,3494081535,CA -3494081536,3494088703,US -3494088704,3494090751,CA -3494090752,3494094847,US -3494094848,3494095871,CA -3494095872,3494121471,US -3494121472,3494122495,CA -3494122496,3494125567,US -3494125568,3494126591,CA -3494126592,3494135807,US -3494135808,3494136831,CA -3494136832,3494139903,US -3494139904,3494141951,CA -3494141952,3494143999,US -3494144000,3494145023,CA -3494145024,3494168575,US -3494168576,3494170623,CA -3494170624,3494181631,US -3494181632,3494181887,SN -3494181888,3494184959,US -3494184960,3494187007,CA -3494187008,3494191359,US -3494191360,3494191615,DE -3494191616,3494191871,GB -3494191872,3494192127,NL -3494192128,3494192383,US -3494192384,3494192639,JP -3494192640,3494197247,US -3494197248,3494198271,CA -3494198272,3494211583,US -3494211584,3494212607,NL -3494212608,3494244351,US -3494244352,3494246399,CA -3494246400,3494247423,US -3494247424,3494250495,CA -3494250496,3494262783,US -3494262784,3494264831,CA -3494264832,3494271999,US -3494272000,3494273023,KN -3494273024,3494275071,US -3494275072,3494277119,CA -3494277120,3494302719,US -3494302720,3494303743,CA -3494303744,3494310911,US -3494310912,3494311935,CA -3494311936,3494316031,US -3494316032,3494317055,CA -3494317056,3494336511,US -3494336512,3494337535,CA -3494337536,3494342655,US -3494342656,3494344703,CA -3494344704,3494344959,HK -3494344960,3494359039,US -3494359040,3494360063,CA -3494360064,3494361087,US -3494361088,3494362111,CA -3494362112,3494368255,US -3494368256,3494369279,CN -3494369280,3494380543,US -3494380544,3494381567,CA -3494381568,3494402559,US -3494402560,3494402815,GB -3494402816,3494410239,US -3494410240,3494412287,CA -3494412288,3494422527,US -3494422528,3494425599,CA -3494425600,3494437887,US -3494437888,3494438143,GP -3494438144,3494438399,DM -3494438400,3494438655,KN -3494438656,3494438911,DM -3494438912,3494455295,US -3494455296,3494456319,CA -3494456320,3494459391,US -3494459392,3494460415,CA -3494460416,3494464511,US -3494464512,3494465535,CA -3494465536,3494510591,US -3494510592,3494512639,CA -3494512640,3494516735,US -3494516736,3494517759,CA -3494517760,3494540031,US -3494540032,3494540287,UG -3494540288,3494563839,US -3494563840,3494565887,CA -3494565888,3494594559,US -3494594560,3494595583,CA -3494595584,3494605823,US -3494605824,3494606847,CA -3494606848,3494610943,US -3494610944,3494611967,CA -3494611968,3494624255,US -3494624256,3494625279,CA -3494625280,3494627327,US -3494627328,3494628351,BM -3494628352,3494642687,US -3494642688,3494643711,CA -3494643712,3494651903,US -3494651904,3494652927,CA -3494652928,3494655743,US -3494655744,3494655759,GB -3494655760,3494660095,US -3494660096,3494661119,CA -3494661120,3494664191,US -3494664192,3494665215,CA -3494665216,3494668287,US -3494668288,3494670335,CA -3494670336,3494709759,US -3494709760,3494710271,CA -3494710272,3494727679,US -3494727680,3494729727,CA -3494729728,3494730751,US -3494730752,3494731775,CA -3494731776,3494743039,US -3494743040,3494744063,CA -3494744064,3494747135,US -3494747136,3494748159,CA -3494748160,3494757375,US -3494757376,3494758399,CA -3494758400,3494776831,US -3494776832,3494777855,CA -3494777856,3494785023,US -3494785024,3494787071,MF -3494787072,3494787327,CA -3494787328,3494787583,NG -3494787584,3494788095,CA -3494788096,3494788351,NG -3494788352,3494788607,LY -3494788608,3494789119,CA -3494789120,3494813183,US -3494813184,3494813439,CA -3494813440,3494852607,US -3494852608,3494854655,CA -3494854656,3494862847,US -3494862848,3494863871,DM -3494863872,3494866943,US -3494866944,3494867967,CA -3494867968,3494871039,US -3494872064,3494874111,US -3494874112,3494874367,ES -3494874368,3494874879,US -3494874880,3494874911,ES -3494874912,3494893567,US -3494893568,3494894591,CA -3494894592,3494917119,US -3494917120,3494917631,CA -3494917632,3494928383,US -3494928384,3494930431,CA -3494930432,3494950655,US -3494950656,3494950911,PH -3494950912,3494964223,US -3494964224,3494965247,PR -3494965248,3494968319,US -3494968320,3494972415,CA -3494972416,3494979583,US -3494979584,3494981631,CA -3494981632,3494984191,US -3494984192,3494984703,PR -3494984704,3494985727,US -3494985728,3494985975,NL -3494985976,3494985976,US -3494985977,3494985983,NL -3494985984,3494999039,US -3494999040,3494999551,ID -3494999552,3495000063,CN -3495000064,3495001087,CA -3495001088,3495005439,US -3495005440,3495005695,CA -3495005696,3495006207,US -3495006208,3495007231,CA -3495007232,3495010303,US -3495010304,3495011327,KN -3495011328,3495012351,US -3495012352,3495014399,PR -3495014400,3495021567,US -3495021568,3495022079,CA -3495022080,3495023615,US -3495023616,3495024639,CA -3495024640,3495053311,US -3495053312,3495054335,DE -3495054336,3495057407,US -3495057408,3495059455,CA -3495059456,3495065599,US -3495065600,3495066495,CA -3495066496,3495066623,GB -3495066624,3495076863,US -3495076864,3495077887,BM -3495077888,3495078911,CA -3495078912,3495090175,US -3495090176,3495091199,KY -3495091200,3495098367,US -3495098368,3495100415,CA -3495100416,3495100927,IE -3495100928,3495120895,US -3495120896,3495122943,AG -3495122944,3495153663,US -3495153664,3495155711,CA -3495155712,3495187199,US -3495187200,3495187455,IM -3495187456,3495192575,US -3495192576,3495193599,CA -3495193600,3495215103,US -3495215104,3495217151,VI -3495217152,3495219199,VC -3495219200,3495251967,US -3495251968,3495254015,CA -3495254016,3495260159,US -3495260160,3495261183,CA -3495261184,3495271423,US -3495271424,3495272447,ZA -3495272448,3495285759,US -3495285760,3495288831,CA -3495288832,3495331881,US -3495331882,3495331882,CA -3495331883,3495332863,US -3495332864,3495333887,CA -3495333888,3495349247,US -3495349248,3495350271,CA -3495350272,3495358463,US -3495358464,3495359487,CA -3495359488,3495367679,US -3495367680,3495368703,CA -3495368704,3495370239,US -3495370240,3495370495,RU -3495370496,3495370751,US -3495370752,3495372799,BS -3495372800,3495375871,US -3495375872,3495376895,CA -3495376896,3495399423,US -3495399424,3495400447,KN -3495400448,3495403519,US -3495403520,3495404031,CA -3495404032,3495405055,US -3495405056,3495405567,HK -3495405568,3495406335,US -3495406336,3495406591,LB -3495406592,3495412735,US -3495412736,3495413759,CA -3495413760,3495429119,US -3495429120,3495430143,CA -3495430144,3495440831,US -3495440832,3495440847,IN -3495440848,3495455743,US -3495455744,3495456767,CA -3495456768,3495463935,US -3495463936,3495464959,CA -3495464960,3495475199,US -3495475200,3495477247,CA -3495477248,3495478271,US -3495478272,3495479295,CA -3495479296,3495481343,US -3495483392,3495505919,US -3495505920,3495507967,CA -3495507968,3495515135,US -3495515136,3495516159,CA -3495516160,3495526399,US -3495526400,3495527423,CA -3495527424,3495544063,US -3495544064,3495544319,NG -3495544320,3495551999,US -3495552000,3495553023,BM -3495553024,3495576575,US -3495576576,3495577599,CA -3495577600,3495579647,US -3495579648,3495581695,CA -3495581696,3495583743,US -3495583744,3495585791,CA -3495585792,3495587839,US -3495587840,3495588863,MS -3495588864,3495618559,US -3495618560,3495619583,CA -3495619584,3495620607,US -3495620608,3495622655,CA -3495622656,3495653375,US -3495653376,3495654399,CA -3495654400,3495673855,US -3495673856,3495674879,MF -3495674880,3495675162,VG -3495675163,3495675163,US -3495675164,3495675391,VG -3495675392,3495688191,US -3495688192,3495689215,CA -3495689216,3495694335,US -3495694336,3495696383,CA -3495696384,3495703551,US -3495703552,3495704575,CA -3495704576,3495718911,US -3495718912,3495723007,CA -3495723008,3495724031,US -3495724032,3495727103,CA -3495727104,3495729151,US -3495731200,3495739391,US -3495739392,3495740415,CA -3495740416,3495749631,US -3495749632,3495749856,CA -3495749857,3495749861,RU -3495749862,3495750655,CA -3495750656,3495758335,US -3495758336,3495758847,CA -3495758848,3495815167,US -3495815168,3495817215,CA -3495817216,3495828479,US -3495828480,3495829503,CA -3495829504,3495837695,US -3495837696,3495838463,CA -3495838464,3495847935,US -3495847936,3495849983,CA -3495849984,3495862271,US -3495862272,3495864319,CA -3495864320,3495864831,DM -3495864832,3495865343,MF -3495865344,3495866367,US -3495866368,3495868415,LC -3495868416,3495871487,US -3495871488,3495872511,CA -3495872512,3495881471,US -3495881472,3495881727,PA -3495881728,3495896063,US -3495896064,3495897087,PR -3495897088,3495930879,US -3495930880,3495931903,CA -3495931904,3495968767,US -3495968768,3495985151,CA -3495985152,3495988223,NI -3495988224,3495989247,GT -3495989248,3496034303,US -3496034304,3496050687,CA -3496050688,3496132607,US -3496132608,3496148991,CA -3496148992,3496181759,US -3496181760,3496189951,CA -3496189952,3496296447,US -3496296448,3496312831,CA -3496312832,3496451583,US -3496451584,3496452095,CA -3496452096,3496454911,US -3496454912,3496455167,CA -3496455168,3496468479,US -3496468480,3496476671,CA -3496476672,3496875263,US -3496875264,3496875519,BD -3496875520,3496878079,US -3496878080,3496882175,CA -3496882176,3496883199,US -3496883200,3496884223,GB -3496884224,3496885247,US -3496885248,3496886271,GB -3496886272,3496894463,US -3496894464,3496902655,CA -3496902656,3496946175,US -3496946176,3496946431,HK -3496946432,3496947711,US -3496947712,3496949759,JP -3496949760,3496951807,US -3496951808,3496959999,CA -3496960000,3497020415,US -3497020416,3497020671,IL -3497020672,3497066495,US -3497066496,3497082879,CA -3497082880,3497164799,US -3497164800,3497181183,CA -3497181184,3497229615,US -3497229616,3497229623,CA -3497229624,3497229767,US -3497229768,3497229775,CA -3497229776,3497410559,US -3497410560,3497431039,CA -3497431040,3497447423,US -3497447424,3497451519,CA -3497451520,3497664255,US -3497664256,3497664511,NL -3497664512,3497717759,US -3497717760,3497718783,CA -3497718784,3497719295,US -3497719296,3497721343,CA -3497721344,3497721599,NG -3497721600,3497721855,CA -3497721856,3497775103,US -3497775104,3497775359,CA -3497775360,3497775615,US -3497775616,3497778175,CA -3497778176,3497778943,US -3497778944,3497779199,CA -3497779200,3497820159,US -3497820160,3497852927,CA -3497852928,3498254591,US -3498254592,3498254847,JM -3498254848,3498287103,US -3498287104,3498295295,JM -3498295296,3498509055,US -3498509056,3498509311,PR -3498509312,3498513151,US -3498513152,3498513407,CL -3498513408,3498513919,US -3498513920,3498514431,CL -3498514432,3498587135,US -3498587136,3498588159,NL -3498588160,3498599935,US -3498599936,3498600191,WS -3498600192,3498708991,US -3498708992,3498717183,JM -3498717184,3498760191,US -3498760192,3498761215,PR -3498761216,3498761727,US -3498761728,3498761983,PR -3498761984,3498812415,US -3498812416,3498812671,PF -3498812672,3499299327,US -3499299328,3499299583,WS -3499299584,3499403263,US -3499403264,3499403775,MW -3499403776,3499436031,US -3499436032,3499436287,DE -3499436288,3499450367,US -3499450368,3499451391,IN -3499451392,3499705855,US -3499705856,3499706367,MG -3499706368,3499986943,US -3499986944,3499988991,KY -3499988992,3500126207,US -3500126208,3500126463,SE -3500126464,3500126719,GB -3500126720,3500351487,US -3500351488,3500359679,JM -3500359680,3500689407,US -3500689408,3500689919,CL -3500689920,3500728319,US -3500728320,3500736511,KY -3500736512,3500759551,US -3500759552,3500761087,KY -3500761088,3500807019,US -3500807020,3500807023,GB -3500807024,3500807195,US -3500807196,3500807199,GB -3500807200,3500807299,US -3500807300,3500807303,GB -3500807304,3500813219,US -3500813220,3500813223,GB -3500813224,3501168383,US -3501168384,3501168511,GB -3501168512,3501183487,US -3501183488,3501183743,GB -3501183744,3501368831,US -3501368832,3501369087,NL -3501369088,3501376147,US -3501376148,3501376151,NL -3501376152,3501378047,US -3501378048,3501378303,DE -3501378304,3501522943,US -3501522944,3501588479,CA -3501588480,3502439167,US -3502439168,3502439423,PK -3502439424,3502470143,US -3502470144,3502471167,MX -3502471168,3502518783,US -3502518784,3502519295,LK -3502519296,3502541055,US -3502541056,3502541311,CA -3502541312,3502545663,US -3502545664,3502545919,BS -3502545920,3502683135,US -3502683136,3502683391,MC -3502683392,3502993407,US -3502993408,3502993919,NL -3502993920,3503206399,US -3503206400,3503206911,CR -3503206912,3503250431,US -3503250432,3503250943,PK -3503250944,3503323135,US -3503323136,3503323647,KE -3503323648,3503386111,US -3503386112,3503386367,CH -3503386368,3503454719,US -3503454720,3503454975,AZ -3503454976,3503478783,US -3503478784,3503479039,DE -3503479040,3503738879,US -3503738880,3503740927,CO -3503740928,3503890431,US -3503890432,3503894527,CO -3503894528,3503990783,US -3503990784,3503992831,AE -3503992832,3504086015,US -3504086016,3504086527,LI -3504086528,3504136191,US -3504136192,3504138239,AZ -3504138240,3504193535,US -3504193536,3504194559,EC -3504194560,3504207871,US -3504207872,3504208127,CA -3504208128,3504223743,US -3504223744,3504223999,RO -3504224000,3504521215,US -3504521216,3504521727,GU -3504521728,3504889343,US -3504889344,3504889855,PK -3504889856,3504922623,US -3504922624,3504923391,PH -3504923392,3504928687,US -3504928688,3504928695,IT -3504928696,3504932351,US -3504932352,3504932863,BD -3504932864,3505004543,US -3505004544,3505005823,PR -3505005824,3505006079,DO -3505006080,3505012735,PR -3505012736,3505112063,US -3505112064,3505112319,EC -3505112320,3505112575,US -3505112576,3505112831,EC -3505112832,3505119231,US -3505119232,3505119487,PH -3505119488,3505121023,US -3505121024,3505121279,PH -3505121280,3505270271,US -3505270272,3505270527,JM -3505270528,3505270783,HT -3505270784,3505416703,US -3505416704,3505417471,MX -3505417472,3505424383,US -3505424384,3505425407,PK -3505425408,3505474559,US -3505474560,3505474815,GU -3505474816,3505511679,US -3505511680,3505511935,RO -3505511936,3505661951,US -3505661952,3505662463,JM -3505662464,3505818623,US -3505818624,3505819647,BS -3505819648,3506043135,US -3506043136,3506044927,PA -3506044928,3506231807,US -3506231808,3506232063,IN -3506232064,3506765823,US -3506765824,3506831359,CA -3506831360,3507012607,US -3507012608,3507012639,GR -3507012640,3507025407,US -3507025408,3507025663,IQ -3507025664,3507037183,US -3507037184,3507037439,DE -3507037440,3507055903,US -3507055904,3507055911,HK -3507055912,3507290111,US -3507290112,3507355647,AR -3507355648,3507421183,US -3507421184,3507421439,CA -3507421440,3507422207,US -3507422208,3507422719,CA -3507422720,3507423231,US -3507423232,3507423487,CA -3507423488,3507423743,US -3507423744,3507423999,CA -3507424000,3507424511,US -3507424512,3507424767,CA -3507424768,3507425023,US -3507425024,3507425279,CA -3507425280,3507426303,US -3507426304,3507426815,CA -3507426816,3507427583,US -3507427584,3507427839,CA -3507427840,3507428095,US -3507428096,3507428351,GB -3507428352,3507430655,US -3507430656,3507430911,CA -3507430912,3507433215,US -3507433216,3507433727,CA -3507433728,3507433983,US -3507433984,3507434239,CA -3507434240,3507434495,US -3507434496,3507436031,CA -3507436032,3507436799,US -3507436800,3507437055,CA -3507437056,3507437311,US -3507437312,3507445759,CA -3507445760,3507449855,US -3507449856,3507453951,CA -3507453952,3507454975,US -3507454976,3507455999,CA -3507456000,3507456255,US -3507456256,3507456511,CA -3507456512,3507458047,US -3507458048,3507462143,CA -3507462144,3507465727,US -3507465728,3507486719,CA -3507486720,3507585023,US -3507585024,3507601407,CA -3507601408,3507748863,US -3507748864,3507749375,CA -3507749376,3507749631,US -3507749632,3507765247,CA -3507765248,3507809279,US -3507809280,3507809535,BG -3507809536,3508109311,US -3508109312,3508109583,CA -3508109584,3508109679,US -3508109680,3508110591,CA -3508110592,3508111359,US -3508111360,3508111615,CA -3508111616,3508111871,US -3508111872,3508112895,CA -3508112896,3508113151,US -3508113152,3508113919,CA -3508113920,3508114431,US -3508114432,3508114687,ID -3508114688,3508117759,CA -3508117760,3508118015,US -3508118016,3508119807,CA -3508119808,3508120319,US -3508120320,3508120575,CA -3508120576,3508120831,US -3508120832,3508122111,CA -3508122112,3508122367,US -3508122368,3508122623,CA -3508122624,3508123135,US -3508123136,3508123647,CA -3508123648,3508123903,US -3508123904,3508125439,CA -3508125440,3508125951,US -3508125952,3508126463,CA -3508126464,3508126719,US -3508126720,3508127487,CA -3508127488,3508127743,US -3508127744,3508130047,CA -3508130048,3508130303,US -3508130304,3508130559,CA -3508130560,3508130815,US -3508130816,3508132095,CA -3508132096,3508132351,US -3508132352,3508132607,CA -3508132608,3508132863,US -3508132864,3508134143,CA -3508134144,3508135423,US -3508135424,3508135679,CA -3508135680,3508136447,US -3508136448,3508137375,CA -3508137376,3508137407,US -3508137408,3508142079,CA -3508142080,3508220927,US -3508220928,3508221951,KY -3508221952,3508222975,US -3508222976,3508223999,KY -3508224000,3508224255,BM -3508224256,3508243967,US -3508243968,3508244223,BM -3508244224,3508273407,US -3508273408,3508273663,MX -3508273664,3508278527,US -3508278528,3508278783,AU -3508278784,3508279039,US -3508279040,3508279295,VE -3508279296,3508279807,US -3508279808,3508280063,JP -3508280064,3508280319,TH -3508280320,3508280575,JP -3508280576,3508280831,TW -3508280832,3508281087,JP -3508281088,3508281343,KR -3508281344,3508281599,PH -3508281600,3508281855,NZ -3508281856,3508282111,US -3508282112,3508282367,HK -3508282368,3508282623,US -3508282624,3508282879,AU -3508282880,3508283135,US -3508283136,3508283391,HK -3508283392,3508283647,US -3508283648,3508283903,AU -3508283904,3508284159,MY -3508284160,3508284415,SG -3508284416,3508284671,AU -3508284672,3508286207,US -3508286208,3508286463,SE -3508286464,3508286719,HK -3508286720,3508288255,US -3508288256,3508288511,JP -3508288512,3508289023,US -3508289024,3508289279,AU -3508289280,3508289535,US -3508289536,3508289791,CA -3508289792,3508291327,US -3508291328,3508292095,GB -3508292096,3508292351,CH -3508292352,3508292863,US -3508292864,3508294143,DE -3508294144,3508295679,US -3508295680,3508295935,GB -3508295936,3508296959,US -3508296960,3508297215,CH -3508297216,3508297471,US -3508297472,3508297727,IT -3508297728,3508298239,US -3508298240,3508298495,DE -3508298496,3508298751,US -3508298752,3508299007,ES -3508299008,3508299263,BE -3508299264,3508299519,GB -3508299520,3508299775,US -3508299776,3508300031,SE -3508300032,3508300287,DE -3508300288,3508303615,US -3508303616,3508303871,DE -3508303872,3508304383,US -3508304384,3508304639,DE -3508304640,3508306943,US -3508306944,3508307199,CH -3508307200,3508308991,US -3508308992,3508309247,BE -3508309248,3508310527,SE -3508310528,3508310783,DE -3508310784,3508311039,BE -3508311040,3508311295,NL -3508311296,3508311807,IE -3508311808,3508312063,US -3508312064,3508312319,NL -3508312320,3508312575,CH -3508312576,3508312831,US -3508312832,3508313343,DE -3508313344,3508313599,SE -3508313600,3508313855,DK -3508313856,3508314367,GB -3508314368,3508314623,US -3508314624,3508314879,DK -3508314880,3508315135,US -3508315136,3508315391,NO -3508315392,3508315647,US -3508315648,3508315903,FR -3508315904,3508316159,US -3508316160,3508316415,PT -3508316416,3508316671,GB -3508316672,3508316927,US -3508316928,3508317183,SE -3508317184,3508317439,US -3508317440,3508317695,DE -3508317696,3508317951,US -3508317952,3508318463,FI -3508318464,3508318719,LU -3508318720,3508318975,IT -3508318976,3508319487,IL -3508319488,3508319743,RU -3508319744,3508319999,CH -3508320000,3508320255,SE -3508320256,3508320767,US -3508320768,3508321791,BE -3508321792,3508322303,US -3508322304,3508322559,GB -3508322560,3508322815,FI -3508322816,3508323071,NO -3508323072,3508323327,US -3508323328,3508323583,NO -3508323584,3508323839,DE -3508323840,3508324095,FI -3508324096,3508324351,IT -3508324352,3508324607,CH -3508324608,3508324863,NO -3508324864,3508325119,GB -3508325120,3508325375,DE -3508325376,3508325631,US -3508325632,3508325887,ZA -3508325888,3508326399,SE -3508326400,3508326655,GB -3508326656,3508326911,ZA -3508326912,3508327167,IT -3508327168,3508327679,ES -3508327680,3508327935,US -3508327936,3508328447,NE -3508328448,3508328703,BE -3508328704,3508329471,IL -3508329472,3508329727,NL -3508329728,3508329983,US -3508329984,3508330495,SE -3508330496,3508331263,GB -3508331264,3508331519,BE -3508331520,3508332031,US -3508332032,3508332287,GB -3508332288,3508332543,GR -3508332544,3508332799,IE -3508332800,3508333055,NO -3508333056,3508333311,US -3508333312,3508333823,CH -3508333824,3508334591,US -3508334592,3508334847,AU -3508334848,3508335103,SG -3508335104,3508335359,MY -3508335360,3508335615,AU -3508335616,3508336127,JP -3508336128,3508336383,SG -3508336384,3508336639,HK -3508336640,3508336895,AU -3508336896,3508337151,JP -3508337152,3508337663,PH -3508337664,3508337919,KR -3508337920,3508338175,JP -3508338176,3508338431,US -3508338432,3508338687,KR -3508338688,3508404223,CA -3508404224,3508690943,US -3508690944,3508695039,CA -3508695040,3508731903,US -3508731904,3508740095,CA -3508740096,3508744191,US -3508744192,3508744447,CA -3508744448,3508745215,US -3508745216,3508745471,CA -3508745472,3508754431,US -3508754432,3508758527,CA -3508758528,3508759551,US -3508759552,3508761343,CA -3508761344,3508762111,US -3508762112,3508762879,CA -3508762880,3508763135,US -3508763136,3508763391,CA -3508763392,3508764159,US -3508764160,3508764415,CA -3508764416,3508764671,US -3508764672,3508772863,CA -3508772864,3508774143,US -3508774144,3508774399,CA -3508774400,3508777983,US -3508777984,3508778239,CA -3508778240,3508779263,US -3508779264,3508779519,CA -3508779520,3508780031,US -3508780032,3508781055,CA -3508781056,3508782079,US -3508782080,3508782591,CA -3508782592,3508789247,US -3508789248,3508791295,CA -3508791296,3508793343,US -3508793344,3508795391,CA -3508795392,3508796159,US -3508796160,3508796415,CA -3508796416,3508796927,US -3508796928,3508797439,CA -3508797440,3508911231,US -3508911232,3508911359,CA -3508911360,3509144575,US -3509144576,3509144831,BR -3509144832,3509157887,US -3509157888,3509166079,CA -3509166080,3509215231,US -3509215232,3509223423,CA -3509223424,3509239807,US -3509239808,3509256191,NL -3509256192,3509305599,US -3509305600,3509305615,GB -3509305616,3509346303,US -3509346304,3509350711,CA -3509350712,3509350719,US -3509350720,3509354495,CA -3509354496,3509387263,US -3509387264,3509420031,PE -3509420032,3509518847,US -3509518848,3509519103,CA -3509519104,3509519871,US -3509519872,3509520127,CA -3509520128,3509520895,US -3509520896,3509521151,CA -3509521152,3509521407,US -3509521408,3509521663,CA -3509521664,3509522431,US -3509522432,3509522687,KW -3509522688,3509522943,CA -3509522944,3509524479,US -3509524480,3509524735,CA -3509524736,3509524991,US -3509524992,3509525759,CA -3509525760,3509526527,US -3509526528,3509526783,CA -3509526784,3509527807,US -3509527808,3509528063,CA -3509528064,3509529087,US -3509529088,3509529215,CA -3509529216,3509530623,US -3509530624,3509532671,CA -3509532672,3509532927,US -3509532928,3509533439,CA -3509533440,3509534719,US -3509534720,3509535231,CA -3509535232,3509535743,US -3509535744,3509535999,CA -3509536000,3509536255,US -3509536256,3509536767,CA -3509536768,3509537279,US -3509537280,3509538303,CA -3509538304,3509538559,US -3509538560,3509538815,CA -3509538816,3509539071,US -3509539072,3509539327,CA -3509539328,3509539967,US -3509539968,3509540031,CA -3509540032,3509540863,US -3509540864,3509541503,CA -3509541504,3509542911,US -3509542912,3509543167,CA -3509543168,3509543423,US -3509543424,3509543935,CA -3509543936,3509544191,US -3509544192,3509544447,CA -3509544448,3509544703,US -3509544704,3509544959,CA -3509544960,3509546095,US -3509546096,3509546111,CA -3509546112,3509546495,US -3509546496,3509547007,CA -3509547008,3509551615,US -3509551616,3509551871,CA -3509551872,3509552127,US -3509552128,3509552639,CA -3509552640,3509554431,US -3509554432,3509554959,CA -3509554960,3509555199,US -3509555200,3509555455,CA -3509555456,3509555711,US -3509555712,3509556735,CA -3509556736,3509557759,US -3509557760,3509558015,CA -3509558016,3509559039,US -3509559040,3509559295,KW -3509559296,3509559807,CA -3509559808,3509560063,US -3509560064,3509560319,CA -3509560320,3509560831,US -3509560832,3509561087,CA -3509561088,3509561343,US -3509561344,3509561599,CA -3509561600,3509561855,US -3509561856,3509562623,CA -3509562624,3509563391,US -3509563392,3509563903,CA -3509563904,3509564415,US -3509564416,3509564671,CA -3509564672,3509565183,US -3509565184,3509566463,CA -3509566464,3509567231,US -3509567232,3509569023,CA -3509569024,3509572351,US -3509572352,3509573375,CA -3509573376,3509573439,US -3509573440,3509573455,CA -3509573456,3509573631,US -3509573632,3509573887,CA -3509573888,3509574143,US -3509574144,3509575679,CA -3509575680,3509575935,US -3509575936,3509576191,CA -3509576192,3509576959,US -3509576960,3509577215,CA -3509577216,3509577983,US -3509577984,3509578239,CA -3509578240,3509579007,US -3509579008,3509579263,CA -3509579264,3509579519,US -3509579520,3509579775,CA -3509579776,3509580031,US -3509580032,3509580287,CA -3509580288,3509582335,US -3509582336,3509582847,CA -3509582848,3509583615,US -3509583616,3509583871,CA -3509583872,3509731327,US -3509731328,3509739519,CA -3509739520,3509828095,US -3509828096,3509828159,CA -3509828160,3509846015,US -3509846016,3509977087,CA -3509977088,3509993471,US -3509993472,3509997567,CA -3509997568,3510005759,US -3510005760,3510009343,CA -3510009344,3510020095,US -3510020096,3510021119,JP -3510021120,3510022143,US -3510022144,3510024191,JP -3510024192,3510240743,US -3510240744,3510240751,CA -3510240752,3510242303,US -3510242304,3510242559,OM -3510242560,3510245375,US -3510245376,3510245631,BD -3510245632,3510249471,US -3510249472,3510249983,QA -3510249984,3510253311,US -3510253312,3510253567,NC -3510253568,3510254079,US -3510254080,3510254591,CA -3510254592,3510261503,US -3510261504,3510261759,ZM -3510261760,3510263295,US -3510263296,3510263551,CA -3510263552,3510264063,US -3510264064,3510264319,UG -3510264320,3510265087,US -3510265088,3510265343,CA -3510265344,3510268671,US -3510268672,3510268927,SY -3510268928,3510269951,US -3510269952,3510270719,LY -3510270720,3510270975,SY -3510270976,3510280191,US -3510280192,3510286335,SG -3510286336,3510288383,HK -3510288384,3510321151,US -3510321152,3510321663,VG -3510321664,3510321919,AG -3510321920,3510322175,KN -3510322176,3510323199,AG -3510323200,3510324223,KN -3510324224,3510325247,AI -3510325248,3510326271,AG -3510326272,3510327295,VG -3510327296,3510328319,AG -3510328320,3510328575,KN -3510328576,3510328831,MS -3510328832,3510329599,AG -3510329600,3510329855,MS -3510329856,3510331391,AG -3510331392,3510332415,DM -3510332416,3510332927,KN -3510332928,3510333183,LC -3510333184,3510333439,MS -3510333440,3510333951,KN -3510333952,3510334975,AG -3510334976,3510335487,KN -3510335488,3510335743,AI -3510335744,3510335999,VG -3510336000,3510337279,AG -3510337280,3510337535,LC -3510337536,3510470927,US -3510470928,3510470935,IL -3510470936,3510479791,US -3510479792,3510479799,IE -3510479800,3510546431,US -3510546432,3510550527,CA -3510550528,3510788447,US -3510788448,3510788479,GB -3510788480,3510844415,US -3510844416,3510844927,CA -3510844928,3510935551,US -3510935552,3510943743,CA -3510943744,3511140351,US -3511140352,3511156735,CA -3511156736,3511257855,US -3511257856,3511258111,CN -3511258112,3511314215,US -3511314216,3511314223,CA -3511314224,3511812095,US -3511812096,3511844863,CA -3511844864,3512043519,US -3512043520,3512043775,FI -3512043776,3512052735,US -3512052736,3512052991,FI -3512052992,3512139775,US -3512139776,3512156159,CA -3512156160,3512176127,US -3512176128,3512176383,GB -3512176384,3512197119,US -3512197120,3512205311,CA -3512205312,3512205567,US -3512205568,3512205823,CL -3512205824,3512206079,AW -3512206080,3512206335,CL -3512206336,3512207103,HN -3512207104,3512207359,US -3512207360,3512209407,CO -3512209408,3512210431,US -3512210432,3512210943,NA -3512210944,3512211199,CL -3512211200,3512211455,AR -3512211456,3512221695,US -3512221696,3512221759,AG -3512221760,3512221791,GP -3512221792,3512221951,AG -3512221952,3512222207,VG -3512222208,3512222271,AG -3512222272,3512222335,KN -3512222336,3512222463,AG -3512222464,3512222975,AI -3512222976,3512223743,AG -3512223744,3512225791,ZA -3512225792,3512227839,PR -3512227840,3512229887,ZW -3512229888,3512230143,VE -3512230144,3512230911,US -3512230912,3512231167,CL -3512231168,3512231423,US -3512231424,3512231679,CL -3512231680,3512231935,VE -3512231936,3512233215,US -3512233216,3512233471,CL -3512233472,3512233727,US -3512233728,3512233983,HN -3512233984,3512236031,ZA -3512236032,3512236287,US -3512236288,3512237311,MR -3512237312,3512237823,US -3512237824,3512238079,HN -3512238080,3512240127,AW -3512240128,3512241663,BS -3512241664,3512242175,CO -3512242176,3512242431,CL -3512242432,3512242687,VE -3512242688,3512244991,EG -3512244992,3512246015,IL -3512246016,3512246783,CL -3512246784,3512247039,US -3512247040,3512247295,NG -3512247296,3512248319,US -3512248320,3512248831,CO -3512248832,3512249087,CL -3512249088,3512249343,CO -3512249344,3512256511,IL -3512256512,3512258559,CL -3512258560,3512260607,US -3512260608,3512261631,GU -3512261632,3512262655,US -3512262656,3512263679,GT -3512263680,3512264703,VE -3512264704,3512267263,US -3512267264,3512268031,TG -3512268032,3512268543,US -3512268544,3512268799,PR -3512268800,3512269055,US -3512269056,3512269311,PR -3512269312,3512269567,US -3512269568,3512269823,HN -3512269824,3512270847,US -3512270848,3512336383,CA -3512336384,3512369151,US -3512369152,3512385535,CA -3512385536,3512397823,US -3512397824,3512401919,CA -3512401920,3512418303,US -3512418304,3512451071,CA -3512451072,3512467455,PR -3512467456,3512532991,US -3512532992,3512598527,GB -3512598528,3512647679,US -3512647680,3512655871,TT -3512655872,3512678655,US -3512678656,3512678911,CA -3512678912,3512679167,AU -3512679168,3512679423,US -3512679424,3512679679,HK -3512679680,3512680191,US -3512680192,3512680447,SG -3512680448,3512688895,US -3512688896,3512689407,CA -3512689408,3512689663,US -3512689664,3512690175,CA -3512690176,3512690431,US -3512690432,3512690687,CA -3512690688,3512695295,US -3512695296,3512696319,CA -3512696320,3512696575,US -3512696576,3512696831,CA -3512696832,3512844287,US -3512844288,3512852479,CA -3512852480,3512931583,US -3512931584,3512931839,CA -3512931840,3512983551,US -3512983552,3512987647,AR -3512987648,3513188351,US -3513188352,3513204735,CA -3513204736,3513270271,US -3513270272,3513286655,CA -3513286656,3513294847,US -3513294848,3513303039,CA -3513303040,3513368575,US -3513368576,3513376767,CA -3513376768,3513475071,US -3513475072,3513491455,CA -3513491456,3513495551,US -3513495552,3513495615,CA -3513495616,3513495679,MX -3513495680,3513495743,PR -3513495744,3513495807,VI -3513495808,3513495871,UM -3513495872,3513496063,US -3513496064,3513496067,CA -3513496068,3513496071,MX -3513496072,3513496075,PR -3513496076,3513496079,VI -3513496080,3513496083,UM -3513496084,3513497087,US -3513497088,3513497151,CA -3513497152,3513497215,MX -3513497216,3513497279,PR -3513497280,3513497343,VI -3513497344,3513497407,UM -3513497408,3513500415,US -3513500416,3513500671,AU -3513500672,3513778175,US -3513778176,3513794559,CA -3513794560,3514007551,US -3514007552,3514040319,CA -3514040320,3514367999,US -3514368000,3514433535,CA -3514433536,3514589439,US -3514589440,3514589695,GT -3514589696,3514590207,SV -3514590208,3514590719,NI -3514590720,3514591103,SV -3514591104,3514591487,US -3514591488,3514592255,NI -3514592256,3514593279,SV -3514593280,3514596863,US -3514596864,3514597375,SV -3514597376,3514721301,US -3514721302,3514721303,BZ -3514721304,3514721385,US -3514721386,3514721391,BZ -3514721392,3514723693,US -3514723694,3514723695,BZ -3514723696,3514723696,US -3514723697,3514723697,BZ -3514723698,3514724455,US -3514724456,3514724456,BZ -3514724457,3514761215,US -3514826752,3514843135,CA -3514843136,3514993983,US -3514993984,3514993987,FR -3514993988,3514993991,DE -3514993992,3514994007,GB -3514994008,3514994015,DK -3514994016,3514994016,GB -3514994017,3514994023,DK -3514994024,3515211775,US -3515211776,3515219967,CA -3515219968,3515301887,US -3515301888,3515318271,CA -3515318272,3515596799,US -3515596800,3515613183,CA -3515613184,3515688686,US -3515688687,3515688687,PT -3515688688,3515711487,US -3515711488,3515731967,CA -3515731968,3515736063,US -3515736064,3515744255,DE -3515744256,3515760639,CA -3515760640,3515844095,US -3515844096,3515844607,GB -3515844608,3515965439,US -3515965440,3515973631,CA -3515973632,3515990015,US -3515990016,3516006399,CA -3516006400,3516039167,US -3516039168,3516071935,CA -3516071936,3516088831,US -3516088832,3516088832,GB -3516088833,3516094207,US -3516094208,3516094208,GB -3516094209,3516095487,US -3516095488,3516095488,GB -3516095489,3516139007,US -3516139008,3516139263,GB -3516139264,3516170239,US -3516170240,3516203007,CA -3516203008,3516305407,US -3516305408,3516309503,PK -3516309504,3516334079,US -3516334080,3516342271,CA -3516342272,3516357631,US -3516357632,3516357887,MY -3516357888,3516358143,CA -3516358144,3516358655,US -3516366848,3516370943,CA -3516370944,3516514303,US -3516514304,3516530687,CA -3516530688,3516643083,US -3516643084,3516643087,PR -3516643088,3516899327,US -3516899328,3516899839,ZA -3516899840,3516900031,NG -3516900032,3516900063,US -3516900064,3516900095,NG -3516900096,3516900351,ZA -3516900352,3516900607,NG -3516900608,3516900863,ZA -3516900864,3516902399,US -3516902400,3516902655,ZA -3516902656,3516902911,US -3516902912,3516903167,ZA -3516903168,3516903423,NG -3516903424,3516907519,CA -3516907520,3517019135,US -3517019136,3517019391,HN -3517019392,3517021439,US -3517021440,3517021695,NI -3517021696,3517038591,US -3517038592,3517054975,CA -3517054976,3517095935,US -3517095936,3517100031,CA -3517100032,3517112319,US -3517112320,3517116159,CA -3517116160,3517116415,US -3517116416,3517120511,CA -3517120512,3517233151,US -3517233152,3517235199,GU -3517235200,3517382655,US -3517382656,3517383167,CA -3517383168,3517383423,US -3517383424,3517384703,CA -3517384704,3517385407,US -3517385408,3517385439,CA -3517385440,3517385471,US -3517385472,3517385727,CA -3517385728,3517385983,US -3517385984,3517387263,CA -3517387264,3517387519,US -3517387520,3517387775,CA -3517387776,3517388287,US -3517388288,3517388799,CA -3517388800,3517389311,US -3517389312,3517389567,CA -3517389568,3517389823,US -3517389824,3517390335,CA -3517390336,3517390591,US -3517390592,3517391103,CA -3517391104,3517391871,US -3517391872,3517392127,CA -3517392128,3517392383,US -3517392384,3517392639,CA -3517392640,3517392895,US -3517392896,3517393407,CA -3517393408,3517394431,US -3517394432,3517394943,CA -3517394944,3517395199,US -3517395200,3517395455,CA -3517395456,3517396751,US -3517396752,3517396767,CA -3517396768,3517397247,US -3517397248,3517397503,CA -3517397504,3517397759,US -3517397760,3517398015,CA -3517398016,3517398527,US -3517398528,3517399039,CA -3517399040,3517399807,US -3517399808,3517399871,CA -3517399872,3517400063,US -3517400064,3517400319,CA -3517400320,3517401855,US -3517401856,3517402367,CA -3517402368,3517402623,US -3517402624,3517402879,CA -3517402880,3517403647,US -3517403648,3517403903,CA -3517403904,3517404415,US -3517404416,3517404927,CA -3517404928,3517405183,US -3517405184,3517405439,CA -3517405440,3517405695,US -3517405696,3517406719,CA -3517406720,3517406975,US -3517406976,3517407231,CA -3517407232,3517407743,US -3517407744,3517407999,CA -3517408000,3517408255,US -3517408256,3517408511,CA -3517408512,3517409023,US -3517409024,3517409279,CA -3517409280,3517409791,US -3517409792,3517411071,CA -3517411072,3517411327,US -3517411328,3517414399,CA -3517414400,3517415167,US -3517415168,3517415423,CA -3517415424,3517416919,US -3517416920,3517416927,CA -3517416928,3517416959,US -3517416960,3517417471,CA -3517417472,3517418495,US -3517418496,3517419007,CA -3517419008,3517419519,US -3517419520,3517420031,CA -3517420032,3517420375,US -3517420376,3517420383,CA -3517420384,3517420799,US -3517420800,3517421567,CA -3517421568,3517421823,US -3517421824,3517422079,CA -3517422080,3517422847,US -3517422848,3517423359,CA -3517423360,3517423423,US -3517423424,3517423455,CA -3517423456,3517423487,US -3517423488,3517423519,CA -3517423520,3517423871,US -3517423872,3517424127,CA -3517424128,3517424767,US -3517424768,3517424831,CA -3517424832,3517425407,US -3517425408,3517425919,CA -3517425920,3517426751,US -3517426752,3517426815,CA -3517426816,3517426943,US -3517426944,3517427711,CA -3517427712,3517428735,US -3517428736,3517429503,CA -3517429504,3517430271,US -3517430272,3517430527,CA -3517430528,3517432319,US -3517432320,3517433343,CA -3517433344,3517434111,US -3517434112,3517434367,CA -3517434368,3517435135,US -3517435136,3517435391,CA -3517435392,3517435647,US -3517435648,3517436415,CA -3517436416,3517436671,US -3517436672,3517436927,CA -3517436928,3517437183,US -3517437184,3517437439,CA -3517437440,3517437695,US -3517437696,3517437951,CA -3517437952,3517438207,US -3517438208,3517438463,CA -3517438464,3517438943,US -3517438944,3517439231,CA -3517439232,3517439743,US -3517439744,3517441279,CA -3517441280,3517441535,US -3517441536,3517441791,CA -3517441792,3517442175,US -3517442176,3517442207,CA -3517442208,3517442559,US -3517442560,3517442623,CA -3517442624,3517442815,US -3517442816,3517443583,CA -3517443584,3517444863,US -3517444864,3517445119,CA -3517445120,3517445631,US -3517445632,3517445887,CA -3517445888,3517446143,US -3517446144,3517446655,CA -3517446656,3517447167,US -3517447168,3517447679,CA -3517447680,3517447863,US -3517447864,3517447871,CA -3517447872,3517447935,US -3517447936,3517448191,CA -3517448192,3517546495,US -3517546496,3517562879,CA -3517562880,3517597695,US -3517597696,3517597951,IE -3517597952,3517602047,US -3517602048,3517602303,DE -3517602304,3517607935,US -3517607936,3517608191,DE -3517608192,3517608447,US -3517608448,3517608703,GB -3517608704,3517609727,US -3517609728,3517609743,AT -3517609744,3517610159,US -3517610160,3517610175,DE -3517610176,3517644799,US -3517644800,3517710335,CA -3517710336,3517718527,US -3517718528,3517726719,CA -3517726720,3517990911,US -3517990912,3517991423,CA -3517991424,3518058495,US -3518058496,3518059007,CN -3518059008,3518059263,US -3518059264,3518059519,CN -3518059520,3518059775,HK -3518059776,3518060031,US -3518060032,3518060287,CN -3518060288,3518060799,US -3518060800,3518061055,CN -3518061056,3518062079,US -3518062080,3518062591,CN -3518062592,3518066687,CA -3518066688,3518075647,US -3518075648,3518075903,AU -3518075904,3518076671,US -3518076672,3518076927,PA -3518076928,3518374719,US -3518374720,3518374783,IN -3518374784,3518380223,US -3518380224,3518380287,DE -3518380288,3518381055,US -3518381056,3518381311,IN -3518381312,3518381439,US -3518381440,3518381567,IN -3518381568,3518381631,DE -3518381632,3518392575,US -3518392576,3518392831,NL -3518392832,3518393087,US -3518393088,3518393343,SG -3518393344,3518393599,US -3518393600,3518393855,GB -3518393856,3518422271,US -3518422272,3518422527,CA -3518422528,3518424063,US -3518424064,3518425087,CA -3518425088,3518431231,US -3518431232,3518439423,CA -3518439424,3518463999,US -3518464000,3518472191,CA -3518472192,3518762495,US -3518762496,3518762751,GB -3518762752,3518918143,US -3518918144,3518918399,IN -3518918400,3518919423,US -3518919424,3518919679,IN -3518919680,3518929535,US -3518929536,3518929599,CA -3518929600,3519234047,US -3519234048,3519250431,CA -3519250432,3519319807,US -3519319808,3519320063,CA -3519320064,3519320319,US -3519320320,3519322623,CA -3519322624,3519322879,US -3519322880,3519323135,CA -3519323136,3519340543,US -3519340544,3519344639,CA -3519344640,3519354909,US -3519354910,3519354910,BR -3519354911,3519381503,US -3519381504,3519397887,CA -3519397888,3519475711,US -3519475712,3519476223,BH -3519476224,3519477759,DE -3519477760,3519578367,US -3519578368,3519578623,NA -3519578624,3519578879,US -3519578880,3519579135,CA -3519579136,3519579967,US -3519579968,3519579983,CY -3519579984,3519586303,US -3519586304,3519586559,GB -3519586560,3519590655,US -3519590656,3519590911,CA -3519590912,3519603772,US -3519603773,3519603781,IN -3519603782,3519676415,US -3519676416,3519709183,CA -3519709184,3519723519,US -3519723520,3519724031,CA -3519724032,3519741951,US -3519741952,3519758335,ZA -3519758336,3519772927,US -3519772928,3519773183,AS -3519773184,3519799807,US -3519799808,3519800575,CA -3519800576,3519801087,US -3519801088,3519801215,CA -3519801216,3519801223,US -3519801224,3519801343,CA -3519801344,3519803647,US -3519803648,3519803903,CA -3519803904,3519804159,US -3519804160,3519805183,CA -3519805184,3519806975,US -3519806976,3519807487,CA -3519807488,3519856639,US -3519856640,3519868927,CA -3519868928,3519869183,US -3519869184,3519869439,GB -3519869440,3519870207,US -3519870208,3519870463,GB -3519870464,3519871231,US -3519871232,3519871487,GB -3519871488,3519873023,US -3519873024,3519874559,CA -3519874560,3519875071,US -3519875072,3519877119,CA -3519877120,3519877167,US -3519877168,3519877183,CA -3519877184,3519877887,US -3519877888,3519878143,CA -3519878144,3519878271,US -3519878272,3519878303,CA -3519878304,3519879727,US -3519879728,3519879735,CA -3519879736,3519879935,US -3519879936,3519880447,CA -3519880448,3519881215,US -3519881216,3519884031,CA -3519884032,3519884287,US -3519884288,3519901695,CA -3519901696,3519930367,US -3519934464,3519938559,CA -3519938560,3519940607,IL -3519940608,3519940863,FR -3519940864,3519941887,IL -3519941888,3519942143,IT -3519942144,3519946751,IL -3519946752,3519948287,US -3519948288,3519948799,DE -3519948800,3519967231,US -3519967232,3519969279,CA -3519969280,3519971071,US -3519971072,3519971327,CA -3519971328,3520020479,US -3520020480,3520036863,CA -3520036864,3520192511,US -3520192512,3520192767,GB -3520192768,3520193023,DE -3520193024,3520193279,GB -3520193280,3520193535,DE -3520193536,3520194303,GB -3520194304,3520196607,US -3520196608,3520196863,IN -3520196864,3520196991,IL -3520196992,3520197119,IN -3520197120,3520197631,US -3520197632,3520197759,AU -3520197760,3520197887,RU -3520197888,3520198143,US -3520198144,3520198271,DE -3520198272,3520198399,MX -3520198400,3520198527,ES -3520198528,3520198655,JP -3520198656,3520198911,US -3520198912,3520199039,MX -3520199040,3520199167,AU -3520199168,3520199295,HK -3520199296,3520199423,DE -3520199424,3520199551,JP -3520199552,3520199807,GB -3520199808,3520199935,HK -3520199936,3520200447,GB -3520200448,3520200575,IN -3520200576,3520200703,FR -3520200704,3520356351,US -3520356352,3520364543,ZA -3520364544,3520390143,US -3520390144,3520390399,JP -3520390400,3520409599,US -3520409600,3520413439,DE -3520413440,3520413695,CA -3520413696,3520454655,US -3520454656,3520462847,CA -3520462848,3520626687,US -3520626688,3520634879,CA -3520634880,3520675839,US -3520675840,3520692223,CA -3520692224,3520937983,US -3520937984,3520954367,CA -3520954368,3520994815,US -3520994816,3520995071,GB -3520995072,3520995327,JP -3520995328,3520999423,US -3520999424,3521003519,CA -3521003520,3521028095,US -3521028096,3521032191,CA -3521032192,3521044479,US -3521044480,3521048575,CA -3521048576,3521086207,US -3521086208,3521086463,AU -3521086464,3521196287,US -3521196288,3521196543,AR -3521196544,3521216511,US -3521216512,3521220351,CA -3521220352,3521220607,US -3521220608,3521224959,CA -3521224960,3521225215,US -3521225216,3521232895,CA -3521232896,3521249279,US -3521249280,3521314815,CA -3521314816,3521347583,US -3521347584,3521358399,CA -3521358400,3521358463,US -3521358464,3521358655,CA -3521358656,3521358719,US -3521358720,3521358783,CA -3521358784,3521358815,US -3521358816,3521361375,CA -3521361376,3521361391,US -3521361392,3521361423,CA -3521361424,3521361439,US -3521361440,3521363967,CA -3521363968,3521380351,IT -3521380352,3521837055,US -3521837056,3521837311,SG -3521837312,3521904639,US -3521904640,3521921023,JM -3521921024,3521965055,US -3521965056,3521966079,DE -3521966080,3522101247,US -3522101248,3522109439,CA -3522109440,3522118143,US -3522118144,3522118655,GB -3522118656,3522118911,US -3522118912,3522119679,GB -3522119680,3522119935,US -3522119936,3522120191,LY -3522120192,3522120447,US -3522120448,3522121215,AE -3522121216,3522121471,US -3522121472,3522121983,AE -3522121984,3522122239,AW -3522122240,3522123519,US -3522123520,3522123775,GB -3522123776,3522125055,US -3522125056,3522125311,GB -3522125312,3522131845,US -3522131846,3522131846,BZ -3522131847,3522131858,US -3522131859,3522131859,DE -3522131860,3522133639,US -3522133640,3522133647,DE -3522133648,3522133663,US -3522133664,3522133695,DE -3522133696,3522174975,US -3522174976,3522179071,BM -3522179072,3522195455,US -3522195456,3522199551,CA -3522199552,3522854911,US -3522854912,3522871295,CA -3522871296,3522893823,US -3522893824,3522894847,CA -3522894848,3522902015,US -3522902016,3522903039,CA -3522903040,3522903807,US -3522903808,3522904063,CA -3522904064,3522940415,US -3522940416,3522940671,HK -3522940672,3522950655,US -3522950656,3522951167,CA -3522951168,3522952191,US -3522952192,3522952703,JE -3522952704,3523215359,US -3523215360,3523223551,AU -3523223552,3523231743,KR -3523231744,3523248127,AU -3523248128,3523280895,HK -3523280896,3523297279,TH -3523297280,3523317759,PH -3523317760,3523330047,JP -3523330048,3523338239,AU -3523338240,3523339775,MY -3523339776,3523340287,HK -3523340288,3523341311,AU -3523341312,3523342335,JP -3523342336,3523346431,BD -3523346432,3523354623,CN -3523354624,3523362815,KR -3523362816,3523379199,VN -3523379200,3523395583,PK -3523395584,3523411967,JP -3523411968,3523477503,HK -3523477504,3523493887,PH -3523493888,3523497983,BD -3523497984,3523500031,AU -3523500032,3523502079,KR -3523502080,3523510271,PH -3523510272,3523518463,TH -3523518464,3523526655,JP -3523526656,3523530751,US -3523530752,3523532799,NZ -3523532800,3523534847,KR -3523534848,3523538943,AU -3523538944,3523543039,JP -3523543040,3523551231,CN -3523551232,3523553279,AU -3523553280,3523555327,MY -3523555328,3523557375,NZ -3523557376,3523559423,HK -3523559424,3523575807,PH -3523575808,3523583999,CN -3523584000,3523596359,HK -3523596360,3523596375,PK -3523596376,3523596783,HK -3523596784,3523596791,PK -3523596792,3523596927,HK -3523596928,3523597055,PK -3523597056,3523597063,HK -3523597064,3523597103,PK -3523597104,3523597119,HK -3523597120,3523597127,PK -3523597128,3523597567,HK -3523597568,3523597823,PK -3523597824,3523601663,HK -3523601664,3523601919,SA -3523601920,3523674111,HK -3523674112,3523682303,FJ -3523682304,3523686399,NZ -3523686400,3523688447,AU -3523688448,3523690495,CN -3523690496,3523698687,IN -3523698688,3523698863,HK -3523698864,3523698879,JP -3523698880,3523698943,HK -3523698944,3523698975,JP -3523698976,3523699007,HK -3523699008,3523699071,JP -3523699072,3523699199,HK -3523699200,3523699711,US -3523699712,3523700223,JP -3523700224,3523700287,US -3523700288,3523700351,JP -3523700352,3523700415,US -3523700416,3523700671,JP -3523700672,3523700679,HK -3523700680,3523700735,JP -3523700736,3523701759,HK -3523701760,3523702783,JP -3523702784,3523702799,SG -3523702800,3523702807,SN -3523702808,3523702847,SG -3523702848,3523702871,JP -3523702872,3523702911,SG -3523702912,3523703039,JP -3523703040,3523703103,SG -3523703104,3523704703,JP -3523704704,3523704719,SG -3523704720,3523704751,JP -3523704752,3523704783,SG -3523704784,3523704791,JP -3523704792,3523704831,SG -3523704832,3523704839,HK -3523704840,3523706879,JP -3523706880,3523707039,AU -3523707040,3523707071,JP -3523707072,3523707103,AU -3523707104,3523707119,JP -3523707120,3523707135,AU -3523707136,3523707903,GB -3523707904,3523708159,AU -3523708160,3523708287,JP -3523708288,3523708319,AU -3523708320,3523708351,JP -3523708352,3523708415,AU -3523708416,3523708927,JP -3523708928,3523708975,AU -3523708976,3523708991,JP -3523708992,3523709183,AU -3523709184,3523713023,JP -3523713024,3523713135,AU -3523713136,3523714047,JP -3523714048,3523714719,AU -3523714720,3523714799,JP -3523714800,3523714943,AU -3523714944,3523715007,GB -3523715008,3523715031,JP -3523715032,3523715071,AU -3523715072,3523723263,JP -3523723264,3523725311,US -3523725312,3523737599,JP -3523737600,3523738111,US -3523738112,3523739647,JP -3523739648,3524001791,AU -3524001792,3524132863,CN -3524132864,3524145151,PH -3524145152,3524149247,JP -3524149248,3524157439,CN -3524157440,3524161535,AU -3524161536,3524247551,CN -3524247552,3524263935,AU -3524263936,3524266495,PH -3524266496,3524266751,SG -3524266752,3524274175,PH -3524274176,3524274431,SG -3524274432,3524280319,PH -3524280320,3524281343,JP -3524281344,3524282367,AU -3524282368,3524288511,IN -3524288512,3524289535,HK -3524289536,3524290559,IN -3524290560,3524291327,CN -3524291328,3524291583,TW -3524291584,3524294655,IN -3524294656,3524295679,SG -3524295680,3524296703,MY -3524296704,3524313087,CN -3524313088,3524329471,KR -3524329472,3524362239,TW -3524362240,3524370687,HK -3524370688,3524370943,JP -3524370944,3524386303,HK -3524386304,3524386559,JP -3524386560,3524395007,HK -3524395008,3524444159,IN -3524444160,3524460543,AU -3524460544,3524526079,MY -3524526080,3524591615,JP -3524591616,3524722687,CN -3524722688,3524730879,SG -3524730880,3524739071,CN -3524739072,3524743167,ID -3524743168,3524747263,MP -3524747264,3524755455,PH -3524755456,3524763647,AU -3524763648,3524781791,PH -3524781792,3524781823,SG -3524781824,3524788223,PH -3524788224,3524790271,SG -3524790272,3524790527,JP -3524790528,3524790815,SG -3524790816,3524790911,JP -3524790912,3524790975,SG -3524790976,3524791615,JP -3524791616,3524791647,SG -3524791648,3524791775,JP -3524791776,3524791791,SG -3524791792,3524791807,JP -3524791808,3524792063,SG -3524792064,3524792223,JP -3524792224,3524792255,SG -3524792256,3524792287,JP -3524792288,3524792319,SG -3524792320,3524793855,JP -3524793856,3524794111,SG -3524794112,3524794175,JP -3524794176,3524794207,SG -3524794208,3524794239,JP -3524794240,3524794303,SG -3524794304,3524794367,JP -3524794368,3524801023,SG -3524801024,3524801055,JP -3524801056,3524801087,SG -3524801088,3524801287,JP -3524801288,3524801295,SG -3524801296,3524801535,JP -3524801536,3524801791,SG -3524801792,3524801983,JP -3524801984,3524802023,SG -3524802024,3524802047,JP -3524802048,3524802303,SG -3524802304,3524802335,JP -3524802336,3524802351,SG -3524802352,3524802367,JP -3524802368,3524802383,SG -3524802384,3524802559,JP -3524802560,3524804863,SG -3524804864,3524809215,JP -3524809216,3524809727,SG -3524809728,3524810239,JP -3524810240,3524810495,SG -3524810496,3524812799,JP -3524812800,3524821503,SG -3524821504,3524821759,JP -3524821760,3524821823,SG -3524821824,3524821855,JP -3524821856,3524821951,SG -3524821952,3524821983,JP -3524821984,3524823807,SG -3524823808,3524824063,JP -3524824064,3524825855,SG -3524825856,3524826367,JP -3524826368,3524827167,SG -3524827168,3524827199,JP -3524827200,3524827231,SG -3524827232,3524827327,JP -3524827328,3524827359,SG -3524827360,3524827391,JP -3524827392,3524827471,SG -3524827472,3524827519,JP -3524827520,3524827551,SG -3524827552,3524827615,JP -3524827616,3524828127,SG -3524828128,3524828159,JP -3524828160,3524828415,SG -3524828416,3524828417,JP -3524828418,3524828418,SG -3524828419,3524828671,JP -3524828672,3524828927,SG -3524828928,3524829183,JP -3524829184,3524829439,SG -3524829440,3524829695,JP -3524829696,3524830207,SG -3524830208,3524830463,JP -3524830464,3524830719,SG -3524830720,3524830881,JP -3524830882,3524830882,SG -3524830883,3524830975,JP -3524830976,3524831231,SG -3524831232,3524831487,JP -3524831488,3524832511,SG -3524832512,3524832767,JP -3524832768,3524833343,SG -3524833344,3524833535,JP -3524833536,3524833791,SG -3524833792,3524834303,JP -3524834304,3524834815,SG -3524834816,3524835327,JP -3524835328,3524835839,SG -3524835840,3524836095,JP -3524836096,3524837119,SG -3524837120,3524837375,JP -3524837376,3524838399,SG -3524838400,3524838655,JP -3524838656,3524839167,SG -3524839168,3524839215,JP -3524839216,3524839231,SG -3524839232,3524839295,JP -3524839296,3524839359,SG -3524839360,3524839935,JP -3524839936,3524840447,SG -3524840448,3524840703,JP -3524840704,3524840959,SG -3524840960,3524841471,JP -3524841472,3524842751,SG -3524842752,3524843007,JP -3524843008,3524843263,SG -3524843264,3524843519,JP -3524843520,3524843775,SG -3524843776,3524844031,JP -3524844032,3524844543,SG -3524844544,3524845567,JP -3524845568,3524845823,SG -3524845824,3524846079,JP -3524846080,3524846335,SG -3524846336,3524846591,JP -3524846592,3524847359,SG -3524847360,3524847615,JP -3524847616,3524847871,SG -3524847872,3524848127,JP -3524848128,3524848383,SG -3524848384,3524848639,JP -3524848640,3524849407,SG -3524849408,3524849663,JP -3524849664,3524849919,SG -3524849920,3524850175,JP -3524850176,3524850431,SG -3524850432,3524850687,JP -3524850688,3524851455,SG -3524851456,3524853759,JP -3524853760,3526361087,CN -3526361088,3526393855,NZ -3526393856,3526395903,JP -3526395904,3526397951,HK -3526397952,3526402047,MY -3526402048,3526410239,NZ -3526410240,3526414335,MY -3526414336,3526416383,AU -3526416384,3526418431,MY -3526418432,3526426623,JP -3526426624,3526557695,AU -3526557696,3526651135,CN -3526651136,3526651391,KP -3526651392,3526754303,CN -3526754304,3526885375,NZ -3526885376,3526893567,PK -3526893568,3526897663,NZ -3526897664,3526901759,HK -3526901760,3526909951,AU -3526909952,3526918143,IN -3526918144,3526922239,SG -3526922240,3526924287,IN -3526924288,3526926335,AU -3526926336,3526934527,JP -3526934528,3526942719,CN -3526942720,3526950911,AU -3526950912,3526951935,MY -3526951936,3526952959,JP -3526952960,3526953983,ID -3526953984,3526954495,JP -3526954496,3526954751,PH -3526954752,3526955007,JP -3526955008,3526955263,US -3526955264,3526956287,JP -3526956288,3526956799,HK -3526956800,3526966271,JP -3526966272,3526966783,HK -3526966784,3526967295,SG -3526967296,3526971439,JP -3526971440,3526971443,HK -3526971444,3526971531,JP -3526971532,3526971535,HK -3526971536,3526971647,JP -3526971648,3526972159,HK -3526972160,3527002111,JP -3527002112,3527003647,IN -3527003648,3527004159,JP -3527004160,3527008255,ID -3527008256,3527016447,KR -3527016448,3527933951,TW -3527933952,3528392703,CN -3528392704,3528396799,JP -3528396800,3528400895,AU -3528400896,3528404991,JP -3528404992,3528407039,NZ -3528409088,3528425471,CN -3528441856,3528445951,JP -3528445952,3528450047,ID -3528450048,3528458239,CN -3528458240,3528474623,SG -3528474624,3528482815,TW -3528482816,3528491007,KR -3528491008,3528507391,AU -3528507392,3528589311,JP -3528589312,3528720383,CN -3528720384,3528785919,AU -3528785920,3528851455,TW -3528851456,3528884223,NZ -3528884224,3528908799,TH -3528908800,3528912895,VN -3528912896,3528933375,AU -3528949760,3528966143,CN -3528966144,3528974335,KR -3528974336,3528978431,JP -3528978432,3528982527,HK -3528982528,3529056255,JP -3529056256,3529064447,IN -3529064448,3529072639,HK -3529072640,3529080831,JP -3529080832,3529089023,AU -3529089024,3529097215,KR -3529097216,3529113599,JP -3529113600,3531603967,KR -3531603968,3532290815,JP -3532290816,3532291071,GB -3532291072,3533119487,JP -3533119488,3533121209,CN -3533121210,3533121210,JP -3533121211,3533123583,CN -3533123584,3534749695,JP -3534749696,3534757887,HK -3534757888,3534758143,AU -3534758144,3534758147,JP -3534758148,3534758399,AU -3534758400,3534758655,HK -3534758656,3534758911,AU -3534758912,3534758927,PH -3534758928,3534758975,AU -3534758976,3534759039,PH -3534759040,3534759167,AU -3534759168,3534759215,JP -3534759216,3534759359,AU -3534759360,3534759391,JP -3534759392,3534759935,AU -3534759936,3534760447,US -3534760448,3534760959,NZ -3534760960,3534761727,AU -3534761728,3534761983,JP -3534761984,3534784511,HK -3534784512,3534785023,TW -3534785024,3534785043,HK -3534785044,3534785047,SG -3534785048,3534786815,HK -3534786816,3534787327,MY -3534787328,3534787583,TH -3534787584,3534863443,HK -3534863444,3534863444,CN -3534863445,3534880767,HK -3534880768,3535273983,KR -3535273984,3535274495,HK -3535274496,3535274496,ZA -3535274497,3535279103,HK -3535279104,3535279359,US -3535279360,3535280383,HK -3535280384,3535280639,JP -3535280640,3535280895,HK -3535280896,3535281151,SG -3535281152,3535282431,HK -3535282432,3535282687,JP -3535282688,3535283199,HK -3535283200,3535283455,US -3535283456,3535291903,HK -3535291904,3535292159,US -3535292160,3535292671,HK -3535292672,3535292927,SG -3535292928,3535294463,HK -3535294464,3535294719,DE -3535294720,3535294975,HK -3535294976,3535295231,DE -3535295232,3535298303,HK -3535298304,3535298304,ZA -3535298305,3535339519,HK -3535339520,3535355903,NZ -3535355904,3535372287,AU -3535372288,3535380479,JP -3535380480,3535388671,PH -3535388672,3535405055,CN -3535405056,3535536127,MY -3535536128,3535798271,JP -3535798272,3535814655,TW -3535814656,3535822847,KR -3535822848,3535831039,CN -3535831040,3535863807,TW -3535863808,3535880191,SG -3535880192,3535896575,JP -3535896576,3535905791,AU -3535905792,3535906047,US -3535906048,3535909887,AU -3535909888,3535910143,US -3535910144,3535929343,AU -3535929344,3535994879,JP -3535994880,3536060415,MY -3536060416,3536322559,JP -3536322560,3536551935,TW -3536551936,3536568319,TH -3536568320,3536584703,JP -3536584704,3536846847,KR -3536846848,3536928767,TW -3536928768,3536945151,HK -3536945152,3536977919,TW -3536977920,3537010687,IN -3537010688,3537027071,ID -3537027072,3537047551,KR -3537047552,3537049599,ID -3537049600,3537051647,HK -3537051648,3537059839,JP -3537059840,3537068031,KR -3537068032,3537076223,VN -3537076224,3537174527,IN -3537174528,3537190911,TH -3537190912,3537240063,PH -3537240064,3537305599,IN -3537305600,3537371135,AU -3537371136,3537895423,KR -3537895424,3538943999,JP -3538944000,3539271679,TW -3539271680,3539304447,VN -3539304448,3539337215,HK -3539337216,3539353599,NZ -3539353600,3539402751,TH -3539402752,3539435519,JP -3539435520,3539464191,AU -3539464192,3539468287,ID -3539468288,3541303295,JP -3541303296,3541565439,TW -3541565440,3541696511,MY -3541696512,3542089727,AU -3542089728,3542847487,KR -3542847488,3542851071,US -3542851072,3542851327,DE -3542851328,3542851583,US -3542851584,3544186879,KR -3544186880,3544711167,CN -3544711168,3545235455,TW -3545235456,3546808319,CN -3546808320,3547856895,KR -3547856896,3548208127,JP -3548208128,3548208639,US -3548208640,3548905471,JP -3548905472,3551002623,CN -3551002624,3556769791,KR -3556769792,3556773887,DE -3556786176,3556794367,RU -3556794368,3556802559,ES -3556802560,3556810751,SD -3556810752,3556818943,PT -3556818944,3556827135,MD -3556827136,3556843519,NL -3556843520,3556851711,DE -3556851712,3556868095,UA -3556868096,3556876287,GB -3556876288,3556884479,NL -3556884480,3556886527,IR -3556886528,3556888575,GB -3556888576,3556890623,US -3556890624,3556892671,GB -3556892672,3556900863,RU -3556900864,3556909055,GB -3556909056,3556925439,DE -3556925440,3556933631,PL -3556933632,3556941823,UA -3556941824,3556950015,IE -3556950016,3556958207,TR -3556958208,3556966399,KG -3556966400,3556974591,SE -3556974592,3556982783,ES -3556982784,3556990975,DE -3556990976,3556999167,UA -3556999168,3557007359,RU -3557007360,3557015551,IT -3557015552,3557016976,LV -3557016977,3557016977,ES -3557016978,3557023743,LV -3557023744,3557028415,NL -3557028416,3557028479,BE -3557028480,3557031935,NL -3557031936,3557040127,IT -3557040128,3557048319,NO -3557048320,3557056511,CH -3557056512,3557064703,ES -3557064704,3557072895,CZ -3557072896,3557081087,DE -3557081088,3557089279,NL -3557089280,3557105663,DE -3557105664,3557107711,BG -3557107712,3557109759,IQ -3557109760,3557113599,BG -3557113600,3557113855,IQ -3557113856,3557130239,RU -3557130240,3557138431,BG -3557138432,3557146623,RU -3557146624,3557154815,SK -3557154816,3557171199,RU -3557171200,3557172479,IT -3557172480,3557172991,IR -3557172992,3557173503,IQ -3557173504,3557173631,IR -3557173632,3557173695,IQ -3557173696,3557173703,AE -3557173704,3557173759,IT -3557173760,3557174015,IR -3557174016,3557174527,IT -3557174528,3557174783,IR -3557174784,3557175039,IT -3557175040,3557175295,IR -3557175296,3557175807,CH -3557175808,3557176063,IR -3557176064,3557176831,IT -3557176832,3557177023,IQ -3557177024,3557179391,IT -3557179392,3557228543,DE -3557228544,3557236735,EE -3557236736,3557244927,ES -3557244928,3557253119,IT -3557253120,3557261311,RU -3557261312,3557277695,DE -3557277696,3557279743,NL -3557279744,3557280255,US -3557280256,3557280511,DE -3557280512,3557282815,NL -3557282816,3557283327,PL -3557283328,3557283583,NL -3557283584,3557285887,PL -3557285888,3557294079,RU -3557294080,3557302271,DE -3557302272,3557310463,UA -3557310464,3557326847,ES -3557326848,3557335039,DE -3557336272,3557336279,BE -3557339164,3557339164,BE -3557343232,3557351423,DE -3557351424,3557355519,RU -3557355520,3557355775,NL -3557355776,3557356031,US -3557356032,3557356287,NL -3557356288,3557356543,RU -3557356544,3557357311,NL -3557357312,3557357567,RU -3557357568,3557357823,NL -3557357824,3557358079,RU -3557358080,3557359103,NL -3557359104,3557359615,MY -3557359616,3557359991,JE -3557359992,3557359999,GB -3557360000,3557360047,JE -3557360048,3557360055,GB -3557360056,3557360127,JE -3557360128,3557360135,GB -3557360136,3557360263,JE -3557360264,3557360271,GB -3557360272,3557360743,JE -3557360744,3557360751,GB -3557360752,3557360863,JE -3557360864,3557360871,GB -3557360872,3557360935,JE -3557360936,3557360943,GB -3557360944,3557363583,JE -3557363584,3557363595,GB -3557363596,3557363631,JE -3557363632,3557363639,GB -3557363640,3557363703,JE -3557363704,3557363711,GB -3557363712,3557364551,JE -3557364552,3557364559,GB -3557364560,3557364703,JE -3557364704,3557364711,GB -3557364712,3557365095,JE -3557365096,3557365103,GB -3557365104,3557365791,JE -3557365792,3557365799,GB -3557365800,3557367807,JE -3557367808,3557375999,DE -3557376000,3557384191,ES -3557384192,3557392383,GB -3557392384,3557400575,AT -3557400576,3557408767,DE -3557408768,3557416959,GB -3557416960,3557425151,UA -3557425152,3557490687,DK -3557490688,3557507071,FR -3557507072,3557515263,GB -3557515264,3557523455,CZ -3557523456,3557531647,RU -3557531648,3557539839,SA -3557539840,3557548031,SY -3557548032,3557556223,DE -3557556224,3557564415,RU -3557564416,3557572607,DE -3557572608,3557580799,RU -3557580800,3557588991,DE -3557588992,3557597183,TR -3557597184,3557605375,SA -3557605376,3557613567,LT -3557613568,3557621759,EG -3557621760,3557629951,RU -3557629952,3557638143,PT -3557638144,3557646335,MK -3557646336,3557654527,RU -3557654528,3557670911,KZ -3557670912,3557679103,GB -3557679104,3557687295,SI -3557687296,3557703679,PL -3557703680,3557711871,DE -3557711872,3557720063,ES -3557720064,3557728255,IT -3557728256,3557744639,RU -3557744640,3557752831,PS -3557752832,3557761023,TR -3557761024,3557769215,RU -3557769216,3557777407,GB -3557777408,3557785599,RU -3557785600,3557793791,UA -3557793792,3557801983,HR -3557801984,3557810175,DE -3557810176,3557818367,ES -3557818368,3557826559,RU -3557826560,3557834751,AT -3557834752,3557842943,IR -3557842944,3557851135,FI -3557851136,3557859327,HU -3557859328,3557861983,SE -3557861984,3557862015,FI -3557862016,3557863295,SE -3557863296,3557863327,FI -3557863328,3557863887,SE -3557863888,3557863903,NO -3557863904,3557863919,FI -3557863920,3557864311,SE -3557864312,3557864319,FI -3557864320,3557867519,SE -3557867520,3557875711,RU -3557875712,3557883903,DE -3557883904,3557892095,RU -3557892096,3557900287,IE -3557900288,3557916671,AT -3557916672,3557924863,NO -3557924864,3557928959,AX -3557928960,3557933055,FI -3557933056,3557941247,IT -3557941248,3557957631,DE -3557957632,3557965823,SI -3557965824,3557974015,DE -3557974016,3557982207,CH -3557982208,3557990399,NO -3557990400,3557998591,PT -3557998592,3558006783,DE -3558006784,3558008537,GB -3558008538,3558008538,NL -3558008539,3558009599,GB -3558009600,3558009855,NL -3558009856,3558010879,GB -3558010880,3558012927,FR -3558012928,3558014207,GB -3558014208,3558014463,NL -3558014464,3558014719,US -3558014720,3558014975,NL -3558014976,3558023167,RU -3558023168,3558031359,DE -3558031360,3558039551,GB -3558039552,3558047743,IT -3558047744,3558055935,KZ -3558055936,3558064127,FR -3558064128,3558067967,NL -3558067968,3558068223,ES -3558068224,3558068735,NL -3558068736,3558068991,FR -3558068992,3558069247,IE -3558069248,3558080511,NL -3558080512,3558096895,RU -3558096896,3558113279,CZ -3558113280,3558129663,DE -3558129664,3558137855,NO -3558137856,3558146047,GB -3558146048,3558154239,RU -3558154240,3558157847,GB -3558157848,3558157851,US -3558157852,3558161431,GB -3558161432,3558161439,TZ -3558161440,3558162431,GB -3558162432,3558170623,DE -3558170624,3558178815,GB -3558178816,3558187007,BG -3558187008,3558195199,DE -3558195200,3558196247,GB -3558196248,3558196255,IT -3558196256,3558196327,GB -3558196328,3558196351,IT -3558196352,3558197247,GB -3558197248,3558199295,US -3558199296,3558203391,GB -3558203392,3558211583,ES -3558211584,3558219775,GB -3558219776,3558227967,ES -3558227968,3558230015,RU -3558230016,3558231039,PL -3558231040,3558231551,RU -3558231552,3558231807,SK -3558231808,3558232063,RU -3558232064,3558232575,LB -3558232576,3558236159,RU -3558236160,3558244351,GB -3558244352,3558252543,IT -3558252544,3558260735,KE -3558260736,3558268927,UA -3558268928,3558276095,GI -3558276096,3558276351,GB -3558276352,3558277119,GI -3558277120,3558285951,GB -3558285952,3558286079,DE -3558286080,3558286591,GB -3558286592,3558286655,FR -3558286656,3558289119,GB -3558289120,3558289151,FR -3558289152,3558289431,GB -3558289432,3558289439,NL -3558289440,3558289975,GB -3558289976,3558289983,CZ -3558289984,3558290831,GB -3558290832,3558290847,ES -3558290848,3558291071,GB -3558291072,3558291135,DE -3558291136,3558292255,GB -3558292256,3558292271,SE -3558292272,3558293199,GB -3558293200,3558293215,NL -3558293216,3558293503,GB -3558293504,3558301695,RU -3558301696,3558318079,DE -3558318080,3558321284,FR -3558321285,3558321285,RE -3558321286,3558334463,FR -3558334464,3558342655,CH -3558342656,3558350847,IT -3558350848,3558359039,RU -3558359040,3558367231,GB -3558367232,3558371327,LT -3558371328,3558375423,AT -3558375424,3558383615,CZ -3558383616,3558391807,HU -3558391808,3558399999,LU -3558400000,3558408191,SA -3558408192,3558416383,CH -3558416384,3558424575,BG -3558424576,3558440959,IL -3558440960,3558449151,SE -3558449152,3558457343,IT -3558457344,3558457407,BE -3558457408,3558457599,GB -3558457600,3558457727,FR -3558457728,3558465535,NL -3558465536,3558473727,GB -3558473728,3558506495,SA -3558506496,3558514687,UA -3558514688,3558522879,SK -3558522880,3558524927,NL -3558524928,3558525183,ES -3558525184,3558525439,NL -3558525440,3558525695,FR -3558525696,3558525951,IE -3558525952,3558526975,NL -3558526976,3558527744,ES -3558527745,3558531071,NL -3558531072,3558539263,RU -3558539264,3558547455,DK -3558547456,3558555647,FR -3558555648,3558572031,AT -3558572032,3558580223,DE -3558580224,3558588415,CH -3558588416,3558596607,CZ -3558596608,3558597343,EE -3558597344,3558597351,PL -3558597352,3558604799,EE -3558604800,3558612991,GB -3558612992,3558621183,DE -3558621184,3558629375,MD -3558629376,3558637567,DE -3558637568,3558645759,CH -3558645760,3558653951,IT -3558653952,3558662143,SE -3558662144,3558670335,LB -3558670336,3558686719,DE -3558686720,3558703103,TR -3558703104,3558711295,IT -3558711296,3558719487,NL -3558719488,3558735871,IL -3558735872,3558744063,GG -3558744064,3558752255,LB -3558752256,3558760447,SI -3558760448,3558768639,FR -3558768640,3558785023,RU -3558785024,3558801407,IS -3558801408,3558809599,TR -3558809600,3558817791,ES -3558817792,3558825983,AT -3558825984,3558834175,CY -3558834176,3558842367,GB -3558842368,3558850559,SE -3558850560,3558851327,GB -3558851328,3558851335,ES -3558851336,3558851815,GB -3558851816,3558851823,ES -3558851824,3558854135,GB -3558854136,3558854143,ES -3558854144,3558856703,GB -3558856704,3558858751,US -3558858752,3558866943,IT -3558866944,3558899711,GB -3558899712,3558916095,SE -3558916096,3558924287,RU -3558924288,3558932479,NL -3558932480,3558940671,RU -3558940672,3558948863,AT -3558948864,3558957055,PL -3558957056,3558965247,PS -3558965248,3558973439,NO -3558973440,3558981631,SA -3558981632,3558989823,IR -3558989824,3558998015,RU -3558998016,3559006207,JO -3559006208,3559014399,RU -3559014400,3559022591,DE -3559022592,3559030783,RU -3559030784,3559038975,ES -3559038976,3559047167,DE -3559047168,3559055359,IT -3559055360,3559063551,AM -3559063552,3559079935,CH -3559079936,3559088127,JO -3559088128,3559088991,GB -3559088992,3559088999,BE -3559089000,3559089527,GB -3559089528,3559089535,BE -3559089536,3559089935,GB -3559089936,3559089951,BE -3559089952,3559090239,GB -3559090240,3559090303,BE -3559090304,3559091023,GB -3559091024,3559091031,BE -3559091032,3559092243,GB -3559092244,3559092244,BE -3559092245,3559093311,GB -3559093312,3559093319,BE -3559093320,3559093487,GB -3559093488,3559093503,BE -3559093504,3559094303,GB -3559094304,3559094319,BE -3559094320,3559095455,GB -3559095456,3559095456,BE -3559095457,3559096319,GB -3559096320,3559104511,RO -3559104512,3559112703,RU -3559112704,3559120895,IT -3559120896,3559129087,GB -3559129088,3559137279,BG -3559137280,3559145471,GB -3559145472,3559153663,ES -3559153664,3559161855,GB -3559161856,3559161887,FR -3559161888,3559162047,GB -3559162048,3559162079,BE -3559162080,3559163903,GB -3559163904,3559163935,FR -3559163936,3559163999,GB -3559164000,3559164031,NL -3559164032,3559164151,GB -3559164152,3559164159,IT -3559164160,3559178239,GB -3559178240,3559186431,LB -3559186432,3559194623,RU -3559194624,3559197551,SE -3559197552,3559197567,FI -3559197568,3559200143,SE -3559200144,3559200151,FI -3559200152,3559200255,SE -3559200256,3559200511,FI -3559200512,3559200639,SE -3559200640,3559200671,FI -3559200672,3559201607,SE -3559201608,3559201615,FI -3559201616,3559201871,SE -3559201872,3559201879,FI -3559201880,3559202815,SE -3559202816,3559211007,DE -3559211008,3559219199,SK -3559219200,3559227391,SE -3559227392,3559235583,DK -3559235584,3559243775,DE -3559243776,3559251967,FR -3559251968,3559260159,NO -3559260160,3559268351,DE -3559268352,3559276543,IT -3559276544,3559284735,GB -3559284736,3559292927,RU -3559292928,3559301119,JO -3559301120,3559306576,GB -3559306577,3559306577,AT -3559306578,3559309311,GB -3559309312,3559317503,PL -3559317504,3559325695,FI -3559325696,3559333887,IT -3559333888,3559336447,SE -3559336448,3559336703,US -3559336704,3559342079,SE -3559342080,3559350271,BG -3559350272,3559358463,BA -3559358464,3559366655,FR -3559366656,3559368959,GB -3559368960,3559369215,AO -3559369216,3559374847,GB -3559374848,3559383039,AT -3559383040,3559391231,GB -3559391232,3559399423,CH -3559399424,3559407615,UA -3559407616,3559423999,HU -3559424000,3559432191,LB -3559432192,3559440383,DE -3559440384,3559448575,RU -3559448576,3559456767,ES -3559456768,3559473151,RU -3559473152,3559489535,CH -3559489536,3559491247,GB -3559491248,3559491263,NL -3559491264,3559491759,GB -3559491760,3559491767,NL -3559491768,3559505919,GB -3559505920,3559514111,CH -3559514112,3559522303,AT -3559522304,3559530495,GB -3559530496,3559538687,RU -3559538688,3559546879,UA -3559546880,3559555071,KG -3559555072,3559563263,CH -3559563264,3559571455,GB -3559571456,3559579647,AM -3559579648,3559587839,DE -3559587840,3559596031,KW -3559596032,3559604223,BG -3559604224,3559612415,DE -3559612416,3559620607,IT -3559620608,3559628799,CH -3559628800,3559636991,GB -3559636992,3559653375,FR -3559653376,3559669759,GB -3559669760,3559677951,RU -3559677952,3559686143,SI -3559686144,3559694335,RU -3559694336,3559710719,DE -3559710720,3559718911,FR -3559718912,3559727103,RU -3559727104,3559735295,NL -3559735296,3559739391,BG -3559739392,3559743487,KZ -3559743488,3559745535,IT -3559745536,3559747583,DE -3559747584,3559751679,DK -3559751680,3559759871,IT -3559759872,3559768063,NO -3559768064,3559776255,CH -3559776256,3559792639,RU -3559792640,3559800831,SA -3559800832,3559809023,IT -3559809024,3559817215,DE -3559817216,3559825407,GB -3559825408,3559833599,IT -3559833600,3559849983,RU -3559849984,3559858175,CZ -3559858176,3559866367,IT -3559866368,3559874559,GB -3559874560,3559882751,LT -3559882752,3559890943,AZ -3559890944,3559899135,CH -3559899136,3559899263,PL -3559899264,3559899647,UA -3559899648,3559899967,EE -3559899968,3559900007,UA -3559900008,3559900015,EE -3559900016,3559900031,UA -3559900032,3559900351,EE -3559900352,3559902719,UA -3559902720,3559902975,EE -3559902976,3559903231,UA -3559903232,3559907327,EE -3559907328,3559915519,FR -3559915520,3559923711,IT -3559923712,3559931903,RU -3559931904,3559940095,GB -3559940096,3559945087,DE -3559945088,3559945151,PL -3559945152,3559946495,DE -3559946496,3559946751,PL -3559946752,3559948287,DE -3559948288,3559956479,RU -3559956480,3559964671,IT -3559964672,3559976959,RU -3559976960,3559981055,HU -3559981056,3559989247,EE -3559989248,3559997439,PL -3559997440,3560005631,KE -3560005632,3560013823,RU -3560013824,3560016063,GB -3560016064,3560016064,ES -3560016065,3560021247,GB -3560021248,3560021263,ES -3560021264,3560022015,GB -3560022016,3560030207,ES -3560030208,3560046591,GB -3560046592,3560054783,BG -3560054784,3560062975,TR -3560062976,3560071167,BG -3560071168,3560079359,CY -3560079360,3560087551,FI -3560087552,3560095743,GB -3560095744,3560103935,FI -3560103936,3560112127,IR -3560112128,3560120319,DE -3560120320,3560128511,ES -3560128512,3560144895,HU -3560144896,3560153087,CH -3560153088,3560161279,FR -3560161280,3560169471,PL -3560169472,3560177663,AT -3560177664,3560185855,NL -3560185856,3560194047,LT -3560194048,3560210431,IT -3560210432,3560218623,BF -3560218624,3560226815,HU -3560226816,3560235007,AT -3560235008,3560243199,DE -3560243200,3560247295,BE -3560247296,3560251391,NL -3560251392,3560259583,RU -3560259584,3560267775,GB -3560267776,3560275967,EE -3560275968,3560308735,DE -3560308736,3560316927,FI -3560316928,3560325119,NL -3560325120,3560333311,DK -3560333312,3560341503,RO -3560341504,3560345855,GB -3560345856,3560348671,US -3560348672,3560357887,GB -3560357888,3560366079,GR -3560366080,3560374271,IT -3560374272,3560382463,ES -3560382464,3560390655,FO -3560390656,3560398847,UA -3560398848,3560407039,RU -3560407040,3560421375,PT -3560421376,3560423423,IL -3560423424,3560431615,CH -3560431616,3560439807,SK -3560439808,3560447999,BG -3560448000,3560472575,GB -3560472576,3560480767,MT -3560480768,3560488959,IT -3560488960,3560497151,MD -3560497152,3560501503,LU -3560501504,3560502527,DE -3560502528,3560502783,LU -3560502784,3560503039,DE -3560503040,3560505343,LU -3560505344,3560507391,TR -3560507392,3560507647,UA -3560507648,3560513535,TR -3560513536,3560515583,SK -3560515584,3560517631,RS -3560517632,3560521727,NL -3560521728,3560529919,PT -3560529920,3560554495,RU -3560554496,3560562687,SA -3560562688,3560570879,GB -3560570880,3560579071,TR -3560579072,3560587263,GB -3560587264,3560595455,DE -3560595456,3560603647,GE -3560603648,3560611839,GB -3560611840,3560620031,UA -3560620032,3560628223,RU -3560628224,3560636415,GB -3560636416,3560644607,LT -3560644608,3560652799,DE -3560652800,3560660991,GB -3560660992,3560669183,RU -3560669184,3560685567,CH -3560685568,3560693759,ES -3560693760,3560701951,PL -3560710144,3560718335,CH -3560718336,3560726527,GM -3560726528,3560734719,DK -3560734720,3560742911,DE -3560742912,3560751103,AT -3560751104,3560767487,DE -3560767488,3560833023,NL -3560833024,3560841215,GB -3560841216,3560849407,RS -3560849408,3560857599,DE -3560857600,3560865791,SA -3560865792,3560882175,FR -3560882176,3560890367,DE -3560890368,3560898559,NO -3560898560,3560906751,FI -3560906752,3560923135,DE -3560923136,3560931327,ES -3560931328,3560939535,DE -3560939536,3560939539,PT -3560939540,3560939543,IT -3560939544,3560939555,DE -3560939556,3560939559,ES -3560939560,3560939567,DE -3560939568,3560939571,NL -3560939572,3560939579,ES -3560939580,3560939583,BE -3560939584,3560939607,DE -3560939608,3560939611,IT -3560939612,3560939643,DE -3560939644,3560939647,BE -3560939648,3560939679,DE -3560939680,3560939683,IT -3560939684,3560939687,AT -3560939688,3560939691,ES -3560939692,3560939695,FR -3560939696,3560939719,DE -3560939720,3560939727,GR -3560939728,3560939735,NL -3560939736,3560939739,FR -3560939740,3560939743,DE -3560939744,3560939747,FR -3560939748,3560939751,DE -3560939752,3560939755,IT -3560939756,3560939759,DE -3560939760,3560939763,IT -3560939764,3560939767,DE -3560939768,3560939771,IE -3560939772,3560939775,CZ -3560939776,3560939779,BE -3560939780,3560939795,DE -3560939796,3560939799,GB -3560939800,3560939807,DE -3560939808,3560939811,FR -3560939812,3560939827,DE -3560939828,3560939831,FR -3560939832,3560939839,DE -3560939840,3560939843,GB -3560939844,3560939847,DE -3560939848,3560939851,BE -3560939852,3560939855,DE -3560939856,3560939859,FR -3560939860,3560939863,HU -3560939864,3560939867,ES -3560939868,3560939875,DE -3560939876,3560939879,CH -3560939880,3560939895,DE -3560939896,3560939899,ES -3560939900,3560939903,GB -3560939904,3560939907,BR -3560939908,3560939915,DE -3560939916,3560939919,ES -3560939920,3560939927,DE -3560939928,3560939931,NL -3560939932,3560939943,DE -3560939944,3560939951,FR -3560939952,3560939955,DE -3560939956,3560939959,AT -3560939960,3560939975,DE -3560939976,3560939979,BE -3560939980,3560939983,DE -3560939984,3560939987,FR -3560939988,3560939991,ES -3560939992,3560939995,IT -3560939996,3560939999,DE -3560940000,3560940007,ES -3560940008,3560940015,DE -3560940016,3560940019,BE -3560940020,3560940023,GB -3560940024,3560940027,GR -3560940028,3560940043,DE -3560940044,3560940047,GB -3560940048,3560940051,ES -3560940052,3560940055,BE -3560940056,3560940059,NL -3560940060,3560940063,LU -3560940064,3560940067,CH -3560940068,3560940071,FR -3560940072,3560940075,DE -3560940076,3560940079,ES -3560940080,3560940087,DE -3560940088,3560940091,IT -3560940092,3560940095,CH -3560940096,3560940099,DE -3560940100,3560940103,FR -3560940104,3560940115,DE -3560940116,3560940119,FR -3560940120,3560940123,GB -3560940124,3560940131,DE -3560940132,3560940135,IT -3560940136,3560940139,AT -3560940140,3560940147,DE -3560940148,3560940151,IT -3560940152,3560940155,FR -3560940156,3560940159,ES -3560940160,3560940163,IT -3560940164,3560940171,FR -3560940172,3560940179,DE -3560940180,3560940183,BE -3560940184,3560940187,FR -3560940188,3560940191,IT -3560940192,3560940195,AT -3560940196,3560940199,DE -3560940200,3560940203,CY -3560940204,3560940207,DE -3560940208,3560940211,ES -3560940212,3560940215,FR -3560940216,3560940219,IE -3560940220,3560940227,DE -3560940228,3560940231,CH -3560940232,3560940235,IT -3560940236,3560940239,DE -3560940240,3560940243,PT -3560940244,3560940247,GB -3560940248,3560940251,DE -3560940252,3560940255,CH -3560940256,3560940271,DE -3560940272,3560940275,GB -3560940276,3560940279,FR -3560940280,3560940283,AT -3560940284,3560940287,DE -3560940288,3560940291,FR -3560940292,3560940307,DE -3560940308,3560940311,BE -3560940312,3560940327,DE -3560940328,3560940331,ES -3560940332,3560940339,DE -3560940340,3560940343,CH -3560940344,3560940347,NL -3560940348,3560940367,DE -3560940368,3560940371,FR -3560940372,3560940379,CH -3560940380,3560940387,DE -3560940388,3560940391,ES -3560940392,3560940395,DE -3560940396,3560940399,IL -3560940400,3560940403,CH -3560940404,3560940407,DE -3560940408,3560940411,IT -3560940412,3560940419,DE -3560940420,3560940423,GR -3560940424,3560940431,DE -3560940432,3560940435,FR -3560940436,3560940439,DE -3560940440,3560940443,BE -3560940444,3560940447,SL -3560940448,3560940451,DE -3560940452,3560940455,NL -3560940456,3560940463,DE -3560940464,3560940467,CY -3560940468,3560940471,DE -3560940472,3560940475,FR -3560940476,3560940479,CH -3560940480,3560940487,ES -3560940488,3560940491,CZ -3560940492,3560940495,DE -3560940496,3560940499,IT -3560940500,3560940503,DE -3560940504,3560940507,GB -3560940508,3560940511,IT -3560940512,3560940523,DE -3560940524,3560940527,FR -3560940528,3560940531,DE -3560940532,3560940535,FR -3560940536,3560940539,HU -3560940540,3560940547,DE -3560940548,3560940551,IE -3560940552,3560940563,DE -3560940564,3560940567,GB -3560940568,3560940571,DE -3560940572,3560940575,DK -3560940576,3560940579,DE -3560940580,3560940583,IT -3560940584,3560940587,FR -3560940588,3560940591,IT -3560940592,3560940595,GR -3560940596,3560940599,CH -3560940600,3560940603,DE -3560940604,3560940607,GB -3560940608,3560940611,FR -3560940612,3560940619,DE -3560940620,3560940623,AT -3560940624,3560940627,SM -3560940628,3560940631,DE -3560940632,3560940635,AT -3560940636,3560940639,DE -3560940640,3560940647,GB -3560940648,3560940655,DE -3560940656,3560940663,IT -3560940664,3560940687,DE -3560940688,3560940691,IT -3560940692,3560940695,NO -3560940696,3560940699,FR -3560940700,3560940703,GB -3560940704,3560940707,ES -3560940708,3560940715,DE -3560940716,3560940719,ES -3560940720,3560940727,DE -3560940728,3560940731,FR -3560940732,3560940735,DE -3560940736,3560940739,DK -3560940740,3560940743,IT -3560940744,3560940751,DE -3560940752,3560940755,IE -3560940756,3560940763,FR -3560940764,3560940767,CH -3560940768,3560940779,DE -3560940780,3560940783,IT -3560940784,3560940787,NL -3560940788,3560940791,GB -3560940792,3560940799,ES -3560940800,3560940803,DE -3560940804,3560940807,GB -3560940808,3560940811,IT -3560940812,3560940815,DE -3560940816,3560940819,FR -3560940820,3560940823,NL -3560940824,3560940827,IT -3560940828,3560940831,ES -3560940832,3560940839,DE -3560940840,3560940843,IT -3560940844,3560940851,ES -3560940852,3560940863,DE -3560940864,3560940867,IT -3560940868,3560940879,DE -3560940880,3560940883,IT -3560940884,3560940887,NL -3560940888,3560940891,LU -3560940892,3560940899,DE -3560940900,3560940903,NL -3560940904,3560940907,DE -3560940908,3560940915,GB -3560940916,3560940923,DE -3560940924,3560940927,ES -3560940928,3560940931,GR -3560940932,3560940935,CH -3560940936,3560940955,DE -3560940956,3560940963,NL -3560940964,3560940967,DE -3560940968,3560940971,NL -3560940972,3560940979,DE -3560940980,3560940983,LU -3560940984,3560940987,IT -3560940988,3560940999,DE -3560941000,3560941003,ES -3560941004,3560941019,DE -3560941020,3560941023,IT -3560941024,3560941027,FR -3560941028,3560941047,DE -3560941048,3560941051,GR -3560941052,3560941059,FR -3560941060,3560941067,DE -3560941068,3560941071,FR -3560941072,3560941075,NL -3560941076,3560941079,GB -3560941080,3560941083,BE -3560941084,3560941087,IT -3560941088,3560941091,DE -3560941092,3560941095,BE -3560941096,3560941099,AT -3560941100,3560941103,DE -3560941104,3560941107,FR -3560941108,3560941119,DE -3560941120,3560941123,BE -3560941124,3560941127,FR -3560941128,3560941131,DE -3560941132,3560941135,GB -3560941136,3560941147,DE -3560941148,3560941151,IT -3560941152,3560941155,DE -3560941156,3560941159,ES -3560941160,3560941175,DE -3560941176,3560941179,ES -3560941180,3560941183,GB -3560941184,3560941187,IT -3560941188,3560941191,ES -3560941192,3560941195,DE -3560941196,3560941199,FR -3560941200,3560941203,DE -3560941204,3560941207,IT -3560941208,3560941215,DE -3560941216,3560941219,NL -3560941220,3560941223,GB -3560941224,3560941227,DE -3560941228,3560941231,SE -3560941232,3560941235,FR -3560941236,3560941243,DE -3560941244,3560941251,IT -3560941252,3560941255,DE -3560941256,3560941259,AT -3560941260,3560941263,DE -3560941264,3560941271,ES -3560941272,3560941275,DE -3560941276,3560941279,GR -3560941280,3560941283,NL -3560941284,3560941287,DE -3560941288,3560941291,ES -3560941292,3560941295,DE -3560941296,3560941303,IT -3560941304,3560941307,FR -3560941308,3560941315,DE -3560941316,3560941319,SE -3560941320,3560941327,DE -3560941328,3560941331,IT -3560941332,3560941335,PT -3560941336,3560941339,BE -3560941340,3560941343,GB -3560941344,3560941347,FR -3560941348,3560941351,IE -3560941352,3560941355,NL -3560941356,3560941359,ES -3560941360,3560941379,DE -3560941380,3560941383,CH -3560941384,3560941387,IE -3560941388,3560941391,SE -3560941392,3560941407,DE -3560941408,3560941411,CH -3560941412,3560941415,IT -3560941416,3560941419,DE -3560941420,3560941423,FR -3560941424,3560941427,DE -3560941428,3560941431,FR -3560941432,3560941443,DE -3560941444,3560941447,ES -3560941448,3560941451,DE -3560941452,3560941459,GB -3560941460,3560941467,DE -3560941468,3560941471,CH -3560941472,3560941475,BE -3560941476,3560941479,ES -3560941480,3560941483,DE -3560941484,3560941487,ES -3560941488,3560941491,DE -3560941492,3560941495,GB -3560941496,3560941507,DE -3560941508,3560941511,IT -3560941512,3560941515,AT -3560941516,3560941519,SE -3560941520,3560941523,NO -3560941524,3560941539,DE -3560941540,3560941543,FR -3560941544,3560941547,GB -3560941548,3560941551,DE -3560941552,3560941555,IT -3560941556,3560941559,DE -3560941560,3560941563,GB -3560941564,3560941567,GR -3560941568,3560941587,DE -3560941588,3560941591,ES -3560941592,3560941599,DE -3560941600,3560941603,FR -3560941604,3560941607,CH -3560941608,3560941611,GB -3560941612,3560941631,DE -3560941632,3560941635,NL -3560941636,3560941639,DE -3560941640,3560941643,GB -3560941644,3560941647,BE -3560941648,3560941651,NO -3560941652,3560941655,DE -3560941656,3560941659,GB -3560941660,3560941663,NL -3560941664,3560941671,DE -3560941672,3560941679,FR -3560941680,3560941683,GB -3560941684,3560941687,IT -3560941688,3560941691,DE -3560941692,3560941695,IT -3560941696,3560941699,FR -3560941700,3560941703,GB -3560941704,3560941711,DE -3560941712,3560941715,FR -3560941716,3560941723,DE -3560941724,3560941727,FR -3560941728,3560941735,DE -3560941736,3560941739,NL -3560941740,3560941743,NO -3560941744,3560941747,FR -3560941748,3560941751,ES -3560941752,3560941755,BE -3560941756,3560941771,DE -3560941772,3560941779,GB -3560941780,3560941783,DE -3560941784,3560941787,GB -3560941788,3560941791,DE -3560941792,3560941795,ES -3560941796,3560941799,FR -3560941800,3560941803,NL -3560941804,3560941807,ES -3560941808,3560941811,FR -3560941812,3560941815,NO -3560941816,3560941819,FR -3560941820,3560941823,NL -3560941824,3560941831,DE -3560941832,3560941835,GB -3560941836,3560941847,DE -3560941848,3560941851,BE -3560941852,3560941855,CH -3560941856,3560941859,BE -3560941860,3560941867,DE -3560941868,3560941871,AT -3560941872,3560941875,GB -3560941876,3560941879,NL -3560941880,3560941883,BG -3560941884,3560941887,DE -3560941888,3560941891,ES -3560941892,3560941895,DE -3560941896,3560941899,ES -3560941900,3560941903,DE -3560941904,3560941907,GB -3560941908,3560941915,DE -3560941916,3560941919,FR -3560941920,3560941959,DE -3560941960,3560941963,LU -3560941964,3560941967,FR -3560941968,3560941971,DE -3560941972,3560941975,DK -3560941976,3560941983,DE -3560941984,3560941987,NL -3560941988,3560941991,DE -3560941992,3560941995,GB -3560941996,3560941999,BE -3560942000,3560942003,FR -3560942004,3560942007,GB -3560942008,3560942011,IT -3560942012,3560942015,DE -3560942016,3560942019,NL -3560942020,3560942023,ES -3560942024,3560942027,CH -3560942028,3560942035,DE -3560942036,3560942039,GB -3560942040,3560942047,DE -3560942048,3560942051,IT -3560942052,3560942055,DE -3560942056,3560942059,IS -3560942060,3560942063,DE -3560942064,3560942067,ES -3560942068,3560942083,DE -3560942084,3560942087,FR -3560942088,3560942095,DE -3560942096,3560942099,FR -3560942100,3560942103,DE -3560942104,3560942107,NL -3560942108,3560942119,DE -3560942120,3560942123,AT -3560942124,3560942131,DE -3560942132,3560942135,ES -3560942136,3560942143,DE -3560942144,3560942147,GB -3560942148,3560942151,DE -3560942152,3560942155,IT -3560942156,3560942163,DE -3560942164,3560942171,ES -3560942172,3560942175,SE -3560942176,3560942179,DE -3560942180,3560942183,ES -3560942184,3560942191,DE -3560942192,3560942195,HU -3560942196,3560942199,ES -3560942200,3560942203,FR -3560942204,3560942211,DE -3560942212,3560942215,IT -3560942216,3560942219,DE -3560942220,3560942227,FR -3560942228,3560942231,IT -3560942232,3560942243,DE -3560942244,3560942247,IT -3560942248,3560942251,DE -3560942252,3560942255,GB -3560942256,3560942259,DE -3560942260,3560942263,ES -3560942264,3560942267,NL -3560942268,3560942271,DE -3560942272,3560942275,PL -3560942276,3560942279,IT -3560942280,3560942283,NL -3560942284,3560942287,DK -3560942288,3560942291,FR -3560942292,3560942295,BH -3560942296,3560942299,MA -3560942300,3560942307,DE -3560942308,3560942319,ES -3560942320,3560942323,DE -3560942324,3560942327,IT -3560942328,3560942335,PT -3560942336,3560942343,DE -3560942344,3560942347,FR -3560942348,3560942351,DE -3560942352,3560942355,ES -3560942356,3560942359,IT -3560942360,3560942363,AT -3560942364,3560942371,DE -3560942372,3560942375,FR -3560942376,3560942379,DE -3560942380,3560942383,GB -3560942384,3560942387,DE -3560942388,3560942391,IT -3560942392,3560942407,DE -3560942408,3560942411,GB -3560942412,3560942415,DE -3560942416,3560942419,IT -3560942420,3560942455,DE -3560942456,3560942459,ES -3560942460,3560942463,RU -3560942464,3560942467,BE -3560942468,3560942471,ES -3560942472,3560942475,DE -3560942476,3560942479,CH -3560942480,3560942483,ES -3560942484,3560942487,HU -3560942488,3560942495,FR -3560942496,3560942503,DE -3560942504,3560942511,ES -3560942512,3560942523,DE -3560942524,3560942527,NL -3560942528,3560942555,DE -3560942556,3560942559,FR -3560942560,3560942563,IT -3560942564,3560942567,ES -3560942568,3560942575,DE -3560942576,3560942579,FR -3560942580,3560942583,DE -3560942584,3560942587,GB -3560942588,3560942590,ES -3560942591,3560942619,DE -3560942620,3560942623,BE -3560942624,3560942627,IT -3560942628,3560942631,GB -3560942632,3560942635,FR -3560942636,3560942643,DE -3560942644,3560942647,FR -3560942648,3560942651,DE -3560942652,3560942655,GR -3560942656,3560942663,ES -3560942664,3560942667,NL -3560942668,3560942671,DE -3560942672,3560942675,IT -3560942676,3560942679,BE -3560942680,3560942691,DE -3560942692,3560942695,LU -3560942696,3560942699,DE -3560942700,3560942703,ES -3560942704,3560942707,DE -3560942708,3560942711,IT -3560942712,3560942715,LU -3560942716,3560942719,BE -3560942720,3560942723,DE -3560942724,3560942727,IT -3560942728,3560942731,GB -3560942732,3560942735,DE -3560942736,3560942739,CH -3560942740,3560942743,ES -3560942744,3560942751,GB -3560942752,3560942763,DE -3560942764,3560942767,FR -3560942768,3560942779,DE -3560942780,3560942783,CH -3560942784,3560942787,DE -3560942788,3560942791,HU -3560942792,3560942795,DE -3560942796,3560942799,FR -3560942800,3560942807,DE -3560942808,3560942811,AT -3560942812,3560942815,FR -3560942816,3560942819,DE -3560942820,3560942823,ES -3560942824,3560942827,GB -3560942828,3560942831,AT -3560942832,3560942835,IT -3560942836,3560942843,DE -3560942844,3560942847,ES -3560942848,3560942851,IT -3560942852,3560942855,ES -3560942856,3560942879,DE -3560942880,3560942883,GB -3560942884,3560942887,DE -3560942888,3560942891,FR -3560942892,3560942895,DE -3560942896,3560942899,ES -3560942900,3560942903,DE -3560942904,3560942907,CH -3560942908,3560942915,DE -3560942916,3560942919,BE -3560942920,3560942923,DE -3560942924,3560942927,IT -3560942928,3560942931,SE -3560942932,3560942935,AT -3560942936,3560942939,DE -3560942940,3560942943,AE -3560942944,3560942951,DE -3560942952,3560942955,ES -3560942956,3560942959,DE -3560942960,3560942963,GB -3560942964,3560942983,DE -3560942984,3560942987,BE -3560942988,3560942991,DE -3560942992,3560942999,IT -3560943000,3560943003,DE -3560943004,3560943007,DK -3560943008,3560943011,CH -3560943012,3560943015,IT -3560943016,3560943019,ES -3560943020,3560943023,DE -3560943024,3560943027,GR -3560943028,3560943031,DE -3560943032,3560943035,FR -3560943036,3560943039,PL -3560943040,3560943043,NO -3560943044,3560943047,DE -3560943048,3560943051,HR -3560943052,3560943055,CY -3560943056,3560943059,BE -3560943060,3560943075,DE -3560943076,3560943079,ES -3560943080,3560943110,DE -3560943111,3560943111,ES -3560943112,3560943114,DE -3560943115,3560943115,ES -3560943116,3560943116,DK -3560943117,3560943117,IL -3560943118,3560943121,DE -3560943122,3560943122,ES -3560943123,3560943125,DE -3560943126,3560943126,FR -3560943127,3560943129,DE -3560943130,3560943130,BE -3560943131,3560943131,RU -3560943132,3560943132,BE -3560943133,3560943133,ES -3560943134,3560943136,DE -3560943137,3560943137,ES -3560943138,3560943138,CH -3560943139,3560943139,DE -3560943140,3560943140,ES -3560943141,3560943142,DE -3560943143,3560943145,HU -3560943146,3560943149,DE -3560943150,3560943150,ES -3560943151,3560943151,DE -3560943152,3560943152,HU -3560943153,3560943154,DE -3560943155,3560943155,FR -3560943156,3560943157,DE -3560943158,3560943158,FR -3560943159,3560943161,DE -3560943162,3560943162,GR -3560943163,3560943163,DE -3560943164,3560943164,PL -3560943165,3560943165,DE -3560943166,3560943166,GB -3560943167,3560943167,FR -3560943168,3560943168,ES -3560943169,3560943169,DE -3560943170,3560943170,ES -3560943171,3560943171,IT -3560943172,3560943172,ES -3560943173,3560943173,BE -3560943174,3560943176,DE -3560943177,3560943177,CH -3560943178,3560943178,DE -3560943179,3560943179,PL -3560943180,3560943180,GB -3560943181,3560943181,DE -3560943182,3560943183,ES -3560943184,3560943184,IT -3560943185,3560943185,DE -3560943186,3560943186,ES -3560943187,3560943187,PT -3560943188,3560943192,DE -3560943193,3560943193,ES -3560943194,3560943195,DE -3560943196,3560943197,IT -3560943198,3560943198,DE -3560943199,3560943199,PT -3560943200,3560943200,DE -3560943201,3560943201,IT -3560943202,3560943202,IL -3560943203,3560943204,DE -3560943205,3560943205,IT -3560943206,3560943207,DE -3560943208,3560943208,AT -3560943209,3560943210,ES -3560943211,3560943211,FR -3560943212,3560943212,DE -3560943213,3560943213,FR -3560943214,3560943214,PL -3560943215,3560943221,DE -3560943222,3560943222,ES -3560943223,3560943223,FR -3560943224,3560943224,DE -3560943225,3560943226,GR -3560943227,3560943227,DE -3560943228,3560943230,NL -3560943231,3560943231,FR -3560943232,3560943232,DE -3560943233,3560943233,PL -3560943234,3560943234,EE -3560943235,3560943235,CH -3560943236,3560943236,NL -3560943237,3560943238,DE -3560943239,3560943239,FR -3560943240,3560943240,GB -3560943241,3560943241,FR -3560943242,3560943243,DE -3560943244,3560943244,PL -3560943245,3560943245,CH -3560943246,3560943247,DE -3560943248,3560943248,GR -3560943249,3560943249,CH -3560943250,3560943250,AT -3560943251,3560943251,GB -3560943252,3560943252,BE -3560943253,3560943253,DE -3560943254,3560943254,ES -3560943255,3560943255,GB -3560943256,3560943256,DE -3560943257,3560943257,ES -3560943258,3560943259,DE -3560943260,3560943260,ES -3560943261,3560943261,IE -3560943262,3560943262,DE -3560943263,3560943263,IT -3560943264,3560943264,CZ -3560943265,3560943267,DE -3560943268,3560943268,IT -3560943269,3560943269,DE -3560943270,3560943270,GB -3560943271,3560943271,IT -3560943272,3560943272,ES -3560943273,3560943273,FR -3560943274,3560943274,GB -3560943275,3560943275,DE -3560943276,3560943276,FR -3560943277,3560943277,IT -3560943278,3560943278,DE -3560943279,3560943279,FR -3560943280,3560943282,DE -3560943283,3560943283,ES -3560943284,3560943286,DE -3560943287,3560943287,NL -3560943288,3560943290,FR -3560943291,3560943291,IT -3560943292,3560943296,DE -3560943297,3560943297,ES -3560943298,3560943298,FR -3560943299,3560943299,GB -3560943300,3560943300,DE -3560943301,3560943301,FR -3560943302,3560943302,ES -3560943303,3560943303,IT -3560943304,3560943304,FR -3560943305,3560943310,DE -3560943311,3560943311,IT -3560943312,3560943312,PL -3560943313,3560943313,DE -3560943314,3560943314,ES -3560943315,3560943315,IT -3560943316,3560943316,DE -3560943317,3560943317,IT -3560943318,3560943318,CH -3560943319,3560943322,DE -3560943323,3560943323,NL -3560943324,3560943324,DE -3560943325,3560943325,CH -3560943326,3560943326,RU -3560943327,3560943330,DE -3560943331,3560943331,IT -3560943332,3560943335,DE -3560943336,3560943336,ES -3560943337,3560943337,IT -3560943338,3560943338,BE -3560943339,3560943339,NL -3560943340,3560943341,DE -3560943342,3560943342,ES -3560943343,3560943343,FR -3560943344,3560943344,NL -3560943345,3560943345,DE -3560943346,3560943346,IT -3560943347,3560943347,ES -3560943348,3560943348,FR -3560943349,3560943349,DE -3560943350,3560943350,BE -3560943351,3560943351,SE -3560943352,3560943352,IT -3560943353,3560943354,DE -3560943355,3560943355,IT -3560943356,3560943357,DE -3560943358,3560943358,BE -3560943359,3560943361,DE -3560943362,3560943362,GB -3560943363,3560943366,DE -3560943367,3560943367,IT -3560943368,3560943368,DE -3560943369,3560943369,GR -3560943370,3560943371,DE -3560943372,3560943372,FR -3560943373,3560943375,DE -3560943376,3560943376,ES -3560943377,3560943377,GB -3560943378,3560943378,DE -3560943379,3560943379,ES -3560943380,3560943383,DE -3560943384,3560943384,FR -3560943385,3560943385,ES -3560943386,3560943386,CH -3560943387,3560943387,GB -3560943388,3560943391,DE -3560943392,3560943392,GB -3560943393,3560943394,DE -3560943395,3560943395,NL -3560943396,3560943397,DE -3560943398,3560943398,BE -3560943399,3560943399,DE -3560943400,3560943400,IT -3560943401,3560943401,DE -3560943402,3560943402,NL -3560943403,3560943403,DE -3560943404,3560943404,BE -3560943405,3560943405,DE -3560943406,3560943407,ES -3560943408,3560943408,IT -3560943409,3560943409,ES -3560943410,3560943410,NL -3560943411,3560943411,DE -3560943412,3560943412,IT -3560943413,3560943413,ES -3560943414,3560943415,DE -3560943416,3560943416,FR -3560943417,3560943417,DE -3560943418,3560943418,GB -3560943419,3560943419,FR -3560943420,3560943420,DE -3560943421,3560943421,HU -3560943422,3560943422,DE -3560943423,3560943423,FR -3560943424,3560943424,DE -3560943425,3560943425,ES -3560943426,3560943426,IT -3560943427,3560943427,FR -3560943428,3560943428,NO -3560943429,3560943430,NL -3560943431,3560943435,DE -3560943436,3560943436,FR -3560943437,3560943437,ES -3560943438,3560943438,FR -3560943439,3560943439,NO -3560943440,3560943440,FR -3560943441,3560943441,DE -3560943442,3560943442,ES -3560943443,3560943443,BE -3560943444,3560943446,DE -3560943447,3560943447,GB -3560943448,3560943450,DE -3560943451,3560943451,PL -3560943452,3560943452,GB -3560943453,3560943454,DE -3560943455,3560943456,GB -3560943457,3560943457,ES -3560943458,3560943459,IT -3560943460,3560943460,ES -3560943461,3560943461,CH -3560943462,3560943462,FR -3560943463,3560943463,NL -3560943464,3560943464,ES -3560943465,3560943465,FR -3560943466,3560943466,NO -3560943467,3560943467,IT -3560943468,3560943468,CH -3560943469,3560943469,IT -3560943470,3560943471,DE -3560943472,3560943472,BE -3560943473,3560943473,AT -3560943474,3560943474,CH -3560943475,3560943475,DE -3560943476,3560943476,BE -3560943477,3560943477,DE -3560943478,3560943478,IT -3560943479,3560943479,GB -3560943480,3560943480,NL -3560943481,3560943481,BG -3560943482,3560943482,DE -3560943483,3560943486,ES -3560943487,3560943487,DE -3560943488,3560943488,ES -3560943489,3560943489,DE -3560943490,3560943490,GB -3560943491,3560943492,DE -3560943493,3560943493,FR -3560943494,3560943494,GB -3560943495,3560943495,IT -3560943496,3560943510,DE -3560943511,3560943511,IT -3560943512,3560943512,DE -3560943513,3560943513,LU -3560943514,3560943515,ES -3560943516,3560943519,DE -3560943520,3560943520,DK -3560943521,3560943521,DE -3560943522,3560943522,GB -3560943523,3560943524,DE -3560943525,3560943525,NL -3560943526,3560943526,IT -3560943527,3560943529,DE -3560943530,3560943530,CH -3560943531,3560943533,DE -3560943534,3560943534,BY -3560943535,3560943535,FR -3560943536,3560943536,BE -3560943537,3560943537,DE -3560943538,3560943538,GB -3560943539,3560943539,DE -3560943540,3560943540,BE -3560943541,3560943541,NL -3560943542,3560943542,DE -3560943543,3560943543,NL -3560943544,3560943544,ES -3560943545,3560943546,DE -3560943547,3560943547,SI -3560943548,3560943548,GB -3560943549,3560943549,DE -3560943550,3560943550,HU -3560943551,3560943551,FR -3560943552,3560943553,DE -3560943554,3560943554,IS -3560943555,3560943555,FR -3560943556,3560943556,DE -3560943557,3560943557,ES -3560943558,3560943558,DE -3560943559,3560943559,GB -3560943560,3560943562,IT -3560943563,3560943563,HU -3560943564,3560943566,DE -3560943567,3560943567,FR -3560943568,3560943568,GB -3560943569,3560943570,FR -3560943571,3560943572,DE -3560943573,3560943573,FR -3560943574,3560943574,NO -3560943575,3560943575,DE -3560943576,3560943576,IT -3560943577,3560943577,DK -3560943578,3560943578,ES -3560943579,3560943580,DE -3560943581,3560943581,NL -3560943582,3560943582,DE -3560943583,3560943583,ES -3560943584,3560943584,IT -3560943585,3560943585,FR -3560943586,3560943586,ES -3560943587,3560943587,DE -3560943588,3560943588,IT -3560943589,3560943590,DE -3560943591,3560943591,AT -3560943592,3560943592,SK -3560943593,3560943593,PL -3560943594,3560943594,FR -3560943595,3560943596,ES -3560943597,3560943599,DE -3560943600,3560943600,AT -3560943601,3560943601,DE -3560943602,3560943602,IT -3560943603,3560943603,DE -3560943604,3560943604,ES -3560943605,3560943605,GB -3560943606,3560943607,DE -3560943608,3560943608,IT -3560943609,3560943610,DE -3560943611,3560943611,FR -3560943612,3560943612,DE -3560943613,3560943613,ES -3560943614,3560943618,DE -3560943619,3560943620,ES -3560943621,3560943621,SE -3560943622,3560943622,BE -3560943623,3560943623,DE -3560943624,3560943624,ES -3560943625,3560943625,DE -3560943626,3560943626,ES -3560943627,3560943627,DK -3560943628,3560943628,DE -3560943629,3560943629,IT -3560943630,3560943630,DE -3560943631,3560943631,HU -3560943632,3560943632,DE -3560943633,3560943633,ES -3560943634,3560943634,FR -3560943635,3560943636,DE -3560943637,3560943637,PL -3560943638,3560943638,DE -3560943639,3560943639,ES -3560943640,3560943640,FR -3560943641,3560943642,DE -3560943643,3560943643,IT -3560943644,3560943644,DE -3560943645,3560943645,GB -3560943646,3560943646,DE -3560943647,3560943647,ES -3560943648,3560943651,DE -3560943652,3560943652,AT -3560943653,3560943653,DE -3560943654,3560943654,IT -3560943655,3560943655,DE -3560943656,3560943656,IT -3560943657,3560943657,DE -3560943658,3560943658,GB -3560943659,3560943659,DE -3560943660,3560943660,PT -3560943661,3560943661,DK -3560943662,3560943662,DE -3560943663,3560943664,NL -3560943665,3560943666,DE -3560943667,3560943667,PL -3560943668,3560943668,DK -3560943669,3560943669,FR -3560943670,3560943671,DE -3560943672,3560943672,BH -3560943673,3560943673,SE -3560943674,3560943674,MA -3560943675,3560943675,FR -3560943676,3560943677,DE -3560943678,3560943680,ES -3560943681,3560943682,DE -3560943683,3560943683,GR -3560943684,3560943684,NL -3560943685,3560943685,IT -3560943686,3560943686,FR -3560943687,3560943687,PT -3560943688,3560943688,DE -3560943689,3560943689,PT -3560943690,3560943691,DE -3560943692,3560943692,SE -3560943693,3560943693,DE -3560943694,3560943694,FR -3560943695,3560943695,DE -3560943696,3560943697,CH -3560943698,3560943698,DE -3560943699,3560943699,IT -3560943700,3560943700,DE -3560943701,3560943701,AT -3560943702,3560943702,DE -3560943703,3560943703,FR -3560943704,3560943704,DE -3560943705,3560943705,CH -3560943706,3560943706,LI -3560943707,3560943709,DE -3560943710,3560943710,NL -3560943711,3560943711,DE -3560943712,3560943712,IT -3560943713,3560943713,PL -3560943714,3560943714,NL -3560943715,3560943715,DE -3560943716,3560943716,GB -3560943717,3560943717,FR -3560943718,3560943719,DE -3560943720,3560943721,IT -3560943722,3560943726,DE -3560943727,3560943727,ES -3560943728,3560943728,GB -3560943729,3560943729,DE -3560943730,3560943730,NL -3560943731,3560943731,IT -3560943732,3560943736,DE -3560943737,3560943737,GR -3560943738,3560943740,DE -3560943741,3560943741,FR -3560943742,3560943742,DE -3560943743,3560943743,PL -3560943744,3560943744,DE -3560943745,3560943745,PL -3560943746,3560943748,DE -3560943749,3560943749,GB -3560943750,3560943750,DE -3560943751,3560943751,IT -3560943752,3560943752,DE -3560943753,3560943753,ES -3560943754,3560943754,HU -3560943755,3560943755,BE -3560943756,3560943756,IT -3560943757,3560943757,DE -3560943758,3560943758,CZ -3560943759,3560943759,IE -3560943760,3560943760,NO -3560943761,3560943761,DE -3560943762,3560943762,IT -3560943763,3560943763,FR -3560943764,3560943764,DE -3560943765,3560943765,SE -3560943766,3560943766,CY -3560943767,3560943768,DE -3560943769,3560943769,FR -3560943770,3560943770,NL -3560943771,3560943771,IT -3560943772,3560943774,DE -3560943775,3560943775,FR -3560943776,3560943780,DE -3560943781,3560943781,ES -3560943782,3560943782,DE -3560943783,3560943783,BE -3560943784,3560943788,DE -3560943789,3560943789,IT -3560943790,3560943790,DE -3560943791,3560943791,IT -3560943792,3560943793,DE -3560943794,3560943794,FR -3560943795,3560943795,DE -3560943796,3560943796,IT -3560943797,3560943800,DE -3560943801,3560943801,FR -3560943802,3560943802,IT -3560943803,3560943803,DE -3560943804,3560943804,ES -3560943805,3560943805,DE -3560943806,3560943806,ES -3560943807,3560943810,DE -3560943811,3560943811,ES -3560943812,3560943812,IT -3560943813,3560943813,CH -3560943814,3560943816,DE -3560943817,3560943817,FR -3560943818,3560943818,PT -3560943819,3560943819,DE -3560943820,3560943820,FR -3560943821,3560943821,IT -3560943822,3560943822,DE -3560943823,3560943823,GR -3560943824,3560943827,DE -3560943828,3560943828,ES -3560943829,3560943829,NL -3560943830,3560943830,DE -3560943831,3560943831,FR -3560943832,3560943832,DE -3560943833,3560943833,FR -3560943834,3560943836,DE -3560943837,3560943837,CH -3560943838,3560943840,DE -3560943841,3560943841,GB -3560943842,3560943842,DE -3560943843,3560943843,GB -3560943844,3560943844,DE -3560943845,3560943845,CZ -3560943846,3560943847,DE -3560943848,3560943848,FR -3560943849,3560943849,DE -3560943850,3560943850,NL -3560943851,3560943857,DE -3560943858,3560943858,GB -3560943859,3560943859,DE -3560943860,3560943860,GB -3560943861,3560943865,DE -3560943866,3560943866,BE -3560943867,3560943868,DE -3560943869,3560943869,LU -3560943870,3560943871,DE -3560943872,3560943875,BR -3560943876,3560943879,DE -3560943880,3560943887,US -3560943888,3560943891,CA -3560943892,3560943895,DE -3560943896,3560943899,CL -3560943900,3560943903,DE -3560943904,3560943915,US -3560943916,3560943919,CA -3560943920,3560943923,US -3560943924,3560943927,MX -3560943928,3560943935,US -3560943936,3560943939,PE -3560943940,3560943943,DE -3560943944,3560943947,US -3560943948,3560943975,DE -3560943976,3560943979,US -3560943980,3560943983,DE -3560943984,3560943987,US -3560943988,3560943991,DE -3560943992,3560943999,US -3560944000,3560944023,DE -3560944024,3560944031,US -3560944032,3560944035,MX -3560944036,3560944039,US -3560944040,3560944043,MX -3560944044,3560944059,DE -3560944060,3560944063,US -3560944064,3560944067,DE -3560944068,3560944071,US -3560944072,3560944079,DE -3560944080,3560944083,US -3560944084,3560944087,CL -3560944088,3560944103,DE -3560944104,3560944107,US -3560944108,3560944119,DE -3560944120,3560944135,US -3560944136,3560944139,DE -3560944140,3560944143,US -3560944144,3560944147,DE -3560944148,3560944159,US -3560944160,3560944163,MX -3560944164,3560944167,AR -3560944168,3560944175,US -3560944176,3560944179,BR -3560944180,3560944183,PA -3560944184,3560944187,US -3560944188,3560944191,CA -3560944192,3560944195,US -3560944196,3560944199,DE -3560944200,3560944203,BO -3560944204,3560944207,DE -3560944208,3560944211,CA -3560944212,3560944215,DE -3560944216,3560944219,BR -3560944220,3560944227,US -3560944228,3560944231,IT -3560944232,3560944235,US -3560944236,3560944239,CA -3560944240,3560944243,US -3560944244,3560944247,MX -3560944248,3560944267,US -3560944268,3560944271,CO -3560944272,3560944275,BR -3560944276,3560944279,PE -3560944280,3560944283,DE -3560944284,3560944295,US -3560944296,3560944299,CO -3560944300,3560944307,US -3560944308,3560944311,MX -3560944312,3560944315,US -3560944316,3560944323,AR -3560944324,3560944339,US -3560944340,3560944343,CO -3560944344,3560944351,US -3560944352,3560944355,GT -3560944356,3560944359,CA -3560944360,3560944363,DO -3560944364,3560944367,AR -3560944368,3560944371,BR -3560944372,3560944375,DE -3560944376,3560944379,AR -3560944380,3560944383,DE -3560944384,3560944395,US -3560944396,3560944399,PR -3560944400,3560944403,CA -3560944404,3560944411,DE -3560944412,3560944415,US -3560944416,3560944419,SG -3560944420,3560944431,US -3560944432,3560944435,DE -3560944436,3560944447,US -3560944448,3560944451,DE -3560944452,3560944459,US -3560944460,3560944460,AR -3560944461,3560944463,DE -3560944464,3560944467,CA -3560944468,3560944471,BR -3560944472,3560944475,US -3560944476,3560944479,AR -3560944480,3560944487,US -3560944488,3560944491,CA -3560944492,3560944519,US -3560944520,3560944523,DE -3560944524,3560944531,US -3560944532,3560944535,MX -3560944536,3560944551,US -3560944552,3560944555,BR -3560944556,3560944559,MX -3560944560,3560944563,US -3560944564,3560944567,ES -3560944568,3560944575,US -3560944576,3560944579,BR -3560944580,3560944603,US -3560944604,3560944607,CA -3560944608,3560944615,US -3560944616,3560944619,EC -3560944620,3560944623,US -3560944624,3560944627,CL -3560944628,3560944631,DE -3560944632,3560944635,CA -3560944636,3560944779,DE -3560944780,3560944783,ES -3560944784,3560944787,FR -3560944788,3560944791,NL -3560944792,3560944795,ES -3560944796,3560944799,GB -3560944800,3560944803,ES -3560944804,3560944807,FR -3560944808,3560944811,DE -3560944812,3560944815,ES -3560944816,3560944823,IT -3560944824,3560944827,DE -3560944828,3560944831,IE -3560944832,3560944835,DE -3560944836,3560944839,IT -3560944840,3560944847,DE -3560944848,3560944855,FR -3560944856,3560944859,NL -3560944860,3560944863,DE -3560944864,3560944871,FR -3560944872,3560944875,DE -3560944876,3560944879,ES -3560944880,3560944883,DE -3560944884,3560944887,ES -3560944888,3560944891,CH -3560944892,3560944899,DE -3560944900,3560944903,SG -3560944904,3560944907,MY -3560944908,3560944915,DE -3560944916,3560944919,SG -3560944920,3560944923,DE -3560944924,3560944927,CN -3560944928,3560944931,DE -3560944932,3560944935,SG -3560944936,3560944943,CN -3560944944,3560944947,MY -3560944948,3560944963,DE -3560944964,3560944967,MY -3560944968,3560944971,SG -3560944972,3560944975,CN -3560944976,3560944979,IN -3560944980,3560944983,DE -3560944984,3560944987,IN -3560944988,3560944991,SG -3560944992,3560944995,MY -3560944996,3560944999,SG -3560945000,3560945003,MY -3560945004,3560945007,DE -3560945008,3560945011,SG -3560945012,3560945019,DE -3560945020,3560945023,IN -3560945024,3560945027,DE -3560945028,3560945031,MY -3560945032,3560945035,IN -3560945036,3560945039,CN -3560945040,3560945043,SG -3560945044,3560945047,TW -3560945048,3560945059,DE -3560945060,3560945063,SG -3560945064,3560945067,MY -3560945068,3560945075,IN -3560945076,3560945091,DE -3560945092,3560945095,SG -3560945096,3560945099,CN -3560945100,3560945103,SG -3560945104,3560945107,MY -3560945108,3560945111,DE -3560945112,3560945115,SG -3560945116,3560945119,IN -3560945120,3560945123,CN -3560945124,3560945131,SG -3560945132,3560945135,TW -3560945136,3560945139,MY -3560945140,3560945143,SG -3560945144,3560945147,IN -3560945148,3560945151,SG -3560945152,3560945279,DE -3560945280,3560945295,JP -3560945296,3560945299,DE -3560945300,3560945311,JP -3560945312,3560945315,DE -3560945316,3560945323,JP -3560945324,3560945327,DE -3560945328,3560945331,JP -3560945332,3560945335,DE -3560945336,3560945339,JP -3560945340,3560945343,DE -3560945344,3560945351,JP -3560945352,3560945355,DE -3560945356,3560945359,TH -3560945360,3560945379,JP -3560945380,3560945387,DE -3560945388,3560945403,JP -3560945404,3560945409,DE -3560945410,3560945410,MY -3560945411,3560945411,DE -3560945412,3560945412,CN -3560945413,3560945413,SG -3560945414,3560945414,IN -3560945415,3560945416,SG -3560945417,3560945417,DE -3560945418,3560945418,CN -3560945419,3560945419,MY -3560945420,3560945420,DE -3560945421,3560945422,SG -3560945423,3560945423,CN -3560945424,3560945424,MY -3560945425,3560945425,IN -3560945426,3560945426,MY -3560945427,3560945430,DE -3560945431,3560945431,CN -3560945432,3560945433,IN -3560945434,3560945434,TW -3560945435,3560945435,DE -3560945436,3560945436,CN -3560945437,3560945437,SG -3560945438,3560945438,TW -3560945439,3560945439,SG -3560945440,3560945440,ID -3560945441,3560945441,SG -3560945442,3560945442,DE -3560945443,3560945443,IN -3560945444,3560945447,SG -3560945448,3560945449,DE -3560945450,3560945450,SG -3560945451,3560945451,IN -3560945452,3560945453,DE -3560945454,3560945458,SG -3560945459,3560945459,TW -3560945460,3560945460,SG -3560945461,3560945461,DE -3560945462,3560945462,IN -3560945463,3560945465,SG -3560945466,3560945466,CN -3560945467,3560945467,MY -3560945468,3560945469,SG -3560945470,3560945470,CN -3560945471,3560945471,SG -3560945472,3560945472,CN -3560945473,3560945473,TW -3560945474,3560945475,SG -3560945476,3560945476,CN -3560945477,3560945477,TW -3560945478,3560945478,DE -3560945479,3560945479,SG -3560945480,3560945480,IN -3560945481,3560945482,DE -3560945483,3560945485,MY -3560945486,3560945486,IN -3560945487,3560945488,DE -3560945489,3560945489,MY -3560945490,3560945490,TH -3560945491,3560945491,IN -3560945492,3560945495,DE -3560945496,3560945496,IN -3560945497,3560945499,DE -3560945500,3560945500,SG -3560945501,3560945501,DE -3560945502,3560945502,IN -3560945503,3560945539,DE -3560945540,3560945543,SG -3560945544,3560945551,IN -3560945552,3560945563,DE -3560945564,3560945567,SG -3560945568,3560945575,DE -3560945576,3560945579,SG -3560945580,3560945583,MY -3560945584,3560945587,SG -3560945588,3560945591,TW -3560945592,3560945595,SG -3560945596,3560945599,DE -3560945600,3560945603,SG -3560945604,3560945611,DE -3560945612,3560945619,SG -3560945620,3560945627,CN -3560945628,3560945635,SG -3560945636,3560945639,DE -3560945640,3560945643,SG -3560945644,3560945647,MY -3560945648,3560945651,IN -3560945652,3560945659,DE -3560945660,3560945663,IN -3560945664,3560945667,US -3560945668,3560945671,BR -3560945672,3560945675,US -3560945676,3560945679,PE -3560945680,3560945683,BR -3560945684,3560945691,CO -3560945692,3560945699,US -3560945700,3560945703,CO -3560945704,3560945707,US -3560945708,3560945711,CO -3560945712,3560945727,US -3560945728,3560945731,AR -3560945732,3560945739,US -3560945740,3560945743,BR -3560945744,3560945747,US -3560945748,3560945751,AR -3560945752,3560945763,US -3560945764,3560945767,AR -3560945768,3560945771,BR -3560945772,3560945775,CA -3560945776,3560945787,US -3560945788,3560945791,CO -3560945792,3560945795,AR -3560945796,3560945799,US -3560945800,3560945803,BR -3560945804,3560945807,US -3560945808,3560945811,CO -3560945812,3560945815,US -3560945816,3560945819,AR -3560945820,3560945823,US -3560945824,3560945827,BR -3560945828,3560945835,US -3560945836,3560945839,CL -3560945840,3560945843,BR -3560945844,3560945851,US -3560945852,3560945855,DE -3560945856,3560945859,US -3560945860,3560945863,DE -3560945864,3560945867,US -3560945868,3560945871,DE -3560945872,3560945875,CA -3560945876,3560945911,US -3560945912,3560945915,CA -3560945916,3560945919,US -3560945920,3560946017,DE -3560946018,3560946018,FI -3560946019,3560946019,CZ -3560946020,3560946176,DE -3560946177,3560946189,US -3560946190,3560946190,AR -3560946191,3560946194,US -3560946195,3560946195,PE -3560946196,3560946196,CA -3560946197,3560946197,US -3560946198,3560946198,CA -3560946199,3560946199,AR -3560946200,3560946200,US -3560946201,3560946201,CA -3560946202,3560946202,DE -3560946203,3560946203,CA -3560946204,3560946204,US -3560946205,3560946205,PE -3560946206,3560946208,US -3560946209,3560946209,CA -3560946210,3560946212,US -3560946213,3560946213,CO -3560946214,3560946214,CA -3560946215,3560946215,PE -3560946216,3560946216,DE -3560946217,3560946229,US -3560946230,3560946230,AR -3560946231,3560946231,US -3560946232,3560946232,CA -3560946233,3560946234,US -3560946235,3560946235,CL -3560946236,3560946237,US -3560946238,3560946238,AR -3560946239,3560946253,US -3560946254,3560946254,SG -3560946255,3560946256,US -3560946257,3560946257,MX -3560946258,3560946259,US -3560946260,3560946260,AR -3560946261,3560946262,US -3560946263,3560946263,AR -3560946264,3560946266,US -3560946267,3560946267,CA -3560946268,3560946271,US -3560946272,3560946272,DE -3560946273,3560946273,CA -3560946274,3560946279,US -3560946280,3560946280,ES -3560946281,3560946282,US -3560946283,3560946283,CL -3560946284,3560946284,US -3560946285,3560946285,CO -3560946286,3560946290,US -3560946291,3560946291,CA -3560946292,3560946295,US -3560946296,3560946296,CL -3560946297,3560946297,DE -3560946298,3560946298,US -3560946299,3560946299,DE -3560946300,3560946300,CL -3560946301,3560946311,DE -3560946312,3560946312,US -3560946313,3560946317,DE -3560946318,3560946319,US -3560946320,3560946320,DE -3560946321,3560946326,US -3560946327,3560946327,CA -3560946328,3560946328,US -3560946329,3560946329,DO -3560946330,3560946330,US -3560946331,3560946331,DO -3560946332,3560946333,CA -3560946334,3560946335,US -3560946336,3560946336,CA -3560946337,3560946337,DE -3560946338,3560946338,CA -3560946339,3560946339,US -3560946340,3560946340,CL -3560946341,3560946342,CA -3560946343,3560946343,DO -3560946344,3560946344,AR -3560946345,3560946345,US -3560946346,3560946346,PE -3560946347,3560946347,US -3560946348,3560946361,DE -3560946362,3560946363,US -3560946364,3560946367,DE -3560946368,3560946368,US -3560946369,3560946372,DE -3560946373,3560946373,US -3560946374,3560946374,DE -3560946375,3560946375,US -3560946376,3560946398,DE -3560946399,3560946399,US -3560946400,3560946408,DE -3560946409,3560946409,US -3560946410,3560946419,DE -3560946420,3560946420,US -3560946421,3560946431,DE -3560946432,3560946443,US -3560946444,3560946447,BR -3560946448,3560946451,DE -3560946452,3560946455,BO -3560946456,3560946467,US -3560946468,3560946471,BR -3560946472,3560946483,US -3560946484,3560946487,MX -3560946488,3560946491,US -3560946492,3560946495,BR -3560946496,3560946499,VE -3560946500,3560946503,AR -3560946504,3560946507,US -3560946508,3560946511,MX -3560946512,3560946523,US -3560946524,3560946527,MX -3560946528,3560946531,US -3560946532,3560946535,CA -3560946536,3560946539,PE -3560946540,3560946543,US -3560946544,3560946547,CA -3560946548,3560946551,US -3560946552,3560946555,PE -3560946556,3560946559,US -3560946560,3560946563,BR -3560946564,3560946567,US -3560946568,3560946571,BR -3560946572,3560946579,US -3560946580,3560946583,CA -3560946584,3560946587,US -3560946588,3560946591,AR -3560946592,3560946603,US -3560946604,3560946607,AR -3560946608,3560946611,BR -3560946612,3560946623,US -3560946624,3560946635,MX -3560946636,3560946643,US -3560946644,3560946647,AR -3560946648,3560946651,MX -3560946652,3560946655,CL -3560946656,3560946659,BR -3560946660,3560946663,MX -3560946664,3560946667,US -3560946668,3560946671,MX -3560946672,3560946679,BR -3560946680,3560946687,US -3560946688,3560946689,DE -3560946690,3560946695,US -3560946696,3560946696,BR -3560946697,3560946698,US -3560946699,3560946700,DE -3560946701,3560946701,CO -3560946702,3560946706,US -3560946707,3560946707,VE -3560946708,3560946708,BR -3560946709,3560946710,VE -3560946711,3560946711,US -3560946712,3560946712,VE -3560946713,3560946714,US -3560946715,3560946715,CO -3560946716,3560946716,US -3560946717,3560946717,AR -3560946718,3560946718,US -3560946719,3560946720,BR -3560946721,3560946723,CO -3560946724,3560946724,MX -3560946725,3560946729,US -3560946730,3560946730,MX -3560946731,3560946733,US -3560946734,3560946734,PR -3560946735,3560946747,US -3560946748,3560946748,DE -3560946749,3560946760,US -3560946761,3560946761,DE -3560946762,3560946762,US -3560946763,3560946763,DE -3560946764,3560946767,US -3560946768,3560946768,CA -3560946769,3560946769,US -3560946770,3560946825,DE -3560946826,3560946826,US -3560946827,3560946835,DE -3560946836,3560946836,US -3560946837,3560946839,DE -3560946840,3560946840,US -3560946841,3560946943,DE -3560946944,3560946947,US -3560946948,3560946951,BR -3560946952,3560946955,MX -3560946956,3560946959,CO -3560946960,3560946963,MX -3560946964,3560946967,AR -3560946968,3560946979,US -3560946980,3560946987,DE -3560946988,3560946991,US -3560946992,3560946995,DE -3560946996,3560946999,UY -3560947000,3560947015,US -3560947016,3560947019,AR -3560947020,3560947027,US -3560947028,3560947031,CO -3560947032,3560947039,US -3560947040,3560947043,BR -3560947044,3560947067,US -3560947068,3560947071,AR -3560947072,3560947075,BR -3560947076,3560947095,US -3560947096,3560947099,MX -3560947100,3560947107,US -3560947108,3560947111,DE -3560947112,3560947123,US -3560947124,3560947127,CO -3560947128,3560947143,US -3560947144,3560947147,DE -3560947148,3560947159,US -3560947160,3560947163,PR -3560947164,3560947191,US -3560947192,3560947195,VE -3560947196,3560947199,DE -3560947200,3560947203,CA -3560947204,3560947207,US -3560947208,3560947211,DE -3560947212,3560947231,US -3560947232,3560947235,CA -3560947236,3560947239,CO -3560947240,3560947247,US -3560947248,3560947251,CA -3560947252,3560947267,US -3560947268,3560947271,CO -3560947272,3560947275,US -3560947276,3560947279,AR -3560947280,3560947283,MX -3560947284,3560947287,US -3560947288,3560947291,BR -3560947292,3560947331,US -3560947332,3560947335,MX -3560947336,3560947343,US -3560947344,3560947347,MX -3560947348,3560947351,CO -3560947352,3560947355,US -3560947356,3560947359,CW -3560947360,3560947363,US -3560947364,3560947367,HN -3560947368,3560947371,BR -3560947372,3560947375,CA -3560947376,3560947383,US -3560947384,3560947391,CO -3560947392,3560947395,MX -3560947396,3560947399,US -3560947400,3560947407,AR -3560947408,3560947411,US -3560947412,3560947415,AR -3560947416,3560947431,US -3560947432,3560947435,MX -3560947436,3560947439,DE -3560947440,3560947443,BR -3560947444,3560947455,US -3560947456,3560947463,DE -3560947464,3560947475,JP -3560947476,3560947507,DE -3560947508,3560947511,JP -3560947512,3560947523,DE -3560947524,3560947527,JP -3560947528,3560947535,DE -3560947536,3560947543,JP -3560947544,3560947551,DE -3560947552,3560947555,JP -3560947556,3560947559,DE -3560947560,3560947567,JP -3560947568,3560947571,DE -3560947572,3560947591,JP -3560947592,3560947603,DE -3560947604,3560947607,JP -3560947608,3560947623,DE -3560947624,3560947631,JP -3560947632,3560947655,DE -3560947656,3560947659,JP -3560947660,3560947667,DE -3560947668,3560947683,JP -3560947684,3560947687,DE -3560947688,3560947703,JP -3560947704,3560947707,DE -3560947708,3560947711,JP -3560947712,3560955903,SE -3560955904,3560964095,BE -3560964096,3560996863,CN -3560996864,3561005055,GB -3561005056,3561013247,ES -3561013248,3561021439,TR -3561021440,3561022463,DE -3561022464,3561022975,AT -3561022976,3561037823,DE -3561037824,3561046015,BE -3561046016,3561054207,RU -3561054208,3561062399,MT -3561062400,3561070591,TR -3561070592,3561078783,CH -3561078784,3561095167,CZ -3561095168,3561103359,DE -3561103360,3561111551,UA -3561111552,3561119743,LU -3561119744,3561127935,IT -3561127936,3561136127,DE -3561136128,3561144319,ES -3561144320,3561152511,FI -3561152512,3561160703,IT -3561160704,3561168895,RU -3561168896,3561172991,FR -3561172992,3561177087,NO -3561177088,3561185279,CZ -3561185280,3561193471,GB -3561193472,3561201663,PL -3561201664,3561209855,NL -3561209856,3561218047,GB -3561218048,3561226239,AT -3561226240,3561234431,FI -3561234432,3561242623,TR -3561242624,3561259007,DE -3561259008,3561267199,IL -3561267200,3561275391,UA -3561275392,3561291775,BE -3561291776,3561297919,RS -3561297920,3561298943,ME -3561298944,3561299967,RS -3561299968,3561308159,GB -3561308160,3561316351,PL -3561316352,3561324543,RU -3561324544,3561325567,CZ -3561326592,3561328639,IT -3561328640,3561332735,US -3561332736,3561340927,AT -3561340928,3561357311,GB -3561357312,3561365503,DK -3561365504,3561373695,SA -3561373696,3561381887,GB -3561381888,3561390079,QA -3561390080,3561398271,BG -3561398272,3561406463,LV -3561406464,3561414655,GR -3561414656,3561422847,IT -3561422848,3561431039,BE -3561431040,3561439231,SA -3561439232,3561447423,NO -3561447424,3561455615,CH -3561455616,3561471999,CZ -3561472000,3561480191,DE -3561480192,3561488383,GB -3561488384,3561496575,OM -3561496576,3561498111,GB -3561498112,3561498367,DE -3561498368,3561498495,GB -3561498496,3561498559,NL -3561498560,3561498623,GB -3561498624,3561500671,NL -3561500672,3561502719,GB -3561502720,3561503743,NL -3561503744,3561504767,GB -3561504768,3561512959,DE -3561512960,3561521151,SI -3561521152,3561529343,GE -3561529344,3561536767,DE -3561536768,3561537023,PL -3561537024,3561537535,DE -3561537536,3561545727,BG -3561545728,3561553919,NL -3561553920,3561562111,SE -3561562112,3561570303,ES -3561570304,3561578495,AM -3561578496,3561586687,RU -3561586688,3561594879,BG -3561594880,3561603071,SE -3561603072,3561607167,FR -3561607168,3561607391,GB -3561607392,3561607423,FR -3561607424,3561607679,GB -3561607680,3561608191,FR -3561608192,3561609215,GB -3561609216,3561611263,FR -3561611264,3561611519,GB -3561611520,3561611775,FR -3561611776,3561612543,GB -3561612544,3561612799,FR -3561612800,3561613759,GB -3561613760,3561613823,FR -3561613824,3561614207,GB -3561614208,3561614335,FR -3561614336,3561614847,GB -3561614848,3561615103,FR -3561615104,3561615359,GB -3561615360,3561617407,FR -3561617408,3561618175,ES -3561618176,3561618431,IE -3561618432,3561618877,ES -3561618878,3561618878,PL -3561618879,3561619071,ES -3561619072,3561619072,GB -3561619073,3561619455,ES -3561619456,3561640575,GB -3561640576,3561640831,FR -3561640832,3561652223,GB -3561652224,3561668607,CH -3561668608,3561684991,RU -3561684992,3561693183,BG -3561693184,3561701375,DE -3561701376,3561709567,SE -3561709568,3561717759,PL -3561717760,3561725951,RU -3561725952,3561734143,ES -3561734144,3561750527,RU -3561750528,3561758719,KZ -3561758720,3561766911,PL -3561766912,3561775103,SA -3561775104,3561783295,IL -3561783296,3561799679,RU -3561799680,3561807871,DE -3561807872,3561816063,BE -3561816064,3561824255,VA -3561824256,3561828351,AT -3561828352,3561832447,LI -3561832448,3561840639,IT -3561840640,3561848831,PL -3561848832,3561857023,RU -3561857024,3561865215,DE -3561865216,3561873407,QA -3561873408,3561881599,DE -3561881600,3561889791,IT -3561889792,3561897983,FR -3561897984,3561906175,GB -3561906176,3561914367,DE -3561914368,3561922559,ES -3561922560,3561923583,GB -3561923584,3561924607,NL -3561924608,3561925023,GB -3561925024,3561925039,NL -3561925040,3561925079,GB -3561925080,3561925087,NL -3561925088,3561925343,GB -3561925344,3561925375,NL -3561925376,3561926655,GB -3561926656,3561938943,NL -3561938944,3561947135,IE -3561947136,3561963519,DE -3561963520,3561971711,BE -3561971712,3561975807,CZ -3561975808,3561979903,UA -3561979904,3561988095,ES -3561988096,3562004479,DE -3562004480,3562012671,NL -3562012672,3562020863,IR -3562020864,3562029055,UA -3562029056,3562037247,CZ -3562037248,3562045439,CH -3562045440,3562056711,ES -3562056712,3562056719,NL -3562056720,3562056911,ES -3562056912,3562056927,FR -3562056928,3562057471,ES -3562057472,3562057727,DE -3562057728,3562057975,ES -3562057976,3562057983,FR -3562057984,3562059327,ES -3562059328,3562059335,CH -3562059336,3562059391,ES -3562059392,3562059519,CH -3562059520,3562061823,ES -3562070016,3562078207,DE -3562078208,3562086399,SK -3562094592,3562094879,GB -3562094880,3562094975,CH -3562094976,3562102449,GB -3562102450,3562102450,DE -3562102451,3562102847,GB -3562102848,3562102851,NO -3562102852,3562102963,GB -3562102964,3562102967,NO -3562102968,3562110607,GB -3562110608,3562110623,FR -3562110624,3562110975,GB -3562110976,3562143743,ES -3562143744,3562151935,GB -3562151936,3562160127,DE -3562160128,3562169343,GB -3562169344,3562170367,CH -3562170368,3562172415,IE -3562172416,3562173951,CH -3562173952,3562174463,GB -3562174464,3562176511,CH -3562176512,3562184703,FR -3562184704,3562192895,DE -3562192896,3562201087,UA -3562201088,3562209279,DE -3562209280,3562217471,RU -3562217472,3562225663,DE -3562225664,3562233855,NL -3562233856,3562242047,FI -3562242048,3562253276,FR -3562253277,3562253277,NL -3562253278,3562258431,FR -3562258432,3562283007,NL -3562283008,3562285055,IT -3562285056,3562287103,IE -3562287104,3562289151,IT -3562289152,3562291199,FR -3562291200,3562307583,GB -3562307584,3562315775,NL -3562315776,3562323967,GB -3562323968,3562340351,DE -3562340352,3562348543,GB -3562348544,3562356735,ES -3562356736,3562362431,SE -3562362432,3562362495,GB -3562362496,3562364927,SE -3562364928,3562373119,PL -3562373120,3562381311,FR -3562381312,3562389503,SI -3562389504,3562397695,GH -3562397696,3562398975,GB -3562398976,3562399743,FR -3562399744,3562403839,ES -3562403840,3562405887,GB -3562405888,3562414079,FI -3562414080,3562422271,DE -3562422272,3562430463,IR -3562430464,3562431231,UA -3562431232,3562431487,RU -3562431488,3562431999,UA -3562432000,3562432255,NL -3562432256,3562433279,UA -3562433280,3562433535,CZ -3562433536,3562434047,NL -3562434048,3562435071,UA -3562435072,3562435583,NL -3562435584,3562438655,UA -3562438656,3562463231,DE -3562463232,3562471423,UA -3562471424,3562479615,PL -3562479616,3562487807,DE -3562487808,3562495999,GB -3562496000,3562504191,BE -3562504192,3562507071,DE -3562507072,3562507079,AT -3562507080,3562507111,DE -3562507112,3562507199,AT -3562507200,3562512383,DE -3562512384,3562520575,UA -3562528768,3562536959,PL -3562536960,3562545151,AT -3562545152,3562553343,GB -3562553344,3562561535,DK -3562561536,3562569727,UG -3562569728,3562577919,DE -3562577920,3562586111,AT -3562586112,3562594303,DE -3562594304,3562602495,BE -3562602496,3562610687,ES -3562610688,3562618879,NO -3562618880,3562627071,GB -3562627072,3562643455,DE -3562643456,3562651647,AT -3562651648,3562659839,DE -3562659840,3562668031,SK -3562668032,3562676223,IT -3562676224,3562684415,UA -3562684416,3562692607,FI -3562700800,3562708991,DE -3562708992,3562717183,UA -3562717184,3562725375,CH -3562725376,3562733567,CZ -3562733568,3562741759,PL -3562741760,3562758143,IT -3562758144,3562766335,HR -3562766336,3562774527,SE -3562774528,3562782719,BG -3562782720,3562790911,RU -3562790912,3562799103,DE -3562799104,3562807295,HU -3562807296,3562815487,ES -3562815488,3562823679,NL -3562823680,3562825215,RU -3562825216,3562825727,MY -3562825728,3562831359,NL -3562831360,3562831615,FR -3562831616,3562848255,RU -3562848256,3562856447,HR -3562856448,3562864639,UA -3562864640,3562872831,DE -3562872832,3562881023,DK -3562881024,3562889215,GB -3562889216,3562897407,LV -3562897408,3562905599,RO -3562905600,3562921983,SA -3562921984,3562930175,SI -3562930176,3562938367,RU -3562938368,3562946559,CH -3562946560,3562954751,FI -3562954752,3562962943,RU -3562962944,3562971135,IT -3562971136,3562987519,FR -3562987520,3562995711,DE -3562995712,3563003903,AT -3563003904,3563005183,DE -3563005184,3563005311,KZ -3563005312,3563006591,DE -3563006592,3563006719,CA -3563006720,3563008255,DE -3563008256,3563008511,PL -3563008512,3563010815,DE -3563010816,3563011071,PL -3563011072,3563012095,DE -3563012096,3563020287,FR -3563020288,3563028479,DE -3563028480,3563036671,IR -3563036672,3563044863,BG -3563044864,3563053055,ES -3563053056,3563061247,GB -3563061248,3563065343,GH -3563065344,3563067391,NG -3563067392,3563068415,MZ -3563068416,3563069439,NG -3563069440,3563077631,HU -3563077632,3563085823,KZ -3563085824,3563094015,RU -3563094016,3563102207,DE -3563102208,3563110399,CZ -3563110400,3563118591,RU -3563118592,3563126783,PL -3563126784,3563127807,RU -3563127808,3563128831,KG -3563128832,3563130879,RU -3563130880,3563134975,KG -3563134976,3563143167,IT -3563143168,3563151359,GB -3563151360,3563159551,DE -3563159552,3563167743,DK -3563167744,3563175935,ES -3563175936,3563192319,DK -3563192320,3563200511,TR -3563200512,3563208703,CH -3563208704,3563225087,DK -3563225088,3563233279,LB -3563233280,3563241471,BY -3563241472,3563257855,TR -3563257856,3563290623,FR -3563290624,3563315199,DE -3563315200,3563323391,DK -3563323648,3563331583,GB -3563331584,3563339775,DE -3563339776,3563347967,NG -3563347968,3563348991,GB -3563348992,3563353087,FI -3563353088,3563356159,GB -3563356160,3563364351,RU -3563364352,3563372543,BE -3563372544,3563380735,SA -3563380736,3563388927,GB -3563388928,3563397119,CH -3563397120,3563405311,DE -3563405312,3563407871,ES -3563407872,3563407903,US -3563407904,3563413503,ES -3563413504,3563421695,TR -3563421696,3563438079,SI -3563438080,3563446271,DE -3563446272,3563454463,LB -3563454464,3563462655,SA -3563462656,3563479039,IT -3563479040,3563487231,GB -3563487232,3563495423,RS -3563495424,3563503615,DE -3563503616,3563511807,GB -3563511808,3563519999,DE -3563520000,3563528191,FR -3563536384,3563544575,CH -3563544576,3563552767,RU -3563552768,3563560959,SI -3563560960,3563569151,EG -3563569152,3563577343,IT -3563577344,3563585535,GB -3563585536,3563601919,IT -3563601920,3563610111,RU -3563610112,3563618303,BG -3563618304,3563626495,GB -3563626496,3563634687,ES -3563634688,3563651071,NL -3563651072,3563683839,SE -3563683840,3563692031,BE -3563692032,3563700223,GB -3563700224,3563708415,DE -3563708416,3563716607,HU -3563716608,3563724799,PL -3563724800,3563732991,RU -3563732992,3563741183,PS -3563741184,3563749375,GB -3563749376,3563765759,PL -3563765760,3563782143,ES -3563790336,3563798527,EE -3563798528,3563800607,FR -3563800608,3563800623,GB -3563800624,3563800767,FR -3563800768,3563800783,GB -3563800784,3563800911,FR -3563800912,3563800927,GB -3563800928,3563800943,FR -3563800944,3563800991,GB -3563800992,3563801135,FR -3563801136,3563801151,DE -3563801152,3563801183,FR -3563801184,3563801199,DE -3563801200,3563801279,FR -3563801280,3563801295,NL -3563801296,3563801375,FR -3563801376,3563801391,GB -3563801392,3563801407,IT -3563801408,3563801423,DE -3563801424,3563801455,FR -3563801456,3563801519,GB -3563801520,3563801551,FR -3563801552,3563801567,GB -3563801568,3563801599,FR -3563801600,3563801631,GB -3563801632,3563801647,FR -3563801648,3563801743,GB -3563801744,3563801775,FR -3563801776,3563801791,BE -3563801792,3563801839,FR -3563801840,3563801855,GB -3563801856,3563801871,FR -3563801872,3563801887,GB -3563801888,3563801922,FR -3563801923,3563801935,GB -3563801936,3563802015,FR -3563802016,3563802031,BE -3563802032,3563802047,FR -3563802048,3563802063,IT -3563802064,3563802207,FR -3563802208,3563802223,GB -3563802224,3563802255,FR -3563802256,3563802271,GB -3563802272,3563802303,FR -3563802304,3563802319,IT -3563802320,3563802447,FR -3563802448,3563802463,GB -3563802464,3563802623,FR -3563802624,3563802655,GB -3563802656,3563802735,FR -3563802736,3563802751,US -3563802752,3563802783,GB -3563802784,3563803007,FR -3563803008,3563803023,GB -3563803024,3563803039,FR -3563803040,3563803055,GB -3563803056,3563803119,FR -3563803120,3563803135,NL -3563803136,3563803151,FR -3563803152,3563803167,GB -3563803168,3563803183,FR -3563803184,3563803215,GB -3563803216,3563803247,FR -3563803248,3563803263,GB -3563803264,3563803279,FR -3563803280,3563803295,GB -3563803296,3563803311,FR -3563803312,3563803327,GB -3563803328,3563803359,FR -3563803360,3563803423,GB -3563803424,3563803439,FR -3563803440,3563803455,DE -3563803456,3563803487,GB -3563803488,3563803503,US -3563803504,3563803519,GB -3563803520,3563803631,FR -3563803632,3563803647,GB -3563803648,3563803967,FR -3563803968,3563803983,BE -3563803984,3563804695,FR -3563804696,3563804703,GB -3563804704,3563804719,FR -3563804720,3563804727,GB -3563804728,3563806719,FR -3563806720,3563814911,SA -3563814912,3563823103,SE -3563823104,3563831295,DE -3563831296,3563847679,RU -3563847680,3563848447,NL -3563848448,3563848703,GB -3563848704,3563848847,NL -3563848848,3563848848,GB -3563848849,3563848849,NL -3563848850,3563848855,GB -3563848856,3563855871,NL -3563855872,3563864063,AT -3563864064,3563872255,GB -3563872256,3563880447,RU -3563880448,3563888639,TR -3563888640,3563896831,DE -3563896832,3563913215,HU -3563913216,3563921407,RU -3563921408,3563929599,UA -3563929600,3563937791,CH -3563937792,3563945983,TR -3563945984,3563956223,PL -3563956224,3563958271,RU -3563958272,3563962367,CZ -3563962368,3563970559,RU -3563970560,3563978751,TR -3563978752,3563995135,IT -3563995136,3564003327,MK -3564003328,3564011519,DE -3564011520,3564019711,UA -3564019712,3564027903,GB -3564027904,3564044287,DE -3564044288,3564052479,CZ -3564052480,3564060671,GB -3564060672,3564068863,RU -3564068864,3564077055,ES -3564077056,3564093439,GB -3564093440,3564101631,UA -3564101632,3564109823,DE -3564109824,3564126207,SE -3564126208,3564134399,IT -3564134400,3564142591,KG -3564142592,3564150783,DK -3564150784,3564154943,SE -3564154944,3564154975,FI -3564154976,3564158831,SE -3564158832,3564158839,FI -3564158840,3564158975,SE -3564158976,3564175359,DE -3564175360,3564176639,GB -3564176640,3564176671,PL -3564176672,3564183551,GB -3564183552,3564191743,UA -3564199936,3564208127,RU -3564208128,3564216319,GB -3564216320,3564224511,PT -3564224512,3564232703,GB -3564232704,3564249087,RU -3564249088,3564265471,DE -3564265472,3564273663,NL -3564273664,3564294399,DE -3564294400,3564294403,IT -3564294404,3564306431,DE -3564306432,3564314623,TR -3564322816,3564331007,IT -3564339200,3564355583,GB -3564355584,3564363775,NL -3564363776,3564371967,UA -3564371968,3564380159,DE -3564380160,3564388351,FI -3564388352,3564391135,SE -3564391136,3564391167,US -3564391168,3564396543,SE -3564396544,3564404735,RU -3564404736,3564412927,BG -3564412928,3564421119,IL -3564421120,3564429311,SA -3564429312,3564437503,KZ -3564437504,3564445695,LT -3564445696,3564453887,BG -3564453888,3564462079,DE -3564462080,3564470271,CH -3564470272,3564478463,IL -3564478464,3564486655,LU -3564486656,3564494847,CH -3564503040,3564511231,JO -3564511232,3564519423,RU -3564519424,3564527615,SI -3564527616,3564543999,SA -3564544000,3564560383,DE -3564560384,3564571695,GB -3564571696,3564571703,DE -3564571704,3564572427,GB -3564572428,3564572431,ES -3564572432,3564572527,GB -3564572528,3564572531,DK -3564572532,3564574719,GB -3564574720,3564574975,NL -3564574976,3564575487,GB -3564575488,3564575615,DE -3564575616,3564576767,GB -3564584960,3564593151,SA -3564593152,3564601343,RU -3564601344,3564609535,EE -3564609536,3564634111,RU -3564634112,3564642303,MK -3564642304,3564650495,CH -3564650496,3564666879,NL -3564666880,3564675071,IE -3564675072,3564683263,RU -3564683264,3564691455,IR -3564691456,3564699647,GI -3564699648,3564716031,GB -3564716032,3564724223,IT -3564724224,3564732415,NL -3564732416,3564733183,GB -3564733184,3564733215,DE -3564733216,3564733259,GB -3564733260,3564733263,DE -3564733264,3564733343,GB -3564733344,3564733351,DE -3564733352,3564733807,GB -3564733808,3564733823,DE -3564733824,3564734457,GB -3564734458,3564734458,DE -3564734459,3564734741,GB -3564734742,3564734742,DE -3564734743,3564734743,GB -3564734744,3564734751,DE -3564734752,3564734775,GB -3564734776,3564734783,DE -3564734784,3564739327,GB -3564739328,3564739343,DE -3564739344,3564739345,GB -3564739346,3564739346,DE -3564739347,3564739375,GB -3564739376,3564739383,DE -3564739384,3564740607,GB -3564740608,3564748799,FR -3564748800,3564756991,GB -3564756992,3564765183,ES -3564765184,3564773375,RU -3564773376,3564781567,DE -3564781568,3564787455,LT -3564787456,3564787583,NL -3564787584,3564789759,LT -3564789760,3564797951,ES -3564797952,3564806143,DE -3564806144,3564814335,BG -3564814336,3564822527,PL -3564822528,3564830719,EG -3564830720,3564838911,BE -3564838912,3564847103,DE -3564847104,3564855295,IT -3564855296,3564863487,DE -3564863488,3564879871,NL -3564879872,3564879935,GB -3564879936,3564879999,NL -3564880000,3564880519,GB -3564880520,3564880523,NL -3564880524,3564880651,GB -3564880652,3564880655,NL -3564880656,3564880945,GB -3564880946,3564880946,NL -3564880947,3564882015,GB -3564882016,3564882031,NL -3564882032,3564882399,GB -3564882400,3564882415,NL -3564882416,3564882543,GB -3564882544,3564882551,NL -3564882552,3564882559,GB -3564882560,3564882591,NL -3564882592,3564883071,GB -3564883072,3564883079,NL -3564883080,3564883199,GB -3564883200,3564883455,NL -3564883456,3564886271,GB -3564886272,3564886527,NL -3564886528,3564886719,GB -3564886720,3564886751,NL -3564886752,3564888991,GB -3564888992,3564889007,ES -3564889008,3564889633,GB -3564889634,3564889634,NL -3564889635,3564891119,GB -3564891120,3564891135,NL -3564891136,3564895231,GB -3564895232,3564895743,NL -3564895744,3564895959,GB -3564895960,3564895967,DE -3564895968,3564896095,GB -3564896096,3564896111,DE -3564896112,3564896255,GB -3564896256,3564904447,RU -3564904448,3564912639,DE -3564912640,3564913663,NL -3564913664,3564913919,ES -3564913920,3564914175,IE -3564914176,3564914431,FR -3564914432,3564914687,IE -3564914688,3564915711,GB -3564915712,3564915712,IN -3564915713,3564916735,US -3564916736,3564917759,MX -3564917760,3564918783,US -3564918784,3564920831,IT -3564920832,3564922111,DE -3564922112,3564924927,US -3564924928,3564926975,DE -3564926976,3564929023,US -3564929024,3564937215,AT -3564937216,3564945407,IT -3564945408,3564953599,GB -3564953600,3564954879,AT -3564954880,3564957695,GB -3564957696,3564960959,AT -3564960960,3564960975,GB -3564960976,3564961791,AT -3564961792,3564969983,TR -3564969984,3564978175,DE -3564978176,3564986367,GB -3564986368,3564994559,DE -3564994560,3565002751,NL -3565002752,3565027327,NO -3565027328,3565035519,PL -3565035520,3565037567,IE -3565037568,3565038591,GB -3565038592,3565038847,IE -3565038848,3565038879,GB -3565038880,3565038895,IE -3565038896,3565039615,GB -3565039616,3565041663,IE -3565041664,3565043711,GB -3565043712,3565051903,AT -3565051904,3565060095,IQ -3565060096,3565068287,GB -3565068288,3565076479,CH -3565076480,3565084671,DE -3565084672,3565092863,IS -3565092864,3565101055,GB -3565101056,3565109247,DE -3565109248,3565117439,PL -3565117440,3565125631,TR -3565125632,3565158399,NL -3565158400,3565223935,ES -3565223936,3565240319,FR -3565240320,3565248511,IE -3565248512,3565256703,RU -3565256704,3565289471,CN -3565289472,3565355007,DK -3565355008,3565420543,IT -3565420544,3565486335,GB -3565486336,3565486975,FR -3565486976,3565487615,NL -3565487616,3565495295,GB -3565495296,3565496319,FR -3565496320,3565502463,GB -3565502464,3565503487,NL -3565503488,3565518847,GB -3565518848,3565551615,TR -3565551616,3565682687,GB -3565682688,3565748223,NL -3565748224,3565752319,GB -3565752464,3565752479,GB -3565752536,3565752559,GB -3565752576,3565752839,GB -3565752856,3565752879,GB -3565752888,3565752983,GB -3565752992,3565752999,GB -3565753016,3565753031,GB -3565753040,3565753071,GB -3565753080,3565753183,GB -3565753248,3565753279,GB -3565753344,3565753791,GB -3565753800,3565753815,GB -3565753824,3565753831,GB -3565753840,3565753847,GB -3565753984,3565754367,GB -3565754496,3565754511,GB -3565754624,3565755263,GB -3565755280,3565755359,GB -3565755376,3565755583,GB -3565755648,3565755695,GB -3565755704,3565755727,GB -3565755736,3565755831,GB -3565755840,3565755847,GB -3565755856,3565755871,GB -3565755880,3565755903,GB -3565756152,3565756159,GB -3565756416,3565760783,GB -3565760792,3565760799,GB -3565760808,3565760823,GB -3565760832,3565760855,GB -3565760864,3565760935,GB -3565760944,3565760967,GB -3565760976,3565761007,GB -3565761016,3565761279,GB -3565761344,3565761535,GB -3565761544,3565761599,GB -3565761616,3565761631,GB -3565761640,3565761647,GB -3565761656,3565761687,GB -3565761704,3565761727,GB -3565761752,3565761783,GB -3565761792,3565762047,GB -3565762048,3565762303,ZA -3565762560,3565762815,GB -3565763072,3565763455,GB -3565763488,3565763599,GB -3565763616,3565763671,GB -3565763680,3565763703,GB -3565763720,3565763735,GB -3565763744,3565763751,GB -3565763760,3565763799,GB -3565763808,3565763815,GB -3565763832,3565763839,GB -3565763884,3565763891,GB -3565764096,3565764183,GB -3565764192,3565764207,GB -3565764256,3565764367,GB -3565764376,3565764439,GB -3565764448,3565764455,GB -3565764464,3565764551,GB -3565764576,3565766655,GB -3565766912,3565767167,GB -3565767176,3565767255,GB -3565767272,3565767287,GB -3565767296,3565767351,GB -3565767360,3565767399,GB -3565767408,3565767439,GB -3565767456,3565767487,GB -3565767504,3565767599,GB -3565767616,3565767631,GB -3565767680,3565767999,GB -3565768208,3565768223,GB -3565768240,3565768247,GB -3565768448,3565768575,GB -3565768704,3565768983,GB -3565769472,3565769727,GB -3565770752,3565771775,GB -3565777920,3565813759,GB -3565813760,3565879295,SA -3565879296,3566010367,GB -3566010368,3566075903,IT -3566075904,3566092287,NL -3566092288,3566108671,LV -3566108672,3566141439,ES -3566141440,3566206975,IL -3566206976,3566272511,DE -3566272512,3566338047,ES -3566338048,3566354431,FI -3566354432,3566370815,RO -3566370816,3566403583,TR -3566403584,3566436351,CH -3566436352,3566469119,IE -3566469120,3566534655,GB -3566534656,3566551039,DE -3566551040,3566600191,FI -3566600192,3566607359,IL -3566607360,3566607615,GN -3566607616,3566665727,IL -3566665728,3566723071,SE -3566723072,3566723327,RU -3566723328,3566739455,SE -3566739456,3566747647,RU -3566747648,3566764031,GR -3566764032,3566796799,AT -3566796800,3566862335,NL -3566862336,3566895103,TR -3566895104,3566927871,KZ -3566927872,3566993407,FR -3566993408,3567058943,TR -3567058944,3567124479,FR -3567124992,3567125023,GB -3567125248,3567125503,GB -3567126688,3567126759,GB -3567127552,3567127807,GB -3567129856,3567129887,GB -3567130016,3567130079,GB -3567131384,3567131647,GB -3567133216,3567133247,GB -3567133368,3567133375,GB -3567134208,3567134335,GB -3567134848,3567134975,GB -3567136000,3567136255,GB -3567136512,3567136575,GB -3567136640,3567136671,GB -3567136768,3567136895,GB -3567137024,3567137279,GB -3567137600,3567137663,GB -3567137988,3567137991,GB -3567138000,3567138003,GB -3567140096,3567140351,GB -3567140864,3567140927,GB -3567141632,3567141887,GB -3567142272,3567142399,GB -3567143432,3567143439,GB -3567143520,3567143551,GB -3567143680,3567143687,GB -3567143872,3567143935,GB -3567143952,3567143967,GB -3567144172,3567144175,GB -3567144320,3567144447,GB -3567144768,3567144831,GB -3567147528,3567147535,GB -3567147552,3567147559,GB -3567148520,3567148527,GB -3567148800,3567149055,GB -3567149088,3567149119,GB -3567149904,3567149911,GB -3567149920,3567149935,GB -3567151136,3567151199,GB -3567151232,3567151263,GB -3567152000,3567152127,GB -3567152160,3567152191,GB -3567152256,3567152383,GB -3567152400,3567152407,GB -3567152640,3567152647,GB -3567152744,3567152751,GB -3567152832,3567152863,GB -3567152960,3567152991,GB -3567153024,3567153055,GB -3567153600,3567153607,GB -3567153616,3567153623,GB -3567153648,3567153663,GB -3567153688,3567153703,GB -3567153720,3567153727,GB -3567153824,3567153847,GB -3567154304,3567154367,GB -3567155200,3567155967,GB -3567156416,3567156607,GB -3567157248,3567165439,CZ -3567165440,3567169535,RU -3567169536,3567173631,MK -3567173632,3567239167,GB -3567239168,3567255551,NL -3567255552,3567263743,PL -3567263744,3567271935,ES -3567271936,3567321087,PL -3567321088,3567338615,GB -3567338616,3567338623,DE -3567338624,3567344447,GB -3567344448,3567344479,ES -3567344480,3567345623,GB -3567345624,3567345631,IE -3567345632,3567350271,GB -3567350272,3567350527,ES -3567350528,3567353855,GB -3567353856,3567386623,CH -3567386624,3567388351,GB -3567388352,3567388383,DE -3567388384,3567388543,GB -3567388544,3567388607,DE -3567388608,3567388647,GB -3567388648,3567388655,DE -3567388656,3567389695,GB -3567389696,3567390719,DE -3567390720,3567391865,GB -3567391866,3567391866,PL -3567391867,3567393801,GB -3567393802,3567393802,SI -3567393803,3567399935,GB -3567399936,3567400447,DE -3567400448,3567400959,GB -3567400960,3567401471,DE -3567401472,3567403007,GB -3567403008,3567419391,IT -3567427584,3567435775,SE -3567435776,3567453079,GB -3567453080,3567453087,ES -3567453088,3567453407,GB -3567453408,3567453439,ES -3567453440,3567453695,GB -3567453696,3567453951,ES -3567453952,3567456407,GB -3567456408,3567456415,ES -3567456416,3567456511,GB -3567456512,3567456767,ES -3567456768,3567458305,GB -3567458306,3567458306,ES -3567458307,3567458471,GB -3567458472,3567458479,ES -3567458480,3567458911,GB -3567458912,3567458943,ES -3567458944,3567459135,GB -3567459136,3567459151,ES -3567459152,3567459935,GB -3567459936,3567459943,ES -3567459944,3567463135,GB -3567463136,3567463143,ES -3567463144,3567465983,GB -3567465984,3567466239,ES -3567466240,3567490047,GB -3567490048,3567490303,ES -3567490304,3567494847,GB -3567494848,3567494911,ES -3567494912,3567499007,GB -3567499008,3567499135,ES -3567499136,3567499519,GB -3567499520,3567499775,ES -3567499776,3567500543,GB -3567500544,3567500799,ES -3567500800,3567502615,GB -3567502616,3567502623,ES -3567502624,3567503359,GB -3567503360,3567504383,ES -3567504384,3567505151,GB -3567505152,3567505407,ES -3567505408,3567507271,GB -3567507272,3567507287,ES -3567507288,3567511487,GB -3567511488,3567511495,ES -3567511496,3567516671,GB -3567516672,3567517695,ES -3567517696,3567583231,RU -3567583232,3567583487,AT -3567583744,3567583871,AT -3567583936,3567583999,AT -3567584256,3567584383,AT -3567584392,3567584407,AT -3567584512,3567584639,AT -3567585280,3567585311,TR -3567585792,3567586303,GB -3567586304,3567586815,TR -3567587328,3567591423,GB -3567591424,3567599615,IT -3567599616,3567615999,NL -3567616000,3567616767,GB -3567616768,3567617023,US -3567617024,3567618047,GB -3567618048,3567619071,IN -3567619072,3567619583,GB -3567619584,3567619839,NG -3567619840,3567620095,GB -3567620096,3567620351,IN -3567620352,3567627263,GB -3567627264,3567629311,LU -3567629312,3567630335,GB -3567630336,3567634431,LU -3567634432,3567636479,GB -3567636480,3567646719,LU -3567646720,3567648767,GB -3567648768,3567665151,BE -3567665152,3567673343,ES -3567673344,3567681535,AT -3567681536,3567714303,ES -3567714304,3567715327,GB -3567716352,3567717631,GB -3567717888,3567718015,GB -3567718144,3567718399,CH -3567718400,3567718655,US -3567718656,3567718911,GB -3567718912,3567719423,US -3567719424,3567719679,GB -3567779840,3567845375,DE -3567845376,3567861759,GB -3567861760,3567878143,NO -3567878144,3567976447,ES -3567976448,3568041983,IT -3568041984,3568107519,DE -3568107520,3568173055,GB -3568173056,3568304127,TR -3568304128,3568369663,RU -3568369664,3568435199,IT -3568435200,3568443391,UA -3568443392,3568476159,NL -3568476160,3568484351,DK -3568484352,3568492543,NL -3568492544,3568500735,RS -3568500736,3568566271,IL -3568566272,3568599039,FR -3568599040,3568631807,PL -3568631808,3568697343,SE -3568697344,3568730111,PL -3568730112,3568746495,NL -3568746496,3568762879,FI -3568762880,3568795647,AT -3568795648,3568803839,GB -3568803840,3568812031,IT -3568812032,3568828415,ES -3568828416,3568959487,DE -3568959488,3569025023,AT -3569025024,3569057791,NL -3569057792,3569074687,GB -3569074688,3569074943,IE -3569074944,3569075455,GB -3569075456,3569075711,IE -3569075712,3569090559,GB -3569090560,3569123327,RU -3569123328,3569156095,GB -3569156096,3569188863,NL -3569188864,3569221631,IT -3569221632,3569287167,BE -3569287168,3569352703,PL -3569352704,3569483775,RU -3569483776,3569614847,FR -3569614848,3569680383,GB -3569680384,3569713151,SK -3569713152,3569729535,AT -3569729536,3569731167,FR -3569731168,3569731183,IT -3569731184,3569731215,GB -3569731216,3569731231,FR -3569731232,3569731247,DE -3569731248,3569731263,GB -3569731264,3569731311,FR -3569731312,3569731327,GB -3569731328,3569731375,FR -3569731376,3569731391,GB -3569731392,3569731423,FR -3569731424,3569731439,GB -3569731440,3569731455,FR -3569731456,3569731471,GB -3569731472,3569731487,FR -3569731488,3569731503,GB -3569731504,3569731519,IT -3569731520,3569731551,GB -3569731552,3569731583,FR -3569731584,3569731599,GB -3569731600,3569731615,FR -3569731616,3569731631,DE -3569731632,3569731647,IT -3569731648,3569731727,FR -3569731728,3569731743,GB -3569731744,3569731791,FR -3569731792,3569731807,GB -3569731808,3569731839,FR -3569731840,3569731871,GB -3569731872,3569731903,FR -3569731904,3569731919,BE -3569731920,3569731951,FR -3569731952,3569731967,NL -3569731968,3569731983,GB -3569731984,3569732031,FR -3569732032,3569732047,DE -3569732048,3569732063,GB -3569732064,3569732079,FR -3569732080,3569732095,GB -3569732096,3569732143,FR -3569732144,3569732191,GB -3569732192,3569732207,DE -3569732208,3569732287,FR -3569732288,3569732303,GB -3569732304,3569732319,DE -3569732320,3569732335,FR -3569732336,3569732351,GB -3569732352,3569732383,FR -3569732384,3569732399,US -3569732400,3569732447,FR -3569732448,3569732479,US -3569732480,3569732495,GB -3569732496,3569732543,FR -3569732544,3569732575,GB -3569732576,3569732607,FR -3569732608,3569732639,GB -3569732640,3569732671,FR -3569732672,3569732703,GB -3569732704,3569732719,FR -3569732720,3569732735,GB -3569732736,3569732751,FR -3569732752,3569732767,GB -3569732768,3569732783,FR -3569732784,3569732847,GB -3569732848,3569732863,FR -3569732864,3569732879,GB -3569732880,3569732895,FR -3569732896,3569732911,IT -3569732912,3569733007,FR -3569733008,3569733023,IE -3569733024,3569733055,FR -3569733056,3569733087,GB -3569733088,3569733103,IT -3569733104,3569733183,FR -3569733184,3569733199,GB -3569733200,3569733263,FR -3569733264,3569733279,US -3569733280,3569733295,DE -3569733296,3569733311,GB -3569733312,3569733327,FR -3569733328,3569733343,GB -3569733344,3569733423,FR -3569733424,3569733439,GB -3569733440,3569733471,FR -3569733472,3569733487,GB -3569733488,3569733519,FR -3569733520,3569733535,GB -3569733536,3569733551,NL -3569733552,3569733567,FR -3569733568,3569733583,GB -3569733584,3569733599,FR -3569733600,3569733615,GB -3569733616,3569733647,FR -3569733648,3569733663,GB -3569733664,3569733679,FR -3569733680,3569733695,GB -3569733696,3569733775,FR -3569733776,3569733791,IE -3569733792,3569733807,FR -3569733808,3569733823,GB -3569733824,3569733887,FR -3569733888,3569733919,GB -3569733920,3569733935,FR -3569733936,3569733951,GB -3569733952,3569733967,FR -3569733968,3569733983,ES -3569733984,3569733999,GB -3569734000,3569734047,FR -3569734048,3569734079,GB -3569734080,3569734143,FR -3569734144,3569734159,GB -3569734160,3569734191,FR -3569734192,3569734207,GB -3569734208,3569734367,FR -3569734368,3569734399,GB -3569734400,3569734447,BE -3569734448,3569734463,FR -3569734464,3569734511,BE -3569734512,3569736047,FR -3569736048,3569736063,GB -3569736064,3569736071,FR -3569736072,3569736079,ES -3569736080,3569736191,FR -3569736192,3569736223,NL -3569736224,3569736239,FR -3569736240,3569736383,NL -3569736384,3569736399,SE -3569736400,3569736655,NL -3569736656,3569736671,FR -3569736672,3569736703,NL -3569736704,3569739263,FR -3569739264,3569739295,NL -3569739296,3569739327,FR -3569739328,3569739471,NL -3569739472,3569739487,FR -3569739488,3569739599,NL -3569739600,3569739631,FR -3569739632,3569739647,NL -3569739648,3569739663,FR -3569739664,3569739679,NL -3569739680,3569739695,FR -3569739696,3569739839,NL -3569739840,3569739855,FR -3569739856,3569739903,NL -3569739904,3569739919,FR -3569739920,3569739935,NL -3569739936,3569739951,FR -3569739952,3569740047,NL -3569740048,3569740063,FR -3569740064,3569740111,NL -3569740112,3569740127,FR -3569740128,3569740255,NL -3569740256,3569740271,FR -3569740272,3569740303,NL -3569740304,3569740319,FR -3569740320,3569740367,NL -3569740368,3569740383,FR -3569740384,3569740415,NL -3569740416,3569740431,FR -3569740432,3569740463,NL -3569740464,3569740479,FR -3569740480,3569740495,NL -3569740496,3569740511,FR -3569740512,3569740543,NL -3569740544,3569740559,FR -3569740560,3569740655,NL -3569740656,3569740671,FR -3569740672,3569740687,NL -3569740688,3569740703,FR -3569740704,3569740799,NL -3569740800,3569742335,FR -3569742336,3569742351,BE -3569742352,3569742383,FR -3569742384,3569742399,BE -3569742400,3569742415,FR -3569742416,3569742511,BE -3569742512,3569742527,FR -3569742528,3569742623,BE -3569742624,3569742639,FR -3569742640,3569742671,BE -3569742672,3569742687,FR -3569742688,3569742735,BE -3569742736,3569742751,FR -3569742752,3569742767,BE -3569742768,3569742783,FR -3569742784,3569742927,BE -3569742928,3569742943,FR -3569742944,3569743087,BE -3569743088,3569743103,FR -3569743104,3569743135,BE -3569743136,3569743199,FR -3569743200,3569743215,BE -3569743216,3569743359,FR -3569743360,3569743391,BE -3569743392,3569743407,FR -3569743408,3569743423,BE -3569743424,3569743455,FR -3569743456,3569743583,BE -3569743584,3569743599,NL -3569743600,3569743615,FR -3569743616,3569743631,BE -3569743632,3569743647,FR -3569743648,3569743679,BE -3569743680,3569743711,FR -3569743712,3569743775,BE -3569743776,3569743791,FR -3569743792,3569743871,BE -3569743872,3569743983,NL -3569743984,3569743999,FR -3569744000,3569744047,NL -3569744048,3569744063,FR -3569744064,3569744127,NL -3569744128,3569744143,FR -3569744144,3569744543,NL -3569744544,3569744559,FR -3569744560,3569744575,NL -3569744576,3569744623,FR -3569744624,3569744815,NL -3569744816,3569744831,FR -3569744832,3569744911,NL -3569744912,3569744927,FR -3569744928,3569744975,NL -3569744976,3569744991,FR -3569744992,3569745007,NL -3569745008,3569745023,FR -3569745024,3569745039,NL -3569745040,3569745055,FR -3569745056,3569745103,NL -3569745104,3569745119,FR -3569745120,3569745167,NL -3569745168,3569745183,FR -3569745184,3569745215,NL -3569745216,3569745231,FR -3569745232,3569745247,NL -3569745248,3569745279,FR -3569745280,3569745311,NL -3569745312,3569745327,FR -3569745328,3569745359,NL -3569745360,3569745375,FR -3569745376,3569745407,NL -3569745408,3569745663,FR -3569745664,3569745727,NL -3569745728,3569745743,FR -3569745744,3569745813,NL -3569745814,3569745823,FR -3569745824,3569745839,NL -3569745840,3569745871,FR -3569745872,3569745887,NL -3569745888,3569745903,FR -3569745904,3569745919,NL -3569745920,3569811175,FR -3569811176,3569811176,GP -3569811177,3569811455,FR -3569811456,3569876991,IL -3569876992,3569942527,RS -3569942528,3570073599,DE -3570073600,3570081791,NL -3570081792,3570106367,CH -3570106368,3570139135,PL -3570139136,3570171903,DE -3570171904,3570204671,NL -3570204672,3570270207,GR -3570270208,3570335743,NL -3570335744,3570401279,GB -3570401280,3570466815,FR -3570466816,3570532351,SE -3570532352,3570597887,IT -3570597888,3570607103,GB -3570607104,3570608127,DE -3570608128,3570611199,GB -3570611200,3570611455,FR -3570611456,3570614271,GB -3570614272,3570617343,DE -3570617344,3570617855,GB -3570617856,3570622463,DE -3570622464,3570630655,GB -3570630656,3570663423,DE -3570663424,3570728959,GB -3570728960,3570729983,FI -3570729984,3570731007,SE -3570731008,3570794495,FI -3570794496,3570817913,SE -3570817914,3570817914,AT -3570817915,3570860031,SE -3570860032,3570892799,CH -3570892800,3570925567,SA -3570925568,3570991103,IT -3570991104,3571023871,MA -3571023872,3571056639,SE -3571056640,3571122175,DE -3571122176,3571187711,GB -3571187712,3571253247,RU -3571253248,3571264609,BE -3571264610,3571264610,FR -3571264611,3571286015,BE -3571286016,3571318783,DE -3571318784,3571321055,GB -3571321056,3571321071,DE -3571321072,3571321823,GB -3571321824,3571321855,DE -3571321856,3571384319,GB -3571384320,3571482623,DE -3571482624,3571515391,BE -3571515392,3571548159,GB -3571548160,3571580927,ES -3571580928,3571646463,FI -3571646464,3571688383,DE -3571688384,3571689215,ES -3571689216,3571699711,DE -3571699712,3571700735,GB -3571700736,3571711999,DE -3571712000,3571843071,GB -3571843072,3571974143,ES -3571974144,3571978239,RU -3571978240,3571980287,SK -3571980288,3571982335,AT -3571982336,3572006911,RU -3572006912,3572039679,CH -3572039680,3572047871,BE -3572047872,3572056063,LU -3572056064,3572072447,RU -3572072448,3572105215,BG -3572105216,3572170751,FR -3572170752,3572203519,IL -3572203520,3572236287,SI -3572236288,3572301823,AT -3572301824,3572318207,IT -3572318208,3572326399,GB -3572326400,3572330495,DK -3572330496,3572334591,IQ -3572334592,3572338687,DK -3572338688,3572340735,SE -3572340736,3572342783,LU -3572342784,3572346879,DE -3572346880,3572348927,DK -3572348928,3572350975,RS -3572350976,3572355071,SE -3572355072,3572356095,CH -3572356096,3572357119,GB -3572357120,3572358143,NL -3572358144,3572359167,GB -3572359168,3572360191,US -3572360192,3572360831,ES -3572360832,3572360895,MX -3572360896,3572361215,ES -3572361216,3572362239,LT -3572362240,3572363263,ES -3572363264,3572364287,RS -3572364288,3572365311,DE -3572365312,3572366335,DK -3572366336,3572366591,IT -3572366592,3572366847,NL -3572366848,3572367103,DE -3572367104,3572367359,ES -3572367360,3572432895,NL -3572432896,3572465663,IT -3572465664,3572498431,BE -3572498432,3572563967,GB -3572563968,3572572159,KG -3572572160,3572580351,NL -3572580352,3572596735,AT -3572596736,3572629503,GB -3572629504,3572695039,DK -3572695040,3572760575,CH -3572760576,3572826111,PL -3572826112,3572891647,IT -3572891648,3572957183,FI -3572957184,3573022719,SE -3573022720,3573055487,RU -3573055488,3573088255,GB -3573088256,3573153791,CH -3573153792,3573219327,GB -3573219328,3573252095,GR -3573252096,3573284863,NO -3573284864,3573415935,TR -3573415936,3573481471,CH -3573481472,3573547007,DE -3573547008,3573612543,ES -3573612544,3573743615,GB -3573743616,3573809151,CH -3573809152,3573874687,ES -3573874688,3573878783,PL -3573878784,3573879807,RU -3573879808,3573880831,MD -3573880832,3573882879,RU -3573882880,3573884927,DK -3573884928,3573886975,PL -3573886976,3573889023,RU -3573889024,3573891071,HR -3573891072,3573893119,NL -3573893120,3573897215,RU -3573897216,3573899263,GB -3573899264,3573903359,RU -3573903360,3573905407,SI -3573905408,3573909503,RU -3573909504,3573913599,PL -3573913600,3573915647,CH -3573915648,3573917695,RU -3573917696,3573919743,SA -3573919744,3573921791,GB -3573921792,3573923839,RU -3573923840,3573925887,UA -3573925888,3573929983,PL -3573929984,3573934079,RU -3573936128,3573938175,RU -3573938176,3573940223,PL -3573940224,3574005759,PS -3574005760,3574071295,CY -3574071296,3574136831,IL -3574136832,3574169599,DE -3574169600,3574173695,GB -3574173696,3574173951,ES -3574173952,3574174839,GB -3574174840,3574174847,ES -3574174848,3574182904,GB -3574182905,3574182905,ES -3574182906,3574183423,GB -3574183424,3574183679,ES -3574183680,3574186799,GB -3574186800,3574186815,ES -3574186816,3574187007,GB -3574187008,3574188031,ES -3574188032,3574191615,GB -3574191616,3574192127,ES -3574192128,3574195199,GB -3574195200,3574196223,ES -3574196224,3574198271,GB -3574198272,3574199295,ES -3574199296,3574200831,GB -3574200832,3574202367,ES -3574202368,3574267903,NL -3574267904,3574333439,FR -3574333440,3574341631,GB -3574348288,3574348543,GB -3574398976,3574464511,PT -3574464512,3574530047,TR -3574530048,3574530207,SE -3574530208,3574530239,DE -3574530240,3574594559,SE -3574594560,3574595583,GB -3574595584,3574597631,MQ -3574597632,3574598655,GP -3574598656,3574599679,MQ -3574599680,3574603775,GP -3574603776,3574611967,BG -3574611968,3574628351,HU -3574628352,3574661119,GR -3574661120,3574693887,NL -3574693888,3574726655,PL -3574726656,3574792191,GB -3574792192,3574824959,CZ -3574824960,3574830079,GB -3574830080,3574831103,NL -3574831104,3574841599,GB -3574841600,3574841855,NL -3574841856,3574842367,GB -3574842368,3574843391,NL -3574843392,3574857727,GB -3574857728,3574923263,DE -3574923264,3574939647,RU -3574939648,3574941375,SE -3574941376,3574941439,NO -3574941440,3574949743,SE -3574949744,3574949759,NO -3574949760,3574956031,SE -3574956032,3574972415,IT -3574972416,3574988799,LV -3574988800,3575054335,PT -3575054336,3575119871,DE -3575119872,3575185407,RU -3575185408,3575250943,PL -3575250944,3575316479,IT -3575316480,3575349247,RU -3575349248,3575382015,ES -3575382016,3575447551,FI -3575447552,3575513087,CZ -3575513088,3575545855,PT -3575545856,3575562239,FR -3575562240,3575570223,DE -3575570224,3575570239,NL -3575570240,3575578623,DE -3575578624,3575589631,GB -3575589632,3575589887,CY -3575589888,3575644159,GB -3575644160,3575646303,FR -3575646304,3575646319,ES -3575646320,3575646679,FR -3575646680,3575646683,PL -3575646684,3575646815,FR -3575646816,3575646847,PL -3575646848,3575646911,FR -3575646912,3575646975,PL -3575646976,3575647231,GB -3575647232,3575647447,FR -3575647448,3575647451,PL -3575647452,3575648223,FR -3575648224,3575648255,PT -3575648256,3575652991,FR -3575652992,3575653119,GB -3575653120,3575653143,FR -3575653144,3575653151,ES -3575653152,3575653171,FR -3575653172,3575653175,NL -3575653176,3575653239,FR -3575653240,3575653247,ES -3575653248,3575653371,FR -3575653372,3575653375,PL -3575653376,3575653567,FR -3575653568,3575653631,PL -3575653632,3575653711,FR -3575653712,3575653727,ES -3575653728,3575653759,FR -3575653760,3575653887,ES -3575653888,3575654591,FR -3575654592,3575654655,CZ -3575654656,3575655039,FR -3575655040,3575655103,ES -3575655104,3575655615,FR -3575655616,3575655623,IE -3575655624,3575655855,FR -3575655856,3575655859,PL -3575655860,3575655863,FR -3575655864,3575655867,ES -3575655868,3575656287,FR -3575656288,3575656319,PT -3575656320,3575656575,FR -3575656576,3575656703,BE -3575656704,3575656911,FR -3575656912,3575656927,NL -3575656928,3575657087,FR -3575657088,3575657215,ES -3575657216,3575657983,FR -3575657984,3575658239,ES -3575658240,3575658303,FR -3575658304,3575658367,FI -3575658368,3575658559,FR -3575658560,3575658623,DE -3575658624,3575658639,NL -3575658640,3575658655,FR -3575658656,3575658671,ES -3575658672,3575659007,FR -3575659008,3575659071,ES -3575659072,3575660155,FR -3575660156,3575660159,GB -3575660160,3575660223,ES -3575660224,3575660335,FR -3575660336,3575660351,LT -3575660352,3575660415,PT -3575660416,3575664959,FR -3575664960,3575665023,BE -3575665024,3575665039,LT -3575665040,3575665087,FR -3575665088,3575665151,DE -3575665152,3575665983,FR -3575665984,3575666047,NL -3575666048,3575666191,FR -3575666192,3575666207,GB -3575666208,3575666431,FR -3575666432,3575666495,DE -3575666496,3575667791,FR -3575667792,3575667807,FI -3575667808,3575667903,FR -3575667904,3575667967,CZ -3575667968,3575668271,FR -3575668272,3575668279,ES -3575668280,3575668447,FR -3575668448,3575668479,PL -3575668480,3575669247,FR -3575669248,3575669263,DE -3575669264,3575669375,FR -3575669376,3575669503,IE -3575669504,3575670779,FR -3575670780,3575670783,DE -3575670784,3575670911,FR -3575670912,3575671039,ES -3575671040,3575671103,GB -3575671104,3575671615,FR -3575671616,3575671679,FI -3575671680,3575671807,BE -3575671808,3575671855,FR -3575671856,3575671871,GB -3575671872,3575671935,NL -3575671936,3575672063,IT -3575672064,3575672703,FR -3575672704,3575672831,DE -3575672832,3575672911,FR -3575672912,3575672927,LT -3575672928,3575672959,PL -3575672960,3575673087,FR -3575673088,3575673343,GB -3575673344,3575674831,FR -3575674832,3575674847,LT -3575674848,3575675215,FR -3575675216,3575675231,PL -3575675232,3575675295,FR -3575675296,3575675327,LT -3575675328,3575675391,NL -3575675392,3575675399,FR -3575675400,3575675407,ES -3575675408,3575675615,FR -3575675616,3575675647,PL -3575675648,3575676255,FR -3575676256,3575676271,GB -3575676272,3575693311,FR -3575693312,3575697407,DE -3575697408,3575701503,IT -3575701504,3575703551,GB -3575703552,3575705599,SE -3575705600,3575707647,DK -3575707648,3575708671,LU -3575708672,3575709695,IQ -3575709696,3575742463,AT -3575742464,3575775231,RU -3575775232,3575824383,NL -3575824384,3575832575,KW -3575832576,3575840767,NL -3575840768,3575873535,GB -3575873536,3575906303,EE -3575906304,3575971839,FR -3575971840,3576037375,ES -3576038208,3576038271,GB -3576038336,3576038463,GB -3576038528,3576038591,GB -3576038912,3576038975,GB -3576039168,3576039231,GB -3576039360,3576039383,GB -3576039392,3576039455,GB -3576039520,3576039551,GB -3576039584,3576039647,GB -3576039808,3576039839,GB -3576039904,3576039935,GB -3576040064,3576040127,GB -3576040216,3576040223,GB -3576040272,3576040287,GB -3576040352,3576040383,GB -3576040832,3576040959,GB -3576041472,3576041535,GB -3576041728,3576041791,GB -3576041832,3576041847,GB -3576041864,3576041871,GB -3576041880,3576041887,GB -3576041904,3576041919,GB -3576041936,3576041943,GB -3576041952,3576041975,GB -3576042112,3576042239,GB -3576042496,3576042623,GB -3576042688,3576042695,GB -3576042752,3576042815,GB -3576045584,3576045599,GB -3576045664,3576045679,GB -3576045712,3576045735,GB -3576045800,3576045807,GB -3576045816,3576045823,GB -3576048640,3576048767,GB -3576048960,3576049023,GB -3576049152,3576050047,GB -3576053760,3576054911,GB -3576055104,3576055111,GB -3576055120,3576055127,GB -3576055152,3576055167,GB -3576055184,3576055199,GB -3576055208,3576055215,GB -3576055280,3576055551,GB -3576055808,3576055871,GB -3576055936,3576055999,GB -3576056192,3576056255,GB -3576056320,3576056447,GB -3576056704,3576056767,GB -3576056856,3576056871,GB -3576056880,3576056887,GB -3576056920,3576056927,GB -3576056936,3576056943,GB -3576056952,3576056975,GB -3576056992,3576056999,GB -3576057040,3576057047,GB -3576057632,3576057647,GB -3576057712,3576057743,GB -3576057824,3576057839,GB -3576058880,3576059007,GB -3576059648,3576059679,GB -3576059712,3576059743,GB -3576059776,3576059807,GB -3576060288,3576060351,GB -3576061040,3576061055,GB -3576061120,3576061135,GB -3576061184,3576061247,GB -3576061312,3576061439,GB -3576061584,3576061591,GB -3576061620,3576061631,GB -3576061640,3576061647,GB -3576061688,3576061695,GB -3576062464,3576062479,GB -3576064320,3576064448,GB -3576064544,3576064559,GB -3576065856,3576065887,GB -3576066304,3576066431,GB -3576067072,3576067199,GB -3576068352,3576068479,GB -3576068864,3576068927,GB -3576069056,3576069119,GB -3576069248,3576069279,GB -3576069312,3576069343,GB -3576070696,3576070703,GB -3576070712,3576070719,GB -3576070728,3576070735,GB -3576070776,3576070783,GB -3576071296,3576071423,GB -3576071552,3576071679,GB -3576071936,3576071951,GB -3576072064,3576072079,GB -3576072288,3576072319,GB -3576072416,3576072447,GB -3576073216,3576073279,GB -3576074752,3576074879,GB -3576075264,3576075327,GB -3576075776,3576075903,GB -3576076272,3576076351,GB -3576076568,3576076575,GB -3576076784,3576076791,GB -3576077440,3576077471,GB -3576077568,3576077695,GB -3576077936,3576077967,GB -3576078144,3576078175,GB -3576078464,3576078591,GB -3576080000,3576080127,GB -3576080224,3576080255,GB -3576080776,3576080783,GB -3576080792,3576080799,GB -3576080808,3576080815,GB -3576080824,3576080831,GB -3576082080,3576082111,GB -3576082192,3576082223,GB -3576082688,3576082943,GB -3576084480,3576084543,GB -3576084608,3576084671,GB -3576084704,3576084735,GB -3576084864,3576084927,GB -3576085184,3576085215,GB -3576086016,3576086143,GB -3576086368,3576086399,GB -3576086496,3576086527,GB -3576086568,3576086571,GB -3576086576,3576086591,GB -3576086600,3576086603,GB -3576087808,3576087823,GB -3576087952,3576087967,GB -3576088032,3576088047,GB -3576088224,3576088231,GB -3576088376,3576088383,GB -3576088480,3576088511,GB -3576088960,3576088967,GB -3576089024,3576089039,GB -3576089440,3576089471,GB -3576089776,3576089791,GB -3576091408,3576091423,GB -3576091456,3576091479,GB -3576091968,3576091983,GB -3576092000,3576092031,GB -3576092128,3576092159,GB -3576092864,3576092895,GB -3576093064,3576093071,GB -3576093184,3576093247,GB -3576095232,3576096767,GB -3576099072,3576099327,GB -3576099840,3576100863,GB -3576101376,3576103491,GB -3576103492,3576103495,HU -3576103496,3576104911,GB -3576104912,3576104927,ES -3576104928,3576106879,GB -3576106880,3576106943,DE -3576106944,3576107863,GB -3576107864,3576107871,FR -3576107872,3576109991,GB -3576109992,3576110015,NL -3576110016,3576110939,GB -3576110940,3576110943,NL -3576110944,3576114255,GB -3576114256,3576114271,FR -3576114272,3576114463,GB -3576114464,3576114471,US -3576114472,3576116127,GB -3576116128,3576116135,DE -3576116136,3576120315,GB -3576120316,3576120319,SG -3576120320,3576125959,GB -3576125960,3576125963,BE -3576125964,3576126779,GB -3576126780,3576126783,ES -3576126784,3576134653,GB -3576134654,3576134654,CH -3576134655,3576135679,GB -3576135680,3576168447,DE -3576168448,3576233983,GB -3576233984,3576236543,FR -3576236544,3576238463,GB -3576238464,3576238464,FR -3576238465,3576240383,GB -3576240384,3576240511,BE -3576240512,3576240639,ES -3576240640,3576241991,GB -3576241992,3576241999,FR -3576242000,3576242383,GB -3576242384,3576242391,FR -3576242392,3576248583,GB -3576248584,3576248591,AT -3576248592,3576248625,GB -3576248626,3576248626,SK -3576248627,3576248727,GB -3576248728,3576248735,AT -3576248736,3576251711,GB -3576251712,3576251775,FR -3576251776,3576253807,GB -3576253808,3576253815,FR -3576253816,3576254511,GB -3576254512,3576254527,FR -3576254528,3576254695,GB -3576254696,3576254703,FR -3576254704,3576254775,GB -3576254776,3576254783,FR -3576254784,3576255303,GB -3576255304,3576255311,ES -3576255312,3576255359,GB -3576255360,3576255367,FR -3576255368,3576256511,GB -3576256512,3576258559,FR -3576258560,3576258927,GB -3576258928,3576258935,FR -3576258936,3576260607,GB -3576260608,3576260623,FR -3576260624,3576261631,GB -3576261632,3576262655,FR -3576262656,3576263919,GB -3576263920,3576263935,FR -3576263936,3576264255,GB -3576264256,3576264263,FR -3576264264,3576264351,GB -3576264352,3576264359,FR -3576264360,3576264375,GB -3576264376,3576264383,FR -3576264384,3576264679,GB -3576264680,3576264687,FR -3576264688,3576265359,GB -3576265360,3576265367,FR -3576265368,3576266751,GB -3576266752,3576299519,FR -3576299520,3576365055,AE -3576365056,3576430591,TR -3576430592,3576496127,FR -3576496128,3576561663,IT -3576561664,3576622100,NL -3576622101,3576622101,GB -3576622102,3576627199,NL -3576627200,3576692735,AT -3576692736,3576758271,GB -3576758272,3576823807,BE -3576823808,3576889343,SE -3576889344,3576954879,NL -3576954880,3576987647,NO -3576987648,3576999935,GB -3576999936,3577000191,AU -3577000192,3577020415,GB -3577020416,3577085951,NL -3577085952,3577151487,DE -3577151488,3577153535,RE -3577153536,3577157631,FR -3577157632,3577158911,RE -3577158912,3577160703,FR -3577160704,3577163775,RE -3577163776,3577164073,FR -3577164074,3577164074,RE -3577164075,3577165464,FR -3577165465,3577165465,RE -3577165466,3577165823,FR -3577165824,3577167871,RE -3577167872,3577184255,ET -3577184256,3577217023,CH -3577217024,3577238112,FR -3577238113,3577238113,RE -3577238114,3577282559,FR -3577282560,3577348095,IL -3577348096,3577413631,PT -3577413632,3577454591,RU -3577454592,3577458687,UA -3577458688,3577479167,RU -3577479168,3577544703,ES -3577544704,3577545983,DE -3577545984,3577546111,SE -3577546112,3577596527,DE -3577596528,3577596543,IT -3577596544,3577596623,DE -3577596624,3577596639,IT -3577596640,3577596743,DE -3577596744,3577596751,IT -3577596752,3577610239,DE -3577626176,3577626239,GB -3577628672,3577629695,CH -3577635840,3577636863,DE -3577636864,3577637887,GB -3577639744,3577639775,FR -3577641200,3577641215,FR -3577641472,3577641983,FR -3577650048,3577650063,NL -3577663488,3577664511,SE -3577669632,3577670655,BE -3577675776,3577741311,PT -3577741312,3578003455,SE -3578003456,3578265599,DE -3578265600,3578331135,GB -3578331136,3578339327,PL -3578339328,3578347519,ES -3578347520,3578363903,DE -3578363904,3578396671,NL -3578396672,3578462207,TR -3578462208,3578527743,NL -3578527744,3578576895,PL -3578576896,3578593279,ES -3578593280,3578626047,PL -3578626048,3578658815,ES -3578658816,3578724351,GB -3578724352,3578732543,RU -3578732544,3578740735,IE -3578740736,3578757119,RU -3578757120,3578808575,SE -3578808576,3578808831,FI -3578808832,3578822655,SE -3578822656,3578855423,RU -3578855424,3578888191,GB -3578888192,3578920959,SK -3578920960,3578986495,IT -3578986496,3579002879,DE -3579002880,3579019263,GB -3579019264,3579052031,DK -3579052032,3579117567,NL -3579117568,3579183103,RU -3579183104,3579193607,GB -3579193608,3579193615,NL -3579193616,3579193759,GB -3579193760,3579193775,NL -3579193776,3579197311,GB -3579197312,3579197439,US -3579197440,3579209727,GB -3579209728,3579210135,DE -3579210136,3579210143,GB -3579210144,3579210319,DE -3579210320,3579210327,GB -3579210328,3579210663,DE -3579210664,3579210671,GB -3579210672,3579210751,DE -3579210752,3579216033,GB -3579216034,3579216034,DE -3579216035,3579244831,GB -3579244832,3579244879,AT -3579244880,3579248639,GB -3579248640,3579346943,RU -3579346944,3579362055,SE -3579362056,3579362063,NO -3579362064,3579445247,SE -3579445248,3579478015,AT -3579478016,3579480847,FR -3579480848,3579480855,NL -3579480856,3579480863,FR -3579480864,3579480871,NL -3579480872,3579481095,FR -3579481096,3579481103,CH -3579481104,3579481119,FR -3579481120,3579481127,GB -3579481128,3579481143,FR -3579481144,3579481151,CH -3579481152,3579481159,FR -3579481160,3579481167,GB -3579481168,3579481191,FR -3579481192,3579481199,CH -3579481200,3579481247,FR -3579481248,3579481255,GB -3579481256,3579481263,CH -3579481264,3579481279,FR -3579481280,3579481287,GB -3579481288,3579482623,FR -3579482624,3579482783,NL -3579482784,3579482799,FR -3579482800,3579482927,NL -3579482928,3579482943,FR -3579482944,3579482991,NL -3579482992,3579483151,FR -3579483152,3579483263,NL -3579483264,3579483295,FR -3579483296,3579483311,NL -3579483312,3579483359,FR -3579483360,3579483375,NL -3579483376,3579484751,FR -3579484752,3579484767,BE -3579484768,3579485263,FR -3579485264,3579485279,BE -3579485280,3579485695,FR -3579485696,3579485711,GB -3579485712,3579485714,FR -3579485715,3579485727,GB -3579485728,3579485807,FR -3579485808,3579485823,GB -3579485824,3579485887,FR -3579485888,3579485888,GB -3579485889,3579485903,FR -3579485904,3579485919,DE -3579485920,3579485983,FR -3579485984,3579485999,CH -3579486000,3579486015,FR -3579486016,3579486031,GB -3579486032,3579486047,DE -3579486048,3579486095,GB -3579486096,3579486143,FR -3579486144,3579486175,GB -3579486176,3579486191,FR -3579486192,3579486207,GB -3579486208,3579486271,FR -3579486272,3579486287,GB -3579486288,3579486303,FR -3579486304,3579486319,GB -3579486320,3579486335,FR -3579486336,3579486351,GB -3579486352,3579486367,FR -3579486368,3579486383,IT -3579486384,3579486399,DE -3579486400,3579486415,FR -3579486416,3579486431,DE -3579486432,3579486447,GB -3579486448,3579486735,FR -3579486736,3579486751,DE -3579486752,3579486831,FR -3579486832,3579486847,BE -3579486848,3579486863,FR -3579486864,3579486879,GB -3579486880,3579487007,FR -3579487008,3579487039,GB -3579487040,3579487055,DE -3579487056,3579487103,FR -3579487104,3579487119,GB -3579487120,3579487215,FR -3579487216,3579487231,GB -3579487232,3579487247,FR -3579487248,3579487263,GB -3579487264,3579487471,FR -3579487472,3579487487,ES -3579487488,3579487519,FR -3579487520,3579487531,IT -3579487532,3579487535,FR -3579487536,3579487551,GB -3579487552,3579487567,FR -3579487568,3579487583,GB -3579487584,3579487599,FR -3579487600,3579487615,IT -3579487616,3579487663,FR -3579487664,3579487711,DE -3579487712,3579487727,SE -3579487728,3579487743,GB -3579487744,3579487807,FR -3579487808,3579487823,GB -3579487824,3579487855,FR -3579487856,3579487871,GB -3579487872,3579487887,IE -3579487888,3579487903,DE -3579487904,3579487951,FR -3579487952,3579487967,GB -3579487968,3579487983,IT -3579487984,3579487999,GB -3579488000,3579488047,FR -3579488048,3579488079,GB -3579488080,3579490559,FR -3579490560,3579490655,PT -3579490656,3579490671,FR -3579490672,3579490719,PT -3579490720,3579490735,NL -3579490736,3579490751,FR -3579490752,3579490799,PT -3579490800,3579490831,FR -3579490832,3579490943,PT -3579490944,3579490959,FR -3579490960,3579490975,PT -3579490976,3579491007,FR -3579491008,3579491023,PT -3579491024,3579491231,FR -3579491232,3579491247,PT -3579491248,3579491263,NL -3579491264,3579491471,FR -3579491472,3579491487,PT -3579491488,3579497983,FR -3579497984,3579497991,NL -3579497992,3579527167,FR -3579527168,3579543551,BA -3579543552,3579576319,BG -3579576320,3579609087,IT -3579609088,3579641855,PL -3579641856,3579707391,NL -3579707392,3579723775,ES -3579723776,3579740159,AT -3579740160,3579772927,IE -3579772928,3579838463,DE -3579838464,3580039167,ES -3580039168,3580039199,NL -3580039200,3580039231,AT -3580039232,3580039247,ES -3580039248,3580039423,IT -3580039424,3580039515,ES -3580039516,3580039551,NL -3580039552,3580100607,ES -3580100608,3580102143,SE -3580102144,3580104703,LV -3580104704,3580106751,SE -3580106752,3580108799,LV -3580108800,3580112895,SE -3580112896,3580116991,LV -3580116992,3580129279,SE -3580129280,3580131327,LV -3580131328,3580133375,SE -3580133376,3580134399,LV -3580134400,3580135423,SE -3580135424,3580136191,EE -3580136192,3580136447,SE -3580136448,3580141567,HR -3580141568,3580142591,LV -3580142592,3580143615,SE -3580143616,3580145663,LV -3580145664,3580149759,SE -3580149760,3580166143,EE -3580166144,3580198911,SE -3580198912,3580199935,LV -3580199936,3580200447,EE -3580200448,3580203007,LT -3580203008,3580203647,SE -3580203648,3580203775,AT -3580203776,3580204031,SE -3580204032,3580204544,LT -3580204545,3580204799,SE -3580204800,3580204800,LT -3580204801,3580206079,SE -3580206080,3580207103,HR -3580207104,3580208127,SE -3580208128,3580209151,EE -3580209152,3580213247,HR -3580213248,3580215295,LV -3580215296,3580217343,EE -3580217344,3580219391,SE -3580219392,3580221951,LV -3580221952,3580223487,SE -3580223488,3580231679,HR -3580231680,3580231935,SE -3580231936,3580232191,LV -3580232192,3580232447,SE -3580232448,3580233215,LT -3580233216,3580233727,SE -3580233728,3580236799,LT -3580236800,3580237823,SE -3580237824,3580239871,LV -3580239872,3580241919,EE -3580241920,3580243967,SE -3580243968,3580244991,EE -3580244992,3580246015,LT -3580246016,3580248063,LV -3580248064,3580254207,EE -3580254208,3580255231,SE -3580255232,3580259327,LV -3580259328,3580260351,SE -3580260352,3580265471,AT -3580265472,3580265727,SE -3580265728,3580268543,EE -3580268544,3580271359,SE -3580271360,3580271615,LV -3580271616,3580271871,SE -3580271872,3580272639,LV -3580272640,3580280831,SE -3580280832,3580297215,HR -3580297216,3580329983,LT -3580329984,3580338175,EE -3580338176,3580338687,SE -3580338688,3580339199,HR -3580339200,3580340223,EE -3580340224,3580344319,LT -3580344320,3580346367,SE -3580346368,3580362751,LT -3580362752,3580624895,GB -3580624896,3580626943,RU -3580626944,3580628991,PL -3580628992,3580631039,RU -3580631040,3580631551,SE -3580631552,3580632063,NO -3580632064,3580632319,PL -3580632320,3580632831,NL -3580632832,3580633087,LI -3580633088,3580635135,RU -3580635136,3580637183,UA -3580639232,3580641279,PL -3580641280,3580643327,FR -3580643328,3580645375,UA -3580645376,3580647423,PL -3580647424,3580648027,GR -3580648028,3580648028,DE -3580648029,3580649471,GR -3580649472,3580651519,SE -3580651520,3580653567,NL -3580653568,3580655615,PL -3580655616,3580657663,SK -3580657664,3580663807,RU -3580663808,3580665855,PL -3580665856,3580667903,CZ -3580667904,3580669951,RU -3580669952,3580671999,UA -3580672000,3580682239,RU -3580682240,3580684287,PL -3580684288,3580686335,FR -3580688384,3580698623,RU -3580698624,3580702719,PL -3580702720,3580706815,RU -3580706816,3580708863,KG -3580708864,3580710911,RU -3580710912,3580715007,UA -3580715008,3580719103,RU -3580719104,3580723199,NL -3580723200,3580727295,UA -3580727296,3580731391,RU -3580739584,3580743679,RU -3580743680,3580747775,KZ -3580747776,3580751871,UA -3580751872,3580755967,IR -3580755968,3580772351,RU -3580772352,3580780543,LV -3580780544,3580805119,UA -3580805120,3580821503,RU -3580821504,3580837887,FR -3580837888,3580887039,UA -3580887040,3581149183,SE -3581157376,3581158399,AT -3581159424,3581161471,IE -3581173760,3581196287,NL -3581198336,3581199359,NL -3581204480,3581214719,SE -3581214720,3581231103,NL -3581239296,3581241343,NL -3581255680,3581258751,FR -3581280256,3581411327,BE -3581411328,3581673471,GB -3581673472,3581935615,NL -3581935616,3581943807,RU -3581943808,3581951999,FR -3581952000,3581960191,TR -3581960192,3581976575,DE -3581976576,3581984767,NO -3581984768,3581992959,RU -3581992960,3582001151,GB -3582001152,3582009343,DK -3582009344,3582017535,RU -3582017536,3582025727,GB -3582025728,3582030591,RU -3582030592,3582030847,CY -3582030848,3582033919,RU -3582033920,3582042111,CZ -3582042112,3582050303,ES -3582050304,3582058495,NL -3582058496,3582066687,AT -3582066688,3582074879,UA -3582074880,3582077439,GB -3582077440,3582077471,DE -3582077472,3582083071,GB -3582083072,3582084095,BG -3582084096,3582084351,NZ -3582084352,3582084607,CA -3582084608,3582085631,BG -3582085632,3582085887,FI -3582085888,3582087167,BG -3582087168,3582087423,DK -3582087424,3582087679,ES -3582087680,3582087935,CH -3582087936,3582088191,SE -3582088192,3582088447,NL -3582088448,3582088703,IT -3582088704,3582088959,NO -3582088960,3582089215,PT -3582089216,3582091263,BG -3582091264,3582099455,QA -3582099456,3582107647,GB -3582107648,3582115839,NL -3582115840,3582115903,EE -3582115904,3582115935,SE -3582115936,3582115967,EE -3582115968,3582116095,SE -3582116096,3582116351,EE -3582116352,3582116863,SE -3582116864,3582117887,EE -3582117888,3582120959,LT -3582120960,3582121983,EE -3582121984,3582124031,LT -3582124032,3582132223,FI -3582132224,3582140415,RU -3582140416,3582148607,GE -3582148608,3582156799,EG -3582156800,3582164991,GB -3582164992,3582173183,SE -3582173184,3582181375,GB -3582181376,3582197759,DE -3582197760,3582205951,DK -3582205952,3582214143,AE -3582214144,3582222335,RU -3582222336,3582225719,SE -3582225720,3582225727,FI -3582225728,3582227391,SE -3582227392,3582227455,FI -3582227456,3582230527,SE -3582230528,3582238719,BE -3582238720,3582251319,NL -3582251320,3582251327,FI -3582251328,3582255103,NL -3582255104,3582263295,KW -3582263296,3582271487,ME -3582271488,3582279679,NL -3582279680,3582283775,GB -3582283776,3582287871,CY -3582287872,3582296063,DE -3582296064,3582304255,GB -3582304256,3582312447,UA -3582312448,3582313855,JE -3582313856,3582313871,GB -3582313872,3582320639,JE -3582320640,3582328831,CH -3582328832,3582337023,HU -3582337024,3582345215,ES -3582345216,3582353407,IT -3582353408,3582361599,SE -3582361600,3582377983,PL -3582377984,3582386175,RU -3582386176,3582394367,NL -3582394368,3582402559,DE -3582402560,3582410751,PL -3582410752,3582435327,RU -3582435328,3582443519,MK -3582443520,3582451711,DE -3582451712,3582459903,LU -3582459904,3582468095,NL -3582468096,3582476239,SE -3582476240,3582476247,DK -3582476248,3582476287,SE -3582476288,3582484479,DE -3582484480,3582492671,CI -3582492672,3582509055,IT -3582509056,3582517247,SA -3582517248,3582525439,PL -3582525440,3582533631,IM -3582533632,3582541823,IT -3582541824,3582550015,US -3582550016,3582558207,RS -3582569024,3582569031,AT -3582570912,3582570943,FR -3582572416,3582572423,CH -3582574592,3582582783,DE -3582582784,3582590975,RU -3582590976,3582599167,FR -3582599168,3582607359,DE -3582607360,3582615551,RU -3582615552,3582623743,GB -3582623744,3582631935,FI -3582631936,3582640127,NO -3582640128,3582648319,RU -3582648320,3582656511,PT -3582656512,3582664703,ES -3582664704,3582669823,JO -3582669824,3582669951,PR -3582669952,3582669967,JO -3582669968,3582670011,PR -3582670012,3582670012,JO -3582670013,3582670079,PR -3582670080,3582672895,JO -3582672896,3582681087,DE -3582681088,3582689279,FR -3582689280,3582697471,DE -3582697472,3582705663,FI -3582722048,3582730239,IT -3582730240,3582736383,ES -3582736384,3582737407,DZ -3582737408,3582738431,ES -3582738432,3582746623,DK -3582746624,3582754815,RU -3582754816,3582763007,GR -3582763008,3582771199,FI -3582771200,3582779391,CY -3582779392,3582787583,RU -3582787584,3582795775,PT -3582795776,3582803967,ES -3582803968,3582812159,SE -3582812160,3582820351,FI -3582820352,3582828543,RU -3582828544,3582836735,KZ -3582836736,3582853119,RU -3582853120,3582861311,SE -3582861312,3582869503,RU -3582869504,3582877695,NO -3582877696,3582885887,AT -3582885888,3582892031,TR -3582892032,3582892543,US -3582892544,3582894079,TR -3582894080,3582902271,CH -3582902272,3582910463,RU -3582910464,3582916607,SI -3582916608,3582917631,ZA -3582917632,3582918655,LU -3582918656,3582926847,GB -3582926848,3582935039,ES -3582935040,3582943231,SI -3582943232,3582951423,AT -3582951424,3582959615,GB -3582959616,3582967807,FI -3582967808,3582975999,DE -3582976000,3582984191,TR -3582984192,3582992383,DE -3582992384,3583000575,ES -3583000576,3583008767,IT -3583008768,3583016959,TR -3583016960,3583025151,CH -3583025152,3583031807,IT -3583031808,3583032063,GR -3583032064,3583033343,IT -3583033344,3583041535,FR -3583041536,3583049727,NL -3583049728,3583066111,RU -3583066112,3583074303,DE -3583074304,3583082495,BG -3583082496,3583090687,KG -3583090688,3583098879,NO -3583098880,3583107071,FI -3583107072,3583115263,AT -3583115264,3583123455,CH -3583123456,3583131647,PL -3583131648,3583131709,DE -3583131710,3583131710,DK -3583131711,3583148031,DE -3583148032,3583164415,GB -3583164416,3583172607,PT -3583172608,3583188991,DE -3583188992,3583197183,RU -3583197184,3583205375,KE -3583205376,3583213567,HR -3583213568,3583221759,IR -3583221760,3583229951,AT -3583229952,3583238143,RU -3583238144,3583246335,GB -3583246336,3583254527,RU -3583254528,3583262719,GB -3583262720,3583270911,TR -3583270912,3583287295,DE -3583287296,3583295487,RU -3583295488,3583303679,ES -3583303680,3583311871,NL -3583311872,3583320063,RU -3583320064,3583328255,HR -3583328256,3583336447,DE -3583336448,3583337727,ME -3583337728,3583337983,AL -3583337984,3583338143,ME -3583338144,3583338175,RS -3583338176,3583344639,ME -3583344640,3583352831,BG -3583352832,3583361023,CY -3583361024,3583369215,IT -3583369216,3583377407,ES -3583377408,3583385599,AT -3583385600,3583393791,DK -3583393792,3583401983,RU -3583401984,3583410175,KE -3583410176,3583418367,SE -3583418368,3583426559,TN -3583426560,3583428607,CV -3583428608,3583434751,ZA -3583434752,3583442943,AT -3583442944,3583451135,RU -3583451136,3583459327,IL -3583459328,3583467519,CZ -3583467520,3583475711,ES -3583475712,3583483903,NO -3583483904,3583492095,FR -3583492096,3583508479,SK -3583508480,3583516671,FR -3583516672,3583524863,GB -3583524864,3583533055,EG -3583533056,3583541247,DE -3583541248,3583549439,RU -3583549440,3583557631,NL -3583557632,3583565823,IT -3583565824,3583566847,GB -3583566848,3583567103,NL -3583567104,3583574015,GB -3583574016,3583582207,NO -3583582208,3583590399,AT -3583590400,3583598591,DE -3583598592,3583602943,SE -3583602944,3583603072,UA -3583603073,3583603073,SE -3583603074,3583603199,UA -3583603200,3583606783,SE -3583606784,3583639551,TR -3583639552,3583647743,AZ -3583647744,3583655935,EG -3583655936,3583664127,SN -3583664128,3583680511,RO -3583680512,3583688703,RU -3583688704,3583696895,UA -3583696896,3583705087,NL -3583705088,3583713279,UA -3583713280,3583721471,CZ -3583721472,3583729663,DE -3583729664,3583737855,TR -3583742824,3583742831,DE -3583742976,3583743487,PL -3583743616,3583743743,GB -3583744112,3583744127,SE -3583744128,3583744255,PL -3583744320,3583744383,GB -3583744512,3583744767,GB -3583744960,3583744991,GB -3583745216,3583745279,SE -3583745536,3583745663,CZ -3583746048,3583754239,PL -3583754240,3583762431,RU -3583762432,3583770623,CZ -3583770624,3583778815,NL -3583778816,3583787007,IT -3583787008,3583795199,UA -3583795200,3583803391,PL -3583803392,3583811583,RU -3583811584,3583819775,DE -3583819776,3583827967,RU -3583827968,3583836159,CH -3583836160,3583844351,DE -3583844352,3583852543,KZ -3583852544,3583860735,FI -3583860736,3583868927,HU -3583868928,3583877119,AT -3583877120,3583885311,RO -3583885312,3583893503,GE -3583893504,3583901695,SI -3583901696,3583909887,RU -3583909888,3583918079,SE -3583918080,3583926271,IT -3583926272,3583934463,DE -3583934464,3583942655,CH -3583942656,3583950847,EG -3583950848,3583959039,PL -3583959040,3583967231,NO -3583967232,3583969279,TR -3583969280,3583969791,FR -3583969792,3583970047,US -3583970048,3583970303,CA -3583970304,3583971327,US -3583971328,3583973887,NL -3583973888,3583974399,IT -3583974400,3583975423,TR -3583975424,3583983231,LT -3583983232,3583983359,BR -3583983360,3583983615,LT -3583983616,3583999999,RU -3584000000,3584001023,IE -3584001024,3584004095,US -3584004096,3584008191,CH -3584008192,3584016383,SE -3584016384,3584024575,RU -3584024576,3584032767,UA -3584032768,3584040959,DE -3584040960,3584049151,CH -3584049152,3584057343,DE -3584057344,3584065535,GB -3584065536,3584073727,UA -3584073728,3584081919,SK -3584081920,3584082007,NL -3584082008,3584082015,AT -3584082016,3584090111,NL -3584090112,3584096255,NO -3584096256,3584098303,NL -3584098304,3584106495,SI -3584106496,3584114687,FI -3584114688,3584122879,GB -3584122880,3584131071,PL -3584131072,3584139263,TR -3584139264,3584147455,NO -3584147456,3584155647,FR -3584155648,3584163839,NO -3584163840,3584172031,CH -3584172032,3584180223,FR -3584180224,3584188415,AT -3584188416,3584196607,GB -3584196608,3584204799,DE -3584204800,3584212991,NL -3584212992,3584221183,ES -3584221184,3584229375,NO -3584229376,3584245759,HU -3584245760,3584253951,NL -3584253952,3584262143,AL -3584262144,3584270335,SE -3584270336,3584278527,FR -3584278528,3584286719,GB -3584286720,3584303103,AT -3584303104,3584311295,ES -3584311296,3584319487,DE -3584319488,3584327679,LT -3584327680,3584335871,DE -3584335872,3584344063,ES -3584344064,3584352255,SE -3584352256,3584360447,RO -3584360448,3584368639,GB -3584368640,3584376831,SA -3584376832,3584393215,DE -3584393216,3584401407,GB -3584401408,3584409599,MT -3584409600,3584417791,RU -3584417792,3584434175,GB -3584434176,3584442367,LU -3584442368,3584450559,GB -3584458752,3584466943,SA -3584466944,3584475135,NO -3584475136,3584483327,FR -3584483328,3584491519,DE -3584491520,3584499711,BG -3584499712,3584507903,RU -3584507904,3584509231,GB -3584509232,3584509239,AW -3584509240,3584509855,GB -3584509856,3584509871,AW -3584509872,3584512942,GB -3584512943,3584512943,JE -3584512944,3584516095,GB -3584516096,3584524287,NO -3584524288,3584532479,IS -3584532480,3584540671,DE -3584540672,3584548863,RU -3584549888,3584550911,FR -3584550912,3584552959,IT -3584552960,3584557055,FR -3584557056,3584565247,EE -3584565248,3584573439,RU -3584573440,3584589823,DE -3584589824,3584598015,RU -3584598016,3584606207,CZ -3584606208,3584614399,DE -3584614400,3584620543,IE -3584620544,3584621567,GB -3584621568,3584622591,IE -3584622592,3584630783,FI -3584630784,3584638975,BG -3584638976,3584647167,UA -3584647168,3584655359,LU -3584655360,3584661247,CY -3584661248,3584661503,MT -3584661504,3584663551,CY -3584663552,3584671743,FR -3584671744,3584688127,NL -3584688128,3584696319,GB -3584696320,3584701751,ES -3584701752,3584701823,NL -3584701824,3584701991,ES -3584701992,3584702007,CH -3584702008,3584703095,ES -3584703096,3584703103,BE -3584703104,3584704511,ES -3584704512,3584720895,RU -3584720896,3584729087,GB -3584729088,3584737279,DE -3584745472,3584753663,DK -3584753664,3584770047,RU -3584770048,3584778239,NL -3584778240,3584786431,IT -3584786432,3584794623,NL -3584794624,3584802815,IT -3584802816,3584811007,GB -3584811008,3584819199,ES -3584819200,3584827391,RU -3584827392,3584835583,ES -3584835584,3584843775,AZ -3584843776,3584851967,DE -3584851968,3584860159,ZA -3584860160,3584868351,PL -3584868352,3584876543,NO -3584876544,3584884735,SI -3584884736,3584892927,DE -3584901120,3584909311,AT -3584909312,3584917503,IT -3584917504,3584925695,FI -3584925696,3584933887,CH -3584933888,3584942079,SE -3584942080,3584950271,DK -3584950272,3584958463,UA -3584958464,3584966655,DE -3584966656,3584974847,DK -3584974848,3584983039,FR -3584983040,3584991231,US -3584991232,3584999423,IT -3584999424,3585007615,GB -3585007616,3585015807,AT -3585015808,3585023999,IT -3585024000,3585032191,CZ -3585032192,3585048575,LV -3585048576,3585056767,GB -3585056768,3585064959,LB -3585064960,3585081343,GB -3585081344,3585114111,IR -3585114112,3585122303,IS -3585122304,3585130495,ES -3585130496,3585138687,FR -3585138688,3585146879,RU -3585146880,3585155071,RO -3585155072,3585163263,GB -3585163264,3585171455,BE -3585171456,3585179647,RU -3585179648,3585196031,BE -3585196032,3585204223,ES -3585204224,3585212415,GB -3585212416,3585220607,DE -3585220608,3585228799,RU -3585228800,3585236991,DE -3585236992,3585245183,HU -3585245184,3585253375,GB -3585253376,3585261567,DE -3585261568,3585269759,IT -3585269760,3585277951,SY -3585277952,3585286143,SE -3585286144,3585288959,NO -3585288960,3585291007,GB -3585291008,3585292543,NO -3585292544,3585292863,GB -3585292864,3585292895,NO -3585292896,3585293263,GB -3585293264,3585293271,ZA -3585293272,3585294335,GB -3585294336,3585302527,DE -3585302528,3585310719,ES -3585310720,3585318911,DE -3585318912,3585327103,DZ -3585327104,3585335295,NL -3585335296,3585343487,UA -3585343488,3585351679,EE -3585351680,3585359871,CZ -3585359872,3585368063,SE -3585368064,3585376255,LV -3585376256,3585384447,PL -3585384448,3585392639,CH -3585392640,3585400831,RU -3585400832,3585409023,FR -3585409024,3585417215,RU -3585417216,3585425407,BE -3585425408,3585433599,ES -3585433600,3585441791,IS -3585441792,3585449983,SK -3585449984,3585458175,SA -3585458176,3585466367,HU -3585466368,3585474559,EG -3585474560,3585482751,DE -3585482752,3585490943,FR -3585490944,3585499135,IT -3585499136,3585515519,DE -3585515520,3585523711,RU -3585523712,3585531903,LV -3585531904,3585540095,AT -3585540096,3585548287,DE -3585548288,3585548543,NL -3585548544,3585548799,RU -3585548800,3585550399,DE -3585550400,3585550591,NL -3585550592,3585550847,RU -3585550848,3585551103,DE -3585551104,3585551359,NL -3585551360,3585551615,DE -3585551616,3585552127,NL -3585552128,3585552383,DE -3585552384,3585552639,RU -3585552640,3585552895,DE -3585552896,3585553151,RU -3585553152,3585553407,NL -3585553408,3585553663,BG -3585553664,3585555007,RU -3585555008,3585555967,NL -3585555968,3585556479,BG -3585556480,3585564671,DE -3585564672,3585572863,RU -3585572864,3585581055,IT -3585581056,3585597439,DE -3585597440,3585605631,RU -3585605632,3585613823,PL -3585613824,3585622015,EE -3585630208,3585632255,IL -3585632256,3585632511,GB -3585632512,3585632639,NL -3585632640,3585632767,IL -3585632768,3585633535,GB -3585633536,3585634047,IT -3585634048,3585634303,CZ -3585634304,3585634559,IT -3585634560,3585634687,IL -3585634688,3585634815,NL -3585634816,3585635071,IT -3585635072,3585635199,NL -3585635200,3585635327,IL -3585635328,3585635583,AE -3585635584,3585635711,NL -3585635712,3585635839,IL -3585635840,3585635903,CZ -3585635904,3585635967,NO -3585635968,3585636031,HU -3585636032,3585636095,SK -3585636096,3585637375,IL -3585637376,3585637503,NL -3585637504,3585637631,IL -3585637632,3585637887,HR -3585637888,3585638399,IL -3585638400,3585646591,RU -3585646592,3585654783,SA -3585654784,3585662975,NO -3585662976,3585671167,BY -3585671168,3585679359,SE -3585679360,3585687551,FI -3585687552,3585695743,DE -3585695744,3585703935,GB -3585703936,3585712127,DE -3585712128,3585720319,AT -3585720320,3585728511,GB -3585728512,3585736703,SE -3585736704,3585744895,HR -3585744896,3585747839,FR -3585747840,3585747903,GB -3585747904,3585749295,FR -3585749296,3585749311,ES -3585749312,3585750015,FR -3585750016,3585750031,GB -3585750032,3585750271,FR -3585750272,3585750287,ES -3585750288,3585750335,FR -3585750336,3585750351,GB -3585750352,3585750367,FR -3585750368,3585750383,ES -3585750384,3585750399,PT -3585750400,3585753087,FR -3585753088,3585761279,PL -3585761280,3585765375,UA -3585765376,3585765631,RU -3585765632,3585767679,UA -3585767680,3585768191,RU -3585768192,3585769215,UA -3585769216,3585769471,RU -3585769472,3585777663,TR -3585777664,3585785855,JO -3585785856,3585794047,UA -3585794048,3585802239,FI -3585802240,3585810431,IT -3585810432,3585818623,GB -3585818624,3585826815,DE -3585826816,3585835007,RU -3585835008,3585843199,NL -3585843200,3585851391,NO -3585851392,3585859583,SE -3585859584,3585860607,AF -3585860608,3585861631,RU -3585861632,3585863679,EE -3585863680,3585865471,NL -3585865472,3585865727,LB -3585865728,3585865983,UA -3585865984,3585867775,EE -3585867776,3585875967,NO -3585875968,3585884159,CH -3585884160,3585892351,IQ -3585892352,3585900543,DE -3585900544,3585906687,NO -3585906688,3585907711,CZ -3585907712,3585908735,NO -3585908736,3585916927,GP -3585916928,3585925119,IT -3585925120,3585933311,CH -3585933312,3585941503,NL -3585941504,3585949695,PL -3585949696,3585957887,KW -3585957888,3585966079,SE -3585966080,3585974271,CH -3585974272,3585982463,BE -3585982464,3585998847,RU -3586007040,3586015231,LT -3586015232,3586022687,FR -3586022688,3586022688,GB -3586022689,3586022689,TN -3586022690,3586022690,SE -3586022691,3586022691,BE -3586022692,3586022692,DK -3586022693,3586022693,DE -3586022694,3586022694,IT -3586022695,3586023423,FR -3586023424,3586031615,IS -3586031616,3586039807,IE -3586039808,3586047999,GB -3586048000,3586056191,PT -3586056192,3586072575,RU -3586072576,3586088959,DE -3586088960,3586097151,CZ -3586097152,3586105343,HR -3586105344,3586121727,BG -3586121728,3586129919,IE -3586129920,3586146303,CZ -3586146304,3586162687,PL -3586162688,3586179071,FI -3586179072,3586195455,ES -3586195456,3586203647,RU -3586203648,3586205695,ZA -3586205696,3586207743,BW -3586207744,3586211071,ZA -3586211072,3586211327,BW -3586211328,3586211839,ZA -3586211840,3586228223,CH -3586228224,3586244607,BE -3586244608,3586246655,NL -3586246656,3586248703,BE -3586248704,3586252799,NL -3586252800,3586254847,BE -3586254848,3586258943,NL -3586258944,3586259455,BE -3586259456,3586260991,NL -3586260992,3586271807,GB -3586271808,3586271823,IT -3586271824,3586272799,GB -3586272800,3586272807,IT -3586272808,3586273015,GB -3586273016,3586273023,IT -3586273024,3586277375,GB -3586277376,3586293759,TR -3586293760,3586310143,ES -3586310144,3586326527,CZ -3586326528,3586342911,IR -3586342912,3586359295,ES -3586359296,3586375679,PL -3586375680,3586392063,CZ -3586392064,3586405375,NL -3586405376,3586406399,RU -3586406400,3586408447,NL -3586408448,3586424831,BA -3586424832,3586441215,CH -3586441216,3586457599,DE -3586457600,3586473983,NL -3586473984,3586490367,HU -3586490368,3586506751,LT -3586506752,3586523135,NL -3586523136,3586544267,DE -3586544268,3586544271,DK -3586544272,3586544383,DE -3586544384,3586544511,DK -3586544512,3586546687,DE -3586546688,3586546943,NL -3586546944,3586555903,DE -3586555904,3586572287,IT -3586572288,3586585215,RS -3586585216,3586585223,XK -3586585224,3586586255,RS -3586586256,3586586263,XK -3586586264,3586588671,RS -3586588672,3586596863,IT -3586596864,3586605055,GB -3586605056,3586621439,SE -3586621440,3586625535,NL -3586625536,3586625711,IE -3586625712,3586625719,GB -3586625720,3586628118,IE -3586628119,3586628119,GB -3586628120,3586628127,IE -3586628128,3586628159,AT -3586628160,3586628191,IE -3586628192,3586628223,NL -3586628224,3586628255,AT -3586628256,3586628319,IE -3586628320,3586628351,AT -3586628352,3586628607,IE -3586628608,3586629631,GB -3586629632,3586631935,IE -3586631936,3586632191,CN -3586632192,3586634047,IE -3586634048,3586634079,NL -3586634080,3586634239,IE -3586634240,3586634527,NL -3586634528,3586634543,IE -3586634544,3586634623,NL -3586634624,3586634783,IE -3586634784,3586634815,NL -3586634816,3586634847,IE -3586634848,3586634911,NL -3586634912,3586634943,FI -3586634944,3586635007,NL -3586635008,3586635519,IE -3586635520,3586635775,NL -3586635776,3586637823,IE -3586637824,3586654207,PL -3586654208,3586662399,GE -3586662400,3586670591,UA -3586670592,3586675967,DE -3586675968,3586676223,RO -3586676224,3586676991,DE -3586676992,3586677434,RO -3586677435,3586677435,DE -3586677436,3586677631,RO -3586677632,3586677639,DE -3586677640,3586677643,GB -3586677644,3586677647,SG -3586677648,3586677655,US -3586677656,3586679599,RO -3586679600,3586679615,IT -3586679616,3586680511,RO -3586680512,3586680519,GB -3586680520,3586680831,RO -3586680832,3586680959,FR -3586680960,3586681471,RO -3586681472,3586681487,GB -3586681488,3586681527,RO -3586681528,3586681535,GB -3586681536,3586681615,RO -3586681616,3586681631,CZ -3586681632,3586681855,RO -3586681856,3586682111,FR -3586682112,3586682225,RO -3586682226,3586682226,IE -3586682227,3586682239,RO -3586682240,3586682367,US -3586682368,3586682415,RO -3586682416,3586682423,DE -3586682424,3586682495,RO -3586682496,3586682879,FR -3586682880,3586686975,US -3586686976,3586703359,SE -3586703360,3586719743,CH -3586719744,3586752511,ES -3586752512,3586785279,NL -3586785280,3586793471,OM -3586793472,3586801663,CH -3586801664,3586818047,HR -3586818048,3586834431,IE -3586834432,3586850815,DE -3586850816,3586867199,NO -3586867200,3586883583,FR -3586883584,3586899967,IT -3586899968,3586910207,DE -3586910208,3586910719,NL -3586910720,3586911231,BE -3586911232,3586916351,DE -3586916352,3586924543,IT -3586924544,3586925695,FI -3586925696,3586925759,AX -3586925760,3586928639,FI -3586928640,3586929663,AX -3586929664,3586932735,FI -3586932736,3586949119,LB -3586949120,3586965503,SE -3586965504,3586981887,NL -3586981888,3586998271,IT -3586998272,3587006463,PT -3587006464,3587014655,FR -3587014656,3587055615,GB -3587055616,3587063807,UZ -3587063808,3587080191,NL -3587080192,3587082447,GB -3587082448,3587082448,MZ -3587082449,3587082449,NG -3587082450,3587082450,NO -3587082451,3587082451,PT -3587082452,3587082452,QA -3587082453,3587082453,RO -3587082454,3587082454,RS -3587082455,3587082455,SA -3587082456,3587082456,SI -3587082457,3587082457,SK -3587082458,3587082458,TN -3587082459,3587082459,TR -3587082460,3587082460,TZ -3587082461,3587082461,UA -3587082462,3587082462,UG -3587082463,3587082463,ZA -3587082464,3587082475,GB -3587082476,3587082476,LB -3587082477,3587082477,MA -3587082478,3587082478,ME -3587082479,3587082479,MK -3587082480,3587088383,GB -3587088384,3587096575,DE -3587096576,3587121151,NL -3587121152,3587129343,AL -3587129344,3587145727,NL -3587145728,3587162111,CY -3587162112,3587178495,IR -3587178496,3587186687,AT -3587186688,3587186943,DE -3587186944,3587187199,GB -3587187200,3587187455,DE -3587187456,3587187711,GB -3587187712,3587188223,DE -3587188224,3587188479,AM -3587188480,3587193087,DE -3587193088,3587193599,GB -3587193600,3587194879,DE -3587194880,3587211263,GB -3587211264,3587219455,AT -3587219456,3587227647,RU -3587227648,3587227648,NL -3587227649,3587231231,GB -3587231232,3587231263,NL -3587231264,3587233087,GB -3587233088,3587233095,NL -3587233096,3587234191,GB -3587234192,3587234207,NL -3587234208,3587235839,GB -3587235840,3587237887,NL -3587237888,3587239487,GB -3587239488,3587239495,NL -3587239496,3587239551,GB -3587239552,3587239552,NL -3587239553,3587239583,GB -3587239584,3587239599,NL -3587239600,3587239711,GB -3587239712,3587239727,NL -3587239728,3587239791,GB -3587239792,3587239799,NL -3587239800,3587242671,GB -3587242672,3587242679,NL -3587242680,3587244031,GB -3587244032,3587260415,IT -3587260416,3587278591,DE -3587278592,3587279359,PT -3587279360,3587279615,DE -3587279616,3587280383,PT -3587280384,3587281151,DE -3587281152,3587284991,PT -3587284992,3587286527,FR -3587286784,3587289599,FR -3587290112,3587293183,FR -3587293184,3587309567,IT -3587309568,3587325951,GB -3587325952,3587342335,RU -3587342336,3587358719,CZ -3587358720,3587375103,SA -3587375104,3587383295,TR -3587383296,3587391487,CZ -3587391488,3587407871,KZ -3587407872,3587408127,BE -3587408128,3587408383,NL -3587408384,3587414015,BE -3587414016,3587414264,NL -3587414265,3587414265,BE -3587414266,3587415807,NL -3587415808,3587422463,BE -3587422464,3587423743,NL -3587423744,3587424255,BE -3587424256,3587440639,DE -3587440640,3587445759,SE -3587445760,3587445823,FI -3587445824,3587445983,SE -3587445984,3587445999,FI -3587446000,3587446143,SE -3587446144,3587446271,FI -3587446272,3587449087,SE -3587449088,3587449151,DK -3587449152,3587457023,SE -3587457024,3587473407,GB -3587473408,3587489791,IT -3587489792,3587506175,EG -3587506176,3587538943,IT -3587538944,3587547135,IS -3587547136,3587555327,CH -3587555328,3587571711,BE -3587571712,3587579903,DE -3587579904,3587588095,BE -3587588096,3587596287,BG -3587596288,3587604479,NL -3587604480,3587620863,FI -3587620864,3587637247,SE -3587637248,3587646975,FR -3587646976,3587647231,MC -3587647232,3587653631,FR -3587653632,3587670015,SK -3587670016,3587684279,IT -3587684280,3587684287,GB -3587684288,3587702783,IT -3587702784,3587710975,DE -3587710976,3587719167,CZ -3587719168,3587735551,PL -3587735552,3587751935,GB -3587751936,3587768319,FI -3587776512,3587784703,IR -3587784704,3587801087,DE -3587801088,3587817471,IT -3587817472,3587833855,MT -3587833856,3587842047,DE -3587842048,3587850239,IT -3587850240,3587854335,NL -3587854336,3587866623,PL -3587866624,3587874815,FR -3587874816,3587883007,DE -3587883008,3587915775,GB -3587915776,3587932159,EE -3587932160,3587948543,BE -3587948544,3587964927,RU -3587964928,3587981311,ES -3587981312,3587997695,IS -3587997696,3588014079,DE -3588014080,3588030463,CZ -3588030464,3588046847,RU -3588046848,3588063231,DE -3588063232,3588071423,CH -3588071424,3588079615,GB -3588079616,3588095999,CH -3588096000,3588104191,NL -3588104192,3588112383,BG -3588112384,3588128767,RE -3588128768,3588145151,HU -3588145152,3588153343,PL -3588153344,3588161535,RU -3588161536,3588173311,FR -3588173312,3588173567,RE -3588173568,3588173823,YT -3588173824,3588227071,FR -3588227072,3588292607,BE -3588292608,3588308991,AT -3588308992,3588325375,NO -3588325376,3588333567,GB -3588333568,3588341759,FR -3588341760,3588358143,IT -3588358144,3588374527,BG -3588390912,3588394239,LT -3588394240,3588394495,LV -3588394496,3588407295,LT -3588407296,3588423679,CZ -3588423680,3588440063,ES -3588440064,3588456447,PL -3588456448,3588464639,NL -3588464640,3588465151,AT -3588465152,3588465663,FR -3588465664,3588466431,AT -3588466432,3588466687,AU -3588466688,3588467199,DE -3588467200,3588467455,JP -3588467456,3588472831,AT -3588472832,3588489215,UA -3588489216,3588505599,FR -3588505600,3588521983,RU -3588521984,3588538367,PT -3588538368,3588554751,GB -3588554752,3588571135,AT -3588571136,3588587519,GB -3588587520,3588588567,ES -3588588568,3588588575,IT -3588588576,3588590591,ES -3588590592,3588590847,FR -3588590848,3588595199,ES -3588595200,3588595455,FR -3588595456,3588603903,ES -3588603904,3588620287,SI -3588620288,3588628479,SA -3588628480,3588636671,CH -3588636672,3588653055,UZ -3588653056,3588661247,IT -3588661248,3588666367,NO -3588666368,3588667391,DE -3588667392,3588668415,SG -3588668416,3588669439,HK -3588669440,3588685823,GB -3588685824,3588702207,UA -3588702208,3588718591,ES -3588718592,3588734975,BG -3588734976,3588751359,PL -3588751360,3588767743,TR -3588779648,3588779775,GB -3588784128,3588800511,CH -3588800512,3588801535,RU -3588801536,3588802047,KZ -3588802048,3588802815,RU -3588802816,3588803071,KZ -3588803072,3588807167,RU -3588807168,3588808959,KZ -3588808960,3588810239,RU -3588810240,3588810751,KZ -3588810752,3588813311,RU -3588813312,3588814079,KZ -3588814080,3588814335,RU -3588814336,3588814847,KZ -3588814848,3588816895,RU -3588816896,3588833279,IT -3588833280,3588849663,RO -3588849664,3588857855,IE -3588857856,3588866047,IR -3588866048,3588882431,NL -3588882432,3588890623,RU -3588890624,3588898815,GB -3588898816,3588915199,NO -3588915200,3588931583,IT -3588931584,3588947967,RU -3588947968,3588964351,GB -3588964352,3588997119,CZ -3588997120,3589013503,AT -3589013504,3589021695,ES -3589021696,3589029887,SA -3589029888,3589030119,GB -3589030120,3589030127,NL -3589030128,3589031055,GB -3589031056,3589031056,NL -3589031057,3589043455,GB -3589043456,3589043711,NL -3589043712,3589046271,GB -3589046272,3589079039,NO -3589079040,3589128191,DK -3589128192,3589144575,GB -3589144576,3589152767,UA -3589152768,3589160959,DE -3589160960,3589177343,PL -3589177344,3589193727,TR -3589193728,3589210111,SE -3589210112,3589226495,NL -3589226496,3589242879,NO -3589242880,3589259263,NL -3589259264,3589275647,DE -3589275648,3589292031,RS -3589292032,3589308415,AT -3589308416,3589324799,DE -3589324800,3589341183,BG -3589341184,3589373951,PL -3589373952,3589390335,DE -3589390336,3589423103,RU -3589423104,3589425011,GB -3589425012,3589425015,PT -3589425016,3589428863,GB -3589428864,3589428991,SE -3589428992,3589430591,GB -3589430592,3589430655,ES -3589430656,3589431295,GB -3589431296,3589431311,ES -3589431312,3589431327,PT -3589431328,3589432319,ES -3589432320,3589433855,GB -3589433856,3589434111,IE -3589434112,3589435759,GB -3589435760,3589435763,ES -3589435764,3589439487,GB -3589439488,3589455871,SE -3589455872,3589472255,RU -3589472256,3589488639,TR -3589488640,3589505023,RU -3589505024,3589521407,FI -3589521408,3589537791,IT -3589537792,3589545983,FR -3589545984,3589554175,DE -3589554176,3589570559,PS -3589570560,3589572735,GB -3589572736,3589572863,NL -3589572864,3589580799,GB -3589580800,3589581823,NL -3589581824,3589582719,GB -3589582720,3589582847,NL -3589582848,3589582975,GB -3589582976,3589583103,NL -3589583104,3589586943,GB -3589586944,3589587199,DE -3589587200,3589587455,NL -3589587456,3589587967,CH -3589587968,3589588991,GB -3589588992,3589599231,RS -3589599232,3589601279,SE -3589601280,3589603327,RS -3589603328,3589668863,FR -3589668864,3589670911,LT -3589670912,3589672959,RU -3589672960,3589675007,LT -3589675008,3589676031,RU -3589676032,3589677055,LT -3589677056,3589685247,FR -3589685248,3589718015,GB -3589718016,3589722023,BE -3589722024,3589722031,FR -3589722032,3589734399,BE -3589734400,3589742591,ZA -3589742592,3589746175,NL -3589746176,3589746687,US -3589746688,3589767167,NL -3589767168,3589810431,RU -3589810432,3589810687,PL -3589810688,3589816319,RU -3589819562,3589819563,GB -3589825792,3589825807,DE -3589825808,3589825809,US -3589825810,3589826047,DE -3589826718,3589826718,AT -3589827584,3589827647,DE -3589828736,3589828863,NL -3589828992,3589829119,ES -3589829504,3589829631,DE -3589832704,3589849087,TR -3589849088,3589865471,GB -3589865472,3589881855,GR -3589881856,3589890047,NL -3589890048,3589891839,GB -3589891840,3589891967,BE -3589891968,3589931007,GB -3589931008,3589947391,SI -3589947392,3589963775,FI -3589963776,3589980159,ES -3589980160,3589996543,CZ -3589996544,3589998591,GB -3589998592,3589998607,ES -3589998608,3589998639,GB -3589998640,3589998655,DE -3589998656,3589998999,GB -3589999000,3589999007,DE -3589999008,3589999031,GB -3589999032,3589999039,DE -3589999040,3590000191,GB -3590000192,3590000207,DE -3590000208,3590001967,GB -3590001968,3590001983,IT -3590001984,3590005055,GB -3590005056,3590005071,DE -3590005072,3590005119,GB -3590005120,3590005135,IT -3590005136,3590005407,GB -3590005408,3590005423,SE -3590005424,3590008879,GB -3590008880,3590008887,DE -3590008888,3590009103,GB -3590009104,3590009119,DE -3590009120,3590009263,GB -3590009264,3590009279,DE -3590009280,3590012927,GB -3590012928,3590029311,BE -3590029312,3590032159,FR -3590032160,3590032175,ES -3590032176,3590032191,GB -3590032192,3590032207,PL -3590032208,3590032223,NL -3590032224,3590032271,DE -3590032272,3590032295,PT -3590032296,3590032303,PL -3590032304,3590032311,CZ -3590032312,3590032319,LT -3590032320,3590032351,ES -3590032352,3590045695,FR -3590045696,3590047743,RU -3590047744,3590049791,UA -3590049792,3590062079,RU -3590062080,3590078463,DE -3590078464,3590094847,RU -3590094848,3590111231,DE -3590111232,3590127615,LT -3590127616,3590143999,GB -3590144000,3590156287,SI -3590156288,3590157311,HR -3590157312,3590158335,RS -3590158336,3590158591,SI -3590158592,3590158847,RS -3590158848,3590160383,SI -3590160384,3590176767,GB -3590176768,3590193151,HU -3590193152,3590201343,IT -3590201344,3590209535,DE -3590209536,3590225919,ES -3590225920,3590234111,TR -3590234112,3590242303,GB -3590242304,3590244351,US -3590244352,3590244607,DE -3590244608,3590245255,IE -3590245256,3590245271,GB -3590245272,3590245279,DE -3590245280,3590245311,IE -3590245312,3590245439,US -3590245440,3590247048,IE -3590247049,3590247049,IT -3590247050,3590247103,IE -3590247104,3590247119,GB -3590247120,3590247167,IE -3590247168,3590247231,US -3590247232,3590247295,IE -3590247296,3590247423,US -3590247424,3590247487,IE -3590247488,3590247551,US -3590247552,3590251647,IE -3590251648,3590251775,NL -3590251776,3590253567,IE -3590253568,3590254079,FR -3590254080,3590254854,IE -3590254855,3590254855,GB -3590254856,3590255871,IE -3590255872,3590255935,US -3590255936,3590256127,IE -3590256128,3590256383,ES -3590256384,3590256735,IE -3590256736,3590256767,BE -3590256768,3590257151,US -3590257152,3590258559,IE -3590258560,3590258687,US -3590258688,3590291455,IT -3590291456,3590299647,NG -3590299648,3590307839,FI -3590307840,3590308951,GB -3590308952,3590308959,GH -3590308960,3590309615,GB -3590309616,3590309623,BF -3590309624,3590311223,GB -3590311224,3590311231,CD -3590311232,3590317951,GB -3590317952,3590318015,UA -3590318016,3590324223,GB -3590324224,3623890943,US -3623890944,3623891199,ZA -3623891200,3623891455,US -3623891456,3623891711,ZA -3623891712,3623891967,US -3623891968,3623892479,ZA -3623892480,3624054783,US -3624054784,3624056831,ZA -3624056832,3624181759,US -3624181760,3624182783,ZA -3624182784,3624206335,US -3624206336,3624208383,ZA -3624208384,3624255487,US -3624255488,3624257535,ZA -3624257536,3624271871,US -3624271872,3624272383,SY -3624272384,3624272447,US -3624272448,3624272455,CA -3624272456,3624272639,US -3624272640,3624272895,DZ -3624272896,3624281087,US -3624281088,3624281343,HT -3624281344,3624284671,US -3624284672,3624284927,CA -3624284928,3624287743,US -3624287744,3624287999,CA -3624288000,3624288255,US -3624288256,3624290303,IN -3624290304,3624292351,CA -3624292352,3624292607,MF -3624292608,3624295176,US -3624295177,3624295177,SG -3624295178,3624295423,US -3624295424,3624295679,CA -3624295680,3624295935,US -3624295936,3624296191,LY -3624296192,3624296447,US -3624296448,3624296703,CA -3624296704,3624297471,US -3624297472,3624298495,CO -3624298496,3624299519,PH -3624299520,3624300031,US -3624300032,3624300287,LY -3624300288,3624302335,US -3624302336,3624302591,CA -3624302592,3624303871,US -3624303872,3624304127,CA -3624304128,3624321023,US -3624321024,3624325119,CA -3624325120,3624357887,US -3624357888,3624358143,KN -3624358144,3624359679,US -3624359680,3624360703,CW -3624360704,3624386559,US -3624386560,3624394751,CA -3624394752,3624402943,US -3624402944,3624411135,JP -3624411136,3624435711,US -3624435712,3624443903,CA -3624443904,3624443919,US -3624443920,3624452095,CA -3624452096,3624480767,US -3624480768,3624484863,CA -3624484864,3624525823,US -3624529920,3624534015,CA -3624534016,3624540671,US -3624540672,3624541183,GB -3624541184,3624587263,US -3624587264,3624591359,JM -3624591360,3624592383,US -3624592384,3624593919,CA -3624593920,3624595455,US -3624595456,3624599551,IN -3624599552,3624714239,US -3624714240,3624722431,SG -3624722432,3624730623,US -3624730624,3624796159,CA -3624796160,3624828927,US -3624828928,3624833023,CA -3624833024,3624845311,US -3624845312,3624849407,AU -3624849408,3624984575,US -3624984576,3624992767,CA -3624992768,3625058303,US -3625058304,3625091071,CA -3625091072,3625116927,US -3625116928,3625117183,SE -3625117184,3625118233,US -3625118234,3625118241,CA -3625118242,3625118271,US -3625118272,3625118287,CA -3625118288,3625140223,US -3625140224,3625148415,CA -3625148416,3625168895,US -3625168896,3625172991,CA -3625172992,3625256959,US -3625256960,3625257983,CA -3625257984,3625261055,US -3625263104,3625287679,US -3625287680,3625295871,CA -3625295872,3625346047,US -3625346048,3625346303,AR -3625346304,3625418751,US -3625418752,3625426943,CA -3625426944,3625508863,US -3625508864,3625512959,CA -3625512960,3625517055,US -3625517056,3625517311,CA -3625517312,3625517567,US -3625517568,3625518079,CA -3625518080,3625518335,US -3625518336,3625518847,CA -3625518848,3625519103,US -3625519104,3625519871,CA -3625519872,3625520127,US -3625520128,3625520639,CA -3625520640,3625521151,US -3625521152,3625521407,CA -3625521408,3625521663,US -3625521664,3625522687,CA -3625522688,3625522943,US -3625522944,3625523199,CA -3625523200,3625523455,US -3625523456,3625523967,CA -3625523968,3625524223,US -3625524224,3625524735,CA -3625524736,3625524991,US -3625524992,3625525503,CA -3625525504,3625526015,US -3625526016,3625526271,CA -3625526272,3625526527,US -3625526528,3625526783,CA -3625526784,3625527295,US -3625527296,3625528575,CA -3625528576,3625529087,US -3625529088,3625529599,CA -3625529600,3625529855,US -3625529856,3625531391,CA -3625531392,3625531647,US -3625531648,3625531903,CA -3625531904,3625532671,US -3625532672,3625535743,CA -3625535744,3625535999,US -3625536000,3625537535,CA -3625537536,3625538303,US -3625538304,3625538559,CA -3625538560,3625542655,US -3625542656,3625543167,CA -3625543168,3625544191,US -3625544192,3625547263,CA -3625547264,3625547519,US -3625547520,3625548287,CA -3625548288,3625549567,US -3625549568,3625549823,CA -3625549824,3625631743,US -3625631744,3625639935,CA -3625639936,3625961983,US -3625961984,3625962239,GB -3625962240,3626091519,US -3626091520,3626092031,AR -3626092032,3626233655,US -3626233656,3626233663,GB -3626233664,3626234111,US -3626234112,3626234367,GB -3626234368,3626270719,US -3626270720,3626287103,CA -3626287104,3626332159,US -3626332160,3626336255,CA -3626336256,3626508287,US -3626508288,3626512383,CA -3626512384,3626515967,US -3626515968,3626516223,GB -3626516224,3626524671,US -3626524672,3626532863,CA -3626532864,3626852351,US -3626852352,3626860543,CA -3626860544,3626893311,US -3626893312,3626905599,CA -3626905600,3626926079,US -3626926080,3626934271,CA -3626934272,3627044863,US -3627044864,3627048959,CA -3627048960,3627049983,AG -3627049984,3627065343,US -3627065344,3627069439,CA -3627069440,3627220223,US -3627220224,3627220479,CA -3627220480,3627299071,US -3627299072,3627299327,IN -3627299328,3627507711,US -3627507712,3627511807,CA -3627511808,3627532287,US -3627532288,3627544575,CA -3627544576,3627659263,US -3627659264,3627663359,CA -3627663360,3627667561,US -3627667562,3627667562,CA -3627667563,3627667564,US -3627667565,3627667565,CA -3627667566,3627679743,US -3627679744,3627712511,CA -3627712512,3627753471,US -3627753472,3627753727,AR -3627753728,3627759071,US -3627759072,3627759103,GB -3627759104,3627760127,US -3627760128,3627760383,NL -3627760384,3627760895,US -3627760896,3627761151,SG -3627761152,3627802623,US -3627802624,3627810815,CA -3627810816,3628138495,US -3628138496,3628138751,CA -3628138752,3628139263,US -3628139264,3628139359,CA -3628139360,3628139375,US -3628139376,3628140543,CA -3628140544,3628140799,US -3628140800,3628141055,CA -3628141056,3628141311,US -3628141312,3628143615,CA -3628143616,3628144383,US -3628144384,3628145151,CA -3628145152,3628145919,US -3628145920,3628146175,AU -3628146176,3628147199,CA -3628147200,3628147455,US -3628147456,3628147967,CA -3628147968,3628148223,US -3628148224,3628149247,CA -3628149248,3628150015,US -3628150016,3628150271,CA -3628150272,3628150527,US -3628150528,3628150783,CA -3628150784,3628151039,US -3628151040,3628151551,CA -3628151552,3628151807,US -3628151808,3628152063,CA -3628152064,3628152319,US -3628152320,3628153087,CA -3628153088,3628153343,KW -3628153344,3628155135,CA -3628155136,3628155391,US -3628155392,3628156159,CA -3628156160,3628157183,US -3628157184,3628157439,CA -3628157440,3628157951,US -3628157952,3628158207,CA -3628158208,3628158463,US -3628158464,3628158719,CA -3628158720,3628158975,US -3628158976,3628159231,CA -3628159232,3628159487,US -3628159488,3628159743,CA -3628159744,3628159807,US -3628159808,3628160255,CA -3628160256,3628160767,US -3628160768,3628161535,CA -3628161536,3628161791,US -3628161792,3628162047,CA -3628162048,3628162303,US -3628162304,3628162559,CA -3628162560,3628162815,US -3628162816,3628163071,CA -3628163072,3628163327,US -3628163328,3628165375,CA -3628165376,3628165631,US -3628165632,3628166143,CA -3628166144,3628167167,US -3628167168,3628167679,CA -3628167680,3628168063,US -3628168064,3628168191,CA -3628168192,3628168959,US -3628168960,3628169999,CA -3628170000,3628170015,US -3628170016,3628170495,CA -3628170496,3628179455,US -3628179456,3628187647,CA -3628187648,3628225097,US -3628225098,3628225098,AT -3628225099,3628225387,US -3628225388,3628225395,GB -3628225396,3628225779,US -3628225780,3628225783,GB -3628225784,3628226927,US -3628226928,3628226935,IE -3628226936,3628227167,US -3628227168,3628227199,PL -3628227200,3628236799,US -3628236800,3628257279,CA -3628257280,3628552191,US -3628552192,3628556287,CA -3628556288,3628580863,US -3628580864,3628589055,CA -3628589056,3628598271,US -3628598272,3628599295,CO -3628599296,3628603391,CL -3628603392,3628604415,US -3628604416,3628605439,GT -3628605440,3628608511,IL -3628608512,3628609023,VE -3628609024,3628613375,US -3628613376,3628613631,HN -3628613632,3628614399,ID -3628614400,3628614911,CO -3628614912,3628615167,US -3628615168,3628615679,IL -3628615680,3628616191,US -3628616192,3628617215,PR -3628617216,3628617471,HN -3628617472,3628617727,US -3628617728,3628618239,CO -3628618240,3628619775,HN -3628619776,3628622847,US -3628622848,3628623871,PR -3628623872,3628625919,NG -3628625920,3628626175,PA -3628626176,3628626943,HN -3628626944,3628627199,CO -3628627200,3628627455,IL -3628627456,3628627711,HN -3628627712,3628628991,SV -3628628992,3628629247,GT -3628629248,3628629503,US -3628629504,3628631807,VE -3628631808,3628634111,CO -3628634112,3628636159,AR -3628636160,3628636671,VE -3628636672,3628636927,US -3628636928,3628637183,VE -3628637184,3628637695,CO -3628637696,3628638207,US -3628638208,3628646399,CL -3628646400,3628646911,US -3628646912,3628647423,HN -3628647424,3628647679,SZ -3628647680,3628648959,CO -3628648960,3628649215,US -3628649216,3628649727,CO -3628649728,3628654079,US -3628654080,3628654591,PA -3628654592,3628654847,US -3628654848,3628655103,CR -3628655104,3628655359,VE -3628655360,3628657663,CO -3628657664,3628657919,VE -3628657920,3628658175,BS -3628658176,3628679167,US -3628679168,3628683263,CA -3628683264,3628747775,US -3628747776,3628748287,LU -3628748288,3628748799,AU -3628748800,3628753663,US -3628753664,3628753919,FR -3628753920,3628754943,AT -3628754944,3628755967,BE -3628755968,3628756991,AR -3628756992,3628759039,DE -3628759040,3628761087,CN -3628761088,3628834815,US -3628834816,3628843007,CA -3628843008,3629187071,US -3629187072,3629195263,CA -3629195264,3629199359,US -3629199360,3629201439,CA -3629201440,3629201447,US -3629201448,3629201471,CA -3629201472,3629201475,US -3629201476,3629201495,CA -3629201496,3629201499,US -3629201500,3629201503,CA -3629201504,3629201507,US -3629201508,3629201935,CA -3629201936,3629201939,US -3629201940,3629202103,CA -3629202104,3629202107,US -3629202108,3629203455,CA -3629203456,3629318143,US -3629318144,3629326335,CA -3629326336,3629539327,US -3629539328,3629547519,CA -3629547520,3629613055,US -3629613056,3629613311,SE -3629613312,3629614591,US -3629614592,3629614847,DE -3629614848,3629615103,NL -3629615104,3629615359,US -3629615360,3629615615,GB -3629615616,3629615871,JP -3629615872,3629616383,US -3629616384,3629616639,FR -3629616640,3629616895,US -3629616896,3629617151,HK -3629617152,3629662207,US -3629662208,3629662463,GB -3629662464,3629737215,US -3629737216,3629737471,CA -3629737472,3629767935,US -3629767936,3629768191,CA -3629768192,3629789439,US -3629789440,3629789695,CA -3629789696,3629789951,US -3629789952,3629790207,CA -3629790208,3629839103,US -3629839104,3629839359,CA -3629839360,3630040063,US -3630040064,3630040319,CA -3630040320,3630040431,US -3630040432,3630040447,CA -3630040448,3630040575,US -3630040576,3630040831,CA -3630040832,3630041343,US -3630041344,3630041599,CA -3630041600,3630045439,US -3630045440,3630046207,CA -3630046208,3630046719,US -3630046720,3630047487,CA -3630047488,3630047999,US -3630048000,3630048255,CA -3630048256,3630048511,US -3630048512,3630049599,CA -3630049600,3630050047,US -3630050048,3630050303,CA -3630050304,3630050559,US -3630050560,3630050815,CA -3630050816,3630051839,US -3630051840,3630052607,CA -3630052608,3630053887,US -3630053888,3630054143,CA -3630054144,3630054655,US -3630054656,3630055167,CA -3630055168,3630055935,US -3630055936,3630056959,CA -3630056960,3630057407,US -3630057408,3630057471,CA -3630057472,3630057727,US -3630057728,3630057983,CA -3630057984,3630058751,US -3630058752,3630059007,CA -3630059008,3630059263,US -3630059264,3630059519,CA -3630059520,3630061567,US -3630061568,3630062079,CA -3630062080,3630062335,US -3630062336,3630062591,CA -3630062592,3630062847,US -3630062848,3630063871,CA -3630063872,3630063935,US -3630063936,3630063951,CA -3630063952,3630066431,US -3630066432,3630066687,CA -3630066688,3630066943,US -3630066944,3630067711,CA -3630067712,3630068991,US -3630068992,3630069247,CA -3630069248,3630069503,US -3630069504,3630069759,CA -3630069760,3630071295,US -3630071296,3630071551,CA -3630071552,3630072831,US -3630072832,3630073343,CA -3630073344,3630074879,US -3630074880,3630075135,CA -3630075136,3630082303,US -3630082304,3630082559,CA -3630082560,3630082815,US -3630082816,3630083071,CA -3630083072,3630085631,US -3630085632,3630085887,CA -3630085888,3630087679,US -3630087680,3630087935,CA -3630087936,3630088447,US -3630088448,3630088959,CA -3630088960,3630091519,US -3630091520,3630091775,CA -3630091776,3630093567,US -3630093568,3630093823,CA -3630093824,3630096127,US -3630096128,3630096383,CA -3630096384,3630097151,US -3630097152,3630097663,CA -3630097664,3630102783,US -3630102784,3630103807,CA -3630103808,3630104063,US -3630104064,3630104575,CA -3630104576,3630141951,US -3630141952,3630142207,CA -3630142208,3630148095,US -3630148096,3630148607,CA -3630148608,3630148863,US -3630148864,3630149119,CA -3630149120,3630151679,US -3630151680,3630152191,CA -3630152192,3630152703,US -3630152704,3630152959,CA -3630152960,3630153727,US -3630153728,3630157823,CA -3630157824,3630159615,US -3630159616,3630159871,CA -3630159872,3630160127,US -3630160128,3630160383,CA -3630160384,3630161151,US -3630161152,3630161407,CA -3630161408,3630162431,US -3630162432,3630162687,CA -3630162688,3630163199,US -3630163200,3630163455,CA -3630163456,3630164991,US -3630164992,3630165247,CA -3630165248,3630165503,US -3630165504,3630166015,CA -3630166016,3630169855,US -3630169856,3630170111,CA -3630170112,3630313471,US -3630313472,3630317567,CA -3630317568,3630354431,US -3630354432,3630358527,BR -3630358528,3630375423,US -3630375424,3630383103,CA -3630383104,3630391295,US -3630391296,3630395391,CA -3630395392,3630417407,US -3630417408,3630417663,AU -3630417664,3630417919,US -3630417920,3630418175,CA -3630418176,3630418431,AU -3630418432,3630418943,US -3630418944,3630419199,AU -3630419200,3630423551,US -3630423552,3630423807,GB -3630423808,3630718975,US -3630718976,3630727167,CA -3630727168,3630745599,US -3630745600,3630746367,UG -3630746368,3630746623,US -3630746624,3630747647,UG -3630747648,3630780415,US -3630780416,3630784511,CA -3630784512,3630850047,US -3630850048,3630854143,CA -3630854144,3630895615,US -3630895616,3630895871,CA -3630895872,3630900735,US -3630900736,3630900991,CA -3630900992,3630905599,US -3630905600,3630905855,CA -3630905856,3630956543,US -3630956544,3631005695,CA -3631005696,3631017983,US -3631017984,3631022079,HK -3631022080,3631112191,US -3631112192,3631112703,VC -3631112704,3631116543,BB -3631116544,3631117567,GD -3631117568,3631117823,BB -3631117824,3631118079,GD -3631118080,3631119103,VC -3631119104,3631119615,BB -3631119616,3631120383,GD -3631120384,3631144959,US -3631144960,3631153151,CA -3631153152,3631284223,US -3631284224,3631316991,CA -3631316992,3631333375,US -3631333376,3631341567,CA -3631341568,3631611903,US -3631611904,3631628287,AU -3631628288,3631644671,US -3631644672,3631652863,CA -3631652864,3631665151,US -3631665152,3631667199,CA -3631667200,3631667455,US -3631667456,3631668735,CA -3631668736,3631806207,US -3631806208,3631806463,NL -3631806464,3631841279,US -3631841280,3631874047,CA -3631874048,3631874303,US -3631874304,3631874559,CA -3631874560,3631875583,US -3631875584,3631876095,CA -3631876096,3631878399,US -3631878400,3631878991,CA -3631878992,3631878999,US -3631879000,3631879175,CA -3631879176,3631879183,US -3631879184,3631879663,CA -3631879664,3631879679,US -3631879680,3631880191,CA -3631880192,3631881727,US -3631881728,3631882239,CA -3631882240,3631884543,US -3631884544,3631885055,CA -3631885056,3631885311,US -3631885312,3631885823,CA -3631885824,3631889663,US -3631889664,3631890175,CA -3631890176,3631890431,US -3631890432,3631890687,CA -3631890688,3631890943,US -3631890944,3631891199,CA -3631891200,3631891711,US -3631891712,3631891967,CA -3631891968,3631892479,US -3631892480,3631892735,CA -3631892736,3631893503,US -3631893504,3631893759,CA -3631893760,3631894015,US -3631894016,3631894271,CA -3631894272,3631897599,US -3631897600,3631897855,CA -3631897856,3631898111,US -3631898112,3631898367,CA -3631898368,3631901439,US -3631901440,3631901951,CA -3631901952,3631907071,US -3631907072,3631907839,CA -3631907840,3631908351,US -3631908352,3631908607,CA -3631908608,3631910911,US -3631910912,3631911423,CA -3631911424,3631911679,US -3631911680,3631911935,CA -3631911936,3631913983,US -3631913984,3631914239,CA -3631914240,3631915263,US -3631915264,3631915519,CA -3631915520,3631920383,US -3631920384,3631920639,CA -3631920640,3631939583,US -3631939584,3632005119,CA -3632005120,3632136191,US -3632144384,3632152575,US -3632152576,3632168959,CA -3632168960,3632187391,US -3632187392,3632188415,CA -3632188416,3632197631,US -3632197632,3632201727,CA -3632201728,3632218271,US -3632218272,3632218287,AU -3632218288,3632218295,US -3632218296,3632218303,SG -3632218304,3632244223,US -3632244224,3632244479,CA -3632244480,3632275455,US -3632275456,3632283647,NL -3632283648,3632284879,US -3632284880,3632284895,CA -3632284896,3632289583,US -3632289584,3632289599,PH -3632289600,3632291775,US -3632291776,3632291839,GB -3632291840,3632332799,US -3632332800,3632357375,CA -3632357376,3632376319,US -3632376320,3632377343,CA -3632377344,3632381951,US -3632381952,3632390143,CA -3632390144,3632414719,US -3632414720,3632422911,CA -3632422912,3632451583,US -3632451584,3632455679,CA -3632455680,3632857087,US -3632857088,3632861183,BS -3632861184,3632881663,US -3632881664,3632889855,CA -3632889856,3632898047,US -3632898048,3632902143,CA -3632902144,3632971775,US -3632971776,3632988159,CA -3632988160,3633029119,US -3633029120,3633029631,PY -3633029632,3633030655,US -3633030656,3633030911,SN -3633030912,3633031935,US -3633031936,3633032191,PG -3633032192,3633036031,US -3633036032,3633036287,HT -3633036288,3633036543,TT -3633036544,3633336319,US -3633336320,3633340415,KY -3633340416,3633344511,US -3633344512,3633348607,CA -3633348608,3633405951,US -3633405952,3633410047,CA -3633410048,3633479679,US -3633479680,3633483775,CA -3633483776,3633545215,US -3633545216,3633545727,GA -3633545728,3633546239,US -3633546240,3633546751,GA -3633546752,3633547263,US -3633547264,3633548287,GA -3633548288,3633548543,US -3633548544,3633548799,GA -3633548800,3633549567,US -3633549568,3633549823,GA -3633549824,3633567231,US -3633567232,3633567743,NL -3633567744,3633568767,US -3633568768,3633569023,SG -3633569024,3633569279,US -3633569280,3633569535,CA -3633569536,3633709055,US -3633709056,3633717247,CA -3633717248,3633720063,US -3633720064,3633720191,MX -3633720192,3633757439,US -3633757440,3633757695,IN -3633757696,3633757951,US -3633757952,3633758207,PH -3633758208,3633783039,US -3633783296,3633783551,US -3633783552,3633783807,CA -3633783808,3633815807,US -3633815808,3633816063,CA -3633816064,3633818623,US -3633818624,3633819135,CA -3633819136,3633821695,US -3633821696,3633821951,CA -3633821952,3633823743,US -3633823744,3633827839,HK -3633827840,3633872895,US -3633872896,3633874431,CA -3633874432,3633874687,US -3633874688,3633876991,CA -3633876992,3633881087,US -3633881088,3633885183,CW -3633885184,3633889279,US -3633889280,3633893375,CA -3633893376,3633971199,US -3633971200,3634020351,CA -3634020352,3634037247,US -3634037248,3634037759,CA -3634037760,3634040063,US -3634040064,3634040319,CA -3634040320,3634041087,US -3634041088,3634041343,CA -3634041344,3634042111,US -3634042112,3634042367,CA -3634042368,3634046719,US -3634046720,3634046975,CA -3634046976,3634050559,US -3634050560,3634050815,CA -3634050816,3634053119,US -3634053120,3634061311,CL -3634061312,3634094079,US -3634094080,3634098175,SE -3634098176,3634167807,US -3634167808,3634189055,CA -3634189056,3634189311,US -3634189312,3634193263,CA -3634193264,3634193279,US -3634193280,3634193940,CA -3634193941,3634193941,US -3634193942,3634194367,CA -3634194368,3634194399,US -3634194400,3634196479,CA -3634196480,3634257919,US -3634257920,3634262015,SE -3634262016,3634286079,US -3634286080,3634286335,CA -3634286336,3634288895,US -3634288896,3634289151,CA -3634289152,3634506495,US -3634506496,3634506751,CA -3634506752,3634511871,US -3634511872,3634515967,CA -3634515968,3634552831,US -3634552832,3634556927,CA -3634556928,3634741247,US -3634741248,3634749439,CA -3634749440,3634880511,US -3634880512,3634888703,CA -3634888704,3634913279,US -3634913280,3634915663,CA -3634915664,3634915679,US -3634915680,3634921471,CA -3634921472,3634925567,US -3634925568,3634929663,CA -3634929664,3635051103,US -3635051104,3635051119,CA -3635051120,3635051439,US -3635051440,3635051455,CA -3635051456,3635109887,US -3635109888,3635113983,CA -3635113984,3635118079,JP -3635118080,3635142655,US -3635142656,3635146751,CA -3635146752,3635159039,US -3635159040,3635163135,CA -3635163136,3635167231,US -3635167232,3635167487,GB -3635167488,3635171071,NL -3635171072,3635171327,CA -3635171328,3635187967,US -3635187968,3635188223,CN -3635188224,3635314687,US -3635314688,3635322879,CA -3635322880,3635466239,US -3635466240,3635470335,CA -3635470336,3635527679,US -3635527680,3635527935,PR -3635527936,3635528959,US -3635528960,3635529215,PR -3635529216,3635529711,US -3635529712,3635529719,CO -3635529720,3635529983,US -3635529984,3635530751,PR -3635530752,3635531007,US -3635531008,3635531263,PR -3635531264,3635533535,US -3635533536,3635533551,IN -3635533552,3635643391,US -3635643392,3635644415,JP -3635644416,3635645183,TH -3635645184,3635645439,JP -3635645440,3635645951,HK -3635645952,3635646463,TL -3635646464,3635646975,US -3635646976,3635647487,GB -3635647488,3635647743,US -3635647744,3635647999,CA -3635648000,3635648255,TW -3635648256,3635648511,ML -3635648512,3635648767,US -3635648768,3635649023,JP -3635649024,3635650559,US -3635650560,3635652607,HK -3635652608,3635655679,US -3635655680,3635656447,HK -3635656448,3635656703,US -3635656704,3635657727,JP -3635657728,3635659263,US -3635659264,3635660287,ID -3635660288,3635660799,US -3635660800,3635661823,HK -3635661824,3635670527,US -3635670528,3635671039,TL -3635671040,3635674623,US -3635674624,3635675135,HK -3635675136,3635740671,US -3635740672,3635740927,CA -3635740928,3635741439,US -3635741440,3635741695,CA -3635741696,3635741951,US -3635741952,3635745535,CA -3635745536,3635746047,US -3635746048,3635748223,CA -3635748224,3635748351,US -3635748352,3635752447,CA -3635752448,3635752703,US -3635752704,3635765759,CA -3635765760,3635768575,US -3635768576,3635771391,CA -3635771392,3635771647,US -3635771648,3635771903,CA -3635771904,3635772415,US -3635772416,3635772671,CA -3635772672,3635772927,US -3635772928,3635781119,CA -3635781120,3635783167,US -3635783168,3635799551,CA -3635799552,3635800063,US -3635800064,3635804159,CA -3635804160,3635804671,US -3635804672,3635806207,CA -3635806208,3635871743,US -3635871744,3635879935,CA -3635879936,3635892223,US -3635892224,3635896319,CA -3635896320,3635904511,US -3635904512,3635912703,CA -3635912704,3635924991,US -3635924992,3635929087,MV -3635929088,3635961855,US -3635961856,3635963903,SV -3635963904,3635964415,US -3635964416,3635965951,SV -3635965952,3635966323,US -3635966324,3635966324,ES -3635966325,3635966975,US -3635966976,3635967999,PY -3635968000,3635970047,SV -3635970048,3636012543,US -3636012544,3636012799,DE -3636012800,3636019199,US -3636019200,3636027391,CA -3636027392,3636031487,SG -3636031488,3636031743,US -3636031744,3636035583,SG -3636035584,3636064255,US -3636064256,3636068351,CA -3636068352,3636150271,US -3636150272,3636150527,CA -3636150528,3636150783,US -3636150784,3636156415,CA -3636156416,3636156927,US -3636156928,3636157119,CA -3636157120,3636157151,US -3636157152,3636157183,CA -3636157184,3636157439,US -3636157440,3636162559,CA -3636162560,3636163583,US -3636163584,3636164607,CA -3636164608,3636165119,US -3636165120,3636165631,CA -3636165632,3636166143,US -3636166144,3636166655,CA -3636166656,3636206079,US -3636206080,3636206335,AU -3636206336,3636396031,US -3636396032,3636430335,CA -3636430336,3636430591,KY -3636430592,3636461567,CA -3636461568,3636609023,US -3636609024,3636621311,CA -3636621312,3636625407,US -3636625408,3636626431,AR -3636626432,3636626943,BR -3636626944,3636627199,AR -3636627200,3636627455,BR -3636627456,3636628479,MX -3636628480,3636628991,PE -3636628992,3636822015,US -3636822016,3636854783,CA -3636854784,3636887551,US -3636887552,3636895743,CA -3636895744,3636914175,US -3636914176,3636914431,CA -3636914432,3636918527,US -3636918528,3636918783,CA -3636918784,3637075967,US -3637075968,3637080063,CA -3637080064,3637510143,US -3637510144,3637641215,CA -3637641216,3637665791,US -3637665792,3637669887,CA -3637669888,3637706751,US -3637706752,3637739519,CA -3637739520,3637821439,US -3637821440,3637829631,CA -3637829632,3638165503,US -3638165504,3638181887,CA -3638181888,3638226687,US -3638226688,3638226943,NL -3638226944,3638227967,US -3638227968,3638228223,JP -3638228224,3638247935,US -3638247936,3638248703,GB -3638248704,3638249215,US -3638249216,3638249471,GB -3638249472,3638250559,US -3638250560,3638250623,GB -3638250624,3638304767,US -3638304768,3638312959,CA -3638312960,3638366207,US -3638370304,3638386687,CA -3638386688,3638399743,US -3638399744,3638399999,CH -3638400000,3638401087,US -3638401088,3638401119,CA -3638401120,3638500125,US -3638500126,3638500126,CA -3638500127,3638509567,US -3638509568,3638534143,CA -3638534144,3638697983,US -3638697984,3638706175,CA -3638706176,3638874111,US -3638874112,3638878207,CA -3638878208,3638880511,US -3638880512,3638880767,CA -3638880768,3638898943,US -3638898944,3638899455,MX -3638899456,3638984703,US -3638984704,3638992895,GT -3638992896,3638996991,US -3639001088,3639069439,US -3639069440,3639069695,HK -3639069696,3639083007,US -3639083008,3639148543,CA -3639148544,3639222271,US -3639222272,3639230463,CA -3639230464,3639255039,US -3639255040,3639263231,CA -3639263232,3639279615,US -3639279616,3639283711,CA -3639283712,3639390207,US -3639390208,3639394303,ZA -3639394304,3639396351,US -3639396352,3639396383,NE -3639396384,3639396415,US -3639396416,3639396431,PK -3639396432,3639396447,US -3639396448,3639396463,NG -3639396464,3639396471,TZ -3639396472,3639396487,US -3639396488,3639396519,IN -3639396520,3639396543,US -3639396544,3639396551,TZ -3639396552,3639396671,US -3639396672,3639396735,NE -3639396736,3639396743,IN -3639396744,3639396863,US -3639396864,3639396879,NE -3639396880,3639396927,US -3639396928,3639396959,FR -3639396960,3639396975,NG -3639396976,3639396991,US -3639396992,3639397023,CD -3639397024,3639397119,US -3639397120,3639397375,IN -3639397376,3639397631,US -3639397632,3639397887,NG -3639397888,3639398423,US -3639398424,3639398431,LB -3639398432,3639398439,US -3639398440,3639398447,LB -3639398448,3639398527,US -3639398528,3639398591,SA -3639398592,3639398599,LB -3639398600,3639398655,US -3639398656,3639398663,SA -3639398664,3639399679,US -3639399680,3639399935,HN -3639399936,3639400447,US -3639400448,3639401471,RS -3639401472,3639401495,PK -3639401496,3639401511,US -3639401512,3639401519,ID -3639401520,3639401535,US -3639401536,3639401551,TZ -3639401552,3639401559,LK -3639401560,3639401623,US -3639401624,3639401631,TZ -3639401632,3639401647,US -3639401648,3639401655,PK -3639401656,3639401687,US -3639401688,3639401727,PK -3639401728,3639402015,US -3639402016,3639402039,PK -3639402040,3639402055,US -3639402056,3639402071,PK -3639402072,3639402079,US -3639402080,3639402095,PK -3639402096,3639402111,US -3639402112,3639402175,NG -3639402176,3639402191,PK -3639402192,3639402199,US -3639402200,3639402207,PK -3639402208,3639402239,US -3639402240,3639402495,GH -3639402496,3639525375,US -3639529472,3639533567,US -3639533568,3639537663,CA -3639537664,3639550207,US -3639550208,3639550215,AR -3639550216,3639550223,BR -3639550224,3639550239,CA -3639550240,3639550247,MX -3639550248,3639550311,US -3639550312,3639550319,AU -3639550320,3639554559,US -3639554560,3639554665,GB -3639554666,3639554666,US -3639554667,3639554748,GB -3639554749,3639554749,US -3639554750,3639554815,GB -3639554816,3639555839,US -3639555840,3639555847,AR -3639555848,3639555855,BR -3639555856,3639555863,CA -3639555864,3639555871,MX -3639555872,3639555999,US -3639556000,3639556007,AU -3639556008,3639556015,CA -3639556016,3639556023,CO -3639556024,3639556055,US -3639556056,3639556063,BR -3639556064,3639558143,US -3639558144,3639566335,CA -3639566336,3639566847,US -3639566848,3639567103,HK -3639567104,3639593983,US -3639593984,3639595007,GB -3639595008,3639607295,US -3639607296,3639611391,CA -3639611392,3639664639,US -3639664640,3639668735,CA -3639668736,3639672831,US -3639672832,3639681023,CL -3639681024,3639692031,US -3639692032,3639692287,GB -3639692288,3639704573,US -3639704574,3639704574,GB -3639704575,3639705599,US -3639705600,3639713791,CY -3639713792,3639730175,US -3639730176,3639734271,CA -3639734272,3639736575,US -3639736576,3639736831,HK -3639736832,3639737343,US -3639737344,3639737373,GB -3639737374,3639737374,FR -3639737375,3639737599,GB -3639737600,3639737629,US -3639737630,3639737630,GB -3639737631,3639887815,US -3639887816,3639887831,CA -3639887832,3639888351,US -3639888352,3639888359,CA -3639888360,3639888687,US -3639888688,3639888695,CA -3639888696,3639888719,US -3639888720,3639888727,CA -3639888728,3639888767,US -3639888768,3639888775,CA -3639888776,3639888967,US -3639888968,3639888975,CA -3639888976,3639889047,US -3639889048,3639889055,CA -3639889056,3639889063,US -3639889064,3639889071,CA -3639889072,3639889471,US -3639889472,3639889479,CA -3639889480,3639889487,US -3639889488,3639889495,CA -3639889496,3639889647,US -3639889648,3639889655,CA -3639889656,3639889767,US -3639889768,3639889775,CA -3639889776,3639889783,US -3639889784,3639889791,CA -3639889792,3639889815,US -3639889816,3639889823,CA -3639889824,3639889943,US -3639889944,3639889951,CA -3639889952,3639889991,US -3639889992,3639889999,CA -3639890000,3639890055,US -3639890056,3639890063,CA -3639890064,3639890079,US -3639890080,3639890095,CA -3639890096,3639890135,US -3639890136,3639890143,CA -3639890144,3639890239,US -3639890240,3639890247,CA -3639890248,3639890263,US -3639890264,3639890271,CA -3639890272,3639890311,US -3639890312,3639890327,CA -3639890328,3639890399,US -3639890400,3639890415,CA -3639890416,3639890447,US -3639890448,3639890455,CA -3639890456,3639890535,US -3639890536,3639890559,CA -3639890560,3639890607,US -3639890608,3639890623,CA -3639890624,3639890799,US -3639890800,3639890815,CA -3639890816,3639890863,US -3639890864,3639890871,CA -3639890872,3639890887,US -3639890888,3639890903,CA -3639890904,3639890919,US -3639890920,3639890935,CA -3639890936,3639891063,US -3639891064,3639891071,CA -3639891072,3639891127,US -3639891128,3639891135,CA -3639891136,3639891143,US -3639891144,3639891151,CA -3639891152,3639891159,US -3639891160,3639891167,CA -3639891168,3639891359,US -3639891360,3639891367,CA -3639891368,3639891447,US -3639891448,3639891455,CA -3639891456,3639891567,US -3639891568,3639891575,CA -3639891576,3639891623,US -3639891624,3639891639,CA -3639891640,3639891767,US -3639891768,3639891775,CA -3639891776,3639891799,US -3639891800,3639891807,CA -3639891808,3639891847,US -3639891848,3639891855,CA -3639891856,3639891911,US -3639891912,3639891919,CA -3639891920,3639893471,US -3639893472,3639893487,CA -3639893488,3639893495,US -3639893496,3639893503,CA -3639893504,3639893759,ID -3639893760,3639893855,US -3639893856,3639893863,CA -3639893864,3639902207,US -3639902208,3639918591,PE -3639918592,3639934975,AR -3639934976,3640023079,US -3640023080,3640023087,EG -3640023088,3640057855,US -3640057856,3640068095,CA -3640068096,3640073471,US -3640073472,3640080383,CA -3640080384,3640081407,US -3640081408,3640081919,CA -3640081920,3640082431,US -3640082432,3640082943,CA -3640082944,3640083967,US -3640083968,3640084991,CA -3640084992,3640085503,US -3640085504,3640085759,CA -3640085760,3640087551,US -3640087552,3640088319,CA -3640088320,3640090623,US -3640090624,3640095231,CA -3640095232,3640097023,US -3640097024,3640097279,CA -3640097280,3640098815,US -3640098816,3640107007,CA -3640107008,3640111871,US -3640111872,3640112127,CA -3640112128,3640112383,US -3640112384,3640112639,CA -3640112640,3640112895,US -3640112896,3640113151,CA -3640113152,3640115199,US -3640115200,3640118271,CA -3640118272,3640123135,US -3640123136,3640123391,CA -3640123392,3640125439,US -3640125440,3640126463,CA -3640126464,3640126719,US -3640126720,3640127487,CA -3640127488,3640129535,US -3640129536,3640129791,CA -3640129792,3640130303,US -3640130304,3640130559,CA -3640130560,3640131071,US -3640131072,3640131583,CA -3640131584,3640197119,US -3640197120,3640201215,CA -3640201216,3640205311,US -3640205312,3640209407,BM -3640209408,3640213503,CA -3640213504,3640287231,US -3640287232,3640287743,HK -3640287744,3640288255,US -3640288256,3640289279,PH -3640289280,3640290303,HK -3640290304,3640291327,CN -3640291328,3640312319,US -3640312320,3640312575,NI -3640312576,3640312831,US -3640312832,3640313087,TO -3640313088,3640315391,US -3640315392,3640315647,TR -3640315648,3640316927,US -3640316928,3640317183,MX -3640317184,3640318207,US -3640318208,3640318975,NC -3640318976,3640346879,US -3640346880,3640347134,MX -3640347135,3640360959,US -3640360960,3640369151,CA -3640369152,3640410111,US -3640410112,3640418303,CA -3640418304,3640430591,US -3640430592,3640432639,DE -3640432640,3640433407,US -3640433408,3640433663,DE -3640433664,3640438783,US -3640438784,3640442879,DE -3640442880,3640446975,US -3640446976,3640449023,CA -3640449024,3640450047,DE -3640450048,3640451071,US -3640451072,3640459263,DE -3640459264,3640557567,US -3640557568,3640582143,CA -3640582144,3640647679,US -3640647680,3640651775,JP -3640651776,3640655871,US -3640655872,3641180159,DE -3641180160,3641188351,GB -3641188352,3641192447,TJ -3641192448,3641196543,DE -3641196544,3641200639,SA -3641200640,3641204735,RU -3641204736,3641205759,NL -3641205760,3641206015,ES -3641206016,3641206271,NL -3641206272,3641206527,FR -3641206528,3641206783,IE -3641206784,3641208831,NL -3641212928,3641221119,NO -3641221120,3641229311,PL -3641229312,3641237503,CH -3641237504,3641241599,RU -3641241600,3641245695,GB -3641245696,3641249791,UA -3641253888,3641262079,DE -3641262080,3641266175,IT -3641266176,3641270271,RU -3641270272,3641278463,DE -3641278464,3641282559,IS -3641282560,3641286655,RU -3641286656,3641294847,PL -3641294848,3641298943,GB -3641298944,3641303039,SE -3641303040,3641307135,BG -3641307136,3641311231,LT -3641311232,3641315327,DE -3641315328,3641319423,DK -3641319424,3641323519,RU -3641323520,3641331711,DE -3641331712,3641335807,ES -3641335808,3641343999,SE -3641344000,3641356535,GB -3641356536,3641356543,CM -3641356544,3641360383,GB -3641360384,3641368575,RO -3641368576,3641372671,GB -3641372672,3641376767,BG -3641376768,3641380863,IT -3641380864,3641384959,IR -3641384960,3641389055,CH -3641389056,3641393151,DE -3641393152,3641397247,KZ -3641397248,3641401343,IT -3641401344,3641409535,ES -3641409536,3641413631,PL -3641413632,3641417727,DE -3641417728,3641421823,GE -3641421824,3641425919,TJ -3641425920,3641430015,DE -3641430016,3641434111,CH -3641434112,3641442303,CZ -3641442304,3641446399,GB -3641446400,3641450495,ES -3641450496,3641454591,RU -3641454592,3641458687,SK -3641458688,3641462783,RU -3641462784,3641466879,UZ -3641466880,3641470975,RU -3641470976,3641475071,MD -3641475072,3641479167,IT -3641479168,3641483263,GB -3641483264,3641491455,IT -3641491456,3641493503,UA -3641493504,3641494015,NL -3641494016,3641494527,BG -3641494528,3641495551,UA -3641495552,3641496063,NL -3641496064,3641498111,UA -3641498112,3641498367,NL -3641498368,3641499647,UA -3641499648,3641503743,SA -3641503744,3641507839,RU -3641507840,3641516031,NO -3641516032,3641520127,HU -3641520128,3641524223,FR -3641524224,3641528319,DE -3641528320,3641532415,ES -3641532416,3641536511,HU -3641536512,3641540607,ES -3641540608,3641548799,GB -3641548800,3641552895,DE -3641552896,3641556991,AT -3641556992,3641561087,DE -3641561088,3641565183,RU -3641565184,3641573375,SE -3641573376,3641577471,NO -3641577472,3641581567,RU -3641581568,3641585663,ES -3641585664,3641589759,RU -3641589760,3641593855,CH -3641593856,3641597951,NG -3641597952,3641602047,AZ -3641602048,3641606143,DE -3641606144,3641610239,GB -3641610240,3641618431,DE -3641618432,3641622527,GB -3641622528,3641626623,RU -3641626624,3641630719,HR -3641630720,3641634815,AT -3641634816,3641638911,RU -3641638912,3641643007,AT -3641643008,3641647103,RU -3641647104,3641651199,ES -3641651200,3641655295,RU -3641655296,3641659391,GB -3641659392,3641663487,FR -3641663488,3641667583,MT -3641667584,3641668863,GB -3641668864,3641670271,ZW -3641670272,3641670911,GB -3641670912,3641671167,LS -3641671168,3641671679,GB -3641671680,3641679871,RU -3641683968,3641688063,KZ -3641688064,3641692159,RU -3641692160,3641696255,IT -3641696256,3641700351,BE -3641700352,3641704447,SE -3641704448,3641708543,FR -3641708544,3641712639,RU -3641712640,3641716735,NL -3641716736,3641720831,GB -3641720832,3641729023,MK -3641729024,3641733119,DK -3641733120,3641737215,AT -3641737216,3641739263,RS -3641739264,3641741311,XK -3641741312,3641745407,ES -3641745408,3641749503,DE -3641749504,3641753599,CZ -3641753600,3641757695,SE -3641757696,3641761791,GB -3641761792,3641765887,CY -3641765888,3641769983,ES -3641769984,3641774079,NO -3641774080,3641778175,DE -3641778176,3641782271,PL -3641782272,3641786367,GB -3641786368,3641790463,SE -3641790464,3641794559,LT -3641794560,3641798655,RS -3641798656,3641802751,RU -3641802752,3641806847,NL -3641806848,3641810943,TR -3641810944,3641819135,RU -3641819136,3641823231,DE -3641823232,3641827327,NO -3641827328,3641835519,BH -3641835520,3641839615,IT -3641839616,3641843711,GB -3641843712,3641847807,ES -3641851904,3641855999,NL -3641856000,3641860095,GB -3641860096,3641868287,IT -3641868288,3641876479,RU -3641876480,3641880575,ES -3641880576,3641884671,DE -3641884672,3641888767,NO -3641888768,3641892863,IT -3641892864,3641896959,ES -3641896960,3641901055,BG -3641901056,3641901311,RO -3641901312,3641901567,US -3641901568,3641905151,RO -3641905152,3641909247,NL -3641909248,3641913343,AT -3641913344,3641917439,FR -3641917440,3641925631,GR -3641925632,3641933823,RU -3641933824,3641937919,GB -3641937920,3641942015,IT -3641942016,3641950207,DE -3641950208,3641954303,FR -3641954304,3641957119,MD -3641957120,3641957375,GB -3641957376,3641957887,MD -3641957888,3641958143,GB -3641958144,3641958399,MD -3641958400,3641961727,BE -3641961728,3641961743,NL -3641961744,3641961791,BE -3641961792,3641961799,US -3641961800,3641962495,BE -3641962496,3641966591,GB -3641966592,3641970687,IT -3641970688,3641978879,GB -3641978880,3641982975,DK -3641982976,3641991167,RU -3641991168,3641995263,SE -3641995264,3641999359,DE -3641999360,3642003455,HU -3642003456,3642007551,RU -3642007552,3642015743,UA -3642015744,3642019839,CH -3642019840,3642023935,SY -3642023936,3642028031,EG -3642028032,3642028287,GB -3642028288,3642028543,NG -3642028544,3642028544,GB -3642028545,3642028799,NG -3642028800,3642028800,GB -3642028801,3642028863,SO -3642028864,3642028928,GB -3642028929,3642029055,NG -3642029056,3642029056,GB -3642029057,3642029119,NG -3642029120,3642029183,GB -3642029184,3642029311,NG -3642029312,3642030591,GB -3642030592,3642030847,GN -3642030848,3642031616,GB -3642031617,3642031743,SL -3642031744,3642032127,GB -3642032128,3642036223,PS -3642036224,3642040319,HU -3642040320,3642048511,BY -3642048512,3642048767,GB -3642048768,3642049023,DE -3642049024,3642049279,CH -3642049280,3642049535,NO -3642049536,3642049791,SE -3642049792,3642050047,FI -3642050048,3642050303,FR -3642050304,3642050559,GB -3642050560,3642050815,ES -3642050816,3642051071,IT -3642051072,3642051327,CA -3642051328,3642051583,US -3642051584,3642051839,AU -3642051840,3642054399,DE -3642054400,3642056703,US -3642056704,3642060799,RU -3642060800,3642064895,KE -3642064896,3642068991,IT -3642068992,3642073087,AL -3642073088,3642077183,LV -3642077184,3642081271,BE -3642081272,3642081278,US -3642081279,3642081279,BE -3642081280,3642085375,NL -3642085376,3642089471,RU -3642089472,3642093567,SE -3642093568,3642097663,NL -3642097664,3642101759,GB -3642101760,3642104831,NL -3642104832,3642105855,US -3642105856,3642109951,NO -3642109952,3642114047,BE -3642114048,3642118143,NO -3642118144,3642122239,GB -3642122240,3642126335,ES -3642126336,3642130431,IL -3642130432,3642134527,CH -3642134528,3642138623,GB -3642138624,3642142719,RU -3642142720,3642146815,MT -3642146816,3642150911,DE -3642150912,3642163199,IT -3642163200,3642167295,NL -3642167296,3642171391,RU -3642171392,3642175487,JO -3642175488,3642179583,DE -3642179584,3642187775,RU -3642187776,3642191871,DK -3642191872,3642195967,BY -3642195968,3642204159,RU -3642204160,3642208255,IM -3642208256,3642212351,RU -3642212352,3642216447,BA -3642216448,3642220543,HU -3642220544,3642224639,GB -3642224640,3642228735,SK -3642228736,3642232831,DE -3642232832,3642236927,RS -3642236928,3642237263,CH -3642237264,3642237264,DE -3642237265,3642241023,CH -3642241024,3642245119,DE -3642245120,3642249215,LV -3642249216,3642253311,FR -3642253312,3642257407,FI -3642257408,3642261503,RU -3642261504,3642265599,BA -3642265600,3642269695,IR -3642269696,3642273791,UA -3642273792,3642277887,RU -3642277888,3642290175,DE -3642290176,3642294271,AL -3642294272,3642298367,GB -3642298368,3642302463,AZ -3642302464,3642306559,SE -3642306560,3642310655,IR -3642310656,3642314751,DE -3642314752,3642318847,RU -3642318848,3642322943,FI -3642322944,3642327039,AT -3642327040,3642331135,DE -3642331136,3642335231,RU -3642335232,3642339327,DE -3642339328,3642343423,FR -3642343424,3642347519,UA -3642347520,3642355711,RU -3642355712,3642359807,SE -3642359808,3642367999,RU -3642368000,3642376191,CH -3642376192,3642376447,XK -3642376448,3642377983,RS -3642377984,3642378047,XK -3642378048,3642379007,RS -3642379008,3642379263,XK -3642379264,3642379775,RS -3642379776,3642380063,XK -3642380064,3642380287,RS -3642380288,3642384383,IT -3642384384,3642392575,NL -3642392576,3642394623,AT -3642394624,3642396671,FR -3642396672,3642404863,MD -3642408960,3642411007,FR -3642411008,3642411519,AE -3642411520,3642413055,FR -3642413056,3642415103,RS -3642415104,3642417151,GB -3642417152,3642419199,DE -3642419200,3642421247,GB -3642421248,3642423091,DE -3642423092,3642423099,US -3642423100,3642424151,DE -3642424152,3642424215,US -3642424216,3642425087,DE -3642425088,3642425343,US -3642425344,3642429439,DE -3642429440,3642433535,GB -3642433536,3642435583,CY -3642435584,3642436607,RU -3642436608,3642441727,CY -3642441728,3642449919,IT -3642449920,3642454015,CH -3642454016,3642458111,IT -3642458112,3642462207,RU -3642462208,3642466303,UA -3642466304,3642474495,SE -3642474496,3642478591,DE -3642478592,3642482687,HU -3642482688,3642486783,NL -3642486784,3642490879,GB -3642490880,3642494975,IM -3642494976,3642499071,GB -3642499072,3642501119,SE -3642501120,3642503167,LU -3642503168,3642507263,LV -3642507264,3642509311,FR -3642509312,3642511359,RU -3642511360,3642515455,CZ -3642515456,3642519551,DE -3642519552,3642523647,IT -3642523648,3642527743,GB -3642527744,3642531839,PL -3642531840,3642535935,DK -3642535936,3642540031,IS -3642540032,3642544127,SE -3642544128,3642552319,RU -3642552320,3642553343,UA -3642553344,3642553599,RU -3642553600,3642553855,UA -3642553856,3642554367,RU -3642554368,3642554623,LT -3642554624,3642554720,UA -3642554721,3642554721,LV -3642554722,3642555103,UA -3642555104,3642555111,NL -3642555112,3642555607,UA -3642555608,3642555615,PL -3642555616,3642556415,UA -3642556416,3642560511,CZ -3642560512,3642564607,KG -3642564608,3642568703,DE -3642568704,3642572799,RU -3642572800,3642576895,IT -3642576896,3642580991,RU -3642580992,3642585087,ES -3642585088,3642589183,UZ -3642589184,3642593279,TZ -3642593280,3642597375,AT -3642597376,3642601471,IT -3642601472,3642605567,RU -3642605568,3642609663,GB -3642609664,3642613759,ZA -3642613760,3642617855,FI -3642617856,3642621951,JO -3642626048,3642630143,BE -3642630144,3642634239,DK -3642634240,3642638335,DE -3642638336,3642642431,CZ -3642642432,3642646527,DK -3642646528,3642650623,MT -3642650624,3642654719,GB -3642654720,3642662911,PL -3642662912,3642667007,UZ -3642667008,3642671103,FI -3642671104,3642675199,UA -3642675200,3642679295,BG -3642679296,3642683391,DE -3642683392,3642687487,RU -3642687488,3642691583,GB -3642691584,3642695679,DE -3642695680,3642699775,SK -3642699776,3642703871,CZ -3642703872,3642707967,LU -3642707968,3642712063,DE -3642712064,3642716159,NO -3642716160,3642720255,IT -3642720256,3642728447,GB -3642728448,3642736639,SE -3642736640,3642740735,CZ -3642740736,3642744831,DE -3642744832,3642753023,TR -3642753024,3643801599,GB -3643801600,3644063743,DE -3644063744,3644325887,EG -3644325888,3644588031,IT -3644588032,3644653567,IR -3644653568,3644655615,DE -3644655616,3644657663,IT -3644657664,3644659711,GB -3644659712,3644669951,IT -3644669952,3644678143,ES -3644678144,3644680191,FR -3644680192,3644682239,DE -3644682240,3644684287,GB -3644684288,3644686335,IT -3644686336,3644690431,ES -3644690432,3644694527,DE -3644694528,3644698623,IT -3644698624,3644702719,GB -3644702720,3644706815,DE -3644706816,3644708863,ES -3644708864,3644710911,DK -3644710912,3644711935,ES -3644711936,3644712959,GB -3644712960,3644713983,DE -3644713984,3644715007,DK -3644715008,3644716031,ES -3644716032,3644717055,SE -3644717056,3644717567,DE -3644717568,3644718079,DK -3644718080,3644718335,SI -3644718336,3644718591,NL -3644718592,3644718847,IT -3644718848,3644719103,DE -3644719104,3644809215,NL -3644809216,3644809216,FR -3644809217,3644817407,DK -3644817408,3644850175,NL -3644850176,3644854271,CZ -3644854272,3644858367,AZ -3644858368,3644862463,FI -3644862464,3644866559,FR -3644866560,3644874751,DE -3644874752,3644878847,ML -3644878848,3644879103,GB -3644879104,3644879359,IT -3644879360,3644882687,GB -3644882688,3644882943,AT -3644882944,3644887039,RU -3644887040,3644891135,IR -3644891136,3644895231,DE -3644895232,3644899327,FI -3644899328,3644903423,IT -3644903424,3644907519,TR -3644907520,3644911615,GB -3644911616,3644915711,BE -3644915712,3644919807,RU -3644919808,3644923903,DE -3644923904,3644924927,IL -3644924928,3644925183,US -3644925184,3644925439,IL -3644925440,3644925695,US -3644925696,3644926463,IL -3644926464,3644926719,US -3644926720,3644927999,IL -3644928000,3644932095,GI -3644932096,3644936191,IT -3644936192,3644940287,RU -3644940288,3644948479,HU -3644948480,3644952575,DE -3644952576,3644960767,GB -3644960768,3644964863,TR -3644964864,3644968959,RS -3644968960,3644973055,RU -3644973056,3644977151,NO -3644977152,3644981247,UA -3644981248,3644985343,BE -3644985344,3644989439,RU -3644989440,3644997631,DE -3644997632,3645005823,RU -3645005824,3645009919,UA -3645009920,3645014015,FR -3645014016,3645018111,DE -3645018112,3645022207,RU -3645022208,3645030143,CZ -3645030144,3645030399,SK -3645030400,3645038591,IR -3645038592,3645046783,PS -3645046784,3645050879,RU -3645050880,3645054975,SK -3645054976,3645059071,DE -3645059072,3645063167,GB -3645063168,3645067263,UA -3645067264,3645071359,SE -3645071360,3645075455,DE -3645075456,3645079551,RU -3645079552,3645083647,CH -3645083648,3645087743,FR -3645087744,3645091839,ES -3645091840,3645095935,RU -3645095936,3645104127,PL -3645104128,3645112319,NL -3645112320,3645116415,DE -3645116416,3645120511,GB -3645120512,3645124607,SE -3645124608,3645128703,NL -3645128704,3645132799,GB -3645132800,3645136895,HR -3645136896,3645145087,NO -3645145088,3645149183,GB -3645149184,3645161471,DE -3645161472,3645163519,AT -3645163520,3645164031,GB -3645164032,3645165567,AT -3645165568,3645169663,TR -3645169664,3645173759,CH -3645173760,3645177855,GB -3645177856,3645181951,GR -3645181952,3645183375,FR -3645183376,3645183383,SA -3645183384,3645186047,FR -3645186048,3645190143,GB -3645190144,3645194239,FI -3645194240,3645202431,DE -3645202432,3645206527,CZ -3645206528,3645210623,LV -3645210624,3645214719,RU -3645214720,3645218815,SE -3645218816,3645222911,DE -3645222912,3645227007,KW -3645227008,3645235199,RU -3645235200,3645243391,DE -3645243392,3645247487,ES -3645247488,3645251583,RU -3645251584,3645255679,SE -3645255680,3645259775,PL -3645259776,3645263871,PT -3645263872,3645267967,FR -3645267968,3645276159,RU -3645276160,3645280255,DE -3645280256,3645284351,IT -3645284352,3645288447,DE -3645288448,3645288895,FR -3645288896,3645288959,LU -3645288960,3645292543,FR -3645292544,3645296639,DE -3645296640,3645300735,NL -3645300736,3645304831,BE -3645304832,3645308927,ES -3645308928,3645313023,DK -3645313024,3645317119,ES -3645317120,3645321215,EE -3645321216,3645325311,BA -3645325312,3645329407,IT -3645329408,3645333503,CH -3645334272,3645335039,DE -3645335688,3645335691,DE -3645337600,3645341695,FR -3645341696,3645345791,RU -3645345792,3645349887,FI -3645349888,3645353983,RU -3645353984,3645358079,MT -3645358080,3645362175,ES -3645362176,3645364223,FR -3645364224,3645366271,DE -3645366272,3645370367,RU -3645370368,3645374463,CH -3645374464,3645378559,RU -3645378560,3645382655,SE -3645382656,3645386751,IT -3645386752,3645390847,SE -3645390848,3645399039,SI -3645399040,3645403135,IT -3645403136,3645407231,GB -3645407232,3645411327,DE -3645411328,3645415423,RU -3645415424,3645423615,GB -3645423616,3645431807,DE -3645431808,3645435903,BE -3645435904,3645439999,GB -3645440000,3645444095,SE -3645444096,3645448191,SK -3645448192,3645454335,DE -3645454336,3645456383,RU -3645456384,3645460479,GB -3645460480,3645464575,UA -3645464576,3645468671,SE -3645468672,3645472767,RU -3645472768,3645476863,AL -3645476864,3645480959,DE -3645480960,3645485055,RO -3645485056,3645489151,PL -3645489152,3645493247,RU -3645493248,3645501439,IT -3645501440,3645505535,PL -3645505536,3645507583,DE -3645507584,3645509631,AT -3645509632,3645511679,NL -3645511680,3645513727,TR -3645513728,3645517823,RU -3645517824,3645521919,IE -3645521920,3645526015,PL -3645526016,3645530111,SE -3645530112,3645534207,FR -3645534208,3645538303,RU -3645538304,3645546495,DK -3645546496,3645550591,RU -3645550592,3645558783,DE -3645558784,3645562879,DK -3645562880,3645563135,GB -3645563136,3645564671,LS -3645564672,3645565951,GB -3645565952,3645566975,ZW -3645566976,3645571071,RU -3645571072,3645575167,IE -3645575168,3645579263,CH -3645579264,3645583359,NL -3645583360,3645587455,PL -3645587456,3645595647,SK -3645595648,3645603839,SE -3645603840,3645612031,BG -3645612032,3645616127,GB -3645616128,3645620223,AT -3645620224,3645624319,BA -3645624320,3645628415,CZ -3645628416,3645636607,ES -3645636608,3645640703,AM -3645640704,3645644799,NL -3645644800,3645648895,RU -3645648896,3645652991,SE -3645652992,3645657087,KZ -3645657088,3645661183,SE -3645661184,3645665279,DE -3645665280,3645669375,PL -3645669376,3645669599,ES -3645669600,3645669887,PT -3645669888,3645670399,ES -3645670400,3645670427,PT -3645670428,3645670429,ES -3645670430,3645670430,PT -3645670431,3645670433,ES -3645670434,3645670436,PT -3645670437,3645670441,ES -3645670442,3645670456,PT -3645670457,3645670460,ES -3645670461,3645670467,PT -3645670468,3645670483,ES -3645670484,3645670508,PT -3645670509,3645670509,ES -3645670510,3645670527,PT -3645670528,3645670655,ES -3645670656,3645670911,PT -3645670912,3645673471,ES -3645673472,3645673535,PT -3645673536,3645674239,ES -3645674240,3645674271,PT -3645674272,3645675007,ES -3645675008,3645675519,PT -3645675520,3645675759,ES -3645675760,3645675775,PT -3645675776,3645676015,ES -3645676016,3645676031,PT -3645676032,3645676543,ES -3645676544,3645676799,PT -3645676800,3645677567,ES -3645677568,3645681663,AT -3645681664,3645685759,RU -3645685760,3645689855,UA -3645689856,3645693951,IT -3645693952,3645698047,BE -3645698048,3645702143,ES -3645702144,3645706239,GB -3645706240,3645710335,LT -3645710336,3645714431,NO -3645714432,3645718527,RU -3645718528,3645722623,GA -3645722624,3645726719,IT -3645726720,3645730815,RU -3645730816,3645734911,IR -3645734912,3645743103,NL -3645743104,3645747199,CZ -3645747200,3645751295,GB -3645751296,3645755391,FI -3645755392,3645759487,UA -3645759488,3645763583,FR -3645763584,3645763585,DE -3645763586,3645763587,IT -3645763588,3645763588,DE -3645763589,3645763589,IE -3645763590,3645763590,ES -3645763591,3645763591,BE -3645763592,3645763593,DE -3645763594,3645763594,CH -3645763595,3645763595,IT -3645763596,3645763597,DE -3645763598,3645763598,NL -3645763599,3645763600,DE -3645763601,3645763601,GR -3645763602,3645763603,FR -3645763604,3645763609,DE -3645763610,3645763610,PL -3645763611,3645763612,DE -3645763613,3645763613,HU -3645763614,3645763614,CH -3645763615,3645763615,ES -3645763616,3645763616,FR -3645763617,3645763617,DE -3645763618,3645763618,ES -3645763619,3645763619,DE -3645763620,3645763620,FR -3645763621,3645763621,CH -3645763622,3645763622,GB -3645763623,3645763623,FR -3645763624,3645763624,DE -3645763625,3645763625,FR -3645763626,3645763626,NL -3645763627,3645763627,AT -3645763628,3645763629,DE -3645763630,3645763631,NL -3645763632,3645763632,GB -3645763633,3645763633,DE -3645763634,3645763634,NL -3645763635,3645763635,DE -3645763636,3645763636,AT -3645763637,3645763637,FR -3645763638,3645763638,NL -3645763639,3645763639,DE -3645763640,3645763640,HU -3645763641,3645763641,IT -3645763642,3645763642,GB -3645763643,3645763645,DE -3645763646,3645763647,ES -3645763648,3645763648,DE -3645763649,3645763649,IL -3645763650,3645763650,DE -3645763651,3645763651,NL -3645763652,3645763653,DE -3645763654,3645763654,ES -3645763655,3645763660,DE -3645763661,3645763662,FR -3645763663,3645763663,HU -3645763664,3645763670,DE -3645763671,3645763671,FR -3645763672,3645763672,DE -3645763673,3645763673,BE -3645763674,3645763676,DE -3645763677,3645763678,HU -3645763679,3645763679,IT -3645763680,3645763683,DE -3645763684,3645763684,CH -3645763685,3645763687,DE -3645763688,3645763690,NL -3645763691,3645763691,CH -3645763692,3645763692,DE -3645763693,3645763693,NL -3645763694,3645763696,DE -3645763697,3645763697,NL -3645763698,3645763698,DE -3645763699,3645763699,BE -3645763700,3645763700,NL -3645763701,3645763701,DE -3645763702,3645763702,IT -3645763703,3645763705,DE -3645763706,3645763706,GB -3645763707,3645763707,NL -3645763708,3645763708,GR -3645763709,3645763709,NL -3645763710,3645763710,GB -3645763711,3645763713,NL -3645763714,3645763714,DE -3645763715,3645763715,NL -3645763716,3645763716,DE -3645763717,3645763717,NL -3645763718,3645763719,DE -3645763720,3645763720,IT -3645763721,3645763721,DE -3645763722,3645763722,GR -3645763723,3645763723,NL -3645763724,3645763726,IT -3645763727,3645763727,NL -3645763728,3645763728,GR -3645763729,3645763729,DE -3645763730,3645763730,IT -3645763731,3645763732,DE -3645763733,3645763733,FR -3645763734,3645763734,DE -3645763735,3645763735,GB -3645763736,3645763736,FR -3645763737,3645763737,DE -3645763738,3645763738,CH -3645763739,3645763740,ES -3645763741,3645763746,DE -3645763747,3645763747,NL -3645763748,3645763748,DE -3645763749,3645763750,NL -3645763751,3645763751,DE -3645763752,3645763752,NL -3645763753,3645763753,DE -3645763754,3645763755,NL -3645763756,3645763757,DE -3645763758,3645763758,FR -3645763759,3645763759,DE -3645763760,3645763760,NL -3645763761,3645763761,SE -3645763762,3645763762,ES -3645763763,3645763763,DE -3645763764,3645763764,NL -3645763765,3645763765,DE -3645763766,3645763766,IL -3645763767,3645763768,NL -3645763769,3645763769,FR -3645763770,3645763770,NL -3645763771,3645763771,GB -3645763772,3645763773,DE -3645763774,3645763774,NL -3645763775,3645763775,DE -3645763776,3645763776,NL -3645763777,3645763783,DE -3645763784,3645763784,NL -3645763785,3645763785,DE -3645763786,3645763786,CH -3645763787,3645763787,NL -3645763788,3645763788,IE -3645763789,3645763789,AT -3645763790,3645763790,ES -3645763791,3645763791,IT -3645763792,3645763792,FR -3645763793,3645763793,ES -3645763794,3645763794,DE -3645763795,3645763795,IT -3645763796,3645763797,DE -3645763798,3645763798,FR -3645763799,3645763801,DE -3645763802,3645763802,ES -3645763803,3645763803,NL -3645763804,3645763806,DE -3645763807,3645763807,IT -3645763808,3645763808,DE -3645763809,3645763809,IT -3645763810,3645763810,NL -3645763811,3645763813,DE -3645763814,3645763814,IT -3645763815,3645763816,DE -3645763817,3645763817,GR -3645763818,3645763818,ES -3645763819,3645763825,DE -3645763826,3645763826,IT -3645763827,3645763827,ZA -3645763828,3645763841,DE -3645763842,3645763842,CH -3645763843,3645763845,DE -3645763846,3645763846,FR -3645763847,3645763847,IT -3645763848,3645763850,DE -3645763851,3645763851,GB -3645763852,3645763852,DE -3645763853,3645763853,CH -3645763854,3645763854,NL -3645763855,3645763858,DE -3645763859,3645763859,DK -3645763860,3645763860,IT -3645763861,3645763861,DE -3645763862,3645763862,FR -3645763863,3645763864,ES -3645763865,3645763865,CH -3645763866,3645763866,DE -3645763867,3645763868,GB -3645763869,3645763869,DE -3645763870,3645763870,HU -3645763871,3645763874,DE -3645763875,3645763875,GB -3645763876,3645763876,PL -3645763877,3645763877,FR -3645763878,3645763879,DE -3645763880,3645763881,FR -3645763882,3645763882,DE -3645763883,3645763883,NL -3645763884,3645763884,IT -3645763885,3645763886,DE -3645763887,3645763887,FR -3645763888,3645763888,DE -3645763889,3645763889,GR -3645763890,3645763890,ES -3645763891,3645763894,DE -3645763895,3645763895,ES -3645763896,3645763896,DE -3645763897,3645763897,BE -3645763898,3645763898,DE -3645763899,3645763899,ES -3645763900,3645763900,NL -3645763901,3645763902,LU -3645763903,3645763903,DE -3645763904,3645763904,BE -3645763905,3645763905,RS -3645763906,3645763906,DE -3645763907,3645763908,IT -3645763909,3645763909,DE -3645763910,3645763910,ES -3645763911,3645763911,DE -3645763912,3645763912,IE -3645763913,3645763913,PT -3645763914,3645763914,DE -3645763915,3645763915,IL -3645763916,3645763916,BE -3645763917,3645763917,DE -3645763918,3645763918,IT -3645763919,3645763919,GB -3645763920,3645763920,DE -3645763921,3645763921,CH -3645763922,3645763922,ES -3645763923,3645763923,GB -3645763924,3645763924,PL -3645763925,3645763926,DE -3645763927,3645763927,HU -3645763928,3645763928,FR -3645763929,3645763929,NL -3645763930,3645763930,ES -3645763931,3645763931,FR -3645763932,3645763932,DE -3645763933,3645763933,FR -3645763934,3645763934,IT -3645763935,3645763935,FR -3645763936,3645763936,DE -3645763937,3645763937,FR -3645763938,3645763938,DE -3645763939,3645763939,NL -3645763940,3645763942,DE -3645763943,3645763943,ES -3645763944,3645763944,CH -3645763945,3645763945,DE -3645763946,3645763946,HU -3645763947,3645763949,DE -3645763950,3645763950,ES -3645763951,3645763951,DE -3645763952,3645763952,IT -3645763953,3645763953,TR -3645763954,3645763954,IT -3645763955,3645763955,FR -3645763956,3645763956,DE -3645763957,3645763957,GB -3645763958,3645763959,DE -3645763960,3645763960,IT -3645763961,3645763961,DE -3645763962,3645763962,ES -3645763963,3645763964,DE -3645763965,3645763965,AT -3645763966,3645763966,DE -3645763967,3645763967,IT -3645763968,3645763968,DE -3645763969,3645763969,ES -3645763970,3645763970,DE -3645763971,3645763971,ES -3645763972,3645763972,IT -3645763973,3645763973,DE -3645763974,3645763974,GB -3645763975,3645763975,AT -3645763976,3645763976,IT -3645763977,3645763978,DE -3645763979,3645763979,IT -3645763980,3645763981,DE -3645763982,3645763982,IT -3645763983,3645763984,FR -3645763985,3645763985,NL -3645763986,3645763986,DE -3645763987,3645763987,PL -3645763988,3645763988,CH -3645763989,3645763989,FR -3645763990,3645763993,DE -3645763994,3645763994,IT -3645763995,3645763995,ES -3645763996,3645764000,DE -3645764001,3645764001,IT -3645764002,3645764009,DE -3645764010,3645764010,FR -3645764011,3645764012,DE -3645764013,3645764013,HU -3645764014,3645764015,GB -3645764016,3645764016,IT -3645764017,3645764017,GB -3645764018,3645764019,DE -3645764020,3645764020,IT -3645764021,3645764021,DE -3645764022,3645764022,ES -3645764023,3645764023,FR -3645764024,3645764025,ES -3645764026,3645764028,DE -3645764029,3645764029,ES -3645764030,3645764030,DE -3645764031,3645764031,NL -3645764032,3645764032,FR -3645764033,3645764034,DE -3645764035,3645764035,IT -3645764036,3645764037,ES -3645764038,3645764038,IT -3645764039,3645764039,HU -3645764040,3645764040,ES -3645764041,3645764041,DE -3645764042,3645764042,CH -3645764043,3645764043,DE -3645764044,3645764044,ES -3645764045,3645764045,AE -3645764046,3645764048,DE -3645764049,3645764049,ES -3645764050,3645764051,DE -3645764052,3645764052,FR -3645764053,3645764055,DE -3645764056,3645764056,BE -3645764057,3645764059,DE -3645764060,3645764060,FR -3645764061,3645764061,IT -3645764062,3645764062,SE -3645764063,3645764063,AT -3645764064,3645764064,SI -3645764065,3645764065,DE -3645764066,3645764066,IT -3645764067,3645764067,DE -3645764068,3645764068,IT -3645764069,3645764069,CH -3645764070,3645764070,GB -3645764071,3645764074,DE -3645764075,3645764075,SE -3645764076,3645764076,GR -3645764077,3645764078,DE -3645764079,3645764079,ES -3645764080,3645764080,DE -3645764081,3645764081,GB -3645764082,3645764084,DE -3645764085,3645764085,IE -3645764086,3645764086,IT -3645764087,3645764087,CH -3645764088,3645764091,DE -3645764092,3645764092,FR -3645764093,3645764097,DE -3645764098,3645764098,IT -3645764099,3645764099,DE -3645764100,3645764100,BE -3645764101,3645764102,DE -3645764103,3645764103,SK -3645764104,3645764105,IT -3645764106,3645764106,NL -3645764107,3645764107,GR -3645764108,3645764108,DE -3645764109,3645764109,CH -3645764110,3645764110,DK -3645764111,3645764111,DE -3645764112,3645764112,IT -3645764113,3645764113,ES -3645764114,3645764115,DE -3645764116,3645764116,GR -3645764117,3645764117,DE -3645764118,3645764118,GB -3645764119,3645764119,CH -3645764120,3645764120,FR -3645764121,3645764121,IT -3645764122,3645764122,DE -3645764123,3645764123,PL -3645764124,3645764124,DE -3645764125,3645764125,NO -3645764126,3645764126,LU -3645764127,3645764128,DE -3645764129,3645764129,HR -3645764130,3645764130,FR -3645764131,3645764131,DE -3645764132,3645764132,ES -3645764133,3645764133,CY -3645764134,3645764135,DE -3645764136,3645764136,BE -3645764137,3645764137,DE -3645764138,3645764138,CH -3645764139,3645764140,DE -3645764141,3645764141,ES -3645764142,3645764142,HU -3645764143,3645764145,DE -3645764146,3645764147,NL -3645764148,3645764148,DK -3645764149,3645764154,DE -3645764155,3645764155,ES -3645764156,3645764158,DE -3645764159,3645764159,IT -3645764160,3645764160,BE -3645764161,3645764161,ES -3645764162,3645764162,DE -3645764163,3645764163,NL -3645764164,3645764165,DE -3645764166,3645764166,HU -3645764167,3645764167,DE -3645764168,3645764168,ES -3645764169,3645764169,GR -3645764170,3645764170,IT -3645764171,3645764172,DE -3645764173,3645764173,IT -3645764174,3645764174,DE -3645764175,3645764175,PL -3645764176,3645764176,DE -3645764177,3645764177,GB -3645764178,3645764178,DE -3645764179,3645764179,GR -3645764180,3645764181,DE -3645764182,3645764182,FR -3645764183,3645764184,DE -3645764185,3645764185,IT -3645764186,3645764186,FR -3645764187,3645764187,BE -3645764188,3645764188,GB -3645764189,3645764189,DE -3645764190,3645764190,IT -3645764191,3645764191,GB -3645764192,3645764193,DE -3645764194,3645764194,ES -3645764195,3645764195,DE -3645764196,3645764196,IT -3645764197,3645764197,DE -3645764198,3645764198,GR -3645764199,3645764199,DE -3645764200,3645764200,IT -3645764201,3645764201,BE -3645764202,3645764202,IT -3645764203,3645764203,DE -3645764204,3645764204,ES -3645764205,3645764207,DE -3645764208,3645764208,NO -3645764209,3645764210,DE -3645764211,3645764211,FR -3645764212,3645764212,NL -3645764213,3645764213,DE -3645764214,3645764214,NL -3645764215,3645764216,DE -3645764217,3645764217,IT -3645764218,3645764218,CH -3645764219,3645764219,DE -3645764220,3645764220,NL -3645764221,3645764221,IT -3645764222,3645764222,BE -3645764223,3645764223,DE -3645764224,3645764224,ES -3645764225,3645764225,GB -3645764226,3645764226,DE -3645764227,3645764227,CH -3645764228,3645764228,FR -3645764229,3645764229,PL -3645764230,3645764230,NL -3645764231,3645764231,CH -3645764232,3645764235,DE -3645764236,3645764236,IT -3645764237,3645764238,DE -3645764239,3645764240,ES -3645764241,3645764241,DE -3645764242,3645764242,AT -3645764243,3645764243,GR -3645764244,3645764244,FR -3645764245,3645764246,NL -3645764247,3645764247,IT -3645764248,3645764251,DE -3645764252,3645764253,ES -3645764254,3645764254,DE -3645764255,3645764255,CH -3645764256,3645764257,DE -3645764258,3645764258,NL -3645764259,3645764259,IT -3645764260,3645764260,DE -3645764261,3645764261,GB -3645764262,3645764262,BE -3645764263,3645764264,IT -3645764265,3645764265,TR -3645764266,3645764270,DE -3645764271,3645764271,IT -3645764272,3645764272,DE -3645764273,3645764273,IT -3645764274,3645764277,DE -3645764278,3645764278,NL -3645764279,3645764279,ES -3645764280,3645764280,IT -3645764281,3645764281,DE -3645764282,3645764282,NL -3645764283,3645764283,DE -3645764284,3645764284,FR -3645764285,3645764285,IT -3645764286,3645764286,DE -3645764287,3645764287,BE -3645764288,3645764288,FR -3645764289,3645764289,NL -3645764290,3645764290,DE -3645764291,3645764291,NL -3645764292,3645764292,FR -3645764293,3645764293,IT -3645764294,3645764294,DE -3645764295,3645764295,ES -3645764296,3645764297,DE -3645764298,3645764298,GR -3645764299,3645764299,DE -3645764300,3645764300,PL -3645764301,3645764301,GR -3645764302,3645764304,DE -3645764305,3645764305,GB -3645764306,3645764306,BM -3645764307,3645764307,NL -3645764308,3645764309,DE -3645764310,3645764310,ZA -3645764311,3645764311,DE -3645764312,3645764313,ES -3645764314,3645764316,DE -3645764317,3645764317,ES -3645764318,3645764318,HU -3645764319,3645764319,FR -3645764320,3645764320,IT -3645764321,3645764321,DE -3645764322,3645764322,CH -3645764323,3645764323,DE -3645764324,3645764324,FR -3645764325,3645764326,DE -3645764327,3645764327,DK -3645764328,3645764328,CH -3645764329,3645764329,ES -3645764330,3645764330,DE -3645764331,3645764331,RU -3645764332,3645764332,NL -3645764333,3645764336,DE -3645764337,3645764337,HU -3645764338,3645764338,NL -3645764339,3645764340,DE -3645764341,3645764341,IE -3645764342,3645764342,IT -3645764343,3645764343,ES -3645764344,3645764345,DE -3645764346,3645764346,IT -3645764347,3645764347,IE -3645764348,3645764348,NL -3645764349,3645764349,BE -3645764350,3645764350,IT -3645764351,3645764357,DE -3645764358,3645764358,FR -3645764359,3645764360,DE -3645764361,3645764361,CH -3645764362,3645764362,DE -3645764363,3645764363,NL -3645764364,3645764364,DE -3645764365,3645764365,BE -3645764366,3645764367,DE -3645764368,3645764368,IT -3645764369,3645764369,DE -3645764370,3645764370,GB -3645764371,3645764371,ES -3645764372,3645764372,FR -3645764373,3645764375,DE -3645764376,3645764377,NL -3645764378,3645764378,DE -3645764379,3645764380,GB -3645764381,3645764381,DE -3645764382,3645764382,NL -3645764383,3645764383,DE -3645764384,3645764384,AT -3645764385,3645764388,DE -3645764389,3645764389,NL -3645764390,3645764390,DE -3645764391,3645764391,NL -3645764392,3645764392,GR -3645764393,3645764393,DE -3645764394,3645764394,FR -3645764395,3645764396,NL -3645764397,3645764397,DE -3645764398,3645764398,NL -3645764399,3645764399,DE -3645764400,3645764401,NL -3645764402,3645764403,FR -3645764404,3645764404,NL -3645764405,3645764410,DE -3645764411,3645764411,FR -3645764412,3645764412,DE -3645764413,3645764413,FR -3645764414,3645764415,DE -3645764416,3645764417,NL -3645764418,3645764418,DE -3645764419,3645764419,NL -3645764420,3645764420,GB -3645764421,3645764421,DE -3645764422,3645764422,IT -3645764423,3645764423,HU -3645764424,3645764424,DE -3645764425,3645764425,GB -3645764426,3645764433,DE -3645764434,3645764434,NL -3645764435,3645764435,AT -3645764436,3645764436,DE -3645764437,3645764437,FR -3645764438,3645764439,DE -3645764440,3645764440,CH -3645764441,3645764441,DE -3645764442,3645764442,IT -3645764443,3645764456,DE -3645764457,3645764457,IT -3645764458,3645764458,DE -3645764459,3645764459,IT -3645764460,3645764462,DE -3645764463,3645764463,NL -3645764464,3645764467,DE -3645764468,3645764468,IT -3645764469,3645764470,DE -3645764471,3645764471,IT -3645764472,3645764472,GR -3645764473,3645764473,NL -3645764474,3645764476,DE -3645764477,3645764477,NL -3645764478,3645764479,DE -3645764480,3645764481,NL -3645764482,3645764482,DE -3645764483,3645764483,NL -3645764484,3645764484,DE -3645764485,3645764485,NL -3645764486,3645764487,DE -3645764488,3645764490,NL -3645764491,3645764491,DE -3645764492,3645764492,NL -3645764493,3645764493,ES -3645764494,3645764494,FR -3645764495,3645764495,NL -3645764496,3645764496,DE -3645764497,3645764497,NL -3645764498,3645764498,FR -3645764499,3645764500,NL -3645764501,3645764501,DE -3645764502,3645764503,NL -3645764504,3645764504,DE -3645764505,3645764505,NL -3645764506,3645764506,DE -3645764507,3645764507,ES -3645764508,3645764508,IT -3645764509,3645764510,DE -3645764511,3645764511,NL -3645764512,3645764512,DE -3645764513,3645764513,NL -3645764514,3645764514,ES -3645764515,3645764515,DE -3645764516,3645764516,NL -3645764517,3645764519,DE -3645764520,3645764522,NL -3645764523,3645764524,DE -3645764525,3645764531,NL -3645764532,3645764533,DE -3645764534,3645764535,NL -3645764536,3645764536,IT -3645764537,3645764538,DE -3645764539,3645764539,NL -3645764540,3645764540,DE -3645764541,3645764541,IT -3645764542,3645764549,NL -3645764550,3645764550,DE -3645764551,3645764551,GR -3645764552,3645764553,DE -3645764554,3645764554,NL -3645764555,3645764555,DE -3645764556,3645764556,CH -3645764557,3645764557,NL -3645764558,3645764561,DE -3645764562,3645764562,FR -3645764563,3645764563,ES -3645764564,3645764565,NL -3645764566,3645764567,DE -3645764568,3645764568,NL -3645764569,3645764569,DE -3645764570,3645764570,MA -3645764571,3645765135,DE -3645765136,3645765139,BE -3645765140,3645765143,IT -3645765144,3645765147,DE -3645765148,3645765151,IT -3645765152,3645765155,BE -3645765156,3645765167,IT -3645765168,3645765171,DE -3645765172,3645765175,NO -3645765176,3645765179,DE -3645765180,3645765183,FR -3645765184,3645765187,GR -3645765188,3645765195,DE -3645765196,3645765199,CH -3645765200,3645765215,DE -3645765216,3645765219,ES -3645765220,3645765223,PL -3645765224,3645765227,BE -3645765228,3645765231,GB -3645765232,3645765235,IT -3645765236,3645765239,DE -3645765240,3645765243,GB -3645765244,3645765247,IT -3645765248,3645765251,ES -3645765252,3645765255,DE -3645765256,3645765259,GR -3645765260,3645765263,PL -3645765264,3645765267,DE -3645765268,3645765271,PL -3645765272,3645765275,IT -3645765276,3645765283,DE -3645765284,3645765287,ES -3645765288,3645765295,DE -3645765296,3645765299,ES -3645765300,3645765307,DE -3645765308,3645765311,IT -3645765312,3645765315,TR -3645765316,3645765319,IT -3645765320,3645765323,DE -3645765324,3645765331,ES -3645765332,3645765335,DE -3645765336,3645765339,IT -3645765340,3645765343,FR -3645765344,3645765347,DE -3645765348,3645765351,GR -3645765352,3645765359,DE -3645765360,3645765363,FR -3645765364,3645765367,ES -3645765368,3645765371,IT -3645765372,3645765375,CH -3645765376,3645765379,DE -3645765380,3645765383,BM -3645765384,3645765387,NL -3645765388,3645765391,DE -3645765392,3645765399,ES -3645765400,3645765407,DE -3645765408,3645765411,DK -3645765412,3645765415,IT -3645765416,3645765419,FR -3645765420,3645765423,DE -3645765424,3645765427,IT -3645765428,3645765447,DE -3645765448,3645765451,ES -3645765452,3645765455,FR -3645765456,3645765459,AT -3645765460,3645765463,FR -3645765464,3645765467,GB -3645765468,3645765471,DE -3645765472,3645765475,NL -3645765476,3645765487,DE -3645765488,3645765491,HU -3645765492,3645765495,DE -3645765496,3645765499,GB -3645765500,3645765503,NL -3645765504,3645765507,DE -3645765508,3645765511,IT -3645765512,3645765515,GB -3645765516,3645765523,DE -3645765524,3645765527,IT -3645765528,3645765535,FR -3645765536,3645765539,SE -3645765540,3645765543,IL -3645765544,3645765559,DE -3645765560,3645765563,IE -3645765564,3645765567,ES -3645765568,3645765571,FR -3645765572,3645765575,DE -3645765576,3645765579,IT -3645765580,3645765591,DE -3645765592,3645765595,IE -3645765596,3645765619,DE -3645765620,3645765623,CH -3645765624,3645765639,DE -3645765640,3645765643,DK -3645765644,3645765647,GB -3645765648,3645765651,NL -3645765652,3645765671,DE -3645765672,3645765675,FR -3645765676,3645765679,DE -3645765680,3645765683,FR -3645765684,3645765687,DE -3645765688,3645765691,FR -3645765692,3645765695,CH -3645765696,3645765703,IT -3645765704,3645765715,DE -3645765716,3645765719,FR -3645765720,3645766401,DE -3645766402,3645766407,US -3645766408,3645767187,DE -3645767188,3645767188,US -3645767189,3645767193,DE -3645767194,3645767194,US -3645767195,3645767195,DE -3645767196,3645767196,US -3645767197,3645767197,DE -3645767198,3645767198,US -3645767199,3645767208,DE -3645767209,3645767209,US -3645767210,3645767222,DE -3645767223,3645767223,US -3645767224,3645767240,DE -3645767241,3645767241,US -3645767242,3645767426,DE -3645767427,3645767427,US -3645767428,3645767428,DE -3645767429,3645767429,US -3645767430,3645767431,DE -3645767432,3645767433,US -3645767434,3645767434,CA -3645767435,3645767435,DE -3645767436,3645767448,US -3645767449,3645767449,DE -3645767450,3645767450,US -3645767451,3645767451,DE -3645767452,3645767455,US -3645767456,3645767502,DE -3645767503,3645767503,US -3645767504,3645767679,DE -3645767680,3645771775,IE -3645771776,3645779967,SE -3645779968,3645784063,PS -3645784064,3645788159,DJ -3645788160,3645792255,GB -3645792256,3645796351,TR -3645796352,3645800447,CH -3645800448,3645804543,DE -3645804544,3645808639,GB -3645808640,3645812735,DE -3645812736,3645816831,RU -3645816832,3645825023,FI -3645825024,3645829119,RU -3645829120,3645833215,NL -3645833216,3645841407,RU -3645841408,3645845503,BG -3645845504,3645849599,RU -3645849600,3645857791,BG -3645857792,3645865983,GB -3645865984,3645870079,HU -3645870080,3645874175,PL -3645874176,3645878271,GB -3645878272,3645882367,DE -3645882368,3645886463,CH -3645886464,3645890559,DE -3645890560,3645894655,RU -3645894656,3645898751,NL -3645898752,3646243420,DE -3646243421,3646243421,US -3646243422,3646947327,DE -3646947328,3647209471,PL -3647209472,3647602687,NL -3647602688,3647733759,RU -3647733760,3647864831,FR -3647864832,3647916799,DE -3647916800,3647917055,SE -3647917056,3647947727,DE -3647947728,3647947735,GB -3647947736,3647964159,DE -3647964160,3647964287,ES -3647964288,3647964503,DE -3647964504,3647964511,ES -3647964512,3647964519,DE -3647964520,3647964527,ES -3647964528,3647964559,DE -3647964560,3647964567,ES -3647964568,3647964591,DE -3647964592,3647964599,ES -3647964600,3647964607,DE -3647964608,3647964615,ES -3647964616,3647964623,DE -3647964624,3647964639,ES -3647964640,3647965255,DE -3647965256,3647965263,ES -3647965264,3647965695,DE -3647965696,3647965951,CH -3647965952,3647966207,DE -3647966208,3647967231,GB -3647967232,3647967759,DE -3647967760,3647967775,BE -3647967776,3647968255,DE -3647968256,3647969279,FR -3647969280,3647969327,DE -3647969328,3647969335,IT -3647969336,3647970303,DE -3647970304,3647971327,FR -3647971328,3647972351,GB -3647972352,3647973375,IT -3647973376,3647973399,DE -3647973400,3647973407,IT -3647973408,3647973615,DE -3647973616,3647973623,IT -3647973624,3647973711,DE -3647973712,3647973719,IT -3647973720,3647974007,DE -3647974008,3647974015,IT -3647974016,3647974055,DE -3647974056,3647974063,IT -3647974064,3647974071,DE -3647974072,3647974079,IT -3647974080,3647975255,DE -3647975256,3647975263,ES -3647975264,3647975423,DE -3647975424,3647976447,ES -3647976448,3647977471,DE -3647977472,3647978495,GB -3647978496,3647978511,NL -3647978512,3647978515,DE -3647978516,3647979007,NL -3647979008,3647979071,IT -3647979072,3647980223,DE -3647980224,3647980239,FR -3647980240,3647980383,DE -3647980384,3647980415,FR -3647980416,3647980543,DE -3647980544,3647981567,GB -3647981568,3647982591,BE -3647982592,3647984031,DE -3647984032,3647984047,NL -3647984048,3647986431,DE -3647986432,3647986687,ES -3647986688,3647987647,DE -3647987648,3647987655,ES -3647987656,3647987695,DE -3647987696,3647987711,ES -3647987712,3647988735,IT -3647988736,3647988999,DE -3647989000,3647989007,BE -3647989008,3647995903,DE -3647995904,3648004095,RU -3648004096,3648004837,GB -3648004838,3648004838,RU -3648004839,3648007167,GB -3648007168,3648007679,US -3648007680,3648007935,RU -3648007936,3648008191,GB -3648008192,3648016383,FR -3648016384,3648020479,GB -3648020480,3648024575,IT -3648024576,3648028671,NL -3648028672,3648032767,HU -3648032768,3648036863,IE -3648036864,3648040959,CZ -3648040960,3648045055,BE -3648045056,3648049151,FI -3648049152,3648053247,UA -3648053248,3648057343,FR -3648057344,3648061439,FI -3648061440,3648069631,AM -3648069632,3648073727,DE -3648073728,3648077823,HU -3648077824,3648078527,BE -3648078528,3648078591,BF -3648078592,3648079103,BE -3648079104,3648079359,CG -3648079360,3648080511,BE -3648080512,3648080543,BF -3648080544,3648080639,BE -3648080640,3648080895,GA -3648080896,3648081023,ZM -3648081024,3648081055,GA -3648081056,3648081151,ZM -3648081152,3648081407,BE -3648081408,3648081663,CG -3648081664,3648082239,BE -3648082240,3648082311,NE -3648082312,3648082431,BE -3648082432,3648082479,ZM -3648082480,3648084223,BE -3648084224,3648084479,CD -3648084480,3648084991,BE -3648084992,3648086015,GB -3648086016,3648090111,AT -3648090112,3648094207,RU -3648094208,3648102399,PL -3648102400,3648106495,GB -3648106496,3648110591,DE -3648110592,3648114687,FR -3648114688,3648118783,IT -3648118784,3648122879,PL -3648122880,3648126975,ES -3648126976,3648139263,RU -3648139264,3648143359,GB -3648143360,3648147455,DE -3648147456,3648151551,SE -3648151552,3648155647,NL -3648155648,3648159743,CH -3648159744,3648163839,ES -3648163840,3648167935,RU -3648167936,3648168191,GB -3648168192,3648168447,IE -3648168448,3648171679,GB -3648171680,3648171695,IE -3648171696,3648172031,GB -3648172032,3648176127,RU -3648176128,3648178175,DE -3648178176,3648180223,FR -3648180224,3648184319,DE -3648184320,3648192511,RU -3648192512,3648196607,DE -3648196608,3648200703,IT -3648200704,3648208895,SE -3648208896,3648212991,DE -3648212992,3648217087,RU -3648217088,3648221183,UA -3648221184,3648225279,IE -3648225280,3648233471,DE -3648233472,3648237567,FR -3648237568,3648241663,RU -3648241664,3648245759,NL -3648245760,3648249855,RO -3648249856,3648253951,NL -3648253952,3648258047,CZ -3648258048,3648266239,ES -3648266240,3648270335,HU -3648270336,3648274431,RU -3648274432,3648278527,AT -3648278528,3648282623,NO -3648282624,3648286719,PL -3648286720,3648290815,DE -3648290816,3648299007,RU -3648299008,3648303103,FI -3648303104,3648307199,AT -3648307200,3648311295,TR -3648311296,3648323583,DK -3648323584,3648327679,NG -3648327680,3648331775,LT -3648331776,3648339967,BE -3648339968,3648344063,UA -3648344064,3648348159,RU -3648348160,3648352255,DE -3648352256,3648356351,RU -3648356352,3648360447,PL -3648360448,3648364543,FR -3648364544,3648368639,CH -3648368640,3648372735,RU -3648372736,3648376831,LU -3648376832,3648380927,CZ -3648380928,3648385023,NL -3648385024,3648389119,RU -3648389120,3648393215,IT -3648393216,3648397311,DE -3648397312,3648405503,NO -3648405504,3648413695,RU -3648413696,3648417791,SK -3648417792,3648419903,GB -3648419904,3648419935,BE -3648419936,3648425983,GB -3648425984,3648430079,IT -3648430080,3648434175,NL -3648434176,3648438271,RU -3648438272,3648442367,CH -3648442368,3648446463,SE -3648446464,3648450559,FR -3648450560,3648454655,IT -3648454656,3648458751,NL -3648458752,3648462847,RU -3648462848,3648466943,FI -3648466944,3648471039,DE -3648471040,3648475135,PL -3648475136,3648479231,RU -3648479232,3648483327,CH -3648483328,3648487423,SK -3648487424,3648491519,FR -3648491520,3648495615,CH -3648495616,3648499711,SE -3648499712,3648503807,FR -3648503808,3648511999,DE -3648512000,3648516095,NL -3648516096,3648519167,RS -3648519168,3648520191,MK -3648520192,3648745820,NL -3648745821,3648745821,US -3648745822,3648747227,NL -3648747228,3648747228,US -3648747229,3648747229,NL -3648747230,3648747230,US -3648747231,3648749003,NL -3648749004,3648749004,US -3648749005,3648782335,NL -3648782336,3649044479,ES -3649044480,3649110015,FR -3649110016,3649175551,PT -3649175552,3649241087,ES -3649241088,3649306623,TR -3649306624,3649372159,IL -3649372160,3649437695,IT -3649437696,3649470463,GB -3649470464,3649471487,SG -3649471488,3649472511,HK -3649472512,3649512191,GB -3649512192,3649512447,FR -3649512448,3649568767,GB -3649568768,3649634303,BE -3649634304,3649765375,GB -3649765376,3649830911,EG -3649830912,3649835007,NL -3649835008,3649837055,ES -3649837056,3649839103,NL -3649839104,3649840127,GB -3649840128,3649841151,NL -3649841152,3649843199,GB -3649843200,3649847817,NL -3649847818,3649848004,DE -3649848005,3649848005,NL -3649848006,3649848010,DE -3649848011,3649848011,PL -3649848012,3649848012,HR -3649848013,3649848014,DE -3649848015,3649848015,HU -3649848016,3649848016,PL -3649848017,3649848028,DE -3649848029,3649848031,NL -3649848032,3649855487,DE -3649855488,3649857791,GB -3649857792,3649858047,IN -3649858048,3649859071,GB -3649859072,3649859583,US -3649859584,3649863679,SE -3649863680,3649896447,FI -3649896448,3649961983,IT -3649961984,3650093055,SE -3650093056,3650097151,JO -3650097152,3650101247,SK -3650101248,3650105343,DE -3650105344,3650109439,HU -3650109440,3650113535,NO -3650113536,3650117631,GB -3650117632,3650121727,RU -3650121728,3650125823,FR -3650125824,3650129919,DE -3650129920,3650134015,GB -3650134016,3650142207,RU -3650142208,3650150399,PL -3650150400,3650158591,NO -3650158592,3650162687,MT -3650162688,3650166783,RU -3650166784,3650170879,BE -3650170880,3650174975,DK -3650174976,3650179071,GB -3650179072,3650183167,BG -3650183168,3650187263,DE -3650187264,3650195455,GB -3650195456,3650199551,RU -3650199552,3650203647,BG -3650203648,3650207743,ES -3650207744,3650211839,SK -3650211840,3650215935,LV -3650220032,3650224127,SA -3650224128,3650224383,TH -3650224384,3650224639,ES -3650224640,3650224895,UA -3650224896,3650225151,FR -3650225152,3650225407,HU -3650225408,3650225663,BR -3650225664,3650226175,TR -3650226176,3650226431,RS -3650226432,3650226687,SG -3650226688,3650227455,IN -3650227456,3650227711,PL -3650227712,3650227967,PT -3650227968,3650228223,AR -3650228224,3650228479,HK -3650228480,3650229247,AT -3650229248,3650229503,DE -3650229504,3650229759,LU -3650229760,3650230527,DE -3650230528,3650231295,AT -3650231296,3650231551,AR -3650231552,3650231807,GB -3650231808,3650231967,DE -3650231968,3650231999,AT -3650232000,3650232063,DE -3650232064,3650232319,SE -3650232320,3650233343,RU -3650233344,3650233599,CY -3650233600,3650236415,RU -3650236416,3650240511,GB -3650240512,3650244607,EE -3650244608,3650256895,GB -3650256896,3650265087,DE -3650265088,3650269183,CH -3650269184,3650273279,GB -3650273280,3650277375,IT -3650277376,3650281471,IR -3650281472,3650285567,FR -3650285568,3650289663,UA -3650293760,3650297855,RU -3650297856,3650301951,LT -3650301952,3650306047,DE -3650306048,3650314239,GB -3650314240,3650318335,DE -3650318336,3650322431,GI -3650322432,3650330623,IT -3650330624,3650333695,UA -3650333696,3650333951,PL -3650333952,3650334719,UA -3650334720,3650336767,DE -3650336768,3650338815,US -3650338816,3650342911,FR -3650342912,3650347007,CH -3650347008,3650351103,GE -3650351104,3650352264,GB -3650352265,3650352265,DE -3650352266,3650355199,GB -3650355200,3650359295,CH -3650359296,3650363391,NL -3650363392,3650367487,GB -3650367488,3650371583,RU -3650371584,3650375679,ES -3650375680,3650379775,NL -3650379776,3650381823,DE -3650381824,3650387967,IT -3650392064,3650396159,NO -3650396160,3650404351,NL -3650404352,3650412543,RU -3650412544,3650416639,DE -3650416640,3650420735,IE -3650420736,3650424831,ES -3650424832,3650428927,RU -3650428928,3650433023,NL -3650433024,3650437119,FI -3650437120,3650441215,NL -3650441216,3650445311,IT -3650445312,3650449407,GB -3650449408,3650453503,NO -3650453504,3650457599,NL -3650457600,3650461695,ES -3650461696,3650465791,AT -3650465792,3650469887,RU -3650469888,3650478079,NL -3650478080,3650482175,AT -3650482176,3650486271,PL -3650486272,3650502655,RU -3650502656,3650504703,SE -3650504704,3650506751,RU -3650506752,3650508799,LB -3650508800,3650510847,NL -3650510848,3650519039,GB -3650519040,3650523135,HU -3650523136,3650527231,DE -3650527232,3650535423,SE -3650535424,3650539519,RU -3650539520,3650543615,ES -3650543616,3650551807,CH -3650551808,3650555903,FR -3650555904,3650559999,RU -3650560000,3650564095,GB -3650564096,3650568191,SE -3650568192,3650572287,RU -3650572288,3650575103,DE -3650575104,3650575167,AT -3650575168,3650576383,DE -3650576384,3650576623,GB -3650576624,3650576631,SE -3650576632,3650576639,NO -3650576640,3650580479,GB -3650580480,3650584575,CH -3650584576,3650588671,RU -3650588672,3650592767,DE -3650592768,3650600959,IS -3650600960,3650605055,SE -3650605056,3650610175,DE -3650610176,3650613247,RU -3650613248,3650616319,DE -3650616320,3650616320,RU -3650616321,3650616575,DE -3650616576,3650616576,PL -3650616577,3650617343,DE -3650617344,3650682879,FI -3650682880,3650748415,PL -3650748416,3650879487,GB -3650879488,3650912255,RO -3650912256,3650916393,GB -3650916394,3650916394,FR -3650916395,3650920895,GB -3650920896,3650920927,GR -3650920928,3650921087,GB -3650921088,3650921215,GR -3650921216,3650921389,GB -3650921390,3650921390,IL -3650921391,3650922799,GB -3650922800,3650922815,FR -3650922816,3650926591,GB -3650926592,3650929663,ES -3650929664,3650929831,GB -3650929832,3650929839,DK -3650929840,3650929847,BE -3650929848,3650929855,FR -3650929856,3650929863,DE -3650929864,3650929871,JE -3650929872,3650929879,NL -3650929880,3650929887,IT -3650929888,3650929895,LU -3650929896,3650929903,ES -3650929904,3650929911,SE -3650929912,3650929919,CH -3650929920,3650932881,GB -3650932882,3650932882,DE -3650932883,3650932943,GB -3650932944,3650932975,IT -3650932976,3650936319,GB -3650936320,3650936455,FR -3650936456,3650936456,GB -3650936457,3650936575,FR -3650936576,3650939607,GB -3650939608,3650939615,TR -3650939616,3650945023,GB -3650945024,3651010559,DK -3651010560,3651076095,GB -3651076096,3651108863,DE -3651108864,3651141631,EE -3651141632,3651152895,DE -3651152896,3651153919,GB -3651153920,3651188991,DE -3651188992,3651190015,ES -3651190016,3651192319,DE -3651192320,3651193343,GB -3651193344,3651207167,DE -3651207168,3651207199,GB -3651207224,3651207295,GB -3651207424,3651207615,GB -3651207648,3651208959,GB -3651209216,3651209231,US -3651209232,3651209239,GB -3651209240,3651209243,DE -3651209472,3651210751,GB -3651211264,3651211775,IR -3651213824,3651214207,US -3651215360,3651215395,GB -3651215616,3651215871,GB -3651217408,3651217535,GI -3651219456,3651219967,US -3651220384,3651220415,GB -3651220432,3651220479,GB -3651221504,3651221695,GB -3651223552,3651223567,GB -3651223584,3651223607,GB -3651223648,3651223663,ES -3651227136,3651227391,GB -3651230720,3651231743,MU -3651232256,3651232287,GB -3651232320,3651232383,GB -3651232448,3651232511,GB -3651237376,3651237631,SC -3651239936,3651272703,GB -3651272704,3651338239,CH -3651338240,3651352575,GB -3651352576,3651353599,FR -3651353600,3651403775,GB -3651403776,3651534847,AE -3651534848,3651600383,NL -3651600384,3651665919,FR -3651665920,3651670015,ES -3651670016,3651674111,GB -3651674112,3651682303,CH -3651682304,3651686399,RU -3651686400,3651690495,NO -3651690496,3651694591,FR -3651694592,3651696639,PT -3651696640,3651698687,BE -3651698688,3651702783,PL -3651702784,3651706879,GB -3651706880,3651710975,MT -3651710976,3651715071,AZ -3651715072,3651719167,PL -3651719168,3651723263,CZ -3651723264,3651727359,IT -3651727360,3651729407,RU -3651729408,3651747839,GB -3651747840,3651751935,FI -3651751936,3651756031,RU -3651756032,3651764223,IT -3651764224,3651772415,CH -3651772416,3651776511,GB -3651776512,3651780607,CZ -3651780608,3651784703,TR -3651784704,3651788799,RS -3651788800,3651792895,NL -3651792896,3651796991,FR -3651796992,3651813375,NL -3651813376,3651821567,RU -3651821568,3651825663,CZ -3651825664,3651829759,RU -3651829760,3651833855,NO -3651833856,3651837951,ML -3651837952,3651842047,PL -3651842048,3651846143,DE -3651846144,3651850239,NO -3651850240,3651854335,RU -3651854336,3651858431,IT -3651858432,3651862527,IR -3651862528,3651866623,RU -3651866624,3651870719,FR -3651870720,3651874815,IT -3651874816,3651878911,PL -3651878912,3651883007,IT -3651883008,3651884543,CD -3651884544,3651884799,BE -3651884800,3651885311,CD -3651885312,3651885839,BE -3651885840,3651885843,CD -3651885844,3651887103,BE -3651887104,3651891199,GB -3651891200,3651895295,DE -3651895296,3651899391,GB -3651899392,3651899647,RU -3651899648,3651899903,IR -3651899904,3651900415,RU -3651900416,3651901439,IR -3651901440,3651903487,RU -3651903488,3651907583,IT -3651907584,3651911679,DE -3651911680,3651915775,NO -3651915776,3651919871,IS -3651919872,3651921919,NL -3651921920,3651923967,IT -3651923968,3651928063,DE -3651928064,3651932159,IT -3651932160,3651936255,RU -3651936256,3651944447,DE -3651944448,3651948543,ES -3651948544,3651952639,FO -3651952640,3651954175,AE -3651954176,3651960831,IR -3651960832,3651964927,GB -3651964928,3651969023,SK -3651969024,3651977215,DE -3651977216,3651985407,IT -3651985408,3651997695,PL -3651997696,3652001791,RU -3652001792,3652005887,HU -3652005888,3652009983,GB -3652009984,3652014079,RU -3652014080,3652018175,SA -3652018176,3652022271,IE -3652022272,3652026367,ES -3652026368,3652032767,DE -3652032768,3652033791,NL -3652033792,3652034559,DE -3652034560,3652046847,PL -3652046848,3652050943,IE -3652050944,3652055039,LI -3652055040,3652059135,NO -3652059136,3652063231,RU -3652063232,3652067327,IR -3652067328,3652071423,TR -3652071424,3652075519,BG -3652075520,3652083711,SE -3652083712,3652087807,RU -3652087808,3652095999,IT -3652096000,3652100095,BG -3652100096,3652108287,RU -3652108288,3652116479,FR -3652116480,3652120575,TM -3652120576,3652124671,GB -3652124672,3652128767,UA -3652128768,3652136959,RU -3652136960,3652141055,IT -3652141056,3652145151,GB -3652145152,3652149247,UA -3652149248,3652153343,DE -3652153344,3652157439,SE -3652157440,3652165631,RU -3652165632,3652169727,FR -3652169728,3652171775,MQ -3652171776,3652173823,FR -3652173824,3652177919,AT -3652177920,3652182015,CY -3652182016,3652190207,DE -3652190208,3652321279,GB -3652321280,3652386815,JP -3652386816,3652583423,GB -3652583424,3652583435,FR -3652583436,3652583439,DE -3652583440,3652583487,FR -3652583488,3652583503,NL -3652583504,3652583551,FR -3652583552,3652583583,FI -3652583584,3652583599,LT -3652583600,3652583615,FR -3652583616,3652583679,DE -3652583680,3652584447,FR -3652584448,3652584575,GB -3652584576,3652584639,IE -3652584640,3652584703,NL -3652584704,3652584767,BE -3652584768,3652584799,PL -3652584800,3652584831,CZ -3652584832,3652584895,IT -3652584896,3652584927,PT -3652584928,3652584959,FR -3652584960,3652585023,ES -3652585024,3652585087,DE -3652585088,3652585151,ES -3652585152,3652585343,FR -3652585344,3652585359,LT -3652585360,3652585695,FR -3652585696,3652585727,GB -3652585728,3652585791,FR -3652585792,3652585823,FI -3652585824,3652585983,FR -3652585984,3652586047,ES -3652586048,3652586079,FR -3652586080,3652586111,CZ -3652586112,3652587647,FR -3652587648,3652587711,DE -3652587712,3652588095,FR -3652588096,3652588159,IT -3652588160,3652589183,FR -3652589184,3652589231,ES -3652589232,3652589823,FR -3652589824,3652589839,LT -3652589840,3652589887,FR -3652589888,3652589919,PL -3652589920,3652590783,FR -3652590784,3652590847,ES -3652590848,3652591119,FR -3652591120,3652591127,ES -3652591128,3652591615,FR -3652591616,3652591743,GB -3652591744,3652591807,BE -3652591808,3652592391,FR -3652592392,3652592399,ES -3652592400,3652592543,FR -3652592544,3652592575,PL -3652592576,3652592703,FR -3652592704,3652592767,DE -3652592768,3652592847,FR -3652592848,3652592863,LT -3652592864,3652592927,FR -3652592928,3652592959,CZ -3652592960,3652593023,FR -3652593024,3652593055,PT -3652593056,3652593215,FR -3652593216,3652593279,IE -3652593280,3652593407,FR -3652593408,3652593471,ES -3652593472,3652593511,FR -3652593512,3652593519,ES -3652593520,3652593631,FR -3652593632,3652593663,PT -3652593664,3652593943,FR -3652593944,3652593951,ES -3652593952,3652595007,FR -3652595008,3652595071,DE -3652595072,3652595167,FR -3652595168,3652595183,ES -3652595184,3652595871,FR -3652595872,3652595935,PL -3652595936,3652596351,FR -3652596352,3652596415,IT -3652596416,3652596479,FR -3652596480,3652596543,ES -3652596544,3652596799,FR -3652596800,3652596831,CZ -3652596832,3652597183,FR -3652597184,3652597247,DE -3652597248,3652597375,FR -3652597376,3652597383,ES -3652597384,3652597407,FR -3652597408,3652597439,PL -3652597440,3652597887,FR -3652597888,3652597903,GB -3652597904,3652599569,FR -3652599570,3652599570,PT -3652599571,3652599679,FR -3652599680,3652599743,IT -3652599744,3652601855,FR -3652601856,3652603903,PL -3652603904,3652608191,FR -3652608192,3652608223,PT -3652608224,3652608255,FR -3652608256,3652608511,GB -3652608512,3652608639,FR -3652608640,3652608767,GB -3652608768,3652609023,FR -3652609024,3652609279,GB -3652609280,3652609503,FR -3652609504,3652609535,FI -3652609536,3652609727,FR -3652609728,3652609759,PL -3652609760,3652609791,CZ -3652609792,3652609823,FR -3652609824,3652609855,CZ -3652609856,3652609919,FR -3652609920,3652609983,ES -3652609984,3652610047,BE -3652610048,3652611135,FR -3652611136,3652611199,ES -3652611200,3652611231,FR -3652611232,3652611263,PT -3652611264,3652611679,FR -3652611680,3652611711,PT -3652611712,3652611775,NL -3652611776,3652612223,FR -3652612224,3652612287,ES -3652612288,3652612351,FR -3652612352,3652612479,GB -3652612480,3652612543,IE -3652612544,3652612607,NL -3652612608,3652613335,FR -3652613336,3652613343,ES -3652613344,3652613375,FR -3652613376,3652613407,FI -3652613408,3652613615,FR -3652613616,3652613623,ES -3652613624,3652613679,FR -3652613680,3652613695,LT -3652613696,3652614015,FR -3652614016,3652614079,BE -3652614080,3652615871,FR -3652615872,3652615935,DE -3652615936,3652620639,FR -3652620640,3652620671,CZ -3652620672,3652620735,PT -3652620736,3652620799,FR -3652620800,3652620831,PT -3652620832,3652621247,FR -3652621248,3652621311,DE -3652621312,3652621375,FR -3652621376,3652621439,ES -3652621440,3652621503,FR -3652621504,3652621567,IT -3652621568,3652621631,FR -3652621632,3652621663,PT -3652621664,3652621823,FR -3652621824,3652621951,IE -3652621952,3652622271,FR -3652622272,3652622335,GB -3652622336,3652622879,FR -3652622880,3652622911,CZ -3652622912,3652623679,FR -3652623680,3652623807,NL -3652623808,3652624191,FR -3652624192,3652624319,IT -3652624320,3652628479,FR -3652628480,3652628543,IT -3652628544,3652628607,FR -3652628608,3652628639,PL -3652628640,3652628855,FR -3652628856,3652628863,ES -3652628864,3652629743,FR -3652629744,3652629759,ES -3652629760,3652630015,FR -3652630016,3652630031,ES -3652630032,3652630079,FR -3652630080,3652630111,PL -3652630112,3652631295,FR -3652631296,3652631359,BE -3652631360,3652631391,FR -3652631392,3652631407,CH -3652631408,3652631423,FR -3652631424,3652631455,PL -3652631456,3652631551,FR -3652631552,3652631583,CZ -3652631584,3652631807,FR -3652631808,3652631823,GB -3652631824,3652632031,FR -3652632032,3652632063,PT -3652632064,3652632303,FR -3652632304,3652632311,ES -3652632312,3652633599,FR -3652633600,3652634623,DE -3652634624,3652635647,PL -3652635648,3652638655,FR -3652638656,3652638719,ES -3652638720,3652638815,FR -3652638816,3652638847,FI -3652638848,3652638975,GB -3652638976,3652639359,FR -3652639360,3652639423,DE -3652639424,3652639679,FR -3652639680,3652639807,NL -3652639808,3652640575,FR -3652640576,3652640703,GB -3652640704,3652640711,FR -3652640712,3652640719,ES -3652640720,3652640767,FR -3652640768,3652640831,ES -3652640832,3652641727,FR -3652641728,3652641791,GB -3652641792,3652642111,FR -3652642112,3652642175,IE -3652642176,3652642239,FR -3652642240,3652642303,DE -3652642304,3652642367,FR -3652642368,3652642431,GB -3652642432,3652642719,FR -3652642720,3652642751,PT -3652642752,3652642975,FR -3652642976,3652643007,IE -3652643008,3652643375,FR -3652643376,3652643379,ES -3652643380,3652643519,FR -3652643520,3652643583,NL -3652643584,3652643647,ES -3652643648,3652644031,FR -3652644032,3652644063,BE -3652644064,3652644199,FR -3652644200,3652644215,ES -3652644216,3652644223,FR -3652644224,3652644239,NL -3652644240,3652644247,FR -3652644248,3652644255,ES -3652644256,3652644351,FR -3652644352,3652644383,FI -3652644384,3652644415,PL -3652644416,3652644575,FR -3652644576,3652644607,DE -3652644608,3652645119,FR -3652645120,3652645503,GB -3652645504,3652645663,FR -3652645664,3652645695,FI -3652645696,3652645887,FR -3652645888,3652646015,NL -3652646016,3652646079,ES -3652646080,3652646111,FR -3652646112,3652646143,CZ -3652646144,3652646271,NL -3652646272,3652646655,FR -3652646656,3652646719,ES -3652646720,3652646799,FR -3652646800,3652646815,PL -3652646816,3652646847,FR -3652646848,3652646863,FI -3652646864,3652648847,FR -3652648848,3652648863,LT -3652648864,3652648895,FI -3652648896,3652648959,DE -3652648960,3652714495,IE -3652714496,3653238783,DE -3653238784,3653369855,CH -3653369856,3653373951,IT -3653373952,3653378047,NL -3653378048,3653382143,DE -3653382144,3653386239,CH -3653386240,3653390335,DE -3653390336,3653394431,FR -3653394432,3653402623,NL -3653402624,3653406557,GB -3653406558,3653406558,GN -3653406559,3653406617,GB -3653406618,3653406618,GN -3653406619,3653407103,GB -3653407104,3653407111,UG -3653407112,3653408071,GB -3653408072,3653408079,NG -3653408080,3653408231,GB -3653408232,3653408239,KE -3653408240,3653410815,GB -3653410816,3653414911,CZ -3653414912,3653419007,IT -3653419008,3653423103,IL -3653423104,3653427199,GB -3653427200,3653431295,DE -3653431296,3653435391,RU -3653435392,3653439487,DE -3653439488,3653443583,FR -3653443584,3653447679,DE -3653447680,3653451775,LV -3653451776,3653464063,RU -3653464064,3653468159,NL -3653468160,3653472255,GR -3653476352,3653480447,CZ -3653480448,3653484543,DK -3653484544,3653488639,TR -3653488640,3653492735,RU -3653492736,3653500927,NL -3653500928,3653505023,GB -3653505024,3653509119,KZ -3653509120,3653513215,NL -3653513216,3653517311,NO -3653517312,3653525503,AT -3653525504,3653529599,RU -3653529600,3653533695,CZ -3653533696,3653537791,IT -3653537792,3653541887,AT -3653541888,3653545983,UA -3653545984,3653550079,CH -3653550080,3653554175,MK -3653554176,3653558271,CZ -3653558272,3653566463,GB -3653566464,3653570559,RU -3653570560,3653574655,ES -3653574656,3653578751,CZ -3653578752,3653582847,SE -3653582848,3653586943,PL -3653586944,3653591039,DE -3653591040,3653595135,LU -3653595136,3653599231,RU -3653599232,3653601279,CH -3653601280,3653603327,BA -3653603328,3653607423,CZ -3653611520,3653615615,HU -3653615616,3653619711,RU -3653619712,3653623807,CH -3653623808,3653636095,RU -3653636096,3653640191,NL -3653640192,3653648383,GB -3653648384,3653652479,SE -3653652480,3653656575,RU -3653656576,3653660671,GB -3653660672,3653664767,CZ -3653664768,3653668863,DE -3653668864,3653672959,SE -3653672960,3653681151,RU -3653681152,3653685247,ES -3653685248,3653689343,DK -3653689344,3653693439,LV -3653693440,3653697535,DE -3653697536,3653705727,IT -3653705728,3653708331,NO -3653708332,3653708332,FI -3653708333,3653713919,NO -3653713920,3653718015,DE -3653718016,3653722111,AT -3653722112,3653730303,LV -3653730304,3653734399,BA -3653734400,3653738495,KE -3653738496,3653746687,GB -3653746688,3653750783,DE -3653750784,3653754879,RU -3653754880,3653758975,UA -3653758976,3653763071,RU -3653763072,3654025215,IT -3654025216,3654287359,GB -3654287360,3654608404,SE -3654608405,3654608405,NO -3654608406,3654608895,SE -3654608896,3654609919,NO -3654609920,3654610431,SE -3654610432,3654610943,FR -3654610944,3654610951,SE -3654610952,3654610959,DE -3654610960,3654612231,SE -3654612232,3654612239,AT -3654612240,3654612271,SE -3654612272,3654612287,AT -3654612288,3654614047,SE -3654614048,3654614063,GB -3654614064,3654614079,SE -3654614080,3654614271,FI -3654614272,3654811647,SE -3654811648,3654942719,ES -3654942720,3655073791,IR -3655073792,3655335935,IT -3655335936,3657433087,DE -3657433088,3659415455,CN -3659415456,3659415487,SG -3659415488,3659530239,CN -3659530240,3659595775,TW -3659595776,3659628543,ID -3659628544,3659661311,JP -3659661312,3659792383,TW -3659792384,3660054527,KR -3660054528,3660578815,JP -3660578816,3661103103,KR -3661103104,3663986687,CN -3663986688,3663987711,AU -3663987712,3663987967,ID -3663987968,3663989247,JP -3663989248,3663989503,VN -3663989504,3663989759,ID -3663989760,3663990271,AU -3663990272,3663990527,VN -3663990528,3663990783,JP -3663990784,3663991295,HK -3663991296,3663991551,MY -3663991552,3663991807,AU -3663992064,3663992319,NZ -3663992320,3663992575,MY -3663992576,3663993599,NZ -3663993600,3663996159,ID -3663996160,3663996415,AU -3663996416,3663996671,TH -3663996672,3663997183,AU -3663997184,3663997439,ID -3663997440,3663997695,JP -3663997696,3663997951,AU -3663997952,3663998207,MY -3663998208,3663998463,JP -3663998464,3663998975,TH -3663998976,3663999487,IN -3663999488,3663999743,AU -3664000000,3664000767,AU -3664000768,3664001023,ID -3664001024,3664001279,NZ -3664001280,3664001535,LK -3664001536,3664001791,MY -3664002048,3664002303,VN -3664002304,3664002559,LK -3664002560,3664003327,ID -3664003328,3664003583,NZ -3664003584,3664003839,TH -3664003840,3664004095,JP -3664004352,3664004607,MY -3664004864,3664005119,KH -3664005120,3664005887,ID -3664005888,3664006143,MY -3664006144,3664006399,AU -3664006400,3664006655,PF -3664006656,3664006911,AU -3664007168,3664008191,AU -3664008192,3664008447,MN -3664008448,3664008703,PK -3664008960,3664010239,AU -3664010240,3664052223,CN -3664052224,3664084991,NZ -3664084992,3664117759,KR -3664117760,3664248831,HK -3664248832,3664642047,CN -3664642048,3664707583,JP -3664707584,3664773119,MY -3664773120,3666870271,JP -3666870272,3666960455,KR -3666960456,3666960456,US -3666960457,3667918847,KR -3667918848,3668967423,TW -3668967424,3669491711,JP -3669491712,3669557247,TW -3669557248,3669590015,AU -3669590016,3669606399,JP -3669606400,3669614591,CN -3669614592,3669616639,NZ -3669616640,3669618687,AU -3669618688,3669620735,CN -3669620736,3669622783,IN -3669622784,3669688319,SG -3669688320,3669753855,TW -3669753856,3670015999,HK -3670016000,3671064575,CN -3671064576,3671130111,MY -3671130112,3671195647,KR -3671195648,3671326719,TW -3671326720,3671392255,SG -3671392256,3671457791,HK -3671457792,3671588863,AU -3671588864,3672637439,JP -3672637440,3673161727,KR -3673161728,3673686015,CN -3673686016,3673751551,IN -3673751552,3673817087,CN -3673817088,3673882623,HK -3673882624,3673948159,JP -3673948160,3674210303,HK -3674210304,3678404607,JP -3678404608,3678535679,IN -3678535680,3678666751,JP -3678666752,3678928895,TW -3678928896,3678994431,CN -3678994432,3679027199,HK -3679027200,3679059967,JP -3679059968,3679158271,SG -3679158272,3679191039,JP -3679191040,3679453183,HK -3679453184,3679584255,TW -3679584256,3679649791,CN -3679649792,3679682559,ID -3679682560,3679715327,CN -3679715328,3679977471,TW -3679977472,3680108543,NZ -3680108544,3680124927,TW -3680124928,3680125951,IN -3680125952,3680129023,CN -3680129024,3680133119,PH -3680133120,3680137215,IN -3680137216,3680141311,HK -3680141312,3680174079,AU -3680174080,3680206847,TW -3680206848,3680239615,IN -3680239616,3680403455,MY -3680403456,3680436223,JP -3680436224,3680501759,MY -3680501760,3682598911,JP -3682598912,3684575268,CN -3684575269,3684575269,HK -3684575270,3684696063,CN -3684696064,3688366079,JP -3688366080,3689938943,CN -3689938944,3690070015,KR -3690070016,3690463231,CN -3690463232,3690987519,KR -3690987520,3695181823,JP -3695181824,3697278975,KR -3697278976,3697573887,JP -3697573888,3697582079,GB -3697582080,3697586175,SG -3697586176,3697606655,JP -3697606656,3697655807,AU -3697655808,3697672191,CN -3697672192,3697737727,JP -3697737728,3697803263,KR -3697803264,3698327551,JP -3698327552,3698589695,CN -3698589696,3699376127,KR -3699376128,3700424703,TW -3700424704,3700752383,JP -3700752384,3700817919,KR -3700817920,3700981759,JP -3700981760,3701014527,CN -3701014528,3701080063,JP -3701080064,3701211135,CN -3701211136,3701252095,JP -3701252096,3701256191,NC -3701256192,3701258239,SG -3701258240,3701260287,IN -3701260288,3701293055,JP -3701293056,3701301247,AU -3701301248,3701305343,ID -3701305344,3701309439,TW -3701309440,3701374975,JP -3701374976,3701375999,IN -3701376000,3701377023,HK -3701377024,3701380095,IN -3701380096,3701381119,KH -3701381120,3701390335,IN -3701390336,3701391359,AU -3701391360,3701392383,IN -3701392384,3701393407,HK -3701393408,3701394431,MY -3701394432,3701395455,BD -3701395456,3701396479,MY -3701396480,3701397247,NZ -3701397248,3701397503,AU -3701397504,3701398527,JP -3701398528,3701399551,MV -3701399552,3701400575,HK -3701400576,3701401599,TW -3701401600,3701402623,BD -3701402624,3701403647,BT -3701403648,3701404671,CN -3701404672,3701405695,HK -3701405696,3701406719,JP -3701406720,3701407743,HK -3701407744,3701473279,JP -3701473280,3704619007,CN -3704619008,3705667583,JP -3705667584,3705929727,IN -3705929728,3706060799,TW -3706060800,3706126335,KR -3706126336,3706142719,CN -3706142720,3706159103,VN -3706159104,3706191871,CN -3706191872,3706207107,SG -3706207108,3706207108,US -3706207109,3706208255,SG -3706208256,3706224639,CN -3706224640,3706225663,HK -3706225664,3706226687,JP -3706226688,3706231807,HK -3706231808,3706232831,JP -3706232832,3706233343,HK -3706233344,3706234367,JP -3706234368,3706237951,HK -3706237952,3706238975,JP -3706238976,3706244095,HK -3706244096,3706244863,JP -3706244864,3706245887,HK -3706245888,3706246143,JP -3706246144,3706253823,HK -3706253824,3706254335,JP -3706254336,3706256895,HK -3706256896,3706257151,JP -3706257152,3706257407,HK -3706257408,3706322943,AU -3706322944,3706388479,CN -3706388480,3706781695,AU -3706781696,3706847231,HK -3706847232,3706978303,CN -3706978304,3707109375,AU -3707109376,3707174911,HK -3707174912,3707207679,JP -3707207680,3707208703,BD -3707208704,3707209727,NZ -3707209728,3707211775,CN -3707211776,3707215871,NP -3707215872,3707217919,BD -3707217920,3707219967,ID -3707219968,3707222015,AU -3707222016,3707224063,JP -3707224064,3707240447,LK -3707240448,3707568127,CN -3707568128,3707633663,AU -3707633664,3707699199,JP -3707699200,3707764735,SG -3707764736,3708600319,CN -3708600320,3708616703,JP -3708616704,3708813311,CN -3708813312,3715629055,JP -3715629056,3715653631,TW -3715653632,3715655679,BD -3715655680,3715657727,IN -3715657728,3715661823,SG -3715661824,3715672063,AU -3715672064,3715674111,JP -3715674112,3715678207,HK -3715678208,3715694591,PK -3715694592,3715710975,VN -3715710976,3715719167,AU -3715719168,3715727359,PH -3715727360,3715729151,AU -3715729152,3715729407,NZ -3715729408,3715735551,AU -3715735552,3715741695,JP -3715741696,3715743743,PH -3715743744,3715760127,JP -3715760128,3715891199,CN -3715891200,3716153343,HK -3716153344,3716170239,SG -3716170240,3716170494,TH -3716170495,3716171519,SG -3716171520,3716171775,JP -3716171776,3716172031,SG -3716172032,3716172287,JP -3716172288,3716173055,SG -3716173056,3716173311,JP -3716173312,3716173567,SG -3716173568,3716173823,JP -3716173824,3716174079,SG -3716174080,3716174083,TH -3716174084,3716174335,JP -3716174336,3716175615,SG -3716175616,3716176895,JP -3716176896,3716178175,SG -3716178176,3716178943,JP -3716178944,3716179967,SG -3716179968,3716181759,JP -3716181760,3716182783,SG -3716182784,3716183295,JP -3716183296,3716183551,SG -3716183552,3716184063,JP -3716184064,3716184319,SG -3716184320,3716184575,JP -3716184576,3716184831,SG -3716184832,3716185087,JP -3716185088,3716186111,SG -3716186112,3716415487,CN -3716415488,3716431871,VN -3716431872,3716440063,KR -3716440064,3716444159,JP -3716444160,3716446207,PK -3716446208,3716464639,JP -3716464640,3716481023,ID -3716481024,3716489215,VN -3716489216,3716493311,MY -3716493312,3716497407,KR -3716497408,3716513791,JP -3716513792,3716530175,KR -3716530176,3716538367,AU -3716538368,3716546559,CN -3716546560,3716677631,IN -3716677632,3716808703,CN -3716808704,3718840319,KR -3718840320,3718905855,TW -3718905856,3719036927,JP -3719036928,3719823359,CN -3719823360,3720347647,JP -3720347648,3720859647,CN -3720859648,3720863743,AU -3720863744,3723493375,CN -3723493376,3725590527,JP -3725590528,3730833407,CN -3730833408,3732602879,KR -3732602880,3732668415,TH -3732668416,3732733951,ID -3732733952,3732799487,CN -3732799488,3732832255,PH -3732832256,3732865023,CN -3732865024,3732930559,PH -3732930560,3733979135,CN -3733979136,3734503423,JP -3734503424,3734765567,NZ -3734765568,3734896639,TW -3734896640,3735027711,JP -3735027712,3735289855,CN -3735289856,3735388159,SG -3735388160,3735404543,LK -3735404544,3735420927,ID -3735420928,3735551999,HK -3735552000,3739222015,CN -3739222016,3739570175,JP -3739570176,3739572223,ID -3739572224,3739574271,AU -3739574272,3739680767,JP -3739680768,3739697151,KR -3739697152,3739746303,JP -3739746304,3740270591,KR -3740270592,3740925951,CN -3740925952,3741024255,TW -3741024256,3741057023,KR -3741057024,3741319167,VN -3741319168,3742367743,CN -3742367744,3742629887,HK -3742629888,3742760959,CN -3742760960,3742892031,TW -3742892032,3742957567,TH -3742957568,3742973951,PH -3742973952,3742982143,SG -3742982144,3742986239,ID -3742986240,3742988287,AU -3742988288,3742990335,VU -3742990336,3743006719,JP -3743006720,3743014911,TH -3743014912,3743016959,AU -3743016960,3743019007,SG -3743019008,3743022079,MY -3743022080,3743023103,BD -3743023104,3743027199,TW -3743031296,3743035391,IN -3743035392,3743039487,HK -3743039488,3743055871,TW -3743055872,3743088639,KR -3743088640,3743093647,AU -3743093648,3743093648,NZ -3743093649,3743096831,AU -3743096832,3743105023,TW -3743105024,3743106047,AU -3743106048,3743109119,JP -3743109120,3743113215,BD -3743113216,3743115263,AU -3743115264,3743117311,VN -3743117312,3743118335,BD -3743118336,3743119359,JP -3743119360,3743120383,IN -3743120384,3743121407,JP -3743121408,3743125503,MY -3743125504,3743129599,ID -3743129600,3743130623,HK -3743130624,3743130879,SG -3743130880,3743131135,HK -3743131136,3743133695,SG -3743133696,3743134719,AU -3743134720,3743135743,JP -3743135744,3743136767,CN -3743136768,3743137791,MY -3743137792,3743154175,TH -3743154176,3743186943,MY -3743186944,3743219711,KR -3743219712,3743252479,JP -3743252480,3743264767,NC -3743264768,3743268863,JP -3743268864,3743272959,IN -3743272960,3743273983,CN -3743273984,3743275007,BD -3743275008,3743276031,HK -3743276032,3743277055,IN -3743277056,3743281151,PK -3743281152,3743282175,AU -3743282176,3743283199,JP -3743283200,3743284223,HK -3743284224,3743285247,CN -3743285248,3743416319,IN -3743416320,3745513471,KR -3745513472,3749052415,CN -3749052416,3749183487,HK -3749183488,3749838847,CN -3749838848,3749839871,SG -3749839872,3749840895,IN -3749840896,3749841919,CN -3749841920,3749842943,AU -3749842944,3749843967,PH -3749843968,3749844991,ID -3749844992,3749846015,AU -3749846016,3749847039,IN -3749847040,3749855231,HK -3749855232,3749969919,KR -3749969920,3750232063,JP -3750232064,3750756351,TW -3750756352,3752067071,CN -3752067072,3752132607,ID -3752132608,3752133631,BD -3752133632,3752134655,ID -3752134656,3752136703,TW -3752136704,3752137727,NZ -3752137728,3752138751,JP -3752138752,3752140799,IN -3752140800,3752148991,JP -3752148992,3752153087,NZ -3752153088,3752157183,JP -3752157184,3752165375,AU -3752165376,3752198143,KR -3752198144,3752329215,CN -3752329216,3752853503,KR -3752853504,3753902079,IN -3753902080,3754033151,CN -3754033152,3754164223,KR -3754164224,3754229759,IN -3754229760,3754295295,HK -3754295296,3754426367,CN -3754426368,3754491903,TW -3754491904,3754688511,CN -3754688512,3754950655,TH -3754950656,3755474943,CN -3755474944,3755737087,JP -3755737088,3755868159,CN -3755868160,3755933695,KR -3755933696,3755966463,JP -3755966464,3755974655,IN -3755974656,3755976703,JP -3755976704,3755978751,KH -3755978752,3755986943,CN -3755986944,3755988991,JP -3755988992,3755990015,HK -3755990016,3755991039,SG -3755991040,3755999231,JP -3755999232,3757047807,IN -3757047808,3757834239,CN -3757834240,3757850623,AU -3757850624,3757858815,JP -3757858816,3757862911,AU -3757862912,3757867007,JP -3757867008,3757875519,CN -3757875520,3757875583,HK -3757875584,3757899775,CN -3757899776,3757965311,KR -3757965312,3758063615,CN -3758063616,3758079999,HK -3758080000,3758088191,KR -3758088192,3758090239,ID -3758090240,3758091263,AU -3758091264,3758092287,CN -3758092288,3758093311,HK -3758093312,3758094335,IN -3758094336,3758095359,HK -3758095360,3758095871,CN -3758095872,3758096127,SG -3758096128,3758096383,AU diff --git a/src/tor/src/config/geoip6 b/src/tor/src/config/geoip6 deleted file mode 100644 index e6f575dfe..000000000 --- a/src/tor/src/config/geoip6 +++ /dev/null @@ -1,41219 +0,0 @@ -# Last updated based on December 6 2017 Maxmind GeoLite2 Country -# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz -# gunzip GeoLite2-Country.mmdb.gz -# python mmdb-convert.py GeoLite2-Country.mmdb -600:8801:9400:5a1:948b:ab15:dde3:61a3,600:8801:9400:5a1:948b:ab15:dde3:61a3,US -2001:200::,2001:200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:208::,2001:208:ffff:ffff:ffff:ffff:ffff:ffff,SG -2001:218::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:220::,2001:220:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:230::,2001:230:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:238::,2001:238:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:240::,2001:240:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:250::,2001:252:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:254::,2001:254:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:256::,2001:256:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:258::,2001:258:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:260::,2001:260:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:268::,2001:268:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:270::,2001:270:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:278::,2001:278:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:280::,2001:280:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:288::,2001:288:8275:ffff:ffff:ffff:ffff:ffff,TW -2001:288:8276::,2001:288:8276:7fff:ffff:ffff:ffff:ffff,US -2001:288:8276:8000::,2001:288:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:290::,2001:290:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:298::,2001:298:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2a0::,2001:2a0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2a8::,2001:2a8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2b0::,2001:2b0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:2b8::,2001:2b9:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:2c0::,2001:2c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2c8::,2001:2c8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2d8::,2001:2d8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:2e0::,2001:2e0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2001:2e8::,2001:2e8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2f0::,2001:2f0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:2f8::,2001:2f8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:300::,2001:300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:308::,2001:308:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:310::,2001:310:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:318::,2001:318:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:320::,2001:320:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:330::,2001:330:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:338::,2001:338:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:340::,2001:340:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:348::,2001:348:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:350::,2001:350:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:358::,2001:358:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:360::,2001:360:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:368::,2001:368:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:370::,2001:370:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:378::,2001:378:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:380::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:388::,2001:388:efff:ffff:ffff:ffff:ffff:ffff,AU -2001:388:f000::,2001:388:f000:7fff:ffff:ffff:ffff:ffff,ID -2001:388:f000:8000::,2001:388:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:390::,2001:390:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:398::,2001:398:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3a0::,2001:3a0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3a8::,2001:3a8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:3b0::,2001:3b0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3b8::,2001:3b8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3c0::,2001:3c0:1fff:ffff:ffff:ffff:ffff:ffff,JP -2001:3c8::,2001:3c8:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:3d0::,2001:3d0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3d8::,2001:3d8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3e0::,2001:3e0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:3e8::,2001:3e8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:400::,2001:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:408::,2001:408:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:410::,2001:410:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:418::,2001:418:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:420::,2001:420:3fff:ffff:ffff:ffff:ffff:ffff,US -2001:420:4000::,2001:420:447f:ffff:ffff:ffff:ffff:ffff,NL -2001:420:4480::,2001:420:4487:ffff:ffff:ffff:ffff:ffff,IL -2001:420:4488::,2001:420:4fff:ffff:ffff:ffff:ffff:ffff,NL -2001:420:5000::,2001:420:51ff:ffff:ffff:ffff:ffff:ffff,AU -2001:420:5200::,2001:420:5240:ffff:ffff:ffff:ffff:ffff,US -2001:420:5241::,2001:420:5241:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5241:8000::,2001:420:5243:ffff:ffff:ffff:ffff:ffff,US -2001:420:5244::,2001:420:5244:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5244:8000::,2001:420:5245:ffff:ffff:ffff:ffff:ffff,US -2001:420:5246::,2001:420:5246:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5246:8000::,2001:420:524a:ffff:ffff:ffff:ffff:ffff,US -2001:420:524b::,2001:420:524b:7fff:ffff:ffff:ffff:ffff,IN -2001:420:524b:8000::,2001:420:524b:ffff:ffff:ffff:ffff:ffff,US -2001:420:524c::,2001:420:524c:7fff:ffff:ffff:ffff:ffff,IN -2001:420:524c:8000::,2001:420:524d:ffff:ffff:ffff:ffff:ffff,US -2001:420:524e::,2001:420:524e:7fff:ffff:ffff:ffff:ffff,IN -2001:420:524e:8000::,2001:420:524e:ffff:ffff:ffff:ffff:ffff,US -2001:420:524f::,2001:420:524f:7fff:ffff:ffff:ffff:ffff,IN -2001:420:524f:8000::,2001:420:543f:ffff:ffff:ffff:ffff:ffff,US -2001:420:5440::,2001:420:5440:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5440:8000::,2001:420:5440:ffff:ffff:ffff:ffff:ffff,US -2001:420:5441::,2001:420:5441:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5441:8000::,2001:420:5441:ffff:ffff:ffff:ffff:ffff,US -2001:420:5442::,2001:420:5442:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5442:8000::,2001:420:5442:ffff:ffff:ffff:ffff:ffff,US -2001:420:5443::,2001:420:5443:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5443:8000::,2001:420:5443:ffff:ffff:ffff:ffff:ffff,US -2001:420:5444::,2001:420:5444:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5444:8000::,2001:420:5445:ffff:ffff:ffff:ffff:ffff,US -2001:420:5446::,2001:420:5446:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5446:8000::,2001:420:5446:ffff:ffff:ffff:ffff:ffff,US -2001:420:5447::,2001:420:5447:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5447:8000::,2001:420:5502:ffff:ffff:ffff:ffff:ffff,US -2001:420:5503::,2001:420:5503:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5503:8000::,2001:420:5503:ffff:ffff:ffff:ffff:ffff,US -2001:420:5504::,2001:420:5504:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5504:8000::,2001:420:5504:ffff:ffff:ffff:ffff:ffff,US -2001:420:5505::,2001:420:5505:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5505:8000::,2001:420:5505:ffff:ffff:ffff:ffff:ffff,US -2001:420:5506::,2001:420:5506:7fff:ffff:ffff:ffff:ffff,IN -2001:420:5506:8000::,2001:420:550b:ffff:ffff:ffff:ffff:ffff,US -2001:420:550c::,2001:420:550c:7fff:ffff:ffff:ffff:ffff,IN -2001:420:550c:8000::,2001:420:550d:ffff:ffff:ffff:ffff:ffff,US -2001:420:550e::,2001:420:550e:7fff:ffff:ffff:ffff:ffff,IN -2001:420:550e:8000::,2001:420:57ff:ffff:ffff:ffff:ffff:ffff,US -2001:420:5800::,2001:420:5bff:ffff:ffff:ffff:ffff:ffff,HK -2001:420:5c00::,2001:420:5dff:ffff:ffff:ffff:ffff:ffff,SG -2001:420:5e00::,2001:420:5fff:ffff:ffff:ffff:ffff:ffff,JP -2001:420:6000::,2001:420:c0bf:ffff:ffff:ffff:ffff:ffff,US -2001:420:c0c0::,2001:420:c0c3:ffff:ffff:ffff:ffff:ffff,NL -2001:420:c0c4::,2001:420:c0cf:ffff:ffff:ffff:ffff:ffff,US -2001:420:c0d0::,2001:420:c0d3:ffff:ffff:ffff:ffff:ffff,AU -2001:420:c0d4::,2001:420:c0d7:ffff:ffff:ffff:ffff:ffff,SG -2001:420:c0d8::,2001:420:c0db:ffff:ffff:ffff:ffff:ffff,HK -2001:420:c0dc::,2001:420:c0df:ffff:ffff:ffff:ffff:ffff,JP -2001:420:c0e0::,2001:420:c0e0:7fff:ffff:ffff:ffff:ffff,IN -2001:420:c0e0:8000::,2001:420:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:428::,2001:428:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:430::,2001:430:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:438::,2001:438:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:440::,2001:440:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:448::,2001:448:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:450::,2001:450:1b:ffff:ffff:ffff:ffff:ffff,US -2001:450:1c::,2001:450:1c:ffff:ffff:ffff:ffff:ffff,CA -2001:450:1d::,2001:450:1d:ffff:ffff:ffff:ffff:ffff,GB -2001:450:1e::,2001:450:1e:ffff:ffff:ffff:ffff:ffff,FR -2001:450:1f::,2001:450:1f:ffff:ffff:ffff:ffff:ffff,CA -2001:450:20::,2001:450:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:458::,2001:458:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:460::,2001:460:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:468::,2001:468:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:470::,2001:470:0:284::,US -2001:470:0:284::1,2001:470:0:284::1,AT -2001:470:0:284::2,2001:470:4:7ff:ffff:ffff:ffff:ffff,US -2001:470:4:800::,2001:470:4:fff:ffff:ffff:ffff:ffff,NL -2001:470:4:1000::,2001:470:5:317:ffff:ffff:ffff:ffff,US -2001:470:5:318::,2001:470:5:318:ffff:ffff:ffff:ffff,AR -2001:470:5:319::,2001:470:5:ffff:ffff:ffff:ffff:ffff,US -2001:470:6::,2001:470:6:7fff:ffff:ffff:ffff:ffff,MX -2001:470:6:8000::,2001:470:d:11b:ffff:ffff:ffff:ffff,US -2001:470:d:11c::,2001:470:d:11c:ffff:ffff:ffff:ffff,NZ -2001:470:d:11d::,2001:470:17:ffff:ffff:ffff:ffff:ffff,US -2001:470:18::,2001:470:18:7fff:ffff:ffff:ffff:ffff,CN -2001:470:18:8000::,2001:470:18:ffff:ffff:ffff:ffff:ffff,US -2001:470:19::,2001:470:19:e7f:ffff:ffff:ffff:ffff,CN -2001:470:19:e80::,2001:470:19:e80:ffff:ffff:ffff:ffff,HK -2001:470:19:e81::,2001:470:19:7fff:ffff:ffff:ffff:ffff,CN -2001:470:19:8000::,2001:470:1c:ffff:ffff:ffff:ffff:ffff,US -2001:470:1d::,2001:470:1d:7fff:ffff:ffff:ffff:ffff,CA -2001:470:1d:8000::,2001:470:23:1ff:ffff:ffff:ffff:ffff,US -2001:470:23:200::,2001:470:23:3ff:ffff:ffff:ffff:ffff,CN -2001:470:23:400::,2001:470:23:429:ffff:ffff:ffff:ffff,US -2001:470:23:42a::,2001:470:23:42a:ffff:ffff:ffff:ffff,RU -2001:470:23:42b::,2001:470:23:7ff:ffff:ffff:ffff:ffff,US -2001:470:23:800::,2001:470:23:fff:ffff:ffff:ffff:ffff,JP -2001:470:23:1000::,2001:470:23:ffff:ffff:ffff:ffff:ffff,US -2001:470:24::,2001:470:24:7fff:ffff:ffff:ffff:ffff,CN -2001:470:24:8000::,2001:470:24:ffff:ffff:ffff:ffff:ffff,US -2001:470:25::,2001:470:25:3ff:ffff:ffff:ffff:ffff,RU -2001:470:25:400::,2001:470:26:65b:ffff:ffff:ffff:ffff,US -2001:470:26:65c::,2001:470:26:65c:ffff:ffff:ffff:ffff,CH -2001:470:26:65d::,2001:470:26:825:ffff:ffff:ffff:ffff,US -2001:470:26:826::,2001:470:26:826:ffff:ffff:ffff:ffff,CH -2001:470:26:827::,2001:470:26:b6c:ffff:ffff:ffff:ffff,US -2001:470:26:b6d::,2001:470:26:b6d:ffff:ffff:ffff:ffff,AT -2001:470:26:b6e::,2001:470:27:1a5:ffff:ffff:ffff:ffff,US -2001:470:27:1a6::,2001:470:27:1a6:ffff:ffff:ffff:ffff,RU -2001:470:27:1a7::,2001:470:28:35:ffff:ffff:ffff:ffff,US -2001:470:28:36::,2001:470:28:36:ffff:ffff:ffff:ffff,SE -2001:470:28:37::,2001:470:28:1a5:ffff:ffff:ffff:ffff,US -2001:470:28:1a6::,2001:470:28:1a6:ffff:ffff:ffff:ffff,RU -2001:470:28:1a7::,2001:470:28:2df:ffff:ffff:ffff:ffff,US -2001:470:28:2e0::,2001:470:28:2e0:ffff:ffff:ffff:ffff,SE -2001:470:28:2e1::,2001:470:28:36d:ffff:ffff:ffff:ffff,US -2001:470:28:36e::,2001:470:28:36e:ffff:ffff:ffff:ffff,DK -2001:470:28:36f::,2001:470:28:3d4:ffff:ffff:ffff:ffff,US -2001:470:28:3d5::,2001:470:28:3d5:ffff:ffff:ffff:ffff,SE -2001:470:28:3d6::,2001:470:28:6dd:ffff:ffff:ffff:ffff,US -2001:470:28:6de::,2001:470:28:6de:ffff:ffff:ffff:ffff,SE -2001:470:28:6df::,2001:470:28:816:ffff:ffff:ffff:ffff,US -2001:470:28:817::,2001:470:28:817:ffff:ffff:ffff:ffff,DK -2001:470:28:818::,2001:470:28:906:ffff:ffff:ffff:ffff,US -2001:470:28:907::,2001:470:28:907:ffff:ffff:ffff:ffff,RU -2001:470:28:908::,2001:470:28:9c1:ffff:ffff:ffff:ffff,US -2001:470:28:9c2::,2001:470:28:9c2:ffff:ffff:ffff:ffff,SE -2001:470:28:9c3::,2001:470:28:a2b:ffff:ffff:ffff:ffff,US -2001:470:28:a2c::,2001:470:28:a2c:ffff:ffff:ffff:ffff,SE -2001:470:28:a2d::,2001:470:34:ffff:ffff:ffff:ffff:ffff,US -2001:470:35::,2001:470:35:7fff:ffff:ffff:ffff:ffff,TH -2001:470:35:8000::,2001:470:65:ffff:ffff:ffff:ffff:ffff,US -2001:470:66::,2001:470:66:7ff:ffff:ffff:ffff:ffff,CN -2001:470:66:800::,2001:470:66:bff:ffff:ffff:ffff:ffff,US -2001:470:66:c00::,2001:470:66:fff:ffff:ffff:ffff:ffff,CN -2001:470:66:1000::,2001:470:6d:6b1:ffff:ffff:ffff:ffff,US -2001:470:6d:6b2::,2001:470:6d:6b2:ffff:ffff:ffff:ffff,ES -2001:470:6d:6b3::,2001:470:6d:ffff:ffff:ffff:ffff:ffff,US -2001:470:6e::,2001:470:6e:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:6e:8000::,2001:470:6f:49e:ffff:ffff:ffff:ffff,US -2001:470:6f:49f::,2001:470:6f:49f:ffff:ffff:ffff:ffff,SK -2001:470:6f:4a0::,2001:470:70:dff:ffff:ffff:ffff:ffff,US -2001:470:70:e00::,2001:470:70:fff:ffff:ffff:ffff:ffff,UA -2001:470:70:1000::,2001:470:70:ffff:ffff:ffff:ffff:ffff,US -2001:470:71::,2001:470:71:5ff:ffff:ffff:ffff:ffff,RU -2001:470:71:600::,2001:470:71:600:ffff:ffff:ffff:ffff,PL -2001:470:71:601::,2001:470:71:60b:ffff:ffff:ffff:ffff,RU -2001:470:71:60c::,2001:470:71:60c:ffff:ffff:ffff:ffff,PL -2001:470:71:60d::,2001:470:71:7fff:ffff:ffff:ffff:ffff,RU -2001:470:71:8000::,2001:470:184b:ffff:ffff:ffff:ffff:ffff,US -2001:470:184c::,2001:470:184c:7fff:ffff:ffff:ffff:ffff,GB -2001:470:184c:8000::,2001:470:1883:ffff:ffff:ffff:ffff:ffff,US -2001:470:1884::,2001:470:1884:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1884:8000::,2001:470:18a4:ffff:ffff:ffff:ffff:ffff,US -2001:470:18a5::,2001:470:18a5:7fff:ffff:ffff:ffff:ffff,GB -2001:470:18a5:8000::,2001:470:18aa:ffff:ffff:ffff:ffff:ffff,US -2001:470:18ab::,2001:470:18ab:ffff:ffff:ffff:ffff:ffff,GB -2001:470:18ac::,2001:470:18b6:ffff:ffff:ffff:ffff:ffff,US -2001:470:18b7::,2001:470:18b7:7fff:ffff:ffff:ffff:ffff,GB -2001:470:18b7:8000::,2001:470:18c2:ffff:ffff:ffff:ffff:ffff,US -2001:470:18c3::,2001:470:18c3:7fff:ffff:ffff:ffff:ffff,GB -2001:470:18c3:8000::,2001:470:18cc:ffff:ffff:ffff:ffff:ffff,US -2001:470:18cd::,2001:470:18cd:7fff:ffff:ffff:ffff:ffff,GB -2001:470:18cd:8000::,2001:470:18d6:ffff:ffff:ffff:ffff:ffff,US -2001:470:18d7::,2001:470:18d7:7fff:ffff:ffff:ffff:ffff,GB -2001:470:18d7:8000::,2001:470:18d8:ffff:ffff:ffff:ffff:ffff,US -2001:470:18d9::,2001:470:18d9:7fff:ffff:ffff:ffff:ffff,ZA -2001:470:18d9:8000::,2001:470:191f:ffff:ffff:ffff:ffff:ffff,US -2001:470:1920::,2001:470:1920:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1920:8000::,2001:470:1920:ffff:ffff:ffff:ffff:ffff,US -2001:470:1921::,2001:470:1921:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1921:8000::,2001:470:1962:ffff:ffff:ffff:ffff:ffff,US -2001:470:1963::,2001:470:1963:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1963:8000::,2001:470:1973:ffff:ffff:ffff:ffff:ffff,US -2001:470:1974::,2001:470:1974:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1974:8000::,2001:470:1985:ffff:ffff:ffff:ffff:ffff,US -2001:470:1986::,2001:470:1986:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1986:8000::,2001:470:19a5:ffff:ffff:ffff:ffff:ffff,US -2001:470:19a6::,2001:470:19a6:7fff:ffff:ffff:ffff:ffff,GB -2001:470:19a6:8000::,2001:470:19a8:ffff:ffff:ffff:ffff:ffff,US -2001:470:19a9::,2001:470:19a9:7fff:ffff:ffff:ffff:ffff,GB -2001:470:19a9:8000::,2001:470:19cc:ffff:ffff:ffff:ffff:ffff,US -2001:470:19cd::,2001:470:19cd:7fff:ffff:ffff:ffff:ffff,GB -2001:470:19cd:8000::,2001:470:19d9:ffff:ffff:ffff:ffff:ffff,US -2001:470:19da::,2001:470:19da:7fff:ffff:ffff:ffff:ffff,GB -2001:470:19da:8000::,2001:470:19de:ffff:ffff:ffff:ffff:ffff,US -2001:470:19df::,2001:470:19df:7fff:ffff:ffff:ffff:ffff,GB -2001:470:19df:8000::,2001:470:19ff:ffff:ffff:ffff:ffff:ffff,US -2001:470:1a00::,2001:470:1a00:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1a00:8000::,2001:470:1a10:ffff:ffff:ffff:ffff:ffff,US -2001:470:1a11::,2001:470:1a11:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1a11:8000::,2001:470:1a3d:ffff:ffff:ffff:ffff:ffff,US -2001:470:1a3e::,2001:470:1a3e:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1a3e:8000::,2001:470:1ad8:ffff:ffff:ffff:ffff:ffff,US -2001:470:1ad9::,2001:470:1ad9:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1ad9:8000::,2001:470:1b1e:ffff:ffff:ffff:ffff:ffff,US -2001:470:1b1f::,2001:470:1b1f:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1b1f:8000::,2001:470:1b2d:ffff:ffff:ffff:ffff:ffff,US -2001:470:1b2e::,2001:470:1b2e:ffff:ffff:ffff:ffff:ffff,GB -2001:470:1b2f::,2001:470:1b4a:ffff:ffff:ffff:ffff:ffff,US -2001:470:1b4b::,2001:470:1b4b:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1b4b:8000::,2001:470:1b62:ffff:ffff:ffff:ffff:ffff,US -2001:470:1b63::,2001:470:1b63:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1b63:8000::,2001:470:1bc7:ffff:ffff:ffff:ffff:ffff,US -2001:470:1bc8::,2001:470:1bc8:7fff:ffff:ffff:ffff:ffff,PT -2001:470:1bc8:8000::,2001:470:1c09:ffff:ffff:ffff:ffff:ffff,US -2001:470:1c0a::,2001:470:1c0a:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1c0a:8000::,2001:470:1d20:ffff:ffff:ffff:ffff:ffff,US -2001:470:1d21::,2001:470:1d21:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1d21:8000::,2001:470:1d32:ffff:ffff:ffff:ffff:ffff,US -2001:470:1d33::,2001:470:1d33:7fff:ffff:ffff:ffff:ffff,GB -2001:470:1d33:8000::,2001:470:1f00:ffff:ffff:ffff:ffff:ffff,US -2001:470:1f01::,2001:470:1f01:7fff:ffff:ffff:ffff:ffff,NZ -2001:470:1f01:8000::,2001:470:1f07:ffff:ffff:ffff:ffff:ffff,US -2001:470:1f08::,2001:470:1f08:fff:ffff:ffff:ffff:ffff,GB -2001:470:1f08:1000::,2001:470:1f08:1219:ffff:ffff:ffff:ffff,US -2001:470:1f08:121a::,2001:470:1f08:121a:ffff:ffff:ffff:ffff,GB -2001:470:1f08:121b::,2001:470:1f08:1367:ffff:ffff:ffff:ffff,US -2001:470:1f08:1368::,2001:470:1f08:1368:ffff:ffff:ffff:ffff,GB -2001:470:1f08:1369::,2001:470:1f09:114:ffff:ffff:ffff:ffff,US -2001:470:1f09:115::,2001:470:1f09:115:ffff:ffff:ffff:ffff,GB -2001:470:1f09:116::,2001:470:1f09:2b5:ffff:ffff:ffff:ffff,US -2001:470:1f09:2b6::,2001:470:1f09:2b6:ffff:ffff:ffff:ffff,GB -2001:470:1f09:2b7::,2001:470:1f09:414:ffff:ffff:ffff:ffff,US -2001:470:1f09:415::,2001:470:1f09:415:ffff:ffff:ffff:ffff,GB -2001:470:1f09:416::,2001:470:1f09:1219:ffff:ffff:ffff:ffff,US -2001:470:1f09:121a::,2001:470:1f09:121a:ffff:ffff:ffff:ffff,GB -2001:470:1f09:121b::,2001:470:1f09:1367:ffff:ffff:ffff:ffff,US -2001:470:1f09:1368::,2001:470:1f09:1368:ffff:ffff:ffff:ffff,GB -2001:470:1f09:1369::,2001:470:1f0a:1ff:ffff:ffff:ffff:ffff,US -2001:470:1f0a:200::,2001:470:1f0a:3ff:ffff:ffff:ffff:ffff,DE -2001:470:1f0a:400::,2001:470:1f0b:30e:ffff:ffff:ffff:ffff,US -2001:470:1f0b:30f::,2001:470:1f0b:30f:ffff:ffff:ffff:ffff,DE -2001:470:1f0b:310::,2001:470:1f0b:4b0:ffff:ffff:ffff:ffff,US -2001:470:1f0b:4b1::,2001:470:1f0b:4b1:ffff:ffff:ffff:ffff,UA -2001:470:1f0b:4b2::,2001:470:1f0b:59f:ffff:ffff:ffff:ffff,US -2001:470:1f0b:5a0::,2001:470:1f0b:5a0:ffff:ffff:ffff:ffff,AT -2001:470:1f0b:5a1::,2001:470:1f0b:779:ffff:ffff:ffff:ffff,US -2001:470:1f0b:77a::,2001:470:1f0b:77a:ffff:ffff:ffff:ffff,DE -2001:470:1f0b:77b::,2001:470:1f0b:784:ffff:ffff:ffff:ffff,US -2001:470:1f0b:785::,2001:470:1f0b:785:ffff:ffff:ffff:ffff,PL -2001:470:1f0b:786::,2001:470:1f0b:be6:ffff:ffff:ffff:ffff,US -2001:470:1f0b:be7::,2001:470:1f0b:be7:ffff:ffff:ffff:ffff,RU -2001:470:1f0b:be8::,2001:470:1f0b:118a:ffff:ffff:ffff:ffff,US -2001:470:1f0b:118b::,2001:470:1f0b:118b:ffff:ffff:ffff:ffff,DE -2001:470:1f0b:118c::,2001:470:1f0b:11d1:ffff:ffff:ffff:ffff,US -2001:470:1f0b:11d2::,2001:470:1f0b:11d2:ffff:ffff:ffff:ffff,DE -2001:470:1f0b:11d3::,2001:470:1f15:b3:ffff:ffff:ffff:ffff,US -2001:470:1f15:b4::,2001:470:1f15:b4:ffff:ffff:ffff:ffff,NL -2001:470:1f15:b5::,2001:470:1f15:16b:ffff:ffff:ffff:ffff,US -2001:470:1f15:16c::,2001:470:1f15:16c:ffff:ffff:ffff:ffff,NL -2001:470:1f15:16d::,2001:470:1f15:20f:ffff:ffff:ffff:ffff,US -2001:470:1f15:210::,2001:470:1f15:210:ffff:ffff:ffff:ffff,NL -2001:470:1f15:211::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,US -2001:470:1f15:450::,2001:470:1f15:450:ffff:ffff:ffff:ffff,NL -2001:470:1f15:451::,2001:470:1f15:500:ffff:ffff:ffff:ffff,US -2001:470:1f15:501::,2001:470:1f15:501:ffff:ffff:ffff:ffff,NL -2001:470:1f15:502::,2001:470:1f15:582:ffff:ffff:ffff:ffff,US -2001:470:1f15:583::,2001:470:1f15:583:ffff:ffff:ffff:ffff,NL -2001:470:1f15:584::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,US -2001:470:1f15:5ac::,2001:470:1f15:5ac:ffff:ffff:ffff:ffff,NL -2001:470:1f15:5ad::,2001:470:1f15:9c5:ffff:ffff:ffff:ffff,US -2001:470:1f15:9c6::,2001:470:1f15:9c6:ffff:ffff:ffff:ffff,AT -2001:470:1f15:9c7::,2001:470:1f15:a5e:ffff:ffff:ffff:ffff,US -2001:470:1f15:a5f::,2001:470:1f15:a60:ffff:ffff:ffff:ffff,NL -2001:470:1f15:a61::,2001:470:1f15:b25:ffff:ffff:ffff:ffff,US -2001:470:1f15:b26::,2001:470:1f15:b26:ffff:ffff:ffff:ffff,NL -2001:470:1f15:b27::,2001:470:1f15:10db:ffff:ffff:ffff:ffff,US -2001:470:1f15:10dc::,2001:470:1f15:10dc:ffff:ffff:ffff:ffff,NL -2001:470:1f15:10dd::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,US -2001:470:1f15:110c::,2001:470:1f15:110c:ffff:ffff:ffff:ffff,BE -2001:470:1f15:110d::,2001:470:1f16:1ff:ffff:ffff:ffff:ffff,US -2001:470:1f16:200::,2001:470:1f16:2ff:ffff:ffff:ffff:ffff,CA -2001:470:1f16:300::,2001:470:1f16:ffff:ffff:ffff:ffff:ffff,US -2001:470:1f17::,2001:470:1f17:ff:ffff:ffff:ffff:ffff,MX -2001:470:1f17:100::,2001:470:1f1d:195:ffff:ffff:ffff:ffff,US -2001:470:1f1d:196::,2001:470:1f1d:196:ffff:ffff:ffff:ffff,GB -2001:470:1f1d:197::,2001:470:1f1d:929:ffff:ffff:ffff:ffff,US -2001:470:1f1d:92a::,2001:470:1f1d:92a:ffff:ffff:ffff:ffff,GB -2001:470:1f1d:92b::,2001:470:1f1d:a59:ffff:ffff:ffff:ffff,US -2001:470:1f1d:a5a::,2001:470:1f1d:a5a:ffff:ffff:ffff:ffff,GB -2001:470:1f1d:a5b::,2001:470:1f1e:ffff:ffff:ffff:ffff:ffff,US -2001:470:1f1f::,2001:470:1f1f:ff:ffff:ffff:ffff:ffff,AU -2001:470:1f1f:100::,2001:470:1f21:37:ffff:ffff:ffff:ffff,US -2001:470:1f21:38::,2001:470:1f21:38:ffff:ffff:ffff:ffff,PT -2001:470:1f21:39::,2001:470:1f22:ffff:ffff:ffff:ffff:ffff,US -2001:470:1f23::,2001:470:1f23:7fff:ffff:ffff:ffff:ffff,ZA -2001:470:1f23:8000::,2001:470:2000:ffff:ffff:ffff:ffff:ffff,US -2001:470:2001::,2001:470:2001:7fff:ffff:ffff:ffff:ffff,UA -2001:470:2001:8000::,2001:470:206d:ffff:ffff:ffff:ffff:ffff,US -2001:470:206e::,2001:470:206e:7fff:ffff:ffff:ffff:ffff,RO -2001:470:206e:8000::,2001:470:207f:ffff:ffff:ffff:ffff:ffff,US -2001:470:2080::,2001:470:2080:7fff:ffff:ffff:ffff:ffff,UA -2001:470:2080:8000::,2001:470:20c1:ffff:ffff:ffff:ffff:ffff,US -2001:470:20c2::,2001:470:20c2:7fff:ffff:ffff:ffff:ffff,HU -2001:470:20c2:8000::,2001:470:20f1:ffff:ffff:ffff:ffff:ffff,US -2001:470:20f2::,2001:470:20f2:7fff:ffff:ffff:ffff:ffff,HU -2001:470:20f2:8000::,2001:470:2102:ffff:ffff:ffff:ffff:ffff,US -2001:470:2103::,2001:470:2103:7fff:ffff:ffff:ffff:ffff,BG -2001:470:2103:8000::,2001:470:2104:ffff:ffff:ffff:ffff:ffff,US -2001:470:2105::,2001:470:2105:7fff:ffff:ffff:ffff:ffff,AT -2001:470:2105:8000::,2001:470:2128:ffff:ffff:ffff:ffff:ffff,US -2001:470:2129::,2001:470:2129:7fff:ffff:ffff:ffff:ffff,HU -2001:470:2129:8000::,2001:470:2166:ffff:ffff:ffff:ffff:ffff,US -2001:470:2167::,2001:470:2167:7fff:ffff:ffff:ffff:ffff,TR -2001:470:2167:8000::,2001:470:216f:ffff:ffff:ffff:ffff:ffff,US -2001:470:2170::,2001:470:2170:7fff:ffff:ffff:ffff:ffff,AT -2001:470:2170:8000::,2001:470:2184:ffff:ffff:ffff:ffff:ffff,US -2001:470:2185::,2001:470:2185:7fff:ffff:ffff:ffff:ffff,AT -2001:470:2185:8000::,2001:470:21fb:ffff:ffff:ffff:ffff:ffff,US -2001:470:21fc::,2001:470:21fc:7fff:ffff:ffff:ffff:ffff,UA -2001:470:21fc:8000::,2001:470:2218:ffff:ffff:ffff:ffff:ffff,US -2001:470:2219::,2001:470:2219:7fff:ffff:ffff:ffff:ffff,HU -2001:470:2219:8000::,2001:470:28d8:ffff:ffff:ffff:ffff:ffff,US -2001:470:28d9::,2001:470:28d9:7fff:ffff:ffff:ffff:ffff,CN -2001:470:28d9:8000::,2001:470:3049:ffff:ffff:ffff:ffff:ffff,US -2001:470:304a::,2001:470:304a:7fff:ffff:ffff:ffff:ffff,MX -2001:470:304a:8000::,2001:470:30b8:ffff:ffff:ffff:ffff:ffff,US -2001:470:30b9::,2001:470:30b9:7fff:ffff:ffff:ffff:ffff,CA -2001:470:30b9:8000::,2001:470:30ea:ffff:ffff:ffff:ffff:ffff,US -2001:470:30eb::,2001:470:30eb:7fff:ffff:ffff:ffff:ffff,CA -2001:470:30eb:8000::,2001:470:3918:ffff:ffff:ffff:ffff:ffff,US -2001:470:3919::,2001:470:3919:7fff:ffff:ffff:ffff:ffff,AU -2001:470:3919:8000::,2001:470:4a08:ffff:ffff:ffff:ffff:ffff,US -2001:470:4a09::,2001:470:4a09:7fff:ffff:ffff:ffff:ffff,CA -2001:470:4a09:8000::,2001:470:4a60:ffff:ffff:ffff:ffff:ffff,US -2001:470:4a61::,2001:470:4a61:7fff:ffff:ffff:ffff:ffff,CN -2001:470:4a61:8000::,2001:470:4a63:ffff:ffff:ffff:ffff:ffff,US -2001:470:4a64::,2001:470:4a64:ffff:ffff:ffff:ffff:ffff,NZ -2001:470:4a65::,2001:470:4a77:ffff:ffff:ffff:ffff:ffff,US -2001:470:4a78::,2001:470:4a78:7fff:ffff:ffff:ffff:ffff,GB -2001:470:4a78:8000::,2001:470:4baa:7fff:ffff:ffff:ffff:ffff,US -2001:470:4baa:8000::,2001:470:4baa:ffff:ffff:ffff:ffff:ffff,CN -2001:470:4bab::,2001:470:4bbb:ffff:ffff:ffff:ffff:ffff,US -2001:470:4bbc::,2001:470:4bbc:7fff:ffff:ffff:ffff:ffff,CN -2001:470:4bbc:8000::,2001:470:5065:ffff:ffff:ffff:ffff:ffff,US -2001:470:5066::,2001:470:5066:7fff:ffff:ffff:ffff:ffff,DE -2001:470:5066:8000::,2001:470:5090:ffff:ffff:ffff:ffff:ffff,US -2001:470:5091::,2001:470:5091:7fff:ffff:ffff:ffff:ffff,DE -2001:470:5091:8000::,2001:470:5106:ffff:ffff:ffff:ffff:ffff,US -2001:470:5107::,2001:470:5107:7fff:ffff:ffff:ffff:ffff,DE -2001:470:5107:8000::,2001:470:5167:ffff:ffff:ffff:ffff:ffff,US -2001:470:5168::,2001:470:5168:7fff:ffff:ffff:ffff:ffff,DE -2001:470:5168:8000::,2001:470:519d:ffff:ffff:ffff:ffff:ffff,US -2001:470:519e::,2001:470:519e:7fff:ffff:ffff:ffff:ffff,DE -2001:470:519e:8000::,2001:470:51d8:ffff:ffff:ffff:ffff:ffff,US -2001:470:51d9::,2001:470:51d9:7fff:ffff:ffff:ffff:ffff,DE -2001:470:51d9:8000::,2001:470:52ba:ffff:ffff:ffff:ffff:ffff,US -2001:470:52bb::,2001:470:52bb:7fff:ffff:ffff:ffff:ffff,UA -2001:470:52bb:8000::,2001:470:5329:ffff:ffff:ffff:ffff:ffff,US -2001:470:532a::,2001:470:532a:7fff:ffff:ffff:ffff:ffff,DE -2001:470:532a:8000::,2001:470:581f:ffff:ffff:ffff:ffff:ffff,US -2001:470:5820::,2001:470:5820:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:5821::,2001:470:591d:7fff:ffff:ffff:ffff:ffff,US -2001:470:591d:8000::,2001:470:591d:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:591e::,2001:470:59c0:ffff:ffff:ffff:ffff:ffff,US -2001:470:59c1::,2001:470:59c1:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:59c1:8000::,2001:470:59d7:ffff:ffff:ffff:ffff:ffff,US -2001:470:59d8::,2001:470:59d8:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:59d8:8000::,2001:470:59ed:ffff:ffff:ffff:ffff:ffff,US -2001:470:59ee::,2001:470:59ee:7fff:ffff:ffff:ffff:ffff,SK -2001:470:59ee:8000::,2001:470:59ff:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a00::,2001:470:5a00:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:5a00:8000::,2001:470:5a0d:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a0e::,2001:470:5a0e:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:5a0e:8000::,2001:470:5a2e:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a2f::,2001:470:5a2f:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:5a2f:8000::,2001:470:5a34:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a35::,2001:470:5a35:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:5a36::,2001:470:5a39:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a3a::,2001:470:5a3a:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:5a3b::,2001:470:5a80:ffff:ffff:ffff:ffff:ffff,US -2001:470:5a81::,2001:470:5a81:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:5a82::,2001:470:5aed:ffff:ffff:ffff:ffff:ffff,US -2001:470:5aee::,2001:470:5aee:7fff:ffff:ffff:ffff:ffff,AT -2001:470:5aee:8000::,2001:470:5b15:ffff:ffff:ffff:ffff:ffff,US -2001:470:5b16::,2001:470:5b16:7fff:ffff:ffff:ffff:ffff,SK -2001:470:5b16:8000::,2001:470:5b55:ffff:ffff:ffff:ffff:ffff,US -2001:470:5b56::,2001:470:5b56:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:5b56:8000::,2001:470:5b6c:7fff:ffff:ffff:ffff:ffff,US -2001:470:5b6c:8000::,2001:470:5b6c:ffff:ffff:ffff:ffff:ffff,CZ -2001:470:5b6d::,2001:470:5bb1:ffff:ffff:ffff:ffff:ffff,US -2001:470:5bb2::,2001:470:5bb2:7fff:ffff:ffff:ffff:ffff,CZ -2001:470:5bb2:8000::,2001:470:6004:ffff:ffff:ffff:ffff:ffff,US -2001:470:6005::,2001:470:6005:7fff:ffff:ffff:ffff:ffff,PL -2001:470:6005:8000::,2001:470:605e:ffff:ffff:ffff:ffff:ffff,US -2001:470:605f::,2001:470:605f:7fff:ffff:ffff:ffff:ffff,PL -2001:470:605f:8000::,2001:470:613e:7fff:ffff:ffff:ffff:ffff,US -2001:470:613e:8000::,2001:470:613e:ffff:ffff:ffff:ffff:ffff,PL -2001:470:613f::,2001:470:613f:ffff:ffff:ffff:ffff:ffff,US -2001:470:6140::,2001:470:6140:7fff:ffff:ffff:ffff:ffff,PL -2001:470:6140:8000::,2001:470:6228:ffff:ffff:ffff:ffff:ffff,US -2001:470:6229::,2001:470:6229:7fff:ffff:ffff:ffff:ffff,PL -2001:470:6229:8000::,2001:470:627f:ffff:ffff:ffff:ffff:ffff,US -2001:470:6280::,2001:470:6280:7fff:ffff:ffff:ffff:ffff,PL -2001:470:6280:8000::,2001:470:62d4:ffff:ffff:ffff:ffff:ffff,US -2001:470:62d5::,2001:470:62d5:7fff:ffff:ffff:ffff:ffff,RU -2001:470:62d5:8000::,2001:470:6316:ffff:ffff:ffff:ffff:ffff,US -2001:470:6317::,2001:470:6317:7fff:ffff:ffff:ffff:ffff,PL -2001:470:6317:8000::,2001:470:632d:ffff:ffff:ffff:ffff:ffff,US -2001:470:632e::,2001:470:632e:7fff:ffff:ffff:ffff:ffff,RU -2001:470:632e:8000::,2001:470:645e:ffff:ffff:ffff:ffff:ffff,US -2001:470:645f::,2001:470:645f:7fff:ffff:ffff:ffff:ffff,PL -2001:470:645f:8000::,2001:470:6857:ffff:ffff:ffff:ffff:ffff,US -2001:470:6858::,2001:470:6858:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6858:8000::,2001:470:686f:ffff:ffff:ffff:ffff:ffff,US -2001:470:6870::,2001:470:6870:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6870:8000::,2001:470:6878:7fff:ffff:ffff:ffff:ffff,US -2001:470:6878:8000::,2001:470:6878:ffff:ffff:ffff:ffff:ffff,AT -2001:470:6879::,2001:470:68bd:ffff:ffff:ffff:ffff:ffff,US -2001:470:68be::,2001:470:68be:7fff:ffff:ffff:ffff:ffff,GB -2001:470:68be:8000::,2001:470:68cb:ffff:ffff:ffff:ffff:ffff,US -2001:470:68cc::,2001:470:68cc:7fff:ffff:ffff:ffff:ffff,IT -2001:470:68cc:8000::,2001:470:691d:ffff:ffff:ffff:ffff:ffff,US -2001:470:691e::,2001:470:691e:7fff:ffff:ffff:ffff:ffff,GB -2001:470:691e:8000::,2001:470:6924:ffff:ffff:ffff:ffff:ffff,US -2001:470:6925::,2001:470:6925:7fff:ffff:ffff:ffff:ffff,ES -2001:470:6925:8000::,2001:470:6953:ffff:ffff:ffff:ffff:ffff,US -2001:470:6954::,2001:470:6954:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6954:8000::,2001:470:6a28:ffff:ffff:ffff:ffff:ffff,US -2001:470:6a29::,2001:470:6a29:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6a29:8000::,2001:470:6a4d:ffff:ffff:ffff:ffff:ffff,US -2001:470:6a4e::,2001:470:6a4e:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6a4e:8000::,2001:470:6a51:ffff:ffff:ffff:ffff:ffff,US -2001:470:6a52::,2001:470:6a52:7fff:ffff:ffff:ffff:ffff,IT -2001:470:6a52:8000::,2001:470:6a62:ffff:ffff:ffff:ffff:ffff,US -2001:470:6a63::,2001:470:6a63:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6a63:8000::,2001:470:6ad1:ffff:ffff:ffff:ffff:ffff,US -2001:470:6ad2::,2001:470:6ad2:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6ad2:8000::,2001:470:6b28:ffff:ffff:ffff:ffff:ffff,US -2001:470:6b29::,2001:470:6b29:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6b29:8000::,2001:470:6bb1:ffff:ffff:ffff:ffff:ffff,US -2001:470:6bb2::,2001:470:6bb2:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6bb2:8000::,2001:470:6be2:7fff:ffff:ffff:ffff:ffff,US -2001:470:6be2:8000::,2001:470:6be2:ffff:ffff:ffff:ffff:ffff,GB -2001:470:6be3::,2001:470:6c1b:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c1c::,2001:470:6c1c:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c1c:8000::,2001:470:6c1f:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c20::,2001:470:6c20:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c20:8000::,2001:470:6c2a:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c2b::,2001:470:6c2b:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c2b:8000::,2001:470:6c3a:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c3b::,2001:470:6c3b:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c3b:8000::,2001:470:6c3d:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c3e::,2001:470:6c3e:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c3e:8000::,2001:470:6c8e:ffff:ffff:ffff:ffff:ffff,US -2001:470:6c8f::,2001:470:6c8f:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6c8f:8000::,2001:470:6caa:ffff:ffff:ffff:ffff:ffff,US -2001:470:6cab::,2001:470:6cab:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6cab:8000::,2001:470:6cad:ffff:ffff:ffff:ffff:ffff,US -2001:470:6cae::,2001:470:6cae:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6cae:8000::,2001:470:6cda:ffff:ffff:ffff:ffff:ffff,US -2001:470:6cdb::,2001:470:6cdb:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6cdb:8000::,2001:470:6ce3:ffff:ffff:ffff:ffff:ffff,US -2001:470:6ce4::,2001:470:6ce4:7fff:ffff:ffff:ffff:ffff,RU -2001:470:6ce4:8000::,2001:470:6d28:ffff:ffff:ffff:ffff:ffff,US -2001:470:6d29::,2001:470:6d29:ffff:ffff:ffff:ffff:ffff,GB -2001:470:6d2a::,2001:470:6d70:ffff:ffff:ffff:ffff:ffff,US -2001:470:6d71::,2001:470:6d71:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6d71:8000::,2001:470:6d74:ffff:ffff:ffff:ffff:ffff,US -2001:470:6d75::,2001:470:6d75:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6d75:8000::,2001:470:6d75:ffff:ffff:ffff:ffff:ffff,US -2001:470:6d76::,2001:470:6d76:ffff:ffff:ffff:ffff:ffff,GB -2001:470:6d77::,2001:470:6d7a:ffff:ffff:ffff:ffff:ffff,US -2001:470:6d7b::,2001:470:6d7b:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6d7b:8000::,2001:470:6e04:ffff:ffff:ffff:ffff:ffff,US -2001:470:6e05::,2001:470:6e05:7fff:ffff:ffff:ffff:ffff,GR -2001:470:6e05:8000::,2001:470:6e14:ffff:ffff:ffff:ffff:ffff,US -2001:470:6e15::,2001:470:6e15:7fff:ffff:ffff:ffff:ffff,ZA -2001:470:6e15:8000::,2001:470:6e1a:ffff:ffff:ffff:ffff:ffff,US -2001:470:6e1b::,2001:470:6e1b:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6e1b:8000::,2001:470:6ef4:ffff:ffff:ffff:ffff:ffff,US -2001:470:6ef5::,2001:470:6ef5:7fff:ffff:ffff:ffff:ffff,GB -2001:470:6ef5:8000::,2001:470:6f5b:ffff:ffff:ffff:ffff:ffff,US -2001:470:6f5c::,2001:470:6f5c:ffff:ffff:ffff:ffff:ffff,GB -2001:470:6f5d::,2001:470:700c:ffff:ffff:ffff:ffff:ffff,US -2001:470:700d::,2001:470:700d:7fff:ffff:ffff:ffff:ffff,DE -2001:470:700d:8000::,2001:470:701e:ffff:ffff:ffff:ffff:ffff,US -2001:470:701f::,2001:470:701f:7fff:ffff:ffff:ffff:ffff,DE -2001:470:701f:8000::,2001:470:703f:7fff:ffff:ffff:ffff:ffff,US -2001:470:703f:8000::,2001:470:703f:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7040::,2001:470:710f:ffff:ffff:ffff:ffff:ffff,US -2001:470:7110::,2001:470:7110:7fff:ffff:ffff:ffff:ffff,RU -2001:470:7110:8000::,2001:470:7135:ffff:ffff:ffff:ffff:ffff,US -2001:470:7136::,2001:470:7136:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7136:8000::,2001:470:7142:ffff:ffff:ffff:ffff:ffff,US -2001:470:7143::,2001:470:7143:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7143:8000::,2001:470:714c:ffff:ffff:ffff:ffff:ffff,US -2001:470:714d::,2001:470:714d:7fff:ffff:ffff:ffff:ffff,DE -2001:470:714d:8000::,2001:470:7170:ffff:ffff:ffff:ffff:ffff,US -2001:470:7171::,2001:470:7171:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7172::,2001:470:718d:ffff:ffff:ffff:ffff:ffff,US -2001:470:718e::,2001:470:718e:7fff:ffff:ffff:ffff:ffff,DE -2001:470:718e:8000::,2001:470:7204:ffff:ffff:ffff:ffff:ffff,US -2001:470:7205::,2001:470:7205:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7205:8000::,2001:470:7224:ffff:ffff:ffff:ffff:ffff,US -2001:470:7225::,2001:470:7225:7fff:ffff:ffff:ffff:ffff,RU -2001:470:7225:8000::,2001:470:7257:ffff:ffff:ffff:ffff:ffff,US -2001:470:7258::,2001:470:7258:7fff:ffff:ffff:ffff:ffff,HR -2001:470:7258:8000::,2001:470:7263:ffff:ffff:ffff:ffff:ffff,US -2001:470:7264::,2001:470:7264:7fff:ffff:ffff:ffff:ffff,AT -2001:470:7264:8000::,2001:470:7271:ffff:ffff:ffff:ffff:ffff,US -2001:470:7272::,2001:470:7272:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7273::,2001:470:727f:ffff:ffff:ffff:ffff:ffff,US -2001:470:7280::,2001:470:7280:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7280:8000::,2001:470:7286:ffff:ffff:ffff:ffff:ffff,US -2001:470:7287::,2001:470:7287:ffff:ffff:ffff:ffff:ffff,PL -2001:470:7288::,2001:470:7292:ffff:ffff:ffff:ffff:ffff,US -2001:470:7293::,2001:470:7293:7fff:ffff:ffff:ffff:ffff,IT -2001:470:7293:8000::,2001:470:72d1:ffff:ffff:ffff:ffff:ffff,US -2001:470:72d2::,2001:470:72d2:7fff:ffff:ffff:ffff:ffff,RU -2001:470:72d2:8000::,2001:470:72da:ffff:ffff:ffff:ffff:ffff,US -2001:470:72db::,2001:470:72db:7fff:ffff:ffff:ffff:ffff,RU -2001:470:72db:8000::,2001:470:730f:ffff:ffff:ffff:ffff:ffff,US -2001:470:7310::,2001:470:7310:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7310:8000::,2001:470:7333:ffff:ffff:ffff:ffff:ffff,US -2001:470:7334::,2001:470:7334:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7334:8000::,2001:470:733b:ffff:ffff:ffff:ffff:ffff,US -2001:470:733c::,2001:470:733c:7fff:ffff:ffff:ffff:ffff,RU -2001:470:733c:8000::,2001:470:733e:ffff:ffff:ffff:ffff:ffff,US -2001:470:733f::,2001:470:733f:7fff:ffff:ffff:ffff:ffff,DE -2001:470:733f:8000::,2001:470:7351:ffff:ffff:ffff:ffff:ffff,US -2001:470:7352::,2001:470:7352:7fff:ffff:ffff:ffff:ffff,RU -2001:470:7352:8000::,2001:470:7354:ffff:ffff:ffff:ffff:ffff,US -2001:470:7355::,2001:470:7355:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7355:8000::,2001:470:73a7:7fff:ffff:ffff:ffff:ffff,US -2001:470:73a7:8000::,2001:470:73a7:ffff:ffff:ffff:ffff:ffff,RU -2001:470:73a8::,2001:470:7403:ffff:ffff:ffff:ffff:ffff,US -2001:470:7404::,2001:470:7404:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7404:8000::,2001:470:7421:ffff:ffff:ffff:ffff:ffff,US -2001:470:7422::,2001:470:7422:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7423::,2001:470:743e:ffff:ffff:ffff:ffff:ffff,US -2001:470:743f::,2001:470:743f:7fff:ffff:ffff:ffff:ffff,DE -2001:470:743f:8000::,2001:470:7479:ffff:ffff:ffff:ffff:ffff,US -2001:470:747a::,2001:470:747a:7fff:ffff:ffff:ffff:ffff,DE -2001:470:747a:8000::,2001:470:74b8:ffff:ffff:ffff:ffff:ffff,US -2001:470:74b9::,2001:470:74b9:7fff:ffff:ffff:ffff:ffff,RS -2001:470:74b9:8000::,2001:470:7507:ffff:ffff:ffff:ffff:ffff,US -2001:470:7508::,2001:470:7508:7fff:ffff:ffff:ffff:ffff,GR -2001:470:7508:8000::,2001:470:7557:ffff:ffff:ffff:ffff:ffff,US -2001:470:7558::,2001:470:7558:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7558:8000::,2001:470:756e:ffff:ffff:ffff:ffff:ffff,US -2001:470:756f::,2001:470:756f:7fff:ffff:ffff:ffff:ffff,EG -2001:470:756f:8000::,2001:470:7572:7fff:ffff:ffff:ffff:ffff,US -2001:470:7572:8000::,2001:470:7572:ffff:ffff:ffff:ffff:ffff,DE -2001:470:7573::,2001:470:7594:ffff:ffff:ffff:ffff:ffff,US -2001:470:7595::,2001:470:7595:7fff:ffff:ffff:ffff:ffff,AT -2001:470:7595:8000::,2001:470:759e:ffff:ffff:ffff:ffff:ffff,US -2001:470:759f::,2001:470:759f:7fff:ffff:ffff:ffff:ffff,DE -2001:470:759f:8000::,2001:470:75b2:ffff:ffff:ffff:ffff:ffff,US -2001:470:75b3::,2001:470:75b3:7fff:ffff:ffff:ffff:ffff,DE -2001:470:75b3:8000::,2001:470:75e5:ffff:ffff:ffff:ffff:ffff,US -2001:470:75e6::,2001:470:75e6:ffff:ffff:ffff:ffff:ffff,RU -2001:470:75e7::,2001:470:7690:ffff:ffff:ffff:ffff:ffff,US -2001:470:7691::,2001:470:7691:7fff:ffff:ffff:ffff:ffff,DE -2001:470:7691:8000::,2001:470:76e0:ffff:ffff:ffff:ffff:ffff,US -2001:470:76e1::,2001:470:76e1:7fff:ffff:ffff:ffff:ffff,DE -2001:470:76e1:8000::,2001:470:77ac:ffff:ffff:ffff:ffff:ffff,US -2001:470:77ad::,2001:470:77ad:7fff:ffff:ffff:ffff:ffff,MD -2001:470:77ad:8000::,2001:470:7829:ffff:ffff:ffff:ffff:ffff,US -2001:470:782a::,2001:470:782a:7fff:ffff:ffff:ffff:ffff,NL -2001:470:782a:8000::,2001:470:782f:ffff:ffff:ffff:ffff:ffff,US -2001:470:7830::,2001:470:7830:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7830:8000::,2001:470:7844:ffff:ffff:ffff:ffff:ffff,US -2001:470:7845::,2001:470:7845:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7845:8000::,2001:470:7852:ffff:ffff:ffff:ffff:ffff,US -2001:470:7853::,2001:470:7853:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7853:8000::,2001:470:7859:ffff:ffff:ffff:ffff:ffff,US -2001:470:785a::,2001:470:785a:ffff:ffff:ffff:ffff:ffff,AT -2001:470:785b::,2001:470:7872:ffff:ffff:ffff:ffff:ffff,US -2001:470:7873::,2001:470:7873:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7873:8000::,2001:470:7893:ffff:ffff:ffff:ffff:ffff,US -2001:470:7894::,2001:470:7894:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7894:8000::,2001:470:789e:ffff:ffff:ffff:ffff:ffff,US -2001:470:789f::,2001:470:789f:7fff:ffff:ffff:ffff:ffff,NL -2001:470:789f:8000::,2001:470:789f:ffff:ffff:ffff:ffff:ffff,US -2001:470:78a0::,2001:470:78a0:7fff:ffff:ffff:ffff:ffff,DE -2001:470:78a0:8000::,2001:470:78c7:ffff:ffff:ffff:ffff:ffff,US -2001:470:78c8::,2001:470:78c8:7fff:ffff:ffff:ffff:ffff,NL -2001:470:78c8:8000::,2001:470:78db:ffff:ffff:ffff:ffff:ffff,US -2001:470:78dc::,2001:470:78dc:7fff:ffff:ffff:ffff:ffff,NL -2001:470:78dc:8000::,2001:470:78e8:ffff:ffff:ffff:ffff:ffff,US -2001:470:78e9::,2001:470:78e9:7fff:ffff:ffff:ffff:ffff,LV -2001:470:78e9:8000::,2001:470:78f6:ffff:ffff:ffff:ffff:ffff,US -2001:470:78f7::,2001:470:78f7:7fff:ffff:ffff:ffff:ffff,DE -2001:470:78f7:8000::,2001:470:7919:ffff:ffff:ffff:ffff:ffff,US -2001:470:791a::,2001:470:791a:7fff:ffff:ffff:ffff:ffff,PL -2001:470:791a:8000::,2001:470:79ae:ffff:ffff:ffff:ffff:ffff,US -2001:470:79af::,2001:470:79af:7fff:ffff:ffff:ffff:ffff,NL -2001:470:79af:8000::,2001:470:79dc:ffff:ffff:ffff:ffff:ffff,US -2001:470:79dd::,2001:470:79dd:7fff:ffff:ffff:ffff:ffff,NL -2001:470:79dd:8000::,2001:470:79ec:ffff:ffff:ffff:ffff:ffff,US -2001:470:79ed::,2001:470:79ed:7fff:ffff:ffff:ffff:ffff,RU -2001:470:79ed:8000::,2001:470:7a0e:ffff:ffff:ffff:ffff:ffff,US -2001:470:7a0f::,2001:470:7a0f:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7a0f:8000::,2001:470:7a2e:7fff:ffff:ffff:ffff:ffff,US -2001:470:7a2e:8000::,2001:470:7a2e:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7a2f::,2001:470:7a40:ffff:ffff:ffff:ffff:ffff,US -2001:470:7a41::,2001:470:7a41:7fff:ffff:ffff:ffff:ffff,RU -2001:470:7a41:8000::,2001:470:7a94:ffff:ffff:ffff:ffff:ffff,US -2001:470:7a95::,2001:470:7a95:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7a95:8000::,2001:470:7a99:ffff:ffff:ffff:ffff:ffff,US -2001:470:7a9a::,2001:470:7a9a:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7a9b::,2001:470:7a9b:ffff:ffff:ffff:ffff:ffff,US -2001:470:7a9c::,2001:470:7a9c:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7a9c:8000::,2001:470:7ab5:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ab6::,2001:470:7ab6:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7ab6:8000::,2001:470:7ad1:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ad2::,2001:470:7ad2:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7ad3::,2001:470:7ad5:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ad6::,2001:470:7ad6:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7ad7::,2001:470:7aeb:7fff:ffff:ffff:ffff:ffff,US -2001:470:7aeb:8000::,2001:470:7aeb:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7aec::,2001:470:7b01:ffff:ffff:ffff:ffff:ffff,US -2001:470:7b02::,2001:470:7b02:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7b02:8000::,2001:470:7ba2:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ba3::,2001:470:7ba3:7fff:ffff:ffff:ffff:ffff,RU -2001:470:7ba3:8000::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ba7::,2001:470:7ba7:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7ba7:8000::,2001:470:7bbf:ffff:ffff:ffff:ffff:ffff,US -2001:470:7bc0::,2001:470:7bc0:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7bc1::,2001:470:7d33:ffff:ffff:ffff:ffff:ffff,US -2001:470:7d34::,2001:470:7d34:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7d34:8000::,2001:470:7d60:ffff:ffff:ffff:ffff:ffff,US -2001:470:7d61::,2001:470:7d61:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7d61:8000::,2001:470:7d66:ffff:ffff:ffff:ffff:ffff,US -2001:470:7d67::,2001:470:7d67:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7d67:8000::,2001:470:7d6a:ffff:ffff:ffff:ffff:ffff,US -2001:470:7d6b::,2001:470:7d6b:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7d6c::,2001:470:7db1:ffff:ffff:ffff:ffff:ffff,US -2001:470:7db2::,2001:470:7db2:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7db2:8000::,2001:470:7dbd:ffff:ffff:ffff:ffff:ffff,US -2001:470:7dbe::,2001:470:7dbe:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7dbe:8000::,2001:470:7e38:ffff:ffff:ffff:ffff:ffff,US -2001:470:7e39::,2001:470:7e39:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7e39:8000::,2001:470:7ea5:ffff:ffff:ffff:ffff:ffff,US -2001:470:7ea6::,2001:470:7ea6:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7ea7::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US -2001:470:80b7::,2001:470:80b7:7fff:ffff:ffff:ffff:ffff,CN -2001:470:80b7:8000::,2001:470:81b0:ffff:ffff:ffff:ffff:ffff,US -2001:470:81b1::,2001:470:81b1:7fff:ffff:ffff:ffff:ffff,CN -2001:470:81b1:8000::,2001:470:823b:7fff:ffff:ffff:ffff:ffff,US -2001:470:823b:8000::,2001:470:823b:ffff:ffff:ffff:ffff:ffff,CA -2001:470:823c::,2001:470:83a5:ffff:ffff:ffff:ffff:ffff,US -2001:470:83a6::,2001:470:83a6:7fff:ffff:ffff:ffff:ffff,CN -2001:470:83a6:8000::,2001:470:843a:ffff:ffff:ffff:ffff:ffff,US -2001:470:843b::,2001:470:843b:7fff:ffff:ffff:ffff:ffff,NZ -2001:470:843b:8000::,2001:470:859e:ffff:ffff:ffff:ffff:ffff,US -2001:470:859f::,2001:470:859f:7fff:ffff:ffff:ffff:ffff,AU -2001:470:859f:8000::,2001:470:8924:7fff:ffff:ffff:ffff:ffff,US -2001:470:8924:8000::,2001:470:8924:ffff:ffff:ffff:ffff:ffff,CA -2001:470:8925::,2001:470:94eb:ffff:ffff:ffff:ffff:ffff,US -2001:470:94ec::,2001:470:94ec:ffff:ffff:ffff:ffff:ffff,IM -2001:470:94ed::,2001:470:9624:ffff:ffff:ffff:ffff:ffff,US -2001:470:9625::,2001:470:9625:7fff:ffff:ffff:ffff:ffff,GB -2001:470:9625:8000::,2001:470:9678:ffff:ffff:ffff:ffff:ffff,US -2001:470:9679::,2001:470:9679:7fff:ffff:ffff:ffff:ffff,GB -2001:470:9679:8000::,2001:470:96a0:ffff:ffff:ffff:ffff:ffff,US -2001:470:96a1::,2001:470:96a1:7fff:ffff:ffff:ffff:ffff,GB -2001:470:96a1:8000::,2001:470:971e:ffff:ffff:ffff:ffff:ffff,US -2001:470:971f::,2001:470:971f:7fff:ffff:ffff:ffff:ffff,GB -2001:470:971f:8000::,2001:470:9794:ffff:ffff:ffff:ffff:ffff,US -2001:470:9795::,2001:470:9795:ffff:ffff:ffff:ffff:ffff,GB -2001:470:9796::,2001:470:97d6:7fff:ffff:ffff:ffff:ffff,US -2001:470:97d6:8000::,2001:470:97d6:ffff:ffff:ffff:ffff:ffff,GB -2001:470:97d7::,2001:470:97f0:ffff:ffff:ffff:ffff:ffff,US -2001:470:97f1::,2001:470:97f1:7fff:ffff:ffff:ffff:ffff,GB -2001:470:97f1:8000::,2001:470:98a2:ffff:ffff:ffff:ffff:ffff,US -2001:470:98a3::,2001:470:98a3:7fff:ffff:ffff:ffff:ffff,IT -2001:470:98a3:8000::,2001:470:999c:ffff:ffff:ffff:ffff:ffff,US -2001:470:999d::,2001:470:999d:ffff:ffff:ffff:ffff:ffff,DE -2001:470:999e::,2001:470:9ccc:ffff:ffff:ffff:ffff:ffff,US -2001:470:9ccd::,2001:470:9ccd:7fff:ffff:ffff:ffff:ffff,DE -2001:470:9ccd:8000::,2001:470:9fa8:ffff:ffff:ffff:ffff:ffff,US -2001:470:9fa9::,2001:470:9fa9:7fff:ffff:ffff:ffff:ffff,DE -2001:470:9fa9:8000::,2001:470:b0e1:ffff:ffff:ffff:ffff:ffff,US -2001:470:b0e2::,2001:470:b0e2:ffff:ffff:ffff:ffff:ffff,CA -2001:470:b0e3::,2001:470:b160:ffff:ffff:ffff:ffff:ffff,US -2001:470:b161::,2001:470:b161:7fff:ffff:ffff:ffff:ffff,CA -2001:470:b161:8000::,2001:470:b285:ffff:ffff:ffff:ffff:ffff,US -2001:470:b286::,2001:470:b286:7fff:ffff:ffff:ffff:ffff,CA -2001:470:b286:8000::,2001:470:b2cf:ffff:ffff:ffff:ffff:ffff,US -2001:470:b2d0::,2001:470:b2d0:7fff:ffff:ffff:ffff:ffff,CA -2001:470:b2d0:8000::,2001:470:b310:ffff:ffff:ffff:ffff:ffff,US -2001:470:b311::,2001:470:b311:7fff:ffff:ffff:ffff:ffff,CA -2001:470:b311:8000::,2001:470:b3d7:ffff:ffff:ffff:ffff:ffff,US -2001:470:b3d8::,2001:470:b3d8:7fff:ffff:ffff:ffff:ffff,CA -2001:470:b3d8:8000::,2001:470:b40c:ffff:ffff:ffff:ffff:ffff,US -2001:470:b40d::,2001:470:b40d:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b40d:8000::,2001:470:b41b:ffff:ffff:ffff:ffff:ffff,US -2001:470:b41c::,2001:470:b41c:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b41c:8000::,2001:470:b436:ffff:ffff:ffff:ffff:ffff,US -2001:470:b437::,2001:470:b437:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b437:8000::,2001:470:b44f:ffff:ffff:ffff:ffff:ffff,US -2001:470:b450::,2001:470:b450:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b450:8000::,2001:470:b4a5:ffff:ffff:ffff:ffff:ffff,US -2001:470:b4a6::,2001:470:b4a6:7fff:ffff:ffff:ffff:ffff,HR -2001:470:b4a6:8000::,2001:470:b4e9:ffff:ffff:ffff:ffff:ffff,US -2001:470:b4ea::,2001:470:b4ea:ffff:ffff:ffff:ffff:ffff,AT -2001:470:b4eb::,2001:470:b510:ffff:ffff:ffff:ffff:ffff,US -2001:470:b511::,2001:470:b511:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b511:8000::,2001:470:b531:ffff:ffff:ffff:ffff:ffff,US -2001:470:b532::,2001:470:b532:7fff:ffff:ffff:ffff:ffff,IL -2001:470:b532:8000::,2001:470:b539:ffff:ffff:ffff:ffff:ffff,US -2001:470:b53a::,2001:470:b53a:ffff:ffff:ffff:ffff:ffff,ES -2001:470:b53b::,2001:470:b5e8:ffff:ffff:ffff:ffff:ffff,US -2001:470:b5e9::,2001:470:b5e9:7fff:ffff:ffff:ffff:ffff,NO -2001:470:b5e9:8000::,2001:470:b625:ffff:ffff:ffff:ffff:ffff,US -2001:470:b626::,2001:470:b626:ff:ffff:ffff:ffff:ffff,DE -2001:470:b626:100::,2001:470:b662:ffff:ffff:ffff:ffff:ffff,US -2001:470:b663::,2001:470:b663:7fff:ffff:ffff:ffff:ffff,AT -2001:470:b663:8000::,2001:470:b670:ffff:ffff:ffff:ffff:ffff,US -2001:470:b671::,2001:470:b671:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b671:8000::,2001:470:b674:ffff:ffff:ffff:ffff:ffff,US -2001:470:b675::,2001:470:b675:7fff:ffff:ffff:ffff:ffff,CH -2001:470:b675:8000::,2001:470:b6d3:ffff:ffff:ffff:ffff:ffff,US -2001:470:b6d4::,2001:470:b6d4:7fff:ffff:ffff:ffff:ffff,DE -2001:470:b6d4:8000::,2001:470:b77d:ffff:ffff:ffff:ffff:ffff,US -2001:470:b77e::,2001:470:b77e:7fff:ffff:ffff:ffff:ffff,AT -2001:470:b77e:8000::,2001:470:c322:ffff:ffff:ffff:ffff:ffff,US -2001:470:c323::,2001:470:c323:7fff:ffff:ffff:ffff:ffff,CA -2001:470:c323:8000::,2001:470:c3c2:ffff:ffff:ffff:ffff:ffff,US -2001:470:c3c3::,2001:470:c3c3:7fff:ffff:ffff:ffff:ffff,CA -2001:470:c3c3:8000::,2001:470:c453:ffff:ffff:ffff:ffff:ffff,US -2001:470:c454::,2001:470:c454:7fff:ffff:ffff:ffff:ffff,CA -2001:470:c454:8000::,2001:470:c825:ffff:ffff:ffff:ffff:ffff,US -2001:470:c826::,2001:470:c826:7fff:ffff:ffff:ffff:ffff,FR -2001:470:c826:8000::,2001:470:c82c:ffff:ffff:ffff:ffff:ffff,US -2001:470:c82d::,2001:470:c82d:7fff:ffff:ffff:ffff:ffff,LU -2001:470:c82d:8000::,2001:470:c84d:ffff:ffff:ffff:ffff:ffff,US -2001:470:c84e::,2001:470:c84e:7fff:ffff:ffff:ffff:ffff,FR -2001:470:c84e:8000::,2001:470:c886:ffff:ffff:ffff:ffff:ffff,US -2001:470:c887::,2001:470:c887:ffff:ffff:ffff:ffff:ffff,ES -2001:470:c888::,2001:470:c963:ffff:ffff:ffff:ffff:ffff,US -2001:470:c964::,2001:470:c964:ffff:ffff:ffff:ffff:ffff,GB -2001:470:c965::,2001:470:ca2b:ffff:ffff:ffff:ffff:ffff,US -2001:470:ca2c::,2001:470:ca2c:7fff:ffff:ffff:ffff:ffff,FR -2001:470:ca2c:8000::,2001:470:ca71:ffff:ffff:ffff:ffff:ffff,US -2001:470:ca72::,2001:470:ca72:7fff:ffff:ffff:ffff:ffff,FR -2001:470:ca72:8000::,2001:470:caeb:ffff:ffff:ffff:ffff:ffff,US -2001:470:caec::,2001:470:caec:7fff:ffff:ffff:ffff:ffff,FR -2001:470:caec:8000::,2001:470:cbd2:ffff:ffff:ffff:ffff:ffff,US -2001:470:cbd3::,2001:470:cbd3:7fff:ffff:ffff:ffff:ffff,FR -2001:470:cbd3:8000::,2001:470:ccb9:ffff:ffff:ffff:ffff:ffff,US -2001:470:ccba::,2001:470:ccba:7fff:ffff:ffff:ffff:ffff,ES -2001:470:ccba:8000::,2001:470:ccc1:ffff:ffff:ffff:ffff:ffff,US -2001:470:ccc2::,2001:470:ccc2:7fff:ffff:ffff:ffff:ffff,BE -2001:470:ccc2:8000::,2001:470:cd93:7fff:ffff:ffff:ffff:ffff,US -2001:470:cd93:8000::,2001:470:cd93:ffff:ffff:ffff:ffff:ffff,FR -2001:470:cd94::,2001:470:d175:ffff:ffff:ffff:ffff:ffff,US -2001:470:d176::,2001:470:d176:7fff:ffff:ffff:ffff:ffff,NL -2001:470:d176:8000::,2001:470:d19a:ffff:ffff:ffff:ffff:ffff,US -2001:470:d19b::,2001:470:d19b:7fff:ffff:ffff:ffff:ffff,BE -2001:470:d19b:8000::,2001:470:d2d5:ffff:ffff:ffff:ffff:ffff,US -2001:470:d2d6::,2001:470:d2d6:7fff:ffff:ffff:ffff:ffff,NL -2001:470:d2d6:8000::,2001:470:d673:7fff:ffff:ffff:ffff:ffff,US -2001:470:d673:8000::,2001:470:d673:ffff:ffff:ffff:ffff:ffff,BE -2001:470:d674::,2001:470:d6ee:ffff:ffff:ffff:ffff:ffff,US -2001:470:d6ef::,2001:470:d6ef:ffff:ffff:ffff:ffff:ffff,FR -2001:470:d6f0::,2001:470:d890:ffff:ffff:ffff:ffff:ffff,US -2001:470:d891::,2001:470:d891:7fff:ffff:ffff:ffff:ffff,BR -2001:470:d891:8000::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US -2001:470:da02::,2001:470:da02:7fff:ffff:ffff:ffff:ffff,AR -2001:470:da02:8000::,2001:470:da99:ffff:ffff:ffff:ffff:ffff,US -2001:470:da9a::,2001:470:da9a:7fff:ffff:ffff:ffff:ffff,BS -2001:470:da9a:8000::,2001:470:da9c:ffff:ffff:ffff:ffff:ffff,US -2001:470:da9d::,2001:470:da9d:7fff:ffff:ffff:ffff:ffff,BR -2001:470:da9d:8000::,2001:470:dbba:ffff:ffff:ffff:ffff:ffff,US -2001:470:dbbb::,2001:470:dbbb:7fff:ffff:ffff:ffff:ffff,BR -2001:470:dbbb:8000::,2001:470:dc23:ffff:ffff:ffff:ffff:ffff,US -2001:470:dc24::,2001:470:dc24:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dc24:8000::,2001:470:dc44:ffff:ffff:ffff:ffff:ffff,US -2001:470:dc45::,2001:470:dc45:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dc45:8000::,2001:470:dc8b:ffff:ffff:ffff:ffff:ffff,US -2001:470:dc8c::,2001:470:dc8c:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dc8c:8000::,2001:470:dca5:ffff:ffff:ffff:ffff:ffff,US -2001:470:dca6::,2001:470:dca6:7fff:ffff:ffff:ffff:ffff,RU -2001:470:dca6:8000::,2001:470:dcb3:ffff:ffff:ffff:ffff:ffff,US -2001:470:dcb4::,2001:470:dcb4:7fff:ffff:ffff:ffff:ffff,NO -2001:470:dcb4:8000::,2001:470:dcba:ffff:ffff:ffff:ffff:ffff,US -2001:470:dcbb::,2001:470:dcbb:7fff:ffff:ffff:ffff:ffff,FI -2001:470:dcbb:8000::,2001:470:dce2:ffff:ffff:ffff:ffff:ffff,US -2001:470:dce3::,2001:470:dce3:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dce3:8000::,2001:470:dd03:ffff:ffff:ffff:ffff:ffff,US -2001:470:dd04::,2001:470:dd04:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dd04:8000::,2001:470:dd51:ffff:ffff:ffff:ffff:ffff,US -2001:470:dd52::,2001:470:dd52:7fff:ffff:ffff:ffff:ffff,IT -2001:470:dd52:8000::,2001:470:dd67:ffff:ffff:ffff:ffff:ffff,US -2001:470:dd68::,2001:470:dd68:ffff:ffff:ffff:ffff:ffff,DK -2001:470:dd69::,2001:470:dd8c:ffff:ffff:ffff:ffff:ffff,US -2001:470:dd8d::,2001:470:dd8d:7fff:ffff:ffff:ffff:ffff,RU -2001:470:dd8d:8000::,2001:470:de09:ffff:ffff:ffff:ffff:ffff,US -2001:470:de0a::,2001:470:de0a:7fff:ffff:ffff:ffff:ffff,NO -2001:470:de0a:8000::,2001:470:de0f:ffff:ffff:ffff:ffff:ffff,US -2001:470:de10::,2001:470:de10:7fff:ffff:ffff:ffff:ffff,LV -2001:470:de10:8000::,2001:470:de3f:ffff:ffff:ffff:ffff:ffff,US -2001:470:de40::,2001:470:de40:7fff:ffff:ffff:ffff:ffff,NO -2001:470:de40:8000::,2001:470:de41:ffff:ffff:ffff:ffff:ffff,US -2001:470:de42::,2001:470:de42:7fff:ffff:ffff:ffff:ffff,IS -2001:470:de42:8000::,2001:470:de97:ffff:ffff:ffff:ffff:ffff,US -2001:470:de98::,2001:470:de98:7fff:ffff:ffff:ffff:ffff,RU -2001:470:de98:8000::,2001:470:dea3:ffff:ffff:ffff:ffff:ffff,US -2001:470:dea4::,2001:470:dea4:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dea4:8000::,2001:470:dec3:ffff:ffff:ffff:ffff:ffff,US -2001:470:dec4::,2001:470:dec4:ffff:ffff:ffff:ffff:ffff,SE -2001:470:dec5::,2001:470:ded3:ffff:ffff:ffff:ffff:ffff,US -2001:470:ded4::,2001:470:ded4:7fff:ffff:ffff:ffff:ffff,SE -2001:470:ded4:8000::,2001:470:dedd:ffff:ffff:ffff:ffff:ffff,US -2001:470:dede::,2001:470:dede:7fff:ffff:ffff:ffff:ffff,NO -2001:470:dede:8000::,2001:470:dee2:ffff:ffff:ffff:ffff:ffff,US -2001:470:dee3::,2001:470:dee3:ffff:ffff:ffff:ffff:ffff,NO -2001:470:dee4::,2001:470:df04:ffff:ffff:ffff:ffff:ffff,US -2001:470:df05::,2001:470:df05:7fff:ffff:ffff:ffff:ffff,SE -2001:470:df05:8000::,2001:470:df19:7fff:ffff:ffff:ffff:ffff,US -2001:470:df19:8000::,2001:470:df19:ffff:ffff:ffff:ffff:ffff,SE -2001:470:df1a::,2001:470:df40:ffff:ffff:ffff:ffff:ffff,US -2001:470:df41::,2001:470:df41:ffff:ffff:ffff:ffff:ffff,SE -2001:470:df42::,2001:470:df4f:ffff:ffff:ffff:ffff:ffff,US -2001:470:df50::,2001:470:df50:7fff:ffff:ffff:ffff:ffff,RU -2001:470:df50:8000::,2001:470:df6f:ffff:ffff:ffff:ffff:ffff,US -2001:470:df70::,2001:470:df70:7fff:ffff:ffff:ffff:ffff,SE -2001:470:df70:8000::,2001:470:df7c:ffff:ffff:ffff:ffff:ffff,US -2001:470:df7d::,2001:470:df7d:7fff:ffff:ffff:ffff:ffff,SE -2001:470:df7d:8000::,2001:470:dfa0:ffff:ffff:ffff:ffff:ffff,US -2001:470:dfa1::,2001:470:dfa1:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dfa1:8000::,2001:470:dfb2:ffff:ffff:ffff:ffff:ffff,US -2001:470:dfb3::,2001:470:dfb3:7fff:ffff:ffff:ffff:ffff,SE -2001:470:dfb3:8000::,2001:470:dfc9:ffff:ffff:ffff:ffff:ffff,US -2001:470:dfca::,2001:470:dfca:ffff:ffff:ffff:ffff:ffff,RU -2001:470:dfcb::,2001:470:dfe3:ffff:ffff:ffff:ffff:ffff,US -2001:470:dfe4::,2001:470:dfe4:7fff:ffff:ffff:ffff:ffff,DK -2001:470:dfe4:8000::,2001:470:dff7:7fff:ffff:ffff:ffff:ffff,US -2001:470:dff7:8000::,2001:470:dff7:ffff:ffff:ffff:ffff:ffff,SE -2001:470:dff8::,2001:470:e071:ffff:ffff:ffff:ffff:ffff,US -2001:470:e072::,2001:470:e072:7fff:ffff:ffff:ffff:ffff,CA -2001:470:e072:8000::,2001:470:e1ed:7fff:ffff:ffff:ffff:ffff,US -2001:470:e1ed:8000::,2001:470:e1ed:ffff:ffff:ffff:ffff:ffff,BR -2001:470:e1ee::,2001:470:eaa2:ffff:ffff:ffff:ffff:ffff,US -2001:470:eaa3::,2001:470:eaa3:7fff:ffff:ffff:ffff:ffff,CA -2001:470:eaa3:8000::,2001:470:eae0:ffff:ffff:ffff:ffff:ffff,US -2001:470:eae1::,2001:470:eae1:7fff:ffff:ffff:ffff:ffff,CA -2001:470:eae1:8000::,2001:470:ebf4:ffff:ffff:ffff:ffff:ffff,US -2001:470:ebf5::,2001:470:ebf5:7fff:ffff:ffff:ffff:ffff,CA -2001:470:ebf5:8000::,2001:470:ecf5:ffff:ffff:ffff:ffff:ffff,US -2001:470:ecf6::,2001:470:ecf6:7fff:ffff:ffff:ffff:ffff,ID -2001:470:ecf6:8000::,2001:470:ed02:ffff:ffff:ffff:ffff:ffff,US -2001:470:ed03::,2001:470:ed03:7fff:ffff:ffff:ffff:ffff,MM -2001:470:ed03:8000::,2001:470:ed0b:ffff:ffff:ffff:ffff:ffff,US -2001:470:ed0c::,2001:470:ed0c:7fff:ffff:ffff:ffff:ffff,SG -2001:470:ed0c:8000::,2001:470:ed26:ffff:ffff:ffff:ffff:ffff,US -2001:470:ed27::,2001:470:ed27:7fff:ffff:ffff:ffff:ffff,ID -2001:470:ed27:8000::,2001:470:ed39:ffff:ffff:ffff:ffff:ffff,US -2001:470:ed3a::,2001:470:ed3a:7fff:ffff:ffff:ffff:ffff,SG -2001:470:ed3a:8000::,2001:470:ed3c:ffff:ffff:ffff:ffff:ffff,US -2001:470:ed3d::,2001:470:ed3d:7fff:ffff:ffff:ffff:ffff,SG -2001:470:ed3d:8000::,2001:470:ee04:ffff:ffff:ffff:ffff:ffff,US -2001:470:ee05::,2001:470:ee05:7fff:ffff:ffff:ffff:ffff,MY -2001:470:ee05:8000::,2001:470:ee1d:ffff:ffff:ffff:ffff:ffff,US -2001:470:ee1e::,2001:470:ee1e:7fff:ffff:ffff:ffff:ffff,ID -2001:470:ee1e:8000::,2001:470:ef3f:ffff:ffff:ffff:ffff:ffff,US -2001:470:ef40::,2001:470:ef40:7fff:ffff:ffff:ffff:ffff,CN -2001:470:ef40:8000::,2001:470:eff5:ffff:ffff:ffff:ffff:ffff,US -2001:470:eff6::,2001:470:eff6:7fff:ffff:ffff:ffff:ffff,MY -2001:470:eff6:8000::,2001:470:f011:ffff:ffff:ffff:ffff:ffff,US -2001:470:f012::,2001:470:f012:7fff:ffff:ffff:ffff:ffff,NZ -2001:470:f012:8000::,2001:470:f091:ffff:ffff:ffff:ffff:ffff,US -2001:470:f092::,2001:470:f092:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f092:8000::,2001:470:f0ad:ffff:ffff:ffff:ffff:ffff,US -2001:470:f0ae::,2001:470:f0ae:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f0ae:8000::,2001:470:f0e7:ffff:ffff:ffff:ffff:ffff,US -2001:470:f0e8::,2001:470:f0e8:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f0e8:8000::,2001:470:f12f:ffff:ffff:ffff:ffff:ffff,US -2001:470:f130::,2001:470:f130:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f130:8000::,2001:470:f166:ffff:ffff:ffff:ffff:ffff,US -2001:470:f167::,2001:470:f167:ff:ffff:ffff:ffff:ffff,CN -2001:470:f167:100::,2001:470:f241:ffff:ffff:ffff:ffff:ffff,US -2001:470:f242::,2001:470:f242:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f242:8000::,2001:470:f301:ffff:ffff:ffff:ffff:ffff,US -2001:470:f302::,2001:470:f302:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f302:8000::,2001:470:f3ee:ffff:ffff:ffff:ffff:ffff,US -2001:470:f3ef::,2001:470:f3ef:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f3ef:8000::,2001:470:f42c:ffff:ffff:ffff:ffff:ffff,US -2001:470:f42d::,2001:470:f42d:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f42d:8000::,2001:470:f518:ffff:ffff:ffff:ffff:ffff,US -2001:470:f519::,2001:470:f519:7fff:ffff:ffff:ffff:ffff,NZ -2001:470:f519:8000::,2001:470:f5c3:ffff:ffff:ffff:ffff:ffff,US -2001:470:f5c4::,2001:470:f5c4:7fff:ffff:ffff:ffff:ffff,JP -2001:470:f5c4:8000::,2001:470:f5d0:ffff:ffff:ffff:ffff:ffff,US -2001:470:f5d1::,2001:470:f5d1:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f5d1:8000::,2001:470:f817:ffff:ffff:ffff:ffff:ffff,US -2001:470:f818::,2001:470:f818:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f818:8000::,2001:470:f81d:ffff:ffff:ffff:ffff:ffff,US -2001:470:f81e::,2001:470:f81e:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f81e:8000::,2001:470:f825:7fff:ffff:ffff:ffff:ffff,US -2001:470:f825:8000::,2001:470:f825:ffff:ffff:ffff:ffff:ffff,HK -2001:470:f826::,2001:470:f83d:ffff:ffff:ffff:ffff:ffff,US -2001:470:f83e::,2001:470:f83e:7fff:ffff:ffff:ffff:ffff,HK -2001:470:f83e:8000::,2001:470:f83f:ffff:ffff:ffff:ffff:ffff,US -2001:470:f840::,2001:470:f840:7fff:ffff:ffff:ffff:ffff,MY -2001:470:f840:8000::,2001:470:f919:ffff:ffff:ffff:ffff:ffff,US -2001:470:f91a::,2001:470:f91a:7fff:ffff:ffff:ffff:ffff,SG -2001:470:f91a:8000::,2001:470:f978:ffff:ffff:ffff:ffff:ffff,US -2001:470:f979::,2001:470:f979:7fff:ffff:ffff:ffff:ffff,HK -2001:470:f979:8000::,2001:470:f9e5:ffff:ffff:ffff:ffff:ffff,US -2001:470:f9e6::,2001:470:f9e6:7fff:ffff:ffff:ffff:ffff,CN -2001:470:f9e6:8000::,2001:470:f9f9:ffff:ffff:ffff:ffff:ffff,US -2001:470:f9fa::,2001:470:f9fa:7fff:ffff:ffff:ffff:ffff,HK -2001:470:f9fa:8000::,2001:470:fa38:ffff:ffff:ffff:ffff:ffff,US -2001:470:fa39::,2001:470:fa39:7fff:ffff:ffff:ffff:ffff,HK -2001:470:fa39:8000::,2001:470:fa84:ffff:ffff:ffff:ffff:ffff,US -2001:470:fa85::,2001:470:fa85:7fff:ffff:ffff:ffff:ffff,HK -2001:470:fa85:8000::,2001:470:fc92:ffff:ffff:ffff:ffff:ffff,US -2001:470:fc93::,2001:470:fc93:7fff:ffff:ffff:ffff:ffff,CN -2001:470:fc93:8000::,2001:470:fc93:ffff:ffff:ffff:ffff:ffff,US -2001:470:fc94::,2001:470:fc94:7fff:ffff:ffff:ffff:ffff,JP -2001:470:fc94:8000::,2001:470:fd51:ffff:ffff:ffff:ffff:ffff,US -2001:470:fd52::,2001:470:fd52:7fff:ffff:ffff:ffff:ffff,CN -2001:470:fd52:8000::,2001:470:ffe1:ffff:ffff:ffff:ffff:ffff,US -2001:470:ffe2::,2001:470:ffe2:7fff:ffff:ffff:ffff:ffff,CN -2001:470:ffe2:8000::,2001:470:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:478::,2001:478:ffff:ffff:ffff:ffff:ffff:ffff,KN -2001:480::,2001:480:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:490::,2001:490:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4a0::,2001:4a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4b0::,2001:4b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4b8::,2001:4b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4c0::,2001:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4c8::,2001:4c8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4d0::,2001:4d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4e0::,2001:4e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4e8::,2001:4e8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4f0::,2001:4f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4f8::,2001:4f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:500:1::,2001:500:4:ffff:ffff:ffff:ffff:ffff,US -2001:500:6::,2001:500:f:ffff:ffff:ffff:ffff:ffff,CA -2001:500:10::,2001:500:10:ffff:ffff:ffff:ffff:ffff,PR -2001:500:11::,2001:500:15:ffff:ffff:ffff:ffff:ffff,US -2001:500:16::,2001:500:2c:ffff:ffff:ffff:ffff:ffff,CA -2001:500:2d::,2001:500:31:ffff:ffff:ffff:ffff:ffff,US -2001:500:40::,2001:500:56:ffff:ffff:ffff:ffff:ffff,CA -2001:500:60::,2001:500:7d:ffff:ffff:ffff:ffff:ffff,US -2001:500:80::,2001:500:83:ffff:ffff:ffff:ffff:ffff,CA -2001:500:84::,2001:500:89:ffff:ffff:ffff:ffff:ffff,US -2001:500:8c::,2001:500:9f:ffff:ffff:ffff:ffff:ffff,US -2001:500:a0::,2001:500:a7:ffff:ffff:ffff:ffff:ffff,CA -2001:500:a8::,2001:500:a9:ffff:ffff:ffff:ffff:ffff,US -2001:500:c0::,2001:500:ef:ffff:ffff:ffff:ffff:ffff,CA -2001:500:f0::,2001:500:f0:ffff:ffff:ffff:ffff:ffff,US -2001:500:f1::,2001:500:f1:ffff:ffff:ffff:ffff:ffff,CA -2001:500:100::,2001:500:109:ffff:ffff:ffff:ffff:ffff,CA -2001:500:110::,2001:500:110:ffff:ffff:ffff:ffff:ffff,US -2001:500:120::,2001:500:13f:ffff:ffff:ffff:ffff:ffff,US -2001:500:200::,2001:500:20f:ffff:ffff:ffff:ffff:ffff,US -2001:500:3e5::,2001:500:3e5:ffff:ffff:ffff:ffff:ffff,US -2001:500:30ff::,2001:500:30ff:ffff:ffff:ffff:ffff:ffff,SE -2001:500:3682::,2001:500:3682:ffff:ffff:ffff:ffff:ffff,US -2001:500:4431::,2001:500:4431:ffff:ffff:ffff:ffff:ffff,US -2001:500:7967::,2001:500:7967:ffff:ffff:ffff:ffff:ffff,US -2001:500:856e::,2001:500:856e:ffff:ffff:ffff:ffff:ffff,US -2001:500:d937::,2001:500:d937:ffff:ffff:ffff:ffff:ffff,US -2001:500:ed30::,2001:500:ed30:ffff:ffff:ffff:ffff:ffff,SG -2001:501:8a29::,2001:501:8a29:ffff:ffff:ffff:ffff:ffff,JP -2001:501:973c::,2001:501:973c:ffff:ffff:ffff:ffff:ffff,US -2001:501:b1f9::,2001:501:b1f9:ffff:ffff:ffff:ffff:ffff,US -2001:502:8cc::,2001:502:8cc:ffff:ffff:ffff:ffff:ffff,US -2001:502:100e::,2001:502:100e:ffff:ffff:ffff:ffff:ffff,US -2001:502:1ca1::,2001:502:1ca1:ffff:ffff:ffff:ffff:ffff,US -2001:502:2eda::,2001:502:2eda:ffff:ffff:ffff:ffff:ffff,US -2001:502:4612::,2001:502:4612:ffff:ffff:ffff:ffff:ffff,US -2001:502:63bd::,2001:502:63bd:ffff:ffff:ffff:ffff:ffff,US -2001:502:7094::,2001:502:7094:ffff:ffff:ffff:ffff:ffff,US -2001:502:7a71::,2001:502:7a71:ffff:ffff:ffff:ffff:ffff,US -2001:502:8c25::,2001:502:8c25:ffff:ffff:ffff:ffff:ffff,GB -2001:502:ad09::,2001:502:ad09:ffff:ffff:ffff:ffff:ffff,US -2001:502:be98::,2001:502:be98:ffff:ffff:ffff:ffff:ffff,US -2001:502:cbe4::,2001:502:cbe4:ffff:ffff:ffff:ffff:ffff,US -2001:502:cfb5::,2001:502:cfb5:ffff:ffff:ffff:ffff:ffff,US -2001:502:d399::,2001:502:d399:ffff:ffff:ffff:ffff:ffff,US -2001:502:f3ff::,2001:502:f3ff:ffff:ffff:ffff:ffff:ffff,US -2001:503:c27::,2001:503:c27:ffff:ffff:ffff:ffff:ffff,US -2001:503:d2d::,2001:503:d2d:ffff:ffff:ffff:ffff:ffff,US -2001:503:231d::,2001:503:231d:ffff:ffff:ffff:ffff:ffff,US -2001:503:3227::,2001:503:3227:ffff:ffff:ffff:ffff:ffff,US -2001:503:39c1::,2001:503:39c1:ffff:ffff:ffff:ffff:ffff,US -2001:503:4872::,2001:503:4872:ffff:ffff:ffff:ffff:ffff,HK -2001:503:5419::,2001:503:5419:ffff:ffff:ffff:ffff:ffff,ES -2001:503:5ae2::,2001:503:5ae2:ffff:ffff:ffff:ffff:ffff,US -2001:503:6810::,2001:503:6810:ffff:ffff:ffff:ffff:ffff,US -2001:503:7bbb::,2001:503:7bbb:ffff:ffff:ffff:ffff:ffff,US -2001:503:7bbf::,2001:503:7bbf:ffff:ffff:ffff:ffff:ffff,DE -2001:503:8028::,2001:503:8028:ffff:ffff:ffff:ffff:ffff,US -2001:503:83eb::,2001:503:83eb:ffff:ffff:ffff:ffff:ffff,US -2001:503:91ef::,2001:503:91ef:ffff:ffff:ffff:ffff:ffff,FR -2001:503:a124::,2001:503:a124:ffff:ffff:ffff:ffff:ffff,US -2001:503:a83e::,2001:503:a83e:ffff:ffff:ffff:ffff:ffff,US -2001:503:ba3e::,2001:503:ba3e:ffff:ffff:ffff:ffff:ffff,US -2001:503:bfb0::,2001:503:bfb0:ffff:ffff:ffff:ffff:ffff,US -2001:503:c779::,2001:503:c779:ffff:ffff:ffff:ffff:ffff,US -2001:503:cc2c::,2001:503:cc2c:ffff:ffff:ffff:ffff:ffff,US -2001:503:d1ae::,2001:503:d1ae:ffff:ffff:ffff:ffff:ffff,US -2001:503:d414::,2001:503:d414:ffff:ffff:ffff:ffff:ffff,US -2001:503:e239::,2001:503:e239:ffff:ffff:ffff:ffff:ffff,US -2001:503:e8ef::,2001:503:e8ef:ffff:ffff:ffff:ffff:ffff,US -2001:503:eea3::,2001:503:eea3:ffff:ffff:ffff:ffff:ffff,US -2001:503:f189::,2001:503:f189:ffff:ffff:ffff:ffff:ffff,US -2001:503:f261::,2001:503:f261:ffff:ffff:ffff:ffff:ffff,US -2001:503:f3da::,2001:503:f3da:ffff:ffff:ffff:ffff:ffff,NL -2001:503:ff39::,2001:503:ff39:ffff:ffff:ffff:ffff:ffff,US -2001:504::,2001:504:1:ffff:ffff:ffff:ffff:ffff,US -2001:504:a::,2001:504:13:ffff:ffff:ffff:ffff:ffff,US -2001:504:15::,2001:504:15:ffff:ffff:ffff:ffff:ffff,CA -2001:504:16::,2001:504:18:ffff:ffff:ffff:ffff:ffff,US -2001:504:19::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA -2001:504:1b::,2001:504:1c:ffff:ffff:ffff:ffff:ffff,US -2001:504:1d::,2001:504:1d:ffff:ffff:ffff:ffff:ffff,PR -2001:504:20::,2001:504:23:ffff:ffff:ffff:ffff:ffff,GB -2001:504:24::,2001:504:24:ffff:ffff:ffff:ffff:ffff,US -2001:504:25::,2001:504:26:ffff:ffff:ffff:ffff:ffff,CA -2001:504:27::,2001:504:29:ffff:ffff:ffff:ffff:ffff,US -2001:504:2c::,2001:504:2d:ffff:ffff:ffff:ffff:ffff,CA -2001:504:2e::,2001:504:2e:ffff:ffff:ffff:ffff:ffff,US -2001:504:2f::,2001:504:2f:ffff:ffff:ffff:ffff:ffff,CA -2001:504:30::,2001:504:31:ffff:ffff:ffff:ffff:ffff,US -2001:504:33::,2001:504:34:ffff:ffff:ffff:ffff:ffff,US -2001:504:35::,2001:504:35:ffff:ffff:ffff:ffff:ffff,GD -2001:504:36::,2001:504:36:ffff:ffff:ffff:ffff:ffff,US -2001:504:37::,2001:504:37:ffff:ffff:ffff:ffff:ffff,CA -2001:504:38::,2001:504:38:ffff:ffff:ffff:ffff:ffff,US -2001:504:39::,2001:504:39:ffff:ffff:ffff:ffff:ffff,CA -2001:504:3a::,2001:504:3d:ffff:ffff:ffff:ffff:ffff,US -2001:504:3e::,2001:504:3e:ffff:ffff:ffff:ffff:ffff,JM -2001:504:3f::,2001:504:41:ffff:ffff:ffff:ffff:ffff,US -2001:504:42::,2001:504:42:ffff:ffff:ffff:ffff:ffff,CA -2001:504:43::,2001:504:45:ffff:ffff:ffff:ffff:ffff,US -2001:504:46::,2001:504:46:ffff:ffff:ffff:ffff:ffff,CA -2001:504:47::,2001:504:47:ffff:ffff:ffff:ffff:ffff,US -2001:504:57::,2001:504:59:ffff:ffff:ffff:ffff:ffff,US -2001:504:60::,2001:504:62:ffff:ffff:ffff:ffff:ffff,US -2001:504:63::,2001:504:63:ffff:ffff:ffff:ffff:ffff,DM -2001:504:64::,2001:504:68:ffff:ffff:ffff:ffff:ffff,US -2001:504:69::,2001:504:69:ffff:ffff:ffff:ffff:ffff,CA -2001:504:70::,2001:504:72:ffff:ffff:ffff:ffff:ffff,US -2001:504:73::,2001:504:73:ffff:ffff:ffff:ffff:ffff,CA -2001:504:74::,2001:504:79:ffff:ffff:ffff:ffff:ffff,US -2001:504:80::,2001:504:8f:ffff:ffff:ffff:ffff:ffff,US -2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US -2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US -2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA -2001:506:28::,2001:506:28:ffff:ffff:ffff:ffff:ffff,US -2001:506:100::,2001:506:100:ffff:ffff:ffff:ffff:ffff,US -2001:506:1000::,2001:506:2fff:ffff:ffff:ffff:ffff:ffff,US -2001:506:4000::,2001:506:7fff:ffff:ffff:ffff:ffff:ffff,US -2001:508::,2001:508:ffff:ffff:ffff:ffff:ffff:ffff,BM -2001:510::,2001:510:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:518::,2001:518:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:520::,2001:520:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:528::,2001:528:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:530::,2001:530:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:538::,2001:538:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:540::,2001:540:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:548::,2001:548:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:550::,2001:550:0:1000::8275:169,US -2001:550:0:1000::8275:16a,2001:550:0:1000::8275:16a,SI -2001:550:0:1000::8275:16b,2001:550:0:1000::9a19:325,US -2001:550:0:1000::9a19:326,2001:550:0:1000::9a19:326,SI -2001:550:0:1000::9a19:327,2001:550:0:1000::9a36:2631,US -2001:550:0:1000::9a36:2632,2001:550:0:1000::9a36:2632,DE -2001:550:0:1000::9a36:2633,2001:550:7ff:ffff:ffff:ffff:ffff:ffff,US -2001:550:800::,2001:550:800:7fff:ffff:ffff:ffff:ffff,CA -2001:550:800:8000::,2001:550:909:ffff:ffff:ffff:ffff:ffff,US -2001:550:90a::,2001:550:90a:7fff:ffff:ffff:ffff:ffff,CA -2001:550:90a:8000::,2001:550:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:558::,2001:560:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:568::,2001:569:7413:ffff:ffff:ffff:ffff:ffff,CA -2001:569:7414::,2001:569:7414:7fff:ffff:ffff:ffff:ffff,US -2001:569:7414:8000::,2001:569:79c9:bfff:ffff:ffff:ffff:ffff,CA -2001:569:79c9:c000::,2001:569:79c9:dfff:ffff:ffff:ffff:ffff,GB -2001:569:79c9:e000::,2001:56f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:570::,2001:570:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:578::,2001:57b:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:5a0::,2001:5a0:3600:ffff:ffff:ffff:ffff:ffff,US -2001:5a0:3601::,2001:5a0:3601:ffff:ffff:ffff:ffff:ffff,CA -2001:5a0:3602::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US -2001:5a0:3700::,2001:5a0:3700:ff:ffff:ffff:ffff:ffff,CA -2001:5a0:3700:100::,2001:5a0:3700:ffff:ffff:ffff:ffff:ffff,US -2001:5a0:3701::,2001:5a0:3701:ffff:ffff:ffff:ffff:ffff,CA -2001:5a0:3702::,2001:5a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5a8::,2001:5a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5b0::,2001:5b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5b8::,2001:5b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5c0:1100::,2001:5c0:1100::,US -2001:5c8::,2001:5c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5d0::,2001:5d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5d8::,2001:5d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5e0::,2001:5e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5e8::,2001:5e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5f0::,2001:5f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:5f8::,2001:5f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:608::,2001:608:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:610::,2001:617:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:618::,2001:618:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:620::,2001:627:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:628::,2001:62f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:630::,2001:630:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:638::,2001:638:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:640::,2001:640:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:648::,2001:64f:ffff:ffff:ffff:ffff:ffff:ffff,GR -2001:650::,2001:65f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:660::,2001:667:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:668::,2001:668:1f:3d:ffff:ffff:ffff:ffff,DE -2001:668:1f:3e::,2001:668:1f:3e:ffff:ffff:ffff:ffff,GB -2001:668:1f:3f::,2001:668:1f:44:ffff:ffff:ffff:ffff,DE -2001:668:1f:45::,2001:668:1f:45:ffff:ffff:ffff:ffff,GB -2001:668:1f:46::,2001:66f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:670::,2001:673:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:678:1::,2001:678:1:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:2::,2001:678:2:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3::,2001:678:3:ffff:ffff:ffff:ffff:ffff,CH -2001:678:4::,2001:678:5:ffff:ffff:ffff:ffff:ffff,GB -2001:678:6::,2001:678:6:ffff:ffff:ffff:ffff:ffff,LT -2001:678:7::,2001:678:7:ffff:ffff:ffff:ffff:ffff,GR -2001:678:8::,2001:678:8:ffff:ffff:ffff:ffff:ffff,NL -2001:678:9::,2001:678:a:ffff:ffff:ffff:ffff:ffff,BE -2001:678:b::,2001:678:b:ffff:ffff:ffff:ffff:ffff,LV -2001:678:c::,2001:678:c:ffff:ffff:ffff:ffff:ffff,FR -2001:678:d::,2001:678:d:ffff:ffff:ffff:ffff:ffff,AT -2001:678:e::,2001:678:e:ffff:ffff:ffff:ffff:ffff,DE -2001:678:f::,2001:678:11:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:12::,2001:678:12:ffff:ffff:ffff:ffff:ffff,IT -2001:678:13::,2001:678:18:ffff:ffff:ffff:ffff:ffff,RU -2001:678:19::,2001:678:19:ffff:ffff:ffff:ffff:ffff,LT -2001:678:1a::,2001:678:1a:ffff:ffff:ffff:ffff:ffff,DK -2001:678:1b::,2001:678:1b:ffff:ffff:ffff:ffff:ffff,LU -2001:678:1c::,2001:678:1c:ffff:ffff:ffff:ffff:ffff,AT -2001:678:20::,2001:678:20:ffff:ffff:ffff:ffff:ffff,AT -2001:678:24::,2001:678:24:ffff:ffff:ffff:ffff:ffff,AT -2001:678:28::,2001:678:28:ffff:ffff:ffff:ffff:ffff,SM -2001:678:2c::,2001:678:2c:ffff:ffff:ffff:ffff:ffff,NL -2001:678:30::,2001:678:30:ffff:ffff:ffff:ffff:ffff,NL -2001:678:34::,2001:678:34:ffff:ffff:ffff:ffff:ffff,NL -2001:678:38::,2001:678:38:ffff:ffff:ffff:ffff:ffff,NL -2001:678:3c::,2001:678:3c:ffff:ffff:ffff:ffff:ffff,BG -2001:678:40::,2001:678:40:ffff:ffff:ffff:ffff:ffff,ES -2001:678:44::,2001:678:44:ffff:ffff:ffff:ffff:ffff,ES -2001:678:48::,2001:678:48:ffff:ffff:ffff:ffff:ffff,ES -2001:678:4c::,2001:678:4c:ffff:ffff:ffff:ffff:ffff,FR -2001:678:60::,2001:678:60:ffff:ffff:ffff:ffff:ffff,LU -2001:678:64::,2001:678:64:ffff:ffff:ffff:ffff:ffff,BE -2001:678:68::,2001:678:68:ffff:ffff:ffff:ffff:ffff,BE -2001:678:6c::,2001:678:6c:ffff:ffff:ffff:ffff:ffff,BE -2001:678:70::,2001:678:70:ffff:ffff:ffff:ffff:ffff,SK -2001:678:74::,2001:678:74:ffff:ffff:ffff:ffff:ffff,DK -2001:678:78::,2001:678:78:ffff:ffff:ffff:ffff:ffff,DK -2001:678:7c::,2001:678:7c:ffff:ffff:ffff:ffff:ffff,LV -2001:678:80::,2001:678:80:ffff:ffff:ffff:ffff:ffff,LV -2001:678:84::,2001:678:84:ffff:ffff:ffff:ffff:ffff,LV -2001:678:88::,2001:678:88:ffff:ffff:ffff:ffff:ffff,LT -2001:678:8c::,2001:678:8c:ffff:ffff:ffff:ffff:ffff,LT -2001:678:90::,2001:678:90:ffff:ffff:ffff:ffff:ffff,SK -2001:678:94::,2001:678:94:ffff:ffff:ffff:ffff:ffff,EE -2001:678:98::,2001:678:98:ffff:ffff:ffff:ffff:ffff,KZ -2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK -2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI -2001:678:a4::,2001:678:a4:ffff:ffff:ffff:ffff:ffff,AT -2001:678:a8::,2001:678:a8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:ac::,2001:678:ac:ffff:ffff:ffff:ffff:ffff,SE -2001:678:b0::,2001:678:b3:ffff:ffff:ffff:ffff:ffff,IR -2001:678:c0::,2001:678:c0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:c4::,2001:678:c4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:c8::,2001:678:c8:ffff:ffff:ffff:ffff:ffff,UA -2001:678:cc::,2001:678:cc:ffff:ffff:ffff:ffff:ffff,SA -2001:678:d0::,2001:678:d0:ffff:ffff:ffff:ffff:ffff,NL -2001:678:d4::,2001:678:d4:ffff:ffff:ffff:ffff:ffff,IT -2001:678:d8::,2001:678:d8:ffff:ffff:ffff:ffff:ffff,LV -2001:678:dc::,2001:678:dc:ffff:ffff:ffff:ffff:ffff,NL -2001:678:e0::,2001:678:e0:ffff:ffff:ffff:ffff:ffff,MD -2001:678:e4::,2001:678:e4:ffff:ffff:ffff:ffff:ffff,SE -2001:678:e8::,2001:678:e8:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:ec::,2001:678:ec:ffff:ffff:ffff:ffff:ffff,RU -2001:678:f0::,2001:678:f0:7fff:ffff:ffff:ffff:ffff,SE -2001:678:f0:8000::,2001:678:f0:ffff:ffff:ffff:ffff:ffff,PL -2001:678:f4::,2001:678:f4:ffff:ffff:ffff:ffff:ffff,RU -2001:678:f8::,2001:678:f8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:fc::,2001:678:fc:ffff:ffff:ffff:ffff:ffff,LT -2001:678:100::,2001:678:100:ffff:ffff:ffff:ffff:ffff,BG -2001:678:104::,2001:678:104:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:108::,2001:678:108:ffff:ffff:ffff:ffff:ffff,NL -2001:678:10c::,2001:678:10c:ffff:ffff:ffff:ffff:ffff,NL -2001:678:110::,2001:678:110:ffff:ffff:ffff:ffff:ffff,NL -2001:678:114::,2001:678:114:ffff:ffff:ffff:ffff:ffff,NL -2001:678:118::,2001:678:118:ffff:ffff:ffff:ffff:ffff,NL -2001:678:11c::,2001:678:11c:ffff:ffff:ffff:ffff:ffff,CH -2001:678:120::,2001:678:120:ffff:ffff:ffff:ffff:ffff,PL -2001:678:124::,2001:678:124:ffff:ffff:ffff:ffff:ffff,RU -2001:678:128::,2001:678:128:ffff:ffff:ffff:ffff:ffff,RU -2001:678:12c::,2001:678:12c:ffff:ffff:ffff:ffff:ffff,SK -2001:678:130::,2001:678:130:ffff:ffff:ffff:ffff:ffff,SE -2001:678:134::,2001:678:134:ffff:ffff:ffff:ffff:ffff,NO -2001:678:138::,2001:678:138:ffff:ffff:ffff:ffff:ffff,NO -2001:678:13c::,2001:678:13c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:140::,2001:678:140:ffff:ffff:ffff:ffff:ffff,DE -2001:678:144::,2001:678:144:ffff:ffff:ffff:ffff:ffff,UA -2001:678:148::,2001:678:148:ffff:ffff:ffff:ffff:ffff,FI -2001:678:14c::,2001:678:14c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:154::,2001:678:154:ffff:ffff:ffff:ffff:ffff,DE -2001:678:158::,2001:678:158:ffff:ffff:ffff:ffff:ffff,FR -2001:678:15c::,2001:678:15c:ffff:ffff:ffff:ffff:ffff,RO -2001:678:160::,2001:678:160:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:164::,2001:678:164:ffff:ffff:ffff:ffff:ffff,RO -2001:678:168::,2001:678:168:ffff:ffff:ffff:ffff:ffff,DE -2001:678:16c::,2001:678:16c:ffff:ffff:ffff:ffff:ffff,BG -2001:678:170::,2001:678:170:ffff:ffff:ffff:ffff:ffff,PL -2001:678:174::,2001:678:174:ffff:ffff:ffff:ffff:ffff,DE -2001:678:178::,2001:678:178:ffff:ffff:ffff:ffff:ffff,PL -2001:678:17c::,2001:678:17c:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:180::,2001:678:180:ffff:ffff:ffff:ffff:ffff,DE -2001:678:184::,2001:678:184:ffff:ffff:ffff:ffff:ffff,DE -2001:678:188::,2001:678:188:ffff:ffff:ffff:ffff:ffff,UZ -2001:678:18c::,2001:678:18c:ffff:ffff:ffff:ffff:ffff,AT -2001:678:190::,2001:678:190:ffff:ffff:ffff:ffff:ffff,RU -2001:678:198::,2001:678:198:ffff:ffff:ffff:ffff:ffff,NL -2001:678:19c::,2001:678:19c:ffff:ffff:ffff:ffff:ffff,SE -2001:678:1a0::,2001:678:1a0:ffff:ffff:ffff:ffff:ffff,SE -2001:678:1a4::,2001:678:1a4:ffff:ffff:ffff:ffff:ffff,TR -2001:678:1a8::,2001:678:1a8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:1ac::,2001:678:1ac:ffff:ffff:ffff:ffff:ffff,UA -2001:678:1b0::,2001:678:1b0:ffff:ffff:ffff:ffff:ffff,RU -2001:678:1b4::,2001:678:1b4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:1b8::,2001:678:1b8:ffff:ffff:ffff:ffff:ffff,AT -2001:678:1bc::,2001:678:1bc:ffff:ffff:ffff:ffff:ffff,RU -2001:678:1c0::,2001:678:1c0:ffff:ffff:ffff:ffff:ffff,PL -2001:678:1c4::,2001:678:1c4:ffff:ffff:ffff:ffff:ffff,CH -2001:678:1c8::,2001:678:1c8:ffff:ffff:ffff:ffff:ffff,NL -2001:678:1cc::,2001:678:1cc:ffff:ffff:ffff:ffff:ffff,PL -2001:678:1d0::,2001:678:1d0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:1d4::,2001:678:1d4:ffff:ffff:ffff:ffff:ffff,SE -2001:678:1d8::,2001:678:1d8:ffff:ffff:ffff:ffff:ffff,AT -2001:678:1dc::,2001:678:1dc:ffff:ffff:ffff:ffff:ffff,PL -2001:678:1e0::,2001:678:1e0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:1e4::,2001:678:1e4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:1e8::,2001:678:1e8:ffff:ffff:ffff:ffff:ffff,RU -2001:678:1ec::,2001:678:1ec:ffff:ffff:ffff:ffff:ffff,SI -2001:678:1f0::,2001:678:1f0:ffff:ffff:ffff:ffff:ffff,GB -2001:678:1f4::,2001:678:1f4:ffff:ffff:ffff:ffff:ffff,RU -2001:678:1f8::,2001:678:1f8:ffff:ffff:ffff:ffff:ffff,BG -2001:678:1fc::,2001:678:1fc:ffff:ffff:ffff:ffff:ffff,SE -2001:678:200::,2001:678:200:ffff:ffff:ffff:ffff:ffff,PL -2001:678:204::,2001:678:204:ffff:ffff:ffff:ffff:ffff,CH -2001:678:208::,2001:678:208:ffff:ffff:ffff:ffff:ffff,UA -2001:678:20c::,2001:678:20c:ffff:ffff:ffff:ffff:ffff,RU -2001:678:214::,2001:678:214:ffff:ffff:ffff:ffff:ffff,HU -2001:678:218::,2001:678:218:ffff:ffff:ffff:ffff:ffff,RO -2001:678:21c::,2001:678:21c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:220::,2001:678:220:ffff:ffff:ffff:ffff:ffff,RU -2001:678:224::,2001:678:224:ffff:ffff:ffff:ffff:ffff,PL -2001:678:228::,2001:678:228:ffff:ffff:ffff:ffff:ffff,SE -2001:678:22c::,2001:678:22c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:230::,2001:678:230:ffff:ffff:ffff:ffff:ffff,NL -2001:678:238::,2001:678:238:ffff:ffff:ffff:ffff:ffff,PL -2001:678:23c::,2001:678:23c:ffff:ffff:ffff:ffff:ffff,PL -2001:678:240::,2001:678:240:ffff:ffff:ffff:ffff:ffff,SE -2001:678:244::,2001:678:244:ffff:ffff:ffff:ffff:ffff,RU -2001:678:248::,2001:678:248:ffff:ffff:ffff:ffff:ffff,DE -2001:678:24c::,2001:678:24c:ffff:ffff:ffff:ffff:ffff,LT -2001:678:250::,2001:678:250:ffff:ffff:ffff:ffff:ffff,NL -2001:678:254::,2001:678:254:ffff:ffff:ffff:ffff:ffff,CH -2001:678:258::,2001:678:258:ffff:ffff:ffff:ffff:ffff,GB -2001:678:25c::,2001:678:25c:ffff:ffff:ffff:ffff:ffff,LU -2001:678:260::,2001:678:260:ffff:ffff:ffff:ffff:ffff,CH -2001:678:264::,2001:678:264:ffff:ffff:ffff:ffff:ffff,NL -2001:678:268::,2001:678:268:ffff:ffff:ffff:ffff:ffff,GB -2001:678:26c::,2001:678:26c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:270::,2001:678:270:ffff:ffff:ffff:ffff:ffff,AT -2001:678:274::,2001:678:274:ffff:ffff:ffff:ffff:ffff,DE -2001:678:278::,2001:678:278:ffff:ffff:ffff:ffff:ffff,RU -2001:678:27c::,2001:678:27c:ffff:ffff:ffff:ffff:ffff,PL -2001:678:280::,2001:678:280:ffff:ffff:ffff:ffff:ffff,RU -2001:678:284::,2001:678:284:ffff:ffff:ffff:ffff:ffff,DE -2001:678:288::,2001:678:288:ffff:ffff:ffff:ffff:ffff,PL -2001:678:28c::,2001:678:28c:ffff:ffff:ffff:ffff:ffff,CH -2001:678:290::,2001:678:290:ffff:ffff:ffff:ffff:ffff,RU -2001:678:294::,2001:678:294:ffff:ffff:ffff:ffff:ffff,CH -2001:678:298::,2001:678:298:ffff:ffff:ffff:ffff:ffff,CH -2001:678:29c::,2001:678:29c:ffff:ffff:ffff:ffff:ffff,SI -2001:678:2a0::,2001:678:2a0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2a4::,2001:678:2a4:ffff:ffff:ffff:ffff:ffff,UA -2001:678:2a8::,2001:678:2a8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2ac::,2001:678:2ac:ffff:ffff:ffff:ffff:ffff,RO -2001:678:2b0::,2001:678:2b0:ffff:ffff:ffff:ffff:ffff,PL -2001:678:2b4::,2001:678:2b4:ffff:ffff:ffff:ffff:ffff,UA -2001:678:2b8::,2001:678:2b9:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2c0::,2001:678:2c0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2c4::,2001:678:2c4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2c8::,2001:678:2c8:ffff:ffff:ffff:ffff:ffff,NL -2001:678:2cc::,2001:678:2cc:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2d0::,2001:678:2d0:ffff:ffff:ffff:ffff:ffff,UA -2001:678:2d4::,2001:678:2d4:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:2d8::,2001:678:2d8:ffff:ffff:ffff:ffff:ffff,AT -2001:678:2dc::,2001:678:2dc:ffff:ffff:ffff:ffff:ffff,GB -2001:678:2e0::,2001:678:2e0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2e4::,2001:678:2e4:ffff:ffff:ffff:ffff:ffff,NL -2001:678:2e8::,2001:678:2e8:ffff:ffff:ffff:ffff:ffff,RU -2001:678:2ec::,2001:678:2ec:ffff:ffff:ffff:ffff:ffff,RU -2001:678:2f0::,2001:678:2f0:ffff:ffff:ffff:ffff:ffff,RU -2001:678:2f4::,2001:678:2f4:ffff:ffff:ffff:ffff:ffff,IL -2001:678:2f8::,2001:678:2f8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:2fc::,2001:678:2fc:ffff:ffff:ffff:ffff:ffff,GB -2001:678:300::,2001:678:303:ffff:ffff:ffff:ffff:ffff,DE -2001:678:310::,2001:678:310:ffff:ffff:ffff:ffff:ffff,CH -2001:678:314::,2001:678:314:ffff:ffff:ffff:ffff:ffff,RO -2001:678:318::,2001:678:318:ffff:ffff:ffff:ffff:ffff,UA -2001:678:31c::,2001:678:31c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:320::,2001:678:320:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:324::,2001:678:324:ffff:ffff:ffff:ffff:ffff,LV -2001:678:328::,2001:678:328:ffff:ffff:ffff:ffff:ffff,CH -2001:678:32c::,2001:678:32c:ffff:ffff:ffff:ffff:ffff,GB -2001:678:330::,2001:678:330:ffff:ffff:ffff:ffff:ffff,SE -2001:678:334::,2001:678:334:ffff:ffff:ffff:ffff:ffff,UA -2001:678:338::,2001:678:338:ffff:ffff:ffff:ffff:ffff,DE -2001:678:33c::,2001:678:33c:ffff:ffff:ffff:ffff:ffff,DK -2001:678:340::,2001:678:340:ffff:ffff:ffff:ffff:ffff,DE -2001:678:344::,2001:678:344:ffff:ffff:ffff:ffff:ffff,RU -2001:678:348::,2001:678:348:ffff:ffff:ffff:ffff:ffff,NL -2001:678:34c::,2001:678:34c:ffff:ffff:ffff:ffff:ffff,US -2001:678:350::,2001:678:350:ffff:ffff:ffff:ffff:ffff,RU -2001:678:354::,2001:678:354:ffff:ffff:ffff:ffff:ffff,RU -2001:678:358::,2001:678:358:ffff:ffff:ffff:ffff:ffff,IE -2001:678:35c::,2001:678:35c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:360::,2001:678:360:ffff:ffff:ffff:ffff:ffff,DE -2001:678:364::,2001:678:364:ffff:ffff:ffff:ffff:ffff,PL -2001:678:36c::,2001:678:36c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:370::,2001:678:370:ffff:ffff:ffff:ffff:ffff,DE -2001:678:374::,2001:678:374:ffff:ffff:ffff:ffff:ffff,UA -2001:678:378::,2001:678:378:ffff:ffff:ffff:ffff:ffff,RU -2001:678:37c::,2001:678:37c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:380::,2001:678:380:ffff:ffff:ffff:ffff:ffff,PL -2001:678:384::,2001:678:384:ffff:ffff:ffff:ffff:ffff,RU -2001:678:388::,2001:678:388:ffff:ffff:ffff:ffff:ffff,PL -2001:678:38c::,2001:678:38c:ffff:ffff:ffff:ffff:ffff,PL -2001:678:390::,2001:678:390:ffff:ffff:ffff:ffff:ffff,NL -2001:678:394::,2001:678:394:ffff:ffff:ffff:ffff:ffff,SE -2001:678:398::,2001:678:398:ffff:ffff:ffff:ffff:ffff,CZ -2001:678:39c::,2001:678:39c:ffff:ffff:ffff:ffff:ffff,SA -2001:678:3a0::,2001:678:3a0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3a4::,2001:678:3a4:ffff:ffff:ffff:ffff:ffff,SE -2001:678:3a8::,2001:678:3a8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3ac::,2001:678:3ac:ffff:ffff:ffff:ffff:ffff,PL -2001:678:3b0::,2001:678:3b0:ffff:ffff:ffff:ffff:ffff,PL -2001:678:3b4::,2001:678:3b4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3b8::,2001:678:3b8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3bc::,2001:678:3bc:ffff:ffff:ffff:ffff:ffff,FR -2001:678:3c0::,2001:678:3c0:ffff:ffff:ffff:ffff:ffff,PL -2001:678:3c4::,2001:678:3c4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3c8::,2001:678:3c8:ffff:ffff:ffff:ffff:ffff,GR -2001:678:3cc::,2001:678:3cc:ffff:ffff:ffff:ffff:ffff,FR -2001:678:3d0::,2001:678:3d0:ffff:ffff:ffff:ffff:ffff,RU -2001:678:3d4::,2001:678:3d4:ffff:ffff:ffff:ffff:ffff,NL -2001:678:3d8::,2001:678:3d8:ffff:ffff:ffff:ffff:ffff,GB -2001:678:3dc::,2001:678:3dc:ffff:ffff:ffff:ffff:ffff,AT -2001:678:3e0::,2001:678:3e0:ffff:ffff:ffff:ffff:ffff,NL -2001:678:3e4::,2001:678:3e4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3e8::,2001:678:3e8:ffff:ffff:ffff:ffff:ffff,PL -2001:678:3ec::,2001:678:3ec:ffff:ffff:ffff:ffff:ffff,SE -2001:678:3f0::,2001:678:3f0:ffff:ffff:ffff:ffff:ffff,NO -2001:678:3f4::,2001:678:3f4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:3f8::,2001:678:3f8:ffff:ffff:ffff:ffff:ffff,UA -2001:678:3fc::,2001:678:3fc:ffff:ffff:ffff:ffff:ffff,FR -2001:678:400::,2001:678:400:ffff:ffff:ffff:ffff:ffff,DE -2001:678:404::,2001:678:404:ffff:ffff:ffff:ffff:ffff,RS -2001:678:408::,2001:678:408:ffff:ffff:ffff:ffff:ffff,ME -2001:678:40c::,2001:678:40c:ffff:ffff:ffff:ffff:ffff,RU -2001:678:410::,2001:678:410:ffff:ffff:ffff:ffff:ffff,RU -2001:678:414::,2001:678:414:ffff:ffff:ffff:ffff:ffff,DE -2001:678:418::,2001:678:418:ffff:ffff:ffff:ffff:ffff,GB -2001:678:41c::,2001:678:41c:ffff:ffff:ffff:ffff:ffff,UA -2001:678:420::,2001:678:420:ffff:ffff:ffff:ffff:ffff,RU -2001:678:424::,2001:678:424:ffff:ffff:ffff:ffff:ffff,GB -2001:678:428::,2001:678:428:ffff:ffff:ffff:ffff:ffff,NL -2001:678:42c::,2001:678:42c:ffff:ffff:ffff:ffff:ffff,SI -2001:678:430::,2001:678:431:baff:ffff:ffff:ffff:ffff,GB -2001:678:431:bb00::,2001:678:431:bbff:ffff:ffff:ffff:ffff,FR -2001:678:431:bc00::,2001:678:433:ffff:ffff:ffff:ffff:ffff,GB -2001:678:440::,2001:678:440:ffff:ffff:ffff:ffff:ffff,SE -2001:678:444::,2001:678:444:ffff:ffff:ffff:ffff:ffff,TR -2001:678:448::,2001:678:448:ffff:ffff:ffff:ffff:ffff,NL -2001:678:44c::,2001:678:44c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:450::,2001:678:450:ffff:ffff:ffff:ffff:ffff,SE -2001:678:454::,2001:678:454:ffff:ffff:ffff:ffff:ffff,SE -2001:678:458::,2001:678:458:ffff:ffff:ffff:ffff:ffff,DE -2001:678:45c::,2001:678:45c:ffff:ffff:ffff:ffff:ffff,PL -2001:678:460::,2001:678:460:ffff:ffff:ffff:ffff:ffff,GB -2001:678:464::,2001:678:464:ffff:ffff:ffff:ffff:ffff,NO -2001:678:468::,2001:678:468:ffff:ffff:ffff:ffff:ffff,UA -2001:678:46c::,2001:678:46c:ffff:ffff:ffff:ffff:ffff,RU -2001:678:470::,2001:678:470:ffff:ffff:ffff:ffff:ffff,PL -2001:678:474::,2001:678:474:ffff:ffff:ffff:ffff:ffff,GB -2001:678:478::,2001:678:478:ffff:ffff:ffff:ffff:ffff,DE -2001:678:47c::,2001:678:47c:ffff:ffff:ffff:ffff:ffff,GB -2001:678:480::,2001:678:480:ffff:ffff:ffff:ffff:ffff,AT -2001:678:484::,2001:678:484:ffff:ffff:ffff:ffff:ffff,GB -2001:678:488::,2001:678:488:ffff:ffff:ffff:ffff:ffff,GB -2001:678:48c::,2001:678:48c:ffff:ffff:ffff:ffff:ffff,RU -2001:678:490::,2001:678:490:ffff:ffff:ffff:ffff:ffff,DE -2001:678:494::,2001:678:494:ffff:ffff:ffff:ffff:ffff,RU -2001:678:498::,2001:678:498:ffff:ffff:ffff:ffff:ffff,GB -2001:678:49c::,2001:678:49c:ffff:ffff:ffff:ffff:ffff,GB -2001:678:4a0::,2001:678:4a0:ffff:ffff:ffff:ffff:ffff,GB -2001:678:4a4::,2001:678:4a4:ffff:ffff:ffff:ffff:ffff,GB -2001:678:4a8::,2001:678:4a8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4ac::,2001:678:4ac:ffff:ffff:ffff:ffff:ffff,RU -2001:678:4b0::,2001:678:4b0:ffff:ffff:ffff:ffff:ffff,SE -2001:678:4b4::,2001:678:4b4:ffff:ffff:ffff:ffff:ffff,PL -2001:678:4b8::,2001:678:4b8:ffff:ffff:ffff:ffff:ffff,UA -2001:678:4bc::,2001:678:4bc:ffff:ffff:ffff:ffff:ffff,GB -2001:678:4c0::,2001:678:4c0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4c4::,2001:678:4c4:ffff:ffff:ffff:ffff:ffff,CH -2001:678:4c8::,2001:678:4c8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4cc::,2001:678:4cc:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4d0::,2001:678:4d0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4d4::,2001:678:4d4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4d8::,2001:678:4d8:ffff:ffff:ffff:ffff:ffff,GB -2001:678:4dc::,2001:678:4dc:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4e0::,2001:678:4e0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4e4::,2001:678:4e4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4e8::,2001:678:4e8:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4ec::,2001:678:4ec:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4f0::,2001:678:4f0:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4f4::,2001:678:4f4:ffff:ffff:ffff:ffff:ffff,DE -2001:678:4f8::,2001:678:4f8:ffff:ffff:ffff:ffff:ffff,RU -2001:678:4fc::,2001:678:4fc:ffff:ffff:ffff:ffff:ffff,DE -2001:678:500::,2001:678:500:ffff:ffff:ffff:ffff:ffff,GB -2001:678:504::,2001:678:504:ffff:ffff:ffff:ffff:ffff,PL -2001:678:508::,2001:678:508:ffff:ffff:ffff:ffff:ffff,ES -2001:678:50c::,2001:678:50c:ffff:ffff:ffff:ffff:ffff,DE -2001:678:510::,2001:678:510:ffff:ffff:ffff:ffff:ffff,AT -2001:678:514::,2001:678:514:ffff:ffff:ffff:ffff:ffff,PT -2001:678:518::,2001:678:518:ffff:ffff:ffff:ffff:ffff,DE -2001:678:51c::,2001:678:51c:ffff:ffff:ffff:ffff:ffff,DK -2001:678:520::,2001:678:520:ffff:ffff:ffff:ffff:ffff,RU -2001:678:524::,2001:678:524:ffff:ffff:ffff:ffff:ffff,SE -2001:678:528::,2001:678:528:ffff:ffff:ffff:ffff:ffff,AT -2001:678:52c::,2001:678:52c:ffff:ffff:ffff:ffff:ffff,FI -2001:678:530::,2001:678:530:ffff:ffff:ffff:ffff:ffff,PL -2001:678:534::,2001:678:534:ffff:ffff:ffff:ffff:ffff,RU -2001:678:538::,2001:678:538:ffff:ffff:ffff:ffff:ffff,NL -2001:678:53c::,2001:678:53c:ffff:ffff:ffff:ffff:ffff,NL -2001:678:540::,2001:678:540:ffff:ffff:ffff:ffff:ffff,DE -2001:678:544::,2001:678:544:ffff:ffff:ffff:ffff:ffff,IE -2001:678:548::,2001:678:548:ffff:ffff:ffff:ffff:ffff,RU -2001:678:54c::,2001:678:54c:ffff:ffff:ffff:ffff:ffff,SE -2001:678:550::,2001:678:550:ffff:ffff:ffff:ffff:ffff,GB -2001:678:554::,2001:678:554:ffff:ffff:ffff:ffff:ffff,DK -2001:678:558::,2001:678:558:ffff:ffff:ffff:ffff:ffff,DE -2001:678:55c::,2001:678:55c:ffff:ffff:ffff:ffff:ffff,SE -2001:678:560::,2001:678:560:ffff:ffff:ffff:ffff:ffff,DE -2001:678:564::,2001:678:564:ffff:ffff:ffff:ffff:ffff,UA -2001:678:568::,2001:678:568:ffff:ffff:ffff:ffff:ffff,RU -2001:678:56c::,2001:678:56c:ffff:ffff:ffff:ffff:ffff,NL -2001:678:570::,2001:678:570:ffff:ffff:ffff:ffff:ffff,PL -2001:678:574::,2001:678:574:ffff:ffff:ffff:ffff:ffff,PL -2001:678:578::,2001:678:578:ffff:ffff:ffff:ffff:ffff,DE -2001:678:57c::,2001:678:57c:ffff:ffff:ffff:ffff:ffff,RU -2001:678:580::,2001:678:580:ffff:ffff:ffff:ffff:ffff,DE -2001:678:584::,2001:678:584:ffff:ffff:ffff:ffff:ffff,DE -2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE -2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:c::,2001:67c:c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:10::,2001:67c:10:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:14::,2001:67c:14:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18::,2001:67c:18:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1c::,2001:67c:1c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:20::,2001:67c:20:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:24::,2001:67c:24:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:28::,2001:67c:28:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2c::,2001:67c:2c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:30::,2001:67c:30:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:34::,2001:67c:34:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:38::,2001:67c:38:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:3c::,2001:67c:3c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:40::,2001:67c:40:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:44::,2001:67c:44:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:48::,2001:67c:48:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:4c::,2001:67c:4c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:50::,2001:67c:50:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:54::,2001:67c:54:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:58::,2001:67c:58:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:5c::,2001:67c:5c:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:60::,2001:67c:60:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:68::,2001:67c:68:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:6c::,2001:67c:6c:ffff:ffff:ffff:ffff:ffff,IS -2001:67c:70::,2001:67c:70:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:74::,2001:67c:74:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:78::,2001:67c:78:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:7c::,2001:67c:7c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:80::,2001:67c:80:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:84::,2001:67c:84:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:88::,2001:67c:88:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:8c::,2001:67c:8c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:90::,2001:67c:90:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:94::,2001:67c:94:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:98::,2001:67c:98:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:9c::,2001:67c:9c:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:a0::,2001:67c:a0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:a4::,2001:67c:a4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:a8::,2001:67c:a8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:ac::,2001:67c:ac:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:b0::,2001:67c:b0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:b4::,2001:67c:b4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:b8::,2001:67c:b8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:bc::,2001:67c:bc:ffff:ffff:ffff:ffff:ffff,EE -2001:67c:c0::,2001:67c:c0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:c4::,2001:67c:c4:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:c8::,2001:67c:c8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:cc::,2001:67c:cc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:d0::,2001:67c:d0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:d4::,2001:67c:d4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:d8::,2001:67c:d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:dc::,2001:67c:dc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:e0::,2001:67c:e0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:e4::,2001:67c:e4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:e8::,2001:67c:e8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:ec::,2001:67c:ec:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:f0::,2001:67c:f0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:f4::,2001:67c:f4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:f8::,2001:67c:f8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:104::,2001:67c:104:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:118::,2001:67c:118:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:11c::,2001:67c:11c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:120::,2001:67c:120:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:124::,2001:67c:124:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:128::,2001:67c:128:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12c::,2001:67c:12c:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:130::,2001:67c:130:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:134::,2001:67c:134:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:138::,2001:67c:138:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:13c::,2001:67c:13c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:140::,2001:67c:140:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:144::,2001:67c:144:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:148::,2001:67c:148:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:14c::,2001:67c:14d:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:150::,2001:67c:150:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:154::,2001:67c:154:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:158::,2001:67c:158:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:15c::,2001:67c:15c:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:160::,2001:67c:160:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:164::,2001:67c:164:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:168::,2001:67c:168:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:16c::,2001:67c:16c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:170::,2001:67c:170:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:174::,2001:67c:174:7fff:ffff:ffff:ffff:ffff,NL -2001:67c:174:8000::,2001:67c:174:ffff:ffff:ffff:ffff:ffff,SM -2001:67c:178::,2001:67c:178:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:17c::,2001:67c:17c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:180::,2001:67c:180:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:184::,2001:67c:184:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:188::,2001:67c:188:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:18c::,2001:67c:18c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:190::,2001:67c:190:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:194::,2001:67c:194:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:198::,2001:67c:198:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:19c::,2001:67c:19c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1a0::,2001:67c:1a0:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:1a4::,2001:67c:1a4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1a8::,2001:67c:1a8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1ac::,2001:67c:1ac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b0::,2001:67c:1b0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b4::,2001:67c:1b4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b8::,2001:67c:1b8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1bc::,2001:67c:1bc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1c0::,2001:67c:1c0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1c4::,2001:67c:1c4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1c8::,2001:67c:1c8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1cc::,2001:67c:1cc:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:1d0::,2001:67c:1d0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1d4::,2001:67c:1d4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1d8::,2001:67c:1d8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1dc::,2001:67c:1dc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1e0::,2001:67c:1e0:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1e4::,2001:67c:1e4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1e8::,2001:67c:1e8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1ec::,2001:67c:1ec:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:1f0::,2001:67c:1f0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1f4::,2001:67c:1f4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:1f8::,2001:67c:1f8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1fc::,2001:67c:1fc:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:200::,2001:67c:200:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:204::,2001:67c:204:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:208::,2001:67c:208:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:20c::,2001:67c:20c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:210::,2001:67c:210:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:214::,2001:67c:214:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:218::,2001:67c:218:ffff:ffff:ffff:ffff:ffff,LT -2001:67c:21c::,2001:67c:21c:ffff:ffff:ffff:ffff:ffff,AM -2001:67c:220::,2001:67c:220:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:224::,2001:67c:224:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:228::,2001:67c:228:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:22c::,2001:67c:22c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:230::,2001:67c:230:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:234::,2001:67c:234:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:238::,2001:67c:238:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:23c::,2001:67c:23c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:240::,2001:67c:240:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:244::,2001:67c:244:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:248::,2001:67c:248:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:24c::,2001:67c:24c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:250::,2001:67c:250:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:254::,2001:67c:254:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:258::,2001:67c:258:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:25c::,2001:67c:25c:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:260::,2001:67c:260:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:264::,2001:67c:264:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:268::,2001:67c:268:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:26c::,2001:67c:26c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:270::,2001:67c:270:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:274::,2001:67c:274:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:278::,2001:67c:278:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:27c::,2001:67c:27c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:280::,2001:67c:280:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:284::,2001:67c:284:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:288::,2001:67c:288:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:28c::,2001:67c:28c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:290::,2001:67c:290:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:294::,2001:67c:294:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:298::,2001:67c:298:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:29c::,2001:67c:29c:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:2a0::,2001:67c:2a0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2a4::,2001:67c:2a4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a8::,2001:67c:2a8:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2ac::,2001:67c:2ac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b0::,2001:67c:2b0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2b4::,2001:67c:2b4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2b8::,2001:67c:2b8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2bc::,2001:67c:2bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c0::,2001:67c:2c0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2c4::,2001:67c:2c4:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c8::,2001:67c:2c8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2cc::,2001:67c:2cc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d0::,2001:67c:2d0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2d4::,2001:67c:2d4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2d8::,2001:67c:2d8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2dc::,2001:67c:2dc:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2e0::,2001:67c:2e0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2e4::,2001:67c:2e4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2e8::,2001:67c:2e8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2ec::,2001:67c:2ec:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2f0::,2001:67c:2f0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2f4::,2001:67c:2f4:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:2f8::,2001:67c:2f8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2fc::,2001:67c:2fc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:300::,2001:67c:300:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:304::,2001:67c:304:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:308::,2001:67c:308:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:30c::,2001:67c:30c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:310::,2001:67c:310:ffff:ffff:ffff:ffff:ffff,CY -2001:67c:314::,2001:67c:314:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:318::,2001:67c:318:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:31c::,2001:67c:31c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:320::,2001:67c:320:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:324::,2001:67c:324:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:328::,2001:67c:328:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:32c::,2001:67c:32c:ffff:ffff:ffff:ffff:ffff,EE -2001:67c:330::,2001:67c:330:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:334::,2001:67c:334:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:338::,2001:67c:338:ffff:ffff:ffff:ffff:ffff,IE -2001:67c:33c::,2001:67c:33c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:340::,2001:67c:340:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:344::,2001:67c:344:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:348::,2001:67c:348:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:34c::,2001:67c:34c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:350::,2001:67c:350:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:354::,2001:67c:354:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:358::,2001:67c:358:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:35c::,2001:67c:35c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:360::,2001:67c:360:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:364::,2001:67c:364:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:368::,2001:67c:368:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:36c::,2001:67c:36c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:370::,2001:67c:370:ffff:ffff:ffff:ffff:ffff,SG -2001:67c:374::,2001:67c:374:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:378::,2001:67c:378:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:37c::,2001:67c:37c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:380::,2001:67c:380:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:384::,2001:67c:384:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:388::,2001:67c:388:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:38c::,2001:67c:38c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:390::,2001:67c:390:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:394::,2001:67c:394:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:398::,2001:67c:398:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:39c::,2001:67c:39c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:3a0::,2001:67c:3a0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:3a4::,2001:67c:3a4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:3a8::,2001:67c:3a8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:3ac::,2001:67c:3ac:ffff:ffff:ffff:ffff:ffff,RS -2001:67c:3b0::,2001:67c:3b0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:3b4::,2001:67c:3b4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE -2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE -2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:3d4::,2001:67c:3d4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:3d8::,2001:67c:3d8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:3dc::,2001:67c:3dc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:3e0::,2001:67c:3e0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:3e4::,2001:67c:3e4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:3e8::,2001:67c:3e9:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:3f0::,2001:67c:3f0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:3f4::,2001:67c:3f4:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:3f8::,2001:67c:3f8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:3fc::,2001:67c:3fc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:404::,2001:67c:404:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:408::,2001:67c:408:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:40c::,2001:67c:40c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:410::,2001:67c:410:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:414::,2001:67c:414:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:418::,2001:67c:418:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:41c::,2001:67c:41c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:420::,2001:67c:420:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:424::,2001:67c:424:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:428::,2001:67c:428:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:42c::,2001:67c:42c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:430::,2001:67c:430:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:434::,2001:67c:434:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:438::,2001:67c:438:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:43c::,2001:67c:43c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:468::,2001:67c:468:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:46c::,2001:67c:46c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:470::,2001:67c:470:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:474::,2001:67c:474:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:478::,2001:67c:478:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:47c::,2001:67c:47c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:480::,2001:67c:480:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:484::,2001:67c:484:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:488::,2001:67c:488:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:48c::,2001:67c:48c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:490::,2001:67c:490:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:494::,2001:67c:494:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:498::,2001:67c:498:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:49c::,2001:67c:49c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:4b4::,2001:67c:4b4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4c0::,2001:67c:4c0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:4c4::,2001:67c:4c4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4c8::,2001:67c:4c8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:4cc::,2001:67c:4cc:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:4d0::,2001:67c:4d0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:4d4::,2001:67c:4d4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:4d8::,2001:67c:4d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4dc::,2001:67c:4dc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:4e0::,2001:67c:4e0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:4e4::,2001:67c:4e4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:4e8::,2001:67c:4e8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:4ec::,2001:67c:4ec:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:4f0::,2001:67c:4f0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:4f4::,2001:67c:4f4:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:4f8::,2001:67c:4f8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:4fc::,2001:67c:4fc:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:500::,2001:67c:500:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:504::,2001:67c:504:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:508::,2001:67c:508:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:50c::,2001:67c:50c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:510::,2001:67c:510:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:514::,2001:67c:514:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:518::,2001:67c:518:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:51c::,2001:67c:51c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:520::,2001:67c:520:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:524::,2001:67c:524:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:528::,2001:67c:528:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:52c::,2001:67c:52c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:530::,2001:67c:530:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:534::,2001:67c:534:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:538::,2001:67c:538:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:53c::,2001:67c:53c:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:540::,2001:67c:540:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:544::,2001:67c:544:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:548::,2001:67c:548:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:54c::,2001:67c:54c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:550::,2001:67c:550:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:554::,2001:67c:554:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:558::,2001:67c:558:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:55c::,2001:67c:55c:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:560::,2001:67c:560:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:564::,2001:67c:564:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:568::,2001:67c:568:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:56c::,2001:67c:56c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:570::,2001:67c:570:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:574::,2001:67c:574:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:578::,2001:67c:578:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:57c::,2001:67c:57c:ffff:ffff:ffff:ffff:ffff,BY -2001:67c:580::,2001:67c:580:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU -2001:67c:5a0::,2001:67c:5a1:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:5a8::,2001:67c:5a8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:5ac::,2001:67c:5ac:ffff:ffff:ffff:ffff:ffff,BY -2001:67c:5b0::,2001:67c:5b0:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:5b4::,2001:67c:5b4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:5b8::,2001:67c:5b8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:5bc::,2001:67c:5bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:5c0::,2001:67c:5c0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:5c4::,2001:67c:5c4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:5c8::,2001:67c:5c8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:5cc::,2001:67c:5cc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:5d0::,2001:67c:5d0:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:5d4::,2001:67c:5d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:5d8::,2001:67c:5d8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:5dc::,2001:67c:5dc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:5e0::,2001:67c:5e0:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:5e4::,2001:67c:5e4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:5e8::,2001:67c:5e8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:5ec::,2001:67c:5ec:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:5f0::,2001:67c:5f0:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:5f4::,2001:67c:5f4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:5f8::,2001:67c:5f8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:5fc::,2001:67c:5fc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:600::,2001:67c:600:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:604::,2001:67c:604:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:608::,2001:67c:608:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:60c::,2001:67c:60c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:610::,2001:67c:610:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:614::,2001:67c:614:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:618::,2001:67c:618:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:61c::,2001:67c:61c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:620::,2001:67c:620:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:624::,2001:67c:624:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:628::,2001:67c:628:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:62c::,2001:67c:62c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:630::,2001:67c:630:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:634::,2001:67c:634:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:638::,2001:67c:638:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:63c::,2001:67c:63c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:640::,2001:67c:640:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:644::,2001:67c:644:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:648::,2001:67c:648:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:64c::,2001:67c:64c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:650::,2001:67c:650:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:654::,2001:67c:654:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:658::,2001:67c:658:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:65c::,2001:67c:65c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:660::,2001:67c:660:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:664::,2001:67c:664:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:668::,2001:67c:668:ffff:ffff:ffff:ffff:ffff,MD -2001:67c:66c::,2001:67c:66c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:670::,2001:67c:670:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:674::,2001:67c:674:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:678::,2001:67c:678:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:67c::,2001:67c:67c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:680::,2001:67c:680:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:684::,2001:67c:684:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:688::,2001:67c:688:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:68c::,2001:67c:68c:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:690::,2001:67c:690:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:694::,2001:67c:694:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:698::,2001:67c:698:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:69c::,2001:67c:69c:ffff:ffff:ffff:ffff:ffff,RS -2001:67c:6a0::,2001:67c:6a0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:6a4::,2001:67c:6a4:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:6a8::,2001:67c:6a8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:6ac::,2001:67c:6ac:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:6b0::,2001:67c:6b0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:6b4::,2001:67c:6b4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6b8::,2001:67c:6b8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:6bc::,2001:67c:6bc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:6c0::,2001:67c:6c0:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:6e0::,2001:67c:6e0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:6e4::,2001:67c:6e4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:6e8::,2001:67c:6e8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:6ec::,2001:67c:6ec:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:6f0::,2001:67c:6f0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:6f4::,2001:67c:6f4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:6f8::,2001:67c:6f8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:718::,2001:67c:718:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:71c::,2001:67c:71c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:720::,2001:67c:720:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:724::,2001:67c:724:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:728::,2001:67c:728:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:72c::,2001:67c:72c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:730::,2001:67c:730:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:734::,2001:67c:734:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:738::,2001:67c:738:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:73c::,2001:67c:73c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:740::,2001:67c:740:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:744::,2001:67c:744:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:748::,2001:67c:748:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:74c::,2001:67c:74c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:750::,2001:67c:750:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:754::,2001:67c:754:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:758::,2001:67c:758:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:75c::,2001:67c:75c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:760::,2001:67c:760:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:764::,2001:67c:764:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:768::,2001:67c:768:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:76c::,2001:67c:76c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:770::,2001:67c:770:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:774::,2001:67c:774:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:778::,2001:67c:778:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:77c::,2001:67c:77c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:780::,2001:67c:780:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:784::,2001:67c:784:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:788::,2001:67c:788:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:78c::,2001:67c:78c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:790::,2001:67c:790:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:794::,2001:67c:794:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:798::,2001:67c:798:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:79c::,2001:67c:79c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:7bc::,2001:67c:7bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:7c0::,2001:67c:7c3:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:7d0::,2001:67c:7d0:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:7d4::,2001:67c:7d4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:7d8::,2001:67c:7d8:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:7dc::,2001:67c:7dc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:7e0::,2001:67c:7e0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:7e4::,2001:67c:7e4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:7e8::,2001:67c:7e8:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:7ec::,2001:67c:7ec:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:7f0::,2001:67c:7f0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:7f4::,2001:67c:7f4:ffff:ffff:ffff:ffff:ffff,KW -2001:67c:7f8::,2001:67c:7f8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:7fc::,2001:67c:7fc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1000::,2001:67c:1001:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1008::,2001:67c:1009:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1010::,2001:67c:1011:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1018::,2001:67c:1019:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1020::,2001:67c:1021:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1028::,2001:67c:1029:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1030::,2001:67c:1030:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1038::,2001:67c:1038:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:103c::,2001:67c:103c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1040::,2001:67c:1040:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1044::,2001:67c:1044:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1048::,2001:67c:1048:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:104c::,2001:67c:104c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1050::,2001:67c:1050:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:1054::,2001:67c:1054:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1058::,2001:67c:1058:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:105c::,2001:67c:105c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1060::,2001:67c:1060:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:1064::,2001:67c:1064:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1068::,2001:67c:1068:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:106c::,2001:67c:106c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1070::,2001:67c:1071:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:1078::,2001:67c:1078:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:107c::,2001:67c:107c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1080::,2001:67c:1080:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1084::,2001:67c:1084:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1088::,2001:67c:1089:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1090::,2001:67c:1090:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1094::,2001:67c:1094:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1098::,2001:67c:1098:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:109c::,2001:67c:109c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10a0::,2001:67c:10a0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10a4::,2001:67c:10a4:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:10a8::,2001:67c:10a9:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:10b0::,2001:67c:10b0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:10b4::,2001:67c:10b4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:10b8::,2001:67c:10b8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:10bc::,2001:67c:10bc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:10c0::,2001:67c:10c0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10c4::,2001:67c:10c4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10c8::,2001:67c:10c8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10cc::,2001:67c:10cc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10d0::,2001:67c:10d0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10d4::,2001:67c:10d4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10d8::,2001:67c:10d8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:10dc::,2001:67c:10dc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10e0::,2001:67c:10e0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:10e4::,2001:67c:10e4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:10e8::,2001:67c:10e8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:10ec::,2001:67c:10ec:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:10f0::,2001:67c:10f0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:10f4::,2001:67c:10f4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:10f8::,2001:67c:10f8:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:10fc::,2001:67c:10fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1100::,2001:67c:1100:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1104::,2001:67c:1104:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1108::,2001:67c:1109:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1110::,2001:67c:1111:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1118::,2001:67c:1118:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:111c::,2001:67c:111c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1120::,2001:67c:1120:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1124::,2001:67c:1124:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:1128::,2001:67c:1128:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:112c::,2001:67c:112c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1130::,2001:67c:1130:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1134::,2001:67c:1134:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1138::,2001:67c:1138:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:113c::,2001:67c:113c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1140::,2001:67c:1140:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1144::,2001:67c:1144:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1148::,2001:67c:1148:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:114c::,2001:67c:114c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1150::,2001:67c:1150:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:1154::,2001:67c:1154:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:1158::,2001:67c:1158:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:115c::,2001:67c:115c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1160::,2001:67c:1160:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1164::,2001:67c:1164:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1168::,2001:67c:1168:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:116c::,2001:67c:116c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1170::,2001:67c:1170:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1178::,2001:67c:1178:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:117c::,2001:67c:117c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1184::,2001:67c:1184:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:1188::,2001:67c:1188:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:118c::,2001:67c:118c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1190::,2001:67c:1190:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1194::,2001:67c:1194:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1198::,2001:67c:1199:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:11a0::,2001:67c:11a0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:11a4::,2001:67c:11a4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:11a8::,2001:67c:11a8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:11ac::,2001:67c:11ac:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:11b0::,2001:67c:11b0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:11b4::,2001:67c:11b4:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:11b8::,2001:67c:11b8:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:11bc::,2001:67c:11bc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:11c0::,2001:67c:11c0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:11c4::,2001:67c:11c4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:11c8::,2001:67c:11c8:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:11cc::,2001:67c:11cc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:11d0::,2001:67c:11d0:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:11d4::,2001:67c:11d4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:11d8::,2001:67c:11d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:11f0::,2001:67c:11f0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:11f8::,2001:67c:11f8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:11fc::,2001:67c:11fc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1200::,2001:67c:1200:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1204::,2001:67c:1204:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1208::,2001:67c:1208:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:120c::,2001:67c:120c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1210::,2001:67c:1213:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1220::,2001:67c:1223:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1230::,2001:67c:1233:ffff:ffff:ffff:ffff:ffff,SG -2001:67c:1240::,2001:67c:1240:ffff:ffff:ffff:ffff:ffff,IE -2001:67c:1244::,2001:67c:1244:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1248::,2001:67c:1248:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:124c::,2001:67c:124c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1250::,2001:67c:1250:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1254::,2001:67c:1254:7fff:ffff:ffff:ffff:ffff,JP -2001:67c:1254:8000::,2001:67c:1254:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1258::,2001:67c:1258:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:125c::,2001:67c:125c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1260::,2001:67c:1260:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1264::,2001:67c:1264:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1268::,2001:67c:1268:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:126c::,2001:67c:126c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1270::,2001:67c:1270:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1274::,2001:67c:1274:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1278::,2001:67c:1278:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:127c::,2001:67c:127c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:1280::,2001:67c:1280:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1284::,2001:67c:1284:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1288::,2001:67c:1288:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:128c::,2001:67c:128c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1290::,2001:67c:1290:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1294::,2001:67c:1294:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1298::,2001:67c:1298:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:129c::,2001:67c:129c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:12a0::,2001:67c:12a0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12a4::,2001:67c:12a4:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:12a8::,2001:67c:12a8:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:12ac::,2001:67c:12ac:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:12b0::,2001:67c:12b0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:12b4::,2001:67c:12b4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:12b8::,2001:67c:12b8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12bc::,2001:67c:12bc:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:12c0::,2001:67c:12c1:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:12c8::,2001:67c:12c8:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:12cc::,2001:67c:12cc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:12d0::,2001:67c:12d0:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,KG -2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12f0::,2001:67c:12f0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12f4::,2001:67c:12f4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:12f8::,2001:67c:12f8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:12fc::,2001:67c:12fc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1300::,2001:67c:1300:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1304::,2001:67c:1304:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1308::,2001:67c:1308:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1318::,2001:67c:1318:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:131c::,2001:67c:131c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1320::,2001:67c:1320:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1324::,2001:67c:1324:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1328::,2001:67c:1328:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:132c::,2001:67c:132c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1330::,2001:67c:1330:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1334::,2001:67c:1334:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1338::,2001:67c:1338:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:133c::,2001:67c:133c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1340::,2001:67c:1340:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:1344::,2001:67c:1344:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1348::,2001:67c:1348:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:134c::,2001:67c:134c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1350::,2001:67c:1350:ffff:ffff:ffff:ffff:ffff,CY -2001:67c:1354::,2001:67c:1354:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1358::,2001:67c:1358:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:135c::,2001:67c:135c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1360::,2001:67c:1360:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1364::,2001:67c:1364:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1368::,2001:67c:1368:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:136c::,2001:67c:136c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1370::,2001:67c:1370:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1374::,2001:67c:1374:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1378::,2001:67c:1378:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:137c::,2001:67c:137c:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:1380::,2001:67c:1380:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1384::,2001:67c:1384:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1388::,2001:67c:1388:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:138c::,2001:67c:138c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1390::,2001:67c:1390:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1394::,2001:67c:1394:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1398::,2001:67c:1398:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:139c::,2001:67c:139c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:13a0::,2001:67c:13a0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:13a4::,2001:67c:13a4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:13a8::,2001:67c:13a8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:13ac::,2001:67c:13ac:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:13b0::,2001:67c:13b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:13b4::,2001:67c:13b4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:13b8::,2001:67c:13b8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:13bc::,2001:67c:13bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:13c0::,2001:67c:13c0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:13c4::,2001:67c:13c4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:13c8::,2001:67c:13c8:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:13cc::,2001:67c:13cc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:13d0::,2001:67c:13d0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:13d4::,2001:67c:13d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:13d8::,2001:67c:13d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:13dc::,2001:67c:13dc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:13e0::,2001:67c:13e0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:13e4::,2001:67c:13e4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:13e8::,2001:67c:13e8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:13ec::,2001:67c:13ec:ffff:ffff:ffff:ffff:ffff,PT -2001:67c:13f0::,2001:67c:13f0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:13f4::,2001:67c:13f4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:13f8::,2001:67c:13f8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:13fc::,2001:67c:13fc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1400::,2001:67c:1407:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1420::,2001:67c:1420:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1424::,2001:67c:1424:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:142c::,2001:67c:142c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1430::,2001:67c:1430:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1434::,2001:67c:1434:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1438::,2001:67c:1438:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:143c::,2001:67c:143c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1440::,2001:67c:1447:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1460::,2001:67c:1467:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1480::,2001:67c:1480:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1484::,2001:67c:1484:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1488::,2001:67c:1488:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:148c::,2001:67c:148c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1490::,2001:67c:1490:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1494::,2001:67c:1494:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1498::,2001:67c:1498:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:149c::,2001:67c:149c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:14a0::,2001:67c:14a0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:14a4::,2001:67c:14a4:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:14a8::,2001:67c:14a8:ffff:ffff:ffff:ffff:ffff,KZ -2001:67c:14ac::,2001:67c:14ac:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:14b0::,2001:67c:14b0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:14b4::,2001:67c:14b4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:14b8::,2001:67c:14b8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:14bc::,2001:67c:14bc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:14c0::,2001:67c:14c0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:14c4::,2001:67c:14c4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:14c8::,2001:67c:14c9:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:14d0::,2001:67c:14d0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:14d4::,2001:67c:14d4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:14d8::,2001:67c:14d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:14dc::,2001:67c:14dc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:14e0::,2001:67c:14e7:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1500::,2001:67c:1500:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1504::,2001:67c:1504:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1508::,2001:67c:1508:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:150c::,2001:67c:150c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1510::,2001:67c:1510:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1514::,2001:67c:1514:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1518::,2001:67c:1518:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:151c::,2001:67c:151c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1520::,2001:67c:1520:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1524::,2001:67c:1524:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1528::,2001:67c:1528:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:152c::,2001:67c:152c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1530::,2001:67c:1530:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1534::,2001:67c:1534:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1538::,2001:67c:1538:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:153c::,2001:67c:153c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1540::,2001:67c:1540:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1544::,2001:67c:1544:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1548::,2001:67c:1548:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:154c::,2001:67c:154c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1550::,2001:67c:1550:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1554::,2001:67c:1554:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:1558::,2001:67c:1558:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:155c::,2001:67c:155c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1560::,2001:67c:1562:7fff:ffff:ffff:ffff:ffff,GB -2001:67c:1562:8000::,2001:67c:1562:ffff:ffff:ffff:ffff:ffff,AU -2001:67c:1563::,2001:67c:1563:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1570::,2001:67c:1570:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1574::,2001:67c:1574:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1578::,2001:67c:1578:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:157c::,2001:67c:157c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1580::,2001:67c:1580:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1584::,2001:67c:1584:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1588::,2001:67c:1588:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:158c::,2001:67c:158c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1590::,2001:67c:1591:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1598::,2001:67c:1598:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:159c::,2001:67c:159c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:15a0::,2001:67c:15a3:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:15b0::,2001:67c:15b0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:15b4::,2001:67c:15b4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:15b8::,2001:67c:15b8:ffff:ffff:ffff:ffff:ffff,SM -2001:67c:15bc::,2001:67c:15bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15c0::,2001:67c:15c0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:15c4::,2001:67c:15c4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15c8::,2001:67c:15c8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15cc::,2001:67c:15cc:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:15d0::,2001:67c:15d0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:15d4::,2001:67c:15d4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15d8::,2001:67c:15d8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:15dc::,2001:67c:15dc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:15e0::,2001:67c:15e0:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:15e4::,2001:67c:15e4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:15e8::,2001:67c:15e8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15ec::,2001:67c:15ec:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:15f0::,2001:67c:15f0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:15f4::,2001:67c:15f4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:15f8::,2001:67c:15f8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:15fc::,2001:67c:15fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1600::,2001:67c:160f:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1640::,2001:67c:164f:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:1680::,2001:67c:1680:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1684::,2001:67c:1684:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:1688::,2001:67c:1688:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:168c::,2001:67c:168c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1690::,2001:67c:1690:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1694::,2001:67c:1694:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1698::,2001:67c:1698:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:169c::,2001:67c:169c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:16a0::,2001:67c:16a0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:16a4::,2001:67c:16a4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:16a8::,2001:67c:16a8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:16ac::,2001:67c:16ac:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:16b0::,2001:67c:16b0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:16b4::,2001:67c:16b4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:16b8::,2001:67c:16b8:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:16bc::,2001:67c:16bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:16c0::,2001:67c:16c0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:16c4::,2001:67c:16c4:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:16c8::,2001:67c:16c8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:16cc::,2001:67c:16cc:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:16d0::,2001:67c:16d1:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:16d8::,2001:67c:16d8:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:16dc::,2001:67c:16dc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:16e0::,2001:67c:16e0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:16e4::,2001:67c:16e4:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:16e8::,2001:67c:16e8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:16ec::,2001:67c:16ec:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:16f0::,2001:67c:16f0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:16f4::,2001:67c:16f4:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:16f8::,2001:67c:16f8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:16fc::,2001:67c:16fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1700::,2001:67c:1700:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1704::,2001:67c:1704:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1708::,2001:67c:1708:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:170c::,2001:67c:170c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1710::,2001:67c:1710:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1714::,2001:67c:1714:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1718::,2001:67c:1719:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1720::,2001:67c:1720:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1724::,2001:67c:1724:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1728::,2001:67c:1728:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:172c::,2001:67c:172c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1730::,2001:67c:1730:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1734::,2001:67c:1734:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1738::,2001:67c:1738:7fff:ffff:ffff:ffff:ffff,UA -2001:67c:1738:8000::,2001:67c:1738:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:173c::,2001:67c:173c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1740::,2001:67c:1740:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1744::,2001:67c:1744:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:1748::,2001:67c:1748:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:174c::,2001:67c:174c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1750::,2001:67c:1750:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1754::,2001:67c:1754:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1758::,2001:67c:1758:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:175c::,2001:67c:175c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1760::,2001:67c:1760:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:1764::,2001:67c:1764:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1768::,2001:67c:1768:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:176c::,2001:67c:176c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1770::,2001:67c:1770:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1774::,2001:67c:1774:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1778::,2001:67c:1778:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:177c::,2001:67c:177c:ffff:ffff:ffff:ffff:ffff,LT -2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:179c::,2001:67c:179c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:17a0::,2001:67c:17a0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:17a4::,2001:67c:17a4:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:17a8::,2001:67c:17a8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17ac::,2001:67c:17ac:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17b0::,2001:67c:17b0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:17b4::,2001:67c:17b4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:17b8::,2001:67c:17b8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:17bc::,2001:67c:17bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17c0::,2001:67c:17c0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17c4::,2001:67c:17c4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17c8::,2001:67c:17c8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:17cc::,2001:67c:17cc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17d0::,2001:67c:17d0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:17d4::,2001:67c:17d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:17d8::,2001:67c:17d8:ffff:ffff:ffff:ffff:ffff,CY -2001:67c:17dc::,2001:67c:17dc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17e0::,2001:67c:17e0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17e4::,2001:67c:17e4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:17e8::,2001:67c:17e8:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:17ec::,2001:67c:17ec:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:17f0::,2001:67c:17f0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17f4::,2001:67c:17f4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:17f8::,2001:67c:17f8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:17fc::,2001:67c:17fc:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1800::,2001:67c:1800:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1804::,2001:67c:1804:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1808::,2001:67c:1809:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:1810::,2001:67c:1810:7fff:ffff:ffff:ffff:ffff,BE -2001:67c:1810:8000::,2001:67c:1810:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:1814::,2001:67c:1814:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1818::,2001:67c:1818:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:181c::,2001:67c:181c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1820::,2001:67c:1820:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1824::,2001:67c:1824:ffff:ffff:ffff:ffff:ffff,IS -2001:67c:1828::,2001:67c:1828:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:182c::,2001:67c:182c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1830::,2001:67c:1830:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1834::,2001:67c:1834:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:1838::,2001:67c:1838:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,MD -2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1850::,2001:67c:1850:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1858::,2001:67c:1858:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:185c::,2001:67c:185c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:1860::,2001:67c:1860:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1864::,2001:67c:1864:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1868::,2001:67c:1868:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:186c::,2001:67c:186c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1870::,2001:67c:1870:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1874::,2001:67c:1874:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1878::,2001:67c:1878:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:187c::,2001:67c:187c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1880::,2001:67c:1880:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1884::,2001:67c:1884:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1888::,2001:67c:1888:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:188c::,2001:67c:188c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1890::,2001:67c:1890:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1894::,2001:67c:1894:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1898::,2001:67c:1898:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:189c::,2001:67c:189c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:18a0::,2001:67c:18a0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:18a4::,2001:67c:18a4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:18a8::,2001:67c:18a8:ffff:ffff:ffff:ffff:ffff,BY -2001:67c:18ac::,2001:67c:18ac:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:18b0::,2001:67c:18b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18b4::,2001:67c:18b4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:18b8::,2001:67c:18b8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18bc::,2001:67c:18bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18c0::,2001:67c:18c0:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:18c4::,2001:67c:18c4:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:18c8::,2001:67c:18c9:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:18d0::,2001:67c:18d0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:18d4::,2001:67c:18d4:ffff:ffff:ffff:ffff:ffff,NZ -2001:67c:18d8::,2001:67c:18d8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:18dc::,2001:67c:18dc:ffff:ffff:ffff:ffff:ffff,LI -2001:67c:18e0::,2001:67c:18e0:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:18e4::,2001:67c:18e4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:18e8::,2001:67c:18e8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18ec::,2001:67c:18ec:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18f0::,2001:67c:18f0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:18f4::,2001:67c:18f4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:18fc::,2001:67c:18fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1900::,2001:67c:1903:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:1910::,2001:67c:1910:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1914::,2001:67c:1914:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1918::,2001:67c:1918:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:191c::,2001:67c:191c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1920::,2001:67c:1920:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1924::,2001:67c:1924:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1928::,2001:67c:1928:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:192c::,2001:67c:192c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1930::,2001:67c:1933:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1940::,2001:67c:1940:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1944::,2001:67c:1944:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1948::,2001:67c:1948:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:194c::,2001:67c:194c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1950::,2001:67c:1950:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1954::,2001:67c:1954:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1958::,2001:67c:1958:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:195c::,2001:67c:195c:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:1960::,2001:67c:1960:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1968::,2001:67c:1968:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:196c::,2001:67c:196c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1970::,2001:67c:1970:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1974::,2001:67c:1974:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1978::,2001:67c:1978:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:197c::,2001:67c:197c:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:1980::,2001:67c:1980:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1984::,2001:67c:1984:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:1988::,2001:67c:1988:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:198c::,2001:67c:198c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1990::,2001:67c:1990:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1994::,2001:67c:1994:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1998::,2001:67c:1998:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:199c::,2001:67c:199c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:19a0::,2001:67c:19a0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:19a4::,2001:67c:19a4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:19a8::,2001:67c:19a8:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:19ac::,2001:67c:19ac:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:19b0::,2001:67c:19b3:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:19c0::,2001:67c:19c0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:19c4::,2001:67c:19c4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:19c8::,2001:67c:19c8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:19cc::,2001:67c:19cc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:19d0::,2001:67c:19d0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:19d4::,2001:67c:19d4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:19d8::,2001:67c:19d8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:19dc::,2001:67c:19dc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:19e0::,2001:67c:19e0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:19e8::,2001:67c:19e8:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:19ec::,2001:67c:19ec:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:19f0::,2001:67c:19f0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:19f4::,2001:67c:19f4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:19f8::,2001:67c:19f8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:19fc::,2001:67c:19fc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1a00::,2001:67c:1a3f:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1b00::,2001:67c:1b00:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b04::,2001:67c:1b04:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b08::,2001:67c:1b08:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:1b0c::,2001:67c:1b0c:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:1b10::,2001:67c:1b10:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b14::,2001:67c:1b14:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b18::,2001:67c:1b18:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b1c::,2001:67c:1b1c:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:1b24::,2001:67c:1b24:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1b28::,2001:67c:1b28:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b2c::,2001:67c:1b2c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b34::,2001:67c:1b34:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b38::,2001:67c:1b38:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b3c::,2001:67c:1b3c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:1b40::,2001:67c:1b43:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1b50::,2001:67c:1b50:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1b58::,2001:67c:1b59:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1b60::,2001:67c:1b60:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b64::,2001:67c:1b64:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1b68::,2001:67c:1b68:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b6c::,2001:67c:1b6c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b70::,2001:67c:1b70:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1b74::,2001:67c:1b74:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b78::,2001:67c:1b78:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:1b98::,2001:67c:1b98:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b9c::,2001:67c:1b9c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1ba0::,2001:67c:1ba0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1ba4::,2001:67c:1ba4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1ba8::,2001:67c:1ba8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1bac::,2001:67c:1bac:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:1bb0::,2001:67c:1bb0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:1bb4::,2001:67c:1bb4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:1bb8::,2001:67c:1bb8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1bbc::,2001:67c:1bbc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:1bc0::,2001:67c:1bc0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1bc4::,2001:67c:1bc4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:1bc8::,2001:67c:1bc8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1bcc::,2001:67c:1bcc:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1bd0::,2001:67c:1bd0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:1bd4::,2001:67c:1bd4:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:1bd8::,2001:67c:1bd8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1be0::,2001:67c:1be0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1be4::,2001:67c:1be4:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:1be8::,2001:67c:1be8:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:1bec::,2001:67c:1bec:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:1bf0::,2001:67c:1bf0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1bf4::,2001:67c:1bf4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:1bf8::,2001:67c:1bf8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:1bfc::,2001:67c:1bfc:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:1c00::,2001:67c:1cff:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2000::,2001:67c:2000:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2004::,2001:67c:2004:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2008::,2001:67c:2008:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:200c::,2001:67c:200c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2010::,2001:67c:2010:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2014::,2001:67c:2014:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2018::,2001:67c:2018:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:201c::,2001:67c:201c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2020::,2001:67c:2020:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2024::,2001:67c:2024:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2028::,2001:67c:2028:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:202c::,2001:67c:202c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2030::,2001:67c:2030:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2034::,2001:67c:2034:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2038::,2001:67c:2038:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2054::,2001:67c:2054:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2058::,2001:67c:2058:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:205c::,2001:67c:205c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2060::,2001:67c:2060:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2064::,2001:67c:2064:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2068::,2001:67c:2068:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:206c::,2001:67c:206c:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2070::,2001:67c:2070:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2074::,2001:67c:2074:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2078::,2001:67c:2078:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:207c::,2001:67c:207c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2080::,2001:67c:2080:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2084::,2001:67c:2084:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2088::,2001:67c:2088:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:208c::,2001:67c:208c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2090::,2001:67c:2090:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2094::,2001:67c:2094:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2098::,2001:67c:2098:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:209c::,2001:67c:209c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:20a0::,2001:67c:20a1:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:20a8::,2001:67c:20a8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:20ac::,2001:67c:20ac:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:20b0::,2001:67c:20b0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:20b4::,2001:67c:20b4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:20b8::,2001:67c:20b9:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:20c0::,2001:67c:20c0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:20c4::,2001:67c:20c4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:20c8::,2001:67c:20c8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:20cc::,2001:67c:20cc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:20d0::,2001:67c:20d1:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:20d8::,2001:67c:20d8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:20dc::,2001:67c:20dc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:20e0::,2001:67c:20e0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:20e4::,2001:67c:20e4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:20e8::,2001:67c:20e8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:20ec::,2001:67c:20ec:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:20f0::,2001:67c:20f0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:20f4::,2001:67c:20f4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:20f8::,2001:67c:20f8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:20fc::,2001:67c:20fc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2100::,2001:67c:2100:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS -2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2120::,2001:67c:2120:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2124::,2001:67c:2124:ffff:ffff:ffff:ffff:ffff,HU -2001:67c:2128::,2001:67c:2128:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:212c::,2001:67c:212c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2130::,2001:67c:2130:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2134::,2001:67c:2134:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2138::,2001:67c:2138:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:213c::,2001:67c:213c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2140::,2001:67c:2140:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2144::,2001:67c:2144:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2148::,2001:67c:2148:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:214c::,2001:67c:214c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2150::,2001:67c:2150:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2154::,2001:67c:2154:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2158::,2001:67c:2158:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:215c::,2001:67c:215c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2160::,2001:67c:2160:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2164::,2001:67c:2164:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:2168::,2001:67c:2168:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:216c::,2001:67c:216c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2170::,2001:67c:2170:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2174::,2001:67c:2174:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2178::,2001:67c:2178:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:217c::,2001:67c:217c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2180::,2001:67c:2180:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2184::,2001:67c:2184:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2188::,2001:67c:2188:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:218c::,2001:67c:218c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2190::,2001:67c:2190:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2194::,2001:67c:2194:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2198::,2001:67c:2198:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:219c::,2001:67c:219c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:21a0::,2001:67c:21a0:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:21a4::,2001:67c:21a4:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:21a8::,2001:67c:21a8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:21ac::,2001:67c:21ac:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:21b0::,2001:67c:21b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:21b4::,2001:67c:21b4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:21bc::,2001:67c:21bc:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:21d4::,2001:67c:21d4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:21d8::,2001:67c:21d8:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:21dc::,2001:67c:21dc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:21e0::,2001:67c:21e0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:21e4::,2001:67c:21e4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:21e8::,2001:67c:21e8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:21ec::,2001:67c:21ec:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:21f0::,2001:67c:21f0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:21f4::,2001:67c:21f4:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:21f8::,2001:67c:21f8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:21fc::,2001:67c:21fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2200::,2001:67c:2200:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2204::,2001:67c:2204:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2208::,2001:67c:2208:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:220c::,2001:67c:220c:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2210::,2001:67c:2210:ffff:ffff:ffff:ffff:ffff,RS -2001:67c:2214::,2001:67c:2214:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2218::,2001:67c:2219:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2220::,2001:67c:2220:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2230::,2001:67c:2230:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2240::,2001:67c:2240:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2244::,2001:67c:2244:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2248::,2001:67c:2248:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:224c::,2001:67c:224c:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2250::,2001:67c:2250:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2254::,2001:67c:2254:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2258::,2001:67c:2258:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:225c::,2001:67c:225c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2260::,2001:67c:2260:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2264::,2001:67c:2264:ffff:ffff:ffff:ffff:ffff,KG -2001:67c:2268::,2001:67c:2268:ffff:ffff:ffff:ffff:ffff,BY -2001:67c:226c::,2001:67c:226c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2270::,2001:67c:2270:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2274::,2001:67c:2274:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2278::,2001:67c:2278:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2280::,2001:67c:2280:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2284::,2001:67c:2284:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2288::,2001:67c:2288:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:228c::,2001:67c:228c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2290::,2001:67c:2290:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2294::,2001:67c:2294:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:2298::,2001:67c:2298:ffff:ffff:ffff:ffff:ffff,US -2001:67c:229c::,2001:67c:229c:ffff:ffff:ffff:ffff:ffff,GR -2001:67c:22a0::,2001:67c:22a0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:22a4::,2001:67c:22a4:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:22a8::,2001:67c:22a8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:22b0::,2001:67c:22b0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:22b4::,2001:67c:22b4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:22b8::,2001:67c:22b8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:22bc::,2001:67c:22bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:22c0::,2001:67c:22c0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:22c4::,2001:67c:22c4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:22c8::,2001:67c:22c8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:22cc::,2001:67c:22cc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:22d0::,2001:67c:22d0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:22d4::,2001:67c:22d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:22d8::,2001:67c:22d8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:22dc::,2001:67c:22dc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:22e0::,2001:67c:22e0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:22e4::,2001:67c:22e4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:22e8::,2001:67c:22e8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:22ec::,2001:67c:22ec:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:22f0::,2001:67c:22f0:ffff:ffff:ffff:ffff:ffff,RS -2001:67c:22f4::,2001:67c:22f4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:22f8::,2001:67c:22f8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:22fc::,2001:67c:22fc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2300::,2001:67c:2300:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2304::,2001:67c:2304:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2308::,2001:67c:2308:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:230c::,2001:67c:230c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2310::,2001:67c:2310:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2314::,2001:67c:2314:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2318::,2001:67c:2318:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:231c::,2001:67c:231c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2320::,2001:67c:2320:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2324::,2001:67c:2324:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2328::,2001:67c:2328:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:232c::,2001:67c:232c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2330::,2001:67c:2330:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2334::,2001:67c:2334:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2338::,2001:67c:2338:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:233c::,2001:67c:233c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2340::,2001:67c:2340:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2344::,2001:67c:2344:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2348::,2001:67c:2348:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:234c::,2001:67c:234c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2350::,2001:67c:2350:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2354::,2001:67c:2354:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2358::,2001:67c:2358:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:235c::,2001:67c:235c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2360::,2001:67c:2360:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2364::,2001:67c:2364:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2368::,2001:67c:2368:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:236c::,2001:67c:236c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2370::,2001:67c:2370:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2374::,2001:67c:2374:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2378::,2001:67c:2378:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:237c::,2001:67c:237c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2380::,2001:67c:2380:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2384::,2001:67c:2384:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2388::,2001:67c:2388:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:238c::,2001:67c:238c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2390::,2001:67c:2390:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2394::,2001:67c:2394:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2398::,2001:67c:2398:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:239c::,2001:67c:239c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:23a0::,2001:67c:23a0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:23a4::,2001:67c:23a4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:23a8::,2001:67c:23a8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:23ac::,2001:67c:23ac:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:23b0::,2001:67c:23b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:23b4::,2001:67c:23b4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:23b8::,2001:67c:23b8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:23bc::,2001:67c:23bc:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:23c0::,2001:67c:23c0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:23c4::,2001:67c:23c4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:23c8::,2001:67c:23c8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:23cc::,2001:67c:23cc:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:23d0::,2001:67c:23d0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:23d4::,2001:67c:23d4:ffff:ffff:ffff:ffff:ffff,EE -2001:67c:23d8::,2001:67c:23d9:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:23e0::,2001:67c:23e0:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:23e4::,2001:67c:23e4:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:23e8::,2001:67c:23e8:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:23ec::,2001:67c:23ec:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:23f0::,2001:67c:23f0:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:23f4::,2001:67c:23f4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:23f8::,2001:67c:23f8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:23fc::,2001:67c:23fc:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2400::,2001:67c:2400:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2404::,2001:67c:2404:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2408::,2001:67c:2408:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:240c::,2001:67c:240c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2410::,2001:67c:2410:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:2414::,2001:67c:2414:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2418::,2001:67c:2418:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:241c::,2001:67c:241c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2420::,2001:67c:2420:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2424::,2001:67c:2424:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2428::,2001:67c:2428:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:242c::,2001:67c:242c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2430::,2001:67c:2433:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2440::,2001:67c:2440:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2444::,2001:67c:2444:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2448::,2001:67c:2448:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:244c::,2001:67c:244c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2450::,2001:67c:2450:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2454::,2001:67c:2454:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2458::,2001:67c:2458:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:245c::,2001:67c:245c:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2460::,2001:67c:2460:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2464::,2001:67c:2464:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2468::,2001:67c:2468:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:246c::,2001:67c:246c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2470::,2001:67c:2470:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2474::,2001:67c:2474:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2478::,2001:67c:2478:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:247c::,2001:67c:247c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2480::,2001:67c:2480:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2484::,2001:67c:2484:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2488::,2001:67c:2488:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:248c::,2001:67c:248c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2490::,2001:67c:2490:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2494::,2001:67c:2494:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2498::,2001:67c:2498:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:249c::,2001:67c:249c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:24a0::,2001:67c:24a0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:24a8::,2001:67c:24a8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:24ac::,2001:67c:24ac:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:24b0::,2001:67c:24b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:24b4::,2001:67c:24b4:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:24b8::,2001:67c:24b8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:24bc::,2001:67c:24bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:24c0::,2001:67c:24c0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:24c4::,2001:67c:24c4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:24c8::,2001:67c:24c8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:24cc::,2001:67c:24cc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:24d0::,2001:67c:24d0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:24d4::,2001:67c:24d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:24d8::,2001:67c:24d8:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:24dc::,2001:67c:24dc:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:24e0::,2001:67c:24e0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:24e4::,2001:67c:24e4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:24e8::,2001:67c:24e9:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:24f0::,2001:67c:24f0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:24f4::,2001:67c:24f4:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:24f8::,2001:67c:24f8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:24fc::,2001:67c:24fc:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2500::,2001:67c:2507:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2520::,2001:67c:2520:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2524::,2001:67c:2524:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2528::,2001:67c:2528:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:252c::,2001:67c:252c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2530::,2001:67c:2530:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2534::,2001:67c:2534:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2538::,2001:67c:2538:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:253c::,2001:67c:253c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2540::,2001:67c:2540:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2544::,2001:67c:2544:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2548::,2001:67c:2548:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:254c::,2001:67c:254c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2550::,2001:67c:2550:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2554::,2001:67c:2554:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2558::,2001:67c:2558:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:255c::,2001:67c:255c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2560::,2001:67c:2560:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2564::,2001:67c:2564:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2568::,2001:67c:2568:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:256c::,2001:67c:256c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2570::,2001:67c:2570:ffff:ffff:ffff:ffff:ffff,LI -2001:67c:2574::,2001:67c:2574:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2578::,2001:67c:2578:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:257c::,2001:67c:257c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2580::,2001:67c:2580:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2584::,2001:67c:2584:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2588::,2001:67c:2588:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:258c::,2001:67c:258c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2590::,2001:67c:2590:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2594::,2001:67c:2594:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2598::,2001:67c:2598:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:259c::,2001:67c:259c:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:25a0::,2001:67c:25a0:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:25a4::,2001:67c:25a4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:25ac::,2001:67c:25ac:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:25b0::,2001:67c:25b0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:25b4::,2001:67c:25b4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:25b8::,2001:67c:25b8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:25bc::,2001:67c:25bc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:25c0::,2001:67c:25c0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:25c4::,2001:67c:25c4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:25c8::,2001:67c:25c8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:25cc::,2001:67c:25cc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:25d0::,2001:67c:25d0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:25d4::,2001:67c:25d4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:25d8::,2001:67c:25d8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:25dc::,2001:67c:25dc:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:25e0::,2001:67c:25e0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:25e4::,2001:67c:25e4:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:25e8::,2001:67c:25e8:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:25ec::,2001:67c:25ec:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:25f0::,2001:67c:25f0:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:25f4::,2001:67c:25f4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:25fc::,2001:67c:25fc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2600::,2001:67c:2600:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2604::,2001:67c:2604:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2608::,2001:67c:2608:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:260c::,2001:67c:260c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2610::,2001:67c:2610:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2614::,2001:67c:2614:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2618::,2001:67c:2618:ffff:ffff:ffff:ffff:ffff,EE -2001:67c:261c::,2001:67c:261c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2620::,2001:67c:2620:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2624::,2001:67c:2624:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:2628::,2001:67c:2628:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:262c::,2001:67c:262c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2630::,2001:67c:2630:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2634::,2001:67c:2634:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2638::,2001:67c:2638:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:263c::,2001:67c:263c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2640::,2001:67c:2640:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:2644::,2001:67c:2644:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2648::,2001:67c:2648:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:264c::,2001:67c:264c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2650::,2001:67c:2650:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2654::,2001:67c:2654:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:2658::,2001:67c:2658:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:265c::,2001:67c:265c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2664::,2001:67c:2664:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2668::,2001:67c:2668:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:266c::,2001:67c:266c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2670::,2001:67c:2670:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2674::,2001:67c:2674:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:267c::,2001:67c:267c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2680::,2001:67c:2680:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2684::,2001:67c:2684:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2688::,2001:67c:2688:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:268c::,2001:67c:268c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2690::,2001:67c:2690:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2694::,2001:67c:2694:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2698::,2001:67c:2698:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:269c::,2001:67c:269c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:26a0::,2001:67c:26a0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:26a4::,2001:67c:26a4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:26a8::,2001:67c:26a8:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:26ac::,2001:67c:26ac:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:26b0::,2001:67c:26b0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:26b4::,2001:67c:26b4:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:26b8::,2001:67c:26b8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:26bc::,2001:67c:26bc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:26c0::,2001:67c:26c3:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:26d0::,2001:67c:26d0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:26d4::,2001:67c:26d4:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:26d8::,2001:67c:26d8:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:26dc::,2001:67c:26dc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:26e0::,2001:67c:26e0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:26e4::,2001:67c:26e4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:26e8::,2001:67c:26e8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:26ec::,2001:67c:26ec:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:26f0::,2001:67c:26f0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:26f4::,2001:67c:26f4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:26f8::,2001:67c:26f8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:26fc::,2001:67c:26fc:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2700::,2001:67c:2700:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2704::,2001:67c:2704:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2708::,2001:67c:2708:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:270c::,2001:67c:270c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2710::,2001:67c:2710:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2714::,2001:67c:2714:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2718::,2001:67c:2718:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:271c::,2001:67c:271c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2720::,2001:67c:2720:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2724::,2001:67c:2724:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2728::,2001:67c:2728:ffff:ffff:ffff:ffff:ffff,IR -2001:67c:272c::,2001:67c:272c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2730::,2001:67c:2730:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2734::,2001:67c:2734:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2738::,2001:67c:2738:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:273c::,2001:67c:273c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2740::,2001:67c:2740:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2744::,2001:67c:2744:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2748::,2001:67c:2748:ffff:ffff:ffff:ffff:ffff,GR -2001:67c:274c::,2001:67c:274c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2750::,2001:67c:2750:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2754::,2001:67c:2754:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2758::,2001:67c:2758:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:275c::,2001:67c:275c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2760::,2001:67c:2760:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2764::,2001:67c:2764:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2768::,2001:67c:2768:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2788::,2001:67c:2788:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:278c::,2001:67c:278c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2790::,2001:67c:2790:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2794::,2001:67c:2794:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2798::,2001:67c:2798:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:279c::,2001:67c:279c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:27a0::,2001:67c:27a0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:27a4::,2001:67c:27a4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:27a8::,2001:67c:27a8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:27ac::,2001:67c:27ac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:27b0::,2001:67c:27b0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:27b4::,2001:67c:27b4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:27b8::,2001:67c:27b8:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:27bc::,2001:67c:27bc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:27c0::,2001:67c:27c0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:27c4::,2001:67c:27c4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:27c8::,2001:67c:27c8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:27cc::,2001:67c:27cc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:27d0::,2001:67c:27d0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:27d4::,2001:67c:27d4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:27d8::,2001:67c:27d8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:27dc::,2001:67c:27dc:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:27e0::,2001:67c:27e0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:27e4::,2001:67c:27e4:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:27e8::,2001:67c:27e8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:27ec::,2001:67c:27ec:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:27f0::,2001:67c:27f0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:27f4::,2001:67c:27f4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:27f8::,2001:67c:27f8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:27fc::,2001:67c:27fc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2800::,2001:67c:2800:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2804::,2001:67c:2804:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2808::,2001:67c:2808:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:280c::,2001:67c:280c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2810::,2001:67c:2810:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2818::,2001:67c:2818:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:281c::,2001:67c:281c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2820::,2001:67c:2820:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2824::,2001:67c:2824:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2828::,2001:67c:2828:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:282c::,2001:67c:282c:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2830::,2001:67c:2830:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2834::,2001:67c:2834:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2838::,2001:67c:2838:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:283c::,2001:67c:283c:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:2840::,2001:67c:2840:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:2844::,2001:67c:2844:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2848::,2001:67c:2848:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:284c::,2001:67c:284c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2850::,2001:67c:2850:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2854::,2001:67c:2854:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2858::,2001:67c:2858:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:285c::,2001:67c:285c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2860::,2001:67c:2860:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2864::,2001:67c:2864:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2868::,2001:67c:2868:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:286c::,2001:67c:286c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2870::,2001:67c:2870:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2874::,2001:67c:2874:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2878::,2001:67c:2878:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:287c::,2001:67c:287c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2880::,2001:67c:2880:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2884::,2001:67c:2884:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2888::,2001:67c:2889:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2890::,2001:67c:2890:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2894::,2001:67c:2894:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2898::,2001:67c:2898:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:289c::,2001:67c:289c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:28a0::,2001:67c:28a0:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:28a4::,2001:67c:28a4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:28a8::,2001:67c:28a8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:28ac::,2001:67c:28ac:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:28b0::,2001:67c:28b0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:28b4::,2001:67c:28b4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:28b8::,2001:67c:28b8:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:28bc::,2001:67c:28bc:ffff:ffff:ffff:ffff:ffff,HU -2001:67c:28c0::,2001:67c:28c0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:28c4::,2001:67c:28c4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:28c8::,2001:67c:28c8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:28cc::,2001:67c:28cc:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:28d0::,2001:67c:28d0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:28d4::,2001:67c:28d4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:28d8::,2001:67c:28d8:ffff:ffff:ffff:ffff:ffff,SM -2001:67c:28dc::,2001:67c:28dc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:28ec::,2001:67c:28ec:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT -2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:2990::,2001:67c:2990:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2994::,2001:67c:2994:ffff:ffff:ffff:ffff:ffff,SA -2001:67c:2998::,2001:67c:2998:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:299c::,2001:67c:299c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:29a0::,2001:67c:29a0:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:29a4::,2001:67c:29a4:ffff:ffff:ffff:ffff:ffff,LT -2001:67c:29a8::,2001:67c:29a8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:29ac::,2001:67c:29ac:ffff:ffff:ffff:ffff:ffff,CY -2001:67c:29b0::,2001:67c:29b1:ffff:ffff:ffff:ffff:ffff,CY -2001:67c:29b8::,2001:67c:29b8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:29bc::,2001:67c:29bc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:29c0::,2001:67c:29c1:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:29c8::,2001:67c:29c8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:29cc::,2001:67c:29cc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:29d0::,2001:67c:29d0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:29d4::,2001:67c:29d4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:29d8::,2001:67c:29d8:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:29dc::,2001:67c:29dc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:29e0::,2001:67c:29e0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:29e4::,2001:67c:29e4:ffff:ffff:ffff:ffff:ffff,US -2001:67c:29e8::,2001:67c:29e8:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:29ec::,2001:67c:29ec:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:29f0::,2001:67c:29f0:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:29f4::,2001:67c:29f4:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:29f8::,2001:67c:29f8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:29fc::,2001:67c:29fc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2a00::,2001:67c:2a00:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2a04::,2001:67c:2a04:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2a08::,2001:67c:2a08:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2a0c::,2001:67c:2a0c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a14::,2001:67c:2a14:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a18::,2001:67c:2a18:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2a1c::,2001:67c:2a1c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a20::,2001:67c:2a20:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2a24::,2001:67c:2a24:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2a28::,2001:67c:2a28:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2a2c::,2001:67c:2a2c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2a30::,2001:67c:2a30:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a34::,2001:67c:2a34:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a38::,2001:67c:2a38:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2a3c::,2001:67c:2a3c:ffff:ffff:ffff:ffff:ffff,ES -2001:67c:2a40::,2001:67c:2a40:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2a44::,2001:67c:2a44:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2a48::,2001:67c:2a48:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2a4c::,2001:67c:2a4c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2a50::,2001:67c:2a50:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2a54::,2001:67c:2a54:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a58::,2001:67c:2a58:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2a5c::,2001:67c:2a5c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2a60::,2001:67c:2a60:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2a64::,2001:67c:2a64:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2a68::,2001:67c:2a68:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2a6c::,2001:67c:2a6c:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:2a70::,2001:67c:2a70:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2a74::,2001:67c:2a74:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2a78::,2001:67c:2a78:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2a7c::,2001:67c:2a7c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2a80::,2001:67c:2a80:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2a84::,2001:67c:2a84:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2a88::,2001:67c:2a88:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:2a8c::,2001:67c:2a8c:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2a90::,2001:67c:2a90:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2a94::,2001:67c:2a94:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2a98::,2001:67c:2a98:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2a9c::,2001:67c:2a9c:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2aa0::,2001:67c:2aa0:ffff:ffff:ffff:ffff:ffff,LU -2001:67c:2aa4::,2001:67c:2aa4:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2aa8::,2001:67c:2aa8:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2aac::,2001:67c:2aac:ffff:ffff:ffff:ffff:ffff,IS -2001:67c:2ab0::,2001:67c:2ab0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ab4::,2001:67c:2ab4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2ab8::,2001:67c:2ab8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2abc::,2001:67c:2abc:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2ac0::,2001:67c:2ac0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2ac4::,2001:67c:2ac4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ac8::,2001:67c:2ac8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2acc::,2001:67c:2acc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ad0::,2001:67c:2ad0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2ad4::,2001:67c:2ad4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ad8::,2001:67c:2ad8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2adc::,2001:67c:2adc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ae0::,2001:67c:2ae0:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2ae4::,2001:67c:2ae4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ae8::,2001:67c:2ae8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2af8::,2001:67c:2af8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2b08::,2001:67c:2b08:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b28::,2001:67c:2b28:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2b2c::,2001:67c:2b2c:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2b30::,2001:67c:2b30:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b34::,2001:67c:2b34:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b38::,2001:67c:2b38:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2b3c::,2001:67c:2b3c:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2b40::,2001:67c:2b40:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2b44::,2001:67c:2b44:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2b48::,2001:67c:2b48:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b4c::,2001:67c:2b4c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2b6c::,2001:67c:2b6c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR -2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2b90::,2001:67c:2b90:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2b94::,2001:67c:2b94:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2b98::,2001:67c:2b98:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2b9c::,2001:67c:2b9c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ba0::,2001:67c:2ba0:ffff:ffff:ffff:ffff:ffff,TR -2001:67c:2ba4::,2001:67c:2ba4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ba8::,2001:67c:2ba8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2bac::,2001:67c:2bac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2bb0::,2001:67c:2bb0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2bb4::,2001:67c:2bb4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2bb8::,2001:67c:2bb8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2bbc::,2001:67c:2bbc:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2bc0::,2001:67c:2bc0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bc4::,2001:67c:2bc4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bc8::,2001:67c:2bc8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2bcc::,2001:67c:2bcc:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2bf8::,2001:67c:2bf8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bfc::,2001:67c:2bfc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c00::,2001:67c:2c00:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2c04::,2001:67c:2c04:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c08::,2001:67c:2c08:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c0c::,2001:67c:2c0c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c10::,2001:67c:2c10:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c14::,2001:67c:2c14:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c18::,2001:67c:2c18:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c1c::,2001:67c:2c1c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2c20::,2001:67c:2c20:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c24::,2001:67c:2c24:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2c28::,2001:67c:2c28:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c2c::,2001:67c:2c2c:ffff:ffff:ffff:ffff:ffff,HU -2001:67c:2c30::,2001:67c:2c30:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c34::,2001:67c:2c34:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c38::,2001:67c:2c38:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c3c::,2001:67c:2c3c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c40::,2001:67c:2c40:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c44::,2001:67c:2c44:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2c48::,2001:67c:2c48:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2c4c::,2001:67c:2c4c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c50::,2001:67c:2c50:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c54::,2001:67c:2c54:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c58::,2001:67c:2c58:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c5c::,2001:67c:2c5c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2c60::,2001:67c:2c60:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2c64::,2001:67c:2c64:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2c68::,2001:67c:2c68:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2c6c::,2001:67c:2c6c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2c70::,2001:67c:2c70:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c74::,2001:67c:2c74:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c78::,2001:67c:2c78:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c7c::,2001:67c:2c7c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2c80::,2001:67c:2c80:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2c84::,2001:67c:2c84:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2c88::,2001:67c:2c89:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2c90::,2001:67c:2c93:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2ca0::,2001:67c:2ca7:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2cc0::,2001:67c:2cc0:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2cc4::,2001:67c:2cc4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2cc8::,2001:67c:2cc8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2ccc::,2001:67c:2ccc:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2cd0::,2001:67c:2cd0:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2cd4::,2001:67c:2cd4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2cd8::,2001:67c:2cd8:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2cdc::,2001:67c:2cdc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ce0::,2001:67c:2ce0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2ce4::,2001:67c:2ce4:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2ce8::,2001:67c:2ce8:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2cec::,2001:67c:2cec:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2cf0::,2001:67c:2cf0:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2cf4::,2001:67c:2cf4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2cf8::,2001:67c:2cf8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2cfc::,2001:67c:2cfc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2d04::,2001:67c:2d04:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2d08::,2001:67c:2d08:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d0c::,2001:67c:2d0c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d10::,2001:67c:2d10:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2d14::,2001:67c:2d14:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2d18::,2001:67c:2d19:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d20::,2001:67c:2d20:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2d24::,2001:67c:2d24:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2d28::,2001:67c:2d28:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d2c::,2001:67c:2d2c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2d30::,2001:67c:2d30:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2d34::,2001:67c:2d34:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2d38::,2001:67c:2d38:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2d3c::,2001:67c:2d3c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2d40::,2001:67c:2d40:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2d44::,2001:67c:2d44:ffff:ffff:ffff:ffff:ffff,PT -2001:67c:2d48::,2001:67c:2d48:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2d4c::,2001:67c:2d4c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2d50::,2001:67c:2d50:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d54::,2001:67c:2d54:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2d58::,2001:67c:2d58:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2d5c::,2001:67c:2d5c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d60::,2001:67c:2d60:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2d64::,2001:67c:2d64:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2d68::,2001:67c:2d68:ffff:ffff:ffff:ffff:ffff,NO -2001:67c:2d6c::,2001:67c:2d6c:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2d70::,2001:67c:2d70:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2d74::,2001:67c:2d74:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2d78::,2001:67c:2d78:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2d7c::,2001:67c:2d7c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2d80::,2001:67c:2d80:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d84::,2001:67c:2d84:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2d88::,2001:67c:2d88:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2d8c::,2001:67c:2d8c:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2d90::,2001:67c:2d90:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2d94::,2001:67c:2d94:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2d98::,2001:67c:2d98:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2d9c::,2001:67c:2d9c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2da0::,2001:67c:2da0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2da4::,2001:67c:2da4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2da8::,2001:67c:2da8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2dac::,2001:67c:2dac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2db0::,2001:67c:2db0:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:2db4::,2001:67c:2db4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2db8::,2001:67c:2db8:ffff:ffff:ffff:ffff:ffff,MD -2001:67c:2dbc::,2001:67c:2dbc:ffff:ffff:ffff:ffff:ffff,IL -2001:67c:2dc0::,2001:67c:2dc0:ffff:ffff:ffff:ffff:ffff,LI -2001:67c:2dc4::,2001:67c:2dc4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2dc8::,2001:67c:2dc8:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2dcc::,2001:67c:2dcc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2dd0::,2001:67c:2dd0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2dd4::,2001:67c:2dd4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2dd8::,2001:67c:2dd8:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2ddc::,2001:67c:2ddc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2de0::,2001:67c:2de0:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2de4::,2001:67c:2de4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2de8::,2001:67c:2de8:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2dec::,2001:67c:2dec:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2df0::,2001:67c:2df0:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2df4::,2001:67c:2df4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2df8::,2001:67c:2df8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2dfc::,2001:67c:2dfc:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2e00::,2001:67c:2e00:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2e04::,2001:67c:2e04:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e08::,2001:67c:2e08:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2e0c::,2001:67c:2e0c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2e10::,2001:67c:2e10:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2e14::,2001:67c:2e14:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2e18::,2001:67c:2e18:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e1c::,2001:67c:2e1c:ffff:ffff:ffff:ffff:ffff,BE -2001:67c:2e20::,2001:67c:2e20:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2e24::,2001:67c:2e24:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e28::,2001:67c:2e28:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e2c::,2001:67c:2e2c:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2e30::,2001:67c:2e30:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2e34::,2001:67c:2e34:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2e38::,2001:67c:2e38:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2e3c::,2001:67c:2e3c:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2e40::,2001:67c:2e40:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2e44::,2001:67c:2e44:ffff:ffff:ffff:ffff:ffff,SI -2001:67c:2e48::,2001:67c:2e48:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2e4c::,2001:67c:2e4c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2e50::,2001:67c:2e50:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2e54::,2001:67c:2e54:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2e58::,2001:67c:2e58:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2e5c::,2001:67c:2e5c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2e60::,2001:67c:2e60:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e64::,2001:67c:2e64:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2e68::,2001:67c:2e69:ffff:ffff:ffff:ffff:ffff,FR -2001:67c:2e70::,2001:67c:2e70:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2e74::,2001:67c:2e74:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2e78::,2001:67c:2e78:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2e7c::,2001:67c:2e7c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2e80::,2001:67c:2e80:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2e84::,2001:67c:2e84:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2e88::,2001:67c:2e88:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2e8c::,2001:67c:2e8c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2e90::,2001:67c:2e90:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2e94::,2001:67c:2e94:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2e98::,2001:67c:2e98:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2e9c::,2001:67c:2e9c:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ea0::,2001:67c:2ea0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ea4::,2001:67c:2ea4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ea8::,2001:67c:2ea8:ffff:ffff:ffff:ffff:ffff,LV -2001:67c:2eac::,2001:67c:2eac:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2eb0::,2001:67c:2eb0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2eb4::,2001:67c:2eb4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2eb8::,2001:67c:2eb8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ebc::,2001:67c:2ebc:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ec0::,2001:67c:2ec0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ec4::,2001:67c:2ec4:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:2ec8::,2001:67c:2ec8:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ecc::,2001:67c:2ecc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ed0::,2001:67c:2ed0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ed4::,2001:67c:2ed4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2ed8::,2001:67c:2ed8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2edc::,2001:67c:2edc:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2ee0::,2001:67c:2ee0:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2ee4::,2001:67c:2ee4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2ee8::,2001:67c:2ee8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2eec::,2001:67c:2eec:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2ef0::,2001:67c:2ef0:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2ef4::,2001:67c:2ef4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2ef8::,2001:67c:2ef8:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2efc::,2001:67c:2efc:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2f00::,2001:67c:2f00:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2f04::,2001:67c:2f04:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2f08::,2001:67c:2f08:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2f0c::,2001:67c:2f0c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f10::,2001:67c:2f10:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f14::,2001:67c:2f14:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f18::,2001:67c:2f18:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2f1c::,2001:67c:2f1c:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2f20::,2001:67c:2f20:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f24::,2001:67c:2f24:ffff:ffff:ffff:ffff:ffff,HR -2001:67c:2f28::,2001:67c:2f28:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2f30::,2001:67c:2f30:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f34::,2001:67c:2f34:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2f38::,2001:67c:2f38:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2f3c::,2001:67c:2f3c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f40::,2001:67c:2f40:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2f44::,2001:67c:2f44:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f48::,2001:67c:2f48:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2f4c::,2001:67c:2f4c:ffff:ffff:ffff:ffff:ffff,BG -2001:67c:2f50::,2001:67c:2f50:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2f54::,2001:67c:2f54:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2f58::,2001:67c:2f58:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2f5c::,2001:67c:2f5c:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:2f60::,2001:67c:2f60:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f64::,2001:67c:2f64:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2f68::,2001:67c:2f68:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2f6c::,2001:67c:2f6c:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2f70::,2001:67c:2f70:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2f74::,2001:67c:2f74:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2f78::,2001:67c:2f78:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f7c::,2001:67c:2f7c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2f80::,2001:67c:2f80:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2f84::,2001:67c:2f84:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f88::,2001:67c:2f88:ffff:ffff:ffff:ffff:ffff,ZA -2001:67c:2f8c::,2001:67c:2f8c:ffff:ffff:ffff:ffff:ffff,IT -2001:67c:2f90::,2001:67c:2f90:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2f94::,2001:67c:2f94:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2f98::,2001:67c:2f98:ffff:ffff:ffff:ffff:ffff,CH -2001:67c:2f9c::,2001:67c:2f9c:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:2fa0::,2001:67c:2fa0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2fa4::,2001:67c:2fa4:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fa8::,2001:67c:2fa8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fac::,2001:67c:2fac:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2fb0::,2001:67c:2fb0:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fb4::,2001:67c:2fb4:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:2fb8::,2001:67c:2fb8:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2fbc::,2001:67c:2fbc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fc0::,2001:67c:2fc0:ffff:ffff:ffff:ffff:ffff,FI -2001:67c:2fc4::,2001:67c:2fc4:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2fc8::,2001:67c:2fc8:ffff:ffff:ffff:ffff:ffff,UA -2001:67c:2fcc::,2001:67c:2fcc:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2fd0::,2001:67c:2fd0:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2fd4::,2001:67c:2fd4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2fd8::,2001:67c:2fd8:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fdc::,2001:67c:2fdc:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2fe4::,2001:67c:2fe4:ffff:ffff:ffff:ffff:ffff,RU -2001:67c:2fe8::,2001:67c:2fe8:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2fec::,2001:67c:2fec:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:2ff0::,2001:67c:2ff0:ffff:ffff:ffff:ffff:ffff,AT -2001:67c:2ff4::,2001:67c:2ff4:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2ff8::,2001:67c:2ff8:ffff:ffff:ffff:ffff:ffff,GB -2001:67c:2ffc::,2001:67c:2ffc:ffff:ffff:ffff:ffff:ffff,PL -2001:680::,2001:680:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:688::,2001:688:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:690::,2001:697:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:6a0::,2001:6a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:6a8::,2001:6af:ffff:ffff:ffff:ffff:ffff:ffff,BE -2001:6b0::,2001:6b0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:6b8::,2001:6b8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:6c8::,2001:6cf:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:6d0::,2001:6d0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:6d8::,2001:6df:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:6e0::,2001:6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:6e8::,2001:6ef:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:6f0::,2001:6f7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:6f8::,2001:6f8:2ff:ffff:ffff:ffff:ffff:ffff,GB -2001:6f8:300::,2001:6f8:3ff:ffff:ffff:ffff:ffff:ffff,BE -2001:6f8:400::,2001:6f8:900:7fff:ffff:ffff:ffff:ffff,GB -2001:6f8:900:8000::,2001:6f8:900:ffff:ffff:ffff:ffff:ffff,DE -2001:6f8:901::,2001:6f8:13ff:ffff:ffff:ffff:ffff:ffff,GB -2001:6f8:1400::,2001:6f8:14ff:ffff:ffff:ffff:ffff:ffff,BE -2001:6f8:1500::,2001:6f8:1d2c:ffff:ffff:ffff:ffff:ffff,GB -2001:6f8:1d2d::,2001:6f8:1d2d:7fff:ffff:ffff:ffff:ffff,DE -2001:6f8:1d2d:8000::,2001:6f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:700::,2001:700:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:718::,2001:71f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:720::,2001:727:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:730::,2001:730:3e0b:ffff:ffff:ffff:ffff:ffff,AT -2001:730:3e0c::,2001:730:3e0c:7fff:ffff:ffff:ffff:ffff,NL -2001:730:3e0c:8000::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU -2001:748::,2001:748:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:750::,2001:750:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:758::,2001:758:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:760::,2001:760:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:768::,2001:768:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:770::,2001:777:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:778::,2001:77f:ffff:ffff:ffff:ffff:ffff:ffff,LT -2001:780::,2001:787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:788::,2001:78f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:790::,2001:790:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:798::,2001:79f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:7a0::,2001:7a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:7a8::,2001:7a8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:7b0::,2001:7b0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:7b8::,2001:7bf:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:7c0::,2001:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:7c8::,2001:7c8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:7d0::,2001:7d0:833c:7fff:ffff:ffff:ffff:ffff,EE -2001:7d0:833c:8000::,2001:7d0:833c:ffff:ffff:ffff:ffff:ffff,CA -2001:7d0:833d::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:7e8::,2001:7e8:c03f:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:c040::,2001:7e8:c040:7fff:ffff:ffff:ffff:ffff,FR -2001:7e8:c040:8000::,2001:7e8:c68a:7fff:ffff:ffff:ffff:ffff,LU -2001:7e8:c68a:8000::,2001:7e8:c68a:ffff:ffff:ffff:ffff:ffff,BE -2001:7e8:c68b::,2001:7e8:c9b7:7fff:ffff:ffff:ffff:ffff,LU -2001:7e8:c9b7:8000::,2001:7e8:c9b7:ffff:ffff:ffff:ffff:ffff,DE -2001:7e8:c9b8::,2001:7e8:cc63:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:cc64::,2001:7e8:cc64:7fff:ffff:ffff:ffff:ffff,FR -2001:7e8:cc64:8000::,2001:7e8:d04f:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:d050::,2001:7e8:d050:7fff:ffff:ffff:ffff:ffff,DE -2001:7e8:d050:8000::,2001:7e8:d2db:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:d2dc::,2001:7e8:d2dc:7fff:ffff:ffff:ffff:ffff,FR -2001:7e8:d2dc:8000::,2001:7e8:d2e4:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:d2e5::,2001:7e8:d2e5:7fff:ffff:ffff:ffff:ffff,FR -2001:7e8:d2e5:8000::,2001:7e8:d302:7fff:ffff:ffff:ffff:ffff,LU -2001:7e8:d302:8000::,2001:7e8:d302:ffff:ffff:ffff:ffff:ffff,DE -2001:7e8:d303::,2001:7e8:d361:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:d362::,2001:7e8:d362:7fff:ffff:ffff:ffff:ffff,BE -2001:7e8:d362:8000::,2001:7e8:d4ae:ffff:ffff:ffff:ffff:ffff,LU -2001:7e8:d4af::,2001:7e8:d4af:7fff:ffff:ffff:ffff:ffff,DE -2001:7e8:d4af:8000::,2001:7e8:d4e0:7fff:ffff:ffff:ffff:ffff,LU -2001:7e8:d4e0:8000::,2001:7e8:d4e0:ffff:ffff:ffff:ffff:ffff,FR -2001:7e8:d4e1::,2001:7ef:ffff:ffff:ffff:ffff:ffff:ffff,LU -2001:7f0:1::,2001:7f0:1:7fff:ffff:ffff:ffff:ffff,DE -2001:7f0:3003::,2001:7f0:3003:7fff:ffff:ffff:ffff:ffff,DE -2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:3::,2001:7f8:4:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:5::,2001:7f8:5:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:6::,2001:7f8:6:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:7::,2001:7f8:7:ffff:ffff:ffff:ffff:ffff,FI -2001:7f8:8::,2001:7f8:8:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:9::,2001:7f8:9:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:a::,2001:7f8:a:ffff:ffff:ffff:ffff:ffff,PT -2001:7f8:b::,2001:7f8:b:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:c::,2001:7f8:c:ffff:ffff:ffff:ffff:ffff,CH -2001:7f8:d::,2001:7f8:d:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:e::,2001:7f8:e:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:f::,2001:7f8:f:ffff:ffff:ffff:ffff:ffff,ES -2001:7f8:10::,2001:7f8:10:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:11::,2001:7f8:11:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:12::,2001:7f8:12:ffff:ffff:ffff:ffff:ffff,NO -2001:7f8:13::,2001:7f8:13:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:14::,2001:7f8:14:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:15::,2001:7f8:15:ffff:ffff:ffff:ffff:ffff,EE -2001:7f8:16::,2001:7f8:16:ffff:ffff:ffff:ffff:ffff,LV -2001:7f8:17::,2001:7f8:17:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:18::,2001:7f8:18:ffff:ffff:ffff:ffff:ffff,IE -2001:7f8:19::,2001:7f8:19:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:1a::,2001:7f8:1a:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:1b::,2001:7f8:1b:ffff:ffff:ffff:ffff:ffff,BE -2001:7f8:1c::,2001:7f8:1c:ffff:ffff:ffff:ffff:ffff,CH -2001:7f8:1d::,2001:7f8:1d:ffff:ffff:ffff:ffff:ffff,FI -2001:7f8:1e::,2001:7f8:1e:ffff:ffff:ffff:ffff:ffff,RS -2001:7f8:1f::,2001:7f8:1f:ffff:ffff:ffff:ffff:ffff,DK -2001:7f8:20::,2001:7f8:20:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:21::,2001:7f8:21:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:22::,2001:7f8:22:ffff:ffff:ffff:ffff:ffff,ME -2001:7f8:23::,2001:7f8:23:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:24::,2001:7f8:24:ffff:ffff:ffff:ffff:ffff,CH -2001:7f8:25::,2001:7f8:25:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:26::,2001:7f8:26:ffff:ffff:ffff:ffff:ffff,BE -2001:7f8:27::,2001:7f8:27:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:28::,2001:7f8:28:ffff:ffff:ffff:ffff:ffff,HR -2001:7f8:29::,2001:7f8:29:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:2a::,2001:7f8:2a:ffff:ffff:ffff:ffff:ffff,ES -2001:7f8:2b::,2001:7f8:2c:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:2d::,2001:7f8:2d:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:2e::,2001:7f8:2e:ffff:ffff:ffff:ffff:ffff,MD -2001:7f8:2f::,2001:7f8:2f:ffff:ffff:ffff:ffff:ffff,SK -2001:7f8:30::,2001:7f8:30:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:31::,2001:7f8:31:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:32::,2001:7f8:32:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:33::,2001:7f8:33:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:34::,2001:7f8:34:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:35::,2001:7f8:35:ffff:ffff:ffff:ffff:ffff,HU -2001:7f8:36::,2001:7f8:36:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:37::,2001:7f8:38:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:39::,2001:7f8:39:ffff:ffff:ffff:ffff:ffff,EE -2001:7f8:3a::,2001:7f8:3a:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:3b::,2001:7f8:3b:ffff:ffff:ffff:ffff:ffff,IL -2001:7f8:3d::,2001:7f8:3d:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:3e::,2001:7f8:3e:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:3f::,2001:7f8:3f:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:40::,2001:7f8:40:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:41::,2001:7f8:41:ffff:ffff:ffff:ffff:ffff,NO -2001:7f8:42::,2001:7f8:42:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:43::,2001:7f8:43:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:44::,2001:7f8:44:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:45::,2001:7f8:45:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:46::,2001:7f8:46:ffff:ffff:ffff:ffff:ffff,SI -2001:7f8:47::,2001:7f8:47:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:48::,2001:7f8:48:ffff:ffff:ffff:ffff:ffff,IS -2001:7f8:4a::,2001:7f8:4a:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:4b::,2001:7f8:4b:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:4c::,2001:7f8:4c:ffff:ffff:ffff:ffff:ffff,LU -2001:7f8:4d::,2001:7f8:4d:ffff:ffff:ffff:ffff:ffff,IE -2001:7f8:4e::,2001:7f8:4e:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:4f::,2001:7f8:4f:ffff:ffff:ffff:ffff:ffff,BH -2001:7f8:50::,2001:7f8:50:ffff:ffff:ffff:ffff:ffff,EE -2001:7f8:51::,2001:7f8:51:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:52::,2001:7f8:52:ffff:ffff:ffff:ffff:ffff,LB -2001:7f8:53::,2001:7f8:53:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:54::,2001:7f8:54:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:55::,2001:7f8:55:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:56::,2001:7f8:56:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:57::,2001:7f8:57:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:58::,2001:7f8:58:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:59::,2001:7f8:59:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:5a::,2001:7f8:5a:ffff:ffff:ffff:ffff:ffff,BY -2001:7f8:5b::,2001:7f8:5b:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:5c::,2001:7f8:5c:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:5d::,2001:7f8:5d:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:5e::,2001:7f8:5e:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:5f::,2001:7f8:5f:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:60::,2001:7f8:60:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:61::,2001:7f8:61:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:62::,2001:7f8:62:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:63::,2001:7f8:63:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:64::,2001:7f8:64:ffff:ffff:ffff:ffff:ffff,RO -2001:7f8:65::,2001:7f8:65:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:66::,2001:7f8:66:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:67::,2001:7f8:67:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:68::,2001:7f8:68:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:69::,2001:7f8:69:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:6a::,2001:7f8:6a:ffff:ffff:ffff:ffff:ffff,MD -2001:7f8:6b::,2001:7f8:6b:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:6c::,2001:7f8:6c:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:6d::,2001:7f8:6d:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:6e::,2001:7f8:6e:ffff:ffff:ffff:ffff:ffff,GR -2001:7f8:6f::,2001:7f8:70:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:71::,2001:7f8:71:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:72::,2001:7f8:72:ffff:ffff:ffff:ffff:ffff,PS -2001:7f8:73::,2001:7f8:73:ffff:ffff:ffff:ffff:ffff,AE -2001:7f8:74::,2001:7f8:75:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:76::,2001:7f8:76:ffff:ffff:ffff:ffff:ffff,NO -2001:7f8:77::,2001:7f8:78:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:79::,2001:7f8:79:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:7a::,2001:7f8:7a:ffff:ffff:ffff:ffff:ffff,AE -2001:7f8:7b::,2001:7f8:7b:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:7c::,2001:7f8:7c:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:7d::,2001:7f8:7d:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:7e::,2001:7f8:7e:ffff:ffff:ffff:ffff:ffff,ES -2001:7f8:7f::,2001:7f8:7f:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:80::,2001:7f8:80:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:81::,2001:7f8:81:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:82::,2001:7f8:82:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:84::,2001:7f8:84:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:85::,2001:7f8:85:ffff:ffff:ffff:ffff:ffff,HU -2001:7f8:86::,2001:7f8:86:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:87::,2001:7f8:87:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:88::,2001:7f8:89:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:8a::,2001:7f8:8a:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:8b::,2001:7f8:8b:ffff:ffff:ffff:ffff:ffff,BY -2001:7f8:8c::,2001:7f8:8c:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:8d::,2001:7f8:8d:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:8e::,2001:7f8:8e:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:8f::,2001:7f8:8f:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:90::,2001:7f8:90:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:91::,2001:7f8:91:ffff:ffff:ffff:ffff:ffff,SK -2001:7f8:92::,2001:7f8:92:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:93::,2001:7f8:93:ffff:ffff:ffff:ffff:ffff,AT -2001:7f8:94::,2001:7f8:94:ffff:ffff:ffff:ffff:ffff,AM -2001:7f8:95::,2001:7f8:95:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:96::,2001:7f8:96:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:97::,2001:7f8:97:ffff:ffff:ffff:ffff:ffff,RO -2001:7f8:98::,2001:7f8:98:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:99::,2001:7f8:99:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:9a::,2001:7f8:9a:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:9b::,2001:7f8:9b:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:9c::,2001:7f8:9e:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:9f::,2001:7f8:9f:ffff:ffff:ffff:ffff:ffff,BG -2001:7f8:a0::,2001:7f8:a0:ffff:ffff:ffff:ffff:ffff,ES -2001:7f8:a1::,2001:7f8:a1:ffff:ffff:ffff:ffff:ffff,RS -2001:7f8:a2::,2001:7f8:a2:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:a3::,2001:7f8:a3:ffff:ffff:ffff:ffff:ffff,LB -2001:7f8:a4::,2001:7f8:a4:ffff:ffff:ffff:ffff:ffff,AL -2001:7f8:a5::,2001:7f8:a5:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:a6::,2001:7f8:a6:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:a7::,2001:7f8:a7:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:a8::,2001:7f8:a8:ffff:ffff:ffff:ffff:ffff,IR -2001:7f8:a9::,2001:7f8:a9:ffff:ffff:ffff:ffff:ffff,MD -2001:7f8:aa::,2001:7f8:aa:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:ab::,2001:7f8:ab:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:ac::,2001:7f8:ac:ffff:ffff:ffff:ffff:ffff,RU -2001:7f8:ad::,2001:7f8:ad:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:ae::,2001:7f8:ae:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:af::,2001:7f8:af:ffff:ffff:ffff:ffff:ffff,FI -2001:7f8:b0::,2001:7f8:b0:ffff:ffff:ffff:ffff:ffff,SE -2001:7f8:b1::,2001:7f8:b1:ffff:ffff:ffff:ffff:ffff,FR -2001:7f8:b2::,2001:7f8:b2:ffff:ffff:ffff:ffff:ffff,CZ -2001:7f8:b3::,2001:7f8:b3:ffff:ffff:ffff:ffff:ffff,PL -2001:7f8:b4::,2001:7f8:b4:ffff:ffff:ffff:ffff:ffff,LT -2001:7f8:b5::,2001:7f8:b5:ffff:ffff:ffff:ffff:ffff,CH -2001:7f8:b6::,2001:7f8:b7:ffff:ffff:ffff:ffff:ffff,NL -2001:7f8:b8::,2001:7f8:b8:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:b9::,2001:7f8:b9:ffff:ffff:ffff:ffff:ffff,IT -2001:7f8:ba::,2001:7f8:ba:ffff:ffff:ffff:ffff:ffff,UA -2001:7f8:bb::,2001:7f8:bb:ffff:ffff:ffff:ffff:ffff,AL -2001:7f8:bc::,2001:7f8:bc:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:bd::,2001:7f8:bd:ffff:ffff:ffff:ffff:ffff,DE -2001:7f8:be::,2001:7f8:be:ffff:ffff:ffff:ffff:ffff,GB -2001:7f8:bf::,2001:7f8:bf:ffff:ffff:ffff:ffff:ffff,CH -2001:7f8:c0::,2001:7f8:c0:ffff:ffff:ffff:ffff:ffff,IT -2001:7f9:4::,2001:7f9:4:ffff:ffff:ffff:ffff:ffff,AL -2001:7f9:8::,2001:7f9:8:ffff:ffff:ffff:ffff:ffff,AM -2001:7f9:c::,2001:7f9:c:ffff:ffff:ffff:ffff:ffff,PL -2001:7fa:0:1::,2001:7fa::1:ffff:ffff:ffff:ffff,HK -2001:7fa:0:2::,2001:7fa::2:ffff:ffff:ffff:ffff,KR -2001:7fa:0:3::,2001:7fa::3:ffff:ffff:ffff:ffff,JP -2001:7fa:1::,2001:7fa:1:ffff:ffff:ffff:ffff:ffff,TW -2001:7fa:2::,2001:7fa:2:ffff:ffff:ffff:ffff:ffff,ID -2001:7fa:3::,2001:7fa:4:ffff:ffff:ffff:ffff:ffff,NZ -2001:7fa:5::,2001:7fa:5:ffff:ffff:ffff:ffff:ffff,CN -2001:7fa:6::,2001:7fa:6:ffff:ffff:ffff:ffff:ffff,VN -2001:7fa:7::,2001:7fa:7:ffff:ffff:ffff:ffff:ffff,JP -2001:7fa:8::,2001:7fa:8:ffff:ffff:ffff:ffff:ffff,KR -2001:7fa:9::,2001:7fa:e:ffff:ffff:ffff:ffff:ffff,AU -2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID -2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN -2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU -2001:7fc::,2001:7fc:1:ffff:ffff:ffff:ffff:ffff,RU -2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:808::,2001:80f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:818::,2001:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:820::,2001:820:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:828::,2001:828:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:830::,2001:830:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:838::,2001:83f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:840::,2001:847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:848::,2001:848:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:850::,2001:853:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:858::,2001:858:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:860::,2001:867:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:868::,2001:86f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:870::,2001:871:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:878::,2001:87f:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:880::,2001:880:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:888::,2001:88f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:890::,2001:891:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:898::,2001:89f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:8a0::,2001:8a0:5225:7fff:ffff:ffff:ffff:ffff,PT -2001:8a0:5225:8000::,2001:8a0:5225:ffff:ffff:ffff:ffff:ffff,GB -2001:8a0:5226::,2001:8a7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:8a8::,2001:8a8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:8b0::,2001:8b0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:8b8::,2001:8bf:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:8c0::,2001:8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:8c8::,2001:8c8:ffff:ffff:ffff:ffff:ffff:ffff,RS -2001:8d0::,2001:8d7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:8d8::,2001:8d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:8e0::,2001:8e7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:8f0::,2001:8f1:ffff:ffff:ffff:ffff:ffff:ffff,GR -2001:8f2::,2001:8f3:ffff:ffff:ffff:ffff:ffff:ffff,CY -2001:8f8::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,AE -2001:900::,2001:900:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:908::,2001:90f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:910::,2001:917:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:918::,2001:91f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:920::,2001:920:1804:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1805::,2001:920:1805:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1805:8000::,2001:920:1840:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1841::,2001:920:1841:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1841:8000::,2001:920:1845:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1846::,2001:920:1846:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1846:8000::,2001:920:186a:ffff:ffff:ffff:ffff:ffff,GB -2001:920:186b::,2001:920:186b:ffff:ffff:ffff:ffff:ffff,DE -2001:920:186c::,2001:920:187f:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1880::,2001:920:1880:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1880:8000::,2001:920:1881:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1882::,2001:920:1882:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1882:8000::,2001:920:18a0:ffff:ffff:ffff:ffff:ffff,GB -2001:920:18a1::,2001:920:18a1:7fff:ffff:ffff:ffff:ffff,DE -2001:920:18a1:8000::,2001:920:18ad:ffff:ffff:ffff:ffff:ffff,GB -2001:920:18ae::,2001:920:18ae:7fff:ffff:ffff:ffff:ffff,DE -2001:920:18ae:8000::,2001:920:18c0:ffff:ffff:ffff:ffff:ffff,GB -2001:920:18c1::,2001:920:18c1:7fff:ffff:ffff:ffff:ffff,DE -2001:920:18c1:8000::,2001:920:18ef:ffff:ffff:ffff:ffff:ffff,GB -2001:920:18f0::,2001:920:18f0:7fff:ffff:ffff:ffff:ffff,DE -2001:920:18f0:8000::,2001:920:1907:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1908::,2001:920:1908:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1908:8000::,2001:920:1940:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1941::,2001:920:1941:7fff:ffff:ffff:ffff:ffff,DE -2001:920:1941:8000::,2001:920:1960:ffff:ffff:ffff:ffff:ffff,GB -2001:920:1961::,2001:920:1961:ffff:ffff:ffff:ffff:ffff,DE -2001:920:1962::,2001:920:4008:ffff:ffff:ffff:ffff:ffff,GB -2001:920:4009::,2001:920:4009:7fff:ffff:ffff:ffff:ffff,BE -2001:920:4009:8000::,2001:920:5843:7fff:ffff:ffff:ffff:ffff,GB -2001:920:5843:8000::,2001:920:5843:ffff:ffff:ffff:ffff:ffff,ES -2001:920:5844::,2001:920:5845:ffff:ffff:ffff:ffff:ffff,GB -2001:920:5846::,2001:920:5846:ffff:ffff:ffff:ffff:ffff,ES -2001:920:5847::,2001:920:584d:ffff:ffff:ffff:ffff:ffff,GB -2001:920:584e::,2001:920:584e:7fff:ffff:ffff:ffff:ffff,ES -2001:920:584e:8000::,2001:927:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:928::,2001:928:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:930::,2001:930:ffff:ffff:ffff:ffff:ffff:ffff,TR -2001:938::,2001:938:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:940::,2001:940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:948::,2001:948:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:950::,2001:950:ffff:ffff:ffff:ffff:ffff:ffff,HU -2001:958::,2001:958:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:960::,2001:960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:968::,2001:968:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:978::,2001:978:2:39::5:1,DE -2001:978:2:39::5:2,2001:978:2:39::5:2,SI -2001:978:2:39::5:3,2001:978:22ff:ffff:ffff:ffff:ffff:ffff,DE -2001:978:2300::,2001:978:2300:7fff:ffff:ffff:ffff:ffff,GB -2001:978:2300:8000::,2001:978:2304:ffff:ffff:ffff:ffff:ffff,DE -2001:978:2305::,2001:978:2305:ffff:ffff:ffff:ffff:ffff,US -2001:978:2306::,2001:978:29ff:ffff:ffff:ffff:ffff:ffff,DE -2001:978:2a00::,2001:978:2a00:ffff:ffff:ffff:ffff:ffff,IE -2001:978:2a01::,2001:978:33ff:ffff:ffff:ffff:ffff:ffff,DE -2001:978:3400::,2001:978:3400:ffff:ffff:ffff:ffff:ffff,US -2001:978:3401::,2001:978:3500:7fff:ffff:ffff:ffff:ffff,DE -2001:978:3500:8000::,2001:978:3500:ffff:ffff:ffff:ffff:ffff,PL -2001:978:3501::,2001:978:3bff:ffff:ffff:ffff:ffff:ffff,DE -2001:978:3c00::,2001:978:3c00:7fff:ffff:ffff:ffff:ffff,NL -2001:978:3c00:8000::,2001:978:3c03:ffff:ffff:ffff:ffff:ffff,DE -2001:978:3c04::,2001:978:3c04:7fff:ffff:ffff:ffff:ffff,NL -2001:978:3c04:8000::,2001:978:73ff:ffff:ffff:ffff:ffff:ffff,DE -2001:978:7400::,2001:978:7400:ffff:ffff:ffff:ffff:ffff,FI -2001:978:7401::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:980::,2001:981:6566:ffff:ffff:ffff:ffff:ffff,NL -2001:981:6567::,2001:981:6567:7fff:ffff:ffff:ffff:ffff,GB -2001:981:6567:8000::,2001:981:d262:ffff:ffff:ffff:ffff:ffff,NL -2001:981:d263::,2001:981:d263:7fff:ffff:ffff:ffff:ffff,PL -2001:981:d263:8000::,2001:984:55a9:ffff:ffff:ffff:ffff:ffff,NL -2001:984:55aa::,2001:984:55aa:7fff:ffff:ffff:ffff:ffff,PT -2001:984:55aa:8000::,2001:985:40b4:ffff:ffff:ffff:ffff:ffff,NL -2001:985:40b5::,2001:985:40b5:7fff:ffff:ffff:ffff:ffff,PL -2001:985:40b5:8000::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:998::,2001:99b:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:9a0::,2001:9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:9a8::,2001:9a8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:9b0::,2001:9b7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:9c0::,2001:9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:9c8::,2001:9cf:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:9d0::,2001:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:9d8::,2001:9d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:9e0::,2001:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:9e8::,2001:9e8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:9f0::,2001:9f7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:a00::,2001:a00:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:a08::,2001:a08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:a10::,2001:a10:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU -2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:a38::,2001:a3f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:a58::,2001:a58:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:a60::,2001:a67:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:a68::,2001:a68:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:a70::,2001:a70:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:a78::,2001:a78:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:a80::,2001:a80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:a88::,2001:a88:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:a90::,2001:a90:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:a98::,2001:a98:ffff:ffff:ffff:ffff:ffff:ffff,TR -2001:aa0::,2001:aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:aa8::,2001:ab7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:ab8::,2001:abf:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:ac0::,2001:ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:ac8::,2001:ac8:1f:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:20::,2001:ac8:20:ffff:ffff:ffff:ffff:ffff,DE -2001:ac8:21::,2001:ac8:21:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:22::,2001:ac8:22:7fff:ffff:ffff:ffff:ffff,NL -2001:ac8:22:8000::,2001:ac8:22:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:23::,2001:ac8:23:7fff:ffff:ffff:ffff:ffff,ES -2001:ac8:23:8000::,2001:ac8:23:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:24::,2001:ac8:24:ffff:ffff:ffff:ffff:ffff,IT -2001:ac8:25::,2001:ac8:25:ffff:ffff:ffff:ffff:ffff,FR -2001:ac8:26::,2001:ac8:26:ffff:ffff:ffff:ffff:ffff,HU -2001:ac8:27::,2001:ac8:27:ffff:ffff:ffff:ffff:ffff,BE -2001:ac8:28::,2001:ac8:28:ffff:ffff:ffff:ffff:ffff,CH -2001:ac8:29::,2001:ac8:29:ffff:ffff:ffff:ffff:ffff,AT -2001:ac8:2a::,2001:ac8:2f:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:30::,2001:ac8:30:ffff:ffff:ffff:ffff:ffff,BG -2001:ac8:31::,2001:ac8:32:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:33::,2001:ac8:33:ffff:ffff:ffff:ffff:ffff,CZ -2001:ac8:34::,2001:ac8:34:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:35::,2001:ac8:35:ffff:ffff:ffff:ffff:ffff,ES -2001:ac8:36::,2001:ac8:36:ffff:ffff:ffff:ffff:ffff,DE -2001:ac8:37::,2001:ac8:37:ffff:ffff:ffff:ffff:ffff,DK -2001:ac8:38::,2001:ac8:38:ffff:ffff:ffff:ffff:ffff,NO -2001:ac8:39::,2001:ac8:39:ffff:ffff:ffff:ffff:ffff,IT -2001:ac8:3a::,2001:ac8:3f:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:40::,2001:ac8:40:ffff:ffff:ffff:ffff:ffff,JP -2001:ac8:41::,2001:ac8:42:ffff:ffff:ffff:ffff:ffff,ES -2001:ac8:43::,2001:ac8:44:ffff:ffff:ffff:ffff:ffff,DE -2001:ac8:45::,2001:ac8:45:ffff:ffff:ffff:ffff:ffff,BE -2001:ac8:46::,2001:ac8:46:ffff:ffff:ffff:ffff:ffff,HU -2001:ac8:47::,2001:ac8:47:ffff:ffff:ffff:ffff:ffff,DK -2001:ac8:48::,2001:ac8:49:ffff:ffff:ffff:ffff:ffff,GB -2001:ac8:4a::,2001:ac8:4b:ffff:ffff:ffff:ffff:ffff,IT -2001:ac8:4c::,2001:ac8:4c:ffff:ffff:ffff:ffff:ffff,NO -2001:ac8:4d::,2001:ac8:4d:ffff:ffff:ffff:ffff:ffff,FR -2001:ac8:4e::,2001:ac8:4e:ffff:ffff:ffff:ffff:ffff,CZ -2001:ac8:4f::,2001:ac8:4f:ffff:ffff:ffff:ffff:ffff,BG -2001:ac8:50::,2001:ac8:50:ffff:ffff:ffff:ffff:ffff,AT -2001:ac8:51::,2001:ac8:51:ffff:ffff:ffff:ffff:ffff,CH -2001:ac8:52::,2001:ac8:52:ffff:ffff:ffff:ffff:ffff,NL -2001:ac8:53::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:ad8::,2001:ae1:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:af0::,2001:af0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:af8::,2001:af8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:b00::,2001:b07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:b08::,2001:b08:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:b10::,2001:b10:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:b18::,2001:b18:ffff:ffff:ffff:ffff:ffff:ffff,BG -2001:b20::,2001:b27:ffff:ffff:ffff:ffff:ffff:ffff,LU -2001:b28::,2001:b28:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:b30::,2001:b37:ffff:ffff:ffff:ffff:ffff:ffff,RO -2001:b40::,2001:b40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:b48::,2001:b4f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:b50::,2001:b50:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:b58::,2001:b5f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:b60::,2001:b67:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:b68::,2001:b68:ffff:ffff:ffff:ffff:ffff:ffff,HR -2001:b70::,2001:b70:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:b80::,2001:b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:b88::,2001:b88:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:b90::,2001:b90:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:b98::,2001:b9f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:ba0::,2001:ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:ba8::,2001:baf:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:bb0::,2001:bb6:355d:ffff:ffff:ffff:ffff:ffff,IE -2001:bb6:355e::,2001:bb6:355e:7fff:ffff:ffff:ffff:ffff,GB -2001:bb6:355e:8000::,2001:bb6:b215:7fff:ffff:ffff:ffff:ffff,IE -2001:bb6:b215:8000::,2001:bb6:b215:ffff:ffff:ffff:ffff:ffff,ES -2001:bb6:b216::,2001:bb7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:bb8::,2001:bb8:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:bc8::,2001:bc8:204f:ffff:ffff:ffff:ffff:ffff,FR -2001:bc8:2050::,2001:bc8:2050:7fff:ffff:ffff:ffff:ffff,DE -2001:bc8:2050:8000::,2001:bc8:3f13:7fff:ffff:ffff:ffff:ffff,FR -2001:bc8:3f13:8000::,2001:bc8:3f13:ffff:ffff:ffff:ffff:ffff,DE -2001:bc8:3f14::,2001:bc8:46ff:ffff:ffff:ffff:ffff:ffff,FR -2001:bc8:4700::,2001:bc8:4700:7fff:ffff:ffff:ffff:ffff,NL -2001:bc8:4700:8000::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:bd0::,2001:bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:be0::,2001:be7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:be8::,2001:bef:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:bf0::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:bf8::,2001:bf8:ffff:ffff:ffff:ffff:ffff:ffff,IL -2001:c00::,2001:c00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:c08::,2001:c08:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:c10::,2001:c10:ff08:ffff:ffff:ffff:ffff:ffff,SG -2001:c10:ff09::,2001:c10:ff09:7fff:ffff:ffff:ffff:ffff,TW -2001:c10:ff09:8000::,2001:c10:ffff:ffff:ffff:ffff:ffff:ffff,SG -2001:c18::,2001:c18:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:c20::,2001:c20:ffff:ffff:ffff:ffff:ffff:ffff,SG -2001:c28::,2001:c28:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c30::,2001:c30:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c38::,2001:c39:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:c40::,2001:c40:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c48::,2001:c48:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:c50::,2001:c50:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:c58::,2001:c58:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:c60::,2001:c60:ffff:ffff:ffff:ffff:ffff:ffff,PG -2001:c68::,2001:c68:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:c70::,2001:c70:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c78::,2001:c79:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:c80::,2001:c80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c90::,2001:c90:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:c98::,2001:c98:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ca0::,2001:ca0:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:ca8::,2001:ca8:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:cb0::,2001:cb0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:cb8::,2001:cb8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:cc0::,2001:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:cc8::,2001:cc9:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:cd0::,2001:cd0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:cd8::,2001:cd8:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:ce0::,2001:ce0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2001:ce8::,2001:ce8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:cf0::,2001:cf0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:cf8::,2001:cf8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d00::,2001:d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d08::,2001:d08:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:d10::,2001:d10:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:d18::,2001:d18:ffff:ffff:ffff:ffff:ffff:ffff,PH -2001:d28::,2001:d28:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d30::,2001:d30:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d38::,2001:d38:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:d40::,2001:d40:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:d48::,2001:d48:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:d50::,2001:d50:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d58::,2001:d58:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:d68::,2001:d68:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:d70::,2001:d73:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d80::,2001:d80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d88::,2001:d88:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d90::,2001:d90:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d98::,2001:d98:ffff:ffff:ffff:ffff:ffff:ffff,SG -2001:da0::,2001:da0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:da8::,2001:daa:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:db0::,2001:db0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:dc0::,2001:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:dc1::,2001:dc1:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:dc2::,2001:dc4:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:dc5::,2001:dc5:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:dc6::,2001:dc6:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:dc7::,2001:dc7:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:dc8::,2001:dc8:ffff:ffff:ffff:ffff:ffff:ffff,VN -2001:dc9::,2001:dc9:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:dca::,2001:dca:ffff:ffff:ffff:ffff:ffff:ffff,HK -2001:dcc::,2001:dcc:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:dcd::,2001:dcd:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:dce::,2001:dce:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:dd8::,2001:dd8::ffff:ffff:ffff:ffff:ffff,FJ -2001:dd8:1::,2001:dd8:1:ffff:ffff:ffff:ffff:ffff,CN -2001:dd8:2::,2001:dd8:2:ffff:ffff:ffff:ffff:ffff,MY -2001:dd8:3::,2001:dd8:3:ffff:ffff:ffff:ffff:ffff,NZ -2001:dd8:4::,2001:dd8:4:ffff:ffff:ffff:ffff:ffff,SG -2001:dd8:5::,2001:dd8:5:ffff:ffff:ffff:ffff:ffff,CN -2001:dd8:6::,2001:dd8:6:ffff:ffff:ffff:ffff:ffff,AU -2001:dd8:7::,2001:dd8:7:ffff:ffff:ffff:ffff:ffff,NP -2001:dd8:8::,2001:dd8:f:ffff:ffff:ffff:ffff:ffff,AU -2001:dd8:10::,2001:dd8:11:ffff:ffff:ffff:ffff:ffff,NP -2001:dd8:12::,2001:dd8:12:ffff:ffff:ffff:ffff:ffff,AU -2001:dd8:13::,2001:dd8:13:ffff:ffff:ffff:ffff:ffff,NZ -2001:dd8:14::,2001:dd8:14:ffff:ffff:ffff:ffff:ffff,AU -2001:dd8:15::,2001:dd8:15:ffff:ffff:ffff:ffff:ffff,HK -2001:dd8:16::,2001:dd8:16:ffff:ffff:ffff:ffff:ffff,SG -2001:dd8:17::,2001:dd8:17:ffff:ffff:ffff:ffff:ffff,KR -2001:dd8:18::,2001:dd8:18:ffff:ffff:ffff:ffff:ffff,TW -2001:dd8:19::,2001:dd8:19:ffff:ffff:ffff:ffff:ffff,IN -2001:dd8:1a::,2001:dd8:1a:ffff:ffff:ffff:ffff:ffff,CN -2001:dd8:1b::,2001:dd8:1b:ffff:ffff:ffff:ffff:ffff,IN -2001:dd8:1c::,2001:dd8:1c:ffff:ffff:ffff:ffff:ffff,PK -2001:dd8:1d::,2001:dd8:1d:ffff:ffff:ffff:ffff:ffff,BD -2001:dd8:1e::,2001:dd8:1e:ffff:ffff:ffff:ffff:ffff,KH -2001:dd8:1f::,2001:dd8:1f:ffff:ffff:ffff:ffff:ffff,ID -2001:dd8:20::,2001:dd8:21:ffff:ffff:ffff:ffff:ffff,IN -2001:dd8:22::,2001:dd8:22:ffff:ffff:ffff:ffff:ffff,JP -2001:dd8:24::,2001:dd8:25:ffff:ffff:ffff:ffff:ffff,NP -2001:dda::,2001:dda::ffff:ffff:ffff:ffff:ffff,JP -2001:ddc::,2001:ddc::ffff:ffff:ffff:ffff:ffff,MY -2001:ddd::,2001:ddd::ffff:ffff:ffff:ffff:ffff,AU -2001:dde::,2001:dde::ffff:ffff:ffff:ffff:ffff,MV -2001:de1::,2001:de1:3f:ffff:ffff:ffff:ffff:ffff,JP -2001:de8::,2001:de8::ffff:ffff:ffff:ffff:ffff,TH -2001:de8:1::,2001:de8:1:ffff:ffff:ffff:ffff:ffff,IN -2001:de8:2::,2001:de8:2:ffff:ffff:ffff:ffff:ffff,ID -2001:de8:3::,2001:de8:3:ffff:ffff:ffff:ffff:ffff,VN -2001:de8:4::,2001:de8:8:ffff:ffff:ffff:ffff:ffff,JP -2001:de8:a::,2001:de8:a:ffff:ffff:ffff:ffff:ffff,VN -2001:de8:b::,2001:de8:b:ffff:ffff:ffff:ffff:ffff,BD -2001:de8:c::,2001:de8:c:ffff:ffff:ffff:ffff:ffff,JP -2001:de8:d::,2001:de8:d:ffff:ffff:ffff:ffff:ffff,SG -2001:de8:e::,2001:de8:e:ffff:ffff:ffff:ffff:ffff,TH -2001:de8:f::,2001:de8:10:ffff:ffff:ffff:ffff:ffff,MY -2001:de8:11::,2001:de8:11:ffff:ffff:ffff:ffff:ffff,ID -2001:de8:12::,2001:de8:12:ffff:ffff:ffff:ffff:ffff,SG -2001:de8:13::,2001:de8:13:ffff:ffff:ffff:ffff:ffff,MY -2001:de8:14::,2001:de8:14:ffff:ffff:ffff:ffff:ffff,AU -2001:de8:15::,2001:de8:15:ffff:ffff:ffff:ffff:ffff,ID -2001:de8:16::,2001:de8:16:ffff:ffff:ffff:ffff:ffff,PF -2001:de8:17::,2001:de8:17:ffff:ffff:ffff:ffff:ffff,AU -2001:de8:19::,2001:de8:19:ffff:ffff:ffff:ffff:ffff,NZ -2001:de8:1a::,2001:de8:1a:ffff:ffff:ffff:ffff:ffff,ID -2001:de8:1d::,2001:de8:1d:ffff:ffff:ffff:ffff:ffff,KH -2001:de8:1e::,2001:de8:1e:ffff:ffff:ffff:ffff:ffff,JP -2001:de8:8000::,2001:de8:8000:ffff:ffff:ffff:ffff:ffff,WS -2001:de9::,2001:de9::ffff:ffff:ffff:ffff:ffff,LK -2001:de9:8000::,2001:de9:8000:ffff:ffff:ffff:ffff:ffff,ID -2001:dea::,2001:dea::ffff:ffff:ffff:ffff:ffff,AU -2001:dea:8000::,2001:dea:8000:ffff:ffff:ffff:ffff:ffff,PG -2001:deb::,2001:deb::ffff:ffff:ffff:ffff:ffff,TH -2001:deb:8000::,2001:deb:8000:ffff:ffff:ffff:ffff:ffff,BT -2001:dec::,2001:dec::ffff:ffff:ffff:ffff:ffff,VU -2001:dec:8000::,2001:dec:8000:ffff:ffff:ffff:ffff:ffff,PK -2001:ded::,2001:ded::ffff:ffff:ffff:ffff:ffff,SG -2001:ded:8000::,2001:ded:8000:ffff:ffff:ffff:ffff:ffff,IN -2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK -2001:dee:8000::,2001:dee:8001:ffff:ffff:ffff:ffff:ffff,NZ -2001:def::,2001:def::ffff:ffff:ffff:ffff:ffff,HK -2001:def:8000::,2001:def:8001:ffff:ffff:ffff:ffff:ffff,NP -2001:df0::,2001:df0:1:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:2::,2001:df0:2:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:4::,2001:df0:4:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:7::,2001:df0:7:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:8::,2001:df0:8:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:9::,2001:df0:a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c::,2001:df0:13:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:14::,2001:df0:14:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:15::,2001:df0:15:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:17::,2001:df0:17:ffff:ffff:ffff:ffff:ffff,LK -2001:df0:18::,2001:df0:18:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:44::,2001:df0:44:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:45::,2001:df0:46:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:48::,2001:df0:48:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:49::,2001:df0:49:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:4a::,2001:df0:4a:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:4b::,2001:df0:4d:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:50::,2001:df0:60:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:62::,2001:df0:62:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:63::,2001:df0:63:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:65::,2001:df0:65:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:66::,2001:df0:66:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:68::,2001:df0:68:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:69::,2001:df0:69:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:6a::,2001:df0:6a:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:6b::,2001:df0:6b:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:6f::,2001:df0:6f:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:70::,2001:df0:70:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:71::,2001:df0:71:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:73::,2001:df0:74:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:75::,2001:df0:75:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:76::,2001:df0:76:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:77::,2001:df0:77:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:78::,2001:df0:78:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:7b::,2001:df0:7b:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:7d::,2001:df0:7d:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:7e::,2001:df0:81:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:82::,2001:df0:82:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:83::,2001:df0:83:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:84::,2001:df0:84:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:85::,2001:df0:85:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:86::,2001:df0:87:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:89::,2001:df0:89:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:8b::,2001:df0:8b:ffff:ffff:ffff:ffff:ffff,NP -2001:df0:8c::,2001:df0:8c:ffff:ffff:ffff:ffff:ffff,NU -2001:df0:8e::,2001:df0:90:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:91::,2001:df0:91:ffff:ffff:ffff:ffff:ffff,FJ -2001:df0:92::,2001:df0:92:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:93::,2001:df0:93:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:94::,2001:df0:94:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:95::,2001:df0:95:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:96::,2001:df0:96:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:97::,2001:df0:97:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:98::,2001:df0:9a:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:9c::,2001:df0:9c:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:9d::,2001:df0:9d:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:9e::,2001:df0:9e:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:9f::,2001:df0:9f:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:a0::,2001:df0:a1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a2::,2001:df0:a2:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:a3::,2001:df0:a3:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:a4::,2001:df0:a4:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a5::,2001:df0:a6:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:a7::,2001:df0:ab:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ad::,2001:df0:ad:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:ae::,2001:df0:ae:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:b0::,2001:df0:b0:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:b1::,2001:df0:b8:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:b9::,2001:df0:b9:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:ba::,2001:df0:bd:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:be::,2001:df0:be:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:bf::,2001:df0:bf:ffff:ffff:ffff:ffff:ffff,LA -2001:df0:c0::,2001:df0:c0:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:c1::,2001:df0:c2:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c4::,2001:df0:c4:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c5::,2001:df0:c5:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:c6::,2001:df0:c6:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:c7::,2001:df0:c8:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c9::,2001:df0:cc:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:cd::,2001:df0:cd:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:ce::,2001:df0:ce:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:cf::,2001:df0:cf:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:d1::,2001:df0:d1:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:d2::,2001:df0:d2:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:d4::,2001:df0:d5:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:d7::,2001:df0:d7:ffff:ffff:ffff:ffff:ffff,KR -2001:df0:d8::,2001:df0:d8:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:d9::,2001:df0:d9:1ff:ffff:ffff:ffff:ffff,TW -2001:df0:d9:200::,2001:df0:d9:2ff:ffff:ffff:ffff:ffff,HK -2001:df0:d9:300::,2001:df0:d9:ffff:ffff:ffff:ffff:ffff,TW -2001:df0:da::,2001:df0:da:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:dc::,2001:df0:dc:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:dd::,2001:df0:dd:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:de::,2001:df0:df:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:e1::,2001:df0:e1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e2::,2001:df0:e2:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:e3::,2001:df0:e3:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:e4::,2001:df0:e5:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e6::,2001:df0:e6:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:e7::,2001:df0:e8:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e9::,2001:df0:e9:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ea::,2001:df0:ea:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:eb::,2001:df0:eb:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:ed::,2001:df0:ed:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ee::,2001:df0:ee:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:ef::,2001:df0:f0:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:f1::,2001:df0:f1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:f2::,2001:df0:f2:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f3::,2001:df0:f3:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:f4::,2001:df0:f4:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f6::,2001:df0:f6:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:f7::,2001:df0:f7:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:f8::,2001:df0:fa:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:fb::,2001:df0:fb:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:fc::,2001:df0:fc:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:fd::,2001:df0:fe:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:100::,2001:df0:1ff:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:201::,2001:df0:201:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:202::,2001:df0:202:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:203::,2001:df0:203:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:204::,2001:df0:204:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:205::,2001:df0:205:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:206::,2001:df0:206:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:207::,2001:df0:207:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:208::,2001:df0:208:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:209::,2001:df0:209:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:20a::,2001:df0:20a:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:20b::,2001:df0:20b:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:20c::,2001:df0:20c:ffff:ffff:ffff:ffff:ffff,NF -2001:df0:20d::,2001:df0:20d:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:20e::,2001:df0:20e:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:210::,2001:df0:210:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:211::,2001:df0:211:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:212::,2001:df0:212:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:213::,2001:df0:213:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:214::,2001:df0:214:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:215::,2001:df0:215:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:216::,2001:df0:217:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:218::,2001:df0:219:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:21a::,2001:df0:21a:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:21b::,2001:df0:21b:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:21c::,2001:df0:21c:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:21e::,2001:df0:21e:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:21f::,2001:df0:220:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:221::,2001:df0:221:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:222::,2001:df0:222:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:224::,2001:df0:224:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:226::,2001:df0:228:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:229::,2001:df0:229:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:22b::,2001:df0:22b:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:22c::,2001:df0:22d:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:22e::,2001:df0:22e:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:22f::,2001:df0:22f:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:230::,2001:df0:230:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:232::,2001:df0:232:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:233::,2001:df0:234:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:235::,2001:df0:235:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:237::,2001:df0:237:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:238::,2001:df0:238:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:239::,2001:df0:239:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:23a::,2001:df0:23a:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:23b::,2001:df0:23b:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:23c::,2001:df0:23d:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:23e::,2001:df0:23e:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:23f::,2001:df0:23f:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:241::,2001:df0:241:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:242::,2001:df0:242:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:243::,2001:df0:243:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:245::,2001:df0:246:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:247::,2001:df0:247:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:248::,2001:df0:248:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:249::,2001:df0:24a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:24b::,2001:df0:24b:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:24c::,2001:df0:24c:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:24e::,2001:df0:24e:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:24f::,2001:df0:24f:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:250::,2001:df0:250:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:251::,2001:df0:252:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:253::,2001:df0:253:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:254::,2001:df0:254:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:255::,2001:df0:255:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:256::,2001:df0:256:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:257::,2001:df0:257:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:258::,2001:df0:258:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:259::,2001:df0:259:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:25a::,2001:df0:25a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:25b::,2001:df0:25b:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:25c::,2001:df0:25d:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:266::,2001:df0:266:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:267::,2001:df0:267:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:268::,2001:df0:269:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:26b::,2001:df0:26b:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:26c::,2001:df0:26c:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:26d::,2001:df0:26f:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:270::,2001:df0:270:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:272::,2001:df0:272:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:273::,2001:df0:273:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:274::,2001:df0:277:ffff:ffff:ffff:ffff:ffff,NP -2001:df0:278::,2001:df0:278:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:279::,2001:df0:279:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:27a::,2001:df0:27a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:27b::,2001:df0:27b:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:27c::,2001:df0:27c:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:27d::,2001:df0:27d:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:27e::,2001:df0:27e:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:27f::,2001:df0:27f:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:280::,2001:df0:28f:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:290::,2001:df0:290:ffff:ffff:ffff:ffff:ffff,KR -2001:df0:291::,2001:df0:291:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:292::,2001:df0:292:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:293::,2001:df0:293:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:294::,2001:df0:294:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:295::,2001:df0:296:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:298::,2001:df0:298:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:299::,2001:df0:299:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:29a::,2001:df0:29a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:29b::,2001:df0:29b:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:29c::,2001:df0:29c:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:29d::,2001:df0:29d:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:2a6::,2001:df0:2a6:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2a7::,2001:df0:2a7:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2a8::,2001:df0:2a8:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:2a9::,2001:df0:2aa:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2ab::,2001:df0:2ab:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2ac::,2001:df0:2ac:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:2ad::,2001:df0:2ad:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2af::,2001:df0:2af:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:2b0::,2001:df0:2b1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2b2::,2001:df0:2b2:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2b4::,2001:df0:2b4:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2b5::,2001:df0:2b5:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2b8::,2001:df0:2b8:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:2b9::,2001:df0:2b9:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:2ba::,2001:df0:2ba:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:2bb::,2001:df0:2bb:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:2bc::,2001:df0:2bc:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2bd::,2001:df0:2bd:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2be::,2001:df0:2be:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2bf::,2001:df0:2bf:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:2c1::,2001:df0:2c1:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:2c2::,2001:df0:2c2:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2c3::,2001:df0:2c3:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:2c4::,2001:df0:2c4:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2c5::,2001:df0:2c5:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:2c6::,2001:df0:2c8:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2c9::,2001:df0:2c9:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2ca::,2001:df0:2ca:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2cb::,2001:df0:2cb:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:2cc::,2001:df0:2cc:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2ce::,2001:df0:2e0:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2e1::,2001:df0:2e1:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2e2::,2001:df0:2e2:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2e3::,2001:df0:2e3:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2e4::,2001:df0:2e4:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2e5::,2001:df0:2e5:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2e6::,2001:df0:2e7:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2e8::,2001:df0:2e8:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:2e9::,2001:df0:2e9:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:2ea::,2001:df0:2ea:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:2ec::,2001:df0:2ec:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2ed::,2001:df0:2ee:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2ef::,2001:df0:2ef:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:2f0::,2001:df0:2f3:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2f4::,2001:df0:2f4:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2f5::,2001:df0:2f5:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:2f6::,2001:df0:2f6:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2f9::,2001:df0:2f9:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2fa::,2001:df0:2fa:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2fb::,2001:df0:2fb:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:300::,2001:df0:319:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:408::,2001:df0:408:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:409::,2001:df0:409:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:40a::,2001:df0:40a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:40c::,2001:df0:40c:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:40d::,2001:df0:40d:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:40e::,2001:df0:40f:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:410::,2001:df0:410:ffff:ffff:ffff:ffff:ffff,VU -2001:df0:411::,2001:df0:411:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:412::,2001:df0:412:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:413::,2001:df0:413:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:415::,2001:df0:415:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:418::,2001:df0:419:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:41a::,2001:df0:41a:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:41b::,2001:df0:41b:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:41c::,2001:df0:41c:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:41d::,2001:df0:41e:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:41f::,2001:df0:41f:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:420::,2001:df0:420:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:421::,2001:df0:421:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:422::,2001:df0:422:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:423::,2001:df0:423:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:425::,2001:df0:425:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:426::,2001:df0:426:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:427::,2001:df0:427:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:430::,2001:df0:43f:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:440::,2001:df0:440:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:441::,2001:df0:441:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:442::,2001:df0:443:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:444::,2001:df0:445:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:446::,2001:df0:446:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:447::,2001:df0:447:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:448::,2001:df0:448:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:449::,2001:df0:449:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:44a::,2001:df0:44a:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:44b::,2001:df0:44b:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:44c::,2001:df0:44d:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:44e::,2001:df0:44e:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:44f::,2001:df0:44f:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:450::,2001:df0:450:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:451::,2001:df0:451:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:452::,2001:df0:452:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:453::,2001:df0:453:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:454::,2001:df0:454:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:455::,2001:df0:455:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:456::,2001:df0:456:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:457::,2001:df0:457:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:458::,2001:df0:458:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:45a::,2001:df0:45a:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:45c::,2001:df0:45d:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:45f::,2001:df0:45f:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:460::,2001:df0:460:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:461::,2001:df0:461:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:462::,2001:df0:462:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:464::,2001:df0:464:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:465::,2001:df0:465:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:466::,2001:df0:466:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:467::,2001:df0:467:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:468::,2001:df0:469:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:46a::,2001:df0:46a:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:46b::,2001:df0:46b:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:46c::,2001:df0:46c:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:500::,2001:df0:600:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:700::,2001:df0:700:ffff:ffff:ffff:ffff:ffff,PG -2001:df0:800::,2001:df0:800:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:900::,2001:df0:900:ffff:ffff:ffff:ffff:ffff,NP -2001:df0:a00::,2001:df0:a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:b00::,2001:df0:b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:c00::,2001:df0:c00:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:d00::,2001:df0:d00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:e00::,2001:df0:e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f00::,2001:df0:f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1000::,2001:df0:1000:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:1100::,2001:df0:1100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1200::,2001:df0:1200:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:1300::,2001:df0:1300:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1400::,2001:df0:1400:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:1500::,2001:df0:1500:ffff:ffff:ffff:ffff:ffff,TH -2001:df0:1600::,2001:df0:1600:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1700::,2001:df0:1700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:1800::,2001:df0:1800:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:1900::,2001:df0:1900:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:1a00::,2001:df0:1a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:1b00::,2001:df0:1b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:1c00::,2001:df0:1c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1d00::,2001:df0:1d00:ffff:ffff:ffff:ffff:ffff,MV -2001:df0:1e00::,2001:df0:1e01:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:1f00::,2001:df0:1f00:ffff:ffff:ffff:ffff:ffff,MV -2001:df0:2000::,2001:df0:2000:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2100::,2001:df0:2100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2200::,2001:df0:2200:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2300::,2001:df0:2300:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2400::,2001:df0:2400:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:2500::,2001:df0:2500:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2600::,2001:df0:2600:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2700::,2001:df0:2700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2900::,2001:df0:2900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:2a00::,2001:df0:2a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:2d00::,2001:df0:2d00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:2e00::,2001:df0:2e00:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:2f00::,2001:df0:2f00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:3000::,2001:df0:3000:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:3100::,2001:df0:3100:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3200::,2001:df0:3200:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:3300::,2001:df0:3300:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3500::,2001:df0:3500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3600::,2001:df0:3600:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:3700::,2001:df0:3700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3800::,2001:df0:3800:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:3900::,2001:df0:3900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3a00::,2001:df0:3a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:3b00::,2001:df0:3b00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:3c00::,2001:df0:3c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:3d00::,2001:df0:3d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:3e00::,2001:df0:3e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:3f00::,2001:df0:3f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:4100::,2001:df0:4100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:4200::,2001:df0:4200:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:4300::,2001:df0:4300:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:4500::,2001:df0:4500:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:4700::,2001:df0:4700:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:4900::,2001:df0:4900:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:4b00::,2001:df0:4b00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:4d00::,2001:df0:4d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:4e00::,2001:df0:4e00:ffff:ffff:ffff:ffff:ffff,TW -2001:df0:4f00::,2001:df0:4f00:ffff:ffff:ffff:ffff:ffff,MN -2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:5100::,2001:df0:5100:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:5200::,2001:df0:5200:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:5300::,2001:df0:5300:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:5500::,2001:df0:5500:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:5700::,2001:df0:5700:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:5900::,2001:df0:5900:ffff:ffff:ffff:ffff:ffff,NP -2001:df0:5a00::,2001:df0:5a00:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:5b00::,2001:df0:5b00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:5d00::,2001:df0:5d01:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:5e00::,2001:df0:5e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:5f00::,2001:df0:5f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:6100::,2001:df0:6100:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:6200::,2001:df0:6200:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:6300::,2001:df0:6300:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:6500::,2001:df0:6500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:6600::,2001:df0:6600:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:6700::,2001:df0:6700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:6900::,2001:df0:6900:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:6a00::,2001:df0:6a00:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:6b00::,2001:df0:6b00:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:6d00::,2001:df0:6d00:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:6e00::,2001:df0:6e00:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:6f00::,2001:df0:6f00:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:7100::,2001:df0:7100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:7200::,2001:df0:7200:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:7300::,2001:df0:7300:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:7500::,2001:df0:7500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:7600::,2001:df0:7600:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:7700::,2001:df0:7700:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:7900::,2001:df0:7900:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:7a00::,2001:df0:7a00:ffff:ffff:ffff:ffff:ffff,TL -2001:df0:7b00::,2001:df0:7b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:7d00::,2001:df0:7d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:7e00::,2001:df0:7e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:7f00::,2001:df0:7f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:8100::,2001:df0:8100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:8200::,2001:df0:8200:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:8300::,2001:df0:8300:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:8500::,2001:df0:8500:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:8600::,2001:df0:8600:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:8700::,2001:df0:8700:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:8900::,2001:df0:8900:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:8a00::,2001:df0:8a00:ffff:ffff:ffff:ffff:ffff,NP -2001:df0:8b00::,2001:df0:8b00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:8d00::,2001:df0:8d00:ffff:ffff:ffff:ffff:ffff,MV -2001:df0:8e00::,2001:df0:8e00:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:8f00::,2001:df0:8f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:9100::,2001:df0:9100:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:9200::,2001:df0:9200:ffff:ffff:ffff:ffff:ffff,MM -2001:df0:9300::,2001:df0:9300:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:9500::,2001:df0:9500:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:9600::,2001:df0:9600:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:9700::,2001:df0:9700:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:9900::,2001:df0:9900:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:9a00::,2001:df0:9a00:ffff:ffff:ffff:ffff:ffff,CN -2001:df0:9b00::,2001:df0:9b00:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:9d00::,2001:df0:9d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:9e00::,2001:df0:9e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:9f00::,2001:df0:9f00:ffff:ffff:ffff:ffff:ffff,KH -2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a100::,2001:df0:a100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a200::,2001:df0:a200:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:a300::,2001:df0:a300:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:a500::,2001:df0:a500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:a600::,2001:df0:a600:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a700::,2001:df0:a700:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:a900::,2001:df0:a900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:aa00::,2001:df0:aa00:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:ab00::,2001:df0:ab00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:ad00::,2001:df0:ad00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:ae00::,2001:df0:ae00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:af00::,2001:df0:af00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:b100::,2001:df0:b100:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:b200::,2001:df0:b200:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:b300::,2001:df0:b300:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP -2001:df0:b500::,2001:df0:b500:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:b600::,2001:df0:b600:ffff:ffff:ffff:ffff:ffff,BD -2001:df0:b700::,2001:df0:b700:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:b900::,2001:df0:b900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ba00::,2001:df0:ba00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:bb00::,2001:df0:bb00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:bc00::,2001:df0:bc00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:bd00::,2001:df0:bd00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:be00::,2001:df0:be00:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:bf00::,2001:df0:bf00:ffff:ffff:ffff:ffff:ffff,PH -2001:df0:c000::,2001:df0:c000:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:c100::,2001:df0:c100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c200::,2001:df0:c200:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c300::,2001:df0:c300:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:c500::,2001:df0:c500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:c600::,2001:df0:c600:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:c900::,2001:df0:c900:ffff:ffff:ffff:ffff:ffff,PK -2001:df0:ca00::,2001:df0:ca00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:cb00::,2001:df0:cb00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:cc00::,2001:df0:cc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:cd00::,2001:df0:cd00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:ce00::,2001:df0:ce00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:cf00::,2001:df0:cf00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:d000::,2001:df0:d000:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:d100::,2001:df0:d100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:d200::,2001:df0:d200:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:d300::,2001:df0:d301:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:d400::,2001:df0:d400:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:d500::,2001:df0:d500:ffff:ffff:ffff:ffff:ffff,AF -2001:df0:d600::,2001:df0:d600:ffff:ffff:ffff:ffff:ffff,MY -2001:df0:d700::,2001:df0:d700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:d900::,2001:df0:d900:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:db00::,2001:df0:db03:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:dc00::,2001:df0:dc00:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:dd00::,2001:df0:dd00:ffff:ffff:ffff:ffff:ffff,KH -2001:df0:de00::,2001:df0:de00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:df00::,2001:df0:df00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:e100::,2001:df0:e100:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:e200::,2001:df0:e200:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e300::,2001:df0:e300:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:e400::,2001:df0:e400:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:e500::,2001:df0:e500:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:e600::,2001:df0:e600:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:e700::,2001:df0:e700:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e800::,2001:df0:e800:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:e900::,2001:df0:e900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ea00::,2001:df0:ea00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:eb00::,2001:df0:eb00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ec00::,2001:df0:ec00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:ed00::,2001:df0:ed00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ee00::,2001:df0:ee00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:ef00::,2001:df0:ef00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f000::,2001:df0:f000:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:f100::,2001:df0:f100:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:f200::,2001:df0:f200:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f300::,2001:df0:f300:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f400::,2001:df0:f401:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:f500::,2001:df0:f500:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f600::,2001:df0:f600:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:f700::,2001:df0:f700:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f800::,2001:df0:f800:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:f900::,2001:df0:f900:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:fa00::,2001:df0:fa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:fb00::,2001:df0:fb00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:fc00::,2001:df0:fc01:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:fd00::,2001:df0:fd00:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:fe00::,2001:df0:fe00:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:ff00::,2001:df0:ff00:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:100::,2001:df1:100:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:200::,2001:df1:200:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:300::,2001:df1:300:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:400::,2001:df1:400:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:500::,2001:df1:500:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:600::,2001:df1:600:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:700::,2001:df1:700:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:800::,2001:df1:801:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:900::,2001:df1:900:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:a00::,2001:df1:a00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:b00::,2001:df1:b00:ffff:ffff:ffff:ffff:ffff,PG -2001:df1:c00::,2001:df1:c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:d00::,2001:df1:d00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:e00::,2001:df1:e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:f00::,2001:df1:f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:1100::,2001:df1:1100:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:1200::,2001:df1:1200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:1300::,2001:df1:1300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:1400::,2001:df1:1400:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:1500::,2001:df1:1500:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:1600::,2001:df1:1600:ffff:ffff:ffff:ffff:ffff,LK -2001:df1:1700::,2001:df1:1700:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:1800::,2001:df1:1800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:1900::,2001:df1:1900:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:1a00::,2001:df1:1a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:1b00::,2001:df1:1b00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:1c00::,2001:df1:1c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:1d00::,2001:df1:1d00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:1e00::,2001:df1:1e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:1f00::,2001:df1:1f00:ffff:ffff:ffff:ffff:ffff,VG -2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:2100::,2001:df1:2100:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2200::,2001:df1:2200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2300::,2001:df1:2300:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:2400::,2001:df1:2401:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:2500::,2001:df1:2500:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:2600::,2001:df1:2600:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2700::,2001:df1:2700:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:2900::,2001:df1:2900:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:2a00::,2001:df1:2a00:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:2b00::,2001:df1:2b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:2d00::,2001:df1:2d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3000::,2001:df1:3000:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:3100::,2001:df1:3100:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:3200::,2001:df1:3200:ffff:ffff:ffff:ffff:ffff,VN -2001:df1:3300::,2001:df1:3300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:3400::,2001:df1:3400:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:3500::,2001:df1:3500:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3600::,2001:df1:3600:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:3700::,2001:df1:3700:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3800::,2001:df1:3800:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:3900::,2001:df1:3900:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3a00::,2001:df1:3a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:3b00::,2001:df1:3b00:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:3c00::,2001:df1:3c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3d00::,2001:df1:3d00:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:3e00::,2001:df1:3e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:3f00::,2001:df1:3f00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:4000::,2001:df1:4000:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:4100::,2001:df1:4100:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:4200::,2001:df1:4200:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:4300::,2001:df1:4300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:4400::,2001:df1:4400:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:4500::,2001:df1:4500:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:4600::,2001:df1:4600:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:4700::,2001:df1:4700:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:4800::,2001:df1:4800:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:4900::,2001:df1:4900:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:4a00::,2001:df1:4a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:4b00::,2001:df1:4b00:ffff:ffff:ffff:ffff:ffff,PK -2001:df1:4c00::,2001:df1:4c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:4d00::,2001:df1:4d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:4e00::,2001:df1:4e00:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:4f00::,2001:df1:4f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:5000::,2001:df1:5000:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:5100::,2001:df1:5100:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:5200::,2001:df1:5200:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:5300::,2001:df1:5300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:5500::,2001:df1:5500:ffff:ffff:ffff:ffff:ffff,MM -2001:df1:5600::,2001:df1:5600:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:5700::,2001:df1:5700:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:5800::,2001:df1:5800:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:5900::,2001:df1:5900:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:5a00::,2001:df1:5a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:5b00::,2001:df1:5b00:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:5c00::,2001:df1:5c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:5d00::,2001:df1:5d00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:5e00::,2001:df1:5e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:5f00::,2001:df1:5f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:6000::,2001:df1:6000:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:6100::,2001:df1:6100:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:6200::,2001:df1:6200:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:6300::,2001:df1:6300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:6400::,2001:df1:6400:ffff:ffff:ffff:ffff:ffff,TH -2001:df1:6500::,2001:df1:6500:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:6600::,2001:df1:6600:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:6700::,2001:df1:6700:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:6800::,2001:df1:6800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:6900::,2001:df1:6900:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:6a00::,2001:df1:6a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:6b00::,2001:df1:6b00:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:6c00::,2001:df1:6c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df1:6d00::,2001:df1:6d00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:6e00::,2001:df1:6e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:6f00::,2001:df1:6f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:7000::,2001:df1:7000:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:7100::,2001:df1:7100:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:7200::,2001:df1:7200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:7300::,2001:df1:7300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:7400::,2001:df1:7400:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:7500::,2001:df1:7500:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:7600::,2001:df1:7600:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:7700::,2001:df1:7700:ffff:ffff:ffff:ffff:ffff,TH -2001:df1:7800::,2001:df1:7800:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:7900::,2001:df1:7900:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:7a00::,2001:df1:7a00:ffff:ffff:ffff:ffff:ffff,NP -2001:df1:7b00::,2001:df1:7b00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:7c00::,2001:df1:7c00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:7d00::,2001:df1:7d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:7e00::,2001:df1:7e00:ffff:ffff:ffff:ffff:ffff,MM -2001:df1:7f00::,2001:df1:7f00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:8000::,2001:df1:8000:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:8100::,2001:df1:8100:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:8200::,2001:df1:8200:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:8400::,2001:df1:8400:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:8500::,2001:df1:8500:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:8600::,2001:df1:8600:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:8700::,2001:df1:8700:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:8800::,2001:df1:8800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:8900::,2001:df1:8900:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:8a00::,2001:df1:8a00:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:8b00::,2001:df1:8b00:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:8c00::,2001:df1:8c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:8d00::,2001:df1:8d00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:8e00::,2001:df1:8e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:8f00::,2001:df1:8f00:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:9000::,2001:df1:9000:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:9100::,2001:df1:9100:ffff:ffff:ffff:ffff:ffff,PK -2001:df1:9200::,2001:df1:9200:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:9300::,2001:df1:9300:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:9400::,2001:df1:9400:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:9500::,2001:df1:9500:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:9600::,2001:df1:9600:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:9700::,2001:df1:9700:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:9800::,2001:df1:9800:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:9900::,2001:df1:9900:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:9a00::,2001:df1:9a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:9b00::,2001:df1:9b00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:9c00::,2001:df1:9c00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:9d00::,2001:df1:9d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:9e00::,2001:df1:9e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:9f00::,2001:df1:9f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:a000::,2001:df1:a000:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:a100::,2001:df1:a100:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:a200::,2001:df1:a200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:a300::,2001:df1:a300:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:a400::,2001:df1:a400:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:a500::,2001:df1:a500:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:a700::,2001:df1:a700:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:a900::,2001:df1:a900:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:ab00::,2001:df1:ab00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:ad00::,2001:df1:ad00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:af00::,2001:df1:af00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH -2001:df1:b100::,2001:df1:b100:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:b300::,2001:df1:b300:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:b500::,2001:df1:b500:ffff:ffff:ffff:ffff:ffff,JP -2001:df1:b600::,2001:df1:b600:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:b700::,2001:df1:b700:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:b800::,2001:df1:b800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:b900::,2001:df1:b900:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:ba00::,2001:df1:ba00:ffff:ffff:ffff:ffff:ffff,BN -2001:df1:bb00::,2001:df1:bb00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:bc00::,2001:df1:bc00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:bd00::,2001:df1:bd00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:be00::,2001:df1:be00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:bf00::,2001:df1:bf00:ffff:ffff:ffff:ffff:ffff,PH -2001:df1:c100::,2001:df1:c100:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:c200::,2001:df1:c200:ffff:ffff:ffff:ffff:ffff,FR -2001:df1:c300::,2001:df1:c300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:c400::,2001:df1:c400:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:c500::,2001:df1:c500:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:c600::,2001:df1:c600:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:c700::,2001:df1:c700:ffff:ffff:ffff:ffff:ffff,MM -2001:df1:c701::,2001:df1:c701:ffff:ffff:ffff:ffff:ffff,KH -2001:df1:c800::,2001:df1:c800:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:c900::,2001:df1:c900:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:ca00::,2001:df1:ca00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:cb00::,2001:df1:cb00:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:cc00::,2001:df1:cc00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:cd00::,2001:df1:cd00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:ce00::,2001:df1:ce00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:d000::,2001:df1:d000:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:d100::,2001:df1:d100:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:d200::,2001:df1:d200:ffff:ffff:ffff:ffff:ffff,SG -2001:df1:d300::,2001:df1:d300:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:d400::,2001:df1:d401:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:d600::,2001:df1:d600:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:d700::,2001:df1:d700:ffff:ffff:ffff:ffff:ffff,NL -2001:df1:d800::,2001:df1:d800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:d900::,2001:df1:d900:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:da00::,2001:df1:da00:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:db00::,2001:df1:db00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:dd00::,2001:df1:dd01:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:de00::,2001:df1:de00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:df00::,2001:df1:df00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:e000::,2001:df1:e000:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:e100::,2001:df1:e100:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:e200::,2001:df1:e200:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:e300::,2001:df1:e307:ffff:ffff:ffff:ffff:ffff,US -2001:df1:e400::,2001:df1:e400:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:e500::,2001:df1:e500:ffff:ffff:ffff:ffff:ffff,JP -2001:df1:e600::,2001:df1:e600:ffff:ffff:ffff:ffff:ffff,CN -2001:df1:e700::,2001:df1:e700:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:e800::,2001:df1:e800:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:e900::,2001:df1:e900:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:ea00::,2001:df1:ea00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:eb00::,2001:df1:eb00:ffff:ffff:ffff:ffff:ffff,BD -2001:df1:ec00::,2001:df1:ec00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:ed00::,2001:df1:ed00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:ee00::,2001:df1:ee00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:ef00::,2001:df1:ef00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:f000::,2001:df1:f000:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:f100::,2001:df1:f100:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:f200::,2001:df1:f200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:f300::,2001:df1:f300:ffff:ffff:ffff:ffff:ffff,NZ -2001:df1:f400::,2001:df1:f400:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:f500::,2001:df1:f500:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:f600::,2001:df1:f600:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:f700::,2001:df1:f700:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:f800::,2001:df1:f800:ffff:ffff:ffff:ffff:ffff,BN -2001:df1:f900::,2001:df1:f900:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:fa00::,2001:df1:fa00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:fb00::,2001:df1:fb00:ffff:ffff:ffff:ffff:ffff,IN -2001:df1:fc00::,2001:df1:fc00:ffff:ffff:ffff:ffff:ffff,MY -2001:df1:fd00::,2001:df1:fd00:ffff:ffff:ffff:ffff:ffff,AU -2001:df1:fe00::,2001:df1:fe00:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:ff00::,2001:df1:ff00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2::,2001:df2::ffff:ffff:ffff:ffff:ffff,AU -2001:df2:100::,2001:df2:100:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:200::,2001:df2:200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:300::,2001:df2:300:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:400::,2001:df2:400:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:500::,2001:df2:500:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:600::,2001:df2:600:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:700::,2001:df2:700:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:800::,2001:df2:800:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:900::,2001:df2:900:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:a00::,2001:df2:a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:b00::,2001:df2:b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:d00::,2001:df2:d00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:e00::,2001:df2:e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:f00::,2001:df2:f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:1000::,2001:df2:1001:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1100::,2001:df2:1100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:1200::,2001:df2:1200:ffff:ffff:ffff:ffff:ffff,BD -2001:df2:1300::,2001:df2:1300:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:1400::,2001:df2:1400:ffff:ffff:ffff:ffff:ffff,NP -2001:df2:1500::,2001:df2:1500:ffff:ffff:ffff:ffff:ffff,PG -2001:df2:1600::,2001:df2:1600:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:1700::,2001:df2:1700:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1800::,2001:df2:1803:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1900::,2001:df2:1900:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1a00::,2001:df2:1a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:1b00::,2001:df2:1b00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1c00::,2001:df2:1c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:1d00::,2001:df2:1d00:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:1e00::,2001:df2:1e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df2:1f00::,2001:df2:1f00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:2000::,2001:df2:2000:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:2100::,2001:df2:2100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2200::,2001:df2:2200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2300::,2001:df2:2300:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2400::,2001:df2:2400:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2500::,2001:df2:2500:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2600::,2001:df2:2600:ffff:ffff:ffff:ffff:ffff,SG -2001:df2:2700::,2001:df2:2700:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:2800::,2001:df2:2800:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:2900::,2001:df2:2900:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:2a00::,2001:df2:2a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2b00::,2001:df2:2b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:2c00::,2001:df2:2c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:2d00::,2001:df2:2d00:ffff:ffff:ffff:ffff:ffff,SG -2001:df2:2e00::,2001:df2:2e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:2f00::,2001:df2:2f00:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:3000::,2001:df2:3000:ffff:ffff:ffff:ffff:ffff,SG -2001:df2:3100::,2001:df2:3100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3200::,2001:df2:3200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3300::,2001:df2:3300:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:3400::,2001:df2:3400:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:3500::,2001:df2:3500:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:3600::,2001:df2:3600:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3700::,2001:df2:3700:ffff:ffff:ffff:ffff:ffff,BD -2001:df2:3800::,2001:df2:3800:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:3900::,2001:df2:3900:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:3a00::,2001:df2:3a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3b00::,2001:df2:3b00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:3c00::,2001:df2:3c07:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:3d00::,2001:df2:3d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3e00::,2001:df2:3e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:3f00::,2001:df2:3f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:4000::,2001:df2:4000:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:4100::,2001:df2:4100:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:4200::,2001:df2:4200:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:4300::,2001:df2:4300:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:4400::,2001:df2:4400:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:4500::,2001:df2:4500:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:4600::,2001:df2:4600:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:4700::,2001:df2:4700:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:4900::,2001:df2:4900:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:4a00::,2001:df2:4a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:4b00::,2001:df2:4b00:ffff:ffff:ffff:ffff:ffff,FJ -2001:df2:4c00::,2001:df2:4c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:4e00::,2001:df2:4e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:4f00::,2001:df2:4f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:5100::,2001:df2:5100:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:5200::,2001:df2:5200:ffff:ffff:ffff:ffff:ffff,CN -2001:df2:5300::,2001:df2:5300:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:5400::,2001:df2:5400:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:5500::,2001:df2:5500:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:5600::,2001:df2:5600:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:5700::,2001:df2:5700:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:5800::,2001:df2:5800:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:5900::,2001:df2:5900:ffff:ffff:ffff:ffff:ffff,LK -2001:df2:5a00::,2001:df2:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:5b00::,2001:df2:5b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:5c00::,2001:df2:5c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:5d00::,2001:df2:5d00:ffff:ffff:ffff:ffff:ffff,MN -2001:df2:5e00::,2001:df2:5e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:5f00::,2001:df2:5f00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:6000::,2001:df2:6000:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:6100::,2001:df2:6100:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:6200::,2001:df2:6200:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:6300::,2001:df2:6300:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:6400::,2001:df2:6400:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:6500::,2001:df2:6500:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:6600::,2001:df2:6600:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:6700::,2001:df2:6700:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:6800::,2001:df2:6800:ffff:ffff:ffff:ffff:ffff,PH -2001:df2:6900::,2001:df2:6900:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:6a00::,2001:df2:6a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:6b00::,2001:df2:6b00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:6c00::,2001:df2:6c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:6d00::,2001:df2:6d00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:6e00::,2001:df2:6e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:6f00::,2001:df2:6f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:7000::,2001:df2:7000:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:7100::,2001:df2:7100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:7200::,2001:df2:7200:ffff:ffff:ffff:ffff:ffff,BD -2001:df2:7300::,2001:df2:7300:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:7400::,2001:df2:7400:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:7500::,2001:df2:7500:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:7600::,2001:df2:7600:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:7700::,2001:df2:7700:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:7800::,2001:df2:7800:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:7900::,2001:df2:7900:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:7a00::,2001:df2:7a00:ffff:ffff:ffff:ffff:ffff,PH -2001:df2:7b00::,2001:df2:7b00:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:7c00::,2001:df2:7c00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:7d00::,2001:df2:7d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:7e00::,2001:df2:7e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:7e01::,2001:df2:7e01:ffff:ffff:ffff:ffff:ffff,SG -2001:df2:7f00::,2001:df2:7f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN -2001:df2:8100::,2001:df2:8100:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:8200::,2001:df2:8201:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:8300::,2001:df2:8300:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:8400::,2001:df2:8401:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:8500::,2001:df2:8500:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:8600::,2001:df2:8600:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:8700::,2001:df2:8700:ffff:ffff:ffff:ffff:ffff,PK -2001:df2:8800::,2001:df2:8800:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:8900::,2001:df2:8900:ffff:ffff:ffff:ffff:ffff,BD -2001:df2:8a00::,2001:df2:8a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:8b00::,2001:df2:8b00:ffff:ffff:ffff:ffff:ffff,NP -2001:df2:8c00::,2001:df2:8c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:8d00::,2001:df2:8d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:8e00::,2001:df2:8e00:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:8f00::,2001:df2:8f00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:9100::,2001:df2:9100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:9200::,2001:df2:9200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:9300::,2001:df2:9300:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:9400::,2001:df2:9400:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:9500::,2001:df2:9500:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:9600::,2001:df2:9600:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:9700::,2001:df2:9700:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:9800::,2001:df2:9803:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:9900::,2001:df2:9900:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:9a00::,2001:df2:9a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:9b00::,2001:df2:9b00:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:9c00::,2001:df2:9c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:9d00::,2001:df2:9d07:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:9e00::,2001:df2:9e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:9f00::,2001:df2:9f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:a000::,2001:df2:a000:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:a100::,2001:df2:a100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:a200::,2001:df2:a200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:a300::,2001:df2:a300:ffff:ffff:ffff:ffff:ffff,US -2001:df2:a400::,2001:df2:a400:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:a500::,2001:df2:a500:ffff:ffff:ffff:ffff:ffff,KH -2001:df2:a600::,2001:df2:a600:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:a700::,2001:df2:a700:ffff:ffff:ffff:ffff:ffff,VU -2001:df2:a800::,2001:df2:a800:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:a900::,2001:df2:a900:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:aa00::,2001:df2:aa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:ab00::,2001:df2:ab00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:ac00::,2001:df2:ac01:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:ad00::,2001:df2:ad00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:ae00::,2001:df2:ae00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:af00::,2001:df2:af00:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:b000::,2001:df2:b000:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:b100::,2001:df2:b100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:b200::,2001:df2:b200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:b300::,2001:df2:b300:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:b400::,2001:df2:b400:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:b500::,2001:df2:b500:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:b600::,2001:df2:b600:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:b700::,2001:df2:b700:ffff:ffff:ffff:ffff:ffff,NP -2001:df2:b900::,2001:df2:b900:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:ba00::,2001:df2:ba00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:bb00::,2001:df2:bb00:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:bc00::,2001:df2:bc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:bd00::,2001:df2:bd00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:be00::,2001:df2:be00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:bf00::,2001:df2:bf00:ffff:ffff:ffff:ffff:ffff,US -2001:df2:c000::,2001:df2:c000:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:c100::,2001:df2:c100:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:c200::,2001:df2:c200:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:c300::,2001:df2:c300:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:c400::,2001:df2:c400:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:c500::,2001:df2:c500:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:c600::,2001:df2:c600:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:c700::,2001:df2:c700:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:c800::,2001:df2:c800:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:c900::,2001:df2:c900:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:ca00::,2001:df2:ca00:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:cb00::,2001:df2:cb00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:cc00::,2001:df2:cc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:cd00::,2001:df2:cd00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:ce00::,2001:df2:ce00:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:cf00::,2001:df2:cf00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:d000::,2001:df2:d000:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:d100::,2001:df2:d100:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:d200::,2001:df2:d200:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:d300::,2001:df2:d300:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:d400::,2001:df2:d400:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:d500::,2001:df2:d500:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:d600::,2001:df2:d600:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:d700::,2001:df2:d700:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:d800::,2001:df2:d800:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:d900::,2001:df2:d900:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:da00::,2001:df2:da00:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:db00::,2001:df2:db00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:dc00::,2001:df2:dc00:ffff:ffff:ffff:ffff:ffff,TH -2001:df2:dd00::,2001:df2:dd00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:de00::,2001:df2:de00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:df00::,2001:df2:df00:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:e100::,2001:df2:e100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:e200::,2001:df2:e200:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:e300::,2001:df2:e300:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:e400::,2001:df2:e400:ffff:ffff:ffff:ffff:ffff,PH -2001:df2:e500::,2001:df2:e500:ffff:ffff:ffff:ffff:ffff,US -2001:df2:e600::,2001:df2:e600:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:e700::,2001:df2:e700:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:e800::,2001:df2:e800:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:e900::,2001:df2:e900:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:ea00::,2001:df2:ea00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:eb00::,2001:df2:eb00:ffff:ffff:ffff:ffff:ffff,MY -2001:df2:ec00::,2001:df2:ec00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:ed00::,2001:df2:ed00:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:ee00::,2001:df2:ee01:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:ef00::,2001:df2:ef00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:f000::,2001:df2:f000:ffff:ffff:ffff:ffff:ffff,VN -2001:df2:f100::,2001:df2:f100:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:f200::,2001:df2:f200:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:f300::,2001:df2:f300:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:f400::,2001:df2:f400:ffff:ffff:ffff:ffff:ffff,HK -2001:df2:f500::,2001:df2:f500:ffff:ffff:ffff:ffff:ffff,AU -2001:df2:f600::,2001:df2:f600:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:f700::,2001:df2:f700:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:f800::,2001:df2:f800:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:f900::,2001:df2:f900:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:fa00::,2001:df2:fa00:ffff:ffff:ffff:ffff:ffff,IN -2001:df2:fb00::,2001:df2:fb00:ffff:ffff:ffff:ffff:ffff,ID -2001:df2:fc00::,2001:df2:fc00:ffff:ffff:ffff:ffff:ffff,JP -2001:df2:fd00::,2001:df2:fd00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df2:fe00::,2001:df2:fe00:ffff:ffff:ffff:ffff:ffff,US -2001:df2:ff00::,2001:df2:ff00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3::,2001:df3::ffff:ffff:ffff:ffff:ffff,MY -2001:df3:100::,2001:df3:101:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:200::,2001:df3:200:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:300::,2001:df3:300:ffff:ffff:ffff:ffff:ffff,MV -2001:df3:400::,2001:df3:400:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:500::,2001:df3:500:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:600::,2001:df3:600:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:700::,2001:df3:700:ffff:ffff:ffff:ffff:ffff,PK -2001:df3:800::,2001:df3:80d:ffff:ffff:ffff:ffff:ffff,US -2001:df3:80e::,2001:df3:80e:7fff:ffff:ffff:ffff:ffff,IN -2001:df3:80e:8000::,2001:df3:81f:ffff:ffff:ffff:ffff:ffff,US -2001:df3:900::,2001:df3:900:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:a00::,2001:df3:a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:b00::,2001:df3:b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:c00::,2001:df3:c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:d00::,2001:df3:d00:ffff:ffff:ffff:ffff:ffff,CH -2001:df3:e00::,2001:df3:e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:f00::,2001:df3:f00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:1000::,2001:df3:1000:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:1100::,2001:df3:1100:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:1200::,2001:df3:1200:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:1300::,2001:df3:1300:ffff:ffff:ffff:ffff:ffff,MM -2001:df3:1400::,2001:df3:1400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:1500::,2001:df3:1500:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:1600::,2001:df3:1600:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:1700::,2001:df3:1700:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:1800::,2001:df3:1800:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:1900::,2001:df3:1900:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:1b00::,2001:df3:1b00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:1d00::,2001:df3:1d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:1e00::,2001:df3:1e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:1f00::,2001:df3:1f00:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:2000::,2001:df3:2000:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:2100::,2001:df3:2100:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:2200::,2001:df3:2200:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:2300::,2001:df3:2300:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:2400::,2001:df3:2400:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:2500::,2001:df3:2500:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:2600::,2001:df3:2600:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:2700::,2001:df3:2700:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:2800::,2001:df3:2800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:2900::,2001:df3:2900:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:2a00::,2001:df3:2a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:2b00::,2001:df3:2b00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:2c00::,2001:df3:2c00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:2d00::,2001:df3:2d00:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:2e00::,2001:df3:2e00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:2f00::,2001:df3:2f00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:3000::,2001:df3:3000:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3100::,2001:df3:3100:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:3200::,2001:df3:3200:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3300::,2001:df3:3300:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:3400::,2001:df3:3400:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:3500::,2001:df3:3500:ffff:ffff:ffff:ffff:ffff,SE -2001:df3:3600::,2001:df3:3601:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3700::,2001:df3:3700:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:3900::,2001:df3:3900:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:3a00::,2001:df3:3a00:ffff:ffff:ffff:ffff:ffff,PH -2001:df3:3b00::,2001:df3:3b00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:3c00::,2001:df3:3c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3d00::,2001:df3:3d00:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:3f00::,2001:df3:3f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:4100::,2001:df3:4100:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:4200::,2001:df3:4200:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:4300::,2001:df3:4300:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:4400::,2001:df3:4400:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:4500::,2001:df3:4500:ffff:ffff:ffff:ffff:ffff,PH -2001:df3:4600::,2001:df3:4600:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:4700::,2001:df3:4700:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:4800::,2001:df3:4800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:4900::,2001:df3:4900:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:4a00::,2001:df3:4a00:ffff:ffff:ffff:ffff:ffff,PH -2001:df3:4b00::,2001:df3:4b00:ffff:ffff:ffff:ffff:ffff,US -2001:df3:4c00::,2001:df3:4c00:ffff:ffff:ffff:ffff:ffff,PG -2001:df3:4d00::,2001:df3:4d00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:4e00::,2001:df3:4e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:4f00::,2001:df3:4f00:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:5000::,2001:df3:5000:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:5100::,2001:df3:5100:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:5200::,2001:df3:5200:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:5300::,2001:df3:5300:ffff:ffff:ffff:ffff:ffff,NP -2001:df3:5400::,2001:df3:5400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:5500::,2001:df3:5500:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:5600::,2001:df3:5600:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:5700::,2001:df3:5700:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:5800::,2001:df3:5800:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:5900::,2001:df3:5900:ffff:ffff:ffff:ffff:ffff,KH -2001:df3:5a00::,2001:df3:5a00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:5b00::,2001:df3:5b00:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:5c00::,2001:df3:5c00:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:5d00::,2001:df3:5d00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:5e00::,2001:df3:5e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:5f00::,2001:df3:5f00:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:6000::,2001:df3:6000:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:6100::,2001:df3:6100:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:6200::,2001:df3:6200:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:6400::,2001:df3:6400:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:6600::,2001:df3:6600:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:6800::,2001:df3:6800:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:6a00::,2001:df3:6a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:6c00::,2001:df3:6c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:6e00::,2001:df3:6e00:ffff:ffff:ffff:ffff:ffff,TW -2001:df3:7000::,2001:df3:7000:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:7200::,2001:df3:7200:ffff:ffff:ffff:ffff:ffff,PH -2001:df3:7400::,2001:df3:7400:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:7600::,2001:df3:7600:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:7800::,2001:df3:7800:ffff:ffff:ffff:ffff:ffff,SG -2001:df3:7a00::,2001:df3:7a00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:7c00::,2001:df3:7c00:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:7e00::,2001:df3:7e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:8000::,2001:df3:8000:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:8200::,2001:df3:8200:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:8400::,2001:df3:8400:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:8600::,2001:df3:8600:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:8800::,2001:df3:8800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:8a00::,2001:df3:8a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:8e00::,2001:df3:8e00:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:9200::,2001:df3:9200:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:9400::,2001:df3:9400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:9600::,2001:df3:9600:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:9a00::,2001:df3:9a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:9c00::,2001:df3:9c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:9e00::,2001:df3:9e00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:a000::,2001:df3:a003:ffff:ffff:ffff:ffff:ffff,PH -2001:df3:a200::,2001:df3:a200:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:a400::,2001:df3:a400:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:a600::,2001:df3:a600:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:a800::,2001:df3:a800:ffff:ffff:ffff:ffff:ffff,MY -2001:df3:aa00::,2001:df3:aa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:ac00::,2001:df3:ac00:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:ae00::,2001:df3:ae00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:b000::,2001:df3:b000:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:b200::,2001:df3:b200:ffff:ffff:ffff:ffff:ffff,PK -2001:df3:b400::,2001:df3:b400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:b600::,2001:df3:b600:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:b800::,2001:df3:b800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:ba00::,2001:df3:ba00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:bc00::,2001:df3:bc00:ffff:ffff:ffff:ffff:ffff,JP -2001:df3:be00::,2001:df3:be00:ffff:ffff:ffff:ffff:ffff,BD -2001:df3:c000::,2001:df3:c000:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:c200::,2001:df3:c200:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:c400::,2001:df3:c400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:c600::,2001:df3:c600:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:c800::,2001:df3:c800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:ca00::,2001:df3:ca00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:cc00::,2001:df3:cc00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:ce00::,2001:df3:ce00:ffff:ffff:ffff:ffff:ffff,MM -2001:df3:d000::,2001:df3:d000:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:d200::,2001:df3:d200:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:d400::,2001:df3:d400:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:d600::,2001:df3:d600:ffff:ffff:ffff:ffff:ffff,AF -2001:df3:da00::,2001:df3:da00:ffff:ffff:ffff:ffff:ffff,US -2001:df3:dc00::,2001:df3:dc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:de00::,2001:df3:de00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:e000::,2001:df3:e000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df3:e200::,2001:df3:e200:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:e400::,2001:df3:e400:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:e600::,2001:df3:e600:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:e800::,2001:df3:e800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:ea00::,2001:df3:ea00:ffff:ffff:ffff:ffff:ffff,MV -2001:df3:ee00::,2001:df3:ee00:ffff:ffff:ffff:ffff:ffff,TH -2001:df3:f000::,2001:df3:f000:ffff:ffff:ffff:ffff:ffff,ID -2001:df3:f200::,2001:df3:f200:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:f400::,2001:df3:f400:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:f600::,2001:df3:f600:ffff:ffff:ffff:ffff:ffff,VN -2001:df3:f800::,2001:df3:f800:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:fa00::,2001:df3:fa00:ffff:ffff:ffff:ffff:ffff,AU -2001:df3:fc00::,2001:df3:fc00:ffff:ffff:ffff:ffff:ffff,HK -2001:df3:fe00::,2001:df3:fe00:ffff:ffff:ffff:ffff:ffff,ID -2001:df4::,2001:df4::ffff:ffff:ffff:ffff:ffff,MY -2001:df4:200::,2001:df4:200:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:400::,2001:df4:400:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:600::,2001:df4:600:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:800::,2001:df4:800:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:a00::,2001:df4:a00:ffff:ffff:ffff:ffff:ffff,NP -2001:df4:c00::,2001:df4:c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:e00::,2001:df4:e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:1000::,2001:df4:1000:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:1200::,2001:df4:1200:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:1400::,2001:df4:1400:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:1600::,2001:df4:1600:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:1800::,2001:df4:1800:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:1a00::,2001:df4:1a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:1c00::,2001:df4:1c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:1e00::,2001:df4:1e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:2000::,2001:df4:2000:ffff:ffff:ffff:ffff:ffff,TH -2001:df4:2200::,2001:df4:2200:ffff:ffff:ffff:ffff:ffff,MY -2001:df4:2400::,2001:df4:2400:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:2600::,2001:df4:2600:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:2800::,2001:df4:2800:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:2a00::,2001:df4:2a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:2c00::,2001:df4:2c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:2e00::,2001:df4:2e00:ffff:ffff:ffff:ffff:ffff,BD -2001:df4:3000::,2001:df4:3000:ffff:ffff:ffff:ffff:ffff,TH -2001:df4:3200::,2001:df4:3200:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:3400::,2001:df4:3400:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:3600::,2001:df4:3600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:3800::,2001:df4:3800:ffff:ffff:ffff:ffff:ffff,BD -2001:df4:3a00::,2001:df4:3a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:3c00::,2001:df4:3c00:ffff:ffff:ffff:ffff:ffff,BD -2001:df4:3e00::,2001:df4:3e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:4000::,2001:df4:400f:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:4200::,2001:df4:4200:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:4400::,2001:df4:4400:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:4600::,2001:df4:4600:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:4c00::,2001:df4:4c00:ffff:ffff:ffff:ffff:ffff,MY -2001:df4:4e00::,2001:df4:4e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:5000::,2001:df4:5000:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:5200::,2001:df4:5200:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:5400::,2001:df4:5400:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:5600::,2001:df4:5600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:5800::,2001:df4:5800:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:5a00::,2001:df4:5a00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df4:5c00::,2001:df4:5c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:5e00::,2001:df4:5e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:6000::,2001:df4:6000:ffff:ffff:ffff:ffff:ffff,MY -2001:df4:6200::,2001:df4:6200:ffff:ffff:ffff:ffff:ffff,PK -2001:df4:6400::,2001:df4:6400:ffff:ffff:ffff:ffff:ffff,LA -2001:df4:6600::,2001:df4:6600:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:6800::,2001:df4:6800:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:6a00::,2001:df4:6a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:6c00::,2001:df4:6c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:6e00::,2001:df4:6e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:7000::,2001:df4:7000:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:7200::,2001:df4:7200:ffff:ffff:ffff:ffff:ffff,JP -2001:df4:7400::,2001:df4:7400:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:7600::,2001:df4:7600:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:7a00::,2001:df4:7a00:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:7c00::,2001:df4:7c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:7e00::,2001:df4:7e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:8000::,2001:df4:8000:ffff:ffff:ffff:ffff:ffff,MY -2001:df4:8200::,2001:df4:8200:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:8400::,2001:df4:8400:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:8600::,2001:df4:8600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:8a00::,2001:df4:8a00:ffff:ffff:ffff:ffff:ffff,TW -2001:df4:8c00::,2001:df4:8c00:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:8e00::,2001:df4:8e00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df4:9000::,2001:df4:9000:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:9200::,2001:df4:9200:ffff:ffff:ffff:ffff:ffff,NZ -2001:df4:9600::,2001:df4:9600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:9800::,2001:df4:9800:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:9a00::,2001:df4:9a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:9c00::,2001:df4:9c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:9e00::,2001:df4:9e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:a000::,2001:df4:a000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df4:a200::,2001:df4:a200:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:a400::,2001:df4:a400:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:a600::,2001:df4:a600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:a800::,2001:df4:a800:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:aa00::,2001:df4:aa00:ffff:ffff:ffff:ffff:ffff,PK -2001:df4:ac00::,2001:df4:ac00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ae00::,2001:df4:ae00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:b000::,2001:df4:b000:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:b200::,2001:df4:b200:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:b400::,2001:df4:b400:ffff:ffff:ffff:ffff:ffff,JP -2001:df4:b600::,2001:df4:b600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ba00::,2001:df4:ba01:ffff:ffff:ffff:ffff:ffff,PH -2001:df4:bc00::,2001:df4:bc00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:be00::,2001:df4:be00:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID -2001:df4:c200::,2001:df4:c200:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:c400::,2001:df4:c400:ffff:ffff:ffff:ffff:ffff,VN -2001:df4:c600::,2001:df4:c600:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:c800::,2001:df4:c800:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:ca00::,2001:df4:ca00:ffff:ffff:ffff:ffff:ffff,NP -2001:df4:cc00::,2001:df4:cc00:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:ce00::,2001:df4:ce00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:d000::,2001:df4:d000:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:d200::,2001:df4:d200:ffff:ffff:ffff:ffff:ffff,VN -2001:df4:d400::,2001:df4:d400:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:d600::,2001:df4:d600:ffff:ffff:ffff:ffff:ffff,VN -2001:df4:d800::,2001:df4:d800:ffff:ffff:ffff:ffff:ffff,VN -2001:df4:da00::,2001:df4:da00:ffff:ffff:ffff:ffff:ffff,VN -2001:df4:de00::,2001:df4:de00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:e000::,2001:df4:e000:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:e200::,2001:df4:e200:ffff:ffff:ffff:ffff:ffff,SG -2001:df4:e400::,2001:df4:e400:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:e600::,2001:df4:e600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:e800::,2001:df4:e800:ffff:ffff:ffff:ffff:ffff,MN -2001:df4:ea00::,2001:df4:ea00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ec00::,2001:df4:ec00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ee00::,2001:df4:ee00:ffff:ffff:ffff:ffff:ffff,HK -2001:df4:f000::,2001:df4:f000:ffff:ffff:ffff:ffff:ffff,IN -2001:df4:f200::,2001:df4:f200:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:f400::,2001:df4:f400:ffff:ffff:ffff:ffff:ffff,BD -2001:df4:f600::,2001:df4:f600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:f800::,2001:df4:f800:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:fa00::,2001:df4:fa00:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:fc00::,2001:df4:fc00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df4:fe00::,2001:df4:fe00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5::,2001:df5::ffff:ffff:ffff:ffff:ffff,AU -2001:df5:200::,2001:df5:200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:400::,2001:df5:400:ffff:ffff:ffff:ffff:ffff,HK -2001:df5:600::,2001:df5:600:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:800::,2001:df5:800:ffff:ffff:ffff:ffff:ffff,HK -2001:df5:c00::,2001:df5:c00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:e00::,2001:df5:e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:1000::,2001:df5:1000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:1200::,2001:df5:1200:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:1400::,2001:df5:1400:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:1600::,2001:df5:1600:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:1a00::,2001:df5:1a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:1c00::,2001:df5:1c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:1e00::,2001:df5:1e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:2000::,2001:df5:2000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:2200::,2001:df5:2200:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:2400::,2001:df5:2400:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:2600::,2001:df5:2600:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:2800::,2001:df5:2800:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:2c00::,2001:df5:2c00:ffff:ffff:ffff:ffff:ffff,JP -2001:df5:2e00::,2001:df5:2e00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:3000::,2001:df5:3000:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:3200::,2001:df5:3200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:3400::,2001:df5:3400:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:3600::,2001:df5:3600:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:3800::,2001:df5:3800:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:3a00::,2001:df5:3a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:3c00::,2001:df5:3c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:3e00::,2001:df5:3e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:4000::,2001:df5:4000:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:4200::,2001:df5:4200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:4400::,2001:df5:4400:ffff:ffff:ffff:ffff:ffff,PH -2001:df5:4600::,2001:df5:4600:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:4800::,2001:df5:4800:ffff:ffff:ffff:ffff:ffff,BN -2001:df5:4a00::,2001:df5:4a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df5:4c00::,2001:df5:4c01:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:4e00::,2001:df5:4e00:ffff:ffff:ffff:ffff:ffff,MY -2001:df5:5200::,2001:df5:5200:ffff:ffff:ffff:ffff:ffff,HK -2001:df5:5600::,2001:df5:5600:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:5800::,2001:df5:5800:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:5a00::,2001:df5:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:5e00::,2001:df5:5e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:6000::,2001:df5:6000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:6200::,2001:df5:6200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:6400::,2001:df5:6400:ffff:ffff:ffff:ffff:ffff,JP -2001:df5:6600::,2001:df5:6600:ffff:ffff:ffff:ffff:ffff,BD -2001:df5:6800::,2001:df5:6800:ffff:ffff:ffff:ffff:ffff,KR -2001:df5:6a00::,2001:df5:6a00:ffff:ffff:ffff:ffff:ffff,MV -2001:df5:6c00::,2001:df5:6c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:6e00::,2001:df5:6e00:ffff:ffff:ffff:ffff:ffff,NC -2001:df5:7000::,2001:df5:7000:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:7200::,2001:df5:7200:ffff:ffff:ffff:ffff:ffff,BD -2001:df5:7400::,2001:df5:7400:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:7600::,2001:df5:7600:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN -2001:df5:7a00::,2001:df5:7a00:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:7c00::,2001:df5:7c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:7e00::,2001:df5:7e00:ffff:ffff:ffff:ffff:ffff,BD -2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:8200::,2001:df5:8200:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:8400::,2001:df5:8400:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:8600::,2001:df5:8600:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:8800::,2001:df5:8800:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:8a00::,2001:df5:8a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df5:8c00::,2001:df5:8c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:8e00::,2001:df5:8e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:9000::,2001:df5:9000:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:9200::,2001:df5:9200:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:9600::,2001:df5:9600:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:9800::,2001:df5:9800:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:9a00::,2001:df5:9a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:9c00::,2001:df5:9c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:9e00::,2001:df5:9e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:a000::,2001:df5:a000:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:a200::,2001:df5:a200:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:a400::,2001:df5:a400:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:a600::,2001:df5:a600:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:a800::,2001:df5:a800:ffff:ffff:ffff:ffff:ffff,NL -2001:df5:aa00::,2001:df5:aa00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:ac00::,2001:df5:ac00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:ae00::,2001:df5:ae00:ffff:ffff:ffff:ffff:ffff,PH -2001:df5:b000::,2001:df5:b000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:b200::,2001:df5:b200:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:b400::,2001:df5:b400:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:b600::,2001:df5:b600:ffff:ffff:ffff:ffff:ffff,NZ -2001:df5:b800::,2001:df5:b800:ffff:ffff:ffff:ffff:ffff,HK -2001:df5:ba00::,2001:df5:ba00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:bc00::,2001:df5:bc00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:be00::,2001:df5:be00:ffff:ffff:ffff:ffff:ffff,VN -2001:df5:c200::,2001:df5:c200:ffff:ffff:ffff:ffff:ffff,VN -2001:df5:c400::,2001:df5:c400:ffff:ffff:ffff:ffff:ffff,TH -2001:df5:c800::,2001:df5:c800:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:ca00::,2001:df5:ca00:ffff:ffff:ffff:ffff:ffff,TH -2001:df5:cc00::,2001:df5:cc00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:ce00::,2001:df5:ce00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:d000::,2001:df5:d000:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:d200::,2001:df5:d200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:d400::,2001:df5:d400:ffff:ffff:ffff:ffff:ffff,HK -2001:df5:d401::,2001:df5:d401:ffff:ffff:ffff:ffff:ffff,JP -2001:df5:d600::,2001:df5:d600:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:d800::,2001:df5:d800:ffff:ffff:ffff:ffff:ffff,SG -2001:df5:da00::,2001:df5:da00:ffff:ffff:ffff:ffff:ffff,PH -2001:df5:de00::,2001:df5:de00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:e000::,2001:df5:e000:ffff:ffff:ffff:ffff:ffff,MY -2001:df5:e200::,2001:df5:e200:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:e600::,2001:df5:e600:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:e800::,2001:df5:e800:ffff:ffff:ffff:ffff:ffff,PH -2001:df5:ea00::,2001:df5:ea00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:ec00::,2001:df5:ec00:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:ee00::,2001:df5:ee00:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:f000::,2001:df5:f000:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:f200::,2001:df5:f200:ffff:ffff:ffff:ffff:ffff,ID -2001:df5:f400::,2001:df5:f401:ffff:ffff:ffff:ffff:ffff,AU -2001:df5:f600::,2001:df5:f600:ffff:ffff:ffff:ffff:ffff,PH -2001:df5:f800::,2001:df5:f800:ffff:ffff:ffff:ffff:ffff,SE -2001:df5:fa00::,2001:df5:fa00:ffff:ffff:ffff:ffff:ffff,FJ -2001:df5:fc00::,2001:df5:fc00:ffff:ffff:ffff:ffff:ffff,IN -2001:df5:fe00::,2001:df5:fe00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6::,2001:df6:3:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:200::,2001:df6:200:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:400::,2001:df6:400:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:600::,2001:df6:600:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:800::,2001:df6:80f:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:a00::,2001:df6:a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:e00::,2001:df6:e00:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:1000::,2001:df6:1000:ffff:ffff:ffff:ffff:ffff,PH -2001:df6:1200::,2001:df6:1200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:1400::,2001:df6:1400:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:1600::,2001:df6:1600:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:1800::,2001:df6:1800:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:1a00::,2001:df6:1a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:1c00::,2001:df6:1c00:ffff:ffff:ffff:ffff:ffff,CN -2001:df6:1e00::,2001:df6:1e00:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:2000::,2001:df6:2001:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:2200::,2001:df6:2200:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:2400::,2001:df6:2400:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:2600::,2001:df6:2600:ffff:ffff:ffff:ffff:ffff,US -2001:df6:2800::,2001:df6:2800:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:2a00::,2001:df6:2a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:2c00::,2001:df6:2c00:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:2e00::,2001:df6:2e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:3000::,2001:df6:3000:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:3200::,2001:df6:3200:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:3400::,2001:df6:3400:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:3600::,2001:df6:3600:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:3800::,2001:df6:3800:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:3a00::,2001:df6:3a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:3c00::,2001:df6:3c00:ffff:ffff:ffff:ffff:ffff,PK -2001:df6:3e00::,2001:df6:3e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:4000::,2001:df6:4001:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:4200::,2001:df6:4200:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:4400::,2001:df6:4400:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:4600::,2001:df6:4600:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:4800::,2001:df6:4801:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:4c00::,2001:df6:4c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:4e00::,2001:df6:4e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:5200::,2001:df6:5200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:5600::,2001:df6:5600:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:5800::,2001:df6:5800:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:5a00::,2001:df6:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:5c00::,2001:df6:5c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:5e00::,2001:df6:5e01:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:6000::,2001:df6:6000:ffff:ffff:ffff:ffff:ffff,JP -2001:df6:6200::,2001:df6:6200:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:6400::,2001:df6:6400:ffff:ffff:ffff:ffff:ffff,SG -2001:df6:6600::,2001:df6:6600:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:6800::,2001:df6:6800:ffff:ffff:ffff:ffff:ffff,CN -2001:df6:6a00::,2001:df6:6a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:6c00::,2001:df6:6c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:6e00::,2001:df6:6e00:ffff:ffff:ffff:ffff:ffff,MY -2001:df6:7000::,2001:df6:7000:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:7200::,2001:df6:7200:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:7400::,2001:df6:7400:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:7600::,2001:df6:7600:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:7800::,2001:df6:7800:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:7a00::,2001:df6:7a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:7c00::,2001:df6:7c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:8000::,2001:df6:8000:ffff:ffff:ffff:ffff:ffff,JP -2001:df6:8200::,2001:df6:8200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:8400::,2001:df6:8400:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:8600::,2001:df6:8600:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:8800::,2001:df6:8800:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:8a00::,2001:df6:8a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:8e00::,2001:df6:8e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:9000::,2001:df6:9000:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:9200::,2001:df6:9200:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:9400::,2001:df6:9400:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:9600::,2001:df6:9600:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:9800::,2001:df6:9800:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:9a00::,2001:df6:9a00:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:9c00::,2001:df6:9c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:9e00::,2001:df6:9e01:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:a000::,2001:df6:a000:ffff:ffff:ffff:ffff:ffff,JP -2001:df6:a200::,2001:df6:a200:ffff:ffff:ffff:ffff:ffff,BD -2001:df6:a400::,2001:df6:a400:ffff:ffff:ffff:ffff:ffff,SG -2001:df6:a600::,2001:df6:a600:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:a800::,2001:df6:a800:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:aa00::,2001:df6:aa00:ffff:ffff:ffff:ffff:ffff,VN -2001:df6:ac00::,2001:df6:ac00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:ae00::,2001:df6:ae00:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:b000::,2001:df6:b000:ffff:ffff:ffff:ffff:ffff,TH -2001:df6:b200::,2001:df6:b200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:b400::,2001:df6:b400:ffff:ffff:ffff:ffff:ffff,MY -2001:df6:b600::,2001:df6:b600:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG -2001:df6:bc00::,2001:df6:bc00:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:be00::,2001:df6:be00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:c200::,2001:df6:c200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:c400::,2001:df6:c400:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:c600::,2001:df6:c600:ffff:ffff:ffff:ffff:ffff,BD -2001:df6:c800::,2001:df6:c801:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:ca00::,2001:df6:ca00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:cc00::,2001:df6:cc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:ce00::,2001:df6:ce00:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:d000::,2001:df6:d000:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:d200::,2001:df6:d200:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:d400::,2001:df6:d400:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:d600::,2001:df6:d600:ffff:ffff:ffff:ffff:ffff,BD -2001:df6:d800::,2001:df6:d800:ffff:ffff:ffff:ffff:ffff,BD -2001:df6:da00::,2001:df6:da00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:dc00::,2001:df6:dc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:de00::,2001:df6:de00:ffff:ffff:ffff:ffff:ffff,BD -2001:df6:e200::,2001:df6:e200:ffff:ffff:ffff:ffff:ffff,NZ -2001:df6:e400::,2001:df6:e400:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:e600::,2001:df6:e600:ffff:ffff:ffff:ffff:ffff,ES -2001:df6:e800::,2001:df6:e800:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:ea00::,2001:df6:ea00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:ec00::,2001:df6:ec00:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:ee00::,2001:df6:ee00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:f000::,2001:df6:f000:ffff:ffff:ffff:ffff:ffff,HK -2001:df6:f200::,2001:df6:f200:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:f400::,2001:df6:f400:ffff:ffff:ffff:ffff:ffff,CN -2001:df6:f600::,2001:df6:f600:ffff:ffff:ffff:ffff:ffff,ID -2001:df6:f800::,2001:df6:f800:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:fa00::,2001:df6:fa00:ffff:ffff:ffff:ffff:ffff,IN -2001:df6:fc00::,2001:df6:fc00:ffff:ffff:ffff:ffff:ffff,AU -2001:df6:fe00::,2001:df6:fe00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7::,2001:df7::ffff:ffff:ffff:ffff:ffff,IN -2001:df7:200::,2001:df7:203:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:400::,2001:df7:400:ffff:ffff:ffff:ffff:ffff,HK -2001:df7:600::,2001:df7:600:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:800::,2001:df7:800:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:a00::,2001:df7:a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:c00::,2001:df7:c00:ffff:ffff:ffff:ffff:ffff,TW -2001:df7:e00::,2001:df7:e00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df7:1000::,2001:df7:1000:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:1200::,2001:df7:1200:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:1400::,2001:df7:1400:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:1a00::,2001:df7:1a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:1c00::,2001:df7:1c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:2200::,2001:df7:2200:ffff:ffff:ffff:ffff:ffff,TH -2001:df7:2400::,2001:df7:2400:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:2600::,2001:df7:2600:ffff:ffff:ffff:ffff:ffff,HK -2001:df7:2800::,2001:df7:2800:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:2a00::,2001:df7:2a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:2c00::,2001:df7:2c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:2e00::,2001:df7:2e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:3000::,2001:df7:3001:ffff:ffff:ffff:ffff:ffff,NZ -2001:df7:3200::,2001:df7:3200:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:3400::,2001:df7:3400:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:3600::,2001:df7:3600:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:3800::,2001:df7:3800:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:3c00::,2001:df7:3c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:3e00::,2001:df7:3e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:4000::,2001:df7:4000:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:4200::,2001:df7:4200:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:4400::,2001:df7:4400:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:4600::,2001:df7:4600:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:4800::,2001:df7:481f:ffff:ffff:ffff:ffff:ffff,JP -2001:df7:4a00::,2001:df7:4a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:4c00::,2001:df7:4c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:4e00::,2001:df7:4e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:5000::,2001:df7:5000:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:5200::,2001:df7:5200:ffff:ffff:ffff:ffff:ffff,NP -2001:df7:5400::,2001:df7:5400:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:5600::,2001:df7:5600:ffff:ffff:ffff:ffff:ffff,JP -2001:df7:5a00::,2001:df7:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:5e00::,2001:df7:5e00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:6200::,2001:df7:6200:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:6400::,2001:df7:6400:ffff:ffff:ffff:ffff:ffff,MY -2001:df7:6600::,2001:df7:6600:ffff:ffff:ffff:ffff:ffff,CN -2001:df7:6800::,2001:df7:6800:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:6a00::,2001:df7:6a00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:6c00::,2001:df7:6c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:6e00::,2001:df7:6e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:7000::,2001:df7:7000:ffff:ffff:ffff:ffff:ffff,HK -2001:df7:7200::,2001:df7:7200:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:7400::,2001:df7:7400:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:7600::,2001:df7:7600:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:7800::,2001:df7:7800:ffff:ffff:ffff:ffff:ffff,JP -2001:df7:7a00::,2001:df7:7a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:7c00::,2001:df7:7c00:ffff:ffff:ffff:ffff:ffff,TH -2001:df7:7e00::,2001:df7:7e00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:8200::,2001:df7:8200:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:8400::,2001:df7:8401:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:8600::,2001:df7:8600:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:8800::,2001:df7:8800:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:8a00::,2001:df7:8a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:8e00::,2001:df7:8e00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:9200::,2001:df7:921f:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:9400::,2001:df7:9400:ffff:ffff:ffff:ffff:ffff,US -2001:df7:9600::,2001:df7:9600:ffff:ffff:ffff:ffff:ffff,HK -2001:df7:9800::,2001:df7:9800:ffff:ffff:ffff:ffff:ffff,NZ -2001:df7:9a00::,2001:df7:9a00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:9c00::,2001:df7:9c00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:9e00::,2001:df7:9e00:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:a000::,2001:df7:a000:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:a200::,2001:df7:a200:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:a400::,2001:df7:a400:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:a401::,2001:df7:a401:7fff:ffff:ffff:ffff:ffff,TH -2001:df7:a401:8000::,2001:df7:a401:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:a600::,2001:df7:a600:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:a800::,2001:df7:a800:ffff:ffff:ffff:ffff:ffff,JP -2001:df7:aa00::,2001:df7:aa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:ac00::,2001:df7:ac00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:ae00::,2001:df7:ae00:ffff:ffff:ffff:ffff:ffff,NZ -2001:df7:b000::,2001:df7:b000:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:b200::,2001:df7:b200:ffff:ffff:ffff:ffff:ffff,PG -2001:df7:b400::,2001:df7:b400:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:b600::,2001:df7:b600:ffff:ffff:ffff:ffff:ffff,HK -2001:df7:b800::,2001:df7:b800:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:ba00::,2001:df7:ba00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:bc00::,2001:df7:bc00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:be00::,2001:df7:be00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:c000::,2001:df7:c003:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:c200::,2001:df7:c200:ffff:ffff:ffff:ffff:ffff,MM -2001:df7:c400::,2001:df7:c400:ffff:ffff:ffff:ffff:ffff,NZ -2001:df7:c600::,2001:df7:c600:ffff:ffff:ffff:ffff:ffff,VN -2001:df7:c800::,2001:df7:c800:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:ca00::,2001:df7:ca00:ffff:ffff:ffff:ffff:ffff,VN -2001:df7:cc00::,2001:df7:cc00:ffff:ffff:ffff:ffff:ffff,VN -2001:df7:ce00::,2001:df7:ce00:ffff:ffff:ffff:ffff:ffff,VN -2001:df7:d000::,2001:df7:d000:ffff:ffff:ffff:ffff:ffff,BD -2001:df7:d200::,2001:df7:d200:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:d400::,2001:df7:d400:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:d600::,2001:df7:d600:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:d800::,2001:df7:d800:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:da00::,2001:df7:da00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:dc00::,2001:df7:dc00:ffff:ffff:ffff:ffff:ffff,TH -2001:df7:de00::,2001:df7:de03:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:e000::,2001:df7:e000:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:e200::,2001:df7:e200:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:e400::,2001:df7:e400:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:e600::,2001:df7:e600:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:e800::,2001:df7:e800:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:ea00::,2001:df7:ea00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:ec00::,2001:df7:ec00:ffff:ffff:ffff:ffff:ffff,AU -2001:df7:ee00::,2001:df7:ee00:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:f000::,2001:df7:f000:ffff:ffff:ffff:ffff:ffff,JP -2001:df7:f200::,2001:df7:f200:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:f400::,2001:df7:f400:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:f600::,2001:df7:f600:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:f800::,2001:df7:f800:ffff:ffff:ffff:ffff:ffff,IN -2001:df7:fa00::,2001:df7:fa00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:fc00::,2001:df7:fc00:ffff:ffff:ffff:ffff:ffff,SG -2001:df7:fe00::,2001:df7:fe00:ffff:ffff:ffff:ffff:ffff,ID -2001:df8::,2001:df8:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:df9::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,NP -2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:e10::,2001:e10:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:e18::,2001:e18:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:e20::,2001:e20:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:e28::,2001:e28:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e30::,2001:e30:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:e38::,2001:e38:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e40::,2001:e47:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e48::,2001:e48:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:e58::,2001:e58:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e60::,2001:e60:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:e68::,2001:e68:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:e70::,2001:e70:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:e78::,2001:e78:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:e80::,2001:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:e88::,2001:e88:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:e90::,2001:e90:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:e98::,2001:e98:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ea0::,2001:ea0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ea8::,2001:ea8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:eb0::,2001:eb0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2001:eb8::,2001:eb8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ec0::,2001:ec0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:ed0::,2001:ed0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ed8::,2001:ed8:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:ee0::,2001:ee0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2001:ee8::,2001:ee8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ef0::,2001:ef0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:ef8::,2001:ef8:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:f00::,2001:f00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:f08::,2001:f08:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:f10::,2001:f10:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:f18::,2001:f18:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:f20::,2001:f20:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:f28::,2001:f28:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:f30::,2001:f30:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:f38::,2001:f38:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:f40::,2001:f40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:f48::,2001:f48:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:f50::,2001:f50:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:f58::,2001:f58:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:f60::,2001:f6f:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:f80::,2001:f80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:f88::,2001:f88:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:f90::,2001:f90:ffff:ffff:ffff:ffff:ffff:ffff,MO -2001:f98::,2001:f98:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:fa0::,2001:fa0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:fa8::,2001:fa8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:fb0::,2001:fb1:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:fc0::,2001:fc0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2001:fc8::,2001:fc8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:fd0::,2001:fd0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:fd8::,2001:fd8:ffff:ffff:ffff:ffff:ffff:ffff,PH -2001:fe0::,2001:fe0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2001:fe8::,2001:fe8:ffff:ffff:ffff:ffff:ffff:ffff,PK -2001:ff0::,2001:ff0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:ff8::,2001:ff8:ffff:ffff:ffff:ffff:ffff:ffff,MO -2001:1200::,2001:1200:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1208::,2001:1208:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1210::,2001:1210:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1218::,2001:1218:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1220::,2001:1221::ffff:ffff:ffff:ffff:ffff,MX -2001:1228::,2001:1228:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:122c::,2001:122c:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1230::,2001:1230:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1238::,2001:1238:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1240::,2001:1240:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1248::,2001:1248:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1250::,2001:1250:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1258::,2001:1258:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1260::,2001:1260:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1270::,2001:1270:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1278::,2001:1278:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:1280::,2001:1280:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1284::,2001:1284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1288::,2001:1288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:128c::,2001:128c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1290::,2001:1291:200:88fc:ffff:ffff:ffff:ffff,BR -2001:1291:200:88fd::,2001:1291:200:88fd:ffff:ffff:ffff:ffff,AR -2001:1291:200:88fe::,2001:1291:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1294::,2001:1294:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1298::,2001:1298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:129c::,2001:129c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12a0::,2001:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12a4::,2001:12a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12ac::,2001:12ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12b0::,2001:12b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12b4::,2001:12b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12b8::,2001:12b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12bc::,2001:12bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12c0::,2001:12c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12c4::,2001:12c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12c8::,2001:12c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12d0::,2001:12d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12d8::,2001:12d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12e0::,2001:12e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12e8::,2001:12e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12f0::,2001:12f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:12f8::,2001:12f8::ffff:ffff:ffff:ffff:ffff,BR -2001:12f8:2::,2001:12f8:d:ffff:ffff:ffff:ffff:ffff,BR -2001:12fe::,2001:12ff:ffff:ffff:ffff:ffff:ffff:ffff,BR -2001:1300::,2001:1300:ffff:ffff:ffff:ffff:ffff:ffff,PE -2001:1308::,2001:1308:ffff:ffff:ffff:ffff:ffff:ffff,DO -2001:1310::,2001:1310:ffff:ffff:ffff:ffff:ffff:ffff,CL -2001:1318::,2001:1318:ffff:ffff:ffff:ffff:ffff:ffff,AR -2001:1320::,2001:1320:ffff:ffff:ffff:ffff:ffff:ffff,PY -2001:1328::,2001:1328:ffff:ffff:ffff:ffff:ffff:ffff,UY -2001:1330::,2001:1337:ffff:ffff:ffff:ffff:ffff:ffff,CR -2001:1338::,2001:1338:ffff:ffff:ffff:ffff:ffff:ffff,VE -2001:1340::,2001:1340:ffff:ffff:ffff:ffff:ffff:ffff,CU -2001:1348::,2001:1348:ffff:ffff:ffff:ffff:ffff:ffff,UY -2001:1350::,2001:1350:ffff:ffff:ffff:ffff:ffff:ffff,VE -2001:1358::,2001:1358:ffff:ffff:ffff:ffff:ffff:ffff,CU -2001:1360::,2001:1360:ffff:ffff:ffff:ffff:ffff:ffff,GT -2001:1368::,2001:1368:ffff:ffff:ffff:ffff:ffff:ffff,PA -2001:1370::,2001:1370:ffff:ffff:ffff:ffff:ffff:ffff,HT -2001:1378::,2001:1378:ffff:ffff:ffff:ffff:ffff:ffff,BO -2001:1380::,2001:1380:ffff:ffff:ffff:ffff:ffff:ffff,PE -2001:1388::,2001:1388:ffff:ffff:ffff:ffff:ffff:ffff,PE -2001:1398::,2001:1398:ffff:ffff:ffff:ffff:ffff:ffff,CL -2001:13a0::,2001:13a0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2001:13a8::,2001:13a8:ffff:ffff:ffff:ffff:ffff:ffff,MX -2001:13b0::,2001:13b7:ffff:ffff:ffff:ffff:ffff:ffff,AR -2001:13c7:6000::,2001:13c7:6000:ffff:ffff:ffff:ffff:ffff,CO -2001:13c7:6001::,2001:13c7:6001:ffff:ffff:ffff:ffff:ffff,AR -2001:13c7:6002::,2001:13c7:6002:ffff:ffff:ffff:ffff:ffff,SX -2001:13c7:6003::,2001:13c7:6003:ffff:ffff:ffff:ffff:ffff,HT -2001:13c7:6004::,2001:13c7:6005:ffff:ffff:ffff:ffff:ffff,CW -2001:13c7:6006::,2001:13c7:6006:ffff:ffff:ffff:ffff:ffff,EC -2001:13c7:6007::,2001:13c7:600e:ffff:ffff:ffff:ffff:ffff,AR -2001:13c7:6010::,2001:13c7:601f:ffff:ffff:ffff:ffff:ffff,AR -2001:13c7:6f00::,2001:13c7:6fff:ffff:ffff:ffff:ffff:ffff,EC -2001:13c7:7000::,2001:13c7:7000:ffff:ffff:ffff:ffff:ffff,MX -2001:13c7:7001::,2001:13c7:7003:ffff:ffff:ffff:ffff:ffff,UY -2001:13c7:7004::,2001:13c7:7004:ffff:ffff:ffff:ffff:ffff,CR -2001:13c7:7005::,2001:13c7:7009:ffff:ffff:ffff:ffff:ffff,UY -2001:13c7:7010::,2001:13c7:7013:ffff:ffff:ffff:ffff:ffff,UY -2001:13c7:7014::,2001:13c7:7014:ffff:ffff:ffff:ffff:ffff,MX -2001:13c8::,2001:13c8:ffff:ffff:ffff:ffff:ffff:ffff,CU -2001:13d0::,2001:13d7:ffff:ffff:ffff:ffff:ffff:ffff,AR -2001:13d8::,2001:13d8:ffff:ffff:ffff:ffff:ffff:ffff,CR -2001:13e0::,2001:13e0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2001:13e8::,2001:13e8:ffff:ffff:ffff:ffff:ffff:ffff,AR -2001:13f0::,2001:13f0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2001:13f8::,2001:13f8:ffff:ffff:ffff:ffff:ffff:ffff,CO -2001:1400::,2001:1407:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:1408::,2001:1408:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:1410::,2001:1410:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1418::,2001:1418:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1420::,2001:1427:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1428::,2001:1428:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:1430::,2001:1430:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:1438::,2001:1438:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1440::,2001:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1448::,2001:1448:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:1450::,2001:1450:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1458::,2001:1459:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1460::,2001:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1468::,2001:1468:7fff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1468:8000::,2001:1468:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:1469::,2001:146b:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:146c::,2001:146c:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:146d::,2001:146e:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:146f::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1470::,2001:1477:ffff:ffff:ffff:ffff:ffff:ffff,SI -2001:1478::,2001:1478:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1488::,2001:1488:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1490::,2001:1490:ffff:ffff:ffff:ffff:ffff:ffff,SA -2001:1498::,2001:1498:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:14a0::,2001:14a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:14a8::,2001:14a8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:14b0::,2001:14b0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:14b8::,2001:14bf:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:14c0::,2001:14c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:14c8::,2001:14c8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:14d0::,2001:14d7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:14d8::,2001:14d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:14e0::,2001:14e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:14e8::,2001:14e8:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:14f0::,2001:14f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1500::,2001:1500:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:1508::,2001:1508:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1510::,2001:1510:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1520::,2001:1520:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1528::,2001:1528:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1530::,2001:1530:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:1538::,2001:1538:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1540::,2001:1540:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1548::,2001:1548:ffff:ffff:ffff:ffff:ffff:ffff,GR -2001:1558::,2001:1558:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1560::,2001:1567:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1568::,2001:1568:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1578::,2001:157f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1580::,2001:1580:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:1588::,2001:158f:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:1590::,2001:1590:ffff:ffff:ffff:ffff:ffff:ffff,SI -2001:1598::,2001:1598:ffff:ffff:ffff:ffff:ffff:ffff,BE -2001:15a8::,2001:15a8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:15b0::,2001:15b0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:15b8::,2001:15b8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:15c0::,2001:15c7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2001:15c8::,2001:15c8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:15d8::,2001:15df:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:15e0::,2001:15e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:15e8::,2001:15ef:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:15f0::,2001:15f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:15f8::,2001:15f8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:1600::,2001:1607:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1608::,2001:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1610::,2001:1617:ffff:ffff:ffff:ffff:ffff:ffff,LU -2001:1618::,2001:161f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:1620::,2001:1623:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1630::,2001:1637:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:1638::,2001:1638:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1640::,2001:1640:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1650::,2001:1650:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1658::,2001:1658:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:1660::,2001:1660:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:1668::,2001:1668:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1670::,2001:1670:ffff:ffff:ffff:ffff:ffff:ffff,OM -2001:1678::,2001:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1680::,2001:1687:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1688::,2001:168f:ffff:ffff:ffff:ffff:ffff:ffff,SI -2001:1690::,2001:1690:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1698::,2001:1698:ffff:ffff:ffff:ffff:ffff:ffff,LU -2001:16a0::,2001:16a2:596:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:597::,2001:16a2:597:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:597:8000::,2001:16a2:4367:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:4368::,2001:16a2:4368:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:4368:8000::,2001:16a2:82aa:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:82ab::,2001:16a2:82ab:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:82ab:8000::,2001:16a2:8452:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:8452:8000::,2001:16a2:8452:ffff:ffff:ffff:ffff:ffff,GB -2001:16a2:8453::,2001:16a2:84cc:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:84cc:8000::,2001:16a2:84cc:ffff:ffff:ffff:ffff:ffff,GB -2001:16a2:84cd::,2001:16a2:84da:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:84da:8000::,2001:16a2:84da:ffff:ffff:ffff:ffff:ffff,DE -2001:16a2:84db::,2001:16a2:85a7:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:85a8::,2001:16a2:85a8:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:85a8:8000::,2001:16a2:8601:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:8601:8000::,2001:16a2:8601:ffff:ffff:ffff:ffff:ffff,GB -2001:16a2:8602::,2001:16a2:861c:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:861d::,2001:16a2:861d:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:861d:8000::,2001:16a2:87a5:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:87a6::,2001:16a2:87a6:7fff:ffff:ffff:ffff:ffff,GB -2001:16a2:87a6:8000::,2001:16a2:8858:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:8858:8000::,2001:16a2:8858:ffff:ffff:ffff:ffff:ffff,GB -2001:16a2:8859::,2001:16a2:8baa:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:8baa:8000::,2001:16a2:8baa:ffff:ffff:ffff:ffff:ffff,GB -2001:16a2:8bab::,2001:16a2:96d7:7fff:ffff:ffff:ffff:ffff,SA -2001:16a2:96d7:8000::,2001:16a2:96d7:ffff:ffff:ffff:ffff:ffff,ZA -2001:16a2:96d8::,2001:16a2:b7d4:ffff:ffff:ffff:ffff:ffff,SA -2001:16a2:b7d5::,2001:16a2:b7d5:7fff:ffff:ffff:ffff:ffff,IN -2001:16a2:b7d5:8000::,2001:16a7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2001:16a8::,2001:16a8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:16b0::,2001:16b0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:16b8::,2001:16b8:2486:ffff:ffff:ffff:ffff:ffff,DE -2001:16b8:2487::,2001:16b8:2487:7fff:ffff:ffff:ffff:ffff,FR -2001:16b8:2487:8000::,2001:16b8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:16c0::,2001:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:16d0::,2001:16d0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:16d8::,2001:16d8:dd00:7fff:ffff:ffff:ffff:ffff,SE -2001:16d8:dd00:8000::,2001:16d8:dd00:ffff:ffff:ffff:ffff:ffff,DK -2001:16d8:dd01::,2001:16d8:dda3:ffff:ffff:ffff:ffff:ffff,SE -2001:16d8:dda4::,2001:16d8:dda4:7fff:ffff:ffff:ffff:ffff,DK -2001:16d8:dda4:8000::,2001:16d8:ddcd:ffff:ffff:ffff:ffff:ffff,SE -2001:16d8:ddce::,2001:16d8:ddce:7fff:ffff:ffff:ffff:ffff,DK -2001:16d8:ddce:8000::,2001:16d8:ee00:7fff:ffff:ffff:ffff:ffff,SE -2001:16d8:ee00:8000::,2001:16d8:ee00:ffff:ffff:ffff:ffff:ffff,NO -2001:16d8:ee01::,2001:16d8:ee5b:ffff:ffff:ffff:ffff:ffff,SE -2001:16d8:ee5c::,2001:16d8:ee5c:7fff:ffff:ffff:ffff:ffff,NO -2001:16d8:ee5c:8000::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:16e0::,2001:16e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:16e8::,2001:16e8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:16f0::,2001:16f7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:16f8::,2001:16f8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1700::,2001:171f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1800::,2001:1800:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1808::,2001:1808:ffff:ffff:ffff:ffff:ffff:ffff,GD -2001:1810::,2001:1810:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1818::,2001:1818:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1820::,2001:1820:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1828::,2001:1828:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1830::,2001:1830:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1838::,2001:1838:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1840::,2001:1840:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1848::,2001:1848:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1850::,2001:1850:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1860::,2001:1860:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1868::,2001:1868:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1878::,2001:1878:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1888::,2001:1888:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1890::,2001:1898:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18a0::,2001:18a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18a8::,2001:18a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18b0::,2001:18b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18b8::,2001:18b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18c0::,2001:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:18c8::,2001:18c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18d8::,2001:18d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18e0::,2001:18e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18e8::,2001:18e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:18f0::,2001:18f0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:18f8::,2001:18f8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1900::,2001:1900:1::53:ff,US -2001:1900:1::53:100,2001:1900:1::53:1ff,SG -2001:1900:1::53:200,2001:1900:1::53:2ff,JP -2001:1900:1::53:300,2001:1900:1::53:80ff,US -2001:1900:1::53:8100,2001:1900:1::53:81ff,SG -2001:1900:1::53:8200,2001:1900:1::53:82ff,JP -2001:1900:1::53:8300,2001:1900:2::53:ff,US -2001:1900:2::53:100,2001:1900:2::53:1ff,GB -2001:1900:2::53:200,2001:1900:2::53:2ff,DE -2001:1900:2::53:300,2001:1900:5:1::1c5,US -2001:1900:5:1::1c6,2001:1900:5:1::1c6,SI -2001:1900:5:1::1c7,2001:1900:5:2:2::93d,US -2001:1900:5:2:2::93e,2001:1900:5:2:2::93e,SI -2001:1900:5:2:2::93f,2001:1900:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1908::,2001:1908:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1910::,2001:1910:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1920::,2001:1920:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1928::,2001:1928:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1930::,2001:1930:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1938::,2001:1938:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1940::,2001:1940:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1948::,2001:1948:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1950::,2001:1950:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1958::,2001:1958:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1960::,2001:1960:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1968::,2001:1968:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1970::,2001:1970:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1978::,2001:1978:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1980::,2001:1980:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1988::,2001:1988:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1990::,2001:1990:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1998::,2001:1998:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19a0::,2001:19a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19a8::,2001:19a8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:19b0::,2001:19b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19b8::,2001:19b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19c0::,2001:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:19c8::,2001:19c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19d0::,2001:19d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19d8::,2001:19d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19e0::,2001:19e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19e8::,2001:19e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19f0::,2001:19f0:5000:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:5000:8000::,2001:19f0:5001:7fff:ffff:ffff:ffff:ffff,NL -2001:19f0:5001:8000::,2001:19f0:5800:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:5800:8000::,2001:19f0:5801:7fff:ffff:ffff:ffff:ffff,AU -2001:19f0:5801:8000::,2001:19f0:6800:ffff:ffff:ffff:ffff:ffff,US -2001:19f0:6801::,2001:19f0:6801:7fff:ffff:ffff:ffff:ffff,FR -2001:19f0:6801:8000::,2001:19f0:6c00:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:6c00:8000::,2001:19f0:6c01:7fff:ffff:ffff:ffff:ffff,DE -2001:19f0:6c01:8000::,2001:19f0:7000:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:7000:8000::,2001:19f0:7001:7fff:ffff:ffff:ffff:ffff,JP -2001:19f0:7001:8000::,2001:19f0:7400:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:7400:8000::,2001:19f0:7400:ffff:ffff:ffff:ffff:ffff,GB -2001:19f0:7401::,2001:19f0:7401:7fff:ffff:ffff:ffff:ffff,US -2001:19f0:7401:8000::,2001:19f0:7401:ffff:ffff:ffff:ffff:ffff,GB -2001:19f0:7402::,2001:19f0:7800:3fff:ffff:ffff:ffff:ffff,US -2001:19f0:7800:4000::,2001:19f0:7800:4000:ffff:ffff:ffff:ffff,CA -2001:19f0:7800:4001::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1a10::,2001:1a17:ffff:ffff:ffff:ffff:ffff:ffff,QA -2001:1a18::,2001:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,CY -2001:1a20::,2001:1a20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1a28::,2001:1a28:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1a30::,2001:1a30:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1a38::,2001:1a38:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1a40::,2001:1a40:ffff:ffff:ffff:ffff:ffff:ffff,BH -2001:1a48::,2001:1a48:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1a50::,2001:1a50:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1a58::,2001:1a58:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:1a60::,2001:1a60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1a68::,2001:1a68:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:1a70::,2001:1a77:ffff:ffff:ffff:ffff:ffff:ffff,MT -2001:1a78::,2001:1a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1a88::,2001:1a8f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1a90::,2001:1a90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1a98::,2001:1a9f:ffff:ffff:ffff:ffff:ffff:ffff,IS -2001:1aa0::,2001:1aa7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2001:1aa8::,2001:1aa8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1ab0::,2001:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1ab8::,2001:1abb:ffff:ffff:ffff:ffff:ffff:ffff,LT -2001:1ac0::,2001:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1ac8::,2001:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,BG -2001:1ad0::,2001:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:1ad8::,2001:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:1ae0::,2001:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2001:1ae8::,2001:1aef:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:1af0::,2001:1af7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2001:1af8::,2001:1af8:4010:7fff:ffff:ffff:ffff:ffff,NL -2001:1af8:4010:8000::,2001:1af8:4010:ffff:ffff:ffff:ffff:ffff,DE -2001:1af8:4011::,2001:1af8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1b00::,2001:1b00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:1b08::,2001:1b08:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1b10::,2001:1b10:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b18::,2001:1b18:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b28::,2001:1b28:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:1b30::,2001:1b37:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b38::,2001:1b3f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1b40::,2001:1b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1b48::,2001:1b4f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1b50::,2001:1b57:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1b58::,2001:1b58:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1b60::,2001:1b67:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b68::,2001:1b6f:ffff:ffff:ffff:ffff:ffff:ffff,TR -2001:1b70::,2001:1b77:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:1b78::,2001:1b78:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:1b80::,2001:1b87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:1b88::,2001:1b88:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1b90::,2001:1b90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1b98::,2001:1b98:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:1ba0::,2001:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2001:1ba8::,2001:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:1bb0::,2001:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:1bb8::,2001:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:1bc0::,2001:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1bc8::,2001:1bcf:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:1bd0::,2001:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:1bd8::,2001:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:1be0::,2001:1be0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1be8::,2001:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1bf0::,2001:1bf7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2001:1bf8::,2001:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,LV -2001:1c00::,2001:1c00:d06:ffff:ffff:ffff:ffff:ffff,NL -2001:1c00:d07::,2001:1c00:d07:7fff:ffff:ffff:ffff:ffff,GB -2001:1c00:d07:8000::,2001:1c01:1d04:2fff:ffff:ffff:ffff:ffff,NL -2001:1c01:1d04:3000::,2001:1c01:1d04:3fff:ffff:ffff:ffff:ffff,US -2001:1c01:1d04:4000::,2001:1dff:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:2002::,2001:2002:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:2003::,2001:2003:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:2010:9::,2001:2010:9:7fff:ffff:ffff:ffff:ffff,DK -2001:2010:ea7:8000::,2001:2010:ea7:ffff:ffff:ffff:ffff:ffff,DK -2001:2011:c002::,2001:2011:c002:ffff:ffff:ffff:ffff:ffff,DK -2001:2012::,2001:2012::7fff:ffff:ffff:ffff:ffff,DK -2001:2012:100::,2001:2012:127:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:200::,2001:2012:200:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:200:b800::,2001:2012:20c:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:20d::,2001:2012:229:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:22a::,2001:2012:22b:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:22c::,2001:2012:232:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:233:8000::,2001:2012:235:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:300::,2001:2012:317:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:318::,2001:2012:321:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:400::,2001:2012:404:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:405::,2001:2012:433:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1002::,2001:2012:1002:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1100::,2001:2012:1128:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1129::,2001:2012:1129:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1200::,2001:2012:1201:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1202::,2001:2012:1219:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:121a::,2001:2012:1225:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:1226:8000::,2001:2012:1226:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:1228::,2001:2012:1231:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:1300::,2001:2012:131c:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:131d::,2001:2012:131d:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1400::,2001:2012:1406:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:1407::,2001:2012:1409:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:140b:8000::,2001:2012:140d:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:140e::,2001:2012:1410:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:1411:8000::,2001:2012:141a:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:141c:8000::,2001:2012:1427:7fff:ffff:ffff:ffff:ffff,DK -2001:2012:3ec6::,2001:2012:3ec7:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:c2ff:8000::,2001:2012:c2ff:ffff:ffff:ffff:ffff:ffff,DK -2001:2012:d94a:8000::,2001:2012:d94a:ffff:ffff:ffff:ffff:ffff,DK -2001:2040:5::,2001:2040:5:7fff:ffff:ffff:ffff:ffff,SE -2001:2040:4a::,2001:2040:4a:7fff:ffff:ffff:ffff:ffff,SE -2001:2040:4b::,2001:2040:4b:ffff:ffff:ffff:ffff:ffff,SE -2001:2040:6c::,2001:2040:6c:7fff:ffff:ffff:ffff:ffff,SE -2001:2040:70::,2001:2040:70:7fff:ffff:ffff:ffff:ffff,SE -2001:2040:c006::,2001:2040:c006:ffff:ffff:ffff:ffff:ffff,SE -2001:2060:41::,2001:2060:41:7fff:ffff:ffff:ffff:ffff,FI -2001:2060:49::,2001:2060:49:7fff:ffff:ffff:ffff:ffff,FI -2001:2060:59::,2001:2060:59:7fff:ffff:ffff:ffff:ffff,FI -2001:2060:5b:8000::,2001:2060:5b:ffff:ffff:ffff:ffff:ffff,FI -2001:2060:60::,2001:2060:60:7fff:ffff:ffff:ffff:ffff,FI -2001:2060:bffb::,2001:2060:bffb:ffff:ffff:ffff:ffff:ffff,FI -2001:4000::,2001:4000:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4010::,2001:4010:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4018::,2001:4018:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4020::,2001:4020:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4028::,2001:402f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4030::,2001:4030:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:4038::,2001:4038:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4040::,2001:4040:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:4048::,2001:4048:ffff:ffff:ffff:ffff:ffff:ffff,LT -2001:4050::,2001:4050:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4058::,2001:4058:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:4060::,2001:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4068::,2001:4068:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4070::,2001:4070:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4078::,2001:407f:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:4080::,2001:4080:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4088::,2001:4088:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4090::,2001:4090:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:40a0::,2001:40a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:40a8::,2001:40a8:ffff:ffff:ffff:ffff:ffff:ffff,IL -2001:40b0::,2001:40b0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:40b8::,2001:40b8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:40c0::,2001:40c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:40d0::,2001:40d0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:40d8::,2001:40d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:40e0::,2001:40e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:40e8::,2001:40e8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2001:40f0::,2001:40f0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:40f8::,2001:40f8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4100::,2001:4100:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4108::,2001:4108:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:4118::,2001:4118:ffff:ffff:ffff:ffff:ffff:ffff,SK -2001:4120::,2001:4120:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4128::,2001:4128:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4130::,2001:4130:ffff:ffff:ffff:ffff:ffff:ffff,UA -2001:4138::,2001:4140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4150::,2001:4150:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4158::,2001:415f:ffff:ffff:ffff:ffff:ffff:ffff,BE -2001:4160::,2001:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4168::,2001:4168:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4170::,2001:4170:ffff:ffff:ffff:ffff:ffff:ffff,RS -2001:4178::,2001:4180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4188::,2001:418f:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:4190::,2001:4190:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4198::,2001:4198:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:41a0::,2001:41a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:41a8::,2001:41a8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:41b0::,2001:41b0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:41b8::,2001:41b8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:41c0::,2001:41cf:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:41d0::,2001:41d0:2:4dbd:ffff:ffff:ffff:ffff,FR -2001:41d0:2:4dbe::,2001:41d0:2:4dbe:ffff:ffff:ffff:ffff,CZ -2001:41d0:2:4dbf::,2001:41d0:a:7e08:ffff:ffff:ffff:ffff,FR -2001:41d0:a:7e09::,2001:41d0:a:7e09:ffff:ffff:ffff:ffff,PT -2001:41d0:a:7e0a::,2001:41d0:129:9bff:ffff:ffff:ffff:ffff,FR -2001:41d0:129:9c00::,2001:41d0:129:9cff:ffff:ffff:ffff:ffff,NL -2001:41d0:129:9d00::,2001:41d0:601:1100::5fe,FR -2001:41d0:601:1100::5ff,2001:41d0:601:1100::5ff,PL -2001:41d0:601:1100::600,2001:41d0:1000:171a:ffff:ffff:ffff:ffff,FR -2001:41d0:1000:171b::,2001:41d0:1000:171b:ffff:ffff:ffff:ffff,DE -2001:41d0:1000:171c::,2001:41d0:1007:ffff:ffff:ffff:ffff:ffff,FR -2001:41d0:1008::,2001:41d0:1008:7fff:ffff:ffff:ffff:ffff,BE -2001:41d0:1008:8000::,2001:41d0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:41d8::,2001:41d8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:41e0::,2001:41e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:41e8::,2001:41e8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:41f0::,2001:41f0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:41f8::,2001:41f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4200::,2001:4200:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4210::,2001:4210:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4218::,2001:4218:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4220::,2001:4220:ffff:ffff:ffff:ffff:ffff:ffff,EG -2001:4228::,2001:4228:ffff:ffff:ffff:ffff:ffff:ffff,SD -2001:4238::,2001:4238:27a0:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:27a1::,2001:4238:27a1:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:27a1:8000::,2001:4238:28e4:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:28e5::,2001:4238:28e5:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:28e5:8000::,2001:4238:29aa:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:29ab::,2001:4238:29ab:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:29ab:8000::,2001:4238:29e9:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:29ea::,2001:4238:29ea:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:29ea:8000::,2001:4238:2af1:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:2af2::,2001:4238:2af2:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:2af2:8000::,2001:4238:2b30:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:2b31::,2001:4238:2b31:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:2b31:8000::,2001:4238:2b33:ffff:ffff:ffff:ffff:ffff,MU -2001:4238:2b34::,2001:4238:2b34:7fff:ffff:ffff:ffff:ffff,KE -2001:4238:2b34:8000::,2001:4238:ffff:ffff:ffff:ffff:ffff:ffff,MU -2001:4240::,2001:4240:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2001:4248::,2001:4248:ffff:ffff:ffff:ffff:ffff:ffff,MU -2001:4250::,2001:4250:ffff:ffff:ffff:ffff:ffff:ffff,AO -2001:4258::,2001:4258:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2001:4260::,2001:4260:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4268::,2001:4268:ffff:ffff:ffff:ffff:ffff:ffff,CM -2001:4270::,2001:4270:ffff:ffff:ffff:ffff:ffff:ffff,NG -2001:4278::,2001:4278:ffff:ffff:ffff:ffff:ffff:ffff,SN -2001:4288::,2001:4288:ffff:ffff:ffff:ffff:ffff:ffff,MA -2001:4290::,2001:4290:ffff:ffff:ffff:ffff:ffff:ffff,MU -2001:4298::,2001:4298:ffff:ffff:ffff:ffff:ffff:ffff,DJ -2001:42a0::,2001:42a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:42a8::,2001:42a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:42b0::,2001:42b0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2001:42b8::,2001:42b8:ffff:ffff:ffff:ffff:ffff:ffff,EG -2001:42c0::,2001:42c0:ffff:ffff:ffff:ffff:ffff:ffff,ML -2001:42c8::,2001:42c8::ff:ffff:ffff:ffff:ffff,CA -2001:42c8:0:100::,2001:42c8::1ff:ffff:ffff:ffff:ffff,KE -2001:42c8:0:200::,2001:42c8:ff:ffff:ffff:ffff:ffff:ffff,CA -2001:42c8:100::,2001:42c8:100:ff:ffff:ffff:ffff:ffff,KE -2001:42c8:100:100::,2001:42c8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:42d0::,2001:42d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:42d8::,2001:42d8:ffff:ffff:ffff:ffff:ffff:ffff,CI -2001:42e0::,2001:42e0:ffff:ffff:ffff:ffff:ffff:ffff,SC -2001:42f0::,2001:42f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4300::,2001:4300:ffff:ffff:ffff:ffff:ffff:ffff,EG -2001:4308::,2001:4308:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4310::,2001:4310:ffff:ffff:ffff:ffff:ffff:ffff,MA -2001:4318::,2001:4318:ffff:ffff:ffff:ffff:ffff:ffff,CI -2001:4320::,2001:4320:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2001:4328::,2001:4328:ffff:ffff:ffff:ffff:ffff:ffff,MU -2001:4330::,2001:4330:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4338::,2001:4338:ffff:ffff:ffff:ffff:ffff:ffff,SZ -2001:4340::,2001:4340:ffff:ffff:ffff:ffff:ffff:ffff,DZ -2001:4350::,2001:4350:ffff:ffff:ffff:ffff:ffff:ffff,TN -2001:4358::,2001:4358:ffff:ffff:ffff:ffff:ffff:ffff,KE -2001:4368::,2001:4368:ffff:ffff:ffff:ffff:ffff:ffff,KE -2001:4370::,2001:4370:ffff:ffff:ffff:ffff:ffff:ffff,KE -2001:4378::,2001:4378:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2001:4388::,2001:4388:ffff:ffff:ffff:ffff:ffff:ffff,EG -2001:4398::,2001:4398:ffff:ffff:ffff:ffff:ffff:ffff,MG -2001:43a0::,2001:43a0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2001:43a8::,2001:43a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:43b0::,2001:43b0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2001:43b8::,2001:43b8:ffff:ffff:ffff:ffff:ffff:ffff,MU -2001:43c0::,2001:43c0:ffff:ffff:ffff:ffff:ffff:ffff,GH -2001:43c8::,2001:43c8:ffff:ffff:ffff:ffff:ffff:ffff,EG -2001:43d0::,2001:43d0:ffff:ffff:ffff:ffff:ffff:ffff,KE -2001:43d8::,2001:43d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GH -2001:43e8::,2001:43e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f0::,2001:43f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2001:43f8::,2001:43f8:3:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:10::,2001:43f8:10:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:20::,2001:43f8:20:ffff:ffff:ffff:ffff:ffff,NL -2001:43f8:30::,2001:43f8:30:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:50::,2001:43f8:50:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:60::,2001:43f8:60:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:70::,2001:43f8:77:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:80::,2001:43f8:80:ffff:ffff:ffff:ffff:ffff,NA -2001:43f8:90::,2001:43f8:90:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:92::,2001:43f8:92:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL -2001:43f8:c0::,2001:43f8:c1:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:120::,2001:43f8:120:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:130::,2001:43f8:130:ffff:ffff:ffff:ffff:ffff,UG -2001:43f8:140::,2001:43f8:140:ffff:ffff:ffff:ffff:ffff,ZM -2001:43f8:150::,2001:43f8:150:ffff:ffff:ffff:ffff:ffff,RW -2001:43f8:160::,2001:43f8:160:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:180::,2001:43f8:180:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:190::,2001:43f8:190:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:1a0::,2001:43f8:1a0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:1b0::,2001:43f8:1b0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:1c0::,2001:43f8:1c0:ffff:ffff:ffff:ffff:ffff,DZ -2001:43f8:1d0::,2001:43f8:1d0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:1e0::,2001:43f8:1e0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:1f0::,2001:43f8:1f5:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:200::,2001:43f8:200:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:210::,2001:43f8:210:ffff:ffff:ffff:ffff:ffff,LS -2001:43f8:220::,2001:43f8:220:ffff:ffff:ffff:ffff:ffff,BW -2001:43f8:230::,2001:43f8:230:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:240::,2001:43f8:241:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:250::,2001:43f8:250:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:260::,2001:43f8:260:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:270::,2001:43f8:271:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:280::,2001:43f8:280:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:290::,2001:43f8:290:ffff:ffff:ffff:ffff:ffff,MG -2001:43f8:2a0::,2001:43f8:2a0:ffff:ffff:ffff:ffff:ffff,BW -2001:43f8:2b0::,2001:43f8:2b0:ffff:ffff:ffff:ffff:ffff,BW -2001:43f8:2c0::,2001:43f8:2c0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:2d0::,2001:43f8:2d0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:2e0::,2001:43f8:2e0:ffff:ffff:ffff:ffff:ffff,EG -2001:43f8:2f0::,2001:43f8:2f0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:300::,2001:43f8:300:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:310::,2001:43f8:310:ffff:ffff:ffff:ffff:ffff,ZW -2001:43f8:320::,2001:43f8:320:ffff:ffff:ffff:ffff:ffff,TN -2001:43f8:330::,2001:43f8:330:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:340::,2001:43f8:340:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:360::,2001:43f8:360:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:370::,2001:43f8:370:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:380::,2001:43f8:380:ffff:ffff:ffff:ffff:ffff,MW -2001:43f8:390::,2001:43f8:391:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:3b0::,2001:43f8:3b0:ffff:ffff:ffff:ffff:ffff,NA -2001:43f8:3c0::,2001:43f8:3c1:ffff:ffff:ffff:ffff:ffff,CD -2001:43f8:3d0::,2001:43f8:3d0:ffff:ffff:ffff:ffff:ffff,BF -2001:43f8:3e0::,2001:43f8:3ef:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:400::,2001:43f8:4ff:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:600::,2001:43f8:60f:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:610::,2001:43f8:611:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:620::,2001:43f8:620:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:630::,2001:43f8:630:ffff:ffff:ffff:ffff:ffff,MW -2001:43f8:640::,2001:43f8:640:ffff:ffff:ffff:ffff:ffff,MZ -2001:43f8:650::,2001:43f8:650:ffff:ffff:ffff:ffff:ffff,MA -2001:43f8:660::,2001:43f8:660:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:670::,2001:43f8:670:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:680::,2001:43f8:680:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:6a0::,2001:43f8:6a0:ffff:ffff:ffff:ffff:ffff,CG -2001:43f8:6b0::,2001:43f8:6b3:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:6c0::,2001:43f8:6c0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:6d0::,2001:43f8:6d3:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:6e0::,2001:43f8:6e0:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:700::,2001:43f8:70f:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:720::,2001:43f8:720:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:750::,2001:43f8:75f:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:760::,2001:43f8:760:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:770::,2001:43f8:773:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:780::,2001:43f8:780:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:790::,2001:43f8:790:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:7a0::,2001:43f8:7a0:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:7b0::,2001:43f8:7b0:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:7c0::,2001:43f8:7c0:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:7d0::,2001:43f8:7d0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:7e0::,2001:43f8:7e0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:7f0::,2001:43f8:7f0:ffff:ffff:ffff:ffff:ffff,SD -2001:43f8:800::,2001:43f8:83f:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:900::,2001:43f8:900:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:920::,2001:43f8:920:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:930::,2001:43f8:931:ffff:ffff:ffff:ffff:ffff,MZ -2001:43f8:940::,2001:43f8:940:ffff:ffff:ffff:ffff:ffff,CI -2001:43f8:950::,2001:43f8:950:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:960::,2001:43f8:960:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:970::,2001:43f8:970:ffff:ffff:ffff:ffff:ffff,GM -2001:43f8:980::,2001:43f8:981:ffff:ffff:ffff:ffff:ffff,NA -2001:43f8:990::,2001:43f8:991:ffff:ffff:ffff:ffff:ffff,BI -2001:43f8:9a0::,2001:43f8:9a0:ffff:ffff:ffff:ffff:ffff,BJ -2001:43f8:9b0::,2001:43f8:9b1:ffff:ffff:ffff:ffff:ffff,SZ -2001:43f8:9c0::,2001:43f8:9c1:ffff:ffff:ffff:ffff:ffff,DJ -2001:43f8:9d0::,2001:43f8:9d0:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:9e0::,2001:43f8:9e0:ffff:ffff:ffff:ffff:ffff,ZW -2001:43f8:9f0::,2001:43f8:9f0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:a00::,2001:43f8:a00:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:a10::,2001:43f8:a11:ffff:ffff:ffff:ffff:ffff,MG -2001:43f8:a20::,2001:43f8:a21:ffff:ffff:ffff:ffff:ffff,SC -2001:43f8:a30::,2001:43f8:a30:ffff:ffff:ffff:ffff:ffff,UG -2001:43f8:a40::,2001:43f8:a40:ffff:ffff:ffff:ffff:ffff,MZ -2001:43f8:a50::,2001:43f8:a50:ffff:ffff:ffff:ffff:ffff,BF -2001:43f8:a60::,2001:43f8:a61:ffff:ffff:ffff:ffff:ffff,LR -2001:43f8:a80::,2001:43f8:a80:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:a90::,2001:43f8:a90:ffff:ffff:ffff:ffff:ffff,SL -2001:43f8:aa0::,2001:43f8:aa0:ffff:ffff:ffff:ffff:ffff,ZM -2001:43f8:ab0::,2001:43f8:ab0:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:ac0::,2001:43f8:ac0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:ad0::,2001:43f8:ad0:ffff:ffff:ffff:ffff:ffff,UG -2001:43f8:ae0::,2001:43f8:ae1:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:af0::,2001:43f8:af1:ffff:ffff:ffff:ffff:ffff,BJ -2001:43f8:b10::,2001:43f8:b10:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:b20::,2001:43f8:b20:ffff:ffff:ffff:ffff:ffff,CI -2001:43f8:b30::,2001:43f8:b30:ffff:ffff:ffff:ffff:ffff,MA -2001:43f8:b40::,2001:43f8:b40:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:b50::,2001:43f8:b50:ffff:ffff:ffff:ffff:ffff,BF -2001:43f8:b60::,2001:43f8:b61:ffff:ffff:ffff:ffff:ffff,BF -2001:43f8:b70::,2001:43f8:b70:ffff:ffff:ffff:ffff:ffff,CI -2001:43f8:b80::,2001:43f8:b80:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:b90::,2001:43f8:b90:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:ba0::,2001:43f8:ba0:ffff:ffff:ffff:ffff:ffff,TD -2001:43f8:bb0::,2001:43f8:bb1:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:bc0::,2001:43f8:bc0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:bd0::,2001:43f8:bd0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:be0::,2001:43f8:be0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:bf0::,2001:43f8:bf0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:c00::,2001:43f8:c00:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:c10::,2001:43f8:c10:ffff:ffff:ffff:ffff:ffff,CG -2001:43f8:c20::,2001:43f8:c20:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:c30::,2001:43f8:c30:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:c40::,2001:43f8:c40:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:c50::,2001:43f8:c50:ffff:ffff:ffff:ffff:ffff,EG -2001:43f8:c60::,2001:43f8:c61:ffff:ffff:ffff:ffff:ffff,GN -2001:43f8:c70::,2001:43f8:c70:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:c80::,2001:43f8:c80:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:c90::,2001:43f8:c90:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:ca0::,2001:43f8:ca0:ffff:ffff:ffff:ffff:ffff,CI -2001:43f8:cb0::,2001:43f8:cb0:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:cc0::,2001:43f8:ccf:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:ce0::,2001:43f8:ce0:ffff:ffff:ffff:ffff:ffff,TZ -2001:43f8:cf0::,2001:43f8:cf1:ffff:ffff:ffff:ffff:ffff,SN -2001:43f8:d00::,2001:43f8:d00:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:d10::,2001:43f8:d11:ffff:ffff:ffff:ffff:ffff,TG -2001:43f8:d20::,2001:43f8:d2f:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:d40::,2001:43f8:d40:ffff:ffff:ffff:ffff:ffff,UG -2001:43f8:d50::,2001:43f8:d50:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:d60::,2001:43f8:d60:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:d70::,2001:43f8:d70:ffff:ffff:ffff:ffff:ffff,CM -2001:43f8:d80::,2001:43f8:d80:ffff:ffff:ffff:ffff:ffff,RW -2001:43f8:d90::,2001:43f8:d90:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:da0::,2001:43f8:da0:ffff:ffff:ffff:ffff:ffff,ZM -2001:43f8:db0::,2001:43f8:db0:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:dc0::,2001:43f8:dc0:ffff:ffff:ffff:ffff:ffff,AO -2001:43f8:dd0::,2001:43f8:dd0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:de0::,2001:43f8:de0:ffff:ffff:ffff:ffff:ffff,GH -2001:43f8:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:1000::,2001:43f8:1000:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:1010::,2001:43f8:1010:ffff:ffff:ffff:ffff:ffff,MU -2001:43f8:1020::,2001:43f8:1020:ffff:ffff:ffff:ffff:ffff,ZW -2001:43f8:1030::,2001:43f8:1030:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:1040::,2001:43f8:1040:ffff:ffff:ffff:ffff:ffff,ZA -2001:43f8:1050::,2001:43f8:1050:ffff:ffff:ffff:ffff:ffff,ZA -2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:4420::,2001:4420:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4428::,2001:4428:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:4430::,2001:4430:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:4438::,2001:4438:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:4450::,2001:4457:ffff:ffff:ffff:ffff:ffff:ffff,PH -2001:4458::,2001:4458:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:4460::,2001:4460:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:4470::,2001:4470:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:4478::,2001:447b:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:4480::,2001:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2001:4488::,2001:448b:ffff:ffff:ffff:ffff:ffff:ffff,ID -2001:4490::,2001:4493:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:4498::,2001:4498:ffff:ffff:ffff:ffff:ffff:ffff,MY -2001:44a0::,2001:44a0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:44a8::,2001:44a8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:44b0::,2001:44b0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:44b8::,2001:44b8:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:44c0::,2001:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:44c8::,2001:44c8:ffff:ffff:ffff:ffff:ffff:ffff,TH -2001:44d0::,2001:44df:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:44f0::,2001:44f0:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4500::,2001:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4508::,2001:4508:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4510::,2001:4517:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:4528::,2001:452b:ffff:ffff:ffff:ffff:ffff:ffff,IN -2001:4530::,2001:4530:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2001:4538::,2001:4538:ffff:ffff:ffff:ffff:ffff:ffff,PK -2001:4540::,2001:455f:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4580::,2001:45bf:ffff:ffff:ffff:ffff:ffff:ffff,TW -2001:4600::,2001:4618:bb28:ffff:ffff:ffff:ffff:ffff,NO -2001:4618:bb29::,2001:4618:bb29:7fff:ffff:ffff:ffff:ffff,SE -2001:4618:bb29:8000::,2001:4640:7864:ffff:ffff:ffff:ffff:ffff,NO -2001:4640:7865::,2001:4640:7865:7fff:ffff:ffff:ffff:ffff,US -2001:4640:7865:8000::,2001:4641:666e:ffff:ffff:ffff:ffff:ffff,NO -2001:4641:666f::,2001:4641:666f:7fff:ffff:ffff:ffff:ffff,LV -2001:4641:666f:8000::,2001:4644:3fb8:ffff:ffff:ffff:ffff:ffff,NO -2001:4644:3fb9::,2001:4644:3fb9:7fff:ffff:ffff:ffff:ffff,SE -2001:4644:3fb9:8000::,2001:4644:40cf:ffff:ffff:ffff:ffff:ffff,NO -2001:4644:40d0::,2001:4644:40d0:7fff:ffff:ffff:ffff:ffff,AE -2001:4644:40d0:8000::,2001:4646:39c1:ffff:ffff:ffff:ffff:ffff,NO -2001:4646:39c2::,2001:4646:39c2:7fff:ffff:ffff:ffff:ffff,US -2001:4646:39c2:8000::,2001:464f:2257:ffff:ffff:ffff:ffff:ffff,NO -2001:464f:2258::,2001:464f:2258:7fff:ffff:ffff:ffff:ffff,HU -2001:464f:2258:8000::,2001:46ff:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4800::,2001:4808:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4810::,2001:4810:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4818::,2001:4818:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4828::,2001:4828:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4830::,2001:4830:1200:7fff:ffff:ffff:ffff:ffff,US -2001:4830:1200:8000::,2001:4830:1200:ffff:ffff:ffff:ffff:ffff,AU -2001:4830:1201::,2001:4830:121d:ffff:ffff:ffff:ffff:ffff,US -2001:4830:121e::,2001:4830:121e:ffff:ffff:ffff:ffff:ffff,AU -2001:4830:121f::,2001:4830:600f:ffff:ffff:ffff:ffff:ffff,US -2001:4830:6010::,2001:4830:601f:ffff:ffff:ffff:ffff:ffff,GB -2001:4830:6020::,2001:4830:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4838::,2001:4838:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4840::,2001:4840:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4848::,2001:4848:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4850::,2001:4850:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4858::,2001:4858:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4860::,2001:4860:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4868::,2001:4868:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4870::,2001:4871:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4878::,2001:4878:128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:129::,2001:4878:129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:12a::,2001:4878:203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:204::,2001:4878:204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:205::,2001:4878:214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:215::,2001:4878:215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:216::,2001:4878:21f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:220::,2001:4878:220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:221::,2001:4878:224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:225::,2001:4878:225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:226::,2001:4878:227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:228::,2001:4878:228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:229::,2001:4878:233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:234::,2001:4878:234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:235::,2001:4878:241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:242::,2001:4878:242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:243::,2001:4878:243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:244::,2001:4878:245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:246::,2001:4878:246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:247::,2001:4878:248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:249::,2001:4878:249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:24a::,2001:4878:24f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:250::,2001:4878:250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:251::,2001:4878:320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:321::,2001:4878:321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:322::,2001:4878:322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:323::,2001:4878:323:ffff:ffff:ffff:ffff:ffff,US -2001:4878:324::,2001:4878:324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:325::,2001:4878:33f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:340::,2001:4878:340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:341::,2001:4878:343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:344::,2001:4878:344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:345::,2001:4878:347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:348::,2001:4878:348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:349::,2001:4878:2128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2129::,2001:4878:2129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:212a::,2001:4878:2203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2204::,2001:4878:2204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:2205::,2001:4878:2214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2215::,2001:4878:2215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:2216::,2001:4878:221f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2220::,2001:4878:2220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:2221::,2001:4878:2224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2225::,2001:4878:2225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:2226::,2001:4878:2227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2228::,2001:4878:2228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:2229::,2001:4878:2233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2234::,2001:4878:2234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:2235::,2001:4878:2241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2242::,2001:4878:2242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:2243::,2001:4878:2243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:2244::,2001:4878:2245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2246::,2001:4878:2246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:2247::,2001:4878:2248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2249::,2001:4878:2249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:224a::,2001:4878:224f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2250::,2001:4878:2250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:2251::,2001:4878:2320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2321::,2001:4878:2321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:2322::,2001:4878:2322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:2323::,2001:4878:2323:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2324::,2001:4878:2324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:2325::,2001:4878:233f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2340::,2001:4878:2340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:2341::,2001:4878:2343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2344::,2001:4878:2344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:2345::,2001:4878:2347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:2348::,2001:4878:2348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:2349::,2001:4878:4128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4129::,2001:4878:4129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:412a::,2001:4878:4203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4204::,2001:4878:4204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:4205::,2001:4878:4214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4215::,2001:4878:4215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:4216::,2001:4878:421f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4220::,2001:4878:4220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:4221::,2001:4878:4224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4225::,2001:4878:4225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:4226::,2001:4878:4227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4228::,2001:4878:4228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:4229::,2001:4878:4233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4234::,2001:4878:4234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:4235::,2001:4878:4241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4242::,2001:4878:4242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:4243::,2001:4878:4243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:4244::,2001:4878:4245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4246::,2001:4878:4246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:4247::,2001:4878:4248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4249::,2001:4878:4249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:424a::,2001:4878:424f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4250::,2001:4878:4250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:4251::,2001:4878:4304:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4305::,2001:4878:4305:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:4306::,2001:4878:4320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4321::,2001:4878:4321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:4322::,2001:4878:4322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:4323::,2001:4878:4323:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4324::,2001:4878:4324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:4325::,2001:4878:433f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4340::,2001:4878:4340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:4341::,2001:4878:4343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4344::,2001:4878:4344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:4345::,2001:4878:4347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:4348::,2001:4878:4348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:4349::,2001:4878:8128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8129::,2001:4878:8129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:812a::,2001:4878:8203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8204::,2001:4878:8204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:8205::,2001:4878:8214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8215::,2001:4878:8215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:8216::,2001:4878:8216:7fff:ffff:ffff:ffff:ffff,FR -2001:4878:8216:8000::,2001:4878:8216:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8217::,2001:4878:8217:7fff:ffff:ffff:ffff:ffff,ES -2001:4878:8217:8000::,2001:4878:821f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8220::,2001:4878:8220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:8221::,2001:4878:8224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8225::,2001:4878:8225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:8226::,2001:4878:8227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8228::,2001:4878:8228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:8229::,2001:4878:8233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8234::,2001:4878:8234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:8235::,2001:4878:8241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8242::,2001:4878:8242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:8243::,2001:4878:8243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:8244::,2001:4878:8245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8246::,2001:4878:8246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:8247::,2001:4878:8248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8249::,2001:4878:8249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:824a::,2001:4878:824f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8250::,2001:4878:8250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:8251::,2001:4878:8304:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8305::,2001:4878:8305:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:8306::,2001:4878:8320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8321::,2001:4878:8321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:8322::,2001:4878:8322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:8323::,2001:4878:8323:ffff:ffff:ffff:ffff:ffff,AU -2001:4878:8324::,2001:4878:8324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:8325::,2001:4878:833f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8340::,2001:4878:8340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:8341::,2001:4878:8343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8344::,2001:4878:8344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:8345::,2001:4878:8346:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8347::,2001:4878:8347:7fff:ffff:ffff:ffff:ffff,HK -2001:4878:8347:8000::,2001:4878:8347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:8348::,2001:4878:8348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:8349::,2001:4878:a128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a129::,2001:4878:a129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:a12a::,2001:4878:a203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a204::,2001:4878:a204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:a205::,2001:4878:a214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a215::,2001:4878:a215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:a216::,2001:4878:a21f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a220::,2001:4878:a220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:a221::,2001:4878:a224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a225::,2001:4878:a225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:a226::,2001:4878:a227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a228::,2001:4878:a228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:a229::,2001:4878:a233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a234::,2001:4878:a234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:a235::,2001:4878:a241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a242::,2001:4878:a242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:a243::,2001:4878:a243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:a244::,2001:4878:a245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a246::,2001:4878:a246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:a247::,2001:4878:a248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a249::,2001:4878:a249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:a24a::,2001:4878:a24f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a250::,2001:4878:a250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:a251::,2001:4878:a304:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a305::,2001:4878:a305:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:a306::,2001:4878:a320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a321::,2001:4878:a321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:a322::,2001:4878:a322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:a323::,2001:4878:a323:ffff:ffff:ffff:ffff:ffff,AU -2001:4878:a324::,2001:4878:a324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:a325::,2001:4878:a33f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a340::,2001:4878:a340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:a341::,2001:4878:a343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a344::,2001:4878:a344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:a345::,2001:4878:a347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:a348::,2001:4878:a348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:a349::,2001:4878:c128:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c129::,2001:4878:c129:ffff:ffff:ffff:ffff:ffff,CR -2001:4878:c12a::,2001:4878:c203:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c204::,2001:4878:c204:ffff:ffff:ffff:ffff:ffff,DE -2001:4878:c205::,2001:4878:c214:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c215::,2001:4878:c215:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:c216::,2001:4878:c21f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c220::,2001:4878:c220:ffff:ffff:ffff:ffff:ffff,SE -2001:4878:c221::,2001:4878:c224:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c225::,2001:4878:c225:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:c226::,2001:4878:c227:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c228::,2001:4878:c228:ffff:ffff:ffff:ffff:ffff,IL -2001:4878:c229::,2001:4878:c233:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c234::,2001:4878:c234:ffff:ffff:ffff:ffff:ffff,GB -2001:4878:c235::,2001:4878:c241:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c242::,2001:4878:c242:ffff:ffff:ffff:ffff:ffff,NL -2001:4878:c243::,2001:4878:c243:ffff:ffff:ffff:ffff:ffff,PL -2001:4878:c244::,2001:4878:c245:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c246::,2001:4878:c246:ffff:ffff:ffff:ffff:ffff,DK -2001:4878:c247::,2001:4878:c248:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c249::,2001:4878:c249:ffff:ffff:ffff:ffff:ffff,FR -2001:4878:c24a::,2001:4878:c24f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c250::,2001:4878:c250:ffff:ffff:ffff:ffff:ffff,IT -2001:4878:c251::,2001:4878:c304:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c305::,2001:4878:c305:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:c306::,2001:4878:c320:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c321::,2001:4878:c321:ffff:ffff:ffff:ffff:ffff,SG -2001:4878:c322::,2001:4878:c322:ffff:ffff:ffff:ffff:ffff,JP -2001:4878:c323::,2001:4878:c323:ffff:ffff:ffff:ffff:ffff,AU -2001:4878:c324::,2001:4878:c324:ffff:ffff:ffff:ffff:ffff,KR -2001:4878:c325::,2001:4878:c33f:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c340::,2001:4878:c340:ffff:ffff:ffff:ffff:ffff,HK -2001:4878:c341::,2001:4878:c343:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c344::,2001:4878:c344:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:c345::,2001:4878:c347:ffff:ffff:ffff:ffff:ffff,US -2001:4878:c348::,2001:4878:c348:ffff:ffff:ffff:ffff:ffff,IN -2001:4878:c349::,2001:4878:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4888::,2001:4888:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4890::,2001:4890:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4898::,2001:4898:e80f:ffff:ffff:ffff:ffff:ffff,US -2001:4898:e810::,2001:4898:e810:ffff:ffff:ffff:ffff:ffff,BR -2001:4898:e811::,2001:489a:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48a0::,2001:48a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48a8::,2001:48a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48b0::,2001:48b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48b8::,2001:48b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48c0::,2001:48c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48c8::,2001:48c8:6:ffff:ffff:ffff:ffff:ffff,US -2001:48c8:7::,2001:48c8:7:ffff:ffff:ffff:ffff:ffff,NL -2001:48c8:8::,2001:48c8:f:ffff:ffff:ffff:ffff:ffff,US -2001:48c8:10::,2001:48c8:10:ffff:ffff:ffff:ffff:ffff,SG -2001:48c8:11::,2001:48c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48d0::,2001:48d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48d8::,2001:48d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48e0::,2001:48e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48e8::,2001:48e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:48f8::,2001:48f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4900::,2001:4900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4908::,2001:4908:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4910::,2001:4910:ffff:ffff:ffff:ffff:ffff:ffff,BM -2001:4918::,2001:4918:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4920::,2001:4920:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4928::,2001:4928:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4930::,2001:4930:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4938::,2001:4938:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4940::,2001:4940:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4948::,2001:4948:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4950::,2001:4950:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4958::,2001:4958:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:4960::,2001:4960:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4968::,2001:4968:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4970::,2001:4970:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4978::,2001:4978:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4980::,2001:4980:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4988::,2001:4988:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4990::,2001:4990:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4998::,2001:4998:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49a0::,2001:49a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49a8::,2001:49a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49b0::,2001:49b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49b8::,2001:49b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49c0::,2001:49c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49c8::,2001:49c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49d0::,2001:49d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49d8::,2001:49d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49e0::,2001:49e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49e8::,2001:49e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49f0::,2001:49f0:d001:f:ffff:ffff:ffff:ffff,US -2001:49f0:d001:10::,2001:49f0:d001:10:ffff:ffff:ffff:ffff,CA -2001:49f0:d001:11::,2001:49f0:d001:11:ffff:ffff:ffff:ffff,BR -2001:49f0:d001:12::,2001:49f0:d001:12:ffff:ffff:ffff:ffff,MX -2001:49f0:d001:13::,2001:49f0:d001:13:ffff:ffff:ffff:ffff,JP -2001:49f0:d001:14::,2001:49f0:d001:14:ffff:ffff:ffff:ffff,AU -2001:49f0:d001:15::,2001:49f0:d006:ffff:ffff:ffff:ffff:ffff,US -2001:49f0:d007::,2001:49f0:d007:15:ffff:ffff:ffff:ffff,GB -2001:49f0:d007:16::,2001:49f0:d007:16:ffff:ffff:ffff:ffff,US -2001:49f0:d007:17::,2001:49f0:d007:17:ffff:ffff:ffff:ffff,IT -2001:49f0:d007:18::,2001:49f0:d007:18:ffff:ffff:ffff:ffff,IE -2001:49f0:d007:19::,2001:49f0:d007:19:ffff:ffff:ffff:ffff,FR -2001:49f0:d007:1a::,2001:49f0:d007:1f:ffff:ffff:ffff:ffff,GB -2001:49f0:d007:20::,2001:49f0:d007:20:ffff:ffff:ffff:ffff,TH -2001:49f0:d007:21::,2001:49f0:d007:ffff:ffff:ffff:ffff:ffff,GB -2001:49f0:d008::,2001:49f0:d01d:ffff:ffff:ffff:ffff:ffff,US -2001:49f0:d01e::,2001:49f0:d01e:ffff:ffff:ffff:ffff:ffff,ES -2001:49f0:d01f::,2001:49f0:d01f:ffff:ffff:ffff:ffff:ffff,DE -2001:49f0:d020::,2001:49f0:d022:ffff:ffff:ffff:ffff:ffff,US -2001:49f0:d023::,2001:49f0:d024:ffff:ffff:ffff:ffff:ffff,NL -2001:49f0:d025::,2001:49f0:d02d:3:ffff:ffff:ffff:ffff,US -2001:49f0:d02d:4::,2001:49f0:d02d:4:ffff:ffff:ffff:ffff,NL -2001:49f0:d02d:5::,2001:49f0:d02d:5:ffff:ffff:ffff:ffff,US -2001:49f0:d02d:6::,2001:49f0:d02d:6:ffff:ffff:ffff:ffff,IN -2001:49f0:d02d:7::,2001:49f0:d02d:7:ffff:ffff:ffff:ffff,SE -2001:49f0:d02d:8::,2001:49f0:d02d:8:ffff:ffff:ffff:ffff,ES -2001:49f0:d02d:9::,2001:49f0:d02d:9:ffff:ffff:ffff:ffff,DE -2001:49f0:d02d:a::,2001:49f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:49f8::,2001:49f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:4a00::,2001:4a1f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4b00::,2001:4b07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4b08::,2001:4b08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4b10::,2001:4b17:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4b18::,2001:4b18:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4b20::,2001:4b28:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4b30::,2001:4b37:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4b38::,2001:4b3f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4b40::,2001:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4b48::,2001:4b48:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4b50::,2001:4b57:ffff:ffff:ffff:ffff:ffff:ffff,BE -2001:4b58::,2001:4b58:ffff:ffff:ffff:ffff:ffff:ffff,BG -2001:4b60::,2001:4b60:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4b68::,2001:4b6f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4b70::,2001:4b7f:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4b80::,2001:4b87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4b88::,2001:4b88:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4b90::,2001:4b90:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4b98::,2001:4b98:dc2:7fff:ffff:ffff:ffff:ffff,FR -2001:4b98:dc2:8000::,2001:4b98:dc2:ffff:ffff:ffff:ffff:ffff,LU -2001:4b98:dc3::,2001:4b9f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4ba0::,2001:4ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ba8::,2001:4baf:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:4bb0::,2001:4bb0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4bb8::,2001:4bb8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4bc0::,2001:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4bc8::,2001:4bcf:ffff:ffff:ffff:ffff:ffff:ffff,AT -2001:4bd0::,2001:4bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4bd8::,2001:4bdf:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4be0::,2001:4be0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2001:4be8::,2001:4be8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4bf0::,2001:4bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4bf8::,2001:4bf8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4c00::,2001:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4c08::,2001:4c08:2000:ffff:ffff:ffff:ffff:ffff,GB -2001:4c08:2001::,2001:4c08:2001:7fff:ffff:ffff:ffff:ffff,NL -2001:4c08:2001:8000::,2001:4c08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4c10::,2001:4c10:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4c20::,2001:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4c28::,2001:4c28:3000:632:107:167:111:91,NO -2001:4c28:3000:632:107:167:111:92,2001:4c28:3000:632:107:167:111:92,IN -2001:4c28:3000:632:107:167:111:93,2001:4c28:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4c30::,2001:4c30:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4c38::,2001:4c3f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4c40::,2001:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BE -2001:4c48::,2001:4c4f:ffff:ffff:ffff:ffff:ffff:ffff,HU -2001:4c50::,2001:4c57:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4c58::,2001:4c5f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4c60::,2001:4c60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:4c68::,2001:4c68:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4c70::,2001:4c70:ffff:ffff:ffff:ffff:ffff:ffff,PL -2001:4c78::,2001:4c78:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4c80::,2001:4c80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR -2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ca0::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4cb8::,2001:4cbf:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ce0::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM -2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES -2001:4d18::,2001:4d18:ffff:ffff:ffff:ffff:ffff:ffff,RO -2001:4d20::,2001:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4d30::,2001:4d30:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4d38::,2001:4d38:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:4d48::,2001:4d4f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4d50::,2001:4d50:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4d60::,2001:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4d68::,2001:4d68:ffff:ffff:ffff:ffff:ffff:ffff,IE -2001:4d70::,2001:4d70:ffff:ffff:ffff:ffff:ffff:ffff,BG -2001:4d78::,2001:4d78:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4d80::,2001:4d80:ffff:ffff:ffff:ffff:ffff:ffff,RO -2001:4d88::,2001:4d8f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4d98::,2001:4d98:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4da8::,2001:4da8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4db0::,2001:4db0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4db8::,2001:4db8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2001:4dc0::,2001:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:4dc8::,2001:4dc8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4dd0::,2001:4dd7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4dd8::,2001:4dd8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4de0::,2001:4de0:4ff:ffff:ffff:ffff:ffff:ffff,NL -2001:4de0:500::,2001:4de0:5ff:ffff:ffff:ffff:ffff:ffff,SE -2001:4de0:600::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:4de8::,2001:4de8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:4df0::,2001:4df0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2001:5000::,2001:57ff:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:8000::,2001:8003:a105:93ff:ffff:ffff:ffff:ffff,AU -2001:8003:a105:9400::,2001:8003:a105:97ff:ffff:ffff:ffff:ffff,IN -2001:8003:a105:9800::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU -2001:a000::,2001:a7ff:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:b000::,2001:b011:380b:fff:ffff:ffff:ffff:ffff,TW -2001:b011:380b:1000::,2001:b011:380b:17ff:ffff:ffff:ffff:ffff,US -2001:b011:380b:1800::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW -2003::,2003:6:1725:7fff:ffff:ffff:ffff:ffff,DE -2003:6:1725:8000::,2003:6:1725:ffff:ffff:ffff:ffff:ffff,US -2003:6:1726::,2003:42:2e35:ffff:ffff:ffff:ffff:ffff,DE -2003:42:2e36::,2003:42:2e36:7fff:ffff:ffff:ffff:ffff,ES -2003:42:2e36:8000::,2003:43:ae20:ffff:ffff:ffff:ffff:ffff,DE -2003:43:ae21::,2003:43:ae21:7fff:ffff:ffff:ffff:ffff,CH -2003:43:ae21:8000::,2003:52:ef50:7fff:ffff:ffff:ffff:ffff,DE -2003:52:ef50:8000::,2003:52:ef50:ffff:ffff:ffff:ffff:ffff,AT -2003:52:ef51::,2003:57:e508:bfff:ffff:ffff:ffff:ffff,DE -2003:57:e508:c000::,2003:57:e508:ffff:ffff:ffff:ffff:ffff,US -2003:57:e509::,2003:5c:ac42:7fff:ffff:ffff:ffff:ffff,DE -2003:5c:ac42:8000::,2003:5c:ac42:ffff:ffff:ffff:ffff:ffff,IT -2003:5c:ac43::,2003:63:2a36:bfff:ffff:ffff:ffff:ffff,DE -2003:63:2a36:c000::,2003:63:2a36:ffff:ffff:ffff:ffff:ffff,KW -2003:63:2a37::,2003:63:2a72:ffff:ffff:ffff:ffff:ffff,DE -2003:63:2a73::,2003:63:2a73:7fff:ffff:ffff:ffff:ffff,US -2003:63:2a73:8000::,2003:63:2e34:ffff:ffff:ffff:ffff:ffff,DE -2003:63:2e35::,2003:63:2e35:7fff:ffff:ffff:ffff:ffff,AT -2003:63:2e35:8000::,2003:68:ea18:ffff:ffff:ffff:ffff:ffff,DE -2003:68:ea19::,2003:68:ea19:7fff:ffff:ffff:ffff:ffff,CH -2003:68:ea19:8000::,2003:6a:6c7d:7fff:ffff:ffff:ffff:ffff,DE -2003:6a:6c7d:8000::,2003:6a:6c7d:ffff:ffff:ffff:ffff:ffff,GB -2003:6a:6c7e::,2003:6b:e08:ffff:ffff:ffff:ffff:ffff,DE -2003:6b:e09::,2003:6b:e09:7fff:ffff:ffff:ffff:ffff,CH -2003:6b:e09:8000::,2003:70:ce46:ffff:ffff:ffff:ffff:ffff,DE -2003:70:ce47::,2003:70:ce47:7fff:ffff:ffff:ffff:ffff,NL -2003:70:ce47:8000::,2003:75:f0d:ffff:ffff:ffff:ffff:ffff,DE -2003:75:f0e::,2003:75:f0e:7fff:ffff:ffff:ffff:ffff,US -2003:75:f0e:8000::,2003:75:2e35:5fff:ffff:ffff:ffff:ffff,DE -2003:75:2e35:6000::,2003:75:2e35:7fff:ffff:ffff:ffff:ffff,US -2003:75:2e35:8000::,2003:76:2f2c:ffff:ffff:ffff:ffff:ffff,DE -2003:76:2f2d::,2003:76:2f2d:7fff:ffff:ffff:ffff:ffff,NL -2003:76:2f2d:8000::,2003:76:2f50:7fff:ffff:ffff:ffff:ffff,DE -2003:76:2f50:8000::,2003:76:2f50:ffff:ffff:ffff:ffff:ffff,NL -2003:76:2f51::,2003:78:cf69:ffff:ffff:ffff:ffff:ffff,DE -2003:78:cf6a::,2003:78:cf6a:7fff:ffff:ffff:ffff:ffff,AT -2003:78:cf6a:8000::,2003:86:a749:ffff:ffff:ffff:ffff:ffff,DE -2003:86:a74a::,2003:86:a74a:7fff:ffff:ffff:ffff:ffff,AT -2003:86:a74a:8000::,2003:c2:5bc3:ffff:ffff:ffff:ffff:ffff,DE -2003:c2:5bc4::,2003:c2:5bc4:7fff:ffff:ffff:ffff:ffff,IT -2003:c2:5bc4:8000::,2003:c6:43d5:ffff:ffff:ffff:ffff:ffff,DE -2003:c6:43d6::,2003:c6:43d6:7fff:ffff:ffff:ffff:ffff,US -2003:c6:43d6:8000::,2003:c8:cbc5:ffff:ffff:ffff:ffff:ffff,DE -2003:c8:cbc6::,2003:c8:cbc6:7fff:ffff:ffff:ffff:ffff,CH -2003:c8:cbc6:8000::,2003:d2:93ec:7fff:ffff:ffff:ffff:ffff,DE -2003:d2:93ec:8000::,2003:d2:93ec:ffff:ffff:ffff:ffff:ffff,DK -2003:d2:93ed::,2003:da:6bdd:7fff:ffff:ffff:ffff:ffff,DE -2003:da:6bdd:8000::,2003:da:6bdd:ffff:ffff:ffff:ffff:ffff,US -2003:da:6bde::,2003:dd:1bc3:7fff:ffff:ffff:ffff:ffff,DE -2003:dd:1bc3:8000::,2003:dd:1bc3:ffff:ffff:ffff:ffff:ffff,GB -2003:dd:1bc4::,2003:e3:dbce:7fff:ffff:ffff:ffff:ffff,DE -2003:e3:dbce:8000::,2003:e3:dbce:ffff:ffff:ffff:ffff:ffff,HU -2003:e3:dbcf::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2067:8e00::,2067:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2160:150::,2160:150:7fff:ffff:ffff:ffff:ffff:ffff,US -2400::,2400:fff:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:1000::,2400:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:1040::,2400:1040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:10c0::,2400:10c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:1100::,2400:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1140::,2400:1140:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:11c0::,2400:11c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:1200::,2400:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:1240::,2400:1240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:12c0::,2400:12c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1300::,2400:1300:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:1340::,2400:1340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1380::,2400:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:13c0::,2400:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:1400::,2400:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:1440::,2400:1440:ffff:ffff:ffff:ffff:ffff:ffff,BT -2400:1480::,2400:1480:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:14c0::,2400:14c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:1500::,2400:1500:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:1540::,2400:1540:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:1580::,2400:1580:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:15c0::,2400:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1600::,2400:1600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:1640::,2400:1640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1680::,2400:1680:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:16c0::,2400:16c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1700::,2400:1700:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:1740::,2400:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:17c0::,2400:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1800::,2400:1800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:1840::,2400:1840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1880::,2400:1880:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:18c0::,2400:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1900::,2400:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:1940::,2400:1940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1980::,2400:1980:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:19c0::,2400:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1a00::,2400:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:1a40::,2400:1a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1a80::,2400:1a80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:1ac0::,2400:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1b00::,2400:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:1b40::,2400:1b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1b80::,2400:1b80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:1bc0::,2400:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:1c00::,2400:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:1c40::,2400:1c40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1c80::,2400:1c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1cc0::,2400:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1d00::,2400:1d00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:1d40::,2400:1d40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1d80::,2400:1d80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1dc0::,2400:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1e00::,2400:1e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:1e40::,2400:1e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1e80::,2400:1e80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1ec0::,2400:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1f00::,2400:1f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:1f40::,2400:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:1f80::,2400:1f80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:1fc0::,2400:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:2000::,2400:2410:3c1:fff:ffff:ffff:ffff:ffff,JP -2400:2410:3c1:1000::,2400:2410:3c1:1fff:ffff:ffff:ffff:ffff,US -2400:2410:3c1:2000::,2400:2411:91c2:23ff:ffff:ffff:ffff:ffff,JP -2400:2411:91c2:2400::,2400:2411:91c2:27ff:ffff:ffff:ffff:ffff,US -2400:2411:91c2:2800::,2400:2412:27a1:bfff:ffff:ffff:ffff:ffff,JP -2400:2412:27a1:c000::,2400:2412:27a1:ffff:ffff:ffff:ffff:ffff,US -2400:2412:27a2::,2400:2652:719f:ffff:ffff:ffff:ffff:ffff,JP -2400:2652:71a0::,2400:2652:71a0:7fff:ffff:ffff:ffff:ffff,NO -2400:2652:71a0:8000::,2400:2653:282:7fff:ffff:ffff:ffff:ffff,JP -2400:2653:282:8000::,2400:2653:282:ffff:ffff:ffff:ffff:ffff,CA -2400:2653:283::,2400:2653:3c0:7fff:ffff:ffff:ffff:ffff,JP -2400:2653:3c0:8000::,2400:2653:3c0:ffff:ffff:ffff:ffff:ffff,US -2400:2653:3c1::,2400:2653:a1a1:ffff:ffff:ffff:ffff:ffff,JP -2400:2653:a1a2::,2400:2653:a1a2:7fff:ffff:ffff:ffff:ffff,US -2400:2653:a1a2:8000::,2400:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:3040::,2400:3040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3080::,2400:3080:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:30c0::,2400:30c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:3100::,2400:3100:ffff:ffff:ffff:ffff:ffff:ffff,VU -2400:3140::,2400:3140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3180::,2400:3180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:31c0::,2400:31c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3200::,2400:3200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3240::,2400:3240:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:3280::,2400:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:32c0::,2400:32c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3300::,2400:3300:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:3340::,2400:3340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3380::,2400:3380:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:33c0::,2400:33c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3400::,2400:3400:ffff:ffff:ffff:ffff:ffff:ffff,VU -2400:3440::,2400:3440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3480::,2400:3480:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:34c0::,2400:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3500::,2400:3500:ffff:ffff:ffff:ffff:ffff:ffff,TV -2400:3540::,2400:3540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3580::,2400:3580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:35c0::,2400:35c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3600::,2400:3600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3640::,2400:3640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3680::,2400:3680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:36c0::,2400:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3740::,2400:3740:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:37c0::,2400:37c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:3800::,2400:3800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:3840::,2400:3840:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3880::,2400:3880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:38c0::,2400:38c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3900::,2400:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:3940::,2400:3940:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3980::,2400:3980:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:39c0::,2400:39c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3a00::,2400:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3a40::,2400:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3a80::,2400:3a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3ac0::,2400:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3b00::,2400:3b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3b40::,2400:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3b80::,2400:3b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3bc0::,2400:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3c00::,2400:3c03:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:3c40::,2400:3c40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3c80::,2400:3c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:3cc0::,2400:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3d00::,2400:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:3d40::,2400:3d40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:3d80::,2400:3d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:3dc0::,2400:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:3e00::,2400:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3e40::,2400:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:3e80::,2400:3e80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:3ec0::,2400:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:3f00::,2400:3f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:3f40::,2400:3f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:3f80::,2400:3f80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:3fc0::,2400:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4000::,2400:402d:a2d8:ffff:ffff:ffff:ffff:ffff,JP -2400:402d:a2d9::,2400:402d:a2d9:7fff:ffff:ffff:ffff:ffff,US -2400:402d:a2d9:8000::,2400:402e:9fba:7fff:ffff:ffff:ffff:ffff,JP -2400:402e:9fba:8000::,2400:402e:9fba:ffff:ffff:ffff:ffff:ffff,MY -2400:402e:9fbb::,2400:402e:abad:2bff:ffff:ffff:ffff:ffff,JP -2400:402e:abad:2c00::,2400:402e:abad:2cff:ffff:ffff:ffff:ffff,US -2400:402e:abad:2d00::,2400:4120:aa50:ffff:ffff:ffff:ffff:ffff,JP -2400:4120:aa51::,2400:4120:aa51:7fff:ffff:ffff:ffff:ffff,BR -2400:4120:aa51:8000::,2400:4122:8b5d:ffff:ffff:ffff:ffff:ffff,JP -2400:4122:8b5e::,2400:4122:8b5e:7fff:ffff:ffff:ffff:ffff,CO -2400:4122:8b5e:8000::,2400:4136:9f46:ffff:ffff:ffff:ffff:ffff,JP -2400:4136:9f47::,2400:4136:9f47:7fff:ffff:ffff:ffff:ffff,DE -2400:4136:9f47:8000::,2400:43ff:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:4400::,2400:4400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:4440::,2400:4440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4480::,2400:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:44c0::,2400:44c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4500::,2400:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:4540::,2400:4540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4580::,2400:4580:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:45c0::,2400:45c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:4600::,2400:4600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4640::,2400:4640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4680::,2400:4680:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:46c0::,2400:46c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4700::,2400:4700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4740::,2400:4740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4780::,2400:4780:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:47c0::,2400:47c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:4800::,2400:4800:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:4840::,2400:4840:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:4880::,2400:4880:ffff:ffff:ffff:ffff:ffff:ffff,KH -2400:48c0::,2400:48c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:4900::,2400:4900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:4940::,2400:4940:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:4980::,2400:4980:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:49c0::,2400:49c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:4a00::,2400:4a00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:4a40::,2400:4a40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:4a80::,2400:4a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:4ac0::,2400:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:4b00::,2400:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4b40::,2400:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4b80::,2400:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4bc0::,2400:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4c00::,2400:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:4c40::,2400:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:4c80::,2400:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:4cc0::,2400:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:4d00::,2400:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4d40::,2400:4d40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:4dc0::,2400:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4e00::,2400:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4e40::,2400:4e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:4e80::,2400:4e80:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:4ec0::,2400:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:4f00::,2400:4f00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:4f40::,2400:4f40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:4fc0::,2400:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:5000::,2400:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5040::,2400:5040:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:5080::,2400:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:50c0::,2400:50c0:ffff:ffff:ffff:ffff:ffff:ffff,BT -2400:5100::,2400:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:5140::,2400:5140:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:5180::,2400:5180:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:51c0::,2400:51c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5200::,2400:5200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:5240::,2400:5240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5280::,2400:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:52c0::,2400:52c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:5300::,2400:5300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:5340::,2400:5340:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5380::,2400:5380:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:53c0::,2400:53c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5400::,2400:5400:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5440::,2400:5440:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5480::,2400:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:54c0::,2400:54c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:5500::,2400:5500:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:5540::,2400:5540:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:5580::,2400:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:55c0::,2400:55c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5600::,2400:5600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5640::,2400:5640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5680::,2400:5680:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:56c0::,2400:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5700::,2400:5700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:5740::,2400:5740:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:5780::,2400:5780:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:57c0::,2400:57c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5800::,2400:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:5840::,2400:5840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5880::,2400:5880:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:58c0::,2400:58c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:5900::,2400:5900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:5940::,2400:5940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:59c0::,2400:59c0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:5a00::,2400:5a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5a40::,2400:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5a80::,2400:5a80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:5ac0::,2400:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5b40::,2400:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5b80::,2400:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5bc0::,2400:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5c40::,2400:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5c80::,2400:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5cc0::,2400:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5d00::,2400:5d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5d40::,2400:5d40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:5d80::,2400:5d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5dc0::,2400:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5e00::,2400:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:5e40::,2400:5e40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5e80::,2400:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:5ec0::,2400:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:5f00::,2400:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PF -2400:5f40::,2400:5f40:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:5f80::,2400:5f80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:5fc0::,2400:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6000::,2400:6000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6040::,2400:6040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6080::,2400:6080:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:60c0::,2400:60c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6100::,2400:6100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:6140::,2400:6140:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:6180::,2400:6180:ff:ffff:ffff:ffff:ffff:ffff,SG -2400:6180:100::,2400:6180:100:7fff:ffff:ffff:ffff:ffff,IN -2400:6180:100:8000::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:61c0::,2400:61c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6200::,2400:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6240::,2400:6240:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:6280::,2400:6280:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:62c0::,2400:62c0:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:6300::,2400:6300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:6340::,2400:6340:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:6380::,2400:6380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:63c0::,2400:63c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:6400::,2400:6400:ffff:ffff:ffff:ffff:ffff:ffff,TO -2400:6440::,2400:6440:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:6480::,2400:6480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:64c0::,2400:64c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:6500::,2400:6500::70ff:ffff:ffff:ffff:ffff,SG -2400:6500:0:7100::,2400:6500::71ff:ffff:ffff:ffff:ffff,JP -2400:6500:0:7200::,2400:6500::72ff:ffff:ffff:ffff:ffff,AU -2400:6500:0:7300::,2400:6500::73ff:ffff:ffff:ffff:ffff,SG -2400:6500:0:7400::,2400:6500::74ff:ffff:ffff:ffff:ffff,KR -2400:6500:0:7500::,2400:6500::75ff:ffff:ffff:ffff:ffff,IN -2400:6500:0:7600::,2400:6500:100:70ff:ffff:ffff:ffff:ffff,SG -2400:6500:100:7100::,2400:6500:100:72ff:ffff:ffff:ffff:ffff,CN -2400:6500:100:7300::,2400:6500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:6540::,2400:6540:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:6580::,2400:6580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:65c0::,2400:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:6600::,2400:6600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6640::,2400:6640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6680::,2400:6680:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:66c0::,2400:66c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6700::,2400:6700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:6740::,2400:6740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6780::,2400:6780:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:67c0::,2400:67c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6800::,2400:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:6840::,2400:6840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6880::,2400:6880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:68c0::,2400:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6900::,2400:6900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:6940::,2400:6940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6980::,2400:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:69c0::,2400:69c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6a00::,2400:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6a40::,2400:6a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6a80::,2400:6a80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:6ac0::,2400:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6b00::,2400:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:6b40::,2400:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6b80::,2400:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:6bc0::,2400:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6c00::,2400:6c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:6c40::,2400:6c40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6c80::,2400:6c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:6cc0::,2400:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6d00::,2400:6d00:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2400:6d40::,2400:6d40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6d80::,2400:6d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:6dc0::,2400:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6e00::,2400:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6e40::,2400:6e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6e80::,2400:6e80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:6ec0::,2400:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6f00::,2400:6f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:6f40::,2400:6f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6f80::,2400:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:6fc0::,2400:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7000::,2400:7000:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:7040::,2400:7040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7080::,2400:7080:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:70c0::,2400:70c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7100::,2400:7100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7140::,2400:7140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7180::,2400:7180:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:71c0::,2400:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7200::,2400:7200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7240::,2400:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:72c0::,2400:72c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7300::,2400:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:7340::,2400:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7380::,2400:7380:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:73c0::,2400:73c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7400::,2400:7400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:7440::,2400:7440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7480::,2400:7480:ffff:ffff:ffff:ffff:ffff:ffff,MN -2400:74c0::,2400:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7500::,2400:7500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:7540::,2400:7540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:75c0::,2400:75c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7600::,2400:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7640::,2400:7640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7680::,2400:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:76c0::,2400:76c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7700::,2400:7700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:7740::,2400:7740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7780::,2400:7780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:77c0::,2400:77c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7800::,2400:7800:4319:ffff:ffff:ffff:ffff:ffff,JP -2400:7800:431a::,2400:7800:431a:7fff:ffff:ffff:ffff:ffff,US -2400:7800:431a:8000::,2400:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:7840::,2400:7840:ffff:ffff:ffff:ffff:ffff:ffff,SE -2400:7880::,2400:7880:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:78c0::,2400:78c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:7900::,2400:7900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:7940::,2400:7940:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:7980::,2400:7980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:79c0::,2400:79c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7a00::,2400:7a00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:7a40::,2400:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7a80::,2400:7a80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:7ac0::,2400:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7b00::,2400:7b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:7b40::,2400:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:7b80::,2400:7b83:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:7bc0::,2400:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7c00::,2400:7c00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:7c40::,2400:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:7c80::,2400:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:7cc0::,2400:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:7d00::,2400:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7d80::,2400:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7dc0::,2400:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:7e00::,2400:7e00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:7e40::,2400:7e40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:7e80::,2400:7e80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:7ec0::,2400:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:7f00::,2400:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:7f80::,2400:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:7fc0::,2400:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8000::,2400:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8040::,2400:8040:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8080::,2400:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:80c0::,2400:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8100::,2400:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8140::,2400:8140:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8180::,2400:8180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:81c0::,2400:81c0:ffff:ffff:ffff:ffff:ffff:ffff,LA -2400:8200::,2400:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8240::,2400:8240:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:8280::,2400:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:82c0::,2400:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8300::,2400:8300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8340::,2400:8340:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8380::,2400:8380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:83c0::,2400:83c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:8400::,2400:8400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8440::,2400:8440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8480::,2400:8480:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:84c0::,2400:84c0:e:ffff:ffff:ffff:ffff:ffff,HK -2400:84c0:f::,2400:84c0:f:7fff:ffff:ffff:ffff:ffff,US -2400:84c0:f:8000::,2400:84c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8500::,2400:8500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8540::,2400:8540:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8580::,2400:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:85c0::,2400:85c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8600::,2400:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8640::,2400:8640:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:86c0::,2400:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:8700::,2400:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8740::,2400:8740:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8780::,2400:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:87c0::,2400:87c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8800::,2400:8800:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8840::,2400:8840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8880::,2400:8880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:88c0::,2400:88c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8900::,2400:8900:e001:294d:49c2:953c:2c0c:16a0,JP -2400:8900:e001:294d:49c2:953c:2c0c:16a1,2400:8900:e001:294d:49c2:953c:2c0c:16a1,SG -2400:8900:e001:294d:49c2:953c:2c0c:16a2,2400:8900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8901::,2400:8901:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:8902::,2400:8902:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8903::,2400:8903:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:8940::,2400:8940:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:8980::,2400:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:89c0::,2400:89c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8a40::,2400:8a40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8a80::,2400:8a81:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:8b00::,2400:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8b40::,2400:8b40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8b80::,2400:8b80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8bc0::,2400:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8c00::,2400:8c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:8c40::,2400:8c40:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:8c80::,2400:8c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8cc0::,2400:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8d00::,2400:8d00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8d40::,2400:8d40:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:8dc0::,2400:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8e00::,2400:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8e40::,2400:8e40:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:8e80::,2400:8e80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:8ec0::,2400:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:8f00::,2400:8f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:8f40::,2400:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8f80::,2400:8f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:8fc0::,2400:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9000::,2400:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9040::,2400:9040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9080::,2400:9080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:90c0::,2400:90c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:9100::,2400:9100:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:9140::,2400:9140:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:9180::,2400:9180:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:91c0::,2400:91c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:9240::,2400:9240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9280::,2400:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:92c0::,2400:92c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9300::,2400:9300:ffff:ffff:ffff:ffff:ffff:ffff,PG -2400:9340::,2400:9340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9380::,2400:9381:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:93c0::,2400:93c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:9400::,2400:9400:ffff:ffff:ffff:ffff:ffff:ffff,BN -2400:9440::,2400:9440:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:9480::,2400:9480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:94c0::,2400:94c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9500::,2400:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:9540::,2400:9540:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:9580::,2400:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:95c0::,2400:95c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9600::,2400:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9640::,2400:9640:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:96c0::,2400:96c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:9700::,2400:9700:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:9740::,2400:9740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:9780::,2400:9780:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:97c0::,2400:97c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:9800::,2400:9800:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:9840::,2400:9840:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:9880::,2400:9880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:98c0::,2400:98c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9900::,2400:9900:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:9940::,2400:9940:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:9980::,2400:9980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:99c0::,2400:99c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9a00::,2400:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9a40::,2400:9a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9a80::,2400:9a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9ac0::,2400:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:9b40::,2400:9b40:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:9b80::,2400:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9bc0::,2400:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:9c00::,2400:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:9c40::,2400:9c40:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:9c80::,2400:9c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:9cc0::,2400:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:9d00::,2400:9d00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:9d80::,2400:9d80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:9dc0::,2400:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9e00::,2400:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:9e40::,2400:9e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:9e80::,2400:9e80:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:9f40::,2400:9f40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:9f80::,2400:9f80:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:9fc0::,2400:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:a040::,2400:a040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:a0c0::,2400:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:a140::,2400:a140:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:a1c0::,2400:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:a240::,2400:a240:ffff:ffff:ffff:ffff:ffff:ffff,LK -2400:a2c0::,2400:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:a300::,2400:a300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:a340::,2400:a340:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:a380::,2400:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a3c0::,2400:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:a400::,2400:a400:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:a440::,2400:a440:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:a480::,2400:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a4c0::,2400:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a500::,2400:a500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a540::,2400:a540:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:a580::,2400:a580:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:a5c0::,2400:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:a600::,2400:a600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a640::,2400:a640:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:a680::,2400:a680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:a6c0::,2400:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a700::,2400:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a740::,2400:a740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:a780::,2400:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a7c0::,2400:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:a800::,2400:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:a840::,2400:a840:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a880::,2400:a880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:a8c0::,2400:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a900::,2400:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a940::,2400:a940:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:a980::,2400:a987:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:a9c0::,2400:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:aa00::,2400:aa00:ffff:ffff:ffff:ffff:ffff:ffff,LA -2400:aa40::,2400:aa40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:aa80::,2400:aa80:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:aac0::,2400:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ab00::,2400:ab00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:ab40::,2400:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:ab80::,2400:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:abc0::,2400:abc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ac00::,2400:ac00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:ac40::,2400:ac40:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:ac80::,2400:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:acc0::,2400:acc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ad00::,2400:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:ad40::,2400:ad40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ad80::,2400:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:adc0::,2400:addf:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:ae00::,2400:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ae40::,2400:ae40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:ae80::,2400:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:aec0::,2400:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:af40::,2400:af40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:af80::,2400:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:afc0::,2400:afc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:b000::,2400:b000:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:b040::,2400:b040:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:b080::,2400:b080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:b0c0::,2400:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b100::,2400:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b140::,2400:b140:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:b180::,2400:b180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:b1c0::,2400:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:b200::,2400:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b240::,2400:b240:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:b2c0::,2400:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b300::,2400:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b340::,2400:b340:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:b380::,2400:b380:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:b3c0::,2400:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:b400::,2400:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:b440::,2400:b440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b480::,2400:b480:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:b4c0::,2400:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b500::,2400:b500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b540::,2400:b540:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:b580::,2400:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:b5c0::,2400:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:b600::,2400:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b640::,2400:b640:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:b680::,2400:b680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:b6c0::,2400:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b700::,2400:b700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b740::,2400:b740:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:b780::,2400:b780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b7c0::,2400:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b800::,2400:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b840::,2400:b840:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:b880::,2400:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:b8c0::,2400:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:b940::,2400:b940:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:b980::,2400:b980:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:b9c0::,2400:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ba40::,2400:ba41::ffff:ffff:ffff:ffff:ffff,CN -2400:ba41:1::,2400:ba41:1:ffff:ffff:ffff:ffff:ffff,US -2400:ba41:2::,2400:ba41:2:ffff:ffff:ffff:ffff:ffff,SG -2400:ba41:3::,2400:ba41:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ba80::,2400:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:bac0::,2400:bac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:bb00::,2400:bb00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:bb40::,2400:bb40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2400:bbc0::,2400:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:bc00::,2400:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:bc40::,2400:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:bc80::,2400:bc80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:bcc0::,2400:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:bd00::,2400:bd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:bd40::,2400:bd40:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:bdc0::,2400:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:be00::,2400:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:be40::,2400:be40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:be80::,2400:be80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:bec0::,2400:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:bf00::,2400:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:bf40::,2400:bf40:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:bf80::,2400:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:bfc0::,2400:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c000::,2400:c000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:c040::,2400:c040:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c080::,2400:c080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:c0c0::,2400:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,VU -2400:c100::,2400:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c140::,2400:c140:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:c180::,2400:c180:ffff:ffff:ffff:ffff:ffff:ffff,LA -2400:c1c0::,2400:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:c200::,2400:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:c240::,2400:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c2c0::,2400:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c300::,2400:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c340::,2400:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c380::,2400:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:c3c0::,2400:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c400::,2400:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c401::,2400:c401:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:c440::,2400:c440:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:c4c0::,2400:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:c500::,2400:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:c540::,2400:c540:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:c580::,2400:c580:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:c5c0::,2400:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:c600::,2400:c600:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:c640::,2400:c640:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:c680::,2400:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c6c0::,2400:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:c700::,2400:c700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:c740::,2400:c740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:c780::,2400:c780:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:c7c0::,2400:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:c800::,2400:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:c840::,2400:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:c880::,2400:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:c8c0::,2400:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:c900::,2400:c900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:c940::,2400:c940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:c9c0::,2400:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ca40::,2400:ca40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cac0::,2400:cac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cb00::,2400:cb00:18:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:19::,2400:cb00:19:ffff:ffff:ffff:ffff:ffff,FR -2400:cb00:1a::,2400:cb00:1f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:20::,2400:cb00:20:ffff:ffff:ffff:ffff:ffff,NL -2400:cb00:21::,2400:cb00:21:ffff:ffff:ffff:ffff:ffff,GB -2400:cb00:22::,2400:cb00:22:ffff:ffff:ffff:ffff:ffff,JP -2400:cb00:23::,2400:cb00:23:ffff:ffff:ffff:ffff:ffff,HK -2400:cb00:24::,2400:cb00:25:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:26::,2400:cb00:26:ffff:ffff:ffff:ffff:ffff,AU -2400:cb00:27::,2400:cb00:28:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:29::,2400:cb00:29:ffff:ffff:ffff:ffff:ffff,CA -2400:cb00:2a::,2400:cb00:30:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:31::,2400:cb00:31:ffff:ffff:ffff:ffff:ffff,CZ -2400:cb00:32::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:34::,2400:cb00:34:ffff:ffff:ffff:ffff:ffff,KR -2400:cb00:35::,2400:cb00:35:ffff:ffff:ffff:ffff:ffff,SG -2400:cb00:36::,2400:cb00:37:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:38::,2400:cb00:38:ffff:ffff:ffff:ffff:ffff,CL -2400:cb00:39::,2400:cb00:39:ffff:ffff:ffff:ffff:ffff,IT -2400:cb00:3a::,2400:cb00:3f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:40::,2400:cb00:40:ffff:ffff:ffff:ffff:ffff,ES -2400:cb00:41::,2400:cb00:41:ffff:ffff:ffff:ffff:ffff,CO -2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:43::,2400:cb00:43:ffff:ffff:ffff:ffff:ffff,PE -2400:cb00:44::,2400:cb00:44:ffff:ffff:ffff:ffff:ffff,AR -2400:cb00:45::,2400:cb00:45:ffff:ffff:ffff:ffff:ffff,ZA -2400:cb00:46::,2400:cb00:46:ffff:ffff:ffff:ffff:ffff,NZ -2400:cb00:47::,2400:cb00:47:ffff:ffff:ffff:ffff:ffff,AU -2400:cb00:48::,2400:cb00:48:ffff:ffff:ffff:ffff:ffff,DE -2400:cb00:49::,2400:cb00:49:ffff:ffff:ffff:ffff:ffff,FR -2400:cb00:4a::,2400:cb00:4f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:50::,2400:cb00:50:ffff:ffff:ffff:ffff:ffff,RO -2400:cb00:51::,2400:cb00:51:ffff:ffff:ffff:ffff:ffff,JP -2400:cb00:52::,2400:cb00:52:ffff:ffff:ffff:ffff:ffff,IE -2400:cb00:53::,2400:cb00:53:ffff:ffff:ffff:ffff:ffff,KW -2400:cb00:54::,2400:cb00:54:ffff:ffff:ffff:ffff:ffff,QA -2400:cb00:55::,2400:cb00:55:ffff:ffff:ffff:ffff:ffff,OM -2400:cb00:56::,2400:cb00:56:ffff:ffff:ffff:ffff:ffff,MY -2400:cb00:57::,2400:cb00:59:ffff:ffff:ffff:ffff:ffff,IN -2400:cb00:5a::,2400:cb00:5f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:60::,2400:cb00:60:ffff:ffff:ffff:ffff:ffff,AE -2400:cb00:61::,2400:cb00:61:ffff:ffff:ffff:ffff:ffff,KE -2400:cb00:62::,2400:cb00:62:ffff:ffff:ffff:ffff:ffff,EG -2400:cb00:63::,2400:cb00:63:ffff:ffff:ffff:ffff:ffff,GB -2400:cb00:64::,2400:cb00:64:ffff:ffff:ffff:ffff:ffff,CH -2400:cb00:65::,2400:cb00:65:ffff:ffff:ffff:ffff:ffff,DK -2400:cb00:66::,2400:cb00:66:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:67::,2400:cb00:67:ffff:ffff:ffff:ffff:ffff,DE -2400:cb00:68::,2400:cb00:68:ffff:ffff:ffff:ffff:ffff,PH -2400:cb00:69::,2400:cb00:69:ffff:ffff:ffff:ffff:ffff,CA -2400:cb00:6a::,2400:cb00:6f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:70::,2400:cb00:70:ffff:ffff:ffff:ffff:ffff,CA -2400:cb00:71::,2400:cb00:71:ffff:ffff:ffff:ffff:ffff,DE -2400:cb00:72::,2400:cb00:72:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:73::,2400:cb00:73:ffff:ffff:ffff:ffff:ffff,PL -2400:cb00:74::,2400:cb00:74:ffff:ffff:ffff:ffff:ffff,BG -2400:cb00:75::,2400:cb00:75:ffff:ffff:ffff:ffff:ffff,DE -2400:cb00:76::,2400:cb00:76:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:77::,2400:cb00:77:ffff:ffff:ffff:ffff:ffff,PH -2400:cb00:78::,2400:cb00:78:ffff:ffff:ffff:ffff:ffff,BE -2400:cb00:79::,2400:cb00:79:ffff:ffff:ffff:ffff:ffff,FI -2400:cb00:7a::,2400:cb00:7f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:80::,2400:cb00:80:ffff:ffff:ffff:ffff:ffff,TW -2400:cb00:81::,2400:cb00:82:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:83::,2400:cb00:83:ffff:ffff:ffff:ffff:ffff,NO -2400:cb00:84::,2400:cb00:85:ffff:ffff:ffff:ffff:ffff,AU -2400:cb00:86::,2400:cb00:86:ffff:ffff:ffff:ffff:ffff,TH -2400:cb00:87::,2400:cb00:87:ffff:ffff:ffff:ffff:ffff,RU -2400:cb00:88::,2400:cb00:88:ffff:ffff:ffff:ffff:ffff,GR -2400:cb00:89::,2400:cb00:89:ffff:ffff:ffff:ffff:ffff,ES -2400:cb00:8a::,2400:cb00:8f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:90::,2400:cb00:90:ffff:ffff:ffff:ffff:ffff,PA -2400:cb00:91::,2400:cb00:91:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:92::,2400:cb00:92:ffff:ffff:ffff:ffff:ffff,IN -2400:cb00:93::,2400:cb00:94:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:95::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,EC -2400:cb00:96::,2400:cb00:96:ffff:ffff:ffff:ffff:ffff,AO -2400:cb00:97::,2400:cb00:97:ffff:ffff:ffff:ffff:ffff,BR -2400:cb00:98::,2400:cb00:98:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:99::,2400:cb00:99:ffff:ffff:ffff:ffff:ffff,LU -2400:cb00:9a::,2400:cb00:ff:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:100::,2400:cb00:100:ffff:ffff:ffff:ffff:ffff,DE -2400:cb00:101::,2400:cb00:101:ffff:ffff:ffff:ffff:ffff,BR -2400:cb00:102::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:104::,2400:cb00:104:ffff:ffff:ffff:ffff:ffff,TH -2400:cb00:105::,2400:cb00:105:ffff:ffff:ffff:ffff:ffff,CW -2400:cb00:106::,2400:cb00:106:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:107::,2400:cb00:107:ffff:ffff:ffff:ffff:ffff,PT -2400:cb00:108::,2400:cb00:10f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:110::,2400:cb00:110:ffff:ffff:ffff:ffff:ffff,CL -2400:cb00:111::,2400:cb00:111:ffff:ffff:ffff:ffff:ffff,LK -2400:cb00:112::,2400:cb00:112:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:113::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,ZA -2400:cb00:114::,2400:cb00:114:ffff:ffff:ffff:ffff:ffff,AT -2400:cb00:115::,2400:cb00:116:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:117::,2400:cb00:117:ffff:ffff:ffff:ffff:ffff,AM -2400:cb00:118::,2400:cb00:11f:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:120::,2400:cb00:120:ffff:ffff:ffff:ffff:ffff,RS -2400:cb00:121::,2400:cb00:121:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:122::,2400:cb00:122:ffff:ffff:ffff:ffff:ffff,DJ -2400:cb00:123::,2400:cb00:123:ffff:ffff:ffff:ffff:ffff,HU -2400:cb00:124::,2400:cb00:124:ffff:ffff:ffff:ffff:ffff,HR -2400:cb00:125::,2400:cb00:125:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:126::,2400:cb00:126:ffff:ffff:ffff:ffff:ffff,IT -2400:cb00:127::,2400:cb00:127:ffff:ffff:ffff:ffff:ffff,TH -2400:cb00:128::,2400:cb00:128:ffff:ffff:ffff:ffff:ffff,SE -2400:cb00:129::,2400:cb00:129:ffff:ffff:ffff:ffff:ffff,TH -2400:cb00:12a::,2400:cb00:131:ffff:ffff:ffff:ffff:ffff,US -2400:cb00:132::,2400:cb00:132:ffff:ffff:ffff:ffff:ffff,UA -2400:cb00:133::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:cb40::,2400:cb40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cbc0::,2400:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:cc40::,2400:cc40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ccc0::,2400:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cd00::,2400:cd00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:cd40::,2400:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cd80::,2400:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:cdc0::,2400:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ce00::,2400:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ce40::,2400:ce40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ce80::,2400:ce80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:cec0::,2400:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:cf00::,2400:cf00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:cf40::,2400:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cf80::,2400:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:cfc0::,2400:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d040::,2400:d040:ffff:ffff:ffff:ffff:ffff:ffff,LK -2400:d0c0::,2400:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d100::,2400:d100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d140::,2400:d140:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:d180::,2400:d180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:d1c0::,2400:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d200::,2400:d200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d240::,2400:d240:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:d280::,2400:d280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:d2c0::,2400:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:d300::,2400:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d340::,2400:d340:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:d380::,2400:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d3c0::,2400:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:d400::,2400:d400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:d440::,2400:d440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d480::,2400:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:d4c0::,2400:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:d500::,2400:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:d540::,2400:d540:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:d580::,2400:d580:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:d5c0::,2400:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:d600::,2400:d600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d640::,2400:d640:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:d680::,2400:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:d6c0::,2400:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d700::,2400:d700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:d740::,2400:d740:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:d780::,2400:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:d7c0::,2400:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:d800::,2400:d803:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:d840::,2400:d840:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:d880::,2400:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:d8c0::,2400:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:d940::,2400:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:d980::,2400:d980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:d9c0::,2400:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:da00::,2400:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:da40::,2400:da40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:da80::,2400:da80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:dac0::,2400:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:db00::,2400:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:db40::,2400:db40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:db80::,2400:db80:ffff:ffff:ffff:ffff:ffff:ffff,MN -2400:dbc0::,2400:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:dc00::,2400:dc00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:dc40::,2400:dc40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:dc80::,2400:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:dcc0::,2400:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:dd00::,2400:dd0f:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:dd40::,2400:dd40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:dd80::,2400:dd80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ddc0::,2400:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:de00::,2400:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:de40::,2400:de40:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:de80::,2400:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:dec0::,2400:dec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:df00::,2400:df00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:df40::,2400:df40:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:df80::,2400:df80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2400:dfc0::,2400:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:e000::,2400:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:e040::,2400:e040:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:e0c0::,2400:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:e100::,2400:e100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:e140::,2400:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:e180::,2400:e180:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:e1c0::,2400:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e240::,2400:e240:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:e2c0::,2400:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e340::,2400:e340:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:e3c0::,2400:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:e440::,2400:e440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:e4c0::,2400:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:e540::,2400:e540:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:e5c0::,2400:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:e640::,2400:e640:ffff:ffff:ffff:ffff:ffff:ffff,AF -2400:e680::,2400:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:e6c0::,2400:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:e740::,2400:e740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:e780::,2400:e780:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:e7c0::,2400:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:e840::,2400:e840:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:e880::,2400:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:e8c0::,2400:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:e900::,2400:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e940::,2400:e940:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:e980::,2400:e980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:e9c0::,2400:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:ea00::,2400:ea00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:ea40::,2400:ea40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:ea80::,2400:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:eac0::,2400:eac0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:eb00::,2400:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:eb40::,2400:eb40:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:eb80::,2400:eb80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ebc0::,2400:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ec00::,2400:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:ec40::,2400:ec40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:ec80::,2400:ec80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:ecc0::,2400:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:ed00::,2400:ed00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:ed40::,2400:ed40:ffff:ffff:ffff:ffff:ffff:ffff,VN -2400:ed80::,2400:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:edc0::,2400:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ee00::,2400:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ee40::,2400:ee40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:ee80::,2400:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:eec0::,2400:eec0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ef00::,2400:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:ef40::,2400:ef40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:ef80::,2400:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:efc0::,2400:efc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2400:f000::,2400:f000:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f040::,2400:f040:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:f080::,2400:f080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:f0c0::,2400:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:f100::,2400:f100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f140::,2400:f140:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:f180::,2400:f180:ffff:ffff:ffff:ffff:ffff:ffff,US -2400:f1c0::,2400:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:f200::,2400:f200:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:f240::,2400:f240:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:f280::,2400:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:f2c0::,2400:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:f300::,2400:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:f340::,2400:f340:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:f380::,2400:f380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:f3c0::,2400:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f400::,2400:f400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:f440::,2400:f440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:f480::,2400:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f4c0::,2400:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2400:f540::,2400:f540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f580::,2400:f580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:f5c0::,2400:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f600::,2400:f600:ffff:ffff:ffff:ffff:ffff:ffff,PH -2400:f640::,2400:f640:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:f680::,2400:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:f6c0::,2400:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:f700::,2400:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f740::,2400:f740:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:f780::,2400:f780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:f7c0::,2400:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f800::,2400:f800:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f840::,2400:f840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f880::,2400:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2400:f8c0::,2400:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:f900::,2400:f900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:f940::,2400:f940:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:f980::,2400:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:f9c0::,2400:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:fa00::,2400:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:fa40::,2400:fa40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:fa80::,2400:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:fac0::,2400:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fb00::,2400:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2400:fb40::,2400:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fb80::,2400:fb80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2400:fbc0::,2400:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fc00::,2400:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2400:fc40::,2400:fc40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fc80::,2400:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TW -2400:fcc0::,2400:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fd00::,2400:fd00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:fd40::,2400:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SC -2400:fd80::,2400:fd80:ffff:ffff:ffff:ffff:ffff:ffff,KR -2400:fdc0::,2400:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:fe00::,2400:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2400:fe40::,2400:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MM -2400:fe80::,2400:fe80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:fec0::,2400:fec0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2400:ff00::,2400:ff00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2400:ff40::,2400:ff40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:ffc0::,2400:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401::,2401:1:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:40::,2401:40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:80::,2401:80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c0::,2401:c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:100::,2401:100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:140::,2401:140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:180::,2401:180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1c0::,2401:1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:200::,2401:200:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:240::,2401:240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:280::,2401:280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:2c0::,2401:2c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:300::,2401:300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:340::,2401:340:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:380::,2401:380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3c0::,2401:3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:400::,2401:403:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:440::,2401:440:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:4c0::,2401:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:4c1:c202:1193:f0a8:d737:3761:2b87,2401:4c1:c202:1193:f0a8:d737:3761:2b87,US -2401:500::,2401:500:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:540::,2401:540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:580::,2401:580:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5c0::,2401:5c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:600::,2401:600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:640::,2401:640:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:680::,2401:680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:6c0::,2401:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:700::,2401:700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:740::,2401:740:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:780::,2401:780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7c0::,2401:7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:800::,2401:800:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:840::,2401:840:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:880::,2401:880:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:8c0::,2401:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:900::,2401:900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:940::,2401:940:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:980::,2401:980:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:9c0::,2401:9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a00::,2401:a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a40::,2401:a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ac0::,2401:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b00::,2401:b00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:b40::,2401:b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b80::,2401:b80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:bc0::,2401:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c00::,2401:c00:ffff:ffff:ffff:ffff:ffff:ffff,NC -2401:c40::,2401:c40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c80::,2401:c80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:cc0::,2401:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d00::,2401:d00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:d40::,2401:d40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d80::,2401:d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:dc0::,2401:dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e00::,2401:e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e40::,2401:e40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e80::,2401:e80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:ec0::,2401:ec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:f00::,2401:f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:f40::,2401:f40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:f80::,2401:f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:fc0::,2401:fc0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:1000::,2401:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1040::,2401:1040:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:10c0::,2401:10c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1100::,2401:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:1140::,2401:1140:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:11c0::,2401:11c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1200::,2401:1200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1240::,2401:1240:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:1280::,2401:1280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:12c0::,2401:12c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1300::,2401:1300:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:1340::,2401:1340:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1380::,2401:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:13c0::,2401:13c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1400::,2401:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1440::,2401:1440:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:14c0::,2401:14c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:1500::,2401:1500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1540::,2401:1540:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:1580::,2401:1580:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:15c0::,2401:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1600::,2401:1600:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:1640::,2401:1640:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:1680::,2401:1680:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:16c0::,2401:16c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:1700::,2401:1700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1740::,2401:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1780::,2401:1780:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:17c0::,2401:17c0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:1800::,2401:1801:77ff:ffff:ffff:ffff:ffff:ffff,HK -2401:1801:7800::,2401:1801:7800:7fff:ffff:ffff:ffff:ffff,AU -2401:1801:7800:8000::,2401:1801:7800:ffff:ffff:ffff:ffff:ffff,HK -2401:1801:7801::,2401:1801:7801:7fff:ffff:ffff:ffff:ffff,AU -2401:1801:7801:8000::,2401:1801:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:1840::,2401:1840:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1880::,2401:1880:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:18c0::,2401:18c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1900::,2401:1900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:1940::,2401:1940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1980::,2401:1980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:19c0::,2401:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1a00::,2401:1a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:1a40::,2401:1a40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1a80::,2401:1a80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:1ac0::,2401:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1b00::,2401:1b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1b40::,2401:1b40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:1b80::,2401:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1bc0::,2401:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:1c00::,2401:1c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1c40::,2401:1c40:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:1c80::,2401:1c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:1cc0::,2401:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:1d00::,2401:1d00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:1d40::,2401:1d40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1d80::,2401:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1dc0::,2401:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1e00::,2401:1e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1e40::,2401:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:1e80::,2401:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1ec0::,2401:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1f00::,2401:1f01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1f40::,2401:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:1f80::,2401:1f80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:1fc0::,2401:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:2000::,2401:2001:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2040::,2401:2040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2080::,2401:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:20c0::,2401:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2100::,2401:2100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2140::,2401:2140:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:21c0::,2401:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2200::,2401:2200:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:2240::,2401:2240:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:2280::,2401:2280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:22c0::,2401:22c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:2300::,2401:2300:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:2340::,2401:2340:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:2380::,2401:2380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:23c0::,2401:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2400::,2401:2400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:2440::,2401:2440:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:2480::,2401:2480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:24c0::,2401:24c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2500::,2401:2500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2540::,2401:2540:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2580::,2401:2580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:25c0::,2401:25c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2600::,2401:2600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2640::,2401:2640:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:2680::,2401:2680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:26c0::,2401:26c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2700::,2401:2700:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:2740::,2401:2740:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2780::,2401:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:27c0::,2401:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:2800::,2401:2800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2840::,2401:2840:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2880::,2401:2880:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:2900::,2401:2900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:2940::,2401:2940:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2980::,2401:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:29c0::,2401:29c0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:2a00::,2401:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2a40::,2401:2a40:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:2a80::,2401:2a80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:2ac0::,2401:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2b00::,2401:2b00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2b40::,2401:2b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2b80::,2401:2b80:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:2bc0::,2401:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:2c00::,2401:2c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:2c40::,2401:2c40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:2c80::,2401:2c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:2cc0::,2401:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2d00::,2401:2d00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:2d40::,2401:2d40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:2d80::,2401:2d80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:2dc0::,2401:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2e00::,2401:2e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2e40::,2401:2e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:2e80::,2401:2e80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:2ec0::,2401:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:2f00::,2401:2f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:2f40::,2401:2f40:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:2f80::,2401:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:2fc0::,2401:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3000::,2401:3000:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3040::,2401:3040:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3080::,2401:3080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:30c0::,2401:30c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:3100::,2401:3100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3140::,2401:3140:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:3180::,2401:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:31c0::,2401:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3200::,2401:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:3240::,2401:3240:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:3280::,2401:3280:ffff:ffff:ffff:ffff:ffff:ffff,MO -2401:32c0::,2401:32c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:3300::,2401:3300:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:3340::,2401:3340:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:3380::,2401:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:33c0::,2401:33c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3400::,2401:3400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:3440::,2401:3440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3480::,2401:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:34c0::,2401:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3540::,2401:3540:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3580::,2401:3580:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:35c0::,2401:35c0:ffff:ffff:ffff:ffff:ffff:ffff,MM -2401:3600::,2401:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:3640::,2401:3640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3680::,2401:3680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:36c0::,2401:36c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3740::,2401:3740:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:3780::,2401:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:37c0::,2401:37c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3800::,2401:3800:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3840::,2401:3840:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:3880::,2401:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:38c0::,2401:38c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3900::,2401:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3940::,2401:3940:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3980::,2401:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:39c0::,2401:39c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3a00::,2401:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3a40::,2401:3a40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3a80::,2401:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3ac0::,2401:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3b00::,2401:3b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:3b40::,2401:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:3b80::,2401:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3bc0::,2401:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:3c00::,2401:3c00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:3c40::,2401:3c40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3c80::,2401:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3cc0::,2401:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3d00::,2401:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:3d40::,2401:3d40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3d80::,2401:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3dc0::,2401:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:3e00::,2401:3e00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:3e40::,2401:3e40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:3e80::,2401:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3ec0::,2401:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:3f00::,2401:3f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:3f40::,2401:3f40:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:3f80::,2401:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3fc0::,2401:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:4000::,2401:4000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:4040::,2401:4040:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4080::,2401:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:40c0::,2401:40c0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:4100::,2401:4100:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:4140::,2401:4140:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4180::,2401:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:41c0::,2401:41c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4200::,2401:4200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:4240::,2401:4240:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4280::,2401:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:42c0::,2401:42c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4300::,2401:4300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4340::,2401:4340:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:4380::,2401:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:43c0::,2401:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4440::,2401:4440:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:44c0::,2401:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4540::,2401:4540:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:45c0::,2401:45c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4640::,2401:4640:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:46c0::,2401:46c0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4740::,2401:4740:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:47c0::,2401:47c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4800::,2401:4800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4840::,2401:4840:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4880::,2401:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:48c0::,2401:48c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:4900::,2401:4900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4a00::,2401:4a00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4a40::,2401:4a40:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:4a80::,2401:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:4ac0::,2401:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4b00::,2401:4b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:4b40::,2401:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4b80::,2401:4b80:ffff:ffff:ffff:ffff:ffff:ffff,TL -2401:4bc0::,2401:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4c00::,2401:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4c40::,2401:4c40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4c80::,2401:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4cc0::,2401:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:4d00::,2401:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4d40::,2401:4d47:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:4d80::,2401:4d80:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:4dc0::,2401:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4e00::,2401:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:4e40::,2401:4e40:ffff:ffff:ffff:ffff:ffff:ffff,MP -2401:4e80::,2401:4e80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:4ec0::,2401:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:4f00::,2401:4f00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:4f40::,2401:4f40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:4f80::,2401:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:4fc0::,2401:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5000::,2401:5000:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:5040::,2401:5040:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:50c0::,2401:50c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5100::,2401:5100:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2401:5140::,2401:5140:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:5180::,2401:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:51c0::,2401:51c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5200::,2401:5200:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:5240::,2401:5240:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:5280::,2401:5280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:52c0::,2401:52c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5300::,2401:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:5340::,2401:5340:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:53c0::,2401:53c0:ffff:ffff:ffff:ffff:ffff:ffff,PG -2401:5400::,2401:5400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:5440::,2401:5440:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5480::,2401:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:54c0::,2401:54c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5500::,2401:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5540::,2401:5540:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:55c0::,2401:55c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:5640::,2401:5640:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:5680::,2401:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:56c0::,2401:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:5700::,2401:5700:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:5740::,2401:5740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5780::,2401:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:57c0::,2401:57c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:5800::,2401:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5840::,2401:5840:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5880::,2401:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:58c0::,2401:58c0:ffff:ffff:ffff:ffff:ffff:ffff,GU -2401:5900::,2401:5900:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5940::,2401:5940:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:5980::,2401:5980:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:59c0::,2401:59c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:5a00::,2401:5a00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5a40::,2401:5a40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5a80::,2401:5a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:5ac0::,2401:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:5b00::,2401:5b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5b40::,2401:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:5b80::,2401:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5bc0::,2401:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:5c00::,2401:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5c40::,2401:5c40:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:5c80::,2401:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:5cc0::,2401:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:5d00::,2401:5d00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:5d40::,2401:5d40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5dc0::,2401:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:5e00::,2401:5e00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:5e40::,2401:5e40:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:5e80::,2401:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5ec0::,2401:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:5f00::,2401:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:5f40::,2401:5f40:ffff:ffff:ffff:ffff:ffff:ffff,BT -2401:5f80::,2401:5f80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:5fc0::,2401:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:6000::,2401:6fff:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7000::,2401:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:7040::,2401:7040:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:7080::,2401:7080:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:70c0::,2401:70c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:7100::,2401:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7140::,2401:7140:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:7180::,2401:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:71c0::,2401:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7200::,2401:7200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7240::,2401:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:72c0::,2401:72c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7300::,2401:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7340::,2401:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7380::,2401:7380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:73c0::,2401:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7400::,2401:7401:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:7440::,2401:7440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:74c0::,2401:74c0:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:7500::,2401:7500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:7540::,2401:7540:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:7580::,2401:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:75c0::,2401:75c0:ffff:ffff:ffff:ffff:ffff:ffff,MO -2401:7600::,2401:7600:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:7640::,2401:7640:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:7680::,2401:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:76c0::,2401:76c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:7700::,2401:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7740::,2401:7740:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:7780::,2401:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:77c0::,2401:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7800::,2401:7800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:7840::,2401:7840:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:7880::,2401:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:78c0::,2401:78c0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:7900::,2401:7900:ffff:ffff:ffff:ffff:ffff:ffff,LK -2401:7940::,2401:7940:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:7980::,2401:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:79c0::,2401:79c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:7a00::,2401:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7a40::,2401:7a40:ffff:ffff:ffff:ffff:ffff:ffff,VU -2401:7a80::,2401:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7ac0::,2401:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:7b00::,2401:7b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7b40::,2401:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:7b80::,2401:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7bc0::,2401:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7c00::,2401:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:7c40::,2401:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:7c80::,2401:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7cc0::,2401:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7d00::,2401:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:7d40::,2401:7d40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7d80::,2401:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7dc0::,2401:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:7e00::,2401:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7e40::,2401:7e40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:7e80::,2401:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:7ec0::,2401:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:7f00::,2401:7f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:7f40::,2401:7f40:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:7f80::,2401:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:7fc0::,2401:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8000::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:8040::,2401:8040:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:8080::,2401:8080:ffff:ffff:ffff:ffff:ffff:ffff,AF -2401:80c0::,2401:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8100::,2401:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8140::,2401:8140:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8180::,2401:8180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:81c0::,2401:81c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8200::,2401:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8240::,2401:8240:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:8280::,2401:8280:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:82c0::,2401:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8300::,2401:8300:ffff:ffff:ffff:ffff:ffff:ffff,MV -2401:8340::,2401:8340:ffff:ffff:ffff:ffff:ffff:ffff,MM -2401:8380::,2401:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:83c0::,2401:83c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8400::,2401:8400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:8440::,2401:8440:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:84c0::,2401:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2401:8500::,2401:8500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8540::,2401:8540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:85c0::,2401:85c0:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:8600::,2401:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8640::,2401:8640:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:8680::,2401:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:86c0::,2401:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:8700::,2401:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:8740::,2401:8740:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:87c0::,2401:87c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8800::,2401:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8840::,2401:8840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8880::,2401:8880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:88c0::,2401:88c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8900::,2401:8900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8940::,2401:8940:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:89c0::,2401:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8a00::,2401:8a00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8a40::,2401:8a40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:8a80::,2401:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8ac0::,2401:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:8b00::,2401:8b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:8b40::,2401:8b40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:8b80::,2401:8b80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8bc0::,2401:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8c00::,2401:8c01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8c40::,2401:8c40:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:8c80::,2401:8c80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:8cc0::,2401:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8d40::,2401:8d40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:8dc0::,2401:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:8e40::,2401:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8e80::,2401:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:8ec0::,2401:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:8f40::,2401:8f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:8f80::,2401:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:8fc0::,2401:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9040::,2401:9040:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:9080::,2401:9080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:90c0::,2401:90c0:ffff:ffff:ffff:ffff:ffff:ffff,MN -2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO -2401:9140::,2401:9140:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:91c0::,2401:91c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:9240::,2401:9240:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:9280::,2401:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:92c0::,2401:92c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:9340::,2401:9340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9380::,2401:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:93c0::,2401:93c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:9400::,2401:9400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:9440::,2401:9440:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9480::,2401:9480:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:94c0::,2401:94c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9500::,2401:9500:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:9540::,2401:9540:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:9580::,2401:9580:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:95c0::,2401:95c0:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:9600::,2401:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9640::,2401:9640:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:9680::,2401:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:96c0::,2401:96c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9700::,2401:9700:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:9740::,2401:9740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9780::,2401:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:97c0::,2401:97c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:9800::,2401:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:9840::,2401:9840:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9880::,2401:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:98c0::,2401:98c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9940::,2401:9940:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:9980::,2401:9980:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:99c0::,2401:99c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:9a00::,2401:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9a40::,2401:9a40:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:9ac0::,2401:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9b00::,2401:9b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:9b40::,2401:9b40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9bc0::,2401:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9c00::,2401:9c00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9c40::,2401:9c40:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:9c80::,2401:9c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:9cc0::,2401:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:9d00::,2401:9d00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:9d40::,2401:9d40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:9d80::,2401:9d80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:9dc0::,2401:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9e00::,2401:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:9e40::,2401:9e40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9e80::,2401:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:9ec0::,2401:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:9f00::,2401:9f00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:9f40::,2401:9f40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:9f80::,2401:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:9fc0::,2401:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:a000::,2401:a000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:a040::,2401:a040:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:a080::,2401:a080:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:a0c0::,2401:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:a100::,2401:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a140::,2401:a140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a180::,2401:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a1c0::,2401:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:a240::,2401:a240:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:a280::,2401:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:a2c0::,2401:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:a300::,2401:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:a340::,2401:a340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a380::,2401:a380:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:a3c0::,2401:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a400::,2401:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:a440::,2401:a440:ffff:ffff:ffff:ffff:ffff:ffff,IO -2401:a480::,2401:a480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a4c0::,2401:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a500::,2401:a500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:a540::,2401:a540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a580::,2401:a580:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:a5c0::,2401:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a600::,2401:a600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a640::,2401:a640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a680::,2401:a680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:a6c0::,2401:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:a700::,2401:a700:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:a740::,2401:a740:ffff:ffff:ffff:ffff:ffff:ffff,MM -2401:a780::,2401:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:a7c0::,2401:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a800::,2401:a800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:a840::,2401:a840:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:a880::,2401:a880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a8c0::,2401:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:a900::,2401:a900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:a940::,2401:a940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a980::,2401:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:a9c0::,2401:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:aa00::,2401:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:aa40::,2401:aa40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:aa80::,2401:aa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:aac0::,2401:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:ab00::,2401:ab00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:ab40::,2401:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:ab80::,2401:ab80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:abc0::,2401:abc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:ac00::,2401:ac00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:ac40::,2401:ac40:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:ac80::,2401:ac80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:acc0::,2401:acc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ad00::,2401:ad00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:ad40::,2401:ad40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ad80::,2401:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:adc0::,2401:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ae00::,2401:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:ae40::,2401:ae40:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:ae80::,2401:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:aec0::,2401:aec0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:af00::,2401:af00:ffff:ffff:ffff:ffff:ffff:ffff,NC -2401:af40::,2401:af40:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:af80::,2401:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:afc0::,2401:afc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b000::,2401:b000:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:b040::,2401:b040:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b080::,2401:b080:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:b0c0::,2401:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:b100::,2401:b100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b140::,2401:b140:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:b180::,2401:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b1c0::,2401:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2401:b200::,2401:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b240::,2401:b240:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b2c0::,2401:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b300::,2401:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b340::,2401:b340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b380::,2401:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b3c0::,2401:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:b400::,2401:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b440::,2401:b440:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:b480::,2401:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b4c0::,2401:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b500::,2401:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b540::,2401:b540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b580::,2401:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b5c0::,2401:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:b600::,2401:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b640::,2401:b640:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:b680::,2401:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b6c0::,2401:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b740::,2401:b740:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b780::,2401:b780:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:b7c0::,2401:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b800::,2401:b800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:b840::,2401:b840:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:b880::,2401:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:b8c0::,2401:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:b900::,2401:b900:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:b940::,2401:b940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:b9c0::,2401:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:ba00::,2401:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ba40::,2401:ba40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ba80::,2401:ba80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:bac0::,2401:bac0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:bb00::,2401:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:bb40::,2401:bb40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:bb80::,2401:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:bbc0::,2401:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:bc00::,2401:bc00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:bc40::,2401:bc40:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:bc80::,2401:bc80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2401:bcc0::,2401:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:bd00::,2401:bd00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:bd40::,2401:bd40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:bdc0::,2401:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:be00::,2401:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:be40::,2401:be40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:be80::,2401:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:bec0::,2401:bec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:bf00::,2401:bf00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:bf40::,2401:bf40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:bf80::,2401:bf80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:bfc0::,2401:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:c000::,2401:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:c040::,2401:c040:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:c080::,2401:c080:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:c0c0::,2401:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c100::,2401:c100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:c140::,2401:c140:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:c180::,2401:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c1c0::,2401:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:c200::,2401:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c240::,2401:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:c280::,2401:c280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:c2c0::,2401:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:c300::,2401:c300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:c340::,2401:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c3c0::,2401:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:c400::,2401:c400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:c440::,2401:c440:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:c480::,2401:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c4c0::,2401:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:c500::,2401:c500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:c540::,2401:c540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c580::,2401:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c5c0::,2401:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:c600::,2401:c600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c640::,2401:c640:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c680::,2401:c680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:c6c0::,2401:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c700::,2401:c700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:c740::,2401:c740:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:c780::,2401:c780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:c7c0::,2401:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:c800::,2401:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:c840::,2401:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c880::,2401:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:c8c0::,2401:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:c900::,2401:c900:1000:ffff:ffff:ffff:ffff:ffff,SG -2401:c900:1001::,2401:c900:1001:7fff:ffff:ffff:ffff:ffff,JP -2401:c900:1001:8000::,2401:c900:11ff:ffff:ffff:ffff:ffff:ffff,SG -2401:c900:1200::,2401:c900:1201:175:ffff:ffff:ffff:ffff,US -2401:c900:1201:176::,2401:c900:1201:176:ffff:ffff:ffff:ffff,HK -2401:c900:1201:177::,2401:c900:1201:1cb:ffff:ffff:ffff:ffff,US -2401:c900:1201:1cc::,2401:c900:1201:1cc:ffff:ffff:ffff:ffff,HK -2401:c900:1201:1cd::,2401:c900:12ff:ffff:ffff:ffff:ffff:ffff,US -2401:c900:1300::,2401:c900:1300:7fff:ffff:ffff:ffff:ffff,SG -2401:c900:1300:8000::,2401:c900:1301:7fff:ffff:ffff:ffff:ffff,AU -2401:c900:1301:8000::,2401:c900:1600:ffff:ffff:ffff:ffff:ffff,SG -2401:c900:1601::,2401:c900:1601:7fff:ffff:ffff:ffff:ffff,KR -2401:c900:1601:8000::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:c940::,2401:c940:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:c980::,2401:c980:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:c9c0::,2401:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:ca00::,2401:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ca40::,2401:ca40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:ca80::,2401:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:cac0::,2401:cac0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:cb00::,2401:cb00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:cb40::,2401:cb40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:cb80::,2401:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:cbc0::,2401:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:cc00::,2401:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:cc40::,2401:cc40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:cc80::,2401:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:ccc0::,2401:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:cd00::,2401:cd00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:cd40::,2401:cd40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:cd80::,2401:cd80:1:ffff:ffff:ffff:ffff:ffff,AU -2401:cd80:2::,2401:cd80:2:ffff:ffff:ffff:ffff:ffff,NZ -2401:cd80:3::,2401:cd81:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:cdc0::,2401:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:ce00::,2401:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ce40::,2401:ce40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:ce80::,2401:ce80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:cec0::,2401:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:cf00::,2401:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:cf40::,2401:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:cf80::,2401:cf80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:cfc0::,2401:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d000::,2401:d000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d040::,2401:d040:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:2000::,2401:d080:20ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:3000::,2401:d080:30ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:4000::,2401:d080:40ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:5000::,2401:d080:50ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:6000::,2401:d080:60ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:7000::,2401:d080:70ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d080:8000::,2401:d080:80ff:ffff:ffff:ffff:ffff:ffff,AU -2401:d0c0::,2401:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d100::,2401:d100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:d140::,2401:d140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d180::,2401:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d1c0::,2401:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d200::,2401:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:d240::,2401:d240:ffff:ffff:ffff:ffff:ffff:ffff,GB -2401:d280::,2401:d280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d2c0::,2401:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d300::,2401:d300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:d340::,2401:d340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d380::,2401:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:d3c0::,2401:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d400::,2401:d400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:d440::,2401:d440:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:d480::,2401:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d4c0::,2401:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,KH -2401:d500::,2401:d500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:d540::,2401:d540:ffff:ffff:ffff:ffff:ffff:ffff,PG -2401:d580::,2401:d580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d5c0::,2401:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:d600::,2401:d600:ffff:ffff:ffff:ffff:ffff:ffff,MN -2401:d640::,2401:d640:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d680::,2401:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:d6c0::,2401:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:d700::,2401:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:d740::,2401:d740:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:d780::,2401:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:d7c0::,2401:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2401:d800::,2401:d800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:d840::,2401:d840:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d880::,2401:d880:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:d8c0::,2401:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d900::,2401:d900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:d940::,2401:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:d980::,2401:d980:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:d9c0::,2401:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:da00::,2401:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:da40::,2401:da40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:da80::,2401:da80:17ff:ffff:ffff:ffff:ffff:ffff,HK -2401:da80:1800::,2401:da80:1800:7fff:ffff:ffff:ffff:ffff,PH -2401:da80:1800:8000::,2401:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:dac0::,2401:dac0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:db00::,2401:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:db40::,2401:db40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:db80::,2401:db80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:dbc0::,2401:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:dc00::,2401:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:dc40::,2401:dc40:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:dc80::,2401:dc80:ffff:ffff:ffff:ffff:ffff:ffff,PF -2401:dcc0::,2401:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:dd00::,2401:dd00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2401:dd40::,2401:dd40:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:dd80::,2401:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:ddc0::,2401:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:de00::,2401:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:de40::,2401:de40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:de80::,2401:de80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:dec0::,2401:dec0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:df00::,2401:df01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:df40::,2401:df40:ffff:ffff:ffff:ffff:ffff:ffff,GI -2401:df80::,2401:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:dfc0::,2401:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,KI -2401:e000::,2401:e000:ffff:ffff:ffff:ffff:ffff:ffff,TH -2401:e040::,2401:e040:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:e080::,2401:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e0c0::,2401:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e100::,2401:e100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e140::,2401:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e180::,2401:e180:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:e1c0::,2401:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e200::,2401:e200:ffff:ffff:ffff:ffff:ffff:ffff,KR -2401:e240::,2401:e240:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e280::,2401:e280:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:e2c0::,2401:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e300::,2401:e300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:e340::,2401:e340:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e380::,2401:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:e3c0::,2401:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e400::,2401:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e440::,2401:e440:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:e480::,2401:e480:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:e4c0::,2401:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e500::,2401:e500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:e540::,2401:e540:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:e580::,2401:e580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e5c0::,2401:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:e600::,2401:e600:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2401:e640::,2401:e640:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:e680::,2401:e680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:e6c0::,2401:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e700::,2401:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:e740::,2401:e740:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:e780::,2401:e780:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:e7c0::,2401:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e800::,2401:e800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:e840::,2401:e840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e880::,2401:e880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e8c0::,2401:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e900::,2401:e900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:e940::,2401:e940:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:e980::,2401:e980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:e9c0::,2401:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ea00::,2401:ea00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:ea40::,2401:ea40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:ea80::,2401:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:eac0::,2401:eac0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:eb00::,2401:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:eb40::,2401:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:eb80::,2401:eb80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:ebc0::,2401:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:ec00::,2401:ec00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ec40::,2401:ec40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:ec80::,2401:ec80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:ecc0::,2401:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:ed00::,2401:ed00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:ed40::,2401:ed40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:ed80::,2401:ed80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:edc0::,2401:edc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:ee00::,2401:ee00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:ee40::,2401:ee40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:ee80::,2401:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:eec0::,2401:eec0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2401:ef00::,2401:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:ef40::,2401:ef40:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:ef80::,2401:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:efc0::,2401:efc0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:f000::,2401:f000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:f040::,2401:f040:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f080::,2401:f080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f0c0::,2401:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f100::,2401:f100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:f140::,2401:f140:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:f180::,2401:f180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f1c0::,2401:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:f200::,2401:f200:ffff:ffff:ffff:ffff:ffff:ffff,MM -2401:f240::,2401:f240:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f280::,2401:f280:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:f2c0::,2401:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:f300::,2401:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:f340::,2401:f340:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f380::,2401:f380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:f3c0::,2401:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:f400::,2401:f400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:f440::,2401:f440:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f480::,2401:f480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:f4c0::,2401:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:f500::,2401:f500:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:f540::,2401:f540:ffff:ffff:ffff:ffff:ffff:ffff,TW -2401:f580::,2401:f580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:f5c0::,2401:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:f640::,2401:f640:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f680::,2401:f680:ffff:ffff:ffff:ffff:ffff:ffff,PG -2401:f6c0::,2401:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f740::,2401:f740:ffff:ffff:ffff:ffff:ffff:ffff,VN -2401:f7c0::,2401:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:f840::,2401:f840:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:f880::,2401:f880:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:f8c0::,2401:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,PK -2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:f940::,2401:f940:ffff:ffff:ffff:ffff:ffff:ffff,HK -2401:f980::,2401:f980:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:f9c0::,2401:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2401:fa00::,2401:fa00::ffff:ffff:ffff:ffff:ffff,AU -2401:fa00:1::,2401:fa00:2:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:3::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,SG -2401:fa00:4::,2401:fa00:4:ffff:ffff:ffff:ffff:ffff,JP -2401:fa00:5::,2401:fa00:7:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:8::,2401:fa00:8:7fff:ffff:ffff:ffff:ffff,MY -2401:fa00:8:8000::,2401:fa00:8:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:9::,2401:fa00:9:ffff:ffff:ffff:ffff:ffff,AU -2401:fa00:a::,2401:fa00:a:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:b::,2401:fa00:b:7fff:ffff:ffff:ffff:ffff,US -2401:fa00:b:8000::,2401:fa00:b:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:c::,2401:fa00:c:7fff:ffff:ffff:ffff:ffff,US -2401:fa00:c:8000::,2401:fa00:c:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:d::,2401:fa00:d:ffff:ffff:ffff:ffff:ffff,KR -2401:fa00:e::,2401:fa00:e:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:f::,2401:fa00:f:7fff:ffff:ffff:ffff:ffff,SG -2401:fa00:f:8000::,2401:fa00:10:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:11::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,AU -2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,NZ -2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK -2401:fa00:14::,2401:fa00:15:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:16::,2401:fa00:16:7fff:ffff:ffff:ffff:ffff,ID -2401:fa00:16:8000::,2401:fa00:16:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:17::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,KR -2401:fa00:18::,2401:fa00:18:ffff:ffff:ffff:ffff:ffff,PH -2401:fa00:19::,2401:fa00:19:ffff:ffff:ffff:ffff:ffff,TH -2401:fa00:1a::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:1c::,2401:fa00:1c:ffff:ffff:ffff:ffff:ffff,KR -2401:fa00:1d::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:1f::,2401:fa00:1f:7fff:ffff:ffff:ffff:ffff,JP -2401:fa00:1f:8000::,2401:fa00:23:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:24::,2401:fa00:24:ffff:ffff:ffff:ffff:ffff,MY -2401:fa00:25::,2401:fa00:25:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:26::,2401:fa00:26:ffff:ffff:ffff:ffff:ffff,PH -2401:fa00:27::,2401:fa00:27:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:28::,2401:fa00:28:7fff:ffff:ffff:ffff:ffff,AU -2401:fa00:28:8000::,2401:fa00:28:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:29::,2401:fa00:29:7fff:ffff:ffff:ffff:ffff,US -2401:fa00:29:8000::,2401:fa00:2c:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:2d::,2401:fa00:2d:ffff:ffff:ffff:ffff:ffff,SG -2401:fa00:2e::,2401:fa00:30:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:31::,2401:fa00:31:7fff:ffff:ffff:ffff:ffff,PH -2401:fa00:31:8000::,2401:fa00:32:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:33::,2401:fa00:33:ffff:ffff:ffff:ffff:ffff,PH -2401:fa00:34::,2401:fa00:34:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:35::,2401:fa00:35:ffff:ffff:ffff:ffff:ffff,US -2401:fa00:36::,2401:fa00:36:ffff:ffff:ffff:ffff:ffff,SG -2401:fa00:37::,2401:fa00:40:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:41::,2401:fa00:41:7fff:ffff:ffff:ffff:ffff,CN -2401:fa00:41:8000::,2401:fa00:41:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:42::,2401:fa00:42:7fff:ffff:ffff:ffff:ffff,CN -2401:fa00:42:8000::,2401:fa00:43:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:44::,2401:fa00:44:7fff:ffff:ffff:ffff:ffff,CN -2401:fa00:44:8000::,2401:fa00:5f:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:60::,2401:fa00:60:7fff:ffff:ffff:ffff:ffff,US -2401:fa00:60:8000::,2401:fa00:f7:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:f8::,2401:fa00:f8:ffff:ffff:ffff:ffff:ffff,PH -2401:fa00:f9::,2401:fa00:47f:ffff:ffff:ffff:ffff:ffff,IN -2401:fa00:480::,2401:fa00:480:7fff:ffff:ffff:ffff:ffff,US -2401:fa00:480:8000::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fa40::,2401:fa40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fa80::,2401:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:fac0::,2401:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:fb00::,2401:fb00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fb40::,2401:fb40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fb80::,2401:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:fbc0::,2401:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fc00::,2401:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:fc40::,2401:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:fc80::,2401:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:fcc0::,2401:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2401:fd00::,2401:fd00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2401:fd40::,2401:fd40:ffff:ffff:ffff:ffff:ffff:ffff,MN -2401:fd80::,2401:fd80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:fdc0::,2401:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:fe00::,2401:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:fe40::,2401:fe40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:fe80::,2401:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:fec0::,2401:fec0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2401:ff00::,2401:ff00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2401:ff40::,2401:ff40:ffff:ffff:ffff:ffff:ffff:ffff,NP -2401:ff80::,2401:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2401:ffc0::,2401:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402::,2402:3ff:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:400::,2402:400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:440::,2402:440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:480::,2402:480:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:4c0::,2402:4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:500::,2402:500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:540::,2402:540:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:580::,2402:580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:5c0::,2402:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:600::,2402:600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:640::,2402:640:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:680::,2402:680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:6c0::,2402:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:700::,2402:700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:740::,2402:740:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:780::,2402:780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:7c0::,2402:7c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:800::,2402:800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:840::,2402:840:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:880::,2402:880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8c0::,2402:8c0:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:900::,2402:900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:940::,2402:940:ffff:ffff:ffff:ffff:ffff:ffff,PH -2402:980::,2402:980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:9c0::,2402:9c0:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:a00::,2402:a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:a40::,2402:a40:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:a80::,2402:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ac0::,2402:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b00::,2402:b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:b40::,2402:b40:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:b80::,2402:b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:bc0::,2402:bc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:c00::,2402:c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:c40::,2402:c40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:c80::,2402:c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:cc0::,2402:cc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d00::,2402:d00:ffff:ffff:ffff:ffff:ffff:ffff,NO -2402:d40::,2402:d40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d80::,2402:d80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:dc0::,2402:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e00::,2402:e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:e40::,2402:e40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e80::,2402:e80:23:ffff:ffff:ffff:ffff:ffff,IN -2402:e80:24::,2402:e80:24:ffff:ffff:ffff:ffff:ffff,PL -2402:e80:25::,2402:e80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:ec0::,2402:ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:f00::,2402:f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:f40::,2402:f40:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:f80::,2402:f80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:fc0::,2402:fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1000::,2402:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1040::,2402:1040:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:1080::,2402:1080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:10c0::,2402:10c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1100::,2402:1100:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:1140::,2402:1140:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1180::,2402:1180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:11c0::,2402:11c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1200::,2402:1200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:1240::,2402:1240:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1280::,2402:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:12c0::,2402:12c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1300::,2402:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1340::,2402:1340:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:13c0::,2402:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1400::,2402:1400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:1440::,2402:1440:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:14c0::,2402:14c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1500::,2402:1500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1540::,2402:1540:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1580::,2402:1580:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:15c0::,2402:15c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1600::,2402:1600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1640::,2402:1640:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:1680::,2402:1680:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:16c0::,2402:16c0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1700::,2402:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1740::,2402:1740:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1780::,2402:1780:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:17c0::,2402:17c0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1800::,2402:1800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1840::,2402:1840:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2402:1880::,2402:1883:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:18c0::,2402:18c0:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:1900::,2402:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1940::,2402:1940:ffff:ffff:ffff:ffff:ffff:ffff,TO -2402:1980::,2402:1980:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:19c0::,2402:19c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1a00::,2402:1a00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:1a40::,2402:1a40:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:1a80::,2402:1a80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:1ac0::,2402:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1b00::,2402:1b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:1b40::,2402:1b40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1b80::,2402:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1bc0::,2402:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:1c00::,2402:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:1c40::,2402:1c40:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:1c80::,2402:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:1cc0::,2402:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:1d00::,2402:1d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:1d40::,2402:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:1d80::,2402:1d80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:1dc0::,2402:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,NP -2402:1e00::,2402:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1e40::,2402:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1e80::,2402:1e80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:1ec0::,2402:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1f00::,2402:1f00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:1f40::,2402:1f40:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1f80::,2402:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:1fc0::,2402:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:2000::,2402:2000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2040::,2402:2040:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:2080::,2402:2080:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:20c0::,2402:20c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2402:2100::,2402:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:2140::,2402:2140:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:21c0::,2402:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:2200::,2402:2200:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:2240::,2402:2240:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:2280::,2402:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:22c0::,2402:22c0:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2300::,2402:2300:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:2380::,2402:2380:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:2400::,2402:2400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:2480::,2402:2480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:2500::,2402:2500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:2580::,2402:2580:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:2600::,2402:2600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:2680::,2402:2680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:2700::,2402:2700:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:2780::,2402:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2800::,2402:2800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:2880::,2402:2880:ffff:ffff:ffff:ffff:ffff:ffff,AF -2402:2900::,2402:2900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:2980::,2402:2980:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:2a00::,2402:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2a80::,2402:2a80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:2b00::,2402:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:2b80::,2402:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2c00::,2402:2c00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:2c80::,2402:2c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:2d00::,2402:2d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2d80::,2402:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2e80::,2402:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:2f00::,2402:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:2f80::,2402:2f80:7:ffff:ffff:ffff:ffff:ffff,AU -2402:2f80:8::,2402:2f80:8:ffff:ffff:ffff:ffff:ffff,HK -2402:2f80:9::,2402:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3000::,2402:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:3080::,2402:3080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:3100::,2402:3100:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:3180::,2402:3180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:3200::,2402:3200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3280::,2402:3280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:3300::,2402:3300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:3380::,2402:3380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3480::,2402:3480:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:3500::,2402:3500:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:3580::,2402:3580:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:3600::,2402:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3680::,2402:3680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3700::,2402:3700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:3780::,2402:3780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3800::,2402:3800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:3880::,2402:3880:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:3900::,2402:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3980::,2402:3980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3a00::,2402:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3a80::,2402:3a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:3b00::,2402:3b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:3b80::,2402:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:3c00::,2402:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:3c80::,2402:3c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:3d00::,2402:3d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:3d80::,2402:3d80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:3e00::,2402:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:3e80::,2402:3e80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:3f80::,2402:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4000::,2402:4000:ffff:ffff:ffff:ffff:ffff:ffff,LK -2402:4100::,2402:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:4180::,2402:4180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:4200::,2402:4200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:4280::,2402:4280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4300::,2402:4300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:4380::,2402:4380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4400::,2402:4400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:4480::,2402:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:4500::,2402:4500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4600::,2402:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4680::,2402:4680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:4700::,2402:4700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:4780::,2402:4780:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:4800::,2402:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:4880::,2402:4880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4900::,2402:4900:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:4980::,2402:4980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4a00::,2402:4a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4a80::,2402:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4b00::,2402:4b00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:4b80::,2402:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4c00::,2402:4c01:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:4c80::,2402:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4d00::,2402:4d00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:4d80::,2402:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4e00::,2402:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:4e80::,2402:4e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:4f00::,2402:4f00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:4f80::,2402:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:5080::,2402:5080:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:5100::,2402:5100:ffff:ffff:ffff:ffff:ffff:ffff,KH -2402:5180::,2402:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:5200::,2402:5200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:5280::,2402:5280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:5300::,2402:5300:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:5380::,2402:5380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:5400::,2402:5400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:5480::,2402:5480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:5500::,2402:5500:ffff:ffff:ffff:ffff:ffff:ffff,PH -2402:5580::,2402:5580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:5600::,2402:5600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:5680::,2402:5680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:5700::,2402:5700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:5780::,2402:5780:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:5800::,2402:5800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:5880::,2402:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:5900::,2402:5900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:5980::,2402:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:5a00::,2402:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:5b00::,2402:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:5c00::,2402:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:5c80::,2402:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:5d00::,2402:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:5d80::,2402:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:5e00::,2402:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:5e80::,2402:5e80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:5f00::,2402:5f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:5f80::,2402:5f80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:6000::,2402:6000:ff:ffff:ffff:ffff:ffff:ffff,AU -2402:6000:100::,2402:6000:100:7fff:ffff:ffff:ffff:ffff,NZ -2402:6000:100:8000::,2402:6000:100:ffff:ffff:ffff:ffff:ffff,AU -2402:6000:101::,2402:6000:101:7fff:ffff:ffff:ffff:ffff,NZ -2402:6000:101:8000::,2402:6000:103:ffff:ffff:ffff:ffff:ffff,AU -2402:6000:104::,2402:6000:104:ffff:ffff:ffff:ffff:ffff,NZ -2402:6000:105::,2402:6000:10f:ffff:ffff:ffff:ffff:ffff,AU -2402:6000:110::,2402:6000:110:7fff:ffff:ffff:ffff:ffff,NZ -2402:6000:110:8000::,2402:6000:202:ffff:ffff:ffff:ffff:ffff,AU -2402:6000:203::,2402:6000:203:7fff:ffff:ffff:ffff:ffff,NZ -2402:6000:203:8000::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6100::,2402:6100:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:6200::,2402:6200:ffff:ffff:ffff:ffff:ffff:ffff,GU -2402:6280::,2402:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:6400::,2402:6400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6480::,2402:6480:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:6500::,2402:6500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6580::,2402:6580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6600::,2402:6600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6680::,2402:6680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:6700::,2402:6700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:6780::,2402:6780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6800::,2402:6800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:6880::,2402:6880:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:6900::,2402:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6980::,2402:6980:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:6a00::,2402:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:6a80::,2402:6a80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:6b00::,2402:6b00:38b0:ffff:ffff:ffff:ffff:ffff,JP -2402:6b00:38b1::,2402:6b00:38b1:7fff:ffff:ffff:ffff:ffff,US -2402:6b00:38b1:8000::,2402:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:6b80::,2402:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:6c00::,2402:6c00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:6c80::,2402:6c80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:6d00::,2402:6d00:ffff:ffff:ffff:ffff:ffff:ffff,PF -2402:6d80::,2402:6d80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2402:6e00::,2402:6e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:6e80::,2402:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:6f00::,2402:6f00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:6f80::,2402:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:7000::,2402:7000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:7080::,2402:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:7100::,2402:7100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:7180::,2402:7180:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:7200::,2402:7200:ffff:ffff:ffff:ffff:ffff:ffff,TK -2402:7280::,2402:7280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7300::,2402:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:7380::,2402:7380:7ff:ffff:ffff:ffff:ffff:ffff,JP -2402:7380:800::,2402:7380:fff:ffff:ffff:ffff:ffff:ffff,HK -2402:7400::,2402:7400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7480::,2402:7481:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:7500::,2402:7500:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:7600::,2402:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7680::,2402:7680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7700::,2402:7700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:7780::,2402:7780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:7800::,2402:7800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7880::,2402:7880:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:7900::,2402:7900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7980::,2402:7980:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:7a00::,2402:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:7a80::,2402:7a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:7b00::,2402:7b00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:7b80::,2402:7b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7c00::,2402:7c00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:7c80::,2402:7c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7d00::,2402:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:7d80::,2402:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:7e00::,2402:7e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:7e80::,2402:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:7f00::,2402:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:7f80::,2402:7f80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:8000::,2402:8000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:8080::,2402:8080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:8100::,2402:8100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8180::,2402:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8200::,2402:8200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:8280::,2402:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8300::,2402:8300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8380::,2402:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8400::,2402:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8480::,2402:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:8600::,2402:8600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:8680::,2402:8680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8700::,2402:8700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:8780::,2402:8780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:8800::,2402:8800:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8880::,2402:8880:ffff:ffff:ffff:ffff:ffff:ffff,MN -2402:8900::,2402:8900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:8a00::,2402:8a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8a80::,2402:8a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8b00::,2402:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:8b80::,2402:8b80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:8c00::,2402:8c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8c80::,2402:8c80:ffff:ffff:ffff:ffff:ffff:ffff,LA -2402:8d00::,2402:8d03:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:8d80::,2402:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:8e00::,2402:8e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:8e80::,2402:8e80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:8f00::,2402:8f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:8f80::,2402:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9080::,2402:9080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:9100::,2402:9100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9180::,2402:9180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9200::,2402:9200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9280::,2402:9280:ffff:ffff:ffff:ffff:ffff:ffff,MO -2402:9300::,2402:9300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:9380::,2402:9380:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:9400::,2402:9400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9480::,2402:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9500::,2402:9500:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:9580::,2402:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9680::,2402:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9780::,2402:9780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:9800::,2402:9800:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:9880::,2402:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:9900::,2402:9900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9980::,2402:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9a00::,2402:9a00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:9a80::,2402:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9b00::,2402:9b00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:9b80::,2402:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:9c00::,2402:9c00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:9c80::,2402:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9d80::,2402:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:9e00::,2402:9e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:9e80::,2402:9e80::ffff:ffff:ffff:ffff:ffff,HK -2402:9e80:1::,2402:9e80:1:7fff:ffff:ffff:ffff:ffff,AU -2402:9e80:1:8000::,2402:9e80:13:ffff:ffff:ffff:ffff:ffff,HK -2402:9e80:14::,2402:9e80:14:ffff:ffff:ffff:ffff:ffff,VN -2402:9e80:15::,2402:9e80:15:ffff:ffff:ffff:ffff:ffff,US -2402:9e80:16::,2402:9e80:17:ffff:ffff:ffff:ffff:ffff,HK -2402:9e80:18::,2402:9e80:18:7fff:ffff:ffff:ffff:ffff,CN -2402:9e80:18:8000::,2402:9e80:18:ffff:ffff:ffff:ffff:ffff,HK -2402:9e80:19::,2402:9e80:19:ffff:ffff:ffff:ffff:ffff,KR -2402:9e80:1a::,2402:9e80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:9f00::,2402:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:9f80::,2402:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a000::,2402:a000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:a080::,2402:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a100::,2402:a100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:a180::,2402:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a200::,2402:a200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a280::,2402:a280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a300::,2402:a300:ffff:ffff:ffff:ffff:ffff:ffff,NP -2402:a380::,2402:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a400::,2402:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:a480::,2402:a480:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:a500::,2402:a500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:a600::,2402:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:a680::,2402:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a700::,2402:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:a780::,2402:a780:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:a800::,2402:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:a880::,2402:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:a900::,2402:a900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:a980::,2402:a980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:aa80::,2402:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ab00::,2402:ab00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:ab80::,2402:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ac00::,2402:ac00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:ac80::,2402:ac80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ad00::,2402:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ad80::,2402:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:ae00::,2402:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ae80::,2402:ae80:ffff:ffff:ffff:ffff:ffff:ffff,WS -2402:af00::,2402:af00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:af80::,2402:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b080::,2402:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b100::,2402:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:b180::,2402:b180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:b200::,2402:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b280::,2402:b280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:b300::,2402:b300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:b380::,2402:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b400::,2402:b400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:b480::,2402:b480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:b500::,2402:b500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:b580::,2402:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:b600::,2402:b600:ffff:ffff:ffff:ffff:ffff:ffff,TW -2402:b700::,2402:b700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:b780::,2402:b780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:b800::,2402:b801:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:b880::,2402:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:b980::,2402:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ba00::,2402:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2402:ba80::,2402:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:bb00::,2402:bb00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:bb80::,2402:bb80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:bc00::,2402:bc07:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:bc80::,2402:bc80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:bd00::,2402:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:bd80::,2402:bd81:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:bd82::,2402:bd83:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:be00::,2402:be00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:be80::,2402:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:bf00::,2402:bf00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:bf80::,2402:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:c000::,2402:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:c080::,2402:c081:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:c100::,2402:c100:ffff:ffff:ffff:ffff:ffff:ffff,KH -2402:c180::,2402:c180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:c200::,2402:c200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:c280::,2402:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:c300::,2402:c300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:c380::,2402:c380:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:c400::,2402:c400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:c480::,2402:c480:4fff:ffff:ffff:ffff:ffff:ffff,HK -2402:c480:5000::,2402:c480:5000:7fff:ffff:ffff:ffff:ffff,SG -2402:c480:5000:8000::,2402:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:c500::,2402:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,US -2402:c600::,2402:c600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:c680::,2402:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:c700::,2402:c700:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:c780::,2402:c780:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:c800::,2402:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:c880::,2402:c880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:c900::,2402:c900:ffff:ffff:ffff:ffff:ffff:ffff,MN -2402:c980::,2402:c980:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:ca00::,2402:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:cb00::,2402:cb01:ffff:ffff:ffff:ffff:ffff:ffff,LK -2402:cc00::,2402:cc00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:cc80::,2402:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:cd00::,2402:cd00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:cd80::,2402:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:ce00::,2402:ce01:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:ce80::,2402:ce80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:cf00::,2402:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:cf80::,2402:cf80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:d000::,2402:d000:ffff:ffff:ffff:ffff:ffff:ffff,LK -2402:d080::,2402:d080:ffff:ffff:ffff:ffff:ffff:ffff,TL -2402:d100::,2402:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d180::,2402:d180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d200::,2402:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:d280::,2402:d280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2402:d300::,2402:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:d380::,2402:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:d400::,2402:d400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:d500::,2402:d500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:d580::,2402:d580:ffff:ffff:ffff:ffff:ffff:ffff,US -2402:d600::,2402:d600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:d680::,2402:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:d700::,2402:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:d780::,2402:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:d800::,2402:d800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d880::,2402:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:d900::,2402:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:d980::,2402:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:da00::,2402:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:da80::,2402:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:db00::,2402:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:db80::,2402:db80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:dc00::,2402:dc00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:dc80::,2402:dc80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:dd80::,2402:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AF -2402:de00::,2402:de00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:de80::,2402:de80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:df00::,2402:df00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:df80::,2402:df80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e000::,2402:e000:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:e080::,2402:e080:ffff:ffff:ffff:ffff:ffff:ffff,AF -2402:e100::,2402:e100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:e180::,2402:e180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:e200::,2402:e200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:e280::,2402:e280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:e300::,2402:e300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:e380::,2402:e380::ffff:ffff:ffff:ffff:ffff,HK -2402:e380:1::,2402:e380:ffff:ffff:ffff:ffff:ffff:ffff,US -2402:e400::,2402:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e480::,2402:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:e500::,2402:e500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e580::,2402:e580:ffff:ffff:ffff:ffff:ffff:ffff,US -2402:e600::,2402:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG -2402:e680::,2402:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:e780::,2402:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:e800::,2402:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:e880::,2402:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:e900::,2402:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:e980::,2402:e980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ea80::,2402:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:eb00::,2402:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:eb80::,2402:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ec00::,2402:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ec80::,2402:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ed80::,2402:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:ee00::,2402:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ee80::,2402:ee80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:ef00::,2402:ef3f:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:ef80::,2402:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f000::,2402:f000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f080::,2402:f080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:f100::,2402:f100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:f180::,2402:f180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2402:f200::,2402:f200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:f280::,2402:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:f300::,2402:f300:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:f400::,2402:f400:ffff:ffff:ffff:ffff:ffff:ffff,KR -2402:f480::,2402:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f500::,2402:f500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2402:f580::,2402:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f600::,2402:f600:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:f680::,2402:f680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f700::,2402:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:f780::,2402:f780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:f800::,2402:f800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2402:f900::,2402:f900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:f980::,2402:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:fa00::,2402:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:fa80::,2402:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:fb00::,2402:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2402:fb80::,2402:fb80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2402:fc00::,2402:fc00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:fc80::,2402:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2402:fd00::,2402:fd00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2402:fe00::,2402:fe00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2402:fe80::,2402:fe80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2402:ff00::,2402:ff00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2402:ff80::,2402:ff80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403::,2403:1:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:80::,2403:80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:100::,2403:100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:180::,2403:180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:200::,2403:200:ffff:ffff:ffff:ffff:ffff:ffff,NC -2403:280::,2403:280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:300::,2403:300:a03:ffff:ffff:ffff:ffff:ffff,SG -2403:300:a04::,2403:300:a04:ffff:ffff:ffff:ffff:ffff,HK -2403:300:a05::,2403:300:a07:ffff:ffff:ffff:ffff:ffff,SG -2403:300:a08::,2403:300:a08:ffff:ffff:ffff:ffff:ffff,AU -2403:300:a09::,2403:300:a09:ffff:ffff:ffff:ffff:ffff,SG -2403:300:a0a::,2403:300:a0a:ffff:ffff:ffff:ffff:ffff,HK -2403:300:a0b::,2403:300:a13:ffff:ffff:ffff:ffff:ffff,SG -2403:300:a14::,2403:300:a14:ffff:ffff:ffff:ffff:ffff,JP -2403:300:a15::,2403:300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:380::,2403:380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:400::,2403:400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:480::,2403:480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:500::,2403:500:ffff:ffff:ffff:ffff:ffff:ffff,LA -2403:580::,2403:580:ffff:ffff:ffff:ffff:ffff:ffff,BT -2403:600::,2403:600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:680::,2403:680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:700::,2403:700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:780::,2403:780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:800::,2403:801:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:880::,2403:880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:900::,2403:900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:980::,2403:980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a00::,2403:a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:a80::,2403:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b00::,2403:b00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:b80::,2403:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:c00::,2403:c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:c80::,2403:c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d00::,2403:d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:d80::,2403:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e00::,2403:e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:e80::,2403:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f00::,2403:f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f80::,2403:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1000::,2403:1000:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:1080::,2403:1080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:1100::,2403:1100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1180::,2403:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1280::,2403:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1300::,2403:1300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:1380::,2403:1380:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:1400::,2403:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1480::,2403:1480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1500::,2403:1500:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:1580::,2403:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1600::,2403:1600:ffff:ffff:ffff:ffff:ffff:ffff,KH -2403:1680::,2403:1680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1700::,2403:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1780::,2403:1780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:1800::,2403:1800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:1880::,2403:1880:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:1900::,2403:1900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:1980::,2403:1980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1a00::,2403:1a00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:1a80::,2403:1a80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:1b80::,2403:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1c00::,2403:1c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:1c80::,2403:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1d00::,2403:1d00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:1d80::,2403:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1e00::,2403:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AS -2403:1e80::,2403:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:1f00::,2403:1f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:1f80::,2403:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2000::,2403:2000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:2080::,2403:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2100::,2403:2100:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:2180::,2403:2180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2200::,2403:2200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:2280::,2403:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2300::,2403:2300:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:2380::,2403:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2400::,2403:2400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:2480::,2403:2480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2500::,2403:2500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:2580::,2403:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2600::,2403:2600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:2680::,2403:2680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2700::,2403:2700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:2780::,2403:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2800::,2403:2801:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:2880::,2403:2880:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:2900::,2403:2900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:2980::,2403:2980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:2a00::,2403:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2a80::,2403:2a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:2b80::,2403:2b80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:2c00::,2403:2c00:2:ffff:ffff:ffff:ffff:ffff,HK -2403:2c00:3::,2403:2c00:4:ffff:ffff:ffff:ffff:ffff,SG -2403:2c00:5::,2403:2c00:6:ffff:ffff:ffff:ffff:ffff,HK -2403:2c00:7::,2403:2c00:7:ffff:ffff:ffff:ffff:ffff,JP -2403:2c00:8::,2403:2c00:8:ffff:ffff:ffff:ffff:ffff,DE -2403:2c00:9::,2403:2c00:a:ffff:ffff:ffff:ffff:ffff,US -2403:2c00:b::,2403:2c00:b::,ZA -2403:2c00:b::1,2403:2c00:9fff:ffff:ffff:ffff:ffff:ffff,HK -2403:2c00:a000::,2403:2c00:afff:ffff:ffff:ffff:ffff:ffff,ZA -2403:2c00:b000::,2403:2c00:bfff:ffff:ffff:ffff:ffff:ffff,DE -2403:2c00:c000::,2403:2c00:cfff:ffff:ffff:ffff:ffff:ffff,JP -2403:2c00:d000::,2403:2c00:dfff:ffff:ffff:ffff:ffff:ffff,HK -2403:2c00:e000::,2403:2c00:efff:ffff:ffff:ffff:ffff:ffff,SG -2403:2c00:f000::,2403:2c00:fffa:ffff:ffff:ffff:ffff:ffff,HK -2403:2c00:fffb::,2403:2c00:fffb:ffff:ffff:ffff:ffff:ffff,US -2403:2c00:fffc::,2403:2c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:2c80::,2403:2c80::7fff:ffff:ffff:ffff:ffff,CN -2403:2c80:0:8000::,2403:2c80::ffff:ffff:ffff:ffff:ffff,HK -2403:2c80:1::,2403:2c80:1:ffff:ffff:ffff:ffff:ffff,JP -2403:2c80:2::,2403:2c80:2:ffff:ffff:ffff:ffff:ffff,SG -2403:2c80:3::,2403:2c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:2d00::,2403:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:2d80::,2403:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:2e00::,2403:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:2e80::,2403:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:2f00::,2403:2f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:2f80::,2403:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3080::,2403:3080:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:3100::,2403:3100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:3180::,2403:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3200::,2403:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:3280::,2403:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3300::,2403:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL -2403:3380::,2403:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3400::,2403:3400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3480::,2403:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3500::,2403:3500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3580::,2403:3580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3600::,2403:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3680::,2403:3680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3700::,2403:3700:ffff:ffff:ffff:ffff:ffff:ffff,KR -2403:3780::,2403:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3800::,2403:3800:ffff:ffff:ffff:ffff:ffff:ffff,NP -2403:3880::,2403:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3900::,2403:3900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:3980::,2403:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3a00::,2403:3a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:3b00::,2403:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3b80::,2403:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3c00::,2403:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:3c80::,2403:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3d00::,2403:3d00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:3d80::,2403:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3e00::,2403:3e00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2403:3e80::,2403:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:3f00::,2403:3f00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:3f80::,2403:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4000::,2403:4000:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:4080::,2403:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4100::,2403:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:4180::,2403:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4200::,2403:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:4280::,2403:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4300::,2403:4300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4380::,2403:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4400::,2403:4400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:4480::,2403:4480:ffff:ffff:ffff:ffff:ffff:ffff,WS -2403:4500::,2403:4500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:4580::,2403:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4600::,2403:4600:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2403:4680::,2403:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4700::,2403:4700:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:4780::,2403:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4800::,2403:4800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:4880::,2403:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4900::,2403:4900:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:4980::,2403:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4a00::,2403:4a00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:4a80::,2403:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4b00::,2403:4b00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2403:4b80::,2403:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4c00::,2403:4c00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:4c80::,2403:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4d00::,2403:4d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:4d80::,2403:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:4e00::,2403:4e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:4e80::,2403:4e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:4f00::,2403:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:4f80::,2403:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:5000::,2403:5000:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:5080::,2403:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5100::,2403:5100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:5180::,2403:5180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:5200::,2403:5200:ffff:ffff:ffff:ffff:ffff:ffff,TW -2403:5280::,2403:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5300::,2403:5300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:5380::,2403:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5400::,2403:5400:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:5480::,2403:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5500::,2403:5500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:5580::,2403:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5600::,2403:5600:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:5680::,2403:5680:14:ffff:ffff:ffff:ffff:ffff,AU -2403:5680:15::,2403:5680:15:ffff:ffff:ffff:ffff:ffff,US -2403:5680:16::,2403:5680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:5700::,2403:5700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:5780::,2403:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5800::,2403:5800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:5880::,2403:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5900::,2403:5900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:5980::,2403:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5a00::,2403:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:5a80::,2403:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5b00::,2403:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:5b80::,2403:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5c80::,2403:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5d80::,2403:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5e00::,2403:5e00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2403:5e80::,2403:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:5f00::,2403:5f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:5f80::,2403:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6000::,2403:6000:ffff:ffff:ffff:ffff:ffff:ffff,VN -2403:6080::,2403:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6100::,2403:6100:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:6180::,2403:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6200::,2403:6200:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:6280::,2403:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6300::,2403:6300:ffff:ffff:ffff:ffff:ffff:ffff,KR -2403:6380::,2403:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6400::,2403:6400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:6480::,2403:6480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6500::,2403:6500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2403:6580::,2403:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6600::,2403:6600:ffff:ffff:ffff:ffff:ffff:ffff,KH -2403:6680::,2403:6680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6700::,2403:6700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:6780::,2403:6780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6800::,2403:6800:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:6880::,2403:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6900::,2403:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:6980::,2403:6980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6a00::,2403:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6a80::,2403:6a80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2403:6b00::,2403:6b00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:6b80::,2403:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:6c00::,2403:6c00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:6c80::,2403:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6d00::,2403:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:6d80::,2403:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6e00::,2403:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:6e80::,2403:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:6f80::,2403:6f80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:7000::,2403:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:7080::,2403:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7100::,2403:7100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:7180::,2403:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7200::,2403:7200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:7280::,2403:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7300::,2403:7300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:7380::,2403:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7400::,2403:7400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:7480::,2403:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7500::,2403:7500:ffff:ffff:ffff:ffff:ffff:ffff,KH -2403:7580::,2403:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7600::,2403:7600:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:7680::,2403:7680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:7700::,2403:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7780::,2403:7780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:7800::,2403:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:7900::,2403:7900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:7980::,2403:7980:ffff:ffff:ffff:ffff:ffff:ffff,PK -2403:7a00::,2403:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:7a80::,2403:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7b00::,2403:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7b80::,2403:7b80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:7c00::,2403:7c00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:7c80::,2403:7c80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:7d00::,2403:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:7d80::,2403:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7e00::,2403:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:7e80::,2403:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:7f00::,2403:7f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:7f80::,2403:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8000::,2403:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:8080::,2403:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8100::,2403:8100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:8180::,2403:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8200::,2403:8200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:8280::,2403:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8300::,2403:8300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2403:8380::,2403:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8400::,2403:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:8480::,2403:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8500::,2403:8500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:8580::,2403:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8600::,2403:8600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:8680::,2403:8680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:8700::,2403:8700:ffff:ffff:ffff:ffff:ffff:ffff,BT -2403:8780::,2403:8780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:8800::,2403:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:8880::,2403:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8900::,2403:8900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8980::,2403:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8a00::,2403:8a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:8a80::,2403:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8b00::,2403:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8b80::,2403:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8c00::,2403:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8c80::,2403:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8d00::,2403:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8d80::,2403:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:8e00::,2403:8e00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:8e80::,2403:8e80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2403:8f00::,2403:8f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:8f80::,2403:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9000::,2403:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:9080::,2403:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9100::,2403:9100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:9180::,2403:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9200::,2403:9200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:9280::,2403:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9300::,2403:9300:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:9380::,2403:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9400::,2403:9400:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:9480::,2403:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9500::,2403:9500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:9580::,2403:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9600::,2403:9600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:9680::,2403:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9700::,2403:9700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:9780::,2403:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9800::,2403:9800:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:9880::,2403:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9900::,2403:9a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:9a80::,2403:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9b00::,2403:9b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9b80::,2403:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9c00::,2403:9c00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:9c80::,2403:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9d00::,2403:9d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9d80::,2403:9d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9e00::,2403:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:9e80::,2403:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:9f00::,2403:9f00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2403:9f80::,2403:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a000::,2403:a000:ffff:ffff:ffff:ffff:ffff:ffff,PH -2403:a080::,2403:a080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:a100::,2403:a100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a180::,2403:a180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:a200::,2403:a200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a280::,2403:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:a300::,2403:a300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a380::,2403:a380:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:a400::,2403:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:a480::,2403:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a500::,2403:a500:ffff:ffff:ffff:ffff:ffff:ffff,PK -2403:a580::,2403:a580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a600::,2403:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:a680::,2403:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a700::,2403:a700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:a780::,2403:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a800::,2403:a800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:a880::,2403:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:a900::,2403:a900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:a980::,2403:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:aa00::,2403:aa00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:aa80::,2403:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ab80::,2403:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ac00::,2403:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ac80::,2403:ac80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:ad00::,2403:ad00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:ad80::,2403:ad80:5f:ffff:ffff:ffff:ffff:ffff,HK -2403:ad80:60::,2403:ad80:67:ffff:ffff:ffff:ffff:ffff,JP -2403:ad80:68::,2403:ad80:7f:ffff:ffff:ffff:ffff:ffff,HK -2403:ad80:80::,2403:ad80:87:ffff:ffff:ffff:ffff:ffff,US -2403:ad80:88::,2403:ad80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:ae00::,2403:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:ae80::,2403:ae80:ffff:ffff:ffff:ffff:ffff:ffff,NR -2403:af00::,2403:af00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:af80::,2403:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b000::,2403:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:b080::,2403:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b100::,2403:b100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:b180::,2403:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b200::,2403:b200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:b280::,2403:b280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b300::,2403:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:b380::,2403:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b400::,2403:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b480::,2403:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b500::,2403:b500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:b580::,2403:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b600::,2403:b600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:b680::,2403:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b700::,2403:b700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:b780::,2403:b780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b800::,2403:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:b880::,2403:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:b900::,2403:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:b980::,2403:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ba00::,2403:ba00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:ba80::,2403:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:bb00::,2403:bb00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:bc00::,2403:bc00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:bc80::,2403:bc80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:bd00::,2403:bd00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:bd80::,2403:bd80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:be00::,2403:be00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:be80::,2403:be80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:bf00::,2403:bf00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:bf80::,2403:bf80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:c000::,2403:c000:ffff:ffff:ffff:ffff:ffff:ffff,TH -2403:c080::,2403:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:c100::,2403:c100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:c180::,2403:c180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:c200::,2403:c200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:c280::,2403:c280:ffff:ffff:ffff:ffff:ffff:ffff,MM -2403:c300::,2403:c300:ffff:ffff:ffff:ffff:ffff:ffff,TW -2403:c380::,2403:c380:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:c400::,2403:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:c480::,2403:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:c500::,2403:c500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:c580::,2403:c580:ffff:ffff:ffff:ffff:ffff:ffff,MY -2403:c600::,2403:c600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:c680::,2403:c680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:c780::,2403:c780:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:c800::,2403:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:c880::,2403:c881:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:c900::,2403:c900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:c980::,2403:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ca00::,2403:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:cb00::,2403:cb00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:cb80::,2403:cb80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:cc00::,2403:cc00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:cc80::,2403:cc80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:cd00::,2403:cd00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2403:cd80::,2403:cd80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2403:ce00::,2403:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:cf00::,2403:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:cf80::,2403:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d000::,2403:d000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:d080::,2403:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d100::,2403:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:d180::,2403:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d200::,2403:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:d280::,2403:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d300::,2403:d300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:d380::,2403:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d400::,2403:d400:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d480::,2403:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d500::,2403:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:d580::,2403:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d600::,2403:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:d680::,2403:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d700::,2403:d700:ffff:ffff:ffff:ffff:ffff:ffff,MN -2403:d780::,2403:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d880::,2403:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:d900::,2403:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:d980::,2403:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:da00::,2403:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:da80::,2403:da80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:db00::,2403:db00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:db80::,2403:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:dc00::,2403:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:dc80::,2403:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:dd00::,2403:dd00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:dd80::,2403:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:de00::,2403:de00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:de80::,2403:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:df00::,2403:df00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:df80::,2403:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e000::,2403:e000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:e080::,2403:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e100::,2403:e100:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:e180::,2403:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e200::,2403:e200:ffff:ffff:ffff:ffff:ffff:ffff,VN -2403:e280::,2403:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e300::,2403:e300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e380::,2403:e380:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:e400::,2403:e400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:e480::,2403:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e500::,2403:e500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e580::,2403:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e600::,2403:e600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:e680::,2403:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e700::,2403:e700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e780::,2403:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e800::,2403:e800:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:e880::,2403:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:e900::,2403:e900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:e980::,2403:e980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ea00::,2403:ea00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:ea80::,2403:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:eb00::,2403:eb00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:eb80::,2403:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ec00::,2403:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:ec80::,2403:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ed00::,2403:ed00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ed80::,2403:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ee00::,2403:ee00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2403:ee80::,2403:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ef80::,2403:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f000::,2403:f000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:f080::,2403:f080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f100::,2403:f100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f180::,2403:f180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f200::,2403:f200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:f280::,2403:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f300::,2403:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f380::,2403:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f480::,2403:f480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:f481::,2403:f481:ffff:ffff:ffff:ffff:ffff:ffff,US -2403:f500::,2403:f500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:f580::,2403:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f600::,2403:f600:ffff:ffff:ffff:ffff:ffff:ffff,NR -2403:f680::,2403:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:f700::,2403:f700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2403:f780::,2403:f780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2403:f800::,2403:f800:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f880::,2403:f880:ffff:ffff:ffff:ffff:ffff:ffff,JP -2403:f900::,2403:f900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:f980::,2403:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:fa00::,2403:fa00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2403:fa80::,2403:fa80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2403:fb00::,2403:fb00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:fb80::,2403:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:fc00::,2403:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:fc80::,2403:fc80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:fd00::,2403:fd00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2403:fd80::,2403:fd80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:fe00::,2403:fe00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2403:fe80::,2403:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2403:ff00::,2403:ff00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2403:ff80::,2403:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404::,2404:3f:ffff:ffff:ffff:ffff:ffff:ffff,TW -2404:80::,2404:8f:ffff:ffff:ffff:ffff:ffff:ffff,TW -2404:a0::,2404:a0:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:a8::,2404:a8:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:b0::,2404:b1:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:b8::,2404:b8:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:c0::,2404:c0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:c8::,2404:c8:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:d0::,2404:d0:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:d8::,2404:d8:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:e0::,2404:ef:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:100::,2404:100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:130::,2404:130:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:138::,2404:139:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:140::,2404:140:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:150::,2404:150:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:158::,2404:158:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:160::,2404:160:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:168::,2404:168:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:170::,2404:170:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:178::,2404:178:ffff:ffff:ffff:ffff:ffff:ffff,TW -2404:180::,2404:18f:ffff:ffff:ffff:ffff:ffff:ffff,KR -2404:1a0::,2404:1a3:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:1a8::,2404:1a8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1b0::,2404:1b0:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:1b8::,2404:1b8:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:200::,2404:200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:280::,2404:280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:300::,2404:300:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:380::,2404:380:ffff:ffff:ffff:ffff:ffff:ffff,GU -2404:400::,2404:400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:480::,2404:480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:500::,2404:500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:580::,2404:580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:600::,2404:600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:680::,2404:680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:700::,2404:700:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:780::,2404:780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:800::,2404:800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2404:880::,2404:880:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:980::,2404:980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:a00::,2404:a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:a80::,2404:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:b00::,2404:b00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b80::,2404:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:c00::,2404:c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:c80::,2404:c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d00::,2404:d00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:d80::,2404:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:e00::,2404:e00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:e80::,2404:e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:f00::,2404:f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:f80::,2404:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1000::,2404:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1080::,2404:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1100::,2404:1100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:1180::,2404:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1200::,2404:1200:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:1280::,2404:1280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:1300::,2404:1300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1380::,2404:1380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:1400::,2404:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:1480::,2404:1480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:1500::,2404:1500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:1580::,2404:1580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:1600::,2404:1601:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:1680::,2404:1680:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:1780::,2404:1780:ffff:ffff:ffff:ffff:ffff:ffff,MM -2404:1800::,2404:1800:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:1880::,2404:1880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1980::,2404:1980:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1a00::,2404:1a00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:1b00::,2404:1b00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:1b80::,2404:1b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:1c00::,2404:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:1c80::,2404:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1d00::,2404:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:1d80::,2404:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1e00::,2404:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:1e80::,2404:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:1f00::,2404:1f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:2000::,2404:2000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:2080::,2404:2080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2100::,2404:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:2180::,2404:2180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:2200::,2404:2200:ffff:ffff:ffff:ffff:ffff:ffff,NC -2404:2280::,2404:2280:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:2300::,2404:2300:ffff:ffff:ffff:ffff:ffff:ffff,KR -2404:2380::,2404:2380:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:2400::,2404:2400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2480::,2404:2480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:2580::,2404:2580:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:2600::,2404:2600:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:2680::,2404:2680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:2700::,2404:2700:ffff:ffff:ffff:ffff:ffff:ffff,MN -2404:2780::,2404:2780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2800::,2404:2800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2880::,2404:2880:ffff:ffff:ffff:ffff:ffff:ffff,KR -2404:2900::,2404:2900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2980::,2404:2980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:2a00::,2404:2a00:ffff:ffff:ffff:ffff:ffff:ffff,NC -2404:2a80::,2404:2a80:14:ffff:ffff:ffff:ffff:ffff,HK -2404:2a80:15::,2404:2a80:15:ffff:ffff:ffff:ffff:ffff,US -2404:2a80:16::,2404:2a80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:2b00::,2404:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2c00::,2404:2c00:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:2c80::,2404:2c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:2d00::,2404:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:2d80::,2404:2d80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:2e00::,2404:2e00:ffff:ffff:ffff:ffff:ffff:ffff,LA -2404:2e80::,2404:2e80:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:2f80::,2404:2f80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3080::,2404:3080:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:3100::,2404:3100:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:3180::,2404:3180:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:3200::,2404:3200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:3280::,2404:3280:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:3300::,2404:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:3380::,2404:3380:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:3480::,2404:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:3500::,2404:3500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:3580::,2404:3580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3600::,2404:3601:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:3680::,2404:3680:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3700::,2404:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:3780::,2404:3780:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:3800::,2404:3800:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:3880::,2404:3880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:3900::,2404:3900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3980::,2404:3980:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:3a00::,2404:3a00:ffff:ffff:ffff:ffff:ffff:ffff,VN -2404:3a80::,2404:3a80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:3b00::,2404:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:3b80::,2404:3b80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:3c00::,2404:3c00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:3c80::,2404:3c80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:3d00::,2404:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:3d80::,2404:3d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:3e00::,2404:3e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3e80::,2404:3e80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:3f00::,2404:3f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:3f80::,2404:3f80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:4080::,2404:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:4100::,2404:4100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4180::,2404:4180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:4200::,2404:4200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:4280::,2404:4280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:4300::,2404:4300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:4380::,2404:4380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:4400::,2404:440f:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:4480::,2404:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4580::,2404:4580:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:4600::,2404:4600:ffff:ffff:ffff:ffff:ffff:ffff,KR -2404:4680::,2404:4680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:4700::,2404:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4780::,2404:4780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:4800::,2404:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:4880::,2404:4880:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:4900::,2404:4900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:4980::,2404:4980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4a00::,2404:4a00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:4a80::,2404:4a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4b80::,2404:4b80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:4c00::,2404:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:4c80::,2404:4c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:4d00::,2404:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:4d80::,2404:4d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:4e00::,2404:4e00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:4f00::,2404:4f01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:4f80::,2404:4f80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:5000::,2404:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5080::,2404:5080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5100::,2404:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:5180::,2404:5180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5200::,2404:5200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:5280::,2404:5280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:5300::,2404:5300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5380::,2404:5380:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:5400::,2404:5400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5480::,2404:5480:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:5500::,2404:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5580::,2404:5580:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:5600::,2404:5600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:5680::,2404:5680:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:5700::,2404:5700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:5780::,2404:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:5800::,2404:5800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:5880::,2404:5880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5900::,2404:5900:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:5980::,2404:5980:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:5a00::,2404:5a00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:5a80::,2404:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:5b00::,2404:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:5b80::,2404:5b80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:5c80::,2404:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:5d00::,2404:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:5d80::,2404:5d80:5fff:ffff:ffff:ffff:ffff:ffff,JP -2404:5d80:6000::,2404:5d80:60ff:ffff:ffff:ffff:ffff:ffff,AU -2404:5d80:6100::,2404:5d80:6100:ffff:ffff:ffff:ffff:ffff,JP -2404:5d80:6101::,2404:5d80:6101:7fff:ffff:ffff:ffff:ffff,SG -2404:5d80:6101:8000::,2404:5d80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:5e00::,2404:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:5e80::,2404:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:5f80::,2404:5f80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:6000::,2404:6000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:6080::,2404:6080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:6100::,2404:6100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:6180::,2404:6180:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:6200::,2404:6200:ffff:ffff:ffff:ffff:ffff:ffff,TW -2404:6280::,2404:6280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:6300::,2404:6300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:6380::,2404:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:6400::,2404:6400:ffff:ffff:ffff:ffff:ffff:ffff,PG -2404:6480::,2404:6480:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:6500::,2404:6500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:6600::,2404:6600:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:6680::,2404:6680:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:6700::,2404:6700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:6780::,2404:6780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:6800::,2404:6800:4002:ffff:ffff:ffff:ffff:ffff,AU -2404:6800:4003::,2404:6800:4003:ffff:ffff:ffff:ffff:ffff,SG -2404:6800:4004::,2404:6800:4007:ffff:ffff:ffff:ffff:ffff,AU -2404:6800:4008::,2404:6800:4008:ffff:ffff:ffff:ffff:ffff,TW -2404:6800:4009::,2404:6800:400a:ffff:ffff:ffff:ffff:ffff,AU -2404:6800:400b::,2404:6800:400b:ffff:ffff:ffff:ffff:ffff,JP -2404:6800:400c::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:6900::,2404:6900:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:6980::,2404:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:6a00::,2404:6a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:6a80::,2404:6a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:6b00::,2404:6b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:6b80::,2404:6b80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:6c00::,2404:6c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:6c80::,2404:6c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:6d00::,2404:6d00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:6e00::,2404:6e00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:6e80::,2404:6e80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:6f00::,2404:6f00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:6f80::,2404:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:7000::,2404:7000:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:7100::,2404:7100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:7180::,2404:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:7200::,2404:7200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:7280::,2404:7280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7300::,2404:7300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7380::,2404:7380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:7400::,2404:7400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:7480::,2404:7480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:7500::,2404:7500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:7600::,2404:7600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:7680::,2404:7680:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:7700::,2404:7700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7780::,2404:7780:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:7800::,2404:7800:ffff:ffff:ffff:ffff:ffff:ffff,PW -2404:7880::,2404:7880:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:7900::,2404:7900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:7980::,2404:7980:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:7a00::,2404:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:7a80::,2404:7a80:8200:7fff:ffff:ffff:ffff:ffff,JP -2404:7a80:8200:8000::,2404:7a80:8200:ffff:ffff:ffff:ffff:ffff,CN -2404:7a80:8201::,2404:7a82:26df:ffff:ffff:ffff:ffff:ffff,JP -2404:7a82:26e0::,2404:7a82:26e0:7fff:ffff:ffff:ffff:ffff,US -2404:7a82:26e0:8000::,2404:7a87:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:7b00::,2404:7b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7c00::,2404:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:7c80::,2404:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7d00::,2404:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:7d80::,2404:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:7e00::,2404:7e00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:7e80::,2404:7e80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7f00::,2404:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:7f80::,2404:7f80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:8000::,2404:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:8100::,2404:8100:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:8180::,2404:8180:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:8200::,2404:8200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:8280::,2404:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8300::,2404:8300:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:8380::,2404:8380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:8480::,2404:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8500::,2404:8500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:8580::,2404:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8600::,2404:8600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8680::,2404:8680:fff:ffff:ffff:ffff:ffff:ffff,SG -2404:8680:1000::,2404:8680:1fff:ffff:ffff:ffff:ffff:ffff,TH -2404:8680:2000::,2404:8680:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:8700::,2404:8700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8780::,2404:8780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:8880::,2404:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8900::,2404:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8980::,2404:8980:ffff:ffff:ffff:ffff:ffff:ffff,BN -2404:8a00::,2404:8a00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2404:8a80::,2404:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8b00::,2404:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:8b80::,2404:8b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:8c00::,2404:8c00:ffff:ffff:ffff:ffff:ffff:ffff,GU -2404:8c80::,2404:8c80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:8d00::,2404:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:8d80::,2404:8d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8e00::,2404:8e01:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:8e80::,2404:8e80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8f00::,2404:8f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:8f80::,2404:8f80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:9000::,2404:9000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:9080::,2404:9080:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:9100::,2404:9100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:9200::,2404:9200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:9380::,2404:9380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:9400::,2404:9400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:9480::,2404:9480:ffff:ffff:ffff:ffff:ffff:ffff,US -2404:9580::,2404:9580:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:9600::,2404:9601:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:9680::,2404:9680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:9700::,2404:9700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:9780::,2404:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:9800::,2404:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:9880::,2404:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:9900::,2404:9900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:9980::,2404:9980:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:9a00::,2404:9a00:ffff:ffff:ffff:ffff:ffff:ffff,GU -2404:9a80::,2404:9a80:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:9b00::,2404:9b00:ffff:ffff:ffff:ffff:ffff:ffff,AF -2404:9b80::,2404:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:9c00::,2404:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:9c80::,2404:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:9d00::,2404:9d00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:9d80::,2404:9d80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:9e00::,2404:9e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:9e80::,2404:9e80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:9f00::,2404:9f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:9f80::,2404:9f80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:a000::,2404:a000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:a080::,2404:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:a100::,2404:a100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:a180::,2404:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:a200::,2404:a200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:a280::,2404:a280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:a300::,2404:a300:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:a480::,2404:a480:ffff:ffff:ffff:ffff:ffff:ffff,US -2404:a500::,2404:a500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:a580::,2404:a580:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:a600::,2404:a600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:a680::,2404:a680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:a700::,2404:a700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:a780::,2404:a780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:a800::,2404:a800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:aa00::,2404:aa00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:aa80::,2404:aa80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:ab00::,2404:ab00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:ab80::,2404:ab80:ffff:ffff:ffff:ffff:ffff:ffff,MV -2404:ac00::,2404:ac00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:ae00::,2404:ae00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:ae80::,2404:ae80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:af00::,2404:af00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:af80::,2404:af80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b000::,2404:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:b100::,2404:b100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:b180::,2404:b180:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b200::,2404:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:b280::,2404:b280:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:b300::,2404:b300:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:b380::,2404:b380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b500::,2404:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:b580::,2404:b580:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b600::,2404:b600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:b680::,2404:b680:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:b700::,2404:b700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:b780::,2404:b780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:b800::,2404:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:b880::,2404:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:b900::,2404:b900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:b980::,2404:b980:1fff:ffff:ffff:ffff:ffff:ffff,IN -2404:b980:2000::,2404:b980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:ba00::,2404:ba00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:ba80::,2404:ba80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:bb80::,2404:bb80:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:bc00::,2404:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:bc80::,2404:bc80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:bd00::,2404:bd00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:bd80::,2404:bd80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2404:be00::,2404:be00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:be80::,2404:be80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:bf00::,2404:bf00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:c000::,2404:c000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:c080::,2404:c080:ffff:ffff:ffff:ffff:ffff:ffff,NP -2404:c100::,2404:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:c180::,2404:c180:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:c200::,2404:c200:ffff:ffff:ffff:ffff:ffff:ffff,LA -2404:c280::,2404:c280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:c300::,2404:c300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:c380::,2404:c380:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:c400::,2404:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:c480::,2404:c480:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:c500::,2404:c500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:c580::,2404:c580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:c600::,2404:c600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:c680::,2404:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:c700::,2404:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:c780::,2404:c780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:c800::,2404:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:c880::,2404:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:c900::,2404:c900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:c980::,2404:c980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:ca00::,2404:ca00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:ca80::,2404:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:cb00::,2404:cb00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:cb80::,2404:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:cc00::,2404:cc00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:cc80::,2404:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:cd00::,2404:cd00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:cd80::,2404:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:ce00::,2404:ce00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:ce80::,2404:ce80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:cf00::,2404:cf00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:cf80::,2404:cf80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:d000::,2404:d000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:d080::,2404:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:d100::,2404:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d180::,2404:d180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:d200::,2404:d200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d280::,2404:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:d300::,2404:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d380::,2404:d380:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:d400::,2404:d400:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:d480::,2404:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:d500::,2404:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d580::,2404:d580:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:d600::,2404:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d680::,2404:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:d700::,2404:d700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:d780::,2404:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:d800::,2404:d800:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:d880::,2404:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:d900::,2404:d900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:d980::,2404:d980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:da00::,2404:da00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:da80::,2404:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:db00::,2404:db00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2404:db80::,2404:db80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:dc00::,2404:dc00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2404:dc80::,2404:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:dd00::,2404:dd00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:dd80::,2404:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:de00::,2404:de00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:de80::,2404:de80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:df00::,2404:df00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:df80::,2404:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:e000::,2404:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:e100::,2404:e101:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e180::,2404:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:e200::,2404:e200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:e280::,2404:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:e300::,2404:e300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e380::,2404:e380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:e400::,2404:e400:ffff:ffff:ffff:ffff:ffff:ffff,NC -2404:e480::,2404:e480:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:e500::,2404:e500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e580::,2404:e580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:e600::,2404:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:e680::,2404:e680:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:e700::,2404:e700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e780::,2404:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:e800::,2404:e801:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:e880::,2404:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:e900::,2404:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e980::,2404:e980:ffff:ffff:ffff:ffff:ffff:ffff,KH -2404:ea00::,2404:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:ea80::,2404:ea80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:eb00::,2404:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:eb80::,2404:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:ec00::,2404:ec00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:ec80::,2404:ec80:ffff:ffff:ffff:ffff:ffff:ffff,MN -2404:ed80::,2404:ed80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:ee00::,2404:ee00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:ee80::,2404:ee80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2404:ef00::,2404:ef00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:ef80::,2404:ef80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2404:f000::,2404:f000:ffff:ffff:ffff:ffff:ffff:ffff,LK -2404:f080::,2404:f080:ffff:ffff:ffff:ffff:ffff:ffff,VN -2404:f100::,2404:f100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:f180::,2404:f180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:f200::,2404:f200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:f280::,2404:f280:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:f300::,2404:f300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:f380::,2404:f380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:f400::,2404:f400:ffff:ffff:ffff:ffff:ffff:ffff,PK -2404:f480::,2404:f480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:f500::,2404:f500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:f580::,2404:f580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:f600::,2404:f600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:f680::,2404:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:f700::,2404:f700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:f780::,2404:f780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:f800::,2404:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:f801::,2404:f801::ffff:ffff:ffff:ffff:ffff,IN -2404:f801:1::,2404:f801:8:1010:ffff:ffff:ffff:ffff,SG -2404:f801:8:1011::,2404:f801:8:1011::,AU -2404:f801:8:1011::1,2404:f801:8:1013:ffff:ffff:ffff:ffff,SG -2404:f801:8:1014::,2404:f801:8:1014::,AU -2404:f801:8:1014::1,2404:f801:28:7fff:ffff:ffff:ffff:ffff,SG -2404:f801:28:8000::,2404:f801:28:ffff:ffff:ffff:ffff:ffff,US -2404:f801:29::,2404:f801:2f:ffff:ffff:ffff:ffff:ffff,SG -2404:f801:30::,2404:f801:30::,AU -2404:f801:30::1,2404:f801:8027:ffff:ffff:ffff:ffff:ffff,SG -2404:f801:8028::,2404:f801:8028:ffff:ffff:ffff:ffff:ffff,IN -2404:f801:8029::,2404:f801:8050::ffff:ffff:ffff:ffff,SG -2404:f801:8050:1::,2404:f801:8050:8:ffff:ffff:ffff:ffff,JP -2404:f801:8050:9::,2404:f801:8057:ffff:ffff:ffff:ffff:ffff,SG -2404:f801:8058::,2404:f801:8058:ffff:ffff:ffff:ffff:ffff,IN -2404:f801:8059::,2404:f801:e817:ffff:ffff:ffff:ffff:ffff,SG -2404:f801:e818::,2404:f801:e818:7fff:ffff:ffff:ffff:ffff,AU -2404:f801:e818:8000::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:f880::,2404:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:f900::,2404:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:f980::,2404:f980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:fa00::,2404:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:fa80::,2404:fa80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2404:fb00::,2404:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:fb80::,2404:fb80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:fc00::,2404:fc00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2404:fc80::,2404:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:fd00::,2404:fd00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:fd80::,2404:fd80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:fe00::,2404:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:ff00::,2404:ff00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:ff80::,2404:ff80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405::,2405::ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:80::,2405:80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:100::,2405:100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:180::,2405:180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:200::,2405:205:4204:563c::1e49:20a4,IN -2405:205:4204:563c::1e49:20a5,2405:205:4204:563c::1e49:20a5,US -2405:205:4204:563c::1e49:20a6,2405:207:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:400::,2405:400:ffff:ffff:ffff:ffff:ffff:ffff,MH -2405:480::,2405:480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:500::,2405:500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:580::,2405:580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:600::,2405:600:ffff:ffff:ffff:ffff:ffff:ffff,MN -2405:680::,2405:680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:700::,2405:700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:780::,2405:780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:800::,2405:800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:880::,2405:880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:980::,2405:980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:a00::,2405:a00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:a80::,2405:a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:b00::,2405:b00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:b80::,2405:b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c00::,2405:c00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2405:c80::,2405:c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:d80::,2405:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:e00::,2405:e00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:e80::,2405:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:f80::,2405:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1000::,2405:1000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:1080::,2405:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1180::,2405:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1200::,2405:1200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:1280::,2405:1280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1300::,2405:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:1380::,2405:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1400::,2405:1400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:1480::,2405:1480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1500::,2405:1500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:1580::,2405:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1600::,2405:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:1680::,2405:1680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1700::,2405:1700:ffff:ffff:ffff:ffff:ffff:ffff,BN -2405:1780::,2405:1780:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:1800::,2405:1800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:1880::,2405:1880:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:1a00::,2405:1a00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:1a80::,2405:1a80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:1b00::,2405:1b00:ffff:ffff:ffff:ffff:ffff:ffff,NP -2405:1b80::,2405:1b80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:1c00::,2405:1c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:1c80::,2405:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1d00::,2405:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:1d80::,2405:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1e00::,2405:1e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:1e80::,2405:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:1f00::,2405:1f00:ffff:ffff:ffff:ffff:ffff:ffff,TL -2405:1f80::,2405:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2000::,2405:2000:200:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:201::,2405:2000:201:ffff:ffff:ffff:ffff:ffff,SG -2405:2000:202::,2405:2000:400:2ff:ffff:ffff:ffff:ffff,IN -2405:2000:400:300::,2405:2000:400:3ff:ffff:ffff:ffff:ffff,HK -2405:2000:400:400::,2405:2000:400:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:401::,2405:2000:401:ffff:ffff:ffff:ffff:ffff,HK -2405:2000:402::,2405:2000:500:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:501::,2405:2000:501:ffff:ffff:ffff:ffff:ffff,HK -2405:2000:502::,2405:2000:7ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:800::,2405:2000:800:ff:ffff:ffff:ffff:ffff,SG -2405:2000:800:100::,2405:2000:8ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:900::,2405:2000:900:ff:ffff:ffff:ffff:ffff,JP -2405:2000:900:100::,2405:2000:9ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:a00::,2405:2000:a00:ffff:ffff:ffff:ffff:ffff,HK -2405:2000:a01::,2405:2000:aff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:b00::,2405:2000:b00:ff:ffff:ffff:ffff:ffff,HK -2405:2000:b00:100::,2405:2000:c00:ff:ffff:ffff:ffff:ffff,IN -2405:2000:c00:100::,2405:2000:c00:1ff:ffff:ffff:ffff:ffff,TW -2405:2000:c00:200::,2405:2000:dff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:e00::,2405:2000:e00:ff:ffff:ffff:ffff:ffff,AU -2405:2000:e00:100::,2405:2000:eff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:f00::,2405:2000:f00:1ff:ffff:ffff:ffff:ffff,JP -2405:2000:f00:200::,2405:2000:1fff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:2000::,2405:2000:2000:ff:ffff:ffff:ffff:ffff,AU -2405:2000:2000:100::,2405:2000:2100:ff:ffff:ffff:ffff:ffff,IN -2405:2000:2100:100::,2405:2000:2100:1ff:ffff:ffff:ffff:ffff,SG -2405:2000:2100:200::,2405:2000:21ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:2200::,2405:2000:2200:ff:ffff:ffff:ffff:ffff,MY -2405:2000:2200:100::,2405:2000:22ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:2300::,2405:2000:2300:ff:ffff:ffff:ffff:ffff,MY -2405:2000:2300:100::,2405:2000:24ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:2500::,2405:2000:2500:ffff:ffff:ffff:ffff:ffff,JP -2405:2000:2501::,2405:2000:ffc7:ffff:ffff:ffff:ffff:ffff,IN -2405:2000:ffc8::,2405:2000:ffc8:ffff:ffff:ffff:ffff:ffff,SG -2405:2000:ffc9::,2405:2001::ffff:ffff:ffff:ffff:ffff,IN -2405:2001:1::,2405:2001:1:ff:ffff:ffff:ffff:ffff,SG -2405:2001:1:100::,2405:2001:2ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2001:300::,2405:2001:300:ff:ffff:ffff:ffff:ffff,MY -2405:2001:300:100::,2405:2001:3ff:ffff:ffff:ffff:ffff:ffff,IN -2405:2001:400::,2405:2001:400:ff:ffff:ffff:ffff:ffff,HK -2405:2001:400:100::,2405:2001:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:2080::,2405:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2180::,2405:2180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2200::,2405:2200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:2280::,2405:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2300::,2405:2300:ff01:ffff:ffff:ffff:ffff:ffff,SG -2405:2300:ff02::,2405:2300:ff02:ffff:ffff:ffff:ffff:ffff,IN -2405:2300:ff03::,2405:2300:ff04:ffff:ffff:ffff:ffff:ffff,SG -2405:2300:ff05::,2405:2300:ff05:7fff:ffff:ffff:ffff:ffff,IN -2405:2300:ff05:8000::,2405:2300:ff05:ffff:ffff:ffff:ffff:ffff,SG -2405:2300:ff06::,2405:2300:ff06:7fff:ffff:ffff:ffff:ffff,AU -2405:2300:ff06:8000::,2405:2300:ff06:ffff:ffff:ffff:ffff:ffff,SG -2405:2300:ff07::,2405:2300:ff07:7fff:ffff:ffff:ffff:ffff,AU -2405:2300:ff07:8000::,2405:2300:ff09:ffff:ffff:ffff:ffff:ffff,SG -2405:2300:ff0a::,2405:2300:ff0a:7fff:ffff:ffff:ffff:ffff,AU -2405:2300:ff0a:8000::,2405:2300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:2380::,2405:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2400::,2405:2400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:2480::,2405:2480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2500::,2405:2500:ffff:ffff:ffff:ffff:ffff:ffff,TH -2405:2580::,2405:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2600::,2405:2600:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:2680::,2405:2680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2700::,2405:2700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:2780::,2405:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2880::,2405:2880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2900::,2405:2900:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:2980::,2405:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2a00::,2405:2a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:2a80::,2405:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2b00::,2405:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:2b80::,2405:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2c80::,2405:2c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2d00::,2405:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:2d80::,2405:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2e00::,2405:2e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:2e80::,2405:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:2f00::,2405:2f00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:2f80::,2405:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3000::,2405:3001:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:3080::,2405:3080:ff:ffff:ffff:ffff:ffff:ffff,TW -2405:3100::,2405:3100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:3180::,2405:3180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:3200::,2405:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:3280::,2405:3280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:3300::,2405:3300:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:3380::,2405:3380:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:3400::,2405:3400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:3480::,2405:3480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:3500::,2405:3500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:3580::,2405:3580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2405:3600::,2405:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:3680::,2405:3680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:3700::,2405:3700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:3780::,2405:3780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:3800::,2405:3800:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:3880::,2405:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3900::,2405:3900:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:3980::,2405:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3a00::,2405:3a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:3a80::,2405:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3b00::,2405:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3b80::,2405:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3c00::,2405:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:3c80::,2405:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3d00::,2405:3d00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:3d80::,2405:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3e00::,2405:3e00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:3e80::,2405:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:3f00::,2405:3f01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:3f80::,2405:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4000::,2405:4000:ffff:ffff:ffff:ffff:ffff:ffff,TH -2405:4080::,2405:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4100::,2405:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:4180::,2405:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4200::,2405:4200:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:4280::,2405:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4300::,2405:4300:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:4380::,2405:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4400::,2405:4400:ffff:ffff:ffff:ffff:ffff:ffff,LK -2405:4480::,2405:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4500::,2405:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:4580::,2405:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4600::,2405:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:4680::,2405:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4700::,2405:4700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:4780::,2405:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4800::,2405:4800:ffff:ffff:ffff:ffff:ffff:ffff,VN -2405:4880::,2405:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4900::,2405:4900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:4980::,2405:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4a00::,2405:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:4a80::,2405:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4b00::,2405:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:4b80::,2405:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4c00::,2405:4c00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:4c80::,2405:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:4d00::,2405:4d00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:4d80::,2405:4d80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:4e00::,2405:4e00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:4e80::,2405:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:4f00::,2405:4f00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:4f80::,2405:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5000::,2405:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:5080::,2405:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5100::,2405:5100:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:5180::,2405:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5200::,2405:5200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:5280::,2405:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5300::,2405:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:5380::,2405:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5400::,2405:5400:ffff:ffff:ffff:ffff:ffff:ffff,LK -2405:5480::,2405:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5500::,2405:5500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:5580::,2405:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5600::,2405:5600:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:5680::,2405:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5700::,2405:5700:ffff:ffff:ffff:ffff:ffff:ffff,MN -2405:5780::,2405:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5800::,2405:5800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:5880::,2405:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5900::,2405:5900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:5980::,2405:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5a00::,2405:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:5a80::,2405:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5b00::,2405:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5b80::,2405:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5c00::,2405:5c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:5c80::,2405:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5d00::,2405:5d00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:5d80::,2405:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5e00::,2405:5e00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:5e80::,2405:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:5f00::,2405:5f00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:5f80::,2405:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6000::,2405:6000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:6080::,2405:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6100::,2405:6100:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:6180::,2405:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6200::,2405:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6280::,2405:6280:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:6380::,2405:6380:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:6400::,2405:6400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:6480::,2405:6480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:6500::,2405:6500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:6580::,2405:6581:e3f:ffff:ffff:ffff:ffff:ffff,JP -2405:6581:e40::,2405:6581:e40:7fff:ffff:ffff:ffff:ffff,US -2405:6581:e40:8000::,2405:6581:417f:ffff:ffff:ffff:ffff:ffff,JP -2405:6581:4180::,2405:6581:4180:7fff:ffff:ffff:ffff:ffff,US -2405:6581:4180:8000::,2405:6587:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:6600::,2405:6600:ffff:ffff:ffff:ffff:ffff:ffff,NP -2405:6680::,2405:6680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:6780::,2405:6780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:6800::,2405:6800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:6880::,2405:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6900::,2405:6900:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:6980::,2405:6980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:6a80::,2405:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6b00::,2405:6b00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2405:6b80::,2405:6b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6c00::,2405:6c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:6c80::,2405:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6d00::,2405:6d00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2405:6d80::,2405:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6e00::,2405:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:6e80::,2405:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6f00::,2405:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:6f80::,2405:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7000::,2405:7000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:7080::,2405:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7100::,2405:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:7180::,2405:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7200::,2405:7200:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:7280::,2405:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7380::,2405:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7400::,2405:7400:ffff:ffff:ffff:ffff:ffff:ffff,GU -2405:7480::,2405:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7500::,2405:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:7580::,2405:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7600::,2405:7600:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:7680::,2405:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7700::,2405:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:7780::,2405:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7800::,2405:7800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:7880::,2405:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7900::,2405:7900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:7980::,2405:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7a80::,2405:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7b00::,2405:7b00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:7b80::,2405:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7c00::,2405:7c00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:7c80::,2405:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:7d00::,2405:7d00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:7d80::,2405:7d80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:7e00::,2405:7e00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:7e80::,2405:7e80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:7f00::,2405:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:7f80::,2405:7f80:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:8000::,2405:8000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:8080::,2405:8080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:8100::,2405:8100:ffff:ffff:ffff:ffff:ffff:ffff,US -2405:8180::,2405:8180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:8200::,2405:8200:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:8280::,2405:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8300::,2405:8300:ffff:ffff:ffff:ffff:ffff:ffff,SB -2405:8380::,2405:8380:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:8400::,2405:8400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:8480::,2405:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8500::,2405:8500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:8580::,2405:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8600::,2405:8600:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:8680::,2405:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8700::,2405:8700:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:8780::,2405:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8800::,2405:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:8880::,2405:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8900::,2405:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:8980::,2405:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8a00::,2405:8a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:8a80::,2405:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8b00::,2405:8b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:8b80::,2405:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8c00::,2405:8c00:ffff:ffff:ffff:ffff:ffff:ffff,WS -2405:8c80::,2405:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8d00::,2405:8d00:ffff:ffff:ffff:ffff:ffff:ffff,GU -2405:8d80::,2405:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8e00::,2405:8e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:8e80::,2405:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:8f00::,2405:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:8f80::,2405:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9000::,2405:9000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:9080::,2405:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9100::,2405:9100:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:9180::,2405:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9200::,2405:9200:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:9280::,2405:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9300::,2405:9300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9380::,2405:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9400::,2405:9400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:9480::,2405:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9500::,2405:9500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:9580::,2405:9580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9600::,2405:9600:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:9680::,2405:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9700::,2405:9700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9780::,2405:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9800::,2405:9800:ffff:ffff:ffff:ffff:ffff:ffff,TH -2405:9880::,2405:9880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9900::,2405:9900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9980::,2405:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9a80::,2405:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9b00::,2405:9b00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9b80::,2405:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9c00::,2405:9c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:9d00::,2405:9d00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:9d80::,2405:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2405:9e00::,2405:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:9e80::,2405:9e80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:9f80::,2405:9f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:a000::,2405:a000:ffff:ffff:ffff:ffff:ffff:ffff,TH -2405:a080::,2405:a080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:a100::,2405:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:a180::,2405:a180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:a200::,2405:a200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:a280::,2405:a280:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:a300::,2405:a300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:a380::,2405:a380:ffff:ffff:ffff:ffff:ffff:ffff,MM -2405:a400::,2405:a400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:a480::,2405:a480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:a500::,2405:a500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:a580::,2405:a580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:a680::,2405:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:a700::,2405:a700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:a780::,2405:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:a880::,2405:a880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:a900::,2405:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:a980::,2405:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:aa00::,2405:aa00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:aa80::,2405:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ab00::,2405:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ab80::,2405:ab80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:ac00::,2405:ac00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:ac80::,2405:ac80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:ad00::,2405:ad00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ad80::,2405:ad80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:ae00::,2405:ae00:ffff:ffff:ffff:ffff:ffff:ffff,MN -2405:af00::,2405:af00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:af80::,2405:af80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:b000::,2405:b000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:b100::,2405:b100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:b200::,2405:b200:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:b300::,2405:b300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:b380::,2405:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:b400::,2405:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:b500::,2405:b500:ffff:ffff:ffff:ffff:ffff:ffff,US -2405:b580::,2405:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:b600::,2405:b600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:b680::,2405:b680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:b780::,2405:b780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:b800::,2405:b800:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:b880::,2405:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:b900::,2405:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:b980::,2405:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ba00::,2405:ba00:8700:ffff:ffff:ffff:ffff:ffff,IN -2405:ba00:8701::,2405:ba00:8701:7fff:ffff:ffff:ffff:ffff,AU -2405:ba00:8701:8000::,2405:ba00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:ba80::,2405:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:bb00::,2405:bb00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:bb80::,2405:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:bc00::,2405:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:bc80::,2405:bc80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:bd00::,2405:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:bd80::,2405:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:be00::,2405:be00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:be80::,2405:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:bf00::,2405:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:bf80::,2405:bf80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:c000::,2405:c000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:c080::,2405:c080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:c100::,2405:c100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:c180::,2405:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:c200::,2405:c200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:c280::,2405:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c300::,2405:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:c380::,2405:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c400::,2405:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:c480::,2405:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c500::,2405:c500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c580::,2405:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c600::,2405:c600:ffff:ffff:ffff:ffff:ffff:ffff,TW -2405:c680::,2405:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c700::,2405:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:c780::,2405:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c800::,2405:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:c880::,2405:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:c900::,2405:c900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:c980::,2405:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ca00::,2405:ca00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:ca80::,2405:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:cb00::,2405:cb00:ffff:ffff:ffff:ffff:ffff:ffff,VN -2405:cb80::,2405:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:cc00::,2405:cc00:ffff:ffff:ffff:ffff:ffff:ffff,PF -2405:cc80::,2405:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:cd00::,2405:cd00:ffff:ffff:ffff:ffff:ffff:ffff,VN -2405:cd80::,2405:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ce00::,2405:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:ce80::,2405:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:cf00::,2405:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:cf80::,2405:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:d000::,2405:d000:ffff:ffff:ffff:ffff:ffff:ffff,BT -2405:d100::,2405:d100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:d180::,2405:d180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:d200::,2405:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:d280::,2405:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:d300::,2405:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:d480::,2405:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:d580::,2405:d580:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:d680::,2405:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:d700::,2405:d700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:d780::,2405:d780:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:d800::,2405:d800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:d880::,2405:d880:ffff:ffff:ffff:ffff:ffff:ffff,KR -2405:d900::,2405:d900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:d980::,2405:d980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:da00::,2405:da00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:da80::,2405:da80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:db00::,2405:db00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:db80::,2405:db80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2405:dc00::,2405:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:de80::,2405:de80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:df80::,2405:df80:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:e000::,2405:e000:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:e080::,2405:e080:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2405:e100::,2405:e100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:e180::,2405:e180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:e200::,2405:e200:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:e280::,2405:e280:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:e300::,2405:e300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:e380::,2405:e380:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:e400::,2405:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:e480::,2405:e480:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:e500::,2405:e500:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:e580::,2405:e580:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:e600::,2405:e600:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:e680::,2405:e680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:e700::,2405:e700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:e780::,2405:e780:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:e800::,2405:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:e980::,2405:e980:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:ea00::,2405:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:ea80::,2405:ea80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2405:eb80::,2405:eb80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:ec00::,2405:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BT -2405:ec80::,2405:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:ed00::,2405:ed00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:ed80::,2405:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:ee00::,2405:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:ee80::,2405:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ef00::,2405:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:ef80::,2405:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:f000::,2405:f000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:f080::,2405:f080:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:f100::,2405:f100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:f180::,2405:f180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:f200::,2405:f200:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:f280::,2405:f280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:f300::,2405:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:f380::,2405:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:f400::,2405:f400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:f480::,2405:f480:ffff:ffff:ffff:ffff:ffff:ffff,BD -2405:f500::,2405:f500:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:f580::,2405:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:f600::,2405:f600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:f700::,2405:f700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:f780::,2405:f780:ffff:ffff:ffff:ffff:ffff:ffff,MY -2405:f800::,2405:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:f880::,2405:f880:ffff:ffff:ffff:ffff:ffff:ffff,NP -2405:f900::,2405:f900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:f980::,2405:f980:ffff:ffff:ffff:ffff:ffff:ffff,VN -2405:fa00::,2405:fa00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2405:fa80::,2405:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:fb00::,2405:fb00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:fb80::,2405:fb80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2405:fc00::,2405:fc00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2405:fc80::,2405:fc80:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:fd80::,2405:fd80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2405:fe00::,2405:fe00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:fe80::,2405:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2405:ff00::,2405:ff00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2405:ff80::,2405:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406::,2406::ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:80::,2406:80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:100::,2406:100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:180::,2406:180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:200::,2406:200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:280::,2406:280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:300::,2406:300:ffff:ffff:ffff:ffff:ffff:ffff,TW -2406:380::,2406:381:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:400::,2406:400:ffff:ffff:ffff:ffff:ffff:ffff,TH -2406:480::,2406:480:ffff:ffff:ffff:ffff:ffff:ffff,TH -2406:500::,2406:500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:600::,2406:600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:680::,2406:680:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:700::,2406:700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:780::,2406:780:ffff:ffff:ffff:ffff:ffff:ffff,MM -2406:800::,2406:800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:880::,2406:880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:900::,2406:900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:980::,2406:980:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:a00::,2406:a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:a80::,2406:a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:b00::,2406:b00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:b80::,2406:b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:c00::,2406:c00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2406:c80::,2406:c80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:d00::,2406:d00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:d80::,2406:d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e00::,2406:e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:e80::,2406:e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:f00::,2406:f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:f80::,2406:f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1000::,2406:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:1080::,2406:1080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1100::,2406:1100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1180::,2406:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1200::,2406:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:1280::,2406:1280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1300::,2406:1300:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:1380::,2406:1380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1400::,2406:1400:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:1480::,2406:1480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1500::,2406:1500:ffff:ffff:ffff:ffff:ffff:ffff,TO -2406:1580::,2406:1580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1600::,2406:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:1680::,2406:1680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1700::,2406:1700:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:1780::,2406:1780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1880::,2406:1880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1980::,2406:1980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1a00::,2406:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:1a80::,2406:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1b00::,2406:1b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:1b80::,2406:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1c00::,2406:1c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:1c80::,2406:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1d00::,2406:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:1d80::,2406:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1e00::,2406:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:1e80::,2406:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:1f00::,2406:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:1f80::,2406:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2000::,2406:2000:efb9:ffff:ffff:ffff:ffff:ffff,TW -2406:2000:efba::,2406:2000:efba:7fff:ffff:ffff:ffff:ffff,HK -2406:2000:efba:8000::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW -2406:2080::,2406:2080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2100::,2406:2100:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:2180::,2406:2180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:2200::,2406:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:2280::,2406:2280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:2300::,2406:2300:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:2380::,2406:2380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:2400::,2406:2400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:2500::,2406:2500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:2580::,2406:2580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2600::,2406:2600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:2700::,2406:2700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2780::,2406:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2800::,2406:2800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:2880::,2406:2880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2900::,2406:2900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:2980::,2406:2980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2a00::,2406:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2406:2a80::,2406:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2b00::,2406:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:2b80::,2406:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2c00::,2406:2c00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:2c80::,2406:2c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2d80::,2406:2d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2e00::,2406:2e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:2e80::,2406:2e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:2f00::,2406:2f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:2f80::,2406:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3000::,2406:3003:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:3080::,2406:3080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3100::,2406:3100:ffff:ffff:ffff:ffff:ffff:ffff,TH -2406:3180::,2406:3180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3200::,2406:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH -2406:3280::,2406:3280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3300::,2406:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3380::,2406:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3400::,2406:3400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3480::,2406:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3580::,2406:3580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3600::,2406:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3680::,2406:3680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3700::,2406:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3780::,2406:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3800::,2406:3800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3880::,2406:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3980::,2406:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3a00::,2406:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3a80::,2406:3a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3b00::,2406:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3b80::,2406:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:3c00::,2406:3c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:3c80::,2406:3c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:3d00::,2406:3d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:3d80::,2406:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3e00::,2406:3e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:3e80::,2406:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:3f00::,2406:3f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:3f80::,2406:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4000::,2406:4000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:4080::,2406:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4100::,2406:4100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4180::,2406:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4200::,2406:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4280::,2406:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4300::,2406:4300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:4380::,2406:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4400::,2406:4400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2406:4480::,2406:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4500::,2406:4500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4580::,2406:4580:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:4600::,2406:4600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4680::,2406:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4700::,2406:4700:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:4800::,2406:4800:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:4880::,2406:4880:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4900::,2406:4900:ffff:ffff:ffff:ffff:ffff:ffff,MY -2406:4980::,2406:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4a00::,2406:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4a80::,2406:4a80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2406:4b00::,2406:4b00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:4b80::,2406:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4c00::,2406:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:4c80::,2406:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4d00::,2406:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4d80::,2406:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4e00::,2406:4e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:4e80::,2406:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4f00::,2406:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:4f80::,2406:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5000::,2406:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5080::,2406:5080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5100::,2406:5100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5180::,2406:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5200::,2406:5200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:5280::,2406:5280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5300::,2406:5300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:5380::,2406:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5400::,2406:5400:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:5480::,2406:5480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5500::,2406:5500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:5580::,2406:5580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5600::,2406:5600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:5680::,2406:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5700::,2406:5700:ffff:ffff:ffff:ffff:ffff:ffff,AF -2406:5780::,2406:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5800::,2406:5800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5880::,2406:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5900::,2406:5900:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:5980::,2406:5980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5a00::,2406:5a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:5a80::,2406:5a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5b00::,2406:5b00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2406:5c00::,2406:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:5c80::,2406:5c80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:5d00::,2406:5d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5d80::,2406:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5e00::,2406:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5e80::,2406:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:5f00::,2406:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:5f80::,2406:5f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6000::,2406:6000:ffff:ffff:ffff:ffff:ffff:ffff,MY -2406:6080::,2406:6080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6100::,2406:6100:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6180::,2406:6180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6200::,2406:6200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:6280::,2406:6280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6300::,2406:6300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6380::,2406:6380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6400::,2406:6400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6480::,2406:6480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6500::,2406:6500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6580::,2406:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6600::,2406:6600:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:6680::,2406:6680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6700::,2406:6700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6780::,2406:6780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6800::,2406:6800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:6880::,2406:6880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6900::,2406:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6980::,2406:6980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6a00::,2406:6a00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:6a80::,2406:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6b00::,2406:6b00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:6b80::,2406:6b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6c00::,2406:6c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6c80::,2406:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6d00::,2406:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6d80::,2406:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6e00::,2406:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:6e80::,2406:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:6f80::,2406:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7000::,2406:7000:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:7080::,2406:7080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7100::,2406:7100:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:7180::,2406:7180:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:7280::,2406:7280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7300::,2406:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:7380::,2406:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7400::,2406:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:7480::,2406:7480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7580::,2406:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7600::,2406:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:7680::,2406:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7700::,2406:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2406:7780::,2406:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7800::,2406:7801:ffff:ffff:ffff:ffff:ffff:ffff,BN -2406:7880::,2406:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7900::,2406:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH -2406:7980::,2406:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7a00::,2406:7a00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:7a80::,2406:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7b80::,2406:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7c00::,2406:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:7c80::,2406:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7d00::,2406:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7d80::,2406:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7e00::,2406:7e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:7e80::,2406:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:7f00::,2406:7f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:7f80::,2406:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8000::,2406:8000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:8080::,2406:8080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8100::,2406:8100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:8180::,2406:8180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8200::,2406:8200:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:8280::,2406:8280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8380::,2406:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8400::,2406:8400:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:8480::,2406:8480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8500::,2406:8500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8580::,2406:8580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8600::,2406:8600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:8680::,2406:8680:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:8700::,2406:8700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:8780::,2406:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8800::,2406:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:8880::,2406:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8980::,2406:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8a00::,2406:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:8a80::,2406:8a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8b00::,2406:8b00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2406:8b80::,2406:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8c00::,2406:8c00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:8c80::,2406:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8d00::,2406:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:8d80::,2406:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8e00::,2406:8e00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:8e80::,2406:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:8f00::,2406:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:8f80::,2406:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9000::,2406:9000:ffff:ffff:ffff:ffff:ffff:ffff,VN -2406:9080::,2406:9080:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:9100::,2406:9100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:9180::,2406:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9200::,2406:9200:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9280::,2406:9280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9300::,2406:9300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:9380::,2406:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9400::,2406:9400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:9480::,2406:9480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9580::,2406:9580:ffff:ffff:ffff:ffff:ffff:ffff,TW -2406:9600::,2406:9600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:9680::,2406:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:9700::,2406:9700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:9780::,2406:9780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9880::,2406:9880:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:9900::,2406:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:9980::,2406:9980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:9a00::,2406:9a01:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:9a80::,2406:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:9b00::,2406:9b00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:9b80::,2406:9b80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:9c00::,2406:9c00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:9c80::,2406:9c80:ffff:ffff:ffff:ffff:ffff:ffff,VN -2406:9d80::,2406:9d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9e00::,2406:9e00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:9e80::,2406:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:9f00::,2406:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:9f80::,2406:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a000::,2406:a000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:a080::,2406:a080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a100::,2406:a100:ffff:ffff:ffff:ffff:ffff:ffff,AF -2406:a180::,2406:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a200::,2406:a200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:a280::,2406:a280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a300::,2406:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:a380::,2406:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a400::,2406:a400::ffff:ffff:ffff:ffff:ffff,SG -2406:a400:1::,2406:a400:1:7fff:ffff:ffff:ffff:ffff,ID -2406:a400:1:8000::,2406:a400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:a480::,2406:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a500::,2406:a500:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:a580::,2406:a580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a600::,2406:a600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:a680::,2406:a680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a700::,2406:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:a780::,2406:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a800::,2406:a800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:a880::,2406:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:a900::,2406:a900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:a980::,2406:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:aa00::,2406:aa00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:aa80::,2406:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ab00::,2406:ab00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:ab80::,2406:ab80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ac00::,2406:ac00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:ac80::,2406:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ad00::,2406:ad00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:ad80::,2406:ad80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ae00::,2406:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:ae80::,2406:ae80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:af00::,2406:af00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:af80::,2406:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:b000::,2406:b000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:b080::,2406:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:b100::,2406:b100:ffff:ffff:ffff:ffff:ffff:ffff,KH -2406:b180::,2406:b180:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:b200::,2406:b200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:b280::,2406:b280:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:b300::,2406:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:b380::,2406:b380:ffff:ffff:ffff:ffff:ffff:ffff,MM -2406:b400::,2406:b400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:b480::,2406:b480:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:b500::,2406:b500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:b580::,2406:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:b600::,2406:b600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:b680::,2406:b680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:b700::,2406:b700:ffff:ffff:ffff:ffff:ffff:ffff,NP -2406:b780::,2406:b780:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:b800::,2406:b800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:b880::,2406:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:b900::,2406:b900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:b980::,2406:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ba00::,2406:ba00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:ba80::,2406:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:bb00::,2406:bb07:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:bb80::,2406:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:bc00::,2406:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:bc80::,2406:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:bd00::,2406:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:bd80::,2406:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:be00::,2406:be00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:be80::,2406:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:bf00::,2406:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:bf80::,2406:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c000::,2406:c000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c080::,2406:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c100::,2406:c100:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:c180::,2406:c180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c200::,2406:c200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c280::,2406:c280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c300::,2406:c300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:c380::,2406:c380:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:c400::,2406:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c480::,2406:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c500::,2406:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c580::,2406:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c600::,2406:c600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c680::,2406:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c700::,2406:c700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:c780::,2406:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c800::,2406:c800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:c880::,2406:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c900::,2406:c900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:c980::,2406:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ca00::,2406:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:ca80::,2406:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:cb00::,2406:cb00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:cb80::,2406:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:cc00::,2406:cc00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:cc80::,2406:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:cd00::,2406:cd00:ffff:ffff:ffff:ffff:ffff:ffff,KI -2406:cd80::,2406:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ce00::,2406:ce07:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:ce80::,2406:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:cf00::,2406:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:cf80::,2406:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d000::,2406:d000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:d080::,2406:d080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d100::,2406:d100:ffff:ffff:ffff:ffff:ffff:ffff,AF -2406:d180::,2406:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d200::,2406:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:d280::,2406:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d300::,2406:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:d380::,2406:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d400::,2406:d400:ffff:ffff:ffff:ffff:ffff:ffff,TW -2406:d480::,2406:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d500::,2406:d501:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:d580::,2406:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d600::,2406:d600:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:d680::,2406:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d700::,2406:d700:ffff:ffff:ffff:ffff:ffff:ffff,KR -2406:d780::,2406:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d800::,2406:d800:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:d880::,2406:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:d980::,2406:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:da00::,2406:da00:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:da00:2000::,2406:da00:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:da00:2100::,2406:da00:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:da00:4000::,2406:da00:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:da00:4100::,2406:da00:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:da00:8000::,2406:da00:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:da00:8100::,2406:da00:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:da00:a000::,2406:da00:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:da00:a100::,2406:da00:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:da00:c000::,2406:da00:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:da00:c100::,2406:da11:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:da12::,2406:da12:fff:ffff:ffff:ffff:ffff:ffff,KR -2406:da12:1000::,2406:da13:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:da14::,2406:da14:fff:ffff:ffff:ffff:ffff:ffff,JP -2406:da14:1000::,2406:da17:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:da18::,2406:da18:fff:ffff:ffff:ffff:ffff:ffff,SG -2406:da18:1000::,2406:da19:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:da1a::,2406:da1a:fff:ffff:ffff:ffff:ffff:ffff,IN -2406:da1a:1000::,2406:da1b:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:da1c::,2406:da1c:fff:ffff:ffff:ffff:ffff:ffff,AU -2406:da1c:1000::,2406:daa0:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:daa0:2000::,2406:daa0:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:daa0:2100::,2406:daa0:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:daa0:4000::,2406:daa0:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:daa0:4100::,2406:daa0:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:daa0:8000::,2406:daa0:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:daa0:8100::,2406:daa0:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:daa0:a000::,2406:daa0:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:daa0:a100::,2406:daa0:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:daa0:c000::,2406:daa0:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:daa0:c100::,2406:daf8:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf8:2000::,2406:daf8:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:daf8:2100::,2406:daf8:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf8:4000::,2406:daf8:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:daf8:4100::,2406:daf8:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf8:8000::,2406:daf8:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:daf8:8100::,2406:daf8:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf8:a000::,2406:daf8:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:daf8:a100::,2406:daf8:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:daf8:c000::,2406:daf8:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:daf8:c100::,2406:daf9:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf9:2000::,2406:daf9:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:daf9:2100::,2406:daf9:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf9:4000::,2406:daf9:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:daf9:4100::,2406:daf9:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf9:8000::,2406:daf9:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:daf9:8100::,2406:daf9:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:daf9:a000::,2406:daf9:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:daf9:a100::,2406:daf9:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:daf9:c000::,2406:daf9:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:daf9:c100::,2406:dafa:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafa:2000::,2406:dafa:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:dafa:2100::,2406:dafa:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafa:4000::,2406:dafa:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:dafa:4100::,2406:dafa:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafa:8000::,2406:dafa:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:dafa:8100::,2406:dafa:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafa:a000::,2406:dafa:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:dafa:a100::,2406:dafa:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:dafa:c000::,2406:dafa:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:dafa:c100::,2406:dafc:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafc:2000::,2406:dafc:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:dafc:2100::,2406:dafc:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafc:4000::,2406:dafc:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:dafc:4100::,2406:dafc:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafc:8000::,2406:dafc:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:dafc:8100::,2406:dafc:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafc:a000::,2406:dafc:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:dafc:a100::,2406:dafc:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:dafc:c000::,2406:dafc:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:dafc:c100::,2406:dafe:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafe:2000::,2406:dafe:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:dafe:2100::,2406:dafe:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafe:4000::,2406:dafe:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:dafe:4100::,2406:dafe:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafe:8000::,2406:dafe:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:dafe:8100::,2406:dafe:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:dafe:a000::,2406:dafe:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:dafe:a100::,2406:dafe:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:dafe:c000::,2406:dafe:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:dafe:c100::,2406:daff:1fff:ffff:ffff:ffff:ffff:ffff,US -2406:daff:2000::,2406:daff:20ff:ffff:ffff:ffff:ffff:ffff,KR -2406:daff:2100::,2406:daff:3fff:ffff:ffff:ffff:ffff:ffff,US -2406:daff:4000::,2406:daff:40ff:ffff:ffff:ffff:ffff:ffff,JP -2406:daff:4100::,2406:daff:7fff:ffff:ffff:ffff:ffff:ffff,US -2406:daff:8000::,2406:daff:80ff:ffff:ffff:ffff:ffff:ffff,SG -2406:daff:8100::,2406:daff:9fff:ffff:ffff:ffff:ffff:ffff,US -2406:daff:a000::,2406:daff:a0ff:ffff:ffff:ffff:ffff:ffff,IN -2406:daff:a100::,2406:daff:bfff:ffff:ffff:ffff:ffff:ffff,US -2406:daff:c000::,2406:daff:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:daff:c100::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:db00::,2406:db00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:db80::,2406:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:dc00::,2406:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:dc80::,2406:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:dd00::,2406:dd00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:dd80::,2406:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:de00::,2406:de00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:de80::,2406:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:df00::,2406:df00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:df80::,2406:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e000::,2406:e007:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:e080::,2406:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e100::,2406:e100:ffff:ffff:ffff:ffff:ffff:ffff,PH -2406:e180::,2406:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e200::,2406:e200:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:e280::,2406:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e300::,2406:e300:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:e380::,2406:e380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e400::,2406:e401:ffff:ffff:ffff:ffff:ffff:ffff,MV -2406:e480::,2406:e480:ffff:ffff:ffff:ffff:ffff:ffff,MM -2406:e500::,2406:e500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e580::,2406:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e600::,2406:e600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:e680::,2406:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e700::,2406:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:e780::,2406:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:e800::,2406:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:e880::,2406:e880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:e900::,2406:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:ea00::,2406:ea00:ffff:ffff:ffff:ffff:ffff:ffff,MM -2406:ea80::,2406:ea80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:eb00::,2406:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:eb80::,2406:eb80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:ec00::,2406:ec00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:ec80::,2406:ec80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:ed00::,2406:ed00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:ed80::,2406:ed80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:ee00::,2406:ee00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:ee80::,2406:ee80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:ef00::,2406:ef00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:ef80::,2406:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US -2406:f000::,2406:f000:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:f080::,2406:f080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:f100::,2406:f100:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:f180::,2406:f180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2406:f200::,2406:f200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:f280::,2406:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:f300::,2406:f300:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:f380::,2406:f380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:f400::,2406:f400:12f:ffff:ffff:ffff:ffff:ffff,SG -2406:f400:130::,2406:f400:13f:ffff:ffff:ffff:ffff:ffff,JP -2406:f400:140::,2406:f400:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:f480::,2406:f480:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:f500::,2406:f500:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:f580::,2406:f580:ffff:ffff:ffff:ffff:ffff:ffff,PK -2406:f600::,2406:f600:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:f680::,2406:f680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2406:f700::,2406:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:f780::,2406:f780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:f800::,2406:f800:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2406:f880::,2406:f880:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:f900::,2406:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:f980::,2406:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:fa00::,2406:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:fa80::,2406:fa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:fb00::,2406:fb00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:fb80::,2406:fb80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2406:fc00::,2406:fc00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2406:fc80::,2406:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:fd00::,2406:fd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2406:fd80::,2406:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:fe00::,2406:fe00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:fe80::,2406:fe80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ff00::,2406:ff00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2406:ff80::,2406:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407::,2407::ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:80::,2407:80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:100::,2407:100:ffff:ffff:ffff:ffff:ffff:ffff,VN -2407:180::,2407:180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:200::,2407:200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:280::,2407:280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:300::,2407:300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:380::,2407:380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:400::,2407:400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:480::,2407:480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:500::,2407:500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:580::,2407:580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:600::,2407:600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:680::,2407:680:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:700::,2407:700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:780::,2407:780:ffff:ffff:ffff:ffff:ffff:ffff,MM -2407:800::,2407:800:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2407:880::,2407:880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:900::,2407:900:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:980::,2407:980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:a00::,2407:a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a80::,2407:a80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:b00::,2407:b00:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:c00::,2407:c00:ffff:ffff:ffff:ffff:ffff:ffff,LK -2407:c80::,2407:c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:d00::,2407:d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:d80::,2407:d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:e00::,2407:e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:e80::,2407:e80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:f00::,2407:f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:f80::,2407:f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:1000::,2407:1000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:1080::,2407:1080:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:1100::,2407:1100:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:1180::,2407:1180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:1200::,2407:1200:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:1280::,2407:1280:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:1300::,2407:1300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:1380::,2407:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:1400::,2407:1400:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:1480::,2407:1480:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:1500::,2407:1500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:1580::,2407:1580:ffff:ffff:ffff:ffff:ffff:ffff,US -2407:1600::,2407:1600:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:1680::,2407:1680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2407:1700::,2407:1700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:1780::,2407:1780:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:1800::,2407:1800:ffff:ffff:ffff:ffff:ffff:ffff,PG -2407:1880::,2407:1880:ffff:ffff:ffff:ffff:ffff:ffff,GB -2407:1900::,2407:1900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:1980::,2407:1980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:1a80::,2407:1a80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:1b00::,2407:1b00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:1b80::,2407:1b80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:1c00::,2407:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:1c80::,2407:1c80:ffff:ffff:ffff:ffff:ffff:ffff,MN -2407:1d00::,2407:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:1d80::,2407:1d80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:1e00::,2407:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:1e80::,2407:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:1f80::,2407:1f80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:2000::,2407:2000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:2080::,2407:2080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2180::,2407:2180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2200::,2407:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2280::,2407:2280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:2380::,2407:2380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:2400::,2407:2400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:2480::,2407:2480:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:2500::,2407:2500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2580::,2407:2580:ffff:ffff:ffff:ffff:ffff:ffff,NL -2407:2680::,2407:2680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:2780::,2407:2780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:2800::,2407:2800:ffff:ffff:ffff:ffff:ffff:ffff,WS -2407:2880::,2407:2880:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:2900::,2407:2900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:2980::,2407:2980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2a00::,2407:2a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:2a80::,2407:2a80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2407:2b00::,2407:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:2b80::,2407:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:2c80::,2407:2c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2d00::,2407:2d00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:2d80::,2407:2d80:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:2e00::,2407:2e01:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:2e80::,2407:2e80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2407:2f00::,2407:2f00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:2f80::,2407:2f80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3000::,2407:3000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:3080::,2407:3080:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:3100::,2407:3100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:3180::,2407:3180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3280::,2407:3280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3300::,2407:3300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:3380::,2407:3380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:3400::,2407:3400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3480::,2407:3480:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:3500::,2407:3500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:3580::,2407:3580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3600::,2407:3600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3680::,2407:3680:ffff:ffff:ffff:ffff:ffff:ffff,MN -2407:3700::,2407:3700:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:3780::,2407:3780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3800::,2407:3800:ffff:ffff:ffff:ffff:ffff:ffff,SB -2407:3880::,2407:3880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:3900::,2407:3900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:3980::,2407:3980:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:3a00::,2407:3a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3a80::,2407:3a80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:3b00::,2407:3b00:ffff:ffff:ffff:ffff:ffff:ffff,PG -2407:3b80::,2407:3b80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3c00::,2407:3c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3c80::,2407:3c80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:3d00::,2407:3d00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:3d80::,2407:3d80:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:3e00::,2407:3e00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:3e80::,2407:3e80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:3f00::,2407:3f00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:3f80::,2407:3f80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:4000::,2407:4000:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:4080::,2407:4080:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:4100::,2407:4100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:4180::,2407:4180:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:4200::,2407:4200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:4280::,2407:4280:ffff:ffff:ffff:ffff:ffff:ffff,LA -2407:4300::,2407:4300:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:4380::,2407:4380:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:4400::,2407:4400:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:4480::,2407:4480:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:4500::,2407:4500:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:4580::,2407:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4600::,2407:4600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:4680::,2407:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4700::,2407:4700:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:4780::,2407:4780:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:4800::,2407:4800:ffff:ffff:ffff:ffff:ffff:ffff,FM -2407:4880::,2407:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4900::,2407:4900:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:4980::,2407:4980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4a00::,2407:4a00:ffff:ffff:ffff:ffff:ffff:ffff,NC -2407:4a80::,2407:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4b00::,2407:4b00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:4b80::,2407:4b80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2407:4c00::,2407:4c00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:4c80::,2407:4c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4d00::,2407:4d00:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:4d80::,2407:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4e00::,2407:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:4e80::,2407:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4f00::,2407:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:4f80::,2407:4f80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:5000::,2407:5000:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:5080::,2407:5080:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:5100::,2407:5100:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:5180::,2407:5180:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:5200::,2407:5200:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:5280::,2407:5280:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:5300::,2407:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:5380::,2407:5380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:5400::,2407:5400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:5480::,2407:5480:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:5500::,2407:5500:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:5580::,2407:5580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:5600::,2407:5600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:5680::,2407:5680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:5700::,2407:5700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:5780::,2407:5780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:5800::,2407:5800:ffff:ffff:ffff:ffff:ffff:ffff,CK -2407:5880::,2407:5887:ffff:ffff:ffff:ffff:ffff:ffff,US -2407:5900::,2407:5900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:5980::,2407:5980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:5a00::,2407:5a00:ffff:ffff:ffff:ffff:ffff:ffff,PH -2407:5a80::,2407:5a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:5b00::,2407:5b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:5b80::,2407:5b80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:5c00::,2407:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:5c80::,2407:5c80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:5d00::,2407:5d00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:5d80::,2407:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:5e00::,2407:5e00:ffff:ffff:ffff:ffff:ffff:ffff,KH -2407:5e80::,2407:5e80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:5f00::,2407:5f00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:5f80::,2407:5f80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:6000::,2407:6000:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:6080::,2407:6080:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:6100::,2407:6100:ffff:ffff:ffff:ffff:ffff:ffff,MM -2407:6180::,2407:6180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6200::,2407:6200:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:6280::,2407:6280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:6300::,2407:6300:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:6380::,2407:6380:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:6400::,2407:6400:ffff:ffff:ffff:ffff:ffff:ffff,MN -2407:6480::,2407:6480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:6500::,2407:6500:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:6580::,2407:6580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:6600::,2407:6600:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:6680::,2407:6680:ffff:ffff:ffff:ffff:ffff:ffff,KH -2407:6700::,2407:6700:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:6780::,2407:6780:ffff:ffff:ffff:ffff:ffff:ffff,SC -2407:6800::,2407:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6880::,2407:6880:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:6900::,2407:6900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6980::,2407:6980:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:6a00::,2407:6a00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6a80::,2407:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:6b00::,2407:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6b80::,2407:6b80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:6c00::,2407:6c00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:6c80::,2407:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6d00::,2407:6d00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:6d80::,2407:6d80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:6e00::,2407:6e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:6e80::,2407:6e80:ffff:ffff:ffff:ffff:ffff:ffff,MM -2407:6f00::,2407:6f00:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:6f80::,2407:6f80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:7000::,2407:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:7080::,2407:7080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:7100::,2407:7100:ffff:ffff:ffff:ffff:ffff:ffff,TW -2407:7180::,2407:7180:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:7200::,2407:7200:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:7280::,2407:7280:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:7300::,2407:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:7380::,2407:7380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:7400::,2407:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:7480::,2407:7480:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:7500::,2407:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:7580::,2407:7580:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:7600::,2407:7600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:7680::,2407:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7700::,2407:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:7780::,2407:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7800::,2407:7800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:7880::,2407:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7900::,2407:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:7980::,2407:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7a00::,2407:7a00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:7a80::,2407:7a80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:7b00::,2407:7b00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:7b80::,2407:7b80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:7c00::,2407:7c00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:7c80::,2407:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7d00::,2407:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7d80::,2407:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7e80::,2407:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:7f00::,2407:7f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:8000::,2407:8001:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:8080::,2407:8080:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:8100::,2407:8100:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:8180::,2407:8180:ffff:ffff:ffff:ffff:ffff:ffff,KH -2407:8200::,2407:8200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:8280::,2407:8280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8300::,2407:8300:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:8380::,2407:8380:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8400::,2407:8400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8480::,2407:8480:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:8500::,2407:8500:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:8580::,2407:8580:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:8600::,2407:8600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8680::,2407:8680:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:8700::,2407:8700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:8780::,2407:8780:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:8800::,2407:8800:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8880::,2407:8880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:8900::,2407:8900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8980::,2407:8980:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8a00::,2407:8a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:8a80::,2407:8a80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:8b00::,2407:8b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:8b80::,2407:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:8c00::,2407:8c00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:8e00::,2407:8e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:8e80::,2407:8e80:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:8f00::,2407:8f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:8f80::,2407:8f80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:9000::,2407:9001:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:9080::,2407:9080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:9100::,2407:9100:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:9180::,2407:9180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:9280::,2407:9280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:9300::,2407:9300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:9380::,2407:9380:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:9400::,2407:9400:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:9480::,2407:9480:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:9500::,2407:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:9580::,2407:9580:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:9680::,2407:9680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:9780::,2407:9780:ffff:ffff:ffff:ffff:ffff:ffff,US -2407:9800::,2407:9807:ffff:ffff:ffff:ffff:ffff:ffff,PH -2407:9880::,2407:9880:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:9900::,2407:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:9980::,2407:9980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:9a00::,2407:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:9a80::,2407:9a80:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:9b80::,2407:9b80:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:9c00::,2407:9c00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:9c80::,2407:9c80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:9d00::,2407:9d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:9d80::,2407:9d80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:9e00::,2407:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:9e80::,2407:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:9f00::,2407:9f00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:9f80::,2407:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:a000::,2407:a000:ffff:ffff:ffff:ffff:ffff:ffff,FJ -2407:a080::,2407:a080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a100::,2407:a100:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a180::,2407:a180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:a200::,2407:a200:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a280::,2407:a280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a300::,2407:a300:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:a380::,2407:a380:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:a480::,2407:a480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:a500::,2407:a500:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:a580::,2407:a580:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:a600::,2407:a600:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:a680::,2407:a680:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:a700::,2407:a700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:a780::,2407:a780:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:a800::,2407:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:a880::,2407:a880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:a980::,2407:a980:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:aa80::,2407:aa80:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:ab00::,2407:ab00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ab80::,2407:ab80:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:ac00::,2407:ac00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:ac80::,2407:ac80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ad00::,2407:ad00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:ad80::,2407:ad80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ae00::,2407:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ae80::,2407:ae80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:af00::,2407:af00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:af80::,2407:af80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b000::,2407:b001:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:b080::,2407:b080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b100::,2407:b100:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:b180::,2407:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b200::,2407:b200:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:b280::,2407:b280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b380::,2407:b380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b400::,2407:b400:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:b480::,2407:b480:ffff:ffff:ffff:ffff:ffff:ffff,US -2407:b500::,2407:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:b580::,2407:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b600::,2407:b600:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:b680::,2407:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b700::,2407:b700:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:b780::,2407:b780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b800::,2407:b800:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:b880::,2407:b880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:b900::,2407:b900:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:b980::,2407:b980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ba00::,2407:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ba80::,2407:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:bb00::,2407:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:bb80::,2407:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:bc00::,2407:bc00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:bc80::,2407:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:bd00::,2407:bd00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:bd80::,2407:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:be00::,2407:be00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:be80::,2407:be80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:bf00::,2407:bf00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:bf80::,2407:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c000::,2407:c000:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:c080::,2407:c080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c100::,2407:c100:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:c180::,2407:c180:ffff:ffff:ffff:ffff:ffff:ffff,KH -2407:c200::,2407:c200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:c280::,2407:c280:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:c300::,2407:c300:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:c380::,2407:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c400::,2407:c400:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c480::,2407:c480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c500::,2407:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:c580::,2407:c580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c600::,2407:c600:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:c680::,2407:c680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c700::,2407:c700:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:c780::,2407:c780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c800::,2407:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:c880::,2407:c880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c900::,2407:c900:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:c980::,2407:c980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ca00::,2407:ca00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:ca80::,2407:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:cb00::,2407:cb00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:cb80::,2407:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:cc00::,2407:cc00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:cc80::,2407:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:cd00::,2407:cd00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:cd80::,2407:cd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ce00::,2407:ce00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ce80::,2407:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:cf00::,2407:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:cf80::,2407:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d000::,2407:d000:ffff:ffff:ffff:ffff:ffff:ffff,PK -2407:d080::,2407:d080:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:d100::,2407:d100:ffff:ffff:ffff:ffff:ffff:ffff,KR -2407:d180::,2407:d180:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:d200::,2407:d200:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:d280::,2407:d280:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:d300::,2407:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:d380::,2407:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:d400::,2407:d400:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:d480::,2407:d480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d500::,2407:d500:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:d580::,2407:d580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d600::,2407:d600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:d680::,2407:d680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d700::,2407:d700:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:d780::,2407:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d800::,2407:d800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:d880::,2407:d880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:d900::,2407:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:d980::,2407:d980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:da00::,2407:da00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:da80::,2407:da80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:db00::,2407:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:db80::,2407:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:dc00::,2407:dc00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:dc80::,2407:dc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:dd80::,2407:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:de00::,2407:de00:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:de80::,2407:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:df00::,2407:df00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:df80::,2407:df80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e000::,2407:e000:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:e080::,2407:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e100::,2407:e100:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:e180::,2407:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e200::,2407:e200:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:e280::,2407:e280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e300::,2407:e301:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:e380::,2407:e380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e400::,2407:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:e480::,2407:e480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e500::,2407:e501:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:e580::,2407:e580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e600::,2407:e600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:e680::,2407:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e700::,2407:e700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:e780::,2407:e780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e800::,2407:e800:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:e880::,2407:e880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:e900:1::,2407:e900:1:7fff:ffff:ffff:ffff:ffff,IN -2407:e980::,2407:e980:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:ea00::,2407:ea00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:ea80::,2407:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:eb00::,2407:eb00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:eb80::,2407:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ec00::,2407:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ec80::,2407:ec80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ed00::,2407:ed00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2407:ed80::,2407:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ee00::,2407:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:ee80::,2407:ee80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:ef00::,2407:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2407:ef80::,2407:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f000::,2407:f000:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:f080::,2407:f080:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f100::,2407:f100:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2407:f180::,2407:f180:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f200::,2407:f200:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:f280::,2407:f280:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f300::,2407:f300:ffff:ffff:ffff:ffff:ffff:ffff,MM -2407:f380::,2407:f380:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f400::,2407:f400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:f480::,2407:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f580::,2407:f580:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f600::,2407:f600:ffff:ffff:ffff:ffff:ffff:ffff,JP -2407:f680::,2407:f680:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f700::,2407:f700:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:f780::,2407:f780:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f800::,2407:f800:ffff:ffff:ffff:ffff:ffff:ffff,MY -2407:f880::,2407:f880:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:f900::,2407:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID -2407:f980::,2407:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:fa00::,2407:fa00:ffff:ffff:ffff:ffff:ffff:ffff,HK -2407:fa80::,2407:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:fb80::,2407:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:fc80::,2407:fc80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:fd00::,2407:fd00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:fd80::,2407:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CN -2407:fe00::,2407:fe00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:fe80::,2407:fe80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2407:ff00::,2407:ff00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2407:ff80::,2407:ff80:ffff:ffff:ffff:ffff:ffff:ffff,BD -2408::,2408:3ff:ffff:ffff:ffff:ffff:ffff:ffff,JP -2408:4000::,2408:43ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -2408:8000::,2408:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN -2409:10::,2409:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP -2409:250::,2409:25f:ffff:ffff:ffff:ffff:ffff:ffff,JP -2409:4000::,2409:43ff:ffff:ffff:ffff:ffff:ffff:ffff,IN -2409:8000::,2409:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240a::,240a:7f:ffff:ffff:ffff:ffff:ffff:ffff,JP -240a:8000::,240a:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240b::,240b:11:4180:9fff:ffff:ffff:ffff:ffff,JP -240b:11:4180:a000::,240b:11:4180:bfff:ffff:ffff:ffff:ffff,US -240b:11:4180:c000::,240b:11:4a00:8fff:ffff:ffff:ffff:ffff,JP -240b:11:4a00:9000::,240b:11:4a00:91ff:ffff:ffff:ffff:ffff,US -240b:11:4a00:9200::,240b:11:519f:ffff:ffff:ffff:ffff:ffff,JP -240b:11:51a0::,240b:11:51a0:7fff:ffff:ffff:ffff:ffff,US -240b:11:51a0:8000::,240b:3f:ffff:ffff:ffff:ffff:ffff:ffff,JP -240b:240::,240b:27f:ffff:ffff:ffff:ffff:ffff:ffff,JP -240b:8000::,240b:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240c::,240c:f:ffff:ffff:ffff:ffff:ffff:ffff,CN -240c:8000::,240c:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240d::,240d:2:410a:7fff:ffff:ffff:ffff:ffff,JP -240d:2:410a:8000::,240d:2:410a:ffff:ffff:ffff:ffff:ffff,US -240d:2:410b::,240d:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP -240d:8000::,240d:80ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240e::,240e:fff:ffff:ffff:ffff:ffff:ffff:ffff,CN -240f::,240f:4:c3db:ffff:ffff:ffff:ffff:ffff,JP -240f:4:c3dc::,240f:4:c3dc:7fff:ffff:ffff:ffff:ffff,US -240f:4:c3dc:8000::,240f:6:849:ffff:ffff:ffff:ffff:ffff,JP -240f:6:84a::,240f:6:84a:7fff:ffff:ffff:ffff:ffff,US -240f:6:84a:8000::,240f:8:ef3:ffff:ffff:ffff:ffff:ffff,JP -240f:8:ef4::,240f:8:ef4:7fff:ffff:ffff:ffff:ffff,US -240f:8:ef4:8000::,240f:14:5ff4:ffff:ffff:ffff:ffff:ffff,JP -240f:14:5ff5::,240f:14:5ff5:7fff:ffff:ffff:ffff:ffff,GB -240f:14:5ff5:8000::,240f:31:707d:ffff:ffff:ffff:ffff:ffff,JP -240f:31:707e::,240f:31:707e:7fff:ffff:ffff:ffff:ffff,GB -240f:31:707e:8000::,240f:71:978:ffff:ffff:ffff:ffff:ffff,JP -240f:71:979::,240f:71:979:7fff:ffff:ffff:ffff:ffff,KR -240f:71:979:8000::,240f:77:1908:ffff:ffff:ffff:ffff:ffff,JP -240f:77:1909::,240f:77:1909:7fff:ffff:ffff:ffff:ffff,CN -240f:77:1909:8000::,240f:78:30b1:ffff:ffff:ffff:ffff:ffff,JP -240f:78:30b2::,240f:78:30b2:7fff:ffff:ffff:ffff:ffff,CN -240f:78:30b2:8000::,240f:98:8f77:ffff:ffff:ffff:ffff:ffff,JP -240f:98:8f78::,240f:98:8f78:7fff:ffff:ffff:ffff:ffff,SE -240f:98:8f78:8000::,240f:b5:2520:ffff:ffff:ffff:ffff:ffff,JP -240f:b5:2521::,240f:b5:2521:7fff:ffff:ffff:ffff:ffff,US -240f:b5:2521:8000::,240f:d1:cbc8:ffff:ffff:ffff:ffff:ffff,JP -240f:d1:cbc9::,240f:d1:cbc9:7fff:ffff:ffff:ffff:ffff,AU -240f:d1:cbc9:8000::,240f:1ff:ffff:ffff:ffff:ffff:ffff:ffff,JP -240f:8000::,240f:80ff:ffff:ffff:ffff:ffff:ffff:ffff,CN -2600::,2600:1:d000:ffff:ffff:ffff:ffff:ffff,US -2600:1:d001::,2600:1:d001:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d001:8000::,2600:1:d001:ffff:ffff:ffff:ffff:ffff,US -2600:1:d002::,2600:1:d002:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d003::,2600:1:d004:7fff:ffff:ffff:ffff:ffff,US -2600:1:d004:8000::,2600:1:d005:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d005:8000::,2600:1:d006:ffff:ffff:ffff:ffff:ffff,US -2600:1:d007::,2600:1:d007:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d008::,2600:1:d008:ffff:ffff:ffff:ffff:ffff,VI -2600:1:d009::,2600:1:d009:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d009:8000::,2600:1:d00a:7fff:ffff:ffff:ffff:ffff,US -2600:1:d00a:8000::,2600:1:d00a:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d00b::,2600:1:d00b:ffff:ffff:ffff:ffff:ffff,US -2600:1:d00c::,2600:1:d00c:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d00c:8000::,2600:1:d00d:ffff:ffff:ffff:ffff:ffff,US -2600:1:d00e::,2600:1:d00e:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d00e:8000::,2600:1:d00e:ffff:ffff:ffff:ffff:ffff,US -2600:1:d00f::,2600:1:d00f:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d00f:8000::,2600:1:d00f:ffff:ffff:ffff:ffff:ffff,US -2600:1:d010::,2600:1:d010:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d010:8000::,2600:1:d011:7fff:ffff:ffff:ffff:ffff,US -2600:1:d011:8000::,2600:1:d012:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d013::,2600:1:d013:ffff:ffff:ffff:ffff:ffff,US -2600:1:d014::,2600:1:d015:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d015:8000::,2600:1:d016:7fff:ffff:ffff:ffff:ffff,US -2600:1:d016:8000::,2600:1:d016:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d017::,2600:1:d017:ffff:ffff:ffff:ffff:ffff,US -2600:1:d018::,2600:1:d018:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d018:8000::,2600:1:d018:ffff:ffff:ffff:ffff:ffff,US -2600:1:d019::,2600:1:d019:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d019:8000::,2600:1:d019:ffff:ffff:ffff:ffff:ffff,US -2600:1:d01a::,2600:1:d01a:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d01b::,2600:1:d01c:7fff:ffff:ffff:ffff:ffff,US -2600:1:d01c:8000::,2600:1:d01d:7fff:ffff:ffff:ffff:ffff,PR -2600:1:d01d:8000::,2600:1:d01f:7fff:ffff:ffff:ffff:ffff,US -2600:1:d01f:8000::,2600:1:d01f:ffff:ffff:ffff:ffff:ffff,PR -2600:1:d020::,2600:7:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:100::,2600:10f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:200::,2600:20f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:300::,2600:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:800::,2600:81f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:900::,2600:90f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:a00::,2600:a01:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:b00::,2600:b0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:c00::,2600:c14:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:d00::,2600:d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2600:f00::,2600:1017:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1100::,2600:110f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1200::,2600:130f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1400::,2600:150f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1600::,2600:16ff:ffff:ffff:ffff:ffff:ffff:ffff,CA -2600:1700::,2600:170f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1800::,2600:180f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1900::,2600:190f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1a00::,2600:1a0f:ffff:ffff:ffff:ffff:ffff:ffff,GD -2600:1b00::,2600:1bff:ffff:ffff:ffff:ffff:ffff:ffff,JM -2600:1d00::,2600:1d0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1e00::,2600:1e0f:ffff:ffff:ffff:ffff:ffff:ffff,VC -2600:1f00::,2600:1f00:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1f00:1000::,2600:1f00:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1f00:1100::,2600:1f00:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1f00:e000::,2600:1f00:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1f00:e100::,2600:1f10:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1f11::,2600:1f11:fff:ffff:ffff:ffff:ffff:ffff,CA -2600:1f11:1000::,2600:1f1d:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:1f1e::,2600:1f1e:fff:ffff:ffff:ffff:ffff:ffff,BR -2600:1f1e:1000::,2600:1fa0:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1fa0:1000::,2600:1fa0:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1fa0:1100::,2600:1fa0:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1fa0:e000::,2600:1fa0:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1fa0:e100::,2600:1ff8:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1ff8:1000::,2600:1ff8:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1ff8:1100::,2600:1ff8:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1ff8:e000::,2600:1ff8:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ff8:e100::,2600:1ff9:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1ff9:1000::,2600:1ff9:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1ff9:1100::,2600:1ff9:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1ff9:e000::,2600:1ff9:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ff9:e100::,2600:1ffa:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffa:1000::,2600:1ffa:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1ffa:1100::,2600:1ffa:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffa:e000::,2600:1ffa:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ffa:e100::,2600:1ffc:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffc:1000::,2600:1ffc:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1ffc:1100::,2600:1ffc:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffc:e000::,2600:1ffc:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ffc:e100::,2600:1ffe:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffe:1000::,2600:1ffe:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1ffe:1100::,2600:1ffe:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1ffe:e000::,2600:1ffe:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ffe:e100::,2600:1fff:fff:ffff:ffff:ffff:ffff:ffff,US -2600:1fff:1000::,2600:1fff:10ff:ffff:ffff:ffff:ffff:ffff,CA -2600:1fff:1100::,2600:1fff:dfff:ffff:ffff:ffff:ffff:ffff,US -2600:1fff:e000::,2600:1fff:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1fff:e100::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2100::,2600:210f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2200::,2600:220f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2300::,2600:230f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2400::,2600:2407:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2500::,2600:250f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2600::,2600:260f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2700::,2600:270f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2800::,2600:2803:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2900::,2600:290f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2a00::,2600:2a0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2b00::,2600:2b0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2c00::,2600:2c03:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2d00::,2600:2d0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:2e00::,2600:2e0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:3000::,2600:3007:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:3400::,2600:340f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:3800::,2600:380f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:3c00::,2600:3c03:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:4000::,2600:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:4400::,2600:4407:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:4800::,2600:480f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:4c00::,2600:4c01:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:5000::,2600:500f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:5400::,2600:541f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:5800::,2600:5801:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:5c00::,2600:5c01:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:6000::,2600:6001:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:6400::,2600:640f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:6800::,2600:68ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:6c00::,2600:6cff:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:7000::,2600:70ff:e810:ffff:ffff:ffff:ffff:ffff,US -2600:70ff:e811::,2600:70ff:e811:7fff:ffff:ffff:ffff:ffff,ZA -2600:70ff:e811:8000::,2600:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:7400::,2600:740f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:7800::,2600:780f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:7c00::,2600:7c0f:ffff:ffff:ffff:ffff:ffff:ffff,LC -2600:8000::,2600:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:8400::,2600:840f:ffff:ffff:ffff:ffff:ffff:ffff,BB -2600:8800::,2600:8802:3802:afff:ffff:ffff:ffff:ffff,US -2600:8802:3802:b000::,2600:8802:3802:b3ff:ffff:ffff:ffff:ffff,AU -2600:8802:3802:b400::,2600:880f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:8c00::,2600:8c0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:9000::,2600:900f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:a000::,2600:a00f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:a400::,2600:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:b000::,2600:b00f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:e000::,2600:e00f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2601::,2601:fff:ffff:ffff:ffff:ffff:ffff:ffff,US -2602::,2602:10f:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:200::,2602:200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2602:210::,2602:210:ffff:ffff:ffff:ffff:ffff:ffff,CA -2602:220::,2602:220:ffff:ffff:ffff:ffff:ffff:ffff,CA -2602:230::,2602:231:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:233::,2602:233:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:fea6::,2602:fea6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fea7::,2602:fea7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fea8::,2602:fea8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fea9::,2602:fea9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feaa::,2602:feaa:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feab::,2602:feab:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:feac::,2602:feac:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fead::,2602:fead:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feae::,2602:feae:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feaf::,2602:feaf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb0::,2602:feb0:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:feb1::,2602:feb1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb2::,2602:feb2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb3::,2602:feb3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb4::,2602:feb4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb5::,2602:feb5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb6::,2602:feb6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb7::,2602:feb7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb8::,2602:feb8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feb9::,2602:feb9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feba::,2602:feba:fff:ffff:ffff:ffff:ffff:ffff,US -2602:febb::,2602:febb:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:febc::,2602:febc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:febd::,2602:febd:fff:ffff:ffff:ffff:ffff:ffff,US -2602:febe::,2602:febe:fff:ffff:ffff:ffff:ffff:ffff,US -2602:febf::,2602:febf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec0::,2602:fec0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec1::,2602:fec1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec2::,2602:fec2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec3::,2602:fec3:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fec4::,2602:fec4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec5::,2602:fec5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec6::,2602:fec6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec7::,2602:fec7:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fec8::,2602:fec8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fec9::,2602:fec9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feca::,2602:feca:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fecb::,2602:fecb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fecc::,2602:fecc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fecd::,2602:fecd:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fece::,2602:fece:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fecf::,2602:fecf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed0::,2602:fed0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed1::,2602:fed1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed2::,2602:fed2:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fed3::,2602:fed3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed4::,2602:fed4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed5::,2602:fed5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed6::,2602:fed6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed7::,2602:fed7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fed8::,2602:fed8:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fed9::,2602:fed9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feda::,2602:feda:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fedb::,2602:fedb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fedc::,2602:fedc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fedd::,2602:fedd:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fede::,2602:fede:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fedf::,2602:fedf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef0::,2602:fef0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef1::,2602:fef1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef2::,2602:fef2:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fef3::,2602:fef3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef4::,2602:fef4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef5::,2602:fef5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef6::,2602:fef6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef7::,2602:fef7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef8::,2602:fef8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fef9::,2602:fef9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fefa::,2602:fefb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fefc::,2602:fefc:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:fefd::,2602:fefd:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fefe::,2602:fefe:fff:ffff:ffff:ffff:ffff:ffff,US -2602:feff::,2602:feff:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff00::,2602:ff00:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff01::,2602:ff01:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff02::,2602:ff02:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff04::,2602:ff04:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff05::,2602:ff05:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff06::,2602:ff06:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff07::,2602:ff07:fff:ffff:ffff:ffff:ffff:ffff,CW -2602:ff08::,2602:ff08:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff09::,2602:ff09:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff0a::,2602:ff0a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff0b::,2602:ff0b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff0c::,2602:ff0c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff0d::,2602:ff0d:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff0e::,2602:ff0e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff0f::,2602:ff0f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff10::,2602:ff10:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff11::,2602:ff11:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff12::,2602:ff12:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff13::,2602:ff13:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff14::,2602:ff14:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff15::,2602:ff15:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff16::,2602:ff16:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff17::,2602:ff17:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff18::,2602:ff18:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff19::,2602:ff19:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1a::,2602:ff1a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1b::,2602:ff1b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1c::,2602:ff1c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1d::,2602:ff1d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1e::,2602:ff1e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff1f::,2602:ff1f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff20::,2602:ff20:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff21::,2602:ff21:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff22::,2602:ff22:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff23::,2602:ff23:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff24::,2602:ff24:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff25::,2602:ff25:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff26::,2602:ff26:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff27::,2602:ff27:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff28::,2602:ff28:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff29::,2602:ff29:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2a::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2c::,2602:ff2c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2d::,2602:ff2d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2e::,2602:ff2e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2f::,2602:ff2f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff30::,2602:ff30:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff31::,2602:ff31:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff32::,2602:ff32:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff33::,2602:ff33:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff34::,2602:ff34:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff35::,2602:ff35:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff36::,2602:ff36:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff37::,2602:ff37:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff38::,2602:ff38:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff39::,2602:ff39:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff3a::,2602:ff3a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff3b::,2602:ff3b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff3c::,2602:ff3c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff3d::,2602:ff3d:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff3e::,2602:ff3e:7ff:ffff:ffff:ffff:ffff:ffff,US -2602:ff3e:800::,2602:ff3e:800:7fff:ffff:ffff:ffff:ffff,IN -2602:ff3e:800:8000::,2602:ff3e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff3f::,2602:ff3f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff40::,2602:ff40:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff41::,2602:ff41:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff42::,2602:ff42:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff43::,2602:ff43:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff44::,2602:ff44:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff45::,2602:ff45:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff46::,2602:ff46:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff47::,2602:ff47:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff48::,2602:ff48:fff:ffff:ffff:ffff:ffff:ffff,TC -2602:ff49::,2602:ff49:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4a::,2602:ff4a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4b::,2602:ff4b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4c::,2602:ff4c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4d::,2602:ff4d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4e::,2602:ff4e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff4f::,2602:ff4f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff50::,2602:ff50:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff51::,2602:ff51:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff52::,2602:ff52:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff53::,2602:ff53:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff54::,2602:ff54:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff55::,2602:ff55:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff56::,2602:ff56:fff:ffff:ffff:ffff:ffff:ffff,PR -2602:ff57::,2602:ff57:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff58::,2602:ff58:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff59::,2602:ff59:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5a::,2602:ff5a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5b::,2602:ff5b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5c::,2602:ff5c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5d::,2602:ff5d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5e::,2602:ff5e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff5f::,2602:ff5f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff60::,2602:ff60:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff61::,2602:ff61:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff62::,2602:ff62::ffff:ffff:ffff:ffff:ffff,US -2602:ff62:1::,2602:ff62:1:ffff:ffff:ffff:ffff:ffff,RU -2602:ff62:2::,2602:ff62:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff63::,2602:ff63:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff64::,2602:ff64:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff65::,2602:ff65:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff66::,2602:ff66:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff67::,2602:ff67:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff68::,2602:ff68:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff69::,2602:ff69:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff6b::,2602:ff6b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff6c::,2602:ff6c:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff6d::,2602:ff6d:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff6e::,2602:ff6e:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff6f::,2602:ff6f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff70::,2602:ff70:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff71::,2602:ff72:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff74::,2602:ff74:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff75::,2602:ff75:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff76::,2602:ff76:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff77::,2602:ff77:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff79::,2602:ff79:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff7a::,2602:ff7b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff7c::,2602:ff7c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff7d::,2602:ff7d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff7f::,2602:ff7f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff80::,2602:ff80:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff81::,2602:ff81:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff82::,2602:ff82:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff83::,2602:ff83:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff84::,2602:ff84:2:ffff:ffff:ffff:ffff:ffff,US -2602:ff84:3::,2602:ff84:3:ffff:ffff:ffff:ffff:ffff,DE -2602:ff84:4::,2602:ff84:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff85::,2602:ff85:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff87::,2602:ff87:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff88::,2602:ff88:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff89::,2602:ff89:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8a::,2602:ff8a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8b::,2602:ff8b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8c::,2602:ff8c:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8d::,2602:ff8d:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8e::,2602:ff8e:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff8f::,2602:ff8f:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff90::,2602:ff90:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff91::,2602:ff91:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff92::,2602:ff92:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff93::,2602:ff93:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff94::,2602:ff94:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff95::,2602:ff95:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff96::,2602:ff96:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff97::,2602:ff97:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff98::,2602:ff98:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff99::,2602:ff99:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff9b::,2602:ff9b:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff9c::,2602:ff9c:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG -2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa5::,2602:ffa5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa6::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa8::,2602:ffa8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffa9::,2602:ffa9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffaa::,2602:ffaa:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffab::,2602:ffab:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffac::,2602:ffac:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffad::,2602:ffad:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffae::,2602:ffae:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffaf::,2602:ffaf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb0::,2602:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb1::,2602:ffb1:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffb2::,2602:ffb2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb3::,2602:ffb3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb4::,2602:ffb4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb5::,2602:ffb5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb6::,2602:ffb6:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffb7::,2602:ffb7:eff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb7:f00::,2602:ffb7:fff:ffff:ffff:ffff:ffff:ffff,DE -2602:ffb8::,2602:ffb8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffb9::,2602:ffb9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffba::,2602:ffba:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffbb::,2602:ffbb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffbc::,2602:ffbc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffbd::,2602:ffbd:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffbe::,2602:ffbe:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffbf::,2602:ffbf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc0::,2602:ffc0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc1::,2602:ffc1:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffc2::,2602:ffc2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc3::,2602:ffc3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc4::,2602:ffc4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc5::,2602:ffc5:104:ffff:ffff:ffff:ffff:ffff,US -2602:ffc5:105::,2602:ffc5:105:ffff:ffff:ffff:ffff:ffff,CA -2602:ffc5:106::,2602:ffc6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc7::,2602:ffc7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc8::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffca::,2602:ffca:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffcb::,2602:ffcb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffcc::,2602:ffcc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffcd::,2602:ffcd:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffce::,2602:ffce:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffcf::,2602:ffcf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd0::,2602:ffd0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd1::,2602:ffd1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd3::,2602:ffd3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd4::,2602:ffd4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd5::,2602:ffd5:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffd6::,2602:ffd6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd7::,2602:ffd7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd8::,2602:ffd8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffd9::,2602:ffd9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffda::,2602:ffda:aa9:ffff:ffff:ffff:ffff:ffff,US -2602:ffda:aaa::,2602:ffda:aaa:7fff:ffff:ffff:ffff:ffff,NL -2602:ffda:aaa:8000::,2602:ffda:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffdb::,2602:ffdb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffdc::,2602:ffdc:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffdd::,2602:ffdd:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffde::,2602:ffde:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffdf::,2602:ffdf:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe0::,2602:ffe0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe1::,2602:ffe1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe2::,2602:ffe2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe3::,2602:ffe3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe4::,2602:ffe4:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe5::,2602:ffe5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe7::,2602:ffe7:fff:ffff:ffff:ffff:ffff:ffff,PR -2602:ffe8::,2602:ffe8:3ff:ffff:ffff:ffff:ffff:ffff,US -2602:ffe8:400::,2602:ffe8:4ff:ffff:ffff:ffff:ffff:ffff,AU -2602:ffe8:500::,2602:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:ffea::,2602:ffeb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffec::,2602:ffec:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffed::,2602:ffed:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffee::,2602:ffee:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffef::,2602:ffef:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff0::,2602:fff0:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff1::,2602:fff1:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff2::,2602:fff2:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff3::,2602:fff3:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff4::,2602:fff5:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff6::,2602:fff6:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff7::,2602:fff7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff8::,2602:fff8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fff9::,2602:fff9:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fffa::,2602:fffa:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fffb::,2602:fffb:fff:ffff:ffff:ffff:ffff:ffff,US -2602:fffc::,2602:fffc:ffff:ffff:ffff:ffff:ffff:ffff,US -2602:fffd::,2602:fffd:fff:ffff:ffff:ffff:ffff:ffff,CA -2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US -2603::,2603:100f:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1010::,2603:1010:2ff:ffff:ffff:ffff:ffff:ffff,AU -2603:1010:300::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1016::,2603:1016::4c:ffff:ffff:ffff:ffff,AU -2603:1016:0:4d::,2603:1016::ffff:ffff:ffff:ffff:ffff,US -2603:1016:1::,2603:1016:1:ffff:ffff:ffff:ffff:ffff,AU -2603:1016:2::,2603:1016:1f:ffff:ffff:ffff:ffff:ffff,US -2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU -2603:1016:30::,2603:1016:1ff:ffff:ffff:ffff:ffff:ffff,US -2603:1016:200::,2603:1016:200:37:ffff:ffff:ffff:ffff,AU -2603:1016:200:38::,2603:1016:200:ffff:ffff:ffff:ffff:ffff,US -2603:1016:201::,2603:1016:201:3f:ffff:ffff:ffff:ffff,AU -2603:1016:201:40::,2603:1016:227:ffff:ffff:ffff:ffff:ffff,US -2603:1016:228::,2603:1016:228:ffff:ffff:ffff:ffff:ffff,AU -2603:1016:229::,2603:1016:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1016:1000::,2603:1016:13ff:ffff:ffff:ffff:ffff:ffff,AU -2603:1016:1400::,2603:1018:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1019::,2603:1019:100:ffff:ffff:ffff:ffff:ffff,AU -2603:1019:101::,2603:1019:1ff:ffff:ffff:ffff:ffff:ffff,US -2603:1019:200::,2603:1019:2ff:ffff:ffff:ffff:ffff:ffff,AU -2603:1019:300::,2603:101f:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1020::,2603:1020:ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,AT -2603:1020:200::,2603:1020:2ff:ffff:ffff:ffff:ffff:ffff,NL -2603:1020:300::,2603:1020:4ff:ffff:ffff:ffff:ffff:ffff,GB -2603:1020:500::,2603:1020:5ff:ffff:ffff:ffff:ffff:ffff,FI -2603:1020:600::,2603:1020:7ff:ffff:ffff:ffff:ffff:ffff,GB -2603:1020:800::,2603:1020:9ff:ffff:ffff:ffff:ffff:ffff,FR -2603:1020:a00::,2603:1023:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1024::,2603:1024:ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1024:100::,2603:1025:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1026::,2603:1026:2:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:3::,2603:1026:3:ffff:ffff:ffff:ffff:ffff,FI -2603:1026:4::,2603:1026:6:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:7::,2603:1026:7:ffff:ffff:ffff:ffff:ffff,FI -2603:1026:8::,2603:1026:8:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:9::,2603:1026:1f:ffff:ffff:ffff:ffff:ffff,US -2603:1026:20::,2603:1026:22:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:23::,2603:1026:23:ffff:ffff:ffff:ffff:ffff,FI -2603:1026:24::,2603:1026:25:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:26::,2603:1026:27:ffff:ffff:ffff:ffff:ffff,US -2603:1026:28::,2603:1026:2a:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:2b::,2603:1026:2b:ffff:ffff:ffff:ffff:ffff,FI -2603:1026:2c::,2603:1026:2d:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:2e::,2603:1026:2e:ffff:ffff:ffff:ffff:ffff,US -2603:1026:2f::,2603:1026:2f:ffff:ffff:ffff:ffff:ffff,FI -2603:1026:30::,2603:1026:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:100::,2603:1026:10f:ffff:ffff:ffff:ffff:ffff,FR -2603:1026:110::,2603:1026:11f:ffff:ffff:ffff:ffff:ffff,US -2603:1026:120::,2603:1026:12f:ffff:ffff:ffff:ffff:ffff,FR -2603:1026:130::,2603:1026:1ff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:200::,2603:1026:2ff:ffff:ffff:ffff:ffff:ffff,NL -2603:1026:300::,2603:1026:3ff:ffff:ffff:ffff:ffff:ffff,AT -2603:1026:400::,2603:1026:6ff:ffff:ffff:ffff:ffff:ffff,GB -2603:1026:700::,2603:1026:70f:ffff:ffff:ffff:ffff:ffff,FR -2603:1026:710::,2603:1026:71f:ffff:ffff:ffff:ffff:ffff,US -2603:1026:720::,2603:1026:72f:ffff:ffff:ffff:ffff:ffff,FR -2603:1026:730::,2603:1026:7ff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:800::,2603:1026:8ff:ffff:ffff:ffff:ffff:ffff,GB -2603:1026:900::,2603:1026:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:1000::,2603:1026:10ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:1100::,2603:1026:12ff:ffff:ffff:ffff:ffff:ffff,FR -2603:1026:1300::,2603:1026:13ff:ffff:ffff:ffff:ffff:ffff,NL -2603:1026:1400::,2603:1027::1:ffff:ffff:ffff:ffff,US -2603:1027:0:2::,2603:1027::3:ffff:ffff:ffff:ffff,NL -2603:1027:0:4::,2603:1027::4:ffff:ffff:ffff:ffff,IE -2603:1027:0:5::,2603:1027::5:ffff:ffff:ffff:ffff,US -2603:1027:0:6::,2603:1027::6:ffff:ffff:ffff:ffff,NL -2603:1027:0:7::,2603:1027::8:ffff:ffff:ffff:ffff,IE -2603:1027:0:9::,2603:1027::a:ffff:ffff:ffff:ffff,NL -2603:1027:0:b::,2603:1027::42:ffff:ffff:ffff:ffff,US -2603:1027:0:43::,2603:1027::43:ffff:ffff:ffff:ffff,NL -2603:1027:0:44::,2603:1027::44:ffff:ffff:ffff:ffff,IE -2603:1027:0:45::,2603:1027::81:ffff:ffff:ffff:ffff,US -2603:1027:0:82::,2603:1027::83:ffff:ffff:ffff:ffff,NL -2603:1027:0:84::,2603:1027::84:ffff:ffff:ffff:ffff,IE -2603:1027:0:85::,2603:1027::85:ffff:ffff:ffff:ffff,US -2603:1027:0:86::,2603:1027::86:ffff:ffff:ffff:ffff,NL -2603:1027:0:87::,2603:1027::88:ffff:ffff:ffff:ffff,IE -2603:1027:0:89::,2603:1027::8a:ffff:ffff:ffff:ffff,NL -2603:1027:0:8b::,2603:1027::c2:ffff:ffff:ffff:ffff,US -2603:1027:0:c3::,2603:1027::c3:ffff:ffff:ffff:ffff,NL -2603:1027:0:c4::,2603:1027::c4:ffff:ffff:ffff:ffff,IE -2603:1027:0:c5::,2603:1029:2ff:ffff:ffff:ffff:ffff:ffff,US -2603:1029:300::,2603:1029:3ff:ffff:ffff:ffff:ffff:ffff,AT -2603:1029:400::,2603:1029:4ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1029:500::,2603:1029:5ff:ffff:ffff:ffff:ffff:ffff,US -2603:1029:600::,2603:1029:605:ffff:ffff:ffff:ffff:ffff,NL -2603:1029:606::,2603:1029:606:ffff:ffff:ffff:ffff:ffff,SE -2603:1029:607::,2603:1029:7ff:ffff:ffff:ffff:ffff:ffff,US -2603:1029:800::,2603:1029:802:ffff:ffff:ffff:ffff:ffff,GB -2603:1029:803::,2603:1029:aff:ffff:ffff:ffff:ffff:ffff,US -2603:1029:b00::,2603:1029:cff:ffff:ffff:ffff:ffff:ffff,GB -2603:1029:d00::,2603:1030:207:ffff:ffff:ffff:ffff:ffff,US -2603:1030:208::,2603:1030:20b:ffff:ffff:ffff:ffff:ffff,CA -2603:1030:20c::,2603:1030:eff:ffff:ffff:ffff:ffff:ffff,US -2603:1030:f00::,2603:1030:10ff:ffff:ffff:ffff:ffff:ffff,CA -2603:1030:1100::,2603:1036:aff:ffff:ffff:ffff:ffff:ffff,US -2603:1036:b00::,2603:1036:cff:ffff:ffff:ffff:ffff:ffff,CA -2603:1036:d00::,2603:1037::d:ffff:ffff:ffff:ffff,US -2603:1037:0:e::,2603:1037::f:ffff:ffff:ffff:ffff,CA -2603:1037:0:10::,2603:1037::8d:ffff:ffff:ffff:ffff,US -2603:1037:0:8e::,2603:1037::8f:ffff:ffff:ffff:ffff,CA -2603:1037:0:90::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US -2603:1039:e00::,2603:1039:eff:ffff:ffff:ffff:ffff:ffff,CA -2603:1039:f00::,2603:1039:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1039:1000::,2603:1039:10ff:ffff:ffff:ffff:ffff:ffff,CA -2603:1039:1100::,2603:1039:1100:ffff:ffff:ffff:ffff:ffff,PR -2603:1039:1101::,2603:103f:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1040::,2603:1040:ff:ffff:ffff:ffff:ffff:ffff,SG -2603:1040:100::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,MY -2603:1040:200::,2603:1040:2ff:ffff:ffff:ffff:ffff:ffff,HK -2603:1040:300::,2603:1040:3ff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:400::,2603:1040:4ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1040:500::,2603:1040:5ff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:600::,2603:1040:6ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1040:700::,2603:1040:7ff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:800::,2603:1040:8ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1040:900::,2603:1040:9ff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:a00::,2603:1040:aff:ffff:ffff:ffff:ffff:ffff,IN -2603:1040:b00::,2603:1040:bff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:c00::,2603:1040:cff:ffff:ffff:ffff:ffff:ffff,IN -2603:1040:d00::,2603:1040:dff:ffff:ffff:ffff:ffff:ffff,US -2603:1040:e00::,2603:1040:fff:ffff:ffff:ffff:ffff:ffff,KR -2603:1040:1000::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1046::,2603:1046:ff:ffff:ffff:ffff:ffff:ffff,SG -2603:1046:100::,2603:1046:1ff:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:200::,2603:1046:2ff:ffff:ffff:ffff:ffff:ffff,HK -2603:1046:300::,2603:1046:3ff:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:400::,2603:1046:4ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1046:500::,2603:1046:5ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1046:600::,2603:1046:6ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1046:700::,2603:1046:7ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1046:800::,2603:1046:800:ffff:ffff:ffff:ffff:ffff,MY -2603:1046:801::,2603:1046:801:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:802::,2603:1046:802:ffff:ffff:ffff:ffff:ffff,US -2603:1046:803::,2603:1046:803:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:804::,2603:1046:804:ffff:ffff:ffff:ffff:ffff,MY -2603:1046:805::,2603:1046:805:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:806::,2603:1046:81f:ffff:ffff:ffff:ffff:ffff,US -2603:1046:820::,2603:1046:820:ffff:ffff:ffff:ffff:ffff,MY -2603:1046:821::,2603:1046:821:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:822::,2603:1046:827:ffff:ffff:ffff:ffff:ffff,US -2603:1046:828::,2603:1046:828:ffff:ffff:ffff:ffff:ffff,MY -2603:1046:829::,2603:1046:829:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:82a::,2603:1046:82a:ffff:ffff:ffff:ffff:ffff,US -2603:1046:82b::,2603:1046:82b:ffff:ffff:ffff:ffff:ffff,KR -2603:1046:82c::,2603:1046:8ff:ffff:ffff:ffff:ffff:ffff,US -2603:1046:900::,2603:1046:9ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1046:a00::,2603:1046:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1047::,2603:1047::ffff:ffff:ffff:ffff,KR -2603:1047:0:1::,2603:1047::1:ffff:ffff:ffff:ffff,HK -2603:1047:0:2::,2603:1047::3:ffff:ffff:ffff:ffff,SG -2603:1047:0:4::,2603:1047::4:ffff:ffff:ffff:ffff,US -2603:1047:0:5::,2603:1047::5:ffff:ffff:ffff:ffff,HK -2603:1047:0:6::,2603:1047::6:ffff:ffff:ffff:ffff,SG -2603:1047:0:7::,2603:1047::7:ffff:ffff:ffff:ffff,KR -2603:1047:0:8::,2603:1047::9:ffff:ffff:ffff:ffff,JP -2603:1047:0:a::,2603:1047::b:ffff:ffff:ffff:ffff,AU -2603:1047:0:c::,2603:1047::d:ffff:ffff:ffff:ffff,IN -2603:1047:0:e::,2603:1047::e:ffff:ffff:ffff:ffff,HK -2603:1047:0:f::,2603:1047::f:ffff:ffff:ffff:ffff,SG -2603:1047:0:10::,2603:1047::3f:ffff:ffff:ffff:ffff,US -2603:1047:0:40::,2603:1047::40:ffff:ffff:ffff:ffff,JP -2603:1047:0:41::,2603:1047::41:ffff:ffff:ffff:ffff,SG -2603:1047:0:42::,2603:1047::42:ffff:ffff:ffff:ffff,JP -2603:1047:0:43::,2603:1047::43:ffff:ffff:ffff:ffff,HK -2603:1047:0:44::,2603:1047::44:ffff:ffff:ffff:ffff,AU -2603:1047:0:45::,2603:1047::45:ffff:ffff:ffff:ffff,IN -2603:1047:0:46::,2603:1047::46:ffff:ffff:ffff:ffff,US -2603:1047:0:47::,2603:1047::47:ffff:ffff:ffff:ffff,IN -2603:1047:0:48::,2603:1047::49:ffff:ffff:ffff:ffff,KR -2603:1047:0:4a::,2603:1047::7f:ffff:ffff:ffff:ffff,US -2603:1047:0:80::,2603:1047::80:ffff:ffff:ffff:ffff,KR -2603:1047:0:81::,2603:1047::81:ffff:ffff:ffff:ffff,HK -2603:1047:0:82::,2603:1047::83:ffff:ffff:ffff:ffff,SG -2603:1047:0:84::,2603:1047::84:ffff:ffff:ffff:ffff,US -2603:1047:0:85::,2603:1047::85:ffff:ffff:ffff:ffff,HK -2603:1047:0:86::,2603:1047::86:ffff:ffff:ffff:ffff,SG -2603:1047:0:87::,2603:1047::87:ffff:ffff:ffff:ffff,KR -2603:1047:0:88::,2603:1047::89:ffff:ffff:ffff:ffff,JP -2603:1047:0:8a::,2603:1047::8b:ffff:ffff:ffff:ffff,AU -2603:1047:0:8c::,2603:1047::8d:ffff:ffff:ffff:ffff,IN -2603:1047:0:8e::,2603:1047::8e:ffff:ffff:ffff:ffff,HK -2603:1047:0:8f::,2603:1047::8f:ffff:ffff:ffff:ffff,SG -2603:1047:0:90::,2603:1047::90:ffff:ffff:ffff:ffff,HK -2603:1047:0:91::,2603:1047::91:ffff:ffff:ffff:ffff,SG -2603:1047:0:92::,2603:1047::bf:ffff:ffff:ffff:ffff,US -2603:1047:0:c0::,2603:1047::c0:ffff:ffff:ffff:ffff,JP -2603:1047:0:c1::,2603:1047::c1:ffff:ffff:ffff:ffff,SG -2603:1047:0:c2::,2603:1047::c2:ffff:ffff:ffff:ffff,JP -2603:1047:0:c3::,2603:1047::c3:ffff:ffff:ffff:ffff,HK -2603:1047:0:c4::,2603:1047::c4:ffff:ffff:ffff:ffff,AU -2603:1047:0:c5::,2603:1047::c5:ffff:ffff:ffff:ffff,IN -2603:1047:0:c6::,2603:1047::c6:ffff:ffff:ffff:ffff,US -2603:1047:0:c7::,2603:1047::c7:ffff:ffff:ffff:ffff,IN -2603:1047:0:c8::,2603:1047::c9:ffff:ffff:ffff:ffff,KR -2603:1047:0:ca::,2603:1047:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1047:100::,2603:1047:1ff:ffff:ffff:ffff:ffff:ffff,SG -2603:1047:200::,2603:1047:2ff:ffff:ffff:ffff:ffff:ffff,HK -2603:1047:300::,2603:1047:4ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1047:500::,2603:1047:5ff:ffff:ffff:ffff:ffff:ffff,KR -2603:1047:600::,2603:1048:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1049::,2603:1049:3:ffff:ffff:ffff:ffff:ffff,SG -2603:1049:4::,2603:1049:1ff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:200::,2603:1049:202:ffff:ffff:ffff:ffff:ffff,HK -2603:1049:203::,2603:1049:2ff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:300::,2603:1049:300:ffff:ffff:ffff:ffff:ffff,KR -2603:1049:301::,2603:1049:3ff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:400::,2603:1049:4ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1049:500::,2603:1049:5ff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:600::,2603:1049:6ff:ffff:ffff:ffff:ffff:ffff,JP -2603:1049:700::,2603:1049:bff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:c00::,2603:1049:cff:ffff:ffff:ffff:ffff:ffff,IN -2603:1049:d00::,2603:1049:dff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:e00::,2603:1049:eff:ffff:ffff:ffff:ffff:ffff,IN -2603:1049:f00::,2603:1049:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1049:1000::,2603:1049:10ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1049:1100::,2603:1050::ffff:ffff:ffff:ffff:ffff,US -2603:1050:1::,2603:1050:3:ffff:ffff:ffff:ffff:ffff,BR -2603:1050:4::,2603:1050:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1050:100::,2603:1050:1ff:ffff:ffff:ffff:ffff:ffff,BR -2603:1050:200::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US -2603:1050:210::,2603:1050:21f:ffff:ffff:ffff:ffff:ffff,CL -2603:1050:220::,2603:1050:2ff:ffff:ffff:ffff:ffff:ffff,US -2603:1050:300::,2603:1050:3ff:ffff:ffff:ffff:ffff:ffff,CL -2603:1050:400::,2603:1055:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1056::,2603:1056:2:3f:ffff:ffff:ffff:ffff,BR -2603:1056:2:40::,2603:1056:1f:ffff:ffff:ffff:ffff:ffff,US -2603:1056:20::,2603:1056:20:ffff:ffff:ffff:ffff:ffff,BR -2603:1056:21::,2603:1056:27:ffff:ffff:ffff:ffff:ffff,US -2603:1056:28::,2603:1056:28:ffff:ffff:ffff:ffff:ffff,BR -2603:1056:29::,2603:1056:1ff:ffff:ffff:ffff:ffff:ffff,US -2603:1056:200::,2603:1056:20f:ffff:ffff:ffff:ffff:ffff,BR -2603:1056:210::,2603:1056:228:1:ffff:ffff:ffff:ffff,US -2603:1056:228:2::,2603:1056:228:4:ffff:ffff:ffff:ffff,BR -2603:1056:228:5::,2603:1056:3ff:ffff:ffff:ffff:ffff:ffff,US -2603:1056:400::,2603:1056:4ff:ffff:ffff:ffff:ffff:ffff,BR -2603:1056:500::,2603:1056:5ff:ffff:ffff:ffff:ffff:ffff,US -2603:1056:600::,2603:1056:6ff:ffff:ffff:ffff:ffff:ffff,CL -2603:1056:700::,2603:1057:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1058::,2603:1058:1f:ffff:ffff:ffff:ffff:ffff,CL -2603:1058:20::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:1059::,2603:1059::ffff:ffff:ffff:ffff:ffff,BR -2603:1059:1::,2603:1059:1:ffff:ffff:ffff:ffff:ffff,CL -2603:1059:2::,2603:1059:f:ffff:ffff:ffff:ffff:ffff,US -2603:1059:10::,2603:1059:1f:ffff:ffff:ffff:ffff:ffff,CL -2603:1059:20::,2603:1059:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1059:100::,2603:1059:100:ffff:ffff:ffff:ffff:ffff,BR -2603:1059:101::,2603:1059:10f:ffff:ffff:ffff:ffff:ffff,US -2603:1059:110::,2603:1059:11f:ffff:ffff:ffff:ffff:ffff,BR -2603:1059:120::,2603:10ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:2000::,2603:30ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:4000::,2603:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:5000::,2603:50ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:6000::,2603:60ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:7000::,2603:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:8000::,2603:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:9000::,2603:90ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2603:a000::,2603:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US -2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:50::,2604:50:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:90::,2604:90:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:100::,2604:100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:140::,2604:140:ffff:ffff:ffff:ffff:ffff:ffff,BM -2604:180::,2604:180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1c0::,2604:1c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:200::,2604:200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:240::,2604:240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:280::,2604:280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2c0::,2604:2c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:300::,2604:300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:340::,2604:340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:380::,2604:380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3c0::,2604:3c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:400::,2604:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:440::,2604:440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:480::,2604:480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4c0::,2604:4c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:500::,2604:500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:540::,2604:540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:580::,2604:580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5c0::,2604:5c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:600::,2604:600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:640::,2604:640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:680::,2604:680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6c0::,2604:6c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:700::,2604:700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:740::,2604:740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:780::,2604:780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7c0::,2604:7c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:800::,2604:800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:840::,2604:840:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:880::,2604:880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8c0::,2604:8c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:900::,2604:900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:940::,2604:940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:980::,2604:980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9c0::,2604:9c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a00::,2604:a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a40::,2604:a40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a80::,2604:a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ac0::,2604:ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b40::,2604:b40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b80::,2604:b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bc0::,2604:bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c00::,2604:c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c40::,2604:c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c80::,2604:c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cc0::,2604:cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d00::,2604:d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d40::,2604:d40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:d80::,2604:d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:dc0::,2604:dc0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:e00::,2604:e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e40::,2604:e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e80::,2604:e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:ec0::,2604:ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f00::,2604:f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f40::,2604:f40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f80::,2604:f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fc0::,2604:fc0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1040::,2604:1040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1080::,2604:1080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:10c0::,2604:10c0:ffff:ffff:ffff:ffff:ffff:ffff,VG -2604:1100::,2604:1100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1140::,2604:1140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1180::,2604:1180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:11c0::,2604:11c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1200::,2604:1200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1240::,2604:1240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1280::,2604:1280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:12c0::,2604:12c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1300::,2604:1300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1340::,2604:1340:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1380::,2604:1380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:13c0::,2604:13c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1400::,2604:1400:ffff:ffff:ffff:ffff:ffff:ffff,PR -2604:1440::,2604:1440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1480::,2604:1480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:14c0::,2604:14c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1500::,2604:1500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1540::,2604:1540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1580::,2604:1580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:15c0::,2604:15c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1600::,2604:1600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1640::,2604:1640:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1680::,2604:1680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:16c0::,2604:16c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1700::,2604:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1740::,2604:1740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1780::,2604:1780:ffff:ffff:ffff:ffff:ffff:ffff,KY -2604:17c0::,2604:17c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1800::,2604:1800:ffff:ffff:ffff:ffff:ffff:ffff,GP -2604:1840::,2604:1840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1880::,2604:1880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:18c0::,2604:18c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1900::,2604:1900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1940::,2604:1940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1980::,2604:1980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:19c0::,2604:19c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1a00::,2604:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1a40::,2604:1a40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1a80::,2604:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1ac0::,2604:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1b00::,2604:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1b40::,2604:1b40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1b80::,2604:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1bc0::,2604:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1c00::,2604:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1c40::,2604:1c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1c80::,2604:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1cc0::,2604:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,PR -2604:1d00::,2604:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1d40::,2604:1d40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1d80::,2604:1d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1dc0::,2604:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1e00::,2604:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1e40::,2604:1e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1ec0::,2604:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1f40::,2604:1f40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:1fc0::,2604:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2000::,2604:2000:9143:1fff:ffff:ffff:ffff:ffff,US -2604:2000:9143:2000::,2604:2000:9143:2fff:ffff:ffff:ffff:ffff,NL -2604:2000:9143:3000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2040::,2604:2040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:20c0::,2604:20c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2140::,2604:2140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:21c0::,2604:21c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2240::,2604:2240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:22c0::,2604:22c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2300::,2604:2300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2340::,2604:2340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2380::,2604:2380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:23c0::,2604:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:2400::,2604:2400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2440::,2604:2440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2480::,2604:2480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:24c0::,2604:24c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2500::,2604:2500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2540::,2604:2540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2580::,2604:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:25c0::,2604:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CW -2604:2600::,2604:2600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2640::,2604:2640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2680::,2604:2680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:26c0::,2604:26c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2700::,2604:2700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2740::,2604:2740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2780::,2604:2780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:27c0::,2604:27c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2800::,2604:2800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2840::,2604:2840:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:2880::,2604:2880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:28c0::,2604:28c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2900::,2604:2900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2940::,2604:2940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2980::,2604:2980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:29c0::,2604:29c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2a00::,2604:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2a40::,2604:2a40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2a80::,2604:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2ac0::,2604:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2b00::,2604:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2b40::,2604:2b40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2b80::,2604:2b80:fff:ffff:ffff:ffff:ffff:ffff,CA -2604:2bc0::,2604:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2c00::,2604:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2c40::,2604:2c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2c80::,2604:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2cc0::,2604:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2d00::,2604:2d00:fff:ffff:ffff:ffff:ffff:ffff,US -2604:2d40::,2604:2d40:ffff:ffff:ffff:ffff:ffff:ffff,PR -2604:2d80::,2604:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2dc0::,2604:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2e00::,2604:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2e40::,2604:2e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2e80::,2604:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2ec0::,2604:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2f00::,2604:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2f40::,2604:2f40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:2f80::,2604:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:2fc0::,2604:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3000::,2604:3000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3040::,2604:3040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3080::,2604:3080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:30c0::,2604:30c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3100::,2604:3100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3140::,2604:3140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3180::,2604:3180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:31c0::,2604:31c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3200::,2604:3200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3240::,2604:3240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3280::,2604:3280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:32c0::,2604:32c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3300::,2604:3300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3340::,2604:3340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3380::,2604:3380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:33c0::,2604:33c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3400::,2604:3400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3440::,2604:3440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3480::,2604:3480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:34c0::,2604:34c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3500::,2604:3500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3540::,2604:3540::11b:ffff:ffff:ffff:ffff,US -2604:3540:0:11c::,2604:3540::125:ffff:ffff:ffff:ffff,CA -2604:3540:0:126::,2604:3540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3580::,2604:3580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:35c0::,2604:35c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3600::,2604:3600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3640::,2604:3640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3680::,2604:3680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:36c0::,2604:36c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3700::,2604:3700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3740::,2604:3740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3780::,2604:3780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:37c0::,2604:37c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3800::,2604:3800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3840::,2604:3840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3880::,2604:3880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:38c0::,2604:38c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3940::,2604:3940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:39c0::,2604:39c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3a00::,2604:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3a40::,2604:3a40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3a80::,2604:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:3ac0::,2604:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3b00::,2604:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:3b40::,2604:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:3b80::,2604:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3bc0::,2604:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3c00::,2604:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3c40::,2604:3c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3c80::,2604:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3cc0::,2604:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3d00::,2604:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:3d40::,2604:3d40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3d80::,2604:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3dc0::,2604:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3e00::,2604:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3e40::,2604:3e40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:3e80::,2604:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3ec0::,2604:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3f00::,2604:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3f40::,2604:3f40:fff:ffff:ffff:ffff:ffff:ffff,CA -2604:3f80::,2604:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3fc0::,2604:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4000::,2604:4000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4040::,2604:4040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4080::,2604:4080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:40c0::,2604:40c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4100::,2604:4100:fff:ffff:ffff:ffff:ffff:ffff,US -2604:4140::,2604:4140:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4180::,2604:4180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:41c0::,2604:41c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4200::,2604:4200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4240::,2604:4240:fff:ffff:ffff:ffff:ffff:ffff,CA -2604:4280::,2604:4280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4300::,2604:4300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4340::,2604:4340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:43c0::,2604:43c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4400::,2604:4400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4440::,2604:4440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4480::,2604:4480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:44c0::,2604:44c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4500::,2604:4500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4540::,2604:4540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4580::,2604:4580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:45c0::,2604:45c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4600::,2604:460f:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4640::,2604:4640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4680::,2604:4680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:46c0::,2604:46c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4700::,2604:4700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4740::,2604:4740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4780::,2604:4780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:47c0::,2604:47c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4800::,2604:4800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4840::,2604:4840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4880::,2604:4880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:48c0::,2604:48c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4900::,2604:4900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4940::,2604:4940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4980::,2604:4980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:49c0::,2604:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GU -2604:4a00::,2604:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4a40::,2604:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4a80::,2604:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4ac0::,2604:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4b00::,2604:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4b40::,2604:4b40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4b80::,2604:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4bc0::,2604:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4c00::,2604:4c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4c40::,2604:4c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4c80::,2604:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4cc0::,2604:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4d00::,2604:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4d40::,2604:4d40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4d80::,2604:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4dc0::,2604:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4e00::,2604:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4e40::,2604:4e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4e80::,2604:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4ec0::,2604:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4f00::,2604:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4f40::,2604:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:4f80::,2604:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:4fc0::,2604:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5000::,2604:5000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5040::,2604:5040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5080::,2604:5080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:50c0::,2604:50c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5100::,2604:5100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5140::,2604:5140:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:51c0::,2604:51c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5200::,2604:5200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5240::,2604:5240:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:5280::,2604:5280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:52c0::,2604:52c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5300::,2604:5300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5340::,2604:5340:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:5380::,2604:5380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:53c0::,2604:53c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5400::,2604:5400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5440::,2604:5440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5480::,2604:5480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:54c0::,2604:54c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5500::,2604:5500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5540::,2604:5540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5580::,2604:5580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:55c0::,2604:55c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5600::,2604:5600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5640::,2604:5640:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:5680::,2604:5680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:56c0::,2604:56c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5700::,2604:5700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5740::,2604:5740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:57c0::,2604:57c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5800::,2604:5800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5840::,2604:5840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5880::,2604:5880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:58c0::,2604:58c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5940::,2604:5940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:59c0::,2604:59c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5a40::,2604:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:5a80::,2604:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5ac0::,2604:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5b00::,2604:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5b40::,2604:5b40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5b80::,2604:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5bc0::,2604:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5c00::,2604:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5c40::,2604:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:5c80::,2604:5c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5cc0::,2604:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5d00::,2604:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5d40::,2604:5d40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5dc0::,2604:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5e00::,2604:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5e40::,2604:5e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5e80::,2604:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5ec0::,2604:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5f00::,2604:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5f40::,2604:5f40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5f80::,2604:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:5fc0::,2604:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6000::,2604:6000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6040::,2604:6040:fff:ffff:ffff:ffff:ffff:ffff,US -2604:6080::,2604:6080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:60c0::,2604:60c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6100::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6140::,2604:6140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6180::,2604:6180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:61c0::,2604:61c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6200::,2604:6200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6240::,2604:6240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6280::,2604:6280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:62c0::,2604:62c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6300::,2604:6300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6340::,2604:6340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6380::,2604:6380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:63c0::,2604:63c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6400::,2604:6400:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6440::,2604:6440:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6480::,2604:6480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:64c0::,2604:64c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6500::,2604:6500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6540::,2604:6540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6580::,2604:6580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:65c0::,2604:65c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6600::,2604:6600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6640::,2604:6640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6680::,2604:6680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:66c0::,2604:66c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6700::,2604:6700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6740::,2604:6740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6780::,2604:6780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:67c0::,2604:67c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6800::,2604:6800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6840::,2604:6840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6880::,2604:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:68c0::,2604:68c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6900::,2604:6900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6940::,2604:6940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6980::,2604:6980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:69c0::,2604:69c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6a00::,2604:6a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6a40::,2604:6a40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6a80::,2604:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6ac0::,2604:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6b00::,2604:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6b40::,2604:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6b80::,2604:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6bc0::,2604:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6c00::,2604:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6c40::,2604:6c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6c80::,2604:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6cc0::,2604:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6d00::,2604:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6d40::,2604:6d40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6d80::,2604:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6dc0::,2604:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6e00::,2604:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6e40::,2604:6e40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:6e80::,2604:6e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6ec0::,2604:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6f00::,2604:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6f40::,2604:6f40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6f80::,2604:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6fc0::,2604:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7000::,2604:7000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7040::,2604:7040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7080::,2604:7080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:70c0::,2604:70c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7100::,2604:7100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7140::,2604:7140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7180::,2604:7180:fff:ffff:ffff:ffff:ffff:ffff,US -2604:71c0::,2604:71c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7200::,2604:7200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7240::,2604:7240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7280::,2604:7280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:72c0::,2604:72c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7300::,2604:7300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7340::,2604:7340:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:73c0::,2604:73c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7400::,2604:7400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7440::,2604:7440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7480::,2604:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:74c0::,2604:74c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7500::,2604:7500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7540::,2604:7540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7580::,2604:7580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:75c0::,2604:75c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7600::,2604:7600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7640::,2604:7640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7680::,2604:7680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:76c0::,2604:76c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7700::,2604:7700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7740::,2604:7740:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7780::,2604:7780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:77c0::,2604:77c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7800::,2604:7800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7840::,2604:7840:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7880::,2604:7880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:78c0::,2604:78c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7900::,2604:7900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7940::,2604:7940:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7980::,2604:7980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:79c0::,2604:79c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7a00::,2604:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7a40::,2604:7a40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7a80::,2604:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7ac0::,2604:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7b00::,2604:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7b40::,2604:7b40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7b80::,2604:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7bc0::,2604:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7c00::,2604:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7c40::,2604:7c40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7c80::,2604:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7cc0::,2604:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7d40::,2604:7d40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7d80::,2604:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7e00::,2604:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7e40::,2604:7e40:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7e80::,2604:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7ec0::,2604:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7f00::,2604:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7f40::,2604:7f40:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:7f80::,2604:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:7fc0::,2604:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8000::,2604:8000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8040::,2604:8040:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8080::,2604:8080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:80c0::,2604:80c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8100::,2604:8100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8140::,2604:8140:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8180::,2604:8181:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:81c0::,2604:81c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8200::,2604:8200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8240::,2604:8240:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8280::,2604:8280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:82c0::,2604:82c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8300::,2604:8300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8340::,2604:8340:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8380::,2604:8380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:83c0::,2604:83c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8400::,2604:8400:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8440::,2604:8440:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8480::,2604:8480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:84c0::,2604:84c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8500::,2604:8500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8540::,2604:8540:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8580::,2604:8580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:85c0::,2604:85c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8600::,2604:8600:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8640::,2604:8640:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:86c0::,2604:86c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8700::,2604:8700:fff:ffff:ffff:ffff:ffff:ffff,US -2604:8780::,2604:8780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8800::,2604:8800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8880::,2604:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8900::,2604:8900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8980::,2604:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8a00::,2604:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8a80::,2604:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8b00::,2604:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8b80::,2604:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8c00::,2604:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8c80::,2604:8c80:ffff:ffff:ffff:ffff:ffff:ffff,DM -2604:8d00::,2604:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8d80::,2604:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8e80::,2604:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8f00::,2604:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8f80::,2604:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9000::,2604:9000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9080::,2604:9080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9100::,2604:9100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9180::,2604:9180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9200::,2604:9200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9280::,2604:9280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9300::,2604:9300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9380::,2604:9380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:9480::,2604:9480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9500::,2604:9500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9580::,2604:9580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9600::,2604:9600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9700::,2604:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9780::,2604:9780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9800::,2604:9800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9880::,2604:9880:fff:ffff:ffff:ffff:ffff:ffff,CA -2604:9900::,2604:9900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9980::,2604:9980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9a00::,2604:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9a80::,2604:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9b00::,2604:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9b80::,2604:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9c00::,2604:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9c80::,2604:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9d00::,2604:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9d80::,2604:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9e00::,2604:9e0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9e80::,2604:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:9f00::,2604:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9f80::,2604:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a000::,2604:a000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a080::,2604:a080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a100::,2604:a100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a180::,2604:a180:ffff:ffff:ffff:ffff:ffff:ffff,BB -2604:a200::,2604:a200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a280::,2604:a280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:a300::,2604:a300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a400::,2604:a400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a480::,2604:a480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a580::,2604:a580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a600::,2604:a600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a680::,2604:a680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a700::,2604:a700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a780::,2604:a780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a800::,2604:a800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a880::,2604:a880:cac:ffff:ffff:ffff:ffff:ffff,US -2604:a880:cad::,2604:a880:cad:7fff:ffff:ffff:ffff:ffff,CA -2604:a880:cad:8000::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a900::,2604:a900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:a980::,2604:a980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:aa00::,2604:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:aa80::,2604:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ab00::,2604:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ab80::,2604:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ac00::,2604:ac00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ac80::,2604:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ad00::,2604:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ad80::,2604:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ae00::,2604:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ae80::,2604:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:af00::,2604:af00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:af80::,2604:af80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b000::,2604:b000:ffff:ffff:ffff:ffff:ffff:ffff,PR -2604:b080::,2604:b080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b100::,2604:b100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b180::,2604:b180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b200::,2604:b200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b280::,2604:b280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:b300::,2604:b300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b380::,2604:b380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b400::,2604:b400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b480::,2604:b480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b500::,2604:b500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b580::,2604:b580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b600::,2604:b600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b680::,2604:b680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b700::,2604:b700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b780::,2604:b780:fff:ffff:ffff:ffff:ffff:ffff,US -2604:b800::,2604:b800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b880::,2604:b880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b900::,2604:b900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:b980::,2604:b980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:ba00::,2604:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ba80::,2604:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bb00::,2604:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bb80::,2604:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bc00::,2604:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bc80::,2604:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bd00::,2604:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:be00::,2604:be00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:be80::,2604:be80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bf00::,2604:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:bf80::,2604:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c000::,2604:c000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c080::,2604:c080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c100::,2604:c100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c180::,2604:c180:ffff:ffff:ffff:ffff:ffff:ffff,VI -2604:c200::,2604:c200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c300::,2604:c300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c380::,2604:c380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c400::,2604:c400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c500::,2604:c500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c580::,2604:c580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c600::,2604:c600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c680::,2604:c680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c700::,2604:c700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c780::,2604:c780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c800::,2604:c800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c880::,2604:c880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c900::,2604:c900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:c980::,2604:c980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ca00::,2604:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ca80::,2604:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cb00::,2604:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cb80::,2604:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cc00::,2604:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cc80::,2604:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cd00::,2604:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cd80::,2604:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ce00::,2604:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ce80::,2604:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cf00::,2604:cf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:cf80::,2604:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d000::,2604:d000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d080::,2604:d080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d100::,2604:d100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d180::,2604:d180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d200::,2604:d200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d280::,2604:d280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d300::,2604:d300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d380::,2604:d380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d400::,2604:d400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d480::,2604:d480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d500::,2604:d500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d580::,2604:d580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d600::,2604:d600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d680::,2604:d680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d700::,2604:d700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d780::,2604:d780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:d800::,2604:d801:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d900::,2604:d900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d980::,2604:d980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:da00::,2604:da00:fff:ffff:ffff:ffff:ffff:ffff,US -2604:da80::,2604:da80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:db00::,2604:db00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:dc00::,2604:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:dc80::,2604:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:dd00::,2604:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:dd80::,2604:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:de00::,2604:de00:fff:ffff:ffff:ffff:ffff:ffff,US -2604:de80::,2604:de80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:df00::,2604:df00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e000::,2604:e000:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e080::,2604:e080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e100::,2604:e100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:e180::,2604:e180:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e200::,2604:e200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e280::,2604:e280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e300::,2604:e300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e380::,2604:e380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e400::,2604:e400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e480::,2604:e480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e500::,2604:e500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e580::,2604:e580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e600::,2604:e600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e680::,2604:e680:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e700::,2604:e700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e780::,2604:e780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e800::,2604:e800:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e880::,2604:e880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e900::,2604:e900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:e980::,2604:e980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ea00::,2604:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ea80::,2604:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:eb00::,2604:eb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:eb80::,2604:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ec80::,2604:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ed80::,2604:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ee00::,2604:ee00:fff:ffff:ffff:ffff:ffff:ffff,US -2604:ee80::,2604:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ef00::,2604:ef00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:f000::,2604:f000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:f080::,2604:f080:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f100::,2604:f100:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f180::,2604:f180:ffff:ffff:ffff:ffff:ffff:ffff,PR -2604:f200::,2604:f200:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f280::,2604:f280:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f300::,2604:f300:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f380::,2604:f380:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f400::,2604:f400:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f480::,2604:f480:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f500::,2604:f500:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f580::,2604:f580:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f600::,2604:f600:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f680::,2604:f680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:f700::,2604:f700:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f800::,2604:f800:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:f880::,2604:f880:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f900::,2604:f900:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:f980::,2604:f980:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fa00::,2604:fa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fa80::,2604:fa80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:fb00::,2604:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fb80::,2604:fb80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:fc00::,2604:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fc80::,2604:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fd00::,2604:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fd80::,2604:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fe00::,2604:fe00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:fe80::,2604:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ff00::,2604:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:ff80::,2604:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605::,2605::ffff:ffff:ffff:ffff:ffff:ffff,US -2605:80::,2605:80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:100::,2605:100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:180::,2605:180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:200::,2605:200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:280::,2605:280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:300::,2605:300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:380::,2605:380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:400::,2605:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:480::,2605:480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:500::,2605:500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:600::,2605:600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:680::,2605:680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:700::,2605:700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:780::,2605:780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:800::,2605:800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:880::,2605:880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:900::,2605:900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:980::,2605:980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a00::,2605:a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a80::,2605:a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b80::,2605:b81:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c00::,2605:c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:d00::,2605:d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d80::,2605:d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e00::,2605:e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e80::,2605:e80:ffff:ffff:ffff:ffff:ffff:ffff,BM -2605:f00::,2605:f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f80::,2605:f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1000::,2605:1000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1080::,2605:1080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1100::,2605:1100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1180::,2605:1180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1280::,2605:1280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1300::,2605:1300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1380::,2605:1380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1400::,2605:1400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1480::,2605:1480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1500::,2605:1500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1580::,2605:1580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1600::,2605:1600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1680::,2605:1680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1700::,2605:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1780::,2605:1780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1800::,2605:1800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1880::,2605:1880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1900::,2605:1900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1980::,2605:1980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1a00::,2605:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1a80::,2605:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1b00::,2605:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1b80::,2605:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1c00::,2605:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1c80::,2605:1c80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:1d00::,2605:1d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1e00::,2605:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1e80::,2605:1e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1f00::,2605:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1f80::,2605:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2000::,2605:2000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2080::,2605:2080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2100::,2605:2100:fff:ffff:ffff:ffff:ffff:ffff,CA -2605:2180::,2605:2180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2200::,2605:2200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2280::,2605:2280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2300::,2605:2300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2380::,2605:2380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2400::,2605:2400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2480::,2605:2480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2500::,2605:2500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2580::,2605:2580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2600::,2605:2600:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:2680::,2605:2680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2700::,2605:2700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2800::,2605:2800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2880::,2605:2880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2900::,2605:2900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:2980::,2605:2980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2a00::,2605:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:2a80::,2605:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2b00::,2605:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2b80::,2605:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2c00::,2605:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2e00::,2605:2e00:fff:ffff:ffff:ffff:ffff:ffff,CA -2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3000::,2605:3000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3080::,2605:3080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3100::,2605:3100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3180::,2605:3180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3200::,2605:3200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3280::,2605:3280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3300::,2605:3300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3380::,2605:3380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3400::,2605:3400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3480::,2605:3480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3500::,2605:3500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3580::,2605:3580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3600::,2605:3600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3680::,2605:3680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3700::,2605:3700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3780::,2605:3780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3800::,2605:3800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3880::,2605:3880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:3900::,2605:3900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3980::,2605:3980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3a00::,2605:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3b00::,2605:3b00:fff:ffff:ffff:ffff:ffff:ffff,US -2605:3b80::,2605:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3c00::,2605:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3c80::,2605:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3d00::,2605:3d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3d80::,2605:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3e00::,2605:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3e80::,2605:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:3f00::,2605:3f00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:3f80::,2605:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4000::,2605:4000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4080::,2605:4080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4100::,2605:4100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4180::,2605:418f:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4200::,2605:4200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4280::,2605:4280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4300::,2605:4300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4380::,2605:4380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4400::,2605:4400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4480::,2605:4480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4500::,2605:4500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4580::,2605:4580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4600::,2605:4600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4680::,2605:4680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4700::,2605:4700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4780::,2605:4780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4800::,2605:4800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4900::,2605:4900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4980::,2605:4980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4a00::,2605:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4a80::,2605:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4b00::,2605:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4b80::,2605:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4c00::,2605:4c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4c80::,2605:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4d00::,2605:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4d80::,2605:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4e00::,2605:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4f00::,2605:4f00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:4f80::,2605:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5000::,2605:5000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5080::,2605:5080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:5100::,2605:5100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5180::,2605:5180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5200::,2605:5200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5280::,2605:5280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5300::,2605:5300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5380::,2605:5380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5400::,2605:5400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5480::,2605:5480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5580::,2605:5580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5600::,2605:5600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5680::,2605:5680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5700::,2605:5700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5800::,2605:5800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5880::,2605:5880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5900::,2605:5900:ffff:ffff:ffff:ffff:ffff:ffff,JM -2605:5980::,2605:5980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5a00::,2605:5a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5a80::,2605:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5b00::,2605:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5c00::,2605:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5d00::,2605:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5d80::,2605:5d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5e00::,2605:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5f00::,2605:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5f80::,2605:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6000::,2605:600f:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6080::,2605:6080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6100::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6180::,2605:6180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6200::,2605:6200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6280::,2605:6280:ffff:ffff:ffff:ffff:ffff:ffff,AI -2605:6300::,2605:6300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6380::,2605:6380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6400::,2605:6400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6480::,2605:6480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6500::,2605:6500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6580::,2605:6580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6600::,2605:6600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6680::,2605:6680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6700::,2605:6700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6780::,2605:6780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6800::,2605:6800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6880::,2605:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:6900::,2605:6900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6a00::,2605:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:6a80::,2605:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6b00::,2605:6b00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:6b80::,2605:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6c00::,2605:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6c80::,2605:6c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6d00::,2605:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6d80::,2605:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6e00::,2605:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6f00::,2605:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:6f80::,2605:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7000::,2605:7000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7080::,2605:7080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7100::,2605:7100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7180::,2605:7180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7200::,2605:7200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:7280::,2605:7280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7300::,2605:7301:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7380::,2605:7380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7400::,2605:7400:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:7480::,2605:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:7500::,2605:7500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7580::,2605:7580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7600::,2605:7600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7680::,2605:7680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7700::,2605:7700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7780::,2605:7780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7880::,2605:7880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7900::,2605:7900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7980::,2605:7980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7a00::,2605:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7b00::,2605:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7b80::,2605:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7c00::,2605:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:7c80::,2605:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7d00::,2605:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7d80::,2605:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7e00::,2605:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7e80::,2605:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:7f80::,2605:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8000::,2605:8000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8080::,2605:8080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8100::,2605:8100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:8200::,2605:8200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8280::,2605:8280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8300::,2605:8300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8380::,2605:8380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8400::,2605:8400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8480::,2605:8480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8500::,2605:8500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8580::,2605:8580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8600::,2605:8600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8680::,2605:868f:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8700::,2605:8700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8780::,2605:8780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:8800::,2605:8800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8880::,2605:8880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8900::,2605:8900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8980::,2605:8980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8a00::,2605:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8a80::,2605:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8b00::,2605:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8b80::,2605:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8c00::,2605:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8c80::,2605:8c80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:8d00::,2605:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8d80::,2605:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:8e00::,2605:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8f00::,2605:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8f80::,2605:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9000::,2605:9000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:9080::,2605:9080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9100::,2605:9100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9180::,2605:9180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9200::,2605:9200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9280::,2605:9280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9300::,2605:9300:2:32::9,CA -2605:9300:2:32::a,2605:9300:2:32::a,US -2605:9300:2:32::b,2605:9300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:9380::,2605:9380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9400::,2605:9400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9480::,2605:9480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9500::,2605:9500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9580::,2605:9580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9600::,2605:9600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9680::,2605:9680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:9700::,2605:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9780::,2605:9780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9800::,2605:9800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9880::,2605:9880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9900::,2605:9900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9980::,2605:9980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9a00::,2605:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9a80::,2605:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9b00::,2605:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9b80::,2605:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9c00::,2605:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9c80::,2605:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9d00::,2605:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9d80::,2605:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9e00::,2605:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9e80::,2605:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9f00::,2605:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:9f80::,2605:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a000::,2605:a000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a080::,2605:a080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a100::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a180::,2605:a180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a200::,2605:a200:ffff:ffff:ffff:ffff:ffff:ffff,JM -2605:a280::,2605:a280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a300::,2605:a300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a380::,2605:a380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a400::,2605:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a480::,2605:a480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a500::,2605:a500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a580::,2605:a580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a600::,2605:a601:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a680::,2605:a680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:a700::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a780::,2605:a780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a800::,2605:a800:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:a880::,2605:a880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a900::,2605:a900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a980::,2605:a980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:aa00::,2605:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:aa80::,2605:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ab00::,2605:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:ab80::,2605:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ac00::,2605:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:ac80::,2605:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ad00::,2605:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ad80::,2605:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ae00::,2605:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ae80::,2605:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:af00::,2605:af00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:af80::,2605:af80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b000::,2605:b000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b080::,2605:b080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b100::,2605:b100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b500::,2605:b500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b580::,2605:b580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b600::,2605:b600:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b680::,2605:b680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b700::,2605:b700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b780::,2605:b780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b800::,2605:b800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b880::,2605:b880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b900::,2605:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:b980::,2605:b980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ba00::,2605:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PR -2605:ba80::,2605:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:bb00::,2605:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bb80::,2605:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bc00::,2605:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bc80::,2605:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bd00::,2605:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bd80::,2605:bd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:be00::,2605:be00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:be80::,2605:be80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bf00::,2605:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:bf80::,2605:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c000::,2605:c000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c080::,2605:c080:ffff:ffff:ffff:ffff:ffff:ffff,GD -2605:c100::,2605:c100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c180::,2605:c180:fff:ffff:ffff:ffff:ffff:ffff,US -2605:c200::,2605:c200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c280::,2605:c280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c300::,2605:c300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c380::,2605:c380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c400::,2605:c400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c480::,2605:c480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c500::,2605:c500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:c580::,2605:c580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:c600::,2605:c600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c680::,2605:c680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c700::,2605:c700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:c780::,2605:c780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c800::,2605:c800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c880::,2605:c880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:c900::,2605:c900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ca00::,2605:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ca80::,2605:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cb00::,2605:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cb80::,2605:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cc00::,2605:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cc80::,2605:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cd00::,2605:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cd80::,2605:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ce00::,2605:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ce80::,2605:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:cf00::,2605:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:cf80::,2605:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:d000::,2605:d000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d080::,2605:d080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d100::,2605:d100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d180::,2605:d180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d280::,2605:d280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d300::,2605:d300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d380::,2605:d380:fff:ffff:ffff:ffff:ffff:ffff,US -2605:d480::,2605:d480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d500::,2605:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:d580::,2605:d580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d600::,2605:d600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d680::,2605:d680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d700::,2605:d700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d780::,2605:d780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d800::,2605:d800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d880::,2605:d880:ffff:ffff:ffff:ffff:ffff:ffff,DM -2605:d900::,2605:d900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:d980::,2605:d980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:da00::,2605:da00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:da80::,2605:da80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:db00::,2605:db00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:db80::,2605:db80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:dc00::,2605:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:dc80::,2605:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:dd00::,2605:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:dd80::,2605:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:de00::,2605:de00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:de80::,2605:de80:ffff:ffff:ffff:ffff:ffff:ffff,VI -2605:df00::,2605:df00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:df80::,2605:df80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e000::,2605:e000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e180::,2605:e180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e380::,2605:e380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e400::,2605:e400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e480::,2605:e480:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e500::,2605:e500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e580::,2605:e580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e600::,2605:e600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e680::,2605:e680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:e700::,2605:e700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e780::,2605:e780:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e900::,2605:e900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ea00::,2605:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ea80::,2605:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:eb00::,2605:eb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:eb80::,2605:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ec00::,2605:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ec80::,2605:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ed00::,2605:ed00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ed80::,2605:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ee00::,2605:ee00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ee80::,2605:ee80:fff:ffff:ffff:ffff:ffff:ffff,US -2605:ef00::,2605:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ef80::,2605:ef80:13f:ffff:ffff:ffff:ffff:ffff,US -2605:ef80:140::,2605:ef80:147:ffff:ffff:ffff:ffff:ffff,CA -2605:ef80:148::,2605:ef80:14f:ffff:ffff:ffff:ffff:ffff,MX -2605:ef80:150::,2605:ef80:157:ffff:ffff:ffff:ffff:ffff,PR -2605:ef80:158::,2605:ef80:15f:ffff:ffff:ffff:ffff:ffff,VI -2605:ef80:160::,2605:ef80:167:ffff:ffff:ffff:ffff:ffff,UM -2605:ef80:168::,2605:ef80:2ff:ffff:ffff:ffff:ffff:ffff,US -2605:ef80:300::,2605:ef80:31f:ffff:ffff:ffff:ffff:ffff,CA -2605:ef80:320::,2605:ef80:33f:ffff:ffff:ffff:ffff:ffff,MX -2605:ef80:340::,2605:ef80:35f:ffff:ffff:ffff:ffff:ffff,PR -2605:ef80:360::,2605:ef80:37f:ffff:ffff:ffff:ffff:ffff,VI -2605:ef80:380::,2605:ef80:39f:ffff:ffff:ffff:ffff:ffff,UM -2605:ef80:3a0::,2605:ef80:5ff:ffff:ffff:ffff:ffff:ffff,US -2605:ef80:600::,2605:ef80:61f:ffff:ffff:ffff:ffff:ffff,CA -2605:ef80:620::,2605:ef80:63f:ffff:ffff:ffff:ffff:ffff,MX -2605:ef80:640::,2605:ef80:65f:ffff:ffff:ffff:ffff:ffff,PR -2605:ef80:660::,2605:ef80:67f:ffff:ffff:ffff:ffff:ffff,VI -2605:ef80:680::,2605:ef80:69f:ffff:ffff:ffff:ffff:ffff,UM -2605:ef80:6a0::,2605:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f000::,2605:f000:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f080::,2605:f080:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f100::,2605:f100:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f180::,2605:f180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f200::,2605:f200:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f280::,2605:f280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f300::,2605:f300:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f380::,2605:f380:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f400::,2605:f400:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f480::,2605:f481:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f500::,2605:f500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f580::,2605:f580:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f600::,2605:f600:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f680::,2605:f680:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f700::,2605:f700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f780::,2605:f780:fff:ffff:ffff:ffff:ffff:ffff,US -2605:f800::,2605:f800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f880::,2605:f880:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f900::,2605:f900:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:f980::,2605:f980:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:fa00::,2605:fa00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:fa80::,2605:fa80:fff:ffff:ffff:ffff:ffff:ffff,US -2605:fb00::,2605:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:fb80::,2605:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:fc80::,2605:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:fd00::,2605:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:fd80::,2605:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:fe00::,2605:fe00:fff:ffff:ffff:ffff:ffff:ffff,US -2605:fe80::,2605:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ff00::,2605:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:ff80::,2605:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:80::,2606:80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:100::,2606:100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:180::,2606:180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:200::,2606:200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:280::,2606:280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:300::,2606:300:107:ffff:ffff:ffff:ffff:ffff,US -2606:300:108::,2606:300:108:7fff:ffff:ffff:ffff:ffff,PR -2606:300:108:8000::,2606:300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:380::,2606:380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:400::,2606:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:480::,2606:480:ffff:ffff:ffff:ffff:ffff:ffff,BM -2606:500::,2606:500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:580::,2606:580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:600::,2606:600:ffff:ffff:ffff:ffff:ffff:ffff,KY -2606:680::,2606:680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:700::,2606:700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:780::,2606:780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:800::,2606:800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:880::,2606:880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:900::,2606:900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:980::,2606:980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a00::,2606:a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a80::,2606:a80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:b00::,2606:b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b80::,2606:b80:ffff:ffff:ffff:ffff:ffff:ffff,BM -2606:c00::,2606:c00:4:ffff:ffff:ffff:ffff:ffff,US -2606:c00:5::,2606:c00:5:7fff:ffff:ffff:ffff:ffff,CN -2606:c00:5:8000::,2606:c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d00::,2606:d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d80::,2606:d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e00::,2606:e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e80::,2606:e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f00::,2606:f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f80::,2606:f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1000::,2606:1000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1080::,2606:1080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1100::,2606:1100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1180::,2606:1180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1200::,2606:1200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1280::,2606:1280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1300::,2606:1300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1380::,2606:1380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1400::,2606:1400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1500::,2606:1500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1580::,2606:1580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1600::,2606:1600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1680::,2606:1680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1700::,2606:1700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1780::,2606:1780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1800::,2606:1800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1880::,2606:1880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1900::,2606:1900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1980::,2606:1980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1a00::,2606:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1a80::,2606:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1b00::,2606:1b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1b80::,2606:1b80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:1c00::,2606:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1c80::,2606:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1d00::,2606:1d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1e00::,2606:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1f00::,2606:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:1f80::,2606:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2000::,2606:2000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2080::,2606:2080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2100::,2606:2100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2180::,2606:2180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2200::,2606:2200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2280::,2606:2280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2300::,2606:2300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2400::,2606:2400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2480::,2606:2480:ffff:ffff:ffff:ffff:ffff:ffff,GP -2606:2500::,2606:2500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2580::,2606:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:2600::,2606:2600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2680::,2606:2680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2700::,2606:2700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:2780::,2606:2780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2800::,2606:2800:420a:ffff:ffff:ffff:ffff:ffff,US -2606:2800:420b::,2606:2800:420b:ffff:ffff:ffff:ffff:ffff,BR -2606:2800:420c::,2606:2800:420c:ffff:ffff:ffff:ffff:ffff,US -2606:2800:420d::,2606:2800:420d:ffff:ffff:ffff:ffff:ffff,EC -2606:2800:420e::,2606:2800:5000:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5001::,2606:2800:5001:ffff:ffff:ffff:ffff:ffff,ES -2606:2800:5002::,2606:2800:500f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5010::,2606:2800:5011:ffff:ffff:ffff:ffff:ffff,GB -2606:2800:5012::,2606:2800:501f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5020::,2606:2800:5021:ffff:ffff:ffff:ffff:ffff,DE -2606:2800:5022::,2606:2800:5030:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5031::,2606:2800:5033:ffff:ffff:ffff:ffff:ffff,FR -2606:2800:5034::,2606:2800:503f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5040::,2606:2800:5041:ffff:ffff:ffff:ffff:ffff,NL -2606:2800:5042::,2606:2800:504f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5050::,2606:2800:5051:ffff:ffff:ffff:ffff:ffff,AT -2606:2800:5052::,2606:2800:505f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5060::,2606:2800:5061:ffff:ffff:ffff:ffff:ffff,SE -2606:2800:5062::,2606:2800:506f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5070::,2606:2800:5071:ffff:ffff:ffff:ffff:ffff,DE -2606:2800:5072::,2606:2800:507f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5080::,2606:2800:5080:ffff:ffff:ffff:ffff:ffff,IT -2606:2800:5081::,2606:2800:508f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:5090::,2606:2800:5090:ffff:ffff:ffff:ffff:ffff,PL -2606:2800:5091::,2606:2800:5fff:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6000::,2606:2800:6001:ffff:ffff:ffff:ffff:ffff,SG -2606:2800:6002::,2606:2800:600f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6010::,2606:2800:6011:ffff:ffff:ffff:ffff:ffff,HK -2606:2800:6012::,2606:2800:601f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6020::,2606:2800:6023:ffff:ffff:ffff:ffff:ffff,JP -2606:2800:6024::,2606:2800:6027:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6028::,2606:2800:6029:ffff:ffff:ffff:ffff:ffff,JP -2606:2800:602a::,2606:2800:602a:ffff:ffff:ffff:ffff:ffff,US -2606:2800:602b::,2606:2800:602b:ffff:ffff:ffff:ffff:ffff,JP -2606:2800:602c::,2606:2800:602f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6030::,2606:2800:6031:ffff:ffff:ffff:ffff:ffff,AU -2606:2800:6032::,2606:2800:6032:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6033::,2606:2800:6033:ffff:ffff:ffff:ffff:ffff,AU -2606:2800:6034::,2606:2800:603f:ffff:ffff:ffff:ffff:ffff,US -2606:2800:6040::,2606:2800:6041:ffff:ffff:ffff:ffff:ffff,HK -2606:2800:6042::,2606:2800:60ef:ffff:ffff:ffff:ffff:ffff,US -2606:2800:60f0::,2606:2800:60f3:ffff:ffff:ffff:ffff:ffff,IN -2606:2800:60f4::,2606:2800:7000:ffff:ffff:ffff:ffff:ffff,US -2606:2800:7001::,2606:2800:7001:ffff:ffff:ffff:ffff:ffff,CO -2606:2800:7002::,2606:2800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2880::,2606:2880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2900::,2606:2900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2980::,2606:2980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2a00::,2606:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2b00::,2606:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2b80::,2606:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:2c00::,2606:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2c80::,2606:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2d00::,2606:2d00:fff:ffff:ffff:ffff:ffff:ffff,US -2606:2e00::,2606:2e00:8001:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8002::,2606:2e00:8002:7fff:ffff:ffff:ffff:ffff,JP -2606:2e00:8002:8000::,2606:2e00:8008:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8009::,2606:2e00:8009:7fff:ffff:ffff:ffff:ffff,DE -2606:2e00:8009:8000::,2606:2e00:800a:2:ffff:ffff:ffff:ffff,US -2606:2e00:800a:3::,2606:2e00:800a:3:ffff:ffff:ffff:ffff,HK -2606:2e00:800a:4::,2606:2e00:800a:4::41c,US -2606:2e00:800a:4::41d,2606:2e00:800a:4::41e,HK -2606:2e00:800a:4::41f,2606:2e00:800a:4::4f0,US -2606:2e00:800a:4::4f1,2606:2e00:800a:4::4f1,HK -2606:2e00:800a:4::4f2,2606:2e00:800c:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:800d::,2606:2e00:800d:7fff:ffff:ffff:ffff:ffff,AU -2606:2e00:800d:8000::,2606:2e00:800d:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:800e::,2606:2e00:800e:7fff:ffff:ffff:ffff:ffff,MX -2606:2e00:800e:8000::,2606:2e00:800e:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:800f::,2606:2e00:800f:7fff:ffff:ffff:ffff:ffff,IT -2606:2e00:800f:8000::,2606:2e00:8010:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8011::,2606:2e00:8011:7fff:ffff:ffff:ffff:ffff,FR -2606:2e00:8011:8000::,2606:2e00:8014:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8015::,2606:2e00:8015:7fff:ffff:ffff:ffff:ffff,AU -2606:2e00:8015:8000::,2606:2e00:8015:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8016::,2606:2e00:8016:7fff:ffff:ffff:ffff:ffff,JP -2606:2e00:8016:8000::,2606:2e00:8016:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8017::,2606:2e00:8017::ffff:ffff:ffff:ffff,CA -2606:2e00:8017:1::,2606:2e00:8017:ffff:ffff:ffff:ffff:ffff,US -2606:2e00:8018::,2606:2e00:8018:7fff:ffff:ffff:ffff:ffff,BR -2606:2e00:8018:8000::,2606:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2e80::,2606:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2f00::,2606:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:2f80::,2606:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:3000::,2606:3000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:3080::,2606:3080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3100::,2606:3100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:3180::,2606:3180:ffff:ffff:ffff:ffff:ffff:ffff,GP -2606:3200::,2606:3200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3280::,2606:3280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3300::,2606:3300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3380::,2606:3380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3400::,2606:3400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3480::,2606:3480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3500::,2606:3500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3580::,2606:3580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3600::,2606:3600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3680::,2606:3680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3700::,2606:3700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3800::,2606:3800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3880::,2606:3880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3900::,2606:3900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3980::,2606:3980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3a00::,2606:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3a80::,2606:3a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3b00::,2606:3b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3b80::,2606:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3c00::,2606:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:3c80::,2606:3c80:ffff:ffff:ffff:ffff:ffff:ffff,LC -2606:3d00::,2606:3d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3d80::,2606:3d80:ffff:ffff:ffff:ffff:ffff:ffff,PR -2606:3e00::,2606:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3e80::,2606:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3f00::,2606:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:3f80::,2606:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4000::,2606:4000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4080::,2606:4080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4100::,2606:4100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4180::,2606:4180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4200::,2606:4200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4280::,2606:4280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:4300::,2606:4300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4380::,2606:4380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:4400::,2606:4400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4480::,2606:4480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4500::,2606:4500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4580::,2606:4580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:4600::,2606:4600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4680::,2606:4680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4700::,2606:4700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4780::,2606:4780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4800::,2606:4800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4880::,2606:4880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4900::,2606:4900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4980::,2606:4980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4a00::,2606:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4a80::,2606:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4b00::,2606:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4b80::,2606:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4c00::,2606:4c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4c80::,2606:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4d00::,2606:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4d80::,2606:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4e00::,2606:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4e80::,2606:4e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4f00::,2606:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:4f80::,2606:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5000::,2606:5000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5080::,2606:5080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5100::,2606:5100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5180::,2606:5180:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:5200::,2606:5200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5280::,2606:5280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5300::,2606:5300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:5380::,2606:5380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5400::,2606:5400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5480::,2606:5480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:5500::,2606:5500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5580::,2606:5580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5600::,2606:5600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5680::,2606:5680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5700::,2606:5700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5780::,2606:5780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5800::,2606:5800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5880::,2606:5880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5980::,2606:5980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5a00::,2606:5a00:ffff:ffff:ffff:ffff:ffff:ffff,VI -2606:5a80::,2606:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5b00::,2606:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5b80::,2606:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5c00::,2606:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5c80::,2606:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:5d00::,2606:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5d80::,2606:5d80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:5e00::,2606:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5e80::,2606:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5f00::,2606:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PR -2606:5f80::,2606:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6000::,2606:6000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6080::,2606:6080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6100::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6180::,2606:6180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6200::,2606:6200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6280::,2606:6280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6300::,2606:6300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6380::,2606:6380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6400::,2606:6400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6480::,2606:6480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6500::,2606:650f:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6580::,2606:6580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6600::,2606:6600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6680::,2606:6680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6700::,2606:6700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6780::,2606:6780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6800::,2606:6800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6880::,2606:6880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6900::,2606:6900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6980::,2606:6980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6a00::,2606:6a00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6a80::,2606:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6b00::,2606:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6b80::,2606:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6c00::,2606:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6d00::,2606:6d00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:6d80::,2606:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6e00::,2606:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6e80::,2606:6e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6f00::,2606:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:6f80::,2606:6f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7000::,2606:7000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7080::,2606:7080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:7100::,2606:7100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7180::,2606:7180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7200::,2606:7200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7280::,2606:7280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7300::,2606:7300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7380::,2606:7380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7400::,2606:7400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7480::,2606:7480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:7500::,2606:7500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7580::,2606:7580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7600::,2606:7600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7680::,2606:7680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:7700::,2606:7700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7780::,2606:7780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7800::,2606:7800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7880::,2606:7880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:7900::,2606:7900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7980::,2606:7980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:7a80::,2606:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7b00::,2606:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7b80::,2606:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7c00::,2606:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7c80::,2606:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7d00::,2606:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7d80::,2606:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7e00::,2606:7e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7e80::,2606:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7f00::,2606:7f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:7f80::,2606:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8000::,2606:8000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8080::,2606:8080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8100::,2606:8100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8180::,2606:8180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8200::,2606:8200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8300::,2606:830f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:8380::,2606:8380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8400::,2606:8400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8480::,2606:8480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8500::,2606:8500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8580::,2606:8580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8600::,2606:8600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8680::,2606:8680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8700::,2606:8700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8780::,2606:8780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8800::,2606:8800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8880::,2606:8880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8900::,2606:8900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:8980::,2606:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:8a00::,2606:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8a80::,2606:8a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8b00::,2606:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8b80::,2606:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8c00::,2606:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:8c80::,2606:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8d00::,2606:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8e80::,2606:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8f00::,2606:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8f80::,2606:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:9000::,2606:9000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9080::,2606:9080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9100::,2606:9100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9180::,2606:9180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9200::,2606:9200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9280::,2606:9280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9300::,2606:9300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9380::,2606:9380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9400::,2606:9400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9480::,2606:9480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9500::,2606:9500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9580::,2606:9580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:9600::,2606:9600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9680::,2606:9680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9700::,2606:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9780::,2606:9780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9800::,2606:9800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9880::,2606:9880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9900::,2606:9900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9980::,2606:9980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9a00::,2606:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9a80::,2606:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9b00::,2606:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9b80::,2606:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9c00::,2606:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9c80::,2606:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9d00::,2606:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9d80::,2606:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9e00::,2606:9e00:ffff:ffff:ffff:ffff:ffff:ffff,BM -2606:9e80::,2606:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9f00::,2606:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:9f80::,2606:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a000::,2606:a000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a080::,2606:a080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a100::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a180::,2606:a180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a200::,2606:a200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a280::,2606:a280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a300::,2606:a300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a380::,2606:a380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a400::,2606:a400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a480::,2606:a480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a500::,2606:a500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a580::,2606:a580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a600::,2606:a600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a680::,2606:a680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a700::,2606:a700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a780::,2606:a780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a800::,2606:a800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a880::,2606:a880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a900::,2606:a900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a980::,2606:a980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:aa00::,2606:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:aa80::,2606:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ab00::,2606:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ab80::,2606:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ac00::,2606:ac00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ac80::,2606:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ad00::,2606:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ad80::,2606:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ae00::,2606:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ae80::,2606:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:af00::,2606:af00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:af80::,2606:af80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b000::,2606:b000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b080::,2606:b080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b100::,2606:b100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b180::,2606:b180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b200::,2606:b200:ffff:ffff:ffff:ffff:ffff:ffff,KY -2606:b280::,2606:b280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b300::,2606:b300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b380::,2606:b380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b400::,2606:b400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b480::,2606:b480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b500::,2606:b500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b580::,2606:b580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b600::,2606:b600:fff:ffff:ffff:ffff:ffff:ffff,US -2606:b680::,2606:b680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b700::,2606:b700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b780::,2606:b780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b800::,2606:b800:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:b880::,2606:b880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b900::,2606:b900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:b980::,2606:b980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ba00::,2606:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ba80::,2606:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bb00::,2606:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bb80::,2606:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bc00::,2606:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bc80::,2606:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bd00::,2606:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bd80::,2606:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:be00::,2606:be00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:be80::,2606:be80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:bf00::,2606:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:bf80::,2606:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c000::,2606:c000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c080::,2606:c080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c100::,2606:c100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c180::,2606:c180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c280::,2606:c280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c300::,2606:c300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c380::,2606:c380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c480::,2606:c480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c500::,2606:c500:ffff:ffff:ffff:ffff:ffff:ffff,JM -2606:c580::,2606:c580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c680::,2606:c680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c700::,2606:c700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c780::,2606:c780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c800::,2606:c800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c880::,2606:c880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:c900::,2606:c900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:c980::,2606:c980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ca00::,2606:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:ca80::,2606:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cb00::,2606:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cb80::,2606:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cc00::,2606:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cc80::,2606:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cd00::,2606:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cd80::,2606:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ce00::,2606:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ce80::,2606:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cf00::,2606:cf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:cf80::,2606:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d000::,2606:d000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d080::,2606:d080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d100::,2606:d101:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d180::,2606:d180:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:d200::,2606:d200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d280::,2606:d280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d300::,2606:d300:fff:ffff:ffff:ffff:ffff:ffff,US -2606:d380::,2606:d380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d400::,2606:d400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d480::,2606:d480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d500::,2606:d500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d580::,2606:d580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d600::,2606:d600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d680::,2606:d680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:d700::,2606:d700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d780::,2606:d780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d800::,2606:d800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d880::,2606:d880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d900::,2606:d900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d980::,2606:d980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:da00::,2606:da00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:da80::,2606:da80:fff:ffff:ffff:ffff:ffff:ffff,US -2606:db00::,2606:db00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:db80::,2606:db80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:dc00::,2606:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:dc80::,2606:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:dd00::,2606:dd00:fff:ffff:ffff:ffff:ffff:ffff,US -2606:dd80::,2606:dd80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:de00::,2606:de00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:de80::,2606:de80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:df00::,2606:df00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:df80::,2606:df80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e000::,2606:e000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:e080::,2606:e080:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e100::,2606:e100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e180::,2606:e180:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e200::,2606:e200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e280::,2606:e280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e300::,2606:e300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e380::,2606:e380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:e400::,2606:e400:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e480::,2606:e480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e500::,2606:e500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e580::,2606:e580:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e600::,2606:e600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e700::,2606:e700:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e780::,2606:e780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e800::,2606:e800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e880::,2606:e880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e900::,2606:e900:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:e980::,2606:e980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ea00::,2606:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ea80::,2606:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:eb00::,2606:eb00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:eb80::,2606:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ec00::,2606:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ed00::,2606:ed00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ed80::,2606:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ee00::,2606:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:ee80::,2606:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ef00::,2606:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ef80::,2606:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f000::,2606:f000:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f080::,2606:f080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:f100::,2606:f100:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f180::,2606:f180:2:ffff:ffff:ffff:ffff:ffff,US -2606:f180:3::,2606:f180:3:ffff:ffff:ffff:ffff:ffff,DE -2606:f180:4::,2606:f18f:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f200::,2606:f200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f280::,2606:f280:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f300::,2606:f300:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f380::,2606:f380:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f400::,2606:f40f:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f480::,2606:f480:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f500::,2606:f500:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f580::,2606:f580:ffff:ffff:ffff:ffff:ffff:ffff,KY -2606:f600::,2606:f600:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f680::,2606:f680:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f700::,2606:f700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:f780::,2606:f780:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f800::,2606:f800:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:f880::,2606:f880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:f900::,2606:f900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:f980::,2606:f980:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fa00::,2606:fa00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2606:fa80::,2606:fa80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fb80::,2606:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fc00::,2606:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fc80::,2606:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fd00::,2606:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fd80::,2606:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fe00::,2606:fe00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:fe80::,2606:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ff00::,2606:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:ff80::,2606:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607::,2607::ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:80::,2607:80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:90:44::,2607:90:44:7fff:ffff:ffff:ffff:ffff,US -2607:100::,2607:100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:180::,2607:180:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:200::,2607:200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:280::,2607:280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:300::,2607:300:ffff:ffff:ffff:ffff:ffff:ffff,BS -2607:380::,2607:380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:400::,2607:400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:480::,2607:480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:500::,2607:500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:580::,2607:580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:600::,2607:600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:680::,2607:680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:700::,2607:700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:780::,2607:780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:800::,2607:800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:880::,2607:880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:900::,2607:900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:980::,2607:980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a00::,2607:a00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:a80::,2607:a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b00::,2607:b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b80::,2607:b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c00::,2607:c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c80::,2607:c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d00::,2607:d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d80::,2607:d80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:e00::,2607:e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e80::,2607:e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f00::,2607:f00:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:f80::,2607:f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1000::,2607:1000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1080::,2607:1080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:1100::,2607:1100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1180::,2607:1180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1200::,2607:1200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1280::,2607:1280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1300::,2607:1300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1380::,2607:1380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1400::,2607:1400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1480::,2607:1480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1500::,2607:1500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1580::,2607:1580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1600::,2607:1600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1680::,2607:1680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1700::,2607:1700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1780::,2607:1780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1800::,2607:1800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1880::,2607:1880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1900::,2607:1900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1980::,2607:1980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1a00::,2607:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1a80::,2607:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1b00::,2607:1b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1b80::,2607:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1c00::,2607:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1c80::,2607:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1d00::,2607:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:1d80::,2607:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:1e00::,2607:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1e80::,2607:1e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1f00::,2607:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:1f80::,2607:1f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2000::,2607:2000:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:2080::,2607:2080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2100::,2607:2100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2180::,2607:2180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2200::,2607:2200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2280::,2607:2280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2300::,2607:2300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2380::,2607:2380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2400::,2607:2400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2480::,2607:2480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2500::,2607:2500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2580::,2607:2580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2600::,2607:2600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2680::,2607:2680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2700::,2607:2700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2780::,2607:2780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2800::,2607:2800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2880::,2607:2880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2900::,2607:2900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2980::,2607:2980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2a00::,2607:2a00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2a80::,2607:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2b00::,2607:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2b80::,2607:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2c00::,2607:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2c80::,2607:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2d00::,2607:2d00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:2d80::,2607:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2e00::,2607:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2e80::,2607:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2f00::,2607:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:2f80::,2607:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3000::,2607:3000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3080::,2607:3080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3100::,2607:3100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3180::,2607:3180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3200::,2607:3200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3280::,2607:3280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3300::,2607:3300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3380::,2607:3380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:3400::,2607:3400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3480::,2607:3480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3500::,2607:3500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3580::,2607:3580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3600::,2607:3600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3680::,2607:3680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3700::,2607:3700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3780::,2607:3780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3800::,2607:3800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3880::,2607:3880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3900::,2607:3900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3980::,2607:3980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3a00::,2607:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3a80::,2607:3a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3b00::,2607:3b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3b80::,2607:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3c00::,2607:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3c80::,2607:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3d00::,2607:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3d80::,2607:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3e00::,2607:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3e80::,2607:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3f00::,2607:3f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:3f80::,2607:3f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4000::,2607:4000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4080::,2607:4080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4100::,2607:4100:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4180::,2607:4180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4200::,2607:4200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4280::,2607:4280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4300::,2607:4300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4380::,2607:4380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4400::,2607:4400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4480::,2607:4480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4500::,2607:4500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4580::,2607:4580:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4600::,2607:4600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4680::,2607:4680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4700::,2607:4700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4780::,2607:4780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4800::,2607:4800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4880::,2607:4880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4900::,2607:4900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4980::,2607:4980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4a00::,2607:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4a80::,2607:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4b00::,2607:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4b80::,2607:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4c00::,2607:4c00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:4d00::,2607:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4d80::,2607:4d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4e00::,2607:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4e80::,2607:4e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4f00::,2607:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:4f80::,2607:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5000::,2607:5006:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5080::,2607:5080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5100::,2607:5100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5180::,2607:5180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5200::,2607:5201:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5280::,2607:5280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5300::,2607:5300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:5380::,2607:5380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5400::,2607:5400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5480::,2607:5480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5500::,2607:5501:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5580::,2607:5580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5600::,2607:5600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5680::,2607:5680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5700::,2607:5700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5780::,2607:5780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5800::,2607:5800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5880::,2607:5880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:5980::,2607:5980:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:5a00::,2607:5a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5a80::,2607:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5b00::,2607:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5b80::,2607:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5c00::,2607:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5c80::,2607:5c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5d00::,2607:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5d80::,2607:5d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5e00::,2607:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:5e80::,2607:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5f00::,2607:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:5f80::,2607:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6000::,2607:600f:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6100::,2607:6100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6180::,2607:6180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6200::,2607:6200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6280::,2607:6280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6300::,2607:6300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6380::,2607:6380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6400::,2607:6400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6480::,2607:6480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6500::,2607:6500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:6580::,2607:6580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6600::,2607:6600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6680::,2607:6680:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:6700::,2607:6700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6780::,2607:6780:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:6800::,2607:6800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6880::,2607:6880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6900::,2607:6900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6980::,2607:6980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6a00::,2607:6a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6a80::,2607:6a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6b00::,2607:6b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6b80::,2607:6b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6c00::,2607:6c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6c80::,2607:6c80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:6d00::,2607:6d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6d80::,2607:6d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6e00::,2607:6e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6e80::,2607:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:6f00::,2607:6f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:6f80::,2607:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7000::,2607:7000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7080::,2607:7080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7100::,2607:7100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7180::,2607:7180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7200::,2607:7200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7280::,2607:7280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7300::,2607:7300:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7400::,2607:7400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7480::,2607:7480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7500::,2607:7500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7580::,2607:7580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7600::,2607:7600:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7680::,2607:7680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7700::,2607:7700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7780::,2607:7780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7800::,2607:7800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7880::,2607:7880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7900::,2607:7900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7980::,2607:7980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7a00::,2607:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7a80::,2607:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7b00::,2607:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7b80::,2607:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7c00::,2607:7c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7c80::,2607:7c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7d00::,2607:7d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7d80::,2607:7d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7e00::,2607:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:7e80::,2607:7e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7f00::,2607:7f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:7f80::,2607:7f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8000::,2607:8000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8080::,2607:8080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8100::,2607:8100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8180::,2607:8180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8200::,2607:8200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8280::,2607:8280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8300::,2607:8300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8380::,2607:8380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8400::,2607:8400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8480::,2607:8480:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:8500::,2607:8500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8580::,2607:8580:ffff:ffff:ffff:ffff:ffff:ffff,VI -2607:8600::,2607:8600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8680::,2607:8680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8700::,2607:8700:100:ffff:ffff:ffff:ffff:ffff,CA -2607:8700:101::,2607:8700:104:ffff:ffff:ffff:ffff:ffff,US -2607:8700:105::,2607:8700:105:ffff:ffff:ffff:ffff:ffff,NL -2607:8700:106::,2607:8700:109:ffff:ffff:ffff:ffff:ffff,US -2607:8700:10a::,2607:8700:110:7fff:ffff:ffff:ffff:ffff,CA -2607:8700:110:8000::,2607:8700:110:ffff:ffff:ffff:ffff:ffff,US -2607:8700:111::,2607:8700:111:ffff:ffff:ffff:ffff:ffff,CA -2607:8700:112::,2607:8700:112:7fff:ffff:ffff:ffff:ffff,US -2607:8700:112:8000::,2607:8700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:8780::,2607:8780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8800::,2607:8800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8880::,2607:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:8900::,2607:8900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8980::,2607:8980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8a00::,2607:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8a80::,2607:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:8b00::,2607:8b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8b80::,2607:8b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8c00::,2607:8c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8c80::,2607:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8d00::,2607:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8d80::,2607:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8e00::,2607:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8e80::,2607:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:8f00::,2607:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:8f80::,2607:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9000::,2607:9000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9080::,2607:9080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9100::,2607:9100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9180::,2607:9180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9200::,2607:9200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9280::,2607:9280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9380::,2607:9380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9400::,2607:9400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9480::,2607:9480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9500::,2607:9500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:9580::,2607:9580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9600::,2607:9600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9680::,2607:9680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9700::,2607:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9800::,2607:9800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9880::,2607:9880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:9980::,2607:9980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:9a00::,2607:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9a80::,2607:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9b00::,2607:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9b80::,2607:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9c00::,2607:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9c80::,2607:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9d00::,2607:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9d80::,2607:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9e00::,2607:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9e80::,2607:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9f00::,2607:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9f80::,2607:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a000::,2607:a000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:a080::,2607:a080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a100::,2607:a10f:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a180::,2607:a180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a200::,2607:a200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a280::,2607:a280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a300::,2607:a300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a380::,2607:a380:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:a400::,2607:a400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a480::,2607:a480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a500::,2607:a500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a580::,2607:a580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a600::,2607:a600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a680::,2607:a680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a700::,2607:a700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a780::,2607:a780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a800::,2607:a800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a880::,2607:a880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a900::,2607:a900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:a980::,2607:a980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:aa00::,2607:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:aa80::,2607:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ab00::,2607:ab00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ab80::,2607:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ac00::,2607:ac00:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:ac80::,2607:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ad00::,2607:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ad80::,2607:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ae00::,2607:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ae80::,2607:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:af00::,2607:af00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:af80::,2607:af80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b000::,2607:b000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b080::,2607:b080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b100::,2607:b100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b180::,2607:b180:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:b200::,2607:b200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b280::,2607:b280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b300::,2607:b300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b380::,2607:b380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b400::,2607:b400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b480::,2607:b480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b500::,2607:b500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b580::,2607:b580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b600::,2607:b600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b680::,2607:b680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b700::,2607:b700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b800::,2607:b800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b880::,2607:b880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:b900::,2607:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:b980::,2607:b980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ba00::,2607:ba00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ba80::,2607:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bb00::,2607:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bb80::,2607:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bc80::,2607:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bd00::,2607:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:bd80::,2607:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:be00::,2607:be00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2607:be80::,2607:be80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bf00::,2607:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bf80::,2607:bf80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:c000::,2607:c000:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:c080::,2607:c080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c100::,2607:c100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c180::,2607:c180:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:c200::,2607:c200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c280::,2607:c280:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:c300::,2607:c300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c380::,2607:c380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c400::,2607:c400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c480::,2607:c480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c500::,2607:c500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c580::,2607:c580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c600::,2607:c600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c680::,2607:c680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c700::,2607:c700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c780::,2607:c780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c800::,2607:c800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c880::,2607:c880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:c980::,2607:c980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ca00::,2607:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ca80::,2607:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cb00::,2607:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cb80::,2607:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cc00::,2607:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cc80::,2607:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cd00::,2607:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cd80::,2607:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ce00::,2607:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ce80::,2607:ce80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:cf00::,2607:cf03:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:cf80::,2607:cf80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d000::,2607:d000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d080::,2607:d080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d100::,2607:d100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d180::,2607:d180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d200::,2607:d200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d280::,2607:d280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d300::,2607:d300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d380::,2607:d380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:d400::,2607:d400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d480::,2607:d480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d500::,2607:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:d580::,2607:d580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d600::,2607:d600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d680::,2607:d680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d700::,2607:d700:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:d780::,2607:d780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d800::,2607:d800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d880::,2607:d880:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:d900::,2607:d900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:d980::,2607:d980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:da00::,2607:da00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:da80::,2607:da80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:db80::,2607:db80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:dc00::,2607:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:dc80::,2607:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:dd00::,2607:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:dd80::,2607:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:de00::,2607:de00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:de80::,2607:de80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:df00::,2607:df00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:df80::,2607:df80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e000::,2607:e000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e080::,2607:e080:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:e100::,2607:e100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e180::,2607:e180:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e200::,2607:e200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e280::,2607:e280:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e300::,2607:e300:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e400::,2607:e400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e480::,2607:e480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e500::,2607:e500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e580::,2607:e580:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e600::,2607:e600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e680::,2607:e680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e700::,2607:e700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e780::,2607:e780:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e800::,2607:e800:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e880::,2607:e880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e900::,2607:e900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:e980::,2607:e980:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ea00::,2607:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ea80::,2607:ea80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:eb00::,2607:eb00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:eb80::,2607:eb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ec00::,2607:ec00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ec80::,2607:ec80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ed00::,2607:ed00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ed80::,2607:ed80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ee00::,2607:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ee80::,2607:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ef00::,2607:ef00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ef80::,2607:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f000::,2607:f000:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f008::,2607:f008:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f010::,2607:f010:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f018::,2607:f018:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f020::,2607:f020:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f028::,2607:f028:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f030::,2607:f030:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f038::,2607:f038:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f040::,2607:f040:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f048::,2607:f048:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f050::,2607:f050:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f058::,2607:f058:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f060::,2607:f060:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f068::,2607:f068:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f070::,2607:f070:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f078::,2607:f078:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f080::,2607:f080:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f088::,2607:f088:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f090::,2607:f090:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f098::,2607:f098:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0a0::,2607:f0a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0a8::,2607:f0a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0b0::,2607:f0b0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f0c0::,2607:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0c8::,2607:f0c8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f0d0::,2607:f0d0:1c00:ffff:ffff:ffff:ffff:ffff,US -2607:f0d0:1c01::,2607:f0d0:1c01:7fff:ffff:ffff:ffff:ffff,MX -2607:f0d0:1c01:8000::,2607:f0d0:3601:3a:ffff:ffff:ffff:ffff,US -2607:f0d0:3601:3b::,2607:f0d0:3601:3b:ffff:ffff:ffff:ffff,CA -2607:f0d0:3601:3c::,2607:f0d1:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0d8::,2607:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0e8::,2607:f0e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f0f8::,2607:f0f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f100::,2607:f100:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f108::,2607:f108:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f110::,2607:f110:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f118::,2607:f118:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f128::,2607:f128:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f130::,2607:f130:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f138::,2607:f138:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f140::,2607:f140:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f148::,2607:f148:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f150::,2607:f150:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f158::,2607:f158:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f160::,2607:f160:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f168::,2607:f168:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f170::,2607:f170:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f178::,2607:f178:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f180::,2607:f181:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f188::,2607:f188:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f190::,2607:f190:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f198::,2607:f198:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1a0::,2607:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1a8::,2607:f1a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1b0::,2607:f1b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1c0::,2607:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1c8::,2607:f1c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1d0::,2607:f1d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1d8::,2607:f1d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1e0::,2607:f1e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1e8::,2607:f1e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f1f0::,2607:f1f0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f200::,2607:f200:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f208::,2607:f208:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f210::,2607:f212:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f218::,2607:f218:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f220::,2607:f220:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f228::,2607:f228:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f230::,2607:f230:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f238::,2607:f238:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f240::,2607:f240:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f248::,2607:f248:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f250::,2607:f250:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f258::,2607:f258:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f260::,2607:f260:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f278::,2607:f278:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f280::,2607:f281:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f290::,2607:f290:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f298::,2607:f298:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2a8::,2607:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2b0::,2607:f2b1:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2c0::,2607:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f2c8::,2607:f2c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2d0::,2607:f2d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2d8::,2607:f2d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2e0::,2607:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2e8::,2607:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2f0::,2607:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f300::,2607:f300:fff:ffff:ffff:ffff:ffff:ffff,US -2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f340::,2607:f340:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f348::,2607:f348:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f350::,2607:f350:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f358::,2607:f358:7:ffff:ffff:ffff:ffff:ffff,US -2607:f358:8::,2607:f358:8:7fff:ffff:ffff:ffff:ffff,CH -2607:f358:8:8000::,2607:f358:1e:ffff:ffff:ffff:ffff:ffff,US -2607:f358:1f::,2607:f358:1f:ffff:ffff:ffff:ffff:ffff,DE -2607:f358:20::,2607:f358:20:467:3b8c:afeb:b1c4:942b,US -2607:f358:20:467:3b8c:afeb:b1c4:942c,2607:f358:20:467:3b8c:afeb:b1c4:942c,PH -2607:f358:20:467:3b8c:afeb:b1c4:942d,2607:f358:20:ffff:ffff:ffff:ffff:ffff,US -2607:f358:21::,2607:f358:21:ffff:ffff:ffff:ffff:ffff,DE -2607:f358:22::,2607:f358:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f360::,2607:f360:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f368::,2607:f368:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f370::,2607:f370:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f378::,2607:f378:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f380::,2607:f380:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f388::,2607:f388:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f390::,2607:f390:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f398::,2607:f398:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3a0::,2607:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3b0::,2607:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3b8::,2607:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3c0::,2607:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3c8::,2607:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3d0::,2607:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3d8::,2607:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f3e0::,2607:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f3f0::,2607:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f3f8::,2607:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f400::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f408::,2607:f408:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f418::,2607:f418:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f420::,2607:f420:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f428::,2607:f428:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f430::,2607:f430:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f438::,2607:f438:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f440::,2607:f441:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f450::,2607:f450:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f458::,2607:f458:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f460::,2607:f460:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f468::,2607:f468:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f470::,2607:f470:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f478::,2607:f478:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f480::,2607:f480:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f488::,2607:f488:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f490::,2607:f490:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f498::,2607:f498:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4a0::,2607:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4a8::,2607:f4a8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f4b0::,2607:f4b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4b8::,2607:f4b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4c0::,2607:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4c8::,2607:f4c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4d0::,2607:f4d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4d8::,2607:f4d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4e0::,2607:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4e8::,2607:f4e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4f0::,2607:f4f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f4f8::,2607:f4f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f500::,2607:f500:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f508::,2607:f508:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f510::,2607:f510:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f518::,2607:f518:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f520::,2607:f520:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f528::,2607:f528:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f530::,2607:f530:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f538::,2607:f538:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f540::,2607:f540:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f548::,2607:f548:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f550::,2607:f550:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f558::,2607:f558:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f560::,2607:f560:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f568::,2607:f568:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f570::,2607:f570:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f578::,2607:f578:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f588::,2607:f588:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f590::,2607:f590:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f598::,2607:f598:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5a0::,2607:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5a8::,2607:f5a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5b0::,2607:f5b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5c0::,2607:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5d0::,2607:f5d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5d8::,2607:f5d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5e0::,2607:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5e8::,2607:f5e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5f0::,2607:f5f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f5f8::,2607:f5f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f600::,2607:f600:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f608::,2607:f608:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f610::,2607:f610:fff:ffff:ffff:ffff:ffff:ffff,US -2607:f618::,2607:f618:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f620::,2607:f620:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f628::,2607:f628:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f630::,2607:f630:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f638::,2607:f638:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f640::,2607:f640:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f650::,2607:f650:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f660::,2607:f660:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f668::,2607:f668:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f670::,2607:f670:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f678::,2607:f678:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f680::,2607:f680:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f688::,2607:f688:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f690::,2607:f690:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f698::,2607:f699:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f6a0::,2607:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6a8::,2607:f6a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6b0::,2607:f6b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6b8::,2607:f6b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6c0::,2607:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f6c8::,2607:f6c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6d0::,2607:f6d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6d8::,2607:f6d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6e0::,2607:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6e8::,2607:f6e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6f0::,2607:f6f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f6f8::,2607:f6f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f700::,2607:f700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f708::,2607:f708:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f710::,2607:f710:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f718::,2607:f718:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f720::,2607:f720:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f728::,2607:f728:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f738::,2607:f738:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f740::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f748::,2607:f748:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f750::,2607:f750:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f758::,2607:f758:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f760::,2607:f760:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f768::,2607:f768:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f770::,2607:f770:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f778::,2607:f778:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f788::,2607:f788:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f790::,2607:f790:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f798::,2607:f798:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f7a0::,2607:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7a8::,2607:f7a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7b0::,2607:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7b8::,2607:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7c0::,2607:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7c8::,2607:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7d0::,2607:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7d8::,2607:f7d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7e0::,2607:f7e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7e8::,2607:f7e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7f0::,2607:f7f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f7f8::,2607:f7f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f800::,2607:f800:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f808::,2607:f808:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f810::,2607:f810:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f818::,2607:f818:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f820::,2607:f820:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f828::,2607:f828:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f830::,2607:f830:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f838::,2607:f838:ffff:ffff:ffff:ffff:ffff:ffff,VI -2607:f848::,2607:f848:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f858::,2607:f858:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f860::,2607:f860:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f868::,2607:f868:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f870::,2607:f870:ffff:ffff:ffff:ffff:ffff:ffff,PR -2607:f880::,2607:f880:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f888::,2607:f888:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f890::,2607:f890:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f898::,2607:f898:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8a8::,2607:f8a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8b0::,2607:f8b0:400c:c08::242,US -2607:f8b0:400c:c08::243,2607:f8b0:400c:c08::243,DO -2607:f8b0:400c:c08::244,2607:f8b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8b8::,2607:f8b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8c0::,2607:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8c8::,2607:f8c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8d0::,2607:f8d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8d8::,2607:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8e0::,2607:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8e8::,2607:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f8f0::,2607:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f8f8::,2607:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f900::,2607:f900:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f908::,2607:f908:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f910::,2607:f910:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f920::,2607:f920:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f928::,2607:f928:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f930::,2607:f930:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f938::,2607:f938:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f940::,2607:f940:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f948::,2607:f948:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f950::,2607:f950:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f960::,2607:f960:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f968::,2607:f968:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f978::,2607:f978:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f980::,2607:f980:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f990::,2607:f990:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:f998::,2607:f998:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9a0::,2607:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9a8::,2607:f9a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9b0::,2607:f9b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9b8::,2607:f9b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9c0::,2607:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9c8::,2607:f9c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9d0::,2607:f9d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9d8::,2607:f9d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f9e0::,2607:f9e0:fff:ffff:ffff:ffff:ffff:ffff,US -2607:f9f0::,2607:f9f1:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa00::,2607:fa00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa08::,2607:fa08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa10::,2607:fa10:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa18::,2607:fa18:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa20::,2607:fa20:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa28::,2607:fa28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa38::,2607:fa38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa40::,2607:fa40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa48::,2607:fa4f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fa58::,2607:fa58:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa60::,2607:fa60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa68::,2607:fa68:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa70::,2607:fa70:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa78::,2607:fa78:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa88::,2607:fa88:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa90::,2607:fa90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fa98::,2607:fa98:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:faa0::,2607:faa0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:faa8::,2607:faa8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fab0::,2607:fab0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fab8::,2607:fab8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fac0::,2607:fac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fac8::,2607:fac8:fff:ffff:ffff:ffff:ffff:ffff,US -2607:fad0::,2607:fad0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fad8::,2607:fad8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fae0::,2607:fae0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fae8::,2607:fae8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:faf0::,2607:faf0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:faf8::,2607:faf8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb00::,2607:fb00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb08::,2607:fb08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb10::,2607:fb10:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb18::,2607:fb18:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb20::,2607:fb20:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb28::,2607:fb28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb30::,2607:fb30:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb38::,2607:fb38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb40::,2607:fb40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb48::,2607:fb48:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb50::,2607:fb50:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb58::,2607:fb58:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb60::,2607:fb60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb70::,2607:fb70:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb78::,2607:fb78:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb80::,2607:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb88::,2607:fb88:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb90::,2607:fb90:c29:7fff:ffff:ffff:ffff:ffff,US -2607:fb90:c29:8000::,2607:fb90:c29:8fff:ffff:ffff:ffff:ffff,PR -2607:fb90:c29:9000::,2607:fb90:1b06:3fff:ffff:ffff:ffff:ffff,US -2607:fb90:1b06:4000::,2607:fb90:1b06:5fff:ffff:ffff:ffff:ffff,PR -2607:fb90:1b06:6000::,2607:fb90:1bc5:3fff:ffff:ffff:ffff:ffff,US -2607:fb90:1bc5:4000::,2607:fb90:1bc5:4fff:ffff:ffff:ffff:ffff,PR -2607:fb90:1bc5:5000::,2607:fb90:75ff:ffff:ffff:ffff:ffff:ffff,US -2607:fb90:7600::,2607:fb90:76ff:ffff:ffff:ffff:ffff:ffff,PR -2607:fb90:7700::,2607:fb90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb98::,2607:fb98:1b:ffff:ffff:ffff:ffff:ffff,US -2607:fb98:1c::,2607:fb98:1c:ffff:ffff:ffff:ffff:ffff,CA -2607:fb98:1d::,2607:fb98:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fba0::,2607:fba0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fba8::,2607:fba8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbb0::,2607:fbb0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbb8::,2607:fbb8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbc0::,2607:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbd0::,2607:fbd0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbd8::,2607:fbd8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fbe0::,2607:fbe0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbe8::,2607:fbe8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbf0::,2607:fbf0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fbf8::,2607:fbf8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc00::,2607:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc08::,2607:fc08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc10::,2607:fc10:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fc18::,2607:fc18:fff:ffff:ffff:ffff:ffff:ffff,US -2607:fc20::,2607:fc20:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc28::,2607:fc28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc30::,2607:fc30:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc38::,2607:fc38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc40::,2607:fc40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc48::,2607:fc48:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc50::,2607:fc50:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc58::,2607:fc58:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc60::,2607:fc60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc68::,2607:fc68:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc70::,2607:fc70:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fc78::,2607:fc78:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fc88::,2607:fc88:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc90::,2607:fc90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc98::,2607:fc98:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fca0::,2607:fca0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fca8::,2607:fca8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcb8::,2607:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcc0::,2607:fcc0:3fff:ffff:ffff:ffff:ffff:ffff,CA -2607:fcc0:4000::,2607:fcc0:5fff:ffff:ffff:ffff:ffff:ffff,GB -2607:fcc0:6000::,2607:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fcc8::,2607:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcd0::,2607:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcd8::,2607:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fce0::,2607:fce0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fce8::,2607:fce8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcf0::,2607:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fcf8::,2607:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fd00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd08::,2607:fd08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd10::,2607:fd10:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd28::,2607:fd28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd30::,2607:fd30:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd38::,2607:fd38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd40::,2607:fd40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd48::,2607:fd48:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd50::,2607:fd50:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd60::,2607:fd60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd68::,2607:fd68:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd70::,2607:fd70:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd78::,2607:fd78:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fd80::,2607:fd80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd88::,2607:fd88:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fd90::,2607:fd90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fda0::,2607:fda0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fda8::,2607:fda8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdb0::,2607:fdb0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdb8::,2607:fdb8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdc0::,2607:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdc8::,2607:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdd0::,2607:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdd8::,2607:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fde0::,2607:fde0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fde8::,2607:fde8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdf0::,2607:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fdf8::,2607:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe00::,2607:fe00:ffff:ffff:ffff:ffff:ffff:ffff,JM -2607:fe08::,2607:fe08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe10::,2607:fe10:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe18::,2607:fe18:fff:ffff:ffff:ffff:ffff:ffff,US -2607:fe20::,2607:fe20:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe28::,2607:fe28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe30::,2607:fe30:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe38::,2607:fe38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe40::,2607:fe40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe48::,2607:fe48:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe50::,2607:fe50:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe58::,2607:fe58:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe60::,2607:fe60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe68::,2607:fe68:ffff:ffff:ffff:ffff:ffff:ffff,BS -2607:fe70::,2607:fe70:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe78::,2607:fe78:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe80::,2607:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe88::,2607:fe88:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fe90::,2607:fe90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fe98::,2607:fe98:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fea0::,2607:fea0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fea8::,2607:fea8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:feb0::,2607:feb0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:feb8::,2607:feb8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fec0::,2607:fec0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fec8::,2607:fec8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:fed0::,2607:fed0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fed8::,2607:fed8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fee0::,2607:fee0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fee8::,2607:fee8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fef8::,2607:fef8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff00::,2607:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff08::,2607:ff08:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff10::,2607:ff10:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff18::,2607:ff18:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff28::,2607:ff28:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff30::,2607:ff30:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff38::,2607:ff38:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff40::,2607:ff40:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff48::,2607:ff48:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff50::,2607:ff50:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff58::,2607:ff58:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff60::,2607:ff60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff68::,2607:ff68:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff70::,2607:ff70:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff78::,2607:ff78:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ff80::,2607:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ff90::,2607:ff90:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffa0::,2607:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffa8::,2607:ffa8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffb0::,2607:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ffb8::,2607:ffb8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffc0::,2607:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ffc8::,2607:ffc8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffd0::,2607:ffd0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:ffd8::,2607:ffd8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ffe0::,2607:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2607:ffe8::,2607:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fff0::,2607:fff0:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fff8::,2607:fff8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2608::,2608:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2608:4000::,2608:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2608:8000::,2608:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2608:c000::,2608:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609::,2609:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609:4000::,2609:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609:8000::,2609:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609:a000::,2609:a3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609:c000::,2609:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2609:e000::,2609:e3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c::,260c:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:2000::,260c:23ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:4000::,260c:43ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:6000::,260c:63ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:8000::,260c:83ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:a000::,260c:a3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:c000::,260c:c3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:d000::,260c:d3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:e000::,260c:e3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260c:f000::,260c:f3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260f:d000::,260f:d3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -260f:f000::,260f:f3ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2610::,2610::ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:8::,2610:8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:10::,2610:10:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:18::,2610:18:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:20::,2610:20:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:28::,2610:28:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:30::,2610:30:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:38::,2610:38:ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:40::,2610:40:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:48::,2610:48:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:50::,2610:50:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:58::,2610:58:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:60::,2610:60:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:68::,2610:68:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:78::,2610:78:ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:80::,2610:87:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:88::,2610:88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2610:98::,2610:98:ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:a0::,2610:a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:b0::,2610:b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:b8::,2610:b8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:c0::,2610:c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:c8::,2610:c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:d0::,2610:d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:e0::,2610:e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:e8::,2610:e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:f0::,2610:f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:100::,2610:100:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:108::,2610:108:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:120::,2610:120:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:128::,2610:128:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:130::,2610:130:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:148::,2610:148:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:150::,2610:150:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:158::,2610:158:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:160::,2610:160:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:168::,2610:168:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:170::,2610:170:ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:178::,2610:178:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:180::,2610:180:ffff:ffff:ffff:ffff:ffff:ffff,BS -2610:188::,2610:188:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:190::,2610:190:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:198::,2610:198:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1a0::,2610:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1a8::,2610:1a8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1b0::,2610:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1c0::,2610:1c2:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1c8::,2610:1c8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1d0::,2610:1d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1d8::,2610:1d8:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1e0::,2610:1e0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1e8::,2610:1e8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2610:1f0::,2610:1f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:1f8::,2610:1f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2620::,2620::ffff:ffff:ffff:ffff:ffff,US -2620:0:10::,2620::10:ffff:ffff:ffff:ffff:ffff,US -2620:0:20::,2620::20:ffff:ffff:ffff:ffff:ffff,US -2620:0:30::,2620::37:ffff:ffff:ffff:ffff:ffff,US -2620:0:60::,2620::60:ffff:ffff:ffff:ffff:ffff,US -2620:0:70::,2620::70:ffff:ffff:ffff:ffff:ffff,US -2620:0:80::,2620::80:ffff:ffff:ffff:ffff:ffff,US -2620:0:90::,2620::90:ffff:ffff:ffff:ffff:ffff,US -2620:0:a0::,2620::a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:b0::,2620::b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:c0::,2620::c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:f0::,2620::f0:ffff:ffff:ffff:ffff:ffff,CA -2620:0:100::,2620::100:ffff:ffff:ffff:ffff:ffff,US -2620:0:110::,2620::110:ffff:ffff:ffff:ffff:ffff,US -2620:0:120::,2620::120:ffff:ffff:ffff:ffff:ffff,US -2620:0:140::,2620::140:ffff:ffff:ffff:ffff:ffff,US -2620:0:150::,2620::150:ffff:ffff:ffff:ffff:ffff,US -2620:0:160::,2620::160:ffff:ffff:ffff:ffff:ffff,CA -2620:0:170::,2620::170:ffff:ffff:ffff:ffff:ffff,US -2620:0:180::,2620::180:ffff:ffff:ffff:ffff:ffff,US -2620:0:190::,2620::190:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a0::,2620::1a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1b0::,2620::1b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1c0::,2620::1c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1d0::,2620::1d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1f0::,2620::1f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:200::,2620::200:ffff:ffff:ffff:ffff:ffff,US -2620:0:210::,2620::210:ffff:ffff:ffff:ffff:ffff,US -2620:0:220::,2620::220:ffff:ffff:ffff:ffff:ffff,US -2620:0:230::,2620::230:ffff:ffff:ffff:ffff:ffff,CA -2620:0:240::,2620::240:ffff:ffff:ffff:ffff:ffff,US -2620:0:250::,2620::250:ffff:ffff:ffff:ffff:ffff,US -2620:0:260::,2620::260:ffff:ffff:ffff:ffff:ffff,US -2620:0:280::,2620::280:ffff:ffff:ffff:ffff:ffff,US -2620:0:290::,2620::290:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b0::,2620::2b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2c0::,2620::2c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2d0::,2620::2d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2f0::,2620::2f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:300::,2620::300:ffff:ffff:ffff:ffff:ffff,US -2620:0:320::,2620::320:ffff:ffff:ffff:ffff:ffff,US -2620:0:350::,2620::353:ffff:ffff:ffff:ffff:ffff,US -2620:0:360::,2620::361:ffff:ffff:ffff:ffff:ffff,US -2620:0:390::,2620::390:ffff:ffff:ffff:ffff:ffff,US -2620:0:3b0::,2620::3b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:3c0::,2620::3c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:3e0::,2620::3e0:ffff:ffff:ffff:ffff:ffff,US -2620:0:3f0::,2620::3f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:400::,2620::57f:ffff:ffff:ffff:ffff:ffff,US -2620:0:600::,2620::600:ffff:ffff:ffff:ffff:ffff,US -2620:0:610::,2620::61f:ffff:ffff:ffff:ffff:ffff,US -2620:0:630::,2620::630:ffff:ffff:ffff:ffff:ffff,US -2620:0:640::,2620::640:ffff:ffff:ffff:ffff:ffff,US -2620:0:650::,2620::650:ffff:ffff:ffff:ffff:ffff,US -2620:0:660::,2620::660:ffff:ffff:ffff:ffff:ffff,US -2620:0:670::,2620::671:ffff:ffff:ffff:ffff:ffff,US -2620:0:680::,2620::680:ffff:ffff:ffff:ffff:ffff,US -2620:0:690::,2620::6a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:6b0::,2620::6b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:6c0::,2620::6c7:ffff:ffff:ffff:ffff:ffff,US -2620:0:6d0::,2620::6d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:6e0::,2620::6e0:ffff:ffff:ffff:ffff:ffff,US -2620:0:6f0::,2620::6f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:700::,2620::77f:ffff:ffff:ffff:ffff:ffff,US -2620:0:800::,2620::802:ffff:ffff:ffff:ffff:ffff,US -2620:0:810::,2620::810:ffff:ffff:ffff:ffff:ffff,CA -2620:0:840::,2620::840:ffff:ffff:ffff:ffff:ffff,US -2620:0:850::,2620::850:ffff:ffff:ffff:ffff:ffff,US -2620:0:860::,2620::863:ffff:ffff:ffff:ffff:ffff,US -2620:0:870::,2620::877:ffff:ffff:ffff:ffff:ffff,US -2620:0:880::,2620::880:ffff:ffff:ffff:ffff:ffff,US -2620:0:890::,2620::890:ffff:ffff:ffff:ffff:ffff,US -2620:0:8a0::,2620::8a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:8d0::,2620::8d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:8e0::,2620::8e0:ffff:ffff:ffff:ffff:ffff,US -2620:0:8f0::,2620::8f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:910::,2620::910:ffff:ffff:ffff:ffff:ffff,US -2620:0:920::,2620::920:ffff:ffff:ffff:ffff:ffff,US -2620:0:930::,2620::930:ffff:ffff:ffff:ffff:ffff,US -2620:0:940::,2620::940:ffff:ffff:ffff:ffff:ffff,US -2620:0:950::,2620::950:ffff:ffff:ffff:ffff:ffff,US -2620:0:960::,2620::960:ffff:ffff:ffff:ffff:ffff,US -2620:0:970::,2620::970:ffff:ffff:ffff:ffff:ffff,US -2620:0:980::,2620::980:ffff:ffff:ffff:ffff:ffff,US -2620:0:990::,2620::990:ffff:ffff:ffff:ffff:ffff,US -2620:0:9a0::,2620::9a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:9b0::,2620::9b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:9c0::,2620::9c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:9e0::,2620::9e0:ffff:ffff:ffff:ffff:ffff,US -2620:0:9f0::,2620::9f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:a00::,2620::a1f:ffff:ffff:ffff:ffff:ffff,US -2620:0:b00::,2620::b00:ffff:ffff:ffff:ffff:ffff,US -2620:0:b10::,2620::b13:ffff:ffff:ffff:ffff:ffff,US -2620:0:b20::,2620::b20:ffff:ffff:ffff:ffff:ffff,US -2620:0:b30::,2620::b30:ffff:ffff:ffff:ffff:ffff,US -2620:0:b40::,2620::b40:ffff:ffff:ffff:ffff:ffff,US -2620:0:b60::,2620::b61:ffff:ffff:ffff:ffff:ffff,US -2620:0:b80::,2620::b80:ffff:ffff:ffff:ffff:ffff,US -2620:0:b90::,2620::b90:ffff:ffff:ffff:ffff:ffff,US -2620:0:ba0::,2620::ba0:ffff:ffff:ffff:ffff:ffff,US -2620:0:bb0::,2620::bb0:ffff:ffff:ffff:ffff:ffff,US -2620:0:bd0::,2620::bd0:ffff:ffff:ffff:ffff:ffff,CA -2620:0:be0::,2620::be0:ffff:ffff:ffff:ffff:ffff,US -2620:0:bf0::,2620::bf0:ffff:ffff:ffff:ffff:ffff,US -2620:0:c10::,2620::c20:ffff:ffff:ffff:ffff:ffff,US -2620:0:c30::,2620::c30:ffff:ffff:ffff:ffff:ffff,US -2620:0:c40::,2620::c40:ffff:ffff:ffff:ffff:ffff,US -2620:0:c60::,2620::c60:ffff:ffff:ffff:ffff:ffff,US -2620:0:c70::,2620::c70:ffff:ffff:ffff:ffff:ffff,US -2620:0:c80::,2620::c80:ffff:ffff:ffff:ffff:ffff,US -2620:0:c90::,2620::ca0:ffff:ffff:ffff:ffff:ffff,US -2620:0:cb0::,2620::cb0:ffff:ffff:ffff:ffff:ffff,US -2620:0:cc0::,2620::cc3:ffff:ffff:ffff:ffff:ffff,US -2620:0:cc4::,2620::cc4:ffff:ffff:ffff:ffff:ffff,NL -2620:0:cc5::,2620::cc6:ffff:ffff:ffff:ffff:ffff,US -2620:0:cc7::,2620::cc7:ffff:ffff:ffff:ffff:ffff,DE -2620:0:cc8::,2620::cc9:ffff:ffff:ffff:ffff:ffff,US -2620:0:cca::,2620::cca:ffff:ffff:ffff:ffff:ffff,SG -2620:0:ccb::,2620::ccd:ffff:ffff:ffff:ffff:ffff,US -2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,CN -2620:0:ccf::,2620::ccf:ffff:ffff:ffff:ffff:ffff,AU -2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US -2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US -2620:0:d20::,2620::d20:ffff:ffff:ffff:ffff:ffff,US -2620:0:d30::,2620::d30:ffff:ffff:ffff:ffff:ffff,US -2620:0:d50::,2620::d50:ffff:ffff:ffff:ffff:ffff,US -2620:0:d60::,2620::d63:ffff:ffff:ffff:ffff:ffff,US -2620:0:d70::,2620::d77:ffff:ffff:ffff:ffff:ffff,US -2620:0:d80::,2620::d80:ffff:ffff:ffff:ffff:ffff,US -2620:0:d90::,2620::d90:ffff:ffff:ffff:ffff:ffff,US -2620:0:dc0::,2620::dc0:ffff:ffff:ffff:ffff:ffff,US -2620:0:dd0::,2620::dd0:ffff:ffff:ffff:ffff:ffff,US -2620:0:de0::,2620::de0:ffff:ffff:ffff:ffff:ffff,US -2620:0:df0::,2620::df0:ffff:ffff:ffff:ffff:ffff,US -2620:0:e00::,2620::e00:ffff:ffff:ffff:ffff:ffff,US -2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US -2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US -2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US -2620:0:e50::,2620::e60:ffff:ffff:ffff:ffff:ffff,US -2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US -2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US -2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US -2620:0:ed0::,2620::ed0:7fff:ffff:ffff:ffff:ffff,CN -2620:0:ed0:8000::,2620::ed0:ffff:ffff:ffff:ffff:ffff,US -2620:0:ee0::,2620::ee0:ffff:ffff:ffff:ffff:ffff,US -2620:0:ef0::,2620::ef0:ffff:ffff:ffff:ffff:ffff,US -2620:0:f00::,2620::f7f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1000::,2620::100b:ffff:ffff:ffff:ffff:ffff,US -2620:0:100c::,2620::100c:ffff:ffff:ffff:ffff:ffff,CA -2620:0:100d::,2620::1010:ffff:ffff:ffff:ffff:ffff,US -2620:0:1011::,2620::1011:ffff:ffff:ffff:ffff:ffff,AR -2620:0:1012::,2620::101f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1020::,2620::1020:7fff:ffff:ffff:ffff:ffff,MX -2620:0:1020:8000::,2620::1024:ffff:ffff:ffff:ffff:ffff,US -2620:0:1025::,2620::1025:ffff:ffff:ffff:ffff:ffff,BR -2620:0:1026::,2620::1034:ffff:ffff:ffff:ffff:ffff,US -2620:0:1035::,2620::1035:ffff:ffff:ffff:ffff:ffff,CA -2620:0:1036::,2620::103f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1040::,2620::1040:7fff:ffff:ffff:ffff:ffff,IE -2620:0:1040:8000::,2620::1041:ffff:ffff:ffff:ffff:ffff,US -2620:0:1042::,2620::1042:ffff:ffff:ffff:ffff:ffff,GB -2620:0:1043::,2620::1043:ffff:ffff:ffff:ffff:ffff,SE -2620:0:1044::,2620::1044:ffff:ffff:ffff:ffff:ffff,US -2620:0:1045::,2620::1045:ffff:ffff:ffff:ffff:ffff,IL -2620:0:1046::,2620::1046:ffff:ffff:ffff:ffff:ffff,US -2620:0:1047::,2620::1047:ffff:ffff:ffff:ffff:ffff,PL -2620:0:1048::,2620::1048:ffff:ffff:ffff:ffff:ffff,IL -2620:0:1049::,2620::1049:ffff:ffff:ffff:ffff:ffff,DE -2620:0:104a::,2620::104a:7fff:ffff:ffff:ffff:ffff,AE -2620:0:104a:8000::,2620::104a:ffff:ffff:ffff:ffff:ffff,US -2620:0:104b::,2620::104b:ffff:ffff:ffff:ffff:ffff,NL -2620:0:104c::,2620::104f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1050::,2620::1050:ffff:ffff:ffff:ffff:ffff,GB -2620:0:1051::,2620::1051:ffff:ffff:ffff:ffff:ffff,ES -2620:0:1052::,2620::1052:7fff:ffff:ffff:ffff:ffff,IE -2620:0:1052:8000::,2620::1052:ffff:ffff:ffff:ffff:ffff,US -2620:0:1053::,2620::1053:ffff:ffff:ffff:ffff:ffff,FR -2620:0:1054::,2620::1054:ffff:ffff:ffff:ffff:ffff,US -2620:0:1055::,2620::1055:ffff:ffff:ffff:ffff:ffff,BE -2620:0:1056::,2620::1058:ffff:ffff:ffff:ffff:ffff,US -2620:0:1059::,2620::1059:7fff:ffff:ffff:ffff:ffff,DK -2620:0:1059:8000::,2620::105e:ffff:ffff:ffff:ffff:ffff,US -2620:0:105f::,2620::105f:ffff:ffff:ffff:ffff:ffff,CH -2620:0:1060::,2620::1060:ffff:ffff:ffff:ffff:ffff,US -2620:0:1061::,2620::1061:7fff:ffff:ffff:ffff:ffff,CH -2620:0:1061:8000::,2620::1068:ffff:ffff:ffff:ffff:ffff,US -2620:0:1069::,2620::1069:7fff:ffff:ffff:ffff:ffff,PL -2620:0:1069:8000::,2620::1069:ffff:ffff:ffff:ffff:ffff,US -2620:0:106a::,2620::106a:7fff:ffff:ffff:ffff:ffff,PT -2620:0:106a:8000::,2620::106a:ffff:ffff:ffff:ffff:ffff,US -2620:0:106b::,2620::106b:ffff:ffff:ffff:ffff:ffff,RU -2620:0:106c::,2620::106e:ffff:ffff:ffff:ffff:ffff,US -2620:0:106f::,2620::106f:ffff:ffff:ffff:ffff:ffff,CZ -2620:0:1070::,2620::1070:7fff:ffff:ffff:ffff:ffff,DE -2620:0:1070:8000::,2620::1072:ffff:ffff:ffff:ffff:ffff,US -2620:0:1073::,2620::1073:ffff:ffff:ffff:ffff:ffff,GB -2620:0:1074::,2620::1074:7fff:ffff:ffff:ffff:ffff,IE -2620:0:1074:8000::,2620::1077:ffff:ffff:ffff:ffff:ffff,US -2620:0:1078::,2620::1078:7fff:ffff:ffff:ffff:ffff,NG -2620:0:1078:8000::,2620::1079:ffff:ffff:ffff:ffff:ffff,US -2620:0:107a::,2620::107a:ffff:ffff:ffff:ffff:ffff,IE -2620:0:107b::,2620::107b:ffff:ffff:ffff:ffff:ffff,US -2620:0:107c::,2620::107c:7fff:ffff:ffff:ffff:ffff,GR -2620:0:107c:8000::,2620::107e:ffff:ffff:ffff:ffff:ffff,US -2620:0:107f::,2620::107f:7fff:ffff:ffff:ffff:ffff,FR -2620:0:107f:8000::,2620::107f:ffff:ffff:ffff:ffff:ffff,BE -2620:0:1080::,2620::10cb:ffff:ffff:ffff:ffff:ffff,US -2620:0:10cc::,2620::10cc:7fff:ffff:ffff:ffff:ffff,CN -2620:0:10cc:8000::,2620::10e7:ffff:ffff:ffff:ffff:ffff,US -2620:0:10e8::,2620::10e8:ffff:ffff:ffff:ffff:ffff,AR -2620:0:10e9::,2620::10ff:ffff:ffff:ffff:ffff:ffff,US -2620:0:1400::,2620::143f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1500::,2620::157f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1600::,2620::167f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1700::,2620::170f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1800::,2620::181f:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a00::,2620::1a00:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a10::,2620::1a10:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a20::,2620::1a20:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a30::,2620::1a30:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a40::,2620::1a40:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a50::,2620::1a50:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a70::,2620::1a70:ffff:ffff:ffff:ffff:ffff,US -2620:0:1a80::,2620::1a80:ffff:ffff:ffff:ffff:ffff,US -2620:0:1aa0::,2620::1aa0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1ab0::,2620::1ab0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1ac0::,2620::1ac0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1ad0::,2620::1ad7:ffff:ffff:ffff:ffff:ffff,US -2620:0:1ae0::,2620::1ae0:ffff:ffff:ffff:ffff:ffff,US -2620:0:1af0::,2620::1af0:ffff:ffff:ffff:ffff:ffff,CA -2620:0:1b00::,2620::1b07:ffff:ffff:ffff:ffff:ffff,US -2620:0:1c00::,2620::1cff:ffff:ffff:ffff:ffff:ffff,US -2620:0:2000::,2620::203f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2210::,2620::2210:ffff:ffff:ffff:ffff:ffff,US -2620:0:2220::,2620::222f:ffff:ffff:ffff:ffff:ffff,CA -2620:0:2240::,2620::2240:ffff:ffff:ffff:ffff:ffff,US -2620:0:2250::,2620::2250:ffff:ffff:ffff:ffff:ffff,US -2620:0:2260::,2620::2260:ffff:ffff:ffff:ffff:ffff,US -2620:0:2280::,2620::2280:ffff:ffff:ffff:ffff:ffff,US -2620:0:2290::,2620::2290:ffff:ffff:ffff:ffff:ffff,US -2620:0:22a0::,2620::22a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:22b0::,2620::22b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:22c0::,2620::22c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:22d0::,2620::22d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:22e0::,2620::22e0:ffff:ffff:ffff:ffff:ffff,CA -2620:0:22f0::,2620::22f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2300::,2620::230f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2400::,2620::24ff:ffff:ffff:ffff:ffff:ffff,US -2620:0:2800::,2620::2800:ffff:ffff:ffff:ffff:ffff,US -2620:0:2810::,2620::2810:ffff:ffff:ffff:ffff:ffff,US -2620:0:2820::,2620::2820:ffff:ffff:ffff:ffff:ffff,US -2620:0:2830::,2620::2830:ffff:ffff:ffff:ffff:ffff,US -2620:0:2840::,2620::2840:ffff:ffff:ffff:ffff:ffff,US -2620:0:2850::,2620::2850:ffff:ffff:ffff:ffff:ffff,US -2620:0:2880::,2620::2880:ffff:ffff:ffff:ffff:ffff,US -2620:0:28a0::,2620::28b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:28d0::,2620::28d0:ffff:ffff:ffff:ffff:ffff,US -2620:0:28f0::,2620::28f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2900::,2620::290f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2a00::,2620::2a1f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b00::,2620::2b00:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b10::,2620::2b20:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b30::,2620::2b40:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b50::,2620::2b50:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b60::,2620::2b60:ffff:ffff:ffff:ffff:ffff,US -2620:0:2b70::,2620::2b8f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2bc0::,2620::2bc3:ffff:ffff:ffff:ffff:ffff,US -2620:0:2be0::,2620::2be0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2d00::,2620::2d7f:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e00::,2620::2e00:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e10::,2620::2e10:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e30::,2620::2e30:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e40::,2620::2e40:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e50::,2620::2e60:ffff:ffff:ffff:ffff:ffff,US -2620:0:2e70::,2620::2e80:ffff:ffff:ffff:ffff:ffff,US -2620:0:2ea0::,2620::2eb0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2ed0::,2620::2ed0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2ee0::,2620::2ee0:ffff:ffff:ffff:ffff:ffff,US -2620:0:2f00::,2620::2f7f:ffff:ffff:ffff:ffff:ffff,US -2620:0:5000::,2620::5000:ffff:ffff:ffff:ffff:ffff,US -2620:0:5010::,2620::5010:ffff:ffff:ffff:ffff:ffff,US -2620:0:5030::,2620::5030:ffff:ffff:ffff:ffff:ffff,US -2620:0:5040::,2620::5040:ffff:ffff:ffff:ffff:ffff,US -2620:0:5050::,2620::5050:ffff:ffff:ffff:ffff:ffff,US -2620:0:5060::,2620::5060:ffff:ffff:ffff:ffff:ffff,CA -2620:0:5070::,2620::5070:ffff:ffff:ffff:ffff:ffff,US -2620:0:5080::,2620::5080:ffff:ffff:ffff:ffff:ffff,US -2620:0:5090::,2620::5090:ffff:ffff:ffff:ffff:ffff,US -2620:0:50a0::,2620::50a0:ffff:ffff:ffff:ffff:ffff,US -2620:0:50b0::,2620::50b0:ffff:ffff:ffff:ffff:ffff,US -2620:0:50c0::,2620::50c0:ffff:ffff:ffff:ffff:ffff,US -2620:0:50d0::,2620::50d1:ffff:ffff:ffff:ffff:ffff,US -2620:0:50e0::,2620::50e0:ffff:ffff:ffff:ffff:ffff,US -2620:0:50f0::,2620::50f0:ffff:ffff:ffff:ffff:ffff,US -2620:0:5100::,2620::510f:ffff:ffff:ffff:ffff:ffff,US -2620:0:5200::,2620::5200:ffff:ffff:ffff:ffff:ffff,US -2620:0:5300::,2620::530f:ffff:ffff:ffff:ffff:ffff,US -2620:0:7f00::,2620::7f00:ffff:ffff:ffff:ffff:ffff,CA -2620:0:aa00::,2620::aa00:ffff:ffff:ffff:ffff:ffff,US -2620:0:d500::,2620::d500:ffff:ffff:ffff:ffff:ffff,US -2620:1::,2620:1::ffff:ffff:ffff:ffff:ffff,US -2620:1:2000::,2620:1:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1:4000::,2620:1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1:6000::,2620:1:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1:8000::,2620:1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1:a000::,2620:1:a000:ffff:ffff:ffff:ffff:ffff,US -2620:1:c000::,2620:1:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1:e000::,2620:1:e000:ffff:ffff:ffff:ffff:ffff,US -2620:2::,2620:2::ffff:ffff:ffff:ffff:ffff,US -2620:2:2000::,2620:2:2000:ffff:ffff:ffff:ffff:ffff,US -2620:2:4000::,2620:2:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:2:6000::,2620:2:6000:ffff:ffff:ffff:ffff:ffff,US -2620:2:8000::,2620:2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:2:a000::,2620:2:a000:ffff:ffff:ffff:ffff:ffff,US -2620:2:c000::,2620:2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:2:e000::,2620:2:e000:ffff:ffff:ffff:ffff:ffff,US -2620:3::,2620:3::ffff:ffff:ffff:ffff:ffff,US -2620:3:2000::,2620:3:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:3:4000::,2620:3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:3:6000::,2620:3:6000:ffff:ffff:ffff:ffff:ffff,US -2620:3:8000::,2620:3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3:a000::,2620:3:a000:ffff:ffff:ffff:ffff:ffff,CA -2620:3:c000::,2620:3:c000:ffff:ffff:ffff:ffff:ffff,US -2620:3:e000::,2620:3:e000:ffff:ffff:ffff:ffff:ffff,US -2620:4::,2620:4::ffff:ffff:ffff:ffff:ffff,US -2620:4:2000::,2620:4:2000:ffff:ffff:ffff:ffff:ffff,US -2620:4:4000::,2620:4:4000:ffff:ffff:ffff:ffff:ffff,US -2620:4:6000::,2620:4:6000:ffff:ffff:ffff:ffff:ffff,US -2620:4:8000::,2620:4:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4:a000::,2620:4:a000:ffff:ffff:ffff:ffff:ffff,US -2620:4:c000::,2620:4:c000:ffff:ffff:ffff:ffff:ffff,US -2620:4:e000::,2620:4:e000:ffff:ffff:ffff:ffff:ffff,US -2620:5::,2620:5::ffff:ffff:ffff:ffff:ffff,US -2620:5:2000::,2620:5:2000:ffff:ffff:ffff:ffff:ffff,US -2620:5:4000::,2620:5:400f:ffff:ffff:ffff:ffff:ffff,US -2620:5:8000::,2620:5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5:a000::,2620:5:a000:ffff:ffff:ffff:ffff:ffff,US -2620:5:c000::,2620:5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:5:e000::,2620:5:e000:ffff:ffff:ffff:ffff:ffff,US -2620:6::,2620:6::ffff:ffff:ffff:ffff:ffff,CA -2620:6:2000::,2620:6:200f:ffff:ffff:ffff:ffff:ffff,US -2620:6:4000::,2620:6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:6:6000::,2620:6:6000:ffff:ffff:ffff:ffff:ffff,US -2620:6:8000::,2620:6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:6:a000::,2620:6:a000:ffff:ffff:ffff:ffff:ffff,US -2620:6:c000::,2620:6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:6:e000::,2620:6:e000:ffff:ffff:ffff:ffff:ffff,US -2620:7::,2620:7::ffff:ffff:ffff:ffff:ffff,US -2620:7:2000::,2620:7:2000:ffff:ffff:ffff:ffff:ffff,US -2620:7:4000::,2620:7:4000:ffff:ffff:ffff:ffff:ffff,US -2620:7:6000::,2620:7:6000:ffff:ffff:ffff:ffff:ffff,US -2620:7:8000::,2620:7:8000:ffff:ffff:ffff:ffff:ffff,US -2620:7:a000::,2620:7:a000:ffff:ffff:ffff:ffff:ffff,US -2620:7:c000::,2620:7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:7:e000::,2620:7:e000:ffff:ffff:ffff:ffff:ffff,US -2620:8::,2620:8:7f:ffff:ffff:ffff:ffff:ffff,CA -2620:8:4300::,2620:8:4300:ffff:ffff:ffff:ffff:ffff,US -2620:8:8200::,2620:8:8200:ffff:ffff:ffff:ffff:ffff,US -2620:8:c100::,2620:8:c100:ffff:ffff:ffff:ffff:ffff,US -2620:9::,2620:9::ffff:ffff:ffff:ffff:ffff,US -2620:9:2000::,2620:9:2000:ffff:ffff:ffff:ffff:ffff,US -2620:9:4000::,2620:9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:9:6000::,2620:9:6000:ffff:ffff:ffff:ffff:ffff,US -2620:9:8000::,2620:9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:9:a000::,2620:9:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:9:c000::,2620:9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:9:e000::,2620:9:e000:ffff:ffff:ffff:ffff:ffff,US -2620:a::,2620:a:f:ffff:ffff:ffff:ffff:ffff,CA -2620:a:2000::,2620:a:2000:ffff:ffff:ffff:ffff:ffff,US -2620:a:4000::,2620:a:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a:6000::,2620:a:6000:ffff:ffff:ffff:ffff:ffff,US -2620:a:8000::,2620:a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a:a000::,2620:a:a000:ffff:ffff:ffff:ffff:ffff,US -2620:a:c000::,2620:a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a:e000::,2620:a:e000:ffff:ffff:ffff:ffff:ffff,US -2620:b::,2620:b::ffff:ffff:ffff:ffff:ffff,US -2620:b:2000::,2620:b:2000:ffff:ffff:ffff:ffff:ffff,US -2620:b:4000::,2620:b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b:8000::,2620:b:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b:c000::,2620:b:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b:e000::,2620:b:e000:ffff:ffff:ffff:ffff:ffff,CA -2620:c::,2620:c:f:ffff:ffff:ffff:ffff:ffff,US -2620:c:2000::,2620:c:2000:ffff:ffff:ffff:ffff:ffff,US -2620:c:4000::,2620:c:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c:6000::,2620:c:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:c:8000::,2620:c:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c:a000::,2620:c:a000:ffff:ffff:ffff:ffff:ffff,US -2620:c:c000::,2620:c:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c:e000::,2620:c:e000:ffff:ffff:ffff:ffff:ffff,US -2620:d::,2620:d::ffff:ffff:ffff:ffff:ffff,US -2620:d:2000::,2620:d:2000:ffff:ffff:ffff:ffff:ffff,US -2620:d:4000::,2620:d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d:6000::,2620:d:6000:ffff:ffff:ffff:ffff:ffff,US -2620:d:a000::,2620:d:a000:ffff:ffff:ffff:ffff:ffff,US -2620:d:c000::,2620:d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d:e000::,2620:d:e000:ffff:ffff:ffff:ffff:ffff,US -2620:e::,2620:e::ffff:ffff:ffff:ffff:ffff,US -2620:e:2000::,2620:e:2000:ffff:ffff:ffff:ffff:ffff,US -2620:e:4000::,2620:e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e:6000::,2620:e:6000:ffff:ffff:ffff:ffff:ffff,US -2620:e:8000::,2620:e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e:a000::,2620:e:a000:ffff:ffff:ffff:ffff:ffff,US -2620:e:c000::,2620:e:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e:e000::,2620:e:e000:ffff:ffff:ffff:ffff:ffff,US -2620:f::,2620:f:f:ffff:ffff:ffff:ffff:ffff,US -2620:f:2000::,2620:f:2000:ffff:ffff:ffff:ffff:ffff,US -2620:f:4000::,2620:f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f:6000::,2620:f:6000:ffff:ffff:ffff:ffff:ffff,US -2620:f:8000::,2620:f:8000:ffff:ffff:ffff:ffff:ffff,AE -2620:f:a000::,2620:f:a000:ffff:ffff:ffff:ffff:ffff,US -2620:f:c000::,2620:f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f:e000::,2620:f:e000:ffff:ffff:ffff:ffff:ffff,US -2620:10::,2620:10::ffff:ffff:ffff:ffff:ffff,US -2620:10:2000::,2620:10:2000:ffff:ffff:ffff:ffff:ffff,US -2620:10:4000::,2620:10:4000:ffff:ffff:ffff:ffff:ffff,US -2620:10:6000::,2620:10:6000:ffff:ffff:ffff:ffff:ffff,US -2620:10:8000::,2620:10:800f:ffff:ffff:ffff:ffff:ffff,CA -2620:10:a000::,2620:10:a000:ffff:ffff:ffff:ffff:ffff,US -2620:10:c000::,2620:10:c000:ffff:ffff:ffff:ffff:ffff,US -2620:10:e000::,2620:10:e000:ffff:ffff:ffff:ffff:ffff,US -2620:11::,2620:11:ff:ffff:ffff:ffff:ffff:ffff,US -2620:11:4000::,2620:11:4000:ffff:ffff:ffff:ffff:ffff,US -2620:11:6000::,2620:11:6000:ffff:ffff:ffff:ffff:ffff,US -2620:11:8000::,2620:11:8000:ffff:ffff:ffff:ffff:ffff,US -2620:11:a000::,2620:11:a000:ffff:ffff:ffff:ffff:ffff,US -2620:11:c000::,2620:11:c000:ffff:ffff:ffff:ffff:ffff,US -2620:11:e000::,2620:11:e000:ffff:ffff:ffff:ffff:ffff,US -2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US -2620:12:2000::,2620:12:2000:ffff:ffff:ffff:ffff:ffff,US -2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US -2620:12:6000::,2620:12:6000:ffff:ffff:ffff:ffff:ffff,US -2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US -2620:12:a000::,2620:12:a000:ffff:ffff:ffff:ffff:ffff,US -2620:12:c000::,2620:12:c000:ffff:ffff:ffff:ffff:ffff,US -2620:12:e000::,2620:12:e000:ffff:ffff:ffff:ffff:ffff,US -2620:13::,2620:13::ffff:ffff:ffff:ffff:ffff,CA -2620:13:2000::,2620:13:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:13:4000::,2620:13:4000:ffff:ffff:ffff:ffff:ffff,US -2620:13:6000::,2620:13:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US -2620:13:a000::,2620:13:a000:ffff:ffff:ffff:ffff:ffff,US -2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US -2620:13:e000::,2620:13:e000:ffff:ffff:ffff:ffff:ffff,US -2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US -2620:14:2000::,2620:14:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US -2620:14:6000::,2620:14:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US -2620:14:a000::,2620:14:a000:ffff:ffff:ffff:ffff:ffff,US -2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:14:e000::,2620:14:e000:ffff:ffff:ffff:ffff:ffff,US -2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US -2620:15:2000::,2620:15:2000:ffff:ffff:ffff:ffff:ffff,US -2620:15:6000::,2620:15:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US -2620:15:a000::,2620:15:a000:ffff:ffff:ffff:ffff:ffff,US -2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US -2620:15:e000::,2620:15:e000:ffff:ffff:ffff:ffff:ffff,US -2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA -2620:16:2000::,2620:16:2000:ffff:ffff:ffff:ffff:ffff,US -2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US -2620:16:6000::,2620:16:6000:ffff:ffff:ffff:ffff:ffff,US -2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US -2620:16:a000::,2620:16:a000:ffff:ffff:ffff:ffff:ffff,US -2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US -2620:16:e000::,2620:16:e000:ffff:ffff:ffff:ffff:ffff,US -2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US -2620:17:2000::,2620:17:2000:ffff:ffff:ffff:ffff:ffff,US -2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US -2620:17:6000::,2620:17:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US -2620:17:a000::,2620:17:a000:ffff:ffff:ffff:ffff:ffff,US -2620:17:c000::,2620:17:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:17:e000::,2620:17:e000:ffff:ffff:ffff:ffff:ffff,US -2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US -2620:18:2000::,2620:18:2000:ffff:ffff:ffff:ffff:ffff,US -2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US -2620:18:6000::,2620:18:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US -2620:18:a000::,2620:18:a000:ffff:ffff:ffff:ffff:ffff,US -2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN -2620:18:e000::,2620:18:e000:ffff:ffff:ffff:ffff:ffff,US -2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US -2620:19:2000::,2620:19:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:19:6000::,2620:19:6000:ffff:ffff:ffff:ffff:ffff,US -2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US -2620:19:a000::,2620:19:a000:ffff:ffff:ffff:ffff:ffff,US -2620:19:e000::,2620:19:e00f:ffff:ffff:ffff:ffff:ffff,CA -2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US -2620:1a:2000::,2620:1a:200f:ffff:ffff:ffff:ffff:ffff,US -2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1a:6000::,2620:1a:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:1a:8000::,2620:1a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1a:a000::,2620:1a:a000:ffff:ffff:ffff:ffff:ffff,US -2620:1a:c000::,2620:1a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1a:e000::,2620:1a:e000:ffff:ffff:ffff:ffff:ffff,US -2620:1b::,2620:1b:f:ffff:ffff:ffff:ffff:ffff,US -2620:1b:2000::,2620:1b:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:4000::,2620:1b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:6000::,2620:1b:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:8000::,2620:1b:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:a000::,2620:1b:a000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:c000::,2620:1b:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1b:e000::,2620:1b:e000:ffff:ffff:ffff:ffff:ffff,US -2620:1c::,2620:1c::ffff:ffff:ffff:ffff:ffff,US -2620:1c:2000::,2620:1c:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:4000::,2620:1c:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:6000::,2620:1c:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:8000::,2620:1c:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:a000::,2620:1c:a000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:c000::,2620:1c:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1c:e000::,2620:1c:e000:ffff:ffff:ffff:ffff:ffff,US -2620:1d::,2620:1d:f:ffff:ffff:ffff:ffff:ffff,US -2620:1d:2000::,2620:1d:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1d:6000::,2620:1d:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1d:8000::,2620:1d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1d:c000::,2620:1d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1d:e000::,2620:1d:e000:ffff:ffff:ffff:ffff:ffff,US -2620:1e::,2620:1e::ffff:ffff:ffff:ffff:ffff,US -2620:1e:2000::,2620:1e:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1e:4000::,2620:1e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:1e:6000::,2620:1e:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1e:8000::,2620:1e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:1e:a000::,2620:1e:a000:ffff:ffff:ffff:ffff:ffff,VG -2620:1e:c000::,2620:1e:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1e:e000::,2620:1e:e000:ffff:ffff:ffff:ffff:ffff,US -2620:1f::,2620:1f::ffff:ffff:ffff:ffff:ffff,US -2620:1f:2000::,2620:1f:2000:ffff:ffff:ffff:ffff:ffff,US -2620:1f:4000::,2620:1f:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:1f:6000::,2620:1f:6000:ffff:ffff:ffff:ffff:ffff,US -2620:1f:8000::,2620:1f:800f:ffff:ffff:ffff:ffff:ffff,US -2620:1f:a000::,2620:1f:a000:ffff:ffff:ffff:ffff:ffff,US -2620:1f:c000::,2620:1f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:1f:e000::,2620:1f:e000:ffff:ffff:ffff:ffff:ffff,US -2620:20::,2620:20::ffff:ffff:ffff:ffff:ffff,US -2620:20:2000::,2620:20:2000:ffff:ffff:ffff:ffff:ffff,US -2620:20:4000::,2620:20:4000:ffff:ffff:ffff:ffff:ffff,US -2620:20:6000::,2620:20:6000:ffff:ffff:ffff:ffff:ffff,US -2620:20:8000::,2620:20:8000:ffff:ffff:ffff:ffff:ffff,US -2620:20:a000::,2620:20:a000:ffff:ffff:ffff:ffff:ffff,US -2620:20:c000::,2620:20:c000:ffff:ffff:ffff:ffff:ffff,US -2620:20:e000::,2620:20:e000:ffff:ffff:ffff:ffff:ffff,US -2620:21::,2620:21::ffff:ffff:ffff:ffff:ffff,US -2620:21:2000::,2620:21:2000:ffff:ffff:ffff:ffff:ffff,US -2620:21:4000::,2620:21:4000:ffff:ffff:ffff:ffff:ffff,US -2620:21:6000::,2620:21:600f:ffff:ffff:ffff:ffff:ffff,US -2620:21:8000::,2620:21:8000:ffff:ffff:ffff:ffff:ffff,US -2620:21:a000::,2620:21:a000:ffff:ffff:ffff:ffff:ffff,US -2620:21:c000::,2620:21:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:21:e000::,2620:21:e000:ffff:ffff:ffff:ffff:ffff,US -2620:22::,2620:22::ffff:ffff:ffff:ffff:ffff,US -2620:22:2000::,2620:22:2000:ffff:ffff:ffff:ffff:ffff,US -2620:22:4000::,2620:22:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:22:6000::,2620:22:6000:ffff:ffff:ffff:ffff:ffff,US -2620:22:8000::,2620:22:8000:ffff:ffff:ffff:ffff:ffff,US -2620:22:a000::,2620:22:a000:ffff:ffff:ffff:ffff:ffff,US -2620:22:c000::,2620:22:c000:ffff:ffff:ffff:ffff:ffff,US -2620:22:e000::,2620:22:e000:ffff:ffff:ffff:ffff:ffff,US -2620:23::,2620:23::ffff:ffff:ffff:ffff:ffff,US -2620:23:4000::,2620:23:4000:ffff:ffff:ffff:ffff:ffff,US -2620:23:6000::,2620:23:6000:ffff:ffff:ffff:ffff:ffff,US -2620:23:8000::,2620:23:8000:ffff:ffff:ffff:ffff:ffff,US -2620:23:a000::,2620:23:a000:ffff:ffff:ffff:ffff:ffff,US -2620:23:c000::,2620:23:c000:ffff:ffff:ffff:ffff:ffff,US -2620:23:e000::,2620:23:e000:ffff:ffff:ffff:ffff:ffff,US -2620:24::,2620:24:1f:ffff:ffff:ffff:ffff:ffff,US -2620:24:40c0::,2620:24:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:24:8080::,2620:24:8080:ffff:ffff:ffff:ffff:ffff,US -2620:24:c040::,2620:24:c040:ffff:ffff:ffff:ffff:ffff,US -2620:25::,2620:25::ffff:ffff:ffff:ffff:ffff,US -2620:25:2000::,2620:25:2000:ffff:ffff:ffff:ffff:ffff,US -2620:25:4000::,2620:25:4000:ffff:ffff:ffff:ffff:ffff,US -2620:25:6000::,2620:25:6000:ffff:ffff:ffff:ffff:ffff,CA -2620:25:8000::,2620:25:8000:ffff:ffff:ffff:ffff:ffff,US -2620:25:a000::,2620:25:a000:ffff:ffff:ffff:ffff:ffff,US -2620:25:c000::,2620:25:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:26::,2620:26::ffff:ffff:ffff:ffff:ffff,US -2620:26:2000::,2620:26:2000:ffff:ffff:ffff:ffff:ffff,US -2620:26:4000::,2620:26:400f:ffff:ffff:ffff:ffff:ffff,US -2620:26:8000::,2620:26:8000:ffff:ffff:ffff:ffff:ffff,US -2620:26:a000::,2620:26:a000:ffff:ffff:ffff:ffff:ffff,US -2620:26:c000::,2620:26:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:27::,2620:27:f:ffff:ffff:ffff:ffff:ffff,US -2620:27:40c0::,2620:27:40c0:ffff:ffff:ffff:ffff:ffff,CA -2620:27:8080::,2620:27:8080:ffff:ffff:ffff:ffff:ffff,US -2620:27:c040::,2620:27:c040:ffff:ffff:ffff:ffff:ffff,US -2620:28::,2620:28::ffff:ffff:ffff:ffff:ffff,US -2620:28:2000::,2620:28:2000:ffff:ffff:ffff:ffff:ffff,US -2620:28:4000::,2620:28:400f:ffff:ffff:ffff:ffff:ffff,US -2620:28:8000::,2620:28:8000:ffff:ffff:ffff:ffff:ffff,US -2620:28:a000::,2620:28:a000:ffff:ffff:ffff:ffff:ffff,US -2620:28:c000::,2620:28:c000:ffff:ffff:ffff:ffff:ffff,US -2620:28:e000::,2620:28:e000:ffff:ffff:ffff:ffff:ffff,US -2620:29::,2620:29::ffff:ffff:ffff:ffff:ffff,US -2620:29:2000::,2620:29:2000:ffff:ffff:ffff:ffff:ffff,US -2620:29:4000::,2620:29:4000:ffff:ffff:ffff:ffff:ffff,US -2620:29:a000::,2620:29:a000:ffff:ffff:ffff:ffff:ffff,US -2620:29:c000::,2620:29:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:2a::,2620:2a::ffff:ffff:ffff:ffff:ffff,US -2620:2a:2000::,2620:2a:2000:ffff:ffff:ffff:ffff:ffff,US -2620:2a:4000::,2620:2a:400f:ffff:ffff:ffff:ffff:ffff,US -2620:2a:8000::,2620:2a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:2a:a000::,2620:2a:a000:ffff:ffff:ffff:ffff:ffff,US -2620:2a:c000::,2620:2a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:2a:e000::,2620:2a:e000:ffff:ffff:ffff:ffff:ffff,US -2620:2b::,2620:2b::ffff:ffff:ffff:ffff:ffff,US -2620:2b:2000::,2620:2b:2000:ffff:ffff:ffff:ffff:ffff,US -2620:2b:4000::,2620:2b:400f:ffff:ffff:ffff:ffff:ffff,US -2620:2b:8000::,2620:2b:8000:ffff:ffff:ffff:ffff:ffff,US -2620:2b:a000::,2620:2b:a000:ffff:ffff:ffff:ffff:ffff,US -2620:2b:e000::,2620:2b:e000:ffff:ffff:ffff:ffff:ffff,US -2620:2c::,2620:2c:f:ffff:ffff:ffff:ffff:ffff,US -2620:2c:40c0::,2620:2c:40c0:ffff:ffff:ffff:ffff:ffff,CA -2620:2c:8080::,2620:2c:8080:ffff:ffff:ffff:ffff:ffff,US -2620:2c:c040::,2620:2c:c040:ffff:ffff:ffff:ffff:ffff,US -2620:2d::,2620:2d::ffff:ffff:ffff:ffff:ffff,US -2620:2d:2000::,2620:2d:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:2d:4000::,2620:2d:400f:ffff:ffff:ffff:ffff:ffff,US -2620:2d:8000::,2620:2d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:2d:a000::,2620:2d:a000:ffff:ffff:ffff:ffff:ffff,US -2620:2d:c000::,2620:2d:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:2e::,2620:2e:3f:ffff:ffff:ffff:ffff:ffff,US -2620:2e:40c0::,2620:2e:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:2e:c040::,2620:2e:c040:ffff:ffff:ffff:ffff:ffff,US -2620:2f::,2620:2f::ffff:ffff:ffff:ffff:ffff,CA -2620:2f:2000::,2620:2f:2000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:4000::,2620:2f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:6000::,2620:2f:6000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:8000::,2620:2f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:a000::,2620:2f:a000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:c000::,2620:2f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:2f:e000::,2620:2f:e000:ffff:ffff:ffff:ffff:ffff,US -2620:30::,2620:30:f:ffff:ffff:ffff:ffff:ffff,US -2620:30:2000::,2620:30:2000:ffff:ffff:ffff:ffff:ffff,US -2620:30:4000::,2620:30:4000:ffff:ffff:ffff:ffff:ffff,US -2620:30:6000::,2620:30:6000:ffff:ffff:ffff:ffff:ffff,US -2620:30:8000::,2620:30:8000:ffff:ffff:ffff:ffff:ffff,US -2620:30:a000::,2620:30:a000:ffff:ffff:ffff:ffff:ffff,CA -2620:30:c000::,2620:30:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:31::,2620:31::ffff:ffff:ffff:ffff:ffff,US -2620:31:2000::,2620:31:200f:ffff:ffff:ffff:ffff:ffff,US -2620:31:4000::,2620:31:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:31:8000::,2620:31:8000:ffff:ffff:ffff:ffff:ffff,US -2620:31:a000::,2620:31:a000:ffff:ffff:ffff:ffff:ffff,US -2620:31:c000::,2620:31:c000:ffff:ffff:ffff:ffff:ffff,US -2620:31:e000::,2620:31:e000:ffff:ffff:ffff:ffff:ffff,US -2620:32::,2620:32::ffff:ffff:ffff:ffff:ffff,US -2620:32:2000::,2620:32:2000:ffff:ffff:ffff:ffff:ffff,US -2620:32:4000::,2620:32:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:32:6000::,2620:32:6000:ffff:ffff:ffff:ffff:ffff,US -2620:32:8000::,2620:32:8000:ffff:ffff:ffff:ffff:ffff,US -2620:32:a000::,2620:32:a000:ffff:ffff:ffff:ffff:ffff,US -2620:32:c000::,2620:32:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:33::,2620:33::ffff:ffff:ffff:ffff:ffff,US -2620:33:2000::,2620:33:2000:ffff:ffff:ffff:ffff:ffff,US -2620:33:4000::,2620:33:400f:ffff:ffff:ffff:ffff:ffff,US -2620:33:8000::,2620:33:8000:ffff:ffff:ffff:ffff:ffff,US -2620:33:a000::,2620:33:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:33:c000::,2620:33:c000:ffff:ffff:ffff:ffff:ffff,US -2620:33:e000::,2620:33:e000:ffff:ffff:ffff:ffff:ffff,US -2620:34::,2620:34::ffff:ffff:ffff:ffff:ffff,US -2620:34:2000::,2620:34:2000:ffff:ffff:ffff:ffff:ffff,US -2620:34:4000::,2620:34:4000:ffff:ffff:ffff:ffff:ffff,US -2620:34:6000::,2620:34:600f:ffff:ffff:ffff:ffff:ffff,US -2620:34:8000::,2620:34:8000:ffff:ffff:ffff:ffff:ffff,US -2620:34:a000::,2620:34:a000:ffff:ffff:ffff:ffff:ffff,US -2620:34:c000::,2620:34:c000:ffff:ffff:ffff:ffff:ffff,US -2620:34:e000::,2620:34:e000:ffff:ffff:ffff:ffff:ffff,US -2620:35:2000::,2620:35:2000:ffff:ffff:ffff:ffff:ffff,US -2620:35:4000::,2620:35:400f:ffff:ffff:ffff:ffff:ffff,CA -2620:35:8000::,2620:35:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:35:a000::,2620:35:a000:ffff:ffff:ffff:ffff:ffff,US -2620:35:c000::,2620:35:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:36::,2620:36::ffff:ffff:ffff:ffff:ffff,US -2620:36:2000::,2620:36:2000:ffff:ffff:ffff:ffff:ffff,US -2620:36:4000::,2620:36:400f:ffff:ffff:ffff:ffff:ffff,CA -2620:36:8000::,2620:36:8000:ffff:ffff:ffff:ffff:ffff,US -2620:36:a000::,2620:36:a000:ffff:ffff:ffff:ffff:ffff,US -2620:36:c000::,2620:36:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:36:e000::,2620:36:e000:ffff:ffff:ffff:ffff:ffff,US -2620:37::,2620:37::ffff:ffff:ffff:ffff:ffff,US -2620:37:2000::,2620:37:2000:ffff:ffff:ffff:ffff:ffff,US -2620:37:4000::,2620:37:400f:ffff:ffff:ffff:ffff:ffff,US -2620:37:8000::,2620:37:8000:ffff:ffff:ffff:ffff:ffff,US -2620:37:a000::,2620:37:a000:ffff:ffff:ffff:ffff:ffff,US -2620:37:c000::,2620:37:c000:ffff:ffff:ffff:ffff:ffff,US -2620:37:e000::,2620:37:e000:ffff:ffff:ffff:ffff:ffff,US -2620:38::,2620:38::ffff:ffff:ffff:ffff:ffff,US -2620:38:2000::,2620:38:2000:ffff:ffff:ffff:ffff:ffff,US -2620:38:4000::,2620:38:400f:ffff:ffff:ffff:ffff:ffff,US -2620:38:8000::,2620:38:8000:ffff:ffff:ffff:ffff:ffff,US -2620:38:a000::,2620:38:a000:ffff:ffff:ffff:ffff:ffff,US -2620:38:c000::,2620:38:c000:ffff:ffff:ffff:ffff:ffff,US -2620:38:e000::,2620:38:e000:ffff:ffff:ffff:ffff:ffff,US -2620:39::,2620:39::ffff:ffff:ffff:ffff:ffff,US -2620:39:2000::,2620:39:2000:ffff:ffff:ffff:ffff:ffff,US -2620:39:4000::,2620:39:4000:ffff:ffff:ffff:ffff:ffff,US -2620:39:6000::,2620:39:6000:ffff:ffff:ffff:ffff:ffff,US -2620:39:8000::,2620:39:8000:ffff:ffff:ffff:ffff:ffff,US -2620:39:a000::,2620:39:a000:ffff:ffff:ffff:ffff:ffff,US -2620:39:c000::,2620:39:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:3a::,2620:3a::ffff:ffff:ffff:ffff:ffff,US -2620:3a:2000::,2620:3a:2000:ffff:ffff:ffff:ffff:ffff,US -2620:3a:4000::,2620:3a:400f:ffff:ffff:ffff:ffff:ffff,US -2620:3a:8000::,2620:3a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3a:a000::,2620:3a:a000:ffff:ffff:ffff:ffff:ffff,US -2620:3a:c000::,2620:3a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:3a:e000::,2620:3a:e000:ffff:ffff:ffff:ffff:ffff,US -2620:3b::,2620:3b::ffff:ffff:ffff:ffff:ffff,US -2620:3b:2000::,2620:3b:2000:ffff:ffff:ffff:ffff:ffff,US -2620:3b:4000::,2620:3b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:3b:6000::,2620:3b:6000:ffff:ffff:ffff:ffff:ffff,US -2620:3b:8000::,2620:3b:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3b:a000::,2620:3b:a000:ffff:ffff:ffff:ffff:ffff,US -2620:3b:c000::,2620:3b:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:3c::,2620:3c:3f:ffff:ffff:ffff:ffff:ffff,US -2620:3c:40c0::,2620:3c:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:3c:8080::,2620:3c:8080:ffff:ffff:ffff:ffff:ffff,US -2620:3c:c040::,2620:3c:c040:ffff:ffff:ffff:ffff:ffff,US -2620:3d::,2620:3d::ffff:ffff:ffff:ffff:ffff,US -2620:3d:2000::,2620:3d:2000:ffff:ffff:ffff:ffff:ffff,CA -2620:3d:4000::,2620:3d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:3d:6000::,2620:3d:6000:ffff:ffff:ffff:ffff:ffff,US -2620:3d:8000::,2620:3d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3d:a000::,2620:3d:a000:ffff:ffff:ffff:ffff:ffff,US -2620:3d:c000::,2620:3d:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:3e::,2620:3e::ffff:ffff:ffff:ffff:ffff,US -2620:3e:4000::,2620:3e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:3e:8000::,2620:3e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3e:c000::,2620:3e:c000:ffff:ffff:ffff:ffff:ffff,US -2620:3f::,2620:3f::ffff:ffff:ffff:ffff:ffff,US -2620:3f:4000::,2620:3f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:3f:8000::,2620:3f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:3f:c000::,2620:3f:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:40::,2620:40::ffff:ffff:ffff:ffff:ffff,US -2620:40:4000::,2620:40:4000:ffff:ffff:ffff:ffff:ffff,US -2620:40:8000::,2620:40:8000:ffff:ffff:ffff:ffff:ffff,US -2620:40:c000::,2620:40:c000:ffff:ffff:ffff:ffff:ffff,US -2620:41::,2620:41:1:ffff:ffff:ffff:ffff:ffff,US -2620:41:8000::,2620:41:8000:ffff:ffff:ffff:ffff:ffff,US -2620:42::,2620:42::ffff:ffff:ffff:ffff:ffff,US -2620:42:4000::,2620:42:4000:ffff:ffff:ffff:ffff:ffff,US -2620:42:c000::,2620:42:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:43::,2620:43::ffff:ffff:ffff:ffff:ffff,US -2620:43:4000::,2620:43:4000:ffff:ffff:ffff:ffff:ffff,US -2620:43:8000::,2620:43:8000:ffff:ffff:ffff:ffff:ffff,US -2620:44::,2620:44:1:ffff:ffff:ffff:ffff:ffff,US -2620:44:4000::,2620:44:4000:ffff:ffff:ffff:ffff:ffff,US -2620:44:8000::,2620:44:8000:ffff:ffff:ffff:ffff:ffff,US -2620:45::,2620:45::ffff:ffff:ffff:ffff:ffff,CA -2620:45:4000::,2620:45:4000:ffff:ffff:ffff:ffff:ffff,US -2620:45:8000::,2620:45:8000:ffff:ffff:ffff:ffff:ffff,US -2620:45:c000::,2620:45:c000:ffff:ffff:ffff:ffff:ffff,US -2620:46::,2620:46::ffff:ffff:ffff:ffff:ffff,US -2620:46:4000::,2620:46:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:46:8000::,2620:46:8000:ffff:ffff:ffff:ffff:ffff,US -2620:46:c000::,2620:46:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:47::,2620:47::ffff:ffff:ffff:ffff:ffff,US -2620:47:4000::,2620:47:4000:ffff:ffff:ffff:ffff:ffff,US -2620:47:8000::,2620:47:8000:ffff:ffff:ffff:ffff:ffff,US -2620:47:c000::,2620:47:c000:ffff:ffff:ffff:ffff:ffff,US -2620:48::,2620:48::ffff:ffff:ffff:ffff:ffff,US -2620:48:4000::,2620:48:4000:ffff:ffff:ffff:ffff:ffff,US -2620:48:8000::,2620:48:8000:ffff:ffff:ffff:ffff:ffff,US -2620:48:c000::,2620:48:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:49::,2620:49:f:ffff:ffff:ffff:ffff:ffff,CA -2620:49:40c0::,2620:49:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:49:8080::,2620:49:8080:ffff:ffff:ffff:ffff:ffff,US -2620:49:c040::,2620:49:c040:ffff:ffff:ffff:ffff:ffff,US -2620:4a::,2620:4a::ffff:ffff:ffff:ffff:ffff,US -2620:4a:4000::,2620:4a:4000:ffff:ffff:ffff:ffff:ffff,US -2620:4a:8000::,2620:4a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4a:c000::,2620:4a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:4b::,2620:4b::ffff:ffff:ffff:ffff:ffff,CA -2620:4b:4000::,2620:4b:400f:ffff:ffff:ffff:ffff:ffff,US -2620:4b:8000::,2620:4b:800f:ffff:ffff:ffff:ffff:ffff,US -2620:4b:c000::,2620:4b:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:4c::,2620:4c:1:ffff:ffff:ffff:ffff:ffff,US -2620:4c:4000::,2620:4c:400f:ffff:ffff:ffff:ffff:ffff,US -2620:4c:8080::,2620:4c:8080:ffff:ffff:ffff:ffff:ffff,US -2620:4c:c000::,2620:4c:c000:ffff:ffff:ffff:ffff:ffff,US -2620:4d::,2620:4d::ffff:ffff:ffff:ffff:ffff,US -2620:4d:4000::,2620:4d:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:4d:8000::,2620:4d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4d:c000::,2620:4d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:4e::,2620:4e::ffff:ffff:ffff:ffff:ffff,US -2620:4e:4000::,2620:4e:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:4e:8000::,2620:4e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4f::,2620:4f::ffff:ffff:ffff:ffff:ffff,US -2620:4f:4000::,2620:4f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:4f:8000::,2620:4f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4f:c000::,2620:4f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:50::,2620:50:f:ffff:ffff:ffff:ffff:ffff,US -2620:50:4080::,2620:50:4080:ffff:ffff:ffff:ffff:ffff,US -2620:50:8000::,2620:50:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:50:8080::,2620:50:8080:ffff:ffff:ffff:ffff:ffff,US -2620:50:c040::,2620:50:c040:ffff:ffff:ffff:ffff:ffff,US -2620:51::,2620:51::ffff:ffff:ffff:ffff:ffff,US -2620:51:4000::,2620:51:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:51:8000::,2620:51:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:51:c000::,2620:51:c000:ffff:ffff:ffff:ffff:ffff,US -2620:52::,2620:52:3:ffff:ffff:ffff:ffff:ffff,US -2620:52:4000::,2620:52:4000:ffff:ffff:ffff:ffff:ffff,US -2620:52:8000::,2620:52:800f:ffff:ffff:ffff:ffff:ffff,US -2620:52:c000::,2620:52:c000:ffff:ffff:ffff:ffff:ffff,US -2620:53::,2620:53::ffff:ffff:ffff:ffff:ffff,US -2620:53:4000::,2620:53:400f:ffff:ffff:ffff:ffff:ffff,US -2620:53:8000::,2620:53:8000:ffff:ffff:ffff:ffff:ffff,US -2620:53:c000::,2620:53:c000:ffff:ffff:ffff:ffff:ffff,US -2620:54::,2620:54::ffff:ffff:ffff:ffff:ffff,US -2620:54:4000::,2620:54:4000:ffff:ffff:ffff:ffff:ffff,US -2620:54:8000::,2620:54:8000:ffff:ffff:ffff:ffff:ffff,US -2620:54:c000::,2620:54:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:55::,2620:55::ffff:ffff:ffff:ffff:ffff,US -2620:55:4000::,2620:55:400f:ffff:ffff:ffff:ffff:ffff,US -2620:55:8000::,2620:55:8000:ffff:ffff:ffff:ffff:ffff,US -2620:55:c000::,2620:55:c000:ffff:ffff:ffff:ffff:ffff,US -2620:56::,2620:56::ffff:ffff:ffff:ffff:ffff,US -2620:56:4000::,2620:56:4000:ffff:ffff:ffff:ffff:ffff,US -2620:56:8000::,2620:56:8000:ffff:ffff:ffff:ffff:ffff,US -2620:56:c000::,2620:56:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:57::,2620:57::ffff:ffff:ffff:ffff:ffff,US -2620:57:4000::,2620:57:40ff:ffff:ffff:ffff:ffff:ffff,KY -2620:57:8000::,2620:57:8000:ffff:ffff:ffff:ffff:ffff,US -2620:58::,2620:58:ff:ffff:ffff:ffff:ffff:ffff,US -2620:58:4c00::,2620:58:4c00:ffff:ffff:ffff:ffff:ffff,US -2620:58:8800::,2620:58:8800:ffff:ffff:ffff:ffff:ffff,US -2620:58:c400::,2620:58:c400:ffff:ffff:ffff:ffff:ffff,CA -2620:59::,2620:59::ffff:ffff:ffff:ffff:ffff,US -2620:59:4000::,2620:59:4000:ffff:ffff:ffff:ffff:ffff,US -2620:59:8000::,2620:59:8000:ffff:ffff:ffff:ffff:ffff,US -2620:59:c000::,2620:59:c000:ffff:ffff:ffff:ffff:ffff,US -2620:5a::,2620:5a::ffff:ffff:ffff:ffff:ffff,US -2620:5a:4000::,2620:5a:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:5a:8000::,2620:5a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5a:c000::,2620:5a:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:5b::,2620:5b::ffff:ffff:ffff:ffff:ffff,US -2620:5b:4000::,2620:5b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:5b:8000::,2620:5b:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:5b:c000::,2620:5b:c00f:ffff:ffff:ffff:ffff:ffff,CA -2620:5c::,2620:5c::ffff:ffff:ffff:ffff:ffff,US -2620:5c:8000::,2620:5c:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5c:c000::,2620:5c:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:5d::,2620:5d::ffff:ffff:ffff:ffff:ffff,US -2620:5d:4000::,2620:5d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:5d:8000::,2620:5d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5d:c000::,2620:5d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:5e::,2620:5e::ffff:ffff:ffff:ffff:ffff,US -2620:5e:4000::,2620:5e:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:5e:8000::,2620:5e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5e:c000::,2620:5e:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:5f::,2620:5f::ffff:ffff:ffff:ffff:ffff,US -2620:5f:4000::,2620:5f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:5f:8000::,2620:5f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:5f:c000::,2620:5f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:60::,2620:60::ffff:ffff:ffff:ffff:ffff,US -2620:60:4000::,2620:60:400f:ffff:ffff:ffff:ffff:ffff,US -2620:60:8000::,2620:60:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:61::,2620:61::ffff:ffff:ffff:ffff:ffff,CA -2620:61:4000::,2620:61:400f:ffff:ffff:ffff:ffff:ffff,US -2620:61:8000::,2620:61:8000:ffff:ffff:ffff:ffff:ffff,US -2620:61:c000::,2620:61:c000:ffff:ffff:ffff:ffff:ffff,US -2620:62::,2620:62::ffff:ffff:ffff:ffff:ffff,US -2620:62:4000::,2620:62:400f:ffff:ffff:ffff:ffff:ffff,CA -2620:62:8000::,2620:62:8000:ffff:ffff:ffff:ffff:ffff,US -2620:62:c000::,2620:62:c000:ffff:ffff:ffff:ffff:ffff,US -2620:63::,2620:63::ffff:ffff:ffff:ffff:ffff,US -2620:63:4000::,2620:63:4000:ffff:ffff:ffff:ffff:ffff,US -2620:63:8000::,2620:63:8000:ffff:ffff:ffff:ffff:ffff,US -2620:63:c000::,2620:63:c000:ffff:ffff:ffff:ffff:ffff,US -2620:64::,2620:64::ffff:ffff:ffff:ffff:ffff,US -2620:64:4000::,2620:64:4000:ffff:ffff:ffff:ffff:ffff,US -2620:64:c000::,2620:64:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:65::,2620:65::7fff:ffff:ffff:ffff:ffff,MX -2620:65:0:8000::,2620:65:ff:ffff:ffff:ffff:ffff:ffff,US -2620:65:4080::,2620:65:4080:ffff:ffff:ffff:ffff:ffff,US -2620:65:8000::,2620:65:800f:ffff:ffff:ffff:ffff:ffff,US -2620:65:c000::,2620:65:c000:ffff:ffff:ffff:ffff:ffff,US -2620:66::,2620:66::ffff:ffff:ffff:ffff:ffff,CA -2620:66:4000::,2620:66:400f:ffff:ffff:ffff:ffff:ffff,US -2620:66:8000::,2620:66:8000:ffff:ffff:ffff:ffff:ffff,US -2620:66:c000::,2620:66:c000:ffff:ffff:ffff:ffff:ffff,US -2620:67::,2620:67::ffff:ffff:ffff:ffff:ffff,US -2620:67:4000::,2620:67:4000:ffff:ffff:ffff:ffff:ffff,US -2620:67:8000::,2620:67:8000:ffff:ffff:ffff:ffff:ffff,US -2620:67:c000::,2620:67:c000:ffff:ffff:ffff:ffff:ffff,US -2620:68::,2620:68::ffff:ffff:ffff:ffff:ffff,US -2620:68:4000::,2620:68:400f:ffff:ffff:ffff:ffff:ffff,US -2620:68:8000::,2620:68:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:68:c000::,2620:68:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:69:4000::,2620:69:4000:ffff:ffff:ffff:ffff:ffff,US -2620:69:8000::,2620:69:8000:ffff:ffff:ffff:ffff:ffff,US -2620:69:c000::,2620:69:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:6a::,2620:6a::ffff:ffff:ffff:ffff:ffff,US -2620:6a:4000::,2620:6a:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:6a:8000::,2620:6a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:6a:c000::,2620:6a:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:6b::,2620:6b::ffff:ffff:ffff:ffff:ffff,US -2620:6b:4000::,2620:6b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:6b:8000::,2620:6b:8000:ffff:ffff:ffff:ffff:ffff,US -2620:6b:c000::,2620:6b:c000:ffff:ffff:ffff:ffff:ffff,US -2620:6c::,2620:6c:3f:ffff:ffff:ffff:ffff:ffff,US -2620:6c:40c0::,2620:6c:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:6c:8080::,2620:6c:8080:ffff:ffff:ffff:ffff:ffff,US -2620:6c:c060::,2620:6c:c060:ffff:ffff:ffff:ffff:ffff,US -2620:6d:40::,2620:6d:40:ffff:ffff:ffff:ffff:ffff,US -2620:6d:4020::,2620:6d:4020:ffff:ffff:ffff:ffff:ffff,US -2620:6d:8000::,2620:6d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:6d:c000::,2620:6d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:6e::,2620:6e::ffff:ffff:ffff:ffff:ffff,US -2620:6e:4000::,2620:6e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:6e:8000::,2620:6e:800f:ffff:ffff:ffff:ffff:ffff,US -2620:6e:c000::,2620:6e:c000:ffff:ffff:ffff:ffff:ffff,US -2620:6f::,2620:6f::ffff:ffff:ffff:ffff:ffff,US -2620:6f:4000::,2620:6f:4000:ffff:ffff:ffff:ffff:ffff,US -2620:6f:8000::,2620:6f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:6f:c000::,2620:6f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:70:4000::,2620:70:4000:ffff:ffff:ffff:ffff:ffff,US -2620:70:8000::,2620:70:8000:ffff:ffff:ffff:ffff:ffff,US -2620:70:c000::,2620:70:c000:ffff:ffff:ffff:ffff:ffff,US -2620:71::,2620:71::ffff:ffff:ffff:ffff:ffff,US -2620:71:4000::,2620:71:4000:ffff:ffff:ffff:ffff:ffff,US -2620:71:8000::,2620:71:8000:ffff:ffff:ffff:ffff:ffff,US -2620:71:c000::,2620:71:c000:ffff:ffff:ffff:ffff:ffff,US -2620:72::,2620:72::ffff:ffff:ffff:ffff:ffff,US -2620:72:4000::,2620:72:4000:ffff:ffff:ffff:ffff:ffff,US -2620:72:8000::,2620:72:8000:ffff:ffff:ffff:ffff:ffff,US -2620:72:c000::,2620:72:c000:ffff:ffff:ffff:ffff:ffff,US -2620:73::,2620:73::ffff:ffff:ffff:ffff:ffff,US -2620:73:8000::,2620:73:8000:ffff:ffff:ffff:ffff:ffff,US -2620:73:c000::,2620:73:c000:ffff:ffff:ffff:ffff:ffff,US -2620:74::,2620:74:32:ffff:ffff:ffff:ffff:ffff,US -2620:74:33::,2620:74:34:ffff:ffff:ffff:ffff:ffff,NL -2620:74:35::,2620:74:36:ffff:ffff:ffff:ffff:ffff,US -2620:74:37::,2620:74:37:ffff:ffff:ffff:ffff:ffff,NL -2620:74:38::,2620:74:3a:ffff:ffff:ffff:ffff:ffff,GB -2620:74:3b::,2620:74:3b:ffff:ffff:ffff:ffff:ffff,US -2620:74:3c::,2620:74:3e:ffff:ffff:ffff:ffff:ffff,DE -2620:74:3f::,2620:74:3f:ffff:ffff:ffff:ffff:ffff,JP -2620:74:40::,2620:74:ff:ffff:ffff:ffff:ffff:ffff,US -2620:74:40c0::,2620:74:40c0:ffff:ffff:ffff:ffff:ffff,US -2620:74:8080::,2620:74:8080:ffff:ffff:ffff:ffff:ffff,US -2620:74:c040::,2620:74:c040:ffff:ffff:ffff:ffff:ffff,US -2620:75::,2620:75::ffff:ffff:ffff:ffff:ffff,US -2620:75:4000::,2620:75:4000:ffff:ffff:ffff:ffff:ffff,US -2620:75:8000::,2620:75:8000:ffff:ffff:ffff:ffff:ffff,US -2620:75:c000::,2620:75:c000:ffff:ffff:ffff:ffff:ffff,US -2620:76::,2620:76::ffff:ffff:ffff:ffff:ffff,US -2620:76:4000::,2620:76:4000:ffff:ffff:ffff:ffff:ffff,US -2620:76:8000::,2620:76:8000:ffff:ffff:ffff:ffff:ffff,US -2620:76:c000::,2620:76:c000:ffff:ffff:ffff:ffff:ffff,US -2620:77::,2620:77::ffff:ffff:ffff:ffff:ffff,US -2620:77:4000::,2620:77:4000:ffff:ffff:ffff:ffff:ffff,US -2620:77:8000::,2620:77:8000:ffff:ffff:ffff:ffff:ffff,US -2620:78::,2620:78::ffff:ffff:ffff:ffff:ffff,US -2620:78:4000::,2620:78:4000:ffff:ffff:ffff:ffff:ffff,US -2620:78:8000::,2620:78:8000:ffff:ffff:ffff:ffff:ffff,US -2620:78:c000::,2620:78:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:79::,2620:79:f:ffff:ffff:ffff:ffff:ffff,US -2620:79:8000::,2620:79:8000:ffff:ffff:ffff:ffff:ffff,US -2620:79:c000::,2620:79:c000:ffff:ffff:ffff:ffff:ffff,US -2620:7a::,2620:7a::ffff:ffff:ffff:ffff:ffff,US -2620:7a:4000::,2620:7a:4000:ffff:ffff:ffff:ffff:ffff,US -2620:7a:8000::,2620:7a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:7a:c000::,2620:7a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:7b::,2620:7b::ffff:ffff:ffff:ffff:ffff,US -2620:7b:4000::,2620:7b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:7b:8000::,2620:7b:800f:ffff:ffff:ffff:ffff:ffff,US -2620:7b:b000::,2620:7b:b000:ffff:ffff:ffff:ffff:ffff,US -2620:7b:e000::,2620:7b:e000:ffff:ffff:ffff:ffff:ffff,US -2620:7c:1000::,2620:7c:1000:ffff:ffff:ffff:ffff:ffff,US -2620:7c:4000::,2620:7c:4000:ffff:ffff:ffff:ffff:ffff,US -2620:7c:7000::,2620:7c:7000:ffff:ffff:ffff:ffff:ffff,US -2620:7c:a000::,2620:7c:a000:ffff:ffff:ffff:ffff:ffff,US -2620:7c:d000::,2620:7c:d000:ffff:ffff:ffff:ffff:ffff,US -2620:7d::,2620:7d::ffff:ffff:ffff:ffff:ffff,US -2620:7d:4000::,2620:7d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:7d:8000::,2620:7d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:7d:c000::,2620:7d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:7e::,2620:7e:f:ffff:ffff:ffff:ffff:ffff,US -2620:7e:30e0::,2620:7e:30e0:ffff:ffff:ffff:ffff:ffff,US -2620:7e:60c0::,2620:7e:60c0:ffff:ffff:ffff:ffff:ffff,US -2620:7e:90a0::,2620:7e:90a0:ffff:ffff:ffff:ffff:ffff,US -2620:7e:c080::,2620:7e:c080:ffff:ffff:ffff:ffff:ffff,US -2620:7e:f060::,2620:7e:f060:ffff:ffff:ffff:ffff:ffff,CA -2620:7f:8000::,2620:7f:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:7f:c000::,2620:7f:c000:ffff:ffff:ffff:ffff:ffff,US -2620:80:8000::,2620:80:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:80:c000::,2620:80:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:81::,2620:81::ffff:ffff:ffff:ffff:ffff,US -2620:81:4000::,2620:81:4000:ffff:ffff:ffff:ffff:ffff,US -2620:81:8000::,2620:81:8000:ffff:ffff:ffff:ffff:ffff,US -2620:81:c000::,2620:81:c000:ffff:ffff:ffff:ffff:ffff,US -2620:82::,2620:82::ffff:ffff:ffff:ffff:ffff,US -2620:82:4000::,2620:82:4000:ffff:ffff:ffff:ffff:ffff,US -2620:82:8000::,2620:82:8000:ffff:ffff:ffff:ffff:ffff,US -2620:82:c000::,2620:82:c000:ffff:ffff:ffff:ffff:ffff,US -2620:83::,2620:83::ffff:ffff:ffff:ffff:ffff,US -2620:83:4000::,2620:83:4000:ffff:ffff:ffff:ffff:ffff,US -2620:83:8000::,2620:83:800f:ffff:ffff:ffff:ffff:ffff,US -2620:83:c000::,2620:83:c000:ffff:ffff:ffff:ffff:ffff,US -2620:84::,2620:84:1:ffff:ffff:ffff:ffff:ffff,US -2620:84:4000::,2620:84:4000:ffff:ffff:ffff:ffff:ffff,US -2620:84:8000::,2620:84:8000:ffff:ffff:ffff:ffff:ffff,US -2620:84:c000::,2620:84:c000:ffff:ffff:ffff:ffff:ffff,US -2620:85::,2620:85::ffff:ffff:ffff:ffff:ffff,US -2620:85:4000::,2620:85:4000:ffff:ffff:ffff:ffff:ffff,US -2620:85:8000::,2620:85:8000:ffff:ffff:ffff:ffff:ffff,US -2620:85:c000::,2620:85:c000:ffff:ffff:ffff:ffff:ffff,US -2620:86::,2620:86::ffff:ffff:ffff:ffff:ffff,US -2620:86:4000::,2620:86:4000:ffff:ffff:ffff:ffff:ffff,US -2620:86:8000::,2620:86:8000:ffff:ffff:ffff:ffff:ffff,US -2620:86:c000::,2620:86:c000:ffff:ffff:ffff:ffff:ffff,US -2620:87::,2620:87::ffff:ffff:ffff:ffff:ffff,US -2620:87:4000::,2620:87:4000:ffff:ffff:ffff:ffff:ffff,US -2620:87:8000::,2620:87:8000:ffff:ffff:ffff:ffff:ffff,US -2620:87:c000::,2620:87:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:88::,2620:88::ffff:ffff:ffff:ffff:ffff,US -2620:88:4000::,2620:88:4000:ffff:ffff:ffff:ffff:ffff,US -2620:88:8000::,2620:88:800f:ffff:ffff:ffff:ffff:ffff,US -2620:88:c000::,2620:88:c000:ffff:ffff:ffff:ffff:ffff,US -2620:89::,2620:89::ffff:ffff:ffff:ffff:ffff,US -2620:89:8000::,2620:89:8000:ffff:ffff:ffff:ffff:ffff,US -2620:89:c000::,2620:89:c000:ffff:ffff:ffff:ffff:ffff,US -2620:8a::,2620:8a::ffff:ffff:ffff:ffff:ffff,US -2620:8a:4000::,2620:8a:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:8a:8000::,2620:8a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:8a:c000::,2620:8a:c000:ffff:ffff:ffff:ffff:ffff,US -2620:8b::,2620:8b::ffff:ffff:ffff:ffff:ffff,US -2620:8b:4000::,2620:8b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:8b:8000::,2620:8b:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:8b:c000::,2620:8b:c000:ffff:ffff:ffff:ffff:ffff,US -2620:8c:4000::,2620:8c:4000:ffff:ffff:ffff:ffff:ffff,US -2620:8c:8000::,2620:8c:8000:ffff:ffff:ffff:ffff:ffff,US -2620:8d::,2620:8d::ffff:ffff:ffff:ffff:ffff,US -2620:8d:4000::,2620:8d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:8d:8000::,2620:8d:8000:ffff:ffff:ffff:ffff:ffff,US -2620:8d:c000::,2620:8d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:8e:4000::,2620:8e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:8e:8000::,2620:8e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:8e:c000::,2620:8e:c000:ffff:ffff:ffff:ffff:ffff,US -2620:8f::,2620:8f::ffff:ffff:ffff:ffff:ffff,US -2620:8f:4000::,2620:8f:400f:ffff:ffff:ffff:ffff:ffff,US -2620:8f:8000::,2620:8f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:8f:c000::,2620:8f:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:90::,2620:90::ffff:ffff:ffff:ffff:ffff,CA -2620:90:4000::,2620:90:4000:ffff:ffff:ffff:ffff:ffff,US -2620:90:8000::,2620:90:8000:ffff:ffff:ffff:ffff:ffff,US -2620:90:c000::,2620:90:c000:ffff:ffff:ffff:ffff:ffff,US -2620:91::,2620:91::ffff:ffff:ffff:ffff:ffff,US -2620:91:4000::,2620:91:4000:ffff:ffff:ffff:ffff:ffff,US -2620:91:8000::,2620:91:8000:ffff:ffff:ffff:ffff:ffff,US -2620:91:c000::,2620:91:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:92::,2620:92:f:ffff:ffff:ffff:ffff:ffff,US -2620:92:4000::,2620:92:4000:ffff:ffff:ffff:ffff:ffff,US -2620:92:8000::,2620:92:8000:ffff:ffff:ffff:ffff:ffff,US -2620:92:c000::,2620:92:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:93::,2620:93::ffff:ffff:ffff:ffff:ffff,US -2620:93:4000::,2620:93:4000:ffff:ffff:ffff:ffff:ffff,US -2620:93:8000::,2620:93:8000:ffff:ffff:ffff:ffff:ffff,US -2620:93:c000::,2620:93:c000:ffff:ffff:ffff:ffff:ffff,US -2620:94::,2620:94::ffff:ffff:ffff:ffff:ffff,US -2620:94:c000::,2620:94:c000:ffff:ffff:ffff:ffff:ffff,US -2620:95::,2620:95::ffff:ffff:ffff:ffff:ffff,US -2620:95:4000::,2620:95:400f:ffff:ffff:ffff:ffff:ffff,US -2620:95:8000::,2620:95:8000:ffff:ffff:ffff:ffff:ffff,US -2620:95:c000::,2620:95:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:96::,2620:96::ffff:ffff:ffff:ffff:ffff,US -2620:96:4000::,2620:96:400f:ffff:ffff:ffff:ffff:ffff,CA -2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US -2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US -2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US -2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US -2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US -2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US -2620:98:4000::,2620:98:400f:ffff:ffff:ffff:ffff:ffff,CA -2620:98:8000::,2620:98:8000:ffff:ffff:ffff:ffff:ffff,US -2620:98:c000::,2620:98:c000:ffff:ffff:ffff:ffff:ffff,US -2620:99::,2620:99::ffff:ffff:ffff:ffff:ffff,US -2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US -2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US -2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA -2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US -2620:9b::,2620:9b::ffff:ffff:ffff:ffff:ffff,US -2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US -2620:9b:8000::,2620:9b:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:9b:c000::,2620:9b:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:9c::,2620:9c::ffff:ffff:ffff:ffff:ffff,US -2620:9c:4000::,2620:9c:400f:ffff:ffff:ffff:ffff:ffff,US -2620:9c:8000::,2620:9c:8000:ffff:ffff:ffff:ffff:ffff,US -2620:9c:c000::,2620:9c:c000:ffff:ffff:ffff:ffff:ffff,US -2620:9d::,2620:9d::ffff:ffff:ffff:ffff:ffff,US -2620:9d:4000::,2620:9d:4000:ffff:ffff:ffff:ffff:ffff,US -2620:9d:c000::,2620:9d:c000:ffff:ffff:ffff:ffff:ffff,US -2620:9e::,2620:9e::ffff:ffff:ffff:ffff:ffff,US -2620:9e:4000::,2620:9e:4000:ffff:ffff:ffff:ffff:ffff,US -2620:9e:8000::,2620:9e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:9e:c000::,2620:9e:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:9f::,2620:9f:ff:ffff:ffff:ffff:ffff:ffff,US -2620:9f:4080::,2620:9f:4080:ffff:ffff:ffff:ffff:ffff,CA -2620:9f:8000::,2620:9f:8000:ffff:ffff:ffff:ffff:ffff,US -2620:9f:c000::,2620:9f:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:a0::,2620:a0::ffff:ffff:ffff:ffff:ffff,US -2620:a0:4000::,2620:a0:400f:ffff:ffff:ffff:ffff:ffff,US -2620:a0:8000::,2620:a0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a0:c000::,2620:a0:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a1::,2620:a1::ffff:ffff:ffff:ffff:ffff,US -2620:a1:4000::,2620:a1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a1:8000::,2620:a1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a1:c000::,2620:a1:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a2::,2620:a2::ffff:ffff:ffff:ffff:ffff,US -2620:a2:4000::,2620:a2:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a2:8000::,2620:a2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a2:c000::,2620:a2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a3::,2620:a3::ffff:ffff:ffff:ffff:ffff,US -2620:a3:4000::,2620:a3:400f:ffff:ffff:ffff:ffff:ffff,US -2620:a3:8000::,2620:a3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a3:a010::,2620:a3:a010:ffff:ffff:ffff:ffff:ffff,US -2620:a3:c020::,2620:a3:c020:ffff:ffff:ffff:ffff:ffff,US -2620:a3:e030::,2620:a3:e030:ffff:ffff:ffff:ffff:ffff,US -2620:a4:40::,2620:a4:40:ffff:ffff:ffff:ffff:ffff,US -2620:a4:2050::,2620:a4:205f:ffff:ffff:ffff:ffff:ffff,US -2620:a4:4060::,2620:a4:4060:ffff:ffff:ffff:ffff:ffff,US -2620:a4:6070::,2620:a4:6070:ffff:ffff:ffff:ffff:ffff,US -2620:a4:8080::,2620:a4:8080:ffff:ffff:ffff:ffff:ffff,US -2620:a5::,2620:a5::ffff:ffff:ffff:ffff:ffff,US -2620:a5:4000::,2620:a5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a5:8000::,2620:a5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a5:c000::,2620:a5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a6::,2620:a6::ffff:ffff:ffff:ffff:ffff,US -2620:a6:4000::,2620:a6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a6:8000::,2620:a6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a6:c000::,2620:a6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a7::,2620:a7::ffff:ffff:ffff:ffff:ffff,US -2620:a7:4000::,2620:a7:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a7:8000::,2620:a7:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a7:c000::,2620:a7:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:a8::,2620:a8::ffff:ffff:ffff:ffff:ffff,US -2620:a8:4000::,2620:a8:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a8:8000::,2620:a8:8000:ffff:ffff:ffff:ffff:ffff,US -2620:a8:c000::,2620:a8:c000:ffff:ffff:ffff:ffff:ffff,US -2620:a9::,2620:a9::ffff:ffff:ffff:ffff:ffff,US -2620:a9:4000::,2620:a9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:a9:8000::,2620:a9:800f:ffff:ffff:ffff:ffff:ffff,US -2620:a9:c080::,2620:a9:c080:ffff:ffff:ffff:ffff:ffff,US -2620:aa::,2620:aa::ffff:ffff:ffff:ffff:ffff,US -2620:aa:4000::,2620:aa:4000:ffff:ffff:ffff:ffff:ffff,US -2620:aa:8000::,2620:aa:8000:ffff:ffff:ffff:ffff:ffff,US -2620:aa:c000::,2620:aa:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ab::,2620:ab::ffff:ffff:ffff:ffff:ffff,US -2620:ab:4000::,2620:ab:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ab:8000::,2620:ab:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ab:c000::,2620:ab:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ac::,2620:ac::ffff:ffff:ffff:ffff:ffff,US -2620:ac:4000::,2620:ac:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:ac:8000::,2620:ac:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ac:c000::,2620:ac:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ad::,2620:ad::ffff:ffff:ffff:ffff:ffff,US -2620:ad:4000::,2620:ad:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ad:8000::,2620:ad:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:ad:c000::,2620:ad:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:ae::,2620:ae::ffff:ffff:ffff:ffff:ffff,CA -2620:ae:4000::,2620:ae:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ae:8000::,2620:ae:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ae:c000::,2620:ae:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:af::,2620:af:f:ffff:ffff:ffff:ffff:ffff,US -2620:af:4000::,2620:af:4000:ffff:ffff:ffff:ffff:ffff,US -2620:af:8000::,2620:af:8000:ffff:ffff:ffff:ffff:ffff,US -2620:af:c000::,2620:af:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:b0::,2620:b0::ffff:ffff:ffff:ffff:ffff,CA -2620:b0:4000::,2620:b0:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b0:8000::,2620:b0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b0:c000::,2620:b0:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b1::,2620:b1::ffff:ffff:ffff:ffff:ffff,US -2620:b1:4000::,2620:b1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b1:8000::,2620:b1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b1:c000::,2620:b1:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b2::,2620:b2::ffff:ffff:ffff:ffff:ffff,US -2620:b2:4000::,2620:b2:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:b2:8000::,2620:b2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b2:c000::,2620:b2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b3::,2620:b3::ffff:ffff:ffff:ffff:ffff,US -2620:b3:4000::,2620:b3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b3:8000::,2620:b3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b3:c000::,2620:b3:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:b4::,2620:b4::ffff:ffff:ffff:ffff:ffff,US -2620:b4:4000::,2620:b4:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b4:8000::,2620:b4:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:b4:c000::,2620:b4:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b5::,2620:b5::ffff:ffff:ffff:ffff:ffff,US -2620:b5:4000::,2620:b5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b5:8000::,2620:b5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b5:c000::,2620:b5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b6:4000::,2620:b6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b6:8000::,2620:b6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b6:c000::,2620:b6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b7::,2620:b7::ffff:ffff:ffff:ffff:ffff,US -2620:b7:8000::,2620:b7:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:b7:c000::,2620:b7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b8::,2620:b8::ffff:ffff:ffff:ffff:ffff,US -2620:b8:4000::,2620:b8:4000:fff:ffff:ffff:ffff:ffff,CA -2620:b8:4000:1000::,2620:b8:4000:10ff:ffff:ffff:ffff:ffff,US -2620:b8:4000:1100::,2620:b8:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:b8:8000::,2620:b8:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b8:c000::,2620:b8:c000:ffff:ffff:ffff:ffff:ffff,US -2620:b9::,2620:b9::ffff:ffff:ffff:ffff:ffff,US -2620:b9:4000::,2620:b9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:b9:8000::,2620:b9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:b9:c000::,2620:b9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ba::,2620:ba:ff:ffff:ffff:ffff:ffff:ffff,US -2620:ba:4000::,2620:ba:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ba:8000::,2620:ba:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ba:c000::,2620:ba:c000:ffff:ffff:ffff:ffff:ffff,US -2620:bb::,2620:bb::ffff:ffff:ffff:ffff:ffff,US -2620:bb:8000::,2620:bb:800f:ffff:ffff:ffff:ffff:ffff,US -2620:bb:c000::,2620:bb:c000:ffff:ffff:ffff:ffff:ffff,US -2620:bc:4000::,2620:bc:4000:ffff:ffff:ffff:ffff:ffff,US -2620:bc:8000::,2620:bc:8000:ffff:ffff:ffff:ffff:ffff,US -2620:bc:c000::,2620:bc:c000:ffff:ffff:ffff:ffff:ffff,US -2620:bd::,2620:bd::ffff:ffff:ffff:ffff:ffff,CA -2620:bd:4000::,2620:bd:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:bd:8000::,2620:bd:8000:ffff:ffff:ffff:ffff:ffff,US -2620:bd:c000::,2620:bd:c000:ffff:ffff:ffff:ffff:ffff,US -2620:be::,2620:be::ffff:ffff:ffff:ffff:ffff,US -2620:be:4000::,2620:be:4000:ffff:ffff:ffff:ffff:ffff,US -2620:be:8000::,2620:be:8000:ffff:ffff:ffff:ffff:ffff,US -2620:be:c000::,2620:be:c000:ffff:ffff:ffff:ffff:ffff,US -2620:bf::,2620:bf::ffff:ffff:ffff:ffff:ffff,US -2620:bf:4000::,2620:bf:4000:ffff:ffff:ffff:ffff:ffff,US -2620:bf:8000::,2620:bf:8000:ffff:ffff:ffff:ffff:ffff,US -2620:bf:c000::,2620:bf:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c0::,2620:c0::ffff:ffff:ffff:ffff:ffff,US -2620:c0:4000::,2620:c0:400f:ffff:ffff:ffff:ffff:ffff,US -2620:c0:8000::,2620:c0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c0:c000::,2620:c0:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:c1::,2620:c1::ffff:ffff:ffff:ffff:ffff,US -2620:c1:4000::,2620:c1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c1:8000::,2620:c1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c1:c000::,2620:c1:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:c2::,2620:c2::ffff:ffff:ffff:ffff:ffff,US -2620:c2:4000::,2620:c2:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c2:8000::,2620:c2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c2:c000::,2620:c2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c3::,2620:c3::ffff:ffff:ffff:ffff:ffff,US -2620:c3:4000::,2620:c3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c3:8000::,2620:c3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c3:c000::,2620:c3:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:c4::,2620:c4::ffff:ffff:ffff:ffff:ffff,US -2620:c4:4000::,2620:c4:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c4:8000::,2620:c4:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c4:c000::,2620:c4:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:c5::,2620:c5::ffff:ffff:ffff:ffff:ffff,US -2620:c5:4000::,2620:c5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c5:c000::,2620:c5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c6::,2620:c6::ffff:ffff:ffff:ffff:ffff,US -2620:c6:4000::,2620:c6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c6:8000::,2620:c6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c6:c000::,2620:c6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c7::,2620:c7::ffff:ffff:ffff:ffff:ffff,US -2620:c7:4000::,2620:c7:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c7:8000::,2620:c7:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c7:c000::,2620:c7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:c8::,2620:c8::ffff:ffff:ffff:ffff:ffff,US -2620:c8:4000::,2620:c8:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c8:c000::,2620:c8:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:c9::,2620:c9::ffff:ffff:ffff:ffff:ffff,US -2620:c9:4000::,2620:c9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:c9:8000::,2620:c9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:c9:c000::,2620:c9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ca::,2620:ca::ffff:ffff:ffff:ffff:ffff,US -2620:ca:4000::,2620:ca:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ca:8000::,2620:ca:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ca:c000::,2620:ca:c000:ffff:ffff:ffff:ffff:ffff,US -2620:cb::,2620:cb:f:ffff:ffff:ffff:ffff:ffff,US -2620:cb:4000::,2620:cb:4000:ffff:ffff:ffff:ffff:ffff,US -2620:cb:8000::,2620:cb:8000:ffff:ffff:ffff:ffff:ffff,US -2620:cb:c000::,2620:cb:c000:ffff:ffff:ffff:ffff:ffff,US -2620:cc::,2620:cc::ffff:ffff:ffff:ffff:ffff,US -2620:cc:4000::,2620:cc:4000:ffff:ffff:ffff:ffff:ffff,US -2620:cc:8000::,2620:cc:8000:ffff:ffff:ffff:ffff:ffff,US -2620:cc:c000::,2620:cc:c000:ffff:ffff:ffff:ffff:ffff,US -2620:cd::,2620:cd::ffff:ffff:ffff:ffff:ffff,US -2620:cd:4000::,2620:cd:4000:ffff:ffff:ffff:ffff:ffff,US -2620:cd:8000::,2620:cd:8000:ffff:ffff:ffff:ffff:ffff,US -2620:cd:c000::,2620:cd:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ce::,2620:ce::ffff:ffff:ffff:ffff:ffff,US -2620:ce:4000::,2620:ce:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ce:8000::,2620:ce:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ce:c000::,2620:ce:c000:ffff:ffff:ffff:ffff:ffff,US -2620:cf:4000::,2620:cf:4000:ffff:ffff:ffff:ffff:ffff,US -2620:cf:8000::,2620:cf:8000:ffff:ffff:ffff:ffff:ffff,US -2620:cf:c000::,2620:cf:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:d0::,2620:d0::ffff:ffff:ffff:ffff:ffff,US -2620:d0:4000::,2620:d0:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d0:8000::,2620:d0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d0:c000::,2620:d0:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d1::,2620:d1::ffff:ffff:ffff:ffff:ffff,US -2620:d1:4000::,2620:d1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d1:8000::,2620:d1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d1:c000::,2620:d1:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d2::,2620:d2::ffff:ffff:ffff:ffff:ffff,US -2620:d2:4000::,2620:d2:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d2:8000::,2620:d2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d2:c000::,2620:d2:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:d3:4000::,2620:d3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d3:8000::,2620:d3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d3:c000::,2620:d3:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d4::,2620:d4::ffff:ffff:ffff:ffff:ffff,US -2620:d4:4000::,2620:d4:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d4:8000::,2620:d4:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d5::,2620:d5::ffff:ffff:ffff:ffff:ffff,US -2620:d5:4000::,2620:d5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d5:8000::,2620:d5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d5:c000::,2620:d5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d6::,2620:d6::ffff:ffff:ffff:ffff:ffff,US -2620:d6:4000::,2620:d6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d6:8000::,2620:d6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d6:c000::,2620:d6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d7::,2620:d7::ffff:ffff:ffff:ffff:ffff,US -2620:d7:4000::,2620:d7:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:d7:8000::,2620:d7:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d7:c000::,2620:d7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d8::,2620:d8::ffff:ffff:ffff:ffff:ffff,US -2620:d8:4000::,2620:d8:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d8:8000::,2620:d8:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d8:c000::,2620:d8:c000:ffff:ffff:ffff:ffff:ffff,US -2620:d9::,2620:d9::ffff:ffff:ffff:ffff:ffff,US -2620:d9:4000::,2620:d9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:d9:8000::,2620:d9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:d9:c000::,2620:d9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:da::,2620:da::ffff:ffff:ffff:ffff:ffff,US -2620:da:4000::,2620:da:4000:ffff:ffff:ffff:ffff:ffff,US -2620:da:c000::,2620:da:c000:ffff:ffff:ffff:ffff:ffff,US -2620:db::,2620:db::ffff:ffff:ffff:ffff:ffff,US -2620:db:4000::,2620:db:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:db:8000::,2620:db:8000:ffff:ffff:ffff:ffff:ffff,US -2620:db:c000::,2620:db:c000:ffff:ffff:ffff:ffff:ffff,US -2620:dc::,2620:dc::ffff:ffff:ffff:ffff:ffff,US -2620:dc:8::,2620:dc:8:ffff:ffff:ffff:ffff:ffff,US -2620:dc:4000::,2620:dc:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:dc:8000::,2620:dc:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:dc:c000::,2620:dc:c000:ffff:ffff:ffff:ffff:ffff,US -2620:dd::,2620:dd::ffff:ffff:ffff:ffff:ffff,CA -2620:dd:4000::,2620:dd:4000:ffff:ffff:ffff:ffff:ffff,US -2620:dd:8000::,2620:dd:8000:ffff:ffff:ffff:ffff:ffff,US -2620:dd:c000::,2620:dd:c000:ffff:ffff:ffff:ffff:ffff,US -2620:de::,2620:de::ffff:ffff:ffff:ffff:ffff,US -2620:de:4000::,2620:de:4000:ffff:ffff:ffff:ffff:ffff,US -2620:de:8000::,2620:de:8000:ffff:ffff:ffff:ffff:ffff,US -2620:de:c000::,2620:de:c000:ffff:ffff:ffff:ffff:ffff,US -2620:df::,2620:df::ffff:ffff:ffff:ffff:ffff,US -2620:df:4000::,2620:df:400f:ffff:ffff:ffff:ffff:ffff,US -2620:df:8000::,2620:df:8000:ffff:ffff:ffff:ffff:ffff,US -2620:df:c000::,2620:df:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e0::,2620:e0::ffff:ffff:ffff:ffff:ffff,US -2620:e0:4000::,2620:e0:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e0:8000::,2620:e0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e0:c000::,2620:e0:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e1::,2620:e1::ffff:ffff:ffff:ffff:ffff,US -2620:e1:4000::,2620:e1:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e1:8000::,2620:e1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e1:c000::,2620:e1:c000:ffff:ffff:ffff:ffff:ffff,VG -2620:e2::,2620:e2::ffff:ffff:ffff:ffff:ffff,US -2620:e2:4000::,2620:e2:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e2:8000::,2620:e2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e2:c000::,2620:e2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e3::,2620:e3::ffff:ffff:ffff:ffff:ffff,US -2620:e3:4000::,2620:e3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e3:8000::,2620:e3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e3:c000::,2620:e3:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e4::,2620:e4::ffff:ffff:ffff:ffff:ffff,US -2620:e4:4000::,2620:e4:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e4:8000::,2620:e4:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e4:c000::,2620:e4:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e5::,2620:e5::ffff:ffff:ffff:ffff:ffff,US -2620:e5:4000::,2620:e5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e5:8000::,2620:e5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e5:c000::,2620:e5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e6::,2620:e6::ffff:ffff:ffff:ffff:ffff,US -2620:e6:4000::,2620:e6:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e6:8000::,2620:e6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e6:c000::,2620:e6:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e7::,2620:e7::ffff:ffff:ffff:ffff:ffff,US -2620:e7:4000::,2620:e7:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e7:8000::,2620:e7:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:e7:c000::,2620:e7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e8::,2620:e8::ffff:ffff:ffff:ffff:ffff,US -2620:e8:4000::,2620:e8:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e8:8000::,2620:e8:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e8:c000::,2620:e8:c000:ffff:ffff:ffff:ffff:ffff,US -2620:e9::,2620:e9::ffff:ffff:ffff:ffff:ffff,US -2620:e9:4000::,2620:e9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:e9:8000::,2620:e9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:e9:c000::,2620:e9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ea::,2620:ea:f:ffff:ffff:ffff:ffff:ffff,US -2620:ea:4000::,2620:ea:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ea:8000::,2620:ea:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ea:c000::,2620:ea:c000:ffff:ffff:ffff:ffff:ffff,US -2620:eb::,2620:eb::ffff:ffff:ffff:ffff:ffff,US -2620:eb:4000::,2620:eb:4000:ffff:ffff:ffff:ffff:ffff,US -2620:eb:8000::,2620:eb:8000:ffff:ffff:ffff:ffff:ffff,US -2620:eb:c000::,2620:eb:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ec::,2620:ec::ffff:ffff:ffff:ffff:ffff,US -2620:ec:4000::,2620:ec:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ec:8000::,2620:ec:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ec:c000::,2620:ec:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ed::,2620:ed::ffff:ffff:ffff:ffff:ffff,US -2620:ed:4000::,2620:ed:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:ed:8000::,2620:ed:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ed:c000::,2620:ed:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ee::,2620:ee::ffff:ffff:ffff:ffff:ffff,US -2620:ee:4000::,2620:ee:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ee:8000::,2620:ee:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ee:c000::,2620:ee:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:ef:4000::,2620:ef:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ef:8000::,2620:ef:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ef:c000::,2620:ef:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f0::,2620:f0::ffff:ffff:ffff:ffff:ffff,US -2620:f0:4000::,2620:f0:400f:ffff:ffff:ffff:ffff:ffff,US -2620:f0:8000::,2620:f0:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f0:c000::,2620:f0:c002:ffff:ffff:ffff:ffff:ffff,US -2620:f0:c003::,2620:f0:c003:ffff:ffff:ffff:ffff:ffff,NL -2620:f0:c004::,2620:f0:c004:ffff:ffff:ffff:ffff:ffff,US -2620:f0:c005::,2620:f0:c005:ffff:ffff:ffff:ffff:ffff,SG -2620:f0:c006::,2620:f0:c009:ffff:ffff:ffff:ffff:ffff,US -2620:f0:c00a::,2620:f0:c00a:ffff:ffff:ffff:ffff:ffff,CA -2620:f0:c00b::,2620:f0:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:f1:4000::,2620:f1:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:f1:8000::,2620:f1:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f1:c000::,2620:f1:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f2::,2620:f2::ffff:ffff:ffff:ffff:ffff,CA -2620:f2:4000::,2620:f2:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f2:8000::,2620:f2:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f2:c000::,2620:f2:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f3::,2620:f3::ffff:ffff:ffff:ffff:ffff,US -2620:f3:4000::,2620:f3:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f3:8000::,2620:f3:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f3:c000::,2620:f3:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f4::,2620:f4::ffff:ffff:ffff:ffff:ffff,US -2620:f4:4000::,2620:f4:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:f4:8000::,2620:f4:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:f4:c000::,2620:f4:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f5::,2620:f5::ffff:ffff:ffff:ffff:ffff,US -2620:f5:4000::,2620:f5:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f5:c000::,2620:f5:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA -2620:f6:4000::,2620:f6:400f:ffff:ffff:ffff:ffff:ffff,US -2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f6:c000::,2620:f6:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US -2620:f7:4000::,2620:f7:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f7:8000::,2620:f7:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f7:c000::,2620:f7:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f8::,2620:f8::ffff:ffff:ffff:ffff:ffff,US -2620:f8:4000::,2620:f8:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f8:8000::,2620:f8:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f8:c000::,2620:f8:c000:ffff:ffff:ffff:ffff:ffff,US -2620:f9::,2620:f9:f:ffff:ffff:ffff:ffff:ffff,US -2620:f9:4000::,2620:f9:4000:ffff:ffff:ffff:ffff:ffff,US -2620:f9:8000::,2620:f9:8000:ffff:ffff:ffff:ffff:ffff,US -2620:f9:c000::,2620:f9:c000:ffff:ffff:ffff:ffff:ffff,US -2620:fa::,2620:fa::ffff:ffff:ffff:ffff:ffff,US -2620:fa:4000::,2620:fa:4000:ffff:ffff:ffff:ffff:ffff,US -2620:fa:8000::,2620:fa:8000:ffff:ffff:ffff:ffff:ffff,CA -2620:fa:c000::,2620:fa:c000:ffff:ffff:ffff:ffff:ffff,US -2620:fb::,2620:fb::ffff:ffff:ffff:ffff:ffff,US -2620:fb:4000::,2620:fb:4000:ffff:ffff:ffff:ffff:ffff,US -2620:fb:8000::,2620:fb:8000:ffff:ffff:ffff:ffff:ffff,US -2620:fc::,2620:fc::ffff:ffff:ffff:ffff:ffff,CA -2620:fc:4000::,2620:fc:4000:ffff:ffff:ffff:ffff:ffff,CA -2620:fc:8000::,2620:fc:8000:ffff:ffff:ffff:ffff:ffff,US -2620:fc:c000::,2620:fc:c000:ffff:ffff:ffff:ffff:ffff,US -2620:fd::,2620:fd::ffff:ffff:ffff:ffff:ffff,CA -2620:fd:4000::,2620:fd:4000:ffff:ffff:ffff:ffff:ffff,US -2620:fd:8000::,2620:fd:8000:ffff:ffff:ffff:ffff:ffff,US -2620:fd:c000::,2620:fd:c000:ffff:ffff:ffff:ffff:ffff,CA -2620:fe::,2620:fe::ffff:ffff:ffff:ffff:ffff,US -2620:fe:2040::,2620:fe:2040:ffff:ffff:ffff:ffff:ffff,US -2620:fe:8000::,2620:fe:8000:ffff:ffff:ffff:ffff:ffff,US -2620:fe:c000::,2620:fe:c000:ffff:ffff:ffff:ffff:ffff,US -2620:ff::,2620:ff::ffff:ffff:ffff:ffff:ffff,US -2620:ff:4000::,2620:ff:4000:ffff:ffff:ffff:ffff:ffff,US -2620:ff:8000::,2620:ff:8000:ffff:ffff:ffff:ffff:ffff,US -2620:ff:c000::,2620:ff:c000:ffff:ffff:ffff:ffff:ffff,US -2620:100::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US -2620:100:3000::,2620:100:3007:ffff:ffff:ffff:ffff:ffff,US -2620:100:4000::,2620:100:403f:ffff:ffff:ffff:ffff:ffff,US -2620:100:5000::,2620:100:5007:ffff:ffff:ffff:ffff:ffff,US -2620:100:6000::,2620:100:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:100:7000::,2620:100:700f:ffff:ffff:ffff:ffff:ffff,US -2620:100:8000::,2620:100:8003:ffff:ffff:ffff:ffff:ffff,US -2620:100:9000::,2620:100:900f:ffff:ffff:ffff:ffff:ffff,US -2620:100:a000::,2620:100:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:100:c000::,2620:100:c03f:ffff:ffff:ffff:ffff:ffff,US -2620:100:d000::,2620:100:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:100:e000::,2620:100:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:100:f000::,2620:100:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:101::,2620:101:3:ffff:ffff:ffff:ffff:ffff,US -2620:101:1000::,2620:101:103f:ffff:ffff:ffff:ffff:ffff,US -2620:101:2000::,2620:101:201f:ffff:ffff:ffff:ffff:ffff,US -2620:101:3000::,2620:101:303f:ffff:ffff:ffff:ffff:ffff,US -2620:101:4000::,2620:101:403f:ffff:ffff:ffff:ffff:ffff,US -2620:101:5000::,2620:101:503f:ffff:ffff:ffff:ffff:ffff,US -2620:101:6000::,2620:101:6001:ffff:ffff:ffff:ffff:ffff,US -2620:101:7000::,2620:101:7001:ffff:ffff:ffff:ffff:ffff,US -2620:101:8000::,2620:101:80f1:ffff:ffff:ffff:ffff:ffff,US -2620:101:80f2::,2620:101:80f2:7fff:ffff:ffff:ffff:ffff,CA -2620:101:80f2:8000::,2620:101:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:101:9000::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US -2620:101:b000::,2620:101:b07f:ffff:ffff:ffff:ffff:ffff,US -2620:101:c000::,2620:101:c0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:101:d000::,2620:101:d007:ffff:ffff:ffff:ffff:ffff,US -2620:101:e000::,2620:101:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:101:f000::,2620:101:f001:ffff:ffff:ffff:ffff:ffff,CA -2620:102::,2620:102:f:ffff:ffff:ffff:ffff:ffff,US -2620:102:2000::,2620:102:200f:ffff:ffff:ffff:ffff:ffff,US -2620:102:3000::,2620:102:300f:ffff:ffff:ffff:ffff:ffff,US -2620:102:4000::,2620:102:403f:ffff:ffff:ffff:ffff:ffff,US -2620:102:5000::,2620:102:501f:ffff:ffff:ffff:ffff:ffff,US -2620:102:6000::,2620:102:6003:ffff:ffff:ffff:ffff:ffff,US -2620:102:7000::,2620:102:700f:ffff:ffff:ffff:ffff:ffff,US -2620:102:8000::,2620:102:800f:ffff:ffff:ffff:ffff:ffff,US -2620:102:9000::,2620:102:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:102:b000::,2620:102:b001:ffff:ffff:ffff:ffff:ffff,US -2620:102:c000::,2620:102:c007:ffff:ffff:ffff:ffff:ffff,US -2620:102:d000::,2620:102:d07f:ffff:ffff:ffff:ffff:ffff,US -2620:102:e000::,2620:102:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:102:f000::,2620:102:f003:ffff:ffff:ffff:ffff:ffff,US -2620:103::,2620:103:7:ffff:ffff:ffff:ffff:ffff,US -2620:103:1000::,2620:103:100f:ffff:ffff:ffff:ffff:ffff,US -2620:103:2000::,2620:103:200f:ffff:ffff:ffff:ffff:ffff,CA -2620:103:3000::,2620:103:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:103:4000::,2620:103:400f:ffff:ffff:ffff:ffff:ffff,US -2620:103:5000::,2620:103:500f:ffff:ffff:ffff:ffff:ffff,US -2620:103:6000::,2620:103:600f:ffff:ffff:ffff:ffff:ffff,US -2620:103:7000::,2620:103:700f:ffff:ffff:ffff:ffff:ffff,US -2620:103:8000::,2620:103:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:103:9000::,2620:103:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:103:a000::,2620:103:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:103:b000::,2620:103:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:103:c000::,2620:103:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:103:d000::,2620:103:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:103:e000::,2620:103:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:104::,2620:104:ff:ffff:ffff:ffff:ffff:ffff,US -2620:104:1000::,2620:104:100f:ffff:ffff:ffff:ffff:ffff,US -2620:104:2000::,2620:104:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:104:3000::,2620:104:300f:ffff:ffff:ffff:ffff:ffff,US -2620:104:4000::,2620:104:4001:ffff:ffff:ffff:ffff:ffff,GB -2620:104:4002::,2620:104:4003:ffff:ffff:ffff:ffff:ffff,US -2620:104:4004::,2620:104:4007:ffff:ffff:ffff:ffff:ffff,GB -2620:104:4008::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US -2620:104:5000::,2620:104:500f:ffff:ffff:ffff:ffff:ffff,US -2620:104:6000::,2620:104:600f:ffff:ffff:ffff:ffff:ffff,US -2620:104:8000::,2620:104:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:104:9000::,2620:104:900f:ffff:ffff:ffff:ffff:ffff,US -2620:104:a000::,2620:104:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:104:b000::,2620:104:b01f:ffff:ffff:ffff:ffff:ffff,US -2620:104:c000::,2620:104:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:104:d000::,2620:104:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:104:e000::,2620:104:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:104:f000::,2620:104:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:105::,2620:105:f:ffff:ffff:ffff:ffff:ffff,CA -2620:105:1000::,2620:105:100f:ffff:ffff:ffff:ffff:ffff,US -2620:105:2000::,2620:105:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:105:3000::,2620:105:300f:ffff:ffff:ffff:ffff:ffff,US -2620:105:4000::,2620:105:400f:ffff:ffff:ffff:ffff:ffff,US -2620:105:5000::,2620:105:500f:ffff:ffff:ffff:ffff:ffff,US -2620:105:6000::,2620:105:600f:ffff:ffff:ffff:ffff:ffff,US -2620:105:7000::,2620:105:700f:ffff:ffff:ffff:ffff:ffff,US -2620:105:8000::,2620:105:800f:ffff:ffff:ffff:ffff:ffff,US -2620:105:9000::,2620:105:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:105:a000::,2620:105:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:105:b000::,2620:105:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:105:c000::,2620:105:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:105:e000::,2620:105:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:105:f000::,2620:105:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:106::,2620:106:f:ffff:ffff:ffff:ffff:ffff,US -2620:106:1000::,2620:106:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:2000::,2620:106:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:3000::,2620:106:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:4000::,2620:106:400f:ffff:ffff:ffff:ffff:ffff,US -2620:106:5000::,2620:106:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:6000::,2620:106:600f:ffff:ffff:ffff:ffff:ffff,US -2620:106:7000::,2620:106:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:8000::,2620:106:800f:ffff:ffff:ffff:ffff:ffff,US -2620:106:9000::,2620:106:900f:ffff:ffff:ffff:ffff:ffff,US -2620:106:a000::,2620:106:a000:ffff:ffff:ffff:ffff:ffff,US -2620:106:a001::,2620:106:a001:7fff:ffff:ffff:ffff:ffff,IN -2620:106:a001:8000::,2620:106:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:106:b000::,2620:106:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:106:c000::,2620:106:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:106:d000::,2620:106:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:e000::,2620:106:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:106:f000::,2620:106:f00f:ffff:ffff:ffff:ffff:ffff,CA -2620:107::,2620:107:ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:1000::,2620:107:100f:ffff:ffff:ffff:ffff:ffff,US -2620:107:2000::,2620:107:200f:ffff:ffff:ffff:ffff:ffff,US -2620:107:3000::,2620:107:300f:ffff:ffff:ffff:ffff:ffff,US -2620:107:4000::,2620:107:4000:77ff:ffff:ffff:ffff:ffff,US -2620:107:4000:7800::,2620:107:4000:78ff:ffff:ffff:ffff:ffff,CA -2620:107:4000:7900::,2620:107:400f:ffff:ffff:ffff:ffff:ffff,US -2620:107:5000::,2620:107:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:6000::,2620:107:600f:ffff:ffff:ffff:ffff:ffff,US -2620:107:7000::,2620:107:700f:ffff:ffff:ffff:ffff:ffff,US -2620:107:8000::,2620:107:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:9000::,2620:107:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:a000::,2620:107:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:c000::,2620:107:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:107:d000::,2620:107:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:107:e000::,2620:107:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:107:f000::,2620:107:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:108::,2620:108:ff:ffff:ffff:ffff:ffff:ffff,US -2620:108:1000::,2620:108:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:108:2000::,2620:108:200f:ffff:ffff:ffff:ffff:ffff,US -2620:108:3000::,2620:108:300f:ffff:ffff:ffff:ffff:ffff,US -2620:108:4000::,2620:108:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:108:5000::,2620:108:500f:ffff:ffff:ffff:ffff:ffff,US -2620:108:6000::,2620:108:700f:ffff:ffff:ffff:ffff:ffff,US -2620:108:8000::,2620:108:800f:ffff:ffff:ffff:ffff:ffff,US -2620:108:9000::,2620:108:900f:ffff:ffff:ffff:ffff:ffff,US -2620:108:a000::,2620:108:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:108:b000::,2620:108:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:108:c000::,2620:108:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:108:d000::,2620:108:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:108:e000::,2620:108:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:108:f000::,2620:108:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:109::,2620:109:ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:1000::,2620:109:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:2000::,2620:109:200f:ffff:ffff:ffff:ffff:ffff,US -2620:109:3000::,2620:109:300f:ffff:ffff:ffff:ffff:ffff,US -2620:109:4000::,2620:109:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:5000::,2620:109:500f:ffff:ffff:ffff:ffff:ffff,US -2620:109:6000::,2620:109:600f:ffff:ffff:ffff:ffff:ffff,US -2620:109:7000::,2620:109:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:8000::,2620:109:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:9000::,2620:109:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:a000::,2620:109:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:109:b000::,2620:109:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:109:c000::,2620:109:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:109:d000::,2620:109:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:109:e000::,2620:109:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:109:f000::,2620:109:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:10a::,2620:10a:f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:1000::,2620:10a:100f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:2000::,2620:10a:200f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:3000::,2620:10a:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:4000::,2620:10a:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:5000::,2620:10a:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:6000::,2620:10a:600f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:8000::,2620:10a:80ff:ffff:ffff:ffff:ffff:ffff,CA -2620:10a:9000::,2620:10a:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:a000::,2620:10a:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:b000::,2620:10a:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:c000::,2620:10a:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:d000::,2620:10a:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:10a:e000::,2620:10a:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10a:f000::,2620:10a:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b::,2620:10b:f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:1000::,2620:10b:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b:2000::,2620:10b:200f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:3000::,2620:10b:30ff:ffff:ffff:ffff:ffff:ffff,CA -2620:10b:4000::,2620:10b:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b:5000::,2620:10b:500f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:6000::,2620:10b:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b:7000::,2620:10b:700f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:8000::,2620:10b:800f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:9000::,2620:10b:900f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:a000::,2620:10b:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:b000::,2620:10b:b00f:ffff:ffff:ffff:ffff:ffff,CA -2620:10b:c000::,2620:10b:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b:d000::,2620:10b:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:10b:e000::,2620:10b:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10b:f000::,2620:10b:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c::,2620:10c:f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:1000::,2620:10c:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c:2000::,2620:10c:200f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:3000::,2620:10c:300f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:4000::,2620:10c:400f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:5000::,2620:10c:500f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:6000::,2620:10c:600f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:7000::,2620:10c:700f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:9000::,2620:10c:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c:a000::,2620:10c:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:b000::,2620:10c:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c:c000::,2620:10c:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c:d000::,2620:10c:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:10c:e000::,2620:10c:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10c:f000::,2620:10c:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d::,2620:10d:f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:1000::,2620:10d:100f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:2000::,2620:10d:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:3000::,2620:10d:300f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:4000::,2620:10d:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:5000::,2620:10d:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:6000::,2620:10d:600f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:7000::,2620:10d:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:8000::,2620:10d:800f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:9000::,2620:10d:900f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:a000::,2620:10d:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:b000::,2620:10d:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:10d:c000::,2620:10d:c091:ffff:ffff:ffff:ffff:ffff,US -2620:10d:c092::,2620:10d:c092:7fff:ffff:ffff:ffff:ffff,IE -2620:10d:c092:8000::,2620:10d:c092:ffff:ffff:ffff:ffff:ffff,US -2620:10d:c093::,2620:10d:c093:7fff:ffff:ffff:ffff:ffff,FR -2620:10d:c093:8000::,2620:10d:c099:ffff:ffff:ffff:ffff:ffff,US -2620:10d:c09a::,2620:10d:c09a:7fff:ffff:ffff:ffff:ffff,BR -2620:10d:c09a:8000::,2620:10d:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10d:d000::,2620:10d:d00f:ffff:ffff:ffff:ffff:ffff,CA -2620:10d:e000::,2620:10d:e00f:ffff:ffff:ffff:ffff:ffff,CA -2620:10e::,2620:10e:f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:1000::,2620:10e:100f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:2000::,2620:10e:200f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:3000::,2620:10e:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:4000::,2620:10e:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:5000::,2620:10e:500f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:6000::,2620:10e:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:7000::,2620:10e:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:8000::,2620:10e:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:9000::,2620:10e:900f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:a000::,2620:10e:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:b000::,2620:10e:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10e:c000::,2620:10e:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:d000::,2620:10e:d00f:ffff:ffff:ffff:ffff:ffff,BL -2620:10e:e000::,2620:10e:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:10e:f000::,2620:10e:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:10f::,2620:10f:f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:1000::,2620:10f:100f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:2000::,2620:10f:200f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:3000::,2620:10f:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:4000::,2620:10f:400f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:5000::,2620:10f:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:6000::,2620:10f:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:7000::,2620:10f:700f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:8000::,2620:10f:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:9000::,2620:10f:900f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:a000::,2620:10f:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:b000::,2620:10f:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:c000::,2620:10f:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:d000::,2620:10f:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:10f:e000::,2620:10f:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:10f:f000::,2620:10f:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:110::,2620:110:f:ffff:ffff:ffff:ffff:ffff,US -2620:110:1000::,2620:110:100f:ffff:ffff:ffff:ffff:ffff,US -2620:110:2000::,2620:110:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:110:3000::,2620:110:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:110:4000::,2620:110:400f:ffff:ffff:ffff:ffff:ffff,US -2620:110:5000::,2620:110:500f:ffff:ffff:ffff:ffff:ffff,US -2620:110:6000::,2620:110:600f:ffff:ffff:ffff:ffff:ffff,US -2620:110:7000::,2620:110:700f:ffff:ffff:ffff:ffff:ffff,US -2620:110:8000::,2620:110:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:110:9000::,2620:110:900f:ffff:ffff:ffff:ffff:ffff,US -2620:110:a000::,2620:110:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:110:d000::,2620:110:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:110:e000::,2620:110:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:110:f000::,2620:110:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:111::,2620:111:ff:ffff:ffff:ffff:ffff:ffff,US -2620:111:1000::,2620:111:100f:ffff:ffff:ffff:ffff:ffff,US -2620:111:2000::,2620:111:200f:ffff:ffff:ffff:ffff:ffff,US -2620:111:3000::,2620:111:300f:ffff:ffff:ffff:ffff:ffff,US -2620:111:4000::,2620:111:400f:ffff:ffff:ffff:ffff:ffff,US -2620:111:5000::,2620:111:500f:ffff:ffff:ffff:ffff:ffff,US -2620:111:6000::,2620:111:600f:ffff:ffff:ffff:ffff:ffff,US -2620:111:7000::,2620:111:700f:ffff:ffff:ffff:ffff:ffff,US -2620:111:8000::,2620:111:800f:ffff:ffff:ffff:ffff:ffff,US -2620:111:9000::,2620:111:900f:ffff:ffff:ffff:ffff:ffff,US -2620:111:a000::,2620:111:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:111:b000::,2620:111:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:111:c000::,2620:111:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:111:d000::,2620:111:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:111:e000::,2620:111:e00f:ffff:ffff:ffff:ffff:ffff,CA -2620:111:f000::,2620:111:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:112:1000::,2620:112:107f:ffff:ffff:ffff:ffff:ffff,US -2620:112:2000::,2620:112:200f:ffff:ffff:ffff:ffff:ffff,US -2620:112:3000::,2620:112:300f:ffff:ffff:ffff:ffff:ffff,US -2620:112:4000::,2620:112:400f:ffff:ffff:ffff:ffff:ffff,US -2620:112:5000::,2620:112:500f:ffff:ffff:ffff:ffff:ffff,US -2620:112:6000::,2620:112:600f:ffff:ffff:ffff:ffff:ffff,US -2620:112:8000::,2620:112:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:112:9000::,2620:112:900f:ffff:ffff:ffff:ffff:ffff,CA -2620:112:a000::,2620:112:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:112:b000::,2620:112:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:112:c000::,2620:112:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:112:d000::,2620:112:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:112:e000::,2620:112:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:112:f000::,2620:112:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:113::,2620:113:f:ffff:ffff:ffff:ffff:ffff,US -2620:113:1000::,2620:113:100f:ffff:ffff:ffff:ffff:ffff,US -2620:113:2000::,2620:113:200f:ffff:ffff:ffff:ffff:ffff,CA -2620:113:3000::,2620:113:300f:ffff:ffff:ffff:ffff:ffff,US -2620:113:4000::,2620:113:400f:ffff:ffff:ffff:ffff:ffff,US -2620:113:5000::,2620:113:500f:ffff:ffff:ffff:ffff:ffff,US -2620:113:6000::,2620:113:600f:ffff:ffff:ffff:ffff:ffff,US -2620:113:7000::,2620:113:700f:ffff:ffff:ffff:ffff:ffff,US -2620:113:8000::,2620:113:80bf:ffff:ffff:ffff:ffff:ffff,US -2620:113:80c0::,2620:113:80c0:7fff:ffff:ffff:ffff:ffff,DE -2620:113:80c0:8000::,2620:113:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:113:9000::,2620:113:900f:ffff:ffff:ffff:ffff:ffff,US -2620:113:a000::,2620:113:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:113:c000::,2620:113:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:113:d000::,2620:113:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:113:e000::,2620:113:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:113:f000::,2620:113:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:114::,2620:114:f:ffff:ffff:ffff:ffff:ffff,US -2620:114:1000::,2620:114:100f:ffff:ffff:ffff:ffff:ffff,US -2620:114:2000::,2620:114:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:114:3000::,2620:114:300f:ffff:ffff:ffff:ffff:ffff,US -2620:114:5000::,2620:114:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:114:8000::,2620:114:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:114:9000::,2620:114:900f:ffff:ffff:ffff:ffff:ffff,US -2620:114:a000::,2620:114:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:114:b000::,2620:114:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:114:c000::,2620:114:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:114:d000::,2620:114:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:114:e000::,2620:114:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:114:f000::,2620:114:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:115::,2620:115:f:ffff:ffff:ffff:ffff:ffff,US -2620:115:15::,2620:115:15:7fff:ffff:ffff:ffff:ffff,US -2620:115:1000::,2620:115:100f:ffff:ffff:ffff:ffff:ffff,US -2620:115:2000::,2620:115:200f:ffff:ffff:ffff:ffff:ffff,US -2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,US -2620:115:4000::,2620:115:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:115:5000::,2620:115:500f:ffff:ffff:ffff:ffff:ffff,US -2620:115:6000::,2620:115:600f:ffff:ffff:ffff:ffff:ffff,US -2620:115:7000::,2620:115:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:115:8000::,2620:115:800f:ffff:ffff:ffff:ffff:ffff,US -2620:115:9000::,2620:115:900f:ffff:ffff:ffff:ffff:ffff,US -2620:115:b000::,2620:115:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:115:c000::,2620:115:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:115:d000::,2620:115:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:115:e000::,2620:115:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:115:f000::,2620:115:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:116::,2620:116:f:ffff:ffff:ffff:ffff:ffff,US -2620:116:1000::,2620:116:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:2000::,2620:116:200f:ffff:ffff:ffff:ffff:ffff,US -2620:116:3000::,2620:116:300f:ffff:ffff:ffff:ffff:ffff,US -2620:116:4000::,2620:116:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:5000::,2620:116:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:6000::,2620:116:600f:ffff:ffff:ffff:ffff:ffff,US -2620:116:7000::,2620:116:700f:ffff:ffff:ffff:ffff:ffff,US -2620:116:8000::,2620:116:8086:ffff:ffff:ffff:ffff:ffff,US -2620:116:8087::,2620:116:8087:7fff:ffff:ffff:ffff:ffff,AU -2620:116:8087:8000::,2620:116:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:9000::,2620:116:90ff:ffff:ffff:ffff:ffff:ffff,CA -2620:116:a000::,2620:116:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:b000::,2620:116:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:116:c000::,2620:116:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:116:d000::,2620:116:d0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:116:e000::,2620:116:e0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:116:f000::,2620:116:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117::,2620:117:ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:1000::,2620:117:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:2000::,2620:117:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:3000::,2620:117:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:4000::,2620:117:400f:ffff:ffff:ffff:ffff:ffff,US -2620:117:5000::,2620:117:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:6000::,2620:117:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:7000::,2620:117:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:8000::,2620:117:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:9000::,2620:117:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:a000::,2620:117:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:b000::,2620:117:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:c000::,2620:117:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:d000::,2620:117:d0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:117:e000::,2620:117:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:1000::,2620:118:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:2000::,2620:118:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:3000::,2620:118:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:4000::,2620:118:400f:ffff:ffff:ffff:ffff:ffff,US -2620:118:5000::,2620:118:500f:ffff:ffff:ffff:ffff:ffff,US -2620:118:6000::,2620:118:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:7000::,2620:118:700f:ffff:ffff:ffff:ffff:ffff,US -2620:118:8000::,2620:118:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:9000::,2620:118:900f:ffff:ffff:ffff:ffff:ffff,US -2620:118:a000::,2620:118:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:118:b000::,2620:118:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:c000::,2620:118:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:118:d000::,2620:118:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:118:e000::,2620:118:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:118:f000::,2620:118:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:119::,2620:119:f:ffff:ffff:ffff:ffff:ffff,US -2620:119:10::,2620:119:11:ffff:ffff:ffff:ffff:ffff,CA -2620:119:12::,2620:119:ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:1000::,2620:119:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:2000::,2620:119:200f:ffff:ffff:ffff:ffff:ffff,US -2620:119:3000::,2620:119:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:4000::,2620:119:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:5000::,2620:119:500d:ffff:ffff:ffff:ffff:ffff,US -2620:119:500e::,2620:119:500e:7fff:ffff:ffff:ffff:ffff,BR -2620:119:500e:8000::,2620:119:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:6000::,2620:119:600f:ffff:ffff:ffff:ffff:ffff,US -2620:119:7000::,2620:119:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:8000::,2620:119:800f:ffff:ffff:ffff:ffff:ffff,US -2620:119:9000::,2620:119:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:a000::,2620:119:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:119:b000::,2620:119:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:119:c000::,2620:119:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:119:d000::,2620:119:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:e000::,2620:119:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:119:f000::,2620:119:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:1000::,2620:11a:100f:ffff:ffff:ffff:ffff:ffff,CA -2620:11a:3000::,2620:11a:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:11a:4000::,2620:11a:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:11a:6000::,2620:11a:600f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:7000::,2620:11a:700f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:8000::,2620:11a:800f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:9000::,2620:11a:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:a000::,2620:11a:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11a:b000::,2620:11a:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:c000::,2620:11a:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11a:d000::,2620:11a:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11a:e000::,2620:11a:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:11a:f000::,2620:11b:ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:1000::,2620:11b:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:2000::,2620:11b:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:3000::,2620:11b:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:4000::,2620:11b:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:5000::,2620:11b:500f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:7000::,2620:11b:700f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:8000::,2620:11b:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:9000::,2620:11b:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:a000::,2620:11b:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:b000::,2620:11b:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:c000::,2620:11b:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:11b:d000::,2620:11b:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:e000::,2620:11b:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11b:f000::,2620:11b:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11c::,2620:11c:f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:1000::,2620:11c:10ff:ffff:ffff:ffff:ffff:ffff,BB -2620:11c:2000::,2620:11c:20ff:ffff:ffff:ffff:ffff:ffff,CA -2620:11c:3000::,2620:11c:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:11c:4000::,2620:11c:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:11c:5000::,2620:11c:500f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:6000::,2620:11c:600f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:7000::,2620:11c:700f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:8000::,2620:11c:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:11c:9000::,2620:11c:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:a000::,2620:11c:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:b000::,2620:11c:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:c000::,2620:11c:c00f:ffff:ffff:ffff:ffff:ffff,CA -2620:11c:d000::,2620:11c:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:e000::,2620:11c:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:11c:f000::,2620:11c:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:11d::,2620:11d:f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:1000::,2620:11d:100f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:2000::,2620:11d:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:3000::,2620:11d:300f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:4000::,2620:11d:400f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:5000::,2620:11d:500f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:6000::,2620:11d:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:7000::,2620:11d:700f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:8000::,2620:11d:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:9000::,2620:11d:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:a000::,2620:11d:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:b000::,2620:11d:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:c000::,2620:11d:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:11d:d000::,2620:11d:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:e000::,2620:11d:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11d:f000::,2620:11d:f0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:11e::,2620:11e:ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:1000::,2620:11e:100f:ffff:ffff:ffff:ffff:ffff,US -2620:11e:2000::,2620:11e:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:3000::,2620:11e:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:4000::,2620:11e:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:5000::,2620:11e:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:6000::,2620:11e:600f:ffff:ffff:ffff:ffff:ffff,US -2620:11e:7000::,2620:11e:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:8000::,2620:11e:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:9000::,2620:11e:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11e:a000::,2620:11e:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:11e:b000::,2620:11e:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:c000::,2620:11e:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11e:d000::,2620:11e:d00f:ffff:ffff:ffff:ffff:ffff,CA -2620:11e:e000::,2620:11e:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:11e:f000::,2620:11e:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:11f::,2620:11f:f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:1000::,2620:11f:100f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:2000::,2620:11f:200f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:3000::,2620:11f:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:4000::,2620:11f:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:5000::,2620:11f:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:6000::,2620:11f:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:7000::,2620:11f:700f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:8000::,2620:11f:80ff:ffff:ffff:ffff:ffff:ffff,CA -2620:11f:9000::,2620:11f:900f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:a000::,2620:11f:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:b000::,2620:11f:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:c000::,2620:11f:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:d000::,2620:11f:d009:ffff:ffff:ffff:ffff:ffff,US -2620:11f:d00a::,2620:11f:d00a:ffff:ffff:ffff:ffff:ffff,GB -2620:11f:d00b::,2620:11f:d00b:ffff:ffff:ffff:ffff:ffff,US -2620:11f:d00c::,2620:11f:d00c:ffff:ffff:ffff:ffff:ffff,GB -2620:11f:d00d::,2620:11f:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:11f:e000::,2620:11f:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:11f:f000::,2620:11f:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:120::,2620:120:ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:1000::,2620:120:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:2000::,2620:120:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:3000::,2620:120:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:4000::,2620:120:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:5000::,2620:120:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:6000::,2620:120:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:7000::,2620:120:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:8000::,2620:120:800f:ffff:ffff:ffff:ffff:ffff,CA -2620:120:9000::,2620:120:900f:ffff:ffff:ffff:ffff:ffff,CA -2620:120:a000::,2620:120:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:b000::,2620:120:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:c000::,2620:120:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:d000::,2620:120:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:120:e000::,2620:120:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:120:f000::,2620:120:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:121::,2620:121:f:ffff:ffff:ffff:ffff:ffff,US -2620:121:1000::,2620:121:100f:ffff:ffff:ffff:ffff:ffff,US -2620:121:2000::,2620:121:200f:ffff:ffff:ffff:ffff:ffff,US -2620:121:3000::,2620:121:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:121:4000::,2620:121:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:121:5000::,2620:121:500f:ffff:ffff:ffff:ffff:ffff,US -2620:121:6000::,2620:121:600f:ffff:ffff:ffff:ffff:ffff,US -2620:121:7000::,2620:121:700f:ffff:ffff:ffff:ffff:ffff,US -2620:121:8000::,2620:121:800f:ffff:ffff:ffff:ffff:ffff,US -2620:121:9000::,2620:121:900f:ffff:ffff:ffff:ffff:ffff,US -2620:121:a000::,2620:121:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:121:b000::,2620:121:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:121:c000::,2620:121:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:121:d000::,2620:121:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:121:e000::,2620:121:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:121:f000::,2620:121:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:122::,2620:122:f:ffff:ffff:ffff:ffff:ffff,US -2620:122:1000::,2620:122:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:2000::,2620:122:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:3000::,2620:122:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:4000::,2620:122:400f:ffff:ffff:ffff:ffff:ffff,US -2620:122:6000::,2620:122:600f:ffff:ffff:ffff:ffff:ffff,US -2620:122:7000::,2620:122:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:8000::,2620:122:800f:ffff:ffff:ffff:ffff:ffff,US -2620:122:9000::,2620:122:900f:ffff:ffff:ffff:ffff:ffff,US -2620:122:a000::,2620:122:a0ff:ffff:ffff:ffff:ffff:ffff,BL -2620:122:b000::,2620:122:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:122:c000::,2620:122:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:d000::,2620:122:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:122:e000::,2620:122:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:122:f000::,2620:122:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:123::,2620:123:f:ffff:ffff:ffff:ffff:ffff,US -2620:123:1000::,2620:123:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:2000::,2620:123:200f:ffff:ffff:ffff:ffff:ffff,US -2620:123:3000::,2620:123:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:4000::,2620:123:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:5000::,2620:123:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:6000::,2620:123:600f:ffff:ffff:ffff:ffff:ffff,CA -2620:123:7000::,2620:123:700f:ffff:ffff:ffff:ffff:ffff,CA -2620:123:8000::,2620:123:800f:ffff:ffff:ffff:ffff:ffff,US -2620:123:9000::,2620:123:900f:ffff:ffff:ffff:ffff:ffff,US -2620:123:a000::,2620:123:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:123:b000::,2620:123:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:123:c000::,2620:123:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:d000::,2620:123:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:e000::,2620:123:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:123:f000::,2620:123:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:124::,2620:124:f:ffff:ffff:ffff:ffff:ffff,US -2620:124:1000::,2620:124:100f:ffff:ffff:ffff:ffff:ffff,US -2620:124:2000::,2620:124:200f:ffff:ffff:ffff:ffff:ffff,US -2620:124:3000::,2620:124:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:124:4000::,2620:124:400f:ffff:ffff:ffff:ffff:ffff,US -2620:124:5000::,2620:124:50ff:ffff:ffff:ffff:ffff:ffff,CA -2620:124:6000::,2620:124:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:124:7000::,2620:124:700f:ffff:ffff:ffff:ffff:ffff,US -2620:124:8000::,2620:124:800f:ffff:ffff:ffff:ffff:ffff,US -2620:124:9000::,2620:124:900f:ffff:ffff:ffff:ffff:ffff,US -2620:124:a000::,2620:124:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:124:b000::,2620:124:b0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:124:c000::,2620:124:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:124:d000::,2620:124:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:124:e000::,2620:124:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:124:f000::,2620:124:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:125::,2620:125:ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:1000::,2620:125:100f:ffff:ffff:ffff:ffff:ffff,US -2620:125:2000::,2620:125:200f:ffff:ffff:ffff:ffff:ffff,US -2620:125:3000::,2620:125:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:4000::,2620:125:400f:ffff:ffff:ffff:ffff:ffff,US -2620:125:5000::,2620:125:500f:ffff:ffff:ffff:ffff:ffff,CA -2620:125:6000::,2620:125:600f:ffff:ffff:ffff:ffff:ffff,US -2620:125:7000::,2620:125:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:8000::,2620:125:800f:ffff:ffff:ffff:ffff:ffff,US -2620:125:9000::,2620:125:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:a000::,2620:125:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:125:b000::,2620:125:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:125:c000::,2620:125:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:d000::,2620:125:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:e000::,2620:125:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:125:f000::,2620:125:f00f:ffff:ffff:ffff:ffff:ffff,CA -2620:126::,2620:126:f:ffff:ffff:ffff:ffff:ffff,US -2620:126:1000::,2620:126:100f:ffff:ffff:ffff:ffff:ffff,US -2620:126:2000::,2620:126:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:3000::,2620:126:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:4000::,2620:126:400f:ffff:ffff:ffff:ffff:ffff,US -2620:126:5000::,2620:126:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:6000::,2620:126:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:7000::,2620:126:700f:ffff:ffff:ffff:ffff:ffff,CA -2620:126:8000::,2620:126:800f:ffff:ffff:ffff:ffff:ffff,US -2620:126:9000::,2620:126:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:a000::,2620:126:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:126:b000::,2620:126:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:c000::,2620:126:c00f:ffff:ffff:ffff:ffff:ffff,CA -2620:126:d000::,2620:126:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:126:e000::,2620:126:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:126:f000::,2620:126:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:127::,2620:127:f:ffff:ffff:ffff:ffff:ffff,US -2620:127:1000::,2620:127:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:2000::,2620:127:200f:ffff:ffff:ffff:ffff:ffff,US -2620:127:3000::,2620:127:300f:ffff:ffff:ffff:ffff:ffff,US -2620:127:4000::,2620:127:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:5000::,2620:127:500f:ffff:ffff:ffff:ffff:ffff,US -2620:127:6000::,2620:127:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:7000::,2620:127:700f:ffff:ffff:ffff:ffff:ffff,US -2620:127:8000::,2620:127:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:9000::,2620:127:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:a000::,2620:127:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:b000::,2620:127:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:127:c000::,2620:127:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:d000::,2620:127:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:e000::,2620:127:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:127:f000::,2620:127:f00f:ffff:ffff:ffff:ffff:ffff,CA -2620:128::,2620:128:f:ffff:ffff:ffff:ffff:ffff,US -2620:128:1000::,2620:128:100f:ffff:ffff:ffff:ffff:ffff,US -2620:128:2000::,2620:128:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:3000::,2620:128:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:4000::,2620:128:400f:ffff:ffff:ffff:ffff:ffff,US -2620:128:5000::,2620:128:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:6000::,2620:128:600f:ffff:ffff:ffff:ffff:ffff,US -2620:128:7000::,2620:128:700f:ffff:ffff:ffff:ffff:ffff,US -2620:128:8000::,2620:128:800f:ffff:ffff:ffff:ffff:ffff,US -2620:128:a000::,2620:128:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:b000::,2620:128:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:c000::,2620:128:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:d000::,2620:128:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:e000::,2620:128:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:128:f000::,2620:128:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:129::,2620:129:f:ffff:ffff:ffff:ffff:ffff,US -2620:129:1000::,2620:129:100f:ffff:ffff:ffff:ffff:ffff,US -2620:129:2000::,2620:129:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:3000::,2620:129:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:4000::,2620:129:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:5000::,2620:129:500f:ffff:ffff:ffff:ffff:ffff,US -2620:129:6000::,2620:129:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:7000::,2620:129:700f:ffff:ffff:ffff:ffff:ffff,CA -2620:129:8000::,2620:129:800f:ffff:ffff:ffff:ffff:ffff,US -2620:129:9000::,2620:129:900f:ffff:ffff:ffff:ffff:ffff,US -2620:129:a000::,2620:129:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:b000::,2620:129:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:129:c000::,2620:129:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:129:d000::,2620:129:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:129:e000::,2620:129:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:129:f000::,2620:129:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:12a::,2620:12a:ff:ffff:ffff:ffff:ffff:ffff,CA -2620:12a:1000::,2620:12a:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:2000::,2620:12a:200f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:3000::,2620:12a:300f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:4000::,2620:12a:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:5000::,2620:12a:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:6000::,2620:12a:600f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:7000::,2620:12a:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:8000::,2620:12a:800f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:9000::,2620:12a:900f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:a000::,2620:12a:a00f:ffff:ffff:ffff:ffff:ffff,CA -2620:12a:b000::,2620:12a:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:c000::,2620:12a:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:d000::,2620:12a:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12a:e000::,2620:12a:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:12a:f000::,2620:12a:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b::,2620:12b:f:ffff:ffff:ffff:ffff:ffff,US -2620:12b:1000::,2620:12b:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:2000::,2620:12b:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:3000::,2620:12b:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:4000::,2620:12b:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:5000::,2620:12b:50ff:ffff:ffff:ffff:ffff:ffff,CA -2620:12b:6000::,2620:12b:600f:ffff:ffff:ffff:ffff:ffff,CA -2620:12b:7000::,2620:12b:700f:ffff:ffff:ffff:ffff:ffff,US -2620:12b:8000::,2620:12b:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:9000::,2620:12b:900f:ffff:ffff:ffff:ffff:ffff,US -2620:12b:a000::,2620:12b:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:b000::,2620:12b:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:12b:c000::,2620:12b:c0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:d000::,2620:12b:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:12b:e000::,2620:12b:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12b:f000::,2620:12b:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c::,2620:12c:f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:1000::,2620:12c:100f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:2000::,2620:12c:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c:3000::,2620:12c:300f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:4000::,2620:12c:400f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:5000::,2620:12c:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c:6000::,2620:12c:600f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:7000::,2620:12c:700f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:8000::,2620:12c:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c:9000::,2620:12c:900f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:a000::,2620:12c:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:b000::,2620:12c:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c:c000::,2620:12c:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:d000::,2620:12c:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12c:e000::,2620:12c:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:12c:f000::,2620:12c:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:12d::,2620:12d:ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:1000::,2620:12d:100f:ffff:ffff:ffff:ffff:ffff,CA -2620:12d:2000::,2620:12d:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:3000::,2620:12d:300f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:4000::,2620:12d:400f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:5000::,2620:12d:500f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:6000::,2620:12d:600f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:7000::,2620:12d:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:8000::,2620:12d:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:9000::,2620:12d:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:a000::,2620:12d:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:b000::,2620:12d:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:c000::,2620:12d:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:d000::,2620:12d:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:12d:e000::,2620:12d:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12d:f000::,2620:12d:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e::,2620:12e:f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:1000::,2620:12e:100f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:2000::,2620:12e:200f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:3000::,2620:12e:300f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:4000::,2620:12e:400f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:5000::,2620:12e:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e:6000::,2620:12e:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e:7000::,2620:12e:700f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:8000::,2620:12e:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e:9000::,2620:12e:900f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:a000::,2620:12e:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e:b000::,2620:12e:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:c000::,2620:12e:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:d000::,2620:12e:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:12e:e000::,2620:12e:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12e:f000::,2620:12e:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f::,2620:12f:f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:1000::,2620:12f:100f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:2000::,2620:12f:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f:3000::,2620:12f:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f:4000::,2620:12f:400f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:5000::,2620:12f:500f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:6000::,2620:12f:600f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:7000::,2620:12f:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f:8000::,2620:12f:800f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:9000::,2620:12f:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f:a000::,2620:12f:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:b000::,2620:12f:b00f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:c000::,2620:12f:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:d000::,2620:12f:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:12f:e000::,2620:12f:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:12f:f000::,2620:12f:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:130::,2620:130:f:ffff:ffff:ffff:ffff:ffff,US -2620:130:1000::,2620:130:100f:ffff:ffff:ffff:ffff:ffff,CA -2620:130:2000::,2620:130:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:130:3000::,2620:130:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:130:4000::,2620:130:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:130:5000::,2620:130:500f:ffff:ffff:ffff:ffff:ffff,US -2620:130:6000::,2620:130:600f:ffff:ffff:ffff:ffff:ffff,US -2620:130:7000::,2620:130:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:130:8000::,2620:130:800f:ffff:ffff:ffff:ffff:ffff,US -2620:130:9000::,2620:130:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:130:a000::,2620:130:a00f:ffff:ffff:ffff:ffff:ffff,CA -2620:130:c000::,2620:130:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:130:d000::,2620:130:d00f:ffff:ffff:ffff:ffff:ffff,US -2620:130:e000::,2620:130:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:130:f000::,2620:130:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:131::,2620:131:f:ffff:ffff:ffff:ffff:ffff,US -2620:131:1000::,2620:131:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:2000::,2620:131:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:3000::,2620:131:300f:ffff:ffff:ffff:ffff:ffff,US -2620:131:4000::,2620:131:40ff:ffff:ffff:ffff:ffff:ffff,CA -2620:131:5000::,2620:131:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:6000::,2620:131:60ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:7000::,2620:131:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:8000::,2620:131:800f:ffff:ffff:ffff:ffff:ffff,US -2620:131:9000::,2620:131:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:a000::,2620:131:a0ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:b000::,2620:131:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:c000::,2620:131:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:131:d000::,2620:131:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:131:e000::,2620:131:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:131:f000::,2620:131:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:132::,2620:132:f:ffff:ffff:ffff:ffff:ffff,US -2620:132:1000::,2620:132:10ff:ffff:ffff:ffff:ffff:ffff,US -2620:132:2000::,2620:132:20ff:ffff:ffff:ffff:ffff:ffff,CA -2620:132:3000::,2620:132:30ff:ffff:ffff:ffff:ffff:ffff,CA -2620:132:4000::,2620:132:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:132:5000::,2620:132:500f:ffff:ffff:ffff:ffff:ffff,US -2620:132:6000::,2620:132:600f:ffff:ffff:ffff:ffff:ffff,US -2620:132:7000::,2620:132:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:132:8000::,2620:132:800f:ffff:ffff:ffff:ffff:ffff,US -2620:132:9000::,2620:132:900f:ffff:ffff:ffff:ffff:ffff,US -2620:132:a000::,2620:132:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:132:b000::,2620:132:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:132:c000::,2620:132:c0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:132:d000::,2620:132:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:132:e000::,2620:132:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:132:f000::,2620:132:f0ff:ffff:ffff:ffff:ffff:ffff,US -2620:133::,2620:133:ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:1000::,2620:133:100f:ffff:ffff:ffff:ffff:ffff,US -2620:133:2000::,2620:133:20ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:3000::,2620:133:30ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:4000::,2620:133:40ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:5000::,2620:133:500f:ffff:ffff:ffff:ffff:ffff,US -2620:133:6000::,2620:133:600f:ffff:ffff:ffff:ffff:ffff,US -2620:133:7000::,2620:133:70ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:8000::,2620:133:800f:ffff:ffff:ffff:ffff:ffff,US -2620:133:9000::,2620:133:900f:ffff:ffff:ffff:ffff:ffff,US -2620:133:a000::,2620:133:a0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:133:b000::,2620:133:b0ff:ffff:ffff:ffff:ffff:ffff,CA -2620:133:c000::,2620:133:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:133:d000::,2620:133:d0ff:ffff:ffff:ffff:ffff:ffff,US -2620:133:e000::,2620:133:e00f:ffff:ffff:ffff:ffff:ffff,US -2620:133:f000::,2620:133:f00f:ffff:ffff:ffff:ffff:ffff,US -2620:134::,2620:134:f:ffff:ffff:ffff:ffff:ffff,US -2620:134:1000::,2620:134:100f:ffff:ffff:ffff:ffff:ffff,US -2620:134:2000::,2620:134:200f:ffff:ffff:ffff:ffff:ffff,US -2620:134:3000::,2620:134:300f:ffff:ffff:ffff:ffff:ffff,CA -2620:134:4000::,2620:134:400f:ffff:ffff:ffff:ffff:ffff,US -2620:134:5000::,2620:134:50ff:ffff:ffff:ffff:ffff:ffff,US -2620:134:6000::,2620:134:600f:ffff:ffff:ffff:ffff:ffff,US -2620:134:7000::,2620:134:700f:ffff:ffff:ffff:ffff:ffff,CA -2620:134:8000::,2620:134:800f:ffff:ffff:ffff:ffff:ffff,US -2620:134:9000::,2620:134:90ff:ffff:ffff:ffff:ffff:ffff,US -2620:134:a000::,2620:134:a00f:ffff:ffff:ffff:ffff:ffff,US -2620:134:b000::,2620:134:b0ff:ffff:ffff:ffff:ffff:ffff,US -2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US -2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US -2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US -2620:144::,2620:145:fff:ffff:ffff:ffff:ffff:ffff,US -2620:146::,2620:146:fff:ffff:ffff:ffff:ffff:ffff,US -2620:147::,2620:147:fff:ffff:ffff:ffff:ffff:ffff,US -2620:148::,2620:148:fff:ffff:ffff:ffff:ffff:ffff,US -2620:149::,2620:149:a01:ffff:ffff:ffff:ffff:ffff,US -2620:149:a02::,2620:149:a02:ffff:ffff:ffff:ffff:ffff,BR -2620:149:a03::,2620:14a:fff:ffff:ffff:ffff:ffff:ffff,US -2620:14b::,2620:14b:fff:ffff:ffff:ffff:ffff:ffff,US -2620:14c::,2620:14c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:14d::,2620:14d:fff:ffff:ffff:ffff:ffff:ffff,US -2620:14e::,2620:14e:fff:ffff:ffff:ffff:ffff:ffff,US -2620:14f::,2620:14f:fff:ffff:ffff:ffff:ffff:ffff,US -2620:150::,2620:150:fff:ffff:ffff:ffff:ffff:ffff,US -2620:151::,2620:151:fff:ffff:ffff:ffff:ffff:ffff,US -2620:152::,2620:152:fff:ffff:ffff:ffff:ffff:ffff,US -2620:153::,2620:153:fff:ffff:ffff:ffff:ffff:ffff,US -2620:154::,2620:154:fff:ffff:ffff:ffff:ffff:ffff,US -2620:155::,2620:155:fff:ffff:ffff:ffff:ffff:ffff,US -2620:156::,2620:156:fff:ffff:ffff:ffff:ffff:ffff,US -2620:157::,2620:157:fff:ffff:ffff:ffff:ffff:ffff,US -2620:158::,2620:158:fff:ffff:ffff:ffff:ffff:ffff,US -2620:159::,2620:159:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15a::,2620:15a:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15b::,2620:15b:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15c::,2620:15c:1:ffff:ffff:ffff:ffff:ffff,CA -2620:15c:2::,2620:15c:4:ffff:ffff:ffff:ffff:ffff,US -2620:15c:5::,2620:15c:5:ffff:ffff:ffff:ffff:ffff,BR -2620:15c:6::,2620:15c:d:ffff:ffff:ffff:ffff:ffff,US -2620:15c:e::,2620:15c:e:ffff:ffff:ffff:ffff:ffff,MX -2620:15c:f::,2620:15c:2d:ffff:ffff:ffff:ffff:ffff,US -2620:15c:2e::,2620:15c:2e:7fff:ffff:ffff:ffff:ffff,MX -2620:15c:2e:8000::,2620:15c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15d::,2620:15f:fff:ffff:ffff:ffff:ffff:ffff,US -2620:160::,2620:160:ffff:ffff:ffff:ffff:ffff:ffff,US -2620:162::,2620:162:fff:ffff:ffff:ffff:ffff:ffff,US -2620:163::,2620:163:fff:ffff:ffff:ffff:ffff:ffff,US -2620:164::,2620:164:fff:ffff:ffff:ffff:ffff:ffff,US -2620:165::,2620:165:fff:ffff:ffff:ffff:ffff:ffff,US -2620:166::,2620:166:fff:ffff:ffff:ffff:ffff:ffff,US -2620:167::,2620:167:fff:ffff:ffff:ffff:ffff:ffff,US -2620:168::,2620:169:fff:ffff:ffff:ffff:ffff:ffff,US -2620:16a::,2620:16a:fff:ffff:ffff:ffff:ffff:ffff,US -2620:16b::,2620:16c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:16d::,2620:16f:fff:ffff:ffff:ffff:ffff:ffff,US -2620:170::,2620:170:fff:ffff:ffff:ffff:ffff:ffff,US -2620:171::,2620:171:fff:ffff:ffff:ffff:ffff:ffff,US -2620:172::,2620:172:fff:ffff:ffff:ffff:ffff:ffff,US -2620:173::,2620:173:fff:ffff:ffff:ffff:ffff:ffff,US -2620:174::,2620:174:fff:ffff:ffff:ffff:ffff:ffff,US -2620:175::,2620:175:fff:ffff:ffff:ffff:ffff:ffff,CA -2620:176::,2620:177:fff:ffff:ffff:ffff:ffff:ffff,US -2620:178::,2620:178:fff:ffff:ffff:ffff:ffff:ffff,US -2620:179::,2620:179:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17b::,2620:17b:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17c::,2620:17c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17e::,2620:17e:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17f::,2620:181:fff:ffff:ffff:ffff:ffff:ffff,US -2620:182::,2620:182:fff:ffff:ffff:ffff:ffff:ffff,US -2620:183::,2620:183:fff:ffff:ffff:ffff:ffff:ffff,US -2620:184::,2620:184:fff:ffff:ffff:ffff:ffff:ffff,US -2620:185::,2620:185:fff:ffff:ffff:ffff:ffff:ffff,US -2620:186::,2620:186:fff:ffff:ffff:ffff:ffff:ffff,US -2620:187::,2620:187:fff:ffff:ffff:ffff:ffff:ffff,US -2620:188::,2620:188:fff:ffff:ffff:ffff:ffff:ffff,US -2620:189::,2620:189:fff:ffff:ffff:ffff:ffff:ffff,US -2620:18a::,2620:18a:fff:ffff:ffff:ffff:ffff:ffff,US -2620:18b::,2620:18c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:18d::,2620:18d:fff:ffff:ffff:ffff:ffff:ffff,US -2620:18e::,2620:18e:fff:ffff:ffff:ffff:ffff:ffff,US -2620:18f::,2620:18f:fff:ffff:ffff:ffff:ffff:ffff,US -2620:190::,2620:191:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1a0::,2620:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2620:1b0::,2620:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US -2620:1c0::,2620:1c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2620:1d0::,2620:1d1:ffff:ffff:ffff:ffff:ffff:ffff,US -2620:1d2::,2620:1d2:ffff:ffff:ffff:ffff:ffff:ffff,CA -2620:1d3::,2620:1d5:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1d6::,2620:1d6:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1d7::,2620:1d7:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1d8::,2620:1d8:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1d9::,2620:1d9:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1da::,2620:1da:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1db::,2620:1db:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1dc::,2620:1dc:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1dd::,2620:1dd:fff:ffff:ffff:ffff:ffff:ffff,CA -2620:1de::,2620:1de:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1df::,2620:1df:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e0::,2620:1e1:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e2::,2620:1e2:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e3::,2620:1e3:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e4::,2620:1e4:ffff:ffff:ffff:ffff:ffff:ffff,CA -2620:1e5::,2620:1e5:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e6::,2620:1e6:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e7::,2620:1e7:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e8::,2620:1e8:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1e9::,2620:1e9:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1ea::,2620:1ea:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1eb::,2620:1eb:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1ec::,2620:1ec:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1ee::,2620:1ee:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1ef::,2620:1ef:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1f0::,2620:1f1:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1f2::,2620:1f4:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1f5::,2620:1f5:fff:ffff:ffff:ffff:ffff:ffff,CA -2620:1f6::,2620:1f6:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1f7::,2620:1f7:3807:ffff:ffff:ffff:ffff:ffff,US -2620:1f7:3808::,2620:1f7:3808:7fff:ffff:ffff:ffff:ffff,AU -2620:1f7:3808:8000::,2620:1f9:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1fa::,2620:1fb:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1fc::,2620:1fc:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1fd::,2620:1fd:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1fe::,2620:1fe:fff:ffff:ffff:ffff:ffff:ffff,US -2620:1ff::,2620:1ff:fff:ffff:ffff:ffff:ffff:ffff,US -2800:8::,2800:8:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:10::,2800:10:ffff:ffff:ffff:ffff:ffff:ffff,NI -2800:18::,2800:18:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:20::,2800:30:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:38::,2800:38:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:40::,2800:40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:48::,2800:48:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:68::,2800:68:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:70::,2800:70:ffff:ffff:ffff:ffff:ffff:ffff,TT -2800:80::,2800:80:ffff:ffff:ffff:ffff:ffff:ffff,CW -2800:88::,2800:88:ffff:ffff:ffff:ffff:ffff:ffff,BO -2800:90::,2800:90:ffff:ffff:ffff:ffff:ffff:ffff,SV -2800:98::,2800:98:ffff:ffff:ffff:ffff:ffff:ffff,GT -2800:a0::,2800:a4:110:7fff:ffff:ffff:ffff:ffff,UY -2800:a4:110:8000::,2800:a4:110:ffff:ffff:ffff:ffff:ffff,PE -2800:a4:111::,2800:af:ffff:ffff:ffff:ffff:ffff:ffff,UY -2800:e0::,2800:ef:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:f0::,2800:f0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:100::,2800:100:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:110::,2800:110:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:120::,2800:120:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:130::,2800:130:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:140::,2800:140:ffff:ffff:ffff:ffff:ffff:ffff,PA -2800:150::,2800:150:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:160::,2800:160:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:170::,2800:170:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:180::,2800:180:ffff:ffff:ffff:ffff:ffff:ffff,TT -2800:190::,2800:190:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:1a0::,2800:1a0:ffff:ffff:ffff:ffff:ffff:ffff,GT -2800:1b0::,2800:1b0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:1c0::,2800:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:1d0::,2800:1d0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:1e0::,2800:1e0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:1f0::,2800:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:200::,2800:200:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:220::,2800:220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:230::,2800:230:ffff:ffff:ffff:ffff:ffff:ffff,CU -2800:240::,2800:240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:250::,2800:250:ffff:ffff:ffff:ffff:ffff:ffff,UY -2800:260::,2800:26f:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:270::,2800:270:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:280::,2800:280:ffff:ffff:ffff:ffff:ffff:ffff,SX -2800:290::,2800:290:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:2a0::,2800:2a0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:2b0::,2800:2b0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:2d0::,2800:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:2e0::,2800:2e0:ffff:ffff:ffff:ffff:ffff:ffff,CW -2800:2f0::,2800:2f0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:300::,2800:300:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:310::,2800:310:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:320::,2800:320:ffff:ffff:ffff:ffff:ffff:ffff,BO -2800:330::,2800:330:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:340::,2800:340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:350::,2800:357:ffff:ffff:ffff:ffff:ffff:ffff,PA -2800:360::,2800:360:ffff:ffff:ffff:ffff:ffff:ffff,CU -2800:370::,2800:370:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:380::,2800:381:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:390::,2800:390:ffff:ffff:ffff:ffff:ffff:ffff,BO -2800:3a0::,2800:3a0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2800:3b0::,2800:3b0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:3c0::,2800:3c0:ffff:ffff:ffff:ffff:ffff:ffff,GY -2800:3d0::,2800:3d0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:3e0::,2800:3e0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:3f0::,2800:3f0:4002:ffff:ffff:ffff:ffff:ffff,AR -2800:3f0:4003::,2800:3f0:4003:ffff:ffff:ffff:ffff:ffff,CL -2800:3f0:4004::,2800:3f0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:400::,2800:400:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:410::,2800:410:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2800:420::,2800:423:ffff:ffff:ffff:ffff:ffff:ffff,TT -2800:430::,2800:430:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:440::,2800:440:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:460::,2800:460:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:470::,2800:470:ffff:ffff:ffff:ffff:ffff:ffff,SX -2800:480::,2800:487:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:490::,2800:490:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:4b0::,2800:4b0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:4c0::,2800:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:4d0::,2800:4d0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:4e0::,2800:4e0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:4f0::,2800:4f0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:500::,2800:500:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:510::,2800:510:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:530::,2800:530:ffff:ffff:ffff:ffff:ffff:ffff,CW -2800:540::,2800:540:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:550::,2800:550:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:560::,2800:560:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:570::,2800:570:ffff:ffff:ffff:ffff:ffff:ffff,HT -2800:580::,2800:580:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:590::,2800:590:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:5a0::,2800:5a0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:5b0::,2800:5b0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:5c0::,2800:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:5d0::,2800:5d0:ffff:ffff:ffff:ffff:ffff:ffff,PA -2800:5e0::,2800:5e0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:5f0::,2800:5f0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:600::,2800:600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:610::,2800:610:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:620::,2800:620:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:630::,2800:630:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:640::,2800:640:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:650::,2800:650:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:660::,2800:661:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:670::,2800:670:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:680::,2800:680:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:690::,2800:690:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:6a0::,2800:6a0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2800:6b0::,2800:6bf:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:6c0::,2800:6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:6d0::,2800:6d0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:6e0::,2800:6e0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:6f0::,2800:6f0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:700::,2800:700:ffff:ffff:ffff:ffff:ffff:ffff,UY -2800:800::,2800:800:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:810::,2800:820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:830::,2800:831:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:840::,2800:840:ffff:ffff:ffff:ffff:ffff:ffff,UY -2800:850::,2800:850:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:860::,2800:860:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:870::,2800:870:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:880::,2800:883:ffff:ffff:ffff:ffff:ffff:ffff,SV -2800:890::,2800:890:ffff:ffff:ffff:ffff:ffff:ffff,GT -2800:8a0::,2800:8a0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:8b0::,2800:8b0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:8c0::,2800:8c0:ffff:ffff:ffff:ffff:ffff:ffff,NI -2800:8d0::,2800:8d0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:8e0::,2800:8e0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:8f0::,2800:8f0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:900::,2800:900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:910::,2800:910:ffff:ffff:ffff:ffff:ffff:ffff,CU -2800:920::,2800:920:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:930::,2800:937:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:940::,2800:940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:950::,2800:950:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:960::,2800:960:ffff:ffff:ffff:ffff:ffff:ffff,PY -2800:970::,2800:970:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:980::,2800:980:ffff:ffff:ffff:ffff:ffff:ffff,PA -2800:990::,2800:990:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:9a0::,2800:9a7:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:9b0::,2800:9b0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:9c0::,2800:9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:9d0::,2800:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:9e0::,2800:9e0:ffff:ffff:ffff:ffff:ffff:ffff,CW -2800:9f0::,2800:9f0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:a00::,2800:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a10::,2800:a10:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a20::,2800:a20:ffff:ffff:ffff:ffff:ffff:ffff,CW -2800:a30::,2800:a30:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a40::,2800:a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a50::,2800:a50:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a60::,2800:a60:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:a70::,2800:a70:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:a80::,2800:a80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a90::,2800:a90:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:aa0::,2800:aa0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:ab0::,2800:ab0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:ac0::,2800:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:ad0::,2800:ad0:ffff:ffff:ffff:ffff:ffff:ffff,AW -2800:ae0::,2800:ae0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:af0::,2800:af0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:b00::,2800:b00:ffff:ffff:ffff:ffff:ffff:ffff,BQ -2800:b10::,2800:b10:ffff:ffff:ffff:ffff:ffff:ffff,HN -2800:b20::,2800:b23:ffff:ffff:ffff:ffff:ffff:ffff,SV -2800:b30::,2800:b31:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:b40::,2800:b40:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:b60::,2800:b60:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:b70::,2800:b70:ffff:ffff:ffff:ffff:ffff:ffff,CO -2800:b80::,2800:b80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:b90::,2800:b90:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:ba0::,2800:ba0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:bb0::,2800:bbf:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:bc0::,2800:bc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2800:bd0::,2800:bd0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:be0::,2800:be0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2800:bf0::,2800:bf0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:c00::,2800:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:c10::,2800:c10:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:c20::,2800:c20:ffff:ffff:ffff:ffff:ffff:ffff,CR -2800:c30::,2800:c30:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:c40::,2800:c40:ffff:ffff:ffff:ffff:ffff:ffff,EC -2800:c50::,2800:c50:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:c70::,2800:c70:ffff:ffff:ffff:ffff:ffff:ffff,PY -2800:c80::,2800:c80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:c90::,2800:c90:ffff:ffff:ffff:ffff:ffff:ffff,DO -2800:ca0::,2800:ca0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:cb0::,2800:cb0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:cc0::,2800:cc0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2800:cd0::,2800:cd0:ffff:ffff:ffff:ffff:ffff:ffff,BO -2800:ce0::,2800:ce0:ffff:ffff:ffff:ffff:ffff:ffff,PA -2800:cf0::,2800:cf0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:d00::,2800:d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:d10::,2800:d10:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:d20::,2800:d20:ffff:ffff:ffff:ffff:ffff:ffff,DO -2800:e00::,2800:eff:ffff:ffff:ffff:ffff:ffff:ffff,TT -2800:1000::,2800:10ff:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:2000::,2800:2fff:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:a000::,2800:a000:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a008::,2800:a008:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a010::,2800:a010:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a018::,2800:a018:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a020::,2800:a020:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a028::,2800:a028:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a030::,2800:a030:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:a038::,2800:a038:ffff:ffff:ffff:ffff:ffff:ffff,VE -2800:b000::,2800:b000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2800:d300::,2800:d307:ffff:ffff:ffff:ffff:ffff:ffff,CR -2801::,2801::ffff:ffff:ffff:ffff:ffff,UY -2801:0:10::,2801::10:ffff:ffff:ffff:ffff:ffff,CL -2801:0:20::,2801::20:ffff:ffff:ffff:ffff:ffff,EC -2801:0:30::,2801::30:ffff:ffff:ffff:ffff:ffff,HN -2801:0:40::,2801::40:ffff:ffff:ffff:ffff:ffff,TT -2801:0:50::,2801::50:ffff:ffff:ffff:ffff:ffff,CL -2801:0:60::,2801::63:ffff:ffff:ffff:ffff:ffff,EC -2801:0:70::,2801::70:ffff:ffff:ffff:ffff:ffff,CO -2801:0:80::,2801::80:ffff:ffff:ffff:ffff:ffff,DO -2801:0:90::,2801::90:ffff:ffff:ffff:ffff:ffff,AR -2801:0:b0::,2801::b7:ffff:ffff:ffff:ffff:ffff,CL -2801:0:c0::,2801::df:ffff:ffff:ffff:ffff:ffff,CR -2801:0:100::,2801::100:ffff:ffff:ffff:ffff:ffff,CO -2801:0:110::,2801::110:ffff:ffff:ffff:ffff:ffff,GT -2801:0:120::,2801::120:ffff:ffff:ffff:ffff:ffff,CL -2801:0:130::,2801::130:ffff:ffff:ffff:ffff:ffff,PY -2801:0:140::,2801::141:ffff:ffff:ffff:ffff:ffff,AR -2801:0:150::,2801::150:ffff:ffff:ffff:ffff:ffff,CL -2801:0:160::,2801::160:ffff:ffff:ffff:ffff:ffff,AR -2801:0:170::,2801::170:ffff:ffff:ffff:ffff:ffff,BO -2801:0:180::,2801::180:ffff:ffff:ffff:ffff:ffff,CO -2801:0:190::,2801::190:ffff:ffff:ffff:ffff:ffff,AR -2801:0:1a0::,2801::1a0:ffff:ffff:ffff:ffff:ffff,HN -2801:0:1b0::,2801::1bf:ffff:ffff:ffff:ffff:ffff,AR -2801:0:1c0::,2801::1c7:ffff:ffff:ffff:ffff:ffff,CO -2801:0:1d0::,2801::1d7:ffff:ffff:ffff:ffff:ffff,AR -2801:0:1f0::,2801::1f0:ffff:ffff:ffff:ffff:ffff,PY -2801:0:200::,2801::200:ffff:ffff:ffff:ffff:ffff,VE -2801:0:210::,2801::210:ffff:ffff:ffff:ffff:ffff,CO -2801:0:220::,2801::22f:ffff:ffff:ffff:ffff:ffff,AR -2801:0:240::,2801::240:ffff:ffff:ffff:ffff:ffff,PA -2801:0:250::,2801::250:ffff:ffff:ffff:ffff:ffff,AR -2801:0:260::,2801::260:ffff:ffff:ffff:ffff:ffff,AR -2801:0:270::,2801::270:ffff:ffff:ffff:ffff:ffff,EC -2801:0:280::,2801::280:ffff:ffff:ffff:ffff:ffff,CO -2801:0:290::,2801::290:ffff:ffff:ffff:ffff:ffff,AR -2801:0:2a0::,2801::2a0:ffff:ffff:ffff:ffff:ffff,CR -2801:0:2b0::,2801::2b0:ffff:ffff:ffff:ffff:ffff,PA -2801:0:2c0::,2801::2c0:ffff:ffff:ffff:ffff:ffff,HN -2801:0:2d0::,2801::2d0:ffff:ffff:ffff:ffff:ffff,PA -2801:0:2e0::,2801::2e0:ffff:ffff:ffff:ffff:ffff,CO -2801:0:2f0::,2801::2f0:ffff:ffff:ffff:ffff:ffff,AR -2801:0:300::,2801::300:ffff:ffff:ffff:ffff:ffff,CO -2801:0:310::,2801::310:ffff:ffff:ffff:ffff:ffff,CW -2801:0:320::,2801::320:ffff:ffff:ffff:ffff:ffff,CO -2801:0:330::,2801::330:ffff:ffff:ffff:ffff:ffff,HT -2801:0:340::,2801::340:ffff:ffff:ffff:ffff:ffff,CO -2801:0:350::,2801::350:ffff:ffff:ffff:ffff:ffff,AR -2801:0:360::,2801::360:ffff:ffff:ffff:ffff:ffff,CO -2801:0:370::,2801::370:ffff:ffff:ffff:ffff:ffff,CO -2801:0:380::,2801::380:ffff:ffff:ffff:ffff:ffff,CL -2801:0:390::,2801::390:ffff:ffff:ffff:ffff:ffff,CO -2801:0:3b0::,2801::3b0:ffff:ffff:ffff:ffff:ffff,CO -2801:0:3c0::,2801::3c0:ffff:ffff:ffff:ffff:ffff,CO -2801:0:3e0::,2801::3e0:ffff:ffff:ffff:ffff:ffff,AR -2801:0:3f0::,2801::3f0:ffff:ffff:ffff:ffff:ffff,AR -2801:0:400::,2801::400:ffff:ffff:ffff:ffff:ffff,CL -2801:0:410::,2801::410:ffff:ffff:ffff:ffff:ffff,EC -2801:0:420::,2801::420:ffff:ffff:ffff:ffff:ffff,EC -2801:0:440::,2801::440:ffff:ffff:ffff:ffff:ffff,AR -2801:0:480::,2801::480:ffff:ffff:ffff:ffff:ffff,CO -2801:0:490::,2801::490:ffff:ffff:ffff:ffff:ffff,PA -2801:0:4a0::,2801::4a0:ffff:ffff:ffff:ffff:ffff,CR -2801:0:4c0::,2801::4c0:ffff:ffff:ffff:ffff:ffff,CO -2801:0:4d0::,2801::4d0:ffff:ffff:ffff:ffff:ffff,EC -2801:0:4e0::,2801::4e0:ffff:ffff:ffff:ffff:ffff,CL -2801:0:2000::,2801::2fff:ffff:ffff:ffff:ffff:ffff,UY -2801:1::,2801:1:ffff:ffff:ffff:ffff:ffff:ffff,CR -2801:2::,2801:2:ffff:ffff:ffff:ffff:ffff:ffff,CL -2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR -2801:10:1000::,2801:10:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:3000::,2801:10:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:5000::,2801:10:5000:ffff:ffff:ffff:ffff:ffff,BO -2801:10:6000::,2801:10:6000:ffff:ffff:ffff:ffff:ffff,HN -2801:10:8000::,2801:10:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:9000::,2801:10:9000:ffff:ffff:ffff:ffff:ffff,PY -2801:10:a000::,2801:10:a000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:b000::,2801:10:b000:ffff:ffff:ffff:ffff:ffff,SV -2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO -2801:10:d000::,2801:10:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:10:e000::,2801:10:e000:ffff:ffff:ffff:ffff:ffff,AR -2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR -2801:11:1000::,2801:11:1000:ffff:ffff:ffff:ffff:ffff,PY -2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:11:3000::,2801:11:3000:ffff:ffff:ffff:ffff:ffff,CR -2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO -2801:11:5000::,2801:11:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:11:6000::,2801:11:6000:ffff:ffff:ffff:ffff:ffff,AR -2801:11:8000::,2801:11:8000:ffff:ffff:ffff:ffff:ffff,CO -2801:11:9000::,2801:11:9000:ffff:ffff:ffff:ffff:ffff,CO -2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE -2801:11:b000::,2801:11:b000:ffff:ffff:ffff:ffff:ffff,AR -2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:11:d000::,2801:11:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:11:e000::,2801:11:e000:ffff:ffff:ffff:ffff:ffff,CO -2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY -2801:12:1000::,2801:12:1000:ffff:ffff:ffff:ffff:ffff,BO -2801:12:2000::,2801:12:2000:ffff:ffff:ffff:ffff:ffff,HN -2801:12:3000::,2801:12:3000:ffff:ffff:ffff:ffff:ffff,CL -2801:12:4000::,2801:12:4000:ffff:ffff:ffff:ffff:ffff,CO -2801:12:5000::,2801:12:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:6000::,2801:12:6000:ffff:ffff:ffff:ffff:ffff,SV -2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:9000::,2801:12:9000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:b000::,2801:12:b000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:d000::,2801:12:d000:ffff:ffff:ffff:ffff:ffff,BO -2801:12:e000::,2801:12:e000:ffff:ffff:ffff:ffff:ffff,PA -2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE -2801:13:1000::,2801:13:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:13:2000::,2801:13:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:13:3000::,2801:13:3000:ffff:ffff:ffff:ffff:ffff,BO -2801:13:4000::,2801:13:4000:ffff:ffff:ffff:ffff:ffff,CL -2801:13:5000::,2801:13:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:13:6000::,2801:13:6000:ffff:ffff:ffff:ffff:ffff,GT -2801:13:8000::,2801:13:8000:ffff:ffff:ffff:ffff:ffff,SV -2801:13:9000::,2801:13:9000:ffff:ffff:ffff:ffff:ffff,AR -2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO -2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT -2801:13:d000::,2801:13:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:13:e000::,2801:13:e000:ffff:ffff:ffff:ffff:ffff,CO -2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO -2801:14:1000::,2801:14:1000:ffff:ffff:ffff:ffff:ffff,CL -2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:14:3000::,2801:14:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:14:5000::,2801:14:5000:ffff:ffff:ffff:ffff:ffff,NI -2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO -2801:14:8000::,2801:14:8000:ffff:ffff:ffff:ffff:ffff,CO -2801:14:9000::,2801:14:9000:ffff:ffff:ffff:ffff:ffff,CL -2801:14:a000::,2801:14:a001:ffff:ffff:ffff:ffff:ffff,UY -2801:14:b000::,2801:14:b000:ffff:ffff:ffff:ffff:ffff,AR -2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO -2801:14:d000::,2801:14:d00f:ffff:ffff:ffff:ffff:ffff,PA -2801:14:e000::,2801:14:e000:ffff:ffff:ffff:ffff:ffff,PY -2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC -2801:15:1000::,2801:15:1000:ffff:ffff:ffff:ffff:ffff,SV -2801:15:2000::,2801:15:2000:ffff:ffff:ffff:ffff:ffff,CR -2801:15:3000::,2801:15:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO -2801:15:5000::,2801:15:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:15:6000::,2801:15:6000:ffff:ffff:ffff:ffff:ffff,SV -2801:15:8000::,2801:15:8000:ffff:ffff:ffff:ffff:ffff,CR -2801:15:9000::,2801:15:9000:ffff:ffff:ffff:ffff:ffff,AR -2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO -2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT -2801:15:d000::,2801:15:d000:ffff:ffff:ffff:ffff:ffff,CL -2801:15:e000::,2801:15:e000:ffff:ffff:ffff:ffff:ffff,DO -2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW -2801:16:e0::,2801:16:e0:ffff:ffff:ffff:ffff:ffff,GY -2801:16:1000::,2801:16:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN -2801:16:3000::,2801:16:3000:ffff:ffff:ffff:ffff:ffff,PA -2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR -2801:16:5000::,2801:16:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:16:6000::,2801:16:6000:ffff:ffff:ffff:ffff:ffff,AR -2801:16:8000::,2801:16:8000:ffff:ffff:ffff:ffff:ffff,CO -2801:16:9000::,2801:16:9000:ffff:ffff:ffff:ffff:ffff,BO -2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR -2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:16:d000::,2801:16:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL -2801:17:1000::,2801:17:1000:ffff:ffff:ffff:ffff:ffff,HN -2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY -2801:17:3000::,2801:17:3000:ffff:ffff:ffff:ffff:ffff,CL -2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO -2801:17:5000::,2801:17:5000:ffff:ffff:ffff:ffff:ffff,HT -2801:17:6000::,2801:17:6000:ffff:ffff:ffff:ffff:ffff,AR -2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR -2801:17:9000::,2801:17:9000:ffff:ffff:ffff:ffff:ffff,PA -2801:17:a000::,2801:17:a000:ffff:ffff:ffff:ffff:ffff,HT -2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA -2801:17:d000::,2801:17:d000:ffff:ffff:ffff:ffff:ffff,CO -2801:17:e000::,2801:17:e000:ffff:ffff:ffff:ffff:ffff,AR -2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR -2801:18:1000::,2801:18:1000:ffff:ffff:ffff:ffff:ffff,PA -2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO -2801:18:3000::,2801:18:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:18:5000::,2801:18:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:18:6000::,2801:18:6000:ffff:ffff:ffff:ffff:ffff,AR -2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:18:9000::,2801:18:900f:ffff:ffff:ffff:ffff:ffff,CO -2801:18:a000::,2801:18:a000:ffff:ffff:ffff:ffff:ffff,BO -2801:18:b000::,2801:18:b000:ffff:ffff:ffff:ffff:ffff,HN -2801:18:c000::,2801:18:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:18:d000::,2801:18:d000:ffff:ffff:ffff:ffff:ffff,BO -2801:18:e000::,2801:18:e000:ffff:ffff:ffff:ffff:ffff,DO -2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR -2801:19:1000::,2801:19:1000:ffff:ffff:ffff:ffff:ffff,PA -2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL -2801:19:3000::,2801:19:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY -2801:19:5000::,2801:19:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:19:6000::,2801:19:6000:ffff:ffff:ffff:ffff:ffff,CW -2801:19:8000::,2801:19:8000:ffff:ffff:ffff:ffff:ffff,EC -2801:19:9000::,2801:19:9000:ffff:ffff:ffff:ffff:ffff,AR -2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO -2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:19:d000::,2801:19:d000:ffff:ffff:ffff:ffff:ffff,BO -2801:19:e000::,2801:19:e000:ffff:ffff:ffff:ffff:ffff,CO -2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO -2801:1a:1000::,2801:1a:1000:ffff:ffff:ffff:ffff:ffff,CL -2801:1a:3000::,2801:1a:3000:ffff:ffff:ffff:ffff:ffff,EC -2801:1a:5000::,2801:1a:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL -2801:1a:9000::,2801:1a:9000:ffff:ffff:ffff:ffff:ffff,DO -2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR -2801:1a:b000::,2801:1a:b000:ffff:ffff:ffff:ffff:ffff,CO -2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO -2801:1a:d000::,2801:1a:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:1a:e000::,2801:1a:e000:ffff:ffff:ffff:ffff:ffff,DO -2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR -2801:1b:1000::,2801:1b:1000:ffff:ffff:ffff:ffff:ffff,CL -2801:1b:2000::,2801:1b:2000:ffff:ffff:ffff:ffff:ffff,UY -2801:1b:3000::,2801:1b:3000:ffff:ffff:ffff:ffff:ffff,PE -2801:1b:4000::,2801:1b:4000:ffff:ffff:ffff:ffff:ffff,CL -2801:1b:5000::,2801:1b:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:1b:6000::,2801:1b:6000:ffff:ffff:ffff:ffff:ffff,CL -2801:1b:8000::,2801:1b:8000:ffff:ffff:ffff:ffff:ffff,CL -2801:1b:9000::,2801:1b:9000:ffff:ffff:ffff:ffff:ffff,CL -2801:1b:a000::,2801:1b:a000:ffff:ffff:ffff:ffff:ffff,AR -2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA -2801:1b:d000::,2801:1b:d000:ffff:ffff:ffff:ffff:ffff,CO -2801:1b:e000::,2801:1b:e000:ffff:ffff:ffff:ffff:ffff,NI -2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY -2801:1c:1000::,2801:1c:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE -2801:1c:3000::,2801:1c:3000:ffff:ffff:ffff:ffff:ffff,SV -2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO -2801:1c:5000::,2801:1c:5000:ffff:ffff:ffff:ffff:ffff,CL -2801:1c:6000::,2801:1c:6000:ffff:ffff:ffff:ffff:ffff,PA -2801:1c:8000::,2801:1c:8000:ffff:ffff:ffff:ffff:ffff,EC -2801:1c:a000::,2801:1c:a000:ffff:ffff:ffff:ffff:ffff,CO -2801:1c:b000::,2801:1c:b000:ffff:ffff:ffff:ffff:ffff,AR -2801:1c:c000::,2801:1c:c000:ffff:ffff:ffff:ffff:ffff,HN -2801:1c:d000::,2801:1c:d000:ffff:ffff:ffff:ffff:ffff,AR -2801:1c:e000::,2801:1c:e000:ffff:ffff:ffff:ffff:ffff,CO -2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY -2801:1d:1000::,2801:1d:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:1d:2000::,2801:1d:2000:ffff:ffff:ffff:ffff:ffff,GT -2801:1d:3000::,2801:1d:3000:ffff:ffff:ffff:ffff:ffff,AR -2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT -2801:1d:5000::,2801:1d:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:1d:6000::,2801:1d:6000:ffff:ffff:ffff:ffff:ffff,NI -2801:1d:8000::,2801:1d:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:1d:9000::,2801:1d:9000:ffff:ffff:ffff:ffff:ffff,CO -2801:1d:a000::,2801:1d:a00f:ffff:ffff:ffff:ffff:ffff,CR -2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR -2801:1d:d000::,2801:1d:d000:ffff:ffff:ffff:ffff:ffff,BO -2801:1d:e000::,2801:1d:e000:ffff:ffff:ffff:ffff:ffff,CO -2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC -2801:1e:1000::,2801:1e:1000:ffff:ffff:ffff:ffff:ffff,AR -2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:1e:3000::,2801:1e:3000:ffff:ffff:ffff:ffff:ffff,CO -2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR -2801:1e:5000::,2801:1e:5000:ffff:ffff:ffff:ffff:ffff,EC -2801:1e:6000::,2801:1e:6000:ffff:ffff:ffff:ffff:ffff,CO -2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR -2801:1e:9000::,2801:1e:9000:ffff:ffff:ffff:ffff:ffff,SV -2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR -2801:1e:b000::,2801:1e:b000:ffff:ffff:ffff:ffff:ffff,AR -2801:1e:d000::,2801:1e:d000:ffff:ffff:ffff:ffff:ffff,CO -2801:1e:e000::,2801:1e:e000:ffff:ffff:ffff:ffff:ffff,SV -2801:1f::,2801:1f::ffff:ffff:ffff:ffff:ffff,AR -2801:1f:1000::,2801:1f:1000:ffff:ffff:ffff:ffff:ffff,HN -2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR -2801:1f:3000::,2801:1f:3000:ffff:ffff:ffff:ffff:ffff,AR -2801:1f:5000::,2801:1f:5000:ffff:ffff:ffff:ffff:ffff,CO -2801:1f:6000::,2801:1f:6000:ffff:ffff:ffff:ffff:ffff,AR -2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:1f:9000::,2801:1f:9000:ffff:ffff:ffff:ffff:ffff,AR -2801:1f:a000::,2801:1f:a000:ffff:ffff:ffff:ffff:ffff,CL -2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR -2801:1f:d000::,2801:1f:d000:ffff:ffff:ffff:ffff:ffff,CO -2801:1f:e000::,2801:1f:e000:ffff:ffff:ffff:ffff:ffff,AR -2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR -2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:30::,2801:80:30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:50::,2801:80:50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:60::,2801:80:60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:70::,2801:80:70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:80::,2801:80:80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:90::,2801:80:90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a0::,2801:80:a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b0::,2801:80:b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c0::,2801:80:c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d0::,2801:80:d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e0::,2801:80:e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f0::,2801:80:f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:100::,2801:80:100:ffff:ffff:ffff:ffff:ffff,BR -2801:80:110::,2801:80:110:ffff:ffff:ffff:ffff:ffff,BR -2801:80:120::,2801:80:120:ffff:ffff:ffff:ffff:ffff,BR -2801:80:130::,2801:80:130:ffff:ffff:ffff:ffff:ffff,BR -2801:80:140::,2801:80:140:ffff:ffff:ffff:ffff:ffff,BR -2801:80:150::,2801:80:150:ffff:ffff:ffff:ffff:ffff,BR -2801:80:160::,2801:80:160:ffff:ffff:ffff:ffff:ffff,BR -2801:80:170::,2801:80:170:ffff:ffff:ffff:ffff:ffff,BR -2801:80:180::,2801:80:180:ffff:ffff:ffff:ffff:ffff,BR -2801:80:190::,2801:80:190:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a0::,2801:80:1a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b0::,2801:80:1b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c0::,2801:80:1c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d0::,2801:80:1d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1e0::,2801:80:1e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1f0::,2801:80:1f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:200::,2801:80:200:ffff:ffff:ffff:ffff:ffff,BR -2801:80:210::,2801:80:210:ffff:ffff:ffff:ffff:ffff,BR -2801:80:220::,2801:80:220:ffff:ffff:ffff:ffff:ffff,BR -2801:80:230::,2801:80:230:ffff:ffff:ffff:ffff:ffff,BR -2801:80:240::,2801:80:240:ffff:ffff:ffff:ffff:ffff,BR -2801:80:250::,2801:80:250:ffff:ffff:ffff:ffff:ffff,BR -2801:80:260::,2801:80:260:ffff:ffff:ffff:ffff:ffff,BR -2801:80:270::,2801:80:270:ffff:ffff:ffff:ffff:ffff,BR -2801:80:280::,2801:80:280:ffff:ffff:ffff:ffff:ffff,BR -2801:80:290::,2801:80:290:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2a0::,2801:80:2a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2b0::,2801:80:2b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2c0::,2801:80:2c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2d0::,2801:80:2d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2e0::,2801:80:2e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2f0::,2801:80:2f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:300::,2801:80:300:ffff:ffff:ffff:ffff:ffff,BR -2801:80:320::,2801:80:320:ffff:ffff:ffff:ffff:ffff,BR -2801:80:330::,2801:80:330:ffff:ffff:ffff:ffff:ffff,BR -2801:80:340::,2801:80:340:ffff:ffff:ffff:ffff:ffff,BR -2801:80:350::,2801:80:350:ffff:ffff:ffff:ffff:ffff,BR -2801:80:360::,2801:80:360:ffff:ffff:ffff:ffff:ffff,BR -2801:80:370::,2801:80:370:ffff:ffff:ffff:ffff:ffff,BR -2801:80:380::,2801:80:380:ffff:ffff:ffff:ffff:ffff,BR -2801:80:390::,2801:80:390:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3a0::,2801:80:3a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3b0::,2801:80:3b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3c0::,2801:80:3c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3d0::,2801:80:3d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3e0::,2801:80:3e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:3f0::,2801:80:3f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:400::,2801:80:400:ffff:ffff:ffff:ffff:ffff,BR -2801:80:410::,2801:80:410:ffff:ffff:ffff:ffff:ffff,BR -2801:80:420::,2801:80:420:ffff:ffff:ffff:ffff:ffff,BR -2801:80:430::,2801:80:430:ffff:ffff:ffff:ffff:ffff,BR -2801:80:440::,2801:80:440:ffff:ffff:ffff:ffff:ffff,BR -2801:80:450::,2801:80:450:ffff:ffff:ffff:ffff:ffff,BR -2801:80:460::,2801:80:460:ffff:ffff:ffff:ffff:ffff,BR -2801:80:470::,2801:80:470:ffff:ffff:ffff:ffff:ffff,BR -2801:80:480::,2801:80:480:ffff:ffff:ffff:ffff:ffff,BR -2801:80:490::,2801:80:490:ffff:ffff:ffff:ffff:ffff,BR -2801:80:4b0::,2801:80:4b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:4c0::,2801:80:4c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:4d0::,2801:80:4d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:4e0::,2801:80:4e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:4f0::,2801:80:4f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:500::,2801:80:500:ffff:ffff:ffff:ffff:ffff,BR -2801:80:510::,2801:80:510:ffff:ffff:ffff:ffff:ffff,BR -2801:80:520::,2801:80:520:ffff:ffff:ffff:ffff:ffff,BR -2801:80:530::,2801:80:530:ffff:ffff:ffff:ffff:ffff,BR -2801:80:540::,2801:80:540:ffff:ffff:ffff:ffff:ffff,BR -2801:80:550::,2801:80:550:ffff:ffff:ffff:ffff:ffff,BR -2801:80:560::,2801:80:560:ffff:ffff:ffff:ffff:ffff,BR -2801:80:570::,2801:80:570:ffff:ffff:ffff:ffff:ffff,BR -2801:80:580::,2801:80:581:ffff:ffff:ffff:ffff:ffff,BR -2801:80:590::,2801:80:590:ffff:ffff:ffff:ffff:ffff,BR -2801:80:5b0::,2801:80:5b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:5c0::,2801:80:5c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:5d0::,2801:80:5d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:5e0::,2801:80:5e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:5f0::,2801:80:5f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:600::,2801:80:600:ffff:ffff:ffff:ffff:ffff,BR -2801:80:610::,2801:80:610:ffff:ffff:ffff:ffff:ffff,BR -2801:80:620::,2801:80:620:ffff:ffff:ffff:ffff:ffff,BR -2801:80:630::,2801:80:630:ffff:ffff:ffff:ffff:ffff,BR -2801:80:640::,2801:80:640:ffff:ffff:ffff:ffff:ffff,BR -2801:80:650::,2801:80:651:ffff:ffff:ffff:ffff:ffff,BR -2801:80:660::,2801:80:660:ffff:ffff:ffff:ffff:ffff,BR -2801:80:670::,2801:80:670:ffff:ffff:ffff:ffff:ffff,BR -2801:80:680::,2801:80:680:ffff:ffff:ffff:ffff:ffff,BR -2801:80:690::,2801:80:690:ffff:ffff:ffff:ffff:ffff,BR -2801:80:6b0::,2801:80:6b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:6c0::,2801:80:6c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:6d0::,2801:80:6d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:6e0::,2801:80:6ef:ffff:ffff:ffff:ffff:ffff,BR -2801:80:710::,2801:80:710:ffff:ffff:ffff:ffff:ffff,BR -2801:80:720::,2801:80:720:ffff:ffff:ffff:ffff:ffff,BR -2801:80:730::,2801:80:730:ffff:ffff:ffff:ffff:ffff,BR -2801:80:740::,2801:80:740:ffff:ffff:ffff:ffff:ffff,BR -2801:80:750::,2801:80:750:ffff:ffff:ffff:ffff:ffff,BR -2801:80:760::,2801:80:760:ffff:ffff:ffff:ffff:ffff,BR -2801:80:770::,2801:80:770:ffff:ffff:ffff:ffff:ffff,BR -2801:80:780::,2801:80:780:ffff:ffff:ffff:ffff:ffff,BR -2801:80:790::,2801:80:790:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7a0::,2801:80:7a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7b0::,2801:80:7b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7c0::,2801:80:7c3:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7d0::,2801:80:7d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7e0::,2801:80:7e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:7f0::,2801:80:7f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:800::,2801:80:800:ffff:ffff:ffff:ffff:ffff,BR -2801:80:810::,2801:80:810:ffff:ffff:ffff:ffff:ffff,BR -2801:80:820::,2801:80:820:ffff:ffff:ffff:ffff:ffff,BR -2801:80:830::,2801:80:830:ffff:ffff:ffff:ffff:ffff,BR -2801:80:840::,2801:80:840:ffff:ffff:ffff:ffff:ffff,BR -2801:80:850::,2801:80:850:ffff:ffff:ffff:ffff:ffff,BR -2801:80:860::,2801:80:860:ffff:ffff:ffff:ffff:ffff,BR -2801:80:870::,2801:80:870:ffff:ffff:ffff:ffff:ffff,BR -2801:80:880::,2801:80:880:ffff:ffff:ffff:ffff:ffff,BR -2801:80:890::,2801:80:890:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8a0::,2801:80:8a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8b0::,2801:80:8b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8c0::,2801:80:8c1:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8d0::,2801:80:8d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8e0::,2801:80:8e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:8f0::,2801:80:8f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:900::,2801:80:900:ffff:ffff:ffff:ffff:ffff,BR -2801:80:910::,2801:80:910:ffff:ffff:ffff:ffff:ffff,BR -2801:80:920::,2801:80:920:ffff:ffff:ffff:ffff:ffff,BR -2801:80:930::,2801:80:930:ffff:ffff:ffff:ffff:ffff,BR -2801:80:940::,2801:80:940:ffff:ffff:ffff:ffff:ffff,BR -2801:80:950::,2801:80:950:ffff:ffff:ffff:ffff:ffff,BR -2801:80:960::,2801:80:960:ffff:ffff:ffff:ffff:ffff,BR -2801:80:970::,2801:80:970:ffff:ffff:ffff:ffff:ffff,BR -2801:80:980::,2801:80:980:ffff:ffff:ffff:ffff:ffff,BR -2801:80:990::,2801:80:990:ffff:ffff:ffff:ffff:ffff,BR -2801:80:9a0::,2801:80:9a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:9b0::,2801:80:9b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:9c0::,2801:80:9c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:9e0::,2801:80:9e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:9f0::,2801:80:9f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a00::,2801:80:a00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a10::,2801:80:a10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a20::,2801:80:a20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a30::,2801:80:a30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a40::,2801:80:a40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a50::,2801:80:a50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a60::,2801:80:a61:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a70::,2801:80:a70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:a80::,2801:80:a8f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:aa0::,2801:80:aa0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ab0::,2801:80:ab0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ac0::,2801:80:ac0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ad0::,2801:80:ad0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ae0::,2801:80:ae0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:af0::,2801:80:af0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b00::,2801:80:b00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b10::,2801:80:b10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b20::,2801:80:b20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b30::,2801:80:b30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b50::,2801:80:b50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b60::,2801:80:b60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b70::,2801:80:b70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b80::,2801:80:b80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b90::,2801:80:b90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ba0::,2801:80:baf:ffff:ffff:ffff:ffff:ffff,BR -2801:80:bc0::,2801:80:bcf:ffff:ffff:ffff:ffff:ffff,BR -2801:80:be0::,2801:80:be0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:bf0::,2801:80:bf0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c00::,2801:80:c00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c10::,2801:80:c10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c20::,2801:80:c20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c30::,2801:80:c30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c40::,2801:80:c40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c50::,2801:80:c50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c60::,2801:80:c60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c70::,2801:80:c70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:c90::,2801:80:c90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ca0::,2801:80:ca0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:cb0::,2801:80:cb0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:cc0::,2801:80:cc0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:cd0::,2801:80:cd0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ce0::,2801:80:ce0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d00::,2801:80:d00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d10::,2801:80:d10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d20::,2801:80:d2f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d40::,2801:80:d40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d50::,2801:80:d50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d60::,2801:80:d6f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d80::,2801:80:d80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:d90::,2801:80:d90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:da0::,2801:80:daf:ffff:ffff:ffff:ffff:ffff,BR -2801:80:dc0::,2801:80:dcf:ffff:ffff:ffff:ffff:ffff,BR -2801:80:de0::,2801:80:de0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:df0::,2801:80:df0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e00::,2801:80:e00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e10::,2801:80:e10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e20::,2801:80:e20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e30::,2801:80:e30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e40::,2801:80:e40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e50::,2801:80:e50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e60::,2801:80:e60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e70::,2801:80:e70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e80::,2801:80:e80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:e90::,2801:80:e90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ea0::,2801:80:ea0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:eb0::,2801:80:eb0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ec0::,2801:80:ec0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ed0::,2801:80:ed0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ef0::,2801:80:ef0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f00::,2801:80:f00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f10::,2801:80:f10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f20::,2801:80:f20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f30::,2801:80:f30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f40::,2801:80:f4f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f70::,2801:80:f70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:f80::,2801:80:f8f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:fa0::,2801:80:faf:ffff:ffff:ffff:ffff:ffff,BR -2801:80:fc0::,2801:80:fc0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:fd0::,2801:80:fd0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:fe0::,2801:80:fe0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:ff0::,2801:80:ff0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1000::,2801:80:10ff:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1200::,2801:80:1200:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1210::,2801:80:1210:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1220::,2801:80:1220:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1230::,2801:80:1230:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1240::,2801:80:1240:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1250::,2801:80:1250:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1260::,2801:80:126f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1280::,2801:80:1280:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1290::,2801:80:1290:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12a0::,2801:80:12a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12b0::,2801:80:12b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12c0::,2801:80:12c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12d0::,2801:80:12d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12e0::,2801:80:12e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:12f0::,2801:80:12f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1300::,2801:80:1300:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1310::,2801:80:1310:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1320::,2801:80:1320:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1330::,2801:80:1330:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1340::,2801:80:1340:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1350::,2801:80:1350:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1360::,2801:80:1360:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1370::,2801:80:1370:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1380::,2801:80:1380:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1390::,2801:80:1390:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13a0::,2801:80:13a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13b0::,2801:80:13b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13c0::,2801:80:13c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13d0::,2801:80:13d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13e0::,2801:80:13e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:13f0::,2801:80:13f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1400::,2801:80:14ff:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1600::,2801:80:1600:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1610::,2801:80:1610:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1620::,2801:80:162f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1640::,2801:80:1640:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1650::,2801:80:1650:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1660::,2801:80:1660:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1670::,2801:80:1670:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1680::,2801:80:1680:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1690::,2801:80:1690:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16a0::,2801:80:16a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16b0::,2801:80:16b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16c0::,2801:80:16c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16d0::,2801:80:16d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16e0::,2801:80:16e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:16f0::,2801:80:16f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1700::,2801:80:17ff:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1900::,2801:80:1900:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1910::,2801:80:1910:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1920::,2801:80:1920:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1930::,2801:80:1930:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1940::,2801:80:1941:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1950::,2801:80:1950:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1960::,2801:80:1960:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1970::,2801:80:1970:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1980::,2801:80:1981:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1990::,2801:80:1990:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19a0::,2801:80:19a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19b0::,2801:80:19b0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19c0::,2801:80:19c0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19d0::,2801:80:19d0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19e0::,2801:80:19e0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:19f0::,2801:80:19f0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a00::,2801:80:1a00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a10::,2801:80:1a10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a20::,2801:80:1a20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a30::,2801:80:1a30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a40::,2801:80:1a40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a50::,2801:80:1a50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a60::,2801:80:1a60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a70::,2801:80:1a70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a80::,2801:80:1a80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1a90::,2801:80:1a90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1aa0::,2801:80:1aa0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ab0::,2801:80:1ab0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ac0::,2801:80:1ac0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ad0::,2801:80:1ad1:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ae0::,2801:80:1ae0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1af0::,2801:80:1af0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b00::,2801:80:1b00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b10::,2801:80:1b10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b20::,2801:80:1b20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b30::,2801:80:1b30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b40::,2801:80:1b40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b50::,2801:80:1b50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b60::,2801:80:1b60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b70::,2801:80:1b70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b80::,2801:80:1b80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1b90::,2801:80:1b90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ba0::,2801:80:1ba0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1bb0::,2801:80:1bb0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1bc0::,2801:80:1bc0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1bd0::,2801:80:1bd0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1be0::,2801:80:1be0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1bf0::,2801:80:1bf0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c00::,2801:80:1c00:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c10::,2801:80:1c10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c20::,2801:80:1c20:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c30::,2801:80:1c30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c40::,2801:80:1c4f:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c60::,2801:80:1c60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c70::,2801:80:1c70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c80::,2801:80:1c80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1c90::,2801:80:1c90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ca0::,2801:80:1ca0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1cb0::,2801:80:1cb0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1cc0::,2801:80:1cc0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1cd0::,2801:80:1cd0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1ce0::,2801:80:1cef:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d00::,2801:80:1d01:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d10::,2801:80:1d10:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d20::,2801:80:1d21:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d30::,2801:80:1d30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d40::,2801:80:1d40:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d50::,2801:80:1d50:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d60::,2801:80:1d60:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d70::,2801:80:1d70:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d80::,2801:80:1d80:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1d90::,2801:80:1d90:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1da0::,2801:80:1da0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1db0::,2801:80:1db3:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1dc0::,2801:80:1dc0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1dd0::,2801:80:1dd3:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1de0::,2801:80:1de0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1df0::,2801:80:1df0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:1e00::,2801:80:1eff:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2000::,2801:80:20ff:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2200::,2801:80:2200:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2210::,2801:80:2210:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2220::,2801:80:2220:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2230::,2801:80:2230:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2240::,2801:80:2240:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2250::,2801:80:2251:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2260::,2801:80:2260:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2270::,2801:80:2270:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2280::,2801:80:2281:ffff:ffff:ffff:ffff:ffff,BR -2801:80:2290::,2801:80:2290:ffff:ffff:ffff:ffff:ffff,BR -2801:80:22a0::,2801:80:22a0:ffff:ffff:ffff:ffff:ffff,BR -2801:80:22b0::,2801:80:22b0:ffff:ffff:ffff:ffff:ffff,BR -2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:88::,2801:88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:8a::,2801:8a:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:8c::,2801:8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:8e::,2801:8e:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:90::,2801:90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:92::,2801:92:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:94::,2801:94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:96::,2801:96:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:98::,2801:98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:9a::,2801:9a:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:9c::,2801:9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:9e::,2801:9e:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:a0::,2801:a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:a2::,2801:a2:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:a4::,2801:a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:a6::,2801:a6:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:a8::,2801:a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:aa::,2801:aa:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:ac::,2801:ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:ae::,2801:ae:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:b0::,2801:b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:b2::,2801:b2:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:b4::,2801:b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:b6::,2801:b6:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:b8::,2801:b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:ba::,2801:ba:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:bc::,2801:bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:be::,2801:be:ffff:ffff:ffff:ffff:ffff:ffff,BR -2801:c0::,2801:c0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2801:c4::,2801:c4::ffff:ffff:ffff:ffff:ffff,MX -2801:c4:10::,2801:c4:10:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:12::,2801:c4:15:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:17::,2801:c4:17:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:20::,2801:c4:20:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:30::,2801:c4:30:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:50::,2801:c4:50:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:60::,2801:c4:60:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:80::,2801:c4:80:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:90::,2801:c4:90:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:a0::,2801:c4:a0:ffff:ffff:ffff:ffff:ffff,MX -2801:c4:b0::,2801:c4:b4:ffff:ffff:ffff:ffff:ffff,MX -2801:c5::,2801:c5:ffff:ffff:ffff:ffff:ffff:ffff,MX -2801:d0::,2801:d0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2801:f0::,2801:f0::ffff:ffff:ffff:ffff:ffff,MX -2801:f0:16::,2801:f0:16:ffff:ffff:ffff:ffff:ffff,MX -2801:f0:20::,2801:f0:20:ffff:ffff:ffff:ffff:ffff,MX -2801:f0:28::,2801:f0:28:ffff:ffff:ffff:ffff:ffff,MX -2801:100::,2801:100:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:104::,2801:104:ff:ffff:ffff:ffff:ffff:ffff,BO -2801:108::,2801:108:f:ffff:ffff:ffff:ffff:ffff,CO -2801:110::,2801:110:1fff:ffff:ffff:ffff:ffff:ffff,CO -2801:114::,2801:114:f:ffff:ffff:ffff:ffff:ffff,CO -2801:118::,2801:118:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:120::,2801:120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2801:124::,2801:124:f:ffff:ffff:ffff:ffff:ffff,CO -2801:128::,2801:128:fff:ffff:ffff:ffff:ffff:ffff,UY -2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO -2801:138::,2801:138:ff:ffff:ffff:ffff:ffff:ffff,PA -2801:140::,2801:140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2801:144::,2801:144:3f:ffff:ffff:ffff:ffff:ffff,CO -2801:148::,2801:148:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:150::,2801:150:ffff:ffff:ffff:ffff:ffff:ffff,PE -2801:158::,2801:158:fff:ffff:ffff:ffff:ffff:ffff,PA -2801:160::,2801:160:ff:ffff:ffff:ffff:ffff:ffff,CO -2801:164::,2801:164:ff:ffff:ffff:ffff:ffff:ffff,CO -2801:168::,2801:168:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:170::,2801:170:fff:ffff:ffff:ffff:ffff:ffff,CO -2801:178::,2801:178:1fff:ffff:ffff:ffff:ffff:ffff,CO -2801:180::,2801:180:f:ffff:ffff:ffff:ffff:ffff,PA -2801:184::,2801:184:f:ffff:ffff:ffff:ffff:ffff,DO -2801:188::,2801:188:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:190::,2801:190:fff:ffff:ffff:ffff:ffff:ffff,CO -2801:198::,2801:198:ffff:ffff:ffff:ffff:ffff:ffff,CL -2801:1a0::,2801:1a0:3f:ffff:ffff:ffff:ffff:ffff,CO -2801:1a4::,2801:1a4:f:ffff:ffff:ffff:ffff:ffff,AR -2801:1a8::,2801:1a8:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO -2801:1b8::,2801:1b8:f:ffff:ffff:ffff:ffff:ffff,UY -2801:1c0::,2801:1c0:1ff:ffff:ffff:ffff:ffff:ffff,AR -2801:1c4::,2801:1c4:f:ffff:ffff:ffff:ffff:ffff,CO -2801:1c8::,2801:1c8:fff:ffff:ffff:ffff:ffff:ffff,CO -2801:1d0::,2801:1d0:f:ffff:ffff:ffff:ffff:ffff,CO -2801:1d8::,2801:1d8:fff:ffff:ffff:ffff:ffff:ffff,CO -2801:1e0::,2801:1e0:7f:ffff:ffff:ffff:ffff:ffff,AR -2801:1e4::,2801:1e4:3f:ffff:ffff:ffff:ffff:ffff,CO -2801:1e8::,2801:1e8:ff:ffff:ffff:ffff:ffff:ffff,AR -2801:1f0::,2801:1f0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2801:1f8::,2801:1f8:f:ffff:ffff:ffff:ffff:ffff,CO -2802::,2802:2:9fff:ffff:ffff:ffff:ffff:ffff,CO -2802:2:a000::,2802:2:afff:ffff:ffff:ffff:ffff:ffff,BR -2802:2:b000::,2802:2:ffff:ffff:ffff:ffff:ffff:ffff,CO -2802:3::,2802:3:1fff:ffff:ffff:ffff:ffff:ffff,PA -2802:3:2000::,2802:3:3fff:ffff:ffff:ffff:ffff:ffff,PE -2802:3:4000::,2802:3:5fff:ffff:ffff:ffff:ffff:ffff,MX -2802:3:6000::,2802:3:7fff:ffff:ffff:ffff:ffff:ffff,EC -2802:3:8000::,2802:3:9fff:ffff:ffff:ffff:ffff:ffff,BR -2802:3:a000::,2802:3:ffff:ffff:ffff:ffff:ffff:ffff,CO -2802:8000::,2802:80ff:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803::,2803::ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:20::,2803:20:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:40::,2803:40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:80::,2803:80::ffff:ffff:ffff:ffff,BR -2803:80:0:1::,2803:80:fff:ffff:ffff:ffff:ffff:ffff,CL -2803:80:1000::,2803:80:1fff:ffff:ffff:ffff:ffff:ffff,BR -2803:80:2000::,2803:80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b4::,2803:b4:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:c0::,2803:c0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:120::,2803:120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:140::,2803:140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:180::,2803:180:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:1c0::,2803:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:220::,2803:220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2c0::,2803:2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:340::,2803:340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:380::,2803:380:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3c0::,2803:3c0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:400::,2803:400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:420::,2803:420:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:440::,2803:440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:480::,2803:480:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:4c0::,2803:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:540::,2803:540:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:580::,2803:580:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5c0::,2803:5c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:620::,2803:620:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:640::,2803:640:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6c0::,2803:6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:740::,2803:740:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:780::,2803:780:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:7c0::,2803:7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:820::,2803:820:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:840::,2803:840:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8c0::,2803:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:940::,2803:940:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:980::,2803:980:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:9c0::,2803:9c0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a20::,2803:a20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:a40::,2803:a40:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:ac0::,2803:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:b40::,2803:b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b80::,2803:b80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:bc0::,2803:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c20::,2803:c20:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:c40::,2803:c40:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:cc0::,2803:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d00::,2803:d00:ffff:ffff:ffff:ffff:ffff:ffff,GY -2803:d40::,2803:d40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:d80::,2803:d87:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:dc0::,2803:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e20::,2803:e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e40::,2803:e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e80::,2803:e80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:ec0::,2803:ec0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:f00::,2803:f00:48a:ffff:ffff:ffff:ffff:ffff,PE -2803:f00:48b::,2803:f00:48e:ffff:ffff:ffff:ffff:ffff,CO -2803:f00:48f::,2803:f00:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:f40::,2803:f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f80::,2803:f80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fc0::,2803:fc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:1000::,2803:1000:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:1020::,2803:1020:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:1040::,2803:1040:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:1080::,2803:1080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:10c0::,2803:10c0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:1120::,2803:1120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1140::,2803:1140:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:1180::,2803:1180:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:11c0::,2803:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:1220::,2803:1220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:12c0::,2803:12c0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:1340::,2803:1340:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:1380::,2803:1380:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:13c0::,2803:13c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1400::,2803:1400:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:1420::,2803:1420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1440::,2803:1440:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:14c0::,2803:14c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1500::,2803:1500:ffff:ffff:ffff:ffff:ffff:ffff,TT -2803:1540::,2803:1540:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:1580::,2803:1580:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:15c0::,2803:15c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ -2803:1620::,2803:1620:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:1640::,2803:1640:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF -2803:16c0::,2803:16c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1740::,2803:1740:ffff:ffff:ffff:ffff:ffff:ffff,GF -2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:17c0::,2803:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1820::,2803:1820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1940::,2803:1940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:19c0::,2803:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:1a20::,2803:1a20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1a40::,2803:1a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:1ac0::,2803:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1b40::,2803:1b40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:1b80::,2803:1b80:ffff:ffff:ffff:ffff:ffff:ffff,TT -2803:1bc0::,2803:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1c20::,2803:1c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:1c40::,2803:1c40:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1cc0::,2803:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1d00::,2803:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1d40::,2803:1d40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:1d80::,2803:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1dc0::,2803:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:1e20::,2803:1e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1e40::,2803:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1ec0::,2803:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1f40::,2803:1f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1f80::,2803:1f80:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:1fc0::,2803:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2000::,2803:2000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2020::,2803:2020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2040::,2803:2040:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:2080::,2803:2080:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2120::,2803:2120:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2140::,2803:2140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:21c0::,2803:21c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2220::,2803:2220:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:22c0::,2803:22c0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2340::,2803:2340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2380::,2803:2380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:23c0::,2803:23c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2400::,2803:2400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2420::,2803:2420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2440::,2803:2440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2480::,2803:2480:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:24c0::,2803:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:2500::,2803:2500:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:2540::,2803:2540:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2580::,2803:2580:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:25c0::,2803:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2620::,2803:2620:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:2640::,2803:2640:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:26c0::,2803:26c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2740::,2803:2740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:27c0::,2803:27c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2820::,2803:2820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2840::,2803:2840:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:28c0::,2803:28c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:2940::,2803:2940:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:2980::,2803:2980:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:29c0::,2803:29c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:2a20::,2803:2a20:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:2a40::,2803:2a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:2ac0::,2803:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:2b40::,2803:2b40:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:2b80::,2803:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:2bc0::,2803:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2c20::,2803:2c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:2cc0::,2803:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:2d00::,2803:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2d40::,2803:2d40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2d80::,2803:2d80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:2dc0::,2803:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:2e20::,2803:2e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2e40::,2803:2e40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2ec0::,2803:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:2f40::,2803:2f40:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:2f80::,2803:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:2fc0::,2803:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:3000::,2803:3000:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:3020::,2803:3020:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:3040::,2803:3040:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:30c0::,2803:30c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3100::,2803:3100:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:3140::,2803:3140:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:3180::,2803:3180:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:31c0::,2803:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:3220::,2803:3220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3240::,2803:3240:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:32c0::,2803:32c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:3340::,2803:3340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3380::,2803:3380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:33c0::,2803:33c0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:3420::,2803:3420:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:3440::,2803:3440:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:34c0::,2803:34c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3500::,2803:3500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3540::,2803:3540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3580::,2803:3580:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:35c0::,2803:35c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:3620::,2803:3620:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:3640::,2803:3640:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:3680::,2803:3680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:36c0::,2803:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3700::,2803:3700:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:3740::,2803:3740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3780::,2803:3780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:37c0::,2803:37c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3800::,2803:3800:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3820::,2803:3820:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:3840::,2803:3840:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3880::,2803:3880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:38c0::,2803:38c0:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:3900::,2803:3900:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:3940::,2803:3940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3980::,2803:3980:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:39c0::,2803:39c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:3a20::,2803:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3a40::,2803:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:3ac0::,2803:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3b40::,2803:3b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3b80::,2803:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3bc0::,2803:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:3c20::,2803:3c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:3c40::,2803:3c40:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3cc0::,2803:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:3d00::,2803:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:3d40::,2803:3d40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3d80::,2803:3d80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3dc0::,2803:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3e20::,2803:3e20:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:3e40::,2803:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:3ec0::,2803:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:3f40::,2803:3f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3f80::,2803:3f80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:3fc0::,2803:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4000::,2803:4000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4020::,2803:4020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4040::,2803:4040:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4080::,2803:4080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:40c0::,2803:40c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4120::,2803:4120:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4140::,2803:4140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4180::,2803:4180:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:41c0::,2803:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4220::,2803:4220:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:42c0::,2803:42c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:4340::,2803:4340:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:4380::,2803:4380:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:43c0::,2803:43c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4400::,2803:4400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4420::,2803:4420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4440::,2803:4440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4480::,2803:4480:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:44c0::,2803:44c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:4540::,2803:4540:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:4580::,2803:4580:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:45c0::,2803:45c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:4620::,2803:4620:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:4640::,2803:4640:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT -2803:46c0::,2803:46c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:4700::,2803:4701:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4740::,2803:4740:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:47c0::,2803:47c0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:4820::,2803:4820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4840::,2803:4840:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:48c0::,2803:48c0:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ -2803:4940::,2803:4940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4980::,2803:4980:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:49c0::,2803:49c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4a20::,2803:4a20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4a40::,2803:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4ac0::,2803:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4b40::,2803:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4b80::,2803:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4bc0::,2803:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:4c20::,2803:4c20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4c40::,2803:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4cc0::,2803:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4d00::,2803:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:4d40::,2803:4d40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4d80::,2803:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:4dc0::,2803:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:4e20::,2803:4e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4e40::,2803:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4e80::,2803:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:4ec0::,2803:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4f00::,2803:4f00:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:4f40::,2803:4f40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:4f80::,2803:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:4fc0::,2803:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5000::,2803:5000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5020::,2803:5020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5040::,2803:5040:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:5080::,2803:5080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:50c0::,2803:50c0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:5120::,2803:5120:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:5140::,2803:5140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5180::,2803:5180:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:51c0::,2803:51c0:ffff:ffff:ffff:ffff:ffff:ffff,SX -2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5220::,2803:5220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5240::,2803:5240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:52c0::,2803:52c0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:5340::,2803:5340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5380::,2803:5380:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:53c0::,2803:53c0:ffff:ffff:ffff:ffff:ffff:ffff,GF -2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5420::,2803:5420:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:5440::,2803:5440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:54c0::,2803:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:5500::,2803:5500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5540::,2803:5540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5580::,2803:5580:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:55c0::,2803:55c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:5620::,2803:5620:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5640::,2803:5640:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:56c0::,2803:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:5740::,2803:5740:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:57c0::,2803:57c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:5820::,2803:5820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5840::,2803:5840:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:58c0::,2803:58c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GF -2803:5940::,2803:5940:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:5980::,2803:5980:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:59c0::,2803:59c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5a20::,2803:5a20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5a40::,2803:5a40:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:5ac0::,2803:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:5b40::,2803:5b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5b80::,2803:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5bc0::,2803:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:5c20::,2803:5c20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5c40::,2803:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5cc0::,2803:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:5d00::,2803:5d00:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:5d40::,2803:5d40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:5d80::,2803:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:5dc0::,2803:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:5e20::,2803:5e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5e40::,2803:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5ec0::,2803:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:5f40::,2803:5f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5f80::,2803:5f80:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:5fc0::,2803:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:6020::,2803:6020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6040::,2803:6040:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6080::,2803:6087:ffff:ffff:ffff:ffff:ffff:ffff,US -2803:60c0::,2803:60c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6120::,2803:6120:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6140::,2803:6140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6180::,2803:6180:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:61c0::,2803:61c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6220::,2803:6220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:62c0::,2803:62c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:6340::,2803:6340:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:6380::,2803:6380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:63c0::,2803:63c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6400::,2803:6400:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:6420::,2803:6420:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6440::,2803:6440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6480::,2803:6480:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:64c0::,2803:64c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6500::,2803:6500:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:6540::,2803:6540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6580::,2803:6580:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:65c0::,2803:65c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6620::,2803:6620:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:66c0::,2803:66c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:6740::,2803:6740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:67c0::,2803:67c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6820::,2803:6820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6840::,2803:6840:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:68c0::,2803:68c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:6940::,2803:6940:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:6980::,2803:6980:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:69c0::,2803:69c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6a20::,2803:6a20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6a40::,2803:6a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:6ac0::,2803:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6b40::,2803:6b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6b80::,2803:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6bc0::,2803:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:6c20::,2803:6c20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6c40::,2803:6c40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6cc0::,2803:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:6d00::,2803:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6d40::,2803:6d40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6d80::,2803:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6dc0::,2803:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR -2803:6e20::,2803:6e20:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:6e40::,2803:6e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:6ec0::,2803:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:6f40::,2803:6f40:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:6f80::,2803:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:6fc0::,2803:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7000::,2803:7000:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:7020::,2803:7020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7040::,2803:7040:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7080::,2803:7080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:70c0::,2803:70c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7100::,2803:7100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7140::,2803:7140:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:7180::,2803:7180:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:71c0::,2803:71c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:7220::,2803:7220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7240::,2803:7240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:72c0::,2803:72c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7340::,2803:7340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7380::,2803:7380:ffff:ffff:ffff:ffff:ffff:ffff,SX -2803:73c0::,2803:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7420::,2803:7420:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:7440::,2803:7440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:74c0::,2803:74c0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:7500::,2803:7500:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7540::,2803:7540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7580::,2803:7580:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:75c0::,2803:75c0:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:7600::,2803:7600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7620::,2803:7620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7640::,2803:7640:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:7680::,2803:7680:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:76c0::,2803:76c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7700::,2803:7700:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7740::,2803:7740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7780::,2803:7780:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:77c0::,2803:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7800::,2803:7800:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:7820::,2803:7820:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:7840::,2803:7840:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7880::,2803:7880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:78c0::,2803:78c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7900::,2803:7900:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:7940::,2803:7940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7980::,2803:7980:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:79c0::,2803:79c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:7a20::,2803:7a20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7a40::,2803:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:7ac0::,2803:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7b40::,2803:7b40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7b80::,2803:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:7bc0::,2803:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:7c20::,2803:7c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:7c40::,2803:7c40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:7cc0::,2803:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:7d00::,2803:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7d40::,2803:7d40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7d80::,2803:7d80:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:7dc0::,2803:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7e20::,2803:7e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7e40::,2803:7e40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7ec0::,2803:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:7f40::,2803:7f40:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:7f80::,2803:7f80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:7fc0::,2803:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8000::,2803:8000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8020::,2803:8020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8040::,2803:8040:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:8080::,2803:8080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:80c0::,2803:80c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:8120::,2803:8120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8140::,2803:8140:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8180::,2803:8180:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:81c0::,2803:81c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8220::,2803:8220:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:82c0::,2803:82c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8340::,2803:8340:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8380::,2803:8380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:83c0::,2803:83c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8400::,2803:8400:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8420::,2803:8420:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8440::,2803:8440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8480::,2803:8480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:84c0::,2803:84c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8540::,2803:8540:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8580::,2803:8580:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:85c0::,2803:85c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT -2803:8620::,2803:8620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8640::,2803:8640:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:86c0::,2803:86c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:8740::,2803:8740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:87c0::,2803:87c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:8820::,2803:8820:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8840::,2803:8840:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:88c0::,2803:88c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8940::,2803:8940:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8980::,2803:8980:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:89c0::,2803:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8a20::,2803:8a20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8a40::,2803:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8ac0::,2803:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8b40::,2803:8b40:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8b80::,2803:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8bc0::,2803:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:8c20::,2803:8c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:8c40::,2803:8c40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:8cc0::,2803:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8d00::,2803:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8d43::,2803:8d43:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8d80::,2803:8d80:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:8dc0::,2803:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8e20::,2803:8e20:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:8e40::,2803:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:8e80::,2803:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:8ec0::,2803:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:8f00::,2803:8f00:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:8f40::,2803:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:8f80::,2803:8f80:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:8fc0::,2803:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9000::,2803:9000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9020::,2803:9020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9040::,2803:9040:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:9080::,2803:9080:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:90c0::,2803:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9100::,2803:9100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9120::,2803:9120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9140::,2803:9140:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:9180::,2803:9180:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:91c0::,2803:91c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:9220::,2803:9220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9240::,2803:9240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:92c0::,2803:92c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9340::,2803:9340:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:9380::,2803:9380:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:93c0::,2803:93c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:9420::,2803:9420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9440::,2803:9440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:94c0::,2803:94c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9500::,2803:9500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9540::,2803:9540:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:9580::,2803:9580:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:95c0::,2803:95c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:9620::,2803:9620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9640::,2803:9640:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:96c0::,2803:96c0:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:9740::,2803:9740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:97c0::,2803:97c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9820::,2803:9820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9840::,2803:9840:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:98c0::,2803:98c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:9940::,2803:9940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9980::,2803:9980:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:99c0::,2803:99c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:9a20::,2803:9a20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9a40::,2803:9a40:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:9ac0::,2803:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:9b40::,2803:9b40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9b80::,2803:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9bc0::,2803:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9c20::,2803:9c20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:9c40::,2803:9c40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9cc0::,2803:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:9d00::,2803:9d00:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:9d40::,2803:9d40:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:9d80::,2803:9d80:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:9dc0::,2803:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9e20::,2803:9e20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9e40::,2803:9e40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:9ec0::,2803:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9f40::,2803:9f40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:9f80::,2803:9f80:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:9fc0::,2803:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a000::,2803:a000:ffff:ffff:ffff:ffff:ffff:ffff,BQ -2803:a020::,2803:a020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a040::,2803:a040:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:a080::,2803:a080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a0c0::,2803:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:a120::,2803:a120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a140::,2803:a140:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:a180::,2803:a180:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:a1c0::,2803:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR -2803:a220::,2803:a220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:a2c0::,2803:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:a340::,2803:a340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a380::,2803:a380:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:a3c0::,2803:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a400::,2803:a400:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:a420::,2803:a420:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:a440::,2803:a440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a480::,2803:a480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a4c0::,2803:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a500::,2803:a500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a540::,2803:a540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a580::,2803:a580:ffff:ffff:ffff:ffff:ffff:ffff,HT -2803:a5c0::,2803:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a620::,2803:a620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a640::,2803:a640:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a6c0::,2803:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:a740::,2803:a740:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a7c0::,2803:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:a820::,2803:a820:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a8c0::,2803:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:a940::,2803:a940:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:a980::,2803:a980:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:a9c0::,2803:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:aa20::,2803:aa20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:aa40::,2803:aa40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:aac0::,2803:aac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:ab40::,2803:ab40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ab80::,2803:ab80:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:abc0::,2803:abc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ac20::,2803:ac20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ac40::,2803:ac40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:acc0::,2803:acc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:ad00::,2803:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ad40::,2803:ad40:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:ad80::,2803:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:adc0::,2803:adc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ae20::,2803:ae20:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:ae40::,2803:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:aec0::,2803:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:af40::,2803:af40:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:af80::,2803:af80:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:afc0::,2803:afc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b000::,2803:b000:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:b020::,2803:b020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b080::,2803:b080:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:b0c0::,2803:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b100::,2803:b100:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:b140::,2803:b140:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:b180::,2803:b180:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b1c0::,2803:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:b220::,2803:b220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b240::,2803:b240:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b2c0::,2803:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:b340::,2803:b340:ffff:ffff:ffff:ffff:ffff:ffff,SX -2803:b380::,2803:b380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b3c0::,2803:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:b420::,2803:b420:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:b440::,2803:b440:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b4c0::,2803:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:b500::,2803:b500:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:b540::,2803:b540:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:b580::,2803:b580:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:b5c0::,2803:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:b600::,2803:b600:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b620::,2803:b620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b640::,2803:b640:ffff:ffff:ffff:ffff:ffff:ffff,AW -2803:b680::,2803:b680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b6c0::,2803:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b700::,2803:b700:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:b740::,2803:b740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b780::,2803:b780:ffff:ffff:ffff:ffff:ffff:ffff,NI -2803:b7c0::,2803:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b800::,2803:b800:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:b820::,2803:b820:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:b840::,2803:b840:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:b880::,2803:b880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b8c0::,2803:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b900::,2803:b900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:b940::,2803:b940:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:b9c0::,2803:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:ba20::,2803:ba20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ba40::,2803:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bac0::,2803:bac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bb40::,2803:bb40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bb80::,2803:bb80:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:bbc0::,2803:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bc20::,2803:bc20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:bc40::,2803:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:bcc0::,2803:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bd00::,2803:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bd40::,2803:bd40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bd80::,2803:bd80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:bdc0::,2803:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:be20::,2803:be20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:be40::,2803:be40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:bec0::,2803:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:bf40::,2803:bf40:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:bf80::,2803:bf80:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:bfc0::,2803:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c000::,2803:c000:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:c020::,2803:c020:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c040::,2803:c040:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:c080::,2803:c080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c0c0::,2803:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:c120::,2803:c120:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c140::,2803:c140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c180::,2803:c180:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c1c0::,2803:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:c220::,2803:c220:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c2c0::,2803:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:c340::,2803:c340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c380::,2803:c380:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:c3c0::,2803:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:c400::,2803:c400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c420::,2803:c420:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c440::,2803:c440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c480::,2803:c480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c4c0::,2803:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c540::,2803:c540:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:c580::,2803:c580:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c5c0::,2803:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c620::,2803:c620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c640::,2803:c640:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT -2803:c6c0::,2803:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF -2803:c740::,2803:c740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c7c0::,2803:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:c820::,2803:c820:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:c840::,2803:c840:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:c8c0::,2803:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:c940::,2803:c940:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:c980::,2803:c980:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:c9c0::,2803:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ca20::,2803:ca20:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:ca40::,2803:ca40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:cac0::,2803:cac0:ffff:ffff:ffff:ffff:ffff:ffff,HT -2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:cb40::,2803:cb40:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:cb80::,2803:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cbc0::,2803:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:cc20::,2803:cc20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:cc40::,2803:cc40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ccc0::,2803:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cd00::,2803:cd00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cd40::,2803:cd40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cd80::,2803:cd80:ffff:ffff:ffff:ffff:ffff:ffff,TT -2803:cdc0::,2803:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:ce20::,2803:ce20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ce40::,2803:ce40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cec0::,2803:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cf40::,2803:cf40:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:cf80::,2803:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:cfc0::,2803:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:d000::,2803:d000:fffd:ffff:ffff:ffff:ffff:ffff,BZ -2803:d000:fffe::,2803:d000:fffe:ffff:ffff:ffff:ffff:ffff,US -2803:d000:ffff::,2803:d000:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:d020::,2803:d020:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:d040::,2803:d040:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:d080::,2803:d080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d0c0::,2803:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:d120::,2803:d120:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d140::,2803:d140:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d180::,2803:d180:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:d1c0::,2803:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:d220::,2803:d220:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:d240::,2803:d240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:d2c0::,2803:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d340::,2803:d340:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d380::,2803:d380:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d3c0::,2803:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d420::,2803:d420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d440::,2803:d440:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:d4c0::,2803:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:d580::,2803:d580:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d5c0::,2803:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY -2803:d620::,2803:d620:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d640::,2803:d640:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:d680::,2803:d680:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:d6c0::,2803:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:d700::,2803:d700:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:d740::,2803:d740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d780::,2803:d780:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:d7c0::,2803:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d800::,2803:d800:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d820::,2803:d820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d840::,2803:d840:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:d880::,2803:d880:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:d8c0::,2803:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:d900::,2803:d900:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:d940::,2803:d940:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:d980::,2803:d980:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:d9c0::,2803:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY -2803:da20::,2803:da20:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:da40::,2803:da40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:dac0::,2803:dac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:db40::,2803:db40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:db80::,2803:db80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:dbc0::,2803:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:dc20::,2803:dc20:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:dc40::,2803:dc40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:dcc0::,2803:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:dd00::,2803:dd00:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:dd40::,2803:dd40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:dd80::,2803:dd80:ffff:ffff:ffff:ffff:ffff:ffff,VE -2803:ddc0::,2803:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:de20::,2803:de20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:de40::,2803:de40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:dec0::,2803:dec0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:df40::,2803:df40:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:df80::,2803:df80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:dfc0::,2803:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e000::,2803:e000:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:e020::,2803:e020:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:e040::,2803:e040:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e080::,2803:e080:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e0c0::,2803:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e120::,2803:e120:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:e140::,2803:e140:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:e180::,2803:e180:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e1c0::,2803:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e220::,2803:e220:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e2c0::,2803:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:e340::,2803:e340:ffff:ffff:ffff:ffff:ffff:ffff,GY -2803:e380::,2803:e380:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:e3c0::,2803:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e400::,2803:e400:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e420::,2803:e420:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e440::,2803:e440:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e480::,2803:e480:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e4c0::,2803:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e500::,2803:e500:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:e540::,2803:e540:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e580::,2803:e580:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:e5c0::,2803:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:e620::,2803:e620:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:e640::,2803:e640:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:e6c0::,2803:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:e740::,2803:e740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:e7c0::,2803:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e820::,2803:e820:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:e840::,2803:e840:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT -2803:e8c0::,2803:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e940::,2803:e940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:e9c0::,2803:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ea20::,2803:ea20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ea40::,2803:ea40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:eac0::,2803:eac0:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:eb00::,2803:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:eb40::,2803:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:eb80::,2803:eb80:7fff:ffff:ffff:ffff:ffff:ffff,AR -2803:eb80:8000::,2803:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ebc0::,2803:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ec20::,2803:ec20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:ec40::,2803:ec40:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ecc0::,2803:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ed00::,2803:ed00:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:ed40::,2803:ed40:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:ed80::,2803:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:edc0::,2803:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ee20::,2803:ee20:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:ee40::,2803:ee40:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:eec0::,2803:eec0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:ef40::,2803:ef40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ef80::,2803:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:efc0::,2803:efc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:f000::,2803:f000:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f020::,2803:f020:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:f040::,2803:f040:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f080::,2803:f080:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:f0c0::,2803:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:f100::,2803:f100:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f140::,2803:f140:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f180::,2803:f180:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:f1c0::,2803:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f220::,2803:f220:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f240::,2803:f240:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:f2c0::,2803:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f340::,2803:f340:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:f380::,2803:f380:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f3c0::,2803:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:f420::,2803:f420:ffff:ffff:ffff:ffff:ffff:ffff,HN -2803:f440::,2803:f440:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:f4c0::,2803:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f500::,2803:f500:ffff:ffff:ffff:ffff:ffff:ffff,CW -2803:f540::,2803:f540:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:f580::,2803:f580:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f5c0::,2803:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:f620::,2803:f620:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:f640::,2803:f640:ffff:ffff:ffff:ffff:ffff:ffff,BQ -2803:f680::,2803:f680:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f6c0::,2803:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f700::,2803:f700:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f740::,2803:f740:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f780::,2803:f780:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:f7c0::,2803:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f800::,2803:f800:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:f820::,2803:f820:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:f840::,2803:f840:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:f8c0::,2803:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:f900::,2803:f900:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:f940::,2803:f940:ffff:ffff:ffff:ffff:ffff:ffff,SX -2803:f980::,2803:f980:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:f9c0::,2803:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO -2803:fa20::,2803:fa20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fa40::,2803:fa40:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fac0::,2803:fac0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA -2803:fb40::,2803:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:fb80::,2803:fb80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fbc0::,2803:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY -2803:fc20::,2803:fc20:ffff:ffff:ffff:ffff:ffff:ffff,EC -2803:fc40::,2803:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fcc0::,2803:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:fd40::,2803:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SV -2803:fd80::,2803:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CL -2803:fdc0::,2803:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:fe20::,2803:fe20:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:fe40::,2803:fe40:ffff:ffff:ffff:ffff:ffff:ffff,CR -2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE -2803:fec0::,2803:fec0:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ff40::,2803:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SR -2803:ff80::,2803:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:ffc0::,2803:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,CL -2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4::,2804:4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8::,2804:c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10::,2804:10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14::,2804:14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18::,2804:18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c::,2804:1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20::,2804:20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24::,2804:24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28::,2804:28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30::,2804:30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34::,2804:34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38::,2804:38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c::,2804:3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40::,2804:40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44::,2804:44::ffff:ffff:ffff:ffff:ffff,BR -2804:44:1::,2804:44:1:ffff:ffff:ffff:ffff:ffff,US -2804:44:2::,2804:44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:48::,2804:48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4c::,2804:4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:50::,2804:50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:54::,2804:54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:58::,2804:58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5c::,2804:5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:60::,2804:60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:64::,2804:64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:68::,2804:68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6c::,2804:6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:70::,2804:70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:74::,2804:74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:78::,2804:78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7c::,2804:7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:80::,2804:80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:84::,2804:84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:88::,2804:88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8c::,2804:8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:90::,2804:90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:94::,2804:94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:98::,2804:98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9c::,2804:9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a0::,2804:a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a4::,2804:a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a8::,2804:a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ac::,2804:ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b0::,2804:b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b4::,2804:b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b8::,2804:b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c0::,2804:c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c4::,2804:c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c8::,2804:c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cc::,2804:cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d0::,2804:d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d4::,2804:d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d8::,2804:d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e0::,2804:e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e4::,2804:e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e8::,2804:e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ec::,2804:ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f0::,2804:f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f4::,2804:f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f8::,2804:f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fc::,2804:fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:100::,2804:100:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:104::,2804:104:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10c::,2804:10c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:110::,2804:110:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:114::,2804:114:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:118::,2804:118:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11c::,2804:11c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:120::,2804:120:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:124::,2804:124:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:128::,2804:128:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:130::,2804:130:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:134::,2804:134:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:138::,2804:138:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13c::,2804:13c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:140::,2804:140:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:144::,2804:144:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:148::,2804:148:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14c::,2804:14c:34:1fff:ffff:ffff:ffff:ffff,BR -2804:14c:34:2000::,2804:14c:34:20ff:ffff:ffff:ffff:ffff,BE -2804:14c:34:2100::,2804:14d:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:150::,2804:154:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:158::,2804:158:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15c::,2804:15c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:160::,2804:160:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:164::,2804:164:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:168::,2804:168:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16c::,2804:16c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:170::,2804:170:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:174::,2804:174:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:178::,2804:178:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17c::,2804:17c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:180::,2804:180:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:184::,2804:184:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:188::,2804:188:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18c::,2804:18c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:190::,2804:190:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:194::,2804:194:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:198::,2804:198:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19c::,2804:19c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a0::,2804:1a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a4::,2804:1a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a8::,2804:1a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ac::,2804:1ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b0::,2804:1b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bc::,2804:1bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c0::,2804:1c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c4::,2804:1c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c8::,2804:1c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cc::,2804:1cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d0::,2804:1d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d4::,2804:1d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d8::,2804:1d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dc::,2804:1dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e0::,2804:1e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e8::,2804:1e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ec::,2804:1ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f0::,2804:1f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f4::,2804:1f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f8::,2804:1f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:200::,2804:200:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:204::,2804:204:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:208::,2804:208:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20c::,2804:20c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:210::,2804:210:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:214::,2804:214:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:218::,2804:218:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:220::,2804:220:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:224::,2804:224:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22c::,2804:22c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:230::,2804:230:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:234::,2804:234:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:238::,2804:238:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23c::,2804:23c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:240::,2804:240:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:244::,2804:244:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:248::,2804:248:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24c::,2804:24c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:250::,2804:250:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:254::,2804:254:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:258::,2804:258:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25c::,2804:25c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:260::,2804:260:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:268::,2804:268:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26c::,2804:26c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:270::,2804:270:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:274::,2804:274:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27c::,2804:27c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:280::,2804:280:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:284::,2804:284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:288::,2804:288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28c::,2804:28c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:290::,2804:290:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:294::,2804:294:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:298::,2804:298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a0::,2804:2a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a4::,2804:2a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a8::,2804:2a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ac::,2804:2ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b0::,2804:2b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b4::,2804:2b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b8::,2804:2b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bc::,2804:2bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c0::,2804:2c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c8::,2804:2c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cc::,2804:2cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d0::,2804:2d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d4::,2804:2d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d8::,2804:2d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dc::,2804:2dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e0::,2804:2e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e4::,2804:2e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e8::,2804:2e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ec::,2804:2ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f0::,2804:2f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f4::,2804:2f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f8::,2804:2f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fc::,2804:2fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:300::,2804:303:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:308::,2804:308:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30c::,2804:30c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:310::,2804:310:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:314::,2804:314:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:318::,2804:318:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31c::,2804:31c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:320::,2804:320:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:324::,2804:324:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:328::,2804:328:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:330::,2804:330:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:334::,2804:334:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:338::,2804:338:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33c::,2804:33c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:340::,2804:340:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:344::,2804:344:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:348::,2804:348:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:350::,2804:350:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:354::,2804:354:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:358::,2804:358:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35c::,2804:35c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:360::,2804:360:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:364::,2804:364:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:368::,2804:368:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36c::,2804:36c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:370::,2804:370:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:374::,2804:374:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:378::,2804:378:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37c::,2804:37c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:380::,2804:380:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:388::,2804:38b:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:390::,2804:390:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:394::,2804:394:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39c::,2804:39c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a0::,2804:3a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a4::,2804:3a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a8::,2804:3a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ac::,2804:3ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b0::,2804:3b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b4::,2804:3b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b8::,2804:3b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bc::,2804:3bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c0::,2804:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c4::,2804:3c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c8::,2804:3c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cc::,2804:3cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d0::,2804:3d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d4::,2804:3d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d8::,2804:3d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dc::,2804:3dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e0::,2804:3e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e4::,2804:3e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e8::,2804:3e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ec::,2804:3ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f0::,2804:3f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f4::,2804:3f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f8::,2804:3f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fc::,2804:3fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:400::,2804:400:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:404::,2804:404:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40c::,2804:40c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:414::,2804:414:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:418::,2804:418:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41c::,2804:41c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:420::,2804:420:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:424::,2804:424:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:428::,2804:428:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:430::,2804:431:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:438::,2804:438:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43c::,2804:43c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:440::,2804:440:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:444::,2804:444:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:448::,2804:448:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44c::,2804:44c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:450::,2804:450:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:454::,2804:454:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:458::,2804:458:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45c::,2804:45c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:460::,2804:460:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:464::,2804:464:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:468::,2804:468:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46c::,2804:46c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:470::,2804:470:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:474::,2804:474:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:478::,2804:478:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:47c::,2804:47c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:480::,2804:480:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:484::,2804:484:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:488::,2804:488:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:48c::,2804:48c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:490::,2804:490:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:494::,2804:494:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:498::,2804:498:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:49c::,2804:49c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4a0::,2804:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4a4::,2804:4a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4a8::,2804:4a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4ac::,2804:4ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4b0::,2804:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4b4::,2804:4b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4b8::,2804:4b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4bc::,2804:4bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4c0::,2804:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4c4::,2804:4c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4c8::,2804:4c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4cc::,2804:4cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4d4::,2804:4d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4d8::,2804:4d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4dc::,2804:4dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4e0::,2804:4e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4e4::,2804:4e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4e8::,2804:4e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4ec::,2804:4ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4f0::,2804:4f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4f4::,2804:4f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4f8::,2804:4f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4fc::,2804:4fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:500::,2804:500:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:504::,2804:504:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:508::,2804:508:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:50c::,2804:50c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:510::,2804:510:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:514::,2804:514:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:518::,2804:518:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:51c::,2804:51c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:520::,2804:520:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:528::,2804:528:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:52c::,2804:52c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:530::,2804:530:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:534::,2804:534:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:538::,2804:538:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:53c::,2804:53c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:540::,2804:540:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:544::,2804:544:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:548::,2804:548:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:54c::,2804:54c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:550::,2804:550:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:554::,2804:554:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:558::,2804:558:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:55c::,2804:55c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:560::,2804:560:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:564::,2804:564:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:568::,2804:568:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:56c::,2804:56c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:574::,2804:574:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:578::,2804:578:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:57c::,2804:57c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:580::,2804:580:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:584::,2804:584:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:588::,2804:588:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:58c::,2804:58c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:590::,2804:590:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:594::,2804:594:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:598::,2804:598:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:59c::,2804:59c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5a4::,2804:5a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5a8::,2804:5a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5ac::,2804:5ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5b0::,2804:5b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5b4::,2804:5b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5b8::,2804:5b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5bc::,2804:5bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5c0::,2804:5c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5c4::,2804:5c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5c8::,2804:5c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5cc::,2804:5cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5d0::,2804:5d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5d4::,2804:5d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5d8::,2804:5d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5dc::,2804:5dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5e0::,2804:5e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5e4::,2804:5e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5e8::,2804:5e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5ec::,2804:5ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5f0::,2804:5f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5f4::,2804:5f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:5f8::,2804:5f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:600::,2804:600:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:604::,2804:604:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:608::,2804:608:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:60c::,2804:60c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:610::,2804:610:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:614::,2804:614:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:618::,2804:618:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:61c::,2804:61c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:620::,2804:620:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:624::,2804:624:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:628::,2804:628:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:62c::,2804:62c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:630::,2804:630:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:634::,2804:634:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:638::,2804:638:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:63c::,2804:63c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:640::,2804:640:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:644::,2804:644:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:648::,2804:648:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:64c::,2804:64c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:650::,2804:650:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:654::,2804:654:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:658::,2804:658:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:65c::,2804:65c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:660::,2804:660:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:664::,2804:664:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:668::,2804:668:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:66c::,2804:66c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:670::,2804:670:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:674::,2804:674:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:678::,2804:678:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:680::,2804:680:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:684::,2804:684:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:688::,2804:688:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:68c::,2804:68c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:690::,2804:690:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:694::,2804:694:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:698::,2804:698:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:69c::,2804:69c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6a0::,2804:6a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6a4::,2804:6a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6a8::,2804:6a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6ac::,2804:6ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6b0::,2804:6b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6b4::,2804:6b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6b8::,2804:6b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6bc::,2804:6bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6c0::,2804:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6c4::,2804:6c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6c8::,2804:6c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6cc::,2804:6cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6d0::,2804:6d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6d4::,2804:6d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6d8::,2804:6d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6dc::,2804:6dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6e0::,2804:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6e4::,2804:6e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6e8::,2804:6e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6ec::,2804:6ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6f0::,2804:6f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6f4::,2804:6f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6f8::,2804:6f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:6fc::,2804:6fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:700::,2804:700:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:704::,2804:704:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:70c::,2804:70c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:710::,2804:710:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:714::,2804:714:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:718::,2804:718:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:71c::,2804:71c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:720::,2804:720:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:724::,2804:724:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:728::,2804:728:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:72c::,2804:72c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:730::,2804:730:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:734::,2804:734:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:738::,2804:738:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:73c::,2804:73c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:740::,2804:740:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:744::,2804:744:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:748::,2804:748:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:74c::,2804:74c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:750::,2804:750:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:754::,2804:754:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:758::,2804:758:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:75c::,2804:75c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:760::,2804:760:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:764::,2804:764:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:768::,2804:768:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:76c::,2804:76c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:770::,2804:770:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:774::,2804:774:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:778::,2804:778:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:77c::,2804:77c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:780::,2804:780:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:784::,2804:784:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:788::,2804:788:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:78c::,2804:78c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:790::,2804:790:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:794::,2804:794:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:798::,2804:798:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:79c::,2804:79c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7a0::,2804:7a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7a4::,2804:7a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7a8::,2804:7a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7ac::,2804:7ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7b0::,2804:7b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7b4::,2804:7b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7b8::,2804:7b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7bc::,2804:7bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7c0::,2804:7c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7c4::,2804:7c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7c8::,2804:7c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7cc::,2804:7cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7d0::,2804:7d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7d4::,2804:7d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7dc::,2804:7dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7e0::,2804:7e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7e4::,2804:7e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7e8::,2804:7e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7ec::,2804:7ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:7f0::,2804:7f7:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:800::,2804:800:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:804::,2804:804:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:808::,2804:808:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:80c::,2804:80c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:810::,2804:810:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:814::,2804:814:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:818::,2804:818:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:81c::,2804:81c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:820::,2804:820:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:824::,2804:824:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:828::,2804:828:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:82c::,2804:82c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:830::,2804:830:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:834::,2804:834:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:838::,2804:838:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:840::,2804:840:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:844::,2804:844:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:848::,2804:848:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:84c::,2804:84c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:850::,2804:850:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:854::,2804:854:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:858::,2804:858:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:85c::,2804:85c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:860::,2804:860:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:864::,2804:864:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:868::,2804:868:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:86c::,2804:86c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:870::,2804:870:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:874::,2804:874:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:878::,2804:878:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:87c::,2804:87c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:880::,2804:880:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:884::,2804:884:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:888::,2804:888:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:88c::,2804:88c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:890::,2804:890:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:894::,2804:894:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:898::,2804:898:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:89c::,2804:89c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8a0::,2804:8a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8a8::,2804:8a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8ac::,2804:8ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8b0::,2804:8b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8b4::,2804:8b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8bc::,2804:8bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8c0::,2804:8c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8c8::,2804:8c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8cc::,2804:8cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8d0::,2804:8d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8d4::,2804:8d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8d8::,2804:8d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8dc::,2804:8dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8e0::,2804:8e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8e4::,2804:8e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8e8::,2804:8e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8ec::,2804:8ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8f0::,2804:8f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8f4::,2804:8f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8f8::,2804:8f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:8fc::,2804:8fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:904::,2804:904:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:908::,2804:908:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:90c::,2804:90c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:910::,2804:910:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:918::,2804:918:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:91c::,2804:91c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:920::,2804:920:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:924::,2804:924:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:928::,2804:928:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:92c::,2804:92c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:930::,2804:930:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:934::,2804:934:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:938::,2804:938:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:93c::,2804:93c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:940::,2804:940:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:948::,2804:948:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:94c::,2804:94c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:950::,2804:950:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:954::,2804:954:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:958::,2804:958:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:95c::,2804:95c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:960::,2804:960:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:964::,2804:964:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:968::,2804:968:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:96c::,2804:96c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:970::,2804:970:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:978::,2804:978:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:97c::,2804:97c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:980::,2804:980:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:984::,2804:984:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:988::,2804:988:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:98c::,2804:98c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:990::,2804:990:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:994::,2804:994:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:998::,2804:998:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:99c::,2804:99c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9a0::,2804:9a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9a4::,2804:9a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9a8::,2804:9a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9ac::,2804:9ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9b0::,2804:9b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9b4::,2804:9b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9b8::,2804:9b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9bc::,2804:9bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9c0::,2804:9c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9c4::,2804:9c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9c8::,2804:9c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9cc::,2804:9cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9d0::,2804:9d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9d4::,2804:9d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9d8::,2804:9d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9dc::,2804:9dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9e0::,2804:9e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9e4::,2804:9e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9e8::,2804:9e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9ec::,2804:9ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9f0::,2804:9f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9f4::,2804:9f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9f8::,2804:9f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:9fc::,2804:9fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a00::,2804:a00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a08::,2804:a08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a0c::,2804:a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a10::,2804:a10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a14::,2804:a14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a18::,2804:a18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a1c::,2804:a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a20::,2804:a20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a24::,2804:a24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a28::,2804:a28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a2c::,2804:a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a30::,2804:a30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a34::,2804:a34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a38::,2804:a38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a3c::,2804:a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a40::,2804:a40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a44::,2804:a44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a48::,2804:a48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a4c::,2804:a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a50::,2804:a50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a54::,2804:a54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a58::,2804:a58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a5c::,2804:a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a60::,2804:a60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a64::,2804:a64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a68::,2804:a68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a6c::,2804:a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a70::,2804:a70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a74::,2804:a74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a78::,2804:a78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a80::,2804:a80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a84::,2804:a84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a88::,2804:a88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a8c::,2804:a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a90::,2804:a90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a94::,2804:a94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a98::,2804:a98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:a9c::,2804:a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:aa0::,2804:aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:aa4::,2804:aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:aa8::,2804:aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:aac::,2804:aac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ab0::,2804:ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ab4::,2804:ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ab8::,2804:ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:abc::,2804:abc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ac0::,2804:ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ac4::,2804:ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ac8::,2804:ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:acc::,2804:acc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ad0::,2804:ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ad4::,2804:ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ad8::,2804:ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:adc::,2804:adc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ae0::,2804:ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ae4::,2804:ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ae8::,2804:ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:aec::,2804:aec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:af4::,2804:af4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:af8::,2804:af8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:afc::,2804:afc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b00::,2804:b00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b04::,2804:b04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b08::,2804:b08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b0c::,2804:b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b10::,2804:b10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b14::,2804:b14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b18::,2804:b18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b1c::,2804:b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b24::,2804:b24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b28::,2804:b28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b2c::,2804:b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b30::,2804:b30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b34::,2804:b34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b38::,2804:b38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b3c::,2804:b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b40::,2804:b40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b44::,2804:b44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b48::,2804:b48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b4c::,2804:b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b50::,2804:b50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b54::,2804:b54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b58::,2804:b58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b5c::,2804:b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b60::,2804:b60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b64::,2804:b64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b6c::,2804:b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b70::,2804:b70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b78::,2804:b78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b7c::,2804:b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b80::,2804:b80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b84::,2804:b84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b88::,2804:b88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b8c::,2804:b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b90::,2804:b90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b94::,2804:b94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b98::,2804:b98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:b9c::,2804:b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ba0::,2804:ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ba4::,2804:ba5:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ba8::,2804:ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bac::,2804:bac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bb0::,2804:bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bb4::,2804:bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bb8::,2804:bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bbc::,2804:bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bc4::,2804:bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bc8::,2804:bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bcc::,2804:bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bd0::,2804:bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bd4::,2804:bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bd8::,2804:bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bdc::,2804:bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:be0::,2804:be0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:be4::,2804:be4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:be8::,2804:be8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bec::,2804:bec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bf0::,2804:bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bf4::,2804:bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bf8::,2804:bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:bfc::,2804:bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c00::,2804:c00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c04::,2804:c04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c08::,2804:c08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c0c::,2804:c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c10::,2804:c10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c14::,2804:c14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c18::,2804:c18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c1c::,2804:c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c20::,2804:c20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c24::,2804:c24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c28::,2804:c28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c2c::,2804:c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c30::,2804:c30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c34::,2804:c34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c38::,2804:c38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c3c::,2804:c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c40::,2804:c40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c44::,2804:c44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c48::,2804:c48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c4c::,2804:c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c50::,2804:c50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c54::,2804:c54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c58::,2804:c58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c5c::,2804:c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c60::,2804:c60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c64::,2804:c64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c68::,2804:c68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c6c::,2804:c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c70::,2804:c70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c74::,2804:c74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c78::,2804:c78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c7c::,2804:c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c80::,2804:c80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c84::,2804:c84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c88::,2804:c88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c90::,2804:c90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c94::,2804:c94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c98::,2804:c98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:c9c::,2804:c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ca0::,2804:ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ca4::,2804:ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ca8::,2804:ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cac::,2804:cac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cb0::,2804:cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cb4::,2804:cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cb8::,2804:cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cbc::,2804:cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cc0::,2804:cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cc4::,2804:cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cc8::,2804:cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ccc::,2804:ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cd0::,2804:cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cd4::,2804:cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cd8::,2804:cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cdc::,2804:cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ce0::,2804:ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ce4::,2804:ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ce8::,2804:ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cec::,2804:cec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cf0::,2804:cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cf4::,2804:cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cf8::,2804:cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:cfc::,2804:cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d00::,2804:d00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d04::,2804:d04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d08::,2804:d08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d0c::,2804:d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d10::,2804:d10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d14::,2804:d14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d18::,2804:d18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d1c::,2804:d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d20::,2804:d20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d24::,2804:d24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d28::,2804:d28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d2c::,2804:d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d30::,2804:d30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d34::,2804:d34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d38::,2804:d38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d3c::,2804:d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d40::,2804:d57:1266:7fff:ffff:ffff:ffff:ffff,BR -2804:d57:1266:8000::,2804:d57:1266:ffff:ffff:ffff:ffff:ffff,AU -2804:d57:1267::,2804:d57:12ce:ffff:ffff:ffff:ffff:ffff,BR -2804:d57:12cf::,2804:d57:12cf:7fff:ffff:ffff:ffff:ffff,GB -2804:d57:12cf:8000::,2804:d60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d64::,2804:d64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d68::,2804:d68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d6c::,2804:d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d70::,2804:d70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d74::,2804:d74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d78::,2804:d78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d7c::,2804:d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d80::,2804:d80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d84::,2804:d84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d88::,2804:d88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d8c::,2804:d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d90::,2804:d90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d94::,2804:d94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d98::,2804:d98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:d9c::,2804:d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:da0::,2804:da0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:da4::,2804:da4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:da8::,2804:da8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dac::,2804:dac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:db0::,2804:db0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:db4::,2804:db4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:db8::,2804:db8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dbc::,2804:dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dc0::,2804:dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dc8::,2804:dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dcc::,2804:dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dd0::,2804:dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dd4::,2804:dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dd8::,2804:dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ddc::,2804:ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:de0::,2804:de0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:de4::,2804:de4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:de8::,2804:de8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dec::,2804:dec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:df0::,2804:df0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:df4::,2804:df4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:df8::,2804:df8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:dfc::,2804:dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e00::,2804:e00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e04::,2804:e04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e08::,2804:e08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e0c::,2804:e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e10::,2804:e10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e14::,2804:e14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e18::,2804:e18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e1c::,2804:e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e20::,2804:e20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e24::,2804:e24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e28::,2804:e28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e2c::,2804:e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e30::,2804:e30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e34::,2804:e34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e38::,2804:e38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e3c::,2804:e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e40::,2804:e40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e44::,2804:e44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e48::,2804:e48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e4c::,2804:e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e50::,2804:e50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e54::,2804:e54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e58::,2804:e58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e5c::,2804:e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e60::,2804:e60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e64::,2804:e64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e68::,2804:e68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e6c::,2804:e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e70::,2804:e70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e74::,2804:e74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e78::,2804:e78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e7c::,2804:e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e80::,2804:e80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e84::,2804:e84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e88::,2804:e88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e8c::,2804:e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e90::,2804:e90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e94::,2804:e94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e98::,2804:e98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:e9c::,2804:e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ea0::,2804:ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ea4::,2804:ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ea8::,2804:ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:eac::,2804:eac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:eb0::,2804:eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:eb4::,2804:eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:eb8::,2804:eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ebc::,2804:ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ec0::,2804:ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ec4::,2804:ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ec8::,2804:ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ecc::,2804:ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ed0::,2804:ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ed4::,2804:ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ed8::,2804:ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:edc::,2804:edc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ee0::,2804:ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ee4::,2804:ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ee8::,2804:ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:eec::,2804:eec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ef0::,2804:ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ef4::,2804:ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ef8::,2804:ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:efc::,2804:efc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f00::,2804:f00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f04::,2804:f04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f08::,2804:f08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f0c::,2804:f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f10::,2804:f10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f14::,2804:f14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f18::,2804:f18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f1c::,2804:f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f20::,2804:f20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f24::,2804:f24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f28::,2804:f28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f2c::,2804:f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f30::,2804:f30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f34::,2804:f34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f38::,2804:f38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f3c::,2804:f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f40::,2804:f40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f44::,2804:f44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f48::,2804:f48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f4c::,2804:f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f50::,2804:f50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f54::,2804:f54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f58::,2804:f58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f60::,2804:f60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f64::,2804:f64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f68::,2804:f68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f6c::,2804:f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f70::,2804:f70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f74::,2804:f74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f78::,2804:f78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f7c::,2804:f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f80::,2804:f80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f84::,2804:f84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f88::,2804:f88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f8c::,2804:f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f90::,2804:f90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f98::,2804:f98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:f9c::,2804:f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fa0::,2804:fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fa4::,2804:fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fa8::,2804:fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fac::,2804:fac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fb0::,2804:fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fb4::,2804:fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fb8::,2804:fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fbc::,2804:fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fc0::,2804:fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fc4::,2804:fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fc8::,2804:fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fcc::,2804:fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fd0::,2804:fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fd4::,2804:fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fdc::,2804:fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fe0::,2804:fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fe4::,2804:fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:fec::,2804:fec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ff0::,2804:ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ff4::,2804:ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ff8::,2804:ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:ffc::,2804:ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1000::,2804:1000:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1004::,2804:1004:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1008::,2804:1008:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:100c::,2804:100c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1010::,2804:1010:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1014::,2804:1014:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1018::,2804:1018:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:101c::,2804:101c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1020::,2804:1020:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1024::,2804:1024:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1028::,2804:1028:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:102c::,2804:102c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1030::,2804:1030:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1034::,2804:1034:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1038::,2804:1038:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:103c::,2804:103c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1040::,2804:1040:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1044::,2804:1044:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1048::,2804:1048:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:104c::,2804:104c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1050::,2804:1050:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1054::,2804:1054:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1058::,2804:1058:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:105c::,2804:105c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1060::,2804:1060:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1064::,2804:1064:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1068::,2804:1068:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:106c::,2804:106c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1070::,2804:1070:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1074::,2804:1074:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1078::,2804:1078:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:107c::,2804:107c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1080::,2804:1080:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1084::,2804:1084:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1088::,2804:1088:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:108c::,2804:108c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1090::,2804:1090:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1094::,2804:1094:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1098::,2804:1098:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:109c::,2804:109c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10a0::,2804:10a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10a4::,2804:10a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10a8::,2804:10a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10ac::,2804:10ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10b0::,2804:10b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10b4::,2804:10b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10b8::,2804:10b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10bc::,2804:10bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10c0::,2804:10c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10c4::,2804:10c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10c8::,2804:10c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10cc::,2804:10cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10d4::,2804:10d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10d8::,2804:10d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10dc::,2804:10dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10e0::,2804:10e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10e4::,2804:10e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10e8::,2804:10e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10ec::,2804:10ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10f0::,2804:10f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10f4::,2804:10f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10f8::,2804:10f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:10fc::,2804:10fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1100::,2804:1100:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1104::,2804:1104:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1108::,2804:1108:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:110c::,2804:110c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1110::,2804:1110:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1114::,2804:1114:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1118::,2804:1118:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:111c::,2804:111c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1120::,2804:1120:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1124::,2804:1124:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1128::,2804:1128:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:112c::,2804:112c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1130::,2804:1130:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1134::,2804:1134:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1138::,2804:1138:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:113c::,2804:113c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1140::,2804:1140:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1144::,2804:1144:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1148::,2804:1148:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:114c::,2804:114c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1150::,2804:1150:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1154::,2804:1154:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1158::,2804:1158:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:115c::,2804:115c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1160::,2804:1160:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1164::,2804:1164:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1168::,2804:1168:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:116c::,2804:116c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1170::,2804:1170:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1174::,2804:1174:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1178::,2804:1178:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:117c::,2804:117c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1180::,2804:1180:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1184::,2804:1184:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1188::,2804:1188:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:118c::,2804:118c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1190::,2804:1190:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1194::,2804:1194:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1198::,2804:1198:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:119c::,2804:119c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11a0::,2804:11a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11a4::,2804:11a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11a8::,2804:11a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11ac::,2804:11ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11b0::,2804:11b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11b4::,2804:11b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11b8::,2804:11b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11bc::,2804:11bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11c0::,2804:11c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11c4::,2804:11c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11c8::,2804:11c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11cc::,2804:11cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11d0::,2804:11d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11d4::,2804:11d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11d8::,2804:11d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11dc::,2804:11dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11e0::,2804:11e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11e4::,2804:11e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11e8::,2804:11e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11ec::,2804:11ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11f0::,2804:11f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11f4::,2804:11f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:11fc::,2804:11fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1200::,2804:1200:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1204::,2804:1204:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1208::,2804:1208:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:120c::,2804:120c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1210::,2804:1210:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1214::,2804:1214:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1218::,2804:1218:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:121c::,2804:121c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1220::,2804:1220:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1224::,2804:1224:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1228::,2804:1228:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:122c::,2804:122c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1230::,2804:1230:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1234::,2804:1234:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1238::,2804:1238:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:123c::,2804:123c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1240::,2804:1240:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1244::,2804:1244:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1248::,2804:1248:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:124c::,2804:124c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1250::,2804:1250:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1254::,2804:1254:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1258::,2804:1258:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:125c::,2804:125c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1260::,2804:1260:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1264::,2804:1264:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1268::,2804:1268:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:126c::,2804:126c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1270::,2804:1270:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1274::,2804:1274:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1278::,2804:1278:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:127c::,2804:127c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1280::,2804:1280:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1284::,2804:1284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1288::,2804:1288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:128c::,2804:128c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1290::,2804:1290:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1294::,2804:1294:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1298::,2804:1298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:129c::,2804:129c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12a0::,2804:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12a4::,2804:12a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12a8::,2804:12a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12ac::,2804:12ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12b0::,2804:12b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12b4::,2804:12b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12b8::,2804:12b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12bc::,2804:12bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12c0::,2804:12c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12c4::,2804:12c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12c8::,2804:12c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12cc::,2804:12cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12d0::,2804:12d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12d4::,2804:12d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12d8::,2804:12d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12dc::,2804:12dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12e0::,2804:12e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12e4::,2804:12e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12e8::,2804:12e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12ec::,2804:12ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12f0::,2804:12f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12f4::,2804:12f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12f8::,2804:12f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:12fc::,2804:12fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1300::,2804:1300:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1304::,2804:1304:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1308::,2804:1308:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:130c::,2804:130c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1310::,2804:1310:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1314::,2804:1314:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1318::,2804:1318:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:131c::,2804:131c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1320::,2804:1320:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1324::,2804:1324:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1328::,2804:1328:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:132c::,2804:132c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1330::,2804:1330:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1334::,2804:1334:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1338::,2804:1338:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:133c::,2804:133c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1340::,2804:1340:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1344::,2804:1344:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1348::,2804:1348:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:134c::,2804:134c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1350::,2804:1350:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1354::,2804:1354:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1358::,2804:1358:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:135c::,2804:135c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1360::,2804:1360:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1364::,2804:1364:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1368::,2804:1368:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:136c::,2804:136c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1370::,2804:1370:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1374::,2804:1374:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1378::,2804:1378:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:137c::,2804:137c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1380::,2804:1380:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1384::,2804:1384:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1388::,2804:138b:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1390::,2804:1390:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1394::,2804:1394:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1398::,2804:1398:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:139c::,2804:139c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13a0::,2804:13a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13a4::,2804:13a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13a8::,2804:13a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13ac::,2804:13ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13b0::,2804:13b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13b4::,2804:13b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13b8::,2804:13b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13bc::,2804:13bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13c0::,2804:13c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13c4::,2804:13c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13c8::,2804:13c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13cc::,2804:13cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13d0::,2804:13d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13d4::,2804:13d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13d8::,2804:13d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13dc::,2804:13dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13e0::,2804:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13e4::,2804:13e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13e8::,2804:13e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13ec::,2804:13ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13f0::,2804:13f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13f4::,2804:13f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13f8::,2804:13f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:13fc::,2804:13fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1400::,2804:1400:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1404::,2804:1404:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1408::,2804:1408:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:140c::,2804:140c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1410::,2804:1410:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1414::,2804:1414:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1418::,2804:1418:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:141c::,2804:141c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1420::,2804:1420:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1424::,2804:1424:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1428::,2804:1428:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:142c::,2804:142c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1430::,2804:1430:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1434::,2804:1434:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1438::,2804:1438:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:143c::,2804:143c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1440::,2804:1440:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1444::,2804:1444:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1448::,2804:1448:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:144c::,2804:144c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1450::,2804:1450:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1454::,2804:1454:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1458::,2804:1458:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:145c::,2804:145c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1460::,2804:1460:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1464::,2804:1464:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1468::,2804:1468:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:146c::,2804:146c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1470::,2804:1470:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1474::,2804:1474:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1478::,2804:1478:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:147c::,2804:147c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1480::,2804:1480:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1484::,2804:1484:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1488::,2804:1488:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:148c::,2804:148c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1490::,2804:1490:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1494::,2804:1494:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1498::,2804:1498:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:149c::,2804:149c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14a0::,2804:14a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14a4::,2804:14a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14a8::,2804:14a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14ac::,2804:14ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14b0::,2804:14b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14b4::,2804:14b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14b8::,2804:14b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14bc::,2804:14bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14c0::,2804:14c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14c4::,2804:14c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14c8::,2804:14c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14cc::,2804:14cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14d0::,2804:14d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14d4::,2804:14d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14d8::,2804:14d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14dc::,2804:14dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14e0::,2804:14e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14e4::,2804:14e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14e8::,2804:14e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14ec::,2804:14ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14f0::,2804:14f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14f4::,2804:14f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14f8::,2804:14f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:14fc::,2804:14fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1500::,2804:1500:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1504::,2804:1504:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1508::,2804:1508:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:150c::,2804:150c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1510::,2804:1510:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1514::,2804:1514:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1518::,2804:1518:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:151c::,2804:151c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1520::,2804:1520:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1524::,2804:1524:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1528::,2804:1528:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:152c::,2804:152c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1530::,2804:1530:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1534::,2804:1534:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1538::,2804:1538:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:153c::,2804:153c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1540::,2804:1540:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1544::,2804:1544:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1548::,2804:1548:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:154c::,2804:154c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1550::,2804:1550:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1554::,2804:1554:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1558::,2804:1558:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:155c::,2804:155c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1560::,2804:1560:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1564::,2804:1564:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1568::,2804:1568:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:156c::,2804:156c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1570::,2804:1570:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1574::,2804:1574:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1578::,2804:1578:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:157c::,2804:157c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1580::,2804:1580:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1584::,2804:1584:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1588::,2804:1588:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:158c::,2804:158c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1590::,2804:1590:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1594::,2804:1594:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1598::,2804:1598:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:159c::,2804:159c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15a0::,2804:15a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15a4::,2804:15a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15a8::,2804:15a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15ac::,2804:15ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15b0::,2804:15b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15b4::,2804:15b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15b8::,2804:15b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15bc::,2804:15bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15c0::,2804:15c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15c4::,2804:15c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15c8::,2804:15c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15cc::,2804:15cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15d0::,2804:15d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15d4::,2804:15d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15d8::,2804:15d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15dc::,2804:15dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15e0::,2804:15e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15e4::,2804:15e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15e8::,2804:15e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15ec::,2804:15ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15f0::,2804:15f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15f4::,2804:15f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15f8::,2804:15f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:15fc::,2804:15fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1600::,2804:1600:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1604::,2804:1604:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1608::,2804:1608:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:160c::,2804:160c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1610::,2804:1610:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1614::,2804:1614:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1618::,2804:1618:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:161c::,2804:161c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1620::,2804:1620:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1624::,2804:1624:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1628::,2804:1628:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:162c::,2804:162c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1630::,2804:1630:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1634::,2804:1634:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1638::,2804:1638:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:163c::,2804:163c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1644::,2804:1644:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1648::,2804:1648:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:164c::,2804:164c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1650::,2804:1650:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1654::,2804:1654:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1658::,2804:1658:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:165c::,2804:165c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1660::,2804:1660:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1664::,2804:1664:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1668::,2804:1668:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:166c::,2804:166c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1670::,2804:1670:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1674::,2804:1674:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:167c::,2804:167c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1680::,2804:1680:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1684::,2804:1684:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1688::,2804:1688:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:168c::,2804:168c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1690::,2804:1690:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1694::,2804:1694:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1698::,2804:1698:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:169c::,2804:169c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16a0::,2804:16a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16a4::,2804:16a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16a8::,2804:16a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16b0::,2804:16b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16b4::,2804:16b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16b8::,2804:16b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16bc::,2804:16bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16c0::,2804:16c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16c4::,2804:16c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16c8::,2804:16c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16cc::,2804:16cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16d0::,2804:16d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16d4::,2804:16d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16d8::,2804:16d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16dc::,2804:16dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16e0::,2804:16e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16e4::,2804:16e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16e8::,2804:16e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16ec::,2804:16ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16f0::,2804:16f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16f4::,2804:16f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16f8::,2804:16f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:16fc::,2804:16fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1700::,2804:1700:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1704::,2804:1704:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1708::,2804:1708:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:170c::,2804:170c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1710::,2804:1710:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1714::,2804:1714:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1718::,2804:1718:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:171c::,2804:171c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1720::,2804:1720:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1724::,2804:1724:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1728::,2804:1728:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:172c::,2804:172c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1730::,2804:1730:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1734::,2804:1734:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1738::,2804:1738:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:173c::,2804:173c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1740::,2804:1740:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1744::,2804:1744:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1748::,2804:1748:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:174c::,2804:174c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1750::,2804:1750:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1754::,2804:1754:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1758::,2804:1758:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:175c::,2804:175c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1760::,2804:1760:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1764::,2804:1764:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1768::,2804:1768:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:176c::,2804:176c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1770::,2804:1770:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1774::,2804:1774:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1778::,2804:1778:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:177c::,2804:177c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1780::,2804:1780:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1784::,2804:1784:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1788::,2804:1788:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:178c::,2804:178c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1790::,2804:1790:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1794::,2804:1794:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1798::,2804:1798:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:179c::,2804:179c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17a0::,2804:17a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17a4::,2804:17a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17a8::,2804:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17ac::,2804:17ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17b0::,2804:17b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17b4::,2804:17b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17b8::,2804:17b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17bc::,2804:17bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17c0::,2804:17c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17c4::,2804:17c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17c8::,2804:17c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17cc::,2804:17cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17d0::,2804:17d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17d4::,2804:17d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17d8::,2804:17d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17dc::,2804:17dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17e0::,2804:17e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17e8::,2804:17e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17ec::,2804:17ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17f0::,2804:17f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17f4::,2804:17f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17f8::,2804:17f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:17fc::,2804:17fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1800::,2804:1800:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1804::,2804:1804:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1808::,2804:1808:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:180c::,2804:180c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1810::,2804:1810:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1814::,2804:1814:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1818::,2804:1818:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:181c::,2804:181c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1820::,2804:1820:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1824::,2804:1824:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1828::,2804:1828:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:182c::,2804:182c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1830::,2804:1830:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1834::,2804:1834:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1838::,2804:1838:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:183c::,2804:183c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1840::,2804:1840:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1844::,2804:1844:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1848::,2804:1848:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:184c::,2804:184c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1850::,2804:1850:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1854::,2804:1854:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1858::,2804:1858:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:185c::,2804:185c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1864::,2804:1864:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1868::,2804:1868:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:186c::,2804:186c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1870::,2804:1870:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1874::,2804:1874:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1878::,2804:1878:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:187c::,2804:187c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1880::,2804:1880:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1884::,2804:1884:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1888::,2804:1888:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:188c::,2804:188c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1890::,2804:1890:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1894::,2804:1894:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1898::,2804:1898:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:189c::,2804:189c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18a0::,2804:18a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18a4::,2804:18a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18a8::,2804:18a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18ac::,2804:18ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18b0::,2804:18b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18b4::,2804:18b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18b8::,2804:18b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18bc::,2804:18bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18c0::,2804:18c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18c4::,2804:18c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18c8::,2804:18c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18cc::,2804:18cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18d0::,2804:18d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18d4::,2804:18d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18d8::,2804:18d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18dc::,2804:18dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18e0::,2804:18e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18e4::,2804:18e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18e8::,2804:18e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18ec::,2804:18ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18f0::,2804:18f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18f4::,2804:18f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18f8::,2804:18f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:18fc::,2804:18fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1900::,2804:1900:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1904::,2804:1904:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1908::,2804:1908:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:190c::,2804:190c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1910::,2804:1910:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1914::,2804:1914:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1918::,2804:1918:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:191c::,2804:191c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1920::,2804:1920:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1924::,2804:1924:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1928::,2804:1928:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:192c::,2804:192c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1930::,2804:1930:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1934::,2804:1934:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1938::,2804:1938:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1940::,2804:1940:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1948::,2804:1948:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:194c::,2804:194c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1950::,2804:1950:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1954::,2804:1954:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1958::,2804:1958:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:195c::,2804:195c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1960::,2804:1960:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1964::,2804:1964:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1968::,2804:1968:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:196c::,2804:196c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1970::,2804:1970:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1974::,2804:1974:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1978::,2804:1978:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:197c::,2804:197c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1980::,2804:1980:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1984::,2804:1984:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1988::,2804:1988:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:198c::,2804:198c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1990::,2804:1990:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1994::,2804:1994:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1998::,2804:1998:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:199c::,2804:199c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19a0::,2804:19a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19a4::,2804:19a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19a8::,2804:19a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19ac::,2804:19ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19b0::,2804:19b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19b4::,2804:19b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19b8::,2804:19b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19c0::,2804:19c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19c4::,2804:19c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19c8::,2804:19c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19cc::,2804:19cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19d0::,2804:19d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19d4::,2804:19d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19d8::,2804:19d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19dc::,2804:19dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19e0::,2804:19e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19e4::,2804:19e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19e8::,2804:19e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19ec::,2804:19ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19f0::,2804:19f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19f4::,2804:19f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19f8::,2804:19f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:19fc::,2804:19fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a00::,2804:1a00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a04::,2804:1a04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a08::,2804:1a08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a0c::,2804:1a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a10::,2804:1a10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a14::,2804:1a14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a18::,2804:1a18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a1c::,2804:1a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a20::,2804:1a20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a24::,2804:1a24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a28::,2804:1a28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a2c::,2804:1a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a30::,2804:1a30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a34::,2804:1a34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a38::,2804:1a38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a3c::,2804:1a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a40::,2804:1a40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a44::,2804:1a44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a48::,2804:1a48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a4c::,2804:1a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a50::,2804:1a50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a54::,2804:1a54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a58::,2804:1a58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a5c::,2804:1a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a60::,2804:1a60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a64::,2804:1a64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a68::,2804:1a68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a6c::,2804:1a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a70::,2804:1a70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a74::,2804:1a74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a7c::,2804:1a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a80::,2804:1a80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a84::,2804:1a84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a88::,2804:1a88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a8c::,2804:1a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a90::,2804:1a90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a94::,2804:1a94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a98::,2804:1a98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1a9c::,2804:1a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1aa0::,2804:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1aa4::,2804:1aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1aa8::,2804:1aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ab0::,2804:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ab4::,2804:1ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ab8::,2804:1ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1abc::,2804:1abc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ac0::,2804:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ac4::,2804:1ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ac8::,2804:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1acc::,2804:1acc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ad0::,2804:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ad4::,2804:1ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ad8::,2804:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1adc::,2804:1adc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ae0::,2804:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ae4::,2804:1ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ae8::,2804:1ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1aec::,2804:1aec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1af0::,2804:1af0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1af4::,2804:1af4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1af8::,2804:1af8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1afc::,2804:1afc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b00::,2804:1b00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b04::,2804:1b04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b08::,2804:1b08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b0c::,2804:1b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b10::,2804:1b10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b14::,2804:1b14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b18::,2804:1b18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b1c::,2804:1b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b20::,2804:1b20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b24::,2804:1b24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b28::,2804:1b28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b2c::,2804:1b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b30::,2804:1b30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b34::,2804:1b34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b3c::,2804:1b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b40::,2804:1b40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b44::,2804:1b44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b48::,2804:1b48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b4c::,2804:1b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b50::,2804:1b50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b54::,2804:1b54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b58::,2804:1b58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b5c::,2804:1b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b60::,2804:1b60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b64::,2804:1b64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b68::,2804:1b68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b6c::,2804:1b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b70::,2804:1b70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b74::,2804:1b74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b78::,2804:1b78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b7c::,2804:1b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b80::,2804:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b84::,2804:1b84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b8c::,2804:1b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b90::,2804:1b90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b94::,2804:1b94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1b9c::,2804:1b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ba0::,2804:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ba4::,2804:1ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ba8::,2804:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bac::,2804:1bac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bb0::,2804:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bb4::,2804:1bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bb8::,2804:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bbc::,2804:1bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bc4::,2804:1bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bc8::,2804:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bcc::,2804:1bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bd0::,2804:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bd4::,2804:1bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bd8::,2804:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bdc::,2804:1bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1be0::,2804:1be0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1be4::,2804:1be4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1be8::,2804:1be8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bec::,2804:1bec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bf0::,2804:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bf4::,2804:1bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bf8::,2804:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1bfc::,2804:1bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c00::,2804:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c04::,2804:1c04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c08::,2804:1c08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c0c::,2804:1c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c10::,2804:1c10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c14::,2804:1c14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c18::,2804:1c18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c1c::,2804:1c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c20::,2804:1c20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c24::,2804:1c24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c28::,2804:1c28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c2c::,2804:1c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c30::,2804:1c30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c34::,2804:1c34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c38::,2804:1c38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c3c::,2804:1c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c40::,2804:1c40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c44::,2804:1c44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c48::,2804:1c48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c4c::,2804:1c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c50::,2804:1c50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c54::,2804:1c54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c5c::,2804:1c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c60::,2804:1c60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c64::,2804:1c64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c68::,2804:1c68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c6c::,2804:1c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c70::,2804:1c70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c74::,2804:1c74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c78::,2804:1c78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c7c::,2804:1c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c80::,2804:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c84::,2804:1c84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c88::,2804:1c88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c8c::,2804:1c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c90::,2804:1c90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c94::,2804:1c94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c98::,2804:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1c9c::,2804:1c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ca0::,2804:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ca4::,2804:1ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ca8::,2804:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cac::,2804:1cac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cb0::,2804:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cb4::,2804:1cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cb8::,2804:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cbc::,2804:1cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cc0::,2804:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cc4::,2804:1cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cc8::,2804:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ccc::,2804:1ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cd0::,2804:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cd4::,2804:1cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cd8::,2804:1cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cdc::,2804:1cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ce0::,2804:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ce4::,2804:1ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cec::,2804:1cec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cf0::,2804:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cf4::,2804:1cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cf8::,2804:1cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1cfc::,2804:1cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d00::,2804:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d04::,2804:1d04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d08::,2804:1d08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d0c::,2804:1d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d10::,2804:1d10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d14::,2804:1d14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d18::,2804:1d18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d1c::,2804:1d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d20::,2804:1d20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d24::,2804:1d24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d28::,2804:1d28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d2c::,2804:1d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d30::,2804:1d30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d34::,2804:1d34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d38::,2804:1d38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d3c::,2804:1d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d40::,2804:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d48::,2804:1d48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d4c::,2804:1d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d50::,2804:1d50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d58::,2804:1d58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d5c::,2804:1d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d60::,2804:1d60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d64::,2804:1d64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d68::,2804:1d68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d6c::,2804:1d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d70::,2804:1d70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d74::,2804:1d74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d7c::,2804:1d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d80::,2804:1d80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d84::,2804:1d84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d8c::,2804:1d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d90::,2804:1d90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d94::,2804:1d94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d98::,2804:1d98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1d9c::,2804:1d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1da0::,2804:1da0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1da4::,2804:1da4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1da8::,2804:1da8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dac::,2804:1dac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1db0::,2804:1db0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1db4::,2804:1db4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1db8::,2804:1db8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dbc::,2804:1dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dc0::,2804:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dc4::,2804:1dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dc8::,2804:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dcc::,2804:1dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dd0::,2804:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dd4::,2804:1dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dd8::,2804:1dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ddc::,2804:1ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1de0::,2804:1de0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1de4::,2804:1de4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1de8::,2804:1de8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dec::,2804:1dec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1df0::,2804:1df0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1df4::,2804:1df4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1df8::,2804:1df8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1dfc::,2804:1dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e00::,2804:1e00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e04::,2804:1e04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e08::,2804:1e08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e0c::,2804:1e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e10::,2804:1e10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e14::,2804:1e14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e18::,2804:1e18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e20::,2804:1e20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e24::,2804:1e24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e28::,2804:1e28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e2c::,2804:1e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e30::,2804:1e30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e34::,2804:1e34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e38::,2804:1e38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e3c::,2804:1e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e40::,2804:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e44::,2804:1e44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e48::,2804:1e48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e4c::,2804:1e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e50::,2804:1e50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e54::,2804:1e54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e58::,2804:1e58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e5c::,2804:1e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e60::,2804:1e60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e64::,2804:1e64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e68::,2804:1e68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e6c::,2804:1e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e70::,2804:1e70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e74::,2804:1e74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e78::,2804:1e78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e7c::,2804:1e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e84::,2804:1e84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e88::,2804:1e88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e8c::,2804:1e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e90::,2804:1e90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e94::,2804:1e94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e98::,2804:1e98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1e9c::,2804:1e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ea0::,2804:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ea4::,2804:1ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ea8::,2804:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1eac::,2804:1eac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1eb0::,2804:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1eb8::,2804:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ebc::,2804:1ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ec0::,2804:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ec4::,2804:1ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ec8::,2804:1ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ecc::,2804:1ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ed0::,2804:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ed4::,2804:1ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ed8::,2804:1ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1edc::,2804:1edc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ee0::,2804:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ee4::,2804:1ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ee8::,2804:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1eec::,2804:1eec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ef0::,2804:1ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ef4::,2804:1ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1ef8::,2804:1ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1efc::,2804:1efc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f00::,2804:1f00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f02::,2804:1f02:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f04::,2804:1f04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f0a::,2804:1f0a:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f0e::,2804:1f0e:1fff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f10::,2804:1f10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f12::,2804:1f12:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f14::,2804:1f14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f16::,2804:1f16:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f18::,2804:1f18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f1a::,2804:1f1a:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f1c::,2804:1f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f1e::,2804:1f1e:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f20::,2804:1f20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f22::,2804:1f22:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f24::,2804:1f24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f26::,2804:1f26:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f28::,2804:1f28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f2a::,2804:1f2a:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f2c::,2804:1f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f2e::,2804:1f2e:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f30::,2804:1f30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:1f32::,2804:1f32:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:200c::,2804:200c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2010::,2804:2010:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2014::,2804:2014:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2018::,2804:2018:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:201c::,2804:201c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2020::,2804:2020:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2024::,2804:2024:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2028::,2804:2028:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:202c::,2804:202c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2030::,2804:2030:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2034::,2804:2034:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2038::,2804:2038:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:203c::,2804:203c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2040::,2804:2040:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2044::,2804:2044:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2048::,2804:2048:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:204c::,2804:204c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2050::,2804:2050:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2054::,2804:2054:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2058::,2804:2058:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:205c::,2804:205c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2060::,2804:2060:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2064::,2804:2064:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2068::,2804:2068:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:206c::,2804:206c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2070::,2804:2070:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2074::,2804:2074:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2078::,2804:2078:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:207c::,2804:207c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2080::,2804:2080:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2084::,2804:2084:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2088::,2804:2088:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:208c::,2804:208c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2090::,2804:2090:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2094::,2804:2094:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2098::,2804:2098:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20a0::,2804:20a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20a4::,2804:20a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20a8::,2804:20a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20b0::,2804:20b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20b4::,2804:20b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20b8::,2804:20b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20bc::,2804:20bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20c0::,2804:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20c4::,2804:20c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20c8::,2804:20c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20cc::,2804:20cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20d0::,2804:20d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20d4::,2804:20d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20d8::,2804:20d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20dc::,2804:20dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20e0::,2804:20e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20e4::,2804:20e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20e8::,2804:20e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20ec::,2804:20ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20f0::,2804:20f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20f4::,2804:20f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20f8::,2804:20f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:20fc::,2804:20fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2100::,2804:2100:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2104::,2804:2104:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2108::,2804:2108:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:210c::,2804:210c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2110::,2804:2110:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2114::,2804:2114:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2118::,2804:2118:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:211c::,2804:211c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2120::,2804:2120:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2124::,2804:2124:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2128::,2804:2128:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:212c::,2804:212c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2130::,2804:2130:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2134::,2804:2134:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2138::,2804:2138:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:213c::,2804:213c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2140::,2804:2140:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2144::,2804:2144:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2148::,2804:2148:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:214c::,2804:214c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2150::,2804:2150:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2154::,2804:2154:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2158::,2804:2158:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:215c::,2804:215c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2160::,2804:2160:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2164::,2804:2164:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2168::,2804:2168:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:216c::,2804:216c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2170::,2804:2170:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2174::,2804:2174:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2178::,2804:2178:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:217c::,2804:217c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2180::,2804:2180:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2184::,2804:2184:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2188::,2804:2188:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:218c::,2804:218c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2190::,2804:2190:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2198::,2804:2198:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:219c::,2804:219c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21a0::,2804:21a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21a4::,2804:21a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21a8::,2804:21a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21ac::,2804:21ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21b0::,2804:21b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21b4::,2804:21b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21b8::,2804:21b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21bc::,2804:21bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21c0::,2804:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21c4::,2804:21c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21c8::,2804:21c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21cc::,2804:21cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21d0::,2804:21d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21d4::,2804:21d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21d8::,2804:21d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21dc::,2804:21dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21e0::,2804:21e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21e4::,2804:21e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21e8::,2804:21e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21ec::,2804:21ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21f0::,2804:21f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21f4::,2804:21f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21f8::,2804:21f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:21fc::,2804:21fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2200::,2804:2200:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2204::,2804:2204:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2208::,2804:2208:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2210::,2804:2210:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2214::,2804:2214:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2218::,2804:2218:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:221c::,2804:221c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2220::,2804:2220:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2224::,2804:2224:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2228::,2804:2228:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:222c::,2804:222c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2230::,2804:2230:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2234::,2804:2234:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2238::,2804:2238:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:223c::,2804:223c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2240::,2804:2240:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2248::,2804:2248:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:224c::,2804:224c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2250::,2804:2250:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2254::,2804:2254:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2258::,2804:2258:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:225c::,2804:225c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2260::,2804:2260:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2264::,2804:2264:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2268::,2804:2268:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2270::,2804:2270:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2274::,2804:2274:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2278::,2804:2278:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:227c::,2804:227c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2284::,2804:2284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2288::,2804:2288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:228c::,2804:228c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2290::,2804:2290:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2298::,2804:2298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:229c::,2804:229c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22a0::,2804:22a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22a4::,2804:22a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22a8::,2804:22a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22b0::,2804:22b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22b4::,2804:22b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22b8::,2804:22b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22bc::,2804:22bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22c0::,2804:22c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22c4::,2804:22c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22cc::,2804:22cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22d0::,2804:22d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22d4::,2804:22d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22d8::,2804:22d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22dc::,2804:22dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22e0::,2804:22e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22e4::,2804:22e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22e8::,2804:22e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22ec::,2804:22ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22f4::,2804:22f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22f8::,2804:22f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:22fc::,2804:22fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2300::,2804:2300:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2304::,2804:2304:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2308::,2804:2308:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:230c::,2804:230c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2310::,2804:2310:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2314::,2804:2314:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:231c::,2804:231c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2320::,2804:2320:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2324::,2804:2324:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2328::,2804:2328:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:232c::,2804:232c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2330::,2804:2330:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2334::,2804:2334:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2338::,2804:2338:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:233c::,2804:233c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2340::,2804:2340:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2344::,2804:2344:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2348::,2804:2348:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:234c::,2804:234c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2350::,2804:2350:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2354::,2804:2354:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2358::,2804:2358:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:235c::,2804:235c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2360::,2804:2360:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2364::,2804:2364:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2368::,2804:2368:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:236c::,2804:236c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2370::,2804:2370:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2374::,2804:2374:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2378::,2804:2378:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:237c::,2804:237c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2380::,2804:2380:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2384::,2804:2384:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2388::,2804:2388:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:238c::,2804:238c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2390::,2804:2390:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2394::,2804:2394:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2398::,2804:2398:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:239c::,2804:239c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23a0::,2804:23a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23a4::,2804:23a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23a8::,2804:23a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23ac::,2804:23ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23b0::,2804:23b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23b4::,2804:23b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23b8::,2804:23b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23bc::,2804:23bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23c0::,2804:23c1:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23c4::,2804:23c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23c8::,2804:23c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23d4::,2804:23d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23d8::,2804:23d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23dc::,2804:23dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23e0::,2804:23e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23e4::,2804:23e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23e8::,2804:23e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23ec::,2804:23ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23f0::,2804:23f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23f4::,2804:23f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23f8::,2804:23f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:23fc::,2804:23fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2400::,2804:2400:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2404::,2804:2404:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2408::,2804:2408:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:240c::,2804:240c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2414::,2804:2414:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2418::,2804:2418:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:241c::,2804:241c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2420::,2804:2420:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2424::,2804:2424:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2428::,2804:2428:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:242c::,2804:242c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2430::,2804:2430:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2434::,2804:2434:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2438::,2804:2438:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:243c::,2804:243c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2440::,2804:2440:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2444::,2804:2444:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2448::,2804:2448:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:244c::,2804:244c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2450::,2804:2450:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2454::,2804:2454:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2458::,2804:2458:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:245c::,2804:245c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2460::,2804:2460:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2464::,2804:2464:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2468::,2804:2468:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:246c::,2804:246c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2474::,2804:2474:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2478::,2804:2478:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:247c::,2804:247c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2480::,2804:2480:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2484::,2804:2484:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2488::,2804:2488:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:248c::,2804:248c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2490::,2804:2490:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2494::,2804:2494:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2498::,2804:2498:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:249c::,2804:249c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24a0::,2804:24a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24a4::,2804:24a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24a8::,2804:24a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24ac::,2804:24ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24b0::,2804:24b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24b4::,2804:24b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24b8::,2804:24b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24bc::,2804:24bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24c0::,2804:24c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24c4::,2804:24c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24c8::,2804:24c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24cc::,2804:24cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24d0::,2804:24d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24d4::,2804:24d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24d8::,2804:24d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24dc::,2804:24dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24e0::,2804:24e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24e4::,2804:24e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24e8::,2804:24e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24ec::,2804:24ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24f0::,2804:24f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24f4::,2804:24f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24f8::,2804:24f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:24fc::,2804:24fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2500::,2804:2500:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2504::,2804:2504:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2508::,2804:2508:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:250c::,2804:250c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2510::,2804:2510:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2514::,2804:2514:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2518::,2804:2518:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:251c::,2804:251c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2520::,2804:2520:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2524::,2804:2524:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2528::,2804:2528:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:252c::,2804:252c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2530::,2804:2530:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2534::,2804:2534:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2538::,2804:2538:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:253c::,2804:253c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2540::,2804:2540:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2544::,2804:2544:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2548::,2804:2548:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:254c::,2804:254c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2550::,2804:2550:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2554::,2804:2554:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2558::,2804:2558:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:255c::,2804:255c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2560::,2804:2560:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2564::,2804:2564:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2568::,2804:2568:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:256c::,2804:256c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2570::,2804:2570:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2574::,2804:2574:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2578::,2804:2578:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:257c::,2804:257c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2580::,2804:2580:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2584::,2804:2584:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2588::,2804:2588:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2590::,2804:2590:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2594::,2804:2594:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2598::,2804:2598:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:259c::,2804:259c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25a0::,2804:25a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25a4::,2804:25a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25a8::,2804:25a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25ac::,2804:25ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25b0::,2804:25b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25b4::,2804:25b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25b8::,2804:25b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25bc::,2804:25bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25c0::,2804:25c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25c4::,2804:25c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25c8::,2804:25c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25cc::,2804:25cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25d0::,2804:25d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25d4::,2804:25d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25d8::,2804:25d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25e0::,2804:25e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25e4::,2804:25e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25e8::,2804:25e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25ec::,2804:25ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25f0::,2804:25f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25f4::,2804:25f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25f8::,2804:25f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:25fc::,2804:25fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2600::,2804:2600:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2604::,2804:2604:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2608::,2804:2608:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:260c::,2804:260c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2610::,2804:2610:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2614::,2804:2614:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2618::,2804:2618:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:261c::,2804:261c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2620::,2804:2620:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2624::,2804:2624:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2628::,2804:2628:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:262c::,2804:262c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2630::,2804:2630:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2634::,2804:2634:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2638::,2804:2638:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:263c::,2804:263c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2640::,2804:2640:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2644::,2804:2644:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2648::,2804:2648:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:264c::,2804:264c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2650::,2804:2650:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2654::,2804:2654:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2658::,2804:2658:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:265c::,2804:265c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2660::,2804:2660:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2664::,2804:2664:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2668::,2804:2668:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:266c::,2804:266c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2670::,2804:2670:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2674::,2804:2674:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2678::,2804:2678:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:267c::,2804:267c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2680::,2804:2680:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2684::,2804:2684:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2688::,2804:2688:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:268c::,2804:268c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2690::,2804:2690:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2694::,2804:2694:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2698::,2804:2698:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:269c::,2804:269c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26a0::,2804:26a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26a4::,2804:26a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26a8::,2804:26a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26ac::,2804:26ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26b0::,2804:26b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26b8::,2804:26b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26bc::,2804:26bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26c0::,2804:26c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26c4::,2804:26c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26c8::,2804:26c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26cc::,2804:26cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26d0::,2804:26d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26d4::,2804:26d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26d8::,2804:26d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26dc::,2804:26dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26e0::,2804:26e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26e4::,2804:26e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26e8::,2804:26e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26ec::,2804:26ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26f0::,2804:26f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26f4::,2804:26f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26f8::,2804:26f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:26fc::,2804:26fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2700::,2804:2700:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2704::,2804:2704:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:270c::,2804:270c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2710::,2804:2710:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2714::,2804:2714:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:271c::,2804:271c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2720::,2804:2720:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2724::,2804:2724:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2728::,2804:2728:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:272c::,2804:272c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2730::,2804:2730:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2734::,2804:2734:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2738::,2804:2738:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:273c::,2804:273c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2740::,2804:2740:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2744::,2804:2744:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2748::,2804:2748:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:274c::,2804:274c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2750::,2804:2750:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2754::,2804:2754:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2758::,2804:2758:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:275c::,2804:275c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2760::,2804:2760:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2764::,2804:2764:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2768::,2804:2768:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:276c::,2804:276c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2774::,2804:2774:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2778::,2804:2778:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:277c::,2804:277c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2780::,2804:2780:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2784::,2804:2784:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2788::,2804:2788:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:278c::,2804:278c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2790::,2804:2790:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2794::,2804:2794:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2798::,2804:2798:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:279c::,2804:279c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27a0::,2804:27a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27a4::,2804:27a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27a8::,2804:27a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27ac::,2804:27ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27b0::,2804:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27b4::,2804:27b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27b8::,2804:27b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27bc::,2804:27bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27c0::,2804:27c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27c4::,2804:27c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27c8::,2804:27c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27cc::,2804:27cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27d0::,2804:27d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27d4::,2804:27d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27d8::,2804:27d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27dc::,2804:27dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27e0::,2804:27e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27e4::,2804:27e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27e8::,2804:27e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27ec::,2804:27ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27f0::,2804:27f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27f4::,2804:27f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27f8::,2804:27f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:27fc::,2804:27fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2800::,2804:2800:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2804::,2804:2804:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2808::,2804:2808:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:280c::,2804:280c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2814::,2804:2814:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2818::,2804:2818:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:281c::,2804:281c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2820::,2804:2820:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2824::,2804:2824:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2828::,2804:2828:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:282c::,2804:282c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2830::,2804:2830:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2834::,2804:2834:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2838::,2804:2838:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:283c::,2804:283c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2840::,2804:2840:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2844::,2804:2844:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2848::,2804:2848:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:284c::,2804:284c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2850::,2804:2850:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2854::,2804:2854:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2858::,2804:2858:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:285c::,2804:285c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2860::,2804:2860:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2864::,2804:2864:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2868::,2804:2868:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:286c::,2804:286c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2870::,2804:2870:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2874::,2804:2874:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2878::,2804:2878:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:287c::,2804:287c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2880::,2804:2880:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2884::,2804:2884:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2888::,2804:2888:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:288c::,2804:288c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2890::,2804:2890:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2894::,2804:2894:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2898::,2804:2898:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:289c::,2804:289c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28a0::,2804:28a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28a4::,2804:28a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28a8::,2804:28a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28ac::,2804:28ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28b0::,2804:28b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28b4::,2804:28b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28b8::,2804:28b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28bc::,2804:28bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28c0::,2804:28c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28c4::,2804:28c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28c8::,2804:28c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28cc::,2804:28cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28d0::,2804:28d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28d4::,2804:28d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28d8::,2804:28d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28dc::,2804:28dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28e0::,2804:28e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28e4::,2804:28e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28e8::,2804:28e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28ec::,2804:28ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28f0::,2804:28f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28f4::,2804:28f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28f8::,2804:28f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:28fc::,2804:28fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2900::,2804:2900:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2904::,2804:2904:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2908::,2804:2908:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:290c::,2804:290c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2910::,2804:2910:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2914::,2804:2914:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2918::,2804:2918:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:291c::,2804:291c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2920::,2804:2920:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2924::,2804:2924:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2928::,2804:2928:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:292c::,2804:292c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2930::,2804:2930:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2934::,2804:2934:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2938::,2804:2938:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:293c::,2804:293c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2940::,2804:2940:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2944::,2804:2944:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2948::,2804:2948:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:294c::,2804:294c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2950::,2804:2950:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2954::,2804:2954:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2958::,2804:2958:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:295c::,2804:295c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2960::,2804:2960:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2964::,2804:2964:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2968::,2804:2968:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:296c::,2804:296c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2970::,2804:2970:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2974::,2804:2974:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2978::,2804:2978:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:297c::,2804:297c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2980::,2804:2980:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2984::,2804:2984:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2988::,2804:2988:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:298c::,2804:298c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2990::,2804:2990:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2994::,2804:2994:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2998::,2804:2998:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:299c::,2804:299c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29a0::,2804:29a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29a4::,2804:29a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29a8::,2804:29a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29ac::,2804:29ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29b0::,2804:29b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29b4::,2804:29b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29b8::,2804:29b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29bc::,2804:29bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29c0::,2804:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29c4::,2804:29c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29c8::,2804:29c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29cc::,2804:29cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29d0::,2804:29d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29dc::,2804:29dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29e0::,2804:29e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29e4::,2804:29e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29e8::,2804:29e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29ec::,2804:29ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29f0::,2804:29f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29f4::,2804:29f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29f8::,2804:29f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:29fc::,2804:29fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a00::,2804:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a04::,2804:2a04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a08::,2804:2a08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a0c::,2804:2a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a10::,2804:2a10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a14::,2804:2a14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a18::,2804:2a18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a1c::,2804:2a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a20::,2804:2a20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a24::,2804:2a24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a28::,2804:2a28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a2c::,2804:2a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a30::,2804:2a30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a34::,2804:2a34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a38::,2804:2a38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a3c::,2804:2a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a40::,2804:2a40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a44::,2804:2a44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a48::,2804:2a48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a4c::,2804:2a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a50::,2804:2a50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a54::,2804:2a54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a58::,2804:2a58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a5c::,2804:2a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a60::,2804:2a60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a64::,2804:2a64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a68::,2804:2a68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a6c::,2804:2a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a70::,2804:2a70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a74::,2804:2a74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a78::,2804:2a78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a7c::,2804:2a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a80::,2804:2a80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a84::,2804:2a84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a88::,2804:2a88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a8c::,2804:2a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a90::,2804:2a90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a94::,2804:2a94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a98::,2804:2a98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2a9c::,2804:2a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2aa0::,2804:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2aa4::,2804:2aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2aa8::,2804:2aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2aac::,2804:2aac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ab0::,2804:2ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ab4::,2804:2ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ab8::,2804:2ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2abc::,2804:2abc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ac0::,2804:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ac4::,2804:2ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ac8::,2804:2ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2acc::,2804:2acc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ad0::,2804:2ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ad4::,2804:2ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ad8::,2804:2ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2adc::,2804:2adc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ae0::,2804:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ae4::,2804:2ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ae8::,2804:2ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2aec::,2804:2aec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2af0::,2804:2af0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2af4::,2804:2af4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2af8::,2804:2af8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2afc::,2804:2afc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b00::,2804:2b00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b04::,2804:2b04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b08::,2804:2b08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b0c::,2804:2b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b10::,2804:2b10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b14::,2804:2b14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b18::,2804:2b18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b1c::,2804:2b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b20::,2804:2b20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b24::,2804:2b24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b28::,2804:2b28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b2c::,2804:2b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b30::,2804:2b30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b34::,2804:2b34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b38::,2804:2b38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b3c::,2804:2b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b40::,2804:2b40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b44::,2804:2b44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b48::,2804:2b48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b4c::,2804:2b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b50::,2804:2b50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b54::,2804:2b54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b58::,2804:2b58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b5c::,2804:2b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b60::,2804:2b60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b64::,2804:2b64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b68::,2804:2b68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b6c::,2804:2b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b70::,2804:2b70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b74::,2804:2b74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b78::,2804:2b78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b7c::,2804:2b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b80::,2804:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b84::,2804:2b84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b88::,2804:2b88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b8c::,2804:2b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b90::,2804:2b90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b94::,2804:2b94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b98::,2804:2b98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2b9c::,2804:2b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ba0::,2804:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ba4::,2804:2ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ba8::,2804:2ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bac::,2804:2bac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bb0::,2804:2bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bb4::,2804:2bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bb8::,2804:2bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bbc::,2804:2bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bc0::,2804:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bc4::,2804:2bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bc8::,2804:2bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bcc::,2804:2bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bd0::,2804:2bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bd4::,2804:2bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bd8::,2804:2bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bdc::,2804:2bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2be0::,2804:2be0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2be4::,2804:2be4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2be8::,2804:2be8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bec::,2804:2bec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bf0::,2804:2bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bf4::,2804:2bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bf8::,2804:2bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2bfc::,2804:2bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c00::,2804:2c00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c04::,2804:2c04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c08::,2804:2c08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c0c::,2804:2c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c10::,2804:2c10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c14::,2804:2c14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c18::,2804:2c18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c20::,2804:2c20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c24::,2804:2c24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c28::,2804:2c28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c2c::,2804:2c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c30::,2804:2c30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c34::,2804:2c34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c38::,2804:2c38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c3c::,2804:2c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c40::,2804:2c40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c44::,2804:2c44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c48::,2804:2c48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c4c::,2804:2c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c50::,2804:2c50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c54::,2804:2c54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c58::,2804:2c58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c5c::,2804:2c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c60::,2804:2c60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c64::,2804:2c64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c68::,2804:2c68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c6c::,2804:2c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c70::,2804:2c70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c74::,2804:2c74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c78::,2804:2c78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c7c::,2804:2c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c80::,2804:2c80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c84::,2804:2c84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c88::,2804:2c88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c8c::,2804:2c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c90::,2804:2c90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c94::,2804:2c94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c98::,2804:2c98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2c9c::,2804:2c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ca0::,2804:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ca4::,2804:2ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ca8::,2804:2ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cac::,2804:2cac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cb0::,2804:2cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cb4::,2804:2cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cb8::,2804:2cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cbc::,2804:2cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cc0::,2804:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cc4::,2804:2cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cc8::,2804:2cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ccc::,2804:2ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cd0::,2804:2cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cd4::,2804:2cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cd8::,2804:2cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cdc::,2804:2cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ce0::,2804:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ce4::,2804:2ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ce8::,2804:2ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cec::,2804:2cec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cf0::,2804:2cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cf4::,2804:2cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cf8::,2804:2cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2cfc::,2804:2cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d00::,2804:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d04::,2804:2d04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d08::,2804:2d08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d0c::,2804:2d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d10::,2804:2d10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d14::,2804:2d14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d18::,2804:2d18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d1c::,2804:2d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d20::,2804:2d20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d24::,2804:2d24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d28::,2804:2d28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d2c::,2804:2d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d30::,2804:2d30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d34::,2804:2d34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d38::,2804:2d38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d3c::,2804:2d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d40::,2804:2d40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d44::,2804:2d44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d48::,2804:2d48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d4c::,2804:2d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d50::,2804:2d50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d54::,2804:2d54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d58::,2804:2d58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d5c::,2804:2d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d60::,2804:2d60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d64::,2804:2d64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d68::,2804:2d68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d6c::,2804:2d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d70::,2804:2d70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d74::,2804:2d74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d78::,2804:2d78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d7c::,2804:2d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d80::,2804:2d80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d84::,2804:2d84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d88::,2804:2d88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d8c::,2804:2d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d90::,2804:2d90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d94::,2804:2d94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d98::,2804:2d98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2d9c::,2804:2d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2da0::,2804:2da0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2da4::,2804:2da4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2da8::,2804:2da8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dac::,2804:2dac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2db0::,2804:2db0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2db4::,2804:2db4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2db8::,2804:2db8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dbc::,2804:2dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dc0::,2804:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dc4::,2804:2dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dc8::,2804:2dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dcc::,2804:2dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dd0::,2804:2dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dd4::,2804:2dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dd8::,2804:2dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ddc::,2804:2ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2de0::,2804:2de0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2de4::,2804:2de4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2de8::,2804:2de8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dec::,2804:2dec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2df0::,2804:2df0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2df4::,2804:2df4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2df8::,2804:2df8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2dfc::,2804:2dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e00::,2804:2e00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e04::,2804:2e04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e08::,2804:2e08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e0c::,2804:2e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e10::,2804:2e10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e14::,2804:2e14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e18::,2804:2e18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e1c::,2804:2e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e20::,2804:2e20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e24::,2804:2e24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e28::,2804:2e28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e2c::,2804:2e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e30::,2804:2e30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e34::,2804:2e34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e38::,2804:2e38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e3c::,2804:2e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e40::,2804:2e40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e44::,2804:2e44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e48::,2804:2e48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e4c::,2804:2e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e50::,2804:2e50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e54::,2804:2e54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e58::,2804:2e58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e5c::,2804:2e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e60::,2804:2e60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e64::,2804:2e64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e68::,2804:2e68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e6c::,2804:2e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e70::,2804:2e70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e74::,2804:2e74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e78::,2804:2e78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e7c::,2804:2e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e80::,2804:2e80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e84::,2804:2e84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e88::,2804:2e88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e8c::,2804:2e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e90::,2804:2e90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e94::,2804:2e94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e98::,2804:2e98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2e9c::,2804:2e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ea0::,2804:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ea4::,2804:2ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ea8::,2804:2ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2eac::,2804:2eac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2eb0::,2804:2eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2eb4::,2804:2eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2eb8::,2804:2eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ebc::,2804:2ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ec0::,2804:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ec4::,2804:2ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ec8::,2804:2ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ecc::,2804:2ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ed0::,2804:2ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ed4::,2804:2ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ed8::,2804:2ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2edc::,2804:2edc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ee0::,2804:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ee4::,2804:2ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ee8::,2804:2ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2eec::,2804:2eec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ef0::,2804:2ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ef4::,2804:2ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ef8::,2804:2ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2efc::,2804:2efc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f00::,2804:2f00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f04::,2804:2f04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f08::,2804:2f08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f0c::,2804:2f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f10::,2804:2f10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f14::,2804:2f14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f18::,2804:2f18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f1c::,2804:2f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f20::,2804:2f20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f24::,2804:2f24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f28::,2804:2f28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f2c::,2804:2f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f30::,2804:2f30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f34::,2804:2f34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f38::,2804:2f38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f3c::,2804:2f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f40::,2804:2f40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f44::,2804:2f44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f48::,2804:2f48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f4c::,2804:2f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f50::,2804:2f50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f54::,2804:2f54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f58::,2804:2f58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f5c::,2804:2f5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f60::,2804:2f60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f64::,2804:2f64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f68::,2804:2f68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f6c::,2804:2f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f70::,2804:2f70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f74::,2804:2f74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f78::,2804:2f78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f7c::,2804:2f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f80::,2804:2f80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f84::,2804:2f84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f88::,2804:2f88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f8c::,2804:2f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f90::,2804:2f90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f94::,2804:2f94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f98::,2804:2f98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2f9c::,2804:2f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fa0::,2804:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fa4::,2804:2fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fa8::,2804:2fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fac::,2804:2fac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fb0::,2804:2fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fb4::,2804:2fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fb8::,2804:2fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fbc::,2804:2fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fc0::,2804:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fc4::,2804:2fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fc8::,2804:2fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fcc::,2804:2fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fd0::,2804:2fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fd4::,2804:2fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fd8::,2804:2fd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fdc::,2804:2fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fe0::,2804:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fe4::,2804:2fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fe8::,2804:2fe8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2fec::,2804:2fec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ff0::,2804:2ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ff4::,2804:2ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ff8::,2804:2ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:2ffc::,2804:2ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3000::,2804:3000:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3004::,2804:3004:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3008::,2804:3008:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:300c::,2804:300c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3010::,2804:3010:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3014::,2804:3014:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3018::,2804:3018:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:301c::,2804:301c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3020::,2804:3020:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3024::,2804:3024:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3028::,2804:3028:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:302c::,2804:302c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3030::,2804:3030:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3034::,2804:3034:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3038::,2804:3038:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:303c::,2804:303c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3040::,2804:3040:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3044::,2804:3044:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3048::,2804:3048:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:304c::,2804:304c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3050::,2804:3050:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3054::,2804:3054:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3058::,2804:3058:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:305c::,2804:305c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3060::,2804:3060:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3064::,2804:3064:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3068::,2804:3068:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:306c::,2804:306c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3070::,2804:3070:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3074::,2804:3074:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3078::,2804:3078:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:307c::,2804:307c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3080::,2804:3080:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3084::,2804:3084:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3088::,2804:3088:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:308c::,2804:308c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3090::,2804:3090:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3094::,2804:3094:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3098::,2804:3098:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:309c::,2804:309c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30a0::,2804:30a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30a4::,2804:30a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30a8::,2804:30a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30ac::,2804:30ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30b0::,2804:30b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30b4::,2804:30b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30b8::,2804:30b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30bc::,2804:30bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30c0::,2804:30c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30c4::,2804:30c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30c8::,2804:30c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30cc::,2804:30cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30d0::,2804:30d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30d4::,2804:30d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30d8::,2804:30d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30dc::,2804:30dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30e0::,2804:30e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30e4::,2804:30e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30e8::,2804:30e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30ec::,2804:30ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30f0::,2804:30f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30f4::,2804:30f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30f8::,2804:30f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:30fc::,2804:30fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3100::,2804:3100:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3104::,2804:3104:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3108::,2804:3108:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:310c::,2804:310c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3110::,2804:3110:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3114::,2804:3114:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3118::,2804:3118:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:311c::,2804:311c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3120::,2804:3120:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3124::,2804:3124:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3128::,2804:3128:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:312c::,2804:312c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3130::,2804:3130:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3134::,2804:3134:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3138::,2804:3138:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:313c::,2804:313c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3140::,2804:3140:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3144::,2804:3144:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3148::,2804:3148:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:314c::,2804:314c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3150::,2804:3150:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3154::,2804:3154:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3158::,2804:3158:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:315c::,2804:315c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3160::,2804:3160:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3164::,2804:3164:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3168::,2804:3168:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:316c::,2804:316c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3170::,2804:3170:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3174::,2804:3174:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3178::,2804:3178:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:317c::,2804:317c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3180::,2804:3180:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3184::,2804:3184:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3188::,2804:3188:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:318c::,2804:318c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3190::,2804:3190:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3194::,2804:3194:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3198::,2804:3198:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:319c::,2804:319c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31a0::,2804:31a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31a4::,2804:31a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31a8::,2804:31a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31ac::,2804:31ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31b0::,2804:31b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31b4::,2804:31b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31b8::,2804:31b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31bc::,2804:31bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31c0::,2804:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31c4::,2804:31c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31c8::,2804:31c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31cc::,2804:31cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31d0::,2804:31d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31d4::,2804:31d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31d8::,2804:31d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31dc::,2804:31dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31e0::,2804:31e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31e4::,2804:31e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31e8::,2804:31e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31ec::,2804:31ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31f0::,2804:31f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31f4::,2804:31f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31f8::,2804:31f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:31fc::,2804:31fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3200::,2804:3200:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3204::,2804:3204:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3208::,2804:3208:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:320c::,2804:320c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3210::,2804:3210:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3214::,2804:3214:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3218::,2804:3218:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:321c::,2804:321c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3220::,2804:3220:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3224::,2804:3224:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3228::,2804:3228:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:322c::,2804:322c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3230::,2804:3230:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3234::,2804:3234:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3238::,2804:3238:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:323c::,2804:323c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3240::,2804:3240:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3244::,2804:3244:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3248::,2804:3248:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:324c::,2804:324c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3250::,2804:3250:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3254::,2804:3254:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3258::,2804:3258:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:325c::,2804:325c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3260::,2804:3260:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3264::,2804:3264:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3268::,2804:3268:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:326c::,2804:326c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3270::,2804:3270:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3274::,2804:3274:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3278::,2804:3278:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:327c::,2804:327c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3280::,2804:3280:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3284::,2804:3284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3288::,2804:3288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:328c::,2804:328c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3290::,2804:3290:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3294::,2804:3294:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3298::,2804:3298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:329c::,2804:329c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32a0::,2804:32a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32a4::,2804:32a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32a8::,2804:32a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32ac::,2804:32ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32b0::,2804:32b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32b4::,2804:32b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32b8::,2804:32b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32bc::,2804:32bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32c0::,2804:32c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32c4::,2804:32c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32c8::,2804:32c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32cc::,2804:32cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32d0::,2804:32d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32d4::,2804:32d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32d8::,2804:32d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32dc::,2804:32dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32e0::,2804:32e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32e4::,2804:32e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32e8::,2804:32e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32ec::,2804:32ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32f0::,2804:32f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32f4::,2804:32f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32f8::,2804:32f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:32fc::,2804:32fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3300::,2804:3300:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3304::,2804:3304:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3308::,2804:3308:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:330c::,2804:330c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3310::,2804:3310:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3314::,2804:3314:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3318::,2804:3318:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:331c::,2804:331c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3320::,2804:3320:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3324::,2804:3324:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3328::,2804:3328:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:332c::,2804:332c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3330::,2804:3330:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3334::,2804:3334:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3338::,2804:3338:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:333c::,2804:333c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3340::,2804:3340:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3344::,2804:3344:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3348::,2804:3348:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:334c::,2804:334c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3350::,2804:3350:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3354::,2804:3354:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3358::,2804:3358:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:335c::,2804:335c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3360::,2804:3360:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3364::,2804:3364:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3368::,2804:3368:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:336c::,2804:336c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3370::,2804:3370:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3374::,2804:3374:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3378::,2804:3378:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:337c::,2804:337c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3380::,2804:3380:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3384::,2804:3384:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3388::,2804:3388:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:338c::,2804:338c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3390::,2804:3390:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3394::,2804:3394:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3398::,2804:3398:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:339c::,2804:339c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33a0::,2804:33a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33a4::,2804:33a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33a8::,2804:33a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33ac::,2804:33ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33b0::,2804:33b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33b4::,2804:33b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33b8::,2804:33b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33bc::,2804:33bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33c0::,2804:33c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33c4::,2804:33c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33c8::,2804:33c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33cc::,2804:33cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33d0::,2804:33d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33d4::,2804:33d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33d8::,2804:33d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33dc::,2804:33dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33e0::,2804:33e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33e4::,2804:33e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33e8::,2804:33e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33ec::,2804:33ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33f0::,2804:33f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33f4::,2804:33f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33f8::,2804:33f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:33fc::,2804:33fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3400::,2804:3400:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3404::,2804:3404:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3408::,2804:3408:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:340c::,2804:340c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3410::,2804:3410:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3414::,2804:3414:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3418::,2804:3418:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:341c::,2804:341c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3420::,2804:3420:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3424::,2804:3424:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3428::,2804:3428:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:342c::,2804:342c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3430::,2804:3430:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3434::,2804:3434:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3438::,2804:3438:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:343c::,2804:343c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3440::,2804:3440:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3444::,2804:3444:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3448::,2804:3448:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:344c::,2804:344c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3450::,2804:3450:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3454::,2804:3454:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3458::,2804:3458:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:345c::,2804:345c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3460::,2804:3460:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3464::,2804:3464:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3468::,2804:3468:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:346c::,2804:346c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3470::,2804:3470:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3474::,2804:3474:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3478::,2804:3478:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:347c::,2804:347c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3480::,2804:3480:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3484::,2804:3484:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3488::,2804:3488:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:348c::,2804:348c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3490::,2804:3490:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3494::,2804:3494:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3498::,2804:3498:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:349c::,2804:349c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34a0::,2804:34a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34a4::,2804:34a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34a8::,2804:34a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34ac::,2804:34ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34b0::,2804:34b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34b4::,2804:34b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34b8::,2804:34b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34bc::,2804:34bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34c0::,2804:34c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34c4::,2804:34c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34c8::,2804:34c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34cc::,2804:34cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34d0::,2804:34d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34d4::,2804:34d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34d8::,2804:34d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34dc::,2804:34dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34e0::,2804:34e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34e4::,2804:34e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34e8::,2804:34e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34ec::,2804:34ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34f0::,2804:34f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34f4::,2804:34f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34f8::,2804:34f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:34fc::,2804:34fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3500::,2804:3500:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3504::,2804:3504:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3508::,2804:3508:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:350c::,2804:350c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3510::,2804:3510:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3514::,2804:3514:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3518::,2804:3518:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:351c::,2804:351c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3520::,2804:3520:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3524::,2804:3524:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3528::,2804:3528:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:352c::,2804:352c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3530::,2804:3530:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3534::,2804:3534:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3538::,2804:3538:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:353c::,2804:353c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3540::,2804:3540:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3544::,2804:3544:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3548::,2804:3548:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:354c::,2804:354c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3550::,2804:3550:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3554::,2804:3554:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3558::,2804:3558:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:355c::,2804:355c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3560::,2804:3560:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3564::,2804:3564:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3568::,2804:3568:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:356c::,2804:356c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3570::,2804:3570:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3574::,2804:3574:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3578::,2804:3578:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:357c::,2804:357c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3580::,2804:3580:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3584::,2804:3584:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3588::,2804:3588:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:358c::,2804:358c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3590::,2804:3590:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3594::,2804:3594:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3598::,2804:3598:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:359c::,2804:359c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35a0::,2804:35a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35a4::,2804:35a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35a8::,2804:35a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35ac::,2804:35ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35b0::,2804:35b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35b4::,2804:35b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35b8::,2804:35b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35bc::,2804:35bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35c0::,2804:35c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35c4::,2804:35c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35c8::,2804:35c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35cc::,2804:35cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35d0::,2804:35d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35d4::,2804:35d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35d8::,2804:35d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35dc::,2804:35dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35e0::,2804:35e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35e4::,2804:35e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35e8::,2804:35e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35ec::,2804:35ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35f0::,2804:35f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35f4::,2804:35f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35f8::,2804:35f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:35fc::,2804:35fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3600::,2804:3600:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3604::,2804:3604:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3608::,2804:3608:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:360c::,2804:360c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3610::,2804:3610:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3614::,2804:3614:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3618::,2804:3618:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:361c::,2804:361c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3620::,2804:3620:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3624::,2804:3624:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3628::,2804:3628:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:362c::,2804:362c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3630::,2804:3630:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3634::,2804:3634:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3638::,2804:3638:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:363c::,2804:363c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3640::,2804:3640:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3644::,2804:3644:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3648::,2804:3648:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:364c::,2804:364c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3650::,2804:3650:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3654::,2804:3654:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3658::,2804:3658:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:365c::,2804:365c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3660::,2804:3660:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3664::,2804:3664:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3668::,2804:3668:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:366c::,2804:366c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3670::,2804:3670:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3674::,2804:3674:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3678::,2804:3678:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:367c::,2804:367c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3680::,2804:3680:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3684::,2804:3684:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3688::,2804:3688:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:368c::,2804:368c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3690::,2804:3690:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3694::,2804:3694:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3698::,2804:3698:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:369c::,2804:369c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36a0::,2804:36a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36a4::,2804:36a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36a8::,2804:36a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36ac::,2804:36ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36b0::,2804:36b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36b4::,2804:36b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36b8::,2804:36b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36bc::,2804:36bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36c0::,2804:36c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36c4::,2804:36c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36c8::,2804:36c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36cc::,2804:36cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36d0::,2804:36d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36d4::,2804:36d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36d8::,2804:36d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36dc::,2804:36dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36e0::,2804:36e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36e4::,2804:36e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36e8::,2804:36e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36ec::,2804:36ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36f0::,2804:36f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36f4::,2804:36f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36f8::,2804:36f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:36fc::,2804:36fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3700::,2804:3700:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3704::,2804:3704:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3708::,2804:3708:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:370c::,2804:370c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3710::,2804:3710:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3714::,2804:3714:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3718::,2804:3718:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:371c::,2804:371c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3720::,2804:3720:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3724::,2804:3724:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3728::,2804:3728:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:372c::,2804:372c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3730::,2804:3730:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3734::,2804:3734:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3738::,2804:3738:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:373c::,2804:373c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3740::,2804:3740:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3744::,2804:3744:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3748::,2804:3748:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:374c::,2804:374c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3750::,2804:3750:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3754::,2804:3754:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3758::,2804:3758:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:375c::,2804:375c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3760::,2804:3760:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3764::,2804:3764:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3768::,2804:3768:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:376c::,2804:376c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3770::,2804:3770:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3774::,2804:3774:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3778::,2804:3778:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:377c::,2804:377c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3780::,2804:3780:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3784::,2804:3784:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3788::,2804:3788:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:378c::,2804:378c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3790::,2804:3790:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3794::,2804:3794:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3798::,2804:3798:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:379c::,2804:379c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37a0::,2804:37a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37a4::,2804:37a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37a8::,2804:37a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37ac::,2804:37ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37b0::,2804:37b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37b4::,2804:37b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37b8::,2804:37b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37bc::,2804:37bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37c0::,2804:37c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37c4::,2804:37c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37c8::,2804:37c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37cc::,2804:37cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37d0::,2804:37d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37d4::,2804:37d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37d8::,2804:37d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37dc::,2804:37dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37e0::,2804:37e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37e4::,2804:37e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37e8::,2804:37e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37ec::,2804:37ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37f0::,2804:37f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37f4::,2804:37f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37f8::,2804:37f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:37fc::,2804:37fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3800::,2804:3800:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3804::,2804:3804:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3808::,2804:3808:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:380c::,2804:380c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3810::,2804:3810:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3814::,2804:3814:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3818::,2804:3818:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:381c::,2804:381c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3820::,2804:3820:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3824::,2804:3824:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3828::,2804:3828:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:382c::,2804:382c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3830::,2804:3830:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3834::,2804:3834:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3838::,2804:3838:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:383c::,2804:383c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3840::,2804:3840:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3844::,2804:3844:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3848::,2804:3848:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:384c::,2804:384c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3850::,2804:3850:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3854::,2804:3854:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3858::,2804:3858:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:385c::,2804:385c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3860::,2804:3860:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3864::,2804:3864:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3868::,2804:3868:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:386c::,2804:386c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3870::,2804:3870:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3874::,2804:3874:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3878::,2804:3878:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:387c::,2804:387c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3880::,2804:3880:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3884::,2804:3884:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3888::,2804:3888:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:388c::,2804:388c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3890::,2804:3890:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3894::,2804:3894:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3898::,2804:3898:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:389c::,2804:389c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38a0::,2804:38a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38a4::,2804:38a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38a8::,2804:38a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38ac::,2804:38ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38b0::,2804:38b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38b4::,2804:38b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38b8::,2804:38b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38bc::,2804:38bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38c0::,2804:38c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38c4::,2804:38c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38c8::,2804:38c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38cc::,2804:38cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38d0::,2804:38d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38d4::,2804:38d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38d8::,2804:38d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38dc::,2804:38dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38e0::,2804:38e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38e4::,2804:38e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38e8::,2804:38e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38ec::,2804:38ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38f0::,2804:38f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38f4::,2804:38f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38f8::,2804:38f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:38fc::,2804:38fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3900::,2804:3900:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3904::,2804:3904:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3908::,2804:3908:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:390c::,2804:390c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3910::,2804:3910:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3914::,2804:3914:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3918::,2804:3918:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:391c::,2804:391c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3920::,2804:3920:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3924::,2804:3924:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3928::,2804:3928:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:392c::,2804:392c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3930::,2804:3930:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3934::,2804:3934:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3938::,2804:3938:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:393c::,2804:393c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3940::,2804:3940:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3944::,2804:3944:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3948::,2804:3948:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:394c::,2804:394c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3950::,2804:3950:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3954::,2804:3954:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3958::,2804:3958:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:395c::,2804:395c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3960::,2804:3960:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3964::,2804:3964:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3968::,2804:3968:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:396c::,2804:396c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3970::,2804:3970:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3974::,2804:3974:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3978::,2804:3978:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:397c::,2804:397c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3980::,2804:3980:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3984::,2804:3984:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3988::,2804:3988:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:398c::,2804:398c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3990::,2804:3990:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3994::,2804:3994:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3998::,2804:3998:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:399c::,2804:399c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39a0::,2804:39a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39a4::,2804:39a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39a8::,2804:39a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39ac::,2804:39ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39b0::,2804:39b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39b4::,2804:39b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39b8::,2804:39b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39bc::,2804:39bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39c0::,2804:39c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39c4::,2804:39c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39c8::,2804:39c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39cc::,2804:39cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39d0::,2804:39d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39d4::,2804:39d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39d8::,2804:39d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39dc::,2804:39dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39e0::,2804:39e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39e4::,2804:39e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39e8::,2804:39e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39ec::,2804:39ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39f0::,2804:39f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39f4::,2804:39f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39f8::,2804:39f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:39fc::,2804:39fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a00::,2804:3a00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a04::,2804:3a04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a08::,2804:3a08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a0c::,2804:3a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a10::,2804:3a10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a14::,2804:3a14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a18::,2804:3a18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a1c::,2804:3a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a20::,2804:3a20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a24::,2804:3a24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a28::,2804:3a28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a2c::,2804:3a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a30::,2804:3a30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a34::,2804:3a34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a38::,2804:3a38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a3c::,2804:3a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a40::,2804:3a40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a44::,2804:3a44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a48::,2804:3a48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a4c::,2804:3a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a50::,2804:3a50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a54::,2804:3a54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a58::,2804:3a58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a5c::,2804:3a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a60::,2804:3a60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a64::,2804:3a64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a68::,2804:3a68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a6c::,2804:3a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a70::,2804:3a70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a74::,2804:3a74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a78::,2804:3a78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a7c::,2804:3a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a80::,2804:3a80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a84::,2804:3a84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a88::,2804:3a88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a8c::,2804:3a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a90::,2804:3a90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a94::,2804:3a94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a98::,2804:3a98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3a9c::,2804:3a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3aa0::,2804:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3aa4::,2804:3aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3aa8::,2804:3aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3aac::,2804:3aac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ab0::,2804:3ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ab4::,2804:3ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ab8::,2804:3ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3abc::,2804:3abc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ac0::,2804:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ac4::,2804:3ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ac8::,2804:3ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3acc::,2804:3acc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ad0::,2804:3ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ad4::,2804:3ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ad8::,2804:3ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3adc::,2804:3adc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ae0::,2804:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ae4::,2804:3ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ae8::,2804:3ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3aec::,2804:3aec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3af0::,2804:3af0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3af4::,2804:3af4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3af8::,2804:3af8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3afc::,2804:3afc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b00::,2804:3b00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b04::,2804:3b04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b08::,2804:3b08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b0c::,2804:3b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b10::,2804:3b10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b14::,2804:3b14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b18::,2804:3b18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b1c::,2804:3b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b20::,2804:3b20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b24::,2804:3b24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b28::,2804:3b28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b2c::,2804:3b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b30::,2804:3b30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b34::,2804:3b34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b38::,2804:3b38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b3c::,2804:3b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b40::,2804:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b44::,2804:3b44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b48::,2804:3b48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b4c::,2804:3b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b50::,2804:3b50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b54::,2804:3b54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b58::,2804:3b58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b5c::,2804:3b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b60::,2804:3b60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b64::,2804:3b64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b68::,2804:3b68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b6c::,2804:3b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b70::,2804:3b70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b74::,2804:3b74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b78::,2804:3b78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b7c::,2804:3b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b80::,2804:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b84::,2804:3b84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b88::,2804:3b88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b8c::,2804:3b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b90::,2804:3b90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b94::,2804:3b94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b98::,2804:3b98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3b9c::,2804:3b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ba0::,2804:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ba4::,2804:3ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ba8::,2804:3ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bac::,2804:3bac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bb0::,2804:3bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bb4::,2804:3bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bb8::,2804:3bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bbc::,2804:3bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bc0::,2804:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bc4::,2804:3bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bc8::,2804:3bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bcc::,2804:3bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bd0::,2804:3bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bd4::,2804:3bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bd8::,2804:3bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bdc::,2804:3bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3be0::,2804:3be0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3be4::,2804:3be4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3be8::,2804:3be8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bec::,2804:3bec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bf0::,2804:3bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bf4::,2804:3bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bf8::,2804:3bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3bfc::,2804:3bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c00::,2804:3c00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c04::,2804:3c04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c08::,2804:3c08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c0c::,2804:3c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c10::,2804:3c10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c14::,2804:3c14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c18::,2804:3c18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c1c::,2804:3c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c20::,2804:3c20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c24::,2804:3c24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c28::,2804:3c28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c2c::,2804:3c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c30::,2804:3c30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c34::,2804:3c34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c38::,2804:3c38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c3c::,2804:3c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c40::,2804:3c40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c44::,2804:3c44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c48::,2804:3c48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c4c::,2804:3c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c50::,2804:3c50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c54::,2804:3c54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c58::,2804:3c58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c5c::,2804:3c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c60::,2804:3c60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c64::,2804:3c64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c68::,2804:3c68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c6c::,2804:3c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c70::,2804:3c70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c74::,2804:3c74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c78::,2804:3c78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c7c::,2804:3c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c80::,2804:3c80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c84::,2804:3c84:ffff:ffff:ffff:ffff:ffff:ffff,US -2804:3c88::,2804:3c88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c8c::,2804:3c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c90::,2804:3c90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c94::,2804:3c94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c98::,2804:3c98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3c9c::,2804:3c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ca0::,2804:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ca4::,2804:3ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ca8::,2804:3ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cac::,2804:3cac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cb0::,2804:3cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cb4::,2804:3cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cb8::,2804:3cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cbc::,2804:3cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cc0::,2804:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cc4::,2804:3cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cc8::,2804:3cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ccc::,2804:3ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cd0::,2804:3cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cd4::,2804:3cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cd8::,2804:3cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cdc::,2804:3cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ce0::,2804:3ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ce4::,2804:3ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ce8::,2804:3ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cec::,2804:3cec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cf0::,2804:3cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cf4::,2804:3cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cf8::,2804:3cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3cfc::,2804:3cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d00::,2804:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d04::,2804:3d04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d08::,2804:3d08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d0c::,2804:3d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d10::,2804:3d10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d14::,2804:3d14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d18::,2804:3d18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d1c::,2804:3d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d20::,2804:3d20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d24::,2804:3d24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d28::,2804:3d28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d2c::,2804:3d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d30::,2804:3d30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d34::,2804:3d34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d38::,2804:3d38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d3c::,2804:3d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d40::,2804:3d40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d44::,2804:3d44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d48::,2804:3d48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d4c::,2804:3d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d50::,2804:3d50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d54::,2804:3d54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d58::,2804:3d58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d5c::,2804:3d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d60::,2804:3d60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d64::,2804:3d64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d68::,2804:3d68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d6c::,2804:3d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d70::,2804:3d70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d74::,2804:3d74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d78::,2804:3d78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d7c::,2804:3d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d80::,2804:3d80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d84::,2804:3d84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d88::,2804:3d88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d8c::,2804:3d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d90::,2804:3d90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d94::,2804:3d94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d98::,2804:3d98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3d9c::,2804:3d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3da0::,2804:3da0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3da4::,2804:3da4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3da8::,2804:3da8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dac::,2804:3dac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3db0::,2804:3db0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3db4::,2804:3db4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3db8::,2804:3db8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dbc::,2804:3dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dc0::,2804:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dc4::,2804:3dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dc8::,2804:3dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dcc::,2804:3dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dd0::,2804:3dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dd4::,2804:3dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dd8::,2804:3dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ddc::,2804:3ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3de0::,2804:3de0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3de4::,2804:3de4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3de8::,2804:3de8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dec::,2804:3dec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3df0::,2804:3df0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3df4::,2804:3df4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3df8::,2804:3df8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3dfc::,2804:3dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e00::,2804:3e00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e04::,2804:3e04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e08::,2804:3e08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e0c::,2804:3e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e10::,2804:3e10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e14::,2804:3e14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e18::,2804:3e18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e1c::,2804:3e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e20::,2804:3e20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e24::,2804:3e24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e28::,2804:3e28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e2c::,2804:3e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e30::,2804:3e30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e34::,2804:3e34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e38::,2804:3e38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e3c::,2804:3e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e40::,2804:3e40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e44::,2804:3e44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e48::,2804:3e48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e4c::,2804:3e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e50::,2804:3e50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e54::,2804:3e54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e58::,2804:3e58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e5c::,2804:3e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e60::,2804:3e60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e64::,2804:3e64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e68::,2804:3e68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e6c::,2804:3e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e70::,2804:3e70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e74::,2804:3e74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e78::,2804:3e78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e7c::,2804:3e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e80::,2804:3e80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e84::,2804:3e84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e88::,2804:3e88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e8c::,2804:3e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e90::,2804:3e90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e94::,2804:3e94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e98::,2804:3e98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3e9c::,2804:3e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ea0::,2804:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ea4::,2804:3ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ea8::,2804:3ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3eac::,2804:3eac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3eb0::,2804:3eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3eb4::,2804:3eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3eb8::,2804:3eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ebc::,2804:3ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ec0::,2804:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ec4::,2804:3ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ec8::,2804:3ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ecc::,2804:3ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ed0::,2804:3ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ed4::,2804:3ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ed8::,2804:3ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3edc::,2804:3edc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ee0::,2804:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ee4::,2804:3ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ee8::,2804:3ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3eec::,2804:3eec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ef0::,2804:3ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ef4::,2804:3ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ef8::,2804:3ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3efc::,2804:3efc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f00::,2804:3f00:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f04::,2804:3f04:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f08::,2804:3f08:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f0c::,2804:3f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f10::,2804:3f10:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f14::,2804:3f14:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f18::,2804:3f18:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f1c::,2804:3f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f20::,2804:3f20:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f24::,2804:3f24:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f28::,2804:3f28:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f2c::,2804:3f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f30::,2804:3f30:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f34::,2804:3f34:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f38::,2804:3f38:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f3c::,2804:3f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f40::,2804:3f40:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f44::,2804:3f44:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f48::,2804:3f48:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f4c::,2804:3f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f50::,2804:3f50:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f54::,2804:3f54:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f58::,2804:3f58:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f5c::,2804:3f5c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f60::,2804:3f60:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f64::,2804:3f64:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f68::,2804:3f68:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f6c::,2804:3f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f70::,2804:3f70:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f74::,2804:3f74:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f78::,2804:3f78:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f7c::,2804:3f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f80::,2804:3f80:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f84::,2804:3f84:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f88::,2804:3f88:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f8c::,2804:3f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f90::,2804:3f90:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f94::,2804:3f94:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f98::,2804:3f98:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3f9c::,2804:3f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fa0::,2804:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fa4::,2804:3fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fa8::,2804:3fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fac::,2804:3fac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fb0::,2804:3fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fb4::,2804:3fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fb8::,2804:3fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fbc::,2804:3fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fc0::,2804:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fc4::,2804:3fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fc8::,2804:3fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fcc::,2804:3fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fd0::,2804:3fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fd4::,2804:3fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fd8::,2804:3fd8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fdc::,2804:3fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fe0::,2804:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fe4::,2804:3fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fe8::,2804:3fe8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3fec::,2804:3fec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ff0::,2804:3ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ff4::,2804:3ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ff8::,2804:3ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:3ffc::,2804:3ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4000::,2804:4000:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4004::,2804:4004:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4008::,2804:4008:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:400c::,2804:400c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4010::,2804:4010:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4014::,2804:4014:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4018::,2804:4018:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:401c::,2804:401c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4020::,2804:4020:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4024::,2804:4024:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4028::,2804:4028:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:402c::,2804:402c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4030::,2804:4030:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4034::,2804:4034:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4038::,2804:4038:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:403c::,2804:403c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4040::,2804:4040:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4044::,2804:4044:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4048::,2804:4048:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:404c::,2804:404c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4050::,2804:4050:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4054::,2804:4054:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4058::,2804:4058:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:405c::,2804:405c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4060::,2804:4060:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4064::,2804:4064:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4068::,2804:4068:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:406c::,2804:406c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4070::,2804:4070:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4074::,2804:4074:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4078::,2804:4078:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:407c::,2804:407c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4080::,2804:4080:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4084::,2804:4084:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4088::,2804:4088:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:408c::,2804:408c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4090::,2804:4090:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4094::,2804:4094:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4098::,2804:4098:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:409c::,2804:409c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40a0::,2804:40a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40a4::,2804:40a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40a8::,2804:40a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40ac::,2804:40ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40b0::,2804:40b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40b4::,2804:40b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40b8::,2804:40b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40bc::,2804:40bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40c0::,2804:40c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40c4::,2804:40c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40c8::,2804:40c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40cc::,2804:40cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40d0::,2804:40d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40d4::,2804:40d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40d8::,2804:40d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40dc::,2804:40dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40e0::,2804:40e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40e4::,2804:40e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40e8::,2804:40e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40ec::,2804:40ec:ffff:ffff:ffff:ffff:ffff:ffff,US -2804:40f0::,2804:40f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40f4::,2804:40f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40f8::,2804:40f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:40fc::,2804:40fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4100::,2804:4100:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4104::,2804:4104:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4108::,2804:4108:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:410c::,2804:410c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4110::,2804:4110:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4114::,2804:4114:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4118::,2804:4118:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:411c::,2804:411c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4120::,2804:4120:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4124::,2804:4124:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4128::,2804:4128:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:412c::,2804:412c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4130::,2804:4130:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4134::,2804:4134:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4138::,2804:4138:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:413c::,2804:413c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4140::,2804:4140:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4144::,2804:4144:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4148::,2804:4148:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:414c::,2804:414c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4150::,2804:4150:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4154::,2804:4154:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4158::,2804:4158:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:415c::,2804:415c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4160::,2804:4160:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4164::,2804:4164:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4168::,2804:4168:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:416c::,2804:416c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4170::,2804:4170:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4174::,2804:4174:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4178::,2804:4178:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:417c::,2804:417c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4180::,2804:4180:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4184::,2804:4184:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4188::,2804:4188:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:418c::,2804:418c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4190::,2804:4190:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4194::,2804:4194:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4198::,2804:4198:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:419c::,2804:419c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41a0::,2804:41a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41a4::,2804:41a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41a8::,2804:41a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41ac::,2804:41ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41b0::,2804:41b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41b4::,2804:41b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41b8::,2804:41b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41bc::,2804:41bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41c0::,2804:41c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41c4::,2804:41c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41c8::,2804:41c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41cc::,2804:41cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41d0::,2804:41d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41d4::,2804:41d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41d8::,2804:41d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41dc::,2804:41dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41e0::,2804:41e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41e4::,2804:41e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41e8::,2804:41e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41ec::,2804:41ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41f0::,2804:41f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41f4::,2804:41f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41f8::,2804:41f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:41fc::,2804:41fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4200::,2804:4200:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4204::,2804:4204:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4208::,2804:4208:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:420c::,2804:420c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4210::,2804:4210:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4214::,2804:4214:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4218::,2804:4218:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:421c::,2804:421c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4220::,2804:4220:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4224::,2804:4224:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4228::,2804:4228:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:422c::,2804:422c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4230::,2804:4230:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4234::,2804:4234:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4238::,2804:4238:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:423c::,2804:423c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4240::,2804:4240:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4244::,2804:4244:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4248::,2804:4248:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:424c::,2804:424c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4250::,2804:4250:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4254::,2804:4254:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4258::,2804:4258:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:425c::,2804:425c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4260::,2804:4260:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4264::,2804:4264:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4268::,2804:4268:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:426c::,2804:426c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4270::,2804:4270:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4274::,2804:4274:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4278::,2804:4278:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:427c::,2804:427c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4280::,2804:4280:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4284::,2804:4284:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4288::,2804:4288:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:428c::,2804:428c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4290::,2804:4290:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4294::,2804:4294:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4298::,2804:4298:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:429c::,2804:429c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42a0::,2804:42a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42a4::,2804:42a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42a8::,2804:42a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42ac::,2804:42ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42b0::,2804:42b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42b4::,2804:42b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42b8::,2804:42b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42bc::,2804:42bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42c0::,2804:42c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42c4::,2804:42c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42c8::,2804:42c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42cc::,2804:42cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42d0::,2804:42d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42d4::,2804:42d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42d8::,2804:42d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42dc::,2804:42dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42e0::,2804:42e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42e4::,2804:42e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42e8::,2804:42e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42ec::,2804:42ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42f0::,2804:42f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42f4::,2804:42f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42f8::,2804:42f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:42fc::,2804:42fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4300::,2804:4300:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4304::,2804:4304:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4308::,2804:4308:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:430c::,2804:430c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4310::,2804:4310:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4314::,2804:4314:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4318::,2804:4318:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:431c::,2804:431c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4320::,2804:4320:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4324::,2804:4324:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4328::,2804:4328:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:432c::,2804:432c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4330::,2804:4330:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4334::,2804:4334:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4338::,2804:4338:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:433c::,2804:433c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4340::,2804:4340:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4344::,2804:4344:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4348::,2804:4348:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:434c::,2804:434c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4350::,2804:4350:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4354::,2804:4354:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4358::,2804:4358:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:435c::,2804:435c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4360::,2804:4360:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4364::,2804:4364:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4368::,2804:4368:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:436c::,2804:436c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4370::,2804:4370:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4374::,2804:4374:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4378::,2804:4378:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:437c::,2804:437c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4380::,2804:4380:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4384::,2804:4384:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4388::,2804:4388:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:438c::,2804:438c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4390::,2804:4390:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4394::,2804:4394:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4398::,2804:4398:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:439c::,2804:439c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43a0::,2804:43a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43a4::,2804:43a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43a8::,2804:43a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43ac::,2804:43ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43b0::,2804:43b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43b4::,2804:43b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43b8::,2804:43b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43bc::,2804:43bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43c0::,2804:43c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43c4::,2804:43c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43c8::,2804:43c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43cc::,2804:43cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43d0::,2804:43d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43d4::,2804:43d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43d8::,2804:43d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43dc::,2804:43dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43e0::,2804:43e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43e4::,2804:43e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43e8::,2804:43e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43ec::,2804:43ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43f0::,2804:43f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43f4::,2804:43f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43f8::,2804:43f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:43fc::,2804:43fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4400::,2804:4400:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4404::,2804:4404:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4408::,2804:4408:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:440c::,2804:440c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4410::,2804:4410:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4414::,2804:4414:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4418::,2804:4418:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:441c::,2804:441c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4420::,2804:4420:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4424::,2804:4424:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4428::,2804:4428:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:442c::,2804:442c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4430::,2804:4430:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4434::,2804:4434:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4438::,2804:4438:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:443c::,2804:443c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4440::,2804:4440:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4444::,2804:4444:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4448::,2804:4448:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:444c::,2804:444c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4450::,2804:4450:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4454::,2804:4454:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4458::,2804:4458:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:445c::,2804:445c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4460::,2804:4460:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4464::,2804:4464:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4468::,2804:4468:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:446c::,2804:446c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4470::,2804:4470:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4474::,2804:4474:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4478::,2804:4478:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:447c::,2804:447c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4480::,2804:4480:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4484::,2804:4484:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4488::,2804:4488:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:448c::,2804:448c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4490::,2804:4490:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4494::,2804:4494:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4498::,2804:4498:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:449c::,2804:449c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44a0::,2804:44a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44a4::,2804:44a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44a8::,2804:44a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44ac::,2804:44ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44b0::,2804:44b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44b4::,2804:44b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44b8::,2804:44b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44bc::,2804:44bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44c0::,2804:44c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44c4::,2804:44c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44c8::,2804:44c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44cc::,2804:44cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44d0::,2804:44d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44d4::,2804:44d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44d8::,2804:44d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44dc::,2804:44dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44e0::,2804:44e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44e4::,2804:44e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44e8::,2804:44e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44ec::,2804:44ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44f0::,2804:44f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44f4::,2804:44f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44f8::,2804:44f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:44fc::,2804:44fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4500::,2804:4500:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4504::,2804:4504:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4508::,2804:4508:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:450c::,2804:450c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4510::,2804:4510:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4514::,2804:4514:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4518::,2804:4518:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:451c::,2804:451c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4520::,2804:4520:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4524::,2804:4524:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4528::,2804:4528:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:452c::,2804:452c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4530::,2804:4530:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4534::,2804:4534:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4538::,2804:4538:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:453c::,2804:453c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4540::,2804:4540:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4544::,2804:4544:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4548::,2804:4548:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:454c::,2804:454c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4550::,2804:4550:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4554::,2804:4554:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4558::,2804:4558:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:455c::,2804:455c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4560::,2804:4560:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4564::,2804:4564:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4568::,2804:4568:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:456c::,2804:456c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4570::,2804:4570:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4574::,2804:4574:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4578::,2804:4578:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:457c::,2804:457c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4580::,2804:4580:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4584::,2804:4584:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4588::,2804:4588:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:458c::,2804:458c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4590::,2804:4590:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4594::,2804:4594:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4598::,2804:4598:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:459c::,2804:459c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45a0::,2804:45a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45a4::,2804:45a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45a8::,2804:45a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45ac::,2804:45ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45b0::,2804:45b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45b4::,2804:45b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45b8::,2804:45b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45bc::,2804:45bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45c0::,2804:45c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45c4::,2804:45c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45c8::,2804:45c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45cc::,2804:45cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45d0::,2804:45d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45d4::,2804:45d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45d8::,2804:45d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45dc::,2804:45dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45e0::,2804:45e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45e4::,2804:45e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45e8::,2804:45e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45ec::,2804:45ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45f0::,2804:45f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45f4::,2804:45f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45f8::,2804:45f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:45fc::,2804:45fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4600::,2804:4600:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4604::,2804:4604:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4608::,2804:4608:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:460c::,2804:460c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4610::,2804:4610:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4614::,2804:4614:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4618::,2804:4618:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:461c::,2804:461c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4620::,2804:4620:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4624::,2804:4624:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4628::,2804:4628:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:462c::,2804:462c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4630::,2804:4630:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4634::,2804:4634:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4638::,2804:4638:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:463c::,2804:463c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4640::,2804:4640:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4644::,2804:4644:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4648::,2804:4648:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:464c::,2804:464c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4650::,2804:4650:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4654::,2804:4654:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4658::,2804:4658:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:465c::,2804:465c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4660::,2804:4660:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4664::,2804:4664:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4668::,2804:4668:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:466c::,2804:466c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4670::,2804:4670:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4674::,2804:4674:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4678::,2804:4678:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:467c::,2804:467c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4680::,2804:4680:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4684::,2804:4684:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4688::,2804:4688:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:468c::,2804:468c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4690::,2804:4690:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4694::,2804:4694:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4698::,2804:4698:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:469c::,2804:469c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46a0::,2804:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46a4::,2804:46a4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46a8::,2804:46a8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46ac::,2804:46ac:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46b0::,2804:46b0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46b4::,2804:46b4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46b8::,2804:46b8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46bc::,2804:46bc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46c0::,2804:46c0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46c4::,2804:46c4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46c8::,2804:46c8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46cc::,2804:46cc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46d0::,2804:46d0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46d4::,2804:46d4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46d8::,2804:46d8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46dc::,2804:46dc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46e0::,2804:46e0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46e4::,2804:46e4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46e8::,2804:46e8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46ec::,2804:46ec:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46f0::,2804:46f0:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46f4::,2804:46f4:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46f8::,2804:46f8:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:46fc::,2804:46fc:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4700::,2804:4700:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4704::,2804:4704:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4708::,2804:4708:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:470c::,2804:470c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4710::,2804:4710:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4714::,2804:4714:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4718::,2804:4718:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:471c::,2804:471c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4720::,2804:4720:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4724::,2804:4724:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4728::,2804:4728:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:472c::,2804:472c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4730::,2804:4730:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4734::,2804:4734:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:4738::,2804:4738:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:473c::,2804:473c:ffff:ffff:ffff:ffff:ffff:ffff,BR -2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:200::,2806:216::ffff:ffff:ffff:ffff:ffff,MX -2806:217::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:230::,2806:230:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:238::,2806:238::ffff:ffff:ffff:ffff:ffff,MX -2806:238:10::,2806:238:10:ffff:ffff:ffff:ffff:ffff,MX -2806:239::,2806:240:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:250::,2806:250:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:260::,2806:260:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:270::,2806:270:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:280::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2a0::,2806:2a0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2b0::,2806:2b0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2c0::,2806:2c0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2d0::,2806:2d0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2e0::,2806:2e6:d:ffff:ffff:ffff:ffff:ffff,MX -2806:2e6:e::,2806:2e6:e:7fff:ffff:ffff:ffff:ffff,US -2806:2e6:e:8000::,2806:2ee:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2f0::,2806:2f0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2f4::,2806:2f4:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:300::,2806:300:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:310::,2806:310:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:320::,2806:320:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:330::,2806:330:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:350::,2806:350:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:360::,2806:360:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:370::,2806:370:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:1000::,2806:10ff:ffff:ffff:ffff:ffff:ffff:ffff,MX -2a00::,2a00:3ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:800::,2a00:865:7d68:7fff:ffff:ffff:ffff:ffff,SE -2a00:865:7d68:8000::,2a00:865:7d68:ffff:ffff:ffff:ffff:ffff,NL -2a00:865:7d69::,2a00:87f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:c00::,2a00:c00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c08::,2a00:c08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c10::,2a00:c10:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:c18::,2a00:c18:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c20::,2a00:c20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c30::,2a00:c37:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:c38::,2a00:c38:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:c40::,2a00:c40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:c50::,2a00:c57:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c58::,2a00:c58:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c60::,2a00:c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c68::,2a00:c68:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:c70::,2a00:c70:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c78::,2a00:c78:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:c80::,2a00:c80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:c88::,2a00:c88:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:c90::,2a00:c90:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:c98::,2a00:c98:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ca0::,2a00:ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ca8::,2a00:ca8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:cb0::,2a00:cb0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cb8::,2a00:cb8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:cc0::,2a00:cc0:fffd:ffff:ffff:ffff:ffff:ffff,DE -2a00:cc0:fffe::,2a00:cc0:fffe:7fff:ffff:ffff:ffff:ffff,NL -2a00:cc0:fffe:8000::,2a00:cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cc8::,2a00:cc8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:cd0::,2a00:cd0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cd8::,2a00:cd8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ce0::,2a00:ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ce8::,2a00:ce8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:cf8::,2a00:cf8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:d00::,2a00:d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d08::,2a00:d08:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d10::,2a00:d10:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d18::,2a00:d18:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:d20::,2a00:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:d28::,2a00:d28:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d30::,2a00:d30:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:d40::,2a00:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:d50::,2a00:d50:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d58::,2a00:d58:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d60::,2a00:d60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:d68::,2a00:d68:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d70::,2a00:d70:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d78::,2a00:d78:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d80::,2a00:d80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d88::,2a00:d8f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:d90::,2a00:d97:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:d98::,2a00:d98:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:da8::,2a00:da9:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:db0::,2a00:db0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:db8::,2a00:db8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:dc0::,2a00:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:dc8::,2a00:dc8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:dd0::,2a00:dd0:fffe:ffff:ffff:ffff:ffff:ffff,NL -2a00:dd0:ffff::,2a00:dd0:ffff:7fff:ffff:ffff:ffff:ffff,SE -2a00:dd0:ffff:8000::,2a00:dd0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:dd8::,2a00:dd8:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:de8::,2a00:de8:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:df0::,2a00:df0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:df8::,2a00:df8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:e00::,2a00:e00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e08::,2a00:e0f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:e10::,2a00:e10:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e18::,2a00:e18:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:e20::,2a00:e20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e30::,2a00:e30:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e38::,2a00:e38:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e40::,2a00:e40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:e48::,2a00:e48:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:e50::,2a00:e58:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e60::,2a00:e68:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e70::,2a00:e70:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:e78::,2a00:e7b:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e80::,2a00:e80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e88::,2a00:e88:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e90::,2a00:e90:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:e98::,2a00:e98:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:ea0::,2a00:ea7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:ea8::,2a00:eaf:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:eb0::,2a00:eb0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:eb8::,2a00:eb8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ec0::,2a00:ec0:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a00:ec8::,2a00:ec8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ed0::,2a00:ed0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ed8::,2a00:ed8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:ee0::,2a00:ee2:2201:7fff:ffff:ffff:ffff:ffff,SI -2a00:ee2:2201:8000::,2a00:ee2:2201:9fff:ffff:ffff:ffff:ffff,FR -2a00:ee2:2201:a000::,2a00:ee7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:ee8::,2a00:ee8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ef0::,2a00:ef0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:ef8::,2a00:ef8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:f00::,2a00:f08:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f10::,2a00:f17:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f18::,2a00:f18:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f20::,2a00:f20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:f28::,2a00:f2f:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:f30::,2a00:f30:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f38::,2a00:f38:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a00:f40::,2a00:f47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:f48::,2a00:f4f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f50::,2a00:f50:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:f58::,2a00:f58:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:f60::,2a00:f60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f68::,2a00:f68:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f70::,2a00:f70:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f78::,2a00:f78:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:f80::,2a00:f80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f88::,2a00:f88:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f90::,2a00:f90:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:f98::,2a00:f98:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:fa0::,2a00:fa7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:fa8::,2a00:fa8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fb8::,2a00:fb8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fc0::,2a00:fc0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:fc8::,2a00:fc8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:fd0::,2a00:fd0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fd8::,2a00:fd8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fe0::,2a00:fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fe8::,2a00:fe8:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:ff0::,2a00:ff0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:ff8::,2a00:fff:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1000::,2a00:1000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1008::,2a00:1008:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1010::,2a00:1010:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1018::,2a00:1018:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1020::,2a00:1020:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1028::,2a00:102f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1030::,2a00:1030:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1040::,2a00:1040:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1048::,2a00:1048:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1050::,2a00:1050:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1058::,2a00:1058:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1060::,2a00:1060:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a00:1068::,2a00:1068:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1070::,2a00:1070:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1078::,2a00:1078:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1080::,2a00:1080:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1088::,2a00:1088:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1098::,2a00:1098:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:10a0::,2a00:10a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:10a8::,2a00:10a8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:10b0::,2a00:10b7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:10b8::,2a00:10b8:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:10c0::,2a00:10c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:10c8::,2a00:10c8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:10d0::,2a00:10d0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:10d8::,2a00:10df:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:10e0::,2a00:10e0:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:10e8::,2a00:10f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:10f8::,2a00:10f8:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:1100::,2a00:1107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1108::,2a00:1108:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:1110::,2a00:1117:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:1118::,2a00:1118:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:1120::,2a00:1120:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1128::,2a00:1128:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:1130::,2a00:1130:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1138::,2a00:1138:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1140::,2a00:1140:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1148::,2a00:1148:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1150::,2a00:1150:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a00:1158::,2a00:1158:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1160::,2a00:1167:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1168::,2a00:116f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1170::,2a00:1170:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:1178::,2a00:1178:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1180::,2a00:1180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1188::,2a00:1188:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1190::,2a00:1190:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1198::,2a00:1198:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:11a8::,2a00:11a8:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a00:11b0::,2a00:11b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:11b8::,2a00:11b8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:11c0::,2a00:11c0:1:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:2::,2a00:11c0:2:7fff:ffff:ffff:ffff:ffff,FR -2a00:11c0:2:8000::,2a00:11c0:3:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:4::,2a00:11c0:4:7fff:ffff:ffff:ffff:ffff,CZ -2a00:11c0:4:8000::,2a00:11c0:4:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:5::,2a00:11c0:5:7fff:ffff:ffff:ffff:ffff,CH -2a00:11c0:5:8000::,2a00:11c0:5:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:6::,2a00:11c0:6:7fff:ffff:ffff:ffff:ffff,JP -2a00:11c0:6:8000::,2a00:11c0:7:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:8::,2a00:11c0:8:ffff:ffff:ffff:ffff:ffff,GB -2a00:11c0:9::,2a00:11c0:9:7fff:ffff:ffff:ffff:ffff,IE -2a00:11c0:9:8000::,2a00:11c0:a:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:b::,2a00:11c0:b:ffff:ffff:ffff:ffff:ffff,IT -2a00:11c0:c::,2a00:11c0:d:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:e::,2a00:11c0:e:7fff:ffff:ffff:ffff:ffff,DE -2a00:11c0:e:8000::,2a00:11c0:1f:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:20::,2a00:11c0:20:7fff:ffff:ffff:ffff:ffff,US -2a00:11c0:20:8000::,2a00:11c0:33:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:34::,2a00:11c0:34:7fff:ffff:ffff:ffff:ffff,SG -2a00:11c0:34:8000::,2a00:11c0:62:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c0:63::,2a00:11c0:63:ffff:ffff:ffff:ffff:ffff,NL -2a00:11c0:64::,2a00:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:11c8::,2a00:11c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:11d0::,2a00:11d0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:11d8::,2a00:11d8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:11e0::,2a00:11e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:11e8::,2a00:11ef:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:11f0::,2a00:11f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:11f8::,2a00:11f8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1200::,2a00:1200:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1208::,2a00:1208:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1210::,2a00:1210:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1218::,2a00:1218:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a00:1220::,2a00:1220:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1228::,2a00:1228:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1230::,2a00:1237:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1238::,2a00:1238:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1240::,2a00:1240:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1248::,2a00:1248:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1258::,2a00:1258:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1260::,2a00:1260:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1268::,2a00:1268:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1278::,2a00:1278:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1280::,2a00:1280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1288::,2a00:1288:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1290::,2a00:1290:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1298::,2a00:1298:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:12a0::,2a00:12a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:12a8::,2a00:12af:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:12b0::,2a00:12b0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:12c0::,2a00:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:12c8::,2a00:12c8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:12d0::,2a00:12df:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:12e0::,2a00:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:12e8::,2a00:12e8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:12f0::,2a00:12f0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:12f8::,2a00:12f8:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a00:1300::,2a00:1300:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1308::,2a00:1308:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1318::,2a00:1318:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1320::,2a00:1327:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1328::,2a00:1328:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1338::,2a00:1338:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1340::,2a00:1340:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1348::,2a00:1348:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1350::,2a00:1350:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1358::,2a00:1358:d019:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:d01a::,2a00:1358:d01a:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:d01a:8000::,2a00:1358:e03d:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e03e::,2a00:1358:e03e:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e03e:8000::,2a00:1358:e07b:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e07b:8000::,2a00:1358:e07b:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e07c::,2a00:1358:e0fb:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e0fc::,2a00:1358:e0fc:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e0fc:8000::,2a00:1358:e10d:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e10d:8000::,2a00:1358:e10d:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e10e::,2a00:1358:e122:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e122:8000::,2a00:1358:e122:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e123::,2a00:1358:e123:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e124::,2a00:1358:e124:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e124:8000::,2a00:1358:e13f:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e13f:8000::,2a00:1358:e13f:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e140::,2a00:1358:e140:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e140:8000::,2a00:1358:e140:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e141::,2a00:1358:e149:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e149:8000::,2a00:1358:e149:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e14a::,2a00:1358:e150:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e150:8000::,2a00:1358:e150:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e151::,2a00:1358:e158:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e159::,2a00:1358:e159:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e159:8000::,2a00:1358:e15e:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e15f::,2a00:1358:e15f:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e15f:8000::,2a00:1358:e167:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e167:8000::,2a00:1358:e167:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e168::,2a00:1358:e17f:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e17f:8000::,2a00:1358:e17f:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e180::,2a00:1358:e186:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e186:8000::,2a00:1358:e186:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e187::,2a00:1358:e198:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e198:8000::,2a00:1358:e198:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e199::,2a00:1358:e19a:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e19b::,2a00:1358:e19b:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e19b:8000::,2a00:1358:e1b8:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e1b9::,2a00:1358:e1b9:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e1b9:8000::,2a00:1358:e1f3:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e1f3:8000::,2a00:1358:e1f3:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e1f4::,2a00:1358:e1f5:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e1f5:8000::,2a00:1358:e1f5:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e1f6::,2a00:1358:e1f8:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e1f8:8000::,2a00:1358:e1f8:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e1f9::,2a00:1358:e204:ffff:ffff:ffff:ffff:ffff,GR -2a00:1358:e205::,2a00:1358:e205:7fff:ffff:ffff:ffff:ffff,CY -2a00:1358:e205:8000::,2a00:1358:e263:7fff:ffff:ffff:ffff:ffff,GR -2a00:1358:e263:8000::,2a00:1358:e263:ffff:ffff:ffff:ffff:ffff,CY -2a00:1358:e264::,2a00:135b:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:1360::,2a00:1360:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1368::,2a00:1368:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1370::,2a00:1370:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1378::,2a00:1378:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1388::,2a00:1388:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1390::,2a00:1390:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1398::,2a00:139f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:13a0::,2a00:13a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:13a8::,2a00:13a8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:13b0::,2a00:13b0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:13b8::,2a00:13b8:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:13c0::,2a00:13c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:13c8::,2a00:13c8:2:ffff:ffff:ffff:ffff:ffff,DE -2a00:13c8:3::,2a00:13c8:3:ffff:ffff:ffff:ffff:ffff,CH -2a00:13c8:4::,2a00:13c8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:13d0::,2a00:13d0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:13d8::,2a00:13df:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:13e0::,2a00:13e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:13e8::,2a00:13e8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:13f0::,2a00:13f0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:13f8::,2a00:13ff:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1400::,2a00:1400:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1408::,2a00:1408:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1410::,2a00:1410:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1418::,2a00:1418:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1420::,2a00:1420:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1428::,2a00:1428:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:1430::,2a00:1430:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1440::,2a00:1440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1448::,2a00:144f:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1450::,2a00:1450:400b:ffff:ffff:ffff:ffff:ffff,IE -2a00:1450:400c::,2a00:1450:400c:ffff:ffff:ffff:ffff:ffff,BE -2a00:1450:400d::,2a00:1450:400f:ffff:ffff:ffff:ffff:ffff,IE -2a00:1450:4010::,2a00:1450:4010:ffff:ffff:ffff:ffff:ffff,FI -2a00:1450:4011::,2a00:1450:4012:ffff:ffff:ffff:ffff:ffff,IE -2a00:1450:4013::,2a00:1450:4013:ffff:ffff:ffff:ffff:ffff,NL -2a00:1450:4014::,2a00:1457:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:1458::,2a00:1458:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1468::,2a00:1468:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1470::,2a00:1470:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1478::,2a00:147f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1480::,2a00:1480:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:1488::,2a00:1488:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1490::,2a00:1490:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1498::,2a00:1498:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:14a0::,2a00:14a7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:14a8::,2a00:14a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:14b0::,2a00:14b7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:14b8::,2a00:14b8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:14c0::,2a00:14c0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:14c8::,2a00:14c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:14d0::,2a00:14d0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:14d8::,2a00:14df:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:14e0::,2a00:14e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:14e8::,2a00:14ef:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:14f0::,2a00:14f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:14f8::,2a00:14f8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1500::,2a00:1507:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a00:1508::,2a00:1508:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:1510::,2a00:1510:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1518::,2a00:1518:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1520::,2a00:1520:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1528::,2a00:1528:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1538::,2a00:1538:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1540::,2a00:1540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1548::,2a00:1548:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1550::,2a00:1550:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1558::,2a00:1558:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1560::,2a00:1560:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:1568::,2a00:1568:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1570::,2a00:1570:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1578::,2a00:1578:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1580::,2a00:1587:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:1588::,2a00:1588:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1590::,2a00:1590:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:1598::,2a00:159f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:15a0::,2a00:15a0:f:ffff:ffff:ffff:ffff:ffff,NO -2a00:15a0:10::,2a00:15a0:10:7fff:ffff:ffff:ffff:ffff,SE -2a00:15a0:10:8000::,2a00:15a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:15a8::,2a00:15a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:15b0::,2a00:15b0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:15b8::,2a00:15b8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:15c0::,2a00:15c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:15c8::,2a00:15c8:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:15d0::,2a00:15d0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:15e0::,2a00:15e8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:15f0::,2a00:15f0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:15f8::,2a00:15f8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1600::,2a00:1607:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1610::,2a00:161f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1620::,2a00:1620:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1628::,2a00:1628:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1630::,2a00:1637:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1638::,2a00:1638:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1640::,2a00:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1650::,2a00:1657:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:1660::,2a00:1660:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:1668::,2a00:1668:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1670::,2a00:1670:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1678::,2a00:1678:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1680::,2a00:1680:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1688::,2a00:1688:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1690::,2a00:1690:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1698::,2a00:1698:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:16a0::,2a00:16a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:16a8::,2a00:16a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:16b0::,2a00:16b0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:16c8::,2a00:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:16d0::,2a00:16d0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:16d8::,2a00:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:16e0::,2a00:16e0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:16e8::,2a00:16e8:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:16f8::,2a00:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1700::,2a00:1700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1708::,2a00:1708:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1718::,2a00:1718:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1720::,2a00:1720:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1728::,2a00:172f:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:1730::,2a00:1730:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1748::,2a00:1748:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1750::,2a00:1750:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1758::,2a00:1758:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1760::,2a00:1767:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a00:1768::,2a00:176f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1778::,2a00:1778:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1780::,2a00:1780:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:1788::,2a00:1788:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1790::,2a00:1790:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1798::,2a00:1798:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:17a0::,2a00:17a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:17a8::,2a00:17a8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:17b0::,2a00:17b0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:17b8::,2a00:17bf:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:17c0::,2a00:17c0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:17c8::,2a00:17d0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:17d8::,2a00:17df:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:17e0::,2a00:17e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:17e8::,2a00:17ef:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:17f0::,2a00:17f7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:17f8::,2a00:17f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1800::,2a00:1800:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1808::,2a00:1808:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1810::,2a00:1810:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:1818::,2a00:1818:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1828::,2a00:1828:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1830::,2a00:1830:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1838::,2a00:1838:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1840::,2a00:1840:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:1848::,2a00:1848:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1850::,2a00:1857:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a00:1858::,2a00:1858:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:1860::,2a00:1860:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1868::,2a00:1868:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1878::,2a00:1878:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:1880::,2a00:1880:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:1888::,2a00:1888:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1890::,2a00:1897:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1898::,2a00:189f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:18a0::,2a00:18a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:18a8::,2a00:18a8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:18b0::,2a00:18b0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:18b8::,2a00:18b8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:18c0::,2a00:18c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:18c8::,2a00:18c8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:18d0::,2a00:18d0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:18d8::,2a00:18d8:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:18e0::,2a00:18e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:18e8::,2a00:18ef:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:18f0::,2a00:18f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:18f8::,2a00:18f8:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:1900::,2a00:1900:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1908::,2a00:1908:a0:ffff:ffff:ffff:ffff:ffff,UA -2a00:1908:a1::,2a00:1908:a1:7fff:ffff:ffff:ffff:ffff,DE -2a00:1908:a1:8000::,2a00:190f:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1910::,2a00:1917:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1918::,2a00:191f:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:1920::,2a00:1928:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1930::,2a00:1930:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1938::,2a00:1938:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1940::,2a00:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1948::,2a00:1948:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1950::,2a00:1950:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1958::,2a00:1958:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1960::,2a00:1960:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1968::,2a00:196f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1970::,2a00:1970:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1978::,2a00:1978:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1980::,2a00:1987:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1988::,2a00:1988:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1990::,2a00:1990:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1998::,2a00:1998:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:19a0::,2a00:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:19a8::,2a00:19a8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:19b0::,2a00:19b0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:19b8::,2a00:19b8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:19c0::,2a00:19c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:19c8::,2a00:19c8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:19d0::,2a00:19d7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:19d8::,2a00:19d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:19e0::,2a00:19e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:19e8::,2a00:19e8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:19f0::,2a00:19f0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:19f8::,2a00:19f8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1a00::,2a00:1a00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1a08::,2a00:1a08:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a00:1a10::,2a00:1a17:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a18::,2a00:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1a20::,2a00:1a27:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1a28::,2a00:1a28:200f:ffff:ffff:ffff:ffff:ffff,SE -2a00:1a28:2010::,2a00:1a28:2010:7fff:ffff:ffff:ffff:ffff,NO -2a00:1a28:2010:8000::,2a00:1a28:23ff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1a28:2400::,2a00:1a28:24ff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1a28:2500::,2a00:1a28:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1a30::,2a00:1a30:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a38::,2a00:1a38:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1a40::,2a00:1a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1a48::,2a00:1a48:7803:107:65bb:ffff:ffff:ffff,GB -2a00:1a48:7803:107:65bc::,2a00:1a48:7803:107:65bc:ffff:ffff:ffff,DE -2a00:1a48:7803:107:65bd::,2a00:1a48:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a50::,2a00:1a50:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1a58::,2a00:1a58:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1a60::,2a00:1a60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1a68::,2a00:1a68:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1a70::,2a00:1a70:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1a78::,2a00:1a78:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1a80::,2a00:1a80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a88::,2a00:1a88:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1a90::,2a00:1a90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a98::,2a00:1a98:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:1aa0::,2a00:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1aa8::,2a00:1aaf:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1ab0::,2a00:1ab0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1ab8::,2a00:1ab8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1ac0::,2a00:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1ac8::,2a00:1ac8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1ad0::,2a00:1ad0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:1ad8::,2a00:1ad8:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1ae0::,2a00:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1ae8::,2a00:1ae8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1af0::,2a00:1af7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:1af8::,2a00:1af8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b00::,2a00:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:1b08::,2a00:1b08:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b10::,2a00:1b17:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1b18::,2a00:1b18:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1b20::,2a00:1b20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1b28::,2a00:1b28:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1b30::,2a00:1b30:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b38::,2a00:1b38:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1b40::,2a00:1b40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1b48::,2a00:1b48:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b50::,2a00:1b50:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1b58::,2a00:1b58:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1b60::,2a00:1b60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1b68::,2a00:1b68:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b70::,2a00:1b70:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1b78::,2a00:1b78:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b80::,2a00:1b87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:1b88::,2a00:1b88:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1b90::,2a00:1b90:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:1b98::,2a00:1b98:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1ba0::,2a00:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1ba8::,2a00:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1bb0::,2a00:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1bb8::,2a00:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:1bc0::,2a00:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1bc8::,2a00:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1bd0::,2a00:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1bd8::,2a00:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1be0::,2a00:1be0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1be8::,2a00:1bef:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1bf0::,2a00:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1bf8::,2a00:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1c00::,2a00:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1c08::,2a00:1c08:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1c10::,2a00:1c10:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1c18::,2a00:1c1f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1c20::,2a00:1c20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1c28::,2a00:1c28:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c30::,2a00:1c30:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1c38::,2a00:1c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1c40::,2a00:1c40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1c48::,2a00:1c49:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c50::,2a00:1c50:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1c58::,2a00:1c58:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1c60::,2a00:1c60:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1c70::,2a00:1c70:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c78::,2a00:1c7f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c80::,2a00:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1c88::,2a00:1c88:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c90::,2a00:1c90:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1c98::,2a00:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1ca0::,2a00:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1ca8::,2a00:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1cb0::,2a00:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1cb8::,2a00:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:1cc0::,2a00:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a00:1cc8::,2a00:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1cd0::,2a00:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1cd8::,2a00:1cdf:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1ce0::,2a00:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1ce8::,2a00:1ce8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1cf0::,2a00:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1cf8::,2a00:1cff:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:1d00::,2a00:1d00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1d08::,2a00:1d08:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1d10::,2a00:1d10:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:1d18::,2a00:1d18:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1d20::,2a00:1d27:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1d28::,2a00:1d28:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1d30::,2a00:1d37:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:1d38::,2a00:1d38:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1d40::,2a00:1d40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1d48::,2a00:1d48:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1d50::,2a00:1d50:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1d58::,2a00:1d58:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:1d60::,2a00:1d60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1d68::,2a00:1d68:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1d70::,2a00:1d70:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:1d78::,2a00:1d78:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1d80::,2a00:1d80:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1d88::,2a00:1d88:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1d90::,2a00:1d90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1da0::,2a00:1da0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1da8::,2a00:1da8:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1db0::,2a00:1db0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1db8::,2a00:1db8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1dc0::,2a00:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:1dc8::,2a00:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1dd0::,2a00:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1dd8::,2a00:1ddf:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:1de0::,2a00:1de0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1de8::,2a00:1de8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1df0::,2a00:1df0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1df8::,2a00:1df8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1e00::,2a00:1e00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1e08::,2a00:1e08:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1e10::,2a00:1e10:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1e18::,2a00:1e1f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1e20::,2a00:1e27:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1e28::,2a00:1e28:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1e30::,2a00:1e30:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1e38::,2a00:1e38:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1e40::,2a00:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:1e48::,2a00:1e48:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1e50::,2a00:1e50:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1e58::,2a00:1e58:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1e60::,2a00:1e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1e68::,2a00:1e6f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1e70::,2a00:1e70:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1e78::,2a00:1e78:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1e80::,2a00:1e80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1e88::,2a00:1e88:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1e90::,2a00:1e90:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1e98::,2a00:1e9f:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1ea0::,2a00:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1ea8::,2a00:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1eb0::,2a00:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:1eb8::,2a00:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:1ec0::,2a00:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a00:1ec8::,2a00:1ecf:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1ed0::,2a00:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:1ed8::,2a00:1edf:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:1ee0::,2a00:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1ee8::,2a00:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a00:1ef8::,2a00:1eff:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:1f00::,2a00:1f00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1f08::,2a00:1f08:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1f10::,2a00:1f10:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1f18::,2a00:1f1f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:1f20::,2a00:1f20:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:1f28::,2a00:1f28:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a00:1f30::,2a00:1f37:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1f38::,2a00:1f38:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1f40::,2a00:1f47:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:1f48::,2a00:1f4f:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1f50::,2a00:1f50:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:1f58::,2a00:1f5f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1f60::,2a00:1f67:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1f68::,2a00:1f68:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:1f70::,2a00:1f70:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1f78::,2a00:1f7f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1f80::,2a00:1f80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:1f88::,2a00:1f88:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1f90::,2a00:1f90:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:1f98::,2a00:1f98:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:1fa0::,2a00:1fa7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1fa8::,2a00:1fa8:ffff:ffff:ffff:ffff:ffff:ffff,GL -2a00:1fb0::,2a00:1fb7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1fb8::,2a00:1fb8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1fc0::,2a00:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1fd0::,2a00:1fd0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1fd8::,2a00:1fd8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1fe0::,2a00:1fe0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:1fe8::,2a00:1fe8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1ff0::,2a00:1ff0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1ff8::,2a00:1ff8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:2000::,2a00:23c0:3cb3:7fff:ffff:ffff:ffff:ffff,GB -2a00:23c0:3cb3:8000::,2a00:23c0:3cb3:ffff:ffff:ffff:ffff:ffff,US -2a00:23c0:3cb4::,2a00:23c3:49e9:ffff:ffff:ffff:ffff:ffff,GB -2a00:23c3:49ea::,2a00:23c3:49ea:7fff:ffff:ffff:ffff:ffff,CZ -2a00:23c3:49ea:8000::,2a00:23c3:6956:7fff:ffff:ffff:ffff:ffff,GB -2a00:23c3:6956:8000::,2a00:23c3:6956:ffff:ffff:ffff:ffff:ffff,DE -2a00:23c3:6957::,2a00:23c4:5a1a:ffff:ffff:ffff:ffff:ffff,GB -2a00:23c4:5a1b::,2a00:23c4:5a1b:7fff:ffff:ffff:ffff:ffff,US -2a00:23c4:5a1b:8000::,2a00:23c5:754:ffff:ffff:ffff:ffff:ffff,GB -2a00:23c5:755::,2a00:23c5:755:7fff:ffff:ffff:ffff:ffff,US -2a00:23c5:755:8000::,2a00:23c5:ca6:ffff:ffff:ffff:ffff:ffff,GB -2a00:23c5:ca7::,2a00:23c5:ca7:3fff:ffff:ffff:ffff:ffff,NO -2a00:23c5:ca7:4000::,2a00:23c5:68c3:7fff:ffff:ffff:ffff:ffff,GB -2a00:23c5:68c3:8000::,2a00:23c5:68c3:ffff:ffff:ffff:ffff:ffff,MY -2a00:23c5:68c4::,2a00:23ff:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4000::,2a00:4000:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:4020::,2a00:4020:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:4040::,2a00:4040:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4060::,2a00:4067:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4080::,2a00:4087:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:40a0::,2a00:40a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:40c0::,2a00:40c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:40e0::,2a00:40e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4100::,2a00:4100:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4120::,2a00:4120:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:4140::,2a00:4147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:4160::,2a00:4160:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4180::,2a00:4180:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:41a0::,2a00:41a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:41c0::,2a00:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:41e0::,2a00:41e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4200::,2a00:4200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4220::,2a00:4220:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4240::,2a00:4240:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4260::,2a00:4260:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:4280::,2a00:4280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:42a0::,2a00:42a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:42c0::,2a00:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:42e0::,2a00:42e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4300::,2a00:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4320::,2a00:4320:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4340::,2a00:4340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4360::,2a00:4360:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:4380::,2a00:4387:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:43a0::,2a00:43a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:43c0::,2a00:43c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:43e0::,2a00:43e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4400::,2a00:4400:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:4420::,2a00:4420:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4440::,2a00:4440:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:4460::,2a00:4460:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:4480::,2a00:4480:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:44a0::,2a00:44a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:44c0::,2a00:44c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:44e0::,2a00:44e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4500::,2a00:4500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4520::,2a00:4527:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a00:4540::,2a00:4540:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:4560::,2a00:4560:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4580::,2a00:4580:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:45a0::,2a00:45a0:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a00:45c0::,2a00:45c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:45e0::,2a00:45e7:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a00:4600::,2a00:4600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4620::,2a00:4620:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:4640::,2a00:4647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4660::,2a00:4660:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4680::,2a00:4680:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:46a0::,2a00:46a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:46c0::,2a00:46c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:46e0::,2a00:46e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4700::,2a00:4700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4720::,2a00:4720:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4740::,2a00:4740:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:4760::,2a00:4760:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4780::,2a00:4780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:47a0::,2a00:47a0:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a00:47c0::,2a00:47c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:47e0::,2a00:47e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:4800::,2a00:4807:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:4820::,2a00:4820:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:4840::,2a00:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4860::,2a00:4860:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4880::,2a00:4880:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:48a0::,2a00:48a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:48c0::,2a00:48c0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:48e0::,2a00:48e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:4900::,2a00:4900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4920::,2a00:4920:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4940::,2a00:4940:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:4960::,2a00:4960:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4980::,2a00:4987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:49c0::,2a00:49c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:49e0::,2a00:49e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4a00::,2a00:4a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4a20::,2a00:4a20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4a40::,2a00:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:4a60::,2a00:4a60:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:4a80::,2a00:4a80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4aa0::,2a00:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4ac0::,2a00:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4ae0::,2a00:4ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4b00::,2a00:4b00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4b20::,2a00:4b20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:4b40::,2a00:4b40:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:4b60::,2a00:4b60:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a00:4b80::,2a00:4b80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4ba0::,2a00:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:4bc0::,2a00:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:4be0::,2a00:4be0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:4c00::,2a00:4c00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4c20::,2a00:4c20:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:4c40::,2a00:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4c60::,2a00:4c60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:4c80::,2a00:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:4ca0::,2a00:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4cc0::,2a00:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:4ce0::,2a00:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4d00::,2a00:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:4d20::,2a00:4d20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4d40::,2a00:4d40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4d60::,2a00:4d60:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:4d80::,2a00:4d80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4da0::,2a00:4da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4dc0::,2a00:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:4de0::,2a00:4de7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4e00::,2a00:4e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4e20::,2a00:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:4e40::,2a00:4e40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:4e60::,2a00:4e60:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:4e80::,2a00:4e80:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:4ea0::,2a00:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:4ec0::,2a00:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:4ee0::,2a00:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:4f00::,2a00:4f00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:4f20::,2a00:4f20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:4f40::,2a00:4f40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4f60::,2a00:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:4f80::,2a00:4f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:4fa0::,2a00:4fa7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4fc0::,2a00:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4fe0::,2a00:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:5000::,2a00:5007:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:5020::,2a00:5020:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5060::,2a00:5060:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5080::,2a00:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:50a0::,2a00:50a0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:50c0::,2a00:50c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:50e0::,2a00:50e7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:5100::,2a00:5100:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:5120::,2a00:5120:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5140::,2a00:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5160::,2a00:5160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5180::,2a00:5180:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:51a0::,2a00:51a0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:51c0::,2a00:51c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:51e0::,2a00:51e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:5200::,2a00:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5220::,2a00:5220:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:5240::,2a00:5240:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:5260::,2a00:5260:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5280::,2a00:5280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:52a0::,2a00:52a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:52c0::,2a00:52c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:52e0::,2a00:52e0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:5300::,2a00:5300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5320::,2a00:5320:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:5340::,2a00:5340:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5360::,2a00:5360:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:5380::,2a00:5380:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:53a0::,2a00:53a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:53c0::,2a00:53c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5400::,2a00:5400:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:5420::,2a00:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5440::,2a00:5440:ffff:ffff:ffff:ffff:ffff:ffff,US -2a00:5480::,2a00:5487:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:54a0::,2a00:54a0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:54c0::,2a00:54c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:54e0::,2a00:54e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5500::,2a00:5500::7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:0:8000::,2a00:5500:1:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:2::,2a00:5500:2:7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:2:8000::,2a00:5500:1fff:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:2000::,2a00:5500:2000:7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:2000:8000::,2a00:5500:80f1:7fff:ffff:ffff:ffff:ffff,FI -2a00:5500:80f1:8000::,2a00:5500:80f1:ffff:ffff:ffff:ffff:ffff,AX -2a00:5500:80f2::,2a00:5500:80f3:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:80f4::,2a00:5500:80f4:ffff:ffff:ffff:ffff:ffff,AX -2a00:5500:80f5::,2a00:5500:80f5:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:80f6::,2a00:5500:80f6:7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:80f6:8000::,2a00:5500:80f6:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:80f7::,2a00:5500:80f7:7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:80f7:8000::,2a00:5500:80f7:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:80f8::,2a00:5500:80fa:7fff:ffff:ffff:ffff:ffff,AX -2a00:5500:80fa:8000::,2a00:5500:80fa:ffff:ffff:ffff:ffff:ffff,FI -2a00:5500:80fb::,2a00:5500:80fe:ffff:ffff:ffff:ffff:ffff,AX -2a00:5500:80ff::,2a00:5500:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:5520::,2a00:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5540::,2a00:5540:385:ffff:ffff:ffff:ffff:ffff,GB -2a00:5540:386::,2a00:5540:387:ffff:ffff:ffff:ffff:ffff,SI -2a00:5540:388::,2a00:5540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5560::,2a00:5560:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5580::,2a00:5580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55a0::,2a00:55a0:e9ff:ffff:ffff:ffff:ffff:ffff,IL -2a00:55a0:ea00::,2a00:55a0:eaff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55a0:eb00::,2a00:55a0:efff:ffff:ffff:ffff:ffff:ffff,IL -2a00:55a0:f000::,2a00:55a0:f0ff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55a0:f100::,2a00:55a0:f8ff:ffff:ffff:ffff:ffff:ffff,IL -2a00:55a0:f900::,2a00:55a0:f9ff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55a0:fa00::,2a00:55a0:feff:ffff:ffff:ffff:ffff:ffff,IL -2a00:55a0:ff00::,2a00:55a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55c0::,2a00:55c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:55e0::,2a00:55e0:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a00:5600::,2a00:5600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5620::,2a00:5620:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5640::,2a00:5647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5680::,2a00:5680:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:56a0::,2a00:56a0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:56c0::,2a00:56c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:56e0::,2a00:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:5700::,2a00:5700:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a00:5720::,2a00:5720:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5740::,2a00:5740:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:5760::,2a00:5760:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5780::,2a00:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:57a0::,2a00:57a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:57e0::,2a00:57e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:5800::,2a00:5800:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:5820::,2a00:5820:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5840::,2a00:5840:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5860::,2a00:5860:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5880::,2a00:5887:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:58c0::,2a00:58c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:58e0::,2a00:58e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5900::,2a00:5900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5920::,2a00:5920:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:5940::,2a00:5940:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:5960::,2a00:5960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5980::,2a00:5980:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:59a0::,2a00:59a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:59c0::,2a00:59c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:59e0::,2a00:59e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5a00::,2a00:5a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5a20::,2a00:5a20:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:5a40::,2a00:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5a60::,2a00:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5a80::,2a00:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5aa0::,2a00:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:5ac0::,2a00:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:5ae0::,2a00:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:5b00::,2a00:5b07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5b20::,2a00:5b20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:5b40::,2a00:5b40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5b60::,2a00:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5b80::,2a00:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5ba0::,2a00:5ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5bc0::,2a00:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5be0::,2a00:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5c00::,2a00:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:5c20::,2a00:5c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:5c40::,2a00:5c47:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a00:5c60::,2a00:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5c80::,2a00:5c80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5ca0::,2a00:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:5cc0::,2a00:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5ce0::,2a00:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5d00::,2a00:5d00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:5d20::,2a00:5d20:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:5d40::,2a00:5d40:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:5d60::,2a00:5d60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5d80::,2a00:5d80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5da0::,2a00:5da0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a00:5dc0::,2a00:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:5de0::,2a00:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5e00::,2a00:5e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5e40::,2a00:5e40:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:5e60::,2a00:5e60:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:5e80::,2a00:5e80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:5ea0::,2a00:5ea7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:5ec0::,2a00:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:5ee0::,2a00:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:5f00::,2a00:5f00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:5f20::,2a00:5f20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:5f40::,2a00:5f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5f80::,2a00:5f80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5fa0::,2a00:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:5fc0::,2a00:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:5fe0::,2a00:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:6000::,2a00:6000:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6020::,2a00:6020:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6040::,2a00:6040:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:6060::,2a00:6060:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6080::,2a00:6080:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:60a0::,2a00:60a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:60c0::,2a00:60c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:60e0::,2a00:60e0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:6100::,2a00:6100:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6120::,2a00:6120:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:6140::,2a00:6140:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6160::,2a00:6160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6180::,2a00:6187:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:61a0::,2a00:61a7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:61c0::,2a00:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:61e0::,2a00:61e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6200::,2a00:6207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6220::,2a00:6220:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:6240::,2a00:6240:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6260::,2a00:6260:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:6280::,2a00:6280:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:62a0::,2a00:62a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:62c0::,2a00:62c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:62e0::,2a00:62e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6300::,2a00:6300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6320::,2a00:6320:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6340::,2a00:6340:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:6360::,2a00:6360:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6380::,2a00:6380:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:63a0::,2a00:63a0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:63c0::,2a00:63c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:63e0::,2a00:63e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6400::,2a00:6400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6420::,2a00:6420:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6440::,2a00:6440:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a00:6460::,2a00:6460:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:6480::,2a00:6480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:64a0::,2a00:64a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:64c0::,2a00:64c0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:64e0::,2a00:64e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:6500::,2a00:6507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:6520::,2a00:6520:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6540::,2a00:6540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6560::,2a00:6560:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6580::,2a00:6580:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:65a0::,2a00:65a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:65c0::,2a00:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:65e0::,2a00:65e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6600::,2a00:6600:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a00:6620::,2a00:6620:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:6640::,2a00:6647:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6660::,2a00:6660:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:6680::,2a00:6680:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:66a0::,2a00:66a0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:66c0::,2a00:66c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:66e0::,2a00:66e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:6700::,2a00:6700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6720::,2a00:6720:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6740::,2a00:6740:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:6760::,2a00:6760:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6780::,2a00:6780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:67a0::,2a00:67a7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:67c0::,2a00:67c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:67e0::,2a00:67e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6800::,2a00:6800:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6820::,2a00:6820:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6860::,2a00:6867:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6880::,2a00:6880:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:68a0::,2a00:68a0:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:68c0::,2a00:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:68e0::,2a00:68e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6900::,2a00:6907:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6920::,2a00:6920:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:6940::,2a00:6940:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6960::,2a00:6960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:6980::,2a00:6980:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:69a0::,2a00:69a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:69c0::,2a00:69c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:69e0::,2a00:69e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6a00::,2a00:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:6a20::,2a00:6a20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:6a40::,2a00:6a40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6a60::,2a00:6a60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:6a80::,2a00:6a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6ac0::,2a00:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6ae0::,2a00:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:6b00::,2a00:6b00:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:6b20::,2a00:6b20:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:6b40::,2a00:6b40:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:6b80::,2a00:6b87:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:6ba0::,2a00:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:6bc0::,2a00:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:6be0::,2a00:6be0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6c00::,2a00:6c00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6c20::,2a00:6c20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6c40::,2a00:6c40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:6c60::,2a00:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6c80::,2a00:6c80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6cc0::,2a00:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:6ce0::,2a00:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6d00::,2a00:6d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6d20::,2a00:6d20:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:6d40::,2a00:6d46:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:6d47::,2a00:6d47:fff:ffff:ffff:ffff:ffff:ffff,PL -2a00:6d47:1000::,2a00:6d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:6d60::,2a00:6d60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:6d80::,2a00:6d80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:6da0::,2a00:6da0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6dc0::,2a00:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:6de0::,2a00:6de0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6e00::,2a00:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6e20::,2a00:6e20:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:6e40::,2a00:6e40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:6e60::,2a00:6e60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6e80::,2a00:6e80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:6ea0::,2a00:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6ec0::,2a00:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:6ee0::,2a00:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6f00::,2a00:6f00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:6f20::,2a00:6f20:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:6f40::,2a00:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:6f60::,2a00:6f60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6f80::,2a00:6f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:6fa0::,2a00:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:6fc0::,2a00:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6fe0::,2a00:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7000::,2a00:7000:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:7020::,2a00:7020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7040::,2a00:7040:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:7060::,2a00:7060:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7080::,2a00:7080:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:70a0::,2a00:70a0:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a00:70c0::,2a00:70c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:70e0::,2a00:70e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:7100::,2a00:7100:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7120::,2a00:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7140::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7160::,2a00:7160:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a00:7180::,2a00:7180:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:71a0::,2a00:71a7:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:71c0::,2a00:71c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:71e0::,2a00:71e0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:7200::,2a00:7200:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7220::,2a00:7220:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:7240::,2a00:7243:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:7260::,2a00:7267:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7280::,2a00:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:72a0::,2a00:72a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:72c0::,2a00:72c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:72e0::,2a00:72e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7300::,2a00:7300:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:7320::,2a00:7327:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:7340::,2a00:7340:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:7360::,2a00:7360:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:7380::,2a00:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:73a0::,2a00:73a0:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:73c0::,2a00:73c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:73e0::,2a00:73e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:7400::,2a00:7400:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:7420::,2a00:7420:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7440::,2a00:7447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7460::,2a00:7460:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7480::,2a00:7480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:74a0::,2a00:74a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:74c0::,2a00:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:74e0::,2a00:74e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7500::,2a00:7500:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7520::,2a00:7520:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:7540::,2a00:7540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7560::,2a00:7560:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:7580::,2a00:7580:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:75c0::,2a00:75c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:75e0::,2a00:75e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:7600::,2a00:7600:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:7620::,2a00:7620:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7640::,2a00:7640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7660::,2a00:7667:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:7680::,2a00:7680:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:76a0::,2a00:76a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:76c0::,2a00:76c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:76e0::,2a00:76e0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:7700::,2a00:7700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7720::,2a00:7720:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7740::,2a00:7740:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7760::,2a00:7767:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7780::,2a00:7780:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:77a0::,2a00:77a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:77c0::,2a00:77c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:77e0::,2a00:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7800::,2a00:7800:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:7820::,2a00:7820:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7840::,2a00:7840:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:7860::,2a00:7860:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7880::,2a00:7880:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:78a0::,2a00:78a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:78c0::,2a00:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:78e0::,2a00:78e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7900::,2a00:7900:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7920::,2a00:7920:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:7940::,2a00:7940:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7960::,2a00:7960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:79a0::,2a00:79a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:79c0::,2a00:79c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:79e0::,2a00:79e0::ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:1::,2a00:79e0:1:7fff:ffff:ffff:ffff:ffff,CZ -2a00:79e0:1:8000::,2a00:79e0:2:7fff:ffff:ffff:ffff:ffff,PL -2a00:79e0:2:8000::,2a00:79e0:2:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:3::,2a00:79e0:3:7fff:ffff:ffff:ffff:ffff,IE -2a00:79e0:3:8000::,2a00:79e0:3:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:4::,2a00:79e0:4:7fff:ffff:ffff:ffff:ffff,FI -2a00:79e0:4:8000::,2a00:79e0:5:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:6::,2a00:79e0:6:7fff:ffff:ffff:ffff:ffff,GB -2a00:79e0:6:8000::,2a00:79e0:a:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:b::,2a00:79e0:b:ffff:ffff:ffff:ffff:ffff,IT -2a00:79e0:c::,2a00:79e0:c:7fff:ffff:ffff:ffff:ffff,CH -2a00:79e0:c:8000::,2a00:79e0:c:ffff:ffff:ffff:ffff:ffff,IE -2a00:79e0:d::,2a00:79e0:d:ffff:ffff:ffff:ffff:ffff,GB -2a00:79e0:e::,2a00:79e0:13:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:14::,2a00:79e0:14:ffff:ffff:ffff:ffff:ffff,ZA -2a00:79e0:15::,2a00:79e0:15:ffff:ffff:ffff:ffff:ffff,DE -2a00:79e0:16::,2a00:79e0:17:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:18::,2a00:79e0:18:7fff:ffff:ffff:ffff:ffff,NO -2a00:79e0:18:8000::,2a00:79e0:19:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:1a::,2a00:79e0:1a:7fff:ffff:ffff:ffff:ffff,IE -2a00:79e0:1a:8000::,2a00:79e0:1b:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:1c::,2a00:79e0:1c:ffff:ffff:ffff:ffff:ffff,GH -2a00:79e0:1d::,2a00:79e0:1e:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:1f::,2a00:79e0:1f:ffff:ffff:ffff:ffff:ffff,LT -2a00:79e0:20::,2a00:79e0:22:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:23::,2a00:79e0:23:ffff:ffff:ffff:ffff:ffff,GB -2a00:79e0:24::,2a00:79e0:26:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:27::,2a00:79e0:27:ffff:ffff:ffff:ffff:ffff,NL -2a00:79e0:28::,2a00:79e0:30:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:31::,2a00:79e0:31:ffff:ffff:ffff:ffff:ffff,SK -2a00:79e0:32::,2a00:79e0:3f:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e0:40::,2a00:79e0:40:7fff:ffff:ffff:ffff:ffff,IE -2a00:79e0:40:8000::,2a00:79e0:ffe2:4ff:ffff:ffff:ffff:ffff,CH -2a00:79e0:ffe2:500::,2a00:79e0:ffe2:5ff:ffff:ffff:ffff:ffff,IE -2a00:79e0:ffe2:600::,2a00:79e1:abb:ffff:ffff:ffff:ffff:ffff,CH -2a00:79e1:abc::,2a00:79e1:abc:ff:ffff:ffff:ffff:ffff,GB -2a00:79e1:abc:100::,2a00:79e1:abc:7fff:ffff:ffff:ffff:ffff,US -2a00:79e1:abc:8000::,2a00:79e1:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:7a00::,2a00:7a00:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:7a20::,2a00:7a20:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:7a40::,2a00:7a40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7a60::,2a00:7a60:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:7a80::,2a00:7a80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:7aa0::,2a00:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7ac0::,2a00:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7ae0::,2a00:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7b00::,2a00:7b07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7b40::,2a00:7b40:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:7b60::,2a00:7b60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7b80::,2a00:7b80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7ba0::,2a00:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7bc0::,2a00:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:7be0::,2a00:7be0:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a00:7c00::,2a00:7c00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7c20::,2a00:7c20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7c40::,2a00:7c40:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:7c60::,2a00:7c60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7c80::,2a00:7c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7ca0::,2a00:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:7cc0::,2a00:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7ce0::,2a00:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7d00::,2a00:7d00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:7d20::,2a00:7d20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:7d40::,2a00:7d40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:7d80::,2a00:7d87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:7da0::,2a00:7da0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:7dc0::,2a00:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7de0::,2a00:7de0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:7e00::,2a00:7e00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:7e20::,2a00:7e20:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:7e40::,2a00:7e40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7e60::,2a00:7e60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7e80::,2a00:7e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:7ea0::,2a00:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:7ec0::,2a00:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7ee0::,2a00:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7f00::,2a00:7f00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7f20::,2a00:7f20:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:7f40::,2a00:7f40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:7f60::,2a00:7f60:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:7f80::,2a00:7f87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:7fc0::,2a00:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:7fe0::,2a00:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:8000::,2a00:8000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8020::,2a00:8020:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8040::,2a00:8040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8060::,2a00:8060:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8080::,2a00:8080:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:80a0::,2a00:80a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:80c0::,2a00:80c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:80e0::,2a00:80e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8100::,2a00:8100:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:8120::,2a00:8120:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8140::,2a00:8140:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8160::,2a00:8160:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:8180::,2a00:8180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:81a0::,2a00:81a7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:81c0::,2a00:81c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:81e0::,2a00:81e0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:8200::,2a00:8200:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:8220::,2a00:8220:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:8240::,2a00:8247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8260::,2a00:8260:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8280::,2a00:8280:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:82a0::,2a00:82a0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:82c0::,2a00:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:82e0::,2a00:82e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8300::,2a00:8300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8320::,2a00:8320:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:8340::,2a00:8340:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:8360::,2a00:8360:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:8380::,2a00:8380:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:83a0::,2a00:83a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:83c0::,2a00:83c0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:83e0::,2a00:83e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8400::,2a00:8400:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:8420::,2a00:8420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8440::,2a00:8440:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8460::,2a00:8460:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8480::,2a00:8480:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:84a0::,2a00:84a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:84c0::,2a00:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:84e0::,2a00:84e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8500::,2a00:8500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8520::,2a00:8520:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:8540::,2a00:8540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8580::,2a00:8580:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:85a0::,2a00:85a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:85c0::,2a00:85c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:85e0::,2a00:85e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:8600::,2a00:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8620::,2a00:8620:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:8640::,2a00:8647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8680::,2a00:8680:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:86a0::,2a00:86a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:86c0::,2a00:86c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:86e0::,2a00:86e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8700::,2a00:8707:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a00:8720::,2a00:8720:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:8740::,2a00:8740:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8760::,2a00:8760:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8780::,2a00:8780:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:87a0::,2a00:87a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:87c0::,2a00:87c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:87e0::,2a00:87e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8820::,2a00:8820:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:8840::,2a00:8840:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a00:8860:8007::,2a00:8860:8007:7fff:ffff:ffff:ffff:ffff,NL -2a00:8880::,2a00:8880:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:88a0::,2a00:88a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:88c0::,2a00:88c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:88e0::,2a00:88e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8900::,2a00:8900:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8920::,2a00:8920:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8940::,2a00:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8960::,2a00:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8980::,2a00:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:89a0::,2a00:89a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:89c0::,2a00:89c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:89e0::,2a00:89e0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:8a00::,2a00:8a00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:8a20::,2a00:8a20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:8a40::,2a00:8a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:8a60::,2a00:8a60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8a80::,2a00:8a87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8aa0::,2a00:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8ac0::,2a00:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:8ae0::,2a00:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8b00::,2a00:8b00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8b20::,2a00:8b20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8b40::,2a00:8b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8b60::,2a00:8b60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8b80::,2a00:8b80:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:8ba0::,2a00:8ba0:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:8be0::,2a00:8be7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:8c00::,2a00:8c00:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:8c20::,2a00:8c20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8c40::,2a00:8c40:242:ffff:ffff:ffff:ffff:ffff,GB -2a00:8c40:243::,2a00:8c40:243:7fff:ffff:ffff:ffff:ffff,FR -2a00:8c40:243:8000::,2a00:8c40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8c60::,2a00:8c60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8c80::,2a00:8c80:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:8ca0::,2a00:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:8cc0::,2a00:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8ce0::,2a00:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:8d00::,2a00:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:8d20::,2a00:8d20:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a00:8d40::,2a00:8d40:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:8d60::,2a00:8d60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:8d80::,2a00:8d80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:8da0::,2a00:8da0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:8dc0::,2a00:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:8de0::,2a00:8de7:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a00:8e00::,2a00:8e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8e20::,2a00:8e20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8e40::,2a00:8e40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8e60::,2a00:8e60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8e80::,2a00:8e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:8ea0::,2a00:8ea0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:8ec0::,2a00:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:8ee0::,2a00:8ee7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8f00::,2a00:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:8f20::,2a00:8f20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:8f40::,2a00:8f40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8f60::,2a00:8f60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:8f80::,2a00:8f80:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:8fa0::,2a00:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8fc0::,2a00:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:8fe0::,2a00:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:9000::,2a00:9000:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:9020::,2a00:9027:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:9040::,2a00:9047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9060::,2a00:9060:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:9080::,2a00:9080:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:90a0::,2a00:90a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:90c0::,2a00:90c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9100::,2a00:9100:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:9120::,2a00:9120:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a00:9140::,2a00:9140:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:9160::,2a00:9160:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:9180::,2a00:9180:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:91a0::,2a00:91a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:91c0::,2a00:91c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:91e0::,2a00:91e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:9200::,2a00:9200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:9220::,2a00:9220:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9240::,2a00:9247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9260::,2a00:9267:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:9280::,2a00:9280:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:92a0::,2a00:92a7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:92c0::,2a00:92c7:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:92e0::,2a00:92e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9300::,2a00:9300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9320::,2a00:9320:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9340::,2a00:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9360::,2a00:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9380::,2a00:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:93a0::,2a00:93a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:93c0::,2a00:93c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:93e0::,2a00:93e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:9400::,2a00:9400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9420::,2a00:9420:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:9440::,2a00:9440:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:9460::,2a00:9467:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9480::,2a00:9480:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:94a0::,2a00:94a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:94c0::,2a00:94c0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:9500::,2a00:9500:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:9520::,2a00:9520:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:9540::,2a00:9540:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:9560::,2a00:9560:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:9580::,2a00:9580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:95a0::,2a00:95a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:95c0::,2a00:95c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a00:95e0::,2a00:95e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9600::,2a00:9600:83ff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9600:8400::,2a00:9600:8400:ffff:ffff:ffff:ffff:ffff,US -2a00:9600:8401::,2a00:9600:840f:ffff:ffff:ffff:ffff:ffff,GB -2a00:9600:8410::,2a00:9600:8410:ffff:ffff:ffff:ffff:ffff,US -2a00:9600:8411::,2a00:9600:860f:ffff:ffff:ffff:ffff:ffff,GB -2a00:9600:8610::,2a00:9600:8610:ffff:ffff:ffff:ffff:ffff,DE -2a00:9600:8611::,2a00:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9620::,2a00:9620:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:9640::,2a00:9640:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:9660::,2a00:9660:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9680::,2a00:9680:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:96c0::,2a00:96c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:96e0::,2a00:96e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9700::,2a00:9700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:9720::,2a00:9720:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:9740::,2a00:9740:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9760::,2a00:9760:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:9780::,2a00:9780:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:9800::,2a00:9807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:9880::,2a00:9880:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:98a0::,2a00:98a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:98c0::,2a00:98c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:98e0::,2a00:98e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:9900::,2a00:9907:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:9920::,2a00:9927:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:9960::,2a00:9960:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:9980::,2a00:9980:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:99a0::,2a00:99a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:99c0::,2a00:99c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:99e0::,2a00:99e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9a20::,2a00:9a20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:9a40::,2a00:9a40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9a60::,2a00:9a60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:9a80::,2a00:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9aa0::,2a00:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9ac0::,2a00:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:9ae0::,2a00:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9b00::,2a00:9b00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:9b20::,2a00:9b20:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:9b40::,2a00:9b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9b60::,2a00:9b60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9b80::,2a00:9b80:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:9ba0::,2a00:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9bc0::,2a00:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:9be0::,2a00:9be0:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:9c00::,2a00:9c00:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:9c20::,2a00:9c20:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:9c60::,2a00:9c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9c80::,2a00:9c80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:9ca0::,2a00:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:9cc0::,2a00:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9ce0::,2a00:9ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9d00::,2a00:9d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9d20::,2a00:9d20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:9d40::,2a00:9d40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9d60::,2a00:9d60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9d80::,2a00:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9da0::,2a00:9da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9dc0::,2a00:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9de0::,2a00:9de0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9e00::,2a00:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9e20::,2a00:9e20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9e40::,2a00:9e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:9e60::,2a00:9e60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:9e80::,2a00:9e80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:9ea0::,2a00:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9ec0::,2a00:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:9ee0::,2a00:9ee0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:9f00::,2a00:9f00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:9f20::,2a00:9f20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:9f40::,2a00:9f47:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:9f60::,2a00:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:9f80::,2a00:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9fa0::,2a00:9fa7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:9fc0::,2a00:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:9fe0::,2a00:9fe7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:a000::,2a00:a000:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a020::,2a00:a020:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a040::,2a00:a040:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:a060::,2a00:a060:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a080::,2a00:a080:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a0a0::,2a00:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a0c0::,2a00:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a0e0::,2a00:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a100::,2a00:a100:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:a120::,2a00:a120:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a140::,2a00:a140:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:a160::,2a00:a160:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:a180::,2a00:a180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a1a0::,2a00:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:a1c0::,2a00:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:a1e0::,2a00:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a200::,2a00:a200:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a220::,2a00:a220:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a240::,2a00:a240:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:a260::,2a00:a260:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:a280::,2a00:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a2a0::,2a00:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:a2c0::,2a00:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a2e0::,2a00:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a300::,2a00:a300:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:a320::,2a00:a320:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a340::,2a00:a340:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a360::,2a00:a361:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:a380::,2a00:a380:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:a3a0::,2a00:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a3e0::,2a00:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:a400::,2a00:a400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a420::,2a00:a420:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:a440::,2a00:a440:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:a460::,2a00:a460:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:a4a0::,2a00:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a4c0::,2a00:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a4e0::,2a00:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a500::,2a00:a500:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:a520::,2a00:a520:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a540::,2a00:a540:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:a560::,2a00:a560:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:a580::,2a00:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a5a0::,2a00:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:a5c0::,2a00:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a5e0::,2a00:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:a600::,2a00:a607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a620::,2a00:a620:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a640::,2a00:a640:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a660::,2a00:a660:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a680::,2a00:a680:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:a6a0::,2a00:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:a6c0::,2a00:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a6e0::,2a00:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a700::,2a00:a700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a720::,2a00:a720:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:a740::,2a00:a740:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:a760::,2a00:a760:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:a780::,2a00:a780:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a7a0::,2a00:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:a7c0::,2a00:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a7e0::,2a00:a7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:a800::,2a00:a800:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a820::,2a00:a820:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a840::,2a00:a840:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:a860::,2a00:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a880::,2a00:a880:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:a8a0::,2a00:a8a0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:a8c0::,2a00:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:a8e0::,2a00:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a900::,2a00:a900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:a920::,2a00:a920:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:a940::,2a00:a940:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a960::,2a00:a960:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:a980::,2a00:a987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:a9a0::,2a00:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:a9c0::,2a00:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a00:a9e0::,2a00:a9e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:aa00::,2a00:aa00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:aa20::,2a00:aa20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:aa40::,2a00:aa40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:aa60::,2a00:aa60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:aa80::,2a00:aa80:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:aaa0::,2a00:aaa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:aac0::,2a00:aac0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:aae0::,2a00:aae0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ab00::,2a00:ab00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ab20::,2a00:ab20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ab40::,2a00:ab40:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a00:ab60::,2a00:ab60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ab80::,2a00:ab80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:aba0::,2a00:aba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:abc0::,2a00:abc0:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a00:abe0::,2a00:abe0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:ac00::,2a00:ac07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:ac20::,2a00:ac20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:ac40::,2a00:ac40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ac60::,2a00:ac60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ac80::,2a00:ac80:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:aca0::,2a00:aca0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:acc0::,2a00:acc0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ace0::,2a00:ace0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:ad00::,2a00:ad00:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:ad20::,2a00:ad20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ad40::,2a00:ad47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ad60::,2a00:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ad80::,2a00:ad87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:adc0::,2a00:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:ade0::,2a00:ade0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:ae00::,2a00:ae07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:ae20::,2a00:ae20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ae40::,2a00:ae40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ae60::,2a00:ae60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ae80::,2a00:ae80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:aea0::,2a00:aea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:aec0::,2a00:aec0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:aee0::,2a00:aee7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:af00::,2a00:af00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:af20::,2a00:af20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:af40::,2a00:af40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:af60::,2a00:af60:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:af80::,2a00:af80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:afa0::,2a00:afa0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:afc0::,2a00:afc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:afe0::,2a00:afe0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b000::,2a00:b000:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:b020::,2a00:b020:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a00:b040::,2a00:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b060::,2a00:b060:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:b080::,2a00:b080:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:b0a0::,2a00:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:b0c0::,2a00:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:b0e0::,2a00:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b120::,2a00:b120:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b140::,2a00:b140:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:b160::,2a00:b160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b180::,2a00:b180:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b1a0::,2a00:b1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b1c0::,2a00:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b1e0::,2a00:b1e0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:b200::,2a00:b200:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:b220::,2a00:b220:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:b260::,2a00:b260:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b280::,2a00:b280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b2a0::,2a00:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:b2c0::,2a00:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:b2e0::,2a00:b2e0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:b300::,2a00:b307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b320::,2a00:b320:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b340::,2a00:b340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b360::,2a00:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b380::,2a00:b380:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:b3a0::,2a00:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b3c0::,2a00:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a00:b400::,2a00:b407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b420::,2a00:b420:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:b440::,2a00:b440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b460::,2a00:b460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:b480::,2a00:b480:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:b4a0::,2a00:b4a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b4c0::,2a00:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b500::,2a00:b500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b520::,2a00:b520:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:b560::,2a00:b560:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b580::,2a00:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b5a0::,2a00:b5a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b5c0::,2a00:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:b5e0::,2a00:b5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b600::,2a00:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b640::,2a00:b640:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:b660::,2a00:b660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:b680::,2a00:b680:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:b6a0::,2a00:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b6c0::,2a00:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b6e0::,2a00:b6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b700::,2a00:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b720::,2a00:b720:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:b740::,2a00:b740:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:b760::,2a00:b760:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b780::,2a00:b780:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:b7a0::,2a00:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:b7c0::,2a00:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:b800::,2a00:b800:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a00:b820::,2a00:b820:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:b840::,2a00:b840:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b860::,2a00:b860:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:b880::,2a00:b880:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b8a0::,2a00:b8a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:b8c0::,2a00:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:b8e0::,2a00:b8e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:b900::,2a00:b900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b920::,2a00:b920:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:b940::,2a00:b940:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:b960::,2a00:b960:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:b980::,2a00:b987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b9a0::,2a00:b9a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:b9c0::,2a00:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:b9e0::,2a00:b9e0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:ba00::,2a00:ba00:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:ba20::,2a00:ba20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ba40::,2a00:ba40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ba60::,2a00:ba60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ba80::,2a00:ba80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:baa0::,2a00:baa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:bac0::,2a00:bac0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:bae0::,2a00:bae0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:bb00::,2a00:bb00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:bb20::,2a00:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:bb40::,2a00:bb40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:bb60::,2a00:bb60:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:bb80::,2a00:bb80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:bba0::,2a00:bba0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:bbc0::,2a00:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:bbe0::,2a00:bbe7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:bc00::,2a00:bc00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:bc20::,2a00:bc20:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:bc40::,2a00:bc40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:bc60::,2a00:bc60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:bc80::,2a00:bc80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:bca0::,2a00:bca0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:bcc0::,2a00:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:bce0::,2a00:bce0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:bd00::,2a00:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:bd20::,2a00:bd20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:bd40::,2a00:bd40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:bd60::,2a00:bd60:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:bd80::,2a00:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:bda0::,2a00:bda0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:bdc0::,2a00:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:bde0::,2a00:bde0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:be00::,2a00:be00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:be20::,2a00:be20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:be40::,2a00:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:be60::,2a00:be67:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:be80::,2a00:be80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:bea0::,2a00:bea0:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a00:bec0::,2a00:bec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:bf00::,2a00:bf00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:bf20::,2a00:bf20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:bf40::,2a00:bf40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:bf60::,2a00:bf60:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:bf80::,2a00:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:bfa0::,2a00:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:bfc0::,2a00:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:bfe0::,2a00:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:c000::,2a00:c000:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c020::,2a00:c020:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:c040::,2a00:c040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c060::,2a00:c060:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c080::,2a00:c080:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c0a0::,2a00:c0a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:c0c0::,2a00:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c0e0::,2a00:c0e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:c100::,2a00:c100:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:c120::,2a00:c120:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c140::,2a00:c140:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:c160::,2a00:c160:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a00:c180::,2a00:c187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:c1a0::,2a00:c1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c1c0::,2a00:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:c1e0::,2a00:c1e7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:c200::,2a00:c200:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:c220::,2a00:c220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c260::,2a00:c260:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c280::,2a00:c280:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c2c0::,2a00:c2c0:fffe:ffff:ffff:ffff:ffff:ffff,NL -2a00:c2c0:ffff::,2a00:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a00:c2c1::,2a00:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c2e0::,2a00:c2e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c300::,2a00:c307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c320::,2a00:c320:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c340::,2a00:c340:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c360::,2a00:c360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c380::,2a00:c380:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c3a0::,2a00:c3a0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:c3c0::,2a00:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:c3e0::,2a00:c3e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c400::,2a00:c400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c420::,2a00:c420:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:c440::,2a00:c447:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:c460::,2a00:c460:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c480::,2a00:c480:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:c4a0::,2a00:c4a0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:c4c0::,2a00:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c4e0::,2a00:c4e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:c500::,2a00:c500:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:c520::,2a00:c520:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c540::,2a00:c540:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:c560::,2a00:c567:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:c580::,2a00:c580:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:c5a0::,2a00:c5a7:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:c5c0::,2a00:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c5e0::,2a00:c5e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c600::,2a00:c600:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c620::,2a00:c620:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:c640::,2a00:c640:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:c660::,2a00:c660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c680::,2a00:c680:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c6a0::,2a00:c6a0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:c6c0::,2a00:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c6e0::,2a00:c6e0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:c700::,2a00:c700:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:c720::,2a00:c720:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:c740::,2a00:c740:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:c760::,2a00:c760:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:c780::,2a00:c780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:c7a0::,2a00:c7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c7c0::,2a00:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c800::,2a00:c800:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:c820::,2a00:c820:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a00:c840::,2a00:c840:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:c860::,2a00:c860:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:c880::,2a00:c880:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:c8a0::,2a00:c8a7:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a00:c8c0::,2a00:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c8e0::,2a00:c8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c900::,2a00:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c920::,2a00:c920:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:c940::,2a00:c940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:c960::,2a00:c960:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:c980::,2a00:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:c9a0::,2a00:c9a0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:c9c0::,2a00:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c9e0::,2a00:c9e0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:ca00::,2a00:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ca20::,2a00:ca20:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:ca40::,2a00:ca40:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:ca60::,2a00:ca67:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:ca80::,2a00:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:caa0::,2a00:caa0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a00:cac0::,2a00:cac0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:cae0::,2a00:cae0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:cb00::,2a00:cb00:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:cb20::,2a00:cb20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:cb40::,2a00:cb40:1:ffff:ffff:ffff:ffff:ffff,NL -2a00:cb40:2::,2a00:cb40:2:ffff:ffff:ffff:ffff:ffff,CZ -2a00:cb40:3::,2a00:cb40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:cb60::,2a00:cb60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cb80::,2a00:cb80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:cba0::,2a00:cba0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cbc0::,2a00:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cbe0::,2a00:cbe0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:cc00::,2a00:cc00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cc20::,2a00:cc20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:cc40::,2a00:cc40:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a00:cc60::,2a00:cc60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:cc80::,2a00:cc80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:cca0::,2a00:cca0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ccc0::,2a00:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cce0::,2a00:cce0:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:cd00::,2a00:cd00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cd20::,2a00:cd20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:cd40::,2a00:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:cd60::,2a00:cd60:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:cd80::,2a00:cd80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:cda0::,2a00:cda0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cdc0::,2a00:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cde0::,2a00:cde0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ce00::,2a00:ce00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:ce20::,2a00:ce27:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:ce40::,2a00:ce40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ce60::,2a00:ce60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:ce80::,2a00:ce80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:cea0::,2a00:cea0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:cec0::,2a00:cec0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:cee0::,2a00:cee7:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:cf00::,2a00:cf00:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:cf40::,2a00:cf40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:cf60::,2a00:cf60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cf80::,2a00:cf80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:cfa0::,2a00:cfa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:cfc0::,2a00:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:cfe0::,2a00:cfe0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:d000::,2a00:d007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d020::,2a00:d020:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:d040::,2a00:d040:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:d060::,2a00:d060:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:d080::,2a00:d080:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:d0a0::,2a00:d0a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:d0c0::,2a00:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d0e0::,2a00:d0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:d100::,2a00:d100:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:d120::,2a00:d120:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d140::,2a00:d140:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a00:d160::,2a00:d160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:d180::,2a00:d180:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:d1a0::,2a00:d1a0:f:ffff:ffff:ffff:ffff:ffff,DE -2a00:d1a0:10::,2a00:d1a0:1f:ffff:ffff:ffff:ffff:ffff,GB -2a00:d1a0:20::,2a00:d1a0:1ffe:ffff:ffff:ffff:ffff:ffff,DE -2a00:d1a0:1fff::,2a00:d1a0:1fff:ffff:ffff:ffff:ffff:ffff,US -2a00:d1a0:2000::,2a00:d1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d1c0::,2a00:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d1e0::,2a00:d1e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d200::,2a00:d207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d220::,2a00:d220:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d240::,2a00:d240:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:d260::,2a00:d267:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d280::,2a00:d280:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:d2a0::,2a00:d2a7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d2c0::,2a00:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:d2e0::,2a00:d2e7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d300::,2a00:d300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d320::,2a00:d327:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d340::,2a00:d340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d360::,2a00:d367:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d380::,2a00:d380:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d3a0::,2a00:d3a7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d3c0::,2a00:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:d3e0::,2a00:d3e7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d400::,2a00:d400:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:d420::,2a00:d427:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d440::,2a00:d447:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:d480::,2a00:d480:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:d4a0::,2a00:d4a7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d4c0::,2a00:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:d4e0::,2a00:d4e7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d500::,2a00:d500:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a00:d520::,2a00:d527:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d540::,2a00:d547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d560::,2a00:d567:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:d580::,2a00:d580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d5c0::,2a00:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:d5e0::,2a00:d5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d600::,2a00:d600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d620::,2a00:d620:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:d640::,2a00:d640:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d660::,2a00:d660:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:d680::,2a00:d680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d6a0::,2a00:d6a0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:d6c0::,2a00:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d6e0::,2a00:d6e0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:d700::,2a00:d700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d720::,2a00:d727:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d740::,2a00:d747:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:d780::,2a00:d780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:d7a0::,2a00:d7a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:d7c0::,2a00:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:d7e0::,2a00:d7e0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:d800::,2a00:d800:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a00:d820::,2a00:d820:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:d840::,2a00:d840:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:d860::,2a00:d860:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:d880::,2a00:d880:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d8a0::,2a00:d8a7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d8c0::,2a00:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:d8e0::,2a00:d8e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:d900::,2a00:d900:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:d920::,2a00:d920:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:d940::,2a00:d940:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:d960::,2a00:d967:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:d980::,2a00:d980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:d9a0::,2a00:d9a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:d9c0::,2a00:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:d9e0::,2a00:d9e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:da00::,2a00:da00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:da20::,2a00:da20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:da60::,2a00:da60:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a00:da80::,2a00:da80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:daa0::,2a00:daa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:dac0::,2a00:dac0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:dae0::,2a00:dae0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:db00::,2a00:db00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:db20::,2a00:db20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:db40::,2a00:db40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:db60::,2a00:db60:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:db80::,2a00:db80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:dba0::,2a00:dba0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:dbc0::,2a00:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:dbe0::,2a00:dbe0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:dc00::,2a00:dc00:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:dc20::,2a00:dc20:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a00:dc40::,2a00:dc40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:dc60::,2a00:dc60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:dc80::,2a00:dc80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:dca0::,2a00:dca7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:dcc0::,2a00:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:dd00::,2a00:dd00:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:dd20::,2a00:dd20:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:dd40::,2a00:dd40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:dd60::,2a00:dd60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:dda0::,2a00:dda0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a00:ddc0::,2a00:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:dde0::,2a00:dde0:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a00:de00::,2a00:de00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:de20::,2a00:de20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:de40::,2a00:de40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:de60::,2a00:de60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:de80::,2a00:de80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:dea0::,2a00:dea0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:dec0::,2a00:dec0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:dee0::,2a00:dee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:df00::,2a00:df07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:df20::,2a00:df20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:df40::,2a00:df40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:df60::,2a00:df60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:df80::,2a00:df80:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:dfa0::,2a00:dfa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:dfc0::,2a00:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:dfe0::,2a00:dfe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:e000::,2a00:e000:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e020::,2a00:e020:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e040::,2a00:e040:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e060::,2a00:e060:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e080::,2a00:e080:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e0c0::,2a00:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e100::,2a00:e100:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e120::,2a00:e120:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e140::,2a00:e140:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:e160::,2a00:e160:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:e180::,2a00:e180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e1a0::,2a00:e1a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e1c0::,2a00:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e1e0::,2a00:e1e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:e200::,2a00:e200:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:e220::,2a00:e220:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:e240::,2a00:e240:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e260::,2a00:e260:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e280::,2a00:e280:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:e2a0::,2a00:e2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e2c0::,2a00:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e2e0::,2a00:e2e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:e300::,2a00:e300:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:e320::,2a00:e320:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e340::,2a00:e347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e360::,2a00:e360:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:e380::,2a00:e380:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:e3a0::,2a00:e3a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:e3c0::,2a00:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a00:e3e0::,2a00:e3e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e400::,2a00:e407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e440::,2a00:e440:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e460::,2a00:e460:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e480::,2a00:e480:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:e4a0::,2a00:e4a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:e4c0::,2a00:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:e4e0::,2a00:e4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e500::,2a00:e500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e520::,2a00:e520:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e540::,2a00:e540:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:e560::,2a00:e560:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e580::,2a00:e587:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:e5a0::,2a00:e5a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:e5c0::,2a00:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:e5e0::,2a00:e5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:e600::,2a00:e600:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:e620::,2a00:e620:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e640::,2a00:e647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e680::,2a00:e680:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e6a0::,2a00:e6a0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a00:e6c0::,2a00:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e6e0::,2a00:e6e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:e700::,2a00:e700:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e720::,2a00:e720:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:e740::,2a00:e740:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e760::,2a00:e760:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e780::,2a00:e780:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:e7a0::,2a00:e7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e7c0::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:e7e0::,2a00:e7e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:e800::,2a00:e807:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:e840::,2a00:e840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e860::,2a00:e860:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a00:e880::,2a00:e880:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:e8c0::,2a00:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a00:e8e0::,2a00:e8e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:e900::,2a00:e907:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:e920::,2a00:e920:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:e940::,2a00:e940:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:e960::,2a00:e960:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e980::,2a00:e980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e9a0::,2a00:e9a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:e9c0::,2a00:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:e9e0::,2a00:e9e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ea00::,2a00:ea00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:ea20::,2a00:ea27:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ea40::,2a00:ea40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ea60::,2a00:ea60:ff:ffff:ffff:ffff:ffff:ffff,LT -2a00:ea60:100::,2a00:ea60:1ff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ea60:200::,2a00:ea60:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:ea80::,2a00:ea80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:eaa0::,2a00:eaa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:eac0::,2a00:eac0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:eae0::,2a00:eae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:eb00::,2a00:eb00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:eb20::,2a00:eb20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:eb40::,2a00:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:eb60::,2a00:eb60:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:eb80::,2a00:eb80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ebc0::,2a00:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:ebe0::,2a00:ebe0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ec00::,2a00:ec00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:ec20::,2a00:ec23:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ec40::,2a00:ec47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ec80::,2a00:ec80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:eca0::,2a00:eca0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:ecc0::,2a00:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ece0::,2a00:ece7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a00:ed00::,2a00:ed00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ed20::,2a00:ed20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ed40::,2a00:ed40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ed60::,2a00:ed60:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:ed80::,2a00:ed80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:eda0::,2a00:eda0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:edc0::,2a00:edc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ede0::,2a00:ede7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:ee00::,2a00:ee00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ee20::,2a00:ee20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ee40::,2a00:ee40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:ee60::,2a00:ee60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ee80::,2a00:ee80:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:eea0::,2a00:eea7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:eec0::,2a00:eec0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:eee0::,2a00:eee0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:ef00::,2a00:ef00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ef20::,2a00:ef20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ef60::,2a00:ef67:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:ef80::,2a00:ef80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:efa0::,2a00:efa0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:efc0::,2a00:efc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:efe0::,2a00:efe7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:f000::,2a00:f000:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:f020::,2a00:f020:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:f040::,2a00:f040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f060::,2a00:f060:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f080::,2a00:f080:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:f0a0::,2a00:f0a7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:f0c0::,2a00:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f0e0::,2a00:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a00:f100::,2a00:f100:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:f120::,2a00:f120:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:f160::,2a00:f160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f180::,2a00:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f1a0::,2a00:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:f1c0::,2a00:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f200::,2a00:f200:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:f240::,2a00:f240:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:f260::,2a00:f260:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a00:f280::,2a00:f280:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f2a0::,2a00:f2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f2c0::,2a00:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:f2e0::,2a00:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a00:f300::,2a00:f300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f320::,2a00:f320:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f340::,2a00:f340:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:f360::,2a00:f360:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f380::,2a00:f380:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:f3a0::,2a00:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:f3c0::,2a00:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f3e0::,2a00:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f400::,2a00:f400:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f420::,2a00:f420:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f440::,2a00:f440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f460::,2a00:f460:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f480::,2a00:f480:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f4a0::,2a00:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a00:f4c0::,2a00:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f4e0::,2a00:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f500::,2a00:f507:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a00:f520::,2a00:f520:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f540::,2a00:f540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f560::,2a00:f560:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:f580::,2a00:f580:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a00:f5a0::,2a00:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a00:f5c0::,2a00:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:f5e0::,2a00:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:f600::,2a00:f600:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f620::,2a00:f620:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:f640::,2a00:f640:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:f660::,2a00:f660:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f680::,2a00:f680:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:f6a0::,2a00:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f6c0::,2a00:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:f6e0::,2a00:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f700::,2a00:f707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f720::,2a00:f720:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:f740::,2a00:f740:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:f760::,2a00:f760:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:f780::,2a00:f780:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:f7a0::,2a00:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a00:f7c0::,2a00:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a00:f800::,2a00:f800:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:f820::,2a00:f827:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f840::,2a00:f840:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f860::,2a00:f860:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:f880::,2a00:f880:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f8a0::,2a00:f8a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f8c0::,2a00:f8c0:4000:ffff:ffff:ffff:ffff:ffff,LI -2a00:f8c0:4001::,2a00:f8c0:4001:7fff:ffff:ffff:ffff:ffff,AT -2a00:f8c0:4001:8000::,2a00:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a00:f8e0::,2a00:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:f900::,2a00:f907:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a00:f920::,2a00:f920:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f940::,2a00:f940:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f980::,2a00:f987:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a00:f9a0::,2a00:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f9c0::,2a00:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:f9e0::,2a00:f9e0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a00:fa00::,2a00:fa00:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:fa20::,2a00:fa20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:fa40::,2a00:fa40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fa60::,2a00:fa60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:fa80::,2a00:fa80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:faa0::,2a00:faa0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a00:fac0::,2a00:fac0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fae0::,2a00:fae0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:fb00::,2a00:fb07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:fb20::,2a00:fb20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:fb40::,2a00:fb40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:fb60::,2a00:fb60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:fb80::,2a00:fb80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fba0::,2a00:fba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fbc0::,2a00:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:fbe0::,2a00:fbe0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:fc00::,2a00:fc00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:fc20::,2a00:fc20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:fc40::,2a00:fc40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a00:fc80::,2a00:fc80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:fca0::,2a00:fca0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:fcc0::,2a00:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fce0::,2a00:fce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fd00::,2a00:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:fd20::,2a00:fd20:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a00:fd40::,2a00:fd40:5:ffff:ffff:ffff:ffff:ffff,NL -2a00:fd40:6::,2a00:fd40:7:ffff:ffff:ffff:ffff:ffff,SK -2a00:fd40:8::,2a00:fd41:5297:ffff:ffff:ffff:ffff:ffff,NL -2a00:fd41:5298::,2a00:fd41:5298:7fff:ffff:ffff:ffff:ffff,GB -2a00:fd41:5298:8000::,2a00:fd47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:fd60::,2a00:fd60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fd80::,2a00:fd80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:fda0::,2a00:fda0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fdc0::,2a00:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:fde0::,2a00:fde0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:fe00::,2a00:fe00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fe20::,2a00:fe20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:fe40::,2a00:fe40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:fe60::,2a00:fe60:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a00:fe80::,2a00:fe87:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a00:fea0::,2a00:fea7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:fec0::,2a00:fec0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a00:fee0::,2a00:fee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ff00::,2a00:ff07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:ff20::,2a00:ff20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:ff40::,2a00:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:ff60::,2a00:ff60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:ff80::,2a00:ff80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:ffa0::,2a00:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:ffc0::,2a00:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:ffe0::,2a00:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01::,2a01::ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8::,2a01:17:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a01:18::,2a01:18:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:20::,2a01:20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:28::,2a01:28:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:30::,2a01:37:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:38::,2a01:38:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:40::,2a01:40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:48::,2a01:48:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:50::,2a01:50:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:58::,2a01:58:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:68::,2a01:68:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:70::,2a01:70:fffe:ffff:ffff:ffff:ffff:ffff,GB -2a01:70:ffff::,2a01:70:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:78::,2a01:7f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:80::,2a01:80:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:88::,2a01:88:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:90::,2a01:90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:98::,2a01:98:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a0::,2a01:a0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a01:a8::,2a01:af:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b0::,2a01:b1:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:b8::,2a01:b8:ffff:ffff:ffff:ffff:ffff:ffff,VA -2a01:c0::,2a01:c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:c8::,2a01:c8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:d0::,2a01:d0:896c:7fff:ffff:ffff:ffff:ffff,UA -2a01:d0:896c:8000::,2a01:d0:896c:ffff:ffff:ffff:ffff:ffff,RU -2a01:d0:896d::,2a01:d0:9637:7fff:ffff:ffff:ffff:ffff,UA -2a01:d0:9637:8000::,2a01:d0:9637:ffff:ffff:ffff:ffff:ffff,NL -2a01:d0:9638::,2a01:d0:e16e:ffff:ffff:ffff:ffff:ffff,UA -2a01:d0:e16f::,2a01:d0:e16f:7fff:ffff:ffff:ffff:ffff,DK -2a01:d0:e16f:8000::,2a01:d0:e314:ffff:ffff:ffff:ffff:ffff,UA -2a01:d0:e315::,2a01:d0:e315:7fff:ffff:ffff:ffff:ffff,RU -2a01:d0:e315:8000::,2a01:d0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:d8::,2a01:d8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:e0::,2a01:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:e8::,2a01:e8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:f0::,2a01:f0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:f8::,2a01:f8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:100::,2a01:100:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:108::,2a01:108:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:110::,2a01:110:8067:ffff:ffff:ffff:ffff:ffff,GB -2a01:110:8068::,2a01:110:8068:ffff:ffff:ffff:ffff:ffff,IL -2a01:110:8069::,2a01:110:9007:ffff:ffff:ffff:ffff:ffff,GB -2a01:110:9008::,2a01:110:9008:7fff:ffff:ffff:ffff:ffff,EE -2a01:110:9008:8000::,2a01:110:a007:ffff:ffff:ffff:ffff:ffff,GB -2a01:110:a008::,2a01:110:a008:7fff:ffff:ffff:ffff:ffff,IE -2a01:110:a008:8000::,2a01:111:2000:3:ffff:ffff:ffff:ffff,GB -2a01:111:2000:4::,2a01:111:2000:4:ffff:ffff:ffff:ffff,US -2a01:111:2000:5::,2a01:111:2000:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2001::,2a01:111:2001:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2002::,2a01:111:2003:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2004::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2007::,2a01:111:2007:ffff:ffff:ffff:ffff:ffff,AU -2a01:111:2008::,2a01:111:2008:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2009::,2a01:111:2009:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:200a::,2a01:111:2010:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2011::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,PR -2a01:111:2012::,2a01:111:2013:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2014::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2016::,2a01:111:2016::ffff:ffff:ffff:ffff,US -2a01:111:2016:1::,2a01:111:2016:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2017::,2a01:111:2017:ffff:ffff:ffff:ffff:ffff,BR -2a01:111:2018::,2a01:111:2019:ffff:ffff:ffff:ffff:ffff,US -2a01:111:201a::,2a01:111:201a:ffff:ffff:ffff:ffff:ffff,SG -2a01:111:201b::,2a01:111:201c:ffff:ffff:ffff:ffff:ffff,US -2a01:111:201d::,2a01:111:201d:ffff:ffff:ffff:ffff:ffff,HK -2a01:111:201e::,2a01:111:201f:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2020::,2a01:111:2020:ffff:ffff:ffff:ffff:ffff,NL -2a01:111:2021::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2023::,2a01:111:2023::ffff:ffff:ffff:ffff,SE -2a01:111:2023:1::,2a01:111:2025:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2026::,2a01:111:2026:ffff:ffff:ffff:ffff:ffff,IE -2a01:111:2027::,2a01:111:2027:ffff:ffff:ffff:ffff:ffff,NL -2a01:111:2028::,2a01:111:2028:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2029::,2a01:111:2029:ffff:ffff:ffff:ffff:ffff,US -2a01:111:202a::,2a01:111:202a:ffff:ffff:ffff:ffff:ffff,NL -2a01:111:202b::,2a01:111:202b:ffff:ffff:ffff:ffff:ffff,IE -2a01:111:202c::,2a01:111:202f:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2030::,2a01:111:2030:ffff:ffff:ffff:ffff:ffff,JP -2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,SG -2a01:111:2032::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,HK -2a01:111:2033::,2a01:111:2033:ffff:ffff:ffff:ffff:ffff,IE -2a01:111:2034::,2a01:111:2034:ffff:ffff:ffff:ffff:ffff,AU -2a01:111:2035::,2a01:111:2035:ffff:ffff:ffff:ffff:ffff,SG -2a01:111:2036::,2a01:111:2036:ffff:ffff:ffff:ffff:ffff,JP -2a01:111:2037::,2a01:111:2037:ffff:ffff:ffff:ffff:ffff,NL -2a01:111:2038::,2a01:111:2038:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2039::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,AU -2a01:111:203a::,2a01:111:203a:ffff:ffff:ffff:ffff:ffff,BR -2a01:111:203b::,2a01:111:203b:ffff:ffff:ffff:ffff:ffff,AT -2a01:111:203c::,2a01:111:203c:ffff:ffff:ffff:ffff:ffff,US -2a01:111:203d::,2a01:111:203d:ffff:ffff:ffff:ffff:ffff,NL -2a01:111:203e::,2a01:111:2040:ffff:ffff:ffff:ffff:ffff,IN -2a01:111:2041::,2a01:111:2041:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2042::,2a01:111:2042:ffff:ffff:ffff:ffff:ffff,FI -2a01:111:2043::,2a01:111:2043:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2044::,2a01:111:2044:ffff:ffff:ffff:ffff:ffff,IE -2a01:111:2045::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2046::,2a01:111:2046:ffff:ffff:ffff:ffff:ffff,JP -2a01:111:2047::,2a01:111:2048:ffff:ffff:ffff:ffff:ffff,CA -2a01:111:2049::,2a01:111:207f:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2080::,2a01:111:2080:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2081::,2a01:111:f00f:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f010::,2a01:111:f013:ffff:ffff:ffff:ffff:ffff,US -2a01:111:f014::,2a01:111:f0ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f100::,2a01:111:f100:4fff:ffff:ffff:ffff:ffff,US -2a01:111:f100:5000::,2a01:111:f100:5fff:ffff:ffff:ffff:ffff,GB -2a01:111:f100:6000::,2a01:111:f100:6fff:ffff:ffff:ffff:ffff,HK -2a01:111:f100:7000::,2a01:111:f100:7fff:ffff:ffff:ffff:ffff,SG -2a01:111:f100:8000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL -2a01:111:f100:a000::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,IE -2a01:111:f100:b000::,2a01:111:f100:bfff:ffff:ffff:ffff:ffff,US -2a01:111:f100:c000::,2a01:111:f100:cfff:ffff:ffff:ffff:ffff,IE -2a01:111:f100:d000::,2a01:111:f100:dfff:ffff:ffff:ffff:ffff,US -2a01:111:f100:e000::,2a01:111:f100:efff:ffff:ffff:ffff:ffff,GB -2a01:111:f100:f000::,2a01:111:f100:ffff:ffff:ffff:ffff:ffff,US -2a01:111:f101::,2a01:111:f101:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f102::,2a01:111:f102:fff:ffff:ffff:ffff:ffff,BR -2a01:111:f102:1000::,2a01:111:f102:7fff:ffff:ffff:ffff:ffff,US -2a01:111:f102:8000::,2a01:111:f102:8fff:ffff:ffff:ffff:ffff,HK -2a01:111:f102:9000::,2a01:111:f102:afff:ffff:ffff:ffff:ffff,JP -2a01:111:f102:b000::,2a01:111:f102:bfff:ffff:ffff:ffff:ffff,SG -2a01:111:f102:c000::,2a01:111:f102:dfff:ffff:ffff:ffff:ffff,AU -2a01:111:f102:e000::,2a01:111:f102:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f103::,2a01:111:f103:fff:ffff:ffff:ffff:ffff,IE -2a01:111:f103:1000::,2a01:111:f103:1fff:ffff:ffff:ffff:ffff,SG -2a01:111:f103:2000::,2a01:111:f20a:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f20b::,2a01:111:f20b:ffff:ffff:ffff:ffff:ffff,IE -2a01:111:f20c::,2a01:111:f20f:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f210::,2a01:111:f210:ffff:ffff:ffff:ffff:ffff,US -2a01:111:f211::,2a01:111:f306:178f:ffff:ffff:ffff:ffff,GB -2a01:111:f306:1790::,2a01:111:f306:1791:ffff:ffff:ffff:ffff,US -2a01:111:f306:1792::,2a01:111:f30b:178f:ffff:ffff:ffff:ffff,GB -2a01:111:f30b:1790::,2a01:111:f30b:1790:ffff:ffff:ffff:ffff,US -2a01:111:f30b:1791::,2a01:111:f30b:1791:ffff:ffff:ffff:ffff,GB -2a01:111:f30b:1792::,2a01:111:f30b:1793:ffff:ffff:ffff:ffff,US -2a01:111:f30b:1794::,2a01:111:f30e:178f:ffff:ffff:ffff:ffff,GB -2a01:111:f30e:1790::,2a01:111:f30e:1790:ffff:ffff:ffff:ffff,US -2a01:111:f30e:1791::,2a01:111:f330:178f:ffff:ffff:ffff:ffff,GB -2a01:111:f330:1790::,2a01:111:f330:1791:ffff:ffff:ffff:ffff,US -2a01:111:f330:1792::,2a01:111:f330:1792:ffff:ffff:ffff:ffff,GB -2a01:111:f330:1793::,2a01:111:f330:1794:ffff:ffff:ffff:ffff,US -2a01:111:f330:1795::,2a01:111:f330:17cf:ffff:ffff:ffff:ffff,GB -2a01:111:f330:17d0::,2a01:111:f330:17d0:ffff:ffff:ffff:ffff,US -2a01:111:f330:17d1::,2a01:111:f3ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f400::,2a01:111:f400:29:ffff:ffff:ffff:ffff,US -2a01:111:f400:2a::,2a01:111:f400:3d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:3e::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US -2a01:111:f400:5d::,2a01:111:f400:3ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:400::,2a01:111:f400:1bff:ffff:ffff:ffff:ffff,US -2a01:111:f400:1c00::,2a01:111:f400:1c07:ffff:ffff:ffff:ffff,HK -2a01:111:f400:1c08::,2a01:111:f400:1c1a:ffff:ffff:ffff:ffff,BR -2a01:111:f400:1c1b::,2a01:111:f400:1c1f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:1c20::,2a01:111:f400:1c27:ffff:ffff:ffff:ffff,BR -2a01:111:f400:1c28::,2a01:111:f400:23ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:2400::,2a01:111:f400:2413:ffff:ffff:ffff:ffff,IE -2a01:111:f400:2414::,2a01:111:f400:247f:ffff:ffff:ffff:ffff,US -2a01:111:f400:2480::,2a01:111:f400:2490:ffff:ffff:ffff:ffff,GB -2a01:111:f400:2491::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US -2a01:111:f400:2492::,2a01:111:f400:27ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:2800::,2a01:111:f400:2c00:ffff:ffff:ffff:ffff,US -2a01:111:f400:2c01::,2a01:111:f400:2c02:ffff:ffff:ffff:ffff,GB -2a01:111:f400:2c03::,2a01:111:f400:2c67:ffff:ffff:ffff:ffff,US -2a01:111:f400:2c68::,2a01:111:f400:2c74:ffff:ffff:ffff:ffff,GB -2a01:111:f400:2c75::,2a01:111:f400:2c97:ffff:ffff:ffff:ffff,US -2a01:111:f400:2c98::,2a01:111:f400:2fff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:3000::,2a01:111:f400:3001:ffff:ffff:ffff:ffff,US -2a01:111:f400:3002::,2a01:111:f400:3090:ffff:ffff:ffff:ffff,GB -2a01:111:f400:3091::,2a01:111:f400:3095:ffff:ffff:ffff:ffff,US -2a01:111:f400:3096::,2a01:111:f400:31d1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:31d2::,2a01:111:f400:31e0:ffff:ffff:ffff:ffff,US -2a01:111:f400:31e1::,2a01:111:f400:33ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:3400::,2a01:111:f400:3432:ffff:ffff:ffff:ffff,US -2a01:111:f400:3433::,2a01:111:f400:3bff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:3c00::,2a01:111:f400:47ff:ffff:ffff:ffff:ffff,US -2a01:111:f400:4800::,2a01:111:f400:4bff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:4c00::,2a01:111:f400:4fff:ffff:ffff:ffff:ffff,US -2a01:111:f400:5000::,2a01:111:f400:5013:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5014::,2a01:111:f400:502a:ffff:ffff:ffff:ffff,US -2a01:111:f400:502b::,2a01:111:f400:502b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:502c::,2a01:111:f400:5033:ffff:ffff:ffff:ffff,US -2a01:111:f400:5034::,2a01:111:f400:503b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:503c::,2a01:111:f400:5045:ffff:ffff:ffff:ffff,IE -2a01:111:f400:5046::,2a01:111:f400:5046:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5047::,2a01:111:f400:504f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:5050::,2a01:111:f400:505e:ffff:ffff:ffff:ffff,GB -2a01:111:f400:505f::,2a01:111:f400:505f:ffff:ffff:ffff:ffff,US -2a01:111:f400:5060::,2a01:111:f400:5062:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5063::,2a01:111:f400:5063:ffff:ffff:ffff:ffff,US -2a01:111:f400:5064::,2a01:111:f400:5064:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5065::,2a01:111:f400:5067:ffff:ffff:ffff:ffff,US -2a01:111:f400:5068::,2a01:111:f400:5069:ffff:ffff:ffff:ffff,GB -2a01:111:f400:506a::,2a01:111:f400:506a:ffff:ffff:ffff:ffff,US -2a01:111:f400:506b::,2a01:111:f400:506c:ffff:ffff:ffff:ffff,GB -2a01:111:f400:506d::,2a01:111:f400:506d:ffff:ffff:ffff:ffff,US -2a01:111:f400:506e::,2a01:111:f400:508d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:508e::,2a01:111:f400:508e:ffff:ffff:ffff:ffff,AT -2a01:111:f400:508f::,2a01:111:f400:5093:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5094::,2a01:111:f400:5095:ffff:ffff:ffff:ffff,AT -2a01:111:f400:5096::,2a01:111:f400:5098:ffff:ffff:ffff:ffff,FI -2a01:111:f400:5099::,2a01:111:f400:5099:ffff:ffff:ffff:ffff,GB -2a01:111:f400:509a::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI -2a01:111:f400:50aa::,2a01:111:f400:50e6:ffff:ffff:ffff:ffff,GB -2a01:111:f400:50e7::,2a01:111:f400:50f7:ffff:ffff:ffff:ffff,US -2a01:111:f400:50f8::,2a01:111:f400:5101:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5102::,2a01:111:f400:5104:ffff:ffff:ffff:ffff,IE -2a01:111:f400:5105::,2a01:111:f400:5105:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5106::,2a01:111:f400:510d:ffff:ffff:ffff:ffff,IE -2a01:111:f400:510e::,2a01:111:f400:5115:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5116::,2a01:111:f400:511e:ffff:ffff:ffff:ffff,US -2a01:111:f400:511f::,2a01:111:f400:513d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:513e::,2a01:111:f400:5140:ffff:ffff:ffff:ffff,IE -2a01:111:f400:5141::,2a01:111:f400:5141:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5142::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE -2a01:111:f400:514c::,2a01:111:f400:514c:ffff:ffff:ffff:ffff,GB -2a01:111:f400:514d::,2a01:111:f400:514e:ffff:ffff:ffff:ffff,IE -2a01:111:f400:514f::,2a01:111:f400:5175:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5176::,2a01:111:f400:5176:ffff:ffff:ffff:ffff,IE -2a01:111:f400:5177::,2a01:111:f400:517f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5180::,2a01:111:f400:518a:ffff:ffff:ffff:ffff,AU -2a01:111:f400:518b::,2a01:111:f400:518c:ffff:ffff:ffff:ffff,US -2a01:111:f400:518d::,2a01:111:f400:518d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:518e::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US -2a01:111:f400:519a::,2a01:111:f400:51ad:ffff:ffff:ffff:ffff,GB -2a01:111:f400:51ae::,2a01:111:f400:51bf:ffff:ffff:ffff:ffff,US -2a01:111:f400:51c0::,2a01:111:f400:5236:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5237::,2a01:111:f400:5237:ffff:ffff:ffff:ffff,US -2a01:111:f400:5238::,2a01:111:f400:526a:ffff:ffff:ffff:ffff,GB -2a01:111:f400:526b::,2a01:111:f400:5277:ffff:ffff:ffff:ffff,NL -2a01:111:f400:5278::,2a01:111:f400:527b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:527c::,2a01:111:f400:527c:ffff:ffff:ffff:ffff,IE -2a01:111:f400:527d::,2a01:111:f400:529c:ffff:ffff:ffff:ffff,GB -2a01:111:f400:529d::,2a01:111:f400:52a0:ffff:ffff:ffff:ffff,US -2a01:111:f400:52a1::,2a01:111:f400:52a2:ffff:ffff:ffff:ffff,IE -2a01:111:f400:52a3::,2a01:111:f400:52d7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:52d8::,2a01:111:f400:52df:ffff:ffff:ffff:ffff,US -2a01:111:f400:52e0::,2a01:111:f400:52f6:ffff:ffff:ffff:ffff,GB -2a01:111:f400:52f7::,2a01:111:f400:52f8:ffff:ffff:ffff:ffff,US -2a01:111:f400:52f9::,2a01:111:f400:53ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:5400::,2a01:111:f400:57ff:ffff:ffff:ffff:ffff,JP -2a01:111:f400:5800::,2a01:111:f400:6007:ffff:ffff:ffff:ffff,AU -2a01:111:f400:6008::,2a01:111:f400:6009:ffff:ffff:ffff:ffff,GB -2a01:111:f400:600a::,2a01:111:f400:600b:ffff:ffff:ffff:ffff,US -2a01:111:f400:600c::,2a01:111:f400:600d:ffff:ffff:ffff:ffff,NL -2a01:111:f400:600e::,2a01:111:f400:6019:ffff:ffff:ffff:ffff,US -2a01:111:f400:601a::,2a01:111:f400:601d:ffff:ffff:ffff:ffff,IE -2a01:111:f400:601e::,2a01:111:f400:6021:ffff:ffff:ffff:ffff,US -2a01:111:f400:6022::,2a01:111:f400:6023:ffff:ffff:ffff:ffff,IE -2a01:111:f400:6024::,2a01:111:f400:6029:ffff:ffff:ffff:ffff,US -2a01:111:f400:602a::,2a01:111:f400:602b:ffff:ffff:ffff:ffff,KR -2a01:111:f400:602c::,2a01:111:f400:602f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6030::,2a01:111:f400:6031:ffff:ffff:ffff:ffff,SG -2a01:111:f400:6032::,2a01:111:f400:6033:ffff:ffff:ffff:ffff,MY -2a01:111:f400:6034::,2a01:111:f400:6035:ffff:ffff:ffff:ffff,HK -2a01:111:f400:6036::,2a01:111:f400:6039:ffff:ffff:ffff:ffff,BR -2a01:111:f400:603a::,2a01:111:f400:603d:ffff:ffff:ffff:ffff,US -2a01:111:f400:603e::,2a01:111:f400:6043:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6044::,2a01:111:f400:6045:ffff:ffff:ffff:ffff,US -2a01:111:f400:6046::,2a01:111:f400:6047:ffff:ffff:ffff:ffff,IN -2a01:111:f400:6048::,2a01:111:f400:6049:ffff:ffff:ffff:ffff,GB -2a01:111:f400:604a::,2a01:111:f400:604d:ffff:ffff:ffff:ffff,US -2a01:111:f400:604e::,2a01:111:f400:6055:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6056::,2a01:111:f400:6059:ffff:ffff:ffff:ffff,IN -2a01:111:f400:605a::,2a01:111:f400:605b:ffff:ffff:ffff:ffff,US -2a01:111:f400:605c::,2a01:111:f400:605d:ffff:ffff:ffff:ffff,IN -2a01:111:f400:605e::,2a01:111:f400:605f:ffff:ffff:ffff:ffff,US -2a01:111:f400:6060::,2a01:111:f400:6061:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6062::,2a01:111:f400:6065:ffff:ffff:ffff:ffff,AT -2a01:111:f400:6066::,2a01:111:f400:6069:ffff:ffff:ffff:ffff,FI -2a01:111:f400:606a::,2a01:111:f400:606b:ffff:ffff:ffff:ffff,DE -2a01:111:f400:606c::,2a01:111:f400:606c:ffff:ffff:ffff:ffff,IN -2a01:111:f400:606d::,2a01:111:f400:606e:ffff:ffff:ffff:ffff,DE -2a01:111:f400:606f::,2a01:111:f400:6070:ffff:ffff:ffff:ffff,IE -2a01:111:f400:6071::,2a01:111:f400:6072:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6073::,2a01:111:f400:6076:ffff:ffff:ffff:ffff,US -2a01:111:f400:6077::,2a01:111:f400:607a:ffff:ffff:ffff:ffff,GB -2a01:111:f400:607b::,2a01:111:f400:607b:ffff:ffff:ffff:ffff,US -2a01:111:f400:607c::,2a01:111:f400:607c:ffff:ffff:ffff:ffff,GB -2a01:111:f400:607d::,2a01:111:f400:607e:ffff:ffff:ffff:ffff,NL -2a01:111:f400:607f::,2a01:111:f400:607f:ffff:ffff:ffff:ffff,KR -2a01:111:f400:6080::,2a01:111:f400:6081:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6082::,2a01:111:f400:6082:ffff:ffff:ffff:ffff,IE -2a01:111:f400:6083::,2a01:111:f400:6083:ffff:ffff:ffff:ffff,AU -2a01:111:f400:6084::,2a01:111:f400:6085:ffff:ffff:ffff:ffff,IE -2a01:111:f400:6086::,2a01:111:f400:6087:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6088::,2a01:111:f400:608b:ffff:ffff:ffff:ffff,US -2a01:111:f400:608c::,2a01:111:f400:608c:ffff:ffff:ffff:ffff,JP -2a01:111:f400:608d::,2a01:111:f400:608e:ffff:ffff:ffff:ffff,US -2a01:111:f400:608f::,2a01:111:f400:608f:ffff:ffff:ffff:ffff,SG -2a01:111:f400:6090::,2a01:111:f400:6090:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6091::,2a01:111:f400:6091:ffff:ffff:ffff:ffff,US -2a01:111:f400:6092::,2a01:111:f400:6093:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6094::,2a01:111:f400:6094:ffff:ffff:ffff:ffff,US -2a01:111:f400:6095::,2a01:111:f400:6095:ffff:ffff:ffff:ffff,BR -2a01:111:f400:6096::,2a01:111:f400:6096:ffff:ffff:ffff:ffff,GB -2a01:111:f400:6097::,2a01:111:f400:6098:ffff:ffff:ffff:ffff,US -2a01:111:f400:6099::,2a01:111:f400:6099:ffff:ffff:ffff:ffff,CL -2a01:111:f400:609a::,2a01:111:f400:60a5:ffff:ffff:ffff:ffff,GB -2a01:111:f400:60a6::,2a01:111:f400:60a6:ffff:ffff:ffff:ffff,BR -2a01:111:f400:60a7::,2a01:111:f400:60a8:ffff:ffff:ffff:ffff,CA -2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:60aa::,2a01:111:f400:60ab:ffff:ffff:ffff:ffff,DE -2a01:111:f400:60ac::,2a01:111:f400:60ac:ffff:ffff:ffff:ffff,US -2a01:111:f400:60ad::,2a01:111:f400:60ad:ffff:ffff:ffff:ffff,CA -2a01:111:f400:60ae::,2a01:111:f400:60ae:ffff:ffff:ffff:ffff,US -2a01:111:f400:60af::,2a01:111:f400:60b5:ffff:ffff:ffff:ffff,CA -2a01:111:f400:60b6::,2a01:111:f400:60b7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:60b8::,2a01:111:f400:60b8:ffff:ffff:ffff:ffff,DE -2a01:111:f400:60b9::,2a01:111:f400:60b9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:60ba::,2a01:111:f400:60bb:ffff:ffff:ffff:ffff,DE -2a01:111:f400:60bc::,2a01:111:f400:60bd:ffff:ffff:ffff:ffff,JP -2a01:111:f400:60be::,2a01:111:f400:60c2:ffff:ffff:ffff:ffff,GB -2a01:111:f400:60c3::,2a01:111:f400:60c4:ffff:ffff:ffff:ffff,IE -2a01:111:f400:60c5::,2a01:111:f400:707f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7080::,2a01:111:f400:7080:ffff:ffff:ffff:ffff,US -2a01:111:f400:7081::,2a01:111:f400:7081:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7082::,2a01:111:f400:7084:ffff:ffff:ffff:ffff,US -2a01:111:f400:7085::,2a01:111:f400:7087:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7088::,2a01:111:f400:7089:ffff:ffff:ffff:ffff,AU -2a01:111:f400:708a::,2a01:111:f400:708a:ffff:ffff:ffff:ffff,GB -2a01:111:f400:708b::,2a01:111:f400:7091:ffff:ffff:ffff:ffff,US -2a01:111:f400:7092::,2a01:111:f400:70b1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:70b2::,2a01:111:f400:70b5:ffff:ffff:ffff:ffff,HK -2a01:111:f400:70b6::,2a01:111:f400:70b6:ffff:ffff:ffff:ffff,GB -2a01:111:f400:70b7::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK -2a01:111:f400:70d2::,2a01:111:f400:70e6:ffff:ffff:ffff:ffff,GB -2a01:111:f400:70e7::,2a01:111:f400:7116:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7117::,2a01:111:f400:73ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7400::,2a01:111:f400:742d:ffff:ffff:ffff:ffff,US -2a01:111:f400:742e::,2a01:111:f400:7431:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7432::,2a01:111:f400:7432:ffff:ffff:ffff:ffff,US -2a01:111:f400:7433::,2a01:111:f400:74ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7500::,2a01:111:f400:77ff:ffff:ffff:ffff:ffff,US -2a01:111:f400:7800::,2a01:111:f400:7c0f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7c10::,2a01:111:f400:7c17:ffff:ffff:ffff:ffff,US -2a01:111:f400:7c18::,2a01:111:f400:7c18:ffff:ffff:ffff:ffff,HK -2a01:111:f400:7c19::,2a01:111:f400:7e01:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e02::,2a01:111:f400:7e02:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7e03::,2a01:111:f400:7e04:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e05::,2a01:111:f400:7e05:ffff:ffff:ffff:ffff,FI -2a01:111:f400:7e06::,2a01:111:f400:7e06:ffff:ffff:ffff:ffff,AT -2a01:111:f400:7e07::,2a01:111:f400:7e07:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e08::,2a01:111:f400:7e08:ffff:ffff:ffff:ffff,NL -2a01:111:f400:7e09::,2a01:111:f400:7e09:ffff:ffff:ffff:ffff,AT -2a01:111:f400:7e0a::,2a01:111:f400:7e0a:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7e0b::,2a01:111:f400:7e0b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e0c::,2a01:111:f400:7e0c:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7e0d::,2a01:111:f400:7e0d:ffff:ffff:ffff:ffff,FI -2a01:111:f400:7e0e::,2a01:111:f400:7e0e:ffff:ffff:ffff:ffff,AT -2a01:111:f400:7e0f::,2a01:111:f400:7e1d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e1e::,2a01:111:f400:7e1e:ffff:ffff:ffff:ffff,NL -2a01:111:f400:7e1f::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e41::,2a01:111:f400:7e41:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e42::,2a01:111:f400:7e44:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e45::,2a01:111:f400:7e45:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e46::,2a01:111:f400:7e47:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e48::,2a01:111:f400:7e4a:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e4b::,2a01:111:f400:7e4b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e4c::,2a01:111:f400:7e4d:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e4e::,2a01:111:f400:7e4f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e50::,2a01:111:f400:7e50:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e51::,2a01:111:f400:7e51:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e52::,2a01:111:f400:7e52:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e53::,2a01:111:f400:7e53:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e54::,2a01:111:f400:7e57:ffff:ffff:ffff:ffff,US -2a01:111:f400:7e58::,2a01:111:f400:7e5b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7e5c::,2a01:111:f400:7e5d:ffff:ffff:ffff:ffff,CA -2a01:111:f400:7e5e::,2a01:111:f400:7ea3:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7ea4::,2a01:111:f400:7ea7:ffff:ffff:ffff:ffff,IN -2a01:111:f400:7ea8::,2a01:111:f400:7eb3:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7eb4::,2a01:111:f400:7eb5:ffff:ffff:ffff:ffff,AU -2a01:111:f400:7eb6::,2a01:111:f400:7eb7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7eb8::,2a01:111:f400:7eb8:ffff:ffff:ffff:ffff,HK -2a01:111:f400:7eb9::,2a01:111:f400:7eb9:ffff:ffff:ffff:ffff,SG -2a01:111:f400:7eba::,2a01:111:f400:7ebb:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7ebc::,2a01:111:f400:7ebc:ffff:ffff:ffff:ffff,HK -2a01:111:f400:7ebd::,2a01:111:f400:7ebd:ffff:ffff:ffff:ffff,GB -2a01:111:f400:7ebe::,2a01:111:f400:7ebe:ffff:ffff:ffff:ffff,SG -2a01:111:f400:7ebf::,2a01:111:f400:83ff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:8400::,2a01:111:f400:8bff:ffff:ffff:ffff:ffff,NL -2a01:111:f400:8c00::,2a01:111:f400:8fff:ffff:ffff:ffff:ffff,AT -2a01:111:f400:9000::,2a01:111:f400:9fff:ffff:ffff:ffff:ffff,IE -2a01:111:f400:a000::,2a01:111:f400:a7ff:ffff:ffff:ffff:ffff,HK -2a01:111:f400:a800::,2a01:111:f400:abff:ffff:ffff:ffff:ffff,SG -2a01:111:f400:ac00::,2a01:111:f400:b3ff:ffff:ffff:ffff:ffff,JP -2a01:111:f400:b400::,2a01:111:f400:bbff:ffff:ffff:ffff:ffff,SG -2a01:111:f400:bc00::,2a01:111:f400:bfff:ffff:ffff:ffff:ffff,JP -2a01:111:f400:c000::,2a01:111:f400:c3ff:ffff:ffff:ffff:ffff,FI -2a01:111:f400:c400::,2a01:111:f400:dfff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e000::,2a01:111:f400:e003:ffff:ffff:ffff:ffff,US -2a01:111:f400:e004::,2a01:111:f400:e007:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e008::,2a01:111:f400:e008:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e009::,2a01:111:f400:e009:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e00a::,2a01:111:f400:e00b:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e00c::,2a01:111:f400:e021:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e022::,2a01:111:f400:e023:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e024::,2a01:111:f400:e027:ffff:ffff:ffff:ffff,US -2a01:111:f400:e028::,2a01:111:f400:e04f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e050::,2a01:111:f400:e050:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e051::,2a01:111:f400:e051:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e052::,2a01:111:f400:e052:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e053::,2a01:111:f400:e053:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e054::,2a01:111:f400:e054:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e055::,2a01:111:f400:e055:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e056::,2a01:111:f400:e056:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e057::,2a01:111:f400:e057:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e058::,2a01:111:f400:e058:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e059::,2a01:111:f400:e059:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e05a::,2a01:111:f400:e05a:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e05b::,2a01:111:f400:e05f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e060::,2a01:111:f400:e060:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e061::,2a01:111:f400:e061:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e062::,2a01:111:f400:e062:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e063::,2a01:111:f400:e063:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e064::,2a01:111:f400:e064:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e065::,2a01:111:f400:e065:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e066::,2a01:111:f400:e066:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e067::,2a01:111:f400:e067:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e068::,2a01:111:f400:e068:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e069::,2a01:111:f400:e069:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e06a::,2a01:111:f400:e06a:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e06b::,2a01:111:f400:e06b:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e06c::,2a01:111:f400:e06c:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e06d::,2a01:111:f400:e06d:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e06e::,2a01:111:f400:e06e:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e06f::,2a01:111:f400:e06f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e070::,2a01:111:f400:e070:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e071::,2a01:111:f400:e071:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e072::,2a01:111:f400:e072:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e073::,2a01:111:f400:e073:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e074::,2a01:111:f400:e074:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e075::,2a01:111:f400:e075:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e076::,2a01:111:f400:e076:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e077::,2a01:111:f400:e077:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e078::,2a01:111:f400:e086:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e087::,2a01:111:f400:e087:ffff:ffff:ffff:ffff,US -2a01:111:f400:e088::,2a01:111:f400:e0c7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0c8::,2a01:111:f400:e0c8:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0c9::,2a01:111:f400:e0c9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0ca::,2a01:111:f400:e0cc:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0cd::,2a01:111:f400:e0cd:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0ce::,2a01:111:f400:e0d0:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0d1::,2a01:111:f400:e0d1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0d2::,2a01:111:f400:e0d4:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0d5::,2a01:111:f400:e0d5:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0d6::,2a01:111:f400:e0d8:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0d9::,2a01:111:f400:e0d9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0da::,2a01:111:f400:e0dc:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0dd::,2a01:111:f400:e0dd:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0de::,2a01:111:f400:e0e0:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0e1::,2a01:111:f400:e0e1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0e2::,2a01:111:f400:e0e4:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0e5::,2a01:111:f400:e0e5:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0e6::,2a01:111:f400:e0e8:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0e9::,2a01:111:f400:e0e9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0ea::,2a01:111:f400:e0ec:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0ed::,2a01:111:f400:e0ed:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0ee::,2a01:111:f400:e0ef:ffff:ffff:ffff:ffff,US -2a01:111:f400:e0f0::,2a01:111:f400:e0f1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e0f2::,2a01:111:f400:e0f2:ffff:ffff:ffff:ffff,KR -2a01:111:f400:e0f3::,2a01:111:f400:e0f3:ffff:ffff:ffff:ffff,MY -2a01:111:f400:e0f4::,2a01:111:f400:e0f4:ffff:ffff:ffff:ffff,KR -2a01:111:f400:e0f5::,2a01:111:f400:e0f5:ffff:ffff:ffff:ffff,MY -2a01:111:f400:e0f6::,2a01:111:f400:e147:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e148::,2a01:111:f400:e148:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e149::,2a01:111:f400:e163:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e164::,2a01:111:f400:e164:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e165::,2a01:111:f400:e1bf:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e1c0::,2a01:111:f400:e1c0:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e1c1::,2a01:111:f400:e1d3:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e1d4::,2a01:111:f400:e1d4:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e1d5::,2a01:111:f400:e232:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e233::,2a01:111:f400:e235:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e236::,2a01:111:f400:e237:ffff:ffff:ffff:ffff,SG -2a01:111:f400:e238::,2a01:111:f400:e283:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e284::,2a01:111:f400:e287:ffff:ffff:ffff:ffff,US -2a01:111:f400:e288::,2a01:111:f400:e288:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e289::,2a01:111:f400:e289:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e28a::,2a01:111:f400:e28b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e28c::,2a01:111:f400:e28c:ffff:ffff:ffff:ffff,SG -2a01:111:f400:e28d::,2a01:111:f400:e28d:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e28e::,2a01:111:f400:e28f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e290::,2a01:111:f400:e2b7:ffff:ffff:ffff:ffff,US -2a01:111:f400:e2b8::,2a01:111:f400:e2b9:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e2ba::,2a01:111:f400:e2cb:ffff:ffff:ffff:ffff,US -2a01:111:f400:e2cc::,2a01:111:f400:e2cd:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e2ce::,2a01:111:f400:e2ce:ffff:ffff:ffff:ffff,US -2a01:111:f400:e2cf::,2a01:111:f400:e2cf:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e2d0::,2a01:111:f400:e2d3:ffff:ffff:ffff:ffff,US -2a01:111:f400:e2d4::,2a01:111:f400:e2d5:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e2d6::,2a01:111:f400:e2d7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e2d8::,2a01:111:f400:e2d9:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e2da::,2a01:111:f400:e2db:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e2dc::,2a01:111:f400:e2dd:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e2de::,2a01:111:f400:e2df:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e2e0::,2a01:111:f400:e2eb:ffff:ffff:ffff:ffff,US -2a01:111:f400:e2ec::,2a01:111:f400:e2ec:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e2ed::,2a01:111:f400:e2ed:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e2ee::,2a01:111:f400:e2ee:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e2ef::,2a01:111:f400:e2ef:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e2f0::,2a01:111:f400:e2f0:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e2f1::,2a01:111:f400:e2f1:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e2f2::,2a01:111:f400:e2f2:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e2f3::,2a01:111:f400:e2f3:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e2f4::,2a01:111:f400:e2f4:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e2f5::,2a01:111:f400:e2f5:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e2f6::,2a01:111:f400:e2f6:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e2f7::,2a01:111:f400:e2f7:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e2f8::,2a01:111:f400:e2f8:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e2f9::,2a01:111:f400:e2f9:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e2fa::,2a01:111:f400:e2fa:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e2fb::,2a01:111:f400:e2fb:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e2fc::,2a01:111:f400:e2fc:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e2fd::,2a01:111:f400:e2fd:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e2fe::,2a01:111:f400:e2fe:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e2ff::,2a01:111:f400:e2ff:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e300::,2a01:111:f400:e300:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e301::,2a01:111:f400:e301:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e302::,2a01:111:f400:e302:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e303::,2a01:111:f400:e303:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e304::,2a01:111:f400:e304:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e305::,2a01:111:f400:e305:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e306::,2a01:111:f400:e306:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e307::,2a01:111:f400:e307:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e308::,2a01:111:f400:e308:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e309::,2a01:111:f400:e309:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e30a::,2a01:111:f400:e30a:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e30b::,2a01:111:f400:e30b:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e30c::,2a01:111:f400:e30c:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e30d::,2a01:111:f400:e30d:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e30e::,2a01:111:f400:e30e:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e30f::,2a01:111:f400:e30f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e310::,2a01:111:f400:e310:ffff:ffff:ffff:ffff,FI -2a01:111:f400:e311::,2a01:111:f400:e311:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e312::,2a01:111:f400:e312:ffff:ffff:ffff:ffff,AT -2a01:111:f400:e313::,2a01:111:f400:e313:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e314::,2a01:111:f400:e33f:ffff:ffff:ffff:ffff,US -2a01:111:f400:e340::,2a01:111:f400:e340:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e341::,2a01:111:f400:e341:ffff:ffff:ffff:ffff,US -2a01:111:f400:e342::,2a01:111:f400:e343:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e344::,2a01:111:f400:e344:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e345::,2a01:111:f400:e345:ffff:ffff:ffff:ffff,US -2a01:111:f400:e346::,2a01:111:f400:e347:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e348::,2a01:111:f400:e349:ffff:ffff:ffff:ffff,HK -2a01:111:f400:e34a::,2a01:111:f400:e35b:ffff:ffff:ffff:ffff,US -2a01:111:f400:e35c::,2a01:111:f400:e35c:ffff:ffff:ffff:ffff,NL -2a01:111:f400:e35d::,2a01:111:f400:e35d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:e35e::,2a01:111:f400:e35f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:e360::,2a01:111:f400:f34c:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f34d::,2a01:111:f400:f34d:ffff:ffff:ffff:ffff,US -2a01:111:f400:f34e::,2a01:111:f400:f35a:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f35b::,2a01:111:f400:f361:ffff:ffff:ffff:ffff,US -2a01:111:f400:f362::,2a01:111:f400:f367:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f368::,2a01:111:f400:f36c:ffff:ffff:ffff:ffff,NL -2a01:111:f400:f36d::,2a01:111:f400:f37f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f380::,2a01:111:f400:f380:ffff:ffff:ffff:ffff,FI -2a01:111:f400:f381::,2a01:111:f400:f381:ffff:ffff:ffff:ffff,AT -2a01:111:f400:f382::,2a01:111:f400:f500:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f501::,2a01:111:f400:f506:ffff:ffff:ffff:ffff,NL -2a01:111:f400:f507::,2a01:111:f400:f510:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f511::,2a01:111:f400:f531:ffff:ffff:ffff:ffff,US -2a01:111:f400:f532::,2a01:111:f400:f53f:ffff:ffff:ffff:ffff,IE -2a01:111:f400:f540::,2a01:111:f400:f543:ffff:ffff:ffff:ffff,US -2a01:111:f400:f544::,2a01:111:f400:f547:ffff:ffff:ffff:ffff,BR -2a01:111:f400:f548::,2a01:111:f400:f54e:ffff:ffff:ffff:ffff,HK -2a01:111:f400:f54f::,2a01:111:f400:f554:ffff:ffff:ffff:ffff,JP -2a01:111:f400:f555::,2a01:111:f400:f556:ffff:ffff:ffff:ffff,SG -2a01:111:f400:f557::,2a01:111:f400:f55e:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f55f::,2a01:111:f400:f566:ffff:ffff:ffff:ffff,US -2a01:111:f400:f567::,2a01:111:f400:f568:ffff:ffff:ffff:ffff,JP -2a01:111:f400:f569::,2a01:111:f400:f56a:ffff:ffff:ffff:ffff,GB -2a01:111:f400:f56b::,2a01:111:f400:f572:ffff:ffff:ffff:ffff,US -2a01:111:f400:f573::,2a01:111:f400:f574:ffff:ffff:ffff:ffff,IE -2a01:111:f400:f575::,2a01:111:f400:f576:ffff:ffff:ffff:ffff,US -2a01:111:f400:f577::,2a01:111:f400:f578:ffff:ffff:ffff:ffff,FI -2a01:111:f400:f579::,2a01:111:f400:f57a:ffff:ffff:ffff:ffff,AT -2a01:111:f400:f57b::,2a01:111:f400:f57c:ffff:ffff:ffff:ffff,BR -2a01:111:f400:f57d::,2a01:111:f400:f57e:ffff:ffff:ffff:ffff,US -2a01:111:f400:f57f::,2a01:111:f400:f580:ffff:ffff:ffff:ffff,HK -2a01:111:f400:f581::,2a01:111:f400:fc0f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fc10::,2a01:111:f400:fc13:ffff:ffff:ffff:ffff,US -2a01:111:f400:fc14::,2a01:111:f400:fc17:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fc18::,2a01:111:f400:fc1b:ffff:ffff:ffff:ffff,HK -2a01:111:f400:fc1c::,2a01:111:f400:fc1c:ffff:ffff:ffff:ffff,IE -2a01:111:f400:fc1d::,2a01:111:f400:fe01:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe02::,2a01:111:f400:fe02:ffff:ffff:ffff:ffff,IE -2a01:111:f400:fe03::,2a01:111:f400:fe03:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe04::,2a01:111:f400:fe04:ffff:ffff:ffff:ffff,IE -2a01:111:f400:fe05::,2a01:111:f400:fe05:ffff:ffff:ffff:ffff,FI -2a01:111:f400:fe06::,2a01:111:f400:fe06:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe07::,2a01:111:f400:fe08:ffff:ffff:ffff:ffff,NL -2a01:111:f400:fe09::,2a01:111:f400:fe09:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe0a::,2a01:111:f400:fe0a:ffff:ffff:ffff:ffff,IE -2a01:111:f400:fe0b::,2a01:111:f400:fe40:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe41::,2a01:111:f400:fe41:ffff:ffff:ffff:ffff,US -2a01:111:f400:fe42::,2a01:111:f400:fe44:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe45::,2a01:111:f400:fe46:ffff:ffff:ffff:ffff,US -2a01:111:f400:fe47::,2a01:111:f400:fe47:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe48::,2a01:111:f400:fe57:ffff:ffff:ffff:ffff,US -2a01:111:f400:fe58::,2a01:111:f400:fe5b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe5c::,2a01:111:f400:fe5d:ffff:ffff:ffff:ffff,CA -2a01:111:f400:fe5e::,2a01:111:f400:fe9b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fe9c::,2a01:111:f400:fe9f:ffff:ffff:ffff:ffff,JP -2a01:111:f400:fea0::,2a01:111:f400:fea3:ffff:ffff:ffff:ffff,GB -2a01:111:f400:fea4::,2a01:111:f400:fea7:ffff:ffff:ffff:ffff,IN -2a01:111:f400:fea8::,2a01:111:f400:feb7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:feb8::,2a01:111:f400:febb:ffff:ffff:ffff:ffff,MY -2a01:111:f400:febc::,2a01:111:f400:febc:ffff:ffff:ffff:ffff,GB -2a01:111:f400:febd::,2a01:111:f400:febd:ffff:ffff:ffff:ffff,SG -2a01:111:f400:febe::,2a01:111:f400:febe:ffff:ffff:ffff:ffff,KR -2a01:111:f400:febf::,2a01:111:f400:feff:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff00::,2a01:111:f400:ff03:ffff:ffff:ffff:ffff,NL -2a01:111:f400:ff04::,2a01:111:f400:ff06:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff07::,2a01:111:f400:ff07:ffff:ffff:ffff:ffff,IE -2a01:111:f400:ff08::,2a01:111:f400:ff3f:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff40::,2a01:111:f400:ff42:ffff:ffff:ffff:ffff,US -2a01:111:f400:ff43::,2a01:111:f400:ff43:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff44::,2a01:111:f400:ff46:ffff:ffff:ffff:ffff,US -2a01:111:f400:ff47::,2a01:111:f400:ff8b:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff8c::,2a01:111:f400:ff8c:ffff:ffff:ffff:ffff,HK -2a01:111:f400:ff8d::,2a01:111:f400:ff8d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ff8e::,2a01:111:f400:ff8e:ffff:ffff:ffff:ffff,HK -2a01:111:f400:ff8f::,2a01:111:f400:ff8f:ffff:ffff:ffff:ffff,SG -2a01:111:f400:ff90::,2a01:111:f400:ffc2:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ffc3::,2a01:111:f400:ffc3:ffff:ffff:ffff:ffff,IE -2a01:111:f400:ffc4::,2a01:111:f400:ffcb:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ffcc::,2a01:111:f400:ffcc:ffff:ffff:ffff:ffff,FI -2a01:111:f400:ffcd::,2a01:111:f400:ffe7:ffff:ffff:ffff:ffff,GB -2a01:111:f400:ffe8::,2a01:111:f400:ffe9:ffff:ffff:ffff:ffff,US -2a01:111:f400:ffea::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f401::,2a01:111:f401::ffff:ffff:ffff:ffff,US -2a01:111:f401:1::,2a01:111:f401:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f402::,2a01:111:f402:7ff:ffff:ffff:ffff:ffff,US -2a01:111:f402:800::,2a01:111:f402:bff:ffff:ffff:ffff:ffff,JP -2a01:111:f402:c00::,2a01:111:f402:c01:ffff:ffff:ffff:ffff,GB -2a01:111:f402:c02::,2a01:111:f402:c03:ffff:ffff:ffff:ffff,US -2a01:111:f402:c04::,2a01:111:f402:1001:ffff:ffff:ffff:ffff,GB -2a01:111:f402:1002::,2a01:111:f402:1002:ffff:ffff:ffff:ffff,US -2a01:111:f402:1003::,2a01:111:f402:13ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:1400::,2a01:111:f402:1800:ffff:ffff:ffff:ffff,US -2a01:111:f402:1801::,2a01:111:f402:180b:ffff:ffff:ffff:ffff,GB -2a01:111:f402:180c::,2a01:111:f402:180c:ffff:ffff:ffff:ffff,US -2a01:111:f402:180d::,2a01:111:f402:180d:ffff:ffff:ffff:ffff,GB -2a01:111:f402:180e::,2a01:111:f402:180e:ffff:ffff:ffff:ffff,US -2a01:111:f402:180f::,2a01:111:f402:1fff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:2000::,2a01:111:f402:23ff:ffff:ffff:ffff:ffff,NL -2a01:111:f402:2400::,2a01:111:f402:27ff:ffff:ffff:ffff:ffff,US -2a01:111:f402:2800::,2a01:111:f402:2bff:ffff:ffff:ffff:ffff,IE -2a01:111:f402:2c00::,2a01:111:f402:3bff:ffff:ffff:ffff:ffff,US -2a01:111:f402:3c00::,2a01:111:f402:3fff:ffff:ffff:ffff:ffff,BR -2a01:111:f402:4000::,2a01:111:f402:43ff:ffff:ffff:ffff:ffff,US -2a01:111:f402:4400::,2a01:111:f402:4bff:ffff:ffff:ffff:ffff,KR -2a01:111:f402:4c00::,2a01:111:f402:4fff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:5000::,2a01:111:f402:53ff:ffff:ffff:ffff:ffff,IN -2a01:111:f402:5400::,2a01:111:f402:57ff:ffff:ffff:ffff:ffff,JP -2a01:111:f402:5800::,2a01:111:f402:5bff:ffff:ffff:ffff:ffff,NL -2a01:111:f402:5c00::,2a01:111:f402:5fff:ffff:ffff:ffff:ffff,AU -2a01:111:f402:6000::,2a01:111:f402:63ff:ffff:ffff:ffff:ffff,JP -2a01:111:f402:6400::,2a01:111:f402:6fff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:7000::,2a01:111:f402:77ff:ffff:ffff:ffff:ffff,AU -2a01:111:f402:7800::,2a01:111:f402:7bff:ffff:ffff:ffff:ffff,US -2a01:111:f402:7c00::,2a01:111:f402:7fff:ffff:ffff:ffff:ffff,IE -2a01:111:f402:8000::,2a01:111:f402:83ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:8400::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL -2a01:111:f402:8c00::,2a01:111:f402:8fff:ffff:ffff:ffff:ffff,US -2a01:111:f402:9000::,2a01:111:f402:93ff:ffff:ffff:ffff:ffff,AU -2a01:111:f402:9400::,2a01:111:f402:97ff:ffff:ffff:ffff:ffff,IE -2a01:111:f402:9800::,2a01:111:f402:9bff:ffff:ffff:ffff:ffff,US -2a01:111:f402:9c00::,2a01:111:f402:9fff:ffff:ffff:ffff:ffff,IE -2a01:111:f402:a000::,2a01:111:f402:a3ff:ffff:ffff:ffff:ffff,HK -2a01:111:f402:a400::,2a01:111:f402:a7ff:ffff:ffff:ffff:ffff,US -2a01:111:f402:a800::,2a01:111:f402:a802:ffff:ffff:ffff:ffff,GB -2a01:111:f402:a803::,2a01:111:f402:a803:ffff:ffff:ffff:ffff,SG -2a01:111:f402:a804::,2a01:111:f402:a805:ffff:ffff:ffff:ffff,GB -2a01:111:f402:a806::,2a01:111:f402:a806:ffff:ffff:ffff:ffff,SG -2a01:111:f402:a807::,2a01:111:f402:abff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:ac00::,2a01:111:f402:afff:ffff:ffff:ffff:ffff,NL -2a01:111:f402:b000::,2a01:111:f402:b3ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:b400::,2a01:111:f402:b402:ffff:ffff:ffff:ffff,SG -2a01:111:f402:b403::,2a01:111:f402:b404:ffff:ffff:ffff:ffff,GB -2a01:111:f402:b405::,2a01:111:f402:b405:ffff:ffff:ffff:ffff,SG -2a01:111:f402:b406::,2a01:111:f402:b7ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:b800::,2a01:111:f402:bbff:ffff:ffff:ffff:ffff,FR -2a01:111:f402:bc00::,2a01:111:f402:bfff:ffff:ffff:ffff:ffff,JP -2a01:111:f402:c000::,2a01:111:f402:c3ff:ffff:ffff:ffff:ffff,FR -2a01:111:f402:c400::,2a01:111:f402:cbff:ffff:ffff:ffff:ffff,US -2a01:111:f402:cc00::,2a01:111:f402:cfff:ffff:ffff:ffff:ffff,IN -2a01:111:f402:d000::,2a01:111:f404:c05:ffff:ffff:ffff:ffff,GB -2a01:111:f404:c06::,2a01:111:f404:c0a:ffff:ffff:ffff:ffff,US -2a01:111:f404:c0b::,2a01:111:f404:33ff:ffff:ffff:ffff:ffff,GB -2a01:111:f404:3400::,2a01:111:f404:37ff:ffff:ffff:ffff:ffff,US -2a01:111:f404:3800::,2a01:111:f404:93ff:ffff:ffff:ffff:ffff,GB -2a01:111:f404:9400::,2a01:111:f404:97ff:ffff:ffff:ffff:ffff,IE -2a01:111:f404:9800::,2a01:111:f404:a7ff:ffff:ffff:ffff:ffff,GB -2a01:111:f404:a800::,2a01:111:f404:abff:ffff:ffff:ffff:ffff,SG -2a01:111:f404:ac00::,2a01:111:f405:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f406::,2a01:111:f406:3ff:ffff:ffff:ffff:ffff,IE -2a01:111:f406:400::,2a01:111:f406:7ff:ffff:ffff:ffff:ffff,US -2a01:111:f406:800::,2a01:111:f406:800:ffff:ffff:ffff:ffff,NL -2a01:111:f406:801::,2a01:111:f406:bff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:c00::,2a01:111:f406:fff:ffff:ffff:ffff:ffff,US -2a01:111:f406:1000::,2a01:111:f406:1003:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1004::,2a01:111:f406:1005:ffff:ffff:ffff:ffff,US -2a01:111:f406:1006::,2a01:111:f406:1006:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1007::,2a01:111:f406:1007:ffff:ffff:ffff:ffff,US -2a01:111:f406:1008::,2a01:111:f406:13ff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1400::,2a01:111:f406:1400:ffff:ffff:ffff:ffff,IE -2a01:111:f406:1401::,2a01:111:f406:1804:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1805::,2a01:111:f406:1805:ffff:ffff:ffff:ffff,US -2a01:111:f406:1806::,2a01:111:f406:1806:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1807::,2a01:111:f406:180b:ffff:ffff:ffff:ffff,US -2a01:111:f406:180c::,2a01:111:f406:1bff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:1c00::,2a01:111:f406:1c00:ffff:ffff:ffff:ffff,US -2a01:111:f406:1c01::,2a01:111:f406:1c01:ffff:ffff:ffff:ffff,BR -2a01:111:f406:1c02::,2a01:111:f406:23ff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:2400::,2a01:111:f406:27ff:ffff:ffff:ffff:ffff,US -2a01:111:f406:2800::,2a01:111:f406:2fff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:3000::,2a01:111:f406:33ff:ffff:ffff:ffff:ffff,US -2a01:111:f406:3400::,2a01:111:f406:3403:ffff:ffff:ffff:ffff,GB -2a01:111:f406:3404::,2a01:111:f406:3404:ffff:ffff:ffff:ffff,US -2a01:111:f406:3405::,2a01:111:f406:87ff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:8800::,2a01:111:f406:8bff:ffff:ffff:ffff:ffff,NL -2a01:111:f406:8c00::,2a01:111:f406:93ff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:9400::,2a01:111:f406:97ff:ffff:ffff:ffff:ffff,IE -2a01:111:f406:9800::,2a01:111:f406:9fff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:a000::,2a01:111:f406:a001:ffff:ffff:ffff:ffff,HK -2a01:111:f406:a002::,2a01:111:f406:a002:ffff:ffff:ffff:ffff,IE -2a01:111:f406:a003::,2a01:111:f406:a003:ffff:ffff:ffff:ffff,HK -2a01:111:f406:a004::,2a01:111:f406:a804:ffff:ffff:ffff:ffff,GB -2a01:111:f406:a805::,2a01:111:f406:a805:ffff:ffff:ffff:ffff,SG -2a01:111:f406:a806::,2a01:111:f406:afff:ffff:ffff:ffff:ffff,GB -2a01:111:f406:b000::,2a01:111:f406:b3ff:ffff:ffff:ffff:ffff,JP -2a01:111:f406:b400::,2a01:111:f406:b7ff:ffff:ffff:ffff:ffff,SG -2a01:111:f406:b800::,2a01:111:f4ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f500::,2a01:111:f5ff:ffff:ffff:ffff:ffff:ffff,US -2a01:111:f600::,2a01:111:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:120::,2a01:127:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:130::,2a01:138:a01c:ffff:ffff:ffff:ffff:ffff,DE -2a01:138:a01d::,2a01:138:a01d:ffff:ffff:ffff:ffff:ffff,CH -2a01:138:a01e::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:140::,2a01:147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:148::,2a01:14f:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:150::,2a01:150:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:158::,2a01:158:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:160::,2a01:160:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:168::,2a01:168:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:170::,2a01:170:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:178::,2a01:178:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:180::,2a01:187:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a01:188::,2a01:188:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:190::,2a01:197:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:198::,2a01:198:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:1a0::,2a01:1a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:1a8::,2a01:1a8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:1b0::,2a01:1b0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:1b8::,2a01:1b8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:1c0::,2a01:1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:1c8::,2a01:1cf:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:1d0::,2a01:1d7:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a01:1d8::,2a01:1df:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:1e0::,2a01:1e0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:1e8::,2a01:1e8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:1f0::,2a01:1f0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:1f8::,2a01:1f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:200::,2a01:200:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:208::,2a01:208:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:210::,2a01:210:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:220::,2a01:220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:228::,2a01:228:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:230::,2a01:230:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:238::,2a01:23f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:240::,2a01:240:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:248::,2a01:248:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:250::,2a01:250:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:258::,2a01:258:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:260::,2a01:267:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a01:268::,2a01:268:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:270::,2a01:270:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:278::,2a01:27f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:280::,2a01:287:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:288::,2a01:288:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:290::,2a01:290:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:298::,2a01:29f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:2a0::,2a01:2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:2a8::,2a01:2af:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:2b0::,2a01:2b0:2000:112:ffff:ffff:ffff:ffff,SE -2a01:2b0:2000:113::,2a01:2b0:2000:113:ffff:ffff:ffff:ffff,FI -2a01:2b0:2000:114::,2a01:2b7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:2b8::,2a01:2b8:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a01:2c0::,2a01:2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:2c8::,2a01:2c8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:2d0::,2a01:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:2d8::,2a01:2df:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:2e0::,2a01:2ef:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:300:1::,2a01:300:1:7fff:ffff:ffff:ffff:ffff,FR -2a01:308::,2a01:308:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:310::,2a01:310:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:320::,2a01:327:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a01:328::,2a01:328:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:330::,2a01:330:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:338::,2a01:338:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:348::,2a01:348:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:350::,2a01:350:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:358::,2a01:35f:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:360::,2a01:367:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:368::,2a01:36f:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:378::,2a01:378:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:380::,2a01:380:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:388::,2a01:388:24e:ffff:ffff:ffff:ffff:ffff,GB -2a01:388:24f::,2a01:388:24f:7fff:ffff:ffff:ffff:ffff,NL -2a01:388:24f:8000::,2a01:388:250:ffff:ffff:ffff:ffff:ffff,GB -2a01:388:251::,2a01:388:251:7fff:ffff:ffff:ffff:ffff,NL -2a01:388:251:8000::,2a01:388:473:ffff:ffff:ffff:ffff:ffff,GB -2a01:388:474::,2a01:388:474:7fff:ffff:ffff:ffff:ffff,NL -2a01:388:474:8000::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:390::,2a01:397:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:398::,2a01:398:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:3a0::,2a01:3a7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:3a8::,2a01:3a8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:3b8::,2a01:3b8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:3c8::,2a01:3c8:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:3d8::,2a01:3d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:3e0:402::,2a01:3e0:403:ffff:ffff:ffff:ffff:ffff,FR -2a01:3e0:501::,2a01:3e0:501:ffff:ffff:ffff:ffff:ffff,RU -2a01:3e0:502::,2a01:3e0:502:ffff:ffff:ffff:ffff:ffff,DE -2a01:3e0:701::,2a01:3e0:701:ffff:ffff:ffff:ffff:ffff,GB -2a01:3e0:801::,2a01:3e0:801:ffff:ffff:ffff:ffff:ffff,FR -2a01:3e0:d01::,2a01:3e0:d02:ffff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1101::,2a01:3e0:1101:ffff:ffff:ffff:ffff:ffff,NL -2a01:3e0:1200::,2a01:3e0:1200:1ff:ffff:ffff:ffff:ffff,FR -2a01:3e0:1300::,2a01:3e0:1300:ff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1400::,2a01:3e0:1400:ff:ffff:ffff:ffff:ffff,NL -2a01:3e0:1500::,2a01:3e0:1500:ff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1501::,2a01:3e0:1501:ffff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1600::,2a01:3e0:1600:ffff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1601::,2a01:3e0:1601:ffff:ffff:ffff:ffff:ffff,FI -2a01:3e0:1700::,2a01:3e0:1701:ff:ffff:ffff:ffff:ffff,GB -2a01:3e0:1b00::,2a01:3e0:1b00:ffff:ffff:ffff:ffff:ffff,FI -2a01:3e0:1d00::,2a01:3e0:1d00:ff:ffff:ffff:ffff:ffff,CH -2a01:3e0:3200::,2a01:3e0:3200:ff:ffff:ffff:ffff:ffff,RO -2a01:3e0:3300::,2a01:3e0:3300:ff:ffff:ffff:ffff:ffff,BG -2a01:3e0:3400::,2a01:3e0:3400:ff:ffff:ffff:ffff:ffff,HU -2a01:3e0:3500::,2a01:3e0:3500:ff:ffff:ffff:ffff:ffff,LU -2a01:3e0:3600::,2a01:3e0:3600:1ff:ffff:ffff:ffff:ffff,SA -2a01:3e0:3700::,2a01:3e0:3700:ff:ffff:ffff:ffff:ffff,SA -2a01:3e0:ff24::,2a01:3e0:ff25:ffff:ffff:ffff:ffff:ffff,DE -2a01:3e8::,2a01:3e8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:3f0::,2a01:3f7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:3f8::,2a01:3f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:400::,2a01:400:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:408::,2a01:408:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:410::,2a01:410:1:ffff:ffff:ffff:ffff:ffff,GB -2a01:410:2::,2a01:410:2:7fff:ffff:ffff:ffff:ffff,ZM -2a01:410:2:8000::,2a01:410:108:ffff:ffff:ffff:ffff:ffff,GB -2a01:410:109::,2a01:410:109:7fff:ffff:ffff:ffff:ffff,ZW -2a01:410:109:8000::,2a01:410:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:418::,2a01:418:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:420::,2a01:420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:428::,2a01:428:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:430::,2a01:430:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:438::,2a01:438:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:440::,2a01:447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:448::,2a01:448:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:450::,2a01:450:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:458::,2a01:458:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:460::,2a01:460:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:468::,2a01:46f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:470::,2a01:477:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:478::,2a01:47f:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a01:480::,2a01:480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:488::,2a01:488:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:490::,2a01:490:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:498::,2a01:498:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:4a0::,2a01:4a0:2c:ffff:ffff:ffff:ffff:ffff,DE -2a01:4a0:2d::,2a01:4a0:2d:7fff:ffff:ffff:ffff:ffff,CH -2a01:4a0:2d:8000::,2a01:4a0:2d:ffff:ffff:ffff:ffff:ffff,DE -2a01:4a0:2e::,2a01:4a0:2e:7fff:ffff:ffff:ffff:ffff,CZ -2a01:4a0:2e:8000::,2a01:4af:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4b0::,2a01:4b0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:4c0::,2a01:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:4c8::,2a01:4cf:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4d0::,2a01:4d0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4d8::,2a01:4d8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:4e0::,2a01:4e7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a01:4e8::,2a01:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4f0::,2a01:4f0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:4f8::,2a01:4f8:bc:ffff:ffff:ffff:ffff:ffff,DE -2a01:4f8:bd::,2a01:4f8:bd:7fff:ffff:ffff:ffff:ffff,NL -2a01:4f8:bd:8000::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:500::,2a01:500:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:508::,2a01:508:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:510::,2a01:510:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:518::,2a01:518:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:520::,2a01:520:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:528::,2a01:528:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:530::,2a01:530:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:538::,2a01:538:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:540::,2a01:540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:548::,2a01:548:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:550::,2a01:550:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:558::,2a01:558:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:560::,2a01:567:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:568::,2a01:570:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:578::,2a01:578::6fff:ffff:ffff:ffff:ffff,US -2a01:578:0:7000::,2a01:578::70ff:ffff:ffff:ffff:ffff,IE -2a01:578:0:7100::,2a01:578::71ff:ffff:ffff:ffff:ffff,DE -2a01:578:0:7200::,2a01:578::72ff:ffff:ffff:ffff:ffff,GB -2a01:578:0:7300::,2a01:578:2:ffff:ffff:ffff:ffff:ffff,US -2a01:578:3::,2a01:578:3::ffff:ffff:ffff:ffff,IE -2a01:578:3:1::,2a01:578:12:ffff:ffff:ffff:ffff:ffff,US -2a01:578:13::,2a01:578:13::ffff:ffff:ffff:ffff,DE -2a01:578:13:1::,2a01:578:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:580::,2a01:580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:590::,2a01:590:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:598::,2a01:59f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5a0::,2a01:5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5a8::,2a01:5a8:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:5b0::,2a01:5b0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5b8::,2a01:5bf:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a01:5c0::,2a01:5c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5c8::,2a01:5c8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5d0::,2a01:5d0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:5d8::,2a01:5df:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:5e0::,2a01:5e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:5f0::,2a01:5f7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:600::,2a01:600:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:608::,2a01:608:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a01:610::,2a01:610:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:618::,2a01:618:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:620::,2a01:620:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:628::,2a01:628:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:630::,2a01:630:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:640::,2a01:647:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:648::,2a01:648:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:650::,2a01:650:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:658::,2a01:658:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:660::,2a01:667:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:668::,2a01:668:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:670::,2a01:670:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:678::,2a01:67f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:680::,2a01:680:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:688::,2a01:688:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:690::,2a01:697:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:698::,2a01:698:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6a0::,2a01:6a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:6a8::,2a01:6a8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:6b0::,2a01:6b0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:6c0::,2a01:6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6c8::,2a01:6c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6d0::,2a01:6d0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:6d8::,2a01:6d8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6e0::,2a01:6e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6e8::,2a01:6e8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6f0::,2a01:6f0:fffe:ffff:ffff:ffff:ffff:ffff,DE -2a01:6f0:ffff::,2a01:6f0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6f8::,2a01:6f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:700::,2a01:700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:710::,2a01:710:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:718::,2a01:718:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:720::,2a01:720:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:728::,2a01:72f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:730::,2a01:730:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:738::,2a01:738:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:740::,2a01:740:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:750::,2a01:750:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:758::,2a01:758:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:760::,2a01:760:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:768::,2a01:768:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:770::,2a01:770:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:778::,2a01:778:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:780::,2a01:780:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:788::,2a01:788:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:790::,2a01:790:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:798::,2a01:79e:7be3:7fff:ffff:ffff:ffff:ffff,NO -2a01:79e:7be3:8000::,2a01:79e:7be3:ffff:ffff:ffff:ffff:ffff,DK -2a01:79e:7be4::,2a01:79f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:7a0::,2a01:7a7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7a8::,2a01:7a8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7b0::,2a01:7b0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7b8::,2a01:7b8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7c0::,2a01:7c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:7c8::,2a01:7c8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7d0::,2a01:7d0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7d8::,2a01:7d8:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a01:7e0::,2a01:7e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7e8::,2a01:7e8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:7f0::,2a01:7f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:800::,2a01:838:fffe:ffff:ffff:ffff:ffff:ffff,DE -2a01:838:ffff::,2a01:838:ffff:7fff:ffff:ffff:ffff:ffff,MT -2a01:838:ffff:8000::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:c00::,2a01:c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:e00::,2a01:e3f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:1000::,2a01:17ff:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:2000::,2a01:2fff:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:4000::,2a01:4000:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a01:4020::,2a01:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4040::,2a01:4040:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:4060::,2a01:4060:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4080::,2a01:4080:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:40a0::,2a01:40a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:40c0::,2a01:40c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:40e0::,2a01:40e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:4100::,2a01:4100:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:4120::,2a01:4120:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:4140::,2a01:4140:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:4160::,2a01:4160:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a01:4180::,2a01:4180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:41a0::,2a01:41a0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a01:41c0::,2a01:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:41e0::,2a01:41e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4200::,2a01:4207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4240::,2a01:4240:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:4260::,2a01:4260:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:4280::,2a01:4280:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a01:42a0::,2a01:42a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:42c0::,2a01:42c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:42e0::,2a01:42e0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:4300::,2a01:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4320::,2a01:4320:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4340::,2a01:4340:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:4360::,2a01:4360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4380::,2a01:4380:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:43a0::,2a01:43a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:43c0::,2a01:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a01:4400::,2a01:4400:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:4420::,2a01:4420:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4440::,2a01:4440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4460::,2a01:4460:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4480::,2a01:4480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:44a0::,2a01:44a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:44c0::,2a01:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:44e0::,2a01:44e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:4500::,2a01:4500:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a01:4520::,2a01:4520:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:4540::,2a01:4547:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4580::,2a01:4587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:45c0::,2a01:45c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:45e0::,2a01:45e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:4600::,2a01:4600:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a01:4620::,2a01:4620:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:4640::,2a01:4640:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4660::,2a01:4660:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:4680::,2a01:4680:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a01:46a0::,2a01:46a0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a01:46c0::,2a01:46c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:46e0::,2a01:46e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4700::,2a01:4700:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a01:4720::,2a01:4720:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4740::,2a01:4740:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:4760::,2a01:4760:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4780::,2a01:4780:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a01:47a0::,2a01:47a0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:47c0::,2a01:47c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:47e0::,2a01:47e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:4800::,2a01:4800:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4820::,2a01:4820:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:4840::,2a01:4840:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:4860::,2a01:4860:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a01:4880::,2a01:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:48a0::,2a01:48a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:48c0::,2a01:48c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:48e0::,2a01:48e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:4900::,2a01:4900:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a01:4920::,2a01:4920:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4940::,2a01:4940:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4960::,2a01:4960:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4980::,2a01:4980:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:49a0::,2a01:49a0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:49c0::,2a01:49c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:49e0::,2a01:49e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:4a00::,2a01:4a00:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a01:4a20::,2a01:4a20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:4a40::,2a01:4a40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:4a60::,2a01:4a60:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:4a80::,2a01:4a80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:4aa0::,2a01:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4ac0::,2a01:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:4ae0::,2a01:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4b00::,2a01:4b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4b20::,2a01:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4b40::,2a01:4b40:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:4b60::,2a01:4b60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4b80::,2a01:4b80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:4ba0::,2a01:4ba7:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:4bc0::,2a01:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4be0::,2a01:4be0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:4c00::,2a01:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:4c20::,2a01:4c20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:4c40::,2a01:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:4c60::,2a01:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4c80::,2a01:4c80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4ca0::,2a01:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4cc0::,2a01:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4ce0::,2a01:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a01:4d00::,2a01:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4d20::,2a01:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:4d40::,2a01:4d40:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:4d60::,2a01:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:4d80::,2a01:4d80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4da0::,2a01:4da0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4dc0::,2a01:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4de0::,2a01:4de0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4e00::,2a01:4e00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:4e20::,2a01:4e20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:4e40::,2a01:4e40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4e60::,2a01:4e60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:4e80::,2a01:4e80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:4ea0::,2a01:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4ec0::,2a01:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:4ee0::,2a01:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:4f00::,2a01:4f00:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a01:4f20::,2a01:4f20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:4f40::,2a01:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4f60::,2a01:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:4f80::,2a01:4f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4fc0::,2a01:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:4fe0::,2a01:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5000::,2a01:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5020::,2a01:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5040::,2a01:5047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5080::,2a01:5080:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:50a0::,2a01:50a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:50c0::,2a01:50c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:50e0::,2a01:50e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5100::,2a01:5100:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:5120::,2a01:5120:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a01:5140::,2a01:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5160::,2a01:5160:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a01:5180::,2a01:5180:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:51a0::,2a01:51a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:51c0::,2a01:51c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:5200::,2a01:5207:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:5220::,2a01:5220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5240::,2a01:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5260::,2a01:5260:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5280::,2a01:5280:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:52a0::,2a01:52a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:52c0::,2a01:52c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:52e0::,2a01:52e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5300::,2a01:5300:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:5320::,2a01:5320:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:5340::,2a01:5340:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5380::,2a01:5380:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:53a0::,2a01:53a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:53c0::,2a01:53c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:53e0::,2a01:53e0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:5400::,2a01:5400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5420::,2a01:5420:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5440::,2a01:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:5460::,2a01:5460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5480::,2a01:5480:ffff:ffff:ffff:ffff:ffff:ffff,GG -2a01:54a0::,2a01:54a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:54c0::,2a01:54c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:54e0::,2a01:54e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5500::,2a01:5507:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:5540::,2a01:5547:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:5560::,2a01:5560:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5580::,2a01:5580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:55a0::,2a01:55a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:55c0::,2a01:55c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:55e0::,2a01:55e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5600::,2a01:5600:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5620::,2a01:5627:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5640::,2a01:5640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5660::,2a01:5660:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:5680::,2a01:5687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:56a0::,2a01:56a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:56c0::,2a01:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:56e0::,2a01:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:5700::,2a01:5700:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:5720::,2a01:5720:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5740::,2a01:5741:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:5760::,2a01:5760:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5780::,2a01:5780:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:57a0::,2a01:57a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:57c0::,2a01:57c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:57e0::,2a01:57e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5800::,2a01:5800:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5820::,2a01:5820:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5840::,2a01:5840:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:5860::,2a01:5860:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5880::,2a01:5880:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:58a0::,2a01:58a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a01:58c0::,2a01:58c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:58e0::,2a01:58e0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a01:5900::,2a01:5900:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:5920::,2a01:5920:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5940::,2a01:5940:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5960::,2a01:5960:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:5980::,2a01:5980:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:59a0::,2a01:59a7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:59c0::,2a01:59c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5a00::,2a01:5a00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:5a20::,2a01:5a20:fff:ffff:ffff:ffff:ffff:ffff,IE -2a01:5a20:1000::,2a01:5a20:1fff:ffff:ffff:ffff:ffff:ffff,US -2a01:5a20:2000::,2a01:5a20:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:5a40::,2a01:5a40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5a60::,2a01:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5a80::,2a01:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:5aa0::,2a01:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ac0::,2a01:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ae0::,2a01:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5b00::,2a01:5b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5b20::,2a01:5b20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:5b40::,2a01:5b40:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:5b60::,2a01:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5b80::,2a01:5b80:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:5ba0::,2a01:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5bc0::,2a01:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:5be0::,2a01:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5c00::,2a01:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:5c20::,2a01:5c20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5c40::,2a01:5c40:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5c60::,2a01:5c60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:5c80::,2a01:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5ca0::,2a01:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a01:5cc0::,2a01:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:5ce0::,2a01:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5d00::,2a01:5d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5d20::,2a01:5d20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5d40::,2a01:5d40:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5d60::,2a01:5d67:ffff:ffff:ffff:ffff:ffff:ffff,TJ -2a01:5d80::,2a01:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a01:5da0::,2a01:5da0:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a01:5dc0::,2a01:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:5de0::,2a01:5de0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5e00::,2a01:5e00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:5e20::,2a01:5e20:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:5e40::,2a01:5e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:5e60::,2a01:5e60:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a01:5e80::,2a01:5e80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:5ea0::,2a01:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5ec0::,2a01:5ec0::bfff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:0:c000::,2a01:5ec0::efff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:0:f000::,2a01:5ec0:1:1fff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:1:2000::,2a01:5ec0:1:5fff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:1:6000::,2a01:5ec0:1:9fff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:1:a000::,2a01:5ec0:1:bfff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:1:c000::,2a01:5ec0:1:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:2::,2a01:5ec0:2:1fff:ffff:ffff:ffff:ffff,NL -2a01:5ec0:2:2000::,2a01:5ec0:2:3fff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:2:4000::,2a01:5ec0:2:7fff:ffff:ffff:ffff:ffff,NL -2a01:5ec0:2:8000::,2a01:5ec0:8:7fff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:8:8000::,2a01:5ec0:8:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:9::,2a01:5ec0:1000:ffff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:1001::,2a01:5ec0:1001:7fff:ffff:ffff:ffff:ffff,US -2a01:5ec0:1001:8000::,2a01:5ec0:1019:7fff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:1019:8000::,2a01:5ec0:1019:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:101a::,2a01:5ec0:2000:7fff:ffff:ffff:ffff:ffff,IR -2a01:5ec0:2000:8000::,2a01:5ec0:2000:ffff:ffff:ffff:ffff:ffff,GB -2a01:5ec0:2001::,2a01:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:5ee0::,2a01:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:5f00::,2a01:5f00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5f20::,2a01:5f20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5f40::,2a01:5f40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5f60::,2a01:5f60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5f80::,2a01:5f80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:5fa0::,2a01:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5fc0::,2a01:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5fe0::,2a01:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:6000::,2a01:6000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6020::,2a01:6020:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6040::,2a01:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6060::,2a01:6060:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:6080::,2a01:6080:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:60a0::,2a01:60a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:60c0::,2a01:60c0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:60e0::,2a01:60e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6100::,2a01:6100:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6120::,2a01:6120:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6140::,2a01:6140:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:6160::,2a01:6160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6180::,2a01:6180:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:61a0::,2a01:61a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:61c0::,2a01:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:61e0::,2a01:61e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6200::,2a01:6200:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:6220::,2a01:6220:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:6240::,2a01:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6260::,2a01:6260:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:6280::,2a01:6280:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:62a0::,2a01:62a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:62c0::,2a01:62c0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a01:6300::,2a01:6300:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:6320::,2a01:6320:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a01:6340::,2a01:6347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6360::,2a01:6360:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:6380::,2a01:6380:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:63a0::,2a01:63a0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:63c0::,2a01:63c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:63e0::,2a01:63e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6400::,2a01:6400:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:6420::,2a01:6420:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6440::,2a01:6447:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a01:6460::,2a01:6460:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6480::,2a01:6480:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:64a0::,2a01:64a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:64c0::,2a01:64c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:64e0::,2a01:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6500::,2a01:6500:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a01:6520::,2a01:6520:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6540::,2a01:6540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6560::,2a01:6560:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:6580::,2a01:6580:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:65a0::,2a01:65a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:65c0::,2a01:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:65e0::,2a01:65e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6600::,2a01:6600:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6620::,2a01:6620:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:6640::,2a01:6647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:6680::,2a01:6680:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:66a0::,2a01:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:66c0::,2a01:66c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:66e0::,2a01:66e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6700::,2a01:6700:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a01:6720::,2a01:6720:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a01:6740::,2a01:6740:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6760::,2a01:6760:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:6780::,2a01:6780:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:67c0::,2a01:67c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:67e0::,2a01:67e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6800::,2a01:6800:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6820::,2a01:6820:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6840::,2a01:6840:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:6860::,2a01:6860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6880::,2a01:6880:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:68a0::,2a01:68a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:68c0::,2a01:68c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:68e0::,2a01:68e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:6900::,2a01:6900:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:6920::,2a01:6920:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6940::,2a01:6940:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6960::,2a01:6960:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6980::,2a01:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:69a0::,2a01:69a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:69c0::,2a01:69c0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:69e0::,2a01:69e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6a00::,2a01:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6a20::,2a01:6a20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6a40::,2a01:6a40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:6a60::,2a01:6a60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6a80::,2a01:6a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:6aa0::,2a01:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6ac0::,2a01:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6ae0::,2a01:6ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6b00::,2a01:6b00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6b20::,2a01:6b20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6b40::,2a01:6b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:6b60::,2a01:6b60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6b80::,2a01:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:6ba0::,2a01:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6bc0::,2a01:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6be0::,2a01:6be0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:6c00::,2a01:6c00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6c20::,2a01:6c20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6c40::,2a01:6c40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:6c60::,2a01:6c60:2:ffff:ffff:ffff:ffff:ffff,GB -2a01:6c60:3::,2a01:6c60:3:ffff:ffff:ffff:ffff:ffff,ZA -2a01:6c60:4::,2a01:6c60:4:ffff:ffff:ffff:ffff:ffff,NZ -2a01:6c60:5::,2a01:6c60:11:ffff:ffff:ffff:ffff:ffff,GB -2a01:6c60:12::,2a01:6c60:12:ffff:ffff:ffff:ffff:ffff,ES -2a01:6c60:13::,2a01:6c60:fff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6c60:1000::,2a01:6c60:1fff:ffff:ffff:ffff:ffff:ffff,US -2a01:6c60:2000::,2a01:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6ca0::,2a01:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6ce0::,2a01:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:6d00::,2a01:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:6d20::,2a01:6d20:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:6d40::,2a01:6d40:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:6d60::,2a01:6d67:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:6d80::,2a01:6d80:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:6da0::,2a01:6da0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:6dc0::,2a01:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a01:6de0::,2a01:6de0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6e00::,2a01:6e00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:6e20::,2a01:6e20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:6e40::,2a01:6e40:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a01:6e60::,2a01:6e60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6e80::,2a01:6e80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:6ea0::,2a01:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6ec0::,2a01:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6ee0::,2a01:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:6f00::,2a01:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:6f20::,2a01:6f20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:6f40::,2a01:6f40:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:6f60::,2a01:6f60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:6f80::,2a01:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:6fa0::,2a01:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:6fc0::,2a01:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:6fe0::,2a01:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:7000::,2a01:7000:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7020::,2a01:7020:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:7040::,2a01:7040:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:7060::,2a01:7060:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7080::,2a01:7080:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:70a0::,2a01:70a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:70c0::,2a01:70c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:70e0::,2a01:70e0:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a01:7100::,2a01:7100:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7120::,2a01:7120:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:7140::,2a01:7140:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7160::,2a01:7160:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:7180::,2a01:7180:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:71a0::,2a01:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:71c0::,2a01:71c1:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:71e0::,2a01:71e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7200::,2a01:7200:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:7220::,2a01:7220:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a01:7240::,2a01:7240:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:7260::,2a01:7267:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a01:7280::,2a01:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:72a0::,2a01:72a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:72c0::,2a01:72c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:72e0::,2a01:72e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:7300::,2a01:7300:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:7320::,2a01:7320:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:7340::,2a01:7347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7360::,2a01:7360:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a01:7380::,2a01:7380:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:73a0::,2a01:73a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:73c0::,2a01:73c0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a01:73e0::,2a01:73e0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:7400::,2a01:7400:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:7420::,2a01:7420:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7440::,2a01:7440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7460::,2a01:7460:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7480::,2a01:7480:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:74a0::,2a01:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:74c0::,2a01:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:74e0::,2a01:74e7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7500::,2a01:7500:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:7520::,2a01:7520:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7540::,2a01:7540:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7560::,2a01:7560:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:7580::,2a01:7580:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:75a0::,2a01:75a0:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a01:75c0::,2a01:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7600::,2a01:7600:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:7620::,2a01:7620:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7640::,2a01:7640:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:7660::,2a01:7660:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7680::,2a01:7680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:76a0::,2a01:76a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:76c0::,2a01:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:76e0::,2a01:76e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:7700::,2a01:7700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7720::,2a01:7720:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7740::,2a01:7740:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7760::,2a01:7760:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7780::,2a01:7780:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a01:77a0::,2a01:77a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:77c0::,2a01:77c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:77e0::,2a01:77e7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7800::,2a01:7800:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7820::,2a01:7820:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7840::,2a01:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7860::,2a01:7860:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7880::,2a01:7880:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:78a0::,2a01:78a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:78c0::,2a01:78c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7900::,2a01:7900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:7920::,2a01:7927:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:7940::,2a01:7940:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7960::,2a01:7960:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7980::,2a01:7980:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:79a0::,2a01:79a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:79c0::,2a01:79c0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a01:79e0::,2a01:79e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:7a00::,2a01:7a07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:7a20::,2a01:7a20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7a40::,2a01:7a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7a60::,2a01:7a60:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a01:7a80::,2a01:7a87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:7ac0::,2a01:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7ae0::,2a01:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7b00::,2a01:7b00:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a01:7b20::,2a01:7b20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7b40::,2a01:7b40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7b60::,2a01:7b60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7b80::,2a01:7b80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7ba0::,2a01:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:7bc0::,2a01:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:7be0::,2a01:7be0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7c00::,2a01:7c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:7c20::,2a01:7c20:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:7c40::,2a01:7c40:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a01:7c60::,2a01:7c60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7c80::,2a01:7c80:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a01:7ca0::,2a01:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7cc0::,2a01:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:7ce0::,2a01:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:7d00::,2a01:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:7d20::,2a01:7d20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:7d40::,2a01:7d40:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:7d60::,2a01:7d60:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:7d80::,2a01:7d80:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:7dc0::,2a01:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:7de0::,2a01:7de0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7e00::,2a01:7e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7e01::,2a01:7e01:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7e20::,2a01:7e27:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7e60::,2a01:7e60:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:7e80::,2a01:7e80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7ea0::,2a01:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:7ec0::,2a01:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:7ee0::,2a01:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:7f00::,2a01:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7f20::,2a01:7f20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7f40::,2a01:7f40:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a01:7f60::,2a01:7f60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7f80::,2a01:7f80:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a01:7fa0::,2a01:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7fc0::,2a01:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:7fe0::,2a01:7fe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:8000::,2a01:8000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8020::,2a01:8020:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:8040::,2a01:8047:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8060::,2a01:8060:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a01:8080::,2a01:8080:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a01:80a0::,2a01:80a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:80c0::,2a01:80c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:80e0::,2a01:80e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:8100::,2a01:8100:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8120::,2a01:8120:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:8140::,2a01:8140:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:8160::,2a01:8167:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8180::,2a01:8180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:81a0::,2a01:81a0:fe:ffff:ffff:ffff:ffff:ffff,RU -2a01:81a0:ff::,2a01:81a0:ff::ffff:ffff:ffff:ffff,US -2a01:81a0:ff:1::,2a01:81a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:81c0::,2a01:81c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:81e0::,2a01:81e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8200::,2a01:8200:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8220::,2a01:8220:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:8240::,2a01:8240:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8260::,2a01:8260:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8280::,2a01:8280:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:82a0::,2a01:82a0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:82c0::,2a01:82c0:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a01:82e0::,2a01:82e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8300::,2a01:8300:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:8320::,2a01:8320:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8340::,2a01:8340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8360::,2a01:8360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8380::,2a01:8380:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:83a0::,2a01:83a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:83c0::,2a01:83c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:83e0::,2a01:83e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8400::,2a01:8400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8420::,2a01:8420:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8440::,2a01:8440:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8460::,2a01:8460:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:8480::,2a01:8480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:84a0::,2a01:84a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:84c0::,2a01:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:84e0::,2a01:84e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:8500::,2a01:8500:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8520::,2a01:8520:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:8540::,2a01:8540:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8560::,2a01:8560:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8580::,2a01:8580:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:85a0::,2a01:85a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:85c0::,2a01:85c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:85e0::,2a01:85e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8600::,2a01:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8640::,2a01:8640::ffff:ffff:ffff:ffff:ffff,NL -2a01:8640:1::,2a01:8640:1:ffff:ffff:ffff:ffff:ffff,GB -2a01:8640:2::,2a01:8640:2:ffff:ffff:ffff:ffff:ffff,NL -2a01:8640:3::,2a01:8640:3:ffff:ffff:ffff:ffff:ffff,CA -2a01:8640:4::,2a01:8640:5:ffff:ffff:ffff:ffff:ffff,US -2a01:8640:6::,2a01:8640:6:ffff:ffff:ffff:ffff:ffff,SE -2a01:8640:7::,2a01:8640:7:ffff:ffff:ffff:ffff:ffff,GB -2a01:8640:8::,2a01:8640:8:ffff:ffff:ffff:ffff:ffff,CA -2a01:8640:9::,2a01:8640:9:ffff:ffff:ffff:ffff:ffff,SE -2a01:8640:a::,2a01:8640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8660::,2a01:8660:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8680::,2a01:8680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:86a0::,2a01:86a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:86c0::,2a01:86c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:86e0::,2a01:86e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8700::,2a01:8700:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a01:8720::,2a01:8720:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:8740::,2a01:8740:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:8760::,2a01:8760:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8780::,2a01:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:87c0::,2a01:87c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:87e0::,2a01:87e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8800::,2a01:8807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8820::,2a01:8820:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8840::,2a01:8840:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:8860::,2a01:8860:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:8880::,2a01:8880:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:88a0::,2a01:88a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:88c0::,2a01:88c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:88e0::,2a01:88e0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:8900::,2a01:8900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8920::,2a01:8920:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8940::,2a01:8940:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8960::,2a01:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8980::,2a01:8980:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:89a0::,2a01:89a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:89c0::,2a01:89c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:89e0::,2a01:89e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:8a00::,2a01:8a00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:8a20::,2a01:8a20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8a40::,2a01:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8a60::,2a01:8a60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8a80::,2a01:8a80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:8aa0::,2a01:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:8ac0::,2a01:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8ae0::,2a01:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8b00::,2a01:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:8b20::,2a01:8b20:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a01:8b40::,2a01:8b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:8b60::,2a01:8b60:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:8b80::,2a01:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:8ba0::,2a01:8ba7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8be0::,2a01:8be7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8c00::,2a01:8c00:ff00:82b0:ffff:ffff:ffff:ffff,CZ -2a01:8c00:ff00:82b1::,2a01:8c00:ff00:82b1:ffff:ffff:ffff:ffff,US -2a01:8c00:ff00:82b2::,2a01:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:8c20::,2a01:8c20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8c40::,2a01:8c40:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a01:8c60::,2a01:8c60:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:8c80::,2a01:8c80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:8ca0::,2a01:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a01:8cc0::,2a01:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:8ce0::,2a01:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:8d00::,2a01:8d03:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:8d20::,2a01:8d20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8d40::,2a01:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:8d80::,2a01:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:8da0::,2a01:8da0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:8dc0::,2a01:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:8de0::,2a01:8de0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:8e00::,2a01:8e07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:8e20::,2a01:8e20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8e40::,2a01:8e40:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a01:8e60::,2a01:8e60:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:8e80::,2a01:8e87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:8ec0::,2a01:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:8ee0::,2a01:8ee0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8f80::,2a01:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:8fe0::,2a01:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9000::,2a01:9000:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:9040::,2a01:9040:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a01:9060::,2a01:9060:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:9080::,2a01:9080:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:90a0::,2a01:90a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:90c0::,2a01:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:90e0::,2a01:90e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:9100::,2a01:9107:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:9120::,2a01:9120:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9140::,2a01:9140:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:9160::,2a01:9160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9180::,2a01:9180:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:91a0::,2a01:91a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:91c0::,2a01:91c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:91e0::,2a01:91e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:9200::,2a01:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9220::,2a01:9220:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9240::,2a01:9240:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9280::,2a01:9280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:92a0::,2a01:92a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:92e0::,2a01:92e0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a01:9300::,2a01:9300:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9320::,2a01:9320:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:9340::,2a01:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:9360::,2a01:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9380::,2a01:9380:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:93c0::,2a01:93c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:93e0::,2a01:93e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:9400::,2a01:9400:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:9420::,2a01:9420:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:9440::,2a01:9440:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9460::,2a01:9460:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:9480::,2a01:9480:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:94a0::,2a01:94a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:94c0::,2a01:94c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:94e0::,2a01:94e0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:9500::,2a01:9500:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:9520::,2a01:9527:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9540::,2a01:9540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9560::,2a01:9560:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:9580::,2a01:9580:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:95a0::,2a01:95a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:95c0::,2a01:95c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:9600::,2a01:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9620::,2a01:9627:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:9640::,2a01:9640:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:9660::,2a01:9660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:9680::,2a01:9687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:96a0::,2a01:96a0:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a01:96c0::,2a01:96c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:96e0::,2a01:96e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9700::,2a01:9700:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a01:9720::,2a01:9720:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:9740::,2a01:9740:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9760::,2a01:9760:ffff:ffff:ffff:ffff:ffff:ffff,KY -2a01:9780::,2a01:9780:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:97a0::,2a01:97a0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:97c0::,2a01:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:97e0::,2a01:97e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9800::,2a01:9800:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:9820::,2a01:9820:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9840::,2a01:9840:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9860::,2a01:9860:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9880::,2a01:9880:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:98a0::,2a01:98a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:98c0::,2a01:98c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:98e0::,2a01:98e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:9900::,2a01:9900:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:9920::,2a01:9920:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9940::,2a01:9940:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:9960::,2a01:9960:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:9980::,2a01:9980:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:99a0::,2a01:99a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:99c0::,2a01:99c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:99e0::,2a01:99e0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:9a00::,2a01:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9a20::,2a01:9a20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:9a40::,2a01:9a40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9a80::,2a01:9a80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9aa0::,2a01:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9ac0::,2a01:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9ae0::,2a01:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9b00::,2a01:9b00:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:9b20::,2a01:9b20:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a01:9b40::,2a01:9b40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:9b60::,2a01:9b60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9b80::,2a01:9b80:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:9ba0::,2a01:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9bc0::,2a01:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:9be0::,2a01:9be0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9c00::,2a01:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9c20::,2a01:9c20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:9c60::,2a01:9c60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:9c80::,2a01:9c80:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:9ca0::,2a01:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9cc0::,2a01:9cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9ce0::,2a01:9ce0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a01:9d00::,2a01:9d00:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a01:9d20::,2a01:9d27:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a01:9d40::,2a01:9d40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9d60::,2a01:9d60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:9d80::,2a01:9d80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:9da0::,2a01:9da0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9dc0::,2a01:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:9e00::,2a01:9e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9e01::,2a01:9e01:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:9e02::,2a01:9e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9e20::,2a01:9e20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9e40::,2a01:9e40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:9e60::,2a01:9e60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9e80::,2a01:9e80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:9ea0::,2a01:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:9ec0::,2a01:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9f00::,2a01:9f00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9f20::,2a01:9f20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:9f40::,2a01:9f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:9f60::,2a01:9f60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:9f80::,2a01:9f80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:9fa0::,2a01:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:9fc0::,2a01:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:a000::,2a01:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a020::,2a01:a020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a040::,2a01:a040:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:a060::,2a01:a060:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a080::,2a01:a080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a0a0::,2a01:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a0c0::,2a01:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a0e0::,2a01:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:a100::,2a01:a100:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:a120::,2a01:a120:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:a140::,2a01:a140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a160::,2a01:a160:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:a180::,2a01:a180:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a01:a1a0::,2a01:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a1c0::,2a01:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a01:a1e0::,2a01:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a200::,2a01:a200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a220::,2a01:a220:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a240::,2a01:a240:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:a260::,2a01:a260:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a280::,2a01:a283:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a2a0::,2a01:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a2c0::,2a01:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a2e0::,2a01:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:a300::,2a01:a300:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:a320::,2a01:a320:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a01:a340::,2a01:a340:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:a360::,2a01:a360:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a380::,2a01:a380:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a3a0::,2a01:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:a3c0::,2a01:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a3e0::,2a01:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a01:a400::,2a01:a400:ffff:ffff:ffff:ffff:ffff:ffff,JE -2a01:a420::,2a01:a420:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a01:a440::,2a01:a440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a460::,2a01:a460:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a480::,2a01:a480:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:a4a0::,2a01:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a01:a4c0::,2a01:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a4e0::,2a01:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:a500::,2a01:a500:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a520::,2a01:a520:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:a540::,2a01:a540:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:a560::,2a01:a560:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:a580::,2a01:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a5a0::,2a01:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a5c0::,2a01:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a5e0::,2a01:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a600::,2a01:a600:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:a620::,2a01:a620:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:a640::,2a01:a640:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a660::,2a01:a660:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:a680::,2a01:a687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a6a0::,2a01:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:a6c0::,2a01:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a6e0::,2a01:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a01:a700::,2a01:a707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a740::,2a01:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a760::,2a01:a760:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a01:a780::,2a01:a780:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a7a0::,2a01:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a7c0::,2a01:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:a7e0::,2a01:a7e0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:a800::,2a01:a807:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:a820::,2a01:a820:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:a840::,2a01:a840:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:a860::,2a01:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:a880::,2a01:a887:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a01:a8a0::,2a01:a8a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a8c0::,2a01:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:a8e0::,2a01:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:a920::,2a01:a920:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a940::,2a01:a940:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a960::,2a01:a960:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a01:a980::,2a01:a987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:a9a0::,2a01:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:a9c0::,2a01:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a9e0::,2a01:a9e7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:aa00::,2a01:aa00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:aa20::,2a01:aa20:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a01:aa40::,2a01:aa40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:aa60::,2a01:aa60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:aa80::,2a01:aa80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:aaa0::,2a01:aaa0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:aac0::,2a01:aac0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:ab00::,2a01:ab00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:ab20::,2a01:ab20:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:ab40::,2a01:ab40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:ab80::,2a01:ab80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:aba0::,2a01:aba0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:abc0::,2a01:abc0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a01:abe0::,2a01:abe0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:ac00::,2a01:ac00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:ac40::,2a01:ac40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:ac60::,2a01:ac60:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:ac80::,2a01:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a01:aca0::,2a01:aca0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:acc0::,2a01:acc0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:ace0::,2a01:ace0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:ad00::,2a01:ad00:2:ffff:ffff:ffff:ffff:ffff,IE -2a01:ad00:3::,2a01:ad00:3:7fff:ffff:ffff:ffff:ffff,UA -2a01:ad00:3:8000::,2a01:ad00:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:ad20::,2a01:ad20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:ad40::,2a01:ad40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:ad60::,2a01:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a01:ad80::,2a01:ad80:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:ada0::,2a01:ada0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:adc0::,2a01:adc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:ade0::,2a01:ade0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:ae00::,2a01:ae00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:ae20::,2a01:ae20:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:ae40::,2a01:ae40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:ae60::,2a01:ae60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:ae80::,2a01:ae87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:aea0::,2a01:aea0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:aec0::,2a01:aec0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:aee0::,2a01:aee0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:af00::,2a01:af00:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:af20::,2a01:af20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:af40::,2a01:af40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:af60::,2a01:af60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:af80::,2a01:af80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a01:afa0::,2a01:afa0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:afc0::,2a01:afc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:afe0::,2a01:afe0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:b000::,2a01:b000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b020::,2a01:b020:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a01:b040::,2a01:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b060::,2a01:b060:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:b080::,2a01:b080:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:b0a0::,2a01:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:b0c0::,2a01:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:b0e0::,2a01:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:b100::,2a01:b100:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:b120::,2a01:b120:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:b140::,2a01:b147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b160::,2a01:b160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b180::,2a01:b180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b1a0::,2a01:b1a0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b1c0::,2a01:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b200::,2a01:b200:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a01:b220::,2a01:b220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b240::,2a01:b240:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b260::,2a01:b260:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:b280::,2a01:b287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b2a0::,2a01:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b2c0::,2a01:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b2e0::,2a01:b2e7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:b300::,2a01:b307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:b340::,2a01:b340:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b360::,2a01:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b380::,2a01:b380:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:b3a0::,2a01:b3a0:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a01:b3c0::,2a01:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:b3e0::,2a01:b3e0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:b400::,2a01:b400:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:b420::,2a01:b420:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b440::,2a01:b440:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:b460::,2a01:b460:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b480::,2a01:b480:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:b4a0::,2a01:b4a0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a01:b4c0::,2a01:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:b4e0::,2a01:b4e0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a01:b500::,2a01:b500:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a01:b520::,2a01:b520:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:b540::,2a01:b547:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:b580::,2a01:b580:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b5a0::,2a01:b5a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:b5c0::,2a01:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:b5e0::,2a01:b5e0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:b600::,2a01:b600:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:b620::,2a01:b620:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a01:b640::,2a01:b640:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b660::,2a01:b660:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b680::,2a01:b680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:b6a0::,2a01:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:b6c0::,2a01:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:b700::,2a01:b700:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:b720::,2a01:b720:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b740::,2a01:b740:9ff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a00::,2a01:b740:a00:ffff:ffff:ffff:ffff:ffff,GB -2a01:b740:a01::,2a01:b740:a01:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a02::,2a01:b740:a02:ffff:ffff:ffff:ffff:ffff,NL -2a01:b740:a03::,2a01:b740:a03:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a04::,2a01:b740:a04:ffff:ffff:ffff:ffff:ffff,DE -2a01:b740:a05::,2a01:b740:a13:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a14::,2a01:b740:a14:ffff:ffff:ffff:ffff:ffff,DK -2a01:b740:a15::,2a01:b740:a15:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a16::,2a01:b740:a16:ffff:ffff:ffff:ffff:ffff,DE -2a01:b740:a17::,2a01:b740:a17:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a18::,2a01:b740:a18:ffff:ffff:ffff:ffff:ffff,GB -2a01:b740:a19::,2a01:b740:a19:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a1a::,2a01:b740:a1a:ffff:ffff:ffff:ffff:ffff,DE -2a01:b740:a1b::,2a01:b740:a1b:ffff:ffff:ffff:ffff:ffff,IE -2a01:b740:a1c::,2a01:b740:a1c:ffff:ffff:ffff:ffff:ffff,NL -2a01:b740:a1d::,2a01:b740:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b7c0::,2a01:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:b7e0::,2a01:b7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:b800::,2a01:b800:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a01:b820::,2a01:b820:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b840::,2a01:b840:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b860::,2a01:b860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b880::,2a01:b880:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a01:b8a0::,2a01:b8a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b8c0::,2a01:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:b8e0::,2a01:b8e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:b900::,2a01:b900:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:b920::,2a01:b920:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:b940::,2a01:b940:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:b960::,2a01:b960:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:b980::,2a01:b980:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:b9a0::,2a01:b9a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:b9c0::,2a01:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a01:b9e0::,2a01:b9e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:ba00::,2a01:ba07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a01:ba20::,2a01:ba20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:ba40::,2a01:ba40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:ba60::,2a01:ba60:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a01:ba80::,2a01:ba80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:baa0::,2a01:baa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:bac0::,2a01:bac0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:bae0::,2a01:bae0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a01:bb00::,2a01:bb00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:bb20::,2a01:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:bb40::,2a01:bb40:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:bb60::,2a01:bb60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:bb80::,2a01:bb80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:bba0::,2a01:bba0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a01:bbc0::,2a01:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a01:bbe0::,2a01:bbe0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:bc00::,2a01:bc07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:bc40::,2a01:bc40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:bc60::,2a01:bc60:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:bca0::,2a01:bca0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:bcc0::,2a01:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:bce0::,2a01:bce0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:bd00::,2a01:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:bd20::,2a01:bd20:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:bd40::,2a01:bd47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:bd60::,2a01:bd60:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a01:bd80::,2a01:bd80:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a01:bda0::,2a01:bda0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:bdc0::,2a01:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:bde0::,2a01:bde0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:be00::,2a01:be00:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:be20::,2a01:be20:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a01:be40::,2a01:be40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:be60::,2a01:be60:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:be80::,2a01:be80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:bea0::,2a01:bea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:bec0::,2a01:bec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:bee0::,2a01:bee0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:bf00::,2a01:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:bf20::,2a01:bf20:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:bf40::,2a01:bf40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:bf60::,2a01:bf60:ffff:ffff:ffff:ffff:ffff:ffff,US -2a01:bf80::,2a01:bf80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a01:bfa0::,2a01:bfa0:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a01:bfc0::,2a01:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:bfe0::,2a01:bfe0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:c000::,2a01:c4ff:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:c500::,2a01:c50f:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:c510::,2a01:c843:fffb:ffff:ffff:ffff:ffff:ffff,FR -2a01:c843:fffc::,2a01:c843:fffc:7fff:ffff:ffff:ffff:ffff,SK -2a01:c843:fffc:8000::,2a01:c844:fff:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:1000::,2a01:c844:11ff:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:1200::,2a01:c844:1401:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:1401:8000::,2a01:c844:1401:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:1402::,2a01:c844:1402:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:1402:8000::,2a01:c844:1402:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:1403::,2a01:c844:140a:e00:50e1:6f6d:63d4:31e,FR -2a01:c844:140a:e00:50e1:6f6d:63d4:31f,2a01:c844:140a:e00:50e1:6f6d:63d4:31f,SK -2a01:c844:140a:e00:50e1:6f6d:63d4:320,2a01:c844:141a:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:141b::,2a01:c844:141b:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:141b:8000::,2a01:c844:142b:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:142b:8000::,2a01:c844:142b:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:142c::,2a01:c844:1450:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:1450:8000::,2a01:c844:1450:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:1451::,2a01:c844:1458:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:1459::,2a01:c844:1459:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:1459:8000::,2a01:c844:148e:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:148e:8000::,2a01:c844:148e:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:148f::,2a01:c844:149e:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:149f::,2a01:c844:149f:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:149f:8000::,2a01:c844:14a3:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:14a4::,2a01:c844:14a4:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:14a4:8000::,2a01:c844:14a8:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:14a9::,2a01:c844:14a9:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:14a9:8000::,2a01:c844:14c6:7fff:ffff:ffff:ffff:ffff,FR -2a01:c844:14c6:8000::,2a01:c844:14c6:ffff:ffff:ffff:ffff:ffff,SK -2a01:c844:14c7::,2a01:c844:14cd:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:14ce::,2a01:c844:14ce:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:14ce:8000::,2a01:c844:14d1:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:14d2::,2a01:c844:14d2:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:14d2:8000::,2a01:c844:181f:ffff:ffff:ffff:ffff:ffff,FR -2a01:c844:1820::,2a01:c844:1820:7fff:ffff:ffff:ffff:ffff,SK -2a01:c844:1820:8000::,2a01:cb04::ffff:ffff:ffff:ffff:ffff,FR -2a01:cb04:1::,2a01:cb04:1:7fff:ffff:ffff:ffff:ffff,US -2a01:cb04:1:8000::,2a01:cb05:89d9:7fff:ffff:ffff:ffff:ffff,FR -2a01:cb05:89d9:8000::,2a01:cb05:89d9:ffff:ffff:ffff:ffff:ffff,BG -2a01:cb05:89da::,2a01:cb0c:81bb:3fff:ffff:ffff:ffff:ffff,FR -2a01:cb0c:81bb:4000::,2a01:cb0c:81bb:5fff:ffff:ffff:ffff:ffff,AU -2a01:cb0c:81bb:6000::,2a01:cb11:176:7fff:ffff:ffff:ffff:ffff,FR -2a01:cb11:176:8000::,2a01:cb11:176:ffff:ffff:ffff:ffff:ffff,LU -2a01:cb11:177::,2a01:cb11:65b:ffff:ffff:ffff:ffff:ffff,FR -2a01:cb11:65c::,2a01:cb11:65c:7fff:ffff:ffff:ffff:ffff,DE -2a01:cb11:65c:8000::,2a01:cb15:62:ffff:ffff:ffff:ffff:ffff,FR -2a01:cb15:63::,2a01:cb15:63:7fff:ffff:ffff:ffff:ffff,CH -2a01:cb15:63:8000::,2a01:cb15:6f:bfff:ffff:ffff:ffff:ffff,FR -2a01:cb15:6f:c000::,2a01:cb15:6f:ffff:ffff:ffff:ffff:ffff,NL -2a01:cb15:70::,2a01:cb15:9b:7fff:ffff:ffff:ffff:ffff,FR -2a01:cb15:9b:8000::,2a01:cb15:9b:ffff:ffff:ffff:ffff:ffff,CH -2a01:cb15:9c::,2a01:cb15:1f5:ffff:ffff:ffff:ffff:ffff,FR -2a01:cb15:1f6::,2a01:cb15:1f6:7fff:ffff:ffff:ffff:ffff,CH -2a01:cb15:1f6:8000::,2a01:cb19:5e9:7fff:ffff:ffff:ffff:ffff,FR -2a01:cb19:5e9:8000::,2a01:cb19:5e9:ffff:ffff:ffff:ffff:ffff,GF -2a01:cb19:5ea::,2a01:cb19:8563:7fff:ffff:ffff:ffff:ffff,FR -2a01:cb19:8563:8000::,2a01:cb19:8563:ffff:ffff:ffff:ffff:ffff,ES -2a01:cb19:8564::,2a01:cb19:8742:2000:f154:67e2:3b75:f718,FR -2a01:cb19:8742:2000:f154:67e2:3b75:f719,2a01:cb19:8742:2000:f154:67e2:3b75:f719,US -2a01:cb19:8742:2000:f154:67e2:3b75:f71a,2a01:dfff:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02::,2a02::ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:10::,2a02:17:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:18::,2a02:18:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:20::,2a02:20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:28::,2a02:2f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:30::,2a02:30:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:38::,2a02:38:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:40::,2a02:40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:48::,2a02:48:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:50::,2a02:50:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:58::,2a02:58:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:60::,2a02:67:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:68::,2a02:68:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:70::,2a02:70:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:78::,2a02:78:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:80::,2a02:87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:88::,2a02:88:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:98::,2a02:98:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:a0::,2a02:a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:a8::,2a02:a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:b8::,2a02:b8:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:c0::,2a02:c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:c8::,2a02:c8:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:d0::,2a02:d0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:d8::,2a02:d8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:e0::,2a02:e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:e8::,2a02:e8:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:f0::,2a02:f0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:f8::,2a02:f8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:100::,2a02:100:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:108::,2a02:10f:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:110::,2a02:110:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:118::,2a02:118:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:120::,2a02:127:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:128::,2a02:128:3:ffff:ffff:ffff:ffff:ffff,CZ -2a02:128:4::,2a02:128:4:ffff:ffff:ffff:ffff:ffff,NL -2a02:128:5::,2a02:128:5:ffff:ffff:ffff:ffff:ffff,CZ -2a02:128:6::,2a02:128:6:ffff:ffff:ffff:ffff:ffff,RU -2a02:128:7::,2a02:128:7:ffff:ffff:ffff:ffff:ffff,CZ -2a02:128:8::,2a02:128:8:ffff:ffff:ffff:ffff:ffff,RU -2a02:128:9::,2a02:128:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:130::,2a02:130:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:138::,2a02:138:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:140::,2a02:140:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:148::,2a02:14f:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:150::,2a02:150:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:158::,2a02:158:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:160::,2a02:160:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:168::,2a02:168:2074:ffff:ffff:ffff:ffff:ffff,CH -2a02:168:2075::,2a02:168:2075:7fff:ffff:ffff:ffff:ffff,LI -2a02:168:2075:8000::,2a02:16b:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:170::,2a02:170:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:178::,2a02:178:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:180::,2a02:180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:188::,2a02:18f:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:190::,2a02:190:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:198::,2a02:198:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:1a8::,2a02:1a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1b8::,2a02:1b8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:1c0::,2a02:1c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:1c8::,2a02:1c8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1d0::,2a02:1d0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:1d8::,2a02:1d8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:1e0::,2a02:1e8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1f0::,2a02:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:1f8::,2a02:1f8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:200::,2a02:207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:220::,2a02:220:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:228::,2a02:22f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:230::,2a02:230:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:238::,2a02:238:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:240::,2a02:240:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:248::,2a02:248:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:250::,2a02:250:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:258::,2a02:25f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:260::,2a02:260:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:268::,2a02:268:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:270::,2a02:270:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:278::,2a02:278:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:280::,2a02:280:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:288::,2a02:290:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:298::,2a02:298:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2a0::,2a02:2a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2a8::,2a02:2a8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2b0::,2a02:2b0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2b8::,2a02:2b8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2c0::,2a02:2c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2c8::,2a02:2c8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2d8::,2a02:2d8::7fff:ffff:ffff:ffff:ffff,RU -2a02:2d8:0:8000::,2a02:2d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2e0::,2a02:2e7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2e8::,2a02:2e8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2f0::,2a02:2f7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2f8::,2a02:2f8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:300::,2a02:300:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:308::,2a02:30f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:310::,2a02:310:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:320::,2a02:32f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:330::,2a02:330:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:338::,2a02:338:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:340::,2a02:340:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:348::,2a02:348:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:350::,2a02:350:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:358::,2a02:358:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:360::,2a02:360:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:368::,2a02:368:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:370::,2a02:370:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:380::,2a02:381:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a02:388::,2a02:388:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:390::,2a02:390:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:398::,2a02:398:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:3a0::,2a02:3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:3a8::,2a02:3a8:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:3b0::,2a02:3b0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:3b8::,2a02:3b8:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:3c0::,2a02:3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:3c8::,2a02:3c8:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:3d0::,2a02:3d0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a02:3d8::,2a02:3d8:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:3e0::,2a02:3e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:3e8::,2a02:3e8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:3f0::,2a02:3f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:3f8::,2a02:3f8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:400::,2a02:400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:408::,2a02:408:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:410::,2a02:410:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:418::,2a02:41f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:420::,2a02:427:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:428::,2a02:428:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:430::,2a02:430:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:438::,2a02:438:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:440::,2a02:440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:448::,2a02:44f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:450::,2a02:450:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:458::,2a02:458:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:460::,2a02:460:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:468::,2a02:46f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:470::,2a02:470:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:478::,2a02:478:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:488::,2a02:488:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:490::,2a02:497:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:498::,2a02:49f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4a0::,2a02:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:4a8::,2a02:4a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:4b0::,2a02:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:4b8::,2a02:4bf:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:4c8::,2a02:4c8:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:4d0::,2a02:4d0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4d8::,2a02:4d8:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:4e0::,2a02:4e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:4e8::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4f0::,2a02:4f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:4f8::,2a02:4f8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:500::,2a02:507:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:508::,2a02:508:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:518::,2a02:518:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:520::,2a02:520:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:530::,2a02:530:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:538::,2a02:538:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:540::,2a02:540:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:548::,2a02:548:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:550::,2a02:550:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:558::,2a02:558:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:560::,2a02:560:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:568::,2a02:568:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:570::,2a02:570:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:578::,2a02:578:5002:7fff:ffff:ffff:ffff:ffff,BE -2a02:578:5002:8000::,2a02:578:5002:ffff:ffff:ffff:ffff:ffff,RU -2a02:578:5003::,2a02:578:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:580::,2a02:587:c40a:bfff:ffff:ffff:ffff:ffff,GR -2a02:587:c40a:c000::,2a02:587:c40a:dfff:ffff:ffff:ffff:ffff,FR -2a02:587:c40a:e000::,2a02:587:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:588::,2a02:588:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:590::,2a02:597:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:598::,2a02:598:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:5a0::,2a02:5a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5b0::,2a02:5b7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5b8::,2a02:5bf:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5c0::,2a02:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:5d0::,2a02:5d7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5d8::,2a02:5d8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:5e0::,2a02:5e7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:5f0::,2a02:5f0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:600::,2a02:600:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:608::,2a02:608:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:610::,2a02:610:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:618::,2a02:618:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:620::,2a02:620:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:630::,2a02:630:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:638::,2a02:638:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a02:640::,2a02:647:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:648::,2a02:648:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:650::,2a02:650:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:658::,2a02:658:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:660::,2a02:660:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:668::,2a02:668:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:670::,2a02:670:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:678::,2a02:678:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:680::,2a02:680:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:688::,2a02:688:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:690::,2a02:690:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:698::,2a02:698:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6a0::,2a02:6a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:6a8::,2a02:6a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6b0::,2a02:6b0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6b8::,2a02:6b8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6c0::,2a02:6c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:6c8::,2a02:6c8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:6d0::,2a02:6d0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6d8::,2a02:6d8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:6e0::,2a02:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:6e8::,2a02:6e8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6f0::,2a02:6f0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:700::,2a02:700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:708::,2a02:708:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:710::,2a02:710:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:718::,2a02:718:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:720::,2a02:720:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:728::,2a02:728:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:730::,2a02:730:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:738::,2a02:738:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:740::,2a02:740:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:748::,2a02:748:afff:ffff:ffff:ffff:ffff:ffff,PL -2a02:748:b000::,2a02:748:b000:7fff:ffff:ffff:ffff:ffff,US -2a02:748:b000:8000::,2a02:748:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:750::,2a02:750:7:ffff:ffff:ffff:ffff:ffff,SE -2a02:750:8::,2a02:750:8:ffff:ffff:ffff:ffff:ffff,US -2a02:750:9::,2a02:757:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:758::,2a02:758:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:760::,2a02:767:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:768::,2a02:768:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:770::,2a02:770:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:778::,2a02:778:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:780::,2a02:787:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:788::,2a02:790:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:798::,2a02:798:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7a0::,2a02:7a7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7a8::,2a02:7a8:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:7b0::,2a02:7b0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7b8::,2a02:7b8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7c0::,2a02:7c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7c8::,2a02:7c8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:7d0::,2a02:7d0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7d8::,2a02:7d8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7e0::,2a02:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:7e8::,2a02:7e8:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:7f0::,2a02:7f0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:800::,2a02:807:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:808::,2a02:808:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:810::,2a02:810:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:818::,2a02:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:820::,2a02:820:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a02:828::,2a02:828:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:830::,2a02:830:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:838::,2a02:838:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:840::,2a02:840:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:848::,2a02:848:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:850::,2a02:850:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:858::,2a02:85f:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:860::,2a02:860:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:868::,2a02:86f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:870::,2a02:877:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:878::,2a02:878:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:880::,2a02:880:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:888::,2a02:888:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:890::,2a02:890:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:898::,2a02:898:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:8a0::,2a02:8a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8a8::,2a02:8a8:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:8b0::,2a02:8b0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:8b8::,2a02:8b8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8c0::,2a02:8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8c8::,2a02:8c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:8d0::,2a02:8d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:8e0::,2a02:8e0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:8e8::,2a02:8e8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:8f0::,2a02:8f0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:8f8::,2a02:8f8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:900::,2a02:900:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:908::,2a02:908:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:910::,2a02:910:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:918::,2a02:918:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:920::,2a02:920:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:928::,2a02:928:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:930::,2a02:930:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:938::,2a02:93f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:940::,2a02:947:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:950::,2a02:957:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:958::,2a02:958:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:960::,2a02:960:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:968::,2a02:968:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:970::,2a02:970:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:978::,2a02:978:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:980::,2a02:987:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:988::,2a02:988:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:990::,2a02:990:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:998::,2a02:998:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:9a0::,2a02:9a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:9c0::,2a02:9c7:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:9c8::,2a02:9cf:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:9e8::,2a02:9e8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:9f0::,2a02:9f0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:9f8::,2a02:9f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:a10::,2a02:a10::ffff:ffff:ffff:ffff:ffff,US -2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:a11::,2a02:a17:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:a20::,2a02:a20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:a28::,2a02:a28:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:a30::,2a02:a30:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a02:a38::,2a02:a38:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:a40::,2a02:a40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:a48::,2a02:a4f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:a50::,2a02:a50:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:a58::,2a02:a58:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:a60::,2a02:a60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:a68::,2a02:a68:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:a70::,2a02:a70:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:a78::,2a02:a78:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:a80::,2a02:a80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:a88::,2a02:a88:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:a90::,2a02:a90:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:a98::,2a02:a98:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a02:aa0::,2a02:aa6:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:aa7::,2a02:aa7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:aa8::,2a02:aaf:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:ab0::,2a02:ab0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:ab8::,2a02:abf:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:ac0::,2a02:ac0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ac8::,2a02:ac8:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:ad0::,2a02:ad7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ad8::,2a02:ad8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ae0::,2a02:ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ae8::,2a02:aef:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:af0::,2a02:af0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:af8::,2a02:af8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b00::,2a02:b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b08::,2a02:b0f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:b10::,2a02:b10:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b18::,2a02:b18:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:b20::,2a02:b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:b28::,2a02:b30:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:b48::,2a02:b48:ff:ffff:ffff:ffff:ffff:ffff,US -2a02:b48:100::,2a02:b4f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:b50::,2a02:b50:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b58::,2a02:b58:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:b60::,2a02:b60:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a02:b70::,2a02:b70:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:b78::,2a02:b78:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b80::,2a02:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b88::,2a02:b88:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:b90::,2a02:b90:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b98::,2a02:b98:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ba0::,2a02:ba0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:ba8::,2a02:ba8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:bb0::,2a02:bb0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:bb8::,2a02:bb8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:bc0::,2a02:bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:bc8::,2a02:bcf:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:bd0::,2a02:bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:bd8::,2a02:bd8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:be0::,2a02:be0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:be8::,2a02:be8:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:bf0::,2a02:bf0:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a02:bf8::,2a02:bf8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c00::,2a02:c00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c08::,2a02:c08:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a02:c10::,2a02:c10:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:c18::,2a02:c18:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c20::,2a02:c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:c28::,2a02:c2f:ffff:ffff:ffff:ffff:ffff:ffff,JE -2a02:c38::,2a02:c38:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:c40::,2a02:c47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:c48::,2a02:c50:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c58::,2a02:c58:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:c60::,2a02:c60:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:c68::,2a02:c68:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:c70::,2a02:c70:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c78::,2a02:c7f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c80::,2a02:c80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:c88::,2a02:c88:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c90::,2a02:c90:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:c98::,2a02:c9f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ca0::,2a02:ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:ca8::,2a02:ca8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:cb0::,2a02:cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:cc0::,2a02:cc9:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:cd0::,2a02:cd0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:cd8::,2a02:cd8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:ce0::,2a02:ce0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:ce8::,2a02:ce8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:cf0::,2a02:cf0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:d00::,2a02:d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:d08::,2a02:d0f:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:d10::,2a02:d17:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:d18::,2a02:d18:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a02:d20::,2a02:d20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d28::,2a02:d28:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:d30::,2a02:d30:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:d38::,2a02:d3f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:d40::,2a02:d40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d48::,2a02:d48:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d50::,2a02:d50:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d58::,2a02:d5f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:d60::,2a02:d60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:d68::,2a02:d6f:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:d70::,2a02:d70:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:d78::,2a02:d78:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d80::,2a02:d80:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:d88::,2a02:d88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:d90::,2a02:d97:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:d98::,2a02:d98:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:da8::,2a02:da8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:db0::,2a02:db0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:db8::,2a02:db8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:dc0::,2a02:dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:dc8::,2a02:dcf:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:dd0::,2a02:dd0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a02:dd8::,2a02:ddf:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:de0::,2a02:de0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:de8::,2a02:de8:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:df0::,2a02:df0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:df8::,2a02:dff:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e00::,2a02:e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e08::,2a02:e08:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e10::,2a02:e10:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e20::,2a02:e27:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:e28::,2a02:e28:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:e30::,2a02:e30:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:e38::,2a02:e38:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:e40::,2a02:e40:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:e48::,2a02:e48:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a02:e50::,2a02:e50:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:e58::,2a02:e5f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e60::,2a02:e60:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:e68::,2a02:e68:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e70::,2a02:e70:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:e80::,2a02:e80:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:e88::,2a02:e88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:e90::,2a02:e90:ffff:ffff:ffff:ffff:ffff:ffff,FO -2a02:e98::,2a02:e98:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:ea0::,2a02:ea7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ea8::,2a02:ea8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:eb0::,2a02:eb0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:eb8::,2a02:ebf:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ec0::,2a02:ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:ec8::,2a02:ec8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:ed0::,2a02:ed0:431d:7fff:ffff:ffff:ffff:ffff,IL -2a02:ed0:431d:8000::,2a02:ed0:431d:ffff:ffff:ffff:ffff:ffff,RO -2a02:ed0:431e::,2a02:ed0:53f9:ffff:ffff:ffff:ffff:ffff,IL -2a02:ed0:53fa::,2a02:ed0:53fa:7fff:ffff:ffff:ffff:ffff,US -2a02:ed0:53fa:8000::,2a02:ed7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:ed8::,2a02:ed8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:ee0::,2a02:ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:ef0::,2a02:ef0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:ef8::,2a02:ef8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f00::,2a02:f00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:f08::,2a02:f08:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f10::,2a02:f10:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a02:f18::,2a02:f18:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f20::,2a02:f20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f28::,2a02:f28:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f30::,2a02:f30:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f38::,2a02:f38:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f40::,2a02:f40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f48::,2a02:f4f:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:f50::,2a02:f50:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:f58::,2a02:f5f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:f60::,2a02:f60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:f68::,2a02:f6f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f70::,2a02:f70:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f78::,2a02:f7f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f80::,2a02:f80:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:f88::,2a02:f88:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:f90::,2a02:f90:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f98::,2a02:f98:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:fa0::,2a02:fa0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:fa8::,2a02:fa8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:fb0::,2a02:fb0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fb8::,2a02:fb8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fc0::,2a02:fc7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:fc8::,2a02:fc8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:fd0::,2a02:fd0:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a02:fd8::,2a02:fd8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:fe0::,2a02:fe7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:fe8::,2a02:fe9:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:ff0::,2a02:ff0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:1000::,2a02:103f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1200::,2a02:1206:4559:ffff:ffff:ffff:ffff:ffff,CH -2a02:1206:455a::,2a02:1206:455a:7fff:ffff:ffff:ffff:ffff,FR -2a02:1206:455a:8000::,2a02:1206:45c7:ffff:ffff:ffff:ffff:ffff,CH -2a02:1206:45c8::,2a02:1206:45c8:7fff:ffff:ffff:ffff:ffff,DE -2a02:1206:45c8:8000::,2a02:121e:48d:ffff:ffff:ffff:ffff:ffff,CH -2a02:121e:48e::,2a02:121e:48e:7fff:ffff:ffff:ffff:ffff,DE -2a02:121e:48e:8000::,2a02:121f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:1300::,2a02:1300:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:1308::,2a02:1308:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1310::,2a02:1310:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1318::,2a02:1318:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1320::,2a02:1320:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:1328::,2a02:1328:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1338::,2a02:1338:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:1340::,2a02:1340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1348::,2a02:1348:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1350::,2a02:1350:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1358::,2a02:1358:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:1360::,2a02:1360:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:1368::,2a02:1368:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:1370::,2a02:1370:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:1378::,2a02:1378:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1380::,2a02:1380:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:1388::,2a02:138f:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:1390::,2a02:1390:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:1398::,2a02:1398:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:13a0::,2a02:13a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:13a8::,2a02:13a8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:13b0::,2a02:13b0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:13b8::,2a02:13bf:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:13c0::,2a02:13c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:13c8::,2a02:13c8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:13d0::,2a02:13d0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:13d8::,2a02:13d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:13e0::,2a02:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:13e8::,2a02:13e8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:13f0::,2a02:13f0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:13f8::,2a02:13ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1400::,2a02:143f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:1600::,2a02:1600:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:1608::,2a02:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1610::,2a02:1610:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:1618::,2a02:1618:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a02:1620::,2a02:1620:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1628::,2a02:1628:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1630::,2a02:1630:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:1638::,2a02:1638:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:1648::,2a02:164f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1650::,2a02:1650:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:1658::,2a02:1658:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1660::,2a02:1660:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:1668::,2a02:166a:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:166b::,2a02:166b::ffff:ffff:ffff:ffff:ffff,US -2a02:166b:1::,2a02:166f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:1670::,2a02:1670:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1678::,2a02:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:1680::,2a02:1680:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:1688::,2a02:1688:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:1698::,2a02:1698:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:16a0::,2a02:16a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:16a8::,2a02:16a8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:16b0::,2a02:16b0:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a02:16b8::,2a02:16b8:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:16c0::,2a02:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:16c8::,2a02:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:16d0::,2a02:16d0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:16d8::,2a02:16d8:103:ffff:ffff:ffff:ffff:ffff,LV -2a02:16d8:104::,2a02:16d8:104:7fff:ffff:ffff:ffff:ffff,DE -2a02:16d8:104:8000::,2a02:16d8:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:16e0::,2a02:16e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:16e8::,2a02:16e8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:16f0::,2a02:16f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:16f8::,2a02:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1700::,2a02:1700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1710::,2a02:1710:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1718::,2a02:1718:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a02:1720::,2a02:1720:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:1730::,2a02:1730:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:1738::,2a02:1738:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:1740::,2a02:1740:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:1748::,2a02:1748:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:1750::,2a02:1750:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:1758::,2a02:175f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:1760::,2a02:1760:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:1770::,2a02:1770:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:1778::,2a02:1778:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:1780::,2a02:1780:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:1788::,2a02:1788:4ff:83ff:ffff:ffff:ffff:ffff,GB -2a02:1788:4ff:8400::,2a02:1788:4ff:84ff:ffff:ffff:ffff:ffff,US -2a02:1788:4ff:8500::,2a02:1788:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:1790::,2a02:1790:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:1798::,2a02:179f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:17a0::,2a02:17a7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:17a8::,2a02:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:17b0::,2a02:17b0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:17b8::,2a02:17b8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:17c0::,2a02:17c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:17c8::,2a02:17c8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:17d0::,2a02:17d0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:17d8::,2a02:17d8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:17e0::,2a02:17e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:17e8::,2a02:17e8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:17f0::,2a02:17f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:17f8::,2a02:17f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2000::,2a02:2000:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2008::,2a02:2008:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2010::,2a02:2017:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:2018::,2a02:2018:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2020::,2a02:2020:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:2028::,2a02:2028:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2030::,2a02:2030:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:2038::,2a02:2038:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2040::,2a02:2040:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2048::,2a02:2048:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2050::,2a02:2050:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2058::,2a02:2058:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2060::,2a02:2060:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2068::,2a02:206f:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2070::,2a02:2070:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2078::,2a02:2078:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:2080::,2a02:2080:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2088::,2a02:2088:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2090::,2a02:2090:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2098::,2a02:209f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:20a0::,2a02:20a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:20a8::,2a02:20a8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:20b0::,2a02:20b7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:20c8::,2a02:20c8:3361:ffff:ffff:ffff:ffff:ffff,NO -2a02:20c8:3362::,2a02:20c8:3362:7fff:ffff:ffff:ffff:ffff,DE -2a02:20c8:3362:8000::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:20d0::,2a02:20d7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:20d8::,2a02:20df:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:20e0::,2a02:20e7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:20f8::,2a02:20f8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2100::,2a02:2100:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2108::,2a02:2108:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2110::,2a02:2110:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2118::,2a02:211f:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2120::,2a02:2123:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2140::,2a02:2147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2148::,2a02:2149:8832:7fff:ffff:ffff:ffff:ffff,GR -2a02:2149:8832:8000::,2a02:2149:8832:ffff:ffff:ffff:ffff:ffff,US -2a02:2149:8833::,2a02:214f:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:2150::,2a02:2150:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2158::,2a02:215f:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:2160::,2a02:2160:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:2168::,2a02:2168:1770:7fff:ffff:ffff:ffff:ffff,RU -2a02:2168:1770:8000::,2a02:2168:1770:ffff:ffff:ffff:ffff:ffff,CN -2a02:2168:1771::,2a02:2168:284c:7fff:ffff:ffff:ffff:ffff,RU -2a02:2168:284c:8000::,2a02:2168:284c:ffff:ffff:ffff:ffff:ffff,AE -2a02:2168:284d::,2a02:2168:3bc5:ffff:ffff:ffff:ffff:ffff,RU -2a02:2168:3bc6::,2a02:2168:3bc6:7fff:ffff:ffff:ffff:ffff,US -2a02:2168:3bc6:8000::,2a02:2168:3bcb:ffff:ffff:ffff:ffff:ffff,RU -2a02:2168:3bcc::,2a02:2168:3bcc:7fff:ffff:ffff:ffff:ffff,US -2a02:2168:3bcc:8000::,2a02:216f:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2170::,2a02:2170:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2178::,2a02:217f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2180::,2a02:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2188::,2a02:2188:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2190::,2a02:2190:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2198::,2a02:219f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:21a0::,2a02:21a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:21a8::,2a02:21a8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:21b0::,2a02:21b7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:21b8::,2a02:21b8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:21c0::,2a02:21c0:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:21c8::,2a02:21c8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:21d0::,2a02:21d0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:21d8::,2a02:21d8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:21e0::,2a02:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:21e8::,2a02:21e8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:21f0::,2a02:21f0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:21f8::,2a02:21f8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2200::,2a02:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2208::,2a02:2208:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a02:2210::,2a02:2210:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2218::,2a02:2218:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2220::,2a02:2220:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2228::,2a02:2228:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2230::,2a02:2230:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:2240::,2a02:2247:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2248::,2a02:2248:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:2250::,2a02:2250:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2258::,2a02:2258:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2260::,2a02:2260:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2268::,2a02:2268:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2270::,2a02:2270:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2278::,2a02:2278:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2280::,2a02:2280:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2288::,2a02:2288:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2290::,2a02:2297:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:2298::,2a02:2298:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:22a0::,2a02:22a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:22a8::,2a02:22a8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:22b0::,2a02:22b0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:22b8::,2a02:22b8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:22c0::,2a02:22c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:22c8::,2a02:22c8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:22d0::,2a02:22d0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:22d8::,2a02:22d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:22e0::,2a02:22e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:22e8::,2a02:22e8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:22f0::,2a02:22f0:ff:ffff:ffff:ffff:ffff:ffff,DE -2a02:22f0:100::,2a02:22f0:1ff:ffff:ffff:ffff:ffff:ffff,GB -2a02:22f0:200::,2a02:22f0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2300::,2a02:2300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2308::,2a02:2308:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2310::,2a02:2310:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2318::,2a02:2318::7fff:ffff:ffff:ffff:ffff,IM -2a02:2318:0:8000::,2a02:231f:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2328::,2a02:2328:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2330::,2a02:2337:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:2338::,2a02:233f:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2340::,2a02:2340:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2348::,2a02:2348:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2350::,2a02:2350:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2358::,2a02:2358:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2360::,2a02:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2368::,2a02:2368:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2378::,2a02:2378:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2380::,2a02:2380:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2388::,2a02:2388:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2390::,2a02:2390:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a02:2398::,2a02:239f:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:23a0::,2a02:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:23a8::,2a02:23a8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:23b0::,2a02:23b0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:23b8::,2a02:23b8:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:23c0::,2a02:23c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:23c8::,2a02:23c8:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:23d0::,2a02:23d0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:23d8::,2a02:23d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:23e0::,2a02:23e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:23e8::,2a02:23e8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:23f0::,2a02:23f0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a02:23f8::,2a02:23f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2400::,2a02:2400:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2408::,2a02:2408:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2410::,2a02:2410:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2420::,2a02:2420:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2428::,2a02:2428:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2430::,2a02:2430:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2438::,2a02:2438:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2440::,2a02:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2448::,2a02:2448:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2450::,2a02:2457:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2458::,2a02:2458:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2468::,2a02:2468:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2470::,2a02:2477:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2478::,2a02:2480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2488::,2a02:2488:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2490::,2a02:2490:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2498::,2a02:2498:efff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2498:f000::,2a02:2498:f000:7fff:ffff:ffff:ffff:ffff,NL -2a02:2498:f000:8000::,2a02:2498:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:24a0::,2a02:24a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:24a8::,2a02:24a8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:24b0::,2a02:24b0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:24b8::,2a02:24bf:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:24c0::,2a02:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:24c8::,2a02:24c8:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:24d0::,2a02:24d7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:24d8::,2a02:24d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:24e0::,2a02:24e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:24e8::,2a02:24e8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:24f0::,2a02:24f0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:24f8::,2a02:24f8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2500::,2a02:2500:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2510::,2a02:2510:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2518::,2a02:2518:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2520::,2a02:2520:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2528::,2a02:252f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2530::,2a02:2530:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2538::,2a02:2538:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2540::,2a02:2540:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2548::,2a02:2548:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2550::,2a02:2550:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2558::,2a02:2558:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:2560::,2a02:2560:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2568::,2a02:2568:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2578::,2a02:2578:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2588::,2a02:258f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:25b0::,2a02:25b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:25c0::,2a02:25c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:25c8::,2a02:25c8:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:25d0::,2a02:25d0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:25d8::,2a02:25d8:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:25e0::,2a02:25e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:25e8::,2a02:25e8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:25f8::,2a02:25f8:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:2600::,2a02:2600:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2608::,2a02:2608:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:2610::,2a02:2610:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2618::,2a02:2618:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2620::,2a02:2620:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2628::,2a02:2628:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:2630::,2a02:2637:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:2638::,2a02:2638:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2640::,2a02:2647:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2648::,2a02:2648:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2650::,2a02:2650:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2658::,2a02:2658:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2660::,2a02:2660:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:2668::,2a02:2668:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2670::,2a02:2670:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2678::,2a02:2678:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2680::,2a02:2680:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2688::,2a02:2688:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2690::,2a02:2690:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2698::,2a02:2698:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:26a0::,2a02:26a7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:26a8::,2a02:26a8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:26b0::,2a02:26b0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:26b8::,2a02:26b8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:26c0::,2a02:26c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:26c8::,2a02:26c8:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:26d0::,2a02:26d0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a02:26e0::,2a02:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:26e8::,2a02:26e8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:26f0:f3:183::298d,2a02:26f0:f3:183::298d,TW -2a02:26f8::,2a02:26ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2700::,2a02:2700:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a02:2708::,2a02:2708:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2710::,2a02:2710:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2718::,2a02:271f:ffff:ffff:ffff:ffff:ffff:ffff,YE -2a02:2720::,2a02:2720:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:2728::,2a02:2728:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2730::,2a02:2730:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2738::,2a02:2738:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2740::,2a02:2740:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2748::,2a02:2748:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2750::,2a02:2750:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2760::,2a02:2760:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2768::,2a02:2768:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2770::,2a02:2770:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2778::,2a02:2778:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2780::,2a02:2780:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2788::,2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a8,BE -2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a9,2a02:2788:a4:132b:b0c0:24cd:a9f2:f7a9,LU -2a02:2788:a4:132b:b0c0:24cd:a9f2:f7aa,2a02:2788:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2790::,2a02:2790:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2798::,2a02:2798:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:27a8::,2a02:27a9:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:27aa::,2a02:27aa:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:27ab::,2a02:27ab:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:27ac::,2a02:27ac:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:27ad::,2a02:27af:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:27b0::,2a02:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:27b8::,2a02:27bf:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:27c0::,2a02:27c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:27c8::,2a02:27c8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:27d0::,2a02:27d0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:27d8::,2a02:27d8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:27e0::,2a02:27e0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:27e8::,2a02:27e8:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:27f0::,2a02:27f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:27f8::,2a02:27f8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2800::,2a02:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2808::,2a02:2808:2500:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2808:2501::,2a02:2808:2501:7fff:ffff:ffff:ffff:ffff,RU -2a02:2808:2501:8000::,2a02:2808:3000:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2808:3001::,2a02:2808:3001:ffff:ffff:ffff:ffff:ffff,RU -2a02:2808:3002::,2a02:2808:5300:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2808:5301::,2a02:2808:5301:ffff:ffff:ffff:ffff:ffff,RU -2a02:2808:5302::,2a02:2808:5400:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2808:5401::,2a02:2808:5401:ffff:ffff:ffff:ffff:ffff,FI -2a02:2808:5402::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2828::,2a02:2828:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2830::,2a02:2830:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2838::,2a02:2838:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2840::,2a02:2840:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2848::,2a02:2848:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2858::,2a02:285f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2860::,2a02:2867:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2868::,2a02:2868:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:2870::,2a02:2870:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2878::,2a02:2878:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2880::,2a02:2880:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:2888::,2a02:2888:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2890::,2a02:2890:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2898::,2a02:2898:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:28a0::,2a02:28a0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:28a8::,2a02:28a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:28b0::,2a02:28b7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:28b8::,2a02:28bf:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:28c0::,2a02:28c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:28c8::,2a02:28c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:28d0::,2a02:28d0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:28d8::,2a02:28d8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:28e8::,2a02:28e8:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:28f0::,2a02:28f0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:28f8::,2a02:28f8:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2900::,2a02:2900:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2908::,2a02:2908:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a02:2910::,2a02:2910:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2918::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2928::,2a02:2928:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2930::,2a02:2930:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2938::,2a02:2938:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2940::,2a02:2940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2948::,2a02:2948:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2950::,2a02:2950:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:2958::,2a02:2958:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2960::,2a02:2960:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:2968::,2a02:296f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2970::,2a02:2977:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2978::,2a02:2978:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2980::,2a02:2980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2988::,2a02:2988:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2990::,2a02:2990:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2998::,2a02:2998:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:29a0::,2a02:29a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:29a8::,2a02:29a8:3ff:ffff:ffff:ffff:ffff:ffff,NL -2a02:29a8:400::,2a02:29a8:4ff:ffff:ffff:ffff:ffff:ffff,SG -2a02:29a8:500::,2a02:29a8:7ff:ffff:ffff:ffff:ffff:ffff,NL -2a02:29a8:800::,2a02:29a8:8ff:ffff:ffff:ffff:ffff:ffff,US -2a02:29a8:900::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:29b8::,2a02:29b8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:29c0::,2a02:29c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:29c8::,2a02:29c8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:29d0::,2a02:29d0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:29d8::,2a02:29d8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:29e0::,2a02:29e0::ffff:ffff:ffff:ffff:ffff,IT -2a02:29e0:1::,2a02:29e0:1:7fff:ffff:ffff:ffff:ffff,GB -2a02:29e0:1:8000::,2a02:29e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:29e8::,2a02:29ef:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:29f0::,2a02:29f0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:29f8::,2a02:29f8:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a02:2a00::,2a02:2a00:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:2a08::,2a02:2a08:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2a10::,2a02:2a10:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2a18::,2a02:2a18:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2a20::,2a02:2a20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2a28::,2a02:2a28:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2a30::,2a02:2a37:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2a38::,2a02:2a38:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2a40::,2a02:2a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2a48::,2a02:2a48:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2a50::,2a02:2a50:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a02:2a58::,2a02:2a58:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2a60::,2a02:2a60:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a02:2a68::,2a02:2a68:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2a70::,2a02:2a70:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:2a78::,2a02:2a78:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2a80::,2a02:2a80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2a88::,2a02:2a88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2a90::,2a02:2a90:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:2a98::,2a02:2a98:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:2aa0::,2a02:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2aa8::,2a02:2aa8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2ab0::,2a02:2ab0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2ab8::,2a02:2ab8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2ac0::,2a02:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2ac8::,2a02:2ac8:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2ad0::,2a02:2ad0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2ad8::,2a02:2ad8:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2ae0::,2a02:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2ae8::,2a02:2ae8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2af0::,2a02:2af0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:2af8::,2a02:2af8:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2b00::,2a02:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2b08::,2a02:2b08:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2b10::,2a02:2b10:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2b18::,2a02:2b18::7fff:ffff:ffff:ffff:ffff,RU -2a02:2b18:0:8000::,2a02:2b18::ffff:ffff:ffff:ffff:ffff,UA -2a02:2b18:1::,2a02:2b18:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2b20::,2a02:2b20:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:2b28::,2a02:2b28:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2b30::,2a02:2b30:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:2b38::,2a02:2b38:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2b40::,2a02:2b47:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:2b48::,2a02:2b4f:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2b50::,2a02:2b50:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:2b58::,2a02:2b5f:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:2b60::,2a02:2b60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2b80::,2a02:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2b88::,2a02:2b88:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:2b90::,2a02:2b97:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2b98::,2a02:2b98:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:2ba0::,2a02:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a02:2ba8::,2a02:2ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2bb0::,2a02:2bb0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:2bb8::,2a02:2bb8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2bc0::,2a02:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2c00::,2a02:2c07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:2c40::,2a02:2c40:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2c60::,2a02:2c60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2c80::,2a02:2c80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2ca6:2e::,2a02:2ca6:2e:ffff:ffff:ffff:ffff:ffff,GB -2a02:2ca7:2e::,2a02:2ca7:2e:ffff:ffff:ffff:ffff:ffff,US -2a02:2cc0::,2a02:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2ce0::,2a02:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:2d00::,2a02:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2d20::,2a02:2d20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2d40::,2a02:2d40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2d60::,2a02:2d60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2da0::,2a02:2da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:2dc0::,2a02:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2de0::,2a02:2de0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:2e00::,2a02:2e1f:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2f00::,2a02:2f04:d17:7fff:ffff:ffff:ffff:ffff,RO -2a02:2f04:d17:8000::,2a02:2f04:d17:ffff:ffff:ffff:ffff:ffff,HU -2a02:2f04:d18::,2a02:2f0f:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:2f80::,2a02:2f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2fa0::,2a02:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2fc0::,2a02:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2fe0::,2a02:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:3000::,2a02:31ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4000::,2a02:4000:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:4020::,2a02:4020:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:4040::,2a02:4040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4060::,2a02:4067:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:40c0::,2a02:40c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:40e0::,2a02:40e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:4100::,2a02:4100:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4120::,2a02:4120:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:4140::,2a02:4140:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:4160::,2a02:4160:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:4180::,2a02:4180:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:41a0::,2a02:41a7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:41c0::,2a02:41c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:41e0::,2a02:41e0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:4200::,2a02:4200:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:4220::,2a02:4220:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:4240::,2a02:4240:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4260::,2a02:4267:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:4280::,2a02:4280:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a02:42a0::,2a02:42a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:42c0::,2a02:42c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:42e0::,2a02:42e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:4300::,2a02:4300:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:4320::,2a02:4320:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:4340::,2a02:4340:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4360::,2a02:4360:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:4380::,2a02:4380:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a02:43a0::,2a02:43a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a02:43c0::,2a02:43c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:43e0::,2a02:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4400::,2a02:4400:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a02:4420::,2a02:4420:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:4440::,2a02:4440:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a02:4460::,2a02:4460:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:4480::,2a02:4480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:44a0::,2a02:44a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:44c0::,2a02:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:44e0::,2a02:44e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4500::,2a02:4500:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4520::,2a02:4520:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a02:4540::,2a02:4547:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:4560::,2a02:4560:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4580::,2a02:4580:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:45a0::,2a02:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:45c0::,2a02:45c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4600::,2a02:4600:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4620::,2a02:4620:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:4640::,2a02:4640:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4660::,2a02:4660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4680::,2a02:4680:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:46a0::,2a02:46a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:46c0::,2a02:46c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:46e0::,2a02:46e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4720::,2a02:4720:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4740::,2a02:4740:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4760::,2a02:4760:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:4780::,2a02:4780::ffff:ffff:ffff:ffff:ffff,LT -2a02:4780:1::,2a02:4780:1:ffff:ffff:ffff:ffff:ffff,US -2a02:4780:2::,2a02:4780:2:ffff:ffff:ffff:ffff:ffff,GB -2a02:4780:3::,2a02:4780:bac:ffff:ffff:ffff:ffff:ffff,LT -2a02:4780:bad::,2a02:4780:bad:ffff:ffff:ffff:ffff:ffff,US -2a02:4780:bae::,2a02:4780:deac:ffff:ffff:ffff:ffff:ffff,LT -2a02:4780:dead::,2a02:4780:dead:ffff:ffff:ffff:ffff:ffff,US -2a02:4780:deae::,2a02:4780:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:47a0::,2a02:47a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:47c0::,2a02:47c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:47e0::,2a02:47e7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:4800::,2a02:4807:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:4820::,2a02:4820:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:4840::,2a02:4840:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:4860::,2a02:4860:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4880::,2a02:4880:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:48a0::,2a02:48a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:48e0::,2a02:48e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4900::,2a02:4907:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:4940::,2a02:4940:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:4960::,2a02:4960:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:4980::,2a02:4980:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:49a0::,2a02:49a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:49c0::,2a02:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:49e0::,2a02:49e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4a00::,2a02:4a00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:4a20::,2a02:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4a40::,2a02:4a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:4a60::,2a02:4a60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4a80::,2a02:4a80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:4aa0::,2a02:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4ac0::,2a02:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:4ac1::,2a02:4ac1:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:4ac2::,2a02:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:4ae0::,2a02:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4b00::,2a02:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:4b40::,2a02:4b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4b60::,2a02:4b60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4b80::,2a02:4b80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4ba0::,2a02:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:4bc0::,2a02:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:4be0::,2a02:4be0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:4c00::,2a02:4c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4c20::,2a02:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4c40::,2a02:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4c80::,2a02:4c80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:4cc0::,2a02:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4ce0::,2a02:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4d00::,2a02:4d00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4d20::,2a02:4d20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4d40::,2a02:4d40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:4d60::,2a02:4d60:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a02:4d80::,2a02:4d80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4da0::,2a02:4da0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:4dc0::,2a02:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:4de0::,2a02:4de0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:4e20::,2a02:4e20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4e40::,2a02:4e40:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:4e60::,2a02:4e60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:4e80::,2a02:4e80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:4ea0::,2a02:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:4ec0::,2a02:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4ee0::,2a02:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:4f00::,2a02:4f00:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:4f20::,2a02:4f20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4f40::,2a02:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:4f60::,2a02:4f67:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4f80::,2a02:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:4fa0::,2a02:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:4fc0::,2a02:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:4fe0::,2a02:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:5000::,2a02:5000:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5020::,2a02:5020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5040::,2a02:5040:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:5060::,2a02:5060:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5080::,2a02:5080:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:50a0::,2a02:50a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:50c0::,2a02:50c7:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a02:50e0::,2a02:50e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5100::,2a02:5100:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5120::,2a02:5120:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:5140::,2a02:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5160::,2a02:5160:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5180::,2a02:5180:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:51a0::,2a02:51a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:51c0::,2a02:51c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:51e0::,2a02:51e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5200::,2a02:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5220::,2a02:5220:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:5240::,2a02:5240:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:5260::,2a02:5260:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5280::,2a02:5280:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:52a0::,2a02:52a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:52c0::,2a02:52c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:52e0::,2a02:52e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5300::,2a02:5300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5320::,2a02:5320:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a02:5340::,2a02:5340:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:5360::,2a02:5360:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5380::,2a02:5380:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:53a0::,2a02:53a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:53c0::,2a02:53c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:53e0::,2a02:53e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5400::,2a02:5400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5420::,2a02:5420:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:5440::,2a02:5440:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:5460::,2a02:5460:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5480::,2a02:5480:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:54a0::,2a02:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:54c0::,2a02:54c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:54e0::,2a02:54e7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5500::,2a02:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5520::,2a02:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5540::,2a02:5540:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5560::,2a02:5560:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:5580::,2a02:5580:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a02:55a0::,2a02:55a0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:55c0::,2a02:55c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:55e0::,2a02:55e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5600::,2a02:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5620::,2a02:5620:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5640::,2a02:5647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5660::,2a02:5660:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5680::,2a02:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:56a0::,2a02:56a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:56c0::,2a02:56c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:56e0::,2a02:56e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5700::,2a02:5700:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:5720::,2a02:5720:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a02:5740::,2a02:5740:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:5760::,2a02:5767:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5780::,2a02:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:57a0::,2a02:57a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:57c0::,2a02:57c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:57e0::,2a02:57e7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:5800::,2a02:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5820::,2a02:5820:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5840::,2a02:5840:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5860::,2a02:5860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5880::,2a02:5880:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:58a0::,2a02:58a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:58c0::,2a02:58c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:58e0::,2a02:58e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5900::,2a02:5907:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:5920::,2a02:5920:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:5940::,2a02:5940:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:5960::,2a02:5960:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a02:5980::,2a02:5980:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:59a0::,2a02:59a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:59c0::,2a02:59c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:59e0::,2a02:59e0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:5a20::,2a02:5a20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5a40::,2a02:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5a60::,2a02:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5a80::,2a02:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5aa0::,2a02:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5ac0::,2a02:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5ae0::,2a02:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5b00::,2a02:5b00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5b20::,2a02:5b20:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:5b40::,2a02:5b40:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:5b60::,2a02:5b60:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:5b80::,2a02:5b80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:5ba0::,2a02:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5bc0::,2a02:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5be0::,2a02:5be0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5c00::,2a02:5c07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5c20::,2a02:5c27:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:5c40::,2a02:5c40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5c60::,2a02:5c60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5c80::,2a02:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5ca0::,2a02:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5cc0::,2a02:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5ce0::,2a02:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5d00::,2a02:5d01:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:5d20::,2a02:5d20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:5d40::,2a02:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5d60::,2a02:5d60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5d80::,2a02:5d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5da0::,2a02:5da0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:5dc0::,2a02:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5de0::,2a02:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:5e00::,2a02:5e00:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:5e20::,2a02:5e20:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:5e40::,2a02:5e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:5e60::,2a02:5e60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:5e80::,2a02:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:5ea0::,2a02:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5ec0::,2a02:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:5ee0::,2a02:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a02:5f00::,2a02:5f00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5f20::,2a02:5f20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:5f40::,2a02:5f40:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:5f60::,2a02:5f60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:5f80::,2a02:5f87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5fa0::,2a02:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:5fc0::,2a02:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5fe0::,2a02:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6000::,2a02:6000:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:6020::,2a02:6027:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a02:6040::,2a02:6040:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:6060::,2a02:6060:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:6080::,2a02:6080:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:60a0::,2a02:60a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:60c0::,2a02:60c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:60e0::,2a02:60e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6100::,2a02:6100:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6120::,2a02:6120:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:6160::,2a02:6160:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6180::,2a02:6180:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:61a0::,2a02:61a0:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:61c0::,2a02:61c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:61e0::,2a02:61e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:6200::,2a02:6207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:6240::,2a02:6240:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6260::,2a02:6260:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:6280::,2a02:6280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:62a0::,2a02:62a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:62c0::,2a02:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:6300::,2a02:6300:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:6320::,2a02:6320:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:6340::,2a02:6340:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:6360::,2a02:6360:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:6380::,2a02:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:63a0::,2a02:63a0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:63c0::,2a02:63c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:63e0::,2a02:63e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:6400::,2a02:6400:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6420::,2a02:6420:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:6440::,2a02:6440:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:6460::,2a02:6460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:6480::,2a02:6480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:64a0::,2a02:64a0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:64c0::,2a02:64c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:64e0::,2a02:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6500::,2a02:6500:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:6520::,2a02:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:6540::,2a02:6540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6560::,2a02:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6580::,2a02:6580:ffff:ffff:ffff:ffff:ffff:ffff,US -2a02:65a0::,2a02:65a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:65c0::,2a02:65c0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:65e0::,2a02:65e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6600::,2a02:6600:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:6620::,2a02:6627:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6640::,2a02:6640:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6660::,2a02:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6680::,2a02:6680:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:66a0::,2a02:66a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:66c0::,2a02:66c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:66e0::,2a02:66e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6700::,2a02:6700:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:6720::,2a02:6720:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:6740::,2a02:6740:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:6760::,2a02:6760:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:6780::,2a02:6780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:67a0::,2a02:67a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a02:67c0::,2a02:67c0:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a02:67e0::,2a02:67e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:6800::,2a02:6800:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:6820::,2a02:6820:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:6840::,2a02:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6860::,2a02:6860:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6880::,2a02:6880:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:68a0::,2a02:68a0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:68c0::,2a02:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:68e0::,2a02:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6900::,2a02:6900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:6920::,2a02:6920:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6940::,2a02:6940:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:6960::,2a02:6960:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6980::,2a02:6980:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:69a0::,2a02:69a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:69c0::,2a02:69c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6a00::,2a02:6a00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6a20::,2a02:6a20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6a40::,2a02:6a40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:6a60::,2a02:6a60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:6a80::,2a02:6a80:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:6aa0::,2a02:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6ac0::,2a02:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6ae0::,2a02:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6b00::,2a02:6b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6b20::,2a02:6b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:6b40::,2a02:6b40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:6b60::,2a02:6b60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6b80::,2a02:6b80:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:6ba0::,2a02:6ba7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6bc0::,2a02:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6be0::,2a02:6be0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:6c00::,2a02:6c00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6c20::,2a02:6c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:6c40::,2a02:6c40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6c60::,2a02:6c60:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:6c80::,2a02:6c80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6ca0::,2a02:6ca7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:6cc0::,2a02:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6ce0::,2a02:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:6d00::,2a02:6d00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6d20::,2a02:6d20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6d40::,2a02:6d40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6d60::,2a02:6d60:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:6d80::,2a02:6d80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6da0::,2a02:6da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6dc0::,2a02:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:6de0::,2a02:6de0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6e20::,2a02:6e20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6e40::,2a02:6e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6e60::,2a02:6e60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:6ea0::,2a02:6ea0:bfff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6ea0:c000::,2a02:6ea0:c0ff:ffff:ffff:ffff:ffff:ffff,NL -2a02:6ea0:c100::,2a02:6ea0:c1ff:ffff:ffff:ffff:ffff:ffff,US -2a02:6ea0:c200::,2a02:6ea0:c2ff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:6ea0:c300::,2a02:6ea0:c3ff:ffff:ffff:ffff:ffff:ffff,ES -2a02:6ea0:c400::,2a02:6ea0:c4ff:ffff:ffff:ffff:ffff:ffff,US -2a02:6ea0:c500::,2a02:6ea0:c5ff:ffff:ffff:ffff:ffff:ffff,SE -2a02:6ea0:c600::,2a02:6ea0:c6ff:ffff:ffff:ffff:ffff:ffff,US -2a02:6ea0:c700::,2a02:6ea0:c7ff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6ea0:c800::,2a02:6ea0:c8ff:ffff:ffff:ffff:ffff:ffff,US -2a02:6ea0:c900::,2a02:6ea0:c9ff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6ea0:ca00::,2a02:6ea0:cc00::,GB -2a02:6ea0:cc00::1,2a02:6ea0:cc00::1,US -2a02:6ea0:cc00::2,2a02:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6ec0::,2a02:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:6f00::,2a02:6f00:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:6f20::,2a02:6f20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:6f40::,2a02:6f40:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:6f60::,2a02:6f60:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:6f80::,2a02:6f80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6fa0::,2a02:6fa0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:6fc0::,2a02:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:6fe0::,2a02:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7000::,2a02:7007:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:7040::,2a02:7040:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:7060::,2a02:7060:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7080::,2a02:7080:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:70a0::,2a02:70a0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:70c0::,2a02:70c0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a02:70e0::,2a02:70e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:7100::,2a02:7100:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:7120::,2a02:7120:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7140::,2a02:7140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7160::,2a02:7160:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7180::,2a02:7180:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:71a0::,2a02:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:71c0::,2a02:71c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:71e0::,2a02:71e0:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:7200::,2a02:7200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7220::,2a02:7220:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7240::,2a02:7240:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:7260::,2a02:7260:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a02:7280::,2a02:7280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:72a0::,2a02:72a7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:72e0::,2a02:72e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7300::,2a02:7300:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a02:7320::,2a02:7320:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7340::,2a02:7340:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7360::,2a02:7360:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7380::,2a02:7380:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:73a0::,2a02:73a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:73c0::,2a02:73c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:73e0::,2a02:73e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7400::,2a02:7400:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7420::,2a02:7420:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:7440::,2a02:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7460::,2a02:7460:ffff:ffff:ffff:ffff:ffff:ffff,MQ -2a02:7480::,2a02:7480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:74a0::,2a02:74a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:74c0::,2a02:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:74e0::,2a02:74e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7500::,2a02:7500:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a02:7520::,2a02:7520:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7540::,2a02:7540:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:7560::,2a02:7560:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:7580::,2a02:7580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:75a0::,2a02:75a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:75c0::,2a02:75c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:75e0::,2a02:75e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7600::,2a02:7600:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:7620::,2a02:7620:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7640::,2a02:7640:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:7660::,2a02:7660:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:7680::,2a02:7680:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:76a0::,2a02:76a0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:76c0::,2a02:76c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:76e0::,2a02:76e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7700::,2a02:7700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7720::,2a02:7727:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7740::,2a02:7740:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:7760::,2a02:7760:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7780::,2a02:7780:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:77a0::,2a02:77a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:77c0::,2a02:77c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:77e0::,2a02:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7800::,2a02:7800:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7820::,2a02:7820:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7840::,2a02:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7860::,2a02:7867:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:7880::,2a02:7880:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:78a0::,2a02:78a7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:78c0::,2a02:78c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:78e0::,2a02:78e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7900::,2a02:7900:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:7920::,2a02:7920:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7940::,2a02:7940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7960::,2a02:7960:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7980::,2a02:7980:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a02:79a0::,2a02:79a0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a02:79c0::,2a02:79c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:79e0::,2a02:79e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7a00::,2a02:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:7a20::,2a02:7a20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7a40::,2a02:7a40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7a60::,2a02:7a60:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:7a80::,2a02:7a80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7aa0::,2a02:7aa0:42:ffff:ffff:ffff:ffff:ffff,LV -2a02:7aa0:43::,2a02:7aa0:43:7fff:ffff:ffff:ffff:ffff,SE -2a02:7aa0:43:8000::,2a02:7aa0:1618:ffff:ffff:ffff:ffff:ffff,LV -2a02:7aa0:1619::,2a02:7aa0:1619:ffff:ffff:ffff:ffff:ffff,SE -2a02:7aa0:161a::,2a02:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:7ac0::,2a02:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7ae0::,2a02:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7b00::,2a02:7b07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7b20::,2a02:7b20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7b40::,2a02:7b40:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:7b60::,2a02:7b60:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a02:7b80::,2a02:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:7ba0::,2a02:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7bc0::,2a02:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7be0::,2a02:7be0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7c00::,2a02:7c00:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:7c20::,2a02:7c20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7c40::,2a02:7c40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7c60::,2a02:7c60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7c80::,2a02:7c80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7ca0::,2a02:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a02:7cc0::,2a02:7cc0::ffff:ffff:ffff:ffff:ffff,CY -2a02:7cc0:1::,2a02:7cc0:1:7fff:ffff:ffff:ffff:ffff,RU -2a02:7cc0:1:8000::,2a02:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a02:7ce0::,2a02:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7d00::,2a02:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:7d20::,2a02:7d20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7d60::,2a02:7d60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:7d80::,2a02:7d80:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:7da0::,2a02:7da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7dc0::,2a02:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:7de0::,2a02:7de0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7e00::,2a02:7e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7e20::,2a02:7e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:7e40::,2a02:7e40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7e60::,2a02:7e60:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:7e80::,2a02:7e80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7ea0::,2a02:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:7ec0::,2a02:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7ee0::,2a02:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:7f00::,2a02:7f00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7f20::,2a02:7f20:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:7f40::,2a02:7f40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7f60::,2a02:7f60:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a02:7f80::,2a02:7f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7fa0::,2a02:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:7fe0::,2a02:7fe7:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:8000::,2a02:8001:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8010::,2a02:8017:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:8020::,2a02:8023:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8040::,2a02:8043:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:8060::,2a02:8061:ffff:ffff:ffff:ffff:ffff:ffff,AD -2a02:8070::,2a02:8070:88ab:3fff:ffff:ffff:ffff:ffff,DE -2a02:8070:88ab:4000::,2a02:8070:88ab:7fff:ffff:ffff:ffff:ffff,US -2a02:8070:88ab:8000::,2a02:8071:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8080::,2a02:8085:6fff:ffff:ffff:ffff:ffff:ffff,IE -2a02:8085:7000::,2a02:8085:7000:7fff:ffff:ffff:ffff:ffff,GB -2a02:8085:7000:8000::,2a02:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:80c0::,2a02:80c3:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:80e0::,2a02:80e3:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:8100::,2a02:811f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8200::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:8300::,2a02:830f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:8380::,2a02:838f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:8400::,2a02:8433:308f:ffff:ffff:ffff:ffff:ffff,FR -2a02:8433:3090::,2a02:8433:3090:7fff:ffff:ffff:ffff:ffff,NL -2a02:8433:3090:8000::,2a02:847f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:8800::,2a02:88ff:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:9000::,2a02:91ff:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:9940::,2a02:9940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:a000::,2a02:a03f:1e4e:7fff:ffff:ffff:ffff:ffff,BE -2a02:a03f:1e4e:8000::,2a02:a03f:1e4e:ffff:ffff:ffff:ffff:ffff,FR -2a02:a03f:1e4f::,2a02:a03f:24d7:ffff:ffff:ffff:ffff:ffff,BE -2a02:a03f:24d8::,2a02:a03f:24d8:7fff:ffff:ffff:ffff:ffff,FR -2a02:a03f:24d8:8000::,2a02:a03f:40c6:7fff:ffff:ffff:ffff:ffff,BE -2a02:a03f:40c6:8000::,2a02:a03f:40c6:ffff:ffff:ffff:ffff:ffff,LU -2a02:a03f:40c7::,2a02:a03f:6025:ffff:ffff:ffff:ffff:ffff,BE -2a02:a03f:6026::,2a02:a03f:6026:7fff:ffff:ffff:ffff:ffff,FR -2a02:a03f:6026:8000::,2a02:a03f:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:a200::,2a02:a21f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:a300::,2a02:a317:e242:7fff:ffff:ffff:ffff:ffff,PL -2a02:a317:e242:8000::,2a02:a317:e242:ffff:ffff:ffff:ffff:ffff,US -2a02:a317:e243::,2a02:a31f:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:a400::,2a02:a441:813a:ffff:ffff:ffff:ffff:ffff,NL -2a02:a441:813b::,2a02:a441:813b:7fff:ffff:ffff:ffff:ffff,US -2a02:a441:813b:8000::,2a02:a451:6958:ffff:ffff:ffff:ffff:ffff,NL -2a02:a451:6959::,2a02:a451:6959:7fff:ffff:ffff:ffff:ffff,US -2a02:a451:6959:8000::,2a02:a453:3ccc:ffff:ffff:ffff:ffff:ffff,NL -2a02:a453:3ccd::,2a02:a453:3ccd:7fff:ffff:ffff:ffff:ffff,US -2a02:a453:3ccd:8000::,2a02:a453:629a:ffff:ffff:ffff:ffff:ffff,NL -2a02:a453:629b::,2a02:a453:629b:7fff:ffff:ffff:ffff:ffff,DE -2a02:a453:629b:8000::,2a02:a453:bc11:ffff:ffff:ffff:ffff:ffff,NL -2a02:a453:bc12::,2a02:a453:bc12:7fff:ffff:ffff:ffff:ffff,NZ -2a02:a453:bc12:8000::,2a02:a47f:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:a800::,2a02:a83f:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:aa00::,2a02:aa11:117e:7fff:ffff:ffff:ffff:ffff,CH -2a02:aa11:117e:8000::,2a02:aa11:117e:ffff:ffff:ffff:ffff:ffff,DE -2a02:aa11:117f::,2a02:aa12:6480:ffff:ffff:ffff:ffff:ffff,CH -2a02:aa12:6481::,2a02:aa12:6481:7fff:ffff:ffff:ffff:ffff,DE -2a02:aa12:6481:8000::,2a02:aa1f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:ab00::,2a02:ab07:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a02:ab40::,2a02:ab47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:ab80::,2a02:ab8f:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:ac00::,2a02:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:ac40::,2a02:ac47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:ac80::,2a02:ac87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:acc0::,2a02:acc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ad40::,2a02:ad47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ad80::,2a02:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:adc0::,2a02:adc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ae00::,2a02:ae07:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a02:ae40::,2a02:ae47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:ae80::,2a02:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:aec0::,2a02:aec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:af00::,2a02:af07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:af40::,2a02:af47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:af80::,2a02:af87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:afc0::,2a02:afc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:b000::,2a02:b1ff:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c000::,2a02:c007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c040::,2a02:c047:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:c080::,2a02:c087:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:c0c0::,2a02:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:c100::,2a02:c107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c140::,2a02:c147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c180::,2a02:c187:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:c1c0::,2a02:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c200::,2a02:c207:2013:ffff:ffff:ffff:ffff:ffff,DE -2a02:c207:2014::,2a02:c207:2014:7fff:ffff:ffff:ffff:ffff,US -2a02:c207:2014:8000::,2a02:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c280::,2a02:c287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:c2c0::,2a02:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c300::,2a02:c307:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c340::,2a02:c347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:c380::,2a02:c383:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:c390::,2a02:c397:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:c3a0::,2a02:c3a3:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:c3c0::,2a02:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a02:c400::,2a02:c407:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a02:c440::,2a02:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c480::,2a02:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:c4c0::,2a02:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:c500::,2a02:c507:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:c540::,2a02:c547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c580::,2a02:c587:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:c5c0::,2a02:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:c600::,2a02:c600:ff:ffff:ffff:ffff:ffff:ffff,CH -2a02:c600:100::,2a02:c600:100:7fff:ffff:ffff:ffff:ffff,CZ -2a02:c600:100:8000::,2a02:c607:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:c640::,2a02:c647:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:c680::,2a02:c681:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c690::,2a02:c691:ffff:ffff:ffff:ffff:ffff:ffff,AD -2a02:c6a0::,2a02:c6a3:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c6c0::,2a02:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c700::,2a02:c707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c740::,2a02:c747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:c780::,2a02:c787:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a02:c7c0::,2a02:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:c800::,2a02:c807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c840::,2a02:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:c880::,2a02:c887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:c8c0::,2a02:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a02:c900::,2a02:c907:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:c940::,2a02:c947:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:c980::,2a02:c987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:c9c0::,2a02:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ca00::,2a02:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ca40::,2a02:ca47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ca80::,2a02:ca87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:cac0::,2a02:cac7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:cb00::,2a02:cb07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:cb40::,2a02:cb47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:cb80::,2a02:cb87:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:cbc0::,2a02:cbc3:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a02:cbe0::,2a02:cbe1:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:cbf0::,2a02:cbf7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:cc00::,2a02:cc07:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:cc40::,2a02:cc47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:cc80::,2a02:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ccc0::,2a02:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:cd00::,2a02:cd07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:cd40::,2a02:cd47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:cd80::,2a02:cd87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:cdc0::,2a02:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:ce00::,2a02:ce07:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:ce40::,2a02:ce47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:ce80::,2a02:ce87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:cec0::,2a02:cec3:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:cee0::,2a02:cee3:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:cf00::,2a02:cf07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:cf40::,2a02:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:cf80::,2a02:cf87:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:cfc0::,2a02:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d000::,2a02:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:d040::,2a02:d047:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:d080::,2a02:d087:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a02:d0c0::,2a02:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:d100::,2a02:d107:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:d140::,2a02:d147:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:d180::,2a02:d187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d1c0::,2a02:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:d200::,2a02:d207:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:d240::,2a02:d247:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a02:d280::,2a02:d287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:d2c0::,2a02:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:d300::,2a02:d307:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:d340::,2a02:d347:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d380::,2a02:d387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:d3c0::,2a02:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:d400::,2a02:d407:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:d440::,2a02:d447:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:d480::,2a02:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d4c0::,2a02:d4c3:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a02:d4e0::,2a02:d4e3:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d500::,2a02:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:d540::,2a02:d547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:d580::,2a02:d587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d5c0::,2a02:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:d600::,2a02:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d640::,2a02:d647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d680::,2a02:d683:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:d6a0::,2a02:d6a7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d6c0::,2a02:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:d700::,2a02:d707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:d740::,2a02:d747:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:d780::,2a02:d787:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:d7c0::,2a02:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:d800::,2a02:d807:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:d840::,2a02:d847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:d880::,2a02:d880:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:d8a0::,2a02:d8a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:d8c0::,2a02:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:d900::,2a02:d907:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:d940::,2a02:d947:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:d980::,2a02:d987:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:d9c0::,2a02:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:da00::,2a02:da07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:da40::,2a02:da47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:da80::,2a02:da87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:dac0::,2a02:dac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:db00::,2a02:db07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:db40::,2a02:db47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:db80::,2a02:db87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:dbc0::,2a02:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:dc00::,2a02:dc07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:dc40::,2a02:dc47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:dc80::,2a02:dc87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:dcc0::,2a02:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:dd00::,2a02:dd07:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a02:dd40::,2a02:dd47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:dd80::,2a02:dd87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ddc0::,2a02:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:de00::,2a02:de07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:de40::,2a02:de47:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:de80::,2a02:de87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:dec0::,2a02:dec7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:df00::,2a02:df07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:df40::,2a02:df47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:df80::,2a02:df87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:dfc0::,2a02:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:e000::,2a02:e007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e040::,2a02:e047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:e080::,2a02:e087:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a02:e0c0::,2a02:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:e100::,2a02:e107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e140::,2a02:e147:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:e180::,2a02:e187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e1c0::,2a02:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:e200::,2a02:e203:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:e220::,2a02:e223:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a02:e240::,2a02:e247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e280::,2a02:e287:ffff:ffff:ffff:ffff:ffff:ffff,YE -2a02:e2c0::,2a02:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:e300::,2a02:e307:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a02:e340::,2a02:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:e380::,2a02:e387:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:e3c0::,2a02:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e400::,2a02:e407:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:e440::,2a02:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e480::,2a02:e487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e4c0::,2a02:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e500::,2a02:e507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e540::,2a02:e547:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a02:e580::,2a02:e587:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:e5c0::,2a02:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e600::,2a02:e603:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e620::,2a02:e623:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e640::,2a02:e647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:e680::,2a02:e687:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:e6c0::,2a02:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e700::,2a02:e707:ffff:ffff:ffff:ffff:ffff:ffff,LY -2a02:e740::,2a02:e747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e780::,2a02:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:e7c0::,2a02:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:e800::,2a02:e807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e840::,2a02:e847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e880::,2a02:e887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e8c0::,2a02:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:e900::,2a02:e907:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:e940::,2a02:e947:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:e980::,2a02:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a02:e9c0::,2a02:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ea00::,2a02:ea07:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a02:ea40::,2a02:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:ea80::,2a02:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:eac0::,2a02:eac7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:eb00::,2a02:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:eb40::,2a02:eb47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:eb80::,2a02:eb87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ebc0::,2a02:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:ec00::,2a02:ec07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:ec40::,2a02:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ec80::,2a02:ec87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:ecc0::,2a02:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a02:ed00::,2a02:ed01:411f:ffff:ffff:ffff:ffff:ffff,NO -2a02:ed01:4120::,2a02:ed01:4120:ffff:ffff:ffff:ffff:ffff,DK -2a02:ed01:4121::,2a02:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:ed40::,2a02:ed47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:ed80::,2a02:ed87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:edc0::,2a02:edc7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:ee00::,2a02:ee07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:ee80::,2a02:ee87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:eec0::,2a02:eec7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ef00::,2a02:ef07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ef40::,2a02:ef47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:ef80::,2a02:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:efc0::,2a02:efc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f000::,2a02:f007:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:f040::,2a02:f047:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a02:f080::,2a02:f083:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:f0a0::,2a02:f0a3:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f0c0::,2a02:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:f100::,2a02:f107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f140::,2a02:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f180::,2a02:f181:fff:ffff:ffff:ffff:ffff:ffff,FR -2a02:f181:1000::,2a02:f181:1000:7fff:ffff:ffff:ffff:ffff,GB -2a02:f181:1000:8000::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:f1c0::,2a02:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:f200::,2a02:f207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f280::,2a02:f287:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:f2c0::,2a02:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f300::,2a02:f307:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:f340::,2a02:f347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f380::,2a02:f387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f3c0::,2a02:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f400::,2a02:f407:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a02:f440::,2a02:f447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f480::,2a02:f487:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:f4c0::,2a02:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:f500::,2a02:f507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f540::,2a02:f543:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f560::,2a02:f563:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f580::,2a02:f587:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a02:f5c0::,2a02:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f600::,2a02:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f640::,2a02:f647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:f680::,2a02:f687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f6c0::,2a02:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f700::,2a02:f707:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a02:f740::,2a02:f747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f780::,2a02:f787:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:f7c0::,2a02:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a02:f800::,2a02:f807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:f840::,2a02:f847:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:f880::,2a02:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f8c0::,2a02:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f900::,2a02:f907:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:f940::,2a02:f947:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:f980::,2a02:f987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:f9c0::,2a02:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fa00::,2a02:fa07:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:fa40::,2a02:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:fa80::,2a02:fa80:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a02:faa0::,2a02:faa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:fac0::,2a02:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:fae0::,2a02:fae7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:fb00::,2a02:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:fb40::,2a02:fb47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fb80::,2a02:fb87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:fbc0::,2a02:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:fc00::,2a02:fc07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:fc40::,2a02:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:fc80::,2a02:fc87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:fcc0::,2a02:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fd00::,2a02:fd07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:fd40::,2a02:fd47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:fd80::,2a02:fd87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:fdc0::,2a02:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:fe00::,2a02:fe07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:fe40::,2a02:fe47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fe80::,2a02:fe87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:fec0::,2a02:fec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:ff00::,2a02:ff07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:ff40::,2a02:ff47:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a02:ff80::,2a02:ff87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:ffc0::,2a02:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a03::,2a03::ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:20::,2a03:20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:40::,2a03:40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:60::,2a03:67:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:80::,2a03:80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:c0::,2a03:c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:e0::,2a03:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:100::,2a03:100:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:120::,2a03:120:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:140::,2a03:140:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:160::,2a03:160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:180::,2a03:180:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:1a0::,2a03:1a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1c0::,2a03:1c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1e0::,2a03:1e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:200::,2a03:200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:220::,2a03:220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:240::,2a03:247:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:280::,2a03:280:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a03:2a0::,2a03:2a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2c0::,2a03:2c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:2e0::,2a03:2e7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:300::,2a03:300:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:320::,2a03:320:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:340::,2a03:340:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:360::,2a03:360:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:380::,2a03:380:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:3a0::,2a03:3a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3c0::,2a03:3c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:3e0::,2a03:3e0:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:400::,2a03:407:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:420::,2a03:420:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:440::,2a03:440:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:460::,2a03:460:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:480::,2a03:480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4a0::,2a03:4a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:4c0::,2a03:4c0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:4e0::,2a03:4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:500::,2a03:500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:520::,2a03:527:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:540::,2a03:540:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a03:560::,2a03:560:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:580::,2a03:580:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5a0::,2a03:5a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5c0::,2a03:5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5e0::,2a03:5e0:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:600::,2a03:600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:620::,2a03:620:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:640::,2a03:640:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:660::,2a03:660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:680::,2a03:680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6a0::,2a03:6a0:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:6c0::,2a03:6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6e0::,2a03:6e0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:700::,2a03:700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:720::,2a03:720:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:740::,2a03:740:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:760::,2a03:767:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:780::,2a03:780:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:7a0::,2a03:7a7:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a03:7c0::,2a03:7c0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:7e0::,2a03:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:800::,2a03:807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:820::,2a03:820:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:840::,2a03:840:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:860::,2a03:860:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:880::,2a03:880:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:8a0::,2a03:8a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:8c0::,2a03:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:8e0::,2a03:8e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:900::,2a03:900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:920::,2a03:920:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:940::,2a03:940:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:960::,2a03:960:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:980::,2a03:980:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:9a0::,2a03:9a0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:9c0::,2a03:9c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:9e0::,2a03:9e0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:a00::,2a03:a00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:a20::,2a03:a20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a40::,2a03:a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:a60::,2a03:a60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a80::,2a03:a80:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a03:aa0::,2a03:aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ac0::,2a03:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:ae0::,2a03:ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:b00::,2a03:b00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b40::,2a03:b40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:b80::,2a03:b80:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:ba0::,2a03:ba7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bc0::,2a03:bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c00::,2a03:c00:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:c20::,2a03:c20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:c40::,2a03:c40:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:c60::,2a03:c60:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:c80::,2a03:c80:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:ca0::,2a03:ca0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:cc0::,2a03:cc0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:ce0::,2a03:ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:d00::,2a03:d00:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:d20::,2a03:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:d40::,2a03:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:d60::,2a03:d60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:d80::,2a03:d80:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:da0::,2a03:da0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:dc0::,2a03:dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:de0::,2a03:de0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:e00::,2a03:e00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:e20::,2a03:e20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e40::,2a03:e40:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:e60::,2a03:e60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ea0::,2a03:ea0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:ec0::,2a03:ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ee0::,2a03:ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:f00::,2a03:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:f40::,2a03:f40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:f60::,2a03:f60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:f80::,2a03:f80:3f:ffff:ffff:ffff:ffff:ffff,AT -2a03:f80:40::,2a03:f80:40:7fff:ffff:ffff:ffff:ffff,RO -2a03:f80:40:8000::,2a03:f80:43:ffff:ffff:ffff:ffff:ffff,AT -2a03:f80:44::,2a03:f80:44:ffff:ffff:ffff:ffff:ffff,IM -2a03:f80:45::,2a03:f80:47:ffff:ffff:ffff:ffff:ffff,AT -2a03:f80:48::,2a03:f80:48:7fff:ffff:ffff:ffff:ffff,PL -2a03:f80:48:8000::,2a03:f80:55:ffff:ffff:ffff:ffff:ffff,AT -2a03:f80:56::,2a03:f80:56:ffff:ffff:ffff:ffff:ffff,CL -2a03:f80:57::,2a03:f80:353:ffff:ffff:ffff:ffff:ffff,AT -2a03:f80:354::,2a03:f80:354:ffff:ffff:ffff:ffff:ffff,IS -2a03:f80:355::,2a03:f87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:fc0::,2a03:fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:fe0::,2a03:fe0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:1000::,2a03:1000:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:1020::,2a03:1020:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a03:1040::,2a03:1040:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1060::,2a03:1060:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:1080::,2a03:1080:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:10a0::,2a03:10a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:10c0::,2a03:10c3:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:10e0::,2a03:10e0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:1100::,2a03:1100:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:1120::,2a03:1120:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1140::,2a03:1140:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:1160::,2a03:1160:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:1180::,2a03:1180:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:11a0::,2a03:11a0:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a03:11c0::,2a03:11c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:11e0::,2a03:11e0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:1200::,2a03:1200:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1220::,2a03:1220:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1240::,2a03:1240:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:1260::,2a03:1260:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1280::,2a03:1280:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:12a0::,2a03:12a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:12c0::,2a03:12c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:12e0::,2a03:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a03:1300::,2a03:1300:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a03:1320::,2a03:1320:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:1340::,2a03:1340:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:1360::,2a03:1360:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:1380::,2a03:1380:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:13a0::,2a03:13a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:13c0::,2a03:13c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:13e0::,2a03:13e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:1400::,2a03:1400:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:1420::,2a03:1420:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:1440::,2a03:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1460::,2a03:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:1480::,2a03:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:14a0::,2a03:14a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:14c0::,2a03:14c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:14e0::,2a03:14e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1500::,2a03:1500:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:1520::,2a03:1520:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:1560::,2a03:1560:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:1580::,2a03:1580:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:15c0::,2a03:15c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:15e0::,2a03:15e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:1600::,2a03:1600:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:1620::,2a03:1620:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1640::,2a03:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1660::,2a03:1660:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a03:1680::,2a03:1680:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:16a0::,2a03:16a0:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a03:16c0::,2a03:16c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:16e0::,2a03:16e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1700::,2a03:1707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:1740::,2a03:1740:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1760::,2a03:1760:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1780::,2a03:1780:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:17a0::,2a03:17a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:17c0::,2a03:17c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:17e0::,2a03:17e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:1800::,2a03:1800:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1820::,2a03:1820:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1840::,2a03:1840:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:1860::,2a03:1860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1880::,2a03:1880:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:18a0::,2a03:18a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:18e0::,2a03:18e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1900::,2a03:1907:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:1920::,2a03:1920:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:1940::,2a03:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1960::,2a03:1960:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a03:1980::,2a03:1987:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:19a0::,2a03:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:19c0::,2a03:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:19e0::,2a03:19e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1a00::,2a03:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:1a20::,2a03:1a20:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:1a40::,2a03:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1a60::,2a03:1a60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1a80::,2a03:1a80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:1aa0::,2a03:1aa0:ffff:ffff:ffff:ffff:ffff:ffff,CA -2a03:1ac0::,2a03:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1ae0::,2a03:1ae0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1b00::,2a03:1b00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1b20::,2a03:1b20:2:ffff:ffff:ffff:ffff:ffff,SE -2a03:1b20:3::,2a03:1b20:3:ffff:ffff:ffff:ffff:ffff,NL -2a03:1b20:4::,2a03:1b20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1b40::,2a03:1b40:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:1b60::,2a03:1b60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1b80::,2a03:1b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1bc0::,2a03:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1be0::,2a03:1be0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1c00::,2a03:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a03:1c20::,2a03:1c20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1c40::,2a03:1c40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1c60::,2a03:1c60:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1c80::,2a03:1c80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:1ca0::,2a03:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:1cc0::,2a03:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1ce0::,2a03:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1d00::,2a03:1d00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1d20::,2a03:1d20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:1d40::,2a03:1d40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1d60::,2a03:1d60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1d80::,2a03:1d80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:1da0::,2a03:1da0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1dc0::,2a03:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1de0::,2a03:1de0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1e00::,2a03:1e03:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1e20::,2a03:1e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:1e40::,2a03:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:1e60::,2a03:1e60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:1e80::,2a03:1e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:1ea0::,2a03:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1ec0::,2a03:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:1ee0::,2a03:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:1f00::,2a03:1f00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:1f20::,2a03:1f20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1f40::,2a03:1f40:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:1f60::,2a03:1f60:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:1f80::,2a03:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:1fc0::,2a03:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:1fe0::,2a03:1fe0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2000::,2a03:2000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2020::,2a03:2020:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2040::,2a03:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2080::,2a03:2080:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:20a0::,2a03:20a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:20c0::,2a03:20c0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a03:20e0::,2a03:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:2100::,2a03:2107:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:2120::,2a03:2120:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2140::,2a03:2140:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2160::,2a03:2160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2180::,2a03:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:21a0::,2a03:21a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:21c0::,2a03:21c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:21e0::,2a03:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2200::,2a03:2200:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:2220::,2a03:2220:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:2240::,2a03:2240:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:2260::,2a03:2260:116:ffff:ffff:ffff:ffff:ffff,DE -2a03:2260:117::,2a03:2260:117:7fff:ffff:ffff:ffff:ffff,NL -2a03:2260:117:8000::,2a03:2260:3005:7ff:ffff:ffff:ffff:ffff,DE -2a03:2260:3005:800::,2a03:2260:3005:fff:ffff:ffff:ffff:ffff,SI -2a03:2260:3005:1000::,2a03:2267:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2280::,2a03:2280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:22a0::,2a03:22a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:22c0::,2a03:22c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:22e0::,2a03:22e7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2300::,2a03:2307:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:2320::,2a03:2320:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:2340::,2a03:2340:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:2360::,2a03:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2380::,2a03:2380:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:23a0::,2a03:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:23c0::,2a03:23c0:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:23e0::,2a03:23e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:2400::,2a03:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2420::,2a03:2420:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2440::,2a03:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2460::,2a03:2460:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:2480::,2a03:2480:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:24a0::,2a03:24a0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a03:24c0::,2a03:24c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:24e0::,2a03:24e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2500::,2a03:2500:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2520::,2a03:2520:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:2540::,2a03:2540:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2560::,2a03:2560:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a03:2580::,2a03:2580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:25a0::,2a03:25a0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:25c0::,2a03:25c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:25e0::,2a03:25e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2600::,2a03:2600:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2620::,2a03:2620:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:2640::,2a03:2640:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2660::,2a03:2660:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:2680::,2a03:2680:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:26a0::,2a03:26a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:26c0::,2a03:26c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:26e0::,2a03:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2700::,2a03:2700:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:2720::,2a03:2720:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2740::,2a03:2740:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:2760::,2a03:2760:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:2780::,2a03:2780:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:27a0::,2a03:27a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:27c0::,2a03:27c0:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:2800::,2a03:2800:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2820::,2a03:2820:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:2840::,2a03:2840:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:2860::,2a03:2860:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2880::,2a03:2880:10:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:11::,2a03:2880:12:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:12:8000::,2a03:2880:1f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:20::,2a03:2880:21:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:21:8000::,2a03:2880:2f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:30::,2a03:2880:30:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:31::,2a03:2880:100f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:1010::,2a03:2880:1011:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:1011:8000::,2a03:2880:101f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:1020::,2a03:2880:1020:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:1021::,2a03:2880:102f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:1030::,2a03:2880:1030:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:1031::,2a03:2880:10ff:7fff:ffff:ffff:ffff:ffff,IE -2a03:2880:10ff:8000::,2a03:2880:10ff:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:1100::,2a03:2880:110f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:1110::,2a03:2880:1110:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:1111::,2a03:2880:111f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:1120::,2a03:2880:1120:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:1120:8000::,2a03:2880:2010:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2011::,2a03:2880:2011:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:2011:8000::,2a03:2880:201f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2020::,2a03:2880:2020:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2021::,2a03:2880:202f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2030::,2a03:2880:2030:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2031::,2a03:2880:2040:7fff:ffff:ffff:ffff:ffff,IE -2a03:2880:2040:8000::,2a03:2880:2040:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2041::,2a03:2880:204f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2050::,2a03:2880:2050:7fff:ffff:ffff:ffff:ffff,US -2a03:2880:2050:8000::,2a03:2880:2060:7fff:ffff:ffff:ffff:ffff,IE -2a03:2880:2060:8000::,2a03:2880:2060:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2061::,2a03:2880:2110:7fff:ffff:ffff:ffff:ffff,IE -2a03:2880:2110:8000::,2a03:2880:2111:bfff:ffff:ffff:ffff:ffff,US -2a03:2880:2111:c000::,2a03:2880:211f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2120::,2a03:2880:2120:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2121::,2a03:2880:212f:ffff:ffff:ffff:ffff:ffff,IE -2a03:2880:2130::,2a03:2880:2130:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:2131::,2a03:2880:3010:7fff:ffff:ffff:ffff:ffff,IE -2a03:2880:3010:8000::,2a03:2880:3010:ffff:ffff:ffff:ffff:ffff,US -2a03:2880:3011::,2a03:2880:3020:9fff:ffff:ffff:ffff:ffff,IE -2a03:2880:3020:a000::,2a03:2880:3020:afff:ffff:ffff:ffff:ffff,GB -2a03:2880:3020:b000::,2a03:2887:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:28a0::,2a03:28a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:28c0::,2a03:28c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:28e0::,2a03:28e0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:2900::,2a03:2907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2920::,2a03:2920:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a03:2940::,2a03:2940:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:2960::,2a03:2960:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:2980::,2a03:2980:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:29a0::,2a03:29a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:29c0::,2a03:29c0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:29e0::,2a03:29e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2a00::,2a03:2a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2a20::,2a03:2a20:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:2a40::,2a03:2a40:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:2a60::,2a03:2a60:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:2a80::,2a03:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:2ac0::,2a03:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2ae0::,2a03:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:2b00::,2a03:2b00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:2b20::,2a03:2b20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2b40::,2a03:2b40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2b60::,2a03:2b60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2b80::,2a03:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:2ba0::,2a03:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:2bc0::,2a03:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2be0::,2a03:2be0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2c00::,2a03:2c00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2c20::,2a03:2c20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2c40::,2a03:2c40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2c60::,2a03:2c60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2c80::,2a03:2c80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2ca0::,2a03:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2cc0::,2a03:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2ce0::,2a03:2ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:2d00::,2a03:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2d20::,2a03:2d20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2d40::,2a03:2d40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:2d60::,2a03:2d60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2d80::,2a03:2d80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:2da0::,2a03:2da0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2dc0::,2a03:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:2de0::,2a03:2de0:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:2e00::,2a03:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:2e20::,2a03:2e20:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:2e40::,2a03:2e40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2e60::,2a03:2e60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2ea0::,2a03:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2ec0::,2a03:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2ee0::,2a03:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2f00::,2a03:2f00:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:2f20::,2a03:2f20:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:2f40::,2a03:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:2f60::,2a03:2f60:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:2f80::,2a03:2f80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:2fa0::,2a03:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:2fc0::,2a03:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:2fe0::,2a03:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3000::,2a03:3007:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:3020::,2a03:3020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3040::,2a03:3040:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:3060::,2a03:3060:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3080::,2a03:3080:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:30a0::,2a03:30a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:30c0::,2a03:30c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:30e0::,2a03:30e0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:3100::,2a03:3100:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3120::,2a03:3120:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3140::,2a03:3140:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:3160::,2a03:3160:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:3180::,2a03:3180:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:31a0::,2a03:31a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:31c0::,2a03:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:31e0::,2a03:31e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3200::,2a03:3200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3220::,2a03:3220:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:3240::,2a03:3240:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a03:3260::,2a03:3260:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:3280::,2a03:3280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:32a0::,2a03:32a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:32c0::,2a03:32c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a03:32e0::,2a03:32e0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:3300::,2a03:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3320::,2a03:3320:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:3340::,2a03:3340:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:3360::,2a03:3360:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:3380::,2a03:3380:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:33a0::,2a03:33a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:33c0::,2a03:33c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:33e0::,2a03:33e7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:3400::,2a03:3400:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3420::,2a03:3420:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:3440::,2a03:3440:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:3460::,2a03:3460:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3480::,2a03:3480:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:34a0::,2a03:34a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:34c0::,2a03:34c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:34e0::,2a03:34e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3500::,2a03:3500:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3520::,2a03:3520:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:3540::,2a03:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:3580::,2a03:3580:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:35a0::,2a03:35a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:35c0::,2a03:35c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:35e0::,2a03:35e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:3600::,2a03:3600:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:3620::,2a03:3620:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3640::,2a03:3640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3660::,2a03:3660:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3680::,2a03:3687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:36a0::,2a03:36a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:36c0::,2a03:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:36e0::,2a03:36e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3700::,2a03:3700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3720::,2a03:3720:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:3740::,2a03:3740:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3760::,2a03:3760:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3780::,2a03:3780:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:37a0::,2a03:37a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:37c0::,2a03:37c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:37e0::,2a03:37e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3800::,2a03:3800:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:3820::,2a03:3820:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3840::,2a03:3847:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3880::,2a03:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:38a0::,2a03:38a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:38c0::,2a03:38c0:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:38e0::,2a03:38e0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:3900::,2a03:3900:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3920::,2a03:3920:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3940::,2a03:3940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3960::,2a03:3960:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3980::,2a03:3980:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:39a0::,2a03:39a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:39c0::,2a03:39c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:39e0::,2a03:39e0:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:3a00::,2a03:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3a20::,2a03:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a03:3a40::,2a03:3a40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3a60::,2a03:3a60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3a80::,2a03:3a80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3aa0::,2a03:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:3ac0::,2a03:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3ae0::,2a03:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3b00::,2a03:3b00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3b20::,2a03:3b20:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a03:3b40::,2a03:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:3b60::,2a03:3b60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:3b80::,2a03:3b80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:3ba0::,2a03:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:3be0::,2a03:3be0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3c00::,2a03:3c00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3c20::,2a03:3c20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:3c40::,2a03:3c40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3c60::,2a03:3c67:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3c80::,2a03:3c80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3ca0::,2a03:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3cc0::,2a03:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3d00::,2a03:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:3d20::,2a03:3d20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3d40::,2a03:3d40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3d60::,2a03:3d60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:3d80::,2a03:3d80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:3da0::,2a03:3da0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:3dc0::,2a03:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3de0::,2a03:3de0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:3e00::,2a03:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3e40::,2a03:3e40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3e60::,2a03:3e60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:3e80::,2a03:3e80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3ea0::,2a03:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3ec0::,2a03:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:3ee0::,2a03:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a03:3f00::,2a03:3f00:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:3f20::,2a03:3f20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3f40::,2a03:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:3f60::,2a03:3f60:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:3f80::,2a03:3f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3fa0::,2a03:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:3fc0::,2a03:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:3fe0::,2a03:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4000::,2a03:4007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4020::,2a03:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4040::,2a03:4040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4060::,2a03:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:4080::,2a03:4080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:40a0::,2a03:40a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:41a0::,2a03:41a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:41c0::,2a03:41c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:41e0::,2a03:41e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4200::,2a03:4200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4240::,2a03:4240:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4260::,2a03:4260:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4280::,2a03:4280:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:42c0::,2a03:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:42e0::,2a03:42e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4300::,2a03:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4340::,2a03:4340:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4360::,2a03:4360:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:4380::,2a03:4380:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:43a0::,2a03:43a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:43c0::,2a03:43c0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:43e0::,2a03:43e0:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:4400::,2a03:4400:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:4420::,2a03:4420:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:4440::,2a03:4440:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:4460::,2a03:4460:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:4560::,2a03:4560:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:4580::,2a03:4580:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:45a0::,2a03:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:45c0::,2a03:45c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:45e0::,2a03:45e0:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:4600::,2a03:4600:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:4620::,2a03:4620:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:4640::,2a03:4640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4660::,2a03:4660:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:4680::,2a03:4687:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:46a0::,2a03:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:46c0::,2a03:46c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:46e0::,2a03:46e0:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a03:4700::,2a03:4700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4780::,2a03:4787:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a03:47a0::,2a03:47a7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4820::,2a03:4820:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:4840::,2a03:4847:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:4880::,2a03:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:48a0::,2a03:48a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:48c0::,2a03:48c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:48e0::,2a03:48e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4900::,2a03:4900:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4920::,2a03:4920:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4940::,2a03:4940:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:4960::,2a03:4960:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:4980::,2a03:4987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:49a0::,2a03:49a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:49c0::,2a03:49c0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:49e0::,2a03:49e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:4a00::,2a03:4a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4a20::,2a03:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4a40::,2a03:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:4a60::,2a03:4a60:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:4a80::,2a03:4a80::ffff:ffff:ffff:ffff,NL -2a03:4a80:0:1::,2a03:4a80::1:ffff:ffff:ffff:ffff,GB -2a03:4a80:0:2::,2a03:4a80::2:ffff:ffff:ffff:ffff,CA -2a03:4a80:0:3::,2a03:4a80::3:ffff:ffff:ffff:ffff,CZ -2a03:4a80:0:4::,2a03:4a80::4:ffff:ffff:ffff:ffff,NL -2a03:4a80:0:5::,2a03:4a80::5:ffff:ffff:ffff:ffff,FR -2a03:4a80:0:6::,2a03:4a80::6:ffff:ffff:ffff:ffff,DK -2a03:4a80:0:7::,2a03:4a80::7:ffff:ffff:ffff:ffff,RU -2a03:4a80:0:8::,2a03:4a80::8:ffff:ffff:ffff:ffff,TR -2a03:4a80:0:9::,2a03:4a80::9:ffff:ffff:ffff:ffff,UA -2a03:4a80:0:a::,2a03:4a80::a:ffff:ffff:ffff:ffff,MX -2a03:4a80:0:b::,2a03:4a80::b:ffff:ffff:ffff:ffff,AE -2a03:4a80:0:c::,2a03:4a80::ffff:ffff:ffff:ffff:ffff,NL -2a03:4a80:1::,2a03:4a80:1:ffff:ffff:ffff:ffff:ffff,GB -2a03:4a80:2::,2a03:4a80:2:ffff:ffff:ffff:ffff:ffff,CA -2a03:4a80:3::,2a03:4a80:3:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4a80:4::,2a03:4a80:4:ffff:ffff:ffff:ffff:ffff,DE -2a03:4a80:5::,2a03:4a80:5:ffff:ffff:ffff:ffff:ffff,FR -2a03:4a80:6::,2a03:4a80:6:ffff:ffff:ffff:ffff:ffff,DK -2a03:4a80:7::,2a03:4a80:7:ffff:ffff:ffff:ffff:ffff,RU -2a03:4a80:8::,2a03:4a80:8:ffff:ffff:ffff:ffff:ffff,TR -2a03:4a80:9::,2a03:4a80:9:ffff:ffff:ffff:ffff:ffff,UA -2a03:4a80:a::,2a03:4a80:a:ffff:ffff:ffff:ffff:ffff,MX -2a03:4a80:b::,2a03:4a80:b:ffff:ffff:ffff:ffff:ffff,AE -2a03:4a80:c::,2a03:4a80:fffe:ffff:ffff:ffff:ffff:ffff,NL -2a03:4a80:ffff::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:4a81::,2a03:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:4b00::,2a03:4b00:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:4b20::,2a03:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4b40::,2a03:4b47:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:4b60::,2a03:4b60:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:4b80::,2a03:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:4ba0::,2a03:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:4bc0::,2a03:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:4be0::,2a03:4be0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:4c00::,2a03:4c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:4c40::,2a03:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:4c60::,2a03:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4c80::,2a03:4c80:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:4ca0::,2a03:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:4cc0::,2a03:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4ce0::,2a03:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:4d00::,2a03:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4d20::,2a03:4d27:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:4d40::,2a03:4d47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4d60::,2a03:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4d80::,2a03:4d80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4da0::,2a03:4da0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4dc0::,2a03:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4e00::,2a03:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:4e20::,2a03:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4e40::,2a03:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:4e60::,2a03:4e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4e80::,2a03:4e80:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:4ea0::,2a03:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4ec0::,2a03:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4ee0::,2a03:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:4f00::,2a03:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4f20::,2a03:4f20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:4f40::,2a03:4f40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:4f60::,2a03:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4f80::,2a03:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:4fa0::,2a03:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:4fc0::,2a03:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:4fe0::,2a03:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5000::,2a03:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5020::,2a03:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5040::,2a03:5040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5060::,2a03:5060:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5080::,2a03:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:50a0::,2a03:50a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:50c0::,2a03:50c0:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a03:50e0::,2a03:50e0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:5100::,2a03:5100:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5120::,2a03:5120:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5140::,2a03:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5160::,2a03:5160:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:5180::,2a03:5180:5:6:ffff:ffff:ffff:ffff,RO -2a03:5180:5:7::,2a03:5180:5:7::f,GB -2a03:5180:5:7::10,2a03:5180:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:51a0::,2a03:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:51c0::,2a03:51c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:51e0::,2a03:51e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5200::,2a03:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5220::,2a03:5220:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:5240::,2a03:5240:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5260::,2a03:5260:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:5280::,2a03:5280:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:52a0::,2a03:52a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:52c0::,2a03:52c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:52e0::,2a03:52e7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:5300::,2a03:5307:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:5340::,2a03:5340:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5360::,2a03:5360:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:5380::,2a03:5380:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:53a0::,2a03:53a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:53c0::,2a03:53c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5440::,2a03:5447:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a03:54a0::,2a03:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:54c0::,2a03:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:54e0::,2a03:54e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:5500::,2a03:5501:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5520::,2a03:5520:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5540::,2a03:5540:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5560::,2a03:5560:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:5580::,2a03:5587:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:55e0::,2a03:55e0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:5600::,2a03:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5620::,2a03:5620:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a03:5640::,2a03:5640:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:5660::,2a03:5660:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5680::,2a03:5680:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:56a0::,2a03:56a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:56c0::,2a03:56c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:56e0::,2a03:56e0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:5700::,2a03:5700:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5720::,2a03:5720:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5740::,2a03:5740:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:5760::,2a03:5760:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5780::,2a03:5780:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a03:57a0::,2a03:57a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:57c0::,2a03:57c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:57e0::,2a03:57e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5800::,2a03:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5820::,2a03:5820:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:5840::,2a03:5840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5860::,2a03:5860:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:5880::,2a03:5880:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:58a0::,2a03:58a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:58c0::,2a03:58c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5900::,2a03:5907:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:5940::,2a03:5940:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:5960::,2a03:5960:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5980::,2a03:5980:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:59c0::,2a03:59c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:59e0::,2a03:59e0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5a00::,2a03:5a00:40:ffff:ffff:ffff:ffff:ffff,RU -2a03:5a00:41::,2a03:5a00:41:ffff:ffff:ffff:ffff:ffff,NL -2a03:5a00:42::,2a03:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5a40::,2a03:5a40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5a60::,2a03:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5a80::,2a03:5a80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5aa0::,2a03:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:5ac0::,2a03:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5ae0::,2a03:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:5b00::,2a03:5b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5b20::,2a03:5b20:ffff:ffff:ffff:ffff:ffff:ffff,RE -2a03:5b40::,2a03:5b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5b60::,2a03:5b60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5b80::,2a03:5b80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5ba0::,2a03:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5bc0::,2a03:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5be0::,2a03:5be0:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:5c00::,2a03:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:5c20::,2a03:5c20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:5c40::,2a03:5c40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5c60::,2a03:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5c80::,2a03:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5ca0::,2a03:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5cc0::,2a03:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a03:5ce0::,2a03:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:5d00::,2a03:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:5d40::,2a03:5d40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:5d60::,2a03:5d60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5d80::,2a03:5d80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5da0::,2a03:5da0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:5dc0::,2a03:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:5de0::,2a03:5de0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5e00::,2a03:5e00:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:5e20::,2a03:5e20:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:5e40::,2a03:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:5e60::,2a03:5e60:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:5e80::,2a03:5e80:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:5ea0::,2a03:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5ec0::,2a03:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:5ee0::,2a03:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:5f00::,2a03:5f00:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:5f20::,2a03:5f20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:5f60::,2a03:5f60:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:5f80::,2a03:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5fc0::,2a03:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:5fe0::,2a03:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:6000::,2a03:6007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:6020::,2a03:6020:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:6040::,2a03:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:60c0::,2a03:60c0::ffff:ffff:ffff:ffff:ffff,US -2a03:60c0:1::,2a03:60c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:6140::,2a03:6147:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6160::,2a03:6160:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:6180::,2a03:6180:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:61a0::,2a03:61a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:61c0::,2a03:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:61e0::,2a03:61e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6200::,2a03:6200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6280::,2a03:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:62a0::,2a03:62a0:3500:ffff:ffff:ffff:ffff:ffff,AU -2a03:62a0:3501::,2a03:62a0:3501:7fff:ffff:ffff:ffff:ffff,FI -2a03:62a0:3501:8000::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU -2a03:62c0::,2a03:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:62e0::,2a03:62e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6300::,2a03:6300:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:6320::,2a03:6320:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6340::,2a03:6340:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a03:6360::,2a03:6360:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6380::,2a03:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:63a0::,2a03:63a7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:63c0::,2a03:63c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:63e0::,2a03:63e7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:6400::,2a03:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6420::,2a03:6420:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:6440::,2a03:6440:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6460::,2a03:6460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:64a0::,2a03:64a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:64c0::,2a03:64c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:64e0::,2a03:64e0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:6500::,2a03:6507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6520::,2a03:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6540::,2a03:6540:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:6560::,2a03:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6580::,2a03:6580:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:65a0::,2a03:65a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:65c0::,2a03:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:65e0::,2a03:65e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:6600::,2a03:6607:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:6620::,2a03:6620:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:6640::,2a03:6640:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:6660::,2a03:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6680::,2a03:6680:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:66a0::,2a03:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:66c0::,2a03:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:66e0::,2a03:66e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:6700::,2a03:6707:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a03:6740::,2a03:6740:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:6760::,2a03:6760:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6780::,2a03:6780:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:67a0::,2a03:67a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:67c0::,2a03:67c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:67e0::,2a03:67e0:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a03:6800::,2a03:6800:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:6840::,2a03:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6860::,2a03:6860:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:6880::,2a03:6880:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:68a0::,2a03:68a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:68c0::,2a03:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a03:68e0::,2a03:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6900::,2a03:6900:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:6920::,2a03:6927:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:6940::,2a03:6940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6960::,2a03:6960:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:6980::,2a03:6980:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:69a0::,2a03:69a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:69c0::,2a03:69c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:69e0::,2a03:69e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:6a00::,2a03:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6a40::,2a03:6a40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6a60::,2a03:6a60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6aa0::,2a03:6aa0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:6ac0::,2a03:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:6ae0::,2a03:6ae0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:6b00::,2a03:6b07:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a03:6b20::,2a03:6b20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6b40::,2a03:6b40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6b60::,2a03:6b60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:6b80::,2a03:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:6ba0::,2a03:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:6c00::,2a03:6c00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6c20::,2a03:6c20:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6c40::,2a03:6c40:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:6c60::,2a03:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6c80::,2a03:6c80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6ca0::,2a03:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6cc0::,2a03:6cc0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:6ce0::,2a03:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6d00::,2a03:6d00:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a03:6d20::,2a03:6d20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6d40::,2a03:6d40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6d60::,2a03:6d60:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:6d80::,2a03:6d80:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:6da0::,2a03:6da0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:6dc0::,2a03:6dc0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:6e00::,2a03:6e00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:6e20::,2a03:6e20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:6e40::,2a03:6e40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6e60::,2a03:6e60:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:6e80::,2a03:6e80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:6ea0::,2a03:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6ec0::,2a03:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:6ee0::,2a03:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:6f00::,2a03:6f00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:6f20::,2a03:6f27:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:6f40::,2a03:6f40:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:6f60::,2a03:6f60:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:6f80::,2a03:6f87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6fc0::,2a03:6fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:6fe0::,2a03:6fe0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:7000::,2a03:7000:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7020::,2a03:7020:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:7040::,2a03:7040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7060::,2a03:7060:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:7080::,2a03:7080:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:70a0::,2a03:70a0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:70c0::,2a03:70c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:70e0::,2a03:70e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7100::,2a03:7100:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:7120::,2a03:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:7140::,2a03:7140:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:7160::,2a03:7160:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:7180::,2a03:7180:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:71a0::,2a03:71a0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:71c0::,2a03:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:71e0::,2a03:71e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7200::,2a03:7207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7220::,2a03:7220:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:7240::,2a03:7240:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:7260::,2a03:7260:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:7280::,2a03:7280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:72a0::,2a03:72a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:72c0::,2a03:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:72e0::,2a03:72e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7300::,2a03:7300:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:7320::,2a03:7320:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7340::,2a03:7340:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7360::,2a03:7367:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:7380::,2a03:7380:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:73a0::,2a03:73a7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:73c0::,2a03:73c0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:73e0::,2a03:73e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7400::,2a03:7400:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:7420::,2a03:7420:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:7440::,2a03:7440:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:7460::,2a03:7460:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:7480::,2a03:7480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:74a0::,2a03:74a0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:74c0::,2a03:74c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:74e0::,2a03:74e0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a03:7500::,2a03:7500:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7520::,2a03:7520:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:7540::,2a03:7540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7560::,2a03:7560:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:7580::,2a03:7580:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:75a0::,2a03:75a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:75c0::,2a03:75c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:75e0::,2a03:75e0:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:7600::,2a03:7600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7620::,2a03:7620:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7640::,2a03:7640:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:7660::,2a03:7660:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:7680::,2a03:7680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:76a0::,2a03:76a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:76c0::,2a03:76c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:76e0::,2a03:76e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:7700::,2a03:7700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7720::,2a03:7720:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:7740::,2a03:7740:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:7760::,2a03:7760:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:7780::,2a03:7787:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:77a0::,2a03:77a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:77c0::,2a03:77c0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:77e0::,2a03:77e0:4401:1098::63,GB -2a03:77e0:4401:1098::64,2a03:77e0:4401:1098::64,ES -2a03:77e0:4401:1098::65,2a03:77e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7800::,2a03:7800:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:7820::,2a03:7820:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:7840::,2a03:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7880::,2a03:7880:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:78a0::,2a03:78a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:78c0::,2a03:78c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:78e0::,2a03:78e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:7900::,2a03:7900:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7920::,2a03:7920:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:7940::,2a03:7940:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:7960::,2a03:7960:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7980::,2a03:7980:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:79a0::,2a03:79a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:79c0::,2a03:79c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:79e0::,2a03:79e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7a00::,2a03:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:7a40::,2a03:7a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7a80::,2a03:7a80:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:7aa0::,2a03:7aa0:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a03:7ac0::,2a03:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,AD -2a03:7ae0::,2a03:7ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7b00::,2a03:7b00:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:7b20::,2a03:7b20:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a03:7b40::,2a03:7b40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7b60::,2a03:7b60:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:7b80::,2a03:7b80:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:7ba0::,2a03:7ba0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:7bc0::,2a03:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7be0::,2a03:7be0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:7c00::,2a03:7c00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:7c20::,2a03:7c20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7c40::,2a03:7c40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7c60::,2a03:7c60:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:7c80::,2a03:7c80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:7ca0::,2a03:7ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7cc0::,2a03:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7ce0::,2a03:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:7d00::,2a03:7d00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:7d20::,2a03:7d20:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:7d40::,2a03:7d40:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:7d60::,2a03:7d60:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:7d80::,2a03:7d80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7da0::,2a03:7da0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7dc0::,2a03:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7de0::,2a03:7de0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:7e00::,2a03:7e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7e20::,2a03:7e20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:7e40::,2a03:7e40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:7e60::,2a03:7e60:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:7e80::,2a03:7e80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7ea0::,2a03:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:7ec0::,2a03:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:7ee0::,2a03:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:7f00::,2a03:7f00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7f20::,2a03:7f20:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:7f40::,2a03:7f40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:7f60::,2a03:7f60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:7f80::,2a03:7f80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:7fa0::,2a03:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:7fc0::,2a03:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:7fe0::,2a03:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8000::,2a03:8000:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:8020::,2a03:8020:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8040::,2a03:8040:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:8060::,2a03:8060:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8080::,2a03:8080:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:80a0::,2a03:80a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:80c0::,2a03:80c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:80e0::,2a03:80e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8100::,2a03:8100:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8120::,2a03:8120:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:8140::,2a03:8140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8160::,2a03:8160:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:8180::,2a03:8180:1100:ffff:ffff:ffff:ffff:ffff,NL -2a03:8180:1101::,2a03:8180:1101:7fff:ffff:ffff:ffff:ffff,GB -2a03:8180:1101:8000::,2a03:8180:1300:ffff:ffff:ffff:ffff:ffff,NL -2a03:8180:1301::,2a03:8180:1301:7fff:ffff:ffff:ffff:ffff,FR -2a03:8180:1301:8000::,2a03:8180:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:81a0::,2a03:81a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:81e0::,2a03:81e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:8200::,2a03:8200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8220::,2a03:8220:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:8240::,2a03:8240:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:8260::,2a03:8260:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:8280::,2a03:8280:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:82a0::,2a03:82a0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:82c0::,2a03:82c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:82e0::,2a03:82e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8300::,2a03:8300:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8320::,2a03:8320:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:8340::,2a03:8340:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:8360::,2a03:8360:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:8380::,2a03:8380:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:83a0::,2a03:83a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:83c0::,2a03:83c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:83e0::,2a03:83e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8400::,2a03:8400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8420::,2a03:8420:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:8440::,2a03:8440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8460::,2a03:8460:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8480::,2a03:8480:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:84a0::,2a03:84a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:84c0::,2a03:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:84e0::,2a03:84e0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:8500::,2a03:8500:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:8520::,2a03:8520:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8540::,2a03:8540:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:8560::,2a03:8560:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:8580::,2a03:8580:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:85c0::,2a03:85c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:85e0::,2a03:85e0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:8600::,2a03:8600:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:8620::,2a03:8620:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:8640::,2a03:8640:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8660::,2a03:8660:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8680::,2a03:8680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:86a0::,2a03:86a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:86c0::,2a03:86c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:86e0::,2a03:86e0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8700::,2a03:8700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8720::,2a03:8720:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:8740::,2a03:8740:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8760::,2a03:8760:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:8780::,2a03:8780:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:87a0::,2a03:87a0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:87c0::,2a03:87c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:87e0::,2a03:87e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8800::,2a03:8800:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:8820::,2a03:8820:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:8840::,2a03:8840:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8860::,2a03:8860:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8880::,2a03:8880:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:88c0::,2a03:88c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:88e0::,2a03:88e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8900::,2a03:8900:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:8920::,2a03:8920:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8940::,2a03:8940:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8960::,2a03:8960:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:8980::,2a03:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:89a0::,2a03:89a0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:89c0::,2a03:89c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8a00::,2a03:8a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8a20::,2a03:8a20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8a40::,2a03:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8a60::,2a03:8a60:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8a80::,2a03:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:8aa0::,2a03:8aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:8ac0::,2a03:8ac0:24f:ffff:ffff:ffff:ffff:ffff,US -2a03:8ac0:250::,2a03:8ac0:250:ffff:ffff:ffff:ffff:ffff,SG -2a03:8ac0:251::,2a03:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:8ae0::,2a03:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8b00::,2a03:8b00:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a03:8b20::,2a03:8b20:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:8b40::,2a03:8b40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8b60::,2a03:8b60:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a03:8b80::,2a03:8b80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8ba0::,2a03:8ba0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8bc0::,2a03:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:8be0::,2a03:8be0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8c00::,2a03:8c00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8c20::,2a03:8c20:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:8c40::,2a03:8c40:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:8c60::,2a03:8c60:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:8c80::,2a03:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:8cc0::,2a03:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8ce0::,2a03:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:8d00::,2a03:8d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8d20::,2a03:8d20:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:8d40::,2a03:8d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:8d60::,2a03:8d60:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a03:8d80::,2a03:8d80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:8da0::,2a03:8da0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:8dc0::,2a03:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8de0::,2a03:8de0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8e00::,2a03:8e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:8e20::,2a03:8e20:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:8e40::,2a03:8e40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8e60::,2a03:8e60:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:8e80::,2a03:8e80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:8ea0::,2a03:8ea0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:8ec0::,2a03:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8ee0::,2a03:8ee0:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a03:8f00::,2a03:8f07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:8f40::,2a03:8f40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8f60::,2a03:8f60:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:8f80::,2a03:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:8fa0::,2a03:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8fc0::,2a03:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:8fe0::,2a03:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9000::,2a03:9000:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9020::,2a03:9020:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:9040::,2a03:9040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9060::,2a03:9060:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:9080::,2a03:9080:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:90a0::,2a03:90a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:90c0::,2a03:90c0:f:ffff:ffff:ffff:ffff:ffff,AT -2a03:90c0:10::,2a03:90c0:1f:ffff:ffff:ffff:ffff:ffff,NL -2a03:90c0:20::,2a03:90c0:3f:ffff:ffff:ffff:ffff:ffff,US -2a03:90c0:40::,2a03:90c0:4f:ffff:ffff:ffff:ffff:ffff,DE -2a03:90c0:50::,2a03:90c0:5f:ffff:ffff:ffff:ffff:ffff,RU -2a03:90c0:60::,2a03:90c0:6f:ffff:ffff:ffff:ffff:ffff,SG -2a03:90c0:70::,2a03:90c0:7f:ffff:ffff:ffff:ffff:ffff,RU -2a03:90c0:80::,2a03:90c0:8f:ffff:ffff:ffff:ffff:ffff,LU -2a03:90c0:90::,2a03:90c0:9f:ffff:ffff:ffff:ffff:ffff,CY -2a03:90c0:a0::,2a03:90c0:bf:ffff:ffff:ffff:ffff:ffff,RU -2a03:90c0:c0::,2a03:90c0:cf:ffff:ffff:ffff:ffff:ffff,US -2a03:90c0:d0::,2a03:90c0:df:ffff:ffff:ffff:ffff:ffff,PL -2a03:90c0:e0::,2a03:90c0:12f:ffff:ffff:ffff:ffff:ffff,AT -2a03:90c0:130::,2a03:90c0:13f:ffff:ffff:ffff:ffff:ffff,US -2a03:90c0:140::,2a03:90c0:998f:ffff:ffff:ffff:ffff:ffff,AT -2a03:90c0:9990::,2a03:90c0:9994:ffff:ffff:ffff:ffff:ffff,RU -2a03:90c0:9995::,2a03:90c0:9995:ffff:ffff:ffff:ffff:ffff,SG -2a03:90c0:9996::,2a03:90c0:9996:ffff:ffff:ffff:ffff:ffff,US -2a03:90c0:9997::,2a03:90c0:9997:ffff:ffff:ffff:ffff:ffff,DE -2a03:90c0:9998::,2a03:90c0:999f:ffff:ffff:ffff:ffff:ffff,RU -2a03:90c0:99a0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:90e0::,2a03:90e0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:9100::,2a03:9100:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:9120::,2a03:9120:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:9140::,2a03:9140:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9160::,2a03:9160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:9180::,2a03:9180:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:91a0::,2a03:91a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:91c0::,2a03:91c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:91e0::,2a03:91e0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:9200::,2a03:9200:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:9220::,2a03:9220:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:9240::,2a03:9240:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:9260::,2a03:9260:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:9280::,2a03:9280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:92c0::,2a03:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:92e0::,2a03:92e0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:9300::,2a03:9300:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9320::,2a03:9320:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:9340::,2a03:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:9360::,2a03:9360:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:9380::,2a03:9380:3fff:ffff:ffff:ffff:ffff:ffff,IR -2a03:9380:4000::,2a03:9380:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:93a0::,2a03:93a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:93c0::,2a03:93c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:93e0::,2a03:93e0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:9400::,2a03:9400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9420::,2a03:9420:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:9440::,2a03:9440:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:9460::,2a03:9460:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9480::,2a03:9480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:94a0::,2a03:94a0:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:94c0::,2a03:94c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:94e0::,2a03:94e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:9500::,2a03:9500:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9520::,2a03:9520:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:9540::,2a03:9540:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:9560::,2a03:9567:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9580::,2a03:9580:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:95a0::,2a03:95a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:95c0::,2a03:95c0:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:95e0::,2a03:95e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:9600::,2a03:9600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9620::,2a03:9620:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:9640::,2a03:9640:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a03:9660::,2a03:9660:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:9680::,2a03:9680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:96a0::,2a03:96a0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:96c0::,2a03:96c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:96e0::,2a03:96e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:9700::,2a03:9700:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:9720::,2a03:9720:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:9740::,2a03:9740:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9760::,2a03:9760:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:9780::,2a03:9780:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:97a0::,2a03:97a0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:97c0::,2a03:97c1:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:97e0::,2a03:97e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:9800::,2a03:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9840::,2a03:9840:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9860::,2a03:9860:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:9880::,2a03:9880:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:98a0::,2a03:98a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:98c0::,2a03:98c7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:9900::,2a03:9900:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:9920::,2a03:9920:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:9940::,2a03:9940:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:9960::,2a03:9960:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:9980::,2a03:9980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:99a0::,2a03:99a0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:99c0::,2a03:99c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:99e0::,2a03:99e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9a00::,2a03:9a07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:9a40::,2a03:9a40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:9a60::,2a03:9a60:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:9a80::,2a03:9a80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:9aa0::,2a03:9aa0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:9ac0::,2a03:9ac0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9ae0::,2a03:9ae0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:9b00::,2a03:9b00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:9b20::,2a03:9b20:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:9b40::,2a03:9b40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:9b60::,2a03:9b60:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:9b80::,2a03:9b80:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:9ba0::,2a03:9ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9bc0::,2a03:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:9be0::,2a03:9be0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9c00::,2a03:9c00:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:9c20::,2a03:9c20:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:9c40::,2a03:9c40:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:9c60::,2a03:9c60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:9c80::,2a03:9c80:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a03:9ca0::,2a03:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:9cc0::,2a03:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:9d00::,2a03:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:9d20::,2a03:9d20:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:9d40::,2a03:9d40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:9d60::,2a03:9d60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:9d80::,2a03:9d80:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:9da0::,2a03:9da0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9dc0::,2a03:9dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9de0::,2a03:9de0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:9e00::,2a03:9e00:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a03:9e20::,2a03:9e20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:9e40::,2a03:9e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:9e80::,2a03:9e80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9ea0::,2a03:9ea0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:9ec0::,2a03:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9ee0::,2a03:9ee0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:9f00::,2a03:9f00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:9f60::,2a03:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:9f80::,2a03:9f80:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:9fa0::,2a03:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:9fc0::,2a03:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:9fe0::,2a03:9fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a000::,2a03:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a020::,2a03:a020:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:a040::,2a03:a040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a060::,2a03:a060:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a080::,2a03:a080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a0a0::,2a03:a0a0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a0c0::,2a03:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a0e0::,2a03:a0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a100::,2a03:a100:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a03:a120::,2a03:a120:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a03:a140::,2a03:a140:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a160::,2a03:a160:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:a180::,2a03:a180:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a1a0::,2a03:a1a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:a1c0::,2a03:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a1e0::,2a03:a1e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a200::,2a03:a200:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:a220::,2a03:a220:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:a240::,2a03:a240:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a260::,2a03:a260:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a280::,2a03:a280:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a2a0::,2a03:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a2c0::,2a03:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a2e0::,2a03:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:a300::,2a03:a300:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a03:a320::,2a03:a320:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a340::,2a03:a340:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:a360::,2a03:a360:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:a380::,2a03:a380:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a3a0::,2a03:a3a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:a3c0::,2a03:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a3e0::,2a03:a3e0:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a03:a400::,2a03:a400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a420::,2a03:a420:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a440::,2a03:a440:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a460::,2a03:a460:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:a480::,2a03:a480:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:a4a0::,2a03:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a4c0::,2a03:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a4e0::,2a03:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:a500::,2a03:a500:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a520::,2a03:a520:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a540::,2a03:a540:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a560::,2a03:a560:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:a580::,2a03:a580:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a5a0::,2a03:a5a0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:a5c0::,2a03:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a5e0::,2a03:a5e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a600::,2a03:a600:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:a620::,2a03:a620:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a640::,2a03:a640:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a660::,2a03:a660:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a680::,2a03:a680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a6c0::,2a03:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a6e0::,2a03:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a700::,2a03:a700:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a720::,2a03:a727:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a740::,2a03:a740:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a760::,2a03:a760:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:a780::,2a03:a780:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:a7a0::,2a03:a7a0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a7c0::,2a03:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:a7e0::,2a03:a7e7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:a800::,2a03:a800:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:a820::,2a03:a820:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:a840::,2a03:a840:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:a860::,2a03:a860:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a880::,2a03:a880:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:a8a0::,2a03:a8a7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:a8c0::,2a03:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:a8e0::,2a03:a8e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:a900::,2a03:a900:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:a920::,2a03:a920:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a940::,2a03:a940:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:a960::,2a03:a960:1f:ffff:ffff:ffff:ffff:ffff,DE -2a03:a960:20::,2a03:a960:2f:ffff:ffff:ffff:ffff:ffff,US -2a03:a960:30::,2a03:a960:fff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a960:1000::,2a03:a960:1000:ffff:ffff:ffff:ffff:ffff,RU -2a03:a960:1001::,2a03:a967:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:a980::,2a03:a980:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:a9a0::,2a03:a9a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:a9c0::,2a03:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a03:a9e0::,2a03:a9e0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:aa00::,2a03:aa00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:aa20::,2a03:aa20:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:aa40::,2a03:aa40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:aa60::,2a03:aa60:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:aa80::,2a03:aa80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:aaa0::,2a03:aaa7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:aac0::,2a03:aac0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:aae0::,2a03:aae0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:ab00::,2a03:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:ab20::,2a03:ab20:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:ab40::,2a03:ab40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:ab60::,2a03:ab60:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:ab80::,2a03:ab80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:aba0::,2a03:aba7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:abc0::,2a03:abc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:abe0::,2a03:abe7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:ac00::,2a03:ac00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ac40::,2a03:ac40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:ac60::,2a03:ac60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ac80::,2a03:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:aca0::,2a03:aca0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:acc0::,2a03:acc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ace0::,2a03:ace0:ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:100::,2a03:ace0:101:ffff:ffff:ffff:ffff:ffff,DE -2a03:ace0:102::,2a03:ace0:103:ffff:ffff:ffff:ffff:ffff,FR -2a03:ace0:104::,2a03:ace0:105:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:106::,2a03:ace0:107:ffff:ffff:ffff:ffff:ffff,IT -2a03:ace0:108::,2a03:ace0:109:ffff:ffff:ffff:ffff:ffff,ES -2a03:ace0:10a::,2a03:ace0:10b:ffff:ffff:ffff:ffff:ffff,NL -2a03:ace0:10c::,2a03:ace0:10d:ffff:ffff:ffff:ffff:ffff,BE -2a03:ace0:10e::,2a03:ace0:10f:ffff:ffff:ffff:ffff:ffff,GR -2a03:ace0:110::,2a03:ace0:111:ffff:ffff:ffff:ffff:ffff,PT -2a03:ace0:112::,2a03:ace0:113:ffff:ffff:ffff:ffff:ffff,SE -2a03:ace0:114::,2a03:ace0:115:ffff:ffff:ffff:ffff:ffff,AT -2a03:ace0:116::,2a03:ace0:117:ffff:ffff:ffff:ffff:ffff,CH -2a03:ace0:118::,2a03:ace0:119:ffff:ffff:ffff:ffff:ffff,DK -2a03:ace0:11a::,2a03:ace0:11b:ffff:ffff:ffff:ffff:ffff,FI -2a03:ace0:11c::,2a03:ace0:11d:ffff:ffff:ffff:ffff:ffff,NO -2a03:ace0:11e::,2a03:ace0:11f:ffff:ffff:ffff:ffff:ffff,IE -2a03:ace0:120::,2a03:ace0:121:ffff:ffff:ffff:ffff:ffff,IS -2a03:ace0:122::,2a03:ace0:123:ffff:ffff:ffff:ffff:ffff,FO -2a03:ace0:124::,2a03:ace0:1ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:200::,2a03:ace0:201:ffff:ffff:ffff:ffff:ffff,DE -2a03:ace0:202::,2a03:ace0:203:ffff:ffff:ffff:ffff:ffff,FR -2a03:ace0:204::,2a03:ace0:205:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:206::,2a03:ace0:207:ffff:ffff:ffff:ffff:ffff,IT -2a03:ace0:208::,2a03:ace0:209:ffff:ffff:ffff:ffff:ffff,ES -2a03:ace0:20a::,2a03:ace0:20b:ffff:ffff:ffff:ffff:ffff,NL -2a03:ace0:20c::,2a03:ace0:20d:ffff:ffff:ffff:ffff:ffff,BE -2a03:ace0:20e::,2a03:ace0:20f:ffff:ffff:ffff:ffff:ffff,GR -2a03:ace0:210::,2a03:ace0:211:ffff:ffff:ffff:ffff:ffff,PT -2a03:ace0:212::,2a03:ace0:213:ffff:ffff:ffff:ffff:ffff,SE -2a03:ace0:214::,2a03:ace0:215:ffff:ffff:ffff:ffff:ffff,AT -2a03:ace0:216::,2a03:ace0:217:ffff:ffff:ffff:ffff:ffff,CH -2a03:ace0:218::,2a03:ace0:219:ffff:ffff:ffff:ffff:ffff,DK -2a03:ace0:21a::,2a03:ace0:21b:ffff:ffff:ffff:ffff:ffff,FI -2a03:ace0:21c::,2a03:ace0:21d:ffff:ffff:ffff:ffff:ffff,NO -2a03:ace0:21e::,2a03:ace0:21f:ffff:ffff:ffff:ffff:ffff,IE -2a03:ace0:220::,2a03:ace0:221:ffff:ffff:ffff:ffff:ffff,IS -2a03:ace0:222::,2a03:ace0:223:ffff:ffff:ffff:ffff:ffff,FO -2a03:ace0:224::,2a03:ace0:2ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:300::,2a03:ace0:301:ffff:ffff:ffff:ffff:ffff,DE -2a03:ace0:302::,2a03:ace0:303:ffff:ffff:ffff:ffff:ffff,FR -2a03:ace0:304::,2a03:ace0:305:ffff:ffff:ffff:ffff:ffff,GB -2a03:ace0:306::,2a03:ace0:307:ffff:ffff:ffff:ffff:ffff,IT -2a03:ace0:308::,2a03:ace0:309:ffff:ffff:ffff:ffff:ffff,ES -2a03:ace0:30a::,2a03:ace0:30b:ffff:ffff:ffff:ffff:ffff,NL -2a03:ace0:30c::,2a03:ace0:30d:ffff:ffff:ffff:ffff:ffff,BE -2a03:ace0:30e::,2a03:ace0:30f:ffff:ffff:ffff:ffff:ffff,GR -2a03:ace0:310::,2a03:ace0:311:ffff:ffff:ffff:ffff:ffff,PT -2a03:ace0:312::,2a03:ace0:313:ffff:ffff:ffff:ffff:ffff,SE -2a03:ace0:314::,2a03:ace0:315:ffff:ffff:ffff:ffff:ffff,AT -2a03:ace0:316::,2a03:ace0:317:ffff:ffff:ffff:ffff:ffff,CH -2a03:ace0:318::,2a03:ace0:319:ffff:ffff:ffff:ffff:ffff,DK -2a03:ace0:31a::,2a03:ace0:31b:ffff:ffff:ffff:ffff:ffff,FI -2a03:ace0:31c::,2a03:ace0:31d:ffff:ffff:ffff:ffff:ffff,NO -2a03:ace0:31e::,2a03:ace0:31f:ffff:ffff:ffff:ffff:ffff,IE -2a03:ace0:320::,2a03:ace0:321:ffff:ffff:ffff:ffff:ffff,IS -2a03:ace0:322::,2a03:ace0:323:ffff:ffff:ffff:ffff:ffff,FO -2a03:ace0:324::,2a03:ace0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ad00::,2a03:ad07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:ad20::,2a03:ad27:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:ad40::,2a03:ad40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ad60::,2a03:ad60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ad80::,2a03:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:ada0::,2a03:ada0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:adc0::,2a03:adc0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:ade0::,2a03:ade0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ae00::,2a03:ae00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ae20::,2a03:ae20:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:ae40::,2a03:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:ae60::,2a03:ae60:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:ae80::,2a03:ae80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:aea0::,2a03:aea0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:aec0::,2a03:aec0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:aee0::,2a03:aee0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:af00::,2a03:af00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:af20::,2a03:af20:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:af40::,2a03:af40:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a03:af60::,2a03:af60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:af80::,2a03:af80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:afa0::,2a03:afa0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:afc0::,2a03:afc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:afe0::,2a03:afe7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:b000::,2a03:b000:9ff:ffff:ffff:ffff:ffff:ffff,SE -2a03:b000:a00::,2a03:b000:a00:7fff:ffff:ffff:ffff:ffff,GB -2a03:b000:a00:8000::,2a03:b000:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:b020::,2a03:b027:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:b040::,2a03:b040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b060::,2a03:b060:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:b080::,2a03:b080:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:b0a0::,2a03:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:b0c0::,2a03:b0c0::ffff:ffff:ffff:ffff:ffff,NL -2a03:b0c0:1::,2a03:b0c0:1:ffff:ffff:ffff:ffff:ffff,GB -2a03:b0c0:2::,2a03:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:b0e0::,2a03:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:b100::,2a03:b100:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:b140::,2a03:b140:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:b180::,2a03:b180:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a03:b1c0::,2a03:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:b200::,2a03:b207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b240::,2a03:b247:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:b280::,2a03:b280:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:b2c0::,2a03:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:b440::,2a03:b440:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b480::,2a03:b480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:b4c0::,2a03:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:b500::,2a03:b500:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a03:b540::,2a03:b540:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:b580::,2a03:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:b5c0::,2a03:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b600::,2a03:b600::ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:1::,2a03:b600:1::3fff:ffff,US -2a03:b600:1::4000:0,2a03:b600:1:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:2::,2a03:b600:2::3fff:ffff,US -2a03:b600:2::4000:0,2a03:b600:2:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:3::,2a03:b600:3::3fff:ffff,US -2a03:b600:3::4000:0,2a03:b600:3:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:4::,2a03:b600:4::3fff:ffff,US -2a03:b600:4::4000:0,2a03:b600:4:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:5::,2a03:b600:5::3fff:ffff,US -2a03:b600:5::4000:0,2a03:b600:5:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:6::,2a03:b600:6::3fff:ffff,US -2a03:b600:6::4000:0,2a03:b600:6:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:7::,2a03:b600:7::3fff:ffff,US -2a03:b600:7::4000:0,2a03:b600:7:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:8::,2a03:b600:8::3fff:ffff,US -2a03:b600:8::4000:0,2a03:b600:8:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:9::,2a03:b600:9::3fff:ffff,US -2a03:b600:9::4000:0,2a03:b600:f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:10::,2a03:b600:10::3fff:ffff,US -2a03:b600:10::4000:0,2a03:b600:10:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:11::,2a03:b600:11::3fff:ffff,US -2a03:b600:11::4000:0,2a03:b600:11:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:12::,2a03:b600:12::3fff:ffff,US -2a03:b600:12::4000:0,2a03:b600:12:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:13::,2a03:b600:13::3fff:ffff,US -2a03:b600:13::4000:0,2a03:b600:13:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:14::,2a03:b600:14::3fff:ffff,US -2a03:b600:14::4000:0,2a03:b600:14:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:15::,2a03:b600:15::3fff:ffff,US -2a03:b600:15::4000:0,2a03:b600:15:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:16::,2a03:b600:16::3fff:ffff,US -2a03:b600:16::4000:0,2a03:b600:16:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:17::,2a03:b600:17::3fff:ffff,US -2a03:b600:17::4000:0,2a03:b600:17:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:18::,2a03:b600:18::3fff:ffff,US -2a03:b600:18::4000:0,2a03:b600:18:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:19::,2a03:b600:19::3fff:ffff,US -2a03:b600:19::4000:0,2a03:b600:1f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:20::,2a03:b600:20::3fff:ffff,US -2a03:b600:20::4000:0,2a03:b600:20:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:21::,2a03:b600:21::3fff:ffff,US -2a03:b600:21::4000:0,2a03:b600:21:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:22::,2a03:b600:22::3fff:ffff,US -2a03:b600:22::4000:0,2a03:b600:22:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:23::,2a03:b600:23::3fff:ffff,US -2a03:b600:23::4000:0,2a03:b600:23:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:24::,2a03:b600:24::3fff:ffff,US -2a03:b600:24::4000:0,2a03:b600:24:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:25::,2a03:b600:25::3fff:ffff,US -2a03:b600:25::4000:0,2a03:b600:25:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:26::,2a03:b600:26::3fff:ffff,US -2a03:b600:26::4000:0,2a03:b600:26:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:27::,2a03:b600:27::3fff:ffff,US -2a03:b600:27::4000:0,2a03:b600:27:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:28::,2a03:b600:28::3fff:ffff,US -2a03:b600:28::4000:0,2a03:b600:28:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:29::,2a03:b600:29::3fff:ffff,US -2a03:b600:29::4000:0,2a03:b600:2f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:30::,2a03:b600:30::3fff:ffff,US -2a03:b600:30::4000:0,2a03:b600:30:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:31::,2a03:b600:31::3fff:ffff,US -2a03:b600:31::4000:0,2a03:b600:31:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:32::,2a03:b600:32::3fff:ffff,US -2a03:b600:32::4000:0,2a03:b600:32:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:33::,2a03:b600:33::3fff:ffff,US -2a03:b600:33::4000:0,2a03:b600:33:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:34::,2a03:b600:34::3fff:ffff,US -2a03:b600:34::4000:0,2a03:b600:34:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:35::,2a03:b600:35::3fff:ffff,US -2a03:b600:35::4000:0,2a03:b600:35:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:36::,2a03:b600:36::3fff:ffff,US -2a03:b600:36::4000:0,2a03:b600:36:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:37::,2a03:b600:37::3fff:ffff,US -2a03:b600:37::4000:0,2a03:b600:37:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:38::,2a03:b600:38::3fff:ffff,US -2a03:b600:38::4000:0,2a03:b600:38:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:39::,2a03:b600:39::3fff:ffff,US -2a03:b600:39::4000:0,2a03:b600:3f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:40::,2a03:b600:40::3fff:ffff,US -2a03:b600:40::4000:0,2a03:b600:40:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:41::,2a03:b600:41::3fff:ffff,US -2a03:b600:41::4000:0,2a03:b600:41:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:42::,2a03:b600:42::3fff:ffff,US -2a03:b600:42::4000:0,2a03:b600:42:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:43::,2a03:b600:43::3fff:ffff,US -2a03:b600:43::4000:0,2a03:b600:43:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:44::,2a03:b600:44::3fff:ffff,US -2a03:b600:44::4000:0,2a03:b600:45:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:46::,2a03:b600:46::3fff:ffff,US -2a03:b600:46::4000:0,2a03:b600:46:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:47::,2a03:b600:47::3fff:ffff,US -2a03:b600:47::4000:0,2a03:b600:47:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:48::,2a03:b600:48::3fff:ffff,US -2a03:b600:48::4000:0,2a03:b600:48:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:49::,2a03:b600:49::3fff:ffff,US -2a03:b600:49::4000:0,2a03:b600:4f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:50::,2a03:b600:50::3fff:ffff,US -2a03:b600:50::4000:0,2a03:b600:50:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:51::,2a03:b600:51::3fff:ffff,US -2a03:b600:51::4000:0,2a03:b600:51:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:52::,2a03:b600:52::3fff:ffff,US -2a03:b600:52::4000:0,2a03:b600:52:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:53::,2a03:b600:53::3fff:ffff,US -2a03:b600:53::4000:0,2a03:b600:53:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:54::,2a03:b600:54::3fff:ffff,US -2a03:b600:54::4000:0,2a03:b600:54:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:55::,2a03:b600:55::3fff:ffff,US -2a03:b600:55::4000:0,2a03:b600:55:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:56::,2a03:b600:56::3fff:ffff,US -2a03:b600:56::4000:0,2a03:b600:56:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:57::,2a03:b600:57::3fff:ffff,US -2a03:b600:57::4000:0,2a03:b600:57:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:58::,2a03:b600:58::3fff:ffff,US -2a03:b600:58::4000:0,2a03:b600:58:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:59::,2a03:b600:59::3fff:ffff,US -2a03:b600:59::4000:0,2a03:b600:5f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:60::,2a03:b600:60::3fff:ffff,US -2a03:b600:60::4000:0,2a03:b600:60:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:61::,2a03:b600:61::3fff:ffff,US -2a03:b600:61::4000:0,2a03:b600:61:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:62::,2a03:b600:62::3fff:ffff,US -2a03:b600:62::4000:0,2a03:b600:62:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:63::,2a03:b600:63::3fff:ffff,US -2a03:b600:63::4000:0,2a03:b600:63:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:64::,2a03:b600:64::3fff:ffff,US -2a03:b600:64::4000:0,2a03:b600:64:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:65::,2a03:b600:65::3fff:ffff,US -2a03:b600:65::4000:0,2a03:b600:65:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:66::,2a03:b600:66::3fff:ffff,US -2a03:b600:66::4000:0,2a03:b600:66:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:67::,2a03:b600:67::3fff:ffff,US -2a03:b600:67::4000:0,2a03:b600:67:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:68::,2a03:b600:68::3fff:ffff,US -2a03:b600:68::4000:0,2a03:b600:68:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:69::,2a03:b600:69::3fff:ffff,US -2a03:b600:69::4000:0,2a03:b600:6f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:70::,2a03:b600:70::3fff:ffff,US -2a03:b600:70::4000:0,2a03:b600:70:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:71::,2a03:b600:71::3fff:ffff,US -2a03:b600:71::4000:0,2a03:b600:71:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:72::,2a03:b600:72::3fff:ffff,US -2a03:b600:72::4000:0,2a03:b600:72:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:73::,2a03:b600:73::3fff:ffff,US -2a03:b600:73::4000:0,2a03:b600:73:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:74::,2a03:b600:74::3fff:ffff,US -2a03:b600:74::4000:0,2a03:b600:74:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:75::,2a03:b600:75::3fff:ffff,US -2a03:b600:75::4000:0,2a03:b600:75:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:76::,2a03:b600:76::3fff:ffff,US -2a03:b600:76::4000:0,2a03:b600:76:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:77::,2a03:b600:77::3fff:ffff,US -2a03:b600:77::4000:0,2a03:b600:77:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:78::,2a03:b600:78::3fff:ffff,US -2a03:b600:78::4000:0,2a03:b600:78:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:79::,2a03:b600:79::3fff:ffff,US -2a03:b600:79::4000:0,2a03:b600:7f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:80::,2a03:b600:80::3fff:ffff,US -2a03:b600:80::4000:0,2a03:b600:80:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:81::,2a03:b600:81::3fff:ffff,US -2a03:b600:81::4000:0,2a03:b600:81:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:82::,2a03:b600:82::3fff:ffff,US -2a03:b600:82::4000:0,2a03:b600:82:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:83::,2a03:b600:83::3fff:ffff,US -2a03:b600:83::4000:0,2a03:b600:83:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:84::,2a03:b600:84::3fff:ffff,US -2a03:b600:84::4000:0,2a03:b600:84:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:85::,2a03:b600:85::3fff:ffff,US -2a03:b600:85::4000:0,2a03:b600:85:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:86::,2a03:b600:86::3fff:ffff,US -2a03:b600:86::4000:0,2a03:b600:86:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:87::,2a03:b600:87::3fff:ffff,US -2a03:b600:87::4000:0,2a03:b600:87:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:88::,2a03:b600:88::3fff:ffff,US -2a03:b600:88::4000:0,2a03:b600:88:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:89::,2a03:b600:89::3fff:ffff,US -2a03:b600:89::4000:0,2a03:b600:8f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:90::,2a03:b600:90::3fff:ffff,US -2a03:b600:90::4000:0,2a03:b600:90:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:91::,2a03:b600:91::3fff:ffff,US -2a03:b600:91::4000:0,2a03:b600:91:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:92::,2a03:b600:92::3fff:ffff,US -2a03:b600:92::4000:0,2a03:b600:92:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:93::,2a03:b600:93::3fff:ffff,US -2a03:b600:93::4000:0,2a03:b600:93:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:94::,2a03:b600:94::3fff:ffff,US -2a03:b600:94::4000:0,2a03:b600:94:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:95::,2a03:b600:95::3fff:ffff,US -2a03:b600:95::4000:0,2a03:b600:95:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:96::,2a03:b600:96::3fff:ffff,US -2a03:b600:96::4000:0,2a03:b600:96:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:97::,2a03:b600:97::3fff:ffff,US -2a03:b600:97::4000:0,2a03:b600:97:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:98::,2a03:b600:98::3fff:ffff,US -2a03:b600:98::4000:0,2a03:b600:98:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:99::,2a03:b600:99::3fff:ffff,US -2a03:b600:99::4000:0,2a03:b600:ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:100::,2a03:b600:100::3fff:ffff,US -2a03:b600:100::4000:0,2a03:b600:100:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:101::,2a03:b600:101::3fff:ffff,US -2a03:b600:101::4000:0,2a03:b600:101:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:102::,2a03:b600:102::3fff:ffff,US -2a03:b600:102::4000:0,2a03:b600:102:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:103::,2a03:b600:103::3fff:ffff,US -2a03:b600:103::4000:0,2a03:b600:103:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:104::,2a03:b600:104::3fff:ffff,US -2a03:b600:104::4000:0,2a03:b600:104:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:105::,2a03:b600:105::3fff:ffff,US -2a03:b600:105::4000:0,2a03:b600:105:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:106::,2a03:b600:106::3fff:ffff,US -2a03:b600:106::4000:0,2a03:b600:106:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:107::,2a03:b600:107::3fff:ffff,US -2a03:b600:107::4000:0,2a03:b600:107:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:108::,2a03:b600:108::3fff:ffff,US -2a03:b600:108::4000:0,2a03:b600:108:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:109::,2a03:b600:109::3fff:ffff,US -2a03:b600:109::4000:0,2a03:b600:12f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:130::,2a03:b600:130::3fff:ffff,US -2a03:b600:130::4000:0,2a03:b600:130:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:131::,2a03:b600:131::3fff:ffff,US -2a03:b600:131::4000:0,2a03:b600:131:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:132::,2a03:b600:132::3fff:ffff,US -2a03:b600:132::4000:0,2a03:b600:132:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:133::,2a03:b600:133::3fff:ffff,US -2a03:b600:133::4000:0,2a03:b600:133:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:134::,2a03:b600:134::3fff:ffff,US -2a03:b600:134::4000:0,2a03:b600:134:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:135::,2a03:b600:135::3fff:ffff,US -2a03:b600:135::4000:0,2a03:b600:135:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:136::,2a03:b600:136::3fff:ffff,US -2a03:b600:136::4000:0,2a03:b600:136:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:137::,2a03:b600:137::3fff:ffff,US -2a03:b600:137::4000:0,2a03:b600:137:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:138::,2a03:b600:138::3fff:ffff,US -2a03:b600:138::4000:0,2a03:b600:138:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:139::,2a03:b600:139::3fff:ffff,US -2a03:b600:139::4000:0,2a03:b600:13f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:140::,2a03:b600:140::3fff:ffff,US -2a03:b600:140::4000:0,2a03:b600:140:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:141::,2a03:b600:141::3fff:ffff,US -2a03:b600:141::4000:0,2a03:b600:141:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:142::,2a03:b600:142::3fff:ffff,US -2a03:b600:142::4000:0,2a03:b600:142:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:143::,2a03:b600:143::3fff:ffff,US -2a03:b600:143::4000:0,2a03:b600:143:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:144::,2a03:b600:144::3fff:ffff,US -2a03:b600:144::4000:0,2a03:b600:144:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:145::,2a03:b600:145::3fff:ffff,US -2a03:b600:145::4000:0,2a03:b600:145:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:146::,2a03:b600:146::3fff:ffff,US -2a03:b600:146::4000:0,2a03:b600:146:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:147::,2a03:b600:147::3fff:ffff,US -2a03:b600:147::4000:0,2a03:b600:147:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:148::,2a03:b600:148::3fff:ffff,US -2a03:b600:148::4000:0,2a03:b600:148:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:149::,2a03:b600:149::3fff:ffff,US -2a03:b600:149::4000:0,2a03:b600:14f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:150::,2a03:b600:150::3fff:ffff,US -2a03:b600:150::4000:0,2a03:b600:150:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:151::,2a03:b600:151::3fff:ffff,US -2a03:b600:151::4000:0,2a03:b600:151:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:152::,2a03:b600:152::3fff:ffff,US -2a03:b600:152::4000:0,2a03:b600:152:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:153::,2a03:b600:153::3fff:ffff,US -2a03:b600:153::4000:0,2a03:b600:153:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:154::,2a03:b600:154::3fff:ffff,US -2a03:b600:154::4000:0,2a03:b600:154:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:155::,2a03:b600:155::3fff:ffff,US -2a03:b600:155::4000:0,2a03:b600:155:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:156::,2a03:b600:156::3fff:ffff,US -2a03:b600:156::4000:0,2a03:b600:156:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:157::,2a03:b600:157::3fff:ffff,US -2a03:b600:157::4000:0,2a03:b600:157:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:158::,2a03:b600:158::3fff:ffff,US -2a03:b600:158::4000:0,2a03:b600:158:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:159::,2a03:b600:159::3fff:ffff,US -2a03:b600:159::4000:0,2a03:b600:15f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:160::,2a03:b600:160::3fff:ffff,US -2a03:b600:160::4000:0,2a03:b600:160:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:161::,2a03:b600:161::3fff:ffff,US -2a03:b600:161::4000:0,2a03:b600:161:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:162::,2a03:b600:162::3fff:ffff,US -2a03:b600:162::4000:0,2a03:b600:162:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:163::,2a03:b600:163::3fff:ffff,US -2a03:b600:163::4000:0,2a03:b600:163:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:164::,2a03:b600:164::3fff:ffff,US -2a03:b600:164::4000:0,2a03:b600:164:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:165::,2a03:b600:165::3fff:ffff,US -2a03:b600:165::4000:0,2a03:b600:165:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:166::,2a03:b600:166::3fff:ffff,US -2a03:b600:166::4000:0,2a03:b600:166:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:167::,2a03:b600:167::3fff:ffff,US -2a03:b600:167::4000:0,2a03:b600:167:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:168::,2a03:b600:168::3fff:ffff,US -2a03:b600:168::4000:0,2a03:b600:168:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:169::,2a03:b600:169::3fff:ffff,US -2a03:b600:169::4000:0,2a03:b600:16f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:170::,2a03:b600:170::3fff:ffff,CA -2a03:b600:170::4000:0,2a03:b600:170:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:171::,2a03:b600:171::3fff:ffff,CA -2a03:b600:171::4000:0,2a03:b600:171:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:172::,2a03:b600:172::3fff:ffff,CA -2a03:b600:172::4000:0,2a03:b600:172:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:173::,2a03:b600:173::3fff:ffff,CA -2a03:b600:173::4000:0,2a03:b600:173:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:174::,2a03:b600:174::3fff:ffff,CA -2a03:b600:174::4000:0,2a03:b600:174:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:175::,2a03:b600:175::3fff:ffff,CA -2a03:b600:175::4000:0,2a03:b600:175:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:176::,2a03:b600:176::3fff:ffff,CA -2a03:b600:176::4000:0,2a03:b600:176:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:177::,2a03:b600:177::3fff:ffff,CA -2a03:b600:177::4000:0,2a03:b600:177:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:178::,2a03:b600:178::3fff:ffff,CA -2a03:b600:178::4000:0,2a03:b600:178:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:179::,2a03:b600:179::3fff:ffff,CA -2a03:b600:179::4000:0,2a03:b600:17f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:180::,2a03:b600:180::3fff:ffff,IT -2a03:b600:180::4000:0,2a03:b600:180:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:181::,2a03:b600:181::3fff:ffff,IT -2a03:b600:181::4000:0,2a03:b600:181:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:182::,2a03:b600:182::3fff:ffff,IT -2a03:b600:182::4000:0,2a03:b600:182:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:183::,2a03:b600:183::3fff:ffff,IT -2a03:b600:183::4000:0,2a03:b600:183:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:184::,2a03:b600:184::3fff:ffff,IT -2a03:b600:184::4000:0,2a03:b600:184:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:185::,2a03:b600:185::3fff:ffff,IT -2a03:b600:185::4000:0,2a03:b600:185:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:186::,2a03:b600:186::3fff:ffff,IT -2a03:b600:186::4000:0,2a03:b600:186:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:187::,2a03:b600:187::3fff:ffff,IT -2a03:b600:187::4000:0,2a03:b600:187:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:188::,2a03:b600:188::3fff:ffff,IT -2a03:b600:188::4000:0,2a03:b600:188:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:189::,2a03:b600:189::3fff:ffff,IT -2a03:b600:189::4000:0,2a03:b600:18f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:190::,2a03:b600:190::3fff:ffff,AU -2a03:b600:190::4000:0,2a03:b600:190:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:191::,2a03:b600:191::3fff:ffff,AU -2a03:b600:191::4000:0,2a03:b600:191:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:192::,2a03:b600:192::3fff:ffff,AU -2a03:b600:192::4000:0,2a03:b600:192:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:193::,2a03:b600:193::3fff:ffff,AU -2a03:b600:193::4000:0,2a03:b600:193:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:194::,2a03:b600:194::3fff:ffff,AU -2a03:b600:194::4000:0,2a03:b600:194:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:195::,2a03:b600:195::3fff:ffff,AU -2a03:b600:195::4000:0,2a03:b600:195:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:196::,2a03:b600:196::3fff:ffff,AU -2a03:b600:196::4000:0,2a03:b600:196:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:197::,2a03:b600:197::3fff:ffff,AU -2a03:b600:197::4000:0,2a03:b600:197:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:198::,2a03:b600:198::3fff:ffff,AU -2a03:b600:198::4000:0,2a03:b600:198:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:199::,2a03:b600:199::3fff:ffff,AU -2a03:b600:199::4000:0,2a03:b600:1ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:200::,2a03:b600:200::3fff:ffff,BR -2a03:b600:200::4000:0,2a03:b600:200:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:201::,2a03:b600:201::3fff:ffff,BR -2a03:b600:201::4000:0,2a03:b600:201:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:202::,2a03:b600:202::3fff:ffff,BR -2a03:b600:202::4000:0,2a03:b600:202:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:203::,2a03:b600:203::3fff:ffff,BR -2a03:b600:203::4000:0,2a03:b600:203:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:204::,2a03:b600:204::3fff:ffff,BR -2a03:b600:204::4000:0,2a03:b600:204:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:205::,2a03:b600:205::3fff:ffff,BR -2a03:b600:205::4000:0,2a03:b600:205:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:206::,2a03:b600:206::3fff:ffff,BR -2a03:b600:206::4000:0,2a03:b600:206:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:207::,2a03:b600:207::3fff:ffff,BR -2a03:b600:207::4000:0,2a03:b600:207:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:208::,2a03:b600:208::3fff:ffff,BR -2a03:b600:208::4000:0,2a03:b600:208:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:209::,2a03:b600:209::3fff:ffff,BR -2a03:b600:209::4000:0,2a03:b600:20f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:210::,2a03:b600:210::3fff:ffff,CR -2a03:b600:210::4000:0,2a03:b600:210:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:211::,2a03:b600:211::3fff:ffff,CR -2a03:b600:211::4000:0,2a03:b600:211:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:212::,2a03:b600:212::3fff:ffff,CR -2a03:b600:212::4000:0,2a03:b600:212:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:213::,2a03:b600:213::3fff:ffff,CR -2a03:b600:213::4000:0,2a03:b600:213:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:214::,2a03:b600:214::3fff:ffff,CR -2a03:b600:214::4000:0,2a03:b600:214:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:215::,2a03:b600:215::3fff:ffff,CR -2a03:b600:215::4000:0,2a03:b600:215:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:216::,2a03:b600:216::3fff:ffff,CR -2a03:b600:216::4000:0,2a03:b600:216:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:217::,2a03:b600:217::3fff:ffff,CR -2a03:b600:217::4000:0,2a03:b600:217:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:218::,2a03:b600:218::3fff:ffff,CR -2a03:b600:218::4000:0,2a03:b600:218:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:219::,2a03:b600:219::3fff:ffff,CR -2a03:b600:219::4000:0,2a03:b600:21f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:220::,2a03:b600:220::3fff:ffff,DE -2a03:b600:220::4000:0,2a03:b600:220:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:221::,2a03:b600:221::3fff:ffff,DE -2a03:b600:221::4000:0,2a03:b600:221:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:222::,2a03:b600:222::3fff:ffff,DE -2a03:b600:222::4000:0,2a03:b600:222:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:223::,2a03:b600:223::3fff:ffff,DE -2a03:b600:223::4000:0,2a03:b600:223:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:224::,2a03:b600:224::3fff:ffff,DE -2a03:b600:224::4000:0,2a03:b600:224:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:225::,2a03:b600:225::3fff:ffff,DE -2a03:b600:225::4000:0,2a03:b600:225:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:226::,2a03:b600:226::3fff:ffff,DE -2a03:b600:226::4000:0,2a03:b600:226:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:227::,2a03:b600:227::3fff:ffff,DE -2a03:b600:227::4000:0,2a03:b600:227:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:228::,2a03:b600:228::3fff:ffff,DE -2a03:b600:228::4000:0,2a03:b600:228:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:229::,2a03:b600:229::3fff:ffff,DE -2a03:b600:229::4000:0,2a03:b600:23f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:240::,2a03:b600:240::3fff:ffff,MX -2a03:b600:240::4000:0,2a03:b600:240:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:241::,2a03:b600:241::3fff:ffff,MX -2a03:b600:241::4000:0,2a03:b600:241:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:242::,2a03:b600:242::3fff:ffff,MX -2a03:b600:242::4000:0,2a03:b600:242:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:243::,2a03:b600:243::3fff:ffff,MX -2a03:b600:243::4000:0,2a03:b600:243:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:244::,2a03:b600:244::3fff:ffff,MX -2a03:b600:244::4000:0,2a03:b600:244:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:245::,2a03:b600:245::3fff:ffff,MX -2a03:b600:245::4000:0,2a03:b600:245:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:246::,2a03:b600:246::3fff:ffff,MX -2a03:b600:246::4000:0,2a03:b600:246:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:247::,2a03:b600:247::3fff:ffff,MX -2a03:b600:247::4000:0,2a03:b600:247:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:248::,2a03:b600:248::3fff:ffff,MX -2a03:b600:248::4000:0,2a03:b600:248:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:249::,2a03:b600:249::3fff:ffff,MX -2a03:b600:249::4000:0,2a03:b600:24f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:250::,2a03:b600:250::3fff:ffff,FR -2a03:b600:250::4000:0,2a03:b600:250:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:251::,2a03:b600:251::3fff:ffff,FR -2a03:b600:251::4000:0,2a03:b600:251:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:252::,2a03:b600:252::3fff:ffff,FR -2a03:b600:252::4000:0,2a03:b600:252:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:253::,2a03:b600:253::3fff:ffff,FR -2a03:b600:253::4000:0,2a03:b600:253:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:254::,2a03:b600:254::3fff:ffff,FR -2a03:b600:254::4000:0,2a03:b600:254:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:255::,2a03:b600:255::3fff:ffff,FR -2a03:b600:255::4000:0,2a03:b600:255:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:256::,2a03:b600:256::3fff:ffff,FR -2a03:b600:256::4000:0,2a03:b600:256:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:257::,2a03:b600:257::3fff:ffff,FR -2a03:b600:257::4000:0,2a03:b600:257:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:258::,2a03:b600:258::3fff:ffff,FR -2a03:b600:258::4000:0,2a03:b600:258:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:259::,2a03:b600:259::3fff:ffff,FR -2a03:b600:259::4000:0,2a03:b600:25f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:260::,2a03:b600:260::3fff:ffff,BS -2a03:b600:260::4000:0,2a03:b600:260:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:261::,2a03:b600:261::3fff:ffff,BS -2a03:b600:261::4000:0,2a03:b600:261:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:262::,2a03:b600:262::3fff:ffff,BS -2a03:b600:262::4000:0,2a03:b600:262:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:263::,2a03:b600:263::3fff:ffff,BS -2a03:b600:263::4000:0,2a03:b600:263:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:264::,2a03:b600:264::3fff:ffff,BS -2a03:b600:264::4000:0,2a03:b600:264:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:265::,2a03:b600:265::3fff:ffff,BS -2a03:b600:265::4000:0,2a03:b600:265:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:266::,2a03:b600:266::3fff:ffff,BS -2a03:b600:266::4000:0,2a03:b600:266:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:267::,2a03:b600:267::3fff:ffff,BS -2a03:b600:267::4000:0,2a03:b600:267:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:268::,2a03:b600:268::3fff:ffff,BS -2a03:b600:268::4000:0,2a03:b600:268:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:269::,2a03:b600:269::3fff:ffff,BS -2a03:b600:269::4000:0,2a03:b600:26f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:270::,2a03:b600:270::3fff:ffff,BS -2a03:b600:270::4000:0,2a03:b600:270:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:271::,2a03:b600:271::3fff:ffff,BS -2a03:b600:271::4000:0,2a03:b600:271:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:272::,2a03:b600:272::3fff:ffff,BS -2a03:b600:272::4000:0,2a03:b600:272:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:273::,2a03:b600:273::3fff:ffff,BS -2a03:b600:273::4000:0,2a03:b600:273:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:274::,2a03:b600:274::3fff:ffff,BS -2a03:b600:274::4000:0,2a03:b600:274:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:275::,2a03:b600:275::3fff:ffff,JM -2a03:b600:275::4000:0,2a03:b600:275:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:276::,2a03:b600:276::3fff:ffff,JM -2a03:b600:276::4000:0,2a03:b600:276:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:277::,2a03:b600:277::3fff:ffff,JM -2a03:b600:277::4000:0,2a03:b600:277:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:278::,2a03:b600:278::3fff:ffff,JM -2a03:b600:278::4000:0,2a03:b600:278:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:279::,2a03:b600:279::3fff:ffff,JM -2a03:b600:279::4000:0,2a03:b600:27f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:280::,2a03:b600:280::3fff:ffff,CO -2a03:b600:280::4000:0,2a03:b600:280:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:281::,2a03:b600:281::3fff:ffff,CO -2a03:b600:281::4000:0,2a03:b600:281:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:282::,2a03:b600:282::3fff:ffff,CO -2a03:b600:282::4000:0,2a03:b600:282:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:283::,2a03:b600:283::3fff:ffff,CO -2a03:b600:283::4000:0,2a03:b600:283:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:284::,2a03:b600:284::3fff:ffff,CO -2a03:b600:284::4000:0,2a03:b600:284:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:285::,2a03:b600:285::3fff:ffff,NL -2a03:b600:285::4000:0,2a03:b600:285:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:286::,2a03:b600:286::3fff:ffff,NL -2a03:b600:286::4000:0,2a03:b600:286:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:287::,2a03:b600:287::3fff:ffff,NL -2a03:b600:287::4000:0,2a03:b600:287:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:288::,2a03:b600:288::3fff:ffff,NL -2a03:b600:288::4000:0,2a03:b600:288:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:289::,2a03:b600:289::3fff:ffff,NL -2a03:b600:289::4000:0,2a03:b600:28f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:290::,2a03:b600:290::3fff:ffff,CZ -2a03:b600:290::4000:0,2a03:b600:290:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:291::,2a03:b600:291::3fff:ffff,CZ -2a03:b600:291::4000:0,2a03:b600:291:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:292::,2a03:b600:292::3fff:ffff,CZ -2a03:b600:292::4000:0,2a03:b600:292:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:293::,2a03:b600:293::3fff:ffff,CZ -2a03:b600:293::4000:0,2a03:b600:293:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:294::,2a03:b600:294::3fff:ffff,CZ -2a03:b600:294::4000:0,2a03:b600:294:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:295::,2a03:b600:295::3fff:ffff,CU -2a03:b600:295::4000:0,2a03:b600:295:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:296::,2a03:b600:296::3fff:ffff,CU -2a03:b600:296::4000:0,2a03:b600:296:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:297::,2a03:b600:297::3fff:ffff,CU -2a03:b600:297::4000:0,2a03:b600:297:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:298::,2a03:b600:298::3fff:ffff,CU -2a03:b600:298::4000:0,2a03:b600:298:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:299::,2a03:b600:299::3fff:ffff,CU -2a03:b600:299::4000:0,2a03:b600:2ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:300::,2a03:b600:300::3fff:ffff,PR -2a03:b600:300::4000:0,2a03:b600:300:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:301::,2a03:b600:301::3fff:ffff,PR -2a03:b600:301::4000:0,2a03:b600:301:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:302::,2a03:b600:302::3fff:ffff,PR -2a03:b600:302::4000:0,2a03:b600:302:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:303::,2a03:b600:303::3fff:ffff,PR -2a03:b600:303::4000:0,2a03:b600:303:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:304::,2a03:b600:304::3fff:ffff,PR -2a03:b600:304::4000:0,2a03:b600:304:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:305::,2a03:b600:305::3fff:ffff,RU -2a03:b600:305::4000:0,2a03:b600:305:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:306::,2a03:b600:306::3fff:ffff,RU -2a03:b600:306::4000:0,2a03:b600:306:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:307::,2a03:b600:307::3fff:ffff,RU -2a03:b600:307::4000:0,2a03:b600:307:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:308::,2a03:b600:308::3fff:ffff,RU -2a03:b600:308::4000:0,2a03:b600:308:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:309::,2a03:b600:309::3fff:ffff,RU -2a03:b600:309::4000:0,2a03:b600:30f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:310::,2a03:b600:310::3fff:ffff,CN -2a03:b600:310::4000:0,2a03:b600:310:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:311::,2a03:b600:311::3fff:ffff,CN -2a03:b600:311::4000:0,2a03:b600:311:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:312::,2a03:b600:312::3fff:ffff,CN -2a03:b600:312::4000:0,2a03:b600:312:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:313::,2a03:b600:313::3fff:ffff,CN -2a03:b600:313::4000:0,2a03:b600:313:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:314::,2a03:b600:314::3fff:ffff,CN -2a03:b600:314::4000:0,2a03:b600:314:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:315::,2a03:b600:315::3fff:ffff,JP -2a03:b600:315::4000:0,2a03:b600:315:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:316::,2a03:b600:316::3fff:ffff,JP -2a03:b600:316::4000:0,2a03:b600:316:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:317::,2a03:b600:317::3fff:ffff,JP -2a03:b600:317::4000:0,2a03:b600:317:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:318::,2a03:b600:318::3fff:ffff,JP -2a03:b600:318::4000:0,2a03:b600:318:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:319::,2a03:b600:319::3fff:ffff,JP -2a03:b600:319::4000:0,2a03:b600:31f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:320::,2a03:b600:320::3fff:ffff,MT -2a03:b600:320::4000:0,2a03:b600:320:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:321::,2a03:b600:321::3fff:ffff,MT -2a03:b600:321::4000:0,2a03:b600:321:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:322::,2a03:b600:322::3fff:ffff,MT -2a03:b600:322::4000:0,2a03:b600:322:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:323::,2a03:b600:323::3fff:ffff,MT -2a03:b600:323::4000:0,2a03:b600:323:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:324::,2a03:b600:324::3fff:ffff,MT -2a03:b600:324::4000:0,2a03:b600:324:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:325::,2a03:b600:325::3fff:ffff,CY -2a03:b600:325::4000:0,2a03:b600:325:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:326::,2a03:b600:326::3fff:ffff,CY -2a03:b600:326::4000:0,2a03:b600:326:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:327::,2a03:b600:327::3fff:ffff,CY -2a03:b600:327::4000:0,2a03:b600:327:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:328::,2a03:b600:328::3fff:ffff,CY -2a03:b600:328::4000:0,2a03:b600:328:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:329::,2a03:b600:329::3fff:ffff,CY -2a03:b600:329::4000:0,2a03:b600:32f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:330::,2a03:b600:330::3fff:ffff,PT -2a03:b600:330::4000:0,2a03:b600:330:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:331::,2a03:b600:331::3fff:ffff,PT -2a03:b600:331::4000:0,2a03:b600:331:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:332::,2a03:b600:332::3fff:ffff,PT -2a03:b600:332::4000:0,2a03:b600:332:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:333::,2a03:b600:333::3fff:ffff,PT -2a03:b600:333::4000:0,2a03:b600:333:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:334::,2a03:b600:334::3fff:ffff,PT -2a03:b600:334::4000:0,2a03:b600:33f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:340::,2a03:b600:340::3fff:ffff,NO -2a03:b600:340::4000:0,2a03:b600:340:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:341::,2a03:b600:341::3fff:ffff,NO -2a03:b600:341::4000:0,2a03:b600:341:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:342::,2a03:b600:342::3fff:ffff,NO -2a03:b600:342::4000:0,2a03:b600:342:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:343::,2a03:b600:343::3fff:ffff,NO -2a03:b600:343::4000:0,2a03:b600:343:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:344::,2a03:b600:344::3fff:ffff,NO -2a03:b600:344::4000:0,2a03:b600:344:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:345::,2a03:b600:345::3fff:ffff,SE -2a03:b600:345::4000:0,2a03:b600:345:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:346::,2a03:b600:346::3fff:ffff,SE -2a03:b600:346::4000:0,2a03:b600:346:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:347::,2a03:b600:347::3fff:ffff,SE -2a03:b600:347::4000:0,2a03:b600:347:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:348::,2a03:b600:348::3fff:ffff,SE -2a03:b600:348::4000:0,2a03:b600:348:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:349::,2a03:b600:349::3fff:ffff,SE -2a03:b600:349::4000:0,2a03:b600:34f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:350::,2a03:b600:350::3fff:ffff,FI -2a03:b600:350::4000:0,2a03:b600:350:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:351::,2a03:b600:351::3fff:ffff,FI -2a03:b600:351::4000:0,2a03:b600:351:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:352::,2a03:b600:352::3fff:ffff,FI -2a03:b600:352::4000:0,2a03:b600:352:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:353::,2a03:b600:353::3fff:ffff,FI -2a03:b600:353::4000:0,2a03:b600:353:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:354::,2a03:b600:354::3fff:ffff,FI -2a03:b600:354::4000:0,2a03:b600:354:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:355::,2a03:b600:355::3fff:ffff,AT -2a03:b600:355::4000:0,2a03:b600:355:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:356::,2a03:b600:356::3fff:ffff,AT -2a03:b600:356::4000:0,2a03:b600:356:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:357::,2a03:b600:357::3fff:ffff,AT -2a03:b600:357::4000:0,2a03:b600:357:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:358::,2a03:b600:358::3fff:ffff,AT -2a03:b600:358::4000:0,2a03:b600:358:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:359::,2a03:b600:359::3fff:ffff,AT -2a03:b600:359::4000:0,2a03:b600:35f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:360::,2a03:b600:360::3fff:ffff,PL -2a03:b600:360::4000:0,2a03:b600:360:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:361::,2a03:b600:361::3fff:ffff,PL -2a03:b600:361::4000:0,2a03:b600:361:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:362::,2a03:b600:362::3fff:ffff,PL -2a03:b600:362::4000:0,2a03:b600:362:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:363::,2a03:b600:363::3fff:ffff,PL -2a03:b600:363::4000:0,2a03:b600:363:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:364::,2a03:b600:364::3fff:ffff,PL -2a03:b600:364::4000:0,2a03:b600:364:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:365::,2a03:b600:365::3fff:ffff,BY -2a03:b600:365::4000:0,2a03:b600:365:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:366::,2a03:b600:366::3fff:ffff,BY -2a03:b600:366::4000:0,2a03:b600:366:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:367::,2a03:b600:367::3fff:ffff,BY -2a03:b600:367::4000:0,2a03:b600:367:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:368::,2a03:b600:368::3fff:ffff,BY -2a03:b600:368::4000:0,2a03:b600:368:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:369::,2a03:b600:369::3fff:ffff,BY -2a03:b600:369::4000:0,2a03:b600:53f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:540::,2a03:b600:540::3fff:ffff,US -2a03:b600:540::4000:0,2a03:b600:540:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:541::,2a03:b600:541::3fff:ffff,US -2a03:b600:541::4000:0,2a03:b600:541:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:542::,2a03:b600:542::3fff:ffff,US -2a03:b600:542::4000:0,2a03:b600:542:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:543::,2a03:b600:543::3fff:ffff,US -2a03:b600:543::4000:0,2a03:b600:543:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:544::,2a03:b600:544::3fff:ffff,US -2a03:b600:544::4000:0,2a03:b600:544:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:545::,2a03:b600:545::3fff:ffff,US -2a03:b600:545::4000:0,2a03:b600:545:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:546::,2a03:b600:546::3fff:ffff,US -2a03:b600:546::4000:0,2a03:b600:546:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:547::,2a03:b600:547::3fff:ffff,US -2a03:b600:547::4000:0,2a03:b600:547:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:548::,2a03:b600:548::3fff:ffff,US -2a03:b600:548::4000:0,2a03:b600:548:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:549::,2a03:b600:549::3fff:ffff,US -2a03:b600:549::4000:0,2a03:b600:54f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:550::,2a03:b600:550::3fff:ffff,US -2a03:b600:550::4000:0,2a03:b600:550:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:551::,2a03:b600:551::3fff:ffff,US -2a03:b600:551::4000:0,2a03:b600:551:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:552::,2a03:b600:552::3fff:ffff,US -2a03:b600:552::4000:0,2a03:b600:552:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:553::,2a03:b600:553::3fff:ffff,US -2a03:b600:553::4000:0,2a03:b600:553:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:554::,2a03:b600:554::3fff:ffff,US -2a03:b600:554::4000:0,2a03:b600:554:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:555::,2a03:b600:555::3fff:ffff,US -2a03:b600:555::4000:0,2a03:b600:555:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:556::,2a03:b600:556::3fff:ffff,US -2a03:b600:556::4000:0,2a03:b600:556:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:557::,2a03:b600:557::3fff:ffff,US -2a03:b600:557::4000:0,2a03:b600:557:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:558::,2a03:b600:558::3fff:ffff,US -2a03:b600:558::4000:0,2a03:b600:558:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:559::,2a03:b600:559::3fff:ffff,US -2a03:b600:559::4000:0,2a03:b600:55f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:560::,2a03:b600:560::3fff:ffff,US -2a03:b600:560::4000:0,2a03:b600:560:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:561::,2a03:b600:561::3fff:ffff,US -2a03:b600:561::4000:0,2a03:b600:561:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:562::,2a03:b600:562::3fff:ffff,US -2a03:b600:562::4000:0,2a03:b600:562:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:563::,2a03:b600:563::3fff:ffff,US -2a03:b600:563::4000:0,2a03:b600:563:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:564::,2a03:b600:564::3fff:ffff,US -2a03:b600:564::4000:0,2a03:b600:564:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:565::,2a03:b600:565::3fff:ffff,US -2a03:b600:565::4000:0,2a03:b600:565:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:566::,2a03:b600:566::3fff:ffff,US -2a03:b600:566::4000:0,2a03:b600:566:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:567::,2a03:b600:567::3fff:ffff,US -2a03:b600:567::4000:0,2a03:b600:567:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:568::,2a03:b600:568::3fff:ffff,US -2a03:b600:568::4000:0,2a03:b600:568:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:569::,2a03:b600:569::3fff:ffff,US -2a03:b600:569::4000:0,2a03:b600:56f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:570::,2a03:b600:570::3fff:ffff,US -2a03:b600:570::4000:0,2a03:b600:570:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:571::,2a03:b600:571::3fff:ffff,US -2a03:b600:571::4000:0,2a03:b600:571:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:572::,2a03:b600:572::3fff:ffff,US -2a03:b600:572::4000:0,2a03:b600:572:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:573::,2a03:b600:573::3fff:ffff,US -2a03:b600:573::4000:0,2a03:b600:573:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:574::,2a03:b600:574::3fff:ffff,US -2a03:b600:574::4000:0,2a03:b600:574:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:575::,2a03:b600:575::3fff:ffff,US -2a03:b600:575::4000:0,2a03:b600:575:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:576::,2a03:b600:576::3fff:ffff,US -2a03:b600:576::4000:0,2a03:b600:576:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:577::,2a03:b600:577::3fff:ffff,US -2a03:b600:577::4000:0,2a03:b600:577:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:578::,2a03:b600:578::3fff:ffff,US -2a03:b600:578::4000:0,2a03:b600:578:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:579::,2a03:b600:579::3fff:ffff,US -2a03:b600:579::4000:0,2a03:b600:57f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:580::,2a03:b600:580::3fff:ffff,US -2a03:b600:580::4000:0,2a03:b600:580:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:581::,2a03:b600:581::3fff:ffff,US -2a03:b600:581::4000:0,2a03:b600:581:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:582::,2a03:b600:582::3fff:ffff,US -2a03:b600:582::4000:0,2a03:b600:582:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:583::,2a03:b600:583::3fff:ffff,US -2a03:b600:583::4000:0,2a03:b600:583:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:584::,2a03:b600:584::3fff:ffff,US -2a03:b600:584::4000:0,2a03:b600:584:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:585::,2a03:b600:585::3fff:ffff,US -2a03:b600:585::4000:0,2a03:b600:585:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:586::,2a03:b600:586::3fff:ffff,US -2a03:b600:586::4000:0,2a03:b600:586:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:587::,2a03:b600:587::3fff:ffff,US -2a03:b600:587::4000:0,2a03:b600:587:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:588::,2a03:b600:588::3fff:ffff,US -2a03:b600:588::4000:0,2a03:b600:588:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:589::,2a03:b600:589::3fff:ffff,US -2a03:b600:589::4000:0,2a03:b600:58f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:590::,2a03:b600:590::3fff:ffff,US -2a03:b600:590::4000:0,2a03:b600:590:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:591::,2a03:b600:591::3fff:ffff,US -2a03:b600:591::4000:0,2a03:b600:591:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:592::,2a03:b600:592::3fff:ffff,US -2a03:b600:592::4000:0,2a03:b600:592:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:593::,2a03:b600:593::3fff:ffff,US -2a03:b600:593::4000:0,2a03:b600:593:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:594::,2a03:b600:594::3fff:ffff,US -2a03:b600:594::4000:0,2a03:b600:594:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:595::,2a03:b600:595::3fff:ffff,US -2a03:b600:595::4000:0,2a03:b600:595:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:596::,2a03:b600:596::3fff:ffff,US -2a03:b600:596::4000:0,2a03:b600:596:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:597::,2a03:b600:597::3fff:ffff,US -2a03:b600:597::4000:0,2a03:b600:597:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:598::,2a03:b600:598::3fff:ffff,US -2a03:b600:598::4000:0,2a03:b600:598:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:599::,2a03:b600:599::3fff:ffff,US -2a03:b600:599::4000:0,2a03:b600:5ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:600::,2a03:b600:600::3fff:ffff,US -2a03:b600:600::4000:0,2a03:b600:600:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:601::,2a03:b600:601::3fff:ffff,US -2a03:b600:601::4000:0,2a03:b600:601:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:602::,2a03:b600:602::3fff:ffff,US -2a03:b600:602::4000:0,2a03:b600:602:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:603::,2a03:b600:603::3fff:ffff,US -2a03:b600:603::4000:0,2a03:b600:603:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:604::,2a03:b600:604::3fff:ffff,US -2a03:b600:604::4000:0,2a03:b600:604:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:605::,2a03:b600:605::3fff:ffff,US -2a03:b600:605::4000:0,2a03:b600:605:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:606::,2a03:b600:606::3fff:ffff,US -2a03:b600:606::4000:0,2a03:b600:606:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:607::,2a03:b600:607::3fff:ffff,US -2a03:b600:607::4000:0,2a03:b600:607:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:608::,2a03:b600:608::3fff:ffff,US -2a03:b600:608::4000:0,2a03:b600:608:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:609::,2a03:b600:609::3fff:ffff,US -2a03:b600:609::4000:0,2a03:b600:60f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:610::,2a03:b600:610::3fff:ffff,US -2a03:b600:610::4000:0,2a03:b600:610:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:611::,2a03:b600:611::3fff:ffff,US -2a03:b600:611::4000:0,2a03:b600:611:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:612::,2a03:b600:612::3fff:ffff,US -2a03:b600:612::4000:0,2a03:b600:612:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:613::,2a03:b600:613::3fff:ffff,US -2a03:b600:613::4000:0,2a03:b600:613:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:614::,2a03:b600:614::3fff:ffff,US -2a03:b600:614::4000:0,2a03:b600:614:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:615::,2a03:b600:615::3fff:ffff,US -2a03:b600:615::4000:0,2a03:b600:615:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:616::,2a03:b600:616::3fff:ffff,US -2a03:b600:616::4000:0,2a03:b600:616:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:617::,2a03:b600:617::3fff:ffff,US -2a03:b600:617::4000:0,2a03:b600:617:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:618::,2a03:b600:618::3fff:ffff,US -2a03:b600:618::4000:0,2a03:b600:618:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:619::,2a03:b600:619::3fff:ffff,US -2a03:b600:619::4000:0,2a03:b600:61f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:620::,2a03:b600:620::3fff:ffff,US -2a03:b600:620::4000:0,2a03:b600:620:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:621::,2a03:b600:621::3fff:ffff,US -2a03:b600:621::4000:0,2a03:b600:621:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:622::,2a03:b600:622::3fff:ffff,US -2a03:b600:622::4000:0,2a03:b600:622:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:623::,2a03:b600:623::3fff:ffff,US -2a03:b600:623::4000:0,2a03:b600:623:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:624::,2a03:b600:624::3fff:ffff,US -2a03:b600:624::4000:0,2a03:b600:624:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:625::,2a03:b600:625::3fff:ffff,US -2a03:b600:625::4000:0,2a03:b600:625:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:626::,2a03:b600:626::3fff:ffff,US -2a03:b600:626::4000:0,2a03:b600:626:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:627::,2a03:b600:627::3fff:ffff,US -2a03:b600:627::4000:0,2a03:b600:627:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:628::,2a03:b600:628::3fff:ffff,US -2a03:b600:628::4000:0,2a03:b600:628:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:629::,2a03:b600:629::3fff:ffff,US -2a03:b600:629::4000:0,2a03:b600:62f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:630::,2a03:b600:630::3fff:ffff,US -2a03:b600:630::4000:0,2a03:b600:630:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:631::,2a03:b600:631::3fff:ffff,US -2a03:b600:631::4000:0,2a03:b600:631:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:632::,2a03:b600:632::3fff:ffff,US -2a03:b600:632::4000:0,2a03:b600:632:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:633::,2a03:b600:633::3fff:ffff,US -2a03:b600:633::4000:0,2a03:b600:633:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:634::,2a03:b600:634::3fff:ffff,US -2a03:b600:634::4000:0,2a03:b600:63f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:640::,2a03:b600:640::3fff:ffff,US -2a03:b600:640::4000:0,2a03:b600:640:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:641::,2a03:b600:641::3fff:ffff,US -2a03:b600:641::4000:0,2a03:b600:641:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:642::,2a03:b600:642::3fff:ffff,US -2a03:b600:642::4000:0,2a03:b600:642:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:643::,2a03:b600:643::3fff:ffff,US -2a03:b600:643::4000:0,2a03:b600:643:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:644::,2a03:b600:644::3fff:ffff,US -2a03:b600:644::4000:0,2a03:b600:644:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:645::,2a03:b600:645::3fff:ffff,US -2a03:b600:645::4000:0,2a03:b600:646:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:647::,2a03:b600:647::3fff:ffff,US -2a03:b600:647::4000:0,2a03:b600:647:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:648::,2a03:b600:648::3fff:ffff,US -2a03:b600:648::4000:0,2a03:b600:648:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:649::,2a03:b600:649::3fff:ffff,US -2a03:b600:649::4000:0,2a03:b600:650:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:651::,2a03:b600:651::3fff:ffff,US -2a03:b600:651::4000:0,2a03:b600:651:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:652::,2a03:b600:652::3fff:ffff,US -2a03:b600:652::4000:0,2a03:b600:652:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:653::,2a03:b600:653::3fff:ffff,US -2a03:b600:653::4000:0,2a03:b600:653:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:654::,2a03:b600:654::3fff:ffff,US -2a03:b600:654::4000:0,2a03:b600:654:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:655::,2a03:b600:655::3fff:ffff,US -2a03:b600:655::4000:0,2a03:b600:655:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:656::,2a03:b600:656::3fff:ffff,US -2a03:b600:656::4000:0,2a03:b600:656:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:657::,2a03:b600:657::3fff:ffff,US -2a03:b600:657::4000:0,2a03:b600:657:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:658::,2a03:b600:658::3fff:ffff,US -2a03:b600:658::4000:0,2a03:b600:658:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:659::,2a03:b600:659::3fff:ffff,US -2a03:b600:659::4000:0,2a03:b600:65f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:660::,2a03:b600:660::3fff:ffff,CA -2a03:b600:660::4000:0,2a03:b600:660:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:661::,2a03:b600:661::3fff:ffff,CA -2a03:b600:661::4000:0,2a03:b600:661:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:662::,2a03:b600:662::3fff:ffff,CA -2a03:b600:662::4000:0,2a03:b600:662:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:663::,2a03:b600:663::3fff:ffff,CA -2a03:b600:663::4000:0,2a03:b600:663:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:664::,2a03:b600:664::3fff:ffff,CA -2a03:b600:664::4000:0,2a03:b600:664:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:665::,2a03:b600:665::3fff:ffff,CA -2a03:b600:665::4000:0,2a03:b600:665:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:666::,2a03:b600:666::3fff:ffff,CA -2a03:b600:666::4000:0,2a03:b600:666:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:667::,2a03:b600:667::3fff:ffff,CA -2a03:b600:667::4000:0,2a03:b600:667:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:668::,2a03:b600:668::3fff:ffff,CA -2a03:b600:668::4000:0,2a03:b600:668:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:669::,2a03:b600:669::3fff:ffff,CA -2a03:b600:669::4000:0,2a03:b600:66f:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:670::,2a03:b600:670::3fff:ffff,IT -2a03:b600:670::4000:0,2a03:b600:670:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:671::,2a03:b600:671::3fff:ffff,IT -2a03:b600:671::4000:0,2a03:b600:671:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:672::,2a03:b600:672::3fff:ffff,IT -2a03:b600:672::4000:0,2a03:b600:672:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:673::,2a03:b600:673::3fff:ffff,IT -2a03:b600:673::4000:0,2a03:b600:673:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:674::,2a03:b600:674::3fff:ffff,IT -2a03:b600:674::4000:0,2a03:b600:674:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:675::,2a03:b600:675::3fff:ffff,IN -2a03:b600:675::4000:0,2a03:b600:675:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:676::,2a03:b600:676::3fff:ffff,IN -2a03:b600:676::4000:0,2a03:b600:676:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:677::,2a03:b600:677::3fff:ffff,IN -2a03:b600:677::4000:0,2a03:b600:677:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:678::,2a03:b600:678::3fff:ffff,IN -2a03:b600:678::4000:0,2a03:b600:678:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:679::,2a03:b600:679::3fff:ffff,IN -2a03:b600:679::4000:0,2a03:b600:9fff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:a000::,2a03:b600:a000::3fff:ffff,US -2a03:b600:a000::4000:0,2a03:b600:a9ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:aa00::,2a03:b600:aa00::3fff:ffff,US -2a03:b600:aa00::4000:0,2a03:b600:aaff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ab00::,2a03:b600:ab00::3fff:ffff,US -2a03:b600:ab00::4000:0,2a03:b600:abff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ac00::,2a03:b600:ac00::3fff:ffff,US -2a03:b600:ac00::4000:0,2a03:b600:acff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ad00::,2a03:b600:ad00::3fff:ffff,US -2a03:b600:ad00::4000:0,2a03:b600:adff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ae00::,2a03:b600:ae00::3fff:ffff,US -2a03:b600:ae00::4000:0,2a03:b600:aeff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:af00::,2a03:b600:af00::3fff:ffff,US -2a03:b600:af00::4000:0,2a03:b600:b9ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ba00::,2a03:b600:ba00::3fff:ffff,US -2a03:b600:ba00::4000:0,2a03:b600:baff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:bb00::,2a03:b600:bb00::3fff:ffff,US -2a03:b600:bb00::4000:0,2a03:b600:bcff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:bd00::,2a03:b600:bd00::3fff:ffff,US -2a03:b600:bd00::4000:0,2a03:b600:bdff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:be00::,2a03:b600:be00::3fff:ffff,US -2a03:b600:be00::4000:0,2a03:b600:beff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:bf00::,2a03:b600:bf00::3fff:ffff,US -2a03:b600:bf00::4000:0,2a03:b600:c9ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ca00::,2a03:b600:ca00::3fff:ffff,US -2a03:b600:ca00::4000:0,2a03:b600:caff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:cb00::,2a03:b600:cb00::3fff:ffff,US -2a03:b600:cb00::4000:0,2a03:b600:cbff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:cc00::,2a03:b600:cc00::3fff:ffff,US -2a03:b600:cc00::4000:0,2a03:b600:ccff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:cd00::,2a03:b600:cd00::3fff:ffff,US -2a03:b600:cd00::4000:0,2a03:b600:cdff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ce00::,2a03:b600:ce00::3fff:ffff,US -2a03:b600:ce00::4000:0,2a03:b600:ceff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:cf00::,2a03:b600:cf00::3fff:ffff,US -2a03:b600:cf00::4000:0,2a03:b600:d9ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:da00::,2a03:b600:da00::3fff:ffff,US -2a03:b600:da00::4000:0,2a03:b600:daff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:db00::,2a03:b600:db00::3fff:ffff,US -2a03:b600:db00::4000:0,2a03:b600:dbff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:dc00::,2a03:b600:dc00::3fff:ffff,US -2a03:b600:dc00::4000:0,2a03:b600:dcff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:dd00::,2a03:b600:dd00::3fff:ffff,US -2a03:b600:dd00::4000:0,2a03:b600:ddff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:de00::,2a03:b600:de00::3fff:ffff,US -2a03:b600:de00::4000:0,2a03:b600:deff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:df00::,2a03:b600:df00::3fff:ffff,US -2a03:b600:df00::4000:0,2a03:b600:e9ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ea00::,2a03:b600:ea00::3fff:ffff,US -2a03:b600:ea00::4000:0,2a03:b600:eaff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:eb00::,2a03:b600:eb00::3fff:ffff,US -2a03:b600:eb00::4000:0,2a03:b600:ebff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ec00::,2a03:b600:ec00::3fff:ffff,US -2a03:b600:ec00::4000:0,2a03:b600:ecff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ed00::,2a03:b600:ed00::3fff:ffff,US -2a03:b600:ed00::4000:0,2a03:b600:edff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ee00::,2a03:b600:ee00::3fff:ffff,US -2a03:b600:ee00::4000:0,2a03:b600:eeff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b600:ef00::,2a03:b600:ef00::3fff:ffff,US -2a03:b600:ef00::4000:0,2a03:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b640::,2a03:b640:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a03:b680::,2a03:b680:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:b6c0::,2a03:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b700::,2a03:b700:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b740::,2a03:b740:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:b780::,2a03:b780:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:b7c0::,2a03:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b800::,2a03:b800:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b840::,2a03:b840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b880::,2a03:b887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:b8c0::,2a03:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:b900::,2a03:b900:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:b940::,2a03:b940:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:b980::,2a03:b980:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b9c0::,2a03:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ba00::,2a03:ba07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:ba40::,2a03:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a03:ba80::,2a03:ba80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bac0::,2a03:bac0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bb00::,2a03:bb07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:bb40::,2a03:bb40:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a03:bb80::,2a03:bb80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bbc0::,2a03:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:bc00::,2a03:bc00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:bc40::,2a03:bc47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:bc80::,2a03:bc80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:bcc0::,2a03:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:bd00::,2a03:bd00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bd40::,2a03:bd47:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:bd80::,2a03:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:bdc0::,2a03:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:be00::,2a03:be00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:be40::,2a03:be40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:be80::,2a03:be80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:bec0::,2a03:bec0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:bf00::,2a03:bf00:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:bf40::,2a03:bf40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:bf80::,2a03:bf80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:bfc0::,2a03:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c000::,2a03:c007:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:c040::,2a03:c040:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:c080::,2a03:c080:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:c0c0::,2a03:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:c100::,2a03:c100:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:c140::,2a03:c140:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a03:c180::,2a03:c180:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:c1c0::,2a03:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:c200::,2a03:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:c240::,2a03:c240:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a03:c280::,2a03:c280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:c2c0::,2a03:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:c300::,2a03:c300:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:c340::,2a03:c340:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a03:c380::,2a03:c380:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:c3c0::,2a03:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:c400::,2a03:c400:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:c440::,2a03:c440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:c480::,2a03:c480:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:c4c0::,2a03:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:c500::,2a03:c500:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c540::,2a03:c540:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:c580::,2a03:c580:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:c5c0::,2a03:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:c600::,2a03:c600:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:c640::,2a03:c640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c680::,2a03:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:c6c0::,2a03:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:c700::,2a03:c700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:c740::,2a03:c740:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a03:c780::,2a03:c780:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:c7c0::,2a03:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:c800::,2a03:c800:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a03:c840::,2a03:c840:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:c880::,2a03:c880:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:c900::,2a03:c900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c940::,2a03:c940:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:c980::,2a03:c980:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:c9c0::,2a03:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:ca00::,2a03:ca00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ca40::,2a03:ca40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:ca80::,2a03:ca87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:cac0::,2a03:cac0:f022:ffff:ffff:ffff:ffff:ffff,IL -2a03:cac0:f023::,2a03:cac0:f023:7fff:ffff:ffff:ffff:ffff,UA -2a03:cac0:f023:8000::,2a03:cac0:f061:ffff:ffff:ffff:ffff:ffff,IL -2a03:cac0:f062::,2a03:cac0:f062:7fff:ffff:ffff:ffff:ffff,UA -2a03:cac0:f062:8000::,2a03:cac0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:cb00::,2a03:cb00:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:cb40::,2a03:cb40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:cb80::,2a03:cb87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:cbc0::,2a03:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:cc00::,2a03:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:cc40::,2a03:cc40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:cc80::,2a03:cc87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:ccc0::,2a03:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:cd00::,2a03:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:cd40::,2a03:cd40:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:cd80::,2a03:cd80:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:cdc0::,2a03:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:ce00::,2a03:ce00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ce40::,2a03:ce47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:ce80::,2a03:ce80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:cec0::,2a03:cec0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:cf00::,2a03:cf00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:cf40::,2a03:cf40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:cf80::,2a03:cf80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:cfc0::,2a03:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:d000::,2a03:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:d040::,2a03:d040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:d080::,2a03:d080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:d0c0::,2a03:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:d100::,2a03:d100:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:d140::,2a03:d140:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:d180::,2a03:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:d1c0::,2a03:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:d200::,2a03:d200:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:d240::,2a03:d240:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:d280::,2a03:d280:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:d2c0::,2a03:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:d300::,2a03:d300:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:d340::,2a03:d340:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:d380::,2a03:d380:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:d3c0::,2a03:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:d400::,2a03:d400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:d440::,2a03:d440:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:d480::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:d4c0::,2a03:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:d500::,2a03:d500:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:d540::,2a03:d540:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:d580::,2a03:d587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:d5c0::,2a03:d5c0:1c20:ffff:ffff:ffff:ffff:ffff,IL -2a03:d5c0:1c21::,2a03:d5c0:1c21:ffff:ffff:ffff:ffff:ffff,NL -2a03:d5c0:1c22::,2a03:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:d600::,2a03:d607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:d640::,2a03:d640:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:d680::,2a03:d680:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:d6c0::,2a03:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:d700::,2a03:d700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:d740::,2a03:d740:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:d780::,2a03:d780:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:d7c0::,2a03:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:d800::,2a03:d800:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:d840::,2a03:d840:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:d880::,2a03:d887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:d8c0::,2a03:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:d900::,2a03:d900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:d940::,2a03:d940:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:d980::,2a03:d980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:da00::,2a03:da00:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:da40::,2a03:da40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:da80::,2a03:da80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:dac0::,2a03:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:db00::,2a03:db07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:db40::,2a03:db47:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a03:db80::,2a03:db80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:dbc0::,2a03:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:dc00::,2a03:dc00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:dc40::,2a03:dc40:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a03:dc80::,2a03:dc80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:dcc0::,2a03:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:dd00::,2a03:dd00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:dd40::,2a03:dd40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:dd80::,2a03:dd87:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:ddc0::,2a03:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:de00::,2a03:de00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:de40::,2a03:de40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:de80::,2a03:de80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:dec0::,2a03:dec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:df00::,2a03:df00:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:df40::,2a03:df40:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:df80::,2a03:df80:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a03:dfc0::,2a03:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:e000::,2a03:e000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:e040::,2a03:e040:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e080::,2a03:e080:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:e0c0::,2a03:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:e140::,2a03:e140:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e180::,2a03:e180:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a03:e1c0::,2a03:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:e200::,2a03:e200:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:e240::,2a03:e240:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:e280::,2a03:e280:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:e2c0::,2a03:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e300::,2a03:e300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:e340::,2a03:e340:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e380::,2a03:e380:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a03:e3c0::,2a03:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:e400::,2a03:e401:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e440::,2a03:e440:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:e480::,2a03:e480:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e4c0::,2a03:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e500::,2a03:e500:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:e540::,2a03:e540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e580::,2a03:e587:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:e5c0::,2a03:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:e600::,2a03:e600:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:e640::,2a03:e640:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:e680::,2a03:e680:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:e6c0::,2a03:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e700::,2a03:e700:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:e740::,2a03:e740:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:e780::,2a03:e780:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e7c0::,2a03:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a03:e800::,2a03:e800:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:e840::,2a03:e847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:e880::,2a03:e880:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:e8c0::,2a03:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:e900::,2a03:e900:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:e940::,2a03:e940:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a03:e980::,2a03:e980:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:e9c0::,2a03:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ea00::,2a03:ea00:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:ea40::,2a03:ea40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:ea80::,2a03:ea80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:eac0::,2a03:eac0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:eb00::,2a03:eb00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a03:eb40::,2a03:eb40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:eb80::,2a03:eb80:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a03:ebc0::,2a03:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ec00::,2a03:ec00:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a03:ec40::,2a03:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ec80::,2a03:ec80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ecc0::,2a03:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ed00::,2a03:ed00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:ed40::,2a03:ed40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:ed80::,2a03:ed80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:edc0::,2a03:edc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ee00::,2a03:ee00:ffff:ffff:ffff:ffff:ffff:ffff,FO -2a03:ee40::,2a03:ee40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ee80::,2a03:ee80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:eec0::,2a03:eec0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ef00::,2a03:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:ef40::,2a03:ef41:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:ef42::,2a03:ef42::1fff:ffff:ffff:ffff:ffff,GB -2a03:ef42:0:2000::,2a03:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:ef80::,2a03:ef80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:efc0::,2a03:efc0:4ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:efc0:500::,2a03:efc0:500:7fff:ffff:ffff:ffff:ffff,SE -2a03:efc0:500:8000::,2a03:efc0:6ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:efc0:700::,2a03:efc0:7ff:ffff:ffff:ffff:ffff:ffff,FR -2a03:efc0:800::,2a03:efc0:8ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:efc0:900::,2a03:efc0:9ff:ffff:ffff:ffff:ffff:ffff,ES -2a03:efc0:a00::,2a03:efc0:10ff:ffff:ffff:ffff:ffff:ffff,GB -2a03:efc0:1100::,2a03:efc0:11ff:ffff:ffff:ffff:ffff:ffff,DE -2a03:efc0:1200::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:f000::,2a03:f007:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:f040::,2a03:f040:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:f080::,2a03:f080:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:f0c0::,2a03:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:f100::,2a03:f100:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:f140::,2a03:f140:ffff:ffff:ffff:ffff:ffff:ffff,NC -2a03:f180::,2a03:f180:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:f1c0::,2a03:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:f200::,2a03:f200:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:f240::,2a03:f240:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:f280::,2a03:f280:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:f2c0::,2a03:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:f300::,2a03:f300:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:f340::,2a03:f347:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:f380::,2a03:f380:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:f400::,2a03:f400:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a03:f440::,2a03:f440:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:f480::,2a03:f480:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a03:f4c0::,2a03:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:f500::,2a03:f500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:f540::,2a03:f540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:f580::,2a03:f580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:f5c0::,2a03:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:f600::,2a03:f600:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:f640::,2a03:f640:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:f680::,2a03:f680:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a03:f6c0::,2a03:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a03:f700::,2a03:f700:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:f740::,2a03:f740:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a03:f780::,2a03:f780:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:f7c0::,2a03:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:f800::,2a03:f800:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a03:f840::,2a03:f840:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:f880::,2a03:f880:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:f8c0::,2a03:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a03:f900::,2a03:f907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:f940::,2a03:f940:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a03:f980::,2a03:f980:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:f9c0::,2a03:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:fa00::,2a03:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:fa40::,2a03:fa40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a03:fa80::,2a03:fa80:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a03:fac0::,2a03:fac7:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a03:fb00::,2a03:fb00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:fb40::,2a03:fb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:fb80::,2a03:fb80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a03:fbc0::,2a03:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:fc00::,2a03:fc07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:fc40::,2a03:fc40:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a03:fc80::,2a03:fc87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:fcc0::,2a03:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:fd00::,2a03:fd00:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a03:fd40::,2a03:fd40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:fd80::,2a03:fd80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:fdc0::,2a03:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,GL -2a03:fe00::,2a03:fe00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:fe40::,2a03:fe40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:fe80::,2a03:fe80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:fec0::,2a03:fec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:ff00::,2a03:ff00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:ff40::,2a03:ff40:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a03:ffc0::,2a03:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a04::,2a04:7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:40::,2a04:47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:80::,2a04:87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:c0::,2a04:c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:100::,2a04:107:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:140::,2a04:147:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:180::,2a04:187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1c0::,2a04:1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:200::,2a04:207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:240::,2a04:247:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:280::,2a04:287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:2c0::,2a04:2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:300::,2a04:307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:340::,2a04:347:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:380::,2a04:387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:3c0::,2a04:3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:400::,2a04:407:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:440::,2a04:447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:480::,2a04:487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4c0::,2a04:4c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:500::,2a04:507:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:540::,2a04:547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:580::,2a04:587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5c0::,2a04:5c3:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:5e0::,2a04:5e7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:600::,2a04:607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:640::,2a04:647:ffff:ffff:ffff:ffff:ffff:ffff,VA -2a04:680::,2a04:687:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:6c0::,2a04:6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:700::,2a04:707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:740::,2a04:747:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:780::,2a04:787:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:7c0::,2a04:7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:800::,2a04:807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:840::,2a04:847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:880::,2a04:887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:8c0::,2a04:8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:900::,2a04:907:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a04:940::,2a04:947:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a04:980::,2a04:987:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:9c0::,2a04:9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:a00::,2a04:a07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:a40::,2a04:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:a80::,2a04:a87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:ac0::,2a04:ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b00::,2a04:b07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:b40::,2a04:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:b80::,2a04:b87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:bc0::,2a04:bc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:c00::,2a04:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c40::,2a04:c47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:c80::,2a04:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:cc0::,2a04:cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:d00::,2a04:d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:d40::,2a04:d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:d80::,2a04:d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:dc0::,2a04:dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e00::,2a04:e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:e40::,2a04:e47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:e80::,2a04:e87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:ec0::,2a04:ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:f00::,2a04:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:f40::,2a04:f47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:f80::,2a04:f87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:1000::,2a04:1007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1040::,2a04:1047:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:1080::,2a04:1087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:10c0::,2a04:10c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:1100::,2a04:1103:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:1120::,2a04:1123:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1140::,2a04:1143:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1160::,2a04:1161:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:1170::,2a04:1171:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1180::,2a04:1187:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:11c0::,2a04:11c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1200::,2a04:1207:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:1240::,2a04:1247:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:1280::,2a04:1287:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:12c0::,2a04:12c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:1300::,2a04:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1340::,2a04:1347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:1380::,2a04:1387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:13c0::,2a04:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1400::,2a04:1407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1440::,2a04:1447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:1480::,2a04:1487:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a04:14c0::,2a04:14c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:1500::,2a04:1507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1540::,2a04:1547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:1580::,2a04:1587:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:15c0::,2a04:15c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1600::,2a04:1607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:1640::,2a04:1647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1680::,2a04:1687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:16c0::,2a04:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1700::,2a04:1707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1740::,2a04:1747:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:1780::,2a04:1787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:17c0::,2a04:17c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:1800::,2a04:1807:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:1840::,2a04:1847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1880::,2a04:1887:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:18c0::,2a04:18c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1900::,2a04:1907:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:1940::,2a04:1947:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1980::,2a04:1987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:19c0::,2a04:19c7:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a04:1a00::,2a04:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:1a40::,2a04:1a47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:1a80::,2a04:1a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1ac0::,2a04:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:1b00::,2a04:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1b40::,2a04:1b47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:1bc0::,2a04:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:1c00::,2a04:1c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1c40::,2a04:1c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:1c80::,2a04:1c87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:1cc0::,2a04:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1d00::,2a04:1d07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:1d40::,2a04:1d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:1d80::,2a04:1d87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:1dc0::,2a04:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:1e00::,2a04:1e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1e40::,2a04:1e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:1e80::,2a04:1e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:1ec0::,2a04:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:1f00::,2a04:1f03:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:1f20::,2a04:1f23:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:1f40::,2a04:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:1f80::,2a04:1f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:1fc0::,2a04:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:2000::,2a04:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:2040::,2a04:2047:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:2080::,2a04:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:20c0::,2a04:20c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:2100::,2a04:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:2140::,2a04:2147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2180::,2a04:2187:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a04:21c0::,2a04:21c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2200::,2a04:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:2240::,2a04:2247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:2280::,2a04:2287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:22c0::,2a04:22c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:2300::,2a04:2307:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:2340::,2a04:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2380::,2a04:2387:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a04:23c0::,2a04:23c7:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:2400::,2a04:241f:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:2500::,2a04:2507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:2540::,2a04:2547:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:2580::,2a04:2587:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:25c0::,2a04:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:2600::,2a04:2607:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:2640::,2a04:2647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:2680::,2a04:2687:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:26c0::,2a04:26c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:2700::,2a04:2707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:2740::,2a04:2747:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:27c0::,2a04:27c7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a04:2800::,2a04:2807:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:2840::,2a04:2847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2880::,2a04:2883:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:28a0::,2a04:28a0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:28b0::,2a04:28b1:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:28c0::,2a04:28c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:2940::,2a04:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:2980::,2a04:2987:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:29c0::,2a04:29c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:2a00::,2a04:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2a40::,2a04:2a47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:2a80::,2a04:2a87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:2ac0::,2a04:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2b00::,2a04:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2b40::,2a04:2b47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:2b80::,2a04:2b87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:2bc0::,2a04:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:2c00::,2a04:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:2c80::,2a04:2c87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:2cc0::,2a04:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:2d00::,2a04:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:2d40::,2a04:2d47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:2d80::,2a04:2d87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:2dc0::,2a04:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:2e00::,2a04:2e07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:2e40::,2a04:2e47:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:2e80::,2a04:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a04:2ec0::,2a04:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a04:2f00::,2a04:2f07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:2f40::,2a04:2f47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:2f80::,2a04:2f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:2fc0::,2a04:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3000::,2a04:3007:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:3040::,2a04:3047:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a04:3080::,2a04:3087:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:30c0::,2a04:30c2:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:30c3::,2a04:30c3::ffff:ffff:ffff:ffff:ffff,US -2a04:30c3:1::,2a04:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3100::,2a04:3107:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:3140::,2a04:3147:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:3180::,2a04:3187:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:31c0::,2a04:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3200::,2a04:3207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:3240::,2a04:3247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:3280::,2a04:3287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:32c0::,2a04:32c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3300::,2a04:3307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:3340::,2a04:3347:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a04:3380::,2a04:3387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:33c0::,2a04:33c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3400::,2a04:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:3440::,2a04:3447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:3480::,2a04:3487:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:34c0::,2a04:34c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3500::,2a04:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:3540::,2a04:3542:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:3543::,2a04:3543:ffff:ffff:ffff:ffff:ffff:ffff,SG -2a04:3544::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:3580::,2a04:3587:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:35c0::,2a04:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:3600::,2a04:3607:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3640::,2a04:3647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3680::,2a04:3687:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:36c0::,2a04:36c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:3700::,2a04:3707:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:3740::,2a04:3747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:3780::,2a04:3787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:3800::,2a04:3807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3840::,2a04:3847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3880::,2a04:3883:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:38a0::,2a04:38a3:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:38c0::,2a04:38c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3900::,2a04:3907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:3940::,2a04:3947:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:3980::,2a04:3987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:39c0::,2a04:39c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:3a00::,2a04:3a07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:3a40::,2a04:3a40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:3a50::,2a04:3a51:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:3a60::,2a04:3a63:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:3a80::,2a04:3a87:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a04:3ac0::,2a04:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:3b00::,2a04:3b07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3b40::,2a04:3b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:3b80::,2a04:3b87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:3bc0::,2a04:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:3c00::,2a04:3c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:3c40::,2a04:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:3c80::,2a04:3c87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:3cc0::,2a04:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:3d00::,2a04:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:3d40::,2a04:3d47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:3d80::,2a04:3d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:3dc0::,2a04:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:3e00::,2a04:3e07:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a04:3e40::,2a04:3e47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:3e80::,2a04:3e87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a04:3ec0::,2a04:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:3f00::,2a04:3f07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:3f40::,2a04:3f47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:3f80::,2a04:3f87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:3fc0::,2a04:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4000::,2a04:4007:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:4040::,2a04:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4080::,2a04:4087:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:40c0::,2a04:40c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:4100::,2a04:4107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4140::,2a04:4147:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:4180::,2a04:4187:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:41c0::,2a04:41c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:4200::,2a04:4207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:4240::,2a04:4247:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:4280::,2a04:4287:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:42c0::,2a04:42c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:4300::,2a04:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4340::,2a04:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:4380::,2a04:4387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:43c0::,2a04:43c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a04:4400::,2a04:4407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:4440::,2a04:4447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4480::,2a04:4487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:44c0::,2a04:44c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4500::,2a04:4507:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:4540::,2a04:4547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4580::,2a04:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:45c0::,2a04:45c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:4600::,2a04:4607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4640::,2a04:4647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:4680::,2a04:4687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:46c0::,2a04:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:4700::,2a04:4703:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:4720::,2a04:4723:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:4740::,2a04:4747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:4780::,2a04:4787:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a04:47c0::,2a04:47c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4800::,2a04:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:4840::,2a04:4847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:4880::,2a04:4887:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:48c0::,2a04:48c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:4900::,2a04:4907:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:4940::,2a04:4947:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:4980::,2a04:4987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:49c0::,2a04:49c7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a04:4a00::,2a04:4a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:4a40::,2a04:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4a80::,2a04:4a87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:4ac0::,2a04:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:4b00::,2a04:4b07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4b40::,2a04:4b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:4b80::,2a04:4b87:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:4bc0::,2a04:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:4c40::,2a04:4c47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:4c80::,2a04:4c87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:4cc0::,2a04:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4d00::,2a04:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:4d40::,2a04:4d47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:4d80::,2a04:4d87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:4dc0::,2a04:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:4e00::,2a04:4e07:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a04:4e80::,2a04:4e87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:4f00::,2a04:4f07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:4f40::,2a04:4f47:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a04:4f80::,2a04:4f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:4fc0::,2a04:4fc3:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:4fe0::,2a04:4fe3:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5000::,2a04:5007:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:5040::,2a04:5047:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:50c0::,2a04:50c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5100::,2a04:5107:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:5180::,2a04:5187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:51c0::,2a04:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:5200::,2a04:5207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:5240::,2a04:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5280::,2a04:5287:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:52c0::,2a04:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:5300::,2a04:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5340::,2a04:5347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:53c0::,2a04:53c7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a04:5400::,2a04:5407:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:5440::,2a04:5447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:5480::,2a04:5487:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:54c0::,2a04:54c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:5500::,2a04:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:5540::,2a04:5547:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:5580::,2a04:5587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:55c0::,2a04:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:5600::,2a04:5607:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a04:5640::,2a04:5647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:5680::,2a04:5687:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:56c0::,2a04:56c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:5700::,2a04:5707:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a04:5740::,2a04:5747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5780::,2a04:5787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:57c0::,2a04:57c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:5800::,2a04:5807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:5880::,2a04:5887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:58c0::,2a04:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:5900::,2a04:5907:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a04:5940::,2a04:5947:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:5980::,2a04:5987:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:59c0::,2a04:59c7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a04:5a00::,2a04:5a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5a40::,2a04:5a47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:5a80::,2a04:5a87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a04:5ac0::,2a04:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5b00::,2a04:5b07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:5b40::,2a04:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5bc0::,2a04:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5c00::,2a04:5c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:5c40::,2a04:5c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5c80::,2a04:5c85:3fff:ffff:ffff:ffff:ffff:ffff,CH -2a04:5c85:4000::,2a04:5c85:4fff:ffff:ffff:ffff:ffff:ffff,US -2a04:5c85:5000::,2a04:5c87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:5cc0::,2a04:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5d00::,2a04:5d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:5d40::,2a04:5d47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:5d80::,2a04:5d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5dc0::,2a04:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:5e00::,2a04:5e07:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:5e40::,2a04:5e47:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:5e80::,2a04:5e87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:5ec0::,2a04:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:5f00::,2a04:5f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:5f40::,2a04:5f47:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a04:5f80::,2a04:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:5fc0::,2a04:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:6000::,2a04:6007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:6040::,2a04:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6080::,2a04:6087:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:60c0::,2a04:60c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6100::,2a04:6107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6140::,2a04:6147:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6180::,2a04:6187:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:61c0::,2a04:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:6200::,2a04:6207:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a04:6240::,2a04:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6280::,2a04:6287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:62c0::,2a04:62c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:6300::,2a04:6307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6340::,2a04:6347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:6380::,2a04:6387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:63c0::,2a04:63c7:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:6400::,2a04:6407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6440::,2a04:6447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6480::,2a04:6487:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:64c0::,2a04:64c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6500::,2a04:6507:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a04:6540::,2a04:6547:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:6580::,2a04:6587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:65c0::,2a04:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6600::,2a04:6607:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:6640::,2a04:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:6650::,2a04:6651:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:6680::,2a04:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:66c0::,2a04:66c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6700::,2a04:6707:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a04:6740::,2a04:6747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:6780::,2a04:6787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:67c0::,2a04:67c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:6800::,2a04:6807:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:6840::,2a04:6847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6880::,2a04:6887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:68c0::,2a04:68c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:6900::,2a04:6907:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:6940::,2a04:6947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:69c0::,2a04:69c7:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:6a80::,2a04:6a87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a04:6b00::,2a04:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:6b40::,2a04:6b47:ffff:ffff:ffff:ffff:ffff:ffff,GG -2a04:6b80::,2a04:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:6bc0::,2a04:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:6c00::,2a04:6c07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:6c40::,2a04:6c47:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:6c80::,2a04:6c87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:6cc0::,2a04:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6d00::,2a04:6d07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:6d40::,2a04:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:6d80::,2a04:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a04:6dc0::,2a04:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:6e00::,2a04:6e07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:6e40::,2a04:6e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6e80::,2a04:6e80:1:ffff:ffff:ffff:ffff:ffff,DK -2a04:6e80:2::,2a04:6e80:2:ffff:ffff:ffff:ffff:ffff,GB -2a04:6e80:3::,2a04:6e87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:6ec0::,2a04:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6f00::,2a04:6f07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:6f40::,2a04:6f47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:6f80::,2a04:6f83:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a04:6fa0::,2a04:6fa1:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:6fb0::,2a04:6fb1:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:6fc0::,2a04:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:7000::,2a04:7007:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:7040::,2a04:7047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:7080::,2a04:7087:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a04:70c0::,2a04:70c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:7100::,2a04:7107:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:7140::,2a04:7147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:7180::,2a04:7187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:71c0::,2a04:71c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7200::,2a04:7207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:7240::,2a04:7247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:7280::,2a04:7287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:72c0::,2a04:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:7300::,2a04:7307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:7340::,2a04:7347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:7380::,2a04:7387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:73c0::,2a04:73c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:7400::,2a04:7407:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a04:7440::,2a04:7447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7480::,2a04:7487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:74c0::,2a04:74c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:7500::,2a04:7507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:7580::,2a04:7587:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a04:75c0::,2a04:75c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:7600::,2a04:7607:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:7640::,2a04:7647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:7680::,2a04:7687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:76c0::,2a04:76c7:ff:ffff:ffff:ffff:ffff:ffff,NL -2a04:76c7:100::,2a04:76c7:100:ffff:ffff:ffff:ffff:ffff,US -2a04:76c7:101::,2a04:76c7:1ff:ffff:ffff:ffff:ffff:ffff,NL -2a04:76c7:200::,2a04:76c7:200:ffff:ffff:ffff:ffff:ffff,GB -2a04:76c7:201::,2a04:76c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:7700::,2a04:7707:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:7740::,2a04:7747:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:7780::,2a04:7787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:77c0::,2a04:77c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:7800::,2a04:7807:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:7840::,2a04:7847:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:7880::,2a04:7887:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:78c0::,2a04:78c3:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:78e0::,2a04:78e3:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:7900::,2a04:7907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:7940::,2a04:7947:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:7980::,2a04:7987:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:79c0::,2a04:79c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7a00::,2a04:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7a40::,2a04:7a47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:7a80::,2a04:7a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:7ac0::,2a04:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7b00::,2a04:7b07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:7b40::,2a04:7b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7b80::,2a04:7b87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:7c00::,2a04:7c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:7c40::,2a04:7c47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:7c80::,2a04:7c87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:7cc0::,2a04:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:7d40::,2a04:7d47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:7d80::,2a04:7d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:7dc0::,2a04:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:7e00::,2a04:7e07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:7e40::,2a04:7e47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:7e80::,2a04:7e87:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a04:7ec0::,2a04:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:7f00::,2a04:7f07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:7f40::,2a04:7f47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:7f80::,2a04:7f87:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a04:7fc0::,2a04:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:8000::,2a04:8007:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:8040::,2a04:8047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:8080::,2a04:8087:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:80c0::,2a04:80c7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a04:8100::,2a04:8107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:8140::,2a04:8147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8180::,2a04:8181:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a04:8190::,2a04:8191:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:81a0::,2a04:81a7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:81c0::,2a04:81c7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a04:8200::,2a04:8207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:8240::,2a04:8247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8280::,2a04:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:82c0::,2a04:82c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:8300::,2a04:8307:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a04:8340::,2a04:8347:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:8380::,2a04:8387:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:83c0::,2a04:83c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:8400::,2a04:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8440::,2a04:8447:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:8480::,2a04:8487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:84c0::,2a04:84c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:8500::,2a04:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:8540::,2a04:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:8580::,2a04:8587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:85c0::,2a04:85c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:8600::,2a04:8607:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:8640::,2a04:8647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:8680::,2a04:8687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:86c0::,2a04:86c7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a04:8700::,2a04:8707:ffff:ffff:ffff:ffff:ffff:ffff,MT -2a04:8740::,2a04:8747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:8780::,2a04:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:87c0::,2a04:87c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:8840::,2a04:8847:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:8880::,2a04:8887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:88c0::,2a04:88c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8900::,2a04:8907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:8940::,2a04:8947:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a04:8980::,2a04:8987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:89c0::,2a04:89c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:8a00::,2a04:8a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8a40::,2a04:8a47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8a80::,2a04:8a87:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a04:8ac0::,2a04:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a04:8b00::,2a04:8b07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8b80::,2a04:8b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8bc0::,2a04:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:8c00::,2a04:8c07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8c40::,2a04:8c47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8c80::,2a04:8c87:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a04:8cc0::,2a04:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:8d00::,2a04:8d07:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a04:8d40::,2a04:8d47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:8d80::,2a04:8d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:8dc0::,2a04:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a04:8e00::,2a04:8e07:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a04:8e40::,2a04:8e47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8e80::,2a04:8e81:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8e90::,2a04:8e91:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:8ea0::,2a04:8ea3:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8f00::,2a04:8f07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:8f40::,2a04:8f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:8f80::,2a04:8f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:8fc0::,2a04:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:9000::,2a04:9007:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:9040::,2a04:9047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:9080::,2a04:9087:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a04:90c0::,2a04:90c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:9100::,2a04:9107:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:9140::,2a04:9147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:9180::,2a04:9187:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:91c0::,2a04:91c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:9240::,2a04:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:9280::,2a04:9287:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:92c0::,2a04:92c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9300::,2a04:9307:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:9340::,2a04:9347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9380::,2a04:9387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:93c0::,2a04:93c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:9400::,2a04:9407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:9440::,2a04:9447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:9480::,2a04:9487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:94e0::,2a04:94e3:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9500::,2a04:9507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:9540::,2a04:9547:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:9580::,2a04:9587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:95c0::,2a04:95c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9600::,2a04:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9640::,2a04:9647:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a04:9680::,2a04:9687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:96c0::,2a04:96c7:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a04:9700::,2a04:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9740::,2a04:9747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:9780::,2a04:9787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:97c0::,2a04:97c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:9800::,2a04:9807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:9840::,2a04:9847:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a04:9880::,2a04:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:98c0::,2a04:98c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:9900::,2a04:9907:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:9940::,2a04:9947:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:9980::,2a04:9987:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:99c0::,2a04:99c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:9a00::,2a04:9a07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:9a40::,2a04:9a47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:9a80::,2a04:9a87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:9ac0::,2a04:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:9b00::,2a04:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9b40::,2a04:9b47:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a04:9b80::,2a04:9b87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:9bc0::,2a04:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:9c00::,2a04:9c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:9c40::,2a04:9c47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:9c80::,2a04:9c87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9cc0::,2a04:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a04:9d40::,2a04:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:9d80::,2a04:9d87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:9dc0::,2a04:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:9e00::,2a04:9e07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:9e40::,2a04:9e47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:9e80::,2a04:9e87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:9ec0::,2a04:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:9f00::,2a04:9f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:9f80::,2a04:9f87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:9fc0::,2a04:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a000::,2a04:a007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a040::,2a04:a047:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:a080::,2a04:a087:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:a0c0::,2a04:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a100::,2a04:a107:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:a140::,2a04:a140:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a141::,2a04:a141::ffff:ffff:ffff:ffff:ffff,US -2a04:a141:1::,2a04:a146:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a147::,2a04:a147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:a180::,2a04:a187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a1c0::,2a04:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:a200::,2a04:a207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:a280::,2a04:a287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:a2c0::,2a04:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:a300::,2a04:a307:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:a340::,2a04:a347:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a04:a380::,2a04:a387:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:a3c0::,2a04:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:a400::,2a04:a407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:a440::,2a04:a440:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a450::,2a04:a451:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:a460::,2a04:a461:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:a470::,2a04:a471:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:a480::,2a04:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:a4c0::,2a04:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:a500::,2a04:a507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a540::,2a04:a547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:a580::,2a04:a587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:a600::,2a04:a607:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:a640::,2a04:a647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:a680::,2a04:a687:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:a6c0::,2a04:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:a700::,2a04:a707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a740::,2a04:a747:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:a7c0::,2a04:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a04:a800::,2a04:a807:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:a840::,2a04:a847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:a880::,2a04:a887:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:a8c0::,2a04:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a04:a900::,2a04:a907:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:a940::,2a04:a947:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:a980::,2a04:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a9c0::,2a04:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:aa00::,2a04:aa07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:aa40::,2a04:aa47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:aa80::,2a04:aa87:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:aac0::,2a04:aac7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:ab00::,2a04:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ab40::,2a04:ab47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:ab80::,2a04:ab87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:abc0::,2a04:abc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:ac00::,2a04:ac07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:ac40::,2a04:ac47:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:ac80::,2a04:ac87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:acc0::,2a04:acc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:ad00::,2a04:ad07:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:ad40::,2a04:ad47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:ad80::,2a04:ad80::7fff:ffff:ffff:ffff:ffff,NL -2a04:ad80:0:8000::,2a04:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:adc0::,2a04:adc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:ae00::,2a04:ae3f:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:b000::,2a04:b007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b040::,2a04:b047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:b080::,2a04:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:b0c0::,2a04:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:b100::,2a04:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:b140::,2a04:b147:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:b180::,2a04:b187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:b1c0::,2a04:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:b200::,2a04:b207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:b240::,2a04:b247:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a04:b280::,2a04:b287:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:b2c0::,2a04:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b300::,2a04:b307:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:b340::,2a04:b347:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a04:b380::,2a04:b387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:b3c0::,2a04:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b400::,2a04:b407:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:b440::,2a04:b447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:b480::,2a04:b487:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:b4c0::,2a04:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:b500::,2a04:b507:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:b540::,2a04:b547:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a04:b580::,2a04:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:b5c0::,2a04:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:b600::,2a04:b607:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:b640::,2a04:b647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:b680::,2a04:b687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b6c0::,2a04:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b700::,2a04:b707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:b740::,2a04:b747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:b780::,2a04:b787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b7c0::,2a04:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:b800::,2a04:b807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:b840::,2a04:b847:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:b880::,2a04:b887:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:b8c0::,2a04:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:b900::,2a04:b907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:b940::,2a04:b947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:b980::,2a04:b987:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a04:b9c0::,2a04:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:ba00::,2a04:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ba40::,2a04:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:ba80::,2a04:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:bac0::,2a04:bac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:bb40::,2a04:bb47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:bb80::,2a04:bb87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:bbc0::,2a04:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:bc00::,2a04:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:bc40::,2a04:bc40:1dc0:ffff:ffff:ffff:ffff:ffff,UA -2a04:bc40:1dc1::,2a04:bc40:1dc1:ffff:ffff:ffff:ffff:ffff,NL -2a04:bc40:1dc2::,2a04:bc40:1dc2:ffff:ffff:ffff:ffff:ffff,RU -2a04:bc40:1dc3::,2a04:bc40:1dc3:ffff:ffff:ffff:ffff:ffff,UA -2a04:bc40:1dc4::,2a04:bc40:1dc4:ffff:ffff:ffff:ffff:ffff,RO -2a04:bc40:1dc5::,2a04:bc40:1dc5:ffff:ffff:ffff:ffff:ffff,SE -2a04:bc40:1dc6::,2a04:bc40:1dc6:ffff:ffff:ffff:ffff:ffff,NL -2a04:bc40:1dc7::,2a04:bc40:1dc7:ffff:ffff:ffff:ffff:ffff,DK -2a04:bc40:1dc8::,2a04:bc40:2dc0:ffff:ffff:ffff:ffff:ffff,UA -2a04:bc40:2dc1::,2a04:bc40:2dc1:ffff:ffff:ffff:ffff:ffff,US -2a04:bc40:2dc2::,2a04:bc40:2dc2:ffff:ffff:ffff:ffff:ffff,FR -2a04:bc40:2dc3::,2a04:bc40:2dc3:ffff:ffff:ffff:ffff:ffff,ES -2a04:bc40:2dc4::,2a04:bc47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:bc80::,2a04:bc87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:bcc0::,2a04:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:bd00::,2a04:bd07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:bd40::,2a04:bd47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:bd80::,2a04:bd87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:be00::,2a04:be03:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:be20::,2a04:be23:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:be40::,2a04:be47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:be80::,2a04:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:bec0::,2a04:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:bf00::,2a04:bf07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:bf40::,2a04:bf47:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:bf80::,2a04:bf87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:bfc0::,2a04:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:c000::,2a04:c007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:c040::,2a04:c047:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:c080::,2a04:c087:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:c0c0::,2a04:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:c100::,2a04:c107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c140::,2a04:c147:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:c180::,2a04:c187:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:c1c0::,2a04:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c200::,2a04:c207:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a04:c240::,2a04:c247:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c280::,2a04:c287:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a04:c2c0::,2a04:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:c300::,2a04:c307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:c340::,2a04:c347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:c380::,2a04:c387:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:c3c0::,2a04:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:c400::,2a04:c407:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a04:c440::,2a04:c447:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:c480::,2a04:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:c4c0::,2a04:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:c500::,2a04:c507:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c540::,2a04:c547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c580::,2a04:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:c5c0::,2a04:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a04:c600::,2a04:c607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:c640::,2a04:c647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c680::,2a04:c687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c6c0::,2a04:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:c700::,2a04:c707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c740::,2a04:c747:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:c780::,2a04:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:c7c0::,2a04:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:c800::,2a04:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:c840::,2a04:c847:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:c8c0::,2a04:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:c900::,2a04:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:c940::,2a04:c947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:c980::,2a04:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c9c0::,2a04:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:ca00::,2a04:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ca40::,2a04:ca47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:cac0::,2a04:cac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:cb00::,2a04:cb07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:cb40::,2a04:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:cb80::,2a04:cb87:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:cc00::,2a04:cc07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:cc40::,2a04:cc47:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a04:cc80::,2a04:cc87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:ccc0::,2a04:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:cd00::,2a04:cd07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:cd40::,2a04:cd47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:cd80::,2a04:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:cdc0::,2a04:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:ce00::,2a04:ce07:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a04:ce40::,2a04:ce47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:ce80::,2a04:ce87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:cec0::,2a04:cec7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:cf00::,2a04:cf07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:cf40::,2a04:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:cf80::,2a04:cf87:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:cfc0::,2a04:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:d000::,2a04:d007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:d080::,2a04:d087:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:d0c0::,2a04:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:d100::,2a04:d107:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a04:d140::,2a04:d147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:d180::,2a04:d187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d1c0::,2a04:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a04:d200::,2a04:d207:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:d240::,2a04:d247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:d280::,2a04:d287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:d2c0::,2a04:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:d340::,2a04:d347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:d380::,2a04:d387:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a04:d3c0::,2a04:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:d400::,2a04:d407:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a04:d440::,2a04:d447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d480::,2a04:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:d4c0::,2a04:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d500::,2a04:d507:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a04:d540::,2a04:d547:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:d580::,2a04:d587:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:d5c0::,2a04:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:d600::,2a04:d607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d640::,2a04:d647:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:d680::,2a04:d687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:d6c0::,2a04:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:d700::,2a04:d707:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:d740::,2a04:d747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:d780::,2a04:d787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d7c0::,2a04:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:d800::,2a04:d807:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:d840::,2a04:d847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d880::,2a04:d887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d8c0::,2a04:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:d900::,2a04:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:d940::,2a04:d947:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:d980::,2a04:d987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:d9c0::,2a04:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:da00::,2a04:da07:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:da40::,2a04:da47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:da80::,2a04:da87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:dac0::,2a04:dac7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:db00::,2a04:db07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:db40::,2a04:db47:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a04:db80::,2a04:db87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:dbc0::,2a04:dbc3:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:dbe0::,2a04:dbe3:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a04:dc00::,2a04:dc07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:dc40::,2a04:dc47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:dc80::,2a04:dc87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a04:dcc0::,2a04:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:dd00::,2a04:dd07:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:dd40::,2a04:dd47:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a04:ddc0::,2a04:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:de00::,2a04:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:de40::,2a04:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:de80::,2a04:de87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:dec0::,2a04:dec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:df00::,2a04:df07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a04:df40::,2a04:df47:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a04:df80::,2a04:df87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:dfc0::,2a04:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:e040::,2a04:e047:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a04:e080::,2a04:e087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e100::,2a04:e107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:e140::,2a04:e147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:e180::,2a04:e187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:e1c0::,2a04:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:e200::,2a04:e207:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:e240::,2a04:e247:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:e280::,2a04:e287:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:e2c0::,2a04:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:e300::,2a04:e307:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:e340::,2a04:e347:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:e380::,2a04:e387:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e3c0::,2a04:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a04:e400::,2a04:e407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:e440::,2a04:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:e480::,2a04:e487:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:e4c0:10::,2a04:e4c0:10:ffff:ffff:ffff:ffff:ffff,GB -2a04:e4c0:11::,2a04:e4c0:11:ffff:ffff:ffff:ffff:ffff,DE -2a04:e4c0:12::,2a04:e4c0:12:ffff:ffff:ffff:ffff:ffff,FR -2a04:e4c0:13::,2a04:e4c0:13:ffff:ffff:ffff:ffff:ffff,DK -2a04:e4c0:14::,2a04:e4c0:14:ffff:ffff:ffff:ffff:ffff,RO -2a04:e4c0:15::,2a04:e4c0:15:ffff:ffff:ffff:ffff:ffff,CZ -2a04:e4c0:16::,2a04:e4c0:16:ffff:ffff:ffff:ffff:ffff,PL -2a04:e4c0:20::,2a04:e4c0:20:ffff:ffff:ffff:ffff:ffff,JP -2a04:e4c0:21::,2a04:e4c0:21:ffff:ffff:ffff:ffff:ffff,AU -2a04:e4c0:30::,2a04:e4c0:30:ffff:ffff:ffff:ffff:ffff,ZA -2a04:e4c0:31::,2a04:e4c0:31:ffff:ffff:ffff:ffff:ffff,AE -2a04:e500::,2a04:e507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e540::,2a04:e547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:e580::,2a04:e587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:e5c0::,2a04:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:e600::,2a04:e607:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:e640::,2a04:e647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e680::,2a04:e687:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:e6c0::,2a04:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a04:e700::,2a04:e707:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:e740::,2a04:e747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:e780::,2a04:e787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:e7c0::,2a04:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:e800::,2a04:e807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:e840::,2a04:e847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:e880::,2a04:e887:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:e8c0::,2a04:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:e900::,2a04:e907:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:e940::,2a04:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:e980::,2a04:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:e9c0::,2a04:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ea40::,2a04:ea47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:ea80::,2a04:ea87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a04:eac0::,2a04:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:eb00::,2a04:eb07:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a04:eb40::,2a04:eb47:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a04:eb80::,2a04:eb87:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:ebc0::,2a04:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ec00::,2a04:ec01:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:ec10::,2a04:ec11:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ec20::,2a04:ec23:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a04:ec40::,2a04:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ec80::,2a04:ec87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:ecc0::,2a04:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ed00::,2a04:ed07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ed40::,2a04:ed47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:ed80::,2a04:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:ee00::,2a04:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:ee40::,2a04:ee47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:ee80::,2a04:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:eec0::,2a04:eec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:ef00::,2a04:ef07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:ef40::,2a04:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:ef80::,2a04:ef87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:efc0::,2a04:efc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:f000::,2a04:f007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:f040::,2a04:f047:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a04:f080::,2a04:f087:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:f0c0::,2a04:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a04:f100::,2a04:f107:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:f140::,2a04:f147:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a04:f180::,2a04:f187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:f1c0::,2a04:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:f200::,2a04:f207:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:f240::,2a04:f247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:f280::,2a04:f287:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a04:f2c0::,2a04:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a04:f300::,2a04:f300:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f310::,2a04:f311:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:f320::,2a04:f323:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a04:f340::,2a04:f347:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a04:f380::,2a04:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f3c0::,2a04:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:f440::,2a04:f447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:f480::,2a04:f487:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a04:f4c0::,2a04:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:f500::,2a04:f507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:f540::,2a04:f547:ffff:ffff:ffff:ffff:ffff:ffff,US -2a04:f580::,2a04:f587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:f5c0::,2a04:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:f600::,2a04:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a04:f640:1::,2a04:f640:1:7fff:ffff:ffff:ffff:ffff,GB -2a04:f680::,2a04:f687:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:f6c0::,2a04:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:f700::,2a04:f707:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a04:f740::,2a04:f747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f780::,2a04:f787:ffff:ffff:ffff:ffff:ffff:ffff,IN -2a04:f7c0::,2a04:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f800::,2a04:f807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:f840::,2a04:f847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f880::,2a04:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:f8c0::,2a04:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:f900::,2a04:f907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:f940::,2a04:f947:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:f980::,2a04:f987:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:f9c0::,2a04:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:fa00::,2a04:fa07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:fa40::,2a04:fa47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:fa80::,2a04:fa87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:fb00::,2a04:fb07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:fb40::,2a04:fb47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:fb80::,2a04:fb87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:fbc0::,2a04:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:fc00::,2a04:fc07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:fc40::,2a04:fc47:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a04:fc80::,2a04:fc87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:fcc0::,2a04:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:fd00::,2a04:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:fd40::,2a04:fd47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:fd80::,2a04:fd87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:fdc0::,2a04:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:fe40::,2a04:fe47:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a04:fe80::,2a04:fe87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:fec0::,2a04:fec0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a04:fee0::,2a04:fee3:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a04:ff00::,2a04:ff07:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a04:ff40::,2a04:ff47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:ff80::,2a04:ff87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a04:ffc0::,2a04:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05::,2a05:7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:40::,2a05:47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:80::,2a05:87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:c0::,2a05:c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:100::,2a05:107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:140::,2a05:147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:1c0::,2a05:1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:200::,2a05:207:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:240::,2a05:247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2c0::,2a05:2c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:300::,2a05:307:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:340::,2a05:347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:380::,2a05:387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3c0::,2a05:3c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:400::,2a05:407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:440::,2a05:447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:480::,2a05:487:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:4c0::,2a05:4c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:500::,2a05:507:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:540::,2a05:547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:580::,2a05:587:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a05:5c0::,2a05:5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:640::,2a05:647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:680::,2a05:687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:6c0::,2a05:6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:700::,2a05:707:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a05:740::,2a05:747:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:780::,2a05:787:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:7c0::,2a05:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:800::,2a05:807:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:840::,2a05:843:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:860::,2a05:863:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:880::,2a05:887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8c0::,2a05:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:900::,2a05:907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:940::,2a05:947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:980::,2a05:987:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a05:9c0::,2a05:9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:a00::,2a05:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:a40::,2a05:a47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:a80::,2a05:a87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:ac0::,2a05:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:b00::,2a05:b07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:b40::,2a05:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:b80::,2a05:b87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:bc0::,2a05:bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:c00::,2a05:c07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:c80::,2a05:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:cc0::,2a05:cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d00::,2a05:d07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:d40::,2a05:d47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d80::,2a05:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:dc0::,2a05:dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e00::,2a05:e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:e40::,2a05:e47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:e80::,2a05:e87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:ec0::,2a05:ec7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:f00::,2a05:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:f40::,2a05:f47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f80::,2a05:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1000::,2a05:1007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:1040::,2a05:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:10c0::,2a05:10c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:1100::,2a05:1107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:1140::,2a05:1147:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:1180::,2a05:1187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:11c0::,2a05:11c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1200::,2a05:1203:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:1220::,2a05:1223:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:1240::,2a05:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:1280::,2a05:1287:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:12c0::,2a05:12c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:1300::,2a05:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1340::,2a05:1347:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:13c0::,2a05:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1400::,2a05:1407:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:1440::,2a05:1447:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:1480::,2a05:1487:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:14c0::,2a05:14c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:1500::,2a05:1507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:1540::,2a05:1547:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:1580::,2a05:1587:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a05:15c0::,2a05:15c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:1600::,2a05:1607:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a05:1640::,2a05:1647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:1680::,2a05:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:16c0::,2a05:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:1700::,2a05:1707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:1740::,2a05:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:17c0::,2a05:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:1800::,2a05:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:1840::,2a05:1847:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a05:1880::,2a05:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:18c0::,2a05:18c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:1900::,2a05:1907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:1940::,2a05:1947:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:1980::,2a05:1987:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:19c0::,2a05:19c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:1a00::,2a05:1a3f:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:1c00::,2a05:1c07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:1c40::,2a05:1c47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:1c80::,2a05:1c87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1cc0::,2a05:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a05:1d00::,2a05:1d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1d40::,2a05:1d43:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:1d80::,2a05:1d87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:1dc0::,2a05:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:1e00::,2a05:1e07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:1e40::,2a05:1e47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:1e80::,2a05:1e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:1ec0::,2a05:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:1f00::,2a05:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:1f40::,2a05:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:1f80::,2a05:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a05:1fc0::,2a05:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:2000::,2a05:2007:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:2040::,2a05:2047:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:2080::,2a05:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:20c0::,2a05:20c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2100::,2a05:2107:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:2140::,2a05:2147:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a05:2180::,2a05:2187:ffff:ffff:ffff:ffff:ffff:ffff,TM -2a05:21c0::,2a05:21c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:2200::,2a05:2207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2240::,2a05:2247:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:2280::,2a05:2287:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a05:22c0::,2a05:22c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2300::,2a05:2307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2340::,2a05:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2380::,2a05:2387:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:23c0::,2a05:23c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:2400::,2a05:2407:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:2440::,2a05:2447:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:2480::,2a05:2487:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a05:24c0::,2a05:24c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2500::,2a05:2507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2540::,2a05:2547:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:2580::,2a05:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:25c0::,2a05:25c7:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a05:2600::,2a05:2607:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:2640::,2a05:2647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:2680::,2a05:2687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:26c0::,2a05:26c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2700::,2a05:2707:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:2740::,2a05:2747:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:2780::,2a05:2787:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:2800::,2a05:2807:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:2840::,2a05:2847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:2880::,2a05:2887:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:28c0::,2a05:28c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:2900::,2a05:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2940::,2a05:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:2980::,2a05:2987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:29c0::,2a05:29c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:2a00::,2a05:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2a40::,2a05:2a47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:2a80::,2a05:2a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2ac0::,2a05:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:2b00::,2a05:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2b40::,2a05:2b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2bc0::,2a05:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2c00::,2a05:2c03:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:2c20::,2a05:2c23:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:2c40::,2a05:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2c80::,2a05:2c87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:2cc0::,2a05:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2d00::,2a05:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:2d01::,2a05:2d01::ffff:ffff:ffff:ffff:ffff,US -2a05:2d01:1::,2a05:2d01:2016:ffff:ffff:ffff:ffff:ffff,NL -2a05:2d01:2017::,2a05:2d01:2017:7fff:ffff:ffff:ffff:ffff,NO -2a05:2d01:2017:8000::,2a05:2d01:8fff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2d01:9000::,2a05:2d01:9000:ffff:ffff:ffff:ffff:ffff,GB -2a05:2d01:9001::,2a05:2d06:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:2d07::,2a05:2d07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:2d40::,2a05:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:2d80::,2a05:2d87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a05:2dc0::,2a05:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:2e40::,2a05:2e47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:2e80::,2a05:2e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2ec0::,2a05:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:2f00::,2a05:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:2f40::,2a05:2f47:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a05:2f80::,2a05:2f87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:2fc0::,2a05:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3000::,2a05:3007:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:3040::,2a05:3047:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:3080::,2a05:3087:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05:30c0::,2a05:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3140::,2a05:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:3180::,2a05:3187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:31c0::,2a05:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:3200::,2a05:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:3240::,2a05:3247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3280::,2a05:3287:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a05:32c0::,2a05:32c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3300::,2a05:3307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:3340::,2a05:3347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:3380::,2a05:3387:ffff:ffff:ffff:ffff:ffff:ffff,YE -2a05:33c0::,2a05:33c7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a05:3400::,2a05:3407:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:3440::,2a05:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:3480::,2a05:3487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:34c0::,2a05:34c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:3500::,2a05:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:3540::,2a05:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:3580::,2a05:3587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:35c0::,2a05:35c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:3600::,2a05:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:3640::,2a05:3647:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:3680::,2a05:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:36c0::,2a05:36c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:3700::,2a05:3707:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:3740::,2a05:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:37c0::,2a05:37c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:3800::,2a05:3807:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:3840::,2a05:3847:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:3880::,2a05:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:38c0::,2a05:38c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:3900::,2a05:3907:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:3940::,2a05:3941:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:3950::,2a05:3951:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:3980::,2a05:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:39c0::,2a05:39c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:3a00::,2a05:3a07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:3a40::,2a05:3a47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:3a80::,2a05:3a87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:3ac0::,2a05:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a05:3b00::,2a05:3b07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a05:3b40::,2a05:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:3b80::,2a05:3b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:3bc0::,2a05:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3c00::,2a05:3c07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:3c40::,2a05:3c47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:3c80::,2a05:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:3d00::,2a05:3d07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:3d80::,2a05:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:3dc0::,2a05:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:3e00::,2a05:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:3e40::,2a05:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:3e80::,2a05:3e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:3ec0::,2a05:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:3f00::,2a05:3f07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:3f40::,2a05:3f47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:3f80::,2a05:3f87:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a05:3fc0::,2a05:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:4000::,2a05:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4040::,2a05:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4080::,2a05:4087:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a05:40c0::,2a05:40c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:4100::,2a05:4107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:4180::,2a05:4187:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:41c0::,2a05:41c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:4200::,2a05:4207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4240::,2a05:4247:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:4280::,2a05:4287:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a05:42c0::,2a05:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:4300::,2a05:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4340::,2a05:4347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:43c0::,2a05:43c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:4400::,2a05:4407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:4440::,2a05:4447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:4480::,2a05:4487:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:44c0::,2a05:44c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:4500::,2a05:4507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:4540::,2a05:4547:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:4580::,2a05:4587:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:45c0::,2a05:45c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a05:4600::,2a05:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:4640::,2a05:4647:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:4680::,2a05:4687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:46c0::,2a05:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:4700::,2a05:4707:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:4740::,2a05:4747:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:4780::,2a05:4787:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:47c0::,2a05:47c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:4800::,2a05:4807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:4840::,2a05:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:4880::,2a05:4887:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:48c0::,2a05:48c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:4900::,2a05:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:4940::,2a05:4947:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a05:4980::,2a05:4987:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a05:49c0::,2a05:49c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:4a00::,2a05:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:4a40::,2a05:4a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:4ac0::,2a05:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:4b00::,2a05:4b07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:4b80::,2a05:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4bc0::,2a05:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4c00::,2a05:4c07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:4c40::,2a05:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:4c80::,2a05:4c87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:4cc0::,2a05:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:4d00::,2a05:4d07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:4d40::,2a05:4d47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:4d80::,2a05:4d87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:4dc0::,2a05:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:4e00::,2a05:4e07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:4e40::,2a05:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:4e80::,2a05:4e87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:4ec0::,2a05:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:4f00::,2a05:4f07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:4f40::,2a05:4f47:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a05:4fc0::,2a05:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5000::,2a05:5007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5040::,2a05:5047:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:5080::,2a05:5080:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:50a0::,2a05:50a3:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:50c0::,2a05:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:5100::,2a05:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5140::,2a05:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:5180::,2a05:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:51c0::,2a05:51c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:5200::,2a05:5207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5240::,2a05:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5280::,2a05:5283:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:52a0::,2a05:52a3:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:52c0::,2a05:52c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5300::,2a05:5307:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:5340::,2a05:5347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:5380::,2a05:5387:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:53c0::,2a05:53c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5400::,2a05:5407:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:5440::,2a05:5447:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:5480::,2a05:5487:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:54c0::,2a05:54c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5500::,2a05:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:5540::,2a05:5547:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a05:5580::,2a05:5587:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:55c0::,2a05:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:5600::,2a05:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5640::,2a05:5647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5680::,2a05:5687:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:56c0::,2a05:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5700::,2a05:5707:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:5740::,2a05:5747:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:5780::,2a05:5787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:57c0::,2a05:57c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5800::,2a05:5807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5840::,2a05:5847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5880::,2a05:5887:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:58c0::,2a05:58c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5900::,2a05:5907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5940::,2a05:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5980::,2a05:5987:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:59c0::,2a05:59c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5a00::,2a05:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5a40::,2a05:5a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5a80::,2a05:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5ac0::,2a05:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:5b00::,2a05:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5b40::,2a05:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:5b80::,2a05:5b87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:5bc0::,2a05:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a05:5c00::,2a05:5c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:5c40::,2a05:5c47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5c80::,2a05:5c87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:5cc0::,2a05:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:5d00::,2a05:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5d40::,2a05:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:5d80::,2a05:5d87:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a05:5dc0::,2a05:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:5e00::,2a05:5e07:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a05:5e40::,2a05:5e47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:5e80::,2a05:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:5ec0::,2a05:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:5f00::,2a05:5f07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:5f40::,2a05:5f47:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:5f80::,2a05:5f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:5fc0::,2a05:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:6000::,2a05:6007:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a05:6040::,2a05:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6080::,2a05:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:60c0::,2a05:60c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:6100::,2a05:6107:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:6140::,2a05:6147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6180::,2a05:6187:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:61c0::,2a05:61c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:6200::,2a05:6207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:6240::,2a05:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:6280::,2a05:6287:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a05:62c0::,2a05:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:6300::,2a05:6307:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a05:6340::,2a05:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:6380::,2a05:6387:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:63c0::,2a05:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6400::,2a05:6407:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:6440::,2a05:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:6480::,2a05:6487:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:64c0::,2a05:64c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:6500::,2a05:6507:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:6540::,2a05:6547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6580::,2a05:6587:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:65c0::,2a05:65c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:6600::,2a05:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:6640::,2a05:6647:ffff:ffff:ffff:ffff:ffff:ffff,VA -2a05:6680::,2a05:6687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:6700::,2a05:6707:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:6740::,2a05:6747:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:6780::,2a05:6787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:67c0::,2a05:67c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:6800::,2a05:6807:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:6840::,2a05:6847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6880::,2a05:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:68c0::,2a05:68c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:6900::,2a05:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6940::,2a05:6947:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:6980::,2a05:6987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:69c0::,2a05:69c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6a00::,2a05:6a07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:6a40::,2a05:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6a80::,2a05:6a87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:6ac0::,2a05:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:6b00::,2a05:6b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6b40::,2a05:6b47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:6b80::,2a05:6b87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:6bc0::,2a05:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:6c00::,2a05:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6c40::,2a05:6c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6c80::,2a05:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:6cc0::,2a05:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:6d40::,2a05:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:6d80::,2a05:6d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6dc0::,2a05:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:6e00::,2a05:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:6e40::,2a05:6e47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:6e80::,2a05:6e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:6ec0::,2a05:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:6f00::,2a05:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a05:6f40::,2a05:6f47:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a05:6f80::,2a05:6f87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:6fc0::,2a05:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:7000::,2a05:7007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:7040::,2a05:7047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7080::,2a05:7087:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:70c0::,2a05:70c7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a05:7100::,2a05:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:7140::,2a05:7147:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a05:7180::,2a05:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7200::,2a05:7207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:7240::,2a05:7247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7280::,2a05:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:72c0::,2a05:72c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7340::,2a05:7347:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a05:7380::,2a05:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:73c0::,2a05:73c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:7400::,2a05:7407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:7440::,2a05:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:7480::,2a05:7487:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:74c0::,2a05:74c7:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a05:7500::,2a05:7507:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a05:7540::,2a05:7547:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:7580::,2a05:7587:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:75c0::,2a05:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7600::,2a05:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7640::,2a05:7647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:7680::,2a05:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:76c0::,2a05:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7700::,2a05:7707:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:7740::,2a05:7747:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a05:7780::,2a05:7787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:77c0::,2a05:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:7800::,2a05:7807:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:7840::,2a05:7847:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a05:78c0::,2a05:78c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a05:7900::,2a05:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:7940::,2a05:7947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7980::,2a05:7987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:79c0::,2a05:79c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:7a00::,2a05:7a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:7a40::,2a05:7a47:ffff:ffff:ffff:ffff:ffff:ffff,YE -2a05:7a80::,2a05:7a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7ac0::,2a05:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7b00::,2a05:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:7b40::,2a05:7b47:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a05:7b80::,2a05:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7bc0::,2a05:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7c00::,2a05:7c07:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a05:7c40::,2a05:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a05:7c80::,2a05:7c87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7cc0::,2a05:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a05:7d00::,2a05:7d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:7d40::,2a05:7d47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:7d80::,2a05:7d87:ffff:ffff:ffff:ffff:ffff:ffff,YE -2a05:7dc0::,2a05:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7de0::,2a05:7de3:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:7e00::,2a05:7e07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:7e40::,2a05:7e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:7e80::,2a05:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:7ec0::,2a05:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:7f00::,2a05:7f07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:7f40::,2a05:7f47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:7f80::,2a05:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8000::,2a05:8007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:8040::,2a05:8047:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:8080::,2a05:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:80c0::,2a05:80c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8100::,2a05:8107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8140::,2a05:8147:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:8180::,2a05:8187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:81c0::,2a05:81c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:8200::,2a05:8207:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a05:8240::,2a05:8247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8280::,2a05:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:82c0::,2a05:82c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a05:8300::,2a05:8307:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a05:8340::,2a05:8347:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a05:8380::,2a05:8387:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:83c0::,2a05:83c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:8400::,2a05:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:8440::,2a05:8447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8480::,2a05:8487:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05:84c0::,2a05:84c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:8500::,2a05:8507:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a05:8540::,2a05:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:8580::,2a05:8587:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:85c0::,2a05:85c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:8600::,2a05:8607:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:8640::,2a05:8647:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:86c0::,2a05:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a05:8700::,2a05:8707:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a05:8740::,2a05:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:8780::,2a05:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:87c0::,2a05:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8800::,2a05:8807:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:8840::,2a05:8847:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:8880::,2a05:8883:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:88a0::,2a05:88a3:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:88c0::,2a05:88c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:8900::,2a05:8907:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:8940::,2a05:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8980::,2a05:8987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:89c0::,2a05:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8a00::,2a05:8a07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:8a40::,2a05:8a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8a80::,2a05:8a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8ac0::,2a05:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:8b00::,2a05:8b07:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:8b40::,2a05:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a05:8b80::,2a05:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8c00::,2a05:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a05:8c40::,2a05:8c47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:8c80::,2a05:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:8cc0::,2a05:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:8d00::,2a05:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8d40::,2a05:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a05:8d80::,2a05:8d87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:8dc0::,2a05:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8e00::,2a05:8e07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:8e40::,2a05:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:8e80::,2a05:8e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:8ec0::,2a05:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:8f00::,2a05:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:8f40::,2a05:8f47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:8f80::,2a05:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:8fc0::,2a05:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a05:9000::,2a05:9007:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a05:9040::,2a05:9047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:9080::,2a05:9087:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:90c0::,2a05:90c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:9100::,2a05:9107:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:9140::,2a05:9147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:9180::,2a05:9187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:91c0::,2a05:91c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:9200::,2a05:9207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:9240::,2a05:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9280::,2a05:9287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:92c0::,2a05:92c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:9340::,2a05:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:93c0::,2a05:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:9400::,2a05:9407:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:9440::,2a05:9447:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:94c0::,2a05:94c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9500::,2a05:9507:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:9540::,2a05:9547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:9580::,2a05:9587:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05:95c0::,2a05:95c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:9600::,2a05:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:9680::,2a05:9687:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:96c0::,2a05:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:9700::,2a05:9707:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:9740::,2a05:9747:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:9780::,2a05:9787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:97c0::,2a05:97c7:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a05:9800::,2a05:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:9840::,2a05:9847:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:9880::,2a05:9887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:98c0::,2a05:98c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:9900::,2a05:9907:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a05:9940::,2a05:9947:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9980::,2a05:9987:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:99c0::,2a05:99c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9a00::,2a05:9a07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9a80::,2a05:9a87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:9ac0::,2a05:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:9b00::,2a05:9b07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:9b40::,2a05:9b47:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a05:9b80::,2a05:9b87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:9bc0::,2a05:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:9c40::,2a05:9c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:9c80::,2a05:9c87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a05:9cc0::,2a05:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:9d00::,2a05:9d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:9d40::,2a05:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:9d80::,2a05:9d87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9dc0::,2a05:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:9e00::,2a05:9e07:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a05:9e40::,2a05:9e47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:9e80::,2a05:9e87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:9ec0::,2a05:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:9f00::,2a05:9f07:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:9f80::,2a05:9f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:9fc0::,2a05:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:a000::,2a05:a007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a040::,2a05:a047:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:a080::,2a05:a087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a0c0::,2a05:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:a100::,2a05:a107:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a05:a140::,2a05:a147:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:a180::,2a05:a187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:a1c0::,2a05:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:a200::,2a05:a207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a240::,2a05:a247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:a280::,2a05:a287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:a2c0::,2a05:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a05:a300::,2a05:a307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:a340::,2a05:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:a380::,2a05:a387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:a3c0::,2a05:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:a400::,2a05:a407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a440::,2a05:a447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:a480::,2a05:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:a4c0::,2a05:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:a500::,2a05:a507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:a540::,2a05:a547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:a580::,2a05:a587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:a5c0::,2a05:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a05:a600::,2a05:a607:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:a640::,2a05:a647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:a680::,2a05:a687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a6c0::,2a05:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:a700::,2a05:a707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a740::,2a05:a747:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:a780::,2a05:a787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:a7c0::,2a05:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:a800::,2a05:a807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:a840::,2a05:a847:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:a880::,2a05:a887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:a8c0::,2a05:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a05:a900::,2a05:a907:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:a940::,2a05:a947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:a980::,2a05:a987:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:aa00::,2a05:aa07:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a05:aa40::,2a05:aa47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:aa80::,2a05:aa87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:aac0::,2a05:aac7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:ab00::,2a05:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:ab40::,2a05:ab47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:ab80::,2a05:ab87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:abc0::,2a05:abc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:ac00::,2a05:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:ac40::,2a05:ac47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:ac80::,2a05:ac87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:acc0::,2a05:acc7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a05:ad00::,2a05:ad07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:ad40::,2a05:ad47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:ad80::,2a05:ad87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:adc0::,2a05:adc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:ae00::,2a05:ae07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:ae40::,2a05:ae47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:ae80::,2a05:ae87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:aec0::,2a05:aec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:af00::,2a05:af07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:af40::,2a05:af47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:afc0::,2a05:afc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b000::,2a05:b007:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:b040::,2a05:b047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:b080::,2a05:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:b0c0::,2a05:b0c6:1ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b0c6:200::,2a05:b0c6:2ff:ffff:ffff:ffff:ffff:ffff,US -2a05:b0c6:300::,2a05:b0c6:4ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b0c6:500::,2a05:b0c6:5ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:b0c6:600::,2a05:b0c6:6ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b0c6:700::,2a05:b0c6:7ff:ffff:ffff:ffff:ffff:ffff,AT -2a05:b0c6:800::,2a05:b0c6:13ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b0c6:1400::,2a05:b0c6:14ff:ffff:ffff:ffff:ffff:ffff,AT -2a05:b0c6:1500::,2a05:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b100::,2a05:b107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b140::,2a05:b147:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b180::,2a05:b187:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a05:b200::,2a05:b207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:b240::,2a05:b247:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:b280::,2a05:b287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b2c0::,2a05:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b300::,2a05:b307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b340::,2a05:b347:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:b380::,2a05:b387:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b3c0::,2a05:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b440::,2a05:b447:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b480::,2a05:b487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:b4c0::,2a05:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a05:b500::,2a05:b507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b540::,2a05:b547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:b580::,2a05:b587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:b5c0::,2a05:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:b600::,2a05:b607:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a05:b640::,2a05:b647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b680::,2a05:b687:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:b700::,2a05:b707:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b740::,2a05:b747:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:b780::,2a05:b787:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:b7c0::,2a05:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:b800::,2a05:b807:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:b840::,2a05:b847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:b880::,2a05:b887:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:b8c0::,2a05:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:b900::,2a05:b907:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:b940::,2a05:b947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:b980::,2a05:b987:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:b9c0::,2a05:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:ba00::,2a05:ba07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:ba40::,2a05:ba47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:ba80::,2a05:ba87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:bac0::,2a05:bac7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:bb00::,2a05:bb07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:bb40::,2a05:bb47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:bb80::,2a05:bb87:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a05:bbc0::,2a05:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:bc00::,2a05:bc07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:bcc0::,2a05:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:bd00::,2a05:bd07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:bd40::,2a05:bd47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:bd80::,2a05:bd87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:bdc0::,2a05:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:be00::,2a05:be07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:be40::,2a05:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:bec0::,2a05:bec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:bf00::,2a05:bf07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:bf40::,2a05:bf47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:bf80::,2a05:bf87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:bfc0::,2a05:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:c040::,2a05:c047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:c080::,2a05:c087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:c0c0::,2a05:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:c100::,2a05:c107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:c140::,2a05:c147:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:c180::,2a05:c187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:c200::,2a05:c207:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:c280::,2a05:c287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:c2c0::,2a05:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:c300::,2a05:c307:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:c340::,2a05:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:c380::,2a05:c387:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:c3c0::,2a05:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:c480::,2a05:c487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:c4c0::,2a05:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:c500::,2a05:c507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:c540::,2a05:c547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:c580::,2a05:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:c5c0::,2a05:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:c600::,2a05:c607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:c640::,2a05:c647:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:c680::,2a05:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:c6c0::,2a05:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:c700::,2a05:c707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:c740::,2a05:c747:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:c7c0::,2a05:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:c800::,2a05:c807:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:c840::,2a05:c847:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a05:c880::,2a05:c887:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a05:c8c0::,2a05:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:c900::,2a05:c907:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:c940::,2a05:c947:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:c980::,2a05:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:c9c0::,2a05:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:ca00::,2a05:ca07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:ca40::,2a05:ca47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:ca80::,2a05:ca87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:cac0::,2a05:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:cb00::,2a05:cb07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:cb40::,2a05:cb47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:cb80::,2a05:cb87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:cbc0::,2a05:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:cc00::,2a05:cc07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:cc40::,2a05:cc47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:cc80::,2a05:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:ccc0::,2a05:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:cd00::,2a05:cd07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:cd80::,2a05:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:cdc0::,2a05:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:ce00::,2a05:ce07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:ce40::,2a05:ce47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a05:ce80::,2a05:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:cec0::,2a05:cec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:cf00::,2a05:cf07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:cf40::,2a05:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:cf80::,2a05:cf87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:cfc0::,2a05:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:d000::,2a05:d000:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d000:2000::,2a05:d000:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d000:2100::,2a05:d000:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d000:4000::,2a05:d000:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d000:4100::,2a05:d000:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d000:c000::,2a05:d000:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d000:c100::,2a05:d011:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d012::,2a05:d012:fff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d012:1000::,2a05:d013:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d014::,2a05:d014:fff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d014:1000::,2a05:d01b:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d01c::,2a05:d01c:fff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d01c:1000::,2a05:d050:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d050:2000::,2a05:d050:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d050:2100::,2a05:d050:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d050:4000::,2a05:d050:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d050:4100::,2a05:d050:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d050:c000::,2a05:d050:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d050:c100::,2a05:d078:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d078:2000::,2a05:d078:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d078:2100::,2a05:d078:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d078:4000::,2a05:d078:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d078:4100::,2a05:d078:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d078:c000::,2a05:d078:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d078:c100::,2a05:d079:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d079:2000::,2a05:d079:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d079:2100::,2a05:d079:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d079:4000::,2a05:d079:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d079:4100::,2a05:d079:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d079:c000::,2a05:d079:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d079:c100::,2a05:d07a:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07a:2000::,2a05:d07a:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d07a:2100::,2a05:d07a:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07a:4000::,2a05:d07a:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d07a:4100::,2a05:d07a:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07a:c000::,2a05:d07a:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d07a:c100::,2a05:d07c:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07c:2000::,2a05:d07c:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d07c:2100::,2a05:d07c:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07c:4000::,2a05:d07c:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d07c:4100::,2a05:d07c:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07c:c000::,2a05:d07c:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d07c:c100::,2a05:d07e:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07e:2000::,2a05:d07e:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d07e:2100::,2a05:d07e:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07e:4000::,2a05:d07e:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d07e:4100::,2a05:d07e:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07e:c000::,2a05:d07e:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d07e:c100::,2a05:d07f:1fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07f:2000::,2a05:d07f:20ff:ffff:ffff:ffff:ffff:ffff,FR -2a05:d07f:2100::,2a05:d07f:3fff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07f:4000::,2a05:d07f:40ff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d07f:4100::,2a05:d07f:bfff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d07f:c000::,2a05:d07f:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d07f:c100::,2a05:d07f:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:d400::,2a05:d407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:d440::,2a05:d447:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:d480::,2a05:d487:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:d4c0::,2a05:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d500::,2a05:d507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d540::,2a05:d547:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:d580::,2a05:d587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d5c0::,2a05:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a05:d600::,2a05:d607:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:d640::,2a05:d647:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:d680::,2a05:d687:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:d6c0::,2a05:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:d740::,2a05:d747:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:d780::,2a05:d787:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a05:d7c0::,2a05:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a05:d800::,2a05:d807:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a05:d840::,2a05:d847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d880::,2a05:d887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d900::,2a05:d907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:d940::,2a05:d947:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:d980::,2a05:d987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:d9c0::,2a05:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:da00::,2a05:da07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:da40::,2a05:da47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:da80::,2a05:da87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:dac0::,2a05:dac7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:db00::,2a05:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:db40::,2a05:db47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:db80::,2a05:db87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:dbc0::,2a05:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a05:dc00::,2a05:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:dc40::,2a05:dc47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:dc80::,2a05:dc87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:dcc0::,2a05:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:dd00::,2a05:dd07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:dd40::,2a05:dd47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:dd80::,2a05:dd87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:ddc0::,2a05:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:de00::,2a05:de07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:de40::,2a05:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:de80::,2a05:de87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:dec0::,2a05:dec7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a05:df00::,2a05:df07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:df40::,2a05:df47:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a05:df80::,2a05:df87:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05:dfc0::,2a05:dfc0:1ee3:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc0:1ee4::,2a05:dfc0:1ee4:ffff:ffff:ffff:ffff:ffff,CA -2a05:dfc0:1ee5::,2a05:dfc0:6938:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc0:6939::,2a05:dfc0:6939:ffff:ffff:ffff:ffff:ffff,NL -2a05:dfc0:693a::,2a05:dfc7:4:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:5::,2a05:dfc7:5:ffff:ffff:ffff:ffff:ffff,AQ -2a05:dfc7:6::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:8::,2a05:dfc7:8:7fff:ffff:ffff:ffff:ffff,SG -2a05:dfc7:8:8000::,2a05:dfc7:f:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:10::,2a05:dfc7:10:ffff:ffff:ffff:ffff:ffff,NL -2a05:dfc7:11::,2a05:dfc7:19:ffff:ffff:ffff:ffff:ffff,CH -2a05:dfc7:1a::,2a05:dfc7:1a::,AT -2a05:dfc7:1a::1,2a05:dfc7:1f:ffff:ffff:ffff:ffff:ffff,CH -2a05:dfc7:20::,2a05:dfc7:2f:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:30::,2a05:dfc7:30:ffff:ffff:ffff:ffff:ffff,US -2a05:dfc7:31::,2a05:dfc7:3f:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:40::,2a05:dfc7:40:ffff:ffff:ffff:ffff:ffff,BY -2a05:dfc7:41::,2a05:dfc7:5352:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:5353::,2a05:dfc7:5353:ffff:ffff:ffff:ffff:ffff,AQ -2a05:dfc7:5354::,2a05:dfc7:beee:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:beef::,2a05:dfc7:beef:ffff:ffff:ffff:ffff:ffff,AQ -2a05:dfc7:bef0::,2a05:dfc7:dfc6:ffff:ffff:ffff:ffff:ffff,GB -2a05:dfc7:dfc7::,2a05:dfc7:dfc7:ffff:ffff:ffff:ffff:ffff,UA -2a05:dfc7:dfc8::,2a05:dfc7:dfc8:ffff:ffff:ffff:ffff:ffff,US -2a05:dfc7:dfc9::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:e000::,2a05:e007:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:e040::,2a05:e047:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a05:e080::,2a05:e087:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:e0c0::,2a05:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e100::,2a05:e107:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:e140::,2a05:e147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e180::,2a05:e187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e1c0::,2a05:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:e200::,2a05:e207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:e240::,2a05:e247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:e280::,2a05:e287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e2c0::,2a05:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e300::,2a05:e307:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a05:e340::,2a05:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:e380::,2a05:e387:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:e3c0::,2a05:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:e400::,2a05:e407:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e440::,2a05:e447:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:e480::,2a05:e487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:e4c0::,2a05:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:e500::,2a05:e507:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a05:e540::,2a05:e547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:e580::,2a05:e587:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:e5c0::,2a05:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:e640::,2a05:e647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:e680::,2a05:e687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:e6c0::,2a05:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e700::,2a05:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e740::,2a05:e747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e780::,2a05:e787:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:e7c0::,2a05:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:e800::,2a05:e807:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a05:e840::,2a05:e847:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:e880::,2a05:e887:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:e8c0::,2a05:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e940::,2a05:e947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:e980::,2a05:e987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:e9c0::,2a05:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:ea00::,2a05:ea07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:ea40::,2a05:ea47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:ea80::,2a05:ea87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:eb20::,2a05:eb23:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:eb40::,2a05:eb47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a05:eb80::,2a05:eb87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:ebc0::,2a05:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:ec00::,2a05:ec07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:ec40::,2a05:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:ec80::,2a05:ec87:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a05:ecc0::,2a05:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:ed00::,2a05:ed07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:ed40::,2a05:ed47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:ed80::,2a05:ed87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:edc0::,2a05:edc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:ee00::,2a05:ee07:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a05:ee40::,2a05:ee47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:ee80::,2a05:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:ef00::,2a05:ef07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:ef40::,2a05:ef47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:ef80::,2a05:ef87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:efc0::,2a05:efc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a05:f000::,2a05:f007:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:f040::,2a05:f047:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a05:f080::,2a05:f087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:f0c0::,2a05:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:f100::,2a05:f107:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:f140::,2a05:f147:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a05:f180::,2a05:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f1c0::,2a05:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:f200::,2a05:f207:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a05:f240::,2a05:f247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:f280::,2a05:f287:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:f2c0::,2a05:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:f300::,2a05:f307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:f340::,2a05:f347:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:f380::,2a05:f387:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:f3c0::,2a05:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:f400::,2a05:f407:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:f440::,2a05:f447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f480::,2a05:f487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f4c0::,2a05:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a05:f500::,2a05:f507:1:ffff:ffff:ffff:ffff:ffff,IE -2a05:f507:2::,2a05:f507:2:7fff:ffff:ffff:ffff:ffff,DE -2a05:f507:2:8000::,2a05:f507:2:ffff:ffff:ffff:ffff:ffff,IE -2a05:f507:3::,2a05:f507:3:7fff:ffff:ffff:ffff:ffff,ES -2a05:f507:3:8000::,2a05:f507:5:ffff:ffff:ffff:ffff:ffff,IE -2a05:f507:6::,2a05:f507:6:7fff:ffff:ffff:ffff:ffff,GB -2a05:f507:6:8000::,2a05:f507:8:ffff:ffff:ffff:ffff:ffff,IE -2a05:f507:9::,2a05:f507:9:7fff:ffff:ffff:ffff:ffff,FR -2a05:f507:9:8000::,2a05:f507:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a05:f540::,2a05:f547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f580::,2a05:f587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:f5c0::,2a05:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a05:f600::,2a05:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:f640::,2a05:f647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:f6c0::,2a05:f6c2:4837:ffff:ffff:ffff:ffff:ffff,DK -2a05:f6c2:4838::,2a05:f6c2:4838:7fff:ffff:ffff:ffff:ffff,SE -2a05:f6c2:4838:8000::,2a05:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:f700::,2a05:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a05:f740::,2a05:f747:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:f780::,2a05:f787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:f7c0::,2a05:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:f800::,2a05:f807:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:f840::,2a05:f847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a05:f900::,2a05:f907:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a05:f940::,2a05:f947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:f980::,2a05:f987:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:f9c0::,2a05:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:fa00::,2a05:fa07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a05:fa40::,2a05:fa47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:fac0::,2a05:fac7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a05:fb00::,2a05:fb07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:fb40::,2a05:fb47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a05:fb80::,2a05:fb87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:fbc0::,2a05:fbc3:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:fbe0::,2a05:fbe3:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a05:fc00::,2a05:fc07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a05:fc40::,2a05:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:fc80::,2a05:fc87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:fcc0::,2a05:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:fd00::,2a05:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a05:fd40::,2a05:fd47:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a05:fd80::,2a05:fd87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a05:fdc0::,2a05:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a05:fe00::,2a05:fe07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a05:fe40::,2a05:fe47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a05:fe80::,2a05:fe87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:ff00::,2a05:ff07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a05:ff40::,2a05:ff47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a05:ff80::,2a05:ff87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a05:ffc0::,2a05:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06::,2a06:7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:40::,2a06:47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:80::,2a06:87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:c0::,2a06:c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:100::,2a06:107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:140::,2a06:147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:180::,2a06:187:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a06:1c0::,2a06:1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:200::,2a06:207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:240::,2a06:247:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:280::,2a06:287:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a06:2c0::,2a06:2c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:300::,2a06:307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:340::,2a06:347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:380::,2a06:387:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:3c0::,2a06:3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:400::,2a06:407:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:440::,2a06:447:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:480::,2a06:487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4c0::,2a06:4c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:500::,2a06:507:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:540::,2a06:547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:580::,2a06:587:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:5c0::,2a06:5c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:600::,2a06:607:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:640::,2a06:647:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:680::,2a06:687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6c0::,2a06:6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:700::,2a06:707:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:740::,2a06:747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:780::,2a06:787:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a06:7c0::,2a06:7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:800::,2a06:807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:840::,2a06:847:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:880::,2a06:887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:8c0::,2a06:8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:900::,2a06:907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:940::,2a06:947:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:980::,2a06:987:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:9c0::,2a06:9c7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a06:a00::,2a06:a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:a40::,2a06:a47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a80::,2a06:a87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:ac0::,2a06:ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:b00::,2a06:b07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:b40::,2a06:b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:b80::,2a06:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:c00::,2a06:c07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:c40::,2a06:c47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:c80::,2a06:c87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:cc0::,2a06:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:d00::,2a06:d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:d40::,2a06:d47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a06:d80::,2a06:d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:dc0::,2a06:dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:e00::,2a06:e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:e40::,2a06:e47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:e80::,2a06:e87:ffff:ffff:ffff:ffff:ffff:ffff,IN -2a06:ec0::,2a06:ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:f00::,2a06:f07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:f40::,2a06:f47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:f80::,2a06:f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:fc0::,2a06:fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:1000::,2a06:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:1040::,2a06:1047:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:1080::,2a06:1087:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:10c0::,2a06:10c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1100::,2a06:1107:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:1180::,2a06:1187:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a06:11c0::,2a06:11c0:f:ffff:ffff:ffff:ffff:ffff,GB -2a06:11c0:10::,2a06:11c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:1200::,2a06:1207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:1240::,2a06:1247:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:1280::,2a06:1280:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2a06:1281::,2a06:1287:1f:ffff:ffff:ffff:ffff:ffff,BY -2a06:1287:20::,2a06:1287:2f:ffff:ffff:ffff:ffff:ffff,AT -2a06:1287:30::,2a06:1287:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a06:12c0::,2a06:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1300::,2a06:1307:ffff:ffff:ffff:ffff:ffff:ffff,NC -2a06:1340::,2a06:1347:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:1380::,2a06:1387:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:13c0::,2a06:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1400::,2a06:1407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:1440::,2a06:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:1480::,2a06:1487:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:1500::,2a06:1507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:1540::,2a06:1547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1580::,2a06:1587:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a06:15c0::,2a06:15c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:1640::,2a06:1647:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:1680::,2a06:1687:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:16c0::,2a06:16c7:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a06:1700::,2a06:1707:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:1740::,2a06:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1780::,2a06:1787:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:17c0::,2a06:17c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:1800::,2a06:1807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1840::,2a06:1847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:1880::,2a06:1887:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:18c0::,2a06:18c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1900::,2a06:1907:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:1940::,2a06:1947:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a06:1980::,2a06:1987:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:19c0::,2a06:19c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:1a00::,2a06:1a07:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:1a40::,2a06:1a47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:1a80::,2a06:1a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1ac0::,2a06:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1b00::,2a06:1b07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:1b40::,2a06:1b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:1b80::,2a06:1b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1bc0::,2a06:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1c00::,2a06:1c07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:1c40::,2a06:1c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1c80::,2a06:1c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:1cc0::,2a06:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:1d00::,2a06:1d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:1d40::,2a06:1d47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1d80::,2a06:1d87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:1dc0::,2a06:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:1e00::,2a06:1e07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:1e40::,2a06:1e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1e80::,2a06:1e87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:1ec0::,2a06:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:1f00::,2a06:1f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:1f40::,2a06:1f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:1f80::,2a06:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:1fc0::,2a06:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:2000::,2a06:2007:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a06:2040::,2a06:2047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:2080::,2a06:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:20c0::,2a06:20c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:2100::,2a06:2107:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:2140::,2a06:2147:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:21c0::,2a06:21c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2240::,2a06:2247:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:2280::,2a06:2287:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:22c0::,2a06:22c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2300::,2a06:2307:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:2340::,2a06:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2380::,2a06:2387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:23c0::,2a06:23c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2400::,2a06:2407:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:2480::,2a06:2487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:24c0::,2a06:24c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2500::,2a06:2507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:2540::,2a06:2547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:2580::,2a06:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:25c0::,2a06:25c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:25c1::,2a06:25c1::ffff:ffff:ffff:ffff:ffff,US -2a06:25c1:1::,2a06:25c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2600::,2a06:2600:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2601::,2a06:2601:ffff:ffff:ffff:ffff:ffff:ffff,US -2a06:2602::,2a06:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2640::,2a06:2647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2680::,2a06:2687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:2700::,2a06:2707:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:2740::,2a06:2747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:2780::,2a06:2787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:27c0::,2a06:27c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2800::,2a06:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2840::,2a06:2847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2880::,2a06:2887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:28c0::,2a06:28c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:2900::,2a06:2907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2940::,2a06:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:2980::,2a06:2987:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:29c0::,2a06:29c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2a00::,2a06:2a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2a40::,2a06:2a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2a80::,2a06:2a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2ac0::,2a06:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:2b00::,2a06:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2b40::,2a06:2b47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:2bc0::,2a06:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:2c00::,2a06:2c07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:2c40::,2a06:2c47:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:2c80::,2a06:2c87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:2cc0::,2a06:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2d00::,2a06:2d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:2d40::,2a06:2d47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2d80::,2a06:2d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:2dc0::,2a06:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:2e00::,2a06:2e05:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2e06::,2a06:2e06:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:2e07::,2a06:2e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:2e40::,2a06:2e47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:2e80::,2a06:2e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2ec0::,2a06:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:2f00::,2a06:2f07:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a06:2f40::,2a06:2f47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:2f80::,2a06:2f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:2fc0::,2a06:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:3000::,2a06:3007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3040::,2a06:3047:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a06:3080::,2a06:3087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:30c0::,2a06:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3100::,2a06:3107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3140::,2a06:3147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3180::,2a06:3187:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a06:31c0::,2a06:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:3200::,2a06:3207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3240::,2a06:3247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3280::,2a06:3287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:32c0::,2a06:32c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:3300::,2a06:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3340::,2a06:3347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:3380::,2a06:3387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3400::,2a06:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3480::,2a06:3487:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:34c0::,2a06:34c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3500::,2a06:3507:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:3540::,2a06:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3580::,2a06:3587:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:35c0::,2a06:35c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:3600::,2a06:3607:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:3640::,2a06:3647:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:3680::,2a06:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:36c0::,2a06:36c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3700::,2a06:3707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3740::,2a06:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:3780::,2a06:3787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:37c0::,2a06:37c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:3800::,2a06:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3840::,2a06:3847:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:3880::,2a06:3887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:38c0::,2a06:38c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:3940::,2a06:3947:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:3980::,2a06:3987:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:3a00::,2a06:3a07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:3a40::,2a06:3a47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3a80::,2a06:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3ac0::,2a06:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a06:3b00::,2a06:3b07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:3b40::,2a06:3b47:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:3b80::,2a06:3b87:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:3bc0::,2a06:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:3c00::,2a06:3c07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:3c40::,2a06:3c47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:3c80::,2a06:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a06:3cc0::,2a06:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3d00::,2a06:3d07:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a06:3d40::,2a06:3d47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:3d80::,2a06:3d87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3dc0::,2a06:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:3e00::,2a06:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3e40::,2a06:3e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:3e80::,2a06:3e80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3e81::,2a06:3e81::ffff:ffff:ffff:ffff:ffff,US -2a06:3e81:1::,2a06:3e86:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3e87::,2a06:3e87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:3ec0::,2a06:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:3f00::,2a06:3f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:3f40::,2a06:3f47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:3f80::,2a06:3f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:3fc0::,2a06:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4000::,2a06:4007:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:4040::,2a06:4047:ff:ffff:ffff:ffff:ffff:ffff,DK -2a06:4047:100::,2a06:4047:100:ffff:ffff:ffff:ffff:ffff,US -2a06:4047:101::,2a06:4047:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:4080::,2a06:4087:ff:ffff:ffff:ffff:ffff:ffff,ES -2a06:4087:100::,2a06:4087:100:ffff:ffff:ffff:ffff:ffff,US -2a06:4087:101::,2a06:4087:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:40c0::,2a06:40c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:4100::,2a06:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4140::,2a06:4147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4180::,2a06:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:41c0::,2a06:41c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:4200::,2a06:4207:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:4240::,2a06:4247:ffff:ffff:ffff:ffff:ffff:ffff,QA -2a06:4280::,2a06:4287:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:42c0::,2a06:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:4300::,2a06:4307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:4340::,2a06:4347:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:4380::,2a06:4387:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:43c0::,2a06:43c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:4400::,2a06:4407:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:4440::,2a06:4447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:4480::,2a06:4487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:44c0::,2a06:44c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:4500::,2a06:4507:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:4540::,2a06:4547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4580::,2a06:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:45c0::,2a06:45c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4600::,2a06:4607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4680::,2a06:4687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:46c0::,2a06:46c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:4700::,2a06:4707:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:4740::,2a06:4747:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:47c0::,2a06:47c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:4840::,2a06:4847:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:48c0::,2a06:48c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:4900::,2a06:4907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4940::,2a06:4947:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:4980::,2a06:4987:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a06:49c0::,2a06:49c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:4a00::,2a06:4a07:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a06:4a40::,2a06:4a47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:4a80::,2a06:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4ac0::,2a06:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:4b00::,2a06:4b07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4b40::,2a06:4b47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:4b80::,2a06:4b87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:4bc0::,2a06:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4c00::,2a06:4c00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4c01::,2a06:4c01::ffff:ffff:ffff:ffff:ffff,US -2a06:4c01:1::,2a06:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4c40::,2a06:4c47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:4c80::,2a06:4c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4cc0::,2a06:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4d00::,2a06:4d07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:4d40::,2a06:4d47:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a06:4d80::,2a06:4d87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:4dc0::,2a06:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:4e00::,2a06:4e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4e40::,2a06:4e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4e80::,2a06:4e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4ec0::,2a06:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:4f00::,2a06:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:4f40::,2a06:4f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:4f80::,2a06:4f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:4fc0::,2a06:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:5000::,2a06:5007:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:5040::,2a06:5047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:5080::,2a06:5087:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:50c0::,2a06:50c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:5100::,2a06:5107:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:5140::,2a06:5147:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:5180::,2a06:5187:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:51c0::,2a06:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:5200::,2a06:5207:ff:ffff:ffff:ffff:ffff:ffff,IE -2a06:5207:100::,2a06:5207:100:ffff:ffff:ffff:ffff:ffff,US -2a06:5207:101::,2a06:5207:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:5240::,2a06:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5280::,2a06:5287:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:5300::,2a06:5307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:5340::,2a06:5347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:5380::,2a06:5387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:53c0::,2a06:53c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:5400::,2a06:5407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5440::,2a06:5447:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:5480::,2a06:5487:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:54c0::,2a06:54c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:5500::,2a06:5507:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:5540::,2a06:5547:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a06:5580::,2a06:5587:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:55c0::,2a06:55c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:5600::,2a06:5607:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:5640::,2a06:5647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5680::,2a06:5687:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:56c0::,2a06:56c0:10:ffff:ffff:ffff:ffff:ffff,CH -2a06:56c0:11::,2a06:56c0:11:7fff:ffff:ffff:ffff:ffff,EE -2a06:56c0:11:8000::,2a06:56c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:5700::,2a06:5707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5740::,2a06:5747:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a06:5780::,2a06:5787:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:5800::,2a06:5807:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:5840::,2a06:5847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:5880::,2a06:5887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:58c0::,2a06:58c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:5900::,2a06:5907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:5940::,2a06:5947:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:5980::,2a06:5987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:59c0::,2a06:59c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a06:5a00::,2a06:5a07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:5a40::,2a06:5a47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:5a80::,2a06:5a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:5ac0::,2a06:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:5b00::,2a06:5b07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:5b40::,2a06:5b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:5b80::,2a06:5b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:5bc0::,2a06:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:5c40::,2a06:5c47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:5c80::,2a06:5c87:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a06:5cc0::,2a06:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:5d00::,2a06:5d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5d40::,2a06:5d47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:5d80::,2a06:5d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:5dc0::,2a06:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:5e00::,2a06:5e07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:5e40::,2a06:5e47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:5e80::,2a06:5e87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:5ec0::,2a06:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a06:5f00::,2a06:5f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:5f80::,2a06:5f87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:5fc0::,2a06:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6000::,2a06:6007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6040::,2a06:6047:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:6080::,2a06:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:60c0::,2a06:60c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:6100::,2a06:6107:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:6140::,2a06:6147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6180::,2a06:6187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:61c0::,2a06:61c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6200::,2a06:6207:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:6240::,2a06:6247:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:6280::,2a06:6287:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:62c0::,2a06:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6300::,2a06:6307:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:6340::,2a06:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:6380::,2a06:6387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:63c0::,2a06:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a06:6400::,2a06:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:6440::,2a06:6447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6480::,2a06:6487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:64c0::,2a06:64c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:6500::,2a06:6507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:6540::,2a06:6547:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:6580::,2a06:6587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:65c0::,2a06:65c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:6600::,2a06:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6640::,2a06:6647:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6680::,2a06:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:66c0::,2a06:66c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:6700::,2a06:6707:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:6740::,2a06:6747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6780::,2a06:6787:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:67c0::,2a06:67c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6800::,2a06:6807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6840::,2a06:6847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6880::,2a06:6887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:68c0::,2a06:68c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:6900::,2a06:6907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6940::,2a06:6947:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6980::,2a06:6987:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:69c0::,2a06:69c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:6a00::,2a06:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6a40::,2a06:6a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6ac0::,2a06:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6b00::,2a06:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:6b80::,2a06:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:6bc0::,2a06:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:6c00::,2a06:6c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6c80::,2a06:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6cc0::,2a06:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:6d00::,2a06:6d07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:6d40::,2a06:6d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:6d80::,2a06:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:6dc0::,2a06:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:6e00::,2a06:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:6e40::,2a06:6e47:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:6e80::,2a06:6e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6ec0::,2a06:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6f00::,2a06:6f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6f40::,2a06:6f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:6f80::,2a06:6f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:6fc0::,2a06:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a06:7000::,2a06:7007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:7040::,2a06:7047:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:7080::,2a06:7087:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:70c0::,2a06:70c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:7100::,2a06:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7140::,2a06:7147:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:7180::,2a06:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:71c0::,2a06:71c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7200::,2a06:7207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7240::,2a06:7240:2:ffff:ffff:ffff:ffff:ffff,AT -2a06:7240:3::,2a06:7240:3:ffff:ffff:ffff:ffff:ffff,GB -2a06:7240:4::,2a06:7240:4:ffff:ffff:ffff:ffff:ffff,AT -2a06:7240:5::,2a06:7240:6:ffff:ffff:ffff:ffff:ffff,NL -2a06:7240:7::,2a06:7242:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:7243::,2a06:7243:1f:ffff:ffff:ffff:ffff:ffff,TR -2a06:7243:20::,2a06:7247:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:7280::,2a06:7287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:72c0::,2a06:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7300::,2a06:7307:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:7340::,2a06:7347:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:7380::,2a06:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:73c0::,2a06:73c7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a06:7400::,2a06:7407:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:7440::,2a06:7447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:7480::,2a06:7487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:74c0::,2a06:74c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:7500::,2a06:7507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7540::,2a06:7547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:7580::,2a06:7587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:75c0::,2a06:75c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:7600::,2a06:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:7640::,2a06:7647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7680::,2a06:7687:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:76c0::,2a06:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a06:7700::,2a06:7707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:7740::,2a06:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:7780::,2a06:7787:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:77c0::,2a06:77c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:7800::,2a06:7807:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:7840::,2a06:7847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7880::,2a06:7887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:78c0::,2a06:78c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:7900::,2a06:7907:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:7940::,2a06:7947:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:7980::,2a06:7987:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:79c0::,2a06:79c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:7a00::,2a06:7a07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7a40::,2a06:7a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:7a80::,2a06:7a87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:7ac0::,2a06:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:7b00::,2a06:7b07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:7b40::,2a06:7b47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:7b80::,2a06:7b87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7bc0::,2a06:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7c00::,2a06:7c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7c40::,2a06:7c47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7c80::,2a06:7c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7cc0::,2a06:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:7d00::,2a06:7d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7d40::,2a06:7d47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:7d80::,2a06:7d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:7dc0::,2a06:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:7e00::,2a06:7e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:7e40::,2a06:7e47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7e80::,2a06:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:7ec0::,2a06:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7f00::,2a06:7f07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:7f40::,2a06:7f47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:7f80::,2a06:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:7fc0::,2a06:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8000::,2a06:8007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:8040::,2a06:8047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8080::,2a06:8087:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:80c0::,2a06:80c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:8100::,2a06:8107:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:8140::,2a06:8147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8180::,2a06:8180::7fff:ffff:ffff:ffff:ffff,DE -2a06:8180:0:8000::,2a06:8181:fdf:ffff:ffff:ffff:ffff:ffff,GB -2a06:8181:fe0::,2a06:8181:fff:ffff:ffff:ffff:ffff:ffff,AT -2a06:8181:1000::,2a06:8181:1fcf:ffff:ffff:ffff:ffff:ffff,GB -2a06:8181:1fd0::,2a06:8181:1fdf:ffff:ffff:ffff:ffff:ffff,AT -2a06:8181:1fe0::,2a06:8184:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8185::,2a06:8185:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:8186::,2a06:8187:fbb9:ffff:ffff:ffff:ffff:ffff,GB -2a06:8187:fbba::,2a06:8187:fbba:7fff:ffff:ffff:ffff:ffff,DE -2a06:8187:fbba:8000::,2a06:8187:fcff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8187:fd00::,2a06:8187:fd02:ffff:ffff:ffff:ffff:ffff,FR -2a06:8187:fd03::,2a06:8187:fd03:ffff:ffff:ffff:ffff:ffff,IE -2a06:8187:fd04::,2a06:8187:fd98:ffff:ffff:ffff:ffff:ffff,FR -2a06:8187:fd99::,2a06:8187:fd99:ffff:ffff:ffff:ffff:ffff,LI -2a06:8187:fd9a::,2a06:8187:fdff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8187:fe00::,2a06:8187:fe00:ffff:ffff:ffff:ffff:ffff,GB -2a06:8187:fe01::,2a06:8187:fe01:7fff:ffff:ffff:ffff:ffff,DE -2a06:8187:fe01:8000::,2a06:8187:fe12:ffff:ffff:ffff:ffff:ffff,GB -2a06:8187:fe13::,2a06:8187:fe13:7fff:ffff:ffff:ffff:ffff,DO -2a06:8187:fe13:8000::,2a06:8187:fe16:ffff:ffff:ffff:ffff:ffff,GB -2a06:8187:fe17::,2a06:8187:fe17:ffff:ffff:ffff:ffff:ffff,CA -2a06:8187:fe18::,2a06:8187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:81c0::,2a06:81c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:8200::,2a06:8207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:8240::,2a06:8247:ffff:ffff:ffff:ffff:ffff:ffff,MY -2a06:8280::,2a06:8280:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:8281::,2a06:8281:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8282::,2a06:8287:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:82c0::,2a06:82c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:82c1::,2a06:82c1::ffff:ffff:ffff:ffff:ffff,US -2a06:82c1:1::,2a06:82c1:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:82c2::,2a06:82c2:f:ffff:ffff:ffff:ffff:ffff,GB -2a06:82c2:10::,2a06:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8300::,2a06:8307:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a06:8340::,2a06:8347:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:8380::,2a06:8387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:83c0::,2a06:83c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:8400::,2a06:8407:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:8440::,2a06:8447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8480::,2a06:8487:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a06:84c0::,2a06:84c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8500::,2a06:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8540::,2a06:8547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:8580::,2a06:8587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:85c0::,2a06:85c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8600::,2a06:8607:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:8640::,2a06:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8680::,2a06:8687:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:86c0::,2a06:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8700::,2a06:8707:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:8740::,2a06:8747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:8780::,2a06:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:8800::,2a06:8807:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:8840::,2a06:8847:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:8880::,2a06:8887:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:88c0::,2a06:88c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:8900::,2a06:8907:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:8940::,2a06:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8980::,2a06:8987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:89c0::,2a06:89c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:8a00::,2a06:8a07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:8a40::,2a06:8a47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:8a80::,2a06:8a87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:8ac0::,2a06:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8b00::,2a06:8b07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:8b40::,2a06:8b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8b80::,2a06:8b87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8bc0::,2a06:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8c00::,2a06:8c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:8c40::,2a06:8c47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:8c80::,2a06:8c87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:8cc0::,2a06:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:8d00::,2a06:8d07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:8d40::,2a06:8d47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:8d80::,2a06:8d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8dc0::,2a06:8dc0:f:ffff:ffff:ffff:ffff:ffff,RO -2a06:8dc0:10::,2a06:8dc2::ffff:ffff:ffff:ffff:ffff,GB -2a06:8dc2:1::,2a06:8dc2:1:7fff:ffff:ffff:ffff:ffff,NL -2a06:8dc2:1:8000::,2a06:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8e00::,2a06:8e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8e40::,2a06:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:8e80::,2a06:8e87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:8ec0::,2a06:8ec0:1:ffff:ffff:ffff:ffff:ffff,GB -2a06:8ec0:2::,2a06:8ec0:2:ffff:ffff:ffff:ffff:ffff,CH -2a06:8ec0:3::,2a06:8ec0:3:ffff:ffff:ffff:ffff:ffff,GB -2a06:8ec0:4::,2a06:8ec0:4:ffff:ffff:ffff:ffff:ffff,NL -2a06:8ec0:5::,2a06:8ec0:5:ffff:ffff:ffff:ffff:ffff,GB -2a06:8ec0:6::,2a06:8ec0:6:ffff:ffff:ffff:ffff:ffff,SE -2a06:8ec0:7::,2a06:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:8f00::,2a06:8f07:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a06:8f40::,2a06:8f47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:8f80::,2a06:8f87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:8fc0::,2a06:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:9000::,2a06:9007:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:9040::,2a06:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:9080::,2a06:9087:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:90c0::,2a06:90c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:9100::,2a06:9107:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:9140::,2a06:9147:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:9180::,2a06:9187:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:91c0::,2a06:91c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a06:9200::,2a06:9207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:9240::,2a06:9247:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:9280::,2a06:9287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:9340::,2a06:9347:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:9380::,2a06:9387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:93c0::,2a06:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:9400::,2a06:9407:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a06:9440::,2a06:9447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:9480::,2a06:9487:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:94c0::,2a06:94c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9500::,2a06:9507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:9540::,2a06:9547:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:9580::,2a06:9587:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:95c0::,2a06:95c7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:9600::,2a06:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:9640::,2a06:9647:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:9680::,2a06:9687:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:96c0::,2a06:96c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:9700::,2a06:9707:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:9740::,2a06:9747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:9780::,2a06:9787:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:97c0::,2a06:97c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a06:9800::,2a06:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9840::,2a06:9847:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:9880::,2a06:9887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:98c0::,2a06:98c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9900::,2a06:9907:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:9940::,2a06:9947:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:99c0::,2a06:99c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:9a00::,2a06:9a07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:9a40::,2a06:9a47:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:9a80::,2a06:9a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9ac0::,2a06:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:9b00::,2a06:9b07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:9b40::,2a06:9b47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:9b80::,2a06:9b87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:9bc0::,2a06:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:9c00::,2a06:9c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9c40::,2a06:9c47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:9c80::,2a06:9c87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:9cc0::,2a06:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:9d00::,2a06:9d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9d40::,2a06:9d47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:9d80::,2a06:9d87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:9dc0::,2a06:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:9e00::,2a06:9e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:9e40::,2a06:9e47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:9e80::,2a06:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:9f00::,2a06:9f07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:9f40::,2a06:9f47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:9f80::,2a06:9f87:ff:ffff:ffff:ffff:ffff:ffff,VA -2a06:9f87:100::,2a06:9f87:1ff:ffff:ffff:ffff:ffff:ffff,AT -2a06:9f87:200::,2a06:9f87:ffff:ffff:ffff:ffff:ffff:ffff,VA -2a06:9fc0::,2a06:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:a000::,2a06:a005:ff:ffff:ffff:ffff:ffff:ffff,IS -2a06:a005:100::,2a06:a005:1ff:ffff:ffff:ffff:ffff:ffff,AT -2a06:a005:200::,2a06:a006:c2:ffff:ffff:ffff:ffff:ffff,IS -2a06:a006:c3::,2a06:a006:c3:7fff:ffff:ffff:ffff:ffff,NL -2a06:a006:c3:8000::,2a06:a006:c4:ffff:ffff:ffff:ffff:ffff,IS -2a06:a006:c5::,2a06:a006:c5:7fff:ffff:ffff:ffff:ffff,US -2a06:a006:c5:8000::,2a06:a007:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:a040::,2a06:a047:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:a080::,2a06:a087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a0c0::,2a06:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:a100::,2a06:a107:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:a140::,2a06:a147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a180::,2a06:a187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:a1c0::,2a06:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:a200::,2a06:a207:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:a240::,2a06:a247:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:a280::,2a06:a287:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:a2c0::,2a06:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:a300::,2a06:a307:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:a340::,2a06:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:a3c0::,2a06:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:a400::,2a06:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:a440::,2a06:a447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:a480::,2a06:a487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:a4c0::,2a06:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:a500::,2a06:a507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:a540::,2a06:a547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:a580::,2a06:a587:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:a5c0::,2a06:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a600::,2a06:a600::7fff:ffff:ffff:ffff:ffff,PT -2a06:a600:0:8000::,2a06:a607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a640::,2a06:a647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:a680::,2a06:a687:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:a6c0::,2a06:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:a700::,2a06:a707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a740::,2a06:a747:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:a7c0::,2a06:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:a800::,2a06:a807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:a840::,2a06:a847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:a880::,2a06:a887:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:a8c0::,2a06:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:a940::,2a06:a947:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:a980::,2a06:a987:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:a9c0::,2a06:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:aa00::,2a06:aa07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:aa40::,2a06:aa47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:aa80::,2a06:aa87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:aac0::,2a06:aac7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a06:ab00::,2a06:ab07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:ab80::,2a06:ab87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:abc0::,2a06:abc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:ac00::,2a06:ac07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:ac40::,2a06:ac47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:ac80::,2a06:ac87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:acc0::,2a06:acc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:ad00::,2a06:ad07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:ad40::,2a06:ad47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:ad80::,2a06:ad87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:adc0::,2a06:adc7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:ae00::,2a06:ae07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:ae40::,2a06:ae47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:ae80::,2a06:ae87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:aec0::,2a06:aec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:af00::,2a06:af07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:af40::,2a06:af47:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:af80::,2a06:af87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:afc0::,2a06:afc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:b000::,2a06:b007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:b040::,2a06:b047:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:b080::,2a06:b087:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:b0c0::,2a06:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:b100::,2a06:b107:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:b140::,2a06:b147:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:b180::,2a06:b187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:b1c0::,2a06:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:b200::,2a06:b207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:b240::,2a06:b247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:b280::,2a06:b287:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:b2c0::,2a06:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a06:b300::,2a06:b307:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:b340::,2a06:b347:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:b380::,2a06:b387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:b3c0::,2a06:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:b400::,2a06:b407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:b440::,2a06:b447:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:b480::,2a06:b487:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:b4c0::,2a06:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:b500::,2a06:b507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:b540::,2a06:b547:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:b580::,2a06:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:b5c0::,2a06:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:b600::,2a06:b607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:b640::,2a06:b647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:b680::,2a06:b687:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:b6c0::,2a06:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:b740::,2a06:b747:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:b780::,2a06:b787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:b7c0::,2a06:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:b800::,2a06:b807:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a06:b840::,2a06:b847:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:b880::,2a06:b887:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:b8c0::,2a06:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:b900::,2a06:b907:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:b940::,2a06:b947:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:b980::,2a06:b987:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:b9c0::,2a06:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ba00::,2a06:ba07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:ba40::,2a06:ba47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:ba80::,2a06:ba87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:bac0::,2a06:bac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:bb00::,2a06:bb07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:bb80::,2a06:bb87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:bbc0::,2a06:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:bc00::,2a06:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:bc40::,2a06:bc47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a06:bc80::,2a06:bc87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:bcc0::,2a06:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:bd00::,2a06:bd07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:bd40::,2a06:bd47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:bd80::,2a06:bd87:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:bdc0::,2a06:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:be00::,2a06:be07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:be40::,2a06:be47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:be80::,2a06:be87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:bec0::,2a06:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:bf00::,2a06:bf07:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:bf40::,2a06:bf47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:bf80::,2a06:bf87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:bfc0::,2a06:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:c000::,2a06:c007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:c040::,2a06:c047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:c080::,2a06:c087:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:c0c0::,2a06:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:c100::,2a06:c107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:c140::,2a06:c147:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:c180::,2a06:c187:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a06:c1c0::,2a06:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:c200::,2a06:c207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:c240::,2a06:c247:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:c280::,2a06:c287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:c2c0::,2a06:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:c300::,2a06:c307:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:c340::,2a06:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:c380::,2a06:c387:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:c3c0::,2a06:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:c400::,2a06:c407:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:c440::,2a06:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:c480::,2a06:c487:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:c4c0::,2a06:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:c500::,2a06:c507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:c580::,2a06:c587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:c5c0::,2a06:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:c600::,2a06:c607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:c640::,2a06:c647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:c680::,2a06:c687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:c6c0::,2a06:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:c700::,2a06:c707:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:c740::,2a06:c747:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:c780::,2a06:c787:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:c7c0::,2a06:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:c800::,2a06:c807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:c840::,2a06:c847:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:c880::,2a06:c887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:c8c0::,2a06:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:c900::,2a06:c907:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:c940::,2a06:c947:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:c980::,2a06:c987:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:c9c0::,2a06:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:ca00::,2a06:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:ca40::,2a06:ca47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:ca80::,2a06:ca87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:cac0::,2a06:cac7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:cb00::,2a06:cb07:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:cb40::,2a06:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:cb80::,2a06:cb87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:cbc0::,2a06:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:cc00::,2a06:cc07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:cc40::,2a06:cc47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:cc80::,2a06:cc87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:ccc0::,2a06:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:cd00::,2a06:cd07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:cd40::,2a06:cd47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:cd80::,2a06:cd87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:cdc0::,2a06:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a06:ce00::,2a06:ce07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:ce40::,2a06:ce47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:ce80::,2a06:ce87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:cec0::,2a06:cec7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:cf00::,2a06:cf07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:cf40::,2a06:cf47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:cf80::,2a06:cf87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:cfc0::,2a06:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:d000::,2a06:d007:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:d040::,2a06:d047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:d080::,2a06:d087:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:d0c0::,2a06:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:d100::,2a06:d107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:d140::,2a06:d147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:d180::,2a06:d187:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:d1c0::,2a06:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:d200::,2a06:d207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:d240::,2a06:d247:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:d280::,2a06:d287:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:d2c0::,2a06:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:d300::,2a06:d307:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a06:d340::,2a06:d347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:d380::,2a06:d387:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:d3c0::,2a06:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:d400::,2a06:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:d440::,2a06:d447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:d480::,2a06:d487:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:d500::,2a06:d507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:d540::,2a06:d547:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:d580::,2a06:d587:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:d5c0::,2a06:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:d600::,2a06:d607:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:d640::,2a06:d647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:d680::,2a06:d687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:d700::,2a06:d707:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a06:d740::,2a06:d747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:d780::,2a06:d787:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:d7c0::,2a06:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:d800::,2a06:d807:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:d840::,2a06:d847:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:d880::,2a06:d887:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:d8c0::,2a06:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:d900::,2a06:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:d940::,2a06:d947:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:d980::,2a06:d987:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:d9c0::,2a06:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:da00::,2a06:da07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:da40::,2a06:da47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:da80::,2a06:da87:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a06:dac0::,2a06:dac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:db00::,2a06:db07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:db40::,2a06:db47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:db80::,2a06:db87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:dbc0::,2a06:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:dc00::,2a06:dc07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:dc40::,2a06:dc47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:dc80::,2a06:dc87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:dcc0::,2a06:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:dd00::,2a06:dd07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:dd40::,2a06:dd47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:dd80::,2a06:dd87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:ddc0::,2a06:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:de00::,2a06:de07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:de40::,2a06:de47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:dec0::,2a06:dec7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:df00::,2a06:df07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:df40::,2a06:df47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:df80::,2a06:df87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:dfc0::,2a06:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:e000::,2a06:e007:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:e040::,2a06:e047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:e080::,2a06:e087:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:e0c0::,2a06:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:e100::,2a06:e107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:e140::,2a06:e147:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:e180::,2a06:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:e1c0::,2a06:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:e200::,2a06:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:e240::,2a06:e247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:e280::,2a06:e287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:e2c0::,2a06:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:e300::,2a06:e307:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a06:e340::,2a06:e347:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a06:e380::,2a06:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:e3c0::,2a06:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:e400::,2a06:e407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:e440::,2a06:e447:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a06:e480::,2a06:e487:ffff:ffff:ffff:ffff:ffff:ffff,US -2a06:e4c0::,2a06:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:e500::,2a06:e507:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:e540::,2a06:e547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:e580::,2a06:e587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:e600::,2a06:e607:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:e640::,2a06:e647:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a06:e680::,2a06:e687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:e6c0::,2a06:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:e700::,2a06:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:e740::,2a06:e747:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:e780::,2a06:e787:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:e7c0::,2a06:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:e800::,2a06:e807:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:e840::,2a06:e847:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:e880::,2a06:e881:105:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:106::,2a06:e881:106:ffff:ffff:ffff:ffff:ffff,FR -2a06:e881:107::,2a06:e881:107:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:108::,2a06:e881:108:7fff:ffff:ffff:ffff:ffff,LT -2a06:e881:108:8000::,2a06:e881:1ff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:200::,2a06:e881:2ff:ffff:ffff:ffff:ffff:ffff,AT -2a06:e881:300::,2a06:e881:10ff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:1100::,2a06:e881:110f:ffff:ffff:ffff:ffff:ffff,FR -2a06:e881:1110::,2a06:e881:14ff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:1500::,2a06:e881:150f:ffff:ffff:ffff:ffff:ffff,GB -2a06:e881:1510::,2a06:e881:16ff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:1700::,2a06:e881:170f:ffff:ffff:ffff:ffff:ffff,DE -2a06:e881:1710::,2a06:e881:1fff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:2000::,2a06:e881:200f:ffff:ffff:ffff:ffff:ffff,DE -2a06:e881:2010::,2a06:e881:20ff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:2100::,2a06:e881:210f:ffff:ffff:ffff:ffff:ffff,DE -2a06:e881:2110::,2a06:e881:2502:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:2503::,2a06:e881:2503:7fff:ffff:ffff:ffff:ffff,JP -2a06:e881:2503:8000::,2a06:e881:f000:ffff:ffff:ffff:ffff:ffff,CH -2a06:e881:f001::,2a06:e881:f001:7fff:ffff:ffff:ffff:ffff,GB -2a06:e881:f001:8000::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a06:e8c0::,2a06:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a06:e900::,2a06:e907:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:e940::,2a06:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:e980::,2a06:e987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:e9c0::,2a06:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ea00::,2a06:ea07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:ea40::,2a06:ea47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a06:ea80::,2a06:ea87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:eac0::,2a06:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:eb00::,2a06:eb07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:eb40::,2a06:eb47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:eb80::,2a06:eb87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a06:ebc0::,2a06:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:ec00::,2a06:ec07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ec40::,2a06:ec47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:ec80::,2a06:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:ecc0::,2a06:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:ed00::,2a06:ed07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ed40::,2a06:ed47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:edc0::,2a06:edc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ee00::,2a06:ee07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:ee40::,2a06:ee47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ee80::,2a06:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:eec0::,2a06:eec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:ef40::,2a06:ef47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:ef80::,2a06:ef87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:efc0::,2a06:efc7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:f000::,2a06:f007:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a06:f040::,2a06:f047:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a06:f080::,2a06:f087:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:f0c0::,2a06:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:f100::,2a06:f107:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a06:f140::,2a06:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:f180::,2a06:f187:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:f1c0::,2a06:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:f200::,2a06:f207:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:f240::,2a06:f247:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:f280::,2a06:f287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:f2c0::,2a06:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:f300::,2a06:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:f340::,2a06:f347:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:f380::,2a06:f387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:f3c0::,2a06:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:f400::,2a06:f407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:f440::,2a06:f447:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:f500::,2a06:f507:ffff:ffff:ffff:ffff:ffff:ffff,IN -2a06:f540::,2a06:f547:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:f580::,2a06:f587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:f5c0::,2a06:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:f600::,2a06:f607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a06:f640::,2a06:f647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a06:f680::,2a06:f687:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:f6c0::,2a06:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:f700::,2a06:f707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:f740::,2a06:f747:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a06:f780::,2a06:f787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:f7c0::,2a06:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:f800::,2a06:f807:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:f840::,2a06:f847:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:f880::,2a06:f887:ffff:ffff:ffff:ffff:ffff:ffff,US -2a06:f8c0::,2a06:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:f900::,2a06:f907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:f940::,2a06:f947:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:f980::,2a06:f987:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a06:f9c0::,2a06:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a06:fa00::,2a06:fa07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:fa40::,2a06:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a06:fa80::,2a06:fa87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a06:fac0::,2a06:fac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a06:fb00::,2a06:fb07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a06:fb40::,2a06:fb47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:fb80::,2a06:fb87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a06:fbc0::,2a06:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:fc00::,2a06:fc07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a06:fc40::,2a06:fc47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a06:fc80::,2a06:fc87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a06:fcc0::,2a06:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:fd00::,2a06:fd07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:fd40::,2a06:fd47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a06:fd80::,2a06:fd87:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:fdc0::,2a06:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a06:fe00::,2a06:fe07:ffff:ffff:ffff:ffff:ffff:ffff,MA -2a06:fe40::,2a06:fe47:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a06:fe80::,2a06:fe87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a06:fec0::,2a06:fec7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a06:ff00::,2a06:ff07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a06:ff40::,2a06:ff47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a06:ff80::,2a06:ff87:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a06:ffc0::,2a06:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07::,2a07:7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:40::,2a07:47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:80::,2a07:87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:c0::,2a07:c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:100::,2a07:107:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:140::,2a07:147:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a07:180::,2a07:187:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:1c0::,2a07:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:200::,2a07:207:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a07:240::,2a07:247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:280::,2a07:287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:2c0::,2a07:2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:300::,2a07:307:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a07:340::,2a07:347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:380::,2a07:387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:3c0::,2a07:3c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:440::,2a07:447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:480::,2a07:487:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:4c0::,2a07:4c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:500::,2a07:507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:540::,2a07:547:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:580::,2a07:587:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:5c0::,2a07:5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:600::,2a07:607:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:640::,2a07:647:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:680::,2a07:687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6c0::,2a07:6c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:700::,2a07:707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:740::,2a07:747:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a07:780::,2a07:787:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:7c0::,2a07:7c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:800::,2a07:807:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:840::,2a07:847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:880::,2a07:887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8c0::,2a07:8c7:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a07:900::,2a07:907:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:940::,2a07:947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:980::,2a07:987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:9c0::,2a07:9c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:a00::,2a07:a07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:a40::,2a07:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a80::,2a07:a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:ac0::,2a07:ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b00::,2a07:b07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:b40::,2a07:b47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:b80::,2a07:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:bc0::,2a07:bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:c00::,2a07:c07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:c40::,2a07:c47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:c80::,2a07:c87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:cc0::,2a07:cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:d00::,2a07:d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:d40::,2a07:d47:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:d80::,2a07:d87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:dc0::,2a07:dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:e00::,2a07:e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:e40::,2a07:e47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:e80::,2a07:e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:ec0::,2a07:ec7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:f00::,2a07:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:f40::,2a07:f47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:f80::,2a07:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:fc0::,2a07:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a07:1000::,2a07:1007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1040::,2a07:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1080::,2a07:1087:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:10c0::,2a07:10c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:1100::,2a07:1107:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:1140::,2a07:1147:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1180::,2a07:1187:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a07:11c0::,2a07:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:1200::,2a07:1207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:1240::,2a07:1247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1280::,2a07:1287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:12c0::,2a07:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1300::,2a07:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1340::,2a07:1347:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:1380::,2a07:1387:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:13c0::,2a07:13c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:1400::,2a07:1407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:1440::,2a07:1447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1480::,2a07:1487:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:14c0::,2a07:14c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1500::,2a07:1507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1540::,2a07:1547:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:1580::,2a07:1587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:15c0::,2a07:15c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:1600::,2a07:1607:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:1640::,2a07:1647:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:1680::,2a07:1687:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:16c0::,2a07:16c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:1700::,2a07:1707:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:1740::,2a07:1747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1780::,2a07:1787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:17c0::,2a07:17c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:1800::,2a07:1807:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1840::,2a07:1847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1880::,2a07:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:18c0::,2a07:18c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:1900::,2a07:1907:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:1940::,2a07:1947:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:1980::,2a07:1987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a07:19c0::,2a07:19c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:1a00::,2a07:1a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:1a40::,2a07:1a47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:1a80::,2a07:1a80:6fff:ffff:ffff:ffff:ffff:ffff,SE -2a07:1a80:7000::,2a07:1a80:70ff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1a80:7100::,2a07:1a87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:1ac0::,2a07:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1b00::,2a07:1b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1b40::,2a07:1b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1b80::,2a07:1b87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1bc0::,2a07:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:1c00::,2a07:1c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1c40::,2a07:1c44:3ff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:400::,2a07:1c44:4ff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1c44:500::,2a07:1c44:609:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:60a::,2a07:1c44:60a:ffff:ffff:ffff:ffff:ffff,DE -2a07:1c44:60b::,2a07:1c44:619:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:61a::,2a07:1c44:61a:ffff:ffff:ffff:ffff:ffff,KR -2a07:1c44:61b::,2a07:1c44:67f:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:680::,2a07:1c44:6bf:ffff:ffff:ffff:ffff:ffff,KR -2a07:1c44:6c0::,2a07:1c44:6c0:7fff:ffff:ffff:ffff:ffff,AT -2a07:1c44:6c0:8000::,2a07:1c44:6c0:ffff:ffff:ffff:ffff:ffff,KR -2a07:1c44:6c1::,2a07:1c44:6ff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:700::,2a07:1c44:70f:ffff:ffff:ffff:ffff:ffff,US -2a07:1c44:710::,2a07:1c44:1800:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:1801::,2a07:1c44:1802:ffff:ffff:ffff:ffff:ffff,US -2a07:1c44:1803::,2a07:1c44:35ff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:3600::,2a07:1c44:36ff:ffff:ffff:ffff:ffff:ffff,GB -2a07:1c44:3700::,2a07:1c44:3fff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c44:4000::,2a07:1c44:40ff:ffff:ffff:ffff:ffff:ffff,US -2a07:1c44:4100::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:1c80::,2a07:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:1cc0::,2a07:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:1d00::,2a07:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:1d40::,2a07:1d47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1d80::,2a07:1d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:1dc0::,2a07:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:1e00::,2a07:1e07:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a07:1e40::,2a07:1e47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:1e80::,2a07:1e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:1ec0::,2a07:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:1f00::,2a07:1f07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:1f40::,2a07:1f47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:1f80::,2a07:1f87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:1fc0::,2a07:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2000::,2a07:2007:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a07:2040::,2a07:2047:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:2080::,2a07:2087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:20c0::,2a07:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:2100::,2a07:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2140::,2a07:2147:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:2180::,2a07:2187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:21c0::,2a07:21c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:2200::,2a07:2207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:2240::,2a07:2247:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:2280::,2a07:2287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:2300::,2a07:2307:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:2340::,2a07:2347:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:2380::,2a07:2387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:23c0::,2a07:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:2400::,2a07:2407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2440::,2a07:2447:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:2480::,2a07:2487:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:24c0::,2a07:24c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:2500::,2a07:2507:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:2540::,2a07:2547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2580::,2a07:2587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:25c0::,2a07:25c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:2600::,2a07:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:2640::,2a07:2647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:2680::,2a07:2687:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:26c0::,2a07:26c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:2700::,2a07:2707:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:2740::,2a07:2747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:2780::,2a07:2787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:27c0::,2a07:27c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:2800::,2a07:2807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2840::,2a07:2847:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:2880::,2a07:2887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:28c0::,2a07:28c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2900::,2a07:291f:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:2a00::,2a07:2a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:2a40::,2a07:2a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2a80::,2a07:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:2ac0::,2a07:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2b00::,2a07:2b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2b40::,2a07:2b47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:2b80::,2a07:2b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:2bc0::,2a07:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:2c00::,2a07:2c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:2c40::,2a07:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2c80::,2a07:2c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2cc0::,2a07:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:2d00::,2a07:2d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2d40::,2a07:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:2d80::,2a07:2d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2dc0::,2a07:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a07:2e00::,2a07:2e07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:2e40::,2a07:2e47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:2e80::,2a07:2e87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:2ec0::,2a07:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2f00::,2a07:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:2f40::,2a07:2f47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:2f80::,2a07:2f87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:2fc0::,2a07:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3000::,2a07:3007:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:3040::,2a07:3047:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:3080::,2a07:3087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:30c0::,2a07:30c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:3100::,2a07:3107:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:3140::,2a07:3147:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:3180::,2a07:3187:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:31c0::,2a07:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3200::,2a07:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3240::,2a07:3247:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:3280::,2a07:3287:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:32c0::,2a07:32c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:3300::,2a07:3307:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:3340::,2a07:3347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:3380::,2a07:3387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:33c0::,2a07:33c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:3400::,2a07:3407:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:3440::,2a07:3447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3480::,2a07:3487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3500::,2a07:3507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3540::,2a07:3547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:3580::,2a07:3587:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:35c0::,2a07:35c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:3600::,2a07:3607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:3640::,2a07:3647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3680::,2a07:3687:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a07:36c0::,2a07:36c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3700::,2a07:3707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3740::,2a07:3747:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:3780::,2a07:3787:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a07:37c0::,2a07:37c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:3800::,2a07:3807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:3840::,2a07:3847:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a07:3880::,2a07:3887:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:38c0::,2a07:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:3900::,2a07:3907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:3940::,2a07:3947:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:3980::,2a07:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:39c0::,2a07:39c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:3a00::,2a07:3a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:3a80::,2a07:3a87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:3ac0::,2a07:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:3b00::,2a07:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:3b40::,2a07:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3b80::,2a07:3b87:ffff:ffff:ffff:ffff:ffff:ffff,GI -2a07:3bc0::,2a07:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3c00::,2a07:3c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3c40::,2a07:3c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:3c80::,2a07:3c87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3d00::,2a07:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:3d80::,2a07:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:3dc0::,2a07:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:3e00::,2a07:3e07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:3e40::,2a07:3e47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:3e80::,2a07:3e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:3ec0::,2a07:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:3f00::,2a07:3f07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:3f40::,2a07:3f47:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a07:3f80::,2a07:3f87:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:3fc0::,2a07:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:4000::,2a07:4007:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:4040::,2a07:4047:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:4080::,2a07:4087:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:40c0::,2a07:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a07:4100::,2a07:4107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:4140::,2a07:4147:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a07:4180::,2a07:4187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:41c0::,2a07:41c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:4200::,2a07:4207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:4240::,2a07:4247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:4280::,2a07:4287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:42c0::,2a07:42c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:4340::,2a07:4347:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a07:4380::,2a07:4387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:43c0::,2a07:43c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4400::,2a07:4407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4440::,2a07:4447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:4480::,2a07:4487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:44c0::,2a07:44c7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a07:4500::,2a07:4507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4540::,2a07:4547:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a07:4580::,2a07:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:45c0::,2a07:45c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:4600::,2a07:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4640::,2a07:4647:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:4680::,2a07:4687:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:46c0::,2a07:46c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4700::,2a07:4707:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:4740::,2a07:4747:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:4780::,2a07:4787:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:47c0::,2a07:47c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:4800::,2a07:4807:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:4840::,2a07:4847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:4880::,2a07:4887:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:48c0::,2a07:48c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:4900::,2a07:4907:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a07:4940::,2a07:4947:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:4980::,2a07:4987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4a00::,2a07:4a07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4a40::,2a07:4a47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4a80::,2a07:4a87:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a07:4ac0::,2a07:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4b00::,2a07:4b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:4b40::,2a07:4b47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:4b80::,2a07:4b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:4bc0::,2a07:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:4c00::,2a07:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:4cc0::,2a07:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:4d00::,2a07:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:4d40::,2a07:4d47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:4d80::,2a07:4d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:4dc0::,2a07:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:4e00::,2a07:4e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:4e40::,2a07:4e47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4e80::,2a07:4e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:4ec0::,2a07:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:4f00::,2a07:4f07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:4f40::,2a07:4f47:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a07:4f80::,2a07:4f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:4fc0::,2a07:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a07:5000::,2a07:5007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5040::,2a07:5047:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:5080::,2a07:5087:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:50c0::,2a07:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:5100::,2a07:5107:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:5140::,2a07:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5180::,2a07:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:51c0::,2a07:51c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:5200::,2a07:5207:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:5240::,2a07:5247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5280::,2a07:5287:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:52c0::,2a07:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5300::,2a07:5307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:5340::,2a07:5347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5380::,2a07:5387:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:53c0::,2a07:53c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:5400::,2a07:5407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5440::,2a07:5447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5480::,2a07:5487:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a07:54c0::,2a07:54c7:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a07:5500::,2a07:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:5540::,2a07:5547:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a07:5580::,2a07:5587:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:55c0::,2a07:55c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5600::,2a07:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:5640::,2a07:5647:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:5680::,2a07:5687:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:56c0::,2a07:56c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5700::,2a07:5707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:5740::,2a07:5747:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:5780::,2a07:5787:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:57c0::,2a07:57c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:5800::,2a07:5807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:5840::,2a07:5847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:5880::,2a07:5887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:58c0::,2a07:58c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:5900::,2a07:5907:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a07:5940::,2a07:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:5980::,2a07:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:59c0::,2a07:59c6:edff:ffff:ffff:ffff:ffff:ffff,IT -2a07:59c6:ee00::,2a07:59c6:eeff:ffff:ffff:ffff:ffff:ffff,DE -2a07:59c6:ef00::,2a07:59c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:5a00::,2a07:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a07:5a40::,2a07:5a47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:5a80::,2a07:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a07:5ac0::,2a07:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a07:5b00::,2a07:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:5b40::,2a07:5b47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:5b80::,2a07:5b87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:5bc0::,2a07:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5c00::,2a07:5c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5c40::,2a07:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5c80::,2a07:5c87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:5cc0::,2a07:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:5d00::,2a07:5d07:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a07:5d40::,2a07:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5d80::,2a07:5d87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:5dc0::,2a07:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5e00::,2a07:5e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:5e40::,2a07:5e47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:5e80::,2a07:5e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:5ec0::,2a07:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5f00::,2a07:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:5f40::,2a07:5f47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:5f80::,2a07:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:6000::,2a07:6007:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:6040::,2a07:6047:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a07:6080::,2a07:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:60c0::,2a07:60c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6100::,2a07:6107:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:6140::,2a07:6147:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:6180::,2a07:6187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:61c0::,2a07:61c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6200::,2a07:6207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:6240::,2a07:6247:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:6280::,2a07:6287:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:62c0::,2a07:62c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6300::,2a07:6307:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:6340::,2a07:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:6380::,2a07:6387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:63c0::,2a07:63c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:6400::,2a07:6407:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a07:6440::,2a07:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6480::,2a07:6487:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:64c0::,2a07:64c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:6500::,2a07:6507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6540::,2a07:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6580::,2a07:6587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:65c0::,2a07:65c7:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a07:6600::,2a07:6607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6640::,2a07:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6680::,2a07:6687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:66c0::,2a07:66c7:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a07:6700::,2a07:6707:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a07:6780::,2a07:6787:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a07:67c0::,2a07:67c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:6800::,2a07:6807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:6880::,2a07:6887:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:68c0::,2a07:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6900::,2a07:6907:ffff:ffff:ffff:ffff:ffff:ffff,PA -2a07:6940::,2a07:6947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6980::,2a07:6987:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a07:69c0::,2a07:69c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6a00::,2a07:6a07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:6a40::,2a07:6a47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6a80::,2a07:6a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6ac0::,2a07:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:6b00::,2a07:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6b40::,2a07:6b47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:6b80::,2a07:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6bc0::,2a07:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:6c00::,2a07:6c07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:6c40::,2a07:6c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:6c80::,2a07:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6cc0::,2a07:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:6d00::,2a07:6d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6d40::,2a07:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6d80::,2a07:6d87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:6dc0::,2a07:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:6e00::,2a07:6e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6e40::,2a07:6e47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:6e80::,2a07:6e87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:6ec0::,2a07:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6f00::,2a07:6f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:6f80::,2a07:6f87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:6fc0::,2a07:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:7000::,2a07:7007:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:7040::,2a07:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:7080::,2a07:7087:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a07:70c0::,2a07:70c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:7100::,2a07:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:7140::,2a07:7147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:7180::,2a07:7187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:71c0::,2a07:71c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7200::,2a07:7207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7280::,2a07:7287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:72c0::,2a07:72c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7300::,2a07:7307:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:7340::,2a07:7347:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:7380::,2a07:7387:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:73c0::,2a07:73c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:7400::,2a07:7407:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a07:7440::,2a07:7447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7480::,2a07:7487:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:74c0::,2a07:74c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:7500::,2a07:7507:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:7540::,2a07:7547:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:7580::,2a07:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:75c0::,2a07:75c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:7600::,2a07:7607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7640::,2a07:7647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:7680::,2a07:7687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:7700::,2a07:7707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7740::,2a07:7747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7780::,2a07:7787:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:77c0::,2a07:77c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:7800::,2a07:7807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:7840::,2a07:7847:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a07:7880::,2a07:7887:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:78c0::,2a07:78c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7900::,2a07:7907:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a07:7940::,2a07:7947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:7980::,2a07:7987:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:79c0::,2a07:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:7a00::,2a07:7a07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:7a40::,2a07:7a47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7a80::,2a07:7a87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:7ac0::,2a07:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:7b00::,2a07:7b07:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a07:7b40::,2a07:7b47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7b80::,2a07:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:7bc0::,2a07:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:7c00::,2a07:7c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7c40::,2a07:7c47:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a07:7c80::,2a07:7c87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:7cc0::,2a07:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:7d00::,2a07:7d07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:7d40::,2a07:7d47:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:7d80::,2a07:7d87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:7dc0::,2a07:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:7e00::,2a07:7e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:7e40::,2a07:7e47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:7e80::,2a07:7e87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:7ec0::,2a07:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:7f00::,2a07:7f07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:7f40::,2a07:7f47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:7f80::,2a07:7f87:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a07:7fc0::,2a07:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8000::,2a07:8007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8040::,2a07:8047:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:8080::,2a07:8087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:80c0::,2a07:80c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8100::,2a07:8107:ffff:ffff:ffff:ffff:ffff:ffff,VA -2a07:8140::,2a07:8147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:8180::,2a07:8187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:81c0::,2a07:81c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:8200::,2a07:8207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8240::,2a07:8247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8280::,2a07:8287:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:82c0::,2a07:82c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8300::,2a07:8307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:8340::,2a07:8347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8380::,2a07:8387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:83c0::,2a07:83c7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:8400::,2a07:8407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:8440::,2a07:8447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:8480::,2a07:8487:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:84c0::,2a07:84c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:8500::,2a07:8507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8580::,2a07:8587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:85c0::,2a07:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8600::,2a07:8607:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:8640::,2a07:8647:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8680::,2a07:8687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:86c0::,2a07:86c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8700::,2a07:8707:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:8740::,2a07:8747:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:8780::,2a07:8787:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a07:87c0::,2a07:87c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:8800::,2a07:8807:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:8840::,2a07:8847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8880::,2a07:8887:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a07:88c0::,2a07:88c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:8900::,2a07:8907:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:8940::,2a07:8947:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8980::,2a07:8980:43:ffff:ffff:ffff:ffff:ffff,LT -2a07:8980:44::,2a07:8980:44:7fff:ffff:ffff:ffff:ffff,GB -2a07:8980:44:8000::,2a07:8987:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a07:89c0::,2a07:89c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:8a00::,2a07:8a07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:8a40::,2a07:8a47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:8a80::,2a07:8a87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8ac0::,2a07:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:8b00::,2a07:8b07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8b40::,2a07:8b47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8b80::,2a07:8b83:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a07:8bc0::,2a07:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:8c00::,2a07:8c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:8c40::,2a07:8c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:8c80::,2a07:8c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:8cc0::,2a07:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:8d00::,2a07:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:8d40::,2a07:8d47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:8d80::,2a07:8d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:8dc0::,2a07:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:8e00::,2a07:8e07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:8e40::,2a07:8e47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:8e80::,2a07:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:8ec0::,2a07:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a07:8f00::,2a07:8f07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:8f40::,2a07:8f47:ffff:ffff:ffff:ffff:ffff:ffff,AU -2a07:8f80::,2a07:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:8fc0::,2a07:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:9000::,2a07:9007:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a07:9040::,2a07:9047:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:9080::,2a07:9087:ffff:ffff:ffff:ffff:ffff:ffff,MC -2a07:90c0::,2a07:90c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:9100::,2a07:9107:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:9140::,2a07:9147:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:9180::,2a07:9187:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:91c0::,2a07:91c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:9200::,2a07:9207:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:9240::,2a07:9247:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:9280::,2a07:9287:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a07:92c0::,2a07:92c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9300::,2a07:9307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:9340::,2a07:9347:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:9380::,2a07:9387:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:93c0::,2a07:93c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:9400::,2a07:9407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:9440::,2a07:9447:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:9480::,2a07:9487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:94c0::,2a07:94c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:9500::,2a07:9507:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a07:9540::,2a07:9547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9580::,2a07:9587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:95c0::,2a07:95c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:9600::,2a07:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9640::,2a07:9647:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a07:9680::,2a07:9687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:96c0::,2a07:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:9700::,2a07:9707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9740::,2a07:9747:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a07:9780::,2a07:9787:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:97c0::,2a07:97c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:9800::,2a07:9807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9840::,2a07:9847:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:9880::,2a07:9887:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a07:98c0::,2a07:98c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:9900::,2a07:9907:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a07:9940::,2a07:9944:f:ffff:ffff:ffff:ffff:ffff,GB -2a07:9944:10::,2a07:9944:10:ffff:ffff:ffff:ffff:ffff,US -2a07:9944:11::,2a07:9944:1f:ffff:ffff:ffff:ffff:ffff,GB -2a07:9944:20::,2a07:9944:20:ffff:ffff:ffff:ffff:ffff,US -2a07:9944:21::,2a07:9944:2f:ffff:ffff:ffff:ffff:ffff,GB -2a07:9944:30::,2a07:9944:30:ffff:ffff:ffff:ffff:ffff,US -2a07:9944:31::,2a07:9944:3f:ffff:ffff:ffff:ffff:ffff,GB -2a07:9944:40::,2a07:9944:40:ffff:ffff:ffff:ffff:ffff,US -2a07:9944:41::,2a07:9947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9980::,2a07:9987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:99c0::,2a07:99c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:9a00::,2a07:9a07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:9a40::,2a07:9a47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:9a80::,2a07:9a87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:9ac0::,2a07:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:9b00::,2a07:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a07:9b40::,2a07:9b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9b80::,2a07:9b87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:9bc0::,2a07:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a07:9c00::,2a07:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:9c40::,2a07:9c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9c80::,2a07:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:9d00::,2a07:9d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:9d40::,2a07:9d47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9d80::,2a07:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9dc0::,2a07:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:9e00::,2a07:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9e40::,2a07:9e47:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:9e80::,2a07:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9ec0::,2a07:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9f00::,2a07:9f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:9f40::,2a07:9f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9f80::,2a07:9f87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:9fc0::,2a07:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a000::,2a07:a007:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:a040::,2a07:a047:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:a080::,2a07:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:a0c0::,2a07:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:a100::,2a07:a107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a140::,2a07:a147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a180::,2a07:a187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:a1c0::,2a07:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a200::,2a07:a207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:a240::,2a07:a247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a280::,2a07:a287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:a2c0::,2a07:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:a300::,2a07:a307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a340::,2a07:a347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:a380::,2a07:a387:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:a3c0::,2a07:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:a400::,2a07:a407:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:a440::,2a07:a447:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:a480::,2a07:a487:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:a4c0::,2a07:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:a500::,2a07:a507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:a540::,2a07:a547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a580::,2a07:a587:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:a5c0::,2a07:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a600::,2a07:a607:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:a640::,2a07:a647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a680::,2a07:a687:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:a6c0::,2a07:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:a700::,2a07:a707:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a07:a740::,2a07:a747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:a780::,2a07:a787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:a7c0::,2a07:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:a800::,2a07:a807:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a07:a840::,2a07:a847:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:a880::,2a07:a887:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:a8c0::,2a07:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:a900::,2a07:a905:ffef:ffff:ffff:ffff:ffff:ffff,GB -2a07:a905:fff0::,2a07:a905:fff0:ffff:ffff:ffff:ffff:ffff,US -2a07:a905:fff1::,2a07:a907:50b:ffff:ffff:ffff:ffff:ffff,GB -2a07:a907:50c::,2a07:a907:50c:7fff:ffff:ffff:ffff:ffff,DE -2a07:a907:50c:8000::,2a07:a907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:a940::,2a07:a947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:a980::,2a07:a987:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:a9c0::,2a07:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:aa00::,2a07:aa07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:aa40::,2a07:aa47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:aa80::,2a07:aa87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:aac0::,2a07:aac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:ab00::,2a07:ab07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:ab40::,2a07:ab47:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a07:ab80::,2a07:ab87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:abc0::,2a07:abc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:ac00::,2a07:ac07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:ac40::,2a07:ac47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:ac80::,2a07:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:acc0::,2a07:acc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:ad00::,2a07:ad07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:ad40::,2a07:ad47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:ad80::,2a07:ad87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:adc0::,2a07:adc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:ae00::,2a07:ae07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:ae40::,2a07:ae47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a07:ae80::,2a07:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:aec0::,2a07:aec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:af00::,2a07:af07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:af40::,2a07:af47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:af80::,2a07:af87:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a07:afc0::,2a07:afc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:b000::,2a07:b007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b040::,2a07:b047:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b080::,2a07:b087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:b0c0::,2a07:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:b100::,2a07:b107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:b140::,2a07:b147:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:b180::,2a07:b187:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:b1c0::,2a07:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:b200::,2a07:b207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:b240::,2a07:b247:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:b280::,2a07:b287:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:b2c0::,2a07:b2c5:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b2c6::,2a07:b2c6:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2a07:b2c7::,2a07:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b300::,2a07:b307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b340::,2a07:b347:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:b380::,2a07:b387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:b3c0::,2a07:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:b400::,2a07:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b440::,2a07:b447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b480::,2a07:b487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b4c0::,2a07:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:b500::,2a07:b507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:b540::,2a07:b547:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:b580::,2a07:b587:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:b5c0::,2a07:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:b600::,2a07:b607:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:b640::,2a07:b647:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:b680::,2a07:b687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b6c0::,2a07:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:b700::,2a07:b707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b740::,2a07:b747:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:b780::,2a07:b787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:b7c0::,2a07:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a07:b800::,2a07:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:b840::,2a07:b847:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:b880::,2a07:b887:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:b8c0::,2a07:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:b8c1::,2a07:b8c1:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:b8c2::,2a07:b8c2:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:b8c3::,2a07:b8c3:ffff:ffff:ffff:ffff:ffff:ffff,BR -2a07:b8c4::,2a07:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:b900::,2a07:b907:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:b940::,2a07:b947:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:b980::,2a07:b987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:b9c0::,2a07:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:ba00::,2a07:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a07:ba40::,2a07:ba47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:ba80::,2a07:ba87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:bac0::,2a07:bac7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:bb00::,2a07:bb07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:bb40::,2a07:bb47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:bb80::,2a07:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:bbc0::,2a07:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:bc00::,2a07:bc07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:bc40::,2a07:bc47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:bc80::,2a07:bc87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:bcc0::,2a07:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:bd00::,2a07:bd07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:bd40::,2a07:bd47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:bd80::,2a07:bd87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a07:bdc0::,2a07:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:be00::,2a07:be07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:be40::,2a07:be47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:be80::,2a07:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:bec0::,2a07:bec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:bf00::,2a07:bf07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:bf40::,2a07:bf47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:bf80::,2a07:bf87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:bfc0::,2a07:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c000::,2a07:c007:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:c040::,2a07:c047:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:c080::,2a07:c087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:c0c0::,2a07:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a07:c100::,2a07:c107:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a07:c140::,2a07:c147:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a07:c180::,2a07:c187:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a07:c1c0::,2a07:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:c200::,2a07:c207:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:c240::,2a07:c247:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:c280::,2a07:c287:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:c2c0::,2a07:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:c300::,2a07:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c340::,2a07:c347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:c380::,2a07:c387:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a07:c3c0::,2a07:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a07:c400::,2a07:c407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:c440::,2a07:c447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:c480::,2a07:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c4c0::,2a07:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:c500::,2a07:c507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:c540::,2a07:c547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c580::,2a07:c587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:c5c0::,2a07:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c600::,2a07:c607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c640::,2a07:c647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c680::,2a07:c687:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:c6c0::,2a07:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:c700::,2a07:c707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:c780::,2a07:c787:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:c7c0::,2a07:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:c840::,2a07:c847:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a07:c880::,2a07:c887:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a07:c8c0::,2a07:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:c900::,2a07:c907:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a07:c940::,2a07:c947:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:c980::,2a07:c987:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:c9c0::,2a07:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:ca00::,2a07:ca07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a07:ca40::,2a07:ca47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a07:ca80::,2a07:ca87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a07:cac0::,2a07:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a07:cb00::,2a07:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:cb40::,2a07:cb47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:d000::,2a07:d0ff:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a08::,2a08:1fff:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a::,2a0a:7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:40::,2a0a:47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:80::,2a0a:87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:c0::,2a0a:c7:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:100::,2a0a:107:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:140::,2a0a:147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:180::,2a0a:187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:1c0::,2a0a:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:200::,2a0a:200:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0a:240::,2a0a:247:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:280::,2a0a:287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:2c0::,2a0a:2c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:300::,2a0a:307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:340::,2a0a:347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:380::,2a0a:387:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:3c0::,2a0a:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:400::,2a0a:400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:440::,2a0a:447:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:480::,2a0a:487:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:4c0::,2a0a:4c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:500::,2a0a:507:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:540::,2a0a:547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:580::,2a0a:580:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:5c0::,2a0a:5c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:600::,2a0a:607:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:640::,2a0a:647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:680::,2a0a:687:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:6c0::,2a0a:6c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:700::,2a0a:707:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:740::,2a0a:747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:780::,2a0a:780:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7c0::,2a0a:7c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:800::,2a0a:807:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:840::,2a0a:847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:880::,2a0a:880:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8c0::,2a0a:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:900::,2a0a:907:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:940::,2a0a:947:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:980::,2a0a:987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:9c0::,2a0a:9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a00::,2a0a:a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a40::,2a0a:a43:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:a80::,2a0a:a87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:ac0::,2a0a:ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a0a:b00::,2a0a:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:b40::,2a0a:b47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:b80::,2a0a:b87:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0a:bc0::,2a0a:bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:c00::,2a0a:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c40::,2a0a:c47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:c80::,2a0a:c87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:cc0::,2a0a:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:d00::,2a0a:d07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:d40::,2a0a:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:d80::,2a0a:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:dc0::,2a0a:dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:e00::,2a0a:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e40::,2a0a:e47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e80::,2a0a:e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:ec0::,2a0a:ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f00::,2a0a:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:f40::,2a0a:f40:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:f80::,2a0a:f87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:fc0::,2a0a:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:1000::,2a0a:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:1040::,2a0a:1047:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:10c0::,2a0a:10c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:1100::,2a0a:1107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:1140::,2a0a:1147:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1180::,2a0a:1187:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:11c0::,2a0a:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:1200::,2a0a:1207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1240::,2a0a:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1280::,2a0a:1287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:12c0::,2a0a:12c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1300::,2a0a:1307:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1340::,2a0a:1347:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0a:1380::,2a0a:1387:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:13c0::,2a0a:13c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1400::,2a0a:1407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:1440::,2a0a:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1480::,2a0a:1487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:14c0::,2a0a:14c0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:1500::,2a0a:1507:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1540::,2a0a:1547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:1580::,2a0a:1587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:15c0::,2a0a:15c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1600::,2a0a:1607:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:1640::,2a0a:1647:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1680::,2a0a:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:16c0::,2a0a:16c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:1700::,2a0a:1707:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:1740::,2a0a:1747:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1780::,2a0a:1787:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:17c0::,2a0a:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:1800::,2a0a:1800:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:1840::,2a0a:1847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1880::,2a0a:1887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:18c0::,2a0a:18c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:1900::,2a0a:1907:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0a:1940::,2a0a:1947:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:1980::,2a0a:1987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:19c0::,2a0a:19c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1a00::,2a0a:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:1a40::,2a0a:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1a80::,2a0a:1a87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:1ac0::,2a0a:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:1b00::,2a0a:1b07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:1b40::,2a0a:1b40:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0a:1b80::,2a0a:1b87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1bc0::,2a0a:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1c00::,2a0a:1c07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:1c40::,2a0a:1c47:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:1c80::,2a0a:1c87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:1cc0::,2a0a:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:1d00::,2a0a:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:1d40::,2a0a:1d40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1d80::,2a0a:1d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:1dc0::,2a0a:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:1e00::,2a0a:1e07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:1e40::,2a0a:1e40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:1e80::,2a0a:1e87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:1ec0::,2a0a:1ec1:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:1f00::,2a0a:1f07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:1f40::,2a0a:1f42:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:1f43::,2a0a:1f44:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:1f45::,2a0a:1f47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:1f80::,2a0a:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:1fc0::,2a0a:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2000::,2a0a:2007:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:2040::,2a0a:2047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:2080::,2a0a:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:20c0::,2a0a:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:2100::,2a0a:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2140::,2a0a:2147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2180::,2a0a:2187:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:21c0::,2a0a:21c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:2200::,2a0a:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:2240::,2a0a:2247:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:2280::,2a0a:2287:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:22c0::,2a0a:22c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:2340::,2a0a:2347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2380::,2a0a:2380:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0a:23c0::,2a0a:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:2400::,2a0a:2400:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:2440::,2a0a:2440:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:2480::,2a0a:2487:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:24c0::,2a0a:24c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:2500::,2a0a:2500:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:2540::,2a0a:2547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2580::,2a0a:2587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:25c0::,2a0a:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:2600::,2a0a:2607:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0a:2640::,2a0a:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2680::,2a0a:2687:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:26c0::,2a0a:26c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:2700::,2a0a:2707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2740::,2a0a:2747:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a0a:2780::,2a0a:2783:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:2784::,2a0a:2784:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:2785::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:27c0::,2a0a:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:2800::,2a0a:2807:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:2840::,2a0a:2847:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0a:2880::,2a0a:2887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:28c0::,2a0a:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:2900::,2a0a:2907:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0a:2940::,2a0a:2947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:2980::,2a0a:2987:ffff:ffff:ffff:ffff:ffff:ffff,TJ -2a0a:29c0::,2a0a:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:2a00::,2a0a:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:2a40::,2a0a:2a47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:2a80::,2a0a:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:2ac0::,2a0a:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:2b00::,2a0a:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2b40::,2a0a:2b47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2b80::,2a0a:2b87:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:2bc0::,2a0a:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2c00::,2a0a:2c07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:2c40::,2a0a:2c47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2c80::,2a0a:2c87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:2cc0::,2a0a:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:2d00::,2a0a:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2d40::,2a0a:2d47:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:2d80::,2a0a:2d87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:2dc0::,2a0a:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:2e00::,2a0a:2e07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:2e40::,2a0a:2e47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:2e80::,2a0a:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:2ec0::,2a0a:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:2f00::,2a0a:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:2f40::,2a0a:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:2f80::,2a0a:2f80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:2fc0::,2a0a:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:3000::,2a0a:3000:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3040::,2a0a:3047:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:3080::,2a0a:3087:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:30c0::,2a0a:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:3100::,2a0a:3107:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:3140::,2a0a:3147:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:3180::,2a0a:3187:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:31c0::,2a0a:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:3200::,2a0a:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:3240::,2a0a:3240:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0a:3280::,2a0a:3287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:32c0::,2a0a:32c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3300::,2a0a:3307:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:3340::,2a0a:3347:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:3380::,2a0a:3387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:33c0::,2a0a:33c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3400::,2a0a:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:3440::,2a0a:3447:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a0a:3480::,2a0a:3487:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:34c0::,2a0a:34c3:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:3500::,2a0a:3507:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:3540::,2a0a:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:3580::,2a0a:3587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:35c0::,2a0a:35c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:3600::,2a0a:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:3640::,2a0a:3647:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:3680::,2a0a:3687:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0a:36c0::,2a0a:36c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:3700::,2a0a:3707:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:3740::,2a0a:3747:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:3780::,2a0a:3787:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:37c0::,2a0a:37c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:3800::,2a0a:3807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:3840::,2a0a:3847:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:3880::,2a0a:3887:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a0a:38c0::,2a0a:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:3900::,2a0a:3907:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:3940::,2a0a:3947:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a0a:3980::,2a0a:3980:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:39c0::,2a0a:39c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:3a00::,2a0a:3a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3a40::,2a0a:3a40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:3a80::,2a0a:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:3ac0::,2a0a:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3b00::,2a0a:3b00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3b40::,2a0a:3b47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3bc0::,2a0a:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:3c00::,2a0a:3c00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:3c40::,2a0a:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:3c80::,2a0a:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3cc0::,2a0a:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:3d00::,2a0a:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:3d40::,2a0a:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:3d80::,2a0a:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3dc0::,2a0a:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:3e00::,2a0a:3e07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:3e40::,2a0a:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:3e80::,2a0a:3e87:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:3ec0::,2a0a:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:3f00::,2a0a:3f00:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0a:3f40::,2a0a:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:3f80::,2a0a:3f80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:3fc0::,2a0a:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0a:4000::,2a0a:4007:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0a:4040::,2a0a:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:4080::,2a0a:4087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:40c0::,2a0a:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:4100::,2a0a:4107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4140::,2a0a:4147:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:4180::,2a0a:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:41c0::,2a0a:41c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:4200::,2a0a:4207:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:4240::,2a0a:4247:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4280::,2a0a:4287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:42c0::,2a0a:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:4300::,2a0a:4307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4340::,2a0a:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4380::,2a0a:4387:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:43c0::,2a0a:43c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:4400::,2a0a:4407:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0a:4440::,2a0a:4440:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:4480::,2a0a:4487:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:44c0::,2a0a:44c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:4500::,2a0a:4507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4540::,2a0a:4540:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:4580::,2a0a:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:45c0::,2a0a:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:4600::,2a0a:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4640::,2a0a:4647:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:4680::,2a0a:4687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:46c0::,2a0a:46c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:4700::,2a0a:4707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:4740::,2a0a:4747:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:4780::,2a0a:4787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:47c0::,2a0a:47c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:4800::,2a0a:4807:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:4840::,2a0a:4847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4880::,2a0a:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:48c0::,2a0a:48c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:4900::,2a0a:4907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:4940::,2a0a:4947:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:4980::,2a0a:4987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:49c0::,2a0a:49c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:4a00::,2a0a:4a07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:4a40::,2a0a:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:4a80::,2a0a:4a87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:4ac0::,2a0a:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:4b00::,2a0a:4b07:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:4b40::,2a0a:4b47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:4b80::,2a0a:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:4bc0::,2a0a:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4c00::,2a0a:4c06:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4c07::,2a0a:4c07::ffff:ffff:ffff:ffff:ffff,CA -2a0a:4c07:1::,2a0a:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4c40::,2a0a:4c40:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0a:4c80::,2a0a:4c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4cc0::,2a0a:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4d00::,2a0a:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:4d40::,2a0a:4d40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:4d80::,2a0a:4d87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:4dc0::,2a0a:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4e00::,2a0a:4e07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:4e40::,2a0a:4e47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:4e80::,2a0a:4e82:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4e83::,2a0a:4e83:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:4e84::,2a0a:4e87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:4ec0::,2a0a:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:4f00::,2a0a:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:4f40::,2a0a:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:4f80::,2a0a:4f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:4fc0::,2a0a:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:5000::,2a0a:5007:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0a:5040::,2a0a:5040:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5080::,2a0a:5087:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:50c0::,2a0a:50c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:5100::,2a0a:5107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:5140::,2a0a:5147:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5180::,2a0a:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:51c0::,2a0a:51c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:5200::,2a0a:5200:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:5240::,2a0a:5247:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:5280::,2a0a:5287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:52c0::,2a0a:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:5300::,2a0a:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5340::,2a0a:5347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:5380::,2a0a:5387:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:53c0::,2a0a:53c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:5400::,2a0a:5407:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:5440::,2a0a:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5480::,2a0a:5487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:54c0::,2a0a:54c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5500::,2a0a:5507:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:5540::,2a0a:5547:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:5580::,2a0a:5587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:55c0::,2a0a:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:5600::,2a0a:5607:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5640::,2a0a:5640:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:5680::,2a0a:5687:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:56c0::,2a0a:56c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:5700::,2a0a:5707:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0a:5740::,2a0a:5740:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5780::,2a0a:5780:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:57c0::,2a0a:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5800::,2a0a:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:5840::,2a0a:5840:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:5880::,2a0a:5887:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:58c0::,2a0a:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:5900::,2a0a:5907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:5940::,2a0a:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5980::,2a0a:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:59c0::,2a0a:59c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:5a00::,2a0a:5a07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:5a40::,2a0a:5a47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5a80::,2a0a:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:5ac0::,2a0a:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:5b00::,2a0a:5b07:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0a:5b40::,2a0a:5b47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:5b80::,2a0a:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:5bc0::,2a0a:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:5c00::,2a0a:5c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:5c40::,2a0a:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:5c80::,2a0a:5c87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:5cc0::,2a0a:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:5d00::,2a0a:5d00:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:5d40::,2a0a:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:5d80::,2a0a:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:5dc0::,2a0a:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:5e00::,2a0a:5e07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:5e40::,2a0a:5e40:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:5e80::,2a0a:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:5ec0::,2a0a:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:5f00::,2a0a:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:5f40::,2a0a:5f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:5f80::,2a0a:5f87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:5fc0::,2a0a:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:6000::,2a0a:6007:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:6040::,2a0a:6047:ffff:ffff:ffff:ffff:ffff:ffff,GL -2a0a:6080::,2a0a:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:60c0::,2a0a:60c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:6100::,2a0a:6107:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:6140::,2a0a:6147:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6180::,2a0a:6187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:61c0::,2a0a:61c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:6200::,2a0a:6200:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6240::,2a0a:6247:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:6280::,2a0a:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:62c0::,2a0a:62c0:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:6300::,2a0a:6307:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:6340::,2a0a:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:6380::,2a0a:6387:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:63c0::,2a0a:63c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6400::,2a0a:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:6440::,2a0a:6447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:6480::,2a0a:6487:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:64c0::,2a0a:64c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6500::,2a0a:6507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:6540::,2a0a:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:6580::,2a0a:6580:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:65c0::,2a0a:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6600::,2a0a:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:6640::,2a0a:6647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:6680::,2a0a:6680:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:66c0::,2a0a:66c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0a:6700::,2a0a:6707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:6740::,2a0a:6747:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:6780::,2a0a:6787:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:67c0::,2a0a:67c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6800::,2a0a:6807:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:6840::,2a0a:6847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6880::,2a0a:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:68c0::,2a0a:68c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6900::,2a0a:6907:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:6940::,2a0a:6947:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:6980::,2a0a:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:69c0::,2a0a:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:6a00::,2a0a:6a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0a:6a40::,2a0a:6a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:6a80::,2a0a:6a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6ac0::,2a0a:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:6b00::,2a0a:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:6b40::,2a0a:6b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6b80::,2a0a:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:6bc0::,2a0a:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:6c00::,2a0a:6c07:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:6c40::,2a0a:6c47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:6c80::,2a0a:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6cc0::,2a0a:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:6d00::,2a0a:6d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:6d40::,2a0a:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:6d80::,2a0a:6d87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:6dc0::,2a0a:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:6e00::,2a0a:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6e40::,2a0a:6e47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:6e80::,2a0a:6e87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:6ec0::,2a0a:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:6f00::,2a0a:6f07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:6f40::,2a0a:6f47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:6f80::,2a0a:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:6fc0::,2a0a:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7000::,2a0a:7007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7040::,2a0a:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7080::,2a0a:7087:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:70c0::,2a0a:70c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:7100::,2a0a:7107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7140::,2a0a:7147:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7180::,2a0a:7187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:71c0::,2a0a:71c0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:7200::,2a0a:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7240::,2a0a:7240:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7280::,2a0a:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:72c0::,2a0a:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7300::,2a0a:7300:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:7340::,2a0a:7347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7380::,2a0a:7387:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a0a:73c0::,2a0a:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:7400::,2a0a:7407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:7440::,2a0a:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7480::,2a0a:7487:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:74c0::,2a0a:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:7500::,2a0a:7500:ffff:ffff:ffff:ffff:ffff:ffff,TJ -2a0a:7540::,2a0a:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7580::,2a0a:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:75c0::,2a0a:75c0:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:7600::,2a0a:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7640::,2a0a:7647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7680::,2a0a:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:76c0::,2a0a:76c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7700::,2a0a:7707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7740::,2a0a:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7780::,2a0a:7787:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:77c0::,2a0a:77c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7800::,2a0a:7807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:7840::,2a0a:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7880::,2a0a:7887:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:78c0::,2a0a:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:7900::,2a0a:7907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7940::,2a0a:7940:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:7980::,2a0a:7987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:79c0::,2a0a:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:7a00::,2a0a:7a04:7fff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7a04:8000::,2a0a:7a04:8000:ffff:ffff:ffff:ffff:ffff,US -2a0a:7a04:8001::,2a0a:7a04:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7a05::,2a0a:7a05:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:7a06::,2a0a:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7a40::,2a0a:7a47:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:7a80::,2a0a:7a80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7ac0::,2a0a:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:7b00::,2a0a:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7b40::,2a0a:7b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:7b80::,2a0a:7b87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:7bc0::,2a0a:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7c00::,2a0a:7c07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:7c40::,2a0a:7c40:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:7c80::,2a0a:7c80:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:7cc0::,2a0a:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7d00::,2a0a:7d07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:7d40::,2a0a:7d40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:7d80::,2a0a:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0a:7dc0::,2a0a:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7e00::,2a0a:7e03:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7e04::,2a0a:7e04::ffff:ffff:ffff:ffff:ffff,US -2a0a:7e04:1::,2a0a:7e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7e40::,2a0a:7e47:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:7e80::,2a0a:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7ec0::,2a0a:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:7f00::,2a0a:7f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:7f40::,2a0a:7f47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:7f80::,2a0a:7f87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:7fc0::,2a0a:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8000::,2a0a:8007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:8040::,2a0a:8047:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8080::,2a0a:8087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:80c0::,2a0a:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8140::,2a0a:8140:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:8180::,2a0a:8187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:81c0::,2a0a:81c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:8200::,2a0a:8207:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:8240::,2a0a:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:8280::,2a0a:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:82c0::,2a0a:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8300::,2a0a:8307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8340::,2a0a:8347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8380::,2a0a:8387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:83c0::,2a0a:83c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8400::,2a0a:8407:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:8440::,2a0a:8447:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8480::,2a0a:8480:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:84c0::,2a0a:84c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8500::,2a0a:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8540::,2a0a:8547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8580::,2a0a:8587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:85c0::,2a0a:85c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8600::,2a0a:8604:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8605::,2a0a:8605::ffff:ffff:ffff:ffff:ffff,US -2a0a:8605:1::,2a0a:8605:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8606::,2a0a:8606:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8607::,2a0a:8607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:8640::,2a0a:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8680::,2a0a:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:86c0::,2a0a:86c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:8700::,2a0a:8707:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:8740::,2a0a:8747:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:8780::,2a0a:8787:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:87c0::,2a0a:87c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:8800::,2a0a:8807:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:8840::,2a0a:8847:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:8880::,2a0a:8887:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:88c0::,2a0a:88c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8900::,2a0a:8907:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:8940::,2a0a:8947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8980::,2a0a:8987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:89c0::,2a0a:89c7:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0a:8a00::,2a0a:8a00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:8a40::,2a0a:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:8a80::,2a0a:8a87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8ac0::,2a0a:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8b00::,2a0a:8b07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:8b40::,2a0a:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:8b80::,2a0a:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8bc0::,2a0a:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:8c00::,2a0a:8c07:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:8c40::,2a0a:8c47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:8c80::,2a0a:8c87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:8cc0::,2a0a:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:8d00::,2a0a:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8d40::,2a0a:8d47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:8d80::,2a0a:8d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8dc0::,2a0a:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:8e00::,2a0a:8e01:1236:ffff:ffff:ffff:ffff:ffff,US -2a0a:8e01:1237::,2a0a:8e01:1237:ffff:ffff:ffff:ffff:ffff,CA -2a0a:8e01:1238::,2a0a:8e07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:8e40::,2a0a:8e47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:8e80::,2a0a:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:8ec0::,2a0a:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8f00::,2a0a:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8f40::,2a0a:8f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:8f80::,2a0a:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:8fc0::,2a0a:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:9000::,2a0a:9007:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0a:9040::,2a0a:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9080::,2a0a:9087:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:90c0::,2a0a:90c7:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:9100::,2a0a:9107:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:9140::,2a0a:9140:ffff:ffff:ffff:ffff:ffff:ffff,CA -2a0a:9141::,2a0a:9147:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9180::,2a0a:9180:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:91c0::,2a0a:91c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:9200::,2a0a:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9201::,2a0a:9201:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:9202::,2a0a:9202:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9203::,2a0a:9203:ffff:ffff:ffff:ffff:ffff:ffff,CA -2a0a:9204::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US -2a0a:9204:ab6d::,2a0a:9204:ab6d:ffff:ffff:ffff:ffff:ffff,CA -2a0a:9204:ab6e::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9240::,2a0a:9247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9280::,2a0a:9287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:92c0::,2a0a:92c7:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0a:9300::,2a0a:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:9340::,2a0a:9340:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:9380::,2a0a:9387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:93c0::,2a0a:93c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9400::,2a0a:9407:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:9440::,2a0a:9447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:9480::,2a0a:9480:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:94c0::,2a0a:94c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:9500::,2a0a:9507:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:9540::,2a0a:9547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:9580::,2a0a:9587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:95c0::,2a0a:95c0:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:9600::,2a0a:9603:49cd:ffff:ffff:ffff:ffff:ffff,US -2a0a:9603:49ce::,2a0a:9603:49ce:ffff:ffff:ffff:ffff:ffff,CA -2a0a:9603:49cf::,2a0a:9607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9640::,2a0a:9647:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:9680::,2a0a:9687:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:96c0::,2a0a:96c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9700::,2a0a:9700:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:9740::,2a0a:9740:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:9780::,2a0a:9787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:97c0::,2a0a:97c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:9800::,2a0a:9807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9840::,2a0a:9847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:9880::,2a0a:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:98c0::,2a0a:98c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9900::,2a0a:9907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9940::,2a0a:9947:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:9980::,2a0a:9987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:99c0::,2a0a:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:9a00::,2a0a:9a02:b3d1:ffff:ffff:ffff:ffff:ffff,US -2a0a:9a02:b3d2::,2a0a:9a02:b3d2:ffff:ffff:ffff:ffff:ffff,CA -2a0a:9a02:b3d3::,2a0a:9a07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9a40::,2a0a:9a47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:9a80::,2a0a:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9ac0::,2a0a:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:9b00::,2a0a:9b07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9b40::,2a0a:9b47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:9b80::,2a0a:9b80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:9bc0::,2a0a:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9c00::,2a0a:9c07:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:9c40::,2a0a:9c47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:9c80::,2a0a:9c80:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:9cc0::,2a0a:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:9d00::,2a0a:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:9d40::,2a0a:9d47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:9d80::,2a0a:9d87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9dc0::,2a0a:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:9e00::,2a0a:9e07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9e40::,2a0a:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:9e80::,2a0a:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9ec0::,2a0a:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:9f00::,2a0a:9f07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:9f40::,2a0a:9f47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:9f80::,2a0a:9f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:9fc0::,2a0a:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:a000::,2a0a:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a040::,2a0a:a047:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:a080::,2a0a:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:a0c0::,2a0a:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a0a:a100::,2a0a:a100:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a140::,2a0a:a147:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0a:a180::,2a0a:a180:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:a1c0::,2a0a:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:a200::,2a0a:a207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a280::,2a0a:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a2c0::,2a0a:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:a300::,2a0a:a307:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:a340::,2a0a:a347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:a380::,2a0a:a387:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:a3c0::,2a0a:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a400::,2a0a:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:a440::,2a0a:a447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:a480::,2a0a:a487:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:a4c0::,2a0a:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:a500::,2a0a:a507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a540::,2a0a:a540:29df:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a540:29e0::,2a0a:a540:29e0:7fff:ffff:ffff:ffff:ffff,US -2a0a:a540:29e0:8000::,2a0a:a547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a580::,2a0a:a587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:a5c0::,2a0a:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a600::,2a0a:a607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:a640::,2a0a:a640:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a680::,2a0a:a687:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:a6c0::,2a0a:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a700::,2a0a:a707:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:a740::,2a0a:a747:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0a:a780::,2a0a:a787:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:a7c0::,2a0a:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:a800::,2a0a:a807:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:a840::,2a0a:a847:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:a880::,2a0a:a887:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:a8c0::,2a0a:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a900::,2a0a:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:a940::,2a0a:a947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:a980::,2a0a:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:a9c0::,2a0a:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:aa00::,2a0a:aa03:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0a:aa40::,2a0a:aa47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:aa80::,2a0a:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IM -2a0a:aac0::,2a0a:aac0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:ab00::,2a0a:ab07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ab40::,2a0a:ab47:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a0a:ab80::,2a0a:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:abc0::,2a0a:abc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:ac00::,2a0a:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:ac40::,2a0a:ac40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:ac80::,2a0a:ac87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:acc0::,2a0a:acc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:ad00::,2a0a:ad07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:ad40::,2a0a:ad47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ad80::,2a0a:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:adc0::,2a0a:adc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:ae00::,2a0a:ae07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:ae40::,2a0a:ae47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:ae80::,2a0a:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:aec0::,2a0a:aec7:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a0a:af00::,2a0a:af07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:af40::,2a0a:af47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:af80::,2a0a:af87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:afc0::,2a0a:afc7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:b000::,2a0a:b000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b040::,2a0a:b047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:b080::,2a0a:b087:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:b0c0::,2a0a:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:b100::,2a0a:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b140::,2a0a:b140:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a0a:b180::,2a0a:b187:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:b1c0::,2a0a:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b200::,2a0a:b207:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:b240::,2a0a:b247:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:b280::,2a0a:b287:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:b2c0::,2a0a:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:b300::,2a0a:b307:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:b340::,2a0a:b347:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:b380::,2a0a:b387:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b3c0::,2a0a:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:b400::,2a0a:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:b440::,2a0a:b447:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b480::,2a0a:b487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b4c0::,2a0a:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:b500::,2a0a:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:b540::,2a0a:b540:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:b580::,2a0a:b587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b5c0::,2a0a:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0a:b600::,2a0a:b607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:b640::,2a0a:b640::ffff:ffff:ffff:ffff:ffff,GB -2a0a:b640:1::,2a0a:b640:1:ffff:ffff:ffff:ffff:ffff,SG -2a0a:b640:2::,2a0a:b647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:b680::,2a0a:b687:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:b6c0::,2a0a:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:b740::,2a0a:b747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:b780::,2a0a:b787:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:b7c0::,2a0a:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:b800::,2a0a:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b840::,2a0a:b847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:b880::,2a0a:b887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:b8c0::,2a0a:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:b900::,2a0a:b907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b940::,2a0a:b947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b980::,2a0a:b980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:b9c0::,2a0a:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ba00::,2a0a:ba07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:ba40::,2a0a:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:ba80::,2a0a:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:bac0::,2a0a:bac7:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a0a:bb00::,2a0a:bb07:ffff:ffff:ffff:ffff:ffff:ffff,LI -2a0a:bb40::,2a0a:bb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:bb80::,2a0a:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:bbc0::,2a0a:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:bc00::,2a0a:bc07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:bc40::,2a0a:bc40:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:bc80::,2a0a:bc87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:bcc0::,2a0a:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:bd00::,2a0a:bd00:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:bd40::,2a0a:bd47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:bd80::,2a0a:bd80:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:bdc0::,2a0a:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:be00::,2a0a:be07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:be40::,2a0a:be47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:be80::,2a0a:be87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:bec0::,2a0a:bec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:bf00::,2a0a:bf07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:bf40::,2a0a:bf47:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0a:bf80::,2a0a:bf87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:bfc0::,2a0a:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:c000::,2a0a:c007:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:c040::,2a0a:c047:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:c080::,2a0a:c087:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:c0c0::,2a0a:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:c100::,2a0a:c107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:c140::,2a0a:c140:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:c180::,2a0a:c187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c1c0::,2a0a:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:c200::,2a0a:c207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c240::,2a0a:c240:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c280::,2a0a:c287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:c2c0::,2a0a:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:c300::,2a0a:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c340::,2a0a:c340:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:c380::,2a0a:c387:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:c3c0::,2a0a:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c400::,2a0a:c407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c440::,2a0a:c447:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:c480::,2a0a:c487:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0a:c4c0::,2a0a:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:c500::,2a0a:c507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c540::,2a0a:c547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:c580::,2a0a:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:c5c0::,2a0a:c5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c600::,2a0a:c607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:c640::,2a0a:c647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c680::,2a0a:c687:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:c6c0::,2a0a:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:c700::,2a0a:c707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:c740::,2a0a:c747:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a0a:c780::,2a0a:c787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:c7c0::,2a0a:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:c800::,2a0a:c800:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:c801::,2a0a:c807:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:c840::,2a0a:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:c880::,2a0a:c880:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:c8c0::,2a0a:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0a:c900::,2a0a:c907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c940::,2a0a:c940:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:c980::,2a0a:c987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:c9c0::,2a0a:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a0a:ca00::,2a0a:ca00:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:ca40::,2a0a:ca47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:ca80::,2a0a:ca87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:cac0::,2a0a:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:cb00::,2a0a:cb07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:cb40::,2a0a:cb47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:cb80::,2a0a:cb80:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:cbc0::,2a0a:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0a:cc00::,2a0a:cc07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:cc40::,2a0a:cc47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:cc80::,2a0a:cc87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:ccc0::,2a0a:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:cd00::,2a0a:cd00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:cd40::,2a0a:cd47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:cd80::,2a0a:cd87:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:cdc0::,2a0a:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:ce00::,2a0a:ce07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:ce40::,2a0a:ce47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:ce80::,2a0a:ce87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:cec0::,2a0a:cec7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:cf00::,2a0a:cf07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:cf40::,2a0a:cf47:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0a:cf80::,2a0a:cf87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:cfc0::,2a0a:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:d000::,2a0a:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:d040::,2a0a:d047:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:d080::,2a0a:d087:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:d0c0::,2a0a:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:d100::,2a0a:d107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:d140::,2a0a:d147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:d180::,2a0a:d187:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0a:d1c0::,2a0a:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:d200::,2a0a:d207:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:d240::,2a0a:d247:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:d280::,2a0a:d287:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:d2c0::,2a0a:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:d300::,2a0a:d307:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:d340::,2a0a:d347:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:d380::,2a0a:d387:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:d3c0::,2a0a:d3c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:d400::,2a0a:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:d440::,2a0a:d447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:d480::,2a0a:d487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:d4c0::,2a0a:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:d500::,2a0a:d507:ffff:ffff:ffff:ffff:ffff:ffff,FO -2a0a:d540::,2a0a:d547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:d580::,2a0a:d587:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:d5c0::,2a0a:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:d600::,2a0a:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:d640::,2a0a:d647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:d6c0::,2a0a:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:d700::,2a0a:d707:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:d740::,2a0a:d747:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:d780::,2a0a:d787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:d7c0::,2a0a:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:d800::,2a0a:d807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:d840::,2a0a:d847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:d880::,2a0a:d887:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:d8c0::,2a0a:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0a:d900::,2a0a:d900:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:d940::,2a0a:d947:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0a:d980::,2a0a:d987:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:d9c0::,2a0a:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:da00::,2a0a:da00:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a0a:da40::,2a0a:da47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:da80::,2a0a:da87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:dac0::,2a0a:dac7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:db00::,2a0a:db00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:db40::,2a0a:db47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:db80::,2a0a:db87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:dbc0::,2a0a:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:dc00::,2a0a:dc07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:dc40::,2a0a:dc47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:dc80::,2a0a:dc87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:dcc0::,2a0a:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:dd00::,2a0a:dd07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:dd40::,2a0a:dd47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:dd80::,2a0a:dd87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:ddc0::,2a0a:ddc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:de00::,2a0a:de00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:de40::,2a0a:de40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:de80::,2a0a:de80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:dec0::,2a0a:dec7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:df00::,2a0a:df07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:df40::,2a0a:df47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:df80::,2a0a:df87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:dfc0::,2a0a:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e000::,2a0a:e007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:e040::,2a0a:e047:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:e080::,2a0a:e087:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:e0c0::,2a0a:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:e100::,2a0a:e107:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:e140::,2a0a:e147:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:e180::,2a0a:e187:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e1c0::,2a0a:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e240::,2a0a:e247:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:e280::,2a0a:e287:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0a:e2c0::,2a0a:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:e300::,2a0a:e303:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a0a:e340::,2a0a:e347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:e380::,2a0a:e387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:e3c0::,2a0a:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:e400::,2a0a:e407:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:e440::,2a0a:e447:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:e480::,2a0a:e487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e4c0::,2a0a:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:e500::,2a0a:e500:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e540::,2a0a:e547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e580::,2a0a:e587:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:e5c0::,2a0a:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:e600::,2a0a:e600:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:e640::,2a0a:e647:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:e680::,2a0a:e687:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:e6c0::,2a0a:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:e700::,2a0a:e700:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:e740::,2a0a:e747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e780::,2a0a:e787:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:e7c0::,2a0a:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e800::,2a0a:e807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:e840::,2a0a:e847:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:e880::,2a0a:e887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:e8c0::,2a0a:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:e900::,2a0a:e907:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:e940::,2a0a:e947:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:e980::,2a0a:e987:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0a:e9c0::,2a0a:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ea00::,2a0a:ea00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:ea40::,2a0a:ea47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:ea80::,2a0a:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:eac0::,2a0a:eac7:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0a:eb00::,2a0a:eb07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:eb40::,2a0a:eb47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:eb80::,2a0a:eb80:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:ebc0::,2a0a:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:ec00::,2a0a:ec07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:ec40::,2a0a:ec40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:ec80::,2a0a:ec87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0a:ecc0::,2a0a:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:ed00::,2a0a:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0a:ed40::,2a0a:ed47:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:edc0::,2a0a:edc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:ee00::,2a0a:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0a:ee40::,2a0a:ee40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ee80::,2a0a:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:eec0::,2a0a:eec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:ef00::,2a0a:ef07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0a:ef40::,2a0a:ef47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:ef80::,2a0a:ef87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:efc0::,2a0a:efc7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:f000::,2a0a:f000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:f040::,2a0a:f047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:f080::,2a0a:f087:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f0c0::,2a0a:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:f100::,2a0a:f100:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0a:f140::,2a0a:f140:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f180::,2a0a:f187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:f1c0::,2a0a:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:f200::,2a0a:f207:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:f240::,2a0a:f247:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0a:f280::,2a0a:f287:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:f2c0::,2a0a:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f300::,2a0a:f307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:f340::,2a0a:f347:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:f380::,2a0a:f387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:f3c0::,2a0a:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:f400::,2a0a:f407:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:f440::,2a0a:f447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:f480::,2a0a:f487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:f4c0::,2a0a:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:f500::,2a0a:f500:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0a:f540::,2a0a:f547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:f580::,2a0a:f587:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:f5c0::,2a0a:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0a:f600::,2a0a:f607:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:f640::,2a0a:f647:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:f680::,2a0a:f687:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:f6c0::,2a0a:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f700::,2a0a:f707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:f740::,2a0a:f747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:f780::,2a0a:f787:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:f7c0::,2a0a:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a0a:f800::,2a0a:f807:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0a:f840::,2a0a:f847:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0a:f880::,2a0a:f887:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:f8c0::,2a0a:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0a:f900::,2a0a:f907:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0a:f940::,2a0a:f940:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:f980::,2a0a:f987:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0a:fa00::,2a0a:fa07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0a:fa40::,2a0a:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:fa80::,2a0a:fa87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:fac0::,2a0a:fac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:fb00::,2a0a:fb00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0a:fb40::,2a0a:fb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:fb80::,2a0a:fb87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0a:fbc0::,2a0a:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0a:fc00::,2a0a:fc07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:fc40::,2a0a:fc47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:fc80::,2a0a:fc80:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:fcc0::,2a0a:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0a:fd00::,2a0a:fd00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:fd40::,2a0a:fd40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0a:fd80::,2a0a:fd87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:fdc0::,2a0a:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0a:fe00::,2a0a:fe03:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0a:fe40::,2a0a:fe47:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:fe80::,2a0a:fe87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0a:fec0::,2a0a:fec7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0a:ff00::,2a0a:ff00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:ff40::,2a0a:ff47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0a:ff80::,2a0a:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0a:ffc0::,2a0a:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b::,2a0b:7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:40::,2a0b:47:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:80::,2a0b:87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:c0::,2a0b:c7:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0b:100::,2a0b:107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:140::,2a0b:147:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:180::,2a0b:187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1c0::,2a0b:1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:200::,2a0b:207:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:240::,2a0b:247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:280::,2a0b:287:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:2c0::,2a0b:2c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:300::,2a0b:307:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:340::,2a0b:347:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:380::,2a0b:387:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:3c0::,2a0b:3c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:400::,2a0b:407:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:440::,2a0b:447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:480::,2a0b:487:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:4c0::,2a0b:4c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:540::,2a0b:547:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:580::,2a0b:580:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:5c0::,2a0b:5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:600::,2a0b:600:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:640::,2a0b:643:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:680::,2a0b:687:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:6c0::,2a0b:6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:700::,2a0b:707:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:740::,2a0b:747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:780::,2a0b:787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7c0::,2a0b:7c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:800::,2a0b:807:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:840::,2a0b:847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:880::,2a0b:880:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:8c0::,2a0b:8c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:900::,2a0b:900:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:940::,2a0b:947:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:980::,2a0b:980:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9c0::,2a0b:9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:a00::,2a0b:a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:a40::,2a0b:a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:a80::,2a0b:a87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:ac0::,2a0b:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:b00::,2a0b:b07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:b40::,2a0b:b47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:b80::,2a0b:b87:ffe6:ffff:ffff:ffff:ffff:ffff,GB -2a0b:b87:ffe7::,2a0b:b87:ffe7:7fff:ffff:ffff:ffff:ffff,BE -2a0b:b87:ffe7:8000::,2a0b:b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:bc0::,2a0b:bc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:c00::,2a0b:c00:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0b:c40::,2a0b:c47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:c80::,2a0b:c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:cc0::,2a0b:cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:d00::,2a0b:d07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:d40::,2a0b:d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:d80::,2a0b:d87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:dc0::,2a0b:dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:e00::,2a0b:e07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:e40::,2a0b:e47:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:e80::,2a0b:e87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:ec0::,2a0b:ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f00::,2a0b:f07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:f40::,2a0b:f47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:f80::,2a0b:f87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:fc0::,2a0b:fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1000::,2a0b:1007:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:1040::,2a0b:1047:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:1080::,2a0b:1087:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:10c0::,2a0b:10c7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:1100::,2a0b:1107:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:1140::,2a0b:1147:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:1180::,2a0b:1187:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:11c0::,2a0b:11c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:1200::,2a0b:1207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:1240::,2a0b:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1280::,2a0b:1287:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:12c0::,2a0b:12c7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:1300::,2a0b:1307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1340::,2a0b:1347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1380::,2a0b:1387:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:13c0::,2a0b:13c7:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a0b:1400::,2a0b:1407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1440::,2a0b:1440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1480::,2a0b:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:14c0::,2a0b:14c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1500::,2a0b:1507:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:1540::,2a0b:1547:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:1580::,2a0b:1587:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:15c0::,2a0b:15c7:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a0b:1600::,2a0b:1607:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:1640::,2a0b:1647:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:1680::,2a0b:1680:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:16c0::,2a0b:16c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1700::,2a0b:1707:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:1740::,2a0b:1747:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1780::,2a0b:1787:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:17c0::,2a0b:17c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:1800::,2a0b:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:1840::,2a0b:1847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:1880::,2a0b:1887:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:18c0::,2a0b:18c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1900::,2a0b:1907:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:1940::,2a0b:1940:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0b:1980::,2a0b:1987:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0b:19c0::,2a0b:19c7:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:1a00::,2a0b:1a07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:1a40::,2a0b:1a40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1a80::,2a0b:1a87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1ac0::,2a0b:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1b00::,2a0b:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:1b40::,2a0b:1b47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:1b80::,2a0b:1b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:1bc0::,2a0b:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1c00::,2a0b:1c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1c40::,2a0b:1c47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:1c80::,2a0b:1c87:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a0b:1cc0::,2a0b:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1d00::,2a0b:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:1d40::,2a0b:1d40:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0b:1d80::,2a0b:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:1dc0::,2a0b:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:1e00::,2a0b:1e07:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:1e40::,2a0b:1e47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:1e80::,2a0b:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:1ec0::,2a0b:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:1f00::,2a0b:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:1f40::,2a0b:1f47:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0b:1f80::,2a0b:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:1fc0::,2a0b:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:2000::,2a0b:2007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2040::,2a0b:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:2080::,2a0b:2087:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:20c0::,2a0b:20c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2100::,2a0b:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:2140::,2a0b:2147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2180::,2a0b:2180:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:21c0::,2a0b:21c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2200::,2a0b:2207:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:2240::,2a0b:2247:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:2280::,2a0b:2287:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:22c0::,2a0b:22c7:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0b:2300::,2a0b:2300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2340::,2a0b:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:2380::,2a0b:2387:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:23c0::,2a0b:23c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:2400::,2a0b:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2440::,2a0b:2447:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:2480::,2a0b:2480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:24c0::,2a0b:24c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:2500::,2a0b:2507:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:2540::,2a0b:2547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2580::,2a0b:2587:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:25c0::,2a0b:25c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2600::,2a0b:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2640::,2a0b:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2680::,2a0b:2687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:26c0::,2a0b:26c7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:2700::,2a0b:2707:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2740::,2a0b:2747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2780::,2a0b:2787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:27c0::,2a0b:27c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2800::,2a0b:2807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:2840::,2a0b:2847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2880::,2a0b:2887:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:28c0::,2a0b:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2900::,2a0b:2900:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2940::,2a0b:2947:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:2980::,2a0b:2980:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:29c0::,2a0b:29c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:2a00::,2a0b:2a07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:2a40::,2a0b:2a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2a80::,2a0b:2a87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:2ac0::,2a0b:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:2b00::,2a0b:2b07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:2b40::,2a0b:2b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2b80::,2a0b:2b87:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:2bc0::,2a0b:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:2c00::,2a0b:2c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:2c40::,2a0b:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:2c80::,2a0b:2c87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2cc0::,2a0b:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:2d00::,2a0b:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:2d40::,2a0b:2d40:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:2d80::,2a0b:2d87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:2dc0::,2a0b:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:2e00::,2a0b:2e07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:2e40::,2a0b:2e47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:2e80::,2a0b:2e87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:2ec0::,2a0b:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:2f00::,2a0b:2f00:bd:ffff:ffff:ffff:ffff:ffff,RO -2a0b:2f00:be::,2a0b:2f00:be:7fff:ffff:ffff:ffff:ffff,BE -2a0b:2f00:be:8000::,2a0b:2f07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:2f40::,2a0b:2f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:2f80::,2a0b:2f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:2fc0::,2a0b:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:3000::,2a0b:3007:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:3040::,2a0b:3040:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:3080::,2a0b:3080:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:30c0::,2a0b:30c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:3100::,2a0b:3107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3140::,2a0b:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3180::,2a0b:3187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:31c0::,2a0b:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3200::,2a0b:3207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:3240::,2a0b:3240:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3280::,2a0b:3280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:32c0::,2a0b:32c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:3340::,2a0b:3347:ffff:ffff:ffff:ffff:ffff:ffff,TJ -2a0b:3380::,2a0b:3387:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:33c0::,2a0b:33c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3400::,2a0b:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3440::,2a0b:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:3480::,2a0b:3487:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:34c0::,2a0b:34c7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:3500::,2a0b:3500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:35c0::,2a0b:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:3640::,2a0b:3647:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:36c0::,2a0b:36c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:3740::,2a0b:3747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:37c0::,2a0b:37c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3840::,2a0b:3847:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:38c0::,2a0b:38c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:3900::,2a0b:3907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:3940::,2a0b:3947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3980::,2a0b:3980:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:39c0::,2a0b:39c7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:3a00::,2a0b:3a07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:3a40::,2a0b:3a40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3a80::,2a0b:3a80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:3ac0::,2a0b:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:3b00::,2a0b:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:3b40::,2a0b:3b47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3b80::,2a0b:3b87:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a0b:3bc0::,2a0b:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:3c00::,2a0b:3c07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:3c40::,2a0b:3c47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:3c80::,2a0b:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3cc0::,2a0b:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:3d00::,2a0b:3d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3d40::,2a0b:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a0b:3d80::,2a0b:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3dc0::,2a0b:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:3e00::,2a0b:3e00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3e40::,2a0b:3e47:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0b:3e80::,2a0b:3e87:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:3ec0::,2a0b:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:3f00::,2a0b:3f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:3f40::,2a0b:3f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:3f80::,2a0b:3f87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:3fc0::,2a0b:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:4000::,2a0b:4007:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:4040::,2a0b:4047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4080::,2a0b:4080:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:40c0::,2a0b:40c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4100::,2a0b:4107:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4140::,2a0b:4147:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0b:4180::,2a0b:4187:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a0b:41c0::,2a0b:41c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:4200::,2a0b:4207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4240::,2a0b:4247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:4280::,2a0b:4287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:42c0::,2a0b:42c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:4300::,2a0b:4307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4340::,2a0b:4340:98:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4340:99::,2a0b:4340:99:7fff:ffff:ffff:ffff:ffff,CN -2a0b:4340:99:8000::,2a0b:4342:1fff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4342:2000::,2a0b:4342:2000:7fff:ffff:ffff:ffff:ffff,RU -2a0b:4342:2000:8000::,2a0b:4347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4380::,2a0b:4387:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:43c0::,2a0b:43c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4400::,2a0b:4407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4440::,2a0b:4447:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:4480::,2a0b:4487:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:44c0::,2a0b:44c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4500::,2a0b:4507:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:4540::,2a0b:4547:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4580::,2a0b:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:45c0::,2a0b:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:4600::,2a0b:4600:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:4640::,2a0b:4647:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:4680::,2a0b:4687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:46c0::,2a0b:46c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4700::,2a0b:4707:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:4740::,2a0b:4740:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:47c0::,2a0b:47c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:4800::,2a0b:4807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4840::,2a0b:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4880::,2a0b:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:48c0::,2a0b:48c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4900::,2a0b:4907:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:4940::,2a0b:4947:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4980::,2a0b:4987:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:49c0::,2a0b:49c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:4a00::,2a0b:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:4a40::,2a0b:4a47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:4a80::,2a0b:4a87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:4ac0::,2a0b:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:4b00::,2a0b:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:4b40::,2a0b:4b40:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:4b80::,2a0b:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:4bc0::,2a0b:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4c00::,2a0b:4c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:4c40::,2a0b:4c47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:4c80::,2a0b:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:4cc0::,2a0b:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4d00::,2a0b:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4d40::,2a0b:4d47:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a0b:4d80::,2a0b:4d87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:4dc0::,2a0b:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4e00::,2a0b:4e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:4e40::,2a0b:4e47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:4e80::,2a0b:4e87:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a0b:4ec0::,2a0b:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:4f00::,2a0b:4f07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:4f40::,2a0b:4f47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:4f80::,2a0b:4f80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:4fc0::,2a0b:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0b:5000::,2a0b:5007:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:5040::,2a0b:5047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:5080::,2a0b:5087:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:50c0::,2a0b:50c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5100::,2a0b:5107:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:5140::,2a0b:5147:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:5180::,2a0b:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:51c0::,2a0b:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:5200::,2a0b:5207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5240::,2a0b:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:5280::,2a0b:5287:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:52c0::,2a0b:52c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:5300::,2a0b:5307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5340::,2a0b:5347:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5380::,2a0b:5387:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:53c0::,2a0b:53c0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:5400::,2a0b:5400:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5440::,2a0b:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:5480::,2a0b:5487:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:5500::,2a0b:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:5540::,2a0b:5547:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:5580::,2a0b:5587:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:55c0::,2a0b:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5600::,2a0b:5600:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0b:5640::,2a0b:5647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5680::,2a0b:5687:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:56c0::,2a0b:56c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5700::,2a0b:5707:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:5740::,2a0b:5747:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:5780::,2a0b:5787:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:57c0::,2a0b:57c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5800::,2a0b:5800:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5840::,2a0b:5847:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:5880::,2a0b:5887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:58c0::,2a0b:58c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:5900::,2a0b:5900:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:5940::,2a0b:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:5980::,2a0b:5987:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0b:59c0::,2a0b:59c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:5a00::,2a0b:5a07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:5a40::,2a0b:5a47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:5a80::,2a0b:5a87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5ac0::,2a0b:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:5b00::,2a0b:5b07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:5b40::,2a0b:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:5b80::,2a0b:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:5bc0::,2a0b:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:5c00::,2a0b:5c07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:5c40::,2a0b:5c47:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:5c80::,2a0b:5c87:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:5cc0::,2a0b:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:5d00::,2a0b:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:5d40::,2a0b:5d47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:5d80::,2a0b:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:5dc0::,2a0b:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:5e00::,2a0b:5e07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:5e80::,2a0b:5e87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:5ec0::,2a0b:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:5f00::,2a0b:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:5f40::,2a0b:5f47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:5f80::,2a0b:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:5fc0::,2a0b:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6000::,2a0b:6007:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:6040::,2a0b:6040:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6080::,2a0b:6087:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:60c0::,2a0b:60c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:6100::,2a0b:6107:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6140::,2a0b:6147:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:6180::,2a0b:6187:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:61c0::,2a0b:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6200::,2a0b:6207:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0b:6240::,2a0b:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6280::,2a0b:6287:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:62c0::,2a0b:62c7:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:6300::,2a0b:6307:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a0b:6340::,2a0b:6347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6380::,2a0b:6387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:63c0::,2a0b:63c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:6400::,2a0b:6407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:6440::,2a0b:6447:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:6480::,2a0b:6487:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:64c0::,2a0b:64c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6500::,2a0b:6507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6540::,2a0b:6547:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:6580::,2a0b:6587:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:65c0::,2a0b:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6600::,2a0b:6607:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:6640::,2a0b:6647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6680::,2a0b:6680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:66c0::,2a0b:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6700::,2a0b:6700:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:6740::,2a0b:6747:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6780::,2a0b:6787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:67c0::,2a0b:67c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:6800::,2a0b:6807:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:6840::,2a0b:6847:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:6880::,2a0b:6880:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:68c0::,2a0b:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:6900::,2a0b:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6940::,2a0b:6947:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:6980::,2a0b:6987:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:69c0::,2a0b:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6a40::,2a0b:6a47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:6ac0::,2a0b:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:6b40::,2a0b:6b47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:6b80::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:6bc0::,2a0b:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,TJ -2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:6c40::,2a0b:6c47:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6cc0::,2a0b:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:6d40::,2a0b:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:6d80::,2a0b:6d87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:6dc0::,2a0b:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:6e00::,2a0b:6e07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:6e40::,2a0b:6e47:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a0b:6e80::,2a0b:6e80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6ec0::,2a0b:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:6f00::,2a0b:6f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:6f40::,2a0b:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:6f80::,2a0b:6f87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:6fc0::,2a0b:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7000::,2a0b:7007:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:7040::,2a0b:7047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7080::,2a0b:7087:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:70c0::,2a0b:70c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:7100::,2a0b:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7140::,2a0b:7147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7180::,2a0b:7187:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:71c0::,2a0b:71c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7200::,2a0b:7207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7280::,2a0b:7287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:72c0::,2a0b:72c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7300::,2a0b:7307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7340::,2a0b:7347:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:7380::,2a0b:7387:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:73c0::,2a0b:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:7400::,2a0b:7400:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:7440::,2a0b:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7480::,2a0b:7480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:74c0::,2a0b:74c0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7500::,2a0b:7507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:7540::,2a0b:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7580::,2a0b:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:75c0::,2a0b:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7600::,2a0b:7607:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:7640::,2a0b:7647:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:7680::,2a0b:7687:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:76c0::,2a0b:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7700::,2a0b:7707:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:7740::,2a0b:7747:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:7780::,2a0b:7787:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:77c0::,2a0b:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:7800::,2a0b:7807:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:7840::,2a0b:7847:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7880::,2a0b:7880:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:78c0::,2a0b:78c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:7900::,2a0b:7907:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:7940::,2a0b:7947:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:7980::,2a0b:7987:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:79c0::,2a0b:79c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7a00::,2a0b:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7a40::,2a0b:7a47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7a80::,2a0b:7a87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:7ac0::,2a0b:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:7b00::,2a0b:7b07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:7b40::,2a0b:7b47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:7b80::,2a0b:7b87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:7bc0::,2a0b:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:7c00::,2a0b:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:7c40::,2a0b:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:7c80::,2a0b:7c87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7cc0::,2a0b:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:7d00::,2a0b:7d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:7d40::,2a0b:7d47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7d80::,2a0b:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:7dc0::,2a0b:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:7e00::,2a0b:7e07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:7e40::,2a0b:7e40:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:7e80::,2a0b:7e87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:7ec0::,2a0b:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:7f00::,2a0b:7f07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:7f40::,2a0b:7f47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:7f80::,2a0b:7f87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:7fc0::,2a0b:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8000::,2a0b:8007:ffff:ffff:ffff:ffff:ffff:ffff,MC -2a0b:8040::,2a0b:8047:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8080::,2a0b:8087:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:80c0::,2a0b:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:8100::,2a0b:8107:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:8140::,2a0b:8147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8180::,2a0b:8187:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:81c0::,2a0b:81c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8200::,2a0b:8207:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8240::,2a0b:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:8280::,2a0b:8280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:82c0::,2a0b:82c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8300::,2a0b:8307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8340::,2a0b:8347:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:8380::,2a0b:8387:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:83c0::,2a0b:83c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:8400::,2a0b:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8440::,2a0b:8440:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a0b:8480::,2a0b:8487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:84c0::,2a0b:84c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8500::,2a0b:8507:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0b:8540::,2a0b:8547:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:8580::,2a0b:8587:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:85c0::,2a0b:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8600::,2a0b:8607:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:8640::,2a0b:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:8680::,2a0b:8687:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0b:86c0::,2a0b:86c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:8740::,2a0b:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:8780::,2a0b:8787:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:87c0::,2a0b:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:8800::,2a0b:8807:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:8840::,2a0b:8847:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8880::,2a0b:8887:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:88c0::,2a0b:88c7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:8900::,2a0b:8900:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0b:8940::,2a0b:8947:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:8980::,2a0b:8987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:89c0::,2a0b:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:8a00::,2a0b:8a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8a40::,2a0b:8a47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:8a80::,2a0b:8a87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:8ac0::,2a0b:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:8b00::,2a0b:8b07:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:8b40::,2a0b:8b47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:8b80::,2a0b:8b87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8bc0::,2a0b:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8c00::,2a0b:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:8c40::,2a0b:8c47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8c80::,2a0b:8c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:8cc0::,2a0b:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:8d00::,2a0b:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:8d40::,2a0b:8d47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8d80::,2a0b:8d87:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:8dc0::,2a0b:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8e00::,2a0b:8e07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:8e40::,2a0b:8e40:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:8e80::,2a0b:8e87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:8ec0::,2a0b:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:8f00::,2a0b:8f07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:8f40::,2a0b:8f47:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:8f80::,2a0b:8f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:8fc0::,2a0b:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9000::,2a0b:9007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:9040::,2a0b:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:9080::,2a0b:9087:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:90c0::,2a0b:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9100::,2a0b:9100:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:9140::,2a0b:9147:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:9180::,2a0b:9180:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:91c0::,2a0b:91c7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:9200::,2a0b:9200:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a0b:9240::,2a0b:9247:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9280::,2a0b:9287:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:92c0::,2a0b:92c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:9300::,2a0b:9307:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:9340::,2a0b:9347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9380::,2a0b:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:93c0::,2a0b:93c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:9440::,2a0b:9447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9480::,2a0b:9480:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:94c0::,2a0b:94c0:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0b:9500::,2a0b:9507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:9540::,2a0b:9547:ffff:ffff:ffff:ffff:ffff:ffff,UZ -2a0b:9580::,2a0b:9580:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:95c0::,2a0b:95c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:9600::,2a0b:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9640::,2a0b:9647:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:9680::,2a0b:9687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:96c0::,2a0b:96c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:9700::,2a0b:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9740::,2a0b:9747:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9780::,2a0b:9787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:97c0::,2a0b:97c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9800::,2a0b:9807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9840::,2a0b:9847:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9880::,2a0b:9887:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:98c0::,2a0b:98c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9900::,2a0b:9907:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:9940::,2a0b:9940:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:9980::,2a0b:9980:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:99c0::,2a0b:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:9a00::,2a0b:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:9a01::,2a0b:9a01:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9a02::,2a0b:9a02::ffff:ffff:ffff:ffff:ffff,CA -2a0b:9a02:1::,2a0b:9a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9a40::,2a0b:9a47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:9a80::,2a0b:9a80:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:9ac0::,2a0b:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9b00::,2a0b:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9b40::,2a0b:9b47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9b80::,2a0b:9b87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:9bc0::,2a0b:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:9c00::,2a0b:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:9c40::,2a0b:9c47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9c80::,2a0b:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:9cc0::,2a0b:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9d00::,2a0b:9d07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:9d40::,2a0b:9d47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:9d80::,2a0b:9d80:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9dc0::,2a0b:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9e00::,2a0b:9e07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:9e40::,2a0b:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ME -2a0b:9e80::,2a0b:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:9ec0::,2a0b:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a0b:9f00::,2a0b:9f07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:9f40::,2a0b:9f47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:9f80::,2a0b:9f87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:9fc0::,2a0b:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:a000::,2a0b:a007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:a040::,2a0b:a047:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:a080::,2a0b:a087:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:a0c0::,2a0b:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:a100::,2a0b:a100:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:a140::,2a0b:a147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:a180::,2a0b:a187:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:a1c0::,2a0b:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:a200::,2a0b:a207:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:a240::,2a0b:a247:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:a280::,2a0b:a280:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:a2c0::,2a0b:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:a300::,2a0b:a307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:a340::,2a0b:a347:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:a380::,2a0b:a380:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:a3c0::,2a0b:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a0b:a440::,2a0b:a447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:a480::,2a0b:a480:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:a4c0::,2a0b:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a0b:a500::,2a0b:a507:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:a540::,2a0b:a547:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:a580::,2a0b:a587:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:a5c0::,2a0b:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:a600::,2a0b:a600:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:a640::,2a0b:a647:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:a680::,2a0b:a680:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:a6c0::,2a0b:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:a700::,2a0b:a707:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:a740::,2a0b:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:a780::,2a0b:a787:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:a7c0::,2a0b:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:a800::,2a0b:a800:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:a840::,2a0b:a840:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:a880::,2a0b:a887:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:a8c0::,2a0b:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:a900::,2a0b:a907:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:a940::,2a0b:a947:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:a980::,2a0b:a980:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:a9c0::,2a0b:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:aa00::,2a0b:aa07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:aa40::,2a0b:aa40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:aa80::,2a0b:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:aac0::,2a0b:aac7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ab00::,2a0b:ab07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:ab40::,2a0b:ab40:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:ab80::,2a0b:ab80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:abc0::,2a0b:abc7:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a0b:ac00::,2a0b:ac07:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:ac40::,2a0b:ac47:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:ac80::,2a0b:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:acc0::,2a0b:acc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:ad00::,2a0b:ad07:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:ad40::,2a0b:ad47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:ad80::,2a0b:ad87:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:adc0::,2a0b:adc7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:ae00::,2a0b:ae07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:ae40::,2a0b:ae47:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:ae80::,2a0b:ae87:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:aec0::,2a0b:aec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:af00::,2a0b:af07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:af40::,2a0b:af47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:af80::,2a0b:af87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:afc0::,2a0b:afc0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:b000::,2a0b:b007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:b040::,2a0b:b047:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:b080::,2a0b:b087:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:b0c0::,2a0b:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:b100::,2a0b:b107:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:b140::,2a0b:b147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:b180::,2a0b:b187:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:b1c0::,2a0b:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:b200::,2a0b:b200:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:b240::,2a0b:b247:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:b280::,2a0b:b287:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:b2c0::,2a0b:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:b300::,2a0b:b307:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:b340::,2a0b:b347:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:b380::,2a0b:b387:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:b3c0::,2a0b:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:b400::,2a0b:b407:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:b440::,2a0b:b447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:b480::,2a0b:b487:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:b4c0::,2a0b:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:b500::,2a0b:b503:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:b540::,2a0b:b547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:b580::,2a0b:b587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:b5c0::,2a0b:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:b600::,2a0b:b607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:b640::,2a0b:b647:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:b680::,2a0b:b680:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:b6c0::,2a0b:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a0b:b700::,2a0b:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:b740::,2a0b:b747:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:b780::,2a0b:b787:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:b7c0::,2a0b:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:b800::,2a0b:b807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:b840::,2a0b:b847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:b880::,2a0b:b887:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0b:b8c0::,2a0b:b8c7:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:b900::,2a0b:b907:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:b940::,2a0b:b940:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:b980::,2a0b:b980:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:b9c0::,2a0b:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ba00::,2a0b:ba07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:ba40::,2a0b:ba47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:ba80::,2a0b:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:bac0::,2a0b:bac7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:bb00::,2a0b:bb07:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:bb40::,2a0b:bb47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:bb80::,2a0b:bb80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:bbc0::,2a0b:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:bc00::,2a0b:bc07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:bc40::,2a0b:bc47:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:bc80::,2a0b:bc87:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:bcc0::,2a0b:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:bd00::,2a0b:bd07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:bd40::,2a0b:bd47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:bd80::,2a0b:bd87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:bdc0::,2a0b:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:be00::,2a0b:be07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:be40::,2a0b:be47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:be80::,2a0b:be87:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:bec0::,2a0b:bec0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:bf00::,2a0b:bf07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:bf40::,2a0b:bf47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:bf80::,2a0b:bf80:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:bfc0::,2a0b:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:c000::,2a0b:c007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c040::,2a0b:c047:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:c080::,2a0b:c087:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c0c0::,2a0b:c0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:c100::,2a0b:c107:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:c140::,2a0b:c147:ffff:ffff:ffff:ffff:ffff:ffff,AX -2a0b:c180::,2a0b:c180:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:c1c0::,2a0b:c1c7:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0b:c200::,2a0b:c207:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:c240::,2a0b:c247:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:c280::,2a0b:c287:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:c2c0::,2a0b:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c300::,2a0b:c307:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a0b:c340::,2a0b:c347:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c380::,2a0b:c387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c3c0::,2a0b:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c400::,2a0b:c407:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:c440::,2a0b:c440:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:c480::,2a0b:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c4c0::,2a0b:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c500::,2a0b:c500:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c540::,2a0b:c547:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:c580::,2a0b:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c5c0::,2a0b:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:c600::,2a0b:c607:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:c640::,2a0b:c647:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:c680::,2a0b:c687:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:c6c0::,2a0b:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:c740::,2a0b:c747:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:c780::,2a0b:c787:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:c7c0::,2a0b:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:c800::,2a0b:c807:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:c840::,2a0b:c847:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:c880::,2a0b:c887:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:c8c0::,2a0b:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:c900::,2a0b:c907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c940::,2a0b:c947:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:c980::,2a0b:c987:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:c9c0::,2a0b:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a0b:ca00::,2a0b:ca07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:ca40::,2a0b:ca47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:ca80::,2a0b:ca80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:cac0::,2a0b:cac7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:cb00::,2a0b:cb07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:cb40::,2a0b:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:cb80::,2a0b:cb80:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0b:cbc0::,2a0b:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:cc00::,2a0b:cc00:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:cc40::,2a0b:cc47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:cc80::,2a0b:cc87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:ccc0::,2a0b:ccc7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:cd00::,2a0b:cd07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:cd40::,2a0b:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:cd80::,2a0b:cd87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:cdc0::,2a0b:cdc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:ce00::,2a0b:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ce40::,2a0b:ce40:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:ce80::,2a0b:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:cec0::,2a0b:cec7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:cf00::,2a0b:cf07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:cf40::,2a0b:cf47:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:cf80::,2a0b:cf87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:cfc0::,2a0b:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:d000::,2a0b:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d040::,2a0b:d047:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:d080::,2a0b:d080:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:d0c0::,2a0b:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d100::,2a0b:d107:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:d140::,2a0b:d147:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:d180::,2a0b:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:d1c0::,2a0b:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:d200::,2a0b:d207:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0b:d240::,2a0b:d240:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:d280::,2a0b:d287:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d2c0::,2a0b:d2c7:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:d300::,2a0b:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:d340::,2a0b:d347:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:d380::,2a0b:d387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:d3c0::,2a0b:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:d400::,2a0b:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:d440::,2a0b:d447:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:d480::,2a0b:d487:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:d4c0::,2a0b:d4c7:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:d500::,2a0b:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:d540::,2a0b:d540:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d580::,2a0b:d580:ffff:ffff:ffff:ffff:ffff:ffff,OM -2a0b:d5c0::,2a0b:d5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:d600::,2a0b:d607:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d640::,2a0b:d640:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:d680::,2a0b:d680:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:d6c0::,2a0b:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:d700::,2a0b:d707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:d740::,2a0b:d747:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:d780::,2a0b:d787:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:d7c0::,2a0b:d7c7:ffff:ffff:ffff:ffff:ffff:ffff,KG -2a0b:d800::,2a0b:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:d840::,2a0b:d847:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:d880::,2a0b:d887:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:d8c0::,2a0b:d8c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:d900::,2a0b:d907:ffff:ffff:ffff:ffff:ffff:ffff,HK -2a0b:d940::,2a0b:d947:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:d980::,2a0b:d987:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:d9c0::,2a0b:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:da00::,2a0b:da07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:da40::,2a0b:da47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:da80::,2a0b:da87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:dac0::,2a0b:dac7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:db00::,2a0b:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:db40::,2a0b:db47:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0b:db80::,2a0b:db87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:dbc0::,2a0b:dbc7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:dc00::,2a0b:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:dc40::,2a0b:dc47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:dc80::,2a0b:dc87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:dcc0::,2a0b:dcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:dd00::,2a0b:dd07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:dd40::,2a0b:dd47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:dd80::,2a0b:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ddc0::,2a0b:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:de00::,2a0b:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:de40::,2a0b:de47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:de80::,2a0b:de87:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0b:dec0::,2a0b:dec7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:df00::,2a0b:df00:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:df40::,2a0b:df40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:df80::,2a0b:df87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:dfc0::,2a0b:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:e000::,2a0b:e007:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:e040::,2a0b:e047:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:e080::,2a0b:e081:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:e0c0::,2a0b:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:e100::,2a0b:e107:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:e140::,2a0b:e147:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:e180::,2a0b:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:e1c0::,2a0b:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e200::,2a0b:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:e240::,2a0b:e247:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:e280::,2a0b:e287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:e2c0::,2a0b:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:e300::,2a0b:e300:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:e340::,2a0b:e347:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e380::,2a0b:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:e3c0::,2a0b:e3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:e400::,2a0b:e407:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:e440::,2a0b:e447:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:e480::,2a0b:e487:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:e4c0::,2a0b:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e500::,2a0b:e501:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e540::,2a0b:e547:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e580::,2a0b:e587:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:e5c0::,2a0b:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:e600::,2a0b:e607:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a0b:e640::,2a0b:e647:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0b:e680::,2a0b:e687:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:e6c0::,2a0b:e6c7:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:e700::,2a0b:e707:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:e740::,2a0b:e747:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:e780::,2a0b:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:e7c0::,2a0b:e7c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:e800::,2a0b:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:e840::,2a0b:e847:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:e880::,2a0b:e887:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:e8c0::,2a0b:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:e900::,2a0b:e907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:e940::,2a0b:e940:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:e980::,2a0b:e987:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:e9c0::,2a0b:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ea00::,2a0b:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:ea40::,2a0b:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0b:ea80::,2a0b:ea80:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:eac0::,2a0b:eac0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:eb00::,2a0b:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:eb40::,2a0b:eb47:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:eb80::,2a0b:eb87:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:ebc0::,2a0b:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:ec00::,2a0b:ec07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:ec40::,2a0b:ec47:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:ec80::,2a0b:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:ecc0::,2a0b:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:ed00::,2a0b:ed07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:ed40::,2a0b:ed47:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:ed80::,2a0b:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:edc0::,2a0b:edc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:ee00::,2a0b:ee07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:ee40::,2a0b:ee47:ffff:ffff:ffff:ffff:ffff:ffff,HR -2a0b:ee80::,2a0b:ee87:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:eec0::,2a0b:eec0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:ef00::,2a0b:ef07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:ef40::,2a0b:ef47:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:ef80::,2a0b:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0b:efc0::,2a0b:efc0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:f000::,2a0b:f000:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:f040::,2a0b:f040:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f080::,2a0b:f080:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f0c0::,2a0b:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:f100::,2a0b:f107:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:f140::,2a0b:f147:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:f180::,2a0b:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:f1c0::,2a0b:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:f200::,2a0b:f200:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:f240::,2a0b:f247:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0b:f280::,2a0b:f287:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:f2c0::,2a0b:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0b:f300::,2a0b:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:f340::,2a0b:f340:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:f380::,2a0b:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:f3c0::,2a0b:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:f400::,2a0b:f400:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f440::,2a0b:f447:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f480::,2a0b:f480:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:f4c0::,2a0b:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f500::,2a0b:f507:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:f540::,2a0b:f547:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:f580::,2a0b:f587:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0b:f5c0::,2a0b:f5c7:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:f600::,2a0b:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:f640::,2a0b:f647:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0b:f680::,2a0b:f687:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0b:f6c0::,2a0b:f6c7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:f700::,2a0b:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0b:f740::,2a0b:f747:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0b:f780::,2a0b:f787:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0b:f7c0::,2a0b:f7c7:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:f800::,2a0b:f807:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:f840::,2a0b:f840:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f880::,2a0b:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f8c0::,2a0b:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:f900::,2a0b:f907:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:f940::,2a0b:f940:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:f980::,2a0b:f987:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:f9c0::,2a0b:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:fa00::,2a0b:fa07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:fa40::,2a0b:fa47:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a0b:fa80::,2a0b:fa87:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:fac0::,2a0b:fac7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0b:fb00::,2a0b:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0b:fb40::,2a0b:fb47:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0b:fb80::,2a0b:fb87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0b:fbc0::,2a0b:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0b:fc00::,2a0b:fc07:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0b:fc40::,2a0b:fc47:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0b:fc80::,2a0b:fc87:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0b:fcc0::,2a0b:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:fd00::,2a0b:fd00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0b:fd40::,2a0b:fd47:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:fd80::,2a0b:fd87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0b:fdc0::,2a0b:fdc7:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0b:fe00::,2a0b:fe07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0b:fe40::,2a0b:fe47:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0b:fe80::,2a0b:fe87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:fec0::,2a0b:fec7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:ff00::,2a0b:ff07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:ff40::,2a0b:ff47:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0b:ff80::,2a0b:ff87:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0b:ffc0::,2a0b:ffc7:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c::,2a0c:7:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:100::,2a0c:107:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:200::,2a0c:207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:300::,2a0c:307:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0c:400::,2a0c:407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:500::,2a0c:503:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:600::,2a0c:607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:700::,2a0c:700:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:800::,2a0c:807:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a0c:900::,2a0c:907:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:a00::,2a0c:a07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:b00::,2a0c:b00:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:c00::,2a0c:c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:d00::,2a0c:d07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:e00::,2a0c:e07:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a0c:f00::,2a0c:f07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:1000::,2a0c:1007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:1100::,2a0c:1107:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:1200::,2a0c:1207:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0c:1300::,2a0c:1307:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0c:1400::,2a0c:1407:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:1500::,2a0c:1507:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:1600::,2a0c:1600:ffff:ffff:ffff:ffff:ffff:ffff,BA -2a0c:1700::,2a0c:1707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:1800::,2a0c:1807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:1900::,2a0c:1907:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0c:1a00::,2a0c:1a00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:1b00::,2a0c:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:1c00::,2a0c:1c07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0c:1d00::,2a0c:1d03:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:1e00::,2a0c:1e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:1f00::,2a0c:1f07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0c:2000::,2a0c:2007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:2100::,2a0c:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:2200::,2a0c:2207:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:2300::,2a0c:2307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:2400::,2a0c:2407:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:2500::,2a0c:2507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:2600::,2a0c:2607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:2700::,2a0c:2707:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:2800::,2a0c:2800:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:2900::,2a0c:2907:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0c:2a00::,2a0c:2a07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0c:2b00::,2a0c:2b07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:2c00::,2a0c:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:2d00::,2a0c:2d07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0c:2e00::,2a0c:2e07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:2f00::,2a0c:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:3000::,2a0c:3000:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:3100::,2a0c:3107:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:3200::,2a0c:3207:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0c:3300::,2a0c:3307:ffff:ffff:ffff:ffff:ffff:ffff,LB -2a0c:3400::,2a0c:3407:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:3500::,2a0c:3507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:3600::,2a0c:3600:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0c:3700::,2a0c:3700:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:3800::,2a0c:3800:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:3900::,2a0c:3907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:3a00::,2a0c:3a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:3b00::,2a0c:3b07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0c:3c00::,2a0c:3c07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:3d00::,2a0c:3d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:3e00::,2a0c:3e07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:3f00::,2a0c:3f07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:4000::,2a0c:4000:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:4100::,2a0c:4107:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:4200::,2a0c:4207:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0c:4300::,2a0c:4300:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:4400::,2a0c:4400:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:4500::,2a0c:4507:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0c:4600::,2a0c:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0c:4700::,2a0c:4707:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:4800::,2a0c:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:4900::,2a0c:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:4a00::,2a0c:4a07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:4b00::,2a0c:4b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:4c00::,2a0c:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:4d00::,2a0c:4d07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:4e00::,2a0c:4e00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:4f00::,2a0c:4f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:5000::,2a0c:5003:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:5100::,2a0c:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:5200::,2a0c:5207:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:5300::,2a0c:5307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:5400::,2a0c:5407:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:5500::,2a0c:5500:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:5600::,2a0c:5607:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:5700::,2a0c:5707:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0c:5800::,2a0c:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:5900::,2a0c:5907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:5a00::,2a0c:5a07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:5b00::,2a0c:5b07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:5c00::,2a0c:5c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:5d00::,2a0c:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:5e00::,2a0c:5e00:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a0c:5f00::,2a0c:5f00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:6000::,2a0c:6007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:6100::,2a0c:6107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:6200::,2a0c:6207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:6300::,2a0c:6307:ffff:ffff:ffff:ffff:ffff:ffff,RS -2a0c:6400::,2a0c:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:6500::,2a0c:6507:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:6600::,2a0c:6607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0c:6700::,2a0c:6707:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:6800::,2a0c:6800:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0c:6900::,2a0c:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:6a00::,2a0c:6a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:6b00::,2a0c:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:6c00::,2a0c:6c00:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:6d00::,2a0c:6d00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:6e00::,2a0c:6e07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:6f00::,2a0c:6f07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:7000::,2a0c:7007:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a0c:7100::,2a0c:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:7200::,2a0c:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:7300::,2a0c:7300:ffff:ffff:ffff:ffff:ffff:ffff,CY -2a0c:7400::,2a0c:7407:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a0c:7500::,2a0c:7507:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:7600::,2a0c:7607:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:7700::,2a0c:7700:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:7800::,2a0c:7807:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0c:7900::,2a0c:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:7a00::,2a0c:7a07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:7b00::,2a0c:7b07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:7c00::,2a0c:7c07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0c:7d00::,2a0c:7d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:7e00::,2a0c:7e07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:7f00::,2a0c:7f07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:8000::,2a0c:8007:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:8100::,2a0c:8107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:8200::,2a0c:8207:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0c:8300::,2a0c:8307:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:8400::,2a0c:8407:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:8500::,2a0c:8507:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:8600::,2a0c:8607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0c:8700::,2a0c:8707:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0c:8800::,2a0c:8807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:8900::,2a0c:8900:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:8a00::,2a0c:8a07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:8b00::,2a0c:8b00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:8c00::,2a0c:8c07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0c:8d00::,2a0c:8d07:ffff:ffff:ffff:ffff:ffff:ffff,LV -2a0c:8e00::,2a0c:8e07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:8f00::,2a0c:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0c:9000::,2a0c:9007:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:9100::,2a0c:9107:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a0c:9200::,2a0c:9207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:9300::,2a0c:9307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:9400::,2a0c:9407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:9500::,2a0c:9500:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:9600::,2a0c:9607:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0c:9700::,2a0c:9700:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:9800::,2a0c:9807:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:9900::,2a0c:9900:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:9a00::,2a0c:9a00:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:9b00::,2a0c:9b07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:9c00::,2a0c:9c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:9d00::,2a0c:9d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:9e00::,2a0c:9e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:9f00::,2a0c:9f07:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a0c:a000::,2a0c:a007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:a100::,2a0c:a107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:a200::,2a0c:a207:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0c:a300::,2a0c:a307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:a400::,2a0c:a407:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:a500::,2a0c:a500:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:a600::,2a0c:a607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:a700::,2a0c:a707:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:a800::,2a0c:a807:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0c:a900::,2a0c:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:aa00::,2a0c:aa07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:ab00::,2a0c:ab07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:ac00::,2a0c:ac07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:ad00::,2a0c:ad07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0c:ae00::,2a0c:ae07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:af00::,2a0c:af07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:b000::,2a0c:b007:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0c:b100::,2a0c:b107:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:b200::,2a0c:b207:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:b300::,2a0c:b307:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0c:b400::,2a0c:b407:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0c:b500::,2a0c:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:b600::,2a0c:b607:ffff:ffff:ffff:ffff:ffff:ffff,AU -2a0c:b700::,2a0c:b707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:b800::,2a0c:b807:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:b900::,2a0c:b907:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0c:ba00::,2a0c:ba07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:bb00::,2a0c:bb07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:bc00::,2a0c:bc07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:bd00::,2a0c:bd07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:be00::,2a0c:be00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:bf00::,2a0c:bf07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:c000::,2a0c:c007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:c100::,2a0c:c107:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:c200::,2a0c:c200:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0c:c300::,2a0c:c307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:c400::,2a0c:c400:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0c:c500::,2a0c:c500:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0c:c600::,2a0c:c600:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:c700::,2a0c:c707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:c800::,2a0c:c807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:c900::,2a0c:c907:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:ca00::,2a0c:ca07:ffff:ffff:ffff:ffff:ffff:ffff,KW -2a0c:cb00::,2a0c:cb07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:cc00::,2a0c:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0c:cd00::,2a0c:cd00:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:ce00::,2a0c:ce07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0c:cf00::,2a0c:cf07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0c:d000::,2a0c:d007:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0c:d100::,2a0c:d107:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:d200::,2a0c:d207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:d300::,2a0c:d307:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:d400::,2a0c:d407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:d500::,2a0c:d507:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0c:d600::,2a0c:d607:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0c:d700::,2a0c:d707:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:d800::,2a0c:d807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:d900::,2a0c:d907:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:da00::,2a0c:da07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:db00::,2a0c:db07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0c:dc00::,2a0c:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0c:dd00::,2a0c:dd07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:de00::,2a0c:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:df00::,2a0c:df07:ffff:ffff:ffff:ffff:ffff:ffff,IQ -2a0c:e000::,2a0c:e007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:e100::,2a0c:e107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:e200::,2a0c:e207:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0c:e300::,2a0c:e307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:e400::,2a0c:e407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:e500::,2a0c:e507:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:e600::,2a0c:e607:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0c:e700::,2a0c:e707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:e800::,2a0c:e807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:e900::,2a0c:e907:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:ea00::,2a0c:ea07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0c:eb00::,2a0c:eb00:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:ec00::,2a0c:ec07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0c:ed00::,2a0c:ed07:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a0c:ee00::,2a0c:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:ef00::,2a0c:ef07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:f000::,2a0c:f000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0c:f100::,2a0c:f107:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:f200::,2a0c:f207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:f300::,2a0c:f307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0c:f400::,2a0c:f407:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0c:f500::,2a0c:f507:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:f600::,2a0c:f607:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0c:f700::,2a0c:f707:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0c:f800::,2a0c:f807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:f900::,2a0c:f907:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0c:fa00::,2a0c:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0c:fb00::,2a0c:fb07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0c:fc00::,2a0c:fc07:ffff:ffff:ffff:ffff:ffff:ffff,FI -2a0c:fd00::,2a0c:fd07:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0c:fe00::,2a0c:fe07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0c:ff00::,2a0c:ff07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d::,2a0d:7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:100::,2a0d:107:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:200::,2a0d:207:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:300::,2a0d:307:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:400::,2a0d:407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:500::,2a0d:507:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:600::,2a0d:607:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0d:700::,2a0d:707:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:800::,2a0d:807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:900::,2a0d:900:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0d:a00::,2a0d:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:b00::,2a0d:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:c00::,2a0d:c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:d00::,2a0d:d07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:e00::,2a0d:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:f00::,2a0d:f07:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0d:1000::,2a0d:1007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:1100::,2a0d:1107:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:1200::,2a0d:1207:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:1300::,2a0d:1307:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:1400::,2a0d:1403:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:1500::,2a0d:1500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:1600::,2a0d:1600:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:1700::,2a0d:1707:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:1800::,2a0d:1807:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0d:1900::,2a0d:1907:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:1a00::,2a0d:1a07:ffff:ffff:ffff:ffff:ffff:ffff,MD -2a0d:1b00::,2a0d:1b07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:1c00::,2a0d:1c07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0d:1d00::,2a0d:1d07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:1e00::,2a0d:1e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:1f00::,2a0d:1f07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:2000::,2a0d:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:2100::,2a0d:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:2200::,2a0d:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:2300::,2a0d:2307:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0d:2400::,2a0d:2407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:2500::,2a0d:2507:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:2600::,2a0d:2607:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0d:2700::,2a0d:2707:ffff:ffff:ffff:ffff:ffff:ffff,EE -2a0d:2800::,2a0d:2807:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a0d:2900::,2a0d:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:2a00::,2a0d:2a07:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0d:2b00::,2a0d:2b07:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0d:2c00::,2a0d:2c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:2d00::,2a0d:2d00:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0d:2e00::,2a0d:2e07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:2f00::,2a0d:2f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:3000::,2a0d:3007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:3100::,2a0d:3107:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:3200::,2a0d:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:3300::,2a0d:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:3400::,2a0d:3400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:3500::,2a0d:3507:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:3600::,2a0d:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:3700::,2a0d:3707:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0d:3800::,2a0d:3807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:3900::,2a0d:3907:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:3a00::,2a0d:3a07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:3b00::,2a0d:3b07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:3c00::,2a0d:3c07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0d:3d00::,2a0d:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:3e00::,2a0d:3e07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:3f00::,2a0d:3f00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:4000::,2a0d:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:4100::,2a0d:4100:ffff:ffff:ffff:ffff:ffff:ffff,SY -2a0d:4200::,2a0d:4207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:4300::,2a0d:4307:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:4400::,2a0d:4407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:4500::,2a0d:4507:ffff:ffff:ffff:ffff:ffff:ffff,MK -2a0d:4600::,2a0d:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:4800::,2a0d:4807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:4a00::,2a0d:4a00:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a0d:4c00::,2a0d:4c07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:4e00::,2a0d:4e07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:5000::,2a0d:5007:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a0d:5200::,2a0d:5207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:5400::,2a0d:5407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:5600::,2a0d:5600:c:ffff:ffff:ffff:ffff:ffff,US -2a0d:5600:d::,2a0d:5600:d:ffff:ffff:ffff:ffff:ffff,SG -2a0d:5600:e::,2a0d:5600:f:ffff:ffff:ffff:ffff:ffff,JP -2a0d:5600:10::,2a0d:5607:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0d:5800::,2a0d:5807:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:5a00::,2a0d:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:5c00::,2a0d:5c07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0d:5e00::,2a0d:5e07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:6000::,2a0d:6007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:6200::,2a0d:6207:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0d:6400::,2a0d:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:6600::,2a0d:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0d:6800::,2a0d:6807:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:6a00::,2a0d:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:6c00::,2a0d:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:6e00::,2a0d:6e07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:7000::,2a0d:7000:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a0d:7200::,2a0d:7207:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a0d:7400::,2a0d:7407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:7600::,2a0d:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:7800::,2a0d:7807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:7a00::,2a0d:7a07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:7c00::,2a0d:7c07:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0d:7e00::,2a0d:7e00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:8000::,2a0d:8007:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:8200::,2a0d:8207:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:8400::,2a0d:8400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:8600::,2a0d:8607:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:8800::,2a0d:8807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:8a00::,2a0d:8a00:ffff:ffff:ffff:ffff:ffff:ffff,GE -2a0d:8c00::,2a0d:8c07:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:8e00::,2a0d:8e07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:9000::,2a0d:9007:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:9200::,2a0d:9207:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:9400::,2a0d:9407:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:9600::,2a0d:9600:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a0d:9800::,2a0d:9807:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a0d:9a00::,2a0d:9a07:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0d:9c00::,2a0d:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:9e00::,2a0d:9e07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:a000::,2a0d:a007:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0d:a200::,2a0d:a207:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:a400::,2a0d:a407:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a0d:a600::,2a0d:a603:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:a800::,2a0d:a807:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:aa00::,2a0d:aa07:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:ac00::,2a0d:ac07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a0d:ae00::,2a0d:ae07:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0d:b000::,2a0d:b007:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:b200::,2a0d:b207:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a0d:b400::,2a0d:b407:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:b600::,2a0d:b607:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:b800::,2a0d:b807:ffff:ffff:ffff:ffff:ffff:ffff,AM -2a0d:ba00::,2a0d:ba07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:bc00::,2a0d:bc07:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a0d:be00::,2a0d:be07:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:c000::,2a0d:c007:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0d:c200::,2a0d:c207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:c400::,2a0d:c407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:c600::,2a0d:c607:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:c800::,2a0d:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:ca00::,2a0d:ca07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:cc00::,2a0d:cc07:ffff:ffff:ffff:ffff:ffff:ffff,AL -2a0d:ce00::,2a0d:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:d000::,2a0d:d007:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:d200::,2a0d:d207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:d400::,2a0d:d407:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:d600::,2a0d:d607:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a0d:d800::,2a0d:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a0d:da00::,2a0d:da07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:dc00::,2a0d:dc07:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a0d:de00::,2a0d:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0d:e000::,2a0d:e007:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:e200::,2a0d:e207:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a0d:e400::,2a0d:e400:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0d:e600::,2a0d:e607:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:e800::,2a0d:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a0d:ea00::,2a0d:ea07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:ec00::,2a0d:ec07:ffff:ffff:ffff:ffff:ffff:ffff,US -2a0d:ee00::,2a0d:ee00:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:f000::,2a0d:f007:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a0d:f200::,2a0d:f207:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a0d:f400::,2a0d:f407:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:f600::,2a0d:f607:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a0d:f800::,2a0d:f807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:fa00::,2a0d:fa07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0d:fc00::,2a0d:fc07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0d:fe00::,2a0d:fe07:ffff:ffff:ffff:ffff:ffff:ffff,GB -2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG -2c0e:2000::,2c0e:2fff:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0e:4000::,2c0e:40ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0e:7f80::,2c0e:7f9f:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:ee00::,2c0f:ee00:ffff:ffff:ffff:ffff:ffff:ffff,BF -2c0f:ee08::,2c0f:ee08:ffff:ffff:ffff:ffff:ffff:ffff,CD -2c0f:ee10::,2c0f:ee10:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:ee18::,2c0f:ee18:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:ee20::,2c0f:ee20:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f000::,2c0f:f000:ffff:ffff:ffff:ffff:ffff:ffff,DZ -2c0f:f008::,2c0f:f008:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f010::,2c0f:f010:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f018::,2c0f:f018:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f020::,2c0f:f020:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f028::,2c0f:f028:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f030::,2c0f:f030:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f038::,2c0f:f038:ffff:ffff:ffff:ffff:ffff:ffff,GA -2c0f:f040::,2c0f:f040:ffff:ffff:ffff:ffff:ffff:ffff,SN -2c0f:f048::,2c0f:f048:ffff:ffff:ffff:ffff:ffff:ffff,CG -2c0f:f050::,2c0f:f050:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f058::,2c0f:f058:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f060::,2c0f:f060:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f068::,2c0f:f068:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:f070::,2c0f:f070:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f078::,2c0f:f078:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f080::,2c0f:f080:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f088::,2c0f:f088:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f090::,2c0f:f090:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f098::,2c0f:f098:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f0a0::,2c0f:f0a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f0a8::,2c0f:f0a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f0b0::,2c0f:f0b0:ffff:ffff:ffff:ffff:ffff:ffff,EG -2c0f:f0b8::,2c0f:f0b8:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f0c0::,2c0f:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f0c8::,2c0f:f0c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f0d0::,2c0f:f0d0:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:f0d8::,2c0f:f0d8:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f0e0::,2c0f:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,SD -2c0f:f0e8::,2c0f:f0e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f0f0::,2c0f:f0f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f0f8::,2c0f:f0f8:ffff:ffff:ffff:ffff:ffff:ffff,TG -2c0f:f100::,2c0f:f100:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f108::,2c0f:f108:ffff:ffff:ffff:ffff:ffff:ffff,RW -2c0f:f110::,2c0f:f110:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f118::,2c0f:f118:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f120::,2c0f:f120:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f128::,2c0f:f128:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f130::,2c0f:f130:ffff:ffff:ffff:ffff:ffff:ffff,LS -2c0f:f138::,2c0f:f138:ffff:ffff:ffff:ffff:ffff:ffff,BF -2c0f:f140::,2c0f:f140:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f148::,2c0f:f148:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f158::,2c0f:f158:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f160::,2c0f:f160:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f168::,2c0f:f168:ffff:ffff:ffff:ffff:ffff:ffff,RW -2c0f:f170::,2c0f:f170:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f178::,2c0f:f178:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f180::,2c0f:f180:ffff:ffff:ffff:ffff:ffff:ffff,GN -2c0f:f188::,2c0f:f188:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f190::,2c0f:f190:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f198::,2c0f:f198:ffff:ffff:ffff:ffff:ffff:ffff,BI -2c0f:f1a0::,2c0f:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1a8::,2c0f:f1a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1b0::,2c0f:f1b0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f1b8::,2c0f:f1b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1c0::,2c0f:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1c8::,2c0f:f1c8:ffff:ffff:ffff:ffff:ffff:ffff,MG -2c0f:f1d0::,2c0f:f1d0:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f1d8::,2c0f:f1d8:ffff:ffff:ffff:ffff:ffff:ffff,LR -2c0f:f1e0::,2c0f:f1e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1e8::,2c0f:f1e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1f0::,2c0f:f1f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f1f8::,2c0f:f1f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f200::,2c0f:f200:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:f208::,2c0f:f208:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f210::,2c0f:f210:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f218::,2c0f:f218:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f220::,2c0f:f220:ffff:ffff:ffff:ffff:ffff:ffff,CG -2c0f:f228::,2c0f:f228:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f230::,2c0f:f230:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:f238::,2c0f:f238:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f240::,2c0f:f240:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f248::,2c0f:f248:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:f250::,2c0f:f250:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f258::,2c0f:f258:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f260::,2c0f:f260:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f268::,2c0f:f268:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f270::,2c0f:f270:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f278::,2c0f:f278:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f280::,2c0f:f280:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f288::,2c0f:f288:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f290::,2c0f:f290:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f298::,2c0f:f298:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f2a0::,2c0f:f2a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2a8::,2c0f:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2b0::,2c0f:f2b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2b8::,2c0f:f2b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2c0::,2c0f:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f2c8::,2c0f:f2c8:ffff:ffff:ffff:ffff:ffff:ffff,KM -2c0f:f2d0::,2c0f:f2d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2d8::,2c0f:f2d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f2e0::,2c0f:f2e0:ffff:ffff:ffff:ffff:ffff:ffff,MA -2c0f:f2e8::,2c0f:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f2f0::,2c0f:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f2f8::,2c0f:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f300::,2c0f:f300:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f308::,2c0f:f308:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f310::,2c0f:f310:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f318::,2c0f:f318:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f320::,2c0f:f320:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f328::,2c0f:f328:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f330::,2c0f:f330:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f338::,2c0f:f338:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f340::,2c0f:f340:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f348::,2c0f:f348:ffff:ffff:ffff:ffff:ffff:ffff,ET -2c0f:f350::,2c0f:f350:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f358::,2c0f:f358:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f360::,2c0f:f360:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:f368::,2c0f:f368:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f370::,2c0f:f370:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f378::,2c0f:f378:ffff:ffff:ffff:ffff:ffff:ffff,MA -2c0f:f380::,2c0f:f380:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f388::,2c0f:f388:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f390::,2c0f:f390:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f398::,2c0f:f398:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f3a0::,2c0f:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f3a8::,2c0f:f3a8:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f3b0::,2c0f:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:f3b8::,2c0f:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f3c0::,2c0f:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f3c8::,2c0f:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f3d0::,2c0f:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f3d8::,2c0f:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f3e0::,2c0f:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,GA -2c0f:f3e8::,2c0f:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f3f0::,2c0f:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f3f8::,2c0f:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f400::,2c0f:f400:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f408::,2c0f:f408:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f410::,2c0f:f410:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f418::,2c0f:f418:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f420::,2c0f:f420:ffff:ffff:ffff:ffff:ffff:ffff,CV -2c0f:f428::,2c0f:f428:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f430::,2c0f:f430:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f438::,2c0f:f438:ffff:ffff:ffff:ffff:ffff:ffff,CV -2c0f:f440::,2c0f:f440:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f448::,2c0f:f448:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f450::,2c0f:f450:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f458::,2c0f:f458:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f460::,2c0f:f460:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f468::,2c0f:f468:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f470::,2c0f:f470:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f478::,2c0f:f478:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f480::,2c0f:f480:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f488::,2c0f:f488:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f490::,2c0f:f490:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f498::,2c0f:f498:ffff:ffff:ffff:ffff:ffff:ffff,CV -2c0f:f4a0::,2c0f:f4a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f4a8::,2c0f:f4a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4b0::,2c0f:f4b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4b8::,2c0f:f4b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4c0::,2c0f:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4c8::,2c0f:f4c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4d0::,2c0f:f4d0:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:f4d8::,2c0f:f4d8:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f4e0::,2c0f:f4e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4e8::,2c0f:f4e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4f0::,2c0f:f4f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f4f8::,2c0f:f4f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f500::,2c0f:f500:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f508::,2c0f:f508:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f510::,2c0f:f510:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:f518::,2c0f:f518:ffff:ffff:ffff:ffff:ffff:ffff,LY -2c0f:f520::,2c0f:f520:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f528::,2c0f:f528:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f530::,2c0f:f530:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:f538::,2c0f:f538:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f540::,2c0f:f540:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f548::,2c0f:f548:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f550::,2c0f:f550:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f558::,2c0f:f558:ffff:ffff:ffff:ffff:ffff:ffff,CD -2c0f:f560::,2c0f:f560:ffff:ffff:ffff:ffff:ffff:ffff,KM -2c0f:f568::,2c0f:f568:ffff:ffff:ffff:ffff:ffff:ffff,CG -2c0f:f570::,2c0f:f570:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f578::,2c0f:f578:ffff:ffff:ffff:ffff:ffff:ffff,TG -2c0f:f580::,2c0f:f580:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f588::,2c0f:f588:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f590::,2c0f:f590:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:f598::,2c0f:f598:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5a0::,2c0f:f5a0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f5a8::,2c0f:f5a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5b0::,2c0f:f5b0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5b8::,2c0f:f5b8:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f5c0::,2c0f:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f5c8::,2c0f:f5c8:ffff:ffff:ffff:ffff:ffff:ffff,TD -2c0f:f5d0::,2c0f:f5d0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5d8::,2c0f:f5d8:ffff:ffff:ffff:ffff:ffff:ffff,CI -2c0f:f5e0::,2c0f:f5e0:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f5e8::,2c0f:f5e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5f0::,2c0f:f5f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f5f8::,2c0f:f5f8:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f600::,2c0f:f600:ffff:ffff:ffff:ffff:ffff:ffff,GN -2c0f:f608::,2c0f:f608:ffff:ffff:ffff:ffff:ffff:ffff,RE -2c0f:f610::,2c0f:f610:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f618::,2c0f:f618:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f620::,2c0f:f620:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f628::,2c0f:f628:ffff:ffff:ffff:ffff:ffff:ffff,RW -2c0f:f630::,2c0f:f630:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f638::,2c0f:f638:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f640::,2c0f:f640:ffff:ffff:ffff:ffff:ffff:ffff,GA -2c0f:f648::,2c0f:f648:ffff:ffff:ffff:ffff:ffff:ffff,TD -2c0f:f650::,2c0f:f650:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f658::,2c0f:f658:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:f660::,2c0f:f660:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f668::,2c0f:f668:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f670::,2c0f:f670:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:f678::,2c0f:f678:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f680::,2c0f:f680:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:f690::,2c0f:f690:ffff:ffff:ffff:ffff:ffff:ffff,SS -2c0f:f698::,2c0f:f698:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f6a0::,2c0f:f6a0:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f6a8::,2c0f:f6a8:ffff:ffff:ffff:ffff:ffff:ffff,BI -2c0f:f6b0::,2c0f:f6b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f6b8::,2c0f:f6b8:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:f6c0::,2c0f:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,CG -2c0f:f6c8::,2c0f:f6c8:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f6d0::,2c0f:f6d0:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:f6d8::,2c0f:f6d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f6e0::,2c0f:f6e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f6e8::,2c0f:f6e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f6f0::,2c0f:f6f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f6f8::,2c0f:f6f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f700::,2c0f:f700:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f708::,2c0f:f708:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f710::,2c0f:f710:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:f718::,2c0f:f718:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f720::,2c0f:f720:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f728::,2c0f:f728:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f730::,2c0f:f730:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f738::,2c0f:f738::ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f738:1::,2c0f:f738:1:ffff:ffff:ffff:ffff:ffff,RU -2c0f:f738:2::,2c0f:f738:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f740::,2c0f:f740:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f748::,2c0f:f748:3e7:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f748:3e8::,2c0f:f748:3e8:7fff:ffff:ffff:ffff:ffff,ZA -2c0f:f748:3e8:8000::,2c0f:f748:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f750::,2c0f:f750:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:f758::,2c0f:f758:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f768::,2c0f:f768:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f770::,2c0f:f770:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f778::,2c0f:f778:ffff:ffff:ffff:ffff:ffff:ffff,NA -2c0f:f780::,2c0f:f780:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f788::,2c0f:f788:ffff:ffff:ffff:ffff:ffff:ffff,BI -2c0f:f798::,2c0f:f798:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f7a0::,2c0f:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f7a8::,2c0f:f7af:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f7b0::,2c0f:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f7b8::,2c0f:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f7c0::,2c0f:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f7c8::,2c0f:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f7d0::,2c0f:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:f7d8::,2c0f:f7d8:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f7e0::,2c0f:f7e0:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:f7e8::,2c0f:f7e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f7f0::,2c0f:f7f0:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f7f8::,2c0f:f7f8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f800::,2c0f:f80f:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f810::,2c0f:f810:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f818::,2c0f:f818:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:f820::,2c0f:f820:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f828::,2c0f:f828:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f838::,2c0f:f838:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f840::,2c0f:f840:ffff:ffff:ffff:ffff:ffff:ffff,GQ -2c0f:f848::,2c0f:f848:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f850::,2c0f:f850:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f858::,2c0f:f858:ffff:ffff:ffff:ffff:ffff:ffff,DZ -2c0f:f860::,2c0f:f860:ffff:ffff:ffff:ffff:ffff:ffff,RW -2c0f:f878::,2c0f:f878:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:f880::,2c0f:f880:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f888::,2c0f:f888:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f890::,2c0f:f890:ffff:ffff:ffff:ffff:ffff:ffff,GM -2c0f:f898::,2c0f:f898:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f8a0::,2c0f:f8a0:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:f8b0::,2c0f:f8b0:ffff:ffff:ffff:ffff:ffff:ffff,BF -2c0f:f8b8::,2c0f:f8b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f8c0::,2c0f:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,GQ -2c0f:f8c8::,2c0f:f8c8:ffff:ffff:ffff:ffff:ffff:ffff,NE -2c0f:f8d8::,2c0f:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f8e0::,2c0f:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f8e8::,2c0f:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f8f0::,2c0f:f8f0:f0ab:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f8f0:f0ac::,2c0f:f8f0:f0ac:7fff:ffff:ffff:ffff:ffff,GB -2c0f:f8f0:f0ac:8000::,2c0f:f8f0:f907:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f8f0:f908::,2c0f:f8f0:f908:7fff:ffff:ffff:ffff:ffff,DE -2c0f:f8f0:f908:8000::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:f8f8::,2c0f:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:f900::,2c0f:f900:ffff:ffff:ffff:ffff:ffff:ffff,ML -2c0f:f908::,2c0f:f908:ffff:ffff:ffff:ffff:ffff:ffff,BI -2c0f:f918::,2c0f:f918:ffff:ffff:ffff:ffff:ffff:ffff,RE -2c0f:f920::,2c0f:f920:ffff:ffff:ffff:ffff:ffff:ffff,CG -2c0f:f928::,2c0f:f928:ffff:ffff:ffff:ffff:ffff:ffff,GW -2c0f:f930::,2c0f:f930:ffff:ffff:ffff:ffff:ffff:ffff,LR -2c0f:f938::,2c0f:f938:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:f940::,2c0f:f940:ffff:ffff:ffff:ffff:ffff:ffff,DZ -2c0f:f948::,2c0f:f948:ffff:ffff:ffff:ffff:ffff:ffff,GA -2c0f:f950::,2c0f:f950:ffff:ffff:ffff:ffff:ffff:ffff,SS -2c0f:f958::,2c0f:f958:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f960::,2c0f:f960:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f968::,2c0f:f968:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:f970::,2c0f:f970:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f978::,2c0f:f978:ffff:ffff:ffff:ffff:ffff:ffff,CD -2c0f:f980::,2c0f:f980:ffff:ffff:ffff:ffff:ffff:ffff,NA -2c0f:f988::,2c0f:f988:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f990::,2c0f:f990:ffff:ffff:ffff:ffff:ffff:ffff,GN -2c0f:f998::,2c0f:f998:ffff:ffff:ffff:ffff:ffff:ffff,MR -2c0f:f9a0::,2c0f:f9a0:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:f9a8::,2c0f:f9a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f9b0::,2c0f:f9b0:ffff:ffff:ffff:ffff:ffff:ffff,GA -2c0f:f9b8::,2c0f:f9b8:1:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f9b8:2::,2c0f:f9b8:2:ffff:ffff:ffff:ffff:ffff,US -2c0f:f9b8:3::,2c0f:f9b8:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:f9c0::,2c0f:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:f9c8::,2c0f:f9c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f9d0::,2c0f:f9d0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:f9d8::,2c0f:f9d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f9e0::,2c0f:f9e0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:f9e8::,2c0f:f9e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:f9f0::,2c0f:f9f0:ffff:ffff:ffff:ffff:ffff:ffff,MG -2c0f:f9f8::,2c0f:f9f8:ffff:ffff:ffff:ffff:ffff:ffff,BJ -2c0f:fa00::,2c0f:fa00:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fa08::,2c0f:fa08:ffff:ffff:ffff:ffff:ffff:ffff,CD -2c0f:fa10::,2c0f:fa10:fffc:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fa10:fffd::,2c0f:fa10:fffd:7fff:ffff:ffff:ffff:ffff,ZM -2c0f:fa10:fffd:8000::,2c0f:fa10:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fa18::,2c0f:fa18:ffff:ffff:ffff:ffff:ffff:ffff,MA -2c0f:fa20::,2c0f:fa20:ffff:ffff:ffff:ffff:ffff:ffff,SS -2c0f:fa28::,2c0f:fa28:ffff:ffff:ffff:ffff:ffff:ffff,MG -2c0f:fa38::,2c0f:fa38:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fa40::,2c0f:fa40:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fa48::,2c0f:fa48:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fa58::,2c0f:fa58:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fa60::,2c0f:fa60:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fa68::,2c0f:fa68:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fa70::,2c0f:fa70:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fa78::,2c0f:fa78:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fa80::,2c0f:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fa88::,2c0f:fa88:ffff:ffff:ffff:ffff:ffff:ffff,ST -2c0f:fa90::,2c0f:fa90:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fa98::,2c0f:fa98:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:faa0::,2c0f:faa7:ffff:ffff:ffff:ffff:ffff:ffff,SD -2c0f:fab0::,2c0f:fabf:ffff:ffff:ffff:ffff:ffff:ffff,TN -2c0f:fac0::,2c0f:fac0:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:fac8::,2c0f:fac8:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:fad8::,2c0f:fad8:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:fae0::,2c0f:fae0:ffff:ffff:ffff:ffff:ffff:ffff,CM -2c0f:fae8::,2c0f:fae8:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:faf0::,2c0f:faf0:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:faf8::,2c0f:faf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb00::,2c0f:fb00:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fb08::,2c0f:fb08:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb10::,2c0f:fb10:ffff:ffff:ffff:ffff:ffff:ffff,LY -2c0f:fb18::,2c0f:fb18:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb20::,2c0f:fb20:ffff:ffff:ffff:ffff:ffff:ffff,MA -2c0f:fb30::,2c0f:fb30:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb38::,2c0f:fb38:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:fb40::,2c0f:fb40:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb48::,2c0f:fb48:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:fb50::,2c0f:fb50:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fb58::,2c0f:fb58:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fb60::,2c0f:fb60:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fb68::,2c0f:fb68:ffff:ffff:ffff:ffff:ffff:ffff,LS -2c0f:fb70::,2c0f:fb70:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:fb78::,2c0f:fb78:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fb80::,2c0f:fb80:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fb88::,2c0f:fb88:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fb90::,2c0f:fb90:ffff:ffff:ffff:ffff:ffff:ffff,MZ -2c0f:fb98::,2c0f:fb98:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fba0::,2c0f:fba0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fba8::,2c0f:fba8:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fbb0::,2c0f:fbb0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fbb8::,2c0f:fbb8:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fbc0::,2c0f:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fbc8::,2c0f:fbc8:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fbd0::,2c0f:fbd0:ffff:ffff:ffff:ffff:ffff:ffff,GN -2c0f:fbd8::,2c0f:fbd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fbe0::,2c0f:fc1f:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fc40::,2c0f:fc40:ffff:ffff:ffff:ffff:ffff:ffff,EG -2c0f:fc48::,2c0f:fc48:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:fc58::,2c0f:fc58:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:fc60::,2c0f:fc61:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fc68::,2c0f:fc68:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fc70::,2c0f:fc70:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fc80::,2c0f:fc80:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fc88::,2c0f:fc89:ffff:ffff:ffff:ffff:ffff:ffff,EG -2c0f:fc90::,2c0f:fc90:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fc98::,2c0f:fc98:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fca0::,2c0f:fca0:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fca8::,2c0f:fca8:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fcb0::,2c0f:fcb0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fcb8::,2c0f:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,GM -2c0f:fcc8::,2c0f:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fcd0::,2c0f:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fcd8::,2c0f:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,SO -2c0f:fce0::,2c0f:fce0:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fce8::,2c0f:fce8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fcf0::,2c0f:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fcf8::,2c0f:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fd00::,2c0f:fd00:ffff:ffff:ffff:ffff:ffff:ffff,LS -2c0f:fd08::,2c0f:fd08:ffff:ffff:ffff:ffff:ffff:ffff,GM -2c0f:fd10::,2c0f:fd10:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fd18::,2c0f:fd18:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:fd20::,2c0f:fd20:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fd28::,2c0f:fd28:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fd30::,2c0f:fd30:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fd38::,2c0f:fd38:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fd40::,2c0f:fd40:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fd48::,2c0f:fd48:ffff:ffff:ffff:ffff:ffff:ffff,ZW -2c0f:fd50::,2c0f:fd50:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:fd58::,2c0f:fd58:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fd60::,2c0f:fd60:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fd68::,2c0f:fd68:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fd78::,2c0f:fd78:ffff:ffff:ffff:ffff:ffff:ffff,BI -2c0f:fd80::,2c0f:fd80:ffff:ffff:ffff:ffff:ffff:ffff,BF -2c0f:fd88::,2c0f:fd88:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:fd90::,2c0f:fd90:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fd98::,2c0f:fd98:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fda0::,2c0f:fda0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fda8::,2c0f:fda8:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fdb0::,2c0f:fdb0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fdb8::,2c0f:fdb8:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fdc0::,2c0f:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fdc8::,2c0f:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fdd0::,2c0f:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fdd8::,2c0f:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fde8::,2c0f:fde8:ffff:ffff:ffff:ffff:ffff:ffff,MW -2c0f:fdf0::,2c0f:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fdf8::,2c0f:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe08::,2c0f:fe08:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fe10::,2c0f:fe10:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fe18::,2c0f:fe18:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe20::,2c0f:fe20:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe28::,2c0f:fe28:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe30::,2c0f:fe30:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fe38::,2c0f:fe38:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fe40::,2c0f:fe40:8001:f:ffff:ffff:ffff:ffff,MU -2c0f:fe40:8001:10::,2c0f:fe40:8001:10:ffff:ffff:ffff:ffff,KE -2c0f:fe40:8001:11::,2c0f:fe40:80fe:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fe40:80ff::,2c0f:fe40:80ff:7fff:ffff:ffff:ffff:ffff,KE -2c0f:fe40:80ff:8000::,2c0f:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fe50::,2c0f:fe50:ffff:ffff:ffff:ffff:ffff:ffff,DZ -2c0f:fe58::,2c0f:fe58:ffff:ffff:ffff:ffff:ffff:ffff,LS -2c0f:fe60::,2c0f:fe60:ffff:ffff:ffff:ffff:ffff:ffff,RW -2c0f:fe68::,2c0f:fe68:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:fe70::,2c0f:fe70:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fe78::,2c0f:fe78:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe80::,2c0f:fe80:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fe88::,2c0f:fe88:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:fe90::,2c0f:fe90:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fe98::,2c0f:fe98:ffff:ffff:ffff:ffff:ffff:ffff,TZ -2c0f:fea0::,2c0f:fea0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fea8::,2c0f:fea8:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:feb0::,2c0f:feb0:16:ffff:ffff:ffff:ffff:ffff,MU -2c0f:feb0:17::,2c0f:feb0:17:7fff:ffff:ffff:ffff:ffff,KE -2c0f:feb0:17:8000::,2c0f:feb0:1e:ffff:ffff:ffff:ffff:ffff,MU -2c0f:feb0:1f::,2c0f:feb0:1f:7fff:ffff:ffff:ffff:ffff,ZA -2c0f:feb0:1f:8000::,2c0f:feb0:1f:ffff:ffff:ffff:ffff:ffff,MU -2c0f:feb0:20::,2c0f:feb0:20:7fff:ffff:ffff:ffff:ffff,ZA -2c0f:feb0:20:8000::,2c0f:feb0:2f:7fff:ffff:ffff:ffff:ffff,MU -2c0f:feb0:2f:8000::,2c0f:feb0:2f:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:feb0:30::,2c0f:feb1:ffff:ffff:ffff:ffff:ffff:ffff,MU -2c0f:feb8::,2c0f:feb8:ffff:ffff:ffff:ffff:ffff:ffff,ZM -2c0f:fec0::,2c0f:fec0:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:fec8::,2c0f:fec8:ffff:ffff:ffff:ffff:ffff:ffff,SD -2c0f:fed8::,2c0f:fed8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fee0::,2c0f:fee0:ffff:ffff:ffff:ffff:ffff:ffff,EG -2c0f:fef0::,2c0f:fef0:ffff:ffff:ffff:ffff:ffff:ffff,SC -2c0f:fef8::,2c0f:fef8:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:ff00::,2c0f:ff00:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:ff08::,2c0f:ff08:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ff10::,2c0f:ff10:ffff:ffff:ffff:ffff:ffff:ffff,CD -2c0f:ff18::,2c0f:ff18:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:ff20::,2c0f:ff20:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:ff28::,2c0f:ff28:ffff:ffff:ffff:ffff:ffff:ffff,SD -2c0f:ff30::,2c0f:ff30:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ff40::,2c0f:ff80:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ff88::,2c0f:ff88:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:ff90::,2c0f:ff90:ffff:ffff:ffff:ffff:ffff:ffff,KE -2c0f:ff98::,2c0f:ff98:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:ffa0::,2c0f:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,UG -2c0f:ffa8::,2c0f:ffa8:ffff:ffff:ffff:ffff:ffff:ffff,LS -2c0f:ffb0::,2c0f:ffb0:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:ffb8::,2c0f:ffb8:ffff:ffff:ffff:ffff:ffff:ffff,SD -2c0f:ffc0::,2c0f:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ffc8::,2c0f:ffc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ffd0::,2c0f:ffd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ffd8::,2c0f:ffd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:ffe8::,2c0f:ffe8:ffff:ffff:ffff:ffff:ffff:ffff,NG -2c0f:fff0::,2c0f:fff0:ffff:ffff:ffff:ffff:ffff:ffff,NG diff --git a/src/tor/src/config/include.am b/src/tor/src/config/include.am deleted file mode 100644 index ee3893493..000000000 --- a/src/tor/src/config/include.am +++ /dev/null @@ -1,20 +0,0 @@ -confdir = $(sysconfdir)/tor - -tordatadir = $(datadir)/tor - -EXTRA_DIST+= \ - src/config/geoip \ - src/config/geoip6 \ - src/config/torrc.minimal.in \ - src/config/torrc.sample.in \ - src/config/README - -conf_DATA = src/config/torrc.sample - -tordata_DATA = src/config/geoip src/config/geoip6 -# fallback_consensus - -# If we don't have it, fake it. -src_config_fallback-consensus: - touch src/config/fallback-consensus - diff --git a/src/tor/src/config/mmdb-convert.py b/src/tor/src/config/mmdb-convert.py deleted file mode 100644 index 3a454a3fc..000000000 --- a/src/tor/src/config/mmdb-convert.py +++ /dev/null @@ -1,466 +0,0 @@ -#!/usr/bin/python3 - -# This software has been dedicated to the public domain under the CC0 -# public domain dedication. -# -# To the extent possible under law, the person who associated CC0 -# with mmdb-convert.py has waived all copyright and related or -# neighboring rights to mmdb-convert.py. -# -# You should have received a copy of the CC0 legalcode along with this -# work in doc/cc0.txt. If not, see -# . - -# Nick Mathewson is responsible for this kludge, but takes no -# responsibility for it. - -"""This kludge is meant to - parse mmdb files in sufficient detail to dump out the old format - that Tor expects. It's also meant to be pure-python. - - When given a simplicity/speed tradeoff, it opts for simplicity. - - You will not understand the code without understanding the MaxMind-DB - file format. It is specified at: - https://github.com/maxmind/MaxMind-DB/blob/master/MaxMind-DB-spec.md. - - This isn't so much tested. When it breaks, you get to keep both - pieces. -""" - -import struct -import bisect -import socket -import binascii -import sys -import time - -METADATA_MARKER = b'\xab\xcd\xefMaxMind.com' - -# Here's some python2/python3 junk. Better solutions wanted. -try: - ord(b"1"[0]) -except TypeError: - def byte_to_int(b): - "convert a single element of a bytestring to an integer." - return b -else: - byte_to_int = ord - -# Here's some more python2/python3 junk. Better solutions wanted. -try: - str(b"a", "utf8") -except TypeError: - bytesToStr = str -else: - def bytesToStr(b): - "convert a bytestring in utf8 to a string." - return str(b, 'utf8') - -def to_int(s): - "Parse a big-endian integer from bytestring s." - result = 0 - for c in s: - result *= 256 - result += byte_to_int(c) - return result - -def to_int24(s): - "Parse a pair of big-endian 24-bit integers from bytestring s." - a, b, c = struct.unpack("!HHH", s) - return ((a <<8)+(b>>8)), (((b&0xff)<<16)+c) - -def to_int32(s): - "Parse a pair of big-endian 32-bit integers from bytestring s." - a, b = struct.unpack("!LL", s) - return a, b - -def to_int28(s): - "Parse a pair of big-endian 28-bit integers from bytestring s." - a, b = unpack("!LL", s + b'\x00') - return (((a & 0xf0) << 20) + (a >> 8)), ((a & 0x0f) << 24) + (b >> 8) - -class Tree(object): - "Holds a node in the tree" - def __init__(self, left, right): - self.left = left - self.right = right - -def resolve_tree(tree, data): - """Fill in the left_item and right_item fields for all values in the tree - so that they point to another Tree, or to a Datum, or to None.""" - d = Datum(None, None, None, None) - def resolve_item(item): - "Helper: resolve a single index." - if item < len(tree): - return tree[item] - elif item == len(tree): - return None - else: - d.pos = (item - len(tree) - 16) - p = bisect.bisect_left(data, d) - assert data[p].pos == d.pos - return data[p] - - for t in tree: - t.left_item = resolve_item(t.left) - t.right_item = resolve_item(t.right) - -def parse_search_tree(s, record_size): - """Given a bytestring and a record size in bits, parse the tree. - Return a list of nodes.""" - record_bytes = (record_size*2) // 8 - nodes = [] - p = 0 - try: - to_leftright = { 24: to_int24, - 28: to_int28, - 32: to_int32 }[ record_size ] - except KeyError: - raise NotImplementedError("Unsupported record size in bits: %d" % - record_size) - while p < len(s): - left, right = to_leftright(s[p:p+record_bytes]) - p += record_bytes - - nodes.append( Tree(left, right ) ) - - return nodes - -class Datum(object): - """Holds a single entry from the Data section""" - def __init__(self, pos, kind, ln, data): - self.pos = pos # Position of this record within data section - self.kind = kind # Type of this record. one of TP_* - self.ln = ln # Length field, which might be overloaded. - self.data = data # Raw bytes data. - self.children = None # Used for arrays and maps. - - def __repr__(self): - return "Datum(%r,%r,%r,%r)" % (self.pos, self.kind, self.ln, self.data) - - # Comparison functions used for bsearch - def __lt__(self, other): - return self.pos < other.pos - - def __gt__(self, other): - return self.pos > other.pos - - def __eq__(self, other): - return self.pos == other.pos - - def build_maps(self): - """If this is a map or array, fill in its 'map' field if it's a map, - and the 'map' field of all its children.""" - - if not hasattr(self, 'nChildren'): - return - - if self.kind == TP_ARRAY: - del self.nChildren - for c in self.children: - c.build_maps() - - elif self.kind == TP_MAP: - del self.nChildren - self.map = {} - for i in range(0, len(self.children), 2): - k = self.children[i].deref() - v = self.children[i+1].deref() - v.build_maps() - if k.kind != TP_UTF8: - raise ValueError("Bad dictionary key type %d"% k.kind) - self.map[bytesToStr(k.data)] = v - - def int_val(self): - """If this is an integer type, return its value""" - assert self.kind in (TP_UINT16, TP_UINT32, TP_UINT64, - TP_UINT128, TP_SINT32) - i = to_int(self.data) - if self.kind == TP_SINT32: - if i & 0x80000000: - i = i - 0x100000000 - return i - - def deref(self): - """If this value is a pointer, return its pointed-to-value. Chase - through multiple layers of pointers if need be. If this isn't - a pointer, return it.""" - n = 0 - s = self - while s.kind == TP_PTR: - s = s.ptr - n += 1 - assert n < 100 - return s - -def resolve_pointers(data): - """Fill in the ptr field of every pointer in data.""" - search = Datum(None, None, None, None) - for d in data: - if d.kind == TP_PTR: - search.pos = d.ln - p = bisect.bisect_left(data, search) - assert data[p].pos == d.ln - d.ptr = data[p] - -TP_PTR = 1 -TP_UTF8 = 2 -TP_DBL = 3 -TP_BYTES = 4 -TP_UINT16 = 5 -TP_UINT32 = 6 -TP_MAP = 7 -TP_SINT32 = 8 -TP_UINT64 = 9 -TP_UINT128 = 10 -TP_ARRAY = 11 -TP_DCACHE = 12 -TP_END = 13 -TP_BOOL = 14 -TP_FLOAT = 15 - -def get_type_and_len(s): - """Data parsing helper: decode the type value and much-overloaded 'length' - field for the value starting at s. Return a 3-tuple of type, length, - and number of bytes used to encode type-plus-length.""" - c = byte_to_int(s[0]) - tp = c >> 5 - skip = 1 - if tp == 0: - tp = byte_to_int(s[1])+7 - skip = 2 - ln = c & 31 - - # I'm sure I don't know what they were thinking here... - if tp == TP_PTR: - len_len = (ln >> 3) + 1 - if len_len < 4: - ln &= 7 - ln <<= len_len * 8 - else: - ln = 0 - ln += to_int(s[skip:skip+len_len]) - ln += (0, 0, 2048, 526336, 0)[len_len] - skip += len_len - elif ln >= 29: - len_len = ln - 28 - ln = to_int(s[skip:skip+len_len]) - ln += (0, 29, 285, 65821)[len_len] - skip += len_len - - return tp, ln, skip - -# Set of types for which 'length' doesn't mean length. -IGNORE_LEN_TYPES = set([ - TP_MAP, # Length is number of key-value pairs that follow. - TP_ARRAY, # Length is number of members that follow. - TP_PTR, # Length is index to pointed-to data element. - TP_BOOL, # Length is 0 or 1. - TP_DCACHE, # Length is number of members that follow -]) - -def parse_data_section(s): - """Given a data section encoded in a bytestring, return a list of - Datum items.""" - - # Stack of possibly nested containers. We use the 'nChildren' member of - # the last one to tell how many more items nest directly inside. - stack = [] - - # List of all items, including nested ones. - data = [] - - # Byte index within the data section. - pos = 0 - - while s: - tp, ln, skip = get_type_and_len(s) - if tp in IGNORE_LEN_TYPES: - real_len = 0 - else: - real_len = ln - - d = Datum(pos, tp, ln, s[skip:skip+real_len]) - data.append(d) - pos += skip+real_len - s = s[skip+real_len:] - - if stack: - stack[-1].children.append(d) - stack[-1].nChildren -= 1 - if stack[-1].nChildren == 0: - del stack[-1] - - if d.kind == TP_ARRAY: - d.nChildren = d.ln - d.children = [] - stack.append(d) - elif d.kind == TP_MAP: - d.nChildren = d.ln * 2 - d.children = [] - stack.append(d) - - return data - -def parse_mm_file(s): - """Parse a MaxMind-DB file.""" - try: - metadata_ptr = s.rindex(METADATA_MARKER) - except ValueError: - raise ValueError("No metadata!") - - metadata = parse_data_section(s[metadata_ptr+len(METADATA_MARKER):]) - - if metadata[0].kind != TP_MAP: - raise ValueError("Bad map") - - metadata[0].build_maps() - mm = metadata[0].map - - tree_size = (((mm['record_size'].int_val() * 2) // 8 ) * - mm['node_count'].int_val()) - - if s[tree_size:tree_size+16] != b'\x00'*16: - raise ValueError("Missing section separator!") - - tree = parse_search_tree(s[:tree_size], mm['record_size'].int_val()) - - data = parse_data_section(s[tree_size+16:metadata_ptr]) - - resolve_pointers(data) - resolve_tree(tree, data) - - for d in data: - d.build_maps() - - return metadata, tree, data - -def format_datum(datum): - """Given a Datum at a leaf of the tree, return the string that we should - write as its value. - - We first try country->iso_code which is the two-character ISO 3166-1 - country code of the country where MaxMind believes the end user is - located. If there's no such key, we try registered_country->iso_code - which is the country in which the ISP has registered the IP address. - Without falling back to registered_country, we'd leave out all ranges - that MaxMind thinks belong to anonymous proxies, because those ranges - don't contain country but only registered_country. In short: let's - fill all A1 entries with what ARIN et. al think. - """ - try: - return bytesToStr(datum.map['country'].map['iso_code'].data) - except KeyError: - pass - try: - return bytesToStr(datum.map['registered_country'].map['iso_code'].data) - except KeyError: - pass - return None - -IPV4_PREFIX = "0"*96 - -def dump_item_ipv4(entries, prefix, val): - """Dump the information for an IPv4 address to entries, where 'prefix' - is a string holding a binary prefix for the address, and 'val' is the - value to dump. If the prefix is not an IPv4 address (it does not start - with 96 bits of 0), then print nothing. - """ - if not prefix.startswith(IPV4_PREFIX): - return - prefix = prefix[96:] - v = int(prefix, 2) - shift = 32 - len(prefix) - lo = v << shift - hi = ((v+1) << shift) - 1 - entries.append((lo, hi, val)) - -def fmt_item_ipv4(entry): - """Format an IPv4 range with lo and hi addresses in decimal form.""" - return "%d,%d,%s\n"%(entry[0], entry[1], entry[2]) - -def fmt_ipv6_addr(v): - """Given a 128-bit integer representing an ipv6 address, return a - string for that ipv6 address.""" - return socket.inet_ntop(socket.AF_INET6, binascii.unhexlify("%032x"%v)) - -def fmt_item_ipv6(entry): - """Format an IPv6 range with lo and hi addresses in hex form.""" - return "%s,%s,%s\n"%(fmt_ipv6_addr(entry[0]), - fmt_ipv6_addr(entry[1]), - entry[2]) - -IPV4_MAPPED_IPV6_PREFIX = "0"*80 + "1"*16 -IPV6_6TO4_PREFIX = "0010000000000010" -TEREDO_IPV6_PREFIX = "0010000000000001" + "0"*16 - -def dump_item_ipv6(entries, prefix, val): - """Dump the information for an IPv6 address prefix to entries, where - 'prefix' is a string holding a binary prefix for the address, - and 'val' is the value to dump. If the prefix is an IPv4 address - (starts with 96 bits of 0), is an IPv4-mapped IPv6 address - (::ffff:0:0/96), or is in the 6to4 mapping subnet (2002::/16), then - print nothing. - """ - if prefix.startswith(IPV4_PREFIX) or \ - prefix.startswith(IPV4_MAPPED_IPV6_PREFIX) or \ - prefix.startswith(IPV6_6TO4_PREFIX) or \ - prefix.startswith(TEREDO_IPV6_PREFIX): - return - v = int(prefix, 2) - shift = 128 - len(prefix) - lo = v << shift - hi = ((v+1) << shift) - 1 - entries.append((lo, hi, val)) - -def dump_tree(entries, node, dump_item, prefix=""): - """Walk the tree rooted at 'node', and call dump_item on the - format_datum output of every leaf of the tree.""" - - if isinstance(node, Tree): - dump_tree(entries, node.left_item, dump_item, prefix+"0") - dump_tree(entries, node.right_item, dump_item, prefix+"1") - elif isinstance(node, Datum): - assert node.kind == TP_MAP - code = format_datum(node) - if code: - dump_item(entries, prefix, code) - else: - assert node == None - -GEOIP_FILE_HEADER = """\ -# Last updated based on %s Maxmind GeoLite2 Country -# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz -# gunzip GeoLite2-Country.mmdb.gz -# python mmdb-convert.py GeoLite2-Country.mmdb -""" - -def write_geoip_file(filename, metadata, the_tree, dump_item, fmt_item): - """Write the entries in the_tree to filename.""" - entries = [] - dump_tree(entries, the_tree[0], dump_item) - fobj = open(filename, 'w') - - build_epoch = metadata[0].map['build_epoch'].int_val() - fobj.write(GEOIP_FILE_HEADER % - time.strftime('%B %-d %Y', time.gmtime(build_epoch))) - - unwritten = None - for entry in entries: - if not unwritten: - unwritten = entry - elif unwritten[1] + 1 == entry[0] and unwritten[2] == entry[2]: - unwritten = (unwritten[0], entry[1], unwritten[2]) - else: - fobj.write(fmt_item(unwritten)) - unwritten = entry - if unwritten: - fobj.write(fmt_item(unwritten)) - fobj.close() - -content = open(sys.argv[1], 'rb').read() -metadata, the_tree, _ = parse_mm_file(content) - -write_geoip_file('geoip', metadata, the_tree, dump_item_ipv4, fmt_item_ipv4) -write_geoip_file('geoip6', metadata, the_tree, dump_item_ipv6, fmt_item_ipv6) diff --git a/src/tor/src/config/torrc.minimal.in b/src/tor/src/config/torrc.minimal.in deleted file mode 100644 index d842fbcaf..000000000 --- a/src/tor/src/config/torrc.minimal.in +++ /dev/null @@ -1,192 +0,0 @@ -## Configuration file for a typical Tor user -## Last updated 9 October 2013 for Tor 0.2.5.2-alpha. -## (may or may not work for much older or much newer versions of Tor.) -## -## Lines that begin with "## " try to explain what's going on. Lines -## that begin with just "#" are disabled commands: you can enable them -## by removing the "#" symbol. -## -## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, -## for more options you can use in this file. -## -## Tor will look for this file in various places based on your platform: -## https://www.torproject.org/docs/faq#torrc - -## Tor opens a socks proxy on port 9050 by default -- even if you don't -## configure one below. Set "SocksPort 0" if you plan to run Tor only -## as a relay, and not make any local application connections yourself. -#SocksPort 9050 # Default: Bind to localhost:9050 for local connections. -#SocksPort 192.168.0.1:9100 # Bind to this address:port too. - -## Entry policies to allow/deny SOCKS requests based on IP address. -## First entry that matches wins. If no SocksPolicy is set, we accept -## all (and only) requests that reach a SocksPort. Untrusted users who -## can access your SocksPort may be able to learn about the connections -## you make. -#SocksPolicy accept 192.168.0.0/16 -#SocksPolicy reject * - -## Logs go to stdout at level "notice" unless redirected by something -## else, like one of the below lines. You can have as many Log lines as -## you want. -## -## We advise using "notice" in most cases, since anything more verbose -## may provide sensitive information to an attacker who obtains the logs. -## -## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log -#Log notice file @LOCALSTATEDIR@/log/tor/notices.log -## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log -#Log debug file @LOCALSTATEDIR@/log/tor/debug.log -## Use the system log instead of Tor's logfiles -#Log notice syslog -## To send all messages to stderr: -#Log debug stderr - -## Uncomment this to start the process in the background... or use -## --runasdaemon 1 on the command line. This is ignored on Windows; -## see the FAQ entry if you want Tor to run as an NT service. -#RunAsDaemon 1 - -## The directory for keeping all the keys/etc. By default, we store -## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. -#DataDirectory @LOCALSTATEDIR@/lib/tor - -## The port on which Tor will listen for local connections from Tor -## controller applications, as documented in control-spec.txt. -#ControlPort 9051 -## If you enable the controlport, be sure to enable one of these -## authentication methods, to prevent attackers from accessing it. -#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C -#CookieAuthentication 1 - -############### This section is just for location-hidden services ### - -## Once you have configured a hidden service, you can look at the -## contents of the file ".../hidden_service/hostname" for the address -## to tell people. -## -## HiddenServicePort x y:z says to redirect requests on port x to the -## address y:z. - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 -#HiddenServicePort 22 127.0.0.1:22 - -################ This section is just for relays ##################### -# -## See https://www.torproject.org/docs/tor-doc-relay for details. - -## Required: what port to advertise for incoming Tor connections. -#ORPort 9001 -## If you want to listen on a port other than the one advertised in -## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as -## follows. You'll need to do ipchains or other port forwarding -## yourself to make this work. -#ORPort 443 NoListen -#ORPort 127.0.0.1:9090 NoAdvertise - -## The IP address or full DNS name for incoming connections to your -## relay. Leave commented out and Tor will guess. -#Address noname.example.com - -## If you have multiple network interfaces, you can specify one for -## outgoing traffic to use. -# OutboundBindAddress 10.0.0.5 - -## A handle for your relay, so people don't have to refer to it by key. -#Nickname ididnteditheconfig - -## Define these to limit how much relayed traffic you will allow. Your -## own traffic is still unthrottled. Note that RelayBandwidthRate must -## be at least 20 KB. -## Note that units for these config options are bytes per second, not bits -## per second, and that prefixes are binary prefixes, i.e. 2^10, 2^20, etc. -#RelayBandwidthRate 100 KB # Throttle traffic to 100KB/s (800Kbps) -#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps) - -## Use these to restrict the maximum traffic per day, week, or month. -## Note that this threshold applies separately to sent and received bytes, -## not to their sum: setting "4 GB" may allow up to 8 GB total before -## hibernating. -## -## Set a maximum of 4 gigabytes each way per period. -#AccountingMax 4 GB -## Each period starts daily at midnight (AccountingMax is per day) -#AccountingStart day 00:00 -## Each period starts on the 3rd of the month at 15:00 (AccountingMax -## is per month) -#AccountingStart month 3 15:00 - -## Administrative contact information for this relay or bridge. This line -## can be used to contact you if your relay or bridge is misconfigured or -## something else goes wrong. Note that we archive and publish all -## descriptors containing these lines and that Google indexes them, so -## spammers might also collect them. You may want to obscure the fact that -## it's an email address and/or generate a new address for this purpose. -#ContactInfo Random Person -## You might also include your PGP or GPG fingerprint if you have one: -#ContactInfo 0xFFFFFFFF Random Person - -## Uncomment this to mirror directory information for others. Please do -## if you have enough bandwidth. -#DirPort 9030 # what port to advertise for directory connections -## If you want to listen on a port other than the one advertised in -## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as -## follows. below too. You'll need to do ipchains or other port -## forwarding yourself to make this work. -#DirPort 80 NoListen -#DirPort 127.0.0.1:9091 NoAdvertise -## Uncomment to return an arbitrary blob of html on your DirPort. Now you -## can explain what Tor is if anybody wonders why your IP address is -## contacting them. See contrib/tor-exit-notice.html in Tor's source -## distribution for a sample. -#DirPortFrontPage @CONFDIR@/tor-exit-notice.html - -## Uncomment this if you run more than one Tor relay, and add the identity -## key fingerprint of each Tor relay you control, even if they're on -## different networks. You declare it here so Tor clients can avoid -## using more than one of your relays in a single circuit. See -## https://www.torproject.org/docs/faq#MultipleRelays -## However, you should never include a bridge's fingerprint here, as it would -## break its concealability and potentionally reveal its IP/TCP address. -#MyFamily $keyid,$keyid,... - -## A comma-separated list of exit policies. They're considered first -## to last, and the first match wins. If you want to _replace_ -## the default exit policy, end this with either a reject *:* or an -## accept *:*. Otherwise, you're _augmenting_ (prepending to) the -## default exit policy. Leave commented to just use the default, which is -## described in the man page or at -## https://www.torproject.org/documentation.html -## -## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses -## for issues you might encounter if you use the default exit policy. -## -## If certain IPs and ports are blocked externally, e.g. by your firewall, -## you should update your exit policy to reflect this -- otherwise Tor -## users will be told that those destinations are down. -## -## For security, by default Tor rejects connections to private (local) -## networks, including to your public IP address. See the man page entry -## for ExitPolicyRejectPrivate if you want to allow "exit enclaving". -## -#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports but no more -#ExitPolicy accept *:119 # accept nntp as well as default exit policy -#ExitPolicy reject *:* # no exits allowed - -## Bridge relays (or "bridges") are Tor relays that aren't listed in the -## main directory. Since there is no complete public list of them, even an -## ISP that filters connections to all the known Tor relays probably -## won't be able to block all the bridges. Also, websites won't treat you -## differently because they won't know you're running Tor. If you can -## be a real relay, please do; but if not, be a bridge! -#BridgeRelay 1 -## By default, Tor will advertise your bridge to users through various -## mechanisms like https://bridges.torproject.org/. If you want to run -## a private bridge, for example because you'll give out your bridge -## address manually to your friends, uncomment this line: -#PublishServerDescriptor 0 - diff --git a/src/tor/src/config/torrc.minimal.in-staging b/src/tor/src/config/torrc.minimal.in-staging deleted file mode 100644 index c537c51f9..000000000 --- a/src/tor/src/config/torrc.minimal.in-staging +++ /dev/null @@ -1,210 +0,0 @@ -## Configuration file for a typical Tor user -## Last updated 22 September 2015 for Tor 0.2.7.3-alpha. -## (may or may not work for much older or much newer versions of Tor.) -## -## Lines that begin with "## " try to explain what's going on. Lines -## that begin with just "#" are disabled commands: you can enable them -## by removing the "#" symbol. -## -## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, -## for more options you can use in this file. -## -## Tor will look for this file in various places based on your platform: -## https://www.torproject.org/docs/faq#torrc - -## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't -## configure one below. Set "SOCKSPort 0" if you plan to run Tor only -## as a relay, and not make any local application connections yourself. -#SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. -#SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. - -## Entry policies to allow/deny SOCKS requests based on IP address. -## First entry that matches wins. If no SOCKSPolicy is set, we accept -## all (and only) requests that reach a SOCKSPort. Untrusted users who -## can access your SOCKSPort may be able to learn about the connections -## you make. -#SOCKSPolicy accept 192.168.0.0/16 -#SOCKSPolicy accept6 FC00::/7 -#SOCKSPolicy reject * - -## Logs go to stdout at level "notice" unless redirected by something -## else, like one of the below lines. You can have as many Log lines as -## you want. -## -## We advise using "notice" in most cases, since anything more verbose -## may provide sensitive information to an attacker who obtains the logs. -## -## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log -#Log notice file @LOCALSTATEDIR@/log/tor/notices.log -## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log -#Log debug file @LOCALSTATEDIR@/log/tor/debug.log -## Use the system log instead of Tor's logfiles -#Log notice syslog -## To send all messages to stderr: -#Log debug stderr - -## Uncomment this to start the process in the background... or use -## --runasdaemon 1 on the command line. This is ignored on Windows; -## see the FAQ entry if you want Tor to run as an NT service. -#RunAsDaemon 1 - -## The directory for keeping all the keys/etc. By default, we store -## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. -#DataDirectory @LOCALSTATEDIR@/lib/tor - -## The port on which Tor will listen for local connections from Tor -## controller applications, as documented in control-spec.txt. -#ControlPort 9051 -## If you enable the controlport, be sure to enable one of these -## authentication methods, to prevent attackers from accessing it. -#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C -#CookieAuthentication 1 - -############### This section is just for location-hidden services ### - -## Once you have configured a hidden service, you can look at the -## contents of the file ".../hidden_service/hostname" for the address -## to tell people. -## -## HiddenServicePort x y:z says to redirect requests on port x to the -## address y:z. - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 -#HiddenServicePort 22 127.0.0.1:22 - -################ This section is just for relays ##################### -# -## See https://www.torproject.org/docs/tor-doc-relay for details. - -## Required: what port to advertise for incoming Tor connections. -#ORPort 9001 -## If you want to listen on a port other than the one advertised in -## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as -## follows. You'll need to do ipchains or other port forwarding -## yourself to make this work. -#ORPort 443 NoListen -#ORPort 127.0.0.1:9090 NoAdvertise - -## The IP address or full DNS name for incoming connections to your -## relay. Leave commented out and Tor will guess. -#Address noname.example.com - -## If you have multiple network interfaces, you can specify one for -## outgoing traffic to use. -# OutboundBindAddress 10.0.0.5 - -## A handle for your relay, so people don't have to refer to it by key. -## Nicknames must be between 1 and 19 characters inclusive, and must -## contain only the alphanumeric characters (a-z, A-Z, 0-9). No unicode, -## no emoji. -#Nickname ididnteditheconfig - -## Define these to limit how much relayed traffic you will allow. Your -## own traffic is still unthrottled. Note that RelayBandwidthRate must -## be at least 75 kilobytes per second. -## Note that units for these config options are bytes (per second), not -## bits (per second), and that prefixes are binary prefixes, i.e. 2^10, -## 2^20, etc. -#RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) -#RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB (1600Kb) - -## Use these to restrict the maximum traffic per day, week, or month. -## Note that this threshold applies separately to sent and received bytes, -## not to their sum: setting "40 GB" may allow up to 80 GB total before -## hibernating. -## -## Set a maximum of 40 gigabytes each way per period. -#AccountingMax 40 GBytes -## Each period starts daily at midnight (AccountingMax is per day) -#AccountingStart day 00:00 -## Each period starts on the 3rd of the month at 15:00 (AccountingMax -## is per month) -#AccountingStart month 3 15:00 - -## Administrative contact information for this relay or bridge. This line -## can be used to contact you if your relay or bridge is misconfigured or -## something else goes wrong. Note that we archive and publish all -## descriptors containing these lines and that Google indexes them, so -## spammers might also collect them. You may want to obscure the fact that -## it's an email address and/or generate a new address for this purpose. -## Notice that "<" and ">" are recommended. -#ContactInfo Random Person -## You might also include your PGP or GPG fingerprint if you have one. -## Use the full fingerprint, not just a (short) KeyID: KeyIDs are easy -## to forge. -#ContactInfo FFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF Random Person - -## Uncomment this to mirror directory information for others. Please do -## if you have enough bandwidth. -#DirPort 9030 # what port to advertise for directory connections -## If you want to listen on a port other than the one advertised in -## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as -## follows. below too. You'll need to do ipchains or other port -## forwarding yourself to make this work. -#DirPort 80 NoListen -#DirPort 127.0.0.1:9091 NoAdvertise -## Uncomment to return an arbitrary blob of html on your DirPort. Now you -## can explain what Tor is if anybody wonders why your IP address is -## contacting them. See contrib/tor-exit-notice.html in Tor's source -## distribution for a sample. -#DirPortFrontPage @CONFDIR@/tor-exit-notice.html - -## Uncomment this if you run more than one Tor relay, and add the -## identity key fingerprint of each Tor relay you control, even if -## they're on different networks. Include "$" with each key id. You -## declare it here so Tor clients can avoid using more than one of -## your relays in a single circuit. -## See https://www.torproject.org/docs/faq#MultipleRelays -## However, you should never include a bridge's fingerprint here, as it would -## break its concealability and potentially reveal its IP/TCP address. -#MyFamily $keyid,$keyid,... - -## A comma-separated list of exit policies. They're considered first -## to last, and the first match wins. -## -## If you want to allow the same ports on IPv4 and IPv6, write your rules -## using accept/reject *. If you want to allow different ports on IPv4 and -## IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules -## using accept/reject *4. -## -## If you want to _replace_ the default exit policy, end this with either a -## reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) -## the default exit policy. Leave commented to just use the default, which is -## described in the man page or at -## https://www.torproject.org/documentation.html -## -## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses -## for issues you might encounter if you use the default exit policy. -## -## If certain IPs and ports are blocked externally, e.g. by your firewall, -## you should update your exit policy to reflect this -- otherwise Tor -## users will be told that those destinations are down. -## -## For security, by default Tor rejects connections to private (local) -## networks, including to the configured primary public IPv4 and IPv6 addresses, -## and any public IPv4 and IPv6 addresses on any interface on the relay. -## See the man page entry for ExitPolicyRejectPrivate if you want to allow -## "exit enclaving". -## -#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports on IPv4 and IPv6 but no more -#ExitPolicy accept *:119 # accept nntp ports on IPv4 and IPv6 as well as default exit policy -#ExitPolicy accept *4:119 # accept nntp ports on IPv4 only as well as default exit policy -#ExitPolicy accept6 *6:119 # accept nntp ports on IPv6 only as well as default exit policy -#ExitPolicy reject *:* # no exits allowed - -## Bridge relays (or "bridges") are Tor relays that aren't listed in the -## main directory. Since there is no complete public list of them, even an -## ISP that filters connections to all the known Tor relays probably -## won't be able to block all the bridges. Also, websites won't treat you -## differently because they won't know you're running Tor. If you can -## be a real relay, please do; but if not, be a bridge! -#BridgeRelay 1 -## By default, Tor will advertise your bridge to users through various -## mechanisms like https://bridges.torproject.org/. If you want to run -## a private bridge, for example because you'll give out your bridge -## address manually to your friends, uncomment this line: -#PublishServerDescriptor 0 diff --git a/src/tor/src/config/torrc.sample.in b/src/tor/src/config/torrc.sample.in deleted file mode 100644 index 8f3597f3f..000000000 --- a/src/tor/src/config/torrc.sample.in +++ /dev/null @@ -1,220 +0,0 @@ -## Configuration file for a typical Tor user -## Last updated 22 September 2015 for Tor 0.2.7.3-alpha. -## (may or may not work for much older or much newer versions of Tor.) -## -## Lines that begin with "## " try to explain what's going on. Lines -## that begin with just "#" are disabled commands: you can enable them -## by removing the "#" symbol. -## -## See 'man tor', or https://www.torproject.org/docs/tor-manual.html, -## for more options you can use in this file. -## -## Tor will look for this file in various places based on your platform: -## https://www.torproject.org/docs/faq#torrc - -## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't -## configure one below. Set "SOCKSPort 0" if you plan to run Tor only -## as a relay, and not make any local application connections yourself. -#SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. -#SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. - -## Entry policies to allow/deny SOCKS requests based on IP address. -## First entry that matches wins. If no SOCKSPolicy is set, we accept -## all (and only) requests that reach a SOCKSPort. Untrusted users who -## can access your SOCKSPort may be able to learn about the connections -## you make. -#SOCKSPolicy accept 192.168.0.0/16 -#SOCKSPolicy accept6 FC00::/7 -#SOCKSPolicy reject * - -## Logs go to stdout at level "notice" unless redirected by something -## else, like one of the below lines. You can have as many Log lines as -## you want. -## -## We advise using "notice" in most cases, since anything more verbose -## may provide sensitive information to an attacker who obtains the logs. -## -## Send all messages of level 'notice' or higher to @LOCALSTATEDIR@/log/tor/notices.log -#Log notice file @LOCALSTATEDIR@/log/tor/notices.log -## Send every possible message to @LOCALSTATEDIR@/log/tor/debug.log -#Log debug file @LOCALSTATEDIR@/log/tor/debug.log -## Use the system log instead of Tor's logfiles -#Log notice syslog -## To send all messages to stderr: -#Log debug stderr - -## Uncomment this to start the process in the background... or use -## --runasdaemon 1 on the command line. This is ignored on Windows; -## see the FAQ entry if you want Tor to run as an NT service. -#RunAsDaemon 1 - -## The directory for keeping all the keys/etc. By default, we store -## things in $HOME/.tor on Unix, and in Application Data\tor on Windows. -#DataDirectory @LOCALSTATEDIR@/lib/tor - -## The port on which Tor will listen for local connections from Tor -## controller applications, as documented in control-spec.txt. -#ControlPort 9051 -## If you enable the controlport, be sure to enable one of these -## authentication methods, to prevent attackers from accessing it. -#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C -#CookieAuthentication 1 - -############### This section is just for location-hidden services ### - -## Once you have configured a hidden service, you can look at the -## contents of the file ".../hidden_service/hostname" for the address -## to tell people. -## -## HiddenServicePort x y:z says to redirect requests on port x to the -## address y:z. - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 - -#HiddenServiceDir @LOCALSTATEDIR@/lib/tor/other_hidden_service/ -#HiddenServicePort 80 127.0.0.1:80 -#HiddenServicePort 22 127.0.0.1:22 - -################ This section is just for relays ##################### -# -## See https://www.torproject.org/docs/tor-doc-relay for details. - -## Required: what port to advertise for incoming Tor connections. -#ORPort 9001 -## If you want to listen on a port other than the one advertised in -## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as -## follows. You'll need to do ipchains or other port forwarding -## yourself to make this work. -#ORPort 443 NoListen -#ORPort 127.0.0.1:9090 NoAdvertise - -## The IP address or full DNS name for incoming connections to your -## relay. Leave commented out and Tor will guess. -#Address noname.example.com - -## If you have multiple network interfaces, you can specify one for -## outgoing traffic to use. -## OutboundBindAddressExit will be used for all exit traffic, while -## OutboundBindAddressOR will be used for all other connections. -## If you do not wish to differentiate, use OutboundBindAddress to -## specify the same address for both in a single line. -#OutboundBindAddressExit 10.0.0.4 -#OutboundBindAddressOR 10.0.0.5 - -## A handle for your relay, so people don't have to refer to it by key. -## Nicknames must be between 1 and 19 characters inclusive, and must -## contain only the characters [a-zA-Z0-9]. -#Nickname ididnteditheconfig - -## Define these to limit how much relayed traffic you will allow. Your -## own traffic is still unthrottled. Note that RelayBandwidthRate must -## be at least 75 kilobytes per second. -## Note that units for these config options are bytes (per second), not -## bits (per second), and that prefixes are binary prefixes, i.e. 2^10, -## 2^20, etc. -#RelayBandwidthRate 100 KBytes # Throttle traffic to 100KB/s (800Kbps) -#RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB (1600Kb) - -## Use these to restrict the maximum traffic per day, week, or month. -## Note that this threshold applies separately to sent and received bytes, -## not to their sum: setting "40 GB" may allow up to 80 GB total before -## hibernating. -## -## Set a maximum of 40 gigabytes each way per period. -#AccountingMax 40 GBytes -## Each period starts daily at midnight (AccountingMax is per day) -#AccountingStart day 00:00 -## Each period starts on the 3rd of the month at 15:00 (AccountingMax -## is per month) -#AccountingStart month 3 15:00 - -## Administrative contact information for this relay or bridge. This line -## can be used to contact you if your relay or bridge is misconfigured or -## something else goes wrong. Note that we archive and publish all -## descriptors containing these lines and that Google indexes them, so -## spammers might also collect them. You may want to obscure the fact that -## it's an email address and/or generate a new address for this purpose. -#ContactInfo Random Person -## You might also include your PGP or GPG fingerprint if you have one: -#ContactInfo 0xFFFFFFFF Random Person - -## Uncomment this to mirror directory information for others. Please do -## if you have enough bandwidth. -#DirPort 9030 # what port to advertise for directory connections -## If you want to listen on a port other than the one advertised in -## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as -## follows. below too. You'll need to do ipchains or other port -## forwarding yourself to make this work. -#DirPort 80 NoListen -#DirPort 127.0.0.1:9091 NoAdvertise -## Uncomment to return an arbitrary blob of html on your DirPort. Now you -## can explain what Tor is if anybody wonders why your IP address is -## contacting them. See contrib/tor-exit-notice.html in Tor's source -## distribution for a sample. -#DirPortFrontPage @CONFDIR@/tor-exit-notice.html - -## Uncomment this if you run more than one Tor relay, and add the identity -## key fingerprint of each Tor relay you control, even if they're on -## different networks. You declare it here so Tor clients can avoid -## using more than one of your relays in a single circuit. See -## https://www.torproject.org/docs/faq#MultipleRelays -## However, you should never include a bridge's fingerprint here, as it would -## break its concealability and potentially reveal its IP/TCP address. -#MyFamily $keyid,$keyid,... - -## A comma-separated list of exit policies. They're considered first -## to last, and the first match wins. -## -## If you want to allow the same ports on IPv4 and IPv6, write your rules -## using accept/reject *. If you want to allow different ports on IPv4 and -## IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules -## using accept/reject *4. -## -## If you want to _replace_ the default exit policy, end this with either a -## reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) -## the default exit policy. Leave commented to just use the default, which is -## described in the man page or at -## https://www.torproject.org/documentation.html -## -## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses -## for issues you might encounter if you use the default exit policy. -## -## If certain IPs and ports are blocked externally, e.g. by your firewall, -## you should update your exit policy to reflect this -- otherwise Tor -## users will be told that those destinations are down. -## -## For security, by default Tor rejects connections to private (local) -## networks, including to the configured primary public IPv4 and IPv6 addresses, -## and any public IPv4 and IPv6 addresses on any interface on the relay. -## See the man page entry for ExitPolicyRejectPrivate if you want to allow -## "exit enclaving". -## -#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports on IPv4 and IPv6 but no more -#ExitPolicy accept *:119 # accept nntp ports on IPv4 and IPv6 as well as default exit policy -#ExitPolicy accept *4:119 # accept nntp ports on IPv4 only as well as default exit policy -#ExitPolicy accept6 *6:119 # accept nntp ports on IPv6 only as well as default exit policy -#ExitPolicy reject *:* # no exits allowed - -## Bridge relays (or "bridges") are Tor relays that aren't listed in the -## main directory. Since there is no complete public list of them, even an -## ISP that filters connections to all the known Tor relays probably -## won't be able to block all the bridges. Also, websites won't treat you -## differently because they won't know you're running Tor. If you can -## be a real relay, please do; but if not, be a bridge! -#BridgeRelay 1 -## By default, Tor will advertise your bridge to users through various -## mechanisms like https://bridges.torproject.org/. If you want to run -## a private bridge, for example because you'll give out your bridge -## address manually to your friends, uncomment this line: -#PublishServerDescriptor 0 - -## Configuration options can be imported from files or folders using the %include -## option with the value being a path. If the path is a file, the options from the -## file will be parsed as if they were written where the %include option is. If -## the path is a folder, all files on that folder will be parsed following lexical -## order. Files starting with a dot are ignored. Files on subfolders are ignored. -## The %include option can be used recursively. -#%include /etc/torrc.d/ -#%include /etc/torrc.custom - diff --git a/src/tor/src/ext/Makefile.nmake b/src/tor/src/ext/Makefile.nmake deleted file mode 100644 index d02d03bf4..000000000 --- a/src/tor/src/ext/Makefile.nmake +++ /dev/null @@ -1,12 +0,0 @@ -all: csiphash.lib - -CFLAGS = /O2 /MT /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common \ - /I ..\ext - -CSIPHASH_OBJECTS = csiphash.obj - -csiphash.lib: $(CSIPHASH_OBJECTS) - lib $(CSIPHASH_OBJECTS) $(CURVE25519_DONNA_OBJECTS) /out:csiphash.lib - -clean: - del *.obj *.lib diff --git a/src/tor/src/ext/OpenBSD_malloc_Linux.c b/src/tor/src/ext/OpenBSD_malloc_Linux.c deleted file mode 100644 index 855c91231..000000000 --- a/src/tor/src/ext/OpenBSD_malloc_Linux.c +++ /dev/null @@ -1,2047 +0,0 @@ -/* Version 1.83 for Linux. - * Compilation: gcc -shared -fPIC -O2 OpenBSD_malloc_Linux.c -o malloc.so - * Launching: LD_PRELOAD=/path/to/malloc.so firefox - */ - -/* $OpenBSD: malloc.c,v 1.83 2006/05/14 19:53:40 otto Exp $ */ - -/* - * ---------------------------------------------------------------------------- - * "THE BEER-WARE LICENSE" (Revision 42): - * wrote this file. As long as you retain this notice you - * can do whatever you want with this stuff. If we meet some day, and you think - * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp - * ---------------------------------------------------------------------------- - */ - -/* We use this macro to remove some code that we don't actually want, - * rather than to fix its warnings. */ -#define BUILDING_FOR_TOR - -/* - * Defining MALLOC_EXTRA_SANITY will enable extra checks which are - * related to internal conditions and consistency in malloc.c. This has - * a noticeable runtime performance hit, and generally will not do you - * any good unless you fiddle with the internals of malloc or want - * to catch random pointer corruption as early as possible. - */ -#ifndef MALLOC_EXTRA_SANITY -#undef MALLOC_EXTRA_SANITY -#endif - -/* - * Defining MALLOC_STATS will enable you to call malloc_dump() and set - * the [dD] options in the MALLOC_OPTIONS environment variable. - * It has no run-time performance hit, but does pull in stdio... - */ -#ifndef MALLOC_STATS -#undef MALLOC_STATS -#endif - -/* - * What to use for Junk. This is the byte value we use to fill with - * when the 'J' option is enabled. - */ -#define SOME_JUNK 0xd0 /* as in "Duh" :-) */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* For SIZE_MAX */ -#include "torint.h" - -//#include "thread_private.h" - -/* - * The basic parameters you can tweak. - * - * malloc_pageshift pagesize = 1 << malloc_pageshift - * It's probably best if this is the native - * page size, but it shouldn't have to be. - * - * malloc_minsize minimum size of an allocation in bytes. - * If this is too small it's too much work - * to manage them. This is also the smallest - * unit of alignment used for the storage - * returned by malloc/realloc. - * - */ - -static int align = 0; -static size_t g_alignment = 0; - -extern int __libc_enable_secure; - -#ifndef HAVE_ISSETUGID -static int issetugid(void) -{ - if (__libc_enable_secure) return 1; - if (getuid() != geteuid()) return 1; - if (getgid() != getegid()) return 1; - return 0; -} -#endif - -#define PGSHIFT 12 -#undef MADV_FREE -#define MADV_FREE MADV_DONTNEED -#include -static pthread_mutex_t gen_mutex = PTHREAD_MUTEX_INITIALIZER; - -#define _MALLOC_LOCK_INIT() {;} -#define _MALLOC_LOCK() {pthread_mutex_lock(&gen_mutex);} -#define _MALLOC_UNLOCK() {pthread_mutex_unlock(&gen_mutex);} - -#if defined(__sparc__) || defined(__alpha__) -#define malloc_pageshift 13U -#endif -#if defined(__ia64__) -#define malloc_pageshift 14U -#endif - -#ifndef malloc_pageshift -#define malloc_pageshift (PGSHIFT) -#endif - -/* - * No user serviceable parts behind this point. - * - * This structure describes a page worth of chunks. - */ -struct pginfo { - struct pginfo *next; /* next on the free list */ - void *page; /* Pointer to the page */ - u_short size; /* size of this page's chunks */ - u_short shift; /* How far to shift for this size chunks */ - u_short free; /* How many free chunks */ - u_short total; /* How many chunk */ - u_long bits[1];/* Which chunks are free */ -}; - -/* How many bits per u_long in the bitmap */ -#define MALLOC_BITS (int)((NBBY * sizeof(u_long))) - -/* - * This structure describes a number of free pages. - */ -struct pgfree { - struct pgfree *next; /* next run of free pages */ - struct pgfree *prev; /* prev run of free pages */ - void *page; /* pointer to free pages */ - void *pdir; /* pointer to the base page's dir */ - size_t size; /* number of bytes free */ -}; - -/* - * Magic values to put in the page_directory - */ -#define MALLOC_NOT_MINE ((struct pginfo*) 0) -#define MALLOC_FREE ((struct pginfo*) 1) -#define MALLOC_FIRST ((struct pginfo*) 2) -#define MALLOC_FOLLOW ((struct pginfo*) 3) -#define MALLOC_MAGIC ((struct pginfo*) 4) - -#ifndef malloc_minsize -#define malloc_minsize 16UL -#endif - -#if !defined(malloc_pagesize) -#define malloc_pagesize (1UL<>1) -#endif - -/* A mask for the offset inside a page. */ -#define malloc_pagemask ((malloc_pagesize)-1) - -#define pageround(foo) (((foo) + (malloc_pagemask)) & ~malloc_pagemask) -#define ptr2index(foo) (((u_long)(foo) >> malloc_pageshift)+malloc_pageshift) -#define index2ptr(idx) ((void*)(((idx)-malloc_pageshift)<dirnum) == pidx) - *pdi = last_dir; - else if (prev_dir != NULL && PD_IDX(prev_dir->dirnum) == pidx) - *pdi = prev_dir; - else if (last_dir != NULL && prev_dir != NULL) { - if ((PD_IDX(last_dir->dirnum) > pidx) ? - (PD_IDX(last_dir->dirnum) - pidx) : - (pidx - PD_IDX(last_dir->dirnum)) - < (PD_IDX(prev_dir->dirnum) > pidx) ? - (PD_IDX(prev_dir->dirnum) - pidx) : - (pidx - PD_IDX(prev_dir->dirnum))) - *pdi = last_dir; - else - *pdi = prev_dir; - - if (PD_IDX((*pdi)->dirnum) > pidx) { - for (spi = (*pdi)->prev; - spi != NULL && PD_IDX(spi->dirnum) > pidx; - spi = spi->prev) - *pdi = spi; - if (spi != NULL) - *pdi = spi; - } else - for (spi = (*pdi)->next; - spi != NULL && PD_IDX(spi->dirnum) <= pidx; - spi = spi->next) - *pdi = spi; - } else { - *pdi = (struct pdinfo *) ((caddr_t) page_dir + pdi_off); - for (spi = *pdi; - spi != NULL && PD_IDX(spi->dirnum) <= pidx; - spi = spi->next) - *pdi = spi; - } - - return ((PD_IDX((*pdi)->dirnum) == pidx) ? 0 : - (PD_IDX((*pdi)->dirnum) > pidx) ? 1 : -1); -} - -#ifdef MALLOC_STATS -void -malloc_dump(int fd) -{ - char buf[1024]; - struct pginfo **pd; - struct pgfree *pf; - struct pdinfo *pi; - u_long j; - - pd = page_dir; - pi = (struct pdinfo *) ((caddr_t) pd + pdi_off); - - /* print out all the pages */ - for (j = 0; j <= last_index;) { - snprintf(buf, sizeof buf, "%08lx %5lu ", j << malloc_pageshift, j); - write(fd, buf, strlen(buf)); - if (pd[PI_OFF(j)] == MALLOC_NOT_MINE) { - for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_NOT_MINE;) { - if (!PI_OFF(++j)) { - if ((pi = pi->next) == NULL || - PD_IDX(pi->dirnum) != PI_IDX(j)) - break; - pd = pi->base; - j += pdi_mod; - } - } - j--; - snprintf(buf, sizeof buf, ".. %5lu not mine\n", j); - write(fd, buf, strlen(buf)); - } else if (pd[PI_OFF(j)] == MALLOC_FREE) { - for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_FREE;) { - if (!PI_OFF(++j)) { - if ((pi = pi->next) == NULL || - PD_IDX(pi->dirnum) != PI_IDX(j)) - break; - pd = pi->base; - j += pdi_mod; - } - } - j--; - snprintf(buf, sizeof buf, ".. %5lu free\n", j); - write(fd, buf, strlen(buf)); - } else if (pd[PI_OFF(j)] == MALLOC_FIRST) { - for (j++; j <= last_index && pd[PI_OFF(j)] == MALLOC_FOLLOW;) { - if (!PI_OFF(++j)) { - if ((pi = pi->next) == NULL || - PD_IDX(pi->dirnum) != PI_IDX(j)) - break; - pd = pi->base; - j += pdi_mod; - } - } - j--; - snprintf(buf, sizeof buf, ".. %5lu in use\n", j); - write(fd, buf, strlen(buf)); - } else if (pd[PI_OFF(j)] < MALLOC_MAGIC) { - snprintf(buf, sizeof buf, "(%p)\n", pd[PI_OFF(j)]); - write(fd, buf, strlen(buf)); - } else { - snprintf(buf, sizeof buf, "%p %d (of %d) x %d @ %p --> %p\n", - pd[PI_OFF(j)], pd[PI_OFF(j)]->free, - pd[PI_OFF(j)]->total, pd[PI_OFF(j)]->size, - pd[PI_OFF(j)]->page, pd[PI_OFF(j)]->next); - write(fd, buf, strlen(buf)); - } - if (!PI_OFF(++j)) { - if ((pi = pi->next) == NULL) - break; - pd = pi->base; - j += (1 + PD_IDX(pi->dirnum) - PI_IDX(j)) * pdi_mod; - } - } - - for (pf = free_list.next; pf; pf = pf->next) { - snprintf(buf, sizeof buf, "Free: @%p [%p...%p[ %ld ->%p <-%p\n", - pf, pf->page, (char *)pf->page + pf->size, - pf->size, pf->prev, pf->next); - write(fd, buf, strlen(buf)); - if (pf == pf->next) { - snprintf(buf, sizeof buf, "Free_list loops\n"); - write(fd, buf, strlen(buf)); - break; - } - } - - /* print out various info */ - snprintf(buf, sizeof buf, "Minsize\t%lu\n", malloc_minsize); - write(fd, buf, strlen(buf)); - snprintf(buf, sizeof buf, "Maxsize\t%lu\n", malloc_maxsize); - write(fd, buf, strlen(buf)); - snprintf(buf, sizeof buf, "Pagesize\t%lu\n", malloc_pagesize); - write(fd, buf, strlen(buf)); - snprintf(buf, sizeof buf, "Pageshift\t%u\n", malloc_pageshift); - write(fd, buf, strlen(buf)); - snprintf(buf, sizeof buf, "In use\t%lu\n", (u_long) malloc_used); - write(fd, buf, strlen(buf)); - snprintf(buf, sizeof buf, "Guarded\t%lu\n", (u_long) malloc_guarded); - write(fd, buf, strlen(buf)); -} -#endif /* MALLOC_STATS */ - -extern char *__progname; - -static void -wrterror(const char *p) -{ -#ifndef BUILDING_FOR_TOR - const char *q = " error: "; - struct iovec iov[5]; - - iov[0].iov_base = __progname; - iov[0].iov_len = strlen(__progname); - iov[1].iov_base = (char*)malloc_func; - iov[1].iov_len = strlen(malloc_func); - iov[2].iov_base = (char*)q; - iov[2].iov_len = strlen(q); - iov[3].iov_base = (char*)p; - iov[3].iov_len = strlen(p); - iov[4].iov_base = (char*)"\n"; - iov[4].iov_len = 1; - writev(STDERR_FILENO, iov, 5); -#else - (void)p; -#endif - suicide = 1; -#ifdef MALLOC_STATS - if (malloc_stats) - malloc_dump(STDERR_FILENO); -#endif /* MALLOC_STATS */ - malloc_active--; - if (malloc_abort) - abort(); -} - -static void -wrtwarning(const char *p) -{ -#ifndef BUILDING_FOR_TOR - const char *q = " warning: "; - struct iovec iov[5]; -#endif - - if (malloc_abort) - wrterror(p); - else if (malloc_silent) - return; - -#ifndef BUILDING_FOR_TOR - iov[0].iov_base = __progname; - iov[0].iov_len = strlen(__progname); - iov[1].iov_base = (char*)malloc_func; - iov[1].iov_len = strlen(malloc_func); - iov[2].iov_base = (char*)q; - iov[2].iov_len = strlen(q); - iov[3].iov_base = (char*)p; - iov[3].iov_len = strlen(p); - iov[4].iov_base = (char*)"\n"; - iov[4].iov_len = 1; - - (void) writev(STDERR_FILENO, iov, 5); -#else - (void)p; -#endif -} - -#ifdef MALLOC_STATS -static void -malloc_exit(void) -{ - char *q = "malloc() warning: Couldn't dump stats\n"; - int save_errno = errno, fd; - - fd = open("malloc.out", O_RDWR|O_APPEND); - if (fd != -1) { - malloc_dump(fd); - close(fd); - } else - write(STDERR_FILENO, q, strlen(q)); - errno = save_errno; -} -#endif /* MALLOC_STATS */ - -/* - * Allocate aligned mmaped chunk - */ - -static void *MMAP_A(size_t pages, size_t alignment) -{ - void *j, *p; - size_t first_size, rest, begin, end; - if (pages%malloc_pagesize != 0) - pages = pages - pages%malloc_pagesize + malloc_pagesize; - first_size = pages + alignment - malloc_pagesize; - p = MMAP(first_size); - rest = ((size_t)p) % alignment; - j = (rest == 0) ? p : (void*) ((size_t)p + alignment - rest); - begin = (size_t)j - (size_t)p; - if (begin != 0) munmap(p, begin); - end = (size_t)p + first_size - ((size_t)j + pages); - if(end != 0) munmap( (void*) ((size_t)j + pages), end); - - return j; -} - - -/* - * Allocate a number of pages from the OS - */ -static void * -map_pages(size_t pages) -{ - struct pdinfo *pi, *spi; - struct pginfo **pd; - u_long idx, pidx, lidx; - caddr_t result, tail; - u_long index, lindex; - void *pdregion = NULL; - size_t dirs, cnt; - - pages <<= malloc_pageshift; - if (!align) - result = MMAP(pages + malloc_guard); - else { - result = MMAP_A(pages + malloc_guard, g_alignment); - } - if (result == MAP_FAILED) { -#ifdef MALLOC_EXTRA_SANITY - wrtwarning("(ES): map_pages fails"); -#endif /* MALLOC_EXTRA_SANITY */ - errno = ENOMEM; - return (NULL); - } - index = ptr2index(result); - tail = result + pages + malloc_guard; - lindex = ptr2index(tail) - 1; - if (malloc_guard) - mprotect(result + pages, malloc_guard, PROT_NONE); - - pidx = PI_IDX(index); - lidx = PI_IDX(lindex); - - if (tail > malloc_brk) { - malloc_brk = tail; - last_index = lindex; - } - - dirs = lidx - pidx; - - /* Insert directory pages, if needed. */ - if (pdir_lookup(index, &pi) != 0) - dirs++; - - if (dirs > 0) { - pdregion = MMAP(malloc_pagesize * dirs); - if (pdregion == MAP_FAILED) { - munmap(result, tail - result); -#ifdef MALLOC_EXTRA_SANITY - wrtwarning("(ES): map_pages fails"); -#endif - errno = ENOMEM; - return (NULL); - } - } - - cnt = 0; - for (idx = pidx, spi = pi; idx <= lidx; idx++) { - if (pi == NULL || PD_IDX(pi->dirnum) != idx) { - pd = (struct pginfo **)((char *)pdregion + - cnt * malloc_pagesize); - cnt++; - memset(pd, 0, malloc_pagesize); - pi = (struct pdinfo *) ((caddr_t) pd + pdi_off); - pi->base = pd; - pi->prev = spi; - pi->next = spi->next; - pi->dirnum = idx * (malloc_pagesize / - sizeof(struct pginfo *)); - - if (spi->next != NULL) - spi->next->prev = pi; - spi->next = pi; - } - if (idx > pidx && idx < lidx) { - pi->dirnum += pdi_mod; - } else if (idx == pidx) { - if (pidx == lidx) { - pi->dirnum += (u_long)(tail - result) >> - malloc_pageshift; - } else { - pi->dirnum += pdi_mod - PI_OFF(index); - } - } else { - pi->dirnum += PI_OFF(ptr2index(tail - 1)) + 1; - } -#ifdef MALLOC_EXTRA_SANITY - if (PD_OFF(pi->dirnum) > pdi_mod || PD_IDX(pi->dirnum) > idx) { - wrterror("(ES): pages directory overflow"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - if (idx == pidx && pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - spi = pi; - pi = spi->next; - } -#ifdef MALLOC_EXTRA_SANITY - if (cnt > dirs) - wrtwarning("(ES): cnt > dirs"); -#endif /* MALLOC_EXTRA_SANITY */ - if (cnt < dirs) - munmap((char *)pdregion + cnt * malloc_pagesize, - (dirs - cnt) * malloc_pagesize); - - return (result); -} - -/* - * Initialize the world - */ -static void -malloc_init(void) -{ - char *p, b[64]; - int i, j, save_errno = errno; - - _MALLOC_LOCK_INIT(); - -#ifdef MALLOC_EXTRA_SANITY - malloc_junk = 1; -#endif /* MALLOC_EXTRA_SANITY */ - - for (i = 0; i < 3; i++) { - switch (i) { - case 0: - j = (int) readlink("/etc/malloc.conf", b, sizeof b - 1); - if (j <= 0) - continue; - b[j] = '\0'; - p = b; - break; - case 1: - if (issetugid() == 0) - p = getenv("MALLOC_OPTIONS"); - else - continue; - break; - case 2: - p = malloc_options; - break; - default: - p = NULL; - } - - for (; p != NULL && *p != '\0'; p++) { - switch (*p) { - case '>': - malloc_cache <<= 1; - break; - case '<': - malloc_cache >>= 1; - break; - case 'a': - malloc_abort = 0; - break; - case 'A': - malloc_abort = 1; - break; -#ifdef MALLOC_STATS - case 'd': - malloc_stats = 0; - break; - case 'D': - malloc_stats = 1; - break; -#endif /* MALLOC_STATS */ - case 'f': - malloc_freeprot = 0; - break; - case 'F': - malloc_freeprot = 1; - break; - case 'g': - malloc_guard = 0; - break; - case 'G': - malloc_guard = malloc_pagesize; - break; - case 'h': - malloc_hint = 0; - break; - case 'H': - malloc_hint = 1; - break; - case 'j': - malloc_junk = 0; - break; - case 'J': - malloc_junk = 1; - break; - case 'n': - malloc_silent = 0; - break; - case 'N': - malloc_silent = 1; - break; - case 'p': - malloc_ptrguard = 0; - break; - case 'P': - malloc_ptrguard = 1; - break; - case 'r': - malloc_realloc = 0; - break; - case 'R': - malloc_realloc = 1; - break; -#ifdef __FreeBSD__ - case 'u': - malloc_utrace = 0; - break; - case 'U': - malloc_utrace = 1; - break; -#endif /* __FreeBSD__ */ - case 'x': - malloc_xmalloc = 0; - break; - case 'X': - malloc_xmalloc = 1; - break; - case 'z': - malloc_zero = 0; - break; - case 'Z': - malloc_zero = 1; - break; - default: - j = malloc_abort; - malloc_abort = 0; - wrtwarning("unknown char in MALLOC_OPTIONS"); - malloc_abort = j; - break; - } - } - } - - UTRACE(0, 0, 0); - - /* - * We want junk in the entire allocation, and zero only in the part - * the user asked for. - */ - if (malloc_zero) - malloc_junk = 1; - -#ifdef MALLOC_STATS - if (malloc_stats && (atexit(malloc_exit) == -1)) - wrtwarning("atexit(2) failed." - " Will not be able to dump malloc stats on exit"); -#endif /* MALLOC_STATS */ - - if (malloc_pagesize != getpagesize()) { - wrterror("malloc() replacement compiled with a different " - "page size from what we're running with. Failing."); - errno = ENOMEM; - return; - } - - /* Allocate one page for the page directory. */ - page_dir = (struct pginfo **)MMAP(malloc_pagesize); - - if (page_dir == MAP_FAILED) { - wrterror("mmap(2) failed, check limits"); - errno = ENOMEM; - return; - } - pdi_off = (malloc_pagesize - sizeof(struct pdinfo)) & ~(malloc_minsize - 1); - pdi_mod = pdi_off / sizeof(struct pginfo *); - - last_dir = (struct pdinfo *) ((caddr_t) page_dir + pdi_off); - last_dir->base = page_dir; - last_dir->prev = last_dir->next = NULL; - last_dir->dirnum = malloc_pageshift; - - /* Been here, done that. */ - malloc_started++; - - /* Recalculate the cache size in bytes, and make sure it's nonzero. */ - if (!malloc_cache) - malloc_cache++; - malloc_cache <<= malloc_pageshift; - errno = save_errno; -} - -/* - * Allocate a number of complete pages - */ -static void * -malloc_pages(size_t size) -{ - void *p, *delay_free = NULL, *tp; - size_t i; - struct pginfo **pd; - struct pdinfo *pi; - u_long pidx, index; - struct pgfree *pf; - - size = pageround(size) + malloc_guard; - - p = NULL; - /* Look for free pages before asking for more */ - if (!align) - for (pf = free_list.next; pf; pf = pf->next) { - -#ifdef MALLOC_EXTRA_SANITY - if (pf->size & malloc_pagemask) { - wrterror("(ES): junk length entry on free_list"); - errno = EFAULT; - return (NULL); - } - if (!pf->size) { - wrterror("(ES): zero length entry on free_list"); - errno = EFAULT; - return (NULL); - } - if (pf->page > (pf->page + pf->size)) { - wrterror("(ES): sick entry on free_list"); - errno = EFAULT; - return (NULL); - } - if ((pi = pf->pdir) == NULL) { - wrterror("(ES): invalid page directory on free-list"); - errno = EFAULT; - return (NULL); - } - if ((pidx = PI_IDX(ptr2index(pf->page))) != PD_IDX(pi->dirnum)) { - wrterror("(ES): directory index mismatch on free-list"); - errno = EFAULT; - return (NULL); - } - pd = pi->base; - if (pd[PI_OFF(ptr2index(pf->page))] != MALLOC_FREE) { - wrterror("(ES): non-free first page on free-list"); - errno = EFAULT; - return (NULL); - } - pidx = PI_IDX(ptr2index((pf->page) + (pf->size)) - 1); - for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; - pi = pi->next) - ; - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): last page not referenced in page directory"); - errno = EFAULT; - return (NULL); - } - pd = pi->base; - if (pd[PI_OFF(ptr2index((pf->page) + (pf->size)) - 1)] != MALLOC_FREE) { - wrterror("(ES): non-free last page on free-list"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - - if (pf->size < size) - continue; - - if (pf->size == size) { - p = pf->page; - pi = pf->pdir; - if (pf->next != NULL) - pf->next->prev = pf->prev; - pf->prev->next = pf->next; - delay_free = pf; - break; - } - p = pf->page; - pf->page = (char *) pf->page + size; - pf->size -= size; - pidx = PI_IDX(ptr2index(pf->page)); - for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; - pi = pi->next) - ; - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): hole in directories"); - errno = EFAULT; - return (NULL); - } - tp = pf->pdir; - pf->pdir = pi; - pi = tp; - break; - } - - size -= malloc_guard; - -#ifdef MALLOC_EXTRA_SANITY - if (p != NULL && pi != NULL) { - pidx = PD_IDX(pi->dirnum); - pd = pi->base; - } - if (p != NULL && pd[PI_OFF(ptr2index(p))] != MALLOC_FREE) { - wrterror("(ES): allocated non-free page on free-list"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - - if (p != NULL && (malloc_guard || malloc_freeprot)) - mprotect(p, size, PROT_READ | PROT_WRITE); - - size >>= malloc_pageshift; - - /* Map new pages */ - if (p == NULL) - p = map_pages(size); - - if (p != NULL) { - index = ptr2index(p); - pidx = PI_IDX(index); - pdir_lookup(index, &pi); -#ifdef MALLOC_EXTRA_SANITY - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - if (pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - pd = pi->base; - pd[PI_OFF(index)] = MALLOC_FIRST; - - for (i = 1; i < size; i++) { - if (!PI_OFF(index + i)) { - pidx++; - pi = pi->next; -#ifdef MALLOC_EXTRA_SANITY - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): hole in mapped pages directory"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - pd = pi->base; - } - pd[PI_OFF(index + i)] = MALLOC_FOLLOW; - } - if (malloc_guard) { - if (!PI_OFF(index + i)) { - pidx++; - pi = pi->next; -#ifdef MALLOC_EXTRA_SANITY - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): hole in mapped pages directory"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - pd = pi->base; - } - pd[PI_OFF(index + i)] = MALLOC_FIRST; - } - - malloc_used += size << malloc_pageshift; - malloc_guarded += malloc_guard; - - if (malloc_junk) - memset(p, SOME_JUNK, size << malloc_pageshift); - } - if (delay_free) { - if (px == NULL) - px = delay_free; - else - ifree(delay_free); - } - return (p); -} - -/* - * Allocate a page of fragments - */ - -static __inline__ int -malloc_make_chunks(int bits) -{ - struct pginfo *bp, **pd; - struct pdinfo *pi; -#ifdef MALLOC_EXTRA_SANITY - u_long pidx; -#endif /* MALLOC_EXTRA_SANITY */ - void *pp; - long i, k; - size_t l; - - /* Allocate a new bucket */ - pp = malloc_pages((size_t) malloc_pagesize); - if (pp == NULL) - return (0); - - /* Find length of admin structure */ - l = sizeof *bp - sizeof(u_long); - l += sizeof(u_long) * - (((malloc_pagesize >> bits) + MALLOC_BITS - 1) / MALLOC_BITS); - - /* Don't waste more than two chunks on this */ - - /* - * If we are to allocate a memory protected page for the malloc(0) - * case (when bits=0), it must be from a different page than the - * pginfo page. - * --> Treat it like the big chunk alloc, get a second data page. - */ - if (bits != 0 && (1UL << (bits)) <= l + l) { - bp = (struct pginfo *) pp; - } else { - bp = (struct pginfo *) imalloc(l); - if (bp == NULL) { - ifree(pp); - return (0); - } - } - - /* memory protect the page allocated in the malloc(0) case */ - if (bits == 0) { - bp->size = 0; - bp->shift = 1; - i = malloc_minsize - 1; - while (i >>= 1) - bp->shift++; - bp->total = bp->free = malloc_pagesize >> bp->shift; - bp->page = pp; - - k = mprotect(pp, malloc_pagesize, PROT_NONE); - if (k < 0) { - ifree(pp); - ifree(bp); - return (0); - } - } else { - bp->size = (1UL << bits); - bp->shift = bits; - bp->total = bp->free = malloc_pagesize >> bits; - bp->page = pp; - } - - /* set all valid bits in the bitmap */ - k = bp->total; - i = 0; - - /* Do a bunch at a time */ - for (; (k - i) >= MALLOC_BITS; i += MALLOC_BITS) - bp->bits[i / MALLOC_BITS] = ~0UL; - - for (; i < k; i++) - bp->bits[i / MALLOC_BITS] |= 1UL << (i % MALLOC_BITS); - - k = (long)l; - if (bp == bp->page) { - /* Mark the ones we stole for ourselves */ - for (i = 0; k > 0; i++) { - bp->bits[i / MALLOC_BITS] &= ~(1UL << (i % MALLOC_BITS)); - bp->free--; - bp->total--; - k -= (1 << bits); - } - } - /* MALLOC_LOCK */ - - pdir_lookup(ptr2index(pp), &pi); -#ifdef MALLOC_EXTRA_SANITY - pidx = PI_IDX(ptr2index(pp)); - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return (0); - } -#endif /* MALLOC_EXTRA_SANITY */ - if (pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - pd = pi->base; - pd[PI_OFF(ptr2index(pp))] = bp; - - bp->next = page_dir[bits]; - page_dir[bits] = bp; - - /* MALLOC_UNLOCK */ - return (1); -} - -/* - * Allocate a fragment - */ -static void * -malloc_bytes(size_t size) -{ - int i, j; - size_t k; - u_long u, *lp; - struct pginfo *bp; - - /* Don't bother with anything less than this */ - /* unless we have a malloc(0) requests */ - if (size != 0 && size < malloc_minsize) - size = malloc_minsize; - - /* Find the right bucket */ - if (size == 0) - j = 0; - else { - size_t ii; - j = 1; - ii = size - 1; - while (ii >>= 1) - j++; - } - - /* If it's empty, make a page more of that size chunks */ - if (page_dir[j] == NULL && !malloc_make_chunks(j)) - return (NULL); - - bp = page_dir[j]; - - /* Find first word of bitmap which isn't empty */ - for (lp = bp->bits; !*lp; lp++); - - /* Find that bit, and tweak it */ - u = 1; - k = 0; - while (!(*lp & u)) { - u += u; - k++; - } - - if (malloc_guard) { - /* Walk to a random position. */ -// i = arc4random() % bp->free; - i = rand() % bp->free; - while (i > 0) { - u += u; - k++; - if (k >= MALLOC_BITS) { - lp++; - u = 1; - k = 0; - } -#ifdef MALLOC_EXTRA_SANITY - if (lp - bp->bits > (bp->total - 1) / MALLOC_BITS) { - wrterror("chunk overflow"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - if (*lp & u) - i--; - } - } - *lp ^= u; - - /* If there are no more free, remove from free-list */ - if (!--bp->free) { - page_dir[j] = bp->next; - bp->next = NULL; - } - /* Adjust to the real offset of that chunk */ - k += (lp - bp->bits) * MALLOC_BITS; - k <<= bp->shift; - - if (malloc_junk && bp->size != 0) - memset((char *)bp->page + k, SOME_JUNK, (size_t)bp->size); - - return ((u_char *) bp->page + k); -} - -/* - * Magic so that malloc(sizeof(ptr)) is near the end of the page. - */ -#define PTR_GAP (malloc_pagesize - sizeof(void *)) -#define PTR_SIZE (sizeof(void *)) -#define PTR_ALIGNED(p) (((unsigned long)p & malloc_pagemask) == PTR_GAP) - -/* - * Allocate a piece of memory - */ -static void * -imalloc(size_t size) -{ - void *result; - int ptralloc = 0; - - if (!malloc_started) - malloc_init(); - - if (suicide) - abort(); - - /* does not matter if malloc_bytes fails */ - if (px == NULL) - px = malloc_bytes(sizeof *px); - - if (malloc_ptrguard && size == PTR_SIZE) { - ptralloc = 1; - size = malloc_pagesize; - } - if (size > SIZE_MAX - malloc_pagesize) { /* Check for overflow */ - result = NULL; - errno = ENOMEM; - } else if (size <= malloc_maxsize) - result = malloc_bytes(size); - else - result = malloc_pages(size); - - if (malloc_abort == 1 && result == NULL) - wrterror("allocation failed"); - - if (malloc_zero && result != NULL) - memset(result, 0, size); - - if (result && ptralloc) - return ((char *) result + PTR_GAP); - return (result); -} - -/* - * Change the size of an allocation. - */ -static void * -irealloc(void *ptr, size_t size) -{ - void *p; - size_t osize; - u_long index, i; - struct pginfo **mp; - struct pginfo **pd; - struct pdinfo *pi; -#ifdef MALLOC_EXTRA_SANITY - u_long pidx; -#endif /* MALLOC_EXTRA_SANITY */ - - if (suicide) - abort(); - - if (!malloc_started) { - wrtwarning("malloc() has never been called"); - return (NULL); - } - if (malloc_ptrguard && PTR_ALIGNED(ptr)) { - if (size <= PTR_SIZE) - return (ptr); - - p = imalloc(size); - if (p) - memcpy(p, ptr, PTR_SIZE); - ifree(ptr); - return (p); - } - index = ptr2index(ptr); - - if (index < malloc_pageshift) { - wrtwarning("junk pointer, too low to make sense"); - return (NULL); - } - if (index > last_index) { - wrtwarning("junk pointer, too high to make sense"); - return (NULL); - } - pdir_lookup(index, &pi); -#ifdef MALLOC_EXTRA_SANITY - pidx = PI_IDX(index); - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return (NULL); - } -#endif /* MALLOC_EXTRA_SANITY */ - if (pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - pd = pi->base; - mp = &pd[PI_OFF(index)]; - - if (*mp == MALLOC_FIRST) { /* Page allocation */ - - /* Check the pointer */ - if ((u_long) ptr & malloc_pagemask) { - wrtwarning("modified (page-) pointer"); - return (NULL); - } - /* Find the size in bytes */ - i = index; - if (!PI_OFF(++i)) { - pi = pi->next; - if (pi != NULL && PD_IDX(pi->dirnum) != PI_IDX(i)) - pi = NULL; - if (pi != NULL) - pd = pi->base; - } - for (osize = malloc_pagesize; - pi != NULL && pd[PI_OFF(i)] == MALLOC_FOLLOW;) { - osize += malloc_pagesize; - if (!PI_OFF(++i)) { - pi = pi->next; - if (pi != NULL && PD_IDX(pi->dirnum) != PI_IDX(i)) - pi = NULL; - if (pi != NULL) - pd = pi->base; - } - } - - if (!malloc_realloc && size <= osize && - size > osize - malloc_pagesize) { - if (malloc_junk) - memset((char *)ptr + size, SOME_JUNK, osize - size); - return (ptr); /* ..don't do anything else. */ - } - } else if (*mp >= MALLOC_MAGIC) { /* Chunk allocation */ - - /* Check the pointer for sane values */ - if ((u_long) ptr & ((1UL << ((*mp)->shift)) - 1)) { - wrtwarning("modified (chunk-) pointer"); - return (NULL); - } - /* Find the chunk index in the page */ - i = ((u_long) ptr & malloc_pagemask) >> (*mp)->shift; - - /* Verify that it isn't a free chunk already */ - if ((*mp)->bits[i / MALLOC_BITS] & (1UL << (i % MALLOC_BITS))) { - wrtwarning("chunk is already free"); - return (NULL); - } - osize = (*mp)->size; - - if (!malloc_realloc && size <= osize && - (size > osize / 2 || osize == malloc_minsize)) { - if (malloc_junk) - memset((char *) ptr + size, SOME_JUNK, osize - size); - return (ptr); /* ..don't do anything else. */ - } - } else { - wrtwarning("irealloc: pointer to wrong page"); - return (NULL); - } - - p = imalloc(size); - - if (p != NULL) { - /* copy the lesser of the two sizes, and free the old one */ - /* Don't move from/to 0 sized region !!! */ - if (osize != 0 && size != 0) { - if (osize < size) - memcpy(p, ptr, osize); - else - memcpy(p, ptr, size); - } - ifree(ptr); - } - return (p); -} - -/* - * Free a sequence of pages - */ -static __inline__ void -free_pages(void *ptr, u_long index, struct pginfo * info) -{ - u_long i, pidx, lidx; - size_t l, cachesize = 0; - struct pginfo **pd; - struct pdinfo *pi, *spi; - struct pgfree *pf, *pt = NULL; - caddr_t tail; - - if (info == MALLOC_FREE) { - wrtwarning("page is already free"); - return; - } - if (info != MALLOC_FIRST) { - wrtwarning("free_pages: pointer to wrong page"); - return; - } - if ((u_long) ptr & malloc_pagemask) { - wrtwarning("modified (page-) pointer"); - return; - } - /* Count how many pages and mark them free at the same time */ - pidx = PI_IDX(index); - pdir_lookup(index, &pi); -#ifdef MALLOC_EXTRA_SANITY - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - - spi = pi; /* Save page index for start of region. */ - - pd = pi->base; - pd[PI_OFF(index)] = MALLOC_FREE; - i = 1; - if (!PI_OFF(index + i)) { - pi = pi->next; - if (pi == NULL || PD_IDX(pi->dirnum) != PI_IDX(index + i)) - pi = NULL; - else - pd = pi->base; - } - while (pi != NULL && pd[PI_OFF(index + i)] == MALLOC_FOLLOW) { - pd[PI_OFF(index + i)] = MALLOC_FREE; - i++; - if (!PI_OFF(index + i)) { - if ((pi = pi->next) == NULL || - PD_IDX(pi->dirnum) != PI_IDX(index + i)) - pi = NULL; - else - pd = pi->base; - } - } - - l = i << malloc_pageshift; - - if (malloc_junk) - memset(ptr, SOME_JUNK, l); - - malloc_used -= l; - malloc_guarded -= malloc_guard; - if (malloc_guard) { -#ifdef MALLOC_EXTRA_SANITY - if (pi == NULL || PD_IDX(pi->dirnum) != PI_IDX(index + i)) { - wrterror("(ES): hole in mapped pages directory"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - pd[PI_OFF(index + i)] = MALLOC_FREE; - l += malloc_guard; - } - tail = (caddr_t)ptr + l; - - if (malloc_hint) - madvise(ptr, l, MADV_FREE); - - if (malloc_freeprot) - mprotect(ptr, l, PROT_NONE); - - /* Add to free-list. */ - if (px == NULL && (px = malloc_bytes(sizeof *px)) == NULL) - goto not_return; - px->page = ptr; - px->pdir = spi; - px->size = l; - - if (free_list.next == NULL) { - /* Nothing on free list, put this at head. */ - px->next = NULL; - px->prev = &free_list; - free_list.next = px; - pf = px; - px = NULL; - } else { - /* - * Find the right spot, leave pf pointing to the modified - * entry. - */ - - /* Race ahead here, while calculating cache size. */ - for (pf = free_list.next; - (caddr_t)ptr > ((caddr_t)pf->page + pf->size) - && pf->next != NULL; - pf = pf->next) - cachesize += pf->size; - - /* Finish cache size calculation. */ - pt = pf; - while (pt) { - cachesize += pt->size; - pt = pt->next; - } - - if ((caddr_t)pf->page > tail) { - /* Insert before entry */ - px->next = pf; - px->prev = pf->prev; - pf->prev = px; - px->prev->next = px; - pf = px; - px = NULL; - } else if (((caddr_t)pf->page + pf->size) == ptr) { - /* Append to the previous entry. */ - cachesize -= pf->size; - pf->size += l; - if (pf->next != NULL && - pf->next->page == ((caddr_t)pf->page + pf->size)) { - /* And collapse the next too. */ - pt = pf->next; - pf->size += pt->size; - pf->next = pt->next; - if (pf->next != NULL) - pf->next->prev = pf; - } - } else if (pf->page == tail) { - /* Prepend to entry. */ - cachesize -= pf->size; - pf->size += l; - pf->page = ptr; - pf->pdir = spi; - } else if (pf->next == NULL) { - /* Append at tail of chain. */ - px->next = NULL; - px->prev = pf; - pf->next = px; - pf = px; - px = NULL; - } else { - wrterror("freelist is destroyed"); - errno = EFAULT; - return; - } - } - - if (pf->pdir != last_dir) { - prev_dir = last_dir; - last_dir = pf->pdir; - } - - /* Return something to OS ? */ - if (pf->size > (malloc_cache - cachesize)) { - - /* - * Keep the cache intact. Notice that the '>' above guarantees that - * the pf will always have at least one page afterwards. - */ - if (munmap((char *) pf->page + (malloc_cache - cachesize), - pf->size - (malloc_cache - cachesize)) != 0) - goto not_return; - tail = (caddr_t)pf->page + pf->size; - lidx = ptr2index(tail) - 1; - pf->size = malloc_cache - cachesize; - - index = ptr2index((caddr_t)pf->page + pf->size); - - pidx = PI_IDX(index); - if (prev_dir != NULL && PD_IDX(prev_dir->dirnum) >= pidx) - prev_dir = NULL; /* Will be wiped out below ! */ - - for (pi = pf->pdir; pi != NULL && PD_IDX(pi->dirnum) < pidx; - pi = pi->next) - ; - - spi = pi; - if (pi != NULL && PD_IDX(pi->dirnum) == pidx) { - pd = pi->base; - - for (i = index; i <= lidx;) { - if (pd[PI_OFF(i)] != MALLOC_NOT_MINE) { - pd[PI_OFF(i)] = MALLOC_NOT_MINE; -#ifdef MALLOC_EXTRA_SANITY - if (!PD_OFF(pi->dirnum)) { - wrterror("(ES): pages directory underflow"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - pi->dirnum--; - } -#ifdef MALLOC_EXTRA_SANITY - else - wrtwarning("(ES): page already unmapped"); -#endif /* MALLOC_EXTRA_SANITY */ - i++; - if (!PI_OFF(i)) { - /* - * If no page in that dir, free - * directory page. - */ - if (!PD_OFF(pi->dirnum)) { - /* Remove from list. */ - if (spi == pi) - spi = pi->prev; - if (pi->prev != NULL) - pi->prev->next = pi->next; - if (pi->next != NULL) - pi->next->prev = pi->prev; - pi = pi->next; - munmap(pd, malloc_pagesize); - } else - pi = pi->next; - if (pi == NULL || - PD_IDX(pi->dirnum) != PI_IDX(i)) - break; - pd = pi->base; - } - } - if (pi && !PD_OFF(pi->dirnum)) { - /* Resulting page dir is now empty. */ - /* Remove from list. */ - if (spi == pi) /* Update spi only if first. */ - spi = pi->prev; - if (pi->prev != NULL) - pi->prev->next = pi->next; - if (pi->next != NULL) - pi->next->prev = pi->prev; - pi = pi->next; - munmap(pd, malloc_pagesize); - } - } - if (pi == NULL && malloc_brk == tail) { - /* Resize down the malloc upper boundary. */ - last_index = index - 1; - malloc_brk = index2ptr(index); - } - - /* XXX: We could realloc/shrink the pagedir here I guess. */ - if (pf->size == 0) { /* Remove from free-list as well. */ - if (px) - ifree(px); - if ((px = pf->prev) != &free_list) { - if (pi == NULL && last_index == (index - 1)) { - if (spi == NULL) { - malloc_brk = NULL; - i = 11; - } else { - pd = spi->base; - if (PD_IDX(spi->dirnum) < pidx) - index = - ((PD_IDX(spi->dirnum) + 1) * - pdi_mod) - 1; - for (pi = spi, i = index; - pd[PI_OFF(i)] == MALLOC_NOT_MINE; - i--) -#ifdef MALLOC_EXTRA_SANITY - if (!PI_OFF(i)) { - pi = pi->prev; - if (pi == NULL || i == 0) - break; - pd = pi->base; - i = (PD_IDX(pi->dirnum) + 1) * pdi_mod; - } -#else /* !MALLOC_EXTRA_SANITY */ - { - } -#endif /* MALLOC_EXTRA_SANITY */ - malloc_brk = index2ptr(i + 1); - } - last_index = i; - } - if ((px->next = pf->next) != NULL) - px->next->prev = px; - } else { - if ((free_list.next = pf->next) != NULL) - free_list.next->prev = &free_list; - } - px = pf; - last_dir = prev_dir; - prev_dir = NULL; - } - } -not_return: - if (pt != NULL) - ifree(pt); -} - -/* - * Free a chunk, and possibly the page it's on, if the page becomes empty. - */ - -/* ARGSUSED */ -static __inline__ void -free_bytes(void *ptr, u_long index, struct pginfo * info) -{ - struct pginfo **mp, **pd; - struct pdinfo *pi; -#ifdef MALLOC_EXTRA_SANITY - u_long pidx; -#endif /* MALLOC_EXTRA_SANITY */ - void *vp; - long i; - (void) index; - - /* Find the chunk number on the page */ - i = ((u_long) ptr & malloc_pagemask) >> info->shift; - - if ((u_long) ptr & ((1UL << (info->shift)) - 1)) { - wrtwarning("modified (chunk-) pointer"); - return; - } - if (info->bits[i / MALLOC_BITS] & (1UL << (i % MALLOC_BITS))) { - wrtwarning("chunk is already free"); - return; - } - if (malloc_junk && info->size != 0) - memset(ptr, SOME_JUNK, (size_t)info->size); - - info->bits[i / MALLOC_BITS] |= 1UL << (i % MALLOC_BITS); - info->free++; - - if (info->size != 0) - mp = page_dir + info->shift; - else - mp = page_dir; - - if (info->free == 1) { - /* Page became non-full */ - - /* Insert in address order */ - while (*mp != NULL && (*mp)->next != NULL && - (*mp)->next->page < info->page) - mp = &(*mp)->next; - info->next = *mp; - *mp = info; - return; - } - if (info->free != info->total) - return; - - /* Find & remove this page in the queue */ - while (*mp != info) { - mp = &((*mp)->next); -#ifdef MALLOC_EXTRA_SANITY - if (!*mp) { - wrterror("(ES): Not on queue"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - } - *mp = info->next; - - /* Free the page & the info structure if need be */ - pdir_lookup(ptr2index(info->page), &pi); -#ifdef MALLOC_EXTRA_SANITY - pidx = PI_IDX(ptr2index(info->page)); - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - if (pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - pd = pi->base; - pd[PI_OFF(ptr2index(info->page))] = MALLOC_FIRST; - - /* If the page was mprotected, unprotect it before releasing it */ - if (info->size == 0) - mprotect(info->page, malloc_pagesize, PROT_READ | PROT_WRITE); - - vp = info->page; /* Order is important ! */ - if (vp != (void *) info) - ifree(info); - ifree(vp); -} - -static void -ifree(void *ptr) -{ - struct pginfo *info, **pd; - u_long index; -#ifdef MALLOC_EXTRA_SANITY - u_long pidx; -#endif /* MALLOC_EXTRA_SANITY */ - struct pdinfo *pi; - - if (!malloc_started) { - wrtwarning("malloc() has never been called"); - return; - } - /* If we're already sinking, don't make matters any worse. */ - if (suicide) - return; - - if (malloc_ptrguard && PTR_ALIGNED(ptr)) - ptr = (char *) ptr - PTR_GAP; - - index = ptr2index(ptr); - - if (index < malloc_pageshift) { - warnx("(%p)", ptr); - wrtwarning("ifree: junk pointer, too low to make sense"); - return; - } - if (index > last_index) { - warnx("(%p)", ptr); - wrtwarning("ifree: junk pointer, too high to make sense"); - return; - } - pdir_lookup(index, &pi); -#ifdef MALLOC_EXTRA_SANITY - pidx = PI_IDX(index); - if (pi == NULL || PD_IDX(pi->dirnum) != pidx) { - wrterror("(ES): mapped pages not found in directory"); - errno = EFAULT; - return; - } -#endif /* MALLOC_EXTRA_SANITY */ - if (pi != last_dir) { - prev_dir = last_dir; - last_dir = pi; - } - pd = pi->base; - info = pd[PI_OFF(index)]; - - if (info < MALLOC_MAGIC) - free_pages(ptr, index, info); - else - free_bytes(ptr, index, info); - - /* does not matter if malloc_bytes fails */ - if (px == NULL) - px = malloc_bytes(sizeof *px); - - return; -} - -/* - * Common function for handling recursion. Only - * print the error message once, to avoid making the problem - * potentially worse. - */ -static void -malloc_recurse(void) -{ - static int noprint; - - if (noprint == 0) { - noprint = 1; - wrtwarning("recursive call"); - } - malloc_active--; - _MALLOC_UNLOCK(); - errno = EDEADLK; -} - -/* - * These are the public exported interface routines. - */ -void * -malloc(size_t size) -{ - void *r; - - if (!align) - _MALLOC_LOCK(); - malloc_func = " in malloc():"; - if (malloc_active++) { - malloc_recurse(); - return (NULL); - } - r = imalloc(size); - UTRACE(0, size, r); - malloc_active--; - if (!align) - _MALLOC_UNLOCK(); - if (malloc_xmalloc && r == NULL) { - wrterror("out of memory"); - errno = ENOMEM; - } - return (r); -} - -void -free(void *ptr) -{ - /* This is legal. XXX quick path */ - if (ptr == NULL) - return; - - _MALLOC_LOCK(); - malloc_func = " in free():"; - if (malloc_active++) { - malloc_recurse(); - return; - } - ifree(ptr); - UTRACE(ptr, 0, 0); - malloc_active--; - _MALLOC_UNLOCK(); - return; -} - -void * -realloc(void *ptr, size_t size) -{ - void *r; - - _MALLOC_LOCK(); - malloc_func = " in realloc():"; - if (malloc_active++) { - malloc_recurse(); - return (NULL); - } - - if (ptr == NULL) - r = imalloc(size); - else - r = irealloc(ptr, size); - - UTRACE(ptr, size, r); - malloc_active--; - _MALLOC_UNLOCK(); - if (malloc_xmalloc && r == NULL) { - wrterror("out of memory"); - errno = ENOMEM; - } - return (r); -} - -void * -calloc(size_t num, size_t size) -{ - void *p; - - if (num && SIZE_MAX / num < size) { - fprintf(stderr,"OOOOPS"); - errno = ENOMEM; - return NULL; - } - size *= num; - p = malloc(size); - if (p) - memset(p, 0, size); - return(p); -} - -#ifndef BUILDING_FOR_TOR -static int ispowerof2 (size_t a) { - size_t b; - for (b = 1ULL << (sizeof(size_t)*NBBY - 1); b > 1; b >>= 1) - if (b == a) - return 1; - return 0; -} -#endif - -#ifndef BUILDING_FOR_TOR -int posix_memalign(void **memptr, size_t alignment, size_t size) -{ - void *r; - size_t max; - if ((alignment < PTR_SIZE) || (alignment%PTR_SIZE != 0)) return EINVAL; - if (!ispowerof2(alignment)) return EINVAL; - if (alignment < malloc_minsize) alignment = malloc_minsize; - max = alignment > size ? alignment : size; - if (alignment <= malloc_pagesize) - r = malloc(max); - else { - _MALLOC_LOCK(); - align = 1; - g_alignment = alignment; - r = malloc(size); - align=0; - _MALLOC_UNLOCK(); - } - *memptr = r; - if (!r) return ENOMEM; - return 0; -} - -void *memalign(size_t boundary, size_t size) -{ - void *r; - posix_memalign(&r, boundary, size); - return r; -} - -void *valloc(size_t size) -{ - void *r; - posix_memalign(&r, malloc_pagesize, size); - return r; -} -#endif - -size_t malloc_good_size(size_t size) -{ - if (size == 0) { - return 1; - } else if (size <= malloc_maxsize) { - int j; - size_t ii; - /* round up to the nearest power of 2, with same approach - * as malloc_bytes() uses. */ - j = 1; - ii = size - 1; - while (ii >>= 1) - j++; - return ((size_t)1) << j; - } else { - return pageround(size); - } -} diff --git a/src/tor/src/ext/README b/src/tor/src/ext/README deleted file mode 100644 index d7e5439c7..000000000 --- a/src/tor/src/ext/README +++ /dev/null @@ -1,79 +0,0 @@ - -OpenBSD_malloc_Linux.c: - - The OpenBSD malloc implementation, ported to Linux. Used only when - --enable-openbsd-malloc is passed to the configure script. - -strlcat.c -strlcpy.c - - Implementations of strlcat and strlcpy, the more sane replacements - for strcat and strcpy. These are nonstandard, and some libc - implementations refuse to add them for religious reasons. - -ht.h - - An implementation of a hash table in the style of Niels Provos's - tree.h. Shared with Libevent. - -tinytest.[ch] -tinytest_demos.c -tinytest_macros.h - - A unit testing framework. https://github.com/nmathewson/tinytest - -tor_queue.h - - A copy of sys/queue.h from OpenBSD. We keep our own copy rather - than using sys/queue.h, since some platforms don't have a - sys/queue.h, and the ones that do have diverged in incompatible - ways. (CIRCLEQ or no CIRCLEQ? SIMPLQ or STAILQ?) We also rename - the identifiers with a TOR_ prefix to avoid conflicts with - the system headers. - -curve25519_donna/*.c - - A copy of Adam Langley's curve25519-donna mostly-portable - implementations of curve25519. - -csiphash.c -siphash.h - - Marek Majkowski's implementation of siphash 2-4, a secure keyed - hash algorithm to avoid collision-based DoS attacks against hash - tables. - -trunnel/*.[ch] - - Headers and runtime code for Trunnel, a system for generating - code to encode and decode binary formats. - -ed25519/ref10/* - - Daniel Bernsten's portable ref10 implementation of ed25519. - Public domain. - -ed25519/donna/* - - Andrew Moon's semi-portable ed25519-donna implementation of - ed25519. Public domain. - -keccak-tiny/ - - David Leon Gil's portable Keccak implementation. CC0. - -readpassphrase.[ch] - - Portable readpassphrase implementation from OpenSSH portable, version - 6.8p1. - -timeouts/ - - William Ahern's hierarchical timer-wheel implementation. MIT license. - -mulodi/ - - Contains an overflow-checking 64-bit signed integer multiply - from LLVM's compiler_rt. For some reason, this is missing from - 32-bit libclang in many places. Dual licensed MIT-license and - BSD-like license; see mulodi/LICENSE.TXT. diff --git a/src/tor/src/ext/byteorder.h b/src/tor/src/ext/byteorder.h deleted file mode 100644 index c8ba52184..000000000 --- a/src/tor/src/ext/byteorder.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - Copyright (c) 2013-2014 Marek Majkowski - - 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. - - - Original location: - https://github.com/majek/csiphash/ - - Solution inspired by code from: - Samuel Neves (supercop/crypto_auth/siphash24/little) - djb (supercop/crypto_auth/siphash24/little2) - Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) -*/ - -/* This code is extracted from csiphash.h */ - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(_WIN32) -/* Windows is always little endian, unless you're on xbox360 - http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(__APPLE__) -# include -# define _le64toh(x) OSSwapLittleToHostInt64(x) -#elif defined(sun) || defined(__sun) -# include -# define _le64toh(x) LE_64(x) - -#else - -/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) -# include -# else -# include -# endif -# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ - __BYTE_ORDER == __LITTLE_ENDIAN -# define _le64toh(x) ((uint64_t)(x)) -# else -# if defined(OpenBSD) -# define _le64toh(x) letoh64(x) -# else -# define _le64toh(x) le64toh(x) -# endif -# endif - -#endif diff --git a/src/tor/src/ext/csiphash.c b/src/tor/src/ext/csiphash.c deleted file mode 100644 index 508e4f6ce..000000000 --- a/src/tor/src/ext/csiphash.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - Copyright (c) 2013-2014 Marek Majkowski - - 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. - - - Original location: - https://github.com/majek/csiphash/ - - Solution inspired by code from: - Samuel Neves (supercop/crypto_auth/siphash24/little) - djb (supercop/crypto_auth/siphash24/little2) - Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) -*/ - -#include "torint.h" -#include "siphash.h" -/* for tor_assert */ -#include "util.h" -/* for memcpy */ -#include -#include "byteorder.h" - -#define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) ) - -#define HALF_ROUND(a,b,c,d,s,t) \ - a += b; c += d; \ - b = ROTATE(b, s) ^ a; \ - d = ROTATE(d, t) ^ c; \ - a = ROTATE(a, 32); - -#define DOUBLE_ROUND(v0,v1,v2,v3) \ - HALF_ROUND(v0,v1,v2,v3,13,16); \ - HALF_ROUND(v2,v1,v0,v3,17,21); \ - HALF_ROUND(v0,v1,v2,v3,13,16); \ - HALF_ROUND(v2,v1,v0,v3,17,21); - -#if 0 -/* This does not seem to save very much runtime in the fast case, and it's - * potentially a big loss in the slow case where we're misaligned and we cross - * a cache line. */ -#if (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ - defined(__x86_64) || defined(__x86_64__) || \ - defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__)) -# define UNALIGNED_OK 1 -#endif -#endif - -uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key) { - const uint8_t *m = src; - uint64_t k0 = key->k0; - uint64_t k1 = key->k1; - uint64_t last7 = (uint64_t)(src_sz & 0xff) << 56; - size_t i, blocks; - - uint64_t v0 = k0 ^ 0x736f6d6570736575ULL; - uint64_t v1 = k1 ^ 0x646f72616e646f6dULL; - uint64_t v2 = k0 ^ 0x6c7967656e657261ULL; - uint64_t v3 = k1 ^ 0x7465646279746573ULL; - - for (i = 0, blocks = (src_sz & ~7); i < blocks; i+= 8) { -#ifdef UNALIGNED_OK - uint64_t mi = _le64toh(*(m + i)); -#else - uint64_t mi; - memcpy(&mi, m + i, 8); - mi = _le64toh(mi); -#endif - v3 ^= mi; - DOUBLE_ROUND(v0,v1,v2,v3); - v0 ^= mi; - } - - switch (src_sz - blocks) { - case 7: last7 |= (uint64_t)m[i + 6] << 48; /* Falls through. */ - case 6: last7 |= (uint64_t)m[i + 5] << 40; /* Falls through. */ - case 5: last7 |= (uint64_t)m[i + 4] << 32; /* Falls through. */ - case 4: last7 |= (uint64_t)m[i + 3] << 24; /* Falls through. */ - case 3: last7 |= (uint64_t)m[i + 2] << 16; /* Falls through. */ - case 2: last7 |= (uint64_t)m[i + 1] << 8; /* Falls through. */ - case 1: last7 |= (uint64_t)m[i + 0] ; /* Falls through. */ - case 0: - default:; - } - v3 ^= last7; - DOUBLE_ROUND(v0,v1,v2,v3); - v0 ^= last7; - v2 ^= 0xff; - DOUBLE_ROUND(v0,v1,v2,v3); - DOUBLE_ROUND(v0,v1,v2,v3); - return v0 ^ v1 ^ v2 ^ v3; -} - - -static int the_siphash_key_is_set = 0; -static struct sipkey the_siphash_key; - -uint64_t siphash24g(const void *src, unsigned long src_sz) { - tor_assert(the_siphash_key_is_set); - return siphash24(src, src_sz, &the_siphash_key); -} - -void siphash_set_global_key(const struct sipkey *key) -{ - tor_assert(! the_siphash_key_is_set); - the_siphash_key.k0 = key->k0; - the_siphash_key.k1 = key->k1; - the_siphash_key_is_set = 1; -} diff --git a/src/tor/src/ext/curve25519_donna/README b/src/tor/src/ext/curve25519_donna/README deleted file mode 100644 index 9f77bd7d9..000000000 --- a/src/tor/src/ext/curve25519_donna/README +++ /dev/null @@ -1,44 +0,0 @@ -See http://code.google.com/p/curve25519-donna/ for details. - -BUILDING: - -If you run `make`, two .a archives will be built, similar to djb's curve25519 -code. Alternatively, read on: - -The C implementation is contained within curve25519-donna.c. It has no external -dependancies and is BSD licenced. You can copy/include/link it directly in with -your program. Recommended C flags: -O2 - -The x86-64 bit implementation is contained within curve25519-donna-x86-64.c and -curve25519-donna-x86-64.s. Build like this: - -% cpp curve25519-donna-x86-64.s > curve25519-donna-x86-64.s.pp -% as -o curve25519-donna-x86-64.s.o curve25519-donna-x86-64.s.pp -% gcc -O2 -c curve25519-donna-x86-64.c - -Then the two .o files can be linked in - -USAGE: - -The usage is exactly the same as djb's code (as described at -http://cr.yp.to/ecdh.html) expect that the function is called curve25519_donna. - -In short, - -To generate a private key, generate 32 random bytes and: - - mysecret[0] &= 248; - mysecret[31] &= 127; - mysecret[31] |= 64; - -To generate the public key, just do - - static const uint8_t basepoint[32] = {9}; - curve25519_donna(mypublic, mysecret, basepoint); - -To generate an agreed key do: - uint8_t shared_key[32]; - curve25519_donna(shared_key, mysecret, theirpublic); - -And hash the shared_key with a cryptographic hash function before using. - diff --git a/src/tor/src/ext/curve25519_donna/curve25519-donna-c64.c b/src/tor/src/ext/curve25519_donna/curve25519-donna-c64.c deleted file mode 100644 index b68ff3695..000000000 --- a/src/tor/src/ext/curve25519_donna/curve25519-donna-c64.c +++ /dev/null @@ -1,451 +0,0 @@ -/* Copyright 2008, Google Inc. - * All rights reserved. - * - * Code released into the public domain. - * - * curve25519-donna: Curve25519 elliptic curve, public key function - * - * http://code.google.com/p/curve25519-donna/ - * - * Adam Langley - * - * Derived from public domain C code by Daniel J. Bernstein - * - * More information about curve25519 can be found here - * http://cr.yp.to/ecdh.html - * - * djb's sample implementation of curve25519 is written in a special assembly - * language called qhasm and uses the floating point registers. - * - * This is, almost, a clean room reimplementation from the curve25519 paper. It - * uses many of the tricks described therein. Only the crecip function is taken - * from the sample implementation. - */ - -#include "orconfig.h" - -#include -#include "torint.h" - -typedef uint8_t u8; -typedef uint64_t limb; -typedef limb felem[5]; -// This is a special gcc mode for 128-bit integers. It's implemented on 64-bit -// platforms only as far as I know. -typedef unsigned uint128_t __attribute__((mode(TI))); - -#undef force_inline -#define force_inline __attribute__((always_inline)) - -/* Sum two numbers: output += in */ -static inline void force_inline -fsum(limb *output, const limb *in) { - output[0] += in[0]; - output[1] += in[1]; - output[2] += in[2]; - output[3] += in[3]; - output[4] += in[4]; -} - -/* Find the difference of two numbers: output = in - output - * (note the order of the arguments!) - * - * Assumes that out[i] < 2**52 - * On return, out[i] < 2**55 - */ -static inline void force_inline -fdifference_backwards(felem out, const felem in) { - /* 152 is 19 << 3 */ - static const limb two54m152 = (((limb)1) << 54) - 152; - static const limb two54m8 = (((limb)1) << 54) - 8; - - out[0] = in[0] + two54m152 - out[0]; - out[1] = in[1] + two54m8 - out[1]; - out[2] = in[2] + two54m8 - out[2]; - out[3] = in[3] + two54m8 - out[3]; - out[4] = in[4] + two54m8 - out[4]; -} - -/* Multiply a number by a scalar: output = in * scalar */ -static inline void force_inline -fscalar_product(felem output, const felem in, const limb scalar) { - uint128_t a; - - a = ((uint128_t) in[0]) * scalar; - output[0] = ((limb)a) & 0x7ffffffffffff; - - a = ((uint128_t) in[1]) * scalar + ((limb) (a >> 51)); - output[1] = ((limb)a) & 0x7ffffffffffff; - - a = ((uint128_t) in[2]) * scalar + ((limb) (a >> 51)); - output[2] = ((limb)a) & 0x7ffffffffffff; - - a = ((uint128_t) in[3]) * scalar + ((limb) (a >> 51)); - output[3] = ((limb)a) & 0x7ffffffffffff; - - a = ((uint128_t) in[4]) * scalar + ((limb) (a >> 51)); - output[4] = ((limb)a) & 0x7ffffffffffff; - - output[0] += (a >> 51) * 19; -} - -/* Multiply two numbers: output = in2 * in - * - * output must be distinct to both inputs. The inputs are reduced coefficient - * form, the output is not. - * - * Assumes that in[i] < 2**55 and likewise for in2. - * On return, output[i] < 2**52 - */ -static inline void force_inline -fmul(felem output, const felem in2, const felem in) { - uint128_t t[5]; - limb r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - - s0 = in2[0]; - s1 = in2[1]; - s2 = in2[2]; - s3 = in2[3]; - s4 = in2[4]; - - t[0] = ((uint128_t) r0) * s0; - t[1] = ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0; - t[2] = ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1; - t[3] = ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1; - t[4] = ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2; - - r4 *= 19; - r1 *= 19; - r2 *= 19; - r3 *= 19; - - t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2; - t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3; - t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4; - t[3] += ((uint128_t) r4) * s4; - - r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51); - t[1] += c; r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51); - t[2] += c; r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51); - t[3] += c; r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51); - t[4] += c; r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51); - r0 += c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff; - r1 += c; c = r1 >> 51; r1 = r1 & 0x7ffffffffffff; - r2 += c; - - output[0] = r0; - output[1] = r1; - output[2] = r2; - output[3] = r3; - output[4] = r4; -} - -static inline void force_inline -fsquare_times(felem output, const felem in, limb count) { - uint128_t t[5]; - limb r0,r1,r2,r3,r4,c; - limb d0,d1,d2,d4,d419; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - - do { - d0 = r0 * 2; - d1 = r1 * 2; - d2 = r2 * 2 * 19; - d419 = r4 * 19; - d4 = d419 * 2; - - t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); - t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); - t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); - t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); - t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); - - r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51); - t[1] += c; r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51); - t[2] += c; r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51); - t[3] += c; r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51); - t[4] += c; r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51); - r0 += c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff; - r1 += c; c = r1 >> 51; r1 = r1 & 0x7ffffffffffff; - r2 += c; - } while(--count); - - output[0] = r0; - output[1] = r1; - output[2] = r2; - output[3] = r3; - output[4] = r4; -} - -/* Load a little-endian 64-bit number */ -static limb -load_limb(const u8 *in) { - return - ((limb)in[0]) | - (((limb)in[1]) << 8) | - (((limb)in[2]) << 16) | - (((limb)in[3]) << 24) | - (((limb)in[4]) << 32) | - (((limb)in[5]) << 40) | - (((limb)in[6]) << 48) | - (((limb)in[7]) << 56); -} - -static void -store_limb(u8 *out, limb in) { - out[0] = in & 0xff; - out[1] = (in >> 8) & 0xff; - out[2] = (in >> 16) & 0xff; - out[3] = (in >> 24) & 0xff; - out[4] = (in >> 32) & 0xff; - out[5] = (in >> 40) & 0xff; - out[6] = (in >> 48) & 0xff; - out[7] = (in >> 56) & 0xff; -} - -/* Take a little-endian, 32-byte number and expand it into polynomial form */ -static void -fexpand(limb *output, const u8 *in) { - output[0] = load_limb(in) & 0x7ffffffffffff; - output[1] = (load_limb(in+6) >> 3) & 0x7ffffffffffff; - output[2] = (load_limb(in+12) >> 6) & 0x7ffffffffffff; - output[3] = (load_limb(in+19) >> 1) & 0x7ffffffffffff; - output[4] = (load_limb(in+24) >> 12) & 0x7ffffffffffff; -} - -/* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array - */ -static void -fcontract(u8 *output, const felem input) { - uint128_t t[5]; - - t[0] = input[0]; - t[1] = input[1]; - t[2] = input[2]; - t[3] = input[3]; - t[4] = input[4]; - - t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; - t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; - t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; - t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; - t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; - - t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; - t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; - t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; - t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; - t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; - - /* now t is between 0 and 2^255-1, properly carried. */ - /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ - - t[0] += 19; - - t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; - t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; - t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; - t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; - t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff; - - /* now between 19 and 2^255-1 in both cases, and offset by 19. */ - - t[0] += 0x8000000000000 - 19; - t[1] += 0x8000000000000 - 1; - t[2] += 0x8000000000000 - 1; - t[3] += 0x8000000000000 - 1; - t[4] += 0x8000000000000 - 1; - - /* now between 2^255 and 2^256-20, and offset by 2^255. */ - - t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; - t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; - t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; - t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; - t[4] &= 0x7ffffffffffff; - - store_limb(output, t[0] | (t[1] << 51)); - store_limb(output+8, (t[1] >> 13) | (t[2] << 38)); - store_limb(output+16, (t[2] >> 26) | (t[3] << 25)); - store_limb(output+24, (t[3] >> 39) | (t[4] << 12)); -} - -/* Input: Q, Q', Q-Q' - * Output: 2Q, Q+Q' - * - * x2 z3: long form - * x3 z3: long form - * x z: short form, destroyed - * xprime zprime: short form, destroyed - * qmqp: short form, preserved - */ -static void -fmonty(limb *x2, limb *z2, /* output 2Q */ - limb *x3, limb *z3, /* output Q + Q' */ - limb *x, limb *z, /* input Q */ - limb *xprime, limb *zprime, /* input Q' */ - const limb *qmqp /* input Q - Q' */) { - limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5], - zzprime[5], zzzprime[5]; - - memcpy(origx, x, 5 * sizeof(limb)); - fsum(x, z); - fdifference_backwards(z, origx); // does x - z - - memcpy(origxprime, xprime, sizeof(limb) * 5); - fsum(xprime, zprime); - fdifference_backwards(zprime, origxprime); - fmul(xxprime, xprime, z); - fmul(zzprime, x, zprime); - memcpy(origxprime, xxprime, sizeof(limb) * 5); - fsum(xxprime, zzprime); - fdifference_backwards(zzprime, origxprime); - fsquare_times(x3, xxprime, 1); - fsquare_times(zzzprime, zzprime, 1); - fmul(z3, zzzprime, qmqp); - - fsquare_times(xx, x, 1); - fsquare_times(zz, z, 1); - fmul(x2, xx, zz); - fdifference_backwards(zz, xx); // does zz = xx - zz - fscalar_product(zzz, zz, 121665); - fsum(zzz, xx); - fmul(z2, zz, zzz); -} - -// ----------------------------------------------------------------------------- -// Maybe swap the contents of two limb arrays (@a and @b), each @len elements -// long. Perform the swap iff @swap is non-zero. -// -// This function performs the swap without leaking any side-channel -// information. -// ----------------------------------------------------------------------------- -static void -swap_conditional(limb a[5], limb b[5], limb iswap) { - unsigned i; - const limb swap = -iswap; - - for (i = 0; i < 5; ++i) { - const limb x = swap & (a[i] ^ b[i]); - a[i] ^= x; - b[i] ^= x; - } -} - -/* Calculates nQ where Q is the x-coordinate of a point on the curve - * - * resultx/resultz: the x coordinate of the resulting curve point (short form) - * n: a little endian, 32-byte number - * q: a point of the curve (short form) - */ -static void -cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { - limb a[5] = {0}, b[5] = {1}, c[5] = {1}, d[5] = {0}; - limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t; - limb e[5] = {0}, f[5] = {1}, g[5] = {0}, h[5] = {1}; - limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h; - - unsigned i, j; - - memcpy(nqpqx, q, sizeof(limb) * 5); - - for (i = 0; i < 32; ++i) { - u8 byte = n[31 - i]; - for (j = 0; j < 8; ++j) { - const limb bit = byte >> 7; - - swap_conditional(nqx, nqpqx, bit); - swap_conditional(nqz, nqpqz, bit); - fmonty(nqx2, nqz2, - nqpqx2, nqpqz2, - nqx, nqz, - nqpqx, nqpqz, - q); - swap_conditional(nqx2, nqpqx2, bit); - swap_conditional(nqz2, nqpqz2, bit); - - t = nqx; - nqx = nqx2; - nqx2 = t; - t = nqz; - nqz = nqz2; - nqz2 = t; - t = nqpqx; - nqpqx = nqpqx2; - nqpqx2 = t; - t = nqpqz; - nqpqz = nqpqz2; - nqpqz2 = t; - - byte <<= 1; - } - } - - memcpy(resultx, nqx, sizeof(limb) * 5); - memcpy(resultz, nqz, sizeof(limb) * 5); -} - - -// ----------------------------------------------------------------------------- -// Shamelessly copied from djb's code, tightened a little -// ----------------------------------------------------------------------------- -static void -crecip(felem out, const felem z) { - felem a,t0,b,c; - - /* 2 */ fsquare_times(a, z, 1); // a = 2 - /* 8 */ fsquare_times(t0, a, 2); - /* 9 */ fmul(b, t0, z); // b = 9 - /* 11 */ fmul(a, b, a); // a = 11 - /* 22 */ fsquare_times(t0, a, 1); - /* 2^5 - 2^0 = 31 */ fmul(b, t0, b); - /* 2^10 - 2^5 */ fsquare_times(t0, b, 5); - /* 2^10 - 2^0 */ fmul(b, t0, b); - /* 2^20 - 2^10 */ fsquare_times(t0, b, 10); - /* 2^20 - 2^0 */ fmul(c, t0, b); - /* 2^40 - 2^20 */ fsquare_times(t0, c, 20); - /* 2^40 - 2^0 */ fmul(t0, t0, c); - /* 2^50 - 2^10 */ fsquare_times(t0, t0, 10); - /* 2^50 - 2^0 */ fmul(b, t0, b); - /* 2^100 - 2^50 */ fsquare_times(t0, b, 50); - /* 2^100 - 2^0 */ fmul(c, t0, b); - /* 2^200 - 2^100 */ fsquare_times(t0, c, 100); - /* 2^200 - 2^0 */ fmul(t0, t0, c); - /* 2^250 - 2^50 */ fsquare_times(t0, t0, 50); - /* 2^250 - 2^0 */ fmul(t0, t0, b); - /* 2^255 - 2^5 */ fsquare_times(t0, t0, 5); - /* 2^255 - 21 */ fmul(out, t0, a); -} - -int curve25519_donna(u8 *, const u8 *, const u8 *); - -int -curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { - limb bp[5], x[5], z[5], zmone[5]; - uint8_t e[32]; - int i; - - for (i = 0;i < 32;++i) e[i] = secret[i]; - e[0] &= 248; - e[31] &= 127; - e[31] |= 64; - - fexpand(bp, basepoint); - cmult(x, z, e, bp); - crecip(zmone, z); - fmul(z, x, zmone); - fcontract(mypublic, z); - return 0; -} diff --git a/src/tor/src/ext/ed25519/donna/README.md b/src/tor/src/ext/ed25519/donna/README.md deleted file mode 100644 index e09fc27e3..000000000 --- a/src/tor/src/ext/ed25519/donna/README.md +++ /dev/null @@ -1,183 +0,0 @@ -[ed25519](http://ed25519.cr.yp.to/) is an -[Elliptic Curve Digital Signature Algortithm](http://en.wikipedia.org/wiki/Elliptic_Curve_DSA), -developed by [Dan Bernstein](http://cr.yp.to/djb.html), -[Niels Duif](http://www.nielsduif.nl/), -[Tanja Lange](http://hyperelliptic.org/tanja), -[Peter Schwabe](http://www.cryptojedi.org/users/peter/), -and [Bo-Yin Yang](http://www.iis.sinica.edu.tw/pages/byyang/). - -This project provides performant, portable 32-bit & 64-bit implementations. All implementations are -of course constant time in regard to secret data. - -#### Performance - -SSE2 code and benches have not been updated yet. I will do those next. - -Compilers versions are gcc 4.6.3, icc 13.1.1, clang 3.4-1~exp1. - -Batch verification time (in parentheses) is the average time per 1 verification in a batch of 64 signatures. Counts are in thousands of cycles. - -Note that SSE2 performance may be less impressive on AMD & older CPUs with slower SSE ops! - -Visual Studio performance for `ge25519_scalarmult_base_niels` will lag behind a bit until optimized assembler versions of `ge25519_scalarmult_base_choose_niels` -are made. - -##### E5200 @ 2.5ghz, march=core2 - - - - - - - - - - - -
      ImplementationSigngcciccclangVerifygcciccclang
      ed25519-donna 64bit 100k110k137k327k (144k) 342k (163k) 422k (194k)
      amd64-64-24k 102k 355k (158k)
      ed25519-donna-sse2 64bit108k111k116k353k (155k) 345k (154k) 360k (161k)
      amd64-51-32k 116k 380k (175k)
      ed25519-donna-sse2 32bit147k147k156k380k (178k) 381k (173k) 430k (192k)
      ed25519-donna 32bit 597k335k380k1693k (720k)1052k (453k)1141k (493k)
      - -##### E3-1270 @ 3.4ghz, march=corei7-avx - - - - - - - - - - - -
      ImplementationSigngcciccclangVerifygcciccclang
      amd64-64-24k 68k 225k (104k)
      ed25519-donna 64bit 71k 75k 90k226k (105k) 226k (112k) 277k (125k)
      amd64-51-32k 72k 218k (107k)
      ed25519-donna-sse2 64bit 79k 82k 92k252k (122k) 259k (124k) 282k (131k)
      ed25519-donna-sse2 32bit 94k 95k103k296k (146k) 294k (137k) 306k (147k)
      ed25519-donna 32bit 525k299k316k1502k (645k)959k (418k) 954k (416k)
      - -#### Compilation - -No configuration is needed **if you are compiling against OpenSSL**. - -##### Hash Options - -If you are not compiling aginst OpenSSL, you will need a hash function. - -To use a simple/**slow** implementation of SHA-512, use `-DED25519_REFHASH` when compiling `ed25519.c`. -This should never be used except to verify the code works when OpenSSL is not available. - -To use a custom hash function, use `-DED25519_CUSTOMHASH` when compiling `ed25519.c` and put your -custom hash implementation in ed25519-hash-custom.h. The hash must have a 512bit digest and implement - - struct ed25519_hash_context; - - void ed25519_hash_init(ed25519_hash_context *ctx); - void ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen); - void ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash); - void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); - -##### Random Options - -If you are not compiling aginst OpenSSL, you will need a random function for batch verification. - -To use a custom random function, use `-DED25519_CUSTOMRANDOM` when compiling `ed25519.c` and put your -custom hash implementation in ed25519-randombytes-custom.h. The random function must implement: - - void ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len); - -Use `-DED25519_TEST` when compiling `ed25519.c` to use a deterministically seeded, non-thread safe CSPRNG -variant of Bob Jenkins [ISAAC](http://en.wikipedia.org/wiki/ISAAC_%28cipher%29) - -##### Minor options - -Use `-DED25519_INLINE_ASM` to disable the use of custom assembler routines and instead rely on portable C. - -Use `-DED25519_FORCE_32BIT` to force the use of 32 bit routines even when compiling for 64 bit. - -##### 32-bit - - gcc ed25519.c -m32 -O3 -c - -##### 64-bit - - gcc ed25519.c -m64 -O3 -c - -##### SSE2 - - gcc ed25519.c -m32 -O3 -c -DED25519_SSE2 -msse2 - gcc ed25519.c -m64 -O3 -c -DED25519_SSE2 - -clang and icc are also supported - - -#### Usage - -To use the code, link against `ed25519.o -mbits` and: - - #include "ed25519.h" - -Add `-lssl -lcrypto` when using OpenSSL (Some systems don't need -lcrypto? It might be trial and error). - -To generate a private key, simply generate 32 bytes from a secure -cryptographic source: - - ed25519_secret_key sk; - randombytes(sk, sizeof(ed25519_secret_key)); - -To generate a public key: - - ed25519_public_key pk; - ed25519_publickey(sk, pk); - -To sign a message: - - ed25519_signature sig; - ed25519_sign(message, message_len, sk, pk, signature); - -To verify a signature: - - int valid = ed25519_sign_open(message, message_len, pk, signature) == 0; - -To batch verify signatures: - - const unsigned char *mp[num] = {message1, message2..} - size_t ml[num] = {message_len1, message_len2..} - const unsigned char *pkp[num] = {pk1, pk2..} - const unsigned char *sigp[num] = {signature1, signature2..} - int valid[num] - - /* valid[i] will be set to 1 if the individual signature was valid, 0 otherwise */ - int all_valid = ed25519_sign_open_batch(mp, ml, pkp, sigp, num, valid) == 0; - -**Note**: Batch verification uses `ed25519_randombytes_unsafe`, implemented in -`ed25519-randombytes.h`, to generate random scalars for the verification code. -The default implementation now uses OpenSSLs `RAND_bytes`. - -Unlike the [SUPERCOP](http://bench.cr.yp.to/supercop.html) version, signatures are -not appended to messages, and there is no need for padding in front of messages. -Additionally, the secret key does not contain a copy of the public key, so it is -32 bytes instead of 64 bytes, and the public key must be provided to the signing -function. - -##### Curve25519 - -Curve25519 public keys can be generated thanks to -[Adam Langley](http://www.imperialviolet.org/2013/05/10/fastercurve25519.html) -leveraging Ed25519's precomputed basepoint scalar multiplication. - - curved25519_key sk, pk; - randombytes(sk, sizeof(curved25519_key)); - curved25519_scalarmult_basepoint(pk, sk); - -Note the name is curved25519, a combination of curve and ed25519, to prevent -name clashes. Performance is slightly faster than short message ed25519 -signing due to both using the same code for the scalar multiply. - -#### Testing - -Fuzzing against reference implemenations is now available. See [fuzz/README](fuzz/README.md). - -Building `ed25519.c` with `-DED25519_TEST` and linking with `test.c` will run basic sanity tests -and benchmark each function. `test-batch.c` has been incorporated in to `test.c`. - -`test-internals.c` is standalone and built the same way as `ed25519.c`. It tests the math primitives -with extreme values to ensure they function correctly. SSE2 is now supported. - -#### Papers - -[Available on the Ed25519 website](http://ed25519.cr.yp.to/papers.html) \ No newline at end of file diff --git a/src/tor/src/ext/ed25519/donna/README.tor b/src/tor/src/ext/ed25519/donna/README.tor deleted file mode 100644 index 026d180c2..000000000 --- a/src/tor/src/ext/ed25519/donna/README.tor +++ /dev/null @@ -1,46 +0,0 @@ - -We've made the following changes to the stock ed25519-donna from -as of 8757bd4cd209cb032853ece0ce413f122eef212c. - - * Tor uses copies of `ed25519-donna.h` and `ed25519.c`, named - `ed25519_donna_tor.h` and `ed25591_tor.c`. - - The main functional differences between the standard ed25519-donna - and the Tor specific version are: - - * The external interface has been reworked to match that provided - by Tor's copy of the SUPERCOP `ref10` code. - - * The secret (aka private) key is now stored/used in expanded form. - - * The internal math tests from `test-internals.c` have been wrapped - in a function and the entire file is included to allow for - runtime validation. - - * There's an implementation of multiplicative key blinding so we - can use it for next-gen hidden service descriptors. - - * There's an implementation of 'convert a curve25519 key to an - ed25519 key' so we can do cross-certification with curve25519 - keys. - - * `ED25519_FN(ed25519_randombytes_unsafe)` is now static. - - * `ed25519-randombytes-custom.h` has the appropriate code to call - Tor's `crypto_rand()` routine, instead of directly using OpenSSL's - CSPRNG. - - * OSX pollutes the global namespace with an `ALIGN` macro, which is - undef-ed right before the donna `ALIGN` macro is defined. - - * If building with Clang's AddressSanitizer, disable inline assembly - since the compilation will fail in `ge25519_scalarmult_base_choose_niels` - on x86_64 targets due to running out of registers. - - * On non-x86 targets, GCC's Stack Protector dislikes variables that have - alignment constraints greater than that of other primitive types. - The `ALIGN` macro is thus no-oped for all non-SSE2 builds. - - * On 32 bit x86 targets that the compiler thinks supports SSE2, always - enable SSE2 support by force defining ED25519_SSE2 (x86_64 would also - always support this, but that code path is slower). diff --git a/src/tor/src/ext/ed25519/donna/curve25519-donna-32bit.h b/src/tor/src/ext/ed25519/donna/curve25519-donna-32bit.h deleted file mode 100644 index b0861acf0..000000000 --- a/src/tor/src/ext/ed25519/donna/curve25519-donna-32bit.h +++ /dev/null @@ -1,579 +0,0 @@ -/* - Public domain by Andrew M. - See: https://github.com/floodyberry/curve25519-donna - - 32 bit integer curve25519 implementation -*/ - -typedef uint32_t bignum25519[10]; -typedef uint32_t bignum25519align16[12]; - -static const uint32_t reduce_mask_25 = (1 << 25) - 1; -static const uint32_t reduce_mask_26 = (1 << 26) - 1; - - -/* out = in */ -DONNA_INLINE static void -curve25519_copy(bignum25519 out, const bignum25519 in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; - out[4] = in[4]; - out[5] = in[5]; - out[6] = in[6]; - out[7] = in[7]; - out[8] = in[8]; - out[9] = in[9]; -} - -/* out = a + b */ -DONNA_INLINE static void -curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - out[6] = a[6] + b[6]; - out[7] = a[7] + b[7]; - out[8] = a[8] + b[8]; - out[9] = a[9] + b[9]; -} - -DONNA_INLINE static void -curve25519_add_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t c; - out[0] = a[0] + b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = a[1] + b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = a[2] + b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = a[3] + b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = a[4] + b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; - out[5] = a[5] + b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; - out[6] = a[6] + b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; - out[7] = a[7] + b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; - out[8] = a[8] + b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; - out[9] = a[9] + b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; - out[0] += 19 * c; -} - -DONNA_INLINE static void -curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t c; - out[0] = a[0] + b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = a[1] + b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = a[2] + b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = a[3] + b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = a[4] + b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; - out[5] = a[5] + b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; - out[6] = a[6] + b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; - out[7] = a[7] + b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; - out[8] = a[8] + b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; - out[9] = a[9] + b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; - out[0] += 19 * c; -} - -/* multiples of p */ -static const uint32_t twoP0 = 0x07ffffda; -static const uint32_t twoP13579 = 0x03fffffe; -static const uint32_t twoP2468 = 0x07fffffe; -static const uint32_t fourP0 = 0x0fffffb4; -static const uint32_t fourP13579 = 0x07fffffc; -static const uint32_t fourP2468 = 0x0ffffffc; - -/* out = a - b */ -DONNA_INLINE static void -curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t c; - out[0] = twoP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = twoP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = twoP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = twoP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = twoP2468 + a[4] - b[4] + c; - out[5] = twoP13579 + a[5] - b[5] ; - out[6] = twoP2468 + a[6] - b[6] ; - out[7] = twoP13579 + a[7] - b[7] ; - out[8] = twoP2468 + a[8] - b[8] ; - out[9] = twoP13579 + a[9] - b[9] ; -} - -/* out = a - b, where a is the result of a basic op (add,sub) */ -DONNA_INLINE static void -curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t c; - out[0] = fourP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = fourP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = fourP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = fourP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = fourP2468 + a[4] - b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; - out[5] = fourP13579 + a[5] - b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; - out[6] = fourP2468 + a[6] - b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; - out[7] = fourP13579 + a[7] - b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; - out[8] = fourP2468 + a[8] - b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; - out[9] = fourP13579 + a[9] - b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; - out[0] += 19 * c; -} - -DONNA_INLINE static void -curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t c; - out[0] = fourP0 + a[0] - b[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = fourP13579 + a[1] - b[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = fourP2468 + a[2] - b[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = fourP13579 + a[3] - b[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = fourP2468 + a[4] - b[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; - out[5] = fourP13579 + a[5] - b[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; - out[6] = fourP2468 + a[6] - b[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; - out[7] = fourP13579 + a[7] - b[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; - out[8] = fourP2468 + a[8] - b[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; - out[9] = fourP13579 + a[9] - b[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; - out[0] += 19 * c; -} - -/* out = -a */ -DONNA_INLINE static void -curve25519_neg(bignum25519 out, const bignum25519 a) { - uint32_t c; - out[0] = twoP0 - a[0] ; c = (out[0] >> 26); out[0] &= reduce_mask_26; - out[1] = twoP13579 - a[1] + c; c = (out[1] >> 25); out[1] &= reduce_mask_25; - out[2] = twoP2468 - a[2] + c; c = (out[2] >> 26); out[2] &= reduce_mask_26; - out[3] = twoP13579 - a[3] + c; c = (out[3] >> 25); out[3] &= reduce_mask_25; - out[4] = twoP2468 - a[4] + c; c = (out[4] >> 26); out[4] &= reduce_mask_26; - out[5] = twoP13579 - a[5] + c; c = (out[5] >> 25); out[5] &= reduce_mask_25; - out[6] = twoP2468 - a[6] + c; c = (out[6] >> 26); out[6] &= reduce_mask_26; - out[7] = twoP13579 - a[7] + c; c = (out[7] >> 25); out[7] &= reduce_mask_25; - out[8] = twoP2468 - a[8] + c; c = (out[8] >> 26); out[8] &= reduce_mask_26; - out[9] = twoP13579 - a[9] + c; c = (out[9] >> 25); out[9] &= reduce_mask_25; - out[0] += 19 * c; -} - -/* out = a * b */ -#define curve25519_mul_noinline curve25519_mul -static void -curve25519_mul(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; - uint32_t s0,s1,s2,s3,s4,s5,s6,s7,s8,s9; - uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; - uint32_t p; - - r0 = b[0]; - r1 = b[1]; - r2 = b[2]; - r3 = b[3]; - r4 = b[4]; - r5 = b[5]; - r6 = b[6]; - r7 = b[7]; - r8 = b[8]; - r9 = b[9]; - - s0 = a[0]; - s1 = a[1]; - s2 = a[2]; - s3 = a[3]; - s4 = a[4]; - s5 = a[5]; - s6 = a[6]; - s7 = a[7]; - s8 = a[8]; - s9 = a[9]; - - m1 = mul32x32_64(r0, s1) + mul32x32_64(r1, s0); - m3 = mul32x32_64(r0, s3) + mul32x32_64(r1, s2) + mul32x32_64(r2, s1) + mul32x32_64(r3, s0); - m5 = mul32x32_64(r0, s5) + mul32x32_64(r1, s4) + mul32x32_64(r2, s3) + mul32x32_64(r3, s2) + mul32x32_64(r4, s1) + mul32x32_64(r5, s0); - m7 = mul32x32_64(r0, s7) + mul32x32_64(r1, s6) + mul32x32_64(r2, s5) + mul32x32_64(r3, s4) + mul32x32_64(r4, s3) + mul32x32_64(r5, s2) + mul32x32_64(r6, s1) + mul32x32_64(r7, s0); - m9 = mul32x32_64(r0, s9) + mul32x32_64(r1, s8) + mul32x32_64(r2, s7) + mul32x32_64(r3, s6) + mul32x32_64(r4, s5) + mul32x32_64(r5, s4) + mul32x32_64(r6, s3) + mul32x32_64(r7, s2) + mul32x32_64(r8, s1) + mul32x32_64(r9, s0); - - r1 *= 2; - r3 *= 2; - r5 *= 2; - r7 *= 2; - - m0 = mul32x32_64(r0, s0); - m2 = mul32x32_64(r0, s2) + mul32x32_64(r1, s1) + mul32x32_64(r2, s0); - m4 = mul32x32_64(r0, s4) + mul32x32_64(r1, s3) + mul32x32_64(r2, s2) + mul32x32_64(r3, s1) + mul32x32_64(r4, s0); - m6 = mul32x32_64(r0, s6) + mul32x32_64(r1, s5) + mul32x32_64(r2, s4) + mul32x32_64(r3, s3) + mul32x32_64(r4, s2) + mul32x32_64(r5, s1) + mul32x32_64(r6, s0); - m8 = mul32x32_64(r0, s8) + mul32x32_64(r1, s7) + mul32x32_64(r2, s6) + mul32x32_64(r3, s5) + mul32x32_64(r4, s4) + mul32x32_64(r5, s3) + mul32x32_64(r6, s2) + mul32x32_64(r7, s1) + mul32x32_64(r8, s0); - - r1 *= 19; - r2 *= 19; - r3 = (r3 / 2) * 19; - r4 *= 19; - r5 = (r5 / 2) * 19; - r6 *= 19; - r7 = (r7 / 2) * 19; - r8 *= 19; - r9 *= 19; - - m1 += (mul32x32_64(r9, s2) + mul32x32_64(r8, s3) + mul32x32_64(r7, s4) + mul32x32_64(r6, s5) + mul32x32_64(r5, s6) + mul32x32_64(r4, s7) + mul32x32_64(r3, s8) + mul32x32_64(r2, s9)); - m3 += (mul32x32_64(r9, s4) + mul32x32_64(r8, s5) + mul32x32_64(r7, s6) + mul32x32_64(r6, s7) + mul32x32_64(r5, s8) + mul32x32_64(r4, s9)); - m5 += (mul32x32_64(r9, s6) + mul32x32_64(r8, s7) + mul32x32_64(r7, s8) + mul32x32_64(r6, s9)); - m7 += (mul32x32_64(r9, s8) + mul32x32_64(r8, s9)); - - r3 *= 2; - r5 *= 2; - r7 *= 2; - r9 *= 2; - - m0 += (mul32x32_64(r9, s1) + mul32x32_64(r8, s2) + mul32x32_64(r7, s3) + mul32x32_64(r6, s4) + mul32x32_64(r5, s5) + mul32x32_64(r4, s6) + mul32x32_64(r3, s7) + mul32x32_64(r2, s8) + mul32x32_64(r1, s9)); - m2 += (mul32x32_64(r9, s3) + mul32x32_64(r8, s4) + mul32x32_64(r7, s5) + mul32x32_64(r6, s6) + mul32x32_64(r5, s7) + mul32x32_64(r4, s8) + mul32x32_64(r3, s9)); - m4 += (mul32x32_64(r9, s5) + mul32x32_64(r8, s6) + mul32x32_64(r7, s7) + mul32x32_64(r6, s8) + mul32x32_64(r5, s9)); - m6 += (mul32x32_64(r9, s7) + mul32x32_64(r8, s8) + mul32x32_64(r7, s9)); - m8 += (mul32x32_64(r9, s9)); - - r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); - m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); - m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); - m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); - m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); - m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); - m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); - m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); - m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); - m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); - m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); - r1 += p; - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; - out[5] = r5; - out[6] = r6; - out[7] = r7; - out[8] = r8; - out[9] = r9; -} - -/* out = in*in */ -static void -curve25519_square(bignum25519 out, const bignum25519 in) { - uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; - uint32_t d6,d7,d8,d9; - uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; - uint32_t p; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - r5 = in[5]; - r6 = in[6]; - r7 = in[7]; - r8 = in[8]; - r9 = in[9]; - - m0 = mul32x32_64(r0, r0); - r0 *= 2; - m1 = mul32x32_64(r0, r1); - m2 = mul32x32_64(r0, r2) + mul32x32_64(r1, r1 * 2); - r1 *= 2; - m3 = mul32x32_64(r0, r3) + mul32x32_64(r1, r2 ); - m4 = mul32x32_64(r0, r4) + mul32x32_64(r1, r3 * 2) + mul32x32_64(r2, r2); - r2 *= 2; - m5 = mul32x32_64(r0, r5) + mul32x32_64(r1, r4 ) + mul32x32_64(r2, r3); - m6 = mul32x32_64(r0, r6) + mul32x32_64(r1, r5 * 2) + mul32x32_64(r2, r4) + mul32x32_64(r3, r3 * 2); - r3 *= 2; - m7 = mul32x32_64(r0, r7) + mul32x32_64(r1, r6 ) + mul32x32_64(r2, r5) + mul32x32_64(r3, r4 ); - m8 = mul32x32_64(r0, r8) + mul32x32_64(r1, r7 * 2) + mul32x32_64(r2, r6) + mul32x32_64(r3, r5 * 2) + mul32x32_64(r4, r4 ); - m9 = mul32x32_64(r0, r9) + mul32x32_64(r1, r8 ) + mul32x32_64(r2, r7) + mul32x32_64(r3, r6 ) + mul32x32_64(r4, r5 * 2); - - d6 = r6 * 19; - d7 = r7 * 2 * 19; - d8 = r8 * 19; - d9 = r9 * 2 * 19; - - m0 += (mul32x32_64(d9, r1 ) + mul32x32_64(d8, r2 ) + mul32x32_64(d7, r3 ) + mul32x32_64(d6, r4 * 2) + mul32x32_64(r5, r5 * 2 * 19)); - m1 += (mul32x32_64(d9, r2 / 2) + mul32x32_64(d8, r3 ) + mul32x32_64(d7, r4 ) + mul32x32_64(d6, r5 * 2)); - m2 += (mul32x32_64(d9, r3 ) + mul32x32_64(d8, r4 * 2) + mul32x32_64(d7, r5 * 2) + mul32x32_64(d6, r6 )); - m3 += (mul32x32_64(d9, r4 ) + mul32x32_64(d8, r5 * 2) + mul32x32_64(d7, r6 )); - m4 += (mul32x32_64(d9, r5 * 2) + mul32x32_64(d8, r6 * 2) + mul32x32_64(d7, r7 )); - m5 += (mul32x32_64(d9, r6 ) + mul32x32_64(d8, r7 * 2)); - m6 += (mul32x32_64(d9, r7 * 2) + mul32x32_64(d8, r8 )); - m7 += (mul32x32_64(d9, r8 )); - m8 += (mul32x32_64(d9, r9 )); - - r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); - m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); - m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); - m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); - m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); - m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); - m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); - m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); - m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); - m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); - m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); - r1 += p; - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; - out[5] = r5; - out[6] = r6; - out[7] = r7; - out[8] = r8; - out[9] = r9; -} - - -/* out = in ^ (2 * count) */ -static void -curve25519_square_times(bignum25519 out, const bignum25519 in, int count) { - uint32_t r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; - uint32_t d6,d7,d8,d9; - uint64_t m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,c; - uint32_t p; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - r5 = in[5]; - r6 = in[6]; - r7 = in[7]; - r8 = in[8]; - r9 = in[9]; - - do { - m0 = mul32x32_64(r0, r0); - r0 *= 2; - m1 = mul32x32_64(r0, r1); - m2 = mul32x32_64(r0, r2) + mul32x32_64(r1, r1 * 2); - r1 *= 2; - m3 = mul32x32_64(r0, r3) + mul32x32_64(r1, r2 ); - m4 = mul32x32_64(r0, r4) + mul32x32_64(r1, r3 * 2) + mul32x32_64(r2, r2); - r2 *= 2; - m5 = mul32x32_64(r0, r5) + mul32x32_64(r1, r4 ) + mul32x32_64(r2, r3); - m6 = mul32x32_64(r0, r6) + mul32x32_64(r1, r5 * 2) + mul32x32_64(r2, r4) + mul32x32_64(r3, r3 * 2); - r3 *= 2; - m7 = mul32x32_64(r0, r7) + mul32x32_64(r1, r6 ) + mul32x32_64(r2, r5) + mul32x32_64(r3, r4 ); - m8 = mul32x32_64(r0, r8) + mul32x32_64(r1, r7 * 2) + mul32x32_64(r2, r6) + mul32x32_64(r3, r5 * 2) + mul32x32_64(r4, r4 ); - m9 = mul32x32_64(r0, r9) + mul32x32_64(r1, r8 ) + mul32x32_64(r2, r7) + mul32x32_64(r3, r6 ) + mul32x32_64(r4, r5 * 2); - - d6 = r6 * 19; - d7 = r7 * 2 * 19; - d8 = r8 * 19; - d9 = r9 * 2 * 19; - - m0 += (mul32x32_64(d9, r1 ) + mul32x32_64(d8, r2 ) + mul32x32_64(d7, r3 ) + mul32x32_64(d6, r4 * 2) + mul32x32_64(r5, r5 * 2 * 19)); - m1 += (mul32x32_64(d9, r2 / 2) + mul32x32_64(d8, r3 ) + mul32x32_64(d7, r4 ) + mul32x32_64(d6, r5 * 2)); - m2 += (mul32x32_64(d9, r3 ) + mul32x32_64(d8, r4 * 2) + mul32x32_64(d7, r5 * 2) + mul32x32_64(d6, r6 )); - m3 += (mul32x32_64(d9, r4 ) + mul32x32_64(d8, r5 * 2) + mul32x32_64(d7, r6 )); - m4 += (mul32x32_64(d9, r5 * 2) + mul32x32_64(d8, r6 * 2) + mul32x32_64(d7, r7 )); - m5 += (mul32x32_64(d9, r6 ) + mul32x32_64(d8, r7 * 2)); - m6 += (mul32x32_64(d9, r7 * 2) + mul32x32_64(d8, r8 )); - m7 += (mul32x32_64(d9, r8 )); - m8 += (mul32x32_64(d9, r9 )); - - r0 = (uint32_t)m0 & reduce_mask_26; c = (m0 >> 26); - m1 += c; r1 = (uint32_t)m1 & reduce_mask_25; c = (m1 >> 25); - m2 += c; r2 = (uint32_t)m2 & reduce_mask_26; c = (m2 >> 26); - m3 += c; r3 = (uint32_t)m3 & reduce_mask_25; c = (m3 >> 25); - m4 += c; r4 = (uint32_t)m4 & reduce_mask_26; c = (m4 >> 26); - m5 += c; r5 = (uint32_t)m5 & reduce_mask_25; c = (m5 >> 25); - m6 += c; r6 = (uint32_t)m6 & reduce_mask_26; c = (m6 >> 26); - m7 += c; r7 = (uint32_t)m7 & reduce_mask_25; c = (m7 >> 25); - m8 += c; r8 = (uint32_t)m8 & reduce_mask_26; c = (m8 >> 26); - m9 += c; r9 = (uint32_t)m9 & reduce_mask_25; p = (uint32_t)(m9 >> 25); - m0 = r0 + mul32x32_64(p,19); r0 = (uint32_t)m0 & reduce_mask_26; p = (uint32_t)(m0 >> 26); - r1 += p; - } while (--count); - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; - out[5] = r5; - out[6] = r6; - out[7] = r7; - out[8] = r8; - out[9] = r9; -} - -/* Take a little-endian, 32-byte number and expand it into polynomial form */ -static void -curve25519_expand(bignum25519 out, const unsigned char in[32]) { - static const union { uint8_t b[2]; uint16_t s; } endian_check = {{1,0}}; - uint32_t x0,x1,x2,x3,x4,x5,x6,x7; - - if (endian_check.s == 1) { - x0 = *(uint32_t *)(in + 0); - x1 = *(uint32_t *)(in + 4); - x2 = *(uint32_t *)(in + 8); - x3 = *(uint32_t *)(in + 12); - x4 = *(uint32_t *)(in + 16); - x5 = *(uint32_t *)(in + 20); - x6 = *(uint32_t *)(in + 24); - x7 = *(uint32_t *)(in + 28); - } else { - #define F(s) \ - ((((uint32_t)in[s + 0]) ) | \ - (((uint32_t)in[s + 1]) << 8) | \ - (((uint32_t)in[s + 2]) << 16) | \ - (((uint32_t)in[s + 3]) << 24)) - x0 = F(0); - x1 = F(4); - x2 = F(8); - x3 = F(12); - x4 = F(16); - x5 = F(20); - x6 = F(24); - x7 = F(28); - #undef F - } - - out[0] = ( x0 ) & 0x3ffffff; - out[1] = ((((uint64_t)x1 << 32) | x0) >> 26) & 0x1ffffff; - out[2] = ((((uint64_t)x2 << 32) | x1) >> 19) & 0x3ffffff; - out[3] = ((((uint64_t)x3 << 32) | x2) >> 13) & 0x1ffffff; - out[4] = (( x3) >> 6) & 0x3ffffff; - out[5] = ( x4 ) & 0x1ffffff; - out[6] = ((((uint64_t)x5 << 32) | x4) >> 25) & 0x3ffffff; - out[7] = ((((uint64_t)x6 << 32) | x5) >> 19) & 0x1ffffff; - out[8] = ((((uint64_t)x7 << 32) | x6) >> 12) & 0x3ffffff; - out[9] = (( x7) >> 6) & 0x1ffffff; -} - -/* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array - */ -static void -curve25519_contract(unsigned char out[32], const bignum25519 in) { - bignum25519 f; - curve25519_copy(f, in); - - #define carry_pass() \ - f[1] += f[0] >> 26; f[0] &= reduce_mask_26; \ - f[2] += f[1] >> 25; f[1] &= reduce_mask_25; \ - f[3] += f[2] >> 26; f[2] &= reduce_mask_26; \ - f[4] += f[3] >> 25; f[3] &= reduce_mask_25; \ - f[5] += f[4] >> 26; f[4] &= reduce_mask_26; \ - f[6] += f[5] >> 25; f[5] &= reduce_mask_25; \ - f[7] += f[6] >> 26; f[6] &= reduce_mask_26; \ - f[8] += f[7] >> 25; f[7] &= reduce_mask_25; \ - f[9] += f[8] >> 26; f[8] &= reduce_mask_26; - - #define carry_pass_full() \ - carry_pass() \ - f[0] += 19 * (f[9] >> 25); f[9] &= reduce_mask_25; - - #define carry_pass_final() \ - carry_pass() \ - f[9] &= reduce_mask_25; - - carry_pass_full() - carry_pass_full() - - /* now t is between 0 and 2^255-1, properly carried. */ - /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ - f[0] += 19; - carry_pass_full() - - /* now between 19 and 2^255-1 in both cases, and offset by 19. */ - f[0] += (reduce_mask_26 + 1) - 19; - f[1] += (reduce_mask_25 + 1) - 1; - f[2] += (reduce_mask_26 + 1) - 1; - f[3] += (reduce_mask_25 + 1) - 1; - f[4] += (reduce_mask_26 + 1) - 1; - f[5] += (reduce_mask_25 + 1) - 1; - f[6] += (reduce_mask_26 + 1) - 1; - f[7] += (reduce_mask_25 + 1) - 1; - f[8] += (reduce_mask_26 + 1) - 1; - f[9] += (reduce_mask_25 + 1) - 1; - - /* now between 2^255 and 2^256-20, and offset by 2^255. */ - carry_pass_final() - - #undef carry_pass - #undef carry_full - #undef carry_final - - f[1] <<= 2; - f[2] <<= 3; - f[3] <<= 5; - f[4] <<= 6; - f[6] <<= 1; - f[7] <<= 3; - f[8] <<= 4; - f[9] <<= 6; - - #define F(i, s) \ - out[s+0] |= (unsigned char )(f[i] & 0xff); \ - out[s+1] = (unsigned char )((f[i] >> 8) & 0xff); \ - out[s+2] = (unsigned char )((f[i] >> 16) & 0xff); \ - out[s+3] = (unsigned char )((f[i] >> 24) & 0xff); - - out[0] = 0; - out[16] = 0; - F(0,0); - F(1,3); - F(2,6); - F(3,9); - F(4,12); - F(5,16); - F(6,19); - F(7,22); - F(8,25); - F(9,28); - #undef F -} - - -/* out = (flag) ? in : out */ -DONNA_INLINE static void -curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint32_t flag) { - const uint32_t nb = flag - 1, b = ~nb; - const uint32_t *inl = (const uint32_t *)in; - uint32_t *outl = (uint32_t *)out; - outl[0] = (outl[0] & nb) | (inl[0] & b); - outl[1] = (outl[1] & nb) | (inl[1] & b); - outl[2] = (outl[2] & nb) | (inl[2] & b); - outl[3] = (outl[3] & nb) | (inl[3] & b); - outl[4] = (outl[4] & nb) | (inl[4] & b); - outl[5] = (outl[5] & nb) | (inl[5] & b); - outl[6] = (outl[6] & nb) | (inl[6] & b); - outl[7] = (outl[7] & nb) | (inl[7] & b); - outl[8] = (outl[8] & nb) | (inl[8] & b); - outl[9] = (outl[9] & nb) | (inl[9] & b); - outl[10] = (outl[10] & nb) | (inl[10] & b); - outl[11] = (outl[11] & nb) | (inl[11] & b); - outl[12] = (outl[12] & nb) | (inl[12] & b); - outl[13] = (outl[13] & nb) | (inl[13] & b); - outl[14] = (outl[14] & nb) | (inl[14] & b); - outl[15] = (outl[15] & nb) | (inl[15] & b); - outl[16] = (outl[16] & nb) | (inl[16] & b); - outl[17] = (outl[17] & nb) | (inl[17] & b); - outl[18] = (outl[18] & nb) | (inl[18] & b); - outl[19] = (outl[19] & nb) | (inl[19] & b); - outl[20] = (outl[20] & nb) | (inl[20] & b); - outl[21] = (outl[21] & nb) | (inl[21] & b); - outl[22] = (outl[22] & nb) | (inl[22] & b); - outl[23] = (outl[23] & nb) | (inl[23] & b); - -} - -/* if (iswap) swap(a, b) */ -DONNA_INLINE static void -curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint32_t iswap) { - const uint32_t swap = (uint32_t)(-(int32_t)iswap); - uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9; - - x0 = swap & (a[0] ^ b[0]); a[0] ^= x0; b[0] ^= x0; - x1 = swap & (a[1] ^ b[1]); a[1] ^= x1; b[1] ^= x1; - x2 = swap & (a[2] ^ b[2]); a[2] ^= x2; b[2] ^= x2; - x3 = swap & (a[3] ^ b[3]); a[3] ^= x3; b[3] ^= x3; - x4 = swap & (a[4] ^ b[4]); a[4] ^= x4; b[4] ^= x4; - x5 = swap & (a[5] ^ b[5]); a[5] ^= x5; b[5] ^= x5; - x6 = swap & (a[6] ^ b[6]); a[6] ^= x6; b[6] ^= x6; - x7 = swap & (a[7] ^ b[7]); a[7] ^= x7; b[7] ^= x7; - x8 = swap & (a[8] ^ b[8]); a[8] ^= x8; b[8] ^= x8; - x9 = swap & (a[9] ^ b[9]); a[9] ^= x9; b[9] ^= x9; -} diff --git a/src/tor/src/ext/ed25519/donna/curve25519-donna-64bit.h b/src/tor/src/ext/ed25519/donna/curve25519-donna-64bit.h deleted file mode 100644 index 50c991676..000000000 --- a/src/tor/src/ext/ed25519/donna/curve25519-donna-64bit.h +++ /dev/null @@ -1,413 +0,0 @@ -/* - Public domain by Adam Langley & - Andrew M. - See: https://github.com/floodyberry/curve25519-donna - - 64bit integer curve25519 implementation -*/ - -typedef uint64_t bignum25519[5]; - -//static const uint64_t reduce_mask_40 = ((uint64_t)1 << 40) - 1; -static const uint64_t reduce_mask_51 = ((uint64_t)1 << 51) - 1; -//static const uint64_t reduce_mask_56 = ((uint64_t)1 << 56) - 1; - -/* out = in */ -DONNA_INLINE static void -curve25519_copy(bignum25519 out, const bignum25519 in) { - out[0] = in[0]; - out[1] = in[1]; - out[2] = in[2]; - out[3] = in[3]; - out[4] = in[4]; -} - -/* out = a + b */ -DONNA_INLINE static void -curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; -} - -/* out = a + b, where a and/or b are the result of a basic op (add,sub) */ -DONNA_INLINE static void -curve25519_add_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; -} - -DONNA_INLINE static void -curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint64_t c; - out[0] = a[0] + b[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; - out[1] = a[1] + b[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; - out[2] = a[2] + b[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; - out[3] = a[3] + b[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; - out[4] = a[4] + b[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; - out[0] += c * 19; -} - -/* multiples of p */ -static const uint64_t twoP0 = 0x0fffffffffffda; -static const uint64_t twoP1234 = 0x0ffffffffffffe; -static const uint64_t fourP0 = 0x1fffffffffffb4; -static const uint64_t fourP1234 = 0x1ffffffffffffc; - -/* out = a - b */ -DONNA_INLINE static void -curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { - out[0] = a[0] + twoP0 - b[0]; - out[1] = a[1] + twoP1234 - b[1]; - out[2] = a[2] + twoP1234 - b[2]; - out[3] = a[3] + twoP1234 - b[3]; - out[4] = a[4] + twoP1234 - b[4]; -} - -/* out = a - b, where a and/or b are the result of a basic op (add,sub) */ -DONNA_INLINE static void -curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { - out[0] = a[0] + fourP0 - b[0]; - out[1] = a[1] + fourP1234 - b[1]; - out[2] = a[2] + fourP1234 - b[2]; - out[3] = a[3] + fourP1234 - b[3]; - out[4] = a[4] + fourP1234 - b[4]; -} - -DONNA_INLINE static void -curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - uint64_t c; - out[0] = a[0] + fourP0 - b[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; - out[1] = a[1] + fourP1234 - b[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; - out[2] = a[2] + fourP1234 - b[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; - out[3] = a[3] + fourP1234 - b[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; - out[4] = a[4] + fourP1234 - b[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; - out[0] += c * 19; -} - -/* out = -a */ -DONNA_INLINE static void -curve25519_neg(bignum25519 out, const bignum25519 a) { - uint64_t c; - out[0] = twoP0 - a[0] ; c = (out[0] >> 51); out[0] &= reduce_mask_51; - out[1] = twoP1234 - a[1] + c; c = (out[1] >> 51); out[1] &= reduce_mask_51; - out[2] = twoP1234 - a[2] + c; c = (out[2] >> 51); out[2] &= reduce_mask_51; - out[3] = twoP1234 - a[3] + c; c = (out[3] >> 51); out[3] &= reduce_mask_51; - out[4] = twoP1234 - a[4] + c; c = (out[4] >> 51); out[4] &= reduce_mask_51; - out[0] += c * 19; -} - -/* out = a * b */ -DONNA_INLINE static void -curve25519_mul(bignum25519 out, const bignum25519 in2, const bignum25519 in) { -#if !defined(HAVE_NATIVE_UINT128) - uint128_t mul; -#endif - uint128_t t[5]; - uint64_t r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - - s0 = in2[0]; - s1 = in2[1]; - s2 = in2[2]; - s3 = in2[3]; - s4 = in2[4]; - -#if defined(HAVE_NATIVE_UINT128) - t[0] = ((uint128_t) r0) * s0; - t[1] = ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0; - t[2] = ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1; - t[3] = ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1; - t[4] = ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2; -#else - mul64x64_128(t[0], r0, s0) - mul64x64_128(t[1], r0, s1) mul64x64_128(mul, r1, s0) add128(t[1], mul) - mul64x64_128(t[2], r0, s2) mul64x64_128(mul, r2, s0) add128(t[2], mul) mul64x64_128(mul, r1, s1) add128(t[2], mul) - mul64x64_128(t[3], r0, s3) mul64x64_128(mul, r3, s0) add128(t[3], mul) mul64x64_128(mul, r1, s2) add128(t[3], mul) mul64x64_128(mul, r2, s1) add128(t[3], mul) - mul64x64_128(t[4], r0, s4) mul64x64_128(mul, r4, s0) add128(t[4], mul) mul64x64_128(mul, r3, s1) add128(t[4], mul) mul64x64_128(mul, r1, s3) add128(t[4], mul) mul64x64_128(mul, r2, s2) add128(t[4], mul) -#endif - - r1 *= 19; - r2 *= 19; - r3 *= 19; - r4 *= 19; - -#if defined(HAVE_NATIVE_UINT128) - t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2; - t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3; - t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4; - t[3] += ((uint128_t) r4) * s4; -#else - mul64x64_128(mul, r4, s1) add128(t[0], mul) mul64x64_128(mul, r1, s4) add128(t[0], mul) mul64x64_128(mul, r2, s3) add128(t[0], mul) mul64x64_128(mul, r3, s2) add128(t[0], mul) - mul64x64_128(mul, r4, s2) add128(t[1], mul) mul64x64_128(mul, r2, s4) add128(t[1], mul) mul64x64_128(mul, r3, s3) add128(t[1], mul) - mul64x64_128(mul, r4, s3) add128(t[2], mul) mul64x64_128(mul, r3, s4) add128(t[2], mul) - mul64x64_128(mul, r4, s4) add128(t[3], mul) -#endif - - - r0 = lo128(t[0]) & reduce_mask_51; shr128(c, t[0], 51); - add128_64(t[1], c) r1 = lo128(t[1]) & reduce_mask_51; shr128(c, t[1], 51); - add128_64(t[2], c) r2 = lo128(t[2]) & reduce_mask_51; shr128(c, t[2], 51); - add128_64(t[3], c) r3 = lo128(t[3]) & reduce_mask_51; shr128(c, t[3], 51); - add128_64(t[4], c) r4 = lo128(t[4]) & reduce_mask_51; shr128(c, t[4], 51); - r0 += c * 19; c = r0 >> 51; r0 = r0 & reduce_mask_51; - r1 += c; - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; -} - -DONNA_NOINLINE static void -curve25519_mul_noinline(bignum25519 out, const bignum25519 in2, const bignum25519 in) { - curve25519_mul(out, in2, in); -} - -/* out = in^(2 * count) */ -DONNA_NOINLINE static void -curve25519_square_times(bignum25519 out, const bignum25519 in, uint64_t count) { -#if !defined(HAVE_NATIVE_UINT128) - uint128_t mul; -#endif - uint128_t t[5]; - uint64_t r0,r1,r2,r3,r4,c; - uint64_t d0,d1,d2,d4,d419; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - - do { - d0 = r0 * 2; - d1 = r1 * 2; - d2 = r2 * 2 * 19; - d419 = r4 * 19; - d4 = d419 * 2; - -#if defined(HAVE_NATIVE_UINT128) - t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); - t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); - t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); - t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); - t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); -#else - mul64x64_128(t[0], r0, r0) mul64x64_128(mul, d4, r1) add128(t[0], mul) mul64x64_128(mul, d2, r3) add128(t[0], mul) - mul64x64_128(t[1], d0, r1) mul64x64_128(mul, d4, r2) add128(t[1], mul) mul64x64_128(mul, r3, r3 * 19) add128(t[1], mul) - mul64x64_128(t[2], d0, r2) mul64x64_128(mul, r1, r1) add128(t[2], mul) mul64x64_128(mul, d4, r3) add128(t[2], mul) - mul64x64_128(t[3], d0, r3) mul64x64_128(mul, d1, r2) add128(t[3], mul) mul64x64_128(mul, r4, d419) add128(t[3], mul) - mul64x64_128(t[4], d0, r4) mul64x64_128(mul, d1, r3) add128(t[4], mul) mul64x64_128(mul, r2, r2) add128(t[4], mul) -#endif - - r0 = lo128(t[0]) & reduce_mask_51; - r1 = lo128(t[1]) & reduce_mask_51; shl128(c, t[0], 13); r1 += c; - r2 = lo128(t[2]) & reduce_mask_51; shl128(c, t[1], 13); r2 += c; - r3 = lo128(t[3]) & reduce_mask_51; shl128(c, t[2], 13); r3 += c; - r4 = lo128(t[4]) & reduce_mask_51; shl128(c, t[3], 13); r4 += c; - shl128(c, t[4], 13); r0 += c * 19; - c = r0 >> 51; r0 &= reduce_mask_51; - r1 += c ; c = r1 >> 51; r1 &= reduce_mask_51; - r2 += c ; c = r2 >> 51; r2 &= reduce_mask_51; - r3 += c ; c = r3 >> 51; r3 &= reduce_mask_51; - r4 += c ; c = r4 >> 51; r4 &= reduce_mask_51; - r0 += c * 19; - } while(--count); - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; -} - -DONNA_INLINE static void -curve25519_square(bignum25519 out, const bignum25519 in) { -#if !defined(HAVE_NATIVE_UINT128) - uint128_t mul; -#endif - uint128_t t[5]; - uint64_t r0,r1,r2,r3,r4,c; - uint64_t d0,d1,d2,d4,d419; - - r0 = in[0]; - r1 = in[1]; - r2 = in[2]; - r3 = in[3]; - r4 = in[4]; - - d0 = r0 * 2; - d1 = r1 * 2; - d2 = r2 * 2 * 19; - d419 = r4 * 19; - d4 = d419 * 2; - -#if defined(HAVE_NATIVE_UINT128) - t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3 )); - t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19)); - t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3 )); - t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419 )); - t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2 )); -#else - mul64x64_128(t[0], r0, r0) mul64x64_128(mul, d4, r1) add128(t[0], mul) mul64x64_128(mul, d2, r3) add128(t[0], mul) - mul64x64_128(t[1], d0, r1) mul64x64_128(mul, d4, r2) add128(t[1], mul) mul64x64_128(mul, r3, r3 * 19) add128(t[1], mul) - mul64x64_128(t[2], d0, r2) mul64x64_128(mul, r1, r1) add128(t[2], mul) mul64x64_128(mul, d4, r3) add128(t[2], mul) - mul64x64_128(t[3], d0, r3) mul64x64_128(mul, d1, r2) add128(t[3], mul) mul64x64_128(mul, r4, d419) add128(t[3], mul) - mul64x64_128(t[4], d0, r4) mul64x64_128(mul, d1, r3) add128(t[4], mul) mul64x64_128(mul, r2, r2) add128(t[4], mul) -#endif - - r0 = lo128(t[0]) & reduce_mask_51; shr128(c, t[0], 51); - add128_64(t[1], c) r1 = lo128(t[1]) & reduce_mask_51; shr128(c, t[1], 51); - add128_64(t[2], c) r2 = lo128(t[2]) & reduce_mask_51; shr128(c, t[2], 51); - add128_64(t[3], c) r3 = lo128(t[3]) & reduce_mask_51; shr128(c, t[3], 51); - add128_64(t[4], c) r4 = lo128(t[4]) & reduce_mask_51; shr128(c, t[4], 51); - r0 += c * 19; c = r0 >> 51; r0 = r0 & reduce_mask_51; - r1 += c; - - out[0] = r0; - out[1] = r1; - out[2] = r2; - out[3] = r3; - out[4] = r4; -} - -/* Take a little-endian, 32-byte number and expand it into polynomial form */ -DONNA_INLINE static void -curve25519_expand(bignum25519 out, const unsigned char *in) { - static const union { uint8_t b[2]; uint16_t s; } endian_check = {{1,0}}; - uint64_t x0,x1,x2,x3; - - if (endian_check.s == 1) { - x0 = *(uint64_t *)(in + 0); - x1 = *(uint64_t *)(in + 8); - x2 = *(uint64_t *)(in + 16); - x3 = *(uint64_t *)(in + 24); - } else { - #define F(s) \ - ((((uint64_t)in[s + 0]) ) | \ - (((uint64_t)in[s + 1]) << 8) | \ - (((uint64_t)in[s + 2]) << 16) | \ - (((uint64_t)in[s + 3]) << 24) | \ - (((uint64_t)in[s + 4]) << 32) | \ - (((uint64_t)in[s + 5]) << 40) | \ - (((uint64_t)in[s + 6]) << 48) | \ - (((uint64_t)in[s + 7]) << 56)) - - x0 = F(0); - x1 = F(8); - x2 = F(16); - x3 = F(24); - } - - out[0] = x0 & reduce_mask_51; x0 = (x0 >> 51) | (x1 << 13); - out[1] = x0 & reduce_mask_51; x1 = (x1 >> 38) | (x2 << 26); - out[2] = x1 & reduce_mask_51; x2 = (x2 >> 25) | (x3 << 39); - out[3] = x2 & reduce_mask_51; x3 = (x3 >> 12); - out[4] = x3 & reduce_mask_51; -} - -/* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array - */ -DONNA_INLINE static void -curve25519_contract(unsigned char *out, const bignum25519 input) { - uint64_t t[5]; - uint64_t f, i; - - t[0] = input[0]; - t[1] = input[1]; - t[2] = input[2]; - t[3] = input[3]; - t[4] = input[4]; - - #define curve25519_contract_carry() \ - t[1] += t[0] >> 51; t[0] &= reduce_mask_51; \ - t[2] += t[1] >> 51; t[1] &= reduce_mask_51; \ - t[3] += t[2] >> 51; t[2] &= reduce_mask_51; \ - t[4] += t[3] >> 51; t[3] &= reduce_mask_51; - - #define curve25519_contract_carry_full() curve25519_contract_carry() \ - t[0] += 19 * (t[4] >> 51); t[4] &= reduce_mask_51; - - #define curve25519_contract_carry_final() curve25519_contract_carry() \ - t[4] &= reduce_mask_51; - - curve25519_contract_carry_full() - curve25519_contract_carry_full() - - /* now t is between 0 and 2^255-1, properly carried. */ - /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ - t[0] += 19; - curve25519_contract_carry_full() - - /* now between 19 and 2^255-1 in both cases, and offset by 19. */ - t[0] += (reduce_mask_51 + 1) - 19; - t[1] += (reduce_mask_51 + 1) - 1; - t[2] += (reduce_mask_51 + 1) - 1; - t[3] += (reduce_mask_51 + 1) - 1; - t[4] += (reduce_mask_51 + 1) - 1; - - /* now between 2^255 and 2^256-20, and offset by 2^255. */ - curve25519_contract_carry_final() - - #define write51full(n,shift) \ - f = ((t[n] >> shift) | (t[n+1] << (51 - shift))); \ - for (i = 0; i < 8; i++, f >>= 8) *out++ = (unsigned char)f; - #define write51(n) write51full(n,13*n) - write51(0) - write51(1) - write51(2) - write51(3) -} - -#if !defined(ED25519_GCC_64BIT_CHOOSE) - -/* out = (flag) ? in : out */ -DONNA_INLINE static void -curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint64_t flag) { - const uint64_t nb = flag - 1, b = ~nb; - const uint64_t *inq = (const uint64_t *)in; - uint64_t *outq = (uint64_t *)out; - outq[0] = (outq[0] & nb) | (inq[0] & b); - outq[1] = (outq[1] & nb) | (inq[1] & b); - outq[2] = (outq[2] & nb) | (inq[2] & b); - outq[3] = (outq[3] & nb) | (inq[3] & b); - outq[4] = (outq[4] & nb) | (inq[4] & b); - outq[5] = (outq[5] & nb) | (inq[5] & b); - outq[6] = (outq[6] & nb) | (inq[6] & b); - outq[7] = (outq[7] & nb) | (inq[7] & b); - outq[8] = (outq[8] & nb) | (inq[8] & b); - outq[9] = (outq[9] & nb) | (inq[9] & b); - outq[10] = (outq[10] & nb) | (inq[10] & b); - outq[11] = (outq[11] & nb) | (inq[11] & b); -} - -/* if (iswap) swap(a, b) */ -DONNA_INLINE static void -curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint64_t iswap) { - const uint64_t swap = (uint64_t)(-(int64_t)iswap); - uint64_t x0,x1,x2,x3,x4; - - x0 = swap & (a[0] ^ b[0]); a[0] ^= x0; b[0] ^= x0; - x1 = swap & (a[1] ^ b[1]); a[1] ^= x1; b[1] ^= x1; - x2 = swap & (a[2] ^ b[2]); a[2] ^= x2; b[2] ^= x2; - x3 = swap & (a[3] ^ b[3]); a[3] ^= x3; b[3] ^= x3; - x4 = swap & (a[4] ^ b[4]); a[4] ^= x4; b[4] ^= x4; -} - -#endif /* ED25519_GCC_64BIT_CHOOSE */ - -#define ED25519_64BIT_TABLES - diff --git a/src/tor/src/ext/ed25519/donna/curve25519-donna-helpers.h b/src/tor/src/ext/ed25519/donna/curve25519-donna-helpers.h deleted file mode 100644 index ca442fa24..000000000 --- a/src/tor/src/ext/ed25519/donna/curve25519-donna-helpers.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - Public domain by Andrew M. - See: https://github.com/floodyberry/curve25519-donna - - Curve25519 implementation agnostic helpers -*/ - -#ifdef __GNUC__ -#define ED_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -#endif - -#if __GNUC__ && ED_GCC_VERSION >= 401 -#if ED_GCC_VERSION >= 406 -#pragma GCC diagnostic push -#endif -/* Some versions of GCC (particularly on arm) give us bogus warnings here. - * Suppress the GCC warning so we can build Tor with -Wstack-protector. */ -#pragma GCC diagnostic ignored "-Wstack-protector" -#endif - -/* - * In: b = 2^5 - 2^0 - * Out: b = 2^250 - 2^0 - */ -static void -curve25519_pow_two5mtwo0_two250mtwo0(bignum25519 b) { - bignum25519 ALIGN(16) t0,c; - - /* 2^5 - 2^0 */ /* b */ - /* 2^10 - 2^5 */ curve25519_square_times(t0, b, 5); - /* 2^10 - 2^0 */ curve25519_mul_noinline(b, t0, b); - /* 2^20 - 2^10 */ curve25519_square_times(t0, b, 10); - /* 2^20 - 2^0 */ curve25519_mul_noinline(c, t0, b); - /* 2^40 - 2^20 */ curve25519_square_times(t0, c, 20); - /* 2^40 - 2^0 */ curve25519_mul_noinline(t0, t0, c); - /* 2^50 - 2^10 */ curve25519_square_times(t0, t0, 10); - /* 2^50 - 2^0 */ curve25519_mul_noinline(b, t0, b); - /* 2^100 - 2^50 */ curve25519_square_times(t0, b, 50); - /* 2^100 - 2^0 */ curve25519_mul_noinline(c, t0, b); - /* 2^200 - 2^100 */ curve25519_square_times(t0, c, 100); - /* 2^200 - 2^0 */ curve25519_mul_noinline(t0, t0, c); - /* 2^250 - 2^50 */ curve25519_square_times(t0, t0, 50); - /* 2^250 - 2^0 */ curve25519_mul_noinline(b, t0, b); -} - -/* - * z^(p - 2) = z(2^255 - 21) - */ -static void -curve25519_recip(bignum25519 out, const bignum25519 z) { - bignum25519 ALIGN(16) a,t0,b; - - /* 2 */ curve25519_square_times(a, z, 1); /* a = 2 */ - /* 8 */ curve25519_square_times(t0, a, 2); - /* 9 */ curve25519_mul_noinline(b, t0, z); /* b = 9 */ - /* 11 */ curve25519_mul_noinline(a, b, a); /* a = 11 */ - /* 22 */ curve25519_square_times(t0, a, 1); - /* 2^5 - 2^0 = 31 */ curve25519_mul_noinline(b, t0, b); - /* 2^250 - 2^0 */ curve25519_pow_two5mtwo0_two250mtwo0(b); - /* 2^255 - 2^5 */ curve25519_square_times(b, b, 5); - /* 2^255 - 21 */ curve25519_mul_noinline(out, b, a); -} - -/* - * z^((p-5)/8) = z^(2^252 - 3) - */ -static void -curve25519_pow_two252m3(bignum25519 two252m3, const bignum25519 z) { - bignum25519 ALIGN(16) b,c,t0; - - /* 2 */ curve25519_square_times(c, z, 1); /* c = 2 */ - /* 8 */ curve25519_square_times(t0, c, 2); /* t0 = 8 */ - /* 9 */ curve25519_mul_noinline(b, t0, z); /* b = 9 */ - /* 11 */ curve25519_mul_noinline(c, b, c); /* c = 11 */ - /* 22 */ curve25519_square_times(t0, c, 1); - /* 2^5 - 2^0 = 31 */ curve25519_mul_noinline(b, t0, b); - /* 2^250 - 2^0 */ curve25519_pow_two5mtwo0_two250mtwo0(b); - /* 2^252 - 2^2 */ curve25519_square_times(b, b, 2); - /* 2^252 - 3 */ curve25519_mul_noinline(two252m3, b, z); -} - -#if __GNUC__ && ED_GCC_VERSION >= 406 -#pragma GCC diagnostic pop -#endif diff --git a/src/tor/src/ext/ed25519/donna/curve25519-donna-sse2.h b/src/tor/src/ext/ed25519/donna/curve25519-donna-sse2.h deleted file mode 100644 index 1123cb1e9..000000000 --- a/src/tor/src/ext/ed25519/donna/curve25519-donna-sse2.h +++ /dev/null @@ -1,1105 +0,0 @@ -/* - Public domain by Andrew M. - See: https://github.com/floodyberry/curve25519-donna - - SSE2 curve25519 implementation -*/ - -#include -typedef __m128i xmmi; - -typedef union packedelem8_t { - unsigned char u[16]; - xmmi v; -} packedelem8; - -typedef union packedelem32_t { - uint32_t u[4]; - xmmi v; -} packedelem32; - -typedef union packedelem64_t { - uint64_t u[2]; - xmmi v; -} packedelem64; - -/* 10 elements + an extra 2 to fit in 3 xmm registers */ -typedef uint32_t bignum25519[12]; -typedef packedelem32 packed32bignum25519[5]; -typedef packedelem64 packed64bignum25519[10]; - -static const packedelem32 bot32bitmask = {{0xffffffff, 0x00000000, 0xffffffff, 0x00000000}}; -static const packedelem32 top64bitmask = {{0x00000000, 0x00000000, 0xffffffff, 0xffffffff}}; -static const packedelem32 bot64bitmask = {{0xffffffff, 0xffffffff, 0x00000000, 0x00000000}}; - -/* reduction masks */ -static const packedelem64 packedmask26 = {{0x03ffffff, 0x03ffffff}}; -static const packedelem64 packedmask25 = {{0x01ffffff, 0x01ffffff}}; -static const packedelem32 packedmask26262626 = {{0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff}}; -static const packedelem32 packedmask25252525 = {{0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff}}; - -/* multipliers */ -static const packedelem64 packednineteen = {{19, 19}}; -static const packedelem64 packedthirtyeight = {{38, 38}}; -static const packedelem64 packed3819 = {{19*2,19}}; - -/* 2*(2^255 - 19) = 0 mod p */ -static const packedelem32 packed2p0 = {{0x7ffffda,0x3fffffe,0x7fffffe,0x3fffffe}}; -static const packedelem32 packed2p1 = {{0x7fffffe,0x3fffffe,0x7fffffe,0x3fffffe}}; -static const packedelem32 packed2p2 = {{0x7fffffe,0x3fffffe,0x0000000,0x0000000}}; - -static const packedelem32 packed32packed2p0 = {{0x7ffffda,0x7ffffda,0x3fffffe,0x3fffffe}}; -static const packedelem32 packed32packed2p1 = {{0x7fffffe,0x7fffffe,0x3fffffe,0x3fffffe}}; - -/* 4*(2^255 - 19) = 0 mod p */ -static const packedelem32 packed4p0 = {{0xfffffb4,0x7fffffc,0xffffffc,0x7fffffc}}; -static const packedelem32 packed4p1 = {{0xffffffc,0x7fffffc,0xffffffc,0x7fffffc}}; -static const packedelem32 packed4p2 = {{0xffffffc,0x7fffffc,0x0000000,0x0000000}}; - -static const packedelem32 packed32packed4p0 = {{0xfffffb4,0xfffffb4,0x7fffffc,0x7fffffc}}; -static const packedelem32 packed32packed4p1 = {{0xffffffc,0xffffffc,0x7fffffc,0x7fffffc}}; - -/* out = in */ -DONNA_INLINE static void -curve25519_copy(bignum25519 out, const bignum25519 in) { - xmmi x0,x1,x2; - x0 = _mm_load_si128((xmmi*)in + 0); - x1 = _mm_load_si128((xmmi*)in + 1); - x2 = _mm_load_si128((xmmi*)in + 2); - _mm_store_si128((xmmi*)out + 0, x0); - _mm_store_si128((xmmi*)out + 1, x1); - _mm_store_si128((xmmi*)out + 2, x2); -} - -/* out = a + b */ -DONNA_INLINE static void -curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - a0 = _mm_load_si128((xmmi*)a + 0); - a1 = _mm_load_si128((xmmi*)a + 1); - a2 = _mm_load_si128((xmmi*)a + 2); - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_add_epi32(a0, b0); - a1 = _mm_add_epi32(a1, b1); - a2 = _mm_add_epi32(a2, b2); - _mm_store_si128((xmmi*)out + 0, a0); - _mm_store_si128((xmmi*)out + 1, a1); - _mm_store_si128((xmmi*)out + 2, a2); -} - -#define curve25519_add_after_basic curve25519_add_reduce -DONNA_INLINE static void -curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - xmmi c1,c2,c3; - xmmi r0,r1,r2,r3,r4,r5; - - a0 = _mm_load_si128((xmmi*)a + 0); - a1 = _mm_load_si128((xmmi*)a + 1); - a2 = _mm_load_si128((xmmi*)a + 2); - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_add_epi32(a0, b0); - a1 = _mm_add_epi32(a1, b1); - a2 = _mm_add_epi32(a2, b2); - - r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); - r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); - r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); - r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); - r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); - r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); -} - -DONNA_INLINE static void -curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - xmmi c1,c2; - xmmi r0,r1; - - a0 = _mm_load_si128((xmmi*)a + 0); - a1 = _mm_load_si128((xmmi*)a + 1); - a2 = _mm_load_si128((xmmi*)a + 2); - a0 = _mm_add_epi32(a0, packed2p0.v); - a1 = _mm_add_epi32(a1, packed2p1.v); - a2 = _mm_add_epi32(a2, packed2p2.v); - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_sub_epi32(a0, b0); - a1 = _mm_sub_epi32(a1, b1); - a2 = _mm_sub_epi32(a2, b2); - - r0 = _mm_and_si128(_mm_shuffle_epi32(a0, _MM_SHUFFLE(2,2,0,0)), bot32bitmask.v); - r1 = _mm_and_si128(_mm_shuffle_epi32(a0, _MM_SHUFFLE(3,3,1,1)), bot32bitmask.v); - - c1 = _mm_srli_epi32(r0, 26); - c2 = _mm_srli_epi32(r1, 25); - r0 = _mm_and_si128(r0, packedmask26.v); - r1 = _mm_and_si128(r1, packedmask25.v); - r0 = _mm_add_epi32(r0, _mm_slli_si128(c2, 8)); - r1 = _mm_add_epi32(r1, c1); - - a0 = _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpackhi_epi32(r0, r1)); - a1 = _mm_add_epi32(a1, _mm_srli_si128(c2, 8)); - - _mm_store_si128((xmmi*)out + 0, a0); - _mm_store_si128((xmmi*)out + 1, a1); - _mm_store_si128((xmmi*)out + 2, a2); -} - -DONNA_INLINE static void -curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - xmmi c1,c2,c3; - xmmi r0,r1,r2,r3,r4,r5; - - a0 = _mm_load_si128((xmmi*)a + 0); - a1 = _mm_load_si128((xmmi*)a + 1); - a2 = _mm_load_si128((xmmi*)a + 2); - a0 = _mm_add_epi32(a0, packed4p0.v); - a1 = _mm_add_epi32(a1, packed4p1.v); - a2 = _mm_add_epi32(a2, packed4p2.v); - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_sub_epi32(a0, b0); - a1 = _mm_sub_epi32(a1, b1); - a2 = _mm_sub_epi32(a2, b2); - - r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); - r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); - r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); - r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); - r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); - r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); -} - -DONNA_INLINE static void -curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - xmmi c1,c2,c3; - xmmi r0,r1,r2,r3,r4,r5; - - a0 = _mm_load_si128((xmmi*)a + 0); - a1 = _mm_load_si128((xmmi*)a + 1); - a2 = _mm_load_si128((xmmi*)a + 2); - a0 = _mm_add_epi32(a0, packed2p0.v); - a1 = _mm_add_epi32(a1, packed2p1.v); - a2 = _mm_add_epi32(a2, packed2p2.v); - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_sub_epi32(a0, b0); - a1 = _mm_sub_epi32(a1, b1); - a2 = _mm_sub_epi32(a2, b2); - - r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); - r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); - r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); - r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); - r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); - r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); -} - - -DONNA_INLINE static void -curve25519_neg(bignum25519 out, const bignum25519 b) { - xmmi a0,a1,a2,b0,b1,b2; - xmmi c1,c2,c3; - xmmi r0,r1,r2,r3,r4,r5; - - a0 = packed2p0.v; - a1 = packed2p1.v; - a2 = packed2p2.v; - b0 = _mm_load_si128((xmmi*)b + 0); - b1 = _mm_load_si128((xmmi*)b + 1); - b2 = _mm_load_si128((xmmi*)b + 2); - a0 = _mm_sub_epi32(a0, b0); - a1 = _mm_sub_epi32(a1, b1); - a2 = _mm_sub_epi32(a2, b2); - - r0 = _mm_and_si128(_mm_unpacklo_epi64(a0, a1), bot32bitmask.v); - r1 = _mm_srli_epi64(_mm_unpacklo_epi64(a0, a1), 32); - r2 = _mm_and_si128(_mm_unpackhi_epi64(a0, a1), bot32bitmask.v); - r3 = _mm_srli_epi64(_mm_unpackhi_epi64(a0, a1), 32); - r4 = _mm_and_si128(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), bot32bitmask.v); - r5 = _mm_srli_epi64(_mm_unpacklo_epi64(_mm_setzero_si128(), a2), 32); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - _mm_store_si128((xmmi*)out + 0, _mm_unpacklo_epi64(_mm_unpacklo_epi32(r0, r1), _mm_unpacklo_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 1, _mm_unpacklo_epi64(_mm_unpackhi_epi32(r0, r1), _mm_unpackhi_epi32(r2, r3))); - _mm_store_si128((xmmi*)out + 2, _mm_unpackhi_epi32(r4, r5)); -} - - -/* Multiply two numbers: out = in2 * in */ -static void -curve25519_mul(bignum25519 out, const bignum25519 r, const bignum25519 s) { - xmmi m01,m23,m45,m67,m89; - xmmi m0123,m4567; - xmmi s0123,s4567; - xmmi s01,s23,s45,s67,s89; - xmmi s12,s34,s56,s78,s9; - xmmi r0,r2,r4,r6,r8; - xmmi r1,r3,r5,r7,r9; - xmmi r119,r219,r319,r419,r519,r619,r719,r819,r919; - xmmi c1,c2,c3; - - s0123 = _mm_load_si128((xmmi*)s + 0); - s01 = _mm_shuffle_epi32(s0123,_MM_SHUFFLE(3,1,2,0)); - s12 = _mm_shuffle_epi32(s0123, _MM_SHUFFLE(2,2,1,1)); - s23 = _mm_shuffle_epi32(s0123,_MM_SHUFFLE(3,3,2,2)); - s4567 = _mm_load_si128((xmmi*)s + 1); - s34 = _mm_unpacklo_epi64(_mm_srli_si128(s0123,12),s4567); - s45 = _mm_shuffle_epi32(s4567,_MM_SHUFFLE(3,1,2,0)); - s56 = _mm_shuffle_epi32(s4567, _MM_SHUFFLE(2,2,1,1)); - s67 = _mm_shuffle_epi32(s4567,_MM_SHUFFLE(3,3,2,2)); - s89 = _mm_load_si128((xmmi*)s + 2); - s78 = _mm_unpacklo_epi64(_mm_srli_si128(s4567,12),s89); - s89 = _mm_shuffle_epi32(s89,_MM_SHUFFLE(3,1,2,0)); - s9 = _mm_shuffle_epi32(s89, _MM_SHUFFLE(3,3,2,2)); - - r0 = _mm_load_si128((xmmi*)r + 0); - r1 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(1,1,1,1)); - r1 = _mm_add_epi64(r1, _mm_and_si128(r1, top64bitmask.v)); - r2 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(2,2,2,2)); - r3 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(3,3,3,3)); - r3 = _mm_add_epi64(r3, _mm_and_si128(r3, top64bitmask.v)); - r0 = _mm_shuffle_epi32(r0, _MM_SHUFFLE(0,0,0,0)); - r4 = _mm_load_si128((xmmi*)r + 1); - r5 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(1,1,1,1)); - r5 = _mm_add_epi64(r5, _mm_and_si128(r5, top64bitmask.v)); - r6 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(2,2,2,2)); - r7 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(3,3,3,3)); - r7 = _mm_add_epi64(r7, _mm_and_si128(r7, top64bitmask.v)); - r4 = _mm_shuffle_epi32(r4, _MM_SHUFFLE(0,0,0,0)); - r8 = _mm_load_si128((xmmi*)r + 2); - r9 = _mm_shuffle_epi32(r8, _MM_SHUFFLE(3,1,3,1)); - r9 = _mm_add_epi64(r9, _mm_and_si128(r9, top64bitmask.v)); - r8 = _mm_shuffle_epi32(r8, _MM_SHUFFLE(3,0,3,0)); - - m01 = _mm_mul_epu32(r1,s01); - m23 = _mm_mul_epu32(r1,s23); - m45 = _mm_mul_epu32(r1,s45); - m67 = _mm_mul_epu32(r1,s67); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r3,s01)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r3,s23)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r3,s45)); - m89 = _mm_mul_epu32(r1,s89); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r5,s01)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r5,s23)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r3,s67)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r7,s01)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r5,s45)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r7,s23)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r9,s01)); - - /* shift up */ - m89 = _mm_unpackhi_epi64(m67,_mm_slli_si128(m89,8)); - m67 = _mm_unpackhi_epi64(m45,_mm_slli_si128(m67,8)); - m45 = _mm_unpackhi_epi64(m23,_mm_slli_si128(m45,8)); - m23 = _mm_unpackhi_epi64(m01,_mm_slli_si128(m23,8)); - m01 = _mm_unpackhi_epi64(_mm_setzero_si128(),_mm_slli_si128(m01,8)); - - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r0,s01)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r0,s23)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r0,s45)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r0,s67)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r2,s01)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r2,s23)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r4,s23)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r0,s89)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r4,s01)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r2,s45)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r2,s67)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r6,s01)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r4,s45)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r6,s23)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r8,s01)); - - r219 = _mm_mul_epu32(r2, packednineteen.v); - r419 = _mm_mul_epu32(r4, packednineteen.v); - r619 = _mm_mul_epu32(r6, packednineteen.v); - r819 = _mm_mul_epu32(r8, packednineteen.v); - r119 = _mm_shuffle_epi32(r1,_MM_SHUFFLE(0,0,2,2)); r119 = _mm_mul_epu32(r119, packednineteen.v); - r319 = _mm_shuffle_epi32(r3,_MM_SHUFFLE(0,0,2,2)); r319 = _mm_mul_epu32(r319, packednineteen.v); - r519 = _mm_shuffle_epi32(r5,_MM_SHUFFLE(0,0,2,2)); r519 = _mm_mul_epu32(r519, packednineteen.v); - r719 = _mm_shuffle_epi32(r7,_MM_SHUFFLE(0,0,2,2)); r719 = _mm_mul_epu32(r719, packednineteen.v); - r919 = _mm_shuffle_epi32(r9,_MM_SHUFFLE(0,0,2,2)); r919 = _mm_mul_epu32(r919, packednineteen.v); - - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r919,s12)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r919,s34)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r919,s56)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r919,s78)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r719,s34)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r719,s56)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r719,s78)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r719,s9)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r519,s56)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r519,s78)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r519,s9)); - m67 = _mm_add_epi64(m67,_mm_mul_epu32(r819,s89)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r319,s78)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r319,s9)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r619,s89)); - m89 = _mm_add_epi64(m89,_mm_mul_epu32(r919,s9)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r819,s23)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r819,s45)); - m45 = _mm_add_epi64(m45,_mm_mul_epu32(r819,s67)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r619,s45)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r619,s67)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r419,s67)); - m23 = _mm_add_epi64(m23,_mm_mul_epu32(r419,s89)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r219,s89)); - m01 = _mm_add_epi64(m01,_mm_mul_epu32(r119,s9)); - - r0 = _mm_unpacklo_epi64(m01, m45); - r1 = _mm_unpackhi_epi64(m01, m45); - r2 = _mm_unpacklo_epi64(m23, m67); - r3 = _mm_unpackhi_epi64(m23, m67); - r4 = _mm_unpacklo_epi64(m89, m89); - r5 = _mm_unpackhi_epi64(m89, m89); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - m0123 = _mm_unpacklo_epi32(r0, r1); - m4567 = _mm_unpackhi_epi32(r0, r1); - m0123 = _mm_unpacklo_epi64(m0123, _mm_unpacklo_epi32(r2, r3)); - m4567 = _mm_unpacklo_epi64(m4567, _mm_unpackhi_epi32(r2, r3)); - m89 = _mm_unpackhi_epi32(r4, r5); - - _mm_store_si128((xmmi*)out + 0, m0123); - _mm_store_si128((xmmi*)out + 1, m4567); - _mm_store_si128((xmmi*)out + 2, m89); -} - -DONNA_NOINLINE static void -curve25519_mul_noinline(bignum25519 out, const bignum25519 r, const bignum25519 s) { - curve25519_mul(out, r, s); -} - -#define curve25519_square(r, n) curve25519_square_times(r, n, 1) -static void -curve25519_square_times(bignum25519 r, const bignum25519 in, int count) { - xmmi m01,m23,m45,m67,m89; - xmmi r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; - xmmi r0a,r1a,r2a,r3a,r7a,r9a; - xmmi r0123,r4567; - xmmi r01,r23,r45,r67,r6x,r89,r8x; - xmmi r12,r34,r56,r78,r9x; - xmmi r5619; - xmmi c1,c2,c3; - - r0123 = _mm_load_si128((xmmi*)in + 0); - r01 = _mm_shuffle_epi32(r0123,_MM_SHUFFLE(3,1,2,0)); - r23 = _mm_shuffle_epi32(r0123,_MM_SHUFFLE(3,3,2,2)); - r4567 = _mm_load_si128((xmmi*)in + 1); - r45 = _mm_shuffle_epi32(r4567,_MM_SHUFFLE(3,1,2,0)); - r67 = _mm_shuffle_epi32(r4567,_MM_SHUFFLE(3,3,2,2)); - r89 = _mm_load_si128((xmmi*)in + 2); - r89 = _mm_shuffle_epi32(r89,_MM_SHUFFLE(3,1,2,0)); - - do { - r12 = _mm_unpackhi_epi64(r01, _mm_slli_si128(r23, 8)); - r0 = _mm_shuffle_epi32(r01, _MM_SHUFFLE(0,0,0,0)); - r0 = _mm_add_epi64(r0, _mm_and_si128(r0, top64bitmask.v)); - r0a = _mm_shuffle_epi32(r0,_MM_SHUFFLE(3,2,1,2)); - r1 = _mm_shuffle_epi32(r01, _MM_SHUFFLE(2,2,2,2)); - r2 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(0,0,0,0)); - r2 = _mm_add_epi64(r2, _mm_and_si128(r2, top64bitmask.v)); - r2a = _mm_shuffle_epi32(r2,_MM_SHUFFLE(3,2,1,2)); - r3 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(2,2,2,2)); - r34 = _mm_unpackhi_epi64(r23, _mm_slli_si128(r45, 8)); - r4 = _mm_shuffle_epi32(r45, _MM_SHUFFLE(0,0,0,0)); - r4 = _mm_add_epi64(r4, _mm_and_si128(r4, top64bitmask.v)); - r56 = _mm_unpackhi_epi64(r45, _mm_slli_si128(r67, 8)); - r5619 = _mm_mul_epu32(r56, packednineteen.v); - r5 = _mm_shuffle_epi32(r5619, _MM_SHUFFLE(1,1,1,0)); - r6 = _mm_shuffle_epi32(r5619, _MM_SHUFFLE(3,2,3,2)); - r78 = _mm_unpackhi_epi64(r67, _mm_slli_si128(r89, 8)); - r6x = _mm_unpacklo_epi64(r67, _mm_setzero_si128()); - r7 = _mm_shuffle_epi32(r67, _MM_SHUFFLE(2,2,2,2)); - r7 = _mm_mul_epu32(r7, packed3819.v); - r7a = _mm_shuffle_epi32(r7, _MM_SHUFFLE(3,3,3,2)); - r8x = _mm_unpacklo_epi64(r89, _mm_setzero_si128()); - r8 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(0,0,0,0)); - r8 = _mm_mul_epu32(r8, packednineteen.v); - r9 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(2,2,2,2)); - r9x = _mm_slli_epi32(_mm_shuffle_epi32(r89, _MM_SHUFFLE(3,3,3,2)), 1); - r9 = _mm_mul_epu32(r9, packed3819.v); - r9a = _mm_shuffle_epi32(r9, _MM_SHUFFLE(2,2,2,2)); - - m01 = _mm_mul_epu32(r01, r0); - m23 = _mm_mul_epu32(r23, r0a); - m45 = _mm_mul_epu32(r45, r0a); - m45 = _mm_add_epi64(m45, _mm_mul_epu32(r23, r2)); - r23 = _mm_slli_epi32(r23, 1); - m67 = _mm_mul_epu32(r67, r0a); - m67 = _mm_add_epi64(m67, _mm_mul_epu32(r45, r2a)); - m89 = _mm_mul_epu32(r89, r0a); - m89 = _mm_add_epi64(m89, _mm_mul_epu32(r67, r2a)); - r67 = _mm_slli_epi32(r67, 1); - m89 = _mm_add_epi64(m89, _mm_mul_epu32(r45, r4)); - r45 = _mm_slli_epi32(r45, 1); - - r1 = _mm_slli_epi32(r1, 1); - r3 = _mm_slli_epi32(r3, 1); - r1a = _mm_add_epi64(r1, _mm_and_si128(r1, bot64bitmask.v)); - r3a = _mm_add_epi64(r3, _mm_and_si128(r3, bot64bitmask.v)); - - m23 = _mm_add_epi64(m23, _mm_mul_epu32(r12, r1)); - m45 = _mm_add_epi64(m45, _mm_mul_epu32(r34, r1a)); - m67 = _mm_add_epi64(m67, _mm_mul_epu32(r56, r1a)); - m67 = _mm_add_epi64(m67, _mm_mul_epu32(r34, r3)); - r34 = _mm_slli_epi32(r34, 1); - m89 = _mm_add_epi64(m89, _mm_mul_epu32(r78, r1a)); - r78 = _mm_slli_epi32(r78, 1); - m89 = _mm_add_epi64(m89, _mm_mul_epu32(r56, r3a)); - r56 = _mm_slli_epi32(r56, 1); - - m01 = _mm_add_epi64(m01, _mm_mul_epu32(_mm_slli_epi32(r12, 1), r9)); - m01 = _mm_add_epi64(m01, _mm_mul_epu32(r34, r7)); - m23 = _mm_add_epi64(m23, _mm_mul_epu32(r34, r9)); - m01 = _mm_add_epi64(m01, _mm_mul_epu32(r56, r5)); - m23 = _mm_add_epi64(m23, _mm_mul_epu32(r56, r7)); - m45 = _mm_add_epi64(m45, _mm_mul_epu32(r56, r9)); - m01 = _mm_add_epi64(m01, _mm_mul_epu32(r23, r8)); - m01 = _mm_add_epi64(m01, _mm_mul_epu32(r45, r6)); - m23 = _mm_add_epi64(m23, _mm_mul_epu32(r45, r8)); - m23 = _mm_add_epi64(m23, _mm_mul_epu32(r6x, r6)); - m45 = _mm_add_epi64(m45, _mm_mul_epu32(r78, r7a)); - m67 = _mm_add_epi64(m67, _mm_mul_epu32(r78, r9)); - m45 = _mm_add_epi64(m45, _mm_mul_epu32(r67, r8)); - m67 = _mm_add_epi64(m67, _mm_mul_epu32(r8x, r8)); - m89 = _mm_add_epi64(m89, _mm_mul_epu32(r9x, r9a)); - - r0 = _mm_unpacklo_epi64(m01, m45); - r1 = _mm_unpackhi_epi64(m01, m45); - r2 = _mm_unpacklo_epi64(m23, m67); - r3 = _mm_unpackhi_epi64(m23, m67); - r4 = _mm_unpacklo_epi64(m89, m89); - r5 = _mm_unpackhi_epi64(m89, m89); - - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - c1 = _mm_srli_epi64(r1, 25); c2 = _mm_srli_epi64(r3, 25); r1 = _mm_and_si128(r1, packedmask25.v); r3 = _mm_and_si128(r3, packedmask25.v); r2 = _mm_add_epi64(r2, c1); r4 = _mm_add_epi64(r4, c2); c3 = _mm_slli_si128(c2, 8); - c1 = _mm_srli_epi64(r4, 26); r4 = _mm_and_si128(r4, packedmask26.v); r5 = _mm_add_epi64(r5, c1); - c1 = _mm_srli_epi64(r5, 25); r5 = _mm_and_si128(r5, packedmask25.v); r0 = _mm_add_epi64(r0, _mm_unpackhi_epi64(_mm_mul_epu32(c1, packednineteen.v), c3)); - c1 = _mm_srli_epi64(r0, 26); c2 = _mm_srli_epi64(r2, 26); r0 = _mm_and_si128(r0, packedmask26.v); r2 = _mm_and_si128(r2, packedmask26.v); r1 = _mm_add_epi64(r1, c1); r3 = _mm_add_epi64(r3, c2); - - r01 = _mm_unpacklo_epi64(r0, r1); - r45 = _mm_unpackhi_epi64(r0, r1); - r23 = _mm_unpacklo_epi64(r2, r3); - r67 = _mm_unpackhi_epi64(r2, r3); - r89 = _mm_unpackhi_epi64(r4, r5); - } while (--count); - - r0123 = _mm_shuffle_epi32(r23, _MM_SHUFFLE(2,0,3,3)); - r4567 = _mm_shuffle_epi32(r67, _MM_SHUFFLE(2,0,3,3)); - r0123 = _mm_or_si128(r0123, _mm_shuffle_epi32(r01, _MM_SHUFFLE(3,3,2,0))); - r4567 = _mm_or_si128(r4567, _mm_shuffle_epi32(r45, _MM_SHUFFLE(3,3,2,0))); - r89 = _mm_shuffle_epi32(r89, _MM_SHUFFLE(3,3,2,0)); - - _mm_store_si128((xmmi*)r + 0, r0123); - _mm_store_si128((xmmi*)r + 1, r4567); - _mm_store_si128((xmmi*)r + 2, r89); -} - -DONNA_INLINE static void -curve25519_tangle32(packedelem32 *out, const bignum25519 x, const bignum25519 z) { - xmmi x0,x1,x2,z0,z1,z2; - - x0 = _mm_load_si128((xmmi *)(x + 0)); - x1 = _mm_load_si128((xmmi *)(x + 4)); - x2 = _mm_load_si128((xmmi *)(x + 8)); - z0 = _mm_load_si128((xmmi *)(z + 0)); - z1 = _mm_load_si128((xmmi *)(z + 4)); - z2 = _mm_load_si128((xmmi *)(z + 8)); - - out[0].v = _mm_unpacklo_epi32(x0, z0); - out[1].v = _mm_unpackhi_epi32(x0, z0); - out[2].v = _mm_unpacklo_epi32(x1, z1); - out[3].v = _mm_unpackhi_epi32(x1, z1); - out[4].v = _mm_unpacklo_epi32(x2, z2); -} - -DONNA_INLINE static void -curve25519_untangle32(bignum25519 x, bignum25519 z, const packedelem32 *in) { - xmmi t0,t1,t2,t3,t4,zero; - - t0 = _mm_shuffle_epi32(in[0].v, _MM_SHUFFLE(3,1,2,0)); - t1 = _mm_shuffle_epi32(in[1].v, _MM_SHUFFLE(3,1,2,0)); - t2 = _mm_shuffle_epi32(in[2].v, _MM_SHUFFLE(3,1,2,0)); - t3 = _mm_shuffle_epi32(in[3].v, _MM_SHUFFLE(3,1,2,0)); - t4 = _mm_shuffle_epi32(in[4].v, _MM_SHUFFLE(3,1,2,0)); - zero = _mm_setzero_si128(); - _mm_store_si128((xmmi *)x + 0, _mm_unpacklo_epi64(t0, t1)); - _mm_store_si128((xmmi *)x + 1, _mm_unpacklo_epi64(t2, t3)); - _mm_store_si128((xmmi *)x + 2, _mm_unpacklo_epi64(t4, zero)); - _mm_store_si128((xmmi *)z + 0, _mm_unpackhi_epi64(t0, t1)); - _mm_store_si128((xmmi *)z + 1, _mm_unpackhi_epi64(t2, t3)); - _mm_store_si128((xmmi *)z + 2, _mm_unpackhi_epi64(t4, zero)); -} - -DONNA_INLINE static void -curve25519_add_reduce_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { - xmmi r0,r1,r2,r3,r4; - xmmi s0,s1,s2,s3,s4,s5; - xmmi c1,c2; - - r0 = _mm_add_epi32(r[0].v, s[0].v); - r1 = _mm_add_epi32(r[1].v, s[1].v); - r2 = _mm_add_epi32(r[2].v, s[2].v); - r3 = _mm_add_epi32(r[3].v, s[3].v); - r4 = _mm_add_epi32(r[4].v, s[4].v); - - s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ - s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ - s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ - s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ - s4 = _mm_unpacklo_epi64(_mm_setzero_si128(), r4); /* 00 88 */ - s5 = _mm_unpackhi_epi64(_mm_setzero_si128(), r4); /* 00 99 */ - - c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); - c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); s4 = _mm_add_epi32(s4, _mm_unpackhi_epi64(_mm_setzero_si128(), c2)); s0 = _mm_add_epi32(s0, _mm_unpacklo_epi64(_mm_setzero_si128(), c2)); - c1 = _mm_srli_epi32(s2, 26); c2 = _mm_srli_epi32(s4, 26); s2 = _mm_and_si128(s2, packedmask26262626.v); s4 = _mm_and_si128(s4, packedmask26262626.v); s3 = _mm_add_epi32(s3, c1); s5 = _mm_add_epi32(s5, c2); - c1 = _mm_srli_epi32(s3, 25); c2 = _mm_srli_epi32(s5, 25); s3 = _mm_and_si128(s3, packedmask25252525.v); s5 = _mm_and_si128(s5, packedmask25252525.v); s4 = _mm_add_epi32(s4, c1); s0 = _mm_add_epi32(s0, _mm_or_si128(_mm_slli_si128(c1, 8), _mm_srli_si128(_mm_add_epi32(_mm_add_epi32(_mm_slli_epi32(c2, 4), _mm_slli_epi32(c2, 1)), c2), 8))); - c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); - - out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ - out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ - out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ - out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ - out[4].v = _mm_unpackhi_epi64(s4, s5); /* 88 99 */ -} - -DONNA_INLINE static void -curve25519_add_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { - out[0].v = _mm_add_epi32(r[0].v, s[0].v); - out[1].v = _mm_add_epi32(r[1].v, s[1].v); - out[2].v = _mm_add_epi32(r[2].v, s[2].v); - out[3].v = _mm_add_epi32(r[3].v, s[3].v); - out[4].v = _mm_add_epi32(r[4].v, s[4].v); -} - -DONNA_INLINE static void -curve25519_sub_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { - xmmi r0,r1,r2,r3,r4; - xmmi s0,s1,s2,s3; - xmmi c1,c2; - - r0 = _mm_add_epi32(r[0].v, packed32packed2p0.v); - r1 = _mm_add_epi32(r[1].v, packed32packed2p1.v); - r2 = _mm_add_epi32(r[2].v, packed32packed2p1.v); - r3 = _mm_add_epi32(r[3].v, packed32packed2p1.v); - r4 = _mm_add_epi32(r[4].v, packed32packed2p1.v); - r0 = _mm_sub_epi32(r0, s[0].v); /* 00 11 */ - r1 = _mm_sub_epi32(r1, s[1].v); /* 22 33 */ - r2 = _mm_sub_epi32(r2, s[2].v); /* 44 55 */ - r3 = _mm_sub_epi32(r3, s[3].v); /* 66 77 */ - r4 = _mm_sub_epi32(r4, s[4].v); /* 88 99 */ - - s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ - s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ - s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ - s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ - - c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); - c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); r4 = _mm_add_epi32(r4, _mm_srli_si128(c2, 8)); s0 = _mm_add_epi32(s0, _mm_slli_si128(c2, 8)); - - out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ - out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ - out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ - out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ - out[4].v = r4; -} - -DONNA_INLINE static void -curve25519_sub_after_basic_packed32(packedelem32 *out, const packedelem32 *r, const packedelem32 *s) { - xmmi r0,r1,r2,r3,r4; - xmmi s0,s1,s2,s3,s4,s5; - xmmi c1,c2; - - r0 = _mm_add_epi32(r[0].v, packed32packed4p0.v); - r1 = _mm_add_epi32(r[1].v, packed32packed4p1.v); - r2 = _mm_add_epi32(r[2].v, packed32packed4p1.v); - r3 = _mm_add_epi32(r[3].v, packed32packed4p1.v); - r4 = _mm_add_epi32(r[4].v, packed32packed4p1.v); - r0 = _mm_sub_epi32(r0, s[0].v); /* 00 11 */ - r1 = _mm_sub_epi32(r1, s[1].v); /* 22 33 */ - r2 = _mm_sub_epi32(r2, s[2].v); /* 44 55 */ - r3 = _mm_sub_epi32(r3, s[3].v); /* 66 77 */ - r4 = _mm_sub_epi32(r4, s[4].v); /* 88 99 */ - - s0 = _mm_unpacklo_epi64(r0, r2); /* 00 44 */ - s1 = _mm_unpackhi_epi64(r0, r2); /* 11 55 */ - s2 = _mm_unpacklo_epi64(r1, r3); /* 22 66 */ - s3 = _mm_unpackhi_epi64(r1, r3); /* 33 77 */ - s4 = _mm_unpacklo_epi64(_mm_setzero_si128(), r4); /* 00 88 */ - s5 = _mm_unpackhi_epi64(_mm_setzero_si128(), r4); /* 00 99 */ - - c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); - c1 = _mm_srli_epi32(s1, 25); c2 = _mm_srli_epi32(s3, 25); s1 = _mm_and_si128(s1, packedmask25252525.v); s3 = _mm_and_si128(s3, packedmask25252525.v); s2 = _mm_add_epi32(s2, c1); s4 = _mm_add_epi32(s4, _mm_unpackhi_epi64(_mm_setzero_si128(), c2)); s0 = _mm_add_epi32(s0, _mm_unpacklo_epi64(_mm_setzero_si128(), c2)); - c1 = _mm_srli_epi32(s2, 26); c2 = _mm_srli_epi32(s4, 26); s2 = _mm_and_si128(s2, packedmask26262626.v); s4 = _mm_and_si128(s4, packedmask26262626.v); s3 = _mm_add_epi32(s3, c1); s5 = _mm_add_epi32(s5, c2); - c1 = _mm_srli_epi32(s3, 25); c2 = _mm_srli_epi32(s5, 25); s3 = _mm_and_si128(s3, packedmask25252525.v); s5 = _mm_and_si128(s5, packedmask25252525.v); s4 = _mm_add_epi32(s4, c1); s0 = _mm_add_epi32(s0, _mm_or_si128(_mm_slli_si128(c1, 8), _mm_srli_si128(_mm_add_epi32(_mm_add_epi32(_mm_slli_epi32(c2, 4), _mm_slli_epi32(c2, 1)), c2), 8))); - c1 = _mm_srli_epi32(s0, 26); c2 = _mm_srli_epi32(s2, 26); s0 = _mm_and_si128(s0, packedmask26262626.v); s2 = _mm_and_si128(s2, packedmask26262626.v); s1 = _mm_add_epi32(s1, c1); s3 = _mm_add_epi32(s3, c2); - - out[0].v = _mm_unpacklo_epi64(s0, s1); /* 00 11 */ - out[1].v = _mm_unpacklo_epi64(s2, s3); /* 22 33 */ - out[2].v = _mm_unpackhi_epi64(s0, s1); /* 44 55 */ - out[3].v = _mm_unpackhi_epi64(s2, s3); /* 66 77 */ - out[4].v = _mm_unpackhi_epi64(s4, s5); /* 88 99 */ -} - -DONNA_INLINE static void -curve25519_tangle64_from32(packedelem64 *a, packedelem64 *b, const packedelem32 *c, const packedelem32 *d) { - xmmi c0,c1,c2,c3,c4,c5,t; - xmmi d0,d1,d2,d3,d4,d5; - xmmi t0,t1,t2,t3,t4,zero; - - t0 = _mm_shuffle_epi32(c[0].v, _MM_SHUFFLE(3,1,2,0)); - t1 = _mm_shuffle_epi32(c[1].v, _MM_SHUFFLE(3,1,2,0)); - t2 = _mm_shuffle_epi32(d[0].v, _MM_SHUFFLE(3,1,2,0)); - t3 = _mm_shuffle_epi32(d[1].v, _MM_SHUFFLE(3,1,2,0)); - c0 = _mm_unpacklo_epi64(t0, t1); - c3 = _mm_unpackhi_epi64(t0, t1); - d0 = _mm_unpacklo_epi64(t2, t3); - d3 = _mm_unpackhi_epi64(t2, t3); - t = _mm_unpacklo_epi64(c0, d0); a[0].v = t; a[1].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(c0, d0); a[2].v = t; a[3].v = _mm_srli_epi64(t, 32); - t = _mm_unpacklo_epi64(c3, d3); b[0].v = t; b[1].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(c3, d3); b[2].v = t; b[3].v = _mm_srli_epi64(t, 32); - - t0 = _mm_shuffle_epi32(c[2].v, _MM_SHUFFLE(3,1,2,0)); - t1 = _mm_shuffle_epi32(c[3].v, _MM_SHUFFLE(3,1,2,0)); - t2 = _mm_shuffle_epi32(d[2].v, _MM_SHUFFLE(3,1,2,0)); - t3 = _mm_shuffle_epi32(d[3].v, _MM_SHUFFLE(3,1,2,0)); - c1 = _mm_unpacklo_epi64(t0, t1); - c4 = _mm_unpackhi_epi64(t0, t1); - d1 = _mm_unpacklo_epi64(t2, t3); - d4 = _mm_unpackhi_epi64(t2, t3); - t = _mm_unpacklo_epi64(c1, d1); a[4].v = t; a[5].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(c1, d1); a[6].v = t; a[7].v = _mm_srli_epi64(t, 32); - t = _mm_unpacklo_epi64(c4, d4); b[4].v = t; b[5].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(c4, d4); b[6].v = t; b[7].v = _mm_srli_epi64(t, 32); - - t4 = _mm_shuffle_epi32(c[4].v, _MM_SHUFFLE(3,1,2,0)); - zero = _mm_setzero_si128(); - c2 = _mm_unpacklo_epi64(t4, zero); - c5 = _mm_unpackhi_epi64(t4, zero); - t4 = _mm_shuffle_epi32(d[4].v, _MM_SHUFFLE(3,1,2,0)); - d2 = _mm_unpacklo_epi64(t4, zero); - d5 = _mm_unpackhi_epi64(t4, zero); - t = _mm_unpacklo_epi64(c2, d2); a[8].v = t; a[9].v = _mm_srli_epi64(t, 32); - t = _mm_unpacklo_epi64(c5, d5); b[8].v = t; b[9].v = _mm_srli_epi64(t, 32); -} - -DONNA_INLINE static void -curve25519_tangle64(packedelem64 *out, const bignum25519 x, const bignum25519 z) { - xmmi x0,x1,x2,z0,z1,z2,t; - - x0 = _mm_load_si128((xmmi *)x + 0); - x1 = _mm_load_si128((xmmi *)x + 1); - x2 = _mm_load_si128((xmmi *)x + 2); - z0 = _mm_load_si128((xmmi *)z + 0); - z1 = _mm_load_si128((xmmi *)z + 1); - z2 = _mm_load_si128((xmmi *)z + 2); - - t = _mm_unpacklo_epi64(x0, z0); out[0].v = t; out[1].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(x0, z0); out[2].v = t; out[3].v = _mm_srli_epi64(t, 32); - t = _mm_unpacklo_epi64(x1, z1); out[4].v = t; out[5].v = _mm_srli_epi64(t, 32); - t = _mm_unpackhi_epi64(x1, z1); out[6].v = t; out[7].v = _mm_srli_epi64(t, 32); - t = _mm_unpacklo_epi64(x2, z2); out[8].v = t; out[9].v = _mm_srli_epi64(t, 32); -} - -DONNA_INLINE static void -curve25519_tangleone64(packedelem64 *out, const bignum25519 x) { - xmmi x0,x1,x2; - - x0 = _mm_load_si128((xmmi *)(x + 0)); - x1 = _mm_load_si128((xmmi *)(x + 4)); - x2 = _mm_load_si128((xmmi *)(x + 8)); - - out[0].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(0,0,0,0)); - out[1].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(1,1,1,1)); - out[2].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(2,2,2,2)); - out[3].v = _mm_shuffle_epi32(x0, _MM_SHUFFLE(3,3,3,3)); - out[4].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(0,0,0,0)); - out[5].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(1,1,1,1)); - out[6].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(2,2,2,2)); - out[7].v = _mm_shuffle_epi32(x1, _MM_SHUFFLE(3,3,3,3)); - out[8].v = _mm_shuffle_epi32(x2, _MM_SHUFFLE(0,0,0,0)); - out[9].v = _mm_shuffle_epi32(x2, _MM_SHUFFLE(1,1,1,1)); -} - -DONNA_INLINE static void -curve25519_swap64(packedelem64 *out) { - out[0].v = _mm_shuffle_epi32(out[0].v, _MM_SHUFFLE(1,0,3,2)); - out[1].v = _mm_shuffle_epi32(out[1].v, _MM_SHUFFLE(1,0,3,2)); - out[2].v = _mm_shuffle_epi32(out[2].v, _MM_SHUFFLE(1,0,3,2)); - out[3].v = _mm_shuffle_epi32(out[3].v, _MM_SHUFFLE(1,0,3,2)); - out[4].v = _mm_shuffle_epi32(out[4].v, _MM_SHUFFLE(1,0,3,2)); - out[5].v = _mm_shuffle_epi32(out[5].v, _MM_SHUFFLE(1,0,3,2)); - out[6].v = _mm_shuffle_epi32(out[6].v, _MM_SHUFFLE(1,0,3,2)); - out[7].v = _mm_shuffle_epi32(out[7].v, _MM_SHUFFLE(1,0,3,2)); - out[8].v = _mm_shuffle_epi32(out[8].v, _MM_SHUFFLE(1,0,3,2)); - out[9].v = _mm_shuffle_epi32(out[9].v, _MM_SHUFFLE(1,0,3,2)); -} - -DONNA_INLINE static void -curve25519_untangle64(bignum25519 x, bignum25519 z, const packedelem64 *in) { - _mm_store_si128((xmmi *)(x + 0), _mm_unpacklo_epi64(_mm_unpacklo_epi32(in[0].v, in[1].v), _mm_unpacklo_epi32(in[2].v, in[3].v))); - _mm_store_si128((xmmi *)(x + 4), _mm_unpacklo_epi64(_mm_unpacklo_epi32(in[4].v, in[5].v), _mm_unpacklo_epi32(in[6].v, in[7].v))); - _mm_store_si128((xmmi *)(x + 8), _mm_unpacklo_epi32(in[8].v, in[9].v) ); - _mm_store_si128((xmmi *)(z + 0), _mm_unpacklo_epi64(_mm_unpackhi_epi32(in[0].v, in[1].v), _mm_unpackhi_epi32(in[2].v, in[3].v))); - _mm_store_si128((xmmi *)(z + 4), _mm_unpacklo_epi64(_mm_unpackhi_epi32(in[4].v, in[5].v), _mm_unpackhi_epi32(in[6].v, in[7].v))); - _mm_store_si128((xmmi *)(z + 8), _mm_unpackhi_epi32(in[8].v, in[9].v) ); -} - -DONNA_INLINE static void -curve25519_mul_packed64(packedelem64 *out, const packedelem64 *r, const packedelem64 *s) { - xmmi r1,r2,r3,r4,r5,r6,r7,r8,r9; - xmmi r1_2,r3_2,r5_2,r7_2,r9_2; - xmmi c1,c2; - - out[0].v = _mm_mul_epu32(r[0].v, s[0].v); - out[1].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[1].v), _mm_mul_epu32(r[1].v, s[0].v)); - r1_2 = _mm_slli_epi32(r[1].v, 1); - out[2].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[1].v), _mm_mul_epu32(r[2].v, s[0].v))); - out[3].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[1].v), _mm_mul_epu32(r[3].v, s[0].v)))); - r3_2 = _mm_slli_epi32(r[3].v, 1); - out[4].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[1].v), _mm_mul_epu32(r[4].v, s[0].v))))); - out[5].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[1].v), _mm_mul_epu32(r[5].v, s[0].v)))))); - r5_2 = _mm_slli_epi32(r[5].v, 1); - out[6].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[5].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r5_2 , s[1].v), _mm_mul_epu32(r[6].v, s[0].v))))))); - out[7].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[7].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[5].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[1].v), _mm_mul_epu32(r[7].v , s[0].v)))))))); - r7_2 = _mm_slli_epi32(r[7].v, 1); - out[8].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[8].v), _mm_add_epi64(_mm_mul_epu32(r1_2 , s[7].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r3_2 , s[5].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r5_2 , s[3].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r7_2 , s[1].v), _mm_mul_epu32(r[8].v, s[0].v))))))))); - out[9].v = _mm_add_epi64(_mm_mul_epu32(r[0].v, s[9].v), _mm_add_epi64(_mm_mul_epu32(r[1].v, s[8].v), _mm_add_epi64(_mm_mul_epu32(r[2].v, s[7].v), _mm_add_epi64(_mm_mul_epu32(r[3].v, s[6].v), _mm_add_epi64(_mm_mul_epu32(r[4].v, s[5].v), _mm_add_epi64(_mm_mul_epu32(r[5].v, s[4].v), _mm_add_epi64(_mm_mul_epu32(r[6].v, s[3].v), _mm_add_epi64(_mm_mul_epu32(r[7].v, s[2].v), _mm_add_epi64(_mm_mul_epu32(r[8].v, s[1].v), _mm_mul_epu32(r[9].v, s[0].v)))))))))); - - r1 = _mm_mul_epu32(r[1].v, packednineteen.v); - r2 = _mm_mul_epu32(r[2].v, packednineteen.v); - r1_2 = _mm_slli_epi32(r1, 1); - r3 = _mm_mul_epu32(r[3].v, packednineteen.v); - r4 = _mm_mul_epu32(r[4].v, packednineteen.v); - r3_2 = _mm_slli_epi32(r3, 1); - r5 = _mm_mul_epu32(r[5].v, packednineteen.v); - r6 = _mm_mul_epu32(r[6].v, packednineteen.v); - r5_2 = _mm_slli_epi32(r5, 1); - r7 = _mm_mul_epu32(r[7].v, packednineteen.v); - r8 = _mm_mul_epu32(r[8].v, packednineteen.v); - r7_2 = _mm_slli_epi32(r7, 1); - r9 = _mm_mul_epu32(r[9].v, packednineteen.v); - r9_2 = _mm_slli_epi32(r9, 1); - - out[0].v = _mm_add_epi64(out[0].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[1].v), _mm_add_epi64(_mm_mul_epu32(r8, s[2].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[3].v), _mm_add_epi64(_mm_mul_epu32(r6, s[4].v), _mm_add_epi64(_mm_mul_epu32(r5_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r4, s[6].v), _mm_add_epi64(_mm_mul_epu32(r3_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r2, s[8].v), _mm_mul_epu32(r1_2, s[9].v)))))))))); - out[1].v = _mm_add_epi64(out[1].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[2].v), _mm_add_epi64(_mm_mul_epu32(r8, s[3].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[4].v), _mm_add_epi64(_mm_mul_epu32(r6, s[5].v), _mm_add_epi64(_mm_mul_epu32(r5 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r4, s[7].v), _mm_add_epi64(_mm_mul_epu32(r3 , s[8].v), _mm_mul_epu32(r2, s[9].v))))))))); - out[2].v = _mm_add_epi64(out[2].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[3].v), _mm_add_epi64(_mm_mul_epu32(r8, s[4].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r6, s[6].v), _mm_add_epi64(_mm_mul_epu32(r5_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r4, s[8].v), _mm_mul_epu32(r3_2, s[9].v)))))))); - out[3].v = _mm_add_epi64(out[3].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[4].v), _mm_add_epi64(_mm_mul_epu32(r8, s[5].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r6, s[7].v), _mm_add_epi64(_mm_mul_epu32(r5 , s[8].v), _mm_mul_epu32(r4, s[9].v))))))); - out[4].v = _mm_add_epi64(out[4].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[5].v), _mm_add_epi64(_mm_mul_epu32(r8, s[6].v), _mm_add_epi64(_mm_mul_epu32(r7_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r6, s[8].v), _mm_mul_epu32(r5_2, s[9].v)))))); - out[5].v = _mm_add_epi64(out[5].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[6].v), _mm_add_epi64(_mm_mul_epu32(r8, s[7].v), _mm_add_epi64(_mm_mul_epu32(r7 , s[8].v), _mm_mul_epu32(r6, s[9].v))))); - out[6].v = _mm_add_epi64(out[6].v, _mm_add_epi64(_mm_mul_epu32(r9_2, s[7].v), _mm_add_epi64(_mm_mul_epu32(r8, s[8].v), _mm_mul_epu32(r7_2, s[9].v)))); - out[7].v = _mm_add_epi64(out[7].v, _mm_add_epi64(_mm_mul_epu32(r9 , s[8].v), _mm_mul_epu32(r8, s[9].v))); - out[8].v = _mm_add_epi64(out[8].v, _mm_mul_epu32(r9_2, s[9].v)); - - c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); - c1 = _mm_srli_epi64(out[1].v, 25); c2 = _mm_srli_epi64(out[5].v, 25); out[1].v = _mm_and_si128(out[1].v, packedmask25.v); out[5].v = _mm_and_si128(out[5].v, packedmask25.v); out[2].v = _mm_add_epi64(out[2].v, c1); out[6].v = _mm_add_epi64(out[6].v, c2); - c1 = _mm_srli_epi64(out[2].v, 26); c2 = _mm_srli_epi64(out[6].v, 26); out[2].v = _mm_and_si128(out[2].v, packedmask26.v); out[6].v = _mm_and_si128(out[6].v, packedmask26.v); out[3].v = _mm_add_epi64(out[3].v, c1); out[7].v = _mm_add_epi64(out[7].v, c2); - c1 = _mm_srli_epi64(out[3].v, 25); c2 = _mm_srli_epi64(out[7].v, 25); out[3].v = _mm_and_si128(out[3].v, packedmask25.v); out[7].v = _mm_and_si128(out[7].v, packedmask25.v); out[4].v = _mm_add_epi64(out[4].v, c1); out[8].v = _mm_add_epi64(out[8].v, c2); - c2 = _mm_srli_epi64(out[8].v, 26); out[8].v = _mm_and_si128(out[8].v, packedmask26.v); out[9].v = _mm_add_epi64(out[9].v, c2); - c2 = _mm_srli_epi64(out[9].v, 25); out[9].v = _mm_and_si128(out[9].v, packedmask25.v); out[0].v = _mm_add_epi64(out[0].v, _mm_mul_epu32(c2, packednineteen.v)); - c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); -} - -DONNA_INLINE static void -curve25519_square_packed64(packedelem64 *out, const packedelem64 *r) { - xmmi r0,r1,r2,r3; - xmmi r1_2,r3_2,r4_2,r5_2,r6_2,r7_2; - xmmi d5,d6,d7,d8,d9; - xmmi c1,c2; - - r0 = r[0].v; - r1 = r[1].v; - r2 = r[2].v; - r3 = r[3].v; - - out[0].v = _mm_mul_epu32(r0, r0); - r0 = _mm_slli_epi32(r0, 1); - out[1].v = _mm_mul_epu32(r0, r1); - r1_2 = _mm_slli_epi32(r1, 1); - out[2].v = _mm_add_epi64(_mm_mul_epu32(r0, r2 ), _mm_mul_epu32(r1, r1_2)); - r1 = r1_2; - out[3].v = _mm_add_epi64(_mm_mul_epu32(r0, r3 ), _mm_mul_epu32(r1, r2 )); - r3_2 = _mm_slli_epi32(r3, 1); - out[4].v = _mm_add_epi64(_mm_mul_epu32(r0, r[4].v), _mm_add_epi64(_mm_mul_epu32(r1, r3_2 ), _mm_mul_epu32(r2, r2))); - r2 = _mm_slli_epi32(r2, 1); - out[5].v = _mm_add_epi64(_mm_mul_epu32(r0, r[5].v), _mm_add_epi64(_mm_mul_epu32(r1, r[4].v), _mm_mul_epu32(r2, r3))); - r5_2 = _mm_slli_epi32(r[5].v, 1); - out[6].v = _mm_add_epi64(_mm_mul_epu32(r0, r[6].v), _mm_add_epi64(_mm_mul_epu32(r1, r5_2 ), _mm_add_epi64(_mm_mul_epu32(r2, r[4].v), _mm_mul_epu32(r3, r3_2 )))); - r3 = r3_2; - out[7].v = _mm_add_epi64(_mm_mul_epu32(r0, r[7].v), _mm_add_epi64(_mm_mul_epu32(r1, r[6].v), _mm_add_epi64(_mm_mul_epu32(r2, r[5].v), _mm_mul_epu32(r3, r[4].v)))); - r7_2 = _mm_slli_epi32(r[7].v, 1); - out[8].v = _mm_add_epi64(_mm_mul_epu32(r0, r[8].v), _mm_add_epi64(_mm_mul_epu32(r1, r7_2 ), _mm_add_epi64(_mm_mul_epu32(r2, r[6].v), _mm_add_epi64(_mm_mul_epu32(r3, r5_2 ), _mm_mul_epu32(r[4].v, r[4].v))))); - out[9].v = _mm_add_epi64(_mm_mul_epu32(r0, r[9].v), _mm_add_epi64(_mm_mul_epu32(r1, r[8].v), _mm_add_epi64(_mm_mul_epu32(r2, r[7].v), _mm_add_epi64(_mm_mul_epu32(r3, r[6].v), _mm_mul_epu32(r[4].v, r5_2 ))))); - - d5 = _mm_mul_epu32(r[5].v, packedthirtyeight.v); - d6 = _mm_mul_epu32(r[6].v, packednineteen.v); - d7 = _mm_mul_epu32(r[7].v, packedthirtyeight.v); - d8 = _mm_mul_epu32(r[8].v, packednineteen.v); - d9 = _mm_mul_epu32(r[9].v, packedthirtyeight.v); - - r4_2 = _mm_slli_epi32(r[4].v, 1); - r6_2 = _mm_slli_epi32(r[6].v, 1); - out[0].v = _mm_add_epi64(out[0].v, _mm_add_epi64(_mm_mul_epu32(d9, r1 ), _mm_add_epi64(_mm_mul_epu32(d8, r2 ), _mm_add_epi64(_mm_mul_epu32(d7, r3 ), _mm_add_epi64(_mm_mul_epu32(d6, r4_2), _mm_mul_epu32(d5, r[5].v)))))); - out[1].v = _mm_add_epi64(out[1].v, _mm_add_epi64(_mm_mul_epu32(d9, _mm_srli_epi32(r2, 1)), _mm_add_epi64(_mm_mul_epu32(d8, r3 ), _mm_add_epi64(_mm_mul_epu32(d7, r[4].v), _mm_mul_epu32(d6, r5_2 ))))); - out[2].v = _mm_add_epi64(out[2].v, _mm_add_epi64(_mm_mul_epu32(d9, r3 ), _mm_add_epi64(_mm_mul_epu32(d8, r4_2), _mm_add_epi64(_mm_mul_epu32(d7, r5_2 ), _mm_mul_epu32(d6, r[6].v))))); - out[3].v = _mm_add_epi64(out[3].v, _mm_add_epi64(_mm_mul_epu32(d9, r[4].v ), _mm_add_epi64(_mm_mul_epu32(d8, r5_2), _mm_mul_epu32(d7, r[6].v)))); - out[4].v = _mm_add_epi64(out[4].v, _mm_add_epi64(_mm_mul_epu32(d9, r5_2 ), _mm_add_epi64(_mm_mul_epu32(d8, r6_2), _mm_mul_epu32(d7, r[7].v)))); - out[5].v = _mm_add_epi64(out[5].v, _mm_add_epi64(_mm_mul_epu32(d9, r[6].v ), _mm_mul_epu32(d8, r7_2 ))); - out[6].v = _mm_add_epi64(out[6].v, _mm_add_epi64(_mm_mul_epu32(d9, r7_2 ), _mm_mul_epu32(d8, r[8].v))); - out[7].v = _mm_add_epi64(out[7].v, _mm_mul_epu32(d9, r[8].v)); - out[8].v = _mm_add_epi64(out[8].v, _mm_mul_epu32(d9, r[9].v)); - - c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); - c1 = _mm_srli_epi64(out[1].v, 25); c2 = _mm_srli_epi64(out[5].v, 25); out[1].v = _mm_and_si128(out[1].v, packedmask25.v); out[5].v = _mm_and_si128(out[5].v, packedmask25.v); out[2].v = _mm_add_epi64(out[2].v, c1); out[6].v = _mm_add_epi64(out[6].v, c2); - c1 = _mm_srli_epi64(out[2].v, 26); c2 = _mm_srli_epi64(out[6].v, 26); out[2].v = _mm_and_si128(out[2].v, packedmask26.v); out[6].v = _mm_and_si128(out[6].v, packedmask26.v); out[3].v = _mm_add_epi64(out[3].v, c1); out[7].v = _mm_add_epi64(out[7].v, c2); - c1 = _mm_srli_epi64(out[3].v, 25); c2 = _mm_srli_epi64(out[7].v, 25); out[3].v = _mm_and_si128(out[3].v, packedmask25.v); out[7].v = _mm_and_si128(out[7].v, packedmask25.v); out[4].v = _mm_add_epi64(out[4].v, c1); out[8].v = _mm_add_epi64(out[8].v, c2); - c2 = _mm_srli_epi64(out[8].v, 26); out[8].v = _mm_and_si128(out[8].v, packedmask26.v); out[9].v = _mm_add_epi64(out[9].v, c2); - c2 = _mm_srli_epi64(out[9].v, 25); out[9].v = _mm_and_si128(out[9].v, packedmask25.v); out[0].v = _mm_add_epi64(out[0].v, _mm_mul_epu32(c2, packednineteen.v)); - c1 = _mm_srli_epi64(out[0].v, 26); c2 = _mm_srli_epi64(out[4].v, 26); out[0].v = _mm_and_si128(out[0].v, packedmask26.v); out[4].v = _mm_and_si128(out[4].v, packedmask26.v); out[1].v = _mm_add_epi64(out[1].v, c1); out[5].v = _mm_add_epi64(out[5].v, c2); -} - - -/* Take a little-endian, 32-byte number and expand it into polynomial form */ -static void -curve25519_expand(bignum25519 out, const unsigned char in[32]) { - uint32_t x0,x1,x2,x3,x4,x5,x6,x7; - - x0 = *(uint32_t *)(in + 0); - x1 = *(uint32_t *)(in + 4); - x2 = *(uint32_t *)(in + 8); - x3 = *(uint32_t *)(in + 12); - x4 = *(uint32_t *)(in + 16); - x5 = *(uint32_t *)(in + 20); - x6 = *(uint32_t *)(in + 24); - x7 = *(uint32_t *)(in + 28); - - out[0] = ( x0 ) & 0x3ffffff; - out[1] = ((((uint64_t)x1 << 32) | x0) >> 26) & 0x1ffffff; - out[2] = ((((uint64_t)x2 << 32) | x1) >> 19) & 0x3ffffff; - out[3] = ((((uint64_t)x3 << 32) | x2) >> 13) & 0x1ffffff; - out[4] = (( x3) >> 6) & 0x3ffffff; - out[5] = ( x4 ) & 0x1ffffff; - out[6] = ((((uint64_t)x5 << 32) | x4) >> 25) & 0x3ffffff; - out[7] = ((((uint64_t)x6 << 32) | x5) >> 19) & 0x1ffffff; - out[8] = ((((uint64_t)x7 << 32) | x6) >> 12) & 0x3ffffff; - out[9] = (( x7) >> 6) & 0x1ffffff; - out[10] = 0; - out[11] = 0; -} - -/* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array - */ -static void -curve25519_contract(unsigned char out[32], const bignum25519 in) { - bignum25519 ALIGN(16) f; - curve25519_copy(f, in); - - #define carry_pass() \ - f[1] += f[0] >> 26; f[0] &= 0x3ffffff; \ - f[2] += f[1] >> 25; f[1] &= 0x1ffffff; \ - f[3] += f[2] >> 26; f[2] &= 0x3ffffff; \ - f[4] += f[3] >> 25; f[3] &= 0x1ffffff; \ - f[5] += f[4] >> 26; f[4] &= 0x3ffffff; \ - f[6] += f[5] >> 25; f[5] &= 0x1ffffff; \ - f[7] += f[6] >> 26; f[6] &= 0x3ffffff; \ - f[8] += f[7] >> 25; f[7] &= 0x1ffffff; \ - f[9] += f[8] >> 26; f[8] &= 0x3ffffff; - - #define carry_pass_full() \ - carry_pass() \ - f[0] += 19 * (f[9] >> 25); f[9] &= 0x1ffffff; - - #define carry_pass_final() \ - carry_pass() \ - f[9] &= 0x1ffffff; - - carry_pass_full() - carry_pass_full() - - /* now t is between 0 and 2^255-1, properly carried. */ - /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ - f[0] += 19; - carry_pass_full() - - /* now between 19 and 2^255-1 in both cases, and offset by 19. */ - f[0] += (1 << 26) - 19; - f[1] += (1 << 25) - 1; - f[2] += (1 << 26) - 1; - f[3] += (1 << 25) - 1; - f[4] += (1 << 26) - 1; - f[5] += (1 << 25) - 1; - f[6] += (1 << 26) - 1; - f[7] += (1 << 25) - 1; - f[8] += (1 << 26) - 1; - f[9] += (1 << 25) - 1; - - /* now between 2^255 and 2^256-20, and offset by 2^255. */ - carry_pass_final() - - #undef carry_pass - #undef carry_full - #undef carry_final - - f[1] <<= 2; - f[2] <<= 3; - f[3] <<= 5; - f[4] <<= 6; - f[6] <<= 1; - f[7] <<= 3; - f[8] <<= 4; - f[9] <<= 6; - - #define F(i, s) \ - out[s+0] |= (unsigned char )(f[i] & 0xff); \ - out[s+1] = (unsigned char )((f[i] >> 8) & 0xff); \ - out[s+2] = (unsigned char )((f[i] >> 16) & 0xff); \ - out[s+3] = (unsigned char )((f[i] >> 24) & 0xff); - - out[0] = 0; - out[16] = 0; - F(0,0); - F(1,3); - F(2,6); - F(3,9); - F(4,12); - F(5,16); - F(6,19); - F(7,22); - F(8,25); - F(9,28); - #undef F -} - -/* if (iswap) swap(a, b) */ -DONNA_INLINE static void -curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint32_t iswap) { - const uint32_t swap = (uint32_t)(-(int32_t)iswap); - xmmi a0,a1,a2,b0,b1,b2,x0,x1,x2; - xmmi mask = _mm_cvtsi32_si128(swap); - mask = _mm_shuffle_epi32(mask, 0); - a0 = _mm_load_si128((xmmi *)a + 0); - a1 = _mm_load_si128((xmmi *)a + 1); - b0 = _mm_load_si128((xmmi *)b + 0); - b1 = _mm_load_si128((xmmi *)b + 1); - b0 = _mm_xor_si128(a0, b0); - b1 = _mm_xor_si128(a1, b1); - x0 = _mm_and_si128(b0, mask); - x1 = _mm_and_si128(b1, mask); - x0 = _mm_xor_si128(x0, a0); - x1 = _mm_xor_si128(x1, a1); - a0 = _mm_xor_si128(x0, b0); - a1 = _mm_xor_si128(x1, b1); - _mm_store_si128((xmmi *)a + 0, x0); - _mm_store_si128((xmmi *)a + 1, x1); - _mm_store_si128((xmmi *)b + 0, a0); - _mm_store_si128((xmmi *)b + 1, a1); - - a2 = _mm_load_si128((xmmi *)a + 2); - b2 = _mm_load_si128((xmmi *)b + 2); - b2 = _mm_xor_si128(a2, b2); - x2 = _mm_and_si128(b2, mask); - x2 = _mm_xor_si128(x2, a2); - a2 = _mm_xor_si128(x2, b2); - _mm_store_si128((xmmi *)b + 2, a2); - _mm_store_si128((xmmi *)a + 2, x2); -} - -/* out = (flag) ? out : in */ -DONNA_INLINE static void -curve25519_move_conditional_bytes(uint8_t out[96], const uint8_t in[96], uint32_t flag) { - xmmi a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5; - const uint32_t nb = flag - 1; - xmmi masknb = _mm_shuffle_epi32(_mm_cvtsi32_si128(nb),0); - a0 = _mm_load_si128((xmmi *)in + 0); - a1 = _mm_load_si128((xmmi *)in + 1); - a2 = _mm_load_si128((xmmi *)in + 2); - b0 = _mm_load_si128((xmmi *)out + 0); - b1 = _mm_load_si128((xmmi *)out + 1); - b2 = _mm_load_si128((xmmi *)out + 2); - a0 = _mm_andnot_si128(masknb, a0); - a1 = _mm_andnot_si128(masknb, a1); - a2 = _mm_andnot_si128(masknb, a2); - b0 = _mm_and_si128(masknb, b0); - b1 = _mm_and_si128(masknb, b1); - b2 = _mm_and_si128(masknb, b2); - a0 = _mm_or_si128(a0, b0); - a1 = _mm_or_si128(a1, b1); - a2 = _mm_or_si128(a2, b2); - _mm_store_si128((xmmi*)out + 0, a0); - _mm_store_si128((xmmi*)out + 1, a1); - _mm_store_si128((xmmi*)out + 2, a2); - - a3 = _mm_load_si128((xmmi *)in + 3); - a4 = _mm_load_si128((xmmi *)in + 4); - a5 = _mm_load_si128((xmmi *)in + 5); - b3 = _mm_load_si128((xmmi *)out + 3); - b4 = _mm_load_si128((xmmi *)out + 4); - b5 = _mm_load_si128((xmmi *)out + 5); - a3 = _mm_andnot_si128(masknb, a3); - a4 = _mm_andnot_si128(masknb, a4); - a5 = _mm_andnot_si128(masknb, a5); - b3 = _mm_and_si128(masknb, b3); - b4 = _mm_and_si128(masknb, b4); - b5 = _mm_and_si128(masknb, b5); - a3 = _mm_or_si128(a3, b3); - a4 = _mm_or_si128(a4, b4); - a5 = _mm_or_si128(a5, b5); - _mm_store_si128((xmmi*)out + 3, a3); - _mm_store_si128((xmmi*)out + 4, a4); - _mm_store_si128((xmmi*)out + 5, a5); -} - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h deleted file mode 100644 index db04a13d3..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h +++ /dev/null @@ -1,513 +0,0 @@ -#if defined(ED25519_GCC_32BIT_SSE_CHOOSE) - -#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS - -DONNA_NOINLINE static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - int32_t breg = (int32_t)b; - uint32_t sign = (uint32_t)breg >> 31; - uint32_t mask = ~(sign - 1); - uint32_t u = (breg + mask) ^ mask; - - __asm__ __volatile__ ( - /* ysubx+xaddy */ - "movl %0, %%eax ;\n" - "movd %%eax, %%xmm6 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - "pxor %%xmm2, %%xmm2 ;\n" - "pxor %%xmm3, %%xmm3 ;\n" - - /* 0 */ - "movl $0, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movl $1, %%ecx ;\n" - "movd %%ecx, %%xmm4 ;\n" - "pxor %%xmm5, %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 1 */ - "movl $1, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 0(%1), %%xmm4 ;\n" - "movdqa 16(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 32(%1), %%xmm4 ;\n" - "movdqa 48(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 2 */ - "movl $2, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 96(%1), %%xmm4 ;\n" - "movdqa 112(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 128(%1), %%xmm4 ;\n" - "movdqa 144(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 3 */ - "movl $3, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 192(%1), %%xmm4 ;\n" - "movdqa 208(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 224(%1), %%xmm4 ;\n" - "movdqa 240(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 4 */ - "movl $4, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 288(%1), %%xmm4 ;\n" - "movdqa 304(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 320(%1), %%xmm4 ;\n" - "movdqa 336(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 5 */ - "movl $5, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 384(%1), %%xmm4 ;\n" - "movdqa 400(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 416(%1), %%xmm4 ;\n" - "movdqa 432(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 6 */ - "movl $6, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 480(%1), %%xmm4 ;\n" - "movdqa 496(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 512(%1), %%xmm4 ;\n" - "movdqa 528(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 7 */ - "movl $7, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 576(%1), %%xmm4 ;\n" - "movdqa 592(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 608(%1), %%xmm4 ;\n" - "movdqa 624(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* 8 */ - "movl $8, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 672(%1), %%xmm4 ;\n" - "movdqa 688(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm0 ;\n" - "por %%xmm5, %%xmm1 ;\n" - "movdqa 704(%1), %%xmm4 ;\n" - "movdqa 720(%1), %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "por %%xmm4, %%xmm2 ;\n" - "por %%xmm5, %%xmm3 ;\n" - - /* conditional swap based on sign */ - "movl %3, %%ecx ;\n" - "movl %2, %%eax ;\n" - "xorl $1, %%ecx ;\n" - "movd %%ecx, %%xmm6 ;\n" - "pxor %%xmm7, %%xmm7 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa %%xmm2, %%xmm4 ;\n" - "movdqa %%xmm3, %%xmm5 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "pand %%xmm7, %%xmm5 ;\n" - "pxor %%xmm4, %%xmm0 ;\n" - "pxor %%xmm5, %%xmm1 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - - /* store ysubx */ - "movd %%xmm0, %%ecx ;\n" - "movl %%ecx, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 0(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $26, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 4(%%eax) ;\n" - "movd %%xmm0, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $19, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 8(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "shrdl $13, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 12(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrl $6, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 16(%%eax) ;\n" - "movl %%edx, %%ecx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 20(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $25, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 24(%%eax) ;\n" - "movd %%xmm1, %%ecx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $19, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 28(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "shrdl $12, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 32(%%eax) ;\n" - "shrl $6, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "xorl %%ecx, %%ecx ;\n" - "movl %%edx, 36(%%eax) ;\n" - "movl %%ecx, 40(%%eax) ;\n" - "movl %%ecx, 44(%%eax) ;\n" - - /* store xaddy */ - "addl $48, %%eax ;\n" - "movdqa %%xmm2, %%xmm0 ;\n" - "movdqa %%xmm3, %%xmm1 ;\n" - "movd %%xmm0, %%ecx ;\n" - "movl %%ecx, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 0(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $26, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 4(%%eax) ;\n" - "movd %%xmm0, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $19, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 8(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "shrdl $13, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 12(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrl $6, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 16(%%eax) ;\n" - "movl %%edx, %%ecx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 20(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $25, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 24(%%eax) ;\n" - "movd %%xmm1, %%ecx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $19, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 28(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "shrdl $12, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 32(%%eax) ;\n" - "shrl $6, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "xorl %%ecx, %%ecx ;\n" - "movl %%edx, 36(%%eax) ;\n" - "movl %%ecx, 40(%%eax) ;\n" - "movl %%ecx, 44(%%eax) ;\n" - - /* t2d */ - "movl %0, %%eax ;\n" - "movd %%eax, %%xmm6 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - - /* 0 */ - "movl $0, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - - /* 1 */ - "movl $1, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 64(%1), %%xmm3 ;\n" - "movdqa 80(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 2 */ - "movl $2, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 160(%1), %%xmm3 ;\n" - "movdqa 176(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 3 */ - "movl $3, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 256(%1), %%xmm3 ;\n" - "movdqa 272(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 4 */ - "movl $4, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 352(%1), %%xmm3 ;\n" - "movdqa 368(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 5 */ - "movl $5, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 448(%1), %%xmm3 ;\n" - "movdqa 464(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 6 */ - "movl $6, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 544(%1), %%xmm3 ;\n" - "movdqa 560(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 7 */ - "movl $7, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 640(%1), %%xmm3 ;\n" - "movdqa 656(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* 8 */ - "movl $8, %%eax ;\n" - "movd %%eax, %%xmm7 ;\n" - "pshufd $0x00, %%xmm7, %%xmm7 ;\n" - "pcmpeqd %%xmm6, %%xmm7 ;\n" - "movdqa 736(%1), %%xmm3 ;\n" - "movdqa 752(%1), %%xmm4 ;\n" - "pand %%xmm7, %%xmm3 ;\n" - "pand %%xmm7, %%xmm4 ;\n" - "por %%xmm3, %%xmm0 ;\n" - "por %%xmm4, %%xmm1 ;\n" - - /* store t2d */ - "movl %2, %%eax ;\n" - "addl $96, %%eax ;\n" - "movd %%xmm0, %%ecx ;\n" - "movl %%ecx, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 0(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $26, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 4(%%eax) ;\n" - "movd %%xmm0, %%edx ;\n" - "pshufd $0x39, %%xmm0, %%xmm0 ;\n" - "shrdl $19, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 8(%%eax) ;\n" - "movd %%xmm0, %%ecx ;\n" - "shrdl $13, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 12(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrl $6, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 16(%%eax) ;\n" - "movl %%edx, %%ecx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 20(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $25, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 24(%%eax) ;\n" - "movd %%xmm1, %%ecx ;\n" - "pshufd $0x39, %%xmm1, %%xmm1 ;\n" - "shrdl $19, %%ecx, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "movl %%edx, 28(%%eax) ;\n" - "movd %%xmm1, %%edx ;\n" - "movd %%xmm1, %%edx ;\n" - "shrdl $12, %%edx, %%ecx ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "movl %%ecx, 32(%%eax) ;\n" - "shrl $6, %%edx ;\n" - "andl $0x1ffffff, %%edx ;\n" - "xorl %%ecx, %%ecx ;\n" - "movl %%edx, 36(%%eax) ;\n" - "movl %%ecx, 40(%%eax) ;\n" - "movl %%ecx, 44(%%eax) ;\n" - "movdqa 0(%%eax), %%xmm0 ;\n" - "movdqa 16(%%eax), %%xmm1 ;\n" - "movdqa 32(%%eax), %%xmm2 ;\n" - - /* conditionally negate t2d */ - - /* set up 2p in to 3/4 */ - "movl $0x7ffffda, %%ecx ;\n" - "movl $0x3fffffe, %%edx ;\n" - "movd %%ecx, %%xmm3 ;\n" - "movd %%edx, %%xmm5 ;\n" - "movl $0x7fffffe, %%ecx ;\n" - "movd %%ecx, %%xmm4 ;\n" - "punpckldq %%xmm5, %%xmm3 ;\n" - "punpckldq %%xmm5, %%xmm4 ;\n" - "punpcklqdq %%xmm4, %%xmm3 ;\n" - "movdqa %%xmm4, %%xmm5 ;\n" - "punpcklqdq %%xmm4, %%xmm4 ;\n" - - /* subtract and conditionally move */ - "movl %3, %%ecx ;\n" - "sub $1, %%ecx ;\n" - "movd %%ecx, %%xmm6 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "movdqa %%xmm6, %%xmm7 ;\n" - "psubd %%xmm0, %%xmm3 ;\n" - "psubd %%xmm1, %%xmm4 ;\n" - "psubd %%xmm2, %%xmm5 ;\n" - "pand %%xmm6, %%xmm0 ;\n" - "pand %%xmm6, %%xmm1 ;\n" - "pand %%xmm6, %%xmm2 ;\n" - "pandn %%xmm3, %%xmm6 ;\n" - "movdqa %%xmm7, %%xmm3 ;\n" - "pandn %%xmm4, %%xmm7 ;\n" - "pandn %%xmm5, %%xmm3 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm3, %%xmm2 ;\n" - - /* store */ - "movdqa %%xmm0, 0(%%eax) ;\n" - "movdqa %%xmm1, 16(%%eax) ;\n" - "movdqa %%xmm2, 32(%%eax) ;\n" - : - : "m"(u), "r"(&table[pos * 8]), "m"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ - : "%eax", "%ecx", "%edx", "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "cc", "memory" - ); -} - -#endif /* defined(ED25519_GCC_32BIT_SSE_CHOOSE) */ - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h deleted file mode 100644 index c977c26eb..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-32bit-tables.h +++ /dev/null @@ -1,61 +0,0 @@ -static const ge25519 ALIGN(16) ge25519_basepoint = { - {0x0325d51a,0x018b5823,0x00f6592a,0x0104a92d,0x01a4b31d,0x01d6dc5c,0x027118fe,0x007fd814,0x013cd6e5,0x0085a4db}, - {0x02666658,0x01999999,0x00cccccc,0x01333333,0x01999999,0x00666666,0x03333333,0x00cccccc,0x02666666,0x01999999}, - {0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000}, - {0x01b7dda3,0x01a2ace9,0x025eadbb,0x0003ba8a,0x0083c27e,0x00abe37d,0x01274732,0x00ccacdd,0x00fd78b7,0x019e1d7c} -}; - -/* - d -*/ - -static const bignum25519 ALIGN(16) ge25519_ecd = { - 0x035978a3,0x00d37284,0x03156ebd,0x006a0a0e,0x0001c029,0x0179e898,0x03a03cbb,0x01ce7198,0x02e2b6ff,0x01480db3 -}; - -static const bignum25519 ALIGN(16) ge25519_ec2d = { - 0x02b2f159,0x01a6e509,0x022add7a,0x00d4141d,0x00038052,0x00f3d130,0x03407977,0x019ce331,0x01c56dff,0x00901b67 -}; - -/* - sqrt(-1) -*/ - -static const bignum25519 ALIGN(16) ge25519_sqrtneg1 = { - 0x020ea0b0,0x0186c9d2,0x008f189d,0x0035697f,0x00bd0c60,0x01fbd7a7,0x02804c9e,0x01e16569,0x0004fc1d,0x00ae0c92 -}; - -static const ge25519_niels ALIGN(16) ge25519_niels_sliding_multiples[32] = { - {{0x0340913e,0x000e4175,0x03d673a2,0x002e8a05,0x03f4e67c,0x008f8a09,0x00c21a34,0x004cf4b8,0x01298f81,0x0113f4be},{0x018c3b85,0x0124f1bd,0x01c325f7,0x0037dc60,0x033e4cb7,0x003d42c2,0x01a44c32,0x014ca4e1,0x03a33d4b,0x001f3e74},{0x037aaa68,0x00448161,0x0093d579,0x011e6556,0x009b67a0,0x0143598c,0x01bee5ee,0x00b50b43,0x0289f0c6,0x01bc45ed}}, - {{0x00fcd265,0x0047fa29,0x034faacc,0x01ef2e0d,0x00ef4d4f,0x014bd6bd,0x00f98d10,0x014c5026,0x007555bd,0x00aae456},{0x00ee9730,0x016c2a13,0x017155e4,0x01874432,0x00096a10,0x01016732,0x01a8014f,0x011e9823,0x01b9a80f,0x01e85938},{0x01d0d889,0x01a4cfc3,0x034c4295,0x0110e1ae,0x0162508c,0x00f2db4c,0x0072a2c6,0x0098da2e,0x02f12b9b,0x0168a09a}}, - {{0x0047d6ba,0x0060b0e9,0x0136eff2,0x008a5939,0x03540053,0x0064a087,0x02788e5c,0x00be7c67,0x033eb1b5,0x005529f9},{0x00a5bb33,0x00af1102,0x01a05442,0x001e3af7,0x02354123,0x00bfec44,0x01f5862d,0x00dd7ba3,0x03146e20,0x00a51733},{0x012a8285,0x00f6fc60,0x023f9797,0x003e85ee,0x009c3820,0x01bda72d,0x01b3858d,0x00d35683,0x0296b3bb,0x010eaaf9}}, - {{0x023221b1,0x01cb26aa,0x0074f74d,0x0099ddd1,0x01b28085,0x00192c3a,0x013b27c9,0x00fc13bd,0x01d2e531,0x0075bb75},{0x004ea3bf,0x00973425,0x001a4d63,0x01d59cee,0x01d1c0d4,0x00542e49,0x01294114,0x004fce36,0x029283c9,0x01186fa9},{0x01b8b3a2,0x00db7200,0x00935e30,0x003829f5,0x02cc0d7d,0x0077adf3,0x0220dd2c,0x0014ea53,0x01c6a0f9,0x01ea7eec}}, - {{0x039d8064,0x01885f80,0x00337e6d,0x01b7a902,0x02628206,0x015eb044,0x01e30473,0x0191f2d9,0x011fadc9,0x01270169},{0x02a8632f,0x0199e2a9,0x00d8b365,0x017a8de2,0x02994279,0x0086f5b5,0x0119e4e3,0x01eb39d6,0x0338add7,0x00d2e7b4},{0x0045af1b,0x013a2fe4,0x0245e0d6,0x014538ce,0x038bfe0f,0x01d4cf16,0x037e14c9,0x0160d55e,0x0021b008,0x01cf05c8}}, - {{0x01864348,0x01d6c092,0x0070262b,0x014bb844,0x00fb5acd,0x008deb95,0x003aaab5,0x00eff474,0x00029d5c,0x0062ad66},{0x02802ade,0x01c02122,0x01c4e5f7,0x00781181,0x039767fb,0x01703406,0x0342388b,0x01f5e227,0x022546d8,0x0109d6ab},{0x016089e9,0x00cb317f,0x00949b05,0x01099417,0x000c7ad2,0x011a8622,0x0088ccda,0x01290886,0x022b53df,0x00f71954}}, - {{0x027fbf93,0x01c04ecc,0x01ed6a0d,0x004cdbbb,0x02bbf3af,0x00ad5968,0x01591955,0x0094f3a2,0x02d17602,0x00099e20},{0x02007f6d,0x003088a8,0x03db77ee,0x00d5ade6,0x02fe12ce,0x0107ba07,0x0107097d,0x00482a6f,0x02ec346f,0x008d3f5f},{0x032ea378,0x0028465c,0x028e2a6c,0x018efc6e,0x0090df9a,0x01a7e533,0x039bfc48,0x010c745d,0x03daa097,0x0125ee9b}}, - {{0x028ccf0b,0x00f36191,0x021ac081,0x012154c8,0x034e0a6e,0x01b25192,0x00180403,0x01d7eea1,0x00218d05,0x010ed735},{0x03cfeaa0,0x01b300c4,0x008da499,0x0068c4e1,0x0219230a,0x01f2d4d0,0x02defd60,0x00e565b7,0x017f12de,0x018788a4},{0x03d0b516,0x009d8be6,0x03ddcbb3,0x0071b9fe,0x03ace2bd,0x01d64270,0x032d3ec9,0x01084065,0x0210ae4d,0x01447584}}, - {{0x0020de87,0x00e19211,0x01b68102,0x00b5ac97,0x022873c0,0x01942d25,0x01271394,0x0102073f,0x02fe2482,0x01c69ff9},{0x010e9d81,0x019dbbe5,0x0089f258,0x006e06b8,0x02951883,0x018f1248,0x019b3237,0x00bc7553,0x024ddb85,0x01b4c964},{0x01c8c854,0x0060ae29,0x01406d8e,0x01cff2f9,0x00cff451,0x01778d0c,0x03ac8c41,0x01552e59,0x036559ee,0x011d1b12}}, - {{0x00741147,0x0151b219,0x01092690,0x00e877e6,0x01f4d6bb,0x0072a332,0x01cd3b03,0x00dadff2,0x0097db5e,0x0086598d},{0x01c69a2b,0x01decf1b,0x02c2fa6e,0x013b7c4f,0x037beac8,0x013a16b5,0x028e7bda,0x01f6e8ac,0x01e34fe9,0x01726947},{0x01f10e67,0x003c73de,0x022b7ea2,0x010f32c2,0x03ff776a,0x00142277,0x01d38b88,0x00776138,0x03c60822,0x01201140}}, - {{0x0236d175,0x0008748e,0x03c6476d,0x013f4cdc,0x02eed02a,0x00838a47,0x032e7210,0x018bcbb3,0x00858de4,0x01dc7826},{0x00a37fc7,0x0127b40b,0x01957884,0x011d30ad,0x02816683,0x016e0e23,0x00b76be4,0x012db115,0x02516506,0x0154ce62},{0x00451edf,0x00bd749e,0x03997342,0x01cc2c4c,0x00eb6975,0x01a59508,0x03a516cf,0x00c228ef,0x0168ff5a,0x01697b47}}, - {{0x00527359,0x01783156,0x03afd75c,0x00ce56dc,0x00e4b970,0x001cabe9,0x029e0f6d,0x0188850c,0x0135fefd,0x00066d80},{0x02150e83,0x01448abf,0x02bb0232,0x012bf259,0x033c8268,0x00711e20,0x03fc148f,0x005e0e70,0x017d8bf9,0x0112b2e2},{0x02134b83,0x001a0517,0x0182c3cc,0x00792182,0x0313d799,0x001a3ed7,0x0344547e,0x01f24a0d,0x03de6ad2,0x00543127}}, - {{0x00dca868,0x00618f27,0x015a1709,0x00ddc38a,0x0320fd13,0x0036168d,0x0371ab06,0x01783fc7,0x0391e05f,0x01e29b5d},{0x01471138,0x00fca542,0x00ca31cf,0x01ca7bad,0x0175bfbc,0x01a708ad,0x03bce212,0x01244215,0x0075bb99,0x01acad68},{0x03a0b976,0x01dc12d1,0x011aab17,0x00aba0ba,0x029806cd,0x0142f590,0x018fd8ea,0x01a01545,0x03c4ad55,0x01c971ff}}, - {{0x00d098c0,0x000afdc7,0x006cd230,0x01276af3,0x03f905b2,0x0102994c,0x002eb8a4,0x015cfbeb,0x025f855f,0x01335518},{0x01cf99b2,0x0099c574,0x01a69c88,0x00881510,0x01cd4b54,0x0112109f,0x008abdc5,0x0074647a,0x0277cb1f,0x01e53324},{0x02ac5053,0x01b109b0,0x024b095e,0x016997b3,0x02f26bb6,0x00311021,0x00197885,0x01d0a55a,0x03b6fcc8,0x01c020d5}}, - {{0x02584a34,0x00e7eee0,0x03257a03,0x011e95a3,0x011ead91,0x00536202,0x00b1ce24,0x008516c6,0x03669d6d,0x004ea4a8},{0x00773f01,0x0019c9ce,0x019f6171,0x01d4afde,0x02e33323,0x01ad29b6,0x02ead1dc,0x01ed51a5,0x01851ad0,0x001bbdfa},{0x00577de5,0x00ddc730,0x038b9952,0x00f281ae,0x01d50390,0x0002e071,0x000780ec,0x010d448d,0x01f8a2af,0x00f0a5b7}}, - {{0x031f2541,0x00d34bae,0x0323ff9d,0x003a056d,0x02e25443,0x00a1ad05,0x00d1bee8,0x002f7f8e,0x03007477,0x002a24b1},{0x0114a713,0x01457e76,0x032255d5,0x01cc647f,0x02a4bdef,0x0153d730,0x00118bcf,0x00f755ff,0x013490c7,0x01ea674e},{0x02bda3e8,0x00bb490d,0x00f291ea,0x000abf40,0x01dea321,0x002f9ce0,0x00b2b193,0x00fa54b5,0x0128302f,0x00a19d8b}}, - {{0x022ef5bd,0x01638af3,0x038c6f8a,0x01a33a3d,0x039261b2,0x01bb89b8,0x010bcf9d,0x00cf42a9,0x023d6f17,0x01da1bca},{0x00e35b25,0x000d824f,0x0152e9cf,0x00ed935d,0x020b8460,0x01c7b83f,0x00c969e5,0x01a74198,0x0046a9d9,0x00cbc768},{0x01597c6a,0x0144a99b,0x00a57551,0x0018269c,0x023c464c,0x0009b022,0x00ee39e1,0x0114c7f2,0x038a9ad2,0x01584c17}}, - {{0x03b0c0d5,0x00b30a39,0x038a6ce4,0x01ded83a,0x01c277a6,0x01010a61,0x0346d3eb,0x018d995e,0x02f2c57c,0x000c286b},{0x0092aed1,0x0125e37b,0x027ca201,0x001a6b6b,0x03290f55,0x0047ba48,0x018d916c,0x01a59062,0x013e35d4,0x0002abb1},{0x003ad2aa,0x007ddcc0,0x00c10f76,0x0001590b,0x002cfca6,0x000ed23e,0x00ee4329,0x00900f04,0x01c24065,0x0082fa70}}, - {{0x02025e60,0x003912b8,0x0327041c,0x017e5ee5,0x02c0ecec,0x015a0d1c,0x02b1ce7c,0x0062220b,0x0145067e,0x01a5d931},{0x009673a6,0x00e1f609,0x00927c2a,0x016faa37,0x01650ef0,0x016f63b5,0x03cd40e1,0x003bc38f,0x0361f0ac,0x01d42acc},{0x02f81037,0x008ca0e8,0x017e23d1,0x011debfe,0x01bcbb68,0x002e2563,0x03e8add6,0x000816e5,0x03fb7075,0x0153e5ac}}, - {{0x02b11ecd,0x016bf185,0x008f22ef,0x00e7d2bb,0x0225d92e,0x00ece785,0x00508873,0x017e16f5,0x01fbe85d,0x01e39a0e},{0x01669279,0x017c810a,0x024941f5,0x0023ebeb,0x00eb7688,0x005760f1,0x02ca4146,0x0073cde7,0x0052bb75,0x00f5ffa7},{0x03b8856b,0x00cb7dcd,0x02f14e06,0x001820d0,0x01d74175,0x00e59e22,0x03fba550,0x00484641,0x03350088,0x01c3c9a3}}, - {{0x00dcf355,0x0104481c,0x0022e464,0x01f73fe7,0x00e03325,0x0152b698,0x02ef769a,0x00973663,0x00039b8c,0x0101395b},{0x01805f47,0x019160ec,0x03832cd0,0x008b06eb,0x03d4d717,0x004cb006,0x03a75b8f,0x013b3d30,0x01cfad88,0x01f034d1},{0x0078338a,0x01c7d2e3,0x02bc2b23,0x018b3f05,0x0280d9aa,0x005f3d44,0x0220a95a,0x00eeeb97,0x0362aaec,0x00835d51}}, - {{0x01b9f543,0x013fac4d,0x02ad93ae,0x018ef464,0x0212cdf7,0x01138ba9,0x011583ab,0x019c3d26,0x028790b4,0x00e2e2b6},{0x033bb758,0x01f0dbf1,0x03734bd1,0x0129b1e5,0x02b3950e,0x003bc922,0x01a53ec8,0x018c5532,0x006f3cee,0x00ae3c79},{0x0351f95d,0x0012a737,0x03d596b8,0x017658fe,0x00ace54a,0x008b66da,0x0036c599,0x012a63a2,0x032ceba1,0x00126bac}}, - {{0x03dcfe7e,0x019f4f18,0x01c81aee,0x0044bc2b,0x00827165,0x014f7c13,0x03b430f0,0x00bf96cc,0x020c8d62,0x01471997},{0x01fc7931,0x001f42dd,0x00ba754a,0x005bd339,0x003fbe49,0x016b3930,0x012a159c,0x009f83b0,0x03530f67,0x01e57b85},{0x02ecbd81,0x0096c294,0x01fce4a9,0x017701a5,0x0175047d,0x00ee4a31,0x012686e5,0x008efcd4,0x0349dc54,0x01b3466f}}, - {{0x02179ca3,0x01d86414,0x03f0afd0,0x00305964,0x015c7428,0x0099711e,0x015d5442,0x00c71014,0x01b40b2e,0x01d483cf},{0x01afc386,0x01984859,0x036203ff,0x0045c6a8,0x0020a8aa,0x00990baa,0x03313f10,0x007ceede,0x027429e4,0x017806ce},{0x039357a1,0x0142f8f4,0x0294a7b6,0x00eaccf4,0x0259edb3,0x01311e6e,0x004d326f,0x0130c346,0x01ccef3c,0x01c424b2}}, - {{0x0364918c,0x00148fc0,0x01638a7b,0x01a1fd5b,0x028ad013,0x0081e5a4,0x01a54f33,0x0174e101,0x003d0257,0x003a856c},{0x00051dcf,0x00f62b1d,0x0143d0ad,0x0042adbd,0x000fda90,0x01743ceb,0x0173e5e4,0x017bc749,0x03b7137a,0x0105ce96},{0x00f9218a,0x015b8c7c,0x00e102f8,0x0158d7e2,0x0169a5b8,0x00b2f176,0x018b347a,0x014cfef2,0x0214a4e3,0x017f1595}}, - {{0x006d7ae5,0x0195c371,0x0391e26d,0x0062a7c6,0x003f42ab,0x010dad86,0x024f8198,0x01542b2a,0x0014c454,0x0189c471},{0x0390988e,0x00b8799d,0x02e44912,0x0078e2e6,0x00075654,0x01923eed,0x0040cd72,0x00a37c76,0x0009d466,0x00c8531d},{0x02651770,0x00609d01,0x0286c265,0x0134513c,0x00ee9281,0x005d223c,0x035c760c,0x00679b36,0x0073ecb8,0x016faa50}}, - {{0x02c89be4,0x016fc244,0x02f38c83,0x018beb72,0x02b3ce2c,0x0097b065,0x034f017b,0x01dd957f,0x00148f61,0x00eab357},{0x0343d2f8,0x003398fc,0x011e368e,0x00782a1f,0x00019eea,0x00117b6f,0x0128d0d1,0x01a5e6bb,0x01944f1b,0x012b41e1},{0x03318301,0x018ecd30,0x0104d0b1,0x0038398b,0x03726701,0x019da88c,0x002d9769,0x00a7a681,0x031d9028,0x00ebfc32}}, - {{0x0220405e,0x0171face,0x02d930f8,0x017f6d6a,0x023b8c47,0x0129d5f9,0x02972456,0x00a3a524,0x006f4cd2,0x004439fa},{0x00c53505,0x0190c2fd,0x00507244,0x009930f9,0x01a39270,0x01d327c6,0x0399bc47,0x01cfe13d,0x0332bd99,0x00b33e7d},{0x0203f5e4,0x003627b5,0x00018af8,0x01478581,0x004a2218,0x002e3bb7,0x039384d0,0x0146ea62,0x020b9693,0x0017155f}}, - {{0x03c97e6f,0x00738c47,0x03b5db1f,0x01808fcf,0x01e8fc98,0x01ed25dd,0x01bf5045,0x00eb5c2b,0x0178fe98,0x01b85530},{0x01c20eb0,0x01aeec22,0x030b9eee,0x01b7d07e,0x0187e16f,0x014421fb,0x009fa731,0x0040b6d7,0x00841861,0x00a27fbc},{0x02d69abf,0x0058cdbf,0x0129f9ec,0x013c19ae,0x026c5b93,0x013a7fe7,0x004bb2ba,0x0063226f,0x002a95ca,0x01abefd9}}, - {{0x02f5d2c1,0x00378318,0x03734fb5,0x01258073,0x0263f0f6,0x01ad70e0,0x01b56d06,0x01188fbd,0x011b9503,0x0036d2e1},{0x0113a8cc,0x01541c3e,0x02ac2bbc,0x01d95867,0x01f47459,0x00ead489,0x00ab5b48,0x01db3b45,0x00edb801,0x004b024f},{0x00b8190f,0x011fe4c2,0x00621f82,0x010508d7,0x001a5a76,0x00c7d7fd,0x03aab96d,0x019cd9dc,0x019c6635,0x00ceaa1e}}, - {{0x01085cf2,0x01fd47af,0x03e3f5e1,0x004b3e99,0x01e3d46a,0x0060033c,0x015ff0a8,0x0150cdd8,0x029e8e21,0x008cf1bc},{0x00156cb1,0x003d623f,0x01a4f069,0x00d8d053,0x01b68aea,0x01ca5ab6,0x0316ae43,0x0134dc44,0x001c8d58,0x0084b343},{0x0318c781,0x0135441f,0x03a51a5e,0x019293f4,0x0048bb37,0x013d3341,0x0143151e,0x019c74e1,0x00911914,0x0076ddde}}, - {{0x006bc26f,0x00d48e5f,0x00227bbe,0x00629ea8,0x01ea5f8b,0x0179a330,0x027a1d5f,0x01bf8f8e,0x02d26e2a,0x00c6b65e},{0x01701ab6,0x0051da77,0x01b4b667,0x00a0ce7c,0x038ae37b,0x012ac852,0x03a0b0fe,0x0097c2bb,0x00a017d2,0x01eb8b2a},{0x0120b962,0x0005fb42,0x0353b6fd,0x0061f8ce,0x007a1463,0x01560a64,0x00e0a792,0x01907c92,0x013a6622,0x007b47f1}} -}; diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h deleted file mode 100644 index ca08651d6..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h +++ /dev/null @@ -1,436 +0,0 @@ -#if defined(ED25519_GCC_64BIT_SSE_CHOOSE) - -#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS - -DONNA_NOINLINE static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - int64_t breg = (int64_t)b; - uint64_t sign = (uint64_t)breg >> 63; - uint64_t mask = ~(sign - 1); - uint64_t u = (breg + mask) ^ mask; - - __asm__ __volatile__ ( - /* ysubx+xaddy+t2d */ - "movq %0, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - "pxor %%xmm2, %%xmm2 ;\n" - "pxor %%xmm3, %%xmm3 ;\n" - "pxor %%xmm4, %%xmm4 ;\n" - "pxor %%xmm5, %%xmm5 ;\n" - - /* 0 */ - "movq $0, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm6 ;\n" - "pxor %%xmm7, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm6, %%xmm2 ;\n" - "por %%xmm7, %%xmm3 ;\n" - - /* 1 */ - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 0(%1), %%xmm6 ;\n" - "movdqa 16(%1), %%xmm7 ;\n" - "movdqa 32(%1), %%xmm8 ;\n" - "movdqa 48(%1), %%xmm9 ;\n" - "movdqa 64(%1), %%xmm10 ;\n" - "movdqa 80(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 2 */ - "movq $2, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 96(%1), %%xmm6 ;\n" - "movdqa 112(%1), %%xmm7 ;\n" - "movdqa 128(%1), %%xmm8 ;\n" - "movdqa 144(%1), %%xmm9 ;\n" - "movdqa 160(%1), %%xmm10 ;\n" - "movdqa 176(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 3 */ - "movq $3, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 192(%1), %%xmm6 ;\n" - "movdqa 208(%1), %%xmm7 ;\n" - "movdqa 224(%1), %%xmm8 ;\n" - "movdqa 240(%1), %%xmm9 ;\n" - "movdqa 256(%1), %%xmm10 ;\n" - "movdqa 272(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 4 */ - "movq $4, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 288(%1), %%xmm6 ;\n" - "movdqa 304(%1), %%xmm7 ;\n" - "movdqa 320(%1), %%xmm8 ;\n" - "movdqa 336(%1), %%xmm9 ;\n" - "movdqa 352(%1), %%xmm10 ;\n" - "movdqa 368(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 5 */ - "movq $5, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 384(%1), %%xmm6 ;\n" - "movdqa 400(%1), %%xmm7 ;\n" - "movdqa 416(%1), %%xmm8 ;\n" - "movdqa 432(%1), %%xmm9 ;\n" - "movdqa 448(%1), %%xmm10 ;\n" - "movdqa 464(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 6 */ - "movq $6, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 480(%1), %%xmm6 ;\n" - "movdqa 496(%1), %%xmm7 ;\n" - "movdqa 512(%1), %%xmm8 ;\n" - "movdqa 528(%1), %%xmm9 ;\n" - "movdqa 544(%1), %%xmm10 ;\n" - "movdqa 560(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 7 */ - "movq $7, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 576(%1), %%xmm6 ;\n" - "movdqa 592(%1), %%xmm7 ;\n" - "movdqa 608(%1), %%xmm8 ;\n" - "movdqa 624(%1), %%xmm9 ;\n" - "movdqa 640(%1), %%xmm10 ;\n" - "movdqa 656(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 8 */ - "movq $8, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 672(%1), %%xmm6 ;\n" - "movdqa 688(%1), %%xmm7 ;\n" - "movdqa 704(%1), %%xmm8 ;\n" - "movdqa 720(%1), %%xmm9 ;\n" - "movdqa 736(%1), %%xmm10 ;\n" - "movdqa 752(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* conditionally swap ysubx and xaddy */ - "movq %3, %%rax ;\n" - "xorq $1, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pxor %%xmm15, %%xmm15 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa %%xmm2, %%xmm6 ;\n" - "movdqa %%xmm3, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pxor %%xmm6, %%xmm0 ;\n" - "pxor %%xmm7, %%xmm1 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - - /* store ysubx */ - "xorq %%rax, %%rax ;\n" - "movd %%xmm0, %%rcx ;\n" - "movd %%xmm0, %%r8 ;\n" - "movd %%xmm1, %%rsi ;\n" - "pshufd $0xee, %%xmm0, %%xmm0 ;\n" - "pshufd $0xee, %%xmm1, %%xmm1 ;\n" - "movd %%xmm0, %%rdx ;\n" - "movd %%xmm1, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movl %%ecx, 0(%2) ;\n" - "movl %%r9d, 4(%2) ;\n" - "movl %%r8d, 8(%2) ;\n" - "movl %%r10d, 12(%2) ;\n" - "movl %%edx, 16(%2) ;\n" - "movl %%r11d, 20(%2) ;\n" - "movl %%esi, 24(%2) ;\n" - "movl %%r12d, 28(%2) ;\n" - "movl %%edi, 32(%2) ;\n" - "movl %%r13d, 36(%2) ;\n" - "movq %%rax, 40(%2) ;\n" - - /* store xaddy */ - "movd %%xmm2, %%rcx ;\n" - "movd %%xmm2, %%r8 ;\n" - "movd %%xmm3, %%rsi ;\n" - "pshufd $0xee, %%xmm2, %%xmm2 ;\n" - "pshufd $0xee, %%xmm3, %%xmm3 ;\n" - "movd %%xmm2, %%rdx ;\n" - "movd %%xmm3, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movl %%ecx, 48(%2) ;\n" - "movl %%r9d, 52(%2) ;\n" - "movl %%r8d, 56(%2) ;\n" - "movl %%r10d, 60(%2) ;\n" - "movl %%edx, 64(%2) ;\n" - "movl %%r11d, 68(%2) ;\n" - "movl %%esi, 72(%2) ;\n" - "movl %%r12d, 76(%2) ;\n" - "movl %%edi, 80(%2) ;\n" - "movl %%r13d, 84(%2) ;\n" - "movq %%rax, 88(%2) ;\n" - - /* extract t2d */ - "xorq %%rax, %%rax ;\n" - "movd %%xmm4, %%rcx ;\n" - "movd %%xmm4, %%r8 ;\n" - "movd %%xmm5, %%rsi ;\n" - "pshufd $0xee, %%xmm4, %%xmm4 ;\n" - "pshufd $0xee, %%xmm5, %%xmm5 ;\n" - "movd %%xmm4, %%rdx ;\n" - "movd %%xmm5, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movd %%ecx, %%xmm0 ;\n" - "movd %%r9d, %%xmm4 ;\n" - "movd %%r8d, %%xmm8 ;\n" - "movd %%r10d, %%xmm3 ;\n" - "movd %%edx, %%xmm1 ;\n" - "movd %%r11d, %%xmm5 ;\n" - "movd %%esi, %%xmm6 ;\n" - "movd %%r12d, %%xmm7 ;\n" - "movd %%edi, %%xmm2 ;\n" - "movd %%r13d, %%xmm9 ;\n" - "punpckldq %%xmm4, %%xmm0 ;\n" - "punpckldq %%xmm3, %%xmm8 ;\n" - "punpckldq %%xmm5, %%xmm1 ;\n" - "punpckldq %%xmm7, %%xmm6 ;\n" - "punpckldq %%xmm9, %%xmm2 ;\n" - "punpcklqdq %%xmm8, %%xmm0 ;\n" - "punpcklqdq %%xmm6, %%xmm1 ;\n" - - /* set up 2p in to 3/4 */ - "movl $0x7ffffda, %%ecx ;\n" - "movl $0x3fffffe, %%edx ;\n" - "movl $0x7fffffe, %%eax ;\n" - "movd %%ecx, %%xmm3 ;\n" - "movd %%edx, %%xmm5 ;\n" - "movd %%eax, %%xmm4 ;\n" - "punpckldq %%xmm5, %%xmm3 ;\n" - "punpckldq %%xmm5, %%xmm4 ;\n" - "punpcklqdq %%xmm4, %%xmm3 ;\n" - "movdqa %%xmm4, %%xmm5 ;\n" - "punpcklqdq %%xmm4, %%xmm4 ;\n" - - /* subtract and conditionally move */ - "movl %3, %%ecx ;\n" - "sub $1, %%ecx ;\n" - "movd %%ecx, %%xmm6 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "movdqa %%xmm6, %%xmm7 ;\n" - "psubd %%xmm0, %%xmm3 ;\n" - "psubd %%xmm1, %%xmm4 ;\n" - "psubd %%xmm2, %%xmm5 ;\n" - "pand %%xmm6, %%xmm0 ;\n" - "pand %%xmm6, %%xmm1 ;\n" - "pand %%xmm6, %%xmm2 ;\n" - "pandn %%xmm3, %%xmm6 ;\n" - "movdqa %%xmm7, %%xmm3 ;\n" - "pandn %%xmm4, %%xmm7 ;\n" - "pandn %%xmm5, %%xmm3 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm3, %%xmm2 ;\n" - - /* store t2d */ - "movdqa %%xmm0, 96(%2) ;\n" - "movdqa %%xmm1, 112(%2) ;\n" - "movdqa %%xmm2, 128(%2) ;\n" - : - : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ - : - "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", - "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", - "cc", "memory" - ); -} - -#endif /* defined(ED25519_GCC_64BIT_SSE_CHOOSE) */ - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h deleted file mode 100644 index 4a6ff9eda..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-tables.h +++ /dev/null @@ -1,53 +0,0 @@ -static const ge25519 ge25519_basepoint = { - {0x00062d608f25d51a,0x000412a4b4f6592a,0x00075b7171a4b31d,0x0001ff60527118fe,0x000216936d3cd6e5}, - {0x0006666666666658,0x0004cccccccccccc,0x0001999999999999,0x0003333333333333,0x0006666666666666}, - {0x0000000000000001,0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000}, - {0x00068ab3a5b7dda3,0x00000eea2a5eadbb,0x0002af8df483c27e,0x000332b375274732,0x00067875f0fd78b7} -}; - -static const bignum25519 ge25519_ecd = { - 0x00034dca135978a3,0x0001a8283b156ebd,0x0005e7a26001c029,0x000739c663a03cbb,0x00052036cee2b6ff -}; - -static const bignum25519 ge25519_ec2d = { - 0x00069b9426b2f159,0x00035050762add7a,0x0003cf44c0038052,0x0006738cc7407977,0x0002406d9dc56dff -}; - -static const bignum25519 ge25519_sqrtneg1 = { - 0x00061b274a0ea0b0,0x0000d5a5fc8f189d,0x0007ef5e9cbd0c60,0x00078595a6804c9e,0x0002b8324804fc1d -}; - -static const ge25519_niels ge25519_niels_sliding_multiples[32] = { - {{0x00003905d740913e,0x0000ba2817d673a2,0x00023e2827f4e67c,0x000133d2e0c21a34,0x00044fd2f9298f81},{0x000493c6f58c3b85,0x0000df7181c325f7,0x0000f50b0b3e4cb7,0x0005329385a44c32,0x00007cf9d3a33d4b},{0x00011205877aaa68,0x000479955893d579,0x00050d66309b67a0,0x0002d42d0dbee5ee,0x0006f117b689f0c6}}, - {{0x00011fe8a4fcd265,0x0007bcb8374faacc,0x00052f5af4ef4d4f,0x0005314098f98d10,0x0002ab91587555bd},{0x0005b0a84cee9730,0x00061d10c97155e4,0x0004059cc8096a10,0x00047a608da8014f,0x0007a164e1b9a80f},{0x0006933f0dd0d889,0x00044386bb4c4295,0x0003cb6d3162508c,0x00026368b872a2c6,0x0005a2826af12b9b}}, - {{0x000182c3a447d6ba,0x00022964e536eff2,0x000192821f540053,0x0002f9f19e788e5c,0x000154a7e73eb1b5},{0x0002bc4408a5bb33,0x000078ebdda05442,0x0002ffb112354123,0x000375ee8df5862d,0x0002945ccf146e20},{0x0003dbf1812a8285,0x0000fa17ba3f9797,0x0006f69cb49c3820,0x00034d5a0db3858d,0x00043aabe696b3bb}}, - {{0x00072c9aaa3221b1,0x000267774474f74d,0x000064b0e9b28085,0x0003f04ef53b27c9,0x0001d6edd5d2e531},{0x00025cd0944ea3bf,0x00075673b81a4d63,0x000150b925d1c0d4,0x00013f38d9294114,0x000461bea69283c9},{0x00036dc801b8b3a2,0x0000e0a7d4935e30,0x0001deb7cecc0d7d,0x000053a94e20dd2c,0x0007a9fbb1c6a0f9}}, - {{0x0006217e039d8064,0x0006dea408337e6d,0x00057ac112628206,0x000647cb65e30473,0x00049c05a51fadc9},{0x0006678aa6a8632f,0x0005ea3788d8b365,0x00021bd6d6994279,0x0007ace75919e4e3,0x00034b9ed338add7},{0x0004e8bf9045af1b,0x000514e33a45e0d6,0x0007533c5b8bfe0f,0x000583557b7e14c9,0x00073c172021b008}}, - {{0x00075b0249864348,0x00052ee11070262b,0x000237ae54fb5acd,0x0003bfd1d03aaab5,0x00018ab598029d5c},{0x000700848a802ade,0x0001e04605c4e5f7,0x0005c0d01b9767fb,0x0007d7889f42388b,0x0004275aae2546d8},{0x00032cc5fd6089e9,0x000426505c949b05,0x00046a18880c7ad2,0x0004a4221888ccda,0x0003dc65522b53df}}, - {{0x0007013b327fbf93,0x0001336eeded6a0d,0x0002b565a2bbf3af,0x000253ce89591955,0x0000267882d17602},{0x0000c222a2007f6d,0x000356b79bdb77ee,0x00041ee81efe12ce,0x000120a9bd07097d,0x000234fd7eec346f},{0x0000a119732ea378,0x00063bf1ba8e2a6c,0x00069f94cc90df9a,0x000431d1779bfc48,0x000497ba6fdaa097}}, - {{0x0003cd86468ccf0b,0x00048553221ac081,0x0006c9464b4e0a6e,0x00075fba84180403,0x00043b5cd4218d05},{0x0006cc0313cfeaa0,0x0001a313848da499,0x0007cb534219230a,0x00039596dedefd60,0x00061e22917f12de},{0x0002762f9bd0b516,0x0001c6e7fbddcbb3,0x00075909c3ace2bd,0x00042101972d3ec9,0x000511d61210ae4d}}, - {{0x000386484420de87,0x0002d6b25db68102,0x000650b4962873c0,0x0004081cfd271394,0x00071a7fe6fe2482},{0x000676ef950e9d81,0x0001b81ae089f258,0x00063c4922951883,0x0002f1d54d9b3237,0x0006d325924ddb85},{0x000182b8a5c8c854,0x00073fcbe5406d8e,0x0005de3430cff451,0x000554b967ac8c41,0x0004746c4b6559ee}}, - {{0x000546c864741147,0x0003a1df99092690,0x0001ca8cc9f4d6bb,0x00036b7fc9cd3b03,0x000219663497db5e},{0x00077b3c6dc69a2b,0x0004edf13ec2fa6e,0x0004e85ad77beac8,0x0007dba2b28e7bda,0x0005c9a51de34fe9},{0x0000f1cf79f10e67,0x00043ccb0a2b7ea2,0x00005089dfff776a,0x0001dd84e1d38b88,0x0004804503c60822}}, - {{0x000021d23a36d175,0x0004fd3373c6476d,0x00020e291eeed02a,0x00062f2ecf2e7210,0x000771e098858de4},{0x00049ed02ca37fc7,0x000474c2b5957884,0x0005b8388e816683,0x0004b6c454b76be4,0x000553398a516506},{0x0002f5d278451edf,0x000730b133997342,0x0006965420eb6975,0x000308a3bfa516cf,0x0005a5ed1d68ff5a}}, - {{0x0005e0c558527359,0x0003395b73afd75c,0x000072afa4e4b970,0x00062214329e0f6d,0x000019b60135fefd},{0x0005122afe150e83,0x0004afc966bb0232,0x0001c478833c8268,0x00017839c3fc148f,0x00044acb897d8bf9},{0x000068145e134b83,0x0001e4860982c3cc,0x000068fb5f13d799,0x0007c9283744547e,0x000150c49fde6ad2}}, - {{0x0001863c9cdca868,0x0003770e295a1709,0x0000d85a3720fd13,0x0005e0ff1f71ab06,0x00078a6d7791e05f},{0x0003f29509471138,0x000729eeb4ca31cf,0x00069c22b575bfbc,0x0004910857bce212,0x0006b2b5a075bb99},{0x0007704b47a0b976,0x0002ae82e91aab17,0x00050bd6429806cd,0x00068055158fd8ea,0x000725c7ffc4ad55}}, - {{0x00002bf71cd098c0,0x00049dabcc6cd230,0x00040a6533f905b2,0x000573efac2eb8a4,0x0004cd54625f855f},{0x00026715d1cf99b2,0x0002205441a69c88,0x000448427dcd4b54,0x0001d191e88abdc5,0x000794cc9277cb1f},{0x0006c426c2ac5053,0x0005a65ece4b095e,0x0000c44086f26bb6,0x0007429568197885,0x0007008357b6fcc8}}, - {{0x00039fbb82584a34,0x00047a568f257a03,0x00014d88091ead91,0x0002145b18b1ce24,0x00013a92a3669d6d},{0x0000672738773f01,0x000752bf799f6171,0x0006b4a6dae33323,0x0007b54696ead1dc,0x00006ef7e9851ad0},{0x0003771cc0577de5,0x0003ca06bb8b9952,0x00000b81c5d50390,0x00043512340780ec,0x0003c296ddf8a2af}}, - {{0x00034d2ebb1f2541,0x0000e815b723ff9d,0x000286b416e25443,0x0000bdfe38d1bee8,0x0000a892c7007477},{0x000515f9d914a713,0x00073191ff2255d5,0x00054f5cc2a4bdef,0x0003dd57fc118bcf,0x0007a99d393490c7},{0x0002ed2436bda3e8,0x00002afd00f291ea,0x0000be7381dea321,0x0003e952d4b2b193,0x000286762d28302f}}, - {{0x00058e2bce2ef5bd,0x00068ce8f78c6f8a,0x0006ee26e39261b2,0x00033d0aa50bcf9d,0x0007686f2a3d6f17},{0x000036093ce35b25,0x0003b64d7552e9cf,0x00071ee0fe0b8460,0x00069d0660c969e5,0x00032f1da046a9d9},{0x000512a66d597c6a,0x0000609a70a57551,0x000026c08a3c464c,0x0004531fc8ee39e1,0x000561305f8a9ad2}}, - {{0x0002cc28e7b0c0d5,0x00077b60eb8a6ce4,0x0004042985c277a6,0x000636657b46d3eb,0x000030a1aef2c57c},{0x0004978dec92aed1,0x000069adae7ca201,0x00011ee923290f55,0x00069641898d916c,0x00000aaec53e35d4},{0x0001f773003ad2aa,0x000005642cc10f76,0x00003b48f82cfca6,0x0002403c10ee4329,0x00020be9c1c24065}}, - {{0x0000e44ae2025e60,0x0005f97b9727041c,0x0005683472c0ecec,0x000188882eb1ce7c,0x00069764c545067e},{0x000387d8249673a6,0x0005bea8dc927c2a,0x0005bd8ed5650ef0,0x0000ef0e3fcd40e1,0x000750ab3361f0ac},{0x00023283a2f81037,0x000477aff97e23d1,0x0000b8958dbcbb68,0x0000205b97e8add6,0x00054f96b3fb7075}}, - {{0x0005afc616b11ecd,0x00039f4aec8f22ef,0x0003b39e1625d92e,0x0005f85bd4508873,0x00078e6839fbe85d},{0x0005f20429669279,0x00008fafae4941f5,0x00015d83c4eb7688,0x0001cf379eca4146,0x0003d7fe9c52bb75},{0x00032df737b8856b,0x0000608342f14e06,0x0003967889d74175,0x0001211907fba550,0x00070f268f350088}}, - {{0x0004112070dcf355,0x0007dcff9c22e464,0x00054ada60e03325,0x00025cd98eef769a,0x000404e56c039b8c},{0x00064583b1805f47,0x00022c1baf832cd0,0x000132c01bd4d717,0x0004ecf4c3a75b8f,0x0007c0d345cfad88},{0x00071f4b8c78338a,0x00062cfc16bc2b23,0x00017cf51280d9aa,0x0003bbae5e20a95a,0x00020d754762aaec}}, - {{0x0004feb135b9f543,0x00063bd192ad93ae,0x00044e2ea612cdf7,0x000670f4991583ab,0x00038b8ada8790b4},{0x0007c36fc73bb758,0x0004a6c797734bd1,0x0000ef248ab3950e,0x00063154c9a53ec8,0x0002b8f1e46f3cee},{0x00004a9cdf51f95d,0x0005d963fbd596b8,0x00022d9b68ace54a,0x0004a98e8836c599,0x000049aeb32ceba1}}, - {{0x00067d3c63dcfe7e,0x000112f0adc81aee,0x00053df04c827165,0x0002fe5b33b430f0,0x00051c665e0c8d62},{0x00007d0b75fc7931,0x00016f4ce4ba754a,0x0005ace4c03fbe49,0x00027e0ec12a159c,0x000795ee17530f67},{0x00025b0a52ecbd81,0x0005dc0695fce4a9,0x0003b928c575047d,0x00023bf3512686e5,0x0006cd19bf49dc54}}, - {{0x0007619052179ca3,0x0000c16593f0afd0,0x000265c4795c7428,0x00031c40515d5442,0x0007520f3db40b2e},{0x0006612165afc386,0x0001171aa36203ff,0x0002642ea820a8aa,0x0001f3bb7b313f10,0x0005e01b3a7429e4},{0x00050be3d39357a1,0x0003ab33d294a7b6,0x0004c479ba59edb3,0x0004c30d184d326f,0x00071092c9ccef3c}}, - {{0x0000523f0364918c,0x000687f56d638a7b,0x00020796928ad013,0x0005d38405a54f33,0x0000ea15b03d0257},{0x0003d8ac74051dcf,0x00010ab6f543d0ad,0x0005d0f3ac0fda90,0x0005ef1d2573e5e4,0x0004173a5bb7137a},{0x00056e31f0f9218a,0x0005635f88e102f8,0x0002cbc5d969a5b8,0x000533fbc98b347a,0x0005fc565614a4e3}}, - {{0x0006570dc46d7ae5,0x00018a9f1b91e26d,0x000436b6183f42ab,0x000550acaa4f8198,0x00062711c414c454},{0x0002e1e67790988e,0x0001e38b9ae44912,0x000648fbb4075654,0x00028df1d840cd72,0x0003214c7409d466},{0x0001827406651770,0x0004d144f286c265,0x00017488f0ee9281,0x00019e6cdb5c760c,0x0005bea94073ecb8}}, - {{0x0005bf0912c89be4,0x00062fadcaf38c83,0x00025ec196b3ce2c,0x00077655ff4f017b,0x0003aacd5c148f61},{0x0000ce63f343d2f8,0x0001e0a87d1e368e,0x000045edbc019eea,0x0006979aed28d0d1,0x0004ad0785944f1b},{0x00063b34c3318301,0x0000e0e62d04d0b1,0x000676a233726701,0x00029e9a042d9769,0x0003aff0cb1d9028}}, - {{0x0005c7eb3a20405e,0x0005fdb5aad930f8,0x0004a757e63b8c47,0x00028e9492972456,0x000110e7e86f4cd2},{0x0006430bf4c53505,0x000264c3e4507244,0x00074c9f19a39270,0x00073f84f799bc47,0x0002ccf9f732bd99},{0x0000d89ed603f5e4,0x00051e1604018af8,0x0000b8eedc4a2218,0x00051ba98b9384d0,0x00005c557e0b9693}}, - {{0x0001ce311fc97e6f,0x0006023f3fb5db1f,0x0007b49775e8fc98,0x0003ad70adbf5045,0x0006e154c178fe98},{0x0006bbb089c20eb0,0x0006df41fb0b9eee,0x00051087ed87e16f,0x000102db5c9fa731,0x000289fef0841861},{0x00016336fed69abf,0x0004f066b929f9ec,0x0004e9ff9e6c5b93,0x00018c89bc4bb2ba,0x0006afbf642a95ca}}, - {{0x0000de0c62f5d2c1,0x00049601cf734fb5,0x0006b5c38263f0f6,0x0004623ef5b56d06,0x0000db4b851b9503},{0x00055070f913a8cc,0x000765619eac2bbc,0x0003ab5225f47459,0x00076ced14ab5b48,0x00012c093cedb801},{0x00047f9308b8190f,0x000414235c621f82,0x00031f5ff41a5a76,0x0006736773aab96d,0x00033aa8799c6635}}, - {{0x0007f51ebd085cf2,0x00012cfa67e3f5e1,0x0001800cf1e3d46a,0x00054337615ff0a8,0x000233c6f29e8e21},{0x0000f588fc156cb1,0x000363414da4f069,0x0007296ad9b68aea,0x0004d3711316ae43,0x000212cd0c1c8d58},{0x0004d5107f18c781,0x00064a4fd3a51a5e,0x0004f4cd0448bb37,0x000671d38543151e,0x0001db7778911914}}, - {{0x000352397c6bc26f,0x00018a7aa0227bbe,0x0005e68cc1ea5f8b,0x0006fe3e3a7a1d5f,0x00031ad97ad26e2a},{0x00014769dd701ab6,0x00028339f1b4b667,0x0004ab214b8ae37b,0x00025f0aefa0b0fe,0x0007ae2ca8a017d2},{0x000017ed0920b962,0x000187e33b53b6fd,0x00055829907a1463,0x000641f248e0a792,0x0001ed1fc53a6622}} -}; diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h deleted file mode 100644 index 1ce109c5b..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h +++ /dev/null @@ -1,435 +0,0 @@ -#if defined(ED25519_GCC_64BIT_32BIT_CHOOSE) - -#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS - -DONNA_NOINLINE static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - int64_t breg = (int64_t)b; - uint64_t sign = (uint64_t)breg >> 63; - uint64_t mask = ~(sign - 1); - uint64_t u = (breg + mask) ^ mask; - - __asm__ __volatile__ ( - /* ysubx+xaddy+t2d */ - "movq %0, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - "pxor %%xmm2, %%xmm2 ;\n" - "pxor %%xmm3, %%xmm3 ;\n" - "pxor %%xmm4, %%xmm4 ;\n" - "pxor %%xmm5, %%xmm5 ;\n" - - /* 0 */ - "movq $0, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm6 ;\n" - "pxor %%xmm7, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm6, %%xmm2 ;\n" - "por %%xmm7, %%xmm3 ;\n" - - /* 1 */ - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 0(%1), %%xmm6 ;\n" - "movdqa 16(%1), %%xmm7 ;\n" - "movdqa 32(%1), %%xmm8 ;\n" - "movdqa 48(%1), %%xmm9 ;\n" - "movdqa 64(%1), %%xmm10 ;\n" - "movdqa 80(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 2 */ - "movq $2, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 96(%1), %%xmm6 ;\n" - "movdqa 112(%1), %%xmm7 ;\n" - "movdqa 128(%1), %%xmm8 ;\n" - "movdqa 144(%1), %%xmm9 ;\n" - "movdqa 160(%1), %%xmm10 ;\n" - "movdqa 176(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 3 */ - "movq $3, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 192(%1), %%xmm6 ;\n" - "movdqa 208(%1), %%xmm7 ;\n" - "movdqa 224(%1), %%xmm8 ;\n" - "movdqa 240(%1), %%xmm9 ;\n" - "movdqa 256(%1), %%xmm10 ;\n" - "movdqa 272(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 4 */ - "movq $4, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 288(%1), %%xmm6 ;\n" - "movdqa 304(%1), %%xmm7 ;\n" - "movdqa 320(%1), %%xmm8 ;\n" - "movdqa 336(%1), %%xmm9 ;\n" - "movdqa 352(%1), %%xmm10 ;\n" - "movdqa 368(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 5 */ - "movq $5, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 384(%1), %%xmm6 ;\n" - "movdqa 400(%1), %%xmm7 ;\n" - "movdqa 416(%1), %%xmm8 ;\n" - "movdqa 432(%1), %%xmm9 ;\n" - "movdqa 448(%1), %%xmm10 ;\n" - "movdqa 464(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 6 */ - "movq $6, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 480(%1), %%xmm6 ;\n" - "movdqa 496(%1), %%xmm7 ;\n" - "movdqa 512(%1), %%xmm8 ;\n" - "movdqa 528(%1), %%xmm9 ;\n" - "movdqa 544(%1), %%xmm10 ;\n" - "movdqa 560(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 7 */ - "movq $7, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 576(%1), %%xmm6 ;\n" - "movdqa 592(%1), %%xmm7 ;\n" - "movdqa 608(%1), %%xmm8 ;\n" - "movdqa 624(%1), %%xmm9 ;\n" - "movdqa 640(%1), %%xmm10 ;\n" - "movdqa 656(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 8 */ - "movq $8, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 672(%1), %%xmm6 ;\n" - "movdqa 688(%1), %%xmm7 ;\n" - "movdqa 704(%1), %%xmm8 ;\n" - "movdqa 720(%1), %%xmm9 ;\n" - "movdqa 736(%1), %%xmm10 ;\n" - "movdqa 752(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* conditionally swap ysubx and xaddy */ - "movq %3, %%rax ;\n" - "xorq $1, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pxor %%xmm15, %%xmm15 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa %%xmm2, %%xmm6 ;\n" - "movdqa %%xmm3, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pxor %%xmm6, %%xmm0 ;\n" - "pxor %%xmm7, %%xmm1 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - - /* store ysubx */ - "xorq %%rax, %%rax ;\n" - "movd %%xmm0, %%rcx ;\n" - "movd %%xmm0, %%r8 ;\n" - "movd %%xmm1, %%rsi ;\n" - "pshufd $0xee, %%xmm0, %%xmm0 ;\n" - "pshufd $0xee, %%xmm1, %%xmm1 ;\n" - "movd %%xmm0, %%rdx ;\n" - "movd %%xmm1, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movl %%ecx, 0(%2) ;\n" - "movl %%r9d, 4(%2) ;\n" - "movl %%r8d, 8(%2) ;\n" - "movl %%r10d, 12(%2) ;\n" - "movl %%edx, 16(%2) ;\n" - "movl %%r11d, 20(%2) ;\n" - "movl %%esi, 24(%2) ;\n" - "movl %%r12d, 28(%2) ;\n" - "movl %%edi, 32(%2) ;\n" - "movl %%r13d, 36(%2) ;\n" - - /* store xaddy */ - "movd %%xmm2, %%rcx ;\n" - "movd %%xmm2, %%r8 ;\n" - "movd %%xmm3, %%rsi ;\n" - "pshufd $0xee, %%xmm2, %%xmm2 ;\n" - "pshufd $0xee, %%xmm3, %%xmm3 ;\n" - "movd %%xmm2, %%rdx ;\n" - "movd %%xmm3, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movl %%ecx, 40(%2) ;\n" - "movl %%r9d, 44(%2) ;\n" - "movl %%r8d, 48(%2) ;\n" - "movl %%r10d, 52(%2) ;\n" - "movl %%edx, 56(%2) ;\n" - "movl %%r11d, 60(%2) ;\n" - "movl %%esi, 64(%2) ;\n" - "movl %%r12d, 68(%2) ;\n" - "movl %%edi, 72(%2) ;\n" - "movl %%r13d, 76(%2) ;\n" - - /* extract t2d */ - "xorq %%rax, %%rax ;\n" - "movd %%xmm4, %%rcx ;\n" - "movd %%xmm4, %%r8 ;\n" - "movd %%xmm5, %%rsi ;\n" - "pshufd $0xee, %%xmm4, %%xmm4 ;\n" - "pshufd $0xee, %%xmm5, %%xmm5 ;\n" - "movd %%xmm4, %%rdx ;\n" - "movd %%xmm5, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "movq %%rcx, %%r9 ;\n" - "movq %%r8, %%r10 ;\n" - "movq %%rdx, %%r11 ;\n" - "movq %%rsi, %%r12 ;\n" - "movq %%rdi, %%r13 ;\n" - "shrq $26, %%r9 ;\n" - "shrq $26, %%r10 ;\n" - "shrq $26, %%r11 ;\n" - "shrq $26, %%r12 ;\n" - "shrq $26, %%r13 ;\n" - "andl $0x3ffffff, %%ecx ;\n" - "andl $0x1ffffff, %%r9d ;\n" - "andl $0x3ffffff, %%r8d ;\n" - "andl $0x1ffffff, %%r10d ;\n" - "andl $0x3ffffff, %%edx ;\n" - "andl $0x1ffffff, %%r11d ;\n" - "andl $0x3ffffff, %%esi ;\n" - "andl $0x1ffffff, %%r12d ;\n" - "andl $0x3ffffff, %%edi ;\n" - "andl $0x1ffffff, %%r13d ;\n" - "movd %%ecx, %%xmm0 ;\n" - "movd %%r9d, %%xmm4 ;\n" - "movd %%r8d, %%xmm8 ;\n" - "movd %%r10d, %%xmm3 ;\n" - "movd %%edx, %%xmm1 ;\n" - "movd %%r11d, %%xmm5 ;\n" - "movd %%esi, %%xmm6 ;\n" - "movd %%r12d, %%xmm7 ;\n" - "movd %%edi, %%xmm2 ;\n" - "movd %%r13d, %%xmm9 ;\n" - "punpckldq %%xmm4, %%xmm0 ;\n" - "punpckldq %%xmm3, %%xmm8 ;\n" - "punpckldq %%xmm5, %%xmm1 ;\n" - "punpckldq %%xmm7, %%xmm6 ;\n" - "punpckldq %%xmm9, %%xmm2 ;\n" - "punpcklqdq %%xmm8, %%xmm0 ;\n" - "punpcklqdq %%xmm6, %%xmm1 ;\n" - - /* set up 2p in to 3/4 */ - "movl $0x7ffffda, %%ecx ;\n" - "movl $0x3fffffe, %%edx ;\n" - "movl $0x7fffffe, %%eax ;\n" - "movd %%ecx, %%xmm3 ;\n" - "movd %%edx, %%xmm5 ;\n" - "movd %%eax, %%xmm4 ;\n" - "punpckldq %%xmm5, %%xmm3 ;\n" - "punpckldq %%xmm5, %%xmm4 ;\n" - "punpcklqdq %%xmm4, %%xmm3 ;\n" - "movdqa %%xmm4, %%xmm5 ;\n" - "punpcklqdq %%xmm4, %%xmm4 ;\n" - - /* subtract and conditionally move */ - "movl %3, %%ecx ;\n" - "sub $1, %%ecx ;\n" - "movd %%ecx, %%xmm6 ;\n" - "pshufd $0x00, %%xmm6, %%xmm6 ;\n" - "movdqa %%xmm6, %%xmm7 ;\n" - "psubd %%xmm0, %%xmm3 ;\n" - "psubd %%xmm1, %%xmm4 ;\n" - "psubd %%xmm2, %%xmm5 ;\n" - "pand %%xmm6, %%xmm0 ;\n" - "pand %%xmm6, %%xmm1 ;\n" - "pand %%xmm6, %%xmm2 ;\n" - "pandn %%xmm3, %%xmm6 ;\n" - "movdqa %%xmm7, %%xmm3 ;\n" - "pandn %%xmm4, %%xmm7 ;\n" - "pandn %%xmm5, %%xmm3 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm3, %%xmm2 ;\n" - - /* store t2d */ - "movdqa %%xmm0, 80(%2) ;\n" - "movdqa %%xmm1, 96(%2) ;\n" - "movd %%xmm2, %%rax ;\n" - "movq %%rax, 112(%2) ;\n" - : - : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ - : - "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", - "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", - "cc", "memory" - ); -} - -#endif /* defined(ED25519_GCC_64BIT_32BIT_CHOOSE) */ - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h deleted file mode 100644 index f6b557029..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-64bit-x86.h +++ /dev/null @@ -1,360 +0,0 @@ -#if defined(ED25519_GCC_64BIT_X86_CHOOSE) - -#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Woverlength-strings" -#endif - -DONNA_NOINLINE static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - int64_t breg = (int64_t)b; - uint64_t sign = (uint64_t)breg >> 63; - uint64_t mask = ~(sign - 1); - uint64_t u = (breg + mask) ^ mask; - - __asm__ __volatile__ ( - /* ysubx+xaddy+t2d */ - "movq %0, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm0 ;\n" - "pxor %%xmm1, %%xmm1 ;\n" - "pxor %%xmm2, %%xmm2 ;\n" - "pxor %%xmm3, %%xmm3 ;\n" - "pxor %%xmm4, %%xmm4 ;\n" - "pxor %%xmm5, %%xmm5 ;\n" - - /* 0 */ - "movq $0, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm6 ;\n" - "pxor %%xmm7, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm6, %%xmm2 ;\n" - "por %%xmm7, %%xmm3 ;\n" - - /* 1 */ - "movq $1, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 0(%1), %%xmm6 ;\n" - "movdqa 16(%1), %%xmm7 ;\n" - "movdqa 32(%1), %%xmm8 ;\n" - "movdqa 48(%1), %%xmm9 ;\n" - "movdqa 64(%1), %%xmm10 ;\n" - "movdqa 80(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 2 */ - "movq $2, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 96(%1), %%xmm6 ;\n" - "movdqa 112(%1), %%xmm7 ;\n" - "movdqa 128(%1), %%xmm8 ;\n" - "movdqa 144(%1), %%xmm9 ;\n" - "movdqa 160(%1), %%xmm10 ;\n" - "movdqa 176(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 3 */ - "movq $3, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 192(%1), %%xmm6 ;\n" - "movdqa 208(%1), %%xmm7 ;\n" - "movdqa 224(%1), %%xmm8 ;\n" - "movdqa 240(%1), %%xmm9 ;\n" - "movdqa 256(%1), %%xmm10 ;\n" - "movdqa 272(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 4 */ - "movq $4, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 288(%1), %%xmm6 ;\n" - "movdqa 304(%1), %%xmm7 ;\n" - "movdqa 320(%1), %%xmm8 ;\n" - "movdqa 336(%1), %%xmm9 ;\n" - "movdqa 352(%1), %%xmm10 ;\n" - "movdqa 368(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 5 */ - "movq $5, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 384(%1), %%xmm6 ;\n" - "movdqa 400(%1), %%xmm7 ;\n" - "movdqa 416(%1), %%xmm8 ;\n" - "movdqa 432(%1), %%xmm9 ;\n" - "movdqa 448(%1), %%xmm10 ;\n" - "movdqa 464(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 6 */ - "movq $6, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 480(%1), %%xmm6 ;\n" - "movdqa 496(%1), %%xmm7 ;\n" - "movdqa 512(%1), %%xmm8 ;\n" - "movdqa 528(%1), %%xmm9 ;\n" - "movdqa 544(%1), %%xmm10 ;\n" - "movdqa 560(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 7 */ - "movq $7, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 576(%1), %%xmm6 ;\n" - "movdqa 592(%1), %%xmm7 ;\n" - "movdqa 608(%1), %%xmm8 ;\n" - "movdqa 624(%1), %%xmm9 ;\n" - "movdqa 640(%1), %%xmm10 ;\n" - "movdqa 656(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* 8 */ - "movq $8, %%rax ;\n" - "movd %%rax, %%xmm15 ;\n" - "pshufd $0x00, %%xmm15, %%xmm15 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa 672(%1), %%xmm6 ;\n" - "movdqa 688(%1), %%xmm7 ;\n" - "movdqa 704(%1), %%xmm8 ;\n" - "movdqa 720(%1), %%xmm9 ;\n" - "movdqa 736(%1), %%xmm10 ;\n" - "movdqa 752(%1), %%xmm11 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pand %%xmm15, %%xmm8 ;\n" - "pand %%xmm15, %%xmm9 ;\n" - "pand %%xmm15, %%xmm10 ;\n" - "pand %%xmm15, %%xmm11 ;\n" - "por %%xmm6, %%xmm0 ;\n" - "por %%xmm7, %%xmm1 ;\n" - "por %%xmm8, %%xmm2 ;\n" - "por %%xmm9, %%xmm3 ;\n" - "por %%xmm10, %%xmm4 ;\n" - "por %%xmm11, %%xmm5 ;\n" - - /* conditionally swap ysubx and xaddy */ - "movq %3, %%rax ;\n" - "xorq $1, %%rax ;\n" - "movd %%rax, %%xmm14 ;\n" - "pxor %%xmm15, %%xmm15 ;\n" - "pshufd $0x00, %%xmm14, %%xmm14 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - "pcmpeqd %%xmm14, %%xmm15 ;\n" - "movdqa %%xmm2, %%xmm6 ;\n" - "movdqa %%xmm3, %%xmm7 ;\n" - "pand %%xmm15, %%xmm6 ;\n" - "pand %%xmm15, %%xmm7 ;\n" - "pxor %%xmm6, %%xmm0 ;\n" - "pxor %%xmm7, %%xmm1 ;\n" - "pxor %%xmm0, %%xmm2 ;\n" - "pxor %%xmm1, %%xmm3 ;\n" - - /* store ysubx */ - "movq $0x7ffffffffffff, %%rax ;\n" - "movd %%xmm0, %%rcx ;\n" - "movd %%xmm0, %%r8 ;\n" - "movd %%xmm1, %%rsi ;\n" - "pshufd $0xee, %%xmm0, %%xmm0 ;\n" - "pshufd $0xee, %%xmm1, %%xmm1 ;\n" - "movd %%xmm0, %%rdx ;\n" - "movd %%xmm1, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "andq %%rax, %%rcx ;\n" - "andq %%rax, %%r8 ;\n" - "andq %%rax, %%rdx ;\n" - "andq %%rax, %%rsi ;\n" - "andq %%rax, %%rdi ;\n" - "movq %%rcx, 0(%2) ;\n" - "movq %%r8, 8(%2) ;\n" - "movq %%rdx, 16(%2) ;\n" - "movq %%rsi, 24(%2) ;\n" - "movq %%rdi, 32(%2) ;\n" - - /* store xaddy */ - "movq $0x7ffffffffffff, %%rax ;\n" - "movd %%xmm2, %%rcx ;\n" - "movd %%xmm2, %%r8 ;\n" - "movd %%xmm3, %%rsi ;\n" - "pshufd $0xee, %%xmm2, %%xmm2 ;\n" - "pshufd $0xee, %%xmm3, %%xmm3 ;\n" - "movd %%xmm2, %%rdx ;\n" - "movd %%xmm3, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "andq %%rax, %%rcx ;\n" - "andq %%rax, %%r8 ;\n" - "andq %%rax, %%rdx ;\n" - "andq %%rax, %%rsi ;\n" - "andq %%rax, %%rdi ;\n" - "movq %%rcx, 40(%2) ;\n" - "movq %%r8, 48(%2) ;\n" - "movq %%rdx, 56(%2) ;\n" - "movq %%rsi, 64(%2) ;\n" - "movq %%rdi, 72(%2) ;\n" - - /* extract t2d */ - "movq $0x7ffffffffffff, %%rax ;\n" - "movd %%xmm4, %%rcx ;\n" - "movd %%xmm4, %%r8 ;\n" - "movd %%xmm5, %%rsi ;\n" - "pshufd $0xee, %%xmm4, %%xmm4 ;\n" - "pshufd $0xee, %%xmm5, %%xmm5 ;\n" - "movd %%xmm4, %%rdx ;\n" - "movd %%xmm5, %%rdi ;\n" - "shrdq $51, %%rdx, %%r8 ;\n" - "shrdq $38, %%rsi, %%rdx ;\n" - "shrdq $25, %%rdi, %%rsi ;\n" - "shrq $12, %%rdi ;\n" - "andq %%rax, %%rcx ;\n" - "andq %%rax, %%r8 ;\n" - "andq %%rax, %%rdx ;\n" - "andq %%rax, %%rsi ;\n" - "andq %%rax, %%rdi ;\n" - - /* conditionally negate t2d */ - "movq %3, %%rax ;\n" - "movq $0xfffffffffffda, %%r9 ;\n" - "movq $0xffffffffffffe, %%r10 ;\n" - "movq %%r10, %%r11 ;\n" - "movq %%r10, %%r12 ;\n" - "movq %%r10, %%r13 ;\n" - "subq %%rcx, %%r9 ;\n" - "subq %%r8, %%r10 ;\n" - "subq %%rdx, %%r11 ;\n" - "subq %%rsi, %%r12 ;\n" - "subq %%rdi, %%r13 ;\n" - "cmpq $1, %%rax ;\n" - "cmove %%r9, %%rcx ;\n" - "cmove %%r10, %%r8 ;\n" - "cmove %%r11, %%rdx ;\n" - "cmove %%r12, %%rsi ;\n" - "cmove %%r13, %%rdi ;\n" - - /* store t2d */ - "movq %%rcx, 80(%2) ;\n" - "movq %%r8, 88(%2) ;\n" - "movq %%rdx, 96(%2) ;\n" - "movq %%rsi, 104(%2) ;\n" - "movq %%rdi, 112(%2) ;\n" - : - : "m"(u), "r"(&table[pos * 8]), "r"(t), "m"(sign) /* %0 = u, %1 = table, %2 = t, %3 = sign */ - : - "%rax", "%rcx", "%rdx", "%rdi", "%rsi", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", - "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm14", "%xmm14", - "cc", "memory" - ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif /* defined(ED25519_GCC_64BIT_X86_CHOOSE) */ - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h deleted file mode 100644 index 41dcd526a..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-basepoint-table.h +++ /dev/null @@ -1,259 +0,0 @@ -/* multiples of the base point in packed {ysubx, xaddy, t2d} form */ -static const uint8_t ALIGN(16) ge25519_niels_base_multiples[256][96] = { - {0x3e,0x91,0x40,0xd7,0x05,0x39,0x10,0x9d,0xb3,0xbe,0x40,0xd1,0x05,0x9f,0x39,0xfd,0x09,0x8a,0x8f,0x68,0x34,0x84,0xc1,0xa5,0x67,0x12,0xf8,0x98,0x92,0x2f,0xfd,0x44,0x85,0x3b,0x8c,0xf5,0xc6,0x93,0xbc,0x2f,0x19,0x0e,0x8c,0xfb,0xc6,0x2d,0x93,0xcf,0xc2,0x42,0x3d,0x64,0x98,0x48,0x0b,0x27,0x65,0xba,0xd4,0x33,0x3a,0x9d,0xcf,0x07,0x59,0xbb,0x6f,0x4b,0x67,0x15,0xbd,0xdb,0xea,0xa5,0xa2,0xee,0x00,0x3f,0xe1,0x41,0xfa,0xc6,0x57,0xc9,0x1c,0x9d,0xd4,0xcd,0xca,0xec,0x16,0xaf,0x1f,0xbe,0x0e,0x4f}, - {0xa8,0xd5,0xb4,0x42,0x60,0xa5,0x99,0x8a,0xf6,0xac,0x60,0x4e,0x0c,0x81,0x2b,0x8f,0xaa,0x37,0x6e,0xb1,0x6b,0x23,0x9e,0xe0,0x55,0x25,0xc9,0x69,0xa6,0x95,0xb5,0x6b,0xd7,0x71,0x3c,0x93,0xfc,0xe7,0x24,0x92,0xb5,0xf5,0x0f,0x7a,0x96,0x9d,0x46,0x9f,0x02,0x07,0xd6,0xe1,0x65,0x9a,0xa6,0x5a,0x2e,0x2e,0x7d,0xa8,0x3f,0x06,0x0c,0x59,0x02,0x68,0xd3,0xda,0xaa,0x7e,0x34,0x6e,0x05,0x48,0xee,0x83,0x93,0x59,0xf3,0xba,0x26,0x68,0x07,0xe6,0x10,0xbe,0xca,0x3b,0xb8,0xd1,0x5e,0x16,0x0a,0x4f,0x31,0x49}, - {0x65,0xd2,0xfc,0xa4,0xe8,0x1f,0x61,0x56,0x7d,0xba,0xc1,0xe5,0xfd,0x53,0xd3,0x3b,0xbd,0xd6,0x4b,0x21,0x1a,0xf3,0x31,0x81,0x62,0xda,0x5b,0x55,0x87,0x15,0xb9,0x2a,0x30,0x97,0xee,0x4c,0xa8,0xb0,0x25,0xaf,0x8a,0x4b,0x86,0xe8,0x30,0x84,0x5a,0x02,0x32,0x67,0x01,0x9f,0x02,0x50,0x1b,0xc1,0xf4,0xf8,0x80,0x9a,0x1b,0x4e,0x16,0x7a,0x34,0x48,0x67,0xf1,0xf4,0x11,0xf2,0x9b,0x95,0xf8,0x2d,0xf6,0x17,0x6b,0x4e,0xb8,0x4e,0x2a,0x72,0x5b,0x07,0x6f,0xde,0xd7,0x21,0x2a,0xbb,0x63,0xb9,0x04,0x9a,0x54}, - {0xbf,0x18,0x68,0x05,0x0a,0x05,0xfe,0x95,0xa9,0xfa,0x60,0x56,0x71,0x89,0x7e,0x32,0x73,0x50,0xa0,0x06,0xcd,0xe3,0xe8,0xc3,0x9a,0xa4,0x45,0x74,0x4c,0x3f,0x93,0x27,0x9f,0x09,0xfc,0x8e,0xb9,0x51,0x73,0x28,0x38,0x25,0xfd,0x7d,0xf4,0xc6,0x65,0x67,0x65,0x92,0x0a,0xfb,0x3d,0x8d,0x34,0xca,0x27,0x87,0xe5,0x21,0x03,0x91,0x0e,0x68,0xb0,0x26,0x14,0xe5,0xec,0x45,0x1e,0xbf,0x94,0x0f,0xba,0x6d,0x3d,0xc6,0x2b,0xe3,0xc0,0x52,0xf8,0x8c,0xd5,0x74,0x29,0xe4,0x18,0x4c,0xe6,0xb0,0xb1,0x79,0xf0,0x44}, - {0xba,0xd6,0x47,0xa4,0xc3,0x82,0x91,0x7f,0xb7,0x29,0x27,0x4b,0xd1,0x14,0x00,0xd5,0x87,0xa0,0x64,0xb8,0x1c,0xf1,0x3c,0xe3,0xf3,0x55,0x1b,0xeb,0x73,0x7e,0x4a,0x15,0x33,0xbb,0xa5,0x08,0x44,0xbc,0x12,0xa2,0x02,0xed,0x5e,0xc7,0xc3,0x48,0x50,0x8d,0x44,0xec,0xbf,0x5a,0x0c,0xeb,0x1b,0xdd,0xeb,0x06,0xe2,0x46,0xf1,0xcc,0x45,0x29,0xb3,0x03,0xd0,0xe7,0x79,0xa1,0x32,0xc8,0x7e,0x4d,0x12,0x00,0x0a,0x9d,0x72,0x5f,0xf3,0x8f,0x6d,0x0e,0xa1,0xd4,0xc1,0x62,0x98,0x7a,0xb2,0x38,0x59,0xac,0xb8,0x68}, - {0xa4,0x8c,0x7d,0x7b,0xb6,0x06,0x98,0x49,0x39,0x27,0xd2,0x27,0x84,0xe2,0x5b,0x57,0xb9,0x53,0x45,0x20,0xe7,0x5c,0x08,0xbb,0x84,0x78,0x41,0xae,0x41,0x4c,0xb6,0x38,0x31,0x71,0x15,0x77,0xeb,0xee,0x0c,0x3a,0x88,0xaf,0xc8,0x00,0x89,0x15,0x27,0x9b,0x36,0xa7,0x59,0xda,0x68,0xb6,0x65,0x80,0xbd,0x38,0xcc,0xa2,0xb6,0x7b,0xe5,0x51,0xa4,0xe3,0x9d,0x68,0x91,0xad,0x9d,0x8f,0x37,0x91,0xfb,0xf8,0x28,0x24,0x5f,0x17,0x88,0xb9,0xcf,0x9f,0x32,0xb5,0x0a,0x05,0x9f,0xc0,0x54,0x13,0xa2,0xdf,0x65,0x78}, - {0xb1,0x21,0x32,0xaa,0x9a,0x2c,0x6f,0xba,0xa7,0x23,0xba,0x3b,0x53,0x21,0xa0,0x6c,0x3a,0x2c,0x19,0x92,0x4f,0x76,0xea,0x9d,0xe0,0x17,0x53,0x2e,0x5d,0xdd,0x6e,0x1d,0xbf,0xa3,0x4e,0x94,0xd0,0x5c,0x1a,0x6b,0xd2,0xc0,0x9d,0xb3,0x3a,0x35,0x70,0x74,0x49,0x2e,0x54,0x28,0x82,0x52,0xb2,0x71,0x7e,0x92,0x3c,0x28,0x69,0xea,0x1b,0x46,0x36,0xda,0x0f,0xab,0xac,0x8a,0x7a,0x21,0xc8,0x49,0x35,0x3d,0x54,0xc6,0x28,0xa5,0x68,0x75,0xab,0x13,0x8b,0x5b,0xd0,0x37,0x37,0xbc,0x2c,0x3a,0x62,0xef,0x3c,0x23}, - {0xd9,0x34,0x92,0xf3,0xed,0x5d,0xa7,0xe2,0xf9,0x58,0xb5,0xe1,0x80,0x76,0x3d,0x96,0xfb,0x23,0x3c,0x6e,0xac,0x41,0x27,0x2c,0xc3,0x01,0x0e,0x32,0xa1,0x24,0x90,0x3a,0x8f,0x3e,0xdd,0x04,0x66,0x59,0xb7,0x59,0x2c,0x70,0x88,0xe2,0x77,0x03,0xb3,0x6c,0x23,0xc3,0xd9,0x5e,0x66,0x9c,0x33,0xb1,0x2f,0xe5,0xbc,0x61,0x60,0xe7,0x15,0x09,0x7e,0xa3,0x34,0xa8,0x35,0xe8,0x7d,0xdf,0xea,0x57,0x98,0x68,0xda,0x9c,0xe1,0x8b,0x26,0xb3,0x67,0x71,0x36,0x85,0x11,0x2c,0xc2,0xd5,0xef,0xdb,0xd9,0xb3,0x9e,0x58}, - {0x5e,0x51,0xaa,0x49,0x54,0x63,0x5b,0xed,0x3a,0x82,0xc6,0x0b,0x9f,0xc4,0x65,0xa8,0xc4,0xd1,0x42,0x5b,0xe9,0x1f,0x0c,0x85,0xb9,0x15,0xd3,0x03,0x6f,0x6d,0xd7,0x30,0x1d,0x9c,0x2f,0x63,0x0e,0xdd,0xcc,0x2e,0x15,0x31,0x89,0x76,0x96,0xb6,0xd0,0x51,0x58,0x7a,0x63,0xa8,0x6b,0xb7,0xdf,0x52,0x39,0xef,0x0e,0xa0,0x49,0x7d,0xd3,0x6d,0xc7,0xe4,0x06,0x21,0x17,0x44,0x44,0x6c,0x69,0x7f,0x8d,0x92,0x80,0xd6,0x53,0xfb,0x26,0x3f,0x4d,0x69,0xa4,0x9e,0x73,0xb4,0xb0,0x4b,0x86,0x2e,0x11,0x97,0xc6,0x10}, - {0xde,0x5f,0xbe,0x7d,0x27,0xc4,0x93,0x64,0xa2,0x7e,0xad,0x19,0xad,0x4f,0x5d,0x26,0x90,0x45,0x30,0x46,0xc8,0xdf,0x00,0x0e,0x09,0xfe,0x66,0xed,0xab,0x1c,0xe6,0x25,0x05,0xc8,0x58,0x83,0xa0,0x2a,0xa6,0x0c,0x47,0x42,0x20,0x7a,0xe3,0x4a,0x3d,0x6a,0xdc,0xed,0x11,0x3b,0xa6,0xd3,0x64,0x74,0xef,0x06,0x08,0x55,0xaf,0x9b,0xbf,0x03,0x04,0x66,0x58,0xcc,0x28,0xe1,0x13,0x3f,0x7e,0x74,0x59,0xb4,0xec,0x73,0x58,0x6f,0xf5,0x68,0x12,0xcc,0xed,0x3d,0xb6,0xa0,0x2c,0xe2,0x86,0x45,0x63,0x78,0x6d,0x56}, - {0x34,0x08,0xc1,0x9c,0x9f,0xa4,0x37,0x16,0x51,0xc4,0x9b,0xa8,0xd5,0x56,0x8e,0xbc,0xdb,0xd2,0x7f,0x7f,0x0f,0xec,0xb5,0x1c,0xd9,0x35,0xcc,0x5e,0xca,0x5b,0x97,0x33,0xd0,0x2f,0x5a,0xc6,0x85,0x42,0x05,0xa1,0xc3,0x67,0x16,0xf3,0x2a,0x11,0x64,0x6c,0x58,0xee,0x1a,0x73,0x40,0xe2,0x0a,0x68,0x2a,0xb2,0x93,0x47,0xf3,0xa5,0xfb,0x14,0xd4,0xf7,0x85,0x69,0x16,0x46,0xd7,0x3c,0x57,0x00,0xc8,0xc9,0x84,0x5e,0x3e,0x59,0x1e,0x13,0x61,0x7b,0xb6,0xf2,0xc3,0x2f,0x6c,0x52,0xfc,0x83,0xea,0x9c,0x82,0x14}, - {0xc2,0x95,0xdd,0x97,0x84,0x7b,0x43,0xff,0xa7,0xb5,0x4e,0xaa,0x30,0x4e,0x74,0x6c,0x8b,0xe8,0x85,0x3c,0x61,0x5d,0x0c,0x9e,0x73,0x81,0x75,0x5f,0x1e,0xc7,0xd9,0x2f,0xb8,0xec,0x71,0x4e,0x2f,0x0b,0xe7,0x21,0xe3,0x77,0xa4,0x40,0xb9,0xdd,0x56,0xe6,0x80,0x4f,0x1d,0xce,0xce,0x56,0x65,0xbf,0x7e,0x7b,0x5d,0x53,0xc4,0x3b,0xfc,0x05,0xdd,0xde,0xaf,0x52,0xae,0xb3,0xb8,0x24,0xcf,0x30,0x3b,0xed,0x8c,0x63,0x95,0x34,0x95,0x81,0xbe,0xa9,0x83,0xbc,0xa4,0x33,0x04,0x1f,0x65,0x5c,0x47,0x67,0x37,0x37}, - {0xd9,0xad,0xd1,0x40,0xfd,0x99,0xba,0x2f,0x27,0xd0,0xf4,0x96,0x6f,0x16,0x07,0xb3,0xae,0x3b,0xf0,0x15,0x52,0xf0,0x63,0x43,0x99,0xf9,0x18,0x3b,0x6c,0xa5,0xbe,0x1f,0x90,0x65,0x24,0x14,0xcb,0x95,0x40,0x63,0x35,0x55,0xc1,0x16,0x40,0x14,0x12,0xef,0x60,0xbc,0x10,0x89,0x0c,0x14,0x38,0x9e,0x8c,0x7c,0x90,0x30,0x57,0x90,0xf5,0x6b,0x8a,0x5b,0x41,0xe1,0xf1,0x78,0xa7,0x0f,0x7e,0xa7,0xc3,0xba,0xf7,0x9f,0x40,0x06,0x50,0x9a,0xa2,0x9a,0xb8,0xd7,0x52,0x6f,0x56,0x5a,0x63,0x7a,0xf6,0x1c,0x52,0x02}, - {0x94,0x52,0x9d,0x0a,0x0b,0xee,0x3f,0x51,0x66,0x5a,0xdf,0x0f,0x5c,0xe7,0x98,0x8f,0xce,0x07,0xe1,0xbf,0x88,0x86,0x61,0xd4,0xed,0x2c,0x38,0x71,0x7e,0x0a,0xa0,0x3f,0xe4,0x5e,0x2f,0x77,0x20,0x67,0x14,0xb1,0xce,0x9a,0x07,0x96,0xb1,0x94,0xf8,0xe8,0x4a,0x82,0xac,0x00,0x4d,0x22,0xf8,0x4a,0xc4,0x6c,0xcd,0xf7,0xd9,0x53,0x17,0x00,0x34,0xdb,0x3d,0x96,0x2d,0x23,0x69,0x3c,0x58,0x38,0x97,0xb4,0xda,0x87,0xde,0x1d,0x85,0xf2,0x91,0xa0,0xf9,0xd1,0xd7,0xaa,0xb6,0xed,0x48,0xa0,0x2f,0xfe,0xb5,0x12}, - {0x4d,0xe3,0xfc,0x96,0xc4,0xfb,0xf0,0x71,0xed,0x5b,0xf3,0xad,0x6b,0x82,0xb9,0x73,0x61,0xc5,0x28,0xff,0x61,0x72,0x04,0xd2,0x6f,0x20,0xb1,0x6f,0xf9,0x76,0x9b,0x74,0x92,0x1e,0x6f,0xad,0x26,0x7c,0x2b,0xdf,0x13,0x89,0x4b,0x50,0x23,0xd3,0x66,0x4b,0xc3,0x8b,0x1c,0x75,0xc0,0x9d,0x40,0x8c,0xb8,0xc7,0x96,0x07,0xc2,0x93,0x7e,0x6f,0x05,0xae,0xa6,0xae,0x04,0xf6,0x5a,0x1f,0x99,0x9c,0xe4,0xbe,0xf1,0x51,0x23,0xc1,0x66,0x6b,0xff,0xee,0xb5,0x08,0xa8,0x61,0x51,0x21,0xe0,0x01,0x0f,0xc1,0xce,0x0f}, - {0x44,0x1e,0xfe,0x49,0xa6,0x58,0x4d,0x64,0x7e,0x77,0xad,0x31,0xa2,0xae,0xfc,0x21,0xd2,0xd0,0x7f,0x88,0x5a,0x1c,0x44,0x02,0xf3,0x11,0xc5,0x83,0x71,0xaa,0x01,0x49,0x45,0x4e,0x24,0xc4,0x9d,0xd2,0xf2,0x3d,0x0a,0xde,0xd8,0x93,0x74,0x0e,0x02,0x2b,0x4d,0x21,0x0c,0x82,0x7e,0x06,0xc8,0x6c,0x0a,0xb9,0xea,0x6f,0x16,0x79,0x37,0x41,0xf0,0xf8,0x1a,0x8c,0x54,0xb7,0xb1,0x08,0xb4,0x99,0x62,0x24,0x7c,0x7a,0x0f,0xce,0x39,0xd9,0x06,0x1e,0xf9,0xb0,0x60,0xf7,0x13,0x12,0x6d,0x72,0x7b,0x88,0xbb,0x41}, - {0xbe,0x46,0x43,0x74,0x44,0x7d,0xe8,0x40,0x25,0x2b,0xb5,0x15,0xd4,0xda,0x48,0x1d,0x3e,0x60,0x3b,0xa1,0x18,0x8a,0x3a,0x7c,0xf7,0xbd,0xcd,0x2f,0xc1,0x28,0xb7,0x4e,0xae,0x91,0x66,0x7c,0x59,0x4c,0x23,0x7e,0xc8,0xb4,0x85,0x0a,0x3d,0x9d,0x88,0x64,0xe7,0xfa,0x4a,0x35,0x0c,0xc9,0xe2,0xda,0x1d,0x9e,0x6a,0x0c,0x07,0x1e,0x87,0x0a,0x89,0x89,0xbc,0x4b,0x99,0xb5,0x01,0x33,0x60,0x42,0xdd,0x5b,0x3a,0xae,0x6b,0x73,0x3c,0x9e,0xd5,0x19,0xe2,0xad,0x61,0x0d,0x64,0xd4,0x85,0x26,0x0f,0x30,0xe7,0x3e}, - {0xb7,0xd6,0x7d,0x9e,0xe4,0x55,0xd2,0xf5,0xac,0x1e,0x0b,0x61,0x5c,0x11,0x16,0x80,0xca,0x87,0xe1,0x92,0x5d,0x97,0x99,0x3c,0xc2,0x25,0x91,0x97,0x62,0x57,0x81,0x13,0x18,0x75,0x1e,0x84,0x47,0x79,0xfa,0x43,0xd7,0x46,0x9c,0x63,0x59,0xfa,0xc6,0xe5,0x74,0x2b,0x05,0xe3,0x1d,0x5e,0x06,0xa1,0x30,0x90,0xb8,0xcf,0xa2,0xc6,0x47,0x7d,0xe0,0xd6,0xf0,0x8e,0x14,0xd0,0xda,0x3f,0x3c,0x6f,0x54,0x91,0x9a,0x74,0x3e,0x9d,0x57,0x81,0xbb,0x26,0x10,0x62,0xec,0x71,0x80,0xec,0xc9,0x34,0x8d,0xf5,0x8c,0x14}, - {0x27,0xf0,0x34,0x79,0xf6,0x92,0xa4,0x46,0xa9,0x0a,0x84,0xf6,0xbe,0x84,0x99,0x46,0x54,0x18,0x61,0x89,0x2a,0xbc,0xa1,0x5c,0xd4,0xbb,0x5d,0xbd,0x1e,0xfa,0xf2,0x3f,0x6d,0x75,0xe4,0x9a,0x7d,0x2f,0x57,0xe2,0x7f,0x48,0xf3,0x88,0xbb,0x45,0xc3,0x56,0x8d,0xa8,0x60,0x69,0x6d,0x0b,0xd1,0x9f,0xb9,0xa1,0xae,0x4e,0xad,0xeb,0x8f,0x27,0x66,0x39,0x93,0x8c,0x1f,0x68,0xaa,0xb1,0x98,0x0c,0x29,0x20,0x9c,0x94,0x21,0x8c,0x52,0x3c,0x9d,0x21,0x91,0x52,0x11,0x39,0x7b,0x67,0x9c,0xfe,0x02,0xdd,0x04,0x41}, - {0x2a,0x42,0x24,0x11,0x5e,0xbf,0xb2,0x72,0xb5,0x3a,0xa3,0x98,0x33,0x0c,0xfa,0xa1,0x66,0xb6,0x52,0xfa,0x01,0x61,0xcb,0x94,0xd5,0x53,0xaf,0xaf,0x00,0x3b,0x86,0x2c,0xb8,0x6a,0x09,0xdb,0x06,0x4e,0x21,0x81,0x35,0x4f,0xe4,0x0c,0xc9,0xb6,0xa8,0x21,0xf5,0x2a,0x9e,0x40,0x2a,0xc1,0x24,0x65,0x81,0xa4,0xfc,0x8e,0xa4,0xb5,0x65,0x01,0x76,0x6a,0x84,0xa0,0x74,0xa4,0x90,0xf1,0xc0,0x7c,0x2f,0xcd,0x84,0xf9,0xef,0x12,0x8f,0x2b,0xaa,0x58,0x06,0x29,0x5e,0x69,0xb8,0xc8,0xfe,0xbf,0xd9,0x67,0x1b,0x59}, - {0xfa,0x9b,0xb4,0x80,0x1c,0x0d,0x2f,0x31,0x8a,0xec,0xf3,0xab,0x5e,0x51,0x79,0x59,0x88,0x1c,0xf0,0x9e,0xc0,0x33,0x70,0x72,0xcb,0x7b,0x8f,0xca,0xc7,0x2e,0xe0,0x3d,0x5d,0xb5,0x18,0x9f,0x71,0xb3,0xb9,0x99,0x1e,0x64,0x8c,0xa1,0xfa,0xe5,0x65,0xe4,0xed,0x05,0x9f,0xc2,0x36,0x11,0x08,0x61,0x8b,0x12,0x30,0x70,0x86,0x4f,0x9b,0x48,0xef,0x92,0xeb,0x3a,0x2d,0x10,0x32,0xd2,0x61,0xa8,0x16,0x61,0xb4,0x53,0x62,0xe1,0x24,0xaa,0x0b,0x19,0xe7,0xab,0x7e,0x3d,0xbf,0xbe,0x6c,0x49,0xba,0xfb,0xf5,0x49}, - {0xd4,0xcf,0x5b,0x8a,0x10,0x9a,0x94,0x30,0xeb,0x73,0x64,0xbc,0x70,0xdd,0x40,0xdc,0x1c,0x0d,0x7c,0x30,0xc1,0x94,0xc2,0x92,0x74,0x6e,0xfa,0xcb,0x6d,0xa8,0x04,0x56,0x2e,0x57,0x9c,0x1e,0x8c,0x62,0x5d,0x15,0x41,0x47,0x88,0xc5,0xac,0x86,0x4d,0x8a,0xeb,0x63,0x57,0x51,0xf6,0x52,0xa3,0x91,0x5b,0x51,0x67,0x88,0xc2,0xa6,0xa1,0x06,0xb6,0x64,0x17,0x7c,0xd4,0xd1,0x88,0x72,0x51,0x8b,0x41,0xe0,0x40,0x11,0x54,0x72,0xd1,0xf6,0xac,0x18,0x60,0x1a,0x03,0x9f,0xc6,0x42,0x27,0xfe,0x89,0x9e,0x98,0x20}, - {0x7f,0xcc,0x2d,0x3a,0xfd,0x77,0x97,0x49,0x92,0xd8,0x4f,0xa5,0x2c,0x7c,0x85,0x32,0xa0,0xe3,0x07,0xd2,0x64,0xd8,0x79,0xa2,0x29,0x7e,0xa6,0x0c,0x1d,0xed,0x03,0x04,0x2e,0xec,0xea,0x85,0x8b,0x27,0x74,0x16,0xdf,0x2b,0xcb,0x7a,0x07,0xdc,0x21,0x56,0x5a,0xf4,0xcb,0x61,0x16,0x4c,0x0a,0x64,0xd3,0x95,0x05,0xf7,0x50,0x99,0x0b,0x73,0x52,0xc5,0x4e,0x87,0x35,0x2d,0x4b,0xc9,0x8d,0x6f,0x24,0x98,0xcf,0xc8,0xe6,0xc5,0xce,0x35,0xc0,0x16,0xfa,0x46,0xcb,0xf7,0xcc,0x3d,0x30,0x08,0x43,0x45,0xd7,0x5b}, - {0xc2,0x4c,0xb2,0x28,0x95,0xd1,0x9a,0x7f,0x81,0xc1,0x35,0x63,0x65,0x54,0x6b,0x7f,0x36,0x72,0xc0,0x4f,0x6e,0xb6,0xb8,0x66,0x83,0xad,0x80,0x73,0x00,0x78,0x3a,0x13,0x2a,0x79,0xe7,0x15,0x21,0x93,0xc4,0x85,0xc9,0xdd,0xcd,0xbd,0xa2,0x89,0x4c,0xc6,0x62,0xd7,0xa3,0xad,0xa8,0x3d,0x1e,0x9d,0x2c,0xf8,0x67,0x30,0x12,0xdb,0xb7,0x5b,0xbe,0x62,0xca,0xc6,0x67,0xf4,0x61,0x09,0xee,0x52,0x19,0x21,0xd6,0x21,0xec,0x04,0x70,0x47,0xd5,0x9b,0x77,0x60,0x23,0x18,0xd2,0xe0,0xf0,0x58,0x6d,0xca,0x0d,0x74}, - {0x4e,0xce,0xcf,0x52,0x07,0xee,0x48,0xdf,0xb7,0x08,0xec,0x06,0xf3,0xfa,0xff,0xc3,0xc4,0x59,0x54,0xb9,0x2a,0x0b,0x71,0x05,0x8d,0xa3,0x3e,0x96,0xfa,0x25,0x1d,0x16,0x3c,0x43,0x78,0x04,0x57,0x8c,0x1a,0x23,0x9d,0x43,0x81,0xc2,0x0e,0x27,0xb5,0xb7,0x9f,0x07,0xd9,0xe3,0xea,0x99,0xaa,0xdb,0xd9,0x03,0x2b,0x6c,0x25,0xf5,0x03,0x2c,0x7d,0xa4,0x53,0x7b,0x75,0x18,0x0f,0x79,0x79,0x58,0x0c,0xcf,0x30,0x01,0x7b,0x30,0xf9,0xf7,0x7e,0x25,0x77,0x3d,0x90,0x31,0xaf,0xbb,0x96,0xbd,0xbd,0x68,0x94,0x69}, - {0xcf,0xfe,0xda,0xf4,0x46,0x2f,0x1f,0xbd,0xf7,0xd6,0x7f,0xa4,0x14,0x01,0xef,0x7c,0x7f,0xb3,0x47,0x4a,0xda,0xfd,0x1f,0xd3,0x85,0x57,0x90,0x73,0xa4,0x19,0x52,0x52,0x48,0x19,0xa9,0x6a,0xe6,0x3d,0xdd,0xd8,0xcc,0xd2,0xc0,0x2f,0xc2,0x64,0x50,0x48,0x2f,0xea,0xfd,0x34,0x66,0x24,0x48,0x9b,0x3a,0x2e,0x4a,0x6c,0x4e,0x1c,0x3e,0x29,0xe1,0x12,0x51,0x92,0x4b,0x13,0x6e,0x37,0xa0,0x5d,0xa1,0xdc,0xb5,0x78,0x37,0x70,0x11,0x31,0x1c,0x46,0xaf,0x89,0x45,0xb0,0x23,0x28,0x03,0x7f,0x44,0x5c,0x60,0x5b}, - {0x89,0x7c,0xc4,0x20,0x59,0x80,0x65,0xb9,0xcc,0x8f,0x3b,0x92,0x0c,0x10,0xf0,0xe7,0x77,0xef,0xe2,0x02,0x65,0x25,0x01,0x00,0xee,0xb3,0xae,0xa8,0xce,0x6d,0xa7,0x24,0x4c,0xf0,0xe7,0xf0,0xc6,0xfe,0xe9,0x3b,0x62,0x49,0xe3,0x75,0x9e,0x57,0x6a,0x86,0x1a,0xe6,0x1d,0x1e,0x16,0xef,0x42,0x55,0xd5,0xbd,0x5a,0xcc,0xf4,0xfe,0x12,0x2f,0x40,0xc7,0xc0,0xdf,0xb2,0x22,0x45,0x0a,0x07,0xa4,0xc9,0x40,0x7f,0x6e,0xd0,0x10,0x68,0xf6,0xcf,0x78,0x41,0x14,0xcf,0xc6,0x90,0x37,0xa4,0x18,0x25,0x7b,0x60,0x5e}, - {0x18,0x18,0xdf,0x6c,0x8f,0x1d,0xb3,0x58,0xa2,0x58,0x62,0xc3,0x4f,0xa7,0xcf,0x35,0x6e,0x1d,0xe6,0x66,0x4f,0xff,0xb3,0xe1,0xf7,0xd5,0xcd,0x6c,0xab,0xac,0x67,0x50,0x14,0xcf,0x96,0xa5,0x1c,0x43,0x2c,0xa0,0x00,0xe4,0xd3,0xae,0x40,0x2d,0xc4,0xe3,0xdb,0x26,0x0f,0x2e,0x80,0x26,0x45,0xd2,0x68,0x70,0x45,0x9e,0x13,0x33,0x1f,0x20,0x51,0x9d,0x03,0x08,0x6b,0x7f,0x52,0xfd,0x06,0x00,0x7c,0x01,0x64,0x49,0xb1,0x18,0xa8,0xa4,0x25,0x2e,0xb0,0x0e,0x22,0xd5,0x75,0x03,0x46,0x62,0x88,0xba,0x7c,0x39}, - {0xb2,0x59,0x59,0xf0,0x93,0x30,0xc1,0x30,0x76,0x79,0xa9,0xe9,0x8d,0xa1,0x3a,0xe2,0x26,0x5e,0x1d,0x72,0x91,0xd4,0x2f,0x22,0x3a,0x6c,0x6e,0x76,0x20,0xd3,0x39,0x23,0xe7,0x79,0x13,0xc8,0xfb,0xc3,0x15,0x78,0xf1,0x2a,0xe1,0xdd,0x20,0x94,0x61,0xa6,0xd5,0xfd,0xa8,0x85,0xf8,0xc0,0xa9,0xff,0x52,0xc2,0xe1,0xc1,0x22,0x40,0x1b,0x77,0xa7,0x2f,0x3a,0x51,0x86,0xd9,0x7d,0xd8,0x08,0xcf,0xd4,0xf9,0x71,0x9b,0xac,0xf5,0xb3,0x83,0xa2,0x1e,0x1b,0xc3,0x6b,0xd0,0x76,0x1a,0x97,0x19,0x92,0x18,0x1a,0x33}, - {0xc6,0x80,0x4f,0xfb,0x45,0x6f,0x16,0xf5,0xcf,0x75,0xc7,0x61,0xde,0xc7,0x36,0x9c,0x1c,0xd9,0x41,0x90,0x1b,0xe8,0xd4,0xe3,0x21,0xfe,0xbd,0x83,0x6b,0x7c,0x16,0x31,0xaf,0x72,0x75,0x9d,0x3a,0x2f,0x51,0x26,0x9e,0x4a,0x07,0x68,0x88,0xe2,0xcb,0x5b,0xc4,0xf7,0x80,0x11,0xc1,0xc1,0xed,0x84,0x7b,0xa6,0x49,0xf6,0x9f,0x61,0xc9,0x1a,0x68,0x10,0x4b,0x52,0x42,0x38,0x2b,0xf2,0x87,0xe9,0x9c,0xee,0x3b,0x34,0x68,0x50,0xc8,0x50,0x62,0x4a,0x84,0x71,0x9d,0xfc,0x11,0xb1,0x08,0x1f,0x34,0x36,0x24,0x61}, - {0x8d,0x89,0x4e,0x87,0xdb,0x41,0x9d,0xd9,0x20,0xdc,0x07,0x6c,0xf1,0xa5,0xfe,0x09,0xbc,0x9b,0x0f,0xd0,0x67,0x2c,0x3d,0x79,0x40,0xff,0x5e,0x9e,0x30,0xe2,0xeb,0x46,0x38,0x26,0x2d,0x1a,0xe3,0x49,0x63,0x8b,0x35,0xfd,0xd3,0x9b,0x00,0xb7,0xdf,0x9d,0xa4,0x6b,0xa0,0xa3,0xb8,0xf1,0x8b,0x7f,0x45,0x04,0xd9,0x78,0x31,0xaa,0x22,0x15,0x38,0x49,0x61,0x69,0x53,0x2f,0x38,0x2c,0x10,0x6d,0x2d,0xb7,0x9a,0x40,0xfe,0xda,0x27,0xf2,0x46,0xb6,0x91,0x33,0xc8,0xe8,0x6c,0x30,0x24,0x05,0xf5,0x70,0xfe,0x45}, - {0x8c,0x0b,0x0c,0x96,0xa6,0x75,0x48,0xda,0x20,0x2f,0x0e,0xef,0x76,0xd0,0x68,0x5b,0xd4,0x8f,0x0b,0x3d,0xcf,0x51,0xfb,0x07,0xd4,0x92,0xe3,0xa0,0x23,0x16,0x8d,0x42,0x91,0x14,0x95,0xc8,0x20,0x49,0xf2,0x62,0xa2,0x0c,0x63,0x3f,0xc8,0x07,0xf0,0x05,0xb8,0xd4,0xc9,0xf5,0xd2,0x45,0xbb,0x6f,0x45,0x22,0x7a,0xb5,0x6d,0x9f,0x61,0x16,0xfd,0x08,0xa3,0x01,0x44,0x4a,0x4f,0x08,0xac,0xca,0xa5,0x76,0xc3,0x19,0x22,0xa8,0x7d,0xbc,0xd1,0x43,0x46,0xde,0xb8,0xde,0xc6,0x38,0xbd,0x60,0x2d,0x59,0x81,0x1d}, - {0x5f,0xac,0x0d,0xa6,0x56,0x87,0x36,0x61,0x57,0xdc,0xab,0xeb,0x6a,0x2f,0xe0,0x17,0x7d,0x0f,0xce,0x4c,0x2d,0x3f,0x19,0x7f,0xf0,0xdc,0xec,0x89,0x77,0x4a,0x23,0x20,0xe8,0xc5,0x85,0x7b,0x9f,0xb6,0x65,0x87,0xb2,0xba,0x68,0xd1,0x8b,0x67,0xf0,0x6f,0x9b,0x0f,0x33,0x1d,0x7c,0xe7,0x70,0x3a,0x7c,0x8e,0xaf,0xb0,0x51,0x6d,0x5f,0x3a,0x52,0xb2,0x78,0x71,0xb6,0x0d,0xd2,0x76,0x60,0xd1,0x1e,0xd5,0xf9,0x34,0x1c,0x07,0x70,0x11,0xe4,0xb3,0x20,0x4a,0x2a,0xf6,0x66,0xe3,0xff,0x3c,0x35,0x82,0xd6,0x7c}, - {0xb6,0xfa,0x87,0xd8,0x5b,0xa4,0xe1,0x0b,0x6e,0x3b,0x40,0xba,0x32,0x6a,0x84,0x2a,0x00,0x60,0x6e,0xe9,0x12,0x10,0x92,0xd9,0x43,0x09,0xdc,0x3b,0x86,0xc8,0x38,0x28,0xf3,0xf4,0xac,0x68,0x60,0xcd,0x65,0xa6,0xd3,0xe3,0xd7,0x3c,0x18,0x2d,0xd9,0x42,0xd9,0x25,0x60,0x33,0x9d,0x38,0x59,0x57,0xff,0xd8,0x2c,0x2b,0x3b,0x25,0xf0,0x3e,0x30,0x50,0x46,0x4a,0xcf,0xb0,0x6b,0xd1,0xab,0x77,0xc5,0x15,0x41,0x6b,0x49,0xfa,0x9d,0x41,0xab,0xf4,0x8a,0xae,0xcf,0x82,0x12,0x28,0xa8,0x06,0xa6,0xb8,0xdc,0x21}, - {0xc8,0x9f,0x9d,0x8c,0x46,0x04,0x60,0x5c,0xcb,0xa3,0x2a,0xd4,0x6e,0x09,0x40,0x25,0x9c,0x2f,0xee,0x12,0x4c,0x4d,0x5b,0x12,0xab,0x1d,0xa3,0x94,0x81,0xd0,0xc3,0x0b,0xba,0x31,0x77,0xbe,0xfa,0x00,0x8d,0x9a,0x89,0x18,0x9e,0x62,0x7e,0x60,0x03,0x82,0x7f,0xd9,0xf3,0x43,0x37,0x02,0xcc,0xb2,0x8b,0x67,0x6f,0x6c,0xbf,0x0d,0x84,0x5d,0x8b,0xe1,0x9f,0x30,0x0d,0x38,0x6e,0x70,0xc7,0x65,0xe1,0xb9,0xa6,0x2d,0xb0,0x6e,0xab,0x20,0xae,0x7d,0x99,0xba,0xbb,0x57,0xdd,0x96,0xc1,0x2a,0x23,0x76,0x42,0x3a}, - {0xfa,0x84,0x70,0x8a,0x2c,0x43,0x42,0x4b,0x45,0xe5,0xb9,0xdf,0xe3,0x19,0x8a,0x89,0x5d,0xe4,0x58,0x9c,0x21,0x00,0x9f,0xbe,0xd1,0xeb,0x6d,0xa1,0xce,0x77,0xf1,0x1f,0xcb,0x7e,0x44,0xdb,0x72,0xc1,0xf8,0x3b,0xbd,0x2d,0x28,0xc6,0x1f,0xc4,0xcf,0x5f,0xfe,0x15,0xaa,0x75,0xc0,0xff,0xac,0x80,0xf9,0xa9,0xe1,0x24,0xe8,0xc9,0x70,0x07,0xfd,0xb5,0xb5,0x45,0x9a,0xd9,0x61,0xcf,0x24,0x79,0x3a,0x1b,0xe9,0x84,0x09,0x86,0x89,0x3e,0x3e,0x30,0x19,0x09,0x30,0xe7,0x1e,0x0b,0x50,0x41,0xfd,0x64,0xf2,0x39}, - {0x9c,0xe2,0xe7,0xdb,0x17,0x34,0xad,0xa7,0x9c,0x13,0x9c,0x2b,0x6a,0x37,0x94,0xbd,0xa9,0x7b,0x59,0x93,0x8e,0x1b,0xe9,0xa0,0x40,0x98,0x88,0x68,0x34,0xd7,0x12,0x17,0xe1,0x7b,0x09,0xfe,0xab,0x4a,0x9b,0xd1,0x29,0x19,0xe0,0xdf,0xe1,0xfc,0x6d,0xa4,0xff,0xf1,0xa6,0x2c,0x94,0x08,0xc9,0xc3,0x4e,0xf1,0x35,0x2c,0x27,0x21,0xc6,0x65,0xdd,0x93,0x31,0xce,0xf8,0x89,0x2b,0xe7,0xbb,0xc0,0x25,0xa1,0x56,0x33,0x10,0x4d,0x83,0xfe,0x1c,0x2e,0x3d,0xa9,0x19,0x04,0x72,0xe2,0x9c,0xb1,0x0a,0x80,0xf9,0x22}, - {0xcb,0xf8,0x9e,0x3e,0x8a,0x36,0x5a,0x60,0x15,0x47,0x50,0xa5,0x22,0xc0,0xe9,0xe3,0x8f,0x24,0x24,0x5f,0xb0,0x48,0x3d,0x55,0xe5,0x26,0x76,0x64,0xcd,0x16,0xf4,0x13,0xac,0xfd,0x6e,0x9a,0xdd,0x9f,0x02,0x42,0x41,0x49,0xa5,0x34,0xbe,0xce,0x12,0xb9,0x7b,0xf3,0xbd,0x87,0xb9,0x64,0x0f,0x64,0xb4,0xca,0x98,0x85,0xd3,0xa4,0x71,0x41,0x8c,0x4c,0xc9,0x99,0xaa,0x58,0x27,0xfa,0x07,0xb8,0x00,0xb0,0x6f,0x6f,0x00,0x23,0x92,0x53,0xda,0xad,0xdd,0x91,0xd2,0xfb,0xab,0xd1,0x4b,0x57,0xfa,0x14,0x82,0x50}, - {0x4b,0xfe,0xd6,0x3e,0x15,0x69,0x02,0xc2,0xc4,0x77,0x1d,0x51,0x39,0x67,0x5a,0xa6,0x94,0xaf,0x14,0x2c,0x46,0x26,0xde,0xcb,0x4b,0xa7,0xab,0x6f,0xec,0x60,0xf9,0x22,0xd6,0x03,0xd0,0x53,0xbb,0x15,0x1a,0x46,0x65,0xc9,0xf3,0xbc,0x88,0x28,0x10,0xb2,0x5a,0x3a,0x68,0x6c,0x75,0x76,0xc5,0x27,0x47,0xb4,0x6c,0xc8,0xa4,0x58,0x77,0x3a,0x76,0x50,0xae,0x93,0xf6,0x11,0x81,0x54,0xa6,0x54,0xfd,0x1d,0xdf,0x21,0xae,0x1d,0x65,0x5e,0x11,0xf3,0x90,0x8c,0x24,0x12,0x94,0xf4,0xe7,0x8d,0x5f,0xd1,0x9f,0x5d}, - {0x7f,0x72,0x63,0x6d,0xd3,0x08,0x14,0x03,0x33,0xb5,0xc7,0xd7,0xef,0x9a,0x37,0x6a,0x4b,0xe2,0xae,0xcc,0xc5,0x8f,0xe1,0xa9,0xd3,0xbe,0x8f,0x4f,0x91,0x35,0x2f,0x33,0x1e,0x52,0xd7,0xee,0x2a,0x4d,0x24,0x3f,0x15,0x96,0x2e,0x43,0x28,0x90,0x3a,0x8e,0xd4,0x16,0x9c,0x2e,0x77,0xba,0x64,0xe1,0xd8,0x98,0xeb,0x47,0xfa,0x87,0xc1,0x3b,0x0c,0xc2,0x86,0xea,0x15,0x01,0x47,0x6d,0x25,0xd1,0x46,0x6c,0xcb,0xb7,0x8a,0x99,0x88,0x01,0x66,0x3a,0xb5,0x32,0x78,0xd7,0x03,0xba,0x6f,0x90,0xce,0x81,0x0d,0x45}, - {0x75,0x52,0x20,0xa6,0xa1,0xb6,0x7b,0x6e,0x83,0x8e,0x3c,0x41,0xd7,0x21,0x4f,0xaa,0xb2,0x5c,0x8f,0xe8,0x55,0xd1,0x56,0x6f,0xe1,0x5b,0x34,0xa6,0x4b,0x5d,0xe2,0x2d,0x3f,0x74,0xae,0x1c,0x96,0xd8,0x74,0xd0,0xed,0x63,0x1c,0xee,0xf5,0x18,0x6d,0xf8,0x29,0xed,0xf4,0xe7,0x5b,0xc5,0xbd,0x97,0x08,0xb1,0x3a,0x66,0x79,0xd2,0xba,0x4c,0xcd,0x1f,0xd7,0xa0,0x24,0x90,0xd1,0x80,0xf8,0x8a,0x28,0xfb,0x0a,0xc2,0x25,0xc5,0x19,0x64,0x3a,0x5f,0x4b,0x97,0xa3,0xb1,0x33,0x72,0x00,0xe2,0xef,0xbc,0x7f,0x7d}, - {0x01,0x28,0x6b,0x26,0x6a,0x1e,0xef,0xfa,0x16,0x9f,0x73,0xd5,0xc4,0x68,0x6c,0x86,0x2c,0x76,0x03,0x1b,0xbc,0x2f,0x8a,0xf6,0x8d,0x5a,0xb7,0x87,0x5e,0x43,0x75,0x59,0x94,0x90,0xc2,0xf3,0xc5,0x5d,0x7c,0xcd,0xab,0x05,0x91,0x2a,0x9a,0xa2,0x81,0xc7,0x58,0x30,0x1c,0x42,0x36,0x1d,0xc6,0x80,0xd7,0xd4,0xd8,0xdc,0x96,0xd1,0x9c,0x4f,0x68,0x37,0x7b,0x6a,0xd8,0x97,0x92,0x19,0x63,0x7a,0xd1,0x1a,0x24,0x58,0xd0,0xd0,0x17,0x0c,0x1c,0x5c,0xad,0x9c,0x02,0xba,0x07,0x03,0x7a,0x38,0x84,0xd0,0xcd,0x7c}, - {0x17,0x04,0x26,0x6d,0x2c,0x42,0xa6,0xdc,0xbd,0x40,0x82,0x94,0x50,0x3d,0x15,0xae,0x77,0xc6,0x68,0xfb,0xb4,0xc1,0xc0,0xa9,0x53,0xcf,0xd0,0x61,0xed,0xd0,0x8b,0x42,0x93,0xcc,0x60,0x67,0x18,0x84,0x0c,0x9b,0x99,0x2a,0xb3,0x1a,0x7a,0x00,0xae,0xcd,0x18,0xda,0x0b,0x62,0x86,0xec,0x8d,0xa8,0x44,0xca,0x90,0x81,0x84,0xca,0x93,0x35,0xa7,0x9a,0x84,0x5e,0x9a,0x18,0x13,0x92,0xcd,0xfa,0xd8,0x65,0x35,0xc3,0xd8,0xd4,0xd1,0xbb,0xfd,0x53,0x5b,0x54,0x52,0x8c,0xe6,0x63,0x2d,0xda,0x08,0x83,0x39,0x27}, - {0x13,0xd4,0x5e,0x43,0x28,0x8d,0xc3,0x42,0xc9,0xcc,0x78,0x32,0x60,0xf3,0x50,0xbd,0xef,0x03,0xda,0x79,0x1a,0xab,0x07,0xbb,0x55,0x33,0x8c,0xbe,0xae,0x97,0x95,0x26,0x53,0x24,0x70,0x0a,0x4c,0x0e,0xa1,0xb9,0xde,0x1b,0x7d,0xd5,0x66,0x58,0xa2,0x0f,0xf7,0xda,0x27,0xcd,0xb5,0xd9,0xb9,0xff,0xfd,0x33,0x2c,0x49,0x45,0x29,0x2c,0x57,0xbe,0x30,0xcd,0xd6,0x45,0xc7,0x7f,0xc7,0xfb,0xae,0xba,0xe3,0xd3,0xe8,0xdf,0xe4,0x0c,0xda,0x5d,0xaa,0x30,0x88,0x2c,0xa2,0x80,0xca,0x5b,0xc0,0x98,0x54,0x98,0x7f}, - {0x17,0xe1,0x0b,0x9f,0x88,0xce,0x49,0x38,0x88,0xa2,0x54,0x7b,0x1b,0xad,0x05,0x80,0x1c,0x92,0xfc,0x23,0x9f,0xc3,0xa3,0x3d,0x04,0xf3,0x31,0x0a,0x47,0xec,0xc2,0x76,0x63,0x63,0xbf,0x0f,0x52,0x15,0x56,0xd3,0xa6,0xfb,0x4d,0xcf,0x45,0x5a,0x04,0x08,0xc2,0xa0,0x3f,0x87,0xbc,0x4f,0xc2,0xee,0xe7,0x12,0x9b,0xd6,0x3c,0x65,0xf2,0x30,0x85,0x0c,0xc1,0xaa,0x38,0xc9,0x08,0x8a,0xcb,0x6b,0x27,0xdb,0x60,0x9b,0x17,0x46,0x70,0xac,0x6f,0x0e,0x1e,0xc0,0x20,0xa9,0xda,0x73,0x64,0x59,0xf1,0x73,0x12,0x2f}, - {0x11,0x1e,0xe0,0x8a,0x7c,0xfc,0x39,0x47,0x9f,0xab,0x6a,0x4a,0x90,0x74,0x52,0xfd,0x2e,0x8f,0x72,0x87,0x82,0x8a,0xd9,0x41,0xf2,0x69,0x5b,0xd8,0x2a,0x57,0x9e,0x5d,0xc0,0x0b,0xa7,0x55,0xd7,0x8b,0x48,0x30,0xe7,0x42,0xd4,0xf1,0xa4,0xb5,0xd6,0x06,0x62,0x61,0x59,0xbc,0x9e,0xa6,0xd1,0xea,0x84,0xf7,0xc5,0xed,0x97,0x19,0xac,0x38,0x3b,0xb1,0x51,0xa7,0x17,0xb5,0x66,0x06,0x8c,0x85,0x9b,0x7e,0x86,0x06,0x7d,0x74,0x49,0xde,0x4d,0x45,0x11,0xc0,0xac,0xac,0x9c,0xe6,0xe9,0xbf,0x9c,0xcd,0xdf,0x22}, - {0xd9,0x0c,0x0d,0xc3,0xe0,0xd2,0xdb,0x8d,0x33,0x43,0xbb,0xac,0x5f,0x66,0x8e,0xad,0x1f,0x96,0x2a,0x32,0x8c,0x25,0x6b,0x8f,0xc7,0xc1,0x48,0x54,0xc0,0x16,0x29,0x6b,0xa1,0xe0,0x3b,0x10,0xb4,0x59,0xec,0x56,0x69,0xf9,0x59,0xd2,0xec,0xba,0xe3,0x2e,0x32,0xcd,0xf5,0x13,0x94,0xb2,0x7c,0x79,0x72,0xe4,0xcd,0x24,0x78,0x87,0xe9,0x0f,0x3b,0x91,0xba,0x0a,0xd1,0x34,0xdb,0x7e,0x0e,0xac,0x6d,0x2e,0x82,0xcd,0xa3,0x4e,0x15,0xf8,0x78,0x65,0xff,0x3d,0x08,0x66,0x17,0x0a,0xf0,0x7f,0x30,0x3f,0x30,0x4c}, - {0x85,0x8c,0xb2,0x17,0xd6,0x3b,0x0a,0xd3,0xea,0x3b,0x77,0x39,0xb7,0x77,0xd3,0xc5,0xbf,0x5c,0x6a,0x1e,0x8c,0xe7,0xc6,0xc6,0xc4,0xb7,0x2a,0x8b,0xf7,0xb8,0x61,0x0d,0x00,0x45,0xd9,0x0d,0x58,0x03,0xfc,0x29,0x93,0xec,0xbb,0x6f,0xa4,0x7a,0xd2,0xec,0xf8,0xa7,0xe2,0xc2,0x5f,0x15,0x0a,0x13,0xd5,0xa1,0x06,0xb7,0x1a,0x15,0x6b,0x41,0xb0,0x36,0xc1,0xe9,0xef,0xd7,0xa8,0x56,0x20,0x4b,0xe4,0x58,0xcd,0xe5,0x07,0xbd,0xab,0xe0,0x57,0x1b,0xda,0x2f,0xe6,0xaf,0xd2,0xe8,0x77,0x42,0xf7,0x2a,0x1a,0x19}, - {0x31,0x14,0x3c,0xc5,0x4b,0xf7,0x16,0xce,0xde,0xed,0x72,0x20,0xce,0x25,0x97,0x2b,0xe7,0x3e,0xb2,0xb5,0x6f,0xc3,0xb9,0xb8,0x08,0xc9,0x5c,0x0b,0x45,0x0e,0x2e,0x7e,0xfb,0x0e,0x46,0x4f,0x43,0x2b,0xe6,0x9f,0xd6,0x07,0x36,0xa6,0xd4,0x03,0xd3,0xde,0x24,0xda,0xa0,0xb7,0x0e,0x21,0x52,0xf0,0x93,0x5b,0x54,0x00,0xbe,0x7d,0x7e,0x23,0x30,0xb4,0x01,0x67,0xed,0x75,0x35,0x01,0x10,0xfd,0x0b,0x9f,0xe6,0x94,0x10,0x23,0x22,0x7f,0xe4,0x83,0x15,0x0f,0x32,0x75,0xe3,0x55,0x11,0xb1,0x99,0xa6,0xaf,0x71}, - {0x1d,0xb6,0x53,0x39,0x9b,0x6f,0xce,0x65,0xe6,0x41,0xa1,0xaf,0xea,0x39,0x58,0xc6,0xfe,0x59,0xf7,0xa9,0xfd,0x5f,0x43,0x0f,0x8e,0xc2,0xb1,0xc2,0xe9,0x42,0x11,0x02,0xd6,0x50,0x3b,0x47,0x1c,0x3c,0x42,0xea,0x10,0xef,0x38,0x3b,0x1f,0x7a,0xe8,0x51,0x95,0xbe,0xc9,0xb2,0x5f,0xbf,0x84,0x9b,0x1c,0x9a,0xf8,0x78,0xbc,0x1f,0x73,0x00,0x80,0x18,0xf8,0x48,0x18,0xc7,0x30,0xe4,0x19,0xc1,0xce,0x5e,0x22,0x0c,0x96,0xbf,0xe3,0x15,0xba,0x6b,0x83,0xe0,0xda,0xb6,0x08,0x58,0xe1,0x47,0x33,0x6f,0x4d,0x4c}, - {0xc9,0x1f,0x7d,0xc1,0xcf,0xec,0xf7,0x18,0x14,0x3c,0x40,0x51,0xa6,0xf5,0x75,0x6c,0xdf,0x0c,0xee,0xf7,0x2b,0x71,0xde,0xdb,0x22,0x7a,0xe4,0xa7,0xaa,0xdd,0x3f,0x19,0x70,0x19,0x8f,0x98,0xfc,0xdd,0x0c,0x2f,0x1b,0xf5,0xb9,0xb0,0x27,0x62,0x91,0x6b,0xbe,0x76,0x91,0x77,0xc4,0xb6,0xc7,0x6e,0xa8,0x9f,0x8f,0xa8,0x00,0x95,0xbf,0x38,0x6f,0x87,0xe8,0x37,0x3c,0xc9,0xd2,0x1f,0x2c,0x46,0xd1,0x18,0x5a,0x1e,0xf6,0xa2,0x76,0x12,0x24,0x39,0x82,0xf5,0x80,0x50,0x69,0x49,0x0d,0xbf,0x9e,0xb9,0x6f,0x6a}, - {0xeb,0x55,0x08,0x56,0xbb,0xc1,0x46,0x6a,0x9d,0xf0,0x93,0xf8,0x38,0xbb,0x16,0x24,0xc1,0xac,0x71,0x8f,0x37,0x11,0x1d,0xd7,0xea,0x96,0x18,0xa3,0x14,0x69,0xf7,0x75,0xc6,0x23,0xe4,0xb6,0xb5,0x22,0xb1,0xee,0x8e,0xff,0x86,0xf2,0x10,0x70,0x9d,0x93,0x8c,0x5d,0xcf,0x1d,0x83,0x2a,0xa9,0x90,0x10,0xeb,0xc5,0x42,0x9f,0xda,0x6f,0x13,0xd1,0xbd,0x05,0xa3,0xb1,0xdf,0x4c,0xf9,0x08,0x2c,0xf8,0x9f,0x9d,0x4b,0x36,0x0f,0x8a,0x58,0xbb,0xc3,0xa5,0xd8,0x87,0x2a,0xba,0xdc,0xe8,0x0b,0x51,0x83,0x21,0x02}, - {0x14,0x2d,0xad,0x5e,0x38,0x66,0xf7,0x4a,0x30,0x58,0x7c,0xca,0x80,0xd8,0x8e,0xa0,0x3d,0x1e,0x21,0x10,0xe6,0xa6,0x13,0x0d,0x03,0x6c,0x80,0x7b,0xe1,0x1c,0x07,0x6a,0x7f,0x7a,0x30,0x43,0x01,0x71,0x5a,0x9d,0x5f,0xa4,0x7d,0xc4,0x9e,0xde,0x63,0xb0,0xd3,0x7a,0x92,0xbe,0x52,0xfe,0xbb,0x22,0x6c,0x42,0x40,0xfd,0x41,0xc4,0x87,0x13,0xf8,0x8a,0x97,0x87,0xd1,0xc3,0xd3,0xb5,0x13,0x44,0x0e,0x7f,0x3d,0x5a,0x2b,0x72,0xa0,0x7c,0x47,0xbb,0x48,0x48,0x7b,0x0d,0x92,0xdc,0x1e,0xaf,0x6a,0xb2,0x71,0x31}, - {0xa8,0x4c,0x56,0x97,0x90,0x31,0x2f,0xa9,0x19,0xe1,0x75,0x22,0x4c,0xb8,0x7b,0xff,0x50,0x51,0x87,0xa4,0x37,0xfe,0x55,0x4f,0x5a,0x83,0xf0,0x3c,0x87,0xd4,0x1f,0x22,0xd1,0x47,0x8a,0xb2,0xd8,0xb7,0x0d,0xa6,0xf1,0xa4,0x70,0x17,0xd6,0x14,0xbf,0xa6,0x58,0xbd,0xdd,0x53,0x93,0xf8,0xa1,0xd4,0xe9,0x43,0x42,0x34,0x63,0x4a,0x51,0x6c,0x41,0x63,0x15,0x3a,0x4f,0x20,0x22,0x23,0x2d,0x03,0x0a,0xba,0xe9,0xe0,0x73,0xfb,0x0e,0x03,0x0f,0x41,0x4c,0xdd,0xe0,0xfc,0xaa,0x4a,0x92,0xfb,0x96,0xa5,0xda,0x48}, - {0xc7,0x9c,0xa5,0x5c,0x66,0x8e,0xca,0x6e,0xa0,0xac,0x38,0x2e,0x4b,0x25,0x47,0xa8,0xce,0x17,0x1e,0xd2,0x08,0xc7,0xaf,0x31,0xf7,0x4a,0xd8,0xca,0xfc,0xd6,0x6d,0x67,0x93,0x97,0x4c,0xc8,0x5d,0x1d,0xf6,0x14,0x06,0x82,0x41,0xef,0xe3,0xf9,0x41,0x99,0xac,0x77,0x62,0x34,0x8f,0xb8,0xf5,0xcd,0xa9,0x79,0x8a,0x0e,0xfa,0x37,0xc8,0x58,0x58,0x90,0xfc,0x96,0x85,0x68,0xf9,0x0c,0x1b,0xa0,0x56,0x7b,0xf3,0xbb,0xdc,0x1d,0x6a,0xd6,0x35,0x49,0x7d,0xe7,0xc2,0xdc,0x0a,0x7f,0xa5,0xc6,0xf2,0x73,0x4f,0x1c}, - {0xbb,0xa0,0x5f,0x30,0xbd,0x4f,0x7a,0x0e,0xad,0x63,0xc6,0x54,0xe0,0x4c,0x9d,0x82,0x48,0x38,0xe3,0x2f,0x83,0xc3,0x21,0xf4,0x42,0x4c,0xf6,0x1b,0x0d,0xc8,0x5a,0x79,0x84,0x34,0x7c,0xfc,0x6e,0x70,0x6e,0xb3,0x61,0xcf,0xc1,0xc3,0xb4,0xc9,0xdf,0x73,0xe5,0xc7,0x1c,0x78,0xc9,0x79,0x1d,0xeb,0x5c,0x67,0xaf,0x7d,0xdb,0x9a,0x45,0x70,0xb3,0x2b,0xb4,0x91,0x49,0xdb,0x91,0x1b,0xca,0xdc,0x02,0x4b,0x23,0x96,0x26,0x57,0xdc,0x78,0x8c,0x1f,0xe5,0x9e,0xdf,0x9f,0xd3,0x1f,0xe2,0x8c,0x84,0x62,0xe1,0x5f}, - {0x1a,0x96,0x94,0xe1,0x4f,0x21,0x59,0x4e,0x4f,0xcd,0x71,0x0d,0xc7,0x7d,0xbe,0x49,0x2d,0xf2,0x50,0x3b,0xd2,0xcf,0x00,0x93,0x32,0x72,0x91,0xfc,0x46,0xd4,0x89,0x47,0x08,0xb2,0x7c,0x5d,0x2d,0x85,0x79,0x28,0xe7,0xf2,0x7d,0x68,0x70,0xdd,0xde,0xb8,0x91,0x78,0x68,0x21,0xab,0xff,0x0b,0xdc,0x35,0xaa,0x7d,0x67,0x43,0xc0,0x44,0x2b,0x8e,0xb7,0x4e,0x07,0xab,0x87,0x1c,0x1a,0x67,0xf4,0xda,0x99,0x8e,0xd1,0xc6,0xfa,0x67,0x90,0x4f,0x48,0xcd,0xbb,0xac,0x3e,0xe4,0xa4,0xb9,0x2b,0xef,0x2e,0xc5,0x60}, - {0xf1,0x8b,0xfd,0x3b,0xbc,0x89,0x5d,0x0b,0x1a,0x55,0xf3,0xc9,0x37,0x92,0x6b,0xb0,0xf5,0x28,0x30,0xd5,0xb0,0x16,0x4c,0x0e,0xab,0xca,0xcf,0x2c,0x31,0x9c,0xbc,0x10,0x11,0x6d,0xae,0x7c,0xc2,0xc5,0x2b,0x70,0xab,0x8c,0xa4,0x54,0x9b,0x69,0xc7,0x44,0xb2,0x2e,0x49,0xba,0x56,0x40,0xbc,0xef,0x6d,0x67,0xb6,0xd9,0x48,0x72,0xd7,0x70,0x5b,0xa0,0xc2,0x3e,0x4b,0xe8,0x8a,0xaa,0xe0,0x81,0x17,0xed,0xf4,0x9e,0x69,0x98,0xd1,0x85,0x8e,0x70,0xe4,0x13,0x45,0x79,0x13,0xf4,0x76,0xa9,0xd3,0x5b,0x75,0x63}, - {0x53,0x08,0xd1,0x2a,0x3e,0xa0,0x5f,0xb5,0x69,0x35,0xe6,0x9e,0x90,0x75,0x6f,0x35,0x90,0xb8,0x69,0xbe,0xfd,0xf1,0xf9,0x9f,0x84,0x6f,0xc1,0x8b,0xc4,0xc1,0x8c,0x0d,0xb7,0xac,0xf1,0x97,0x18,0x10,0xc7,0x3d,0xd8,0xbb,0x65,0xc1,0x5e,0x7d,0xda,0x5d,0x0f,0x02,0xa1,0x0f,0x9c,0x5b,0x8e,0x50,0x56,0x2a,0xc5,0x37,0x17,0x75,0x63,0x27,0xa9,0x19,0xb4,0x6e,0xd3,0x02,0x94,0x02,0xa5,0x60,0xb4,0x77,0x7e,0x4e,0xb4,0xf0,0x56,0x49,0x3c,0xd4,0x30,0x62,0xa8,0xcf,0xe7,0x66,0xd1,0x7a,0x8a,0xdd,0xc2,0x70}, - {0x0e,0xec,0x6f,0x9f,0x50,0x94,0x61,0x65,0x8d,0x51,0xc6,0x46,0xa9,0x7e,0x2e,0xee,0x5c,0x9b,0xe0,0x67,0xf3,0xc1,0x33,0x97,0x95,0x84,0x94,0x63,0x63,0xac,0x0f,0x2e,0x13,0x7e,0xed,0xb8,0x7d,0x96,0xd4,0x91,0x7a,0x81,0x76,0xd7,0x0a,0x2f,0x25,0x74,0x64,0x25,0x85,0x0d,0xe0,0x82,0x09,0xe4,0xe5,0x3c,0xa5,0x16,0x38,0x61,0xb8,0x32,0x64,0xcd,0x48,0xe4,0xbe,0xf7,0xe7,0x79,0xd0,0x86,0x78,0x08,0x67,0x3a,0xc8,0x6a,0x2e,0xdb,0xe4,0xa0,0xd9,0xd4,0x9f,0xf8,0x41,0x4f,0x5a,0x73,0x5c,0x21,0x79,0x41}, - {0x2a,0xed,0xdc,0xd7,0xe7,0x94,0x70,0x8c,0x70,0x9c,0xd3,0x47,0xc3,0x8a,0xfb,0x97,0x02,0xd9,0x06,0xa9,0x33,0xe0,0x3b,0xe1,0x76,0x9d,0xd9,0x0c,0xa3,0x44,0x03,0x70,0x34,0xcd,0x6b,0x28,0xb9,0x33,0xae,0xe4,0xdc,0xd6,0x9d,0x55,0xb6,0x7e,0xef,0xb7,0x1f,0x8e,0xd3,0xb3,0x1f,0x14,0x8b,0x27,0x86,0xc2,0x41,0x22,0x66,0x85,0xfa,0x31,0xf4,0x22,0x36,0x2e,0x42,0x6c,0x82,0xaf,0x2d,0x50,0x33,0x98,0x87,0x29,0x20,0xc1,0x23,0x91,0x38,0x2b,0xe1,0xb7,0xc1,0x9b,0x89,0x24,0x95,0xa9,0x12,0x23,0xbb,0x24}, - {0xc3,0x67,0xde,0x32,0x17,0xed,0xa8,0xb1,0x48,0x49,0x1b,0x46,0x18,0x94,0xb4,0x3c,0xd2,0xbc,0xcf,0x76,0x43,0x43,0xbd,0x8e,0x08,0x80,0x18,0x1e,0x87,0x3e,0xee,0x0f,0x6b,0x5c,0xf8,0xf5,0x2a,0x0c,0xf8,0x41,0x94,0x67,0xfa,0x04,0xc3,0x84,0x72,0x68,0xad,0x1b,0xba,0xa3,0x99,0xdf,0x45,0x89,0x16,0x5d,0xeb,0xff,0xf9,0x2a,0x1d,0x0d,0xdf,0x1e,0x62,0x32,0xa1,0x8a,0xda,0xa9,0x79,0x65,0x22,0x59,0xa1,0x22,0xb8,0x30,0x93,0xc1,0x9a,0xa7,0x7b,0x19,0x04,0x40,0x76,0x1d,0x53,0x18,0x97,0xd7,0xac,0x16}, - {0x3d,0x1d,0x9b,0x2d,0xaf,0x72,0xdf,0x72,0x5a,0x24,0x32,0xa4,0x36,0x2a,0x46,0x63,0x37,0x96,0xb3,0x16,0x79,0xa0,0xce,0x3e,0x09,0x23,0x30,0xb9,0xf6,0x0e,0x3e,0x12,0xad,0xb6,0x87,0x78,0xc5,0xc6,0x59,0xc9,0xba,0xfe,0x90,0x5f,0xad,0x9e,0xe1,0x94,0x04,0xf5,0x42,0xa3,0x62,0x4e,0xe2,0x16,0x00,0x17,0x16,0x18,0x4b,0xd3,0x4e,0x16,0x9a,0xe6,0x2f,0x19,0x4c,0xd9,0x7e,0x48,0x13,0x15,0x91,0x3a,0xea,0x2c,0xae,0x61,0x27,0xde,0xa4,0xb9,0xd3,0xf6,0x7b,0x87,0xeb,0xf3,0x73,0x10,0xc6,0x0f,0xda,0x78}, - {0x6a,0xc6,0x2b,0xe5,0x28,0x5d,0xf1,0x5b,0x8e,0x1a,0xf0,0x70,0x18,0xe3,0x47,0x2c,0xdd,0x8b,0xc2,0x06,0xbc,0xaf,0x19,0x24,0x3a,0x17,0x6b,0x25,0xeb,0xde,0x25,0x2d,0x94,0x3a,0x0c,0x68,0xf1,0x80,0x9f,0xa2,0xe6,0xe7,0xe9,0x1a,0x15,0x7e,0xf7,0x71,0x73,0x79,0x01,0x48,0x58,0xf1,0x00,0x11,0xdd,0x8d,0xb3,0x16,0xb3,0xa4,0x4a,0x05,0xb8,0x7c,0x26,0x19,0x8d,0x46,0xc8,0xdf,0xaf,0x4d,0xe5,0x66,0x9c,0x78,0x28,0x0b,0x17,0xec,0x6e,0x66,0x2a,0x1d,0xeb,0x2a,0x60,0xa7,0x7d,0xab,0xa6,0x10,0x46,0x13}, - {0xfe,0xb0,0xf6,0x8d,0xc7,0x8e,0x13,0x51,0x1b,0xf5,0x75,0xe5,0x89,0xda,0x97,0x53,0xb9,0xf1,0x7a,0x71,0x1d,0x7a,0x20,0x09,0x50,0xd6,0x20,0x2b,0xba,0xfd,0x02,0x21,0x15,0xf5,0xd1,0x77,0xe7,0x65,0x2a,0xcd,0xf1,0x60,0xaa,0x8f,0x87,0x91,0x89,0x54,0xe5,0x06,0xbc,0xda,0xbc,0x3b,0xb7,0xb1,0xfb,0xc9,0x7c,0xa9,0xcb,0x78,0x48,0x65,0xa1,0xe6,0x5c,0x05,0x05,0xe4,0x9e,0x96,0x29,0xad,0x51,0x12,0x68,0xa7,0xbc,0x36,0x15,0xa4,0x7d,0xaa,0x17,0xf5,0x1a,0x3a,0xba,0xb2,0xec,0x29,0xdb,0x25,0xd7,0x0a}, - {0x57,0x24,0x4e,0x83,0xb1,0x67,0x42,0xdc,0xc5,0x1b,0xce,0x70,0xb5,0x44,0x75,0xb6,0xd7,0x5e,0xd1,0xf7,0x0b,0x7a,0xf0,0x1a,0x50,0x36,0xa0,0x71,0xfb,0xcf,0xef,0x4a,0x85,0x6f,0x05,0x9b,0x0c,0xbc,0xc7,0xfe,0xd7,0xff,0xf5,0xe7,0x68,0x52,0x7d,0x53,0xfa,0xae,0x12,0x43,0x62,0xc6,0xaf,0x77,0xd9,0x9f,0x39,0x02,0x53,0x5f,0x67,0x4f,0x1e,0x17,0x15,0x04,0x36,0x36,0x2d,0xc3,0x3b,0x48,0x98,0x89,0x11,0xef,0x2b,0xcd,0x10,0x51,0x94,0xd0,0xad,0x6e,0x0a,0x87,0x61,0x65,0xa8,0xa2,0x72,0xbb,0xcc,0x0b}, - {0xc8,0xa9,0xb1,0xea,0x2f,0x96,0x5e,0x18,0xcd,0x7d,0x14,0x65,0x35,0xe6,0xe7,0x86,0xf2,0x6d,0x5b,0xbb,0x31,0xe0,0x92,0xb0,0x3e,0xb7,0xd6,0x59,0xab,0xf0,0x24,0x40,0x96,0x12,0xfe,0x50,0x4c,0x5e,0x6d,0x18,0x7e,0x9f,0xe8,0xfe,0x82,0x7b,0x39,0xe0,0xb0,0x31,0x70,0x50,0xc5,0xf6,0xc7,0x3b,0xc2,0x37,0x8f,0x10,0x69,0xfd,0x78,0x66,0xc2,0x63,0x68,0x63,0x31,0xfa,0x86,0x15,0xf2,0x33,0x2d,0x57,0x48,0x8c,0xf6,0x07,0xfc,0xae,0x9e,0x78,0x9f,0xcc,0x73,0x4f,0x01,0x47,0xad,0x8e,0x10,0xe2,0x42,0x2d}, - {0x9b,0xd2,0xdf,0x94,0x15,0x13,0xf5,0x97,0x6a,0x4c,0x3f,0x31,0x5d,0x98,0x55,0x61,0x10,0x50,0x45,0x08,0x07,0x3f,0xa1,0xeb,0x22,0xd3,0xd2,0xb8,0x08,0x26,0x6b,0x67,0x93,0x75,0x53,0x0f,0x0d,0x7b,0x71,0x21,0x4c,0x06,0x1e,0x13,0x0b,0x69,0x4e,0x91,0x9f,0xe0,0x2a,0x75,0xae,0x87,0xb6,0x1b,0x6e,0x3c,0x42,0x9b,0xa7,0xf3,0x0b,0x42,0x47,0x2b,0x5b,0x1c,0x65,0xba,0x38,0x81,0x80,0x1b,0x1b,0x31,0xec,0xb6,0x71,0x86,0xb0,0x35,0x31,0xbc,0xb1,0x0c,0xff,0x7b,0xe0,0xf1,0x0c,0x9c,0xfa,0x2f,0x5d,0x74}, - {0xbd,0xc8,0xc9,0x2b,0x1e,0x5a,0x52,0xbf,0x81,0x9d,0x47,0x26,0x08,0x26,0x5b,0xea,0xdb,0x55,0x01,0xdf,0x0e,0xc7,0x11,0xd5,0xd0,0xf5,0x0c,0x96,0xeb,0x3c,0xe2,0x1a,0x6a,0x4e,0xd3,0x21,0x57,0xdf,0x36,0x60,0xd0,0xb3,0x7b,0x99,0x27,0x88,0xdb,0xb1,0xfa,0x6a,0x75,0xc8,0xc3,0x09,0xc2,0xd3,0x39,0xc8,0x1d,0x4c,0xe5,0x5b,0xe1,0x06,0x4a,0x99,0x32,0x19,0x87,0x5d,0x72,0x5b,0xb0,0xda,0xb1,0xce,0xb5,0x1c,0x35,0x32,0x05,0xca,0xb7,0xda,0x49,0x15,0xc4,0x7d,0xf7,0xc1,0x8e,0x27,0x61,0xd8,0xde,0x58}, - {0x5c,0xc5,0x66,0xf2,0x93,0x37,0x17,0xd8,0x49,0x4e,0x45,0xcc,0xc5,0x76,0xc9,0xc8,0xa8,0xc3,0x26,0xbc,0xf8,0x82,0xe3,0x5c,0xf9,0xf6,0x85,0x54,0xe8,0x9d,0xf3,0x2f,0xa8,0xc9,0xc2,0xb6,0xa8,0x5b,0xfb,0x2d,0x8c,0x59,0x2c,0xf5,0x8e,0xef,0xee,0x48,0x73,0x15,0x2d,0xf1,0x07,0x91,0x80,0x33,0xd8,0x5b,0x1d,0x53,0x6b,0x69,0xba,0x08,0x7a,0xc5,0xef,0xc3,0xee,0x3e,0xed,0x77,0x11,0x48,0xff,0xd4,0x17,0x55,0xe0,0x04,0xcb,0x71,0xa6,0xf1,0x3f,0x7a,0x3d,0xea,0x54,0xfe,0x7c,0x94,0xb4,0x33,0x06,0x12}, - {0x42,0x00,0x61,0x91,0x78,0x98,0x94,0x0b,0xe8,0xfa,0xeb,0xec,0x3c,0xb1,0xe7,0x4e,0xc0,0xa4,0xf0,0x94,0x95,0x73,0xbe,0x70,0x85,0x91,0xd5,0xb4,0x99,0x0a,0xd3,0x35,0x0a,0x10,0x12,0x49,0x47,0x31,0xbd,0x82,0x06,0xbe,0x6f,0x7e,0x6d,0x7b,0x23,0xde,0xc6,0x79,0xea,0x11,0x19,0x76,0x1e,0xe1,0xde,0x3b,0x39,0xcb,0xe3,0x3b,0x43,0x07,0xf4,0x97,0xe9,0x5c,0xc0,0x44,0x79,0xff,0xa3,0x51,0x5c,0xb0,0xe4,0x3d,0x5d,0x57,0x7c,0x84,0x76,0x5a,0xfd,0x81,0x33,0x58,0x9f,0xda,0xf6,0x7a,0xde,0x3e,0x87,0x2d}, - {0x09,0x34,0x37,0x43,0x64,0x31,0x7a,0x15,0xd9,0x81,0xaa,0xf4,0xee,0xb7,0xb8,0xfa,0x06,0x48,0xa6,0xf5,0xe6,0xfe,0x93,0xb0,0xb6,0xa7,0x7f,0x70,0x54,0x36,0x77,0x2e,0x81,0xf9,0x5d,0x4e,0xe1,0x02,0x62,0xaa,0xf5,0xe1,0x15,0x50,0x17,0x59,0x0d,0xa2,0x6c,0x1d,0xe2,0xba,0xd3,0x75,0xa2,0x18,0x53,0x02,0x60,0x01,0x8a,0x61,0x43,0x05,0xc1,0x23,0x4c,0x97,0xf4,0xbd,0xea,0x0d,0x93,0x46,0xce,0x9d,0x25,0x0a,0x6f,0xaa,0x2c,0xba,0x9a,0xa2,0xb8,0x2c,0x20,0x04,0x0d,0x96,0x07,0x2d,0x36,0x43,0x14,0x4b}, - {0x7a,0x1f,0x6e,0xb6,0xc7,0xb7,0xc4,0xcc,0x7e,0x2f,0x0c,0xf5,0x25,0x7e,0x15,0x44,0x1c,0xaf,0x3e,0x71,0xfc,0x6d,0xf0,0x3e,0xf7,0x63,0xda,0x52,0x67,0x44,0x2f,0x58,0xcb,0x9c,0x52,0x1c,0xe9,0x54,0x7c,0x96,0xfb,0x35,0xc6,0x64,0x92,0x26,0xf6,0x30,0x65,0x19,0x12,0x78,0xf4,0xaf,0x47,0x27,0x5c,0x6f,0xf6,0xea,0x18,0x84,0x03,0x17,0xe4,0x4c,0x32,0x20,0xd3,0x7b,0x31,0xc6,0xc4,0x8b,0x48,0xa4,0xe8,0x42,0x10,0xa8,0x64,0x13,0x5a,0x4e,0x8b,0xf1,0x1e,0xb2,0xc9,0x8d,0xa2,0xcd,0x4b,0x1c,0x2a,0x0c}, - {0x47,0x04,0x1f,0x6f,0xd0,0xc7,0x4d,0xd2,0x59,0xc0,0x87,0xdb,0x3e,0x9e,0x26,0xb2,0x8f,0xd2,0xb2,0xfb,0x72,0x02,0x5b,0xd1,0x77,0x48,0xf6,0xc6,0xd1,0x8b,0x55,0x7c,0x45,0x69,0xbd,0x69,0x48,0x81,0xc4,0xed,0x22,0x8d,0x1c,0xbe,0x7d,0x90,0x6d,0x0d,0xab,0xc5,0x5c,0xd5,0x12,0xd2,0x3b,0xc6,0x83,0xdc,0x14,0xa3,0x30,0x9b,0x6a,0x5a,0x3d,0x46,0x96,0xd3,0x24,0x15,0xec,0xd0,0xf0,0x24,0x5a,0xc3,0x8a,0x62,0xbb,0x12,0xa4,0x5f,0xbc,0x1c,0x79,0x3a,0x0c,0xa5,0xc3,0xaf,0xfb,0x0a,0xca,0xa5,0x04,0x04}, - {0xd6,0x43,0xa7,0x0a,0x07,0x40,0x1f,0x8c,0xe8,0x5e,0x26,0x5b,0xcb,0xd0,0xba,0xcc,0xde,0xd2,0x8f,0x66,0x6b,0x04,0x4b,0x57,0x33,0x96,0xdd,0xca,0xfd,0x5b,0x39,0x46,0xd1,0x6f,0x41,0x2a,0x1b,0x9e,0xbc,0x62,0x8b,0x59,0x50,0xe3,0x28,0xf7,0xc6,0xb5,0x67,0x69,0x5d,0x3d,0xd8,0x3f,0x34,0x04,0x98,0xee,0xf8,0xe7,0x16,0x75,0x52,0x39,0x9c,0x9a,0x5d,0x1a,0x2d,0xdb,0x7f,0x11,0x2a,0x5c,0x00,0xd1,0xbc,0x45,0x77,0x9c,0xea,0x6f,0xd5,0x54,0xf1,0xbe,0xd4,0xef,0x16,0xd0,0x22,0xe8,0x29,0x9a,0x57,0x76}, - {0x17,0x2a,0xc0,0x49,0x7e,0x8e,0xb6,0x45,0x7f,0xa3,0xa9,0xbc,0xa2,0x51,0xcd,0x23,0x1b,0x4c,0x22,0xec,0x11,0x5f,0xd6,0x3e,0xb1,0xbd,0x05,0x9e,0xdc,0x84,0xa3,0x43,0xf2,0x34,0xb4,0x52,0x13,0xb5,0x3c,0x33,0xe1,0x80,0xde,0x93,0x49,0x28,0x32,0xd8,0xce,0x35,0x0d,0x75,0x87,0x28,0x51,0xb5,0xc1,0x77,0x27,0x2a,0xbb,0x14,0xc5,0x02,0x45,0xb6,0xf1,0x8b,0xda,0xd5,0x4b,0x68,0x53,0x4b,0xb5,0xf6,0x7e,0xd3,0x8b,0xfb,0x53,0xd2,0xb0,0xa9,0xd7,0x16,0x39,0x31,0x59,0x80,0x54,0x61,0x09,0x92,0x60,0x11}, - {0xaa,0xcf,0xda,0x29,0x69,0x16,0x4d,0xb4,0x8f,0x59,0x13,0x84,0x4c,0x9f,0x52,0xda,0x59,0x55,0x3d,0x45,0xca,0x63,0xef,0xe9,0x0b,0x8e,0x69,0xc5,0x5b,0x12,0x1e,0x35,0xcd,0x4d,0x9b,0x36,0x16,0x56,0x38,0x7a,0x63,0x35,0x5c,0x65,0xa7,0x2c,0xc0,0x75,0x21,0x80,0xf1,0xd4,0xf9,0x1b,0xc2,0x7d,0x42,0xe0,0xe6,0x91,0x74,0x7d,0x63,0x2f,0xbe,0x7b,0xf6,0x1a,0x46,0x9b,0xb4,0xd4,0x61,0x89,0xab,0xc8,0x7a,0x03,0x03,0xd6,0xfb,0x99,0xa6,0xf9,0x9f,0xe1,0xde,0x71,0x9a,0x2a,0xce,0xe7,0x06,0x2d,0x18,0x7f}, - {0xec,0x68,0x01,0xab,0x64,0x8e,0x7c,0x7a,0x43,0xc5,0xed,0x15,0x55,0x4a,0x5a,0xcb,0xda,0x0e,0xcd,0x47,0xd3,0x19,0x55,0x09,0xb0,0x93,0x3e,0x34,0x8c,0xac,0xd4,0x67,0x22,0x75,0x21,0x8e,0x72,0x4b,0x45,0x09,0xd8,0xb8,0x84,0xd4,0xf4,0xe8,0x58,0xaa,0x3c,0x90,0x46,0x7f,0x4d,0x25,0x58,0xd3,0x17,0x52,0x1c,0x24,0x43,0xc0,0xac,0x44,0x77,0x57,0x7a,0x4f,0xbb,0x6b,0x7d,0x1c,0xe1,0x13,0x83,0x91,0xd4,0xfe,0x35,0x8b,0x84,0x46,0x6b,0xc9,0xc6,0xa1,0xdc,0x4a,0xbd,0x71,0xad,0x12,0x83,0x1c,0x6d,0x55}, - {0x82,0x39,0x8d,0x0c,0xe3,0x40,0xef,0x17,0x34,0xfa,0xa3,0x15,0x3e,0x07,0xf7,0x31,0x6e,0x64,0x73,0x07,0xcb,0xf3,0x21,0x4f,0xff,0x4e,0x82,0x1d,0x6d,0x6c,0x6c,0x74,0x21,0xe8,0x1b,0xb1,0x56,0x67,0xf0,0x81,0xdd,0xf3,0xa3,0x10,0x23,0xf8,0xaf,0x0f,0x5d,0x46,0x99,0x6a,0x55,0xd0,0xb2,0xf8,0x05,0x7f,0x8c,0xcc,0x38,0xbe,0x7a,0x09,0xa4,0x2d,0xa5,0x7e,0x87,0xc9,0x49,0x0c,0x43,0x1d,0xdc,0x9b,0x55,0x69,0x43,0x4c,0xd2,0xeb,0xcc,0xf7,0x09,0x38,0x2c,0x02,0xbd,0x84,0xee,0x4b,0xa3,0x14,0x7e,0x57}, - {0x0a,0x3b,0xa7,0x61,0xac,0x68,0xe2,0xf0,0xf5,0xa5,0x91,0x37,0x10,0xfa,0xfa,0xf2,0xe9,0x00,0x6d,0x6b,0x82,0x3e,0xe1,0xc1,0x42,0x8f,0xd7,0x6f,0xe9,0x7e,0xfa,0x60,0x2b,0xd7,0x4d,0xbd,0xbe,0xce,0xfe,0x94,0x11,0x22,0x0f,0x06,0xda,0x4f,0x6a,0xf4,0xff,0xd1,0xc8,0xc0,0x77,0x59,0x4a,0x12,0x95,0x92,0x00,0xfb,0xb8,0x04,0x53,0x70,0xc6,0x6e,0x29,0x4d,0x35,0x1d,0x3d,0xb6,0xd8,0x31,0xad,0x5f,0x3e,0x05,0xc3,0xf3,0xec,0x42,0xbd,0xb4,0x8c,0x95,0x0b,0x67,0xfd,0x53,0x63,0xa1,0x0c,0x8e,0x39,0x21}, - {0xf3,0x33,0x2b,0x38,0x8a,0x05,0xf5,0x89,0xb4,0xc0,0x48,0xad,0x0b,0xba,0xe2,0x5a,0x6e,0xb3,0x3d,0xa5,0x03,0xb5,0x93,0x8f,0xe6,0x32,0xa2,0x95,0x9d,0xed,0xa3,0x5a,0x01,0x56,0xb7,0xb4,0xf9,0xaa,0x98,0x27,0x72,0xad,0x8d,0x5c,0x13,0x72,0xac,0x5e,0x23,0xa0,0xb7,0x61,0x61,0xaa,0xce,0xd2,0x4e,0x7d,0x8f,0xe9,0x84,0xb2,0xbf,0x1b,0x61,0x65,0xd9,0xc7,0xe9,0x77,0x67,0x65,0x36,0x80,0xc7,0x72,0x54,0x12,0x2b,0xcb,0xee,0x6e,0x50,0xd9,0x99,0x32,0x05,0x65,0xcc,0x57,0x89,0x5e,0x4e,0xe1,0x07,0x4a}, - {0x99,0xf9,0x0d,0x98,0xcb,0x12,0xe4,0x4e,0x71,0xc7,0x6e,0x3c,0x6f,0xd7,0x15,0xa3,0xfd,0x77,0x5c,0x92,0xde,0xed,0xa5,0xbb,0x02,0x34,0x31,0x1d,0x39,0xac,0x0b,0x3f,0x9b,0xa4,0x77,0xc4,0xcd,0x58,0x0b,0x24,0x17,0xf0,0x47,0x64,0xde,0xda,0x38,0xfd,0xad,0x6a,0xc8,0xa7,0x32,0x8d,0x92,0x19,0x81,0xa0,0xaf,0x84,0xed,0x7a,0xaf,0x50,0xe5,0x5b,0xf6,0x15,0x01,0xde,0x4f,0x6e,0xb2,0x09,0x61,0x21,0x21,0x26,0x98,0x29,0xd9,0xd6,0xad,0x0b,0x81,0x05,0x02,0x78,0x06,0xd0,0xeb,0xba,0x16,0xa3,0x21,0x19}, - {0xfc,0x70,0xb8,0xdf,0x7e,0x2f,0x42,0x89,0xbd,0xb3,0x76,0x4f,0xeb,0x6b,0x29,0x2c,0xf7,0x4d,0xc2,0x36,0xd4,0xf1,0x38,0x07,0xb0,0xae,0x73,0xe2,0x41,0xdf,0x58,0x64,0x8b,0xc1,0xf3,0xd9,0x9a,0xad,0x5a,0xd7,0x9c,0xc1,0xb1,0x60,0xef,0x0e,0x6a,0x56,0xd9,0x0e,0x5c,0x25,0xac,0x0b,0x9a,0x3e,0xf5,0xc7,0x62,0xa0,0xec,0x9d,0x04,0x7b,0x83,0x44,0x44,0x35,0x7a,0xe3,0xcb,0xdc,0x93,0xbe,0xed,0x0f,0x33,0x79,0x88,0x75,0x87,0xdd,0xc5,0x12,0xc3,0x04,0x60,0x78,0x64,0x0e,0x95,0xc2,0xcb,0xdc,0x93,0x60}, - {0x6d,0x70,0xe0,0x85,0x85,0x9a,0xf3,0x1f,0x33,0x39,0xe7,0xb3,0xd8,0xa5,0xd0,0x36,0x3b,0x45,0x8f,0x71,0xe1,0xf2,0xb9,0x43,0x7c,0xa9,0x27,0x48,0x08,0xea,0xd1,0x57,0x4b,0x03,0x84,0x60,0xbe,0xee,0xde,0x6b,0x54,0xb8,0x0f,0x78,0xb6,0xc2,0x99,0x31,0x95,0x06,0x2d,0xb6,0xab,0x76,0x33,0x97,0x90,0x7d,0x64,0x8b,0xc9,0x80,0x31,0x6e,0x71,0xb0,0x28,0xa1,0xe7,0xb6,0x7a,0xee,0xaa,0x8b,0xa8,0x93,0x6d,0x59,0xc1,0xa4,0x30,0x61,0x21,0xb2,0x82,0xde,0xb4,0xf7,0x18,0xbd,0x97,0xdd,0x9d,0x99,0x3e,0x36}, - {0xc4,0x1f,0xee,0x35,0xc1,0x43,0xa8,0x96,0xcf,0xc8,0xe4,0x08,0x55,0xb3,0x6e,0x97,0x30,0xd3,0x8c,0xb5,0x01,0x68,0x2f,0xb4,0x2b,0x05,0x3a,0x69,0x78,0x9b,0xee,0x48,0xc6,0xae,0x4b,0xe2,0xdc,0x48,0x18,0x2f,0x60,0xaf,0xbc,0xba,0x55,0x72,0x9b,0x76,0x31,0xe9,0xef,0x3c,0x6e,0x3c,0xcb,0x90,0x55,0xb3,0xf9,0xc6,0x9b,0x97,0x1f,0x23,0xc6,0xf3,0x2a,0xcc,0x4b,0xde,0x31,0x5c,0x1f,0x8d,0x20,0xfe,0x30,0xb0,0x4b,0xb0,0x66,0xb4,0x4f,0xc1,0x09,0x70,0x8d,0xb7,0x13,0x24,0x79,0x08,0x9b,0xfa,0x9b,0x07}, - {0xf4,0x0d,0x30,0xda,0x51,0x3a,0x90,0xe3,0xb0,0x5a,0xa9,0x3d,0x23,0x64,0x39,0x84,0x80,0x64,0x35,0x0b,0x2d,0xf1,0x3c,0xed,0x94,0x71,0x81,0x84,0xf6,0x77,0x8c,0x03,0x45,0x42,0xd5,0xa2,0x80,0xed,0xc9,0xf3,0x52,0x39,0xf6,0x77,0x78,0x8b,0xa0,0x0a,0x75,0x54,0x08,0xd1,0x63,0xac,0x6d,0xd7,0x6b,0x63,0x70,0x94,0x15,0xfb,0xf4,0x1e,0xec,0x7b,0x16,0x5b,0xe6,0x5e,0x4e,0x85,0xc2,0xcd,0xd0,0x96,0x42,0x0a,0x59,0x59,0x99,0x21,0x10,0x98,0x34,0xdf,0xb2,0x72,0x56,0xff,0x0b,0x4a,0x2a,0xe9,0x5e,0x57}, - {0xcf,0x2f,0x18,0x8a,0x90,0x80,0xc0,0xd4,0xbd,0x9d,0x48,0x99,0xc2,0x70,0xe1,0x30,0xde,0x33,0xf7,0x52,0x57,0xbd,0xba,0x05,0x00,0xfd,0xd3,0x2c,0x11,0xe7,0xd4,0x43,0x01,0xd8,0xa4,0x0a,0x45,0xbc,0x46,0x5d,0xd8,0xb9,0x33,0xa5,0x27,0x12,0xaf,0xc3,0xc2,0x06,0x89,0x2b,0x26,0x3b,0x9e,0x38,0x1b,0x58,0x2f,0x38,0x7e,0x1e,0x0a,0x20,0xc5,0x3a,0xf9,0xea,0x67,0xb9,0x8d,0x51,0xc0,0x52,0x66,0x05,0x9b,0x98,0xbc,0x71,0xf5,0x97,0x71,0x56,0xd9,0x85,0x2b,0xfe,0x38,0x4e,0x1e,0x65,0x52,0xca,0x0e,0x05}, - {0x9c,0x0c,0x3f,0x45,0xde,0x1a,0x43,0xc3,0x9b,0x3b,0x70,0xff,0x5e,0x04,0xf5,0xe9,0x3d,0x7b,0x84,0xed,0xc9,0x7a,0xd9,0xfc,0xc6,0xf4,0x58,0x1c,0xc2,0xe6,0x0e,0x4b,0xea,0x68,0xe6,0x60,0x76,0x39,0xac,0x97,0x97,0xb4,0x3a,0x15,0xfe,0xbb,0x19,0x9b,0x9f,0xa7,0xec,0x34,0xb5,0x79,0xb1,0x4c,0x57,0xae,0x31,0xa1,0x9f,0xc0,0x51,0x61,0x96,0x5d,0xf0,0xfd,0x0d,0x5c,0xf5,0x3a,0x7a,0xee,0xb4,0x2a,0xe0,0x2e,0x26,0xdd,0x09,0x17,0x17,0x12,0x87,0xbb,0xb2,0x11,0x0b,0x03,0x0f,0x80,0xfa,0x24,0xef,0x1f}, - {0x96,0x31,0xa7,0x1a,0xfb,0x53,0xd6,0x37,0x18,0x64,0xd7,0x3f,0x30,0x95,0x94,0x0f,0xb2,0x17,0x3a,0xfb,0x09,0x0b,0x20,0xad,0x3e,0x61,0xc8,0x2f,0x29,0x49,0x4d,0x54,0x86,0x6b,0x97,0x30,0xf5,0xaf,0xd2,0x22,0x04,0x46,0xd2,0xc2,0x06,0xb8,0x90,0x8d,0xe5,0xba,0xe5,0x4d,0x6c,0x89,0xa1,0xdc,0x17,0x0c,0x34,0xc8,0xe6,0x5f,0x00,0x28,0x88,0x86,0x52,0x34,0x9f,0xba,0xef,0x6a,0xa1,0x7d,0x10,0x25,0x94,0xff,0x1b,0x5c,0x36,0x4b,0xd9,0x66,0xcd,0xbb,0x5b,0xf7,0xfa,0x6d,0x31,0x0f,0x93,0x72,0xe4,0x72}, - {0x4f,0x08,0x81,0x97,0x8c,0x20,0x95,0x26,0xe1,0x0e,0x45,0x23,0x0b,0x2a,0x50,0xb1,0x02,0xde,0xef,0x03,0xa6,0xae,0x9d,0xfd,0x4c,0xa3,0x33,0x27,0x8c,0x2e,0x9d,0x5a,0x27,0x76,0x2a,0xd3,0x35,0xf6,0xf3,0x07,0xf0,0x66,0x65,0x5f,0x86,0x4d,0xaa,0x7a,0x50,0x44,0xd0,0x28,0x97,0xe7,0x85,0x3c,0x38,0x64,0xe0,0x0f,0x00,0x7f,0xee,0x1f,0xe5,0xf7,0xdb,0x03,0xda,0x05,0x53,0x76,0xbd,0xcd,0x34,0x14,0x49,0xf2,0xda,0xa4,0xec,0x88,0x4a,0xd2,0xcd,0xd5,0x4a,0x7b,0x43,0x05,0x04,0xee,0x51,0x40,0xf9,0x00}, - {0xb2,0x30,0xd3,0xc3,0x23,0x6b,0x35,0x8d,0x06,0x1b,0x47,0xb0,0x9b,0x8b,0x1c,0xf2,0x3c,0xb8,0x42,0x6e,0x6c,0x31,0x6c,0xb3,0x0d,0xb1,0xea,0x8b,0x7e,0x9c,0xd7,0x07,0x53,0x97,0xaf,0x07,0xbb,0x93,0xef,0xd7,0xa7,0x66,0xb7,0x3d,0xcf,0xd0,0x3e,0x58,0xc5,0x1e,0x0b,0x6e,0xbf,0x98,0x69,0xce,0x52,0x04,0xd4,0x5d,0xd2,0xff,0xb7,0x47,0x12,0xdd,0x08,0xbc,0x9c,0xfb,0xfb,0x87,0x9b,0xc2,0xee,0xe1,0x3a,0x6b,0x06,0x8a,0xbf,0xc1,0x1f,0xdb,0x2b,0x24,0x57,0x0d,0xb6,0x4b,0xa6,0x5e,0xa3,0x20,0x35,0x1c}, - {0x4a,0xa3,0xcb,0xbc,0xa6,0x53,0xd2,0x80,0x9b,0x21,0x38,0x38,0xa1,0xc3,0x61,0x3e,0x96,0xe3,0x82,0x98,0x01,0xb6,0xc3,0x90,0x6f,0xe6,0x0e,0x5d,0x77,0x05,0x3d,0x1c,0x59,0xc0,0x6b,0x21,0x40,0x6f,0xa8,0xcd,0x7e,0xd8,0xbc,0x12,0x1d,0x23,0xbb,0x1f,0x90,0x09,0xc7,0x17,0x9e,0x6a,0x95,0xb4,0x55,0x2e,0xd1,0x66,0x3b,0x0c,0x75,0x38,0x1a,0xe5,0x22,0x94,0x40,0xf1,0x2e,0x69,0x71,0xf6,0x5d,0x2b,0x3c,0xc7,0xc0,0xcb,0x29,0xe0,0x4c,0x74,0xe7,0x4f,0x01,0x21,0x7c,0x48,0x30,0xd3,0xc7,0xe2,0x21,0x06}, - {0x8d,0x83,0x59,0x82,0xcc,0x60,0x98,0xaf,0xdc,0x9a,0x9f,0xc6,0xc1,0x48,0xea,0x90,0x30,0x1e,0x58,0x65,0x37,0x48,0x26,0x65,0xbc,0xa5,0xd3,0x7b,0x09,0xd6,0x07,0x00,0xf3,0xf0,0xdb,0xb0,0x96,0x17,0xae,0xb7,0x96,0xe1,0x7c,0xe1,0xb9,0xaf,0xdf,0x54,0xb4,0xa3,0xaa,0xe9,0x71,0x30,0x92,0x25,0x9d,0x2e,0x00,0xa1,0x9c,0x58,0x8e,0x5d,0x4b,0xa9,0x42,0x08,0x95,0x1d,0xbf,0xc0,0x3e,0x2e,0x8f,0x58,0x63,0xc3,0xd3,0xb2,0xef,0xe2,0x51,0xbb,0x38,0x14,0x96,0x0a,0x86,0xbf,0x1c,0x3c,0x78,0xd7,0x83,0x15}, - {0xe1,0x7a,0xa2,0x5d,0xef,0xa2,0xee,0xec,0x74,0x01,0x67,0x55,0x14,0x3a,0x7c,0x59,0x7a,0x16,0x09,0x66,0x12,0x2a,0xa6,0xc9,0x70,0x8f,0xed,0x81,0x2e,0x5f,0x2a,0x25,0xc7,0x28,0x9d,0xcc,0x04,0x47,0x03,0x90,0x8f,0xc5,0x2c,0xf7,0x9e,0x67,0x1b,0x1d,0x26,0x87,0x5b,0xbe,0x5f,0x2b,0xe1,0x16,0x0a,0x58,0xc5,0x83,0x4e,0x06,0x58,0x49,0x0d,0xe8,0x66,0x50,0x26,0x94,0x28,0x0d,0x6b,0x8c,0x7c,0x30,0x85,0xf7,0xc3,0xfc,0xfd,0x12,0x11,0x0c,0x78,0xda,0x53,0x1b,0x88,0xb3,0x43,0xd8,0x0b,0x17,0x9c,0x07}, - {0xff,0x6f,0xfa,0x64,0xe4,0xec,0x06,0x05,0x23,0xe5,0x05,0x62,0x1e,0x43,0xe3,0xbe,0x42,0xea,0xb8,0x51,0x24,0x42,0x79,0x35,0x00,0xfb,0xc9,0x4a,0xe3,0x05,0xec,0x6d,0x56,0xd0,0xd5,0xc0,0x50,0xcd,0xd6,0xcd,0x3b,0x57,0x03,0xbb,0x6d,0x68,0xf7,0x9a,0x48,0xef,0xc3,0xf3,0x3f,0x72,0xa6,0x3c,0xcc,0x8a,0x7b,0x31,0xd7,0xc0,0x68,0x67,0xb3,0xc1,0x55,0xf1,0xe5,0x25,0xb6,0x94,0x91,0x7b,0x7b,0x99,0xa7,0xf3,0x7b,0x41,0x00,0x26,0x6b,0x6d,0xdc,0xbd,0x2c,0xc2,0xf4,0x52,0xcd,0xdd,0x14,0x5e,0x44,0x51}, - {0x51,0x49,0x14,0x3b,0x4b,0x2b,0x50,0x57,0xb3,0xbc,0x4b,0x44,0x6b,0xff,0x67,0x8e,0xdb,0x85,0x63,0x16,0x27,0x69,0xbd,0xb8,0xc8,0x95,0x92,0xe3,0x31,0x6f,0x18,0x13,0x55,0xa4,0xbe,0x2b,0xab,0x47,0x31,0x89,0x29,0x91,0x07,0x92,0x4f,0xa2,0x53,0x8c,0xa7,0xf7,0x30,0xbe,0x48,0xf9,0x49,0x4b,0x3d,0xd4,0x4f,0x6e,0x08,0x90,0xe9,0x12,0x2e,0xbb,0xdf,0x7f,0xb3,0x96,0x0c,0xf1,0xf9,0xea,0x1c,0x12,0x5e,0x93,0x9a,0x9f,0x3f,0x98,0x5b,0x3a,0xc4,0x36,0x11,0xdf,0xaf,0x99,0x3e,0x5d,0xf0,0xe3,0xb2,0x77}, - {0xde,0xc4,0x2e,0x9c,0xc5,0xa9,0x6f,0x29,0xcb,0xf3,0x84,0x4f,0xbf,0x61,0x8b,0xbc,0x08,0xf9,0xa8,0x17,0xd9,0x06,0x77,0x1c,0x5d,0x25,0xd3,0x7a,0xfc,0x95,0xb7,0x63,0xa4,0xb0,0xdd,0x12,0x9c,0x63,0x98,0xd5,0x6b,0x86,0x24,0xc0,0x30,0x9f,0xd1,0xa5,0x60,0xe4,0xfc,0x58,0x03,0x2f,0x7c,0xd1,0x8a,0x5e,0x09,0x2e,0x15,0x95,0xa1,0x07,0xc8,0x5f,0x9e,0x38,0x02,0x8f,0x36,0xa8,0x3b,0xe4,0x8d,0xcf,0x02,0x3b,0x43,0x90,0x43,0x26,0x41,0xc5,0x5d,0xfd,0xa1,0xaf,0x37,0x01,0x2f,0x03,0x3d,0xe8,0x8f,0x3e}, - {0x94,0xa2,0x70,0x05,0xb9,0x15,0x8b,0x2f,0x49,0x45,0x08,0x67,0x70,0x42,0xf2,0x94,0x84,0xfd,0xbb,0x61,0xe1,0x5a,0x1c,0xde,0x07,0x40,0xac,0x7f,0x79,0x3b,0xba,0x75,0x3c,0xd1,0xef,0xe8,0x8d,0x4c,0x70,0x08,0x31,0x37,0xe0,0x33,0x8e,0x1a,0xc5,0xdf,0xe3,0xcd,0x60,0x12,0xa5,0x5d,0x9d,0xa5,0x86,0x8c,0x25,0xa6,0x99,0x08,0xd6,0x22,0x96,0xd1,0xcd,0x70,0xc0,0xdb,0x39,0x62,0x9a,0x8a,0x7d,0x6c,0x8b,0x8a,0xfe,0x60,0x60,0x12,0x40,0xeb,0xbc,0x47,0x88,0xb3,0x5e,0x9e,0x77,0x87,0x7b,0xd0,0x04,0x09}, - {0x9c,0x91,0xba,0xdd,0xd4,0x1f,0xce,0xb4,0xaa,0x8d,0x4c,0xc7,0x3e,0xdb,0x31,0xcf,0x51,0xcc,0x86,0xad,0x63,0xcc,0x63,0x2c,0x07,0xde,0x1d,0xbc,0x3f,0x14,0xe2,0x43,0xb9,0x40,0xf9,0x48,0x66,0x2d,0x32,0xf4,0x39,0x0c,0x2d,0xbd,0x0c,0x2f,0x95,0x06,0x31,0xf9,0x81,0xa0,0xad,0x97,0x76,0x16,0x6c,0x2a,0xf7,0xba,0xce,0xaa,0x40,0x62,0xa0,0x95,0xa2,0x5b,0x9c,0x74,0x34,0xf8,0x5a,0xd2,0x37,0xca,0x5b,0x7c,0x94,0xd6,0x6a,0x31,0xc9,0xe7,0xa7,0x3b,0xf1,0x66,0xac,0x0c,0xb4,0x8d,0x23,0xaf,0xbd,0x56}, - {0xeb,0x33,0x35,0xf5,0xe3,0xb9,0x2a,0x36,0x40,0x3d,0xb9,0x6e,0xd5,0x68,0x85,0x33,0x72,0x55,0x5a,0x1d,0x52,0x14,0x0e,0x9e,0x18,0x13,0x74,0x83,0x6d,0xa8,0x24,0x1d,0xb2,0x3b,0x9d,0xc1,0x6c,0xd3,0x10,0x13,0xb9,0x86,0x23,0x62,0xb7,0x6b,0x2a,0x06,0x5c,0x4f,0xa1,0xd7,0x91,0x85,0x9b,0x7c,0x54,0x57,0x1e,0x7e,0x50,0x31,0xaa,0x03,0x1f,0xce,0xd4,0xff,0x48,0x76,0xec,0xf4,0x1c,0x8c,0xac,0x54,0xf0,0xea,0x45,0xe0,0x7c,0x35,0x09,0x1d,0x82,0x25,0xd2,0x88,0x59,0x48,0xeb,0x9a,0xdc,0x61,0xb2,0x43}, - {0xbb,0x79,0xbb,0x88,0x19,0x1e,0x5b,0xe5,0x9d,0x35,0x7a,0xc1,0x7d,0xd0,0x9e,0xa0,0x33,0xea,0x3d,0x60,0xe2,0x2e,0x2c,0xb0,0xc2,0x6b,0x27,0x5b,0xcf,0x55,0x60,0x32,0x64,0x13,0x95,0x6c,0x8b,0x3d,0x51,0x19,0x7b,0xf4,0x0b,0x00,0x26,0x71,0xfe,0x94,0x67,0x95,0x4f,0xd5,0xdd,0x10,0x8d,0x02,0x64,0x09,0x94,0x42,0xe2,0xd5,0xb4,0x02,0xf2,0x8d,0xd1,0x28,0xcb,0x55,0xa1,0xb4,0x08,0xe5,0x6c,0x18,0x46,0x46,0xcc,0xea,0x89,0x43,0x82,0x6c,0x93,0xf4,0x9c,0xc4,0x10,0x34,0x5d,0xae,0x09,0xc8,0xa6,0x27}, - {0x88,0xb1,0x0d,0x1f,0xcd,0xeb,0xa6,0x8b,0xe8,0x5b,0x5a,0x67,0x3a,0xd7,0xd3,0x37,0x5a,0x58,0xf5,0x15,0xa3,0xdf,0x2e,0xf2,0x7e,0xa1,0x60,0xff,0x74,0x71,0xb6,0x2c,0x54,0x69,0x3d,0xc4,0x0a,0x27,0x2c,0xcd,0xb2,0xca,0x66,0x6a,0x57,0x3e,0x4a,0xdd,0x6c,0x03,0xd7,0x69,0x24,0x59,0xfa,0x79,0x99,0x25,0x8c,0x3d,0x60,0x03,0x15,0x22,0xd0,0xe1,0x0b,0x39,0xf9,0xcd,0xee,0x59,0xf1,0xe3,0x8c,0x72,0x44,0x20,0x42,0xa9,0xf4,0xf0,0x94,0x7a,0x66,0x1c,0x89,0x82,0x36,0xf4,0x90,0x38,0xb7,0xf4,0x1d,0x7b}, - {0x24,0xa2,0xb2,0xb3,0xe0,0xf2,0x92,0xe4,0x60,0x11,0x55,0x2b,0x06,0x9e,0x6c,0x7c,0x0e,0x7b,0x7f,0x0d,0xe2,0x8f,0xeb,0x15,0x92,0x59,0xfc,0x58,0x26,0xef,0xfc,0x61,0x8c,0xf5,0xf8,0x07,0x18,0x22,0x2e,0x5f,0xd4,0x09,0x94,0xd4,0x9f,0x5c,0x55,0xe3,0x30,0xa6,0xb6,0x1f,0x8d,0xa8,0xaa,0xb2,0x3d,0xe0,0x52,0xd3,0x45,0x82,0x69,0x68,0x7a,0x18,0x18,0x2a,0x85,0x5d,0xb1,0xdb,0xd7,0xac,0xdd,0x86,0xd3,0xaa,0xe4,0xf3,0x82,0xc4,0xf6,0x0f,0x81,0xe2,0xba,0x44,0xcf,0x01,0xaf,0x3d,0x47,0x4c,0xcf,0x46}, - {0xf9,0xe5,0xc4,0x9e,0xed,0x25,0x65,0x42,0x03,0x33,0x90,0x16,0x01,0xda,0x5e,0x0e,0xdc,0xca,0xe5,0xcb,0xf2,0xa7,0xb1,0x72,0x40,0x5f,0xeb,0x14,0xcd,0x7b,0x38,0x29,0x40,0x81,0x49,0xf1,0xa7,0x6e,0x3c,0x21,0x54,0x48,0x2b,0x39,0xf8,0x7e,0x1e,0x7c,0xba,0xce,0x29,0x56,0x8c,0xc3,0x88,0x24,0xbb,0xc5,0x8c,0x0d,0xe5,0xaa,0x65,0x10,0x57,0x0d,0x20,0xdf,0x25,0x45,0x2c,0x1c,0x4a,0x67,0xca,0xbf,0xd6,0x2d,0x3b,0x5c,0x30,0x40,0x83,0xe1,0xb1,0xe7,0x07,0x0a,0x16,0xe7,0x1c,0x4f,0xe6,0x98,0xa1,0x69}, - {0xbc,0x78,0x1a,0xd9,0xe0,0xb2,0x62,0x90,0x67,0x96,0x50,0xc8,0x9c,0x88,0xc9,0x47,0xb8,0x70,0x50,0x40,0x66,0x4a,0xf5,0x9d,0xbf,0xa1,0x93,0x24,0xa9,0xe6,0x69,0x73,0xed,0xca,0xc5,0xdc,0x34,0x44,0x01,0xe1,0x33,0xfb,0x84,0x3c,0x96,0x5d,0xed,0x47,0xe7,0xa0,0x86,0xed,0x76,0x95,0x01,0x70,0xe4,0xf9,0x67,0xd2,0x7b,0x69,0xb2,0x25,0x64,0x68,0x98,0x13,0xfb,0x3f,0x67,0x9d,0xb8,0xc7,0x5d,0x41,0xd9,0xfb,0xa5,0x3c,0x5e,0x3b,0x27,0xdf,0x3b,0xcc,0x4e,0xe0,0xd2,0x4c,0x4e,0xb5,0x3d,0x68,0x20,0x14}, - {0x97,0xd1,0x9d,0x24,0x1e,0xbd,0x78,0xb4,0x02,0xc1,0x58,0x5e,0x00,0x35,0x0c,0x62,0x5c,0xac,0xba,0xcc,0x2f,0xd3,0x02,0xfb,0x2d,0xa7,0x08,0xf5,0xeb,0x3b,0xb6,0x60,0xd0,0x5a,0xcc,0xc1,0x6f,0xbb,0xee,0x34,0x8b,0xac,0x46,0x96,0xe9,0x0c,0x1b,0x6a,0x53,0xde,0x6b,0xa6,0x49,0xda,0xb0,0xd3,0xc1,0x81,0xd0,0x61,0x41,0x3b,0xe8,0x31,0x4f,0x2b,0x06,0x9e,0x12,0xc7,0xe8,0x97,0xd8,0x0a,0x32,0x29,0x4f,0x8f,0xe4,0x49,0x3f,0x68,0x18,0x6f,0x4b,0xe1,0xec,0x5b,0x17,0x03,0x55,0x2d,0xb6,0x1e,0xcf,0x55}, - {0x58,0x3d,0xc2,0x65,0x10,0x10,0x79,0x58,0x9c,0x81,0x94,0x50,0x6d,0x08,0x9d,0x8b,0xa7,0x5f,0xc5,0x12,0xa9,0x2f,0x40,0xe2,0xd4,0x91,0x08,0x57,0x64,0x65,0x9a,0x66,0x52,0x8c,0xf5,0x7d,0xe3,0xb5,0x76,0x30,0x36,0xcc,0x99,0xe7,0xdd,0xb9,0x3a,0xd7,0x20,0xee,0x13,0x49,0xe3,0x1c,0x83,0xbd,0x33,0x01,0xba,0x62,0xaa,0xfb,0x56,0x1a,0xec,0xc9,0x9d,0x5c,0x50,0x6b,0x3e,0x94,0x1a,0x37,0x7c,0xa7,0xbb,0x57,0x25,0x30,0x51,0x76,0x34,0x41,0x56,0xae,0x73,0x98,0x5c,0x8a,0xc5,0x99,0x67,0x83,0xc4,0x13}, - {0xb9,0xe1,0xb3,0x5a,0x46,0x5d,0x3a,0x42,0x61,0x3f,0xf1,0xc7,0x87,0xc1,0x13,0xfc,0xb6,0xb9,0xb5,0xec,0x64,0x36,0xf8,0x19,0x07,0xb6,0x37,0xa6,0x93,0x0c,0xf8,0x66,0x80,0xd0,0x8b,0x5d,0x6a,0xfb,0xdc,0xc4,0x42,0x48,0x1a,0x57,0xec,0xc4,0xeb,0xde,0x65,0x53,0xe5,0xb8,0x83,0xe8,0xb2,0xd4,0x27,0xb8,0xe5,0xc8,0x7d,0xc8,0xbd,0x50,0x11,0xe1,0xdf,0x6e,0x83,0x37,0x6d,0x60,0xd9,0xab,0x11,0xf0,0x15,0x3e,0x35,0x32,0x96,0x3b,0xb7,0x25,0xc3,0x3a,0xb0,0x64,0xae,0xd5,0x5f,0x72,0x44,0x64,0xd5,0x1d}, - {0x7d,0x12,0x62,0x33,0xf8,0x7f,0xa4,0x8f,0x15,0x7c,0xcd,0x71,0xc4,0x6a,0x9f,0xbc,0x8b,0x0c,0x22,0x49,0x43,0x45,0x71,0x6e,0x2e,0x73,0x9f,0x21,0x12,0x59,0x64,0x0e,0x9a,0xc8,0xba,0x08,0x00,0xe6,0x97,0xc2,0xe0,0xc3,0xe1,0xea,0x11,0xea,0x4c,0x7d,0x7c,0x97,0xe7,0x9f,0xe1,0x8b,0xe3,0xf3,0xcd,0x05,0xa3,0x63,0x0f,0x45,0x3a,0x3a,0x27,0x46,0x39,0xd8,0x31,0x2f,0x8f,0x07,0x10,0xa5,0x94,0xde,0x83,0x31,0x9d,0x38,0x80,0x6f,0x99,0x17,0x6d,0x6c,0xe3,0xd1,0x7b,0xa8,0xa9,0x93,0x93,0x8d,0x8c,0x31}, - {0x19,0xfe,0xff,0x2a,0x03,0x5d,0x74,0xf2,0x66,0xdb,0x24,0x7f,0x49,0x3c,0x9f,0x0c,0xef,0x98,0x85,0xba,0xe3,0xd3,0x98,0xbc,0x14,0x53,0x1d,0x9a,0x67,0x7c,0x4c,0x22,0x98,0xd3,0x1d,0xab,0x29,0x9e,0x66,0x5d,0x3b,0x9e,0x2d,0x34,0x58,0x16,0x92,0xfc,0xcd,0x73,0x59,0xf3,0xfd,0x1d,0x85,0x55,0xf6,0x0a,0x95,0x25,0xc3,0x41,0x9a,0x50,0xe9,0x25,0xf9,0xa6,0xdc,0x6e,0xc0,0xbd,0x33,0x1f,0x1b,0x64,0xf4,0xf3,0x3e,0x79,0x89,0x3e,0x83,0x9d,0x80,0x12,0xec,0x82,0x89,0x13,0xa1,0x28,0x23,0xf0,0xbf,0x05}, - {0x0b,0xe0,0xca,0x23,0x70,0x13,0x32,0x36,0x59,0xcf,0xac,0xd1,0x0a,0xcf,0x4a,0x54,0x88,0x1c,0x1a,0xd2,0x49,0x10,0x74,0x96,0xa7,0x44,0x2a,0xfa,0xc3,0x8c,0x0b,0x78,0xe4,0x12,0xc5,0x0d,0xdd,0xa0,0x81,0x68,0xfe,0xfa,0xa5,0x44,0xc8,0x0d,0xe7,0x4f,0x40,0x52,0x4a,0x8f,0x6b,0x8e,0x74,0x1f,0xea,0xa3,0x01,0xee,0xcd,0x77,0x62,0x57,0x5f,0x30,0x4f,0x23,0xbc,0x8a,0xf3,0x1e,0x08,0xde,0x05,0x14,0xbd,0x7f,0x57,0x9a,0x0d,0x2a,0xe6,0x34,0x14,0xa5,0x82,0x5e,0xa1,0xb7,0x71,0x62,0x72,0x18,0xf4,0x5f}, - {0x9d,0xdb,0x89,0x17,0x0c,0x08,0x8e,0x39,0xf5,0x78,0xe7,0xf3,0x25,0x20,0x60,0xa7,0x5d,0x03,0xbd,0x06,0x4c,0x89,0x98,0xfa,0xbe,0x66,0xa9,0x25,0xdc,0x03,0x6a,0x10,0x40,0x95,0xb6,0x13,0xe8,0x47,0xdb,0xe5,0xe1,0x10,0x26,0x43,0x3b,0x2a,0x5d,0xf3,0x76,0x12,0x78,0x38,0xe9,0x26,0x1f,0xac,0x69,0xcb,0xa0,0xa0,0x8c,0xdb,0xd4,0x29,0xd0,0x53,0x33,0x33,0xaf,0x0a,0xad,0xd9,0xe5,0x09,0xd3,0xac,0xa5,0x9d,0x66,0x38,0xf0,0xf7,0x88,0xc8,0x8a,0x65,0x57,0x3c,0xfa,0xbe,0x2c,0x05,0x51,0x8a,0xb3,0x4a}, - {0x93,0xd5,0x68,0x67,0x25,0x2b,0x7c,0xda,0x13,0xca,0x22,0x44,0x57,0xc0,0xc1,0x98,0x1d,0xce,0x0a,0xca,0xd5,0x0b,0xa8,0xf1,0x90,0xa6,0x88,0xc0,0xad,0xd1,0xcd,0x29,0x9c,0xc0,0xdd,0x5f,0xef,0xd1,0xcf,0xd6,0xce,0x5d,0x57,0xf7,0xfd,0x3e,0x2b,0xe8,0xc2,0x34,0x16,0x20,0x5d,0x6b,0xd5,0x25,0x9b,0x2b,0xed,0x04,0xbb,0xc6,0x41,0x30,0x48,0xe1,0x56,0xd9,0xf9,0xf2,0xf2,0x0f,0x2e,0x6b,0x35,0x9f,0x75,0x97,0xe7,0xad,0x5c,0x02,0x6c,0x5f,0xbb,0x98,0x46,0x1a,0x7b,0x9a,0x04,0x14,0x68,0xbd,0x4b,0x10}, - {0x67,0xed,0xf1,0x68,0x31,0xfd,0xf0,0x51,0xc2,0x3b,0x6f,0xd8,0xcd,0x1d,0x81,0x2c,0xde,0xf2,0xd2,0x04,0x43,0x5c,0xdc,0x44,0x49,0x71,0x2a,0x09,0x57,0xcc,0xe8,0x5b,0x63,0xf1,0x7f,0xd6,0x5f,0x9a,0x5d,0xa9,0x81,0x56,0xc7,0x4c,0x9d,0xe6,0x2b,0xe9,0x57,0xf2,0x20,0xde,0x4c,0x02,0xf8,0xb7,0xf5,0x2d,0x07,0xfb,0x20,0x2a,0x4f,0x20,0x79,0xb0,0xeb,0x30,0x3d,0x3b,0x14,0xc8,0x30,0x2e,0x65,0xbd,0x5a,0x15,0x89,0x75,0x31,0x5c,0x6d,0x8f,0x31,0x3c,0x3c,0x65,0x1f,0x16,0x79,0xc2,0x17,0xfb,0x70,0x25}, - {0x75,0x15,0xb6,0x2c,0x7f,0x36,0xfa,0x3e,0x6c,0x02,0xd6,0x1c,0x76,0x6f,0xf9,0xf5,0x62,0x25,0xb5,0x65,0x2a,0x14,0xc7,0xe8,0xcd,0x0a,0x03,0x53,0xea,0x65,0xcb,0x3d,0x5a,0x24,0xb8,0x0b,0x55,0xa9,0x2e,0x19,0xd1,0x50,0x90,0x8f,0xa8,0xfb,0xe6,0xc8,0x35,0xc9,0xa4,0x88,0x2d,0xea,0x86,0x79,0x68,0x86,0x01,0xde,0x91,0x5f,0x1c,0x24,0xaa,0x6c,0xde,0x40,0x29,0x17,0xd8,0x28,0x3a,0x73,0xd9,0x22,0xf0,0x2c,0xbf,0x8f,0xd1,0x01,0x5b,0x23,0xdd,0xfc,0xd7,0x16,0xe5,0xf0,0xcd,0x5f,0xdd,0x0e,0x42,0x08}, - {0x4a,0xfa,0x62,0x83,0xab,0x20,0xff,0xcd,0x6e,0x3e,0x1a,0xe2,0xd4,0x18,0xe1,0x57,0x2b,0xe6,0x39,0xfc,0x17,0x96,0x17,0xe3,0xfd,0x69,0x17,0xbc,0xef,0x53,0x9a,0x0d,0xce,0x10,0xf4,0x04,0x4e,0xc3,0x58,0x03,0x85,0x06,0x6e,0x27,0x5a,0x5b,0x13,0xb6,0x21,0x15,0xb9,0xeb,0xc7,0x70,0x96,0x5d,0x9c,0x88,0xdb,0x21,0xf3,0x54,0xd6,0x04,0xd5,0xb5,0xbd,0xdd,0x16,0xc1,0x7d,0x5e,0x2d,0xdd,0xa5,0x8d,0xb6,0xde,0x54,0x29,0x92,0xa2,0x34,0x33,0x17,0x08,0xb6,0x1c,0xd7,0x1a,0x99,0x18,0x26,0x4f,0x7a,0x4a}, - {0x95,0x5f,0xb1,0x5f,0x02,0x18,0xa7,0xf4,0x8f,0x1b,0x5c,0x6b,0x34,0x5f,0xf6,0x3d,0x12,0x11,0xe0,0x00,0x85,0xf0,0xfc,0xcd,0x48,0x18,0xd3,0xdd,0x4c,0x0c,0xb5,0x11,0x4b,0x2a,0x37,0xaf,0x91,0xb2,0xc3,0x24,0xf2,0x47,0x81,0x71,0x70,0x82,0xda,0x93,0xf2,0x9e,0x89,0x86,0x64,0x85,0x84,0xdd,0x33,0xee,0xe0,0x23,0x42,0x31,0x96,0x4a,0xd6,0xff,0xa4,0x08,0x44,0x27,0xe8,0xa6,0xd9,0x76,0x15,0x9c,0x7e,0x17,0x8e,0x73,0xf2,0xb3,0x02,0x3d,0xb6,0x48,0x33,0x77,0x51,0xcc,0x6b,0xce,0x4d,0xce,0x4b,0x4f}, - {0x84,0x25,0x24,0xe2,0x5a,0xce,0x1f,0xa7,0x9e,0x8a,0xf5,0x92,0x56,0x72,0xea,0x26,0xf4,0x3c,0xea,0x1c,0xd7,0x09,0x1a,0xd2,0xe6,0x01,0x1c,0xb7,0x14,0xdd,0xfc,0x73,0x6f,0x0b,0x9d,0xc4,0x6e,0x61,0xe2,0x30,0x17,0x23,0xec,0xca,0x8f,0x71,0x56,0xe4,0xa6,0x4f,0x6b,0xf2,0x9b,0x40,0xeb,0x48,0x37,0x5f,0x59,0x61,0xe5,0xce,0x42,0x30,0x41,0xac,0x9b,0x44,0x79,0x70,0x7e,0x42,0x0a,0x31,0xe2,0xbc,0x6d,0xe3,0x5a,0x85,0x7c,0x1a,0x84,0x5f,0x21,0x76,0xae,0x4c,0xd6,0xe1,0x9c,0x9a,0x0c,0x74,0x9e,0x38}, - {0xce,0xb9,0xdc,0x34,0xae,0xb3,0xfc,0x64,0xad,0xd0,0x48,0xe3,0x23,0x03,0x50,0x97,0x1b,0x38,0xc6,0x62,0x7d,0xf0,0xb3,0x45,0x88,0x67,0x5a,0x46,0x79,0x53,0x54,0x61,0x28,0xac,0x0e,0x57,0xf6,0x78,0xbd,0xc9,0xe1,0x9c,0x91,0x27,0x32,0x0b,0x5b,0xe5,0xed,0x91,0x9b,0xa1,0xab,0x3e,0xfc,0x65,0x90,0x36,0x26,0xd6,0xe5,0x25,0xc4,0x25,0x6e,0xde,0xd7,0xf1,0xa6,0x06,0x3e,0x3f,0x08,0x23,0x06,0x8e,0x27,0x76,0xf9,0x3e,0x77,0x6c,0x8a,0x4e,0x26,0xf6,0x14,0x8c,0x59,0x47,0x48,0x15,0x89,0xa0,0x39,0x65}, - {0x73,0xf7,0xd2,0xc3,0x74,0x1f,0xd2,0xe9,0x45,0x68,0xc4,0x25,0x41,0x54,0x50,0xc1,0x33,0x9e,0xb9,0xf9,0xe8,0x5c,0x4e,0x62,0x6c,0x18,0xcd,0xc5,0xaa,0xe4,0xc5,0x11,0x19,0x4a,0xbb,0x14,0xd4,0xdb,0xc4,0xdd,0x8e,0x4f,0x42,0x98,0x3c,0xbc,0xb2,0x19,0x69,0x71,0xca,0x36,0xd7,0x9f,0xa8,0x48,0x90,0xbd,0x19,0xf0,0x0e,0x32,0x65,0x0f,0xc6,0xe0,0xfd,0xca,0xb1,0xd1,0x86,0xd4,0x81,0x51,0x3b,0x16,0xe3,0xe6,0x3f,0x4f,0x9a,0x93,0xf2,0xfa,0x0d,0xaf,0xa8,0x59,0x2a,0x07,0x33,0xec,0xbd,0xc7,0xab,0x4c}, - {0x2e,0x0a,0x9c,0x08,0x24,0x96,0x9e,0x23,0x38,0x47,0xfe,0x3a,0xc0,0xc4,0x48,0xc7,0x2a,0xa1,0x4f,0x76,0x2a,0xed,0xdb,0x17,0x82,0x85,0x1c,0x32,0xf0,0x93,0x9b,0x63,0x89,0xd2,0x78,0x3f,0x8f,0x78,0x8f,0xc0,0x9f,0x4d,0x40,0xa1,0x2c,0xa7,0x30,0xfe,0x9d,0xcc,0x65,0xcf,0xfc,0x8b,0x77,0xf2,0x21,0x20,0xcb,0x5a,0x16,0x98,0xe4,0x7e,0xc3,0xa1,0x11,0x91,0xe3,0x08,0xd5,0x7b,0x89,0x74,0x90,0x80,0xd4,0x90,0x2b,0x2b,0x19,0xfd,0x72,0xae,0xc2,0xae,0xd2,0xe7,0xa6,0x02,0xb6,0x85,0x3c,0x49,0xdf,0x0e}, - {0x68,0x5a,0x9b,0x59,0x58,0x81,0xcc,0xae,0x0e,0xe2,0xad,0xeb,0x0f,0x4f,0x57,0xea,0x07,0x7f,0xb6,0x22,0x74,0x1d,0xe4,0x4f,0xb4,0x4f,0x9d,0x01,0xe3,0x92,0x3b,0x40,0x13,0x41,0x76,0x84,0xd2,0xc4,0x67,0x67,0x35,0xf8,0xf5,0xf7,0x3f,0x40,0x90,0xa0,0xde,0xbe,0xe6,0xca,0xfa,0xcf,0x8f,0x1c,0x69,0xa3,0xdf,0xd1,0x54,0x0c,0xc0,0x04,0xf8,0x5c,0x46,0x8b,0x81,0x2f,0xc2,0x4d,0xf8,0xef,0x80,0x14,0x5a,0xf3,0xa0,0x71,0x57,0xd6,0xc7,0x04,0xad,0xbf,0xe8,0xae,0xf4,0x76,0x61,0xb2,0x2a,0xb1,0x5b,0x35}, - {0xf4,0xbb,0x93,0x74,0xcc,0x64,0x1e,0xa7,0xc3,0xb0,0xa3,0xec,0xd9,0x84,0xbd,0xe5,0x85,0xe7,0x05,0xfa,0x0c,0xc5,0x6b,0x0a,0x12,0xc3,0x2e,0x18,0x32,0x81,0x9b,0x0f,0x18,0x73,0x8c,0x5a,0xc7,0xda,0x01,0xa3,0x11,0xaa,0xce,0xb3,0x9d,0x03,0x90,0xed,0x2d,0x3f,0xae,0x3b,0xbf,0x7c,0x07,0x6f,0x8e,0xad,0x52,0xe0,0xf8,0xea,0x18,0x75,0x32,0x6c,0x7f,0x1b,0xc4,0x59,0x88,0xa4,0x98,0x32,0x38,0xf4,0xbc,0x60,0x2d,0x0f,0xd9,0xd1,0xb1,0xc9,0x29,0xa9,0x15,0x18,0xc4,0x55,0x17,0xbb,0x1b,0x87,0xc3,0x47}, - {0x48,0x4f,0xec,0x71,0x97,0x53,0x44,0x51,0x6e,0x5d,0x8c,0xc9,0x7d,0xb1,0x05,0xf8,0x6b,0xc6,0xc3,0x47,0x1a,0xc1,0x62,0xf7,0xdc,0x99,0x46,0x76,0x85,0x9b,0xb8,0x00,0xb0,0x66,0x50,0xc8,0x50,0x5d,0xe6,0xfb,0xb0,0x99,0xa2,0xb3,0xb0,0xc4,0xec,0x62,0xe0,0xe8,0x1a,0x44,0xea,0x54,0x37,0xe5,0x5f,0x8d,0xd4,0xe8,0x2c,0xa0,0xfe,0x08,0xd0,0xea,0xde,0x68,0x76,0xdd,0x4d,0x82,0x23,0x5d,0x68,0x4b,0x20,0x45,0x64,0xc8,0x65,0xd6,0x89,0x5d,0xcd,0xcf,0x14,0xb5,0x37,0xd5,0x75,0x4f,0xa7,0x29,0x38,0x47}, - {0x18,0xc4,0x79,0x46,0x75,0xda,0xd2,0x82,0xf0,0x8d,0x61,0xb2,0xd8,0xd7,0x3b,0xe6,0x0a,0xeb,0x47,0xac,0x24,0xef,0x5e,0x35,0xb4,0xc6,0x33,0x48,0x4c,0x68,0x78,0x20,0xc9,0x02,0x39,0xad,0x3a,0x53,0xd9,0x23,0x8f,0x58,0x03,0xef,0xce,0xdd,0xc2,0x64,0xb4,0x2f,0xe1,0xcf,0x90,0x73,0x25,0x15,0x90,0xd3,0xe4,0x44,0x4d,0x8b,0x66,0x6c,0x0c,0x82,0x78,0x7a,0x21,0xcf,0x48,0x3b,0x97,0x3e,0x27,0x81,0xb2,0x0a,0x6a,0xf7,0x7b,0xed,0x8e,0x8c,0xa7,0x65,0x6c,0xa9,0x3f,0x43,0x8a,0x4f,0x05,0xa6,0x11,0x74}, - {0x6d,0xc8,0x9d,0xb9,0x32,0x9d,0x65,0x4d,0x15,0xf1,0x3a,0x60,0x75,0xdc,0x4c,0x04,0x88,0xe4,0xc2,0xdc,0x2c,0x71,0x4c,0xb3,0xff,0x34,0x81,0xfb,0x74,0x65,0x13,0x7c,0xb4,0x75,0xb1,0x18,0x3d,0xe5,0x9a,0x57,0x02,0xa1,0x92,0xf3,0x59,0x31,0x71,0x68,0xf5,0x35,0xef,0x1e,0xba,0xec,0x55,0x84,0x8f,0x39,0x8c,0x45,0x72,0xa8,0xc9,0x1e,0x9b,0x50,0xa2,0x00,0xd4,0xa4,0xe6,0xb8,0xb4,0x82,0xc8,0x0b,0x02,0xd7,0x81,0x9b,0x61,0x75,0x95,0xf1,0x9b,0xcc,0xe7,0x57,0x60,0x64,0xcd,0xc7,0xa5,0x88,0xdd,0x3a}, - {0xf2,0xdc,0x35,0xb6,0x70,0x57,0x89,0xab,0xbc,0x1f,0x6c,0xf6,0x6c,0xef,0xdf,0x02,0x87,0xd1,0xb6,0xbe,0x68,0x02,0x53,0x85,0x74,0x9e,0x87,0xcc,0xfc,0x29,0x99,0x24,0x46,0x30,0x39,0x59,0xd4,0x98,0xc2,0x85,0xec,0x59,0xf6,0x5f,0x98,0x35,0x7e,0x8f,0x3a,0x6e,0xf6,0xf2,0x2a,0xa2,0x2c,0x1d,0x20,0xa7,0x06,0xa4,0x31,0x11,0xba,0x61,0x29,0x90,0x95,0x16,0xf1,0xa0,0xd0,0xa3,0x89,0xbd,0x7e,0xba,0x6c,0x6b,0x3b,0x02,0x07,0x33,0x78,0x26,0x3e,0x5a,0xf1,0x7b,0xe7,0xec,0xd8,0xbb,0x0c,0x31,0x20,0x56}, - {0x43,0xd6,0x34,0x49,0x43,0x93,0x89,0x52,0xf5,0x22,0x12,0xa5,0x06,0xf8,0xdb,0xb9,0x22,0x1c,0xf4,0xc3,0x8f,0x87,0x6d,0x8f,0x30,0x97,0x9d,0x4d,0x2a,0x6a,0x67,0x37,0xd6,0x85,0xe2,0x77,0xf4,0xb5,0x46,0x66,0x93,0x61,0x8f,0x6c,0x67,0xff,0xe8,0x40,0xdd,0x94,0xb5,0xab,0x11,0x73,0xec,0xa6,0x4d,0xec,0x8c,0x65,0xf3,0x46,0xc8,0x7e,0xc7,0x2e,0xa2,0x1d,0x3f,0x8f,0x5e,0x9b,0x13,0xcd,0x01,0x6c,0x77,0x1d,0x0f,0x13,0xb8,0x9f,0x98,0xa2,0xcf,0x8f,0x4c,0x21,0xd5,0x9d,0x9b,0x39,0x23,0xf7,0xaa,0x6d}, - {0x47,0xbe,0x3d,0xeb,0x62,0x75,0x3a,0x5f,0xb8,0xa0,0xbd,0x8e,0x54,0x38,0xea,0xf7,0x99,0x72,0x74,0x45,0x31,0xe5,0xc3,0x00,0x51,0xd5,0x27,0x16,0xe7,0xe9,0x04,0x13,0xa2,0x8e,0xad,0xac,0xbf,0x04,0x3b,0x58,0x84,0xe8,0x8b,0x14,0xe8,0x43,0xb7,0x29,0xdb,0xc5,0x10,0x08,0x3b,0x58,0x1e,0x2b,0xaa,0xbb,0xb3,0x8e,0xe5,0x49,0x54,0x2b,0xfe,0x9c,0xdc,0x6a,0xd2,0x14,0x98,0x78,0x0b,0xdd,0x48,0x8b,0x3f,0xab,0x1b,0x3c,0x0a,0xc6,0x79,0xf9,0xff,0xe1,0x0f,0xda,0x93,0xd6,0x2d,0x7c,0x2d,0xde,0x68,0x44}, - {0x9e,0x46,0x19,0x94,0x5e,0x35,0xbb,0x51,0x54,0xc7,0xdd,0x23,0x4c,0xdc,0xe6,0x33,0x62,0x99,0x7f,0x44,0xd6,0xb6,0xa5,0x93,0x63,0xbd,0x44,0xfb,0x6f,0x7c,0xce,0x6c,0xce,0x07,0x63,0xf8,0xc6,0xd8,0x9a,0x4b,0x28,0x0c,0x5d,0x43,0x31,0x35,0x11,0x21,0x2c,0x77,0x7a,0x65,0xc5,0x66,0xa8,0xd4,0x52,0x73,0x24,0x63,0x7e,0x42,0xa6,0x5d,0xca,0x22,0xac,0xde,0x88,0xc6,0x94,0x1a,0xf8,0x1f,0xae,0xbb,0xf7,0x6e,0x06,0xb9,0x0f,0x58,0x59,0x8d,0x38,0x8c,0xad,0x88,0xa8,0x2c,0x9f,0xe7,0xbf,0x9a,0xf2,0x58}, - {0x68,0x3e,0xe7,0x8d,0xab,0xcf,0x0e,0xe9,0xa5,0x76,0x7e,0x37,0x9f,0x6f,0x03,0x54,0x82,0x59,0x01,0xbe,0x0b,0x5b,0x49,0xf0,0x36,0x1e,0xf4,0xa7,0xc4,0x29,0x76,0x57,0xf6,0xcd,0x0e,0x71,0xbf,0x64,0x5a,0x4b,0x3c,0x29,0x2c,0x46,0x38,0xe5,0x4c,0xb1,0xb9,0x3a,0x0b,0xd5,0x56,0xd0,0x43,0x36,0x70,0x48,0x5b,0x18,0x24,0x37,0xf9,0x6a,0x88,0xa8,0xc6,0x09,0x45,0x02,0x20,0x32,0x73,0x89,0x55,0x4b,0x13,0x36,0xe0,0xd2,0x9f,0x28,0x33,0x3c,0x23,0x36,0xe2,0x83,0x8f,0xc1,0xae,0x0c,0xbb,0x25,0x1f,0x70}, - {0xed,0x6c,0x61,0xe4,0xf8,0xb0,0xa8,0xc3,0x7d,0xa8,0x25,0x9e,0x0e,0x66,0x00,0xf7,0x9c,0xa5,0xbc,0xf4,0x1f,0x06,0xe3,0x61,0xe9,0x0b,0xc4,0xbd,0xbf,0x92,0x0c,0x2e,0x13,0xc1,0xbe,0x7c,0xd9,0xf6,0x18,0x9d,0xe4,0xdb,0xbf,0x74,0xe6,0x06,0x4a,0x84,0xd6,0x60,0x4e,0xac,0x22,0xb5,0xf5,0x20,0x51,0x5e,0x95,0x50,0xc0,0x5b,0x0a,0x72,0x35,0x5a,0x80,0x9b,0x43,0x09,0x3f,0x0c,0xfc,0xab,0x42,0x62,0x37,0x8b,0x4e,0xe8,0x46,0x93,0x22,0x5c,0xf3,0x17,0x14,0x69,0xec,0xf0,0x4e,0x14,0xbb,0x9c,0x9b,0x0e}, - {0xad,0x20,0x57,0xfb,0x8f,0xd4,0xba,0xfb,0x0e,0x0d,0xf9,0xdb,0x6b,0x91,0x81,0xee,0xbf,0x43,0x55,0x63,0x52,0x31,0x81,0xd4,0xd8,0x7b,0x33,0x3f,0xeb,0x04,0x11,0x22,0xee,0xbe,0xb1,0x5d,0xd5,0x9b,0xee,0x8d,0xb9,0x3f,0x72,0x0a,0x37,0xab,0xc3,0xc9,0x91,0xd7,0x68,0x1c,0xbf,0xf1,0xa8,0x44,0xde,0x3c,0xfd,0x1c,0x19,0x44,0x6d,0x36,0x14,0x8c,0xbc,0xf2,0x43,0x17,0x3c,0x9e,0x3b,0x6c,0x85,0xb5,0xfc,0x26,0xda,0x2e,0x97,0xfb,0xa7,0x68,0x0e,0x2f,0xb8,0xcc,0x44,0x32,0x59,0xbc,0xe6,0xa4,0x67,0x41}, - {0x00,0x27,0xf6,0x76,0x28,0x9d,0x3b,0x64,0xeb,0x68,0x76,0x0e,0x40,0x9d,0x1d,0x5d,0x84,0x06,0xfc,0x21,0x03,0x43,0x4b,0x1b,0x6a,0x24,0x55,0x22,0x7e,0xbb,0x38,0x79,0xee,0x8f,0xce,0xf8,0x65,0x26,0xbe,0xc2,0x2c,0xd6,0x80,0xe8,0x14,0xff,0x67,0xe9,0xee,0x4e,0x36,0x2f,0x7e,0x6e,0x2e,0xf1,0xf6,0xd2,0x7e,0xcb,0x70,0x33,0xb3,0x34,0xcc,0xd6,0x81,0x86,0xee,0x91,0xc5,0xcd,0x53,0xa7,0x85,0xed,0x9c,0x10,0x02,0xce,0x83,0x88,0x80,0x58,0xc1,0x85,0x74,0xed,0xe4,0x65,0xfe,0x2d,0x6e,0xfc,0x76,0x11}, - {0x9b,0x61,0x9c,0x5b,0xd0,0x6c,0xaf,0xb4,0x80,0x84,0xa5,0xb2,0xf4,0xc9,0xdf,0x2d,0xc4,0x4d,0xe9,0xeb,0x02,0xa5,0x4f,0x3d,0x34,0x5f,0x7d,0x67,0x4c,0x3a,0xfc,0x08,0xb8,0x0e,0x77,0x49,0x89,0xe2,0x90,0xdb,0xa3,0x40,0xf4,0xac,0x2a,0xcc,0xfb,0x98,0x9b,0x87,0xd7,0xde,0xfe,0x4f,0x35,0x21,0xb6,0x06,0x69,0xf2,0x54,0x3e,0x6a,0x1f,0xea,0x34,0x07,0xd3,0x99,0xc1,0xa4,0x60,0xd6,0x5c,0x16,0x31,0xb6,0x85,0xc0,0x40,0x95,0x82,0x59,0xf7,0x23,0x3e,0x33,0xe2,0xd1,0x00,0xb9,0x16,0x01,0xad,0x2f,0x4f}, - {0x54,0x4e,0xae,0x94,0x41,0xb2,0xbe,0x44,0x6c,0xef,0x57,0x18,0x51,0x1c,0x54,0x5f,0x98,0x04,0x8d,0x36,0x2d,0x6b,0x1e,0xa6,0xab,0xf7,0x2e,0x97,0xa4,0x84,0x54,0x44,0x38,0xb6,0x3b,0xb7,0x1d,0xd9,0x2c,0x96,0x08,0x9c,0x12,0xfc,0xaa,0x77,0x05,0xe6,0x89,0x16,0xb6,0xf3,0x39,0x9b,0x61,0x6f,0x81,0xee,0x44,0x29,0x5f,0x99,0x51,0x34,0x7c,0x7d,0xea,0x9f,0xd0,0xfc,0x52,0x91,0xf6,0x5c,0x93,0xb0,0x94,0x6c,0x81,0x4a,0x40,0x5c,0x28,0x47,0xaa,0x9a,0x8e,0x25,0xb7,0x93,0x28,0x04,0xa6,0x9c,0xb8,0x10}, - {0x9c,0x28,0x18,0x97,0x49,0x47,0x59,0x3d,0x26,0x3f,0x53,0x24,0xc5,0xf8,0xeb,0x12,0x15,0xef,0xc3,0x14,0xcb,0xbf,0x62,0x02,0x8e,0x51,0xb7,0x77,0xd5,0x78,0xb8,0x20,0x6e,0xf0,0x45,0x5a,0xbe,0x41,0x39,0x75,0x65,0x5f,0x9c,0x6d,0xed,0xae,0x7c,0xd0,0xb6,0x51,0xff,0x72,0x9c,0x6b,0x77,0x11,0xa9,0x4d,0x0d,0xef,0xd9,0xd1,0xd2,0x17,0x6a,0x3e,0x3f,0x07,0x18,0xaf,0xf2,0x27,0x69,0x10,0x52,0xd7,0x19,0xe5,0x3f,0xfd,0x22,0x00,0xa6,0x3c,0x2c,0xb7,0xe3,0x22,0xa7,0xc6,0x65,0xcc,0x63,0x4f,0x21,0x72}, - {0x93,0xa6,0x07,0x53,0x40,0x7f,0xe3,0xb4,0x95,0x67,0x33,0x2f,0xd7,0x14,0xa7,0xab,0x99,0x10,0x76,0x73,0xa7,0xd0,0xfb,0xd6,0xc9,0xcb,0x71,0x81,0xc5,0x48,0xdf,0x5f,0xc9,0x29,0x3b,0xf4,0xb9,0xb7,0x9d,0x1d,0x75,0x8f,0x51,0x4f,0x4a,0x82,0x05,0xd6,0xc4,0x9d,0x2f,0x31,0xbd,0x72,0xc0,0xf2,0xb0,0x45,0x15,0x5a,0x85,0xac,0x24,0x1f,0xaa,0x05,0x95,0x8e,0x32,0x08,0xd6,0x24,0xee,0x20,0x14,0x0c,0xd1,0xc1,0x48,0x47,0xa2,0x25,0xfb,0x06,0x5c,0xe4,0xff,0xc7,0xe6,0x95,0xe3,0x2a,0x9e,0x73,0xba,0x00}, - {0xd6,0x90,0x87,0x5c,0xde,0x98,0x2e,0x59,0xdf,0xa2,0xc2,0x45,0xd3,0xb7,0xbf,0xe5,0x22,0x99,0xb4,0xf9,0x60,0x3b,0x5a,0x11,0xf3,0x78,0xad,0x67,0x3e,0x3a,0x28,0x03,0x26,0xbb,0x88,0xea,0xf5,0x26,0x44,0xae,0xfb,0x3b,0x97,0x84,0xd9,0x79,0x06,0x36,0x50,0x4e,0x69,0x26,0x0c,0x03,0x9f,0x5c,0x26,0xd2,0x18,0xd5,0xe7,0x7d,0x29,0x72,0x39,0xb9,0x0c,0xbe,0xc7,0x1d,0x24,0x48,0x80,0x30,0x63,0x8b,0x4d,0x9b,0xf1,0x32,0x08,0x93,0x28,0x02,0x0d,0xc9,0xdf,0xd3,0x45,0x19,0x27,0x46,0x68,0x29,0xe1,0x05}, - {0x5a,0x49,0x9c,0x2d,0xb3,0xee,0x82,0xba,0x7c,0xb9,0x2b,0xf1,0xfc,0xc8,0xef,0xce,0xe0,0xd1,0xb5,0x93,0xae,0xab,0x2d,0xb0,0x9b,0x8d,0x69,0x13,0x9c,0x0c,0xc0,0x39,0x50,0x45,0x2c,0x24,0xc8,0xbb,0xbf,0xad,0xd9,0x81,0x30,0xd0,0xec,0x0c,0xc8,0xbc,0x92,0xdf,0xc8,0xf5,0xa6,0x66,0x35,0x84,0x4c,0xce,0x58,0x82,0xd3,0x25,0xcf,0x78,0x68,0x9d,0x48,0x31,0x8e,0x6b,0xae,0x15,0x87,0xf0,0x2b,0x9c,0xab,0x1c,0x85,0xaa,0x05,0xfa,0x4e,0xf0,0x97,0x5a,0xa7,0xc9,0x32,0xf8,0x3f,0x6b,0x07,0x52,0x6b,0x00}, - {0x1c,0x78,0x95,0x9d,0xe1,0xcf,0xe0,0x29,0xe2,0x10,0x63,0x96,0x18,0xdf,0x81,0xb6,0x39,0x6b,0x51,0x70,0xd3,0x39,0xdf,0x57,0x22,0x61,0xc7,0x3b,0x44,0xe3,0x57,0x4d,0x2d,0x08,0xce,0xb9,0x16,0x7e,0xcb,0xf5,0x29,0xbc,0x7a,0x41,0x4c,0xf1,0x07,0x34,0xab,0xa7,0xf4,0x2b,0xce,0x6b,0xb3,0xd4,0xce,0x75,0x9f,0x1a,0x56,0xe9,0xe2,0x7d,0xcb,0x5e,0xa5,0xb6,0xf4,0xd4,0x70,0xde,0x99,0xdb,0x85,0x5d,0x7f,0x52,0x01,0x48,0x81,0x9a,0xee,0xd3,0x40,0xc4,0xc9,0xdb,0xed,0x29,0x60,0x1a,0xaf,0x90,0x2a,0x6b}, - {0x97,0x1e,0xe6,0x9a,0xfc,0xf4,0x23,0x69,0xd1,0x5f,0x3f,0xe0,0x1d,0x28,0x35,0x57,0x2d,0xd1,0xed,0xe6,0x43,0xae,0x64,0xa7,0x4a,0x3e,0x2d,0xd1,0xe9,0xf4,0xd8,0x5f,0x0a,0xd8,0xb2,0x5b,0x24,0xf3,0xeb,0x77,0x9b,0x07,0xb9,0x2f,0x47,0x1b,0x30,0xd8,0x33,0x73,0xee,0x4c,0xf2,0xe6,0x47,0xc6,0x09,0x21,0x6c,0x27,0xc8,0x12,0x58,0x46,0xd9,0x62,0x10,0x2a,0xb2,0xbe,0x43,0x4d,0x16,0xdc,0x31,0x38,0x75,0xfb,0x65,0x70,0xd7,0x68,0x29,0xde,0x7b,0x4a,0x0d,0x18,0x90,0x67,0xb1,0x1c,0x2b,0x2c,0xb3,0x05}, - {0xfd,0xa8,0x4d,0xd2,0xcc,0x5e,0xc0,0xc8,0x83,0xef,0xdf,0x05,0xac,0x1a,0xcf,0xa1,0x61,0xcd,0xf9,0x7d,0xf2,0xef,0xbe,0xdb,0x99,0x1e,0x47,0x7b,0xa3,0x56,0x55,0x3b,0x95,0x81,0xd5,0x7a,0x2c,0xa4,0xfc,0xf7,0xcc,0xf3,0x33,0x43,0x6e,0x28,0x14,0x32,0x9d,0x97,0x0b,0x34,0x0d,0x9d,0xc2,0xb6,0xe1,0x07,0x73,0x56,0x48,0x1a,0x77,0x31,0x82,0xd4,0x4d,0xe1,0x24,0xc5,0xb0,0x32,0xb6,0xa4,0x2b,0x1a,0x54,0x51,0xb3,0xed,0xf3,0x5a,0x2b,0x28,0x48,0x60,0xd1,0xa3,0xeb,0x36,0x73,0x7a,0xd2,0x79,0xc0,0x4f}, - {0x7f,0x2f,0xbf,0x89,0xb0,0x38,0xc9,0x51,0xa7,0xe9,0xdf,0x02,0x65,0xbd,0x97,0x24,0x53,0xe4,0x80,0x78,0x9c,0xc0,0xff,0xff,0x92,0x8e,0xf9,0xca,0xce,0x67,0x45,0x12,0x0d,0xc5,0x86,0x0c,0x44,0x8b,0x34,0xdc,0x51,0xe6,0x94,0xcc,0xc9,0xcb,0x37,0x13,0xb9,0x3c,0x3e,0x64,0x4d,0xf7,0x22,0x64,0x08,0xcd,0xe3,0xba,0xc2,0x70,0x11,0x24,0xb4,0x73,0xc4,0x0a,0x86,0xab,0xf9,0x3f,0x35,0xe4,0x13,0x01,0xee,0x1d,0x91,0xf0,0xaf,0xc4,0xc6,0xeb,0x60,0x50,0xe7,0x4a,0x0d,0x00,0x87,0x6c,0x96,0x12,0x86,0x3f}, - {0xde,0x0d,0x2a,0x78,0xc9,0x0c,0x9a,0x55,0x85,0x83,0x71,0xea,0xb2,0xcd,0x1d,0x55,0x8c,0x23,0xef,0x31,0x5b,0x86,0x62,0x7f,0x3d,0x61,0x73,0x79,0x76,0xa7,0x4a,0x50,0x13,0x8d,0x04,0x36,0xfa,0xfc,0x18,0x9c,0xdd,0x9d,0x89,0x73,0xb3,0x9d,0x15,0x29,0xaa,0xd0,0x92,0x9f,0x0b,0x35,0x9f,0xdc,0xd4,0x19,0x8a,0x87,0xee,0x7e,0xf5,0x26,0xb1,0xef,0x87,0x56,0xd5,0x2c,0xab,0x0c,0x7b,0xf1,0x7a,0x24,0x62,0xd1,0x80,0x51,0x67,0x24,0x5a,0x4f,0x34,0x5a,0xc1,0x85,0x69,0x30,0xba,0x9d,0x3d,0x94,0x41,0x40}, - {0x96,0xcc,0xeb,0x43,0xba,0xee,0xc0,0xc3,0xaf,0x9c,0xea,0x26,0x9c,0x9c,0x74,0x8d,0xc6,0xcc,0x77,0x1c,0xee,0x95,0xfa,0xd9,0x0f,0x34,0x84,0x76,0xd9,0xa1,0x20,0x14,0xdd,0xaa,0x6c,0xa2,0x43,0x77,0x21,0x4b,0xce,0xb7,0x8a,0x64,0x24,0xb4,0xa6,0x47,0xe3,0xc9,0xfb,0x03,0x7a,0x4f,0x1d,0xcb,0x19,0xd0,0x00,0x98,0x42,0x31,0xd9,0x12,0x4f,0x59,0x37,0xd3,0x99,0x77,0xc6,0x00,0x7b,0xa4,0x3a,0xb2,0x40,0x51,0x3c,0x5e,0x95,0xf3,0x5f,0xe3,0x54,0x28,0x18,0x44,0x12,0xa0,0x59,0x43,0x31,0x92,0x4f,0x1b}, - {0x51,0x09,0x15,0x89,0x9d,0x10,0x5c,0x3e,0x6a,0x69,0xe9,0x2d,0x91,0xfa,0xce,0x39,0x20,0x30,0x5f,0x97,0x3f,0xe4,0xea,0x20,0xae,0x2d,0x13,0x7f,0x2a,0x57,0x9b,0x23,0xb1,0x66,0x98,0xa4,0x30,0x30,0xcf,0x33,0x59,0x48,0x5f,0x21,0xd2,0x73,0x1f,0x25,0xf6,0xf4,0xde,0x51,0x40,0xaa,0x82,0xab,0xf6,0x23,0x9a,0x6f,0xd5,0x91,0xf1,0x5f,0x68,0x90,0x2d,0xac,0x33,0xd4,0x9e,0x81,0x23,0x85,0xc9,0x5f,0x79,0xab,0x83,0x28,0x3d,0xeb,0x93,0x55,0x80,0x72,0x45,0xef,0xcb,0x36,0x8f,0x75,0x6a,0x52,0x0c,0x02}, - {0xbc,0xdb,0xd8,0x9e,0xf8,0x34,0x98,0x77,0x6c,0xa4,0x7c,0xdc,0xf9,0xaa,0xf2,0xc8,0x74,0xb0,0xe1,0xa3,0xdc,0x4c,0x52,0xa9,0x77,0x38,0x31,0x15,0x46,0xcc,0xaa,0x02,0x89,0xcc,0x42,0xf0,0x59,0xef,0x31,0xe9,0xb6,0x4b,0x12,0x8e,0x9d,0x9c,0x58,0x2c,0x97,0x59,0xc7,0xae,0x8a,0xe1,0xc8,0xad,0x0c,0xc5,0x02,0x56,0x0a,0xfe,0x2c,0x45,0xdf,0x77,0x78,0x64,0xa0,0xf7,0xa0,0x86,0x9f,0x7c,0x60,0x0e,0x27,0x64,0xc4,0xbb,0xc9,0x11,0xfb,0xf1,0x25,0xea,0x17,0xab,0x7b,0x87,0x4b,0x30,0x7b,0x7d,0xfb,0x4c}, - {0xfe,0x75,0x9b,0xb8,0x6c,0x3d,0xb4,0x72,0x80,0xdc,0x6a,0x9c,0xd9,0x94,0xc6,0x54,0x9f,0x4c,0xe3,0x3e,0x37,0xaa,0xc3,0xb8,0x64,0x53,0x07,0x39,0x2b,0x62,0xb4,0x14,0x12,0xef,0x89,0x97,0xc2,0x99,0x86,0xe2,0x0d,0x19,0x57,0xdf,0x71,0xcd,0x6e,0x2b,0xd0,0x70,0xc9,0xec,0x57,0xc8,0x43,0xc3,0xc5,0x3a,0x4d,0x43,0xbc,0x4c,0x1d,0x5b,0x26,0x9f,0x0a,0xcc,0x15,0x26,0xfb,0xb6,0xe5,0xcc,0x8d,0xb8,0x2b,0x0e,0x4f,0x3a,0x05,0xa7,0x69,0x33,0x8b,0x49,0x01,0x13,0xd1,0x2d,0x59,0x58,0x12,0xf7,0x98,0x2f}, - {0x56,0x9e,0x0f,0xb5,0x4c,0xa7,0x94,0x0c,0x20,0x13,0x8e,0x8e,0xa9,0xf4,0x1f,0x5b,0x67,0x0f,0x30,0x82,0x21,0xcc,0x2a,0x9a,0xf9,0xaa,0x06,0xd8,0x49,0xe2,0x6a,0x3a,0x01,0xa7,0x54,0x4f,0x44,0xae,0x12,0x2e,0xde,0xd7,0xcb,0xa9,0xf0,0x3e,0xfe,0xfc,0xe0,0x5d,0x83,0x75,0x0d,0x89,0xbf,0xce,0x54,0x45,0x61,0xe7,0xe9,0x62,0x80,0x1d,0x5a,0x7c,0x90,0xa9,0x85,0xda,0x7a,0x65,0x62,0x0f,0xb9,0x91,0xb5,0xa8,0x0e,0x1a,0xe9,0xb4,0x34,0xdf,0xfb,0x1d,0x0e,0x8d,0xf3,0x5f,0xf2,0xae,0xe8,0x8c,0x8b,0x29}, - {0xb2,0x0c,0xf7,0xef,0x53,0x79,0x92,0x2a,0x76,0x70,0x15,0x79,0x2a,0xc9,0x89,0x4b,0x6a,0xcf,0xa7,0x30,0x7a,0x45,0x18,0x94,0x85,0xe4,0x5c,0x4d,0x40,0xa8,0xb8,0x34,0xde,0x65,0x21,0x0a,0xea,0x72,0x7a,0x83,0xf6,0x79,0xcf,0x0b,0xb4,0x07,0xab,0x3f,0x70,0xae,0x38,0x77,0xc7,0x36,0x16,0x52,0xdc,0xd7,0xa7,0x03,0x18,0x27,0xa6,0x6b,0x35,0x33,0x69,0x83,0xb5,0xec,0x6e,0xc2,0xfd,0xfe,0xb5,0x63,0xdf,0x13,0xa8,0xd5,0x73,0x25,0xb2,0xa4,0x9a,0xaa,0x93,0xa2,0x6a,0x1c,0x5e,0x46,0xdd,0x2b,0xd6,0x71}, - {0x80,0xdf,0x78,0xd3,0x28,0xcc,0x33,0x65,0xb4,0xa4,0x0f,0x0a,0x79,0x43,0xdb,0xf6,0x5a,0xda,0x01,0xf7,0xf9,0x5f,0x64,0xe3,0xa4,0x2b,0x17,0xf3,0x17,0xf3,0xd5,0x74,0xf5,0x5e,0xf7,0xb1,0xda,0xb5,0x2d,0xcd,0xf5,0x65,0xb0,0x16,0xcf,0x95,0x7f,0xd7,0x85,0xf0,0x49,0x3f,0xea,0x1f,0x57,0x14,0x3d,0x2b,0x2b,0x26,0x21,0x36,0x33,0x1c,0x81,0xca,0xd9,0x67,0x54,0xe5,0x6f,0xa8,0x37,0x8c,0x29,0x2b,0x75,0x7c,0x8b,0x39,0x3b,0x62,0xac,0xe3,0x92,0x08,0x6d,0xda,0x8c,0xd9,0xe9,0x47,0x45,0xcc,0xeb,0x4a}, - {0xc9,0x01,0x6d,0x27,0x1b,0x07,0xf0,0x12,0x70,0x8c,0xc4,0x86,0xc5,0xba,0xb8,0xe7,0xa9,0xfb,0xd6,0x71,0x9b,0x12,0x08,0x53,0x92,0xb7,0x3d,0x5a,0xf9,0xfb,0x88,0x5d,0x10,0xb6,0x54,0x73,0x9e,0x8d,0x40,0x0b,0x6e,0x5b,0xa8,0x5b,0x53,0x32,0x6b,0x80,0x07,0xa2,0x58,0x4a,0x03,0x3a,0xe6,0xdb,0x2c,0xdf,0xa1,0xc9,0xdd,0xd9,0x3b,0x17,0xdf,0x72,0x58,0xfe,0x1e,0x0f,0x50,0x2b,0xc1,0x18,0x39,0xd4,0x2e,0x58,0xd6,0x58,0xe0,0x3a,0x67,0xc9,0x8e,0x27,0xed,0xe6,0x19,0xa3,0x9e,0xb1,0x13,0xcd,0xe1,0x06}, - {0x23,0x6f,0x16,0x6f,0x51,0xad,0xd0,0x40,0xbe,0x6a,0xab,0x1f,0x93,0x32,0x8e,0x11,0x8e,0x08,0x4d,0xa0,0x14,0x5e,0xe3,0x3f,0x66,0x62,0xe1,0x26,0x35,0x60,0x80,0x30,0x53,0x03,0x5b,0x9e,0x62,0xaf,0x2b,0x47,0x47,0x04,0x8d,0x27,0x90,0x0b,0xaa,0x3b,0x27,0xbf,0x43,0x96,0x46,0x5f,0x78,0x0c,0x13,0x7b,0x83,0x8d,0x1a,0x6a,0x3a,0x7f,0x0b,0x80,0x3d,0x5d,0x39,0x44,0xe6,0xf7,0xf6,0xed,0x01,0xc9,0x55,0xd5,0xa8,0x95,0x39,0x63,0x2c,0x59,0x30,0x78,0xcd,0x68,0x7e,0x30,0x51,0x2e,0xed,0xfd,0xd0,0x30}, - {0xb3,0x33,0x12,0xf2,0x1a,0x4d,0x59,0xe0,0x9c,0x4d,0xcc,0xf0,0x8e,0xe7,0xdb,0x1b,0x77,0x9a,0x49,0x8f,0x7f,0x18,0x65,0x69,0x68,0x98,0x09,0x2c,0x20,0x14,0x92,0x0a,0x50,0x47,0xb8,0x68,0x1e,0x97,0xb4,0x9c,0xcf,0xbb,0x64,0x66,0x29,0x72,0x95,0xa0,0x2b,0x41,0xfa,0x72,0x26,0xe7,0x8d,0x5c,0xd9,0x89,0xc5,0x51,0x43,0x08,0x15,0x46,0x2e,0xa0,0xb9,0xae,0xc0,0x19,0x90,0xbc,0xae,0x4c,0x03,0x16,0x0d,0x11,0xc7,0x55,0xec,0x32,0x99,0x65,0x01,0xf5,0x6d,0x0e,0xfe,0x5d,0xca,0x95,0x28,0x0d,0xca,0x3b}, - {0xa4,0x62,0x5d,0x3c,0xbc,0x31,0xf0,0x40,0x60,0x7a,0xf0,0xcf,0x3e,0x8b,0xfc,0x19,0x45,0xb5,0x0f,0x13,0xa2,0x3d,0x18,0x98,0xcd,0x13,0x8f,0xae,0xdd,0xde,0x31,0x56,0xbf,0x01,0xcc,0x9e,0xb6,0x8e,0x68,0x9c,0x6f,0x89,0x44,0xa6,0xad,0x83,0xbc,0xf0,0xe2,0x9f,0x7a,0x5f,0x5f,0x95,0x2d,0xca,0x41,0x82,0xf2,0x8d,0x03,0xb4,0xa8,0x4e,0x02,0xd2,0xca,0xf1,0x0a,0x46,0xed,0x2a,0x83,0xee,0x8c,0xa4,0x05,0x53,0x30,0x46,0x5f,0x1a,0xf1,0x49,0x45,0x77,0x21,0x91,0x63,0xa4,0x2c,0x54,0x30,0x09,0xce,0x24}, - {0x06,0xc1,0x06,0xfd,0xf5,0x90,0xe8,0x1f,0xf2,0x10,0x88,0x5d,0x35,0x68,0xc4,0xb5,0x3e,0xaf,0x8c,0x6e,0xfe,0x08,0x78,0x82,0x4b,0xd7,0x06,0x8a,0xc2,0xe3,0xd4,0x41,0x85,0x0b,0xf3,0xfd,0x55,0xa1,0xcf,0x3f,0xa4,0x2e,0x37,0x36,0x8e,0x16,0xf7,0xd2,0x44,0xf8,0x92,0x64,0xde,0x64,0xe0,0xb2,0x80,0x42,0x4f,0x32,0xa7,0x28,0x99,0x54,0x2e,0x1a,0xee,0x63,0xa7,0x32,0x6e,0xf2,0xea,0xfd,0x5f,0xd2,0xb7,0xe4,0x91,0xae,0x69,0x4d,0x7f,0xd1,0x3b,0xd3,0x3b,0xbc,0x6a,0xff,0xdc,0xc0,0xde,0x66,0x1b,0x49}, - {0xa7,0x32,0xea,0xc7,0x3d,0xb1,0xf5,0x98,0x98,0xdb,0x16,0x7e,0xcc,0xf8,0xd5,0xe3,0x47,0xd9,0xf8,0xcb,0x52,0xbf,0x0a,0xac,0xac,0xe4,0x5e,0xc8,0xd0,0x38,0xf3,0x08,0xa1,0x64,0xda,0xd0,0x8e,0x4a,0xf0,0x75,0x4b,0x28,0xe2,0x67,0xaf,0x2c,0x22,0xed,0xa4,0x7b,0x7b,0x1f,0x79,0xa3,0x34,0x82,0x67,0x8b,0x01,0xb7,0xb0,0xb8,0xf6,0x4c,0xbd,0x73,0x1a,0x99,0x21,0xa8,0x83,0xc3,0x7a,0x0c,0x32,0xdf,0x01,0xbc,0x27,0xab,0x63,0x70,0x77,0x84,0x1b,0x33,0x3d,0xc1,0x99,0x8a,0x07,0xeb,0x82,0x4a,0x0d,0x53}, - {0x25,0x48,0xf9,0xe1,0x30,0x36,0x4c,0x00,0x5a,0x53,0xab,0x8c,0x26,0x78,0x2d,0x7e,0x8b,0xff,0x84,0xcc,0x23,0x23,0x48,0xc7,0xb9,0x70,0x17,0x10,0x3f,0x75,0xea,0x65,0x9e,0xbf,0x9a,0x6c,0x45,0x73,0x69,0x6d,0x80,0xa8,0x00,0x49,0xfc,0xb2,0x7f,0x25,0x50,0xb8,0xcf,0xc8,0x12,0xf4,0xac,0x2b,0x5b,0xbd,0xbf,0x0c,0xe0,0xe7,0xb3,0x0d,0x63,0x63,0x09,0xe2,0x3e,0xfc,0x66,0x3d,0x6b,0xcb,0xb5,0x61,0x7f,0x2c,0xd6,0x81,0x1a,0x3b,0x44,0x13,0x42,0x04,0xbe,0x0f,0xdb,0xa1,0xe1,0x21,0x19,0xec,0xa4,0x02}, - {0xa2,0xb8,0x24,0x3b,0x9a,0x25,0xe6,0x5c,0xb8,0xa0,0xaf,0x45,0xcc,0x7a,0x57,0xb8,0x37,0x70,0xa0,0x8b,0xe8,0xe6,0xcb,0xcc,0xbf,0x09,0x78,0x12,0x51,0x3c,0x14,0x3d,0x5f,0x79,0xcf,0xf1,0x62,0x61,0xc8,0xf5,0xf2,0x57,0xee,0x26,0x19,0x86,0x8c,0x11,0x78,0x35,0x06,0x1c,0x85,0x24,0x21,0x17,0xcf,0x7f,0x06,0xec,0x5d,0x2b,0xd1,0x36,0x57,0x45,0x15,0x79,0x91,0x27,0x6d,0x12,0x0a,0x3a,0x78,0xfc,0x5c,0x8f,0xe4,0xd5,0xac,0x9b,0x17,0xdf,0xe8,0xb6,0xbd,0x36,0x59,0x28,0xa8,0x5b,0x88,0x17,0xf5,0x2e}, - {0xdc,0xae,0x58,0x8c,0x4e,0x97,0x37,0x46,0xa4,0x41,0xf0,0xab,0xfb,0x22,0xef,0xb9,0x8a,0x71,0x80,0xe9,0x56,0xd9,0x85,0xe1,0xa6,0xa8,0x43,0xb1,0xfa,0x78,0x1b,0x2f,0x51,0x2f,0x5b,0x30,0xfb,0xbf,0xee,0x96,0xb8,0x96,0x95,0x88,0xad,0x38,0xf9,0xd3,0x25,0xdd,0xd5,0x46,0xc7,0x2d,0xf5,0xf0,0x95,0x00,0x3a,0xbb,0x90,0x82,0x96,0x57,0x01,0xe1,0x20,0x0a,0x43,0xb8,0x1a,0xf7,0x47,0xec,0xf0,0x24,0x8d,0x65,0x93,0xf3,0xd1,0xee,0xe2,0x6e,0xa8,0x09,0x75,0xcf,0xe1,0xa3,0x2a,0xdc,0x35,0x3e,0xc4,0x7d}, - {0xc3,0xd9,0x7d,0x88,0x65,0x66,0x96,0x85,0x55,0x53,0xb0,0x4b,0x31,0x9b,0x0f,0xc9,0xb1,0x79,0x20,0xef,0xf8,0x8d,0xe0,0xc6,0x2f,0xc1,0x8c,0x75,0x16,0x20,0xf7,0x7e,0x18,0x97,0x3e,0x27,0x5c,0x2a,0x78,0x5a,0x94,0xfd,0x4e,0x5e,0x99,0xc6,0x76,0x35,0x3e,0x7d,0x23,0x1f,0x05,0xd8,0x2e,0x0f,0x99,0x0a,0xd5,0x82,0x1d,0xb8,0x4f,0x04,0xd9,0xe3,0x07,0xa9,0xc5,0x18,0xdf,0xc1,0x59,0x63,0x4c,0xce,0x1d,0x37,0xb3,0x57,0x49,0xbb,0x01,0xb2,0x34,0x45,0x70,0xca,0x2e,0xdd,0x30,0x9c,0x3f,0x82,0x79,0x7f}, - {0xe8,0x13,0xb5,0xa3,0x39,0xd2,0x34,0x83,0xd8,0xa8,0x1f,0xb9,0xd4,0x70,0x36,0xc1,0x33,0xbd,0x90,0xf5,0x36,0x41,0xb5,0x12,0xb4,0xd9,0x84,0xd7,0x73,0x03,0x4e,0x0a,0xba,0x87,0xf5,0x68,0xf0,0x1f,0x9c,0x6a,0xde,0xc8,0x50,0x00,0x4e,0x89,0x27,0x08,0xe7,0x5b,0xed,0x7d,0x55,0x99,0xbf,0x3c,0xf0,0xd6,0x06,0x1c,0x43,0xb0,0xa9,0x64,0x19,0x29,0x7d,0x5b,0xa1,0xd6,0xb3,0x2e,0x35,0x82,0x3a,0xd5,0xa0,0xf6,0xb4,0xb0,0x47,0x5d,0xa4,0x89,0x43,0xce,0x56,0x71,0x6c,0x34,0x18,0xce,0x0a,0x7d,0x1a,0x07}, - {0x0b,0xba,0x87,0xc8,0xaa,0x2d,0x07,0xd3,0xee,0x62,0xa5,0xbf,0x05,0x29,0x26,0x01,0x8b,0x76,0xef,0xc0,0x02,0x30,0x54,0xcf,0x9c,0x7e,0xea,0x46,0x71,0xcc,0x3b,0x2c,0x31,0x44,0xe1,0x20,0x52,0x35,0x0c,0xcc,0x41,0x51,0xb1,0x09,0x07,0x95,0x65,0x0d,0x36,0x5f,0x9d,0x20,0x1b,0x62,0xf5,0x9a,0xd3,0x55,0x77,0x61,0xf7,0xbc,0x69,0x7c,0x5f,0x29,0xe8,0x04,0xeb,0xd7,0xf0,0x07,0x7d,0xf3,0x50,0x2f,0x25,0x18,0xdb,0x10,0xd7,0x98,0x17,0x17,0xa3,0xa9,0x51,0xe9,0x1d,0xa5,0xac,0x22,0x73,0x9a,0x5a,0x6f}, - {0xc5,0xc6,0x41,0x2f,0x0c,0x00,0xa1,0x8b,0x9b,0xfb,0xfe,0x0c,0xc1,0x79,0x9f,0xc4,0x9f,0x1c,0xc5,0x3c,0x70,0x47,0xfa,0x4e,0xca,0xaf,0x47,0xe1,0xa2,0x21,0x4e,0x49,0xbe,0x44,0xd9,0xa3,0xeb,0xd4,0x29,0xe7,0x9e,0xaf,0x78,0x80,0x40,0x09,0x9e,0x8d,0x03,0x9c,0x86,0x47,0x7a,0x56,0x25,0x45,0x24,0x3b,0x8d,0xee,0x80,0x96,0xab,0x02,0x9a,0x0d,0xe5,0xdd,0x85,0x8a,0xa4,0xef,0x49,0xa2,0xb9,0x0f,0x4e,0x22,0x9a,0x21,0xd9,0xf6,0x1e,0xd9,0x1d,0x1f,0x09,0xfa,0x34,0xbb,0x46,0xea,0xcb,0x76,0x5d,0x6b}, - {0x94,0xd9,0x0c,0xec,0x6c,0x55,0x57,0x88,0xba,0x1d,0xd0,0x5c,0x6f,0xdc,0x72,0x64,0x77,0xb4,0x42,0x8f,0x14,0x69,0x01,0xaf,0x54,0x73,0x27,0x85,0xf6,0x33,0xe3,0x0a,0x22,0x25,0x78,0x1e,0x17,0x41,0xf9,0xe0,0xd3,0x36,0x69,0x03,0x74,0xae,0xe6,0xf1,0x46,0xc7,0xfc,0xd0,0xa2,0x3e,0x8b,0x40,0x3e,0x31,0xdd,0x03,0x9c,0x86,0xfb,0x16,0x62,0x09,0xb6,0x33,0x97,0x19,0x8e,0x28,0x33,0xe1,0xab,0xd8,0xb4,0x72,0xfc,0x24,0x3e,0xd0,0x91,0x09,0xed,0xf7,0x11,0x48,0x75,0xd0,0x70,0x8f,0x8b,0xe3,0x81,0x3f}, - {0xfe,0xaf,0xd9,0x7e,0xcc,0x0f,0x91,0x7f,0x4b,0x87,0x65,0x24,0xa1,0xb8,0x5c,0x54,0x04,0x47,0x0c,0x4b,0xd2,0x7e,0x39,0xa8,0x93,0x09,0xf5,0x04,0xc1,0x0f,0x51,0x50,0x24,0xc8,0x17,0x5f,0x35,0x7f,0xdb,0x0a,0xa4,0x99,0x42,0xd7,0xc3,0x23,0xb9,0x74,0xf7,0xea,0xf8,0xcb,0x8b,0x3e,0x7c,0xd5,0x3d,0xdc,0xde,0x4c,0xd3,0xe2,0xd3,0x0a,0x9d,0x24,0x6e,0x33,0xc5,0x0f,0x0c,0x6f,0xd9,0xcf,0x31,0xc3,0x19,0xde,0x5e,0x74,0x1c,0xfe,0xee,0x09,0x00,0xfd,0xd6,0xf2,0xbe,0x1e,0xfa,0xf0,0x8b,0x15,0x7c,0x12}, - {0xa2,0x79,0x98,0x2e,0x42,0x7c,0x19,0xf6,0x47,0x36,0xca,0x52,0xd4,0xdd,0x4a,0xa4,0xcb,0xac,0x4e,0x4b,0xc1,0x3f,0x41,0x9b,0x68,0x4f,0xef,0x07,0x7d,0xf8,0x4e,0x35,0x74,0xb9,0x51,0xae,0xc4,0x8f,0xa2,0xde,0x96,0xfe,0x4d,0x74,0xd3,0x73,0x99,0x1d,0xa8,0x48,0x38,0x87,0x0b,0x68,0x40,0x62,0x95,0xdf,0x67,0xd1,0x79,0x24,0xd8,0x4e,0x75,0xd9,0xc5,0x60,0x22,0xb5,0xe3,0xfe,0xb8,0xb0,0x41,0xeb,0xfc,0x2e,0x35,0x50,0x3c,0x65,0xf6,0xa9,0x30,0xac,0x08,0x88,0x6d,0x23,0x39,0x05,0xd2,0x92,0x2d,0x30}, - {0x3d,0x28,0xa4,0xbc,0xa2,0xc1,0x13,0x78,0xd9,0x3d,0x86,0xa1,0x91,0xf0,0x62,0xed,0x86,0xfa,0x68,0xc2,0xb8,0xbc,0xc7,0xae,0x4c,0xae,0x1c,0x6f,0xb7,0xd3,0xe5,0x10,0x77,0xf1,0xe0,0xe4,0xb6,0x6f,0xbc,0x2d,0x93,0x6a,0xbd,0xa4,0x29,0xbf,0xe1,0x04,0xe8,0xf6,0x7a,0x78,0xd4,0x66,0x19,0x5e,0x60,0xd0,0x26,0xb4,0x5e,0x5f,0xdc,0x0e,0x67,0x8e,0xda,0x53,0xd6,0xbf,0x53,0x54,0x41,0xf6,0xa9,0x24,0xec,0x1e,0xdc,0xe9,0x23,0x8a,0x57,0x03,0x3b,0x26,0x87,0xbf,0x72,0xba,0x1c,0x36,0x51,0x6c,0xb4,0x45}, - {0xa1,0x7f,0x4f,0x31,0xbf,0x2a,0x40,0xa9,0x50,0xf4,0x8c,0x8e,0xdc,0xf1,0x57,0xe2,0x84,0xbe,0xa8,0x23,0x4b,0xd5,0xbb,0x1d,0x3b,0x71,0xcb,0x6d,0xa3,0xbf,0x77,0x21,0xe4,0xe3,0x7f,0x8a,0xdd,0x4d,0x9d,0xce,0x30,0x0e,0x62,0x76,0x56,0x64,0x13,0xab,0x58,0x99,0x0e,0xb3,0x7b,0x4f,0x59,0x4b,0xdf,0x29,0x12,0x32,0xef,0x0a,0x1c,0x5c,0x8f,0xdb,0x79,0xfa,0xbc,0x1b,0x08,0x37,0xb3,0x59,0x5f,0xc2,0x1e,0x81,0x48,0x60,0x87,0x24,0x83,0x9c,0x65,0x76,0x7a,0x08,0xbb,0xb5,0x8a,0x7d,0x38,0x19,0xe6,0x4a}, - {0x2e,0xa3,0x44,0x53,0xaa,0xf6,0xdb,0x8d,0x78,0x40,0x1b,0xb4,0xb4,0xea,0x88,0x7d,0x60,0x0d,0x13,0x4a,0x97,0xeb,0xb0,0x5e,0x03,0x3e,0xbf,0x17,0x1b,0xd9,0x00,0x1a,0x83,0xfb,0x5b,0x98,0x44,0x7e,0x11,0x61,0x36,0x31,0x96,0x71,0x2a,0x46,0xe0,0xfc,0x4b,0x90,0x25,0xd4,0x48,0x34,0xac,0x83,0x64,0x3d,0xa4,0x5b,0xbe,0x5a,0x68,0x75,0xb2,0xf2,0x61,0xeb,0x33,0x09,0x96,0x6e,0x52,0x49,0xff,0xc9,0xa8,0x0f,0x3d,0x54,0x69,0x65,0xf6,0x7a,0x10,0x75,0x72,0xdf,0xaa,0xe6,0xb0,0x23,0xb6,0x29,0x55,0x13}, - {0x18,0xd5,0xd1,0xad,0xd7,0xdb,0xf0,0x18,0x11,0x1f,0xc1,0xcf,0x88,0x78,0x9f,0x97,0x9b,0x75,0x14,0x71,0xf0,0xe1,0x32,0x87,0x01,0x3a,0xca,0x65,0x1a,0xb8,0xb5,0x79,0xfe,0x83,0x2e,0xe2,0xbc,0x16,0xc7,0xf5,0xc1,0x85,0x09,0xe8,0x19,0xeb,0x2b,0xb4,0xae,0x4a,0x25,0x14,0x37,0xa6,0x9d,0xec,0x13,0xa6,0x90,0x15,0x05,0xea,0x72,0x59,0x11,0x78,0x8f,0xdc,0x20,0xac,0xd4,0x0f,0xa8,0x4f,0x4d,0xac,0x94,0xd2,0x9a,0x9a,0x34,0x04,0x36,0xb3,0x64,0x2d,0x1b,0xc0,0xdb,0x3b,0x5f,0x90,0x95,0x9c,0x7e,0x4f}, - {0x2e,0x30,0x81,0x57,0xbc,0x4b,0x67,0x62,0x0f,0xdc,0xad,0x89,0x39,0x0f,0x52,0xd8,0xc6,0xd9,0xfb,0x53,0xae,0x99,0x29,0x8c,0x4c,0x8e,0x63,0x2e,0xd9,0x3a,0x99,0x31,0xfe,0x99,0x52,0x35,0x3d,0x44,0xc8,0x71,0xd7,0xea,0xeb,0xdb,0x1c,0x3b,0xcd,0x8b,0x66,0x94,0xa4,0xf1,0x9e,0x49,0x92,0x80,0xc8,0xad,0x44,0xa1,0xc4,0xee,0x42,0x19,0x92,0x49,0x23,0xae,0x19,0x53,0xac,0x7d,0x92,0x3e,0xea,0x0c,0x91,0x3d,0x1b,0x2c,0x22,0x11,0x3c,0x25,0x94,0xe4,0x3c,0x55,0x75,0xca,0xf9,0x4e,0x31,0x65,0x0a,0x2a}, - {0xc2,0x27,0xf9,0xf7,0x7f,0x93,0xb7,0x2d,0x35,0xa6,0xd0,0x17,0x06,0x1f,0x74,0xdb,0x76,0xaf,0x55,0x11,0xa2,0xf3,0x82,0x59,0xed,0x2d,0x7c,0x64,0x18,0xe2,0xf6,0x4c,0x3a,0x79,0x1c,0x3c,0xcd,0x1a,0x36,0xcf,0x3b,0xbc,0x35,0x5a,0xac,0xbc,0x9e,0x2f,0xab,0xa6,0xcd,0xa8,0xe9,0x60,0xe8,0x60,0x13,0x1a,0xea,0x6d,0x9b,0xc3,0x5d,0x05,0xb6,0x5b,0x8d,0xc2,0x7c,0x22,0x19,0xb1,0xab,0xff,0x4d,0x77,0xbc,0x4e,0xe2,0x07,0x89,0x2c,0xa3,0xe4,0xce,0x78,0x3c,0xa8,0xb6,0x24,0xaa,0x10,0x77,0x30,0x1a,0x12}, - {0x97,0x4a,0x03,0x9f,0x5e,0x5d,0xdb,0xe4,0x2d,0xbc,0x34,0x30,0x09,0xfc,0x53,0xe1,0xb1,0xd3,0x51,0x95,0x91,0x46,0x05,0x46,0x2d,0xe5,0x40,0x7a,0x6c,0xc7,0x3f,0x33,0xc9,0x83,0x74,0xc7,0x3e,0x71,0x59,0xd6,0xaf,0x96,0x2b,0xb8,0x77,0xe0,0xbf,0x88,0xd3,0xbc,0x97,0x10,0x23,0x28,0x9e,0x28,0x9b,0x3a,0xed,0x6c,0x4a,0xb9,0x7b,0x52,0x2e,0x48,0x5b,0x99,0x2a,0x99,0x3d,0x56,0x01,0x38,0x38,0x6e,0x7c,0xd0,0x05,0x34,0xe5,0xd8,0x64,0x2f,0xde,0x35,0x50,0x48,0xf7,0xa9,0xa7,0x20,0x9b,0x06,0x89,0x6b}, - {0x0d,0x22,0x70,0x62,0x41,0xa0,0x2a,0x81,0x4e,0x5b,0x24,0xf9,0xfa,0x89,0x5a,0x99,0x05,0xef,0x72,0x50,0xce,0xc4,0xad,0xff,0x73,0xeb,0x73,0xaa,0x03,0x21,0xbc,0x23,0x77,0xdb,0xc7,0xb5,0x8c,0xfa,0x82,0x40,0x55,0xc1,0x34,0xc7,0xf8,0x86,0x86,0x06,0x7e,0xa5,0xe7,0xf6,0xd9,0xc8,0xe6,0x29,0xcf,0x9b,0x63,0xa7,0x08,0xd3,0x73,0x04,0x05,0x9e,0x58,0x03,0x26,0x79,0xee,0xca,0x92,0xc4,0xdc,0x46,0x12,0x42,0x4b,0x2b,0x4f,0xa9,0x01,0xe6,0x74,0xef,0xa1,0x02,0x1a,0x34,0x04,0xde,0xbf,0x73,0x2f,0x10}, - {0xc6,0x45,0x57,0x7f,0xab,0xb9,0x18,0xeb,0x90,0xc6,0x87,0x57,0xee,0x8a,0x3a,0x02,0xa9,0xaf,0xf7,0x2d,0xda,0x12,0x27,0xb7,0x3d,0x01,0x5c,0xea,0x25,0x7d,0x59,0x36,0x9a,0x1c,0x51,0xb5,0xe0,0xda,0xb4,0xa2,0x06,0xff,0xff,0x2b,0x29,0x60,0xc8,0x7a,0x34,0x42,0x50,0xf5,0x5d,0x37,0x1f,0x98,0x2d,0xa1,0x4e,0xda,0x25,0xd7,0x6b,0x3f,0xac,0x58,0x60,0x10,0x7b,0x8d,0x4d,0x73,0x5f,0x90,0xc6,0x6f,0x9e,0x57,0x40,0xd9,0x2d,0x93,0x02,0x92,0xf9,0xf8,0x66,0x64,0xd0,0xd6,0x60,0xda,0x19,0xcc,0x7e,0x7b}, - {0x0d,0x69,0x5c,0x69,0x3c,0x37,0xc2,0x78,0x6e,0x90,0x42,0x06,0x66,0x2e,0x25,0xdd,0xd2,0x2b,0xe1,0x4a,0x44,0x44,0x1d,0x95,0x56,0x39,0x74,0x01,0x76,0xad,0x35,0x42,0x9b,0xfa,0x7c,0xa7,0x51,0x4a,0xae,0x6d,0x50,0x86,0xa3,0xe7,0x54,0x36,0x26,0x82,0xdb,0x82,0x2d,0x8f,0xcd,0xff,0xbb,0x09,0xba,0xca,0xf5,0x1b,0x66,0xdc,0xbe,0x03,0xf5,0x75,0x89,0x07,0x0d,0xcb,0x58,0x62,0x98,0xf2,0x89,0x91,0x54,0x42,0x29,0x49,0xe4,0x6e,0xe3,0xe2,0x23,0xb4,0xca,0xa0,0xa1,0x66,0xf0,0xcd,0xb0,0xe2,0x7c,0x0e}, - {0xa3,0x85,0x8c,0xc4,0x3a,0x64,0x94,0xc4,0xad,0x39,0x61,0x3c,0xf4,0x1d,0x36,0xfd,0x48,0x4d,0xe9,0x3a,0xdd,0x17,0xdb,0x09,0x4a,0x67,0xb4,0x8f,0x5d,0x0a,0x6e,0x66,0xf9,0x70,0x4b,0xd9,0xdf,0xfe,0xa6,0xfe,0x2d,0xba,0xfc,0xc1,0x51,0xc0,0x30,0xf1,0x89,0xab,0x2f,0x7f,0x7e,0xd4,0x82,0x48,0xb5,0xee,0xec,0x8a,0x13,0x56,0x52,0x61,0x0d,0xcb,0x70,0x48,0x4e,0xf6,0xbb,0x2a,0x6b,0x8b,0x45,0xaa,0xf0,0xbc,0x65,0xcd,0x5d,0x98,0xe8,0x75,0xba,0x4e,0xbe,0x9a,0xe4,0xde,0x14,0xd5,0x10,0xc8,0x0b,0x7f}, - {0x6f,0x13,0xf4,0x26,0xa4,0x6b,0x00,0xb9,0x35,0x30,0xe0,0x57,0x9e,0x36,0x67,0x8d,0x28,0x3c,0x46,0x4f,0xd9,0xdf,0xc8,0xcb,0xf5,0xdb,0xee,0xf8,0xbc,0x8d,0x1f,0x0d,0xa0,0x13,0x72,0x73,0xad,0x9d,0xac,0x83,0x98,0x2e,0xf7,0x2e,0xba,0xf8,0xf6,0x9f,0x57,0x69,0xec,0x43,0xdd,0x2e,0x1e,0x31,0x75,0xab,0xc5,0xde,0x7d,0x90,0x3a,0x1d,0xdc,0x81,0xd0,0x3e,0x31,0x93,0x16,0xba,0x80,0x34,0x1b,0x85,0xad,0x9f,0x32,0x29,0xcb,0x21,0x03,0x03,0x3c,0x01,0x28,0x01,0xe3,0xfd,0x1b,0xa3,0x44,0x1b,0x01,0x00}, - {0x0c,0x6c,0xc6,0x3f,0x6c,0xa0,0xdf,0x3f,0xd2,0x0d,0xd6,0x4d,0x8e,0xe3,0x40,0x5d,0x71,0x4d,0x8e,0x26,0x38,0x8b,0xe3,0x7a,0xe1,0x57,0x83,0x6e,0x91,0x8d,0xc4,0x3a,0x5c,0xa7,0x0a,0x6a,0x69,0x1f,0x56,0x16,0x6a,0xbd,0x52,0x58,0x5c,0x72,0xbf,0xc1,0xad,0x66,0x79,0x9a,0x7f,0xdd,0xa8,0x11,0x26,0x10,0x85,0xd2,0xa2,0x88,0xd9,0x63,0x2e,0x23,0xbd,0xaf,0x53,0x07,0x12,0x00,0x83,0xf6,0xd8,0xfd,0xb8,0xce,0x2b,0xe9,0x91,0x2b,0xe7,0x84,0xb3,0x69,0x16,0xf8,0x66,0xa0,0x68,0x23,0x2b,0xd5,0xfa,0x33}, - {0x16,0x1e,0xe4,0xc5,0xc6,0x49,0x06,0x54,0x35,0x77,0x3f,0x33,0x30,0x64,0xf8,0x0a,0x46,0xe7,0x05,0xf3,0xd2,0xfc,0xac,0xb2,0xa7,0xdc,0x56,0xa2,0x29,0xf4,0xc0,0x16,0xe8,0xcf,0x22,0xc4,0xd0,0xc8,0x2c,0x8d,0xcb,0x3a,0xa1,0x05,0x7b,0x4f,0x2b,0x07,0x6f,0xa5,0xf6,0xec,0xe6,0xb6,0xfe,0xa3,0xe2,0x71,0x0a,0xb9,0xcc,0x55,0xc3,0x3c,0x31,0x91,0x3e,0x90,0x43,0x94,0xb6,0xe9,0xce,0x37,0x56,0x7a,0xcb,0x94,0xa4,0xb8,0x44,0x92,0xba,0xba,0xa4,0xd1,0x7c,0xc8,0x68,0x75,0xae,0x6b,0x42,0xaf,0x1e,0x63}, - {0x9f,0xfe,0x66,0xda,0x10,0x04,0xe9,0xb3,0xa6,0xe5,0x16,0x6c,0x52,0x4b,0xdd,0x85,0x83,0xbf,0xf9,0x1e,0x61,0x97,0x3d,0xbc,0xb5,0x19,0xa9,0x1e,0x8b,0x64,0x99,0x55,0xe8,0x0d,0x70,0xa3,0xb9,0x75,0xd9,0x47,0x52,0x05,0xf8,0xe2,0xfb,0xc5,0x80,0x72,0xe1,0x5d,0xe4,0x32,0x27,0x8f,0x65,0x53,0xb5,0x80,0x5f,0x66,0x7f,0x2c,0x1f,0x43,0x19,0x7b,0x8f,0x85,0x44,0x63,0x02,0xd6,0x4a,0x51,0xea,0xa1,0x2f,0x35,0xab,0x14,0xd7,0xa9,0x90,0x20,0x1a,0x44,0x00,0x89,0x26,0x3b,0x25,0x91,0x5f,0x71,0x04,0x7b}, - {0x43,0xae,0xf6,0xac,0x28,0xbd,0xed,0x83,0xb4,0x7a,0x5c,0x7d,0x8b,0x7c,0x35,0x86,0x44,0x2c,0xeb,0xb7,0x69,0x47,0x40,0xc0,0x3f,0x58,0xf6,0xc2,0xf5,0x7b,0xb3,0x59,0xc6,0xba,0xe6,0xc4,0x80,0xc2,0x76,0xb3,0x0b,0x9b,0x1d,0x6d,0xdd,0xd3,0x0e,0x97,0x44,0xf9,0x0b,0x45,0x58,0x95,0x9a,0xb0,0x23,0xe2,0xcd,0x57,0xfa,0xac,0xd0,0x48,0x71,0xe6,0xab,0x7d,0xe4,0x26,0x0f,0xb6,0x37,0x3a,0x2f,0x62,0x97,0xa1,0xd1,0xf1,0x94,0x03,0x96,0xe9,0x7e,0xce,0x08,0x42,0xdb,0x3b,0x6d,0x33,0x91,0x41,0x23,0x16}, - {0xf6,0x7f,0x26,0xf6,0xde,0x99,0xe4,0xb9,0x43,0x08,0x2c,0x74,0x7b,0xca,0x72,0x77,0xb1,0xf2,0xa4,0xe9,0x3f,0x15,0xa0,0x23,0x06,0x50,0xd0,0xd5,0xec,0xdf,0xdf,0x2c,0x40,0x86,0xf3,0x1f,0xd6,0x9c,0x49,0xdd,0xa0,0x25,0x36,0x06,0xc3,0x9b,0xcd,0x29,0xc3,0x3d,0xd7,0x3d,0x02,0xd8,0xe2,0x51,0x31,0x92,0x3b,0x20,0x7a,0x70,0x25,0x4a,0x6a,0xed,0xf6,0x53,0x8a,0x66,0xb7,0x2a,0xa1,0x70,0xd1,0x1d,0x58,0x42,0x42,0x30,0x61,0x01,0xe2,0x3a,0x4c,0x14,0x00,0x40,0xfc,0x49,0x8e,0x24,0x6d,0x89,0x21,0x57}, - {0xae,0x1b,0x18,0xfd,0x17,0x55,0x6e,0x0b,0xb4,0x63,0xb9,0x2b,0x9f,0x62,0x22,0x90,0x25,0x46,0x06,0x32,0xe9,0xbc,0x09,0x55,0xda,0x13,0x3c,0xf6,0x74,0xdd,0x8e,0x57,0x4e,0xda,0xd0,0xa1,0x91,0x50,0x5d,0x28,0x08,0x3e,0xfe,0xb5,0xa7,0x6f,0xaa,0x4b,0xb3,0x93,0x93,0xe1,0x7c,0x17,0xe5,0x63,0xfd,0x30,0xb0,0xc4,0xaf,0x35,0xc9,0x03,0x3d,0x0c,0x2b,0x49,0xc6,0x76,0x72,0x99,0xfc,0x05,0xe2,0xdf,0xc4,0xc2,0xcc,0x47,0x3c,0x3a,0x62,0xdd,0x84,0x9b,0xd2,0xdc,0xa2,0xc7,0x88,0x02,0x59,0xab,0xc2,0x3e}, - {0xb9,0x7b,0xd8,0xe4,0x7b,0xd2,0xa0,0xa1,0xed,0x1a,0x39,0x61,0xeb,0x4d,0x8b,0xa9,0x83,0x9b,0xcb,0x73,0xd0,0xdd,0xa0,0x99,0xce,0xca,0x0f,0x20,0x5a,0xc2,0xd5,0x2d,0xcb,0xd1,0x32,0xae,0x09,0x3a,0x21,0xa7,0xd5,0xc2,0xf5,0x40,0xdf,0x87,0x2b,0x0f,0x29,0xab,0x1e,0xe8,0xc6,0xa4,0xae,0x0b,0x5e,0xac,0xdb,0x6a,0x6c,0xf6,0x1b,0x0e,0x7e,0x88,0x2c,0x79,0xe9,0xd5,0xab,0xe2,0x5d,0x6d,0x92,0xcb,0x18,0x00,0x02,0x1a,0x1e,0x5f,0xae,0xba,0xcd,0x69,0xba,0xbf,0x5f,0x8f,0xe8,0x5a,0xb3,0x48,0x05,0x73}, - {0xee,0xb8,0xa8,0xcb,0xa3,0x51,0x35,0xc4,0x16,0x5f,0x11,0xb2,0x1d,0x6f,0xa2,0x65,0x50,0x38,0x8c,0xab,0x52,0x4f,0x0f,0x76,0xca,0xb8,0x1d,0x41,0x3b,0x44,0x43,0x30,0x34,0xe3,0xd6,0xa1,0x4b,0x09,0x5b,0x80,0x19,0x3f,0x35,0x09,0x77,0xf1,0x3e,0xbf,0x2b,0x70,0x22,0x06,0xcb,0x06,0x3f,0x42,0xdd,0x45,0x78,0xd8,0x77,0x22,0x5a,0x58,0x62,0x89,0xd4,0x33,0x82,0x5f,0x8a,0xa1,0x7f,0x25,0x78,0xec,0xb5,0xc4,0x98,0x66,0xff,0x41,0x3e,0x37,0xa5,0x6f,0x8e,0xa7,0x1f,0x98,0xef,0x50,0x89,0x27,0x56,0x76}, - {0xc0,0xc8,0x1f,0xd5,0x59,0xcf,0xc3,0x38,0xf2,0xb6,0x06,0x05,0xfd,0xd2,0xed,0x9b,0x8f,0x0e,0x57,0xab,0x9f,0x10,0xbf,0x26,0xa6,0x46,0xb8,0xc1,0xa8,0x60,0x41,0x3f,0x9d,0xcf,0x86,0xea,0xa3,0x73,0x70,0xe1,0xdc,0x5f,0x15,0x07,0xb7,0xfb,0x8c,0x3a,0x8e,0x8a,0x83,0x31,0xfc,0xe7,0x53,0x48,0x16,0xf6,0x13,0xb6,0x84,0xf4,0xbb,0x28,0x7c,0x6c,0x13,0x6f,0x5c,0x2f,0x61,0xf2,0xbe,0x11,0xdd,0xf6,0x07,0xd1,0xea,0xaf,0x33,0x6f,0xde,0x13,0xd2,0x9a,0x7e,0x52,0x5d,0xf7,0x88,0x81,0x35,0xcb,0x79,0x1e}, - {0xf1,0xe3,0xf7,0xee,0xc3,0x36,0x34,0x01,0xf8,0x10,0x9e,0xfe,0x7f,0x6a,0x8b,0x82,0xfc,0xde,0xf9,0xbc,0xe5,0x08,0xf9,0x7f,0x31,0x38,0x3b,0x3a,0x1b,0x95,0xd7,0x65,0x81,0x81,0xe0,0xf5,0xd8,0x53,0xe9,0x77,0xd9,0xde,0x9d,0x29,0x44,0x0c,0xa5,0x84,0xe5,0x25,0x45,0x86,0x0c,0x2d,0x6c,0xdc,0xf4,0xf2,0xd1,0x39,0x2d,0xb5,0x8a,0x47,0x59,0xd1,0x52,0x92,0xd3,0xa4,0xa6,0x66,0x07,0xc8,0x1a,0x87,0xbc,0xe1,0xdd,0xe5,0x6f,0xc9,0xc1,0xa6,0x40,0x6b,0x2c,0xb8,0x14,0x22,0x21,0x1a,0x41,0x7a,0xd8,0x16}, - {0x15,0x62,0x06,0x42,0x5a,0x7e,0xbd,0xb3,0xc1,0x24,0x5a,0x0c,0xcd,0xe3,0x9b,0x87,0xb7,0x94,0xf9,0xd6,0xb1,0x5d,0xc0,0x57,0xa6,0x8c,0xf3,0x65,0x81,0x7c,0xf8,0x28,0x83,0x05,0x4e,0xd5,0xe2,0xd5,0xa4,0xfb,0xfa,0x99,0xbd,0x2e,0xd7,0xaf,0x1f,0xe2,0x8f,0x77,0xe9,0x6e,0x73,0xc2,0x7a,0x49,0xde,0x6d,0x5a,0x7a,0x57,0x0b,0x99,0x1f,0xd6,0xf7,0xe8,0x1b,0xad,0x4e,0x34,0xa3,0x8f,0x79,0xea,0xac,0xeb,0x50,0x1e,0x7d,0x52,0xe0,0x0d,0x52,0x9e,0x56,0xc6,0x77,0x3e,0x6d,0x4d,0x53,0xe1,0x2f,0x88,0x45}, - {0xd6,0x83,0x79,0x75,0x5d,0x34,0x69,0x66,0xa6,0x11,0xaa,0x17,0x11,0xed,0xb6,0x62,0x8f,0x12,0x5e,0x98,0x57,0x18,0xdd,0x7d,0xdd,0xf6,0x26,0xf6,0xb8,0xe5,0x8f,0x68,0xe4,0x6f,0x3c,0x94,0x29,0x99,0xac,0xd8,0xa2,0x92,0x83,0xa3,0x61,0xf1,0xf9,0xb5,0xf3,0x9a,0xc8,0xbe,0x13,0xdb,0x99,0x26,0x74,0xf0,0x05,0xe4,0x3c,0x84,0xcf,0x7d,0xc0,0x32,0x47,0x4a,0x48,0xd6,0x90,0x6c,0x99,0x32,0x56,0xca,0xfd,0x43,0x21,0xd5,0xe1,0xc6,0x5d,0x91,0xc3,0x28,0xbe,0xb3,0x1b,0x19,0x27,0x73,0x7e,0x68,0x39,0x67}, - {0xa6,0x75,0x56,0x38,0x14,0x20,0x78,0xef,0xe8,0xa9,0xfd,0xaa,0x30,0x9f,0x64,0xa2,0xcb,0xa8,0xdf,0x5c,0x50,0xeb,0xd1,0x4c,0xb3,0xc0,0x4d,0x1d,0xba,0x5a,0x11,0x46,0xc0,0x1a,0x0c,0xc8,0x9d,0xcc,0x6d,0xa6,0x36,0xa4,0x38,0x1b,0xf4,0x5c,0xa0,0x97,0xc6,0xd7,0xdb,0x95,0xbe,0xf3,0xeb,0xa7,0xab,0x7d,0x7e,0x8d,0xf6,0xb8,0xa0,0x7d,0x76,0xda,0xb5,0xc3,0x53,0x19,0x0f,0xd4,0x9b,0x9e,0x11,0x21,0x73,0x6f,0xac,0x1d,0x60,0x59,0xb2,0xfe,0x21,0x60,0xcc,0x03,0x4b,0x4b,0x67,0x83,0x7e,0x88,0x5f,0x5a}, - {0x11,0x3d,0xa1,0x70,0xcf,0x01,0x63,0x8f,0xc4,0xd0,0x0d,0x35,0x15,0xb8,0xce,0xcf,0x7e,0xa4,0xbc,0xa4,0xd4,0x97,0x02,0xf7,0x34,0x14,0x4d,0xe4,0x56,0xb6,0x69,0x36,0xb9,0x43,0xa6,0xa0,0xd3,0x28,0x96,0x9e,0x64,0x20,0xc3,0xe6,0x00,0xcb,0xc3,0xb5,0x32,0xec,0x2d,0x7c,0x89,0x02,0x53,0x9b,0x0c,0xc7,0xd1,0xd5,0xe2,0x7a,0xe3,0x43,0x33,0xe1,0xa6,0xed,0x06,0x3f,0x7e,0x38,0xc0,0x3a,0xa1,0x99,0x51,0x1d,0x30,0x67,0x11,0x38,0x26,0x36,0xf8,0xd8,0x5a,0xbd,0xbe,0xe9,0xd5,0x4f,0xcd,0xe6,0x21,0x6a}, - {0x5f,0xe6,0x46,0x30,0x0a,0x17,0xc6,0xf1,0x24,0x35,0xd2,0x00,0x2a,0x2a,0x71,0x58,0x55,0xb7,0x82,0x8c,0x3c,0xbd,0xdb,0x69,0x57,0xff,0x95,0xa1,0xf1,0xf9,0x6b,0x58,0xe3,0xb2,0x99,0x66,0x12,0x29,0x41,0xef,0x01,0x13,0x8d,0x70,0x47,0x08,0xd3,0x71,0xbd,0xb0,0x82,0x11,0xd0,0x32,0x54,0x32,0x36,0x8b,0x1e,0x00,0x07,0x1b,0x37,0x45,0x0b,0x79,0xf8,0x5e,0x8d,0x08,0xdb,0xa6,0xe5,0x37,0x09,0x61,0xdc,0xf0,0x78,0x52,0xb8,0x6e,0xa1,0x61,0xd2,0x49,0x03,0xac,0x79,0x21,0xe5,0x90,0x37,0xb0,0xaf,0x0e}, - {0x2f,0x04,0x48,0x37,0xc1,0x55,0x05,0x96,0x11,0xaa,0x0b,0x82,0xe6,0x41,0x9a,0x21,0x0c,0x6d,0x48,0x73,0x38,0xf7,0x81,0x1c,0x61,0xc6,0x02,0x5a,0x67,0xcc,0x9a,0x30,0x1d,0xae,0x75,0x0f,0x5e,0x80,0x40,0x51,0x30,0xcc,0x62,0x26,0xe3,0xfb,0x02,0xec,0x6d,0x39,0x92,0xea,0x1e,0xdf,0xeb,0x2c,0xb3,0x5b,0x43,0xc5,0x44,0x33,0xae,0x44,0xee,0x43,0xa5,0xbb,0xb9,0x89,0xf2,0x9c,0x42,0x71,0xc9,0x5a,0x9d,0x0e,0x76,0xf3,0xaa,0x60,0x93,0x4f,0xc6,0xe5,0x82,0x1d,0x8f,0x67,0x94,0x7f,0x1b,0x22,0xd5,0x62}, - {0x6d,0x93,0xd0,0x18,0x9c,0x29,0x4c,0x52,0x0c,0x1a,0x0c,0x8a,0x6c,0xb5,0x6b,0xc8,0x31,0x86,0x4a,0xdb,0x2e,0x05,0x75,0xa3,0x62,0x45,0x75,0xbc,0xe4,0xfd,0x0e,0x5c,0x3c,0x7a,0xf7,0x3a,0x26,0xd4,0x85,0x75,0x4d,0x14,0xe9,0xfe,0x11,0x7b,0xae,0xdf,0x3d,0x19,0xf7,0x59,0x80,0x70,0x06,0xa5,0x37,0x20,0x92,0x83,0x53,0x9a,0xf2,0x14,0xf5,0xd7,0xb2,0x25,0xdc,0x7e,0x71,0xdf,0x40,0x30,0xb5,0x99,0xdb,0x70,0xf9,0x21,0x62,0x4c,0xed,0xc3,0xb7,0x34,0x92,0xda,0x3e,0x09,0xee,0x7b,0x5c,0x36,0x72,0x5e}, - {0x7f,0x21,0x71,0x45,0x07,0xfc,0x5b,0x57,0x5b,0xd9,0x94,0x06,0x5d,0x67,0x79,0x37,0x33,0x1e,0x19,0xf4,0xbb,0x37,0x0a,0x9a,0xbc,0xea,0xb4,0x47,0x4c,0x10,0xf1,0x77,0x3e,0xb3,0x08,0x2f,0x06,0x39,0x93,0x7d,0xbe,0x32,0x9f,0xdf,0xe5,0x59,0x96,0x5b,0xfd,0xbd,0x9e,0x1f,0xad,0x3d,0xff,0xac,0xb7,0x49,0x73,0xcb,0x55,0x05,0xb2,0x70,0x4c,0x2c,0x11,0x55,0xc5,0x13,0x51,0xbe,0xcd,0x1f,0x88,0x9a,0x3a,0x42,0x88,0x66,0x47,0x3b,0x50,0x5e,0x85,0x77,0x66,0x44,0x4a,0x40,0x06,0x4a,0x8f,0x39,0x34,0x0e}, - {0xe8,0xbd,0xce,0x3e,0xd9,0x22,0x7d,0xb6,0x07,0x2f,0x82,0x27,0x41,0xe8,0xb3,0x09,0x8d,0x6d,0x5b,0xb0,0x1f,0xa6,0x3f,0x74,0x72,0x23,0x36,0x8a,0x36,0x05,0x54,0x5e,0x28,0x19,0x4b,0x3e,0x09,0x0b,0x93,0x18,0x40,0xf6,0xf3,0x73,0x0e,0xe1,0xe3,0x7d,0x6f,0x5d,0x39,0x73,0xda,0x17,0x32,0xf4,0x3e,0x9c,0x37,0xca,0xd6,0xde,0x8a,0x6f,0x9a,0xb2,0xb7,0xfd,0x3d,0x12,0x40,0xe3,0x91,0xb2,0x1a,0xa2,0xe1,0x97,0x7b,0x48,0x9e,0x94,0xe6,0xfd,0x02,0x7d,0x96,0xf9,0x97,0xde,0xd3,0xc8,0x2e,0xe7,0x0d,0x78}, - {0xbc,0xe7,0x9a,0x08,0x45,0x85,0xe2,0x0a,0x06,0x4d,0x7f,0x1c,0xcf,0xde,0x8d,0x38,0xb8,0x11,0x48,0x0a,0x51,0x15,0xac,0x38,0xe4,0x8c,0x92,0x71,0xf6,0x8b,0xb2,0x0e,0x72,0x27,0xf4,0x00,0xf3,0xea,0x1f,0x67,0xaa,0x41,0x8c,0x2a,0x2a,0xeb,0x72,0x8f,0x92,0x32,0x37,0x97,0xd7,0x7f,0xa1,0x29,0xa6,0x87,0xb5,0x32,0xad,0xc6,0xef,0x1d,0xa7,0x95,0x51,0xef,0x1a,0xbe,0x5b,0xaf,0xed,0x15,0x7b,0x91,0x77,0x12,0x8c,0x14,0x2e,0xda,0xe5,0x7a,0xfb,0xf7,0x91,0x29,0x67,0x28,0xdd,0xf8,0x1b,0x20,0x7d,0x46}, - {0xad,0x4f,0xef,0x74,0x9a,0x91,0xfe,0x95,0xa2,0x08,0xa3,0xf6,0xec,0x7b,0x82,0x3a,0x01,0x7b,0xa4,0x09,0xd3,0x01,0x4e,0x96,0x97,0xc7,0xa3,0x5b,0x4f,0x3c,0xc4,0x71,0xa9,0xe7,0x7a,0x56,0xbd,0xf4,0x1e,0xbc,0xbd,0x98,0x44,0xd6,0xb2,0x4c,0x62,0x3f,0xc8,0x4e,0x1f,0x2c,0xd2,0x64,0x10,0xe4,0x01,0x40,0x38,0xba,0xa5,0xc5,0xf9,0x2e,0xcd,0x74,0x9e,0xfa,0xf6,0x6d,0xfd,0xb6,0x7a,0x26,0xaf,0xe4,0xbc,0x78,0x82,0xf1,0x0e,0x99,0xef,0xf1,0xd0,0xb3,0x55,0x82,0x93,0xf2,0xc5,0x90,0xa3,0x8c,0x75,0x5a}, - {0x95,0x24,0x46,0xd9,0x10,0x27,0xb7,0xa2,0x03,0x50,0x7d,0xd5,0xd2,0xc6,0xa8,0x3a,0xca,0x87,0xb4,0xa0,0xbf,0x00,0xd4,0xe3,0xec,0x72,0xeb,0xb3,0x44,0xe2,0xba,0x2d,0x94,0xdc,0x61,0x1d,0x8b,0x91,0xe0,0x8c,0x66,0x30,0x81,0x9a,0x46,0x36,0xed,0x8d,0xd3,0xaa,0xe8,0xaf,0x29,0xa8,0xe6,0xd4,0x3f,0xd4,0x39,0xf6,0x27,0x80,0x73,0x0a,0xcc,0xe1,0xff,0x57,0x2f,0x4a,0x0f,0x98,0x43,0x98,0x83,0xe1,0x0d,0x0d,0x67,0x00,0xfd,0x15,0xfb,0x49,0x4a,0x3f,0x5c,0x10,0x9c,0xa6,0x26,0x51,0x63,0xca,0x98,0x26}, - {0x78,0xba,0xb0,0x32,0x88,0x31,0x65,0xe7,0x8b,0xff,0x5c,0x92,0xf7,0x31,0x18,0x38,0xcc,0x1f,0x29,0xa0,0x91,0x1b,0xa8,0x08,0x07,0xeb,0xca,0x49,0xcc,0x3d,0xb4,0x1f,0x0e,0xd9,0x3d,0x5e,0x2f,0x70,0x3d,0x2e,0x86,0x53,0xd2,0xe4,0x18,0x09,0x3f,0x9e,0x6a,0xa9,0x4d,0x02,0xf6,0x3e,0x77,0x5e,0x32,0x33,0xfa,0x4a,0x0c,0x4b,0x00,0x3c,0x2b,0xb8,0xf4,0x06,0xac,0x46,0xa9,0x9a,0xf3,0xc4,0x06,0xa8,0xa5,0x84,0xa2,0x1c,0x87,0x47,0xcd,0xc6,0x5f,0x26,0xd3,0x3e,0x17,0xd2,0x1f,0xcd,0x01,0xfd,0x43,0x6b}, - {0x44,0xc5,0x97,0x46,0x4b,0x5d,0xa7,0xc7,0xbf,0xff,0x0f,0xdf,0x48,0xf8,0xfd,0x15,0x5a,0x78,0x46,0xaa,0xeb,0xb9,0x68,0x28,0x14,0xf7,0x52,0x5b,0x10,0xd7,0x68,0x5a,0xf3,0x0e,0x76,0x3e,0x58,0x42,0xc7,0xb5,0x90,0xb9,0x0a,0xee,0xb9,0x52,0xdc,0x75,0x3f,0x92,0x2b,0x07,0xc2,0x27,0x14,0xbf,0xf0,0xd9,0xf0,0x6f,0x2d,0x0b,0x42,0x73,0x06,0x1e,0x85,0x9e,0xcb,0xf6,0x2c,0xaf,0xc4,0x38,0x22,0xc6,0x13,0x39,0x59,0x8f,0x73,0xf3,0xfb,0x99,0x96,0xb8,0x8a,0xda,0x9e,0xbc,0x34,0xea,0x2f,0x63,0xb5,0x3d}, - {0xd8,0xd9,0x5d,0xf7,0x2b,0xee,0x6e,0xf4,0xa5,0x59,0x67,0x39,0xf6,0xb1,0x17,0x0d,0x73,0x72,0x9e,0x49,0x31,0xd1,0xf2,0x1b,0x13,0x5f,0xd7,0x49,0xdf,0x1a,0x32,0x04,0xd5,0x25,0x98,0x82,0xb1,0x90,0x49,0x2e,0x91,0x89,0x9a,0x3e,0x87,0xeb,0xea,0xed,0xf8,0x4a,0x70,0x4c,0x39,0x3d,0xf0,0xee,0x0e,0x2b,0xdf,0x95,0xa4,0x7e,0x19,0x59,0xae,0x5a,0xe5,0xe4,0x19,0x60,0xe1,0x04,0xe9,0x92,0x2f,0x7e,0x7a,0x43,0x7b,0xe7,0xa4,0x9a,0x15,0x6f,0xc1,0x2d,0xce,0xc7,0xc0,0x0c,0xd7,0xf4,0xc1,0xfd,0xea,0x45}, - {0x2b,0xd7,0x45,0x80,0x85,0x01,0x84,0x69,0x51,0x06,0x2f,0xcf,0xa2,0xfa,0x22,0x4c,0xc6,0x2d,0x22,0x6b,0x65,0x36,0x1a,0x94,0xde,0xda,0x62,0x03,0xc8,0xeb,0x5e,0x5a,0xed,0xb1,0xcc,0xcf,0x24,0x46,0x0e,0xb6,0x95,0x03,0x5c,0xbd,0x92,0xc2,0xdb,0x59,0xc9,0x81,0x04,0xdc,0x1d,0x9d,0xa0,0x31,0x40,0xd9,0x56,0x5d,0xea,0xce,0x73,0x3f,0xc6,0x8d,0x4e,0x0a,0xd1,0xbf,0xa7,0xb7,0x39,0xb3,0xc9,0x44,0x7e,0x00,0x57,0xbe,0xfa,0xae,0x57,0x15,0x7f,0x20,0xc1,0x60,0xdb,0x18,0x62,0x26,0x91,0x88,0x05,0x26}, - {0x04,0xff,0x60,0x83,0xa6,0x04,0xf7,0x59,0xf4,0xe6,0x61,0x76,0xde,0x3f,0xd9,0xc3,0x51,0x35,0x87,0x12,0x73,0x2a,0x1b,0x83,0x57,0x5d,0x61,0x4e,0x2e,0x0c,0xad,0x54,0x42,0xe5,0x76,0xc6,0x3c,0x8e,0x81,0x4c,0xad,0xcc,0xce,0x03,0x93,0x2c,0x42,0x5e,0x08,0x9f,0x12,0xb4,0xca,0xcc,0x07,0xec,0xb8,0x43,0x44,0xb2,0x10,0xfa,0xed,0x0d,0x2a,0x52,0x2b,0xb8,0xd5,0x67,0x3b,0xee,0xeb,0xc1,0xa5,0x9f,0x46,0x63,0xf1,0x36,0xd3,0x9f,0xc1,0x6e,0xf2,0xd2,0xb4,0xa5,0x08,0x94,0x7a,0xa7,0xba,0xb2,0xec,0x62}, - {0x3d,0x2b,0x15,0x61,0x52,0x79,0xed,0xe5,0xd1,0xd7,0xdd,0x0e,0x7d,0x35,0x62,0x49,0x71,0x4c,0x6b,0xb9,0xd0,0xc8,0x82,0x74,0xbe,0xd8,0x66,0xa9,0x19,0xf9,0x59,0x2e,0x74,0x28,0xb6,0xaf,0x36,0x28,0x07,0x92,0xa5,0x04,0xe1,0x79,0x85,0x5e,0xcd,0x5f,0x4a,0xa1,0x30,0xc6,0xad,0x01,0xad,0x5a,0x98,0x3f,0x66,0x75,0x50,0x3d,0x91,0x61,0xda,0x31,0x32,0x1a,0x36,0x2d,0xc6,0x0d,0x70,0x02,0x20,0x94,0x32,0x58,0x47,0xfa,0xce,0x94,0x95,0x3f,0x51,0x01,0xd8,0x02,0x5c,0x5d,0xc0,0x31,0xa1,0xc2,0xdb,0x3d}, - {0x4b,0xc5,0x5e,0xce,0xf9,0x0f,0xdc,0x9a,0x0d,0x13,0x2f,0x8c,0x6b,0x2a,0x9c,0x03,0x15,0x95,0xf8,0xf0,0xc7,0x07,0x80,0x02,0x6b,0xb3,0x04,0xac,0x14,0x83,0x96,0x78,0x14,0xbb,0x96,0x27,0xa2,0x57,0xaa,0xf3,0x21,0xda,0x07,0x9b,0xb7,0xba,0x3a,0x88,0x1c,0x39,0xa0,0x31,0x18,0xe2,0x4b,0xe5,0xf9,0x05,0x32,0xd8,0x38,0xfb,0xe7,0x5e,0x8e,0x6a,0x44,0x41,0xcb,0xfd,0x8d,0x53,0xf9,0x37,0x49,0x43,0xa9,0xfd,0xac,0xa5,0x78,0x8c,0x3c,0x26,0x8d,0x90,0xaf,0x46,0x09,0x0d,0xca,0x9b,0x3c,0x63,0xd0,0x61}, - {0x66,0x25,0xdb,0xff,0x35,0x49,0x74,0x63,0xbb,0x68,0x0b,0x78,0x89,0x6b,0xbd,0xc5,0x03,0xec,0x3e,0x55,0x80,0x32,0x1b,0x6f,0xf5,0xd7,0xae,0x47,0xd8,0x5f,0x96,0x6e,0xdf,0x73,0xfc,0xf8,0xbc,0x28,0xa3,0xad,0xfc,0x37,0xf0,0xa6,0x5d,0x69,0x84,0xee,0x09,0xa9,0xc2,0x38,0xdb,0xb4,0x7f,0x63,0xdc,0x7b,0x06,0xf8,0x2d,0xac,0x23,0x5b,0x7b,0x52,0x80,0xee,0x53,0xb9,0xd2,0x9a,0x8d,0x6d,0xde,0xfa,0xaa,0x19,0x8f,0xe8,0xcf,0x82,0x0e,0x15,0x04,0x17,0x71,0x0e,0xdc,0xde,0x95,0xdd,0xb9,0xbb,0xb9,0x79}, - {0xc2,0x26,0x31,0x6a,0x40,0x55,0xb3,0xeb,0x93,0xc3,0xc8,0x68,0xa8,0x83,0x63,0xd2,0x82,0x7a,0xb9,0xe5,0x29,0x64,0x0c,0x6c,0x47,0x21,0xfd,0xc9,0x58,0xf1,0x65,0x50,0x74,0x73,0x9f,0x8e,0xae,0x7d,0x99,0xd1,0x16,0x08,0xbb,0xcf,0xf8,0xa2,0x32,0xa0,0x0a,0x5f,0x44,0x6d,0x12,0xba,0x6c,0xcd,0x34,0xb8,0xcc,0x0a,0x46,0x11,0xa8,0x1b,0x54,0x99,0x42,0x0c,0xfb,0x69,0x81,0x70,0x67,0xcf,0x6e,0xd7,0xac,0x00,0x46,0xe1,0xba,0x45,0xe6,0x70,0x8a,0xb9,0xaa,0x2e,0xf2,0xfa,0xa4,0x58,0x9e,0xf3,0x81,0x39}, - {0x93,0x0a,0x23,0x59,0x75,0x8a,0xfb,0x18,0x5d,0xf4,0xe6,0x60,0x69,0x8f,0x16,0x1d,0xb5,0x3c,0xa9,0x14,0x45,0xa9,0x85,0x3a,0xfd,0xd0,0xac,0x05,0x37,0x08,0xdc,0x38,0xde,0x6f,0xe6,0x6d,0xa5,0xdf,0x45,0xc8,0x3a,0x48,0x40,0x2c,0x00,0xa5,0x52,0xe1,0x32,0xf6,0xb4,0xc7,0x63,0xe1,0xd2,0xe9,0x65,0x1b,0xbc,0xdc,0x2e,0x45,0xf4,0x30,0x40,0x97,0x75,0xc5,0x82,0x27,0x6d,0x85,0xcc,0xbe,0x9c,0xf9,0x69,0x45,0x13,0xfa,0x71,0x4e,0xea,0xc0,0x73,0xfc,0x44,0x88,0x69,0x24,0x3f,0x59,0x1a,0x9a,0x2d,0x63}, - {0xa6,0xcb,0x07,0xb8,0x15,0x6b,0xbb,0xf6,0xd7,0xf0,0x54,0xbc,0xdf,0xc7,0x23,0x18,0x0b,0x67,0x29,0x6e,0x03,0x97,0x1d,0xbb,0x57,0x4a,0xed,0x47,0x88,0xf4,0x24,0x0b,0xa7,0x84,0x0c,0xed,0x11,0xfd,0x09,0xbf,0x3a,0x69,0x9f,0x0d,0x81,0x71,0xf0,0x63,0x79,0x87,0xcf,0x57,0x2d,0x8c,0x90,0x21,0xa2,0x4b,0xf6,0x8a,0xf2,0x7d,0x5a,0x3a,0xc7,0xea,0x1b,0x51,0xbe,0xd4,0xda,0xdc,0xf2,0xcc,0x26,0xed,0x75,0x80,0x53,0xa4,0x65,0x9a,0x5f,0x00,0x9f,0xff,0x9c,0xe1,0x63,0x1f,0x48,0x75,0x44,0xf7,0xfc,0x34}, - {0xca,0x67,0x97,0x78,0x4c,0xe0,0x97,0xc1,0x7d,0x46,0xd9,0x38,0xcb,0x4d,0x71,0xb8,0xa8,0x5f,0xf9,0x83,0x82,0x88,0xde,0x55,0xf7,0x63,0xfa,0x4d,0x16,0xdc,0x3b,0x3d,0x98,0xaa,0xcf,0x78,0xab,0x1d,0xbb,0xa5,0xf2,0x72,0x0b,0x19,0x67,0xa2,0xed,0x5c,0x8e,0x60,0x92,0x0a,0x11,0xc9,0x09,0x93,0xb0,0x74,0xb3,0x2f,0x04,0xa3,0x19,0x01,0x7d,0x17,0xc2,0xe8,0x9c,0xd8,0xa2,0x67,0xc1,0xd0,0x95,0x68,0xf6,0xa5,0x9d,0x66,0xb0,0xa2,0x82,0xb2,0xe5,0x98,0x65,0xf5,0x73,0x0a,0xe2,0xed,0xf1,0x88,0xc0,0x56}, - {0x17,0x6e,0xa8,0x10,0x11,0x3d,0x6d,0x33,0xfa,0xb2,0x75,0x0b,0x32,0x88,0xf3,0xd7,0x88,0x29,0x07,0x25,0x76,0x33,0x15,0xf9,0x87,0x8b,0x10,0x99,0x6b,0x4c,0x67,0x09,0x02,0x8f,0xf3,0x24,0xac,0x5f,0x1b,0x58,0xbd,0x0c,0xe3,0xba,0xfe,0xe9,0x0b,0xa9,0xf0,0x92,0xcf,0x8a,0x02,0x69,0x21,0x9a,0x8f,0x03,0x59,0x83,0xa4,0x7e,0x8b,0x03,0xf8,0x6f,0x31,0x99,0x21,0xf8,0x4e,0x9f,0x4f,0x8d,0xa7,0xea,0x82,0xd2,0x49,0x2f,0x74,0x31,0xef,0x5a,0xab,0xa5,0x71,0x09,0x65,0xeb,0x69,0x59,0x02,0x31,0x5e,0x6e}, - {0xfb,0x93,0xe5,0x87,0xf5,0x62,0x6c,0xb1,0x71,0x3e,0x5d,0xca,0xde,0xed,0x99,0x49,0x6d,0x3e,0xcc,0x14,0xe0,0xc1,0x91,0xb4,0xa8,0xdb,0xa8,0x89,0x47,0x11,0xf5,0x08,0x22,0x62,0x06,0x63,0x0e,0xfb,0x04,0x33,0x3f,0xba,0xac,0x87,0x89,0x06,0x35,0xfb,0xa3,0x61,0x10,0x8c,0x77,0x24,0x19,0xbd,0x20,0x86,0x83,0xd1,0x43,0xad,0x58,0x30,0xd0,0x63,0x76,0xe5,0xfd,0x0f,0x3c,0x32,0x10,0xa6,0x2e,0xa2,0x38,0xdf,0xc3,0x05,0x9a,0x4f,0x99,0xac,0xbd,0x8a,0xc7,0xbd,0x99,0xdc,0xe3,0xef,0xa4,0x9f,0x54,0x26}, - {0xd6,0xf9,0x6b,0x1e,0x46,0x5a,0x1d,0x74,0x81,0xa5,0x77,0x77,0xfc,0xb3,0x05,0x23,0xd9,0xd3,0x74,0x64,0xa2,0x74,0x55,0xd4,0xff,0xe0,0x01,0x64,0xdc,0xe1,0x26,0x19,0x6e,0x66,0x3f,0xaf,0x49,0x85,0x46,0xdb,0xa5,0x0e,0x4a,0xf1,0x04,0xcf,0x7f,0xd7,0x47,0x0c,0xba,0xa4,0xf7,0x3f,0xf2,0x3d,0x85,0x3c,0xce,0x32,0xe1,0xdf,0x10,0x3a,0xa0,0xce,0x17,0xea,0x8a,0x4e,0x7f,0xe0,0xfd,0xc1,0x1f,0x3a,0x46,0x15,0xd5,0x2f,0xf1,0xc0,0xf2,0x31,0xfd,0x22,0x53,0x17,0x15,0x5d,0x1e,0x86,0x1d,0xd0,0xa1,0x1f}, - {0x32,0x98,0x59,0x7d,0x94,0x55,0x80,0xcc,0x20,0x55,0xf1,0x37,0xda,0x56,0x46,0x1e,0x20,0x93,0x05,0x4e,0x74,0xf7,0xf6,0x99,0x33,0xcf,0x75,0x6a,0xbc,0x63,0x35,0x77,0xab,0x94,0xdf,0xd1,0x00,0xac,0xdc,0x38,0xe9,0x0d,0x08,0xd1,0xdd,0x2b,0x71,0x2e,0x62,0xe2,0xd5,0xfd,0x3e,0xe9,0x13,0x7f,0xe5,0x01,0x9a,0xee,0x18,0xed,0xfc,0x73,0xb3,0x9c,0x13,0x63,0x08,0xe9,0xb1,0x06,0xcd,0x3e,0xa0,0xc5,0x67,0xda,0x93,0xa4,0x32,0x89,0x63,0xad,0xc8,0xce,0x77,0x8d,0x44,0x4f,0x86,0x1b,0x70,0x6b,0x42,0x1f}, - {0x01,0x1c,0x91,0x41,0x4c,0x26,0xc9,0xef,0x25,0x2c,0xa2,0x17,0xb8,0xb7,0xa3,0xf1,0x47,0x14,0x0f,0xf3,0x6b,0xda,0x75,0x58,0x90,0xb0,0x31,0x1d,0x27,0xf5,0x1a,0x4e,0x52,0x25,0xa1,0x91,0xc8,0x35,0x7e,0xf1,0x76,0x9c,0x5e,0x57,0x53,0x81,0x6b,0xb7,0x3e,0x72,0x9b,0x0d,0x6f,0x40,0x83,0xfa,0x38,0xe4,0xa7,0x3f,0x1b,0xbb,0x76,0x0b,0x9b,0x93,0x92,0x7f,0xf9,0xc1,0xb8,0x08,0x6e,0xab,0x44,0xd4,0xcb,0x71,0x67,0xbe,0x17,0x80,0xbb,0x99,0x63,0x64,0xe5,0x22,0x55,0xa9,0x72,0xb7,0x1e,0xd6,0x6d,0x7b}, - {0x92,0x3d,0xf3,0x50,0xe8,0xc1,0xad,0xb7,0xcf,0xd5,0x8c,0x60,0x4f,0xfa,0x98,0x79,0xdb,0x5b,0xfc,0x8d,0xbd,0x2d,0x96,0xad,0x4f,0x2f,0x1d,0xaf,0xce,0x9b,0x3e,0x70,0xc7,0xd2,0x01,0xab,0xf9,0xab,0x30,0x57,0x18,0x3b,0x14,0x40,0xdc,0x76,0xfb,0x16,0x81,0xb2,0xcb,0xa0,0x65,0xbe,0x6c,0x86,0xfe,0x6a,0xff,0x9b,0x65,0x9b,0xfa,0x53,0x55,0x54,0x88,0x94,0xe9,0xc8,0x14,0x6c,0xe5,0xd4,0xae,0x65,0x66,0x5d,0x3a,0x84,0xf1,0x5a,0xd6,0xbc,0x3e,0xb7,0x1b,0x18,0x50,0x1f,0xc6,0xc4,0xe5,0x93,0x8d,0x39}, - {0xf3,0x48,0xe2,0x33,0x67,0xd1,0x4b,0x1c,0x5f,0x0a,0xbf,0x15,0x87,0x12,0x9e,0xbd,0x76,0x03,0x0b,0xa1,0xf0,0x8c,0x3f,0xd4,0x13,0x1b,0x19,0xdf,0x5d,0x9b,0xb0,0x53,0xf2,0xe3,0xe7,0xd2,0x60,0x7c,0x87,0xc3,0xb1,0x8b,0x82,0x30,0xa0,0xaa,0x34,0x3b,0x38,0xf1,0x9e,0x73,0xe7,0x26,0x3e,0x28,0x77,0x05,0xc3,0x02,0x90,0x9c,0x9c,0x69,0xcc,0xf1,0x46,0x59,0x23,0xa7,0x06,0xf3,0x7d,0xd9,0xe5,0xcc,0xb5,0x18,0x17,0x92,0x75,0xe9,0xb4,0x81,0x47,0xd2,0xcd,0x28,0x07,0xd9,0xcd,0x6f,0x0c,0xf3,0xca,0x51}, - {0x0a,0xe0,0x74,0x76,0x42,0xa7,0x0b,0xa6,0xf3,0x7b,0x7a,0xa1,0x70,0x85,0x0e,0x63,0xcc,0x24,0x33,0xcf,0x3d,0x56,0x58,0x37,0xaa,0xfd,0x83,0x23,0x29,0xaa,0x04,0x55,0xc7,0x54,0xac,0x18,0x9a,0xf9,0x7a,0x73,0x0f,0xb3,0x1c,0xc5,0xdc,0x78,0x33,0x90,0xc7,0x0c,0xe1,0x4c,0x33,0xbc,0x89,0x2b,0x9a,0xe9,0xf8,0x89,0xc1,0x29,0xae,0x12,0xcf,0x01,0x0d,0x1f,0xcb,0xc0,0x9e,0xa9,0xae,0xf7,0x34,0x3a,0xcc,0xef,0xd1,0x0d,0x22,0x4e,0x9c,0xd0,0x21,0x75,0xca,0x55,0xea,0xa5,0xeb,0x58,0xe9,0x4f,0xd1,0x5f}, - {0x2c,0xab,0x45,0x28,0xdf,0x2d,0xdc,0xb5,0x93,0xe9,0x7f,0x0a,0xb1,0x91,0x94,0x06,0x46,0xe3,0x02,0x40,0xd6,0xf3,0xaa,0x4d,0xd1,0x74,0x64,0x58,0x6e,0xf2,0x3f,0x09,0x8e,0xcb,0x93,0xbf,0x5e,0xfe,0x42,0x3c,0x5f,0x56,0xd4,0x36,0x51,0xa8,0xdf,0xbe,0xe8,0x20,0x42,0x88,0x9e,0x85,0xf0,0xe0,0x28,0xd1,0x25,0x07,0x96,0x3f,0xd7,0x7d,0x29,0x98,0x05,0x68,0xfe,0x24,0x0d,0xb1,0xe5,0x23,0xaf,0xdb,0x72,0x06,0x73,0x75,0x29,0xac,0x57,0xb4,0x3a,0x25,0x67,0x13,0xa4,0x70,0xb4,0x86,0xbc,0xbc,0x59,0x2f}, - {0x5f,0x13,0x17,0x99,0x42,0x7d,0x84,0x83,0xd7,0x03,0x7d,0x56,0x1f,0x91,0x1b,0xad,0xd1,0xaa,0x77,0xbe,0xd9,0x48,0x77,0x7e,0x4a,0xaf,0x51,0x2e,0x2e,0xb4,0x58,0x54,0x01,0xc3,0x91,0xb6,0x60,0xd5,0x41,0x70,0x1e,0xe7,0xd7,0xad,0x3f,0x1b,0x20,0x85,0x85,0x55,0x33,0x11,0x63,0xe1,0xc2,0x16,0xb1,0x28,0x08,0x01,0x3d,0x5e,0xa5,0x2a,0x4f,0x44,0x07,0x0c,0xe6,0x92,0x51,0xed,0x10,0x1d,0x42,0x74,0x2d,0x4e,0xc5,0x42,0x64,0xc8,0xb5,0xfd,0x82,0x4c,0x2b,0x35,0x64,0x86,0x76,0x8a,0x4a,0x00,0xe9,0x13}, - {0xdb,0xce,0x2f,0x83,0x45,0x88,0x9d,0x73,0x63,0xf8,0x6b,0xae,0xc9,0xd6,0x38,0xfa,0xf7,0xfe,0x4f,0xb7,0xca,0x0d,0xbc,0x32,0x5e,0xe4,0xbc,0x14,0x88,0x7e,0x93,0x73,0x7f,0x87,0x3b,0x19,0xc9,0x00,0x2e,0xbb,0x6b,0x50,0xdc,0xe0,0x90,0xa8,0xe3,0xec,0x9f,0x64,0xde,0x36,0xc0,0xb7,0xf3,0xec,0x1a,0x9e,0xde,0x98,0x08,0x04,0x46,0x5f,0x8d,0xf4,0x7b,0x29,0x16,0x71,0x03,0xb9,0x34,0x68,0xf0,0xd4,0x22,0x3b,0xd1,0xa9,0xc6,0xbd,0x96,0x46,0x57,0x15,0x97,0xe1,0x35,0xe8,0xd5,0x91,0xe8,0xa4,0xf8,0x2c}, - {0x67,0x0f,0x11,0x07,0x87,0xfd,0x93,0x6d,0x49,0xb5,0x38,0x7c,0xd3,0x09,0x4c,0xdd,0x86,0x6a,0x73,0xc2,0x4c,0x6a,0xb1,0x7c,0x09,0x2a,0x25,0x58,0x6e,0xbd,0x49,0x20,0xa2,0x6b,0xd0,0x17,0x7e,0x48,0xb5,0x2c,0x6b,0x19,0x50,0x39,0x1c,0x38,0xd2,0x24,0x30,0x8a,0x97,0x85,0x81,0x9c,0x65,0xd7,0xf6,0xa4,0xd6,0x91,0x28,0x7f,0x6f,0x7a,0x49,0xef,0x9a,0x6a,0x8d,0xfd,0x09,0x7d,0x0b,0xb9,0x3d,0x5b,0xbe,0x60,0xee,0xf0,0xd4,0xbf,0x9e,0x51,0x2c,0xb5,0x21,0x4c,0x1d,0x94,0x45,0xc5,0xdf,0xaa,0x11,0x60}, - {0x3c,0xf8,0x95,0xcf,0x6d,0x92,0x67,0x5f,0x71,0x90,0x28,0x71,0x61,0x85,0x7e,0x7c,0x5b,0x7a,0x8f,0x99,0xf3,0xe7,0xa1,0xd6,0xe0,0xf9,0x62,0x0b,0x1b,0xcc,0xc5,0x6f,0x90,0xf8,0xcb,0x02,0xc8,0xd0,0xde,0x63,0xaa,0x6a,0xff,0x0d,0xca,0x98,0xd0,0xfb,0x99,0xed,0xb6,0xb9,0xfd,0x0a,0x4d,0x62,0x1e,0x0b,0x34,0x79,0xb7,0x18,0xce,0x69,0xcb,0x79,0x98,0xb2,0x28,0x55,0xef,0xd1,0x92,0x90,0x7e,0xd4,0x3c,0xae,0x1a,0xdd,0x52,0x23,0x9f,0x18,0x42,0x04,0x7e,0x12,0xf1,0x01,0x71,0xe5,0x3a,0x6b,0x59,0x15}, - {0xa2,0x79,0x91,0x3f,0xd2,0x39,0x27,0x46,0xcf,0xdd,0xd6,0x97,0x31,0x12,0x83,0xff,0x8a,0x14,0xf2,0x53,0xb5,0xde,0x07,0x13,0xda,0x4d,0x5f,0x7b,0x68,0x37,0x22,0x0d,0xca,0x24,0x51,0x7e,0x16,0x31,0xff,0x09,0xdf,0x45,0xc7,0xd9,0x8b,0x15,0xe4,0x0b,0xe5,0x56,0xf5,0x7e,0x22,0x7d,0x2b,0x29,0x38,0xd1,0xb6,0xaf,0x41,0xe2,0xa4,0x3a,0xf5,0x05,0x33,0x2a,0xbf,0x38,0xc1,0x2c,0xc3,0x26,0xe9,0xa2,0x8f,0x3f,0x58,0x48,0xeb,0xd2,0x49,0x55,0xa2,0xb1,0x3a,0x08,0x6c,0xa3,0x87,0x46,0x6e,0xaa,0xfc,0x32}, - {0xf5,0x9a,0x7d,0xc5,0x8d,0x6e,0xc5,0x7b,0xf2,0xbd,0xf0,0x9d,0xed,0xd2,0x0b,0x3e,0xa3,0xe4,0xef,0x22,0xde,0x14,0xc0,0xaa,0x5c,0x6a,0xbd,0xfe,0xce,0xe9,0x27,0x46,0xdf,0xcc,0x87,0x27,0x73,0xa4,0x07,0x32,0xf8,0xe3,0x13,0xf2,0x08,0x19,0xe3,0x17,0x4e,0x96,0x0d,0xf6,0xd7,0xec,0xb2,0xd5,0xe9,0x0b,0x60,0xc2,0x36,0x63,0x6f,0x74,0x1c,0x97,0x6c,0xab,0x45,0xf3,0x4a,0x3f,0x1f,0x73,0x43,0x99,0x72,0xeb,0x88,0xe2,0x6d,0x18,0x44,0x03,0x8a,0x6a,0x59,0x33,0x93,0x62,0xd6,0x7e,0x00,0x17,0x49,0x7b}, - {0x64,0xb0,0x84,0xab,0x5c,0xfb,0x85,0x2d,0x14,0xbc,0xf3,0x89,0xd2,0x10,0x78,0x49,0x0c,0xce,0x15,0x7b,0x44,0xdc,0x6a,0x47,0x7b,0xfd,0x44,0xf8,0x76,0xa3,0x2b,0x12,0xdd,0xa2,0x53,0xdd,0x28,0x1b,0x34,0x54,0x3f,0xfc,0x42,0xdf,0x5b,0x90,0x17,0xaa,0xf4,0xf8,0xd2,0x4d,0xd9,0x92,0xf5,0x0f,0x7d,0xd3,0x8c,0xe0,0x0f,0x62,0x03,0x1d,0x54,0xe5,0xb4,0xa2,0xcd,0x32,0x02,0xc2,0x7f,0x18,0x5d,0x11,0x42,0xfd,0xd0,0x9e,0xd9,0x79,0xd4,0x7d,0xbe,0xb4,0xab,0x2e,0x4c,0xec,0x68,0x2b,0xf5,0x0b,0xc7,0x02}, - {0xbb,0x2f,0x0b,0x5d,0x4b,0xec,0x87,0xa2,0xca,0x82,0x48,0x07,0x90,0x57,0x5c,0x41,0x5c,0x81,0xd0,0xc1,0x1e,0xa6,0x44,0xe0,0xe0,0xf5,0x9e,0x40,0x0a,0x4f,0x33,0x26,0xe1,0x72,0x8d,0x45,0xbf,0x32,0xe5,0xac,0xb5,0x3c,0xb7,0x7c,0xe0,0x68,0xe7,0x5b,0xe7,0xbd,0x8b,0xee,0x94,0x7d,0xcf,0x56,0x03,0x3a,0xb4,0xfe,0xe3,0x97,0x06,0x6b,0xc0,0xa3,0x62,0xdf,0x4a,0xf0,0xc8,0xb6,0x5d,0xa4,0x6d,0x07,0xef,0x00,0xf0,0x3e,0xa9,0xd2,0xf0,0x49,0x58,0xb9,0x9c,0x9c,0xae,0x2f,0x1b,0x44,0x43,0x7f,0xc3,0x1c}, - {0x4f,0x32,0xc7,0x5c,0x5a,0x56,0x8f,0x50,0x22,0xa9,0x06,0xe5,0xc0,0xc4,0x61,0xd0,0x19,0xac,0x45,0x5c,0xdb,0xab,0x18,0xfb,0x4a,0x31,0x80,0x03,0xc1,0x09,0x68,0x6c,0xb9,0xae,0xce,0xc9,0xf1,0x56,0x66,0xd7,0x6a,0x65,0xe5,0x18,0xf8,0x15,0x5b,0x1c,0x34,0x23,0x4c,0x84,0x32,0x28,0xe7,0x26,0x38,0x68,0x19,0x2f,0x77,0x6f,0x34,0x3a,0xc8,0x6a,0xda,0xe2,0x12,0x51,0xd5,0xd2,0xed,0x51,0xe8,0xb1,0x31,0x03,0xbd,0xe9,0x62,0x72,0xc6,0x8e,0xdd,0x46,0x07,0x96,0xd0,0xc5,0xf7,0x6e,0x9f,0x1b,0x91,0x05}, - {0xbb,0x0e,0xdf,0xf5,0x83,0x99,0x33,0xc1,0xac,0x4c,0x2c,0x51,0x8f,0x75,0xf3,0xc0,0xe1,0x98,0xb3,0x0b,0x0a,0x13,0xf1,0x2c,0x62,0x0c,0x27,0xaa,0xf9,0xec,0x3c,0x6b,0xef,0xea,0x2e,0x51,0xf3,0xac,0x49,0x53,0x49,0xcb,0xc1,0x1c,0xd3,0x41,0xc1,0x20,0x8d,0x68,0x9a,0xa9,0x07,0x0c,0x18,0x24,0x17,0x2d,0x4b,0xc6,0xd1,0xf9,0x5e,0x55,0x08,0xbd,0x73,0x3b,0xba,0x70,0xa7,0x36,0x0c,0xbf,0xaf,0xa3,0x08,0xef,0x4a,0x62,0xf2,0x46,0x09,0xb4,0x98,0xff,0x37,0x57,0x9d,0x74,0x81,0x33,0xe1,0x4d,0x5f,0x67}, - {0xfc,0x82,0x17,0x6b,0x03,0x52,0x2c,0x0e,0xb4,0x83,0xad,0x6c,0x81,0x6c,0x81,0x64,0x3e,0x07,0x64,0x69,0xd9,0xbd,0xdc,0xd0,0x20,0xc5,0x64,0x01,0xf7,0x9d,0xd9,0x13,0x1d,0xb3,0xda,0x3b,0xd9,0xf6,0x2f,0xa1,0xfe,0x2d,0x65,0x9d,0x0f,0xd8,0x25,0x07,0x87,0x94,0xbe,0x9a,0xf3,0x4f,0x9c,0x01,0x43,0x3c,0xcd,0x82,0xb8,0x50,0xf4,0x60,0xca,0xc0,0xe5,0x21,0xc3,0x5e,0x4b,0x01,0xa2,0xbf,0x19,0xd7,0xc9,0x69,0xcb,0x4f,0xa0,0x23,0x00,0x75,0x18,0x1c,0x5f,0x4e,0x80,0xac,0xed,0x55,0x9e,0xde,0x06,0x1c}, - {0xe2,0xc4,0x3e,0xa3,0xd6,0x7a,0x0f,0x99,0x8e,0xe0,0x2e,0xbe,0x38,0xf9,0x08,0x66,0x15,0x45,0x28,0x63,0xc5,0x43,0xa1,0x9c,0x0d,0xb6,0x2d,0xec,0x1f,0x8a,0xf3,0x4c,0xaa,0x69,0x6d,0xff,0x40,0x2b,0xd5,0xff,0xbb,0x49,0x40,0xdc,0x18,0x0b,0x53,0x34,0x97,0x98,0x4d,0xa3,0x2f,0x5c,0x4a,0x5e,0x2d,0xba,0x32,0x7d,0x8e,0x6f,0x09,0x78,0xe7,0x5c,0xfa,0x0d,0x65,0xaa,0xaa,0xa0,0x8c,0x47,0xb5,0x48,0x2a,0x9e,0xc4,0xf9,0x5b,0x72,0x03,0x70,0x7d,0xcc,0x09,0x4f,0xbe,0x1a,0x09,0x26,0x3a,0xad,0x3c,0x37}, - {0x7c,0xf5,0xc9,0x82,0x4d,0x63,0x94,0xb2,0x36,0x45,0x93,0x24,0xe1,0xfd,0xcb,0x1f,0x5a,0xdb,0x8c,0x41,0xb3,0x4d,0x9c,0x9e,0xfc,0x19,0x44,0x45,0xd9,0xf3,0x40,0x00,0xad,0xbb,0xdd,0x89,0xfb,0xa8,0xbe,0xf1,0xcb,0xae,0xae,0x61,0xbc,0x2c,0xcb,0x3b,0x9d,0x8d,0x9b,0x1f,0xbb,0xa7,0x58,0x8f,0x86,0xa6,0x12,0x51,0xda,0x7e,0x54,0x21,0xd3,0x86,0x59,0xfd,0x39,0xe9,0xfd,0xde,0x0c,0x38,0x0a,0x51,0x89,0x2c,0x27,0xf4,0xb9,0x19,0x31,0xbb,0x07,0xa4,0x2b,0xb7,0xf4,0x4d,0x25,0x4a,0x33,0x0a,0x55,0x63}, - {0x37,0xcf,0x69,0xb5,0xed,0xd6,0x07,0x65,0xe1,0x2e,0xa5,0x0c,0xb0,0x29,0x84,0x17,0x5d,0xd6,0x6b,0xeb,0x90,0x00,0x7c,0xea,0x51,0x8f,0xf7,0xda,0xc7,0x62,0xea,0x3e,0x49,0x7b,0x54,0x72,0x45,0x58,0xba,0x9b,0xe0,0x08,0xc4,0xe2,0xfa,0xc6,0x05,0xf3,0x8d,0xf1,0x34,0xc7,0x69,0xfa,0xe8,0x60,0x7a,0x76,0x7d,0xaa,0xaf,0x2b,0xa9,0x39,0x4e,0x27,0x93,0xe6,0x13,0xc7,0x24,0x9d,0x75,0xd3,0xdb,0x68,0x77,0x85,0x63,0x5f,0x9a,0xb3,0x8a,0xeb,0x60,0x55,0x52,0x70,0xcd,0xc4,0xc9,0x65,0x06,0x6a,0x43,0x68}, - {0x27,0x3f,0x2f,0x20,0xe8,0x35,0x02,0xbc,0xb0,0x75,0xf9,0x64,0xe2,0x00,0x5c,0xc7,0x16,0x24,0x8c,0xa3,0xd5,0xe9,0xa4,0x91,0xf9,0x89,0xb7,0x8a,0xf6,0xe7,0xb6,0x17,0x7c,0x10,0x20,0xe8,0x17,0xd3,0x56,0x1e,0x65,0xe9,0x0a,0x84,0x44,0x68,0x26,0xc5,0x7a,0xfc,0x0f,0x32,0xc6,0xa1,0xe0,0xc1,0x72,0x14,0x61,0x91,0x9c,0x66,0x73,0x53,0x57,0x52,0x0e,0x9a,0xab,0x14,0x28,0x5d,0xfc,0xb3,0xca,0xc9,0x84,0x20,0x8f,0x90,0xca,0x1e,0x2d,0x5b,0x88,0xf5,0xca,0xaf,0x11,0x7d,0xf8,0x78,0xa6,0xb5,0xb4,0x1c}, - {0x6c,0xfc,0x4a,0x39,0x6b,0xc0,0x64,0xb6,0xb1,0x5f,0xda,0x98,0x24,0xde,0x88,0x0c,0x34,0xd8,0xca,0x4b,0x16,0x03,0x8d,0x4f,0xa2,0x34,0x74,0xde,0x78,0xca,0x0b,0x33,0xe7,0x07,0xa0,0xa2,0x62,0xaa,0x74,0x6b,0xb1,0xc7,0x71,0xf0,0xb0,0xe0,0x11,0xf3,0x23,0xe2,0x0b,0x00,0x38,0xe4,0x07,0x57,0xac,0x6e,0xef,0x82,0x2d,0xfd,0xc0,0x2d,0x4e,0x74,0x19,0x11,0x84,0xff,0x2e,0x98,0x24,0x47,0x07,0x2b,0x96,0x5e,0x69,0xf9,0xfb,0x53,0xc9,0xbf,0x4f,0xc1,0x8a,0xc5,0xf5,0x1c,0x9f,0x36,0x1b,0xbe,0x31,0x3c}, - {0xee,0x8a,0x94,0x08,0x4d,0x86,0xf4,0xb0,0x6f,0x1c,0xba,0x91,0xee,0x19,0xdc,0x07,0x58,0xa1,0xac,0xa6,0xae,0xcd,0x75,0x79,0xbb,0xd4,0x62,0x42,0x13,0x61,0x0b,0x33,0x72,0x42,0xcb,0xf9,0x93,0xbc,0x68,0xc1,0x98,0xdb,0xce,0xc7,0x1f,0x71,0xb8,0xae,0x7a,0x8d,0xac,0x34,0xaa,0x52,0x0e,0x7f,0xbb,0x55,0x7d,0x7e,0x09,0xc1,0xce,0x41,0x8a,0x80,0x6d,0xa2,0xd7,0x19,0x96,0xf7,0x6d,0x15,0x9e,0x1d,0x9e,0xd4,0x1f,0xbb,0x27,0xdf,0xa1,0xdb,0x6c,0xc3,0xd7,0x73,0x7d,0x77,0x28,0x1f,0xd9,0x4c,0xb4,0x26}, - {0x75,0x74,0x38,0x8f,0x47,0x48,0xf0,0x51,0x3c,0xcb,0xbe,0x9c,0xf4,0xbc,0x5d,0xb2,0x55,0x20,0x9f,0xd9,0x44,0x12,0xab,0x9a,0xd6,0xa5,0x10,0x1c,0x6c,0x9e,0x70,0x2c,0x83,0x03,0x73,0x62,0x93,0xf2,0xb7,0xe1,0x2c,0x8a,0xca,0xeb,0xff,0x79,0x52,0x4b,0x14,0x13,0xd4,0xbf,0x8a,0x77,0xfc,0xda,0x0f,0x61,0x72,0x9c,0x14,0x10,0xeb,0x7d,0x7a,0xee,0x66,0x87,0x6a,0xaf,0x62,0xcb,0x0e,0xcd,0x53,0x55,0x04,0xec,0xcb,0x66,0xb5,0xe4,0x0b,0x0f,0x38,0x01,0x80,0x58,0xea,0xe2,0x2c,0xf6,0x9f,0x8e,0xe6,0x08}, - {0xad,0x30,0xc1,0x4b,0x0a,0x50,0xad,0x34,0x9c,0xd4,0x0b,0x3d,0x49,0xdb,0x38,0x8d,0xbe,0x89,0x0a,0x50,0x98,0x3d,0x5c,0xa2,0x09,0x3b,0xba,0xee,0x87,0x3f,0x1f,0x2f,0xf9,0xf2,0xb8,0x0a,0xd5,0x09,0x2d,0x2f,0xdf,0x23,0x59,0xc5,0x8d,0x21,0xb9,0xac,0xb9,0x6c,0x76,0x73,0x26,0x34,0x8f,0x4a,0xf5,0x19,0xf7,0x38,0xd7,0x3b,0xb1,0x4c,0x4a,0xb6,0x15,0xe5,0x75,0x8c,0x84,0xf7,0x38,0x90,0x4a,0xdb,0xba,0x01,0x95,0xa5,0x50,0x1b,0x75,0x3f,0x3f,0x31,0x0d,0xc2,0xe8,0x2e,0xae,0xc0,0x53,0xe3,0xa1,0x19}, - {0xc3,0x05,0xfa,0xba,0x60,0x75,0x1c,0x7d,0x61,0x5e,0xe5,0xc6,0xa0,0xa0,0xe1,0xb3,0x73,0x64,0xd6,0xc0,0x18,0x97,0x52,0xe3,0x86,0x34,0x0c,0xc2,0x11,0x6b,0x54,0x41,0xbd,0xbd,0x96,0xd5,0xcd,0x72,0x21,0xb4,0x40,0xfc,0xee,0x98,0x43,0x45,0xe0,0x93,0xb5,0x09,0x41,0xb4,0x47,0x53,0xb1,0x9f,0x34,0xae,0x66,0x02,0x99,0xd3,0x6b,0x73,0xb4,0xb3,0x34,0x93,0x50,0x2d,0x53,0x85,0x73,0x65,0x81,0x60,0x4b,0x11,0xfd,0x46,0x75,0x83,0x5c,0x42,0x30,0x5f,0x5f,0xcc,0x5c,0xab,0x7f,0xb8,0xa2,0x95,0x22,0x41}, - {0xe9,0xd6,0x7e,0xf5,0x88,0x9b,0xc9,0x19,0x25,0xc8,0xf8,0x6d,0x26,0xcb,0x93,0x53,0x73,0xd2,0x0a,0xb3,0x13,0x32,0xee,0x5c,0x34,0x2e,0x2d,0xb5,0xeb,0x53,0xe1,0x14,0xc6,0xea,0x93,0xe2,0x61,0x52,0x65,0x2e,0xdb,0xac,0x33,0x21,0x03,0x92,0x5a,0x84,0x6b,0x99,0x00,0x79,0xcb,0x75,0x09,0x46,0x80,0xdd,0x5a,0x19,0x8d,0xbb,0x60,0x07,0x8a,0x81,0xe6,0xcd,0x17,0x1a,0x3e,0x41,0x84,0xa0,0x69,0xed,0xa9,0x6d,0x15,0x57,0xb1,0xcc,0xca,0x46,0x8f,0x26,0xbf,0x2c,0xf2,0xc5,0x3a,0xc3,0x9b,0xbe,0x34,0x6b}, - {0xb2,0xc0,0x78,0x3a,0x64,0x2f,0xdf,0xf3,0x7c,0x02,0x2e,0xf2,0x1e,0x97,0x3e,0x4c,0xa3,0xb5,0xc1,0x49,0x5e,0x1c,0x7d,0xec,0x2d,0xdd,0x22,0x09,0x8f,0xc1,0x12,0x20,0xd3,0xf2,0x71,0x65,0x65,0x69,0xfc,0x11,0x7a,0x73,0x0e,0x53,0x45,0xe8,0xc9,0xc6,0x35,0x50,0xfe,0xd4,0xa2,0xe7,0x3a,0xe3,0x0b,0xd3,0x6d,0x2e,0xb6,0xc7,0xb9,0x01,0x29,0x9d,0xc8,0x5a,0xe5,0x55,0x0b,0x88,0x63,0xa7,0xa0,0x45,0x1f,0x24,0x83,0x14,0x1f,0x6c,0xe7,0xc2,0xdf,0xef,0x36,0x3d,0xe8,0xad,0x4b,0x4e,0x78,0x5b,0xaf,0x08}, - {0x33,0x25,0x1f,0x88,0xdc,0x99,0x34,0x28,0xb6,0x23,0x93,0x77,0xda,0x25,0x05,0x9d,0xf4,0x41,0x34,0x67,0xfb,0xdd,0x7a,0x89,0x8d,0x16,0x3a,0x16,0x71,0x9d,0xb7,0x32,0x4b,0x2c,0xcc,0x89,0xd2,0x14,0x73,0xe2,0x8d,0x17,0x87,0xa2,0x11,0xbd,0xe4,0x4b,0xce,0x64,0x33,0xfa,0xd6,0x28,0xd5,0x18,0x6e,0x82,0xd9,0xaf,0xd5,0xc1,0x23,0x64,0x6a,0xb3,0xfc,0xed,0xd9,0xf8,0x85,0xcc,0xf9,0xe5,0x46,0x37,0x8f,0xc2,0xbc,0x22,0xcd,0xd3,0xe5,0xf9,0x38,0xe3,0x9d,0xe4,0xcc,0x2d,0x3e,0xc1,0xfb,0x5e,0x0a,0x48}, - {0x71,0x20,0x62,0x01,0x0b,0xe7,0x51,0x0b,0xc5,0xaf,0x1d,0x8b,0xcf,0x05,0xb5,0x06,0xcd,0xab,0x5a,0xef,0x61,0xb0,0x6b,0x2c,0x31,0xbf,0xb7,0x0c,0x60,0x27,0xaa,0x47,0x1f,0x22,0xce,0x42,0xe4,0x4c,0x61,0xb6,0x28,0x39,0x05,0x4c,0xcc,0x9d,0x19,0x6e,0x03,0xbe,0x1c,0xdc,0xa4,0xb4,0x3f,0x66,0x06,0x8e,0x1c,0x69,0x47,0x1d,0xb3,0x24,0xc3,0xf8,0x15,0xc0,0xed,0x1e,0x54,0x2a,0x7c,0x3f,0x69,0x7c,0x7e,0xfe,0xa4,0x11,0xd6,0x78,0xa2,0x4e,0x13,0x66,0xaf,0xf0,0x94,0xa0,0xdd,0x14,0x5d,0x58,0x5b,0x54}, - {0x0f,0x3a,0xd4,0xa0,0x5e,0x27,0xbf,0x67,0xbe,0xee,0x9b,0x08,0x34,0x8e,0xe6,0xad,0x2e,0xe7,0x79,0xd4,0x4c,0x13,0x89,0x42,0x54,0x54,0xba,0x32,0xc3,0xf9,0x62,0x0f,0xe1,0x21,0xb3,0xe3,0xd0,0xe4,0x04,0x62,0x95,0x1e,0xff,0x28,0x7a,0x63,0xaa,0x3b,0x9e,0xbd,0x99,0x5b,0xfd,0xcf,0x0c,0x0b,0x71,0xd0,0xc8,0x64,0x3e,0xdc,0x22,0x4d,0x39,0x5f,0x3b,0xd6,0x89,0x65,0xb4,0xfc,0x61,0xcf,0xcb,0x57,0x3f,0x6a,0xae,0x5c,0x05,0xfa,0x3a,0x95,0xd2,0xc2,0xba,0xfe,0x36,0x14,0x37,0x36,0x1a,0xa0,0x0f,0x1c}, - {0xff,0x3d,0x94,0x22,0xb6,0x04,0xc6,0xd2,0xa0,0xb3,0xcf,0x44,0xce,0xbe,0x8c,0xbc,0x78,0x86,0x80,0x97,0xf3,0x4f,0x25,0x5d,0xbf,0xa6,0x1c,0x3b,0x4f,0x61,0xa3,0x0f,0x50,0x6a,0x93,0x8c,0x0e,0x2b,0x08,0x69,0xb6,0xc5,0xda,0xc1,0x35,0xa0,0xc9,0xf9,0x34,0xb6,0xdf,0xc4,0x54,0x3e,0xb7,0x6f,0x40,0xc1,0x2b,0x1d,0x9b,0x41,0x05,0x40,0xf0,0x82,0xbe,0xb9,0xbd,0xfe,0x03,0xa0,0x90,0xac,0x44,0x3a,0xaf,0xc1,0x89,0x20,0x8e,0xfa,0x54,0x19,0x91,0x9f,0x49,0xf8,0x42,0xab,0x40,0xef,0x8a,0x21,0xba,0x1f}, - {0x3e,0xf5,0xc8,0xfa,0x48,0x94,0x54,0xab,0x41,0x37,0xa6,0x7b,0x9a,0xe8,0xf6,0x81,0x01,0x5e,0x2b,0x6c,0x7d,0x6c,0xfd,0x74,0x42,0x6e,0xc8,0xa8,0xca,0x3a,0x2e,0x39,0x94,0x01,0x7b,0x3e,0x04,0x57,0x3e,0x4f,0x7f,0xaf,0xda,0x08,0xee,0x3e,0x1d,0xa8,0xf1,0xde,0xdc,0x99,0xab,0xc6,0x39,0xc8,0xd5,0x61,0x77,0xff,0x13,0x5d,0x53,0x6c,0xaf,0x35,0x8a,0x3e,0xe9,0x34,0xbd,0x4c,0x16,0xe8,0x87,0x58,0x44,0x81,0x07,0x2e,0xab,0xb0,0x9a,0xf2,0x76,0x9c,0x31,0x19,0x3b,0xc1,0x0a,0xd5,0xe4,0x7f,0xe1,0x25}, - {0x76,0xf6,0x04,0x1e,0xd7,0x9b,0x28,0x0a,0x95,0x0f,0x42,0xd6,0x52,0x1c,0x8e,0x20,0xab,0x1f,0x69,0x34,0xb0,0xd8,0x86,0x51,0x51,0xb3,0x9f,0x2a,0x44,0x51,0x57,0x25,0xa7,0x21,0xf1,0x76,0xf5,0x7f,0x5f,0x91,0xe3,0x87,0xcd,0x2f,0x27,0x32,0x4a,0xc3,0x26,0xe5,0x1b,0x4d,0xde,0x2f,0xba,0xcc,0x9b,0x89,0x69,0x89,0x8f,0x82,0xba,0x6b,0x01,0x39,0xfe,0x90,0x66,0xbc,0xd1,0xe2,0xd5,0x7a,0x99,0xa0,0x18,0x4a,0xb5,0x4c,0xd4,0x60,0x84,0xaf,0x14,0x69,0x1d,0x97,0xe4,0x7b,0x6b,0x7f,0x4f,0x50,0x9d,0x55}, - {0xd5,0x54,0xeb,0xb3,0x78,0x83,0x73,0xa7,0x7c,0x3c,0x55,0xa5,0x66,0xd3,0x69,0x1d,0xba,0x00,0x28,0xf9,0x62,0xcf,0x26,0x0a,0x17,0x32,0x7e,0x80,0xd5,0x12,0xab,0x01,0xfd,0x66,0xd2,0xf6,0xe7,0x91,0x48,0x9c,0x1b,0x78,0x07,0x03,0x9b,0xa1,0x44,0x07,0x3b,0xe2,0x61,0x60,0x1d,0x8f,0x38,0x88,0x0e,0xd5,0x4b,0x35,0xa3,0xa6,0x3e,0x12,0x96,0x2d,0xe3,0x41,0x90,0x18,0x8d,0x11,0x48,0x58,0x31,0xd8,0xc2,0xe3,0xed,0xb9,0xd9,0x45,0x32,0xd8,0x71,0x42,0xab,0x1e,0x54,0xa1,0x18,0xc9,0xe2,0x61,0x39,0x4a}, - {0xa0,0xbb,0xe6,0xf8,0xe0,0x3b,0xdc,0x71,0x0a,0xe3,0xff,0x7e,0x34,0xf8,0xce,0xd6,0x6a,0x47,0x3a,0xe1,0x5f,0x42,0x92,0xa9,0x63,0xb7,0x1d,0xfb,0xe3,0xbc,0xd6,0x2c,0x1e,0x3f,0x23,0xf3,0x44,0xd6,0x27,0x03,0x16,0xf0,0xfc,0x34,0x0e,0x26,0x9a,0x49,0x79,0xb9,0xda,0xf2,0x16,0xa7,0xb5,0x83,0x1f,0x11,0xd4,0x9b,0xad,0xee,0xac,0x68,0x10,0xc2,0xd7,0xf3,0x0e,0xc9,0xb4,0x38,0x0c,0x04,0xad,0xb7,0x24,0x6e,0x8e,0x30,0x23,0x3e,0xe7,0xb7,0xf1,0xd9,0x60,0x38,0x97,0xf5,0x08,0xb5,0xd5,0x60,0x57,0x59}, - {0x97,0x63,0xaa,0x04,0xe1,0xbf,0x29,0x61,0xcb,0xfc,0xa7,0xa4,0x08,0x00,0x96,0x8f,0x58,0x94,0x90,0x7d,0x89,0xc0,0x8b,0x3f,0xa9,0x91,0xb2,0xdc,0x3e,0xa4,0x9f,0x70,0x90,0x27,0x02,0xfd,0xeb,0xcb,0x2a,0x88,0x60,0x57,0x11,0xc4,0x05,0x33,0xaf,0x89,0xf4,0x73,0x34,0x7d,0xe3,0x92,0xf4,0x65,0x2b,0x5a,0x51,0x54,0xdf,0xc5,0xb2,0x2c,0xca,0x2a,0xfd,0x63,0x8c,0x5d,0x0a,0xeb,0xff,0x4e,0x69,0x2e,0x66,0xc1,0x2b,0xd2,0x3a,0xb0,0xcb,0xf8,0x6e,0xf3,0x23,0x27,0x1f,0x13,0xc8,0xf0,0xec,0x29,0xf0,0x70}, - {0x33,0x3e,0xed,0x2e,0xb3,0x07,0x13,0x46,0xe7,0x81,0x55,0xa4,0x33,0x2f,0x04,0xae,0x66,0x03,0x5f,0x19,0xd3,0x49,0x44,0xc9,0x58,0x48,0x31,0x6c,0x8a,0x5d,0x7d,0x0b,0xb9,0xb0,0x10,0x5e,0xaa,0xaf,0x6a,0x2a,0xa9,0x1a,0x04,0xef,0x70,0xa3,0xf0,0x78,0x1f,0xd6,0x3a,0xaa,0x77,0xfb,0x3e,0x77,0xe1,0xd9,0x4b,0xa7,0xa2,0xa5,0xec,0x44,0x43,0xd5,0x95,0x7b,0x32,0x48,0xd4,0x25,0x1d,0x0f,0x34,0xa3,0x00,0x83,0xd3,0x70,0x2b,0xc5,0xe1,0x60,0x1c,0x53,0x1c,0xde,0xe4,0xe9,0x7d,0x2c,0x51,0x24,0x22,0x27}, - {0x2e,0x34,0xc5,0x49,0xaf,0x92,0xbc,0x1a,0xd0,0xfa,0xe6,0xb2,0x11,0xd8,0xee,0xff,0x29,0x4e,0xc8,0xfc,0x8d,0x8c,0xa2,0xef,0x43,0xc5,0x4c,0xa4,0x18,0xdf,0xb5,0x11,0xfc,0x75,0xa9,0x42,0x8a,0xbb,0x7b,0xbf,0x58,0xa3,0xad,0x96,0x77,0x39,0x5c,0x8c,0x48,0xaa,0xed,0xcd,0x6f,0xc7,0x7f,0xe2,0xa6,0x20,0xbc,0xf6,0xd7,0x5f,0x73,0x19,0x66,0x42,0xc8,0x42,0xd0,0x90,0xab,0xe3,0x7e,0x54,0x19,0x7f,0x0f,0x8e,0x84,0xeb,0xb9,0x97,0xa4,0x65,0xd0,0xa1,0x03,0x25,0x5f,0x89,0xdf,0x91,0x11,0x91,0xef,0x0f} -}; diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-batchverify.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-batchverify.h deleted file mode 100644 index 7c64cce78..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-batchverify.h +++ /dev/null @@ -1,275 +0,0 @@ -/* - Ed25519 batch verification -*/ - -#define max_batch_size 64 -#define heap_batch_size ((max_batch_size * 2) + 1) - -/* which limb is the 128th bit in? */ -static const size_t limb128bits = (128 + bignum256modm_bits_per_limb - 1) / bignum256modm_bits_per_limb; - -typedef size_t heap_index_t; - -typedef struct batch_heap_t { - unsigned char r[heap_batch_size][16]; /* 128 bit random values */ - ge25519 points[heap_batch_size]; - bignum256modm scalars[heap_batch_size]; - heap_index_t heap[heap_batch_size]; - size_t size; -} batch_heap; - -/* swap two values in the heap */ -static void -heap_swap(heap_index_t *heap, size_t a, size_t b) { - heap_index_t temp; - temp = heap[a]; - heap[a] = heap[b]; - heap[b] = temp; -} - -/* add the scalar at the end of the list to the heap */ -static void -heap_insert_next(batch_heap *heap) { - size_t node = heap->size, parent; - heap_index_t *pheap = heap->heap; - bignum256modm *scalars = heap->scalars; - - /* insert at the bottom */ - pheap[node] = (heap_index_t)node; - - /* sift node up to its sorted spot */ - parent = (node - 1) / 2; - while (node && lt256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], bignum256modm_limb_size - 1)) { - heap_swap(pheap, parent, node); - node = parent; - parent = (node - 1) / 2; - } - heap->size++; -} - -/* update the heap when the root element is updated */ -static void -heap_updated_root(batch_heap *heap, size_t limbsize) { - size_t node, parent, childr, childl; - heap_index_t *pheap = heap->heap; - bignum256modm *scalars = heap->scalars; - - /* sift root to the bottom */ - parent = 0; - node = 1; - childl = 1; - childr = 2; - while ((childr < heap->size)) { - node = lt256_modm_batch(scalars[pheap[childl]], scalars[pheap[childr]], limbsize) ? childr : childl; - heap_swap(pheap, parent, node); - parent = node; - childl = (parent * 2) + 1; - childr = childl + 1; - } - - /* sift root back up to its sorted spot */ - parent = (node - 1) / 2; - while (node && lte256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], limbsize)) { - heap_swap(pheap, parent, node); - node = parent; - parent = (node - 1) / 2; - } -} - -/* build the heap with count elements, count must be >= 3 */ -static void -heap_build(batch_heap *heap, size_t count) { - heap->heap[0] = 0; - heap->size = 0; - while (heap->size < count) - heap_insert_next(heap); -} - -/* extend the heap to contain new_count elements */ -static void -heap_extend(batch_heap *heap, size_t new_count) { - while (heap->size < new_count) - heap_insert_next(heap); -} - -/* get the top 2 elements of the heap */ -static void -heap_get_top2(batch_heap *heap, heap_index_t *max1, heap_index_t *max2, size_t limbsize) { - heap_index_t h0 = heap->heap[0], h1 = heap->heap[1], h2 = heap->heap[2]; - if (lt256_modm_batch(heap->scalars[h1], heap->scalars[h2], limbsize)) - h1 = h2; - *max1 = h0; - *max2 = h1; -} - -/* */ -static void -ge25519_multi_scalarmult_vartime_final(ge25519 *r, ge25519 *point, bignum256modm scalar) { - const bignum256modm_element_t topbit = ((bignum256modm_element_t)1 << (bignum256modm_bits_per_limb - 1)); - size_t limb = limb128bits; - bignum256modm_element_t flag; - - if (isone256_modm_batch(scalar)) { - /* this will happen most of the time after bos-carter */ - *r = *point; - return; - } else if (iszero256_modm_batch(scalar)) { - /* this will only happen if all scalars == 0 */ - memset(r, 0, sizeof(*r)); - r->y[0] = 1; - r->z[0] = 1; - return; - } - - *r = *point; - - /* find the limb where first bit is set */ - while (!scalar[limb]) - limb--; - - /* find the first bit */ - flag = topbit; - while ((scalar[limb] & flag) == 0) - flag >>= 1; - - /* exponentiate */ - for (;;) { - ge25519_double(r, r); - if (scalar[limb] & flag) - ge25519_add(r, r, point); - - flag >>= 1; - if (!flag) { - if (!limb--) - break; - flag = topbit; - } - } -} - -/* count must be >= 5 */ -static void -ge25519_multi_scalarmult_vartime(ge25519 *r, batch_heap *heap, size_t count) { - heap_index_t max1, max2; - - /* start with the full limb size */ - size_t limbsize = bignum256modm_limb_size - 1; - - /* whether the heap has been extended to include the 128 bit scalars */ - int extended = 0; - - /* grab an odd number of scalars to build the heap, unknown limb sizes */ - heap_build(heap, ((count + 1) / 2) | 1); - - for (;;) { - heap_get_top2(heap, &max1, &max2, limbsize); - - /* only one scalar remaining, we're done */ - if (iszero256_modm_batch(heap->scalars[max2])) - break; - - /* exhausted another limb? */ - if (!heap->scalars[max1][limbsize]) - limbsize -= 1; - - /* can we extend to the 128 bit scalars? */ - if (!extended && isatmost128bits256_modm_batch(heap->scalars[max1])) { - heap_extend(heap, count); - heap_get_top2(heap, &max1, &max2, limbsize); - extended = 1; - } - - sub256_modm_batch(heap->scalars[max1], heap->scalars[max1], heap->scalars[max2], limbsize); - ge25519_add(&heap->points[max2], &heap->points[max2], &heap->points[max1]); - heap_updated_root(heap, limbsize); - } - - ge25519_multi_scalarmult_vartime_final(r, &heap->points[max1], heap->scalars[max1]); -} - -/* not actually used for anything other than testing */ -static unsigned char batch_point_buffer[3][32]; - -static int -ge25519_is_neutral_vartime(const ge25519 *p) { - static const unsigned char zero[32] = {0}; - unsigned char point_buffer[3][32]; - curve25519_contract(point_buffer[0], p->x); - curve25519_contract(point_buffer[1], p->y); - curve25519_contract(point_buffer[2], p->z); - memcpy(batch_point_buffer[1], point_buffer[1], 32); - return (memcmp(point_buffer[0], zero, 32) == 0) && (memcmp(point_buffer[1], point_buffer[2], 32) == 0); -} - -int -ED25519_FN(ed25519_sign_open_batch) (const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid) { - batch_heap ALIGN(16) batch; - ge25519 ALIGN(16) p; - bignum256modm *r_scalars; - size_t i, batchsize; - unsigned char hram[64]; - int ret = 0; - - for (i = 0; i < num; i++) - valid[i] = 1; - - while (num > 3) { - batchsize = (num > max_batch_size) ? max_batch_size : num; - - /* generate r (scalars[batchsize+1]..scalars[2*batchsize] */ - ED25519_FN(ed25519_randombytes_unsafe) (batch.r, batchsize * 16); - r_scalars = &batch.scalars[batchsize + 1]; - for (i = 0; i < batchsize; i++) - expand256_modm(r_scalars[i], batch.r[i], 16); - - /* compute scalars[0] = ((r1s1 + r2s2 + ...)) */ - for (i = 0; i < batchsize; i++) { - expand256_modm(batch.scalars[i], RS[i] + 32, 32); - mul256_modm(batch.scalars[i], batch.scalars[i], r_scalars[i]); - } - for (i = 1; i < batchsize; i++) - add256_modm(batch.scalars[0], batch.scalars[0], batch.scalars[i]); - - /* compute scalars[1]..scalars[batchsize] as r[i]*H(R[i],A[i],m[i]) */ - for (i = 0; i < batchsize; i++) { - ed25519_hram(hram, RS[i], pk[i], m[i], mlen[i]); - expand256_modm(batch.scalars[i+1], hram, 64); - mul256_modm(batch.scalars[i+1], batch.scalars[i+1], r_scalars[i]); - } - - /* compute points */ - batch.points[0] = ge25519_basepoint; - for (i = 0; i < batchsize; i++) - if (!ge25519_unpack_negative_vartime(&batch.points[i+1], pk[i])) - goto fallback; - for (i = 0; i < batchsize; i++) - if (!ge25519_unpack_negative_vartime(&batch.points[batchsize+i+1], RS[i])) - goto fallback; - - ge25519_multi_scalarmult_vartime(&p, &batch, (batchsize * 2) + 1); - if (!ge25519_is_neutral_vartime(&p)) { - ret |= 2; - - fallback: - for (i = 0; i < batchsize; i++) { - valid[i] = ED25519_FN(ed25519_sign_open) (m[i], mlen[i], pk[i], RS[i]) ? 0 : 1; - ret |= (valid[i] ^ 1); - } - } - - m += batchsize; - mlen += batchsize; - pk += batchsize; - RS += batchsize; - num -= batchsize; - valid += batchsize; - } - - for (i = 0; i < num; i++) { - valid[i] = ED25519_FN(ed25519_sign_open) (m[i], mlen[i], pk[i], RS[i]) ? 0 : 1; - ret |= (valid[i] ^ 1); - } - - return ret; -} - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-base.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-base.h deleted file mode 100644 index 48913edcb..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-base.h +++ /dev/null @@ -1,364 +0,0 @@ -/* - conversions -*/ - -DONNA_INLINE static void -ge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) { - curve25519_mul(r->x, p->x, p->t); - curve25519_mul(r->y, p->y, p->z); - curve25519_mul(r->z, p->z, p->t); -} - -DONNA_INLINE static void -ge25519_p1p1_to_full(ge25519 *r, const ge25519_p1p1 *p) { - curve25519_mul(r->x, p->x, p->t); - curve25519_mul(r->y, p->y, p->z); - curve25519_mul(r->z, p->z, p->t); - curve25519_mul(r->t, p->x, p->y); -} - -static void -ge25519_full_to_pniels(ge25519_pniels *p, const ge25519 *r) { - curve25519_sub(p->ysubx, r->y, r->x); - curve25519_add(p->xaddy, r->y, r->x); - curve25519_copy(p->z, r->z); - curve25519_mul(p->t2d, r->t, ge25519_ec2d); -} - -/* - adding & doubling -*/ - -static void -ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519 *q) { - bignum25519 a,b,c,d,t,u; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_sub(t, q->y, q->x); - curve25519_add(u, q->y, q->x); - curve25519_mul(a, a, t); - curve25519_mul(b, b, u); - curve25519_mul(c, p->t, q->t); - curve25519_mul(c, c, ge25519_ec2d); - curve25519_mul(d, p->z, q->z); - curve25519_add(d, d, d); - curve25519_sub(r->x, b, a); - curve25519_add(r->y, b, a); - curve25519_add_after_basic(r->z, d, c); - curve25519_sub_after_basic(r->t, d, c); -} - - -static void -ge25519_double_p1p1(ge25519_p1p1 *r, const ge25519 *p) { - bignum25519 a,b,c; - - curve25519_square(a, p->x); - curve25519_square(b, p->y); - curve25519_square(c, p->z); - curve25519_add_reduce(c, c, c); - curve25519_add(r->x, p->x, p->y); - curve25519_square(r->x, r->x); - curve25519_add(r->y, b, a); - curve25519_sub(r->z, b, a); - curve25519_sub_after_basic(r->x, r->x, r->y); - curve25519_sub_after_basic(r->t, c, r->z); -} - -static void -ge25519_nielsadd2_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_niels *q, unsigned char signbit) { - const bignum25519 *qb = (const bignum25519 *)q; - bignum25519 *rb = (bignum25519 *)r; - bignum25519 a,b,c; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_mul(a, a, qb[signbit]); /* x for +, y for - */ - curve25519_mul(r->x, b, qb[signbit^1]); /* y for +, x for - */ - curve25519_add(r->y, r->x, a); - curve25519_sub(r->x, r->x, a); - curve25519_mul(c, p->t, q->t2d); - curve25519_add_reduce(r->t, p->z, p->z); - curve25519_copy(r->z, r->t); - curve25519_add(rb[2+signbit], rb[2+signbit], c); /* z for +, t for - */ - curve25519_sub(rb[2+(signbit^1)], rb[2+(signbit^1)], c); /* t for +, z for - */ -} - -static void -ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_pniels *q, unsigned char signbit) { - const bignum25519 *qb = (const bignum25519 *)q; - bignum25519 *rb = (bignum25519 *)r; - bignum25519 a,b,c; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_mul(a, a, qb[signbit]); /* ysubx for +, xaddy for - */ - curve25519_mul(r->x, b, qb[signbit^1]); /* xaddy for +, ysubx for - */ - curve25519_add(r->y, r->x, a); - curve25519_sub(r->x, r->x, a); - curve25519_mul(c, p->t, q->t2d); - curve25519_mul(r->t, p->z, q->z); - curve25519_add_reduce(r->t, r->t, r->t); - curve25519_copy(r->z, r->t); - curve25519_add(rb[2+signbit], rb[2+signbit], c); /* z for +, t for - */ - curve25519_sub(rb[2+(signbit^1)], rb[2+(signbit^1)], c); /* t for +, z for - */ -} - -static void -ge25519_double_partial(ge25519 *r, const ge25519 *p) { - ge25519_p1p1 t; - ge25519_double_p1p1(&t, p); - ge25519_p1p1_to_partial(r, &t); -} - -static void -ge25519_double(ge25519 *r, const ge25519 *p) { - ge25519_p1p1 t; - ge25519_double_p1p1(&t, p); - ge25519_p1p1_to_full(r, &t); -} - -static void -ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q) { - ge25519_p1p1 t; - ge25519_add_p1p1(&t, p, q); - ge25519_p1p1_to_full(r, &t); -} - -static void -ge25519_nielsadd2(ge25519 *r, const ge25519_niels *q) { - bignum25519 a,b,c,e,f,g,h; - - curve25519_sub(a, r->y, r->x); - curve25519_add(b, r->y, r->x); - curve25519_mul(a, a, q->ysubx); - curve25519_mul(e, b, q->xaddy); - curve25519_add(h, e, a); - curve25519_sub(e, e, a); - curve25519_mul(c, r->t, q->t2d); - curve25519_add(f, r->z, r->z); - curve25519_add_after_basic(g, f, c); - curve25519_sub_after_basic(f, f, c); - curve25519_mul(r->x, e, f); - curve25519_mul(r->y, h, g); - curve25519_mul(r->z, g, f); - curve25519_mul(r->t, e, h); -} - -static void -ge25519_pnielsadd(ge25519_pniels *r, const ge25519 *p, const ge25519_pniels *q) { - bignum25519 a,b,c,x,y,z,t; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_mul(a, a, q->ysubx); - curve25519_mul(x, b, q->xaddy); - curve25519_add(y, x, a); - curve25519_sub(x, x, a); - curve25519_mul(c, p->t, q->t2d); - curve25519_mul(t, p->z, q->z); - curve25519_add(t, t, t); - curve25519_add_after_basic(z, t, c); - curve25519_sub_after_basic(t, t, c); - curve25519_mul(r->xaddy, x, t); - curve25519_mul(r->ysubx, y, z); - curve25519_mul(r->z, z, t); - curve25519_mul(r->t2d, x, y); - curve25519_copy(y, r->ysubx); - curve25519_sub(r->ysubx, r->ysubx, r->xaddy); - curve25519_add(r->xaddy, r->xaddy, y); - curve25519_mul(r->t2d, r->t2d, ge25519_ec2d); -} - - -/* - pack & unpack -*/ - -static void -ge25519_pack(unsigned char r[32], const ge25519 *p) { - bignum25519 tx, ty, zi; - unsigned char parity[32]; - curve25519_recip(zi, p->z); - curve25519_mul(tx, p->x, zi); - curve25519_mul(ty, p->y, zi); - curve25519_contract(r, ty); - curve25519_contract(parity, tx); - r[31] ^= ((parity[0] & 1) << 7); -} - -static int -ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { - static const unsigned char zero[32] = {0}; - static const bignum25519 one = {1}; - unsigned char parity = p[31] >> 7; - unsigned char check[32]; - bignum25519 t, root, num, den, d3; - - curve25519_expand(r->y, p); - curve25519_copy(r->z, one); - curve25519_square(num, r->y); /* x = y^2 */ - curve25519_mul(den, num, ge25519_ecd); /* den = dy^2 */ - curve25519_sub_reduce(num, num, r->z); /* x = y^1 - 1 */ - curve25519_add(den, den, r->z); /* den = dy^2 + 1 */ - - /* Computation of sqrt(num/den) */ - /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */ - curve25519_square(t, den); - curve25519_mul(d3, t, den); - curve25519_square(r->x, d3); - curve25519_mul(r->x, r->x, den); - curve25519_mul(r->x, r->x, num); - curve25519_pow_two252m3(r->x, r->x); - - /* 2. computation of r->x = num * den^3 * (num*den^7)^((p-5)/8) */ - curve25519_mul(r->x, r->x, d3); - curve25519_mul(r->x, r->x, num); - - /* 3. Check if either of the roots works: */ - curve25519_square(t, r->x); - curve25519_mul(t, t, den); - curve25519_sub_reduce(root, t, num); - curve25519_contract(check, root); - if (!ed25519_verify(check, zero, 32)) { - curve25519_add_reduce(t, t, num); - curve25519_contract(check, t); - if (!ed25519_verify(check, zero, 32)) - return 0; - curve25519_mul(r->x, r->x, ge25519_sqrtneg1); - } - - curve25519_contract(check, r->x); - if ((check[0] & 1) == parity) { - curve25519_copy(t, r->x); - curve25519_neg(r->x, t); - } - curve25519_mul(r->t, r->x, r->y); - return 1; -} - - -/* - scalarmults -*/ - -#define S1_SWINDOWSIZE 5 -#define S1_TABLE_SIZE (1<<(S1_SWINDOWSIZE-2)) -#define S2_SWINDOWSIZE 7 -#define S2_TABLE_SIZE (1<<(S2_SWINDOWSIZE-2)) - -/* computes [s1]p1 + [s2]basepoint */ -static void -ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const bignum256modm s1, const bignum256modm s2) { - signed char slide1[256], slide2[256]; - ge25519_pniels pre1[S1_TABLE_SIZE]; - ge25519 d1; - ge25519_p1p1 t; - int32_t i; - - contract256_slidingwindow_modm(slide1, s1, S1_SWINDOWSIZE); - contract256_slidingwindow_modm(slide2, s2, S2_SWINDOWSIZE); - - ge25519_double(&d1, p1); - ge25519_full_to_pniels(pre1, p1); - for (i = 0; i < S1_TABLE_SIZE - 1; i++) - ge25519_pnielsadd(&pre1[i+1], &d1, &pre1[i]); - - /* set neutral */ - memset(r, 0, sizeof(ge25519)); - r->y[0] = 1; - r->z[0] = 1; - - i = 255; - while ((i >= 0) && !(slide1[i] | slide2[i])) - i--; - - for (; i >= 0; i--) { - ge25519_double_p1p1(&t, r); - - if (slide1[i]) { - ge25519_p1p1_to_full(r, &t); - ge25519_pnielsadd_p1p1(&t, r, &pre1[abs(slide1[i]) / 2], (unsigned char)slide1[i] >> 7); - } - - if (slide2[i]) { - ge25519_p1p1_to_full(r, &t); - ge25519_nielsadd2_p1p1(&t, r, &ge25519_niels_sliding_multiples[abs(slide2[i]) / 2], (unsigned char)slide2[i] >> 7); - } - - ge25519_p1p1_to_partial(r, &t); - } -} - - - -#if !defined(HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS) - -static uint32_t -ge25519_windowb_equal(uint32_t b, uint32_t c) { - return ((b ^ c) - 1) >> 31; -} - -static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - bignum25519 neg; - uint32_t sign = (uint32_t)((unsigned char)b >> 7); - uint32_t mask = ~(sign - 1); - uint32_t u = (b + mask) ^ mask; - uint32_t i; - - /* ysubx, xaddy, t2d in packed form. initialize to ysubx = 1, xaddy = 1, t2d = 0 */ - uint8_t packed[96] = {0}; - packed[0] = 1; - packed[32] = 1; - - for (i = 0; i < 8; i++) - curve25519_move_conditional_bytes(packed, table[(pos * 8) + i], ge25519_windowb_equal(u, i + 1)); - - /* expand in to t */ - curve25519_expand(t->ysubx, packed + 0); - curve25519_expand(t->xaddy, packed + 32); - curve25519_expand(t->t2d , packed + 64); - - /* adjust for sign */ - curve25519_swap_conditional(t->ysubx, t->xaddy, sign); - curve25519_neg(neg, t->t2d); - curve25519_swap_conditional(t->t2d, neg, sign); -} - -#endif /* HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS */ - - -/* computes [s]basepoint */ -static void -ge25519_scalarmult_base_niels(ge25519 *r, const uint8_t basepoint_table[256][96], const bignum256modm s) { - signed char b[64]; - uint32_t i; - ge25519_niels t; - - contract256_window4_modm(b, s); - - ge25519_scalarmult_base_choose_niels(&t, basepoint_table, 0, b[1]); - curve25519_sub_reduce(r->x, t.xaddy, t.ysubx); - curve25519_add_reduce(r->y, t.xaddy, t.ysubx); - memset(r->z, 0, sizeof(bignum25519)); - curve25519_copy(r->t, t.t2d); - r->z[0] = 2; - for (i = 3; i < 64; i += 2) { - ge25519_scalarmult_base_choose_niels(&t, basepoint_table, i / 2, b[i]); - ge25519_nielsadd2(r, &t); - } - ge25519_double_partial(r, r); - ge25519_double_partial(r, r); - ge25519_double_partial(r, r); - ge25519_double(r, r); - ge25519_scalarmult_base_choose_niels(&t, basepoint_table, 0, b[0]); - curve25519_mul(t.t2d, t.t2d, ge25519_ecd); - ge25519_nielsadd2(r, &t); - for(i = 2; i < 64; i += 2) { - ge25519_scalarmult_base_choose_niels(&t, basepoint_table, i / 2, b[i]); - ge25519_nielsadd2(r, &t); - } -} - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h deleted file mode 100644 index 5fe341638..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-impl-sse2.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - conversions -*/ - -static void -ge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) { - packed64bignum25519 ALIGN(16) xz, tt, xzout; - curve25519_mul(r->y, p->y, p->z); - curve25519_tangle64(xz, p->x, p->z); - curve25519_tangleone64(tt, p->t); - curve25519_mul_packed64(xzout, xz, tt); - curve25519_untangle64(r->x, r->z, xzout); -} - -static void -ge25519_p1p1_to_full(ge25519 *r, const ge25519_p1p1 *p) { - packed64bignum25519 ALIGN(16) zy, xt, xx, zz, ty; - curve25519_tangle64(ty, p->t, p->y); - curve25519_tangleone64(xx, p->x); - curve25519_mul_packed64(xt, xx, ty); - curve25519_untangle64(r->x, r->t, xt); - curve25519_tangleone64(zz, p->z); - curve25519_mul_packed64(zy, zz, ty); - curve25519_untangle64(r->z, r->y, zy); -} - -static void -ge25519_full_to_pniels(ge25519_pniels *p, const ge25519 *r) { - curve25519_sub(p->ysubx, r->y, r->x); - curve25519_add(p->xaddy, r->x, r->y); - curve25519_copy(p->z, r->z); - curve25519_mul(p->t2d, r->t, ge25519_ec2d); -} - -/* - adding & doubling -*/ - -static void -ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519 *q) { - bignum25519 ALIGN(16) a,b,c,d; - packed32bignum25519 ALIGN(16) xx, yy, yypxx, yymxx, bd, ac, bdmac, bdpac; - packed64bignum25519 ALIGN(16) at, bu, atbu, ptz, qtz, cd; - - curve25519_tangle32(yy, p->y, q->y); - curve25519_tangle32(xx, p->x, q->x); - curve25519_add_packed32(yypxx, yy, xx); - curve25519_sub_packed32(yymxx, yy, xx); - curve25519_tangle64_from32(at, bu, yymxx, yypxx); - curve25519_mul_packed64(atbu, at, bu); - curve25519_untangle64(a, b, atbu); - curve25519_tangle64(ptz, p->t, p->z); - curve25519_tangle64(qtz, q->t, q->z); - curve25519_mul_packed64(cd, ptz, qtz); - curve25519_untangle64(c, d, cd); - curve25519_mul(c, c, ge25519_ec2d); - curve25519_add_reduce(d, d, d); - /* reduce, so no after_basic is needed later */ - curve25519_tangle32(bd, b, d); - curve25519_tangle32(ac, a, c); - curve25519_sub_packed32(bdmac, bd, ac); - curve25519_add_packed32(bdpac, bd, ac); - curve25519_untangle32(r->x, r->t, bdmac); - curve25519_untangle32(r->y, r->z, bdpac); -} - - -static void -ge25519_double_p1p1(ge25519_p1p1 *r, const ge25519 *p) { - bignum25519 ALIGN(16) a,b,c,x; - packed64bignum25519 ALIGN(16) xy, zx, ab, cx; - packed32bignum25519 ALIGN(16) xc, yz, xt, yc, ac, bc; - - curve25519_add(x, p->x, p->y); - curve25519_tangle64(xy, p->x, p->y); - curve25519_square_packed64(ab, xy); - curve25519_untangle64(a, b, ab); - curve25519_tangle64(zx, p->z, x); - curve25519_square_packed64(cx, zx); - curve25519_untangle64(c, x, cx); - curve25519_tangle32(bc, b, c); - curve25519_tangle32(ac, a, c); - curve25519_add_reduce_packed32(yc, bc, ac); - curve25519_untangle32(r->y, c, yc); - curve25519_sub(r->z, b, a); - curve25519_tangle32(yz, r->y, r->z); - curve25519_tangle32(xc, x, c); - curve25519_sub_after_basic_packed32(xt, xc, yz); - curve25519_untangle32(r->x, r->t, xt); -} - -static void -ge25519_nielsadd2_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_niels *q, unsigned char signbit) { - const bignum25519 *qb = (const bignum25519 *)q; - bignum25519 *rb = (bignum25519 *)r; - bignum25519 ALIGN(16) a,b,c; - packed64bignum25519 ALIGN(16) ab, yx, aybx; - packed32bignum25519 ALIGN(16) bd, ac, bdac; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_tangle64(ab, a, b); - curve25519_tangle64(yx, qb[signbit], qb[signbit^1]); - curve25519_mul_packed64(aybx, ab, yx); - curve25519_untangle64(a, b, aybx); - curve25519_add(r->y, b, a); - curve25519_add_reduce(r->t, p->z, p->z); - curve25519_mul(c, p->t, q->t2d); - curve25519_copy(r->z, r->t); - curve25519_add(rb[2+signbit], rb[2+signbit], c); - curve25519_tangle32(bd, b, rb[2+(signbit^1)]); - curve25519_tangle32(ac, a, c); - curve25519_sub_packed32(bdac, bd, ac); - curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac); -} - -static void -ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_pniels *q, unsigned char signbit) { - const bignum25519 *qb = (const bignum25519 *)q; - bignum25519 *rb = (bignum25519 *)r; - bignum25519 ALIGN(16) a,b,c; - packed64bignum25519 ALIGN(16) ab, yx, aybx, zt, zt2d, tc; - packed32bignum25519 ALIGN(16) bd, ac, bdac; - - curve25519_sub(a, p->y, p->x); - curve25519_add(b, p->y, p->x); - curve25519_tangle64(ab, a, b); - curve25519_tangle64(yx, qb[signbit], qb[signbit^1]); - curve25519_mul_packed64(aybx, ab, yx); - curve25519_untangle64(a, b, aybx); - curve25519_add(r->y, b, a); - curve25519_tangle64(zt, p->z, p->t); - curve25519_tangle64(zt2d, q->z, q->t2d); - curve25519_mul_packed64(tc, zt, zt2d); - curve25519_untangle64(r->t, c, tc); - curve25519_add_reduce(r->t, r->t, r->t); - curve25519_copy(r->z, r->t); - curve25519_add(rb[2+signbit], rb[2+signbit], c); - curve25519_tangle32(bd, b, rb[2+(signbit^1)]); - curve25519_tangle32(ac, a, c); - curve25519_sub_packed32(bdac, bd, ac); - curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac); -} - -static void -ge25519_double(ge25519 *r, const ge25519 *p) { - ge25519_p1p1 ALIGN(16) t; - ge25519_double_p1p1(&t, p); - ge25519_p1p1_to_full(r, &t); -} - -static void -ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q) { - ge25519_p1p1 ALIGN(16) t; - ge25519_add_p1p1(&t, p, q); - ge25519_p1p1_to_full(r, &t); -} - -static void -ge25519_double_partial(ge25519 *r, const ge25519 *p) { - ge25519_p1p1 ALIGN(16) t; - ge25519_double_p1p1(&t, p); - ge25519_p1p1_to_partial(r, &t); -} - -static void -ge25519_nielsadd2(ge25519 *r, const ge25519_niels *q) { - packed64bignum25519 ALIGN(16) ab, yx, aybx, eg, ff, hh, xz, ty; - packed32bignum25519 ALIGN(16) bd, ac, bdac; - bignum25519 ALIGN(16) a,b,c,d,e,f,g,h; - - curve25519_sub(a, r->y, r->x); - curve25519_add(b, r->y, r->x); - curve25519_tangle64(ab, a, b); - curve25519_tangle64(yx, q->ysubx, q->xaddy); - curve25519_mul_packed64(aybx, ab, yx); - curve25519_untangle64(a, b, aybx); - curve25519_add(h, b, a); - curve25519_add_reduce(d, r->z, r->z); - curve25519_mul(c, r->t, q->t2d); - curve25519_add(g, d, c); /* d is reduced, so no need for after_basic */ - curve25519_tangle32(bd, b, d); - curve25519_tangle32(ac, a, c); - curve25519_sub_packed32(bdac, bd, ac); /* d is reduced, so no need for after_basic */ - curve25519_untangle32(e, f, bdac); - curve25519_tangle64(eg, e, g); - curve25519_tangleone64(ff, f); - curve25519_mul_packed64(xz, eg, ff); - curve25519_untangle64(r->x, r->z, xz); - curve25519_tangleone64(hh, h); - curve25519_mul_packed64(ty, eg, hh); - curve25519_untangle64(r->t, r->y, ty); -} - -static void -ge25519_pnielsadd(ge25519_pniels *r, const ge25519 *p, const ge25519_pniels *q) { - ge25519_p1p1 ALIGN(16) t; - ge25519 ALIGN(16) f; - ge25519_pnielsadd_p1p1(&t, p, q, 0); - ge25519_p1p1_to_full(&f, &t); - ge25519_full_to_pniels(r, &f); -} - -/* - pack & unpack -*/ - -static void -ge25519_pack(unsigned char r[32], const ge25519 *p) { - bignum25519 ALIGN(16) tx, ty, zi; - unsigned char parity[32]; - curve25519_recip(zi, p->z); - curve25519_mul(tx, p->x, zi); - curve25519_mul(ty, p->y, zi); - curve25519_contract(r, ty); - curve25519_contract(parity, tx); - r[31] ^= ((parity[0] & 1) << 7); -} - - -static int -ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { - static const bignum25519 ALIGN(16) one = {1}; - static const unsigned char zero[32] = {0}; - unsigned char parity = p[31] >> 7; - unsigned char check[32]; - bignum25519 ALIGN(16) t, root, num, den, d3; - - curve25519_expand(r->y, p); - curve25519_copy(r->z, one); - curve25519_square_times(num, r->y, 1); /* x = y^2 */ - curve25519_mul(den, num, ge25519_ecd); /* den = dy^2 */ - curve25519_sub_reduce(num, num, r->z); /* x = y^2 - 1 */ - curve25519_add(den, den, r->z); /* den = dy^2 + 1 */ - - /* Computation of sqrt(num/den) */ - /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */ - curve25519_square_times(t, den, 1); - curve25519_mul(d3, t, den); - curve25519_square_times(r->x, d3, 1); - curve25519_mul(r->x, r->x, den); - curve25519_mul(r->x, r->x, num); - curve25519_pow_two252m3(r->x, r->x); - - /* 2. computation of r->x = t * num * den^3 */ - curve25519_mul(r->x, r->x, d3); - curve25519_mul(r->x, r->x, num); - - /* 3. Check if either of the roots works: */ - curve25519_square_times(t, r->x, 1); - curve25519_mul(t, t, den); - curve25519_copy(root, t); - curve25519_sub_reduce(root, root, num); - curve25519_contract(check, root); - if (!ed25519_verify(check, zero, 32)) { - curve25519_add_reduce(t, t, num); - curve25519_contract(check, t); - if (!ed25519_verify(check, zero, 32)) - return 0; - curve25519_mul(r->x, r->x, ge25519_sqrtneg1); - } - - curve25519_contract(check, r->x); - if ((check[0] & 1) == parity) { - curve25519_copy(t, r->x); - curve25519_neg(r->x, t); - } - curve25519_mul(r->t, r->x, r->y); - return 1; -} - - - -/* - scalarmults -*/ - -#define S1_SWINDOWSIZE 5 -#define S1_TABLE_SIZE (1<<(S1_SWINDOWSIZE-2)) -#define S2_SWINDOWSIZE 7 -#define S2_TABLE_SIZE (1<<(S2_SWINDOWSIZE-2)) - -static void -ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const bignum256modm s1, const bignum256modm s2) { - signed char slide1[256], slide2[256]; - ge25519_pniels ALIGN(16) pre1[S1_TABLE_SIZE]; - ge25519 ALIGN(16) d1; - ge25519_p1p1 ALIGN(16) t; - int32_t i; - - contract256_slidingwindow_modm(slide1, s1, S1_SWINDOWSIZE); - contract256_slidingwindow_modm(slide2, s2, S2_SWINDOWSIZE); - - ge25519_double(&d1, p1); - ge25519_full_to_pniels(pre1, p1); - for (i = 0; i < S1_TABLE_SIZE - 1; i++) - ge25519_pnielsadd(&pre1[i+1], &d1, &pre1[i]); - - /* set neutral */ - memset(r, 0, sizeof(ge25519)); - r->y[0] = 1; - r->z[0] = 1; - - i = 255; - while ((i >= 0) && !(slide1[i] | slide2[i])) - i--; - - for (; i >= 0; i--) { - ge25519_double_p1p1(&t, r); - - if (slide1[i]) { - ge25519_p1p1_to_full(r, &t); - ge25519_pnielsadd_p1p1(&t, r, &pre1[abs(slide1[i]) / 2], (unsigned char)slide1[i] >> 7); - } - - if (slide2[i]) { - ge25519_p1p1_to_full(r, &t); - ge25519_nielsadd2_p1p1(&t, r, &ge25519_niels_sliding_multiples[abs(slide2[i]) / 2], (unsigned char)slide2[i] >> 7); - } - - ge25519_p1p1_to_partial(r, &t); - } -} - -#if !defined(HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS) - -static uint32_t -ge25519_windowb_equal(uint32_t b, uint32_t c) { - return ((b ^ c) - 1) >> 31; -} - -static void -ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) { - bignum25519 ALIGN(16) neg; - uint32_t sign = (uint32_t)((unsigned char)b >> 7); - uint32_t mask = ~(sign - 1); - uint32_t u = (b + mask) ^ mask; - uint32_t i; - - /* ysubx, xaddy, t2d in packed form. initialize to ysubx = 1, xaddy = 1, t2d = 0 */ - uint8_t ALIGN(16) packed[96] = {0}; - packed[0] = 1; - packed[32] = 1; - - for (i = 0; i < 8; i++) - curve25519_move_conditional_bytes(packed, table[(pos * 8) + i], ge25519_windowb_equal(u, i + 1)); - - /* expand in to t */ - curve25519_expand(t->ysubx, packed + 0); - curve25519_expand(t->xaddy, packed + 32); - curve25519_expand(t->t2d , packed + 64); - - /* adjust for sign */ - curve25519_swap_conditional(t->ysubx, t->xaddy, sign); - curve25519_neg(neg, t->t2d); - curve25519_swap_conditional(t->t2d, neg, sign); -} - -#endif /* HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS */ - -static void -ge25519_scalarmult_base_niels(ge25519 *r, const uint8_t table[256][96], const bignum256modm s) { - signed char b[64]; - uint32_t i; - ge25519_niels ALIGN(16) t; - - contract256_window4_modm(b, s); - - ge25519_scalarmult_base_choose_niels(&t, table, 0, b[1]); - curve25519_sub_reduce(r->x, t.xaddy, t.ysubx); - curve25519_add_reduce(r->y, t.xaddy, t.ysubx); - memset(r->z, 0, sizeof(bignum25519)); - r->z[0] = 2; - curve25519_copy(r->t, t.t2d); - for (i = 3; i < 64; i += 2) { - ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]); - ge25519_nielsadd2(r, &t); - } - ge25519_double_partial(r, r); - ge25519_double_partial(r, r); - ge25519_double_partial(r, r); - ge25519_double(r, r); - ge25519_scalarmult_base_choose_niels(&t, table, 0, b[0]); - curve25519_mul(t.t2d, t.t2d, ge25519_ecd); - ge25519_nielsadd2(r, &t); - for(i = 2; i < 64; i += 2) { - ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]); - ge25519_nielsadd2(r, &t); - } -} diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-portable-identify.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-portable-identify.h deleted file mode 100644 index 26a264cf9..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-portable-identify.h +++ /dev/null @@ -1,103 +0,0 @@ -/* os */ -#if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__) - #define OS_WINDOWS -#elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__) - #define OS_SOLARIS -#else - #include /* need this to define BSD */ - #define OS_NIX - #if defined(__linux__) - #define OS_LINUX - #elif defined(BSD) - #define OS_BSD - #if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__)) - #define OS_OSX - #elif defined(macintosh) || defined(Macintosh) - #define OS_MAC - #elif defined(__OpenBSD__) - #define OS_OPENBSD - #endif - #endif -#endif - - -/* compiler */ -#if defined(_MSC_VER) - #define COMPILER_MSVC -#endif -#if defined(__ICC) - #define COMPILER_INTEL -#endif -#if defined(__GNUC__) - #if (__GNUC__ >= 3) - #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + (__GNUC_PATCHLEVEL__)) - #else - #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) ) - #endif -#endif -#if defined(__PATHCC__) - #define COMPILER_PATHCC -#endif -#if defined(__clang__) - #define COMPILER_CLANG ((__clang_major__ * 10000) + (__clang_minor__ * 100) + (__clang_patchlevel__)) -#endif - - - -/* cpu */ -#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64) - #define CPU_X86_64 -#elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500)) - #define CPU_X86 500 -#elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400)) - #define CPU_X86 400 -#elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__) - #define CPU_X86 300 -#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64) - #define CPU_IA64 -#endif - -#if defined(__sparc__) || defined(__sparc) || defined(__sparcv9) - #define CPU_SPARC - #if defined(__sparcv9) - #define CPU_SPARC64 - #endif -#endif - -#if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC) - #define CPU_PPC - #if defined(_ARCH_PWR7) - #define CPU_POWER7 - #elif defined(__64BIT__) - #define CPU_PPC64 - #else - #define CPU_PPC32 - #endif -#endif - -#if defined(__hppa__) || defined(__hppa) - #define CPU_HPPA -#endif - -#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) - #define CPU_ALPHA -#endif - -/* 64 bit cpu */ -#if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64)) - #define CPU_64BITS -#endif - -#if defined(COMPILER_MSVC) - typedef signed char int8_t; - typedef unsigned char uint8_t; - typedef signed short int16_t; - typedef unsigned short uint16_t; - typedef signed int int32_t; - typedef unsigned int uint32_t; - typedef signed __int64 int64_t; - typedef unsigned __int64 uint64_t; -#else - #include -#endif - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna-portable.h b/src/tor/src/ext/ed25519/donna/ed25519-donna-portable.h deleted file mode 100644 index 75a53a570..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna-portable.h +++ /dev/null @@ -1,174 +0,0 @@ -#include "ed25519-donna-portable-identify.h" - -#define mul32x32_64(a,b) (((uint64_t)(a))*(b)) - -/* platform */ -#if defined(COMPILER_MSVC) - #include - #if !defined(_DEBUG) - #undef mul32x32_64 - #define mul32x32_64(a,b) __emulu(a,b) - #endif - #undef inline - #define inline __forceinline - #define DONNA_INLINE __forceinline - #define DONNA_NOINLINE __declspec(noinline) - #define ALIGN(x) __declspec(align(x)) - #define ROTL32(a,b) _rotl(a,b) - #define ROTR32(a,b) _rotr(a,b) -#else - #include - #define DONNA_INLINE inline __attribute__((always_inline)) - #define DONNA_NOINLINE __attribute__((noinline)) - /* Tor: OSX pollutes the global namespace with an ALIGN macro. */ - #undef ALIGN - #define ALIGN(x) __attribute__((aligned(x))) - #define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b))) - #define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b))) -#endif - -/* uint128_t */ -#if defined(CPU_64BITS) && !defined(ED25519_FORCE_32BIT) - #if defined(COMPILER_CLANG) && (COMPILER_CLANG >= 30100) - #define HAVE_NATIVE_UINT128 - typedef unsigned __int128 uint128_t; - #elif defined(COMPILER_MSVC) - #define HAVE_UINT128 - typedef struct uint128_t { - uint64_t lo, hi; - } uint128_t; - #define mul64x64_128(out,a,b) out.lo = _umul128(a,b,&out.hi); - #define shr128_pair(out,hi,lo,shift) out = __shiftright128(lo, hi, shift); - #define shl128_pair(out,hi,lo,shift) out = __shiftleft128(lo, hi, shift); - #define shr128(out,in,shift) shr128_pair(out, in.hi, in.lo, shift) - #define shl128(out,in,shift) shl128_pair(out, in.hi, in.lo, shift) - #define add128(a,b) { uint64_t p = a.lo; a.lo += b.lo; a.hi += b.hi + (a.lo < p); } - #define add128_64(a,b) { uint64_t p = a.lo; a.lo += b; a.hi += (a.lo < p); } - #define lo128(a) (a.lo) - #define hi128(a) (a.hi) - #elif defined(COMPILER_GCC) && !defined(HAVE_NATIVE_UINT128) - #if defined(__SIZEOF_INT128__) - #define HAVE_NATIVE_UINT128 - typedef unsigned __int128 uint128_t; - #elif (COMPILER_GCC >= 40400) - #define HAVE_NATIVE_UINT128 - typedef unsigned uint128_t __attribute__((mode(TI))); - #elif defined(CPU_X86_64) - #define HAVE_UINT128 - typedef struct uint128_t { - uint64_t lo, hi; - } uint128_t; - #define mul64x64_128(out,a,b) __asm__ ("mulq %3" : "=a" (out.lo), "=d" (out.hi) : "a" (a), "rm" (b)); - #define shr128_pair(out,hi,lo,shift) __asm__ ("shrdq %2,%1,%0" : "+r" (lo) : "r" (hi), "J" (shift)); out = lo; - #define shl128_pair(out,hi,lo,shift) __asm__ ("shldq %2,%1,%0" : "+r" (hi) : "r" (lo), "J" (shift)); out = hi; - #define shr128(out,in,shift) shr128_pair(out,in.hi, in.lo, shift) - #define shl128(out,in,shift) shl128_pair(out,in.hi, in.lo, shift) - #define add128(a,b) __asm__ ("addq %4,%2; adcq %5,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b.lo), "rm" (b.hi) : "cc"); - #define add128_64(a,b) __asm__ ("addq %4,%2; adcq $0,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b) : "cc"); - #define lo128(a) (a.lo) - #define hi128(a) (a.hi) - #endif - #endif - - #if defined(HAVE_NATIVE_UINT128) - #define HAVE_UINT128 - #define mul64x64_128(out,a,b) out = (uint128_t)a * b; - #define shr128_pair(out,hi,lo,shift) out = (uint64_t)((((uint128_t)hi << 64) | lo) >> (shift)); - #define shl128_pair(out,hi,lo,shift) out = (uint64_t)(((((uint128_t)hi << 64) | lo) << (shift)) >> 64); - #define shr128(out,in,shift) out = (uint64_t)(in >> (shift)); - #define shl128(out,in,shift) out = (uint64_t)((in << shift) >> 64); - #define add128(a,b) a += b; - #define add128_64(a,b) a += (uint64_t)b; - #define lo128(a) ((uint64_t)a) - #define hi128(a) ((uint64_t)(a >> 64)) - #endif - - #if !defined(HAVE_UINT128) - #error Need a uint128_t implementation! - #endif -#endif - -/* endian */ -#if !defined(ED25519_OPENSSLRNG) -static inline void U32TO8_LE(unsigned char *p, const uint32_t v) { - p[0] = (unsigned char)(v ); - p[1] = (unsigned char)(v >> 8); - p[2] = (unsigned char)(v >> 16); - p[3] = (unsigned char)(v >> 24); -} -#endif - -#if !defined(HAVE_UINT128) -static inline uint32_t U8TO32_LE(const unsigned char *p) { - return - (((uint32_t)(p[0]) ) | - ((uint32_t)(p[1]) << 8) | - ((uint32_t)(p[2]) << 16) | - ((uint32_t)(p[3]) << 24)); -} -#else -static inline uint64_t U8TO64_LE(const unsigned char *p) { - return - (((uint64_t)(p[0]) ) | - ((uint64_t)(p[1]) << 8) | - ((uint64_t)(p[2]) << 16) | - ((uint64_t)(p[3]) << 24) | - ((uint64_t)(p[4]) << 32) | - ((uint64_t)(p[5]) << 40) | - ((uint64_t)(p[6]) << 48) | - ((uint64_t)(p[7]) << 56)); -} - -static inline void U64TO8_LE(unsigned char *p, const uint64_t v) { - p[0] = (unsigned char)(v ); - p[1] = (unsigned char)(v >> 8); - p[2] = (unsigned char)(v >> 16); - p[3] = (unsigned char)(v >> 24); - p[4] = (unsigned char)(v >> 32); - p[5] = (unsigned char)(v >> 40); - p[6] = (unsigned char)(v >> 48); - p[7] = (unsigned char)(v >> 56); -} -#endif - -/* Tor: Detect and disable inline assembly when clang's AddressSanitizer - * is present, due to compilation failing because it runs out of registers. - * - * The alternative is to annotate `ge25519_scalarmult_base_choose_niels` - * and selectively disable AddressSanitizer insturmentation, however doing - * things this way results in a "more sanitized" binary. - */ -#if defined(__has_feature) - #if __has_feature(address_sanitizer) - #define ED25519_NO_INLINE_ASM - #endif -#endif - -/* Tor: Force enable SSE2 on 32 bit x86 systems if the compile target - * architecture supports it. This is not done on x86-64 as the non-SSE2 - * code benchmarks better, at least on Haswell. - */ -#if defined(__SSE2__) && !defined(CPU_X86_64) - /* undef in case it's manually specified... */ - #undef ED25519_SSE2 - #define ED25519_SSE2 -#endif - -/* Tor: GCC's Stack Protector freaks out and produces variable length - * buffer warnings when alignment is requested that is greater than - * STACK_BOUNDARY (x86 has special code to deal with this for SSE2). - * - * Since the only reason things are 16 byte aligned in the first place - * is for SSE2, only request variable alignment for SSE2 builds. - * - * See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59674 - */ -#if !defined(ED25519_SSE2) - #undef ALIGN - #define ALIGN(x) -#endif - -#include -#include - - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-donna.h b/src/tor/src/ext/ed25519/donna/ed25519-donna.h deleted file mode 100644 index 299c8d90f..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-donna.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - Public domain by Andrew M. - Modified from the amd64-51-30k implementation by - Daniel J. Bernstein - Niels Duif - Tanja Lange - Peter Schwabe - Bo-Yin Yang -*/ - - -#include "ed25519-donna-portable.h" -#include "orconfig.h" - -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -/* Some of the ASM here is very long strings. */ -#ifdef __clang__ -#pragma clang diagnostic ignored "-Woverlength-strings" -#else -#pragma GCC diagnostic ignored "-Woverlength-strings" -#endif -#endif - -#if defined(ED25519_SSE2) -#else - #if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT) - #define ED25519_64BIT - #else - #define ED25519_32BIT - #endif -#endif - -#if !defined(ED25519_NO_INLINE_ASM) - /* detect extra features first so un-needed functions can be disabled throughout */ - #if defined(ED25519_SSE2) - #if defined(COMPILER_GCC) && defined(CPU_X86) - #define ED25519_GCC_32BIT_SSE_CHOOSE - #elif defined(COMPILER_GCC) && defined(CPU_X86_64) - #define ED25519_GCC_64BIT_SSE_CHOOSE - #endif - #else - #if defined(CPU_X86_64) - #if defined(COMPILER_GCC) - #if defined(ED25519_64BIT) - #define ED25519_GCC_64BIT_X86_CHOOSE - #else - #define ED25519_GCC_64BIT_32BIT_CHOOSE - #endif - #endif - #endif - #endif -#endif - -#if defined(ED25519_SSE2) - #include "curve25519-donna-sse2.h" -#elif defined(ED25519_64BIT) - #include "curve25519-donna-64bit.h" -#else - #include "curve25519-donna-32bit.h" -#endif - -#include "curve25519-donna-helpers.h" - -/* separate uint128 check for 64 bit sse2 */ -#if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT) - #include "modm-donna-64bit.h" -#else - #include "modm-donna-32bit.h" -#endif - -typedef unsigned char hash_512bits[64]; - -/* - Timing safe memory compare -*/ -static int -ed25519_verify(const unsigned char *x, const unsigned char *y, size_t len) { - size_t differentbits = 0; - while (len--) - differentbits |= (*x++ ^ *y++); - /*coverity[overflow]*/ - return (int) (1 & ((differentbits - 1) >> 8)); -} - - -/* - * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2 - * with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555 - * Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960); - */ - -typedef struct ge25519_t { - bignum25519 x, y, z, t; -} ge25519; - -typedef struct ge25519_p1p1_t { - bignum25519 x, y, z, t; -} ge25519_p1p1; - -typedef struct ge25519_niels_t { - bignum25519 ysubx, xaddy, t2d; -} ge25519_niels; - -typedef struct ge25519_pniels_t { - bignum25519 ysubx, xaddy, z, t2d; -} ge25519_pniels; - -#include "ed25519-donna-basepoint-table.h" - -#if defined(ED25519_64BIT) - #include "ed25519-donna-64bit-tables.h" - #include "ed25519-donna-64bit-x86.h" -#else - #include "ed25519-donna-32bit-tables.h" - #include "ed25519-donna-64bit-x86-32bit.h" -#endif - - -#if defined(ED25519_SSE2) - #include "ed25519-donna-32bit-sse2.h" - #include "ed25519-donna-64bit-sse2.h" - #include "ed25519-donna-impl-sse2.h" -#else - #include "ed25519-donna-impl-base.h" -#endif - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-hash-custom.h b/src/tor/src/ext/ed25519/donna/ed25519-hash-custom.h deleted file mode 100644 index 609451abd..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-hash-custom.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - a custom hash must have a 512bit digest and implement: - - struct ed25519_hash_context; - - void ed25519_hash_init(ed25519_hash_context *ctx); - void ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen); - void ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash); - void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); -*/ - -#include "crypto.h" - -typedef struct ed25519_hash_context { - crypto_digest_t *ctx; -} ed25519_hash_context; - - -static void -ed25519_hash_init(ed25519_hash_context *ctx) -{ - ctx->ctx = crypto_digest512_new(DIGEST_SHA512); -} -static void -ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) -{ - crypto_digest_add_bytes(ctx->ctx, (const char *)in, inlen); -} -static void -ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) -{ - crypto_digest_get_digest(ctx->ctx, (char *)hash, DIGEST512_LEN); - crypto_digest_free(ctx->ctx); - ctx->ctx = NULL; -} -static void -ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) -{ - crypto_digest512((char *)hash, (const char *)in, inlen, - DIGEST_SHA512); -} - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-hash.h b/src/tor/src/ext/ed25519/donna/ed25519-hash.h deleted file mode 100644 index 6ba8f5238..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-hash.h +++ /dev/null @@ -1,219 +0,0 @@ -#if defined(ED25519_REFHASH) - -/* reference/slow SHA-512. really, do not use this */ - -#define HASH_BLOCK_SIZE 128 -#define HASH_DIGEST_SIZE 64 - -typedef struct sha512_state_t { - uint64_t H[8]; - uint64_t T[2]; - uint32_t leftover; - uint8_t buffer[HASH_BLOCK_SIZE]; -} sha512_state; - -typedef sha512_state ed25519_hash_context; - -static const uint64_t sha512_constants[80] = { - 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, - 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, - 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, - 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull, - 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, - 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, - 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, - 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull, - 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull, - 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull, - 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, - 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, - 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, - 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, - 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull, - 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, - 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, - 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull, - 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull, - 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull -}; - -static uint64_t -sha512_ROTR64(uint64_t x, int k) { - return (x >> k) | (x << (64 - k)); -} - -static uint64_t -sha512_LOAD64_BE(const uint8_t *p) { - return - ((uint64_t)p[0] << 56) | - ((uint64_t)p[1] << 48) | - ((uint64_t)p[2] << 40) | - ((uint64_t)p[3] << 32) | - ((uint64_t)p[4] << 24) | - ((uint64_t)p[5] << 16) | - ((uint64_t)p[6] << 8) | - ((uint64_t)p[7] ); -} - -static void -sha512_STORE64_BE(uint8_t *p, uint64_t v) { - p[0] = (uint8_t)(v >> 56); - p[1] = (uint8_t)(v >> 48); - p[2] = (uint8_t)(v >> 40); - p[3] = (uint8_t)(v >> 32); - p[4] = (uint8_t)(v >> 24); - p[5] = (uint8_t)(v >> 16); - p[6] = (uint8_t)(v >> 8); - p[7] = (uint8_t)(v ); -} - -#define Ch(x,y,z) (z ^ (x & (y ^ z))) -#define Maj(x,y,z) (((x | y) & z) | (x & y)) -#define S0(x) (sha512_ROTR64(x, 28) ^ sha512_ROTR64(x, 34) ^ sha512_ROTR64(x, 39)) -#define S1(x) (sha512_ROTR64(x, 14) ^ sha512_ROTR64(x, 18) ^ sha512_ROTR64(x, 41)) -#define G0(x) (sha512_ROTR64(x, 1) ^ sha512_ROTR64(x, 8) ^ (x >> 7)) -#define G1(x) (sha512_ROTR64(x, 19) ^ sha512_ROTR64(x, 61) ^ (x >> 6)) -#define W0(in,i) (sha512_LOAD64_BE(&in[i * 8])) -#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) -#define STEP(i) \ - t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ - t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \ - r[7] = r[6]; \ - r[6] = r[5]; \ - r[5] = r[4]; \ - r[4] = r[3] + t0; \ - r[3] = r[2]; \ - r[2] = r[1]; \ - r[1] = r[0]; \ - r[0] = t0 + t1; - -static void -sha512_blocks(sha512_state *S, const uint8_t *in, size_t blocks) { - uint64_t r[8], w[80], t0, t1; - size_t i; - - for (i = 0; i < 8; i++) r[i] = S->H[i]; - - while (blocks--) { - for (i = 0; i < 16; i++) { w[i] = W0(in, i); } - for (i = 16; i < 80; i++) { w[i] = W1(i); } - for (i = 0; i < 80; i++) { STEP(i); } - for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } - S->T[0] += HASH_BLOCK_SIZE * 8; - S->T[1] += (!S->T[0]) ? 1 : 0; - in += HASH_BLOCK_SIZE; - } -} - -static void -ed25519_hash_init(sha512_state *S) { - S->H[0] = 0x6a09e667f3bcc908ull; - S->H[1] = 0xbb67ae8584caa73bull; - S->H[2] = 0x3c6ef372fe94f82bull; - S->H[3] = 0xa54ff53a5f1d36f1ull; - S->H[4] = 0x510e527fade682d1ull; - S->H[5] = 0x9b05688c2b3e6c1full; - S->H[6] = 0x1f83d9abfb41bd6bull; - S->H[7] = 0x5be0cd19137e2179ull; - S->T[0] = 0; - S->T[1] = 0; - S->leftover = 0; -} - -static void -ed25519_hash_update(sha512_state *S, const uint8_t *in, size_t inlen) { - size_t blocks, want; - - /* handle the previous data */ - if (S->leftover) { - want = (HASH_BLOCK_SIZE - S->leftover); - want = (want < inlen) ? want : inlen; - memcpy(S->buffer + S->leftover, in, want); - S->leftover += (uint32_t)want; - if (S->leftover < HASH_BLOCK_SIZE) - return; - in += want; - inlen -= want; - sha512_blocks(S, S->buffer, 1); - } - - /* handle the current data */ - blocks = (inlen & ~(HASH_BLOCK_SIZE - 1)); - S->leftover = (uint32_t)(inlen - blocks); - if (blocks) { - sha512_blocks(S, in, blocks / HASH_BLOCK_SIZE); - in += blocks; - } - - /* handle leftover data */ - if (S->leftover) - memcpy(S->buffer, in, S->leftover); -} - -static void -ed25519_hash_final(sha512_state *S, uint8_t *hash) { - uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1]; - - S->buffer[S->leftover] = 0x80; - if (S->leftover <= 111) { - memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); - } else { - memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); - sha512_blocks(S, S->buffer, 1); - memset(S->buffer, 0, 112); - } - - sha512_STORE64_BE(S->buffer + 112, t1); - sha512_STORE64_BE(S->buffer + 120, t0); - sha512_blocks(S, S->buffer, 1); - - sha512_STORE64_BE(&hash[ 0], S->H[0]); - sha512_STORE64_BE(&hash[ 8], S->H[1]); - sha512_STORE64_BE(&hash[16], S->H[2]); - sha512_STORE64_BE(&hash[24], S->H[3]); - sha512_STORE64_BE(&hash[32], S->H[4]); - sha512_STORE64_BE(&hash[40], S->H[5]); - sha512_STORE64_BE(&hash[48], S->H[6]); - sha512_STORE64_BE(&hash[56], S->H[7]); -} - -static void -ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) { - ed25519_hash_context ctx; - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, in, inlen); - ed25519_hash_final(&ctx, hash); -} - -#elif defined(ED25519_CUSTOMHASH) - -#include "ed25519-hash-custom.h" - -#else - -#include - -typedef SHA512_CTX ed25519_hash_context; - -static void -ed25519_hash_init(ed25519_hash_context *ctx) { - SHA512_Init(ctx); -} - -static void -ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) { - SHA512_Update(ctx, in, inlen); -} - -static void -ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) { - SHA512_Final(hash, ctx); -} - -static void -ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) { - SHA512(in, inlen, hash); -} - -#endif - diff --git a/src/tor/src/ext/ed25519/donna/ed25519-randombytes-custom.h b/src/tor/src/ext/ed25519/donna/ed25519-randombytes-custom.h deleted file mode 100644 index 3fb0959fc..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-randombytes-custom.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - a custom randombytes must implement: - - void ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len); - - ed25519_randombytes_unsafe is used by the batch verification function - to create random scalars -*/ - -/* Tor: Instead of calling OpenSSL's CSPRNG directly, call the wrapper. */ -#include "crypto.h" - -static void -ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) -{ - crypto_rand_unmocked(p, len); -} diff --git a/src/tor/src/ext/ed25519/donna/ed25519-randombytes.h b/src/tor/src/ext/ed25519/donna/ed25519-randombytes.h deleted file mode 100644 index 1dc629028..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519-randombytes.h +++ /dev/null @@ -1,91 +0,0 @@ -#if defined(ED25519_TEST) -/* - ISAAC+ "variant", the paper is not clear on operator precedence and other - things. This is the "first in, first out" option! - - Not threadsafe or securely initialized, only for deterministic testing -*/ -typedef struct isaacp_state_t { - uint32_t state[256]; - unsigned char buffer[1024]; - uint32_t a, b, c; - size_t left; -} isaacp_state; - -#define isaacp_step(offset, mix) \ - x = mm[i + offset]; \ - a = (a ^ (mix)) + (mm[(i + offset + 128) & 0xff]); \ - y = (a ^ b) + mm[(x >> 2) & 0xff]; \ - mm[i + offset] = y; \ - b = (x + a) ^ mm[(y >> 10) & 0xff]; \ - U32TO8_LE(out + (i + offset) * 4, b); - -static void -isaacp_mix(isaacp_state *st) { - uint32_t i, x, y; - uint32_t a = st->a, b = st->b, c = st->c; - uint32_t *mm = st->state; - unsigned char *out = st->buffer; - - c = c + 1; - b = b + c; - - for (i = 0; i < 256; i += 4) { - isaacp_step(0, ROTL32(a,13)) - isaacp_step(1, ROTR32(a, 6)) - isaacp_step(2, ROTL32(a, 2)) - isaacp_step(3, ROTR32(a,16)) - } - - st->a = a; - st->b = b; - st->c = c; - st->left = 1024; -} - -static void -isaacp_random(isaacp_state *st, void *p, size_t len) { - size_t use; - unsigned char *c = (unsigned char *)p; - while (len) { - use = (len > st->left) ? st->left : len; - memcpy(c, st->buffer + (sizeof(st->buffer) - st->left), use); - - st->left -= use; - c += use; - len -= use; - - if (!st->left) - isaacp_mix(st); - } -} - -void -ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) { - static int initialized = 0; - static isaacp_state rng; - - if (!initialized) { - memset(&rng, 0, sizeof(rng)); - isaacp_mix(&rng); - isaacp_mix(&rng); - initialized = 1; - } - - isaacp_random(&rng, p, len); -} -#elif defined(ED25519_CUSTOMRANDOM) - -#include "ed25519-randombytes-custom.h" - -#else - -#include - -void -ED25519_FN(ed25519_randombytes_unsafe) (void *p, size_t len) { - - RAND_bytes(p, (int) len); - -} -#endif diff --git a/src/tor/src/ext/ed25519/donna/ed25519.c b/src/tor/src/ext/ed25519/donna/ed25519.c deleted file mode 100644 index 58a755b8d..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - Public domain by Andrew M. - - Ed25519 reference implementation using Ed25519-donna -*/ - - -/* define ED25519_SUFFIX to have it appended to the end of each public function */ -#if !defined(ED25519_SUFFIX) -#define ED25519_SUFFIX -#endif - -#define ED25519_FN3(fn,suffix) fn##suffix -#define ED25519_FN2(fn,suffix) ED25519_FN3(fn,suffix) -#define ED25519_FN(fn) ED25519_FN2(fn,ED25519_SUFFIX) - -#include "ed25519-donna.h" -#include "ed25519.h" -#include "ed25519-randombytes.h" -#include "ed25519-hash.h" - -/* - Generates a (extsk[0..31]) and aExt (extsk[32..63]) -*/ - -DONNA_INLINE static void -ed25519_extsk(hash_512bits extsk, const ed25519_secret_key sk) { - ed25519_hash(extsk, sk, 32); - extsk[0] &= 248; - extsk[31] &= 127; - extsk[31] |= 64; -} - -static void -ed25519_hram(hash_512bits hram, const ed25519_signature RS, const ed25519_public_key pk, const unsigned char *m, size_t mlen) { - ed25519_hash_context ctx; - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, RS, 32); - ed25519_hash_update(&ctx, pk, 32); - ed25519_hash_update(&ctx, m, mlen); - ed25519_hash_final(&ctx, hram); -} - -void -ED25519_FN(ed25519_publickey) (const ed25519_secret_key sk, ed25519_public_key pk) { - bignum256modm a; - ge25519 ALIGN(16) A; - hash_512bits extsk; - - /* A = aB */ - ed25519_extsk(extsk, sk); - expand256_modm(a, extsk, 32); - ge25519_scalarmult_base_niels(&A, ge25519_niels_base_multiples, a); - ge25519_pack(pk, &A); -} - - -void -ED25519_FN(ed25519_sign) (const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS) { - ed25519_hash_context ctx; - bignum256modm r, S, a; - ge25519 ALIGN(16) R; - hash_512bits extsk, hashr, hram; - - ed25519_extsk(extsk, sk); - - /* r = H(aExt[32..64], m) */ - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, extsk + 32, 32); - ed25519_hash_update(&ctx, m, mlen); - ed25519_hash_final(&ctx, hashr); - expand256_modm(r, hashr, 64); - - /* R = rB */ - ge25519_scalarmult_base_niels(&R, ge25519_niels_base_multiples, r); - ge25519_pack(RS, &R); - - /* S = H(R,A,m).. */ - ed25519_hram(hram, RS, pk, m, mlen); - expand256_modm(S, hram, 64); - - /* S = H(R,A,m)a */ - expand256_modm(a, extsk, 32); - mul256_modm(S, S, a); - - /* S = (r + H(R,A,m)a) */ - add256_modm(S, S, r); - - /* S = (r + H(R,A,m)a) mod L */ - contract256_modm(RS + 32, S); -} - -int -ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS) { - ge25519 ALIGN(16) R, A; - hash_512bits hash; - bignum256modm hram, S; - unsigned char checkR[32]; - - if ((RS[63] & 224) || !ge25519_unpack_negative_vartime(&A, pk)) - return -1; - - /* hram = H(R,A,m) */ - ed25519_hram(hash, RS, pk, m, mlen); - expand256_modm(hram, hash, 64); - - /* S */ - expand256_modm(S, RS + 32, 32); - - /* SB - H(R,A,m)A */ - ge25519_double_scalarmult_vartime(&R, &A, hram, S); - ge25519_pack(checkR, &R); - - /* check that R = SB - H(R,A,m)A */ - return ed25519_verify(RS, checkR, 32) ? 0 : -1; -} - -#include "ed25519-donna-batchverify.h" - -/* - Fast Curve25519 basepoint scalar multiplication -*/ - -void -ED25519_FN(curved25519_scalarmult_basepoint) (curved25519_key pk, const curved25519_key e) { - curved25519_key ec; - bignum256modm s; - bignum25519 ALIGN(16) yplusz, zminusy; - ge25519 ALIGN(16) p; - size_t i; - - /* clamp */ - for (i = 0; i < 32; i++) ec[i] = e[i]; - ec[0] &= 248; - ec[31] &= 127; - ec[31] |= 64; - - expand_raw256_modm(s, ec); - - /* scalar * basepoint */ - ge25519_scalarmult_base_niels(&p, ge25519_niels_base_multiples, s); - - /* u = (y + z) / (z - y) */ - curve25519_add(yplusz, p.y, p.z); - curve25519_sub(zminusy, p.z, p.y); - curve25519_recip(zminusy, zminusy); - curve25519_mul(yplusz, yplusz, zminusy); - curve25519_contract(pk, yplusz); -} - diff --git a/src/tor/src/ext/ed25519/donna/ed25519.h b/src/tor/src/ext/ed25519/donna/ed25519.h deleted file mode 100644 index dc86675cd..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ED25519_H -#define ED25519_H - -#include - -#if defined(__cplusplus) -extern "C" { -#endif - -typedef unsigned char ed25519_signature[64]; -typedef unsigned char ed25519_public_key[32]; -typedef unsigned char ed25519_secret_key[32]; - -typedef unsigned char curved25519_key[32]; - -void ed25519_publickey(const ed25519_secret_key sk, ed25519_public_key pk); -int ed25519_sign_open(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); -void ed25519_sign(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); - -int ed25519_sign_open_batch(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); - -void ed25519_randombytes_unsafe(void *out, size_t count); - -void curved25519_scalarmult_basepoint(curved25519_key pk, const curved25519_key e); - -#if defined(__cplusplus) -} -#endif - -#endif // ED25519_H diff --git a/src/tor/src/ext/ed25519/donna/ed25519_donna_tor.h b/src/tor/src/ext/ed25519/donna/ed25519_donna_tor.h deleted file mode 100644 index 7d7b8c062..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519_donna_tor.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Added for Tor. */ -#ifndef SRC_EXT_ED25519_DONNA_H_INCLUDED_ -#define SRC_EXT_ED25519_DONNA_H_INCLUDED_ -#include - -typedef unsigned char curved25519_key[32]; - -int ed25519_sign_open_batch_donna(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); -void curved25519_scalarmult_basepoint_donna(curved25519_key pk, const curved25519_key e); - -/* Tor specific interface to match the `ref10` glue code. */ -int ed25519_donna_selftest(void); -int ed25519_donna_seckey(unsigned char *sk); -int ed25519_donna_seckey_expand(unsigned char *sk, const unsigned char *sk_seed); -int ed25519_donna_pubkey(unsigned char *pk, const unsigned char *sk); -int ed25519_donna_keygen(unsigned char *pk, unsigned char *sk); - -int ed25519_donna_open(const unsigned char *signature, const unsigned char *m, - size_t mlen, const unsigned char *pk); - -int ed25519_donna_sign(unsigned char *sig, const unsigned char *m, size_t mlen, - const unsigned char *sk, const unsigned char *pk); - -int ed25519_donna_blind_secret_key(unsigned char *out, const unsigned char *inp, - const unsigned char *param); - -int ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp, - const unsigned char *param); - -int ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out, - const unsigned char *inp, int signbit); - - -int -ed25519_donna_scalarmult_with_group_order(unsigned char *out, - const unsigned char *pubkey); - -#endif diff --git a/src/tor/src/ext/ed25519/donna/ed25519_tor.c b/src/tor/src/ext/ed25519/donna/ed25519_tor.c deleted file mode 100644 index 44ec562f0..000000000 --- a/src/tor/src/ext/ed25519/donna/ed25519_tor.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - Public domain by Andrew M. - - Ed25519 reference implementation using Ed25519-donna -*/ - -/* - Tor specific notes: - - This file is used by Tor instead of `ed25519.c` as the number of - changes/additions is non-trivial. - - Tor modifications to `ed25519.c`: - * 'Tab` -> ' '. - * Include `ed25519_donna_tor.h` instead of `ed25519.h`. - - * The external interface has been reworked to match that provided - by Tor's copy of the SUPERCOP `ref10` code. - - * The secret (aka private) key is now stored/used in expanded form. - - * The internal math tests from `test-internals.c` have been wrapped - in a function and the entire file is included to allow for - runtime validation. - */ - - -/* define ED25519_SUFFIX to have it appended to the end of each public function */ -#if !defined(ED25519_SUFFIX) -#define ED25519_SUFFIX -#endif - -#define ED25519_FN3(fn,suffix) fn##suffix -#define ED25519_FN2(fn,suffix) ED25519_FN3(fn,suffix) -#define ED25519_FN(fn) ED25519_FN2(fn,ED25519_SUFFIX) - -#include "orconfig.h" -#include "ed25519-donna.h" -#include "ed25519_donna_tor.h" -#include "ed25519-randombytes.h" -#include "ed25519-hash.h" - -typedef unsigned char ed25519_signature[64]; -typedef unsigned char ed25519_public_key[32]; -typedef unsigned char ed25519_secret_key[32]; - -static void ed25519_donna_gettweak(unsigned char *out, - const unsigned char *param); - -static int ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, - const ed25519_public_key pk, const ed25519_signature RS); - - -/* - Generates a (extsk[0..31]) and aExt (extsk[32..63]) -*/ - -DONNA_INLINE static void -ed25519_extsk(hash_512bits extsk, const ed25519_secret_key sk) { - ed25519_hash(extsk, sk, 32); - extsk[0] &= 248; - extsk[31] &= 127; - extsk[31] |= 64; -} - -static void -ed25519_hram(hash_512bits hram, const ed25519_signature RS, const ed25519_public_key pk, const unsigned char *m, size_t mlen) { - ed25519_hash_context ctx; - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, RS, 32); - ed25519_hash_update(&ctx, pk, 32); - ed25519_hash_update(&ctx, m, mlen); - ed25519_hash_final(&ctx, hram); -} - -static int -ED25519_FN(ed25519_sign_open) (const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS) { - ge25519 ALIGN(16) R, A; - hash_512bits hash; - bignum256modm hram, S; - unsigned char checkR[32]; - - if ((RS[63] & 224) || !ge25519_unpack_negative_vartime(&A, pk)) - return -1; - - /* hram = H(R,A,m) */ - ed25519_hram(hash, RS, pk, m, mlen); - expand256_modm(hram, hash, 64); - - /* S */ - expand256_modm(S, RS + 32, 32); - - /* SB - H(R,A,m)A */ - ge25519_double_scalarmult_vartime(&R, &A, hram, S); - ge25519_pack(checkR, &R); - - /* check that R = SB - H(R,A,m)A */ - return ed25519_verify(RS, checkR, 32) ? 0 : -1; -} - -#include "ed25519-donna-batchverify.h" - -/* - Fast Curve25519 basepoint scalar multiplication -*/ - -void -ED25519_FN(curved25519_scalarmult_basepoint) (curved25519_key pk, const curved25519_key e) { - curved25519_key ec; - bignum256modm s; - bignum25519 ALIGN(16) yplusz, zminusy; - ge25519 ALIGN(16) p; - size_t i; - - /* clamp */ - for (i = 0; i < 32; i++) ec[i] = e[i]; - ec[0] &= 248; - ec[31] &= 127; - ec[31] |= 64; - - expand_raw256_modm(s, ec); - - /* scalar * basepoint */ - ge25519_scalarmult_base_niels(&p, ge25519_niels_base_multiples, s); - - /* u = (y + z) / (z - y) */ - curve25519_add(yplusz, p.y, p.z); - curve25519_sub(zminusy, p.z, p.y); - curve25519_recip(zminusy, zminusy); - curve25519_mul(yplusz, yplusz, zminusy); - curve25519_contract(pk, yplusz); -} - -/* - Tor has a specific idea of how an Ed25519 implementaion should behave. - Implement such a beast using the ed25519-donna primitives/internals. - - * Private key generation using Tor's CSPRNG. - - * Routines that deal with the private key now use the expanded form. - - * Support for multiplicative key blinding has been added. - - * Support for converting a Curve25519 key to an Ed25519 key has been added. - */ - -int -ed25519_donna_seckey(unsigned char *sk) -{ - ed25519_secret_key seed; - - crypto_strongest_rand(seed, 32); - - ed25519_extsk(sk, seed); - - memwipe(seed, 0, sizeof(seed)); - - return 0; -} - -int -ed25519_donna_seckey_expand(unsigned char *sk, const unsigned char *skseed) -{ - ed25519_extsk(sk, skseed); - - return 0; -} - -int -ed25519_donna_pubkey(unsigned char *pk, const unsigned char *sk) -{ - bignum256modm a = {0}; - ge25519 ALIGN(16) A = {{0}, {0}, {0}, {0}}; - - /* A = aB */ - expand256_modm(a, sk, 32); - ge25519_scalarmult_base_niels(&A, ge25519_niels_base_multiples, a); - ge25519_pack(pk, &A); - - return 0; -} - -int -ed25519_donna_keygen(unsigned char *pk, unsigned char *sk) -{ - int ok; - ok = ed25519_donna_seckey(sk); - ed25519_donna_pubkey(pk, sk); - - return ok; -} - -int -ed25519_donna_open(const unsigned char *signature, const unsigned char *m, - size_t mlen, const unsigned char *pk) -{ - /* Wrap the ed25519-donna routine, since it is also used by the batch - * verification code. - */ - return ED25519_FN(ed25519_sign_open)(m, mlen, pk, signature); -} - -int -ed25519_donna_sign(unsigned char *sig, const unsigned char *m, size_t mlen, - const unsigned char *sk, const unsigned char *pk) -{ - ed25519_hash_context ctx; - bignum256modm r = {0}, S, a; - ge25519 ALIGN(16) R = {{0}, {0}, {0}, {0}}; - hash_512bits hashr, hram; - - /* This is equivalent to the removed `ED25519_FN(ed25519_sign)` routine, - * except that the key expansion step is omitted as sk already is in expanded - * form. - */ - - /* r = H(aExt[32..64], m) */ - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, sk + 32, 32); - ed25519_hash_update(&ctx, m, mlen); - ed25519_hash_final(&ctx, hashr); - expand256_modm(r, hashr, 64); - - /* R = rB */ - ge25519_scalarmult_base_niels(&R, ge25519_niels_base_multiples, r); - ge25519_pack(sig, &R); - - /* S = H(R,A,m).. */ - ed25519_hram(hram, sig, pk, m, mlen); - expand256_modm(S, hram, 64); - - /* S = H(R,A,m)a */ - expand256_modm(a, sk, 32); - mul256_modm(S, S, a); - - /* S = (r + H(R,A,m)a) */ - add256_modm(S, S, r); - - /* S = (r + H(R,A,m)a) mod L */ - contract256_modm(sig + 32, S); - - return 0; -} - -static void -ed25519_donna_gettweak(unsigned char *out, const unsigned char *param) -{ - memcpy(out, param, 32); - - out[0] &= 248; /* Is this necessary ? */ - out[31] &= 63; - out[31] |= 64; -} - -int -ed25519_donna_blind_secret_key(unsigned char *out, const unsigned char *inp, - const unsigned char *param) -{ - static const char str[] = "Derive temporary signing key hash input"; - unsigned char tweak[64]; - ed25519_hash_context ctx; - bignum256modm ALIGN(16) sk, t; - - ed25519_donna_gettweak(tweak, param); - expand256_modm(t, tweak, 32); - - expand256_modm(sk, inp, 32); - mul256_modm(sk, sk, t); - contract256_modm(out, sk); - - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, (const unsigned char*)str, strlen(str)); - ed25519_hash_update(&ctx, inp + 32, 32); - ed25519_hash_final(&ctx, tweak); - - memcpy(out + 32, tweak, 32); - - memwipe(sk, 0, sizeof(sk)); - memwipe(t, 0, sizeof(t)); - memwipe(tweak, 0, sizeof(tweak)); - - return 0; -} - -int -ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp, - const unsigned char *param) -{ - static const bignum256modm zero = { 0 }; - unsigned char tweak[64]; - unsigned char pkcopy[32]; - ge25519 ALIGN(16) A, Aprime; - bignum256modm ALIGN(16) t; - - ed25519_donna_gettweak(tweak, param); - expand256_modm(t, tweak, 32); - - /* No "ge25519_unpack", negate the public key. */ - memcpy(pkcopy, inp, 32); - pkcopy[31] ^= (1<<7); - if (!ge25519_unpack_negative_vartime(&A, pkcopy)) { - return -1; - } - - /* A' = [tweak] * A + [0] * basepoint. */ - ge25519_double_scalarmult_vartime(&Aprime, &A, t, zero); - ge25519_pack(out, &Aprime); - - memwipe(tweak, 0, sizeof(tweak)); - memwipe(pkcopy, 0, sizeof(pkcopy)); - memwipe(&A, 0, sizeof(A)); - memwipe(&Aprime, 0, sizeof(Aprime)); - memwipe(t, 0, sizeof(t)); - - return 0; -} - -int -ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out, - const unsigned char *inp, int signbit) -{ - static const bignum25519 ALIGN(16) one = { 1 }; - bignum25519 ALIGN(16) u, uminus1, uplus1, inv_uplus1, y; - - /* Prop228: y = (u-1)/(u+1) */ - curve25519_expand(u, inp); - curve25519_sub(uminus1, u, one); - curve25519_add(uplus1, u, one); - curve25519_recip(inv_uplus1, uplus1); - curve25519_mul(y, uminus1, inv_uplus1); - curve25519_contract(out, y); - - /* Propagate sign. */ - out[31] |= (!!signbit) << 7; - - return 0; -} - -/* Do the scalar multiplication of pubkey with the group order - * modm_m. Place the result in out which must be at least 32 - * bytes long. */ -int -ed25519_donna_scalarmult_with_group_order(unsigned char *out, - const unsigned char *pubkey) -{ - static const bignum256modm ALIGN(16) zero = { 0 }; - unsigned char pkcopy[32]; - ge25519 ALIGN(16) Point, Result; - - /* No "ge25519_unpack", negate the public key and unpack it back. - * See ed25519_donna_blind_public_key() */ - memcpy(pkcopy, pubkey, 32); - pkcopy[31] ^= (1<<7); - if (!ge25519_unpack_negative_vartime(&Point, pkcopy)) { - return -1; /* error: bail out */ - } - - /* There is no regular scalarmult function so we have to do: - * Result = l*P + 0*B */ - ge25519_double_scalarmult_vartime(&Result, &Point, modm_m, zero); - ge25519_pack(out, &Result); - - return 0; -} - -#include "test-internals.c" - diff --git a/src/tor/src/ext/ed25519/donna/fuzz/README.md b/src/tor/src/ext/ed25519/donna/fuzz/README.md deleted file mode 100644 index 306ddfe08..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/README.md +++ /dev/null @@ -1,173 +0,0 @@ -This code fuzzes ed25519-donna (and optionally ed25519-donna-sse2) against the ref10 implementations of -[curve25519](https://github.com/floodyberry/supercop/tree/master/crypto_scalarmult/curve25519/ref10) and -[ed25519](https://github.com/floodyberry/supercop/tree/master/crypto_sign/ed25519/ref10). - -Curve25519 tests that generating a public key from a secret key - -# Building - -## *nix + PHP - -`php build-nix.php (required parameters) (optional parameters)` - -Required parameters: - -* `--function=[curve25519,ed25519]` -* `--bits=[32,64]` - -Optional parameters: - -* `--with-sse2` - - Also fuzz against ed25519-donna-sse2 -* `--with-openssl` - - Build with OpenSSL's SHA-512. - - Default: Reference SHA-512 implementation (slow!) - -* `--compiler=[gcc,clang,icc]` - - Default: gcc - -* `--no-asm` - - Do not use platform specific assembler - - -example: - - php build-nix.php --bits=64 --function=ed25519 --with-sse2 --compiler=icc - -## Windows - -Create a project with access to the ed25519 files. - -If you are not using OpenSSL, add the `ED25519_REFHASH` define to the projects -"Properties/Preprocessor/Preprocessor Definitions" option - -Add the following files to the project: - -* `fuzz/curve25519-ref10.c` -* `fuzz/ed25519-ref10.c` -* `fuzz/ed25519-donna.c` -* `fuzz/ed25519-donna-sse2.c` (optional) -* `fuzz-[curve25519/ed25519].c` (depending on which you want to fuzz) - -If you are also fuzzing against ed25519-donna-sse2, add the `ED25519_SSE2` define for `fuzz-[curve25519/ed25519].c` under -its "Properties/Preprocessor/Preprocessor Definitions" option. - -# Running - -If everything agrees, the program will only output occasional status dots (every 0x1000 passes) -and a 64bit progress count (every 0x20000 passes): - - fuzzing: ref10 curved25519 curved25519-sse2 - - ................................ [0000000000020000] - ................................ [0000000000040000] - ................................ [0000000000060000] - ................................ [0000000000080000] - ................................ [00000000000a0000] - ................................ [00000000000c0000] - -If any of the implementations do not agree with the ref10 implementation, the program will dump -the random data that was used, the data generated by the ref10 implementation, and diffs of the -ed25519-donna data against the ref10 data. - -## Example errors - -These are example error dumps (with intentionally introduced errors). - -### Ed25519 - -Random data: - -* sk, or Secret Key -* m, or Message - -Generated data: - -* pk, or Public Key -* sig, or Signature -* valid, or if the signature of the message is valid with the public key - -Dump: - - sk: - 0x3b,0xb7,0x17,0x7a,0x66,0xdc,0xb7,0x9a,0x90,0x25,0x07,0x99,0x96,0xf3,0x92,0xef, - 0x78,0xf8,0xad,0x6c,0x35,0x87,0x81,0x67,0x03,0xe6,0x95,0xba,0x06,0x18,0x7c,0x9c, - - m: - 0x7c,0x8d,0x3d,0xe1,0x92,0xee,0x7a,0xb8,0x4d,0xc9,0xfb,0x02,0x34,0x1e,0x5a,0x91, - 0xee,0x01,0xa6,0xb8,0xab,0x37,0x3f,0x3d,0x6d,0xa2,0x47,0xe3,0x27,0x93,0x7c,0xb7, - 0x77,0x07,0xb6,0x88,0x41,0x22,0xf3,0x3f,0xce,0xcb,0x6b,0x3e,0x2b,0x23,0x68,0x7f, - 0x5b,0xb9,0xda,0x04,0xbb,0xae,0x42,0x50,0xf5,0xe9,0xc5,0x11,0xbd,0x52,0x76,0x98, - 0xf1,0x87,0x09,0xb9,0x89,0x0a,0x52,0x69,0x01,0xce,0xe0,0x4a,0xa6,0x46,0x5a,0xe1, - 0x63,0x14,0xe0,0x81,0x52,0xec,0xcd,0xcf,0x70,0x54,0x7d,0xa3,0x49,0x8b,0xf0,0x89, - 0x70,0x07,0x12,0x2a,0xd9,0xaa,0x16,0x01,0xb2,0x16,0x3a,0xbb,0xfc,0xfa,0x13,0x5b, - 0x69,0x83,0x92,0x70,0x95,0x76,0xa0,0x8e,0x16,0x79,0xcc,0xaa,0xb5,0x7c,0xf8,0x7a, - - ref10: - pk: - 0x71,0xb0,0x5e,0x62,0x1b,0xe3,0xe7,0x36,0x91,0x8b,0xc0,0x13,0x36,0x0c,0xc9,0x04, - 0x16,0xf5,0xff,0x48,0x0c,0x83,0x6b,0x88,0x53,0xa2,0xc6,0x0f,0xf7,0xac,0x42,0x04, - - sig: - 0x3e,0x05,0xc5,0x37,0x16,0x0b,0x29,0x30,0x89,0xa3,0xe7,0x83,0x08,0x16,0xdd,0x96, - 0x02,0xfa,0x0d,0x44,0x2c,0x43,0xaa,0x80,0x93,0x04,0x58,0x22,0x09,0xbf,0x11,0xa5, - 0xcc,0xa5,0x3c,0x9f,0xa0,0xa4,0x64,0x5a,0x4a,0xdb,0x20,0xfb,0xc7,0x9b,0xfd,0x3f, - 0x08,0xae,0xc4,0x3c,0x1e,0xd8,0xb6,0xb4,0xd2,0x6d,0x80,0x92,0xcb,0x71,0xf3,0x02, - - valid: yes - - ed25519-donna: - pk diff: - ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, - ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, - - sig diff: - 0x2c,0xb9,0x25,0x14,0xd0,0x94,0xeb,0xfe,0x46,0x02,0xc2,0xe8,0xa3,0xeb,0xbf,0xb5, - 0x72,0x84,0xbf,0xc1,0x8a,0x32,0x30,0x99,0xf7,0x58,0xfe,0x06,0xa8,0xdc,0xdc,0xab, - 0xb5,0x57,0x03,0x33,0x87,0xce,0x54,0x55,0x6a,0x69,0x8a,0xc4,0xb7,0x2a,0xed,0x97, - 0xb4,0x68,0xe7,0x52,0x7a,0x07,0x55,0x3b,0xa2,0x94,0xd6,0x5e,0xa1,0x61,0x80,0x08, - - valid: no - -In this case, the generated public key matches, but the generated signature is completely -different and does not validate. - -### Curve25519 - -Random data: - -* sk, or Secret Key - -Generated data: - -* pk, or Public Key - -Dump: - - sk: - 0x44,0xec,0x0b,0x0e,0xa2,0x0e,0x9c,0x5b,0x8c,0xce,0x7b,0x1d,0x68,0xae,0x0f,0x9e, - 0x81,0xe2,0x04,0x76,0xda,0x87,0xa4,0x9e,0xc9,0x4f,0x3b,0xf9,0xc3,0x89,0x63,0x70, - - - ref10: - 0x24,0x55,0x55,0xc0,0xf9,0x80,0xaf,0x02,0x43,0xee,0x8c,0x7f,0xc1,0xad,0x90,0x95, - 0x57,0x91,0x14,0x2e,0xf2,0x14,0x22,0x80,0xdd,0x4e,0x3c,0x85,0x71,0x84,0x8c,0x62, - - - curved25519 diff: - 0x12,0xd1,0x61,0x2b,0x16,0xb3,0xd8,0x29,0xf8,0xa3,0xba,0x70,0x4e,0x49,0x4f,0x43, - 0xa1,0x3c,0x6b,0x42,0x11,0x61,0xcc,0x30,0x87,0x73,0x46,0xfb,0x85,0xc7,0x9a,0x35, - - - curved25519-sse2 diff: - ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, - ____,____,____,____,____,____,____,____,____,____,____,____,____,____,____,____, - - -In this case, curved25519 is totally wrong, while curved25519-sse2 matches the reference -implementation. \ No newline at end of file diff --git a/src/tor/src/ext/ed25519/donna/fuzz/build-nix.php b/src/tor/src/ext/ed25519/donna/fuzz/build-nix.php deleted file mode 100644 index c69144ebc..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/build-nix.php +++ /dev/null @@ -1,134 +0,0 @@ -set = false; - - $map = array(); - foreach($legal_values as $value) - $map[$value] = true; - - for ($i = 1; $i < $argc; $i++) { - if (!preg_match("!--".$flag."=(.*)!", $argv[$i], $m)) - continue; - if (isset($map[$m[1]])) { - $this->value = $m[1]; - $this->set = true; - return; - } else { - usage("{$m[1]} is not a valid parameter to --{$flag}!"); - exit(1); - } - } - } - } - - class flag extends argument { - function flag($flag) { - global $argc, $argv; - - $this->set = false; - - $flag = "--{$flag}"; - for ($i = 1; $i < $argc; $i++) { - if ($argv[$i] !== $flag) - continue; - $this->value = true; - $this->set = true; - return; - } - } - } - - $bits = new multiargument("bits", array("32", "64")); - $function = new multiargument("function", array("curve25519", "ed25519")); - $compiler = new multiargument("compiler", array("gcc", "clang", "icc")); - $with_sse2 = new flag("with-sse2"); - $with_openssl = new flag("with-openssl"); - $no_asm = new flag("no-asm"); - - $err = ""; - if (!$bits->set) - $err .= "--bits not set\n"; - if (!$function->set) - $err .= "--function not set\n"; - - if ($err !== "") { - usage($err); - exit; - } - - $compile = ($compiler->set) ? $compiler->value : "gcc"; - $link = ""; - $flags = "-O3 -m{$bits->value}"; - $ret = 0; - - if ($with_openssl->set) $link .= " -lssl -lcrypto"; - if (!$with_openssl->set) $flags .= " -DED25519_REFHASH -DED25519_TEST"; - if ($no_asm->set) $flags .= " -DED25519_NO_INLINE_ASM"; - - if ($function->value === "curve25519") { - runcmd("building ref10..", "{$compile} {$flags} curve25519-ref10.c -c -o curve25519-ref10.o"); - runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o"); - if ($with_sse2->set) { - runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2"); - $flags .= " -DED25519_SSE2"; - $link .= " ed25519-sse2.o"; - } - runcmd("linking..", "{$compile} {$flags} {$link} fuzz-curve25519.c ed25519.o curve25519-ref10.o -o fuzz-curve25519"); - echoln("fuzz-curve25519 built."); - } else if ($function->value === "ed25519") { - runcmd("building ref10..", "{$compile} {$flags} ed25519-ref10.c -c -o ed25519-ref10.o"); - runcmd("building ed25519..", "{$compile} {$flags} ed25519-donna.c -c -o ed25519.o"); - if ($with_sse2->set) { - runcmd("building ed25519-sse2..", "{$compile} {$flags} ed25519-donna-sse2.c -c -o ed25519-sse2.o -msse2"); - $flags .= " -DED25519_SSE2"; - $link .= " ed25519-sse2.o"; - } - runcmd("linking..", "{$compile} {$flags} {$link} fuzz-ed25519.c ed25519.o ed25519-ref10.o -o fuzz-ed25519"); - echoln("fuzz-ed25519 built."); - } - - - cleanup(); -?> diff --git a/src/tor/src/ext/ed25519/donna/fuzz/curve25519-ref10.c b/src/tor/src/ext/ed25519/donna/fuzz/curve25519-ref10.c deleted file mode 100644 index efefce6fd..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/curve25519-ref10.c +++ /dev/null @@ -1,1272 +0,0 @@ -#include - -typedef int32_t crypto_int32; -typedef int64_t crypto_int64; -typedef uint64_t crypto_uint64; - -typedef crypto_int32 fe[10]; - -/* -h = 0 -*/ - -void fe_0(fe h) -{ - h[0] = 0; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} - -/* -h = 1 -*/ - -void fe_1(fe h) -{ - h[0] = 1; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} - -/* -h = f + g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -void fe_add(fe h,fe f,fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 + g0; - crypto_int32 h1 = f1 + g1; - crypto_int32 h2 = f2 + g2; - crypto_int32 h3 = f3 + g3; - crypto_int32 h4 = f4 + g4; - crypto_int32 h5 = f5 + g5; - crypto_int32 h6 = f6 + g6; - crypto_int32 h7 = f7 + g7; - crypto_int32 h8 = f8 + g8; - crypto_int32 h9 = f9 + g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = f -*/ - -void fe_copy(fe h,fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - h[0] = f0; - h[1] = f1; - h[2] = f2; - h[3] = f3; - h[4] = f4; - h[5] = f5; - h[6] = f6; - h[7] = f7; - h[8] = f8; - h[9] = f9; -} - - -/* -Replace (f,g) with (g,f) if b == 1; -replace (f,g) with (f,g) if b == 0. - -Preconditions: b in {0,1}. -*/ - -void fe_cswap(fe f,fe g,unsigned int b) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 x0 = f0 ^ g0; - crypto_int32 x1 = f1 ^ g1; - crypto_int32 x2 = f2 ^ g2; - crypto_int32 x3 = f3 ^ g3; - crypto_int32 x4 = f4 ^ g4; - crypto_int32 x5 = f5 ^ g5; - crypto_int32 x6 = f6 ^ g6; - crypto_int32 x7 = f7 ^ g7; - crypto_int32 x8 = f8 ^ g8; - crypto_int32 x9 = f9 ^ g9; - b = -b; - x0 &= b; - x1 &= b; - x2 &= b; - x3 &= b; - x4 &= b; - x5 &= b; - x6 &= b; - x7 &= b; - x8 &= b; - x9 &= b; - f[0] = f0 ^ x0; - f[1] = f1 ^ x1; - f[2] = f2 ^ x2; - f[3] = f3 ^ x3; - f[4] = f4 ^ x4; - f[5] = f5 ^ x5; - f[6] = f6 ^ x6; - f[7] = f7 ^ x7; - f[8] = f8 ^ x8; - f[9] = f9 ^ x9; - g[0] = g0 ^ x0; - g[1] = g1 ^ x1; - g[2] = g2 ^ x2; - g[3] = g3 ^ x3; - g[4] = g4 ^ x4; - g[5] = g5 ^ x5; - g[6] = g6 ^ x6; - g[7] = g7 ^ x7; - g[8] = g8 ^ x8; - g[9] = g9 ^ x9; -} - -static crypto_uint64 load_3(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - return result; -} - -static crypto_uint64 load_4(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - result |= ((crypto_uint64) in[3]) << 24; - return result; -} - -void fe_frombytes(fe h,const unsigned char *s) -{ - crypto_int64 h0 = load_4(s); - crypto_int64 h1 = load_3(s + 4) << 6; - crypto_int64 h2 = load_3(s + 7) << 5; - crypto_int64 h3 = load_3(s + 10) << 3; - crypto_int64 h4 = load_3(s + 13) << 2; - crypto_int64 h5 = load_4(s + 16); - crypto_int64 h6 = load_3(s + 20) << 7; - crypto_int64 h7 = load_3(s + 23) << 5; - crypto_int64 h8 = load_3(s + 26) << 4; - crypto_int64 h9 = load_3(s + 29) << 2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - - -/* -h = f * g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - -Postconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -*/ - -/* -Notes on implementation strategy: - -Using schoolbook multiplication. -Karatsuba would save a little in some cost models. - -Most multiplications by 2 and 19 are 32-bit precomputations; -cheaper than 64-bit postcomputations. - -There is one remaining multiplication by 19 in the carry chain; -one *19 precomputation can be merged into this, -but the resulting data flow is considerably less clean. - -There are 12 carries below. -10 of them are 2-way parallelizable and vectorizable. -Can get away with 11 carries, but then data flow is much deeper. - -With tighter constraints on inputs can squeeze carries into int32. -*/ - -void fe_mul(fe h,fe f,fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 g1_19 = 19 * g1; /* 1.4*2^29 */ - crypto_int32 g2_19 = 19 * g2; /* 1.4*2^30; still ok */ - crypto_int32 g3_19 = 19 * g3; - crypto_int32 g4_19 = 19 * g4; - crypto_int32 g5_19 = 19 * g5; - crypto_int32 g6_19 = 19 * g6; - crypto_int32 g7_19 = 19 * g7; - crypto_int32 g8_19 = 19 * g8; - crypto_int32 g9_19 = 19 * g9; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f9_2 = 2 * f9; - crypto_int64 f0g0 = f0 * (crypto_int64) g0; - crypto_int64 f0g1 = f0 * (crypto_int64) g1; - crypto_int64 f0g2 = f0 * (crypto_int64) g2; - crypto_int64 f0g3 = f0 * (crypto_int64) g3; - crypto_int64 f0g4 = f0 * (crypto_int64) g4; - crypto_int64 f0g5 = f0 * (crypto_int64) g5; - crypto_int64 f0g6 = f0 * (crypto_int64) g6; - crypto_int64 f0g7 = f0 * (crypto_int64) g7; - crypto_int64 f0g8 = f0 * (crypto_int64) g8; - crypto_int64 f0g9 = f0 * (crypto_int64) g9; - crypto_int64 f1g0 = f1 * (crypto_int64) g0; - crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; - crypto_int64 f1g2 = f1 * (crypto_int64) g2; - crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; - crypto_int64 f1g4 = f1 * (crypto_int64) g4; - crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; - crypto_int64 f1g6 = f1 * (crypto_int64) g6; - crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; - crypto_int64 f1g8 = f1 * (crypto_int64) g8; - crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; - crypto_int64 f2g0 = f2 * (crypto_int64) g0; - crypto_int64 f2g1 = f2 * (crypto_int64) g1; - crypto_int64 f2g2 = f2 * (crypto_int64) g2; - crypto_int64 f2g3 = f2 * (crypto_int64) g3; - crypto_int64 f2g4 = f2 * (crypto_int64) g4; - crypto_int64 f2g5 = f2 * (crypto_int64) g5; - crypto_int64 f2g6 = f2 * (crypto_int64) g6; - crypto_int64 f2g7 = f2 * (crypto_int64) g7; - crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; - crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; - crypto_int64 f3g0 = f3 * (crypto_int64) g0; - crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; - crypto_int64 f3g2 = f3 * (crypto_int64) g2; - crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; - crypto_int64 f3g4 = f3 * (crypto_int64) g4; - crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; - crypto_int64 f3g6 = f3 * (crypto_int64) g6; - crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; - crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; - crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; - crypto_int64 f4g0 = f4 * (crypto_int64) g0; - crypto_int64 f4g1 = f4 * (crypto_int64) g1; - crypto_int64 f4g2 = f4 * (crypto_int64) g2; - crypto_int64 f4g3 = f4 * (crypto_int64) g3; - crypto_int64 f4g4 = f4 * (crypto_int64) g4; - crypto_int64 f4g5 = f4 * (crypto_int64) g5; - crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; - crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; - crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; - crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; - crypto_int64 f5g0 = f5 * (crypto_int64) g0; - crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; - crypto_int64 f5g2 = f5 * (crypto_int64) g2; - crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; - crypto_int64 f5g4 = f5 * (crypto_int64) g4; - crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; - crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; - crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; - crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; - crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; - crypto_int64 f6g0 = f6 * (crypto_int64) g0; - crypto_int64 f6g1 = f6 * (crypto_int64) g1; - crypto_int64 f6g2 = f6 * (crypto_int64) g2; - crypto_int64 f6g3 = f6 * (crypto_int64) g3; - crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; - crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; - crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; - crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; - crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; - crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; - crypto_int64 f7g0 = f7 * (crypto_int64) g0; - crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; - crypto_int64 f7g2 = f7 * (crypto_int64) g2; - crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; - crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; - crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; - crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; - crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; - crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; - crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; - crypto_int64 f8g0 = f8 * (crypto_int64) g0; - crypto_int64 f8g1 = f8 * (crypto_int64) g1; - crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; - crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; - crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; - crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; - crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; - crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; - crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; - crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; - crypto_int64 f9g0 = f9 * (crypto_int64) g0; - crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; - crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; - crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; - crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; - crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; - crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; - crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; - crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; - crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; - crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; - crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; - crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; - crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; - crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; - crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; - crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; - crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; - crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; - crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - /* - |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.51*2^58 */ - /* |h5| <= 1.51*2^58 */ - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.21*2^59 */ - /* |h6| <= 1.21*2^59 */ - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.51*2^58 */ - /* |h7| <= 1.51*2^58 */ - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.52*2^33 */ - /* |h8| <= 1.52*2^33 */ - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.51*2^58 */ - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.8*2^37 */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = f * 121666 -Can overlap h with f. - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - -Postconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -*/ - -void fe_mul121666(fe h,fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int64 h0 = f0 * (crypto_int64) 121666; - crypto_int64 h1 = f1 * (crypto_int64) 121666; - crypto_int64 h2 = f2 * (crypto_int64) 121666; - crypto_int64 h3 = f3 * (crypto_int64) 121666; - crypto_int64 h4 = f4 * (crypto_int64) 121666; - crypto_int64 h5 = f5 * (crypto_int64) 121666; - crypto_int64 h6 = f6 * (crypto_int64) 121666; - crypto_int64 h7 = f7 * (crypto_int64) 121666; - crypto_int64 h8 = f8 * (crypto_int64) 121666; - crypto_int64 h9 = f9 * (crypto_int64) 121666; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = f * f -Can overlap h with f. - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - -Postconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -*/ - -/* -See fe_mul.c for discussion of implementation strategy. -*/ - -void fe_sq(fe h,fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 f0_2 = 2 * f0; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f2_2 = 2 * f2; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f4_2 = 2 * f4; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f6_2 = 2 * f6; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f5_38 = 38 * f5; /* 1.31*2^30 */ - crypto_int32 f6_19 = 19 * f6; /* 1.31*2^30 */ - crypto_int32 f7_38 = 38 * f7; /* 1.31*2^30 */ - crypto_int32 f8_19 = 19 * f8; /* 1.31*2^30 */ - crypto_int32 f9_38 = 38 * f9; /* 1.31*2^30 */ - crypto_int64 f0f0 = f0 * (crypto_int64) f0; - crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; - crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; - crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; - crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; - crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; - crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; - crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; - crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; - crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; - crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; - crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; - crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; - crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; - crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; - crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; - crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; - crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; - crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; - crypto_int64 f2f2 = f2 * (crypto_int64) f2; - crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; - crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; - crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; - crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; - crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; - crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; - crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; - crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; - crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; - crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; - crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; - crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; - crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; - crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; - crypto_int64 f4f4 = f4 * (crypto_int64) f4; - crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; - crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; - crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; - crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; - crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; - crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; - crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; - crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; - crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; - crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; - crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; - crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; - crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; - crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; - crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; - crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; - crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; - crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; - crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; - crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; - crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; - crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; - crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; - crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; - crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; - crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; - crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; - crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; - crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; - crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = f - g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -void fe_sub(fe h,fe f,fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 - g0; - crypto_int32 h1 = f1 - g1; - crypto_int32 h2 = f2 - g2; - crypto_int32 h3 = f3 - g3; - crypto_int32 h4 = f4 - g4; - crypto_int32 h5 = f5 - g5; - crypto_int32 h6 = f6 - g6; - crypto_int32 h7 = f7 - g7; - crypto_int32 h8 = f8 - g8; - crypto_int32 h9 = f9 - g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -Preconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Write p=2^255-19; q=floor(h/p). -Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). - -Proof: - Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. - Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. - - Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). - Then 0> 25; - q = (h0 + q) >> 26; - q = (h1 + q) >> 25; - q = (h2 + q) >> 26; - q = (h3 + q) >> 25; - q = (h4 + q) >> 26; - q = (h5 + q) >> 25; - q = (h6 + q) >> 26; - q = (h7 + q) >> 25; - q = (h8 + q) >> 26; - q = (h9 + q) >> 25; - - /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ - h0 += 19 * q; - /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ - - carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; - carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; - carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; - carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; - carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; - carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; - carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; - carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; - carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; - carry9 = h9 >> 25; h9 -= carry9 << 25; - /* h10 = carry9 */ - - /* - Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - Have h0+...+2^230 h9 between 0 and 2^255-1; - evidently 2^255 h10-2^255 q = 0. - Goal: Output h0+...+2^230 h9. - */ - - s[0] = h0 >> 0; - s[1] = h0 >> 8; - s[2] = h0 >> 16; - s[3] = (h0 >> 24) | (h1 << 2); - s[4] = h1 >> 6; - s[5] = h1 >> 14; - s[6] = (h1 >> 22) | (h2 << 3); - s[7] = h2 >> 5; - s[8] = h2 >> 13; - s[9] = (h2 >> 21) | (h3 << 5); - s[10] = h3 >> 3; - s[11] = h3 >> 11; - s[12] = (h3 >> 19) | (h4 << 6); - s[13] = h4 >> 2; - s[14] = h4 >> 10; - s[15] = h4 >> 18; - s[16] = h5 >> 0; - s[17] = h5 >> 8; - s[18] = h5 >> 16; - s[19] = (h5 >> 24) | (h6 << 1); - s[20] = h6 >> 7; - s[21] = h6 >> 15; - s[22] = (h6 >> 23) | (h7 << 3); - s[23] = h7 >> 5; - s[24] = h7 >> 13; - s[25] = (h7 >> 21) | (h8 << 4); - s[26] = h8 >> 4; - s[27] = h8 >> 12; - s[28] = (h8 >> 20) | (h9 << 6); - s[29] = h9 >> 2; - s[30] = h9 >> 10; - s[31] = h9 >> 18; -} - -void fe_invert(fe out,fe z) -{ - fe t0; - fe t1; - fe t2; - fe t3; - int i; - - -/* qhasm: fe z1 */ - -/* qhasm: fe z2 */ - -/* qhasm: fe z8 */ - -/* qhasm: fe z9 */ - -/* qhasm: fe z11 */ - -/* qhasm: fe z22 */ - -/* qhasm: fe z_5_0 */ - -/* qhasm: fe z_10_5 */ - -/* qhasm: fe z_10_0 */ - -/* qhasm: fe z_20_10 */ - -/* qhasm: fe z_20_0 */ - -/* qhasm: fe z_40_20 */ - -/* qhasm: fe z_40_0 */ - -/* qhasm: fe z_50_10 */ - -/* qhasm: fe z_50_0 */ - -/* qhasm: fe z_100_50 */ - -/* qhasm: fe z_100_0 */ - -/* qhasm: fe z_200_100 */ - -/* qhasm: fe z_200_0 */ - -/* qhasm: fe z_250_50 */ - -/* qhasm: fe z_250_0 */ - -/* qhasm: fe z_255_5 */ - -/* qhasm: fe z_255_21 */ - -/* qhasm: enter pow225521 */ - -/* qhasm: z2 = z1^2^1 */ -/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ -/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ -fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); - -/* qhasm: z8 = z2^2^2 */ -/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ -/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ -fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); - -/* qhasm: z9 = z1*z8 */ -/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ -/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ -fe_sq(t2,t0); for (i = 1;i < 1;++i) fe_sq(t2,t2); - -/* qhasm: z_5_0 = z9*z22 */ -/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ -/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ -fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); - -/* qhasm: z_10_0 = z_10_5*z_5_0 */ -/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ -/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ -fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_20_0 = z_20_10*z_10_0 */ -/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ -/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ -fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); - -/* qhasm: z_40_0 = z_40_20*z_20_0 */ -/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ -/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ -fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_50_0 = z_50_10*z_10_0 */ -/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ -/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ -fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_100_0 = z_100_50*z_50_0 */ -/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ -/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ -fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); - -/* qhasm: z_200_0 = z_200_100*z_100_0 */ -/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ -/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ -fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_250_0 = z_250_50*z_50_0 */ -/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ -/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ -fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); - -/* qhasm: z_255_21 = z_255_5*z11 */ -/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,= 0;--pos) { - b = e[pos / 8] >> (pos & 7); - b &= 1; - swap ^= b; - fe_cswap(x2,x3,swap); - fe_cswap(z2,z3,swap); - swap = b; -/* qhasm: fe X2 */ - -/* qhasm: fe Z2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe X4 */ - -/* qhasm: fe Z4 */ - -/* qhasm: fe X5 */ - -/* qhasm: fe Z5 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: fe E */ - -/* qhasm: fe AA */ - -/* qhasm: fe BB */ - -/* qhasm: fe DA */ - -/* qhasm: fe CB */ - -/* qhasm: fe t0 */ - -/* qhasm: fe t1 */ - -/* qhasm: fe t2 */ - -/* qhasm: fe t3 */ - -/* qhasm: fe t4 */ - -/* qhasm: enter ladder */ - -/* qhasm: D = X3-Z3 */ -/* asm 1: fe_sub(>D=fe#5,D=tmp0,B=fe#6,B=tmp1,A=fe#1,A=x2,C=fe#2,C=z2,DA=fe#4,DA=z3,CB=fe#2,CB=z2,BB=fe#5,BB=tmp0,AA=fe#6,AA=tmp1,t0=fe#3,t0=x3,t1=fe#2,t1=z2,X4=fe#1,X4=x2,E=fe#6,E=tmp1,t2=fe#2,t2=z2,t3=fe#4,t3=z3,X5=fe#3,X5=x3,t4=fe#5,t4=tmp0,Z5=fe#4,x1,Z5=z3,x1,Z4=fe#2,Z4=z2, - -typedef unsigned char ed25519_signature[64]; -typedef unsigned char ed25519_public_key[32]; -typedef unsigned char ed25519_secret_key[32]; - -typedef unsigned char curved25519_key[32]; - -void ed25519_publickey(const ed25519_secret_key sk, ed25519_public_key pk); -int ed25519_sign_open(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); -void ed25519_sign(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); - -int ed25519_sign_open_batch(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); - -void ed25519_randombytes_unsafe(void *out, size_t count); - -void curved25519_scalarmult_basepoint(curved25519_key pk, const curved25519_key e); - -#if defined(ED25519_SSE2) -void ed25519_publickey_sse2(const ed25519_secret_key sk, ed25519_public_key pk); -int ed25519_sign_open_sse2(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS); -void ed25519_sign_sse2(const unsigned char *m, size_t mlen, const ed25519_secret_key sk, const ed25519_public_key pk, ed25519_signature RS); - -int ed25519_sign_open_batch_sse2(const unsigned char **m, size_t *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid); - -void ed25519_randombytes_unsafe_sse2(void *out, size_t count); - -void curved25519_scalarmult_basepoint_sse2(curved25519_key pk, const curved25519_key e); -#endif - -#endif // ED25519_H diff --git a/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.c b/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.c deleted file mode 100644 index a8e802df2..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.c +++ /dev/null @@ -1,4647 +0,0 @@ -#include -#include -#include - -static int crypto_verify_32(const unsigned char *x,const unsigned char *y) -{ - unsigned int differentbits = 0; -#define F(i) differentbits |= x[i] ^ y[i]; - F(0) - F(1) - F(2) - F(3) - F(4) - F(5) - F(6) - F(7) - F(8) - F(9) - F(10) - F(11) - F(12) - F(13) - F(14) - F(15) - F(16) - F(17) - F(18) - F(19) - F(20) - F(21) - F(22) - F(23) - F(24) - F(25) - F(26) - F(27) - F(28) - F(29) - F(30) - F(31) - return (1 & ((differentbits - 1) >> 8)) - 1; -} - -#if defined(ED25519_REFHASH) - -/* reference/slow SHA-512. really, do not use this */ - -#define HASH_BLOCK_SIZE 128 -#define HASH_DIGEST_SIZE 64 - -typedef struct sha512_state_t { - uint64_t H[8]; - uint64_t T[2]; - uint32_t leftover; - uint8_t buffer[HASH_BLOCK_SIZE]; -} sha512_state; - -typedef sha512_state ed25519_hash_context; - -static const uint64_t sha512_constants[80] = { - 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, - 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, - 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, - 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull, - 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, - 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, - 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, - 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull, - 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull, - 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull, - 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, - 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, - 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, - 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, - 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull, - 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, - 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, - 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull, - 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull, - 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull -}; - -static uint64_t -sha512_ROTR64(uint64_t x, int k) { - return (x >> k) | (x << (64 - k)); -} - -static uint64_t -sha512_LOAD64_BE(const uint8_t *p) { - return - ((uint64_t)p[0] << 56) | - ((uint64_t)p[1] << 48) | - ((uint64_t)p[2] << 40) | - ((uint64_t)p[3] << 32) | - ((uint64_t)p[4] << 24) | - ((uint64_t)p[5] << 16) | - ((uint64_t)p[6] << 8) | - ((uint64_t)p[7] ); -} - -static void -sha512_STORE64_BE(uint8_t *p, uint64_t v) { - p[0] = (uint8_t)(v >> 56); - p[1] = (uint8_t)(v >> 48); - p[2] = (uint8_t)(v >> 40); - p[3] = (uint8_t)(v >> 32); - p[4] = (uint8_t)(v >> 24); - p[5] = (uint8_t)(v >> 16); - p[6] = (uint8_t)(v >> 8); - p[7] = (uint8_t)(v ); -} - -#define Ch(x,y,z) (z ^ (x & (y ^ z))) -#define Maj(x,y,z) (((x | y) & z) | (x & y)) -#define S0(x) (sha512_ROTR64(x, 28) ^ sha512_ROTR64(x, 34) ^ sha512_ROTR64(x, 39)) -#define S1(x) (sha512_ROTR64(x, 14) ^ sha512_ROTR64(x, 18) ^ sha512_ROTR64(x, 41)) -#define G0(x) (sha512_ROTR64(x, 1) ^ sha512_ROTR64(x, 8) ^ (x >> 7)) -#define G1(x) (sha512_ROTR64(x, 19) ^ sha512_ROTR64(x, 61) ^ (x >> 6)) -#define W0(in,i) (sha512_LOAD64_BE(&in[i * 8])) -#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) -#define STEP(i) \ - t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ - t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \ - r[7] = r[6]; \ - r[6] = r[5]; \ - r[5] = r[4]; \ - r[4] = r[3] + t0; \ - r[3] = r[2]; \ - r[2] = r[1]; \ - r[1] = r[0]; \ - r[0] = t0 + t1; - -static void -sha512_blocks(sha512_state *S, const uint8_t *in, size_t blocks) { - uint64_t r[8], w[80], t0, t1; - size_t i; - - for (i = 0; i < 8; i++) r[i] = S->H[i]; - - while (blocks--) { - for (i = 0; i < 16; i++) { w[i] = W0(in, i); } - for (i = 16; i < 80; i++) { w[i] = W1(i); } - for (i = 0; i < 80; i++) { STEP(i); } - for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } - S->T[0] += HASH_BLOCK_SIZE * 8; - S->T[1] += (!S->T[0]) ? 1 : 0; - in += HASH_BLOCK_SIZE; - } -} - -static void -ed25519_hash_init(sha512_state *S) { - S->H[0] = 0x6a09e667f3bcc908ull; - S->H[1] = 0xbb67ae8584caa73bull; - S->H[2] = 0x3c6ef372fe94f82bull; - S->H[3] = 0xa54ff53a5f1d36f1ull; - S->H[4] = 0x510e527fade682d1ull; - S->H[5] = 0x9b05688c2b3e6c1full; - S->H[6] = 0x1f83d9abfb41bd6bull; - S->H[7] = 0x5be0cd19137e2179ull; - S->T[0] = 0; - S->T[1] = 0; - S->leftover = 0; -} - -static void -ed25519_hash_update(sha512_state *S, const uint8_t *in, size_t inlen) { - size_t blocks, want; - - /* handle the previous data */ - if (S->leftover) { - want = (HASH_BLOCK_SIZE - S->leftover); - want = (want < inlen) ? want : inlen; - memcpy(S->buffer + S->leftover, in, want); - S->leftover += (uint32_t)want; - if (S->leftover < HASH_BLOCK_SIZE) - return; - in += want; - inlen -= want; - sha512_blocks(S, S->buffer, 1); - } - - /* handle the current data */ - blocks = (inlen & ~(HASH_BLOCK_SIZE - 1)); - S->leftover = (uint32_t)(inlen - blocks); - if (blocks) { - sha512_blocks(S, in, blocks / HASH_BLOCK_SIZE); - in += blocks; - } - - /* handle leftover data */ - if (S->leftover) - memcpy(S->buffer, in, S->leftover); -} - -static void -ed25519_hash_final(sha512_state *S, uint8_t *hash) { - uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1]; - - S->buffer[S->leftover] = 0x80; - if (S->leftover <= 111) { - memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); - } else { - memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); - sha512_blocks(S, S->buffer, 1); - memset(S->buffer, 0, 112); - } - - sha512_STORE64_BE(S->buffer + 112, t1); - sha512_STORE64_BE(S->buffer + 120, t0); - sha512_blocks(S, S->buffer, 1); - - sha512_STORE64_BE(&hash[ 0], S->H[0]); - sha512_STORE64_BE(&hash[ 8], S->H[1]); - sha512_STORE64_BE(&hash[16], S->H[2]); - sha512_STORE64_BE(&hash[24], S->H[3]); - sha512_STORE64_BE(&hash[32], S->H[4]); - sha512_STORE64_BE(&hash[40], S->H[5]); - sha512_STORE64_BE(&hash[48], S->H[6]); - sha512_STORE64_BE(&hash[56], S->H[7]); -} - -static void -crypto_hash_sha512(unsigned char *hash, const unsigned char *in, size_t inlen) { - ed25519_hash_context ctx; - ed25519_hash_init(&ctx); - ed25519_hash_update(&ctx, in, inlen); - ed25519_hash_final(&ctx, hash); -} - -#else - -#include - -static void -crypto_hash_sha512(unsigned char *hash, const unsigned char *in, size_t inlen) { - SHA512(in, inlen, hash); -} - -#endif - - - - -typedef int32_t crypto_int32; -typedef uint32_t crypto_uint32; -typedef int64_t crypto_int64; -typedef uint64_t crypto_uint64; - -typedef crypto_int32 fe[10]; - -/* -h = 0 -*/ - -static void fe_0(fe h) -{ - h[0] = 0; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} - -/* -h = 1 -*/ - -static void fe_1(fe h) -{ - h[0] = 1; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} - -/* -h = f + g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -static void fe_add(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 + g0; - crypto_int32 h1 = f1 + g1; - crypto_int32 h2 = f2 + g2; - crypto_int32 h3 = f3 + g3; - crypto_int32 h4 = f4 + g4; - crypto_int32 h5 = f5 + g5; - crypto_int32 h6 = f6 + g6; - crypto_int32 h7 = f7 + g7; - crypto_int32 h8 = f8 + g8; - crypto_int32 h9 = f9 + g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - - -/* -Replace (f,g) with (g,g) if b == 1; -replace (f,g) with (f,g) if b == 0. - -Preconditions: b in {0,1}. -*/ - -static void fe_cmov(fe f,const fe g,unsigned int b) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 x0 = f0 ^ g0; - crypto_int32 x1 = f1 ^ g1; - crypto_int32 x2 = f2 ^ g2; - crypto_int32 x3 = f3 ^ g3; - crypto_int32 x4 = f4 ^ g4; - crypto_int32 x5 = f5 ^ g5; - crypto_int32 x6 = f6 ^ g6; - crypto_int32 x7 = f7 ^ g7; - crypto_int32 x8 = f8 ^ g8; - crypto_int32 x9 = f9 ^ g9; - b = -b; - x0 &= b; - x1 &= b; - x2 &= b; - x3 &= b; - x4 &= b; - x5 &= b; - x6 &= b; - x7 &= b; - x8 &= b; - x9 &= b; - f[0] = f0 ^ x0; - f[1] = f1 ^ x1; - f[2] = f2 ^ x2; - f[3] = f3 ^ x3; - f[4] = f4 ^ x4; - f[5] = f5 ^ x5; - f[6] = f6 ^ x6; - f[7] = f7 ^ x7; - f[8] = f8 ^ x8; - f[9] = f9 ^ x9; -} - - -/* -h = f -*/ - -static void fe_copy(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - h[0] = f0; - h[1] = f1; - h[2] = f2; - h[3] = f3; - h[4] = f4; - h[5] = f5; - h[6] = f6; - h[7] = f7; - h[8] = f8; - h[9] = f9; -} - - -static crypto_uint64 load_3(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - return result; -} - -static crypto_uint64 load_4(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - result |= ((crypto_uint64) in[3]) << 24; - return result; -} - -/* -Ignores top bit of h. -*/ - -static void fe_frombytes(fe h,const unsigned char *s) -{ - crypto_int64 h0 = load_4(s); - crypto_int64 h1 = load_3(s + 4) << 6; - crypto_int64 h2 = load_3(s + 7) << 5; - crypto_int64 h3 = load_3(s + 10) << 3; - crypto_int64 h4 = load_3(s + 13) << 2; - crypto_int64 h5 = load_4(s + 16); - crypto_int64 h6 = load_3(s + 20) << 7; - crypto_int64 h7 = load_3(s + 23) << 5; - crypto_int64 h8 = load_3(s + 26) << 4; - crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -Preconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - -Write p=2^255-19; q=floor(h/p). -Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). - -Proof: - Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. - Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. - - Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). - Then 0> 25; - q = (h0 + q) >> 26; - q = (h1 + q) >> 25; - q = (h2 + q) >> 26; - q = (h3 + q) >> 25; - q = (h4 + q) >> 26; - q = (h5 + q) >> 25; - q = (h6 + q) >> 26; - q = (h7 + q) >> 25; - q = (h8 + q) >> 26; - q = (h9 + q) >> 25; - - /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ - h0 += 19 * q; - /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ - - carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; - carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; - carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; - carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; - carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; - carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; - carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; - carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; - carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; - carry9 = h9 >> 25; h9 -= carry9 << 25; - /* h10 = carry9 */ - - /* - Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - Have h0+...+2^230 h9 between 0 and 2^255-1; - evidently 2^255 h10-2^255 q = 0. - Goal: Output h0+...+2^230 h9. - */ - - s[0] = h0 >> 0; - s[1] = h0 >> 8; - s[2] = h0 >> 16; - s[3] = (h0 >> 24) | (h1 << 2); - s[4] = h1 >> 6; - s[5] = h1 >> 14; - s[6] = (h1 >> 22) | (h2 << 3); - s[7] = h2 >> 5; - s[8] = h2 >> 13; - s[9] = (h2 >> 21) | (h3 << 5); - s[10] = h3 >> 3; - s[11] = h3 >> 11; - s[12] = (h3 >> 19) | (h4 << 6); - s[13] = h4 >> 2; - s[14] = h4 >> 10; - s[15] = h4 >> 18; - s[16] = h5 >> 0; - s[17] = h5 >> 8; - s[18] = h5 >> 16; - s[19] = (h5 >> 24) | (h6 << 1); - s[20] = h6 >> 7; - s[21] = h6 >> 15; - s[22] = (h6 >> 23) | (h7 << 3); - s[23] = h7 >> 5; - s[24] = h7 >> 13; - s[25] = (h7 >> 21) | (h8 << 4); - s[26] = h8 >> 4; - s[27] = h8 >> 12; - s[28] = (h8 >> 20) | (h9 << 6); - s[29] = h9 >> 2; - s[30] = h9 >> 10; - s[31] = h9 >> 18; -} - - -/* -h = f - g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -static void fe_sub(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 - g0; - crypto_int32 h1 = f1 - g1; - crypto_int32 h2 = f2 - g2; - crypto_int32 h3 = f3 - g3; - crypto_int32 h4 = f4 - g4; - crypto_int32 h5 = f5 - g5; - crypto_int32 h6 = f6 - g6; - crypto_int32 h7 = f7 - g7; - crypto_int32 h8 = f8 - g8; - crypto_int32 h9 = f9 - g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - - -/* -h = f * f -Can overlap h with f. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -See fe_mul.c for discussion of implementation strategy. -*/ - -static void fe_sq(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 f0_2 = 2 * f0; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f2_2 = 2 * f2; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f4_2 = 2 * f4; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f6_2 = 2 * f6; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ - crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ - crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ - crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ - crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ - crypto_int64 f0f0 = f0 * (crypto_int64) f0; - crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; - crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; - crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; - crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; - crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; - crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; - crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; - crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; - crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; - crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; - crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; - crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; - crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; - crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; - crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; - crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; - crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; - crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; - crypto_int64 f2f2 = f2 * (crypto_int64) f2; - crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; - crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; - crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; - crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; - crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; - crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; - crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; - crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; - crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; - crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; - crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; - crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; - crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; - crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; - crypto_int64 f4f4 = f4 * (crypto_int64) f4; - crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; - crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; - crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; - crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; - crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; - crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; - crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; - crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; - crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; - crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; - crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; - crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; - crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; - crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; - crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; - crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; - crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; - crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; - crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; - crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; - crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; - crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; - crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; - crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; - crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; - crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; - crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; - crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; - crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; - crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = 2 * f * f -Can overlap h with f. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -See fe_mul.c for discussion of implementation strategy. -*/ - -static void fe_sq2(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 f0_2 = 2 * f0; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f2_2 = 2 * f2; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f4_2 = 2 * f4; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f6_2 = 2 * f6; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ - crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ - crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ - crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ - crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ - crypto_int64 f0f0 = f0 * (crypto_int64) f0; - crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; - crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; - crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; - crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; - crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; - crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; - crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; - crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; - crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; - crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; - crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; - crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; - crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; - crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; - crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; - crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; - crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; - crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; - crypto_int64 f2f2 = f2 * (crypto_int64) f2; - crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; - crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; - crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; - crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; - crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; - crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; - crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; - crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; - crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; - crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; - crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; - crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; - crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; - crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; - crypto_int64 f4f4 = f4 * (crypto_int64) f4; - crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; - crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; - crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; - crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; - crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; - crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; - crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; - crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; - crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; - crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; - crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; - crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; - crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; - crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; - crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; - crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; - crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; - crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; - crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; - crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; - crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; - crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; - crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; - crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; - crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; - crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; - crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; - crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; - crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; - crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - h0 += h0; - h1 += h1; - h2 += h2; - h3 += h3; - h4 += h4; - h5 += h5; - h6 += h6; - h7 += h7; - h8 += h8; - h9 += h9; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -/* -h = f * g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -Notes on implementation strategy: - -Using schoolbook multiplication. -Karatsuba would save a little in some cost models. - -Most multiplications by 2 and 19 are 32-bit precomputations; -cheaper than 64-bit postcomputations. - -There is one remaining multiplication by 19 in the carry chain; -one *19 precomputation can be merged into this, -but the resulting data flow is considerably less clean. - -There are 12 carries below. -10 of them are 2-way parallelizable and vectorizable. -Can get away with 11 carries, but then data flow is much deeper. - -With tighter constraints on inputs can squeeze carries into int32. -*/ - -static void fe_mul(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 g1_19 = 19 * g1; /* 1.959375*2^29 */ - crypto_int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ - crypto_int32 g3_19 = 19 * g3; - crypto_int32 g4_19 = 19 * g4; - crypto_int32 g5_19 = 19 * g5; - crypto_int32 g6_19 = 19 * g6; - crypto_int32 g7_19 = 19 * g7; - crypto_int32 g8_19 = 19 * g8; - crypto_int32 g9_19 = 19 * g9; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f9_2 = 2 * f9; - crypto_int64 f0g0 = f0 * (crypto_int64) g0; - crypto_int64 f0g1 = f0 * (crypto_int64) g1; - crypto_int64 f0g2 = f0 * (crypto_int64) g2; - crypto_int64 f0g3 = f0 * (crypto_int64) g3; - crypto_int64 f0g4 = f0 * (crypto_int64) g4; - crypto_int64 f0g5 = f0 * (crypto_int64) g5; - crypto_int64 f0g6 = f0 * (crypto_int64) g6; - crypto_int64 f0g7 = f0 * (crypto_int64) g7; - crypto_int64 f0g8 = f0 * (crypto_int64) g8; - crypto_int64 f0g9 = f0 * (crypto_int64) g9; - crypto_int64 f1g0 = f1 * (crypto_int64) g0; - crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; - crypto_int64 f1g2 = f1 * (crypto_int64) g2; - crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; - crypto_int64 f1g4 = f1 * (crypto_int64) g4; - crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; - crypto_int64 f1g6 = f1 * (crypto_int64) g6; - crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; - crypto_int64 f1g8 = f1 * (crypto_int64) g8; - crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; - crypto_int64 f2g0 = f2 * (crypto_int64) g0; - crypto_int64 f2g1 = f2 * (crypto_int64) g1; - crypto_int64 f2g2 = f2 * (crypto_int64) g2; - crypto_int64 f2g3 = f2 * (crypto_int64) g3; - crypto_int64 f2g4 = f2 * (crypto_int64) g4; - crypto_int64 f2g5 = f2 * (crypto_int64) g5; - crypto_int64 f2g6 = f2 * (crypto_int64) g6; - crypto_int64 f2g7 = f2 * (crypto_int64) g7; - crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; - crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; - crypto_int64 f3g0 = f3 * (crypto_int64) g0; - crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; - crypto_int64 f3g2 = f3 * (crypto_int64) g2; - crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; - crypto_int64 f3g4 = f3 * (crypto_int64) g4; - crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; - crypto_int64 f3g6 = f3 * (crypto_int64) g6; - crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; - crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; - crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; - crypto_int64 f4g0 = f4 * (crypto_int64) g0; - crypto_int64 f4g1 = f4 * (crypto_int64) g1; - crypto_int64 f4g2 = f4 * (crypto_int64) g2; - crypto_int64 f4g3 = f4 * (crypto_int64) g3; - crypto_int64 f4g4 = f4 * (crypto_int64) g4; - crypto_int64 f4g5 = f4 * (crypto_int64) g5; - crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; - crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; - crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; - crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; - crypto_int64 f5g0 = f5 * (crypto_int64) g0; - crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; - crypto_int64 f5g2 = f5 * (crypto_int64) g2; - crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; - crypto_int64 f5g4 = f5 * (crypto_int64) g4; - crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; - crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; - crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; - crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; - crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; - crypto_int64 f6g0 = f6 * (crypto_int64) g0; - crypto_int64 f6g1 = f6 * (crypto_int64) g1; - crypto_int64 f6g2 = f6 * (crypto_int64) g2; - crypto_int64 f6g3 = f6 * (crypto_int64) g3; - crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; - crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; - crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; - crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; - crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; - crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; - crypto_int64 f7g0 = f7 * (crypto_int64) g0; - crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; - crypto_int64 f7g2 = f7 * (crypto_int64) g2; - crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; - crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; - crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; - crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; - crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; - crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; - crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; - crypto_int64 f8g0 = f8 * (crypto_int64) g0; - crypto_int64 f8g1 = f8 * (crypto_int64) g1; - crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; - crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; - crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; - crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; - crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; - crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; - crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; - crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; - crypto_int64 f9g0 = f9 * (crypto_int64) g0; - crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; - crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; - crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; - crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; - crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; - crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; - crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; - crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; - crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; - crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; - crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; - crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; - crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; - crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; - crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; - crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; - crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; - crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; - crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - /* - |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 - */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.71*2^59 */ - /* |h5| <= 1.71*2^59 */ - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.41*2^60 */ - /* |h6| <= 1.41*2^60 */ - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.71*2^59 */ - /* |h7| <= 1.71*2^59 */ - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.72*2^34 */ - /* |h8| <= 1.41*2^60 */ - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.71*2^59 */ - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.1*2^39 */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - - -/* -return 1 if f is in {1,3,5,...,q-2} -return 0 if f is in {0,2,4,...,q-1} - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -static int fe_isnegative(const fe f) -{ - unsigned char s[32]; - fe_tobytes(s,f); - return s[0] & 1; -} - - -/* -return 1 if f == 0 -return 0 if f != 0 - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -static const unsigned char zero[32] = {0}; - -static int fe_isnonzero(const fe f) -{ - unsigned char s[32]; - fe_tobytes(s,f); - return crypto_verify_32(s,zero); -} - -/* -h = -f - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -*/ - -static void fe_neg(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 h0 = -f0; - crypto_int32 h1 = -f1; - crypto_int32 h2 = -f2; - crypto_int32 h3 = -f3; - crypto_int32 h4 = -f4; - crypto_int32 h5 = -f5; - crypto_int32 h6 = -f6; - crypto_int32 h7 = -f7; - crypto_int32 h8 = -f8; - crypto_int32 h9 = -f9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} - -static void fe_invert(fe out,const fe z) -{ - fe t0; - fe t1; - fe t2; - fe t3; - int i; - - -/* qhasm: fe z1 */ - -/* qhasm: fe z2 */ - -/* qhasm: fe z8 */ - -/* qhasm: fe z9 */ - -/* qhasm: fe z11 */ - -/* qhasm: fe z22 */ - -/* qhasm: fe z_5_0 */ - -/* qhasm: fe z_10_5 */ - -/* qhasm: fe z_10_0 */ - -/* qhasm: fe z_20_10 */ - -/* qhasm: fe z_20_0 */ - -/* qhasm: fe z_40_20 */ - -/* qhasm: fe z_40_0 */ - -/* qhasm: fe z_50_10 */ - -/* qhasm: fe z_50_0 */ - -/* qhasm: fe z_100_50 */ - -/* qhasm: fe z_100_0 */ - -/* qhasm: fe z_200_100 */ - -/* qhasm: fe z_200_0 */ - -/* qhasm: fe z_250_50 */ - -/* qhasm: fe z_250_0 */ - -/* qhasm: fe z_255_5 */ - -/* qhasm: fe z_255_21 */ - -/* qhasm: enter pow225521 */ - -/* qhasm: z2 = z1^2^1 */ -/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ -/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ -fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); - -/* qhasm: z8 = z2^2^2 */ -/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ -/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ -fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); - -/* qhasm: z9 = z1*z8 */ -/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ -/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ -fe_sq(t2,t0); for (i = 1;i < 1;++i) fe_sq(t2,t2); - -/* qhasm: z_5_0 = z9*z22 */ -/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ -/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ -fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); - -/* qhasm: z_10_0 = z_10_5*z_5_0 */ -/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ -/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ -fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_20_0 = z_20_10*z_10_0 */ -/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ -/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ -fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); - -/* qhasm: z_40_0 = z_40_20*z_20_0 */ -/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ -/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ -fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_50_0 = z_50_10*z_10_0 */ -/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ -/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ -fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_100_0 = z_100_50*z_50_0 */ -/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ -/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ -fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); - -/* qhasm: z_200_0 = z_200_100*z_100_0 */ -/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ -/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ -fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_250_0 = z_250_50*z_50_0 */ -/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ -/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ -fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); - -/* qhasm: z_255_21 = z_255_5*z11 */ -/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,z2=fe#1,z2=fe#1,>z2=fe#1); */ -/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ -fe_sq(t0,z); for (i = 1;i < 1;++i) fe_sq(t0,t0); - -/* qhasm: z8 = z2^2^2 */ -/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ -/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ -fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); - -/* qhasm: z9 = z1*z8 */ -/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#1,z22=fe#1,>z22=fe#1); */ -/* asm 2: fe_sq(>z22=t0,z22=t0,>z22=t0); */ -fe_sq(t0,t0); for (i = 1;i < 1;++i) fe_sq(t0,t0); - -/* qhasm: z_5_0 = z9*z22 */ -/* asm 1: fe_mul(>z_5_0=fe#1,z_5_0=t0,z_10_5=fe#2,z_10_5=fe#2,>z_10_5=fe#2); */ -/* asm 2: fe_sq(>z_10_5=t1,z_10_5=t1,>z_10_5=t1); */ -fe_sq(t1,t0); for (i = 1;i < 5;++i) fe_sq(t1,t1); - -/* qhasm: z_10_0 = z_10_5*z_5_0 */ -/* asm 1: fe_mul(>z_10_0=fe#1,z_10_0=t0,z_20_10=fe#2,z_20_10=fe#2,>z_20_10=fe#2); */ -/* asm 2: fe_sq(>z_20_10=t1,z_20_10=t1,>z_20_10=t1); */ -fe_sq(t1,t0); for (i = 1;i < 10;++i) fe_sq(t1,t1); - -/* qhasm: z_20_0 = z_20_10*z_10_0 */ -/* asm 1: fe_mul(>z_20_0=fe#2,z_20_0=t1,z_40_20=fe#3,z_40_20=fe#3,>z_40_20=fe#3); */ -/* asm 2: fe_sq(>z_40_20=t2,z_40_20=t2,>z_40_20=t2); */ -fe_sq(t2,t1); for (i = 1;i < 20;++i) fe_sq(t2,t2); - -/* qhasm: z_40_0 = z_40_20*z_20_0 */ -/* asm 1: fe_mul(>z_40_0=fe#2,z_40_0=t1,z_50_10=fe#2,z_50_10=fe#2,>z_50_10=fe#2); */ -/* asm 2: fe_sq(>z_50_10=t1,z_50_10=t1,>z_50_10=t1); */ -fe_sq(t1,t1); for (i = 1;i < 10;++i) fe_sq(t1,t1); - -/* qhasm: z_50_0 = z_50_10*z_10_0 */ -/* asm 1: fe_mul(>z_50_0=fe#1,z_50_0=t0,z_100_50=fe#2,z_100_50=fe#2,>z_100_50=fe#2); */ -/* asm 2: fe_sq(>z_100_50=t1,z_100_50=t1,>z_100_50=t1); */ -fe_sq(t1,t0); for (i = 1;i < 50;++i) fe_sq(t1,t1); - -/* qhasm: z_100_0 = z_100_50*z_50_0 */ -/* asm 1: fe_mul(>z_100_0=fe#2,z_100_0=t1,z_200_100=fe#3,z_200_100=fe#3,>z_200_100=fe#3); */ -/* asm 2: fe_sq(>z_200_100=t2,z_200_100=t2,>z_200_100=t2); */ -fe_sq(t2,t1); for (i = 1;i < 100;++i) fe_sq(t2,t2); - -/* qhasm: z_200_0 = z_200_100*z_100_0 */ -/* asm 1: fe_mul(>z_200_0=fe#2,z_200_0=t1,z_250_50=fe#2,z_250_50=fe#2,>z_250_50=fe#2); */ -/* asm 2: fe_sq(>z_250_50=t1,z_250_50=t1,>z_250_50=t1); */ -fe_sq(t1,t1); for (i = 1;i < 50;++i) fe_sq(t1,t1); - -/* qhasm: z_250_0 = z_250_50*z_50_0 */ -/* asm 1: fe_mul(>z_250_0=fe#1,z_250_0=t0,z_252_2=fe#1,z_252_2=fe#1,>z_252_2=fe#1); */ -/* asm 2: fe_sq(>z_252_2=t0,z_252_2=t0,>z_252_2=t0); */ -fe_sq(t0,t0); for (i = 1;i < 2;++i) fe_sq(t0,t0); - -/* qhasm: z_252_3 = z_252_2*z1 */ -/* asm 1: fe_mul(>z_252_3=fe#12,z_252_3=out,X); - fe_1(h->Y); - fe_1(h->Z); -} - -static void ge_p3_0(ge_p3 *h) -{ - fe_0(h->X); - fe_1(h->Y); - fe_1(h->Z); - fe_0(h->T); -} - -static void ge_precomp_0(ge_precomp *h) -{ - fe_1(h->yplusx); - fe_1(h->yminusx); - fe_0(h->xy2d); -} - -/* -r = p -*/ - -static void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p) -{ - fe_mul(r->X,p->X,p->T); - fe_mul(r->Y,p->Y,p->Z); - fe_mul(r->Z,p->Z,p->T); -} - -/* -r = p -*/ - -static void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p) -{ - fe_mul(r->X,p->X,p->T); - fe_mul(r->Y,p->Y,p->Z); - fe_mul(r->Z,p->Z,p->T); - fe_mul(r->T,p->X,p->Y); -} - -/* -r = p -*/ - -static void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p) -{ - fe_copy(r->X,p->X); - fe_copy(r->Y,p->Y); - fe_copy(r->Z,p->Z); -} - - -/* -r = 2 * p -*/ - -static void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p) -{ - fe t0; -/* qhasm: enter ge_p2_dbl */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe A */ - -/* qhasm: fe AA */ - -/* qhasm: fe XX */ - -/* qhasm: fe YY */ - -/* qhasm: fe B */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: XX=X1^2 */ -/* asm 1: fe_sq(>XX=fe#1,XX=r->X,X); */ -fe_sq(r->X,p->X); - -/* qhasm: YY=Y1^2 */ -/* asm 1: fe_sq(>YY=fe#3,YY=r->Z,Y); */ -fe_sq(r->Z,p->Y); - -/* qhasm: B=2*Z1^2 */ -/* asm 1: fe_sq2(>B=fe#4,B=r->T,Z); */ -fe_sq2(r->T,p->Z); - -/* qhasm: A=X1+Y1 */ -/* asm 1: fe_add(>A=fe#2,A=r->Y,X,Y); */ -fe_add(r->Y,p->X,p->Y); - -/* qhasm: AA=A^2 */ -/* asm 1: fe_sq(>AA=fe#5,AA=t0,Y); */ -fe_sq(t0,r->Y); - -/* qhasm: Y3=YY+XX */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,X); */ -fe_add(r->Y,r->Z,r->X); - -/* qhasm: Z3=YY-XX */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,Z,X); */ -fe_sub(r->Z,r->Z,r->X); - -/* qhasm: X3=AA-Y3 */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Y); */ -fe_sub(r->X,t0,r->Y); - -/* qhasm: T3=B-Z3 */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T,Z); */ -fe_sub(r->T,r->T,r->Z); - -/* qhasm: return */ -} - - -/* -r = 2 * p -*/ - -static void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p) -{ - ge_p2 q; - ge_p3_to_p2(&q,p); - ge_p2_dbl(r,&q); -} - - -/* -r = p -*/ - -static void ge_p3_to_cached(ge_cached *r,const ge_p3 *p) -{ - fe_add(r->YplusX,p->Y,p->X); - fe_sub(r->YminusX,p->Y,p->X); - fe_copy(r->Z,p->Z); - fe_mul(r->T2d,p->T,d2); -} - -/* -r = p + q -*/ - -static void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) -{ - fe t0; -/* qhasm: enter ge_add */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe Z2 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ZZ */ - -/* qhasm: fe YpX2 */ - -/* qhasm: fe YmX2 */ - -/* qhasm: fe T2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*YpX2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YplusX); */ -fe_mul(r->Z,r->X,q->YplusX); - -/* qhasm: B = YmX1*YmX2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YminusX); */ -fe_mul(r->Y,r->Y,q->YminusX); - -/* qhasm: C = T2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ -fe_mul(r->T,q->T2d,p->T); - -/* qhasm: ZZ = Z1*Z2 */ -/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ -fe_mul(r->X,p->Z,q->Z); - -/* qhasm: D = 2*ZZ */ -/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ -fe_add(t0,r->X,r->X); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D+C */ -/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ -fe_add(r->Z,t0,r->T); - -/* qhasm: T3 = D-C */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ -fe_sub(r->T,t0,r->T); - -/* qhasm: return */ -} - - -/* -r = p - q -*/ - -static void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) -{ - fe t0; -/* qhasm: enter ge_sub */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe Z2 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ZZ */ - -/* qhasm: fe YpX2 */ - -/* qhasm: fe YmX2 */ - -/* qhasm: fe T2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*YmX2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YminusX); */ -fe_mul(r->Z,r->X,q->YminusX); - -/* qhasm: B = YmX1*YpX2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YplusX); */ -fe_mul(r->Y,r->Y,q->YplusX); - -/* qhasm: C = T2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ -fe_mul(r->T,q->T2d,p->T); - -/* qhasm: ZZ = Z1*Z2 */ -/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ -fe_mul(r->X,p->Z,q->Z); - -/* qhasm: D = 2*ZZ */ -/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ -fe_add(t0,r->X,r->X); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D-C */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ -fe_sub(r->Z,t0,r->T); - -/* qhasm: T3 = D+C */ -/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ -fe_add(r->T,t0,r->T); - -/* qhasm: return */ -} - - -/* -r = p + q -*/ - -static void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) -{ - fe t0; -/* qhasm: enter ge_madd */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ypx2 */ - -/* qhasm: fe ymx2 */ - -/* qhasm: fe xy2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*ypx2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yplusx); */ -fe_mul(r->Z,r->X,q->yplusx); - -/* qhasm: B = YmX1*ymx2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yminusx); */ -fe_mul(r->Y,r->Y,q->yminusx); - -/* qhasm: C = xy2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ -fe_mul(r->T,q->xy2d,p->T); - -/* qhasm: D = 2*Z1 */ -/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ -fe_add(t0,p->Z,p->Z); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D+C */ -/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ -fe_add(r->Z,t0,r->T); - -/* qhasm: T3 = D-C */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ -fe_sub(r->T,t0,r->T); - -/* qhasm: return */ -} - - -/* -r = p - q -*/ - -static void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) -{ - fe t0; -/* qhasm: enter ge_msub */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ypx2 */ - -/* qhasm: fe ymx2 */ - -/* qhasm: fe xy2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*ymx2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yminusx); */ -fe_mul(r->Z,r->X,q->yminusx); - -/* qhasm: B = YmX1*ypx2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yplusx); */ -fe_mul(r->Y,r->Y,q->yplusx); - -/* qhasm: C = xy2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ -fe_mul(r->T,q->xy2d,p->T); - -/* qhasm: D = 2*Z1 */ -/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ -fe_add(t0,p->Z,p->Z); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D-C */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ -fe_sub(r->Z,t0,r->T); - -/* qhasm: T3 = D+C */ -/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ -fe_add(r->T,t0,r->T); - -/* qhasm: return */ -} - - -static void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) -{ - fe recip; - fe x; - fe y; - - fe_invert(recip,h->Z); - fe_mul(x,h->X,recip); - fe_mul(y,h->Y,recip); - fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; -} - -static void ge_tobytes(unsigned char *s,const ge_p2 *h) -{ - fe recip; - fe x; - fe y; - - fe_invert(recip,h->Z); - fe_mul(x,h->X,recip); - fe_mul(y,h->Y,recip); - fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; -} - -static int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s) -{ - fe u; - fe v; - fe v3; - fe vxx; - fe check; - - fe_frombytes(h->Y,s); - fe_1(h->Z); - fe_sq(u,h->Y); - fe_mul(v,u,d); - fe_sub(u,u,h->Z); /* u = y^2-1 */ - fe_add(v,v,h->Z); /* v = dy^2+1 */ - - fe_sq(v3,v); - fe_mul(v3,v3,v); /* v3 = v^3 */ - fe_sq(h->X,v3); - fe_mul(h->X,h->X,v); - fe_mul(h->X,h->X,u); /* x = uv^7 */ - - fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ - fe_mul(h->X,h->X,v3); - fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ - - fe_sq(vxx,h->X); - fe_mul(vxx,vxx,v); - fe_sub(check,vxx,u); /* vx^2-u */ - if (fe_isnonzero(check)) { - fe_add(check,vxx,u); /* vx^2+u */ - if (fe_isnonzero(check)) return -1; - fe_mul(h->X,h->X,sqrtm1); - } - - if (fe_isnegative(h->X) == (s[31] >> 7)) - fe_neg(h->X,h->X); - - fe_mul(h->T,h->X,h->Y); - return 0; -} - - -static void slide(signed char *r,const unsigned char *a) -{ - int i; - int b; - int k; - - for (i = 0;i < 256;++i) - r[i] = 1 & (a[i >> 3] >> (i & 7)); - - for (i = 0;i < 256;++i) - if (r[i]) { - for (b = 1;b <= 6 && i + b < 256;++b) { - if (r[i + b]) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (k = i + b;k < 256;++k) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else - break; - } - } - } - -} - - -/* -r = a * A + b * B -where a = a[0]+256*a[1]+...+256^31 a[31]. -and b = b[0]+256*b[1]+...+256^31 b[31]. -B is the Ed25519 base point (x,4/5) with x positive. -*/ - -static void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b) -{ - signed char aslide[256]; - signed char bslide[256]; - ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ - ge_p1p1 t; - ge_p3 u; - ge_p3 A2; - int i; - - slide(aslide,a); - slide(bslide,b); - - ge_p3_to_cached(&Ai[0],A); - ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); - ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); - ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); - ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); - ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); - ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); - ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); - ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); - - ge_p2_0(r); - - for (i = 255;i >= 0;--i) { - if (aslide[i] || bslide[i]) break; - } - - for (;i >= 0;--i) { - ge_p2_dbl(&t,r); - - if (aslide[i] > 0) { - ge_p1p1_to_p3(&u,&t); - ge_add(&t,&u,&Ai[aslide[i]/2]); - } else if (aslide[i] < 0) { - ge_p1p1_to_p3(&u,&t); - ge_sub(&t,&u,&Ai[(-aslide[i])/2]); - } - - if (bslide[i] > 0) { - ge_p1p1_to_p3(&u,&t); - ge_madd(&t,&u,&Bi[bslide[i]/2]); - } else if (bslide[i] < 0) { - ge_p1p1_to_p3(&u,&t); - ge_msub(&t,&u,&Bi[(-bslide[i])/2]); - } - - ge_p1p1_to_p2(r,&t); - } -} - -static unsigned char equal(signed char b,signed char c) -{ - unsigned char ub = b; - unsigned char uc = c; - unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ - crypto_uint32 y = x; /* 0: yes; 1..255: no */ - y -= 1; /* 4294967295: yes; 0..254: no */ - y >>= 31; /* 1: yes; 0: no */ - return y; -} - -static unsigned char negative(signed char b) -{ - unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ - x >>= 63; /* 1: yes; 0: no */ - return x; -} - -static void cmov(ge_precomp *t,ge_precomp *u,unsigned char b) -{ - fe_cmov(t->yplusx,u->yplusx,b); - fe_cmov(t->yminusx,u->yminusx,b); - fe_cmov(t->xy2d,u->xy2d,b); -} - - - -static void select(ge_precomp *t,int pos,signed char b) -{ - ge_precomp minust; - unsigned char bnegative = negative(b); - unsigned char babs = b - (((-bnegative) & b) << 1); - - ge_precomp_0(t); - cmov(t,&base[pos][0],equal(babs,1)); - cmov(t,&base[pos][1],equal(babs,2)); - cmov(t,&base[pos][2],equal(babs,3)); - cmov(t,&base[pos][3],equal(babs,4)); - cmov(t,&base[pos][4],equal(babs,5)); - cmov(t,&base[pos][5],equal(babs,6)); - cmov(t,&base[pos][6],equal(babs,7)); - cmov(t,&base[pos][7],equal(babs,8)); - fe_copy(minust.yplusx,t->yminusx); - fe_copy(minust.yminusx,t->yplusx); - fe_neg(minust.xy2d,t->xy2d); - cmov(t,&minust,bnegative); -} - -/* -h = a * B -where a = a[0]+256*a[1]+...+256^31 a[31] -B is the Ed25519 base point (x,4/5) with x positive. - -Preconditions: - a[31] <= 127 -*/ - -static void ge_scalarmult_base(ge_p3 *h,const unsigned char *a) -{ - signed char e[64]; - signed char carry; - ge_p1p1 r; - ge_p2 s; - ge_precomp t; - int i; - - for (i = 0;i < 32;++i) { - e[2 * i + 0] = (a[i] >> 0) & 15; - e[2 * i + 1] = (a[i] >> 4) & 15; - } - /* each e[i] is between 0 and 15 */ - /* e[63] is between 0 and 7 */ - - carry = 0; - for (i = 0;i < 63;++i) { - e[i] += carry; - carry = e[i] + 8; - carry >>= 4; - e[i] -= carry << 4; - } - e[63] += carry; - /* each e[i] is between -8 and 8 */ - - ge_p3_0(h); - for (i = 1;i < 64;i += 2) { - select(&t,i / 2,e[i]); - ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); - } - - ge_p3_dbl(&r,h); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r); - - for (i = 0;i < 64;i += 2) { - select(&t,i / 2,e[i]); - ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); - } -} - -/* -Input: - s[0]+256*s[1]+...+256^63*s[63] = s - -Output: - s[0]+256*s[1]+...+256^31*s[31] = s mod l - where l = 2^252 + 27742317777372353535851937790883648493. - Overwrites s in place. -*/ - -static void sc_reduce(unsigned char *s) -{ - crypto_int64 s0 = 2097151 & load_3(s); - crypto_int64 s1 = 2097151 & (load_4(s + 2) >> 5); - crypto_int64 s2 = 2097151 & (load_3(s + 5) >> 2); - crypto_int64 s3 = 2097151 & (load_4(s + 7) >> 7); - crypto_int64 s4 = 2097151 & (load_4(s + 10) >> 4); - crypto_int64 s5 = 2097151 & (load_3(s + 13) >> 1); - crypto_int64 s6 = 2097151 & (load_4(s + 15) >> 6); - crypto_int64 s7 = 2097151 & (load_3(s + 18) >> 3); - crypto_int64 s8 = 2097151 & load_3(s + 21); - crypto_int64 s9 = 2097151 & (load_4(s + 23) >> 5); - crypto_int64 s10 = 2097151 & (load_3(s + 26) >> 2); - crypto_int64 s11 = 2097151 & (load_4(s + 28) >> 7); - crypto_int64 s12 = 2097151 & (load_4(s + 31) >> 4); - crypto_int64 s13 = 2097151 & (load_3(s + 34) >> 1); - crypto_int64 s14 = 2097151 & (load_4(s + 36) >> 6); - crypto_int64 s15 = 2097151 & (load_3(s + 39) >> 3); - crypto_int64 s16 = 2097151 & load_3(s + 42); - crypto_int64 s17 = 2097151 & (load_4(s + 44) >> 5); - crypto_int64 s18 = 2097151 & (load_3(s + 47) >> 2); - crypto_int64 s19 = 2097151 & (load_4(s + 49) >> 7); - crypto_int64 s20 = 2097151 & (load_4(s + 52) >> 4); - crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1); - crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6); - crypto_int64 s23 = (load_4(s + 60) >> 3); - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; - - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; - carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; - carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; - carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; - carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; - carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; - carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; - carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; - carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; - carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; - carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; - carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; - carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; - carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; - carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; - carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; - carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; - carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; - carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; - carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; - carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; - carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | (s1 << 5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | (s2 << 2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | (s3 << 7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | (s4 << 4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | (s5 << 1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | (s6 << 6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | (s7 << 3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | (s9 << 5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | (s10 << 2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | (s11 << 7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} - -/* -Input: - a[0]+256*a[1]+...+256^31*a[31] = a - b[0]+256*b[1]+...+256^31*b[31] = b - c[0]+256*c[1]+...+256^31*c[31] = c - -Output: - s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l - where l = 2^252 + 27742317777372353535851937790883648493. -*/ - -static void sc_muladd(unsigned char *s,const unsigned char *a,const unsigned char *b,const unsigned char *c) -{ - crypto_int64 a0 = 2097151 & load_3(a); - crypto_int64 a1 = 2097151 & (load_4(a + 2) >> 5); - crypto_int64 a2 = 2097151 & (load_3(a + 5) >> 2); - crypto_int64 a3 = 2097151 & (load_4(a + 7) >> 7); - crypto_int64 a4 = 2097151 & (load_4(a + 10) >> 4); - crypto_int64 a5 = 2097151 & (load_3(a + 13) >> 1); - crypto_int64 a6 = 2097151 & (load_4(a + 15) >> 6); - crypto_int64 a7 = 2097151 & (load_3(a + 18) >> 3); - crypto_int64 a8 = 2097151 & load_3(a + 21); - crypto_int64 a9 = 2097151 & (load_4(a + 23) >> 5); - crypto_int64 a10 = 2097151 & (load_3(a + 26) >> 2); - crypto_int64 a11 = (load_4(a + 28) >> 7); - crypto_int64 b0 = 2097151 & load_3(b); - crypto_int64 b1 = 2097151 & (load_4(b + 2) >> 5); - crypto_int64 b2 = 2097151 & (load_3(b + 5) >> 2); - crypto_int64 b3 = 2097151 & (load_4(b + 7) >> 7); - crypto_int64 b4 = 2097151 & (load_4(b + 10) >> 4); - crypto_int64 b5 = 2097151 & (load_3(b + 13) >> 1); - crypto_int64 b6 = 2097151 & (load_4(b + 15) >> 6); - crypto_int64 b7 = 2097151 & (load_3(b + 18) >> 3); - crypto_int64 b8 = 2097151 & load_3(b + 21); - crypto_int64 b9 = 2097151 & (load_4(b + 23) >> 5); - crypto_int64 b10 = 2097151 & (load_3(b + 26) >> 2); - crypto_int64 b11 = (load_4(b + 28) >> 7); - crypto_int64 c0 = 2097151 & load_3(c); - crypto_int64 c1 = 2097151 & (load_4(c + 2) >> 5); - crypto_int64 c2 = 2097151 & (load_3(c + 5) >> 2); - crypto_int64 c3 = 2097151 & (load_4(c + 7) >> 7); - crypto_int64 c4 = 2097151 & (load_4(c + 10) >> 4); - crypto_int64 c5 = 2097151 & (load_3(c + 13) >> 1); - crypto_int64 c6 = 2097151 & (load_4(c + 15) >> 6); - crypto_int64 c7 = 2097151 & (load_3(c + 18) >> 3); - crypto_int64 c8 = 2097151 & load_3(c + 21); - crypto_int64 c9 = 2097151 & (load_4(c + 23) >> 5); - crypto_int64 c10 = 2097151 & (load_3(c + 26) >> 2); - crypto_int64 c11 = (load_4(c + 28) >> 7); - crypto_int64 s0; - crypto_int64 s1; - crypto_int64 s2; - crypto_int64 s3; - crypto_int64 s4; - crypto_int64 s5; - crypto_int64 s6; - crypto_int64 s7; - crypto_int64 s8; - crypto_int64 s9; - crypto_int64 s10; - crypto_int64 s11; - crypto_int64 s12; - crypto_int64 s13; - crypto_int64 s14; - crypto_int64 s15; - crypto_int64 s16; - crypto_int64 s17; - crypto_int64 s18; - crypto_int64 s19; - crypto_int64 s20; - crypto_int64 s21; - crypto_int64 s22; - crypto_int64 s23; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; - crypto_int64 carry17; - crypto_int64 carry18; - crypto_int64 carry19; - crypto_int64 carry20; - crypto_int64 carry21; - crypto_int64 carry22; - - s0 = c0 + a0*b0; - s1 = c1 + a0*b1 + a1*b0; - s2 = c2 + a0*b2 + a1*b1 + a2*b0; - s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0; - s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0; - s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0; - s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0; - s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0; - s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0; - s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0; - s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0; - s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0; - s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1; - s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2; - s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3; - s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4; - s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5; - s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6; - s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7; - s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8; - s20 = a9*b11 + a10*b10 + a11*b9; - s21 = a10*b11 + a11*b10; - s22 = a11*b11; - s23 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; - carry18 = (s18 + (1<<20)) >> 21; s19 += carry18; s18 -= carry18 << 21; - carry20 = (s20 + (1<<20)) >> 21; s21 += carry20; s20 -= carry20 << 21; - carry22 = (s22 + (1<<20)) >> 21; s23 += carry22; s22 -= carry22 << 21; - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; - carry17 = (s17 + (1<<20)) >> 21; s18 += carry17; s17 -= carry17 << 21; - carry19 = (s19 + (1<<20)) >> 21; s20 += carry19; s19 -= carry19 << 21; - carry21 = (s21 + (1<<20)) >> 21; s22 += carry21; s21 -= carry21 << 21; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; - - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; - carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; - carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; - carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; - carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; - carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; - carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; - carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; - carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; - carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; - carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; - carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; - carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; - carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; - carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; - carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; - carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; - carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; - carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; - carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; - carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; - carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | (s1 << 5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | (s2 << 2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | (s3 << 7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | (s4 << 4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | (s5 << 1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | (s6 << 6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | (s7 << 3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | (s9 << 5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | (s10 << 2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | (s11 << 7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} - -/* -int crypto_sign_keypair(unsigned char *pk,unsigned char *sk) -{ - unsigned char h[64]; - ge_p3 A; - int i; - - randombytes(sk,32); - crypto_hash_sha512(h,sk,32); - h[0] &= 248; - h[31] &= 63; - h[31] |= 64; - - ge_scalarmult_base(&A,h); - ge_p3_tobytes(pk,&A); - - for (i = 0;i < 32;++i) sk[32 + i] = pk[i]; - return 0; -} -*/ - -int crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk) -{ - unsigned char h[64]; - ge_p3 A; - int i; - - crypto_hash_sha512(h,sk,32); - h[0] &= 248; - h[31] &= 63; - h[31] |= 64; - - ge_scalarmult_base(&A,h); - ge_p3_tobytes(pk,&A); - - for (i = 0;i < 32;++i) sk[32 + i] = pk[i]; - return 0; -} - -int crypto_sign_ref10( - unsigned char *sm,unsigned long long *smlen, - const unsigned char *m,unsigned long long mlen, - const unsigned char *sk -) -{ - unsigned char az[64]; - unsigned char r[64]; - unsigned char hram[64]; - ge_p3 R; - unsigned long long i; - - crypto_hash_sha512(az,sk,32); - az[0] &= 248; - az[31] &= 63; - az[31] |= 64; - - *smlen = mlen + 64; - for (i = 0;i < mlen;++i) sm[64 + i] = m[i]; - for (i = 0;i < 32;++i) sm[32 + i] = az[32 + i]; - crypto_hash_sha512(r,sm + 32,mlen + 32); - for (i = 0;i < 32;++i) sm[32 + i] = sk[32 + i]; - - sc_reduce(r); - ge_scalarmult_base(&R,r); - ge_p3_tobytes(sm,&R); - - crypto_hash_sha512(hram,sm,mlen + 64); - sc_reduce(hram); - sc_muladd(sm + 32,hram,az,r); - - return 0; -} - -int crypto_sign_open_ref10( - unsigned char *m,unsigned long long *mlen, - const unsigned char *sm,unsigned long long smlen, - const unsigned char *pk -) -{ - unsigned char h[64]; - unsigned char checkr[32]; - ge_p3 A; - ge_p2 R; - unsigned long long i; - - *mlen = -1; - if (smlen < 64) return -1; - if (sm[63] & 224) return -1; - if (ge_frombytes_negate_vartime(&A,pk) != 0) return -1; - - for (i = 0;i < smlen;++i) m[i] = sm[i]; - for (i = 0;i < 32;++i) m[32 + i] = pk[i]; - crypto_hash_sha512(h,m,smlen); - sc_reduce(h); - - ge_double_scalarmult_vartime(&R,h,&A,sm + 32); - ge_tobytes(checkr,&R); - if (crypto_verify_32(checkr,sm) != 0) { - for (i = 0;i < smlen;++i) m[i] = 0; - return -1; - } - - for (i = 0;i < smlen - 64;++i) m[i] = sm[64 + i]; - for (i = smlen - 64;i < smlen;++i) m[i] = 0; - *mlen = smlen - 64; - return 0; -} - diff --git a/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.h b/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.h deleted file mode 100644 index c8a0f69b6..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/ed25519-ref10.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef ED25519_REF10_H -#define ED25519_REF10_H - -int crypto_sign_pk_ref10(unsigned char *pk,unsigned char *sk); -int crypto_sign_ref10(unsigned char *sm,unsigned long long *smlen,const unsigned char *m,unsigned long long mlen,const unsigned char *sk); -int crypto_sign_open_ref10(unsigned char *m,unsigned long long *mlen,const unsigned char *sm,unsigned long long smlen,const unsigned char *pk); - -#endif /* ED25519_REF10_H */ - diff --git a/src/tor/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c b/src/tor/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c deleted file mode 100644 index 43017014c..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/fuzz-curve25519.c +++ /dev/null @@ -1,172 +0,0 @@ -#if defined(_WIN32) - #include - #include - typedef unsigned int uint32_t; - typedef unsigned __int64 uint64_t; -#else - #include -#endif - -#include -#include - -#include "ed25519-donna.h" -#include "curve25519-ref10.h" - -static void -print_diff(const char *desc, const unsigned char *a, const unsigned char *b, size_t len) { - size_t p = 0; - unsigned char diff; - printf("%s diff:\n", desc); - while (len--) { - diff = *a++ ^ *b++; - if (!diff) - printf("____,"); - else - printf("0x%02x,", diff); - if ((++p & 15) == 0) - printf("\n"); - } - printf("\n\n"); -} - -static void -print_bytes(const char *desc, const unsigned char *bytes, size_t len) { - size_t p = 0; - printf("%s:\n", desc); - while (len--) { - printf("0x%02x,", *bytes++); - if ((++p & 15) == 0) - printf("\n"); - } - printf("\n\n"); -} - - -/* chacha20/12 prng */ -void -prng(unsigned char *out, size_t bytes) { - static uint32_t state[16]; - static int init = 0; - uint32_t x[16], t; - size_t i; - - if (!init) { - #if defined(_WIN32) - HCRYPTPROV csp; - if (!CryptAcquireContext(&csp, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { - printf("CryptAcquireContext failed\n"); - exit(1); - } - if (!CryptGenRandom(csp, (DWORD)sizeof(state), (BYTE*)state)) { - printf("CryptGenRandom failed\n"); - exit(1); - } - CryptReleaseContext(csp, 0); - #else - FILE *f = NULL; - f = fopen("/dev/urandom", "rb"); - if (!f) { - printf("failed to open /dev/urandom\n"); - exit(1); - } - if (fread(state, sizeof(state), 1, f) != 1) { - printf("read error on /dev/urandom\n"); - exit(1); - } - #endif - init = 1; - } - - while (bytes) { - for (i = 0; i < 16; i++) x[i] = state[i]; - - #define rotl32(x,k) ((x << k) | (x >> (32 - k))) - #define quarter(a,b,c,d) \ - x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t,16); \ - x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t,12); \ - x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t, 8); \ - x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t, 7); - - for (i = 0; i < 12; i += 2) { - quarter( 0, 4, 8,12) - quarter( 1, 5, 9,13) - quarter( 2, 6,10,14) - quarter( 3, 7,11,15) - quarter( 0, 5,10,15) - quarter( 1, 6,11,12) - quarter( 2, 7, 8,13) - quarter( 3, 4, 9,14) - }; - - if (bytes <= 64) { - memcpy(out, x, bytes); - bytes = 0; - } else { - memcpy(out, x, 64); - bytes -= 64; - out += 64; - } - - /* don't need a nonce, so last 4 words are the counter. 2^136 bytes can be generated */ - if (!++state[12]) if (!++state[13]) if (!++state[14]) ++state[15]; - } -} - - - -int main() { - const size_t skmax = 1024; - static unsigned char sk[1024][32]; - unsigned char pk[3][32]; - unsigned char *skp; - size_t ski, pki, i; - uint64_t ctr; - - printf("fuzzing: "); - printf(" ref10"); - printf(" curved25519"); -#if defined(ED25519_SSE2) - printf(" curved25519-sse2"); -#endif - printf("\n\n"); - - for (ctr = 0, ski = skmax;;ctr++) { - if (ski == skmax) { - prng((unsigned char *)sk, sizeof(sk)); - ski = 0; - } - skp = sk[ski++]; - - pki = 0; - crypto_scalarmult_base_ref10(pk[pki++], skp); - curved25519_scalarmult_basepoint(pk[pki++], skp); - #if defined(ED25519_SSE2) - curved25519_scalarmult_basepoint_sse2(pk[pki++], skp); - #endif - - for (i = 1; i < pki; i++) { - if (memcmp(pk[0], pk[i], 32) != 0) { - printf("\n\n"); - print_bytes("sk", skp, 32); - print_bytes("ref10", pk[0], 32); - print_diff("curved25519", pk[0], pk[1], 32); - #if defined(ED25519_SSE2) - print_diff("curved25519-sse2", pk[0], pk[2], 32); - #endif - exit(1); - } - } - - if (ctr && (ctr % 0x1000 == 0)) { - printf("."); - if ((ctr % 0x20000) == 0) { - printf(" ["); - for (i = 0; i < 8; i++) - printf("%02x", (unsigned char)(ctr >> ((7 - i) * 8))); - printf("]\n"); - } - } - } -} - diff --git a/src/tor/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c b/src/tor/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c deleted file mode 100644 index b242e8e5d..000000000 --- a/src/tor/src/ext/ed25519/donna/fuzz/fuzz-ed25519.c +++ /dev/null @@ -1,219 +0,0 @@ -#if defined(_WIN32) - #include - #include - typedef unsigned int uint32_t; -#else - #include -#endif - -#include -#include - -#include "ed25519-donna.h" -#include "ed25519-ref10.h" - -static void -print_diff(const char *desc, const unsigned char *a, const unsigned char *b, size_t len) { - size_t p = 0; - unsigned char diff; - printf("%s diff:\n", desc); - while (len--) { - diff = *a++ ^ *b++; - if (!diff) - printf("____,"); - else - printf("0x%02x,", diff); - if ((++p & 15) == 0) - printf("\n"); - } - printf("\n"); -} - -static void -print_bytes(const char *desc, const unsigned char *bytes, size_t len) { - size_t p = 0; - printf("%s:\n", desc); - while (len--) { - printf("0x%02x,", *bytes++); - if ((++p & 15) == 0) - printf("\n"); - } - printf("\n"); -} - - -/* chacha20/12 prng */ -void -prng(unsigned char *out, size_t bytes) { - static uint32_t state[16]; - static int init = 0; - uint32_t x[16], t; - size_t i; - - if (!init) { - #if defined(_WIN32) - HCRYPTPROV csp = NULL; - if (!CryptAcquireContext(&csp, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { - printf("CryptAcquireContext failed\n"); - exit(1); - } - if (!CryptGenRandom(csp, (DWORD)sizeof(state), (BYTE*)state)) { - printf("CryptGenRandom failed\n"); - exit(1); - } - CryptReleaseContext(csp, 0); - #else - FILE *f = NULL; - f = fopen("/dev/urandom", "rb"); - if (!f) { - printf("failed to open /dev/urandom\n"); - exit(1); - } - if (fread(state, sizeof(state), 1, f) != 1) { - printf("read error on /dev/urandom\n"); - exit(1); - } - #endif - init = 1; - } - - while (bytes) { - for (i = 0; i < 16; i++) x[i] = state[i]; - - #define rotl32(x,k) ((x << k) | (x >> (32 - k))) - #define quarter(a,b,c,d) \ - x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t,16); \ - x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t,12); \ - x[a] += x[b]; t = x[d]^x[a]; x[d] = rotl32(t, 8); \ - x[c] += x[d]; t = x[b]^x[c]; x[b] = rotl32(t, 7); - - for (i = 0; i < 12; i += 2) { - quarter( 0, 4, 8,12) - quarter( 1, 5, 9,13) - quarter( 2, 6,10,14) - quarter( 3, 7,11,15) - quarter( 0, 5,10,15) - quarter( 1, 6,11,12) - quarter( 2, 7, 8,13) - quarter( 3, 4, 9,14) - }; - - if (bytes <= 64) { - memcpy(out, x, bytes); - bytes = 0; - } else { - memcpy(out, x, 64); - bytes -= 64; - out += 64; - } - - /* don't need a nonce, so last 4 words are the counter. 2^136 bytes can be generated */ - if (!++state[12]) if (!++state[13]) if (!++state[14]) ++state[15]; - } -} - -typedef struct random_data_t { - unsigned char sk[32]; - unsigned char m[128]; -} random_data; - -typedef struct generated_data_t { - unsigned char pk[32]; - unsigned char sig[64]; - int valid; -} generated_data; - -static void -print_generated(const char *desc, generated_data *g) { - printf("%s:\n", desc); - print_bytes("pk", g->pk, 32); - print_bytes("sig", g->sig, 64); - printf("valid: %s\n\n", g->valid ? "no" : "yes"); -} - -static void -print_generated_diff(const char *desc, const generated_data *base, generated_data *g) { - printf("%s:\n", desc); - print_diff("pk", base->pk, g->pk, 32); - print_diff("sig", base->sig, g->sig, 64); - printf("valid: %s\n\n", (base->valid == g->valid) ? "___" : (g->valid ? "no" : "yes")); -} - -int main() { - const size_t rndmax = 128; - static random_data rnd[128]; - static generated_data gen[3]; - random_data *r; - generated_data *g; - unsigned long long dummylen; - unsigned char dummysk[64]; - unsigned char dummymsg[2][128+64]; - size_t rndi, geni, i, j; - uint64_t ctr; - - printf("fuzzing: "); - printf(" ref10"); - printf(" ed25519-donna"); -#if defined(ED25519_SSE2) - printf(" ed25519-donna-sse2"); -#endif - printf("\n\n"); - - for (ctr = 0, rndi = rndmax;;ctr++) { - if (rndi == rndmax) { - prng((unsigned char *)rnd, sizeof(rnd)); - rndi = 0; - } - r = &rnd[rndi++]; - - /* ref10, lots of horrible gymnastics to work around the wonky api */ - geni = 0; - g = &gen[geni++]; - memcpy(dummysk, r->sk, 32); /* pk is appended to the sk, need to copy the sk to a larger buffer */ - crypto_sign_pk_ref10(dummysk + 32, dummysk); - memcpy(g->pk, dummysk + 32, 32); - crypto_sign_ref10(dummymsg[0], &dummylen, r->m, 128, dummysk); - memcpy(g->sig, dummymsg[0], 64); /* sig is placed in front of the signed message */ - g->valid = crypto_sign_open_ref10(dummymsg[1], &dummylen, dummymsg[0], 128 + 64, g->pk); - - /* ed25519-donna */ - g = &gen[geni++]; - ed25519_publickey(r->sk, g->pk); - ed25519_sign(r->m, 128, r->sk, g->pk, g->sig); - g->valid = ed25519_sign_open(r->m, 128, g->pk, g->sig); - - #if defined(ED25519_SSE2) - /* ed25519-donna-sse2 */ - g = &gen[geni++]; - ed25519_publickey_sse2(r->sk, g->pk); - ed25519_sign_sse2(r->m, 128, r->sk, g->pk, g->sig); - g->valid = ed25519_sign_open_sse2(r->m, 128, g->pk, g->sig); - #endif - - /* compare implementations 1..geni against the reference */ - for (i = 1; i < geni; i++) { - if (memcmp(&gen[0], &gen[i], sizeof(generated_data)) != 0) { - printf("\n\n"); - print_bytes("sk", r->sk, 32); - print_bytes("m", r->m, 128); - print_generated("ref10", &gen[0]); - print_generated_diff("ed25519-donna", &gen[0], &gen[1]); - #if defined(ED25519_SSE2) - print_generated_diff("ed25519-donna-sse2", &gen[0], &gen[2]); - #endif - exit(1); - } - } - - /* print out status */ - if (ctr && (ctr % 0x1000 == 0)) { - printf("."); - if ((ctr % 0x20000) == 0) { - printf(" ["); - for (i = 0; i < 8; i++) - printf("%02x", (unsigned char)(ctr >> ((7 - i) * 8))); - printf("]\n"); - } - } - } -} \ No newline at end of file diff --git a/src/tor/src/ext/ed25519/donna/modm-donna-32bit.h b/src/tor/src/ext/ed25519/donna/modm-donna-32bit.h deleted file mode 100644 index 0ef9e58fa..000000000 --- a/src/tor/src/ext/ed25519/donna/modm-donna-32bit.h +++ /dev/null @@ -1,470 +0,0 @@ -/* - Public domain by Andrew M. -*/ - - -/* - Arithmetic modulo the group order n = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 - - k = 32 - b = 1 << 8 = 256 - m = 2^252 + 27742317777372353535851937790883648493 = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed - mu = floor( b^(k*2) / m ) = 0xfffffffffffffffffffffffffffffffeb2106215d086329a7ed9ce5a30a2c131b -*/ - -#define bignum256modm_bits_per_limb 30 -#define bignum256modm_limb_size 9 - -typedef uint32_t bignum256modm_element_t; -typedef bignum256modm_element_t bignum256modm[9]; - -static const bignum256modm modm_m = { - 0x1cf5d3ed, 0x20498c69, 0x2f79cd65, 0x37be77a8, - 0x00000014, 0x00000000, 0x00000000, 0x00000000, - 0x00001000 -}; - -static const bignum256modm modm_mu = { - 0x0a2c131b, 0x3673968c, 0x06329a7e, 0x01885742, - 0x3fffeb21, 0x3fffffff, 0x3fffffff, 0x3fffffff, - 0x000fffff -}; - -static bignum256modm_element_t -lt_modm(bignum256modm_element_t a, bignum256modm_element_t b) { - return (a - b) >> 31; -} - -/* see HAC, Alg. 14.42 Step 4 */ -static void -reduce256_modm(bignum256modm r) { - bignum256modm t; - bignum256modm_element_t b = 0, pb, mask; - - /* t = r - m */ - pb = 0; - pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 30)); pb = b; - pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 30)); pb = b; - pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 30)); pb = b; - pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 30)); pb = b; - pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 30)); pb = b; - pb += modm_m[5]; b = lt_modm(r[5], pb); t[5] = (r[5] - pb + (b << 30)); pb = b; - pb += modm_m[6]; b = lt_modm(r[6], pb); t[6] = (r[6] - pb + (b << 30)); pb = b; - pb += modm_m[7]; b = lt_modm(r[7], pb); t[7] = (r[7] - pb + (b << 30)); pb = b; - pb += modm_m[8]; b = lt_modm(r[8], pb); t[8] = (r[8] - pb + (b << 16)); - - /* keep r if r was smaller than m */ - mask = b - 1; - r[0] ^= mask & (r[0] ^ t[0]); - r[1] ^= mask & (r[1] ^ t[1]); - r[2] ^= mask & (r[2] ^ t[2]); - r[3] ^= mask & (r[3] ^ t[3]); - r[4] ^= mask & (r[4] ^ t[4]); - r[5] ^= mask & (r[5] ^ t[5]); - r[6] ^= mask & (r[6] ^ t[6]); - r[7] ^= mask & (r[7] ^ t[7]); - r[8] ^= mask & (r[8] ^ t[8]); -} - -/* - Barrett reduction, see HAC, Alg. 14.42 - - Instead of passing in x, pre-process in to q1 and r1 for efficiency -*/ -static void -barrett_reduce256_modm(bignum256modm r, const bignum256modm q1, const bignum256modm r1) { - bignum256modm q3, r2; - uint64_t c; - bignum256modm_element_t f, b, pb; - - /* q1 = x >> 248 = 264 bits = 9 30 bit elements - q2 = mu * q1 - q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ - c = mul32x32_64(modm_mu[0], q1[7]) + mul32x32_64(modm_mu[1], q1[6]) + mul32x32_64(modm_mu[2], q1[5]) + mul32x32_64(modm_mu[3], q1[4]) + mul32x32_64(modm_mu[4], q1[3]) + mul32x32_64(modm_mu[5], q1[2]) + mul32x32_64(modm_mu[6], q1[1]) + mul32x32_64(modm_mu[7], q1[0]); - c >>= 30; - c += mul32x32_64(modm_mu[0], q1[8]) + mul32x32_64(modm_mu[1], q1[7]) + mul32x32_64(modm_mu[2], q1[6]) + mul32x32_64(modm_mu[3], q1[5]) + mul32x32_64(modm_mu[4], q1[4]) + mul32x32_64(modm_mu[5], q1[3]) + mul32x32_64(modm_mu[6], q1[2]) + mul32x32_64(modm_mu[7], q1[1]) + mul32x32_64(modm_mu[8], q1[0]); - f = (bignum256modm_element_t)c; q3[0] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[1], q1[8]) + mul32x32_64(modm_mu[2], q1[7]) + mul32x32_64(modm_mu[3], q1[6]) + mul32x32_64(modm_mu[4], q1[5]) + mul32x32_64(modm_mu[5], q1[4]) + mul32x32_64(modm_mu[6], q1[3]) + mul32x32_64(modm_mu[7], q1[2]) + mul32x32_64(modm_mu[8], q1[1]); - f = (bignum256modm_element_t)c; q3[0] |= (f << 6) & 0x3fffffff; q3[1] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[2], q1[8]) + mul32x32_64(modm_mu[3], q1[7]) + mul32x32_64(modm_mu[4], q1[6]) + mul32x32_64(modm_mu[5], q1[5]) + mul32x32_64(modm_mu[6], q1[4]) + mul32x32_64(modm_mu[7], q1[3]) + mul32x32_64(modm_mu[8], q1[2]); - f = (bignum256modm_element_t)c; q3[1] |= (f << 6) & 0x3fffffff; q3[2] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[3], q1[8]) + mul32x32_64(modm_mu[4], q1[7]) + mul32x32_64(modm_mu[5], q1[6]) + mul32x32_64(modm_mu[6], q1[5]) + mul32x32_64(modm_mu[7], q1[4]) + mul32x32_64(modm_mu[8], q1[3]); - f = (bignum256modm_element_t)c; q3[2] |= (f << 6) & 0x3fffffff; q3[3] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[4], q1[8]) + mul32x32_64(modm_mu[5], q1[7]) + mul32x32_64(modm_mu[6], q1[6]) + mul32x32_64(modm_mu[7], q1[5]) + mul32x32_64(modm_mu[8], q1[4]); - f = (bignum256modm_element_t)c; q3[3] |= (f << 6) & 0x3fffffff; q3[4] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[5], q1[8]) + mul32x32_64(modm_mu[6], q1[7]) + mul32x32_64(modm_mu[7], q1[6]) + mul32x32_64(modm_mu[8], q1[5]); - f = (bignum256modm_element_t)c; q3[4] |= (f << 6) & 0x3fffffff; q3[5] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[6], q1[8]) + mul32x32_64(modm_mu[7], q1[7]) + mul32x32_64(modm_mu[8], q1[6]); - f = (bignum256modm_element_t)c; q3[5] |= (f << 6) & 0x3fffffff; q3[6] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[7], q1[8]) + mul32x32_64(modm_mu[8], q1[7]); - f = (bignum256modm_element_t)c; q3[6] |= (f << 6) & 0x3fffffff; q3[7] = (f >> 24) & 0x3f; c >>= 30; - c += mul32x32_64(modm_mu[8], q1[8]); - f = (bignum256modm_element_t)c; q3[7] |= (f << 6) & 0x3fffffff; q3[8] = (bignum256modm_element_t)(c >> 24); - - /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) - r2 = (q3 * m) mod (256^(32+1)) = (q3 * m) & ((1 << 264) - 1) */ - c = mul32x32_64(modm_m[0], q3[0]); - r2[0] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[1]) + mul32x32_64(modm_m[1], q3[0]); - r2[1] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[2]) + mul32x32_64(modm_m[1], q3[1]) + mul32x32_64(modm_m[2], q3[0]); - r2[2] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[3]) + mul32x32_64(modm_m[1], q3[2]) + mul32x32_64(modm_m[2], q3[1]) + mul32x32_64(modm_m[3], q3[0]); - r2[3] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[4]) + mul32x32_64(modm_m[1], q3[3]) + mul32x32_64(modm_m[2], q3[2]) + mul32x32_64(modm_m[3], q3[1]) + mul32x32_64(modm_m[4], q3[0]); - r2[4] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[5]) + mul32x32_64(modm_m[1], q3[4]) + mul32x32_64(modm_m[2], q3[3]) + mul32x32_64(modm_m[3], q3[2]) + mul32x32_64(modm_m[4], q3[1]) + mul32x32_64(modm_m[5], q3[0]); - r2[5] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[6]) + mul32x32_64(modm_m[1], q3[5]) + mul32x32_64(modm_m[2], q3[4]) + mul32x32_64(modm_m[3], q3[3]) + mul32x32_64(modm_m[4], q3[2]) + mul32x32_64(modm_m[5], q3[1]) + mul32x32_64(modm_m[6], q3[0]); - r2[6] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[7]) + mul32x32_64(modm_m[1], q3[6]) + mul32x32_64(modm_m[2], q3[5]) + mul32x32_64(modm_m[3], q3[4]) + mul32x32_64(modm_m[4], q3[3]) + mul32x32_64(modm_m[5], q3[2]) + mul32x32_64(modm_m[6], q3[1]) + mul32x32_64(modm_m[7], q3[0]); - r2[7] = (bignum256modm_element_t)(c & 0x3fffffff); c >>= 30; - c += mul32x32_64(modm_m[0], q3[8]) + mul32x32_64(modm_m[1], q3[7]) + mul32x32_64(modm_m[2], q3[6]) + mul32x32_64(modm_m[3], q3[5]) + mul32x32_64(modm_m[4], q3[4]) + mul32x32_64(modm_m[5], q3[3]) + mul32x32_64(modm_m[6], q3[2]) + mul32x32_64(modm_m[7], q3[1]) + mul32x32_64(modm_m[8], q3[0]); - r2[8] = (bignum256modm_element_t)(c & 0xffffff); - - /* r = r1 - r2 - if (r < 0) r += (1 << 264) */ - pb = 0; - pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 30)); pb = b; - pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 30)); pb = b; - pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 30)); pb = b; - pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 30)); pb = b; - pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 30)); pb = b; - pb += r2[5]; b = lt_modm(r1[5], pb); r[5] = (r1[5] - pb + (b << 30)); pb = b; - pb += r2[6]; b = lt_modm(r1[6], pb); r[6] = (r1[6] - pb + (b << 30)); pb = b; - pb += r2[7]; b = lt_modm(r1[7], pb); r[7] = (r1[7] - pb + (b << 30)); pb = b; - pb += r2[8]; b = lt_modm(r1[8], pb); r[8] = (r1[8] - pb + (b << 24)); - - reduce256_modm(r); - reduce256_modm(r); -} - -/* addition modulo m */ -static void -add256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { - bignum256modm_element_t c; - - c = x[0] + y[0]; r[0] = c & 0x3fffffff; c >>= 30; - c += x[1] + y[1]; r[1] = c & 0x3fffffff; c >>= 30; - c += x[2] + y[2]; r[2] = c & 0x3fffffff; c >>= 30; - c += x[3] + y[3]; r[3] = c & 0x3fffffff; c >>= 30; - c += x[4] + y[4]; r[4] = c & 0x3fffffff; c >>= 30; - c += x[5] + y[5]; r[5] = c & 0x3fffffff; c >>= 30; - c += x[6] + y[6]; r[6] = c & 0x3fffffff; c >>= 30; - c += x[7] + y[7]; r[7] = c & 0x3fffffff; c >>= 30; - c += x[8] + y[8]; r[8] = c; - - reduce256_modm(r); -} - -/* multiplication modulo m */ -static void -mul256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { - bignum256modm r1, q1; - uint64_t c; - bignum256modm_element_t f; - - /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) - q1 = x >> 248 = 264 bits = 9 30 bit elements */ - c = mul32x32_64(x[0], y[0]); - f = (bignum256modm_element_t)c; r1[0] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[1]) + mul32x32_64(x[1], y[0]); - f = (bignum256modm_element_t)c; r1[1] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[2]) + mul32x32_64(x[1], y[1]) + mul32x32_64(x[2], y[0]); - f = (bignum256modm_element_t)c; r1[2] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[3]) + mul32x32_64(x[1], y[2]) + mul32x32_64(x[2], y[1]) + mul32x32_64(x[3], y[0]); - f = (bignum256modm_element_t)c; r1[3] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[4]) + mul32x32_64(x[1], y[3]) + mul32x32_64(x[2], y[2]) + mul32x32_64(x[3], y[1]) + mul32x32_64(x[4], y[0]); - f = (bignum256modm_element_t)c; r1[4] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[5]) + mul32x32_64(x[1], y[4]) + mul32x32_64(x[2], y[3]) + mul32x32_64(x[3], y[2]) + mul32x32_64(x[4], y[1]) + mul32x32_64(x[5], y[0]); - f = (bignum256modm_element_t)c; r1[5] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[6]) + mul32x32_64(x[1], y[5]) + mul32x32_64(x[2], y[4]) + mul32x32_64(x[3], y[3]) + mul32x32_64(x[4], y[2]) + mul32x32_64(x[5], y[1]) + mul32x32_64(x[6], y[0]); - f = (bignum256modm_element_t)c; r1[6] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[7]) + mul32x32_64(x[1], y[6]) + mul32x32_64(x[2], y[5]) + mul32x32_64(x[3], y[4]) + mul32x32_64(x[4], y[3]) + mul32x32_64(x[5], y[2]) + mul32x32_64(x[6], y[1]) + mul32x32_64(x[7], y[0]); - f = (bignum256modm_element_t)c; r1[7] = (f & 0x3fffffff); c >>= 30; - c += mul32x32_64(x[0], y[8]) + mul32x32_64(x[1], y[7]) + mul32x32_64(x[2], y[6]) + mul32x32_64(x[3], y[5]) + mul32x32_64(x[4], y[4]) + mul32x32_64(x[5], y[3]) + mul32x32_64(x[6], y[2]) + mul32x32_64(x[7], y[1]) + mul32x32_64(x[8], y[0]); - f = (bignum256modm_element_t)c; r1[8] = (f & 0x00ffffff); q1[0] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[1], y[8]) + mul32x32_64(x[2], y[7]) + mul32x32_64(x[3], y[6]) + mul32x32_64(x[4], y[5]) + mul32x32_64(x[5], y[4]) + mul32x32_64(x[6], y[3]) + mul32x32_64(x[7], y[2]) + mul32x32_64(x[8], y[1]); - f = (bignum256modm_element_t)c; q1[0] = (q1[0] | (f << 22)) & 0x3fffffff; q1[1] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[2], y[8]) + mul32x32_64(x[3], y[7]) + mul32x32_64(x[4], y[6]) + mul32x32_64(x[5], y[5]) + mul32x32_64(x[6], y[4]) + mul32x32_64(x[7], y[3]) + mul32x32_64(x[8], y[2]); - f = (bignum256modm_element_t)c; q1[1] = (q1[1] | (f << 22)) & 0x3fffffff; q1[2] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[3], y[8]) + mul32x32_64(x[4], y[7]) + mul32x32_64(x[5], y[6]) + mul32x32_64(x[6], y[5]) + mul32x32_64(x[7], y[4]) + mul32x32_64(x[8], y[3]); - f = (bignum256modm_element_t)c; q1[2] = (q1[2] | (f << 22)) & 0x3fffffff; q1[3] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[4], y[8]) + mul32x32_64(x[5], y[7]) + mul32x32_64(x[6], y[6]) + mul32x32_64(x[7], y[5]) + mul32x32_64(x[8], y[4]); - f = (bignum256modm_element_t)c; q1[3] = (q1[3] | (f << 22)) & 0x3fffffff; q1[4] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[5], y[8]) + mul32x32_64(x[6], y[7]) + mul32x32_64(x[7], y[6]) + mul32x32_64(x[8], y[5]); - f = (bignum256modm_element_t)c; q1[4] = (q1[4] | (f << 22)) & 0x3fffffff; q1[5] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[6], y[8]) + mul32x32_64(x[7], y[7]) + mul32x32_64(x[8], y[6]); - f = (bignum256modm_element_t)c; q1[5] = (q1[5] | (f << 22)) & 0x3fffffff; q1[6] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[7], y[8]) + mul32x32_64(x[8], y[7]); - f = (bignum256modm_element_t)c; q1[6] = (q1[6] | (f << 22)) & 0x3fffffff; q1[7] = (f >> 8) & 0x3fffff; c >>= 30; - c += mul32x32_64(x[8], y[8]); - f = (bignum256modm_element_t)c; q1[7] = (q1[7] | (f << 22)) & 0x3fffffff; q1[8] = (f >> 8) & 0x3fffff; - - barrett_reduce256_modm(r, q1, r1); -} - -static void -expand256_modm(bignum256modm out, const unsigned char *in, size_t len) { - unsigned char work[64] = {0}; - bignum256modm_element_t x[16]; - bignum256modm q1; - - memcpy(work, in, len); - x[0] = U8TO32_LE(work + 0); - x[1] = U8TO32_LE(work + 4); - x[2] = U8TO32_LE(work + 8); - x[3] = U8TO32_LE(work + 12); - x[4] = U8TO32_LE(work + 16); - x[5] = U8TO32_LE(work + 20); - x[6] = U8TO32_LE(work + 24); - x[7] = U8TO32_LE(work + 28); - x[8] = U8TO32_LE(work + 32); - x[9] = U8TO32_LE(work + 36); - x[10] = U8TO32_LE(work + 40); - x[11] = U8TO32_LE(work + 44); - x[12] = U8TO32_LE(work + 48); - x[13] = U8TO32_LE(work + 52); - x[14] = U8TO32_LE(work + 56); - x[15] = U8TO32_LE(work + 60); - - /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ - out[0] = ( x[0]) & 0x3fffffff; - out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; - out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; - out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; - out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; - out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; - out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; - out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; - out[8] = ((x[ 7] >> 16) | (x[ 8] << 16)) & 0x00ffffff; - - /* 8*31 = 248 bits, no need to reduce */ - if (len < 32) - return; - - /* q1 = x >> 248 = 264 bits = 9 30 bit elements */ - q1[0] = ((x[ 7] >> 24) | (x[ 8] << 8)) & 0x3fffffff; - q1[1] = ((x[ 8] >> 22) | (x[ 9] << 10)) & 0x3fffffff; - q1[2] = ((x[ 9] >> 20) | (x[10] << 12)) & 0x3fffffff; - q1[3] = ((x[10] >> 18) | (x[11] << 14)) & 0x3fffffff; - q1[4] = ((x[11] >> 16) | (x[12] << 16)) & 0x3fffffff; - q1[5] = ((x[12] >> 14) | (x[13] << 18)) & 0x3fffffff; - q1[6] = ((x[13] >> 12) | (x[14] << 20)) & 0x3fffffff; - q1[7] = ((x[14] >> 10) | (x[15] << 22)) & 0x3fffffff; - q1[8] = ((x[15] >> 8) ); - - barrett_reduce256_modm(out, q1, out); -} - -static void -expand_raw256_modm(bignum256modm out, const unsigned char in[32]) { - bignum256modm_element_t x[8]; - - x[0] = U8TO32_LE(in + 0); - x[1] = U8TO32_LE(in + 4); - x[2] = U8TO32_LE(in + 8); - x[3] = U8TO32_LE(in + 12); - x[4] = U8TO32_LE(in + 16); - x[5] = U8TO32_LE(in + 20); - x[6] = U8TO32_LE(in + 24); - x[7] = U8TO32_LE(in + 28); - - out[0] = ( x[0]) & 0x3fffffff; - out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; - out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; - out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; - out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; - out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; - out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; - out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; - out[8] = ((x[ 7] >> 16) ) & 0x0000ffff; -} - -static void -contract256_modm(unsigned char out[32], const bignum256modm in) { - U32TO8_LE(out + 0, (in[0] ) | (in[1] << 30)); - U32TO8_LE(out + 4, (in[1] >> 2) | (in[2] << 28)); - U32TO8_LE(out + 8, (in[2] >> 4) | (in[3] << 26)); - U32TO8_LE(out + 12, (in[3] >> 6) | (in[4] << 24)); - U32TO8_LE(out + 16, (in[4] >> 8) | (in[5] << 22)); - U32TO8_LE(out + 20, (in[5] >> 10) | (in[6] << 20)); - U32TO8_LE(out + 24, (in[6] >> 12) | (in[7] << 18)); - U32TO8_LE(out + 28, (in[7] >> 14) | (in[8] << 16)); -} - - - -static void -contract256_window4_modm(signed char r[64], const bignum256modm in) { - char carry; - signed char *quads = r; - bignum256modm_element_t i, j, v; - - for (i = 0; i < 8; i += 2) { - v = in[i]; - for (j = 0; j < 7; j++) { - *quads++ = (v & 15); - v >>= 4; - } - v |= (in[i+1] << 2); - for (j = 0; j < 8; j++) { - *quads++ = (v & 15); - v >>= 4; - } - } - v = in[8]; - *quads++ = (v & 15); v >>= 4; - *quads++ = (v & 15); v >>= 4; - *quads++ = (v & 15); v >>= 4; - *quads++ = (v & 15); v >>= 4; - - /* making it signed */ - carry = 0; - for(i = 0; i < 63; i++) { - r[i] += carry; - r[i+1] += (r[i] >> 4); - r[i] &= 15; - carry = (r[i] >> 3); - r[i] -= (carry << 4); - } - r[63] += carry; -} - -static void -contract256_slidingwindow_modm(signed char r[256], const bignum256modm s, int windowsize) { - int i,j,k,b; - int m = (1 << (windowsize - 1)) - 1; - const int soplen = 256; - signed char *bits = r; - bignum256modm_element_t v; - - /* first put the binary expansion into r */ - for (i = 0; i < 8; i++) { - v = s[i]; - for (j = 0; j < 30; j++, v >>= 1) - *bits++ = (v & 1); - } - v = s[8]; - for (j = 0; j < 16; j++, v >>= 1) - *bits++ = (v & 1); - - /* Making it sliding window */ - for (j = 0; j < soplen; j++) { - if (!r[j]) - continue; - - for (b = 1; (b < (soplen - j)) && (b <= 6); b++) { - if ((r[j] + (r[j + b] << b)) <= m) { - r[j] += r[j + b] << b; - r[j + b] = 0; - } else if ((r[j] - (r[j + b] << b)) >= -m) { - r[j] -= r[j + b] << b; - for (k = j + b; k < soplen; k++) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else if (r[j + b]) { - break; - } - } - } -} - - -/* - helpers for batch verifcation, are allowed to be vartime -*/ - -/* out = a - b, a must be larger than b */ -static void -sub256_modm_batch(bignum256modm out, const bignum256modm a, const bignum256modm b, size_t limbsize) { - size_t i = 0; - bignum256modm_element_t carry = 0; - switch (limbsize) { - case 8: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 7: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 6: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 5: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 4: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; /* Falls through. */ - case 0: - default: out[i] = (a[i] - b[i]) - carry; - } -} - - -/* is a < b */ -static int -lt256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { - switch (limbsize) { - case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; /* Falls through. */ - case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; /* Falls through. */ - case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; /* Falls through. */ - case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; /* Falls through. */ - case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; /* Falls through. */ - case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; /* Falls through. */ - case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; /* Falls through. */ - case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; /* Falls through. */ - case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; - } - return 0; -} - -/* is a <= b */ -static int -lte256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { - switch (limbsize) { - case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; /* Falls through. */ - case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; /* Falls through. */ - case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; /* Falls through. */ - case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; /* Falls through. */ - case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; /* Falls through. */ - case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; /* Falls through. */ - case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; /* Falls through. */ - case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; /* Falls through. */ - case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; - } - return 1; -} - - -/* is a == 0 */ -static int -iszero256_modm_batch(const bignum256modm a) { - size_t i; - for (i = 0; i < 9; i++) - if (a[i]) - return 0; - return 1; -} - -/* is a == 1 */ -static int -isone256_modm_batch(const bignum256modm a) { - size_t i; - if (a[0] != 1) - return 0; - for (i = 1; i < 9; i++) - if (a[i]) - return 0; - return 1; -} - -/* can a fit in to (at most) 128 bits */ -static int -isatmost128bits256_modm_batch(const bignum256modm a) { - uint32_t mask = - ((a[8] ) | /* 16 */ - (a[7] ) | /* 46 */ - (a[6] ) | /* 76 */ - (a[5] ) | /* 106 */ - (a[4] & 0x3fffff00)); /* 128 */ - - return (mask == 0); -} diff --git a/src/tor/src/ext/ed25519/donna/modm-donna-64bit.h b/src/tor/src/ext/ed25519/donna/modm-donna-64bit.h deleted file mode 100644 index 06c98e303..000000000 --- a/src/tor/src/ext/ed25519/donna/modm-donna-64bit.h +++ /dev/null @@ -1,366 +0,0 @@ -/* - Public domain by Andrew M. -*/ - - -/* - Arithmetic modulo the group order n = 2^252 + 27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 - - k = 32 - b = 1 << 8 = 256 - m = 2^252 + 27742317777372353535851937790883648493 = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed - mu = floor( b^(k*2) / m ) = 0xfffffffffffffffffffffffffffffffeb2106215d086329a7ed9ce5a30a2c131b -*/ - -#define bignum256modm_bits_per_limb 56 -#define bignum256modm_limb_size 5 - -typedef uint64_t bignum256modm_element_t; -typedef bignum256modm_element_t bignum256modm[5]; - -static const bignum256modm modm_m = { - 0x12631a5cf5d3ed, - 0xf9dea2f79cd658, - 0x000000000014de, - 0x00000000000000, - 0x00000010000000 -}; - -static const bignum256modm modm_mu = { - 0x9ce5a30a2c131b, - 0x215d086329a7ed, - 0xffffffffeb2106, - 0xffffffffffffff, - 0x00000fffffffff -}; - -static bignum256modm_element_t -lt_modm(bignum256modm_element_t a, bignum256modm_element_t b) { - return (a - b) >> 63; -} - -static void -reduce256_modm(bignum256modm r) { - bignum256modm t; - bignum256modm_element_t b = 0, pb, mask; - - /* t = r - m */ - pb = 0; - pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 56)); pb = b; - pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 56)); pb = b; - pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 56)); pb = b; - pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 56)); pb = b; - pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 32)); - - /* keep r if r was smaller than m */ - mask = b - 1; - - r[0] ^= mask & (r[0] ^ t[0]); - r[1] ^= mask & (r[1] ^ t[1]); - r[2] ^= mask & (r[2] ^ t[2]); - r[3] ^= mask & (r[3] ^ t[3]); - r[4] ^= mask & (r[4] ^ t[4]); -} - -static void -barrett_reduce256_modm(bignum256modm r, const bignum256modm q1, const bignum256modm r1) { - bignum256modm q3, r2; - uint128_t c, mul; - bignum256modm_element_t f, b, pb; - - /* q1 = x >> 248 = 264 bits = 5 56 bit elements - q2 = mu * q1 - q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ - mul64x64_128(c, modm_mu[0], q1[3]) mul64x64_128(mul, modm_mu[3], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[2]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[1]) add128(c, mul) shr128(f, c, 56); - mul64x64_128(c, modm_mu[0], q1[4]) add128_64(c, f) mul64x64_128(mul, modm_mu[4], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[1]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[2]) add128(c, mul) - f = lo128(c); q3[0] = (f >> 40) & 0xffff; shr128(f, c, 56); - mul64x64_128(c, modm_mu[4], q1[1]) add128_64(c, f) mul64x64_128(mul, modm_mu[1], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[2]) add128(c, mul) - f = lo128(c); q3[0] |= (f << 16) & 0xffffffffffffff; q3[1] = (f >> 40) & 0xffff; shr128(f, c, 56); - mul64x64_128(c, modm_mu[4], q1[2]) add128_64(c, f) mul64x64_128(mul, modm_mu[2], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[3]) add128(c, mul) - f = lo128(c); q3[1] |= (f << 16) & 0xffffffffffffff; q3[2] = (f >> 40) & 0xffff; shr128(f, c, 56); - mul64x64_128(c, modm_mu[4], q1[3]) add128_64(c, f) mul64x64_128(mul, modm_mu[3], q1[4]) add128(c, mul) - f = lo128(c); q3[2] |= (f << 16) & 0xffffffffffffff; q3[3] = (f >> 40) & 0xffff; shr128(f, c, 56); - mul64x64_128(c, modm_mu[4], q1[4]) add128_64(c, f) - f = lo128(c); q3[3] |= (f << 16) & 0xffffffffffffff; q3[4] = (f >> 40) & 0xffff; shr128(f, c, 56); - q3[4] |= (f << 16); - - mul64x64_128(c, modm_m[0], q3[0]) - r2[0] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, modm_m[0], q3[1]) add128_64(c, f) mul64x64_128(mul, modm_m[1], q3[0]) add128(c, mul) - r2[1] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, modm_m[0], q3[2]) add128_64(c, f) mul64x64_128(mul, modm_m[2], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[1]) add128(c, mul) - r2[2] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, modm_m[0], q3[3]) add128_64(c, f) mul64x64_128(mul, modm_m[3], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[2]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[1]) add128(c, mul) - r2[3] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, modm_m[0], q3[4]) add128_64(c, f) mul64x64_128(mul, modm_m[4], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[3], q3[1]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[3]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[2]) add128(c, mul) - r2[4] = lo128(c) & 0x0000ffffffffff; - - pb = 0; - pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 56)); pb = b; - pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 56)); pb = b; - pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 56)); pb = b; - pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 56)); pb = b; - pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 40)); - - reduce256_modm(r); - reduce256_modm(r); -} - - -static void -add256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { - bignum256modm_element_t c; - - c = x[0] + y[0]; r[0] = c & 0xffffffffffffff; c >>= 56; - c += x[1] + y[1]; r[1] = c & 0xffffffffffffff; c >>= 56; - c += x[2] + y[2]; r[2] = c & 0xffffffffffffff; c >>= 56; - c += x[3] + y[3]; r[3] = c & 0xffffffffffffff; c >>= 56; - c += x[4] + y[4]; r[4] = c; - - reduce256_modm(r); -} - -static void -mul256_modm(bignum256modm r, const bignum256modm x, const bignum256modm y) { - bignum256modm q1, r1; - uint128_t c, mul; - bignum256modm_element_t f; - - mul64x64_128(c, x[0], y[0]) - f = lo128(c); r1[0] = f & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, x[0], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[0]) add128(c, mul) - f = lo128(c); r1[1] = f & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, x[0], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[1]) add128(c, mul) - f = lo128(c); r1[2] = f & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, x[0], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[2]) add128(c, mul) mul64x64_128(mul, x[2], y[1]) add128(c, mul) - f = lo128(c); r1[3] = f & 0xffffffffffffff; shr128(f, c, 56); - mul64x64_128(c, x[0], y[4]) add128_64(c, f) mul64x64_128(mul, x[4], y[0]) add128(c, mul) mul64x64_128(mul, x[3], y[1]) add128(c, mul) mul64x64_128(mul, x[1], y[3]) add128(c, mul) mul64x64_128(mul, x[2], y[2]) add128(c, mul) - f = lo128(c); r1[4] = f & 0x0000ffffffffff; q1[0] = (f >> 24) & 0xffffffff; shr128(f, c, 56); - mul64x64_128(c, x[4], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[4]) add128(c, mul) mul64x64_128(mul, x[2], y[3]) add128(c, mul) mul64x64_128(mul, x[3], y[2]) add128(c, mul) - f = lo128(c); q1[0] |= (f << 32) & 0xffffffffffffff; q1[1] = (f >> 24) & 0xffffffff; shr128(f, c, 56); - mul64x64_128(c, x[4], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[4]) add128(c, mul) mul64x64_128(mul, x[3], y[3]) add128(c, mul) - f = lo128(c); q1[1] |= (f << 32) & 0xffffffffffffff; q1[2] = (f >> 24) & 0xffffffff; shr128(f, c, 56); - mul64x64_128(c, x[4], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[4]) add128(c, mul) - f = lo128(c); q1[2] |= (f << 32) & 0xffffffffffffff; q1[3] = (f >> 24) & 0xffffffff; shr128(f, c, 56); - mul64x64_128(c, x[4], y[4]) add128_64(c, f) - f = lo128(c); q1[3] |= (f << 32) & 0xffffffffffffff; q1[4] = (f >> 24) & 0xffffffff; shr128(f, c, 56); - q1[4] |= (f << 32); - - barrett_reduce256_modm(r, q1, r1); -} - -static void -expand256_modm(bignum256modm out, const unsigned char *in, size_t len) { - unsigned char work[64] = {0}; - bignum256modm_element_t x[16]; - bignum256modm q1; - - memcpy(work, in, len); - x[0] = U8TO64_LE(work + 0); - x[1] = U8TO64_LE(work + 8); - x[2] = U8TO64_LE(work + 16); - x[3] = U8TO64_LE(work + 24); - x[4] = U8TO64_LE(work + 32); - x[5] = U8TO64_LE(work + 40); - x[6] = U8TO64_LE(work + 48); - x[7] = U8TO64_LE(work + 56); - - /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ - out[0] = ( x[0]) & 0xffffffffffffff; - out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; - out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; - out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; - out[4] = ((x[ 3] >> 32) | (x[ 4] << 32)) & 0x0000ffffffffff; - - /* under 252 bits, no need to reduce */ - if (len < 32) - return; - - /* q1 = x >> 248 = 264 bits */ - q1[0] = ((x[ 3] >> 56) | (x[ 4] << 8)) & 0xffffffffffffff; - q1[1] = ((x[ 4] >> 48) | (x[ 5] << 16)) & 0xffffffffffffff; - q1[2] = ((x[ 5] >> 40) | (x[ 6] << 24)) & 0xffffffffffffff; - q1[3] = ((x[ 6] >> 32) | (x[ 7] << 32)) & 0xffffffffffffff; - q1[4] = ((x[ 7] >> 24) ); - - barrett_reduce256_modm(out, q1, out); -} - -static void -expand_raw256_modm(bignum256modm out, const unsigned char in[32]) { - bignum256modm_element_t x[4]; - - x[0] = U8TO64_LE(in + 0); - x[1] = U8TO64_LE(in + 8); - x[2] = U8TO64_LE(in + 16); - x[3] = U8TO64_LE(in + 24); - - out[0] = ( x[0]) & 0xffffffffffffff; - out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; - out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; - out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; - out[4] = ((x[ 3] >> 32) ) & 0x000000ffffffff; -} - -static void -contract256_modm(unsigned char out[32], const bignum256modm in) { - U64TO8_LE(out + 0, (in[0] ) | (in[1] << 56)); - U64TO8_LE(out + 8, (in[1] >> 8) | (in[2] << 48)); - U64TO8_LE(out + 16, (in[2] >> 16) | (in[3] << 40)); - U64TO8_LE(out + 24, (in[3] >> 24) | (in[4] << 32)); -} - -static void -contract256_window4_modm(signed char r[64], const bignum256modm in) { - char carry; - signed char *quads = r; - bignum256modm_element_t i, j, v, m; - - for (i = 0; i < 5; i++) { - v = in[i]; - m = (i == 4) ? 8 : 14; - for (j = 0; j < m; j++) { - *quads++ = (v & 15); - v >>= 4; - } - } - - /* making it signed */ - carry = 0; - for(i = 0; i < 63; i++) { - r[i] += carry; - r[i+1] += (r[i] >> 4); - r[i] &= 15; - carry = (r[i] >> 3); - r[i] -= (carry << 4); - } - r[63] += carry; -} - -static void -contract256_slidingwindow_modm(signed char r[256], const bignum256modm s, int windowsize) { - int i,j,k,b; - int m = (1 << (windowsize - 1)) - 1; - const int soplen = 256; - signed char *bits = r; - bignum256modm_element_t v; - - /* first put the binary expansion into r */ - for (i = 0; i < 4; i++) { - v = s[i]; - for (j = 0; j < 56; j++, v >>= 1) - *bits++ = (v & 1); - } - v = s[4]; - for (j = 0; j < 32; j++, v >>= 1) - *bits++ = (v & 1); - - /* Making it sliding window */ - for (j = 0; j < soplen; j++) { - if (!r[j]) - continue; - - for (b = 1; (b < (soplen - j)) && (b <= 6); b++) { - /* XXX Tor: coverity scan says that r[j+b] can - * overflow, but that's not possible: b < (soplen-j) - * guarantees that b + j < soplen, so b+j < 256, - * so the index doesn't overflow. */ - if ((r[j] + (r[j + b] << b)) <= m) { - r[j] += r[j + b] << b; - r[j + b] = 0; - } else if ((r[j] - (r[j + b] << b)) >= -m) { - r[j] -= r[j + b] << b; - for (k = j + b; k < soplen; k++) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else if (r[j + b]) { - break; - } - } - } -} - -/* - helpers for batch verifcation, are allowed to be vartime -*/ - -/* out = a - b, a must be larger than b */ -static void -sub256_modm_batch(bignum256modm out, const bignum256modm a, const bignum256modm b, size_t limbsize) { - size_t i = 0; - bignum256modm_element_t carry = 0; - switch (limbsize) { - case 4: out[i] = (a[i] - b[i]) ; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ - case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ - case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ - case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; /* Falls through. */ - case 0: - default: out[i] = (a[i] - b[i]) - carry; - } -} - - -/* is a < b */ -static int -lt256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { - size_t i = 0; - bignum256modm_element_t t, carry = 0; - switch (limbsize) { - case 4: t = (a[i] - b[i]) ; carry = (t >> 63); i++; /* Falls through. */ - case 3: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 2: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 1: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 0: t = (a[i] - b[i]) - carry; carry = (t >> 63); - } - return (int)carry; -} - -/* is a <= b */ -static int -lte256_modm_batch(const bignum256modm a, const bignum256modm b, size_t limbsize) { - size_t i = 0; - bignum256modm_element_t t, carry = 0; - switch (limbsize) { - case 4: t = (b[i] - a[i]) ; carry = (t >> 63); i++; /* Falls through. */ - case 3: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 2: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 1: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; /* Falls through. */ - case 0: t = (b[i] - a[i]) - carry; carry = (t >> 63); - } - return (int)!carry; -} - -/* is a == 0 */ -static int -iszero256_modm_batch(const bignum256modm a) { - size_t i; - for (i = 0; i < 5; i++) - if (a[i]) - return 0; - return 1; -} - -/* is a == 1 */ -static int -isone256_modm_batch(const bignum256modm a) { - size_t i; - for (i = 0; i < 5; i++) - if (a[i] != ((i) ? 0 : 1)) - return 0; - return 1; -} - -/* can a fit in to (at most) 128 bits */ -static int -isatmost128bits256_modm_batch(const bignum256modm a) { - uint64_t mask = - ((a[4] ) | /* 32 */ - (a[3] ) | /* 88 */ - (a[2] & 0xffffffffff0000)); - - return (mask == 0); -} diff --git a/src/tor/src/ext/ed25519/donna/regression.h b/src/tor/src/ext/ed25519/donna/regression.h deleted file mode 100644 index b4c2e62c0..000000000 --- a/src/tor/src/ext/ed25519/donna/regression.h +++ /dev/null @@ -1,1024 +0,0 @@ -{{0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60,0xba,0x84,0x4a,0xf4,0x92,0xec,0x2c,0xc4,0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x19,0x70,0x3b,0xac,0x03,0x1c,0xae,0x7f,0x60,},{0xd7,0x5a,0x98,0x01,0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3,0xc9,0x64,0x07,0x3a,0x0e,0xe1,0x72,0xf3,0xda,0xa6,0x23,0x25,0xaf,0x02,0x1a,0x68,0xf7,0x07,0x51,0x1a,},{0xe5,0x56,0x43,0x00,0xc3,0x60,0xac,0x72,0x90,0x86,0xe2,0xcc,0x80,0x6e,0x82,0x8a,0x84,0x87,0x7f,0x1e,0xb8,0xe5,0xd9,0x74,0xd8,0x73,0xe0,0x65,0x22,0x49,0x01,0x55,0x5f,0xb8,0x82,0x15,0x90,0xa3,0x3b,0xac,0xc6,0x1e,0x39,0x70,0x1c,0xf9,0xb4,0x6b,0xd2,0x5b,0xf5,0xf0,0x59,0x5b,0xbe,0x24,0x65,0x51,0x41,0x43,0x8e,0x7a,0x10,0x0b,},""}, -{{0x4c,0xcd,0x08,0x9b,0x28,0xff,0x96,0xda,0x9d,0xb6,0xc3,0x46,0xec,0x11,0x4e,0x0f,0x5b,0x8a,0x31,0x9f,0x35,0xab,0xa6,0x24,0xda,0x8c,0xf6,0xed,0x4f,0xb8,0xa6,0xfb,},{0x3d,0x40,0x17,0xc3,0xe8,0x43,0x89,0x5a,0x92,0xb7,0x0a,0xa7,0x4d,0x1b,0x7e,0xbc,0x9c,0x98,0x2c,0xcf,0x2e,0xc4,0x96,0x8c,0xc0,0xcd,0x55,0xf1,0x2a,0xf4,0x66,0x0c,},{0x92,0xa0,0x09,0xa9,0xf0,0xd4,0xca,0xb8,0x72,0x0e,0x82,0x0b,0x5f,0x64,0x25,0x40,0xa2,0xb2,0x7b,0x54,0x16,0x50,0x3f,0x8f,0xb3,0x76,0x22,0x23,0xeb,0xdb,0x69,0xda,0x08,0x5a,0xc1,0xe4,0x3e,0x15,0x99,0x6e,0x45,0x8f,0x36,0x13,0xd0,0xf1,0x1d,0x8c,0x38,0x7b,0x2e,0xae,0xb4,0x30,0x2a,0xee,0xb0,0x0d,0x29,0x16,0x12,0xbb,0x0c,0x00,},"\x72"}, -{{0xc5,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b,0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1,0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b,0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7,},{0xfc,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3,0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58,0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac,0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25,},{0x62,0x91,0xd6,0x57,0xde,0xec,0x24,0x02,0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3,0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44,0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac,0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90,0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59,0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d,0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a,},"\xaf\x82"}, -{{0x0d,0x4a,0x05,0xb0,0x73,0x52,0xa5,0x43,0x6e,0x18,0x03,0x56,0xda,0x0a,0xe6,0xef,0xa0,0x34,0x5f,0xf7,0xfb,0x15,0x72,0x57,0x57,0x72,0xe8,0x00,0x5e,0xd9,0x78,0xe9,},{0xe6,0x1a,0x18,0x5b,0xce,0xf2,0x61,0x3a,0x6c,0x7c,0xb7,0x97,0x63,0xce,0x94,0x5d,0x3b,0x24,0x5d,0x76,0x11,0x4d,0xd4,0x40,0xbc,0xf5,0xf2,0xdc,0x1a,0xa5,0x70,0x57,},{0xd9,0x86,0x8d,0x52,0xc2,0xbe,0xbc,0xe5,0xf3,0xfa,0x5a,0x79,0x89,0x19,0x70,0xf3,0x09,0xcb,0x65,0x91,0xe3,0xe1,0x70,0x2a,0x70,0x27,0x6f,0xa9,0x7c,0x24,0xb3,0xa8,0xe5,0x86,0x06,0xc3,0x8c,0x97,0x58,0x52,0x9d,0xa5,0x0e,0xe3,0x1b,0x82,0x19,0xcb,0xa4,0x52,0x71,0xc6,0x89,0xaf,0xa6,0x0b,0x0e,0xa2,0x6c,0x99,0xdb,0x19,0xb0,0x0c,},"\xcb\xc7\x7b"}, -{{0x6d,0xf9,0x34,0x0c,0x13,0x8c,0xc1,0x88,0xb5,0xfe,0x44,0x64,0xeb,0xaa,0x3f,0x7f,0xc2,0x06,0xa2,0xd5,0x5c,0x34,0x34,0x70,0x7e,0x74,0xc9,0xfc,0x04,0xe2,0x0e,0xbb,},{0xc0,0xda,0xc1,0x02,0xc4,0x53,0x31,0x86,0xe2,0x5d,0xc4,0x31,0x28,0x47,0x23,0x53,0xea,0xab,0xdb,0x87,0x8b,0x15,0x2a,0xeb,0x8e,0x00,0x1f,0x92,0xd9,0x02,0x33,0xa7,},{0x12,0x4f,0x6f,0xc6,0xb0,0xd1,0x00,0x84,0x27,0x69,0xe7,0x1b,0xd5,0x30,0x66,0x4d,0x88,0x8d,0xf8,0x50,0x7d,0xf6,0xc5,0x6d,0xed,0xfd,0xb5,0x09,0xae,0xb9,0x34,0x16,0xe2,0x6b,0x91,0x8d,0x38,0xaa,0x06,0x30,0x5d,0xf3,0x09,0x56,0x97,0xc1,0x8b,0x2a,0xa8,0x32,0xea,0xa5,0x2e,0xdc,0x0a,0xe4,0x9f,0xba,0xe5,0xa8,0x5e,0x15,0x0c,0x07,},"\x5f\x4c\x89\x89"}, -{{0xb7,0x80,0x38,0x1a,0x65,0xed,0xf8,0xb7,0x8f,0x69,0x45,0xe8,0xdb,0xec,0x79,0x41,0xac,0x04,0x9f,0xd4,0xc6,0x10,0x40,0xcf,0x0c,0x32,0x43,0x57,0x97,0x5a,0x29,0x3c,},{0xe2,0x53,0xaf,0x07,0x66,0x80,0x4b,0x86,0x9b,0xb1,0x59,0x5b,0xe9,0x76,0x5b,0x53,0x48,0x86,0xbb,0xaa,0xb8,0x30,0x5b,0xf5,0x0d,0xbc,0x7f,0x89,0x9b,0xfb,0x5f,0x01,},{0xb2,0xfc,0x46,0xad,0x47,0xaf,0x46,0x44,0x78,0xc1,0x99,0xe1,0xf8,0xbe,0x16,0x9f,0x1b,0xe6,0x32,0x7c,0x7f,0x9a,0x0a,0x66,0x89,0x37,0x1c,0xa9,0x4c,0xaf,0x04,0x06,0x4a,0x01,0xb2,0x2a,0xff,0x15,0x20,0xab,0xd5,0x89,0x51,0x34,0x16,0x03,0xfa,0xed,0x76,0x8c,0xf7,0x8c,0xe9,0x7a,0xe7,0xb0,0x38,0xab,0xfe,0x45,0x6a,0xa1,0x7c,0x09,},"\x18\xb6\xbe\xc0\x97"}, -{{0x78,0xae,0x9e,0xff,0xe6,0xf2,0x45,0xe9,0x24,0xa7,0xbe,0x63,0x04,0x11,0x46,0xeb,0xc6,0x70,0xdb,0xd3,0x06,0x0c,0xba,0x67,0xfb,0xc6,0x21,0x6f,0xeb,0xc4,0x45,0x46,},{0xfb,0xcf,0xbf,0xa4,0x05,0x05,0xd7,0xf2,0xbe,0x44,0x4a,0x33,0xd1,0x85,0xcc,0x54,0xe1,0x6d,0x61,0x52,0x60,0xe1,0x64,0x0b,0x2b,0x50,0x87,0xb8,0x3e,0xe3,0x64,0x3d,},{0x6e,0xd6,0x29,0xfc,0x1d,0x9c,0xe9,0xe1,0x46,0x87,0x55,0xff,0x63,0x6d,0x5a,0x3f,0x40,0xa5,0xd9,0xc9,0x1a,0xfd,0x93,0xb7,0x9d,0x24,0x18,0x30,0xf7,0xe5,0xfa,0x29,0x85,0x4b,0x8f,0x20,0xcc,0x6e,0xec,0xbb,0x24,0x8d,0xbd,0x8d,0x16,0xd1,0x4e,0x99,0x75,0x21,0x94,0xe4,0x90,0x4d,0x09,0xc7,0x4d,0x63,0x95,0x18,0x83,0x9d,0x23,0x00,},"\x89\x01\x0d\x85\x59\x72"}, -{{0x69,0x18,0x65,0xbf,0xc8,0x2a,0x1e,0x4b,0x57,0x4e,0xec,0xde,0x4c,0x75,0x19,0x09,0x3f,0xaf,0x0c,0xf8,0x67,0x38,0x02,0x34,0xe3,0x66,0x46,0x45,0xc6,0x1c,0x5f,0x79,},{0x98,0xa5,0xe3,0xa3,0x6e,0x67,0xaa,0xba,0x89,0x88,0x8b,0xf0,0x93,0xde,0x1a,0xd9,0x63,0xe7,0x74,0x01,0x3b,0x39,0x02,0xbf,0xab,0x35,0x6d,0x8b,0x90,0x17,0x8a,0x63,},{0x6e,0x0a,0xf2,0xfe,0x55,0xae,0x37,0x7a,0x6b,0x7a,0x72,0x78,0xed,0xfb,0x41,0x9b,0xd3,0x21,0xe0,0x6d,0x0d,0xf5,0xe2,0x70,0x37,0xdb,0x88,0x12,0xe7,0xe3,0x52,0x98,0x10,0xfa,0x55,0x52,0xf6,0xc0,0x02,0x09,0x85,0xca,0x17,0xa0,0xe0,0x2e,0x03,0x6d,0x7b,0x22,0x2a,0x24,0xf9,0x9b,0x77,0xb7,0x5f,0xdd,0x16,0xcb,0x05,0x56,0x81,0x07,},"\xb4\xa8\xf3\x81\xe7\x0e\x7a"}, -{{0x3b,0x26,0x51,0x6f,0xb3,0xdc,0x88,0xeb,0x18,0x1b,0x9e,0xd7,0x3f,0x0b,0xcd,0x52,0xbc,0xd6,0xb4,0xc7,0x88,0xe4,0xbc,0xaf,0x46,0x05,0x7f,0xd0,0x78,0xbe,0xe0,0x73,},{0xf8,0x1f,0xb5,0x4a,0x82,0x5f,0xce,0xd9,0x5e,0xb0,0x33,0xaf,0xcd,0x64,0x31,0x40,0x75,0xab,0xfb,0x0a,0xbd,0x20,0xa9,0x70,0x89,0x25,0x03,0x43,0x6f,0x34,0xb8,0x63,},{0xd6,0xad,0xde,0xc5,0xaf,0xb0,0x52,0x8a,0xc1,0x7b,0xb1,0x78,0xd3,0xe7,0xf2,0x88,0x7f,0x9a,0xdb,0xb1,0xad,0x16,0xe1,0x10,0x54,0x5e,0xf3,0xbc,0x57,0xf9,0xde,0x23,0x14,0xa5,0xc8,0x38,0x8f,0x72,0x3b,0x89,0x07,0xbe,0x0f,0x3a,0xc9,0x0c,0x62,0x59,0xbb,0xe8,0x85,0xec,0xc1,0x76,0x45,0xdf,0x3d,0xb7,0xd4,0x88,0xf8,0x05,0xfa,0x08,},"\x42\x84\xab\xc5\x1b\xb6\x72\x35"}, -{{0xed,0xc6,0xf5,0xfb,0xdd,0x1c,0xee,0x4d,0x10,0x1c,0x06,0x35,0x30,0xa3,0x04,0x90,0xb2,0x21,0xbe,0x68,0xc0,0x36,0xf5,0xb0,0x7d,0x0f,0x95,0x3b,0x74,0x5d,0xf1,0x92,},{0xc1,0xa4,0x9c,0x66,0xe6,0x17,0xf9,0xef,0x5e,0xc6,0x6b,0xc4,0xc6,0x56,0x4c,0xa3,0x3d,0xe2,0xa5,0xfb,0x5e,0x14,0x64,0x06,0x2e,0x6d,0x6c,0x62,0x19,0x15,0x5e,0xfd,},{0x2c,0x76,0xa0,0x4a,0xf2,0x39,0x1c,0x14,0x70,0x82,0xe3,0x3f,0xaa,0xcd,0xbe,0x56,0x64,0x2a,0x1e,0x13,0x4b,0xd3,0x88,0x62,0x0b,0x85,0x2b,0x90,0x1a,0x6b,0xc1,0x6f,0xf6,0xc9,0xcc,0x94,0x04,0xc4,0x1d,0xea,0x12,0xed,0x28,0x1d,0xa0,0x67,0xa1,0x51,0x38,0x66,0xf9,0xd9,0x64,0xf8,0xbd,0xd2,0x49,0x53,0x85,0x6c,0x50,0x04,0x29,0x01,},"\x67\x2b\xf8\x96\x5d\x04\xbc\x51\x46"}, -{{0x4e,0x7d,0x21,0xfb,0x3b,0x18,0x97,0x57,0x1a,0x44,0x58,0x33,0xbe,0x0f,0x9f,0xd4,0x1c,0xd6,0x2b,0xe3,0xaa,0x04,0x04,0x0f,0x89,0x34,0xe1,0xfc,0xbd,0xca,0xcd,0x45,},{0x31,0xb2,0x52,0x4b,0x83,0x48,0xf7,0xab,0x1d,0xfa,0xfa,0x67,0x5c,0xc5,0x38,0xe9,0xa8,0x4e,0x3f,0xe5,0x81,0x9e,0x27,0xc1,0x2a,0xd8,0xbb,0xc1,0xa3,0x6e,0x4d,0xff,},{0x28,0xe4,0x59,0x8c,0x41,0x5a,0xe9,0xde,0x01,0xf0,0x3f,0x9f,0x3f,0xab,0x4e,0x91,0x9e,0x8b,0xf5,0x37,0xdd,0x2b,0x0c,0xdf,0x6e,0x79,0xb9,0xe6,0x55,0x9c,0x94,0x09,0xd9,0x15,0x1a,0x4c,0x40,0xf0,0x83,0x19,0x39,0x37,0x62,0x7c,0x36,0x94,0x88,0x25,0x9e,0x99,0xda,0x5a,0x9f,0x0a,0x87,0x49,0x7f,0xa6,0x69,0x6a,0x5d,0xd6,0xce,0x08,},"\x33\xd7\xa7\x86\xad\xed\x8c\x1b\xf6\x91"}, -{{0xa9,0x80,0xf8,0x92,0xdb,0x13,0xc9,0x9a,0x3e,0x89,0x71,0xe9,0x65,0xb2,0xff,0x3d,0x41,0xea,0xfd,0x54,0x09,0x3b,0xc9,0xf3,0x4d,0x1f,0xd2,0x2d,0x84,0x11,0x5b,0xb6,},{0x44,0xb5,0x7e,0xe3,0x0c,0xdb,0x55,0x82,0x9d,0x0a,0x5d,0x4f,0x04,0x6b,0xae,0xf0,0x78,0xf1,0xe9,0x7a,0x7f,0x21,0xb6,0x2d,0x75,0xf8,0xe9,0x6e,0xa1,0x39,0xc3,0x5f,},{0x77,0xd3,0x89,0xe5,0x99,0x63,0x0d,0x93,0x40,0x76,0x32,0x95,0x83,0xcd,0x41,0x05,0xa6,0x49,0xa9,0x29,0x2a,0xbc,0x44,0xcd,0x28,0xc4,0x00,0x00,0xc8,0xe2,0xf5,0xac,0x76,0x60,0xa8,0x1c,0x85,0xb7,0x2a,0xf8,0x45,0x2d,0x7d,0x25,0xc0,0x70,0x86,0x1d,0xae,0x91,0x60,0x1c,0x78,0x03,0xd6,0x56,0x53,0x16,0x50,0xdd,0x4e,0x5c,0x41,0x00,},"\x34\x86\xf6\x88\x48\xa6\x5a\x0e\xb5\x50\x7d"}, -{{0x5b,0x5a,0x61,0x9f,0x8c,0xe1,0xc6,0x6d,0x7c,0xe2,0x6e,0x5a,0x2a,0xe7,0xb0,0xc0,0x4f,0xeb,0xcd,0x34,0x6d,0x28,0x6c,0x92,0x9e,0x19,0xd0,0xd5,0x97,0x3b,0xfe,0xf9,},{0x6f,0xe8,0x36,0x93,0xd0,0x11,0xd1,0x11,0x13,0x1c,0x4f,0x3f,0xba,0xaa,0x40,0xa9,0xd3,0xd7,0x6b,0x30,0x01,0x2f,0xf7,0x3b,0xb0,0xe3,0x9e,0xc2,0x7a,0xb1,0x82,0x57,},{0x0f,0x9a,0xd9,0x79,0x30,0x33,0xa2,0xfa,0x06,0x61,0x4b,0x27,0x7d,0x37,0x38,0x1e,0x6d,0x94,0xf6,0x5a,0xc2,0xa5,0xa9,0x45,0x58,0xd0,0x9e,0xd6,0xce,0x92,0x22,0x58,0xc1,0xa5,0x67,0x95,0x2e,0x86,0x3a,0xc9,0x42,0x97,0xae,0xc3,0xc0,0xd0,0xc8,0xdd,0xf7,0x10,0x84,0xe5,0x04,0x86,0x0b,0xb6,0xba,0x27,0x44,0x9b,0x55,0xad,0xc4,0x0e,},"\x5a\x8d\x9d\x0a\x22\x35\x7e\x66\x55\xf9\xc7\x85"}, -{{0x94,0x0c,0x89,0xfe,0x40,0xa8,0x1d,0xaf,0xbd,0xb2,0x41,0x6d,0x14,0xae,0x46,0x91,0x19,0x86,0x97,0x44,0x41,0x0c,0x33,0x03,0xbf,0xaa,0x02,0x41,0xda,0xc5,0x78,0x00,},{0xa2,0xeb,0x8c,0x05,0x01,0xe3,0x0b,0xae,0x0c,0xf8,0x42,0xd2,0xbd,0xe8,0xde,0xc7,0x38,0x6f,0x6b,0x7f,0xc3,0x98,0x1b,0x8c,0x57,0xc9,0x79,0x2b,0xb9,0x4c,0xf2,0xdd,},{0xd8,0xbb,0x64,0xaa,0xd8,0xc9,0x95,0x5a,0x11,0x5a,0x79,0x3a,0xdd,0xd2,0x4f,0x7f,0x2b,0x07,0x76,0x48,0x71,0x4f,0x49,0xc4,0x69,0x4e,0xc9,0x95,0xb3,0x30,0xd0,0x9d,0x64,0x0d,0xf3,0x10,0xf4,0x47,0xfd,0x7b,0x6c,0xb5,0xc1,0x4f,0x9f,0xe9,0xf4,0x90,0xbc,0xf8,0xcf,0xad,0xbf,0xd2,0x16,0x9c,0x8a,0xc2,0x0d,0x3b,0x8a,0xf4,0x9a,0x0c,},"\xb8\x7d\x38\x13\xe0\x3f\x58\xcf\x19\xfd\x0b\x63\x95"}, -{{0x9a,0xca,0xd9,0x59,0xd2,0x16,0x21,0x2d,0x78,0x9a,0x11,0x92,0x52,0xeb,0xfe,0x0c,0x96,0x51,0x2a,0x23,0xc7,0x3b,0xd9,0xf3,0xb2,0x02,0x29,0x2d,0x69,0x16,0xa7,0x38,},{0xcf,0x3a,0xf8,0x98,0x46,0x7a,0x5b,0x7a,0x52,0xd3,0x3d,0x53,0xbc,0x03,0x7e,0x26,0x42,0xa8,0xda,0x99,0x69,0x03,0xfc,0x25,0x22,0x17,0xe9,0xc0,0x33,0xe2,0xf2,0x91,},{0x6e,0xe3,0xfe,0x81,0xe2,0x3c,0x60,0xeb,0x23,0x12,0xb2,0x00,0x6b,0x3b,0x25,0xe6,0x83,0x8e,0x02,0x10,0x66,0x23,0xf8,0x44,0xc4,0x4e,0xdb,0x8d,0xaf,0xd6,0x6a,0xb0,0x67,0x10,0x87,0xfd,0x19,0x5d,0xf5,0xb8,0xf5,0x8a,0x1d,0x6e,0x52,0xaf,0x42,0x90,0x80,0x53,0xd5,0x5c,0x73,0x21,0x01,0x00,0x92,0x74,0x87,0x95,0xef,0x94,0xcf,0x06,},"\x55\xc7\xfa\x43\x4f\x5e\xd8\xcd\xec\x2b\x7a\xea\xc1\x73"}, -{{0xd5,0xae,0xee,0x41,0xee,0xb0,0xe9,0xd1,0xbf,0x83,0x37,0xf9,0x39,0x58,0x7e,0xbe,0x29,0x61,0x61,0xe6,0xbf,0x52,0x09,0xf5,0x91,0xec,0x93,0x9e,0x14,0x40,0xc3,0x00,},{0xfd,0x2a,0x56,0x57,0x23,0x16,0x3e,0x29,0xf5,0x3c,0x9d,0xe3,0xd5,0xe8,0xfb,0xe3,0x6a,0x7a,0xb6,0x6e,0x14,0x39,0xec,0x4e,0xae,0x9c,0x0a,0x60,0x4a,0xf2,0x91,0xa5,},{0xf6,0x8d,0x04,0x84,0x7e,0x5b,0x24,0x97,0x37,0x89,0x9c,0x01,0x4d,0x31,0xc8,0x05,0xc5,0x00,0x7a,0x62,0xc0,0xa1,0x0d,0x50,0xbb,0x15,0x38,0xc5,0xf3,0x55,0x03,0x95,0x1f,0xbc,0x1e,0x08,0x68,0x2f,0x2c,0xc0,0xc9,0x2e,0xfe,0x8f,0x49,0x85,0xde,0xc6,0x1d,0xcb,0xd5,0x4d,0x4b,0x94,0xa2,0x25,0x47,0xd2,0x44,0x51,0x27,0x1c,0x8b,0x00,},"\x0a\x68\x8e\x79\xbe\x24\xf8\x66\x28\x6d\x46\x46\xb5\xd8\x1c"}, -{{0x0a,0x47,0xd1,0x04,0x52,0xae,0x2f,0xeb,0xec,0x51,0x8a,0x1c,0x7c,0x36,0x28,0x90,0xc3,0xfc,0x1a,0x49,0xd3,0x4b,0x03,0xb6,0x46,0x7d,0x35,0xc9,0x04,0xa8,0x36,0x2d,},{0x34,0xe5,0xa8,0x50,0x8c,0x47,0x43,0x74,0x69,0x62,0xc0,0x66,0xe4,0xba,0xde,0xa2,0x20,0x1b,0x8a,0xb4,0x84,0xde,0x5c,0x4f,0x94,0x47,0x6c,0xcd,0x21,0x43,0x95,0x5b,},{0x2a,0x3d,0x27,0xdc,0x40,0xd0,0xa8,0x12,0x79,0x49,0xa3,0xb7,0xf9,0x08,0xb3,0x68,0x8f,0x63,0xb7,0xf1,0x4f,0x65,0x1a,0xac,0xd7,0x15,0x94,0x0b,0xdb,0xe2,0x7a,0x08,0x09,0xaa,0xc1,0x42,0xf4,0x7a,0xb0,0xe1,0xe4,0x4f,0xa4,0x90,0xba,0x87,0xce,0x53,0x92,0xf3,0x3a,0x89,0x15,0x39,0xca,0xf1,0xef,0x4c,0x36,0x7c,0xae,0x54,0x50,0x0c,},"\xc9\x42\xfa\x7a\xc6\xb2\x3a\xb7\xff\x61\x2f\xdc\x8e\x68\xef\x39"}, -{{0xf8,0x14,0x8f,0x75,0x06,0xb7,0x75,0xef,0x46,0xfd,0xc8,0xe8,0xc7,0x56,0x51,0x68,0x12,0xd4,0x7d,0x6c,0xfb,0xfa,0x31,0x8c,0x27,0xc9,0xa2,0x26,0x41,0xe5,0x6f,0x17,},{0x04,0x45,0xe4,0x56,0xda,0xcc,0x7d,0x5b,0x0b,0xbe,0xd2,0x3c,0x82,0x00,0xcd,0xb7,0x4b,0xdc,0xb0,0x3e,0x4c,0x7b,0x73,0xf0,0xa2,0xb9,0xb4,0x6e,0xac,0x5d,0x43,0x72,},{0x36,0x53,0xcc,0xb2,0x12,0x19,0x20,0x2b,0x84,0x36,0xfb,0x41,0xa3,0x2b,0xa2,0x61,0x8c,0x4a,0x13,0x34,0x31,0xe6,0xe6,0x34,0x63,0xce,0xb3,0xb6,0x10,0x6c,0x4d,0x56,0xe1,0xd2,0xba,0x16,0x5b,0xa7,0x6e,0xaa,0xd3,0xdc,0x39,0xbf,0xfb,0x13,0x0f,0x1d,0xe3,0xd8,0xe6,0x42,0x7d,0xb5,0xb7,0x19,0x38,0xdb,0x4e,0x27,0x2b,0xc3,0xe2,0x0b,},"\x73\x68\x72\x4a\x5b\x0e\xfb\x57\xd2\x8d\x97\x62\x2d\xbd\xe7\x25\xaf"}, -{{0x77,0xf8,0x86,0x91,0xc4,0xef,0xf2,0x3e,0xbb,0x73,0x64,0x94,0x70,0x92,0x95,0x1a,0x5f,0xf3,0xf1,0x07,0x85,0xb4,0x17,0xe9,0x18,0x82,0x3a,0x55,0x2d,0xab,0x7c,0x75,},{0x74,0xd2,0x91,0x27,0xf1,0x99,0xd8,0x6a,0x86,0x76,0xae,0xc3,0x3b,0x4c,0xe3,0xf2,0x25,0xcc,0xb1,0x91,0xf5,0x2c,0x19,0x1c,0xcd,0x1e,0x8c,0xca,0x65,0x21,0x3a,0x6b,},{0xfb,0xe9,0x29,0xd7,0x43,0xa0,0x3c,0x17,0x91,0x05,0x75,0x49,0x2f,0x30,0x92,0xee,0x2a,0x2b,0xf1,0x4a,0x60,0xa3,0xfc,0xac,0xec,0x74,0xa5,0x8c,0x73,0x34,0x51,0x0f,0xc2,0x62,0xdb,0x58,0x27,0x91,0x32,0x2d,0x6c,0x8c,0x41,0xf1,0x70,0x0a,0xdb,0x80,0x02,0x7e,0xca,0xbc,0x14,0x27,0x0b,0x70,0x34,0x44,0xae,0x3e,0xe7,0x62,0x3e,0x0a,},"\xbd\x8e\x05\x03\x3f\x3a\x8b\xcd\xcb\xf4\xbe\xce\xb7\x09\x01\xc8\x2e\x31"}, -{{0xab,0x6f,0x7a,0xee,0x6a,0x08,0x37,0xb3,0x34,0xba,0x5e,0xb1,0xb2,0xad,0x7f,0xce,0xcf,0xab,0x7e,0x32,0x3c,0xab,0x18,0x7f,0xe2,0xe0,0xa9,0x5d,0x80,0xef,0xf1,0x32,},{0x5b,0x96,0xdc,0xa4,0x97,0x87,0x5b,0xf9,0x66,0x4c,0x5e,0x75,0xfa,0xcf,0x3f,0x9b,0xc5,0x4b,0xae,0x91,0x3d,0x66,0xca,0x15,0xee,0x85,0xf1,0x49,0x1c,0xa2,0x4d,0x2c,},{0x73,0xbc,0xa6,0x4e,0x9d,0xd0,0xdb,0x88,0x13,0x8e,0xed,0xfa,0xfc,0xea,0x8f,0x54,0x36,0xcf,0xb7,0x4b,0xfb,0x0e,0x77,0x33,0xcf,0x34,0x9b,0xaa,0x0c,0x49,0x77,0x5c,0x56,0xd5,0x93,0x4e,0x1d,0x38,0xe3,0x6f,0x39,0xb7,0xc5,0xbe,0xb0,0xa8,0x36,0x51,0x0c,0x45,0x12,0x6f,0x8e,0xc4,0xb6,0x81,0x05,0x19,0x90,0x5b,0x0c,0xa0,0x7c,0x09,},"\x81\x71\x45\x6f\x8b\x90\x71\x89\xb1\xd7\x79\xe2\x6b\xc5\xaf\xbb\x08\xc6\x7a"}, -{{0x8d,0x13,0x5d,0xe7,0xc8,0x41,0x1b,0xbd,0xbd,0x1b,0x31,0xe5,0xdc,0x67,0x8f,0x2a,0xc7,0x10,0x9e,0x79,0x2b,0x60,0xf3,0x8c,0xd2,0x49,0x36,0xe8,0xa8,0x98,0xc3,0x2d,},{0x1c,0xa2,0x81,0x93,0x85,0x29,0x89,0x65,0x35,0xa7,0x71,0x4e,0x35,0x84,0x08,0x5b,0x86,0xef,0x9f,0xec,0x72,0x3f,0x42,0x81,0x9f,0xc8,0xdd,0x5d,0x8c,0x00,0x81,0x7f,},{0xa1,0xad,0xc2,0xbc,0x6a,0x2d,0x98,0x06,0x62,0x67,0x7e,0x7f,0xdf,0xf6,0x42,0x4d,0xe7,0xdb,0xa5,0x0f,0x57,0x95,0xca,0x90,0xfd,0xf3,0xe9,0x6e,0x25,0x6f,0x32,0x85,0xca,0xc7,0x1d,0x33,0x60,0x48,0x2e,0x99,0x3d,0x02,0x94,0xba,0x4e,0xc7,0x44,0x0c,0x61,0xaf,0xfd,0xf3,0x5f,0xe8,0x3e,0x6e,0x04,0x26,0x39,0x37,0xdb,0x93,0xf1,0x05,},"\x8b\xa6\xa4\xc9\xa1\x5a\x24\x4a\x9c\x26\xbb\x2a\x59\xb1\x02\x6f\x21\x34\x8b\x49"}, -{{0x0e,0x76,0x5d,0x72,0x0e,0x70,0x5f,0x93,0x66,0xc1,0xab,0x8c,0x3f,0xa8,0x4c,0x9a,0x44,0x37,0x0c,0x06,0x96,0x9f,0x80,0x32,0x96,0x88,0x4b,0x28,0x46,0xa6,0x52,0xa4,},{0x7f,0xae,0x45,0xdd,0x0a,0x05,0x97,0x10,0x26,0xd4,0x10,0xbc,0x49,0x7a,0xf5,0xbe,0x7d,0x08,0x27,0xa8,0x2a,0x14,0x5c,0x20,0x3f,0x62,0x5d,0xfc,0xb8,0xb0,0x3b,0xa8,},{0xbb,0x61,0xcf,0x84,0xde,0x61,0x86,0x22,0x07,0xc6,0xa4,0x55,0x25,0x8b,0xc4,0xdb,0x4e,0x15,0xee,0xa0,0x31,0x7f,0xf8,0x87,0x18,0xb8,0x82,0xa0,0x6b,0x5c,0xf6,0xec,0x6f,0xd2,0x0c,0x5a,0x26,0x9e,0x5d,0x5c,0x80,0x5b,0xaf,0xbc,0xc5,0x79,0xe2,0x59,0x0a,0xf4,0x14,0xc7,0xc2,0x27,0x27,0x3c,0x10,0x2a,0x10,0x07,0x0c,0xdf,0xe8,0x0f,},"\x1d\x56\x6a\x62\x32\xbb\xaa\xb3\xe6\xd8\x80\x4b\xb5\x18\xa4\x98\xed\x0f\x90\x49\x86"}, -{{0xdb,0x36,0xe3,0x26,0xd6,0x76,0xc2,0xd1,0x9c,0xc8,0xfe,0x0c,0x14,0xb7,0x09,0x20,0x2e,0xcf,0xc7,0x61,0xd2,0x70,0x89,0xeb,0x6e,0xa4,0xb1,0xbb,0x02,0x1e,0xcf,0xa7,},{0x48,0x35,0x9b,0x85,0x0d,0x23,0xf0,0x71,0x5d,0x94,0xbb,0x8b,0xb7,0x5e,0x7e,0x14,0x32,0x2e,0xaf,0x14,0xf0,0x6f,0x28,0xa8,0x05,0x40,0x3f,0xbd,0xa0,0x02,0xfc,0x85,},{0xb6,0xdc,0xd0,0x99,0x89,0xdf,0xba,0xc5,0x43,0x22,0xa3,0xce,0x87,0x87,0x6e,0x1d,0x62,0x13,0x4d,0xa9,0x98,0xc7,0x9d,0x24,0xb5,0x0b,0xd7,0xa6,0xa7,0x97,0xd8,0x6a,0x0e,0x14,0xdc,0x9d,0x74,0x91,0xd6,0xc1,0x4a,0x67,0x3c,0x65,0x2c,0xfb,0xec,0x9f,0x96,0x2a,0x38,0xc9,0x45,0xda,0x3b,0x2f,0x08,0x79,0xd0,0xb6,0x8a,0x92,0x13,0x00,},"\x1b\x0a\xfb\x0a\xc4\xba\x9a\xb7\xb7\x17\x2c\xdd\xc9\xeb\x42\xbb\xa1\xa6\x4b\xce\x47\xd4"}, -{{0xc8,0x99,0x55,0xe0,0xf7,0x74,0x1d,0x90,0x5d,0xf0,0x73,0x0b,0x3d,0xc2,0xb0,0xce,0x1a,0x13,0x13,0x4e,0x44,0xfe,0xf3,0xd4,0x0d,0x60,0xc0,0x20,0xef,0x19,0xdf,0x77,},{0xfd,0xb3,0x06,0x73,0x40,0x2f,0xaf,0x1c,0x80,0x33,0x71,0x4f,0x35,0x17,0xe4,0x7c,0xc0,0xf9,0x1f,0xe7,0x0c,0xf3,0x83,0x6d,0x6c,0x23,0x63,0x6e,0x3f,0xd2,0x28,0x7c,},{0x7e,0xf6,0x6e,0x5e,0x86,0xf2,0x36,0x08,0x48,0xe0,0x01,0x4e,0x94,0x88,0x0a,0xe2,0x92,0x0a,0xd8,0xa3,0x18,0x5a,0x46,0xb3,0x5d,0x1e,0x07,0xde,0xa8,0xfa,0x8a,0xe4,0xf6,0xb8,0x43,0xba,0x17,0x4d,0x99,0xfa,0x79,0x86,0x65,0x4a,0x08,0x91,0xc1,0x2a,0x79,0x44,0x55,0x66,0x93,0x75,0xbf,0x92,0xaf,0x4c,0xc2,0x77,0x0b,0x57,0x9e,0x0c,},"\x50\x7c\x94\xc8\x82\x0d\x2a\x57\x93\xcb\xf3\x44\x2b\x3d\x71\x93\x6f\x35\xfe\x3a\xfe\xf3\x16"}, -{{0x4e,0x62,0x62,0x7f,0xc2,0x21,0x14,0x24,0x78,0xae,0xe7,0xf0,0x07,0x81,0xf8,0x17,0xf6,0x62,0xe3,0xb7,0x5d,0xb2,0x9b,0xb1,0x4a,0xb4,0x7c,0xf8,0xe8,0x41,0x04,0xd6,},{0xb1,0xd3,0x98,0x01,0x89,0x20,0x27,0xd5,0x8a,0x8c,0x64,0x33,0x51,0x63,0x19,0x58,0x93,0xbf,0xc1,0xb6,0x1d,0xbe,0xca,0x32,0x60,0x49,0x7e,0x1f,0x30,0x37,0x11,0x07,},{0x83,0x6a,0xfa,0x76,0x4d,0x9c,0x48,0xaa,0x47,0x70,0xa4,0x38,0x8b,0x65,0x4e,0x97,0xb3,0xc1,0x6f,0x08,0x29,0x67,0xfe,0xbc,0xa2,0x7f,0x2f,0xc4,0x7d,0xdf,0xd9,0x24,0x4b,0x03,0xcf,0xc7,0x29,0x69,0x8a,0xcf,0x51,0x09,0x70,0x43,0x46,0xb6,0x0b,0x23,0x0f,0x25,0x54,0x30,0x08,0x9d,0xdc,0x56,0x91,0x23,0x99,0xd1,0x12,0x2d,0xe7,0x0a,},"\xd3\xd6\x15\xa8\x47\x2d\x99\x62\xbb\x70\xc5\xb5\x46\x6a\x3d\x98\x3a\x48\x11\x04\x6e\x2a\x0e\xf5"}, -{{0x6b,0x83,0xd7,0xda,0x89,0x08,0xc3,0xe7,0x20,0x5b,0x39,0x86,0x4b,0x56,0xe5,0xf3,0xe1,0x71,0x96,0xa3,0xfc,0x9c,0x2f,0x58,0x05,0xaa,0xd0,0xf5,0x55,0x4c,0x14,0x2d,},{0xd0,0xc8,0x46,0xf9,0x7f,0xe2,0x85,0x85,0xc0,0xee,0x15,0x90,0x15,0xd6,0x4c,0x56,0x31,0x1c,0x88,0x6e,0xdd,0xcc,0x18,0x5d,0x29,0x6d,0xbb,0x16,0x5d,0x26,0x25,0xd6,},{0x16,0xe4,0x62,0xa2,0x9a,0x6d,0xd4,0x98,0x68,0x5a,0x37,0x18,0xb3,0xee,0xd0,0x0c,0xc1,0x59,0x86,0x01,0xee,0x47,0x82,0x04,0x86,0x03,0x2d,0x6b,0x9a,0xcc,0x9b,0xf8,0x9f,0x57,0x68,0x4e,0x08,0xd8,0xc0,0xf0,0x55,0x89,0xcd,0xa2,0x88,0x2a,0x05,0xdc,0x4c,0x63,0xf9,0xd0,0x43,0x1d,0x65,0x52,0x71,0x08,0x12,0x43,0x30,0x03,0xbc,0x08,},"\x6a\xda\x80\xb6\xfa\x84\xf7\x03\x49\x20\x78\x9e\x85\x36\xb8\x2d\x5e\x46\x78\x05\x9a\xed\x27\xf7\x1c"}, -{{0x19,0xa9,0x1f,0xe2,0x3a,0x4e,0x9e,0x33,0xec,0xc4,0x74,0x87,0x8f,0x57,0xc6,0x4c,0xf1,0x54,0xb3,0x94,0x20,0x34,0x87,0xa7,0x03,0x5e,0x1a,0xd9,0xcd,0x69,0x7b,0x0d,},{0x2b,0xf3,0x2b,0xa1,0x42,0xba,0x46,0x22,0xd8,0xf3,0xe2,0x9e,0xcd,0x85,0xee,0xa0,0x7b,0x9c,0x47,0xbe,0x9d,0x64,0x41,0x2c,0x9b,0x51,0x0b,0x27,0xdd,0x21,0x8b,0x23,},{0x88,0x1f,0x5b,0x8c,0x5a,0x03,0x0d,0xf0,0xf7,0x5b,0x66,0x34,0xb0,0x70,0xdd,0x27,0xbd,0x1e,0xe3,0xc0,0x87,0x38,0xae,0x34,0x93,0x38,0xb3,0xee,0x64,0x69,0xbb,0xf9,0x76,0x0b,0x13,0x57,0x8a,0x23,0x7d,0x51,0x82,0x53,0x5e,0xde,0x12,0x12,0x83,0x02,0x7a,0x90,0xb5,0xf8,0x65,0xd6,0x3a,0x65,0x37,0xdc,0xa0,0x7b,0x44,0x04,0x9a,0x0f,},"\x82\xcb\x53\xc4\xd5\xa0\x13\xba\xe5\x07\x07\x59\xec\x06\xc3\xc6\x95\x5a\xb7\xa4\x05\x09\x58\xec\x32\x8c"}, -{{0x1d,0x5b,0x8c,0xb6,0x21,0x5c,0x18,0x14,0x16,0x66,0xba,0xee,0xfc,0xf5,0xd6,0x9d,0xad,0x5b,0xea,0x9a,0x34,0x93,0xdd,0xda,0xa3,0x57,0xa4,0x39,0x7a,0x13,0xd4,0xde,},{0x94,0xd2,0x3d,0x97,0x7c,0x33,0xe4,0x9e,0x5e,0x49,0x92,0xc6,0x8f,0x25,0xec,0x99,0xa2,0x7c,0x41,0xce,0x6b,0x91,0xf2,0xbf,0xa0,0xcd,0x82,0x92,0xfe,0x96,0x28,0x35,},{0x3a,0xcd,0x39,0xbe,0xc8,0xc3,0xcd,0x2b,0x44,0x29,0x97,0x22,0xb5,0x85,0x0a,0x04,0x00,0xc1,0x44,0x35,0x90,0xfd,0x48,0x61,0xd5,0x9a,0xae,0x74,0x96,0xac,0xb3,0xdf,0x73,0xfc,0x3f,0xdf,0x79,0x69,0xae,0x5f,0x50,0xba,0x47,0xdd,0xdc,0x43,0x52,0x46,0xe5,0xfd,0x37,0x6f,0x6b,0x89,0x1c,0xd4,0xc2,0xca,0xf5,0xd6,0x14,0xb6,0x17,0x0c,},"\xa9\xa8\xcb\xb0\xad\x58\x51\x24\xe5\x22\xab\xbf\xb4\x05\x33\xbd\xd6\xf4\x93\x47\xb5\x5b\x18\xe8\x55\x8c\xb0"}, -{{0x6a,0x91,0xb3,0x22,0x7c,0x47,0x22,0x99,0x08,0x9b,0xdc,0xe9,0x35,0x6e,0x72,0x6a,0x40,0xef,0xd8,0x40,0xf1,0x10,0x02,0x70,0x8b,0x7e,0xe5,0x5b,0x64,0x10,0x5a,0xc2,},{0x9d,0x08,0x4a,0xa8,0xb9,0x7a,0x6b,0x9b,0xaf,0xa4,0x96,0xdb,0xc6,0xf7,0x6f,0x33,0x06,0xa1,0x16,0xc9,0xd9,0x17,0xe6,0x81,0x52,0x0a,0x0f,0x91,0x43,0x69,0x42,0x7e,},{0xf5,0x87,0x54,0x23,0x78,0x1b,0x66,0x21,0x6c,0xb5,0xe8,0x99,0x8d,0xe5,0xd9,0xff,0xc2,0x9d,0x1d,0x67,0x10,0x70,0x54,0xac,0xe3,0x37,0x45,0x03,0xa9,0xc3,0xef,0x81,0x15,0x77,0xf2,0x69,0xde,0x81,0x29,0x67,0x44,0xbd,0x70,0x6f,0x1a,0xc4,0x78,0xca,0xf0,0x9b,0x54,0xcd,0xf8,0x71,0xb3,0xf8,0x02,0xbd,0x57,0xf9,0xa6,0xcb,0x91,0x01,},"\x5c\xb6\xf9\xaa\x59\xb8\x0e\xca\x14\xf6\xa6\x8f\xb4\x0c\xf0\x7b\x79\x4e\x75\x17\x1f\xba\x96\x26\x2c\x1c\x6a\xdc"}, -{{0x93,0xea,0xa8,0x54,0xd7,0x91,0xf0,0x53,0x72,0xce,0x72,0xb9,0x4f,0xc6,0x50,0x3b,0x2f,0xf8,0xae,0x68,0x19,0xe6,0xa2,0x1a,0xfe,0x82,0x5e,0x27,0xad,0xa9,0xe4,0xfb,},{0x16,0xce,0xe8,0xa3,0xf2,0x63,0x18,0x34,0xc8,0x8b,0x67,0x08,0x97,0xff,0x0b,0x08,0xce,0x90,0xcc,0x14,0x7b,0x45,0x93,0xb3,0xf1,0xf4,0x03,0x72,0x7f,0x7e,0x7a,0xd5,},{0xd8,0x34,0x19,0x7c,0x1a,0x30,0x80,0x61,0x4e,0x0a,0x5f,0xa0,0xaa,0xaa,0x80,0x88,0x24,0xf2,0x1c,0x38,0xd6,0x92,0xe6,0xff,0xbd,0x20,0x0f,0x7d,0xfb,0x3c,0x8f,0x44,0x40,0x2a,0x73,0x82,0x18,0x0b,0x98,0xad,0x0a,0xfc,0x8e,0xec,0x1a,0x02,0xac,0xec,0xf3,0xcb,0x7f,0xde,0x62,0x7b,0x9f,0x18,0x11,0x1f,0x26,0x0a,0xb1,0xdb,0x9a,0x07,},"\x32\xfe\x27\x99\x41\x24\x20\x21\x53\xb5\xc7\x0d\x38\x13\xfd\xee\x9c\x2a\xa6\xe7\xdc\x74\x3d\x4d\x53\x5f\x18\x40\xa5"}, -{{0x94,0x1c,0xac,0x69,0xfb,0x7b,0x18,0x15,0xc5,0x7b,0xb9,0x87,0xc4,0xd6,0xc2,0xad,0x2c,0x35,0xd5,0xf9,0xa3,0x18,0x2a,0x79,0xd4,0xba,0x13,0xea,0xb2,0x53,0xa8,0xad,},{0x23,0xbe,0x32,0x3c,0x56,0x2d,0xfd,0x71,0xce,0x65,0xf5,0xbb,0xa5,0x6a,0x74,0xa3,0xa6,0xdf,0xc3,0x6b,0x57,0x3d,0x2f,0x94,0xf6,0x35,0xc7,0xf9,0xb4,0xfd,0x5a,0x5b,},{0x0f,0x8f,0xad,0x1e,0x6b,0xde,0x77,0x1b,0x4f,0x54,0x20,0xea,0xc7,0x5c,0x37,0x8b,0xae,0x6d,0xb5,0xac,0x66,0x50,0xcd,0x2b,0xc2,0x10,0xc1,0x82,0x3b,0x43,0x2b,0x48,0xe0,0x16,0xb1,0x05,0x95,0x45,0x8f,0xfa,0xb9,0x2f,0x7a,0x89,0x89,0xb2,0x93,0xce,0xb8,0xdf,0xed,0x6c,0x24,0x3a,0x20,0x38,0xfc,0x06,0x65,0x2a,0xaa,0xf1,0x6f,0x02,},"\xbb\x31\x72\x79\x57\x10\xfe\x00\x05\x4d\x3b\x5d\xfe\xf8\xa1\x16\x23\x58\x2d\xa6\x8b\xf8\xe4\x6d\x72\xd2\x7c\xec\xe2\xaa"}, -{{0x1a,0xcd,0xbb,0x79,0x3b,0x03,0x84,0x93,0x46,0x27,0x47,0x0d,0x79,0x5c,0x3d,0x1d,0xd4,0xd7,0x9c,0xea,0x59,0xef,0x98,0x3f,0x29,0x5b,0x9b,0x59,0x17,0x9c,0xbb,0x28,},{0x3f,0x60,0xc7,0x54,0x1a,0xfa,0x76,0xc0,0x19,0xcf,0x5a,0xa8,0x2d,0xcd,0xb0,0x88,0xed,0x9e,0x4e,0xd9,0x78,0x05,0x14,0xae,0xfb,0x37,0x9d,0xab,0xc8,0x44,0xf3,0x1a,},{0xbe,0x71,0xef,0x48,0x06,0xcb,0x04,0x1d,0x88,0x5e,0xff,0xd9,0xe6,0xb0,0xfb,0xb7,0x3d,0x65,0xd7,0xcd,0xec,0x47,0xa8,0x9c,0x8a,0x99,0x48,0x92,0xf4,0xe5,0x5a,0x56,0x8c,0x4c,0xc7,0x8d,0x61,0xf9,0x01,0xe8,0x0d,0xbb,0x62,0x8b,0x86,0xa2,0x3c,0xcd,0x59,0x4e,0x71,0x2b,0x57,0xfa,0x94,0xc2,0xd6,0x7e,0xc2,0x66,0x34,0x87,0x85,0x07,},"\x7c\xf3\x4f\x75\xc3\xda\xc9\xa8\x04\xd0\xfc\xd0\x9e\xba\x9b\x29\xc9\x48\x4e\x8a\x01\x8f\xa9\xe0\x73\x04\x2d\xf8\x8e\x3c\x56"}, -{{0x8e,0xd7,0xa7,0x97,0xb9,0xce,0xa8,0xa8,0x37,0x0d,0x41,0x91,0x36,0xbc,0xdf,0x68,0x3b,0x75,0x9d,0x2e,0x3c,0x69,0x47,0xf1,0x7e,0x13,0xe2,0x48,0x5a,0xa9,0xd4,0x20,},{0xb4,0x9f,0x3a,0x78,0xb1,0xc6,0xa7,0xfc,0xa8,0xf3,0x46,0x6f,0x33,0xbc,0x0e,0x92,0x9f,0x01,0xfb,0xa0,0x43,0x06,0xc2,0xa7,0x46,0x5f,0x46,0xc3,0x75,0x93,0x16,0xd9,},{0x04,0x26,0x6c,0x03,0x3b,0x91,0xc1,0x32,0x2c,0xeb,0x34,0x46,0xc9,0x01,0xff,0xcf,0x3c,0xc4,0x0c,0x40,0x34,0xe8,0x87,0xc9,0x59,0x7c,0xa1,0x89,0x3b,0xa7,0x33,0x0b,0xec,0xbb,0xd8,0xb4,0x81,0x42,0xef,0x35,0xc0,0x12,0xc6,0xba,0x51,0xa6,0x6d,0xf9,0x30,0x8c,0xb6,0x26,0x8a,0xd6,0xb1,0xe4,0xb0,0x3e,0x70,0x10,0x24,0x95,0x79,0x0b,},"\xa7\x50\xc2\x32\x93\x3d\xc1\x4b\x11\x84\xd8\x6d\x8b\x4c\xe7\x2e\x16\xd6\x97\x44\xba\x69\x81\x8b\x6a\xc3\x3b\x1d\x82\x3b\xb2\xc3"}, -{{0xf2,0xab,0x39,0x6f,0xe8,0x90,0x6e,0x3e,0x56,0x33,0xe9,0x9c,0xab,0xcd,0x5b,0x09,0xdf,0x08,0x59,0xb5,0x16,0x23,0x0b,0x1e,0x04,0x50,0xb5,0x80,0xb6,0x5f,0x61,0x6c,},{0x8e,0xa0,0x74,0x24,0x51,0x59,0xa1,0x16,0xaa,0x71,0x22,0xa2,0x5e,0xc1,0x6b,0x89,0x1d,0x62,0x5a,0x68,0xf3,0x36,0x60,0x42,0x39,0x08,0xf6,0xbd,0xc4,0x4f,0x8c,0x1b,},{0xa0,0x6a,0x23,0xd9,0x82,0xd8,0x1a,0xb8,0x83,0xaa,0xe2,0x30,0xad,0xbc,0x36,0x8a,0x6a,0x99,0x77,0xf0,0x03,0xce,0xbb,0x00,0xd4,0xc2,0xe4,0x01,0x84,0x90,0x19,0x1a,0x84,0xd3,0xa2,0x82,0xfd,0xbf,0xb2,0xfc,0x88,0x04,0x6e,0x62,0xde,0x43,0xe1,0x5f,0xb5,0x75,0x33,0x6b,0x3c,0x8b,0x77,0xd1,0x9c,0xe6,0xa0,0x09,0xce,0x51,0xf5,0x0c,},"\x5a\x44\xe3\x4b\x74\x6c\x5f\xd1\x89\x8d\x55\x2a\xb3\x54\xd2\x8f\xb4\x71\x38\x56\xd7\x69\x7d\xd6\x3e\xb9\xbd\x6b\x99\xc2\x80\xe1\x87"}, -{{0x55,0x0a,0x41,0xc0,0x13,0xf7,0x9b,0xab,0x8f,0x06,0xe4,0x3a,0xd1,0x83,0x6d,0x51,0x31,0x27,0x36,0xa9,0x71,0x38,0x06,0xfa,0xfe,0x66,0x45,0x21,0x9e,0xaa,0x1f,0x9d,},{0xaf,0x6b,0x71,0x45,0x47,0x4d,0xc9,0x95,0x4b,0x9a,0xf9,0x3a,0x9c,0xdb,0x34,0x44,0x9d,0x5b,0x7c,0x65,0x1c,0x82,0x4d,0x24,0xe2,0x30,0xb9,0x00,0x33,0xce,0x59,0xc0,},{0x16,0xdc,0x1e,0x2b,0x9f,0xa9,0x09,0xee,0xfd,0xc2,0x77,0xba,0x16,0xeb,0xe2,0x07,0xb8,0xda,0x5e,0x91,0x14,0x3c,0xde,0x78,0xc5,0x04,0x7a,0x89,0xf6,0x81,0xc3,0x3c,0x4e,0x4e,0x34,0x28,0xd5,0xc9,0x28,0x09,0x59,0x03,0xa8,0x11,0xec,0x00,0x2d,0x52,0xa3,0x9e,0xd7,0xf8,0xb3,0xfe,0x19,0x27,0x20,0x0c,0x6d,0xd0,0xb9,0xab,0x3e,0x04,},"\x8b\xc4\x18\x5e\x50\xe5\x7d\x5f\x87\xf4\x75\x15\xfe\x2b\x18\x37\xd5\x85\xf0\xaa\xe9\xe1\xca\x38\x3b\x3e\xc9\x08\x88\x4b\xb9\x00\xff\x27"}, -{{0x19,0xac,0x3e,0x27,0x24,0x38,0xc7,0x2d,0xdf,0x7b,0x88,0x19,0x64,0x86,0x7c,0xb3,0xb3,0x1f,0xf4,0xc7,0x93,0xbb,0x7e,0xa1,0x54,0x61,0x3c,0x1d,0xb0,0x68,0xcb,0x7e,},{0xf8,0x5b,0x80,0xe0,0x50,0xa1,0xb9,0x62,0x0d,0xb1,0x38,0xbf,0xc9,0xe1,0x00,0x32,0x7e,0x25,0xc2,0x57,0xc5,0x92,0x17,0xb6,0x01,0xf1,0xf6,0xac,0x9a,0x41,0x3d,0x3f,},{0xea,0x85,0x5d,0x78,0x1c,0xbe,0xa4,0x68,0x2e,0x35,0x01,0x73,0xcb,0x89,0xe8,0x61,0x9c,0xcf,0xdd,0xb9,0x7c,0xdc,0xe1,0x6f,0x9a,0x2f,0x6f,0x68,0x92,0xf4,0x6d,0xbe,0x68,0xe0,0x4b,0x12,0xb8,0xd8,0x86,0x89,0xa7,0xa3,0x16,0x70,0xcd,0xff,0x40,0x9a,0xf9,0x8a,0x93,0xb4,0x9a,0x34,0x53,0x7b,0x6a,0xa0,0x09,0xd2,0xeb,0x8b,0x47,0x01,},"\x95\x87\x2d\x5f\x78\x9f\x95\x48\x4e\x30\xcb\xb0\xe1\x14\x02\x89\x53\xb1\x6f\x5c\x6a\x8d\x9f\x65\xc0\x03\xa8\x35\x43\xbe\xaa\x46\xb3\x86\x45"}, -{{0xca,0x26,0x7d,0xe9,0x6c,0x93,0xc2,0x38,0xfa,0xfb,0x12,0x79,0x81,0x20,0x59,0xab,0x93,0xac,0x03,0x05,0x96,0x57,0xfd,0x99,0x4f,0x8f,0xa5,0xa0,0x92,0x39,0xc8,0x21,},{0x01,0x73,0x70,0xc8,0x79,0x09,0x0a,0x81,0xc7,0xf2,0x72,0xc2,0xfc,0x80,0xe3,0xaa,0xc2,0xbc,0x60,0x3f,0xcb,0x37,0x9a,0xfc,0x98,0x69,0x11,0x60,0xab,0x74,0x5b,0x26,},{0xac,0x95,0x7f,0x82,0x33,0x5a,0xa7,0x14,0x1e,0x96,0xb5,0x9d,0x63,0xe3,0xcc,0xee,0x95,0xc3,0xa2,0xc4,0x7d,0x02,0x65,0x40,0xc2,0xaf,0x42,0xdc,0x95,0x33,0xd5,0xfd,0x81,0x82,0x7d,0x16,0x79,0xad,0x18,0x7a,0xea,0xf3,0x78,0x34,0x91,0x5e,0x75,0xb1,0x47,0xa9,0x28,0x68,0x06,0xc8,0x01,0x75,0x16,0xba,0x43,0xdd,0x05,0x1a,0x5e,0x0c,},"\xe0\x5f\x71\xe4\xe4\x9a\x72\xec\x55\x0c\x44\xa3\xb8\x5a\xca\x8f\x20\xff\x26\xc3\xee\x94\xa8\x0f\x1b\x43\x1c\x7d\x15\x4e\xc9\x60\x3e\xe0\x25\x31"}, -{{0x3d,0xff,0x5e,0x89,0x94,0x75,0xe7,0xe9,0x1d,0xd2,0x61,0x32,0x2f,0xab,0x09,0x98,0x0c,0x52,0x97,0x0d,0xe1,0xda,0x6e,0x2e,0x20,0x16,0x60,0xcc,0x4f,0xce,0x70,0x32,},{0xf3,0x01,0x62,0xba,0xc9,0x84,0x47,0xc4,0x04,0x2f,0xac,0x05,0xda,0x44,0x80,0x34,0x62,0x9b,0xe2,0xc6,0xa5,0x8d,0x30,0xdf,0xd5,0x78,0xba,0x9f,0xb5,0xe3,0x93,0x0b,},{0x5e,0xfe,0x7a,0x92,0xff,0x96,0x23,0x08,0x9b,0x3e,0x3b,0x78,0xf3,0x52,0x11,0x53,0x66,0xe2,0x6b,0xa3,0xfb,0x1a,0x41,0x62,0x09,0xbc,0x02,0x9e,0x9c,0xad,0xcc,0xd9,0xf4,0xaf,0xfa,0x33,0x35,0x55,0xa8,0xf3,0xa3,0x5a,0x9d,0x0f,0x7c,0x34,0xb2,0x92,0xca,0xe7,0x7e,0xc9,0x6f,0xa3,0xad,0xfc,0xaa,0xde,0xe2,0xd9,0xce,0xd8,0xf8,0x05,},"\x93\x8f\x0e\x77\x62\x1b\xf3\xea\x52\xc7\xc4\x91\x1c\x51\x57\xc2\xd8\xa2\xa8\x58\x09\x3e\xf1\x6a\xa9\xb1\x07\xe6\x9d\x98\x03\x7b\xa1\x39\xa3\xc3\x82"}, -{{0x9a,0x6b,0x84,0x78,0x64,0xe7,0x0c,0xfe,0x8b,0xa6,0xab,0x22,0xfa,0x0c,0xa3,0x08,0xc0,0xcc,0x8b,0xec,0x71,0x41,0xfb,0xca,0xa3,0xb8,0x1f,0x5d,0x1e,0x1c,0xfc,0xfc,},{0x34,0xad,0x0f,0xbd,0xb2,0x56,0x65,0x07,0xa8,0x1c,0x2b,0x1f,0x8a,0xa8,0xf5,0x3d,0xcc,0xaa,0x64,0xcc,0x87,0xad,0xa9,0x1b,0x90,0x3e,0x90,0x0d,0x07,0xee,0xe9,0x30,},{0x2a,0xb2,0x55,0x16,0x9c,0x48,0x9c,0x54,0xc7,0x32,0x23,0x2e,0x37,0xc8,0x73,0x49,0xd4,0x86,0xb1,0xeb,0xa2,0x05,0x09,0xdb,0xab,0xe7,0xfe,0xd3,0x29,0xef,0x08,0xfd,0x75,0xba,0x1c,0xd1,0x45,0xe6,0x7b,0x2e,0xa2,0x6c,0xb5,0xcc,0x51,0xca,0xb3,0x43,0xee,0xb0,0x85,0xfe,0x1f,0xd7,0xb0,0xec,0x4c,0x6a,0xfc,0xd9,0xb9,0x79,0xf9,0x05,},"\x83\x83\x67\x47\x11\x83\xc7\x1f\x7e\x71\x77\x24\xf8\x9d\x40\x1c\x3a\xd9\x86\x3f\xd9\xcc\x7a\xa3\xcf\x33\xd3\xc5\x29\x86\x0c\xb5\x81\xf3\x09\x3d\x87\xda"}, -{{0x57,0x5b,0xe0,0x7a,0xfc,0xa5,0xd0,0x63,0xc2,0x38,0xcd,0x9b,0x80,0x28,0x77,0x2c,0xc4,0x9c,0xda,0x34,0x47,0x14,0x32,0xa2,0xe1,0x66,0xe0,0x96,0xe2,0x21,0x9e,0xfc,},{0x94,0xe5,0xeb,0x4d,0x50,0x24,0xf4,0x9d,0x7e,0xbf,0x79,0x81,0x7c,0x8d,0xe1,0x14,0x97,0xdc,0x2b,0x55,0x62,0x2a,0x51,0xae,0x12,0x3f,0xfc,0x74,0x9d,0xbb,0x16,0xe0,},{0x58,0x27,0x1d,0x44,0x23,0x6f,0x3b,0x98,0xc5,0x8f,0xd7,0xae,0x0d,0x2f,0x49,0xef,0x2b,0x6e,0x3a,0xff,0xdb,0x22,0x5a,0xa3,0xba,0x55,0x5f,0x0e,0x11,0xcc,0x53,0xc2,0x3a,0xd1,0x9b,0xaf,0x24,0x34,0x65,0x90,0xd0,0x5d,0x7d,0x53,0x90,0x58,0x20,0x82,0xcf,0x94,0xd3,0x9c,0xad,0x65,0x30,0xab,0x93,0xd1,0x3e,0xfb,0x39,0x27,0x95,0x06,},"\x33\xe5\x91\x8b\x66\xd3\x3d\x55\xfe\x71\x7c\xa3\x43\x83\xea\xe7\x8f\x0a\xf8\x28\x89\xca\xf6\x69\x6e\x1a\xc9\xd9\x5d\x1f\xfb\x32\xcb\xa7\x55\xf9\xe3\x50\x3e"}, -{{0x15,0xff,0xb4,0x55,0x14,0xd4,0x34,0x44,0xd6,0x1f,0xcb,0x10,0x5e,0x30,0xe1,0x35,0xfd,0x26,0x85,0x23,0xdd,0xa2,0x0b,0x82,0x75,0x8b,0x17,0x94,0x23,0x11,0x04,0x41,},{0x17,0x72,0xc5,0xab,0xc2,0xd2,0x3f,0xd2,0xf9,0xd1,0xc3,0x25,0x7b,0xe7,0xbc,0x3c,0x1c,0xd7,0x9c,0xee,0x40,0x84,0x4b,0x74,0x9b,0x3a,0x77,0x43,0xd2,0xf9,0x64,0xb8,},{0x68,0x28,0xcd,0x76,0x24,0xe7,0x93,0xb8,0xa4,0xce,0xb9,0x6d,0x3c,0x2a,0x97,0x5b,0xf7,0x73,0xe5,0xff,0x66,0x45,0xf3,0x53,0x61,0x40,0x58,0x62,0x1e,0x58,0x83,0x52,0x89,0xe7,0xf3,0x1f,0x42,0xdf,0xe6,0xaf,0x6d,0x73,0x6f,0x26,0x44,0x51,0x1e,0x32,0x0c,0x0f,0xa6,0x98,0x58,0x2a,0x79,0x77,0x8d,0x18,0x73,0x0e,0xd3,0xe8,0xcb,0x08,},"\xda\x9c\x55\x59\xd0\xea\x51\xd2\x55\xb6\xbd\x9d\x76\x38\xb8\x76\x47\x2f\x94\x2b\x33\x0f\xc0\xe2\xb3\x0a\xea\x68\xd7\x73\x68\xfc\xe4\x94\x82\x72\x99\x1d\x25\x7e"}, -{{0xfe,0x05,0x68,0x64,0x29,0x43,0xb2,0xe1,0xaf,0xbf,0xd1,0xf1,0x0f,0xe8,0xdf,0x87,0xa4,0x23,0x6b,0xea,0x40,0xdc,0xe7,0x42,0x07,0x2c,0xb2,0x18,0x86,0xee,0xc1,0xfa,},{0x29,0x9e,0xbd,0x1f,0x13,0x17,0x7d,0xbd,0xb6,0x6a,0x91,0x2b,0xbf,0x71,0x20,0x38,0xfd,0xf7,0x3b,0x06,0xc3,0xac,0x02,0x0c,0x7b,0x19,0x12,0x67,0x55,0xd4,0x7f,0x61,},{0xd5,0x9e,0x6d,0xfc,0xc6,0xd7,0xe3,0xe2,0xc5,0x8d,0xec,0x81,0xe9,0x85,0xd2,0x45,0xe6,0x81,0xac,0xf6,0x59,0x4a,0x23,0xc5,0x92,0x14,0xf7,0xbe,0xd8,0x01,0x5d,0x81,0x3c,0x76,0x82,0xb6,0x0b,0x35,0x83,0x44,0x03,0x11,0xe7,0x2a,0x86,0x65,0xba,0x2c,0x96,0xde,0xc2,0x3c,0xe8,0x26,0xe1,0x60,0x12,0x7e,0x18,0x13,0x2b,0x03,0x04,0x04,},"\xc5\x9d\x08\x62\xec\x1c\x97\x46\xab\xcc\x3c\xf8\x3c\x9e\xeb\xa2\xc7\x08\x2a\x03\x6a\x8c\xb5\x7c\xe4\x87\xe7\x63\x49\x27\x96\xd4\x7e\x6e\x06\x3a\x0c\x1f\xec\xcc\x2d"}, -{{0x5e,0xcb,0x16,0xc2,0xdf,0x27,0xc8,0xcf,0x58,0xe4,0x36,0xa9,0xd3,0xaf,0xfb,0xd5,0x8e,0x95,0x38,0xa9,0x26,0x59,0xa0,0xf9,0x7c,0x4c,0x4f,0x99,0x46,0x35,0xa8,0xca,},{0xda,0x76,0x8b,0x20,0xc4,0x37,0xdd,0x3a,0xa5,0xf8,0x4b,0xb6,0xa0,0x77,0xff,0xa3,0x4a,0xb6,0x85,0x01,0xc5,0x35,0x2b,0x5c,0xc3,0xfd,0xce,0x7f,0xe6,0xc2,0x39,0x8d,},{0x1c,0x72,0x3a,0x20,0xc6,0x77,0x24,0x26,0xa6,0x70,0xe4,0xd5,0xc4,0xa9,0x7c,0x6e,0xbe,0x91,0x47,0xf7,0x1b,0xb0,0xa4,0x15,0x63,0x1e,0x44,0x40,0x6e,0x29,0x03,0x22,0xe4,0xca,0x97,0x7d,0x34,0x8f,0xe7,0x85,0x6a,0x8e,0xdc,0x23,0x5d,0x0f,0xe9,0x5f,0x7e,0xd9,0x1a,0xef,0xdd,0xf2,0x8a,0x77,0xe2,0xc7,0xdb,0xfd,0x8f,0x55,0x2f,0x0a,},"\x56\xf1\x32\x9d\x9a\x6b\xe2\x5a\x61\x59\xc7\x2f\x12\x68\x8d\xc8\x31\x4e\x85\xdd\x9e\x7e\x4d\xc0\x5b\xbe\xcb\x77\x29\xe0\x23\xc8\x6f\x8e\x09\x37\x35\x3f\x27\xc7\xed\xe9"}, -{{0xd5,0x99,0xd6,0x37,0xb3,0xc3,0x0a,0x82,0xa9,0x98,0x4e,0x2f,0x75,0x84,0x97,0xd1,0x44,0xde,0x6f,0x06,0xb9,0xfb,0xa0,0x4d,0xd4,0x0f,0xd9,0x49,0x03,0x9d,0x7c,0x84,},{0x67,0x91,0xd8,0xce,0x50,0xa4,0x46,0x89,0xfc,0x17,0x87,0x27,0xc5,0xc3,0xa1,0xc9,0x59,0xfb,0xee,0xd7,0x4e,0xf7,0xd8,0xe7,0xbd,0x3c,0x1a,0xb4,0xda,0x31,0xc5,0x1f,},{0xeb,0xf1,0x0d,0x9a,0xc7,0xc9,0x61,0x08,0x14,0x0e,0x7d,0xef,0x6f,0xe9,0x53,0x3d,0x72,0x76,0x46,0xff,0x5b,0x3a,0xf2,0x73,0xc1,0xdf,0x95,0x76,0x2a,0x66,0xf3,0x2b,0x65,0xa0,0x96,0x34,0xd0,0x13,0xf5,0x4b,0x5d,0xd6,0x01,0x1f,0x91,0xbc,0x33,0x6c,0xa8,0xb3,0x55,0xce,0x33,0xf8,0xcf,0xbe,0xc2,0x53,0x5a,0x4c,0x42,0x7f,0x82,0x05,},"\xa7\xc0\x4e\x8b\xa7\x5d\x0a\x03\xd8\xb1\x66\xad\x7a\x1d\x77\xe1\xb9\x1c\x7a\xaf\x7b\xef\xdd\x99\x31\x1f\xc3\xc5\x4a\x68\x4d\xdd\x97\x1d\x5b\x32\x11\xc3\xee\xaf\xf1\xe5\x4e"}, -{{0x30,0xab,0x82,0x32,0xfa,0x70,0x18,0xf0,0xce,0x6c,0x39,0xbd,0x8f,0x78,0x2f,0xe2,0xe1,0x59,0x75,0x8b,0xb0,0xf2,0xf4,0x38,0x6c,0x7f,0x28,0xcf,0xd2,0xc8,0x58,0x98,},{0xec,0xfb,0x6a,0x2b,0xd4,0x2f,0x31,0xb6,0x12,0x50,0xba,0x5d,0xe7,0xe4,0x6b,0x47,0x19,0xaf,0xdf,0xbc,0x66,0x0d,0xb7,0x1a,0x7b,0xd1,0xdf,0x7b,0x0a,0x3a,0xbe,0x37,},{0x9a,0xf8,0x85,0x34,0x4c,0xc7,0x23,0x94,0x98,0xf7,0x12,0xdf,0x80,0xbc,0x01,0xb8,0x06,0x38,0x29,0x1e,0xd4,0xa1,0xd2,0x8b,0xaa,0x55,0x45,0x01,0x7a,0x72,0xe2,0xf6,0x56,0x49,0xcc,0xf9,0x60,0x3d,0xa6,0xeb,0x5b,0xfa,0xb9,0xf5,0x54,0x3a,0x6c,0xa4,0xa7,0xaf,0x38,0x66,0x15,0x3c,0x76,0xbf,0x66,0xbf,0x95,0xde,0xf6,0x15,0xb0,0x0c,},"\x63\xb8\x0b\x79\x56\xac\xbe\xcf\x0c\x35\xe9\xab\x06\xb9\x14\xb0\xc7\x01\x4f\xe1\xa4\xbb\xc0\x21\x72\x40\xc1\xa3\x30\x95\xd7\x07\x95\x3e\xd7\x7b\x15\xd2\x11\xad\xaf\x9b\x97\xdc"}, -{{0x0d,0xdc,0xdc,0x87,0x2c,0x7b,0x74,0x8d,0x40,0xef,0xe9,0x6c,0x28,0x81,0xae,0x18,0x9d,0x87,0xf5,0x61,0x48,0xed,0x8a,0xf3,0xeb,0xbb,0xc8,0x03,0x24,0xe3,0x8b,0xdd,},{0x58,0x8d,0xda,0xdc,0xbc,0xed,0xf4,0x0d,0xf0,0xe9,0x69,0x7d,0x8b,0xb2,0x77,0xc7,0xbb,0x14,0x98,0xfa,0x1d,0x26,0xce,0x0a,0x83,0x5a,0x76,0x0b,0x92,0xca,0x7c,0x85,},{0xc1,0x79,0xc0,0x94,0x56,0xe2,0x35,0xfe,0x24,0x10,0x5a,0xfa,0x6e,0x8e,0xc0,0x46,0x37,0xf8,0xf9,0x43,0x81,0x7c,0xd0,0x98,0xba,0x95,0x38,0x7f,0x96,0x53,0xb2,0xad,0xd1,0x81,0xa3,0x14,0x47,0xd9,0x2d,0x1a,0x1d,0xdf,0x1c,0xeb,0x0d,0xb6,0x21,0x18,0xde,0x9d,0xff,0xb7,0xdc,0xd2,0x42,0x40,0x57,0xcb,0xdf,0xf5,0xd4,0x1d,0x04,0x03,},"\x65\x64\x1c\xd4\x02\xad\xd8\xbf\x3d\x1d\x67\xdb\xeb\x6d\x41\xde\xbf\xbe\xf6\x7e\x43\x17\xc3\x5b\x0a\x6d\x5b\xbb\xae\x0e\x03\x4d\xe7\xd6\x70\xba\x14\x13\xd0\x56\xf2\xd6\xf1\xde\x12"}, -{{0x89,0xf0,0xd6,0x82,0x99,0xba,0x0a,0x5a,0x83,0xf2,0x48,0xae,0x0c,0x16,0x9f,0x8e,0x38,0x49,0xa9,0xb4,0x7b,0xd4,0x54,0x98,0x84,0x30,0x5c,0x99,0x12,0xb4,0x66,0x03,},{0xab,0xa3,0xe7,0x95,0xaa,0xb2,0x01,0x2a,0xcc,0xea,0xdd,0x7b,0x3b,0xd9,0xda,0xee,0xed,0x6f,0xf5,0x25,0x8b,0xdc,0xd7,0xc9,0x36,0x99,0xc2,0xa3,0x83,0x6e,0x38,0x32,},{0x2c,0x69,0x1f,0xa8,0xd4,0x87,0xce,0x20,0xd5,0xd2,0xfa,0x41,0x55,0x91,0x16,0xe0,0xbb,0xf4,0x39,0x7c,0xf5,0x24,0x0e,0x15,0x25,0x56,0x18,0x35,0x41,0xd6,0x6c,0xf7,0x53,0x58,0x24,0x01,0xa4,0x38,0x8d,0x39,0x03,0x39,0xdb,0xef,0x4d,0x38,0x47,0x43,0xca,0xa3,0x46,0xf5,0x5f,0x8d,0xab,0xa6,0x8b,0xa7,0xb9,0x13,0x1a,0x8a,0x6e,0x0b,},"\x4f\x18\x46\xdd\x7a\xd5\x0e\x54\x5d\x4c\xfb\xff\xbb\x1d\xc2\xff\x14\x5d\xc1\x23\x75\x4d\x08\xaf\x4e\x44\xec\xc0\xbc\x8c\x91\x41\x13\x88\xbc\x76\x53\xe2\xd8\x93\xd1\xea\xc2\x10\x7d\x05"}, -{{0x0a,0x3c,0x18,0x44,0xe2,0xdb,0x07,0x0f,0xb2,0x4e,0x3c,0x95,0xcb,0x1c,0xc6,0x71,0x4e,0xf8,0x4e,0x2c,0xcd,0x2b,0x9d,0xd2,0xf1,0x46,0x0e,0xbf,0x7e,0xcf,0x13,0xb1,},{0x72,0xe4,0x09,0x93,0x7e,0x06,0x10,0xeb,0x5c,0x20,0xb3,0x26,0xdc,0x6e,0xa1,0xbb,0xbc,0x04,0x06,0x70,0x1c,0x5c,0xd6,0x7d,0x1f,0xbd,0xe0,0x91,0x92,0xb0,0x7c,0x01,},{0x87,0xf7,0xfd,0xf4,0x60,0x95,0x20,0x1e,0x87,0x7a,0x58,0x8f,0xe3,0xe5,0xaa,0xf4,0x76,0xbd,0x63,0x13,0x8d,0x8a,0x87,0x8b,0x89,0xd6,0xac,0x60,0x63,0x1b,0x34,0x58,0xb9,0xd4,0x1a,0x3c,0x61,0xa5,0x88,0xe1,0xdb,0x8d,0x29,0xa5,0x96,0x89,0x81,0xb0,0x18,0x77,0x6c,0x58,0x87,0x80,0x92,0x2f,0x5a,0xa7,0x32,0xba,0x63,0x79,0xdd,0x05,},"\x4c\x82\x74\xd0\xed\x1f\x74\xe2\xc8\x6c\x08\xd9\x55\xbd\xe5\x5b\x2d\x54\x32\x7e\x82\x06\x2a\x1f\x71\xf7\x0d\x53\x6f\xdc\x87\x22\xcd\xea\xd7\xd2\x2a\xae\xad\x2b\xfa\xa1\xad\x00\xb8\x29\x57"}, -{{0xc8,0xd7,0xa8,0x81,0x8b,0x98,0xdf,0xdb,0x20,0x83,0x9c,0x87,0x1c,0xb5,0xc4,0x8e,0x9e,0x94,0x70,0xca,0x3a,0xd3,0x5b,0xa2,0x61,0x3a,0x5d,0x31,0x99,0xc8,0xab,0x23,},{0x90,0xd2,0xef,0xbb,0xa4,0xd4,0x3e,0x6b,0x2b,0x99,0x2c,0xa1,0x60,0x83,0xdb,0xcf,0xa2,0xb3,0x22,0x38,0x39,0x07,0xb0,0xee,0x75,0xf3,0xe9,0x58,0x45,0xd3,0xc4,0x7f,},{0xfa,0x2e,0x99,0x44,0x21,0xae,0xf1,0xd5,0x85,0x66,0x74,0x81,0x3d,0x05,0xcb,0xd2,0xcf,0x84,0xef,0x5e,0xb4,0x24,0xaf,0x6e,0xcd,0x0d,0xc6,0xfd,0xbd,0xc2,0xfe,0x60,0x5f,0xe9,0x85,0x88,0x33,0x12,0xec,0xf3,0x4f,0x59,0xbf,0xb2,0xf1,0xc9,0x14,0x9e,0x5b,0x9c,0xc9,0xec,0xda,0x05,0xb2,0x73,0x11,0x30,0xf3,0xed,0x28,0xdd,0xae,0x0b,},"\x78\x3e\x33\xc3\xac\xbd\xbb\x36\xe8\x19\xf5\x44\xa7\x78\x1d\x83\xfc\x28\x3d\x33\x09\xf5\xd3\xd1\x2c\x8d\xcd\x6b\x0b\x3d\x0e\x89\xe3\x8c\xfd\x3b\x4d\x08\x85\x66\x1c\xa5\x47\xfb\x97\x64\xab\xff"}, -{{0xb4,0x82,0x70,0x36,0x12,0xd0,0xc5,0x86,0xf7,0x6c,0xfc,0xb2,0x1c,0xfd,0x21,0x03,0xc9,0x57,0x25,0x15,0x04,0xa8,0xc0,0xac,0x4c,0x86,0xc9,0xc6,0xf3,0xe4,0x29,0xff,},{0xfd,0x71,0x1d,0xc7,0xdd,0x3b,0x1d,0xfb,0x9d,0xf9,0x70,0x4b,0xe3,0xe6,0xb2,0x6f,0x58,0x7f,0xe7,0xdd,0x7b,0xa4,0x56,0xa9,0x1b,0xa4,0x3f,0xe5,0x1a,0xec,0x09,0xad,},{0x58,0x83,0x2b,0xde,0xb2,0x6f,0xea,0xfc,0x31,0xb4,0x62,0x77,0xcf,0x3f,0xb5,0xd7,0xa1,0x7d,0xfb,0x7c,0xcd,0x9b,0x1f,0x58,0xec,0xbe,0x6f,0xeb,0x97,0x96,0x66,0x82,0x8f,0x23,0x9b,0xa4,0xd7,0x52,0x19,0x26,0x0e,0xca,0xc0,0xac,0xf4,0x0f,0x0e,0x5e,0x25,0x90,0xf4,0xca,0xa1,0x6b,0xbb,0xcd,0x8a,0x15,0x5d,0x34,0x79,0x67,0xa6,0x07,},"\x29\xd7\x7a\xcf\xd9\x9c\x7a\x00\x70\xa8\x8f\xeb\x62\x47\xa2\xbc\xe9\x98\x4f\xe3\xe6\xfb\xf1\x9d\x40\x45\x04\x2a\x21\xab\x26\xcb\xd7\x71\xe1\x84\xa9\xa7\x5f\x31\x6b\x64\x8c\x69\x20\xdb\x92\xb8\x7b"}, -{{0x84,0xe5,0x0d,0xd9,0xa0,0xf1,0x97,0xe3,0x89,0x3c,0x38,0xdb,0xd9,0x1f,0xaf,0xc3,0x44,0xc1,0x77,0x6d,0x3a,0x40,0x0e,0x2f,0x0f,0x0e,0xe7,0xaa,0x82,0x9e,0xb8,0xa2,},{0x2c,0x50,0xf8,0x70,0xee,0x48,0xb3,0x6b,0x0a,0xc2,0xf8,0xa5,0xf3,0x36,0xfb,0x09,0x0b,0x11,0x30,0x50,0xdb,0xcc,0x25,0xe0,0x78,0x20,0x0a,0x6e,0x16,0x15,0x3e,0xea,},{0x69,0xe6,0xa4,0x49,0x1a,0x63,0x83,0x73,0x16,0xe8,0x6a,0x5f,0x4b,0xa7,0xcd,0x0d,0x73,0x1e,0xcc,0x58,0xf1,0xd0,0xa2,0x64,0xc6,0x7c,0x89,0xbe,0xfd,0xd8,0xd3,0x82,0x9d,0x8d,0xe1,0x3b,0x33,0xcc,0x0b,0xf5,0x13,0x93,0x17,0x15,0xc7,0x80,0x96,0x57,0xe2,0xbf,0xb9,0x60,0xe5,0xc7,0x64,0xc9,0x71,0xd7,0x33,0x74,0x60,0x93,0xe5,0x00,},"\xf3\x99\x2c\xde\x64\x93\xe6\x71\xf1\xe1\x29\xdd\xca\x80\x38\xb0\xab\xdb\x77\xbb\x90\x35\xf9\xf8\xbe\x54\xbd\x5d\x68\xc1\xae\xff\x72\x4f\xf4\x7d\x29\x34\x43\x91\xdc\x53\x61\x66\xb8\x67\x1c\xbb\xf1\x23"}, -{{0xb3,0x22,0xd4,0x65,0x77,0xa2,0xa9,0x91,0xa4,0xd1,0x69,0x82,0x87,0x83,0x2a,0x39,0xc4,0x87,0xef,0x77,0x6b,0x4b,0xff,0x03,0x7a,0x05,0xc7,0xf1,0x81,0x2b,0xde,0xec,},{0xeb,0x2b,0xca,0xdf,0xd3,0xee,0xc2,0x98,0x6b,0xaf,0xf3,0x2b,0x98,0xe7,0xc4,0xdb,0xf0,0x3f,0xf9,0x5d,0x8a,0xd5,0xff,0x9a,0xa9,0x50,0x6e,0x54,0x72,0xff,0x84,0x5f,},{0xc7,0xb5,0x51,0x37,0x31,0x7c,0xa2,0x1e,0x33,0x48,0x9f,0xf6,0xa9,0xbf,0xab,0x97,0xc8,0x55,0xdc,0x6f,0x85,0x68,0x4a,0x70,0xa9,0x12,0x5a,0x26,0x1b,0x56,0xd5,0xe6,0xf1,0x49,0xc5,0x77,0x4d,0x73,0x4f,0x2d,0x8d,0xeb,0xfc,0x77,0xb7,0x21,0x89,0x6a,0x82,0x67,0xc2,0x37,0x68,0xe9,0xba,0xdb,0x91,0x0e,0xef,0x83,0xec,0x25,0x88,0x02,},"\x19\xf1\xbf\x5d\xcf\x17\x50\xc6\x11\xf1\xc4\xa2\x86\x52\x00\x50\x4d\x82\x29\x8e\xdd\x72\x67\x1f\x62\xa7\xb1\x47\x1a\xc3\xd4\xa3\x0f\x7d\xe9\xe5\xda\x41\x08\xc5\x2a\x4c\xe7\x0a\x3e\x11\x4a\x52\xa3\xb3\xc5"}, -{{0x96,0x0c,0xab,0x50,0x34,0xb9,0x83,0x8d,0x09,0x8d,0x2d,0xcb,0xf4,0x36,0x4b,0xec,0x16,0xd3,0x88,0xf6,0x37,0x6d,0x73,0xa6,0x27,0x3b,0x70,0xf8,0x2b,0xbc,0x98,0xc0,},{0x5e,0x3c,0x19,0xf2,0x41,0x5a,0xcf,0x72,0x9f,0x82,0x9a,0x4e,0xbd,0x5c,0x40,0xe1,0xa6,0xbc,0x9f,0xbc,0xa9,0x57,0x03,0xa9,0x37,0x60,0x87,0xed,0x09,0x37,0xe5,0x1a,},{0x27,0xd4,0xc3,0xa1,0x81,0x1e,0xf9,0xd4,0x36,0x0b,0x3b,0xdd,0x13,0x3c,0x2c,0xcc,0x30,0xd0,0x2c,0x2f,0x24,0x82,0x15,0x77,0x6c,0xb0,0x7e,0xe4,0x17,0x7f,0x9b,0x13,0xfc,0x42,0xdd,0x70,0xa6,0xc2,0xfe,0xd8,0xf2,0x25,0xc7,0x66,0x3c,0x7f,0x18,0x2e,0x7e,0xe8,0xec,0xcf,0xf2,0x0d,0xc7,0xb0,0xe1,0xd5,0x83,0x4e,0xc5,0xb1,0xea,0x01,},"\xf8\xb2\x19\x62\x44\x7b\x0a\x8f\x2e\x42\x79\xde\x41\x1b\xea\x12\x8e\x0b\xe4\x4b\x69\x15\xe6\xcd\xa8\x83\x41\xa6\x8a\x0d\x81\x83\x57\xdb\x93\x8e\xac\x73\xe0\xaf\x6d\x31\x20\x6b\x39\x48\xf8\xc4\x8a\x44\x73\x08"}, -{{0xeb,0x77,0xb2,0x63,0x8f,0x23,0xee,0xbc,0x82,0xef,0xe4,0x5e,0xe9,0xe5,0xa0,0x32,0x66,0x37,0x40,0x1e,0x66,0x3e,0xd0,0x29,0x69,0x9b,0x21,0xe6,0x44,0x3f,0xb4,0x8e,},{0x9e,0xf2,0x76,0x08,0x96,0x1a,0xc7,0x11,0xde,0x71,0xa6,0xe2,0xd4,0xd4,0x66,0x3e,0xa3,0xec,0xd4,0x2f,0xb7,0xe4,0xe8,0x62,0x7c,0x39,0x62,0x2d,0xf4,0xaf,0x0b,0xbc,},{0x18,0xdc,0x56,0xd7,0xbd,0x9a,0xcd,0x4f,0x4d,0xaa,0x78,0x54,0x0b,0x4a,0xc8,0xff,0x7a,0xa9,0x81,0x5f,0x45,0xa0,0xbb,0xa3,0x70,0x73,0x1a,0x14,0xea,0xab,0xe9,0x6d,0xf8,0xb5,0xf3,0x7d,0xbf,0x8e,0xae,0x4c,0xb1,0x5a,0x64,0xb2,0x44,0x65,0x1e,0x59,0xd6,0xa3,0xd6,0x76,0x1d,0x9e,0x3c,0x50,0xf2,0xd0,0xcb,0xb0,0x9c,0x05,0xec,0x06,},"\x99\xe3\xd0\x09\x34\x00\x3e\xba\xfc\x3e\x9f\xdb\x68\x7b\x0f\x5f\xf9\xd5\x78\x2a\x4b\x1f\x56\xb9\x70\x00\x46\xc0\x77\x91\x56\x02\xc3\x13\x4e\x22\xfc\x90\xed\x7e\x69\x0f\xdd\xd4\x43\x3e\x20\x34\xdc\xb2\xdc\x99\xab"}, -{{0xb6,0x25,0xaa,0x89,0xd3,0xf7,0x30,0x87,0x15,0x42,0x7b,0x6c,0x39,0xbb,0xac,0x58,0xef,0xfd,0x3a,0x0f,0xb7,0x31,0x6f,0x7a,0x22,0xb9,0x9e,0xe5,0x92,0x2f,0x2d,0xc9,},{0x65,0xa9,0x9c,0x3e,0x16,0xfe,0xa8,0x94,0xec,0x33,0xc6,0xb2,0x0d,0x91,0x05,0xe2,0xa0,0x4e,0x27,0x64,0xa4,0x76,0x9d,0x9b,0xbd,0x4d,0x8b,0xac,0xfe,0xab,0x4a,0x2e,},{0x01,0xbb,0x90,0x1d,0x83,0xb8,0xb6,0x82,0xd3,0x61,0x4a,0xf4,0x6a,0x80,0x7b,0xa2,0x69,0x13,0x58,0xfe,0xb7,0x75,0x32,0x5d,0x34,0x23,0xf5,0x49,0xff,0x0a,0xa5,0x75,0x7e,0x4e,0x1a,0x74,0xe9,0xc7,0x0f,0x97,0x21,0xd8,0xf3,0x54,0xb3,0x19,0xd4,0xf4,0xa1,0xd9,0x14,0x45,0xc8,0x70,0xfd,0x0f,0xfb,0x94,0xfe,0xd6,0x46,0x64,0x73,0x0d,},"\xe0\x72\x41\xdb\xd3\xad\xbe\x61\x0b\xbe\x4d\x00\x5d\xd4\x67\x32\xa4\xc2\x50\x86\xec\xb8\xec\x29\xcd\x7b\xca\x11\x6e\x1b\xf9\xf5\x3b\xfb\xf3\xe1\x1f\xa4\x90\x18\xd3\x9f\xf1\x15\x4a\x06\x66\x8e\xf7\xdf\x5c\x67\x8e\x6a"}, -{{0xb1,0xc9,0xf8,0xbd,0x03,0xfe,0x82,0xe7,0x8f,0x5c,0x0f,0xb0,0x64,0x50,0xf2,0x7d,0xac,0xdf,0x71,0x64,0x34,0xdb,0x26,0x82,0x75,0xdf,0x3e,0x1d,0xc1,0x77,0xaf,0x42,},{0x7f,0xc8,0x8b,0x1f,0x7b,0x3f,0x11,0xc6,0x29,0xbe,0x67,0x1c,0x21,0x62,0x1f,0x5c,0x10,0x67,0x2f,0xaf,0xc8,0x49,0x2d,0xa8,0x85,0x74,0x20,0x59,0xee,0x67,0x74,0xcf,},{0x4b,0x22,0x99,0x51,0xef,0x26,0x2f,0x16,0x97,0x8f,0x79,0x14,0xbc,0x67,0x2e,0x72,0x26,0xc5,0xf8,0x37,0x9d,0x27,0x78,0xc5,0xa2,0xdc,0x0a,0x26,0x50,0x86,0x9f,0x7a,0xcf,0xbd,0x0b,0xcd,0x30,0xfd,0xb0,0x61,0x9b,0xb4,0x4f,0xc1,0xae,0x59,0x39,0xb8,0x7c,0xc3,0x18,0x13,0x30,0x09,0xc2,0x03,0x95,0xb6,0xc7,0xeb,0x98,0x10,0x77,0x01,},"\x33\x1d\xa7\xa9\xc1\xf8\x7b\x2a\xc9\x1e\xe3\xb8\x6d\x06\xc2\x91\x63\xc0\x5e\xd6\xf8\xd8\xa9\x72\x5b\x47\x1b\x7d\xb0\xd6\xac\xec\x7f\x0f\x70\x24\x87\x16\x3f\x5e\xda\x02\x0c\xa5\xb4\x93\xf3\x99\xe1\xc8\xd3\x08\xc3\xc0\xc2"}, -{{0x6d,0x8c,0xdb,0x2e,0x07,0x5f,0x3a,0x2f,0x86,0x13,0x72,0x14,0xcb,0x23,0x6c,0xeb,0x89,0xa6,0x72,0x8b,0xb4,0xa2,0x00,0x80,0x6b,0xf3,0x55,0x7f,0xb7,0x8f,0xac,0x69,},{0x57,0xa0,0x4c,0x7a,0x51,0x13,0xcd,0xdf,0xe4,0x9a,0x4c,0x12,0x46,0x91,0xd4,0x6c,0x1f,0x9c,0xdc,0x8f,0x34,0x3f,0x9d,0xcb,0x72,0xa1,0x33,0x0a,0xec,0xa7,0x1f,0xda,},{0xa6,0xcb,0xc9,0x47,0xf9,0xc8,0x7d,0x14,0x55,0xcf,0x1a,0x70,0x85,0x28,0xc0,0x90,0xf1,0x1e,0xce,0xe4,0x85,0x5d,0x1d,0xba,0xad,0xf4,0x74,0x54,0xa4,0xde,0x55,0xfa,0x4c,0xe8,0x4b,0x36,0xd7,0x3a,0x5b,0x5f,0x8f,0x59,0x29,0x8c,0xcf,0x21,0x99,0x2d,0xf4,0x92,0xef,0x34,0x16,0x3d,0x87,0x75,0x3b,0x7e,0x9d,0x32,0xf2,0xc3,0x66,0x0b,},"\x7f\x31\x8d\xbd\x12\x1c\x08\xbf\xdd\xfe\xff\x4f\x6a\xff\x4e\x45\x79\x32\x51\xf8\xab\xf6\x58\x40\x33\x58\x23\x89\x84\x36\x00\x54\xf2\xa8\x62\xc5\xbb\x83\xed\x89\x02\x5d\x20\x14\xa7\xa0\xce\xe5\x0d\xa3\xcb\x0e\x76\xbb\xb6\xbf"}, -{{0x47,0xad,0xc6,0xd6,0xbf,0x57,0x1e,0xe9,0x57,0x0c,0xa0,0xf7,0x5b,0x60,0x4a,0xc4,0x3e,0x30,0x3e,0x4a,0xb3,0x39,0xca,0x9b,0x53,0xca,0xcc,0x5b,0xe4,0x5b,0x2c,0xcb,},{0xa3,0xf5,0x27,0xa1,0xc1,0xf1,0x7d,0xfe,0xed,0x92,0x27,0x73,0x47,0xc9,0xf9,0x8a,0xb4,0x75,0xde,0x17,0x55,0xb0,0xab,0x54,0x6b,0x8a,0x15,0xd0,0x1b,0x9b,0xd0,0xbe,},{0x4e,0x8c,0x31,0x83,0x43,0xc3,0x06,0xad,0xbb,0xa6,0x0c,0x92,0xb7,0x5c,0xb0,0x56,0x9b,0x92,0x19,0xd8,0xa8,0x6e,0x5d,0x57,0x75,0x2e,0xd2,0x35,0xfc,0x10,0x9a,0x43,0xc2,0xcf,0x4e,0x94,0x2c,0xac,0xf2,0x97,0x27,0x9f,0xbb,0x28,0x67,0x53,0x47,0xe0,0x80,0x27,0x72,0x2a,0x4e,0xb7,0x39,0x5e,0x00,0xa1,0x74,0x95,0xd3,0x2e,0xdf,0x0b,},"\xce\x49\x7c\x5f\xf5\xa7\x79\x90\xb7\xd8\xf8\x69\x9e\xb1\xf5\xd8\xc0\x58\x2f\x70\xcb\x7a\xc5\xc5\x4d\x9d\x92\x49\x13\x27\x8b\xc6\x54\xd3\x7e\xa2\x27\x59\x0e\x15\x20\x22\x17\xfc\x98\xda\xc4\xc0\xf3\xbe\x21\x83\xd1\x33\x31\x57\x39"}, -{{0x3c,0x19,0xb5,0x0b,0x0f,0xe4,0x79,0x61,0x71,0x9c,0x38,0x1d,0x0d,0x8d,0xa9,0xb9,0x86,0x9d,0x31,0x2f,0x13,0xe3,0x29,0x8b,0x97,0xfb,0x22,0xf0,0xaf,0x29,0xcb,0xbe,},{0x0f,0x7e,0xda,0x09,0x14,0x99,0x62,0x5e,0x2b,0xae,0x85,0x36,0xea,0x35,0xcd,0xa5,0x48,0x3b,0xd1,0x6a,0x9c,0x7e,0x41,0x6b,0x34,0x1d,0x6f,0x2c,0x83,0x34,0x36,0x12,},{0xef,0xbd,0x41,0xf2,0x6a,0x5d,0x62,0x68,0x55,0x16,0xf8,0x82,0xb6,0xec,0x74,0xe0,0xd5,0xa7,0x18,0x30,0xd2,0x03,0xc2,0x31,0x24,0x8f,0x26,0xe9,0x9a,0x9c,0x65,0x78,0xec,0x90,0x0d,0x68,0xcd,0xb8,0xfa,0x72,0x16,0xad,0x0d,0x24,0xf9,0xec,0xbc,0x9f,0xfa,0x65,0x53,0x51,0x66,0x65,0x82,0xf6,0x26,0x64,0x53,0x95,0xa3,0x1f,0xa7,0x04,},"\x8d\xdc\xd6\x30\x43\xf5\x5e\xc3\xbf\xc8\x3d\xce\xae\x69\xd8\xf8\xb3\x2f\x4c\xdb\x6e\x2a\xeb\xd9\x4b\x43\x14\xf8\xfe\x72\x87\xdc\xb6\x27\x32\xc9\x05\x2e\x75\x57\xfe\x63\x53\x43\x38\xef\xb5\xb6\x25\x4c\x5d\x41\xd2\x69\x0c\xf5\x14\x4f"}, -{{0x34,0xe1,0xe9,0xd5,0x39,0x10,0x7e,0xb8,0x6b,0x39,0x3a,0x5c,0xce,0xa1,0x49,0x6d,0x35,0xbc,0x7d,0x5e,0x9a,0x8c,0x51,0x59,0xd9,0x57,0xe4,0xe5,0x85,0x2b,0x3e,0xb0,},{0x0e,0xcb,0x26,0x01,0xd5,0xf7,0x04,0x74,0x28,0xe9,0xf9,0x09,0x88,0x3a,0x12,0x42,0x00,0x85,0xf0,0x4e,0xe2,0xa8,0x8b,0x6d,0x95,0xd3,0xd7,0xf2,0xc9,0x32,0xbd,0x76,},{0x32,0xd2,0x29,0x04,0xd3,0xe7,0x01,0x2d,0x6f,0x5a,0x44,0x1b,0x0b,0x42,0x28,0x06,0x4a,0x5c,0xf9,0x5b,0x72,0x3a,0x66,0xb0,0x48,0xa0,0x87,0xec,0xd5,0x59,0x20,0xc3,0x1c,0x20,0x4c,0x3f,0x20,0x06,0x89,0x1a,0x85,0xdd,0x19,0x32,0xe3,0xf1,0xd6,0x14,0xcf,0xd6,0x33,0xb5,0xe6,0x32,0x91,0xc6,0xd8,0x16,0x6f,0x30,0x11,0x43,0x1e,0x09,},"\xa6\xd4\xd0\x54\x2c\xfe\x0d\x24\x0a\x90\x50\x7d\xeb\xac\xab\xce\x7c\xbb\xd4\x87\x32\x35\x3f\x4f\xad\x82\xc7\xbb\x7d\xbd\x9d\xf8\xe7\xd9\xa1\x69\x80\xa4\x51\x86\xd8\x78\x6c\x5e\xf6\x54\x45\xbc\xc5\xb2\xad\x5f\x66\x0f\xfc\x7c\x8e\xaa\xc0"}, -{{0x49,0xdd,0x47,0x3e,0xde,0x6a,0xa3,0xc8,0x66,0x82,0x4a,0x40,0xad,0xa4,0x99,0x6c,0x23,0x9a,0x20,0xd8,0x4c,0x93,0x65,0xe4,0xf0,0xa4,0x55,0x4f,0x80,0x31,0xb9,0xcf,},{0x78,0x8d,0xe5,0x40,0x54,0x4d,0x3f,0xeb,0x0c,0x91,0x92,0x40,0xb3,0x90,0x72,0x9b,0xe4,0x87,0xe9,0x4b,0x64,0xad,0x97,0x3e,0xb6,0x5b,0x46,0x69,0xec,0xf2,0x35,0x01,},{0xd2,0xfd,0xe0,0x27,0x91,0xe7,0x20,0x85,0x25,0x07,0xfa,0xa7,0xc3,0x78,0x90,0x40,0xd9,0xef,0x86,0x64,0x63,0x21,0xf3,0x13,0xac,0x55,0x7f,0x40,0x02,0x49,0x15,0x42,0xdd,0x67,0xd0,0x5c,0x69,0x90,0xcd,0xb0,0xd4,0x95,0x50,0x1f,0xbc,0x5d,0x51,0x88,0xbf,0xbb,0x84,0xdc,0x1b,0xf6,0x09,0x8b,0xee,0x06,0x03,0xa4,0x7f,0xc2,0x69,0x0f,},"\x3a\x53\x59\x4f\x3f\xba\x03\x02\x93\x18\xf5\x12\xb0\x84\xa0\x71\xeb\xd6\x0b\xae\xc7\xf5\x5b\x02\x8d\xc7\x3b\xfc\x9c\x74\xe0\xca\x49\x6b\xf8\x19\xdd\x92\xab\x61\xcd\x8b\x74\xbe\x3c\x0d\x6d\xcd\x12\x8e\xfc\x5e\xd3\x34\x2c\xba\x12\x4f\x72\x6c"}, -{{0x33,0x1c,0x64,0xda,0x48,0x2b,0x6b,0x55,0x13,0x73,0xc3,0x64,0x81,0xa0,0x2d,0x81,0x36,0xec,0xad,0xbb,0x01,0xab,0x11,0x4b,0x44,0x70,0xbf,0x41,0x60,0x7a,0xc5,0x71,},{0x52,0xa0,0x0d,0x96,0xa3,0x14,0x8b,0x47,0x26,0x69,0x2d,0x9e,0xff,0x89,0x16,0x0e,0xa9,0xf9,0x9a,0x5c,0xc4,0x38,0x9f,0x36,0x1f,0xed,0x0b,0xb1,0x6a,0x42,0xd5,0x21,},{0x22,0xc9,0x9a,0xa9,0x46,0xea,0xd3,0x9a,0xc7,0x99,0x75,0x62,0x81,0x0c,0x01,0xc2,0x0b,0x46,0xbd,0x61,0x06,0x45,0xbd,0x2d,0x56,0xdc,0xdc,0xba,0xac,0xc5,0x45,0x2c,0x74,0xfb,0xf4,0xb8,0xb1,0x81,0x3b,0x0e,0x94,0xc3,0x0d,0x80,0x8c,0xe5,0x49,0x8e,0x61,0xd4,0xf7,0xcc,0xbb,0x4c,0xc5,0xf0,0x4d,0xfc,0x61,0x40,0x82,0x5a,0x96,0x00,},"\x20\xe1\xd0\x5a\x0d\x5b\x32\xcc\x81\x50\xb8\x11\x6c\xef\x39\x65\x9d\xd5\xfb\x44\x3a\xb1\x56\x00\xf7\x8e\x5b\x49\xc4\x53\x26\xd9\x32\x3f\x28\x50\xa6\x3c\x38\x08\x85\x94\x95\xae\x27\x3f\x58\xa5\x1e\x9d\xe9\xa1\x45\xd7\x74\xb4\x0b\xa9\xd7\x53\xd3"}, -{{0x5c,0x0b,0x96,0xf2,0xaf,0x87,0x12,0x12,0x2c,0xf7,0x43,0xc8,0xf8,0xdc,0x77,0xb6,0xcd,0x55,0x70,0xa7,0xde,0x13,0x29,0x7b,0xb3,0xdd,0xe1,0x88,0x62,0x13,0xcc,0xe2,},{0x05,0x10,0xea,0xf5,0x7d,0x73,0x01,0xb0,0xe1,0xd5,0x27,0x03,0x9b,0xf4,0xc6,0xe2,0x92,0x30,0x0a,0x3a,0x61,0xb4,0x76,0x54,0x34,0xf3,0x20,0x3c,0x10,0x03,0x51,0xb1,},{0x06,0xe5,0xd8,0x43,0x6a,0xc7,0x70,0x5b,0x3a,0x90,0xf1,0x63,0x1c,0xdd,0x38,0xec,0x1a,0x3f,0xa4,0x97,0x78,0xa9,0xb9,0xf2,0xfa,0x5e,0xbe,0xa4,0xe7,0xd5,0x60,0xad,0xa7,0xdd,0x26,0xff,0x42,0xfa,0xfa,0x8b,0xa4,0x20,0x32,0x37,0x42,0x76,0x1a,0xca,0x69,0x04,0x94,0x0d,0xc2,0x1b,0xbe,0xf6,0x3f,0xf7,0x2d,0xaa,0xb4,0x5d,0x43,0x0b,},"\x54\xe0\xca\xa8\xe6\x39\x19\xca\x61\x4b\x2b\xfd\x30\x8c\xcf\xe5\x0c\x9e\xa8\x88\xe1\xee\x44\x46\xd6\x82\xcb\x50\x34\x62\x7f\x97\xb0\x53\x92\xc0\x4e\x83\x55\x56\xc3\x1c\x52\x81\x6a\x48\xe4\xfb\x19\x66\x93\x20\x6b\x8a\xfb\x44\x08\x66\x2b\x3c\xb5\x75"}, -{{0xde,0x84,0xf2,0x43,0x5f,0x78,0xde,0xdb,0x87,0xda,0x18,0x19,0x4f,0xf6,0xa3,0x36,0xf0,0x81,0x11,0x15,0x0d,0xef,0x90,0x1c,0x1a,0xc4,0x18,0x14,0x6e,0xb7,0xb5,0x4a,},{0xd3,0xa9,0x2b,0xba,0xa4,0xd6,0x3a,0xf7,0x9c,0x22,0x26,0xa7,0x23,0x6e,0x64,0x27,0x42,0x8d,0xf8,0xb3,0x62,0x42,0x7f,0x87,0x30,0x23,0xb2,0x2d,0x2f,0x5e,0x03,0xf2,},{0x47,0x1e,0xbc,0x97,0x3c,0xfd,0xac,0xee,0xc0,0x72,0x79,0x30,0x73,0x68,0xb7,0x3b,0xe3,0x5b,0xc6,0xf8,0xd8,0x31,0x2b,0x70,0x15,0x05,0x67,0x36,0x90,0x96,0x70,0x6d,0xc4,0x71,0x12,0x6c,0x35,0x76,0xf9,0xf0,0xeb,0x55,0x0d,0xf5,0xac,0x6a,0x52,0x51,0x81,0x11,0x00,0x29,0xdd,0x1f,0xc1,0x11,0x74,0xd1,0xaa,0xce,0xd4,0x8d,0x63,0x0f,},"\x20\x51\x35\xec\x7f\x41\x7c\x85\x80\x72\xd5\x23\x3f\xb3\x64\x82\xd4\x90\x6a\xbd\x60\xa7\x4a\x49\x8c\x34\x7f\xf2\x48\xdf\xa2\x72\x2c\xa7\x4e\x87\x9d\xe3\x31\x69\xfa\xdc\x7c\xd4\x4d\x6c\x94\xa1\x7d\x16\xe1\xe6\x30\x82\x4b\xa3\xe0\xdf\x22\xed\x68\xea\xab"}, -{{0xba,0x4d,0x6e,0x67,0xb2,0xce,0x67,0xa1,0xe4,0x43,0x26,0x49,0x40,0x44,0xf3,0x7a,0x44,0x2f,0x3b,0x81,0x72,0x5b,0xc1,0xf9,0x34,0x14,0x62,0x71,0x8b,0x55,0xee,0x20,},{0xf7,0x3f,0xa0,0x76,0xf8,0x4b,0x6d,0xb6,0x75,0xa5,0xfd,0xa5,0xad,0x67,0xe3,0x51,0xa4,0x1e,0x8e,0x7f,0x29,0xad,0xd1,0x68,0x09,0xca,0x01,0x03,0x87,0xe9,0xc6,0xcc,},{0x57,0xb9,0xd2,0xa7,0x11,0x20,0x7f,0x83,0x74,0x21,0xba,0xe7,0xdd,0x48,0xea,0xa1,0x8e,0xab,0x1a,0x9a,0x70,0xa0,0xf1,0x30,0x58,0x06,0xfe,0xe1,0x7b,0x45,0x8f,0x3a,0x09,0x64,0xb3,0x02,0xd1,0x83,0x4d,0x3e,0x0a,0xc9,0xe8,0x49,0x6f,0x00,0x0b,0x77,0xf0,0x08,0x3b,0x41,0xf8,0xa9,0x57,0xe6,0x32,0xfb,0xc7,0x84,0x0e,0xee,0x6a,0x06,},"\x4b\xaf\xda\xc9\x09\x9d\x40\x57\xed\x6d\xd0\x8b\xca\xee\x87\x56\xe9\xa4\x0f\x2c\xb9\x59\x80\x20\xeb\x95\x01\x95\x28\x40\x9b\xbe\xa3\x8b\x38\x4a\x59\xf1\x19\xf5\x72\x97\xbf\xb2\xfa\x14\x2f\xc7\xbb\x1d\x90\xdb\xdd\xde\x77\x2b\xcd\xe4\x8c\x56\x70\xd5\xfa\x13"}, -{{0x0d,0x13,0x1c,0x45,0xae,0xa6,0xf3,0xa4,0xe1,0xb9,0xa2,0xcf,0x60,0xc5,0x51,0x04,0x58,0x7e,0xfa,0xa8,0x46,0xb2,0x22,0xbf,0x0a,0x7b,0x74,0xce,0x7a,0x3f,0x63,0xb6,},{0x3c,0x67,0x29,0xdb,0xe9,0x3b,0x49,0x9c,0x4e,0x61,0x4a,0x2f,0x21,0xbe,0xb7,0x29,0x43,0x8d,0x49,0x8e,0x1a,0xc8,0xd1,0x4c,0xba,0xd9,0x71,0x7a,0x5d,0xbd,0x97,0xcd,},{0xa9,0xc5,0xee,0x86,0xfb,0x06,0xd9,0xe4,0x6b,0x37,0x9c,0x32,0xdd,0xa7,0xc9,0x2c,0x9c,0x13,0xdb,0x27,0x4d,0xc2,0x41,0x16,0xfb,0xdd,0x87,0x86,0x96,0x04,0x54,0x88,0xcc,0x75,0xa5,0x2f,0xff,0x67,0xd1,0xa5,0x11,0x3d,0x06,0xe3,0x33,0xac,0x67,0xff,0x66,0x4b,0x3f,0x2a,0x40,0x5f,0xa1,0xd1,0x4d,0xd5,0xbb,0xb9,0x74,0x09,0xb6,0x06,},"\xb4\x29\x1d\x08\xb8\x8f\xb2\xf7\xb8\xf9\x9d\x0d\xce\x40\x07\x9f\xcb\xab\x71\x8b\xbd\x8f\x4e\x8e\xab\xc3\xc1\x42\x8b\x6a\x07\x1f\xb2\xa3\xc8\xeb\xa1\xca\xcc\xcf\xa8\x71\xb3\x65\xc7\x08\xbe\xf2\x68\x5b\xc1\x3e\x6b\x80\xbc\x14\xa5\xf2\x49\x17\x0f\xfc\x56\xd0\x14"}, -{{0xa7,0x5e,0x3b,0x6b,0x41,0x70,0xe4,0x44,0x78,0x1b,0xe4,0xee,0xac,0x3e,0x0f,0xda,0xa4,0xb4,0x35,0x6f,0x70,0x54,0x86,0xbc,0xb0,0x71,0xa3,0x25,0xae,0x07,0x1f,0xba,},{0x99,0x3d,0x38,0xa7,0xd7,0x2f,0x0a,0xee,0x15,0xff,0x6f,0x4f,0xdc,0x37,0xca,0x77,0x24,0xfd,0x13,0x73,0xa3,0x76,0x6b,0x27,0x5d,0xbc,0x77,0xe6,0x47,0x98,0x0e,0x0a,},{0xa5,0xdb,0x4d,0x3d,0x33,0x29,0xab,0xe3,0x69,0x79,0x59,0xe6,0xb5,0x94,0x7e,0xa8,0x60,0x1b,0x03,0xef,0x8e,0x1d,0x6f,0xe2,0x02,0x14,0x49,0x31,0x27,0x2c,0xa0,0xa0,0x9b,0x5e,0xb0,0xf3,0x90,0x57,0x2e,0xa7,0xef,0x03,0xc6,0x13,0x1e,0x9d,0xe5,0xf1,0x6b,0xf0,0xb0,0x34,0x24,0x4f,0x7e,0x10,0x4f,0xf5,0x31,0x1b,0xbf,0x66,0x3a,0x0d,},"\x40\x37\x86\x6f\x65\x48\xb0\x1c\xc6\xbc\xf3\xa9\x40\xe3\x94\x5a\xa2\xd1\x88\xb4\xb7\xf1\x82\xaa\x77\xec\x4d\x6b\x04\x28\xab\x5b\x84\xd8\x5d\xf1\x92\xa5\xa3\x8a\xda\x08\x9d\x76\xfa\x26\xbf\x67\x73\x6a\x70\x41\xa5\xeb\x8f\x0c\x57\x19\xeb\x39\x66\x93\xc4\x51\x60\xf8"}, -{{0xbc,0xbc,0xf5,0x61,0xec,0xc0,0x5a,0x41,0xc7,0xd7,0xe5,0x5e,0x69,0x6d,0x32,0xce,0x39,0xb4,0xd0,0x3c,0x1f,0x5f,0x3f,0x3a,0x89,0x27,0xfe,0x5e,0x62,0xe8,0x44,0xb2,},{0x4d,0xdf,0x53,0xfa,0xd6,0xa7,0xa9,0xed,0x30,0xf3,0xaf,0xec,0xca,0x13,0x6f,0xd7,0x84,0x3b,0x72,0xc2,0x43,0x09,0x08,0x91,0xae,0x40,0x21,0xa3,0x2c,0xad,0xff,0x1a,},{0x9f,0xf1,0x51,0x15,0xf6,0x66,0x1f,0x32,0x11,0xd7,0xa4,0x07,0x64,0x96,0x76,0x29,0xba,0x6a,0x52,0x63,0x95,0x1b,0xdc,0x3c,0x6a,0x4c,0x90,0xd0,0x70,0xf7,0xbe,0x00,0x02,0x4b,0x80,0xd8,0x3b,0x6b,0xc2,0x75,0x87,0xfc,0xff,0x5f,0x5c,0xcc,0x0e,0xb3,0xcd,0xe1,0x49,0x7c,0xf5,0x68,0x95,0x14,0x7a,0x06,0x3f,0x61,0xf0,0x8a,0xdf,0x0b,},"\x6f\x67\x16\xb6\x78\x47\x40\x98\x0a\xeb\xc3\x24\x88\x07\xe3\x1c\x12\x86\xac\x7b\x68\x1c\x00\xb6\x6c\x88\xff\x7a\x33\x6d\x44\x1f\xa5\xc3\xeb\x25\x6d\x20\xcf\x6d\x1a\xc9\x2c\xcf\xe4\xbe\x6d\xcc\x41\xb1\xaf\xf8\x46\xd3\x60\xc2\x43\x00\x1c\xab\xdf\xbf\x1a\x9b\x24\x04\x55"}, -{{0x21,0x05,0x32,0x80,0x5f,0xa9,0xcc,0x9b,0xe9,0x16,0xd2,0x13,0xca,0xc3,0x74,0xe3,0xcd,0x6f,0xc2,0x60,0x2a,0x54,0x4d,0x0c,0x1c,0xe2,0x9d,0x30,0x10,0x5d,0x69,0xab,},{0x10,0x69,0x9e,0x49,0x9b,0xe9,0x9e,0x2b,0x11,0xb9,0x8f,0x6f,0x86,0xb6,0x7c,0xdc,0x4c,0xcf,0x69,0xf3,0xc5,0x3c,0xe0,0x94,0x87,0x56,0x47,0xd2,0xd0,0xd0,0xec,0xc5,},{0x4c,0x2d,0x31,0xd5,0xbb,0xc4,0x2e,0x02,0x6d,0xc1,0xe0,0x79,0xec,0xc4,0xdd,0x07,0x2c,0x5d,0x2c,0xce,0x65,0xe3,0xdb,0x8d,0x8a,0x1d,0xd9,0x05,0x7f,0xaa,0x03,0x71,0x72,0x7f,0x72,0x72,0x31,0xa0,0xf0,0x60,0xfa,0x27,0x09,0x75,0x33,0xb6,0xdb,0x3b,0x8f,0x62,0x52,0xf2,0x79,0x3d,0x75,0x66,0x2c,0xaa,0xdf,0x5f,0x0f,0xcc,0x71,0x0e,},"\x9f\xc4\xd2\x8c\xfd\x25\xe6\xc0\xc5\xe7\x24\xe1\x9c\xa3\x9d\x71\xe5\x3b\xf4\xaa\x27\x96\xc5\x4c\x33\x51\xf1\x08\xfc\x70\xf2\x61\x1a\x62\xe0\xab\x90\xaf\x6a\xde\x52\x16\x78\x8e\x9e\xb2\xa8\x73\x05\x9b\x1e\x79\xd7\xd5\x9d\xeb\xd6\x8f\x2d\x4d\x80\xff\xe3\x1b\xf7\x4b\x92\x8c"}, -{{0x18,0x5d,0x64,0xb6,0x94,0x79,0xe0,0xba,0x0a,0x58,0x44,0xa1,0x0a,0xd8,0x41,0x25,0xba,0x11,0xc4,0xb4,0x0d,0x63,0xed,0xa2,0xc5,0x7a,0xfc,0x7e,0x01,0x9c,0x8e,0x0c,},{0xa5,0x76,0x4f,0x63,0x98,0xa5,0xae,0x22,0x66,0xa3,0x8f,0x97,0x14,0x53,0x3c,0x4b,0xbd,0x8d,0x07,0x82,0x6f,0x63,0xe2,0x04,0xcb,0xac,0x37,0x4b,0x0a,0xce,0xf1,0xbd,},{0x43,0xe0,0x38,0x7d,0xa5,0xba,0x09,0xa1,0x90,0xf6,0xe7,0xb2,0x68,0x05,0x78,0xd8,0x89,0x76,0x9b,0xcc,0x44,0x5e,0x5e,0xf5,0x71,0xb4,0x92,0x87,0x1c,0x15,0x5c,0x5b,0x9f,0x62,0x0b,0xfa,0xcf,0xbf,0x2d,0xf1,0xfd,0x87,0x44,0x46,0x04,0xb7,0x1b,0x2e,0x23,0x7b,0xaa,0xa7,0xee,0x20,0x93,0xed,0xe4,0xa6,0x01,0xed,0xf8,0x83,0xe3,0x07,},"\x4a\x08\x24\xfe\x70\xd4\x31\x54\x13\xd0\xa0\xca\xfb\xf4\xf5\xfe\x11\x7d\x5e\x07\xe1\xc3\xa4\xef\xfb\x9d\x0a\xe9\x14\x90\x23\x48\x78\xcc\xf6\x79\x2a\x91\xf6\x8c\x6a\x52\x0d\xe1\x60\x71\xf0\x8a\xbe\x35\xdc\x5e\xa4\x28\xf1\x95\x7b\x66\x33\x71\xce\x24\xc6\x09\xdd\x55\xb8\xf4\x93"}, -{{0xcf,0xa9,0xd9,0x16,0x4b,0x3c,0x4f,0x6f,0x72,0x26,0x35,0xd2,0x06,0x6c,0xd7,0xea,0x5e,0x55,0x33,0xd2,0xc7,0x4f,0x8a,0xdd,0x66,0x9c,0x37,0x1f,0xaa,0x47,0x64,0x26,},{0x41,0x16,0x9a,0x66,0xf9,0xa6,0x3f,0x28,0x57,0x82,0xa6,0xc2,0xdb,0x81,0xcc,0x3f,0x70,0xb3,0xad,0xa2,0x1a,0x68,0xc8,0x47,0x45,0xc8,0x8a,0x74,0xc3,0xb0,0xa2,0xde,},{0x01,0xd7,0xc9,0xb5,0x70,0x1a,0xf7,0x1e,0x2f,0x48,0x77,0xff,0xc9,0xb7,0xb5,0x30,0x5f,0x52,0x81,0x6d,0x44,0x58,0xe3,0x7e,0x41,0xc7,0x71,0x9f,0xac,0x1d,0x76,0xa0,0x1f,0xff,0x3f,0x50,0xfe,0x1a,0x58,0x75,0xcc,0xc3,0xfb,0x70,0x00,0x1c,0x94,0x7a,0x33,0xfc,0x8b,0x20,0x7d,0xe1,0x35,0x72,0xcc,0xdb,0x8b,0xa9,0x89,0x33,0xab,0x01,},"\x75\x76\x21\xb1\x67\x5d\xb7\xca\xce\xf7\xf2\x78\x25\x87\xff\x3a\xf5\x1a\x3e\xf2\xf4\xbc\xf9\x27\x9c\x4c\xe9\x40\x02\xe1\xf0\x04\x24\xbf\x0e\xb6\x21\x98\x2c\xc8\x5c\xb4\xd1\x71\xe5\x64\xa0\xc2\xf6\xe3\x56\x7a\x1a\xae\x2c\xdd\xb7\xe9\xb2\x5f\x47\xdc\x20\xa5\x10\x50\x54\x29\x69\xca"}, -{{0x1a,0xcb,0x4a,0x25,0x6c,0x2f,0x89,0x93,0xca,0x24,0xde,0x1e,0x00,0x14,0x60,0x6d,0x66,0x8b,0x5e,0x75,0x60,0x32,0xd2,0x69,0xf1,0xd2,0x4d,0x35,0x1c,0x8e,0xea,0x4a,},{0xcb,0xbd,0xcd,0x8c,0xbc,0x88,0x5a,0xb4,0x3a,0x05,0x7e,0x5f,0x95,0x79,0xf1,0x16,0x19,0x54,0x15,0x9e,0x7b,0x56,0x2e,0xa2,0x6c,0xd9,0xa4,0x3c,0x88,0xd3,0xf9,0x6d,},{0x05,0xaa,0x76,0xf7,0xfe,0x51,0x89,0x23,0x03,0xd7,0x89,0x14,0x71,0x59,0x95,0xe7,0xd7,0x68,0xff,0x77,0x14,0xce,0x27,0x0f,0x17,0x5e,0x56,0xaf,0x17,0xae,0x01,0x8d,0x3f,0xa9,0x39,0xf5,0xf6,0x20,0xde,0x82,0xbc,0xd1,0x54,0x96,0x87,0xb2,0x05,0xc7,0x87,0x12,0x03,0xe6,0x24,0x23,0x8c,0x4e,0x30,0x9f,0xab,0x7f,0x92,0xfb,0xaa,0x05,},"\xc4\x6a\x6d\x61\xaa\x0a\xed\x1c\x1d\x85\x47\xa7\x0b\x89\xb7\x19\x64\x75\xd5\xa4\x87\x08\x81\xb1\xec\xd0\xf0\xcb\x9c\x74\x5f\x8a\x2a\xdc\x80\x24\xe2\xdc\x55\xb5\x3a\xa5\xd3\x83\xa8\x1a\xab\xc1\xa4\x7e\x8d\x07\xd0\x0b\x7f\x0b\x56\xce\xdd\xbf\xb1\xf4\x24\xbb\x5c\x02\x18\x46\x78\xa6\x66"}, -{{0xac,0xe3,0xc4,0x64,0x24,0x82,0x36,0x22,0x97,0x9f,0xc3,0xa8,0x4a,0x7d,0xa6,0x9c,0x1d,0x52,0x7d,0x83,0x12,0xe8,0xfb,0x01,0x83,0x75,0xbd,0x3a,0x96,0xc2,0x9c,0x18,},{0x93,0x7c,0xf3,0x41,0x36,0xd9,0xe1,0xcc,0xe0,0xde,0x11,0xb1,0x2c,0x70,0xcb,0xfb,0x74,0x55,0x44,0x84,0x21,0xe9,0x2c,0x82,0xe7,0xc4,0x09,0x34,0xbf,0xf8,0xc6,0x76,},{0xfe,0xb8,0x89,0x6d,0xd3,0xfe,0x60,0x01,0xff,0xea,0x17,0x1b,0x37,0xb7,0x88,0xa6,0x9f,0x7f,0x85,0x01,0x93,0xa6,0x34,0x06,0xf5,0x63,0x76,0xdd,0x26,0x3d,0x09,0x9a,0xef,0x80,0xec,0xe6,0x7e,0x2c,0x43,0xf4,0x0e,0xca,0x46,0x2c,0x6b,0x71,0xe7,0x94,0x06,0xb1,0x8d,0xb7,0x4a,0xe5,0xd4,0x98,0x44,0xe3,0xb1,0x32,0xbc,0x2a,0x13,0x07,},"\xa9\xf1\x37\xbc\x90\x21\xbf\x10\x5a\xee\x25\xbe\x21\xcd\x9e\xe5\xb3\x54\x7c\xf1\x0c\xc5\xf9\x84\x76\xfb\x58\x8b\xd7\x0e\x2d\x6d\x6b\x08\x34\xe8\x42\xe4\xee\x94\x30\x3c\xf9\x6b\x09\xc1\x71\x53\x81\xb3\x6e\x14\xa4\x91\xb8\x0f\x89\x5e\xa4\x21\xb8\xec\x2b\x1d\x3c\x18\x7e\x02\x93\x5c\x55\x26"}, -{{0x88,0xf6,0x81,0x93,0x4e,0x33,0xc3,0x5c,0x07,0xdc,0x6e,0x5a,0x83,0x29,0x42,0xae,0x3d,0x59,0x90,0x3c,0xcd,0xe2,0xf7,0x6c,0xcb,0x75,0x87,0xce,0xa7,0xec,0x41,0xb6,},{0x6a,0x4e,0x8a,0xa5,0xad,0xb6,0x3d,0x22,0xfd,0x7b,0x14,0xa2,0x6f,0xdb,0x03,0xb7,0xc8,0xaa,0x6c,0xcd,0x5a,0x19,0x6f,0x2c,0x54,0xb0,0x46,0x5a,0xdb,0x50,0x92,0xe1,},{0x45,0xb2,0x7b,0xf1,0xb9,0xea,0xc0,0x6b,0x62,0xb6,0x86,0xf6,0xd5,0x46,0x56,0x3b,0x2d,0xfe,0x5b,0x17,0x5d,0xbe,0xf3,0x2b,0xf7,0x8c,0x35,0xa1,0x6c,0x95,0x8a,0x9d,0x4f,0x26,0xd2,0x91,0xde,0x9b,0xb2,0x06,0x6c,0x0a,0x28,0x61,0x13,0xcc,0x09,0x17,0x2d,0x40,0xa3,0x6d,0x4c,0xbd,0x95,0x17,0x08,0x86,0x02,0x26,0xeb,0x30,0xcd,0x05,},"\x6e\x8b\xac\x1f\x85\x3b\x81\xfe\xf9\x47\x07\xe1\x8c\xc6\x1c\x6f\x0a\x9c\xbc\x2a\x41\xd0\x78\xdc\xc8\x3f\xc0\x22\x9c\x7f\x8d\xbe\x6d\xbd\xd9\x08\x54\xb1\xf1\xae\x2b\x9f\x2b\x12\x0b\x86\xa8\x78\x6b\x4e\x78\xce\x23\xab\x86\xba\xaf\x88\x75\x4a\xf0\xf3\xd8\x88\x81\xda\xe0\xbc\x52\x61\xbf\xd0\x38"}, -{{0x48,0x05,0x0a,0x6e,0x01,0x58,0xf6,0xad,0x25,0x34,0x12,0xe4,0x49,0x7c,0xff,0x62,0xd5,0xee,0x55,0x5e,0xdf,0xfe,0x59,0xe4,0xdc,0x40,0x15,0x22,0x81,0x32,0x95,0xce,},{0x97,0x5e,0x01,0x0a,0xbb,0x9a,0x3e,0x56,0x65,0x91,0x37,0xb0,0x50,0x60,0x57,0xf2,0x83,0x98,0x2f,0x88,0x6c,0xa1,0x72,0xc7,0xbc,0x2c,0x50,0x0e,0xd9,0xbd,0x26,0xc1,},{0x72,0x16,0xab,0x60,0xc3,0x51,0x68,0x18,0x7d,0x0f,0xce,0x47,0x53,0xc8,0x6e,0x80,0x05,0x8d,0x54,0x0b,0x76,0xbf,0x95,0x84,0x3a,0x58,0x98,0x84,0x10,0x60,0xa9,0x9a,0x44,0xde,0x6f,0x43,0x96,0x25,0xa3,0xf6,0x36,0x5f,0x59,0xc3,0x77,0xbf,0x45,0x90,0x9b,0xbf,0xef,0x5c,0x50,0xb2,0x5f,0x31,0x94,0xe5,0xfb,0xd3,0x4e,0xa5,0xe7,0x06,},"\xed\x6e\xec\x29\xfb\x70\x49\xdf\xf7\x07\xf0\xa4\x42\x6e\xbc\x8f\x5b\x35\x0e\x95\x87\x0b\x9d\x61\x98\xc8\x13\x9e\x9c\x3e\x1e\x40\x99\x37\xd1\xa8\x58\xa0\xde\xa4\x82\xa5\xcb\x1a\x85\x4e\xd3\xb5\xa9\x39\x7a\xcb\x63\xbf\xf6\xb6\x40\x39\xef\x2e\xb1\x15\x9e\x99\x85\x83\x10\xbb\xbd\x86\x12\x5c\x3e\x0e"}, -{{0x18,0xd1,0x3d,0x0c,0x00,0xe8,0xe3,0x38,0x6a,0x5c,0xfb,0x30,0xa9,0xe7,0x9f,0xe8,0x8b,0x18,0x61,0xed,0x2d,0x12,0x01,0xeb,0x17,0x00,0x38,0xe1,0x94,0x77,0x04,0x03,},{0xa4,0xaf,0xc8,0x33,0x40,0x18,0x76,0x09,0x0d,0x9b,0x88,0x0c,0x41,0x26,0x7d,0x68,0xcb,0xbe,0xea,0xa3,0x8a,0xfb,0x20,0x88,0x4e,0x27,0x32,0x8f,0x3b,0x7f,0x53,0x5e,},{0x03,0x39,0x88,0x15,0x4c,0x5d,0x79,0xd2,0x51,0x0b,0xe8,0x3e,0x77,0x80,0x15,0xdf,0xe2,0xfb,0x85,0xb8,0x11,0x1f,0x7e,0xc1,0x39,0x91,0x8b,0x54,0x00,0xe3,0xd6,0x56,0xee,0x80,0xa9,0xf5,0xc9,0x07,0x2b,0x5b,0x46,0x7a,0x5c,0xc5,0xa5,0x7c,0xc8,0xad,0x10,0x62,0xb5,0xbf,0xf1,0x08,0x62,0xd9,0xd3,0x69,0xdd,0xe2,0xcc,0x96,0x67,0x01,},"\x91\x0f\x6c\x27\x2d\xd9\x79\x31\xac\x47\x31\x0d\x24\x4c\xad\xb4\x32\x51\x36\x5e\x02\xba\x9f\x6a\x5b\x3c\x32\x26\xbe\x9d\x7d\x3a\x74\xa2\xba\x49\x06\xe8\xe7\x1a\x4b\xf3\xd3\x55\x6e\xbd\xfc\x66\x6c\xd6\xb1\x2f\x20\xc4\xa0\x08\x34\xb8\x8f\xbb\x24\x45\x75\x19\x92\x86\xb0\xb9\x34\x4c\xf3\x34\xaf\xf0\x07"}, -{{0x4a,0xdc,0x8c,0x28,0x64,0x6a,0x93,0xa8,0x17,0x29,0x3a,0x14,0xd2,0x9b,0x48,0xe2,0xc6,0xd7,0x12,0xa6,0x89,0x93,0x54,0x7a,0x5c,0x5e,0x4d,0x14,0x52,0xac,0xbc,0x3a,},{0x7f,0x40,0x47,0x36,0x28,0xf2,0x3f,0xc0,0xdf,0xf0,0x02,0x1a,0xfd,0x48,0x77,0x40,0xd4,0x91,0x6a,0x91,0x22,0xe6,0xc9,0x7d,0x36,0x43,0x3e,0x5e,0xbf,0x04,0xf8,0x8c,},{0x6d,0x3b,0x4e,0x90,0xec,0x40,0x83,0x11,0xf9,0xb1,0x5b,0x92,0x53,0xd3,0xd9,0x5c,0x5d,0x15,0x26,0x20,0xc2,0x60,0xd5,0x63,0x02,0x55,0x5a,0x88,0x04,0xa5,0x10,0x4b,0xa5,0xe8,0xd2,0x9e,0xe1,0x08,0xe7,0x64,0xa6,0x42,0x19,0x29,0x72,0x98,0xab,0x76,0x74,0xbb,0xca,0x78,0x4d,0xee,0x28,0x77,0x3b,0x34,0xe1,0x85,0xa3,0x86,0xc2,0x08,},"\x09\xfb\x55\x01\xf1\x68\x8f\x80\xa0\xab\x9e\x22\xd7\x78\xae\x13\x0a\xca\xf7\x4d\x7f\x51\x85\xb4\xda\x19\x8c\x6b\x9e\xda\xc4\x30\x2e\x2b\x75\x3e\x57\x87\x66\xe1\x7d\x40\x56\xdc\x40\xd9\x5c\xf4\xca\x8b\xcc\x65\x65\x79\x5e\x97\xd6\x8b\xcd\xa7\x9f\xa7\x7c\x49\x33\x97\x71\x63\x56\x16\x4c\xaa\xb5\xd1\x9c\xfd"}, -{{0xf2,0x6e,0x1c,0x84,0x69,0x7a,0x49,0x08,0x15,0x1b,0x44,0x7d,0xcf,0x6c,0x7c,0x7a,0x38,0xb0,0x40,0x81,0xdb,0x9e,0x7c,0x77,0x38,0xe6,0xfe,0xc9,0x00,0xbe,0xd0,0xc1,},{0xa8,0x6e,0x14,0x22,0xc1,0x23,0x5f,0xf8,0xe1,0xaa,0x08,0x34,0x70,0xd5,0xe4,0x22,0x88,0xcb,0x00,0x7a,0xb5,0x0e,0x79,0x5d,0xd0,0xb4,0xff,0x87,0x39,0x49,0x66,0xc4,},{0x44,0xf3,0x34,0x4b,0x95,0x66,0xc9,0xdf,0xd2,0x2d,0x61,0x98,0xe1,0xcb,0xf9,0x5d,0x9e,0x28,0xf2,0x98,0x2f,0xc7,0xf1,0x66,0xab,0x25,0xdd,0xa3,0x0c,0x46,0xf7,0x68,0xc5,0x58,0xe0,0x39,0x4f,0xb9,0xab,0x3e,0x1d,0x4d,0xb4,0xcf,0x48,0x7c,0x17,0x64,0x1a,0x13,0xf3,0xf4,0x89,0x39,0xe0,0xc6,0x48,0x27,0xa7,0x51,0x03,0xc5,0x74,0x06,},"\x54\xed\x47\x60\x6a\x14\x87\xc2\xf9\x00\xce\xfb\x6e\x89\x9d\xba\xf6\xc3\x1c\xc8\x8e\xbe\x35\x58\xb8\x3b\x93\xf6\xd4\x22\xc3\x1e\x88\x8e\x48\xe5\x20\xee\xae\xdd\x7e\x55\x4a\x9c\xd4\x0c\x2c\x51\x9d\x53\x3b\x61\x44\xce\xe4\x84\xc3\x89\xe9\x76\xb1\xe4\x02\x2b\x50\xe7\xdb\xb8\x7e\xad\x7e\x54\x1a\x20\x04\xda\xf7"}, -{{0xcc,0x0c,0x33,0xf3,0xa8,0x6f,0x5a,0x17,0xd3,0x0c,0x18,0x6c,0xe0,0xf3,0xb7,0x40,0xba,0xfa,0x5f,0xe3,0xc7,0x09,0x0f,0x14,0x35,0x41,0xe2,0xb2,0xc1,0xe5,0x34,0xbc,},{0x96,0x7a,0x71,0xc7,0xcf,0x9b,0x82,0xcc,0x78,0xcb,0xe1,0x09,0x10,0x4d,0x8b,0x43,0x8a,0x8d,0x1f,0xd7,0x1d,0x26,0x0d,0x02,0x90,0x46,0xa9,0xa4,0x52,0x68,0x66,0xff,},{0xe2,0x77,0xb3,0xdd,0x65,0x5c,0x33,0xff,0x75,0xfa,0x92,0x0a,0xf1,0xfc,0xc8,0x59,0x40,0x1e,0x6c,0x7a,0x6e,0xf4,0xc6,0xbf,0xbf,0xac,0x50,0x69,0x63,0x8f,0x19,0xca,0x11,0x5b,0xaf,0x13,0xc0,0x9c,0x82,0xaf,0x79,0x3f,0xac,0xb6,0xab,0xd0,0xcd,0x58,0xe8,0x48,0x1b,0x08,0xc1,0xb6,0x8a,0xd7,0xa2,0x66,0x5c,0x4a,0x61,0x4a,0x28,0x06,},"\x19\x44\xe5\xe1\x55\xd7\x5e\x0d\x0b\xe9\x2e\x1b\xe1\x4c\xec\x37\x0a\xd1\x37\x91\xf2\xbf\xd4\x0f\x27\x12\x14\xe9\x4f\xcf\x21\x3c\x71\xbc\x20\xd7\xce\x0c\x75\x84\x42\x1a\xc4\xef\xc4\x51\x88\x3c\xc3\xf4\x95\x6f\x21\xf7\x3a\x42\x16\x72\x04\x38\xbc\x38\xff\x2c\xfd\xf3\x70\x99\x05\xa5\x0a\x9d\x94\xb1\xd9\xe7\x93\x2b"}, -{{0xf0,0xbc,0x97,0x93,0x75,0xa7,0x07,0x30,0x68,0xdb,0xa7,0xf6,0xc0,0x94,0xdb,0x65,0x98,0xb4,0xe4,0x5d,0xf7,0xd5,0x49,0x58,0x3c,0x22,0xfd,0xed,0x80,0x48,0xfa,0x2e,},{0xb4,0x2b,0x6c,0x57,0xa7,0x8f,0x1d,0x90,0x09,0x0a,0x71,0x81,0xab,0x2a,0xe0,0x9f,0x42,0x6c,0xbc,0x2b,0xe9,0x6e,0xb2,0xcf,0x27,0xab,0xc7,0x0d,0x7d,0x32,0xa4,0xb3,},{0x19,0xdb,0xc3,0x02,0x7f,0x9f,0xae,0x70,0x7d,0xeb,0x76,0xf5,0x88,0xf9,0xfd,0x07,0xaa,0x8e,0xae,0x29,0xbd,0x4e,0x1d,0x04,0xc2,0xc9,0x84,0x38,0x82,0x86,0xb3,0xb1,0x22,0x24,0x8a,0x6c,0x03,0xed,0x67,0xec,0xa3,0x5d,0xf4,0xdb,0x3d,0xc1,0xe4,0x23,0x7f,0x26,0x78,0x92,0x51,0x84,0x97,0xd9,0x55,0x2a,0x21,0xde,0x19,0xb5,0x14,0x0f,},"\x27\xab\x30\x49\xb5\xc6\x35\x1f\x6c\xfe\x38\xb1\x3a\x05\x9f\x50\x37\x25\x7e\xe3\xd6\x5d\x60\x79\x65\x68\x56\xed\xc8\x76\xea\x08\x1f\xd8\xa9\x48\x04\x66\xf8\x83\x94\x78\x08\x84\x66\xf5\x1e\xcb\xfa\xf2\xd6\x5d\xef\x25\xf0\xc4\xdd\x8d\x08\x58\x82\x02\x81\x22\x32\xf5\x79\x45\xdf\x8a\x6f\xa1\x61\xed\x8c\x03\x43\xb5\x83"}, -{{0x30,0x22,0x97,0x5f,0x29,0x8c,0x0a,0xd5,0xdd,0xbe,0x90,0x95,0x4f,0x20,0xe6,0x3a,0xe0,0xc0,0xd2,0x70,0x4c,0xf1,0x3c,0x22,0x1f,0x5b,0x37,0x20,0xaf,0x4d,0xba,0x32,},{0xb8,0x45,0xbc,0xe3,0x8e,0x26,0xab,0x02,0x7b,0x82,0x47,0x46,0x3d,0x43,0x7a,0x71,0xbb,0xdd,0xca,0x2a,0x23,0x81,0xd8,0x1f,0xad,0x4c,0x29,0x7d,0xf9,0x14,0x0b,0xd5,},{0xae,0x14,0xa8,0x60,0xfa,0xd0,0x05,0x1b,0x3e,0xb7,0x2b,0x37,0x21,0xa8,0x2f,0x7b,0x95,0x46,0xb2,0x86,0x72,0x61,0xe2,0xb7,0xb6,0x38,0x97,0x9e,0x25,0x61,0xbd,0xeb,0x89,0xb6,0x00,0x76,0x8f,0x82,0x45,0x0a,0x66,0xc8,0xb0,0x48,0x12,0x83,0xfa,0x21,0xcb,0x6c,0x53,0xbd,0xe3,0x50,0xef,0xfb,0x68,0xa7,0xd1,0x11,0x4b,0xfd,0xb2,0x03,},"\x9a\xa1\x9a\x59\x5d\x98\x93\x78\xcd\xc0\x68\x91\x88\x7e\xf5\xf9\xc2\x46\xe5\xf8\x3c\x0b\x65\x87\x10\x67\x3e\x4e\x7d\xb7\x60\xc7\x63\x54\xc4\xf5\xd1\xe9\x0d\xb0\x4a\x23\xb4\xfb\x43\x4c\x69\x38\x45\x93\xd0\x10\xe3\x12\xb1\x1d\x29\x9c\x9f\x97\x48\x2d\xe8\x87\xce\xcf\xe8\x2e\xa7\x23\xbc\xa7\x9a\x1b\xd6\x4d\x03\xef\x19\xee"}, -{{0x0f,0x71,0x0b,0x6c,0x48,0x1f,0x71,0x44,0x95,0x89,0x75,0x33,0x12,0xef,0x64,0x93,0x2b,0x46,0x52,0xeb,0xe0,0xe0,0x75,0x97,0xf7,0xda,0x1c,0x4f,0x3d,0xcf,0xfb,0x80,},{0x69,0x73,0xff,0x29,0x32,0xcc,0xdd,0xfc,0x1d,0x16,0xc4,0xc0,0xda,0x50,0xc8,0xb2,0x9f,0xe6,0x45,0x2d,0x1e,0xe8,0x4d,0x52,0x06,0x4e,0xbf,0x3d,0x62,0x8d,0x40,0x3e,},{0x02,0xa8,0xd2,0x6a,0xee,0x11,0x42,0x0f,0xb4,0xf0,0x9d,0x11,0x63,0xe1,0x4b,0x86,0x7d,0xf7,0xc6,0xf6,0xc8,0xf8,0xdc,0x7a,0x78,0x03,0x46,0x59,0xf0,0x40,0x1c,0xad,0x0a,0xa9,0x03,0x97,0xef,0xdd,0x07,0x04,0xb7,0x98,0xdb,0x19,0x36,0x50,0x30,0x26,0xe2,0xa1,0xad,0xc2,0x97,0xe2,0x79,0x74,0xd4,0xbe,0x31,0x2a,0x37,0x53,0xf8,0x04,},"\x85\xd8\x57\x44\xad\x55\xe9\xef\x9a\x65\xca\x91\xe8\x5c\x8a\x4f\x80\xe4\xc5\x8f\x8e\x4e\x93\x54\xe8\x33\x98\x60\x98\xb7\xd9\xfe\x9f\xdc\x0d\xed\xb0\xd7\x5d\x25\x39\xfb\xa0\x00\x34\xfc\x0c\x2e\x84\x34\x4d\x1e\xda\xa0\x9d\x4f\x63\xd5\x54\x6d\x67\x80\x3d\xd6\xb5\x4d\xdc\xc0\xb1\xd3\xf2\x58\x2d\xd7\x52\x89\xe3\x1d\xe4\x2e\x69"}, -{{0x7a,0x05,0xf1,0x21,0xf6,0x01,0x12,0xdd,0x16,0xfe,0xe8,0xc9,0x1b,0xc2,0xa1,0x14,0x79,0xf4,0xb6,0x7e,0xe3,0x34,0x56,0x04,0x2c,0x8d,0xe1,0x67,0xfc,0x58,0x80,0x17,},{0xb3,0xb0,0x5b,0xe9,0x89,0xce,0xa7,0x19,0x75,0x05,0xd4,0xb5,0x43,0x35,0xe5,0xe1,0xd7,0x7a,0x4b,0x52,0xba,0x72,0x82,0x60,0x4b,0xbc,0x1c,0xf6,0xc4,0xe8,0x7a,0x6c,},{0xd3,0x0c,0xe8,0xa3,0x22,0xb4,0x50,0xa2,0xfb,0x1a,0xfd,0x32,0x9c,0xec,0x85,0x59,0xcc,0xf1,0x12,0xbd,0x83,0x96,0x5f,0x9e,0xc4,0x73,0x62,0x70,0xa0,0x91,0x4e,0x06,0x11,0x96,0xbf,0x52,0x09,0x77,0x8c,0x9f,0x8c,0xcf,0x39,0xc4,0x66,0x8b,0xbf,0x0e,0x13,0x63,0xf8,0x1a,0xfe,0x45,0xdd,0x74,0xe8,0x0d,0x58,0x75,0xdd,0xbf,0x6f,0x01,},"\xd9\xc5\x9e\x8c\xc4\xed\xe5\x37\xbe\x21\x22\xab\x49\x2a\x5b\x91\x5a\x9b\x0a\x11\x4b\x2a\xde\x35\x6f\xc0\x45\x7e\xf9\x87\x22\xd5\xf5\x67\xb8\x62\x11\xe2\x83\x69\xd1\x41\x68\xec\x4a\x3c\x80\x40\x76\xe1\x54\xad\xc7\x0a\x66\x8c\xf6\x4a\x20\xd1\x3c\xf1\x90\xd1\x15\xcd\x68\x8d\x03\x6e\x46\x93\x82\x51\xdf\x49\x64\xdc\x35\x17\xb1\x0c"}, -{{0xbf,0x38,0x1f,0x8d,0xfb,0x5d,0x0c,0x6d,0x64,0xe4,0x16,0xac,0x23,0xe0,0xd0,0xfc,0xb8,0x6e,0xbb,0x89,0x9b,0x1d,0x14,0x6a,0xbd,0x91,0x1b,0x92,0xa7,0x80,0x8e,0xb6,},{0x86,0x3f,0xad,0x8d,0x1f,0x1b,0xc6,0x30,0xa1,0x5f,0x6f,0xe8,0xec,0xef,0xe6,0xb4,0x49,0x7b,0x60,0xb2,0x1a,0xe8,0x83,0x0d,0xa4,0x67,0x42,0x04,0x5f,0xef,0x15,0x6f,},{0x99,0xb7,0x53,0x78,0x73,0x8f,0xca,0xc8,0x06,0x76,0x69,0xe8,0x50,0x9b,0x5d,0x26,0x07,0xe1,0xef,0x76,0xaf,0x90,0x04,0xe1,0x3f,0xe5,0xd3,0x93,0x2d,0xf6,0x0b,0x16,0x82,0x16,0xf5,0x85,0x65,0x34,0x0f,0xa4,0xd6,0x38,0x05,0x5a,0x89,0x04,0x4e,0xe7,0xd4,0x5e,0x2b,0xd0,0x82,0xa5,0x33,0x82,0x28,0x9a,0x34,0x70,0x06,0x48,0x98,0x0e,},"\x86\x54\xf2\xf5\xc6\xdc\xd2\xcf\xcb\xb6\xed\x8d\x2b\xc5\xfb\x5f\xec\x53\xe3\xef\xfb\x0d\xe6\x5a\xac\x50\x7f\xa5\x6c\x89\x77\x32\x39\x5a\xa0\x99\x46\xd3\xb6\x58\x6a\x92\xed\xd6\xdc\x99\x31\x5e\x1b\xa7\x4c\x6a\x02\x47\xc4\xba\x77\x60\xb9\x48\xeb\x3c\x09\x32\xd9\xfe\x1f\x0e\x9f\xea\x6e\xb6\x1a\x54\x8a\x9a\xb4\x8f\xfd\xf1\x54\x73\x29"}, -{{0x36,0x98,0x32,0x41,0xa0,0xa8,0xe6,0x0c,0xe0,0x2a,0x61,0xb3,0xfa,0xfa,0xb1,0x5a,0x73,0x13,0xa5,0xa2,0x70,0xd0,0x15,0xb9,0xc9,0xec,0x07,0x0d,0xc4,0x2d,0xee,0xda,},{0x66,0x47,0x98,0x4d,0x42,0xb9,0xa5,0xb3,0xb1,0xaf,0xa3,0xb7,0xf8,0xf4,0x9d,0x4c,0x2b,0x05,0xe3,0x89,0x84,0xe9,0x9c,0xea,0x8f,0xd6,0x82,0x35,0xd2,0xae,0x46,0x27,},{0xee,0x37,0xdf,0x8a,0xf4,0x22,0xf9,0x1f,0x85,0xdf,0xe4,0x3e,0xfe,0x79,0xf6,0x23,0x78,0x06,0x8c,0xcd,0xba,0xf3,0x91,0x6e,0xec,0xbc,0x3a,0xdf,0xed,0x05,0x08,0xbd,0xeb,0xaf,0x5c,0xe0,0x6b,0x3b,0xc2,0x79,0xf7,0x80,0x87,0xf0,0xdb,0x8d,0xb3,0xc6,0x82,0x3e,0xdf,0xb3,0x2c,0x12,0x21,0x78,0x30,0xbe,0x72,0x3d,0x88,0x72,0xb3,0x0c,},"\xce\xbb\x9e\x40\x44\x51\x81\x82\x53\xc0\x39\x2a\x45\x54\xee\x73\x23\xc5\xd5\xb8\xb2\x26\x77\x57\x00\xb8\x06\xed\x5b\x91\x33\x79\x16\xea\x7e\xcb\xc3\xd4\x10\x3f\xc6\x5e\x53\x72\xae\x7e\x5f\x9b\xa2\xd8\xf5\xae\xe2\x4c\xcf\x6e\x63\x1a\xe2\x0c\x4a\xf9\xb5\xf7\x28\xcd\xf8\x9e\x81\x89\xde\xf1\xa5\xb3\xd3\x53\x47\xaa\x20\x35\x25\xea\x1d\x2e"}, -{{0xd0,0x68,0x99,0xf9,0x3a,0x40,0x8d,0xac,0xb4,0x1c,0x96,0x97,0x18,0x34,0x6f,0x1e,0x28,0x9b,0xb5,0xea,0x65,0xe2,0x83,0xff,0x79,0xc7,0x05,0xa0,0x74,0x51,0x7c,0x35,},{0x46,0xbf,0x2a,0x08,0xa0,0x76,0xc4,0x7d,0x7f,0x11,0xb7,0x33,0xf8,0x14,0x1c,0x35,0x53,0x63,0xed,0x85,0xd7,0xde,0xf2,0x6b,0xa6,0xa0,0xce,0x15,0xac,0x5f,0x2b,0xe8,},{0x6f,0x89,0xde,0x92,0xa6,0x6b,0xc5,0xf4,0x14,0x43,0x39,0x12,0x49,0x50,0xbd,0xf5,0x88,0x14,0x4c,0xb3,0x72,0xf6,0x73,0x62,0x45,0x35,0x1c,0x94,0x76,0xbe,0xcc,0x59,0xa2,0x58,0xf9,0xa9,0x33,0xff,0xff,0x2b,0xef,0x4b,0x46,0xcd,0x10,0x57,0x39,0x52,0x25,0x79,0x9f,0xd0,0x9d,0xed,0xe6,0x82,0x3d,0xb0,0xe3,0x25,0xdb,0xc8,0x14,0x0d,},"\x08\x64\xc3\x9a\xc4\xfd\xa8\xeb\x90\x48\x59\x7b\xd4\x0b\xe0\x40\x10\x21\xfd\x2d\xd3\xa3\x39\x0a\x8f\xac\xce\x98\x4b\x26\x0a\x13\xfa\x2c\x7c\xfc\x00\xd1\x92\xfa\xdf\x13\x4a\x0a\xd5\xa1\x81\xee\x89\xef\xf0\xc7\x95\xea\xa0\xfb\xfe\x2f\x3b\x26\x11\x5d\x07\x16\x8d\xb4\x2e\xd2\x1a\x51\x30\x3b\x19\x58\xe4\xa4\x2d\xc0\x65\xb2\x2c\xe4\x8f\x17\xa6"}, -{{0xee,0xbc,0xa7,0x96,0x69,0x70,0xee,0x9f,0x2c,0xc4,0xd7,0x4c,0x6f,0x1d,0x8e,0x0e,0xbf,0xf7,0xc4,0x5a,0xeb,0xad,0x34,0x9f,0xb9,0xf8,0x6d,0xf6,0x28,0xdf,0xff,0x0e,},{0x89,0x10,0x1e,0x03,0x09,0xf7,0x67,0xe6,0x4a,0xe9,0xc9,0x8c,0x4a,0x5d,0x8d,0x23,0x28,0xfb,0x3e,0xf2,0x62,0xd0,0x82,0xf4,0x9b,0x64,0xca,0x20,0x9e,0x19,0x90,0xf6,},{0x7d,0x44,0x7e,0xe5,0x32,0x8c,0x9f,0xe7,0xf1,0x19,0x36,0xcc,0x42,0x99,0x87,0x54,0xa5,0x6c,0xd1,0xd2,0xa6,0x95,0x1a,0xf4,0xfe,0xe7,0xc4,0xa8,0xeb,0x31,0x9d,0x49,0x23,0x70,0x7c,0x79,0x3c,0x55,0xd7,0x90,0x67,0xf8,0x22,0xd5,0xb1,0x6b,0xb5,0x77,0x6e,0x38,0xdf,0xfa,0xbc,0x67,0x23,0x7a,0x91,0x6a,0x81,0xa6,0x33,0x39,0xb0,0x03,},"\x0f\xac\x79\x0a\xdb\x9f\x59\xe5\xcb\x0d\xdc\xb2\xb6\x67\x17\x2f\x2a\x21\x03\x4d\x93\xbc\xad\xdf\x18\x86\x06\xfa\x9e\x77\x6d\xb3\x3a\x8f\xcc\x6b\xd7\xf5\x56\x78\x83\xfc\x0d\xe3\x51\xaa\x9a\xfa\xa3\x6d\x20\x75\xb1\xba\x85\x3b\xad\xa8\x49\xb8\x66\x1d\x5c\x81\x54\xe7\xb0\xaf\xea\x65\x6d\xd1\x5e\x01\xa9\xc5\xba\x21\x58\x9b\x02\xf8\xfc\x54\x81\xc2"}, -{{0x38,0x20,0xb6,0xb1,0x59,0x39,0xd0,0xaf,0xe1,0x8c,0x9c,0xb3,0xd9,0xa2,0xa0,0x8f,0x16,0x7d,0xd4,0x58,0xeb,0x6c,0x7e,0x3f,0x15,0x58,0xb0,0xc6,0xdb,0x4c,0x68,0x90,},{0x80,0xb8,0x5c,0x65,0x59,0xfe,0xa8,0xb4,0x00,0xe1,0x99,0x9c,0xc5,0xbf,0xed,0x50,0x7a,0xd7,0xfc,0x29,0x4c,0xd9,0xba,0x0c,0xe2,0xdd,0x25,0x84,0xa9,0x10,0x89,0xb0,},{0x82,0x3e,0xe2,0xc0,0xc8,0xd8,0x7f,0xaa,0x0e,0xc0,0x14,0x1e,0x9c,0xe0,0x8b,0x51,0xe5,0x7c,0x83,0x97,0x92,0xd1,0xfb,0xd9,0x7a,0x96,0x72,0x07,0xfd,0x41,0x58,0x49,0xeb,0xfb,0x5d,0xad,0xb5,0xa1,0xdc,0x2c,0x0a,0x8b,0x7f,0xc6,0x3f,0xc3,0x54,0x85,0x7b,0x8c,0x90,0xc4,0x47,0x20,0xe1,0x3f,0x45,0xcd,0x01,0xe7,0xaa,0x23,0x14,0x0c,},"\x3e\x5a\xd9\x2d\x44\xb4\x0e\x86\x14\xd8\x08\x7c\x9c\x74\x3d\xe0\xc0\x86\x1a\x07\xf1\xf5\x14\x6d\x71\xca\xc2\xf3\x74\x00\x24\xe8\x41\xcc\x2d\x46\x02\x7c\xf5\xd2\x61\xd3\xee\x7c\x18\x75\xb3\x95\x51\x01\x7b\x5f\xb1\x46\x81\x14\xfc\x3e\x09\x8a\x89\x9c\xdb\xd5\x58\xb3\x9f\x09\x8e\x15\x6b\x6e\x98\x01\xeb\xcd\xd6\x5f\xed\x56\xdb\xfc\xaf\x2c\x8c\x78\x7b"}, -{{0x0d,0x20,0xfa,0x4a,0x37,0xff,0x30,0xc4,0xdc,0xc3,0xe4,0x4e,0xa7,0xac,0x50,0x11,0x37,0xe5,0x80,0x7e,0x97,0x81,0x33,0x0a,0xc3,0x10,0x98,0x2c,0xc3,0xd3,0x9d,0xbd,},{0x67,0xbb,0x0a,0x01,0xbc,0x86,0x17,0xb4,0x91,0xef,0xf1,0xa3,0x26,0xc1,0xc7,0x0f,0x7d,0x0c,0x5b,0x95,0xa5,0xad,0x48,0x24,0x1a,0xed,0xce,0x1c,0x6f,0x08,0x83,0xcf,},{0xde,0xab,0x12,0xed,0x82,0xba,0x94,0xb4,0x69,0xca,0x98,0xb6,0x6f,0xa2,0x04,0x44,0xb4,0xb7,0x88,0x1c,0x4f,0x0f,0x85,0x34,0x09,0xc9,0xa1,0x50,0x4a,0x5b,0x2b,0x6d,0x78,0x60,0xf2,0x6a,0xda,0x6b,0xf7,0x34,0x59,0xb9,0xcd,0xb5,0x73,0xc8,0x01,0x71,0x21,0x33,0x8e,0xfa,0x60,0xf4,0x14,0x80,0x86,0xd7,0xa3,0xa8,0xed,0x59,0xbb,0x07,},"\x35\xe0\xf4\xb4\xa5\x17\xf9\xc7\xaa\x45\x14\xf0\x3e\x6d\x65\xf1\x9b\x27\xc6\x2c\xc0\x69\xf6\xbf\x07\xdd\x63\x78\xbd\x6a\xfe\x2b\x76\x65\x60\x00\x6c\xbd\x57\x30\xa0\x09\x19\xed\x11\x19\x1f\xb0\xc8\xda\xc5\x6e\x15\x3f\xc1\xce\xa4\xbd\xce\x50\x46\xcc\xcb\x71\x77\x59\xa4\x08\x3e\x1c\x16\xf7\x40\x76\x32\x64\xcc\x80\x4d\xe0\xd0\xe1\xa4\xb5\xa2\x30\x67\xaf"}, -{{0xbe,0xe1,0x61,0x88,0x1d,0x81,0x9b,0x37,0x0d,0x24,0x0d,0x50,0x9b,0xa4,0x6b,0x06,0xfb,0x82,0x8e,0x20,0x31,0x0d,0x9f,0x6b,0x30,0x97,0x80,0x70,0x3e,0x98,0x92,0x7b,},{0x10,0x85,0x43,0x80,0xde,0x89,0x16,0x2b,0xfb,0x9f,0x78,0x35,0xa2,0x71,0x6a,0x3a,0x6e,0x02,0x65,0x67,0x1b,0x25,0x0b,0x38,0x9d,0x01,0xc3,0xbc,0xc0,0x37,0x36,0xb8,},{0xb0,0x7d,0x07,0x2e,0xb3,0x83,0x1f,0xae,0x8a,0x06,0xef,0xfa,0x92,0x01,0x79,0x74,0x96,0xdc,0xe1,0x26,0xb8,0xe1,0x1f,0xef,0x2f,0xa0,0x7f,0x66,0x4d,0xc5,0xcf,0x3d,0x4b,0xf9,0xc3,0x8a,0x8b,0x3c,0x09,0xfb,0x5f,0x14,0xfa,0x2d,0xeb,0x21,0x9e,0x7d,0x85,0x2f,0xdd,0x27,0xc7,0xba,0x32,0xd3,0x09,0x94,0x2f,0x27,0x46,0xdf,0xe4,0x04,},"\x5a\x6f\xe5\x99\xb6\xb0\x9b\x05\xc0\xba\x6a\x62\x2d\xf3\xa9\x2b\x3d\x37\x6d\x24\xd0\x4e\xa8\x5e\xbe\x76\x7b\xc2\xec\x4d\x14\xe8\x3e\x69\x37\xdc\x0b\x91\x4b\x48\x09\xfd\xb6\x07\x90\x68\x41\xa6\xfd\x1d\xcd\xf6\x1a\xae\xa8\xf9\xbb\x81\xb2\xcc\xaa\x32\xdf\x41\x29\x89\xae\x53\x64\x66\x80\xa7\x1a\x21\x1c\x84\x40\xea\xb0\xf1\xae\xc5\xe4\xfc\x00\xe6\xa2\xc9\x6d"}, -{{0x70,0x15,0x0e,0x95,0x16,0x16,0x4a,0x3d,0x7b,0x7e,0x8b,0x6f,0x25,0x5b,0x65,0xca,0xc9,0xf0,0x74,0x59,0xb3,0x2d,0x11,0xbb,0x94,0xb3,0xd2,0x77,0x20,0x8a,0xbc,0x99,},{0x23,0x28,0xbe,0xc8,0xe4,0x03,0x51,0x04,0x78,0x82,0xe8,0xb4,0x3b,0xc1,0xab,0x08,0x53,0x86,0xfa,0x47,0x98,0x7e,0x46,0xea,0x87,0x60,0x88,0x14,0xc5,0xda,0x71,0x3c,},{0xed,0xa3,0xf5,0x03,0x3e,0xa7,0x95,0x3a,0x0d,0x58,0x3c,0x64,0x57,0x52,0x2e,0x84,0xad,0x78,0x44,0x53,0x04,0xd4,0x8e,0x57,0x7d,0x4d,0x69,0xe8,0x64,0x1f,0xeb,0xe1,0x52,0x48,0xd8,0xd9,0x0c,0xe0,0x94,0x4a,0x8f,0x80,0x1d,0x39,0x09,0x9b,0xc7,0x74,0x94,0xba,0xc4,0xce,0x2a,0x20,0xb3,0x83,0x69,0xc6,0xad,0xfb,0x71,0xe0,0x3d,0x0f,},"\x77\xbe\x8e\xce\xaa\xb4\x31\xa1\x3c\x2a\x28\xd0\xd1\x55\x64\x89\xd8\xc3\x92\xfd\x7a\xe4\x11\x57\xf7\xca\xf0\x82\xcb\x54\xe4\x5f\x08\x62\x6b\xe0\x07\x6b\xe8\x44\xd3\x8f\xde\x90\x1a\x5e\xab\x0e\x88\x32\xd6\x9d\xac\x22\xfb\x85\x07\xfb\x8e\xc4\xfa\xf7\xc8\x8f\xd2\x6d\xa3\x08\x46\x1a\xfe\x38\x59\x87\x97\x2b\x5e\x76\x0a\x34\xa5\xe1\x8b\x9a\x82\xb4\xaa\xa5\x29\xb7"}, -{{0x3f,0x87,0xfc,0xfd,0xb4,0x21,0x42,0x2a,0x9c,0x5f,0xb9,0x82,0x68,0x31,0x3c,0x15,0x12,0x8c,0x78,0x84,0x4e,0xf9,0xeb,0x3b,0x37,0x13,0xfa,0x77,0xb6,0x71,0x89,0x03,},{0x53,0x3e,0xc5,0x92,0x28,0x37,0x4b,0xd0,0x3a,0x46,0x99,0xe3,0xa8,0x89,0x6b,0x86,0x18,0x2f,0xcf,0x8f,0xc3,0x08,0x5f,0xdb,0x8f,0x5c,0x46,0x71,0x52,0x4d,0x6f,0xe0,},{0xf6,0x51,0x9d,0x7e,0xdb,0x61,0x34,0x11,0x19,0x74,0x03,0x3f,0x03,0xb8,0xd8,0x9e,0x9c,0x76,0xca,0xec,0x89,0x65,0xa8,0xe1,0x7c,0xd4,0x5f,0xff,0x19,0xde,0x26,0x15,0xd7,0x3e,0xcc,0xdb,0x4a,0x66,0x64,0xa8,0xf0,0xe2,0x3a,0xdf,0x98,0x98,0x8e,0x96,0x25,0x1b,0xf2,0x6e,0xb7,0xa4,0xcc,0xaa,0xc1,0x07,0x9f,0x0a,0x77,0x2f,0x9b,0x05,},"\xc0\x0f\xed\x2d\x68\x94\x68\xbc\xba\xcc\xcd\x44\x6e\x8d\x8f\x29\x9e\x2a\x86\x92\x5e\x62\xe5\x97\x09\xaf\xaf\x48\x57\x46\x9f\xf1\xe0\x06\xd0\x0f\xa3\xe1\x8a\x36\x15\xf8\xf0\x6b\x6e\xbd\xff\x78\x5d\xde\x58\x85\x1d\x2c\x23\x90\x38\xa0\xc3\x44\xdc\xe9\x85\xbd\x1f\xc8\xde\xb4\x77\x9a\xe5\xf8\x93\x2e\x2f\x9e\xd5\x99\x0b\x64\x72\xdb\xe4\xe6\xfe\xf6\x91\x76\x57\xe0\xb5"}, -{{0x44,0xce,0xef,0x04,0x4f,0xf9,0x98,0xd4,0xab,0xea,0xaf,0x37,0x4e,0xb4,0x1d,0x08,0x67,0x18,0xb6,0x30,0x97,0xb1,0xe3,0x5f,0x89,0x63,0x4c,0x14,0x89,0x71,0x32,0xea,},{0xe8,0x3c,0x86,0x67,0x7d,0x03,0xed,0x3a,0x5e,0x8c,0x95,0xf4,0x1f,0x0b,0x32,0x5f,0xf4,0x33,0x37,0x02,0xf2,0xff,0x69,0x36,0xf5,0x7f,0xf3,0x0a,0xa3,0x14,0x85,0xc7,},{0x55,0x45,0x52,0xd6,0xb7,0x90,0xd4,0x21,0xd0,0x6b,0x0a,0x67,0xf8,0xe0,0x02,0xad,0x7a,0x1e,0xd0,0x1c,0x06,0xcf,0x00,0xcb,0xea,0xec,0x2a,0x26,0x8b,0xda,0x29,0xf1,0x18,0x3f,0x0c,0xea,0xfc,0x62,0x5f,0xa5,0xfd,0xb8,0x47,0xdc,0x86,0xfa,0xe1,0xa2,0x04,0x06,0xe4,0x59,0xd4,0xa0,0x17,0x7c,0xb5,0x15,0x22,0x0a,0x56,0x8e,0x08,0x00,},"\x8d\x3e\x2d\xec\x46\x44\xc7\xb5\x16\x33\xb1\x3e\x63\x75\xca\x42\xff\x91\x38\x46\x5f\x43\xd7\x80\x0c\x73\x13\x19\x9f\x67\xc9\xcf\x1b\x52\x0b\x18\x20\xbd\x63\x0e\xcf\x1c\x99\x2e\x27\x67\xb3\x8e\xb5\xbb\xc4\x41\xa4\xab\x8d\x31\x7d\xb4\x41\xdb\x35\xa0\xfe\x3a\xbe\x7a\x9e\x45\x41\x88\x1c\x2d\x7b\x1a\x26\x12\x30\x69\x59\x81\x5d\x1d\xa4\x12\x67\xd9\x64\x9d\xd4\x49\x4a\xce"}, -{{0x98,0xef,0x2a,0x44,0xd4,0xc8,0x47,0x6d,0xff,0x05,0xaa,0x78,0xdc,0xf9,0xc6,0xdc,0x08,0x6c,0xb2,0xf6,0x22,0xa0,0x67,0x45,0xd6,0x0c,0xbf,0x22,0x3f,0xaa,0xba,0x66,},{0x42,0xfd,0xb1,0xda,0xa3,0x9f,0x01,0x59,0x11,0x9b,0xee,0xc1,0xbe,0xdf,0x6f,0x03,0x94,0xb2,0x6a,0x2a,0x29,0xbd,0x1f,0xde,0x08,0x1e,0xcc,0xda,0xde,0xcc,0x22,0x6a,},{0xab,0x5e,0x87,0x24,0xa3,0xe6,0xff,0x76,0x05,0x8c,0xfb,0x21,0x4d,0x57,0x4e,0x04,0xd0,0x55,0x74,0xec,0xdd,0x4f,0xfe,0x8c,0x07,0xc7,0xaf,0x39,0x6e,0x88,0x26,0x87,0xc5,0xd7,0x9e,0xf1,0xe6,0x2f,0xbb,0x4c,0x5f,0x1b,0xd0,0x6b,0x9b,0xd8,0x97,0x82,0x6e,0xdd,0xe0,0xd1,0x11,0xd9,0x18,0xe8,0xef,0x96,0x1f,0xf2,0xa0,0x0d,0x77,0x00,},"\xc8\xb5\xfc\xfc\x3c\x18\xc7\xd9\x59\x57\xb6\x68\xe9\x1c\x73\x1d\x50\xc7\xfc\xea\x4f\x95\x75\xbb\xf7\x84\x62\x58\x70\xe2\x38\xdf\x54\x6e\x2c\xb1\xa1\x9d\x28\x08\xdd\x5b\x23\x0d\x38\x71\xfd\xec\x16\x10\x0e\xe1\xfb\xf9\xb7\x22\xfa\x37\x44\xa7\x50\xa3\xb3\x96\xb0\x5f\x9c\x21\xb8\xc0\xf6\x1e\xad\x57\xa7\x8c\x5e\xcf\x72\xb5\x79\xcf\xe8\x8a\x3f\x40\x4c\x8a\xcf\x52\x4f\x9a\xb9"}, -{{0x93,0xa8,0xc7,0x92,0xa2,0x39,0xc9,0x31,0x91,0x7c,0x11,0x48,0x24,0xa0,0x17,0x4f,0x8b,0xc4,0xeb,0xbf,0x98,0xaf,0x8c,0x7e,0x32,0x1e,0x0f,0x5b,0xea,0x40,0x15,0xec,},{0x9b,0x2e,0xaa,0x8a,0x9c,0x2c,0x25,0xff,0x4f,0x6e,0x13,0xbb,0x12,0xba,0xe5,0xd0,0x6f,0xda,0x0e,0xb1,0x10,0x5f,0xaf,0xae,0x58,0x80,0xff,0x16,0x87,0x40,0xbb,0x74,},{0xcf,0xe3,0x2c,0x44,0x35,0xd9,0x11,0xd7,0x72,0xdc,0x07,0x27,0xe7,0x8d,0x68,0x9d,0x01,0x64,0xc5,0x06,0x95,0x97,0xcb,0x44,0x1b,0x22,0xc1,0xd2,0x62,0x36,0x47,0x9f,0x1a,0xfd,0x70,0x89,0x12,0x1b,0x9a,0xb4,0xf6,0x1b,0xbb,0x1f,0xae,0x1a,0xb4,0x2f,0x76,0x35,0xa9,0x2a,0x53,0x78,0x4d,0x71,0x70,0x91,0x6b,0x70,0x3a,0xa5,0xcc,0x09,},"\x90\x1b\xf4\xe0\x41\xca\xf1\x6e\x04\xf2\xff\xde\x8d\x6f\xe9\x7e\x93\xd0\x90\x0f\x6b\xc0\xfc\x09\xa9\xa0\x17\x9d\x13\x7b\x4b\x77\x88\xe5\x7e\xb9\x27\x66\xa9\xc6\x34\xf3\x5a\xdb\x5c\x29\x88\xaf\x1e\x86\x20\x8f\x46\x19\x98\xf5\x9c\xfe\xc9\x92\x04\xb4\x84\xfb\xca\xd3\x95\x1e\x7e\xe4\x40\x55\x23\x70\x5d\x97\x39\xb4\x43\x07\xdb\x03\xf7\x13\xfd\xa7\x8d\xb4\x21\xef\x31\x21\xb3\xba"}, -{{0x70,0x01,0xfa,0x0c,0x44,0x04,0xc2,0x8a,0xa5,0xb5,0xfc,0xff,0x30,0xa9,0x61,0xf2,0x1a,0x22,0xf5,0xb8,0x5a,0x9e,0x38,0x2e,0x07,0xae,0xa8,0xa8,0x92,0x4d,0x0e,0xc1,},{0xda,0xeb,0xb6,0x3c,0x4d,0x8f,0x40,0xce,0xba,0x8e,0xc3,0x5e,0x3d,0xd9,0x46,0xa6,0xb7,0x5b,0xc7,0x4f,0xcb,0x29,0xad,0xe7,0xb5,0x5e,0xee,0x3c,0xc3,0xae,0xa5,0xca,},{0x64,0xea,0xc9,0xce,0x87,0x46,0x06,0x18,0x63,0x6b,0x41,0xfd,0x2d,0xec,0xc1,0x67,0x3b,0xfc,0x48,0xc5,0xf4,0x79,0xdf,0xac,0xb5,0x1e,0x86,0x68,0x64,0x07,0x37,0x4b,0x1d,0x10,0xbf,0x65,0xd6,0xd7,0x47,0x42,0x14,0xd7,0x77,0x0c,0x9e,0x5c,0x7f,0x80,0x6c,0x80,0xd5,0x3d,0x48,0xb7,0x20,0x87,0x0e,0x5e,0x78,0xf3,0x2e,0x3a,0x7e,0x05,},"\x44\xf4\x8c\xfb\x02\xf0\x87\x77\xa5\x78\x73\x85\x5f\x96\xbe\x4c\x02\x91\x32\x3f\x27\x39\xb2\x75\xd9\x07\x57\xa1\x54\x72\xe5\x75\x04\x36\xe0\x10\x74\x08\xfe\x30\x26\xc0\x06\x25\x68\x99\x83\xf9\x90\xeb\xa9\xbe\xcb\xfc\xe4\x03\xcc\xd5\x63\x56\xad\x27\x41\xfd\x21\x44\x5d\xfb\x23\xd7\x61\x12\xe5\x78\xb3\x39\x5c\xf9\xd9\x60\x95\x5f\x1d\xa8\xf3\x99\xca\x28\x6f\x21\x39\x0e\x25\xa5\x9a"}, -{{0x3a,0xdc,0xe3,0xa3,0xd3,0xfb,0xc9,0x77,0xdd,0x4b,0x30,0x0a,0x74,0x74,0x9f,0x13,0xa3,0xb0,0x4a,0x5d,0x73,0xa2,0xcd,0x75,0xa9,0x94,0xe3,0x19,0x5e,0xfe,0xbd,0xac,},{0x6f,0xf1,0x9b,0x1f,0x18,0xd6,0x48,0x51,0xd5,0xc7,0x48,0x45,0xc6,0x40,0x7f,0x0b,0xf5,0x96,0xa5,0x2e,0x38,0x5e,0x02,0x01,0x27,0xe8,0x3e,0x54,0xcf,0xf5,0xac,0x19,},{0x7d,0xda,0x89,0xf8,0x5b,0x40,0x53,0x9f,0x5a,0xd8,0xc6,0xde,0x49,0x53,0xf7,0x09,0x4a,0x71,0x5b,0x63,0xdd,0xa3,0x0e,0xc7,0xcf,0x65,0xa7,0x85,0xce,0xae,0x5f,0xc6,0x88,0x70,0x7e,0xe0,0x0b,0xe6,0x82,0xce,0xcb,0xe7,0xee,0x37,0xd8,0xfc,0x39,0xee,0x6d,0x83,0xc6,0x44,0x09,0x68,0x17,0x08,0xa0,0x89,0x8a,0x18,0x3b,0x28,0x8a,0x06,},"\xfe\x6c\x1a\x31\x06\x8e\x33\x2d\x12\xaa\xb3\x7d\x99\x40\x65\x68\xde\xaa\x36\xbd\xb2\x77\xce\xe5\x53\x04\x63\x3b\xd0\xa2\x67\xa8\x50\xe2\x03\xbb\x3f\xab\xe5\x11\x0b\xcc\x1c\xa4\x31\x66\x98\xab\x1c\xf0\x0f\x0b\x0f\x1d\x97\xef\x21\x80\x88\x7f\x0e\xc0\x99\x1e\x8c\x11\x11\xf0\xc0\xe1\xd2\xb7\x12\x43\x3a\xd2\xb3\x07\x1b\xd6\x6e\x1d\x81\xf7\xfa\x47\xbb\x4b\xb3\x1a\xc0\xf0\x59\xbb\x3c\xb8"}, -{{0x14,0x80,0x3c,0x1f,0x23,0xa4,0x7f,0xcd,0xd3,0x5e,0x5d,0x14,0x6e,0x20,0xca,0x63,0x0c,0xd7,0x12,0xc0,0x47,0xd5,0x33,0x0b,0x65,0x2e,0x31,0x85,0x7a,0xcb,0xc9,0xe8,},{0x36,0xf2,0xd5,0xbd,0x6d,0x83,0x24,0xfa,0x6e,0x9d,0xb7,0xf7,0xd8,0x54,0xeb,0xe4,0x8c,0x0e,0x62,0x99,0x99,0x81,0x22,0xe9,0xd4,0x4b,0x8a,0xdb,0xef,0x54,0xf0,0x93,},{0x07,0xa7,0xde,0x6c,0xe9,0x76,0x64,0xb3,0xea,0x09,0x28,0xe1,0x38,0x5c,0x33,0x09,0xbe,0x08,0xa4,0x7c,0xbf,0x4d,0xaa,0x91,0x86,0xa1,0xb9,0x48,0xc8,0x6f,0xbb,0xa3,0x9c,0x4e,0xfc,0xfc,0xb7,0xa0,0xa3,0x86,0x6b,0xc9,0x4c,0x67,0x88,0xff,0xe6,0xbe,0x0d,0x49,0x72,0xe5,0x6d,0x0c,0x32,0x92,0xd1,0xcc,0x6e,0x25,0x44,0x7b,0x99,0x04,},"\x55\x59\x83\x67\x9d\x02\x6e\x53\x54\xb4\xcc\x05\x5a\xe1\xbc\x14\x65\x3c\x72\x81\xec\x72\x23\x72\xf3\xfe\xb7\x78\xe8\x41\xda\x82\x1b\x3d\x0b\x8e\xe7\xa9\xa9\x12\x9e\xa0\x68\x24\xbe\x83\x79\xfb\xbd\xcb\x07\x48\xf4\x23\x72\x1c\xcb\x17\x2a\x1b\xaf\xa1\xd5\xae\x9f\xc1\xc5\x1e\x93\xd4\x1d\xd5\x51\xc3\x08\x60\x79\xb6\x20\x28\x6c\x1c\x40\xc1\x22\x3b\xbc\xbb\x76\x72\x2e\x92\xca\x21\xd8\x41\x0a"}, -{{0x1a,0x61,0x15,0x4d,0x34,0x72,0xcd,0x96,0xb3,0x28,0xee,0x67,0x4b,0xeb,0x4f,0xc8,0x67,0x63,0xa9,0x69,0xfb,0x41,0x04,0x94,0xe0,0x67,0x84,0x14,0xe3,0x1a,0x46,0xa6,},{0x75,0x76,0xd9,0x3a,0xc8,0x5d,0x0f,0xc6,0x1f,0x25,0x8c,0x55,0xcf,0x90,0xbd,0x87,0xa6,0x35,0x09,0x9c,0x0e,0x81,0x0e,0xd0,0xb9,0x37,0x25,0x8d,0x13,0xb4,0x25,0x59,},{0xad,0xa1,0x66,0x6c,0x9c,0x3b,0x82,0x84,0xb8,0xa2,0x1c,0x4f,0x26,0x18,0xef,0x08,0x08,0xa6,0x46,0xf3,0xf1,0x09,0x41,0xe4,0x70,0xf7,0x38,0xe1,0x78,0x5e,0x2d,0xe9,0xfd,0xd9,0xc8,0xcb,0x52,0x6f,0x94,0x5c,0x7a,0x8c,0x69,0x94,0xf1,0x51,0xb7,0xd0,0x66,0x58,0x1b,0x1d,0x75,0x53,0x07,0x94,0x7c,0x62,0xbe,0xfc,0x8a,0xb7,0x07,0x0f,},"\x64\xc5\x65\xef\xbc\xb8\xb9\x52\x8e\xd4\x72\x53\xf3\xc6\xa4\x03\x5d\xb7\x81\xd6\xf0\x97\x6b\x5e\x5b\xa8\x44\x7d\x4e\xd5\x4b\x04\x10\x52\x93\xef\x4c\x00\x0d\x8b\x2e\x1b\x5b\x75\xe7\x27\xe5\xd2\xa0\x77\x74\x3b\x50\xd1\x83\xb4\x91\x76\x48\x01\xa2\x50\x4d\x16\xee\x6d\x7d\x8a\xc4\xfe\x40\xe6\xbf\xc2\xa8\x12\x9c\x72\x85\xa5\xac\x69\x1c\x35\xe6\x42\xed\x16\x2c\xf7\xfb\xc6\x45\x16\x73\x3a\x23\xb3"}, -{{0xf2,0x15,0xd3,0x4f,0xe2,0xd7,0x57,0xcf,0xf9,0xcf,0x5c,0x05,0x43,0x09,0x94,0xde,0x58,0x79,0x87,0xce,0x45,0xcb,0x04,0x59,0xf6,0x1e,0xc6,0xc8,0x25,0xc6,0x22,0x59,},{0x1e,0xd5,0x06,0x48,0x5b,0x09,0xa6,0x45,0x0b,0xe7,0xc9,0x33,0x7d,0x9f,0xe8,0x7e,0xf9,0x9c,0x96,0xf8,0xbd,0x11,0xcd,0x63,0x1c,0xa1,0x60,0xd0,0xfd,0x73,0x06,0x7e,},{0xcb,0xef,0x65,0xb6,0xf3,0xfd,0x58,0x09,0x69,0xfc,0x33,0x40,0xcf,0xae,0x4f,0x7c,0x99,0xdf,0x13,0x40,0xcc,0xe5,0x46,0x26,0x18,0x31,0x44,0xef,0x46,0x88,0x71,0x63,0x4b,0x0a,0x5c,0x00,0x33,0x53,0x41,0x08,0xe1,0xc6,0x7c,0x0d,0xc9,0x9d,0x30,0x14,0xf0,0x10,0x84,0xe9,0x8c,0x95,0xe1,0x01,0x4b,0x30,0x9b,0x1d,0xbb,0x2e,0x67,0x04,},"\xfb\xed\x2a\x7d\xf4\x18\xec\x0e\x80\x36\x31\x2e\xc2\x39\xfc\xee\x6e\xf9\x7d\xc8\xc2\xdf\x1f\x2e\x14\xad\xee\x28\x78\x08\xb7\x88\xa6\x07\x21\x43\xb8\x51\xd9\x75\xc8\xe8\xa0\x29\x9d\xf8\x46\xb1\x91\x13\xe3\x8c\xee\x83\xda\x71\xea\x8e\x9b\xd6\xf5\x7b\xdc\xd3\x55\x75\x23\xf4\xfe\xb6\x16\xca\xa5\x95\xae\xa0\x1e\xb0\xb3\xd4\x90\xb9\x9b\x52\x5e\xa4\xfb\xb9\x25\x8b\xc7\xfb\xb0\xde\xea\x8f\x56\x8c\xb2"}, -{{0x8c,0x9f,0x95,0x08,0x30,0x75,0xa4,0x3f,0xe4,0x26,0xd1,0x9f,0x1e,0x87,0x71,0x9b,0x40,0x04,0x3d,0xe8,0x8e,0xb0,0xee,0x97,0x1f,0x70,0xe1,0x0c,0x76,0x94,0xce,0x4e,},{0xe9,0x1d,0x16,0x7a,0xa3,0xeb,0xc2,0x3e,0x70,0xaa,0xb4,0x5d,0xab,0xe9,0x05,0xe4,0x16,0x26,0x2f,0x91,0x0e,0x2a,0x95,0x5d,0xd8,0x61,0x9e,0xfc,0x74,0xc2,0x4e,0x85,},{0xca,0xc5,0x55,0x22,0x2d,0xaf,0xec,0x76,0xa0,0xb4,0x7b,0x9d,0x2c,0x58,0x6b,0x3b,0x3b,0x9b,0x3b,0x9c,0x83,0x64,0xbe,0xb3,0xca,0xe1,0xe8,0xdd,0x7f,0x1a,0xe9,0xdd,0x74,0xf2,0x2b,0x8d,0xd4,0xad,0x2b,0x29,0x0f,0x81,0x35,0x1a,0x41,0x5a,0x99,0xf0,0x30,0xf1,0x07,0x78,0xbe,0x4c,0xda,0x85,0xd1,0xd3,0x53,0x33,0x1e,0x70,0xf1,0x09,},"\xb6\x9d\x70\xe8\x60\xf5\x5c\x42\x7e\xf2\xa7\x1d\xf3\x6e\x05\xbb\xc4\x3b\xb2\xe0\x64\x63\xaa\x5d\xe3\x44\x19\xc6\xa6\x14\xee\xa6\x69\x53\x35\xa8\x75\x26\xc1\x22\x64\x88\xd8\x42\x89\x1d\x05\x74\xdf\x34\x3c\x9c\x1e\x17\xae\xd6\x95\x8e\xce\xe8\x74\x74\x22\x1e\xb7\x7a\x59\x9e\xcb\x05\x93\x44\xc0\xd0\x52\xc0\x00\x2a\x66\xe5\xa6\x01\x31\x85\xaf\x69\xa0\x1b\xa5\xdb\xc6\x60\xd3\x6c\xae\x23\x5f\x67\xfe\x0e"}, -{{0xd7,0xeb,0x1f,0xba,0x42,0x4f,0xee,0xd1,0x00,0x77,0x7e,0xed,0xb4,0x87,0x4b,0xf2,0x08,0x10,0xad,0x68,0x6b,0x67,0xe3,0x1d,0x27,0xec,0xf6,0x10,0x60,0x9a,0x33,0xf5,},{0xa2,0x5a,0xcb,0x11,0xa6,0xc8,0x25,0x71,0x3a,0x08,0x5f,0xa7,0x54,0x69,0x28,0x86,0xa8,0x7d,0x07,0xfb,0x9b,0xe1,0xa5,0x3e,0xb9,0x61,0x72,0x8b,0xb6,0x6c,0x90,0x60,},{0x2b,0xf7,0x19,0x68,0x2b,0x07,0xcc,0x5e,0xcc,0x04,0x80,0xf3,0x7e,0x9d,0x12,0x3f,0xf6,0xf4,0x4c,0x26,0xe6,0x95,0x8e,0x59,0xf0,0x80,0x46,0x6f,0x9c,0xd3,0x73,0xa1,0x65,0x00,0xda,0xf1,0x23,0xdc,0x3f,0x13,0x34,0x77,0x4b,0xfc,0x9f,0xa8,0x45,0x03,0xb1,0x6d,0xbf,0x21,0xa8,0x15,0xc1,0xad,0xa6,0xeb,0xef,0x49,0x20,0x46,0x17,0x02,},"\xa1\xd0\xf8\x1e\x3d\x59\x08\x9c\xc2\xb1\x9e\x07\xd2\xfc\xe4\x3d\xb4\xcf\x17\x1f\xaa\x64\x2f\x3b\x0b\xbd\xe7\x7a\xe3\xd5\x3a\xf5\xc0\x2b\xf8\xfc\x12\xff\xb4\xe5\x7f\x7c\x8a\x01\x5d\x6c\x2d\x17\x89\x44\xfa\xe9\xf7\xc8\xfc\x96\x9d\x4b\x77\xbe\xa5\x18\x76\xae\x99\xd5\x9e\x94\xad\x24\x56\xe0\xed\x72\xc5\x2c\xf4\xe5\x34\x0d\xa1\x7c\x44\xdb\xff\x86\x45\x7a\x51\x9b\x6f\xff\xe2\x69\x06\x62\x90\xd6\x29\xfe\x69"}, -{{0x4f,0x6a,0xeb,0x35,0xfc,0xe1,0x4f,0xbc,0xbb,0x9a,0xa8,0xa4,0xf6,0x45,0x1b,0xf9,0x5b,0x98,0xdf,0x04,0x7f,0xa8,0xc4,0x3f,0x1e,0xad,0x3b,0x40,0x4d,0x3f,0x92,0x8f,},{0xbf,0x66,0xa9,0xed,0xd0,0x94,0x81,0xdb,0x84,0x44,0xa1,0x76,0xc8,0xce,0x05,0x78,0xd2,0x93,0x4f,0x0c,0xdc,0x97,0x34,0xe8,0x6f,0xca,0xac,0x05,0xbf,0x33,0x30,0xf1,},{0x6a,0xdb,0x07,0xe3,0x64,0xf2,0xa4,0x55,0xcb,0x05,0x86,0x7a,0xbc,0x51,0x1a,0xcd,0x9d,0x65,0x89,0x77,0xf0,0xca,0xca,0xfc,0x92,0x82,0x8e,0x7b,0x72,0x4f,0x6b,0xbf,0x98,0xbf,0x0b,0xfb,0x29,0xf4,0xe5,0xe6,0xc7,0x47,0x38,0xd4,0xfd,0xd8,0x16,0xd9,0x25,0x24,0x07,0xae,0x4f,0x3a,0xfc,0x57,0x4c,0x4f,0x00,0x61,0x48,0x24,0xe2,0x03,},"\x2d\xfb\xb3\xf5\x9e\x19\xea\x17\xd4\x4a\x5b\xde\x4a\xd2\x27\xa1\xa3\x51\xdd\xa1\x7a\xf8\x40\xee\x0a\x75\xda\x21\xa5\xcc\xa8\x9b\x6d\x1c\x56\x7c\x33\x3e\x9c\xc9\x10\xe2\x15\x7e\x05\xe8\x6a\xd5\xd9\x31\x14\x50\x64\x59\x4c\x47\xba\xee\xa8\x66\x3a\x34\x64\x9c\x43\xe9\x0e\xb9\x5c\xa1\x0f\x7d\x51\x59\x7b\x37\x8a\x72\x2f\x1f\x70\x4a\xdf\x9f\x22\xe9\xf8\x85\xb8\x9d\x1f\x93\x80\x06\xa2\xef\xcd\xb4\x2a\xaf\xf5\xe3"}, -{{0xef,0x4a,0x67,0x62,0xb4,0x00,0x97,0x52,0x04,0xcc,0xc1,0x3a,0xbb,0x47,0x34,0x40,0x15,0x45,0x49,0x06,0x85,0x0f,0xf1,0x49,0x40,0xcb,0xb8,0x3a,0xa2,0x24,0x14,0xae,},{0xea,0xca,0x45,0x09,0x96,0xf5,0x0c,0xfa,0xf2,0xbd,0x7f,0x9d,0x7f,0xa7,0x08,0x7f,0x09,0xad,0x49,0x66,0x42,0x06,0xa8,0x0b,0xc2,0xe5,0xbb,0xbb,0x85,0xbb,0x66,0x8e,},{0x02,0x69,0x7d,0x44,0xca,0xd8,0x62,0xf1,0xda,0xf5,0x70,0x82,0x05,0xf4,0x50,0xd4,0x08,0x52,0x5b,0x10,0xc0,0x1f,0xfd,0x06,0xcf,0xee,0x80,0x37,0x4f,0x3d,0xb1,0x6f,0xa9,0xa4,0x9c,0x19,0xa9,0x84,0x4b,0x34,0x5f,0x2f,0x95,0x59,0xea,0x74,0xaa,0xb1,0x73,0xba,0xa0,0x78,0xc5,0x43,0x70,0xa5,0x16,0x67,0x00,0xc6,0xda,0xfb,0x78,0x0a,},"\xa4\xb6\x3e\xae\xd5\xa6\x4a\x94\xf2\xca\xd2\x12\xce\x2a\xe7\x10\x92\xfd\x3e\xa7\x44\xf5\xbd\x89\x56\x2b\x2f\xc2\xa6\xc9\xe4\xd7\xaa\x27\xad\xd5\x62\x64\xa5\xa5\x50\x16\x61\x0b\xe6\xc1\x9f\xf7\xd4\x98\x9e\x95\x04\x74\x08\x53\x01\x27\x15\xa7\x9e\xce\x9e\x12\xc3\x01\xb3\x31\x7c\x7d\x9b\x67\x30\xdb\x86\x2a\x4a\x1d\x28\x05\x8e\x0f\x8b\x5d\xdd\x97\x38\xc7\xc6\x2e\xa5\x72\xcf\xe5\x9e\xae\x08\xe2\xb8\xb6\x59\x3b\x58"}, -{{0x55,0x01,0x7e,0x5f,0x61,0xf0,0xc5,0xba,0xfb,0xcd,0xe6,0xf8,0x49,0xf4,0x2a,0x31,0xe5,0xe7,0xa8,0x78,0xc1,0xd3,0xf9,0x12,0x6f,0xc5,0x69,0xfd,0x41,0x7e,0xa9,0xf2,},{0x66,0x91,0x4f,0x74,0xed,0x93,0x2f,0xc8,0x81,0xff,0x01,0x66,0x68,0x3f,0x67,0x5a,0x7c,0x28,0xa9,0x26,0xfd,0xdd,0x64,0x69,0xcd,0xb3,0xf2,0x8e,0x6d,0xec,0x42,0xcc,},{0xb1,0xa5,0xe7,0xc4,0x9b,0x8f,0xc6,0xb4,0x33,0x1e,0x04,0x16,0xce,0x7e,0x4e,0xd5,0x9e,0xdd,0x56,0x30,0x0b,0x80,0x2e,0x0d,0x72,0xab,0xca,0x4a,0x6f,0xcb,0x87,0x6c,0x03,0xbf,0x33,0x15,0x79,0x12,0x4a,0xe0,0xd3,0xfe,0x43,0xf7,0x89,0x8b,0xc8,0x7e,0x93,0xfc,0x2d,0xa3,0x97,0x0f,0xc8,0x63,0x89,0x57,0xd1,0x8c,0x66,0x13,0xc8,0x08,},"\x2f\xc8\x4a\x09\x98\xfa\x6e\x16\x8a\x86\x64\x10\xbb\x68\x10\x5d\xf2\x49\xa2\x8c\xfc\x76\x60\x4b\xe9\x4f\xd7\xdf\xff\xf2\xfc\x1d\xed\xd2\x20\x19\x94\x65\x57\x5e\x8d\xf8\x60\x19\x0f\x16\xac\xa4\x08\x41\x69\xbe\x16\xc6\xba\x32\xeb\x67\x04\x2f\xfd\x4f\x23\x03\x16\xa2\x6b\x26\x24\xa4\x2f\x8f\x90\xad\x57\xf6\x91\x64\x86\xfa\x91\xfd\x94\xed\x68\xad\xed\x4e\x63\x24\x30\xef\x71\x94\x46\x97\x9b\xfa\xf3\x45\x40\x9c\x38\x7f"}, -{{0x05,0x53,0xfb,0xa8,0x66,0x94,0x23,0x41,0x21,0x7c,0xf2,0x78,0xac,0x57,0xcb,0x21,0xac,0xd0,0x9d,0x99,0x16,0xcc,0x6a,0xf0,0xac,0x46,0x94,0x1e,0xa1,0x39,0xd5,0x45,},{0x84,0x0c,0x66,0xe5,0x7c,0x2d,0x4f,0x52,0xa4,0xa2,0x79,0x6d,0x2a,0x53,0xc5,0x70,0x9b,0x96,0xa6,0x28,0xc2,0xe0,0x63,0xfe,0x6e,0xfd,0x47,0xf2,0x83,0xef,0x5e,0x82,},{0xbc,0x33,0x64,0xc1,0x52,0xee,0x5c,0x80,0x8a,0xc3,0x40,0xf4,0x9e,0xa2,0xcc,0x40,0x4e,0x93,0x51,0x71,0x21,0x22,0x0c,0xce,0x6f,0x7c,0x30,0xa2,0x25,0x00,0xe4,0x1b,0xcd,0xb6,0xe8,0x20,0x48,0x0f,0x8f,0xcc,0xdd,0x22,0xff,0x9a,0xd9,0x6d,0xa5,0x32,0x80,0x2f,0x43,0x1e,0x94,0x24,0x0f,0xb8,0x3d,0x4b,0xce,0xaa,0x09,0xb9,0x2b,0x0d,},"\xc1\xfa\xe6\x26\x2a\x0e\x98\xa6\xb1\x23\x5f\xcb\x62\x28\x3b\x7f\x0a\x09\x7f\x9d\x00\x24\x16\xd3\x18\xfe\xfc\x60\xc5\xa1\x58\x4f\x90\x0a\xd0\xab\x26\xcc\xfa\xe0\xd6\xd8\x4a\xa9\xaa\x2d\xf1\x6d\x4c\x11\x7e\xa2\x72\x46\x76\xcb\x86\x6d\x48\x70\xa8\x72\xfc\x82\x9a\x7c\x2a\x5d\x21\xba\x83\x34\x0a\xdb\x33\x9a\x34\xc5\x18\x4c\x7f\x5e\xad\x0f\x07\x72\x89\xb3\x36\x77\xed\x6a\x1b\xa3\x4b\xe1\x99\x4e\x25\x76\x3b\xd1\xd9\xfa\xec"}, -{{0x7a,0x5a,0xc6,0x02,0xde,0x19,0xf3,0xc2,0x10,0x40,0xbc,0xdd,0xbf,0xf4,0x2f,0x6a,0xee,0x6f,0x95,0xc1,0xb0,0x93,0x86,0x8f,0x48,0xe5,0x04,0x82,0xdb,0xf4,0xf9,0xc7,},{0xfb,0xb6,0xc7,0x53,0x1c,0xda,0x21,0xe7,0xd1,0x7e,0xa9,0x03,0xc4,0xd1,0x4b,0xe6,0xc6,0x8b,0x4c,0xa8,0x03,0xa1,0x6b,0xd8,0x71,0x20,0xf5,0xaa,0xf7,0xdc,0xe1,0xd4,},{0x84,0x10,0x1d,0xd4,0xb5,0xe8,0xca,0x3e,0xd9,0x8c,0x1e,0x8a,0x06,0xe1,0x1d,0x7e,0x42,0x4b,0x0d,0x12,0xca,0x71,0x4e,0xe7,0x37,0x4b,0x64,0xc2,0x9d,0x51,0xa2,0x02,0x1c,0xc7,0x7a,0xc7,0x53,0x89,0xd9,0xb0,0xa6,0x46,0xa4,0x47,0x62,0x3d,0x7d,0x04,0xd1,0x24,0x18,0x66,0xb0,0xca,0x6e,0xdd,0x1b,0x7a,0xc0,0x15,0x66,0x6b,0x70,0x0d,},"\xbd\x16\x85\x41\x92\x79\xeb\x81\xe4\xcf\x3c\x90\x90\x31\xf0\xf0\x9c\x5f\xfa\xe7\xe2\xce\x6b\xa9\xd9\x6c\x2b\xce\x87\xb8\xba\x0d\xd7\x63\x23\x10\x01\xe5\x32\xc7\xdd\xd6\x21\x03\xab\xf7\x01\x28\x8e\x19\xdd\x8f\x53\x02\xe8\xf5\xd3\x1b\x64\xcc\x33\x9b\xd8\xb7\xa9\x55\x50\xc8\xa1\x16\xfd\x48\x69\x48\x77\x2b\xd5\xaf\x8d\xfd\x46\x00\x1c\x59\x76\x7b\x0d\x6b\xdc\xe3\x83\xa7\x07\x89\x92\xd1\x02\x2f\xbc\xaf\x90\x71\x06\x87\xb9\xaa"}, -{{0x50,0x41,0x4c,0xf5,0x49,0xbc,0xc5,0x5b,0x5b,0x6b,0x75,0xea,0x37,0x82,0xb2,0xea,0x7c,0x08,0x7b,0x6a,0x01,0x06,0x17,0x5e,0x46,0x9c,0xa2,0xcc,0x76,0x4a,0xeb,0x01,},{0xd0,0xf3,0x0c,0x12,0xe9,0x97,0xf9,0x6e,0x7a,0xee,0xcd,0x1b,0xff,0x6a,0x01,0x2e,0xc3,0x88,0xeb,0xf8,0xf3,0xf4,0xaf,0x66,0x48,0x04,0xd1,0x63,0x8e,0x4c,0x34,0x6a,},{0xb3,0x09,0x80,0x01,0x60,0xde,0x43,0xa6,0x3a,0x89,0xa0,0xac,0xb8,0xa6,0x05,0x00,0x59,0x58,0x9b,0x3e,0xae,0xca,0xc2,0x0b,0x25,0x6f,0xec,0xe4,0x38,0x04,0x2f,0x69,0x41,0x5d,0x8a,0x56,0x88,0x3e,0xe3,0x83,0x6d,0x31,0x34,0xa7,0xfc,0x1d,0xe6,0x4f,0xa8,0xc8,0xce,0xcc,0x3c,0xe2,0x75,0x89,0xf6,0x06,0x05,0x88,0x20,0x85,0x7a,0x0c,},"\x75\xad\x77\xe8\xc5\x4b\x0b\x05\xfb\x2d\x16\x2e\x7c\xad\xb8\xa7\x52\x80\x81\xb8\x63\xf7\x6a\x44\x1b\x37\x44\x69\x41\x3e\x57\x14\xed\xf5\x4f\x80\x04\x96\xaf\x01\x57\xc1\x7e\x42\x55\x83\x41\x4d\x43\x61\xf2\x13\x41\x71\xc0\xb8\x7c\x22\xce\x68\x20\xa4\x85\x0a\xb4\x9d\x99\xa9\xba\xdc\xe9\xe3\x61\x10\xe7\xf3\x06\x01\x18\xb3\x59\x0f\x82\xb4\x37\x71\xe9\xfb\xb0\x81\xaf\xe6\x22\x27\xe0\x24\xd9\x8d\xe6\xcd\xec\x02\x8d\x7c\x49\x49\x0d"}, -{{0x93,0xcb,0x00,0xd8,0xfe,0x9c,0x97,0x77,0xa6,0x83,0x63,0x1f,0x39,0xba,0x0f,0x48,0x76,0x14,0x82,0xcf,0x1c,0x36,0x6b,0xd8,0x63,0xcf,0x71,0x51,0x01,0x53,0x25,0x55,},{0x87,0xe9,0x4a,0x1e,0xa5,0x25,0x8d,0x61,0x18,0x0c,0xb8,0x28,0x59,0x0f,0xf1,0x41,0x8a,0x87,0xd0,0x1e,0x70,0x26,0x86,0xba,0x8a,0xbc,0x26,0x92,0xc8,0xdc,0x3c,0x91,},{0x09,0x82,0x4f,0xa2,0xdf,0xbc,0x4d,0x6e,0xf7,0x6a,0x9e,0x41,0x45,0x96,0x11,0x16,0x76,0x91,0x30,0x55,0x3b,0x3e,0xdf,0xfa,0x50,0xd0,0x4f,0x39,0xb8,0xb7,0x9f,0xac,0xbd,0x23,0x7a,0xcf,0x71,0x35,0x4a,0x53,0xa6,0xe5,0xfe,0xe7,0x54,0xe8,0x23,0xb0,0xb2,0x90,0xf9,0x61,0x93,0x20,0xa1,0x3d,0x56,0x12,0x69,0xa2,0x21,0x63,0x9f,0x03,},"\x88\xd8\x53\x8d\x31\x86\x78\x13\xd8\x8f\xef\x72\x28\xd4\x9a\x7e\x95\x0d\x73\x83\x96\xf1\x16\xdd\xa1\x02\x5f\x79\x13\x54\x7c\x5d\x1d\xc5\x67\x7a\x6d\xe4\xb4\xa5\x88\x05\x07\xb3\x61\x78\x0b\x61\xb4\x3f\x77\x95\x26\x3d\xb2\x2f\xf3\x41\x64\x5f\x2f\x59\x14\xfd\x60\x88\xc2\x81\x12\x11\xed\x47\x56\xac\x01\x9a\x60\x35\xd6\x6e\x31\x70\xc1\xd8\x2b\xfa\xa3\x05\x96\xb3\x96\xb3\x26\x0c\xc1\xd1\x0d\x41\x3d\xd4\x7e\xbe\x6d\xaa\x0c\x30\xdc\x42"}, -{{0x2b,0x4c,0xae,0x38,0x0e,0x95,0xce,0x69,0x4c,0x26,0xac,0x79,0x57,0x44,0x73,0x47,0xf9,0x8e,0x31,0xb4,0xbf,0x02,0xd7,0x44,0xe1,0x31,0x52,0x90,0x71,0xe2,0x30,0x1d,},{0xe6,0xfc,0x70,0x5a,0x79,0xc9,0x8e,0x11,0x5b,0x4e,0x28,0xd3,0xaa,0x15,0x06,0xb7,0x4e,0xe7,0x42,0x76,0xc5,0xfc,0x11,0x09,0xa7,0xf4,0xd8,0x9c,0x6f,0xaf,0xb8,0x89,},{0x55,0x5e,0x45,0x65,0x6b,0xa9,0xcf,0xbf,0x51,0x55,0xd0,0xe5,0x25,0x76,0xe5,0x19,0x7a,0xbb,0xbc,0x9d,0xd2,0x33,0x99,0x3e,0xec,0x2a,0x1e,0xe7,0xf6,0xa8,0x64,0x09,0xc0,0xb7,0x1b,0x0a,0x66,0x19,0x78,0xff,0x5e,0x0a,0xcd,0xc9,0x46,0x3d,0xc4,0x49,0x90,0x6f,0x47,0x4f,0x8e,0x79,0xbb,0x86,0x16,0x8b,0xf7,0x07,0x41,0xe3,0x4b,0x02,},"\xe0\xb8\x25\x0e\x27\xb7\xc0\x29\x1d\xbc\x47\xa6\xda\x6f\x12\x68\x98\x7a\xfd\xf0\xa1\xe9\x0b\xe6\x9b\xcb\xc4\x37\x08\x65\x21\x78\x30\xd5\x20\x86\x93\xbe\x7b\x70\x45\x09\x9a\x22\xea\x27\xf9\x52\xeb\x3f\x79\xa9\xa0\xf1\xb5\xa8\x7b\x19\x36\x77\x90\x78\x8d\x34\xc2\x19\xc2\xe2\xa6\xb8\x34\x02\x0f\xb4\xfd\x14\x9d\xc5\x6b\x54\x4f\xdd\xbb\x42\x07\x1a\x16\x2f\xc7\xcb\x33\xc1\x46\xca\xc0\x5a\x31\xb1\x83\xe9\xda\xad\xc6\x16\xf3\xaf\x44\x9b\x17"}, -{{0xb5,0x64,0x91,0xe5,0x49,0x99,0xbb,0x5a,0x17,0x15,0xeb,0xfa,0x2f,0xeb,0x14,0xa5,0x45,0xa3,0xa4,0x3c,0x2f,0xdf,0xd4,0xbe,0x0c,0x95,0xfc,0x11,0x81,0x9a,0xd6,0x95,},{0xcd,0x42,0xbf,0x41,0x4f,0x9b,0xfc,0x72,0xec,0x06,0x98,0x82,0xa8,0x00,0x55,0x7c,0xdf,0x31,0xbc,0x34,0x64,0xfb,0x10,0x2c,0x31,0x0e,0x6d,0xbd,0x3a,0xe2,0x08,0x63,},{0xe3,0xbe,0x3e,0x71,0xa8,0x98,0x52,0xdf,0x3c,0xff,0xd7,0x2d,0x68,0x20,0x78,0x69,0xdd,0x3e,0xce,0xb4,0x9b,0x1f,0x02,0x94,0x93,0xec,0xcb,0xb9,0x32,0x44,0x4e,0xbe,0x8c,0x8c,0x6d,0xb5,0xf0,0xa5,0xa6,0x7e,0x21,0x94,0x40,0x8d,0xf9,0x84,0x19,0x13,0xa5,0xac,0x1a,0x60,0x68,0x96,0x41,0x9a,0x66,0x8f,0x4f,0x47,0xc5,0x6c,0x2b,0x08,},"\xeb\x44\x18\xba\x30\x68\x3e\xc7\x95\x9b\xdb\x1e\xc7\xb2\x63\xf8\x3e\x81\xf0\x54\xdd\xcd\xbe\x0a\x67\x38\xca\x77\x63\xe2\x46\x93\x5b\xac\x41\x90\x26\xc2\x2b\xfb\xdd\x12\x36\x33\x6c\xc1\x61\x07\xc5\x35\x13\xe3\xdd\xf3\x4e\x12\x08\x46\x96\x2c\x3b\xdd\x54\xf5\xad\x57\x49\x59\x72\x08\xf1\x5a\x8b\xb5\x66\x67\xba\xa8\x95\xf0\x83\x40\xdb\x89\xb8\x5c\x43\x5e\x77\x09\x31\x92\x8d\x8a\xbc\x99\x26\x2f\x83\x9a\xed\xd9\xbe\x2a\xa1\x38\xc9\x25\x9a\xdf"}, -{{0x65,0x79,0xc2,0x47,0xdd,0x2c,0xd0,0x2b,0xa2,0xf7,0xd7,0xa9,0x50,0xa3,0x30,0x75,0x26,0x81,0xe9,0x2c,0x0d,0xc6,0x29,0x84,0xbb,0xea,0x27,0x9e,0xa5,0x21,0xc3,0x81,},{0x0b,0x08,0x7b,0xea,0x1a,0x1b,0x3d,0x15,0x80,0x5c,0xb6,0x04,0xf4,0xbb,0x8d,0x68,0xed,0xde,0x27,0x4f,0xaf,0x52,0x1f,0xe6,0xdf,0x50,0xc5,0x5f,0x8a,0xd4,0xa7,0x0d,},{0xec,0xca,0xf8,0x01,0xae,0x0a,0x91,0x2e,0x21,0xc6,0xb8,0x3a,0x5f,0x0e,0x4e,0x88,0xd4,0xb2,0x71,0x34,0x59,0xff,0x93,0x44,0x9f,0xc0,0xb2,0x1a,0x9f,0x41,0x60,0x50,0x11,0x3c,0xba,0xe4,0xe8,0x14,0xd2,0x0c,0x0a,0x79,0x8f,0x76,0xd2,0xf9,0xd3,0x26,0xed,0x83,0x95,0x9e,0xa0,0x2a,0xbd,0xc1,0xab,0x35,0x0a,0x46,0x71,0x23,0xf7,0x09,},"\xdf\x7c\x55\x2f\xfc\x89\x37\x4b\x95\x71\xa6\x02\x4a\x8d\x04\x71\xd7\xeb\x6b\xe8\xdf\xca\x6f\x41\x66\xb5\x81\xb6\x54\x79\x01\x5a\x05\x68\x12\x90\x74\xcc\x04\xd6\x34\x2c\x75\x8c\xa1\x8f\x79\x87\xde\xc5\x36\xb7\x03\x3d\x5f\x96\x81\x50\x43\x40\xe2\x09\x86\xf0\x27\xb8\xcf\x1f\x26\x3b\xe7\x6d\xb3\x52\x5d\x17\x34\x22\x95\x0e\xa8\xdc\xed\xdc\x58\x56\x40\x91\x8a\xa9\xd2\x5c\xa8\x9c\xba\x70\x1c\x20\x20\x15\x38\x73\xf4\x61\x08\xc7\x72\xcb\x38\x8d\x55"}, -{{0x18,0xfb,0xa6,0x0c,0x50,0x26,0xf3,0xc9,0xdd,0x7a,0xed,0xc0,0x42,0x09,0xd5,0x26,0x03,0x61,0xde,0x40,0x0e,0x19,0x0a,0xeb,0x60,0x16,0x9e,0x05,0xa3,0x36,0x7c,0x9f,},{0xdf,0xff,0x34,0x7f,0x3d,0xd2,0x55,0x53,0x0b,0xf7,0xfb,0x34,0xd0,0x2b,0xa4,0x86,0xd1,0x12,0xbb,0x46,0xe9,0x50,0xe2,0xef,0x80,0xe5,0x17,0x01,0x4c,0xc9,0x57,0x34,},{0x4b,0xc0,0x11,0xe4,0x0f,0x0f,0x59,0xc6,0x18,0xf6,0xbb,0xe2,0x30,0xb6,0xf7,0xbc,0x2f,0x50,0xe3,0x61,0x7c,0x7f,0xaa,0xb7,0xf4,0xc2,0x1c,0xb8,0x4f,0x77,0xeb,0xa9,0x94,0xcb,0x7c,0x2a,0x1b,0xf1,0x0b,0x01,0xbb,0x20,0x08,0x44,0x97,0xfd,0xf0,0xa6,0xab,0x5d,0x9b,0xcd,0x22,0xc4,0xa2,0xc5,0xa7,0x8f,0x79,0x92,0x68,0x25,0x94,0x0f,},"\x34\xf0\x8a\x80\x4d\x78\x29\xcc\x39\x14\xf0\x00\xce\x1a\x32\x88\xac\xce\x21\x49\xc8\xa0\x20\x86\xb9\xf6\x7a\xfc\xcd\x83\xa1\x78\xb0\xbc\xfd\x49\x70\xc0\x56\x99\x7d\xa7\xdc\x3d\x47\x56\x2f\x16\x66\x3c\xed\xc5\x2f\x82\xd7\x10\x85\x0c\xf4\x05\x03\x79\xef\xda\xc2\x3b\xee\x17\xc3\x30\xa3\x83\xad\x13\x7f\x78\x84\x73\xb2\xb0\x72\x36\x03\xb6\xde\xb1\xfd\xbf\x6c\x52\x3f\xc9\x48\xa0\xcc\xc4\xff\x10\x0f\xb9\x46\xd8\x74\xc1\xf9\x90\x43\x6a\xe8\xc4\xf3\xb2"}, -{{0x07,0x3c,0xc1,0x5b,0x05,0x36,0x28,0x59,0x33,0xb2,0xbe,0x39,0x25,0x3c,0xf4,0xfd,0x69,0x6b,0x81,0x61,0x0f,0x5d,0xd3,0xad,0xac,0x2e,0x9c,0xbf,0x33,0x8e,0xf2,0xf6,},{0x00,0xb5,0x51,0xd3,0x71,0x54,0x43,0x75,0xda,0xc5,0xc4,0xe9,0x6c,0xd1,0xf0,0x21,0x52,0x07,0xe8,0xe1,0x66,0xa1,0xfe,0x49,0xd5,0xb0,0xa5,0x1a,0xc1,0x84,0x43,0xec,},{0x3a,0xa5,0x2a,0x83,0x06,0x2a,0x8f,0x28,0xa5,0xd6,0xb7,0x60,0x7f,0x48,0x4b,0x66,0xcc,0x37,0x48,0x96,0xb7,0x66,0x12,0x31,0x26,0x33,0x3c,0x57,0x95,0x81,0x31,0x6c,0x74,0x28,0x06,0xf6,0x27,0xb5,0xbc,0x55,0xca,0xd7,0x05,0xcc,0x1d,0x47,0x82,0xb0,0x44,0x08,0x0c,0x8a,0xc8,0x40,0xf3,0x8c,0x0c,0x50,0xd3,0x5e,0x34,0x5c,0x78,0x03,},"\xc2\x85\x36\x2b\xc8\xef\x62\x8f\x7a\xed\xf6\x54\x23\x1e\xe5\x1a\xcd\xf2\xcf\x69\xa8\x86\xb9\x42\xbb\x9b\xfe\xd8\x15\x51\x05\xd9\x20\x9d\xed\x2a\xf2\x4f\x16\x9a\xd5\xfc\xd4\x51\x37\x0f\x58\x27\xa8\x51\x11\xc7\xa5\x2e\x03\x2c\x50\x38\x61\x7c\x0c\x01\x70\xe2\xa6\xc2\x31\xdc\x40\x1d\x12\x06\x2e\xdb\x18\x60\x36\x11\x4e\x38\x79\x3b\x79\x08\x90\x77\x58\x1b\x97\x83\xf4\x00\x07\x10\x3e\xf1\x74\x72\x49\x1c\x00\xe7\x13\x8a\xec\xc5\x08\x4d\x3c\x85\x01\x04\x70"}, -{{0xfd,0x89,0x4a,0x1e,0x82,0x32,0x20,0x3b,0x28,0x95,0x05,0xd5,0xc6,0x8c,0x68,0x79,0x1f,0xfc,0x0e,0x54,0xf2,0xa8,0x75,0x30,0xfb,0xba,0x5b,0x3a,0x3f,0x2c,0xaf,0x00,},{0xe9,0x5a,0xb5,0x65,0x94,0x5c,0x7a,0xe5,0xd5,0x33,0xdf,0x5d,0x0c,0xcc,0xc7,0xe9,0xab,0xbc,0x83,0x8e,0x20,0xa0,0xb6,0x1c,0x93,0x0f,0x5d,0x41,0xd8,0x1a,0x6f,0xe7,},{0xf5,0x11,0x02,0x21,0x9e,0x88,0x04,0xbe,0x71,0x3e,0x55,0x6d,0xf4,0xe4,0xaf,0xa2,0xf8,0x86,0x6f,0xe8,0x65,0x41,0xa1,0xc2,0xa0,0x93,0x4d,0x24,0xc3,0xc9,0xbe,0xb2,0x80,0xa7,0x0d,0xd8,0xd5,0x27,0xfe,0x8b,0x7e,0x0b,0x94,0x82,0x14,0xd5,0xf2,0xf9,0x63,0x86,0x19,0x91,0x4b,0x72,0xd5,0x5d,0xc1,0x98,0xb0,0x22,0x9a,0x84,0x87,0x08,},"\x26\x69\x62\x4a\x94\xf2\xc4\x4a\x05\xb7\xdc\x3e\xbf\x93\xe5\x8a\x4b\xf3\xa0\x1c\x27\x36\x57\xe7\xe7\x87\x89\x76\xf6\xb6\xea\x73\x7f\xa3\xf2\x2c\xc8\x36\x5b\x8b\x22\x0c\x00\x7d\x5b\x64\x27\x26\xa4\x08\xfe\x2f\xab\x69\xeb\xb3\xbd\x07\x2b\x34\x9f\x4d\xc3\x37\x7e\xe7\xcc\x75\x29\x34\x25\x42\x15\xd2\x39\x89\xbd\x3c\xd0\x2c\xe9\x99\xad\xec\x97\x84\x99\x3f\x4c\x19\x94\x08\x15\xf3\x9c\x9e\x22\x92\x47\xf5\x20\x5c\x36\xcb\xa4\x4e\x71\x42\x66\x36\x92\x89\xb4\xa7"}, -{{0x18,0xef,0x46,0x4e,0x28,0xf8,0x7f,0xfc,0xfa,0x4d,0x3a,0x9c,0x09,0xa2,0x29,0x10,0x95,0x1b,0x8c,0x71,0x9f,0xda,0xcd,0xb5,0x6d,0xe6,0x2c,0x4b,0x40,0x6d,0xf0,0x0c,},{0xc5,0x06,0x4c,0x9d,0x43,0xee,0x2d,0xa7,0x5b,0x06,0xbb,0x09,0xc7,0x72,0x67,0xdb,0xd0,0xd3,0x91,0x28,0xf1,0xcd,0xc6,0xbf,0xa4,0x51,0xa0,0x3e,0x93,0xaf,0x4a,0x70,},{0xd1,0xe7,0xf1,0x6e,0x8e,0x59,0x7d,0x42,0x8a,0xde,0xa6,0x55,0x91,0xd5,0x51,0xb5,0x4b,0x66,0x7a,0xff,0x20,0x20,0xc4,0x64,0xf7,0xf4,0xe5,0x3c,0x47,0x73,0xf7,0x04,0x33,0x24,0x9a,0x3c,0x71,0xb4,0xd1,0x1c,0x89,0xc3,0xfa,0xa8,0x92,0x80,0x92,0x27,0xb9,0xf2,0x9e,0xf4,0xf7,0xf5,0xd0,0x20,0xd4,0x67,0x4d,0x40,0x21,0x35,0x94,0x05,},"\x9c\x82\x57\x07\xd9\x35\x83\x65\xab\x9d\x38\xf7\xe7\x28\xd6\x28\xaa\x72\x2a\x4f\x1a\x20\xa3\x8e\x47\xc9\x99\xff\xf8\xfc\x32\x41\x7f\xbe\x07\x2f\x96\xeb\x6a\x0e\x11\xe4\xda\x9b\x6d\xe9\x61\x54\x45\x28\x0e\x93\xc7\x7a\x36\x34\xd3\xd2\xc6\x87\x98\x56\xc2\x48\xf9\x80\x0f\x60\xa0\xd3\x8d\xc1\xce\xa8\xb7\xf3\x1f\x28\x6c\xb0\x37\x48\x27\xb4\xc6\xba\x14\x4a\x66\x94\xf2\xb9\x08\xea\xd6\x8d\x18\x34\x01\x24\xcb\x59\xcf\x17\x01\x86\x3b\xd4\xf3\xef\xc7\x09\xf3\x62\x7a"}, -{{0xc9,0x11,0xbd,0xf2,0xf9,0xe7,0xcc,0x5f,0xff,0x35,0xc9,0x6e,0x15,0xcc,0x12,0xea,0xfd,0x05,0xab,0x0d,0xb3,0x1f,0x64,0x9f,0x74,0x08,0xac,0xd0,0xca,0xda,0x76,0xe0,},{0xde,0x44,0x69,0x6c,0xd6,0xbd,0x2c,0xbe,0x9b,0x11,0xa0,0xef,0x18,0xb8,0x81,0x64,0x80,0x1a,0x96,0x9d,0x5e,0x06,0xed,0x45,0x3e,0xb4,0x00,0x8c,0xce,0x9a,0x57,0x25,},{0xd5,0x84,0xb5,0xda,0x37,0x1a,0xe4,0xf5,0xc9,0x85,0x9b,0x25,0xf7,0x0d,0xc5,0x6c,0x1b,0x7b,0x4e,0x02,0xd1,0xae,0x66,0x36,0x28,0x3b,0x1b,0x7b,0x11,0x21,0x7a,0xfd,0xcd,0xf6,0x5d,0x1b,0x49,0xca,0x2c,0x8e,0xf1,0x79,0x66,0xe9,0xbc,0x65,0xf1,0x0c,0x31,0x0b,0x77,0xbb,0x5d,0xf7,0xaf,0xf5,0xec,0x1b,0x37,0x9a,0x2c,0xe5,0x5d,0x0d,},"\x76\xc4\x71\x24\x1d\x17\x19\x29\x84\xb0\x03\x62\x69\x6e\x4d\x9d\x4d\x2b\x7f\x83\x9c\x20\x64\x11\x7e\x50\xa1\x59\x8f\x3a\x11\x72\xb1\x6c\x55\xe5\x39\x68\x66\x08\x47\x52\x02\x4f\x3a\x7e\xb6\x8b\xb3\xff\xdb\x80\x97\x9a\x0a\xf6\xd0\xf6\xaf\x26\xb6\xf0\xbc\x0c\x03\x84\x43\x3b\xcf\xd4\x4c\x75\xeb\x65\x4a\x8a\x82\x25\xcb\x9c\x4a\x7f\xb3\xc8\x24\xc3\xaf\x61\x25\xfd\x46\xdb\x28\x7e\x70\x49\x2d\x15\x46\x32\xcb\x8f\x62\x43\x26\x59\xd9\x58\xd6\x28\x1d\x04\xa5\x4f\x5f\x5f"}, -{{0xd3,0x70,0x32,0x99,0xc4,0x1d,0xb3,0x6d,0x77,0xdd,0x3a,0x49,0x54,0x1f,0x3f,0xb2,0x1d,0x0b,0x2b,0xad,0x1f,0x6e,0x07,0x4a,0xff,0xd9,0x6f,0x1c,0x40,0xd0,0xf9,0x27,},{0x86,0x2c,0x5e,0xf6,0x16,0xa5,0xf0,0x66,0xfd,0x87,0x75,0x8a,0x56,0xab,0x45,0x05,0x6f,0xea,0x4b,0xd3,0x3f,0x00,0x8b,0xe2,0x4f,0x7b,0x54,0x0e,0x09,0x5e,0x14,0x8e,},{0xdf,0x28,0x27,0x71,0x21,0xea,0xc4,0x46,0x30,0x08,0x4c,0xce,0x75,0x91,0x7a,0xe9,0xf6,0xbe,0xc6,0x5a,0xf5,0x57,0x2d,0xc3,0x07,0x19,0xbd,0xe6,0x61,0xcf,0x69,0x6b,0x85,0xb8,0x67,0x2d,0xd4,0x98,0x3c,0xab,0x30,0xbd,0x05,0xcc,0x3a,0x11,0x9d,0x7d,0xb9,0xba,0xbd,0x52,0x2d,0x7b,0x3a,0x6b,0xcf,0x38,0x86,0xec,0xd2,0x5e,0x08,0x0f,},"\xac\x92\xed\xbe\x22\x25\x7b\xb0\x6d\x94\xaa\x95\x0e\x62\xd1\x8c\xa2\xac\x0a\x8f\xc1\x06\x00\x0d\x22\x31\xf8\xa1\x3b\x8d\x7a\x20\x9c\xcd\x8c\xc4\x9a\x6c\xd6\x8a\x7f\x36\xc0\x2f\xb8\xf7\x28\xd1\x55\x95\x16\x7f\x0b\xa8\xcf\xe9\x5c\x8a\x1e\x43\x5f\x32\x75\x13\x01\x4a\xc4\x28\xb7\x5d\x4f\x72\xe7\xc8\x34\xdd\x70\xe1\xa4\x48\xf1\x84\x7d\x34\x98\x47\x5f\x74\xe3\xd9\x33\x4d\xc7\xdc\xc4\xfe\xd7\x2b\xf6\xc7\xfe\x3b\x1d\x4f\x53\xd4\x29\x61\x6f\x1d\xf4\x4f\x19\x73\x31\x58\xb6"}, -{{0xd4,0x11,0xcd,0x33,0x57,0x6d,0x0e,0xfe,0x9e,0xc4,0x13,0xcc,0xda,0xab,0xd4,0xfc,0xba,0xfe,0xc0,0x1a,0x3a,0xf4,0xb3,0xcb,0xe3,0x4f,0x8b,0x05,0xef,0x8b,0x59,0xba,},{0xe8,0x70,0x34,0x4d,0xf9,0x8d,0xd3,0xa8,0x70,0x2c,0x45,0x19,0xbf,0x9e,0x8b,0x35,0xa9,0xd1,0x89,0xe7,0x46,0xf7,0x20,0x3d,0xbb,0xf9,0xbb,0xfa,0xb2,0x2d,0x6f,0x63,},{0x83,0x46,0x0d,0x15,0x46,0x1d,0x67,0x17,0x71,0x0b,0xaf,0xd6,0xa4,0x7a,0x1e,0xaa,0x90,0x0a,0x80,0xf2,0xbf,0x8b,0x8a,0xae,0x24,0x68,0x77,0x36,0x14,0xee,0x84,0xbd,0x62,0x8c,0x97,0x17,0x47,0x63,0x68,0xef,0x36,0x40,0xcf,0x76,0x0a,0xca,0xc8,0x3a,0xd6,0x02,0x32,0xa7,0x69,0x63,0xb7,0xd5,0x25,0x88,0xb1,0x1d,0xc0,0x04,0xd7,0x0d,},"\x11\xd2\xc2\xa7\xf0\x19\x09\x88\x12\x66\x96\x43\x1b\x4b\xbc\xd9\x0a\xb7\xb5\x6a\x32\xda\x64\x04\xae\x44\x6a\xa7\x62\xa4\xdd\xc6\x60\x94\x97\x15\x38\xee\xb8\x5b\xde\x04\x70\xa5\x10\xbe\x0d\x6d\x85\x78\x0e\xe7\x30\xa9\x85\x41\x38\x72\x8a\xe6\x81\x61\x62\x26\x8d\xa8\x52\x85\x8e\xae\xd4\xec\x74\xc7\xac\x62\xe6\xe7\x09\x6d\xc0\x02\xdf\x0b\xdf\x5f\xa4\x0d\xa5\x65\xb4\x1d\x18\x1a\x3f\x0a\xd0\xc5\xe0\xb9\x76\x74\x3e\x31\x5d\x9d\xb8\xed\x41\x60\xab\xe6\x9c\x13\xa2\xb3\xf0\x9a"}, -{{0xe1,0x0a,0x2f,0x13,0x80,0xc3,0xe4,0x72,0x0e,0x8a,0x87,0x07,0xa9,0xbc,0xb2,0x5a,0x0f,0x58,0x27,0x0d,0x70,0x59,0xcd,0x76,0x26,0xc7,0x15,0x34,0x47,0xed,0xfb,0x87,},{0xa3,0xc7,0x17,0xac,0xab,0x36,0x6a,0x40,0xb5,0x11,0x87,0xbb,0xf3,0x5b,0x2d,0x15,0xe9,0x7c,0xfe,0xac,0xd7,0x34,0x9c,0x06,0xef,0x1c,0x91,0xac,0x93,0xe9,0x06,0x56,},{0x09,0x4b,0xf6,0xf9,0x53,0xca,0x0e,0xb7,0x7d,0xf4,0x51,0x29,0xb7,0xbf,0x10,0xd1,0x92,0xcf,0x6d,0xde,0xae,0x94,0xad,0x62,0x02,0xb8,0xea,0xcf,0xbe,0xc1,0x19,0xe5,0x29,0x15,0x78,0xfe,0x64,0xa0,0x84,0xae,0x60,0x0f,0xe0,0x7e,0xfd,0xb8,0xa7,0x82,0x61,0x0d,0xbd,0xb0,0xb4,0x9e,0xb5,0xf2,0xa4,0x6c,0x43,0x23,0x55,0x55,0x2f,0x01,},"\x13\x52\x12\xa9\xcf\x00\xd0\xa0\x52\x20\xbe\x73\x23\xbf\xa4\xa5\xba\x7f\xc5\x46\x55\x14\x00\x77\x02\x12\x1a\x9c\x92\xe4\x6b\xd4\x73\x06\x2f\x00\x84\x1a\xf8\x3c\xb7\xbc\x4b\x2c\xd5\x8d\xc4\xd5\xb1\x51\x24\x4c\xc8\x29\x3e\x79\x57\x96\x83\x5e\xd3\x68\x22\xc6\xe0\x98\x93\xec\x99\x1b\x38\xad\xa4\xb2\x1a\x06\xe6\x91\xaf\xa8\x87\xdb\x4e\x9d\x7b\x1d\x2a\xfc\x65\xba\x8d\x2f\x5e\x69\x26\xff\x53\xd2\xd4\x4d\x55\xfa\x09\x5f\x3f\xad\x62\x54\x5c\x71\x4f\x0f\x3f\x59\xe4\xbf\xe9\x1a\xf8"}, -{{0xb2,0xe6,0x97,0xb3,0xd3,0xef,0xec,0x97,0x6e,0xf3,0x36,0x95,0x30,0xc7,0x92,0x71,0x7b,0xdb,0xb4,0x28,0xd9,0xed,0x0c,0x11,0xec,0x0e,0xa9,0xb2,0xe5,0xf3,0x9f,0x82,},{0xc4,0xd2,0xe4,0xb3,0xc2,0x36,0xd6,0xc9,0xb8,0xc7,0x4f,0xa3,0x84,0x61,0x2c,0x47,0x10,0xd8,0x3a,0xa1,0x6a,0xd7,0xef,0x01,0xfb,0xb7,0x42,0x1d,0x4f,0xb3,0xf0,0xf6,},{0x50,0x47,0xfa,0x38,0x19,0x7b,0x83,0x28,0xe7,0x8d,0xd8,0xa1,0x0e,0x96,0x6a,0xfb,0x7b,0xd3,0xd4,0x36,0x08,0x28,0x0f,0x1c,0x25,0x7d,0x25,0xca,0x43,0xbc,0x1c,0x06,0xe9,0x4a,0x57,0x47,0xab,0x62,0x15,0xec,0xe5,0x4c,0xde,0xff,0x8c,0x56,0x56,0x7d,0x70,0xd2,0xf9,0x1f,0x9e,0xc8,0xc2,0x60,0xaa,0x10,0x80,0xa6,0xab,0x5a,0x7a,0x02,},"\x7b\x43\x62\x32\xac\x21\x11\xa8\x40\x59\x51\x0c\x48\x36\x25\x88\xfc\xb7\x38\x34\x26\xbe\x5e\x6f\x62\xf3\x72\xe4\xf7\xcc\xa8\x3c\x81\xc2\x35\x7f\x9b\x54\xf4\xa1\x52\x91\x06\x5b\x6d\x41\xaa\xd1\xea\x93\xcf\xfa\x77\x6b\x9a\xca\xa5\x8a\xfe\x2b\x51\x64\x4b\x97\xaf\x9a\x3e\x53\xf8\x4e\x40\xaa\x6d\x86\x05\x1e\x69\x14\xcd\x03\x9d\x41\x70\xa9\xa5\x26\xdd\x69\x95\x5f\xf5\x07\xc3\x3f\x74\xe2\x17\x65\x91\xfb\x0b\x3c\xd7\xf0\x0e\xe4\x18\xf2\xc2\x58\xa9\x98\x1c\xcc\xee\x72\xf0\x1c\x84\x30"}, -{{0x19,0xa6,0x79,0xa7,0xa9,0x05,0xa1,0xe2,0xb3,0x03,0x8e,0x6e,0x41,0x8b,0x3d,0xa9,0x7c,0x30,0x89,0xc7,0xcd,0x35,0x1e,0xa0,0x7b,0xc8,0xd1,0xaf,0x64,0xea,0xcc,0x46,},{0x19,0xf0,0x83,0x61,0xf4,0x69,0xb4,0xae,0x1e,0x0c,0xeb,0x94,0xf4,0x7a,0x7d,0xe7,0x31,0x74,0x10,0xa9,0x2d,0xd0,0x13,0xb1,0x6a,0xe0,0xd0,0x53,0x2f,0xa4,0xb3,0xef,},{0x43,0x47,0xb7,0xb4,0xf7,0xc3,0xc4,0xdd,0x31,0x5b,0x83,0x84,0xa0,0xb0,0xca,0xee,0xd8,0x4b,0xda,0xbe,0x24,0xb2,0x91,0x5f,0x12,0x51,0x2d,0xfd,0x04,0x77,0x0f,0xc9,0x96,0xa1,0xbf,0xb7,0x29,0xaf,0xef,0x9e,0xdd,0x61,0x14,0x47,0x08,0x1a,0x53,0x30,0x61,0x7e,0xae,0xa1,0xc1,0xda,0xb1,0xbf,0x13,0xce,0xa8,0x99,0x72,0x04,0x91,0x0c,},"\x98\x0c\x7b\x4d\x29\x39\x06\x1a\xc7\xb9\xba\x44\x11\x17\xa1\x94\x85\x66\x17\x81\xa4\x08\x30\x67\xc5\x5a\xcf\x93\x02\x6c\x08\x2a\x93\xcc\x12\x4f\x09\x5e\x1b\x4f\x2c\x3f\x6c\x13\x54\x12\xa5\x09\x62\x28\xe8\xa0\x71\xe8\xb4\xb6\x68\xba\x9d\x96\x44\xea\x9f\x4d\xab\xfc\x54\xa9\x85\x6c\x3e\x96\x5e\x63\x63\x39\x5a\xb7\x09\x03\x7d\xda\x22\x9b\xaf\x92\x7c\xd0\x1f\x9a\xf5\xe0\x39\xaf\xc4\x2f\x3c\xec\x63\x4f\x5d\x83\x2d\x2a\xb7\xc7\xca\xd3\xad\x7b\x8c\xf2\x7e\xbd\xac\x69\x84\x31\xad\x82\x36"}, -{{0xf0,0x3b,0x83,0x63,0xee,0x5b,0x0e,0xef,0x70,0x18,0xa4,0x9b,0xc0,0x2a,0xdf,0x73,0x1d,0xa5,0x4e,0xe5,0x0a,0x7f,0x03,0xb8,0x8a,0x29,0xa2,0x08,0x2b,0x18,0x9c,0x43,},{0x31,0x28,0x7e,0xf5,0xa2,0xe6,0x41,0x04,0xab,0x77,0x90,0xb3,0x12,0xf3,0x5c,0x7a,0xd4,0xaf,0x6b,0xeb,0x0d,0x7c,0xeb,0x8a,0x58,0xf3,0x6a,0x54,0xce,0x27,0x2c,0x3e,},{0xe8,0xfa,0x96,0x7e,0x6a,0xfa,0xdf,0x6a,0x87,0x7d,0x87,0xe5,0xf5,0xc5,0x2b,0xb6,0x34,0xb7,0x5a,0x78,0x04,0x19,0x9a,0x2b,0xc9,0xd0,0x27,0xb6,0x3a,0x35,0x65,0x4d,0x9d,0xdd,0x06,0x83,0x04,0x55,0x64,0x1d,0xbf,0xb4,0x9e,0xdc,0xe4,0x2e,0x20,0xe7,0xd4,0x10,0x4a,0x07,0x1c,0x2c,0xbb,0xec,0x23,0x01,0x8c,0x29,0x7c,0xed,0x99,0x08,},"\x24\x19\x1b\x54\x64\xb3\x5a\xc7\xbc\xf4\xa3\x75\xf0\x33\xef\xba\x89\x43\xb0\x9b\x9f\xf0\xfc\x40\x3c\xa7\xaa\xe7\x02\xa3\xcb\xf3\x96\xc5\x13\x1b\xc0\x08\x13\x2c\xf5\xf1\x29\x10\xd5\x86\xdc\x1d\xb9\xc0\x84\x57\x4a\x96\xba\xbe\xe9\x56\x42\xf9\x22\x37\x1c\x03\x82\xec\x04\x02\xa2\x6f\xeb\x14\x2e\x41\x46\xbb\xd3\x36\x0c\x2b\x36\x83\x4f\xe4\x5a\xf5\xe2\x86\x8d\x4d\x56\xfd\xd5\x04\xce\xbf\x0c\x2d\x7f\x57\x91\xb4\x42\x94\x17\xc8\xb6\x5a\x98\xe0\xb1\x5c\x46\x6c\x13\x7f\x41\x05\x24\xfc\xe7\x37"}, -{{0x11,0x08,0x6b,0x0d,0x11,0xe4,0x15,0xab,0x1c,0xe0,0x2a,0xaf,0x8f,0x06,0x21,0xb5,0x44,0x30,0xf6,0xfb,0x13,0x5c,0x74,0xf4,0x0d,0x38,0xe8,0xc6,0x47,0x37,0x06,0x4b,},{0x71,0x66,0xdf,0xbc,0x69,0x1e,0xb8,0xc2,0x01,0x11,0x4b,0xa0,0xd1,0xa2,0xc7,0xb8,0x7f,0x7a,0x1f,0xd8,0xd0,0xb3,0x60,0x58,0xb0,0xd7,0xdc,0xab,0xe1,0xae,0x30,0xda,},{0xe9,0x07,0x45,0x9d,0x5a,0xdc,0xd0,0xd0,0xc3,0x64,0x18,0x58,0x1f,0x19,0xd0,0xee,0xbd,0xa7,0x13,0x8e,0xbd,0x9f,0xaa,0x0b,0x26,0x22,0x01,0xf4,0x58,0xc8,0x56,0x31,0x0b,0xb7,0x7f,0x4c,0x7d,0xe9,0x22,0x49,0x5d,0xcf,0xe8,0xb2,0x48,0xed,0xa2,0xad,0x0d,0xf6,0xa7,0x3f,0x47,0xbb,0xfb,0x89,0x4b,0xaa,0x7d,0x88,0x69,0x87,0x58,0x02,},"\x4b\x5b\x29\x36\xc5\xe3\x60\xa3\x84\x55\x50\x37\x21\x07\x8f\x8a\xdb\x40\x4a\x7e\xe7\xec\xc1\x48\x01\xdc\x87\xa6\x7a\x15\x2b\x76\x95\x69\xfb\xea\xc0\xaf\xa2\x5a\x20\x70\xa1\x68\x6b\x90\x0a\xc1\x63\x3d\x49\x98\x08\xcd\xb2\xe8\x1c\xe3\x91\x6d\x5a\x3c\x04\xd1\x9c\x5b\xb2\x69\x9a\x66\x2b\x8a\xba\x4a\xf9\x4d\x39\x0b\xac\x7c\xcc\x8e\xc9\x10\xed\x2a\xcd\xf8\x6e\xbb\x71\xad\xb6\x01\x87\x78\x85\xee\xf3\xc9\x16\x62\xfc\x30\x73\x8e\x35\x2c\xc7\x43\x53\xcc\xf8\xd8\xed\xee\xfa\xcc\x04\x2c\x10\xa0\xe5"}, -{{0xef,0xce,0x76,0x67,0xa8,0xef,0x91,0x22,0x8c,0xae,0xd1,0x4e,0xb4,0x77,0xa3,0x45,0xe5,0xe8,0x23,0x92,0x34,0x08,0x08,0x48,0x76,0x0e,0xd0,0x97,0x07,0x13,0xfa,0x86,},{0x91,0x93,0x05,0x5a,0x84,0xdf,0x1e,0xac,0xca,0x28,0xce,0x2a,0x08,0xc2,0xa0,0x7a,0x50,0xf0,0x4c,0x02,0x4e,0xcf,0x1f,0xe4,0xa4,0x7d,0x2e,0xfb,0xaf,0x63,0xed,0x58,},{0xe5,0xa6,0x31,0x24,0xdb,0x16,0x96,0xb6,0x41,0x40,0xb6,0xe9,0x61,0x2f,0xa9,0x58,0x7b,0x3e,0xef,0x71,0x01,0x09,0x39,0x8d,0x44,0xba,0x0c,0xa6,0x3c,0x0e,0xba,0xd0,0x6f,0x0a,0x6c,0x89,0x94,0xea,0x34,0xb3,0xa2,0xaf,0x91,0xa8,0x9b,0xf4,0x1a,0xe6,0x14,0xd7,0x72,0x7d,0x71,0x6f,0xd4,0x2f,0x8b,0x92,0xe1,0xac,0x64,0xfd,0xbf,0x03,},"\xaa\x1b\xc8\x0d\x7b\xcc\x1d\x94\xa2\x3a\x57\xce\xdf\x50\x27\x48\x24\x77\xdc\x46\xb8\x68\x90\xbc\x0e\x5a\xc2\x9a\xe6\xc9\x1b\xbc\x43\x13\x03\x48\x79\x73\x05\xf7\x55\x43\x58\x0a\x8a\x06\x9b\x34\x8a\x7b\xd8\xfc\x3e\x01\x52\x30\xb7\xc1\x94\x0c\x7f\x80\xa8\x2b\x12\x90\x09\x10\xdb\xcf\x06\x30\xda\x03\xf0\x81\xd4\x4c\x7f\x95\x5d\x4a\x11\x72\xf5\x6e\xcc\x7c\x5a\xc6\x46\x69\x6b\xff\xdf\x4e\xb6\xd8\x8b\xdd\x9c\xc3\x84\x35\x28\xb7\x25\x83\xab\xb3\xba\xd0\x2e\x56\xef\x76\x46\xee\xd5\x13\x95\x51\xcd\xeb"}, -{{0x88,0xfc,0xca,0xa9,0x6a,0xd8,0x84,0xd1,0x16,0x5b,0xe7,0x1d,0xd0,0xc4,0xf5,0xf8,0xf4,0x42,0x1c,0x60,0xfb,0xfa,0x49,0x8b,0xfe,0xe9,0xb9,0x67,0x46,0x24,0x43,0xbd,},{0xc7,0x5c,0xb0,0xe0,0x23,0x7b,0x45,0xb8,0x65,0x6e,0xea,0x9f,0x3d,0x1a,0x9d,0x4a,0xcd,0x01,0xa1,0x03,0xaa,0x26,0x9b,0xb2,0x4f,0xd5,0x41,0x22,0xfd,0x81,0xf2,0xac,},{0x27,0xd3,0xa1,0x97,0xcc,0x99,0x94,0x21,0x20,0x63,0xbc,0xe8,0xd7,0x99,0xe7,0x7b,0x68,0x53,0xb7,0x35,0x5e,0xbe,0x36,0x9b,0xcf,0x18,0x89,0xa4,0x18,0xa8,0x2c,0xaa,0x3a,0x79,0x87,0xa6,0x63,0xf6,0x21,0xde,0xfe,0x86,0xb3,0xac,0x4a,0xd4,0x4f,0xae,0xed,0x16,0xc9,0x11,0x6a,0xce,0x28,0xfc,0xcf,0x91,0x55,0x57,0xfa,0x77,0x99,0x03,},"\x9d\x0e\xac\x98\x55\x6b\xfa\x86\x72\xc3\x57\x05\xd1\xd6\x1a\xc4\xd0\xfc\xa1\x9d\xc0\xd9\x93\x01\x58\x77\x85\x7d\x27\xfd\x80\xf7\x4a\xca\xce\x66\x6c\x56\x34\x85\xd8\x1e\x53\x60\x3a\x6a\xef\x40\x87\x5f\xa5\x51\xcc\x10\x5f\x2c\xc1\x0b\x39\x69\x46\x79\xcd\xf4\xa6\xb0\x73\xbc\x88\x64\x5f\xc5\x1a\x36\xda\x17\x9d\x3d\x1e\x3c\x77\x22\x45\x4c\x5e\x73\x57\x7c\x61\xaa\x7d\x14\x8c\x4b\xa5\x0e\xa4\x6c\x56\xa1\xc3\xb3\xb3\xc4\x70\xf9\x31\x00\x49\x4e\x08\xbc\x55\x14\xac\x76\x3a\x85\x48\x3c\x42\xc7\xcd\xc2\x7c"}, -{{0x67,0x0b,0x30,0x62,0x6f,0xe3,0x67,0xd8,0xb4,0x5f,0x43,0x73,0x3d,0x6f,0x25,0xb3,0x7e,0xcc,0xbc,0xb5,0x51,0x96,0x3f,0x0a,0xc8,0xb6,0x66,0xb4,0x80,0x41,0xc7,0x2d,},{0x65,0xaa,0x4c,0x6d,0x4b,0xa0,0xab,0x34,0xbc,0x75,0xb3,0x9f,0x09,0x52,0x7c,0xa6,0xf2,0x42,0x5f,0x52,0x41,0x5c,0xdf,0xfd,0xf2,0xdf,0xf2,0x73,0xf8,0xea,0x61,0x2c,},{0x1b,0x6b,0x43,0x77,0xd2,0xb9,0x8e,0x0f,0x9d,0x24,0xae,0x8d,0xfe,0x30,0xe2,0x39,0x6e,0x20,0x04,0x38,0x0d,0x34,0x31,0x48,0x8e,0x58,0x43,0xcf,0x8d,0x2d,0x7a,0x00,0x70,0xab,0x21,0xf8,0xa3,0xb5,0x1c,0xe8,0x4d,0x2f,0x4b,0xa2,0x09,0xf7,0x39,0xf9,0x22,0xbe,0xbf,0x79,0x80,0x96,0x69,0x3f,0x56,0x22,0x87,0x3d,0x79,0xae,0x6f,0x04,},"\xd0\x0b\xcc\xa7\xe1\x84\xd1\x0e\x1f\x1f\xe4\x20\xb5\x06\x39\xe1\xd5\xde\xba\x52\xa7\x51\x23\x6e\x68\xc5\x9b\xb4\xbf\xf9\x80\x2f\x5f\xc1\x65\xed\x42\xfd\x6d\x53\x46\x70\xa7\xc6\xfb\x60\xe4\x30\x7d\x94\x79\x15\xa2\x48\xbf\x2f\x93\x46\x5c\x2c\xb4\x4d\x8f\x45\x3d\x2c\x01\x5a\xfb\xc8\xed\x58\x81\x8e\xa5\x17\x26\xa2\x51\x77\x93\x0e\x9e\xa1\x92\xef\x45\x14\xf4\xbb\x0e\xb4\xe0\xf5\xd4\xae\x3c\x46\xe3\x57\xc8\x11\x87\xf7\xed\x17\x47\x33\xff\xf9\x59\xc3\xf9\xfa\xe6\x48\x6c\xfa\x13\x56\xa9\x56\x99\x21\x1d\xe5"}, -{{0x81,0x3c,0x4d,0xae,0xd6,0x7a,0x19,0x0d,0x68,0xbb,0x63,0x5d,0x73,0xaf,0x6d,0xa7,0x4f,0x32,0xfd,0xf7,0xc4,0x8c,0xca,0x6e,0x59,0x26,0x29,0x46,0xb8,0xe8,0xc7,0x1f,},{0xa2,0x09,0x54,0x57,0xd7,0x69,0x70,0x20,0xe2,0xb8,0x84,0xd9,0x5a,0x96,0x57,0x8c,0x2a,0x90,0x0a,0x76,0x66,0xac,0x0d,0xc7,0xbd,0x38,0xf1,0x93,0x1d,0x79,0x45,0xd8,},{0xb4,0x46,0x57,0x4f,0xf6,0xa4,0xbd,0x2b,0x57,0x2e,0x48,0x7c,0x4a,0xb4,0x43,0xca,0x64,0x10,0x75,0x16,0x8a,0xa4,0xe1,0x09,0x2f,0x71,0xf3,0x0b,0xdb,0x06,0x8c,0xe4,0x6a,0x39,0x5e,0xfe,0xe1,0xee,0x66,0x0b,0x9f,0xac,0x26,0xd5,0x41,0x09,0x72,0x2c,0x15,0xcd,0xb7,0x91,0xbf,0xb8,0x7f,0xff,0x63,0xc6,0x59,0x6a,0xd4,0xf2,0x27,0x0c,},"\xce\x54\xcb\x04\x50\xe6\x89\xa0\xdb\xef\x78\x53\x08\xb3\x17\x74\x72\xfc\xd6\xd3\x82\x03\xe5\x8a\x05\x90\xb3\x1f\xa2\x53\xf9\xea\x59\x0b\xe5\x36\x8a\x92\x2d\xe8\x8b\x63\x45\x01\x02\x68\x44\x43\xfb\x81\x89\xe6\x01\x28\x20\x03\x32\x3b\x89\xc8\x1e\x92\xea\xef\x2b\x5d\xdc\x4a\x55\xc5\x3f\xa3\xcf\xad\x41\x60\x24\x8b\x3c\x28\x6f\xf8\x0d\x31\xd1\x61\xb7\xb8\xde\xe7\x13\x55\x2b\x56\xf1\x50\x7f\xb7\x2e\xad\xfa\x89\x05\x4e\x9d\x16\x00\xac\x87\x4c\x4b\x0a\x96\x10\x04\xeb\x6d\x0d\x4b\xfd\x2e\xcb\x9c\x73\x4f\x00\xba"}, -{{0x84,0x00,0x96,0x2b,0xb7,0x69,0xf6,0x38,0x68,0xca,0xe5,0xa3,0xfe,0xc8,0xdb,0x6a,0x9c,0x8d,0x3f,0x1c,0x84,0x6c,0x8d,0xce,0xeb,0x64,0x2b,0x69,0x46,0xef,0xa8,0xe3,},{0x98,0xbe,0x21,0x00,0x19,0x93,0xa7,0xeb,0x1a,0x12,0x77,0xff,0x74,0xc1,0x55,0x04,0x18,0x3d,0x25,0xfd,0xfc,0xc0,0x5f,0x0d,0x4d,0xea,0x89,0x2f,0x6e,0x30,0x18,0x90,},{0x0a,0xd7,0x1b,0x00,0x25,0xf3,0xd9,0xa5,0x0d,0xb3,0x38,0x41,0x4d,0x6d,0x67,0x0e,0x77,0x99,0xb7,0x27,0x0a,0x84,0x44,0xf6,0xae,0x7f,0x12,0xae,0x7e,0xb7,0x1b,0xd0,0x3f,0xfd,0x3c,0x4f,0x36,0x63,0x1f,0x69,0xfd,0xcc,0x40,0x61,0x46,0x8f,0xf5,0x82,0xed,0xe4,0x95,0x24,0x3e,0xf1,0x36,0x1a,0x3b,0x32,0x95,0xfa,0x81,0x3b,0xa2,0x05,},"\xf7\xe6\x7d\x98\x2a\x2f\xf9\x3e\xcd\xa4\x08\x71\x52\xb4\x86\x4c\x94\x3b\x1b\xa7\x02\x1f\x54\x07\x04\x3c\xcb\x42\x53\xd3\x48\xc2\x7b\x92\x83\xac\xb2\x6c\x19\x4f\xd1\xcb\xb7\x9e\x6a\xfc\x32\xff\x68\x6b\x55\xb0\xb3\x61\x72\x18\xdc\xf3\x93\x16\xb4\xb6\x6b\x3c\x8c\x0d\x67\x26\x7a\x86\xdb\x8a\xdf\x37\x50\x80\x1b\xcf\x93\x27\xd4\xc2\x54\x41\xb9\x61\x97\x83\x2b\x4c\xde\x0e\xac\x3f\xf2\x28\x92\xa2\xf0\xbc\x17\xc2\xc2\x13\xc0\x23\x77\xa3\x33\xe3\x08\xed\x27\x16\x58\x04\x93\x83\xb7\xe2\xe5\x7b\x6b\x8b\x12\x55\x12\xe0"}, -{{0x62,0x88,0x72,0x20,0x35,0xd1,0xea,0x69,0x9b,0xc7,0xcf,0xdf,0x18,0xd8,0x96,0x25,0x42,0x31,0x80,0xb6,0x83,0xfa,0x74,0x63,0x9f,0x4f,0x30,0xf1,0x53,0x59,0xcc,0x85,},{0xe1,0x7f,0xaa,0x01,0x95,0x72,0x86,0x1a,0x06,0x4e,0x1b,0xc5,0x71,0x25,0x6d,0xea,0x14,0x68,0xf3,0xa4,0x85,0x90,0xa8,0x91,0x38,0xaa,0xa8,0x59,0x25,0x08,0x0c,0xd7,},{0x9d,0xec,0x92,0xb6,0xe8,0x9a,0xdb,0xe8,0xf4,0xe1,0xb5,0xe9,0x3a,0xc4,0xfc,0xf9,0x57,0xde,0x7d,0x19,0x70,0xa2,0x26,0x77,0x0e,0xc4,0xed,0xa6,0x47,0xc8,0xe3,0xb3,0xdf,0xfb,0x27,0x31,0xa3,0x9e,0x16,0xe4,0xa0,0x11,0x9d,0x36,0x62,0xa9,0x37,0xe5,0x60,0x52,0x24,0x91,0xec,0x7a,0x16,0x96,0xbe,0x04,0xc0,0x76,0xb1,0x2e,0x35,0x01,},"\x8b\x6c\xaa\xca\xc5\x1d\x89\x49\xfb\x86\xac\xbc\xb1\xb9\x9d\x85\x9f\xf6\x7c\x64\x14\x7b\xc1\x21\x69\x09\xdc\xab\x07\xee\x6e\xf0\x9f\x40\x38\x63\x32\x73\x94\x68\x9d\xc3\x4a\xbc\x77\x8f\xcb\x5c\x1f\x50\x91\xac\xf5\xa0\x8f\x9d\x84\x22\x11\xd1\xae\x2e\xb4\x0b\xe9\xbb\x8d\x66\x79\x07\x74\x71\x54\x7a\x6c\x71\xff\x77\xb5\x19\xd4\xb7\x10\x8e\x32\xbc\x46\x25\x1c\x60\xde\xe8\xe3\x32\xb6\x22\x93\x16\xe6\xd5\x7c\x22\xab\x82\x6f\xf1\xbc\x33\xf2\xb0\x21\x38\x07\xc1\x92\x80\xaf\x11\x0f\xd2\x6e\xe2\x74\x68\x20\x1c\xff\x49\xcb"}, -{{0x13,0x03,0x8a,0x3a,0x65,0xef,0x32,0x75,0x9a,0x9c,0xd9,0x03,0xac,0xb5,0x54,0xb2,0x52,0xde,0x00,0xe7,0xcd,0xb7,0x7b,0xbe,0xd1,0x97,0x0b,0x20,0x68,0x0e,0xe1,0x7b,},{0xb6,0xa3,0x08,0xe6,0x7f,0x9b,0x46,0xc6,0x64,0x99,0x45,0x6a,0xb5,0xcd,0x13,0x5c,0xb2,0xfe,0x84,0xa3,0x2e,0xb0,0x45,0x35,0x86,0x26,0x60,0x4d,0xa4,0x12,0x2c,0x8f,},{0x52,0x61,0x55,0x8e,0xcc,0x3c,0x98,0xff,0x36,0x35,0x1f,0x42,0xf5,0x04,0xca,0xd4,0xa3,0x2f,0xfd,0xa5,0xa7,0x44,0x56,0x09,0x60,0xb4,0xc1,0x06,0xe4,0x49,0x2f,0x02,0xe2,0x04,0x78,0x88,0x7a,0xfe,0xe4,0xf7,0x70,0xf0,0x55,0x97,0xa7,0xe3,0x88,0xca,0xce,0xae,0x80,0x5a,0xe3,0x51,0xe0,0xe4,0x5e,0x8e,0x57,0x8e,0x6a,0x6f,0xf2,0x0c,},"\xdd\xf0\x0b\x40\x33\xa2\xa0\x88\x02\x2d\xab\xe9\x33\x56\x43\x2f\x50\xdd\xc6\xc6\xe1\xa6\x59\xdc\x1a\x93\x12\x4a\x4c\x2f\xff\xfd\x18\x27\x65\xa2\xf5\x6c\x43\xea\x0b\xfd\x8d\xe8\x01\x50\x60\x88\x9a\xe6\x94\x1c\x3f\x3e\x25\x5d\x44\x21\xa1\xc3\x62\x01\xbe\x84\x6a\x27\x38\xa7\x1f\x12\x0c\xad\x59\x8c\xa8\x52\x7d\x70\xff\x8d\x5a\x09\x93\xb5\x5c\xb5\x15\x35\x17\x11\x0a\x41\x96\x2d\xaf\xf4\x22\x50\x15\x8f\x20\x96\xd1\xdd\xaf\x71\x86\xe5\x02\x98\xcb\xe5\x1f\xcb\x42\x9c\xbe\xa4\x11\x29\x3f\x8a\x7b\xd9\xcf\x06\x9f\xa2\x37\xe4"}, -{{0xb9,0xde,0x5b,0x06,0x3d,0x3c,0xa3,0xa7,0x73,0xf1,0x14,0x94,0x1b,0x2e,0x42,0x27,0xc0,0x75,0x11,0xc0,0xf5,0xc0,0x60,0x17,0xb9,0xc8,0x84,0x50,0x18,0xf2,0x34,0x32,},{0x52,0x95,0x24,0x3c,0x86,0x46,0xe0,0x96,0x67,0x4d,0xda,0x15,0x97,0x9b,0x32,0x2b,0x9d,0xd0,0xfa,0xf2,0x7d,0x02,0x4a,0x0e,0xd5,0x77,0x13,0x34,0xe1,0x17,0x9e,0xd2,},{0x92,0xba,0x76,0x0d,0x14,0xd1,0x41,0x5c,0xfa,0xf2,0x18,0xca,0x84,0x70,0x14,0x08,0x8a,0xe5,0x1a,0xd8,0x21,0x11,0x3a,0x6f,0x86,0x30,0x35,0x6f,0x7b,0xa8,0x5c,0x00,0x5e,0x23,0x30,0xf1,0x06,0x6d,0x0d,0xf4,0x64,0x80,0x60,0x52,0xa4,0x17,0x46,0x10,0x05,0x04,0x62,0xf3,0xe0,0x13,0xd7,0x02,0xe7,0xc7,0x71,0x85,0xa0,0x32,0x58,0x0b,},"\x94\x93\xcc\x23\x89\x6b\x84\x09\x60\x46\xae\x10\x53\xaf\xe3\x94\x99\xe9\x42\x42\x54\xb3\x66\xfe\x14\x3f\x4d\xa3\x21\xe2\xdc\x9e\x47\x84\x20\x8e\x12\xa5\x42\xd8\x99\x82\x8d\xde\x7e\xff\x62\x5a\x7f\x12\x41\x69\x90\xc2\x84\x1f\xfb\x09\x5b\xf9\x4c\x0c\x61\x0e\x5a\x66\x39\x18\xb6\x89\x03\x1c\xcd\x6b\x51\x93\x49\xd0\x4d\xe1\xc2\x12\xca\x2a\x9d\x7a\xbf\x52\xe1\xb4\xfd\x46\x7b\xb6\x65\xb6\x91\x9e\xf8\xf9\x16\x17\xe2\x05\x56\x5b\xf5\x66\x47\xe5\xf8\xd5\x08\xea\x20\x0a\x84\x46\x7f\x8f\xa1\x22\xe7\x4b\xc3\xb9\x97\x9f\x11\x74\xe5"}, -{{0x8f,0xf0,0x29,0x7c,0xc0,0x88,0x42,0xb5,0xe6,0x75,0x52,0xec,0x28,0x43,0xe0,0x43,0x53,0xa3,0x4d,0x74,0xef,0x89,0xb8,0x56,0x5d,0x97,0x20,0x5b,0x74,0xca,0x13,0x3a,},{0x0f,0x7e,0xf9,0x8c,0x5b,0xa4,0xaf,0x98,0x4d,0xfb,0x77,0xbc,0x4e,0x53,0x7b,0x2b,0x39,0xe6,0x27,0x3b,0xb3,0xe7,0xb9,0x5f,0xe1,0xb7,0xe6,0x78,0x19,0x52,0xbd,0x4a,},{0x07,0x83,0x73,0x7f,0x70,0x6e,0x6f,0xf3,0x66,0x14,0xf8,0x50,0x07,0x4f,0xca,0x1f,0x48,0x5f,0x24,0xfc,0xde,0x2a,0x28,0xaf,0x54,0x4f,0x37,0xab,0xd6,0x9b,0x7a,0x58,0x1d,0xef,0xd8,0xc7,0x71,0xb0,0x31,0xe1,0x08,0xd1,0x9d,0x78,0x8c,0x74,0xc5,0xf2,0x0b,0xb3,0xf1,0xc2,0x1c,0xd9,0x2b,0xe3,0x17,0xba,0xcd,0x8f,0x65,0x0b,0x49,0x05,},"\x2b\xdc\x3a\x48\x6c\x5e\x4e\xa6\x2d\xcf\xec\x8a\x9d\x4f\xcf\x9e\xa9\x49\x0d\xbc\xc7\x15\x61\x5d\x58\x49\x0a\x72\xce\x83\x3f\xa2\x23\x87\xca\x50\xa0\x05\x25\x08\xcf\x0a\xff\x1c\xa7\x27\xf0\xfe\xd4\x6f\xfa\x7d\x3c\x8e\x23\xc5\xbb\x01\xd4\x7e\x90\xff\x06\xd3\x85\x8a\x55\x7d\x99\x26\x48\x15\x79\xda\xf4\x38\x4a\xea\x50\xe9\x6e\xc6\x15\xd2\xa3\xbf\x3c\x11\x22\xf1\xf2\x4d\xd6\xed\x98\xa5\xde\x42\x18\x83\x58\x9c\x21\x39\x98\xca\x54\x32\x37\x3e\x68\xbb\xbe\x89\x42\x8c\xa9\x88\x5d\x05\x93\xd5\xe6\x21\x51\x16\xb8\x26\x63\x86\x45\x2b"}, -{{0x05,0x0d,0x55,0x3d,0x28,0x2d,0xca,0x32,0x69,0xc8,0x3c,0x18,0x17,0x68,0xec,0x06,0x7b,0x81,0xc9,0xfe,0x0c,0x94,0xf2,0xa0,0xeb,0xbb,0x0c,0x94,0x2d,0x0f,0xcd,0x7c,},{0x63,0xe2,0x30,0xb0,0x03,0xc5,0x3a,0x56,0x72,0xe8,0x32,0xff,0x7f,0x24,0x43,0x0b,0xe2,0x23,0xe4,0x97,0xde,0x84,0x02,0x33,0xf5,0x95,0xa3,0xe2,0x00,0xc7,0x12,0x7e,},{0x3f,0x0e,0x83,0x76,0x5b,0x31,0xbb,0xe8,0xe1,0xfb,0x92,0xe9,0x67,0x8d,0x6c,0xde,0x57,0x1a,0x03,0xba,0x7f,0x1d,0xcc,0x11,0x28,0x46,0x1f,0x70,0x85,0x25,0x45,0x7f,0x4e,0x0e,0x23,0x53,0xaa,0x2b,0x59,0x8c,0x06,0x3f,0xf1,0xbf,0xfd,0xac,0x91,0x6b,0x5a,0x22,0x00,0x65,0x51,0x56,0x90,0x4b,0x05,0x85,0x57,0x7a,0x16,0x28,0x56,0x0d,},"\x15\xe1\x3b\x8c\x01\x00\x4f\x6a\xa5\xb2\x36\xdb\xb2\x81\x67\x7f\x74\x6d\x81\xe5\x48\xe0\xaa\x80\xf0\xe4\x14\x52\x15\x21\xd8\x56\xcd\x69\x4e\x7c\x91\x52\xbb\x5e\x43\x77\x6b\x60\xf6\xb5\x60\xed\x1a\xd3\xe4\xb3\x90\xdb\xf3\xe4\x6e\xf9\x25\x74\x43\xf3\x9c\x14\x9e\x02\x40\xa0\x2d\x02\x1e\x1e\x3d\x7d\x04\x6b\x26\xfd\x00\x4e\xee\x7c\xa1\x6a\x80\x59\xe1\x26\xc7\x4c\xb3\xf2\x19\x4d\xb4\x7b\xf6\x04\x65\xec\xef\x5c\x70\x4d\x2e\x2c\x75\xe2\xe5\x00\x60\xea\x2a\x31\xcb\x72\xb7\xb3\xc6\xb1\xb5\xec\x72\xab\x38\x00\x40\x85\x28\x1a\x22\xfe\x86"}, -{{0x69,0x49,0x7c,0xd7,0xb4,0xe8,0x68,0xcf,0xa0,0x32,0x8d,0x92,0xbd,0x60,0x52,0xd7,0x72,0xb2,0x76,0x73,0x95,0xc1,0x45,0x95,0xb2,0x79,0x85,0x1a,0x9c,0xdd,0x31,0xaa,},{0x5d,0x27,0x6d,0x62,0x6e,0x23,0x0d,0x18,0xe7,0xbc,0xd6,0x11,0x41,0xcb,0x93,0xc9,0x0e,0xf0,0xf7,0x9e,0x01,0x32,0x12,0x12,0xd8,0x38,0xec,0x71,0x45,0x7b,0x1a,0xac,},{0xbe,0xaf,0xa5,0x83,0x40,0x96,0x09,0x08,0xe8,0xd8,0x6e,0x40,0x32,0x9e,0x3a,0x45,0x23,0xfc,0x7b,0xe7,0x70,0xad,0xdb,0x86,0xe3,0x4c,0x37,0x72,0xf8,0x4c,0xd9,0xfb,0x33,0x8d,0x1f,0x3b,0x65,0xbf,0xcd,0xb0,0x9f,0x35,0xc6,0xda,0x36,0xd1,0xa3,0xad,0xf8,0xf9,0x1f,0x1f,0xfd,0x57,0x82,0xcc,0x83,0x02,0x06,0x43,0x3a,0x08,0x41,0x0d,},"\x53\xcd\x08\x0a\x0c\x61\xf1\xa0\x93\xd3\xb3\xa7\x45\x71\xc2\x96\x30\x3f\x36\x3b\x41\x07\xed\xbe\x88\x0b\x7a\xa9\xdf\xe4\x4a\xb5\xd5\xdc\x5f\x74\xbe\x9c\x8d\x87\x6f\x04\xd7\x54\x65\x34\x91\xab\x51\xb1\x35\xfc\x95\x3f\x71\x28\x7b\x62\xff\x41\xb6\x7c\x74\x2b\xd3\x44\x56\x71\xa9\xd4\xf2\xdc\x17\x4c\xa1\xb0\x33\x5f\x78\x62\x7a\x0d\xd4\xb3\x06\x50\x50\x41\x78\x03\x9e\x73\x93\x63\x85\x10\xff\xe8\x40\x91\xb5\x72\x98\xd3\xac\x90\x01\xc3\x67\xc1\x45\x2f\xbc\xb3\x3d\xc5\x4a\x5d\xc3\x16\xfb\x2a\x52\x70\x76\x4a\x2a\xc8\x20\xa0\xb6\x3f\xbd\xc6"}, -{{0x21,0x65,0xa4,0x86,0xb6,0x12,0xbb,0xff,0x52,0x9c,0xd0,0x03,0x46,0x96,0x4a,0x3c,0xb8,0xcd,0xcf,0xfa,0x51,0xdc,0x3d,0x52,0x4d,0xd5,0xad,0xc5,0xac,0x93,0x6d,0x68,},{0x7e,0xbc,0x83,0x9a,0x46,0x5e,0x14,0xf5,0x89,0x24,0x76,0xe4,0xa1,0x3b,0x39,0x88,0xf8,0x3b,0x3c,0xd2,0x7e,0xf7,0x9e,0x19,0x3f,0x86,0xfa,0x16,0xf3,0x4a,0x1c,0xe1,},{0x7e,0xc6,0xfb,0xa5,0x6b,0xa5,0x24,0x60,0xa1,0xb4,0xf2,0x73,0x86,0x89,0xc1,0x88,0x3d,0xda,0x9a,0xaf,0xfc,0x8b,0xde,0x17,0xcb,0x60,0x29,0xbd,0xce,0x3a,0x0e,0xbe,0x2f,0xff,0xda,0x55,0x93,0x9b,0x70,0xbb,0xd0,0x7f,0xdb,0xf6,0xfc,0x5c,0xda,0x87,0xfe,0xd8,0xba,0x58,0x57,0x5f,0x89,0x4a,0x36,0x6e,0x45,0xe5,0x70,0x5e,0xea,0x09,},"\xb7\x28\xda\x7a\x36\x16\x7c\x60\x85\xbd\x2d\x96\x2c\xf6\x39\x59\xfa\xcd\x95\xc9\xad\x45\x42\x02\x8a\xfb\xa9\x0e\xc9\xc6\xc0\x76\x0b\xda\xe9\x35\x42\x9c\x3f\xeb\x39\x33\xe2\xf0\x00\x42\xc6\x72\xad\x2c\xd7\x34\x8d\x92\xbc\x33\xf8\x17\x51\xe2\x94\xae\x91\x71\xb9\x45\xb1\x93\x14\x4e\xf8\xac\xb9\xa1\xbd\x9a\xbf\x04\x75\xce\x0d\x0a\xc7\x89\xb2\x00\xc3\x2e\x9c\x9a\x27\x36\xb1\x68\x36\x9c\xe5\xf9\x7b\x1e\x8d\x2e\x79\x00\xe1\xa7\x59\x17\x84\x41\xf1\xfc\x43\x05\x64\xae\x12\x9b\xae\x78\x57\x74\x05\x11\xa6\x68\xf3\x2c\x0a\x3b\x07\x7a\x9d\x8b\x19"}, -{{0x1c,0x64,0xad,0x63,0xdd,0x14,0x70,0x34,0x59,0x8e,0x12,0x8f,0x74,0x06,0xec,0x05,0x30,0x74,0x6e,0xa1,0xc5,0xb7,0x2e,0xcf,0x79,0xe8,0x88,0x06,0x54,0x86,0xfa,0x1b,},{0xba,0xa6,0xbc,0xc1,0xc3,0xd8,0xd3,0xb1,0x1f,0xfc,0x15,0x87,0xad,0xdd,0xc5,0x8b,0xfd,0x96,0xc2,0xb9,0x92,0xb6,0xc6,0xf5,0x9f,0xcc,0x50,0xcc,0xbc,0xdd,0x0e,0xb9,},{0x74,0x77,0xe5,0x41,0x58,0xf1,0x3b,0x71,0x28,0xc0,0xa1,0x10,0xca,0x6b,0x65,0xf4,0x25,0x14,0xfb,0x70,0xcd,0x5c,0xf2,0x8a,0x8b,0x1c,0xc6,0x11,0x0e,0xa0,0x6f,0xcf,0x94,0x29,0x0d,0xa1,0x3f,0x85,0xa1,0x1c,0x23,0x51,0xd3,0xbb,0xcc,0xbb,0x4c,0x64,0xe0,0x21,0x5d,0x6d,0x0f,0x00,0x99,0xe7,0xf2,0x7b,0xc9,0x4e,0x94,0x9b,0x15,0x0b,},"\x9e\xbd\x8e\x33\x78\x93\xbb\x05\x3e\xf2\xb9\xe3\x26\x9d\xf5\x48\x48\x49\x4f\x03\xcd\x63\x57\x6b\x33\xe6\x4b\x10\x80\xbe\x4b\xe0\x15\x26\x4a\x40\x3f\xb9\x60\x2b\xbf\x90\xca\x19\xb2\x41\xa9\xb6\x68\x63\x90\x9b\x90\x08\xce\x1b\x2f\xfc\xf2\x36\xef\xa4\xc2\x66\x8f\x0f\x47\xdb\x9f\xf5\xfa\x15\x7d\x9c\xb6\x05\x41\x2b\xe7\xdd\x8b\x07\xea\x87\x8c\xcc\xae\x6b\xf5\x0f\x93\x5b\x86\xd1\x9e\x1b\x64\x8b\x69\xe5\x28\x55\x3a\x56\xd8\xaf\xb7\x82\x21\xad\x53\x30\x7b\x7a\x4e\xc8\xd2\xfd\x48\x61\xb5\x5d\xc5\xda\xe8\xe9\x3e\xf3\x87\xfb\xbe\x0b\x4c\xe7\xf7\x88"}, -{{0x55,0xab,0xbc,0x5d,0xac,0x41,0x28,0x13,0x4d,0xc8,0xc6,0x01,0x8a,0x21,0x3e,0xd4,0xb6,0x0f,0xcc,0x8e,0x90,0xcb,0xd4,0x1d,0xb2,0xd2,0x1e,0xda,0x53,0x73,0xe9,0x36,},{0x25,0x1a,0xfa,0xa2,0x64,0x69,0x26,0xb2,0xa3,0x71,0xf2,0xa0,0x9d,0x58,0x65,0xb9,0x8c,0x9a,0x5e,0xb6,0xca,0x04,0x7c,0xd0,0xd8,0xee,0x36,0xe5,0xe0,0x41,0x69,0x74,},{0xf6,0xa6,0x1c,0x2e,0x66,0x1a,0x9e,0xb7,0xbd,0xe1,0x82,0xe3,0x8e,0xc9,0x9a,0xf9,0x85,0xf6,0x16,0x98,0xa5,0xd7,0xfa,0x43,0x0d,0x16,0xe3,0xf1,0xa9,0x37,0x09,0xb7,0x55,0x22,0x32,0x0d,0xe4,0x8a,0xfc,0xc5,0x95,0xab,0x20,0x91,0x22,0xae,0x0c,0xe1,0x32,0xcd,0xf4,0xb0,0x39,0x17,0x46,0xe7,0xff,0x34,0x11,0x77,0x57,0x0c,0x81,0x08,},"\x47\x01\x0e\x13\x98\xad\x55\xfa\xbe\x37\x1d\xd8\x64\x8f\x76\x8d\x90\xdf\x4b\x96\x5a\x3b\x39\x61\x00\xb3\x03\xb4\x0a\x17\x51\x8b\xed\x6d\x86\xb0\x9f\x73\x4a\xb7\xc1\x0b\x5f\x3a\x01\xb5\x3d\xee\xc5\xf8\x53\x4b\x70\xc7\x9f\x3f\x29\xb2\x84\xfd\xec\x48\x6f\x22\xf4\x4c\x22\xcc\xd5\xc6\x46\x35\x94\x41\x52\x67\xba\xa6\x11\xf7\x0b\x1b\x31\x6c\xaa\x1b\x68\xb5\xe0\xe9\x9b\x31\xc5\xbb\x0c\xe1\x36\x79\xa2\x3c\x31\xa6\x39\x99\x69\x81\x64\xcb\xf3\x7d\x10\x3b\xa9\x24\x90\x18\x8b\xe5\x99\x37\xf1\x23\x04\x3e\xc7\x86\xef\xe3\xd4\x11\xf9\xb0\x62\x3a\x6a\xd9\x72"}, -{{0xf2,0xdc,0xf4,0xa1,0xa0,0xd4,0x6d,0xdb,0x2d,0x72,0xf8,0xfd,0xd8,0x0b,0xbe,0xc5,0xb7,0xde,0xa5,0x91,0x3d,0xa4,0x96,0x6c,0x2f,0x4d,0x12,0xc2,0x61,0xf0,0xbf,0x98,},{0xd3,0x95,0x70,0xa2,0x5c,0xa5,0x9f,0x22,0x57,0xf9,0x3f,0x96,0x60,0x0d,0xf4,0xf6,0x3e,0x68,0x4b,0xf6,0x3a,0xe8,0xdf,0xfd,0x91,0x4e,0x46,0x29,0xc3,0xd5,0x09,0x5f,},{0x42,0x88,0x2a,0x81,0x1d,0xad,0x2d,0x85,0x18,0x85,0xe4,0xcb,0xe9,0x04,0x47,0x08,0xd9,0x1a,0x86,0xf1,0x5d,0xfa,0x1d,0x66,0xc3,0xeb,0x30,0x43,0x14,0x53,0x1f,0x30,0x15,0x20,0x8c,0x71,0x1b,0x9b,0xdb,0xc5,0xfb,0x23,0x39,0x51,0xe5,0x69,0xb5,0x9d,0x34,0xe4,0x15,0xee,0xc4,0xb3,0x7f,0xfd,0x37,0x4d,0x41,0x2c,0x9a,0x36,0x0d,0x0c,},"\x3b\x00\xe8\x08\xfc\xa4\xc1\x16\x51\xd8\x53\xd6\xb9\x0f\x95\x2c\xcf\x56\x47\xe1\x02\xd4\xee\x0a\xd7\xa5\xd1\x81\xd5\xb4\x25\x8c\x52\x3c\xd3\x9e\x3d\x98\x25\x29\x8d\x84\xc8\xcb\xa0\x9f\x43\xdb\xba\x11\x99\x88\x22\x2c\x76\x05\x9c\xaf\x17\xb4\xbf\x99\x31\xc4\x5e\x61\x74\x48\xae\xad\xe1\x51\x18\x14\x97\xb2\x45\x52\x36\x7e\x52\xbc\x45\xac\x79\x08\x88\x06\xd3\x36\x82\x07\xaa\xfe\xfd\x30\x57\x84\x5d\xce\x81\x9d\x5a\xaa\xa7\x7b\x21\x8e\x2a\xed\x3d\xa7\x6d\x40\xc1\xf0\x76\x99\xf8\x17\x2e\x4a\x5c\x80\x3f\x7a\x2a\xce\xb9\xa4\x7a\x89\x52\xe1\xb2\xf0\x53\xf2"}, -{{0x22,0x46,0xbf,0xb0,0x61,0x55,0x85,0x9e,0x10,0xa7,0x48,0xff,0x8f,0x59,0x19,0xad,0x5d,0x1d,0xaa,0xb7,0x56,0xf0,0x10,0x57,0xb7,0x90,0xd0,0x74,0x74,0x77,0x5f,0x4f,},{0xfa,0x63,0x49,0xb6,0x2d,0xc8,0xc6,0xa2,0xfe,0xee,0xf6,0xff,0xc3,0x3a,0xe0,0x85,0xc6,0x49,0x79,0x5c,0x1c,0x9d,0x98,0x98,0xe7,0x5c,0x13,0xae,0x16,0x25,0xdb,0x34,},{0x2b,0xe4,0x91,0x5a,0x35,0x2f,0x77,0x85,0x48,0x30,0x46,0xd8,0xae,0x96,0x25,0xb8,0xb6,0x32,0x57,0xaf,0x57,0xc0,0x73,0x69,0x12,0x56,0xee,0x07,0x6d,0x6e,0x1b,0x97,0x2a,0x10,0x1f,0x55,0x1c,0x70,0x5d,0x3f,0x96,0x15,0x7c,0x33,0xb5,0x6e,0xa0,0x49,0xbe,0x4a,0xf4,0xdc,0x56,0x1c,0xbe,0x3c,0x1e,0xc5,0x07,0x2d,0x7f,0x13,0x4e,0x07,},"\x63\xee\x1c\x7b\xbb\x15\xce\xbe\x1c\x22\x53\x2d\x48\x16\x82\x75\x4b\xda\xf5\x8b\x8b\xc9\x97\xae\x30\xa3\x4c\x9d\x23\xc3\x3f\x16\x90\xc3\x46\xab\x0a\x73\x65\xff\x62\x45\x74\x24\xb6\x10\x5f\x84\x21\xec\xa0\xce\x3c\x63\x0a\xcf\xeb\x9a\x1c\xc4\x16\x39\x0e\xdf\x49\x20\xe2\x2b\x23\x67\xe9\xfb\x5d\x2a\xb2\x5b\xee\x56\xda\x03\xea\x55\xe3\xf5\x78\x82\xd4\x8b\x89\x22\x93\x14\xd7\x34\xcb\x83\xc7\x9f\x4e\x17\xee\x64\xba\xe6\xf7\xad\xdb\xe9\xb5\x25\xfc\xd0\x3a\x91\x40\x9a\x2d\xde\x90\x77\x51\xdb\x8c\xc9\x7e\x08\xd0\xea\x89\xc4\xd1\x87\x18\xd2\x6d\x0b\x89\x7b\x64"}, -{{0xc0,0x88,0xa3,0xdd,0x2c,0xb8,0xbd,0x5d,0x68,0x4d,0xb8,0x53,0x8d,0xc2,0x24,0x73,0xb6,0xf0,0x14,0xf6,0x4f,0xe8,0x6a,0xf1,0x68,0xb4,0xbb,0x01,0xb9,0x0a,0x1d,0xd0,},{0xaa,0xd6,0x15,0xa9,0xc2,0x87,0x59,0xf0,0x3d,0x37,0x3a,0xbe,0x66,0x66,0x91,0xde,0xad,0x8b,0x84,0xf9,0xb8,0xb5,0x0a,0x67,0xf8,0xf0,0xaa,0x4a,0x70,0x15,0x80,0xd1,},{0x3b,0xb4,0x59,0xd1,0xac,0x57,0x5a,0x18,0x0c,0x17,0x28,0xd8,0xb8,0x92,0x49,0x70,0x49,0x2a,0x0c,0x8d,0x2a,0x37,0x8c,0x29,0xd1,0xd4,0x17,0x85,0xc8,0x37,0x9a,0x58,0xe2,0xba,0x36,0x06,0x78,0x5e,0x1c,0x5d,0xa2,0x9e,0x55,0x27,0x55,0x2b,0xc6,0xdc,0x89,0xa2,0xb6,0x9c,0x27,0xfe,0x51,0xed,0x25,0x3a,0x9f,0x3b,0x56,0x5b,0x27,0x00,},"\x74\x90\x6a\xe0\x5a\x5a\xf8\xe9\x96\x8b\x6f\xeb\x49\x85\x69\xd6\x34\x5a\x24\xf9\x71\x1b\xef\xb1\x36\xe6\xc3\xb5\xed\x49\x33\x9e\x59\xa7\x93\x8b\x4b\xa1\xa1\x18\xf1\x69\xb9\xac\xe0\xf7\x84\x2a\x26\xa6\x45\xf1\x4c\x0a\xd2\x2e\xbb\xcd\xa9\x3e\x67\xe4\xc3\x48\xef\xc3\xd9\xec\xbb\x14\x19\xe6\x26\x2d\x04\x36\xa5\x8e\xa8\x2c\x22\x02\x38\x90\x65\xcc\xf6\x7c\x4f\x55\x0e\x45\xb5\xf6\xa1\x2a\x6c\x01\x1b\x2e\x0a\x30\x10\x1d\x5c\x62\x32\x8b\xbf\x99\xc8\xc9\x55\x63\xa6\xe3\x3b\xdd\x9c\xce\x72\xb1\xf7\x20\x13\x9c\x2f\xd3\xe0\x49\x13\x14\x6a\xe5\xba\xc5\x28\x8e\x0e\x3e"}, -{{0x45,0x66,0x7d,0x1e,0x7b,0x59,0x10,0x97,0x9c,0x4a,0x32,0x83,0x17,0x96,0x83,0x71,0xc8,0x64,0xd5,0x64,0xa6,0x61,0xc5,0xcc,0xe5,0x57,0xc9,0xec,0xc6,0x1b,0xab,0x9e,},{0xed,0xcd,0xf5,0xe1,0xa1,0x70,0xe0,0x0c,0x8c,0x68,0x7e,0x7e,0x9c,0x18,0xf9,0x89,0x3b,0x5f,0xe4,0x95,0xcd,0x29,0x77,0xce,0xb7,0xf4,0x46,0xc0,0x14,0x9a,0xa9,0xd3,},{0x6d,0xe6,0x68,0xf1,0xca,0x6f,0x29,0x28,0x14,0x62,0x52,0x89,0xa0,0x80,0x80,0x20,0xc8,0x7c,0x89,0xac,0x94,0xf5,0xb0,0x50,0x8e,0x55,0x7b,0xdf,0x80,0x00,0xa5,0xca,0x80,0x8f,0x02,0x1c,0x96,0x79,0xb5,0x0e,0xe2,0xf3,0x20,0x06,0x4c,0x95,0xa4,0x64,0xa8,0x43,0x93,0x79,0x82,0x8c,0x3b,0x76,0xcf,0xa7,0x66,0x45,0x5e,0x12,0x8c,0x0b,},"\xcd\x66\xce\xc4\x76\xc8\x7c\x8d\xbf\x47\xec\x91\xda\xc4\x8f\xb5\xb4\x2d\xb1\x28\x2a\x57\x3e\x0a\x5c\xf0\xb9\x17\x68\x98\x66\x08\xe1\xd7\xeb\xd0\x5f\x52\x51\xbc\xf8\xb4\x7a\x17\x09\x32\x29\xac\xef\xbd\x44\xbe\xb2\x1c\x0c\x0c\x92\x8d\xd3\xcd\x3f\x89\x66\xec\xce\x69\x10\x33\x1c\x50\x8e\xa7\x6b\xaf\x90\x4d\x8c\x21\xf6\xc1\x7c\x2c\x58\xd0\x0a\xfd\x32\x59\xb8\xbf\x79\x4c\x14\x6b\x12\xb9\x95\xcd\xdd\x1c\x42\x89\xc5\xbe\x31\x68\xeb\xd6\x16\xb3\x84\xc2\x81\xce\x1b\x38\xa1\x0e\x18\x07\x80\x88\x53\xc6\x81\xa6\x40\xa0\x09\xb4\xd2\xac\xd7\x93\x4f\x8c\x6d\x07\x57\x81\x61"}, -{{0x24,0x89,0x74,0x28,0xae,0x65,0x46,0xd8,0x5b,0x31,0x90,0xeb,0xe3,0xf1,0xf7,0xbf,0x7c,0x71,0x25,0x28,0xac,0x85,0x1a,0x58,0x8b,0x07,0xd5,0xc8,0xf9,0x4e,0xec,0xd1,},{0x5f,0x34,0x8f,0xe3,0xea,0x5b,0x2c,0x02,0x3d,0x0a,0xf7,0xed,0xe6,0x0e,0x55,0xf9,0x1a,0xa5,0x51,0x99,0x69,0x9d,0xa1,0x5a,0x11,0xc3,0x79,0x1d,0x68,0xd7,0x10,0xbd,},{0x1b,0x5e,0x75,0xde,0xf4,0x9f,0x51,0xd6,0xb2,0xde,0x00,0x8c,0x71,0xfc,0x1a,0x90,0x9b,0xd4,0x2c,0xa8,0x13,0x29,0x8d,0xce,0x4e,0xee,0xf7,0x17,0x81,0x5d,0x7a,0x6c,0x07,0x8c,0x2f,0x3d,0x9a,0x3f,0xce,0x1a,0xb5,0xb3,0xad,0x8e,0xf8,0xd4,0x5c,0xdf,0x2e,0xb4,0x90,0x1c,0x32,0xee,0xa2,0xd5,0xe0,0x18,0xdc,0xf2,0x83,0x3c,0xad,0x0c,},"\x52\x01\xd9\x72\x5f\x1d\xff\xa1\x86\x3f\xa4\xd8\x4c\x30\x18\x61\x14\x1a\xcd\xfb\x64\xbe\x1f\xbf\xdd\x5b\x93\x86\xdb\x20\xef\x39\x40\x99\xee\xbc\xfd\xfe\xcc\x62\xc6\x26\x86\x07\xa8\x4d\x55\xc5\x5c\xd0\xef\xdc\x37\x2e\xcf\x30\x67\x34\x3e\x7b\x07\x31\xc2\x68\x54\x61\xe2\x4b\x95\x3f\x99\x94\x9e\x59\xba\x3e\x67\xed\x0f\x08\x48\x31\x37\x93\x96\x2a\x29\x2c\x45\x98\x14\xc5\xe2\x86\x90\xec\x1f\x45\x17\x1f\x1a\xba\xb8\x6f\xdd\x14\x56\x8b\x00\xca\xf4\x85\x81\x11\x5e\xe5\xea\x83\xb0\x00\x28\x2f\xbb\xf0\xc0\xb2\xa1\x11\x60\x39\xa3\x5c\xfa\x3f\x20\x14\x22\x20\x7a\x3d\x49\x48"}, -{{0x7b,0x04,0xac,0xa7,0xcf,0x92,0x62,0x16,0xcb,0x96,0x0a,0x38,0x90,0x78,0x63,0x39,0xd0,0xa6,0x15,0x96,0x76,0x80,0x19,0x01,0x23,0xfd,0xa3,0xb6,0x0c,0x6a,0xeb,0x11,},{0xcd,0xbc,0x3e,0x70,0xe4,0xe8,0xfd,0x13,0xd0,0xcc,0xe2,0x85,0x2a,0x3b,0x93,0x72,0xc3,0xa6,0x16,0x0c,0xd6,0xde,0xab,0xa9,0x0f,0x9b,0x30,0x22,0xf7,0x0c,0x91,0xf9,},{0x25,0xd2,0xd3,0x61,0x75,0x1d,0x52,0xb4,0xfe,0x66,0xea,0x18,0xe4,0xb9,0x86,0x6b,0xde,0x3d,0x12,0x1a,0x73,0x12,0xfd,0x9e,0x28,0xa1,0xe2,0x95,0xe0,0x87,0xe3,0x17,0x6c,0x94,0xc8,0x74,0xa2,0xe8,0x16,0x00,0xf2,0x4c,0x46,0x54,0xf4,0x3d,0x1b,0x67,0xd4,0x7b,0x64,0x82,0x26,0x48,0x59,0x0c,0xe5,0xce,0x44,0xf3,0xb5,0xdd,0xc5,0x02,},"\x1c\xb0\x96\x24\xb1\xf1\x4a\x02\x60\xc7\xf5\x6d\x8c\x60\xb5\xfe\x45\x83\x71\x14\x23\x25\x51\xef\x59\x66\x38\x6e\x0c\x2b\x44\x1b\x75\xcf\xdb\x8d\xf2\x18\x57\x85\xd2\x2c\xf5\x26\xfa\x9d\xf7\xfd\x45\xd9\xd8\x38\x81\xb6\x6c\x1f\xee\xe0\x91\x3e\x23\x81\x21\xee\xdb\xb7\xab\x50\x4d\xa0\xbe\xe8\x99\x80\x16\x68\x45\x35\x03\x19\x91\xf1\x1b\xfc\xd9\xb9\x56\x90\xaa\xd2\xd1\x9b\xd6\xa9\xde\x18\x44\xed\x13\x62\x30\x2d\xf4\x21\x72\x30\xb2\x5c\x05\x52\xce\x27\x75\x34\xc6\x50\xca\xe5\x26\x57\x7f\x25\xd8\xb1\xfe\x9f\x9f\xeb\xca\x2c\x81\x46\x70\xd4\x80\x5b\x21\xad\xef\x85\x2d\xaf\x94"}, -{{0xea,0x73,0xbf,0x64,0xa1,0xa9,0x78,0x77,0xc3,0xc3,0xe7,0xca,0x46,0x44,0xb7,0x1a,0xaa,0x66,0x31,0x4c,0x8f,0x1b,0x66,0xba,0xfa,0xeb,0xd5,0xed,0xfb,0x88,0x8b,0xcd,},{0xca,0xac,0x93,0x90,0x2e,0x57,0x64,0xad,0xe4,0x72,0x94,0xed,0xd5,0x1f,0xaa,0x14,0x62,0x09,0x40,0xc6,0x68,0xb5,0xc1,0xc3,0x92,0xa6,0x92,0x83,0x25,0xd4,0xc3,0xfd,},{0xbd,0x86,0xcb,0x9c,0x70,0xa0,0x55,0x27,0x9a,0x86,0xa9,0xe6,0x48,0x70,0x98,0x8b,0x8a,0x73,0x45,0xc3,0xcd,0x29,0x48,0xa0,0xfa,0xbc,0xfb,0x38,0xab,0xce,0x3c,0x42,0x0b,0x4d,0x55,0x21,0x61,0x8e,0x11,0xd2,0xde,0x82,0x7d,0x9d,0xe5,0x69,0xf6,0xbc,0x3b,0xe6,0x6a,0xad,0x40,0x63,0x6c,0xda,0xa6,0x47,0x60,0xde,0xd3,0xb7,0xc2,0x09,},"\x36\x2e\xec\x68\xb9\x12\x85\x27\x86\xbb\x4f\x9a\xff\xf9\xec\xf7\xcb\x28\xc9\xde\x6b\x18\x42\x2a\x8c\xa9\x40\xb0\xd7\xe6\xdc\xb8\x3a\xa4\x4b\xe0\xaf\xb5\xf1\x80\x6d\x43\xf0\xe3\x1d\x71\xf9\x22\xf8\x53\x61\x5a\x26\xe2\x87\xa2\x7f\x08\xa0\x4f\xbc\xe3\xd4\x5a\x0c\x6c\x31\x1d\x4b\x7c\xb1\x7e\x42\x5b\xbe\xb0\xa6\xb4\x10\xb5\xd6\xdb\xb7\xac\x11\xdf\x98\x50\xa1\x31\xa6\x91\xe3\xb6\x0b\x0b\x21\x4e\xbe\x04\x41\x06\xe9\x82\x43\x32\x87\x59\x52\x67\xb0\x31\xb5\xd4\xa0\x92\x62\xde\xd8\x93\x4f\xdf\xdf\x96\x4d\x86\x8e\xf9\xa2\xc8\x42\xf8\x04\xea\xfd\xde\xfc\xb7\x1d\x9f\x16\xa5\x9b\xf8"}, -{{0xb8,0x12,0x3c,0x11,0x6b,0x33,0xba,0xd0,0xdc,0xbc,0x2c,0x4d,0xc0,0x6a,0x3d,0x66,0x85,0x0d,0xab,0x36,0x0c,0xdb,0x5a,0x03,0x3c,0x14,0x89,0x5c,0x4e,0xe3,0x1b,0xfb,},{0xbd,0xca,0x15,0x1b,0xa3,0x2c,0x6b,0xb3,0x15,0x31,0xb0,0x5f,0xdf,0x86,0xc6,0xd7,0x8c,0x8c,0xd1,0x93,0x56,0x11,0xd5,0xff,0x11,0x1a,0x0f,0x00,0x63,0x5b,0x18,0x85,},{0x9c,0xf1,0x3e,0xba,0x3d,0xcc,0x37,0xb8,0xfc,0x70,0xcc,0xb2,0x32,0x74,0x36,0xb9,0xf0,0x88,0x55,0xe7,0x26,0xaa,0x7e,0xd8,0x2b,0xd5,0xcb,0x7d,0xf4,0x5f,0xdf,0x9e,0xc1,0xf9,0x6a,0xfa,0xd1,0x93,0xf4,0x75,0x72,0xd7,0x70,0x44,0x4b,0x65,0xb7,0x4a,0x37,0xcc,0x03,0x4f,0xc5,0x14,0xcb,0x3f,0x91,0xb2,0xd8,0xad,0xa5,0xb0,0x20,0x06,},"\x79\x70\xf6\x66\x66\x34\x54\x8c\x84\x8b\xb5\x23\x38\x81\x7b\x26\xa4\xd0\xca\x68\xdf\x3d\x28\xaf\xff\x20\x7c\x2d\x02\x80\x67\xa1\x8e\x4c\x95\x43\x02\x5f\x5b\x02\x28\xaa\x69\x1e\x50\x88\x51\x31\x51\xa9\x44\x94\xe1\x5d\x1f\x54\x21\x03\x28\xe0\xdf\x15\x9b\x35\x2c\x30\xaa\xa7\xa8\x44\xf1\x8a\x9f\x4c\x39\x5d\xcb\xb3\xfb\x9f\xcf\xbe\xd1\x10\x3e\x07\x06\xfb\xf9\xc3\x5f\xe2\x66\x68\x48\xfa\x35\xdc\x2c\xf5\x22\x7e\xbe\xe8\x9e\x7d\x3b\xcf\xae\x27\x21\xb2\x5f\xde\xc3\xd3\x17\x4e\xa7\xce\x26\x7a\x55\xdd\x61\xd5\x82\x01\xe9\x6b\xda\x30\x3c\xf4\x18\xed\xf6\xe3\x2f\xb9\x2f\x5d\xc1\xa0\xb1"}, -{{0xb1,0x8e,0x1d,0x00,0x45,0x99,0x5e,0xc3,0xd0,0x10,0xc3,0x87,0xcc,0xfe,0xb9,0x84,0xd7,0x83,0xaf,0x8f,0xbb,0x0f,0x40,0xfa,0x7d,0xb1,0x26,0xd8,0x89,0xf6,0xda,0xdd,},{0x77,0xf4,0x8b,0x59,0xca,0xed,0xa7,0x77,0x51,0xed,0x13,0x8b,0x0e,0xc6,0x67,0xff,0x50,0xf8,0x76,0x8c,0x25,0xd4,0x83,0x09,0xa8,0xf3,0x86,0xa2,0xba,0xd1,0x87,0xfb,},{0x6b,0xd7,0x10,0xa3,0x68,0xc1,0x24,0x99,0x23,0xfc,0x7a,0x16,0x10,0x74,0x74,0x03,0x04,0x0f,0x0c,0xc3,0x08,0x15,0xa0,0x0f,0x9f,0xf5,0x48,0xa8,0x96,0xbb,0xda,0x0b,0x4e,0xb2,0xca,0x19,0xeb,0xcf,0x91,0x7f,0x0f,0x34,0x20,0x0a,0x9e,0xdb,0xad,0x39,0x01,0xb6,0x4a,0xb0,0x9c,0xc5,0xef,0x7b,0x9b,0xcc,0x3c,0x40,0xc0,0xff,0x75,0x09,},"\x91\x6c\x7d\x1d\x26\x8f\xc0\xe7\x7c\x1b\xef\x23\x84\x32\x57\x3c\x39\xbe\x57\x7b\xbe\xa0\x99\x89\x36\xad\xd2\xb5\x0a\x65\x31\x71\xce\x18\xa5\x42\xb0\xb7\xf9\x6c\x16\x91\xa3\xbe\x60\x31\x52\x28\x94\xa8\x63\x41\x83\xed\xa3\x87\x98\xa0\xc5\xd5\xd7\x9f\xbd\x01\xdd\x04\xa8\x64\x6d\x71\x87\x3b\x77\xb2\x21\x99\x8a\x81\x92\x2d\x81\x05\xf8\x92\x31\x63\x69\xd5\x22\x4c\x99\x83\x37\x2d\x23\x13\xc6\xb1\xf4\x55\x6e\xa2\x6b\xa4\x9d\x46\xe8\xb5\x61\xe0\xfc\x76\x63\x3a\xc9\x76\x6e\x68\xe2\x1f\xba\x7e\xdc\xa9\x3c\x4c\x74\x60\x37\x6d\x7f\x3a\xc2\x2f\xf3\x72\xc1\x8f\x61\x3f\x2a\xe2\xe8\x56\xaf\x40"}, -{{0x93,0x64,0x9c,0x63,0x91,0x0b,0x35,0x71,0x8e,0x48,0xc5,0x90,0xd2,0x61,0xc4,0x8e,0x4e,0xf8,0x33,0x66,0x13,0xf6,0xaa,0x07,0x7b,0x46,0x26,0x76,0xb3,0xba,0x88,0x29,},{0x06,0xa6,0x85,0x89,0x8b,0x85,0x52,0x12,0xeb,0xc2,0x89,0x91,0x5d,0x10,0x5a,0x43,0x20,0xd6,0x20,0xd8,0x57,0x71,0xb8,0xc6,0xb1,0x5b,0xf1,0x0a,0x1b,0xe6,0xe9,0xb8,},{0x62,0x74,0xf2,0xd4,0xf4,0x31,0xd5,0xaf,0xfe,0xfa,0x35,0xe7,0xcf,0x58,0x4a,0x59,0x90,0x17,0x19,0x3d,0xa9,0x90,0x94,0xca,0x90,0x8b,0x75,0xac,0xb6,0x08,0xd1,0xbf,0x98,0x18,0x57,0xbe,0x93,0xa7,0xda,0xfb,0x0f,0xad,0xb3,0xff,0x09,0x06,0xf4,0x8a,0x5e,0xe9,0x50,0x45,0x6f,0x78,0x2c,0x2d,0x60,0x5b,0x14,0x09,0x5b,0xa0,0xff,0x0f,},"\x2c\xd1\xa9\x51\x05\x6c\x9e\xba\xe1\x39\x9b\x6b\xd2\xd8\x2c\x0a\xe2\x77\x85\x62\x90\xd0\x69\x20\xac\x56\xca\xc8\xfb\x42\x43\x51\x01\xc7\x2a\xa9\xc0\x8d\xd2\xd1\x24\x26\x32\x55\x62\xc2\xf0\xa4\x9c\xd8\x21\xb1\x1b\x93\x9a\xaf\xa5\x93\xb4\x09\x5c\x02\x1b\xcb\x48\x27\xb1\x07\xb9\x66\x4d\x68\x28\x28\x88\xbc\x4a\x44\xaf\x3e\x3b\xdc\x86\x1b\xe6\xaf\x30\x90\x44\xc3\xda\xab\x57\xb7\x70\x23\xdc\x90\x2d\x47\xeb\xc3\x26\xf9\xbd\xd0\x2d\xbc\x02\xcd\x54\x0f\xf8\x1b\x2d\xdf\x7c\xf6\x79\xa4\x11\x93\xdf\xe5\xf8\xc8\xca\x1a\xae\xfc\x41\xef\x74\x02\x80\xd9\x82\x3e\x30\xa3\x54\x71\x7c\x84\x31\xf5\xd8"}, -{{0x1c,0x15,0xcb,0xeb,0x89,0x36,0x2d,0x69,0x47,0x6a,0x2a,0xa4,0xa5,0xf3,0xef,0x20,0x89,0xcf,0x87,0x28,0x63,0x49,0xe0,0xdf,0xe0,0xe7,0x2d,0x9e,0x3e,0x5a,0x66,0xc7,},{0x13,0xa8,0x82,0xa1,0x06,0x41,0x82,0x58,0x2c,0x21,0x18,0x47,0xe1,0x9b,0x4d,0xac,0x59,0x72,0x2c,0x9f,0xfd,0x34,0x82,0x6d,0x96,0xf3,0x31,0x13,0x40,0x0f,0xac,0x7a,},{0x59,0x98,0xb2,0x80,0x8a,0xdf,0xde,0xea,0xeb,0xe2,0xc3,0xea,0xc0,0x26,0xd3,0xf8,0x25,0xf9,0xc7,0xf2,0xaf,0x97,0xca,0x32,0x4f,0xbd,0x57,0xaa,0xc1,0xbe,0xdf,0xf7,0x8a,0x8e,0xe6,0x21,0xd0,0x37,0xee,0x3a,0xd2,0xa7,0x12,0xe9,0xa0,0x09,0xc5,0x8e,0xa3,0xe6,0xf2,0xa8,0x28,0xf7,0x4b,0x86,0xda,0x27,0x5a,0x44,0xa4,0xb1,0xe5,0x0b,},"\x09\x1c\x9b\x9b\x11\x6a\xe8\x3d\x23\xd0\x1a\x62\x95\x21\x17\x85\xd4\x46\xb6\x22\x8d\xd6\x87\xdd\xf7\x9b\xd0\xd5\xa4\xda\xa8\xc7\x9d\x2c\xbf\xc3\x73\x65\xf1\xf2\x85\xe3\x61\x73\x81\x23\xe3\x4e\x2b\xcb\xfc\x66\x4c\xe1\x25\x3a\x11\xd9\xe4\xa7\x98\x2e\x58\xcf\x94\x68\xe1\x01\x7e\xa1\x4d\x2c\xc6\xd0\x86\x5d\x40\xfd\xe8\xcb\x56\x02\x41\xe9\x6a\xc1\x61\x7c\x79\x1f\x0c\xa7\xc6\x41\x0c\xad\xf3\x28\x61\x1b\x18\xae\xf3\x33\xd8\x35\x0a\xc4\x97\xf0\xa4\xae\x2d\x03\xfd\xf0\xe2\x3e\x42\x6d\x34\xf4\x51\x47\x80\xd1\x47\x4e\x11\x35\x83\x54\x1f\x3c\x04\x36\x72\x05\x71\x72\x61\x8c\xb2\x05\x9e\xaa\xed\x56"}, -{{0x11,0x24,0x1f,0xfd,0xf3,0x4a,0xe8,0xab,0x87,0x54,0x75,0xe9,0x4c,0x6c,0xc3,0x29,0x1f,0x0b,0x88,0x20,0xdc,0x85,0xe2,0x0f,0x32,0xfc,0x53,0xb2,0x4a,0xe6,0x89,0x78,},{0x09,0xc0,0x45,0xe4,0xbd,0x51,0x37,0x31,0x4c,0x0e,0xc1,0xd0,0x31,0xfa,0xf9,0x14,0x91,0x0c,0x45,0xa4,0x67,0x6f,0x5a,0x3c,0xd8,0xf5,0x81,0xbc,0xcc,0xb0,0x3c,0x97,},{0x72,0xce,0x9f,0x91,0xbe,0x2e,0x66,0xcf,0xc9,0x0f,0x95,0x25,0x95,0x94,0x6f,0xfc,0x90,0xbf,0xce,0x53,0x08,0x7d,0x49,0xe5,0xdd,0x7c,0x08,0x7f,0x3f,0xaa,0x8f,0x18,0xf2,0x35,0x6d,0xe9,0x71,0xe4,0x42,0x9d,0x98,0x5a,0x99,0x19,0x4b,0x4f,0x92,0xce,0xd3,0xef,0x47,0xcd,0x71,0x14,0x37,0x9e,0x0b,0x32,0x67,0xa9,0xf8,0xb1,0xe7,0x06,},"\x3b\x89\xde\xcc\xb7\x02\x3e\x4b\x2b\x7a\xff\x2c\x39\x51\x87\x0a\xf4\x13\xa9\xb0\x4d\xd8\x6a\xc7\x8b\x7c\x8f\xd8\x87\x49\x2d\x8d\xde\x49\xd8\xfd\xa1\x49\xed\xd5\x47\x81\xae\x2b\x50\x80\x30\xd1\x44\x16\xa9\xa3\x8b\xed\x2b\x9a\xeb\xbb\xb2\x02\x50\xb3\xc9\x31\xac\xd4\xe3\x2f\xbe\xee\xc5\xa2\x65\x01\xbe\xab\x72\x68\xd1\x44\xfc\xe8\x95\x1a\x10\x1c\x4b\x51\x78\x16\x6f\xbb\x59\x27\xb1\xdf\xb1\xe1\xce\x90\xd1\xd1\x23\x06\x8e\x3f\x47\x2c\x88\x8f\xdb\x01\xfd\xf7\x0e\x7f\x8d\xe9\xb0\xad\xb2\x84\xb7\x11\x9f\x55\x35\x43\x16\xf8\x4e\xd0\x90\x03\x0f\x9c\x26\x62\x06\x1c\xa4\x84\x47\xcc\x0a\xef\x96\x41\x26"}, -{{0x3b,0xdb,0x16,0x24,0x65,0xea,0xce,0xff,0x98,0xd6,0x9c,0x86,0xf7,0x00,0x39,0xc5,0x17,0xd1,0x68,0xae,0xfe,0x6b,0xb1,0x01,0xb4,0xf7,0x69,0xa8,0x6b,0x17,0xc9,0x72,},{0xd7,0x6c,0xb7,0xbe,0x74,0x32,0x82,0x89,0xfd,0x1c,0x64,0xbe,0x74,0x7c,0xca,0x5b,0xb3,0x02,0x95,0xdf,0xac,0xcd,0x0f,0x2e,0x43,0xf5,0x17,0x03,0xfd,0x5d,0x36,0x83,},{0x6f,0x13,0x62,0xa4,0x02,0x06,0x37,0x91,0xf9,0x50,0x98,0x4f,0x54,0x49,0x28,0xe6,0x16,0xa4,0xef,0x79,0xbb,0xeb,0x68,0x54,0xe9,0x61,0x5a,0xab,0x9c,0xdb,0xae,0xc4,0x83,0xfb,0x9a,0x04,0xbf,0x22,0xde,0x5d,0x97,0xa1,0x5b,0xda,0x2d,0x39,0x04,0x83,0xc7,0xf6,0x1d,0xbe,0xe0,0x7b,0xb5,0x14,0x1f,0xc1,0x73,0xb1,0xaa,0x47,0x65,0x0d,},"\xfb\xf3\x68\xfe\xae\xba\x87\x91\x8b\x1b\x8c\x7b\x8a\x26\x83\x2b\xe6\xe7\xfc\x1c\xbd\xb8\x90\x25\x19\x28\x1a\x06\x54\xec\x73\xde\x0b\xb0\x71\x01\xa9\xd6\x03\xf7\x45\xd4\xec\x23\x57\xae\xe9\x87\x0c\xb1\x9a\x56\xcb\x44\xfb\xd9\xc9\x1f\xc3\x47\x52\x61\x2f\xbd\x83\xd6\xfc\x1a\x16\xbf\x8a\x85\xa2\x15\xd0\x14\x8e\x4a\xf3\x7d\x29\x84\x67\xe5\xcc\x48\x6b\x13\x13\x52\xce\x09\x21\x82\xce\x82\x84\x15\x9a\x38\x12\xb3\x0b\xac\xbf\xf5\x95\x86\x38\x11\xbf\x9a\x30\xa9\xda\x49\x45\x65\xc3\xac\x18\x14\x43\x00\x18\xea\x0e\xee\xd3\x9c\xdb\xca\x27\xf9\x31\x40\xe4\x69\x49\xdb\x57\x0b\xfa\x2e\xd4\xf4\x07\x3f\x88\x33"}, -{{0xd5,0xef,0xe5,0x1d,0x5c,0xd8,0xe1,0x08,0xbd,0x92,0x2f,0xc0,0xea,0x12,0x61,0x90,0xa9,0x46,0x28,0xff,0xa5,0x3c,0x43,0x3a,0x51,0x80,0x22,0x79,0x2d,0xdc,0x78,0xef,},{0x42,0x6b,0x01,0xcc,0x61,0xff,0x5e,0x0e,0x72,0x4d,0xa1,0xd3,0xb2,0x97,0xf5,0x32,0x5c,0x18,0xc6,0x2f,0x64,0xd5,0xeb,0x48,0xd4,0xa5,0x21,0x6a,0x8e,0x9a,0x40,0x73,},{0x23,0x06,0xf5,0x8f,0xcd,0x4c,0xff,0x22,0x22,0xd8,0x1b,0x05,0xa4,0x75,0x53,0x2b,0x8b,0x19,0xdc,0x67,0xe6,0xd7,0x8d,0xdb,0x42,0x05,0xa3,0xb7,0x62,0x1c,0xc5,0xae,0xf0,0xb3,0x93,0xd5,0xd2,0x4d,0xd9,0x6c,0x88,0xcc,0xbc,0x53,0xa3,0x20,0x8d,0xa3,0x23,0xbe,0x45,0x87,0xd5,0xec,0x06,0x7c,0x82,0x0f,0x07,0x23,0xaa,0x44,0xe9,0x0e,},"\x9d\x17\xbc\xfe\x2d\xfc\x74\x2f\x41\x1c\xb5\x3a\x94\xf3\x59\xc0\x01\xab\xf0\x96\xc7\x41\xf3\x4a\xf4\x86\x79\xf2\x81\xe7\xce\x6b\xbd\x9e\x87\x70\x9f\xc0\x72\x8a\x56\x3d\xb2\xb9\xcf\x8e\xa4\xfb\xdc\xc3\x44\xc1\x84\x8e\x65\x3c\xe9\x70\xc6\xce\x29\xde\x2c\xcd\x52\x03\x00\x64\x9a\xdc\xdd\xfc\x75\x39\x71\xf8\x46\xaa\xc1\xba\x42\xae\x45\x28\x95\x2d\x94\x98\x0a\xa7\xc6\xcf\xa2\x14\x29\x07\x64\x7f\x89\x4a\xe9\x74\xa7\x4d\x59\x03\x5a\x73\xef\x56\xa1\x0b\x66\x12\x62\x48\x09\x52\x01\x90\xac\xe6\x61\xc3\xa4\x70\x95\xe0\x32\x2e\xfd\x78\x1d\x50\xd1\x16\x35\x98\xf2\xda\x32\xf3\x1b\xc9\xc4\xf9\x13\xd1\xb1\x48\x61"}, -{{0x18,0xaf,0x89,0x02,0x5e,0xbf,0xa7,0x6b,0xd5,0x57,0xcf,0xb2,0xdf,0xf1,0x48,0x24,0x52,0x14,0x64,0x1f,0xd5,0xbd,0xa1,0x59,0xf7,0x3d,0xa0,0x4b,0x08,0xe8,0x7c,0x88,},{0x0c,0x58,0x44,0x59,0xb9,0xeb,0xcc,0xca,0xd5,0x87,0xb2,0x72,0x16,0x0b,0xc6,0x0b,0x27,0xf4,0xf7,0x72,0xb4,0x32,0x1d,0xe7,0x72,0x3a,0xfe,0xf5,0x77,0xed,0xc7,0xb4,},{0x26,0xbb,0x08,0x82,0x29,0x7c,0x2c,0x08,0xa7,0x52,0xd3,0x98,0x11,0x45,0xdc,0xde,0x55,0x89,0x3a,0x11,0xdf,0x77,0xf8,0xaa,0x4c,0x19,0xd0,0xb9,0xed,0x6e,0x52,0x20,0xed,0x12,0xe9,0xfa,0xc3,0xaf,0x13,0xd0,0xf0,0xc7,0x15,0x68,0xf4,0xa5,0x47,0xd3,0x01,0x14,0xa6,0x59,0x9a,0x23,0x68,0x06,0xc4,0xbe,0xee,0x67,0x65,0x28,0x44,0x08,},"\xe8\x2f\x46\x65\x2a\xb9\x14\xaf\x53\x5d\x8f\xb7\x20\xb5\x57\xac\x95\x01\x8d\x9f\x2a\x3f\xcc\xe8\x57\x71\xbb\x40\xab\x14\xcb\x9a\x98\x6e\x09\x6f\x3a\xfe\x5b\xee\x82\x9d\xfd\x8b\x97\x33\x5c\x53\x6a\xc9\x71\xa2\x16\x55\xaf\x16\xa2\xf8\xfd\xba\x18\x3a\x4e\x18\x56\x4c\x21\x49\x29\x56\x53\x7a\x41\x9a\xbb\xbb\xb0\x2a\x4b\xbd\xc0\x14\x81\xf5\xc6\xe6\x58\xec\xf3\xc3\x4f\x01\x1a\xd8\x46\xf5\xed\xcd\x49\x39\x19\x5d\xf8\x5e\x41\x30\x3f\xb9\xa8\x8f\xdf\xbd\x70\x43\x96\xf7\x55\x9a\x32\x73\x18\xb9\x52\xb3\xe6\x0c\xe8\xdd\xde\x56\x37\x85\x79\x23\x2f\xaf\x95\x0c\x78\xe7\xf0\xb1\x7c\x3b\x8d\xec\xe3\x6b\x78\x8a\x84\x73"}, -{{0x0c,0x93,0xd9,0x98,0x15,0xff,0xf8,0xfe,0x22,0xb9,0xe4,0x5a,0xa0,0x2b,0x3e,0x64,0x45,0xce,0x1d,0x6b,0xf5,0xa6,0x5d,0xce,0x3d,0xa1,0x07,0xaa,0x10,0x55,0x94,0x0e,},{0x4d,0x27,0xa4,0x7b,0x0f,0xc8,0x08,0x00,0xd8,0x4d,0x24,0x4e,0xeb,0xb1,0xde,0xb4,0x43,0x6d,0x97,0x63,0x3a,0x83,0xe6,0x71,0x25,0xad,0x52,0xea,0x01,0x68,0x50,0x57,},{0x7d,0xc4,0x46,0x7a,0xbc,0xf6,0x43,0x1a,0xdb,0x7c,0xcf,0xe8,0x68,0xea,0xc8,0xcd,0x8a,0x61,0x5a,0x0f,0xf6,0x5f,0x6a,0x9e,0x33,0x83,0x75,0xb1,0xaa,0xe3,0xc4,0x9a,0x12,0x6c,0x9e,0xba,0x79,0x42,0x6d,0x16,0x41,0xc6,0xb9,0x7c,0x3e,0x92,0xc1,0x94,0xe5,0xee,0x44,0x31,0xef,0xa2,0x43,0x9f,0xd4,0x50,0xf2,0xcd,0x01,0x8c,0x87,0x00,},"\x11\xe8\x77\xde\x58\xc1\x34\xea\xf4\xc9\xf1\xb5\x3c\x3d\xc4\x51\xd3\xc0\x55\xf1\x6b\x09\x62\x27\x25\xb2\x79\x76\x85\x12\xfe\x10\xa7\xad\xb0\x76\x5b\x68\x9e\xc2\x1d\x5b\x6e\xfa\xa1\x9f\x1b\x9d\x36\x25\x4d\xf0\xa9\x36\x7f\x44\x1b\x26\xbd\xb9\x0b\x28\xcb\xc4\x03\xe5\x07\x40\x82\xfa\x1f\xed\x58\xe1\x40\xda\xc9\x7a\xea\xf4\x83\xe2\xc1\x3f\x3c\xc5\x60\xab\xff\xab\xa0\x5b\x76\x3f\xee\xdb\x51\xe6\x06\x98\x15\x1c\xf5\x6e\xfd\xf1\xd3\x7d\x6c\xe0\x56\x44\x86\x21\x0f\x05\x2e\x93\x7f\x2e\xa2\x6f\x63\xef\xa5\xd2\x47\xff\x18\x83\x29\xbb\x1a\xa8\x3c\xe3\xf4\xf3\x5a\x3d\x7d\xec\x14\x59\x9e\x5f\xeb\x7b\x6d\x5f\xe4\x29\x6a"}, -{{0x98,0x9e,0x99,0x94,0x56,0x35,0x19,0x2c,0x02,0x3c,0xc5,0x18,0x6f,0xc2,0x5b,0xba,0xef,0x47,0x24,0x07,0x75,0xd1,0x5a,0x56,0x19,0x5d,0x88,0xcd,0x07,0xc3,0x74,0x8e,},{0xca,0x0b,0xea,0xfd,0xf7,0x31,0xd8,0x93,0x01,0xf7,0x72,0x3c,0x5b,0xb7,0xe5,0xa1,0xc3,0xff,0x3e,0xab,0x27,0xc9,0x7d,0x71,0x1b,0xcd,0x76,0xe4,0x20,0x54,0xbe,0xe4,},{0xae,0xf7,0x56,0xbf,0xb8,0xa7,0x26,0x6e,0x17,0xd1,0x5f,0x3f,0x11,0xee,0x50,0xed,0x25,0xbe,0x42,0x0e,0x95,0xa0,0x74,0x22,0x71,0xeb,0xd1,0x22,0x94,0xe2,0xcb,0x96,0xea,0xd0,0x83,0xb8,0xff,0x0b,0x82,0x9d,0x2e,0xde,0xb1,0x4d,0xa8,0x6e,0x40,0x2e,0xf2,0x5e,0x6d,0x4a,0x5a,0x79,0x58,0xc1,0x84,0xed,0x10,0xc1,0x76,0xcb,0x57,0x0b,},"\xc4\x84\x14\xf5\xc7\x57\xd0\x3c\x52\x3e\xf3\xf3\xb8\x51\x07\x71\xb0\xff\x3b\x4b\x97\xde\x27\x96\x25\xd3\x49\xec\x18\x5a\x29\x92\x7a\x66\xb9\x59\x3b\xa1\x93\x38\xc2\xf5\xe4\x13\x1f\x1a\xc0\x7e\xa4\x6d\x2c\x1b\x6e\x4a\xb5\x22\x92\x80\xb2\xe2\xbb\x9d\x14\x0d\x1e\xf7\xaf\x7b\x16\x92\xbf\x2d\x09\x7b\x80\xf8\x11\xad\xcf\xa9\x5d\x5c\xbf\x9e\xee\x92\xa1\x64\x1c\x55\x2b\x4b\xe4\xa0\xd7\x34\xf0\xaf\xd4\x70\xb9\xd7\xf4\xe4\x57\x78\x95\x1e\x21\xfc\x53\x4f\x20\x0a\x12\x8b\x96\xad\xb8\x37\x3f\x10\xce\xce\xc2\xda\xc2\x99\x6a\x06\x2f\xb3\xc2\x94\x31\x59\x65\xa9\xd5\xd7\xb0\x77\xc4\xb0\x13\xc6\x4a\x38\x42\x97\x69\xd2\x3e\xab"}, -{{0x6b,0xdb,0xbe,0x06,0xd9,0xf4,0x21,0x9e,0xea,0x64,0x03,0xa3,0x57,0xb2,0x5e,0x56,0x19,0x92,0xfa,0xe0,0xf0,0xf6,0x14,0x56,0x1d,0xd8,0x6d,0x23,0xde,0x41,0x5a,0x43,},{0xed,0x52,0xdd,0x1c,0xce,0x32,0xd9,0xb4,0x85,0xe0,0x94,0x07,0x46,0x42,0x1d,0x36,0xb9,0xfd,0xe6,0xcd,0xf0,0x21,0x15,0x45,0xb6,0x34,0x04,0x4d,0x4b,0x3c,0xb8,0xf1,},{0x95,0x02,0x06,0x60,0x5b,0x0f,0x41,0x7c,0x90,0x84,0x3e,0x2c,0x8d,0x8e,0x66,0xc8,0x28,0xbb,0x10,0xb9,0x9b,0x36,0xee,0xee,0xe8,0xca,0xf2,0xe0,0xe5,0x48,0x4d,0x93,0xfe,0x02,0xbf,0x53,0x34,0x05,0xf4,0xbb,0x74,0xa5,0x0e,0x55,0x85,0xfa,0x0d,0xae,0xf4,0x82,0x1f,0x03,0x01,0xd0,0x1b,0x46,0x32,0x1b,0xaa,0x31,0xe1,0xf0,0x8d,0x03,},"\x58\x2a\xda\x13\xd6\x92\x93\xe4\x9b\xbd\x46\x10\x32\xdf\xea\x1c\xa2\x02\x5b\x52\xe0\x13\xa3\x3a\x03\x87\xfc\xfc\x5f\x7c\x0b\x8e\xc9\x55\x98\x26\x07\xfc\x90\x1e\x1b\x7f\x63\x6a\x9d\x37\x1e\x1f\x91\xfe\x47\x6b\xdd\x44\x85\x6e\x27\x5d\x67\xef\xa1\x42\x38\x16\x43\x54\xc2\x31\x12\x4c\x84\xde\x8f\x5b\x89\xd5\xa5\x8e\xa6\x74\x4b\x4d\x3b\x3d\x79\x06\x90\x52\x33\xcc\xe6\x94\xa6\x4d\x69\x6f\x5a\x70\x24\xfc\x90\x33\xb1\xce\x39\x08\x99\xa3\xb4\x41\xa4\x8e\x53\xc7\xc9\xb3\x0b\xa1\x2e\x7d\x61\xf3\x5f\x15\xe6\x58\xc7\xcc\x44\x07\xe2\xf6\x89\xea\x8a\x55\xd0\x1b\xf5\xdb\xac\xb1\x19\x54\x75\x4f\x92\x0f\x09\xdb\xd4\x84\x09\xbb\xb5"}, -{{0xd7,0x61,0xc8,0xc5,0xa9,0x60,0x1b,0x91,0x45,0xb7,0xd0,0x51,0x24,0x9b,0x00,0x41,0x07,0xe4,0x52,0xe5,0x63,0x10,0x0c,0x6c,0x78,0x80,0x38,0xc9,0xee,0x8a,0xda,0xd7,},{0xe6,0x48,0x87,0x75,0xd6,0x40,0x7e,0xfc,0x7b,0x2b,0xca,0x89,0x0a,0x7f,0xc6,0x22,0x66,0xfc,0x54,0xcd,0xac,0x89,0x33,0x43,0xb4,0xf5,0x9a,0x19,0x6d,0x94,0x88,0x98,},{0x7a,0xb7,0x8b,0x64,0xe6,0xdb,0x35,0x9a,0x2d,0xc8,0x30,0x2e,0x10,0x92,0xed,0x66,0xfa,0x73,0x6b,0x53,0x62,0x53,0xa1,0xcd,0x90,0xfd,0xb8,0xc1,0x0e,0xfd,0x78,0x30,0x02,0x25,0xe1,0x91,0x96,0x35,0x99,0xba,0x54,0x9c,0xc8,0x59,0x20,0x9d,0xf0,0xff,0x61,0xcd,0x06,0x9b,0x03,0xd2,0x54,0xe6,0xe7,0xd7,0x6c,0x79,0x84,0x40,0xf9,0x07,},"\x84\xea\xd5\xea\xbd\x2f\xd4\xb7\xc7\x9a\x9a\x92\x8a\xb8\xee\x0a\x16\xa5\xfd\x66\x7a\x05\x7f\x8a\x25\x46\x63\xd5\x6d\xaa\xe1\x56\xd1\xa4\x9a\xff\xb2\x99\x61\x37\xb9\xd8\xb3\x40\xe6\x35\x73\x2f\x9d\x2b\x4c\x60\x21\x84\x42\x54\x1e\x72\xd2\xb0\x0e\x1e\xe7\xa7\x3c\x3f\x67\xca\xa4\x99\xfa\x9d\x07\x0b\x57\xd0\x76\xdc\xde\x96\xb0\x76\x47\x23\xc3\xc6\x59\xc7\xa0\x0c\x1b\x78\xb1\x5c\xcc\x22\x23\x89\x0b\x51\x06\x7f\xc8\x1e\x23\xe9\x45\x8a\xb0\x68\x3b\xa6\x26\xa5\x3d\x0c\x37\x93\xa5\x8a\x98\x57\xbb\x44\xb3\xbd\x85\xbb\x6c\xe5\x3a\x85\x69\x4e\x7f\x53\xcc\x1b\xd4\x6d\x50\xed\xa3\x7d\x81\xf5\x38\x1b\x51\x3d\x1f\x38\x33\x9d\x29\x1b"}, -{{0xc5,0xe0,0xc7,0xa7,0xbb,0x8b,0x7c,0xa0,0x7b,0xf0,0xa0,0x5e,0xa6,0x7e,0xff,0x6d,0xee,0xbf,0xe3,0x71,0x4e,0xe3,0xe1,0xa2,0x27,0xf4,0xdc,0x8e,0x24,0x2a,0x2f,0xa0,},{0x51,0x35,0xef,0xcd,0x90,0x52,0xbe,0xc5,0x7a,0x44,0x31,0xca,0xab,0xe8,0x26,0x80,0xee,0xc0,0xa3,0x3a,0xfd,0x59,0xb3,0x02,0x03,0xb2,0x80,0xba,0x12,0xbe,0x48,0x5c,},{0x2e,0x7f,0xde,0xb3,0x48,0x4d,0x0a,0x5e,0x8d,0xce,0x94,0x44,0x89,0x79,0x49,0x6b,0x06,0x42,0xca,0xbc,0x37,0x33,0xa5,0x1f,0x8c,0x3c,0x5c,0x51,0xc1,0x9a,0xe3,0x19,0x01,0x8d,0xa9,0x10,0x91,0xc2,0x38,0x5f,0x2f,0x4e,0x9a,0x59,0xed,0xbc,0xa2,0xab,0xd0,0xd0,0x85,0xee,0x40,0xd3,0xf0,0xd4,0x20,0x61,0xa5,0xa9,0x83,0x2a,0x37,0x0c,},"\x37\x70\xa6\x78\x66\x52\xc4\xb7\x8a\x04\x3e\xdc\xe0\x7f\x3e\x20\x4d\x81\x99\x7c\x42\xaf\xc2\x23\x31\xf7\x5a\x54\x94\xa8\x26\xd7\xcb\x69\xab\x43\x14\xa4\x73\x72\x10\x58\xa1\x83\x99\x81\xd5\xb7\x02\x2d\x0c\xd8\x67\x03\x77\xda\xf3\x32\x04\x76\xd2\x5b\x9f\x55\x95\x61\xd6\x6e\xe0\xa7\x09\xfe\x17\x36\x1e\x2a\x52\x89\x8f\x57\x53\xc4\xfb\x43\xbd\x0c\x98\xb3\x68\xf5\x12\xad\xc0\x9c\xd9\x27\xc6\x62\x26\x76\x92\x6d\x8c\x2d\x91\xa1\x4a\xca\x32\xf2\x26\xf7\x00\x36\xc1\xc8\x58\xbc\xff\xc2\xb5\x9f\x54\xc1\xc3\x7b\xf8\x1e\xb5\x2e\xcb\x3f\x00\xda\x60\x2c\x94\x36\x1b\x52\xa5\xaf\xdd\xbf\xd7\xe0\x50\x36\xe3\x77\x50\x30\x50\x33\x3b\xe5\x12"}, -{{0x11,0xbb,0x47,0x48,0xd2,0x54,0x7e,0x61,0x96,0xbe,0x82,0x3c,0x9b,0xe7,0xaa,0x18,0x15,0x0c,0x20,0x4b,0x12,0xca,0x8d,0x73,0xc1,0xbd,0x46,0xb1,0x1a,0x54,0xb4,0x75,},{0xef,0xeb,0x42,0xda,0x28,0xd7,0x64,0x96,0x64,0x03,0xdd,0x30,0x0d,0x9f,0x94,0x51,0xb2,0x58,0xab,0x1c,0x80,0xdf,0x06,0xfe,0x59,0x43,0x15,0x3f,0x53,0x01,0xcc,0xcb,},{0x44,0xc5,0x8d,0xa4,0x9d,0x23,0x65,0xd2,0x70,0x29,0xd1,0xee,0xbb,0x3b,0xeb,0xf7,0xc0,0x32,0xd8,0x58,0xaa,0x07,0xe0,0x75,0x6b,0x1c,0x26,0xa5,0x41,0x2d,0x22,0x69,0x11,0x76,0x03,0x13,0x41,0xad,0x37,0xd7,0xbb,0x78,0x43,0x28,0x9e,0xb3,0x9d,0xb4,0x91,0x58,0x4c,0x1b,0x2a,0x1d,0xa2,0xe4,0xa2,0x64,0x9c,0x22,0x93,0x82,0x66,0x06,},"\xf4\xb7\x65\xb2\x58\xba\x35\xb4\x27\x52\x5c\x7f\x10\xa4\x6f\x0b\xcc\xd3\x57\xec\x1a\xd5\x2a\x5b\x13\x94\x17\xa9\xd3\x89\x4c\x51\x2d\x89\xeb\x88\xe6\x81\xb1\xf3\x0a\xac\x4c\x11\x5c\xcf\x36\x54\x5e\x83\xf3\x78\x34\xc8\x2e\x83\x00\xcc\x1e\xb2\x89\xaf\x43\x75\x96\x8c\x29\xc0\xff\xef\xb4\x0e\x15\x6c\x20\xc0\x43\x26\x69\xac\x8d\xc0\xa8\x3c\x13\xb1\xe8\x55\xa8\x4a\xd0\x13\x3c\x40\xc8\x2c\x87\xee\x1e\x7d\xd4\x08\x4d\x74\x1c\x80\xde\x8a\x7a\x9f\x77\x59\xe8\x43\xa5\x62\x09\x9c\x4d\x7d\xf8\x75\x35\x20\x39\xff\x4d\x38\x24\x65\x13\x86\xc9\x77\x59\xff\x7d\xba\x52\x06\x4e\x6d\x31\x12\xe0\x80\x81\x9a\xee\x8c\xe7\x23\xa1\xa2\xaa\x46\x4d\x8a"}, -{{0x74,0x52,0xa0,0x01,0x56,0xd7,0x94,0xed,0xeb,0xff,0x4a,0xdb,0x1f,0x7a,0x7e,0xec,0x26,0x21,0x7f,0xef,0x67,0xc3,0xd2,0x68,0x35,0x2b,0x2b,0x54,0x60,0xa7,0xdc,0x25,},{0x5f,0x4d,0xc3,0x38,0xcf,0xbd,0x38,0x4b,0x5f,0x1c,0x14,0xc2,0x26,0x70,0x14,0x46,0xb5,0x2b,0x1e,0x3e,0x2a,0x3c,0xba,0x1a,0x40,0xee,0x28,0x25,0x08,0x0d,0x1d,0xe6,},{0xa8,0xf9,0xfa,0x24,0xa3,0xde,0xa1,0x02,0x2e,0x73,0xf0,0xd8,0x8b,0x1c,0x37,0xd0,0x6d,0x0f,0x0b,0x20,0xbb,0xff,0x0e,0xcd,0xb4,0xa4,0x0c,0x86,0xd7,0xe4,0x75,0x61,0x7c,0x03,0x57,0x0a,0x74,0x19,0xd7,0x4b,0xa0,0xf1,0x32,0x70,0x96,0xbf,0x19,0xf0,0xd0,0xcf,0x9f,0x51,0xd4,0x83,0x11,0x2f,0x26,0x92,0x23,0x78,0x68,0x2f,0x48,0x07,},"\x8c\x4e\xe2\x86\x76\x56\xe3\x3f\x52\x69\x41\x4d\x77\xb4\x2d\x8e\x47\x50\xdb\xa9\x3c\x41\x8b\xac\xca\x10\x93\x8c\xc3\xb5\x70\xc6\x60\x3d\x52\xc2\x34\x44\x88\x60\x7b\x2f\x93\x4f\x6d\x26\x9f\xcb\x2a\xd9\x66\x21\x9b\x1a\xb1\x14\x72\xf4\x2c\x67\x2c\xe2\x05\x92\x49\x0e\xc5\xba\xf6\xa2\xd2\xfc\x8a\x3e\xe3\x53\x74\xb1\x90\x2f\xde\xfc\x78\x70\xb1\xb6\x26\xfa\x46\xb1\x2b\x6c\xee\x24\x1f\x60\x1a\x9b\x3f\xe4\xc5\x08\x12\xe5\x73\xe6\x75\x2c\xe2\xc7\x64\x4e\x33\x67\xa6\xa6\xb7\x77\x58\xd8\xe4\x93\x4b\x58\xaf\x23\xab\xae\x8f\xec\xac\x25\xed\xd7\x34\x03\x0e\xe7\xcf\x39\x90\x7e\x3e\xed\x81\x86\xa1\x9a\x80\x71\x03\xa9\xfc\x49\xd3\x8f\x4c\x84\x60"}, -{{0x88,0x0e,0xf1,0x06,0x73,0x3f,0x04,0xe7,0x61,0x95,0xeb,0xa2,0x80,0xb3,0xfa,0xdd,0xa0,0xf2,0x5d,0xcf,0x96,0xa6,0xa9,0x9c,0x8c,0xcf,0x84,0x2c,0x68,0xaf,0xda,0xe5,},{0x70,0xce,0xe3,0x3d,0x41,0xc7,0x28,0xce,0x7b,0x14,0x19,0x31,0xe6,0xe8,0x52,0x45,0x67,0xd7,0x60,0x1e,0xb7,0x9f,0x67,0xfd,0xcd,0x07,0xb9,0xd6,0x82,0xc6,0x50,0xf0,},{0xff,0x6c,0xae,0xdd,0x8a,0x46,0x8a,0xa0,0x7d,0x4c,0x6e,0x71,0x31,0xbb,0xda,0x76,0x18,0x2b,0xa9,0x58,0x64,0x93,0x76,0xe7,0x11,0xf4,0x4c,0x7b,0xba,0xcb,0xa6,0x07,0x7b,0xea,0x87,0x8b,0xa5,0x94,0x9c,0xde,0xee,0xf0,0x5c,0xfd,0x49,0x83,0xb0,0x05,0x7d,0x27,0x5e,0xa3,0xe1,0x8c,0x32,0x65,0x94,0x68,0xc3,0x0c,0x47,0xac,0x8f,0x0b,},"\xf4\xf3\x8d\x07\x7f\x2b\x03\xda\x82\x1b\xd3\x6f\xde\x67\x3d\x66\x6e\x52\xf4\x83\x2e\x1c\x0d\xcf\xee\xf0\x49\x32\x8a\xcb\x7b\xd7\x1a\xd2\xbf\xc4\x9c\x12\x35\x16\xe1\x96\xc4\x70\xdf\x08\x47\xb3\x84\x8a\x45\xa2\xc6\x9b\xea\x03\xe2\xaf\xa7\xe5\x82\x05\xb6\x3b\x52\x38\x14\xfc\x8e\x24\x2f\x05\x9c\x69\xff\x7e\x40\xf9\x7b\xe8\x12\x5b\x70\xa5\x4f\xda\xf3\x5a\xea\xfa\xc7\x91\x14\xa7\xb4\x19\xe6\xbb\x9e\x70\xbf\x07\xad\xb5\x59\x81\x96\x00\xdc\x25\xe5\x1b\x4b\x70\x0d\x27\xca\x54\x72\xa0\xe7\xcb\xbf\xd1\x4e\x09\x9f\xaa\x3a\x72\x00\x2d\xa5\x38\xcb\xe4\x5d\x62\x1e\xf0\xd5\x25\x2b\xa2\x9d\x83\xf8\xb3\xec\x83\x89\xc9\xce\xb6\xc6\xb2\xe8\xd8\xa2\x0f"}, -{{0xa2,0xd8,0x8f,0x37,0xec,0xc2,0xb2,0xc0,0x5d,0xd6,0xcb,0x31,0x59,0x96,0x2c,0x5f,0x64,0x6a,0x98,0x15,0xb2,0xfb,0x37,0x79,0x1f,0xc7,0xb6,0x06,0xe2,0x91,0x3e,0xd5,},{0x58,0xdd,0x67,0xd7,0xa1,0x5d,0x4c,0xa0,0x34,0x1a,0x4c,0x86,0x95,0x66,0xca,0xd8,0xc4,0xee,0x16,0xe5,0x83,0xa1,0x0b,0x48,0x24,0x17,0x3b,0x08,0x29,0x0d,0x92,0xd1,},{0xcc,0xf2,0x40,0x0c,0xd6,0x73,0xe1,0xef,0xfd,0x20,0x16,0x1d,0x7b,0x68,0xa5,0xfb,0x87,0xc1,0xe9,0x9d,0x36,0x35,0xd7,0x8c,0x2d,0xa1,0xb5,0x09,0xfa,0xc3,0x33,0x46,0xc0,0x69,0x16,0x3a,0x6c,0x46,0xc7,0x82,0x6a,0x48,0xbb,0xbd,0x03,0xb0,0x5e,0x6e,0x23,0x51,0xfa,0x62,0xbf,0x89,0xbf,0x7c,0xcf,0x9a,0x90,0x24,0xbd,0x15,0x7d,0x07,},"\xd1\xb8\x7e\x9e\x88\x6d\xfb\xbd\xc8\xca\x8a\xb9\x01\x0e\xcf\x9b\xba\xf2\x3f\x72\xab\x3c\xbe\x76\x9d\xb1\xd4\x3c\x2a\x47\x4a\x81\x65\x1c\x46\x4e\x9f\xb9\x27\x34\x63\x46\x41\xc9\x48\x5a\x02\x39\xb3\x11\x07\x71\xe7\xf7\x5e\x05\x25\x2e\x4d\x8f\x4c\x0a\xa1\xba\x08\x62\x6d\x7e\x96\x31\x7c\x20\xac\xde\x2a\xd9\x9b\x23\xbd\xad\xfd\x6f\x17\x46\x8e\xb4\x02\xec\x5e\xef\xa5\x7b\x47\xca\xf9\x72\xb3\xdd\x21\xd8\x9f\x0e\x29\x89\xff\x87\xd5\x1e\xd2\xe2\xd6\x39\xc1\x64\x4e\x69\x8c\xbe\x02\x21\xb8\xe1\x79\xf3\xcf\xb0\x4a\x20\xcb\x24\x70\x21\x6a\x68\x82\xfb\x4f\xf7\x99\xe1\x15\x36\xcf\x64\x21\x9f\x0c\x07\x51\x76\xbc\x7c\xf0\xf6\xc5\xb7\x92\x5f\xcd\x61\x55"}, -{{0x42,0xaa,0xfd,0x0a,0xe2,0x6d,0xf1,0xe7,0xaa,0x02,0x76,0x86,0x0d,0x75,0x27,0x83,0xaf,0x97,0x28,0x04,0x39,0xbb,0x23,0xea,0xe4,0x6e,0x3f,0x84,0xca,0xac,0x78,0xde,},{0xda,0xa2,0x35,0x0a,0xdb,0x55,0xdb,0xa9,0xdf,0x7d,0x7a,0xf5,0x10,0x19,0x98,0xfe,0x51,0x5d,0x31,0x1c,0x3c,0xba,0x3e,0xea,0xb9,0x13,0x82,0x33,0x19,0x0c,0x3b,0x4e,},{0x11,0x61,0x43,0x65,0x0b,0x6c,0x13,0x3d,0x61,0x78,0x59,0xdb,0x24,0x29,0xc2,0x91,0x35,0x79,0x79,0x0b,0x21,0x97,0xd7,0xb7,0xb1,0xb4,0x96,0x2b,0x32,0x87,0x21,0x03,0x2c,0xee,0xca,0x58,0xb2,0xd5,0x64,0x39,0xe2,0x33,0xbb,0x84,0xdc,0x52,0x5e,0x28,0x4f,0xf8,0xdf,0x2b,0xde,0x1d,0xb4,0x98,0x6f,0xaf,0xd2,0x1b,0x3d,0x7d,0x6a,0x0a,},"\x72\x13\x1b\x80\xad\x59\x9b\x6f\x5f\xf6\x98\x54\x7d\x16\xe7\x49\x9d\x71\x27\x5e\x4e\x9b\x30\x52\x6a\x5a\xac\x0b\x0c\x8b\x14\xfa\x4a\x54\x0c\xfb\x11\x45\xfc\x00\x44\x18\xbc\xd3\x18\xc1\xa7\x0e\x62\x69\xa3\xfb\x69\xba\xed\x86\xf3\x63\xf5\xb8\xf9\x7f\x56\x9c\x20\xd4\xf4\x99\x0e\x7b\xb4\xd0\xc3\x99\x21\x26\x8d\x63\x6e\xd0\x55\x4b\xd6\x2a\xcf\xca\xcd\x3b\x8e\x03\x02\x17\xaa\xfa\xc3\x04\x4c\x03\x7e\x0f\x94\xda\x18\xc6\xb9\xa0\x93\x2c\x3c\x58\x75\xd3\xa9\x3f\xbd\xad\xcf\x67\x96\x4e\xec\x9e\xc2\xbe\x69\xb4\x8f\x02\x0f\x6c\x98\x74\xde\x5f\x8a\x51\x67\xb5\xee\x02\x4a\x2c\x2e\xfd\x0c\xdc\xd2\xac\xd8\xc1\xf7\x87\x81\x41\x41\xe3\x0b\x38\xb1\x63\x17\x5b"}, -{{0xb6,0x9c,0x33,0xb1,0x1b,0xa6,0x78,0x41,0xc3,0xd4,0xe6,0xf9,0x23,0x4e,0x35,0x37,0x0a,0x28,0xb4,0x76,0x62,0xac,0x56,0x0b,0x27,0xc0,0x78,0xb6,0x6a,0xb1,0xb0,0x21,},{0x9d,0xf6,0x8e,0x9a,0xcf,0x67,0x37,0x92,0x61,0x74,0x4d,0xb5,0xd1,0xe3,0x77,0x89,0x2f,0x2b,0x69,0x2e,0xd5,0xa3,0x8b,0x37,0x07,0x3c,0x04,0xde,0x5d,0x22,0x67,0x37,},{0x24,0x36,0x8f,0xee,0x5b,0xd8,0x48,0xb4,0xc6,0x61,0xa3,0xbe,0x4f,0x31,0x0c,0xfc,0x43,0x6e,0x79,0xec,0x4a,0x78,0x50,0x1b,0x81,0x09,0x5f,0xe5,0x16,0x14,0x23,0x1b,0x6c,0xa1,0xab,0x12,0x69,0x99,0x6a,0xd2,0xe9,0x8e,0x29,0x97,0x81,0xaf,0x8e,0x29,0x80,0x4b,0x24,0xfe,0x56,0x79,0xca,0x3b,0xa6,0x50,0xc5,0xc4,0xcc,0x58,0xce,0x01,},"\xf9\xea\x12\x6d\x3a\xb2\x19\x61\xaa\x24\x33\x90\x0a\x39\x82\xb8\x3e\x0e\xf8\x6d\x52\xd1\x34\x40\xaf\xa4\x81\x7f\x9b\x82\x2f\xb5\x82\xcc\x39\x32\xbf\x45\x0d\x46\x77\xc9\x18\x81\x81\xfe\x75\x26\xad\x6f\xe5\xab\xc6\x1d\x0a\xe7\x59\xf2\x15\x01\x3c\x0b\x2b\x41\x06\x4c\xb6\x27\x8b\xa7\xe3\x9e\x2f\x4c\x10\xd6\xcc\x96\x05\xb3\x86\x9e\x16\x9d\x7d\xa4\x2e\x88\xeb\x85\x78\x70\xfe\x61\x18\xbb\x02\xbc\x08\xc8\x05\x5f\x0c\x18\x9b\x62\xf7\x9f\xb1\x46\xb4\xc5\x43\xaa\x30\xcc\x0c\xd5\x7f\x03\x7e\x9e\xf7\xa6\x37\x11\xf6\x6e\x6f\x28\x78\x93\x17\x02\x20\x27\x02\x61\x42\x77\xd5\x13\xf0\x85\x0b\x75\x85\x49\x33\x6b\x30\xcf\x40\xab\x8b\xd4\x60\xe6\x0e\x12\xde\xed\x04"}, -{{0x7b,0x63,0x61,0x3f,0x6d,0xae,0x01,0xcd,0xcd,0x5e,0x6b,0x37,0x68,0x69,0x71,0xcd,0x8d,0x8a,0x99,0x54,0x2f,0x63,0x29,0xa1,0x28,0x54,0xa9,0xd8,0xff,0x81,0x05,0xac,},{0x72,0xec,0x43,0xfa,0xf3,0x4d,0x87,0x30,0x17,0x7d,0x1f,0x07,0x43,0xc7,0x4c,0x20,0xbf,0x72,0xc2,0x39,0x4b,0x8a,0x7d,0x47,0x1f,0xfe,0x2a,0x04,0xab,0x00,0x81,0x1c,},{0x76,0xf5,0x0b,0x2b,0x9c,0x2a,0xd9,0x7b,0xfb,0x94,0x99,0xee,0x41,0x92,0x8a,0xc0,0x72,0xda,0x5e,0x8b,0xc7,0x1d,0x02,0x12,0x55,0x09,0x42,0x33,0x2b,0x62,0xe7,0x0c,0x8b,0xfe,0x1c,0x72,0x25,0x42,0x39,0x46,0x88,0xde,0xcd,0x91,0x7a,0xec,0x8f,0x95,0x35,0x3e,0x1d,0x72,0x62,0x4b,0x70,0xeb,0xed,0x5d,0x17,0xf6,0xc5,0x49,0x77,0x02,},"\x18\x16\x48\x8f\x1f\xc8\x3e\x1e\xd5\x91\x16\x37\xdd\x42\xba\x20\x77\x65\x7d\xfe\x1a\xe4\x22\xad\x0a\xee\x59\xdf\x9d\xd5\x6a\x27\x63\xc2\xdd\x0e\xf6\x1a\x12\xbb\x82\x5b\x0d\xac\x1e\xda\x5f\xbb\x69\x1c\x5e\xd5\x8f\x3f\xb3\x25\x05\x0b\x45\x63\xa4\x04\x20\x99\x98\x2f\xff\xa5\xd6\xed\x74\x2d\x95\x82\x3d\xa8\xe1\x78\x7c\xf7\x46\xef\x63\xb3\xfb\xb0\xe8\x8a\x6c\x0b\xea\xe4\xf7\x31\x83\x66\x93\x6b\x49\x17\xf5\x07\x33\x60\x68\xb1\x94\x68\x09\x00\xa7\xbf\x4a\x6f\xb6\x9a\x5c\x38\x7b\x97\xe3\x1b\xc7\xf9\xbe\x53\xc2\xa8\x9e\x36\x51\xce\x1d\xe4\x1b\x10\xe9\x21\xb2\x06\xeb\xf3\x2e\x56\x21\xef\x80\x81\x61\x6d\xcd\x7a\x20\x59\x43\x7e\xfa\xd0\x14\xbb\x8e\x2c\x82\x21"}, -{{0x35,0x58,0xd3,0xa7,0x43,0x95,0xbd,0xcb,0xa5,0x60,0xe2,0xc4,0x5a,0x91,0x96,0x0c,0xec,0x6c,0xb3,0xed,0xbc,0xd3,0x0e,0x72,0x2f,0x7f,0x05,0x52,0x10,0xf3,0x7b,0x51,},{0x53,0x4f,0x43,0xeb,0xa4,0x03,0xa8,0x4f,0x25,0x96,0x7c,0x15,0x2d,0x93,0xa0,0x17,0x5e,0xc8,0x29,0x3e,0x6f,0x43,0x75,0x31,0x9e,0xad,0xf9,0x57,0x40,0x1f,0xbb,0xd2,},{0xb3,0x65,0xb5,0x56,0x1a,0x13,0xa5,0x45,0x17,0xcf,0x90,0xd8,0x8b,0x35,0xeb,0x09,0x67,0xd6,0xd5,0x84,0x14,0xb8,0xc1,0x54,0x7e,0x69,0x31,0x59,0xe0,0x13,0x78,0x56,0x36,0x54,0xc5,0x0f,0xb4,0x23,0x23,0xf0,0x9d,0xd7,0x8f,0xfe,0x28,0x05,0x6d,0xdf,0xa5,0x4f,0xeb,0xf4,0x48,0x91,0xe8,0xa7,0x41,0xb6,0xa1,0x68,0x7d,0x72,0x86,0x05,},"\xbe\x75\x44\x4f\x9c\xe6\xbe\x1d\x83\xaf\x62\x2a\x8c\x47\x8d\x51\x01\x27\xdb\x56\xf1\xde\x6e\xb8\xa5\x12\x65\x22\xb0\x9f\xdc\x6c\xa0\x86\x2c\xec\x0b\x8b\x2a\xaf\xa3\x1c\x17\xa2\xcc\x47\x7d\xa5\x33\xd2\x76\xa1\xae\x4f\x8e\x07\x59\xd6\xaf\xa0\xb1\x74\x11\xb5\x17\x0b\x52\xf2\x05\x47\xc7\x2f\x3e\x88\xd4\x8c\xb4\x56\xfe\x62\x5b\x62\xfe\xb0\xf8\x13\x17\xed\xf1\xec\x09\xec\xe5\x34\xb9\xf5\x00\xd4\xe1\xb1\xbd\xa2\xdb\x21\x98\x2a\xa9\x50\x94\x22\x6e\xe9\xf5\xb0\xa6\x5d\xa8\x3f\x91\x12\x1c\x96\xb3\xb4\x01\x0a\xe7\x82\x6c\x9e\x80\x63\x6c\xba\x00\xf7\x0c\x3c\x8a\x27\x9b\x01\xb9\x52\x94\xcb\x85\x0f\x91\x70\x9f\x43\x76\x66\x2a\x58\x0b\x15\xac\x29\x81\xaf\xe9\xf8\x54"}, -{{0xa3,0x5b,0x92,0xf2,0x44,0x06,0x3a,0x19,0xbb,0x5e,0x3e,0xd4,0xd6,0x99,0xed,0x20,0x69,0x60,0x71,0x16,0xd2,0xbd,0x08,0x11,0x3f,0x0d,0x83,0x73,0x61,0x3f,0x35,0xb7,},{0x7e,0xc9,0x36,0x01,0x86,0x4e,0xe4,0x99,0x5a,0x4f,0x7a,0xbc,0xd3,0xdf,0xc1,0x01,0xe9,0xe7,0xf3,0x69,0xe6,0x3d,0xe1,0xae,0x68,0xa0,0x7a,0xa7,0xf0,0x75,0xb3,0x29,},{0xa2,0x3d,0xbe,0x37,0x57,0xe4,0x78,0xdb,0xc8,0x4d,0x3d,0xb3,0xa9,0x33,0xb0,0x42,0x8c,0xed,0xb6,0xb0,0x1b,0x86,0xd8,0xd7,0x3f,0x39,0x59,0x87,0x8d,0xae,0x6f,0x05,0x88,0xf5,0x05,0xcd,0x4d,0x39,0xf2,0xab,0x46,0x77,0xb6,0x48,0x05,0xd6,0x29,0x65,0x2a,0x22,0x52,0x98,0x25,0xc3,0xa9,0x1d,0x04,0x37,0x49,0xfc,0x71,0xf0,0x37,0x06,},"\x65\xcd\x36\xda\xe0\x16\x8d\x69\x97\x4f\x95\xf0\x9d\xd9\xa5\x9d\xb7\x99\xf9\x11\xe1\xa1\x5b\x85\xa0\x08\x93\xb8\xc9\xa3\xd4\x8a\x2f\x58\xac\x12\x6b\xfa\xa0\xa6\x06\xc0\x5d\x94\x70\x1d\x27\x3a\xbf\x7d\x68\x81\x7f\x2c\x71\xb1\xc5\x41\x79\x5c\x4f\x60\x95\xe2\x6c\x9d\xff\x80\x3f\x03\x2f\x75\x66\x3f\xd1\x69\x8e\xdd\x97\xff\x3a\x0e\x72\xe1\xb7\xc9\x94\x8b\x08\xba\xcb\x5f\x7d\xe5\x02\xb2\xfe\xa6\x7c\xa2\xfe\xf1\x90\xd6\x0e\xae\x92\xd1\x51\x58\xda\x44\x4a\x49\xd2\xe9\xd5\xa5\x73\xe8\xe1\x77\xe8\xbb\xf7\xe6\xc4\x9f\x90\x71\x36\xe7\x1d\x2a\x66\xcb\x07\x63\x6d\x48\x76\x8f\xf4\x17\xc8\xbe\xcc\xf4\x32\x31\x81\xfe\xfb\x31\x24\xe4\x34\x04\x9e\xa4\x5d\xd5\x01\x9e\x40\xb4"}, -{{0x72,0xd4,0xa5,0x64,0xca,0x15,0x49,0x9b,0x5e,0x4e,0x75,0xd8,0xac,0x0f,0x28,0x21,0x7d,0x32,0x11,0x4a,0x0c,0x64,0x9a,0x7c,0x8e,0xaa,0xdd,0x0c,0xc7,0x8c,0x52,0x0b,},{0xc7,0x66,0xbd,0x73,0x83,0x7c,0x4f,0xaa,0x52,0x15,0x50,0x2f,0x1e,0xfc,0x90,0xc0,0x03,0xf7,0x11,0xbb,0xef,0x55,0x17,0x00,0x91,0x02,0x8a,0x34,0x49,0x34,0x08,0xa9,},{0x8f,0xc4,0xf1,0x79,0x33,0x0b,0x64,0x2d,0xd8,0x6c,0xa9,0x36,0x26,0x51,0xb8,0x3b,0x00,0x6d,0x83,0x75,0xcc,0xef,0x81,0x1d,0x3c,0x67,0x06,0xf9,0x15,0x94,0x65,0x1d,0xf2,0x76,0x99,0x53,0x72,0x30,0x46,0xcc,0xb9,0xbf,0xe6,0x6a,0x66,0x7e,0x0d,0x11,0xfc,0x3e,0xa2,0xd8,0x22,0x62,0x34,0xfd,0xd5,0x16,0x47,0x65,0x26,0x0f,0x7b,0x05,},"\x6c\x7e\x7b\x62\xeb\x24\x4a\x45\xd7\x84\x36\xe2\x97\x0d\xcd\x6c\x0f\x7d\xb8\x22\x97\xa8\x61\x40\xea\x58\xdd\x22\xc2\x19\x5a\xdb\xc9\x56\xd4\xc4\xec\x05\x35\x4b\x21\xef\xe2\x4c\xfc\xfe\x10\xe1\x76\x22\x36\x88\x48\x18\x0d\x2c\x46\x80\xcc\x21\x5e\x8c\xee\xa6\xcc\xe2\x22\x16\x1f\x1e\x09\x22\x39\x25\x3b\x97\x46\xf7\x88\x7d\xf2\x42\x5a\xb5\xa8\x80\xbd\xba\x98\x15\x3b\xe7\x86\xdc\x83\x8c\xbe\xca\x01\x6b\x1d\x06\x52\x4b\xd6\xbf\xba\x80\x9a\x8b\xb3\x7a\xda\xb1\x5d\x42\x41\x5f\x86\xec\x03\x58\x36\x5e\xa8\x7b\x81\x50\xb0\x54\x41\xd9\xd4\x98\x46\x87\x14\x85\xca\xae\x6d\xe3\x59\x73\x6c\x27\x18\x97\x36\xd8\xf1\x76\x5f\x3e\x5c\x5f\x6b\x92\x16\x83\x96\x39\x0b\xee\x94\xcf\xbd"}, -{{0x2e,0x5a,0xaa,0xb2,0x98,0xe6,0x6c,0x2d,0xc1,0xd7,0x7e,0xa7,0x42,0x1f,0xf8,0x95,0x25,0x5f,0x9d,0x90,0x0d,0xb0,0x45,0x0d,0x63,0xf9,0xf7,0x9c,0x1a,0x70,0x13,0xcf,},{0x03,0x81,0xf3,0xf1,0x90,0x45,0x71,0x9b,0x9e,0x8c,0xeb,0x56,0x2f,0x0e,0x96,0x5d,0xc0,0x7b,0x09,0xf3,0x71,0xa9,0x63,0xa2,0x81,0xc7,0x49,0xc2,0x53,0x2f,0x65,0x4a,},{0x7c,0x74,0x30,0x30,0x5b,0x36,0x1a,0x9e,0x35,0xb2,0x78,0x0c,0x4d,0x44,0x08,0x07,0x1b,0x21,0x30,0x93,0x1d,0x39,0x83,0x0e,0xc8,0xd3,0x13,0xaa,0xfb,0xc8,0x3a,0x65,0xda,0xe1,0x9c,0xb7,0x47,0xd9,0xd1,0xc4,0xce,0x3f,0x35,0x9c,0xc8,0x24,0xea,0x8c,0x92,0xf6,0x6a,0x42,0xb8,0x61,0x4e,0x78,0x48,0xb8,0x84,0xac,0x8a,0xa4,0xae,0x02,},"\x3d\xf0\xe5\x4c\x71\x1e\x31\x32\xd7\xae\x95\x3d\xeb\x7b\x66\x86\x9e\xe5\x31\xee\x40\xb6\x3c\xe6\x93\x20\x6c\xdb\x2f\x4b\xda\x0a\x25\x69\xe9\x13\xac\x3e\x65\x32\xc5\xd9\x64\x8e\xfd\x46\x27\x78\x0f\xb8\xa3\x1d\x10\x7e\x03\x3f\x05\x4d\x19\xed\x8b\x7c\x49\xdc\x40\x7d\x2e\x94\x9d\xe2\x5f\x99\x30\x72\x21\xd3\x58\x43\xf6\xd5\xeb\x7d\xe5\xcd\xf4\x1b\x91\xdb\xbf\x34\xcb\x6c\x9c\x53\x00\x21\x01\x4b\x56\xab\xc4\x4a\xc2\x30\x03\x13\x61\x56\x08\xa7\xb4\xa2\x35\xe9\x9c\x14\xce\xf8\x05\x08\x87\x03\x22\x09\x48\x8b\x9e\xae\xaa\x82\xc0\x94\x05\xfc\x75\xbe\xc9\x4d\xd4\x2d\x6f\xf1\xb5\x99\xa6\x3e\xe5\x74\x2f\x33\x64\x09\x3a\xc9\x2c\xab\xab\x30\x35\x82\x2a\xa8\x67\xae\x56\xdc\xc9\x9d"}, -{{0xb6,0x36,0xa0,0x24,0x48,0x00,0x35,0x43,0xdb,0x86,0x4b,0x40,0xb5,0xd8,0xd6,0xdd,0x9a,0xd6,0x11,0x62,0x4c,0x9b,0x0f,0xc6,0x89,0x0c,0x51,0xea,0x55,0x92,0xc7,0x90,},{0x1e,0xf3,0x60,0x49,0x59,0x68,0xe5,0x6e,0x6d,0x3f,0xe7,0x40,0xb1,0xc8,0x4c,0x4e,0x44,0x90,0xed,0x68,0x2d,0xeb,0x43,0x05,0xaf,0xd5,0x96,0xef,0xb2,0x80,0x22,0x3b,},{0xd4,0xba,0x80,0x30,0x0d,0x5c,0xb5,0x13,0x53,0xc0,0x3f,0x28,0xc4,0x4f,0xd0,0xa4,0x24,0xff,0xe1,0xe4,0x0d,0x78,0xed,0x7b,0xb1,0x13,0x3e,0x8f,0xe4,0xe1,0x87,0x50,0x52,0x93,0xb2,0x0a,0x39,0x1d,0xa9,0x62,0xc6,0xa8,0xac,0x0a,0xce,0xc9,0xc6,0x72,0x26,0xaf,0x3b,0x61,0x95,0xda,0xbe,0x39,0xb3,0x66,0x22,0x94,0xda,0x3e,0x0e,0x09,},"\x4a\xa8\x5a\xac\x25\x03\x4f\x61\x4e\xd4\x4f\x7a\xdc\xdb\xee\xec\x25\xfc\xc2\xa9\xee\xa3\x2a\xb6\xa8\x69\x95\x06\xf7\xa1\xca\xd3\xbc\x89\x2e\x9d\xce\x93\x4e\x75\xb0\xa8\xcd\x14\x64\x2b\x77\x85\x99\x28\x6c\xfd\x8f\x50\xa9\xe4\xf2\xed\xf9\xf9\xd6\x29\x1a\x2e\x29\x79\xcf\x18\x06\xb9\x3e\xd8\xc9\xa7\x8f\xae\x19\x9b\x28\x54\xa0\x3e\xc4\x06\xab\x3f\x72\x08\x35\xee\x26\x3f\xbb\xc9\x1c\xb4\xef\x07\x58\xd7\x75\xfc\x78\x4c\x7d\x5b\x25\x1a\xc8\x93\x79\x19\xa9\xe6\x7b\xe8\x8c\x9e\x44\xcf\x2e\xc7\xf5\x60\x26\x9a\xa0\xf1\x11\x3d\x91\xb8\x44\x01\xdb\x15\xa3\xc4\x8c\x7d\xac\xff\x49\x39\xee\x01\xba\xbb\x98\x2f\xb9\x56\x25\xc6\xc3\xad\x78\x74\x90\x60\x55\x1b\xfd\xe8\xcc\xe4\xfb\x8a\x29"}, -{{0x5c,0xa0,0x54,0x3c,0x71,0xf5,0x68,0xa0,0x0e,0xed,0xf5,0x0a,0x95,0x20,0xf4,0xc1,0x5b,0x52,0x6e,0x3f,0xb0,0xda,0x81,0x6c,0x29,0xea,0x3d,0x50,0xb2,0xf6,0x2a,0x12,},{0xd4,0xa2,0x93,0x3c,0xe1,0x94,0x54,0xe3,0x31,0xb5,0x28,0x01,0x00,0x20,0x9a,0x6c,0xe8,0xe5,0x69,0xf9,0x93,0xc2,0xac,0xab,0x51,0xdb,0xe8,0x64,0xc5,0xcb,0x25,0x63,},{0x43,0x68,0x23,0xee,0xff,0x3e,0xdc,0xe5,0xd8,0x58,0x7d,0x68,0xe5,0x47,0x3e,0xf3,0xd8,0xdc,0x94,0x65,0xb5,0x58,0xb6,0xe8,0xe7,0xcd,0x31,0x37,0xec,0xcc,0x80,0xb4,0xc4,0xe8,0x06,0xed,0xf1,0x36,0x19,0xd8,0xe7,0x17,0xe6,0x9f,0x48,0xd7,0x06,0x1b,0x68,0xde,0x02,0xc8,0x20,0x9b,0xe1,0xf7,0xac,0x26,0xba,0x8e,0xdf,0x60,0x6d,0x02,},"\x4e\xf8\x49\x69\x78\xd2\x8c\x10\xab\xd5\x4a\x26\x35\x6e\xe5\x59\x21\xce\xb3\x50\xdd\x4b\x74\x2c\x41\x61\xfb\xeb\xa8\xa1\x60\x1f\x8a\xd0\x48\x4b\x21\xa8\xcf\x5a\x29\x4f\xac\x00\xec\x8a\x6f\x59\xe3\x36\x2e\x47\xbf\xae\x1e\x28\xa2\xe6\xd0\x17\xc5\xca\xa7\x5f\xb0\xf4\x84\x82\x80\x80\x37\xca\x21\x47\x69\x54\xd7\x78\xff\x1a\x05\x86\xda\x3e\xf6\x9d\x6c\xef\x6d\x2d\x8d\xf4\xae\x7a\x85\x44\x2a\x1e\x46\xc9\x98\xcf\x40\x7a\x6a\xd4\xc5\x46\x3a\x43\xc2\x48\xf3\xb6\x93\x7f\xdb\xc8\x45\xb6\x0c\x6d\x85\xe0\x56\x3c\xc1\x6b\xa9\x67\x5d\x36\x4f\x52\x5f\x66\x9a\xaa\xc9\x5f\x42\x8b\xb5\x82\x05\x09\x9f\x9e\x4a\x6d\xbb\xd0\x15\x1f\xb6\x5b\xab\xe1\x23\xe5\x39\x3a\xd6\x40\x26\x93\x5c\xb4\x88\xaa"}, -{{0x5f,0x87,0x11,0x7d,0xa9,0xbb,0xb6,0x09,0x1c,0x94,0xda,0x6b,0x23,0x0b,0x7d,0x8f,0x6d,0xe0,0xed,0x2a,0x07,0x64,0x13,0xb9,0x2e,0xac,0xdc,0x43,0xab,0xbc,0x68,0x97,},{0xaa,0x78,0x6a,0x14,0x62,0x26,0x83,0x2a,0xa7,0x3c,0x43,0x4b,0x0e,0xdc,0x2d,0x41,0xd2,0x55,0x8f,0x82,0x0a,0xb8,0xf8,0x7e,0x09,0xe6,0xcd,0xa9,0x10,0x72,0xb9,0xb6,},{0x0f,0x19,0xe6,0xea,0x0c,0x05,0xf3,0x81,0x85,0xc0,0x1c,0x2d,0x64,0x77,0x99,0x5d,0xaf,0x50,0x65,0xba,0x9d,0x80,0x17,0x3f,0xa6,0xbb,0x23,0xa7,0x74,0xdc,0x88,0xb3,0xaa,0xe8,0x79,0xd8,0xa6,0x24,0x71,0xd2,0xd3,0x04,0xcc,0x3d,0xc6,0x62,0x78,0xa7,0xab,0xcb,0x0b,0xb0,0x77,0x1c,0xd2,0x78,0xe1,0x1e,0x7b,0x93,0x2e,0x9f,0x9b,0x0f,},"\x22\x97\xc4\x0a\x2e\x83\x65\xba\xe4\xc5\xf0\x63\x0c\x50\xb1\x3b\xdd\x9a\xd9\x77\x0a\x5d\x9a\x94\x51\xd0\x08\x74\xb0\x23\xd2\x5e\xcd\x46\x8b\x96\x57\x1b\x2f\x16\xdc\xb1\xb0\xd3\xd7\x56\xc1\xf0\x44\xfc\xdd\xd1\xc5\x1f\x27\x72\x7a\x03\x69\xc9\xcf\x25\xbd\x6a\xa5\x95\x51\xb5\xb0\x7c\xf8\xf8\x07\xd9\x2b\x15\x91\x98\x63\x97\x04\x74\x0f\xe6\xed\xa0\xf2\x6d\xba\x7e\x75\xd4\x53\x0b\x28\x00\xf0\x3f\xb6\xaa\x67\x7d\x84\xdf\x75\xd6\x8d\x4f\xbb\x64\xad\x21\x00\x1e\x3f\xc8\x7b\x60\x9b\x9c\x25\x1e\x8c\xcb\x12\xbb\xca\x92\x74\x47\xe2\x05\x4e\x07\x68\x8e\xb8\xa2\x05\x21\xa5\x22\x49\xe7\xb9\x43\xbe\xd6\x0e\x6a\x93\xc0\x1e\x3e\xb6\x21\xf0\x46\x0c\x18\xa6\x90\xb6\xf6\xb6\x6e\xdc\x6e\x87\x43\xa6"}, -{{0xb5,0x3a,0x64,0x4c,0x92,0xba,0x2d,0xc7,0x10,0x8b,0x16,0x83,0x3f,0x09,0xad,0x59,0x17,0x84,0x64,0x37,0x22,0x5a,0x77,0x3d,0x32,0xd7,0x9c,0x97,0x73,0x3c,0x0a,0x58,},{0x51,0x58,0x18,0xc6,0x9c,0x0e,0x0a,0x17,0x06,0xb0,0x41,0x43,0x84,0x2f,0x3e,0x9e,0x27,0x14,0x48,0xfb,0xaf,0x3a,0x89,0x91,0x19,0xc3,0x2f,0x42,0x56,0x6f,0xfd,0x33,},{0x13,0xd2,0xcb,0xac,0x79,0x76,0xad,0x27,0xf0,0xbf,0x66,0x9a,0xd5,0x88,0xef,0xb2,0xc9,0x1b,0xab,0x85,0x07,0xd5,0x7f,0xb1,0x6b,0xfe,0xa9,0xca,0xff,0x2b,0x09,0x64,0xe7,0x56,0x25,0xc4,0xd8,0x08,0xd7,0xbb,0xb7,0x8c,0x5b,0x46,0x4e,0xdf,0xfe,0x49,0x49,0xec,0xfb,0xc8,0xb9,0x5f,0xf6,0xfd,0xb1,0xbd,0xca,0x27,0x42,0x06,0x81,0x00,},"\x13\x03\x6d\xaa\xee\x45\xfc\xfd\xe0\xc5\x3e\x06\xd0\x5a\xa9\xc0\x1e\xa9\x4a\x67\xe8\x6c\x6c\x53\x8c\xcb\x28\x3b\x36\x8d\xaf\x70\x78\xd3\xfb\xab\x58\x0c\x76\xec\xf8\x2b\x4e\x96\x60\xf0\x68\xdc\xbb\x50\x0b\x80\x59\x50\x17\xc5\xbe\x3c\x44\x8f\xbd\x8a\x17\xd9\x7c\x56\x43\x19\x78\x90\xe1\x67\xb3\x53\x45\xbf\x65\xe7\x5b\x82\xc8\xd6\x52\x29\xf2\xf6\x0a\xae\x27\x72\x58\x1b\xc9\x9c\x49\xd4\x16\xbc\x3d\x78\x74\x6e\xf8\x30\xf1\xaf\x94\x4f\x4a\x67\x15\xab\x4f\xfb\x01\x59\x1b\xac\x28\x57\xf1\xa9\xc9\xd1\x70\x08\x88\x78\x00\x06\xa3\x16\x07\x33\x8f\x7a\xf7\xbe\xdf\x6e\xfe\x0b\x57\x29\x9a\xc9\x15\x52\x6f\xe5\xe1\xe1\x01\x29\x87\x08\xc6\xe6\x1b\x84\x22\x0a\xfe\x95\xb5\x3f\x89\x59\x87\x45\x61\x52"}, -{{0xd2,0x7c,0x9e,0xaf,0xcf,0x88,0x15,0x19,0x90,0xbb,0x5b,0x2f,0xa8,0x44,0x3e,0x70,0x9b,0x5f,0xd8,0xd7,0x8d,0x23,0x38,0x03,0x32,0x2d,0xc8,0x6d,0x93,0xd9,0x32,0x95,},{0x08,0xe0,0xef,0xf5,0x29,0x77,0x67,0x14,0x68,0x61,0x96,0xd8,0x17,0xfd,0xf7,0x1e,0xb5,0xb6,0xe8,0x32,0x65,0x16,0xef,0x48,0x9b,0xfe,0x18,0x6a,0xc5,0xc5,0xbf,0x6d,},{0xc2,0x54,0xe3,0x71,0x44,0x56,0x33,0x13,0x74,0x42,0xee,0xfe,0x40,0xad,0x4a,0x82,0xe6,0x9b,0x1e,0xbf,0x48,0xa6,0x85,0xa2,0xbc,0x6f,0xfb,0xac,0x12,0x6d,0x22,0x84,0x87,0xb2,0xe3,0x53,0x7c,0x97,0xef,0x74,0x10,0x34,0x20,0x91,0x96,0x2e,0x50,0xc0,0xcb,0x85,0xde,0x7b,0x39,0xce,0xb4,0x1a,0xc4,0x07,0x8d,0x40,0xf3,0x40,0x71,0x06,},"\x77\xc3\x5b\xda\x32\xa5\x96\x7d\x8b\x30\x2f\xa7\xa4\x75\x83\xce\xab\x89\xc9\xa6\x09\xa6\x67\xb7\x53\x15\x5f\xa6\x99\x6f\x86\x31\xd0\xeb\xed\xfe\x0a\xc3\x64\xc7\x7e\x85\xba\x37\x31\x1f\x0d\xe5\x7a\x0d\xc2\xc1\xe9\xe4\x00\xd5\x8b\x42\x4a\x32\x2e\x1d\x57\x71\xe0\xa9\xfd\x95\x02\xad\x02\x32\xce\x54\x4f\x07\xd8\xc6\x6e\x7c\x31\x47\xf8\x60\x7a\xc6\x18\x9b\xb6\x90\x66\xf2\xfa\xd6\x31\x18\x5f\x45\x7f\x46\x7e\xba\x33\x22\x8e\xcc\x40\xe8\x94\xa7\x7b\x57\x16\x98\xa9\xbf\xac\x84\x1a\x54\xea\xc5\x21\x9d\xa9\x9c\x6a\x91\x25\xc4\x69\xa2\x2f\xe8\x1f\x3b\x95\x14\x33\x89\x6f\x19\xce\x39\xb3\x73\xfd\x7e\x5c\x7b\x65\x0a\x5e\xf2\x36\x5a\xe7\x51\x0b\x0d\xa5\xe4\x9d\x7c\x07\x07\x3c\xf1\x66\xa9\x83\x87\xe8"}, -{{0x70,0x21,0x3d,0x3a,0x79,0xc6,0x5d,0x6d,0xbb,0xa5,0x42,0xa3,0x67,0x96,0x35,0x00,0x3a,0x68,0x2a,0xf5,0xfa,0x58,0xde,0x6b,0x0d,0x65,0xbf,0xa2,0x41,0x84,0x90,0x1c,},{0x44,0x02,0xfb,0x92,0xcc,0x12,0x49,0xdd,0x1a,0xe1,0x69,0x0f,0x03,0xb3,0xec,0x4f,0x1e,0x9b,0xda,0xb0,0xde,0x5b,0xfd,0x28,0x9f,0x10,0x29,0x68,0x30,0xfd,0x40,0x3e,},{0x5b,0x6c,0xe2,0x77,0x4d,0x40,0x0e,0xce,0xa8,0xa8,0x08,0xf5,0xfd,0x0a,0x79,0x7f,0xfc,0x61,0x16,0x75,0x23,0x76,0xcd,0x7b,0xfa,0x3b,0x2c,0xca,0x3a,0x84,0xd5,0x59,0x3f,0x5c,0x03,0xad,0x3e,0xec,0x1d,0x89,0x53,0x22,0x75,0xc4,0x7b,0x7c,0xe2,0xa0,0xe9,0xc5,0x9c,0xc4,0x02,0x8a,0x8a,0x65,0xe5,0xbb,0x90,0x97,0xea,0x71,0xc2,0x08,},"\xcd\x6e\x1c\xd9\xc9\x0f\x56\x6d\xe0\x43\xd7\x5d\x72\x44\xec\xfd\xb3\x8e\x8b\xde\x2f\x9a\x6c\xd5\xa4\xfd\xac\x72\xb5\xed\xe6\xaf\x62\xd9\x81\x91\x8c\x5e\x61\x0a\x38\x78\x92\x74\xfa\x10\xe5\x27\xf8\x5f\xad\x20\x9b\x76\xca\x1c\x28\x1a\xd5\x89\x0f\x9c\x96\xd3\x5d\xe5\x22\xf1\xdd\xcc\xb5\x39\xb8\x79\x8a\x00\x67\xac\xdd\x45\xb6\xe3\x44\xa5\xd9\xa9\x77\x31\xf5\x45\xff\xa4\xb1\x7b\x87\x5c\x67\xb4\x8e\x9d\x4c\x4b\xa7\x2c\x98\xa4\x50\x55\x83\xfd\xbf\x1e\x12\xf2\x2b\x5a\x7a\x49\x47\x46\xcc\x9b\x6c\x1b\x57\x19\x06\xc6\x7f\xcc\x88\x3a\x9c\x15\xa3\x80\x68\x75\xb6\x59\xe5\x81\x6b\x42\x76\xc3\x19\x0e\x25\xcc\x1a\xc3\xde\x47\xbf\x99\xc4\x99\x65\x38\x8f\x54\xf3\xef\x8e\xb5\x69\x90\x6c\x60\x08\xe5\xfb\xbd"}, -{{0x5d,0x54,0x0b,0x3b,0x14,0xf0,0xc0,0x17,0x5c,0x04,0x7e,0xaf,0x02,0x6c,0x90,0x70,0x65,0x9e,0xf1,0x3e,0x9d,0x28,0xe0,0xc5,0xc5,0x16,0xa4,0x28,0x26,0x9b,0x14,0xeb,},{0x1d,0x2d,0x4d,0x55,0x1a,0x57,0xc6,0xfb,0x2b,0x04,0x18,0x10,0x49,0xd4,0x03,0x9d,0x57,0x5c,0xf8,0x0c,0x0b,0xc6,0xec,0x70,0x33,0x06,0x7f,0x27,0x30,0x93,0x44,0xde,},{0x32,0x52,0x7d,0xa7,0x55,0x31,0x28,0x89,0x93,0x5d,0xd5,0xee,0x91,0xb1,0xbb,0x11,0x7a,0x5d,0x37,0x7d,0xd2,0x3e,0xf5,0xb7,0xe1,0x5b,0xaf,0xfa,0xe9,0xa5,0x43,0x91,0xa3,0xfd,0x23,0x4b,0xdc,0xe0,0x73,0xe0,0x98,0xc5,0x8d,0x05,0xbf,0x19,0x5b,0x4c,0x3c,0xc6,0x39,0x72,0x38,0x3b,0xa4,0xb5,0x10,0x72,0x97,0x1a,0xeb,0xcb,0x62,0x0d,},"\xe4\xc9\xe8\x70\x68\x98\xca\xd4\xac\x68\xd7\x3c\x13\x0e\xfa\x04\xa5\x4f\x8c\xa2\x59\x19\xea\x6b\xfa\xa5\x4c\x8c\x72\x0c\xed\x85\x4c\x5e\x95\x09\x10\x2c\x7b\x88\x5a\xed\xdf\xfb\xd1\xb7\xf2\xc5\x92\x25\x83\x67\x7a\xc9\xee\xa9\xa1\x08\xc7\xe8\x3e\x88\x71\xae\xd5\xa0\x84\xf5\x44\x0b\x0f\x39\x1a\xd7\xff\xc6\xba\xb4\x57\x4a\xf1\xb9\x67\x70\xf4\x37\x0e\x8e\x98\x8e\x85\xec\xb1\xa8\xd6\x03\x4f\xc3\xd7\xf4\x9f\x74\x22\x02\x3b\x9d\xab\x5d\x0c\x16\xbe\xab\x5f\x5d\x37\xb0\xa4\xd7\xde\x19\x7a\xd8\x7c\xd4\xff\x8c\xe7\x8e\xb1\x2e\x1d\xaf\x73\x9d\x8b\x47\xab\x38\x0a\xbe\x90\x93\x35\x6d\xb5\xb5\x97\x17\x75\x1a\x49\xe1\x94\x84\x72\xfd\xac\xc2\x59\xff\xff\xc8\xc1\xdb\xae\x59\x26\x07\xd4\xec\x71\xcc\x6a\x8f\x6b"}, -{{0xca,0x41,0x76,0x9c,0xaf,0x17,0x17,0xb4,0xe4,0x5c,0x93,0xc1,0x21,0xdc,0x82,0xa5,0x34,0xfb,0xc6,0xec,0x09,0x86,0x66,0x2c,0x32,0x22,0xd7,0x14,0x92,0xbd,0x11,0x76,},{0xaf,0x3f,0x89,0xf6,0x18,0x7d,0xbc,0xf9,0x21,0x77,0x50,0xc6,0x7e,0xf8,0x9e,0xd4,0x7b,0x03,0x9f,0x9e,0xb0,0x62,0xff,0xec,0x9d,0xf6,0x4a,0xb5,0x2b,0x0b,0x45,0xcb,},{0x5c,0xda,0x87,0x2f,0x7e,0xd6,0xd7,0xc9,0x02,0x18,0xac,0x10,0xbe,0xe8,0xe2,0x14,0xf3,0xb3,0x4d,0x15,0xd2,0x5c,0x39,0x25,0x5e,0xc9,0xe6,0xb0,0x17,0x7a,0xa3,0xcb,0x73,0x68,0xd1,0x1c,0xb8,0xed,0x6f,0xf5,0xcf,0x0c,0x04,0x28,0x1d,0x06,0xbc,0x42,0x72,0xb8,0xbc,0x09,0xc2,0x3f,0x6f,0x4c,0xd5,0xa8,0x10,0xdd,0xc7,0xb9,0xc1,0x03,},"\x9d\xe8\x47\x6c\x58\x13\x84\x8a\xb1\x45\x15\x37\x84\x1c\xc1\x78\x00\x21\x81\xa2\x18\x2a\xf3\x05\xb1\x2e\x5f\x7c\x3b\x1d\x56\xb2\x2c\xf4\x6a\xe6\x27\x6d\x18\x26\xec\x0a\x8c\x9a\x7d\x9f\x68\x08\x3b\x72\x25\xbb\xfa\xef\xce\x82\xb3\xb6\x45\x94\x05\x2a\x77\x00\xf3\x09\x23\x3a\x79\xff\xfd\xfc\xcc\x5c\x21\x40\x0c\x91\xcc\x0e\x41\x8d\x51\x41\xd4\x86\xb5\x21\x99\x01\xd6\xdd\x24\x47\xc1\xf7\xb7\xcf\x5a\x08\x79\xe7\x0e\x1d\xd6\x58\xd0\xf2\xec\xf3\x1e\xbe\xee\x11\xa5\xc7\x44\x40\xc6\x3b\x9d\x8b\x45\x31\x8c\x34\x65\xd7\xff\x03\x36\x5e\xdd\x03\x85\xed\xf8\x0d\x4f\xde\xd5\x1f\x0f\x75\x33\xee\x40\x99\xf1\x9e\x93\xbc\x9d\x08\xda\xdc\xd1\x34\x85\xdb\x23\x95\x22\xff\xc8\x1e\x2c\x05\x1f\x87\x96\xd6\x2e\x97\x9f\xcf"}, -{{0xfe,0xdd,0x63,0xff,0xd4,0xcf,0xbf,0x61,0x88,0x94,0x96,0x2e,0x12,0x1a,0x90,0x25,0xee,0xa3,0x18,0xa8,0x0a,0x1a,0xdf,0x16,0x9d,0x64,0x90,0x44,0x5d,0x2e,0x02,0xa0,},{0x54,0x2f,0x22,0x44,0xbd,0xb7,0xd8,0x4b,0x87,0xe6,0x28,0xa8,0xe6,0xa1,0x2f,0x17,0xbf,0x74,0xa9,0xa6,0xd0,0xea,0x46,0xc5,0x95,0xdb,0xfd,0xc6,0x80,0xc0,0x4b,0x26,},{0xed,0x59,0xd9,0xe2,0x3d,0xec,0x34,0x94,0xb0,0xfb,0xc5,0xd1,0x0c,0xd0,0x2b,0xab,0x86,0xb3,0xeb,0x35,0xab,0xbf,0x9e,0x4d,0x4a,0x92,0x64,0x79,0xf1,0x34,0x58,0x3a,0x44,0xce,0x72,0xdc,0x41,0x22,0xac,0xa3,0x77,0xa4,0x07,0x2b,0x71,0x56,0x46,0x2b,0x74,0xe8,0xdf,0x46,0xb6,0x86,0x69,0x86,0x36,0x83,0x6e,0xf2,0x03,0x17,0x9c,0x07,},"\x2e\x2a\xe5\x84\x64\x1b\xe0\x3d\xd4\x8f\x9c\x61\x80\x77\xae\xaa\x18\x21\x2a\x42\x41\xf0\xc0\x19\x4e\xd2\x3e\x37\x0d\x74\x1a\x3a\xe1\x1a\x5f\xec\x3b\x04\x0c\x16\xea\xfa\x4a\xc8\xd1\x8a\xba\xa7\xce\x8f\x28\x69\x67\x33\x71\x89\xf0\x49\x5f\xfd\xd6\x19\x95\xcd\xe3\x1d\xd8\xdf\xc3\xdf\x57\x00\xb5\x7a\x7a\x29\x98\x0e\x9c\x82\x3f\xee\x85\xd6\x14\x51\x17\x67\x29\xe7\x27\x87\xc6\x10\x9b\x47\x35\x9b\x93\xdf\xd6\x2e\x1e\x5a\x2d\x64\x2c\x05\x72\x42\xda\xe5\x00\xa9\x4c\xa1\xa9\x3b\xc5\x7b\xe1\xad\xe7\x6f\xe4\x50\x1c\x0f\x63\x77\xed\x0e\x92\x46\x17\x9a\xec\xdd\x99\x46\xb6\x71\xe8\x19\x0e\x1e\xd2\x3f\x96\x6e\x96\x40\x9b\x94\x82\x22\xd8\xea\x58\x39\xde\x90\x4f\xc5\x13\x48\x07\x3b\x8f\x40\xed\xbd\x9b\x4a\x4b\x22\x75"}, -{{0x38,0xf2,0x18,0x4e,0xaa,0x55,0x36,0x56,0xee,0x29,0x02,0x70,0x6b,0xce,0xc4,0xac,0xb5,0xaf,0x25,0x15,0x7c,0xa0,0xf6,0xa2,0xd4,0x8d,0xe8,0x52,0x85,0xfa,0x3b,0xc0,},{0x7f,0xf0,0x3f,0xb4,0xc8,0x2e,0x9c,0x15,0xd6,0x59,0xdf,0x42,0x4b,0x3e,0x73,0xed,0x1d,0x78,0x00,0x6f,0x3e,0x0b,0x79,0xeb,0x64,0xd9,0x8c,0x13,0xae,0xc6,0xba,0x37,},{0x4a,0x64,0x13,0xc2,0xc8,0x7f,0x2b,0x38,0x56,0xa8,0xde,0xcb,0xce,0x49,0x3a,0xde,0xae,0x0c,0x69,0xc9,0x41,0x34,0x70,0x7f,0xb0,0xf1,0x8f,0x30,0x49,0xfd,0x3e,0x3d,0x05,0x1a,0xbd,0xb9,0xd4,0xbe,0xe2,0x53,0xc6,0x10,0x7c,0x02,0xd5,0x7a,0xd7,0xcc,0x9f,0x31,0x01,0xdb,0x66,0x0a,0xfa,0xc2,0xb7,0x98,0x19,0x38,0xe9,0x56,0x4f,0x01,},"\xc2\xdf\x77\xc9\xe4\x79\xf6\x19\x83\xb6\xc7\x48\x3e\xf9\x3f\xb8\x5a\x10\x3b\x21\x39\x23\x92\x65\x23\x06\x5e\xbf\xf2\x25\x7e\x85\x42\x7e\x05\xcd\xc2\x75\x82\xef\x6c\x16\xbe\x35\x3a\x3b\x25\x03\x72\xd6\x37\x0e\xec\xb6\xc8\x96\x29\x17\xeb\x65\x6f\x26\x41\x69\x01\x89\xd1\x72\xa1\x11\x05\x15\x57\xab\xc2\x49\x4e\x32\xca\xb6\x5e\xd0\x63\x3a\xff\xe9\x24\x08\xb5\x5c\x4e\xd8\xaf\x65\xe2\xc5\xe7\xaa\xb8\x87\xa3\xcc\x8d\x28\xc5\x2e\x9e\x13\x36\xd0\xb7\xbb\x3f\xe2\xcd\x84\x3e\x7f\xa1\x68\x03\x42\xf8\xa4\xaa\xfa\x02\xc4\xab\x25\x2f\x08\xc3\xd4\x6d\x5f\x00\xfd\x01\x48\x42\x63\xee\x63\x52\x84\xf6\xdb\x26\xd6\x29\x8d\xe5\xb0\xdd\x23\x8d\xa4\x0a\x8d\x2a\x93\x37\x6d\xa0\x30\x27\x83\xa0\xe3\xbe\x23\xd9\xe7\xf9\x90\xd2\x5b"}, -{{0x8b,0xfc,0xa4,0x84,0x62,0xd2,0x53,0x6f,0x74,0xb8,0x4f,0x6a,0xf5,0x9f,0x5d,0x85,0x82,0xff,0x8f,0x7e,0xc2,0x87,0x45,0xd6,0x72,0xe7,0x2e,0xb7,0x2e,0x79,0xd3,0xe9,},{0x9d,0x10,0xd2,0x75,0xc3,0xd3,0xfe,0x45,0x9f,0x7f,0xe2,0x90,0x1b,0xce,0x38,0x91,0x91,0xcc,0x84,0x83,0xc0,0xf5,0x11,0x40,0xd9,0xc6,0x2b,0x08,0xfa,0xde,0x81,0xbb,},{0x44,0xd7,0x7e,0x43,0x9e,0xf6,0xca,0x5e,0xb9,0x40,0xc6,0x0f,0xf8,0x73,0x2d,0xdc,0x16,0x26,0x9e,0xa0,0x23,0xbb,0x26,0x13,0xbd,0x44,0x7e,0xba,0x7f,0xd6,0x98,0x51,0x22,0x6c,0x48,0x19,0xce,0x8d,0x44,0x98,0x5a,0x49,0xf3,0xf4,0x1a,0xc7,0xaf,0x33,0xc4,0x7f,0xfe,0x5f,0x89,0x30,0x4a,0x32,0x56,0xe4,0x45,0xf8,0xd6,0x86,0xe3,0x07,},"\x81\xee\x4c\xb9\xc4\x5d\xa6\x91\xda\xcd\x7d\xd0\x9a\xff\x59\x73\x72\x67\xbb\x55\xc3\xad\xe1\xba\x32\xc1\x7b\x7d\x0d\x2d\x0c\x60\x79\xc3\x9d\x5f\xd5\xb2\x9b\xa5\xf9\xc1\x76\x20\x97\x70\x98\x43\xee\xe5\x61\x2b\xd2\x0b\xc8\x18\x5b\xf6\x4d\x5c\x93\x41\x84\xe1\x36\x24\xe6\xf8\x77\xa2\xa5\xdd\xa1\x5c\x0d\xf6\x2a\xfb\xb9\x70\x57\xcc\x91\xca\xc9\xa1\x84\x06\xa0\xe0\x10\x9c\xc3\x9b\x2e\x3f\x81\x2e\x22\x7a\x40\x62\xd5\xef\x81\xc9\x2c\x22\xa7\xdc\x79\x7c\x84\x5d\x71\xeb\x6e\xa9\xe4\x2e\xc8\x41\x7f\xba\x90\xa9\x6d\x2b\xb1\x43\x94\x18\x33\x0b\x4b\xb2\xf9\x9c\x6d\x63\xd3\x04\xa0\xe5\x06\xdc\xa9\x65\x3e\x5d\xe0\xdd\x56\xe3\x09\xdb\x1a\x76\xa0\xfa\xab\xab\x16\x37\x74\xf0\x00\x08\x8c\xef\x3d\x1b\x7a\x6c\xf6\x61\xd2\xe1\xd9"}, -{{0xd7,0x48,0x0d,0x42,0x72,0xbc,0xb1,0x55,0x7b,0x1b,0xbe,0xe0,0x49,0x15,0xc1,0x26,0xa5,0x2c,0xa6,0xd6,0xa8,0xbb,0x53,0x14,0xa0,0xe1,0xa5,0x2b,0x59,0xbf,0xc9,0x9c,},{0x99,0xc8,0x39,0xd3,0x6d,0x8f,0x5b,0x86,0x52,0x61,0x8e,0xd7,0xb0,0xfe,0x9e,0xc3,0xd9,0x4e,0xff,0xf4,0xc4,0x53,0xc5,0x40,0x63,0x14,0x76,0xa5,0x97,0x9b,0xbb,0xe0,},{0xe0,0x4d,0xc8,0x44,0x2d,0x35,0x21,0x73,0xe9,0x31,0x81,0x8e,0x29,0x08,0x58,0xde,0x85,0x68,0x8a,0x46,0x49,0xea,0x3e,0x3c,0x3a,0xe7,0x4e,0xda,0xa5,0x4a,0xd0,0x1b,0x64,0x62,0x2a,0xd8,0xa0,0x90,0xb6,0xad,0x60,0xad,0xfd,0x01,0x88,0x18,0x82,0x82,0x8d,0x39,0x07,0x8b,0xb5,0xb2,0x71,0x4f,0xd3,0xea,0x83,0x97,0xa3,0x42,0xfd,0x04,},"\x61\x5c\xc1\x9f\x94\x20\x17\x36\x5b\xa8\xbf\xa2\x56\xce\xcc\xc8\x5e\xe2\x89\xa1\xc3\x4b\xb1\x44\x2a\xcc\x07\x16\xc7\xfc\x2c\xae\xb7\x6a\x9d\xe1\x9a\xde\xc1\x06\x37\x1e\x47\xa3\x0d\x2e\x12\x39\xce\x1f\x7d\xca\x25\x52\x6d\x60\x4b\xdd\x64\x76\x59\xd9\x42\xbc\xba\xc3\x68\x91\x13\x49\xc3\xb9\x46\xa9\x7d\xa1\x0a\x42\xdb\xcf\x3c\x73\x41\x6d\x2e\x6b\xa2\x2b\xd2\x9d\x9f\x70\x56\x72\xe9\xe3\x38\x94\x4c\xef\x01\xad\x21\xf0\x09\x74\x2e\x07\xbc\xd8\x88\xca\x31\xe1\xee\x95\x3e\x8c\x1b\x1f\xd9\x54\xb7\xdc\xf1\xa0\xb1\xd5\xa0\x69\x06\x5a\x66\xcb\x72\x1a\xdc\x02\x0f\x4e\xfe\x1a\xbd\xd1\x67\x42\x74\x69\x39\x28\x57\x80\xd7\x53\x13\x7a\xe0\x14\x0b\xb4\x10\xfb\x6c\xe3\x36\x76\xc2\x7a\xee\xc5\x93\xa8\x8c\xbc\x73\xaf\xd9\xf4\x05\x11"}, -{{0x3c,0x2d,0x36,0x50,0x73,0x5b,0x41,0xef,0x90,0x06,0xbb,0x45,0xe4,0xbe,0x2e,0x0a,0xa5,0xcd,0xe8,0x51,0xae,0xac,0x42,0x1e,0xe9,0xc1,0xb4,0x92,0xd8,0x7a,0xa1,0x8a,},{0x3e,0x46,0xdd,0xce,0x29,0x88,0x44,0xfc,0xaf,0xa0,0x0a,0x1b,0x47,0xea,0xf3,0xde,0x70,0x59,0x6d,0xf1,0xbb,0xee,0x3c,0x80,0x9d,0x1b,0xe7,0xdd,0x94,0x08,0x0e,0x34,},{0x3f,0x2a,0xf0,0x1a,0xd5,0x37,0x7a,0xc3,0x90,0x40,0xd4,0x1a,0x41,0xe3,0x6e,0x7b,0x93,0xfa,0x72,0x35,0xb8,0x41,0x79,0x1f,0x43,0x2e,0xcd,0x7f,0x91,0xa3,0xb2,0x1a,0xb7,0x19,0x6c,0x88,0x3a,0xd5,0xa7,0xdb,0x44,0x6f,0x6c,0x06,0x67,0x24,0x60,0xf3,0xf6,0x3e,0xf8,0x63,0xd9,0x43,0x2b,0xe9,0xca,0xea,0xbb,0x79,0xe8,0x7e,0x22,0x08,},"\x14\x25\xd8\xd2\x18\xda\x1a\x10\xa8\x0b\x6a\x9c\x3c\x27\x50\xef\xe4\x16\x57\x98\x4a\xbd\x51\x00\xf4\x51\xba\x94\x9d\xb0\x10\x46\xb7\x12\x6b\xe8\x40\x23\x34\xed\x57\x52\x8b\xac\x05\x62\x25\x53\xa8\x6b\x72\x67\x22\x69\x5a\x8f\xb3\x31\xd8\x56\x54\x17\xc4\xff\x0f\x25\x1a\x32\x0a\xd0\x6d\xed\xbb\x75\x0d\xef\x35\xd5\x21\xc3\xc4\xcd\x57\x1a\x45\xad\xa8\x45\x06\x53\xd5\xe8\x1f\xe0\xbe\xb5\x3a\xaa\xe7\x87\xb3\xeb\x65\x3c\x23\x81\xed\x55\xaa\xf2\x59\x0e\xe5\xed\x8b\x66\x26\xf1\xc4\xb0\x43\x0a\x54\xf3\x96\x58\x62\x4e\x66\x35\xfe\xfc\x98\xfe\xe8\xfc\x3e\x1c\xc7\xff\x3d\xd4\x20\xde\x9d\xa1\x1a\x62\xfc\xae\x0e\x0c\xb4\x54\xfc\x6f\x7d\xf0\x39\x54\x29\x1d\x26\x20\x2f\x1b\x18\x8b\x65\x7b\x3b\xae\x07\x38\x94\x49\xb7\x5e\x67\x42\x2f"}, -{{0x74,0x96,0x59,0x96,0x26,0x8c,0xdc,0x4c,0x09,0x22,0x0b,0xd3,0x1c,0xe0,0x7b,0x21,0x7a,0x03,0x82,0x6e,0xe9,0x81,0xfa,0x89,0xf3,0xa2,0x35,0x9c,0xed,0x09,0x5e,0xf1,},{0x40,0x96,0xd0,0x27,0xc1,0xc5,0xee,0x4c,0xbf,0xc0,0x4b,0x9d,0x53,0x41,0x74,0x02,0x9f,0xdb,0x50,0xcf,0x56,0x10,0xd3,0x02,0x1e,0xf9,0x33,0xb4,0xca,0xf3,0x39,0x85,},{0x8c,0x66,0x28,0x34,0x43,0x17,0xa6,0x3a,0xca,0x6f,0x78,0xcf,0xae,0xa9,0x65,0xb3,0xaa,0x55,0x22,0xce,0x91,0x41,0x95,0x14,0x1c,0x08,0x87,0x0a,0x1b,0x8d,0xac,0xf3,0x4b,0x79,0xc7,0xab,0xc6,0x93,0xcd,0x9e,0x5e,0xbe,0x1a,0x2e,0x86,0xf0,0x33,0x2d,0x20,0x48,0xdb,0x3c,0xbd,0xef,0x01,0x68,0x79,0x62,0xd6,0xdf,0x24,0x9e,0x38,0x00,},"\x45\xb2\xf0\x64\x61\x5b\xf7\x74\xfc\xe9\x7f\x51\xc4\x64\x68\x5d\x7b\x3e\x4f\xef\xff\x92\x31\x24\x0a\x71\x9b\x3b\x06\x21\xcd\x4a\xd8\x33\x05\x67\x5c\xd6\xea\xae\xbf\xf7\x91\x00\x0b\x0b\x1f\xa3\x1d\x82\xd8\x18\x1b\x7f\xe5\x7c\x5e\x00\xce\xc5\x6f\xf9\x02\x2e\x9c\xe8\xdb\x66\x35\x6e\x40\x8e\x3e\xe2\x62\xfe\x62\x77\x89\xe6\x55\x35\xef\x1a\x63\xe8\xfe\xc9\x33\xbe\x3d\xee\x34\xd2\xfa\xcd\xb8\x92\x8c\xc4\x56\xab\xf2\xf3\xe8\xca\xb4\x7e\xff\x1c\xa4\x2e\x8b\x0e\x48\xd2\xc7\x3e\x7b\xcc\x5d\xe3\xf1\x05\x6f\xc5\x23\xdf\xef\x6b\x00\x23\xf3\x28\x89\xed\x39\x4e\xed\xa0\x32\xab\xf6\xbc\xaa\xda\xa7\xf3\xee\x74\x11\x87\x60\xab\x6d\x91\xdf\x52\x8b\xdc\x58\x07\x97\x2c\x85\xfa\x7c\xb5\x6e\x38\x7d\x73\x32\xe7\x79\xe5\x2d\x0d\xd7\xdb\x0c\xfb"}, -{{0x0a,0xbf,0x06,0x9c,0x08,0xb2,0x69,0x1c,0x3a,0x26,0xf7,0x9d,0xc8,0xed,0x05,0xcb,0x71,0xd2,0x20,0xff,0x78,0xf3,0xa5,0xc5,0x78,0x0a,0xe9,0xda,0x18,0xe4,0x56,0x43,},{0x9e,0xf3,0xb5,0xcc,0x01,0x6c,0xc8,0x2d,0xbd,0xda,0x70,0x57,0x66,0xaa,0x44,0x8b,0xd6,0x1f,0xa1,0xaa,0xf1,0x17,0x0e,0xfe,0x91,0x49,0xda,0xa9,0xfe,0x64,0xa1,0xae,},{0xc7,0x56,0x6f,0xb3,0xb4,0xd8,0xde,0xf6,0x67,0xe0,0x40,0xf2,0x76,0xd3,0xed,0x98,0xd3,0x6d,0xff,0x46,0x01,0x26,0xa7,0x5b,0x4c,0xc2,0x10,0x03,0x86,0xbb,0x01,0xc6,0x42,0xf6,0xd8,0xde,0x7e,0x64,0x9b,0xe6,0xe0,0x81,0x8b,0x08,0xd7,0x7c,0xe6,0x0f,0x4e,0xe5,0xe7,0x71,0x7a,0x50,0x88,0x4b,0xde,0xe0,0x20,0x34,0xec,0xf1,0xcd,0x0c,},"\x0d\x05\x52\x91\xb2\xe8\x61\xea\xe1\x9e\xa0\xfb\x20\x69\xd8\xc9\xee\xf4\xf1\x34\x7f\x35\x76\xd7\x84\x11\xae\x7c\x0b\x1c\x1c\xaf\x31\xfd\xe7\x36\xdc\x8a\xcc\xac\xb6\x62\xdf\x76\xb6\x20\xb6\x2c\xe9\x0b\x9f\x92\xc8\x33\x09\x12\x86\x21\xd0\x57\xcf\x84\x58\x05\x94\x90\x88\xe9\x38\xdd\xbc\x3d\x41\xc5\xe5\x54\x1f\xec\x82\x98\x68\x7a\xd2\xf7\x9a\xcd\xa0\x1a\xa2\x15\xd2\x58\x21\x43\x6e\xac\x9d\x26\x87\x16\xd4\xcd\x60\x50\x26\x0c\xb4\xef\x6a\xad\xa4\x83\x5e\x07\x3a\x84\x58\x21\xff\x21\x1a\xe2\xba\xad\xce\xb6\xe5\x7f\x06\xf8\x83\x45\xed\xbf\x93\xbf\xdf\x54\xfb\x74\x12\x3b\x57\xc0\xfb\x4a\x79\x60\x8d\x8d\xb6\x74\x08\x89\xe1\x57\x33\x50\x77\x99\xf7\xa1\xfd\x30\x17\xbc\xd7\x7b\x28\xa2\xbb\x6c\x91\xec\xd1\x54\xe9\xc5\xa5\xff\xa0\xeb\x62"}, -{{0xf3,0xfd,0x5e,0xc5,0xe2,0x30,0xb6,0xda,0xd1,0xac,0x3d,0x3a,0xeb,0xad,0xc7,0x86,0x3f,0xf8,0x9d,0xe2,0xa1,0x31,0x7f,0x42,0x4d,0x15,0x98,0x9a,0x3e,0xfb,0x0a,0xfd,},{0xf9,0x9e,0x5d,0x5e,0xee,0xae,0xd1,0x20,0x5c,0xfb,0x5c,0x2c,0xc4,0xe5,0xe9,0xf6,0xb4,0xe7,0xf6,0x41,0x29,0xf8,0x60,0x10,0x4c,0xa6,0x24,0x4e,0xb9,0xfe,0xb5,0x64,},{0x44,0xb0,0x12,0x46,0x63,0xad,0xb0,0xc7,0x3a,0xed,0x49,0xf7,0x34,0x03,0x46,0x1f,0xcb,0x19,0x11,0x1b,0x0b,0xa1,0x7a,0xa9,0x96,0x56,0x6f,0x47,0x7e,0x37,0xd5,0x24,0xb0,0xe1,0xf1,0x07,0x61,0x2f,0xc5,0x2a,0x7c,0x76,0x7b,0x18,0x1f,0xbf,0x4d,0x62,0x9b,0xdd,0xc0,0x8f,0x30,0x58,0x4d,0xec,0x61,0x24,0xc5,0xd3,0x9d,0x42,0x31,0x02,},"\x71\xf2\x89\x73\xed\x3d\xf0\x59\x45\xfa\x0b\xdb\x23\xe9\xbe\xca\x65\x1d\x3e\xe6\xbf\x9f\xa4\x5f\xfd\xc6\x06\x1e\x42\xfa\x2e\x8d\x76\x23\x5f\x0e\x9e\x2d\xaa\x65\xe5\x26\x31\xfc\x3b\xea\xd3\x3d\xa0\x55\xbb\x49\x2e\x47\x58\xe5\x98\xa0\x30\xa3\x3b\x3c\x40\xb3\x43\x71\x45\x9b\x23\x3c\xcc\x04\x3c\xcc\xc3\xa3\xcb\xce\x54\x9e\x20\xe0\xb2\xb4\x33\x05\xb6\x4a\xec\x66\x1a\xad\xba\x65\x56\xb1\x7d\x76\xe3\xbb\xed\x62\xc4\xa4\xea\xc4\xf8\x86\x03\x99\x67\x52\xd2\x36\x3c\x8d\x4a\x27\x89\xd1\x28\xf6\xe9\x59\x94\x5c\x68\xc3\x01\x46\xd1\x94\xcc\xb6\x83\x9e\xc6\x53\x44\x60\x16\x52\xc1\x8b\x00\x74\xe2\xbc\x76\x68\x31\x16\x97\xd9\x60\xc7\x06\x65\x97\x92\x4d\x70\x4d\x02\xa0\x19\x3f\xaf\xbf\xdf\x57\x1e\xe0\xdf\xe4\x14\xdc\x2f\x52\x89\x69\x12\xbc\x32"}, -{{0x73,0x8f,0x13,0x10,0xa4,0xe0,0x8f,0x91,0x7a,0x0a,0x5c,0x1f,0xba,0xf4,0xef,0x72,0xf9,0x5e,0xe6,0x2f,0xcd,0xed,0x50,0x86,0x8a,0x3d,0xaf,0x98,0x85,0x6a,0x44,0x8d,},{0x42,0x27,0x2c,0x2c,0x8b,0x08,0x47,0x0e,0xe5,0xdd,0x8a,0xf8,0x84,0x9c,0x01,0xb7,0x50,0x8d,0x3a,0x3c,0x65,0xb0,0x33,0x0e,0x69,0x5c,0x84,0x1d,0x5d,0xcc,0xb2,0xf5,},{0xce,0x1e,0x35,0x77,0xb6,0xa2,0x10,0x16,0xb9,0xdd,0x0b,0x51,0x7b,0xaa,0x0c,0xcb,0x10,0x7b,0xc1,0x99,0xb8,0xbb,0xae,0xf6,0x8f,0x95,0x0c,0x8e,0xd5,0x80,0x13,0xc8,0x53,0xb4,0xd3,0x38,0xee,0xdc,0x67,0x50,0x79,0xab,0x13,0x90,0x46,0x2f,0xfe,0xfa,0x6a,0x95,0x9b,0x04,0x3f,0x8b,0x56,0x51,0xc6,0xca,0x37,0x5c,0xe0,0xb4,0xa4,0x03,},"\xf0\xe7\xef\x67\x82\xd0\x4c\x69\x43\xb1\x9e\xb6\x6f\xf6\x22\x6b\x73\x6e\x3b\x09\x40\xc0\x9b\xb1\x26\xbf\xc4\xc4\xca\x7a\x5e\x70\x16\xc2\x86\xb7\xbf\xd7\x3a\xa6\xa7\x9a\x96\x03\x1b\xc8\x1c\xb5\xda\x68\xce\xc7\x1a\x6a\x0d\x39\x78\x0c\xbe\x6a\x0c\xd4\x77\x4d\x3a\xa0\x6a\x88\x16\x10\x44\x4a\x8c\x9d\x19\x10\x22\x94\xe5\xf6\x35\x18\x7a\xa6\xf4\x8d\x11\x91\x2c\x70\x94\xb3\x88\x33\x02\x8d\x57\x0c\xb1\x10\xdb\x60\x62\x5b\xb1\xbd\xc3\x7a\xff\xa2\x5e\xa3\xc8\xf8\xdb\xfc\x25\x14\xf4\x36\x5c\x62\xb2\x98\x9a\x66\xd2\x7c\x80\x38\x4e\x74\xae\x5f\xba\x8c\x1c\x2a\xf9\xc7\x2c\x49\x71\xe6\x4f\xa6\xa1\xdc\x25\x17\xb3\x1e\xa5\x7c\xcb\x08\x15\xa7\xfe\x2d\xa0\xf1\x46\xca\xa0\x84\x31\xd2\x5d\x15\x16\x62\xd9\xd2\x6e\x95\x22\x9d\x0c\x62\x82\x36\x64\x12\x3c"}, -{{0x88,0x41,0xd2,0x2a,0xde,0xd6,0x9c,0x13,0x1e,0xf5,0xee,0x0a,0x10,0xab,0x0a,0x9b,0x77,0xcb,0x75,0x4e,0xde,0x8d,0x25,0x7a,0x53,0x72,0x72,0x6e,0x2b,0x49,0x9c,0x6e,},{0x71,0x5e,0xcc,0xa6,0x36,0x81,0xbc,0x6e,0x9e,0x31,0xd1,0x88,0x48,0x90,0x2f,0x4d,0x96,0xfe,0xaf,0x43,0xb9,0x5d,0x00,0x86,0x42,0x90,0x3b,0x17,0x63,0xbc,0x9f,0xb8,},{0xbb,0x2b,0xab,0x70,0x03,0xf1,0x31,0x1b,0xe9,0xb8,0xc8,0x83,0xfc,0x4f,0xd5,0x28,0xad,0xfd,0x51,0xa9,0xc9,0x9d,0xb3,0xdc,0xa8,0xda,0x0f,0xca,0x95,0x8d,0xa1,0x9a,0x10,0xeb,0x22,0x33,0x26,0x67,0xb1,0xa0,0x06,0x5d,0x3d,0xbc,0x0d,0x06,0x26,0x9a,0x12,0x59,0xb6,0xa8,0x90,0x48,0x4a,0xa2,0x14,0x3a,0x52,0x69,0x5f,0x14,0x5b,0x0a,},"\x08\x7c\xa6\xbe\x2a\x95\x0c\x02\x4b\x3e\x74\x67\xfe\x00\xa7\xd3\x64\x55\x5d\x5d\xc6\x77\x0f\x5e\xbd\x26\x06\x42\x52\x5b\xd3\xc0\xf9\x65\xdb\x36\xd7\xb2\x29\xa5\x74\x21\xee\xc6\x4e\x4d\x99\x1c\xdd\xe5\x91\x23\x03\x44\x70\x55\x3f\x4e\xb0\xbe\x81\xad\x29\x36\xc8\xca\x26\xbc\xab\x4e\x5d\x79\x04\x0e\x29\x79\x87\x28\x60\x16\x84\xa4\x68\x32\x3c\xf3\xba\xae\x4d\x94\x8d\x0a\x1f\xd9\x05\xef\xfe\x16\xdc\x44\x64\x20\x88\xdf\x53\xf6\x38\x8b\xc4\x80\xed\xf4\xaa\x20\x7d\x0e\xd1\x61\xed\xa3\x45\x71\x2b\x4c\x00\xcb\x05\xfc\xf6\x35\xec\x25\x88\x78\x5b\xfb\x8a\x27\xcd\xc2\x89\x96\xa1\xdb\x3e\x67\x87\x02\x33\x93\xc0\x75\xd8\x3c\x90\x38\xfe\xd7\x89\x9c\x55\xfe\xc3\x07\xde\x32\x49\xc1\x4b\xda\x49\xe8\xb8\x95\x86\x09\x42\xc3\x6d\x64\x0b\xb8\x93\x77\x91\x42"}, -{{0xc0,0x21,0x35,0xe7,0xb6,0x5a,0xac,0x72,0xf6,0x3c,0x32,0xbf,0x5b,0xef,0x5b,0x68,0xc7,0xf3,0xb8,0xed,0x56,0x20,0x8e,0x59,0xe4,0x75,0x20,0x70,0xe9,0xd0,0x70,0x95,},{0xdc,0xf6,0x00,0xf2,0x44,0x03,0x7a,0x75,0x20,0x3a,0xe1,0x1a,0xc3,0x16,0xe8,0xdb,0xe9,0x98,0x6f,0x0d,0xce,0x23,0x47,0x39,0x39,0x33,0x4b,0xf5,0xce,0xa4,0x8b,0x0d,},{0xdd,0x5c,0xba,0xe4,0x79,0xeb,0x5e,0x22,0x95,0x74,0xc2,0x1e,0xc3,0xbe,0xd9,0x11,0x11,0x3a,0x57,0xa1,0x91,0x6d,0x33,0x13,0x45,0x75,0x15,0xd5,0x5c,0xc5,0xb6,0xe6,0xeb,0xc5,0x2c,0x93,0xf8,0x21,0xd1,0x39,0x88,0xdb,0xba,0x8d,0xf5,0x09,0x6d,0x55,0xff,0x9c,0x39,0xe7,0xf9,0xd5,0x61,0xcb,0x58,0x93,0x0c,0x96,0xa7,0xa5,0xd6,0x0b,},"\x86\xd9\x49\x13\x50\xd2\x56\x6e\x70\x8e\xd3\x56\x18\x5d\x61\x0c\x73\x46\x5b\x2a\x5c\x70\x12\x91\x99\x58\xaf\x2c\xf7\x6a\xf9\x95\x23\x0d\x36\x0d\xe4\x00\xb7\x13\x71\x70\xdd\x08\x35\xf1\x0f\xcb\xec\x22\x4e\xe4\xe4\x2c\x7d\x1c\xeb\xb7\xf5\x80\xfe\xa8\xed\x62\x23\x16\x3b\xac\xdd\x19\x23\xa5\x72\xcb\xb6\xdc\x26\xca\x8b\x17\xad\xe6\x8c\x6d\x28\x08\xc4\xca\x1e\xca\x28\xea\xe9\xa1\x45\xf6\x8d\x40\x79\xd8\xd5\x9d\x14\x0e\x95\x82\x28\xe7\xe9\x95\x20\xe3\x42\xdb\xd7\x45\x7a\x91\x59\x74\x0f\x48\xbd\xc2\x7b\x93\xbd\xab\xeb\xa4\x65\xcb\xf0\xc8\xdf\x5e\xf2\xc0\xf9\x38\x6e\xeb\xe6\x56\xf5\xd7\x49\xd5\xf9\x14\x7f\x52\x52\x66\x91\x0d\x7b\x80\x39\x6a\x90\xbe\x5c\xc1\x88\xa9\xa9\x45\xf9\x3e\x75\x3f\xc9\x9b\xaf\xa1\x8e\xe0\xa6\xdf\xf7\x9b\xf8\x48\x48\x98\xef"}, -{{0x15,0x4a,0x47,0xeb,0xa1,0xb8,0xc3,0x83,0x62,0xea,0x61,0xfa,0xeb,0x0c,0x0a,0xd7,0xe6,0x1e,0x41,0x2a,0x3c,0xba,0x46,0x88,0xaf,0x0d,0xb2,0xa4,0x87,0x20,0x8b,0x1c,},{0x16,0xde,0x2c,0x89,0x4a,0x50,0xcb,0xd4,0xca,0x90,0x41,0x9a,0x4c,0xa6,0x49,0x42,0xcb,0x14,0xbd,0x33,0x5c,0x5d,0x3f,0x4a,0x53,0xe2,0x39,0xc2,0x80,0xbd,0xa7,0x25,},{0xf4,0xb6,0xeb,0x1a,0x8d,0x95,0x0e,0x88,0x7f,0xd2,0xf3,0x0f,0x70,0xa2,0x3b,0x41,0x87,0x14,0x95,0xbf,0xa5,0xb8,0xa4,0xad,0x39,0x96,0xcd,0x9b,0xf5,0x1e,0xb7,0x42,0xe0,0x7f,0x4c,0x4d,0x2d,0xa4,0xb0,0x1a,0xb0,0x87,0x36,0x7a,0x50,0xe2,0xb6,0x5b,0x3c,0xef,0x51,0x4e,0x40,0xd8,0x37,0x54,0x0b,0x8c,0x89,0x96,0x64,0x85,0x91,0x0f,},"\xbf\x60\x7e\x8b\x6e\x14\xd9\xc8\xac\xd9\x68\x15\xaf\x0c\x03\x5a\xc7\x3c\x41\x04\xc9\x37\x86\xcc\xc1\xc9\xf8\x59\x39\x5d\xd7\x81\x90\x03\x20\xeb\xf3\x56\xaa\x99\x1c\xdc\x9f\x50\x3f\xce\xe9\xf8\x36\x75\x88\x8a\x7d\x59\x20\x02\xd2\xa5\x4a\x57\x3a\x96\x99\x4b\x3f\xa8\x65\x53\x8c\x61\x7e\xd8\xad\x1f\xf6\x20\x18\x28\x8a\x67\x4f\x44\x9b\xe0\xaa\xb5\x22\x2f\x74\xc4\xfd\x47\x5e\xd6\xa8\xdf\xb2\x7f\x45\x28\x7b\x22\xb2\xb6\xc3\xbd\x15\x17\x9f\x26\x7d\x15\x7d\x7d\x8a\x41\x59\x67\x9b\xe8\x5b\x25\xc2\xbb\x2b\xa8\x50\xaa\xed\x9a\xe3\xae\x57\x1b\xe4\xf7\x58\x36\x32\x9c\xf3\x6f\x41\x2c\x1c\x80\xf1\x41\x3b\x76\x61\xea\xb4\xa8\xe1\x1b\x60\x24\x24\x4f\xc6\x23\x23\xff\x02\xe3\x8a\xce\xb1\x73\x7b\xd4\x74\xbf\x1e\x98\x01\x5d\xbc\x78\x8b\x02\x7b\xbe\x21\x7c\xf4\xe7"}, -{{0xd3,0x02,0x84,0x31,0xce,0x2e,0xef,0x73,0xbd,0x94,0x0a,0xb8,0x4c,0xa2,0x9f,0x13,0xfb,0x26,0x43,0x6a,0xa2,0x5e,0x1b,0x7b,0xf2,0x6c,0xb3,0x3f,0x17,0xfd,0xf8,0x17,},{0x63,0xdf,0x20,0x3e,0x28,0x60,0xba,0xc4,0xd3,0x52,0xe7,0x22,0xc1,0xc9,0x1f,0xe3,0x77,0x6e,0x1c,0xbc,0xae,0x85,0x53,0xa4,0xf1,0x98,0x90,0x26,0x0b,0xf0,0xe4,0x57,},{0xce,0x97,0x29,0xa9,0x6c,0x3e,0xd2,0x89,0x43,0xb2,0x78,0x39,0xc7,0x33,0x82,0xec,0xd5,0x72,0x96,0x0c,0x1f,0x9e,0x90,0xc5,0xef,0xf9,0xdd,0x49,0x9f,0xf4,0x8f,0x17,0xd2,0x5e,0xdd,0x12,0x68,0xef,0xfe,0x41,0xee,0x6a,0x81,0xce,0x48,0xd8,0x4d,0xe5,0x13,0xdf,0x9c,0x41,0x44,0x26,0x21,0xb2,0xf5,0x49,0x1e,0x34,0x6b,0xe1,0x8c,0x04,},"\x08\x63\x35\xd6\x12\x75\xd1\x68\xea\xac\x05\x40\x47\x7f\x50\xd4\xb1\x5f\x9e\x50\xb9\xbe\x69\x39\x21\xed\x54\xa9\x94\x1b\xc4\x06\x43\xcd\xa6\x2e\x1d\x80\x5d\x02\x50\xa8\x11\x46\xbd\x5f\xe2\xd3\x9e\x81\x44\x4d\x21\xe2\xb2\x1b\x03\x1c\x11\x13\x06\xca\xcb\xf5\x27\x17\xf6\xfb\x4c\xd3\x41\x6f\x12\x15\xf8\xdd\xdc\xed\xd2\xf0\x09\x6b\x0f\xcf\xa0\xa6\xcc\x2c\xde\x7a\x2b\xab\x7f\x1e\x32\x79\x0b\x53\x61\xdf\x36\x71\x42\x4c\xc7\x22\xf2\x31\xbf\x71\x89\x5b\xcd\xcb\x7b\x22\xee\x07\x4e\x8f\xb4\xa9\x67\x85\x04\xe7\x35\x36\x6c\x17\x2f\x07\x63\x7b\x7a\x93\x14\x9b\xb2\x1f\x38\x88\x33\x78\xa1\xdb\x27\x3f\xc2\x32\x39\xe3\x53\x37\xf9\xce\x56\x6d\x8d\xdf\x3b\x31\x33\xca\xd7\xf2\xce\x81\xed\xb5\x03\xce\x1d\x27\xc5\xa6\x57\x16\x0b\x78\xdc\xa9\xae\xae\xa3\x79\xbe\x9c\x85"}, -{{0xee,0x89,0x85,0xdc,0x27,0x50,0x44,0x40,0xa8,0x75,0x8d,0x4c,0x53,0xe4,0x22,0x52,0x15,0x79,0x7a,0x00,0xcd,0x86,0x31,0xd5,0x9b,0xd9,0x3b,0xc6,0x6f,0x37,0x3d,0x5e,},{0xcd,0x64,0x7b,0xb0,0x65,0x69,0x3d,0x48,0x65,0x89,0x15,0x6a,0x9f,0xa2,0x61,0x43,0x75,0x34,0xdc,0x86,0xf4,0x6f,0x72,0xd0,0xa8,0x00,0x39,0x9a,0x7a,0xf0,0x10,0xf7,},{0x5b,0xd6,0x0a,0xd5,0xe9,0xba,0xd9,0x93,0x2c,0xa9,0xc7,0x5f,0x23,0x1a,0x76,0x88,0x9a,0xe7,0xa8,0xb8,0x64,0xb9,0x1d,0x1f,0xcb,0xa5,0xc5,0xd4,0xbf,0xa1,0xd9,0x28,0x38,0xad,0xb9,0x74,0x84,0x2a,0x07,0x10,0x77,0x9b,0x3e,0x30,0x94,0x04,0x49,0x09,0xe9,0x2c,0x7c,0xf0,0x46,0xce,0x51,0x9f,0x4c,0x68,0xe8,0xf1,0x9e,0xc0,0x3c,0x02,},"\xf2\x22\x04\x85\xad\xdf\xeb\xce\x02\xa8\x33\xac\xa3\x33\x81\xd1\xdf\x91\x7e\xd6\x09\x95\x0e\xd2\x4f\x85\xe3\xb0\x2b\x2b\x99\x4b\x4d\x93\x97\x84\xe3\x32\xf4\x10\x64\xc8\xb4\xa2\x63\x0a\xb3\x69\x61\x74\x2a\xa1\xcf\xfd\xcb\x08\xc1\x44\xee\xae\xde\xaf\xd4\x8b\x5d\xbe\x96\xbf\x24\x35\x0e\x14\xfd\x68\x28\x6b\xc0\x8e\xea\xef\x8b\xc6\xad\x9e\x19\x5d\x14\x84\xaf\xcd\x30\xaf\xa8\xce\xd4\x84\x81\x26\xd5\x6c\x81\xb4\x3c\x27\xa5\xdb\xbd\xec\x1a\x50\xc1\x10\x62\xce\x21\xc6\x1d\x86\x0c\x25\xa8\x62\xfb\xb7\x5c\x3b\xd5\x1c\x8d\xc0\x76\x36\x66\x86\x69\xbb\xf7\x51\xea\xca\xcc\xb3\xb5\x1d\x2c\x0d\x41\x40\x31\x6c\xfc\xe2\xeb\x18\xd2\x90\x8c\xec\xd5\xa1\x88\x67\x9b\xc5\xf5\xde\x29\x0f\x54\x8e\x7e\xbc\x57\xd4\x1b\x58\x9a\x24\xce\x88\xee\x48\xd9\x7e\x8d\x0c\x7c\x76\x99\x60"}, -{{0x80,0xdf,0xe2,0xbf,0x73,0x87,0xba,0xd4,0x65,0x4e,0xb0,0x76,0xf8,0xda,0xe9,0x59,0x51,0x63,0xe4,0x01,0x27,0xf5,0xdf,0x49,0x2d,0xad,0x7d,0xf0,0x4c,0x72,0x21,0xc4,},{0xd1,0x78,0x3c,0xee,0xb9,0xcf,0x8e,0x4d,0x07,0x76,0x4c,0x47,0x3f,0xa4,0x06,0x1b,0x82,0x74,0x39,0x71,0x03,0xf2,0x07,0x6d,0x70,0x32,0x49,0xd7,0x58,0xb8,0xfb,0xd5,},{0x27,0x27,0x9e,0x3c,0xdc,0xb0,0x3e,0xf5,0x57,0xa5,0xde,0xfc,0x2f,0x6c,0x58,0x12,0x8a,0x6d,0xc3,0xf8,0xb0,0x38,0x59,0x58,0x01,0x4e,0x70,0x9c,0x1f,0x61,0xb0,0xae,0x6b,0x40,0x35,0x76,0xf0,0xe4,0x54,0xd5,0xe4,0xc6,0x4c,0x17,0x31,0x38,0xee,0x4b,0xbd,0x5f,0xe7,0xb6,0x0d,0x06,0xc5,0xab,0xe2,0x3f,0xe9,0x9e,0xe3,0xb4,0x6a,0x00,},"\xaa\x09\xd7\x84\xbb\x09\xdc\x99\x99\x31\xeb\xb4\xc0\x0e\x42\x4c\xef\xec\xa1\x04\x81\x8d\x8e\xaf\x06\x61\xf0\x97\x28\xad\x02\x5e\xf4\x73\x93\x21\x05\x71\xf1\x74\x04\xe9\xaa\x6d\x8c\xbd\x5f\xd8\x8c\xd7\xdf\xb8\xe2\xe8\xa1\x08\xc0\x5d\xe2\x06\xf3\x40\x82\x34\xa3\xb4\x63\xdb\xe7\x1a\x07\xd0\x55\x87\x32\x45\x24\xb7\x32\x6e\xe7\x9d\x33\x48\xdd\xbe\xd7\x87\x1b\x86\xfc\xb4\x88\x03\x1d\xc9\xea\x93\xf6\xb8\xd7\xfd\xa6\x23\x93\x48\xa5\x62\x44\x4f\xaf\x1e\x72\xd3\x1a\xf3\x54\x43\xe9\xdf\x53\xe7\x62\xf3\xe5\x6b\x48\x66\x8f\x97\x84\xb3\x36\x8a\xb2\x78\xa4\x8e\xf4\x54\x6a\x26\xcf\xad\x0d\x0a\x51\x61\x69\x8f\x26\xee\x8d\x34\xfc\x2b\x3d\x6d\xfb\x93\xb0\x09\xac\x29\x6f\x6a\xfe\x48\x7e\xe3\x35\xea\xc9\xf0\x2c\xfc\xae\x5f\xcb\xd1\xa1\x6b\xa4\xe7\x1b\xe1\xb1\x12\x56\x2f\xc2"}, -{{0xda,0x1f,0x86,0x85,0x42,0xcd,0x7c,0xce,0x7a,0x5c,0xa3,0xfa,0x3c,0x24,0x08,0x1b,0x4d,0x23,0x44,0xb2,0x1a,0x15,0x7f,0x02,0x64,0xa3,0x47,0x13,0x2d,0x19,0x65,0x9d,},{0xcb,0x3a,0x25,0xa5,0x3f,0x27,0x2e,0xa8,0x13,0x80,0x44,0x68,0xd6,0x50,0x0e,0x96,0xa1,0xea,0xf8,0x22,0x70,0x5b,0x77,0x90,0xa8,0xac,0x3e,0x98,0xcc,0x4e,0x52,0x4b,},{0x75,0xc5,0x17,0xad,0xe4,0xf0,0x8d,0x77,0x46,0x30,0x57,0x43,0xd1,0xa7,0x76,0xc3,0xc5,0x5e,0xb5,0xee,0xdf,0xdf,0xcb,0x5e,0xb1,0xd5,0x63,0x4a,0x1b,0xda,0xf7,0xa4,0xb8,0xd2,0x41,0x87,0xd6,0xc8,0x85,0x0e,0x3c,0xed,0x65,0x67,0xa0,0x3c,0x4c,0x59,0x38,0x9a,0x4c,0xf4,0x71,0x14,0xce,0x54,0x73,0x16,0x0f,0x23,0x05,0x46,0xe6,0x0d,},"\xc6\x98\x7e\xf3\x80\xd5\xd0\xe7\x41\x96\x44\x3a\xaa\x3a\x32\x35\x6c\xbc\x02\x63\x6c\x5a\x4b\x6d\x62\xa8\x11\x4b\x21\x11\xbc\x1a\xbd\xdd\x9e\x44\xb3\x67\x2c\x18\xb5\x8d\x4e\xf5\x91\xaf\x45\x62\xe0\x20\x04\x9f\x8e\x12\x74\x68\x8e\x1f\x8e\x52\x96\xd2\xf9\x25\x2e\x7f\xc8\x4c\xd1\xd0\xc5\x8e\x98\xf0\xf1\x60\x53\x0a\xa2\x2c\x87\x1e\xef\x65\x2e\x71\x97\x4c\xe9\x1b\x4a\x65\xfc\x25\xfd\x09\xfa\x1b\x6c\x32\x08\x6e\x98\xec\x70\x8d\x9a\xbc\xb1\xd9\xcc\x8e\x1a\x08\x9e\xd8\xdb\x22\x06\xee\x95\x70\x23\x6a\xd6\x9b\x3d\xe6\x82\x18\x62\xfd\x2c\x70\xcd\x83\xa3\x2a\x68\xb0\x48\x62\x29\x55\x3d\x92\x8d\xe4\x8d\x03\xa1\x04\xe8\x73\x81\x96\x4a\xbe\xa7\x66\x83\x97\x6d\x52\x7c\x84\x16\x3a\x12\xee\xe0\xa5\x59\x86\xcf\x14\x31\xe9\xc8\x6c\xba\x81\x82\xca\x94\x68\x9b\xac\xd1\x65\xfb\xce"}, -{{0xf1,0x3d,0xae,0xc0,0xef,0x33,0xdd,0xd1,0x33,0xc7,0xd2,0x44,0xd1,0x0f,0xd2,0x7d,0xdb,0x23,0x70,0x52,0x80,0xff,0x5f,0x18,0x15,0xf0,0xf6,0x56,0xd8,0x36,0xfe,0x84,},{0x2d,0xc7,0xf1,0x36,0x7d,0xe6,0x72,0xc5,0x1e,0x00,0x5c,0x74,0xf8,0x76,0xf9,0x82,0x59,0x39,0x96,0x87,0x3a,0xcb,0xa0,0x79,0x29,0x27,0x34,0xc2,0x09,0xc2,0xb1,0x11,},{0xdb,0x77,0x18,0x33,0xf7,0xfd,0xba,0xcd,0xab,0x2b,0x5c,0xc8,0x0e,0xed,0x50,0xaf,0xdf,0x13,0x78,0x3b,0x7f,0xe5,0xe9,0x03,0xd5,0xdb,0xb4,0xc2,0xe5,0x35,0x31,0x6a,0x6e,0xef,0x4c,0x34,0xf0,0x04,0xd2,0xb9,0xa4,0xe2,0x70,0x0b,0xd6,0xe2,0xac,0xdd,0x56,0x4c,0x3c,0x80,0xcc,0x68,0xa3,0x03,0xf5,0xfb,0x09,0x1c,0xb4,0x34,0x0f,0x0a,},"\xec\x02\xff\x18\x04\xb2\xb3\x09\xaf\x31\x58\xb6\x62\x72\xa1\x4a\x3a\xad\x83\xc4\x1a\x71\x98\x46\xf7\x08\x8c\xa9\x79\x2a\xf5\x75\xc7\x89\x13\xc4\x32\x75\x9f\x0b\x9a\x74\x8b\xdc\x55\x68\x49\x6e\x41\x65\x8c\xc1\xcd\xb8\xda\x6c\x91\xd0\x7c\x3e\xc2\xf4\xaf\x50\x42\x49\xb9\x96\xaa\x00\xc0\x07\x1c\xdf\xa7\x93\xf8\x2d\x0e\xc5\xd2\x67\x26\x2f\x51\x8f\xc0\x29\xb8\x8e\x20\xb6\x20\x1f\xb9\xe0\x5a\xbd\x3f\x95\x24\xc5\xda\x2f\xa8\x97\x8f\xf2\xef\xd4\x81\x20\xcf\x00\x82\x2d\x1b\xee\x90\xdf\x81\x61\x25\xd8\xed\xc0\xcf\xb5\xde\x66\xd1\x6b\xe6\x38\x96\xa4\x12\xa6\x2b\x03\x1b\x71\x18\xac\x13\xfe\x2c\x9f\xaa\x6b\x1a\x33\x42\xf9\xcc\xf7\x88\x41\x66\xcf\x48\x9a\x84\xde\x26\xb5\xce\x5b\x21\x85\x6a\x3a\xf2\x89\xbc\x66\x22\xc0\xaa\xb9\xf2\x14\x2d\x39\x3f\x5d\x4b\x23\x67\x79\xdb\xb0\x66"}, -{{0x42,0xdc,0x16,0xc5,0x7f,0xb6,0xf1,0x28,0x94,0x5f,0xa1,0x01,0xe0,0x5b,0xbf,0x54,0x8e,0xf7,0xd9,0x77,0x26,0xb6,0x92,0xfe,0x40,0x40,0x69,0xcc,0x57,0xcc,0xef,0xa0,},{0x0a,0x1b,0xa5,0xdf,0x52,0x39,0x96,0xf9,0x54,0xb3,0x4d,0xdc,0xfa,0xba,0xd3,0xf3,0xde,0xe2,0x1a,0x5f,0xa7,0xa4,0xce,0x32,0x2d,0x21,0x6b,0xd8,0xcc,0xaf,0x43,0x8c,},{0xc7,0x59,0x77,0xe8,0x3b,0xcf,0xe9,0xdf,0x72,0x92,0xa8,0x60,0xed,0x97,0x25,0x55,0xb5,0xc2,0x44,0x16,0xfd,0x4b,0x7e,0xe3,0x28,0x53,0x88,0xfa,0x5b,0x14,0x47,0x60,0x8e,0x4a,0x34,0x78,0x13,0xcf,0xe0,0x93,0x51,0x2a,0x76,0x51,0xe4,0x22,0xe9,0x86,0x7d,0xb7,0xb9,0x7c,0x0b,0x08,0x67,0xf0,0xb8,0xc7,0xb7,0xf4,0xf0,0x2c,0x31,0x0d,},"\xf2\x71\x4c\x23\xa3\xa6\xfc\x11\xad\x15\xc9\x80\xb7\x35\x0f\xc8\x42\x17\x87\x76\x61\x18\x80\x55\xff\x75\x0d\x82\xc4\x9c\x5f\xef\x7b\xc8\xe6\xaa\xc5\x74\xa1\xb7\x9a\x3f\x26\xd1\x69\x69\xc0\xf4\x06\xee\xab\x3e\x9e\x12\x85\x0a\x55\x70\x97\x45\xe3\x0d\xff\xa6\x2a\x69\xdf\xb2\xb6\x4b\x3c\x1b\xd2\xbc\x35\x86\xe2\x6d\x4e\xea\x71\x4d\x2a\x7b\x71\xcf\x79\xfb\x8f\xfb\xf2\xaa\xad\x00\xca\x3e\x4f\x2b\x6f\x50\x3c\xc1\xfe\xf2\xea\xb3\x65\x6f\xb4\x4f\x8d\x62\xa8\xdb\x8a\xb5\x8f\x39\x46\x93\x94\x9e\xea\x57\xfa\xfe\xcf\x00\x5f\x6e\xbf\x12\x87\xdb\xa4\xd2\xd6\x23\xc0\x2e\xa1\x71\xf5\x67\xe5\x26\xad\xd2\x07\x09\xeb\xca\xb9\x62\xf8\x3d\x98\xef\x66\x8e\xbd\x01\xef\x20\x48\x8b\x36\x65\xe3\xa4\x46\xfb\xfb\x13\xd3\x40\x50\x94\x2c\x74\x9b\xb2\xdf\xfc\x76\x63\x67\xfd\x45\x2e\x68\xe5\xb0\xc6"}, -{{0x90,0xb4,0x55,0xc6,0xbb,0x9c,0xec,0x83,0xe1,0x37,0x35,0x70,0x65,0x33,0x9d,0x03,0x05,0x25,0xd0,0xea,0x7f,0x5b,0x92,0x3a,0x2d,0x59,0x72,0xc3,0xc1,0x2a,0xa3,0x7b,},{0x5c,0xef,0x03,0x8c,0x16,0xbf,0xa4,0xb4,0xc9,0x23,0xa0,0xfe,0x70,0xcd,0x7f,0x25,0xc8,0xbc,0x83,0x7f,0xdf,0x5a,0x7e,0xfb,0x9d,0x95,0xf2,0x1b,0x96,0xbe,0x92,0x5a,},{0xc9,0x34,0x5e,0xec,0x2c,0x4a,0x0a,0xec,0x73,0x23,0x86,0x49,0x4a,0x69,0xa3,0xfc,0xe8,0xb8,0xa1,0xbe,0x36,0x6b,0xbe,0xd1,0x65,0x9f,0x13,0x1f,0xe9,0x7c,0xc0,0x37,0xfb,0x1b,0x7c,0x1b,0x68,0xb0,0xf3,0x02,0x39,0x45,0xd2,0x00,0x90,0xa0,0xcd,0x2c,0x15,0x53,0xa4,0x7f,0xae,0xc4,0xd6,0x6f,0xd8,0x16,0xce,0x12,0x11,0x68,0xf3,0x09,},"\xc6\x2c\xfd\xb9\xd2\x1e\xee\x6b\xe4\x7f\x30\x72\x7a\xae\xe5\x1f\x07\x03\x78\x9a\x43\x1d\x32\x22\x85\x33\x35\x02\x17\xa9\x3a\x18\x90\x06\x69\xc9\x59\x56\xf3\xf2\xae\x90\xdc\x74\x5a\x71\xe1\x83\x40\xd0\x58\xd1\x6b\x4c\x6f\xe3\x3b\x64\xaf\x8d\xad\x97\x3f\xe5\xdc\x02\xe8\x52\x07\x05\xc7\xa8\xbb\x3c\xcb\xe1\x83\x8c\x6c\x24\x93\x37\xf9\xb6\xa4\xc0\xe1\xf8\xa4\xe5\xd1\x03\x19\x6f\xa7\x99\x98\x92\x3d\x04\x22\xe9\xd0\x79\xa7\x2c\xc2\xa8\xf8\x6d\x65\x90\x31\xa6\x07\xd4\xcc\xa0\xb9\x47\xb3\xab\xee\xee\xf6\x4c\x28\xda\x42\x0d\x05\xde\x66\x5a\x55\x10\xfe\x55\xf7\x75\x98\xec\xad\x7f\xaa\x0a\xc2\x84\x80\x0b\x53\x82\x93\x94\xc4\xae\x90\xbe\x66\x67\x8f\xf0\x4a\xb4\x6d\xa2\x65\xae\x06\x40\x2d\x8c\x83\xca\xd8\x4d\x61\xa0\x51\xde\x02\x60\x55\x98\x88\xe7\x79\xf7\x4b\x72\xa5\xd7\x1c\x13\x2f"}, -{{0xdc,0x18,0x5c,0x2b,0xa0,0xb3,0x78,0xdf,0xe5,0xdd,0xa5,0x10,0xc3,0x2f,0xef,0xf5,0x35,0xca,0x2e,0x8a,0x02,0x43,0x4b,0x32,0x6e,0x01,0x58,0xbc,0x87,0x8e,0x88,0x48,},{0x33,0xd6,0xcc,0x05,0xa4,0x34,0xe4,0x19,0x28,0x0d,0x58,0x64,0xa1,0xaf,0x20,0x9a,0x2c,0x67,0x68,0x14,0xb7,0x0f,0x72,0xf8,0x14,0x1a,0xc7,0xe0,0x57,0x3e,0xe6,0x3e,},{0xf1,0xe4,0x45,0x14,0xd2,0xec,0xbc,0xc8,0xd1,0xa7,0xe8,0x4b,0xf5,0x84,0xce,0x73,0x18,0x35,0xe9,0x89,0x4f,0x88,0x97,0x4f,0x09,0x8d,0x45,0x6b,0x60,0x71,0x8f,0x57,0x5e,0xf4,0xd8,0x06,0x2f,0x21,0x82,0x50,0x42,0x50,0xcf,0x83,0xbb,0x2a,0xf2,0xa7,0x9b,0x1f,0x58,0xa6,0xa9,0x7b,0xd9,0x8d,0xa4,0x67,0x13,0x2d,0x7b,0xec,0x2f,0x05,},"\xe2\x76\xb1\x19\x12\xcc\xa5\xa8\x4b\xba\x65\x0c\x17\x2a\xef\x3a\x4d\x5f\x91\xac\x72\x29\x13\xbb\x89\x1a\x3a\xb0\x42\x4a\xb0\x7e\xa7\x09\xcb\x8b\xba\x3a\x3d\x11\xf8\x2f\x51\xc2\xaf\x01\x62\xa8\x2f\x72\x19\xce\x27\xb3\x5a\x30\x50\x7d\x53\x6a\x93\x08\x17\xe4\x0f\x85\xa2\x2a\x5a\x43\x2b\x94\xd1\x92\xc3\xc8\x91\x17\x77\xcf\xdb\x7f\xe9\x37\xa6\x75\x02\x77\x0d\x6d\x75\x75\x3d\x3a\xe8\x82\x29\xe0\x8f\x1e\xd2\x3b\x43\x28\xd8\x62\xac\x61\x86\x3c\x06\x3e\xa9\x84\x8f\x8a\xb9\x6a\x02\x13\xd7\xb9\x36\xc4\x8f\xe7\x54\x83\x6c\x98\x48\x78\x59\xd1\x99\xb3\xd9\x40\x39\x27\x16\xa1\xd5\x69\xe6\xc0\xcb\x1b\xa9\x18\x93\x2c\xf8\x85\x25\xe2\x56\xc8\xab\xb1\x1a\xaf\x0b\x45\x46\x55\xd5\xdb\x55\x71\x3c\xeb\xba\x28\x7a\xe2\x02\x65\x1a\xc8\x72\xbf\xc8\x0f\xea\xa7\xe0\x0d\x47\xc0\xbe\x38\xe6\x58\xf7\xc5"}, -{{0x90,0x72,0x1c,0x43,0xbc,0x36,0x6f,0x24,0xbf,0x4e,0x8c,0x99,0x3e,0x13,0x80,0x24,0x68,0x2f,0x10,0x29,0xdb,0xa3,0x5a,0xbe,0xb0,0xd6,0x0c,0x7f,0xa7,0x10,0x02,0x1c,},{0x7c,0x63,0xa2,0xf1,0x3b,0x7b,0x22,0x0a,0x0b,0xb7,0x52,0xe3,0x80,0x07,0x53,0xb8,0xb6,0xb3,0x26,0x69,0x37,0x8c,0xe1,0x31,0xbb,0x77,0xa9,0xa8,0xd2,0x30,0xe9,0xae,},{0xd2,0x06,0x4a,0x6d,0x6c,0x99,0xc6,0xc3,0xf1,0x52,0xd2,0xd4,0x35,0xf2,0x4e,0x34,0xb5,0x45,0x9b,0x08,0x2e,0xf1,0x1e,0x94,0x4a,0x77,0xff,0x54,0xdd,0xf9,0x86,0x27,0x37,0xec,0xb2,0xac,0x8d,0x54,0x20,0x7d,0x36,0xc5,0x1a,0xd4,0x1f,0x36,0x49,0x0a,0x11,0x1b,0xa8,0x0e,0x12,0x6b,0xfe,0xcb,0x09,0xde,0xf6,0xac,0xcb,0xdf,0x88,0x0e,},"\x65\x1c\x96\x17\xca\xc9\x58\xc7\xed\xd4\xa5\xf3\xfe\xdf\xb8\x3d\xc9\x71\xab\xfb\xb6\x9a\x31\xe8\x98\xcc\xa8\x47\x2e\xf0\x68\x03\x4a\x6d\x23\x76\xee\x0e\x72\xd0\xa9\xbf\xee\x27\x57\x96\xc3\x79\x5a\xda\xc8\xeb\xe1\xd1\x2b\x66\xec\x26\x8f\x6b\x75\xfa\x39\x41\x15\x4f\x99\xe2\x23\xfa\xf2\xcb\xab\x5b\x92\xe2\xb3\xba\x7b\x79\xbe\x77\x00\xef\x9d\xba\x69\x25\x3c\xce\x53\x56\xb0\xc4\xe7\x47\x03\xcf\xca\xfd\xb5\x54\x68\x50\xb4\x62\x32\x67\x5c\x90\xc0\x2d\x5e\x42\x6d\x33\xd6\x0c\xeb\xf0\xc7\x93\x01\x82\x37\x9d\xbb\x00\x7f\x53\x61\x63\xc8\xdd\xbb\xd3\x15\x7b\xb2\xda\x62\x34\x01\x33\xf0\x0a\xe2\x68\x2e\xc6\xba\xa6\x41\x6b\x5a\x01\x52\x1c\xc1\x0e\x04\x69\x52\x95\xf2\xe5\xb9\x4c\x05\xf0\x03\x83\xff\xe9\x54\x83\x07\x97\xf6\xdf\x82\x31\x72\x53\x2f\x98\x16\x5f\xe3\x14\xab\x32\x59\x29\xaf\x83\x85"}, -{{0x9c,0xec,0x24,0x67,0x58,0xe4,0x12,0xe7,0x37,0x8b,0x45,0x79,0xea,0xfe,0x9f,0xac,0x5a,0x25,0xd5,0x40,0x5f,0x92,0x70,0xb5,0xd7,0xe5,0x43,0x41,0x4e,0xc3,0xd5,0xda,},{0x97,0x5a,0x9e,0x6a,0x15,0x2c,0xae,0xbb,0x2f,0x9d,0xd0,0xde,0xb7,0x6d,0xd9,0x22,0xb6,0xdc,0x77,0x05,0x5d,0xda,0x03,0xfb,0xae,0x9e,0x7c,0x68,0x5d,0x07,0x3a,0xa1,},{0x9b,0xad,0x1e,0x3b,0x12,0x79,0xef,0x65,0x8f,0x4d,0x07,0x16,0x44,0xc6,0x3a,0xe2,0xb7,0xa7,0x80,0x35,0x7e,0x9d,0xc4,0x26,0xf1,0x65,0x0e,0xc0,0x63,0x4d,0xfc,0x52,0x0f,0x8e,0xda,0x9d,0xc8,0xf1,0x0a,0xa7,0x32,0x4c,0x59,0x42,0xd2,0x34,0x7f,0xf8,0x80,0x2b,0xd9,0x0e,0x95,0xfc,0xec,0x31,0x33,0x52,0xcd,0xae,0x64,0xf3,0x2a,0x04,},"\x17\xec\x9b\xd4\x7a\xdd\x6c\xcf\xbd\x78\x7a\xf0\xd9\x01\x3e\x9c\xc9\x79\xaa\xf8\x50\xe0\x94\x26\xd3\xb2\x8e\xdf\xd7\x12\x96\xeb\x31\xff\x8b\x21\xc5\xfe\x7b\xe0\x50\xf5\x36\x32\x4c\x3e\xc4\x88\x50\xe0\xb5\x08\xa3\x6b\xb4\xcb\x7e\x75\x4b\x32\x71\x83\xa1\xb3\x94\xd8\x8a\x79\x41\xd1\xce\x8d\xac\x62\xa5\xd8\x29\x18\x74\xd7\x84\x85\xe5\x1f\x29\xed\x05\x86\x5a\x20\x6e\x52\xec\xb1\x2c\x5d\x10\x7d\x4f\xf9\x6f\x25\xd3\xc5\xd1\x81\xd2\xc4\xba\x64\x63\x60\x0d\xb1\xcc\xa3\x28\x57\xfc\xf5\x97\xcb\xdf\xb2\xfd\xa2\x70\x8a\x8a\xba\x28\x1b\x43\xc3\xd2\x8c\x4a\x4e\x79\x83\x36\x15\x09\xf6\x1a\x10\x74\xe6\xf0\xad\x61\x01\xc7\xb5\x67\xee\x40\x78\xe9\x83\x9c\x47\xf4\x65\x31\xb7\x29\xff\x0e\xfe\xef\x7c\x9d\x1a\x8d\x83\x3d\x9c\x0f\x42\x81\x2a\x34\x18\x7c\x3a\x77\x8c\x16\x5c\x09\xd6\x45\x9c\x9c\x7c\xea\xa2"}, -{{0xd1,0x40,0x3f,0x63,0x20,0x2e,0x08,0x05,0x25,0x84,0x3b,0xde,0x25,0x5e,0xeb,0x6b,0x67,0x83,0xc1,0xca,0xae,0x9d,0x6e,0xd0,0x0b,0xa6,0x08,0x05,0xbe,0xd1,0x94,0x1f,},{0x23,0x8a,0xea,0x3a,0xd6,0xd6,0xf2,0x77,0x83,0xe7,0x05,0x16,0xbb,0xfc,0xca,0x47,0x70,0x36,0x6b,0x50,0xed,0x0f,0xe6,0xa4,0xe9,0x66,0xb5,0x3a,0xf1,0x21,0xa7,0x21,},{0x8e,0x60,0xe7,0x3c,0x06,0x38,0x16,0x79,0x5e,0x29,0xf5,0xd6,0x4e,0xce,0x11,0x59,0xf1,0xb5,0xd5,0x02,0x1a,0x6f,0x8f,0x65,0x5e,0x26,0x1a,0x4d,0x00,0x26,0xf5,0xb9,0x4f,0xf2,0x92,0x32,0x50,0x49,0x9d,0x99,0x52,0x98,0x48,0x05,0x12,0xe4,0x12,0x62,0x76,0xaa,0x4a,0x22,0x6d,0x01,0x5a,0x95,0x82,0x7b,0x3c,0xe6,0x92,0xe2,0x33,0x02,},"\xc4\xf1\x7d\x44\x2f\xba\x4c\xa0\xdf\x8d\xc1\xd0\x62\x8d\x7d\x7f\x36\xb6\x0b\x57\x58\xd7\xc1\x3b\x80\xb8\xf9\x7a\x62\x12\x4d\x96\xa2\x3b\x27\x95\x65\x49\x5a\x8a\xcc\xab\x59\x97\x11\x5b\x13\xa4\xba\x22\x0a\x73\x95\x7e\xb7\x93\x05\x20\xac\xbb\xfb\x6f\x54\xcf\x68\x72\x6b\x64\x50\xc6\xff\xa9\x47\x0b\x05\x5e\xa2\x62\x91\x4e\x2b\xc6\x12\x63\x3f\x1a\xc3\xd0\x61\x8a\x23\xdf\xf1\x88\xa7\x33\xd7\x6b\xcb\xcc\x46\x0f\x52\xab\x61\xe1\x99\x38\xf9\xc8\xca\xaa\x79\x2c\x20\x8d\x1f\x6c\x75\x47\x28\x90\x5f\xda\x51\xd8\x81\xa3\x47\xa5\x3d\xa7\x44\xd3\xba\xad\xc0\xa7\x6c\x47\x4c\x55\x86\x80\x26\x90\x95\xf9\x08\x4a\x74\x47\x1d\x5c\x09\xff\xc2\x91\x41\xb5\xbf\xaf\x49\x54\xdf\xac\xbc\xa6\x63\xd0\x37\xb1\x7e\xbf\x95\x59\x88\x22\x33\xe5\xca\x5a\x8b\xf7\x5c\xca\x4f\xc9\xc5\xa4\x10\x9f\x32\xe1\x45\xf3\x85\x3b\x17"}, -{{0xbd,0xf6,0xbd,0xc3,0x1a,0xb0,0xb5,0x31,0x37,0x84,0x48,0x3a,0xbe,0xca,0x6e,0xa5,0xe9,0xcd,0xc6,0x8f,0x81,0xb2,0x1f,0x35,0x0d,0x09,0xc3,0x90,0x7b,0xb9,0xb6,0xa1,},{0x03,0x62,0x77,0x12,0xb7,0x55,0xe5,0x06,0x9f,0xb9,0xab,0x8f,0x9e,0x89,0x97,0x24,0x02,0x9a,0x7f,0x26,0x8a,0xf9,0x39,0x88,0x21,0xee,0xec,0x93,0x60,0xc9,0x28,0x5b,},{0x38,0xfa,0xc6,0x03,0xed,0x24,0x6f,0x83,0x3f,0x1c,0x0f,0xd4,0x58,0x56,0x98,0xb0,0xa7,0x13,0x05,0xef,0xf0,0xd1,0x4a,0x00,0x49,0xb3,0xce,0xf0,0x73,0xbd,0x03,0x6d,0xd4,0x51,0xb3,0xda,0xba,0xda,0xae,0xae,0xa2,0xae,0xaf,0x83,0xd3,0x95,0x74,0x6f,0x4e,0x86,0x86,0x6a,0xda,0x97,0x1c,0xbe,0x48,0x2e,0xdb,0x04,0x19,0x33,0x2f,0x0e,},"\x90\xa6\x6a\xaf\xa5\x64\x2a\x98\xe7\x9f\x0d\x88\x14\x70\x80\x16\x7b\x11\xe4\x46\x65\x18\xf1\x95\xcd\xdd\x89\x40\xd1\x2e\xe4\x91\x8d\x31\xa6\xd4\xcb\x77\xd0\xbf\x5a\xf2\x99\x83\xbb\xe5\x08\x56\x10\xa7\x9d\xaf\x0c\x75\xa7\x8c\xcb\xcf\xfb\xbd\xab\x21\x89\xc3\x94\xae\x24\xe2\x65\xbd\x8c\x55\xfd\x3f\x40\x98\xe1\xb1\x75\x57\x75\x49\x51\x8e\x7a\x4d\xcf\x74\x52\x08\x6d\xd1\x27\x8d\xd5\x8e\xa4\xc0\xaa\x69\x0e\x91\x79\x51\xef\x39\xfc\xff\x60\xcb\xfa\x1e\x90\x91\x0b\xab\x53\x74\x92\x8d\x47\x22\xf7\x02\xbf\x5a\xd6\x02\x8f\xfd\xa6\x54\x1f\xa5\xba\x1a\x37\x79\xec\x78\xb0\xa9\x5f\xe3\x85\x0c\x74\x8b\x6c\x8f\x42\xf3\x30\xec\x79\x54\x1a\x52\xa1\xcf\x57\xdb\x72\xdf\x4f\x92\xce\x7f\x74\x8a\xee\xf1\xaf\x33\xbc\x5a\xe0\xa8\x2c\x89\xdf\xf2\x16\xf2\x3a\xec\x16\x8a\x7d\xbb\x51\x0a\xa6\x32\xda\xab\xcc\x97\x1b\x3f"}, -{{0x57,0xb3,0xb1,0x4a,0xce,0x1c,0xd0,0xcd,0x60,0x3e,0x63,0x28,0xbd,0x21,0x9e,0xe7,0xd9,0xd0,0x94,0x48,0x7f,0xa6,0x68,0xf2,0x8a,0xee,0xc0,0x2b,0x43,0xc9,0x09,0xa7,},{0x24,0xe6,0xb6,0x39,0x5f,0x97,0xea,0x0e,0x23,0x71,0x86,0xd4,0x69,0xb7,0x19,0x23,0xd2,0x11,0x3a,0xdf,0x40,0x3b,0xee,0xeb,0x4a,0x2d,0x27,0x90,0x9a,0xaf,0x3e,0xda,},{0xfc,0x79,0xfd,0xc6,0xd0,0x90,0x88,0x7a,0x61,0xe4,0x3c,0x6b,0x91,0x87,0xb6,0x57,0xd2,0xe4,0xd9,0xcb,0xaf,0xd6,0xe7,0xca,0xeb,0x7e,0xbd,0xea,0x84,0x28,0x25,0xb7,0x8f,0xb9,0x49,0xd2,0xc4,0x9a,0x0c,0xf3,0x8b,0x6c,0x73,0x29,0x6d,0x82,0xc8,0xdd,0xeb,0x1f,0xe2,0xd4,0x0a,0xad,0xdd,0x79,0x64,0xda,0x68,0xac,0xf8,0xc6,0x6f,0x0e,},"\xb2\xe0\xde\xdd\x80\x2e\xed\x99\x6d\xbd\x58\x36\xbf\x86\x88\xb0\xd1\x20\x1b\xf5\x44\x2f\xf9\xbb\xd3\x51\xae\xef\xe1\xa0\xc2\x1f\xea\x2b\x5c\x9f\xe5\xed\xee\x47\xe9\x21\x09\x9b\x05\xae\xda\xa8\x03\x67\xc1\xce\x08\x82\x1d\x78\x3a\x5b\x64\xcf\x05\x9c\x0f\x43\x35\x08\x39\x86\xa5\xa6\xec\xff\x8c\x84\xfd\x40\xe0\xba\x5d\xd5\xe5\xd2\xf0\x11\x12\xa8\x4c\xe5\xcf\x8e\x0d\xb7\x8b\xeb\x18\x2d\x91\x39\xc0\xb0\xf3\xe0\x06\x0a\x3f\xa7\x38\x69\xe9\x64\x23\xf1\x70\xdf\x9a\xf1\xcb\x9c\x35\x56\x6d\x87\xdf\xf5\x42\x22\x3f\x6d\x43\x9b\xdb\x54\x72\x9d\x36\x6a\xff\x63\x7b\x0f\x36\xa5\xd1\x4b\x15\xd6\x12\xbd\x03\x07\x6c\xc4\xd0\x4c\x1f\x25\xb3\xba\x84\xe0\xd1\xfe\x47\x4e\x57\x18\xd1\xa1\x7d\x5a\x48\x84\x65\x66\x2e\xe4\xc3\xf6\x64\xb4\xc9\x27\x4b\x64\x9d\x78\xce\xa4\xe8\x52\x43\xf3\x71\x32\x39\x04\x8a\x90\x8c\xe3\xe1"}, -{{0x01,0x8a,0x2c,0x3d,0xee,0xa5,0x0a,0xb5,0x06,0x75,0x1f,0x9c,0x2a,0xda,0xad,0xfd,0x9e,0x21,0x92,0x12,0x16,0x09,0x93,0x16,0x84,0xeb,0x26,0x5e,0x19,0x3e,0x7f,0x89,},{0xaf,0x41,0x0b,0xdd,0xde,0xfc,0x64,0x4e,0xf1,0x2c,0x98,0x99,0xff,0x71,0xb9,0xe1,0xd0,0xdf,0xa3,0xd6,0x9d,0x8c,0x2c,0xd6,0x76,0xc1,0x91,0x6b,0x34,0x59,0x1c,0xfd,},{0x7a,0x44,0xe6,0xa3,0x19,0x32,0xde,0xe6,0xdc,0x2d,0x83,0x94,0xe2,0x9a,0x65,0x51,0xd1,0x3e,0x6c,0x6f,0xfd,0xfa,0x21,0x8f,0xa5,0xb9,0x98,0x66,0x8d,0x84,0x39,0xdb,0x5e,0x05,0x37,0x9f,0xbf,0xa0,0xda,0x5b,0x56,0x3e,0xd9,0x66,0x43,0x5a,0xe2,0xc5,0x4e,0x3a,0xd1,0x6e,0x1a,0x9f,0xca,0x1f,0x5a,0x15,0x7a,0x08,0x07,0x04,0xab,0x03,},"\xcf\x78\x13\xef\xac\x12\xad\x1c\x7c\x73\x22\xcc\xbe\x54\xaa\x0e\x9a\x8b\xa4\xfd\x43\x45\xb0\x6e\x4c\xe7\xa3\x5c\x8b\x1c\xd5\xe3\xf7\xf0\x68\x85\x33\x84\x9b\xa2\xcf\x4c\x75\xb6\xf2\x09\x26\xa1\x19\x4a\x72\xdf\x0e\x1b\x1b\x34\x45\x6a\x21\x33\x11\x2d\x00\x67\x22\xfe\x81\x1d\x5e\x40\xc4\x12\x11\x59\xde\xd8\x89\x90\xc0\xac\x2b\xfd\x34\xf3\x5a\xf4\xf0\x7c\xc4\x02\xe9\xa3\x81\xa6\x75\xd0\x3f\xec\x7e\xc4\x38\xc4\xad\x9d\x92\x9a\xec\x8f\x24\x2d\xef\x02\x3c\x99\x3c\x9e\x8b\xa1\x8c\x74\x28\xe8\x8f\xde\x68\xa4\x71\x1e\x50\x6d\x79\x69\xf6\x3c\x8e\x0b\xc8\x3f\xf0\xde\x4e\x13\x36\x10\x6c\x05\xe0\x9d\x59\x22\x40\x0e\x8a\x81\xbf\x54\x88\x56\x67\x89\x97\x85\x88\x2b\x70\xf2\x0d\xd8\xfb\x1e\x75\xf5\x85\x5b\x76\x5a\x25\x6d\xa4\x34\x1b\xf2\x3e\xa0\xff\xa1\x8a\xad\xda\x38\x18\x16\x94\x60\x01\x04\x56\x69\xc8\xd0\x4d\xf0"}, -{{0xbe,0xa4,0x45,0xe9,0xb6,0xd3,0xf2,0x12,0x35,0x91,0x2c,0xd6,0xc4,0x2e,0xc0,0x57,0x72,0x97,0xca,0x20,0xa1,0x03,0x57,0x88,0x0c,0x2b,0x84,0x6d,0xd8,0xe2,0xcc,0x77,},{0x02,0x41,0x74,0x96,0x62,0x21,0x69,0x9e,0xa4,0xb0,0xa3,0x7e,0x51,0x7f,0xf9,0xb1,0x65,0x98,0xae,0x4d,0x4e,0x83,0xbf,0xa3,0xca,0x50,0xbc,0x61,0x68,0x41,0xf5,0x95,},{0x69,0x64,0xb9,0xc5,0x90,0x3e,0x74,0xe9,0x93,0x28,0xac,0xef,0x03,0x65,0x58,0xee,0xcd,0x33,0x69,0x15,0x0a,0x52,0xe2,0xcb,0xad,0x4b,0xbb,0x97,0xd4,0x61,0xb3,0xdf,0xc6,0xb3,0xe8,0x45,0x58,0x13,0xa4,0xf4,0xbd,0xca,0x46,0x30,0x2e,0x02,0xe6,0x83,0xec,0xea,0x18,0x20,0x17,0x1c,0x53,0x8e,0x54,0xc3,0xde,0x6c,0x95,0x4a,0xa4,0x07,},"\x47\x43\xc7\xc0\x99\xab\x81\x59\x27\xb3\x67\x4d\x00\x54\xb6\xde\x59\xaf\x28\x11\xab\xc2\xcf\x7f\xde\x08\xf6\x29\x29\x18\x5a\xdc\x23\x8f\xad\xd5\xe7\x5a\xe3\xba\x00\x36\xff\x56\x5a\x79\x40\x5b\x42\x4f\x65\x52\x33\x1e\x27\x89\xd9\x70\x9a\xc1\xec\xbd\x83\x9a\xa1\xe9\x1c\x85\x48\x17\x59\x79\x58\xcc\x4b\xd9\x1d\x07\x37\x75\x07\xc2\xc8\xd3\xc0\x06\xcf\xeb\x6c\x0a\x6c\x5a\x50\xee\xe1\x15\xe2\x11\x53\xdd\x19\x8e\xa0\xa3\xaf\xf6\x2b\x70\x75\xd5\xa4\x61\x78\x87\x83\xf0\x50\xe6\x59\xc5\x72\x96\x3d\x7a\x59\xe5\xaf\xaa\x2b\x9c\x50\x1f\x43\xc6\xac\x08\xab\x47\x97\xc4\x56\x6d\x22\xb9\x3c\xdf\x65\xa9\x9a\x2a\x1d\x63\x8e\x79\xf7\x2b\x5f\x46\x31\xfe\x5e\x9e\x5f\x96\x8f\x6d\xb7\xa1\x88\x0d\xf5\x1d\x8f\xeb\xc1\x49\x42\x67\x2f\x8e\xa6\xfc\x3a\x72\x81\x4a\x44\xd6\x6d\x14\x84\x20\xa6\x90\x00\xf6\x8c\x33\x0d\xe5\xb8\x0f\xc6"}, -{{0x64,0x47,0x54,0x0e,0xd7,0xbe,0x0a,0x11,0xc2,0xa8,0xde,0x79,0x3d,0x83,0xc6,0xe2,0x44,0x98,0x3d,0xb1,0x8d,0x78,0xec,0x9d,0x75,0xf1,0x72,0x9c,0x92,0xe0,0xfd,0xf1,},{0x39,0x12,0x12,0xc8,0xed,0xc4,0xd3,0x34,0xa5,0xbe,0xc8,0x60,0xef,0x0f,0x5e,0xbb,0x5e,0xc4,0x4e,0x8b,0xb5,0x1c,0x0f,0x67,0x41,0x99,0x89,0x59,0xb2,0xb3,0x79,0xfc,},{0x3a,0xb5,0xf8,0x8e,0x2f,0x72,0x76,0xb5,0xb6,0x58,0x3d,0xff,0xba,0x56,0x39,0x99,0x3a,0x90,0x5d,0xbf,0x9b,0x88,0xce,0xea,0xaa,0xae,0x33,0x35,0x80,0x0e,0x4a,0x5f,0x10,0xf8,0x3d,0xa6,0xd6,0x22,0x5a,0x8d,0xbe,0x99,0xae,0x80,0x07,0x50,0x09,0xdd,0x50,0x87,0x86,0xb3,0x97,0x51,0x13,0xdb,0x47,0x8e,0x14,0xba,0x10,0x1b,0xee,0x0f,},"\xa4\x38\x1c\x76\x38\xc4\x87\x99\xe9\xb5\xc4\x3f\x67\xfc\x3a\xa3\xcb\xb5\xec\x42\x34\xf3\x7e\x70\xcc\xcc\xce\xd1\x62\x7a\x57\x68\x3d\x1e\x53\xf4\xe0\x88\x3d\x8b\x46\x2b\xf8\x3f\x13\x08\x63\x03\x68\xc8\x9b\x49\x15\x33\xdd\xb8\xc9\xa5\xb9\xe8\x15\x50\x02\xfd\xd5\x81\xa9\xa5\xbe\x0e\x43\x0b\x90\x86\xa6\xbe\xac\x47\x20\x21\x0f\x87\xb1\x4e\x86\x2d\x97\xe5\xcc\x69\x28\x67\x86\xa7\x58\x67\x23\xf2\x31\xef\x0e\x3e\x1b\x93\x2d\xbb\xa3\xa1\x8a\x0c\xb2\x21\xcb\x07\xf8\x0e\x6a\x8e\x13\x00\x05\x6c\x13\xe7\x02\xb2\x3b\xfb\x32\x50\xec\x7c\xc8\x64\xd5\xc7\xec\x57\x86\x24\x07\x09\xc5\x60\x24\xea\x6b\xe5\xf7\xb1\x5a\x4f\xa5\x55\x5e\x39\xa7\x44\xa1\xdc\x55\x7d\xf5\xb9\x48\xdb\x22\x0b\x3d\x57\x45\x74\x66\x91\xda\xcb\x44\x21\x64\x1c\xdc\xc1\x2e\x7e\xc0\x45\x02\x93\xf1\x9e\xc5\x7b\x09\xcf\xf1\x35\x84\x7a\xab\xe4\x46\xa6\x13\x32"}, -{{0x0c,0x58,0x7a,0x81,0x1a,0xdd,0x88,0xb9,0x94,0x45,0x8c,0x3c,0x80,0x8a,0xc4,0xe3,0xa8,0x3a,0xfa,0xb2,0x6d,0x4c,0xff,0x5c,0x96,0x1b,0x9d,0xf0,0xb5,0xc8,0x33,0x44,},{0x06,0x78,0x3b,0x0c,0xdc,0xc5,0x02,0x8c,0x56,0x38,0xbd,0x74,0x8f,0x0b,0xc7,0x6f,0x7e,0x94,0xd1,0xaa,0x20,0x15,0xca,0x94,0x87,0x38,0xa3,0x50,0x04,0x60,0xac,0xa0,},{0x33,0xb4,0xf4,0x27,0x4f,0x20,0x00,0x8a,0x72,0x1d,0x1e,0x8d,0x05,0x4a,0x2b,0x4e,0x95,0x32,0x7e,0x38,0xbb,0x07,0xb3,0x3c,0x4b,0xee,0x7e,0x1c,0xe0,0x20,0xa4,0x42,0xfb,0x26,0x27,0xed,0xa3,0xb7,0xac,0x93,0xcd,0x3a,0xb0,0xb1,0x2b,0x99,0x93,0x5a,0x1a,0x92,0x33,0x11,0x16,0x04,0xda,0x4a,0xcf,0xfb,0x53,0x15,0xb9,0x07,0x12,0x0b,},"\xf5\x6d\xc6\xb7\x60\x76\x32\x5b\x21\x26\xed\x11\xd1\xf0\x9d\xec\xef\x9d\x15\xc3\x1d\x0e\x90\xcd\xb1\xa2\x7e\x08\x9c\xc5\x63\x29\xf6\xec\x3f\x66\x5e\xb6\x73\x9e\xc5\x67\x8b\x3f\x37\xee\x1f\xb3\x7d\xeb\x9e\x24\x00\x92\xb7\xa8\x8f\xd2\x55\x25\xac\xd5\x5e\x29\x4e\xb1\x04\x6f\x9b\x1b\x69\xa8\x47\xeb\x9c\xeb\x7b\x15\x93\xb9\xf6\x97\x8e\xf6\x18\xc1\x5d\xe4\xe0\x59\xec\xc3\xbf\xda\x32\x97\xa1\x9c\x2d\xf2\x02\xad\xf7\x21\x55\xcf\x21\xea\xbd\x03\x94\x8d\xf1\x51\x98\xe8\xa6\x8b\x08\x84\xf9\x3a\xd5\xe3\x6e\xb0\x98\x3c\xca\x30\xe4\x5a\x8b\x4b\x5f\xb8\x13\x6f\xde\xa8\xa3\x34\x1d\xd7\x87\x75\x40\xa5\x57\xde\xbf\x75\x30\xcc\x33\xae\xee\xf6\x27\x1c\x3f\x0a\xf6\xd0\x97\x87\xe8\x15\xf2\xf1\xdd\x25\xce\x4d\x2f\xd0\x9f\xfa\x9f\x53\x08\x1b\x46\x9c\x50\x0d\xa4\xd4\x41\x80\xc0\x4e\xb1\x86\x93\x29\xcb\xf2\xd8\x23\x18\x7e\x83\x1c\x24"}, -{{0x66,0xcf,0x40,0x1a,0x21,0x42,0xfc,0xf4,0xa8,0x01,0x80,0x46,0xcf,0x41,0x40,0xbc,0xa1,0x8d,0x76,0xef,0x62,0x66,0xe7,0xa0,0x24,0x75,0x7d,0xf1,0x72,0xa5,0xd6,0x53,},{0x67,0xd4,0x8d,0xfd,0x23,0x74,0x3c,0xc2,0xca,0x40,0xe4,0xdf,0xd6,0xb8,0xcc,0x5d,0x84,0xbe,0x82,0xdd,0x2b,0x11,0x20,0xcc,0x47,0x6e,0x6a,0xf6,0xf2,0x5e,0xcc,0x98,},{0xd6,0xb0,0xe8,0x0e,0x60,0xbc,0x1b,0x29,0xab,0x8f,0x74,0x80,0x8f,0xc4,0x60,0x84,0x77,0x95,0xcc,0xb8,0x87,0xba,0xc0,0xec,0xaa,0x8e,0x13,0x52,0x97,0xa8,0x50,0x97,0x71,0x2b,0x24,0xb0,0xa1,0xfb,0xaf,0x7a,0x67,0xc5,0xd5,0x30,0xa4,0x7d,0x06,0x43,0xfc,0x87,0x02,0xc0,0x59,0xd2,0x15,0xfb,0x11,0x2d,0xbe,0x47,0x5e,0x5b,0xca,0x0d,},"\xda\xa8\xef\xb3\xfd\x41\xf1\x2f\xbc\x55\xbd\x60\x46\x41\x57\xa2\x6d\x71\x86\x32\xd8\x82\xae\xdb\x6b\xf9\x8e\x47\xdd\x23\x37\x87\x9e\x0b\x46\x45\x2e\x06\x2e\x6d\xfb\xff\x3e\x7b\xca\x72\x89\xe4\xef\x6b\x3f\x41\xd4\xb0\x3b\xdc\x2c\x84\x2a\xfe\x97\xf3\x02\x98\x83\xed\x45\xf6\x05\x4d\xde\x96\x90\x64\x9a\xbb\x2b\x8d\xc2\x8f\x5f\xe8\xce\xcf\x80\xfc\x1e\xa4\x11\xbf\xc4\x0b\xbf\x4f\xd2\x0b\x21\x8c\xf4\x7e\xa8\xee\x11\x8d\x4d\x5a\xef\xa5\xc1\xbf\xa0\x8a\x8f\xb1\xb3\x0d\x6d\xe0\x97\x7c\xd1\x5e\x50\x29\x2c\x50\x1f\x2e\x71\xce\x27\x40\xff\x82\x8b\x84\x32\xda\x5a\x59\x4b\xab\x52\x23\x76\x0b\x64\x79\x2e\xd3\xa6\x9d\xd7\x5e\x28\x29\x23\x49\x43\x65\x65\x13\xdf\x1a\x17\xa2\xa0\x67\xa9\xa8\xea\xa6\x4e\x19\x56\x9f\x46\x93\x9d\x34\xb9\x92\x71\xae\x50\xa4\x7d\x7d\xbc\xa3\x62\x0c\x81\x25\x5b\x0e\x1f\xd1\xf3\xce\xc8\x51\xf1\xb1\x1b\x35"}, -{{0x5d,0xbf,0x88,0x5a,0xa5,0x98,0xe8,0x95,0x57,0x1f,0x5f,0x65,0x09,0x0b,0x72,0x32,0x3e,0x9d,0x70,0xb0,0xf5,0x81,0x10,0x68,0x7a,0xfb,0xbc,0x38,0x3a,0xfe,0xdc,0xac,},{0xfa,0x17,0xeb,0xa7,0x6e,0x3b,0xc3,0xea,0x6d,0xab,0x3a,0x5b,0x12,0x0d,0xc5,0xec,0xb9,0xae,0x6f,0x00,0x13,0x8f,0x7d,0x36,0xdd,0xa9,0x26,0x8b,0xc4,0x72,0x21,0x74,},{0xe1,0x42,0x9d,0xab,0x2e,0x42,0xcd,0x03,0x5b,0x7f,0xc6,0x02,0xef,0xd6,0xba,0xf9,0x47,0x06,0xf1,0x6e,0xaf,0x2f,0x8b,0x5f,0xed,0x32,0x92,0x39,0xe8,0x75,0x60,0x5f,0xb1,0x72,0xf5,0xdd,0x9a,0xe2,0xbc,0x2e,0xb4,0x2e,0xb4,0x74,0x56,0x7e,0x29,0x2f,0x52,0x06,0xe8,0x2e,0x69,0x4b,0xca,0x0d,0x6d,0x43,0x3b,0x86,0x76,0x34,0xcb,0x0d,},"\x1e\x0b\x6c\xf1\x5c\xe0\x33\x37\x17\x9c\x02\xd6\x54\x08\xdf\x5b\xe9\x20\x0c\x37\x82\xb6\x00\x4a\xf9\x4e\xa4\xde\xcb\x25\x79\x99\xd6\xfd\xff\x30\x1d\x11\xd0\x0c\x98\xc3\x72\xfa\xc0\xd0\x26\xcb\x56\xdf\xef\xe3\xde\xf7\xeb\x99\xac\x68\xd6\x96\x8e\x17\x12\x4d\x84\x46\xf5\x3e\x8d\x2d\x3d\xd8\x90\xd3\x7a\x23\xc7\xe0\xb8\x3a\x48\x4b\x3c\x93\xbd\xdf\x6c\x11\x8e\x02\x81\x95\x9d\x27\xbd\x87\xd3\x7e\x84\x3d\x57\x85\xf4\xa4\x07\x71\x39\x84\x94\xe6\xc4\x32\x2f\xbb\x67\x5c\x1d\x47\x93\x21\x03\x21\x48\xf7\xfe\x52\x56\x4d\xdf\x7a\xe7\xac\x26\x9d\x0c\xd2\xe5\x52\xfe\xc5\x89\xae\xae\x0f\xb9\x3f\xe3\xee\xae\xf0\x85\x60\x96\xcf\x4f\x6b\x34\x97\xe7\x23\x5c\xc8\x49\x4d\x81\x0a\x0b\x46\xc5\xea\xc8\x7f\x18\x7e\x50\x5b\xb7\x76\x4f\x80\x45\xc9\x54\x19\x83\xf7\xb0\x25\x69\x80\x09\xa2\x3d\x9d\xf0\xbd\x1a\x47\x3c\xbe\xe4\xcf\x5e\x94\x88\xec\xbc"}, -{{0x84,0xb3,0xae,0xdd,0x47,0x97,0xa5,0x65,0xc3,0x51,0xde,0x7d,0xfa,0x07,0x00,0xb9,0xff,0x7c,0x4d,0x72,0x91,0xc8,0x80,0x8d,0x8a,0x8a,0xe5,0x05,0xcd,0xd2,0x25,0x90,},{0xd7,0xad,0x72,0xca,0xa7,0xc2,0x22,0x09,0xec,0x46,0x78,0xd1,0x1d,0x55,0x90,0xa6,0xcb,0x28,0xa0,0x71,0x17,0xfe,0x5a,0xef,0x57,0xb5,0x07,0x51,0x58,0x32,0x01,0xa5,},{0x92,0x20,0xf0,0xed,0xaa,0xae,0xe1,0xb8,0x76,0x35,0x0d,0xbe,0x92,0x66,0x06,0x17,0x67,0xb8,0x62,0x96,0xc3,0x51,0xd4,0xca,0xc9,0x9d,0x07,0xcd,0x61,0x2c,0x6e,0xfb,0x24,0xf8,0xf9,0xb0,0xb9,0x75,0xf9,0x5c,0x42,0xc5,0xb6,0xaf,0xed,0xc8,0x92,0xf8,0x7e,0xfe,0xdd,0x39,0xd5,0x16,0x02,0x94,0xc2,0x76,0x58,0xbd,0xcf,0x42,0x85,0x0b,},"\x53\x25\x67\xff\xa5\x3b\x5c\x0f\xcd\x29\xc3\x94\x99\xd2\xe7\x8e\xcd\x20\xe6\x31\x23\x49\x92\x40\xe7\x75\x08\x8b\x39\x4d\xc6\x5c\x8b\xaa\xa0\xfe\x8f\x6a\xa7\xe7\x01\x81\xf9\xe1\x0a\xdd\x8b\x4a\x8b\xeb\x0b\x2e\xc3\x8a\x43\x30\x9f\x10\x0c\xd4\xbe\x91\xc6\xf4\x8e\x79\xdc\x0a\xee\x93\xa1\x5c\x94\x03\x77\x3b\x35\x4a\x8d\x42\xed\x48\xd8\xf2\x76\x23\x0f\xa6\xde\x5a\xda\x50\x1e\xe0\xa6\x53\xb4\x45\x8f\x0e\xcf\x6d\x5b\x3c\x33\xe2\x14\x1c\x66\x2f\x6e\xa0\x55\xf7\x41\xe5\x45\x86\x91\x7d\x2e\x0c\x4e\xb2\xb5\x66\x21\xf9\x66\x5f\xef\x32\x46\xf0\xbd\x80\x0b\x53\x3e\x3b\xc6\x15\xc4\x02\x1f\x8d\x0e\x2a\xd2\x33\xa1\x1e\x77\x36\xc4\x93\xac\xc3\x1f\xae\xe7\x6a\x09\x7d\xc4\x0d\xb9\xef\xc2\x24\x46\xea\xcf\x1c\xc1\x8f\x51\xfd\x10\x23\x6a\x2f\x94\x2d\x0a\x53\xc3\xce\x20\x91\x08\xb5\x93\x8c\x0a\x9e\x53\x6b\x89\xef\x0a\xd6\xb4\x05\xa1\x0f\x22\xc3"}, -{{0x69,0x50,0xbf,0xcf,0x48,0x0b,0x98,0xea,0x18,0xa2,0xd5,0xae,0x5b,0xa6,0xe7,0x66,0x8f,0x4c,0x28,0x3f,0xf2,0x71,0x13,0x57,0x74,0x0f,0xfe,0x32,0xcf,0x25,0x81,0x9a,},{0x8e,0x4c,0x6f,0x23,0x3f,0x7b,0x86,0x32,0x1c,0x9d,0x67,0x99,0xba,0xc2,0x8a,0xaf,0xcd,0x25,0x03,0xd7,0xaa,0x0a,0x7b,0xde,0xd8,0x72,0x27,0x27,0xfb,0xbc,0xae,0xb8,},{0x94,0xde,0x5d,0xf7,0xa2,0x5e,0xcd,0x70,0x20,0x5d,0x40,0xbc,0x94,0x99,0xfc,0x7c,0xd7,0x13,0x65,0x68,0x06,0x0a,0x41,0x9a,0x93,0xbe,0x6e,0x31,0x86,0x64,0xbb,0x6d,0xfc,0xe6,0x0e,0x2d,0x4e,0x63,0x3f,0x7e,0xc1,0x48,0xfe,0x4f,0x83,0x4e,0xd2,0x77,0xc1,0xfe,0xc4,0xc4,0xe2,0xa8,0x6f,0x44,0xc4,0x58,0x9c,0x81,0x78,0x88,0xdb,0x00,},"\xa4\x01\xb9\x22\xab\xa5\x7e\xe0\xc6\xac\x1c\x8f\x1b\x48\x29\x6a\x85\x62\xee\xf1\x37\x52\x68\x93\x88\x6a\x08\x30\x6e\x22\x03\x66\x77\x88\x61\x8b\x93\x98\x64\x46\x7a\x31\xf1\x6e\xdc\xe1\x52\xa4\x2c\x25\x54\x6b\x64\x0e\xa8\xbe\xd1\x89\xa4\xf8\x98\x86\xa3\x7f\x10\x69\x11\xea\xe1\xf5\x00\x81\xbf\x79\x5e\x70\xc6\x50\x44\x37\xd2\xa8\x0c\xb8\x39\x47\x9e\xcb\xb8\x7c\x12\x9b\xcc\x5f\xe3\x1d\x71\x6e\xf9\x78\xc2\x06\xd7\xf0\x8a\x79\x34\x66\x59\x4f\x4d\x75\xe2\x15\xbb\x63\x74\x59\x6f\x8e\x7d\x00\xee\xa7\x24\x78\x09\x43\xe8\x9b\xd3\x86\x3c\x95\x1b\xbd\x24\xef\xee\x23\xc9\x7c\x2c\x79\x7c\x7f\xaf\xbf\x8f\x2c\x8b\x43\xf3\x7a\x5f\x88\x11\x29\xa0\x95\x73\xfa\x7a\x03\x4a\x28\x5e\x80\xdc\x4b\xa4\xbc\x95\x64\xa4\xdc\xed\xeb\x33\x16\x7e\x0b\x30\xc5\xa0\x0b\x9a\x10\x9a\x22\x31\xcf\xa0\x01\x2b\x29\xb2\xb3\x45\x0b\x89\x2e\xcc\xef\x08\x08\xe5\x03\xf8"}, -{{0x61,0xb2,0x60,0xf5,0xb8,0x48,0xb2,0x71,0xef,0x48,0xe5,0xa5,0x6d,0x29,0x74,0x32,0xd8,0x9f,0x2a,0xb8,0x5b,0xd5,0x38,0xfa,0x66,0x88,0x70,0xd0,0x56,0x02,0x20,0xe5,},{0x60,0x86,0xfe,0x87,0x35,0xf3,0x99,0xf1,0xaf,0x2e,0x39,0x5e,0x0f,0xdf,0xb5,0x62,0x9e,0xbc,0xb0,0x4b,0x6e,0xd4,0xa5,0x4a,0x9e,0x47,0x05,0x2c,0x6e,0x81,0x91,0xd4,},{0x98,0x28,0xfe,0xc8,0xff,0x5c,0xf8,0x5a,0x98,0xf4,0x50,0x77,0x0b,0x5b,0xdb,0x4b,0x80,0xda,0xca,0x44,0x37,0x9d,0x8f,0x53,0xc9,0x1c,0x34,0x8e,0x22,0xdf,0x64,0xac,0x48,0xf2,0xb6,0xe2,0xa7,0xb3,0xb6,0x42,0xbc,0x81,0x93,0xa1,0x94,0x31,0x62,0x29,0xe6,0x94,0x47,0xed,0x24,0x1c,0xd4,0x23,0xd8,0x3b,0x6f,0xe7,0xb2,0xd4,0x4b,0x00,},"\x28\x26\x29\x5d\x79\x94\x5f\x67\x54\x76\xbc\x4d\x45\xef\x80\x0d\x80\xb1\xf0\x39\x8e\x4b\xe6\x0e\x3d\xe4\x57\x1e\xd1\x08\xdf\x98\x9f\x03\x2d\xe6\xc2\x34\x5d\x99\x48\xd6\x77\x92\x7e\xa0\xb8\xcf\x1a\x5c\xa3\x6f\xd5\xf2\x3c\x25\xdc\x0d\x2a\xb5\xbd\x56\x5a\x54\xaf\x46\xfd\x97\xd3\x38\xd7\x70\xe3\xa7\xb4\x7e\xfb\x54\xc0\x7a\x16\x64\x70\x77\x71\xeb\x4e\x37\xd9\xd7\x0b\xa7\x79\x25\x1d\xcd\xcd\x3b\xf6\xd1\x24\x8a\xde\xc5\x3f\x78\x72\x59\xc4\xd5\x94\xd5\xfd\x4c\xed\x8e\x3d\xb7\x62\x1d\x49\x65\xd4\x82\x98\x17\x81\x24\x93\x1a\x3d\x0c\xd2\x69\xb2\xd5\x3b\x7c\xd2\x61\xb9\x6d\x37\x0c\x5d\x96\x93\xc8\xad\x13\x3e\xd5\x89\x45\xee\x35\x40\xe1\x06\x25\xd9\x24\xae\xba\x9b\xda\xfc\x65\x61\x00\xaa\xb2\x76\xfa\x99\x6b\x1d\xb4\x77\xbf\x85\xea\x55\x90\x81\xd5\xb4\xc7\x30\x7d\xc1\x59\x56\x54\xac\xa8\x2f\x7b\x6d\x2d\xda\xf7\x35\x7c\x15\xa4\xd7\xd8\xb9\x08"}, -{{0x93,0x6d,0xc1,0xce,0xf6,0xa3,0x10,0x74,0x7f,0x35,0x00,0x88,0x05,0x5a,0x39,0xaa,0x76,0x2d,0x9a,0x4b,0x52,0xc8,0xc8,0xe4,0xc6,0x82,0x79,0x43,0x80,0xc2,0x72,0x5c,},{0x03,0xb3,0x18,0x00,0x41,0x2d,0xf4,0xd5,0x6f,0x15,0x32,0xc0,0x58,0x28,0xc0,0xb7,0x25,0x28,0xa6,0x7a,0x78,0x1b,0xef,0x4c,0x06,0xc1,0xfb,0x6f,0xf2,0xce,0x32,0x4b,},{0x3f,0x99,0x4b,0x8e,0xf5,0x28,0xf6,0x42,0x1c,0x6a,0x6a,0x22,0xe9,0x77,0xad,0xe5,0xce,0xe8,0x87,0x26,0x3d,0xe3,0x8b,0x71,0x9a,0xcd,0x12,0xd4,0x69,0xbf,0xd8,0xc3,0xf6,0x8e,0x7a,0xc0,0x7d,0x2f,0xae,0x80,0xa2,0x09,0x27,0x78,0xdf,0x0b,0x46,0x35,0x37,0xad,0x3a,0x05,0x51,0x99,0x7a,0x3d,0x5b,0x51,0xf8,0x32,0xd9,0xc8,0x23,0x0b,},"\xeb\x58\xfe\x86\xc4\xef\x34\x9c\x29\xae\x6f\xb0\x4f\x10\x85\x0e\x38\xc6\x82\x3d\xbe\x64\xa0\x9a\x5b\xf1\xe0\xce\x60\x0d\x39\x4e\xfa\x6f\xb9\x6e\xd6\xa8\xf2\xc9\xd4\xbe\xc0\x5e\x6a\x5e\xbd\x5a\x1b\xf4\xd0\xc5\x1d\xb9\x34\xe5\x7b\x79\xe5\xc6\xa8\x79\xd9\x75\x19\x7d\xbb\x10\x47\x5f\x65\xc7\xf8\xa8\xc6\xa7\x7a\x42\x03\x84\xb5\x06\x2a\x27\x40\xf1\x40\x17\x40\xee\x0f\x5e\x04\x3a\xad\x7a\x2a\x2b\x42\x60\xc5\xd9\x07\xf7\x05\xed\xaf\x65\xb0\xe3\x75\xdf\xc7\xb0\x0b\xd6\x60\xdb\x61\x47\xf2\xeb\xe8\x70\xa0\xee\x18\xdc\x2b\xa3\xc9\x2b\x0b\x76\xfa\xe2\xb9\x09\x32\xcd\xb6\xc1\x49\xe4\x6f\x3f\xee\xcf\x4c\x26\xf0\x44\x1f\x3a\x9e\x00\x66\x78\xae\xcf\xf8\xcc\xae\xca\xed\xa7\x3a\x18\xa6\x8a\xc9\x88\xb6\x2e\x83\xa9\xbb\x51\x88\xae\xde\x38\xdf\x77\xa9\xa1\x64\xab\xbd\xd9\xd5\x8e\x52\xa6\xca\xf7\x22\x23\x89\xf1\x98\xe8\x5f\xbf\x96\x62\x36\xdc\xdb\xd4\xc1"}, -{{0xf8,0x9e,0xed,0x09,0xde,0xc5,0x51,0x36,0x1f,0xa4,0x6f,0x37,0x59,0x73,0xd4,0xfb,0xfa,0x5c,0x5c,0x12,0xf1,0xb5,0xe5,0xab,0xf4,0x5c,0xfa,0x05,0xff,0x31,0xa3,0x40,},{0x3e,0x0e,0xfd,0xca,0x39,0x19,0xfa,0x10,0xd4,0xa8,0x49,0xce,0xf1,0xde,0x42,0x88,0x51,0xbd,0x08,0xef,0xd2,0x48,0x59,0x4f,0xd8,0x9c,0xde,0xb9,0xde,0xee,0x43,0xb0,},{0x89,0x7e,0x6f,0x27,0x97,0xc3,0xf3,0x26,0xd2,0xcd,0xb1,0xd2,0x67,0x3d,0x36,0x06,0x31,0xf0,0x63,0x30,0x45,0x80,0xff,0x5b,0x4e,0xb4,0x3d,0x39,0xad,0x68,0x51,0x83,0x4c,0x9c,0xf8,0x91,0xd9,0xf0,0x90,0x5b,0xf8,0xde,0x07,0x5f,0x76,0x35,0xdf,0xca,0x60,0x1a,0xdc,0x0f,0x14,0xe7,0xb2,0xc7,0x6f,0x75,0x71,0xbf,0xa4,0x68,0xed,0x0c,},"\x4c\xf9\x77\x3d\xa0\x5f\xd3\x22\xfc\x14\x7b\xe9\x00\xef\x5c\xf2\x56\xc8\x8a\xfd\xad\x4b\x08\xc2\x30\xdf\xc8\x98\x1f\xb6\x9f\x47\x6f\x7d\x45\xef\x7c\x90\x06\xbc\x10\x03\x2b\xa5\x34\x36\xac\x22\x84\x3e\x0d\x76\x28\x9c\xf6\x8f\x98\x18\xfa\x64\x03\x1d\x4b\x40\x95\x50\x59\xaa\x69\x11\x09\x15\x88\x9f\x5e\x22\x73\x2a\x13\x43\x91\x25\x81\xab\x3b\x11\xa3\xba\xe7\xa4\x71\x35\x95\x08\x59\x65\x75\xf8\x88\x16\x0b\xee\xf9\x66\xe5\x70\x8f\x0e\x31\x47\xea\xcf\xce\xc1\xca\xa3\xef\x24\x0c\x5e\x0a\x14\xc1\x86\x54\x6c\x8e\xeb\x64\x65\x83\x50\xb1\xaf\xfc\x0c\xfd\x2a\xc2\x13\xaf\x67\x0a\xfc\xa7\xbb\xc9\xdd\xdd\x28\xa4\x65\xb5\x86\xe6\x9c\x38\x8c\xd7\x34\x78\xd6\x8e\xfb\x32\x2b\xdf\x86\xd9\x21\x30\x11\xe7\x11\xb2\xb9\x5f\xef\xa7\xbb\x9b\x59\x39\x76\x17\x06\xaa\x71\x21\x02\x49\x06\x42\x0b\xdd\xf1\xd8\x80\x0a\x43\x38\xd9\x38\xfa\x13\x7c\xf2\x7e\x9f\xfc\x51\xc6"}, -{{0x40,0x07,0x96,0xef,0x60,0xc5,0xcf,0x40,0x84,0xde,0xe1,0x80,0x1c,0x4a,0x19,0x75,0xe4,0x82,0xe7,0x0a,0xef,0x96,0x1c,0xd4,0x2e,0x2f,0xd5,0xa3,0xfa,0x1a,0x0f,0xbe,},{0xf4,0x7d,0xa3,0x81,0x28,0xf2,0xd0,0x12,0xcc,0x57,0x97,0x57,0x1d,0x47,0x9c,0x83,0xe7,0xd8,0xa3,0x40,0x98,0x02,0xf9,0xa7,0xd9,0x76,0xc2,0x70,0x67,0xcb,0xbe,0x43,},{0x84,0xd3,0xaa,0x3f,0x36,0x18,0x44,0x39,0x67,0x54,0xd8,0x0d,0x9f,0xa0,0x5b,0x8b,0x2f,0xa4,0xab,0xf3,0xa0,0xf3,0x6b,0x63,0x9b,0xee,0x9c,0xfb,0x5c,0x85,0x30,0xa3,0xa9,0xcc,0x34,0x67,0x7f,0x92,0xa9,0x13,0xc4,0x1e,0x80,0x0f,0x2e,0x80,0x41,0xf7,0x66,0x6d,0x07,0xed,0x85,0xf1,0x6a,0x57,0xd8,0x17,0xb1,0x24,0x1f,0xc5,0xee,0x04,},"\xc4\x73\x32\x5e\x78\x5b\x27\xdf\x44\x71\xee\xfb\x9e\xbe\xbd\x64\x61\xd5\x70\x80\x01\x81\x10\x0f\xf3\x6c\xaf\x3c\x38\xf6\x7c\x19\x21\xb1\x57\xec\x8e\x61\x26\xf9\x55\xae\xbd\x90\xea\x3f\xe5\x38\x5f\x80\x42\xcd\x70\x4b\x27\xcc\x1d\x69\x78\xc0\xe2\xa2\x96\x69\x5f\x5e\xf9\x7b\x7c\x2e\x16\xae\x4f\xf4\xd0\x63\xc6\x88\xd7\xf4\x6e\x96\x4e\x1f\x0a\x00\x50\x3f\x35\x73\x45\x97\x76\x83\xd6\xe4\xc3\x42\x3d\x56\xbd\xb6\xce\x86\x4b\x69\x87\xe0\x85\xe8\x3e\x70\xc7\xc1\xa1\x4e\x0e\x41\x3f\x59\x2a\x72\xa7\x1e\x01\x7d\x50\x5b\x64\xc2\x4f\x1a\x1a\x6b\x81\x3e\x06\x4e\x6e\x0c\xf8\xbd\x45\x71\xd0\xff\x2f\x26\x7a\x6a\x13\xe0\xcd\x43\x04\x63\xb6\xca\x3b\x88\xf0\xcd\x40\xb0\xfb\x83\xd5\xbe\xdf\x6f\x7d\x47\xe1\x70\xe8\x7d\x0a\x75\x00\x93\x69\x3e\xda\x23\x2a\x6d\xaf\x98\x12\x57\x27\xb9\x58\x8e\xcb\x89\x4a\xe3\x73\xba\xe3\xa4\x45\xa1\x06\x30\x64\x69\xa4\xc2\xcd\x77\xff"}, -{{0x67,0x03,0xa6,0x23,0x2c,0x5e,0x2e,0x65,0xe0,0xab,0x3b,0x92,0xe2,0xaa,0xf9,0xf5,0xfb,0xd3,0x3f,0xb4,0x69,0x88,0x04,0x7d,0x6f,0x4d,0x0f,0xf5,0x38,0x7f,0xa0,0x29,},{0x04,0x7c,0xff,0xca,0x8b,0x7b,0x11,0xac,0x6e,0xac,0xc0,0xea,0xa0,0xc5,0xb7,0x3c,0x75,0xb9,0xc6,0x37,0x95,0x69,0x73,0xaf,0x9d,0x97,0xb2,0xdd,0x5b,0x60,0x5d,0x6f,},{0xca,0xe9,0x68,0x79,0xe5,0xb6,0x03,0xbe,0x86,0x66,0x09,0xd4,0xa0,0x53,0xbf,0xa1,0x2a,0x51,0x37,0x8e,0x99,0xb2,0xa2,0x81,0x2e,0x47,0x89,0x26,0x7d,0x8f,0x32,0xf4,0x73,0x24,0x3f,0x8a,0xf7,0x4b,0x9b,0xe7,0x3f,0x47,0xde,0xa5,0x0f,0x0d,0x16,0x5e,0xbf,0x49,0x45,0x8b,0x73,0xe5,0x3d,0x88,0x58,0x0c,0x19,0x1a,0x18,0x2d,0x19,0x04,},"\xa2\x6b\x30\xa7\x69\x19\x79\x32\xa3\xa6\x28\x54\x96\x8d\x76\x01\x51\x61\x23\x66\x77\x8d\xc9\x94\x57\x6a\x2e\x0e\x03\x55\x49\x6b\x46\x20\x0e\x50\x69\x48\xa0\xd1\x02\xb6\x65\x1b\x2e\x73\x34\xca\x6c\x6e\xae\xf8\xbc\xa4\x4b\x42\x59\x70\xa0\xb3\x7d\x6b\xde\x0d\xa9\xd3\xc1\xb9\xf5\x1c\xbb\x25\xbc\x33\x5c\xd6\xfa\x92\x8a\x74\xf2\xc0\xdc\x2c\x6e\x99\xd3\x7a\x12\x86\x3a\x47\x4d\x4d\xf4\x3a\xad\x35\x41\x5f\xfc\xaa\x24\xd8\xc2\x9f\x91\x45\x72\xab\x2a\xbe\xc3\x89\x2d\xb4\x9e\x67\x9c\x5e\xa2\x20\xc2\xf5\x19\xa7\xd0\x33\xac\x1a\x2c\x5a\x46\x78\x69\xe3\x0e\xda\x3d\x26\x35\xca\x86\x34\x31\x47\x3f\x95\x8d\x55\x2b\xdc\x55\x82\x35\x2c\x29\x0d\x0c\xe4\xfa\x9c\xfd\x0a\xd4\x27\x99\xc2\x27\xec\x90\xb7\xc9\xe5\xdb\x9f\x5a\x7b\x6d\x56\x92\x12\xee\xd9\x4d\x32\x33\x26\x80\x5f\x2b\x3a\x00\x10\xd6\xc1\x1e\xb4\x10\x7c\x82\x83\x03\x76\x52\xf5\x0d\xc0\x67\xb6\xdc\x81\xf4\xdb"}, -{{0xe0,0xe7,0x2f,0x8f,0x17,0x86,0x33,0x62,0x67,0x33,0xbc,0xbd,0xa2,0xad,0x2a,0x50,0xe6,0x53,0x89,0x0f,0x15,0x35,0x9b,0x6c,0x22,0xfc,0x73,0x45,0xad,0x33,0x31,0x09,},{0xd1,0x3c,0xee,0x54,0x0d,0x84,0xb5,0x66,0x7d,0x51,0x6f,0xe7,0xec,0x72,0x39,0xbf,0x8d,0xa9,0x15,0x46,0xee,0x79,0x1f,0x84,0xed,0xd8,0xff,0xcf,0x3a,0x08,0x3e,0x76,},{0x14,0x55,0x21,0x71,0xb9,0x52,0x45,0xac,0x0f,0x0e,0x5a,0x6e,0x7a,0x2f,0x54,0x17,0x21,0x06,0x8d,0xb6,0x50,0xc6,0xda,0xda,0x04,0xc2,0x8c,0xab,0x7c,0x49,0x19,0x5f,0x64,0x36,0x71,0x21,0x44,0xcb,0x31,0x91,0x3c,0x56,0x2e,0x30,0xc3,0x9d,0x8a,0x85,0x49,0xfb,0x64,0xff,0xea,0x81,0xc7,0x44,0x51,0x43,0xb5,0xf2,0x32,0x86,0xda,0x05,},"\x79\x1f\xd6\x13\xc1\x09\x52\x92\xc8\xa4\xa2\xc8\x6b\x47\xae\x02\x61\x55\xb8\x46\x5b\x60\x7d\xbb\x41\x64\x77\xef\x79\xa2\x97\xc9\xd7\x75\x8c\xe3\x4a\xf9\xdc\xbf\x1c\x68\x47\x4f\x30\x90\x9f\xbe\x74\xb7\xba\x42\x96\x32\xf2\x40\x3a\xad\x83\x2b\x48\x6b\x72\xc2\x30\x54\xad\x42\xf7\x65\x3a\x9d\xdb\x45\x6c\xc7\x91\xf3\x48\x88\x6a\x7a\xe5\xdc\xec\x7c\x0b\xa8\x15\xf7\xa9\x3a\x10\xfe\x33\x1e\x90\x3b\x97\x0f\x7b\x50\x28\xbe\x49\xd1\x4b\xc5\x62\x0d\x63\x79\x26\x72\xb9\x8b\x94\x88\xc6\x7a\xe1\x66\x46\x69\x3e\x11\x20\x47\xf0\xac\x89\x21\xff\x56\x1c\x92\xdd\x05\x96\xd3\x2d\xf0\xa6\xe5\x07\xac\x1b\x07\xde\x51\x6c\x98\x42\x8d\x57\x0a\x37\xdb\x9b\xcd\x7c\x7e\x61\xc6\x94\x8a\xb3\xfe\x91\x25\x0d\xd1\xd5\xbd\x67\x12\x75\xdf\x9a\x97\x2f\x22\xc2\xba\x36\x80\x47\x47\xae\xc1\xea\x24\x16\xc1\xf4\x1a\xb8\x7b\xef\xde\x31\x62\x9b\x2d\x43\x31\x7c\xe4\x1c\xda\x03\x62\x62\x86\xc0"}, -{{0x54,0x4d,0xaf,0xd9,0x96,0x0d,0x82,0x97,0x56,0xc6,0xd4,0xb3,0xea,0xdd,0x44,0x37,0x5f,0xe7,0x80,0x51,0x87,0x6b,0xf9,0x78,0xa3,0x81,0xb0,0xde,0xca,0xaa,0x80,0x96,},{0xae,0x4f,0x64,0x25,0xc1,0xb6,0x7c,0xcb,0x77,0xf9,0xaa,0xcf,0xea,0x28,0xea,0xef,0x76,0x9c,0x8c,0xac,0xee,0x03,0x52,0x05,0xcd,0xcd,0x78,0x7e,0x8d,0x07,0x62,0x9d,},{0xa2,0xae,0x11,0x7c,0x8d,0xe4,0xca,0x6d,0x6f,0xe7,0x5e,0x46,0x60,0x23,0xbd,0x55,0x0c,0x26,0xfe,0xdd,0x3e,0x74,0xca,0x13,0xad,0xb6,0x25,0xf2,0x72,0xe1,0x75,0xf1,0x4d,0x5d,0xf5,0x50,0xac,0xe7,0xd8,0x22,0x88,0xef,0xef,0xab,0xf9,0x63,0x11,0xa1,0x23,0xbe,0xe2,0x38,0x89,0xad,0x37,0x11,0xbf,0xf2,0xb8,0x08,0x79,0x46,0xbf,0x0e,},"\x44\x7f\xe7\x34\x4c\xad\x1f\xae\x09\xd6\xa7\xd0\x5f\x09\xd5\x03\xc1\xb3\xd3\xd5\xdf\xa5\x84\x81\x0c\x35\xbc\x41\xe4\x95\x56\x93\x70\x61\x54\xe2\xd7\x51\xb2\xf1\xb5\x25\xe1\xa1\x45\x47\xba\x7f\x8b\x23\x20\x88\xa6\xfc\x92\x27\x02\xd9\x3a\x11\xcd\x82\x94\x9c\x27\xbe\xd6\x45\xdc\x35\x1f\xb4\xc1\x24\x2c\xf4\x1d\x01\x57\x54\x12\xe7\x92\xae\xd2\x14\x53\x1d\x94\xfd\x66\xe0\x3d\xd3\x2e\x97\x2f\xd7\x7f\x69\x47\xa3\x53\xe1\xae\x5e\x00\xf5\xa6\xca\x77\x99\x24\x72\xf0\x96\xb6\xe7\x47\x5f\xe5\x34\xe9\x13\xa7\x7b\xcb\x0d\x68\x1f\xdf\xb3\xa7\xa0\xdc\xb5\x6d\x27\x4d\xf4\xaa\x10\x9d\x4a\x8a\x37\x79\x4a\x92\x76\xf5\x00\x06\x69\x6f\xf1\x2c\xa4\xd0\x25\x40\x39\xdf\x0f\xb3\xf7\x2a\x96\x0d\xa0\x5c\x98\x72\xf2\xe3\x3e\xe8\x1d\x1c\xf7\xa6\xf4\x8b\xbc\xe0\xaa\x18\xc7\xc0\xf0\x6b\xa5\x5e\x67\x68\x9e\x0a\xf5\x87\xb5\x00\xea\xb7\x9c\xc7\xf9\x64\x0b\xca\x10\x4b\x7f\xbf\x31\xf0\x8e"}, -{{0xbf,0xbc,0xd8,0x67,0x02,0x7a,0x19,0x99,0x78,0xd5,0x3e,0x35,0x9d,0x70,0x31,0x8f,0xc7,0x8c,0x7c,0xc7,0xbb,0x5c,0x79,0x96,0xba,0x79,0x7c,0x85,0x54,0xf3,0xf0,0xf0,},{0x7c,0x5a,0xe3,0xba,0xb9,0x20,0x11,0x99,0xdf,0xbe,0x74,0xb7,0xd1,0xec,0x15,0x71,0x25,0xbd,0xba,0xa4,0x52,0x0f,0x50,0x1d,0xa3,0xf2,0x48,0x57,0x9d,0xc6,0xc2,0x2d,},{0xe4,0x86,0x15,0xb6,0x56,0x33,0xe6,0x19,0x93,0xb0,0xaa,0xa1,0xfa,0xfb,0x74,0xb9,0x62,0x9c,0x38,0x4f,0xd5,0x92,0xbd,0x73,0x5f,0xa1,0xf6,0x2c,0x5c,0xad,0x11,0x29,0x1f,0xcd,0x8c,0x2e,0x91,0xa5,0x0b,0xfe,0x0b,0x03,0xb4,0x35,0x02,0xff,0xf3,0xa5,0xc3,0x82,0xb9,0xc2,0x82,0x19,0x07,0xef,0xc3,0x4d,0xa5,0xba,0x05,0x4a,0xf0,0x0e,},"\x11\x7f\xae\x13\xe7\x87\x77\xb6\x21\x9f\x02\x02\x14\xc1\xb8\x7c\x57\x04\x6d\x1c\x09\xce\x82\xee\x2b\x56\x29\x89\x8d\x9b\x0d\xe7\x4a\x15\xcf\xe9\x9f\x80\x54\x8b\xa9\x13\xd7\x03\x6c\x56\x28\x5a\x4c\xba\x49\x3b\x52\xd2\xcb\x70\xd6\x36\x5a\xce\x3d\xa1\x2b\x1f\x34\xa2\x77\x8a\xf3\x6e\xf5\x2a\xb8\x2e\xde\x04\xca\xca\xf2\x79\x3f\x5f\x89\x83\x1e\x3b\x20\x5a\x9e\xe4\xc1\xd6\xfb\xda\xb4\xba\x4d\x9f\xae\x65\xdd\x79\xa5\xfe\x76\xb4\xb3\x9a\x30\x92\xcc\x71\x48\xd2\x11\xe8\x5e\xe8\x2a\xb4\x63\xd3\x4d\xce\xe9\x06\x1d\x9c\x21\xde\xd2\x05\x1b\xbd\x50\xb4\x13\xf0\xe2\x1a\x0e\x48\xd1\xff\xa8\xdc\xae\x24\x0b\x34\x95\xbe\x25\xd9\x31\x51\xb5\x7a\xa2\x71\xab\x99\xaa\x70\x8c\xa2\x80\x80\xca\xb4\x80\x4f\xce\xfa\x92\x9f\x5f\x1e\xf3\xf4\xc6\xc0\xfb\xfb\x40\xbe\xf7\xea\x1b\x50\x9b\x36\xba\x12\x60\x32\x35\x12\x37\x9d\x7b\xc3\xfd\xbb\x5d\x3f\xaa\xc9\xb0\x0e\x21\xf1\x2e\xa1\xca\x2e\x29"}, -{{0xdf,0x2d,0xf8,0xa9,0xd6,0x6d,0x56,0x38,0xcd,0xee,0x09,0x32,0x4e,0x7b,0x10,0xf8,0xed,0x29,0xab,0x91,0x38,0x7e,0x31,0x47,0xb7,0xdc,0x03,0xf7,0xcd,0x80,0x05,0x08,},{0x5c,0x04,0x2e,0x15,0x7f,0xb7,0xfb,0x12,0xd4,0xd4,0xfe,0xf2,0x84,0x71,0x41,0xec,0xfb,0x57,0xc1,0x25,0x3e,0x14,0xea,0xf3,0x00,0x4d,0x65,0x13,0xf5,0x2f,0xe6,0x25,},{0x9a,0x10,0x74,0x53,0x1e,0xd4,0x3d,0x07,0xbf,0xfc,0x7f,0x2b,0x6c,0x13,0xb8,0x83,0x8f,0xc7,0x5c,0xba,0x02,0xc7,0xd1,0xec,0x7b,0xa3,0x8b,0xca,0x3c,0xef,0x20,0xdc,0x9b,0xad,0xf3,0xa3,0x06,0x4a,0x2c,0x93,0xb1,0x84,0x24,0x41,0x42,0x0b,0x6a,0x8d,0x42,0x1a,0x96,0x0d,0x70,0xdf,0xb7,0xc7,0x0e,0xec,0x29,0x5f,0x21,0xf8,0x3f,0x0a,},"\x21\x57\x66\x15\xc9\x34\x6a\x63\xdc\xcf\x0c\x50\xec\xbd\x7c\x6d\x72\xad\x45\x2c\xfe\xd4\x3e\xa7\x32\x02\xcc\x7a\x98\x57\x60\x56\xb9\x66\x4b\x54\x62\x29\x05\xa1\xe7\x22\x17\x20\x73\x0a\xc6\x85\xd3\xbd\x39\x77\xec\x39\x59\xd4\x46\xbf\xa9\x41\xe7\x25\xb6\xfe\x16\xaf\xe5\x43\x2c\x4b\x4b\xde\xe7\xaa\x0f\xd8\x03\x09\x48\xed\x6f\xcb\xa7\xc0\xbd\xb4\x0c\x2e\x51\x7d\xa9\x74\x56\xe7\x4e\x1f\x93\xd5\xed\x67\x6d\xe0\xf4\xa8\xb0\xae\xa4\x49\x40\x4b\xd1\x5b\x6d\xa7\x9d\xc1\xb8\x13\x96\x5f\xe5\x57\x24\x10\xd7\x6f\x5b\x5e\xac\x66\x30\x50\x57\x03\x11\xdc\x98\x42\xb6\xfb\xf8\x80\x6a\xec\x03\x15\x17\x15\xca\xcf\x7f\x21\x80\x2e\x8b\xf5\xe9\x8a\x89\xc0\xd7\xd0\xd0\x98\xb7\x3c\x6e\xfc\x09\x96\x2e\x36\xb4\xe0\x30\xc1\xa6\x4b\x5d\x34\x9f\x5f\x20\x42\xc7\x44\x28\x67\x1e\x4a\x2c\x7f\xea\x0c\xae\xe2\x42\x2d\x85\xc4\xfc\xdd\xfe\xd3\x22\x13\x85\x9a\x69\x95\x5d\x4e\x3e\xbb\x7e\x1b\x20\x22"}, -{{0xe8,0xee,0x06,0x5f,0x99,0x07,0xf1,0xef,0xa2,0xda,0xec,0xb2,0x3a,0x04,0x25,0xf3,0x53,0x09,0x4d,0xa0,0x2b,0xc2,0xc9,0x31,0xf0,0xa5,0x87,0xef,0xc0,0xd1,0x3d,0xe1,},{0xc7,0x26,0x51,0xb7,0xfb,0x7a,0xc0,0x33,0x7a,0x17,0x29,0x77,0x49,0x6f,0xd7,0xf2,0xa7,0x2a,0xea,0x88,0x93,0x85,0x83,0x5e,0x56,0x3c,0x6b,0x60,0x53,0xa3,0x2d,0xc1,},{0xa5,0x10,0xdf,0xf4,0x2d,0x45,0x59,0xa1,0x9a,0x7b,0xf0,0xfe,0x0b,0xea,0x53,0xd3,0xe1,0xf2,0x2d,0xfa,0x6b,0xe5,0x50,0x39,0x89,0x5e,0x12,0xa5,0xd0,0x7d,0xa5,0xf2,0xe3,0x77,0x13,0xcc,0xb2,0xeb,0x21,0x60,0x11,0x62,0x8f,0x69,0x83,0xf8,0x71,0xfe,0xe2,0x86,0xe6,0x6f,0xff,0x4b,0xe7,0x58,0x2c,0x96,0x1a,0x1e,0xd7,0x56,0x84,0x04,},"\xa2\xf0\xc1\x37\x34\x73\xa3\x05\xd8\xf1\xd9\x91\x38\xb0\x6b\x9a\x96\x94\xff\xaa\x8a\x88\x22\x2d\xe9\xf7\x29\xbe\xe1\x30\x51\x75\xdf\xb1\x70\x01\xcc\x77\xf6\x7b\x6d\x40\xc9\x0c\x1a\x28\xfb\x22\x6c\x11\x28\x6d\xb4\xa1\x3e\x45\xe6\x92\x11\x24\x2b\xcd\xd0\x1c\xb6\xe2\xc4\x54\xe7\x6c\x0c\xab\x88\x1b\x4d\x2d\x9d\x3a\xb1\x00\xa5\xd6\x1d\x17\x25\xd8\x66\xe4\xfd\xb6\x6d\x93\xd7\x7f\x5b\x30\x86\x93\xb9\xb5\xa3\x33\xe5\x7f\xa2\x5d\x1e\x5d\x2e\x38\xdf\x6e\x4e\x9e\xc8\x41\x59\xbb\xee\x1f\xfe\xa9\x26\x83\x6a\x01\x01\xc9\x14\x83\xbd\x5b\xc8\x8a\x6f\x1c\xc4\xd4\xe7\xf0\x08\xad\x08\x45\x3a\x01\x23\x42\x9d\xd3\x35\x78\x1c\x7c\xbf\x8d\x68\x5a\x89\x99\xed\x11\x77\x60\x70\x04\xa1\x3c\x4c\xb5\xea\x49\x08\xc5\x42\x60\x7d\x3f\x2c\xd6\x69\x0c\xf1\xf2\xa7\x45\x5b\xbd\x38\xf5\x38\xf0\x7a\x10\x39\x64\x31\x7e\xfb\xce\xe3\x7e\xb4\x69\x31\xc0\x27\xcf\x15\x3e\xf8\x6e\x43\xd7\x82\x81\xeb\xd7\x10"}, -{{0xc7,0x2e,0x67,0xd8,0xc3,0xfe,0xc0,0x04,0xff,0x61,0x87,0x18,0xa9,0x09,0x9e,0xb8,0xad,0x7b,0x06,0xff,0x3b,0x8c,0x54,0x2a,0x7e,0x8b,0x98,0x47,0x31,0x34,0x75,0xe1,},{0x4e,0xb0,0x02,0xd3,0xcc,0xeb,0x18,0x8c,0x66,0x58,0xfe,0xc5,0x1c,0xb4,0x79,0xa6,0x52,0x64,0xac,0x55,0x5c,0x75,0xcd,0xc2,0x24,0x9c,0xf1,0xce,0x3d,0xef,0xc1,0x6d,},{0x2d,0x7b,0xab,0x8e,0xbd,0xa7,0xfc,0xa5,0xbb,0x3c,0x25,0xf5,0x1d,0xc5,0x1b,0x73,0xe6,0xff,0x6a,0x3b,0xb1,0xb5,0x2a,0xcc,0x78,0x11,0xa7,0xd2,0x59,0x5c,0xd6,0xfd,0xaf,0x73,0x04,0x94,0x41,0x8e,0x2f,0x57,0xef,0xdc,0x56,0x17,0xb0,0x66,0xfd,0x7b,0x62,0x07,0x68,0x0d,0x94,0xfb,0x8c,0x43,0xd3,0xd4,0x74,0x0b,0x41,0xcb,0x69,0x01,},"\xa8\xf3\x41\x35\xc0\x13\x2e\xc9\x5b\x64\xb0\xcb\xf5\x1d\x66\x90\x01\x43\x37\x04\x06\x79\x1f\xbb\x55\xf2\xb8\xca\x95\x3c\xc7\x4a\x46\xe0\x8b\x00\x2f\xa2\xda\x21\xb9\x51\xb8\x87\x1f\x7a\x29\xbc\x6d\x38\x79\x0a\xfc\x66\xa3\x29\xc3\x97\xd9\xf9\x25\x0b\xae\x0e\x30\xae\x34\x26\xe0\x8d\x8e\xad\x01\x79\xa3\xb3\x13\xc9\x08\x83\x91\x92\xf2\x89\xa3\xf3\xb6\xe9\x60\xb4\xc5\xce\xbe\xf0\xa0\x9d\xaa\x9c\x7a\x15\xc1\x9d\x4e\xbc\x6f\xc2\xac\x3c\xd0\x22\x32\xe8\x32\xb2\x34\xed\xd7\x96\x5d\x68\x7b\xfe\xb7\x58\xf7\x0f\xa7\x96\x38\x41\xb7\x85\x9b\xb9\x7c\x97\x1b\xd5\x57\xbc\x87\x69\x52\x4a\xc4\xc6\xee\xb3\x57\x97\x93\x33\x4b\x52\x2d\x17\x6b\xc6\x2f\x86\xb4\xd5\xc0\xd4\x01\x70\x36\xd2\xb6\xbd\x4e\x43\x84\x41\x6e\xf8\x26\x31\x39\x69\x1a\x86\x06\x17\x0d\x73\xc9\x3d\x64\x17\xdc\xc1\xa0\x8a\x53\x7c\x9e\xd4\x40\x04\x71\xa4\x6f\x52\x90\x7b\x46\xb1\x0a\x8b\x68\x89\xdb\xb4\x64\x7a\x8b\xbc\x71\x49"}, -{{0x69,0x64,0x50,0xb5,0x57,0xec,0x3c,0x94,0xcf,0x1a,0xf1,0x32,0x64,0x75,0x63,0x4a,0xa8,0x1d,0xef,0x38,0x14,0xff,0x30,0xa0,0x2b,0xa7,0xf2,0x04,0x4b,0x59,0xc0,0xfe,},{0x85,0x84,0x77,0x3c,0x56,0x6b,0x0e,0xed,0x3f,0x43,0x28,0x17,0x05,0xb5,0x75,0xa4,0x34,0xe4,0x7d,0x6c,0xf6,0xb2,0x51,0xb8,0x98,0x03,0xfe,0xf5,0x35,0x34,0xcb,0x29,},{0xce,0x8b,0x0a,0x57,0x79,0xf4,0xf5,0xf4,0x01,0xe8,0x4d,0x65,0x92,0x7a,0x0c,0x28,0xdf,0x82,0x9e,0x95,0xd0,0x9b,0xfa,0x97,0x11,0x1b,0x87,0x00,0x07,0x8f,0xf8,0x94,0xcf,0x72,0x77,0xe3,0x4a,0x71,0x61,0x44,0xd5,0x53,0x06,0xfc,0x9e,0x2f,0x64,0xcd,0x28,0x75,0x83,0xcc,0x80,0x03,0xbe,0x0e,0x8f,0xaf,0x26,0xaf,0x76,0x40,0x14,0x0e,},"\xcc\x25\x78\x29\xf3\x0a\x5f\x90\xdf\xdb\xc2\x47\xd4\x2e\x38\x87\x38\xb7\x6c\x41\xef\x8a\x82\xa5\xe0\x22\x5d\xdf\x1e\x38\x6d\x77\x08\x0b\x3b\x9d\xf8\x6c\x54\xb8\x5c\xdf\x2c\x32\xf3\x67\xab\xa0\xc3\xb6\xbf\x88\x8a\x5a\x69\x03\x52\x9b\x6a\xeb\x4d\x54\x07\xa1\x01\x80\x14\x91\x14\x13\x02\x28\xfc\x43\x56\xcc\xf3\x66\xb7\x7b\xe8\x97\x96\xa9\xe7\x1a\x0c\x69\x3f\x31\xe5\x84\xa4\xf1\x43\x09\x7b\xa3\x70\x36\x3b\x67\xb2\xf2\xe2\xfd\x8d\x6f\xe8\xb4\xe8\xdb\xf0\xd7\xdc\xc1\xa8\x36\x00\x41\x15\x8a\xa2\xaf\xf7\xe2\xa3\x25\xb8\xe5\x18\xf1\x93\xa2\x8b\xae\x05\xe3\xd5\x2b\x26\x62\x1a\xf4\x02\x02\x6d\x7f\x25\x0e\x86\xdc\xee\x30\x1a\x58\xb6\x31\xea\xdf\x45\x27\xe9\x58\xf0\x2a\x61\x58\x7f\x0b\xb5\x16\xce\xfa\xc0\x09\xfe\x51\x05\x2f\xff\x53\x33\x6d\xbd\x94\xe7\x26\x6d\x3b\x43\xca\xba\x8a\x1b\x38\xe5\xd8\x71\xc2\xa2\x4a\x4c\x41\x2f\xff\x3f\x7a\x9a\x52\xa8\xab\x23\xba\xc9\x79\x1b\x2b\x5a\x66\x9a"}, -{{0xa8,0xdd,0x35,0xf0,0x54,0xfb,0x6f,0xf6,0xf0,0xab,0x09,0x4a,0x0d,0x3d,0x1c,0x26,0x28,0x32,0x18,0x1d,0xf3,0x5c,0xcd,0x51,0x92,0x54,0x5e,0xbd,0x6a,0x9c,0xf5,0x29,},{0xca,0x41,0x23,0x38,0xd3,0x81,0x4b,0x88,0x6d,0x96,0x4b,0x71,0x92,0x5e,0x1a,0xab,0xb3,0xff,0xd0,0x78,0x34,0xdb,0xe7,0xdc,0x51,0x25,0x68,0x88,0x2b,0x53,0xe4,0xa3,},{0xfa,0x70,0x9f,0xbc,0x83,0x82,0xaf,0x83,0xd1,0x18,0x12,0x61,0x8d,0xfa,0xca,0x45,0x2e,0xab,0x83,0xe4,0xc5,0x3f,0xe9,0xe5,0x85,0x84,0x67,0xd0,0x7b,0x67,0x67,0xe1,0x79,0x75,0xc1,0xe0,0x63,0x93,0xd6,0xdd,0xe1,0x5a,0x34,0xd9,0x47,0x3d,0x1c,0xf4,0xd6,0xd8,0xc2,0xd5,0x73,0x94,0x52,0x00,0x80,0xfa,0xc4,0xe4,0x34,0x48,0xbe,0x07,},"\x55\xa7\xad\x91\x32\xd6\x3a\xc1\x61\xe7\xad\xb1\x32\xb9\x18\x9f\xdd\x84\xc3\x61\xc1\xe4\xf5\x41\x9a\x6d\xf7\x3d\xf4\xd7\xae\xb2\x9a\x8d\xc4\xbf\x01\x49\x0d\x4f\x48\x4e\x2d\x12\x07\x75\x17\xf5\xfc\x7a\xd0\xbd\xed\xa2\x0a\x6c\xb0\x22\x79\x42\x29\x0b\x08\xc3\xfe\x33\xab\x9b\x21\x35\xbc\x38\xa6\x57\x9a\x54\xbd\x98\x2f\x7d\x14\x17\xce\x86\x71\x17\xae\xa9\x18\xdb\xd3\xdd\x47\x6e\x7e\xb5\xb5\xd3\xc3\xe4\x8a\x86\x4a\x2f\x94\x2a\x31\x50\x1a\xa2\xb2\x9b\x53\xb8\x05\x13\xc9\x5d\x6a\x41\x18\x44\xf0\xde\xdf\x16\xa2\x9a\xc2\x67\xd3\x31\xe5\x3b\xdc\x25\x39\xbf\xcf\x32\xdc\x9b\x5d\x64\x0f\x12\x31\xe2\xca\xfb\x0a\xe9\x4b\xb5\x18\x94\x26\x86\x33\x64\x26\x2e\xfb\x47\xb5\xb5\xcc\xdb\xbc\x93\x32\x42\x16\xa7\x99\xb6\xf5\x0d\x37\x04\xf1\x5e\xd5\x9a\xf6\xcc\x7d\x91\x0c\xf0\x62\xd1\xbe\x63\x2d\xca\x5d\xf2\x13\xd4\x87\xd8\x56\x4f\x2b\x2b\xd7\xd8\x18\xbb\xa2\x7c\x36\x40\x13\xd9\x2d\x7f\x72\x62\x54\x62"}, -{{0xae,0x1d,0x2c,0x6b,0x17,0x1b,0xe2,0x4c,0x2e,0x41,0x3d,0x36,0x4d,0xcd,0xa9,0x7f,0xa4,0x76,0xaa,0xf9,0x12,0x3d,0x33,0x66,0xb0,0xbe,0x03,0xa1,0x42,0xfe,0x6e,0x7d,},{0xd4,0x37,0xf5,0x75,0x42,0xc6,0x81,0xdd,0x54,0x34,0x87,0x40,0x8e,0xc7,0xa4,0x4b,0xd4,0x2a,0x5f,0xd5,0x45,0xce,0x2f,0x4c,0x82,0x97,0xd6,0x7b,0xb0,0xb3,0xaa,0x7b,},{0x90,0x90,0x08,0xf3,0xfc,0xff,0xf4,0x39,0x88,0xae,0xe1,0x31,0x4b,0x15,0xb1,0x82,0x2c,0xaa,0xa8,0xda,0xb1,0x20,0xbd,0x45,0x2a,0xf4,0x94,0xe0,0x83,0x35,0xb4,0x4a,0x94,0xc3,0x13,0xc4,0xb1,0x45,0xea,0xdd,0x51,0x66,0xea,0xac,0x03,0x4e,0x29,0xb7,0xe6,0xac,0x79,0x41,0xd5,0x96,0x1f,0xc4,0x9d,0x26,0x0e,0x1c,0x48,0x20,0xb0,0x0e,},"\x9e\x6c\x2f\xc7\x6e\x30\xf1\x7c\xd8\xb4\x98\x84\x5d\xa4\x4f\x22\xd5\x5b\xec\x15\x0c\x61\x30\xb4\x11\xc6\x33\x9d\x14\xb3\x99\x69\xab\x10\x33\xbe\x68\x75\x69\xa9\x91\xa0\x6f\x70\xb2\xa8\xa6\x93\x1a\x77\x7b\x0e\x4b\xe6\x72\x3c\xd7\x5e\x5a\xa7\x53\x28\x13\xef\x50\xb3\xd3\x72\x71\x64\x0f\xa2\xfb\x28\x7c\x03\x55\x25\x76\x41\xea\x93\x5c\x85\x1c\x0b\x6a\xc6\x8b\xe7\x2c\x88\xdf\xc5\x85\x6f\xb5\x35\x43\xfb\x37\x7b\x0d\xbf\x64\x80\x8a\xfc\xc4\x27\x4a\xa4\x56\x85\x5a\xd2\x8f\x61\x26\x7a\x41\x9b\xc7\x21\x66\xb9\xca\x73\xcd\x3b\xb7\x9b\xf7\xdd\x25\x9b\xaa\x75\x91\x14\x40\x97\x4b\x68\xe8\xba\x95\xa7\x8c\xbb\xe1\xcb\x6a\xd8\x07\xa3\x3a\x1c\xce\x2f\x40\x6f\xf7\xbc\xbd\x05\x8b\x44\xa3\x11\xb3\x8a\xb4\xd4\xe6\x14\x16\xc4\xa7\x4d\x88\x3d\x6a\x6a\x79\x4a\xbd\x9c\xf1\xc0\x39\x02\x8b\xf1\xb2\x0e\x3d\x49\x90\xaa\xe8\x6f\x32\xbf\x06\xcd\x83\x49\xa7\xa8\x84\xcc\xe0\x16\x5e\x36\xa0\x64\x0e\x98\x7b\x9d\x51"}, -{{0x02,0x65,0xa7,0x94,0x4b,0xac,0xcf,0xeb,0xf4,0x17,0xb8,0x7a,0xe1,0xe6,0xdf,0x2f,0xf2,0xa5,0x44,0xff,0xb5,0x82,0x25,0xa0,0x8e,0x09,0x2b,0xe0,0x3f,0x02,0x60,0x97,},{0x63,0xd3,0x27,0x61,0x5e,0xa0,0x13,0x9b,0xe0,0x74,0x0b,0x61,0x8a,0xff,0x1a,0xcf,0xa8,0x18,0xd4,0xb0,0xc2,0xcf,0xea,0xf0,0xda,0x93,0xcd,0xd5,0x24,0x5f,0xb5,0xa9,},{0xb6,0xc4,0x45,0xb7,0xed,0xdc,0xa5,0x93,0x5c,0x61,0x70,0x8d,0x44,0xea,0x59,0x06,0xbd,0x19,0xcc,0x54,0x22,0x4e,0xae,0x3c,0x8e,0x46,0xce,0x99,0xf5,0xcb,0xbd,0x34,0x1f,0x26,0x62,0x39,0x38,0xf5,0xfe,0x04,0x07,0x0b,0x1b,0x02,0xe7,0x1f,0xbb,0x7c,0x78,0xa9,0x0c,0x0d,0xda,0x66,0xcb,0x14,0x3f,0xab,0x02,0xe6,0xa0,0xba,0xe3,0x06,},"\x87\x4e\xd7\x12\xa2\xc4\x1c\x26\xa2\xd9\x52\x7c\x55\x23\x3f\xde\x0a\x4f\xfb\x86\xaf\x8e\x8a\x1d\xd0\xa8\x20\x50\x2c\x5a\x26\x93\x2b\xf8\x7e\xe0\xde\x72\xa8\x87\x4e\xf2\xee\xbf\x83\x38\x4d\x44\x3f\x7a\x5f\x46\xa1\x23\x3b\x4f\xb5\x14\xa2\x46\x99\x81\x82\x48\x94\xf3\x25\xbf\x86\xaa\x0f\xe1\x21\x71\x53\xd4\x0f\x35\x56\xc4\x3a\x8e\xa9\x26\x94\x44\xe1\x49\xfb\x70\xe9\x41\x5a\xe0\x76\x6c\x56\x5d\x93\xd1\xd6\x36\x8f\x9a\x23\xa0\xad\x76\xf9\xa0\x9d\xbf\x79\x63\x4a\xa9\x71\x78\x67\x77\x34\xd0\x4e\xf1\xa5\xb3\xf8\x7c\xe1\xee\x9f\xc5\xa9\xac\x4e\x7a\x72\xc9\xd7\xd3\x1e\xc8\x9e\x28\xa8\x45\xd2\xe1\x10\x3c\x15\xd6\x41\x0c\xe3\xc7\x23\xb0\xcc\x22\x09\xf6\x98\xaa\x9f\xa2\x88\xbb\xbe\xcf\xd9\xe5\xf8\x9c\xdc\xb0\x9d\x3c\x21\x5f\xeb\x47\xa5\x8b\x71\xea\x70\xe2\xab\xea\xd6\x7f\x1b\x08\xea\x6f\x56\x1f\xb9\x3e\xf0\x52\x32\xee\xda\xbf\xc1\xc7\x70\x2a\xb0\x39\xbc\x46\x5c\xf5\x7e\x20\x7f\x10\x93\xfc\x82\x08"}, -{{0x6b,0xce,0x4d,0xfd,0x53,0xbf,0xa5,0x50,0x6f,0x2f,0x55,0x4d,0x2d,0x99,0x4a,0x0d,0xc4,0x0c,0xaf,0xcd,0xec,0x7e,0x1b,0xe0,0x50,0x00,0x6e,0x5c,0x5a,0x4b,0x38,0xa1,},{0xc8,0x90,0x02,0x37,0x28,0xd8,0x39,0x70,0x70,0x29,0x17,0x71,0xe6,0x5e,0x03,0x4d,0x34,0xd4,0xaa,0xe5,0xe2,0x47,0x65,0x3e,0x4f,0xf4,0xc0,0x74,0x59,0x1d,0xa7,0x02,},{0x99,0xae,0x67,0x82,0xff,0x27,0x64,0x6c,0x27,0xf6,0x1e,0x23,0x63,0x6a,0xe1,0x88,0x15,0x21,0xcf,0xa5,0xed,0x25,0x6f,0x70,0xbc,0xe7,0xce,0x00,0xb6,0x82,0x80,0xce,0x8e,0x0c,0x82,0xaa,0x76,0x5a,0xfb,0x8b,0x5a,0x1f,0xf2,0xfe,0x42,0xc5,0x74,0x41,0xe4,0x58,0xe4,0x43,0xdc,0x8b,0x12,0x34,0x77,0xae,0x33,0xd8,0x84,0x88,0x8c,0x0b,},"\x32\x39\x19\x07\x47\xee\x33\xd4\x0b\xf8\x70\xac\x9a\xd4\x9d\x88\xee\x32\x0f\x63\xc0\x52\x57\xe8\xab\x2c\x60\x30\x65\x97\xce\x76\xd1\xf1\xe7\x92\xab\x6a\x65\xca\xa5\x44\xfb\xec\x20\x89\x2f\xd4\x96\x05\x94\xf3\x1b\x37\x63\xef\x07\xd4\x98\x2e\xae\x4a\x2d\xbf\x33\x77\xdc\xc1\xe3\xf9\x5e\x46\xed\x39\xb7\xf0\x22\x2f\x04\xbb\x5c\x3b\x43\x4c\x8f\x9f\x31\x0d\xe9\xf1\x22\xa2\x9f\x82\x41\xe8\x1e\x20\x65\x49\xae\x62\x8d\x2b\x8a\xd7\x68\x97\x2c\x98\x84\x7c\x11\x88\xad\x04\xc8\x35\x35\x63\x78\xbe\xf7\x9c\xd1\x26\x86\x94\x05\xb1\x29\xfd\xbd\xc3\xbc\x48\x9c\xbd\x13\x99\x50\x5d\xad\xef\x76\x17\xb5\xbe\x5d\xa1\x73\xd3\xe8\x0e\x58\x38\xc9\x9e\x34\x92\x76\x24\x27\x29\xe0\x21\x9b\xd7\x47\x6a\xe5\xc4\xf8\x1a\x12\x87\x8f\xb4\x83\xa6\xc0\xe9\xb0\xdf\x29\x62\xeb\x0b\xf0\x01\x57\x78\x2c\xf7\x68\xa1\xb7\x1c\x01\x01\x69\xee\x85\x22\xde\xf0\x02\x4a\xd7\xe4\x57\x75\xa2\x90\x63\x9c\x53\xaa\xf4\x81\x98\xc4\x2d\xe7\x5c"}, -{{0x17,0x86,0x1a,0x8d,0x41,0x54,0xac,0xd4,0xfa,0x9c,0x8f,0xc9,0x47,0xc1,0x88,0x6c,0x11,0x29,0x0b,0xe2,0x22,0x87,0x2f,0xf4,0xf8,0xcd,0x25,0x93,0x9e,0x4d,0x13,0x61,},{0x43,0x77,0x3f,0x44,0x49,0x06,0x5e,0xae,0xba,0xf8,0x93,0x7b,0xaf,0x75,0x85,0x60,0xb0,0xc4,0xd2,0xde,0x46,0x97,0x78,0x39,0xb3,0xb8,0x73,0xd5,0xd7,0xd5,0xfd,0x8f,},{0xa5,0xee,0x02,0x4c,0xcd,0xbd,0xd4,0xc2,0x1a,0x24,0x70,0x9e,0xc5,0x3d,0xcc,0xb7,0xee,0x17,0x62,0x6d,0xd0,0x0a,0x09,0x3d,0x08,0x84,0xf5,0xb4,0x5c,0x4c,0x9d,0x16,0x91,0x84,0x01,0x51,0xc3,0x3c,0x8a,0xa0,0x7b,0x69,0xb3,0x4e,0x16,0xf6,0x16,0x47,0xeb,0xe7,0x93,0xae,0x4d,0xaa,0x70,0xcf,0xf4,0x8e,0x6a,0xb4,0x2f,0xfd,0xbc,0x00,},"\x18\x4d\xf5\xea\x32\x15\xeb\xe1\x80\x39\x0b\x0f\xf0\x42\xba\x23\x81\x15\x5a\x03\x8d\xc7\x32\xf7\x6a\x01\xc7\xe7\x0f\x82\xd1\xcc\xc9\xde\x9a\x05\x96\xb3\xfe\xe4\x47\x20\x9c\x99\x26\x84\xf6\x43\xdf\x21\xf4\xcf\x9d\x17\x92\x62\x79\x0e\x86\x23\xe4\x24\x72\xdc\x35\x19\x97\xe6\xda\x18\x9c\x07\xe1\xe8\x88\x2c\x07\xf8\x6c\x63\x37\xec\x01\x13\x91\x2c\xf9\x22\x15\xc8\xde\x19\x82\xb8\xfc\x57\xbf\xab\xc5\x5a\x3e\x87\x36\xf7\x36\x10\x42\x9d\x97\xfe\xb5\x1d\x79\x4f\x50\x5d\x0c\x5a\x0b\x3a\xbd\x48\xef\x7f\x55\xa6\x28\xf9\x0b\x85\x67\xa1\xc1\x5e\xa9\xd1\x90\xd7\xbf\x4e\xc2\xbc\x93\x34\xad\xa6\xcb\x92\x80\x8d\xfc\x20\x64\x83\x6f\xcf\xa4\x6b\x96\xfd\x7a\x5d\x6f\x4b\x05\x4d\xab\x09\xb7\x35\x95\xfe\xb8\x9e\xd0\x05\xb9\xec\x9d\x31\x88\x12\x1d\xe6\x96\x96\xd6\x4e\x7c\x7b\xbd\xfc\x1c\x46\x9f\xaf\x14\x8c\x38\xa7\x78\x59\x70\xaf\xe1\xac\xd0\x6a\x92\xc9\x94\x78\xfe\x44\x97\x4e\x3b\xb2\x09\x5e\x44\x67\xe9\xb2\xe9\x96"}, -{{0x0a,0x84,0xba,0xa5,0x4f,0x11,0xcf,0x17,0x09,0x0f,0xec,0x61,0xf3,0xf9,0x40,0x15,0x08,0xa3,0xa0,0x38,0x87,0xac,0xa1,0xa7,0x93,0x93,0x94,0xb1,0xee,0x40,0xa9,0x25,},{0x30,0x9a,0x73,0xc6,0x2d,0x23,0xd7,0x40,0xf2,0xe9,0x3c,0x18,0x58,0x7a,0xc1,0x5e,0x7e,0xc4,0x80,0xd2,0x5a,0xc0,0x79,0x4e,0x10,0xf8,0xcd,0x46,0x1c,0xc2,0xb1,0x30,},{0x4d,0x87,0x0b,0xd5,0x3a,0xf8,0xf1,0x3f,0x21,0x4d,0x99,0x34,0xec,0x90,0x3a,0xc4,0x82,0x84,0x09,0x2c,0xd9,0xb1,0x62,0xa4,0x4c,0xce,0xc8,0x51,0xfa,0x94,0x2d,0xe7,0x15,0xcc,0xda,0x07,0xb7,0x99,0x1d,0x71,0x27,0x23,0xe7,0xa4,0xd5,0xb4,0xf0,0x37,0x4a,0xb8,0x5a,0xc3,0x86,0x7e,0x0b,0x53,0xeb,0xc4,0x6b,0x53,0x0f,0x9f,0xed,0x05,},"\xfe\x70\x01\x7b\x14\x67\x8b\x0d\x3a\xd0\x3e\x18\x3d\x6f\x53\x31\x43\x78\x37\x9a\xb3\xda\x65\xb3\x51\x12\x57\xb3\xd5\x40\x86\xe8\x6f\x20\x31\x13\x90\x21\x39\x1a\xf9\xd7\x20\x85\xff\x7c\x3d\xc8\xc1\xe2\xd9\x1e\x53\x33\x38\x55\x42\x3d\x0f\x78\x5e\x2c\xc5\xf8\xb7\x79\x9f\xcf\x1b\x70\xe6\xbe\xcb\x78\x8e\x53\xe9\x02\x0f\x29\x95\xdd\xb0\xc3\x83\xa1\xf8\x10\x38\xfc\x3d\x54\x3c\xe0\xa3\x8c\x9c\x28\x8a\x9b\xc4\x07\x7f\x42\x77\xdc\xc6\xc5\x64\x22\x63\xfc\xfe\x19\x68\x80\x05\xa6\x03\xf5\x76\x75\xd2\x43\x4f\x3e\xd1\xf4\x6d\x32\xf1\x4e\xae\xb0\x73\xe8\x3e\xe7\x08\x6d\xa2\xfb\x67\x65\x9d\x3f\xb6\x8c\x62\x32\x0b\x77\x27\xb3\xb8\xea\x00\x65\x76\xbc\x2c\x7e\x6b\x5f\x1e\xce\xfa\x8b\x92\xe7\x0c\x92\xc8\x89\x51\xd0\xc1\x2d\x91\xde\x80\x1c\x38\xb7\xca\x5a\x0a\x04\xb4\xc3\x42\x9a\xba\x86\x38\x6e\x96\xe0\x6a\xfd\x20\xd4\xc5\xc2\xfe\x2b\x9b\x42\x73\xeb\x05\x20\x1a\x79\x27\x3a\xbd\xbe\xb3\x7e\xd1\x83\x0d\x22\x6b\x6b\xdb"}, -{{0x38,0x37,0x94,0x23,0xda,0xfd,0xbf,0x25,0xe1,0x9d,0x72,0x31,0xbd,0xdd,0x80,0xb4,0xce,0xfc,0xfe,0x2a,0xed,0x93,0x25,0x84,0xdf,0xa0,0xcc,0x3c,0x9f,0x92,0x32,0xde,},{0x59,0x7e,0x81,0xdc,0xee,0x94,0x48,0xb7,0x7d,0xe6,0x82,0x9e,0x79,0x21,0xc8,0xa3,0x90,0x53,0x5d,0x89,0xa0,0x84,0x94,0x30,0xae,0xd6,0x63,0x64,0xee,0x14,0x0d,0x8b,},{0xd8,0xb5,0x0a,0x88,0xae,0xd6,0xf2,0xa9,0x6d,0x08,0x22,0x13,0xad,0xf8,0xb2,0x51,0x9f,0x6a,0x0b,0xbd,0x30,0xdd,0x3c,0xb0,0xf3,0xfd,0x3c,0xe1,0xc6,0x43,0xfc,0x02,0x99,0x46,0xcd,0x43,0x46,0x2e,0xd2,0x25,0x13,0xf1,0xd6,0x5f,0xca,0x24,0xbd,0xe3,0x81,0x81,0x66,0xba,0xa8,0x6d,0xaa,0x79,0x87,0x92,0xaf,0xaf,0xe0,0xc1,0xa1,0x0a,},"\x36\x12\x5c\xa6\x66\x68\x80\x29\x06\x23\x7e\x63\xa2\xfe\x5a\xe6\x10\xf1\x1a\x7c\xf9\x25\x20\xd1\x9e\x66\x90\xa3\xad\xfa\xfd\x5d\x07\xa7\x84\xbc\x1a\x0e\x18\x52\x73\xd1\x1d\x34\x0d\x5e\xff\x90\x15\x97\xde\xdf\x45\x0c\x46\x99\xd4\x3f\x3f\xb1\x68\xd5\x57\xf6\xc9\xc0\x30\x77\xc3\xcd\xc3\x70\xd3\x48\x32\xcc\xdf\x2a\x8e\x3d\x75\x79\x64\x90\xed\x02\x42\x89\x9d\x25\xdd\xf4\x4b\xfc\x66\xf3\x29\xcf\x4c\x45\x16\x87\x03\xc3\x1b\xc9\x20\x2d\x89\x0f\x39\x69\xff\xd3\xac\x35\xa1\x28\x18\xdc\xa7\x51\xce\xb8\x80\x8f\xe8\x1e\xfa\x26\xa5\xe0\xd2\x00\xc5\xec\x1d\x94\xa5\x09\x7e\xa7\x4b\x64\x98\xfe\x28\x8f\x30\xc4\x8d\x72\x7e\x9d\x3d\x35\xc8\xe1\x2d\x85\x42\x07\x02\x55\x6f\x28\x61\x48\x4f\xfd\x09\xb4\xf1\x22\x65\xcc\x9a\xba\xfe\xb8\x2c\xf5\x90\x02\x88\x95\xa7\xd0\x50\xff\x57\xcc\xf5\xf2\x80\x22\xd0\x16\xab\x40\x94\xb0\x62\xe4\x8b\x66\xfd\x36\xd1\xe1\x96\x26\xe5\x21\x5e\xfa\x40\xfb\x7e\x3b\x70\x62\xf8\x1e\x95\x48\x30\xc9"}, -{{0xf9,0x25,0xd2,0x74,0xaa,0xf1,0xfe,0x1a,0x21,0x65,0x62,0x37,0x38,0x5e,0x97,0xf7,0x78,0x3e,0x78,0x09,0x0c,0x5d,0x42,0x17,0xfe,0xce,0x70,0x57,0xc8,0x0f,0x42,0x6d,},{0x3b,0x0f,0xc3,0x70,0xbe,0x3a,0x4b,0x19,0xa8,0x8a,0xb9,0x98,0xc5,0x95,0x04,0xff,0xb5,0x9a,0x87,0x60,0x63,0x38,0xe6,0x73,0xdf,0x5b,0x3f,0xab,0x4d,0x9b,0xfb,0x8d,},{0x79,0x54,0x9a,0x31,0x7d,0x10,0xa0,0xbe,0x32,0x2a,0x94,0xa1,0x51,0xad,0x11,0xe7,0x7e,0xfc,0x48,0x36,0xcc,0x80,0x06,0xa8,0x50,0x81,0x27,0x3d,0x76,0x02,0xa6,0x38,0x96,0x3a,0x9c,0xaf,0x19,0xc3,0xed,0xf1,0xe2,0x5f,0xad,0x1e,0x9d,0x68,0x70,0x1a,0x71,0xde,0xa7,0x27,0xda,0x6a,0x5c,0x5b,0xca,0xc9,0x33,0x95,0x89,0x22,0x4b,0x05,},"\x14\x3c\xaa\xfa\x5f\x62\xb1\x3e\x43\xdf\xfa\x49\xd4\x20\xfa\x99\xf7\x71\xb1\x92\x6d\x40\xd6\xcb\x2b\xbb\x42\x7f\x27\xb6\xc2\x66\xeb\x3d\xeb\x2d\x8b\xbb\xd4\x7b\x82\x14\xad\x40\x25\x1c\xb1\x90\x7a\xd6\x5e\xb9\x41\x93\xe5\x4a\xd8\x5c\x67\x00\xb4\x18\x9e\x80\xf1\xcc\x01\x54\xc6\x3e\xd1\x51\xa8\xbb\xbd\x30\xe0\x16\x37\xca\x58\xe7\x0a\xa3\xee\x52\xef\x75\xd0\x87\x30\x78\xa4\x05\x01\x4f\x78\x6e\xb2\xd7\x7b\x7f\x44\x22\xf9\x27\x82\x3e\x47\x5e\x05\xb2\x42\x45\xf9\x06\x8a\x67\xf1\x4f\x4f\x3c\xfb\x1e\xb3\x0b\xfe\xde\x7b\x32\x62\x23\x0c\xed\x9e\x31\x36\x1d\xb1\x96\x36\xb2\xc1\x2f\xdf\x1b\x9c\x14\x51\x0a\xcd\x5b\xc1\x8c\x0d\xdf\x76\x35\xe0\x03\x50\x3e\x6f\x71\xe1\xc3\x65\xcd\xfb\x4c\x65\xee\x75\xb4\xde\x06\x94\xaf\x87\x07\x63\x74\xd6\x31\xe6\xc4\xb8\xe2\x40\xfa\x51\xda\xb5\xe1\xf8\x0c\xa2\xa0\x6c\x49\xf4\x2e\xa0\x9e\x04\x75\xde\xfb\x18\x4d\x9c\xde\x9f\x58\xf9\x59\xe6\x40\x92\xaa\xc8\xf2\x02\x7e\x46\x81\x26\xf2\xfb"}, -{{0x97,0x1f,0x80,0x6b,0xe6,0xf0,0x7d,0x41,0xbe,0x88,0x30,0xff,0x8d,0xae,0x70,0x4b,0x08,0x63,0x8a,0xd6,0xcf,0xf7,0x22,0xd8,0x43,0x25,0x38,0x12,0x7b,0x76,0x96,0x25,},{0xaf,0x6a,0xc9,0x8d,0xce,0x20,0x78,0xa6,0xc7,0x3f,0x60,0x97,0xba,0xb6,0x3f,0x20,0x5c,0xaf,0x69,0x53,0xaf,0xa2,0x84,0xd0,0x42,0xbd,0x50,0xa4,0xfc,0xe9,0x6c,0xb4,},{0x20,0x37,0xa0,0xa7,0x67,0x4b,0x84,0xff,0x27,0xd0,0xb2,0x2f,0x62,0xb4,0xba,0xc6,0x5e,0x2d,0xc0,0xf5,0xfd,0xc8,0x99,0xfe,0xb7,0x80,0x0f,0x25,0xc2,0x99,0x81,0xde,0xe6,0x41,0xc5,0xa5,0x0f,0x8b,0x94,0x10,0x97,0x0b,0x49,0xd2,0xd5,0x36,0x58,0xc8,0x9e,0xe1,0x69,0x61,0xdc,0xcf,0x53,0x91,0xa6,0x91,0x8f,0x2a,0x84,0xea,0xda,0x0b,},"\x01\x34\x55\xd0\x49\xaa\x54\xed\x99\x5f\xbd\x94\xe6\x36\x99\x55\x49\x53\x95\xe4\x43\x88\x22\x25\x9b\x10\x60\xe9\xa3\x47\x79\x04\x2a\x1a\x69\x21\x1f\x6e\xa2\x07\x73\x99\xdd\x23\x48\x06\xba\x0b\x35\x3c\xd7\x9a\x57\xe1\xc4\x9b\x25\x0a\xb2\x71\x06\xdc\xde\x57\x6e\xcf\xa1\x15\xea\xe4\x61\xfe\xbb\x12\xd2\xda\x25\xff\xcf\x17\xb7\x15\xf8\xd9\x5c\x2f\x0c\x42\x5d\x5a\x81\xf7\x00\x11\x5b\x70\xd4\x9e\x1c\xfe\x49\xfc\xaa\x14\xfa\x20\x5e\x28\xec\x85\x24\x7f\x1a\x6e\x71\x28\xbf\x3b\xb3\x06\x0d\xc0\x84\x64\xbd\xa6\x53\x85\x40\xd0\xac\x47\x20\x93\xe5\xa0\x72\x0f\xde\x2f\x3d\xc4\x78\x8e\x0e\x9b\x0d\xbf\xe2\xa2\xb5\xf1\xa0\xf3\xf8\x0d\xe9\x84\x02\x5b\x15\xc6\x5a\xf7\x7f\x67\x1e\x1c\x5e\x28\x40\x44\x4d\xe5\xc7\xed\xa0\x25\xe6\xdc\x1a\x3f\xf1\x6e\x26\xcc\x54\xcd\xee\xd5\x6b\xe7\x3f\x9b\x01\xab\x2b\x1b\xc1\x6c\x8e\xf5\x8a\x5b\x76\xdd\x47\x28\x78\x07\xe5\xc5\x0f\x0d\x7c\x0a\x5b\x81\x20\xdf\xde\x64\x5a\x01\x2c\x5c\xf1\x14\x91\xbc"}, -{{0x2b,0xb0,0x65,0x2f,0x8f,0xff,0x69,0x01,0x99,0x11,0x48,0xc6,0x8a,0x32,0x67,0x87,0x72,0x71,0x00,0x6a,0xe9,0x58,0x91,0x49,0xbb,0x20,0x68,0x50,0xcd,0xf5,0x2f,0xb0,},{0xc0,0x3b,0x77,0xbe,0x98,0x3e,0x74,0xa2,0x34,0xc1,0x98,0x64,0x96,0xb2,0x92,0xe1,0x39,0x99,0x2e,0xb7,0x52,0x9e,0x70,0xb3,0xaf,0xad,0x7a,0xe4,0xfd,0xcf,0x8a,0x66,},{0x4e,0x15,0x8d,0xea,0xae,0xc3,0xd8,0x89,0x41,0x29,0x6a,0xf2,0xd2,0x73,0x41,0x01,0x2b,0x02,0x41,0xd4,0xe0,0xf4,0x6e,0x43,0x5e,0x37,0x5c,0x98,0x75,0xe8,0x9f,0x5e,0x32,0xc0,0x57,0xb5,0x27,0xbc,0x34,0x11,0xaf,0x09,0x6a,0x77,0xbf,0xce,0xb4,0x5b,0x98,0x3e,0xfe,0x45,0x5e,0x3f,0x03,0x15,0x5d,0x6b,0xc7,0xb0,0xac,0xc8,0xe6,0x0c,},"\xb9\x23\xca\x67\xe3\x96\xd8\x65\x6f\xa3\xdb\xce\x82\x89\xa3\x8b\xd3\xc1\x28\xce\xfb\x30\xef\xc1\x86\x2b\xb9\x44\xb4\x50\x78\x05\x41\x98\x24\xce\x2b\x83\xd6\x90\xef\x4c\xf1\x07\x49\x28\x17\x14\x3b\xf6\x4c\x02\x49\x89\xaf\x1a\x7d\x2e\x1f\x5a\xc9\x78\x74\xf8\x6b\xb0\xd3\x77\x3f\xf8\x40\xf5\x14\xd9\xa1\x39\x4a\x39\x59\xb0\x11\xd3\xa6\xb8\x16\xa3\xfa\xe5\xde\x17\xb2\xa9\xff\x34\x98\x63\xd2\x7f\xbb\xb5\x0c\xca\x73\x41\x08\x75\x10\x00\xd6\x35\x8c\xa0\x64\x7a\x93\xeb\x49\xe2\xe7\xaf\x06\x28\x7d\x48\xf2\xc0\x9d\x5c\x1c\x73\xe4\xd8\xf7\x7e\xa2\xbc\xaa\x73\x56\x79\x5b\x26\x72\x87\x19\xbe\xd5\xff\xdb\x82\x15\x78\xbd\x5d\x66\xbf\x92\xed\xaf\x8b\x23\x8b\x2b\xbd\x7d\x1e\x2c\x30\xa7\x87\xf9\x01\xa3\x3d\x0a\x76\x66\x9a\x9c\x3c\x7f\x2b\x55\x2c\xcb\x83\x49\xc7\xde\xd5\xe1\xa4\x61\x70\xcf\x28\xe3\x59\xe2\xfd\xd5\x4b\x05\xa5\x62\xf5\x28\xc6\x8a\x56\x97\x4d\xf8\x2d\x46\x66\x37\xc8\xe5\x32\x46\xa7\x21\x7e\x43\x86\x80\x1e\x0e\x32\x66"}, -{{0xdb,0x9b,0x81,0x2c,0xb3,0xc7,0xc0,0x3b,0x97,0x7f,0x48,0x7d,0x3d,0x65,0xcc,0xd9,0xcd,0x2f,0x3d,0xee,0x11,0x60,0x20,0x67,0xdb,0xfb,0x72,0xb5,0x89,0xff,0x3f,0x79,},{0xff,0xa0,0x38,0xad,0x8c,0x3b,0x37,0x8c,0xe7,0x5d,0x65,0x84,0x4d,0x08,0xe3,0xd6,0xa9,0x2d,0x19,0x4a,0x1b,0x78,0x62,0xe9,0xd9,0x72,0x0d,0x20,0x67,0x9b,0x29,0x44,},{0xa6,0x28,0xa7,0x74,0x21,0xb2,0xab,0xab,0x57,0x6e,0xed,0x35,0xd2,0xee,0x3d,0x14,0x56,0x1b,0x21,0xfa,0x14,0xa6,0xe2,0xfa,0xc2,0x63,0xc3,0xea,0xdd,0x79,0xf2,0xfc,0x06,0x69,0xf9,0x42,0x9b,0x91,0x0b,0x84,0x22,0xb4,0xb2,0x9a,0xc0,0x26,0xa4,0x2e,0x98,0xd1,0x81,0xbe,0x35,0x07,0xc5,0xed,0x7c,0x74,0x8a,0x1f,0xdc,0xf1,0xd8,0x07,},"\xa7\x00\x92\xc7\x69\x7c\xd4\xa2\x09\x56\x7c\x38\xba\x7f\xb7\x1a\xa8\xf1\x5e\x58\x27\xa2\x08\x76\x92\x39\x43\xfd\x6a\xdc\x65\x9c\x98\x67\xac\x6f\x58\xa6\x1d\xc7\xce\xc3\xd3\x62\x41\x16\x82\x00\x0c\x1a\x9a\xd1\x29\x5e\xb8\xb7\x0f\x24\x2d\x86\xb5\x86\x5e\xb7\x6b\x87\xe3\xf2\xc6\x94\x1d\x26\x12\xee\x3b\xcd\xe8\xf1\x97\x65\x56\x67\x33\x15\x2e\xf5\x4e\x95\x69\x09\x43\x28\x5f\x78\xb3\x75\xf4\x03\x65\x85\xd4\x73\x9d\xee\xde\xef\x6d\x94\x6d\xb6\x1c\xa4\x58\xef\x4f\x65\x0d\xa9\x63\xc3\x85\xe2\x9d\xfd\xee\x41\x5f\xe4\x95\x84\x5f\x55\x19\x7a\x87\x0f\x8c\xde\xb5\xa0\x10\xba\x6b\xbb\x32\xbf\x1a\x58\x8c\xc7\x74\xd4\x89\x01\x84\xc4\xb2\x92\x4a\x5b\x80\x73\x31\x3b\xce\x22\x65\x85\xf1\xad\xfc\x22\x9c\x90\xbc\x6c\xc9\xd2\x12\xe6\x2f\x05\xd3\x3b\xed\xac\x96\x1d\x77\xcf\x8c\x26\x20\xe4\x51\xde\x81\x7f\x8c\x1b\xb1\x6a\x2c\x59\xff\x80\x4b\x63\x5a\x73\xa8\xcf\x8c\x18\x1b\x3f\x94\x01\xc3\xb6\x43\xd1\x8a\x2f\x70\x6e\xa9\xca\xe4\x70\x71\xa6"}, -{{0xce,0x37,0x9b,0xbe,0x2f,0xa8,0xab,0xcb,0xa5,0x1c,0x7a,0x75,0x43,0xde,0x5b,0x71,0x80,0x77,0x1b,0x3c,0x44,0xbc,0x6b,0x41,0x89,0x2e,0x7b,0x88,0x97,0x9b,0xab,0x90,},{0x7f,0x3c,0xff,0x89,0xf4,0x1b,0xab,0xf4,0xfa,0x64,0xcb,0xa3,0x3a,0x5b,0xb1,0x7f,0x41,0x3b,0xbf,0x2a,0x1e,0x11,0x2b,0x50,0xa8,0xe9,0xb1,0xf8,0x21,0xd8,0x49,0xbf,},{0xda,0x98,0xdf,0xb1,0x89,0x38,0x5b,0x2c,0x85,0x3b,0x6c,0xf3,0x75,0x73,0x80,0x46,0xa8,0xf2,0x7e,0xf2,0x79,0x74,0xab,0xce,0xce,0xa1,0xdb,0x02,0x98,0x9b,0x95,0x1f,0xe4,0x33,0xa6,0xce,0x1e,0x22,0x5b,0x3f,0xa8,0x20,0x32,0xfe,0x06,0x0a,0x7d,0x3f,0x6c,0x18,0x3f,0xd1,0x15,0x7f,0x79,0x1a,0x06,0x4b,0x40,0x76,0x50,0x57,0x16,0x00,},"\x00\x1a\x74\xf0\x95\xc8\x14\xd3\xbe\xed\x67\xa8\xd1\x5f\xc1\x8e\xfe\x23\x5d\xc3\xf6\x45\x78\x12\xa4\x03\x9b\x7a\x46\xfe\x9a\x0e\x9d\xe8\x1a\x7a\x4e\x5f\xba\xb5\xeb\xe9\xe1\xe4\x80\x1b\xd1\x1b\x45\xc9\xf7\xad\x06\x36\xa0\x9b\xff\x42\x16\x4b\xe5\x74\x9a\x04\xc0\x2f\x0a\xb6\x1f\x0e\xcf\xdf\xef\x79\x9b\x82\x7d\xa6\xa2\x74\xc8\xd3\xb3\x9f\x2e\x38\x05\xa6\x79\x12\x87\xee\xdb\x23\x14\xd3\xf8\x42\xb5\x58\xb9\xb4\x89\xaf\xe1\xed\x37\xbb\xbc\xfc\x5e\x60\xa4\x31\xd5\xac\x60\xb3\x9e\x94\x6d\x90\x3d\x6b\xf6\xb1\x40\xe1\x2c\x7e\x07\xf9\xed\x7a\xc4\x6a\x39\x99\xc6\x24\x5c\x8a\xb1\xbd\xb2\x18\x79\xa3\x17\xa3\xdc\xd2\x57\xa5\xc4\xf3\x49\xb7\xf5\x9e\x4e\x43\xd6\x2d\x9f\x1c\xd1\x6f\x51\x8f\x1c\xa6\xca\xd3\x7e\x2c\xb2\x0f\x25\x98\xc4\x13\x42\x91\xc6\xb8\xa9\x8a\xae\x52\x47\xe2\x6e\xef\xb7\x6a\xa3\x8c\x9c\x82\x31\xc1\x7e\x9d\xbf\x27\x1c\xec\x80\xfb\xa5\xb4\xa8\x34\xbd\x9b\xe8\x1e\xa8\x41\x63\x7a\xa9\xcd\xd4\xc4\xbf\x26\xd7\xad\x24\xca\x3c"}, -{{0x2b,0x2e,0xe8,0x09,0xd6,0x47,0x02,0x3e,0x7b,0x77,0xfc,0x54,0x1f,0x44,0x87,0x5a,0x35,0xfa,0x94,0x1d,0x37,0xf7,0xc5,0xb2,0x1f,0xd3,0x49,0x34,0xd2,0x39,0x19,0x35,},{0x2c,0x29,0xd5,0x3e,0x1b,0xf2,0xc7,0x87,0x9d,0x73,0xd2,0x0b,0xa8,0x8c,0xa0,0x7a,0x0b,0x21,0x6d,0x7f,0x6d,0x05,0xd9,0x36,0x63,0xa6,0x5c,0x3d,0x9e,0x10,0x63,0x3a,},{0x12,0xd9,0x06,0x85,0x77,0x55,0x72,0xc9,0xea,0xbc,0x9b,0xe2,0x57,0x4c,0xa9,0xae,0x66,0xf0,0xe6,0x52,0xe5,0x78,0xb2,0x17,0x36,0xcd,0x6e,0x65,0x4f,0x7c,0x6b,0x15,0x45,0x88,0x3d,0x56,0xbf,0x76,0x0c,0xcf,0xc3,0xcf,0x87,0x54,0x4e,0x00,0x04,0xc7,0x98,0x06,0x12,0x57,0xe1,0x30,0x03,0x0c,0xb9,0x97,0xa7,0x88,0x36,0x9a,0x9a,0x05,},"\xc4\x14\x7d\x64\xeb\xfd\xa4\x1a\x1b\xe5\x97\x72\x62\x95\x81\x04\xe9\x40\xc3\x87\x6b\xcd\x5b\x69\x56\xac\xfd\xec\x32\xc6\x60\x91\x4d\x62\x62\x3c\x21\x06\x63\xcb\x2c\xbe\x62\x49\xd7\xf5\x27\x49\x91\xc6\x0e\x95\x0e\x8e\x28\x09\x04\x99\x53\xc6\x95\x81\xd2\x46\x9f\x4f\xe9\x82\xc7\x43\x4f\xed\xd9\xd4\xe0\x0a\xe0\x88\x96\xd6\x2c\xc1\xfb\x98\x4d\xd2\x33\x15\x0c\xc2\x48\x3e\x15\x9c\xff\x40\x97\xdf\x8c\x03\x6b\xb6\x33\x00\x3a\xbb\xfb\xe1\x8c\x8f\xa7\x9b\x5a\x22\x27\x08\x38\x12\x3f\xc9\xbe\x39\xb8\x89\x2c\x80\x38\x4a\x38\x50\x28\xc1\xa8\x1e\xc5\x8c\x8f\x21\x06\x0e\x78\xaf\xd2\xc0\x4b\xfd\x2d\x30\xca\x39\x77\xc6\xed\xad\x51\x8c\xc1\xe2\x00\x4c\xdc\x14\xbf\x3d\x15\xf5\xf5\x28\xe5\xaf\x27\x7f\xa1\x82\x27\x58\x70\xe5\xc0\x12\xf5\xf8\x2f\xb1\xaf\xd0\x4e\xdd\xe4\x57\x8d\xdd\x21\x60\xa1\xa3\xdb\xc0\x50\xe8\x0b\xdd\x81\x1b\xc8\x8e\xad\x79\xbf\x93\xf0\x10\xcd\x0f\xd4\x43\x3d\x0b\xc3\x48\xda\xcf\xd0\x94\x7c\xce\xda\x62\xbf\xa4\x97\x11\xd0\x13"}, -{{0x4e,0xa1,0x8d,0x6b,0x4a,0xf8,0x05,0x3b,0x88,0x5e,0xc1,0x88,0xbe,0x48,0xde,0xb8,0x6f,0xfb,0x2a,0x69,0xa4,0xce,0xc8,0x66,0x37,0xbb,0xd7,0xb4,0x1b,0x80,0x7c,0x46,},{0xe5,0x98,0x60,0x59,0x97,0x62,0x33,0xed,0x77,0x38,0x2c,0x3d,0x99,0x59,0xf3,0x4e,0x31,0x79,0x62,0x69,0x65,0x53,0xe8,0x6e,0xd1,0xe5,0x90,0x2c,0x4b,0xed,0xd1,0x67,},{0x27,0x57,0x0c,0x00,0x2a,0x48,0x7d,0x00,0x0c,0xa3,0x92,0x8b,0x83,0xcb,0x43,0x19,0x72,0x2c,0x46,0xdf,0xb4,0xcc,0xa2,0x60,0xde,0x79,0x0e,0xc0,0xe3,0xc1,0x93,0x26,0x88,0xf8,0x73,0x62,0x95,0x28,0x18,0xb5,0x4f,0x51,0xbc,0x7a,0xee,0xb2,0x63,0xf9,0x60,0xbc,0x0d,0xa8,0x96,0x4b,0xf3,0x12,0xef,0x93,0xe8,0x1f,0x06,0xc8,0x0b,0x04,},"\xe9\xc8\x9a\x1a\x11\x19\x37\x32\x06\xce\x40\xed\xe3\xb8\x9a\x82\xf8\x94\x62\xa1\xde\xe9\xe7\x89\xe9\x84\x5e\xec\x21\xf5\x71\xc0\xfa\xef\xd4\x30\xad\x33\x8e\x4a\x72\xc0\x47\xa3\x9a\x42\x59\x58\x03\x87\xfb\x9a\xac\xad\xdc\x36\xa2\xb5\x1e\x7b\x60\xa8\x7c\xa1\x32\x1f\xf8\x06\x79\x4c\xd6\xdd\x45\x49\xa4\xdf\x45\xc2\xda\xe3\xe5\x39\xc4\xd7\xd0\x6b\x6e\x6e\x9f\x46\x6f\xfc\xa2\xfa\x49\x78\xce\x3d\xc7\x92\xe4\x4a\x62\x83\x88\x0c\xd1\x38\xa7\x5a\x22\x6f\x98\x5d\xa4\x1f\xfd\xc0\xe3\x2a\x5a\x85\xc8\x5f\xe9\xa4\x3a\xe7\x8f\xcf\xe5\x7f\x4d\xd7\x54\x0a\x6d\xd3\x92\x4a\x49\xab\x39\xeb\x69\x95\x0d\x42\x11\x51\xd9\x6b\x1e\x4f\xd3\x93\x58\x90\xf6\x34\xcd\x52\xa7\x3a\x75\x5f\x5c\x2f\xb7\x2f\x9c\xd5\xa2\xe6\x7e\xa9\x30\x91\x5e\x13\x3b\x47\xcf\x6b\x7c\x10\xa9\xd8\x89\xc6\xaf\x6b\x5f\x1f\x4f\x51\x09\x4d\x27\xfb\xba\x22\x8a\xc2\x26\x8b\x34\x40\x27\xfd\x49\xe4\x26\x34\x3c\xc0\x13\x43\x99\xb4\xb5\x10\xaa\xea\x50\x23\x4d\xf4\x2c\x37\xfa\x1c\x4f\x4d\x0e"}, -{{0xfc,0x1b,0x75,0xd1,0x7d,0x38,0x07,0x21,0x73,0x51,0xd2,0xaa,0x40,0xd9,0xb0,0x4f,0x52,0x5b,0x89,0xed,0x3f,0x5f,0xcd,0xb3,0x11,0xbe,0xc2,0xae,0xc5,0xcb,0x7e,0xce,},{0x55,0xe4,0x84,0xe7,0x74,0xa4,0x39,0x2a,0x9d,0x6e,0xef,0xf8,0x35,0xa8,0xfb,0xb2,0x32,0xcf,0x62,0x76,0xa8,0x9c,0x74,0xfc,0x0d,0x1b,0xb2,0x04,0x5a,0x8b,0x21,0xbe,},{0x9a,0x68,0xd1,0x51,0xfe,0xa3,0x90,0x98,0x93,0x35,0x9e,0x60,0xb9,0x6b,0x68,0xb2,0xa3,0xe2,0x94,0x6f,0x2b,0x47,0xb8,0x75,0x39,0x8a,0x1e,0x39,0xeb,0x01,0x46,0x3d,0x35,0xea,0xe7,0xd9,0x76,0xf8,0x33,0xa7,0x62,0xb5,0x1f,0x27,0x26,0xee,0x0d,0xcc,0xad,0x5c,0xe3,0x60,0x05,0x64,0xfd,0x9d,0xd5,0x8c,0x23,0x80,0x7f,0xdf,0xfd,0x05,},"\xd0\x31\xbd\x11\xda\x30\x80\x97\xe3\xbe\xb6\xff\xdb\x26\x00\xee\x6a\x19\x3c\xa6\xd8\x32\x45\x01\xc9\x72\xb1\xa2\x51\x66\xfa\x7a\x36\x9f\x5b\xc8\x82\xea\x45\x61\x2c\xf0\x25\x80\x25\x4d\x21\xb4\x0b\x03\x63\x23\x7e\x83\x5d\xae\x26\x56\xc1\xb7\xf4\x73\x6e\x88\xbe\x53\xd6\xb1\x19\xc0\x7f\x57\x29\xbb\xd8\x2f\x67\xde\x03\x58\x83\x22\x87\x92\x43\xc5\x99\x0a\x7e\x61\xf5\x69\x07\xb2\x41\x71\xa5\x7c\xbb\x0b\xbe\xfb\xa2\x31\x62\x77\xaf\x93\x26\xf9\xcb\xf3\x53\x8b\xcb\xf6\x78\x0b\xe4\x18\x25\xa2\xca\x77\x4b\x41\xbd\xb1\xcd\x5c\x60\x88\x51\xec\x23\x39\xeb\x2f\x4f\xee\xdd\xaa\x89\x1a\x63\x26\xb2\x9d\x97\xd7\xfb\xf3\x11\xe3\xbb\x74\x9c\x5d\x4c\x05\x8d\xcc\x14\xf4\x52\xf9\x33\x49\x91\xe2\x71\xc1\x6d\x65\x08\xc8\x18\x63\x39\x27\xf4\x29\x80\x4c\xa7\xa3\x81\x70\xf1\xb9\xf6\xbd\x73\xed\x67\x5e\x11\xe8\xc0\xd3\x21\xfa\xc9\x12\x73\x0b\x4b\xa2\xf7\xc4\x28\x53\x4a\xdc\xaa\x4d\xad\x31\x4c\x55\x80\x7e\x6c\x64\x2d\x49\x4c\x6b\x2f\x0e\x8c\xd1\x29\x77\x5c\xc0"}, -{{0x0d,0x0b,0xf4,0xd4,0x2e,0xf8,0x10,0xb1,0x79,0xeb,0x84,0x17,0x71,0xde,0x6d,0xbd,0xe7,0x63,0x61,0xca,0xf8,0x94,0xe4,0x2a,0x14,0xb1,0xe0,0x97,0x87,0xea,0x3e,0x06,},{0x71,0x71,0x51,0x0b,0x43,0xfc,0x17,0xef,0xa8,0x0b,0x15,0xe3,0x20,0xb1,0xb0,0xa4,0x08,0x33,0x25,0x42,0xe0,0xd3,0x6e,0x4a,0xb9,0xa6,0x49,0xcd,0x94,0x1b,0x5a,0xed,},{0x24,0x44,0x6b,0xdf,0x03,0x41,0x6a,0x4d,0x08,0x61,0x44,0x66,0xfb,0x85,0x1d,0xb5,0x0e,0x91,0xa6,0x23,0xca,0xcd,0x1b,0x0b,0x35,0x66,0x0f,0x3c,0xf9,0x33,0x20,0x0e,0x15,0x30,0x87,0x08,0xda,0x34,0x99,0xa5,0xad,0x25,0xf0,0xf0,0x30,0x6b,0x79,0x42,0x76,0x2e,0x20,0xa7,0x65,0xb7,0xca,0x9b,0x90,0x1c,0x75,0x0b,0x3a,0x95,0x32,0x0a,},"\x8e\x21\x79\x97\x5d\x0a\x8e\x5a\x69\xfe\x87\x5a\x3c\xb1\xe7\x9a\xec\x49\xc3\x85\x3e\x30\xdd\x03\x20\xfe\x3e\xbf\xb6\x38\xb8\x2f\x89\xad\x16\x43\x03\x6b\x37\xe5\x6e\x0b\x55\xe0\xa9\xe2\x2a\x4e\x28\x3d\x7a\x27\x48\x5c\xe9\x10\x2d\xb6\x78\x7d\x66\x28\xb7\x79\x13\xe1\x08\x96\x77\x4e\x49\x5c\x26\xe8\xba\xb2\x6e\x7f\x9a\x94\xd2\x9a\xaa\x36\xae\xc9\xc2\x6a\xd3\xf5\x0e\x5d\x8c\x0b\x76\x98\xbb\x5f\x01\xb8\x76\xd0\xd6\x5f\xcf\x5e\x9e\x32\xcd\x7b\x89\x82\x9e\xd0\x5b\x0b\x8f\x63\xa9\x38\x58\x98\x5b\xc9\x56\x9f\xce\x42\x9f\xd3\x7a\x21\x1a\xbe\xd6\x50\xf5\x85\xc3\xb5\x59\x00\x44\x3b\x6c\x5d\x6e\x8a\x48\xba\x67\xde\xee\xd0\x7b\x76\xe9\x69\xfc\x88\x43\x0f\xce\x27\x09\xc0\xbb\x5c\xe9\x26\xab\x7f\x44\xe0\xcd\x79\xf4\xec\x35\x9e\xf7\x67\x48\x88\x3f\xcc\x3d\x02\x6e\xdd\x06\xc8\xb9\xcb\xa5\x4b\x99\x0d\x30\xaa\x41\xf1\x44\x8a\x10\x89\x3f\xb0\x53\x92\x80\xc5\x99\xd4\x23\x61\x43\x3a\x34\xcd\xaf\xd8\xeb\xdd\x92\xef\xb9\xc3\x8a\x36\xda\xf4\xc7\x40\x60\xc6\x96"}, -{{0x57,0xb5,0x19,0x4d,0x26,0xab,0xe4,0xab,0x21,0x16,0xc0,0xf0,0x3d,0x23,0xdb,0xe1,0x16,0xd4,0x88,0x25,0xa2,0x5e,0x77,0xd6,0x46,0x48,0xb4,0x36,0x92,0xae,0x25,0xbf,},{0x49,0x9c,0x02,0xdb,0xad,0x2a,0x4e,0xab,0x3b,0x6f,0xf1,0xab,0xa3,0x94,0x4b,0x91,0xc3,0xf2,0x73,0xa3,0x82,0xc5,0x48,0xa6,0xf3,0xa1,0x9c,0x83,0xf0,0xa8,0x67,0x24,},{0x4c,0x73,0x45,0x96,0x0c,0x8f,0xd4,0x8a,0x7d,0xea,0xd7,0x1d,0xbd,0x61,0x90,0x84,0x68,0xef,0xa8,0x65,0xa1,0x35,0x56,0x8c,0x8f,0x9c,0xa0,0x05,0x54,0x83,0x46,0x86,0x17,0xa7,0xe3,0x35,0x84,0x0f,0x57,0xc6,0xcd,0x8f,0x2c,0x98,0x05,0xcd,0x47,0xa9,0xd7,0xcd,0xfd,0xe5,0x3d,0xa8,0xef,0x4f,0x1a,0xdb,0xb6,0xf6,0x98,0xaa,0xf1,0x00,},"\xb4\x81\x3c\x9d\x13\x21\x5f\xe9\xf6\x3a\x78\xff\x7a\xc9\x51\x73\xeb\x81\x0b\x46\x13\xf0\xf4\x8d\x68\x76\xb2\xbd\x3b\x2c\x72\xbc\x7d\x98\xcb\x1a\xc3\x2b\xc4\x1c\xa4\x7f\x09\x89\x6f\x79\x20\x4e\xcf\xb8\x26\x4c\xe8\xf3\xc3\xe7\x6d\xc1\x24\xda\x8d\xdc\x6e\x0d\xfc\x1e\x13\xb5\xa5\x29\xf2\x0c\x82\x61\x3f\xb9\xa8\x2e\x5f\x5d\x77\x32\x6a\x86\x1f\xae\xda\xbc\x73\x25\xc5\x9a\xf3\x3d\xae\x67\x44\x02\x5e\x64\x97\x74\xfc\x4f\x79\x13\x4b\xf9\xf6\xe3\xd5\x87\x5d\xd9\x1b\xc8\xa1\x4c\xc3\x6a\x66\x28\x3d\x01\xd8\xd1\x08\xc1\x33\x27\xec\xa5\x30\x57\xba\x50\xbf\x21\x0c\x19\xf1\x39\xde\x64\x94\x98\x26\x46\x19\x8a\x12\x46\xc2\x71\xb0\xa3\x68\xc1\x0a\xab\x95\xcd\x89\x61\x23\x5d\x74\x2d\xf4\x54\x5b\xe6\x8b\xd0\x10\xdc\x0d\xb2\x3b\x67\x3e\x62\x36\x09\xe4\x20\xee\x76\xb1\x05\x6c\x52\x0f\x9c\xe8\xfb\xe8\xee\x18\x63\xdf\x97\xd1\x7b\x71\x74\x63\x6c\x3a\x2b\x61\x22\x95\x09\x19\x48\x81\x0d\x1d\x4b\x8a\x58\x43\x76\x0a\x28\x87\xdc\x55\xef\x51\x2a\xf0\x41\xec\x54\xfa\xd3"}, -{{0x06,0x8d,0x27,0xb2,0x1e,0x2a,0xcf,0xcc,0x19,0xc3,0xe9,0x67,0x3d,0xd4,0x41,0x42,0xd9,0x8a,0xac,0xae,0x89,0x49,0x30,0xe2,0x0c,0xa0,0x67,0x43,0x9e,0x74,0x9a,0x79,},{0xe2,0x2d,0xdd,0x39,0x6f,0x95,0x5b,0xb9,0x0e,0x28,0x47,0x76,0xaa,0x76,0xe9,0x21,0xe5,0x06,0x99,0xd0,0xca,0x89,0x14,0xa9,0xb7,0xb8,0x41,0xeb,0x5f,0xf4,0x7d,0x6d,},{0x0c,0x17,0x3c,0x48,0x8a,0xd0,0x01,0xcb,0xb9,0xc4,0x3d,0x7b,0x30,0xa7,0xc0,0x71,0xa2,0xfd,0xb0,0x8c,0xf7,0xf3,0x7d,0xaf,0x71,0xd7,0xae,0x71,0x28,0xdc,0x0d,0x43,0xf0,0xf0,0x95,0xb2,0x92,0x9c,0x54,0xb7,0x73,0xed,0x4a,0x1f,0x0b,0xf0,0xdc,0x4f,0x36,0x4f,0x06,0x01,0xe8,0xd5,0xae,0x06,0x2f,0x5b,0x78,0xc0,0x5b,0xfb,0xc7,0x02,},"\x1c\x68\x15\x42\x3d\x1a\x2c\x5e\xbe\x88\x28\xd1\x64\x65\x27\xc1\x7b\x20\x06\xe5\x47\xf0\x16\xb5\x35\x0f\x01\x0d\x79\xb1\x3d\xf4\xfb\x8c\x6e\xd5\x7b\xa9\xc2\x6c\x3c\xb0\xe0\xa6\x41\x78\xb6\x50\xa3\xea\x54\x44\xa4\xfa\xd5\xb2\x0a\x3e\xb8\xca\xa7\x02\x63\x40\x11\xcf\x78\x92\xa0\x72\x7b\x6e\x81\x50\xb0\x77\x04\x29\xa3\x7a\x8a\x0b\xb3\xa7\xed\xb8\x91\xa7\xc9\x02\x40\xbc\x03\x60\xb1\x4e\x6d\xd7\x70\xa9\x90\xb3\x1b\x31\xf3\x3d\xdb\xf6\x53\x98\x8f\x82\x74\x2e\x5e\xec\x31\xb2\x73\x68\xeb\x0e\x4f\x1e\xcf\x4d\x67\x6f\x49\x21\x4a\x52\x0d\x1e\x5b\x2b\xbb\x59\xac\x2e\x13\x26\x7e\x07\xa0\xcb\xac\xbe\xd9\xf9\x4d\x74\x73\xed\x69\x78\x28\xb0\x92\x8f\xcc\x61\x6e\xe0\x2e\x51\xfc\xd8\xdb\x4d\x8f\x75\x33\xb7\xb1\x39\xa0\x5e\x06\xf9\xe0\xea\xe3\x29\x93\xe3\x02\x5a\xef\x05\x90\xb3\xfb\xb4\x29\x2a\x3a\xc4\x07\x65\xe8\x58\x4e\xad\x00\x26\x6a\xcd\xcb\xdd\xe1\x45\x7a\x03\xb7\xd5\x7b\xd5\xc9\xe6\x4f\xb0\x6b\x64\xa5\x0f\x35\xf0\xa1\xec\x34\xb6\xdd\xbd\xe7\x67\xb9\x6f\xfd"}, -{{0xa3,0x4d,0x52,0x56,0x31,0x59,0xe0,0x72,0x3e,0x9f,0x3f,0xd1,0x33,0xbd,0x96,0xe2,0x0a,0xda,0xe6,0x23,0xf8,0xc7,0x98,0x01,0x3b,0xc3,0x6b,0x44,0x14,0x89,0xbd,0xc2,},{0x1f,0xb6,0x58,0xe6,0x45,0xde,0x6d,0x3e,0xfd,0xb0,0x83,0xa7,0x3f,0xbd,0x59,0x2f,0xcd,0x4b,0x80,0x0e,0x03,0xc7,0xbd,0x68,0x1a,0xea,0xe6,0x57,0x6b,0xfb,0xbe,0x2f,},{0x5f,0xab,0x5a,0x71,0x40,0xd4,0x78,0x73,0x68,0x43,0x05,0xaa,0x63,0x53,0xd3,0x86,0x2f,0x5f,0xc1,0x3e,0x54,0xa4,0x0c,0x95,0x63,0xcc,0xea,0xc8,0xf7,0x40,0x08,0xc6,0xc4,0x45,0x63,0x1f,0xa8,0x64,0xe0,0xf1,0xc3,0x45,0xb5,0x95,0x4f,0x80,0x05,0x6a,0xeb,0xa2,0x56,0x62,0xb7,0x88,0x27,0xb5,0xe8,0xe3,0xa9,0x43,0x78,0x13,0x72,0x0f,},"\x1d\x21\x5f\x85\xc0\x89\xf3\x5f\x30\x7a\x74\x6c\x66\xc7\xc1\xe4\x1d\x6b\xa3\x77\x30\xd7\x59\xe6\xe5\x62\x2d\x6c\x6a\x19\x8e\x40\xf6\x3d\x37\x87\x3b\x71\x5d\xf7\x51\x8b\x3c\x6b\xb5\xe9\x5a\x46\x77\x26\xb9\x7c\x9a\x0f\x8f\x5d\xfc\xdb\xfd\x1e\x0d\xe3\x57\x66\x1d\xde\xab\x55\x50\x42\xb9\x45\xfd\x89\x9f\xad\x6d\x38\x2d\x79\x17\xda\x9e\x12\xdf\xbd\xa0\xd6\x99\x00\xb3\x97\x51\x65\xa7\x3d\x0a\xc9\xde\x01\xfd\x30\x48\xb8\xfe\x5f\x0b\x90\xbe\x67\xe0\x3d\xc2\x2f\x65\x3a\x0a\x13\xeb\x4b\x0b\x75\x3f\x3f\x3b\xbf\x78\x73\x69\xeb\xd8\xbf\x5e\x00\xeb\x78\xbf\x0b\x35\x15\xa9\x1e\x68\xb1\xd5\xfc\x69\x20\xbf\x4f\x42\x59\xf8\xa7\x30\xef\xc7\xf1\x01\x6d\x50\x1e\xf6\xfb\x7c\xb8\x36\x6f\xc8\xe7\x16\xcf\xa5\x0e\xa8\xb2\x03\xcc\xa1\xa3\x16\x70\x7e\x0b\x0f\xc5\x7e\xaf\xce\x82\xd6\x2f\x7f\xf3\xae\x04\xac\x8f\xd0\x41\xb5\x5b\x19\xa3\x52\xa6\x9e\x6d\x4b\x79\xd0\xe6\x50\x17\x51\x68\xe3\x4f\xa3\x35\x8e\xac\x81\x6c\xec\xf2\xc8\xdd\x1b\xf2\xa5\x89\x11\x3e\x91\xbb\x81\x8f\x91\xf8"}, -{{0x58,0xdf,0xe7,0x68,0xbf,0x52,0x11,0x84,0x94,0xb2,0x99,0x75,0x15,0x4c,0xf4,0x52,0xbd,0x97,0x46,0xdc,0x7d,0xe1,0xd6,0xbc,0xd1,0x8e,0xe6,0xa0,0x5a,0xcf,0xd8,0x58,},{0x0f,0x14,0x76,0xc6,0xcc,0x2a,0x1b,0x47,0x64,0xaf,0x75,0x80,0x5e,0x77,0x34,0x1f,0x14,0xa0,0xd8,0xb0,0x9c,0x6a,0x5b,0x2e,0xa2,0x87,0xfd,0x51,0x7c,0x3f,0xa6,0xb9,},{0x97,0x71,0x37,0xa3,0x8a,0xf4,0x4f,0x4b,0x26,0x2a,0xbf,0xf7,0xe0,0x72,0x82,0x43,0x3c,0x58,0x92,0x6d,0x56,0x2f,0xbc,0x61,0x80,0xbd,0xe6,0xcd,0x94,0x97,0x86,0x1f,0xb6,0xd9,0x55,0xcf,0x38,0x3d,0x99,0x9f,0xa1,0x03,0x7b,0x8b,0x17,0x54,0xce,0x88,0x8c,0x9f,0xfc,0x15,0x60,0xa4,0x51,0xd0,0xe9,0xdb,0x8d,0x74,0xd2,0x94,0x06,0x04,},"\x60\x97\x94\x20\x1c\x4f\x6f\xaf\x48\x87\x90\xd6\x1d\xbf\xf3\xf4\x1b\x32\x8c\x5b\x06\x95\xcb\xe9\xaa\x8a\x13\x6d\x72\xb4\x97\x7b\x21\xb5\x00\xf2\x16\xe9\xf3\x21\x68\xad\xa8\xc1\x3b\xff\x25\x32\x76\x47\xe3\x0d\x8a\x24\x4d\x74\xd8\x83\x03\xab\xc9\x0b\x7f\x71\xaa\x07\xca\x04\xd1\x7b\xc8\xa0\x16\x7d\x6e\x63\xfb\x88\xba\xa1\xda\xb8\x1d\x50\xf1\xe9\x1f\x46\xf5\xaf\x77\xf2\xe8\x40\x8b\x82\x63\x36\xa3\x50\x52\xef\xff\xdf\x4a\xf7\x95\x96\xaf\x1b\xb2\x25\x9f\x83\xc1\xbc\x10\x9c\xfd\xc3\xdd\x50\xfd\x96\xd3\x10\xf2\x7e\xa4\xc6\xc7\x69\x0f\x21\x81\x5e\xa9\x2b\xd7\x93\x89\x68\x0c\xfe\x3e\xd4\x0c\x80\x18\x11\x90\x68\x8d\x24\x22\x2d\x9a\x1e\xd5\x2c\xe6\xa1\x6b\x41\xdb\xd9\x10\x7e\xb6\xd2\xe3\x59\x4e\x44\x94\xd7\x5d\xd7\xc0\x89\xe3\xb2\x6f\xfd\x00\xd1\x00\x3c\x92\xc4\xc3\x9a\xe5\x38\x2e\xf9\x29\x14\x91\xa8\x80\xca\x4e\xc3\xac\x2b\x86\xe6\x67\x19\xb9\x2b\x6f\x7c\xea\x2c\xb0\xbb\xb1\xcf\x62\x4d\x0d\x1a\xbe\xae\x55\x6e\x5f\x73\x90\x9d\xd5\x46\x27\x70\x37\xec\x97\x2f\xd4"}, -{{0x5a,0x63,0xef,0x9b,0xd7,0xdb,0xf0,0xe8,0x9f,0xef,0x15,0x59,0x83,0x65,0x9e,0x8a,0x0a,0x6c,0xa0,0x02,0xbc,0x42,0xfa,0xd5,0xa4,0x5a,0xf8,0xe0,0x28,0x19,0x23,0xf4,},{0xe6,0x32,0xf4,0xdc,0x99,0x42,0x31,0xcc,0x17,0x90,0xc2,0x1a,0xfa,0xda,0xa9,0x77,0xa5,0x89,0xb0,0xeb,0x0d,0xa1,0x9f,0xcb,0x27,0x92,0x91,0x1b,0x15,0xec,0xf8,0xaf,},{0x75,0x46,0x1f,0x99,0x65,0x0c,0x03,0x68,0x05,0x81,0x13,0xa1,0x5b,0xa1,0x6b,0xd2,0x33,0x7b,0x2e,0x63,0x3d,0xa3,0x81,0x12,0x87,0x8c,0x48,0x34,0xfa,0xc9,0xba,0x2e,0x30,0x7c,0x86,0x6c,0x02,0xaf,0x79,0xbe,0xa3,0x36,0x59,0x61,0x4c,0xbb,0x44,0x65,0xc5,0x7e,0xc3,0xef,0xfd,0x4c,0x47,0x8a,0xe3,0x8a,0x34,0xa0,0x5c,0xf1,0xed,0x07,},"\x79\x6b\xc8\x36\x1c\x6e\x8e\xec\x39\x83\x8b\x24\xf5\x39\x71\xe8\x20\xf8\x23\x61\xe0\x51\x0e\xb4\xde\xf1\xdb\x25\x12\x38\x7d\x6b\xf3\x5b\xbd\xfa\x31\x88\x79\x20\x94\x35\xd6\x88\x7b\x14\x10\xb3\xeb\xc1\x45\x5f\x91\xf9\x85\xe0\xfa\xb1\xce\x1c\x50\x5c\x45\x55\x76\xbc\xa0\x35\x39\xd0\x48\xad\x3a\x0e\xd1\xf1\x1c\x73\xba\xc6\x80\x9e\x2e\xa1\x47\x97\x5b\xee\x27\xc6\x52\x61\xac\xa1\x17\xdf\x0f\xae\x70\x08\xe2\xc3\xc1\x30\xbe\xc5\x53\x3a\xb8\x93\x51\xc2\x14\x0c\x9d\x1a\x62\xbd\xf6\x88\x62\x97\x87\xf9\x54\xe1\xc6\x10\xcb\xb7\x5e\xdb\x86\x20\x9d\x7c\x35\x7c\xd0\x6e\xf4\x19\x31\xdd\x5d\xfd\x1c\x7d\x40\x7f\xa4\xee\x1e\xf2\x93\x93\xbe\xab\x57\x13\x17\x38\x02\xcc\xe2\xd5\x62\x29\xcf\xa7\x6b\x60\x16\x62\xc4\xd9\xa8\x4a\x49\x36\xc5\x2a\xbb\x19\x81\x37\x8b\x71\x7e\xb5\x5c\xb6\x04\xa6\x8d\x34\xf0\x3b\x21\x9f\x32\x22\x6c\xa0\xe6\x69\x34\x8a\x2d\x8d\x24\x53\x93\x0e\xb6\xe9\xc2\xbf\x66\xfa\x4e\x92\xc7\x51\x36\xe1\x48\xcd\xb0\x34\x13\x0d\x3f\x64\x63\x82\xe1\xc7\x15\x79\xac\x70"}, -{{0x8b,0x2f,0x06,0x14,0x1e,0x40,0x11,0x63,0xf9,0x0f,0x67,0x4b,0x04,0xdc,0x90,0xdc,0xb6,0xdd,0x33,0x86,0x41,0x93,0x39,0x66,0x2e,0xcb,0x0d,0xff,0xad,0xf2,0x50,0x0b,},{0x54,0xda,0x93,0x4a,0x65,0x91,0x19,0x19,0x85,0x53,0xfd,0x45,0x66,0xb6,0x60,0xd8,0xd6,0x10,0xad,0xc3,0x29,0x0c,0xb8,0x48,0x29,0xc8,0x94,0x14,0x8c,0xf3,0xf6,0x7e,},{0xd6,0x8e,0x37,0x50,0xdc,0x56,0x43,0x23,0x97,0x40,0x1c,0x98,0xff,0x15,0x29,0xdb,0x9e,0xd4,0x8f,0xea,0x24,0x6d,0xd4,0xed,0x38,0x3e,0xc7,0x4c,0x1a,0x46,0x3a,0xeb,0x78,0x4c,0x87,0xb1,0xfd,0xa8,0xbb,0xce,0x97,0x0f,0xc9,0x7a,0xa9,0x80,0x7d,0xdb,0xe9,0x5d,0x41,0xfb,0x02,0x2e,0xa6,0x8c,0x1e,0x31,0x16,0x54,0xfa,0x1d,0xa2,0x07,},"\x1d\xeb\x25\xd4\x34\x58\x69\x03\x23\xa7\xd2\x6a\x26\x69\x50\x90\x99\x34\x74\xf4\x67\xc6\xfd\xe5\xdd\xb3\x4d\xa9\x45\xbe\x3c\xea\x2f\x6b\x75\x65\x2a\xe2\x1c\xbc\x4f\xd2\x27\x63\xa1\xb4\x55\x83\xe1\xc3\xe8\x8b\xbb\x5f\xea\x20\x49\xb7\x33\x6c\x91\x15\x99\x88\xc0\x15\x26\x82\x4c\xa3\xbe\xf1\x6b\x36\x2b\x92\x02\xb8\xb9\x75\x41\x85\xbd\x61\xbe\xa8\xf5\x39\xaa\xdf\x4a\x1a\xb1\x35\xfb\xc3\x1d\x2a\x8e\x33\x17\x80\x73\x10\x6c\xbb\xc0\x2d\x4c\xd0\xd3\xc8\xfe\xaa\x8e\xb7\x33\x08\x43\x56\x25\x17\x95\xaf\xbd\x78\xac\x3c\x4f\x8a\x3b\xa1\x9a\xed\x75\x5c\x64\x6f\x35\x56\x9c\x7a\x6c\x67\x5b\x6d\x69\x18\xe8\x34\x96\x9a\xca\x03\xf7\x1a\x2e\x72\xcc\xb1\x70\x03\xbb\x75\xb6\x2e\x85\x2a\xaf\x58\xb3\xba\xea\x89\xbc\xd6\x4a\x32\xeb\x14\xa6\xb9\xe1\x0d\xe4\x89\x71\xe5\x3d\x0e\x9a\xc9\x9a\x78\xf4\x2d\xe0\x38\x2e\xf0\xe8\x0e\xd3\xcf\xa3\x43\xf3\x5e\x4a\x99\x83\xb9\xae\xed\x98\x6d\x3a\x57\xf4\x7e\x5e\x46\xd4\x0e\x9d\x67\x73\x02\x80\x9a\x2d\x37\xe4\xec\x01\x1f\x05\x1b\x4d\x03\x1e\xd6\x00"}, -{{0xdc,0x64,0x9f,0xbb,0x1b,0xee,0x0a,0x44,0x81,0x4d,0x6d,0x9e,0x90,0x80,0xd5,0xd9,0x0c,0x1f,0xc1,0x73,0xab,0x5f,0xef,0xed,0x82,0x6a,0x74,0x72,0x3a,0x77,0x4e,0x0a,},{0x02,0x14,0xc8,0x9f,0x38,0x67,0xad,0x2e,0x88,0x70,0xe5,0x0f,0x8c,0x2a,0x62,0x54,0x98,0x6d,0x9c,0x22,0x0e,0x33,0x38,0x41,0x13,0x00,0xcd,0x9c,0x64,0x04,0xd4,0xb1,},{0x0e,0x0c,0x5e,0x4e,0x18,0x43,0x75,0xda,0x4e,0xf7,0xe2,0xa2,0xe4,0x88,0x80,0x50,0xcd,0x84,0xe2,0xfe,0x21,0xd0,0x8e,0x84,0xa8,0x52,0xdb,0x2b,0xe3,0xfb,0xc3,0x72,0xc4,0x72,0xde,0x09,0x54,0xdc,0xd1,0xdc,0x11,0xae,0xc4,0x93,0xc5,0x69,0xf4,0x0f,0xc6,0xf7,0x7f,0x03,0xee,0x52,0x4f,0xb0,0x6e,0xc4,0x0f,0xaa,0x1d,0x6c,0xc1,0x0f,},"\x32\x87\x00\xa8\xae\x58\x1c\x1e\xdc\x4e\x2c\x00\xc7\x8b\xf4\x60\x60\x97\xf9\xbd\x75\xaa\xde\x20\x5a\x24\x3c\x5f\xd7\x43\x4d\x62\x22\xda\x93\x7e\x28\x81\xa2\xe3\xc5\x74\x35\x6d\x4d\x56\x79\x30\x1d\xa9\x9e\x11\xcf\x74\x9c\x27\x92\x1c\x8c\xaa\x2a\xb2\xa5\x64\xd8\x7c\x5d\xf8\xec\xf1\xa7\x2b\x68\x01\x84\x82\x4f\x69\x86\x02\x2e\x3f\xc9\x8b\xd2\xa2\x1c\x34\x55\xab\xf1\x15\x49\x54\xfb\x30\xc8\x98\x82\x94\x7b\x02\xf3\x5a\xf7\xb1\xbf\xad\x05\x23\x7d\x24\x2e\x2b\x74\x83\x2f\xc5\x36\x19\x6f\x2e\x59\xd1\xac\xd0\xc1\xdb\x6f\x19\x43\xd0\xf6\x04\x3b\xbd\x6a\x76\x90\x83\xed\x66\xba\x0e\x05\xa5\x0f\xeb\x0a\xcf\x72\xb6\xc1\x6b\xa9\xaf\x03\x9a\xfb\x7f\xe2\xa4\xaa\xeb\x4d\x06\x18\x1c\x5a\x18\x78\x68\x9e\x67\xa3\xf5\xd0\xad\x39\xe7\x94\xd6\x23\x9a\x7e\x0a\x12\xce\x82\x0c\x5b\xe6\x0f\xd5\xf1\xdd\x79\x70\x2f\x49\xd0\x2b\x79\x75\x5f\xe8\x73\xf5\x78\x5c\x72\xf7\x46\x25\xcd\x7e\x24\x28\x26\x25\x97\xd3\x14\x82\xc2\xc0\x50\x88\x01\xfd\x96\x31\x9d\x61\xb9\x1b\xa2\x53\xa5\xe7\x22\xf4\x14\xcf"}, -{{0x39,0xb8,0x06,0x2d,0xa4,0x3e,0x64,0xe1,0x67,0x67,0x65,0xd6,0x2c,0x7f,0xb8,0xe0,0xa9,0x9c,0x4f,0xd4,0x17,0xd6,0xf7,0xe3,0x31,0x9b,0xb1,0x30,0x44,0x20,0x5f,0x3b,},{0x62,0x27,0xce,0xfe,0x88,0xea,0x4f,0xb2,0x7b,0x37,0xb5,0xf7,0x97,0x77,0x8b,0xd7,0x2f,0xda,0xfe,0xad,0xcc,0xd9,0xae,0xb6,0x7a,0xd4,0x37,0xce,0x08,0xfb,0xa6,0xa8,},{0xc5,0xf6,0x26,0x49,0x0c,0x0e,0xf4,0xe1,0xef,0xc3,0xed,0xeb,0x0c,0xbc,0x3f,0x7d,0xe2,0x67,0x05,0x7f,0xb7,0xb6,0xeb,0x8f,0x0c,0x81,0x35,0x84,0x96,0x5b,0xc5,0xc4,0x21,0xfe,0xed,0xf5,0x42,0x41,0xca,0xe0,0x01,0xec,0x6d,0x5e,0x25,0xc9,0xb1,0xfb,0xa0,0x38,0x5e,0x5d,0xbd,0x95,0xa0,0x6e,0xc1,0xd8,0xae,0x51,0x91,0x44,0x96,0x0d,},"\x74\x0a\xf6\x79\xe3\x06\x9f\xad\x05\x9f\xa4\x82\x5f\xa4\x1c\x59\xfb\xd4\x84\xaa\x64\x93\x03\xc2\x7c\x4f\x7a\x94\x71\x1c\x5b\x71\x3b\x2a\x6b\x89\x87\x85\x9e\x22\x71\xa6\xa7\x1e\xb0\xb4\xa1\x5a\xbd\xe4\xf5\x16\x8f\x6c\xb9\xdb\xdc\x6a\x27\xa2\xa1\x3d\x52\xc9\x72\x08\x96\xa1\xf4\xce\x3a\x53\x45\xee\x79\x3b\x6c\xc3\xad\x80\xd7\xd5\x81\x63\xd5\x45\x5b\x9c\xbd\x07\x3e\x2b\x7a\xdb\xff\x95\x59\x0c\x71\x72\x27\x1b\xd9\x1f\xef\xdb\xd0\x16\x57\xee\x17\x50\x65\x10\x36\xcd\xc3\x56\x0b\x44\x4c\xa2\x18\x4b\xf4\xf3\xea\x89\xfc\x97\x3a\xab\x6f\xb4\xa8\xee\x57\x04\xbb\xe5\xa7\x1c\x99\xfa\x3b\x5e\xf0\xd0\x39\x62\x49\x75\x82\x97\x69\x9a\xe2\x02\xb8\x19\x69\x0d\xc7\xac\x46\x92\x77\x03\x46\x90\x78\x45\xe2\x21\x0d\x53\x63\xad\xee\xc0\x3f\x0f\xc7\x76\x1b\x7e\x0e\xc0\xfe\xa1\xbc\xf6\xb0\x4f\xc5\x4b\x3e\x4c\x40\xd1\x9b\x8f\xa6\x49\xac\x84\x79\xe8\xf8\x07\x30\xc0\xc9\x4e\x9f\x4a\x1a\xd5\x06\xf2\xbc\xab\x0c\x49\x54\x0f\x6d\xec\xaa\x77\xb3\xd6\x57\xdc\x38\xa0\x2b\x28\xa9\x77\xec\xe4\x82\x54\x5a"}, -{{0x52,0xf4,0x67,0x5d,0x8c,0xcd,0x0e,0xb9,0x09,0xdf,0x0a,0x51,0x66,0x48,0xdb,0x26,0xfa,0x03,0x3b,0xa4,0x1d,0x43,0xfc,0x38,0x45,0x89,0x6d,0x45,0x6e,0x14,0x26,0x5f,},{0xf3,0x9e,0x7d,0xaf,0xc9,0x7b,0x0a,0x84,0xdc,0xbf,0x7f,0xa1,0x4a,0x94,0x03,0xee,0x1f,0xa9,0x2b,0x85,0xe5,0xa7,0xe5,0xd0,0x5f,0x03,0x1b,0x44,0xdd,0xf1,0xf7,0x94,},{0x4b,0xf6,0x68,0x82,0x7a,0x72,0x0a,0xf6,0x88,0x98,0xa0,0x6e,0xa7,0xb4,0x45,0x45,0xa3,0x4c,0xa8,0x96,0xec,0xf3,0x11,0xfe,0xea,0x47,0xe0,0x68,0x6d,0x91,0x1f,0xad,0xaa,0x03,0x11,0x89,0x97,0x15,0x3c,0x65,0x36,0x1f,0xea,0x15,0xde,0x9b,0xb8,0x91,0xb8,0x90,0x98,0x72,0x04,0x55,0x08,0xff,0xad,0x0c,0xd9,0xea,0xb2,0x1a,0x97,0x02,},"\x74\x42\x71\x10\x85\x7c\xb4\xaf\x0a\x33\x42\xc2\xb5\x29\x97\xbc\xe1\xa0\xdb\x64\x05\xc7\x4e\x96\x51\xc5\xb8\x59\x79\xac\xb0\x71\xe5\x67\xfe\x70\x41\x2c\x4e\x0d\x8c\x9f\xa4\x21\x91\x4f\x6a\x62\xf2\xae\x42\x0b\x7b\x2f\x4c\xf8\x0c\x90\x57\x42\x21\x22\x22\x88\xb6\x58\x67\xea\xa6\x6e\x7e\x0a\x05\x57\xa2\x6c\x54\x9f\x9a\x7a\x4e\x70\x83\x8b\xa4\x07\x4b\x4c\xd7\xa9\xd7\x58\xb3\x78\xb8\x8d\xd4\x94\x41\xdf\x80\x2a\x44\x4d\xcb\xc3\x06\x24\x93\x3b\x59\x92\x2f\x33\xc2\x0f\x01\x9f\xe7\x8e\xe2\x4b\x8f\xba\x79\xa6\x82\xf3\x88\x50\x5a\xc9\xc9\x7f\x4e\xb8\x7c\x61\x18\x80\x02\x6b\x4c\x23\x30\x6b\x86\x51\x73\xf5\xd7\x16\xab\xc6\xcd\x9a\x99\x06\xdb\x34\x30\x13\x6f\x75\x41\x29\xc4\x43\xb2\x0c\x42\xbe\x2f\xbc\xbc\xd4\x40\x34\xd7\x14\xf5\x8a\x4b\xa8\xe7\x56\x60\x7a\x02\xb6\x08\xef\x49\x64\x8f\x2a\xd0\xce\xa9\x9e\x7a\xb3\x0a\x8d\xd7\x81\x40\x04\xf7\x25\xf4\x93\x01\xd7\xb3\x04\xdc\xda\x62\x5c\x29\x6d\x92\x8c\xb5\x81\x73\x6a\xb7\x39\xc8\x6b\x46\x92\x41\xa8\x25\x93\x51\xfd\x37\xb4\x78\x0a\x99\x93"}, -{{0xba,0xd7,0x3c,0x9f,0xda,0x4c,0xeb,0x9d,0xa6,0xc7,0x01,0xc2,0xa6,0xe2,0xef,0xc0,0x46,0x7a,0xfa,0x0a,0x74,0xf8,0x75,0x0c,0x52,0xcf,0x1f,0xd4,0xc8,0xe7,0x48,0x9a,},{0xbb,0x0f,0x02,0x7a,0x90,0x35,0x37,0x6e,0x1a,0xa3,0x20,0x6c,0x3d,0x77,0x44,0x75,0xe3,0x51,0xf5,0x76,0x7e,0xf8,0x6e,0xf4,0x8a,0x72,0xc0,0x37,0xc2,0x4c,0xce,0x62,},{0x19,0x7d,0x6b,0x6c,0xc8,0x8a,0x98,0xc0,0x6d,0xfc,0xa0,0xc0,0x12,0x25,0xed,0xfe,0x38,0xa0,0xb2,0x28,0x9f,0x29,0xf8,0xa4,0x4e,0xc0,0x81,0x6a,0x95,0x2d,0x58,0x5e,0x2d,0x59,0xb5,0xb0,0x8d,0xe1,0x00,0xc0,0x60,0x62,0x96,0xcc,0xf5,0xe9,0x2a,0x99,0xe0,0x93,0x62,0x31,0x44,0xb8,0xb2,0x2d,0xb8,0x7d,0x92,0x92,0x25,0x54,0x60,0x05,},"\x74\xb9\x66\xcb\x78\x07\x71\xae\xe6\x3d\x73\x4d\xf3\x75\x67\x02\xd1\xd5\xfd\xed\xdf\x32\x13\x6c\x63\x58\xb8\x36\x31\x8a\x4f\x98\x4f\xe7\x1e\x77\x16\xad\xdd\xbd\x64\x9e\xba\x44\xcd\x42\x82\xe0\x05\x5d\x8c\x1e\xd2\xd3\x51\x23\xd6\x6e\x5a\x98\xf1\xc0\x83\x8d\xed\x56\x3b\x9a\x20\xeb\x80\x07\x53\x8f\xc7\xb0\x71\x3e\x7e\x48\x5e\x3c\x28\xf6\xeb\xc4\x21\xa2\x9d\xce\x25\x24\xdb\x7f\x29\x20\x57\x61\x03\x6a\xda\x62\xe5\xb0\xb7\xd5\xb7\xf2\x94\xff\x17\xf3\x38\x23\x2f\xa5\xfd\x42\xb6\xf7\x25\x33\x04\x09\x2d\x84\x8f\x50\x73\x52\x48\x59\x5d\xa0\xf7\xef\x28\xe5\x68\xe9\x91\x6b\xfc\x56\xd7\xed\x0d\x81\x1b\x59\xd5\xd8\x91\xae\x43\xe1\xb1\x98\x07\x13\x06\xbf\x52\x5c\x67\x8c\x63\x43\x99\x80\x05\xfb\xb7\x86\x9d\x1c\x40\xf8\xca\xc8\x07\xfe\x2e\xf0\x3f\x3d\x5b\x93\x3f\x58\x97\x8e\xf2\x90\x6f\xcc\xf7\x44\x4a\x29\x36\xe6\x3d\x92\x8c\x69\x09\x26\xc9\xc9\x94\xed\x3d\x66\x62\x63\xe9\x56\xfd\xfe\xa2\x77\x64\xbc\x5f\x74\x12\x5b\xc4\x6b\xc1\x02\xdd\x3e\x5f\xf9\x3b\x5e\x12\x3e\x4b\x38\xbd\xef\x69\x7e\x15"}, -{{0x70,0x73,0x27,0xa4,0x31,0xdb,0xa7,0x76,0x39,0xb3,0x96,0x6b,0x2b,0xc0,0x95,0xf8,0xee,0xdf,0x57,0xf7,0xa2,0x00,0xe3,0xb0,0x07,0x7c,0xe4,0x20,0x38,0x9c,0x92,0xfe,},{0xee,0x24,0x96,0x91,0x08,0x64,0x18,0x9f,0xda,0xa3,0xc7,0x75,0x7e,0xb3,0xcd,0xa9,0xab,0x1e,0x70,0xfc,0x9e,0x7f,0x71,0xa3,0x8a,0x0b,0xfc,0x84,0x59,0x31,0xc9,0x5a,},{0xfb,0x99,0x02,0x9f,0xec,0xa3,0x87,0xa5,0xd7,0x65,0x96,0x1e,0x36,0x1d,0x71,0x72,0xb9,0x8b,0x7e,0x0f,0x11,0x29,0x0b,0xb1,0xe5,0xb5,0x7b,0x51,0xbc,0x21,0x23,0xd0,0xbc,0xe2,0x90,0x20,0x39,0x2a,0x4f,0xec,0x9a,0xe6,0xa7,0x2c,0x4c,0x38,0x6c,0xea,0x18,0x57,0xcb,0x8f,0x9c,0x50,0xaa,0x9a,0x76,0xd7,0xf1,0x68,0x7f,0xcf,0x29,0x00,},"\x32\xef\x31\xb6\x4e\xee\x70\x0f\xca\x2a\xb2\x1a\x26\x7f\x8d\x9d\x3b\xdc\x68\x9c\x75\x38\xfe\x95\x9b\xf7\x13\xfa\x99\x5d\xb2\xc0\xad\x36\xdd\xe4\x30\xa8\x41\x7d\x43\x7b\x72\xc7\x4e\x26\xdb\xe3\x1d\x93\x70\x1d\x46\x17\xfe\x51\x82\x5c\xff\x7a\x54\x4f\xc9\xf4\x4e\x43\x45\xe1\x4b\x4b\x11\xe1\x5f\x26\xff\xc2\xaf\x80\x35\xf3\xf9\x70\xe4\xdd\xa4\x4c\x0e\xbc\x03\x63\xc2\xb5\x6f\xde\x21\x86\x63\xbf\x78\x83\x90\x92\x53\x8f\xc2\xf3\x91\x53\xd4\xeb\x29\xda\x0c\x1a\x08\xaa\x96\x66\x01\xcc\x68\xca\x96\xe9\x93\xb0\x1b\x17\x3a\x26\x1b\x2e\xf3\x27\x65\x03\x82\xf5\x68\xfe\x94\x48\x55\xb0\xf4\xfd\x9d\x15\xe7\x52\xac\x74\xdc\xfd\x37\xb3\x78\x6f\xff\xce\xf2\x33\x39\xc2\x1e\x92\x70\xdc\xe8\x89\x1d\xd5\xee\xeb\xa9\x60\x8f\xdc\x7b\x6f\xbc\xc9\x9f\xa1\xb5\x90\x3d\xaa\x09\x68\xe1\xb6\x91\xd1\x9d\x06\xf2\x15\xde\xd0\x47\xef\x9d\x76\x61\x0f\x5d\xe2\x20\xf5\x04\x1b\x31\x3f\xaf\x9e\x96\xc9\xfd\x7d\xb5\x4b\x52\x25\x72\x6a\xf4\x35\xf9\xcb\xd9\xfd\x87\xab\x40\xce\x8f\x2c\x69\x40\xb5\x5f\x0f\xaa\xe8\x78\x50\xca"}, -{{0x6a,0xa5,0xc9,0xf0,0x08,0xf9,0x90,0x47,0x3b,0xa4,0xa6,0x28,0x6a,0x41,0x66,0x14,0x02,0x66,0x61,0xf1,0x1e,0x1a,0x24,0xef,0xa8,0x1a,0xc3,0x58,0x52,0xd1,0xd0,0x70,},{0x60,0x5a,0xc9,0xb4,0xdb,0xdd,0x50,0x33,0xd6,0xc8,0x28,0xbf,0xaf,0xa9,0x3c,0x00,0x39,0x44,0x0a,0xa1,0x1c,0xa7,0x24,0xae,0x83,0x40,0x43,0xe0,0x7b,0xd0,0x32,0xd5,},{0x97,0x56,0x30,0x3b,0x90,0x65,0x5e,0x93,0x52,0x51,0x03,0x2a,0xb1,0x9c,0xfc,0x95,0xca,0x1c,0x2a,0x2c,0x3e,0xa2,0x8b,0x03,0x3b,0xd4,0x70,0x66,0xcb,0xd4,0xc7,0xd8,0x98,0x2a,0x8b,0x98,0x86,0xf1,0xb9,0xcd,0x02,0xe8,0x8a,0x65,0x56,0x4d,0xa8,0xdc,0xc3,0x4f,0x30,0x8b,0xa9,0xf1,0x01,0x44,0xba,0x46,0x9c,0x2e,0xfa,0x49,0xe0,0x04,},"\xb5\x16\x5d\x39\x63\xf6\xe6\xf9\xea\x56\x57\xe9\xf0\x7f\xf3\xa3\x21\xeb\x33\x8f\x9a\x8c\x3d\x3c\x42\x30\x6b\x2b\x27\x89\x78\xb3\x1c\x62\x3a\x63\x1b\xe3\xb0\x4c\x41\xed\xfd\xed\xdf\x53\x8e\x1b\x76\x5b\xc8\x78\x54\x01\xc1\xaf\x29\xd0\x46\x7a\x64\x41\x1c\x49\x73\x95\xd7\x55\xdc\xa0\x3a\xe3\x27\x2f\x4b\xc1\xfb\x19\x18\xdc\xc1\xed\x6f\x04\xd6\x49\x84\x04\xa8\xce\x14\x09\xd4\x47\xf5\x70\xa4\x35\x95\x22\xcc\x54\x62\x92\x02\xeb\xe5\x07\xab\x69\x38\x43\x14\x1b\xd5\xea\x05\x73\xb2\x0f\x32\x1a\x48\x3f\xf3\x83\xa4\x68\x97\xf5\x92\x6f\xe0\xb8\xaf\xc2\x55\x72\x70\x7b\x63\xee\xed\x28\x35\x32\x92\x8a\x41\x44\x19\x64\x97\x94\x2c\x57\x2a\xc5\x47\x60\x51\x39\x25\x6b\x0a\xa0\xea\xf0\x4d\xb1\xa2\x56\x01\x2e\xd4\x53\xb1\x73\xee\x19\xad\x6e\x9b\x1a\xf3\xf4\x5f\xf3\x04\x4a\x64\x1f\x8c\x8e\xb0\xac\x7b\xb4\x5a\xbb\xde\xd4\x72\x86\xb2\xa0\x69\xd3\x90\x86\x94\xee\x06\xf2\xfb\xd0\xef\x60\x5a\x79\x11\x02\x6e\xa9\xea\x3c\x49\x13\xf3\x8c\x04\xd8\xb6\x95\x65\xa7\x02\x78\x67\xab\x30\x92\xd0\x5f\x4c\xfb\x18\xfc\x7c"}, -{{0x8e,0xfb,0x8b,0x79,0x74,0x2b,0xe2,0x1e,0x6d,0x31,0xde,0x67,0x8b,0xc8,0x14,0x50,0xba,0x86,0x21,0x08,0x2c,0xd6,0xf0,0x00,0x3e,0x22,0x86,0x1e,0x22,0x91,0xc4,0x81,},{0x33,0x38,0x1e,0x35,0x6c,0x4f,0xd3,0x86,0xa3,0xf7,0xb9,0x69,0xaf,0xd9,0xf5,0xc0,0x0d,0x20,0x67,0xb6,0x98,0xb3,0xf1,0xf0,0x0f,0x37,0x84,0x20,0x2d,0x30,0x84,0xcf,},{0x92,0x30,0x05,0xcb,0x48,0x48,0x40,0x2a,0xa8,0xf9,0xd5,0xda,0x74,0x03,0x0b,0x00,0x94,0x44,0x92,0x4c,0x21,0x4a,0xd6,0x00,0xdd,0xba,0xb4,0xc1,0x53,0xa6,0xff,0x02,0x2b,0x53,0xcf,0x63,0x64,0xcd,0x7e,0xe9,0x9b,0xef,0x34,0xfe,0x14,0x4d,0xa9,0x64,0xed,0xfc,0x38,0xa0,0xba,0x63,0x33,0x12,0x65,0x0e,0xbf,0x0e,0x55,0xa0,0x60,0x09,},"\x6b\x75\x03\x25\xd3\xa0\xf0\x8a\x14\x77\x00\xb5\x1a\x9b\x37\x25\x57\x10\x94\x81\x8e\xd6\x9d\x1f\x76\x10\x13\xeb\x86\xf3\x23\xf7\x3c\x49\xf5\xe4\x39\x87\x7c\x27\x83\xb3\x36\xd1\xf1\xa6\x74\xef\x3e\x43\x1f\xc1\xae\x01\x80\x08\x2d\xf5\xfc\xa6\x9f\x84\x81\x39\xfe\x6a\xb6\x73\x9a\x05\x92\xeb\xd6\xd4\x70\x5c\x7f\x01\x36\xb2\x21\x89\xa1\x1d\x60\xd4\xd3\xc9\xbc\x80\xfe\x7d\x7c\x00\x95\x2d\x57\x42\xf9\xc0\xc2\x12\x1f\xe7\x92\xdf\x13\x3f\x22\x1d\xb9\x91\xfc\x96\x0e\xe6\x4b\x9d\x32\xe0\x17\x8e\x54\x2b\xce\x8e\xfa\x8d\x03\xac\x80\x26\xcd\x77\xba\x8b\xf0\xb2\x42\x15\xb9\xfa\xed\x2e\xae\xc9\x20\xe9\x25\xd5\xec\x46\xff\xf6\xbd\xe7\x25\xe9\x1c\x82\x80\xe4\xad\xa2\x32\xa5\x43\x3a\xe9\x68\x0e\xbb\x53\xeb\x55\x55\x31\x47\xc9\x33\x70\x57\x48\x54\x89\x61\x54\x51\x42\x99\xc0\x93\x21\x9a\x11\x1d\xca\x4e\x63\x7a\xd5\x00\x13\x38\xc6\xd4\xd5\xee\x90\x98\xc6\x58\x32\xf7\xaf\x83\x5b\xcb\x62\x21\x28\x42\x30\x36\xc7\x9a\x57\x37\x73\x8a\x75\x39\xf8\xd4\xa6\xb8\xb2\x21\xb5\x6d\x14\x01\xae\xb7\x4d\x45\x71\xbc\x00\x9d"}, -{{0xed,0x04,0x6d,0x68,0x8b,0x2b,0x0a,0x1b,0xc3,0xda,0xf2,0x11,0x9d,0xd3,0x21,0xa6,0x07,0xb1,0x6d,0x2a,0x2d,0x1d,0x96,0x3a,0xdd,0x12,0x09,0xc6,0x65,0xb5,0xcc,0xba,},{0x87,0x34,0xf1,0xff,0xcb,0xd7,0x1c,0xfd,0xe2,0x90,0x01,0x7e,0xa6,0x25,0x3e,0x58,0x0d,0x59,0xe6,0x5b,0x54,0x1b,0x46,0x52,0x1f,0x5e,0x5e,0xc1,0x45,0x1e,0xae,0xc6,},{0x72,0x1b,0xfd,0x47,0x76,0xcf,0xba,0x13,0x33,0x0f,0xd3,0x72,0x69,0xe9,0x79,0xc1,0xd7,0xb6,0xce,0x54,0xa5,0x1b,0x82,0xf4,0x56,0xe1,0x37,0x37,0x8e,0x58,0x2f,0x19,0x2a,0x12,0x08,0x9d,0xa5,0xab,0xa7,0x6a,0x7b,0x16,0x18,0x13,0xdc,0xe5,0x6b,0x72,0x89,0x2a,0x35,0x33,0x0c,0x94,0xf7,0xff,0x21,0xd0,0x9c,0xf0,0x9e,0x55,0x35,0x04,},"\xb9\xcc\x90\xfd\x8d\xe2\xa1\x41\xf9\x51\x16\xdb\x3b\x04\xbe\x83\xe9\x85\x22\x59\x7e\xc2\x17\x49\x64\x24\x51\x80\xb9\xa4\x73\x76\x7d\x6d\x47\x0a\x21\x7d\xb5\xff\x5a\x1a\xb7\x77\xe1\xe2\x8a\x0b\x16\x97\x5e\x2b\xac\xb8\x73\x02\x04\x44\xb4\x7e\xd8\x32\x64\x21\xb9\x0e\xbb\x50\x36\x88\xf0\x90\xc1\x1b\x3b\x13\x61\x7c\x5c\x50\x52\xc2\x97\xa4\x1e\x28\x93\x77\x5e\x34\xd5\x9a\xda\x49\xd9\x94\xc0\xe4\xa9\xf5\x22\x0e\x9f\x03\x15\xa6\x77\x05\xa3\xec\x08\xaf\x0d\xc7\x24\xb5\xcf\x67\xff\x34\xfa\xda\x8b\xa7\x10\x9e\xd2\xb5\xa8\x90\x7b\xb4\x03\xfb\x1a\x83\x8b\x4b\x05\x9f\x18\xc7\x92\xd7\xbf\xec\x05\xde\xe0\xc9\xcb\xbf\x17\x53\x40\x9d\x7d\xb3\xac\xea\xf4\x7b\x4c\x61\x39\x84\x97\xb0\xec\xa6\xc1\xf8\xac\x08\xa7\xea\x1e\xb9\xc4\x0b\xc4\xe9\x2e\x88\x82\x12\xf7\xd9\xee\x14\xfd\xb7\x31\x58\x16\x09\x44\xff\x9b\xcd\xfe\xf1\xa7\x46\x9c\xc7\x0f\x94\x74\xe5\xf2\x4d\xff\xfe\xa5\x85\xf0\x9e\xaa\xab\x4b\xe2\xaf\xeb\xbe\x8e\x6c\xf8\x6d\x35\x68\x0d\xc5\xd1\xb9\x29\x13\xe8\x48\x25\x6e\xc7\x36\x31\x6f\xd0\xa2\x14\x20\x63\xb0"}, -{{0x76,0xac,0x8e,0x57,0x0a,0x39,0xb3,0xa0,0x23,0x2c,0x45,0x49,0x75,0x37,0xfb,0x21,0x55,0xac,0xec,0x36,0x17,0x86,0x5e,0xd1,0xdf,0x21,0x0f,0x00,0xb4,0x9d,0x1b,0x8d,},{0x31,0x2a,0x3a,0xd8,0x99,0xae,0x6a,0x25,0x50,0x7a,0xe6,0xe4,0x52,0x4e,0x10,0xb6,0x3a,0x6e,0x7a,0xe5,0x3d,0x9c,0xff,0xd3,0x9c,0xf2,0x85,0x21,0xd9,0x35,0x33,0xd6,},{0xcf,0x03,0xf5,0x25,0x91,0x3c,0x44,0x30,0x3b,0x2f,0x80,0x07,0x93,0x93,0xc2,0x1c,0x11,0x58,0x14,0x6e,0xcf,0x99,0x63,0x6f,0x5d,0x97,0xad,0xfd,0xd9,0xf3,0x58,0x39,0x80,0x4c,0x23,0x80,0x4c,0xbf,0x1e,0x55,0x3c,0xfd,0x4b,0x73,0xf6,0x89,0xa9,0x14,0x3a,0xec,0x29,0x8f,0x82,0x76,0xe1,0xe4,0xee,0x08,0x91,0xf1,0xba,0x75,0xde,0x04,},"\x53\xce\xd9\xdb\x2b\x47\x9e\x59\xd3\xed\x64\x3f\x7c\xc3\x78\x4c\x24\xb8\xbd\x4c\x63\x20\x6c\x72\xe2\x3f\xa8\x50\x02\x88\x99\xa4\x1c\xe1\xa8\xbd\xc0\x03\xf1\x2b\x7c\x29\x97\x2c\x9a\x08\xbc\xd2\x31\xfe\x0e\x1a\x0f\xef\x0b\xaf\xbf\xa4\xe0\xe0\x27\xd7\x20\x04\x07\x5b\xa3\x7d\x49\x0e\xb9\x96\x4e\x78\x3b\xb9\x8f\x9e\x50\x3e\x9c\x1f\xd3\xd2\x3f\xb0\x01\x7c\xc7\xc7\xa9\xf8\x6d\x17\x1f\x04\x1e\x23\x55\xd8\xc5\xe6\x22\x9d\x34\xc7\xee\xac\xb6\x35\x8c\xf3\x06\x0d\x5d\x26\x5b\xae\x20\x04\xa5\x58\x87\x86\x59\xa3\x0d\xfe\xd5\xf2\xec\x78\x8b\x4e\x14\x39\x7b\x5d\x00\xc2\x9d\xb5\xd4\xeb\xf1\x66\x39\xa8\xdf\x29\x2a\x3d\x24\xf6\x98\x3c\xbc\xa7\x60\xd9\x03\xe9\x76\xf5\xb6\x98\x64\x2b\xa1\xfe\xd4\x9e\x79\xc3\x8f\x4b\xb3\x94\x6e\xfc\xcc\x9d\x6a\xef\xad\x33\x6d\x55\x8f\x78\xe4\xf2\x05\x42\x2e\x10\x38\x4a\x4e\x53\x1e\x75\x80\x7e\xfb\x38\x9d\x2a\xf4\xca\xb4\x38\x25\xfb\x87\xf1\x96\xa9\x08\x07\x69\xfe\x75\x85\x78\x29\x70\xa6\x91\x8a\xff\xe1\x0d\x20\xd6\x29\xb7\x05\x84\x55\x97\x41\x8d\x69\x9d\xe3\xf1\xde\x85\x4f\x94\xbd"}, -{{0xf6,0x4a,0x66,0xba,0x0f,0x08,0x19,0xf3,0x00,0x14,0x16,0xc2,0x20,0xbf,0x52,0xd8,0x60,0x13,0x0a,0x19,0x76,0x4a,0xa8,0xab,0x38,0xd1,0x5b,0x2a,0xa7,0x5a,0xc0,0x22,},{0x81,0x25,0x25,0x3c,0xd3,0x37,0xe0,0x0d,0x45,0xb4,0x50,0x79,0xb5,0x85,0x34,0x95,0x61,0xe5,0xf5,0x42,0xa8,0x1f,0x6d,0x2f,0xcf,0xd9,0x85,0xc1,0x0f,0xea,0xb2,0xaf,},{0x4d,0xe6,0xf5,0x25,0x08,0x22,0xd7,0xc9,0xd5,0xbb,0x98,0x58,0x25,0x00,0xb5,0xc0,0x85,0xf5,0x41,0xeb,0xdc,0x45,0x0e,0xd1,0xac,0xaf,0x83,0x68,0x48,0x27,0xed,0x1d,0xc7,0x71,0x47,0xaa,0xe4,0xb1,0x9e,0x14,0xa7,0xdc,0x5b,0xbe,0x1f,0x1e,0x4f,0x57,0x71,0xd8,0xa6,0xe4,0xf2,0x35,0x17,0x39,0xaf,0xb0,0x8c,0x80,0x6d,0x55,0x87,0x01,},"\x80\x72\x86\x2e\xd0\xab\x35\x92\x1d\xb5\xec\x2c\xba\x8e\x6a\xed\xb0\x44\x1f\xdf\x47\x49\x10\x06\xc0\x1e\x64\x56\xad\x70\xfa\xe3\xc4\x15\x2d\xcf\xbf\xdb\xb8\xf0\xfd\xde\xc5\xe9\x6b\x12\xbf\x67\x98\x9b\xa9\x67\x93\xf4\x86\x1a\x11\xb6\x39\x09\xce\x8d\x19\xb8\xca\x64\xa5\x44\xb3\x1c\xe0\x51\xfb\xc8\x8e\x06\x28\x06\xd9\x96\x5c\xbd\x29\x67\xb0\x16\x14\xe8\x6b\x53\x2f\xbf\x59\x84\x32\x18\xdc\x9c\x19\xc8\x03\x15\xf0\x44\x73\x17\x19\x37\x10\x92\xa3\xda\x38\x87\x8b\xc4\xcf\x77\xde\x97\x2e\x86\x04\x66\xb8\xfc\x45\xe4\x65\xdc\x3d\x0e\xbf\x94\xbd\xea\x60\xef\x0b\x98\x91\xce\xd4\x1b\x99\x7b\x11\xb3\x1e\xe4\x16\x7d\xb6\x0c\x9c\xfc\x8b\x85\xbe\xac\xfe\x22\x3c\xc1\x82\x92\x13\x77\x40\x85\xd7\xc0\x6d\x2b\x2e\x63\x2c\xc2\x1c\xd9\x66\x0d\xf4\x7c\x4f\xa9\x18\xbd\xd5\x96\xdd\xf6\x22\xdc\xb6\x52\x64\x2b\x67\x52\x7b\xa8\xed\x15\xa8\x19\xa8\xe2\x1f\x48\xd7\xee\x70\x24\x7f\x52\x00\xe3\x7c\x25\x9d\xff\xd1\x7e\xec\x8c\x23\x2f\x97\x0c\xb0\x31\x82\xfe\x39\x64\x13\x29\x93\xf6\xec\xb7\xc4\xdb\x18\xcc\xef\x39\x0c\x9e\xb3\x63\x9e"}, -{{0x84,0x39,0xb1,0xd6,0x0a,0xa4,0x84,0x60,0x13,0x5e,0xb1,0x00,0x2c,0xc1,0x12,0x79,0x29,0x95,0x07,0x9a,0x77,0xe6,0xe8,0xab,0x02,0x0b,0x9a,0xba,0xca,0x89,0x20,0xb4,},{0xea,0xdc,0x3e,0x0c,0x5b,0xdd,0xbc,0x30,0x52,0xc3,0xb2,0xf8,0xb0,0xa9,0x45,0x66,0xc2,0xb2,0xc8,0x79,0xed,0x17,0x03,0x4a,0xc0,0xe6,0xa4,0x5f,0x2b,0x3e,0x32,0xd2,},{0x62,0xda,0x81,0xe1,0x64,0x40,0x82,0x1b,0x59,0x3b,0x6e,0xe6,0x54,0x0e,0x15,0xd1,0xae,0xa7,0x5d,0x23,0xe0,0xa1,0xbb,0xfe,0xdc,0x80,0x8c,0x95,0x48,0xf8,0x7e,0x8b,0xbf,0x36,0x91,0x5a,0x39,0xa7,0x47,0x16,0xf6,0x45,0xcc,0xa5,0x71,0x4d,0x17,0x0a,0xf9,0x07,0x57,0x6d,0x4f,0x37,0x05,0xe5,0x43,0xd2,0xad,0xdd,0xc5,0xff,0x23,0x03,},"\x54\x19\xf6\xd2\x4e\xb4\x66\x35\xd4\xa7\xf8\xea\xb8\x03\xcf\xd0\xd0\x4d\xe0\x92\xaf\xbd\x86\xf2\xa6\x96\x1a\x8d\x1e\xb8\xc0\xd1\x97\xba\x55\xee\x08\xc9\x91\x82\x2a\x5a\xa7\x02\xba\xe0\x33\x7a\xbd\x5c\xa7\xfa\xa1\x5e\x1f\x1a\xe3\x69\x94\x6e\x9b\x81\x21\x6c\x0f\x5f\xc2\x2b\xbd\x44\x33\xc3\xde\x93\xc5\xca\xa2\x74\x16\x83\xbb\xd0\xe1\xa7\x8d\xf2\x8d\xda\x19\x17\x41\x01\x87\x63\x34\xd4\x03\x39\x65\x9f\x02\x1a\xe7\x66\x16\x2c\x6c\xc5\x42\x1b\x79\xcf\x9d\x5c\x09\x0e\xd4\xaf\x07\xec\x84\x49\x30\x35\xbd\x0b\x24\x21\xb5\x33\x68\x42\x95\xbb\xe7\x6a\x70\xfe\xc5\x96\xef\x8c\x89\xc5\xc9\xdd\xa3\xc3\x3b\x77\x35\xd2\xd2\xf2\x0b\x28\xf1\xa5\x40\x2e\x72\xd0\x4b\xa2\x91\xdd\x59\xf1\x4a\xf0\x8a\xdf\x56\xee\xb0\x86\xd7\x69\xc6\xbe\xc3\x45\x18\x91\x37\x23\x45\xfd\x6b\xd0\x2d\xcf\x95\xe8\x03\xaf\x03\x53\x15\x0e\x18\x2e\x32\x3a\xaf\x68\x3e\x03\x6d\x9a\x13\x5d\x2e\x6f\x98\xcb\x4d\x32\x7e\x2c\xe7\xd5\x42\x47\xf3\x59\x2e\xd0\x67\xb4\xce\x76\x27\x17\x4f\x99\x6f\x28\x16\x5c\x9c\x11\xf0\x7e\x5e\xe9\xce\xe6\x38\x51\xc6\xb6\x8e\xa2"}, -{{0x3a,0x04,0x63,0x97,0xf0,0xaf,0xc0,0x72,0xbc,0x7f,0x90,0x7c,0x74,0xd3,0x8f,0xd1,0xb9,0xaf,0xdf,0x27,0xe1,0x4a,0x35,0x34,0x76,0x8b,0x0d,0xd2,0xdf,0x3a,0x1c,0x22,},{0x99,0xcd,0x70,0xef,0x3b,0xe3,0x42,0x49,0x33,0x93,0x87,0x2f,0x54,0xc4,0x7d,0xea,0xa0,0x81,0x02,0x18,0x92,0xd1,0x1a,0x32,0x68,0xf3,0x14,0x5e,0xd4,0xf3,0xab,0xe5,},{0x50,0x24,0xce,0x60,0x25,0x79,0x65,0x68,0x70,0x80,0xc5,0xb1,0xfc,0x7d,0x13,0x01,0xc3,0x2a,0xa6,0xfc,0xc8,0x35,0x49,0x7d,0x9c,0xb2,0x3a,0x74,0xa6,0xca,0x27,0x24,0xf5,0x53,0x53,0xc1,0xb7,0x57,0x82,0x7c,0xa5,0x44,0x0c,0x9e,0xf8,0xf8,0xc1,0x05,0x09,0x13,0xe2,0x0a,0xab,0xec,0x35,0xc4,0x97,0xb5,0x60,0x41,0xb5,0xde,0xb2,0x09,},"\xf0\x8d\xde\xf4\x6c\xc6\xc3\x41\x79\x82\x0c\x98\x61\x37\x51\x72\xfd\xdf\x77\x4f\x8d\xc3\xf7\xd6\x4a\xa4\x32\xda\x8e\x5f\xae\x64\x4c\x0a\x8a\x9e\x69\x08\x51\x7d\x50\x5d\xeb\xd6\x12\x86\x8a\xc6\xda\xf9\x5c\xd7\xe1\x69\x97\x50\x02\x2c\xcd\x4b\x88\xdb\xae\x2b\xbf\x73\x54\x6e\xe4\xb8\x35\xd3\x19\xa8\x42\xda\xe8\xb9\xed\x68\x33\x23\xf3\x1e\x5c\xc5\x79\x19\xbc\x9d\xbe\x3b\xcf\xff\xb2\xad\xa4\x80\x72\x69\x7f\xf4\xa7\xd3\x10\xc9\x1a\xdb\xca\x81\xfa\xf2\x6a\x0e\xb7\xbb\x0c\x40\x4a\xc9\xd8\xdf\xec\x63\xe9\xc6\x4e\x2f\x42\x0c\x07\xd3\x23\xb7\xc0\xdc\x3b\x73\x50\x72\x83\xae\xb1\xce\xe5\x1d\xb4\xe1\xa8\x3a\x69\x2c\x7c\x1e\xa3\x98\xf6\xf3\x09\x40\xfa\xb8\x5e\x21\x38\xd4\xb8\x5a\xa4\xe2\x31\xe5\x42\x4f\x5b\x06\x4e\xd0\x26\xf0\xcc\xb9\x9d\x1c\x85\xa9\xeb\x15\xf5\x93\x4a\x11\x35\x9d\x41\x1c\xf9\x4a\xe8\xff\xa3\x36\x1a\x22\x4f\x46\xba\xb8\x52\xd1\x84\xa2\x48\xb4\xc3\x1f\xe3\xa7\xe7\xf5\x13\x4c\x05\x10\x31\xa9\xf3\x28\xa7\xbe\x4a\x7c\xbb\xb1\xd8\xd8\x63\xa4\x00\xfd\x2d\x58\xda\xa4\x4f\x1b\x9d\x8e\x9d\xdf\x96\x1c\xe6\x32\x2f"}, -{{0x12,0x4f,0x74,0x16,0xa8,0x04,0x53,0xe4,0xcf,0x1c,0xd7,0xb5,0xe0,0x50,0xa9,0x76,0x14,0x18,0x25,0x8b,0xf7,0xd2,0x7b,0xeb,0x7f,0x23,0x23,0x8c,0x45,0x40,0xbe,0x2d,},{0x0d,0xa3,0x4a,0xb1,0x73,0x99,0x01,0x50,0xdf,0x73,0x99,0xb6,0xbc,0xdd,0xba,0x93,0xc6,0xdb,0xcb,0xf4,0xd1,0x76,0x94,0x1c,0xb5,0x07,0x1e,0x87,0x34,0xc5,0xdc,0x92,},{0xb0,0x57,0x21,0x04,0xaa,0x69,0xe5,0x29,0xe3,0x46,0x5a,0x6f,0xd2,0x8f,0x40,0x4a,0x4e,0xc2,0x02,0x76,0xa9,0x93,0xb1,0x72,0x5e,0xb8,0xc5,0xf6,0x50,0xb4,0xa2,0x16,0xf1,0x87,0x1b,0x24,0xe3,0x68,0xcc,0x46,0xcd,0x1e,0xe0,0x17,0x4c,0xda,0x1b,0x5e,0x4a,0xe2,0x20,0x0a,0xa9,0xfc,0x44,0x52,0x2d,0x97,0x5a,0x9c,0x51,0x81,0x49,0x08,},"\x9d\xcb\x98\x73\xff\x05\x4d\xb1\x1d\x0a\x9b\x19\xde\x68\x85\xff\xba\x7f\x0e\x68\x1c\xf7\xfb\x8f\x6c\xd9\x50\xc4\x83\x28\xd1\xf9\x19\xca\x46\x05\x4e\xee\xe6\xc9\xe5\x78\x43\xeb\xdd\xa7\xb2\x4b\xc3\x50\x3c\x4d\x61\x2a\xbb\x1a\x31\x4f\x39\xf5\x82\x21\xd2\xb5\x4d\xc7\x55\xac\xca\x79\x69\x74\x0e\x7f\xa8\xb1\xa9\x52\x3b\x8c\x73\x79\xfd\x39\x52\x53\xf4\xe6\xcd\x05\x4e\xe2\x4b\x75\x61\x3c\x35\x81\xd4\x9e\x19\x24\x6a\x7b\x3b\xe1\xce\xcb\x33\x4b\xe4\x4f\x3d\x62\x6f\xe3\xb7\xb2\x69\xe6\x28\xd4\x45\x80\xc2\x06\x36\xeb\xa2\x64\x2f\x27\x44\xb9\x59\xe6\x57\x57\xd0\xee\x60\x18\x43\xf1\x88\xe9\x5d\x17\x25\x3f\xef\x56\x70\x68\xa5\x40\x5a\x3a\x9e\x67\x7f\xea\x3d\x7d\x55\xf7\xea\xd1\x9a\x3f\x30\xc5\xf9\x85\x67\x1b\x55\xfa\x12\x0c\xb9\xd0\x5f\x47\x1b\x6e\x1e\x8d\x77\x9a\x2c\x80\x3a\x19\xe6\xd0\xd7\xcd\x50\x78\x87\xed\x64\x7c\x2a\x95\x48\x3f\x93\x39\x91\xed\x45\xae\x30\x1a\x2b\x0e\x95\x4a\x57\x03\xd2\x48\xc7\x88\x10\xaa\x0b\x19\x9c\xc2\xbe\xbb\x2f\x1d\x71\xcc\x40\x48\x7d\xbd\x42\xee\xe0\xf7\x45\xf7\xd2\x85\x68\x5b\x1f\xb3\x1b\x15"}, -{{0x25,0xd1,0x3b,0x38,0x37,0x60,0x1b,0x07,0xa9,0x75,0x69,0x3e,0x5a,0x33,0xd5,0x33,0x7c,0x34,0xc1,0x12,0x7f,0xe4,0xc2,0x74,0x90,0x61,0x2a,0xaf,0x7f,0x64,0x2e,0x9a,},{0x3a,0x07,0xcd,0x68,0xee,0x26,0x92,0xd5,0x1c,0xfa,0xd1,0xa8,0x0e,0x77,0x63,0xb1,0x8a,0x04,0x3c,0x74,0xf4,0xe1,0xb0,0x1e,0xdc,0x55,0xba,0x9a,0x9e,0x07,0x79,0x5a,},{0x20,0xcb,0xf0,0x83,0x92,0xfe,0xa6,0xa9,0x9c,0xf4,0x46,0xa9,0x5c,0x19,0x9c,0xaa,0x0c,0x0f,0x98,0x13,0xcc,0x21,0x7b,0x8d,0x22,0x8e,0x2e,0xd9,0x0b,0xab,0x95,0xea,0x92,0xcd,0x73,0xac,0x95,0x83,0x47,0x64,0xd3,0x3e,0x42,0x24,0x3c,0x80,0xa7,0x60,0x34,0x91,0xc8,0xd3,0xe4,0x9a,0xc7,0x15,0xfd,0x8a,0x5b,0x9e,0x47,0x89,0xbb,0x03,},"\x11\x5b\x32\x20\xb4\x5c\xa8\xf3\x6c\x7f\xf5\xb5\x38\x87\xd4\x7e\x66\x9b\x78\xda\xc1\x3b\x98\xcc\x7a\xac\xa5\xc2\xe1\x9f\xce\x81\xec\x86\x17\xca\x41\x0e\x11\xc9\xa9\x11\x8a\x66\x84\x53\xb3\x29\xff\xb7\x18\xea\xec\x73\x91\x72\xf0\xa8\x49\xa0\x84\x81\x92\xa5\xbd\xea\x18\xab\x4f\x60\xd8\xd1\xa0\xd3\x38\x95\x2d\x77\xb2\xcc\x13\xef\xe8\x3c\x76\xe8\xdd\x58\x80\x3b\x1d\x8b\x3c\x97\x29\xef\x10\x2b\x20\x83\x5b\x7d\xe8\x72\xbe\xf3\x01\x0f\x15\xa4\xca\xdd\xf0\x7c\xf7\xbd\xd2\x22\xd8\x4b\x17\x4b\xc2\x15\x27\xcf\xfb\x1b\x7f\xfd\xe8\x1e\x28\x1d\x30\xcb\x7b\xce\x25\xea\x3d\xff\xb6\xea\x1f\xbb\x06\xcb\x70\x56\x9a\x95\xed\x1a\x07\xe9\x7c\xa4\x2d\xe7\x0a\xa2\x18\x15\x9e\xfd\x60\x8f\xa9\xb0\x89\x6e\x0b\x58\x51\x8a\x32\x2f\x25\x1d\x13\x3e\x58\xc8\xfc\x14\x28\xab\x0a\x17\x0e\xd8\x45\xc7\x5f\xb4\x03\xf1\xff\xb9\x7d\x2d\x2a\x6d\x4f\x27\x79\x11\xd3\x26\xc1\xca\xbb\xb8\x51\x6c\xbc\x17\x90\x8a\xb8\x1f\xf8\xd7\x9a\xf4\x46\x11\xea\x1d\x05\x87\x9c\x1e\xc8\x1d\x06\x93\x6e\x0f\x4a\x0a\xef\x6d\x57\x48\xe1\x81\xd3\x0e\xc2\x52\x36\x59\x7a\x97\x3d"}, -{{0x7b,0x3a,0x76,0xde,0xca,0xea,0x60,0xc4,0x1e,0x95,0xb0,0x58,0x77,0xa7,0xda,0x82,0x06,0x4c,0x27,0x27,0x8c,0x8d,0x7d,0xf5,0xf0,0xbb,0x95,0xf0,0xad,0x2d,0x04,0x35,},{0xf8,0x0d,0xb5,0xc2,0x87,0x21,0xb1,0xc6,0x11,0xbd,0x87,0xeb,0x14,0x5a,0x98,0xbb,0xf3,0x83,0xb0,0x68,0x04,0x5d,0xf2,0x45,0x8d,0x1a,0x6f,0xda,0x09,0x9f,0x7f,0xc2,},{0x2c,0xd2,0x6f,0xb3,0xc4,0xf7,0x44,0x0a,0x72,0xaf,0xfe,0x93,0x56,0x4f,0x6f,0x65,0x59,0xad,0xb1,0x5c,0xc7,0xa2,0xba,0x10,0x87,0x9f,0xb7,0xd6,0x7e,0x47,0xd4,0xeb,0xd0,0x2f,0xe4,0x82,0x36,0x98,0xa5,0xfb,0xd4,0xa9,0x07,0xfd,0x69,0x18,0x4c,0x25,0x5a,0x17,0x0e,0x5f,0x17,0x47,0xfc,0xe9,0x68,0x10,0x2d,0xc2,0x19,0xb5,0x0d,0x02,},"\x37\x5f\xad\xae\xdd\x9c\xac\x49\xb6\x4e\x15\x74\x02\x80\x46\x06\x9f\x4c\x83\x65\x4c\x8a\x70\x11\xab\xdb\x64\xdb\x16\xb4\x7f\xa3\x11\x79\x81\x72\xf9\x07\x22\x17\xb0\xa6\xa4\x3e\x5d\xf6\xff\xcc\x11\x54\xbc\xec\x1c\x68\xe1\xd3\x5e\xc0\x58\x80\xd0\x12\xce\x76\xe4\xce\xbf\x30\x1b\xb2\xec\x98\x3d\x00\xb4\xa0\x54\x0c\x93\x7f\xf1\xc6\xdf\x94\x41\xc6\x1b\xdb\x3b\xe8\xe0\xc7\xc1\x1a\x35\xd4\x9b\x6f\x55\xc3\x81\x26\x9a\x0e\x76\x8e\xfb\xd4\x53\x44\x7f\xe4\x8b\x75\xac\x39\x64\x6c\xa8\x2e\xca\x7d\x14\x93\x04\x42\x34\x91\x87\x1c\x10\xdb\xcf\xc5\x97\x3a\x57\xfa\xb8\x37\x1c\x30\xcb\xc4\xe9\x0b\xec\xc0\xb6\x71\x52\x22\x6e\xe1\x77\xb4\xff\x36\x8e\xc8\x79\xb3\x91\xeb\x95\xe3\x6d\xcb\xb0\x7b\x2c\x16\xba\x39\x55\x45\xd4\x52\x9f\x72\x7b\x1a\x11\xef\x65\xd1\x20\x97\x6b\x7c\xcc\x86\xaf\x4b\xd2\x04\xcb\x94\x89\xc9\x21\xe4\x3b\xa5\xe8\x50\xcf\xe5\x98\x99\xf1\xc1\xec\x4a\xa5\xc9\x2b\x6d\xac\x69\x14\xb1\x95\x2b\x53\xdc\xb5\x40\xb4\x09\x23\x13\x81\x56\x89\x87\xbb\x22\x36\xbc\x40\x89\x5d\xf3\xf1\x7e\xab\x7c\x02\x74\xf2\x24\x4f\x95\x86\x12\xe8\x8e"}, -{{0x5f,0xf8,0xd4,0x05,0x26,0x08,0xeb,0x03,0x3a,0x5e,0x94,0xb6,0x03,0xce,0x38,0x4d,0x84,0x52,0xf6,0x0a,0x26,0x49,0x8b,0x91,0x12,0x56,0x7f,0x34,0x10,0xc1,0x86,0x66,},{0xc4,0x90,0x0d,0xe2,0x4d,0x9a,0xf2,0x48,0x27,0x63,0x10,0x99,0x26,0xaf,0x7c,0x48,0x13,0x80,0xfa,0xbc,0xda,0x94,0x40,0xc1,0xa5,0x3e,0xa1,0xcd,0xc2,0x7e,0x65,0x68,},{0xb7,0x37,0xd4,0xe5,0xbe,0x27,0xde,0xb6,0xd8,0x77,0x29,0xc6,0x36,0xdf,0xf7,0xa4,0x06,0xc0,0x13,0xf3,0x13,0xc3,0x8c,0xf6,0x83,0xfe,0x14,0xf7,0x5a,0x3b,0x30,0x05,0xd9,0x53,0x5d,0x7e,0x58,0x15,0xc8,0xf8,0xb3,0x7c,0x51,0xd6,0x92,0x71,0x11,0xc9,0x79,0xf7,0xd9,0xd8,0x1a,0x34,0x7a,0xa9,0xcc,0x09,0xed,0x4e,0x6c,0x18,0xe9,0x0f,},"\x13\x8c\x60\x55\x7c\x2e\x90\x08\xaf\xc0\x3d\x45\xbe\xc7\x1f\x96\x11\x49\xa0\x83\x59\x26\x75\x1c\x8f\xf3\x93\x5c\x7d\x65\x2d\x83\xe1\xb0\xb1\xda\x7d\x5b\xbe\x0b\x8e\x17\x1a\x4e\x49\xaa\xe0\x6f\xd8\xa9\xde\xff\x78\xdc\xde\x4d\x25\xb1\xaa\x89\x99\x98\xa0\xf9\x9e\x1d\xf6\xf9\x33\x7a\x3e\xa2\xf2\x4b\x76\xc3\x17\xa7\x01\x4d\xb4\xe5\x28\x31\x91\x79\x5a\x70\xd8\x82\x1d\x21\x78\x46\x49\x0f\x95\x87\x01\xd3\x9d\xc2\xc8\xce\x47\xd9\x28\x93\x88\x74\xd8\x7b\x35\x58\x98\x9b\xc7\x7a\xf8\x20\x97\x9a\x35\x1e\xef\x95\x94\xaa\x5b\x94\xf3\x34\x1e\xde\xd4\xea\x20\xb0\x8c\x3e\x7c\x56\x10\xd4\x32\x67\x81\x8d\xfa\xc0\xa8\x7d\xdf\x52\x7f\xbc\xe8\x51\x2b\xbf\x85\xb6\x6c\x9b\xb5\xd6\x2f\x0f\xe8\x40\x48\xf2\x3b\x19\x60\x4a\x5c\x8d\x82\xb1\xf2\x5a\x8d\xa0\x27\x31\xfe\xb2\xec\xae\x48\x9b\x84\x75\xf7\xbd\x32\x6d\xdf\x1a\x08\x18\x9e\x46\xc0\x8c\xf5\x05\x38\xc2\xa3\x63\xe2\xf4\xeb\x2c\x01\xa2\x04\xc7\xff\xbc\x0b\x98\x1a\xdc\x0f\xd9\x97\xaa\xfd\xf2\xa2\x22\xee\x84\xc3\x09\xf6\xe9\x5e\xc7\xde\x4f\xa8\x5d\x47\x68\xd5\xc0\x03\x16\x50\x28\x22\x5e\x22\xe0\x9e"}, -{{0xee,0xde,0xfc,0x17,0x57,0xe3,0xa7,0xe5,0xed,0x39,0x46,0xdb,0xed,0xc3,0x96,0xa3,0x62,0xf6,0x83,0xd2,0xc5,0x1b,0x0b,0x9f,0x60,0x76,0x5d,0x4b,0xfc,0x51,0x34,0xde,},{0xa9,0x87,0x2b,0xc2,0x19,0x2f,0xc0,0x2b,0x18,0x9c,0xee,0xd4,0x03,0xab,0x9f,0x27,0x0a,0x03,0x2a,0x83,0x5f,0xde,0xbf,0xaf,0x1c,0x9d,0x69,0x34,0xed,0x83,0x04,0xbc,},{0xd5,0xbe,0xa8,0xea,0x9a,0x5f,0xe9,0xed,0x6d,0x2b,0xf8,0x39,0x93,0x0c,0x0c,0x6c,0xd5,0x03,0x9e,0x98,0x8f,0x55,0x1f,0xde,0xdb,0x54,0x37,0xe1,0xc1,0xaf,0x0e,0xd7,0xb3,0x89,0x7c,0x03,0x57,0x11,0xc3,0xc5,0x19,0x26,0xbe,0x8d,0x1b,0x32,0x02,0x4d,0x5c,0xd5,0x82,0xf5,0xf8,0x36,0x9a,0xd8,0x4d,0x18,0xb1,0x25,0x02,0x65,0x2f,0x07,},"\xb1\x94\xdb\x73\xf9\x94\xcb\xdc\x3c\xbe\x63\x0b\xa7\x2c\x47\xc2\x24\x9b\xc0\x59\x2a\xb5\x47\x94\x2b\x1d\x1b\x88\x2b\x44\xf5\xb3\x85\x5e\x56\x8b\xdd\xdf\x92\xef\x05\x02\x2d\x88\xfc\xfc\x29\x4e\x76\xb6\x4a\x00\xe9\xc7\x43\x55\x37\x37\x63\xe4\x9a\x4e\xbc\x47\x24\x3d\x48\xa9\xad\x58\x89\x94\xa5\x18\xf8\x0f\x86\x15\xc2\xb3\x1d\xa5\x87\xa5\x3e\x52\x9d\x43\x5a\x86\x97\x35\x0d\xfc\xde\x02\xd2\x0c\xce\x7d\x5e\xee\xfe\x3f\x5a\xb2\xaa\xc6\x01\x25\x9c\xda\x38\x53\x8a\x1b\x83\x01\xf9\x83\x2e\x75\xab\x90\xf8\xa9\x32\xf2\x67\xea\xc1\x81\x00\x39\x65\xd5\x26\x6f\x20\x61\x80\xc6\xc3\x80\xec\xe8\x03\x57\x7c\xcb\x46\x17\x6b\xf6\x07\x15\x94\x86\xf2\x42\x59\x74\x7e\x2c\xa6\xfb\x19\x12\xdb\x7b\x78\xa9\x73\xb2\x84\x63\x87\xc1\x20\x80\x30\xee\x1f\x40\x0d\x0c\x5b\x5e\x8b\xde\x96\x35\xae\x55\x63\x8b\xa1\x7c\x73\x4d\xe8\x63\x8b\xb8\x5d\xfc\xd7\x66\x29\xa7\xf9\xf4\x0d\x6a\xb9\x54\xd5\x5b\xf8\x57\x5f\xc9\xc9\xa5\x95\x09\x7e\x08\x93\xdb\x5a\x7b\x8a\x6c\x45\x5e\xcb\xd3\xd2\x2d\x72\x5e\x19\xde\x29\x41\xf4\x67\xf9\xeb\x93\xd6\x6a\x0e\x2b\xbd\xbf\x92\xed\x1c"}, -{{0x09,0xd2,0x2b,0xba,0xa5,0x95,0x6c,0xfa,0xcb,0xbf,0x9f,0xd5,0x51,0x09,0x75,0x12,0x86,0x86,0xc4,0x0c,0x6e,0xa9,0x6b,0x89,0xef,0x4c,0x0f,0x0c,0x64,0x9b,0xcd,0x7f,},{0xe5,0x59,0xea,0x8a,0xcb,0xdc,0x61,0xb6,0x70,0x9a,0x7d,0x83,0xae,0x15,0x84,0x9a,0x6c,0x78,0xb2,0x03,0x92,0x3d,0xd0,0xa2,0x99,0x23,0x9e,0xe4,0x88,0x69,0x30,0xba,},{0xe6,0x52,0x75,0xc4,0x32,0x8a,0x70,0xad,0x62,0x40,0x8e,0xd7,0xfb,0x17,0x28,0xbe,0x87,0xa7,0x3a,0x81,0x4f,0xee,0x8e,0xbd,0x94,0xf2,0x66,0x5c,0x71,0xbc,0x66,0xab,0x0c,0x1b,0x07,0xa6,0x00,0xb3,0x0b,0xc0,0x81,0xa7,0x4c,0x53,0x68,0x57,0xc2,0x06,0x10,0x38,0x4b,0xe2,0x68,0xd9,0xaf,0x3e,0x3e,0xcd,0xdd,0x3e,0xb0,0xc1,0x4c,0x0c,},"\x1c\x26\xa0\xf3\xa1\xa5\xb2\xd7\xd5\xb2\x97\xaf\x8a\x6a\x68\x9d\x7c\x62\xa2\x52\x67\xe1\x97\xd2\x3b\xec\xd2\xf2\xb8\x16\xc4\xde\x92\xfb\xda\xff\xb9\x41\xc3\xfc\x8d\xb7\xa8\x43\x35\xa8\x4c\xfb\xc9\x2c\xb3\xac\x80\x6e\xd5\x8d\xf1\x6b\x6b\x8e\x11\x9a\x48\xdf\x4f\x27\xc7\x1e\x93\x1a\x59\x38\xe7\xd0\x02\x73\x48\x85\xe1\x3a\x25\x8a\x15\xb6\xe1\x13\x6e\xfb\xa7\x2f\x1d\x09\x6b\x68\x9f\x76\x18\xf4\x9c\x96\x80\x63\xe8\xf9\x91\xfa\x0b\x55\x60\x1e\x43\x0e\xee\x13\x49\x2a\x1b\x09\x41\x3e\xb2\x38\x13\x59\x1a\x7a\x9f\x07\x0c\xc3\x96\xca\x9d\x1f\xac\xdd\x4f\x4c\xe3\x7c\x40\xf7\x24\x5f\x55\x03\x5e\x10\xfa\xd6\xb8\x5b\x5f\x01\xa1\xda\xac\xc0\xdf\x94\x06\x9f\x7d\xe8\xf6\x46\x7f\x96\xd1\xfb\x98\x64\x8e\x8a\x05\x20\xa8\xcd\x72\x3c\x98\xe9\xdc\x2d\xd4\xb2\x93\x4d\x82\x28\xf0\xae\x1a\x41\x5b\xd3\xa7\xcd\xa3\x8d\x7a\x99\x83\xce\x1a\xf6\xf8\xc9\x70\xa2\xa5\x91\x63\x5f\xe1\x2b\x91\x75\x36\xef\x81\x5e\xaf\x1a\x31\x38\xd7\x0c\xe7\x0a\x79\x42\x64\xd7\xc9\x86\xd9\xee\x32\x90\x44\x5f\x15\xa9\x24\x8f\x27\x65\x27\x1e\x5a\x99\x21\x96\xae\x33\x1a\xbd\x41\x64\xbf"}, -{{0x77,0x82,0x6e,0xd3,0x51,0xa3,0xf0,0x92,0x54,0xae,0x56,0x92,0x88,0x5d,0x77,0x4c,0xb3,0xf2,0x44,0x10,0xa4,0x80,0x9f,0xd9,0x0f,0x8a,0x00,0xda,0x9a,0xee,0x99,0x03,},{0x3e,0xac,0x8f,0x41,0xee,0x73,0xe6,0xef,0x13,0x68,0x21,0xf7,0x95,0x7a,0x1c,0x27,0xe1,0x56,0x38,0xd0,0xe3,0x91,0x6e,0x6c,0xaa,0xc6,0xfb,0x7b,0xeb,0x7b,0xcf,0xb0,},{0x97,0x7a,0xdc,0xcd,0xb8,0x29,0xb4,0x0b,0xbd,0x8e,0x53,0x85,0x6a,0x78,0x3d,0xb3,0x46,0xa3,0x9d,0xff,0x62,0x04,0x1a,0x29,0x72,0xd2,0x90,0x09,0xf1,0xc9,0xff,0x81,0xb8,0xad,0x54,0xcb,0x90,0x1e,0x49,0x7c,0x1d,0x30,0x21,0xb5,0x0b,0x6c,0x69,0xee,0x73,0x55,0x8f,0xd7,0xbe,0x05,0xd6,0x25,0xf5,0x72,0x7f,0x9a,0xf2,0xce,0x87,0x02,},"\x1f\xf0\x6c\x0b\x39\x99\xce\xcb\x19\x00\xa4\x7d\x26\x7b\xea\xfb\xb3\x5d\x93\xd1\x4c\xb2\xc8\x92\x5e\x3e\x3f\xe5\xd9\x67\x58\x69\x25\xee\x4b\xaa\x41\x99\x8e\xdd\x01\x03\x20\x58\x10\xaa\xd5\xc0\xbb\xdc\x77\x87\x44\x76\x81\x02\x46\xd1\x30\x89\xa6\x4d\xb5\x76\x42\x4f\xae\x0b\xed\x96\x64\xa4\x2a\x49\x11\x47\xd1\xee\x3b\x9c\x3b\x1b\xa4\x87\x5b\xe1\x54\x62\x39\x25\x40\xf9\x97\x8d\x9a\x46\x30\xba\x4c\x52\x54\x99\x75\x1a\x45\xef\xc2\x99\xec\x7d\x73\xb1\x7f\x9a\xd2\x75\xee\x71\xa6\x87\xe7\x26\x90\xd7\x32\x02\x42\xd2\xdc\x2b\xd4\xd5\xc5\xcf\x0f\x17\xa4\x65\x18\x5d\xcf\x60\xf8\xef\xff\x53\x90\x3f\x20\xb0\xc2\xab\x21\x92\xd4\x43\x68\xf2\xf2\xfb\x36\x04\x8a\xf0\x71\xf7\xaa\x85\x7b\x14\xad\x1d\x11\x46\x12\x05\xbe\xbe\x17\xe0\x2b\xe2\xe3\xcc\xb6\x09\x28\x21\x88\x5c\x4e\x0d\x48\x11\xbe\x3f\x45\xb1\xfe\xa0\x88\x45\x3e\x02\x24\x32\xf5\x62\x56\x2b\x43\xa3\x55\xcb\x56\x27\x0c\xed\xb6\xc2\xc4\x2d\xbf\x9b\xe8\x50\xe7\x71\x92\xfd\xc6\x5c\xfd\x36\x83\x4b\xe9\x88\xdb\xe9\xa9\x3e\x25\x18\xc1\x38\xb0\x90\xfb\x9d\xa8\x27\xcb\x1c\x91\xc8\xfe\x52\xfe\x7c\x57\xf7"}, -{{0x99,0xa9,0x95,0x31,0xc3,0xcd,0x6e,0x3e,0x9c,0x90,0x0a,0x9e,0xeb,0x26,0x26,0x7e,0x72,0xf0,0x9d,0x11,0xb6,0x51,0xa8,0x97,0xeb,0xb7,0x9b,0xe0,0x16,0xf6,0x4c,0x6e,},{0x9b,0xf9,0xf8,0xb4,0x8a,0x27,0x28,0xe0,0x26,0x08,0xfc,0x19,0x89,0x9d,0x21,0x96,0x56,0x83,0x9d,0x1c,0xc1,0xe9,0xa8,0x98,0x4d,0xf6,0x74,0xec,0x26,0x66,0x2f,0x41,},{0x0e,0x89,0xda,0x5d,0x94,0x9c,0xf2,0xbf,0x40,0xc7,0xe1,0x7c,0x2d,0x0f,0x9c,0xea,0xbc,0x88,0xa0,0x92,0xeb,0x4d,0x49,0xcf,0xbf,0xea,0xb7,0xc8,0xbf,0xf4,0x32,0x45,0xc6,0x7b,0x9e,0x2e,0x92,0xf9,0xbc,0xb9,0xb3,0x4b,0x3f,0xcf,0x8b,0x01,0xfa,0x2e,0xa7,0xa9,0x64,0x9f,0x81,0x4c,0x3a,0xa9,0x8b,0x3d,0xd0,0x45,0x40,0xc3,0x1d,0x09,},"\x7a\x89\xc0\xc1\x95\x2f\xdc\x42\x98\xdc\xae\xa8\x54\xef\xc1\x34\x65\x6b\xe1\x47\xe9\xe8\xe8\x2f\xc9\xa4\x49\x05\x9d\x80\x57\x0f\x75\x67\x6b\x81\xc4\xa9\x4f\x76\xa9\x68\x20\x0c\xde\xb0\x98\x8c\x73\xf5\x9a\xfc\x72\xad\x4c\x31\x03\xe1\x9f\xe6\x3b\x7e\x95\xe1\x40\xb5\xcb\x2e\xfc\x7b\x97\xa6\xff\xbb\x6c\x29\x8d\xda\xce\x3b\xe6\xd2\xed\x3d\x59\x8b\x8b\xdf\x0c\x2f\xe6\xc9\x76\x02\x14\x2a\x76\xe9\x78\x51\x4c\x19\x6c\x1b\x9a\x88\xef\xdc\x19\x25\xfc\x50\x61\x55\xcf\xf9\xa2\xf2\x1a\xb6\x34\xe2\xb9\x3e\x96\x92\x8a\x5d\x8f\x7c\xe4\xcb\x73\x26\xd9\x68\x94\x69\x24\x2b\xa9\xc6\xa0\x1b\x77\x49\x6b\xad\xef\x87\x57\x8f\x5a\x17\x28\x4e\x90\x0a\x72\xdf\x14\x1c\x61\x99\xb0\xe7\x1a\xb5\xda\x43\x75\x03\x76\x17\xec\x61\x96\xd4\xf4\xe2\x3a\xe2\x91\x6a\x72\xd0\xfc\xe7\x96\x02\x23\x05\xac\x9f\xbb\xbb\xe4\x70\x5b\x34\x0e\x42\xb7\x8e\x1c\x02\xbb\x10\x01\x86\x0c\xdc\xaf\x71\xed\x89\x25\x5d\xd5\x6c\xc0\xb3\x1c\x59\xd4\x59\x6d\xce\xf8\x4e\x22\x23\x4b\xe5\x62\xbd\x80\x1e\x94\x11\x1d\x83\xa7\x80\x64\xc9\x0f\x9d\x82\xfc\xe9\x1f\x68\xab\xb0\x3c\x73\xb6\xbd\x8d\x7e\x02\xd4"}, -{{0xaa,0x58,0x40,0x3e,0x76,0x3b,0xac,0x40,0x5d,0xb0,0x65,0xeb,0x11,0xeb,0x6b,0xe3,0xe3,0xb6,0xcf,0x00,0xec,0x4a,0x22,0x2b,0x52,0xbf,0xf4,0xb6,0xe3,0xd1,0x56,0xac,},{0x16,0x7f,0x9b,0x9a,0x46,0x65,0xf9,0x3f,0x5d,0x7d,0x30,0x16,0xac,0xe6,0xfb,0xd1,0x34,0x20,0xb2,0xe5,0x1e,0x72,0xbd,0xe5,0x9e,0xed,0xf2,0x69,0x93,0xb6,0x6c,0xae,},{0x64,0xb5,0x98,0xca,0x5b,0x8f,0x9a,0xe7,0x42,0xe4,0x6e,0xe0,0xd8,0xc1,0xaa,0xf3,0x14,0x58,0xb5,0x0c,0x25,0xd2,0x67,0xa6,0x77,0xe4,0x4b,0xe5,0xb7,0x55,0xf1,0x4d,0x51,0x80,0x1a,0x30,0x39,0x9b,0xfc,0xc3,0x8d,0x14,0x07,0x1a,0xa0,0xae,0x93,0xda,0x82,0x5a,0x58,0x1a,0xb6,0xc2,0x07,0x25,0xa0,0xa9,0x10,0xb4,0x73,0x5d,0xfa,0x0b,},"\x3b\xaa\x09\x98\xff\x02\xb3\x2b\x90\xb5\x1f\x9a\x84\x0c\x7b\x5c\x58\x70\xcf\xb1\x81\x0a\x9b\x0f\x77\xb5\x59\x09\xd4\x7a\xd3\x35\x14\x7a\x99\x1c\x29\xfb\xeb\xfc\x59\x2e\x93\x07\x17\x5c\x19\x64\x12\x9a\x2d\x5e\xfc\x62\x15\x80\x74\x53\xbc\xd7\x26\x96\x97\x81\x22\x2b\xca\xd1\xc9\x9a\x49\x74\x8b\x9e\xe6\x67\xc4\xd0\xc8\x28\x89\xe2\xf5\x00\x64\xc1\x15\xdb\xd8\xfb\x48\x3d\x72\xab\x0c\xca\xdf\x76\xbd\xdb\x2d\xc7\x27\xdb\xc3\xfa\x5c\x46\x24\xc2\x83\xd8\x92\x1c\x8a\xa4\x42\x51\x10\xdc\xdd\x69\xc0\x5e\x5e\xd5\x9b\x35\x96\x25\xee\xaa\xec\x1e\x27\xea\xfe\x9d\x9a\x5c\xe7\x36\xc3\xf9\xc5\x27\xea\x54\x78\x18\xb9\xbc\xa6\x81\x1b\xe4\xcc\x15\x05\x8a\x6f\x5b\x68\x33\x03\xb8\x0c\x90\xc9\x4a\x83\xb8\xb1\x58\x69\x71\x3a\x66\xb1\xe0\xf6\x56\x33\x1b\x28\x6d\x1e\xf7\x69\x88\x34\xab\x3e\x13\x84\x17\xaa\xd6\xbb\x3a\xb3\xbd\x9f\xc7\x87\x61\xa4\x82\xdf\xc6\x54\xf3\xf8\x62\x8c\x8d\x9f\xc1\x60\x18\x89\x8f\x16\x41\xe8\x62\x2b\xd2\x72\xe3\x8d\x41\x70\x6c\xb9\xce\xbe\x6e\xe5\xe1\x73\x57\x6b\xf6\x1b\xb1\x18\x8c\xf2\xf3\x9c\x62\x22\x0b\xba\x88\xfc\xb4\xde\x48\x98\xb2\x5b\x04"}, -{{0x10,0x44,0xee,0x37,0x08,0xc0,0xb0,0xe9,0x09,0xa8,0xcb,0x2b,0xa2,0xcd,0x0a,0xf8,0xd2,0x8a,0x5d,0xe0,0x1d,0x96,0x2e,0x82,0x60,0x87,0xfb,0x23,0x2d,0xf7,0xb2,0xd2,},{0x46,0xd2,0x41,0xea,0x0c,0x70,0x2c,0x18,0x89,0xd4,0x46,0x55,0x82,0x46,0x29,0xb6,0x72,0x84,0xd4,0xe6,0x44,0xa4,0x8f,0xa4,0x54,0x55,0xd2,0x7a,0xc5,0xf6,0x25,0x29,},{0x7d,0x6b,0xed,0x7f,0x87,0xd0,0x90,0xab,0xe0,0x13,0xc3,0x1e,0x12,0x03,0x90,0x3b,0xac,0x9c,0x93,0x44,0x5d,0x06,0xc7,0xb5,0x3d,0x31,0xd1,0x5f,0x97,0x0d,0x88,0x64,0x7a,0x7e,0xd2,0xc3,0xa6,0x30,0x50,0xba,0x19,0xd6,0x80,0x43,0xaa,0xdd,0x18,0xbd,0x86,0x1d,0xe1,0xac,0x47,0x15,0xb8,0xe8,0x28,0xb2,0xb1,0x6f,0x8a,0x92,0xb0,0x01,},"\xb8\xa4\x45\x45\x5f\xb6\x6e\x17\xe3\x14\x3d\x35\x20\x4c\x9e\xa9\x34\x74\xee\xbe\xef\x93\x96\x3e\xe5\xc1\xd3\x77\xca\x21\x7a\xcd\x4c\xa6\x3e\x57\x55\xda\x08\xfb\xff\xdb\xd4\x35\x2b\xf1\x65\x19\x38\x96\xc8\xd6\xf7\x6b\xb4\xcd\x3b\xc2\xd3\xa4\x76\xa4\xe3\x20\x82\x4a\x12\x10\xce\x74\xd0\x01\x4d\x74\x7f\x11\x1e\xec\x31\x0c\x5c\x89\xed\x4d\x08\x50\xe8\x11\xf8\x0a\x8b\xb2\x8d\xca\xf6\xf4\x11\xdf\x83\xe2\xc1\xdf\xd9\x0c\x4a\xd2\x35\x61\x45\x4e\xb5\xd7\x56\xb6\x3b\x4e\xa7\xf3\x7d\xc5\xd4\x66\xc1\x6e\xf7\x0d\x11\x19\x0c\x4f\x53\x16\xfe\x2a\xa8\x59\x74\x40\xe8\x8b\xbe\xba\xeb\x35\xea\x5f\x04\xf0\x7b\x03\x39\x26\x41\x58\xef\x90\x9a\xd5\x16\x3b\xfc\x24\x8c\xd7\x24\x13\x3e\x27\x4f\x81\x26\x95\xf2\x90\xe5\x71\x76\xa9\x6b\x93\x93\xd0\x7b\xb3\x10\x29\x9f\x5d\x2a\x6b\x6d\xd1\xda\xbc\xb5\x1b\xf2\x9c\x5a\xfa\x7e\xbb\x07\x01\xc6\xc8\x47\x67\xac\x13\x77\x93\x09\x1f\xe0\xed\x6e\x47\xd7\x80\x62\x8a\x32\xc8\x4f\x83\xe0\x0e\x9c\x16\x74\x2a\x52\x3e\xcb\x63\xc2\x4f\x4a\x33\x8e\xd2\x99\xa0\x61\x94\x92\x4f\x44\xc5\xa5\xd3\xc9\x37\xff\x9b\x09\x45\x98\x2a\xd2\x4a\x2d\x1c\x79"}, -{{0x95,0xdd,0x1a,0x5e,0x65,0x8f,0xa6,0xc8,0xd4,0x25,0x07,0xb3,0xe5,0xb8,0xed,0xb5,0xba,0xec,0xa6,0x2d,0xeb,0x00,0xfc,0x5d,0x4d,0xca,0x8e,0x1a,0xb5,0x83,0x5e,0x59,},{0x3a,0x53,0x23,0xdd,0x1e,0x07,0xf3,0x23,0xbb,0x6d,0x83,0xe9,0xc2,0xdb,0x92,0xa2,0x9f,0x62,0xe2,0xe0,0x03,0xee,0x0d,0xea,0xcd,0x7e,0x2e,0x4e,0x03,0x0d,0x8d,0x27,},{0xd0,0x2a,0x75,0x23,0xdc,0xbd,0x29,0x57,0x6b,0xa8,0x09,0xb5,0x31,0x03,0x77,0x74,0xdf,0x41,0x73,0x4a,0x41,0x17,0x58,0x13,0x11,0x9c,0x6a,0x6a,0x78,0x8c,0xd9,0xb8,0xad,0x78,0x08,0x65,0x67,0x86,0x67,0x69,0x9a,0xe6,0x6d,0x01,0x09,0x19,0xa9,0x66,0xa0,0x51,0xc0,0x81,0x63,0xdf,0x67,0xa9,0x77,0xee,0x6e,0x22,0x0d,0x0d,0xc3,0x0f,},"\x9b\x7a\xfd\x48\xc4\x74\x60\x4c\x26\x36\x75\x31\x55\x68\x40\xc3\x88\x66\x8b\x0f\x38\x40\x06\x3d\xfc\x98\x69\xad\x5b\x90\x12\x74\xb9\x31\x29\x3d\x04\xf3\xc8\xe8\xf7\xf8\xea\xb8\x15\xa6\x41\xd7\xc3\x51\x28\x4e\x8b\xb0\x43\x7a\xc5\x51\xbb\x29\x43\x89\x64\xe6\xa7\xc7\xba\x77\x23\x44\xb3\x33\xf9\xed\xa5\xa7\x75\x68\xc8\x93\x1d\xdc\xaf\x21\xe3\x2e\x07\xb1\x0b\xf4\x82\x0f\xb8\x59\xbc\xf8\x7b\x81\xc4\xbf\xf4\x26\xf2\x4a\x4d\x46\x8f\x2e\x9a\xed\xa8\xf1\x7d\x93\x97\x09\x97\x0d\xb1\x1d\xf7\x62\x47\xe9\x8a\x39\xeb\x8b\x38\xf5\x94\x9f\x34\x9f\x2a\xe0\x5a\xb4\x8c\x01\x85\x17\xc4\x8f\xa0\x20\x5d\xc7\xf1\x56\x64\x53\xe1\x05\xe4\x8c\x52\xeb\x45\x5c\x0c\x40\x80\x2f\x79\x7b\x3e\xef\xb1\xe2\xf3\xb1\xf8\x43\x15\xae\xd5\xb0\x71\x1c\x64\x99\xa6\x91\xb7\x4b\x91\xf1\x2e\xf7\x0f\x76\xc4\xc0\x5c\x1a\xa1\xa9\x93\xe2\xf3\xe5\x28\xab\x34\x3d\xd2\x36\x81\x62\xf4\x03\x6a\x61\xa1\x3a\x88\x04\x5d\xcd\xef\xa8\x5d\x68\x53\x22\x75\xbc\xf5\xb8\xf5\xf0\x0e\xfd\xea\x99\x9a\x95\x78\x31\x75\xd9\xee\x95\xa9\x25\xd4\x8a\x54\x49\x34\xd8\xc6\xb2\x62\x22\x5b\x6e\xbe\xa3\x54\x15\xdd\x44\xdf\x1f"}, -{{0x1a,0xbc,0x0b,0x9a,0xa0,0x1d,0xc5,0x7c,0xa5,0x3e,0xfe,0x73,0x80,0x96,0x2b,0x1a,0x88,0xd5,0x0a,0x96,0x4f,0x5c,0xd9,0x86,0x40,0x98,0x2c,0x74,0x39,0x3f,0x29,0x26,},{0x8d,0x4f,0xd1,0x43,0x94,0xd7,0xc1,0x40,0x57,0x00,0x30,0x69,0x83,0xfb,0xf7,0x6e,0xa9,0xf1,0x71,0xb1,0x5a,0x6b,0x56,0x61,0x2a,0x1f,0xeb,0x1c,0xbd,0xae,0x5d,0xd5,},{0xf7,0x38,0xaf,0x2d,0x3e,0x29,0x0b,0x3d,0x23,0xd9,0xaf,0xf7,0x41,0x4b,0xfc,0x5f,0xfa,0x47,0x23,0x5d,0xc0,0x53,0x68,0x7a,0x8b,0xa5,0xc8,0x54,0x1b,0x85,0x11,0xf7,0x81,0x56,0x6c,0xda,0xa1,0x30,0xe0,0x67,0x7d,0xb5,0x5f,0xa8,0xbe,0x9d,0x81,0xa0,0x92,0xcb,0x58,0x92,0x3a,0x86,0x28,0x49,0x4d,0x2f,0x62,0xd9,0x5c,0x16,0x71,0x00,},"\xda\x2d\xd9\x40\xd5\xe1\xdb\x6e\x80\xbf\x7e\x2b\x78\x2e\x7e\x74\x5c\xd4\xfd\x25\x2e\x98\x15\x17\x97\x58\x87\xdd\x05\xac\x77\xed\x83\x7d\x08\x29\x61\x57\x5e\xfe\xdf\x30\x1f\xdf\x24\xb7\x07\x18\xb9\x91\xb8\xd9\x2b\xdd\x2e\x6b\xee\x17\xc8\xaa\x4b\xc6\x94\xa7\x27\xbc\xfc\x78\xfd\x85\x19\x5c\x42\xca\xf8\x83\xa2\xc3\x8d\x16\x1c\xad\xd7\x9c\xfd\xa9\xa3\x91\x10\xe1\x26\x4d\x30\xbd\x4c\x5c\x4a\x58\x76\x77\x7f\x23\x3b\x07\x1b\x1b\x0b\x40\x89\x35\xf0\x46\x89\x54\xcc\x74\x4a\xf8\x06\x3b\x00\x4e\xde\x56\xcd\x98\x1c\x4d\xd5\x60\x8a\xbf\xfe\xae\xc9\xe5\x8f\x3f\xaf\xaa\x67\x14\x67\x80\x4b\x7f\xa2\x55\x8f\x4f\x95\x17\x42\x01\xf1\x83\xd8\x0a\x59\x14\x06\x5f\xed\x53\x11\x5b\x41\xeb\xc3\x38\xf7\x8d\xf0\x50\x05\x3b\x8a\x4e\x75\xea\x7c\x6f\xdc\x35\x4d\xad\x27\xbf\xd8\xa2\xe6\x6f\xcd\x7a\xe2\xf5\x87\xd2\x4b\xe0\xd4\xa3\x3d\xa3\x0a\x22\x0e\x51\xbc\x05\xfa\x4e\x41\x2b\x95\x9f\xd9\x5d\x89\xea\x6e\xc0\x16\x25\x16\xc0\x96\xa9\x43\x3a\x9e\x7c\xf5\x99\xc9\x28\xbd\x53\x05\xc2\x17\x3b\xf7\x49\x3e\xd0\xc1\xc6\x03\xcd\x03\xf0\x82\xcc\xe4\x42\x37\xa7\x9f\xfd\x8b\xe9\xa6\x72\xc2\xeb\xaa"}, -{{0xcb,0xff,0xce,0x2c,0x9b,0xd3,0xe2,0x3e,0x40,0x6e,0x5f,0x66,0xe6,0x32,0xdc,0xfa,0x72,0x66,0x54,0xd2,0x9a,0x95,0x5c,0xec,0x98,0x31,0x73,0x23,0x5f,0xa3,0x59,0xd0,},{0x49,0x65,0x3e,0xdd,0x64,0xa5,0x5f,0x7c,0xd4,0x0e,0xaf,0x3f,0x8e,0x72,0xeb,0x96,0xdb,0xcd,0xee,0x39,0x8f,0x34,0x81,0x7f,0x2c,0x95,0x86,0x79,0x49,0x71,0x0b,0x14,},{0xe7,0xce,0xd4,0xfa,0x2a,0x7d,0xff,0x73,0xf1,0x06,0x8b,0xba,0xd0,0xec,0x9a,0x11,0x09,0x04,0x3c,0x97,0xa6,0x2e,0xff,0xa1,0x48,0x87,0x6f,0x09,0x69,0xed,0x4d,0xc6,0x08,0xe2,0x8b,0xce,0x79,0x7a,0xf3,0xb8,0x25,0x32,0xc9,0x4d,0xec,0x4d,0x68,0x11,0xb7,0xf5,0x63,0x67,0x91,0x29,0xfa,0xcf,0x17,0xbb,0x73,0xd6,0x93,0x75,0xeb,0x05,},"\x1f\xfd\xe6\x82\x6e\x4f\x0c\x24\xa7\x96\x1f\x19\x1e\x74\xcc\x0b\xbc\x92\x8e\x3f\x1a\xec\x3e\xfa\xb3\x27\x65\xc2\x50\x1c\xbc\x16\x20\xe7\xee\x6f\x61\xfc\xcf\xb0\x0c\xfc\xa9\xfb\x98\x14\x3b\x52\x9b\xcc\x8c\x3d\x0f\xdf\x89\xee\x7c\x34\x2f\x10\x18\x15\xfa\xbf\x7d\xea\xf9\xf3\x02\xa2\x88\xfe\x17\x58\x26\xd5\x90\xd9\x9e\xe6\xfd\x92\xda\x74\xf9\x59\x6b\x78\x3c\x0e\x7d\x47\xd7\x11\xa3\x2f\x39\xea\x41\x65\xe5\x21\x24\x31\x44\x1b\x49\x8c\x6b\x70\xdb\x3b\x09\xd1\xf4\xe4\xa1\x4a\x6b\xae\x39\xda\x50\x88\xbb\x85\xb3\x28\x5c\xe9\xdf\x2f\x90\x68\x1a\xf2\xc7\x4d\xec\xe4\x39\xae\xb9\x1e\x1c\x1b\x07\x12\xed\xdb\xee\x8d\x72\x56\x98\x28\xf3\x7c\xb7\x20\xc5\x09\xd0\x2a\xec\x47\x60\x70\x48\x4e\x9b\x16\xec\x71\x79\x94\x7a\xc9\x6c\xaf\x0e\x1b\xe8\xb6\xb7\x4f\x37\x2d\x72\x35\xfe\x6e\x39\x99\xdf\x73\x3b\xcc\xd4\x82\xdf\xe2\xe6\x31\xf5\x6b\x58\x26\x67\xdc\xe5\xe3\x12\x17\x63\xad\xfa\xcf\x3b\x18\xcf\x20\x95\xf7\x39\x4d\xee\x49\x27\xfc\x2b\xea\x6b\x58\x24\xd9\x0c\xd5\x9e\x85\x4e\xc5\x87\x2b\x45\x51\xb0\x2e\xfa\xba\x5a\xd5\x4a\x9b\x7a\x8f\x6d\xe5\xd7\xcd\xa5\x82\x5b\x32\x5b\x07\x6d\xed"}, -{{0x9f,0x91,0x23,0x14,0x97,0x48,0x4c,0xab,0x39,0xb9,0xe2,0x0f,0x86,0x11,0x81,0xd3,0x97,0x90,0x85,0x77,0xbb,0xb2,0x96,0x82,0x42,0xd0,0x71,0xbc,0xa4,0x81,0x3f,0xfb,},{0x88,0x24,0xbc,0x6c,0xd6,0xa6,0xf1,0x5a,0x5f,0x41,0x66,0x8f,0x2b,0x3b,0xae,0x8f,0xc4,0x96,0x73,0x83,0x07,0x8d,0x08,0xb5,0x1d,0x6d,0x1b,0x2b,0x93,0xa1,0x07,0x1f,},{0x0a,0x1c,0x70,0x6d,0xd8,0xa1,0x30,0x77,0xab,0x18,0x38,0x6c,0x65,0xfa,0x97,0xcf,0x9d,0xfc,0x43,0x54,0x2d,0x18,0x46,0xec,0xbd,0xde,0xb7,0xb3,0xc9,0x3f,0x3c,0x66,0xf3,0xcc,0xd0,0x44,0x7a,0xac,0xdd,0x4d,0xad,0x8f,0xbf,0x73,0x6c,0x4f,0xf9,0xdb,0xdb,0x62,0xbf,0xc1,0x4d,0x88,0x83,0xe3,0x85,0xbc,0xe9,0xba,0xc5,0x6a,0x35,0x0c,},"\x21\xd4\xfb\xc9\x81\x63\xc3\xfb\x6e\x09\xf7\x75\xc2\xab\x7b\x18\xb1\x87\x92\x34\x0b\xaf\xed\xac\xb4\x96\x05\x62\x2e\x3c\x08\xaa\x3b\x2b\x8d\x0e\x09\x02\xf3\x61\xaa\x1c\x0f\x65\x2e\x27\x32\xb1\x0a\x0c\x5c\x6a\x05\x09\x89\x96\xb5\x88\x26\x7c\xc8\x95\x1a\x78\xb5\xd4\x31\xe7\x22\x2b\xbb\x50\x8e\xee\xf1\xb5\xe8\xb8\xd0\x1d\x39\x91\xe1\x8d\xdd\xc6\xca\x8d\x22\x2e\xf1\x77\xce\x62\x93\x8d\x18\x10\xee\xcf\x06\xf4\x73\x8b\x28\xf4\x40\x94\x6c\xca\xd2\xa1\x2e\x39\xd3\x86\x11\xbe\xd3\xa3\x9f\x93\x41\x9a\x17\x9e\xc2\xb1\xb5\x2d\x5f\xe5\xc8\x0c\x23\xb8\x4d\x88\x03\x75\x5f\x51\x46\x09\x2c\xc1\x99\xb4\xbd\xce\xa5\xbc\xf2\x03\x7b\xd5\x3f\xf6\x34\x66\x94\x15\x5f\x02\x7d\x8c\xe2\xba\xff\xe3\x0a\x56\x66\x59\x6c\x00\x78\x3a\xae\xad\xe9\xc7\x7f\xc8\x63\x79\x42\xec\xe0\x17\xd6\x48\x4c\x28\x99\xb1\x91\x8d\x3a\x48\x0b\xd5\x15\x76\x78\xd4\x77\x2d\x27\x1f\x9b\x99\x76\x8e\xe1\xbc\xc4\x6b\x24\x89\xae\x87\xcd\x03\x0f\x47\xd1\x33\x3c\x76\x72\xcb\x90\x2c\xb4\xf5\xfe\x74\x6e\x85\x3d\xe5\x79\x40\xba\x22\x64\xd3\xe6\x29\x64\x4d\x65\x3a\x5b\x7a\xf7\x8c\xe6\x4a\x99\x3f\x36\x25\x0f\x8c\xb7\xcb\x45"}, -{{0x1e,0x2b,0xd5,0x48,0x7c,0x5f,0x5c,0xed,0x46,0x1f,0x60,0x4d,0xcc,0xb4,0xe7,0x8e,0xb9,0x16,0x08,0xf0,0xb8,0x21,0xf5,0xaf,0xc4,0xe3,0xe5,0x34,0xf7,0x96,0x03,0x92,},{0xef,0x82,0x54,0x75,0xcf,0x20,0x51,0xa2,0x01,0x7a,0xe5,0x32,0xf0,0x77,0xd9,0x67,0x74,0x34,0x7d,0x27,0x67,0xea,0x7b,0x45,0xf9,0xc1,0xb8,0x60,0xab,0x99,0x35,0x06,},{0x4d,0x33,0xc9,0x6a,0x2e,0x3a,0x5d,0xb7,0x39,0x1a,0xdf,0x65,0xc1,0xcc,0x35,0x65,0xfe,0x76,0xee,0xaf,0xd0,0xb5,0xc7,0xab,0xb0,0xb4,0x92,0xa0,0xb5,0x1e,0x1f,0xa3,0x36,0x39,0x94,0x6a,0x24,0x3b,0x2d,0xde,0xf3,0x57,0x55,0x22,0x98,0xce,0x0a,0xa9,0x5e,0xac,0x6f,0xbf,0xe6,0x60,0x98,0x82,0x71,0x87,0x7e,0xb2,0xa7,0xda,0x18,0x06,},"\x1d\xbb\xbb\x13\xcd\xad\x88\x85\x4b\x80\x9c\xed\xed\x27\x33\x43\xd3\x06\xa8\xde\xab\xf3\xff\x02\xc9\xce\xc6\xf0\x02\xb8\xe9\xe1\x0e\xf5\xd1\xb0\xf5\x71\x1f\x33\x26\x7a\xa9\x1c\x17\x1b\x61\xe9\x60\xf7\x40\x45\x7b\x81\xd7\x51\xa4\x73\xf4\x4f\x75\x0a\x08\x0c\xab\x80\xaf\x7c\xcc\xa7\xdf\xfc\xfa\xc9\xee\x4c\x39\xdc\x85\xcb\xdf\x51\x25\x9c\xcd\x34\x70\xd9\xba\xd3\xad\x30\xf4\xee\x5d\xbd\x4f\xac\x6b\xd5\xc6\xc4\xdf\x73\x11\xa4\x70\x04\x46\x95\xa7\xe1\xa7\xe1\x85\x72\x20\x75\x88\xaf\xa5\x7e\xeb\xcd\x4d\x57\x5b\x6d\x42\x44\x57\xee\x92\x46\x5c\xe1\x86\x3e\x3c\x67\x7c\xf8\x75\xfd\xb9\x8d\x40\x78\xeb\xe7\x14\x42\x60\x80\x70\x52\x57\x71\x44\xcb\x8e\x03\x59\xaa\x42\xad\x15\x5d\x79\xda\xe3\xde\xb9\x9c\x46\x32\xc1\x91\xc7\x99\xcb\xfe\x58\x7d\x95\x47\x87\x06\x8d\x66\x3b\xdf\xc0\xfa\xb1\x33\x4f\x18\x76\xbf\x49\x8c\x4d\xb5\xc5\x3d\xb7\xb0\x20\x4e\xd5\xa5\x21\xc6\x2f\x09\xea\xca\x8d\x01\x89\xf3\xb3\x94\x14\x3f\x29\xc4\x21\xcb\x5c\x8d\x07\xbd\x75\x1b\xaf\x4c\xbe\x3b\xf4\xbe\x17\x01\xdf\x4b\x22\x07\xdf\xb2\x90\x4d\x84\xf4\xdb\xda\x51\xcb\xa5\x76\xd5\xa5\xbb\x16\xef\xe6\x98\xed\xd6\x08"}, -{{0xf7,0x8d,0xb1,0x4d,0x6d,0x1a,0x64,0x3d,0xd7,0x73,0x5b,0xaf,0x26,0x35,0x32,0x12,0x44,0xe7,0xec,0x8c,0xa7,0x2c,0x5c,0x38,0xc9,0x8c,0x80,0x9d,0xb9,0xcb,0x5a,0x55,},{0x54,0x14,0xf7,0x5f,0x52,0xf3,0x86,0x4a,0xfb,0x0c,0x79,0xc2,0xc5,0xc1,0xd0,0x6b,0x4b,0xce,0x40,0x0f,0xbd,0xdf,0x17,0xfe,0x9c,0xfb,0x2a,0x8b,0xac,0x47,0xa0,0xdd,},{0xd7,0xcb,0xd4,0x18,0x1f,0x67,0x71,0x20,0x07,0xb7,0xf0,0xe1,0x84,0x52,0xe0,0xa0,0x24,0x46,0x4d,0x9d,0xc9,0xb5,0xff,0x9c,0xf6,0x69,0xd1,0xb9,0x11,0x69,0xd7,0x57,0x32,0x62,0xf8,0x33,0x36,0xb9,0x7c,0x86,0x1b,0xfa,0xb3,0xfc,0xf6,0x69,0x22,0x3c,0xe8,0xca,0xf3,0x19,0xf2,0x1d,0x23,0xf1,0xfa,0x33,0x1a,0x2d,0x89,0xb6,0xca,0x0b,},"\x05\xca\xf1\xb8\xed\xc3\xb1\x73\xfb\xc1\xed\x29\xb9\x5e\x2b\xf0\x6d\x81\x4b\xa2\x40\x7d\x4b\x31\xc7\x28\xd0\x4e\xc2\x73\xd2\x53\x94\x42\x3a\xc7\xd4\xff\xf2\xca\x36\xee\x90\x27\x30\x93\xc7\x56\xe2\xbd\x13\xc9\x6d\x4a\x3d\xc7\xf5\xbe\x17\x59\xfc\xd3\x28\xeb\x66\xc5\x88\x2b\x58\xfa\x45\x88\xe5\xb2\xa3\x71\x3a\x41\x54\xa2\x34\x0d\x0b\x06\xad\x01\x96\x01\xb0\xe0\x28\xe4\x97\xf8\x98\x25\x6b\x02\x8a\xf9\x5c\xd8\x16\x8d\xf5\xe5\x8a\x57\xcd\x1e\xbf\xc0\xa0\xc9\x1c\xed\x61\xdb\xb4\x80\xac\xa7\xdf\x8d\xca\x91\xeb\x16\xe9\x80\x07\xcd\x2c\xd1\xa2\x04\x5b\x0e\x44\x77\xd1\x2d\x5a\x40\x72\xf3\x65\x42\x65\x67\xc9\xd6\x15\x77\xf3\x48\x5c\x8f\x46\x60\x5e\x7f\x47\x5e\xf0\x4a\x39\x48\xf6\x0d\xba\x8c\x55\x08\xd1\x4b\xfd\xdb\x9b\x11\xdd\x04\x4e\xf2\xd8\x4c\x16\xb9\xa9\x03\x8d\x8e\x78\xed\xa4\x3b\x91\x29\x7d\xf3\x5f\x43\x61\xa3\x83\xb4\x1d\x49\x67\x7a\x68\x7d\x5b\x34\x4a\xd1\xab\x0f\xc7\x30\x17\xb3\xbe\xbf\x32\x30\x6f\xb3\xfd\x7b\x3d\x50\x71\xf3\xab\x5f\x6e\x49\xaa\x15\x54\x0c\xad\x65\x03\xbe\xa7\x78\x4c\xf9\x42\x18\x01\xce\x13\x85\x83\x98\x93\x36\x2a\x97\xfa\xe1\x21\x30\x0d\x67\x83\xaf\x0f"}, -{{0x7d,0xfa,0x32,0x8e,0x90,0xa1,0xb8,0x49,0xc2,0x19,0xe3,0xda,0x83,0x2d,0xf9,0xed,0x77,0x44,0x82,0x34,0xf0,0xd8,0x9e,0xa5,0xd1,0x7a,0x3d,0x64,0xe7,0x88,0x3d,0xaf,},{0xe3,0x0c,0xe6,0xfd,0x5f,0x58,0x00,0x38,0x9a,0x70,0xcd,0x11,0x73,0x64,0xf5,0x99,0x45,0xaf,0xb1,0x80,0xf2,0x29,0x92,0x73,0x60,0xb0,0x6b,0x48,0x35,0xf8,0xdc,0x91,},{0x1c,0x61,0xd5,0x3b,0x87,0x2f,0x8c,0xde,0x59,0x86,0x09,0x68,0x2c,0x79,0xf6,0xc5,0xdf,0x00,0x7c,0x51,0x3a,0x71,0xcf,0xb3,0xa0,0x6d,0xcb,0x82,0xd8,0x5c,0x4b,0x00,0xcc,0xc4,0x0b,0x00,0xe5,0x9f,0x59,0x53,0x93,0x08,0x8b,0x4c,0xd0,0x43,0x28,0x55,0xc6,0x7a,0x20,0x7d,0xa7,0x1f,0x87,0xe7,0x2c,0x40,0x9b,0x3e,0x50,0x27,0x95,0x07,},"\xe5\xe4\x95\xd6\x63\xf4\x72\x36\x71\x45\x32\x68\x7a\x24\x30\x8f\x94\x2c\xa9\xc3\x3e\x08\x8f\x7f\x10\x6a\x5a\x72\x35\x18\xca\xcb\xbe\xf4\xa6\x8c\x93\x9a\x69\x50\xb2\xdc\x25\x89\xf8\x2d\x35\x4e\x57\x52\x72\xd4\x2b\x13\x83\xd3\x15\xab\x8a\x20\xaa\x0c\xdc\x9d\x4d\xf6\x78\xab\x3b\x26\x61\x2b\x5d\xca\x66\xe7\x1f\x9f\x3f\xa7\xd9\xe7\x31\xdc\x48\x1e\x2b\xc7\x12\x7c\xea\x3b\x62\x03\xca\x6c\xd8\x16\x2e\x90\x88\x6a\x73\xdc\x46\xc8\x3d\xde\xfc\x4b\x9e\x2d\x53\xd2\x9d\xd3\x87\xc6\x24\xe0\x8b\xd8\xd5\x3b\xe9\x28\xa4\x0a\x9a\xa8\xae\x8b\x1c\x8d\x0f\xb6\xa7\xbd\x6d\xce\x5f\x62\x31\x5b\x7a\x21\x81\xf6\x27\xf2\x56\xbb\xe7\xe2\xa9\x5b\xf4\x64\xe6\x13\x22\x04\xc1\x74\x20\x96\x29\x84\x02\x35\xb2\xc3\x99\x13\x30\x1a\x4b\x40\x32\x5d\x11\x8d\x38\x4b\xc7\xac\x02\x8c\xd4\xf1\x27\x02\xe1\x61\x19\x1b\x14\x9e\x42\x09\x05\x8a\x55\x12\x2b\xbb\x8b\x22\xb2\x46\x83\xba\x4f\x8e\x2e\x6c\xcf\xc0\x8d\xc8\xc8\xb1\xbc\xfb\x6d\x60\xbd\x8f\x06\x21\x96\x93\x3d\xf3\x19\xab\x16\x90\x6d\x08\x57\x30\xeb\xa1\x72\x0d\x4b\x02\xc6\x7d\xaf\x38\xcc\xe6\xab\xa3\x8e\x25\xd6\x8e\xf9\x5b\x2f\x52\x19\x13\xa1\xd7\x7d\x5e\xb6\x50"}, -{{0x6c,0xe1,0x3d,0x3c,0x2e,0xc7,0x1f,0xed,0x83,0x13,0x1a,0x69,0xd5,0xd0,0x30,0x31,0x4a,0xb4,0x9e,0x65,0x65,0xef,0x68,0x16,0x3f,0xff,0x09,0xac,0x5d,0x9b,0x47,0xe7,},{0x9c,0x7b,0x11,0x18,0xfa,0xb9,0x1e,0x0e,0x7b,0x19,0x2a,0x23,0xd9,0x5f,0xb8,0x77,0xcb,0x79,0x36,0xcc,0x6c,0x8a,0x33,0x05,0x92,0xf4,0x8e,0x67,0x84,0xed,0xc2,0x92,},{0x60,0x8b,0x2b,0xf6,0xf6,0xda,0x05,0xc2,0xac,0x5b,0xbf,0xd7,0x95,0xa2,0xac,0x32,0xc7,0x9c,0x74,0x15,0x3f,0x94,0x31,0xde,0xa5,0x97,0x68,0xff,0x4c,0x22,0x5e,0x3b,0x69,0x3b,0x64,0x5a,0x50,0x67,0x66,0xb8,0x60,0x85,0x0e,0xe9,0x7e,0xa4,0x30,0x32,0xb0,0x5b,0x69,0xe5,0x67,0x67,0xe8,0xeb,0x9d,0x19,0x18,0xdf,0x9a,0xfb,0xa8,0x05,},"\x10\xbb\xc3\x11\xeb\x2a\x76\x5e\x01\x67\xff\x37\x61\x8f\xf7\x0e\x13\xf0\x2d\x7b\x06\x17\xae\x4a\xc0\x6b\xef\xbb\xe1\x49\xc9\x72\xa9\x94\xf6\x80\xca\x4d\xc9\xa9\x2e\xc7\xef\xa5\x39\x97\xfa\xd3\x56\xb9\xff\x4e\xbd\xee\x62\x95\x41\xd1\xf4\xde\xa6\x2e\xd0\xd2\x49\x4f\x9c\xcf\xdf\x07\xa9\x31\x04\x91\xf6\x1c\x4b\x3e\x27\x00\xb4\xa3\xc6\x68\xd6\x78\x32\x9a\x38\xc2\xef\xf9\xd8\xcb\xa4\x31\xfb\x95\x9e\x7f\x76\x55\xbd\x0f\xbd\x77\xd5\x3b\xbb\xc2\xeb\x8d\xc5\x1d\xd7\x18\xed\x98\x72\x8a\x18\x16\x86\xbe\x12\x2b\x84\x4d\x3d\xa3\x31\xe3\x29\xd3\x95\x9b\x59\x23\xf7\x73\x43\x25\xa0\x21\x02\x6e\x27\x54\xe1\x7a\x15\x10\x8b\xe8\x01\x46\x5a\xd9\x58\xdb\xcf\x21\xdf\x89\x0c\xfe\x5d\x5b\x88\x3c\xa4\x3c\x61\xce\xdc\xcb\xdb\x58\xb8\x49\xea\x75\x37\x4f\x1e\x91\x8e\x80\x3e\x57\x7a\x5d\xc7\xa1\xc1\x79\x36\xec\xcf\xcd\x34\x81\xbd\x2b\x1e\xb0\x75\xb8\x32\x37\xca\x6f\x3c\x07\xc1\x9e\x9a\xf9\x73\x12\x67\xbe\x82\xd4\x89\x8e\xee\x96\xeb\xc9\x00\xd4\x8b\x05\x9d\x51\xb0\xdd\x41\x5b\x1c\x89\x06\x60\xa8\x8d\x25\xf5\xc5\xf3\x5d\x8e\x45\xe5\x23\xe0\xce\x33\x36\x92\x3a\xb4\x36\x70\xe3\x5c\x50\x57\xd5\x6c\x75\x88\x76"}, -{{0xd4,0x5e,0xe6,0x9a,0x5f,0x1a,0x7c,0xfd,0xd0,0x34,0x3f,0x87,0x70,0xd1,0xc6,0xbc,0x02,0x6f,0x06,0x7a,0x70,0xdb,0xe8,0x39,0xa8,0x6f,0x2a,0xa0,0x68,0xc3,0x3f,0x81,},{0xfc,0x8d,0x9f,0xb0,0xe4,0xf3,0x47,0x93,0x09,0x07,0x55,0xe0,0x32,0x80,0x96,0xe0,0x1e,0x28,0x1e,0xa3,0x51,0xb8,0xd9,0x5c,0xd9,0x11,0x6e,0x13,0x1a,0x5c,0xa5,0x4e,},{0x15,0x6c,0x51,0xc5,0xf9,0x15,0xd8,0x9b,0x8d,0x14,0x00,0x35,0x0f,0x8f,0x21,0x7a,0x5c,0x02,0xe2,0x62,0x9e,0xde,0x9f,0x4a,0x30,0xb6,0xe7,0x1d,0x1e,0xa7,0xa9,0x53,0xcc,0x6d,0xb3,0x1b,0xa5,0xc7,0x78,0xc2,0x69,0x92,0x0b,0x64,0x9f,0xb4,0x22,0x1c,0x6d,0x38,0xcf,0x2c,0xea,0x2a,0x7d,0xe3,0xad,0x42,0x3e,0x04,0xfa,0xaa,0x06,0x07,},"\xeb\x5e\xd8\xab\x79\xcb\xfe\x61\xc2\x59\x81\xb9\xd1\xd6\xb7\x0f\x10\xb6\x01\x94\xb4\x16\x1f\xe1\x7d\x11\xaf\xf1\x76\x79\x94\xaa\x08\x13\xe9\xec\xe2\xf4\xc5\xd5\x31\xb9\x9e\x8a\xdf\x18\x88\xc3\x0a\x63\x89\x3e\xb4\x51\xaa\xf5\x5a\xcd\x5a\x52\xad\x8c\x40\x1f\xaa\x88\xd6\xea\xcf\x3e\x49\x47\x05\x66\x11\x4f\xd0\xc6\xa2\x74\xe9\x54\x48\x46\xb0\xae\x9b\xfa\x12\x4d\x79\x51\xeb\x26\x71\x5e\x19\x25\x3f\xf7\xed\xc8\xa7\x09\x65\x77\x6f\x23\xce\x46\x03\x1e\x03\x4a\x20\x07\x23\xba\x3d\x11\xe1\x1d\x35\x3d\x7e\x7c\xd8\x4a\xed\xe2\x67\xff\x64\xbe\xd4\x18\xcb\x9f\x28\xc6\x1c\xd0\xf6\x3b\x6c\xe2\xec\xae\x14\xb2\x0b\xc6\xbd\xae\xd8\xc4\x28\xba\xd1\x8b\xe4\xb7\xd6\x63\x38\x36\x4a\xcd\x80\x42\xa8\x25\x6f\x25\x8a\x69\x96\x9b\x8d\x3c\xa2\xea\xb3\xae\xa3\x70\x6e\x5f\x21\xc3\xb1\xef\xcc\x25\x4a\x82\x4b\xb4\xe7\xea\x7a\xba\x88\x27\xc8\xeb\x82\x78\x6c\x66\x5a\xa9\x73\x82\x19\x31\xff\x99\x0a\x63\xfd\x34\xa7\x4a\x6d\x8c\x22\xa8\x82\xb0\xb9\x35\x15\x2c\xcb\x36\xfc\xc7\x6f\x4e\xca\x65\xd6\x7c\x86\x80\x94\x2f\x75\xdf\xad\x07\x34\x39\xc0\x91\x60\x65\xe8\x38\x77\xf7\xba\x20\x93\x03\xf3\x35\x48\xd9\xe4\x0d\x4a\x6b"}, -{{0x8a,0x76,0xea,0xab,0x3a,0x21,0xec,0x5a,0x97,0x5c,0x8b,0x9e,0x19,0x7a,0x98,0x9e,0x8e,0x03,0x08,0x99,0xeb,0x45,0xd7,0x89,0x68,0xd0,0xfb,0x69,0x7b,0x92,0xe4,0x6d,},{0x2d,0x9c,0x81,0x3d,0x2d,0x81,0xe2,0x73,0x0b,0x0d,0x17,0xd8,0x51,0x2b,0xb8,0xb5,0xd3,0x3f,0x43,0x6c,0xab,0xaa,0x13,0xe1,0x41,0xca,0x1c,0xb7,0x85,0x01,0x43,0x44,},{0xfc,0xee,0xcc,0xa4,0xb0,0x14,0xfe,0xcd,0x90,0xb9,0x21,0xb0,0xfa,0x3b,0x15,0xae,0xaa,0x4e,0x62,0xca,0xa1,0xfb,0x22,0x72,0x9c,0x70,0x26,0x92,0x32,0xc3,0x3c,0xef,0x0d,0x0a,0xee,0xa6,0x64,0x32,0xc1,0x28,0xaf,0xb9,0xa3,0x64,0x6b,0xc7,0xf0,0x3a,0x12,0x77,0x4d,0xa8,0x75,0x83,0x98,0xc2,0xa0,0xdc,0xce,0x0b,0xbb,0xf6,0x74,0x0a,},"\xc6\xc7\x8f\x2e\x20\x80\x46\x1a\xed\x9f\x12\xb4\xf7\x7c\x98\x9b\x19\x71\x67\x80\xfa\xb6\x0e\x6e\xcb\x97\x93\xb4\xbc\x7e\xd6\x9e\x5f\x70\xfa\x6b\xdb\xa1\x6e\x9b\xd3\x19\x49\x69\xee\xa6\x66\x5a\xbf\xd6\x30\xde\xee\xfa\x3d\x71\x7b\x6d\x25\x4d\xd2\x4b\xc9\x7d\xde\x21\xf0\xf2\x9f\x9e\xd3\x4b\x8b\xd7\xa0\x13\x38\x0f\x4f\x82\xc9\x84\xfd\xbd\x95\xaf\x98\x05\xb7\x44\xbc\xd9\x52\xc5\xa7\x1f\xbb\x57\xd1\x1f\x41\x1c\x18\xcc\x30\xbc\x35\x94\xf7\xad\x82\x28\xcb\x60\x99\x39\x4a\x1b\x6b\x0a\x81\x85\x81\xbd\xf9\x3c\xce\x58\xf3\xa4\xa2\x3e\x55\xdb\x3e\x69\xca\x9d\x60\xcf\xb3\xa9\x07\xfb\x68\x32\x9e\x2f\xfb\x6c\x65\xf1\xe8\x28\xd2\x81\x27\x10\x9c\x9e\x9f\xb7\x01\x60\xf2\xef\x82\xa2\xee\x9f\x9b\xd1\x70\xc5\x1e\x13\xfd\x3f\xc1\x86\x6b\x22\xc7\x9f\xe6\xd5\x10\x12\x17\x97\x9d\xbe\x27\x24\xdc\xad\x8a\x9b\xc6\x9a\xcc\x42\xc1\x12\xdc\x69\x7b\xd2\x71\xee\xa5\x50\xe9\xe5\x04\x06\xbf\xd2\x82\x45\xb8\x3b\x8f\x01\x2d\x34\xdb\x6d\xbd\xd5\x5a\xe6\xe5\x75\x74\x5c\x15\x3d\x6e\x75\x34\x90\x10\x27\xea\xdc\x2f\xcc\x33\xa5\x28\x7d\xdb\xca\x6d\x3a\xea\xb8\x97\x22\x94\xdc\x6c\x71\x2b\x99\x42\x54\x72\x77\x34\x0e\x7a\xd1\x9e"}, -{{0x18,0xa8,0xf9,0x36,0x48,0xcd,0xcf,0x47,0x13,0x36,0x30,0xaf,0x1e,0x11,0xc0,0xce,0xea,0x3d,0xe0,0x73,0x27,0x31,0x4c,0x96,0x58,0x0d,0xf7,0x75,0x59,0x7d,0x7a,0x9c,},{0x29,0x12,0xf4,0x1a,0xb4,0xc8,0x7e,0x39,0x37,0xa0,0x33,0x31,0x80,0x2c,0xba,0x87,0x71,0x6b,0x4e,0xea,0x14,0xb9,0xfb,0xa6,0xf5,0x46,0xd0,0xac,0x2c,0x09,0x73,0xdf,},{0x3b,0x77,0x39,0x4c,0xd6,0x9f,0x8b,0x45,0xd0,0x0c,0xfe,0x3a,0x79,0xa7,0x90,0x06,0x28,0xa5,0x65,0x18,0xb3,0x79,0xed,0x8a,0x11,0x58,0x1f,0xc3,0xa3,0x76,0xe5,0xd6,0x68,0x07,0xdf,0x11,0xe7,0x09,0x04,0xf6,0x96,0xc7,0x41,0xd2,0x1d,0x13,0x93,0x10,0xfa,0x1b,0x89,0xa9,0x3b,0xdc,0x4d,0x2c,0x39,0x97,0x99,0x1f,0x52,0x20,0xee,0x00,},"\x59\x20\x93\xac\x7c\xd6\x71\xd6\x07\x0b\x00\x27\xed\xac\x1f\xb0\x15\xcc\x20\x5d\x78\xbb\x60\x3f\x37\x8e\xb9\xf8\xaa\x38\x8c\xa8\x30\xdb\x3c\xb2\x34\x20\xc7\xe8\x52\xdb\x0b\x55\x24\x1e\xb8\x8a\x02\xcc\x62\x7a\xa9\x41\x43\xbe\x43\x9a\xab\x4b\xf2\x63\x47\x57\x47\x04\x06\xe8\x42\xf2\x0e\xb1\x0f\x07\x00\xe3\xc2\xda\x36\x4f\x58\x8a\x80\x00\xf2\x38\x50\xc1\x2c\xe9\x76\xf3\x26\xd2\xdf\x1b\xac\x13\xe9\x50\x20\xb4\x12\xb1\x75\xbf\x74\xbd\x7e\xbb\xac\xf3\xae\x55\xc0\xda\xeb\xb5\xc0\x10\xbf\x80\x4f\xee\xe1\xd7\xd4\x9f\xae\x05\x0b\xea\x55\x99\x6f\x53\xcf\xe1\xf1\x5a\x0c\xf2\x07\x27\xdb\x4e\xe3\x11\xc2\x60\xba\xd9\x68\x2d\x7b\x96\x5e\x27\xa9\x49\x1f\x47\x1d\x4a\x47\x3a\xff\x64\x6c\x7d\x42\x4d\x5a\x0b\xdc\xbb\x8a\x02\x33\xf4\xb3\x06\x0d\xd0\x4c\x98\xec\x98\xdf\xd0\x5e\xc7\x24\x78\x84\xe2\xd8\xe1\x52\xd4\xae\x52\xb3\xd5\x86\x5d\x9e\xfd\x67\x06\xa6\x0e\x08\x8e\x1e\x7c\x9f\x62\x45\x10\xab\xc7\xa2\x04\x5a\x2c\x7a\x75\x88\xe2\x53\x5e\x73\x19\x1d\xd5\xcf\x05\x42\x15\x63\xf5\x56\xa1\x3e\x82\x36\x67\x03\x43\xcd\x5b\xa4\xd4\x66\xe2\x45\xc4\xee\x3b\x5a\x41\xe7\x0c\x9a\x0f\x5e\x6e\xa2\xc5\x59\xeb\xe6\x1b\xa8\x1e"}, -{{0x20,0x6c,0xd2,0xb8,0x11,0x4a,0xae,0x18,0x8d,0x81,0x86,0x2c,0xce,0xc4,0xcb,0x92,0xc4,0xef,0x5f,0xc7,0x8c,0x24,0x43,0x5a,0x19,0xf9,0xed,0x9b,0x8a,0x22,0xf4,0x7e,},{0x97,0xa6,0x7a,0xc2,0x81,0x1f,0x52,0x94,0x56,0xdf,0x53,0x27,0x37,0xd7,0x6b,0xed,0x7e,0x38,0x7d,0xa8,0x3b,0xd5,0x54,0x59,0x37,0x2f,0xdf,0xb2,0x7f,0xfa,0xcf,0xf3,},{0x73,0xa4,0x0d,0x9d,0xa0,0x8f,0xb9,0x8e,0xa2,0x5b,0x67,0xe7,0x21,0x55,0x7a,0x1a,0x51,0x22,0x52,0x94,0xd3,0x16,0xb5,0x31,0x49,0xaf,0x89,0x5f,0xa4,0xd6,0x3c,0xb4,0xa3,0xf5,0x6f,0x68,0x85,0x66,0xef,0x6d,0xa4,0x2f,0xd2,0x94,0x1d,0xff,0xa0,0x6d,0x49,0x7a,0xa9,0x02,0x16,0x5d,0x50,0x21,0x3a,0x62,0x14,0x11,0x62,0x99,0xa9,0x0c,},"\x48\x0c\x48\x00\xf6\x8c\x79\xf5\xdf\xc0\xc3\x66\x6c\x0a\xc4\x29\xb3\x0f\xe0\xc5\xfe\x84\x87\x50\xdb\x21\x71\x38\x0b\x80\xc8\xe9\xfe\xc0\xa0\x54\xb1\x6d\x08\x67\x4c\xef\xe2\xf6\x4e\xc2\x8b\xb6\xb0\x59\x6b\x35\x23\x55\x75\xf1\x89\xbe\xe2\x59\xac\xa7\x66\xc2\x22\xac\x0a\x46\xcf\x2a\xf7\x57\x74\xda\x4e\x34\xa0\xb5\x4f\xc2\xac\x49\xec\x8b\xed\xf4\x88\x7c\xd9\xb7\xbe\x4f\xdb\x7f\x68\x69\x02\xdd\xfa\xb0\x46\x27\xe2\x6e\xa2\xdc\x3d\x97\xd6\x2a\x4b\x15\x46\x18\x02\x18\xed\x8f\xa1\x13\x33\x48\x19\xb5\x27\x5c\xc5\x4a\xfd\xee\x44\x30\x90\x08\x59\x65\x07\x97\x16\x75\xe6\xd8\xb8\xa8\xed\xec\x47\x18\xf2\xd4\xbd\x73\x52\x13\xcb\xbd\x18\x79\x1f\xaa\x80\x54\x17\x49\x07\xa7\xac\x17\xd7\x14\x3a\x47\x57\xe4\x93\xbe\xee\xc4\x84\x9d\x0b\x83\x6f\x18\xbb\x2b\x3c\x90\x16\xf2\x5a\xf4\x7f\xb9\x61\x99\x25\x17\x20\x54\x9f\x15\xd1\x49\x50\x3d\x41\x09\x5e\x25\xf2\x62\x09\xda\xac\x39\x15\x44\x85\xc3\xde\xd7\xcb\x1a\x8c\x3e\x83\xa5\x2f\x5a\x06\xec\x09\xcf\x83\xdf\x00\x72\x6b\x79\x68\xf6\x4c\x0c\xba\xe2\x99\x51\x2f\xb4\x38\x56\x0f\x04\xb3\xb6\x44\x34\x6f\x93\x8a\xc8\xe9\x04\x86\x61\x4c\xd8\x44\xb5\x4e\xae\x07\x8b\xf6\x78\xb3"}, -{{0x59,0xb1,0x44,0xa7,0x08,0xab,0xec,0x97,0x27,0x29,0xa0,0x4a,0x6c,0x13,0xf0,0xea,0x02,0x0b,0x4e,0xd4,0xa4,0x82,0x98,0x02,0x3a,0x56,0x89,0x58,0xc2,0x12,0x15,0xec,},{0xc4,0xf4,0x72,0x00,0x92,0xed,0x61,0x79,0xa0,0x82,0xae,0x4d,0x61,0x45,0xdf,0x37,0x71,0x78,0x6e,0xfc,0xa9,0xbd,0x9b,0xb7,0x9c,0x9f,0x66,0x67,0xd2,0xcb,0x56,0xb3,},{0x1a,0x80,0x85,0x0f,0xcb,0xd6,0xe6,0x43,0xc6,0xba,0x8e,0xb6,0x84,0xdb,0xef,0x7d,0xf0,0x15,0x15,0x92,0x28,0xda,0xed,0xcf,0x06,0x04,0x70,0x91,0x86,0x05,0x4d,0xb1,0x85,0xaa,0x7b,0xaa,0xcb,0x09,0xd6,0xca,0xad,0x01,0x63,0x8e,0xff,0x8e,0x46,0x87,0x35,0xa6,0x01,0x24,0xde,0x0c,0x53,0x76,0xe9,0x43,0x40,0xe5,0x41,0xa9,0x80,0x07,},"\x38\x57\xbd\x26\x0b\x8a\xad\x9d\x07\x3f\x06\x76\x5d\x37\xfe\x89\x3a\x3f\x53\xe2\x3d\xe8\x66\xdd\xac\x33\x49\x5a\x39\xad\x33\xee\x9e\x9d\x5c\x22\x50\x2b\xc1\xc4\xb5\x47\x0d\x0e\x3f\x3a\x58\x52\x23\xfe\x4c\xb9\x3c\xc4\xad\x2b\x5b\xa6\xd7\x88\x26\xa5\x3f\xc0\x25\x3d\xc5\x80\xa2\x01\x8c\xc9\xff\x1c\xfe\xdb\xd3\xac\x0b\x53\x29\x2d\xee\xfb\xc1\x4e\x58\x9a\xcf\x49\x6c\xb5\xf7\x67\x01\x30\xfd\xbb\x6c\xf3\x8d\x20\x89\x53\xc0\x15\xa0\x47\x46\x75\xb7\x24\xbd\x10\x9f\x7c\xb8\x9c\x33\x01\x67\x51\xfe\x7a\xa7\x85\xd0\x99\xd0\x9a\xb2\x0d\xd5\x25\x8c\xd7\x64\xac\x8d\xaf\x34\x3c\xe4\x79\x0e\xad\x08\x63\xaf\x43\x12\x1a\xa5\x27\xa3\x7a\x11\x62\x8f\x47\x86\x96\x68\xf8\xea\xc0\x0d\x80\xb6\xbf\x99\x06\x66\x3d\x7a\x28\x99\xc1\xcb\x67\x8c\xd7\xb3\xeb\x3b\xc8\x02\x26\xb8\xb1\x3b\x6e\x46\x87\x7f\x38\xf0\x7c\x3d\x9c\x86\xd3\x36\x8b\xaa\xc4\xa6\xf6\xb9\x3c\xce\xbc\xec\x98\x11\x47\x4b\x6a\x6a\x4d\xa5\xc3\xa5\x96\x65\x71\xee\xd0\x5e\xdc\xc0\xe3\xfe\x7c\xd1\x59\x15\xc9\x1f\x44\xee\xe8\xc1\x49\xae\x45\x1f\x37\x55\x18\xa7\x9f\xb6\x00\xa9\x71\xa3\x9b\x94\x33\xdf\xa1\x9f\x91\x93\x1b\x19\x32\x27\x57\x47\xc2\x62\xee\xdc\xbd\x27\xf1"}, -{{0x8d,0x16,0x21,0xee,0xab,0x83,0x27,0x0d,0xe8,0x57,0x33,0x5c,0x66,0x5b,0xbf,0x57,0x26,0xe3,0x72,0x22,0x25,0xfd,0x01,0x6e,0x23,0xbf,0x90,0xab,0x47,0xae,0xec,0x3d,},{0xbe,0xcd,0xbc,0x02,0x4d,0xae,0x6a,0x94,0xed,0x4e,0x29,0xc8,0x0f,0x2a,0xff,0x79,0x6a,0xed,0x8f,0xeb,0x2c,0x1b,0x37,0x90,0xa8,0xc7,0x2d,0x7b,0x04,0x8a,0x2c,0x61,},{0xe0,0x8d,0x6c,0xaa,0x5f,0x39,0x32,0x7d,0x6e,0x66,0x52,0xed,0x74,0xdd,0x1a,0x37,0x84,0x4b,0x97,0x9f,0x5c,0xce,0x74,0x7a,0x60,0x6f,0x56,0x79,0xf4,0x89,0x8b,0xbb,0x76,0x43,0xdf,0x7e,0x93,0x1b,0x54,0xa2,0xb4,0x0e,0xbd,0xef,0xe8,0x30,0x03,0xf6,0x1c,0xa0,0xf1,0x11,0x12,0xf0,0x23,0xc6,0xa3,0xe8,0xcc,0x18,0xca,0xfe,0x5f,0x0d,},"\x97\xfa\xcd\xdc\x82\xcc\xcc\xcf\x78\x8c\x31\xb3\x30\x5e\x93\xeb\xa9\x56\xf8\x96\x13\xe6\xe5\x35\x42\xb0\x43\x26\x7f\xee\x54\x4c\x2b\x0a\x8a\xe8\x88\x6a\x31\xb9\xd3\x21\xa6\x3c\x27\x62\x3b\xae\xfe\xa8\x40\xb2\xa8\xaf\x5b\x23\x30\x19\x3f\xfb\x5b\xaf\x87\x3c\x33\x55\x28\xaf\xea\xe2\x16\x01\x63\xc8\x51\xc5\xa2\xe5\x81\x54\xa1\xb0\x56\x9c\x2d\x13\x66\xc0\x71\x04\x37\x62\x3b\x0e\x08\xc6\x86\xe5\x4f\xc2\x79\xed\x4c\x45\xf3\xe8\x56\x86\x83\x75\xf7\x82\x24\xc7\x77\xb1\x3d\x75\xde\x10\xd7\x91\x73\x55\x24\x25\xd1\x5a\x56\x19\x04\x15\x5f\x21\x17\xb2\xf1\x47\x13\xeb\x0b\x04\x64\x8a\x3b\xde\xb3\x30\x21\x67\xd1\x97\x3e\x78\x8a\x06\xcb\x00\xd4\x8c\xcb\x26\x9f\xa7\x1a\xf8\xba\x68\xea\xe5\x5d\xbb\xfd\x95\x94\xd5\xc2\xb4\xdc\x13\xae\x03\x21\x71\x85\x61\xac\xdf\x67\xdc\x8c\xfc\xc2\x5b\xc4\x6b\xb6\x6e\x09\x6a\x19\x41\xd9\x33\x52\x07\xd3\xf7\xd1\x1e\x89\x04\x90\x4f\xab\xe3\xa5\x0a\x38\x83\xe7\x07\x80\x47\xdf\x25\x2f\x38\xb6\x7c\xd2\x8a\x6a\xc4\x5c\x7d\x7a\x1d\x2a\x1d\xe8\xd4\x57\x47\xcf\x09\x30\x1e\x01\xcd\xaf\xd0\xcd\x99\xa6\xe9\x1b\x70\x4d\x50\x9f\xce\x69\x2f\xbd\xef\x2f\x71\xa5\xce\x0b\x35\xbc\x15\xc6\x5f\x87\x68\x24"}, -{{0xf2,0x73,0x5d,0x50,0xee,0x3a,0x9a,0x65,0xb5,0x8c,0x8a,0xcf,0x55,0x16,0x63,0xe9,0x88,0x09,0xec,0x40,0x6f,0x73,0xe3,0xe7,0xf4,0xe7,0x3b,0xc4,0xea,0x92,0x38,0x74,},{0xdf,0x48,0xa5,0xb9,0x4a,0x07,0xaf,0x3c,0x2c,0x99,0xb8,0x38,0x87,0x62,0x24,0x32,0x33,0xc8,0x50,0xdc,0x17,0x53,0x17,0xd6,0x02,0x63,0x8e,0x5b,0x86,0xab,0x49,0xed,},{0x69,0x42,0xa7,0x69,0x64,0x17,0xef,0xaa,0x59,0x1b,0x95,0xe1,0x1f,0x02,0xd7,0x63,0xbe,0xf5,0x27,0x9b,0x93,0x2a,0x8e,0x2a,0x7c,0xbb,0x9f,0x58,0x36,0x95,0xc1,0x4c,0xe5,0xcc,0x55,0x6b,0xec,0x66,0x79,0x9b,0x33,0xcb,0x59,0x2d,0xa4,0xdf,0x27,0x35,0xf9,0xee,0xf2,0xc3,0xce,0xca,0x43,0x62,0x16,0x4b,0x6c,0xc9,0x3d,0xa4,0xe1,0x05,},"\xae\x31\xe9\x4e\x71\x97\xe4\xe4\xd0\x23\x93\x48\x02\x5e\xd6\x68\x1e\x51\x3c\xe1\xa6\xe0\xaa\x0e\x5b\x97\x93\x73\x91\x21\x50\xef\x11\x3e\x50\xef\x05\x69\xc4\x83\xf7\x56\x8c\x4b\xbc\x47\x03\xc5\xda\xca\xa8\x0a\x0d\xe4\xe7\x38\x38\x3f\xa1\xf1\x0d\x6d\x40\x71\xa3\x1b\x99\xe6\x48\x51\x43\x97\x23\x16\xc8\x65\x22\xe3\x7c\x68\x87\xa1\xc3\x07\xb2\x9b\x0d\xd6\xf9\xf1\xb4\x38\x31\x0a\xf9\xd8\xd7\x34\x6f\xb4\x1f\x9b\x2d\xd2\xe8\x0b\x14\xc4\x5e\xb8\x7d\x4e\xd4\x8e\x37\xa5\x26\x0b\x52\x25\x7b\x3e\x99\x78\x7a\x13\xc5\x53\x92\xba\x93\x0c\x08\xe0\x24\x0e\x96\x0d\xef\x0c\x29\xb8\x55\x07\x45\xcf\x14\x9d\xee\x53\xa5\xd1\x74\xec\x06\x5d\x2d\x66\x77\xde\xe1\xfc\x42\x05\x70\x62\xc3\x4e\x27\xea\x5d\xbc\xdb\x86\x1b\x9f\x67\x0c\x60\x32\xc7\x84\x6c\xec\x8e\x87\xa7\xc9\x52\x0e\x27\x96\x7b\x01\x86\xee\x71\xb7\x7e\xd6\xd0\x29\xbb\xdd\x70\x94\x9c\xec\x4a\x70\x93\x29\xfa\x37\xfe\xe0\x02\x49\x0c\xc1\xbc\x4c\x2d\xf6\xf7\x63\xf9\x85\x8f\x33\xd7\x50\xc5\xb5\x05\xa6\x7e\x23\x70\x63\xc0\x48\x6f\x94\x56\xd3\xc6\x20\xd9\xac\x7c\x98\xf1\x38\x1d\xe0\xef\xfe\x41\xc1\x82\x59\x50\x4a\x15\x0d\x68\xa6\xa2\x8b\x0a\x3e\xea\x80\x3b\x85\x53\x15\xc9\xe0"}, -{{0xca,0xd9,0xd2,0x1a,0x01,0xc7,0xe1,0xd1,0x5d,0xf2,0xfb,0xd7,0x9c,0x51,0x6e,0xb8,0xc3,0x40,0x1e,0x9f,0xe2,0x84,0x67,0xcc,0x7b,0x21,0x67,0x9d,0x4e,0x33,0x1a,0x3d,},{0xa7,0xb5,0x5c,0x15,0xd6,0x79,0x0b,0x40,0x53,0x6f,0xca,0xe5,0xad,0x28,0x92,0xcd,0x66,0xb1,0x86,0x89,0xf4,0x99,0xc1,0xfd,0xee,0xa6,0x6d,0x4a,0x7d,0xf3,0x94,0x24,},{0x31,0x92,0x7d,0x01,0xdb,0x9f,0x24,0x72,0xf4,0xdf,0x6f,0x63,0xc1,0x8e,0xbd,0x83,0xc2,0xb1,0xaa,0xf8,0x8d,0x58,0x0e,0x84,0x88,0x54,0xdf,0x8c,0xba,0x63,0x95,0xd3,0xda,0x7b,0xd6,0xbb,0x9e,0xdc,0x1f,0xce,0x1c,0x7d,0x7e,0x13,0x60,0x55,0x8f,0xcd,0xdf,0xa9,0x39,0x15,0xbe,0x07,0x6e,0xfb,0x8e,0xa2,0xdc,0x5e,0xa7,0xb2,0x0d,0x0a,},"\x70\x70\x2b\xf1\x9c\x91\x9f\x98\x36\xde\xfd\x7b\x84\x6f\xd9\x99\x2d\x8b\x7e\xb2\xe1\x06\xae\xb7\x1e\x60\xa3\x1b\x4e\xa2\x5a\x41\xb2\x12\xdc\x7d\xe7\xc9\x1c\xbd\x61\x3d\x58\xd0\x59\x5d\xb8\x33\xcf\xe7\xe5\x05\x84\xf2\x55\x69\x60\x2c\x77\x44\xfa\x67\x5d\x15\x6d\x0f\x63\xcd\x2b\x7c\x08\x9c\x8a\x00\x68\x6a\x43\x71\x69\x82\x6a\x12\xdc\x48\x5b\x38\xc0\x68\xa8\x00\x71\x42\xe5\x16\x37\x47\x01\x1a\x07\xa4\x15\x68\x36\x22\xab\x1e\x23\xce\x57\x7c\x73\x2b\xa1\x4f\x40\x1f\xbc\x30\x43\xe0\x69\x3a\x92\x05\xc1\x9a\x92\x29\x8a\x3d\x9b\x08\xfb\x7a\xfa\xfa\xe0\xa9\xf0\x16\xbc\x75\x0e\xe6\x31\xa5\xf5\xda\x5d\xb6\xf9\xba\x26\x92\xc7\x4c\xaa\xae\xb4\xd0\x97\xe9\x0e\x3c\x02\xd2\xe3\xa7\xfb\x3a\xa0\x00\x04\x0b\x7c\x17\xb7\x45\x64\xe6\x46\xbe\xa1\x6b\xad\x61\x1e\xbc\x08\x59\xa3\x82\x88\x04\xab\x4f\x5c\xfb\xa4\x17\xd2\x54\x51\x5c\xa3\x62\x0a\x3a\xd6\x83\xc4\x6c\xa6\x26\x7b\xb4\x95\x39\xbb\x30\xe3\x69\x08\x7e\x67\x43\x8e\x94\x89\x56\x27\x50\xdc\xcb\xa3\xaa\x0b\x1b\x0a\x6c\x26\x70\x32\xd2\x0c\x2a\xdb\x75\xe6\x8d\xf1\x12\x3b\x52\x59\xbf\xe4\xea\xc6\xca\xdc\xa6\x77\x81\x38\xa3\x73\x18\xad\xb3\x0e\x8d\x66\x9f\x3b\xc9\x69\x2c\xc7\x4b\x68"}, -{{0xd9,0xbe,0x84,0x22,0x55,0xe9,0xa1,0x6b,0x0a,0x51,0xa8,0x67,0x42,0x18,0xce,0xe7,0xcd,0x9a,0x8b,0xdf,0x34,0x35,0x08,0x39,0x7f,0x4d,0xdb,0x05,0xf3,0xfa,0x00,0x82,},{0x79,0x31,0xbc,0x6d,0xfa,0x33,0x24,0x94,0x3a,0xab,0x18,0x3d,0x12,0x85,0x51,0x59,0x19,0x39,0x9f,0xfe,0x0b,0x71,0x06,0x77,0xf0,0x91,0x5d,0x3a,0x5b,0xe5,0x1e,0x92,},{0xc9,0x38,0x45,0x65,0x8c,0x95,0x60,0xd2,0xc0,0xe2,0x8f,0x28,0x2a,0xdb,0xd4,0x65,0x2b,0xaf,0xd3,0xbb,0x2e,0xde,0xc1,0x7c,0x94,0x87,0x8f,0x7b,0x94,0xd3,0xc7,0x7a,0xfe,0xc9,0x06,0xed,0x29,0x2a,0x8d,0xfb,0xf5,0xf8,0xe7,0xc1,0x18,0xe8,0xf2,0xca,0x33,0xdd,0xa7,0x90,0x9d,0x9b,0x69,0x5b,0x8f,0xf5,0xa1,0xc0,0xe9,0x7a,0xc8,0x07,},"\xac\x6c\x55\xb1\x34\x66\x3e\x41\xf0\x2a\x6d\xcb\x85\x49\xea\xa1\xc0\x13\xf5\x96\x58\xd8\x1d\x81\x2f\x95\xb7\x40\x09\x51\x37\x23\x67\x19\x45\xe1\x32\x4f\x90\xf8\xa3\xf9\x71\x36\x91\x81\xb5\x87\xba\xb4\x56\x65\xf7\x88\xd6\x63\xab\x78\x14\x0c\x5a\x22\xc1\xc1\x8d\x4a\xfe\xdc\x74\x48\xa7\x48\xaf\xe5\xbf\x23\x87\x00\x3c\x1d\x65\xab\x18\x48\x2e\xf9\x89\x22\xb4\x70\xda\x80\xad\x14\xc9\x44\x95\x1c\xe4\xae\xd3\x73\x90\xcc\xe7\x9a\x8e\x01\xb2\x4c\x7d\xfc\x11\x41\xc0\xec\xa2\xc7\xf7\x73\xed\x4b\x11\x80\x6a\x34\x61\x55\x13\x48\x6e\x4e\xe1\x1a\xf0\x80\x78\xa1\xb4\x05\x4c\xf9\x88\x02\x98\x60\x8d\xd9\xb3\xfa\xa1\xa2\x42\xa4\x52\xfe\x51\x16\x04\xb3\x10\x2c\x31\x3d\x14\xcc\x27\xc6\xf0\xf8\x47\x1d\x94\x55\x53\x17\xea\xa2\x64\xcd\xf5\x2c\x69\xe1\x8f\x46\x1e\x47\x90\x3d\x21\x29\x87\x16\xb1\x72\xee\x9c\xb1\x78\xf0\x8f\xf2\xd3\xc9\xc1\x62\x12\x1c\x2e\xd2\x1d\x87\x34\xb2\xf0\x63\x0d\x39\x91\x46\xcb\xf7\x6e\x02\x8a\x14\x3f\x2b\xf7\xbb\x50\xaf\x0f\x57\xb9\xba\x80\x21\xd2\x64\xb0\x0c\x66\x62\xf8\x4c\x86\xcb\x6d\x59\x52\xb3\xd2\x41\xf7\xdc\x3e\x70\x0c\x96\x61\x6c\xbc\xfb\x0d\x0e\x75\x3f\xfd\x5d\x21\xee\x32\x0e\x65\xe9\x7e\x25\xcb\x86\x09"}, -{{0xcf,0xc4,0x8c,0xc6,0xf6,0x58,0x11,0xfe,0x7d,0x7b,0xba,0x85,0xd1,0xcd,0x84,0x85,0x8f,0xd6,0xf7,0xed,0xd6,0x38,0xf4,0xf5,0x52,0x36,0x3e,0xe7,0x68,0x5f,0x69,0xca,},{0xd2,0x9c,0x10,0x69,0x4c,0x5e,0x8e,0x3f,0x34,0x47,0xed,0x78,0xd3,0x4d,0xbd,0x74,0xa2,0xb3,0x01,0x37,0x3b,0xa8,0x71,0xb5,0x85,0x0c,0x33,0x3d,0xff,0x7b,0xf8,0xd0,},{0x80,0xc5,0xd5,0x1e,0x96,0xd1,0xca,0xc8,0xef,0xd3,0x45,0x98,0x25,0xe7,0x9c,0x1e,0x9f,0x65,0xaf,0x70,0x1d,0x1d,0x29,0xe1,0xf9,0x5b,0x03,0x67,0x07,0x11,0x3b,0x77,0x98,0x4b,0x7b,0x33,0x50,0xf0,0x40,0x77,0x33,0x3c,0x95,0x7f,0x8f,0xbc,0x7d,0x9b,0x04,0x0c,0x36,0x26,0x51,0x41,0x7b,0x98,0x99,0x02,0x7c,0xd3,0x3e,0xdb,0x11,0x03,},"\x8e\x7d\xef\xb9\xd1\x6d\x03\x6b\xd6\x42\xcf\x22\x6e\x32\x77\x3e\x60\x53\x61\xc5\xec\x4b\x95\x12\x55\x78\x8d\xb0\xa0\x42\xc6\x3e\x5a\x43\x67\xd6\x15\x24\xf1\x0e\x62\x58\x99\x13\x25\xa3\x9a\xb6\xb0\x36\x12\x26\x0c\x3f\xe3\xdf\x20\xb3\x42\x02\xd3\x43\x95\xbd\x4e\xd4\x0b\xd6\x13\x73\xdf\x78\x1a\x4c\x8b\xcf\xbd\x15\x30\x10\x60\xf0\x74\x37\x73\x23\x33\xd8\xe4\x97\x36\x32\x2d\xee\x6b\x22\x43\x8e\x78\x7d\x88\x56\xb7\x0c\x26\xec\x57\xd6\xda\xde\x9c\x3c\x28\xe2\x72\x20\xc5\x67\x0e\x39\x35\x44\xed\x09\x59\x37\x29\x8d\xc3\xad\xc7\x38\x65\xf7\x77\xe9\x00\x37\xbd\xef\x83\x47\x16\x47\x6d\x78\xf4\xe6\xcb\x49\x61\xa4\xc6\x8a\x8a\x83\x63\x38\xa9\xf5\xda\x17\x9c\x4d\x5e\x93\xc3\xf7\x0d\xd3\x5e\xec\x70\x96\x53\xdd\x8d\xe3\x79\x96\xb1\x20\x56\xd4\xee\xfc\xb4\xb6\xb3\xc1\x3b\xa9\x84\xd8\x32\x27\x5c\x43\x86\xeb\xf4\xa8\xff\x7f\x07\x8b\xe3\xd4\x28\xc1\xe0\xd9\xb1\x62\x38\x1f\x06\xa5\xb7\xbb\x12\x70\x40\x03\xd9\x1f\x25\xd1\xd8\xfd\x43\x62\x6c\xe7\x0f\xff\x59\xd2\x92\x77\x68\xa7\x6b\xf7\xf9\xef\x76\xff\x95\x48\x9f\x38\xed\xcd\x1c\x9e\x9b\x8a\x8b\x0e\xf6\x6c\x32\x80\x57\x76\xd5\xae\x9f\xbd\x84\xa7\xaf\x4f\xa6\x56\x3e\xc7\x0a\xc5\x73\x3a\x44"}, -{{0x15,0xc9,0xf7,0xc4,0xd8,0x4a,0x5a,0x47,0x90,0x41,0x95,0x2e,0x6a,0x8c,0xac,0x24,0xe7,0x6f,0xd2,0xd2,0x75,0xc1,0x97,0xe6,0xb5,0x21,0x92,0x9b,0x43,0xba,0x6c,0x5d,},{0x86,0x33,0xc1,0x82,0x9d,0x29,0x09,0x1d,0xf7,0x1f,0xd5,0xc0,0xef,0x64,0x05,0x72,0xe4,0xb6,0x49,0x74,0xcd,0x09,0x7d,0xbe,0xbb,0xcd,0xde,0xba,0x04,0x16,0x47,0xc0,},{0x1e,0x36,0xbe,0xa5,0xa5,0x83,0x76,0x7e,0xbd,0x80,0x30,0x6c,0xab,0x23,0x31,0x55,0xb7,0xb4,0x28,0x14,0xb4,0x34,0x73,0xcf,0x45,0xcd,0xc5,0x03,0x9c,0x93,0x97,0x44,0xa9,0x69,0x4b,0x87,0x22,0x0d,0xaf,0x4c,0xcd,0x29,0xf2,0x5c,0xea,0x40,0x5e,0x7c,0x08,0xdb,0x2e,0xf1,0x7f,0x3f,0x03,0x4d,0xbb,0x49,0xcf,0xf6,0x02,0x83,0xe3,0x06,},"\x11\x73\x0d\xd4\x5d\xda\x80\xd8\x4d\x08\x0d\x92\xe9\xbd\xda\xee\xa6\x87\x8e\x4a\x0b\x3b\x51\x2d\x9e\xa7\x33\x80\x8e\x1c\xef\x51\xd4\x90\x48\xd6\xc7\x81\x16\xa4\xbd\xe3\xc6\x4a\xce\xaa\x52\xbe\xca\x86\xb3\x31\xab\x59\xe9\x18\x5c\x70\x28\x6a\x02\xbb\x5d\xd0\x4f\x5c\x7f\x4e\x9c\x7e\x44\x5e\x77\x45\x85\x65\xf1\x59\xc7\x83\xdf\xd4\xd9\x76\xa9\x10\xe9\x37\x78\x9d\x21\x41\xd4\x16\xed\x3a\x7f\x60\x8d\x26\x73\x7a\x86\xb2\x0b\x62\x4e\x3c\x36\xaf\x18\xd2\x5c\x7d\x59\xb8\xd7\x42\x7e\xc6\xc4\xd3\xd4\x38\xd7\xae\x09\x49\xdd\x7d\x74\x8c\x1f\xfd\x6f\x28\xe8\x28\x5d\x44\x04\x22\xd2\x2a\x37\x61\x20\x2e\x95\x84\xf5\xcd\xb3\x50\x45\x47\xaa\x4b\x68\x57\x30\xc9\x82\xcb\xa2\x13\xde\x08\x02\x0a\x5e\x4e\x46\xa9\x5f\xac\x4b\x48\x1b\xea\x0b\x63\x0a\xbd\x03\x0d\xdd\x33\x5a\x20\xfe\x2c\xf7\x09\x4a\xef\x48\x13\x95\x69\x91\x91\x3c\x68\x21\xf4\xb5\x41\x0d\xf4\xf1\x33\xfe\x63\xe2\x2c\x08\x09\x2a\x0a\x65\x97\x27\x22\xa2\x7a\xe4\x20\x11\xa8\x07\xc3\x27\xb4\x17\x23\x7c\x54\x01\x14\xee\xcb\x9f\x0e\x96\xcd\xa5\xdc\xf0\x24\x6f\x1d\x27\x17\xf4\x9b\x9c\xea\x9d\xc6\xa3\xda\x9b\x39\x6f\x02\x70\x52\x92\x26\xf5\xdc\xba\x64\x99\x91\x8a\x6c\x28\x9f\xe0\x55\xfe\xc8"}, -{{0x6d,0x2d,0x0d,0x82,0x3f,0x29,0x47,0x46,0xb9,0xa5,0x51,0x2e,0x14,0xe7,0x3c,0x1d,0x85,0x5b,0x5e,0x4b,0xca,0x65,0xfe,0x81,0x77,0x29,0x81,0x0c,0xc5,0xef,0x84,0x0d,},{0x1b,0x64,0x80,0xa6,0xa9,0x0d,0xfb,0x47,0x29,0x84,0x85,0x5c,0xef,0x6f,0x1a,0xb3,0x1e,0xb7,0xb3,0xf1,0x3c,0x8a,0xc0,0x0f,0xa5,0x56,0xd2,0x0b,0x53,0xe5,0xae,0x17,},{0xb5,0x15,0xf4,0x9e,0xb3,0x2a,0xd4,0x78,0x69,0x2d,0xf8,0x8f,0x07,0xb7,0x80,0x2c,0x6e,0x0e,0x53,0x27,0xaa,0x08,0xa6,0x36,0x6e,0x4c,0xb1,0xd1,0xe2,0x6f,0x9e,0x65,0xfc,0x81,0xab,0xeb,0xe2,0x21,0x5d,0x64,0x91,0x00,0xf2,0x75,0x98,0x27,0x3a,0x41,0x2b,0x62,0x4e,0x84,0x2d,0x81,0x30,0x40,0x37,0x97,0xe5,0x7d,0xec,0x97,0x5a,0x0a,},"\x87\x72\x72\x1f\x72\xea\xf7\xf7\x30\x40\xc0\x68\xa7\xc3\x75\x3b\xff\xca\x7d\xc2\xd0\x93\x0c\x65\x25\xf4\x25\xe6\x00\x5c\x25\xcd\x4c\x0f\xf5\x09\x5c\x9c\x61\xa5\xd8\xa1\x96\x7b\x8c\x86\x01\x0c\x88\x4e\x50\x9e\x6b\x16\x70\xf7\x90\x46\xe2\x29\x79\xeb\xd3\x54\x73\x40\x90\xd3\xad\xa2\x14\x35\xc1\xf8\x25\x4f\x7b\x52\x22\xcd\x55\x64\xf0\x64\xe9\x77\x64\x03\x66\x44\x9f\x4e\x50\x08\xf8\x70\xf9\xc4\x84\x05\x65\xbf\x4f\xb5\xf5\x74\xc9\x77\x4b\xa2\x56\x8e\x71\xa9\xcc\xd8\x2f\xfc\x59\xb6\x94\xf2\x6e\x7d\xe4\xce\x2e\x3f\xd8\x80\xa0\xee\xf3\x87\x93\x13\x33\xed\xe0\x0d\xcb\x06\x5e\x6d\x0f\x79\x59\x1a\x2a\xa9\x56\xdf\x19\x48\xa2\x65\xcb\x95\x75\x0d\x8a\x23\x3b\x15\xc2\x88\xa0\x54\x87\xc5\x15\x66\x3f\x93\xe7\x40\xfb\x15\x70\xfb\xe4\xbd\x80\xc6\x8e\x8d\x92\x97\x34\x5a\x8a\x01\xcd\xbd\x88\xf4\xa3\x9b\xed\x9c\x5e\xf0\x9f\x14\x4b\xce\x5d\xe5\x68\xbf\x37\x33\xbc\x53\xb2\x03\x9a\x29\xcb\x3e\x19\x45\x01\xad\xc1\xc1\x0e\x86\x38\x3a\xac\x8b\x0f\x85\xc6\x7a\x66\x89\xbb\xe1\x47\x0a\x39\x24\x76\x31\x34\x39\xca\x88\xd9\x8c\x02\x1c\x0e\xae\xc2\x5f\xb2\xf9\xa1\x60\xce\x5c\x78\x61\x70\xbe\x02\x38\xfb\x87\x85\xdd\x33\xbf\xa9\x05\x9a\x6c\x37\x02\xd0\xde\x05"}, -{{0xc0,0xcf,0x79,0x9a,0xf7,0x39,0x5b,0xf2,0x7b,0xaf,0xa3,0x6c,0xab,0x43,0x70,0x45,0xe3,0x9c,0x90,0x3b,0xf8,0x07,0x54,0x83,0x19,0xce,0x44,0xf2,0x87,0x49,0x4f,0xbb,},{0xaf,0xbf,0x55,0x0c,0xa2,0x90,0xc9,0x05,0xbd,0xd9,0x2f,0xc8,0x83,0x1e,0xbe,0x3d,0xfe,0xb6,0xda,0xae,0x4f,0x56,0x00,0x52,0x53,0xcc,0x50,0x95,0x1e,0x50,0xed,0xc2,},{0x5b,0xba,0x01,0xa4,0xc7,0xb2,0x55,0x42,0xd0,0x69,0x12,0xde,0x70,0xaa,0x1e,0x22,0x04,0x23,0xfd,0xf8,0x33,0x8a,0x9e,0x69,0x33,0x95,0xcb,0x6f,0x0d,0xc1,0xfb,0xfd,0x01,0x8e,0x3c,0x77,0xe5,0x0a,0xef,0x90,0xa9,0x08,0x0f,0x30,0xf1,0xf5,0x79,0x2b,0x24,0x31,0x07,0x8f,0xe6,0xe3,0xe0,0x04,0x64,0x24,0x5e,0x17,0xcd,0x8d,0xc1,0x07,},"\xdb\xe6\x57\x80\xe9\x68\xde\x9e\x40\xff\xb5\x7c\xf5\x9a\x60\xfd\x93\xb3\xf9\xa5\xe7\xd8\xed\x51\x80\xad\xbc\x57\x8c\xa1\xbc\x48\xbd\x9f\xb6\x0a\x13\x24\xc9\xc2\xc1\x14\x14\x79\xa0\xdc\xf0\xf1\xd0\x7e\x84\x93\x65\x26\xdf\x42\x33\x3c\x0d\x77\x3e\x3f\xed\x9e\x40\x38\xde\x5b\x95\xad\x90\x5c\x92\xcb\xe0\x40\x48\x7b\xf5\x5e\x10\xe1\xed\xb4\x29\xa0\xec\xc4\xe0\xe8\xd0\x0a\x98\x8a\x9c\xd5\x3e\x2e\xb3\x72\xf4\xfc\x4c\xd9\x53\x7b\x26\x9b\xa3\xa2\x3c\xef\xbc\x8d\xf6\x47\x6e\x75\x43\x4b\x81\xd9\x3e\x88\x91\xbf\x41\x7c\x82\xe3\x63\xf3\xe4\xab\xf8\x0a\x4f\x73\xac\xa8\x4a\xc7\xdf\x63\x37\xf5\x36\xd6\x3d\x93\x9d\x92\xcb\xa6\x4b\xe7\x42\x22\x11\x16\x06\x9e\xf2\x51\xab\xba\x0b\x00\xaf\x01\x71\x8b\xb5\x80\xdd\xbe\xb7\x99\x73\xef\x10\xa6\x8b\x4d\x0f\xa0\x23\xd6\xeb\xd3\x07\x9d\x6b\x32\xa1\xaa\x20\xa2\x1e\x92\x02\xf2\x75\x90\xc3\xf0\xc0\xcc\x25\x30\x73\xc3\xf8\x22\xaa\xc4\x59\xd3\x9f\x50\x75\x8b\x70\xc0\x07\x10\xa3\xc9\x84\x38\x41\x65\x08\x52\x2e\x51\x2a\xda\xa0\xaf\xd5\x03\xa7\xce\xb0\x4f\xb9\x4a\x4a\x93\x2c\xe8\x0c\xd5\xa7\xf1\x1b\xb8\x61\x26\x3f\x58\xe5\x74\x9d\x54\x2a\x11\x0d\xe7\xc7\x68\x9d\xfc\xb0\xc5\x1a\xfa\x9d\x54\xa5\x8f\xf8\x9f\x3f\x67"}, -{{0xcd,0xaa,0x50,0xe8,0x52,0x7d,0xc7,0xa5,0x0f,0xb3,0x7e,0x28,0xfa,0x8b,0x95,0x68,0xc3,0x7e,0x85,0x67,0xe0,0xb4,0x99,0x99,0x7b,0x9a,0xed,0x67,0x61,0x80,0xc3,0xb0,},{0x7c,0x56,0xe1,0x64,0x51,0x02,0x68,0xc1,0x82,0xb4,0x23,0x74,0x79,0x04,0xf1,0xd3,0xa5,0x80,0x93,0x30,0xf6,0xe1,0xb2,0x92,0x66,0xec,0x46,0xe7,0x3b,0xe1,0x55,0x0f,},{0x13,0x7b,0xd1,0x0a,0x50,0xef,0x60,0x93,0x84,0xfe,0x66,0x87,0x68,0xfb,0x87,0x1d,0xe7,0x41,0xca,0x0f,0x53,0xff,0x84,0x77,0xd7,0xeb,0xfa,0x90,0xaa,0xfd,0x5e,0x26,0x81,0xfd,0xf1,0xb8,0x92,0x50,0x46,0x3c,0x15,0xdb,0x8e,0x17,0xa5,0x88,0x25,0xfe,0x94,0x27,0xde,0x08,0x9c,0x34,0xde,0x13,0xcd,0x07,0xbb,0xa1,0x8d,0x4a,0xa4,0x0d,},"\x94\xfc\xfb\xaa\xa3\x03\xde\xce\x7b\x90\x8f\x87\x4c\xc5\xf0\x95\x06\x1f\x17\x54\xbb\x35\x78\x0d\xb6\x66\xb6\x3a\xb8\x29\x08\x11\xbf\x1c\x52\x1a\x7f\x8f\x78\x5e\xa2\x70\xdf\xb3\x9d\x0d\x6e\xd9\x5a\xb7\x19\x55\xa1\x1f\xfa\xea\xa2\x68\xe0\x81\xff\x3e\x4f\x24\x25\xb4\x18\x80\xa9\x87\x15\x1e\x67\x8e\x89\x11\x13\x50\x94\x2d\x82\x0c\x3e\xec\x36\x21\x24\x26\x66\x3b\xe1\x75\xe5\x28\x6b\x4a\xd1\xcc\x80\x4e\x3e\x3a\x03\xb9\xfa\x3e\x82\x83\x8e\xbb\xc2\x61\x5a\x64\x5f\x2c\xa1\x46\x8a\xc4\xa1\xcd\xbe\x52\x37\x61\xe8\x3f\x43\x81\xb0\xc8\x55\x0a\xe5\xe8\xc8\xcd\x1f\xda\x57\x19\x14\x36\xe2\x7c\xb8\x83\xbc\x64\xbe\x86\xa9\xdc\x61\x10\xef\x34\x01\xd8\x8a\x7d\xeb\xd1\xb7\x01\xd9\xc2\x57\xa6\x82\x6c\xf0\x1e\x9e\x29\x22\xe3\xae\x57\x7f\x28\x34\x27\x5f\xb0\xec\xda\x80\xed\x8c\xf1\x80\x1e\x0b\xc5\xe0\x1e\x26\xa7\x7c\x48\xbd\xf4\x6a\x5c\x48\x94\xd2\x2a\xb5\x3e\x74\x18\x27\xe2\x4b\xed\x5f\x07\x50\xff\xad\x05\xe5\x3f\x1d\x5e\x61\xdf\xd3\x16\xb1\x91\xd9\x79\x7e\xf7\x13\x13\x1a\x8b\x43\x0a\xbe\x3f\xac\x5f\x3c\x4a\x2c\xa0\x21\x87\x8b\x15\xad\xc8\xc5\xf5\x42\x11\x42\x60\xe6\x87\xa9\xd1\x99\xd2\x30\xc4\xe0\xd3\xfc\x69\x69\x93\xb5\x9c\xcf\xa3\xff\xa9\xd8\xd2\xfb"}, -{{0x0f,0xde,0xa9,0xbe,0xe6,0x28,0x8f,0x94,0x7e,0x0a,0xdb,0xdd,0xa4,0xdf,0xb2,0xba,0xa0,0x38,0x91,0xaf,0x25,0x02,0x4a,0x5e,0x13,0x8a,0xc7,0x79,0x84,0xd0,0x05,0x07,},{0x70,0xab,0xd8,0x64,0x30,0xd7,0xe8,0xd6,0x32,0x09,0xc8,0xb3,0x73,0xec,0x4e,0x4b,0x79,0xe9,0x89,0xe6,0x72,0x5f,0xac,0xef,0xba,0xde,0x3c,0x75,0x74,0xd2,0x3c,0xd0,},{0x80,0xc4,0x2d,0xd5,0xdf,0x03,0xb2,0x85,0xa8,0x6a,0xc9,0x5c,0xe6,0x66,0x9f,0x78,0x6a,0x97,0x8a,0x81,0x3a,0x9d,0x7b,0x8c,0x6a,0x23,0xde,0x76,0xfb,0xd0,0x9b,0xdb,0x66,0xc5,0xdd,0x1c,0xc9,0xf1,0xa1,0x76,0xcb,0xa3,0x88,0xd5,0x05,0x17,0x64,0xa3,0x2f,0xa2,0x7f,0x00,0x28,0xba,0x48,0x98,0x06,0x8b,0xd0,0x1a,0x3e,0xe1,0x72,0x08,},"\xcf\x72\xc1\xa1\x80\xa2\xbc\x37\xd8\x47\x8d\x9a\x7a\x39\xac\xf0\x3b\xf2\xa5\x07\x90\xf7\x90\x2f\x81\x12\x12\x22\xd3\x1d\x3e\xc9\x16\xf4\xf2\x4c\xef\x9d\x7c\x41\xdc\x02\x1b\x0e\x84\x87\xbb\x89\x2e\x47\x30\x5e\x54\x52\x03\x03\xe8\x9b\x30\xb2\x63\xda\xc4\xa9\xba\x37\x5d\x46\xc4\x0f\xcf\x40\x05\x35\xc9\x59\xd2\xb7\x46\xa7\xfc\x97\x0c\xf6\x5b\x47\x2e\x84\xb5\xf1\xd0\xeb\xad\xcf\xa1\xae\xd6\xfc\x47\xfa\xcc\xe1\x6a\x36\x6a\x3b\x1d\x6e\x51\x68\x13\xc1\x96\x09\x75\xf8\xf2\xb4\x30\x42\xfb\x4e\xea\xab\xe6\x3c\x6f\x65\xdb\x45\xdd\xb7\xdb\x88\x8a\x19\xa9\xd7\xba\x6c\xa4\x79\xfc\xd7\x0c\x5d\x1e\x97\x0f\x12\xc1\x4f\x4d\x24\xfb\x7e\x2f\x35\x7b\xd3\xa9\x4a\xa1\xb8\x68\xcc\xc0\x84\x7f\x2e\xef\x21\x85\x3e\x25\x3b\xaf\xbf\x07\xc4\xe6\x17\x6a\x1e\xf0\x77\x16\x78\x41\xeb\xbe\x56\x29\x33\x71\x57\xf3\x9f\x75\xc7\x1d\x21\xe7\xe9\x6c\x51\xa1\xb1\x6f\xa8\xdc\x60\xf0\xb1\x27\x9f\xcd\xa2\x64\x1f\xc8\x59\x1e\x3c\x49\x2f\x15\xbf\x83\xca\xf1\xd9\x5b\x2c\xd9\x13\x32\xf1\xb4\x20\x2f\xe7\x28\x62\xca\x2e\xa2\xef\x92\xc1\x1d\xb8\x31\xd8\x2f\x8f\xc3\xd4\x1f\xe2\x9a\x76\xc2\x11\xa7\x58\xe2\xf7\x1b\xd8\x9d\x2c\x66\x10\xf2\x01\x42\x9f\x34\x8d\x56\xe1\x0e\x3b\x7a\xf5\x3e\x27"}, -{{0x03,0xd5,0xe4,0x66,0xf8,0x29,0x8a,0xb5,0x43,0x8a,0x30,0x97,0x6d,0x13,0x22,0xa7,0x21,0x5a,0x64,0x2d,0xd5,0xfb,0x4c,0x3f,0x85,0x19,0x40,0x9a,0x75,0x22,0xf0,0x92,},{0x4b,0x3e,0xd4,0xdb,0x08,0x0e,0x2a,0x45,0x2e,0x16,0x91,0x2c,0x14,0x50,0x44,0x24,0x92,0x0a,0x60,0x97,0x56,0x04,0xe4,0xf3,0x79,0x25,0x8d,0x1c,0x8b,0x19,0x3d,0x6f,},{0x6d,0x7e,0x46,0x58,0xf2,0x6f,0x33,0x7c,0x98,0xe0,0x3f,0x13,0x54,0x2e,0x2f,0x39,0x44,0x0f,0xf7,0xbf,0x8d,0x88,0xf3,0xf6,0xdf,0xa4,0xd6,0x49,0x48,0xcd,0x96,0xb7,0x90,0x51,0x49,0x2f,0xc2,0x8f,0x65,0xf2,0xcc,0x0d,0x23,0xa0,0xc4,0xd5,0xe2,0x30,0x7b,0xb1,0xc4,0x7e,0x11,0xe5,0x3b,0x37,0x1f,0x09,0x1b,0x69,0xf8,0x0d,0xbd,0x05,},"\x1b\x47\xb7\x00\x13\xcb\x53\xe1\xf8\xf4\x97\x1e\x0f\x39\x56\x3c\xe8\x7e\xdb\xc2\xce\xdd\x99\xe5\xa3\x55\x85\xdf\x8b\x00\xa8\x52\xf7\xb9\xc9\x7c\x7e\x4a\x54\x65\xfc\x56\x05\xae\x8c\x5c\x36\x57\x0a\x99\x20\x1a\x7a\xd6\x03\x12\x87\xef\x0c\x7b\x2b\xa6\xe5\x7b\x05\x6d\x0f\xc8\xd6\xca\x43\xbf\x6c\xbd\xab\x09\x89\x34\xb4\x03\x19\x7b\x52\x5d\x22\xd4\x5e\x6b\x29\xc7\x8f\x8d\x61\x83\xe4\x1f\xfe\x19\x7d\xae\x25\xba\x22\xb0\x66\x69\xae\x05\xba\xdd\x7e\x1d\xa6\x93\x2a\x7d\x05\x4c\xba\xb3\xf5\x4e\x51\x46\x22\x3a\xd8\x67\x12\x31\xbc\x16\xfe\x62\x67\x9b\xd2\x81\x7a\x6b\x80\xe6\x53\x99\x8c\x49\x49\xf8\x1f\xf5\x3b\x61\x73\x16\x3e\x11\xda\x3e\x6d\x3c\x76\xd8\x4c\x71\x32\x25\xb4\x17\x3d\x6b\xf0\x6a\x85\xb6\x98\x8a\x48\xbe\x43\x59\xcb\x51\x55\x03\xca\x56\x3f\x43\x53\xf8\xe7\xd4\x5e\x4d\x94\x46\x2c\x89\xa0\x4a\x00\xf1\xb3\xb0\xca\x64\x22\xd5\xdb\x02\x9c\x50\x7d\x46\x48\x34\xa2\x0c\x78\xa7\x13\x66\x1d\x84\xed\xff\xc4\x96\xd6\x92\x82\x61\x98\x94\x43\x7b\x44\x87\x95\x4c\xbe\xa2\xaa\x72\x61\xe6\xa6\x2b\x68\x51\x15\x4a\x5d\x25\xfb\x6b\x4f\x09\xc5\x94\x73\xd3\x85\xce\x03\xe9\x1b\xa8\x65\xea\xb6\x6c\x58\xc0\xab\xb0\xb7\xa7\x8e\x4b\xe9\x27\xe5\x54\x60\xcc\xd7\x0d\x82"}, -{{0x76,0xcc,0x18,0xa1,0xda,0xff,0xfa,0x10,0x05,0x86,0xc0,0x6a,0x7b,0x40,0xf7,0x9c,0x35,0xfe,0x55,0x8c,0x33,0x9c,0x29,0x99,0xa5,0xf4,0x38,0x75,0xcf,0xad,0xe0,0x3e,},{0x4b,0x9d,0xa8,0xd2,0xf1,0x37,0xdc,0x6c,0x85,0x7a,0x99,0xa5,0x99,0x8d,0xd8,0x9d,0xd5,0xf0,0x59,0x71,0xa2,0x1e,0x8c,0x77,0x66,0x70,0xeb,0x47,0xbc,0x12,0x70,0xa5,},{0xdb,0x74,0x75,0x1c,0x66,0xe6,0xb1,0x86,0x60,0x44,0xdd,0x9a,0xe9,0x9f,0x19,0xe6,0x33,0x4f,0x17,0x9e,0x79,0xd8,0xb8,0xe0,0xc8,0xcd,0x71,0xd2,0x2c,0xef,0xb9,0xea,0xb7,0xe3,0xe7,0xa9,0xc2,0xda,0x22,0x5f,0x2a,0x9d,0x93,0xa3,0x13,0xd1,0xcb,0xf1,0xb7,0xfe,0x25,0x97,0xb8,0xd7,0x02,0xbf,0x30,0x17,0xa6,0xa6,0xbc,0x7b,0x7b,0x06,},"\x45\x22\xb1\xd8\x23\x73\xf7\xa3\x18\x22\x1e\x7e\x57\x61\x75\x03\xdd\xf4\x4f\xd5\x39\x97\x52\x2a\x1d\x96\x3c\x85\xb7\x08\xd0\xb2\x45\xde\x37\x2a\xd5\x2e\xc7\xf5\x4f\x62\x13\xd2\x71\xf7\xc9\x1d\x5a\x1d\x36\xd1\x34\xdb\x38\x9d\xf0\xb0\x81\xa0\x6b\xc0\xc7\xa4\x87\x5f\x72\x40\x92\x79\x31\x72\xc9\x11\x56\x41\xc6\xd0\x54\xf1\xd9\x92\xe0\xfa\xe4\xdf\x58\x69\x5f\x0e\xa3\x44\x9d\x7a\x4b\x3a\x88\x57\xe1\x98\x03\xfe\x49\xb6\xd5\x2c\x9f\xf3\x74\x6a\x57\x4a\x27\x56\x95\x65\x79\xf9\xfb\x80\x9a\x0e\xde\xc9\x2c\x55\xe9\x5f\xfe\xfa\x3d\x05\xf1\x65\x82\x2f\x46\x4a\x21\x99\x9f\x29\x69\x1f\x67\x44\xac\x5a\x3e\xe4\x90\x17\x88\x06\x45\xe8\x37\xed\xeb\xfd\x2e\x0f\x24\x99\x7f\x04\x11\x45\xa7\x2e\x23\x76\xad\xa2\x83\x18\x6c\xa2\xb8\x36\x36\x29\x77\x19\x5b\xae\xe3\x0a\x3a\xcc\x81\xb2\x43\xf3\xee\x37\x6a\x2c\x47\x64\xc7\x83\x66\x7a\x4b\x11\x77\xe7\x95\x1d\x3e\x3c\x7b\xe4\xf1\xbd\x7a\xe8\xc6\x0f\xd5\xfb\x0f\xd9\x1f\x0c\x1c\x14\xd0\xd2\x32\x7e\x8f\x20\xd9\x2c\x0d\xfc\xc5\x38\x70\xe9\xd9\x9f\xdb\xf9\xdd\x9a\x17\xe8\x82\x50\x9a\xe7\xba\xa8\x65\x3e\x39\xed\xc8\xee\x56\x90\x00\xd6\x24\xcb\x93\xa0\x75\x4a\x79\x8d\x1f\x81\x1f\x6a\x0e\xf5\x50\x1a\x17\xbc\xf2\x5f\xd0\xf9\x16\x26"}, -{{0x71,0xad,0x98,0x0d,0x58,0xad,0x8e,0x7d,0x33,0x30,0x66,0x89,0x35,0x89,0x36,0xa3,0x72,0xd5,0x19,0x0b,0x24,0xec,0x7f,0x9b,0xde,0x74,0x9c,0xb8,0x11,0x50,0xef,0xda,},{0xfd,0x35,0xa7,0x5f,0xe5,0xab,0xc2,0x01,0x04,0x69,0x1a,0x24,0xa4,0x65,0x94,0x40,0xb5,0x5a,0xea,0xea,0x90,0x2a,0xc3,0xbe,0x27,0x4a,0xf2,0x7a,0xa8,0x31,0x28,0x69,},{0x81,0x67,0x0b,0x10,0x29,0xe4,0x81,0xe9,0xff,0x3c,0x17,0x1f,0x05,0xc1,0x68,0x61,0xc8,0x46,0xee,0x79,0xcd,0xf2,0xe2,0x1e,0x3b,0xf9,0x52,0xbc,0xfa,0xc9,0x75,0x65,0xf2,0xb1,0xdc,0xed,0xf6,0x9d,0x2e,0x7e,0xb3,0x5c,0xaf,0x56,0x62,0xe8,0xbc,0x67,0x1f,0xbb,0x96,0x75,0x6a,0x63,0xa5,0x96,0x26,0x4d,0x1b,0x7f,0x4a,0xf9,0x7e,0x06,},"\xe8\x7a\xe0\x73\xff\x5d\xcc\x54\x85\xa1\x99\x40\xe4\xe3\xff\x26\x3a\x06\x18\xa9\x02\x5a\xd4\x03\x2d\xfb\x36\xd1\x71\xce\x88\x1f\x71\xc1\x8a\x49\x21\x0e\xb4\x58\x19\x80\x61\x42\xe2\xf0\x0d\xb3\x04\x18\x35\xbf\x2c\x3b\xcc\xf1\xdb\xa0\x2b\x8b\x5a\x5b\xda\xf8\xfe\xa3\x16\xc0\x62\x3d\xd4\x8a\x56\x4e\xc1\x66\xf0\x37\xd5\x87\xc8\xc0\x16\x84\xe5\xe5\xc0\xba\x9d\xba\x4d\x23\xb4\x9a\x03\x09\x24\x4e\x28\x2a\x51\x40\x86\x22\xed\xb0\x57\x04\x74\x7e\x0c\xde\xec\x97\x68\x93\x77\x70\x71\x09\x89\x72\xc1\x13\xa8\xab\x63\x9c\x31\xf1\x61\x32\x33\xee\x46\x0e\xea\x8a\x8c\x10\xe1\xe6\xe1\x52\x21\x45\x29\x87\x8c\xf1\xad\xae\xaf\x78\xcf\x19\xba\xc7\x13\x61\x81\x5b\xf5\x79\x55\x49\x8f\xab\x4f\x0f\x2b\x75\x86\xc8\x6f\x9f\x4c\x2d\xdf\x89\x72\xf9\xb9\xe0\xeb\x63\x6d\x84\xbc\xc1\x43\x85\xb2\xd0\x38\xbe\x55\xa9\x63\x70\x2e\xfe\x22\x5a\x50\xbd\xd0\xc4\xda\x92\xa2\xa6\xa0\x91\x00\xea\x04\xa2\x11\xd3\x96\x45\x8d\xce\xb4\x48\x71\x16\x83\x7d\x13\x9e\xb0\xf1\x22\x53\x8e\xd3\x98\x6a\xd0\xaf\x4d\xa2\xdf\xfc\x89\xf3\x26\x9c\xa8\x85\x38\x08\x6e\x69\x1e\x5b\xea\xe9\x58\x1e\x7c\x63\xd8\xe6\x12\xda\x2c\x47\xf7\x4d\xde\x1d\x94\x95\x1e\xad\xb0\xdf\x60\xc3\x89\x7d\x2a\x30\x95\xc5\x06\x09\x3b"}, -{{0x61,0x59,0x4e,0x24,0xe7,0x5f,0x99,0x6b,0x4f,0xb6,0xb3,0xe5,0x63,0xf6,0xa4,0xf9,0x91,0x5c,0xfa,0x65,0xdd,0xb1,0x99,0xb0,0x1f,0xed,0x7f,0x8e,0xd7,0x82,0x4e,0xcb,},{0x86,0x27,0xd2,0x14,0x15,0x79,0xcd,0x25,0x21,0xaa,0x07,0x68,0x00,0xac,0x35,0x4b,0x9e,0x3a,0x47,0xd7,0x1c,0xed,0xc8,0x54,0x74,0x34,0x26,0x82,0x25,0xe3,0x30,0x05,},{0x63,0x02,0xb3,0xff,0x27,0x10,0xbe,0x30,0x6c,0x92,0xb9,0xaa,0xe3,0x0d,0x23,0xc3,0xd4,0xbe,0xff,0x39,0x4e,0x63,0x20,0x1e,0x6a,0xd1,0x17,0x13,0x34,0x5c,0x4f,0xcb,0x5c,0xc8,0xd3,0xdd,0x10,0xad,0xfb,0x82,0xbb,0x11,0xa1,0x89,0xce,0x7e,0xc3,0xe4,0x22,0x27,0x27,0x62,0x4f,0xc1,0x78,0x81,0xc1,0x47,0x88,0xd2,0x71,0x0e,0x16,0x08,},"\xbc\x01\xb0\x8c\x7c\xaa\x23\x61\x00\xa0\x12\xa7\x26\x47\x7d\x0e\xc3\x89\xdb\xfa\xda\xc7\x3d\x51\x06\x42\x4c\x5d\x1f\x3d\x1c\xef\x16\x95\xcf\xd9\x3a\x70\x62\xec\x8b\xf1\x06\x70\x47\x85\x49\x20\x16\x2f\x65\x13\x57\xbe\xdf\x1c\xd5\xa9\x2e\xc2\x9b\xdb\x5d\xff\x71\x6e\x8f\x60\x25\x51\x5a\x95\x49\xba\x36\xcd\xc3\x5c\xed\x7c\x5c\x0c\x36\x8e\x6c\xd9\x2f\x2f\x10\xae\x14\x6a\x20\x72\x8c\x37\x4b\xba\x50\x96\x41\xce\x88\xcb\x42\xff\xf0\xce\xdf\xd9\xfd\x67\xf3\x10\xf9\xd0\x1a\x3f\x36\x90\xeb\x21\xdb\x17\xbc\xe6\x7a\xe3\x5c\x4c\xd2\x4c\x20\x9f\x09\xf0\x44\x75\x9d\x8d\x5a\x7d\x24\x8e\x2b\xd9\x66\x52\x4b\xa8\xc0\xc2\x89\x74\x72\x6b\x43\xbd\x05\xde\x84\x34\x33\xcc\x40\x05\x98\x92\x29\x74\x62\x3d\x9a\xcb\xfd\xc7\x61\xc4\xc0\x43\x75\xa9\x52\xce\x54\xca\xff\xaa\x96\xac\xff\x6d\x9d\xc2\x78\x74\x2a\xf4\x76\xe1\x86\x5c\xb8\xc2\x0d\x13\xd1\xc1\x90\x08\x63\xbc\xa2\x31\xe4\x4c\x6b\x0d\x47\xcb\x41\xd5\x10\xf7\x95\x8f\x48\xf3\x04\xd0\x3d\xa0\x33\x48\x4a\x3e\x1f\x27\x3f\xaf\x69\x83\x37\x5b\x7d\x3b\xe0\x3d\x8a\x0a\x00\x2d\xef\x63\x65\xbe\xb2\xfa\x8c\xcf\x1a\x94\x98\x7a\xdc\xd3\x3d\x0d\xa1\x17\x7f\xc5\x15\x9b\x6e\x56\xd0\x04\x30\x1e\x92\x1d\xbc\x12\xec\x0a\x73\xf4\x13\xcf\x2c\x48"}, -{{0x54,0xe6,0xbb,0xfb,0xf8,0xc0,0x6f,0xf2,0xc0,0x66,0x31,0x8c,0x2e,0xbf,0x03,0xd5,0x06,0x54,0x7b,0xf4,0x3c,0x2d,0x7a,0x5d,0x4d,0xf3,0x05,0xa3,0x03,0x2b,0x71,0x38,},{0x3b,0x71,0xaa,0x1d,0xef,0x66,0x6d,0x91,0x88,0xf4,0x03,0xf8,0x2e,0xd3,0x04,0x54,0xab,0xa5,0xbc,0x9f,0x47,0x0f,0x6e,0xb9,0x88,0xda,0x18,0x7c,0x92,0x52,0x32,0x84,},{0x3d,0xf4,0xd0,0x90,0x79,0xf8,0x30,0xe3,0xf9,0x82,0x28,0x36,0x81,0xba,0x37,0xb5,0x0f,0x3c,0x73,0xde,0x2c,0x5d,0x22,0xa2,0x91,0x35,0x8e,0xbb,0x1f,0xb8,0x54,0xe5,0x10,0xf6,0x3f,0x9a,0x48,0xe9,0xff,0xf7,0xfd,0x83,0x11,0x30,0x2e,0xa3,0xe9,0x69,0x39,0x4e,0x6d,0x49,0xc9,0xe3,0x18,0x20,0x54,0x94,0x2f,0x6a,0x74,0x4c,0xee,0x03,},"\x03\x18\xd7\xcb\x48\x05\xaf\x98\x21\xdd\x3f\x91\x4b\x0e\x07\x6f\xea\x04\xa7\xd2\xdb\x3a\x59\xa0\x0a\xff\xea\xd3\x32\x5a\x2b\xe4\x0c\x1f\x87\xf5\x32\x76\xa8\x55\x26\x04\xf2\x28\xb9\x76\xe2\x88\xb9\xbe\x90\x6a\x7b\xd2\x5b\x2f\xfa\xb8\xa8\xaf\x5d\x0f\x6e\x08\x78\x6f\xd0\x34\xe2\xfe\x1e\xb7\xee\x03\x39\x79\x86\x0d\xd1\xe5\x32\x72\x87\xe9\xe6\x15\xf5\xdc\x5a\x96\x0f\x17\x02\x6b\x56\x84\x2f\xc8\xd4\x4c\xad\x00\x2e\xdc\x85\x01\xcf\xb9\x56\x00\x15\x02\xe4\xdd\xc8\x1a\x77\x00\xd9\xc0\xbe\x88\xeb\x4a\xaa\x64\xa6\xcb\xc3\x9d\xe8\x2f\x13\xc1\x10\x86\xde\x1a\x42\x70\xd3\xaf\x97\x28\x4b\xac\x1c\xae\xf1\xd3\xed\xaa\x10\x71\x66\x6b\xd8\x3b\x2e\xde\x39\x62\xd9\x8b\x9d\x93\x49\x7d\xdf\xd8\xe9\x7d\xab\x30\x89\x95\x0c\xf3\x0e\xd1\x1d\xb7\x7a\xd1\x43\x7a\x0a\xf5\x88\x9d\x8e\xfc\x44\xe6\x12\x42\x0e\x39\x07\x26\x7d\xf3\xac\xff\x4b\xd3\xfb\x6e\x8c\xa5\xba\xdf\x8e\x72\xf9\xde\x39\x52\x86\x53\x05\x85\x24\x45\x6a\x81\xda\x5f\x84\x98\x2a\xfa\xc3\x4b\xef\x5f\x71\xe9\x1f\x8f\x90\x93\x8a\x6f\x5f\x1f\x28\x77\x16\xde\x56\xa0\x94\x6d\x26\x1e\x87\xbc\x77\x5c\xe1\x89\xe4\x1a\x77\xba\xed\xe7\x32\x0a\x3c\x60\x8f\xc9\x71\xe5\x5d\x0a\x77\x3c\x4d\x84\x8d\x42\x86\x37\xf1\x1b\x4e\x44\x60\x39\x0c"}, -{{0x68,0x62,0x06,0x1b,0xe0,0xde,0x9d,0xfd,0x99,0x81,0x18,0x20,0x4b,0x2b,0x98,0xdb,0x3c,0xe7,0xd7,0xe8,0x19,0xdb,0xc1,0x07,0x94,0xaf,0x0a,0xb2,0xb0,0x6e,0x84,0x34,},{0x9c,0x5f,0x7c,0x22,0x65,0xdd,0xe1,0xb2,0x5e,0x4f,0x27,0xec,0x71,0x58,0x0d,0x52,0xdc,0x89,0xf2,0xc3,0xa7,0x12,0xbc,0x1a,0xd5,0xd6,0xd6,0x9e,0x71,0x1e,0x08,0xd4,},{0x96,0x5e,0xdb,0x34,0xe8,0xab,0x8b,0xc3,0x20,0x4a,0x32,0x01,0xd2,0x21,0x86,0x37,0x2d,0xe4,0x24,0x26,0x00,0x29,0x7c,0xfd,0xb5,0x7a,0xa1,0xdf,0x07,0x4e,0xc5,0x0d,0xdf,0x10,0x10,0x5e,0x9d,0x4c,0x89,0xa2,0x66,0xc3,0x4d,0xb7,0x77,0x2a,0xa9,0x4c,0xba,0x94,0x64,0x29,0xe6,0x8b,0xa6,0x2b,0xf9,0xa0,0xac,0x90,0xf5,0xf0,0x5b,0x02,},"\x17\x40\xdd\xe8\x43\x4a\x0d\x68\x99\x25\x67\x9b\x0c\x18\x03\x00\xcd\xbd\x0c\xf6\xa8\x9a\xd8\xfd\xe3\x46\x53\x31\x6c\xee\x4c\x57\x1a\x41\x05\xc9\xe9\xe0\x28\x42\x38\xfe\xf2\xc3\x8a\x09\x15\x7c\x5d\xb9\x43\x40\x57\x1b\x39\x0a\xdf\xb6\x9f\xf4\xc0\xdc\x50\x53\x25\x3a\x67\x9d\x42\xcc\x1f\x1b\xf1\xff\x42\x92\x29\xea\x0a\x50\x44\xc6\xf7\x95\x64\xe0\xdd\x28\x7f\x53\xf0\x15\xb8\x31\x87\xd9\xad\x27\xd9\x10\x39\xaf\x06\x2c\x43\x7b\x15\x75\xa0\xea\xb6\xae\xb8\xaa\x0d\x27\xb2\x76\x65\xd6\xde\xa9\x04\x1f\xf9\x96\x3a\x31\x18\xb3\x29\x8a\x85\x44\xe3\xfd\x69\xac\x68\x77\xe3\xe4\x05\x2f\xe4\x42\x2b\xf0\x35\x60\xb2\xc5\x7e\xc5\x31\xee\x8b\x5f\xf5\x3c\x28\xdb\xde\x35\xbb\x45\xc3\x50\x77\x63\x6e\x6f\x84\x1b\x59\xd7\xeb\x77\xbc\x77\x91\xb6\x09\x38\x58\xa3\xa8\x0a\x3a\xa6\xd7\x78\xdb\xf5\x3d\xb9\xd0\x61\x19\xc5\x0b\x71\xc7\x91\xc0\x49\x5c\x57\x6d\x1b\x59\xd3\x96\x87\x3e\xd8\x71\x48\x53\x52\xc8\x29\x9a\x35\x9d\xa5\xee\x9d\x7f\x36\xed\x14\x55\xf8\x98\x51\xa3\x08\x51\xbe\xa7\x19\x68\x5a\xec\xd0\x8f\x25\x56\x26\x09\xdd\x10\x66\x30\x73\x52\x77\xe1\xd6\x51\x9b\xb1\x68\x7d\xe8\xb8\xc6\x8b\x96\x71\x45\x2e\xdb\xb3\x49\x1d\xa2\x64\xcd\xfa\x00\x17\xc5\x12\xd2\x76\x97\x59\xcb\x92\x5f\xb6\x64"}, -{{0xb2,0x25,0x0b,0xbc,0xb2,0x68,0xd2,0x47,0x7c,0x83,0x12,0xb1,0x90,0x0f,0xd9,0x99,0x82,0xba,0xa2,0x9a,0x68,0x97,0x4f,0xbf,0x87,0x78,0xa1,0x22,0x8d,0xc9,0x75,0x50,},{0x44,0xaa,0x8d,0xf1,0x18,0x16,0x74,0xb0,0x5a,0xde,0x98,0x0f,0x7e,0xdd,0xba,0xf3,0xbd,0x74,0x22,0xa9,0x20,0x28,0x7c,0xb2,0xd2,0xdb,0x59,0xa0,0x63,0xee,0xbf,0x74,},{0xf2,0xb8,0xd9,0x2e,0xd5,0x1e,0xbd,0x10,0x00,0xbf,0x9d,0xd3,0x41,0x1a,0x9f,0xa9,0xe7,0xae,0xe5,0x4c,0x4c,0x86,0xe2,0x4a,0xd0,0xf9,0xad,0x5c,0x55,0x64,0x3a,0x12,0xd6,0x80,0x01,0x9c,0xa0,0x3f,0x21,0x6b,0xd4,0xbd,0x32,0xc9,0xce,0x1c,0xd8,0xa5,0x28,0xc3,0xff,0xaa,0x5d,0x5b,0x1d,0xc9,0x1a,0x4b,0xe5,0x6f,0x0e,0x2c,0x5e,0x06,},"\x7e\xf0\xae\x13\x36\xa6\xfa\xb3\x7f\x99\xda\x5f\xa7\xd0\xde\xc7\x40\x9c\x07\x26\x23\xea\xd8\x4f\x24\x1d\x53\xd0\x59\x6b\x46\x17\x05\xfb\x1b\x3c\x53\x7d\x36\xb8\x9e\x89\x60\xfe\xbb\x4c\xdc\x0d\x42\x7c\xe2\xfc\x1b\xe5\x8d\xbb\xce\x15\x1e\x35\xac\xd8\xb6\xac\xe4\x0a\x19\x82\x29\x14\xa4\xbd\x8c\x4a\xf6\x32\xf1\x36\x41\x8a\xc4\x9b\x18\x4d\x55\x19\x3e\xbc\xc3\x2d\x0d\x79\x87\x09\xb1\xa8\xfe\x29\x4f\xba\x8a\x1f\xe7\x2d\x97\x6b\x44\x00\xd4\xa3\x93\x24\x23\x11\xb0\xf8\xcc\x99\x4e\x89\x47\x5b\x00\x38\xae\x5d\x89\x14\x93\x8e\x8f\x6e\x87\xc6\xf5\x0b\x9d\x65\x6c\x45\xd7\xb1\x42\x31\xef\xed\x97\xf3\xc9\x06\x68\x91\x36\x70\xbf\x5b\xe2\xef\xd5\xc2\x70\xc7\xcb\xaf\x01\xe8\x57\x2e\x98\x00\x97\x8d\xfe\x2e\x10\xa2\xfc\x04\x40\xb8\x55\x62\x9b\xf9\xcd\x40\x9e\xa9\x41\xcb\x69\x22\x6c\xac\x77\x1b\x15\xea\x77\xc0\x32\x68\x48\x80\x6f\xf8\xd2\xe2\x01\xe6\xe2\x6c\xd5\xf4\x54\x30\xda\xdc\xff\x8f\x59\xc3\x21\xc1\xc9\xc6\xa2\x9b\x94\x88\x29\x35\x44\x7d\x3e\x6c\x2e\x88\x04\xb1\x16\x15\x76\xbd\xf0\x32\x0f\xe5\x3c\x30\x7d\x9c\xde\x42\x60\x77\xa7\x67\x7c\xde\x3c\x1b\xc8\x3e\x18\xe6\x0a\x0c\x4e\xe6\xdc\xcd\x87\x7c\x21\x3a\x8e\x4c\xca\x64\x0e\xe0\x49\x29\x80\x45\x70\xae\x1f\x96\x15\x7c\x04\x35\x7a"}, -{{0xb8,0x09,0x36,0x1f,0x55,0xcf,0xe8,0x13,0x7f,0xbd,0xa8,0x80,0xfc,0x62,0xcb,0xe4,0x4c,0x21,0x6e,0x14,0x18,0x93,0x34,0x63,0x02,0xb3,0x36,0x04,0x5d,0xe2,0x18,0x78,},{0xfd,0x23,0xe4,0x2f,0xf0,0x66,0x44,0xea,0xd3,0x47,0xab,0xcc,0x1b,0x3e,0x03,0xb0,0xe8,0x85,0x93,0xb6,0x12,0x54,0x98,0x1d,0xd8,0xae,0x59,0x45,0x4e,0x61,0xb3,0xe0,},{0xb5,0xb5,0x95,0x0d,0x37,0x72,0xd2,0xee,0xf8,0x8e,0x1b,0x0f,0x5d,0xf5,0xff,0xae,0x2f,0x21,0x03,0x88,0x5e,0x71,0x44,0x6d,0x34,0x6f,0xbb,0x5d,0xae,0xf9,0x49,0x67,0xa6,0xb7,0xb6,0xe4,0xbe,0x88,0x51,0x10,0x06,0x58,0x76,0xc6,0x65,0xb7,0x81,0x2d,0xe4,0x6a,0xd3,0x1e,0xc3,0xbf,0xcb,0xea,0xee,0x13,0xed,0x0c,0x1e,0x0b,0x30,0x0e,},"\x17\xac\xe1\x97\xd0\x83\xaa\xf1\x72\x6f\x53\xe5\xef\x81\xb5\xa8\xc0\x92\x22\xf2\x60\xee\x5f\x1f\x54\x04\xab\x78\xd9\x00\xd4\x89\x68\x84\x49\xb8\x43\xba\xd3\xc4\x98\xaa\xc6\xd8\x0b\x46\x39\xb7\x6e\x6e\x81\xc5\x52\x76\xa6\xf9\xc7\xce\xcd\x70\xb7\x1a\xaa\xf2\x01\x8e\xf7\x6c\x0e\x30\x15\x4a\xae\x86\xa5\xc8\x6d\x4e\x8d\x0e\x4e\xc6\x8c\xc4\x27\x06\x0b\xd5\x65\x14\xf7\x23\x80\x86\xbb\xef\x5b\xfc\xa1\xf5\x67\x1b\x18\x04\x18\x38\xfd\x01\x35\x72\x44\x3d\xba\x48\xfb\xdd\x95\xca\x74\x0b\x0d\xaa\x43\x27\x16\x4a\x1e\x34\x67\x72\x49\x70\x8f\x77\xbd\x79\x3e\x7c\xaa\x66\x38\xb5\xdc\x9f\xbe\x6f\x0d\xfd\x41\x20\x20\x90\x97\x20\x9c\x93\xce\xdf\xaf\x21\xb6\xbf\x59\xca\x6e\x99\xe6\x20\x96\x39\x44\x4f\x0e\x82\x7b\xbc\xc0\xa6\x1c\x3a\x23\x7c\xa2\x2a\x28\x32\x13\x22\x3a\xb6\x58\xe7\x12\xc7\x55\x62\x38\xd3\xa5\xfe\x31\x72\x2d\x65\xf5\x70\x6e\xf6\xd6\x4d\x73\x23\x2d\x30\x43\x22\x0f\x14\xe5\xcf\xd3\xc2\xc8\x3a\x83\xd6\x8e\x20\x27\x4b\x6f\x96\xb2\x9d\xe0\x40\xce\xc8\x47\x50\x30\xb6\xa8\xa8\x7d\x29\x80\x8d\xd3\x81\x79\x5c\x3d\x22\xac\xf5\xdc\x19\x3b\x72\x0d\x95\xa7\x52\xd9\xf1\x23\xc2\x09\xff\xba\x00\x4e\x48\xdd\x06\xdd\x8c\x9e\x17\x2b\xc9\xe0\x87\xd8\x0b\xc5\x21\x6c\x0b\x0b\x6e\x77\x03\x12\x41"}, -{{0xee,0xef,0x80,0x74,0xc2,0xeb,0x9a,0x1c,0xee,0x2f,0x2d,0x3b,0xb0,0x53,0x25,0x54,0x6a,0x9f,0xb7,0xcb,0xe4,0x4b,0x59,0x94,0x61,0xfc,0x58,0x85,0xf5,0xfd,0x9c,0xac,},{0x9b,0x89,0x29,0x41,0xa0,0x57,0x3b,0x7a,0x16,0x73,0xef,0x48,0x0f,0x08,0x11,0x68,0xd9,0xb7,0x49,0x6a,0x81,0xf9,0x17,0x7d,0xc4,0x27,0xca,0x1f,0x84,0xcb,0xbf,0x7d,},{0x6f,0x71,0x01,0x98,0x4f,0xd6,0x89,0x2e,0x21,0x44,0xb7,0xd4,0x56,0x19,0x83,0x0c,0xae,0xb6,0x71,0x3b,0xfa,0xb4,0xee,0xbb,0xe2,0x17,0xc5,0xbe,0xcd,0x24,0x9b,0xd9,0xd7,0x52,0xeb,0x76,0xe9,0xfa,0x99,0x5e,0x7c,0x71,0xff,0x7d,0xf8,0x6b,0xb2,0x60,0xcd,0xda,0x17,0x3f,0xf5,0xde,0xec,0x6a,0xf2,0x04,0xb7,0xdd,0xe0,0x11,0xde,0x09,},"\x9a\xe3\x9f\xea\xde\x90\x5a\xff\xcb\xed\xd2\xe7\x2a\x6f\x24\x29\xb3\xd1\x10\x8e\x5b\xc1\xa9\xdb\xaf\x49\x0a\x62\x99\xbc\xcd\x94\xac\xc4\x13\xad\xac\xc9\x18\xb1\x4a\xfa\x85\xc7\x8b\xc1\x68\xcc\x00\x74\x0c\x3d\xa0\xe0\x81\x83\x91\x5f\x79\xb7\xfe\x38\x68\xce\x2a\x7e\x88\x6b\x32\xad\x45\x00\x98\x05\xbf\xb8\x1b\x8c\x07\xb3\xb1\x02\x24\x20\xc0\xf0\x09\xb8\x89\xd7\xfc\x22\xfd\x19\x97\xae\x34\x19\x84\x38\xca\x94\x77\x85\x75\x12\x2f\xca\xaf\x96\xe6\x50\x2c\x33\xa7\x5a\x12\x9a\x2d\x0d\xbb\x07\x3d\x93\x82\x0d\x9c\x96\x68\x3d\xb3\x18\x99\x0b\xe3\xfe\xf4\xca\xfc\x89\x0a\xfb\xd9\xb1\x50\x4c\x74\x39\xa0\x8a\x06\x5e\x78\x14\xee\x4f\x9b\x6f\x57\xee\x16\xba\xed\x3f\x0e\x3a\xa3\x5d\xd2\x3d\x35\x28\xa4\x58\x91\x9a\xd7\x70\x48\xb4\xe2\xe6\x17\x23\x46\xbe\x24\x9a\x50\xaf\x02\xbc\x6c\x85\x33\x04\xc2\x08\xae\x0b\xa0\x27\x71\x26\x2a\x0d\x8a\x46\x5f\x71\xfa\x06\x35\xe5\x3e\xb2\xef\x0a\x84\x7d\x56\xa0\xbc\xd7\xdd\x3f\xe0\x77\xc9\x2b\xcd\xca\x30\x69\xa4\xa6\x82\xa2\x85\x99\x28\x31\x5c\xe3\xeb\x44\x5c\x60\x72\xa7\x14\x92\xee\x82\xe1\x72\xa2\x0b\xe0\xb6\x48\xb7\x56\xe6\xc7\x75\x37\x6f\x0c\x7c\x3d\xf8\xe6\x42\x88\x08\x9c\x2f\x81\xce\x95\x93\xc6\xe0\x8b\xb1\xcc\x1b\x27\xfc\xbd\x39\x2f\xc7\x95\x2c\x55"}, -{{0x61,0xfa,0xeb,0x15,0xf8,0x57,0xf6,0x55,0x78,0x62,0xc8,0xb8,0xc7,0xef,0x41,0xf8,0x05,0x45,0x52,0x09,0x96,0xfc,0xc1,0x12,0x7b,0x8c,0x24,0x91,0x82,0x22,0x01,0xae,},{0x60,0xa2,0x90,0xc0,0xfc,0x42,0x5a,0x08,0x74,0x67,0x3d,0x94,0xf9,0xbb,0x14,0x00,0xf9,0xda,0xcd,0xe9,0x95,0x4f,0x9f,0x5b,0x05,0xdd,0x48,0xab,0x74,0x7a,0x39,0x50,},{0x31,0xf9,0x0f,0x50,0xb2,0xdc,0x70,0x5f,0x1d,0x92,0xf1,0x2c,0xa9,0x97,0x5d,0x76,0xf1,0xb2,0x82,0x6a,0xda,0x3c,0xc1,0x85,0xb0,0xed,0x6c,0x83,0x86,0x07,0x77,0xbd,0x8c,0x48,0x9b,0x59,0x85,0x5a,0x91,0xf6,0x48,0x39,0xd4,0x9b,0xa4,0x67,0x98,0x5a,0xbb,0x37,0x6c,0x47,0xa4,0x90,0x8b,0x27,0x1b,0x8f,0x77,0xc5,0x8d,0x01,0xfd,0x04,},"\x25\x3b\x56\x6e\xcc\xb5\x63\xbd\x6e\x48\x0c\x69\x73\x9b\x8e\x37\x25\x19\xa3\x43\x72\x54\xe0\xe5\x02\x9c\xac\x86\xc7\x16\x38\xf2\xdf\x2a\x6c\xf9\xe5\x6d\xb2\x56\x99\x34\xde\xba\x90\xdb\x75\x54\x7e\x36\x71\x74\x7d\xf6\x4d\x6f\x2a\xaf\x3c\x11\x0f\xa6\x7a\x70\x94\xcc\xbe\x4c\xc5\x35\x5f\x0d\x43\x23\x51\x36\xee\x26\xdb\xe3\x7f\x42\x25\xd3\xbb\xfe\x24\x55\x95\x28\x05\x85\xfb\x54\x8f\x89\x4e\x86\xc5\x16\x10\x25\x80\x29\x1f\xa7\xa0\x28\x59\x55\x7f\xb9\x8e\xb5\x88\x87\x08\x28\xb0\x99\x0a\xe9\xd7\x4f\x38\x31\xda\x58\x94\x6b\xc7\xa5\xce\x1b\xa4\x98\xb4\xe8\xbe\x89\x89\xa3\xb5\x0d\x7e\x87\x89\xf5\x6b\x8b\x4f\xec\xbc\x2a\x33\xbf\xa3\xef\x59\x1a\x0f\xbc\xd9\x32\xfa\x93\xe1\x9f\x3a\x81\x2a\xe5\xe4\xe3\xb4\xb2\x42\xbe\x77\x05\xa5\x87\x4a\xf7\x3b\xe3\x10\xb0\x05\x82\x66\xa3\x78\xf2\x3c\x13\x48\x52\x47\x15\xb0\xcc\xc1\x8d\x66\x34\xb2\x36\x36\xc3\x16\xba\x6a\x1d\xd2\xfd\x50\x92\xc0\x67\x16\xa7\x17\xb5\x4d\x0e\xb9\xfc\x7f\x63\x6f\x85\xbb\xf2\x25\xa2\xcf\x03\x5b\x4b\x7c\xfd\xdd\x75\x35\x16\x82\xc0\x57\x6c\x6b\x3b\xa5\xa1\xc0\xb2\x5e\xc5\x94\xe7\x70\x9d\xd0\x9a\x00\x79\x77\x2f\xf3\xac\xc6\x7f\xb6\xc1\xb3\x7b\xb3\x74\x2b\x72\x6e\x77\xe8\x05\x61\xd9\xab\x73\x16\x0b\x73\x36\x25\x81\xda\x5b\x9c\x7f"}, -{{0xe6,0xb9,0xcd,0x4d,0xa0,0x7c,0xb3,0x4f,0x30,0x39,0x1c,0xf6,0x8f,0x0d,0x87,0xc7,0xcf,0xcf,0x68,0xf8,0x10,0xff,0xa4,0x0f,0x97,0x39,0xc9,0x5d,0xeb,0x03,0x7f,0x71,},{0x56,0x9e,0xde,0x0f,0x04,0x63,0x0b,0x43,0xa0,0x4c,0x5a,0x66,0xb6,0xa5,0x63,0x6b,0x76,0x6c,0x75,0x96,0x59,0x84,0xa7,0x47,0x7e,0x15,0x49,0x19,0x60,0xfd,0xd8,0x64,},{0x1e,0x37,0x5c,0x94,0xbd,0x80,0x9c,0xa0,0xcd,0xd0,0x2f,0x89,0xec,0xec,0x4e,0x43,0x77,0x32,0xdd,0x20,0xa0,0xa8,0x4b,0x25,0x4e,0xae,0x88,0x9d,0x80,0x70,0xe6,0x82,0xd1,0x13,0xb0,0xbe,0x22,0xe4,0x1e,0x6c,0xdc,0x3b,0xe8,0x77,0x68,0x0e,0x7e,0xeb,0x7f,0x09,0x95,0xe6,0x62,0x2d,0xc0,0xb4,0x34,0xfb,0x09,0x49,0xdd,0x99,0x4b,0x0c,},"\x69\xde\xf0\x52\x3a\xfd\xa6\x96\xf8\x44\x8f\x9c\x11\x43\xab\xc2\x65\x33\xe6\x86\x95\xa0\x90\xdf\x0d\x9e\x43\xd0\xc0\xef\xf4\x35\x83\xe6\xf7\x09\xd2\x04\x3c\x81\x5f\xbb\x3f\x96\xba\x2b\x0d\xc3\xbe\x6f\xec\xad\x5d\xd3\x81\x48\x78\x8e\x4a\x03\x85\xa9\xfe\x7a\x92\x1f\xcb\x8c\xce\xe0\xe4\xd3\xae\xd4\xbc\x3d\x21\x6d\x84\xb4\x14\xf9\x58\x0b\x02\x82\x0c\x03\xd9\x2e\x67\x5e\x68\x5c\x4b\x58\x51\xf3\x63\xbb\x4d\xf9\x7b\x41\x7c\x3f\xd9\x00\x22\xee\xaf\xa2\x0d\xfb\xe8\x29\x64\xf2\xff\x07\x3d\x25\x57\x58\xfb\xe5\x67\xc7\x6b\x2c\x35\xe2\xb0\x9f\x8a\x8d\x7a\xfa\x32\xc6\xf5\xad\x01\xbc\x3e\xbf\x6e\x21\x06\x06\xdb\x03\x8e\xcb\x68\x20\xce\x1e\xa4\xdd\x52\x9f\xc1\xad\xfb\xc2\xa1\x38\x56\x5a\xc6\xd0\xf4\xa4\x10\x9b\xdd\x47\xb8\xaa\x6e\xf4\xb8\xbe\xde\x45\x46\x80\xd1\xdb\xdb\x75\xfe\x1e\xb2\xe5\x48\xd5\xde\x7c\xb6\xd7\x92\xfe\xf3\xaa\x0d\x84\x80\xa6\x03\x0b\x30\xf1\x04\xd7\xe7\x6b\x58\xe9\xf4\x76\xeb\xf2\xcc\x83\x29\x23\xb5\x0c\x50\xc1\x11\xc3\x51\x5f\xc5\x18\x85\x23\x23\x42\x6c\xa7\x78\xa5\x96\xd3\x19\x5d\xa8\x58\x5d\x8c\x3a\xa9\x20\x83\x31\x3a\x6e\x65\x85\xb7\x0c\x98\xb1\x85\xb4\x72\x79\x8a\x61\xcd\xe7\x7e\x62\xec\x27\x2f\x14\xb0\xd9\xeb\x4f\x22\xf9\xc7\xc0\x58\x17\xda\x6f\xde\xfe\x78\x79\xa5\x84"}, -{{0x4d,0x90,0x44,0xf1,0x7b,0x5a,0x09,0x77,0xdc,0x5a,0xa9,0x91,0x6a,0x92,0x43,0x00,0xa2,0x44,0xa1,0xef,0x7f,0x06,0x02,0x77,0xad,0x49,0x78,0x35,0x1e,0xa6,0x42,0x91,},{0xab,0x9c,0x06,0x92,0xa6,0x06,0xb2,0x56,0x7c,0x19,0xc3,0x0f,0x9f,0xaa,0x3b,0x4c,0xfe,0x72,0xfb,0x23,0x70,0x77,0x76,0x7b,0x76,0xd3,0xb2,0xae,0x14,0x90,0xa6,0xd4,},{0x6f,0xa4,0x8a,0xea,0x4d,0x5b,0x9a,0xf6,0x5a,0xf9,0x64,0xcd,0xb7,0x09,0x44,0x3a,0x11,0xfa,0x84,0xf7,0xd4,0x4a,0xcd,0xda,0xb1,0x6e,0x04,0xa6,0xfc,0xef,0xb2,0x7a,0xe3,0x3c,0x05,0xb3,0x6d,0xa1,0x3c,0x23,0xde,0x51,0x7d,0x6e,0x6a,0xc5,0x74,0xa0,0x3e,0xa6,0x30,0xba,0x4f,0xbb,0x95,0x81,0x31,0x12,0x9a,0xa7,0xf1,0x35,0x4c,0x01,},"\x7c\x8c\x71\x89\xaf\x67\x32\x7a\xf1\xc6\xdd\x2c\x30\xe9\x75\xf1\x90\xe3\xb3\x8d\x00\x8b\x45\x85\x16\x7e\x0d\x45\x07\x40\xd4\x67\x34\x58\x7f\x6d\x20\x87\x84\x24\x5c\xc5\xcb\x06\x2a\x2a\x27\x7f\x17\xeb\xb2\x74\x6f\x9b\xdf\x4a\x82\x37\xca\x47\x9a\xb0\xa4\x30\x17\x7e\x19\xed\x7d\xd3\x62\x25\x76\xb1\x4c\xdc\x08\x28\x22\x14\xfe\x5e\xe4\xd7\x6b\x43\xc1\x6a\xc9\x08\x64\xc5\x1b\xe8\xae\xd4\x5d\x7b\x98\x0d\xf7\x91\x7f\x29\x0f\xdf\x79\x58\x46\x46\x5f\x27\xfc\xb7\xe5\x73\x06\x37\x94\x4f\x05\x77\xc9\x2f\x32\x37\x5e\x99\x5b\xc0\xcd\xa9\xd7\x19\x6f\x2c\x0c\x1a\xc8\xb8\x0d\x12\xa0\x43\x99\x63\xeb\xd2\x25\x4c\x34\x77\x03\x57\x58\x16\xe7\x96\x4c\x13\xd4\x4d\x62\x92\x80\xc3\x12\xea\x26\x53\x44\xde\x38\xf3\xb1\x8d\x91\x50\xf8\xf9\x24\xaf\xb4\x4b\x6b\xfb\x9e\xda\x51\x3d\x59\xe6\x5e\x2e\xf1\x86\x66\xe6\xc2\xa2\x1c\x40\x18\x66\x5b\xef\xe9\x2c\xae\x58\x1d\x3c\xb1\x4e\x23\xe9\x7d\x83\x00\x02\xcb\x90\x93\x1a\xe0\x21\x00\x68\xaf\x39\x4e\xbe\x35\x1b\xe5\xb8\x17\xf3\x67\x4b\xfb\xf4\x00\x49\x03\x0e\x4f\xe5\x05\xd3\x4a\x1d\x50\x2a\x2c\x50\xd8\xe6\x38\xe9\x26\xc2\x30\x67\x6b\x7e\xde\xfb\x6b\xec\x77\xb1\xc0\xce\x60\x93\x25\x28\x7b\xa5\xfd\xd7\xa9\x97\x69\x87\xbd\x07\xfc\x6a\x43\x44\x95\x6e\xbf\x81\x8f\x08\x58\x6c"}, -{{0x75,0xad,0x76,0xbb,0x4c,0x0c,0x22,0x9a,0x5a,0xdc,0x79,0xe4,0x44,0xb1,0x3f,0x88,0xa9,0x64,0x59,0x86,0x2c,0x8c,0xf0,0xba,0x49,0x8d,0x0c,0x99,0x6a,0xf9,0x4a,0x7a,},{0xf0,0x74,0xdd,0x2b,0x9c,0x1c,0x30,0x91,0x05,0xec,0x95,0x1b,0xb5,0x81,0x2a,0x91,0xdd,0xb5,0x40,0x23,0xb3,0x80,0x9a,0xb3,0x79,0xc5,0x6a,0xf0,0x46,0x1a,0xf6,0x17,},{0x0c,0x46,0x43,0xa8,0xbe,0x6d,0xc2,0x2f,0x4b,0xeb,0x6b,0xcc,0x70,0xc6,0x17,0x2e,0xc7,0x60,0x83,0x78,0x65,0x3c,0xb4,0xe9,0x9f,0x3a,0xe7,0x95,0xea,0xdf,0x4e,0x98,0x2a,0x29,0x76,0x09,0xca,0x79,0x38,0xf5,0xdf,0x63,0x2b,0x09,0x56,0x28,0xcb,0x75,0x06,0x2d,0x3d,0x51,0xfc,0x0f,0x33,0x23,0xbf,0xa7,0xb2,0x2e,0xc4,0xd4,0x72,0x05,},"\x0c\xa8\xc1\xc7\x41\x28\xd7\x4e\x9d\x0a\x7b\xf8\x96\x42\x91\xd0\x74\x91\x7f\x2f\x99\x20\xef\xb9\x11\x52\x05\x67\x64\x2a\x50\xa6\x15\xab\xcb\xd0\x0a\xed\x4a\xbb\xfe\xf1\xa9\x83\xcc\xe3\x33\xe1\xd0\xdf\x3e\x64\x04\xfb\x90\x43\xc6\x80\x39\x14\xcd\x5f\xff\xbc\x66\xa0\x79\x0c\x78\x78\xa2\x40\x89\xa5\x71\xf8\x95\x66\x2a\x1d\x18\xbe\x3f\x01\xff\x97\xfb\x33\x23\x33\x4b\x6f\x5b\xaf\x96\x55\x14\x48\xe4\x09\x0d\x03\x3c\x46\x42\x94\xd0\x91\x33\xb1\x51\xd5\xb5\xc6\x32\x1b\x50\xe2\x24\x1d\xe0\xef\x6f\x88\x28\x89\xcc\xf4\xad\x35\x40\xd5\xa1\xe3\xf7\x54\x8f\xb1\x3b\xe7\x1c\x16\x51\x66\x06\xe7\x9d\x04\x49\xc2\xa0\x8e\x5d\xc2\x31\x48\x84\x3c\x84\xe9\x7e\xd2\x40\x69\x16\x1c\x8e\x75\x20\x8f\x33\xe9\x5b\x3e\x10\xd1\xd4\x9a\x2f\xae\xf9\xd9\x86\xab\x62\x80\x9f\x62\xad\x39\xc7\xcc\x87\x1f\x37\x5a\x4f\x5a\x6f\xaf\x10\x4d\x7e\x11\xb8\x90\xcf\xb0\x58\x99\x02\x68\x52\x16\xec\x07\xcb\x8e\x8e\x9e\x7a\x7c\x43\x63\x5e\x23\x21\x2b\x69\xca\x3b\x7e\xd5\x4f\x0b\x97\x94\x9e\x3d\x9a\x66\x62\xf8\xe4\xb3\xab\x09\xcd\x49\x52\x94\xc3\x31\xc0\x47\xd8\x6e\xe7\x85\xff\x65\x8b\xcd\x7f\xcf\x9c\x48\x06\x05\xce\x05\xe8\x10\x06\x8d\x60\xfc\x9b\x26\xb5\xf0\x63\xeb\x90\x00\xd2\x65\x7a\x50\x94\x28\x4a\xc8\x0f\x13\x75\xd0\xb6\x6d\x6f\x5f"}, -{{0xad,0xc6,0xe9,0xb2,0xe1,0x03,0xb6,0x2c,0x24,0xad,0x43,0x46,0x41,0x0e,0x83,0xa1,0xa0,0xbd,0x25,0x3e,0x4a,0xbf,0x77,0x91,0x18,0x50,0xc6,0xd9,0x66,0x6e,0x09,0xf9,},{0xfc,0xe3,0x16,0xe3,0x3c,0x91,0x08,0x21,0xbe,0xed,0xdd,0x63,0x4b,0xed,0xc5,0x8e,0xe5,0x79,0x99,0xa7,0x6e,0xce,0x38,0x46,0x05,0x28,0x3b,0x99,0xb5,0x43,0xb7,0x8b,},{0xcb,0x01,0x7d,0x6d,0x26,0x82,0xc9,0x85,0x43,0x66,0x25,0x9a,0xa3,0x5f,0x30,0xd4,0x91,0xcf,0xaa,0x93,0x09,0x98,0xc2,0x97,0xdb,0xdd,0xc6,0xad,0xed,0x5b,0x3d,0x40,0x1c,0xf7,0x6d,0x80,0xd8,0xa2,0x76,0x4d,0xe1,0x31,0x71,0x8b,0x6e,0x0c,0x48,0x1d,0x71,0x96,0xbc,0x72,0x57,0x97,0x16,0xb0,0xc0,0xf6,0xff,0x05,0x3e,0x68,0xc5,0x0c,},"\x8c\xcc\xd9\x8e\xbb\xf2\x43\x9f\xfd\xfa\xc4\x16\x87\x63\x8f\xaa\x44\x4e\x1c\xa4\xb6\x3d\x13\xe8\x98\xea\xa8\x35\x54\x92\xf2\x88\x13\xab\x81\x3f\xd0\x15\x10\xe1\x12\xbe\x10\x6b\x20\x45\xd3\x0f\x63\x33\x5d\x24\x89\x04\xd5\x21\xde\x18\x1a\xba\xc0\x3e\x3d\x2c\xb2\xd1\x6c\x44\xb3\xb0\x12\xa0\xc5\x1f\x99\x01\xae\xf9\x05\x6c\x72\x4d\x7a\x2c\x6b\x2a\xcb\x0a\x07\x55\x59\x40\xe4\xc6\xe2\x11\x54\x89\x06\x11\xad\xeb\x64\x89\xf4\x61\xd3\xe5\xec\xd1\xaf\x5a\x4d\x2b\x0a\xda\xf4\x17\x47\x43\x6e\xb4\x14\x75\x7a\x8f\xe4\x77\x56\x74\xe3\xc6\xe5\xde\x45\x69\xd6\xfc\x6c\x78\x8e\x10\x90\x5e\xba\x32\xc2\x70\xa3\x93\xe6\xf7\x21\xa7\x65\x29\x4e\x2a\xc9\x9a\x9b\x6e\x53\x4d\x3d\xf0\x8d\x1d\xb9\x7d\x60\x2a\xc3\x19\x5c\xb0\xb7\x7f\x5b\xd4\xac\xaf\x73\x7f\xad\xd6\x99\x1f\x06\x88\xab\xc7\x49\x18\x04\x75\x74\xea\xc2\x82\x89\x73\x9a\x66\x4e\x0e\x0e\x20\x57\x4a\x2c\x25\xfd\xe4\x9d\x14\x53\x9d\xb1\xce\xdd\x4a\x92\x04\xa7\x0a\xcf\xf0\xa6\x2c\x8f\x25\xcd\x76\x8f\xfa\xb1\x5c\x4d\xb3\x16\x84\x0a\x4d\x1b\xc9\x2e\x21\x26\x70\xbe\x07\xc5\xbd\xcf\x53\x75\x90\x60\x7d\xfb\xbb\xb4\xd9\xf9\x8b\x89\xda\x0b\x4d\xf7\xd8\x8f\x3e\xca\x48\x14\xd1\x6b\xfa\x20\xc8\xd2\xfa\x94\xf9\xf2\x59\xf2\xee\x2d\x3a\x83\xc9\xe4\x17\x1b\x1a\x26\x2c\x4b\x99"}, -{{0x37,0xfc,0x1b,0xed,0xa4,0x06,0x0b,0x6c,0x57,0x88,0x3d,0xdb,0xa0,0x77,0x6c,0x2b,0xcf,0x5a,0xc2,0x8a,0x65,0x13,0x26,0x02,0x1c,0xca,0x97,0x72,0x37,0x30,0xfb,0xb0,},{0x7b,0xd7,0xbf,0x1c,0x99,0xdc,0x82,0xe0,0x6f,0x08,0xbb,0x45,0x4d,0x8f,0xb2,0x88,0xa5,0x79,0x27,0xe0,0x7f,0xf1,0xb1,0x2a,0xf1,0x5e,0xe2,0xc1,0x2f,0xbb,0x6b,0x3d,},{0xa0,0x1d,0xd6,0x5f,0xad,0xa2,0x70,0x39,0xf1,0x68,0xb1,0x23,0x41,0x9d,0x8a,0xbf,0xbd,0xa4,0x8c,0x57,0x2e,0xce,0x24,0xfd,0xa0,0x6e,0x1a,0x5e,0xc3,0x1e,0x08,0x4f,0x4e,0xe1,0xcb,0xf9,0x96,0x1e,0x88,0xed,0x51,0xe1,0x89,0xfc,0xb7,0xf5,0xf2,0x35,0xde,0x1e,0x5b,0x28,0xd0,0x8f,0x2b,0xfc,0xa1,0x90,0xb0,0xf0,0x19,0xec,0xc2,0x07,},"\x3d\xfc\xac\x02\x65\xa0\x24\xa8\x3c\xb9\x32\x67\x44\x89\xa1\x63\xaa\xc3\x14\xbf\x3d\x96\x9f\x27\x59\x6e\x45\x17\x33\xb9\x9d\xeb\xa5\xee\xb7\x79\x21\x0b\xaf\x95\xbf\x54\x5a\x1a\xe6\xb8\xa9\x15\x86\x06\x93\xee\x89\x0f\x93\x93\x20\xe0\x6a\x84\x44\x83\xd1\x8c\x6a\x1b\xcd\x03\xc6\x38\xbb\x7d\x1f\xe2\xa8\x2e\xb4\x48\xa3\x11\xb1\x30\x2e\xa6\x42\x8f\x54\xa3\x9f\x45\xa4\xd5\x60\xbe\x15\x57\xa2\xb2\x54\xc4\x5c\x13\x7f\x45\xcc\x68\x35\x68\x36\xe2\x1b\xed\x0b\x7f\x73\xa5\x18\xce\x09\xdb\x0b\xe3\x93\x92\x7c\x33\x9b\xf2\xa4\xb5\x98\x75\x39\x40\x4c\xe6\x50\x28\x4d\xe1\x2e\x3b\x55\x3b\x26\x2e\xfe\x23\x84\x83\x32\xcc\xfd\xc3\x5e\x79\x1a\x0a\xb4\x3f\x13\x9c\x71\xed\x0f\xcb\x2d\x17\x3b\xb3\x77\xee\x46\xb1\xa9\xdc\xa9\x27\x7e\x77\xdf\x85\x5f\x28\x30\x25\x1e\x31\xe2\x6a\xcd\x86\x76\x3c\x8d\x7e\xac\x22\xc8\x82\xfc\x17\x4f\x2b\x5e\x75\xca\x6a\xd1\xad\xe0\x3f\x94\x2b\xb2\xa1\x3b\xf5\x41\x90\x61\x59\x15\x8c\x68\x36\x3c\x74\x80\xc5\xb2\x7a\x99\x32\x0f\x82\x83\xa2\x69\x9d\x43\x69\xc0\x71\xc5\x0d\xbd\x90\xb7\x79\x2e\x47\x72\xef\xbc\x0b\x19\x5b\xce\x84\xcc\x4d\xcf\xff\x70\x72\xa4\x89\x68\xdb\x69\xf9\xfe\xdd\xd0\xf9\xce\xd6\x59\xeb\x5d\xb7\x16\x7f\x35\xf9\x88\xce\xc1\x14\x88\x7d\xcb\xfd\xf2\x7d\x02\xd3\x00\xb3\xe1\xab\xec"}, -{{0x8d,0x42,0xf4,0xdd,0xd2,0xbb,0xd2,0xb8,0x27,0xb0,0xa0,0xd3,0x1d,0x8f,0x75,0x8e,0xbd,0x13,0xa1,0xb9,0xb3,0x71,0x22,0x28,0x94,0x8c,0xa6,0x10,0xbb,0x88,0x58,0xe5,},{0xb7,0x35,0x48,0x98,0x79,0x4f,0x9d,0xb0,0xa8,0xaf,0x6e,0xea,0xfc,0xdb,0xdf,0x01,0x1d,0x3f,0xbe,0xf0,0x21,0x2a,0xd9,0x38,0xa4,0xa4,0xad,0x27,0xab,0x16,0xeb,0xbf,},{0x70,0x76,0x4b,0xe3,0x9c,0x6d,0xca,0x0f,0x06,0x7a,0xbe,0x1e,0xca,0x49,0x0f,0xda,0x95,0x1f,0xd4,0xe9,0x49,0x96,0x95,0x26,0x6e,0x27,0x0b,0x9b,0x05,0xea,0xe7,0x06,0xca,0x8d,0x1c,0xa6,0xa9,0x2d,0x7c,0x48,0x8e,0xc6,0xad,0x8b,0xa1,0x14,0x57,0xa4,0x2a,0x5e,0x31,0x70,0x2a,0x9c,0x2b,0xce,0x89,0x2d,0xc4,0x05,0x35,0xc0,0x9f,0x01,},"\xe3\xa2\xbe\xbc\x04\x96\xd8\x97\x4a\x8f\x40\x61\x88\x03\x69\x31\x4e\xd9\xe4\x40\xc1\xb7\x7e\x26\xfe\x50\x71\xce\x69\x4f\xfd\x21\x36\xdb\x0c\x4d\x5e\x88\x0e\x60\x00\x08\x3a\x75\xc9\x0d\x3c\xf7\x2b\x9c\xf5\xa2\xb1\xa9\x00\x2c\x27\x01\xa2\xff\x59\xb0\x69\x9a\x8f\x42\xd7\x9d\xd8\xa5\xfb\x71\xa8\x12\x54\x53\xd9\x1f\xb8\x00\x80\xa3\xf0\xa1\x65\x84\x28\x2f\x17\xec\x7d\xfd\xc2\xe5\xc6\x9c\x4d\x9b\xdf\x48\x4d\x55\x94\x4d\xae\x27\x3f\x21\x1c\xfb\x76\xad\x37\xda\x45\x87\x13\x65\x43\x9a\xf3\x5e\xea\x1f\xbe\xcd\x4c\xa6\x79\xb5\x9b\x5e\x01\xba\xcf\x49\xc7\xf4\xe5\xef\xaa\x40\x6b\xa1\xda\xeb\x08\x54\x82\xaf\x5d\xed\x89\xdc\x68\x85\xff\xbe\x3d\x14\xd2\x93\x1b\x83\x89\x7e\x28\xad\x06\xe5\x56\x4e\x27\x89\xba\xea\x81\xbd\x93\x2a\xa2\x79\xfe\x8e\x32\x4b\x9a\x8e\xf1\x11\xc2\xab\xe2\xf1\x37\xd4\xbb\x50\xd8\xab\x76\xce\xbc\x0b\xd9\x82\xa2\x39\x19\x75\x1a\xd4\xd4\x9e\x88\xeb\x14\x17\x3d\x33\x10\x28\x9a\x87\x23\x17\xe4\xa4\x51\xe8\x8d\x54\x32\x08\x91\x87\x0f\x15\xb2\xd5\x33\x24\x43\x08\x77\xa9\xfb\x5b\x49\xbb\x92\x9f\x21\x1c\x5b\x89\x76\x4d\xd9\xc3\xa5\x95\xa1\x45\x1e\x9f\x85\xa2\x38\x54\x00\x02\x56\x6e\x53\xa9\x9e\xd1\xe6\xdd\xc9\xb4\x85\x3f\x45\x5e\xdb\x4c\xf1\x98\x0d\x56\xbb\xdc\x13\x13\xa3\x6e\x76\xea\x9c\xbb\x04\x8a"}, -{{0xb6,0x2d,0xe5,0xa1,0xac,0xfe,0x4c,0xa2,0xd1,0xf0,0xc1,0x32,0xaf,0xcb,0xda,0xe6,0x6f,0xb2,0x9a,0x02,0xf2,0x97,0xfb,0xc2,0x40,0x7f,0xad,0xbb,0xf2,0x45,0x42,0x00,},{0xb6,0x3b,0x2d,0x0b,0xf3,0x55,0xf7,0xb6,0xd0,0xba,0xc0,0x74,0x03,0x41,0x1c,0x40,0xaf,0xbb,0xb2,0xf7,0x07,0x50,0x3b,0x3f,0xc2,0xce,0xe8,0xa1,0xc7,0xd0,0xa8,0x38,},{0x5c,0xdb,0x00,0xe9,0x8d,0xe7,0x3e,0xab,0x48,0x0b,0xe4,0x2f,0x8a,0x8a,0x61,0x63,0x80,0x9a,0x0d,0x37,0x10,0x1b,0x6a,0x5a,0x4e,0xed,0x6a,0x0c,0x92,0x03,0x0d,0x09,0xa5,0x56,0x2c,0x72,0x90,0x80,0xce,0x6f,0x65,0x94,0xc8,0xfa,0xfb,0x1f,0x59,0x47,0x72,0xdb,0x7a,0x90,0xa9,0xe7,0xda,0x15,0x89,0x6e,0x82,0xf7,0x05,0x69,0x39,0x0d,},"\xe6\x59\xe5\x1d\x7b\x19\x3c\x4b\x8e\x2b\x3e\xd7\x3a\x9d\x75\x57\xed\x2b\xab\x61\x53\x88\x3a\xb7\x23\x59\x2f\x73\x0a\x91\x45\x67\x14\x2b\x3f\xa4\x35\xdb\x32\x19\xf8\x3a\x54\x2d\xc7\xa4\xbd\x80\x5a\xf6\x66\xea\x86\x5b\x85\x31\x46\xf8\xe3\xa9\xfe\x87\x07\x11\xf9\x0d\x12\xb0\x69\x34\x92\xaf\x2a\x1e\xdf\x99\xa1\x64\x58\xf7\x81\xf1\x26\x6e\xc4\x37\xa5\x29\x6a\x82\x2c\xa9\xd6\x9c\xe8\x44\xb5\xc5\x90\x97\xa2\xa5\x6f\x3e\xb8\xfd\x27\x3a\x63\x61\x16\xdb\x77\x43\x00\x92\x2d\x45\xb7\x44\x65\x7a\x69\x2f\x5e\x8b\xfb\xcb\x06\xd2\x42\x28\x18\xae\xb5\x1e\x7c\xda\x68\xac\xfb\xed\xa1\x6e\x7c\x79\x58\x0d\xcc\xcd\xe2\x4e\x8e\x3d\x60\x1b\x16\xe0\x63\xb4\x3a\x6d\x0d\x14\x07\x55\x2f\x75\x04\xf5\xbe\x19\x88\x2e\x4f\xfe\x32\x34\x4f\x5f\x47\x3e\x73\xa8\xf6\xed\x37\xb0\xd8\xd9\xe5\xe0\xa0\xdc\x98\x28\x39\x5b\xcb\xd8\xf3\xa4\xe3\x12\x48\x69\x24\x9d\x05\x8b\xe0\xe0\x45\xde\x0b\x1e\x12\xb1\xc8\x3b\xa0\xaa\x22\x7c\x95\xb8\x2b\xf7\x42\xc3\xea\xc0\x15\x2b\x33\xe6\xd1\x9b\xe8\xb3\x3a\x35\xbf\x70\x5d\xaa\xb1\x06\x22\xa9\x0a\xed\x02\x2e\xa6\xe4\x39\xed\x50\xa9\x30\x84\x37\x92\x99\x24\xba\x3a\xb1\x11\xad\x0c\xaa\x6f\xeb\x0a\x6e\xb1\x65\x82\x4e\xbd\xb0\x86\x65\x71\xef\xc0\x7e\x52\x22\xed\x86\x86\xb1\x4d\x92\x70\xbf\x76\xb9\x45\xd5\x20\x14"}, -{{0x97,0x32,0x05,0x9d,0x7b,0xf0,0x20,0x0f,0x5f,0x30,0x41,0x24,0x30,0x33,0x6b,0xe4,0xef,0x1e,0x3c,0xae,0x62,0x93,0x8a,0xd0,0x87,0x29,0xce,0x3b,0xa7,0x14,0xcf,0xd4,},{0x0d,0xe8,0x42,0x5f,0x5e,0x30,0xb2,0xb8,0xae,0xbb,0x80,0x72,0x00,0x9a,0x30,0xcf,0x04,0x11,0xc3,0xc8,0x23,0x8f,0x4e,0x42,0x08,0x76,0x0c,0x56,0xc3,0x3e,0x43,0x4f,},{0xfb,0xa1,0x74,0x9b,0x64,0x1d,0xd4,0xdf,0x34,0x66,0x4b,0xc4,0x3c,0x00,0x46,0x8c,0x7d,0x75,0xe8,0x4a,0xfa,0xd7,0x2d,0xe4,0x73,0xfd,0x1e,0x9c,0x87,0xda,0x15,0xea,0x60,0x4f,0xc2,0x54,0x9a,0x1a,0x86,0x7f,0xa8,0x08,0x50,0xe9,0xc2,0xa5,0x9c,0xd9,0x90,0x53,0x88,0x67,0x60,0xa8,0xd9,0x76,0x4b,0x84,0xdd,0x67,0x26,0x76,0x72,0x0d,},"\x1a\x13\xe7\xab\x60\x3b\x48\xeb\x89\x6f\xe1\x71\x73\xfb\x31\x95\x0b\x0d\xcd\x5a\x35\xff\xdb\xe1\x37\x1c\x7a\x5b\xfb\xa5\x93\x31\x75\x89\xd9\x65\x2d\x88\x79\x77\x29\x18\x0b\x8d\x0e\x51\x5a\xbf\xe6\x54\x8f\x16\x04\x21\xe5\x37\xd5\xc9\x4a\xef\x2b\x34\xc7\xeb\xb0\x97\x42\x00\x03\xbc\x0f\x36\x1b\x42\x3e\x7e\x14\x63\x0a\x80\x3c\x11\x82\x02\x54\x00\x49\xf6\x8c\x9c\xf4\x6f\xae\x03\x68\xd1\x62\xe4\x00\xd7\x7b\xb4\x52\x3c\xf6\xc7\x53\xb9\x75\xc2\x45\xbc\x99\xed\x2f\x41\x3a\x9d\x06\xc2\xda\x6c\xe0\xcc\x09\x87\xb6\x40\x6b\x80\x9e\x8e\xb3\x19\x03\x3d\x2d\xe9\x13\x1d\xee\x3b\x1b\x7b\x5c\x95\xd6\x53\xce\xd8\xfc\xcf\x99\x8d\xa1\x76\x85\x11\xec\xa4\xd3\xc5\xf7\x35\xad\xab\x96\x50\x3b\x35\x51\x80\x3e\x49\x22\x63\x50\x95\xef\x81\x1b\xe4\xc0\x8a\x6c\xba\xc9\x17\xcb\xe6\xcd\x91\xa4\xae\x5a\x33\x0c\xce\xc0\xe8\xe8\x15\x37\x12\x17\xa3\xde\x62\xf2\xd2\xd6\x14\x66\x21\x98\x33\xf3\x34\x47\x13\x2f\x4d\x43\x35\x0c\x58\xcb\xaf\x42\x24\x75\xed\xb1\x28\xc5\x6d\x80\xa4\x95\x72\x6b\x1f\xdb\xc5\x65\x51\xeb\x72\xd0\xf4\xfe\xc2\x6b\xa8\xbf\xf5\xee\xd6\x77\x4b\x85\x03\x9a\x52\x92\x83\x4b\x5d\x1c\xc1\xb0\x9b\xa0\xa3\x95\x4d\x29\x32\x36\x73\xf5\xe7\x12\x76\xa1\x2a\xc4\xc5\x79\x35\x5b\xf1\xec\xca\x48\xe6\xa7\x16\xb9\xfc\xec\xdc\x56\x5c\x51\xb9"}, -{{0x9c,0x7f,0x6f,0x37,0x9e,0x38,0x57,0x00,0x7e,0x2a,0xc6,0x32,0x4c,0xbb,0xce,0xd5,0x7a,0xc9,0xee,0xe4,0x47,0x78,0x13,0xf8,0x3a,0x81,0xfc,0x8c,0xef,0xa9,0x64,0xd5,},{0xa5,0x4b,0xa3,0x96,0xd6,0x87,0x63,0x4d,0x3e,0xcc,0xf4,0x1c,0x57,0x82,0x49,0x4f,0x5f,0x10,0xa5,0x21,0xa1,0xe5,0xd3,0x88,0x52,0x3d,0x80,0xee,0xba,0x5b,0x0b,0x2b,},{0x65,0x68,0x5f,0x9c,0xa5,0x98,0x2e,0x15,0xa2,0x2b,0xa3,0xc8,0x3a,0x03,0x48,0x34,0x84,0x82,0xdf,0xae,0x57,0xce,0xa1,0x78,0xf0,0x78,0x0c,0x05,0x7b,0xae,0xbe,0x4a,0xf6,0x32,0xf9,0x84,0x54,0x0a,0x26,0x01,0x9a,0x7f,0xb3,0x42,0x53,0xc9,0xec,0xe7,0xff,0x30,0x8a,0xda,0x23,0x3c,0xe0,0x68,0x63,0x47,0xab,0x5b,0x21,0xce,0x57,0x0b,},"\x3f\x2d\x30\x72\xfe\x73\x83\xe5\x41\x55\x1e\xa9\xab\xdb\xae\xae\x6a\x46\x4a\xe6\xb9\xf0\xba\x78\x6a\x44\x1b\x2d\x08\xda\x5b\xca\xda\x3c\x54\x24\xdc\x69\x31\xd6\xb3\x95\x23\xe2\xde\x0a\x0c\x2e\x4e\x6b\x5b\x8c\xda\x92\x5e\x5e\xac\x93\x84\x16\xa2\xc5\x1b\xf1\x3d\x49\x53\x1d\x7e\xc7\x11\x4b\x1c\x82\xfe\xaf\x90\xf3\xf8\x75\x91\xe3\x97\xd0\x27\x02\xf8\xec\x1b\x30\xd9\x9f\x5b\xe7\xd2\x20\x3e\x4f\xe4\xdb\x2e\xa4\x7e\x7b\x45\x89\xd8\xac\x50\x62\x48\xd7\x34\x74\x66\xed\xbc\x96\xea\x32\xbf\x3a\x6e\xa7\x50\x2d\xd6\x0c\x9e\x84\x90\x27\x15\xab\x2c\x6c\xa6\x8f\x5b\x00\xe1\xd9\x09\xd8\x3a\xa6\xab\x66\x2d\x8a\xea\x87\x0e\xcd\x86\x1f\xec\x69\xf2\xee\xc0\xae\x67\x7d\x29\x95\xb0\xed\x68\x8f\xaa\x8e\xf7\x82\x44\xe0\xd1\x19\x56\x97\xb0\x71\x22\xce\xaa\x11\xf5\xa6\xea\x58\xfb\xdf\xa2\xe2\xec\x2d\xf9\xd1\x86\x93\xae\x96\xd4\x71\x27\x55\x6e\x91\xf0\x86\x49\x82\xc1\x34\x19\xb0\x4a\x63\xf2\x08\xe7\x30\xd2\x69\x51\x88\x2a\xef\xe0\x01\xbc\xa3\x40\x8b\xd9\x86\x27\x48\xc6\xcc\x87\x6c\x28\xca\xc3\xbb\x2e\xb3\x39\x58\x18\xc2\x09\x1e\x0f\xbd\x7a\x0b\x44\x68\xc6\xb0\xd0\x0c\xd0\x08\xc1\x1c\x3c\x3a\xd0\x10\x80\xa1\xf5\xa4\x0a\xe2\xe4\xb0\xc3\xa0\x71\xef\xc8\xe1\xd1\xba\x6a\xce\x6d\x4d\xf0\xff\x19\x82\x9b\x0c\x68\x0b\x3a\xeb\x75\x91\x77\xed\x34"}, -{{0xa4,0x78,0xf3,0x5a,0xbb,0x73,0x72,0x7b,0x6b,0xe6,0xee,0x5e,0x56,0xee,0xc3,0x23,0xc9,0x51,0x78,0x82,0xfd,0x69,0x19,0x36,0x0e,0xbb,0xbf,0x5d,0x5c,0xb8,0xb8,0x3a,},{0x7a,0x6e,0x26,0x6a,0x54,0xd1,0x35,0xdd,0xa0,0x00,0x9c,0xcd,0xa8,0xa9,0x4a,0x47,0x12,0xae,0x5c,0xb1,0x47,0x61,0xe8,0x43,0x6e,0x97,0xc4,0xb7,0x81,0x4d,0x8e,0x8c,},{0x9d,0x16,0xfd,0x40,0xb9,0xf8,0xdd,0x9b,0x4a,0x1a,0x8c,0x6d,0x70,0x3b,0x9f,0xcc,0xbb,0x94,0x0b,0x1e,0x0a,0xe7,0x7a,0x59,0x70,0x37,0x4a,0xf0,0xcf,0x72,0x6f,0x44,0x79,0xfd,0x30,0xd7,0xdf,0xf5,0xcf,0x53,0x49,0x4d,0x9a,0x29,0x6a,0xb6,0xb9,0xe4,0x6e,0xa6,0xc1,0x36,0xb4,0xdb,0x2c,0x71,0xc2,0x1b,0x97,0xc1,0xc8,0x25,0x4d,0x0a,},"\x01\x73\xa3\x40\x50\xb4\x37\x48\x06\x1f\xf8\xf5\xa3\xd7\xc4\x3b\x63\x60\x84\x77\x86\xe8\xbb\x75\xe5\x36\xfb\x47\xb6\x45\xb2\x14\xf2\x21\xba\x24\xd8\x3d\x28\xbc\x02\x50\x24\x66\x3e\x53\x4f\x90\xf6\xe8\x3a\x93\xd8\xbd\xde\xda\x2c\xd8\x80\x81\x55\x65\x2a\x90\x8c\x43\x7c\x2d\xb6\xf3\xed\x49\x12\xf5\x7c\xa5\xb9\x79\x28\xa7\x3b\xe9\x64\xaf\x59\xdf\x44\x39\x85\x4b\xb0\x06\xfc\x29\x5a\x87\xb7\xb7\x22\x39\xc7\xfa\xdf\xec\x40\x71\x55\x09\xd9\x85\x79\xda\xad\xfb\x8d\x52\x4b\x4c\xec\x66\x20\x70\x5e\xfd\x41\x04\xc2\x97\x14\x4a\xea\x72\x29\x74\xe1\x2c\x5e\xce\xe5\x39\x1e\xf2\xd9\x3a\xc2\xb1\x24\xe4\xac\x49\x61\x47\xc8\xb7\x03\x63\x58\x5d\x70\x78\xcc\xc5\x3e\x2a\xe5\x93\x35\x0b\xc2\x55\x48\xa0\x54\x25\x26\xab\x00\xaf\xe4\x77\xa0\xf4\xb2\x73\x97\xc7\x2b\xc7\x4a\x8a\x8a\xb1\x56\xe6\x2b\x8b\xb4\x7c\x3f\xbb\x4b\x34\x91\x3e\x45\x96\x87\x47\x6b\xf3\x31\x42\xc6\x14\x70\x21\x07\xff\xe2\xcc\x01\xe2\x5f\xa3\x02\x75\xe1\xe2\xe6\x3c\xea\x91\x68\xe4\xa4\x7c\x02\xde\x09\x7d\x4d\x85\x3b\x27\x67\x5c\x5b\xb3\x30\xb9\x4a\x97\x4e\xad\x85\xe2\xbd\xee\x8e\xe1\x7c\xbb\x56\x53\x34\x66\x58\xdf\x2f\x91\xf6\xbd\x73\x94\x91\xdd\x71\x98\x8b\x3a\x97\x6a\x3e\x2e\x7a\x9d\x13\x74\x10\xf4\xac\xba\x9f\xeb\x5f\x11\x79\x8c\x9a\x43\xb6\xad\xce\x14\x36\x5a\x7c\x6d"}, -{{0xff,0xe8,0x25,0x14,0x8c,0x09,0x59,0xb3,0xa6,0x8d,0xe8,0x6a,0xd8,0xe8,0xaf,0x7f,0xa5,0xe0,0x78,0xf3,0x63,0xdc,0x12,0x42,0x13,0xc9,0x00,0x20,0xda,0x0c,0x90,0x89,},{0x13,0x91,0x52,0xa0,0xbd,0x22,0x96,0x2d,0xd9,0x19,0xae,0x3e,0x0b,0x16,0x20,0xe0,0x3c,0x03,0x3c,0x2a,0xd0,0xa3,0x97,0x9e,0xc6,0xbc,0xd1,0x70,0x5e,0x23,0xd5,0x98,},{0xfe,0x4e,0x89,0xee,0x31,0x78,0x6c,0x0a,0x3d,0x3d,0xe3,0x64,0x9b,0xb9,0x3f,0x0b,0x8a,0xef,0x1c,0xaf,0x5a,0x83,0x2e,0xc5,0xe4,0x06,0x78,0x10,0x70,0x5a,0xdd,0xdf,0x53,0x9b,0x8f,0x4e,0x05,0xad,0x08,0xcf,0x34,0x79,0xe4,0x5b,0x42,0xc9,0x65,0x28,0xf6,0xd5,0x9a,0x46,0x25,0x70,0x3d,0xdb,0xf1,0x5b,0x63,0x09,0x39,0x65,0xd8,0x0d,},"\xf1\x25\x78\x0d\x0c\xd0\x88\x53\x0f\x0c\x87\xb7\x0b\xd4\x2e\xba\xb5\x6a\xdb\x5a\xd4\x34\x5f\x92\x9a\xe5\xde\xae\x07\xfb\x55\x32\x21\x53\xa8\xf0\x23\xd3\x88\x43\xbf\x5d\x6a\x93\xfe\x99\x3e\xee\x71\xbc\x2e\xe5\x63\xb2\x5a\x50\x91\x8f\x03\xef\xdb\x5d\xbf\x72\x69\xad\xd6\x9d\xed\x3e\x66\x95\x38\x95\x62\x0d\x9b\x6c\xf4\x6b\xa2\x34\x8f\x8d\x66\xd7\xf0\x92\x23\x5e\x37\x8c\x1e\x3e\xdf\xeb\xeb\x78\x08\x4b\xc8\xde\xa0\x13\xf9\x93\x3a\xae\x14\xa0\x41\x94\x82\x76\xd0\x1f\x1c\xb5\x83\x4b\x0e\x59\x0e\x13\xd9\x31\xd1\x92\x92\xbb\x1d\x80\x41\xff\x2f\xe2\xe1\x17\x1a\x2e\x0b\x9a\x05\x98\x21\xd0\x92\x4d\xde\x7f\x3b\x1b\xb5\x98\x13\xf5\xe3\xc6\x35\x20\xaa\xfb\x88\x01\xba\x62\xc7\x09\x7d\x4d\x8c\xf4\x37\xa5\x68\xa7\xf0\x08\x7c\x6e\xa0\xfc\xe6\xe5\x68\xc4\x88\x3f\x1c\xd1\x2c\x74\x9d\x06\xa6\xfe\xb2\x78\xf1\x08\x6a\x8b\x04\x76\x99\x21\xf7\x8a\x99\x59\x06\x2a\xb0\x6f\x98\xee\x80\xc2\xc7\x85\x4f\xfa\x76\x0f\x86\xa8\x9e\xe1\xa5\x12\x66\x05\x3d\x19\x5e\x61\xbb\x1d\xbd\x18\xdd\x89\xff\x39\x4e\x40\x8a\xce\x0f\x64\x1a\x39\x5d\x56\x11\x8e\xa7\x2b\x7d\x8a\xdf\x78\xb1\x65\x5e\xce\xce\x7e\x82\x50\xe8\xa3\xa9\x1c\xb8\xfc\xa0\xd9\xce\x0b\xaf\x89\x80\xa3\x87\xc5\xed\x43\x18\x66\x32\x80\xe5\xb4\x53\x1f\x31\x87\xc4\x7e\xae\xa7\xc3\x29\x72\x8d\xdd\x0e\x40"}, -{{0x49,0xaf,0xf4,0x21,0xa7,0xcd,0x12,0x72,0x2a,0xa8,0x4c,0x48,0xc1,0xfb,0x1c,0x5f,0x8d,0x9e,0x27,0x7d,0x0a,0x99,0xec,0xbc,0x93,0x48,0xc3,0xaa,0xa7,0x4b,0xe4,0x22,},{0x88,0xd2,0xc2,0x62,0x66,0xf4,0x93,0xbc,0x67,0x57,0x8c,0xa0,0xb1,0xf5,0x11,0x60,0xcf,0x0f,0xdb,0x6a,0x09,0xa9,0x06,0xdb,0x9f,0xaa,0x68,0x6f,0x11,0xf8,0x20,0x8d,},{0x74,0x91,0x81,0x28,0x4d,0xf0,0x5d,0xbe,0x59,0x74,0xb9,0x17,0x82,0xa1,0xa7,0x6e,0xa0,0x86,0x42,0xcb,0x0f,0x0c,0x98,0xdb,0x58,0x6c,0x57,0x5c,0x21,0x0c,0xdc,0x8b,0x65,0x1b,0xd3,0x4b,0x75,0x7a,0xe3,0x8e,0x4b,0x6b,0xe9,0x46,0x52,0x35,0xbd,0x0e,0xca,0x43,0x0e,0x26,0xc3,0xee,0xde,0x56,0x1c,0x6e,0x82,0x4d,0xfa,0x20,0x0e,0x0a,},"\x70\xa1\xac\x14\x4b\x75\xfd\xa7\x55\x86\xa7\x9c\x36\xfd\x39\xcc\xe5\xf5\xca\xe2\xe6\x37\x58\x52\xd3\xb6\x2a\x96\x30\x33\x6a\x29\x3e\xa6\xd2\xac\x6e\x5b\x57\xda\x21\xef\x36\x4a\x59\x5b\xb0\x75\x0f\x5b\xf4\xd2\xb3\x20\x67\x64\x23\x87\x0e\x4b\x8e\x08\x69\x60\x1f\x16\x68\x06\x19\x04\x8c\x4e\xde\x27\x6d\xa6\x9f\x20\x5a\x70\x17\x6e\x25\xea\x04\xbd\x08\x97\x63\xe7\x09\xba\x34\x3f\xc8\x83\x1e\x52\x04\x4e\xab\xf9\x44\x1e\x69\x97\xf8\xba\x1a\xeb\x9e\xf0\xf4\x91\x17\x06\x67\xa7\xf5\xfc\x96\x27\xcb\xd0\x55\x1b\x76\xbe\x27\x28\x3a\x4b\x0c\x5f\x66\x78\x46\x68\x82\x26\xa1\x15\xee\x80\x20\xdf\x08\x04\x2b\x19\xb5\x9f\xe5\x51\x31\x6a\x6c\xb6\x91\x68\x60\xb9\xec\xd7\x41\x54\xb4\x05\x10\x38\xa1\x73\x52\x37\x2e\xc1\x4d\x3c\x95\x7d\x2e\xf5\x0f\xf7\x86\x18\x9a\x8a\xeb\x9c\x08\xf4\x5e\xeb\x5e\xb8\xb0\x40\x33\x99\x74\xaa\x97\x98\xc4\x25\xd7\xbe\xcb\x22\x8c\x44\x7a\x6d\x0b\x3c\xef\x27\x18\x93\xe0\xf7\x07\x6e\x22\x3a\x7e\x87\xc6\xa3\xd2\x70\xa0\x33\xbc\x97\xa4\x56\x5e\xdc\xe0\xaa\x91\xff\xc3\xf7\x80\x17\x75\xa6\xf2\x9b\x23\x02\x45\xbd\x71\xfa\x03\x43\x53\xde\x37\x23\x95\xd1\xbf\xcb\xde\xbb\xa0\x81\x33\x0f\x7c\x07\x6b\xe9\x9c\x2c\xf4\x86\x7f\x15\xb7\x8d\x52\xf4\x6f\xc7\x39\x1c\x9c\xb9\x5e\x5d\x64\x64\x3b\xaf\xfe\x72\xa8\xe3\xa6\x50\x66\x7f\xbb\x3e"}, -{{0x70,0x3a,0x6e,0x2b,0x62,0xd0,0x09,0x0c,0x61,0xd8,0x65,0x9b,0x6a,0x96,0x3e,0x03,0xc9,0xd6,0x2c,0x1b,0x38,0xf7,0xd7,0x0e,0x5f,0x9f,0xf0,0x55,0x90,0xcd,0x03,0x60,},{0x37,0x0c,0x21,0xde,0x6e,0xf2,0xfa,0xb5,0x34,0xad,0xa9,0x99,0x86,0x9c,0x90,0xbc,0x9b,0x92,0xcc,0xbf,0x24,0x9b,0x79,0xd3,0x9d,0x95,0x44,0x1d,0x1e,0xde,0x21,0x0a,},{0xe5,0xfd,0x64,0xda,0x02,0x88,0x00,0xc6,0xce,0xed,0x06,0x8a,0x5e,0x59,0x6f,0x16,0x21,0xc7,0x0a,0x8c,0xb1,0x38,0xb3,0x1b,0x32,0x64,0x7e,0xb4,0xb0,0x7b,0xd2,0xec,0xc5,0x94,0x2c,0x18,0x84,0x4f,0x36,0x70,0x33,0xf6,0x73,0x98,0xe3,0x14,0xba,0x2c,0x7c,0xcf,0x29,0x9c,0x06,0x97,0x87,0x77,0x70,0x25,0xd8,0x45,0xf2,0xaa,0xd6,0x0e,},"\xd4\x2a\x17\x56\xe8\x4d\xf4\xb4\xe9\x77\x3f\x86\xf7\x67\x4a\x2c\xd7\x8e\x71\xe4\x0a\xa8\xf6\x44\xe6\x70\x2d\xfb\xc2\xc2\xc5\xca\x90\xfc\x24\x2e\x9c\xb0\x09\x9c\xc8\xf2\xc2\xd3\x13\x6b\xaa\xfc\x0f\xf6\x95\x48\x2f\xda\xcd\xef\x9f\x56\x56\x10\xb6\xe1\x90\x07\x22\xf4\x35\xc6\x38\x5b\x35\xe9\xf6\xc4\x36\xca\x03\x7e\x03\xf6\x4e\x22\x33\xdf\xfa\x58\xdb\x3b\x91\xcc\x1d\xaa\x0b\xb0\xc5\x4c\x8a\x43\xe4\x69\xd2\xcf\xf7\xfa\x2b\xf8\xf5\xd1\xd8\x77\x93\x10\x89\xc8\x2e\xd8\x9a\xba\x42\xf2\xee\x2b\x86\xe4\x45\xcf\xd0\x9f\x4c\xd7\x8b\x35\x19\x1b\xf4\x67\xe7\x84\xee\xf7\x5d\xc9\x87\xe0\x46\xd3\x7d\x4d\x4e\x8e\x9b\xbe\x14\xaf\x80\xd0\x3a\x1f\x40\x89\x83\x84\xb9\xd3\x27\x9f\xac\x9c\x57\xfd\x9c\x7e\xec\xbe\x19\xa5\xac\xc1\x50\x33\xb8\x4e\x07\xfd\x0e\x40\x9b\xdb\xd5\xa5\x7f\x65\x64\x11\x83\xa6\xc0\xa8\xec\x42\x6d\x1f\x1d\x22\x31\x66\xff\x0a\x19\x00\xb2\xe9\x2b\x7d\x85\x83\x5d\x01\x9d\x17\x77\x5e\x50\x93\xcc\xd1\x26\xf9\x0f\x63\xcb\x7d\x15\xcb\xeb\x53\x13\x24\x21\x9c\xd6\x4d\xed\x67\x14\xb2\x1a\x65\x37\x1a\xf0\x72\x10\xdf\xdf\x0e\x4e\x58\xdd\xc7\xd5\x9f\x4c\xfa\x65\xc4\x21\xd8\x14\xee\x2c\x9b\xf6\xdb\xf6\x48\x73\xd5\x79\xb0\x9e\xe5\xdc\xed\xd7\x33\x06\x3e\x03\x9a\xc9\xa5\xf9\xca\x4c\x25\x25\xa4\xcc\x8e\x98\x4d\xa7\x18\x5e\x2d\x64\xfa\xd8\x1c\x8a"}, -{{0x76,0x84,0x9c,0x18,0x8e,0x3e,0xdd,0x0f,0xf5,0xf8,0xfb,0x87,0x4d,0xc0,0x45,0x66,0x45,0x51,0x84,0x45,0xe4,0x1a,0x7d,0x68,0x33,0xe6,0x16,0xc3,0xc4,0x8c,0x98,0x68,},{0xd6,0x70,0xe2,0xea,0x07,0xdb,0x60,0xc2,0x2a,0xb7,0x9a,0x93,0xeb,0xf4,0x9d,0x22,0xa6,0x24,0x5e,0xe3,0xaf,0x07,0xb3,0xbe,0x58,0x4e,0xda,0x69,0x4c,0x37,0x72,0x9e,},{0x71,0x41,0x39,0x9d,0x51,0xda,0xa6,0xeb,0x45,0x19,0xbf,0x3f,0x01,0xb2,0x33,0x92,0x0f,0xa9,0x08,0xfe,0xfa,0x61,0x2f,0x0c,0xd7,0xd5,0xaf,0x8a,0x9a,0x3c,0x44,0x19,0x0e,0x3f,0x63,0x84,0xa8,0xd1,0x4d,0x37,0xc9,0x70,0x30,0xef,0x50,0x18,0xcf,0x8a,0xee,0x8a,0xeb,0x15,0x69,0xa7,0x3d,0x84,0x86,0x2a,0x59,0xb7,0xdf,0x72,0xfe,0x09,},"\x1e\xcc\xb0\xbc\x8e\xca\x3a\xb5\xbe\xe6\x8c\x5f\x8c\xaa\x34\x53\x67\x66\xc7\x05\xf5\x08\x27\xdb\x7a\xc3\x75\xd4\xfe\x30\xb5\x8f\xfb\x7e\x2f\xe4\x90\xcc\x71\xa8\xff\x86\xc0\x06\xd6\x17\x4d\x05\x79\x3a\xb8\xa5\x5d\xd5\x1b\x06\xde\x41\x7b\xc0\xac\x45\x2c\xdc\x7c\xfb\x0b\xb0\x03\x62\xb6\x76\x5d\x20\xdb\x23\xeb\x18\x48\x02\x70\x64\xa1\xd9\x09\x1d\x3b\x10\xed\x77\x6f\x28\xb7\x67\x68\xbd\xfc\x08\xf0\xbc\x51\x1f\x76\xfa\xeb\xa7\x6c\xfc\x4c\xb5\xc8\x3d\xc9\xeb\xe8\xa8\xd7\x9e\xdc\xa9\x23\xec\xcd\x52\x40\x09\xca\xfe\xdc\x90\xe3\xad\x87\xd1\x39\x2e\x1f\xcc\xf4\xe6\x0c\xca\xb9\x5d\xc0\xab\x54\xbf\x44\x24\x5a\x00\x7a\x96\xd4\x66\x34\xb1\xb2\x96\x5b\x82\x9c\x3d\x7d\xaa\x76\x59\x72\xb5\x4a\x7b\x36\x5b\x6f\x34\xd7\x7d\x71\x76\xac\xd8\xd8\x94\xf6\xb4\x17\x09\x1b\x6c\x00\xed\xb7\xa4\xe8\x13\x79\x98\x8b\xfc\xec\xb6\x92\xe9\xc3\xc4\x31\x0a\x7e\x24\x0e\x5c\x10\x63\xcd\xe1\x13\xf2\x2a\x68\x4a\x50\xa1\x12\xff\x47\xd3\x89\x88\x12\xef\xb9\x26\x37\x07\x2b\x86\x16\x3a\xd8\x93\x16\xd2\x21\x19\x5a\xcb\xfa\xd0\xa0\x3a\x1f\xbc\x2d\x96\x7f\xe8\x3f\x84\xc8\x45\x9f\xcc\xd4\x90\xb9\xc5\xb3\xe5\x5d\x27\xe9\x48\x4e\x94\x3c\x41\x7f\x21\x28\xd7\x37\x01\xda\x28\xf4\x9f\xd3\x68\x3f\x33\xa3\x9c\xde\xe2\x34\xbd\x30\x5b\x94\x91\xe2\xf3\xeb\x62\x1b\xe3\xdd\x1d\xbb\xb3\x1b"}, -{{0x83,0xae,0x48,0xad,0x70,0xda,0x0b,0xb3,0xcd,0xf8,0x74,0x81,0xee,0x2c,0x0c,0x85,0x71,0xc2,0xca,0x98,0x67,0x12,0xf8,0xbc,0x23,0x29,0xe9,0xa3,0xe3,0x33,0x83,0xc5,},{0xb7,0x85,0x30,0x90,0x00,0xdf,0x95,0xf5,0xa0,0x4f,0x7d,0x89,0xc4,0x11,0x33,0x01,0x05,0x7a,0xda,0xee,0xb2,0x9b,0xcd,0x28,0xd9,0x93,0x71,0xb5,0x37,0xbb,0xa2,0xf6,},{0x43,0x33,0x23,0x51,0xd3,0xfb,0x7b,0x45,0xfc,0xf3,0x7c,0x60,0x7d,0x44,0x2e,0xa8,0x0d,0xbd,0xa2,0xcb,0x69,0xc2,0x88,0x4f,0x42,0x4e,0x65,0xea,0x3a,0x33,0x1e,0xd8,0x47,0x2d,0x43,0x68,0x40,0x5c,0xb7,0x36,0xb2,0xd6,0x68,0x5a,0xd7,0x82,0xe2,0x39,0xfe,0x83,0x3e,0xd7,0x89,0xa2,0x92,0x31,0x85,0x16,0x6f,0x60,0x83,0x42,0xee,0x05,},"\xb7\x52\x1d\x3f\x71\xc6\x79\xfa\x70\x37\xfe\x74\x88\xa6\x41\xf6\xb9\x7c\x49\x45\x4a\xcc\x8e\x36\xb9\x03\xd8\xf9\xeb\xb5\x4d\x89\xcb\x56\xef\xd1\x9e\x04\xba\x6a\x7c\x8f\x48\xa7\xd3\xec\x9d\xec\xd3\xf1\xcd\x0f\xaf\x6e\x97\x81\x18\xe6\xad\xce\x9c\x6c\x6b\xe6\x3c\x6a\x6a\x1a\xe2\x16\x51\x82\x84\x79\xa4\x6b\xc9\xa0\xf7\x94\x30\x40\xf9\x40\xa0\xd4\x70\xc8\xe5\x77\xc5\xd5\x75\xcb\x53\xc1\xbf\x3a\xb1\xfe\xb0\x50\xdc\xb6\xfe\xf0\xba\x44\x47\xf2\x99\xfd\xb9\xf2\x7e\xcb\x07\x14\xec\xfe\xfd\x74\xba\xd7\xb1\x22\xa4\x62\xc2\x4a\x20\x98\x48\xa0\x33\x89\x07\x45\x78\xc5\xbd\xc3\x63\x96\xd8\x09\xb0\xf1\x40\x18\xda\x64\x91\x7e\x6b\xf8\x7e\xf4\x05\xc8\xf3\xe3\x33\xff\x9c\x3b\xaf\x63\x39\x66\x76\x20\x79\x4b\xb4\x74\x3f\x05\x14\xb5\xde\x7d\x7f\xdd\x94\x7a\x7e\x35\x01\xee\x88\xef\xad\x15\x9e\x33\xa1\x07\x2f\xbb\x99\xc7\xc7\x1e\x9d\x13\xa5\x02\xd5\xa0\x7c\x4f\x81\x7e\xeb\x7f\x0c\x53\x19\xaa\x41\xa9\x6d\x5f\xf4\xf1\x5a\x73\xc2\x9b\x57\x1f\xe2\x11\x09\x0e\x17\x2c\x8d\xb5\x18\x62\x46\x12\xa5\xc3\x71\xa9\xd7\xce\xf6\xde\x35\xeb\xef\x96\xe8\x8e\x1a\x78\xaf\x3b\xd5\xdd\x35\x25\x1a\xb5\x4d\x73\x71\x8f\x3e\x70\xd2\xd5\x90\x21\x53\x1d\xc7\x31\x84\xf0\xfc\x69\xc2\xe9\x29\x65\x84\x4e\xc2\x7c\x1c\x02\xaf\x5e\x9a\x34\x69\xde\x35\x5d\xb2\x25\x6e\x0e\xc2\xa4\xeb\xa3\x0a"}, -{{0x39,0xe5,0x6a,0x65,0x62,0x3a,0x0a,0xeb,0xad,0xe0,0xda,0x12,0xce,0x1d,0xf3,0x78,0xbc,0x92,0x40,0x73,0xf7,0x3a,0x54,0x9e,0xff,0xae,0xbc,0x46,0x5d,0x1a,0x78,0xe2,},{0x83,0xda,0x8a,0xd5,0x0b,0xad,0x09,0xeb,0x3e,0x94,0xc7,0x25,0xdf,0x3c,0xc3,0xa1,0x19,0x73,0x6a,0xdc,0x85,0x9c,0xa1,0xa1,0x05,0x03,0xf4,0x8f,0xf2,0xfe,0xc5,0x96,},{0x39,0x8e,0x82,0x60,0x01,0x1f,0x57,0xd8,0xac,0x8c,0x58,0xd5,0x45,0x7b,0xc6,0x52,0xc7,0x41,0x4a,0xaf,0x6f,0xb2,0xf4,0x26,0xb7,0x89,0x90,0x56,0x60,0x5c,0x0a,0xfc,0x28,0x39,0x24,0x23,0xb2,0xb5,0x71,0xf5,0xe6,0xc3,0xc7,0xf6,0xd6,0x02,0x45,0xe5,0x3e,0xbd,0x03,0xbd,0xc5,0xad,0x3c,0x1a,0xd8,0x73,0x8c,0xb3,0x22,0x14,0xd0,0x0f,},"\xa9\x6d\xc2\xea\x3f\xa1\x35\x14\x92\xa4\x61\x9d\x91\x94\x68\x1f\x8e\xc4\x00\xa9\x71\x58\x24\x44\x82\x65\x38\x38\xcc\xb7\xe1\x56\xa8\x2d\x56\x43\x68\xf8\x3a\x6e\xe1\xbe\x46\xbc\x34\xb8\x17\x20\x0e\x84\x64\xc3\xd1\x2b\x5e\xf2\xc5\x0b\x19\x56\x5b\x88\x1c\x4c\x3d\x45\x63\xfb\x94\x7e\xb4\x7c\x3e\xe9\xc1\xee\x78\x53\x26\x98\x74\x45\x5b\xfa\xcb\xa3\x05\xf3\x07\xd1\xac\x53\x09\xee\xae\x5c\x07\xfa\x5c\x4d\x42\x8e\xdb\xc8\xb9\x52\x8c\x44\x15\x24\x3a\x9e\xf5\x80\xaf\xf8\xfc\xfb\x12\x00\x0a\x71\xfc\xee\xe8\x9d\xe9\x7f\x90\x27\x95\x29\xbc\xc8\x22\xed\x3c\xb3\x4c\x82\xba\x5f\xec\x15\xf4\x94\x56\x63\x63\x6d\x67\xb5\xfe\xce\xac\xc3\x1d\x25\xf9\x8a\xea\x07\xf7\x80\x0d\x5a\x10\x34\x25\x1c\xb9\x1d\xd0\x96\x3e\xc2\xc1\xa5\x47\x73\xa4\xd9\x6c\x18\x35\x7f\x8d\x10\x1d\xe5\x8e\x93\x2f\x8c\x6c\xdd\xe8\xe3\xcf\xce\xf5\xa7\x44\x3f\xdb\xa7\xb7\x83\x20\x40\x3c\x01\x96\x84\x47\x24\xa6\x12\x18\x3e\x34\xbd\xd8\x08\xce\x7b\x95\x88\x61\xca\x37\x11\x57\x30\xea\xed\xe1\xfd\x0b\xaa\xbe\x97\x6e\xfe\xfd\x03\x65\xfd\xf9\x26\x77\x6c\x53\x6f\x47\xff\x80\xde\x5c\x18\x29\x1b\xb7\xe9\xf1\xb9\x13\xff\xd1\xd9\x44\x68\xb7\x89\x75\x2f\xae\x6c\xa8\x97\xc0\xcc\xa5\x3e\xf1\xe7\x31\xd0\x0c\x8b\xdb\xe8\x92\x9e\xa6\xb1\xdc\xe1\xf3\x1a\x20\x68\x8d\x37\xb0\xf3\xa2\xb4\x15\x3b\x30\x6b\xdb\xa1"}, -{{0x4b,0x99,0x21,0x85,0x2f,0x40,0x9a,0x32,0x3a,0xe3,0x81,0x75,0xe8,0xd7,0x6a,0x21,0x1f,0xc4,0xd9,0xc6,0x54,0x17,0x8e,0xea,0x3b,0xaa,0x7a,0x76,0x7a,0x6f,0xda,0x06,},{0x4c,0x72,0x3e,0x43,0x6b,0x6b,0xd9,0x7f,0x44,0xaf,0x52,0x50,0x3b,0x21,0xcc,0x50,0xd5,0xf6,0xad,0x6c,0xfc,0x82,0x88,0x34,0x5d,0xde,0x80,0x54,0xe9,0x95,0x58,0x2e,},{0xcb,0xf1,0xf1,0x64,0x2d,0xf9,0x50,0xeb,0x71,0xfd,0x09,0x59,0x0d,0x34,0xc2,0x65,0x92,0x2c,0x58,0xbd,0x80,0x26,0xbb,0xa3,0xfc,0x0e,0x59,0x4a,0x6b,0xb1,0xf2,0xb9,0x0d,0xa3,0xdc,0x1d,0x5f,0x6b,0x6d,0x5b,0x40,0x5a,0x89,0x6d,0x1d,0xbb,0x71,0xb8,0x68,0x5c,0x4d,0xfc,0x44,0x4a,0xca,0xff,0xe6,0x5a,0xb8,0x33,0x17,0x89,0xf5,0x07,},"\x3f\x33\xd8\xfb\x83\xe6\x87\x41\x09\x0a\x37\xbe\xdd\x74\x5c\xf1\x41\xaa\xae\xd8\xc9\x2f\xfa\x74\x2a\x52\x56\x17\x77\x88\x58\x05\xac\xe1\x42\x46\xab\x98\xa8\xcb\x59\x8c\x9c\xe3\xde\x9b\x29\xba\xe5\xfa\x04\xb1\xcf\x82\x8d\xe1\x1a\xff\x80\xa7\xef\x8a\x3a\x38\xae\xde\x4f\x3c\x35\x63\xa2\x5d\x04\x9b\xad\xca\xd5\xed\x7e\x47\xfd\xbb\xa6\xe1\x11\x30\x7e\xeb\xe9\xef\x49\x06\xbc\x98\x97\x28\xb7\x6e\x84\xaf\xe8\x08\xe6\x65\x3b\x27\x1e\x21\x10\x4a\xa6\x65\xf1\x89\x8d\xd2\xaa\xb2\x30\x90\xe2\x2b\x4e\x34\x4a\x26\x16\xfb\xd8\xee\x4a\xd8\xed\x81\x08\x39\x5e\xba\x81\x7f\xbd\x14\xfe\xc5\xc1\x7d\xcf\x56\xb8\x22\x08\x56\xb2\xb8\x33\xe0\x91\x40\x7d\x50\x89\xb3\x5d\xdf\x34\xb8\x6f\xf7\xdc\x9f\xde\x52\xb2\x1e\xf1\x21\x76\xef\x33\x70\xb7\xf3\xa0\xa8\xcb\x1b\x05\x8a\x51\xae\xff\xf3\xd2\x79\xd8\x0f\x51\xa6\x8b\xfb\x59\x25\x87\xb4\x5c\x5c\x63\xa7\xe4\xd6\x25\xb8\x87\xde\x48\x6a\x11\x83\x16\xc3\xb6\xa2\x38\x57\x5f\x92\xac\x5b\x1c\x94\xc3\xf5\xdb\xbd\x96\x68\x60\x00\xd6\xd3\x9c\xcc\xd5\x58\xd4\x20\xe4\xd4\x47\xa8\xcb\xc4\xbc\x7b\x8c\x6a\x03\xaf\x0f\x00\x34\xfb\x35\x18\xd9\x38\x00\xf0\xf7\x13\xe4\xb1\x37\x32\xe1\x6a\xda\x51\x80\x1d\x7e\x55\x9c\xf8\x39\xd1\x05\x8f\x64\x95\x56\x98\x31\x13\x99\x34\x54\x16\x85\x0d\xdd\xcc\x56\x01\xa6\x84\xfd\x09\xe6\xaf\xd3\x94\x4f\x5e\x19"}, -{{0x1b,0xff,0x65,0x2a,0x2c,0x83,0x09,0xa3,0x93,0xac,0x11,0xda,0x3a,0xa9,0x7f,0xb0,0x78,0xbb,0x28,0x4e,0xd5,0xe1,0xb8,0xcc,0xc9,0x83,0x65,0x2e,0xf8,0x55,0x6c,0xd0,},{0xaa,0xab,0xdc,0x09,0x1f,0xc3,0x68,0x23,0x54,0x20,0x17,0x44,0xe9,0xb7,0x3f,0xd2,0xa6,0xcf,0xb2,0x81,0x91,0x4b,0xf2,0xc7,0x0e,0xc3,0xdc,0x1d,0xec,0x72,0x16,0xb0,},{0x93,0xc9,0xc3,0x34,0x93,0xfc,0x64,0x17,0x2d,0x51,0xe1,0x6a,0x0a,0x1c,0xd7,0x29,0xa0,0xd9,0x9e,0x3c,0xb8,0x64,0xe8,0x9a,0x42,0x98,0x7f,0x39,0xdd,0x8c,0xd2,0x65,0x45,0xfd,0xfe,0x37,0x58,0x19,0x11,0xe8,0x03,0x67,0x7d,0xa4,0xc5,0x5b,0x0a,0x68,0x3d,0xdf,0x62,0xb7,0x28,0xf8,0xf3,0x06,0x85,0xae,0x58,0xf6,0x28,0xeb,0xe6,0x09,},"\x48\xd0\x26\x98\xa9\x7b\xdc\xb3\xef\x07\x8d\xcf\xcf\x57\x50\x00\x5f\x17\x02\xd3\x00\xe7\xe8\x9b\xc4\x36\xe3\x81\x11\x34\x01\xf8\x52\xb8\xb4\xac\xff\x60\xff\xbd\x4a\xb4\x6d\x20\x21\x68\xd9\x8b\x87\x35\xe7\x9c\xb3\x50\xe3\x5b\x07\x0f\xf6\xbd\xca\xfd\x95\x4b\x55\x19\x69\xb6\xb1\xa7\x0c\x91\x31\xeb\xd4\x0d\x96\x14\x02\x91\xd8\xd2\xb0\x91\x54\x0a\x8b\x18\xd8\xe5\x46\x59\x15\xc2\x5d\xbc\x6b\x5c\x9a\x68\x79\x42\x53\x3c\x37\x2c\x8b\x4e\x95\xa9\x53\x67\x71\x69\xb9\x50\xed\xd3\x46\x43\x75\xcd\x43\x13\x2f\xf9\xbd\x54\x1e\xe2\x2b\xd4\x18\xce\x23\x19\x5f\x65\xd8\xb2\x89\xf6\x33\xec\x8d\x71\xe1\xa8\x01\xb0\x6c\x3c\x82\x7f\x62\x7e\x72\x3d\x21\x99\x10\x0c\xe7\x3e\x8e\x4a\x44\x40\xe7\x78\x31\x7a\x47\x49\x10\x79\x3b\x47\xb1\x0f\xfb\x55\xdb\x7f\x28\x1c\x7d\x7a\x03\x3b\xd8\x00\x48\xb8\x26\x73\xb8\x7c\xf9\x5e\x99\x42\x2b\xa6\x28\x68\x8f\x3c\x97\x18\x90\xca\x15\xd1\x2f\x57\x2f\xa1\x97\x7a\x17\x30\x70\x69\xda\x30\x4e\xad\x30\x26\xeb\x01\x04\x26\x68\x89\x0d\x17\x00\x8c\xd1\xe9\x2c\x46\xcb\xe9\xc8\x57\xe7\x19\x3d\xe3\xab\xa3\x91\x1e\x4f\x86\xfe\x0a\x16\x98\xab\x7c\xdb\x92\x51\xa8\x42\x4b\x28\x48\xb9\x6a\xd8\x1e\xa2\x39\xd3\x65\xfd\xea\x92\xea\x5c\x04\x73\xd0\xa6\xbb\x1e\x37\x13\x56\xbd\xfa\xd2\xd0\x35\x03\x36\xd3\xe1\x94\x7c\x93\x6f\xd0\xc2\x51\x95\x44\x50\x11\x73\x1b"}, -{{0x00,0x2f,0xdd,0x1f,0x76,0x41,0x79,0x3a,0xb0,0x64,0xbb,0x7a,0xa8,0x48,0xf7,0x62,0xe7,0xec,0x6e,0x33,0x2f,0xfc,0x26,0xee,0xac,0xda,0x14,0x1a,0xe3,0x3b,0x17,0x83,},{0x77,0xd1,0xd8,0xeb,0xac,0xd1,0x3f,0x4e,0x2f,0x8a,0x40,0xe2,0x8c,0x4a,0x63,0xbc,0x9c,0xe3,0xbf,0xb6,0x97,0x16,0x33,0x4b,0xcb,0x28,0xa3,0x3e,0xb1,0x34,0x08,0x6c,},{0x0d,0xf3,0xaa,0x0d,0x09,0x99,0xad,0x3d,0xc5,0x80,0x37,0x8f,0x52,0xd1,0x52,0x70,0x0d,0x5b,0x3b,0x05,0x7f,0x56,0xa6,0x6f,0x92,0x11,0x2e,0x44,0x1e,0x1c,0xb9,0x12,0x3c,0x66,0xf1,0x87,0x12,0xc8,0x7e,0xfe,0x22,0xd2,0x57,0x37,0x77,0x29,0x62,0x41,0x21,0x69,0x04,0xd7,0xcd,0xd7,0xd5,0xea,0x43,0x39,0x28,0xbd,0x28,0x72,0xfa,0x0c,},"\x5a\xc1\xdf\xc3\x24\xf4\x3e\x6c\xb7\x9a\x87\xab\x04\x70\xfa\x85\x7b\x51\xfb\x94\x49\x82\xe1\x90\x74\xca\x44\xb1\xe4\x00\x82\xc1\xd0\x7b\x92\xef\xa7\xea\x55\xad\x42\xb7\xc0\x27\xe0\xb9\xe3\x37\x56\xd9\x5a\x2c\x17\x96\xa7\xc2\x06\x68\x11\xdc\x41\x85\x83\x77\xd4\xb8\x35\xc1\x68\x8d\x63\x88\x84\xcd\x2a\xd8\x97\x0b\x74\xc1\xa5\x4a\xad\xd2\x70\x64\x16\x39\x28\xa7\x79\x88\xb2\x44\x03\xaa\x85\xaf\x82\xce\xab\x6b\x72\x8e\x55\x47\x61\xaf\x71\x75\xae\xb9\x92\x15\xb7\x42\x1e\x44\x74\xc0\x4d\x21\x3e\x01\xff\x03\xe3\x52\x9b\x11\x07\x7c\xdf\x28\x96\x4b\x8c\x49\xc5\x64\x9e\x3a\x46\xfa\x0a\x09\xdc\xd5\x9d\xca\xd5\x8b\x9b\x92\x2a\x83\x21\x0a\xcd\x5e\x65\x06\x55\x31\x40\x02\x34\xf5\xe4\x0c\xdd\xcf\x98\x04\x96\x8e\x3e\x9a\xc6\xf5\xc4\x4a\xf6\x50\x01\xe1\x58\x06\x7f\xc3\xa6\x60\x50\x2d\x13\xfa\x88\x74\xfa\x93\x33\x21\x38\xd9\x60\x6b\xc4\x1b\x4c\xee\x7e\xdc\x39\xd7\x53\xda\xe1\x2a\x87\x39\x41\xbb\x35\x7f\x7e\x92\xa4\x49\x88\x47\xd6\x60\x54\x56\xcb\x8c\x0b\x42\x5a\x47\xd7\xd3\xca\x37\xe5\x4e\x90\x3a\x41\xe6\x45\x0a\x35\xeb\xe5\x23\x7c\x6f\x0c\x1b\xbb\xc1\xfd\x71\xfb\x7c\xd8\x93\xd1\x89\x85\x02\x95\xc1\x99\xb7\xd8\x8a\xf2\x6b\xc8\x54\x89\x75\xfd\xa1\x09\x9f\xfe\xfe\xe4\x2a\x52\xf3\x42\x8d\xdf\xf3\x5e\x01\x73\xd3\x33\x95\x62\x50\x7a\xc5\xd2\xc4\x5b\xbd\x2c\x19\xcf\xe8\x9b"}, -{{0x25,0xb0,0xf0,0xbb,0x3d,0xcb,0x42,0x2a,0x6f,0x3c,0x6c,0x22,0x0e,0xaa,0xdb,0x11,0xdb,0xfe,0x48,0x9c,0x2d,0x45,0x5b,0x27,0x6c,0xef,0xe8,0xcb,0xa0,0x57,0xf9,0xf3,},{0xfe,0x03,0xc9,0xc4,0x39,0x4a,0xdc,0x74,0xb1,0x3f,0x47,0x65,0x4b,0xea,0xd8,0xbc,0x85,0x59,0x58,0xb4,0x19,0x4f,0xda,0xb2,0x09,0x7a,0xc1,0xb1,0x57,0x93,0x3c,0x05,},{0xda,0x50,0xd5,0x24,0x2b,0xf5,0x1c,0x39,0x51,0x78,0x0c,0xaf,0xd9,0x26,0xd6,0x7b,0xdf,0x56,0x40,0xd5,0xd3,0xbb,0x08,0x43,0x38,0x31,0xd5,0x6e,0x48,0xe2,0x59,0x2a,0x1c,0x37,0x59,0x68,0xbb,0x4d,0x2f,0xbe,0xa5,0x61,0x45,0xab,0xf2,0xd8,0x29,0x91,0x36,0x3b,0x15,0x65,0xfa,0x1e,0xff,0xe2,0x14,0x01,0x1a,0x68,0x6e,0x39,0x95,0x0e,},"\x54\xd9\x9f\x96\x9e\xfa\x88\x70\xfc\x20\xfa\x9a\x96\x2b\xb3\x72\x61\x9c\x32\x44\x39\x72\x8a\xf3\x13\x9c\x2a\x07\xe8\xc1\xb2\x9c\x1e\x4e\xed\xc2\xd4\x0b\xa7\x22\xf6\x3c\xe3\x76\x70\x36\x2a\xf6\xf5\x20\x2a\xdd\x66\x8c\x4f\xb4\xd6\x2f\xa8\xba\xcb\xc7\xd0\x7f\xf3\xbd\x38\xc1\x5a\x01\x06\x42\x59\xcc\x34\x13\x48\x61\x63\x29\x67\x46\x05\x41\xa9\x9b\x8d\x51\x82\xbf\x59\x34\x7b\x5a\x59\x87\x9a\xa3\xb0\x91\xa1\xf3\xe0\x41\x35\xbd\x63\x01\xbe\x52\x26\xd4\x89\x5e\x5e\x9c\x2b\x15\xe4\x8e\x5e\xcd\xf4\x41\x29\xe6\x12\x28\x53\xa6\x06\xfc\x11\x84\x66\xfa\x72\x0b\x5a\xb1\x65\x63\x5c\x3b\xde\x04\xd7\x42\x89\x27\x4f\xa0\x35\x47\xac\xcb\xde\x78\x0e\x1f\xa0\xbf\x2c\x56\xf8\x43\x6a\x53\xe7\x38\x78\xa4\x24\xa2\x9a\xa9\xde\x38\x5d\xba\x41\x9a\xe6\xa5\xd1\x2e\x00\x42\x76\x15\x2b\x58\xd3\x25\xb3\x02\x40\x0a\x55\x33\x3c\x38\xcd\xe4\x90\x8a\xe1\xd0\x12\x1c\xbe\xca\x95\x08\x09\xc5\x43\x31\x42\x77\xc1\x48\x5e\x68\xd9\xf9\xc0\xa9\x62\xd1\xb1\xe0\xdd\xa1\xd4\xa5\x2b\x56\xf8\x30\x8a\x80\xb9\x2a\xcc\x9f\x4e\xbc\x3e\xd4\x5d\x91\xa1\x29\xda\x86\x75\x62\x1a\xf6\x76\x70\x3d\xef\x3b\x84\x11\x31\x83\xb2\xe3\xa8\xc5\x61\x57\xf2\x43\xf1\x39\x80\xf3\xd1\x75\x6f\xea\x76\x68\xc9\x15\x03\xd3\x5c\x83\x9a\x21\x20\xc7\x9e\xc9\x54\xfb\x54\x6d\x7b\x54\x2f\x98\x72\x89\x53\x4f\xfd\xef\x62\xd4\x7f\xd5\xec"}, -{{0xbf,0x5b,0xa5,0xd6,0xa4,0x9d,0xd5,0xef,0x7b,0x4d,0x5d,0x7d,0x3e,0x4e,0xcc,0x50,0x5c,0x01,0xf6,0xcc,0xee,0x4c,0x54,0xb5,0xef,0x7b,0x40,0xaf,0x6a,0x45,0x41,0x40,},{0x1b,0xe0,0x34,0xf8,0x13,0x01,0x7b,0x90,0x0d,0x89,0x90,0xaf,0x45,0xfa,0xd5,0xb5,0x21,0x4b,0x57,0x3b,0xd3,0x03,0xef,0x7a,0x75,0xef,0x4b,0x8c,0x5c,0x5b,0x98,0x42,},{0x27,0x9c,0xac,0xe6,0xfd,0xaf,0x39,0x45,0xe3,0x83,0x7d,0xf4,0x74,0xb2,0x86,0x46,0x14,0x37,0x47,0x63,0x2b,0xed,0xe9,0x3e,0x7a,0x66,0xf5,0xca,0x29,0x1d,0x2c,0x24,0x97,0x85,0x12,0xca,0x0c,0xb8,0x82,0x7c,0x8c,0x32,0x26,0x85,0xbd,0x60,0x55,0x03,0xa5,0xec,0x94,0xdb,0xae,0x61,0xbb,0xdc,0xae,0x1e,0x49,0x65,0x06,0x02,0xbc,0x07,},"\x16\x15\x2c\x2e\x03\x7b\x1c\x0d\x32\x19\xce\xd8\xe0\x67\x4a\xee\x6b\x57\x83\x4b\x55\x10\x6c\x53\x44\x62\x53\x22\xda\x63\x8e\xce\xa2\xfc\x9a\x42\x4a\x05\xee\x95\x12\xd4\x8f\xcf\x75\xdd\x8b\xd4\x69\x1b\x3c\x10\xc2\x8e\xc9\x8e\xe1\xaf\xa5\xb8\x63\xd1\xc3\x67\x95\xed\x18\x10\x5d\xb3\xa9\xaa\xbd\x9d\x2b\x4c\x17\x47\xad\xba\xf1\xa5\x6f\xfc\xc0\xc5\x33\xc1\xc0\xfa\xef\x33\x1c\xdb\x79\xd9\x61\xfa\x39\xf8\x80\xa1\xb8\xb1\x16\x47\x41\x82\x2e\xfb\x15\xa7\x25\x9a\x46\x5b\xef\x21\x28\x55\x75\x1f\xab\x66\xa8\x97\xbf\xa2\x11\xab\xe0\xea\x2f\x2e\x1c\xd8\xa1\x1d\x80\xe1\x42\xcd\xe1\x26\x3e\xec\x26\x7a\x31\x38\xae\x1f\xcf\x40\x99\xdb\x0a\xb5\x3d\x64\xf3\x36\xf4\xbc\xd7\xa3\x63\xf6\xdb\x11\x2c\x0a\x24\x53\x05\x1a\x00\x06\xf8\x13\xaa\xf4\xae\x94\x8a\x20\x90\x61\x93\x74\xfa\x58\x05\x24\x09\xc2\x8e\xf7\x62\x25\x68\x7d\xf3\xcb\x2d\x1b\x0b\xfb\x43\xb0\x9f\x47\xf1\x23\x2f\x79\x0e\x6d\x8d\xea\x75\x9e\x57\x94\x20\x99\xf4\xc4\xbd\x33\x90\xf2\x8a\xfc\x20\x98\x24\x49\x61\x46\x5c\x64\x3f\xc8\xb2\x97\x66\xaf\x2b\xcb\xc5\x44\x0b\x86\xe8\x36\x08\xcf\xc9\x37\xbe\x98\xbb\x48\x27\xfd\x5e\x6b\x68\x9a\xdc\x2e\x26\x51\x3d\xb5\x31\x07\x6a\x65\x64\x39\x62\x55\xa0\x99\x75\xb7\x03\x4d\xac\x06\x46\x1b\x25\x56\x42\xe3\xa7\xed\x75\xfa\x9f\xc2\x65\x01\x1f\x5f\x62\x50\x38\x2a\x84\xac\x26\x8d\x63\xba\x64"}, -{{0x65,0xde,0x29,0x7b,0x70,0xcb,0xe8,0x09,0x80,0x50,0x0a,0xf0,0x56,0x1a,0x24,0xdb,0x50,0x00,0x10,0x00,0x12,0x5f,0x44,0x90,0x36,0x6d,0x83,0x00,0xd3,0x12,0x85,0x92,},{0xba,0x8e,0x2a,0xd9,0x29,0xbd,0xce,0xa5,0x38,0x74,0x10,0x42,0xb5,0x7f,0x20,0x67,0xd3,0x15,0x37,0x07,0xa4,0x53,0x77,0x0d,0xb9,0xf3,0xc4,0xca,0x75,0x50,0x4d,0x24,},{0x7a,0x9b,0x73,0x6b,0x01,0xcc,0x92,0xa3,0x34,0x9f,0x1a,0x3c,0x32,0xdb,0xd9,0x19,0x59,0x82,0x53,0x94,0xff,0x44,0x3c,0x56,0x74,0x05,0xe8,0x99,0xc8,0x18,0x5c,0xe8,0xfa,0xd9,0x50,0x0e,0x1f,0xce,0x89,0xd9,0x5a,0x62,0x53,0xc0,0x04,0x77,0x43,0x5a,0xcf,0x04,0xbf,0xf9,0x93,0xde,0x1b,0x00,0x49,0x5d,0xef,0x08,0x34,0xee,0x1f,0x07,},"\x13\x1d\x8f\x4c\x2c\x94\xb1\x53\x56\x5b\x86\x59\x2e\x77\x0c\x98\x7a\x44\x34\x61\xb3\x9a\xa2\x40\x8b\x29\xe2\x13\xab\x05\x7a\xff\xc5\x98\xb5\x83\x73\x9d\x66\x03\xa8\x3f\xef\x0a\xfc\x51\x47\x21\xdb\x0e\x76\xf9\xbd\x1b\x72\xb9\x8c\x56\x5c\xc8\x88\x1a\xf5\x74\x7c\x0b\xa6\xf5\x8c\x53\xdd\x23\x77\xda\x6c\x0d\x3a\xa8\x05\x62\x0c\xc4\xe7\x5d\x52\xaa\xbc\xba\x1f\x9b\x28\x49\xe0\x8b\xd1\xb6\xb9\x2e\x6f\x06\x61\x5b\x81\x45\x19\x60\x6a\x02\xdc\x65\xa8\x60\x9f\x5b\x29\xe9\xc2\xaf\x5a\x89\x4f\x71\x16\xef\x28\xcf\xd1\xe7\xb7\x6b\x64\x06\x17\x32\xf7\xa5\xa3\xf8\xaa\x4c\x2e\x56\x9e\x62\x7a\x3f\x97\x49\xaa\x59\x7b\xe4\x9d\x6b\x94\x43\x6c\x35\x2d\xd5\xfa\x7b\x83\xc9\x2d\x26\x10\xfa\xa3\x20\x95\xca\x30\x21\x52\xd9\x1a\x3c\x97\x76\x75\x0e\x75\x8e\xe8\xe9\xe4\x02\xc6\xf5\x38\x5e\xaa\x5d\xf2\x38\x50\xe5\x4b\xeb\x1b\xe4\x37\xa4\x16\xc7\x11\x5e\xd6\xaa\x6d\xe1\x3b\x55\x48\x25\x32\x78\x7e\x0b\xee\x34\xb8\x3f\x30\x84\x40\x67\x65\x63\x54\x97\xc9\x31\xb6\x2a\x05\x18\xf1\xfb\xc2\xb8\x91\xdc\x72\x62\xc7\xc6\xb6\x7e\xda\x59\x4f\xa5\x30\xd7\x4c\x93\x29\xba\xd5\xbe\x94\xc2\x87\xfb\xcd\xe5\x3a\xa8\x02\x72\xb8\x33\x22\x61\x3d\x93\x68\xe5\x90\x40\x76\xfd\xbc\xc8\x8b\x2c\x0e\x59\xc1\x0b\x02\xc4\x48\xe0\x0d\x1b\x3e\x7a\x9c\x96\x40\xfe\xff\xb9\x52\x3a\x8a\x60\xe1\xd8\x3f\x04\xa4\xb8\xdf\x69\x15\x3b"}, -{{0x08,0x26,0xe7,0x33,0x33,0x24,0xe7,0xec,0x8c,0x76,0x42,0x92,0xf6,0x01,0x5d,0x46,0x70,0xe9,0xb8,0xd7,0xc4,0xa8,0x9e,0x8d,0x90,0x9e,0x8e,0xf4,0x35,0xd1,0x8d,0x15,},{0xff,0xb2,0x34,0x8c,0xa8,0xa0,0x18,0x05,0x8b,0xe7,0x1d,0x15,0x12,0xf3,0x76,0xf9,0x1e,0x8b,0x0d,0x55,0x25,0x81,0x25,0x4e,0x10,0x76,0x02,0x21,0x73,0x95,0xe6,0x62,},{0x4b,0xac,0x7f,0xab,0xec,0x87,0x24,0xd8,0x1a,0xb0,0x9a,0xe1,0x30,0x87,0x4d,0x70,0xb5,0x21,0x34,0x92,0x10,0x43,0x72,0xf6,0x01,0xae,0x5a,0xbb,0x10,0x53,0x27,0x99,0x37,0x3c,0x4d,0xad,0x21,0x58,0x76,0x44,0x1f,0x47,0x4e,0x2c,0x00,0x6b,0xe3,0x7c,0x3c,0x8f,0x5f,0x6f,0x01,0x7d,0x08,0x70,0x41,0x4f,0xd2,0x76,0xa8,0xf4,0x28,0x08,},"\x7f\x9e\x3e\x2f\x03\xc9\xdf\x3d\x21\xb9\x90\xf5\xa4\xaf\x82\x95\x73\x4a\xfe\x78\x3a\xcc\xc3\x4f\xb1\xe9\xb8\xe9\x5a\x0f\xd8\x37\xaf\x7e\x05\xc1\x3c\xda\x0d\xe8\xfa\xda\xc9\x20\x52\x65\xa0\x79\x2b\x52\x56\x3b\xdc\x2f\xee\x76\x63\x48\xbe\xfc\xc5\x6b\x88\xbb\xb9\x5f\x15\x44\x14\xfb\x18\x6e\xc4\x36\xaa\x62\xea\x6f\xca\xbb\x11\xc0\x17\xa9\xd2\xd1\x5f\x67\xe5\x95\x98\x0e\x04\xc9\x31\x3b\xc9\x4f\xbc\x8c\x11\x34\xc2\xf4\x03\x32\xbc\x7e\x31\x1a\xc1\xce\x11\xb5\x05\xf8\x57\x2a\xda\x7f\xbe\x19\x6f\xba\x82\x2d\x9a\x91\x44\x92\xfa\x71\x85\xe9\xf3\xbe\xa4\x68\x72\x00\xa5\x24\xc6\x73\xa1\xcd\xf8\x7e\xb3\xa1\x40\xdc\xdb\x6a\x88\x75\x61\x34\x88\xa2\xb0\x0a\xdf\x71\x75\x34\x1c\x1c\x25\x76\x35\xfa\x1a\x53\xa3\xe2\x1d\x60\xc2\x28\x39\x9e\xea\x09\x91\xf1\x12\xc6\x0f\x65\x3d\x71\x48\xe2\xc5\xce\xb9\x8f\x94\x08\x31\xf0\x70\xdb\x10\x84\xd7\x91\x56\xcc\x82\xc4\x6b\xc9\xb8\xe8\x84\xf3\xfa\x81\xbe\x2d\xa4\xcd\xda\x46\xbc\xaa\x24\xcc\x46\x1f\x76\xee\x64\x7b\xb0\xf0\xf8\xc1\x5a\xc5\xda\xa7\x95\xb9\x45\xe6\xf8\x5b\xb3\x10\x36\x2e\x48\xd8\x09\x5c\x78\x2c\x61\xc5\x2b\x48\x1b\x4b\x00\x2a\xd0\x6e\xa7\x4b\x8d\x30\x6e\xff\x71\xab\xf2\x1d\xb7\x10\xa8\x91\x3c\xbe\x48\x33\x2b\xe0\xa0\xb3\xf3\x1e\x0c\x7a\x6e\xba\x85\xce\x33\xf3\x57\xc7\xae\xcc\xd3\x0b\xfb\x1a\x65\x74\x40\x8b\x66\xfe\x40\x4d\x31\xc3\xc5"}, -{{0x00,0xad,0x62,0x27,0x97,0x7b,0x5f,0x38,0xcc,0xda,0x99,0x4d,0x92,0x8b,0xba,0x90,0x86,0xd2,0xda,0xeb,0x01,0x3f,0x86,0x90,0xdb,0x98,0x66,0x48,0xb9,0x0c,0x1d,0x45,},{0x91,0xa4,0xea,0x00,0x57,0x52,0xb9,0x2c,0xbe,0xbf,0x99,0xa8,0xa5,0xcb,0xec,0xd2,0x40,0xae,0x3f,0x01,0x6c,0x44,0xad,0x14,0x1b,0x2e,0x57,0xdd,0xc7,0x73,0xdc,0x8e,},{0xdc,0x50,0x1d,0xb7,0x9f,0xd7,0x82,0xbc,0x88,0xca,0xe7,0x92,0x55,0x7d,0x5d,0x27,0x3f,0x9b,0xa5,0x60,0xc7,0xd9,0x00,0x37,0xfe,0x84,0xac,0x87,0x9d,0x68,0x4f,0x61,0x2a,0x77,0x45,0x2c,0x44,0x43,0xe9,0x5c,0x07,0xb8,0xbe,0x19,0x2c,0x35,0x76,0x9b,0x17,0xbb,0xdf,0xca,0x42,0x28,0x0d,0xe7,0x96,0xd9,0x21,0x19,0xd8,0x33,0x67,0x0d,},"\xcb\x5b\xc5\xb9\x8b\x2e\xfc\xe4\x35\x43\xe9\x1d\xf0\x41\xe0\xdb\xb5\x3e\xd8\xf6\x7b\xf0\xf1\x97\xc5\x2b\x22\x11\xe7\xa4\x5e\x2e\x1e\xc8\x18\xc1\xa8\x0e\x10\xab\xf6\xa4\x35\x35\xf5\xb7\x9d\x97\x4d\x8a\xe2\x8a\x22\x95\xc0\xa6\x52\x17\x63\xb6\x07\xd5\x10\x3c\x6a\xef\x3b\x27\x86\xbd\x5a\xfd\x75\x63\x69\x56\x60\x68\x43\x37\xbc\x30\x90\x73\x9f\xb1\xcd\x53\xa9\xd6\x44\x13\x9b\x6d\x4c\xae\xc7\x5b\xda\x7f\x25\x21\xfb\xfe\x67\x6a\xb4\x5b\x98\xcb\x31\x7a\xa7\xca\x79\xfc\x54\xa3\xd7\xc5\x78\x46\x6a\x6a\xa6\x4e\x43\x4e\x92\x34\x65\xa7\xf2\x11\xaa\x0c\x61\x68\x1b\xb8\x48\x6e\x90\x20\x6a\x25\x25\x0d\x3f\xda\xe6\xfb\x03\x29\x97\x21\xe9\x9e\x2a\x91\x49\x10\xd9\x17\x60\x08\x9b\x5d\x28\x1e\x13\x1e\x6c\x83\x6b\xc2\xde\x08\xf7\xe0\x2c\x48\xd3\x23\xc6\x47\xe9\x53\x6c\x00\xec\x10\x39\x20\x1c\x03\x62\x61\x8c\x7d\x47\xaa\x8e\x7b\x97\x15\xff\xc4\x39\x98\x7a\xe1\xd3\x11\x54\xa6\x19\x8c\x5a\xa1\x1c\x12\x8f\x40\x82\xf5\x56\xc9\x9b\xaf\x10\x3e\xca\xdc\x3b\x2f\x3b\x2e\xc5\xb4\x69\x62\x3b\xc0\x3a\x53\xca\xf3\x81\x4b\x16\x30\x0a\xed\xbd\xa5\x38\xd6\x76\xd1\xf6\x07\x10\x26\x39\xdb\x2a\x62\xc4\x46\x70\x7c\xe6\x46\x9b\xd8\x73\xa0\x46\x82\x25\xbe\x88\xb0\xae\xf5\xd4\x02\x04\x59\xb9\x4b\x32\xfe\x2b\x01\x33\xe9\x2e\x7b\xa5\x4d\xd2\xa5\x39\x7e\xd8\x5f\x96\x6a\xb3\x9e\xd0\x73\x0c\xca\x8e\x7d\xac\xb8\xa3\x36"}, -{{0x15,0x21,0xc6,0xdb,0xd6,0xf7,0x24,0xde,0x73,0xea,0xf7,0xb5,0x62,0x64,0xf0,0x10,0x35,0xc0,0x4e,0x01,0xc1,0xf3,0xeb,0x3c,0xbe,0x83,0xef,0xd2,0x6c,0x43,0x9a,0xda,},{0x2f,0x61,0xa2,0x6f,0xfb,0x68,0xba,0x4f,0x6e,0x14,0x15,0x29,0xdc,0x26,0x17,0xe8,0x53,0x1c,0x71,0x51,0x40,0x48,0x08,0x09,0x3b,0x4f,0xa7,0xfe,0xda,0xea,0x25,0x5d,},{0xa8,0x17,0xed,0x23,0xec,0x39,0x8a,0x12,0x86,0x01,0xc1,0x83,0x2d,0xc6,0xaf,0x76,0x43,0xbf,0x3a,0x5f,0x51,0x7b,0xcc,0x57,0x94,0x50,0xfd,0xb4,0x75,0x90,0x28,0xf4,0x96,0x61,0x64,0x12,0x5f,0x6e,0xbd,0x0d,0x6b,0xf8,0x6f,0xf2,0x98,0xa3,0x9c,0x76,0x6d,0x0c,0x21,0xfd,0xb0,0xcb,0xfd,0xf8,0x1c,0xd0,0xeb,0x1f,0x03,0xcd,0x8a,0x08,},"\x3e\x3c\x7c\x49\x07\x88\xe4\xb1\xd4\x2f\x5c\xbc\xae\x3a\x99\x30\xbf\x61\x7e\xbd\xff\x44\x7f\x7b\xe2\xac\x2b\xa7\xcd\x5b\xcf\xc0\x15\x76\x09\x63\xe6\xfe\x5b\x95\x6f\xb7\xcd\xb3\x5b\xd5\xa1\x7f\x54\x29\xca\x66\x4f\x43\x7f\x08\x75\x3a\x74\x1c\x2b\xc8\x69\x2b\x71\xa9\x11\x5c\x58\x2a\x25\xb2\xf7\x4d\x32\x98\x54\xd6\x0b\x78\x17\xc0\x79\xb3\x52\x3a\xaf\xf8\x79\x3c\x2f\x72\xff\xf8\xcd\x10\x59\x2c\x54\xe7\x38\xdf\x1d\x64\x52\xfb\x72\xda\x13\x1c\x67\x31\xea\x5c\x95\x3c\x62\xea\x17\x7a\xc1\xf4\x73\x5e\x51\x54\x47\x73\x87\x10\x9a\xfa\xe1\x5f\x3e\xd6\xee\xb0\x86\x06\xe2\x8c\x81\xd4\x38\x6f\x03\xb9\x37\x69\x24\xb6\xef\x8d\x22\x1e\xe2\x95\x47\xf8\x2a\x7e\xde\x48\xe1\xdc\x17\x72\x3e\x3d\x42\x17\x1e\xea\xf9\x6a\xc8\x4b\xed\xc2\xa0\x1d\xd8\x6f\x4d\x08\x57\x34\xfd\x69\xf9\x1b\x52\x63\xe4\x39\x08\x3f\xf0\x31\x85\x36\xad\xff\x41\x47\x30\x8e\x3a\xaf\xd1\xb5\x8b\xb7\x4f\x6f\xb0\x21\x4a\x46\xfd\xcd\x35\x24\xf1\x8d\xf5\xa7\x19\xce\x57\x31\x9e\x79\x1b\x4e\xa6\x06\xb4\x99\xbf\xa5\x7a\x60\xe7\x07\xf9\x4e\x18\xf1\xfe\xd2\x2f\x91\xbc\x79\xe6\x36\x4a\x84\x3f\x9c\xbf\x93\x82\x5c\x46\x5e\x9c\xae\x90\x72\xbc\x9d\x3e\xc4\x47\x1f\x21\xab\x2f\x7e\x99\xa6\x33\xf5\x87\xaa\xc3\xdb\x78\xae\x96\x66\xa8\x9a\x18\x00\x8d\xd6\x1d\x60\x21\x85\x54\x41\x1a\x65\x74\x0f\xfd\x1a\xe3\xad\xc0\x65\x95\xe3\xb7\x87\x64\x07\xb6"}, -{{0x17,0xe5,0xf0,0xa8,0xf3,0x47,0x51,0xba,0xbc,0x5c,0x72,0x3e,0xcf,0x33,0x93,0x06,0x99,0x2f,0x39,0xea,0x06,0x5a,0xc1,0x40,0xfc,0xbc,0x39,0x7d,0x2d,0xd3,0x2c,0x4b,},{0x4f,0x1e,0x23,0xcc,0x0f,0x2f,0x69,0xc8,0x8e,0xf9,0x16,0x2a,0xb5,0xf8,0xc5,0x9f,0xb3,0xb8,0xab,0x20,0x96,0xb7,0x7e,0x78,0x2c,0x63,0xc0,0x7c,0x8c,0x4f,0x2b,0x60,},{0xef,0xe2,0xcb,0x63,0xfe,0x7b,0x4f,0xc9,0x89,0x46,0xdc,0x82,0xfb,0x69,0x98,0xe7,0x41,0xed,0x9c,0xe6,0xb9,0xc1,0xa9,0x3b,0xb4,0x5b,0xc0,0xa7,0xd8,0x39,0x6d,0x74,0x05,0x28,0x2b,0x43,0xfe,0x36,0x3b,0xa5,0xb2,0x35,0x89,0xf8,0xe1,0xfa,0xe1,0x30,0xe1,0x57,0xce,0x88,0x8c,0xd7,0x2d,0x05,0x3d,0x0c,0xc1,0x9d,0x25,0x7a,0x43,0x00,},"\xc0\xfa\xd7\x90\x02\x40\x19\xbd\x6f\xc0\x8a\x7a\x92\xf5\xf2\xac\x35\xcf\x64\x32\xe2\xea\xa5\x3d\x48\x2f\x6e\x12\x04\x93\x53\x36\xcb\x3a\xe6\x5a\x63\xc2\x4d\x0e\xc6\x53\x9a\x10\xee\x18\x76\x0f\x2f\x52\x05\x37\x77\x4c\xde\xc6\xe9\x6b\x55\x53\x60\x11\xda\xa8\xf8\xbc\xb9\xcd\xaf\x6d\xf5\xb3\x46\x48\x44\x8a\xc7\xd7\xcb\x7c\x6b\xd8\x0d\x67\xfb\xf3\x30\xf8\x76\x52\x97\x76\x60\x46\xa9\x25\xab\x52\x41\x1d\x16\x04\xc3\xed\x6a\x85\x17\x30\x40\x12\x56\x58\xa3\x2c\xf4\xc8\x54\xef\x28\x13\xdf\x2b\xe6\xf3\x83\x0e\x5e\xee\x5a\x61\x63\xa8\x3c\xa8\x84\x9f\x61\x29\x91\xa3\x1e\x9f\x88\x02\x8e\x50\xbf\x85\x35\xe1\x17\x55\xfa\xd0\x29\xd9\x4c\xf2\x59\x59\xf6\x69\x5d\x09\xc1\xba\x43\x15\xd4\x0f\x7c\xf5\x1b\x3f\x81\x66\xd0\x2f\xab\xa7\x51\x1e\xcd\x8b\x1d\xde\xd5\xf1\x0c\xd6\x84\x34\x55\xcf\xf7\x07\xed\x22\x53\x96\xc6\x1d\x08\x20\xd2\x0a\xda\x70\xd0\xc3\x61\x9f\xf6\x79\x42\x20\x61\xc9\xf7\xc7\x6e\x97\xd5\xa3\x7a\xf6\x1f\xd6\x22\x12\xd2\xda\xfc\x64\x7e\xbb\xb9\x79\xe6\x1d\x90\x70\xec\x03\x60\x9a\x07\xf5\xfc\x57\xd1\x19\xae\x64\xb7\xa6\xef\x92\xa5\xaf\xae\x66\x0a\x30\xed\x48\xd7\x02\xcc\x31\x28\xc6\x33\xb4\xf1\x90\x60\xa0\x57\x81\x01\x72\x9e\xe9\x79\xf7\x90\xf4\x5b\xdb\xb5\xfe\x1a\x8a\x62\xf0\x1a\x61\xa3\x1d\x61\xaf\x07\x03\x04\x50\xfa\x04\x17\x32\x3e\x94\x07\xbc\x76\xe7\x31\x30\xe7\xc6\x9d\x62\xe6\xa7"}, -{{0x0c,0xd7,0xaa,0x7d,0x60,0x5e,0x44,0xd5,0xff,0xb9,0x79,0x66,0xb2,0xcb,0x93,0xc1,0x89,0xe4,0xc5,0xa8,0x5d,0xb8,0x7f,0xad,0x7a,0xb8,0xd6,0x24,0x63,0xc5,0x9b,0x59,},{0x48,0x89,0x85,0x5f,0xe4,0x11,0x6b,0x49,0x13,0x92,0x7f,0x47,0xf2,0x27,0x3b,0xf5,0x59,0xc3,0xb3,0x94,0xa9,0x83,0x63,0x1a,0x25,0xae,0x59,0x70,0x33,0x18,0x5e,0x46,},{0xbf,0x91,0x15,0xfd,0x3d,0x02,0x70,0x6e,0x39,0x8d,0x4b,0xf3,0xb0,0x2a,0x82,0x67,0x4f,0xf3,0x04,0x15,0x08,0xfd,0x39,0xd2,0x9f,0x86,0x7e,0x50,0x16,0x34,0xb9,0x26,0x1f,0x51,0x6a,0x79,0x4f,0x98,0x73,0x8d,0x7c,0x70,0x13,0xa3,0xf2,0xf8,0x58,0xff,0xdd,0x08,0x04,0x7f,0xb6,0xbf,0x3d,0xdd,0xfb,0x4b,0x4f,0x4c,0xbe,0xef,0x30,0x03,},"\x28\xa5\x5d\xda\x6c\xd0\x84\x4b\x65\x77\xc9\xd6\xda\x07\x3a\x4d\xc3\x5c\xbc\x98\xac\x15\x8a\xb5\x4c\xf8\x8f\xd2\x0c\xc8\x7e\x83\xc4\xbb\xa2\xd7\x4d\x82\xce\x0f\x48\x54\xec\x4d\xb5\x13\xde\x40\x04\x65\xaa\xa5\xee\xe7\x90\xbc\x84\xf1\x63\x37\x07\x2d\x3a\x91\xcd\xe4\x0d\x6e\x0d\xf1\xba\x0c\xc0\x64\x5f\x5d\x5c\xbb\xb6\x42\x38\x1d\x7b\x9e\x21\x1d\x25\x26\x7a\x8a\xcf\x77\xd1\xed\xb6\x9c\x3a\x63\x0f\x5b\x13\x3d\x24\xf0\x46\xa8\x1b\xf2\x2f\xf0\x3b\x31\xd8\x44\x7e\x12\xc3\xf7\xb7\x71\x14\xa7\x0c\xbd\x20\xbb\xd0\x8b\x0b\x38\x27\xa6\xbb\xcf\x90\x40\x9e\x34\x44\x47\xa7\xfb\xc5\x9b\xdd\x97\xd7\x29\x07\x1f\x8d\x71\xdc\xc3\x3e\x6e\xf2\xcb\xab\x1d\x41\x1e\xdf\x13\x73\x4d\xb1\xdd\x97\x03\x27\x6f\x5e\xb2\xd6\xaa\x2c\xb8\x95\x2d\xd6\x71\x2b\xfa\xe8\x09\xce\x08\xc3\xaa\x50\x2b\x81\x35\x71\x3f\xac\x0a\x9c\x25\xb1\xd4\x5b\x6a\x58\x31\xe0\x24\x21\xbb\xa6\x5b\x81\xa5\x96\xef\xa2\x4b\x05\x76\xbd\x1d\xc7\xfd\xfb\x49\xbe\x76\x28\x75\xe8\x1b\xd5\x40\x72\x2b\xc0\x61\x40\xb9\xaa\x2e\xf7\xb8\x4a\x80\x1e\x41\xde\xd6\x8d\x45\x46\xac\x48\x73\xd9\xe7\xce\xd6\x49\xb6\x4f\xad\xaf\x0b\x5c\x4b\x6e\xb8\xd0\x36\x31\x52\x33\xf4\x32\x6c\xa0\x1e\x03\x39\x30\x50\xcd\x02\x7c\x24\xf6\x73\x03\xfb\x84\x6b\xd2\xc6\xb3\xdb\xa0\x6b\xed\x0d\x59\xa3\x62\x89\xd2\x4b\xd6\x48\xf7\xdb\x0b\x3a\x81\x34\x66\x12\x59\x3e\x3d\xdd\x18\xc5\x57"}, -{{0x33,0x37,0x1d,0x9e,0x89,0x2f,0x98,0x75,0x05,0x2a,0xc8,0xe3,0x25,0xba,0x50,0x5e,0x74,0x77,0xc1,0xac,0xe2,0x4b,0xa7,0x82,0x26,0x43,0xd4,0x3d,0x0a,0xce,0xf3,0xde,},{0x35,0x92,0x9b,0xde,0xd2,0x7c,0x24,0x9c,0x87,0xd8,0xb8,0xd8,0x2f,0x59,0x26,0x0a,0x57,0x53,0x27,0xb5,0x46,0xc3,0xa1,0x67,0xc6,0x9f,0x59,0x92,0xd5,0xb8,0xe0,0x06,},{0x98,0x5c,0xa4,0x46,0xdd,0xc0,0x07,0x82,0x7c,0xc8,0xf2,0x85,0x2c,0xbd,0x81,0x15,0xef,0x8c,0x59,0x75,0xe9,0xd7,0xce,0x96,0xd7,0x4d,0xfe,0xd8,0x59,0xaa,0x14,0xa4,0xc1,0x52,0x54,0x00,0x6b,0xea,0x5e,0x08,0x35,0x9e,0xfe,0x26,0x25,0xd7,0x15,0xe0,0x89,0x7e,0xe5,0xa1,0x6f,0x15,0x12,0x03,0xbe,0x50,0x10,0x41,0x86,0x37,0xde,0x05,},"\x27\xa3\x2e\xfb\xa2\x82\x04\xbe\x59\xb7\xff\x5f\xe4\x88\xca\x15\x8a\x91\xd5\x98\x60\x91\xec\xc4\x45\x8b\x49\xe0\x90\xdd\x37\xcb\xfe\xde\x7c\x0f\x46\x18\x6f\xab\xcb\xdf\xf7\x8d\x28\x44\x15\x58\x08\xef\xff\xd8\x73\xed\x9c\x92\x61\x52\x6e\x04\xe4\xf7\x05\x0b\x8d\x7b\xd2\x67\xa0\xfe\x3d\x5a\x44\x93\x78\xd5\x4a\x4f\xeb\xbd\x2f\x26\x82\x43\x38\xe2\xaa\xaf\x35\xa3\x2f\xf0\xf6\x25\x04\xbd\xa5\xc2\xe4\x4a\xbc\x63\x15\x9f\x33\x6c\xf2\x5e\x6b\xb4\x0d\xdb\x7d\x88\x25\xdf\xf1\x8f\xd5\x1f\xc0\x19\x51\xea\xed\xcd\x33\x70\x70\x07\xe1\x20\x3c\xa5\x8b\x4f\x7d\x24\x2f\x81\x66\xa9\x07\xe0\x99\x93\x2c\x00\x1b\xfb\x1e\xc9\xa6\x1e\x0e\xf2\xda\x4e\x84\x46\xaf\x20\x82\x01\x31\x5d\x69\x68\x17\x10\xd4\x25\xd2\x40\x0c\x38\x7d\x7b\x9d\xf3\x21\xa4\xae\xc6\x02\xb9\xc6\x56\xc3\xe2\x31\x0b\xff\x87\x56\xd1\x8b\x80\x21\x34\xb1\x56\x04\xf4\xed\xc1\x11\x14\x9a\x98\x79\xe3\x12\x41\xdd\x34\xf7\x02\xf4\xc3\x49\x61\x7b\x13\x52\x97\x69\xa7\x72\xf5\xe5\x2a\x89\xc0\x98\xe0\xdc\xa5\x92\x06\x67\x89\x3a\x25\x00\x61\xb1\x79\x91\x62\x6e\xb9\x31\x92\x98\x68\x5b\xe4\x6b\x6a\x8b\x68\x42\x24\x44\xfa\x5a\x36\xbc\xf3\xa6\x87\xe2\xec\xcb\x93\x22\xc8\x7d\xc8\x01\x65\xda\x89\x89\x30\x85\x0b\x98\xfc\x86\x3c\xad\xa1\xaa\x99\xc6\xd6\x1c\x45\x1b\x9c\xcf\x48\x74\xc7\xf0\xe7\x5b\x0a\x0c\x60\x2f\x04\x48\x12\xc7\x17\x65\xad\xaf\x02\x02\x53\x95\xb0"}, -{{0xbe,0xed,0xb8,0x07,0x3d,0xf5,0x8f,0x8c,0x1b,0xff,0xbd,0xbd,0x77,0xec,0x7d,0xec,0xb2,0xc8,0x2a,0x9b,0xab,0xec,0xef,0xc0,0x33,0x15,0x07,0xbd,0xc2,0xc2,0xa7,0xe7,},{0xb2,0x7e,0x90,0x8b,0x80,0x5e,0x29,0x6f,0xc3,0x0d,0x2e,0x47,0x4b,0x06,0x0c,0xd5,0x0c,0x0f,0x6f,0x52,0x0b,0x36,0x71,0x71,0x21,0x83,0xbd,0x89,0xd4,0xe7,0x33,0xe9,},{0x8c,0x89,0x0c,0xcc,0xad,0xc7,0x76,0x0e,0x1e,0x82,0xe4,0x3c,0x44,0xb3,0xdc,0x0b,0x68,0x5a,0x48,0xb4,0x79,0xae,0x13,0xcc,0x0a,0x6b,0x05,0x57,0xd0,0xfb,0x1c,0xba,0xbb,0xa6,0x3d,0x2a,0x96,0x84,0x34,0x12,0xea,0x8d,0x36,0xc5,0x0a,0xcb,0xf5,0x2b,0x92,0xcf,0xb2,0xdc,0xe4,0x9d,0xc4,0x8a,0xf6,0xdd,0xcf,0x8e,0xe4,0x7a,0x86,0x08,},"\x35\xca\x57\xf0\xf9\x15\xe5\x20\x9d\x54\xea\x4b\x87\x1f\xfb\x58\x53\x54\xdf\x1b\x4a\x4a\x17\x96\xfb\xe4\xd6\x22\x7d\x3e\x1a\xba\x51\x71\xed\x03\x91\xa7\x9e\x83\xe2\x4d\x82\xfd\xaf\xd1\x5c\x17\xb2\x8b\xf6\xc9\x4d\x61\x8c\x74\xd6\x52\x64\xe5\x8f\xaa\xac\xd2\x90\x28\x72\xfd\xd0\xef\xa2\x2e\x8d\x2d\x7c\xe8\xe3\xb8\x19\x7f\x0c\x36\x15\xb0\xa3\x85\x23\x5f\xa9\xfd\x8e\x45\x64\xee\x6e\x6b\x16\x50\xb4\xcf\xb9\x4d\x87\x2c\x80\x5c\x32\xd4\xf3\xa1\x8f\x96\x64\x61\xd3\xad\xbb\x60\x5f\xa5\x25\x88\x4f\x8e\xb1\x97\x62\x73\x96\xba\x4d\x99\x5d\x78\xac\x02\x94\x8a\x0e\xaa\xbb\x58\x51\x9b\x9a\x8e\x2e\x79\x85\xcd\x1d\xe2\xc7\x1d\x89\x18\xd9\x6a\x01\x68\x66\x0c\xe1\x7c\xdd\xf3\x64\xe3\xec\x0d\x4b\xd9\x0f\x21\x04\x75\x1a\x19\x27\xee\x1d\x23\xf3\xe7\xa6\x98\x40\xed\x04\x0b\x00\xe5\xf6\xe4\x86\x6e\xc5\x88\x13\x14\x9c\xc3\x82\xae\xbf\x61\x62\x60\x8c\x79\x57\x4d\x55\x3f\x47\x23\x0e\x92\x4a\x0e\xf1\xeb\xf5\x5d\x8e\x1a\x52\xab\xb6\x2a\x2d\x7a\xc8\x60\x27\xc7\xc0\x3c\xc8\x3f\xa1\x94\x9d\xa2\x9e\x2f\x30\x37\xab\x98\x6f\xd2\xff\xfe\x65\x0e\x31\x49\xba\xba\xe5\xa5\x0b\x1e\xe9\x69\x6f\x3b\xab\xec\x72\xe2\x96\x97\xc8\x24\x22\x81\x4d\x27\x20\x85\x50\x0f\xd8\x37\xfe\x3c\x7a\x97\x3e\xf4\xc1\x69\xaf\x12\xdd\x7f\x02\x70\x06\x20\xbb\x04\x5b\xdb\xf8\x46\x23\xf3\x26\x35\x05\x70\xb3\xca\xdb\xc9\xae\xa4\x20\x0b\x28\x28\x7e\x17\xab"}, -{{0x91,0x84,0xef,0x61,0x88,0x16,0x83,0x25,0x92,0xbc,0x8e,0xb3,0x5f,0x4f,0xfd,0x4f,0xf9,0x8d,0xfb,0xf7,0x77,0x6c,0x90,0xf2,0xaa,0xd2,0x12,0xce,0x7e,0x03,0x35,0x1e,},{0x68,0x7b,0x77,0x26,0x01,0x0d,0x9b,0xde,0x2c,0x90,0xe5,0x73,0xcd,0x2a,0x2a,0x70,0x2f,0xf2,0x8c,0x4a,0x2a,0xf7,0x0a,0xfc,0x73,0x15,0xc9,0x4d,0x57,0x56,0x01,0xe5,},{0xb3,0xc2,0x4e,0x75,0x13,0x2c,0x56,0x34,0x75,0x42,0x2d,0x5e,0xa4,0x12,0xb5,0xc1,0xe8,0xe6,0xe5,0xea,0x1c,0x08,0xea,0xd1,0x39,0x3c,0x41,0x2d,0xa1,0x34,0xc9,0xa1,0x63,0x82,0x84,0xea,0x7e,0x2c,0xa0,0x32,0xfe,0x3d,0x3e,0x32,0xa9,0x06,0x6a,0x8c,0x88,0x39,0x90,0x3f,0x6e,0xf4,0x6e,0x96,0x6b,0xb5,0xe4,0x92,0xd8,0xc2,0xaa,0x00,},"\x72\x9e\xb7\xe5\x4a\x9d\x00\xc5\x86\x17\xaf\x18\xc3\x45\xb8\xdc\x6e\x5b\x4e\x0f\x57\xde\x2f\x3c\x02\xe5\x4a\x2e\xc8\xf1\x42\x5e\xc2\xe2\x40\x77\x5b\x5a\xb0\xc1\x0f\x84\xac\x8b\xaf\xda\x45\x84\xf7\xe2\x1c\x65\x5f\xae\xcd\x80\x30\xa9\x89\x06\xbd\x68\x39\x8f\x26\xb5\xd5\x8d\x92\xb6\xcf\x04\x5e\x9b\xd9\x74\x3c\x74\xc9\xa3\x42\xec\x61\xce\x57\xf3\x7b\x98\x1e\xac\x4d\x8b\xf0\x34\x60\x88\x66\xe9\x85\xbb\x68\x68\x6a\x68\xb4\xa2\xaf\x88\xb9\x92\xa2\xa6\xd2\xdc\x8c\xe8\x8b\xfb\x0a\x36\xcf\x28\xbb\xab\x70\x24\xab\xfa\x2b\xea\x53\x31\x3b\x66\xc9\x06\xf4\xf7\xcf\x66\x97\x0f\x54\x00\x95\xbd\x01\x04\xaa\x49\x24\xdd\x82\xe1\x54\x13\xc2\x26\x79\xf8\x47\xe4\x8c\xd0\xc7\xec\x1f\x67\x7e\x00\x5f\xec\x01\x77\xfb\xd5\xc5\x59\xfc\x39\xad\xd6\x13\x99\x1f\xba\xea\xe4\xd2\x4d\x39\xd3\x09\xef\x74\x64\x7f\x81\x92\xcc\x4c\x62\xd0\x64\x20\x28\xc7\x6a\x1b\x95\x1f\x6b\xc9\x63\x9d\xeb\x91\xec\xc0\x8b\xe6\x04\x3f\x21\x09\x70\x5a\x42\xc7\xea\xe7\x12\x64\x9d\x91\xd9\x6c\xcb\xbf\xb6\x3d\x8d\x0d\xd6\xdd\x11\x21\x60\xf6\x13\x61\xec\xdc\x67\x93\x92\x9c\xa9\xae\xf9\xab\x56\x94\x4a\x6f\xa4\xa7\xdf\x1e\x27\x9e\xaf\x58\xce\x83\x23\xa9\xcf\x62\xc9\x42\x79\xff\xf7\x44\x0f\xbc\x93\x6b\xaa\x61\x48\x9c\x99\x93\x30\xba\xdc\xb9\xfc\x0e\x18\x4b\xc5\x09\x3f\x33\x0c\xbb\x24\x2f\x71\xfb\x37\x87\x38\xfe\xa1\x05\x11\xdd\x43\x83\x64\xd7\xf7\x6b\xcc"}, -{{0x35,0x4e,0x13,0x15,0x2e,0xe1,0xfe,0x74,0x8a,0x12,0x52,0x20,0x4c,0x65,0x27,0xbd,0xc1,0xb1,0xeb,0x2e,0xb5,0x36,0x78,0x15,0x0e,0x63,0x59,0x92,0x47,0x08,0xd8,0x12,},{0xd4,0x5f,0xf6,0xc5,0xfb,0x83,0xe7,0xbb,0x96,0x69,0xaa,0x89,0x60,0xde,0xb7,0xdb,0xc6,0x65,0xc9,0x88,0x43,0x9b,0x6c,0x9e,0xf6,0x72,0xc6,0x81,0x1d,0xc8,0xbc,0xf6,},{0xde,0x2b,0x46,0xe6,0x5f,0x3d,0xec,0xef,0x34,0x33,0x2e,0x50,0x0f,0x2e,0x11,0x30,0x6f,0xbd,0xcf,0x1b,0xe8,0x5a,0x1c,0x1e,0xe6,0x8b,0xa3,0x04,0x5d,0xce,0xc2,0xc7,0xbe,0x60,0x8d,0x22,0x92,0x7d,0xa1,0xf4,0x4c,0x0e,0x20,0x83,0xae,0x62,0x2c,0xf3,0xc2,0x9d,0x89,0x38,0x87,0x99,0x4e,0xfc,0xfa,0x2c,0xa5,0x94,0xf5,0x05,0x1f,0x03,},"\x8e\x5f\xcc\xf6\x6b\x1b\xa6\x16\x9c\xb6\x85\x73\x3d\x9d\x0e\x01\x90\x36\x1c\x90\xbc\xab\x95\xc1\x63\x28\x5a\x97\xfe\x35\x6d\x2b\xdc\xde\x3c\x93\x80\x26\x88\x05\xa3\x84\xd0\x63\xda\x09\xcc\xd9\x96\x9c\xc3\xff\x74\x31\xe6\x0a\x8e\x9f\x86\x9c\xd6\x2f\xaa\x0e\x35\x61\x51\xb2\x80\xbc\x52\x6e\x57\x7c\x2c\x53\x8c\x9a\x72\x4d\xc4\x8b\xf8\x8b\x70\x32\x1d\x7e\x1e\xee\xdb\x3c\x4a\xf7\x06\x74\x8c\x94\x2e\x67\xbd\xab\xdb\x41\xbe\xc2\x97\x7b\x15\x23\x06\x9e\x31\xe2\x9b\x76\x30\x02\x88\xf8\x8a\x51\xb3\x84\xb8\x0c\xc2\x52\x6f\x16\x79\x34\x0d\xde\xc3\x88\x1f\x5c\xd2\x8b\x03\x78\xd9\xcd\x0a\x81\x2b\x68\xdd\x3f\x68\xf7\xa2\x3e\x1b\x54\xbe\xe7\x46\x6a\xc7\x65\xcf\x38\xdf\x04\xd6\x74\x41\xdf\xa4\x98\xc4\xbf\xfc\x52\x04\x5f\xa6\xd2\xdb\xcd\xbf\xa3\x3d\xfa\xa7\x76\x44\xff\xcc\xef\x0d\xec\xdb\x67\x90\xc7\x0a\x0d\x73\x4e\xc2\x87\xcc\x33\x8c\xb5\xa9\x09\xc0\x05\x51\x89\x30\x11\x69\xc4\xf7\x70\x2c\x05\xc0\x91\x1a\x27\xb1\x6e\xf9\xed\x93\x4f\xa6\xa0\xca\x7b\x13\xe4\x13\x52\x34\x22\x53\x56\x47\x96\x80\x30\xed\xc4\x0c\xd7\x3e\x7d\x6b\x34\x5b\x75\x81\xf4\x38\x31\x6d\x68\xe3\xcd\x29\x2b\x84\x6d\x3f\x4f\x7c\x48\x62\xbc\x7e\x6b\x3f\xb8\x9a\x27\xf6\xf6\x0c\xd7\xdb\x2e\x34\xec\x9a\xae\x10\x13\xfe\x37\xac\xff\x8a\xd8\x88\xcb\x9a\x59\x3e\xf5\xe6\x21\xea\xe5\x18\x6c\x58\xb3\x1d\xcf\xde\x22\x87\x0e\x33\x6d\x33\xf4\x40\xf6\xb8\xd4\x9a"}, -{{0x7f,0xf6,0x2d,0x4b,0x3c,0x4d,0x99,0xd3,0x42,0xd4,0xbb,0x40,0x1d,0x72,0x6b,0x21,0xe9,0x9f,0x4e,0xf5,0x92,0x14,0x9f,0xc3,0x11,0xb6,0x87,0x61,0xf5,0x56,0x7f,0xf6,},{0x7f,0xdf,0xdb,0x9e,0xca,0x29,0xd3,0xf0,0x1d,0x94,0x86,0xd7,0xe1,0x12,0xce,0x03,0xaa,0x37,0xb9,0x13,0x26,0xa4,0x28,0x3b,0x9c,0x03,0x99,0x9c,0x5e,0xda,0x09,0x9a,},{0x05,0x8f,0x79,0x92,0x7f,0xbf,0x61,0x78,0x72,0x48,0x15,0xc7,0xb1,0x1c,0x63,0xba,0xaa,0x90,0xbc,0xc1,0x5d,0x72,0x72,0xbe,0x08,0x2f,0x8a,0x91,0x41,0x86,0x1c,0x81,0x64,0x33,0x05,0x5f,0x6c,0xf6,0x49,0x14,0x24,0x85,0x3f,0x9e,0xc7,0x8b,0xb9,0x1a,0xce,0x91,0x3a,0x93,0x41,0x1b,0x4e,0x5e,0xd5,0x8b,0xc4,0xba,0x57,0x15,0xc6,0x0a,},"\x99\xc4\x4c\x79\x65\x72\xa4\x82\x3f\xc6\xc3\x80\x77\x30\x83\x91\x73\x77\x4c\x05\xdb\xfc\x14\x92\xed\x0d\x00\x50\x9a\x95\xa1\xde\x37\x27\x4b\x31\x35\xed\x04\x56\xa1\x71\x8e\x57\x65\x97\xdc\x13\xf2\xa2\xab\x37\xa4\x5c\x06\xcb\xb4\xa2\xd2\x2a\xfa\xd4\xd5\xf3\xd9\x0a\xb3\xd8\xda\x4d\xcd\xaa\x06\xd4\x4f\x22\x19\x08\x84\x01\xc5\xdc\xee\xe2\x60\x55\xc4\x78\x2f\x78\xd7\xd6\x3a\x38\x06\x08\xe1\xbe\xf8\x9e\xee\xf3\x38\xc2\xf0\x89\x7d\xa1\x06\xfa\xfc\xe2\xfb\x2e\xbc\x5d\xb6\x69\xc7\xc1\x72\xc9\xcf\xe7\x7d\x31\x09\xd2\x39\xfe\x5d\x00\x5c\x8e\xe7\x51\x51\x1b\x5a\x88\x31\x7c\x72\x9b\x0d\x8b\x70\xb5\x2f\x6b\xd3\xcd\xa2\xfe\x86\x5c\x77\xf3\x6e\x4f\x1b\x63\x5f\x33\x6e\x03\x6b\xd7\x18\xbe\xc9\x0e\xe7\x8a\x80\x28\x11\x51\x0c\x40\x58\xc1\xba\x36\x40\x17\x25\x3a\xa8\x42\x92\x2e\x1d\xd7\xd7\xa0\xf0\xfc\x9c\x69\xe4\x3f\xc4\xea\xef\xfa\xaf\x1a\xe5\xfa\x5d\x2d\x73\xb4\x30\x79\x61\x7b\xab\xa0\x30\x92\x3f\xe5\xb1\x3d\x2c\x1c\x4f\xe6\xfa\xc3\xf2\xdb\x74\xe2\x02\x0a\x73\x4b\x61\x21\xa0\x30\x2f\xce\x82\x0b\xa0\x58\x0c\xe6\x13\x53\x48\xfd\xf0\x63\x2e\x00\x08\xdf\x03\xee\x11\x21\x68\xf5\xcf\xa0\x03\x7a\x26\xa1\xf6\x9b\x1f\x13\x17\xed\xf2\xa3\xab\x36\x74\x55\xa7\x7e\x00\x69\x12\x15\xd7\xaa\x31\x33\xc2\x15\x9d\x3d\xa2\xb1\x34\xcf\x04\xf0\xde\xfb\xf0\x7a\x60\x64\x01\x1e\x64\xdd\x14\xd4\xf8\xf0\x64\x35\x66\x55\x42\x88\x04\xc2\x77\x1a"}, -{{0x6c,0xab,0xad,0xd0,0x3f,0x8a,0x2e,0x6e,0xba,0xb9,0x6a,0x74,0xf8,0x0e,0x18,0x16,0x4e,0x4d,0x1b,0x6b,0xaa,0x67,0x8f,0x5a,0x82,0xe2,0x56,0x04,0xaf,0x98,0x9a,0xaf,},{0x2a,0x4a,0x31,0x79,0x56,0x41,0x94,0xe0,0x01,0x00,0xc1,0x8b,0xc3,0x53,0x51,0xd8,0xb1,0x35,0xbb,0xae,0x5b,0x32,0xb2,0x8f,0xce,0x1d,0x7b,0x67,0x66,0xca,0x4b,0x32,},{0x4e,0x65,0xc6,0xc1,0xd4,0x93,0x04,0x5e,0x8a,0x92,0x50,0xe3,0x97,0xc1,0xd1,0xd3,0x0f,0xfe,0xd2,0x4d,0xb6,0x6a,0x89,0x61,0xaa,0x45,0x8f,0x8f,0x0f,0xcb,0x76,0x0c,0x39,0xfe,0x86,0x57,0xd7,0xab,0x8f,0x84,0x00,0x0b,0x96,0xd5,0x19,0x71,0x7c,0xff,0x71,0xf9,0x26,0x52,0x2c,0x1e,0xfe,0xc7,0xf8,0xb2,0x62,0x4e,0xae,0x55,0xf6,0x0c,},"\x27\x9f\x78\xcf\x3b\x9c\xcf\xc6\xe1\xb0\x1e\x1a\x82\xf5\x0e\xd1\x72\xe9\xa8\xe1\xe7\x02\xbb\x15\x66\x1d\xd7\xdc\x3a\x45\x6f\xf7\xa7\xa7\xfd\xfb\x08\x1d\xb3\x86\x70\x79\x63\x0c\x7f\x70\xfd\x75\x32\x92\xec\x60\xec\xbf\x50\x63\x2e\x9a\xa4\x5b\x99\x65\x05\xc6\x6e\x6d\xc3\xc6\xae\x89\x2e\x21\xb6\xa8\x70\x5e\x4b\xba\xe8\xf1\x6a\x33\x78\x55\x4b\x31\xfd\xb0\x13\x9d\xcd\x15\xc9\x6a\x8a\x7e\x4b\x88\x75\x6a\x86\xd1\x8d\xb5\xdc\x74\xfd\x76\x91\x19\x7d\xd8\x8e\x2c\x7d\x5d\xf5\x2b\x04\x93\x44\xcd\xc4\x77\xc9\xcd\x7e\x89\xed\xa9\x9c\xcf\xb1\xd0\x08\x14\xd0\x15\x2b\x96\x54\xdf\x32\x79\x37\x2c\xa5\xf1\x8b\x1c\x94\x6f\x28\x94\xa7\x6b\x07\x9d\xdb\x1c\x3c\xd6\x1f\xbb\x96\x9a\xee\xc9\x19\x3a\x6b\x88\xfb\x7d\x13\x6c\x07\xf9\x82\x1e\x5c\x10\x74\xb4\xe9\x3b\xca\xf6\xfa\x14\xd0\xd1\xd7\xe1\x70\x75\x89\xd7\x7e\xc1\x33\x72\x06\xe5\x3a\x1f\x06\xcc\x26\x67\x2f\xf9\x5c\x13\xd5\xff\x44\x47\x66\x93\x1b\xa3\x0a\x0a\xfd\xcd\xad\xd2\x09\x8e\x9c\x41\xfd\x87\xa3\xf2\x3c\xd1\x6d\xbb\x0e\xfb\xf8\x09\x2c\xe3\x3e\x32\x7f\x42\x61\x09\x90\xe1\xce\xe6\xcb\x8e\x54\x95\x1a\xa0\x81\xe6\x97\x65\xae\x40\x09\xae\xed\x75\x8e\x76\x8d\xe5\x0c\x23\xd9\xa2\x2b\x4a\x06\xdc\x4d\x19\xfc\x8c\xbd\x0c\xde\xf4\xc9\x83\x46\x17\x55\xd0\xa3\xb5\xd6\xa9\xc1\x22\x53\xe0\x95\x68\x33\x9f\xf7\xe5\xf7\x8c\x5f\xdf\x7e\xc8\x9f\x91\x86\xa6\x21\xa8\xc0\xee\xd1\x1b\x67\x02\x2e"}, -{{0x0f,0xa0,0xc3,0x2c,0x3a,0xe3,0x4b,0xe5,0x1b,0x92,0xf9,0x19,0x45,0x40,0x59,0x81,0xa8,0xe2,0x02,0x48,0x85,0x58,0xa8,0xe2,0x20,0xc2,0x88,0xc7,0xd6,0xa5,0x53,0x2d,},{0xd6,0xae,0xe6,0x2b,0xd9,0x1f,0xc9,0x45,0x36,0x35,0xff,0xcc,0x02,0xb2,0xf3,0x8d,0xca,0xb1,0x32,0x85,0x14,0x03,0x80,0x58,0x0c,0xcd,0xff,0x08,0x65,0xdf,0x04,0x92,},{0x7e,0x9a,0xb8,0x5e,0xe9,0x4f,0xe4,0xb3,0x5d,0xcb,0x54,0x53,0x29,0xa0,0xef,0x25,0x92,0x3d,0xe5,0xc9,0xdc,0x23,0xe7,0xdf,0x1a,0x7e,0x77,0xab,0x0d,0xcf,0xb8,0x9e,0x03,0xf4,0xe7,0x85,0xca,0x64,0x29,0xcb,0x2b,0x0d,0xf5,0x0d,0xa6,0x23,0x0f,0x73,0x3f,0x00,0xf3,0x3a,0x45,0xc4,0xe5,0x76,0xcd,0x40,0xbd,0xb8,0x4f,0x1a,0xe0,0x01,},"\x53\xf4\x4b\xe0\xe5\x99\x7f\xf0\x72\x64\xcb\x64\xba\x13\x59\xe2\x80\x1d\xef\x87\x55\xe6\x4a\x23\x62\xbd\xda\xf5\x97\xe6\x72\xd0\x21\xd3\x4f\xfa\xce\x6d\x97\xe0\xf2\xb1\xf6\xae\x62\x5f\xd3\x3d\x3c\x4f\x6e\x9f\xf7\xd0\xc7\x3f\x1d\xa8\xde\xfb\x23\xf3\x24\x97\x5e\x92\x1b\xb2\x47\x32\x58\x17\x7a\x16\x61\x25\x67\xed\xf7\xd5\x76\x0f\x3f\x3e\x3a\x6d\x26\xaa\xab\xc5\xfd\xe4\xe2\x04\x3f\x73\xfa\x70\xf1\x28\x02\x09\x33\xb1\xba\x3b\x6b\xd6\x94\x98\xe9\x50\x3e\xa6\x70\xf1\xed\x88\x0d\x36\x51\xf2\xe4\xc5\x9e\x79\xca\xbc\x86\xe9\xb7\x03\x39\x42\x94\x11\x2d\x5d\x8e\x21\x3c\x31\x74\x23\xb5\x25\xa6\xdf\x70\x10\x6a\x9d\x65\x8a\x26\x20\x28\xb5\xf4\x51\x00\xcb\x77\xd1\x15\x0d\x8f\xe4\x61\xee\xd4\x34\xf2\x41\x01\x5f\x32\x76\xad\x7b\x09\xa2\x91\xb4\xa7\xf3\x5e\x3c\x30\x05\x1c\xbf\x13\xb1\xd4\xa7\xfa\x0c\x81\xa5\x0f\x93\x9e\x7c\x49\x67\x3a\xfd\xc8\x78\x83\xc9\xe3\xe6\x1f\x5a\x1d\xf0\x37\x55\x47\x0f\xda\x74\xbf\x23\xea\x88\x67\x6b\x25\x8a\x97\xa2\x80\xd5\xf9\x0b\x52\xb7\x14\xb5\x96\x03\x5b\xae\x08\xc8\xd0\xfe\x6d\x94\xf8\x94\x95\x59\xb1\xf2\x7d\x71\x16\xcf\x59\xdd\x3c\xfb\xf1\x82\x02\xa0\x9c\x13\xf5\xc4\xfb\xc8\xd9\x72\x25\x49\x28\x87\xd3\x28\x70\xc2\x29\x7e\x34\xde\xbd\x98\x76\xd6\xd0\x1a\xc2\x7a\x16\xb0\x88\xb0\x79\x07\x9f\x2b\x20\xfe\xb0\x25\x37\xcd\xa3\x14\xc4\x3c\xb2\xdc\xa3\x71\xb9\xdf\x37\xed\x11\xec\x97\xe1\xa7\xa6\x99\x3a"}, -{{0x7b,0x06,0xf8,0x80,0x26,0xfa,0x86,0xf3,0x9f,0xce,0x24,0x26,0xf6,0x7c,0xc5,0x99,0x6b,0xed,0xd0,0xcf,0xc4,0xb5,0xeb,0xb1,0xb5,0xe3,0xed,0xbb,0x47,0xe0,0x80,0xaa,},{0x3f,0x14,0x69,0xee,0x6a,0x2e,0x78,0x67,0xe2,0xe9,0x01,0x2d,0x40,0x2c,0xf5,0xa4,0x86,0x14,0x97,0xc0,0x1d,0xf8,0x79,0xa1,0xde,0xb1,0xc5,0x39,0x83,0x0b,0x58,0xde,},{0x42,0xf1,0x33,0xe3,0x4e,0x3e,0xb7,0x03,0x2a,0x13,0x3e,0xd7,0x81,0x53,0x7e,0xc6,0x2e,0x44,0xa5,0xce,0x83,0x81,0xe5,0xe0,0xbf,0x9e,0x13,0xa9,0x14,0xa4,0xb2,0xc7,0x57,0x81,0x1d,0x6d,0x3b,0x1e,0x86,0x67,0x24,0x24,0xea,0x42,0x30,0xd1,0x0f,0x7c,0x61,0x0a,0xbb,0x70,0x69,0xe6,0x1e,0x31,0x9b,0x40,0x66,0xa2,0xbd,0x7b,0xc9,0x00,},"\x71\x17\x5d\x4e\x21\x72\x12\x97\xd9\x17\x6d\x81\x7f\x4e\x78\x5d\x96\x00\xd9\x23\xf9\x87\xfe\x0b\x26\xfd\x79\xd3\x3a\x5e\xa5\xd1\xe8\x18\xb7\x1f\x0f\x92\xb8\xc7\x3a\xfd\xda\xbd\xcc\x27\xf6\xd1\x6e\x26\xaa\xfa\x87\x4c\xfd\x77\xa0\x0e\x06\xc3\x6b\x04\x14\x87\x58\x2b\xb9\x33\x76\x0f\x88\xb4\x19\x12\x73\x45\x77\x6e\xa4\x18\xf8\x35\x22\x25\x4f\xed\x33\x81\x9b\xc5\xc9\x5f\x8f\x84\x04\xcc\x14\x4e\xbf\x14\x86\xc8\x85\x15\x40\x9d\x34\x33\xaa\xf5\x19\xd9\x92\x0f\x52\x56\xe6\x29\x41\x9e\x9a\x95\x58\x0a\x35\xb0\x69\xb8\xd2\x55\x33\xdf\xcb\xc9\x8a\xd3\x64\x04\xa9\x51\x80\x8e\x01\x37\x8c\x03\x26\x63\x26\xd1\x20\x04\x69\x75\xfd\xe0\x7d\xae\xf3\x26\x6c\xaa\xcd\x82\x1c\x14\x03\x49\x9d\x7f\xdf\x17\xc0\x33\xc8\xd8\xc3\xf2\x8f\x16\x2b\x5f\x09\xdf\xda\xca\x06\x28\x5f\x00\xc6\xcb\x98\x6d\xfd\xf5\x15\x1a\xa6\x63\x96\x08\xb5\xb1\x3e\x78\xd6\x5a\x43\x68\x58\x5b\x16\x13\x87\x54\xfb\xd1\x13\x83\x5a\x68\x6c\xd0\x66\xc2\xb8\x9b\xb0\x95\x3c\x24\xd5\x0e\x77\xbf\x0f\xc4\x57\xc1\xe0\xfc\xf5\xd4\x4d\xa8\xdb\x9a\x88\xf0\x62\xbe\x3b\x68\x8d\x5c\xdc\xff\x1d\x1c\x00\xe8\x1e\xc9\xd4\x13\x88\x22\x95\xb3\x41\xfe\xe8\xfa\x42\x7d\xc1\x09\xad\xeb\x5f\x28\x4e\xec\x20\x2f\x1b\xef\x11\x5b\xf9\x6b\x17\x82\xd3\xcc\xde\xb6\x82\xb6\x9b\xf9\x2d\x17\x0c\x00\x7d\x5d\xf8\x0e\x1e\xd9\x62\xf6\x77\xdc\x24\xa1\x45\xa1\xe4\xe8\x29\xe8\xde\xc0\x10\x4e\x5f\x78\x36\x59\x44"}, -{{0xc3,0xf5,0xe1,0x49,0x96,0x8a,0x24,0xf4,0xde,0x91,0x19,0x53,0x19,0x75,0xf4,0x43,0x01,0x5c,0xcc,0xa3,0x05,0xd7,0x11,0x9e,0xd4,0x74,0x9e,0x8b,0xf6,0xd9,0x4f,0xc7,},{0x39,0xaa,0xcc,0xdb,0x94,0x8a,0x40,0x38,0x53,0x8a,0x45,0x88,0x32,0x2f,0x80,0x6b,0xb1,0x29,0xb5,0x87,0x6c,0x4b,0xec,0x51,0x27,0x1a,0xfe,0x4f,0x49,0x69,0x00,0x45,},{0x5f,0xa2,0xb5,0x31,0x67,0x7b,0x00,0xb8,0x5b,0x0a,0x31,0x3c,0xbd,0x47,0x9f,0x55,0xf4,0xab,0x3e,0xc5,0xcf,0xce,0x5e,0x45,0x4d,0x2b,0x74,0x17,0x6c,0xcc,0x33,0x99,0xc8,0x99,0xf9,0xd6,0xb5,0x1e,0xd4,0xc1,0xe7,0x61,0x85,0xac,0x9f,0xe7,0x30,0xc4,0xb4,0x01,0x40,0x44,0xf7,0x04,0x11,0x85,0xbc,0x3c,0x85,0x72,0x2e,0xb2,0xea,0x02,},"\xc4\x63\x70\xe3\x7f\x2e\x0c\xad\xcf\x93\x40\x2f\x1f\x0c\xb0\x48\xf5\x28\x81\xba\x75\x0b\x7a\x43\xf5\x6a\xb1\x1c\xe3\x48\x73\x2f\xb5\x7e\x7f\x9a\xaf\x8d\xfc\xbe\x45\x5e\x14\xe9\x83\xc2\x48\xd0\x26\xa2\x7e\x7f\x14\x8d\x5d\xb5\xa5\x3f\x94\x63\x57\x02\xb8\x95\x12\x77\x71\x04\x7a\x87\x6d\x14\x10\x73\x86\xc5\xe0\xff\x89\x33\x34\x5b\xbd\x7a\x93\x6d\x99\x0d\x33\xef\xa2\x8c\x2e\xc4\xe4\x86\x4f\xfd\x2f\xf5\x76\xf7\xc8\x8f\x95\x4c\xfc\x1c\x45\x9e\x88\x3b\xb7\x12\xda\xe3\xcd\xf6\x63\x20\x66\xf1\xf4\xd1\x3a\x50\x96\x15\xb3\x36\x0c\xad\xc5\xa3\x07\xf2\x3e\x52\xa5\x1b\x40\xa6\xfe\xeb\xe0\xb1\x8d\x0e\x9e\xe4\xe3\x48\xf3\x3c\xd8\x1a\x8d\xef\x22\x2f\x6a\x59\xb1\x28\x61\xd3\x35\xbd\x9a\xf8\x5c\xc0\x04\xbe\x46\xf1\xd3\xa4\x24\xf4\x87\x0a\xe9\xdc\x58\x7e\x5a\x4a\xde\x13\x6b\x93\x70\x64\x93\x48\xc3\x3a\xc3\xbf\x1f\xeb\xee\xbf\xfe\xa3\x70\x85\xed\x59\xca\xc9\xd9\xe6\x96\x47\x0b\x23\x46\x09\xe9\xa1\x0a\x9d\x43\x1f\xf9\x1e\x69\xcb\x51\x35\xfd\x11\x7f\xf5\x8a\x36\x53\x97\x44\xeb\xe7\x0c\xea\x69\x73\xc0\x0c\x7a\x4d\x57\xb6\x2f\x4a\x71\x36\xd7\x31\xb8\xe4\x6f\xf1\x8e\xc0\xed\x69\x07\x00\x31\x90\x50\x75\xd8\x54\x1d\x56\x8c\xfc\xe6\xee\xb7\x62\x42\xb7\x81\x9a\x7b\x6a\x93\x55\x21\x11\xbb\x88\xf1\x65\x52\x7c\xfa\x69\x66\xd3\x9f\xcb\xe0\xa7\xde\xa0\x08\xe3\x9c\x7a\x3e\x57\x7a\xb3\x07\xcd\x1d\x0e\xa3\x26\x83\x3d\x52\x65\x4e\x17\x29\x55\xf3\xfc\xd4"}, -{{0x42,0x30,0x5c,0x93,0x02,0xf4,0x5e,0xa6,0xf8,0x7e,0x26,0xe2,0x20,0x8f,0xd9,0x4b,0x3c,0x4a,0xd0,0x37,0xb1,0xb6,0xc8,0x3c,0xf6,0x67,0x7a,0xa1,0x09,0x6a,0x01,0x3c,},{0x3b,0x97,0xb1,0xf1,0x1c,0xe4,0x5b,0xa4,0x6f,0xfb,0xb2,0x5b,0x76,0xbf,0xc5,0xad,0x7b,0x77,0xf9,0x0c,0xc6,0x9e,0xd7,0x61,0x15,0xde,0xa4,0x02,0x94,0x69,0xd5,0x87,},{0x18,0xd0,0x5e,0x5d,0x01,0x66,0x8e,0x83,0xf4,0x0f,0xa3,0xbb,0xee,0x28,0xb3,0x88,0xac,0xf3,0x18,0xd1,0xb0,0xb5,0xad,0x66,0x8c,0x67,0x2f,0x34,0x5c,0x8e,0xda,0x14,0xc2,0xf8,0x84,0xcd,0x2a,0x90,0x39,0x45,0x9c,0xe0,0x81,0x0b,0xc5,0xb5,0x80,0xfe,0x70,0xd3,0x96,0x4a,0x43,0xed,0xb4,0x9e,0x73,0xa6,0xff,0x91,0x4b,0xbf,0x04,0x0c,},"\xd1\x10\x82\x8d\x44\x91\x98\xd6\x75\xe7\x4e\x8e\x39\x43\x9f\xd1\x5e\x75\xbf\x2c\xc1\xf4\x30\xab\xfb\x24\x58\x36\x88\x5b\xaf\xc4\x20\xf7\x54\xb8\x9d\x2f\xbb\xf6\xdd\x34\x90\x79\x2e\x7a\x4f\x76\x60\x73\xcf\xe3\xb3\x02\xd0\x89\x83\x1a\xce\x86\x9e\x27\x30\xfd\xe4\x5c\x21\x21\xec\x3e\xf2\x17\xaa\x9c\x43\xfa\x7c\xc7\xe9\xed\x0a\x01\xad\x9f\x1d\x2f\xc3\x61\x36\x38\xca\x9f\xc1\x93\xc9\x8b\x37\x45\x5b\xf5\xdb\xf8\xf3\x8b\x64\x70\x8d\xfd\xca\x6c\x21\xf0\x97\x5f\x10\x17\xc5\xda\x5f\x64\x34\xbd\xa9\xf0\x33\xce\xc2\xa6\x31\xab\x50\x31\x8e\x01\x7b\x17\x0b\x24\x0b\xf0\x1e\xb8\xb3\x6c\x7e\x1c\xb5\x9e\x77\x36\xac\x34\x44\x42\x08\x13\x2a\x8f\x59\xe4\xf3\x13\xd6\x5d\x84\x9c\x6a\x4f\xdf\x13\xe2\x0e\xca\xee\x38\x23\xe5\x89\xa1\x71\xb3\x9b\x24\x89\x49\x7b\x06\xe6\xff\x58\xc2\xc9\xf1\xdc\x5d\x3a\xa3\xbd\x10\xe6\x44\x3e\x22\xd4\x2d\x07\xb7\x83\xf7\x9f\xd4\x3a\x46\xe1\xcd\xe3\x14\xb6\x63\xa9\x5f\x72\x46\xde\xa1\x31\xfc\xd4\x6d\x1d\xc3\x33\xc5\x45\x4f\x86\xb2\xc4\xe2\xe4\x24\xde\xa4\x05\xcc\x22\x30\xd4\xdc\xd3\x9a\x2e\xab\x2f\x92\x84\x5c\xf6\xa7\x99\x41\x92\x06\x3f\x12\x02\x74\x9e\xf5\x2d\xcb\x96\xf2\xb7\x9e\xd6\xa9\x81\x18\xca\x0b\x99\xba\x22\x85\x49\x08\x60\xeb\x4c\x61\xab\x78\xb9\xdd\xc6\xac\xc7\xad\x88\x3f\xa5\xe9\x6f\x9d\x02\x91\x71\x22\x3a\xbf\x75\x73\xe3\x62\x30\xe0\xa8\x1f\x6c\x13\x11\x15\x14\x73\xee\x26\x4f\x4b\x84\x2e\x92\x3d\xcb\x3b"}, -{{0xc5,0x7a,0x43,0xdc,0xd7,0xba,0xb8,0x51,0x60,0x09,0x54,0x69,0x18,0xd7,0x1a,0xd4,0x59,0xb7,0x34,0x5e,0xfd,0xca,0x8d,0x4f,0x19,0x92,0x98,0x75,0xc8,0x39,0xd7,0x22,},{0x20,0x83,0xb4,0x44,0x23,0x6b,0x9a,0xb3,0x1d,0x4e,0x00,0xc8,0x9d,0x55,0xc6,0x26,0x0f,0xee,0x71,0xac,0x1a,0x47,0xc4,0xb5,0xba,0x22,0x74,0x04,0xd3,0x82,0xb8,0x2d,},{0x1e,0xde,0xf9,0xbc,0x03,0x69,0x71,0xf1,0xfa,0x88,0xed,0xf4,0x53,0x93,0xc8,0x02,0xe6,0xc1,0xa1,0x63,0x1c,0x8a,0x06,0x87,0x1a,0x09,0xa3,0x20,0x82,0x1d,0xce,0x40,0xbe,0xca,0x97,0xe5,0x3a,0x03,0x61,0xa9,0x55,0xa4,0xc6,0xd6,0x0b,0x8c,0xa8,0xe4,0x00,0xc8,0x13,0x40,0x91,0x1c,0xcb,0x4f,0x56,0x28,0x40,0x41,0xcd,0xbb,0x18,0x04,},"\xa4\xf6\xd9\xc2\x81\xcf\x81\xa2\x8a\x0b\x9e\x77\x49\x9a\xa2\x4b\xde\x96\xcc\x12\x64\x37\x44\x91\xc0\x08\x29\x4e\xe0\xaf\x6f\x6e\x4b\xbb\x68\x63\x96\xf5\x90\x68\xd3\x58\xe3\x0f\xe9\x99\x2d\xb0\xc6\xf1\x66\x80\xa1\xc7\x1e\x27\xa4\xa9\x07\xac\x60\x7d\x39\xbd\xc3\x25\x8c\x79\x56\x48\x2f\xb3\x79\x96\xf4\xbe\xb3\xe5\x05\x1b\x81\x48\x01\x9a\x1c\x25\x6e\x2e\xe9\x99\xeb\xc8\xce\x64\xc5\x4e\x07\xfe\xdb\x4f\xbd\x89\x53\xeb\xd9\x3b\x7d\x69\xce\x5a\x00\x82\xed\xd6\x20\x9d\x12\xd3\x61\x9b\x4f\xd2\xea\xe9\x16\x46\x1f\x72\xa4\xce\x72\x71\x57\x25\x1a\x19\x20\x9b\xbf\xf9\xfb\xdb\xd2\x89\x43\x6f\x3f\xca\xcc\x6b\x4e\x13\x18\x52\x1a\x47\x83\x9c\xba\x4b\x14\xf7\xd7\xa2\x1e\x7b\x5d\x6b\x6a\x75\x3d\x58\x04\xaf\xcd\x2b\x1e\xb7\x77\x9b\x92\xab\xab\x8a\xfa\x8a\xa4\xfa\x51\xca\xec\x0b\x85\xdc\xd0\xfc\x2a\x06\x76\x03\x6d\x3f\x56\x63\x0a\x83\x1f\xfe\xb5\x02\x86\x1d\xd8\x91\x61\xc7\x08\xa9\xc0\x06\xc7\x3c\x93\x0c\xe5\xb9\x47\x56\x42\x6f\xf1\x8a\xa1\x12\xfb\x4e\xb9\xa6\x85\x00\xb4\x8d\x4e\xed\xbd\x41\x67\xb6\xff\xd0\xa1\x1d\x49\x44\x3a\x17\x3c\xe9\xd9\x49\x43\x67\x48\xfc\x06\x34\xf0\x6b\xb0\x8b\x8f\x34\x23\xf4\x46\x3d\xba\x7b\x4d\x19\x9b\x64\xdf\x57\x81\x17\xf0\xa2\x64\x5f\x0b\x2a\x1e\x2a\xda\x27\xd2\x86\xf7\x67\x33\xf2\x5b\x82\xed\x1d\x48\xa5\xc3\x89\x8d\x4a\xd6\x21\xe5\x0e\xd9\x06\x0d\xaa\xd4\x0a\x39\x53\x2e\x4d\x1b\xf1\x62\xce\x36\x80\x4d\x5d\x4e\x2d"}, -{{0x2d,0xdd,0xb6,0xb8,0xfd,0x04,0xfa,0x90,0xec,0xe1,0xa7,0x09,0xf8,0x41,0x8f,0x2e,0x5d,0x0c,0x9c,0x43,0xaf,0xe7,0xcf,0xce,0x19,0xe6,0xad,0x15,0xa7,0x34,0x76,0xf7,},{0x80,0x59,0xde,0x6a,0x7c,0x47,0x76,0x48,0x9e,0xcc,0x2e,0x7d,0x70,0x7f,0xfc,0xe3,0x02,0x85,0xbf,0x30,0xa2,0x3f,0x78,0xd7,0x2d,0xb4,0x9c,0xfd,0x6e,0xd0,0xd4,0x92,},{0xc6,0x34,0xea,0x7b,0xf7,0x2e,0x89,0x5a,0x2e,0x79,0x6e,0x28,0x34,0x20,0x14,0x15,0xb8,0xb4,0x5e,0x05,0xe0,0x45,0x55,0x92,0x84,0xeb,0x90,0x52,0xc0,0xe8,0x4f,0x62,0xa5,0xa9,0xf0,0xc9,0x76,0x4f,0x75,0x76,0x78,0x8c,0x72,0x28,0xb1,0x9e,0xf5,0x17,0xc1,0x95,0x49,0x73,0x25,0xa4,0x8a,0x93,0x44,0xb1,0x47,0xc1,0x2f,0xd7,0x55,0x09,},"\x47\x4b\xaa\x59\x0a\x4c\xd7\x2d\x54\x24\xe5\x1d\x82\x57\xb3\xd4\x43\x25\xbc\x4c\x50\x63\xa0\x03\x3c\x86\xeb\xbe\x99\xed\x72\x12\x18\x4c\x19\x94\x4d\x08\x2a\x11\x53\x79\xdd\x4c\xec\xe9\x73\xfa\xa0\xbc\xa6\x48\x5b\xd2\x5f\x37\x44\xa7\x19\xe7\x0a\xa0\x29\x1e\x1b\x5a\x96\xe6\x37\xc1\x40\x61\x6a\x98\x26\x33\x57\xc7\x6b\x6e\xb0\x08\x3f\xe5\x14\x14\xe3\x86\x87\x0d\x0f\xdc\x7d\xd9\xab\xe4\xff\x6f\xb5\xbb\xf1\xe7\xb1\x5d\xac\x3e\x08\xe2\x61\x5f\x65\x5c\x31\x04\xce\xb3\x2a\x4c\xc2\xc9\xe9\xc4\x3c\xf2\x82\xd3\x46\xac\x25\x3c\xcc\x46\xb6\x35\xae\x04\x09\x73\xb4\x97\x35\x72\x0f\xfb\x89\x04\x69\xa5\x67\xc5\x82\x4e\x0c\x00\xd7\xcc\xd5\x50\x9a\x71\x80\x92\xa9\x06\x46\x1c\x4d\x61\x63\xea\xf4\x22\x41\x8f\x5f\xc6\xe0\x09\xfc\x3f\x52\x9a\xc6\x1a\x2f\x89\xbb\x8e\x0e\xd4\x5d\x94\x0c\x4c\x23\x31\xff\x8d\x8e\x1d\x6d\x58\xd4\x17\xd8\xfc\x26\x56\xa0\x2e\x87\x01\xae\xe7\x5a\xed\x91\x87\x24\xee\xbe\x4a\x2c\xf4\x74\x4c\x5c\x40\x1e\x21\x70\x23\xdf\x68\xa6\xf6\xa0\x22\x8b\xd0\x5a\x67\x9a\x69\x7d\x8d\xe7\x03\x6b\x9e\xd2\x69\x09\x0d\x3c\x65\x48\x6a\xfb\x91\xe2\x79\x54\xeb\x15\xb9\x64\x66\x5e\xde\x7a\xd0\x08\xf1\x2f\xb3\xa9\xd0\xe6\x9c\x13\xb4\x25\x4f\x43\x81\x9e\x08\x18\xa4\x19\x5f\x68\xb8\xa3\x8a\xe8\x1f\x3f\xcb\x18\x79\xc9\x5a\xb4\xcd\x0f\xfc\x38\xe3\x81\x08\x92\x60\xcc\xa9\x67\xac\xe5\xa0\x85\xb4\x57\xab\x5e\xb3\x63\x85\x21\x01\x37\x75\x70\xf9\xac\x9e\x38"}, -{{0x55,0x47,0xf1,0x00,0x4b,0xae,0xdf,0xce,0x5c,0xfc,0x08,0x50,0xb0,0x53,0x02,0x37,0x4a,0xad,0x24,0xf6,0x16,0x39,0x94,0xec,0xd7,0x51,0xdf,0x3a,0xf3,0xc1,0x06,0x20,},{0x7c,0xe6,0x20,0x78,0x73,0x85,0xee,0x19,0x51,0xac,0x49,0xa7,0x73,0x52,0xee,0x0d,0x6f,0x8c,0x5c,0xd4,0x7d,0xf7,0x4e,0x9e,0x32,0x16,0xa6,0x32,0x4f,0xc7,0xcf,0x7f,},{0x29,0xdf,0x3a,0xd5,0x89,0x00,0x9c,0x66,0x7b,0xaa,0x5e,0x72,0xda,0xbb,0x4e,0x53,0xcb,0x78,0x76,0xde,0x4e,0x7e,0xfe,0x5c,0xc2,0x1e,0xad,0x7f,0xa8,0x78,0xdb,0x57,0xf9,0x7c,0x11,0x03,0xdd,0xb3,0x9a,0x86,0x1e,0xb8,0x86,0x53,0xc1,0xd4,0xec,0x3b,0x43,0x06,0xe4,0x58,0x4b,0x47,0xb8,0xbc,0x90,0x42,0x31,0x19,0xe7,0xe4,0xaf,0x00,},"\xa6\xc1\x7e\xeb\x5b\x80\x66\xc2\xcd\x9a\x89\x66\x73\x17\xa9\x45\xa0\xc7\xc9\x69\x96\xe7\x7a\xe8\x54\xc5\x09\xc6\xcd\x06\x31\xe9\x22\xad\x04\x50\x3a\xf8\x7a\x3c\x46\x28\xad\xaf\xed\x76\x00\xd0\x71\xc0\x78\xa2\x2e\x7f\x64\xbd\xa0\x8a\x36\x2b\x38\xb2\x6c\xa1\x50\x06\xd3\x8a\xcf\x53\x2d\x0d\xed\xea\x41\x77\xa2\xd3\x3f\x06\x95\x6d\x80\xe9\x63\x84\x8e\xc7\x91\xb2\x76\x2f\xa9\x94\x49\xb4\xf1\xa1\xed\x9b\x3f\x25\x80\xbe\x3a\xc7\xd7\xf5\x2f\xb1\x44\x21\xd6\x22\x2b\xa7\x6f\x80\x77\x50\xc6\xcb\xb0\xb1\x6f\x08\x95\xfc\x73\xd9\xdf\xc5\x87\xe1\xa9\xe5\xd1\xe5\x83\x75\xfb\xab\x70\x5b\x8f\x0c\x1f\xd7\xdf\x8b\x3a\xd4\x46\xf2\xf0\x84\x59\xe7\xed\x1a\xf5\x95\x56\xfb\xc9\x66\xdc\x24\x9c\x1c\xf6\x04\xf3\xe6\x77\xc8\xa0\x9d\x43\x63\x60\x87\x74\xbf\x38\x11\xbe\xf0\x64\x27\x48\xc5\x5c\x51\x6c\x7a\x58\x0f\xa3\x49\x90\x50\xac\xb3\x0e\xed\x87\x0d\x0d\x91\x17\x4c\xb6\x23\xe9\x8c\x3a\xd1\x21\xcf\x81\xf0\x4e\x57\xd4\x9b\x00\x84\x24\xa9\x8a\x31\xee\xaa\xf5\xf3\x8e\x00\x0f\x90\x3d\x48\xd2\x15\xed\x52\xf8\x62\xd6\x36\xa5\xa7\x36\x07\xde\x85\x76\x01\x67\x26\x7e\xfe\x30\xf8\xa2\x6e\xbc\x5a\xa0\xc0\x9f\x5b\x25\x8d\x33\x61\xca\x69\xd1\xd7\xee\x07\xb5\x96\x48\x17\x9a\xb2\x17\x0e\xc5\x0c\x07\xf6\x61\x6f\x21\x68\x72\x52\x94\x21\xa6\x33\x4a\x4a\x1e\xd3\xd2\x67\x1e\xf4\x7b\xc9\xa9\x2a\xfb\x58\x31\x4e\x83\x2d\xb8\xa9\x00\x34\x08\xa0\x48\x75\x03\xfe\x4f\x67\x77\x0d\xd4\xb6"}, -{{0x3d,0xd7,0x20,0x3c,0x23,0x7a,0xef,0xe9,0xe3,0x8a,0x20,0x1f,0xf3,0x41,0x49,0x01,0x79,0x90,0x5f,0x9f,0x10,0x08,0x28,0xda,0x18,0xfc,0xbe,0x58,0x76,0x8b,0x57,0x60,},{0xf0,0x67,0xd7,0xb2,0xff,0x3a,0x95,0x7e,0x83,0x73,0xa7,0xd4,0x2e,0xf0,0x83,0x2b,0xcd,0xa8,0x4e,0xbf,0x28,0x72,0x49,0xa1,0x84,0xa2,0x12,0xa9,0x4c,0x99,0xea,0x5b,},{0x4c,0x03,0x69,0x35,0xa9,0x6a,0xbc,0x0d,0x05,0x0d,0x90,0x7b,0xed,0xbe,0x99,0x46,0xfb,0x97,0x43,0x9f,0x03,0x9c,0x74,0x2e,0x05,0x1c,0xcf,0x09,0xad,0xd7,0xdf,0x44,0xd1,0x7d,0xa9,0x8c,0x2c,0xa0,0x1b,0xdc,0x24,0x24,0xda,0x1e,0x4d,0xeb,0xf3,0x47,0xf8,0xff,0xf4,0x8a,0xc8,0x03,0x0d,0x2c,0xc0,0x7f,0x95,0x75,0xc0,0x44,0xbe,0x04,},"\xdb\x28\xed\x31\xac\x04\xb0\xc2\xde\xce\xe7\xa6\xb2\x4f\xc9\xa0\x82\xcc\x26\x2c\xa7\xcc\xf2\xa2\x47\xd6\x37\x2e\xc3\xe9\x12\x0e\xce\xdb\x45\x42\xea\x59\x3f\xea\x30\x33\x5c\x5a\xb9\xdd\x31\x8a\x3b\x4f\xd5\x83\x42\x99\xcf\x3f\x53\xd9\xef\x46\x13\x7b\x27\x3c\x39\x0e\xc3\xc2\x6a\x0b\x44\x70\xd0\xd9\x4b\x77\xd8\x2c\xae\x4b\x24\x58\x78\x37\xb1\x67\xbb\x7f\x81\x66\x71\x0b\xae\xb3\xee\x70\xaf\x79\x73\x16\xcb\x7d\x05\xfa\x57\xe4\x68\xae\x3f\x0b\xd4\x49\x40\x4d\x85\x28\x80\x8b\x41\xfc\xca\x62\xf5\xe0\xa2\xaa\x5d\x8f\x3a\xca\xb0\x08\xcc\x5f\x6e\x5a\xb0\x27\x77\xbd\xcd\xe8\x7f\x0a\x10\xef\x06\xa4\xbb\x37\xfe\x02\xc9\x48\x15\xcf\x76\xbf\xb8\xf5\xcd\xd8\x65\xcc\x26\xdc\xb5\xcf\x49\x2e\xdf\xd5\x47\xb5\x35\xe2\xe6\xa6\xd8\x54\x09\x56\xdc\xba\x62\xcf\xea\x19\xa9\x47\x44\x06\xe9\x34\x33\x7e\x45\x42\x70\xe0\x10\x36\xac\x45\x79\x3b\x6b\x8a\xce\xda\x18\x7a\x08\xd5\x6a\x2c\xe4\xe9\x8f\x42\xea\x37\x5b\x10\x1a\x6b\x9f\xcb\x42\x31\xd1\x71\xaa\x46\x3e\xeb\x43\x58\x6a\x4b\x82\xa3\x87\xbc\xdd\xaf\x71\xa8\x0f\xd5\xc1\xf7\x29\x2e\xfc\x2b\xd8\xe7\x0c\x11\xea\xa8\x17\x10\x60\x61\xb6\xc4\x61\xc4\x88\x3d\x61\x3c\xc0\x6c\x7e\x2a\x03\xf7\x3d\x90\xfc\x55\xcd\xc0\x72\x65\xee\xfd\x36\xbe\x72\x27\x03\x83\xd6\xc6\x76\xca\xe3\x7c\x93\x69\x1f\x1a\xe3\xd9\x27\xb3\xa1\xcd\x96\x3e\x42\x29\x75\x7a\xe5\x23\x1e\xea\x73\xa9\xf7\x15\x15\x62\x83\x05\x41\x0a\xc2\x59\x3b\x32\x5c\xc6\x31"}, -{{0x28,0x27,0x75,0xdf,0x9e,0xbb,0xd7,0xc5,0xa6,0x5f,0x3a,0x2b,0x09,0x6e,0x36,0xee,0x64,0xa8,0xf8,0xea,0x71,0x9d,0xa7,0x77,0x58,0x73,0x9e,0x4e,0x74,0x76,0x11,0x1d,},{0xa2,0xb4,0x96,0x46,0x03,0x3a,0x13,0x93,0x7c,0xad,0x6b,0x0e,0x91,0x4e,0x3c,0xec,0x54,0x98,0x9c,0x25,0x2c,0xa5,0x64,0x3d,0x07,0x65,0x55,0xd8,0xc5,0x5e,0x56,0xe0,},{0x15,0x76,0x39,0x73,0x85,0x94,0x02,0x90,0x7d,0x8d,0xcb,0x86,0xad,0xc2,0x4a,0x2a,0x16,0x8b,0xa3,0xab,0xf2,0x24,0x61,0x73,0xd6,0x34,0x8a,0xfe,0xd5,0x1e,0xf6,0x0b,0x0c,0x0e,0xde,0xff,0x4e,0x10,0xbc,0xef,0x4c,0x6e,0x57,0x78,0xc8,0xbc,0x1f,0x5e,0x9e,0xe0,0x23,0x73,0x73,0x44,0x5b,0x45,0x51,0x55,0xd2,0x3d,0xe1,0x27,0xa2,0x02,},"\x14\xcc\x50\xc2\x97\x3e\xa9\xd0\x18\x7a\x73\xf7\x1c\xb9\xf1\xce\x07\xe7\x39\xe0\x49\xec\x2b\x27\xe6\x61\x3c\x10\xc2\x6b\x73\xa2\xa9\x66\xe0\x1a\xc3\xbe\x8b\x50\x5a\xea\xad\x14\x85\xc1\xc2\xa3\xc6\xc2\xb0\x0f\x81\xb9\xe5\xf9\x27\xb7\x3b\xfd\x49\x86\x01\xa7\x62\x2e\x85\x44\x83\x7a\xad\x02\xe7\x2b\xf7\x21\x96\xdc\x24\x69\x02\xe5\x8a\xf2\x53\xad\x7e\x02\x5e\x36\x66\xd3\xbf\xc4\x6b\x5b\x02\xf0\xeb\x4a\x37\xc9\x55\x49\x92\xab\xc8\x65\x1d\xe1\x2f\xd8\x13\x17\x73\x79\xbb\x0c\xe1\x72\xcd\x8a\xaf\x93\x7f\x97\x96\x42\xbc\x2e\xd7\xc7\xa4\x30\xcb\x14\xc3\xcd\x31\x01\xb9\xf6\xb9\x1e\xe3\xf5\x42\xac\xdf\x01\x7f\x8c\x21\x16\x29\x7f\x45\x64\x76\x8f\x4d\xb9\x5d\xad\x8a\x9b\xcd\xc8\xda\x4d\x8f\xb1\x3e\xf6\xe2\xda\x0b\x13\x16\xd3\xc8\xc2\xf3\xed\x83\x6b\x35\xfe\x2f\xd3\x3e\xff\xb4\x09\xe3\xbc\x1b\x0f\x85\x22\x5d\x2a\x1d\xe3\xbf\xc2\xd2\x05\x63\x94\x64\x75\xc4\xd7\xca\x9f\xdd\xba\xf5\x9a\xd8\xf8\x96\x1d\x28\x7a\xe7\xdd\x80\x3e\x7a\xf1\xfa\x61\x23\x29\xb1\xbd\xc0\x4e\x22\x56\x00\xae\x73\x1b\xc0\x1a\xe0\x92\x5a\xed\x62\xac\x50\xd4\x60\x86\xf3\x64\x6c\xf4\x7b\x07\x2f\x0d\x3b\x04\x4b\x36\xf8\x5c\xec\x72\x9a\x8b\xb2\xb9\x28\x83\xca\x4d\xfb\x34\xa8\xee\x8a\x02\x73\xb3\x1a\xf5\x09\x82\xbb\x61\x31\xbf\xa1\x1d\x55\x50\x4b\x1f\x6f\x1a\x0a\x00\x43\x8c\xa2\x6d\x8a\xb4\xf4\x8b\xcd\xdc\x9d\x5a\x38\x85\x1a\xbe\xde\x41\x51\xd5\xb7\x0d\x72\x07\x32\xa0\x0a\xbe\xa2\xc8\xb9\x79"}, -{{0x47,0x30,0xa5,0xcf,0x97,0x72,0xd7,0xd6,0x66,0x5b,0xa7,0x87,0xbe,0xa4,0xc9,0x52,0x52,0xe6,0xec,0xd6,0x3e,0xc6,0x23,0x90,0x54,0x7b,0xf1,0x00,0xc0,0xa4,0x63,0x75,},{0xf9,0xf0,0x94,0xf7,0xcc,0x1d,0x40,0xf1,0x92,0x6b,0x5b,0x22,0xdc,0xe4,0x65,0x78,0x44,0x68,0xb2,0x0a,0xb3,0x49,0xbc,0x6d,0x4f,0xdf,0x78,0xd0,0x04,0x2b,0xbc,0x5b,},{0x55,0x2c,0x73,0x47,0xbd,0xfe,0x13,0x16,0x46,0xce,0x09,0x32,0xd8,0x2a,0x36,0xd2,0xc1,0xb7,0x6d,0x7c,0x30,0xee,0x89,0x0e,0x05,0x92,0xe1,0x9f,0x9d,0x18,0xb9,0xa5,0x6f,0x48,0xd7,0xa9,0xb6,0x8c,0x01,0x7d,0xa6,0xb5,0x50,0xc9,0x43,0xaf,0x4a,0x90,0x7b,0xaf,0x31,0x7e,0x41,0x9f,0xbb,0xc9,0x6f,0x6c,0xf4,0xbf,0xad,0x42,0xde,0x00,},"\xe7\x47\x6d\x2e\x66\x84\x20\xe1\xb0\xfa\xdf\xba\xa5\x42\x86\xfa\x7f\xa8\x90\xa8\x7b\x82\x80\xe2\x60\x78\x15\x22\x95\xe1\xe6\xe5\x5d\x12\x41\x43\x5c\xc4\x30\xa8\x69\x3b\xb1\x0c\xde\x46\x43\xf5\x9c\xbf\xcc\x25\x6f\x45\xf5\x09\x0c\x90\x9a\x14\xc7\xfc\x49\xd3\x7b\xfc\x25\xaf\x11\xe8\xf4\xc8\x3f\x4c\x32\xd4\xaa\xbf\x43\xb2\x0f\xa3\x82\xbb\x66\x22\xa1\x84\x8f\x8f\xfc\x4d\xff\x34\x08\xbb\x4e\xc7\xc6\x7a\x35\xb4\xcd\xae\xe5\xe2\x79\xc0\xfc\x0a\x66\x09\x3a\x9f\x36\xa6\x0f\xdd\x65\xe6\x33\x4a\x80\x4e\x84\x5c\x85\x30\xb6\xfd\xa3\x63\xb5\x64\x03\x37\xd0\x27\x24\x3c\xcf\xb3\xc1\x77\xf4\x3e\x71\x78\x96\xe4\x6e\xad\x7f\x72\xca\x06\xaa\x0f\xf1\xe7\x72\x47\x12\x1b\xaf\x48\xbe\x9a\x44\x5f\x72\x9c\xa1\x39\x0f\xc4\x61\x51\xcb\xd3\x3f\xcb\xd7\x37\x3f\x27\xa6\xba\x55\xc9\x2c\xbf\x69\x45\xb0\x9b\x44\xb9\xa4\xe5\x80\x0d\x40\x30\x70\xae\x66\x04\x89\x97\xb2\x19\x7f\x02\x18\x1a\x09\x7e\x56\x3f\x9b\x9a\xcc\x84\x11\x39\x25\x8a\x25\x8b\xc6\x10\xd3\xbd\x89\x16\x37\x35\x6b\x2e\xdc\x8c\x18\x4c\x35\xc6\x5a\xf9\x1a\xaf\x7b\x1c\x16\xd7\x4a\x5f\x5f\x86\x25\x48\x13\x92\x54\xec\xf5\x50\x63\x1d\x5f\x88\x49\xaf\xdb\x5b\x64\xcf\x36\x6f\xf2\x63\x3a\x93\xf3\xa1\x8c\x39\xb5\x15\x02\x45\xfb\x5f\x33\xc9\xe4\xe2\xd9\x4a\xf6\x96\x3a\x70\xb8\x8f\x9e\x7e\x51\x9f\x8f\xa2\xa0\xf2\xe3\x74\x9d\xe8\x83\xd0\xe6\xf0\x52\xa9\x49\xd0\xfc\x71\x53\xa8\x69\x3f\x6d\x80\x1d\x73\x52\xeb\x2f\x7a\x46\x5c\x0e"}, -{{0x27,0x70,0xaa,0xdd,0x1d,0x12,0x3e,0x95,0x47,0x83,0x2d,0xfb,0x2a,0x83,0x7e,0xba,0x08,0x91,0x79,0xef,0x4f,0x23,0xab,0xc4,0xa5,0x3f,0x2a,0x71,0x4e,0x42,0x3e,0xe2,},{0x3c,0x5f,0xbb,0x07,0x53,0x0d,0xd3,0xa2,0x0f,0xf3,0x5a,0x50,0x0e,0x37,0x08,0x92,0x63,0x10,0xfe,0xd8,0xa8,0x99,0x69,0x02,0x32,0xb4,0x2c,0x15,0xbd,0x86,0xe5,0xdc,},{0xf2,0x67,0x71,0x5e,0x9a,0x84,0xc7,0x31,0x4f,0x2d,0x58,0x69,0xef,0x4a,0xb8,0xd2,0x14,0x9a,0x13,0xf7,0xe8,0xe1,0xc7,0x28,0xc4,0x23,0x90,0x62,0x93,0xb4,0x9c,0xe6,0x28,0x34,0x54,0xdd,0x1c,0x7b,0x04,0x74,0x1d,0xf2,0xea,0xbe,0xdc,0x4d,0x6a,0xb1,0x39,0x7d,0xc9,0x5a,0x67,0x9d,0xf0,0x4d,0x2c,0x17,0xd6,0x6c,0x79,0xbb,0x76,0x01,},"\xa5\xcc\x20\x55\xeb\xa3\xcf\x6f\x0c\x63\x32\xc1\xf2\xab\x58\x54\x87\x09\x13\xb0\x3f\xf7\x09\x3b\xc9\x4f\x33\x5a\xdd\x44\x33\x22\x31\xd9\x86\x9f\x02\x7d\x82\xef\xd5\xf1\x22\x71\x44\xab\x56\xe3\x22\x2d\xc3\xdd\xcc\xf0\x62\xd9\xc1\xb0\xc1\x02\x4d\x9b\x41\x6d\xfa\x3e\xe8\xa7\x02\x79\x23\x00\x34\x65\xe0\xff\xae\xfb\x75\xb9\xf2\x9d\xc6\xbc\xf2\x13\xad\xc5\xe3\x18\xfd\x8b\xa9\x3a\x7a\xa5\xbf\xb4\x95\xde\x9d\x7c\x5e\x1a\x19\x6c\xd3\xa2\xd7\x72\x1f\x8b\xa7\x85\xaa\x90\x52\xa1\x81\x1c\x7f\xcc\x8f\x93\x93\x27\x65\x05\x9c\xab\x9c\x9b\x71\x89\x45\x89\x5e\xf2\x6f\x3a\xc0\x48\xd4\xca\xbf\x91\xa9\xe6\xaa\x83\xac\x14\xd4\x31\x56\x82\x78\x37\x91\x4e\xb7\x63\xa2\x3c\xba\x53\xf6\x0f\x15\x0f\x4b\x70\x20\x3e\xc1\x83\x3f\xf1\x05\x84\x94\x57\xa8\xda\x73\x27\x66\x1f\xb2\x3a\x55\x41\x64\xe0\x5f\xcf\x01\x46\xb1\x06\x74\x96\x4b\xe6\xf6\xaa\x0a\xcc\x94\xc4\x1a\xd5\x71\x80\xe5\x18\x0d\x19\x9b\xd9\x10\x2f\x55\xd7\x40\xe8\x17\x89\xb1\x56\x71\xbb\xd0\x67\x0e\x6d\xe5\xd9\x7e\x1a\xe6\x26\xd8\xa0\xeb\xc3\x2c\x8f\xd9\xd2\x47\x37\x27\x4e\x47\xd2\xdd\x59\x41\xa2\x72\xe7\x2a\x59\x89\x28\xad\x10\x9c\xde\x93\x7b\xf2\x48\xd5\x7f\x5d\x29\x42\x98\x3c\x51\xe2\xa8\x9f\x8f\x05\x4d\x5c\x48\xdf\xad\x8f\xcf\x1f\xfa\x97\xf7\xde\x6a\x3a\x43\xca\x15\xfc\x67\x20\xef\xae\xc6\x9f\x08\x36\xd8\x42\x23\xf9\x77\x6d\x11\x1e\xc2\xbb\xc6\x9b\x2d\xfd\x58\xbe\x8c\xa1\x2c\x07\x21\x64\xb7\x18\xcd\x7c\x24\x6d\x64"}, -{{0x4f,0xda,0xb7,0xc1,0x60,0x0e,0x70,0x11,0x4b,0x11,0xf5,0x33,0x24,0x23,0x76,0xaf,0x76,0x14,0xb4,0xd5,0xda,0x04,0x6a,0xc4,0xbe,0xde,0xa2,0x1d,0x8a,0x36,0x15,0x98,},{0xa2,0x5c,0x9a,0x94,0xd6,0xe4,0xec,0xd9,0x5a,0x4b,0xd6,0x80,0x5f,0x76,0x2e,0xb1,0xc4,0x57,0xa8,0xd4,0x5d,0x24,0x32,0x38,0xb1,0x83,0x9c,0xbb,0xa8,0xf4,0x41,0xcc,},{0x50,0x75,0xc0,0x90,0xcf,0xbe,0xb6,0xb0,0x18,0x02,0xaf,0x7f,0x4d,0xa5,0xaa,0x4f,0x43,0x4d,0x5e,0xe2,0xf3,0x53,0x0e,0xeb,0xb7,0x5c,0x85,0xe0,0x86,0x21,0xf8,0x3e,0xdc,0x08,0xaa,0x96,0x69,0x38,0x94,0xa4,0x27,0x76,0x33,0xba,0x81,0xe1,0x9e,0x9e,0x55,0xaf,0x5c,0x49,0x5d,0xaa,0x5e,0x1a,0x6f,0x8c,0xbb,0x79,0xc0,0x1c,0x72,0x07,},"\xda\x40\x58\x90\xd1\x1a\x87\x2c\x11\x9d\xab\x5e\xfc\xbf\xf6\x1e\x93\x1f\x38\xec\xcc\xa4\x57\xed\xc6\x26\xd3\xea\x29\xed\x4f\xe3\x15\x4f\xaf\xec\x14\x44\xda\x74\x34\x3c\x06\xad\x90\xac\x9d\x17\xb5\x11\xbc\xb7\x3b\xb4\x9d\x90\xba\xfb\x7c\x7e\xa8\x00\xbd\x58\x41\x1d\xf1\x27\x5c\x3c\xae\x71\xb7\x00\xa5\xda\xb4\x91\xa4\x26\x16\x78\x58\x79\x56\xaa\x4a\x21\x9e\x1a\xc6\xdd\x3f\xb2\xcb\x8c\x46\x19\x72\x18\xe7\x26\xdc\x7e\xd2\x34\x52\x6a\x6b\x01\xc0\xd7\x2c\xb9\x3a\xb3\xf4\xf3\x8a\x08\xe5\x94\x0b\x3f\x61\xa7\x2a\xd2\x78\x9a\x05\x32\x00\x0f\xac\x1d\x2d\x2e\x3a\xd6\x32\xac\x8b\x62\xbb\x3f\xf5\xb9\x9d\x53\x59\x7b\xf4\xd4\x4b\x19\x67\x49\x24\xdf\x9b\x3d\xb3\xd0\x25\x3f\x74\x62\x7c\xca\xb3\x00\x31\xc8\x5e\x29\x1c\x58\xb5\xfa\x91\x67\x52\x2a\x46\x74\x6f\xc3\x07\x03\x67\x45\xd4\xf9\x81\x77\x86\xe5\xd3\x00\xe6\xc5\xd5\x03\x12\x5f\xea\x01\xde\xc3\xe3\xfe\xdb\xf3\x86\x1c\xa2\x62\x7a\x05\x18\xfb\x2b\x24\xe5\xa7\xa0\x14\x17\x87\x19\xe9\xb3\x45\xf7\xb2\x49\xce\x3a\x41\x32\x80\xc8\xde\xb6\x74\xf5\x9a\x25\xbe\x92\xa8\xab\x64\x00\xc7\xc5\x2b\x07\x28\xae\x34\xe2\x2b\x2e\xc2\x00\xc1\xcb\xab\xa2\xcc\xd8\xaf\x29\x24\x9d\x17\xaf\x60\xc3\x60\x07\xa7\x22\xfc\x80\x25\x8a\x7b\xeb\xab\x1c\xda\xad\x74\x62\xa8\xb7\x58\x8c\x2f\x7e\x27\xc6\xd0\x7a\xfc\xf6\x01\x17\xfe\xd1\x1b\xd6\x85\x9e\x75\xe3\xb4\xfc\xee\x39\x81\x88\x1e\x95\xdd\x11\x68\x27\xdd\x4b\x36\x9a\xf0\x69\xd3\xc8\xf2\x67\x6f\x8a"}, -{{0x26,0x45,0x04,0x60,0x4e,0x70,0xd7,0x2d,0xc4,0x47,0x4d,0xbb,0x34,0x91,0x3e,0x9c,0x0f,0x80,0x6d,0xfe,0x18,0xc7,0x87,0x9a,0x41,0x76,0x2a,0x9e,0x43,0x90,0xec,0x61,},{0xeb,0x2b,0x51,0x8c,0xe7,0xdc,0x71,0xc9,0x1f,0x36,0x65,0x58,0x16,0x51,0xfd,0x03,0xaf,0x84,0xc4,0x6b,0xf1,0xfe,0xd2,0x43,0x32,0x22,0x35,0x3b,0xc7,0xec,0x51,0x1d,},{0xee,0xa4,0x39,0xa0,0x0f,0x7e,0x45,0x9b,0x40,0x2b,0x83,0x51,0x50,0xa7,0x79,0xee,0xd1,0x71,0xab,0x97,0x1b,0xd1,0xb5,0x8d,0xcc,0x7f,0x93,0x86,0xda,0xdd,0x58,0x3d,0xe8,0xdc,0x69,0xe2,0x67,0x12,0x1d,0xde,0x41,0xf0,0xf9,0x49,0x3d,0x45,0x0b,0x16,0x21,0x9c,0xdf,0x3c,0x22,0xf0,0x94,0x82,0xce,0x40,0x2f,0xe1,0x7c,0xa4,0x9e,0x08,},"\x90\x1d\x70\xe6\x7e\xd2\x42\xf2\xec\x1d\xda\x81\x3d\x4c\x05\x2c\xfb\x31\xfd\x00\xcf\xe5\x44\x6b\xf3\xb9\x3f\xdb\x95\x0f\x95\x2d\x94\xef\x9c\x99\xd1\xc2\x64\xa6\xb1\x3c\x35\x54\xa2\x64\xbe\xb9\x7e\xd2\x0e\x6b\x5d\x66\xad\x84\xdb\x5d\x8f\x1d\xe3\x5c\x49\x6f\x94\x7a\x23\x27\x09\x54\x05\x1f\x8e\x4d\xbe\x0d\x3e\xf9\xab\x30\x03\xdd\x47\xb8\x59\x35\x6c\xec\xb8\x1c\x50\xaf\xfa\x68\xc1\x5d\xad\xb5\xf8\x64\xd5\xe1\xbb\x4d\x3b\xad\xa6\xf3\xab\xa1\xc8\x3c\x43\x8d\x79\xa9\x4b\xfb\x50\xb4\x38\x79\xe9\xce\xf0\x8a\x2b\xfb\x22\xfa\xd9\x43\xdb\xf7\x68\x37\x79\x74\x6e\x31\xc4\x86\xf0\x1f\xd6\x44\x90\x50\x48\xb1\x12\xee\x25\x80\x42\x15\x3f\x46\xd1\xc7\x77\x2a\x06\x24\xbc\xd6\x94\x1e\x90\x62\xcf\xda\x75\xdc\x87\x12\x53\x3f\x40\x57\x33\x5c\x29\x80\x38\xcb\xca\x29\xeb\xdb\x56\x0a\x29\x5a\x88\x33\x96\x92\x80\x8e\xb3\x48\x1f\xd9\x73\x5e\xa4\x14\xf6\x20\xc1\x43\xb2\x13\x3f\x57\xbb\x64\xe4\x47\x78\xa8\xca\x70\x91\x82\x02\xd1\x57\x42\x61\x02\xe1\xdf\xc0\xa8\xf7\xb1\xae\x48\x7b\x74\xf0\x27\x92\x63\x31\x54\xdf\xe7\x4c\xaa\x1b\x70\x88\xfd\xa2\x2f\xa8\xb9\xbc\x35\x4c\x58\x5f\x15\x67\x70\x6e\x29\x55\x49\x38\x70\xf5\x41\x69\xe0\xd7\x69\x11\x59\xdf\x43\x89\x79\x61\xd2\x4a\x85\x2e\xa9\x70\xc5\x14\x94\x8f\x3b\x48\xf7\x1e\xe5\x86\xe7\x2e\xc7\x8d\xb8\x20\xf2\x53\xe0\x8d\xb8\x4f\x6f\x31\x2c\x43\x33\xbd\x0b\x73\x2f\xe7\x58\x83\x50\x77\x83\xe9\xa1\xfd\x4f\xba\xb8\xe5\x87\x0f\x9b\xf7\xad\x58\xaa"}, -{{0x2c,0xa7,0x44,0x7a,0x36,0x68,0xb7,0x48,0xb1,0xfd,0x3d,0x52,0xd2,0x08,0x0d,0x30,0xe3,0x4d,0x39,0x7b,0xb2,0x84,0x6c,0xaf,0x8f,0x65,0x9a,0xc1,0x68,0x78,0x8c,0xa5,},{0xab,0x33,0x1c,0xd4,0x0a,0x31,0xd0,0x17,0x3c,0x0c,0x8c,0x1c,0x17,0x00,0x25,0x32,0x80,0x7b,0xf8,0x9e,0x3e,0xdb,0x6d,0x34,0xc2,0xdd,0x82,0x94,0x63,0x2b,0x9f,0xbc,},{0xf9,0x3a,0xda,0x15,0xae,0x9c,0xd2,0xb5,0x4f,0x26,0xf8,0x6f,0x0c,0x28,0x39,0x2a,0xed,0x5e,0xb6,0xb6,0xb4,0x4d,0x01,0xa4,0xe3,0x3a,0x54,0xe7,0xda,0x37,0xc3,0x8e,0x8d,0x53,0x36,0x6f,0x73,0xfd,0x85,0xbe,0x64,0x2e,0x4e,0xc8,0x12,0x36,0xd1,0x63,0xf0,0xd0,0x25,0xe7,0x6c,0x8b,0xbd,0xd6,0x5d,0x43,0xdf,0x49,0xf0,0x9c,0x1f,0x01,},"\xa8\x2b\xcd\x94\x24\xbf\xfd\xa0\xf2\xf5\xe9\xea\xe1\x78\x35\xdb\xe4\x68\xf6\x1b\x78\x5a\xab\x82\x93\x47\x37\xa9\x1c\x5f\x60\x2c\xb7\xc6\x17\xcd\xff\xe8\x7c\xad\x72\x6a\x49\x72\xe1\x5a\x7b\x8e\xe1\x47\xf0\x62\xd2\xa5\xa4\xd8\x97\x06\xb5\x71\xfa\x8a\xa2\xb9\x59\x81\xc7\x8a\xbe\xaa\xae\x86\x20\x3f\xa2\xc0\xe0\x72\x97\x40\x6e\xa8\xc2\x71\x11\xa8\x6d\xbe\x1d\x5a\x7c\x3b\x7a\xe9\x30\x90\x4d\x98\x90\xf6\xd4\xab\xeb\xd1\x41\x2a\x73\xad\x5f\xee\xa6\x4a\xcf\x06\x5d\x3e\x63\xb5\xcb\xe2\x0c\xf2\x0b\xbd\x2d\x8b\x94\xf9\x05\x3e\xd5\xf6\x66\x33\x48\x25\x30\x12\x44\x46\x60\x59\x18\xde\x66\x45\x5e\x8c\xf4\xb1\x01\xa1\x27\x23\x3c\x4e\x27\xd5\xd5\x5b\xf9\x5b\xd3\x19\x5d\x03\x40\xd4\x35\x31\xfc\x75\xfa\xf8\xdd\xed\x52\x75\xbf\x89\x75\x0d\xe8\x38\xfd\x10\xc3\x17\x45\xbe\x4c\xa4\x1f\xa8\x71\xcb\x0f\x9b\x01\x67\x06\xa1\xa7\xe3\xc4\x4b\xb9\x0a\xc7\xa8\xad\x51\xe2\x72\x38\x92\x92\xfd\x6c\x98\xad\x7a\x06\x9e\x76\xe3\xf5\xf3\xe0\xcc\x77\x0b\x9e\x9b\x35\xa7\x65\xd0\xd9\x37\x12\xd7\xcd\xab\xd1\x7e\x5d\x01\xdd\x81\x83\xaf\x4a\xd9\x36\x5d\xb0\xa0\xfa\x41\x38\x1f\xce\x60\xa0\x81\xdf\x1c\x5a\xb0\xf8\xc1\x8f\x95\xa7\xa8\xb5\x82\xdf\xff\x7f\x14\x9e\xa5\x79\xdf\x06\x23\xb3\x3b\x75\x08\xf0\xc6\x63\xf0\x1e\x3a\x2d\xcd\x9d\xfb\xee\x51\xcc\x61\x52\x20\xfd\xaf\xfd\xab\x51\xbd\xae\x42\xcb\x9f\x7f\xa9\xe3\xb7\xc6\x9c\xc8\xad\xa5\xcc\xd6\x42\x52\x9b\xa5\x14\xfd\xc5\x4f\xcf\x27\x20\xb8\xf5\xd0\x8b\x95"}, -{{0x49,0x4e,0xa9,0xbc,0xce,0x26,0x88,0x5b,0x7d,0x17,0xd1,0xfc,0x11,0x44,0x48,0xf2,0x39,0xf0,0xce,0x46,0xe5,0xf2,0x47,0xb4,0xc9,0x99,0xfa,0x86,0x29,0x69,0x24,0x72,},{0x69,0x01,0xe5,0xef,0xae,0x57,0x53,0x6b,0xa5,0xfd,0xd9,0x6b,0x59,0x65,0x73,0x59,0x06,0x5f,0x25,0xd3,0x91,0xa1,0xaa,0x8c,0xdc,0x0d,0x38,0xbb,0x5d,0x53,0xc1,0x39,},{0x54,0x8a,0x09,0x3a,0x68,0x03,0x61,0xb7,0xdc,0x56,0xf1,0x45,0x03,0xb5,0x5e,0xee,0xc3,0xb3,0xf4,0xfd,0x4c,0xa9,0x9d,0x6a,0xed,0xce,0x08,0x30,0xf7,0xf4,0xae,0x2f,0x73,0x28,0x53,0x9b,0x34,0xc4,0x8f,0xc9,0x76,0x09,0x22,0x33,0x3d,0xae,0x9c,0x7c,0x01,0x7e,0x7d,0xb7,0x3b,0x8f,0xaa,0x6c,0x06,0xbe,0x05,0xe3,0x47,0x99,0x2b,0x06,},"\x3b\xad\xbf\xa5\xf5\xa8\xaa\x2c\xce\x0a\x60\xe6\x86\xcd\xce\x65\x4d\x24\x45\x2f\x98\xfd\x54\x87\x2e\x73\x95\xb3\x94\x64\x38\x0a\x0e\x18\x55\x57\xea\x13\x4d\x09\x57\x30\x86\x4f\x42\x54\xd3\xdd\x94\x69\x70\xc1\x0c\x80\x4f\xcc\x08\x99\xdf\xa0\x24\x20\x5b\xe0\xf8\x0b\x1c\x75\x44\x95\x23\x32\x4f\xe6\xa0\x75\x1e\x47\xb4\xff\x48\x22\xb8\xc3\x3e\x9e\xaf\x1d\x1d\x96\xe0\xde\x3d\x4a\xcd\x89\x69\x6b\x7f\xcc\x03\xd4\x9f\x92\xf8\x2b\x97\x25\x70\x0b\x35\x0d\xb1\xa8\x76\x15\x36\x95\x45\x56\x1b\x85\x99\xf5\xea\x92\x0a\x31\x0a\x8b\xaf\xc0\xe8\xd7\x46\x8c\xbf\x6f\x38\x20\xe9\x43\x59\x4a\xfd\xd5\x16\x6e\x4e\x33\x09\xdd\xdd\x76\x94\xef\x67\xe6\x94\xf3\x4f\xc6\x27\x24\xff\x96\xac\x33\x64\x17\x6f\x34\xe8\xa0\x2b\x4c\xf5\x69\xdb\x5b\x8f\x77\xd5\x85\x12\xae\xda\xbf\x0b\xcd\x1c\x2d\xf1\x2d\xb3\xa9\x47\x3f\x94\x8c\x5c\x32\x43\x30\x9a\xae\x46\xc4\x9e\xfd\x08\x8b\x60\xf3\x1a\x8a\x72\xad\x7e\x5a\x35\xac\xc5\xd8\x9f\xa6\x68\x07\xeb\x5d\x3b\xa9\xcd\xf0\x8d\x47\x53\xcb\x85\x08\x9e\xe3\x6f\x5c\x96\xb4\x32\xb6\x92\x83\x52\xaf\xad\x58\x01\x22\x25\xd6\x15\x7f\x9e\x36\x11\x42\x6d\xf9\x21\xb6\xd1\xd8\x37\x46\x28\xa6\x30\x31\xe9\xff\xb9\x0e\x42\xff\xbb\xa0\x21\xf1\x74\xf6\x85\x03\x15\x54\x30\x15\x2c\x91\x55\xdc\x98\xff\xa2\x6c\x4f\xab\x06\x5e\x1f\x8e\x46\x22\xc2\xf2\x8a\x8c\xb0\x43\x11\x0b\x61\x74\x41\x14\x0f\x8e\x20\xad\xc1\x6f\x79\x9d\x1d\x50\x96\xb1\xf5\x05\x32\xbe\x50\x42\xd2\x1b\x81\xea\x46\xc7"}, -{{0x00,0xd7,0x35,0xeb,0xae,0xe7,0x5d,0xd5,0x79,0xa4,0x0d,0xfd,0x82,0x50,0x82,0x74,0xd0,0x1a,0x15,0x72,0xdf,0x99,0xb8,0x11,0xd5,0xb0,0x11,0x90,0xd8,0x21,0x92,0xe4,},{0xba,0x02,0x51,0x7c,0x0f,0xdd,0x3e,0x26,0x14,0xb3,0xf7,0xbf,0x99,0xed,0x9b,0x49,0x2b,0x80,0xed,0xf0,0x49,0x5d,0x23,0x0f,0x88,0x17,0x30,0xea,0x45,0xbc,0x17,0xc4,},{0xdc,0xdc,0x54,0x61,0x19,0x37,0xd2,0xbd,0x06,0xca,0xcd,0x98,0x18,0xb3,0xbe,0x15,0xce,0x74,0x25,0x42,0x7a,0x75,0xf5,0x0d,0x19,0x7a,0x33,0x7a,0x3b,0x8b,0xa6,0x71,0x4e,0xf4,0x88,0x66,0xf2,0x43,0xbd,0x5a,0xc7,0x41,0x5e,0x91,0x45,0x17,0xa2,0xc1,0xc5,0xa9,0x53,0xf4,0x32,0xb9,0x9d,0xb0,0xe6,0x20,0xd6,0x4f,0x74,0xeb,0x85,0x05,},"\x59\xc0\xb6\x9a\xf9\x5d\x07\x4c\x88\xfd\xc8\xf0\x63\xbf\xdc\x31\xb5\xf4\xa9\xbc\x9c\xec\xdf\xfa\x81\x28\xe0\x1e\x7c\x19\x37\xdd\xe5\xeb\x05\x70\xb5\x1b\x7b\x5d\x0a\x67\xa3\x55\x5b\x4c\xdc\xe2\xbc\xa7\xa3\x1a\x4f\xe8\xe1\xd0\x3a\xb3\x2b\x40\x35\xe6\xda\xdb\xf1\x53\x20\x59\xee\x01\xd3\xd9\xa7\x63\x3a\x0e\x70\x6a\x11\x54\xca\xb2\x2a\x07\xcd\x74\xc0\x6a\x3c\xb6\x01\x24\x4c\xf3\xcf\x35\xa3\x5c\x31\x00\xba\x47\xf3\x13\x72\xa2\xda\x65\xdc\xff\x0d\x7a\x80\xa1\x05\x5d\x8a\xa9\x92\x12\xe8\x99\xaa\xd7\xf0\x2e\x94\x9e\x6f\xee\x4d\x3c\x9c\xef\xa8\x50\x69\xea\xff\x1f\x6a\xd0\x6f\xc3\x00\xc8\x71\xab\x82\xb2\xbe\xdb\x93\x4d\x20\x87\x5c\x2a\x26\x32\x42\xcd\xb7\xf9\xbe\x19\x2a\x87\x10\xb2\x4c\x7e\xa9\x8d\x43\xda\xec\x8b\xaa\x55\x53\xc6\x78\xa3\x8f\x0e\x0a\xdf\x7d\x3f\xf2\xdc\xc7\x99\xa1\xdb\xad\x6e\xab\x1c\x3d\x94\x58\xa9\xdb\x92\x2f\x02\xe7\x5c\xfa\xb9\xd6\x5c\x73\x36\xda\xe7\x18\x95\xd5\xbb\x15\xca\xc2\x03\xf2\xb3\x8b\x99\x96\xc4\x10\xf8\x65\x5a\xd2\x2d\x3c\x09\x1c\x20\xb7\xf9\x26\xd4\x5e\x78\x01\x28\xf1\x97\x47\x46\x2a\xbc\x5c\x58\x93\x2f\xbb\x9e\x0b\xc6\x2d\x53\x86\x88\x02\xf1\xb0\x83\xf1\x83\xb8\xa1\xf9\x43\x49\x86\xd5\xcf\x97\xc0\x4e\x2f\x3e\x14\x57\x30\xcb\xa9\x87\x79\xc7\xfe\xd0\xca\xb1\xc0\x5d\x5e\x46\x53\xc6\xc3\xf6\x73\x62\x60\xbc\x78\xee\x43\x72\x86\x2f\xfe\x9e\x90\x37\x1d\x76\x2c\x74\x32\x78\x1f\x35\xce\xd8\x84\xa4\xba\xca\x05\x65\x3e\xf2\x5f\x25\xa6\xf3\xd5\x62\x83\x08"}, -{{0x8c,0x34,0xb9,0x05,0x44,0x0b,0x61,0x91,0x1d,0x1d,0x81,0x37,0xc5,0x3d,0x46,0xa1,0xa7,0x6d,0x46,0x09,0xaf,0x97,0x3e,0x18,0xeb,0x4c,0x57,0x09,0x29,0x56,0x27,0xbb,},{0xb6,0x9a,0x8b,0x2f,0xdf,0x5c,0x20,0xe7,0x34,0xc2,0xff,0xb2,0x94,0xbc,0x8a,0xe1,0x01,0x1d,0x66,0x4f,0x11,0xaf,0xe7,0xfb,0xc4,0x71,0x92,0x5c,0xf7,0x2f,0xa9,0x9d,},{0x3e,0x0b,0x72,0x07,0x3d,0xc9,0x37,0x5e,0xed,0xcc,0xa6,0xc4,0xfc,0x1c,0xd3,0x15,0x93,0x8a,0x05,0x0c,0x92,0x71,0x6b,0xd2,0x28,0x4f,0x46,0x29,0xa9,0x62,0xbe,0xec,0x0b,0x7d,0x7c,0xf1,0x6a,0xb9,0x23,0xd5,0x8f,0x5b,0x90,0xd3,0x90,0x1a,0x8e,0x5c,0x75,0xc8,0xf1,0x7d,0xab,0x99,0x98,0xe0,0x07,0xd8,0xc4,0x95,0x11,0x97,0x3d,0x0e,},"\x30\xb5\x7a\x38\x9b\x48\xa0\xbe\xb1\xa4\x84\x32\xbf\xf6\xb3\x14\xbd\xed\x79\xc4\xa1\x76\x3a\x5a\xcb\x57\xce\xa1\xbf\xb4\xc6\xd0\x16\xcf\x09\x0f\x5b\xd0\x5b\xbd\x11\x4e\x33\xae\x7c\x17\x78\x2d\xfa\x26\x4f\x46\xc4\x5f\x8c\x59\x9c\x60\x30\x16\xfe\x9f\xf0\x5b\x6b\x5a\x99\xe9\x2f\xe7\x13\xa4\xcd\x5c\x41\xb2\x92\xed\x2b\xb2\xe9\xcf\x33\xa4\x40\x54\x2e\x82\x1e\xc8\x2c\xbf\x66\x5c\x3f\x02\xe3\xdc\x33\x7d\x7f\xdb\x58\xe3\x1b\x27\xcb\x29\x54\x54\x14\x68\x81\x46\x98\x51\x0d\xf1\x8c\x85\xc8\x1f\xad\x12\xdb\x11\xec\x6b\x96\x6f\x49\x30\xda\x56\x46\xb9\x91\xdb\x97\x44\x50\x97\xda\x30\xda\xb6\x1c\xda\x53\xa4\x10\x83\xcb\x96\xad\xd1\x9d\xe6\xc5\xee\xc3\x23\xbc\xa9\xd3\x53\x0e\x38\xc0\x0b\x35\xaf\x73\x60\x07\x76\x01\xbe\x6a\xc9\x7f\x30\x30\xf9\x30\xa2\x7b\x90\xfe\x8b\x69\x11\xba\xe3\x89\x06\x5a\xdc\x15\xe1\x88\x23\x00\xe2\xa0\x03\x27\x4d\x23\x18\x2d\x5e\xfd\x5b\xa4\xb9\x13\x0c\x07\xbd\x5c\x65\xfe\xcb\x8b\x5c\xb7\xeb\x38\x83\x6b\x31\x8b\xef\xdf\xd7\x7d\xe4\xd6\xca\x01\x81\xf7\x7a\xe5\x74\x08\x91\x68\x32\x25\xf5\x49\xdd\x84\x26\x14\x5c\x97\xc5\x81\x8c\x31\x9f\x7a\xb2\xd8\x68\xe1\xa4\x1c\xea\xb6\x4c\x08\x51\x16\x06\x98\x97\xbf\x2c\xa3\x66\x76\x52\x40\x61\x55\xed\x06\x46\x43\x1b\x6d\xe1\xcc\xc0\x3b\x42\x79\xae\x4d\x32\x66\x79\x26\x5d\xce\x82\x04\x8e\x72\x98\xe1\xf8\x7f\xce\xc0\x76\x8a\xc0\xf5\xd8\xff\x84\xf7\x21\x0b\xe5\x4d\x41\x1a\xf8\xed\xea\x72\x17\xf4\xe5\x94\x13\x12\x1e\x14\x8c\x60\xda"}, -{{0x77,0xa8,0x3e,0x18,0xc9,0xf0,0x00,0xee,0xff,0x7d,0xee,0xac,0x95,0x9e,0xcb,0xa2,0x20,0x6c,0x0a,0xa3,0x9d,0x2f,0x0e,0x2a,0xed,0x57,0x29,0x48,0x2a,0x7a,0x02,0x29,},{0x62,0xb1,0xb3,0x16,0x13,0x55,0x96,0xbf,0xbc,0xa6,0x03,0x7e,0xd8,0x47,0xc6,0x1f,0xb7,0xf0,0x9f,0xa3,0x6c,0xe9,0x0a,0xbb,0x77,0x89,0xb8,0x6f,0x76,0x8b,0x59,0xdd,},{0x1e,0xaa,0xd8,0x42,0x0a,0xc1,0x2c,0x99,0xac,0x1f,0xf4,0x47,0x66,0x78,0xe3,0xcb,0xbe,0x94,0xda,0x6a,0x79,0x7f,0x17,0x46,0x64,0xd5,0xee,0x0f,0x64,0x14,0x33,0xfb,0x1e,0x7c,0xb2,0xf5,0x61,0x3e,0x10,0x80,0x5d,0xf8,0x65,0x4c,0xd8,0xe0,0xd4,0x5d,0x96,0x23,0x09,0x32,0xbc,0x7f,0x20,0xb0,0x4e,0xae,0x83,0x64,0x35,0x13,0x43,0x09,},"\xf3\xd5\xfa\x2a\xca\xef\xd8\x58\xf1\xdf\x26\xe0\x30\x59\xcd\xcb\xc2\x46\x8a\xd7\x4a\xfc\x99\x3d\x0d\xb9\xc4\xcd\xe4\x11\x3f\x8d\x55\xc7\xda\x71\xd3\x8b\xa0\x65\x20\x53\x1c\x61\xfd\xdb\x5f\x33\xd5\xf0\x35\x3b\xe2\x37\x6e\x58\x07\x11\xbe\x45\xc0\xa3\x0b\x1f\xa0\x1b\x55\xe2\x28\xc6\xfa\x35\xe3\xf9\x5b\x67\x90\x9f\xc7\xdf\x3f\xd4\x64\xd9\x3d\x66\x1a\x92\x6f\x9d\x11\xf7\x55\x0c\x17\xfb\xcc\x34\x96\x52\x6e\x8f\x10\xe0\xc8\x91\x66\x77\xb2\xbe\x5b\x31\x9b\x68\x8f\x21\xe8\x1a\xaa\x94\x82\xe5\xc9\x3e\x64\xce\x8c\x43\x7b\x9c\x1e\x14\xfe\xfe\xd7\x0a\x3f\xee\x56\x88\x11\xdc\x31\xca\xda\xb3\xd5\xb2\x20\x25\x44\x65\x33\x6d\xc4\xd9\x7a\x3b\xd0\x96\xb5\xe0\x65\xe0\xcf\xbe\x82\x84\x9e\x2c\x19\x05\xac\xa4\x86\x53\x3f\x0d\xa7\xa6\x1f\x1e\x9a\x55\xb8\xe2\xa8\x32\x62\xde\xeb\x59\xf2\xb1\x3d\x3a\x8a\xef\x57\x00\x84\x5b\x83\xb2\x5a\xe2\x18\x3c\x0d\xda\xc0\xce\x42\xf8\xd2\x56\x74\xcb\x0d\x0d\x22\x0a\x6d\xe7\xc1\x85\x8b\xb0\x7d\x59\xa3\x37\x23\x44\xd9\x44\x60\x2a\xa4\x51\xd2\xb9\x37\xdb\x0f\xe6\xfe\xca\x0b\xeb\xa8\x17\x21\xfc\x36\x1e\xa7\x50\x9e\x2b\x6d\x39\x7e\x1c\x19\x1b\x56\xf5\x4a\xb4\x36\xd0\xd2\x7a\xb4\xc0\x61\xbd\x66\x1a\xd1\xa4\x45\x23\x87\xe8\x73\x57\x54\xd0\x7f\xa7\xef\x4d\x45\x48\xb1\x72\x58\x24\x25\xb2\x99\x04\x6e\x63\x01\xb5\xba\x6b\x91\x44\x18\xf1\x49\xcf\x72\x2e\x10\xbd\xe2\xe0\xd4\x17\x00\xf1\x2c\x84\x29\xfc\x89\x7b\x78\x19\xda\x92\x29\x22\x40\xcd\x45\x56\x54\x58\xc9\xa7\xb2\x9c\x12"}, -{{0x73,0xb0,0x33,0x73,0xef,0x1f,0xd8,0x49,0x00,0x5e,0xcd,0x62,0x70,0xdd,0x99,0x06,0xf1,0x9f,0x44,0x39,0xe4,0x03,0x76,0xcd,0xbc,0x52,0x09,0x02,0xbc,0x97,0x68,0x12,},{0x66,0x37,0x19,0xe0,0x8b,0xa3,0xba,0x16,0x66,0xf6,0x06,0x9a,0x3f,0x54,0x99,0x18,0x66,0xb1,0x8c,0xc6,0xbe,0x41,0x99,0x1b,0x02,0xeb,0x30,0x26,0xff,0x9e,0x15,0x5f,},{0xa4,0x0a,0xbe,0x98,0xfc,0x69,0xda,0x8a,0x1f,0xf9,0xff,0x5c,0x2c,0xca,0x93,0x63,0x2e,0x97,0x59,0x80,0xee,0x8b,0x82,0xc3,0xc3,0x76,0x02,0x2d,0x65,0x24,0xab,0x73,0x6d,0x01,0xb0,0x72,0xf2,0xb6,0x81,0xb5,0xf1,0xcd,0x3e,0xa0,0x67,0x01,0x2e,0xd6,0xd0,0x74,0xe9,0x49,0xc4,0x23,0x27,0xa3,0x66,0xca,0xa9,0xe4,0x75,0x0a,0x3c,0x08,},"\xd5\xc2\xde\xab\xa7\x95\xc3\x0a\xba\x32\x1b\xc7\xde\x69\x96\xf0\xd9\x0e\x4d\x05\xc7\x47\xfb\x4d\xae\x8f\x34\x51\x89\x5d\xef\x6e\x16\xe7\x2f\x38\xea\xce\x75\x6f\x36\x63\x5f\x8f\xb0\xb7\x2a\x3a\x0c\x1f\x54\x66\x38\x17\xa9\x4d\x4f\xd3\x46\xf8\x35\xab\x0e\x65\x7f\x00\x1a\x6f\x2c\xec\xb8\x6d\x08\x25\xbd\x02\x63\x92\x54\xf7\xf7\xf3\x8c\xa9\x9d\xbb\x86\xc6\x4a\x63\x3f\x73\xba\xf9\x33\xaa\xe3\x56\x32\x81\xf4\x00\x5e\x2d\x0e\x7c\xec\x9f\xbd\xe8\xe5\x88\xa9\x57\xe2\x11\x06\x8b\xe6\x5b\x3d\x3d\x35\xbf\x4e\x8d\x5b\xb3\x47\x83\x33\xdf\x9c\xed\x9b\x2a\xba\xf4\x86\x97\x99\x4a\x14\x5e\x93\x21\x49\x9f\xc5\xee\x56\x0f\x4f\xbb\x68\x49\xe1\xae\x8e\xb3\xd1\xde\x00\x83\xa2\x1a\x03\xf6\xa6\xb2\x81\x76\xf0\x13\x0d\x38\x95\xe5\x0e\x75\xe3\xd7\xd0\x94\x7a\x7b\xc2\xc5\xb9\xff\x69\x89\x5d\x27\x79\x14\x42\xba\x8d\x0f\x21\x80\x71\x2b\x56\x7f\x71\x2e\xa9\x12\xf3\xb0\xd9\x2c\x19\x34\x2e\x01\x06\xff\x1d\x87\xb4\x6a\xd3\x3a\xf3\x00\xb9\x08\x55\xba\x97\x69\xd3\x66\xe7\x94\x25\xd9\x8e\x4d\xe1\x99\x05\xa0\x45\x77\x70\x7c\xbe\x62\x5b\x84\x69\x17\x81\xcd\x26\xbf\x62\x26\x0b\x4a\x8b\xd6\x05\xf7\x7a\xf6\xf9\x70\xe1\xb3\xa1\x12\xe8\x91\x83\x44\xbd\x0d\x8d\x2e\x41\xdf\xd2\xce\x98\x95\xb0\x24\x6e\x50\x88\x7a\xa3\xa5\x77\xff\x73\xbe\x4b\x6a\xe6\x0f\xeb\x0c\xa3\x6f\x6a\x5f\x81\x71\xed\x20\x9e\x5c\x56\x65\x29\xc0\x94\x0d\x9b\x4b\xd7\x44\xcc\xee\x56\xe5\x4a\x9a\x0c\x6e\x4d\xa5\x20\xdd\x31\x5c\x28\x72\xb0\x2d\xb5\x63\x70\x3e"}, -{{0xea,0xb1,0x79,0xe4,0x1e,0xd5,0xc8,0x89,0xff,0xe6,0xaa,0xbd,0xc0,0x54,0xfa,0xf1,0x30,0x7c,0x39,0x5e,0x46,0xe3,0x13,0xe1,0x7a,0x14,0xfe,0x01,0x02,0x3f,0xfa,0x30,},{0x86,0xf3,0x47,0x46,0xd3,0xf7,0xa0,0x1d,0xdb,0xe3,0x22,0xf1,0xac,0xa5,0x6d,0x22,0x85,0x6d,0x38,0x73,0x3a,0x3a,0x69,0x00,0xbb,0x08,0xe7,0x76,0x45,0x0e,0xc8,0x03,},{0x14,0x3c,0xb2,0x80,0x27,0xc2,0xf8,0x2e,0x37,0x5e,0x5f,0x34,0x0e,0x7f,0xe6,0xe6,0x0c,0xe7,0xbd,0x51,0x00,0x0b,0x49,0xc7,0x41,0x68,0xaf,0x85,0xe2,0x6e,0xd2,0xed,0x63,0x0e,0xd2,0x67,0x20,0x90,0x16,0x4c,0xc5,0x4b,0x05,0x2d,0xa6,0x94,0xeb,0xdd,0x21,0xa2,0x1b,0x30,0x53,0xf4,0xdc,0xfd,0x78,0x95,0xea,0x5f,0x6c,0x8a,0xa8,0x0d,},"\x97\x10\x95\xce\xbe\x50\x31\x53\x02\x24\x38\x7c\x5c\x31\x96\x6e\x38\x9b\x85\x66\x39\x00\x54\xcf\x45\x26\x4b\x44\xe1\x89\x64\xb7\xbe\x52\xc3\x3c\x4f\xfb\x25\x9a\xf1\x62\x83\x43\x8f\xa1\x5d\xd6\x6b\xc7\x79\x1b\x75\x33\xef\x10\xcb\x0b\xea\xb5\x24\xa6\x43\x76\x26\xf4\xcc\x74\x51\x28\x51\xad\xcc\x2f\xb1\x29\x05\x5a\x48\x2c\x61\x10\x73\x83\xfb\x7c\x52\x41\x83\x1d\x55\x51\x63\x4e\xef\x0d\xc0\xb8\xf9\x05\x3a\x00\x97\x1a\xa8\xfa\x1a\xe0\x89\x8e\x4b\x48\x1b\x67\x07\xe9\x7c\x0f\x94\x20\x40\xb3\x39\xd9\x2f\xc1\x7b\xba\xde\x74\x67\x5a\xf2\x43\xd8\xb2\xda\xfb\x15\xb1\xdb\x55\xd1\x24\x15\xb8\x5f\x30\x37\x29\x19\x30\xab\x61\x60\x0b\xa3\x43\x1f\x8e\xb4\x25\xbe\x44\x91\x61\x47\x28\xaf\x10\x1e\x81\xc0\x91\xf3\x48\xbc\x5f\xfd\x1b\xde\x6a\xe6\xca\xd5\xc1\x5b\x3a\xa7\x35\x80\x78\xcc\x4e\xff\xb5\x4a\x86\xe7\xf0\xe0\xc5\x5e\x4c\xfe\x0a\x54\x60\x5e\xd4\x43\xfd\xf2\xaa\xba\x01\x65\x85\xda\x61\x7e\x77\x34\x1d\x52\x88\x9d\x75\xdd\x54\x0d\x39\xfe\x8b\x79\x93\xed\x70\x5c\xfd\xde\xa0\xcb\x0d\x5a\x73\x1d\x6b\xfc\xdb\x81\x6a\xfa\xff\x47\xe9\x63\xee\xde\xbd\xf2\x41\xaf\x55\x93\x35\x3d\x6d\x40\x1a\x34\xf0\x29\xa8\xcd\xeb\x19\x04\xcc\x2c\xaa\x4f\x96\x35\xcc\x2b\xa6\xb7\xb1\xa2\x9d\xa6\x25\xff\xc3\x83\xbe\x2f\x5a\x8f\x1f\xa4\xf3\x9b\x2d\x4b\x4f\x4c\x2d\x88\x38\xce\x25\x8a\x04\xd4\xa1\x20\x49\x3f\xdf\x07\xf6\x8c\x0f\xfd\x1c\x16\xb7\x68\xa3\x5c\x55\xfe\xa2\xca\xc6\x96\xb5\xc2\x0e\xfc\x10\x86\x5c\xde\x8a\x64\x62\x7d\xcd"}, -{{0xfb,0xf1,0x46,0xeb,0xd5,0x10,0x75,0x57,0x0e,0xc5,0x1a,0xc4,0x10,0xae,0x9f,0x39,0x1d,0xb7,0x5b,0x61,0x0a,0xda,0x63,0x62,0xb4,0xdb,0xd9,0x49,0x65,0x6c,0xfb,0x66,},{0xbe,0x7c,0x2f,0x5b,0x21,0xd7,0x46,0xc8,0xea,0x32,0x45,0xce,0x6f,0x26,0x8e,0x9d,0xa7,0x4e,0x00,0xfa,0x85,0xc9,0xc4,0x75,0x26,0x0c,0x68,0xfa,0x1a,0xf6,0x36,0x1f,},{0x67,0x68,0x00,0x6f,0xe0,0xf2,0x01,0xb2,0x17,0xdd,0x10,0xeb,0x05,0xd4,0xb8,0x2a,0xdc,0xfe,0xb2,0xec,0xfc,0x83,0x73,0xc3,0x30,0x8f,0x41,0x50,0x39,0x48,0x11,0xeb,0x60,0x49,0x18,0x81,0xa2,0xe5,0x3d,0x12,0x89,0xd9,0x64,0x78,0xe1,0x8a,0x64,0xc3,0x4b,0x2a,0x19,0x83,0x2c,0xdc,0xcf,0xd9,0x6a,0x2e,0x4a,0x0c,0x46,0x9f,0xdc,0x0b,},"\xcd\x7a\xd4\xf1\x7f\xcf\xf7\x3a\xcc\x40\x2d\xc1\x02\xd0\x90\x79\xb2\x9a\xaf\x2a\x0f\x4b\x27\xcf\x6b\xee\xb1\xe2\xb2\x3d\x19\xab\x47\xde\xb3\xae\x1b\xec\xd6\x88\x61\xea\x27\x9c\x46\x69\x17\x38\xf4\xff\xf4\x7c\x43\x04\x7c\x4f\x8b\x56\xb6\xbb\xcc\x3f\xde\x07\x23\xd4\x41\x20\xdc\xd3\x07\xa6\x31\x0d\xc4\xf3\x66\xb8\xf3\xcd\x52\xdb\x19\xb8\x26\x6a\x48\x7f\x78\x72\x39\x1c\x45\xfe\x0d\x32\x48\xa7\xab\xf2\xc2\x00\x22\xd3\x76\x95\x47\xf6\x83\x06\x7d\xcc\x36\x3c\xd2\x2f\xd7\xcd\xa3\xca\xdc\x15\x80\x40\x56\xf0\xe2\xaa\x2b\x79\x50\x08\xc5\x98\xbe\x7a\x96\x18\x05\xe6\xdf\x29\x1b\xa3\x04\x1c\x47\xff\x56\x40\x27\x5f\x46\xe6\xae\x82\x09\x2d\x21\xab\xcb\xcf\xba\x11\xe7\x30\x21\x60\x08\x82\x2d\xe3\xce\x46\x24\x00\x59\x6d\xa7\x9f\x7a\xe5\xd1\xdf\x83\x89\x11\x2a\xd9\x88\x68\xfa\x94\xfb\x05\x46\xbf\xe6\xa6\x7a\xa8\xd2\x8c\x4d\x32\x07\x2d\x2e\xad\xd6\x25\x62\x55\xf1\x8c\x23\x82\xe6\x62\xdf\xa9\x22\xa6\x80\xe0\x6a\x43\x62\x2c\x48\x71\xd2\x7d\x18\x07\xf7\xb2\x70\x30\x70\xc8\x3d\xb8\xdd\x92\x9c\x06\x03\x8b\x21\x83\xcb\x8e\x2b\x9e\xc4\xc7\x78\xd7\xec\xf9\xe9\xff\xac\x77\xfa\x77\x37\xb0\x55\xfe\xac\x2e\x79\x82\xae\xee\xc0\xb7\x2f\x1b\xbc\xa2\x42\x4e\x1a\x84\x4b\xba\xc7\x9c\xb2\xe7\x40\x0f\x81\xdc\x44\x9d\x05\x60\xb5\x21\xa7\xc1\x6b\xb4\x16\x7e\x66\x96\x58\x60\x58\xa9\xb8\xed\x2e\x51\x16\x69\x0b\x77\xf2\xa1\x7e\x5c\x0b\x16\xa8\x3d\xcb\xd2\xe2\x45\x52\x29\x3e\x25\x8b\x32\xba\x7f\x84\x49\x44\x37\x93\x42\x69\x86\x27"}, -{{0xdf,0xf0,0xeb,0x6b,0x42,0x6d,0xea,0x2f,0xd3,0x3c,0x1d,0x3f,0xc2,0x4d,0xf9,0xb3,0x1b,0x48,0x6f,0xac,0xb7,0xed,0xb8,0x50,0x29,0x54,0xa3,0xe8,0xda,0x99,0xd9,0xfd,},{0xc2,0x45,0x08,0x5e,0xce,0x69,0xfb,0x9a,0xa5,0x60,0xd0,0xc2,0x7f,0xdb,0x63,0x4f,0x7a,0x84,0x0d,0x41,0xd8,0x46,0x36,0x60,0xfb,0xe8,0x24,0x83,0xb0,0xf3,0xcc,0x3a,},{0x6b,0x48,0xb1,0x0f,0x54,0x5d,0xdb,0x7a,0x89,0xcd,0x58,0x29,0xf4,0xe5,0xb2,0x01,0x46,0xcf,0x6b,0xc9,0x6e,0x55,0x0d,0x06,0xf6,0x5d,0xe8,0xbd,0xae,0x7c,0xcd,0xde,0xd2,0x6c,0xd6,0x30,0xf8,0x6c,0x92,0x66,0xbc,0xcf,0x88,0xe9,0x24,0x03,0x3e,0x04,0xf8,0x3a,0x54,0xf8,0x29,0x0d,0x7f,0x73,0x4c,0xf8,0x67,0x3c,0xca,0x8f,0x97,0x03,},"\xe7\xc9\xe3\x13\xd8\x61\x60\xf4\xc7\x4a\xa0\xae\x07\x36\x9e\xe2\x2b\x27\xf8\x1b\x3f\x69\x09\x7a\xff\xae\x28\xda\xe4\x84\x83\xfb\x52\xa5\xc0\x62\x30\x6b\x59\x61\x0f\x5c\xdb\xff\x63\x32\xb1\x96\x0c\xd6\xf2\xb8\xf7\xb4\x15\x78\xc2\x0f\x0b\xc9\x63\x7a\x0f\xdf\xc7\x39\xd6\x1f\x69\x9a\x57\x3f\x1c\x1a\x0b\x49\x29\x45\x06\xcf\x44\x87\x96\x5e\x5b\xb0\x7b\xbf\x81\x80\x3c\xb3\xd5\xcb\x38\x29\xc6\x6c\x4b\xee\x7f\xc8\x00\xed\xe2\x16\x15\x09\x34\xd2\x77\xde\xa5\x0e\xdb\x09\x7b\x99\x2f\x11\xbb\x66\x9f\xdf\x14\x0b\xf6\xae\x9f\xec\x46\xc3\xea\x32\xf8\x88\xfd\xe9\xd1\x54\xea\x84\xf0\x1c\x51\x26\x5a\x7d\x3f\xef\x6e\xef\xc1\xcc\xdb\xff\xd1\xe2\xc8\x97\xf0\x55\x46\xa3\xb1\xca\x11\xd9\x51\x7c\xd6\x67\xc6\x60\xec\x39\x60\xf7\xa8\xe5\xe8\x02\x02\xa7\x8d\x3a\x38\x8b\x92\xf5\xc1\xde\xe1\x4a\xe6\xac\xf8\xe1\x7c\x84\x1c\x95\x57\xc3\x5a\x2e\xec\xed\x6e\x6a\xf6\x37\x21\x48\xe4\x83\xcc\xd0\x6c\x8f\xe3\x44\x92\x4e\x10\x19\xfb\x91\xcb\xf7\x94\x1b\x9a\x17\x6a\x07\x34\x15\x86\x72\x10\x67\x04\x10\xc5\xdb\xd0\xac\x4a\x50\xe6\xc0\xa5\x09\xdd\xfd\xc5\x55\xf6\x0d\x69\x6d\x41\xc7\x7d\xb8\xe6\xc8\x4d\x51\x81\xf8\x72\x75\x5e\x64\xa7\x21\xb0\x61\xfc\xd6\x8c\x46\x3d\xb4\xd3\x2c\x9e\x01\xea\x50\x12\x67\xde\x22\x87\x9d\x7f\xc1\x2c\x8c\xa0\x37\x9e\xdb\x45\xab\xaa\x6e\x64\xdd\xa2\xaf\x6d\x40\xcc\xf2\x4f\xbe\xba\xd7\xb5\xa8\xd3\xe5\x20\x07\x94\x5e\xcd\x3d\xdc\x1e\x3e\xfe\xb5\x22\x58\x1a\xc8\x0e\x98\xc8\x63\xba\x0c\x59\x0a\x3e\xd9\x5c\xd1"}, -{{0x9f,0x32,0x95,0x8c,0x76,0x79,0xb9,0x0f,0xd5,0x03,0x60,0x56,0xa7,0x5e,0xc2,0xeb,0x2f,0x56,0xec,0x1e,0xff,0xc7,0xc0,0x12,0x46,0x1d,0xc8,0x9a,0x3a,0x16,0x74,0x20,},{0x1d,0x72,0x69,0xdc,0xb6,0xd1,0xf5,0x84,0xe6,0x62,0xd4,0xce,0x25,0x1d,0xe0,0xab,0xa2,0x90,0xef,0x78,0xb9,0x7d,0x44,0x8a,0xfb,0x1e,0x53,0x33,0xf1,0x97,0x6d,0x26,},{0x98,0x81,0xa5,0x76,0x3b,0xdb,0x25,0x9a,0x3f,0xef,0xbb,0xa3,0xd9,0x57,0x16,0x2d,0x6c,0x70,0xb8,0x04,0xfa,0x94,0xab,0x61,0x34,0x06,0xa6,0xec,0x42,0x50,0x5b,0x87,0x89,0x46,0x5c,0xa1,0xa9,0xa3,0x3e,0x18,0x95,0x98,0x88,0x42,0x27,0x0c,0x55,0xe5,0xbd,0xd5,0x48,0x3f,0x6b,0x17,0xb3,0x17,0x81,0xb5,0x93,0x50,0x7a,0x6c,0x18,0x08,},"\xa5\x6b\xa8\x6c\x71\x36\x05\x04\x08\x7e\x74\x5c\x41\x62\x70\x92\xad\x6b\x49\xa7\x1e\x9d\xaa\x56\x40\xe1\x04\x4b\xf0\x4d\x4f\x07\x1a\xd7\x28\x77\x9e\x95\xd1\xe2\x46\x05\x84\xe6\xf0\x77\x35\x45\xda\x82\xd4\x81\x4c\x91\x89\xa1\x20\xf1\x2f\x3e\x38\x19\x81\x3e\x5b\x24\x0d\x0f\x26\x43\x6f\x70\xee\x35\x3b\x4d\x20\xce\xa5\x4a\x14\x60\xb5\xb8\xf1\x00\x8d\x6f\x95\xf3\xaa\x2d\x8f\x1e\x90\x8f\xce\xd5\x0d\x62\x4e\x3a\x09\x69\x38\xb9\x35\x38\x54\xb9\x6d\xa4\x63\xa2\x79\x8a\x5a\x31\x2e\xc7\x90\x84\x2c\x10\xc4\x46\xe3\x35\x0c\x76\x4b\xf5\xc9\x72\x59\x3b\x99\x87\xbf\x23\x25\x6d\xaa\x88\x94\xd4\x7f\x22\xe8\x5b\x97\x60\x7e\x66\xfc\x08\xa1\x2c\x78\x9c\x47\x46\x08\x03\x68\xd3\x21\xbb\x90\x15\xa1\x15\x5b\x65\x52\x3a\xd8\xe9\x9b\xb9\x89\xb4\x4e\xac\x75\x6b\x07\x34\xac\xd7\xc6\x35\x7c\x70\xb5\x97\x43\x24\x6d\x16\x52\xd9\x1b\x0f\x98\x96\x96\x51\x41\x34\x5b\x99\x45\xcf\x34\x98\x04\x52\xf3\x50\x29\x74\xed\xb7\x6b\x9c\x78\x5f\xb0\xf4\x39\x52\x66\xb0\x55\xf3\xb5\xdb\x8a\xab\x68\xe9\xd7\x10\x2a\x1c\xd9\xee\x3d\x14\x25\x04\xf0\xe8\x8b\x28\x2e\x60\x3a\x73\x8e\x05\x1d\x98\xde\x05\xd1\xfc\xc6\x5b\x5f\x7e\x99\xc4\x11\x1c\xc0\xae\xc4\x89\xab\xd0\xec\xad\x31\x1b\xfc\x13\xe7\xd1\x65\x3b\x9c\x31\xe8\x1c\x99\x80\x37\xf9\x59\xd5\xcd\x98\x08\x35\xaa\x0e\x0b\x09\xbc\xbe\xd6\x34\x39\x11\x51\xda\x02\xbc\x01\xa3\x6c\x9a\x58\x00\xaf\xb9\x84\x16\x3a\x7b\xb8\x15\xed\xbc\x02\x26\xed\xa0\x59\x5c\x72\x4c\xa9\xb3\xf8\xa7\x11\x78\xf0\xd2\x0a\x5a"}, -{{0xf8,0x6d,0x6f,0x76,0x6f,0x88,0xb0,0x07,0x17,0xb7,0xd6,0x32,0x7e,0xb2,0x6c,0xf3,0xce,0xeb,0xa5,0x38,0x51,0x84,0x42,0x6f,0x9c,0xfd,0x82,0x95,0xe2,0x42,0x1f,0xf2,},{0xcb,0x1d,0x25,0x05,0x04,0x75,0x41,0x83,0x70,0x4d,0xbe,0x21,0xc3,0x23,0xd6,0x6f,0x9f,0x90,0x11,0x75,0x8f,0x6d,0x8d,0xab,0x6f,0x59,0x7b,0x19,0x96,0x62,0x14,0x5b,},{0xec,0x61,0xc0,0xb2,0x92,0x20,0x3a,0x8f,0x1d,0x87,0x23,0x5e,0xde,0x92,0xb7,0x47,0x23,0xc8,0xd2,0x34,0x08,0x42,0x37,0x73,0xae,0x50,0xb1,0xe9,0xbc,0x44,0x64,0xe0,0x3e,0x44,0x6d,0xa9,0xdc,0xe4,0xc3,0x9f,0x6d,0xd1,0x59,0xbe,0xa2,0x6c,0x00,0x9e,0xd0,0x01,0x20,0xbc,0x36,0xd4,0xa2,0x47,0xdc,0x0d,0x24,0xbc,0xef,0xcc,0x11,0x0c,},"\xda\x84\x23\xa6\xb7\xa1\x8f\x20\xaa\x1f\x90\xed\x23\x31\xb1\x7b\x24\x06\x7c\x40\x17\x5b\xc2\x5d\x81\x09\xe2\x1d\x87\xac\x00\x52\x8e\xb3\xb2\xf6\x6a\x2b\x52\xdc\x7e\xf2\xf8\xce\xcb\x75\xc7\x60\x99\xcf\xa2\x3d\xb8\xda\x89\x70\x43\xba\x1c\xce\x31\xe2\xdf\xea\x46\x07\x5f\x5e\x07\x32\x03\xea\xeb\x3d\x62\xc8\x4c\x10\x7b\x6d\xab\x33\xa1\x4e\xaf\x14\x9a\xa6\x18\x50\xc1\x5f\x5a\x58\xd8\x8a\x15\xab\xa9\x19\x6f\x9e\x49\x5e\x8d\xbe\xcb\xcf\x7e\x84\x44\xf5\xdd\x72\xa0\x8a\x09\x9d\x7f\x62\x09\x99\x0b\x56\x29\x74\xea\x82\x9e\xf1\x1d\x29\xa9\x20\xe3\xa7\x99\xd0\xd9\x2c\xb5\x0d\x50\xf8\x17\x63\x1a\xb0\x9d\xe9\x7c\x31\xe9\xa0\x5f\x4d\x78\xd6\x49\xfc\xd9\x3a\x83\x75\x20\x78\xab\x3b\xb0\xe1\x6c\x56\x4d\x4f\xb0\x7c\xa9\x23\xc0\x37\x4b\xa5\xbf\x1e\xea\x7e\x73\x66\x8e\x13\x50\x31\xfe\xaf\xcb\xb4\x7c\xbc\x2a\xe3\x0e\xc1\x6a\x39\xb9\xc3\x37\xe0\xa6\x2e\xec\xdd\x80\xc0\xb7\xa0\x49\x24\xac\x39\x72\xda\x4f\xa9\x29\x9c\x14\xb5\xa5\x3d\x37\xb0\x8b\xf0\x22\x68\xb3\xba\xc9\xea\x93\x55\x09\x0e\xeb\x04\xad\x87\xbe\xe0\x59\x3b\xa4\xe4\x44\x3d\xda\x38\xa9\x7a\xfb\xf2\xdb\x99\x52\xdf\x63\xf1\x78\xf3\xb4\xc5\x2b\xcc\x13\x2b\xe8\xd9\xe2\x68\x81\x21\x3a\xbd\xeb\x7e\x1c\x44\xc4\x06\x15\x48\x90\x9f\x05\x20\xf0\xdd\x75\x20\xfc\x40\x8e\xa2\x8c\x2c\xeb\xc0\xf5\x30\x63\xa2\xd3\x05\x70\xe0\x53\x50\xe5\x2b\x39\x0d\xd9\xb6\x76\x62\x98\x48\x47\xbe\x9a\xd9\xb4\xcd\x50\xb0\x69\xff\xd2\x9d\xd9\xc6\x2e\xf1\x47\x01\xf8\xd0\x12\xa4\xa7\x0c\x84\x31\xcc"}, -{{0xa5,0xb3,0x4c,0xef,0xab,0x94,0x79,0xdf,0x83,0x89,0xd7,0xe6,0xf6,0xc1,0x46,0xaa,0x8a,0xff,0xb0,0xbe,0xc8,0x37,0xf7,0x8a,0xf6,0x46,0x24,0xa1,0x45,0xcc,0x34,0x4e,},{0x7b,0x0f,0x4f,0x24,0xd9,0x97,0x2b,0xc6,0xfe,0x83,0x82,0x6c,0x52,0x71,0x6a,0xd1,0xe0,0xd7,0xd1,0x9f,0x12,0x38,0x58,0xcb,0x3e,0x99,0xfa,0x63,0x6a,0xc9,0x63,0x1a,},{0x2f,0xbd,0x89,0x9d,0x72,0xb6,0xd3,0x9e,0x4f,0x45,0xb8,0xb6,0x2c,0xbb,0xd5,0xf3,0xc0,0xac,0xb1,0xad,0x85,0x40,0x91,0x3f,0xa5,0x85,0x87,0x7e,0x91,0xcc,0xfe,0xf7,0xbe,0xe5,0x0a,0x4b,0x0f,0x9f,0xed,0xf5,0xcc,0x1e,0x0d,0x19,0x53,0xad,0x39,0x9c,0x83,0x89,0xa9,0x33,0x91,0xe1,0xb7,0xc9,0x29,0xaf,0x6d,0x6f,0x3b,0x79,0x6c,0x08,},"\xe2\x1e\x98\xaf\x6c\x2b\xac\x70\x55\x7e\xb0\xe8\x64\xda\x2c\x2b\x4d\x6c\x0a\x39\xa0\x59\xd3\x47\x72\x51\xf6\x17\x8a\x39\x67\x6f\x47\x49\xe7\xfb\xea\x62\x3f\x14\x8a\x43\xa8\xb0\xfe\x06\x10\x50\x6f\xa6\x58\xab\xd2\xf5\xfa\x39\x19\x8f\x26\x36\xb7\x24\xdb\x22\xd1\xae\xbc\x2a\xb0\x7b\x2b\x6d\xbf\xfd\xee\x8c\xec\xe8\x1e\x1a\xf1\x49\x3e\xc1\x96\x4e\x16\xbf\x86\xab\x25\x8c\xa0\xfe\xb7\x7e\x3c\x87\x17\xe4\x40\x38\xab\xe1\x52\xc1\x4b\xe1\x56\x60\xbf\x93\xb2\xd4\x8d\x92\xc4\xed\x70\x74\xd2\x49\x42\x10\x62\x1b\xcf\x20\x4f\xba\x88\xc6\x54\xd5\xff\xe0\x1e\x1a\x53\xd0\x8f\x70\xbb\x23\x70\x89\xdc\x80\x72\x16\xff\x6a\x85\xdb\xec\x31\x02\x23\x7d\x42\x59\x07\x78\xac\xf6\xc1\xdc\x56\x6d\x5a\x2b\xb9\xa6\x3b\xc2\x1c\x32\x9c\x27\x2e\x59\x65\xba\xee\xb0\xfe\x89\x1d\xe3\xcc\x8c\xbf\xa8\xe5\x41\xa8\x88\x1d\xf6\x89\x42\xe7\xff\x8d\xc6\x56\xbd\x08\x57\x5f\x6a\xaf\x92\x4a\x17\x6d\x66\x3b\x1a\x1f\x43\x57\x4d\x11\x76\x8c\x70\x1b\x26\x95\x61\xe5\x54\x38\xdb\xeb\xfd\x44\x3d\x21\x15\xcb\x93\x3d\x1c\xde\x4a\x91\x5b\x54\xc3\x25\xc2\x7f\x49\x9e\xf0\x2b\xd0\x12\xff\x1f\x9a\x36\x39\x09\x22\x88\x76\x00\xfe\x71\x2b\xcd\xc2\x3e\xb5\x97\x4a\x30\x53\x72\xad\x52\x95\x1f\x83\xf0\xe5\x8c\xc4\x9e\x28\x98\x41\x62\x19\x17\xf1\xfc\xb0\x23\x51\x47\x24\x0d\xae\x4c\xf3\xb9\x9b\x6a\xc6\xd8\xde\x94\xef\xe7\xc4\x43\x67\x14\x50\x8b\xcd\x01\x14\xc5\x60\x68\xff\x1b\x7c\x16\xd5\x1b\xd9\x06\x43\x78\x74\xd6\x54\x9a\xb5\xd8\x08\x78\x96\x87\x2e\xc8\xa0\x9d\x74\x12"}, -{{0xad,0x75,0xc9,0xce,0x29,0x9c,0x4d,0x59,0x39,0x33,0x67,0xd7,0x7a,0x4c,0x9f,0x8d,0xf8,0xdc,0xec,0x76,0x5c,0x6d,0xbd,0x25,0xb5,0x27,0xfb,0x76,0x69,0x91,0x36,0x04,},{0xb9,0x91,0x05,0x48,0xfe,0x63,0x12,0xa1,0x19,0xc9,0x99,0x3e,0xeb,0xcf,0xb9,0xdc,0x90,0x03,0x0f,0xfb,0x0e,0x4d,0xe2,0xb7,0xcc,0xd2,0x3c,0xbe,0xb4,0xfe,0xf7,0x1b,},{0x6b,0x7e,0xf2,0x7b,0xcf,0xbf,0x2b,0x71,0x49,0x85,0x03,0x37,0x64,0xfc,0xcf,0xf5,0x55,0xe3,0xf5,0xbc,0x44,0x61,0x0d,0x6c,0x8c,0x62,0x11,0x7c,0xb3,0x83,0x1a,0x07,0xf4,0xa8,0xbd,0xdb,0x0e,0xae,0xd1,0xd4,0x6b,0x02,0x89,0xb1,0x5d,0xe1,0xaa,0x4d,0xcc,0x17,0xd7,0x1b,0xe9,0x6a,0x09,0xe6,0x6b,0xa4,0xdc,0x46,0x27,0xc7,0x87,0x05,},"\x62\xfc\x5a\xb6\x7d\xeb\x1f\xee\x9a\xb6\xcc\xa3\xb8\x8a\x1d\xf1\xe5\x89\xf0\xfd\x4a\x88\xf4\xaa\x77\x38\x94\x87\x61\xfe\x84\x37\x2c\x5b\x18\xe4\x65\x52\x20\xc1\xd8\x4d\x52\xac\xad\x32\xe2\x29\xa5\xc7\x56\xc2\x0f\xc6\x2f\xe4\xb4\xb4\xe5\xfd\x70\x77\xae\x4e\xd5\x39\x7a\xa7\x96\xf2\x30\x7c\xee\xdb\x65\x05\xb3\x92\x97\x85\x6f\x4a\xeb\x5e\x70\x93\x8e\x36\xee\x24\xa0\xac\x7d\x98\x68\x30\x6f\x6b\x53\x91\x06\x23\xb7\xdc\x89\xa6\x67\x2a\xd7\x38\x57\x6e\xd5\xd8\x88\x31\xdd\x33\x83\x21\xc8\x90\x2b\xc2\x06\x1f\x65\xe9\x4d\x45\x2f\xdf\xa0\xdc\x66\x5c\xef\xb9\x23\x08\xe5\x23\x01\xbd\x46\x27\x00\x6b\x36\x3d\x06\xb7\x75\xa3\x95\x91\x4d\x8c\x86\x3e\x95\xa0\x0d\x68\x93\xf3\x37\x61\x34\xc4\x29\xf5\x64\x78\x14\x5e\x44\x56\xf7\xa1\x2d\x65\xbb\x2b\x89\x65\xd7\x28\xcb\x2d\xdb\xb7\x08\xf7\x12\x5c\x23\x70\x95\xa9\x21\x95\xd9\x2f\xa7\x27\xa3\x72\xf3\x54\x5a\xe7\x01\xf3\x80\x8f\xee\x80\x2c\x89\x67\xa7\x6e\x8a\x94\x0e\x55\xfb\x2d\x81\x0b\xfb\x47\xad\xa1\x56\xf0\xed\xa1\x82\x9b\x15\x9c\xf0\x5c\x7f\x36\xcf\x38\x47\xd7\xb2\x1d\xe8\x4c\x3d\xc0\xfe\x65\x83\x47\xf7\x93\x96\xa0\x11\x39\xa5\x08\xb6\x00\x22\xdb\x1c\x0e\x5a\xee\xf4\x7e\x44\x5e\x66\xf7\x83\xe6\x2c\x96\x59\x7b\xdb\x16\xf2\x09\xc0\x8a\x91\x32\xc7\x57\x31\x36\x17\x0e\xe3\xeb\xf2\x42\x61\x26\x5a\x89\xfb\x4f\x10\x33\x33\x75\xe2\x0b\x33\xab\x74\x03\x46\x4f\x52\x49\x46\x1c\x68\x53\xc5\xfd\xdb\x9f\x58\xaf\x81\x68\x92\x91\x03\x93\xa7\x07\x7b\x79\x9f\xdc\x34\x89\x72\x09\x98\xfe\xea\x86"}, -{{0x1c,0xed,0x57,0x45,0x29,0xb9,0xb4,0x16,0x97,0x7e,0x92,0xeb,0x39,0x44,0x8a,0x87,0x17,0xca,0xc2,0x93,0x4a,0x24,0x3a,0x5c,0x44,0xfb,0x44,0xb7,0x3c,0xcc,0x16,0xda,},{0x85,0xe1,0x67,0xd5,0xf0,0x62,0xfe,0xe8,0x20,0x14,0xf3,0xc8,0xb1,0xbe,0xae,0xd8,0xee,0xfb,0x2c,0x22,0xd8,0x64,0x9c,0x42,0x4b,0x86,0xb2,0x1b,0x11,0xeb,0x8b,0xda,},{0xe0,0x30,0x3a,0xef,0xe0,0x8a,0x77,0x73,0x8d,0xcc,0x65,0x7a,0xfb,0xb9,0xb8,0x35,0xed,0x27,0x96,0x13,0xa5,0x3c,0x73,0xfd,0xc5,0xdd,0xbf,0xb3,0x50,0xe5,0xcf,0xf4,0xd6,0xc9,0xbb,0x43,0xdc,0x07,0xc9,0x5b,0xf4,0xe2,0x3b,0x64,0xc4,0x0f,0x88,0x04,0xc7,0x16,0x99,0x52,0xe3,0xc8,0xd5,0x9a,0x71,0x97,0x24,0x1b,0xfe,0xd0,0x74,0x0f,},"\x1b\x3b\x95\x3c\xce\x6d\x15\x30\x3c\x61\xca\x70\x76\x09\xf7\x0e\x72\x50\xf6\xc0\xde\xba\x56\xa8\xce\x52\x2b\x59\x86\x68\x96\x51\xcd\xb8\x48\xb8\x42\xb2\x22\x96\x61\xb8\xee\xab\xfb\x85\x70\x74\x9e\xd6\xc2\xb1\x0a\x8f\xbf\x51\x50\x53\xb5\xea\x7d\x7a\x92\x28\x34\x9e\x46\x46\xf9\x50\x5e\x19\x80\x29\xfe\xc9\xce\x0f\x38\xe4\xe0\xca\x73\x62\x58\x42\xd6\x4c\xaf\x8c\xed\x07\x0a\x6e\x29\xc7\x43\x58\x6a\xa3\xdb\x6d\x82\x99\x3a\xc7\x1f\xd3\x8b\x78\x31\x62\xd8\xfe\x04\xff\xd0\xfa\x5c\xbc\x38\x1d\x0e\x21\x9c\x91\x93\x7d\xf6\xc9\x73\x91\x2f\xc0\x2f\xda\x53\x77\x31\x24\x68\x27\x4c\x4b\xee\x6d\xca\x7f\x79\xc8\xb5\x44\x86\x1e\xd5\xba\xbc\xf5\xc5\x0e\x14\x73\x49\x1b\xe0\x17\x08\xac\x7c\x9f\xf5\x8f\x1e\x40\xf8\x55\x49\x7c\xe9\xd7\xcc\x47\xb9\x41\x0f\x2e\xdd\x00\xf6\x49\x67\x40\x24\x3b\x8d\x03\xb2\xf5\xfa\x74\x2b\x9c\x63\x08\x67\xf7\x7a\xc4\x2f\x2b\x62\xc1\x4e\x5e\xbd\xdc\x7b\x64\x7a\x05\xff\xf4\x36\x70\x74\x5f\x28\x51\xef\xf4\x90\x9f\x5d\x27\xd5\x7a\xe8\x7f\x61\xe9\x65\xee\x60\xfd\xf9\x77\x24\xc5\x92\x67\xf2\x61\x0b\x7a\xd5\xde\x91\x98\x56\xd6\x4d\x7c\x21\x26\x59\xce\x86\x56\x14\x9b\x6a\x6d\x29\xd8\xf9\x2b\x31\x2b\xe5\x0b\x6e\x2a\x43\x1d\x36\xae\x02\x2b\x00\xa6\xfe\x36\x0e\x3a\xf6\x54\x32\x89\x9c\x43\xbe\x04\x27\xe3\x6d\x21\xcf\xec\x81\xf2\x1a\xa5\x3b\x33\xdb\x5e\xd2\xc3\x7d\xa8\xf9\x6a\xc3\xe7\xdc\x67\xa1\xde\x37\x54\x6c\xf7\xde\x10\x08\xc7\xe1\xad\xbe\x0f\x34\xfa\x7e\xb2\x43\x4d\x94\xe6\xa1\x3f\x4c\xf8\x6a\x98\xd4\x97\x62\x2f"}, -{{0xf0,0x79,0x0d,0x93,0xe2,0xd3,0xb8,0x4f,0x61,0xef,0x4c,0x80,0x71,0x47,0xab,0xa4,0x10,0xe4,0x15,0xe7,0x2b,0x71,0xb0,0xd6,0x1d,0x01,0x02,0x6f,0xed,0x99,0xda,0x3d,},{0xef,0xdf,0x64,0x9f,0xb0,0x33,0xcf,0x32,0x8e,0x0b,0x28,0x77,0x96,0xf8,0xa2,0x5e,0x9c,0x6e,0x2e,0x87,0x1b,0x33,0xc2,0xc2,0x1a,0x40,0x28,0xa8,0xa2,0x5a,0x4b,0x28,},{0x08,0x77,0x3a,0x6a,0x78,0x76,0x2c,0xbb,0x1e,0x25,0xfc,0xbb,0x29,0x13,0x99,0x41,0xbd,0xf1,0x6f,0x4e,0x09,0xa1,0xfa,0x08,0xfc,0x70,0x1f,0x32,0xf9,0x33,0xed,0xd7,0x4c,0x0a,0xe9,0x83,0xc1,0x2a,0x0a,0x5b,0x02,0x0b,0x6b,0xcf,0x44,0xbb,0x71,0x9d,0xde,0x8e,0xd0,0x78,0x1a,0x82,0x98,0x26,0x56,0x40,0xe1,0x60,0x8c,0x98,0xb3,0x01,},"\x79\x73\xe9\xf3\x2d\x74\x80\x59\x92\xeb\x65\xda\x0d\x63\x73\x35\xe5\x0e\xff\x0c\xe6\x8e\xa2\xd1\xf3\xa0\x2d\xe7\x04\x49\x2b\x9c\xfb\xe7\xe7\xba\x96\xfd\xb4\x2b\xb8\x21\xa5\x13\xd7\x3f\xc6\x04\x02\xe9\x2c\x85\x5d\xea\xed\x73\xff\xea\xf7\x09\x52\x02\x90\x62\xc8\x33\xe1\x4e\xc1\xb1\x4f\x14\x4e\x22\x07\xf6\xa0\xe7\x27\xe5\xa7\xe3\xcb\xab\x27\xd5\x97\x29\x70\xf6\x95\x18\xa1\x5b\x09\x3e\x74\x0c\xc0\xce\x11\xbf\x52\x48\xf0\x82\x6b\x8a\x98\xbd\xe8\xbf\x2c\x70\x82\xc9\x7a\xff\x15\x8d\x08\x37\x11\x18\xc8\x90\x21\xcc\x39\x74\xae\x8f\x76\xd8\x66\x73\xc3\xf8\x24\xb6\x2c\x79\xc4\xb4\x1f\x40\xea\xa8\x94\x37\x38\xf0\x33\x00\xf6\x8c\xbe\x17\x54\x68\xeb\x23\x5a\x9f\xf0\xe6\x53\x7f\x87\x14\xe9\x7e\x8f\x08\xca\x44\x4e\x41\x19\x10\x63\xb5\xfa\xbd\x15\x6e\x85\xdc\xf6\x66\x06\xb8\x1d\xad\x4a\x95\x06\x55\x84\xb3\xe0\x65\x8c\x20\xa7\x06\xea\xf4\xa0\x77\x7d\xa4\xd2\xe0\xcd\x2a\x0f\xca\x60\x10\x9c\x2b\x44\x03\xdb\x3f\x03\xcd\x47\x81\xc1\xfb\xb0\x27\x22\x02\xbc\xb1\x16\x87\x80\x8c\x50\xcb\x98\xf6\x4b\x7f\x3f\xd3\xd4\x33\x33\xbb\x5a\x06\x1b\x9e\x37\x70\x90\xab\xb1\xe0\xa8\x85\xcb\x26\xb7\x3c\x16\x3e\x63\xff\x64\x51\xff\x2f\x4e\xc8\x24\x9c\x7e\x15\x2b\xd0\x39\x73\xa1\xe9\x64\xe2\xb5\xb2\x35\x28\x1a\x93\x83\x99\xa1\x12\xa2\x45\x29\xe3\x83\xa5\x60\xdc\x50\xbb\x1b\x62\x2a\xd7\x4e\xf3\x56\x58\xdc\xb1\x0f\xfe\x02\x25\x68\xac\x3f\xfa\xe5\xb4\x65\xa8\xed\x76\x43\xe8\x56\x1b\x35\x2e\xe9\x94\x4a\x35\xd8\x82\xc7\x12\xb1\x87\x78\x8a\x0a\xba\xe5\xa2\x2f"}, -{{0x4c,0xb9,0xdf,0x7c,0xe6,0xfa,0xe9,0xd6,0x2b,0xa0,0x9e,0x8e,0xb7,0x0e,0x4c,0x96,0x9b,0xde,0xaf,0xcb,0x5e,0xc7,0xd7,0x02,0x43,0x26,0xe6,0x60,0x3b,0x06,0x21,0xbf,},{0x01,0x80,0x69,0xdd,0x0e,0xb4,0x40,0x55,0xa3,0x5c,0xd8,0xc7,0x7c,0x37,0xca,0x9f,0xb1,0xad,0x24,0x17,0x27,0x13,0x85,0xe1,0x34,0xb2,0xf4,0xe8,0x1f,0x52,0x03,0x3c,},{0xe3,0x3c,0x07,0x83,0x6c,0x53,0x7d,0x6b,0xfb,0xd0,0xf4,0x59,0x2d,0x6e,0x35,0xb1,0x63,0x49,0x9b,0xa7,0x8d,0xc7,0xff,0xce,0xc5,0x65,0xd0,0x4f,0x9a,0x7d,0xb7,0x81,0x94,0x3e,0x29,0xe6,0xce,0x76,0x76,0x3e,0x9b,0xad,0xdf,0x57,0x43,0x7f,0xd9,0xc6,0xb0,0x32,0x39,0xa6,0xe6,0x85,0x0e,0x45,0x02,0xa3,0x56,0xc2,0xe1,0x2c,0x37,0x05,},"\x14\x62\x7d\x6e\xa0\xe7\x89\x54\x60\x75\x94\x76\xdc\x74\xc4\x28\x00\xce\xef\x99\x43\x27\x51\x81\x51\x49\x0d\x9d\xf2\x30\x67\x91\x4e\x44\x78\x8a\x12\x76\x8c\xcb\x25\x47\x1b\x9c\x3b\xa9\xd1\x4f\xb4\x36\xdc\xba\x38\x42\x9b\x3a\x04\x56\x87\x77\x63\xc4\x91\x75\xd0\xe0\x82\x68\x3e\x07\xa9\x05\x8f\x36\x85\xc6\x27\x93\x07\xb2\x30\x3d\x12\x21\xb9\xc2\x97\x93\xd8\xa4\x87\x7f\x6d\xf5\x15\x87\x38\x4d\xad\xf7\x51\xc5\xf7\xbf\xbd\x20\x7d\x51\x96\x22\xc3\x7b\x51\xce\xee\xe2\xc2\x0d\x82\x69\xf8\xcb\x88\xd3\xfe\x43\xd6\xd4\x34\xd5\xbb\xd0\xe2\x03\xc1\x53\x2d\x97\xba\x55\x21\x47\x22\x74\x96\xc8\x7f\x67\xb5\x0b\xb7\x61\x93\xad\xd0\x14\x4d\xf1\xc1\x76\x65\x75\x85\x40\x83\x62\xca\x2e\xd0\x4a\xd6\x2a\xcf\x1c\x25\xe3\x41\xdf\xd1\x49\x8d\x85\xb4\xb1\x34\x9a\x8b\x0b\x9b\x02\xc4\x35\x23\xc5\x58\x53\x41\x9b\xfe\xd3\x7d\x5a\x2c\xdf\x17\xdf\xbf\x1a\x3b\xd7\x75\x9d\x6a\xe1\x80\xf9\xd2\x7d\xcd\x9a\x89\x33\xe2\x9a\x7c\x0a\x30\x77\x1e\xea\x7c\x2e\x0f\xa2\x42\x92\x5d\x23\x36\xdc\xe5\x85\x62\x90\x57\xd8\x44\x32\x39\x64\xf6\xd3\xd1\x1f\xf0\xb3\xf8\x29\xa3\xbe\x8c\x9f\x04\x68\xa6\x82\x3d\x8e\x70\xab\x5a\x2d\xa2\x1e\x15\xfa\x8b\x04\x1a\x29\x81\x22\x22\xe9\xc3\x0b\x2b\xd9\xa1\x2d\x1f\xde\xe6\xf8\x78\x76\xe8\xce\x81\x00\x96\x37\xa8\xbb\x22\x36\x12\x9a\x47\xca\x74\x28\x9e\xe4\xaa\xd4\x29\xff\xe2\x9f\x47\x43\x02\x41\xca\x8c\xc3\x84\x8b\x72\x00\xfd\x6e\x14\x70\x65\x1a\x9a\x0a\x6f\x72\xc9\x03\x3e\x83\x1d\xf0\x51\x40\x8a\x62\x60\xf6\x5c\xba\xf6\xe0\x12\xb1\x8e"}, -{{0xa1,0x36,0xe0,0x09,0xd5,0x3e,0x5e,0xf5,0x9d,0x09,0x46,0xbc,0x17,0x56,0x63,0xa8,0x6b,0xc0,0xfc,0xd2,0x9e,0xad,0xd9,0x5c,0xfc,0x9d,0x26,0x60,0x37,0xb1,0xe4,0xfb,},{0x9c,0x18,0x06,0xec,0x04,0x54,0xf5,0x83,0x14,0xeb,0x83,0x97,0xd6,0x42,0x87,0xde,0xe3,0x86,0x64,0x0d,0x84,0x91,0xab,0xa3,0x64,0x60,0x76,0x88,0x84,0x17,0x15,0xa0,},{0xbc,0x09,0x4b,0xa9,0x1c,0x11,0x5d,0xee,0x15,0xd7,0x53,0x36,0x1a,0x75,0xf3,0xf0,0x3d,0x6a,0xf4,0x5c,0x92,0x15,0x7e,0x95,0xdb,0xe8,0xd3,0x21,0x94,0xb6,0xc5,0xce,0x72,0xb9,0xdc,0x66,0xf7,0x3d,0xf1,0x2d,0xca,0x0b,0x63,0x9f,0x3e,0x79,0x1d,0x47,0x86,0x16,0xa1,0xf8,0xd7,0x35,0x9a,0x42,0xc8,0xea,0xe0,0xdd,0xa1,0x6b,0x16,0x06,},"\xa4\x9d\x1c\x3d\x49\xe1\x3c\x2e\xda\x56\x86\x8a\x88\x24\xaa\x9f\x8d\x2b\xf7\x2f\x21\x95\x5e\xba\xfd\x07\xb3\xbd\xc8\xe9\x24\xde\x20\x93\x6c\xee\x51\x3d\x8a\x64\xa4\x71\x73\xa3\xbd\x65\x9e\xff\x1a\xcc\xff\x82\x44\xb2\x6a\xae\x1a\x0c\x27\xfa\x89\x1b\xf4\xd8\x5e\x8f\xb1\xb7\x6a\x6c\xab\x1e\x7f\x74\xc8\x9e\xe0\x7b\xb4\x0d\x71\x43\x26\xf0\x9b\x3f\xd4\x06\x32\xfa\xd2\x08\xea\x81\x6f\x90\x72\x02\x8c\x14\xb5\xb5\x4e\xcc\x1c\x5b\x7f\xc8\x09\xe7\xe0\x78\x6e\x2f\x11\x49\x5e\x76\x01\x7e\xb6\x2a\xa4\x56\x3f\x3d\x00\xee\x84\x34\x8d\x98\x38\xcd\x17\x64\x9f\x69\x29\xa6\xd2\x06\xf6\x0e\x6f\xc8\x2e\x0c\x34\x64\xb2\x7e\x0e\x6a\xbd\x22\xf4\x46\x9b\xdf\xd4\xcb\x54\xf7\x7e\x32\x9b\x80\xf7\x1b\xf4\x21\x29\xec\x13\xc9\xdf\xe1\x92\xad\xfa\xa4\x2e\xe3\xdd\xee\xda\x38\x58\x16\xfb\xad\x5f\x41\x19\x38\xc6\x3b\x56\x0f\x4e\xcd\x94\x53\x4b\xe7\xd9\x87\x25\xcd\x94\xc9\x9c\xe4\x92\xf0\xf0\x69\xba\x0e\xc0\x8f\x87\x7a\x78\x12\xef\x27\xae\x19\xd7\xa7\x7b\xe6\x3f\x66\xbc\xf8\xd6\xcf\x3a\x1a\x61\xfc\x9c\xfe\xf1\x04\xc7\x46\x2a\x21\xca\x7f\x03\xaf\xb5\xbb\x1a\xc8\xc7\x51\x24\xb5\x54\xe8\xd0\x44\xb8\x10\xd9\x5f\xf8\xc9\xdd\x09\xa3\x44\x84\xd8\xc4\xb6\xc9\x5f\x95\xc3\xc2\x28\x23\xf5\x2c\xe8\x44\x29\x37\x24\xd5\x25\x91\x91\xf1\xba\x09\x29\xe2\xac\xdb\xb8\xb9\xa7\xa8\xad\xf0\xc5\x2e\x78\xac\xdf\xdf\x05\x7b\x09\x85\x88\x1a\xfb\xed\x4d\xbe\xbd\xeb\xbd\xae\x0a\x2b\x63\xbd\x4e\x90\xf9\x6a\xfd\xcb\xbd\x78\xf5\x06\x30\x9f\x9b\xdb\x65\x00\x13\xcb\x73\xfa\xed\x73\x90\x4e"}, -{{0xff,0x0f,0x1c,0x57,0xdd,0x88,0x4f,0xbe,0xea,0x6e,0x29,0x17,0x28,0x2b,0x79,0xba,0x67,0xf8,0xa6,0x85,0x12,0x67,0xb9,0xf4,0x63,0x6d,0xaf,0xda,0x33,0xbd,0x2b,0x5b,},{0xfe,0xf6,0x37,0x8a,0xd1,0x2a,0x7c,0x25,0x2f,0xa6,0xeb,0x74,0x2b,0x05,0x06,0x4b,0x41,0x53,0x0f,0xf0,0x19,0xdc,0x68,0x0a,0xb5,0x44,0xc0,0x27,0xea,0x28,0x36,0xe7,},{0xd5,0x00,0x84,0x86,0x72,0x6c,0xce,0x33,0x0a,0x29,0xdd,0x7e,0x4d,0x74,0x74,0xd7,0x35,0x79,0x82,0x01,0xaf,0xd1,0x20,0x6f,0xeb,0x86,0x9a,0x11,0x2e,0x5b,0x43,0x52,0x3c,0x06,0x97,0x67,0x61,0xbe,0x3c,0xf9,0xb2,0x71,0x63,0x78,0x27,0x3c,0x94,0xf9,0x35,0x72,0xa7,0xd2,0xb8,0x98,0x26,0x34,0xe0,0x75,0x5c,0x63,0x2b,0x44,0x90,0x08,},"\x52\x2a\x5e\x5e\xff\x5b\x5e\x98\xfa\xd6\x87\x8a\x9d\x72\xdf\x6e\xb3\x18\x62\x26\x10\xa1\xe1\xa4\x81\x83\xf5\x59\x0e\xce\xf5\xa6\xdf\x67\x1b\x28\xbe\x91\xc8\x8c\xdf\x7a\xe2\x88\x11\x47\xfe\x6c\x37\xc2\x8b\x43\xf6\x4c\xf9\x81\xc4\x55\xc5\x9e\x76\x5c\xe9\x4e\x1b\x64\x91\x63\x1d\xea\xee\xf6\xd1\xda\x9e\xbc\xa8\x86\x43\xc7\x7f\x83\xea\xe2\xcf\xdd\x2d\x97\xf6\x04\xfe\x45\x08\x1d\x1b\xe5\xc4\xae\x2d\x87\x59\x96\xb8\xb6\xfe\xcd\x70\x7d\x3f\xa2\x19\xa9\x3b\xa0\x48\x8e\x55\x24\x7b\x40\x5e\x33\x0c\xfb\x97\xd3\x1a\x13\x61\xc9\xb2\x08\x4b\xdb\x13\xfb\x0c\x05\x89\x25\xdb\x8c\x3c\x64\x9c\x9a\x3e\x93\x7b\x53\x3c\xc6\x31\x0f\xa3\xb1\x61\x26\xfb\x3c\xc9\xbb\x2b\x35\xc5\xc8\x30\x00\x15\x48\x8a\x30\xfa\xdc\xa3\xc8\x87\x1f\xa7\x0d\xfd\xc7\x05\x5b\xf8\xe6\x31\xf2\x0c\x9b\x25\x28\x31\x1e\x32\x4a\x7c\x4e\xdd\x54\x62\x07\x9f\x34\x41\xc9\xec\xf5\x5f\xa9\x99\xe7\x31\x37\x23\x44\xfd\xc0\xd4\x13\xe4\x17\xaa\xa0\x01\xa1\xb2\xd3\xd9\xbc\x00\x0f\xec\x1b\x02\xbd\x7a\x88\xa8\x12\xd9\xd8\xa6\x6f\x94\x64\x76\x4c\x07\x0c\x93\x04\x1e\xef\xb1\x7c\xe7\x4e\xff\x6d\x4a\xff\x75\xf0\xcb\xf6\xa7\x89\xa9\xec\xde\x74\xab\xe3\x31\x30\xfc\xa0\xda\x85\x3a\xa7\xc3\x31\x3a\xda\x3f\x0a\xe2\xf5\x95\xc6\x79\x6a\x93\x68\x5e\x72\x9d\xd1\x8a\x66\x9d\x63\x81\x82\x5a\xb3\xf3\x6a\x39\x1e\x75\x25\xb2\xa8\x07\xa5\x2f\xa5\xec\x2a\x03\x0a\x8c\xf3\xb7\x73\x37\xac\x41\xfc\xeb\x58\x0e\x84\x5e\xed\x65\x5a\x48\xb5\x47\x23\x8c\x2e\x81\x37\xc9\x2f\x8c\x27\xe5\x85\xca\xad\x31\x06\xee\xe3\x81\x4a"}, -{{0x0b,0xc6,0xaf,0x64,0xde,0x57,0x09,0xd3,0xdb,0xc2,0x8f,0x7e,0xf6,0xd3,0xfe,0x28,0xb6,0xde,0x52,0x9f,0x08,0xf5,0x85,0x7c,0xcb,0x91,0x06,0x95,0xde,0x45,0x4f,0x56,},{0xfb,0x49,0x1f,0xc9,0x00,0x23,0x7b,0xdc,0x7e,0x9a,0x11,0x9f,0x27,0x15,0x0c,0xd9,0x11,0x93,0x5c,0xd3,0x62,0x87,0x49,0xff,0x40,0xef,0x41,0xf3,0x95,0x5b,0xc8,0xac,},{0xdb,0xc7,0x13,0x4d,0x1c,0xd6,0xb0,0x81,0x3b,0x53,0x35,0x27,0x14,0xb6,0xdf,0x93,0x94,0x98,0xe9,0x1c,0xf3,0x7c,0x32,0x43,0x37,0xd9,0xc0,0x88,0xa1,0xb9,0x98,0x34,0x7d,0x26,0x18,0x5b,0x43,0x09,0x00,0x41,0x29,0x29,0xe4,0xf6,0x3e,0x91,0x03,0x79,0xfc,0x42,0xe3,0x55,0xa4,0xe9,0x8f,0x6f,0xee,0x27,0xda,0xfa,0xd1,0x95,0x72,0x06,},"\xac\x78\x86\xe4\xf4\x17\x2a\x22\xc9\x5e\x8e\xea\x37\x43\x7b\x37\x5d\x72\xac\xce\xdc\xee\x6c\xc6\xe8\x16\x76\x33\x01\xa2\xd8\xef\x4d\x6f\x31\xa2\xc1\xd6\x35\x81\x8b\x70\x26\xa3\x95\xce\x0d\xaf\xd7\x1c\x51\x80\x89\x3a\xf7\x6b\x7e\xa0\x56\xc9\x72\xd6\x80\xec\xa0\x1d\xcb\xdb\xae\x6b\x26\xf1\xc5\xf3\x3f\xc9\x88\xb8\x24\xfb\xbe\x00\xca\xcc\x31\x64\x69\xa3\xba\xe0\x7a\xa7\xc8\x88\x5a\xf7\xf6\x5f\x42\xe7\x5c\xef\x94\xdb\xb9\xaa\xb4\x82\x51\x43\xc8\x50\x70\xe7\x71\x6b\x76\x12\xf6\x4e\xf0\xb0\x16\x60\x11\xd2\x3e\xb5\x65\x4a\xa0\x98\xb0\x2d\x8d\x71\xe5\x7c\x8f\xa1\x7b\xff\x2f\xe9\x7d\xc8\x19\x31\x77\xea\xdc\x09\xfb\x19\x2d\x80\xaa\x92\xaf\xa9\x87\x20\xd4\x61\x48\x17\xff\x3c\x39\xd3\xac\xce\x18\x90\x6f\xa3\xde\x09\x61\x89\x31\xd0\xd7\xa6\x0c\x44\x29\xcb\xfa\x20\xcf\x16\x5c\x94\x79\x29\xac\x29\x3a\xe6\xc0\x6e\x7e\x8f\x25\xf1\x26\x42\x91\xe3\xe1\xc9\x8f\x5d\x93\xe6\xec\xc2\x38\x9b\xc6\x0d\xbb\xf4\xa6\x21\xb1\x32\xc5\x52\xa9\x9c\x95\xd2\x6d\x8d\x1a\xf6\x11\x38\xb5\x70\xa0\xde\x4b\x49\x7e\xbe\x80\x51\xc7\x27\x3a\x98\xe6\xe7\x87\x6d\x0b\x32\x75\x03\xaf\x3c\xb2\xcc\x40\x91\xce\x19\x25\xcb\x2f\x29\x57\xf4\xec\x56\xee\x90\xf8\xa0\x9d\xd5\x7d\x6e\x83\x06\x7a\x35\x6a\x4c\xfe\x65\xb1\xb7\xa4\x46\x5d\xa2\xab\x13\x3b\x0e\xfb\x5e\x7d\x4d\xbb\x81\x1b\xcb\xbd\xe7\x12\xaf\xbf\x0f\x7d\xd3\xf3\x26\x22\x22\x84\xb8\xc7\x4e\xac\x7a\xd6\x25\x7f\xa8\xc6\x32\xb7\xda\x25\x59\xa6\x26\x6e\x91\xe0\xef\x90\xdb\xb0\xaa\x96\x8f\x75\x37\x6b\x69\x3f\xca\xa5\xda\x34\x22\x21"}, -{{0x2f,0x5e,0x83,0xbd,0x5b,0x41,0x2e,0x71,0xae,0x3e,0x90,0x84,0xcd,0x36,0x9e,0xfc,0xc7,0x9b,0xf6,0x03,0x7c,0x4b,0x17,0x4d,0xfd,0x6a,0x11,0xfb,0x0f,0x5d,0xa2,0x18,},{0xa2,0x2a,0x6d,0xa2,0x9a,0x5e,0xf6,0x24,0x0c,0x49,0xd8,0x89,0x6e,0x3a,0x0f,0x1a,0x42,0x81,0xa2,0x66,0xc7,0x7d,0x38,0x3e,0xe6,0xf9,0xd2,0x5f,0xfa,0xcb,0xb8,0x72,},{0x9f,0x80,0x92,0x2b,0xc8,0xdb,0x32,0xd0,0xcc,0x43,0xf9,0x93,0x6a,0xff,0xeb,0xe7,0xb2,0xbc,0x35,0xa5,0xd8,0x22,0x77,0xcd,0x18,0x7b,0x5d,0x50,0xdc,0x7f,0xc4,0xc4,0x83,0x2f,0xff,0xa3,0x4e,0x95,0x43,0x80,0x6b,0x48,0x5c,0x04,0x54,0x8e,0x7c,0x75,0x42,0x94,0x25,0xe1,0x4d,0x55,0xd9,0x1f,0xc1,0x05,0x2e,0xfd,0x86,0x67,0x43,0x0b,},"\xb7\x66\x27\x3f\x06\x0e\xf3\xb2\xae\x33\x40\x45\x4a\x39\x1b\x42\x6b\xc2\xe9\x72\x64\xf8\x67\x45\x53\xeb\x00\xdd\x6e\xcf\xdd\x59\xb6\x11\xd8\xd6\x62\x92\x9f\xec\x71\x0d\x0e\x46\x20\x20\xe1\x2c\xdb\xf9\xc1\xec\x88\x58\xe8\x56\x71\xac\xf8\xb7\xb1\x44\x24\xce\x92\x07\x9d\x7d\x80\x1e\x2a\xd9\xac\xac\x03\x6b\xc8\xd2\xdf\xaa\x72\xaa\x83\x9b\xff\x30\xc0\xaa\x7e\x41\x4a\x88\x2c\x00\xb6\x45\xff\x9d\x31\xbc\xf5\xa5\x43\x82\xde\xf4\xd0\x14\x2e\xfa\x4f\x06\xe8\x23\x25\x7f\xf1\x32\xee\x96\x8c\xdc\x67\x38\xc5\x3f\x53\xb8\x4c\x8d\xf7\x6e\x9f\x78\xdd\x50\x56\xcf\x3d\x4d\x5a\x80\xa8\xf8\x4e\x3e\xde\xc4\x85\x20\xf2\xcb\x45\x83\xe7\x08\x53\x93\x55\xef\x7a\xa8\x6f\xb5\xa0\xe8\x7a\x94\xdc\xf1\x4f\x30\xa2\xcc\xa5\x68\xf1\x39\xd9\xce\x59\xea\xf4\x59\xa5\xc5\x91\x6c\xc8\xf2\x0b\x26\xaa\xf6\xc7\xc0\x29\x37\x9a\xed\xb0\x5a\x07\xfe\x58\x5c\xca\xc6\x03\x07\xc1\xf5\x8c\xa9\xf8\x59\x15\x7d\x06\xd0\x6b\xaa\x39\x4a\xac\xe7\x9d\x51\xb8\xcb\x38\xcf\xa2\x59\x81\x41\xe2\x45\x62\x4e\x5a\xb9\xb9\xd6\x87\x31\x17\x33\x48\x90\x53\x15\xbf\x1a\x5a\xd6\x1d\x1e\x8a\xda\xeb\x81\x0e\x4e\x8a\x86\xd7\xc1\x35\x37\xb0\xbe\x86\x0a\xb2\xed\x35\xb7\x33\x99\xb8\x80\x8a\xa9\x1d\x75\x0f\x77\x94\x3f\x8a\x8b\x7e\x89\xfd\xb5\x07\x28\xaa\x3d\xbb\xd8\xa4\x1a\x6e\x00\x75\x6f\x43\x8c\x9b\x9e\x9d\x55\x87\x2d\xf5\xa9\x06\x8a\xdd\x8a\x97\x2b\x7e\x43\xed\xad\x9c\xed\x22\x37\xca\x13\x67\xbe\x4b\x7c\xdb\x66\xa5\x4e\xa1\x2e\xef\x12\x94\x71\x15\x86\x10\xea\xf2\x8f\x99\xf7\xf6\x86\x55\x7d\xcd\xf6\x44\xea"}, -{{0x72,0x2a,0x2d,0xa5,0x0e,0x42,0xc1,0x1a,0x61,0xc9,0xaf,0xac,0x7b,0xe1,0xa2,0xfe,0xd2,0x26,0x7d,0x65,0x0f,0x8f,0x7d,0x8e,0x5b,0xc7,0x06,0xb8,0x07,0xc1,0xb9,0x1d,},{0xfd,0x0b,0x96,0x45,0x62,0xf8,0x23,0x72,0x1e,0x64,0x9c,0x3f,0xed,0xb4,0x32,0xa7,0x6f,0x91,0xe0,0xae,0xad,0x7c,0x61,0xd3,0x5f,0x95,0xed,0x77,0x26,0xd7,0x85,0x89,},{0xc2,0x69,0x5a,0x57,0x17,0x2a,0xaa,0x31,0xbd,0x08,0x90,0xf2,0x31,0xca,0x8e,0xee,0xc0,0x28,0x7a,0x87,0x17,0x26,0x69,0xa8,0x99,0xad,0x08,0x91,0xce,0xa4,0xc4,0x75,0x79,0xb5,0x04,0x20,0xe7,0x91,0xcd,0xec,0x8c,0x18,0x2c,0x8a,0x0e,0x8d,0xde,0x21,0xb2,0x48,0x0b,0x0c,0xfd,0x81,0x11,0xe2,0x8e,0x56,0x03,0x34,0x7a,0x35,0x2d,0x04,},"\x17\x3e\x8b\xb8\x85\xe1\xf9\x08\x14\x04\xac\xac\x99\x90\x41\xd2\xec\xfc\xb7\x3f\x94\x5e\x0d\xb3\x6e\x63\x1d\x7c\xd1\xab\x99\x9e\xb7\x17\xf3\x4b\xf0\x78\x74\xbf\x3d\x34\xe2\x53\x0e\xb6\x08\x5f\x4a\x9f\x88\xae\x1b\x0f\x7d\x80\xf2\x21\x45\x6a\x8e\x9a\x88\x90\xb9\x1a\x50\x19\x2d\xea\xaa\xcc\x0a\x1a\x61\x5a\x87\x84\x1e\x2c\x5a\x9e\x05\x79\x57\xaf\x6e\x48\xe7\x8c\xc8\x61\x98\xe3\x2e\x7a\xa2\x4d\xcf\x6c\xff\xa3\x29\xbc\x72\x60\x6d\x65\xb1\x16\x82\xc8\xba\x73\x6c\xce\x22\xa0\x57\x85\xdf\x11\x46\x33\x1e\x41\x60\x9c\xf9\xca\x71\x1c\xf4\x64\x95\x82\x97\x13\x8b\x58\xa9\x07\x3f\x3b\xbf\x06\xad\x8a\x85\xd1\x35\xde\x66\x65\x21\x04\xd8\x8b\x49\xd2\x7a\xd4\x1e\x59\xbc\xc4\x4c\x7f\xab\x68\xf5\x3f\x05\x02\xe2\x93\xff\xca\xba\xaf\x75\x59\x27\xdf\xdf\xfb\xfd\xe3\xb3\x5c\x08\x0b\x5d\xe4\xc8\xb7\x85\xf4\xda\x64\xef\x35\x7b\xc0\xd1\x46\x6a\x6a\x96\x56\x0c\x3c\x4f\x3e\x3c\x0b\x56\x3a\x00\x3f\x5f\x95\xf2\x37\x17\x1b\xce\x1a\x00\x17\x71\xa0\x4e\xde\x7c\xdd\x9b\x8c\xa7\x70\xfd\x36\xef\x90\xe9\xfe\x00\x00\xa8\xd7\x68\x5f\xd1\x53\xcc\x72\x82\xde\x95\x92\x0a\x8f\x8f\x08\x98\xd0\x0b\xf0\xc6\xc9\x33\xfe\x5b\xb9\x65\x3f\xf1\x46\xc4\xe2\xac\xd1\xa2\xe0\xc2\x3c\x12\x44\x84\x4d\xac\xf8\x65\x27\x16\x30\x2c\x20\x32\xf9\xc1\x14\x67\x9e\xd2\x6b\x3e\xe3\xab\x4a\x7b\x18\xbc\x4e\x30\x71\xf0\x97\x7d\xb5\x7c\xd0\xac\x68\xc0\x72\x7a\x09\xb4\xf1\x25\xfb\x64\xaf\x28\x50\xb2\x6c\x8a\x48\x42\x63\x33\x4e\x2d\xa9\x02\xd7\x44\x73\x70\x44\xe7\x9a\xb1\xcf\x5b\x2f\x93\xa0\x22\xb6\x3d\x40\xcd"}, -{{0x5f,0xe9,0xc3,0x96,0x0e,0xd5,0xbd,0x37,0x4c,0xc9,0x4d,0x42,0x35,0x7e,0x6a,0x24,0xdc,0x7e,0x30,0x60,0x78,0x8f,0x72,0x63,0x65,0xde,0xfa,0xcf,0x13,0xcd,0x12,0xda,},{0x0c,0xe7,0xb1,0x55,0xc8,0xb2,0x0e,0xbd,0xaa,0xcd,0xc2,0xaa,0x23,0x62,0x7e,0x34,0xb1,0xf9,0xac,0xe9,0x80,0x65,0x0a,0x25,0x30,0xc7,0x60,0x7d,0x04,0x81,0x4e,0xb4,},{0x37,0x9f,0x9c,0x54,0xc4,0x13,0xaf,0x0d,0x19,0x2e,0x9b,0xc7,0x36,0xb2,0x9d,0xa9,0xd5,0x21,0xe7,0xba,0x78,0x41,0xd3,0x09,0xf9,0xbc,0xc1,0xe7,0x42,0xec,0x43,0x08,0xfe,0x9f,0x7b,0xa5,0x1e,0x0b,0x22,0xae,0xd4,0x87,0xcb,0x4a,0xa3,0x91,0x3b,0x9b,0xeb,0xfb,0x3a,0xac,0xd3,0x8f,0x40,0x39,0xf9,0xbb,0xbe,0xbe,0x1a,0xd8,0x00,0x02,},"\xc9\x49\x0d\x83\xd9\xc3\xa9\x37\x0f\x06\xc9\x1a\xf0\x01\x68\x5a\x02\xfe\x49\xb5\xca\x66\x77\x33\xff\xf1\x89\xee\xe8\x53\xec\x16\x67\xa6\xc1\xb6\xc7\x87\xe9\x24\x48\x12\xd2\xd5\x32\x86\x6a\xb7\x4d\xfc\x87\x0d\x6f\x14\x03\x3b\x6b\xcd\x39\x85\x2a\x39\x00\xf8\xf0\x8c\xd9\x5a\x74\xcb\x8c\xbe\x02\xb8\xb8\xb5\x1e\x99\x3a\x06\xad\xfe\xbd\x7f\xc9\x85\x4a\xe5\xd2\x9f\x4d\xf9\x64\x28\x71\xd0\xc5\xe4\x70\xd9\x03\xcf\xbc\xbd\x5a\xdb\x32\x75\x62\x8f\x28\xa8\x0b\xf8\xc0\xf0\x37\x66\x87\xda\xe6\x73\xbf\x7a\x85\x47\xe8\x0d\x4a\x98\x55\xae\x25\x72\xfc\x2b\x20\x5d\xc8\xa1\x98\x01\x6d\xdc\x9b\x50\x99\x5f\x5b\x39\xf3\x68\xf5\x40\x50\x4a\x55\x18\x03\xd6\xdd\x5f\x87\x48\x28\xe5\x54\x1d\xed\x05\x28\x94\xd9\xe2\xdc\x5e\x6a\xa3\x51\x08\x7e\x79\x0c\x0d\xd5\xd9\xc4\xde\xcb\x21\x7e\x4d\xb8\x1c\x98\xa1\x84\xb2\x64\xe6\xda\xea\xc0\xf1\x1e\x07\x4c\xae\x2b\xfc\x89\x9f\x54\xb4\x19\xc6\x5d\xcc\x22\x66\x4a\x91\x5f\xbf\xff\xac\x35\xce\xe0\xf2\x86\xeb\x7b\x14\x49\x33\xdb\x93\x3e\x16\xc4\xbc\xb6\x50\xd5\x37\x72\x24\x89\xde\x23\x63\x73\xfd\x8d\x65\xfc\x86\x11\x8b\x6d\xef\x37\xca\x46\x08\xbc\x6c\xe9\x27\xb6\x54\x36\xff\xda\x7f\x02\xbf\xbf\x88\xb0\x45\xae\x7d\x2c\x2b\x45\xa0\xb3\x0c\x8f\x2a\x04\xdf\x95\x32\x21\x08\x8c\x55\x5f\xe9\xa5\xdf\x26\x09\x82\xa3\xd6\x4d\xf1\x94\xee\x95\x2f\xa9\xa9\x8c\x31\xb9\x64\x93\xdb\x61\x80\xd1\x3d\x67\xc3\x67\x16\xf9\x5f\x8c\x0b\xd7\xa0\x39\xad\x99\x06\x67\xca\x34\xa8\x3a\xc1\xa1\x8c\x37\xdd\x7c\x77\x36\xaa\x6b\x9b\x6f\xc2\xb1\xac\x0c\xe1\x19\xef\x77"}, -{{0xec,0x2f,0xa5,0x41,0xac,0x14,0xb4,0x14,0x14,0x9c,0x38,0x25,0xea,0xa7,0x00,0x1b,0x79,0x5a,0xa1,0x95,0x7d,0x40,0x40,0xdd,0xa9,0x25,0x73,0x90,0x4a,0xfa,0x7e,0xe4,},{0x71,0xb3,0x63,0xb2,0x40,0x84,0x04,0xd7,0xbe,0xec,0xde,0xf1,0xe1,0xf5,0x11,0xbb,0x60,0x84,0x65,0x8b,0x53,0x2f,0x7e,0xa6,0x3d,0x4e,0x3f,0x5f,0x01,0xc6,0x1d,0x31,},{0x84,0xd1,0x8d,0x56,0xf9,0x64,0xe3,0x77,0x67,0x59,0xbb,0xa9,0x2c,0x51,0x0c,0x2b,0x6d,0x57,0x45,0x55,0xc3,0xcd,0xda,0xde,0x21,0x2d,0xa9,0x03,0x74,0x55,0x49,0x91,0xe7,0xd7,0x7e,0x27,0x8d,0x63,0xe3,0x46,0x93,0xe1,0x95,0x80,0x78,0xcc,0x36,0x85,0xf8,0xc4,0x1c,0x1f,0x53,0x42,0xe3,0x51,0x89,0x96,0x38,0xef,0x61,0x21,0x14,0x01,},"\x27\x49\xfc\x7c\x4a\x72\x9e\x0e\x0a\xd7\x1b\x5b\x74\xeb\x9f\x9c\x53\x4e\xbd\x02\xff\xc9\xdf\x43\x74\xd8\x13\xbd\xd1\xae\x4e\xb8\x7f\x13\x50\xd5\xfd\xc5\x63\x93\x45\x15\x77\x17\x63\xe6\xc3\x3b\x50\xe6\x4e\x0c\xd1\x14\x57\x30\x31\xd2\x18\x6b\x6e\xca\x4f\xc8\x02\xcd\xdc\x7c\xc5\x1d\x92\xa6\x13\x45\xa1\x7f\x6a\xc3\x8c\xc7\x4d\x84\x70\x7a\x51\x56\xbe\x92\x02\xde\xe3\x44\x46\x52\xe7\x9b\xae\x7f\x0d\x31\xbd\x17\x56\x79\x61\xf6\x5d\xd0\x1a\x8e\x4b\xee\x38\x33\x19\x38\xce\x4b\x2b\x55\x06\x91\xb9\x9a\x4b\xc3\xc0\x72\xd1\x86\xdf\x4b\x33\x44\xa5\xc8\xfb\xfb\xb9\xfd\x2f\x35\x5f\x61\x07\xe4\x10\xc3\xd0\xc7\x98\xb6\x8d\x3f\xb9\xc6\xf7\xab\x5f\xe2\x7e\x70\x87\x1e\x86\x76\x76\x98\xfe\x35\xb7\x7e\xad\x4e\x43\x5a\x94\x02\xcc\x9e\xd6\xa2\x65\x7b\x05\x9b\xe0\xa2\x10\x03\xc0\x48\xbb\xf5\xe0\xeb\xd9\x3c\xbb\x2e\x71\xe9\x23\xcf\x5c\x72\x8d\x17\x58\xcd\x81\x7a\xd7\x4b\x45\x4a\x88\x71\x26\xd6\x53\xb9\x5a\x7f\x25\xe5\x29\x3b\x76\x8c\x9f\xc5\xa9\xc3\x5a\x23\x72\xe3\x74\x1b\xc9\x0f\xd6\x63\x01\x42\x7b\x10\x82\x4b\xb4\xb1\xe9\x11\x0b\xfb\xa8\x4c\x21\xa4\x0e\xb8\xfe\xd4\x49\x7e\x91\xdc\x3f\xfd\x04\x38\xc5\x14\xc0\xa8\xcb\x4c\xac\x6a\xd0\x25\x6b\xf1\x1d\x5a\xa7\xa9\xc7\xc0\x0b\x66\x9b\x01\x5b\x0b\xf8\x14\x25\xa2\x14\x13\xe2\xff\xb6\xed\xc0\xbd\x78\xe3\x85\xc4\x4f\xd7\x45\x58\xe5\x11\xc2\xc2\x5f\xee\x1f\xec\x18\xd3\x99\x0b\x86\x90\x30\x0f\xa7\x11\xe9\x3d\x98\x54\x66\x8f\x01\x87\x06\x5e\x76\xe7\x11\x3a\xe7\x63\xc3\x0d\xdd\x86\x72\x0b\x55\x46\xa6\xc3\xc6\xf1\xc4\x3b\xc6\x7b\x14"}, -{{0x61,0x32,0x69,0x2a,0x5e,0xf2,0x7b,0xf4,0x76,0xb1,0xe9,0x91,0xe6,0xc4,0x31,0xa8,0xc7,0x64,0xf1,0xae,0xbd,0x47,0x02,0x82,0xdb,0x33,0x21,0xbb,0x7c,0xb0,0x9c,0x20,},{0x7a,0x2d,0x16,0x61,0x84,0xf9,0xe5,0xf7,0x3b,0xea,0x45,0x44,0x86,0xb0,0x41,0xce,0xb5,0xfc,0x23,0x14,0xa7,0xbd,0x59,0xcb,0x71,0x8e,0x79,0xf0,0xec,0x98,0x9d,0x84,},{0xeb,0x67,0x7f,0x33,0x47,0xe1,0xa1,0xea,0x92,0x9e,0xfd,0xf6,0x2b,0xf9,0x10,0x5a,0x6c,0x8f,0x49,0x93,0x03,0x3b,0x4f,0x6d,0x03,0xcb,0x0d,0xbf,0x9c,0x74,0x2b,0x27,0x07,0x04,0xe3,0x83,0xab,0x7c,0x06,0x76,0xbd,0xb1,0xad,0x0c,0xe9,0xb1,0x66,0x73,0x08,0x3c,0x96,0x02,0xec,0x10,0xae,0x1d,0xd9,0x8e,0x87,0x48,0xb3,0x36,0x44,0x0b,},"\xa9\xc0\x86\x16\x65\xd8\xc2\xde\x06\xf9\x30\x1d\xa7\x0a\xfb\x27\xb3\x02\x4b\x74\x4c\x6b\x38\xb2\x42\x59\x29\x4c\x97\xb1\xd1\xcb\x4f\x0d\xcf\x75\x75\xa8\xed\x45\x4e\x2f\x09\x80\xf5\x03\x13\xa7\x73\x63\x41\x51\x83\xfe\x96\x77\xa9\xeb\x1e\x06\xcb\x6d\x34\xa4\x67\xcb\x7b\x07\x58\xd6\xf5\x5c\x56\x4b\x5b\xa1\x56\x03\xe2\x02\xb1\x88\x56\xd8\x9e\x72\xa2\x3a\xb0\x7d\x88\x53\xff\x77\xda\x7a\xff\x1c\xae\xbd\x79\x59\xf2\xc7\x10\xef\x31\xf5\x07\x8a\x9f\x2c\xda\xe9\x26\x41\xa1\xcc\x5f\x74\xd0\xc1\x43\xec\x42\xaf\xba\xa5\xf3\x78\xa9\xe1\x0d\x5b\xf7\x45\x87\xfa\x5f\x49\xc1\x56\x23\x32\x47\xda\xfd\x39\x29\xac\xde\x88\x8d\xc6\x84\x33\x7e\x40\xcd\xc5\x93\x2e\x7e\xb7\x3f\xfc\xc9\x0b\x85\xc0\xad\x46\x04\x16\x69\x1a\xef\xbd\x7e\xfd\x07\xb6\x57\xc3\x50\x94\x6a\x0e\x36\x6b\x37\xa6\xc8\x08\x9a\xba\x5c\x5f\xe3\xbb\xca\x06\x4a\xfb\xe9\xd4\x7f\xbc\x83\x91\x4a\xf1\xcb\x43\xc2\xb2\xef\xa9\x8e\x0a\x43\xbe\x32\xba\x82\x32\x02\x00\x1d\xef\x36\x81\x72\x51\xb6\x5f\x9b\x05\x06\xce\xf6\x68\x36\x42\xa4\x6e\xd6\x12\xf8\xca\x81\xee\x97\xbb\x04\xd3\x17\xb5\x17\x34\x3a\xde\x2b\x77\x12\x6d\x1f\x02\xa8\x7b\x76\x04\xc8\x65\x3b\x67\x48\xcf\x54\x88\xfa\x6d\x43\xdf\x80\x9f\xaa\x19\xe6\x92\x92\xd3\x8c\x5d\x39\x7d\xd8\xe2\x0c\x7a\xf7\xc5\x33\x4e\xc9\x77\xf5\x01\x0a\x0f\x7c\xb5\xb8\x94\x79\xca\x06\xdb\x4d\x12\x62\x7f\x06\x7d\x6c\x42\x18\x6a\x6b\x1f\x87\x42\xf3\x6a\xe7\x09\xba\x72\x0e\x3c\xd8\x98\x11\x66\x66\xd8\x1b\x19\x0b\x9b\x9d\x2a\x72\x20\x2c\xb6\x90\xa0\x3f\x33\x10\x42\x9a\x71\xdc\x04\x8c\xde"}, -{{0xf2,0x19,0xb2,0x10,0x11,0x64,0xaa,0x97,0x23,0xbd,0xe3,0xa7,0x34,0x6f,0x68,0xa3,0x50,0x61,0xc0,0x1f,0x97,0x82,0x07,0x25,0x80,0xba,0x32,0xdf,0x90,0x3b,0xa8,0x91,},{0xf6,0x6b,0x92,0x0d,0x5a,0xa1,0xa6,0x08,0x54,0x95,0xa1,0x48,0x05,0x39,0xbe,0xba,0x01,0xff,0xe6,0x0e,0x6a,0x63,0x88,0xd1,0xb2,0xe8,0xed,0xa2,0x33,0x55,0x81,0x0e,},{0x17,0xf0,0x12,0x7c,0xa3,0xba,0xfa,0x5f,0x4e,0xe9,0x59,0xcd,0x60,0xf7,0x72,0xbe,0x87,0xa0,0x03,0x49,0x61,0x51,0x7e,0x39,0xa0,0xa1,0xd0,0xf4,0xb9,0xe2,0x6d,0xb1,0x33,0x6e,0x60,0xc8,0x2b,0x35,0x2c,0x4c,0xba,0xcd,0xbb,0xd1,0x17,0x71,0xc3,0x77,0x4f,0x8c,0xc5,0xa1,0xa7,0x95,0xd6,0xe4,0xf4,0xeb,0xd5,0x1d,0xef,0x36,0x77,0x0b,},"\x01\x55\x77\xd3\xe4\xa0\xec\x1a\xb2\x59\x30\x10\x63\x43\xff\x35\xab\x4f\x1e\x0a\x8a\x2d\x84\x4a\xad\xbb\x70\xe5\xfc\x53\x48\xcc\xb6\x79\xc2\x29\x5c\x51\xd7\x02\xaa\xae\x7f\x62\x73\xce\x70\x29\x7b\x26\xcb\x7a\x25\x3a\x3d\xb9\x43\x32\xe8\x6a\x15\xb4\xa6\x44\x91\x23\x27\x91\xf7\xa8\xb0\x82\xee\x28\x34\xaf\x30\x40\x0e\x80\x46\x47\xa5\x32\xe9\xc4\x54\xd2\xa0\xa7\x32\x01\x30\xab\x6d\x4d\x86\x00\x73\xa3\x46\x67\xac\x25\xb7\xe5\xe2\x74\x7b\xa9\xf5\xc9\x45\x94\xfb\x68\x37\x7a\xe2\x60\x36\x9c\x40\x71\x3b\x4e\x32\xf2\x31\x95\xbf\x91\xd3\xd7\xf1\xa2\x71\x9b\xf4\x08\xaa\xd8\xd8\xa3\x47\xb1\x12\xe8\x4b\x11\x88\x17\xcb\x06\x51\x33\x44\x02\x17\x63\x03\x52\x72\xa7\xdb\x72\x8a\x0c\xcd\xaa\x94\x9c\x61\x71\x5d\x07\x64\x14\x0b\x3e\x8c\x01\xd2\x0f\xf1\x59\x3c\x7f\x2d\x55\xc4\xe8\x2a\x1c\x0c\xb1\xea\x58\x44\x2b\xf8\x0a\x74\x1b\xca\x91\xf5\x8a\xb0\x58\x1b\x49\x8e\xe9\xfe\x3c\x92\xca\x65\x41\x48\xef\x75\x31\x35\x43\xd1\xaf\xf3\x82\xbe\xfe\x1a\x93\xb0\x21\x90\xce\x01\x02\x17\x51\x58\xe2\x07\x1d\x02\xba\xca\xd8\xdb\xe9\xfb\x94\x0f\xcb\x61\x0c\x10\x5a\xd5\x2c\x80\xfe\xb1\xec\x4e\x52\x4f\x4c\x0e\xc7\x98\x3e\x9c\xe6\x96\xfa\x4f\xcf\x4b\xf0\x51\x4b\x8f\x04\x32\xb1\x7d\x54\x48\xfc\x42\x6f\xea\x2b\x01\xac\x7b\x26\xc2\xae\xd7\x69\x92\x75\x34\xda\x22\x57\x6f\xc1\xbb\xa7\x26\xe9\xd6\x5b\xe0\x1b\x59\xf6\x0a\x64\x8a\xce\x2f\xc3\xe5\xe2\x75\x78\x9f\xa6\x37\xcb\xbd\x84\xbe\x3d\x6a\xc2\x44\x57\xa6\x29\x2c\xd6\x56\xc7\xb5\x69\xa5\x2f\xfe\xa7\x91\x6b\x8d\x04\xb4\xf4\xa7\x5b\xe7\xac\x95\x14\x2f"}, -{{0xfc,0x18,0x00,0x35,0xae,0xc0,0xf5,0xed,0xe7,0xbd,0xa9,0x3b,0xf7,0x7a,0xde,0x7a,0x81,0xed,0x06,0xde,0x07,0xee,0x2e,0x3a,0xa8,0x57,0x6b,0xe8,0x16,0x08,0x61,0x0a,},{0x4f,0x21,0x5e,0x94,0x8c,0xae,0x24,0x3e,0xe3,0x14,0x3b,0x80,0x28,0x2a,0xd7,0x92,0xc7,0x80,0xd2,0xa6,0xb7,0x50,0x60,0xca,0x1d,0x29,0x0c,0xa1,0xa8,0xe3,0x15,0x1f,},{0xa4,0x3a,0x71,0xc3,0xa1,0x9c,0x35,0x66,0x0d,0xae,0x6f,0x31,0xa2,0x54,0xb8,0xc0,0xea,0x35,0x93,0xfc,0x8f,0xca,0x74,0xd1,0x36,0x40,0x01,0x2b,0x9e,0x94,0x73,0xd4,0xaf,0xe0,0x70,0xdb,0x01,0xe7,0xfb,0x39,0x9b,0xf4,0xca,0x60,0x70,0xe0,0x62,0x18,0x00,0x11,0x28,0x5a,0x67,0xdd,0x68,0x58,0xb7,0x61,0xe4,0x6c,0x6b,0xd3,0x20,0x04,},"\xb5\xe8\xb0\x16\x25\x66\x4b\x22\x23\x39\xe0\xf0\x5f\x93\xa9\x90\xba\x48\xb5\x6a\xe6\x54\x39\xa1\x75\x20\x93\x2d\xf0\x11\x72\x1e\x28\x4d\xbe\x36\xf9\x86\x31\xc0\x66\x51\x00\x98\xa6\x8d\x7b\x69\x2a\x38\x63\xe9\x9d\x58\xdb\x76\xca\x56\x67\xc8\x04\x3c\xb1\x0b\xd7\xab\xba\xf5\x06\x52\x9f\xbb\x23\xa5\x16\x6b\xe0\x38\xaf\xfd\xb9\xa2\x34\xc4\xf4\xfc\xf4\x3b\xdd\xd6\xb8\xd2\xce\x77\x2d\xd6\x53\xed\x11\x5c\x09\x5e\x23\x2b\x26\x9d\xd4\x88\x8d\x23\x68\xcb\x1c\x66\xbe\x29\xdd\x38\x3f\xca\x67\xf6\x67\x65\xb2\x96\x56\x4e\x37\x55\x5f\x0c\x0e\x48\x45\x04\xc5\x91\xf0\x06\xea\x85\x33\xa1\x25\x83\xad\x2e\x48\x31\x8f\xf6\xf3\x24\xec\xaf\x80\x4b\x1b\xae\x04\xaa\x89\x67\x43\xe6\x7e\xf6\x1c\xa3\x83\xd5\x8e\x42\xac\xfc\x64\x10\xde\x30\x77\x6e\x3b\xa2\x62\x37\x3b\x9e\x14\x41\x94\x39\x55\x10\x1a\x4e\x76\x82\x31\xad\x9c\x65\x29\xef\xf6\x11\x8d\xde\x5d\xf0\x2f\x94\xb8\xd6\xdf\x2d\x99\xf2\x78\x63\xb5\x17\x24\x3a\x57\x9e\x7a\xaf\xf3\x11\xea\x3a\x02\x82\xe4\x7c\xa8\x76\xfa\xbc\x22\x80\xfc\xe7\xad\xc9\x84\xdd\x0b\x30\x88\x5b\x16\x50\xf1\x47\x1d\xfc\xb0\x52\x2d\x49\xfe\xc7\xd0\x42\xf3\x2a\x93\xbc\x36\x8f\x07\x60\x06\xea\x01\xec\x1c\x74\x12\xbf\x66\xf6\x2d\xc8\x8d\xe2\xc0\xb7\x47\x01\xa5\x61\x4e\x85\x5e\x9f\xa7\x28\xfb\x1f\x11\x71\x38\x5f\x96\xaf\xbd\xe7\x0d\xea\x02\xe9\xaa\x94\xdc\x21\x84\x8c\x26\x30\x2b\x50\xae\x91\xf9\x69\x3a\x18\x64\xe4\xe0\x95\xae\x03\xcd\xc2\x2a\xd2\x8a\x0e\xb7\xdb\x59\x67\x79\x24\x67\x12\xfa\xb5\xf5\xda\x32\x7e\xfe\xc3\xe7\x96\x12\xde\x0a\x6c\xca\xa5\x36\x75\x9b\x8e"}, -{{0xa2,0x83,0x6a,0x65,0x42,0x79,0x12,0x12,0x2d,0x25,0xdc,0xdf,0xc9,0x9d,0x70,0x46,0xfe,0x9b,0x53,0xd5,0xc1,0xbb,0x23,0x61,0x7f,0x11,0x89,0x0e,0x94,0xca,0x93,0xed,},{0x8c,0x12,0xbd,0xa2,0x14,0xc8,0xab,0xb2,0x28,0x6a,0xcf,0xfb,0xf8,0x11,0x24,0x25,0x04,0x0a,0xab,0x9f,0x4d,0x8b,0xb7,0x87,0x0b,0x98,0xda,0x01,0x59,0xe8,0x82,0xf1,},{0xe6,0xa9,0xa6,0xb4,0x36,0x55,0x9a,0x43,0x20,0xc4,0x5c,0x0c,0x2c,0x4a,0x2a,0xed,0xec,0xb9,0x0d,0x41,0x6d,0x52,0xc8,0x26,0x80,0xac,0x73,0x30,0xd0,0x62,0xae,0xbe,0xf3,0xe9,0xac,0x9f,0x2c,0x5f,0xfa,0x45,0x5c,0x9b,0xe1,0x13,0x01,0x3a,0x2b,0x28,0x2e,0x56,0x00,0xfd,0x30,0x64,0x35,0xad,0xa8,0x3b,0x1e,0x48,0xba,0x2a,0x36,0x05,},"\x81\x3d\x60\x61\xc5\x6e\xae\x0f\xf5\x30\x41\xc0\x24\x4a\xa5\xe2\x9e\x13\xec\x0f\x3f\xb4\x28\xd4\xbe\xb8\xa9\x9e\x04\xbc\xa8\xc4\x1b\xdd\xb0\xdb\x94\x5f\x48\x7e\xfe\x38\xf2\xfc\x14\xa6\x28\xfa\xfa\x24\x62\xf8\x60\xe4\xe3\x42\x50\xeb\x4e\x93\xf1\x39\xab\x1b\x74\xa2\x61\x45\x19\xe4\x1e\xe2\x40\x3b\xe4\x27\x93\x0a\xb8\xbc\x82\xec\x89\xce\xaf\xb6\x09\x05\xbd\x4d\xdb\xbd\x13\xbd\xb1\x96\x54\x31\x4f\xc9\x23\x73\x14\x0b\x96\x2e\x22\x58\xe0\x38\xd7\x1b\x9e\xc6\x6b\x84\xef\x83\x19\xe0\x35\x51\xcb\x70\x7e\x74\x7f\x6c\x40\xad\x47\x6f\xbe\xfd\xce\x71\xf3\xa7\xb6\x7a\x1a\xf1\x86\x9b\xc6\x44\x06\x86\xe7\xe0\x85\x5e\x4f\x36\x9d\x1d\x88\xb8\x09\x9f\xba\x54\x71\x46\x78\x62\x7b\xba\x1a\xff\x41\xe7\x70\x7b\xc9\x7e\xdd\xf8\x90\xb0\xc0\x8d\xce\x3e\x98\x00\xd2\x4c\x6f\x61\x09\x2c\xe2\x8d\x48\x1b\x5d\xea\x5c\x09\x6c\x55\xd7\x2f\x89\x46\x00\x91\x31\xfb\x96\x8e\x2b\xc8\xa0\x54\xd8\x25\xad\xab\x76\x74\x0d\xcf\x0d\x75\x8c\x8b\xf5\x4f\xf3\x86\x59\xe7\x1b\x32\xbf\xe2\xe6\x15\xaa\xab\xb0\xf5\x29\x30\x85\x64\x9c\xf6\x0b\x98\x47\xbc\x62\x01\x1c\xe3\x87\x8a\xf6\x28\x98\x4a\x58\x40\xa4\xad\x5d\xae\x37\x02\xdb\x36\x7d\xa0\xf8\xa1\x65\xfe\xd0\x51\x7e\xb5\xc4\x42\xb0\x14\x53\x30\x24\x1b\x97\xee\xca\x73\x3b\xa6\x68\x8b\x9c\x12\x9a\x61\xcd\x12\x36\xaf\xf0\xe2\x7b\xcf\x98\xc2\x8b\x0f\xbe\xea\x55\xa3\xd7\xc7\x19\x3d\x64\x4b\x27\x49\xf9\x86\xbd\x46\xaf\x89\x38\xe8\xfa\xae\xaf\xbd\x9c\xec\x36\x12\xab\x00\x5b\xd7\xc3\xee\xaf\xe9\xa3\x12\x79\xca\x61\x02\x56\x06\x66\xba\x16\x13\x6f\xf1\x45\x2f\x85\x0a\xdb"}, -{{0xf0,0x51,0xaf,0x42,0x6d,0x0c,0x32,0x82,0xfa,0xfc,0x8b,0xf9,0x12,0xad,0xe1,0xc2,0x42,0x11,0xa9,0x5a,0xd2,0x00,0xe1,0xee,0xf5,0x49,0x32,0x0e,0x1c,0xb1,0xa2,0x52,},{0xfa,0x87,0x95,0x5e,0x0e,0xa1,0x3d,0xde,0x49,0xd8,0x3d,0xc2,0x2e,0x63,0xa2,0xbd,0xf1,0x07,0x67,0x25,0xc2,0xcc,0x7f,0x93,0xc7,0x65,0x11,0xf2,0x8e,0x79,0x44,0xf2,},{0xb8,0xf7,0x13,0x57,0x8a,0x64,0x46,0x67,0x19,0xac,0xeb,0x43,0x2f,0xce,0x30,0x2a,0x87,0xcf,0x06,0x6b,0xf3,0xe1,0x02,0xa3,0x50,0x61,0x69,0x21,0xa8,0x40,0x96,0x4b,0xfc,0x7e,0x68,0x5d,0x8f,0xd1,0x74,0x55,0xac,0x3e,0xb4,0x86,0x1e,0xdc,0xb8,0x97,0x9d,0x35,0xe3,0xa4,0xbd,0x82,0xa0,0x78,0xcd,0x70,0x77,0x21,0xd7,0x33,0x40,0x0e,},"\xb4\x8d\x9f\x84\x76\x2b\x3b\xcc\x66\xe9\x6d\x76\xa6\x16\xfa\x8f\xe8\xe0\x16\x95\x25\x1f\x47\xcf\xc1\xb7\xb1\x7d\x60\xdc\x9f\x90\xd5\x76\xef\x64\xee\x7d\x38\x85\x04\xe2\xc9\x07\x96\x38\x16\x5a\x88\x96\x96\x47\x1c\x98\x9a\x87\x6f\x8f\x13\xb6\x3b\x58\xd5\x31\xfe\xa4\xdd\x12\x29\xfc\x63\x16\x68\xa0\x47\xbf\xae\x2d\xa2\x81\xfe\xae\x1b\x6d\xe3\xeb\xe2\x80\xab\xe0\xa8\x2e\xe0\x0f\xbf\xdc\x22\xce\x2d\x10\xe0\x6a\x04\x92\xff\x14\x04\xdf\xc0\x94\xc4\x0b\x20\x3b\xf5\x57\x21\xdd\x78\x7e\xd4\xe9\x1d\x55\x17\xaa\xf5\x8d\x3b\xdd\x35\xd4\x4a\x65\xae\x6b\xa7\x56\x19\xb3\x39\xb6\x50\x51\x8c\xef\xcc\x17\x49\x3d\xe2\x7a\x3b\x5d\x41\x78\x8f\x87\xed\xbd\xe7\x26\x10\xf1\x81\xbf\x06\xe2\x08\xe0\xeb\x7c\xdf\xe8\x81\xd9\x1a\x2d\x6c\xc7\x7a\xa1\x9c\x0f\xcf\x33\x0f\xed\xb4\x46\x75\xd8\x00\xeb\x8c\xff\x95\x05\xd8\x88\x75\x44\xa5\x03\xcb\xe3\x73\xc4\x84\x7b\x19\xe8\xf3\x99\x57\x26\xef\xd6\x64\x98\x58\x59\x5c\x57\xcc\xaf\x0c\xbc\x9e\xb2\x5d\xe8\x3b\xa0\x46\xbc\x9f\x18\x38\xac\x7b\x89\x53\xdd\x81\xb8\x1a\xc0\xf6\x8d\x0e\x93\x38\xcb\x55\x40\x25\x52\xaf\xb6\xbc\x16\x94\x93\x51\xb9\x26\xd1\x51\xa8\x2e\xfc\x69\x5e\x8d\x7d\xa0\xdd\x55\x09\x93\x66\x78\x97\x18\xcc\xbf\x36\x03\x0b\xd2\xc3\xc1\x09\x39\x9b\xe2\x6c\xdb\x8b\x9e\x2a\x15\x5f\x3b\x2c\xb1\xbf\xa7\x1a\xb6\x9a\x23\x62\x5a\x4a\xc1\x18\xfe\x91\xcb\x2c\x19\x78\x8c\xf5\x2a\x71\xd7\x30\xd5\x76\xb4\x21\xd9\x69\x82\xa5\x1a\x29\x91\xda\xec\x44\x0c\xda\x7e\x6c\xc3\x28\x2b\x83\x12\x71\x42\x78\xb8\x19\xbf\xe2\x38\x7e\xb9\x6a\xa9\x1d\x40\x17\x30\x34\xf4\x28"}, -{{0xa1,0x03,0xe9,0x26,0x72,0xc6,0x5f,0x81,0xea,0x5d,0xa1,0xff,0xf1,0xa4,0x03,0x87,0x88,0x47,0x9e,0x94,0x1d,0x50,0x3a,0x75,0x6f,0x4a,0x75,0x52,0x01,0xa5,0x7c,0x1d,},{0xee,0x63,0xa5,0xb6,0x96,0x41,0x21,0x7a,0xcb,0xaf,0x33,0x39,0xda,0x82,0x9e,0xc0,0x71,0xb9,0x93,0x1e,0x59,0x87,0x15,0x35,0x14,0xd3,0x01,0x40,0x83,0x7a,0x7a,0xf4,},{0x2a,0xa2,0x03,0x5c,0x2c,0xe5,0xb5,0xe6,0xae,0x16,0x1e,0x16,0x8f,0x3a,0xd0,0xd6,0x59,0x2b,0xcf,0x2c,0x4a,0x04,0x9d,0x3e,0xd3,0x42,0xfc,0xeb,0x56,0xbe,0x9c,0x7c,0xb3,0x72,0x02,0x75,0x73,0xae,0x01,0x78,0xe8,0x87,0x8e,0xbe,0xfc,0xa7,0xb0,0x30,0x32,0x7b,0x8a,0xad,0x41,0x85,0x7d,0xe5,0x8c,0xb7,0x8e,0x1a,0x00,0xcb,0xac,0x05,},"\xb1\x98\x4e\x9e\xec\x08\x5d\x52\x4c\x1e\xb3\xb9\x5c\x89\xc8\x4a\xe0\x85\xbe\x5d\xc6\x5c\x32\x6e\x19\x02\x5e\x12\x10\xa1\xd5\x0e\xdb\xbb\xa5\xd1\x37\x0c\xf1\x5d\x68\xd6\x87\xeb\x11\x32\x33\xe0\xfb\xa5\x0f\x94\x33\xc7\xd3\x58\x77\x39\x50\xc6\x79\x31\xdb\x82\x96\xbb\xcb\xec\xec\x88\x8e\x87\xe7\x1a\x2f\x75\x79\xfa\xd2\xfa\x16\x2b\x85\xfb\x97\x47\x3c\x45\x6b\x9a\x5c\xe2\x95\x66\x76\x96\x9c\x7b\xf4\xc4\x56\x79\x08\x5b\x62\xf2\xc2\x24\xfc\x7f\x45\x87\x94\x27\x3f\x6d\x12\xc5\xf3\xe0\xd0\x69\x51\x82\x4d\x1c\xca\x3e\x2f\x90\x45\x59\xed\x28\xe2\x86\x8b\x36\x6d\x79\xd9\x4d\xc9\x86\x67\xb9\xb5\x92\x42\x68\xf3\xe3\x9b\x12\x91\xe5\xab\xe4\xa7\x58\xf7\x70\x19\xda\xcb\xb2\x2b\xd8\x19\x6e\x0a\x83\xa5\x67\x76\x58\x83\x6e\x96\xca\x56\x35\x05\x5a\x1e\x63\xd6\x5d\x03\x6a\x68\xd8\x7a\xc2\xfd\x28\x3f\xdd\xa3\x90\x31\x99\x09\xc5\xcc\x76\x80\x36\x88\x48\x87\x3d\x59\x7f\x29\x8e\x0c\x61\x72\x30\x80\x30\xff\xd4\x52\xbb\x13\x63\x61\x7b\x31\x6e\xd7\xcd\x94\x9a\x16\x5d\xc8\xab\xb5\x3f\x99\x1a\xef\x3f\x3e\x95\x02\xc5\xdf\xe4\x75\x6b\x7c\x6b\xfd\xfe\x89\xf5\xe0\x0f\xeb\xdd\x6a\xfb\x04\x02\x81\x8f\x11\xcf\x8d\x1d\x58\x64\xfe\x9d\xa1\xb8\x6e\x39\xaa\x93\x58\x31\x50\x6c\xf2\x40\x0e\xa7\xed\x75\xbd\x95\x33\xb2\x3e\x20\x2f\xe8\x75\xd7\xd9\x63\x8c\x89\xd1\x1c\xb2\xd6\xe6\x02\x1a\xe6\xbd\x27\xc7\x75\x48\x10\xd3\x5c\xd3\xa6\x14\x94\xf2\x7b\x16\xfc\x79\x4e\x2c\xd2\xf0\xd3\x45\x3a\xda\x93\x38\x65\xdb\x78\xc5\x79\x57\x1f\x8f\xc5\xc5\xc6\xbe\x8e\xaf\xfc\xe6\xa8\x52\xe5\xb3\xb1\xc5\x24\xc4\x93\x13\xd4\x27\xab\xcb"}, -{{0xd4,0x7c,0x1b,0x4b,0x9e,0x50,0xcb,0xb7,0x1f,0xd0,0x7d,0x09,0x6d,0x91,0xd8,0x72,0x13,0xd4,0x4b,0x02,0x43,0x73,0x04,0x47,0x61,0xc4,0x82,0x2f,0x9d,0x9d,0xf8,0x80,},{0xf4,0xe1,0xcb,0x86,0xc8,0xca,0x2c,0xfe,0xe4,0x3e,0x58,0x59,0x4a,0x87,0x78,0x43,0x6d,0x3e,0xa5,0x19,0x70,0x4e,0x00,0xc1,0xbb,0xe4,0x8b,0xbb,0x1c,0x94,0x54,0xf8,},{0x62,0x7e,0x7c,0xa7,0xe3,0x4e,0xd6,0x33,0x1d,0x62,0xb9,0x54,0x1c,0x1e,0xa9,0xa9,0x29,0x2b,0xe7,0xb0,0xa6,0x5d,0x80,0x5e,0x26,0x6b,0x51,0x22,0x27,0x2a,0x82,0xdb,0x7d,0x76,0x5a,0xcc,0x7e,0x2a,0x29,0x0d,0x68,0x58,0x04,0x92,0x2f,0x91,0xed,0x04,0xa3,0xc3,0x82,0xc0,0x3f,0xf2,0x1a,0x17,0x68,0xf5,0x84,0x41,0x3c,0x4e,0x5f,0x00,},"\x88\xd7\x00\x9d\x51\xde\x3d\x33\x7e\xef\x0f\x21\x5e\xa6\x6a\xb8\x30\xec\x5a\x9e\x68\x23\x76\x1c\x3b\x92\xad\x93\xea\x34\x1d\xb9\x2e\xce\x67\xf4\xef\x4c\xeb\x84\x19\x4a\xe6\x92\x6c\x3d\x01\x4b\x2d\x59\x78\x1f\x02\xe0\xb3\x2f\x9a\x61\x12\x22\xcb\x9a\x58\x50\xc6\x95\x7c\xb8\x07\x9a\xe6\x4e\x08\x32\xa1\xf0\x5e\x5d\x1a\x3c\x57\x2f\x9d\x08\xf1\x43\x7f\x76\xbb\x3b\x83\xb5\x29\x67\xc3\xd4\x8c\x35\x76\x84\x88\x91\xc9\x65\x8d\x49\x59\xeb\x80\x65\x6d\x26\xcd\xba\x08\x10\x03\x7c\x8a\x18\x31\x8f\xf1\x22\xf8\xaa\x89\x85\xc7\x73\xcb\x31\x7e\xfa\x2f\x55\x7f\x1c\x38\x96\xbc\xb1\x62\xdf\x5d\x87\x68\x1b\xb7\x87\xe7\x81\x3a\xa2\xde\xa3\xb0\xc5\x64\xd6\x46\xa9\x28\x61\xf4\x44\xca\x14\x07\xef\xba\xc3\xd1\x24\x32\xcb\xb7\x0a\x1d\x0e\xaf\xfb\x11\x74\x1d\x37\x18\xfe\xde\xe2\xb8\x30\x36\x18\x9a\x6f\xc4\x5a\x52\xf7\x4f\xa4\x87\xc1\x8f\xd2\x64\xa7\x94\x5f\x6c\x9e\x44\xb0\x11\xf5\xd8\x66\x13\xf1\x93\x9b\x19\xf4\xf4\xfd\xf5\x32\x34\x05\x7b\xe3\xf0\x05\xad\x64\xee\xbf\x3c\x8f\xfb\x58\xcb\x40\x95\x6c\x43\x36\xdf\x01\xd4\x42\x4b\x70\x6a\x0e\x56\x1d\x60\x17\x08\xd1\x24\x85\xe2\x1b\xcb\x6d\x79\x9d\x8d\x1d\x04\x4b\x40\x00\x64\xec\x09\x44\x50\x14\x06\xe7\x02\x53\x94\x70\x06\xca\xbb\xdb\x2d\xd6\xbd\x8c\xee\x44\x97\x65\x3d\x91\x13\xa4\x4d\x4d\xe9\xb6\x8d\x4c\x52\x6f\xca\x0b\x9b\x0c\x18\xfe\x50\xfb\x91\x7f\xdd\x9a\x91\x4f\xb8\x16\x10\x8a\x73\xa6\xb3\xff\xf9\xe6\x54\xe6\x9c\x9c\xfe\x02\xb0\x5c\x6c\x1b\x9d\x15\xc4\xe6\x5c\xf3\x10\x18\xb8\x10\x0d\x78\x46\x33\xee\x18\x88\xee\xe3\x57\x2a\xaf\xa6\xf1\x89\xea\x22\xd0"}, -{{0xfc,0x0c,0x32,0xc5,0xeb,0x6c,0x71,0xea,0x08,0xdc,0x2b,0x30,0x0c,0xbc,0xef,0x18,0xfd,0xde,0x3e,0xa2,0x0f,0x68,0xf2,0x17,0x33,0x23,0x7b,0x4d,0xda,0xab,0x90,0x0e,},{0x47,0xc3,0x7d,0x8a,0x08,0x08,0x57,0xeb,0x87,0x77,0xa6,0xc0,0xa9,0xa5,0xc9,0x27,0x30,0x3f,0xaf,0x5c,0x32,0x09,0x53,0xb5,0xde,0x48,0xe4,0x62,0xe1,0x2d,0x00,0x62,},{0x68,0x87,0xc6,0xe2,0xb9,0x8a,0x82,0xaf,0x5e,0xe3,0xdf,0xa7,0xca,0x2c,0xb2,0x5d,0x9c,0x10,0x74,0x56,0x20,0xa8,0x29,0x56,0xac,0xba,0x85,0xcb,0x57,0xc8,0xec,0x24,0x27,0x9f,0xa4,0x2f,0x09,0x23,0x59,0xa1,0xb6,0xbb,0xea,0xfb,0xa0,0x50,0xf1,0x4b,0x62,0x88,0x20,0x9e,0x6e,0xf7,0xbc,0x1e,0x0a,0x2b,0x87,0x2c,0x11,0x38,0xf3,0x05,},"\xa7\xb1\xe2\xdb\x6b\xdd\x96\xb3\xd5\x14\x75\x60\x35\x37\xa7\x6b\x42\xb0\x4d\x7e\xbd\x24\xfe\x51\x5a\x88\x76\x58\xe4\xa3\x52\xe2\x21\x09\x33\x56\x39\xa5\x9e\x25\x34\x81\x1f\x47\x53\xb7\x02\x09\xd0\xe4\x69\x8e\x9d\x92\x60\x88\x82\x6c\x14\x68\x96\x81\xea\x00\xfa\x3a\x2f\xca\xa0\x04\x7c\xed\x3e\xf2\x87\xe6\x17\x25\x02\xb2\x15\xe5\x64\x97\x61\x4d\x86\xb4\xcb\x26\xbc\xd7\x7a\x2e\x17\x25\x09\x36\x0e\xe5\x88\x93\xd0\x1c\x0d\x0f\xb4\xd4\xab\xfe\x4d\xbd\x8d\x2a\x2f\x54\x19\x0f\xa2\xf7\x31\xc1\xce\xac\x68\x29\xc3\xdd\xc9\xbf\xb2\xff\xd7\x0c\x57\xba\x0c\x2b\x22\xd2\x32\x6f\xbf\xe7\x39\x0d\xb8\x80\x9f\x73\x54\x7f\xf4\x7b\x86\xc3\x6f\x2b\xf7\x45\x4e\x67\x8c\x4f\x1c\x0f\xa8\x70\xbd\x0e\x30\xbb\xf3\x27\x8e\xc8\xd0\xc5\xe9\xb6\x4a\xff\x0a\xf6\x4b\xab\xc1\x9b\x70\xf4\xcf\x9a\x41\xcb\x8f\x95\xd3\xcd\xe2\x4f\x45\x6b\xa3\x57\x1c\x8f\x02\x1d\x38\xe5\x91\xde\xc0\x5c\xb5\xd1\xca\x7b\x48\xf9\xda\x4b\xd7\x34\xb0\x69\xa9\xfd\x10\x65\x00\xc1\xf4\x08\xab\x7f\xe8\xe4\xa6\xe6\xf3\xed\x64\xda\x0e\xd2\x4b\x01\xe3\x3d\xf8\x47\x5f\x95\xfa\x9e\xd7\x1d\x04\xdd\x30\xb3\xcd\x82\x37\x55\xa3\x40\x1b\xf5\xaf\xae\x10\xee\x7e\x18\xec\x6f\xe6\x37\xc3\x79\x3f\xd4\x34\xb4\x8d\x71\x45\x13\x04\x47\xe0\x02\x99\x10\x10\x52\x55\x8b\x50\x65\x54\xec\x9c\x39\x9f\x62\x94\x1c\x3f\x41\x4c\xbc\x35\x2c\xaa\x34\x5b\x93\x0a\xde\xcf\xad\xda\xc9\x1e\xe5\x3d\x14\x51\xa6\x5e\x06\x20\x10\x26\x32\x5d\xe0\x7c\x93\x1f\x69\xbb\xa8\x68\xa7\xc8\x7e\xe2\x3c\x60\x4e\xc6\x79\x43\x32\x91\x7d\xfe\x2c\x5b\x69\x66\x9b\x65\x97\x06\x91\x7f\x71\xed\xdf\x96"}, -{{0xa8,0xd7,0x3d,0x63,0x9a,0x23,0xcc,0x6a,0x96,0x7e,0xf3,0x1b,0xca,0xbb,0x5d,0x06,0x3e,0x53,0xe1,0xea,0xb8,0xfc,0xc7,0xca,0xb9,0xbc,0x3a,0x17,0xfd,0xe9,0xc2,0xf8,},{0x8d,0xaa,0x9f,0x4c,0x8b,0x1a,0x44,0x69,0x1b,0xf4,0x45,0x21,0xf2,0xf7,0xca,0x45,0xdc,0x7f,0xc6,0x1f,0x6a,0x4c,0xe6,0xf9,0x8f,0xaa,0x41,0xc2,0xa7,0x49,0x77,0xd1,},{0xc4,0xdc,0xef,0x1a,0x24,0x53,0x93,0x9b,0x36,0x4b,0x34,0x02,0x50,0xc3,0x12,0x94,0x31,0x43,0x1d,0x5b,0xa3,0xf4,0x76,0x70,0xab,0x07,0xce,0x68,0x0c,0x69,0xbf,0x28,0xb6,0x78,0x62,0x7c,0x76,0xa6,0x36,0x0f,0xc4,0x0d,0xc1,0x09,0xaa,0x7d,0xea,0x37,0x1b,0x82,0x5e,0x46,0x13,0x4f,0x62,0x45,0x72,0x18,0x2a,0xcf,0x39,0x57,0xe7,0x0f,},"\xfd\x1f\xac\x3d\x53\x31\x3b\x11\xac\xd2\x9f\x5a\x83\xac\x11\x89\x6d\xab\x25\x30\xfa\x47\x86\x5b\x22\x95\xc0\xd9\x9d\xd6\x7c\x36\xed\x8e\x5f\xa5\x49\x15\x0c\x79\x4c\x55\x49\xef\xb5\xc1\xd6\x91\x14\xd5\xd6\x07\xb2\x32\x85\xb7\x21\x2a\xfa\xab\x57\x84\x6a\x54\xae\x67\xb9\xe8\x80\xe0\x7b\x65\x86\x60\x7c\xec\xf6\xd4\xee\xd5\x16\xa3\xa7\x55\x11\xfe\x36\x7d\x88\xeb\x87\x1e\x6d\x71\xb7\xd6\xaa\x13\x67\xa0\x14\x21\xb1\x08\x8f\xc2\xd7\x5e\x44\x95\x4b\x73\x62\x5c\x52\xda\x8a\x3a\x18\x3c\x60\xbe\x9d\xa6\x05\x0f\x59\xa4\x53\xca\xa5\x35\x20\x59\x36\x71\x72\x8d\x43\x18\x77\xbf\xaa\xc9\x13\xa7\x65\xfb\x6a\x56\xb7\x52\x90\xb2\xa8\xaa\xac\x34\xaf\xb9\x21\x7b\xa1\xb0\xd5\x85\x0b\xa0\xfd\xab\xf8\x09\x69\xde\xf0\xfe\xee\x79\x4c\xeb\x60\x61\x4e\x33\x68\xe6\x3e\xf2\x0e\x4c\x32\xd3\x41\xec\x9b\x03\x28\xea\x9f\xe1\x39\x20\x7e\xd7\xa6\x26\xff\x08\x94\x3b\x41\x52\x33\xdb\x7c\xfc\xc8\x45\xc9\xb6\x31\x21\xd4\xed\x52\xec\x37\x48\xab\x6a\x1f\x36\xb2\x10\x3c\x7d\xc7\xe9\x30\x3a\xce\xa4\xba\x8a\xf7\xa3\xe0\x71\x84\xfb\x49\x1e\x89\x1e\xde\x84\xf0\xdc\x41\xca\xdc\x39\x73\x02\x8e\x87\x9a\xcd\x20\x31\xaf\xc2\x9a\x16\x09\x28\x68\xe2\xc7\xf5\x39\xfc\x1b\x79\x2e\xda\xb1\x95\xa2\x5a\xb9\x83\x06\x61\x34\x6b\x39\xef\x53\x91\x5d\xe4\xaf\x52\xc4\x21\xea\xf1\x72\xe9\xda\x76\xa0\x8c\x28\x3a\x52\xdf\x90\x7f\x70\x5d\x7e\x85\x99\xc5\xba\xae\x0c\x2a\xf3\x80\xc1\xbb\x46\xf9\x34\x84\xa0\x3f\x28\x37\x43\x24\xb2\x78\x99\x2b\x50\xb7\xaf\xa0\x25\x52\xca\xfa\x50\x3f\x03\x4f\x8d\x86\x6e\x9b\x72\x02\x71\xdd\x68\xcc\xb6\x85\xa8\x5f\xff\xd1"}, -{{0x79,0xc7,0xdc,0xb7,0xd5,0x9a,0x8d,0xf6,0xb2,0xb2,0xba,0x04,0x13,0x05,0x9d,0x89,0x68,0x09,0x95,0xc2,0x0e,0x91,0x6d,0xa0,0x1b,0x8f,0x06,0x7d,0xc6,0x0c,0xde,0xb4,},{0x29,0x87,0x43,0xc7,0x39,0x18,0xbd,0x55,0x6b,0x28,0xf8,0xd4,0x82,0x4a,0x09,0xb8,0x14,0x75,0x2a,0x7a,0xea,0xe7,0xee,0x04,0x87,0x5c,0x53,0xf4,0xd6,0xb1,0x08,0xd9,},{0x7b,0x7c,0xbe,0x44,0xc7,0x71,0xe4,0x37,0x1b,0xae,0x13,0xb0,0x72,0x2b,0xab,0xcc,0x10,0x64,0x15,0x57,0x32,0x96,0x2f,0x40,0x7c,0xba,0x2a,0xcd,0x35,0x38,0x1d,0x42,0x21,0x0b,0xec,0xe8,0x22,0xf4,0x68,0x11,0x21,0xfd,0x4d,0xab,0x74,0x5a,0x1f,0x30,0x77,0x92,0x2f,0xba,0x1a,0x78,0x04,0x5b,0x71,0x29,0x02,0xba,0xcc,0xac,0x66,0x0e,},"\x5f\xe2\x02\xf5\xb3\x3b\x77\x88\x81\x0d\x25\x08\xa1\x3b\x31\x14\xd6\x9b\x85\x96\xe6\xea\xcd\xa0\x5a\x04\xa2\xeb\x59\x7f\xa3\x27\x9c\x20\x8b\x5a\x5b\x65\xda\xac\xb6\x99\xf1\x44\xe1\xd6\x60\xe7\x8e\x13\x9b\x57\x83\x31\xab\xec\x5c\x3c\x35\x33\x44\x54\xf0\x3e\x83\x2c\x8d\x6e\x29\x84\xdf\x5d\x45\x0e\xcb\x5d\x33\x58\x2a\x78\x80\x8a\x9c\x78\xf2\x6e\xbc\xd1\x24\x4e\xf5\x2e\x3f\xa6\xdc\xa1\x15\xc1\xf0\xcb\x56\xe3\x8e\xae\x0e\x5b\x39\xf5\xfd\x86\x3d\xff\xd0\xb2\xfb\x5b\x95\x8f\x2d\x73\x9d\xb3\x12\xfc\x66\x7a\x17\xb0\x31\xc4\xc9\xf8\xc5\xa2\xad\x57\x79\x84\xcc\x41\x46\xc4\x37\x58\x0e\xfd\x21\x52\x17\x3f\xe0\xd5\x78\x2c\xc2\xae\x98\x31\xa8\xd9\xa0\x41\x77\x25\x60\x18\xff\x76\x31\xe0\xb0\xd8\xa9\x9c\xb2\x8f\x00\x8b\x32\x04\x21\xe2\x7a\x74\xc3\x13\x59\x18\x86\x63\x45\x6d\x85\xe0\x98\xc1\xeb\xd2\x81\x70\x10\x97\xb6\xae\x5a\x87\x1e\x5c\xcc\x02\x05\x8a\x50\x14\x16\xcb\x91\xc1\x2c\xef\x5b\xe6\xf1\x91\x43\x70\xe5\x63\xf1\xa1\xb2\xaa\x41\xf4\xb8\xee\x84\xcd\x32\xa1\xd5\x09\xe5\x29\x78\x7d\x14\xa4\x45\x43\x8d\x80\x7e\xcd\x62\x0e\x2f\xa2\x6d\xe0\xda\x64\x26\x86\x47\x84\xd4\xa2\x8f\x54\x10\x3e\x60\x92\x83\xb9\x9e\xe9\xb2\xb6\x99\xc9\x80\xbb\xb7\x88\x2c\x3e\xa6\x8d\xdc\x90\x80\x2a\xc2\x32\xf2\xc8\xe8\x42\x91\x98\x7b\xf3\xc5\x24\x09\x21\xb5\x9c\xfa\x21\x49\x69\x31\x76\x73\xd0\xbe\x7f\x34\xb1\xca\x0e\x15\xea\x73\xc7\x17\x54\x01\xce\x55\x0b\xe1\x06\xb4\x9e\x62\xf8\xdb\x68\x69\x5e\x74\x0e\x0f\x3a\x35\x56\xa1\x9f\x3c\x8e\x6b\x91\xac\x1c\xc2\x3e\x86\x3f\xcd\x0f\x0d\x9e\xb7\x04\x7a\xa6\x31\xe0\xd2\xeb\x9b\xcc\x6b"}, -{{0xb9,0xce,0xd0,0x41,0x25,0x93,0xfe,0xfe,0xd9,0x5e,0x94,0xac,0x96,0x5e,0x5b,0x23,0xff,0x9d,0x4b,0x0e,0x79,0x7d,0xb0,0x2b,0xf4,0x97,0x99,0x4d,0x3b,0x79,0x3e,0x60,},{0xc1,0x62,0x9a,0x72,0x31,0x89,0x95,0x93,0x37,0xf5,0x53,0x52,0x01,0xe5,0xd3,0x95,0xba,0x0a,0x03,0xea,0x8c,0x17,0x66,0x0d,0x0f,0x8b,0x6f,0x6e,0x64,0x04,0xbb,0x12,},{0xf1,0xb7,0x97,0xde,0xd8,0xa6,0x94,0x2b,0x12,0x62,0x68,0x48,0x34,0x0f,0xb7,0x19,0xfc,0xdd,0xaf,0xd9,0x8f,0x33,0xe2,0x99,0x2d,0x35,0x7b,0xfd,0xd3,0x59,0x33,0xc7,0xac,0x56,0x1e,0x5b,0x2f,0x93,0x94,0x64,0x33,0x8c,0x56,0x66,0x85,0x4c,0xa8,0x85,0xc4,0xd0,0x46,0xeb,0x2c,0x54,0xe4,0x8a,0x1b,0x5e,0xd2,0x66,0xad,0x34,0xde,0x05,},"\x55\x5b\xb3\x9c\x18\x99\xd5\x7c\xab\xe4\x28\x06\x4c\x2d\x92\x5f\x5f\xc4\xcf\x70\x59\xb9\x5f\xb8\x9a\x8e\x9e\x3a\x7e\x42\x6c\x6c\x92\x2d\x9e\x4d\x76\x98\x4e\xa2\x38\x3c\xab\xb4\xf2\xbe\xfd\x89\xc1\xf2\x0e\xaa\x8a\x00\xdb\xe7\x87\xcf\xa7\x0a\xe2\xae\x6a\xa9\x03\x31\xcb\xbe\x58\x0f\xa5\xa0\x21\x84\xed\x05\xe6\xc8\xe8\x9d\x57\x6a\xf2\x8a\xee\xaf\x7c\x4e\x25\x00\xf3\x58\xa0\x09\x71\xa0\xa7\x59\x20\xe8\x54\x84\x9b\xf3\x32\x14\x29\x75\x40\x4f\x59\x8c\x32\xe9\x69\x82\x04\x3d\x99\x2b\xcd\x1a\x4f\xe8\x19\xbb\x56\x34\xad\x03\x46\x7a\xfc\x4c\xe0\x50\x73\xf8\x8b\xa1\xba\x4a\xe8\x65\x3a\x04\x66\x5c\xf3\xf7\x16\x90\xfe\x13\x34\x38\x85\xbc\x5e\xbc\x0e\x5e\x62\xd8\x82\xf4\x3b\x7c\x68\x90\x0a\xc9\x43\x8b\xf4\xa8\x1c\xe9\x01\x69\xec\x12\x9e\xe6\x3e\x2c\x67\x5a\x1a\x5a\x67\xe2\x7c\xc7\x98\xc4\x8c\xc2\x3f\x51\x07\x8f\x46\x3b\x3b\x7c\xc1\x4e\x3b\xcf\xd2\xe9\xb8\x2c\x75\x24\x09\x34\xcb\xdc\x50\xc4\x30\x8f\x28\x2f\x19\x31\x22\x99\x56\x06\xf4\x01\x35\x10\x0a\x29\x1c\x55\xaf\xdf\x89\x34\xeb\x8b\x61\xd8\x14\x21\x67\x41\x24\xde\xc3\xb8\x8f\x9a\x73\x11\x0a\x9e\x61\x6f\x5b\x82\x6b\x9d\x34\x3f\x3a\xc0\xe9\xd7\xbd\xf4\xfd\x8b\x64\x8b\x40\xf0\x09\x8b\x38\x97\xa3\xa1\xcd\x65\xa6\x45\x70\x05\x9b\x8b\xc5\xc6\x74\x38\x83\x07\x4c\x88\x62\x3c\x1f\x5a\x88\xc5\x89\x69\xe2\x1c\x69\x2a\xca\x23\x68\x33\xd3\x47\x0b\x3e\xb0\x98\x15\xe1\x13\x8e\x9d\x06\x50\xc3\x90\xee\xe9\x77\x42\x21\x93\xb0\x09\x18\xbe\x8a\x97\xcc\x61\x99\xb4\x51\xb0\x5b\x57\x30\xd1\xd1\x33\x58\xcf\x74\x61\x06\x78\xf7\xac\x7f\x78\x95\xcc\x2e\xfc\x45\x6e\x03\x87\x3b"}, -{{0x81,0xda,0x16,0x8f,0x02,0xd4,0x6b,0xb8,0x7c,0xda,0x84,0x5d,0xa4,0x3f,0x8a,0x6c,0xba,0x2c,0x01,0x68,0x78,0xd6,0xf4,0x9c,0x6f,0x06,0x1a,0x60,0xf1,0x55,0xa0,0x4a,},{0xaf,0xf8,0x6e,0x98,0x09,0x3c,0xa4,0xc7,0x1b,0x1b,0x80,0x4c,0x5f,0xe4,0x51,0xcf,0xdf,0x86,0x82,0x50,0xde,0xa3,0x03,0x45,0xfa,0x4b,0x89,0xbb,0x09,0xb6,0xa5,0x3b,},{0x4a,0xac,0xa9,0x47,0xe3,0xf2,0x2c,0xc8,0xb8,0x58,0x8e,0xe0,0x30,0xac,0xe8,0xf6,0xb5,0xf5,0x71,0x1c,0x29,0x74,0xf2,0x0c,0xc1,0x8c,0x3b,0x65,0x5b,0x07,0xa5,0xbc,0x13,0x66,0xb5,0x9a,0x17,0x08,0x03,0x2d,0x12,0xca,0xe0,0x1a,0xb7,0x94,0xf8,0xcb,0xcc,0x1a,0x33,0x08,0x74,0xa7,0x50,0x35,0xdb,0x1d,0x69,0x42,0x2d,0x2f,0xc0,0x0c,},"\x6b\xc6\x72\x6a\x34\xa6\x4a\xae\x76\xab\x08\xc9\x2b\x17\x9e\x54\xff\x5d\x2e\x65\xeb\x2c\x6c\x65\x9a\xe8\x70\x3c\xc2\x45\xcb\xc2\xcf\x45\xa1\x2b\x22\xc4\x68\xae\x61\xfd\x9a\x66\x27\xad\x06\x26\xc9\xb1\xe5\xaf\x41\x2c\xb4\x83\xea\xee\x1d\xb1\x1b\x29\xf0\xa5\x10\xc1\x3e\x38\x02\x0e\x09\xae\x0e\xee\x76\x25\x37\xa3\xe9\xd1\xa0\xc7\xb0\x33\xd0\x97\xfd\xc1\xf4\xf8\x26\x29\xa9\xde\x9e\xf3\x8d\xa1\xcf\x96\xa9\x40\x35\x7d\x5f\x2e\x0e\x7e\x8d\xbc\x29\xdb\x72\x8a\x1e\x6a\xad\x87\x6e\x5e\x05\x31\x13\xd0\x64\x20\x27\x2b\x87\xcf\x0c\x40\xdf\xe0\x3a\x54\x4d\xe9\x6c\x7a\xea\x13\xba\x00\x29\xb5\x7b\x48\xd9\x9d\xcc\x6a\x65\x04\x92\xd7\x8c\x4c\xdd\x1b\x28\xe1\xa1\x15\xa7\xe3\xe7\xa7\xcb\x21\x33\x3d\x4f\xf8\x08\x58\xdf\xb6\x77\x82\xc1\x63\x54\xb8\x71\x65\x96\x56\x0d\x7d\x8e\x38\x9e\xb1\x5a\x05\x2a\x0b\xf5\xd1\x6e\xb5\x4f\xb3\xe4\x97\x3a\xd4\x98\x4e\x72\xa1\x87\xf5\x34\x7d\x5b\x26\x2c\x32\xb1\x64\x7e\x42\xb6\xa5\x38\x37\x09\x6c\xc7\x8c\x2a\x05\xce\x1c\x6e\x12\x49\x3a\x03\xf1\xa6\x67\x58\x4c\xb9\x7f\x4f\xcd\x57\xee\x94\x4c\x65\xb7\xee\xd2\x5f\x7a\xe0\xf3\xf6\xce\xde\x17\x3f\xdf\xac\xf5\xaf\x1d\xb1\x43\x73\x0d\x18\x09\x66\x64\x91\x4b\xa4\xcf\xc6\x96\x6f\x39\x20\x22\x78\x1c\x66\xa9\x41\x7c\xa2\x68\x0b\x51\xf6\x3e\x4f\xba\x42\x4e\xcf\xdb\xc6\xa2\xf0\x17\x87\xd0\xe7\x48\x4f\x8a\x8a\xb3\x90\xae\xaa\x6d\x1f\x7e\xd3\x25\xd8\x2f\xea\xa1\x69\x2a\x49\x84\xfa\xe4\x3d\xa8\x73\x29\xb0\x45\xda\x8f\x0a\x4f\x56\xb6\x95\xaa\x93\x5d\xe1\x52\xce\x03\x85\x15\x37\x20\x97\x9a\x2b\x70\x06\xd4\x05\xfc\xb0\xfb\xa0\x9e\x23\xb8\x5f\xd1\x9b"}, -{{0xaf,0x2e,0x60,0xda,0x0f,0x29,0xbb,0x16,0x14,0xfc,0x3f,0x19,0x3c,0xc3,0x53,0x33,0x19,0x86,0xb7,0x3f,0x3f,0x9a,0x0a,0xec,0x94,0x21,0xb9,0x47,0x3d,0x6a,0x4b,0x6a,},{0xc8,0xbf,0xe2,0x83,0x58,0x22,0x19,0x9c,0x61,0x27,0xb8,0x06,0xfa,0xbe,0xef,0x0c,0xb9,0xff,0x59,0xf3,0xc8,0x1f,0xf0,0xcb,0x89,0xc5,0x56,0xf5,0x51,0x06,0xaf,0x6a,},{0x50,0xf9,0xf9,0x41,0xa8,0xda,0x9f,0x62,0x40,0xf7,0x6d,0x2f,0xa3,0xb0,0x6d,0xd6,0xb2,0x29,0x2e,0xd3,0x2d,0x1c,0x05,0x21,0x80,0x97,0xd3,0x4d,0x8a,0x19,0xdf,0xe5,0x53,0xf7,0x6a,0xe3,0xc6,0xb4,0xa2,0xed,0x20,0x85,0x21,0x28,0x46,0x15,0x40,0xde,0xcf,0x41,0x8f,0x52,0xd3,0x8e,0x64,0x03,0x7e,0xec,0x77,0x71,0xbd,0x1a,0xfe,0x00,},"\x7d\xbb\x77\xb8\x8b\xda\x94\xf3\x44\x41\x6a\x06\xb0\x96\x56\x6c\x6e\x8b\x39\x39\x31\xa8\x24\x3a\x6c\xab\x75\xc3\x61\xfd\xe7\xdc\x53\x6a\xec\x40\xcd\xed\x83\x29\x6a\x89\xe8\xc3\xbe\xf7\xd7\x87\xcf\xc4\x94\x01\xa7\xb9\x18\x3f\x13\x8d\x50\x00\x61\x9f\xf0\x73\xc0\x5e\x2f\x84\x1d\x60\x08\x35\x8f\x10\xa2\xda\x7d\xcf\xac\x3d\x4d\x70\xc2\x0d\x2e\xc3\x4c\x7b\x6d\x5c\xd1\xa7\x34\xd6\xbb\xb1\x1c\x5f\xd8\xd2\xbc\xe3\x2a\xc8\x10\xef\x82\xb4\x18\x8a\xa8\xea\x3c\xfc\x30\x32\x23\x3d\xc0\xe2\x60\x0e\x9d\xb6\xe1\x8b\xc2\x2b\x10\x04\x4a\x31\xc1\x5b\xac\xea\xf5\x55\x4d\xe8\x9d\x2a\x34\x66\x80\x7f\x24\x44\x14\xd0\x80\xff\x29\x63\x95\x6c\x6e\x83\xc8\xe1\x44\xed\x00\x66\x08\x8b\x47\x6d\xdc\xb5\x64\x40\x34\x47\xd9\x15\x9f\x90\x89\xab\xa2\xb4\xd5\x57\x5c\x4d\x8a\xe6\x6f\xc8\x69\x0e\x73\x49\xed\x40\x83\x2e\x63\x69\xc0\x24\x56\x3e\xc4\x93\xbf\xcc\x0f\xc9\xac\x78\x7a\xc8\x41\x39\x7f\xe1\x33\x16\x72\x83\xd8\x0c\x42\xf0\x06\xa9\x9d\x39\xe8\x29\x79\xda\x3f\xa9\x33\x4b\xd9\xed\xe0\xd1\x4b\x41\xb7\x46\x6b\xce\xbb\xe8\x17\x1b\xc8\x04\xa6\x45\xd3\x72\x32\x74\xa1\xb9\x2b\xf8\x2f\xd9\x93\x35\x87\x44\xde\x92\x44\x19\x03\xd4\x36\xfd\x47\xf2\x3d\x40\x05\x2a\x38\x29\x36\x7f\x20\x2f\x05\x53\xb5\xe4\x9b\x76\xc5\xe0\x3f\xa6\xce\x7c\x3c\xf5\xee\xb2\x1d\xe9\x67\xbe\xc4\xdd\x35\x59\x25\x38\x4e\xbf\x96\x69\x7e\x82\x37\x62\xba\xc4\xd4\x3a\x76\x7c\x24\x1a\x4c\xef\x72\x4a\x97\x0d\x00\xff\x3a\x8a\xb3\xb8\x3e\xed\x84\x00\x75\xc7\x4e\x90\xf3\x06\xe3\x30\x01\x32\x60\x96\x21\x61\xe9\xd0\x91\x0d\xe1\x83\x62\x2c\xe9\xa6\xb8\xd5\x14\x42\x80\x55\x0f\xc7"}, -{{0x60,0x5f,0x90,0xb5,0x3d,0x8e,0x4a,0x3b,0x48,0xb9,0x7d,0x74,0x54,0x39,0xf2,0xa0,0x80,0x7d,0x83,0xb8,0x50,0x2e,0x8e,0x29,0x79,0xf0,0x3e,0x8d,0x37,0x6a,0xc9,0xfe,},{0xaa,0x3f,0xae,0x4c,0xfa,0x6f,0x6b,0xfd,0x14,0xba,0x0a,0xfa,0x36,0xdc,0xb1,0xa2,0x65,0x6f,0x36,0x54,0x1a,0xd6,0xb3,0xe6,0x7f,0x17,0x94,0xb0,0x63,0x60,0xa6,0x2f,},{0xdd,0x02,0x12,0xe6,0x32,0x88,0xcb,0xe1,0x4a,0x45,0x69,0xb4,0xd8,0x91,0xda,0x3c,0x7f,0x92,0x72,0x7c,0x5e,0x7f,0x9a,0x80,0x1c,0xf9,0xd6,0x82,0x70,0x85,0xe7,0x09,0x5b,0x66,0x9d,0x7d,0x45,0xf8,0x82,0xca,0x5f,0x07,0x45,0xdc,0xcd,0x24,0xd8,0x7a,0x57,0x18,0x13,0x20,0x19,0x1e,0x5b,0x7a,0x47,0xc3,0xf7,0xf2,0xdc,0xcb,0xd7,0x07,},"\x3b\xcd\xca\xc2\x92\xac\x95\x19\x02\x4a\xae\xce\xe2\xb3\xe9\x99\xff\x5d\x34\x45\xe9\xf1\xeb\x60\x94\x0f\x06\xb9\x12\x75\xb6\xc5\xdb\x27\x22\xed\x4d\x82\xfe\x89\x60\x52\x26\x53\x0f\x3e\x6b\x07\x37\xb3\x08\xcd\xe8\x95\x61\x84\x94\x4f\x38\x8a\x80\x04\x2f\x6c\xba\x27\x4c\x0f\x7d\x11\x92\xa0\xa9\x6b\x0d\xa6\xe2\xd6\xa6\x1b\x76\x51\x8f\xbe\xe5\x55\x77\x3a\x41\x45\x90\xa9\x28\xb4\xcd\x54\x5f\xcc\xf5\x81\x72\xf3\x58\x57\x12\x0e\xb9\x6e\x75\xc5\xc8\xac\x9a\xe3\xad\xd3\x67\xd5\x1d\x34\xac\x40\x34\x46\x36\x0e\xc1\x0f\x55\x3e\xa9\xf1\x4f\xb2\xb8\xb7\x8c\xba\x18\xc3\xe5\x06\xb2\xf0\x40\x97\x06\x3a\x43\xb2\xd3\x64\x31\xcc\xe0\x2c\xaf\x11\xc5\xa4\xdb\x8c\x82\x17\x52\xe5\x29\x85\xd5\xaf\x1b\xfb\xf4\xc6\x15\x72\xe3\xfa\xda\xe3\xad\x42\x4a\xcd\x81\x66\x2e\xa5\x83\x7a\x11\x43\xb9\x66\x93\x91\xd7\xb9\xcf\xe2\x30\xcf\xfb\x3a\x7b\xb0\x3f\x65\x91\xc2\x5a\x4f\x01\xc0\xd2\xd4\xac\xa3\xe7\x4d\xb1\x99\x7d\x37\x39\xc8\x51\xf0\x32\x7d\xb9\x19\xff\x6e\x77\xf6\xc8\xa2\x0f\xdd\x3e\x15\x94\xe9\x2d\x01\x90\x1a\xb9\xae\xf1\x94\xfc\x89\x3e\x70\xd7\x8c\x8a\xe0\xf4\x80\x00\x1a\x51\x5d\x4f\x99\x23\xae\x62\x78\xe8\x92\x72\x37\xd0\x5d\xb2\x3e\x98\x4c\x92\xa6\x83\x88\x2f\x57\xb1\xf1\x88\x2a\x74\xa1\x93\xab\x69\x12\xff\x24\x1b\x9f\xfa\x66\x2a\x0d\x47\xf2\x92\x05\xf0\x84\xdb\xde\x84\x5b\xaa\xeb\x5d\xd3\x6a\xe6\x43\x9a\x43\x76\x42\xfa\x76\x3b\x57\xe8\xdb\xe8\x4e\x55\x81\x3f\x01\x51\xe9\x7e\x5b\x9d\xe7\x68\xb2\x34\xb8\xdb\x15\xc4\x96\xd4\xbf\xcf\xa1\x38\x87\x88\x97\x2b\xb5\x0c\xe0\x30\xbc\x6e\x0c\xcf\x4f\xa7\xd0\x0d\x34\x37\x82\xf6\xba\x8d\xe0"}, -{{0x9e,0x2c,0x3d,0x18,0x98,0x38,0xf4,0xdd,0x52,0xef,0x08,0x32,0x88,0x68,0x74,0xc5,0xca,0x49,0x39,0x83,0xdd,0xad,0xc0,0x7c,0xbc,0x57,0x0a,0xf2,0xee,0x9d,0x62,0x09,},{0xf6,0x8d,0x3b,0x81,0xe7,0x35,0x57,0xee,0x1f,0x08,0xbd,0x2d,0x3f,0x46,0xa4,0x71,0x82,0x56,0xa0,0xf3,0xcd,0x8d,0x2e,0x03,0xeb,0x8f,0xe8,0x82,0xaa,0xb6,0x5c,0x69,},{0x38,0xa3,0x1b,0x6b,0x46,0x50,0x84,0x73,0x82,0x62,0xa2,0x6c,0x06,0x5f,0xe5,0xd9,0xe2,0x88,0x6b,0xf9,0xdd,0x35,0xcd,0xe0,0x5d,0xf9,0xba,0xd0,0xcc,0x7d,0xb4,0x01,0xc7,0x50,0xaa,0x19,0xe6,0x60,0x90,0xbc,0xe2,0x5a,0x3c,0x72,0x12,0x01,0xe6,0x05,0x02,0xc8,0xc1,0x04,0x54,0x34,0x66,0x48,0xaf,0x06,0x5e,0xab,0x0e,0xe7,0xd8,0x0f,},"\x19\x48\x5f\x52\x38\xba\x82\xea\xdf\x5e\xff\x14\xca\x75\xcd\x42\xe5\xd5\x6f\xea\x69\xd5\x71\x8c\xfb\x5b\x1d\x40\xd7\x60\x89\x9b\x45\x0e\x66\x88\x45\x58\xf3\xf2\x5b\x7c\x3d\xe9\xaf\xc4\x73\x8d\x7a\xc0\x9d\xa5\xdd\x46\x89\xbb\xfa\xc0\x78\x36\xf5\xe0\xbe\x43\x2b\x1d\xdc\xf1\xb1\xa0\x75\xbc\x98\x15\xd0\xde\xbc\x86\x5d\x90\xbd\x5a\x0c\x5f\x56\x04\xd9\xb4\x6a\xce\x81\x6c\x57\x69\x4e\xcc\x3d\x40\xd8\xf8\x4d\xf0\xed\xe2\xbc\x4d\x57\x77\x75\xa0\x27\xf7\x25\xde\x08\x16\xf5\x63\xfa\x88\xf8\x8e\x07\x77\x20\xeb\xb6\xac\x02\x57\x46\x04\x81\x98\x24\xdb\x74\x74\xd4\xd0\xb2\x2c\xd1\xbc\x05\x76\x8e\x0f\xb8\x67\xca\x1c\x1a\x7b\x90\xb3\x4a\xb7\xa4\x1a\xfc\x66\x95\x72\x66\xac\x0c\x91\x59\x34\xaa\xf3\x1c\x0c\xf6\x92\x7a\x4f\x03\xf2\x32\x85\xe6\xf2\x4a\xfd\x58\x13\x84\x9b\xb0\x8c\x20\x3a\xc2\xd0\x33\x6d\xcb\xf8\x0d\x77\xf6\xcf\x71\x20\xed\xfb\xcd\xf1\x81\xdb\x10\x7e\xc8\xe0\x0f\x32\x44\x9c\x1d\x3f\x5c\x04\x9a\x92\x69\x4b\x4e\xa2\xc6\xeb\xe5\xe2\xb0\xf6\x4b\x5a\xe5\x0a\xd3\x37\x4d\x24\x6b\x32\x70\x05\x7e\x72\x4a\x27\xcf\x26\x3b\x63\x3a\xb6\x5e\xcb\x7f\x5c\x26\x6b\x80\x07\x61\x8b\x10\xac\x9a\xc8\x3d\xb0\xfe\xbc\x04\xfd\x86\x3d\x96\x61\xab\x6e\x58\x49\x47\x66\xf7\x1b\x9a\x86\x7c\x5a\x7a\x45\x55\xf6\x67\xc1\xaf\x2e\x54\x58\x8f\x16\x2a\x41\xce\x75\x64\x07\xcc\x41\x61\xd6\x07\xb6\xe0\x68\x29\x80\x93\x4c\xaa\x1b\xef\x03\x6f\x73\x30\xd9\xee\xf0\x1e\xcc\x55\x35\x83\xfe\xe5\x99\x4e\x53\x3a\x46\xca\x91\x6f\x60\xf8\xb9\x61\xae\x01\xd2\x0f\x7a\xbf\x0d\xf6\x14\x1b\x60\x4d\xe7\x33\xc6\x36\xb4\x20\x18\xcd\x5f\x1d\x1e\xf4\xf8\x4c\xee\x40\xfc"}, -{{0x31,0x01,0x0d,0x1d,0x67,0xeb,0x61,0x63,0x48,0xe8,0x47,0x92,0xb9,0x2d,0x5d,0xc1,0x28,0x55,0x3c,0xb5,0x2f,0x63,0x68,0x15,0x9f,0xe7,0xb8,0x16,0xcd,0x0e,0x7c,0x37,},{0x26,0x65,0x43,0xd9,0x67,0x87,0xca,0x90,0x1f,0xcf,0xf0,0x6e,0x6e,0x43,0x44,0x91,0xae,0x09,0x70,0x88,0x0a,0x5a,0x18,0x7d,0x53,0x5e,0xdb,0x19,0xdb,0x5c,0xab,0xeb,},{0x7b,0x1e,0xb6,0x77,0xc3,0xe5,0xe6,0xa8,0xb4,0xba,0x69,0xfc,0xb7,0xf6,0xb1,0x87,0x0e,0x42,0xa8,0xd5,0x89,0x58,0xa3,0x5c,0x67,0x4e,0x2d,0xb8,0x21,0x07,0x48,0x1c,0x4c,0x7b,0x37,0xf0,0xf6,0x89,0xd3,0x9d,0x9f,0x51,0xe1,0x81,0xb1,0x7b,0x11,0x08,0xc1,0x5a,0x3e,0x27,0xb2,0x9d,0xf3,0xa4,0x31,0x5d,0xcc,0x4f,0xaf,0x12,0x22,0x05,},"\x39\xf8\x9a\x5e\x7a\xa5\x30\xb5\x46\x3d\x49\x8f\x80\x35\xb9\x90\x9d\x55\xda\x52\x7c\xdb\xd4\xde\x6d\x22\x83\x79\xf0\x89\xe6\x08\xa9\x20\x7a\x2c\x5b\x9c\x42\x05\x1a\x60\xc8\xca\x3f\xb9\x7a\x1c\x06\xcd\x74\x7d\x9d\x07\x39\x97\x0c\xeb\x88\xce\x52\x6f\x97\x11\x40\xea\x2e\xc2\x1f\x09\x0b\xa0\x75\xbf\x89\x75\xfa\xa5\x08\xb1\xcc\x10\xef\xa4\x94\xdc\x17\x2e\x6d\x3d\x3f\x3f\x75\xdc\x8e\x0e\x96\xf0\x5c\x0c\xcc\xb2\xf9\x6e\x91\x1c\xfa\x7a\x2c\x82\xc9\x84\x50\x18\xbb\x1f\x9d\x75\xf8\x2e\x3d\xfe\x11\x39\x34\x7b\x2a\xc0\x58\xb0\x14\xac\x93\x76\x0c\x90\xf5\x56\x7a\xb5\xc4\xeb\xa0\x4b\x49\xfb\x09\xdd\xad\xd3\x05\xbe\x51\x1d\xfe\x05\xc9\x6e\xbc\x86\xfd\x67\xb5\xd0\xab\x57\xd8\x5f\x4f\xe5\xe2\xf0\xfa\x9d\x88\xa6\x8f\x0f\x6b\x6b\xc8\xbb\x94\x4e\xb3\xc0\xb1\x75\x57\xe5\x5d\x5e\xa1\x87\xd9\x22\xa4\x28\x13\xe6\x90\x57\xc9\xb6\xa7\xf7\x5e\x49\x92\x1b\x70\x79\xe5\x8f\x8a\x63\x71\x9e\xe3\xe1\xad\x10\xcf\x0e\x8a\x70\xc4\xf1\x54\x02\x18\xb7\x04\x94\xbd\x02\x9e\xe0\x2f\xf9\x72\x7a\x7d\x85\xd3\x77\x91\x9e\xc4\x05\x14\x79\xb7\x0f\x7c\xd6\x76\x77\x23\xfe\x42\xc1\xc7\x89\x9c\x2b\x7c\x1f\x70\x2d\xd6\xb4\xd1\x3b\x67\x2d\x48\x8f\x34\xa0\xe9\x69\xdb\x79\xcc\x2c\xb2\x52\x4a\x94\x8a\x8d\xe4\xc5\xb6\x23\xec\xd9\x0d\x6e\x82\xd9\x70\x33\xc1\x25\x63\x7d\x1c\xd8\xc8\x48\x03\xd8\xfb\xc0\x12\x84\x6f\xfe\x48\x4f\x6c\x02\x14\x92\x58\xf9\x46\x2f\xa1\xe9\x9c\x30\x7d\xd0\x06\x2f\xe0\xb6\xf1\x1e\xee\x40\xc2\x62\x9e\xf7\xc0\xf6\xa5\x10\x72\x59\xea\x5b\x9f\xfb\x6f\x29\xf1\x2c\x32\xf7\xb5\x22\x8c\xab\xc9\x86\xab\x66\x45\x0a\xf9\xdc\xc3\xda\x09\xd0\xe0\xb9\xa4"}, -{{0x8f,0xf2,0x39,0x8c,0xd5,0x1f,0x51,0xd4,0xc2,0xc5,0x78,0x69,0xa2,0x21,0x8b,0x84,0x86,0x82,0x20,0x31,0xf4,0x00,0x72,0x9f,0x4a,0xc4,0xd5,0x90,0x9c,0x48,0xba,0xfe,},{0xa5,0xa8,0x87,0x04,0xb6,0x86,0x77,0xbe,0x3d,0x16,0xc3,0xdc,0x00,0x52,0xcf,0xee,0x6e,0x2b,0x30,0xe0,0x86,0x09,0x05,0x9d,0x4c,0xba,0x52,0xc6,0xd9,0x60,0x61,0xfb,},{0x41,0x7a,0x64,0x78,0x29,0xc9,0x28,0x98,0xe5,0x20,0xff,0x53,0x11,0xda,0xa0,0xa1,0x39,0xcd,0x8f,0xff,0xcb,0x25,0xa1,0x8e,0x6d,0x9b,0x50,0xcb,0x52,0xcb,0xc3,0x54,0x24,0xc3,0x9e,0xbb,0xb5,0xd5,0xac,0x6a,0x6d,0x63,0xf1,0xf5,0x3c,0x4d,0xf2,0x12,0xf7,0x02,0x5a,0x8a,0xae,0xf8,0xe3,0x64,0x93,0xc8,0x74,0xc3,0xce,0x34,0x1a,0x0e,},"\x99\x39\x53\xe4\x7a\x34\x11\x88\xbc\x59\x29\x42\xe1\x55\x7a\xf2\x95\x46\xe4\xe9\x36\x8e\x2f\x1a\x5e\xe9\x80\x6e\x2b\xaf\x66\xb6\x19\x01\x91\xfc\x5d\x2b\x7e\x47\xde\x37\xff\x05\x4f\xb2\xbb\xb1\xf0\x31\x68\x4a\xda\x5d\x60\x7a\xdd\xa3\xd6\x54\x33\x12\x2f\xa9\x04\xe0\x45\x6f\xaa\x84\x10\x9b\xbc\x51\x7f\x8a\xd3\x96\x60\x87\x63\x82\xad\xcf\xed\x0f\x76\x20\xcf\x11\x64\x62\x2e\xac\xd9\x1e\xb3\x7a\x85\x96\x46\x2e\xbe\x9e\xbe\x26\xbd\xc1\xe3\x2c\xc3\x4a\xd4\x6f\xb1\xce\xa4\x20\xe7\x3c\x31\x21\x54\x08\xe6\xd3\x54\x25\xf4\x4a\x82\x9b\x13\x2f\x63\x1a\x3f\x6d\xd4\xb8\x73\xa0\x00\x66\x7e\x19\xeb\x22\xff\xfd\x59\x03\xaa\xa7\xd4\xc8\xfd\xf2\x19\x53\xc3\xc6\x17\x8f\x5f\x8c\xb2\xaa\x6b\xff\x92\x89\x4e\xad\x83\x58\x88\xdf\x06\x0a\x3c\x90\x43\x02\x6e\x0e\x2c\xef\x27\x54\x97\xe7\xd1\x05\xdf\x3b\x64\x4a\x98\xf2\x6b\xf0\x01\x05\xc9\x94\x13\xee\x0a\xf8\x85\x19\x54\xd6\x5c\xeb\x8d\x79\xad\x30\x71\xb8\xbb\x87\xf0\xb1\x97\x43\xd2\x55\x6f\xfd\x98\x19\x83\x0b\x6e\xeb\xf7\xec\xc7\xe0\x45\x66\x1f\x43\x57\x0c\xe9\xfd\xbb\xe2\xd2\x52\x40\x6f\xa9\x0d\x04\x23\x6f\x22\x2c\x42\x9e\xc1\x6b\x12\x87\x22\x4a\xda\x1a\x53\x21\x61\xae\x8b\x48\x1b\xca\xb8\xd4\x7a\xfb\x3e\xd0\x44\x5b\x30\x60\xfd\x67\x59\x17\x98\x56\xf4\x08\x5c\x1e\x58\x5f\xd7\xc1\x40\x97\x99\xaf\x69\x3c\xf4\x27\xbd\x1d\x3d\xc1\x0b\x5a\xe3\x44\x7a\x8d\x2a\x18\xdc\x3a\x12\xa6\x86\x0b\x22\x17\x5d\xd5\xeb\x53\xa0\x95\x04\x32\xe2\xd7\xae\xfe\xce\x8a\xf0\xad\xe3\xd8\x56\x77\x43\xde\x43\x69\x0f\x2d\x25\x37\x23\xc5\xd7\xe4\x8b\xd3\x0d\x29\x37\x59\x37\x01\xce\xcd\xe9\x15\x4b\x76\x65\xcb\x61\x1d\x7d"}, -{{0xef,0x81,0x6c,0x8f,0x5e,0xc3,0x4e,0xf4,0x1f,0x68,0x83,0x1d,0x90,0xcd,0x29,0xe5,0x2d,0xe8,0x97,0x37,0x82,0xd0,0x03,0xee,0x4e,0xda,0xda,0x2a,0xda,0x26,0x91,0xd6,},{0x47,0xf9,0xb3,0x63,0xa8,0x8a,0x45,0x05,0x3a,0x05,0xbb,0x72,0x16,0x08,0x52,0xbf,0xe8,0xf7,0xdf,0xef,0xc2,0xf3,0x72,0x83,0xde,0x34,0x67,0x52,0xca,0xf0,0x92,0xcc,},{0x65,0xc5,0xd1,0x0e,0xa7,0xbf,0xdb,0xb3,0x8d,0x55,0x36,0x4a,0x99,0x68,0xf8,0x2b,0x54,0x82,0x24,0xdf,0xf3,0x36,0x3b,0x2d,0xdc,0xf5,0x85,0x16,0x3d,0xea,0x27,0xdc,0x63,0xb0,0x56,0x3e,0xb1,0xa8,0xdf,0xbe,0xe9,0x51,0xd3,0xc9,0xb3,0x3f,0xcd,0x6b,0xbf,0x09,0x21,0xc3,0xab,0xb2,0x17,0x86,0xb2,0x29,0x06,0x9b,0xd9,0xca,0x00,0x0a,},"\x95\x93\xc3\x5c\xde\xc5\x35\xbe\xbb\x69\x65\xda\x68\xea\xb0\xb6\x46\xbf\xfc\xfb\xd0\x48\x83\xbc\x4c\xef\x90\xd5\xd0\x1f\x01\x8c\x63\xc9\xb0\xdd\xfb\x3c\xef\x5e\x78\x62\x84\xd5\x21\x8c\xaa\xaf\x06\x0e\x92\x88\x95\x2f\x16\x30\x1e\xd8\xa4\xc1\xbc\xee\x25\x63\x56\xa0\xc8\xbd\xa3\x59\xfb\xaa\x27\x82\xb1\x0c\x86\xd1\x8e\x20\xf7\xa0\xec\x99\xb2\x7a\x0b\x4d\xbe\xfc\x0a\x26\x2a\x3b\xf6\x8f\xe8\x14\x44\xdc\xae\x5f\x69\x3e\xb0\xf1\x6e\x6e\xe0\x3f\x8f\xcb\xf3\xa3\x39\x81\x46\xd2\x0e\xc4\xd2\x65\x77\x61\xfd\x03\x20\xfe\xe7\xea\x70\x3c\x49\xa6\xa5\x43\xbc\x9b\xba\x91\x1e\x79\x25\x03\x87\x10\xe8\xc3\x65\x52\xd4\x76\xd6\x02\x7f\x58\xb2\xc5\x2b\xa5\x1a\xd6\x5e\xa4\xf0\x39\xc7\x8f\x96\xb8\x89\x10\x2b\xb4\xbd\xd6\x9b\x68\xe9\xc3\xd4\x5b\x51\x76\xa2\xd8\x2b\x0b\x95\xdc\x32\x10\x16\x37\x0d\xae\x30\xc3\x93\x65\x15\xdb\x04\x64\xc4\x17\x74\x30\x1c\x74\xe4\x2d\x89\xb8\xbf\x4b\x9c\x19\xed\x55\x4b\x12\xfe\xba\xc0\xf6\x0d\xdb\x32\x19\xcc\xc5\x60\x35\x31\xdb\xf2\xeb\x5f\x29\x34\x25\xd7\x2c\xce\xfa\x0c\x7f\x14\x4a\xba\x89\x34\x7b\x29\x6b\xe8\x7f\xf1\x89\x94\xb4\xa0\xc7\x0c\x93\x0f\x05\x93\x03\xb5\xdd\x4c\x8f\xe1\xe6\xbb\xc3\xcd\x68\xc6\xc0\xd8\x42\x46\xdc\x6e\x61\x40\xa2\xab\xd1\x78\x0b\x13\xf1\x59\x4a\x60\x19\xd1\x77\x8b\x7c\xbb\x3a\x3e\x3a\x34\xbf\xae\x72\x97\xf0\xb3\xed\xc3\x76\x94\x1c\x32\x35\x2a\x4b\xe3\x14\xb8\x4a\x9d\x8d\x6d\x7f\x1f\x38\xa0\xad\x37\x98\x02\x0a\xa2\xa3\x31\xa4\x02\xbe\x9c\x70\x44\x84\x74\x4a\x73\x0c\xbd\xed\xcb\x90\x4b\x6f\xde\x70\x8f\xbd\x14\xbf\xdc\x29\xef\xd4\x61\xd1\xd0\xb5\x82\x5d\xe0\xbc\x79\x42\x2b\x69\xa2\x72\x2f"}, -{{0x45,0xeb,0x0c,0x4d,0xfa,0xfa,0x2a,0x76,0x90,0xef,0x57,0x9c,0x09,0x54,0x56,0xce,0xed,0xcd,0x32,0xf0,0xb6,0x14,0x4d,0x0c,0x38,0x0f,0x87,0xfb,0x74,0x4a,0x0b,0x1f,},{0xfc,0x85,0x63,0x2c,0x98,0x38,0x4b,0x5f,0x96,0x82,0xae,0xd9,0xcd,0x66,0x4c,0xf1,0xf4,0x8e,0x58,0x8b,0xe2,0xd5,0x68,0xe5,0xc7,0x34,0x49,0x4d,0xf4,0xc7,0x12,0xb8,},{0x55,0x85,0x1d,0xe8,0xe1,0x09,0x2f,0x78,0x94,0x4f,0x6c,0x6d,0xd9,0x5b,0xf0,0x7e,0x2d,0xbc,0x8d,0xf7,0xf5,0x7a,0xd5,0x76,0x82,0x9b,0x97,0x8e,0x3a,0xf5,0x8a,0x7a,0x8e,0x94,0xed,0x4d,0xcc,0xbc,0x01,0x82,0x46,0x7e,0xdf,0x0b,0xad,0x4b,0xae,0x7c,0xa8,0x4a,0xa9,0xa0,0xc1,0x7c,0x61,0xa9,0xe0,0xdd,0xff,0x1d,0x75,0x25,0xd7,0x04,},"\x6f\x66\xd8\x47\x40\x5a\x03\xd7\xbd\x6f\x8d\x28\x97\xdb\xdf\x04\xe7\x6d\x7d\xf2\xd9\x47\x0a\x49\x96\xb7\xdd\x6d\xb8\x85\x00\xf8\xf4\xf8\x3e\x96\x0e\x21\x9a\x24\x86\xe2\x45\x45\xad\xd1\x36\x14\x55\x04\x14\xd8\x27\xc4\x1a\x9b\x08\x31\x8d\xaf\x01\xb1\x52\x14\xc6\x4a\x42\x66\xcb\xf8\xa5\x71\x7a\xda\x3e\x62\xc2\x67\x29\x07\x3e\x16\xdd\xbd\x66\xf2\xd5\x20\xe1\xe0\x99\x35\xde\x05\xe4\xdb\x11\xc3\x96\xd4\x77\x01\x0a\xec\x66\xaa\xfb\x76\x2e\x69\x23\x8d\x0b\x9e\x76\xb4\x52\x45\x4b\xf9\xe4\x51\xe7\x6a\xc7\x9e\x69\x90\xd4\x1b\x93\x2b\xc3\x29\x17\x09\x37\x83\xc9\x1b\xc9\xcf\x0b\xbe\x3b\x51\x40\x70\xa1\xe6\x92\xff\x34\xfd\x06\xb6\x6e\xa1\x1f\x39\xe1\x0a\xf9\x33\xee\x96\xd8\xe9\xb6\x77\xcb\x03\x73\x7e\x79\x64\xee\xaa\x72\x5f\x12\x12\x07\xf9\xc1\xb2\x6a\x96\xc6\x16\xdf\x7c\xb7\xca\xef\x47\xbd\xa9\x01\x36\x8f\xf2\xea\x58\x6e\x42\x2e\x65\xbf\x21\xa6\x91\xbd\xd2\xc1\x3e\x67\xff\xf5\x8c\xfb\xfe\xd8\x17\x82\x04\x9d\xaf\xa0\xf7\x27\xdf\x88\x62\x3f\x2f\x7e\x8f\x26\x2d\xaf\x93\x95\x42\xa1\x87\xb8\x72\x0a\x9b\x6b\x2b\x09\x89\x0e\x54\x87\x6b\x28\xa4\x38\x74\xab\xbe\x3b\xfa\x98\x1f\x81\x38\xb7\x72\xc5\xd5\x17\x36\x88\x5f\x86\xac\xac\x22\x15\xa0\xb0\x10\xdf\xc2\xc6\xb1\x50\x84\x5d\x4f\x82\x96\x25\x25\x86\xa3\xe1\x15\xf3\x03\xc3\xd8\xa5\x82\xe2\x0f\xd2\xd4\x3f\x6c\x44\x6e\x5d\x00\x28\x0e\xc1\x79\x82\x3b\x7f\xb4\xc1\xb0\xfe\xb9\x4e\xb4\xef\x17\x07\xf5\x18\x4e\x3b\x52\x46\x1a\x75\x62\xd1\xf3\x07\xcb\x75\x1c\xdb\xbf\x6e\xae\x49\xff\xae\x91\x86\x23\x58\xe7\x4e\x95\x48\x82\x2b\x8a\x04\x9f\xec\x6b\xf4\xc7\xa9\x9c\xab\xbe\x09\x20\x65\x77\xb6\x57\xe3\x1f"}, -{{0x70,0x9d,0x2e,0x19,0x90,0x06,0xf5,0x36,0x9a,0x7a,0x0b,0xdd,0x34,0xe7,0x4d,0xc7,0x84,0xbe,0x33,0x88,0x0e,0xa3,0xc5,0xdd,0x10,0xed,0x5c,0x94,0x45,0x1e,0x79,0x72,},{0x06,0xf9,0x89,0x20,0x2b,0xa2,0xcb,0xc9,0xc1,0x50,0xbe,0x61,0x12,0x62,0xac,0xa0,0x0c,0x45,0xf0,0x12,0xf8,0x9f,0xba,0xf8,0x9f,0x8c,0xec,0xcb,0xa0,0xb1,0x93,0x4a,},{0x62,0x9b,0xf9,0x7b,0x0c,0x78,0xee,0x6a,0x9c,0x87,0x59,0xfb,0xea,0x28,0x22,0x4e,0x27,0xab,0xbb,0x6c,0xbe,0x4d,0xea,0x5b,0xb7,0x97,0xe6,0xe0,0xfe,0x80,0xc9,0x13,0xf9,0x53,0xe3,0xa9,0xb6,0x23,0x35,0x2d,0x13,0xac,0xf4,0xce,0x62,0x50,0xfb,0x02,0x9a,0x1e,0x19,0x8d,0x72,0xbd,0x5e,0x74,0x02,0xe6,0x0e,0x9e,0x48,0xca,0x35,0x01,},"\x62\xf0\x03\x14\x0f\xa0\x9e\x03\x87\xd1\x87\xa0\xff\x96\xc4\x56\x3d\xf9\xf4\xe2\x8c\x22\x82\xc0\x18\x3a\xc3\xee\xde\x13\x12\x35\x49\x21\xf7\x80\xfc\xa5\x36\x1d\x30\x68\xd2\x99\x49\x63\x0b\x75\x30\xcd\x59\x14\xac\xe0\x46\x8d\x01\x4b\x6f\x53\xd8\x39\xb8\x2e\x38\x81\x7d\xbf\x2d\x83\x92\xc3\xce\x34\x24\xea\xb8\x6a\x24\xd8\x04\xc7\xac\xb1\xce\x7a\xcf\xe0\xa1\xcd\xa4\x39\x39\x24\x28\x31\x05\xda\x4a\x77\x41\x19\x6e\x02\x75\x50\x04\x7f\x85\xb7\xa0\xa0\x1d\x45\x41\x24\xef\xc0\xe2\x99\xf0\xef\x9a\xd1\x43\x50\x54\x30\x53\x48\x22\x61\x52\x8b\xaa\x56\xe6\x59\x99\xac\x80\x2c\x00\xa3\x36\x26\x7c\x63\x51\x06\xb2\x64\x03\xc1\x9f\x39\x1d\x53\xbd\x82\x86\x1d\x6d\x48\xa4\x38\x0b\x30\x43\xaa\x91\xd6\x49\x53\x68\x81\x20\x4e\xcc\xb0\xde\x20\xd4\x3e\x5a\x37\x55\xb7\xf6\x00\x91\x6e\xcc\xae\x42\xa0\xc9\x05\x3b\x46\x2d\x94\x17\xa1\x3d\x67\xd7\x78\x26\x4a\x89\x6e\x8e\xaf\x90\xba\xf6\x6d\x29\xe5\x43\x8a\x71\x67\x81\x12\x3a\x89\xfa\x9b\x8b\xee\xf9\x1d\x96\x5a\xf2\xf4\xa1\xa5\xbd\x5d\x2e\x2a\xaf\x46\xd5\xc9\x4b\x77\x09\xcd\xd3\x8d\x05\xfe\xee\x4b\xfb\x76\xa3\x59\x07\x7c\x16\xbc\x4b\xe9\x11\x6e\x69\x00\x12\x71\xcd\xa5\x65\xbc\x19\xbf\x47\xd4\xf9\x86\xbd\x9c\x0d\x18\x4c\xd8\xa3\x52\x0c\xa1\xbd\xb4\xb5\x05\xaa\xf7\xcb\x4e\xc9\xf9\x47\x89\x77\x9d\x30\x71\x4e\x79\x11\x6d\xd5\x01\x9d\x59\xb2\x8b\x17\xda\xd9\x6f\x4e\x21\x55\xad\x9c\x61\x27\x4a\xdd\xc6\xb6\x38\x10\x95\x04\xe9\xed\x19\xf4\xed\xa5\x37\x77\x62\x64\x8c\x40\x98\x22\x4e\x33\x91\x04\x3e\x4c\x2a\xd5\x91\x65\x4c\x9e\x7f\x97\x4e\xfd\xf0\xb0\x50\x4b\x6f\xa5\xf6\x46\xce\xcf\x44\xcd\x37\x24\x12\x37\x25\x05"}, -{{0x51,0x51,0x61,0x74,0x21,0xaa,0xdc,0x9c,0x95,0xa4,0x42,0xb4,0x5e,0x7f,0xf6,0xde,0x06,0xa2,0xc7,0x33,0xb8,0x5b,0xd7,0x89,0xfb,0xad,0x41,0x4e,0xe3,0xc9,0x1a,0xdd,},{0x14,0x94,0x1d,0x55,0x97,0x61,0xb3,0x0a,0xb0,0xa8,0x6d,0x47,0xe0,0xf7,0xd1,0x89,0x6b,0x33,0x78,0x45,0x27,0xc8,0x0a,0xf4,0x1c,0xb8,0x48,0x10,0xcb,0xff,0x9d,0xbf,},{0xfa,0xe4,0x77,0x3b,0x33,0x44,0x60,0xc7,0x7b,0xf0,0x1e,0xc6,0x36,0x6c,0x4f,0xe6,0x1c,0x0c,0xab,0x57,0xd8,0xa4,0xb0,0x39,0x09,0xc6,0x19,0xe1,0x1e,0xe3,0x46,0x1c,0x13,0xfa,0x21,0x57,0x6f,0x63,0x87,0x0e,0x42,0x3d,0xd0,0x41,0x81,0xe4,0xa7,0x01,0x3a,0x75,0x24,0xf2,0x46,0xfe,0x33,0x85,0x3c,0x67,0x41,0x62,0xa7,0x81,0x51,0x04,},"\x21\x6e\x9d\x40\xbc\xdc\x3b\x26\x50\x18\x8d\x12\x1c\x9f\x8e\xf2\x9e\x91\x4f\xac\xd0\x22\xfe\x01\xb9\x0e\xd1\x12\x25\xf2\xeb\x93\x53\x8e\x5f\xce\xe5\xab\x80\x45\xe9\x19\x9a\xa7\x6a\x16\xbd\xd0\x61\x68\x05\x66\x0e\x24\x7f\xec\xd7\xe2\x28\x21\xb6\x9b\x1f\x8e\x8a\x58\xac\x3f\xb8\x56\x91\xd7\x5d\x59\x57\xa1\xda\xf5\x3f\xf9\xee\x64\x76\xd7\xc4\xbc\x54\x1e\x6a\xd3\x8e\x3a\x34\xea\x90\xfc\x52\xa4\x8b\x93\x99\xf9\x2d\x17\xc9\xbb\x0d\x7f\xc3\x10\x4c\x55\xd0\xef\xb4\xea\x5b\x83\x1f\xf9\x49\x0b\x3f\x79\xf4\xd9\xd6\x99\x59\x4b\x74\x15\x66\xf2\xb5\x0a\x8f\xc7\x8c\xc4\x03\xfa\x40\xf5\xab\xb6\x63\x8a\x32\xf4\x49\xa8\xb3\xef\x02\x9c\x40\x2f\x46\x93\x1a\xd2\xbd\x3e\x8e\x68\x31\x08\x71\x4c\x98\x9a\xe2\x16\x89\xe9\xc4\x44\xb9\xf5\x5b\x81\x11\x9b\xb5\x03\x5b\xcf\x73\xe9\x7c\xe4\x3a\x22\x18\xc7\xbc\x3e\x43\x0d\x1e\x81\x4f\x34\xde\xe0\x57\x26\x5d\x31\x94\xb9\xf4\x38\x75\xd8\x38\x1f\x52\x5f\x78\x57\x6e\x64\xce\x69\x25\x84\xfa\xa3\x0f\xb7\x43\xa1\x2d\x1b\x77\x61\x4d\x2e\x10\xa6\xb8\x56\xb5\x2b\xe2\x7c\xdb\x63\x0b\xa1\xf0\xd3\xa6\xf8\xea\x98\x44\x54\x2e\x58\x4e\xa0\xa2\x77\x75\x27\xd0\xc5\x2a\xca\x94\x9a\xac\xda\x45\xad\x83\xd1\x6d\x5c\x83\xd6\x63\xad\xb7\x9c\xad\x6f\x3e\x39\xe9\x90\xfe\x28\x2a\x14\xc3\x53\xaa\x23\x79\xd7\xf0\x6a\xda\xb7\x4c\xea\x02\x1b\x89\x83\xa5\x7f\x1d\x0c\xf7\x03\x29\x2e\xb0\x5e\xce\x89\xc5\x3f\x3a\x12\x65\x61\x0e\x0c\x1e\xa8\xdd\xd4\x44\xd1\xff\xd6\xbc\x3d\x03\xf0\xa6\xe4\xd0\xdf\x5c\x5b\x8d\xc1\xf9\x5d\x9f\x55\x58\xb1\x18\xaf\xe6\xbe\xa0\xf6\xc2\x93\x13\x63\xf0\x3a\xb3\x4e\x75\x7d\x49\x36\x41\x74\xf6\x58\xef\xbb\xf3\x8d\xc1\x77"}, -{{0x38,0xbe,0xd4,0x45,0x55,0x6d,0xe7,0x44,0x82,0xbf,0x5f,0xec,0x05,0x06,0xf9,0xaf,0x33,0x0b,0x15,0x1e,0x50,0xd4,0x77,0x4d,0xfe,0x85,0x91,0xd7,0xb7,0xe0,0x27,0x6b,},{0x4c,0x0f,0x9c,0x49,0xa4,0x2f,0x40,0x47,0xbf,0xe6,0x88,0x55,0x51,0xc5,0xe4,0xb8,0x56,0xcf,0x77,0x1a,0x67,0xaf,0x3f,0x89,0xdb,0xf6,0x02,0xf9,0xdb,0x92,0x20,0xf3,},{0xf7,0x02,0xd0,0xd4,0x63,0x28,0x2f,0xc7,0xfd,0x5f,0x8f,0x90,0x29,0xb8,0x9c,0x62,0x6c,0xaf,0xd8,0x34,0x50,0xc3,0xbb,0x9d,0xd8,0xf6,0x58,0x9f,0x0c,0x4b,0x4b,0x71,0xf6,0x49,0xea,0x21,0x2e,0x5e,0x33,0x48,0x7c,0x59,0xc1,0x68,0xea,0x3a,0xd8,0x31,0x50,0xf1,0xfc,0xdf,0xe8,0xc5,0x3e,0xba,0x65,0xad,0xc2,0x02,0x3c,0x25,0x83,0x0f,},"\x0f\xf0\x03\x1d\xf0\xbe\xef\xf3\x71\x0c\x6b\x76\x3f\x9b\x8e\xc8\x17\x19\xbf\xa1\x52\x8c\xe4\x65\x19\xad\xf3\xd3\x41\x2d\x93\xfb\x18\x8f\xd4\x97\xd5\xd1\x70\x91\xc0\xf0\x34\x59\x60\xdd\x0e\xb0\xc0\x9f\xc4\x00\x51\x73\x66\x5d\x4d\x97\xf9\x5c\x13\x82\x8b\xc7\x6b\x34\x92\xb8\x7a\x4b\x64\x25\x3c\x8b\x5f\xa4\x7a\xa7\x5f\xa3\xb8\x6d\x5a\xbe\xea\x8d\xe5\x95\x9a\x60\x22\x89\x13\x6f\x60\xa6\x9b\x30\x9e\x77\x3b\x22\x55\xcd\xe1\x9e\xd2\xa2\xe1\x99\xc3\x3d\xb1\x1c\x16\xad\xe0\x8a\x31\x97\x50\xb8\x51\xd9\x2c\x69\x29\x24\xfc\x98\x59\xbe\x52\x34\x31\xcb\xe7\x8e\xc0\x92\xdb\x11\x29\x21\x0e\xbb\xea\xa7\xc2\xa2\xc0\x00\xee\xb1\x05\xca\x03\x01\xa4\x8f\x3e\x45\xfd\xfb\x15\xb2\x75\xcb\xab\x83\xca\x5c\x99\xd7\x37\xa5\x85\x32\x0e\x9e\x3b\x31\x71\x79\xbd\x86\x46\x7f\xa9\x69\x4f\xcd\xb2\xac\x6a\xd3\x6e\xd7\x14\x48\x43\xdb\xc3\x4e\x42\x3d\x35\xaf\xd7\xd8\x97\x2a\x1c\x43\xc1\x99\xa1\x91\xab\xd6\xce\xba\x49\x36\xd3\x95\xc9\x95\xa3\xeb\x13\xcb\x05\x7f\x88\xa9\xdc\x94\x90\xfe\x98\x84\x5e\xe5\xd2\x6a\x89\xfb\x64\x2a\x2a\x51\x6d\xc3\x05\x6c\x54\xd3\x63\x72\x13\x36\x3a\x86\x28\xa4\x2a\x39\x5d\x94\x2b\x95\x4a\x89\xe8\xef\x7a\x74\x4d\x8a\xe5\xad\xac\x88\xc6\x16\xef\xaa\x90\xe2\x07\x72\x05\xa6\x0b\xaf\xfe\xde\x5c\x87\xbb\x14\xde\xad\x30\x62\x29\x49\x5f\x69\x8f\x3e\x49\x06\x16\x96\x6b\x16\x36\x38\x7d\x0d\x86\x18\x3f\x94\x5b\x24\xa9\xdc\xfc\xcf\x4d\x36\x72\x2c\xd1\x2e\xbb\x6b\xd8\xe7\x83\x25\x75\x2a\xfa\x2b\x1a\xbd\x13\xc4\xbd\xbc\xad\xd1\x70\x86\x91\x36\x82\x62\x42\xac\xfb\x72\x1d\xe5\xff\x27\xba\x8a\xa0\xc0\x18\xb2\x25\xed\x34\x04\x80\x3c\xe9\xfa\x2d\x50\x8d\x89\x44"}, -{{0x05,0x54,0x60,0xb3,0x2d,0xd0,0x4d,0x7f,0x4b,0x23,0x11,0xa8,0x98,0x07,0xe0,0x73,0xfd,0x55,0x65,0x65,0xa4,0x77,0x18,0x57,0xd8,0x82,0x79,0x41,0x30,0xa2,0xfe,0x5d,},{0x26,0x0f,0x8f,0xed,0x4b,0xba,0x30,0xb9,0xe1,0x2a,0xd8,0x52,0x3f,0xbb,0x6f,0x57,0xf0,0xa7,0xa8,0x82,0x55,0x00,0x61,0xf1,0xda,0x46,0xfb,0xd8,0xea,0x44,0x22,0x21,},{0x23,0xf4,0xf1,0x62,0x7f,0xba,0xbd,0x78,0x91,0xd7,0xd8,0x48,0x96,0x31,0xc7,0x23,0x1d,0x22,0xde,0x71,0x86,0x4e,0x26,0x2a,0xb4,0xda,0x84,0xea,0x8a,0x13,0xa6,0x0f,0xea,0xc4,0xdc,0xfb,0x18,0x12,0xf1,0x20,0x04,0x44,0xb7,0x75,0xf1,0x21,0xd7,0x26,0x6d,0x75,0x5c,0xe9,0xb6,0xa9,0xad,0x79,0x65,0x59,0xc0,0xa2,0x6b,0x51,0x6d,0x02,},"\x74\x07\xf9\x6e\xe3\xe7\x9c\x69\xd3\x6c\xe1\xf6\x4e\x4f\x18\x86\x55\xea\x68\xb9\x47\xe7\xe2\xbe\x97\xb0\x5e\xbc\x6d\x44\x39\xe9\x50\x27\x6e\xf3\xf0\xe6\xa0\x3d\xd4\x8b\x24\xf6\x69\x29\xb4\x9c\x15\x80\xeb\x46\x88\x07\xe1\xe7\xa2\x5e\xb9\xb9\x4d\xa3\x40\xc5\x3f\x98\x4f\x8b\x81\x60\x3e\xfb\x61\x04\x7b\xf3\xf1\x4b\x68\x6d\x97\x98\x00\x3d\x2f\x68\x58\x9a\x79\xeb\xfa\xd5\x44\x09\xc7\x1c\x90\xff\x67\xc1\x1f\xbd\x76\xcc\x72\xc2\xd1\x45\xf4\x58\xe4\x2f\x88\xb7\x5d\x25\x0e\xad\xca\xfe\x66\xbf\x37\xff\xc8\x37\xb6\x2f\xf0\x06\x68\x5b\x7f\x85\xa9\xd8\x75\xfc\x07\x8c\x82\xe6\x1f\xe3\x5d\x19\x22\x52\x7a\x55\x1d\xab\x62\xf9\xe4\x77\x49\x91\x46\xba\xd9\x12\x20\x3e\x66\x4c\x41\x7c\x36\x79\xc0\x2d\x87\x2a\xba\xc0\x03\x2f\x8c\xc7\x7f\x77\xbf\xe5\x4d\x33\x26\xfd\xee\x92\x76\xa4\x8e\xa4\xeb\x25\x13\x50\x40\x68\x82\xd0\x8c\x83\x0e\x76\x49\xfe\x68\x54\x55\x8a\x75\x13\xab\x2d\x8d\x2a\xc3\xe5\xce\xd8\xa8\x08\xd2\xae\xe4\x54\x77\x9e\xda\xbd\x1a\xa6\x3b\xb1\x9f\x71\x8f\x47\x0b\xdc\x84\x51\xcd\x9b\x29\x49\x41\xe3\x49\x70\x63\xb1\xe3\x9b\x6c\xa1\x84\x56\x2f\xe8\x38\xcb\xfe\xee\x92\x2d\xe2\x4d\xdf\xcf\x98\x82\xc5\xe6\x15\xb1\x1b\xf9\x04\x81\x7f\xbd\x64\x71\x39\xdb\x80\xb4\xe8\xfe\xb3\x7f\x11\xe1\x85\x2d\x7e\x87\x6d\xb9\xcb\x63\xc9\x4d\x7e\xe3\x41\x92\xf7\x20\x0b\x5b\xc7\x7a\x03\x11\xae\x43\xb8\x06\xeb\xd4\xc2\x89\x6c\x53\xf5\x8f\x7e\xbc\x16\x25\xcb\x20\xd7\x10\x7e\xf9\xdb\x0d\xa2\x87\x88\x52\x3d\xe9\x91\xef\x6c\x58\x66\xb1\x8d\x8d\xe8\x3a\x95\x4d\x32\x81\xe0\x6d\xbf\x27\xc4\xf2\x38\x2e\x08\xcd\x0e\x0f\x6e\xba\xe3\xf9\x61\xb7\x7f\xce\x5a\x95\xa9\xb0\x62\x1b\x75\x6f"}, -{{0xe9,0xf6,0xd3,0x1b,0x93,0x69,0x42,0xc5,0x26,0xe0,0xf9,0xec,0x4f,0x5a,0x7a,0xc2,0x5f,0xa7,0x89,0xe0,0xc4,0x34,0xbc,0xd9,0x19,0x9d,0x72,0x0c,0x74,0x3c,0x84,0xc4,},{0x32,0x12,0x6d,0x26,0xe2,0x82,0x31,0xc5,0xb5,0x85,0xb1,0x3f,0x43,0xa0,0x1c,0x6f,0xe5,0x42,0x94,0x6b,0x07,0xd3,0xa9,0x1e,0x57,0xd2,0x81,0x52,0x3f,0x5c,0xb4,0x5c,},{0x7e,0x3b,0x1c,0x4c,0x71,0x6c,0x80,0x8e,0x90,0xb9,0x74,0x45,0x89,0x15,0xf3,0xb2,0x23,0x9c,0x42,0x07,0x71,0x19,0xfe,0x27,0x07,0x88,0xfa,0xe5,0x20,0x57,0x8b,0xd7,0xda,0x64,0x88,0x04,0x41,0x32,0xe1,0xbe,0xf2,0x3e,0x3b,0x23,0xc3,0x4d,0x9c,0x18,0x62,0x74,0x4f,0x28,0xfc,0xae,0xcd,0xa6,0xca,0xc0,0xfd,0x72,0xb9,0x3b,0x6a,0x0f,},"\xe8\x81\x33\xf3\xd1\x76\x42\xd5\xc2\x27\x79\xa8\x53\x16\xba\x0d\xf3\x4c\x79\x2b\x4e\xfe\xe4\x9e\xd7\xdd\x93\xca\x33\x22\xef\x47\xc7\x2e\x5b\x2e\x45\x95\xc7\x78\x00\x43\x4b\x60\x71\x9a\xdf\x54\xe4\xc1\xa3\x4c\x89\xfa\x1e\x27\xee\x8d\x35\xa0\x92\x1f\x97\x55\xac\x4a\x77\xa6\xc1\x68\x4e\xa0\xf5\xc8\xee\x5f\x75\x9c\xe5\x9b\xfe\x83\x15\x80\x0a\x67\xaa\x6c\x64\xdd\xfa\xac\x92\xea\xbe\x6c\x2c\x61\x37\x79\x78\x4b\x3a\xff\xaf\xcc\x62\x0f\x2a\x6d\xc5\xcb\x8d\x8d\xc7\xd7\x4a\xa4\xd7\x94\x94\x67\x84\x94\xe5\xe6\x39\x4c\x43\x3c\x14\x80\x9f\xf4\x0c\x9a\x59\x2d\x0d\x69\x4a\x81\x10\x3b\x44\x53\x1e\x1f\x48\xbc\x13\x96\x5d\x15\xaf\x8b\xf3\x34\x04\x88\xf8\xcd\x58\xf0\x9a\xe1\xa6\x61\x6b\xf8\x5a\xc9\xde\x7e\x0c\x66\x96\xaa\x2f\x1b\xec\x15\xe1\x7a\x44\xda\x4a\x84\xed\xb4\xec\x6d\x77\x24\x77\x88\xba\x0d\xe3\xae\x12\xa1\x55\xcb\xed\xc0\xda\x2f\x56\x8e\xef\x0b\x75\xa8\x77\xea\x5b\x0c\x2c\x0d\x4b\xf2\xc6\x1d\x46\x8a\x46\xfa\xad\xfa\xec\xe3\x5f\xc2\x63\xa9\xbe\x99\x87\xf4\xf7\xf7\x8f\x05\xc7\x07\x78\x43\x78\xc7\xb8\xf7\xda\xf9\xac\x3a\x12\x2a\xad\x39\xa1\x67\x79\x66\xda\x9e\xf2\x86\xc9\xe0\x62\xc4\xf4\x39\xad\x0b\xdd\xea\x26\xe5\x4b\x2f\x73\x88\xe2\x38\xb2\xa6\x49\x28\x45\x0d\x34\x56\x4c\x5a\x44\x7e\x7a\xfb\xbe\xdd\x10\x85\xf1\xf2\x4c\x11\xae\x08\x43\x22\xd1\xa3\x2c\xf8\xaa\x47\x39\x41\xf0\x0d\x56\xb1\x61\x82\x13\xca\xb3\x90\x0a\xa6\x06\x46\x3d\x9f\x80\x0e\x92\x6f\x9f\x42\xd4\xb0\x82\xd8\xc5\xec\x3a\x4a\x02\x5b\x45\xf9\xaa\xdc\x8b\xcb\xd1\x70\x91\xb3\xda\x49\xe9\x45\x3d\xc5\x5e\x89\xb5\xb5\xfe\x6b\x31\xf5\xed\xda\xd1\x0b\x66\x01\x57\x25\x68\xd8\xe2\x05\xd3\x25\x1a"}, -{{0x6b,0xf4,0xca,0xaa,0xbb,0x96,0x85,0x4a,0x38,0xa5,0x72,0xf4,0xce,0x6c,0x78,0x38,0xf7,0xe7,0x50,0x11,0x8c,0x73,0xf2,0x72,0x35,0x82,0x61,0x8e,0x23,0x07,0xf8,0x38,},{0x08,0x12,0x63,0x73,0xd0,0x56,0xf0,0x0e,0x54,0xb8,0xd4,0x3d,0x77,0xc3,0x5f,0x5f,0x91,0x98,0x33,0xe9,0x0d,0x8a,0xaf,0xd6,0xc8,0x24,0x6d,0x27,0x91,0x7a,0xd0,0x91,},{0xd2,0x11,0x3f,0x80,0xd6,0xcf,0x92,0x84,0x86,0xa2,0x50,0xa6,0x79,0xd6,0xe7,0x4b,0x35,0xea,0x9d,0x26,0x06,0x1f,0xa9,0x4d,0x76,0x9e,0x1a,0x8f,0xbf,0xa0,0xa7,0x34,0x22,0x7f,0x55,0x53,0x7e,0x4e,0xbf,0xf5,0x93,0x36,0xdb,0x14,0x1c,0xf5,0xd6,0xd4,0x82,0xa0,0x71,0x1f,0x1e,0x9f,0xc7,0x2f,0xf7,0x09,0x56,0xa1,0x1b,0x4f,0xb9,0x09,},"\x47\x76\xe9\xd6\x00\x85\x48\x1f\xa5\x37\xbf\x29\x5b\xda\xbd\x8b\x1c\xf6\x32\xa8\xcd\x40\xbc\xe6\xbd\x32\x5c\x12\x9f\x97\x70\x00\xe8\x84\x68\xeb\xf2\xdc\x15\x8a\xc0\xf2\x07\x21\x2d\xb0\x0f\xb6\x0b\x8e\xc8\xba\xe2\x29\x37\x2e\x9a\x6b\x01\x53\x0a\x7e\xd1\xbc\x9d\x38\x9e\xc8\x91\x3f\x59\x03\x0d\x5b\x54\xaf\x56\xae\x1c\xcc\x28\xf3\x7c\xc9\x6a\x8e\x53\x20\x4e\x92\xa6\x77\x76\x6a\xdf\xaa\xda\x99\xb0\x28\x1f\x86\x7f\x61\xac\x9f\xf7\xd9\x72\xee\x3e\xd4\x27\xd7\x2f\xaa\xe7\x5d\x4a\xec\x01\xb5\xff\xc3\x70\x61\xb6\xf0\xf7\xe5\x71\x4c\x4c\xf3\x0d\x5b\x73\x1b\x07\x46\x06\x5f\x19\xe4\xc8\x92\x2d\xde\x64\x2f\x80\xfe\x24\xa3\xc8\xdc\xb2\xe5\xf1\xc2\x66\xe2\xaf\x6c\x37\xde\xcf\x55\xa2\xba\xa5\x4f\x0d\x5c\xf0\x83\x93\x70\xc3\xe0\xb4\xe7\x7a\x4f\x36\xbb\xb3\x16\x20\x14\x93\x3a\x4a\x4e\xbc\xae\x8c\x60\x96\x1a\xc6\xdc\xf1\x34\xf3\x08\x28\xd3\x14\x02\xae\x74\xe7\xe8\x51\x3c\x9d\x2a\xd8\xee\x46\xb7\xa9\xd5\x3a\x1f\x87\xeb\xfc\xe0\x4f\x46\x1b\xde\xd1\x74\x9b\x6f\xc4\xc4\xf2\x57\x93\x52\x56\x92\xd7\xa0\xe4\x26\xc8\x4e\x06\x08\x2c\xc3\xe6\xab\xb5\x13\x68\x37\x0c\xbb\x10\x6c\x7a\x08\x97\xf6\x6d\x92\xc9\x73\x9c\xff\x9f\x27\x06\xd6\xa2\x98\x0e\xce\xa3\xac\x49\x45\xf0\xf4\x7e\x65\x6b\xd9\x63\x77\x77\xe8\x53\xd2\xa8\x39\x10\x43\x27\xdc\x04\x9e\xbc\x34\xf0\x49\xd6\xc2\xf8\x0e\xca\x99\xdb\x7b\x41\x84\x24\xac\xef\x75\x22\x60\xd2\xd4\x27\x94\x93\x23\x99\x7c\xd9\x61\x7e\xdf\x50\xd4\x41\xd0\x08\x8b\x1d\x47\x91\x2e\x35\xcf\x54\x23\x15\x26\x58\x29\xf3\x83\xf4\x58\x60\xd3\xb4\x5e\x73\x5b\xb2\xf8\x58\x6d\xcf\x58\xdb\x4f\x2a\xcf\xb4\xa6\x88\x53\xa9\x6e\xed\x7b\x89\x76\x9d\x36\x56\x13"}, -{{0x5d,0x95,0x85,0x73,0x6a,0xb2,0x09,0xb0,0xab,0xe8,0xbf,0x74,0xac,0xa4,0xee,0xa4,0xf6,0xd1,0x65,0x0b,0x53,0x25,0x50,0xa2,0x23,0xe0,0x44,0x58,0x0f,0x8e,0x20,0xde,},{0xe7,0x77,0x29,0xed,0xfd,0x21,0x44,0xb2,0xb1,0x20,0x78,0x76,0x54,0x17,0xfa,0x21,0xf1,0x59,0x4f,0x09,0xb2,0x69,0xe9,0xb6,0x70,0x68,0x02,0xb4,0xf3,0xbd,0xfe,0x85,},{0xe7,0xb0,0x8e,0x1d,0x58,0x09,0xfd,0xd8,0x52,0x94,0x43,0xd6,0x5a,0xda,0x5d,0xd6,0x55,0xea,0x55,0xb5,0x41,0x5a,0x01,0x13,0x93,0xbe,0x70,0x71,0x67,0x64,0x86,0xd3,0x58,0xe8,0xd2,0xa4,0x60,0xeb,0xe0,0x75,0xb0,0xe7,0x01,0xb2,0x4c,0x9e,0x3a,0xb5,0xf2,0xb0,0x33,0x59,0x2d,0x4d,0xe3,0xb7,0xf3,0x7f,0xd5,0x41,0xf6,0x92,0x09,0x09,},"\x08\x69\x35\x91\xe6\xc5\x8a\x5e\xad\x9c\x85\xfe\x8e\xc5\x85\x08\xf8\x1a\x34\x67\x63\x6c\x2d\x34\xfc\xc1\xf4\x66\xe5\xc6\xda\xfd\xc3\x7c\x35\xcb\xee\x35\x58\x9c\x69\x97\xe2\xb1\x54\x48\x13\x27\x44\xe5\xa1\xe1\x31\xbb\x49\xbf\x5c\x25\x63\xf8\x7e\xad\x3e\xfe\x01\xe8\x8c\xbf\x24\xcc\x17\x69\xc7\x8c\xdf\xc1\x67\xe3\x78\x21\x5b\x15\x85\x9c\x7a\x28\xec\xe7\x0e\x18\x8f\xa3\x30\x26\x7d\x3f\xc5\x7b\x4a\xce\x6c\x15\x20\xec\x67\x87\x50\x67\xfd\x33\xbe\x86\xf4\xa1\x96\x7a\xfb\x3e\xb1\x64\xc7\x97\xcf\x28\xd8\x07\x2a\xa6\x9d\x82\xaf\xa3\x83\x74\xf8\xe5\x79\x7c\x4c\x28\x47\x1b\x7d\x69\xf5\xb9\xc7\xb4\xac\xdb\xc1\x9f\x3c\x5c\x5d\x40\x08\x08\xa9\x82\xa4\x78\x37\xae\xd1\xb3\x84\x1d\x69\x89\x0e\xeb\x31\x49\x4e\x10\xe3\xe5\x13\xd1\x2d\x0c\xa6\x86\xc7\xce\x65\x17\x78\x09\x27\x03\xfe\xf0\xdc\xc0\x21\x40\x77\xdf\xb3\x61\x25\x1b\xde\xa4\x36\x4d\xd4\x1b\x97\xbc\xeb\x0f\xb1\x47\x5a\x50\xe4\x70\x8f\x47\xf7\x87\x8c\x74\x40\x1e\x97\x71\xcc\x3f\xce\xac\xe8\x91\x69\x98\x1a\xa7\x72\x50\x85\x00\x90\xd1\x81\xd8\x35\x8e\xbb\xa6\x5e\x29\x0a\xcb\x03\x52\xbe\xce\x8c\x57\x98\x32\xa6\x01\x55\x18\x16\xd1\xc0\x56\x21\xcc\xbb\xee\x0f\xbe\x39\xea\x2f\x19\x53\x93\x19\x9e\x69\xc2\x34\xc2\xfb\x1c\x37\xe4\x74\x84\x08\x60\xce\x60\x91\x61\xfc\xfc\xe2\x86\x95\x74\xbe\x0d\x38\xf9\x5e\x20\xf4\xf8\x72\x52\x47\xb9\x62\x7b\x46\xe8\x34\x90\x51\x01\xac\x12\xb9\x34\xcb\xf8\x7c\xb2\xd1\x90\xd2\xf5\x14\x90\xa8\x2c\x4e\x81\x0e\xdd\xb8\x1f\x95\x6a\x9f\x36\xbd\xa4\x97\xbc\xa5\x06\xa4\x9e\xe9\xcd\x47\xfd\xa5\xb7\xf2\xb8\x84\xa3\x64\x8c\xad\xd1\x2a\xb6\x18\x98\xad\xa4\x6e\xcc\x97\x0f\x81\xdc\x9f\x87\x68\x45\xdb"}, -{{0x60,0xb1,0x42,0xf1,0x65,0x11,0x41,0x43,0xca,0x30,0xa6,0x04,0xfe,0xf5,0x1c,0x68,0x64,0x36,0xaa,0x1b,0x9a,0xfd,0xb2,0x66,0xb3,0xe3,0x98,0xcc,0xb3,0xc4,0xd8,0x55,},{0xea,0xf6,0xc5,0xa7,0x6c,0xa9,0x9b,0xf7,0x30,0x64,0x98,0x88,0x8c,0x3b,0x7a,0x1f,0xea,0xe9,0x8b,0xf8,0x98,0x8d,0x7f,0x2e,0x15,0x47,0xf8,0xf5,0x3a,0x45,0x28,0xaa,},{0xa6,0x21,0xf0,0x84,0xea,0x1a,0x36,0xef,0x81,0x2a,0x97,0x55,0xc9,0xaf,0xbb,0x53,0xda,0xda,0xae,0x6b,0x3a,0x53,0xfa,0x83,0x44,0xca,0x40,0xd3,0x61,0x2a,0x26,0x8a,0x35,0xfe,0xd0,0xfd,0x39,0x8a,0xb7,0x5b,0xcd,0x63,0x9c,0x54,0x79,0x37,0xc9,0x41,0x55,0xab,0x1a,0x7a,0x34,0x67,0xdd,0x4b,0xfd,0xdf,0xac,0xab,0x16,0x55,0xe9,0x08,},"\x18\x15\xde\xe1\x17\x3b\x78\x26\x47\x20\xd3\x5b\x7c\xc2\x45\x4a\x00\x0a\x65\xff\xf2\x14\xe2\x47\x3e\x20\xbc\x83\xf3\xec\xde\x9c\x04\xc1\xe0\x69\x6c\xe6\xe5\x55\x19\xdd\x2a\x75\xce\x04\x64\xbf\x60\x1a\xdc\x38\x1e\x79\x3e\xcb\x9f\x8c\xe7\xab\x87\xb6\xca\x2a\x3e\x41\x0f\x63\x90\x69\x45\x19\x78\xd1\x48\x73\xd3\x39\x0f\xab\x86\x23\x96\x97\x13\xc3\xdf\xcd\x58\xd8\x6d\x12\x40\x73\x76\x1e\xe0\x9a\x65\x2a\x48\x76\x7f\x96\x46\xcb\x72\x6a\xc4\x54\xac\x9a\x1b\xc5\xfa\xed\x30\x26\xb7\x03\x98\x2b\xc2\xb1\xe0\x75\x82\x10\xe1\xd6\x25\x19\x23\x0e\xb2\xb2\xf4\xa4\x86\xbc\x55\x16\x85\x60\xc4\x36\x3d\xf5\xff\x5a\xdf\xda\x11\xac\x7e\xf5\x1b\x18\x19\x6c\x94\x33\x7c\x07\xae\xf1\x17\x99\x0f\x77\x0c\x0f\x1e\x8c\x0f\x88\xeb\x6f\xfc\x40\xe8\xed\x7c\x3a\x80\xa6\x32\xdb\x1e\x7f\x63\xb6\x30\x96\xe2\xac\x49\xe5\x77\x92\xb3\x11\x43\xe2\xf4\xfa\xab\xce\xae\x66\xb2\x74\x71\x68\x1c\x36\xfc\x11\x39\x00\x7f\x9b\x54\x8c\xdc\x6e\x3b\x8f\xbb\xda\xba\x7a\x8a\xdb\x84\x34\x31\x23\x8b\xb4\x61\xba\x24\xf6\xe0\x9f\x62\xc7\x2d\x63\x77\xb4\x04\x8c\xb0\x13\x4c\x25\xa5\x41\x1a\x20\xbf\xcf\xc1\x3e\x48\xd8\x0e\x36\xbf\xb0\xda\x7e\x01\x85\xd3\x3f\x19\x28\x63\x6e\x15\xde\xe0\xe5\xdf\x89\x92\xa1\x65\x72\xb1\x3e\xa8\xf7\xcf\x85\xca\xe3\x2d\x52\x9f\x66\xe8\xf6\xd2\xfb\x2a\xd0\xbb\xfe\x71\x99\x16\x9b\x25\x67\xba\x00\xc7\x81\xb2\x0a\x48\xe1\xd7\x0d\xf9\xfa\x31\x19\xcd\x7e\x5b\xbe\x58\x88\x4b\x0b\x51\x21\x89\x40\xfa\x81\x5f\x85\x62\x5f\xa2\x03\x47\x1c\xee\x80\x84\x78\x0e\xb0\xb9\x35\x6f\x9f\x3d\x4f\x6d\xf7\x40\x30\x1d\x70\x7e\xf1\xff\xb3\x51\x9e\x3f\x90\xb8\x06\x4b\x98\xe7\x0f\x37\x5d\x07\x14\x26\x88\x17\x18"}, -{{0x73,0x4b,0xa4,0x70,0x33,0xc6,0x14,0x02,0x32,0xdd,0x4a,0x7a,0x14,0xf1,0xa7,0x74,0x3e,0xef,0xe9,0x07,0x0b,0xad,0x96,0x62,0x49,0x16,0x30,0xcc,0x9d,0x28,0xc1,0xf3,},{0x2f,0xa5,0xdf,0x30,0x26,0xd6,0x07,0x42,0xe2,0xaf,0xf6,0xb5,0x78,0x42,0xc7,0x12,0x68,0x46,0xc8,0xa7,0xbb,0xe9,0x26,0x6e,0xfa,0x7b,0x3f,0x23,0x98,0xc3,0x57,0xea,},{0x9b,0xd0,0x74,0xd1,0xd0,0xbd,0x28,0x00,0x1b,0xaf,0x7d,0x2d,0x4e,0x82,0x43,0x5d,0xf0,0x8c,0x42,0x64,0xd8,0xcb,0xb1,0xc3,0x81,0x18,0x3c,0x2f,0x01,0x22,0x3f,0x79,0xf9,0x49,0x23,0xca,0x17,0x8c,0xac,0x75,0x56,0x4e,0x16,0xc7,0xf5,0x60,0x79,0x08,0x8f,0x7e,0xd8,0x85,0xde,0x4d,0x50,0x9f,0xbc,0x78,0xf4,0x38,0xfb,0xa3,0xf6,0x07,},"\x5d\x3c\x65\x98\x10\xc3\xfe\xa5\x2a\x6d\xf3\x86\x1e\x5c\xdc\x5b\x70\x3c\xc1\xce\xf4\x85\x58\xc6\x1d\x8c\x51\xd0\xed\xea\x5a\x14\x79\xcf\xe5\x06\x3d\x82\xde\xd9\xca\x68\x1e\x57\x48\x88\x7c\x40\xec\xfb\x9e\x1a\x9a\x8b\x7f\x85\x09\xd1\x07\x76\x46\x1c\x39\x23\x39\x96\x93\xa7\x81\x89\x08\x91\x78\xd5\xaa\xbd\x15\xf8\xc8\x46\x64\x2b\xe4\x7d\x6d\x4c\xaf\x13\x82\x4e\xdc\xef\xb8\x09\x86\x8f\xa7\x2d\xdf\x03\x5c\x4d\xe8\xef\x0a\x9c\x83\x22\x64\xf6\x6f\x01\x27\x61\xce\x69\x55\xbc\x3c\x41\x6e\x93\xe2\x91\x88\x02\x5e\xbb\xb1\x3a\x55\x32\x58\xc1\xd7\xc4\x99\xc9\xa4\xae\xb1\x0b\xb3\x6f\x61\xd1\xbb\x4c\xec\x5a\xe5\x5d\x17\x57\x22\xb9\xa9\x69\x6d\xf8\x81\x95\x1e\x35\x20\x0b\x96\x53\xcf\x6e\xd4\xb3\xd1\x5d\xe0\x87\xa9\xd1\xc3\x19\xfc\xe8\x58\x21\x56\xbe\xbf\x3f\xc9\x1e\x0e\x61\x0f\xf7\xa1\x53\x08\xfd\x1d\x2c\x60\x69\xfb\xbb\x29\x47\xd3\x11\x07\x31\xd2\x45\xae\x29\x63\x01\x4b\xd7\x6d\xea\x42\xdb\x12\x5c\xec\xc4\x93\xc8\xe9\x09\x1a\x76\x64\x65\x77\x72\x9a\xed\x49\x66\xfc\xe9\x69\x9f\xe1\x2e\x36\x7d\x66\x5d\xf9\xe9\x5a\x91\x93\xe1\x13\x3e\x14\x3a\xf9\x2f\x82\xb6\x6a\xc7\x76\x4e\x50\x33\x17\x86\x90\x52\x18\x09\xa7\x10\x7d\x8a\xe9\xb8\x8e\x0e\xd1\xf3\x5b\x17\x19\x90\x1b\x93\x0a\xd0\xe1\xcb\xce\x7f\xb3\x02\x67\xb1\x15\x52\x04\xf6\x05\xf5\x25\xe4\x9d\xe2\x98\x8e\xa7\xf7\x4b\xe8\x81\x51\x77\xfd\x97\x6a\x1b\xcc\x12\x6d\x9c\x9c\x13\x5c\x5b\x42\x76\xd3\x80\x19\xc3\x4a\xef\xb7\xa0\x22\x0f\x7f\x5a\xef\xf3\x80\xae\xd6\x27\xb0\x70\xc2\xc9\xe2\x15\x33\xbb\x35\xc0\x8e\x39\x4c\x85\xae\x25\xe6\x86\x29\x42\x59\x9c\x65\xdb\xae\x59\x77\xa5\x84\xa8\x81\x80\xe0\xc8\xc7\x1e\x5a\x84\x09\xe0\x4e\xf7"}, -{{0x45,0xe3,0x4d,0x0e,0xf4,0xc1,0x96,0xfa,0x6d,0x57,0x2b,0x6b,0x17,0x74,0xb5,0x21,0x8f,0x7c,0x32,0x91,0x30,0x4c,0x13,0x50,0x0d,0xf7,0x07,0x0d,0x90,0xe8,0x03,0x9e,},{0x13,0xa7,0x30,0x4d,0xff,0x42,0x33,0x59,0x17,0x7a,0xba,0xfa,0x5e,0x65,0x08,0xd2,0x67,0x69,0xca,0x99,0xcf,0x8a,0xf4,0x5c,0x38,0x3f,0x3f,0xf6,0x34,0x40,0x60,0x03,},{0xb4,0x2c,0x1f,0x92,0x5f,0x4b,0xac,0xcd,0x12,0x9e,0xfb,0x10,0x9d,0xb3,0x54,0xac,0xa3,0x1c,0x68,0x98,0xf4,0xf4,0x51,0x29,0x47,0x49,0xa2,0x6a,0x6d,0xa1,0x67,0x7b,0xd3,0xa5,0xc0,0x41,0x19,0xe3,0x5f,0x47,0x31,0x9f,0x20,0xcf,0xdf,0xc0,0x8b,0xb4,0x52,0x8b,0x21,0x00,0x9e,0x00,0xbd,0x41,0xeb,0xc0,0xf4,0x68,0x63,0xbe,0xd1,0x0b,},"\x3d\x9e\xd5\xc6\x4b\x75\xe1\x35\xdf\x2f\x5e\x85\x30\x0d\x90\xf2\x1b\x36\x39\x35\xe2\x81\x75\x56\xfc\x93\x11\x75\x1b\xa7\x53\x54\x77\xde\xc8\x35\x6e\xc3\x85\xef\xb8\x2b\x41\x40\x62\xf3\x5b\xb6\xd3\xed\xea\xfd\xe3\x05\xf9\x90\x0a\x25\xe9\x81\x3c\x9e\xe0\x23\x7d\x46\x40\x96\x50\xcd\xcd\xb5\xdf\xa2\x30\x1a\x8e\x26\x47\xf8\xd3\x81\x9d\x86\xf7\xb7\xe3\x07\x0d\x33\x44\x0f\x82\xc4\x05\x4b\x1a\xb5\xed\xeb\xeb\x27\xf9\x5b\x3c\x4c\x6f\xdd\x46\x8f\x21\x60\x0f\x03\xb3\x49\x4d\xa2\x00\xba\xb9\x29\x3c\x38\xd0\x2f\xc4\x40\x48\xe5\x2f\xf5\xfd\x0f\x72\x17\xa0\x4d\x4c\xe9\x12\xa1\x80\xd1\x62\x8f\x36\x82\x80\xb6\x89\x26\x72\xe8\xff\x98\xd4\x62\x9a\xc2\x8b\x60\xc0\x2a\x30\x1e\x6c\x60\x26\xc1\xb9\xe9\xef\x21\xcf\x03\x92\xdf\x22\x50\x08\xd5\xa0\xe0\x28\x4b\x28\x26\x31\xad\x17\x10\xf8\x11\x61\x56\x97\x06\x6c\x98\x29\x65\x19\x94\x8a\x7c\xfe\xd5\xae\xeb\x45\x4e\xe7\xa6\x1c\xc2\x71\xbd\x3d\x49\x9b\xe1\x7d\xf0\x9d\x3a\x0e\x79\x0e\xe6\xb9\xbd\x99\xe1\xb9\x19\xbe\xd4\xa0\x63\xb8\xd1\xa3\x4f\x1a\xfd\x2e\x95\x2b\x9d\xfe\xfd\x77\x09\x69\xc8\xb2\xfc\x37\x97\x7a\xbb\x0f\xee\x63\x17\x25\x3a\x23\xec\xc9\x75\x78\x16\x89\x73\x33\x4c\x8f\x91\x76\x3a\xb9\x7f\x29\xc4\x9b\xae\xee\x7b\x35\xf3\xae\x7f\x5c\xd3\xa4\xa6\xe6\x97\xef\x25\x5a\x3c\x2e\xc0\xc7\x52\xa3\x39\x6f\x69\xf6\x63\xca\x1f\xc2\xb3\x32\xdf\xe6\xc0\xfa\xf7\x8a\xfe\x9c\x68\xd9\x95\x71\xe8\xe8\x96\xc5\x09\x30\x85\xe9\x86\x3a\x27\x64\x8a\x9e\x58\xf3\xa9\xa8\x4c\xbb\xfe\x2b\x41\xca\x36\x33\xdd\x5c\xf6\xe8\x2c\xb7\x7c\xec\xac\xad\x8d\x78\xb3\x53\xf4\x8d\xb4\x2d\x99\xc3\x6b\xca\xd1\x70\xea\x9e\x98\xab\xb2\x78\x8c\x33\xa3\xc7\x06\x26\x8f\x36\x31"}, -{{0x88,0x8c,0xe2,0xec,0xce,0xda,0x9c,0xa2,0xb9,0x48,0xac,0x14,0x43,0xc2,0xae,0xdd,0x75,0x95,0xaa,0xcf,0x36,0xed,0xaf,0x27,0x25,0x5b,0xde,0x7a,0x69,0x91,0xdc,0xc0,},{0x01,0x6e,0x57,0x2b,0x4f,0x98,0x41,0x7c,0x6e,0xe2,0x97,0xab,0xd7,0x84,0xea,0x48,0x22,0x6f,0xf4,0xfb,0xf0,0x05,0x0a,0x5a,0xde,0x88,0x06,0xe7,0x04,0x6d,0x3b,0xa3,},{0x99,0xd8,0x3f,0x14,0x8a,0x23,0x6e,0xbb,0xef,0x1c,0xad,0x88,0xcb,0x3c,0x76,0x94,0xf4,0x98,0x6c,0x92,0x50,0xe2,0x1c,0x36,0x03,0xa0,0xd9,0x41,0xbf,0xf1,0x99,0xcf,0x77,0xd6,0xce,0x99,0xef,0xdb,0x20,0x53,0x31,0x88,0xd6,0x8a,0xd1,0x33,0xde,0x03,0x3a,0x1f,0xb3,0x46,0x8a,0xbb,0x70,0x6d,0x2b,0x8b,0x4f,0xba,0xc0,0x8d,0xfe,0x03,},"\x5c\x80\x1a\x8e\x66\x4e\x76\x60\x76\x0a\x25\xa5\xe1\x43\x1a\x62\x15\x9f\xc3\xf3\xaa\x71\x37\x80\xae\x7c\xbc\xe2\x3b\x85\x64\x78\x27\x99\xbf\x2b\xe4\x81\x7e\xe2\x92\x19\x65\xba\xb7\xe1\xd4\x48\x33\x82\x4c\x16\x28\xd4\x2d\xce\xe3\xe4\x6a\xe4\x2b\x28\x16\xd0\xa4\x32\xa1\xab\x0b\xd2\x1f\xcf\x30\xad\xb6\x3d\x8d\xd7\x65\x69\x54\x43\x43\xd0\x03\x5c\x76\x05\x22\xca\x68\xbe\xa7\x2c\x40\x4e\xdd\xa1\xe9\x09\x5e\xc9\x0f\x33\x25\x68\x1c\x6d\xe0\xf4\xc1\x2d\x1a\xfb\xcb\xa2\xc7\x87\x1a\x1b\x1e\x1f\x19\xc3\x5b\x0b\xed\x9e\xc2\xa8\x7c\x04\x3d\x36\xd8\x19\x39\x6b\xd5\xd0\x99\xe1\xaa\x09\x03\x91\x29\x7c\x73\x3f\x65\xa8\xc5\xd2\x12\x0c\x67\x63\x53\x16\xfa\xb2\x5b\x4d\x48\x47\xa4\x5f\xc3\xf7\x6f\x2e\x24\x26\xdb\xee\x46\x29\x97\x50\x62\xfc\xe1\x4e\x21\x89\xdb\xa2\x7f\xb1\xde\xd2\x45\x3f\x00\x1d\xeb\xfa\xa8\x99\xc1\x16\x60\x61\x2d\x2c\xe2\xad\x2f\x76\x2e\xa5\xde\xe7\xe7\x1e\x58\xad\xcd\xce\xfa\x79\xe8\xe8\xb2\x7f\xc4\xcc\xf8\x9a\xab\xf1\x76\xb5\xd3\x4f\x82\xdd\x15\xd8\x89\xf9\xf0\x87\xdc\x9a\xe8\xa4\x2a\x72\xf3\xb8\x35\x83\x61\x6e\x17\x06\x37\xcd\x1a\xdf\x38\xaa\x65\x51\xcb\xac\xca\x36\x02\xbd\xc7\xae\x21\x0c\x4a\x44\x6b\x3a\xf8\xdb\x27\x20\xe5\x49\xbb\xed\xb8\xbe\xd2\x15\xae\x00\xf1\x9d\xa2\x9d\x8f\xb0\xb6\x42\xd2\x7b\x2d\x88\x57\x5f\x0e\xe8\x4f\x3d\x12\x9e\xb7\x74\xd2\x0f\x53\x7a\x1c\x0f\xdc\xf7\x17\xbd\xeb\xcf\xe4\x7f\x83\x31\xa3\x41\x86\x43\x46\xfa\x6a\x1c\x6b\xbf\xd1\x78\x81\x9e\x38\x7a\x0d\x54\x99\xa6\x8e\x81\xcc\x9f\x82\xad\x39\xe3\x1e\x4d\xfe\x71\x95\x2d\x5e\xa5\xcc\x80\x52\xa3\xce\xed\x17\x51\xf5\x9d\xc7\xec\xc9\x74\x2f\xad\x14\x4e\x18\xdd\xa8\xd0\x58\x2e\x74\xe3\x9c\xa8\xc4"}, -{{0x61,0x73,0x90,0x85,0x7d,0xc1,0x0c,0xdf,0x82,0xb5,0xc9,0x42,0x61,0xf5,0x8c,0xe2,0xd4,0x4a,0xa2,0xf5,0x7d,0x29,0x8f,0x08,0xa2,0xd6,0xc7,0x4d,0x28,0x14,0x7d,0xaf,},{0x89,0xe0,0xc3,0xe0,0xa0,0xf1,0x30,0xd1,0x91,0x6e,0x0e,0x38,0x49,0xb7,0x28,0x6f,0xa2,0xe3,0xac,0x4c,0x17,0xbd,0x1f,0x71,0x6e,0xe5,0xa7,0x2f,0x02,0x57,0xfb,0x8d,},{0x63,0xe9,0x0a,0x6a,0xfb,0xbb,0xb0,0xee,0x69,0x6b,0xfb,0x56,0xef,0xd6,0x79,0xd6,0x8a,0x98,0x51,0xa8,0x94,0x76,0x40,0xa9,0x7f,0x41,0xf6,0x8e,0xdf,0xea,0xdd,0x21,0x6e,0xd8,0x69,0x8e,0x2e,0x43,0xc8,0x20,0xc9,0x04,0x4c,0xaa,0x7a,0xda,0xab,0x5b,0x76,0x76,0x2b,0x68,0x18,0x31,0xa9,0xf7,0x60,0x47,0x6a,0x84,0x43,0xc4,0x3c,0x06,},"\x1f\xd9\xe7\x45\x3e\xaf\xfd\x7c\x9b\x54\x05\x56\x22\xdd\xe1\x70\xdd\x58\xb7\x1c\xb9\x45\xde\x75\x35\x1d\x5f\xce\xb1\xf5\x36\xbd\xe2\x51\x58\xf0\x37\x86\x15\x5f\x95\x3d\xc2\x07\xa1\x70\x8f\x90\xd9\x5b\x15\xac\xa0\xae\xe3\x09\x7f\xdc\xaa\xe8\x5e\x4a\xb1\xc2\xcd\xb7\x05\xc5\x3e\x6c\x2e\xd2\x1a\x99\x4b\x30\x4a\x75\xca\xf2\xce\x4f\xc7\xd6\x1f\x56\x1e\x74\xe2\x97\x39\x7e\x2c\xde\x5c\xc6\x90\x56\x94\x03\x43\xaa\x81\x37\x5d\x0a\xf1\x8d\x17\xd2\xf3\x4c\x0a\x71\xdc\xf1\xde\x3c\x4f\xc4\x88\xa1\x4c\x5f\xa6\xb3\x33\x7a\x31\x74\xb1\xda\x79\x58\xfb\x00\xbd\x59\x55\x14\x82\x21\x42\x7c\x60\xdb\xa0\x41\x17\xc8\x0d\x24\x88\x65\x6d\xbd\x53\x43\xde\x89\x12\x87\xb5\x0e\xf4\xdf\x98\x25\xed\xa7\x6b\x49\x77\xf3\xac\xd4\xab\x6d\x31\x02\xfa\x56\x87\x83\x06\xcd\x76\x56\x14\x91\xbc\xfd\xaa\x1d\xa5\x67\xe6\x77\xf7\xf0\x3b\xae\x5d\xbf\x44\x26\xc3\xc4\xa6\xc3\xd0\x82\xf9\x17\x8b\x2e\xfd\xd2\xbd\x49\xee\xe9\x7e\xf4\xdc\xf3\xf0\xf5\x1b\xbd\xef\xfe\x5a\xe6\x60\x1e\x28\x01\x95\x18\xf8\x27\xf0\x2e\x51\xf6\x67\x9b\x87\x15\x97\x8b\xec\x3e\x69\xd5\x77\x15\x6d\xd7\x19\x95\x93\x71\xba\xf0\x34\x21\x9f\xbb\xd1\x7a\x23\x69\xa8\x54\x14\x90\xf6\xa0\x20\x13\xe3\x3e\x74\xf4\x76\x9b\xe3\x7a\xef\xa4\xde\xfb\x6b\xfb\x3f\x35\x1c\x2a\x26\x14\x82\xc2\xfb\xec\x49\xf8\x5f\x84\x45\x45\x6e\x8f\x5a\x47\x40\x30\xcd\x72\xd0\x95\xef\x6a\x62\x20\x30\xe1\xe4\x3a\x0c\x5d\xeb\xb0\x34\x73\x1d\x2f\x5e\x8e\x4b\xa3\x99\x0f\x07\x7d\x0c\x16\x26\x49\xd1\xfa\x3e\xa4\xfe\x1e\x81\xd7\x4a\xa8\x49\xe2\x1b\x05\x9d\x96\x6c\xba\xd4\xc4\x93\xca\x10\xba\xfe\x7a\x69\x24\x3e\x3c\x0a\x6e\xbf\xd1\x3d\x69\x79\x06\x30\x33\x92\xba\x65\xd4\xfe\x06\xb6\xa5"}, -{{0x87,0x7d,0x01,0x74,0x36,0x36,0x9e,0xc2,0x45,0x3f,0xed,0x46,0xe9,0x77,0xd6,0xac,0xc3,0xa7,0xbe,0x60,0xd3,0x13,0x95,0xad,0x6e,0x7e,0xa9,0xe0,0x74,0x80,0xe4,0xc9,},{0x4e,0x65,0x42,0x2f,0xed,0x33,0x4a,0x55,0xe8,0xb6,0x73,0x89,0x3e,0xba,0x7c,0x18,0x1d,0xd7,0x24,0xdd,0xa0,0x02,0x81,0x7b,0x0b,0xae,0x28,0xac,0xdc,0x3f,0x7f,0xc0,},{0x76,0x88,0xf3,0xf2,0x40,0x1e,0xac,0xaf,0x2d,0xd8,0x8e,0x17,0x0f,0xf1,0xc4,0xd7,0xe9,0x48,0x22,0xa7,0x7f,0x6b,0x55,0x0b,0x56,0x9e,0x82,0x15,0x2b,0xbb,0xb4,0x34,0x05,0x7e,0x01,0x23,0x0b,0x05,0xce,0x58,0xee,0x1d,0xee,0x52,0x26,0xb5,0xc7,0xcd,0xbe,0x5a,0x8a,0xde,0x3b,0x94,0x65,0xf5,0x9a,0xed,0x74,0x14,0x5d,0x14,0x33,0x0c,},"\x4e\xd3\xf5\xbd\xbd\x41\xd0\xe3\xb0\xa8\xa7\xfc\x37\x52\xee\xa4\x96\xd6\x14\x16\x78\xcb\xfe\x06\x75\x7f\x61\xe1\xa1\x68\xd7\x61\xb6\xda\x83\x05\x2f\x79\x94\x95\x0d\x24\x62\x6f\x00\x4f\xbe\x9b\x8c\x95\x62\xe0\xc9\x55\xfb\x3b\x5c\x08\xfd\x2d\x3d\x25\x83\x93\xa3\x49\x03\x0c\x8e\x15\x62\x05\xb4\x04\x83\x03\x8b\xe1\x95\x9f\x1c\xba\x49\x0a\x87\xfe\x13\x89\x9e\x4f\x37\x52\x06\x3b\x68\xfe\x3e\x1c\x50\x71\xf7\xdb\x00\x02\xf0\x14\x94\xb4\xa3\xee\x2e\x07\x99\x2b\xdd\x20\x0d\xb4\x31\x66\x29\xee\x8a\x95\xca\x34\x7f\x0b\x28\xd6\x40\x2a\x6d\xa8\xb5\x3e\x6b\x32\x58\x1c\x36\x91\xe1\x1a\xe9\xb6\xe0\xf0\x49\x48\x94\xe6\x49\xa9\x2d\x03\xeb\x49\xc4\xd6\x83\x3f\xa1\xf5\x4f\x8d\xcd\x91\xd0\x69\x36\xa6\xe6\x2d\x49\x1e\x2c\xea\x46\xdd\x07\xd9\xf0\x2d\x32\x54\xb8\x50\xbc\x97\x49\xf2\x58\xa6\x1a\xd3\xb9\xcc\x24\xb0\x32\x87\x33\x1b\x85\xa2\x41\x43\xaa\xf8\xfc\xcc\xac\x5f\x18\xbf\xc7\x2d\xec\x75\xc0\x23\x35\x16\xaa\x6e\x45\x89\xc7\x8c\x66\x5a\x18\x6e\xd9\x02\x09\x1d\xf9\x7b\x0d\x04\xe8\x3a\x2d\x74\xd7\x89\x89\x1a\xea\x2c\xac\xf8\x13\xff\xfb\x5e\xfa\xf7\x8d\xbc\xd7\xaf\x54\xef\x55\xc7\x7b\x1c\x4c\x8a\xce\x9e\x92\x78\xad\xc2\x3d\x76\xc7\x79\xd6\x4b\x3b\xbb\xd1\xfb\x33\xb0\x98\x36\xea\x64\xa7\x1e\x47\x11\xe8\x9e\x8d\xa0\xf7\x09\x21\x33\x42\x17\x6a\xe2\x2c\x6e\x78\x52\xc3\x97\x3b\x60\xd9\xf9\x88\x89\xb4\x42\xaa\x48\xd7\xbf\xdf\xde\xf6\x4c\x36\xc5\x86\xc4\xfb\x2a\xd2\xe2\x7e\xbe\x47\x9f\x6d\x72\x2f\x06\x9f\xd6\x10\x6b\x0d\x08\x97\x5d\x5f\x72\x15\x47\xc3\xb9\xc5\x2f\x9f\xc5\xf4\x5b\xb4\x5b\x5b\x63\x21\x88\xe8\x06\x26\x51\x8a\x79\x05\x6b\xdc\x4e\xe1\xd2\xbe\x6c\x65\x42\xa2\x1f\xad\xea\x92\xc6\xdf\xb7\x76"}, -{{0x4f,0x0b,0x36,0x07,0xd7,0x0b,0x0f,0x26,0x98,0x32,0x7e,0xf4,0xf1,0x98,0x2c,0x5b,0x4b,0x94,0xbe,0x78,0xf5,0x0c,0x76,0xf4,0x3b,0xd6,0x42,0xf1,0xf0,0xed,0xe3,0x9b,},{0x94,0x2b,0x43,0x08,0x9f,0xd0,0x31,0xce,0xc0,0xf9,0x9e,0x5e,0x55,0x0d,0x65,0x30,0x7f,0xb6,0xc3,0xe7,0x93,0x44,0x9f,0xb3,0x90,0xff,0x73,0x0f,0xff,0xd7,0xc7,0x4b,},{0xf3,0x96,0xa1,0x1f,0x2f,0x03,0xc6,0x14,0x39,0x68,0x4f,0x79,0x00,0x1b,0xd4,0xf3,0x46,0xa3,0x48,0xdc,0xf1,0xd3,0xbe,0xb2,0xd3,0xbf,0xe3,0x3e,0xa7,0x3a,0x5a,0xd4,0xeb,0x97,0x50,0x6a,0xcf,0xbf,0xfb,0x78,0x4e,0x77,0x54,0x81,0x89,0xcd,0x59,0x9f,0x8c,0xcf,0x17,0x35,0x5d,0xde,0x80,0xe7,0x50,0x24,0xef,0x2a,0x78,0xd5,0xfa,0x03,},"\x9f\x70\x0a\x1d\x25\x60\xf6\x9d\x9b\xc1\x05\xbc\x83\xbf\xf5\x39\xe4\x25\x8c\x02\x48\x60\x20\x13\xa9\x59\xb9\x78\xa1\x9c\xc2\x73\x28\x0d\x90\xc0\x17\x80\x89\x57\x8b\x50\x51\x8e\x06\xad\x1e\xab\x79\x0f\xfe\x71\x0c\x63\xd7\x88\x87\xa9\x55\x69\x14\x4f\x3e\x58\xa8\x83\x7f\x93\xdd\x51\x6f\xcd\xdd\x22\xbc\x97\xa7\xf1\x44\x11\xd4\x24\xb2\xe8\xe9\xaa\x7c\x28\x01\x19\xad\x94\xce\x92\x53\x3f\xc7\xfe\xa6\xc6\x62\x48\x64\x4a\xc3\xe1\xbe\xef\x25\x53\xa6\xf6\x1e\x91\xb9\x37\x9b\x0f\xe0\xc6\x8b\x40\x68\x14\x55\xb3\x11\xf4\x0d\xf0\xc9\x7f\x53\xfc\x95\x42\x42\xc3\x75\xe7\x70\x8d\x61\xba\xd9\xf5\x12\x96\x24\x72\x74\xfa\x01\xa7\x32\x8f\xa5\x00\x9d\x99\x95\xf5\x01\xae\x86\x83\x55\x2b\x11\xa4\x9d\x26\x38\x11\x67\x23\xb1\x31\x94\x50\xa9\x01\x38\xd2\x78\xcd\x95\x12\xb8\x0c\xa5\x79\x2e\xd1\x6c\x68\x3b\xef\x92\xec\x87\x88\x4c\x9f\x07\xf1\x37\xdc\x47\xa1\x31\x46\xe5\x11\x06\x5c\x2e\x1b\x4b\x80\xef\xde\x88\xae\x12\xe2\x94\x31\xbe\xb7\xae\xe3\x65\xc1\x6d\x80\x50\x6b\x99\xaf\xa6\xa1\x40\x6e\xdb\x06\x17\x66\x87\x58\x32\xdb\xa4\x73\xe5\x19\xdd\x70\x18\xf4\x02\xeb\x1b\xb3\x01\x4b\x7c\xee\x4f\x02\xe9\x80\xb1\xb1\x71\x27\xe7\xd2\x5d\xfe\x0c\x16\x8c\x53\x44\xf1\xc9\x00\x44\xf8\x27\x70\x7d\xca\x03\x07\x0e\x4c\x43\xcc\x46\x00\x47\xff\x62\x87\x0f\x07\x5f\x34\x59\x18\x16\xe4\xd0\x7e\xe3\x02\xe7\xb2\xc2\xca\x92\x55\xa3\x5e\x8a\xde\xc0\x35\x30\xe8\x6a\x13\xb1\xbd\xfa\x14\x98\x81\x30\x98\xf9\xba\x59\xf8\x18\x7a\xbc\xaf\xe2\x1b\xa0\x9d\x7c\x4a\xaa\x1a\xd1\x0a\x2f\x28\x33\x4a\xb5\x39\x96\x14\x7c\x24\x59\xc0\x1b\x6a\x10\x83\x9e\x03\x01\x12\x3d\x91\xa3\x5c\xed\x7a\xf8\x9a\xfb\xac\x7d\x9c\xf8\xac\x9a\x38\xce\xeb\xef\x83"}, -{{0xb8,0xa0,0x01,0x0c,0x78,0x4d,0x8d,0x00,0x2a,0x31,0xda,0x11,0xd0,0x22,0xd3,0x01,0x88,0xa4,0x19,0x7a,0x1d,0x5f,0x14,0xea,0x4c,0x0d,0xab,0x29,0xa2,0xe4,0x06,0x68,},{0x8b,0xdc,0x63,0xe5,0x0b,0xed,0xe1,0x3c,0x91,0xa4,0x1e,0x4b,0x4b,0x78,0x57,0xb9,0xe5,0x53,0xf4,0x84,0xe3,0xc1,0xec,0x16,0x7d,0xc0,0x4c,0x28,0x1e,0xa8,0x66,0x22,},{0xb3,0xf6,0xcf,0x4c,0x0e,0x0f,0x90,0x74,0xff,0x2c,0x2c,0x47,0xe1,0x63,0x20,0x2f,0x1e,0x9d,0x6e,0xe1,0x17,0xcf,0x75,0x76,0x33,0xe4,0xab,0xe7,0x44,0x23,0xaa,0x70,0x00,0x8a,0xda,0x15,0x09,0xec,0x1d,0xc1,0x17,0xc1,0xc2,0x30,0xe9,0xb2,0x37,0x86,0xf3,0xd0,0xf2,0x9b,0x73,0xaa,0x28,0x45,0x36,0xe9,0x58,0x01,0x06,0xa8,0xa7,0x0c,},"\x5c\x6c\xcb\x29\x8b\xe2\x16\x80\x8b\x81\x1e\x56\xd9\x72\xf4\x56\xb6\x9a\xd3\x95\x94\xee\xe3\x54\x70\x1c\xa6\xb3\xe3\x8d\x1f\x41\xa3\x59\xe5\x51\x2a\xf9\x8a\x3a\x08\x73\x26\x5f\xe5\x19\x1f\x4f\x2e\xca\xf6\x6b\xee\x75\xa3\xac\x0b\x71\xa4\xdd\xf2\xa7\x59\xeb\xdd\xdb\xd8\x8a\x6a\x1c\x6f\xd0\xfc\xf7\xd7\xcb\x92\xa8\x4e\x33\x07\xb4\xa4\xf9\x8c\x71\x0a\xbf\x4f\x55\x3d\xee\x74\xf6\x52\xd2\xac\x64\xbc\x30\xf7\x2b\xf4\x35\x4e\xf7\xe8\x06\xa1\x90\x71\xa0\x51\xbc\xfc\xfb\x27\xe3\x7f\xdd\xd4\x1e\xce\xae\xc1\x75\x8e\x94\x69\x5c\x67\x0e\xf4\xc5\xa5\x90\x21\x78\x32\x9d\xb9\x58\x5c\x65\xef\x0f\xa3\xcd\x62\x44\x9b\xb2\x0b\x1f\x13\xae\xcf\xdd\x1c\x6c\xf7\x8c\x51\xf5\x68\xce\x9f\xb8\x52\x59\xaa\xd0\x5b\x38\xc6\xb4\x85\xf6\xb8\x60\x76\x92\x8d\xdb\x4e\x20\x36\xf4\x5e\x7b\x9c\x6a\x7f\xf2\x4a\xe1\x77\x60\x30\xe2\x57\x68\x25\x01\x9a\xb4\x63\xeb\xf7\x10\x3a\x33\x07\x20\x33\xea\xcb\xb5\xb5\x03\xf5\x32\x66\xaf\xb8\x2f\x9b\x24\x54\xb8\xdc\x05\x7d\x84\xf3\x0d\x9d\x2c\xb7\xc3\xa3\x1a\x7d\xbd\xfb\xa5\xb8\xe4\x92\x31\xc2\x31\x39\x6c\x47\xca\x04\x2c\x8e\x48\xa1\xa5\xe3\xec\x9a\xfe\x40\x20\x59\x53\x90\xf9\x99\x0d\xfb\x87\x4e\x08\x25\xae\x9a\xe5\xe7\x52\xaf\x63\xaf\x6f\xd3\xe7\x87\xe7\x5e\x8d\x8d\xc4\xc6\x63\x02\x27\x7a\xc0\x1b\x30\xa1\x8a\x56\xcb\x82\xc8\xa7\xeb\xdc\x91\x5b\x71\x53\x25\x5a\x1f\xed\xc4\x92\xe4\x96\x60\x26\x2b\xb2\x49\x78\x0d\x17\x3e\x1f\xd2\x0d\x18\xc4\xf6\xb0\xb6\x9a\xa2\xec\xa0\x24\xbf\x3c\x80\xd7\xd5\x96\x2c\xc4\xa1\x29\xa7\x94\x3b\x27\xf3\x3c\xc7\x99\xa3\x60\x45\x54\x12\x75\xa2\xcd\xb9\x2a\x40\xe4\x85\xba\x8b\x73\x7a\x04\xb4\x3d\x29\xc3\xe2\x5f\x76\xcb\x3d\x93\xa6\xb9\x44\x61\xf8\x8f\x56\x96"}, -{{0xef,0xc8,0x6c,0xbe,0x40,0x36,0x3a,0xbf,0xbb,0x2a,0x4b,0x1f,0xcc,0xe5,0xfd,0x60,0x84,0xda,0x96,0xe7,0xe8,0x14,0xde,0x71,0xaa,0xdf,0x9a,0x61,0x8f,0x30,0x36,0x25,},{0x22,0xf2,0x95,0xce,0xe7,0x27,0xd2,0x8d,0x2b,0x93,0x17,0x15,0x3e,0x7d,0x94,0x12,0xda,0x10,0x65,0xc1,0xb1,0x6a,0xe2,0xa2,0x51,0xdd,0x1f,0xb4,0x31,0xc6,0x2b,0x01,},{0xf8,0x81,0x83,0x10,0x22,0x8c,0xa7,0x61,0x11,0x52,0x4c,0xe9,0x4b,0xfc,0xb0,0x24,0x6e,0xa6,0x35,0x08,0xce,0xe9,0x30,0x65,0x92,0xb2,0xf7,0x75,0x48,0xed,0xef,0xcf,0x76,0xbd,0x14,0x54,0x50,0x8e,0xa7,0x15,0x04,0x2c,0xec,0x16,0x9c,0xea,0x51,0x15,0xab,0x54,0x23,0x5c,0xb1,0x09,0x7b,0x10,0x70,0x2a,0xa3,0x83,0x78,0x02,0x8e,0x0c,},"\x9e\x4f\xa4\x5d\xc0\x26\x71\x0f\x6b\xef\x4e\xd0\xf0\x7c\x54\x4b\x0b\xb0\xd8\x8f\xa7\x9e\x71\x77\xd8\x44\x8b\xc2\x09\xd7\x1c\xfe\x97\x43\xc1\x0a\xf0\xc9\x93\x7d\x72\xe1\x81\x9e\x5b\x53\x1d\x66\x1c\x58\xc6\x31\x41\xce\x86\x62\xc8\x83\x9e\x66\x4d\xb7\x9e\x16\xc5\x4d\x11\x3a\xbb\x02\xa7\x5b\xdf\x11\xb3\x45\x3d\x07\x18\x25\xbc\x41\x57\x41\xe9\x94\x83\x54\x6b\x8e\x1e\x68\x19\xde\x53\x01\x70\x92\xe4\xef\x87\x1f\x1c\xa0\xd3\x50\x8f\x93\x78\x28\xa4\x66\x7d\xb1\x1f\xff\xf9\x41\x6e\xeb\xb9\x4b\xf9\xb8\x4d\x65\x46\x03\x09\x48\x34\xa9\x9c\xa7\x0b\x90\xf5\x62\xa8\x68\x23\x62\x4d\xfe\x9c\xb2\xf9\xe8\x8c\x17\x3f\x13\x46\x4d\x4c\xe2\x55\xf2\x22\xdb\x50\xdd\x63\xab\x42\x46\x57\x34\xe7\x52\x95\xc0\x64\xb6\x4c\xc3\xf1\x5e\x62\x37\xe3\x7f\x33\xd6\x15\xf7\xc2\x43\xe4\xba\x30\x89\x60\xcf\xd4\x39\x34\x02\x52\x55\x00\xbb\x79\x02\x97\x0b\x39\x31\xd4\x8b\x35\x66\x6a\x2d\x4d\x2a\xb0\x8f\xa1\x2a\xf3\x66\xa0\x04\x34\x6c\x9d\xd9\x3d\x39\xfb\x1b\x73\x40\xf1\x04\xe5\x1f\xed\xbb\x53\x36\x05\xb5\xff\x39\xcf\x6d\x59\x51\x3f\x12\x85\x6d\xcf\xa1\x98\xd7\x93\xb0\xfc\x87\x5c\xde\xa0\x74\x1f\x14\x55\x74\x6d\x8a\x19\xc3\xe9\xd9\x28\xf0\x02\x1b\x01\xc2\x51\x31\x81\x1e\x48\xc3\xc7\x5c\x6f\x41\x42\x2a\x88\x10\xc6\xc8\x1f\x35\xb4\x54\xee\xae\x8c\xd1\x7c\xf3\xf2\xe6\xf0\xbc\xd9\xf2\x90\x98\x4f\x49\x65\x78\x62\x3a\xb8\xe2\x73\x8d\x2d\x10\x84\x0e\xb9\x1d\x10\x1c\xb4\xa2\x37\x22\xb7\x2e\x3d\xd1\x85\x44\x0c\x3b\x9f\x44\xd4\x6a\x39\x3a\x34\xc1\x87\xa2\x0d\x61\x0b\xb6\x98\xc5\x05\x31\x74\x1e\xfe\x96\x32\x35\x12\x32\x98\x00\x77\x2a\x40\x80\x65\xa7\xef\x8e\x4e\x41\x05\xeb\x1f\x5b\xf6\xd3\xfd\x6b\x21\x7f\xd8\x36\xd8\x9f\x53\xb9\x6f\x45"}, -{{0x33,0x55,0x6c,0x60,0xde,0x2f,0x2c,0x9a,0x93,0x03,0xb9,0x9a,0xdd,0x37,0x85,0x92,0x06,0x05,0x05,0xf8,0xe4,0x98,0x61,0x08,0x5a,0x4b,0x15,0xf0,0x72,0xa7,0xef,0x28,},{0x23,0x1e,0xc8,0xcd,0x84,0x58,0x59,0xf6,0x99,0x61,0x27,0x51,0x19,0xdb,0xe4,0xf7,0x15,0xe5,0xec,0x5a,0xa9,0x8b,0xb8,0x74,0x16,0x75,0xb3,0xc2,0xd0,0xc8,0x9f,0xee,},{0xe0,0x6a,0x7a,0x41,0x44,0x57,0xbb,0xbe,0xf2,0xba,0xc3,0x77,0x5c,0xca,0xd0,0x87,0xda,0xcb,0x1f,0xa4,0xbf,0x93,0x88,0x94,0xe8,0xc9,0x29,0x11,0x8e,0x09,0xe6,0x78,0xdd,0x19,0x93,0x8b,0xc8,0x8f,0x43,0xed,0x0f,0x7d,0x31,0xcc,0x6a,0x0e,0x60,0x2c,0x4e,0x4d,0x1f,0xee,0x33,0xd4,0x1e,0x74,0xa1,0x19,0xfa,0x2d,0x1e,0x4e,0x34,0x0f,},"\x96\xaf\x54\x0e\xa2\xb1\x92\x3f\x5f\xd0\xaa\xd3\x21\xac\x03\x20\x70\xc2\xd6\x5b\xa1\x3d\x16\x4e\x75\xc3\x46\x97\x58\xfc\xf3\x1b\xb3\x16\x55\xcb\x3a\x72\x1f\x9c\xb3\x4b\xe2\xc9\x0c\x77\xeb\x65\xbe\x37\xf6\x06\xd3\x2a\x91\x7a\x4c\xb9\xa7\x09\xac\x07\x05\x22\x99\x30\xef\x6e\xb6\xfd\xb0\xfa\x3c\x0f\xd3\xa9\x0c\xe1\x71\x67\x4e\xe3\xed\x06\x35\x4b\xaf\xc3\xc7\x07\x54\x67\xa5\x74\x45\xb8\x03\x85\x64\x04\x47\x90\x2b\xe3\x92\x62\x89\x4b\x1f\x64\xfe\xa5\x82\x87\xdc\x32\x2d\x19\x87\x59\x72\xa7\xc8\xbe\x91\xd3\x1f\x02\x1c\x70\xeb\x68\x2f\xdf\x11\xa1\x0f\x8f\x58\x2a\x12\x6e\x06\x47\x94\x83\x8c\x69\xfd\xf6\x4f\x5b\x6e\x8b\xa5\x9d\x48\xb4\x38\x4f\x8e\x9f\xb5\xc0\x87\xcc\x77\x38\x29\x5c\xd3\x23\x44\xba\x3b\x69\x7e\xe6\xb6\xa8\xb7\x8e\xe7\xa9\x57\x5c\x97\x97\x2a\x4d\x1b\xb1\x84\x86\xf9\x03\x7a\x0f\x3c\x6f\x47\x1a\x90\xf8\x64\x98\xdb\xc0\xdf\x52\x32\xc0\x7e\x8c\x01\xb6\x90\xbe\xe7\x53\x02\x99\x2a\x7a\x36\xfb\x44\x37\xc2\x5a\x8b\xf5\xe3\x4c\xf7\xd5\xb5\x55\x72\xc7\x00\xa0\x79\x84\x8d\x38\x13\x64\xf9\x94\x6a\x91\xeb\x16\x03\xff\x3d\xe5\xeb\xdd\x52\x3b\xd9\x25\x64\x81\x8e\x23\x7a\x53\xe8\xf5\x22\xde\xaa\x2c\x29\xb8\x97\xe9\x61\x58\x6e\x10\x0e\xd0\xfc\x0a\xd7\x0d\x16\x09\x34\xe6\x94\x02\x7e\x5c\x95\x79\x20\xbc\x05\x46\xe9\x01\xbe\x39\xa8\x45\x35\x59\x7e\x1f\x28\x0c\x22\x22\x67\xab\xe9\x7f\x41\x20\x5d\x81\x71\x82\x0d\xd2\xfa\xaf\xc0\x69\x94\x19\x32\x1a\x91\x60\xf6\x9b\x99\xfd\x41\x18\x09\x45\xb6\x2d\x2d\xd1\x05\xcc\x7b\xbe\x82\x1d\x28\x60\x5e\x09\x8e\xdf\xa8\xb2\x30\x9a\xeb\x05\x34\xe7\x56\x37\x7f\x59\x93\x7c\x67\x46\x3f\xd8\x7c\x8b\x92\xab\x58\x11\x9c\xf4\xce\x6c\x66\x5a\xf5\x72\xfb\xae\x1d\xe4\xa2\xcc\x71"}, -{{0x7a,0x5c,0x74,0x31,0x4e,0x11,0x83,0x33,0x4a,0x4b,0x62,0x26,0xb9,0xa8,0x2d,0x70,0xfc,0x2a,0x12,0x4e,0x3f,0x87,0xdb,0x6a,0x22,0x83,0xee,0x05,0xb6,0x8e,0x34,0xe0,},{0xbe,0xae,0x7d,0x3d,0xd9,0x7c,0x67,0xf6,0x27,0x3b,0xfa,0xa0,0x66,0x13,0x1f,0xed,0x8a,0xce,0x7f,0x53,0x5f,0xe6,0x46,0x4e,0x65,0x79,0x1c,0x7e,0x53,0x98,0x57,0x6c,},{0xc2,0xab,0x1f,0x6f,0x51,0x14,0xa8,0x4f,0x21,0x85,0x02,0x58,0x2c,0x56,0x7b,0x37,0xa8,0xbd,0xbc,0xdf,0x63,0x40,0xfa,0x46,0x22,0x87,0x3b,0xe8,0x91,0x06,0xf0,0xa9,0x0b,0x48,0x29,0x50,0x5f,0x72,0x12,0x9d,0xf0,0xab,0x3d,0x85,0x13,0x26,0x87,0x74,0xa3,0x4d,0xf3,0xad,0x21,0xce,0x25,0x4b,0x46,0x44,0x88,0xad,0xdd,0x6c,0x9b,0x04,},"\x98\xba\xc6\x72\x47\x55\x91\x29\x92\xad\xc2\xa4\x8b\x54\x42\x37\x6f\x2d\x92\x79\x97\xa0\x40\xfb\x98\xef\xe5\x44\xeb\x0c\x8e\x18\x66\xb9\x61\x6e\x29\x8d\x33\x60\x31\x6e\xd9\x76\xbd\x94\x6a\x41\x1f\xdd\x3a\x6b\x62\x5c\x0c\x1a\x37\xaf\x0f\x41\xcf\x65\x69\xa7\x88\x4a\xb8\x46\x74\x91\xa9\x87\xdf\x3e\xa7\xa0\xb7\xeb\xc4\x69\x25\x69\xa3\x4c\xe3\xa2\xea\x35\x03\x49\x5b\x2c\x02\xd4\x9d\x7d\x7d\xb5\x79\xd1\x3a\x82\xcf\x0c\xf7\xa9\x54\x7a\x6e\xae\xbe\x68\xe7\x26\x7d\x45\xa6\x0b\x8d\x47\x72\x45\x52\x28\xcc\xa4\x03\x6e\x28\x2e\x1a\x12\x16\xf3\x4c\xef\x7e\xa6\x8f\x93\x82\x70\xbd\xb0\x42\x93\xc8\x85\xd0\x05\xf9\xf7\xe6\x38\xa8\xb4\xea\xd2\x62\x6c\x09\x45\x17\x4f\xf2\xa3\xe2\xd6\xe1\x5a\x4c\x03\x38\xc0\x9e\x12\x60\xf0\x92\x8c\xa9\xd3\x49\x98\x24\xf3\xfe\xdc\x47\x85\xda\x49\xc5\xc3\x4a\x56\x85\x5e\x24\x1f\xac\xc6\x34\x7a\x39\x9d\xdc\xac\x43\x99\xa8\xb1\x58\x19\x8c\x15\x14\x61\xa3\xb1\x89\xe5\x8e\xc1\xf7\xef\xcf\x2a\xb2\x03\x1f\xb1\x7b\x6f\x03\x5b\xa1\xf0\x92\xe9\xee\xe2\xe9\x2c\x2d\x6c\xc2\x03\x22\x87\xf8\x54\xb4\x1e\x70\xfc\x61\xc8\xd1\x1a\x2e\x4f\x07\x08\xf0\x2e\xeb\xd0\x2e\x8c\x7e\x8c\x7b\x38\xa5\x7b\xfa\x1a\x74\x5f\x3a\x86\xc2\x39\x09\xf6\xf8\x9a\xb1\x6c\xe7\xe1\x81\x3c\x1d\x20\x14\x7f\x31\xb4\xcf\x2a\xd0\xb6\x06\xfb\x17\xe5\xac\x1a\xb5\x1e\xf4\xa7\xd8\x09\x3c\xee\x9a\x65\x5f\x47\x1d\xc5\xb1\x46\xbd\x1b\x93\xe5\x40\xa3\xd3\xd3\xe2\xde\x81\x05\x91\x1c\x10\xd6\xab\x5f\xf7\x9c\x2d\x06\x02\x7f\x7a\x54\x56\x1f\x20\x71\x41\x4b\xd3\x30\xa8\x78\x54\x42\x25\x1c\x81\x0e\x23\x2f\x83\xc3\x67\xf0\xbe\x77\x99\xa9\x3f\x52\x38\xf7\xf1\x7b\x5b\xe8\x29\xfd\x89\x12\x3c\x04\x83\x3a\xf8\xb7\x7e\x5a\x43\x63\x04\x7c\xec\xa7"}, -{{0xda,0x80,0x06,0xad,0xc4,0x92,0xca,0x5d,0xc8,0x6c,0x29,0x59,0x43,0x7a,0x75,0xde,0xb6,0x12,0x0f,0xf7,0x87,0xd2,0xec,0xb9,0xc2,0x0c,0x30,0xb5,0x2c,0x26,0xbc,0x41,},{0xff,0x11,0x3b,0xf0,0xaa,0x58,0xd5,0x46,0xf2,0x38,0x5d,0x44,0x4e,0xcb,0x78,0x88,0xf8,0xca,0xba,0x43,0xa1,0x74,0xa8,0x9f,0xd6,0x06,0x5f,0x2b,0x7d,0xc1,0x7b,0xf0,},{0x1f,0x53,0x75,0xdc,0xb3,0xad,0x2b,0xaa,0xff,0x95,0x6d,0x85,0x54,0xec,0xb4,0x24,0x17,0x6b,0xe9,0xa6,0xeb,0x9e,0xa5,0x4e,0x81,0x4e,0x0a,0x73,0xdf,0x2a,0x5d,0x84,0x8a,0xda,0x26,0xba,0x8e,0x18,0x05,0xcd,0x51,0xc5,0xe1,0x69,0x50,0xc1,0xff,0x7d,0x4d,0x27,0x64,0xda,0xa6,0xf4,0xc7,0x50,0x2f,0xb8,0x65,0xcb,0xe5,0x5a,0xaf,0x0b,},"\x3e\xb4\x32\x4d\xbc\x01\x49\xd2\xe7\xd6\xdf\x63\x2b\xb0\xcb\xe9\xa9\xf6\xdf\xa8\x3e\x22\x7f\xc0\x7b\xde\x1b\x57\x7b\x36\x11\xfb\x92\x1c\x9f\x83\x13\xf0\x68\xe6\x29\x5d\x49\x13\xa8\x19\x6b\xe5\x30\xf6\xa0\x1f\x57\xc0\x9c\x02\x84\x91\x44\x4b\x78\x47\x20\xe9\x09\xea\x1f\xb6\x9c\x1c\x1d\xd6\x30\x44\x00\x32\x7b\x77\x31\xb3\x3c\xc4\x6d\xeb\x04\x6c\xda\xb6\xad\x1b\x53\xf1\x74\x9a\x0c\x65\xcb\x9a\x7e\x37\x6f\xfa\x02\x23\x0f\x53\x65\x84\xae\xa2\x43\xc6\x39\x10\x3a\xdb\xba\x76\x43\x21\x64\x9d\x7e\x01\x26\xf8\x2e\x0b\x4f\xd9\xdc\xb8\x6c\x73\x1c\xbc\xc5\x17\xf2\x01\x68\x41\xe9\x16\xbc\xd5\xfd\xe8\x71\xdc\x09\x8c\xd9\x13\xdc\x54\x62\x84\xd1\xb2\x16\x5c\x63\xe8\x8f\x32\xa2\x78\x9a\x50\x08\x56\x37\x1b\x50\xd2\x2f\xb8\xc8\x7d\x1a\x3c\xae\xdc\xdf\xd0\x1e\xe5\xf8\x70\xa5\x3c\x28\x41\x81\xd6\x32\xec\x66\xd4\x8b\x6b\xdd\x56\x46\xac\x39\xc9\xe7\x53\x38\xa5\x20\x21\x20\x62\xbc\x34\x66\xef\x5c\x58\x76\x55\x70\xb9\x05\xf6\x3a\x93\xd0\x7f\x8f\x1b\xaa\xc3\x52\x6b\x01\x6d\xa7\x99\xf3\xe9\xe0\x3a\x4f\x7f\x81\x35\x5e\x0f\x7a\x76\xf3\x0a\x42\xb8\x07\x32\x20\x51\xb7\x1c\x62\x6a\x7a\x29\x6d\x75\xb9\xd9\xd1\xa2\x3b\xcb\x13\xc9\xef\x48\xa9\x12\xdc\x05\x73\x25\xd3\xbc\xfb\x3f\x9f\xad\xaf\x0c\x24\x9b\x10\x2a\xeb\x85\x4a\xa3\x63\x1e\x34\xf6\x9a\xd9\x0c\x2a\xb2\xed\x33\xba\xcc\x40\xb9\xed\x10\x37\xfa\xe6\x7c\xdf\x79\x9d\x5a\x9b\x43\x78\x59\x61\x12\x7d\x62\xf8\xe0\xbc\x15\x89\xfd\x1a\x06\xfc\xa2\xae\xa7\xcf\xc0\x12\xcb\xf7\xb5\xb2\x07\xdd\xc4\xe6\x77\xd8\xae\x4a\xec\x10\x00\x45\xce\x36\xc0\x0b\x74\xd1\xd2\x82\x50\x79\x12\x36\xdc\x5d\xcc\x1e\xd3\x13\xc8\xc2\x46\x17\x26\x66\xf7\x52\x17\x43\x7c\x60\x34\xac\xd6\x41\x98\xcd\x96\xdf\x2a"}, -{{0xa2,0x84,0xe2,0x6b,0x97,0xe5,0x38,0x83,0x9c,0x80,0x8d,0x45,0xbd,0xe6,0xf0,0x12,0xa3,0x54,0x45,0x4a,0xef,0x81,0xca,0xa8,0xc5,0x59,0x14,0x62,0x4f,0x2b,0x7d,0x66,},{0x5a,0xe4,0x6e,0x34,0x69,0x5e,0xfa,0xf4,0x63,0xa4,0x20,0x8f,0xc4,0xe3,0x5b,0x81,0xf2,0xc6,0x35,0x93,0x23,0x8a,0x56,0xf2,0x44,0x4b,0x85,0x0f,0x05,0x8c,0x3c,0x5c,},{0xbf,0x11,0x0e,0x2e,0x9c,0xec,0xbc,0x31,0xfa,0x3e,0x0c,0x24,0x38,0xcd,0x1f,0x43,0x21,0xf9,0x2c,0xd2,0x87,0x00,0x5a,0x48,0x52,0x8a,0xdd,0xf7,0x6c,0xad,0x8d,0x88,0xbb,0x22,0x71,0x9e,0xf9,0x1b,0x13,0x95,0x62,0xa1,0x51,0x18,0x38,0x68,0x26,0x74,0xfa,0xa9,0xff,0x7e,0x7a,0xde,0x6c,0x9d,0x57,0x3f,0x84,0x50,0x36,0xd1,0x89,0x05,},"\x9e\xbf\xe9\x10\xb5\x0a\x5c\xb7\x19\xd9\x5b\x96\x1e\x59\x05\xf0\x0e\xc7\x94\x3b\x55\x46\x8a\xb5\x95\x66\x92\x01\x76\x45\xb3\x66\x07\x1f\x8f\xbb\x77\xeb\x49\xec\x73\xea\x7d\x64\x51\x14\x05\xb9\x0d\xe2\x2d\xb9\x8c\x3e\xae\x39\xc4\x03\x9c\x7a\x13\x34\x30\xe8\x01\x0b\xdd\x39\xa0\x0f\xd1\xa5\x28\xb1\x13\xda\xe1\x49\xcf\xad\x3a\xe3\x40\xda\x27\xdc\xc5\x07\x78\x2e\xcd\x89\x29\x23\x75\x17\xaf\xe7\x46\x3e\xca\x24\x73\xc7\xac\xf6\xf7\xaa\x04\xef\xc9\xf2\x66\xae\x7b\x6d\x63\xbb\x8c\xc2\xa4\x38\xb3\x44\x82\x7f\x07\x13\xd1\xf1\x73\x6f\x0c\xbb\x65\xb9\x93\x53\xf2\x03\x55\xfa\x02\x30\xd4\xfa\x70\x73\x28\xa8\x66\x26\x54\xe8\x3a\xd0\x53\x0a\x10\xf9\xa6\x9e\x17\xc0\x99\xe1\xe2\xb5\xdb\x18\xe5\xf6\xf1\xdc\xed\xa5\x88\x3e\x8c\xab\x79\x70\x1a\x5e\x90\x89\x56\x2e\xd1\x53\xad\x08\xc6\x74\xf0\x97\xc2\x8e\x4d\x16\x63\x3e\x09\x29\x69\xa8\xf0\xbd\xac\x54\x52\x7c\x0e\xe0\x3b\xc2\x00\xe5\xbe\x61\x2e\x3d\x1e\xab\xd8\x70\x91\x10\x1b\x49\x62\xaf\xa0\x7b\x31\x08\x06\x99\x2f\x37\x30\x76\xd7\x6a\x58\x18\x51\x18\x13\x7c\x9d\x26\xee\x2c\xd4\xc6\x18\xc1\x82\x83\xdd\x19\xf0\xe7\xa0\x89\xee\x37\x30\x5b\x6b\x95\x18\xa7\x8d\x80\x98\x43\x6e\xf6\x2b\xe7\xd6\x99\x80\x8a\xce\xcf\x67\x93\x9d\x61\xb3\xe0\x29\x37\xcd\x8c\x5f\x1e\x74\x6d\x42\x74\x33\x4b\xc9\xc3\x7f\xdc\xba\x23\x4c\x16\x6f\xd7\x12\x89\x3f\x3a\x04\x08\x32\xec\x54\x25\xe5\x7d\x80\xf1\x1e\xf9\xca\x5f\xbc\xd6\xc1\x47\xfb\xbf\x5e\x2f\xae\x74\x6e\x0d\xdb\x60\x58\x67\xe3\xbd\x05\x04\x83\xc3\xcd\x13\x29\xab\xe5\x7a\x60\xbf\x88\x89\x8d\xc7\xe8\x0e\xde\x0f\x45\x17\xde\x8f\xc8\x07\xe8\x88\xb6\x21\xa0\x0f\x66\x30\x84\xff\x94\xb9\x99\x96\x62\x8f\x3b\x11\x69\x0a\x60\xf0\x91\x8c\xb5\xc9\xa7\xef"}, -{{0xcc,0x97,0xa9,0x63,0x01,0xce,0xed,0x0f,0x92,0x27,0x31,0xb6,0x85,0xba,0xd8,0xad,0x4f,0x06,0x20,0x7b,0xe3,0x40,0xf5,0xa4,0x4f,0xd1,0x87,0xf2,0x99,0x03,0xec,0x20,},{0xeb,0x56,0x3a,0x7b,0xce,0x12,0xdb,0x97,0xf1,0x89,0x1d,0x0f,0x61,0x0b,0xeb,0xd5,0x51,0x01,0xa3,0x12,0x5c,0xa8,0xdb,0xb5,0x0b,0x25,0xa6,0xb5,0x05,0x0d,0x37,0x84,},{0xff,0xbd,0xd3,0x24,0x41,0x81,0xcd,0xf6,0x03,0x4f,0x4a,0x45,0x0f,0xdd,0x95,0xde,0xe4,0x97,0x1a,0x93,0x3f,0x8b,0xe0,0x22,0xbb,0x0a,0x41,0x06,0xae,0xf3,0x9a,0xf3,0x05,0x5b,0x72,0x18,0x81,0xc9,0xb5,0x4d,0x1e,0x99,0xb9,0x40,0x90,0x96,0xfb,0xe6,0xdc,0x2c,0x99,0x66,0xe3,0x67,0x99,0x64,0xbd,0x7e,0xf4,0xc8,0x08,0xca,0xbf,0x01,},"\xb9\xea\x3b\x3d\xf7\x18\x7e\xa4\x15\xa3\xc3\x35\xe0\x83\x4e\x10\xf4\x40\x91\x5b\x2a\xd4\x1c\x71\xf2\x55\xd6\x95\x0a\x4e\x91\x20\xe4\xd4\x94\xfd\x9e\x67\x2c\xe5\x32\x06\xfd\xc4\x17\xd8\x65\x89\x7b\x47\xac\x10\x54\xe1\xca\x10\x68\x19\x52\x32\xd4\x29\x74\x35\xe4\x4e\x12\x24\xe6\x6a\x91\x2d\x9d\x7d\x18\x29\x46\xff\x5a\x9f\x08\x5b\xb8\xba\x19\xc5\x4d\x16\xb5\x86\xa9\xb3\x04\x61\xb6\x77\x3b\x93\x95\x03\x11\xe1\x61\x98\x86\xf5\xa5\xb3\xf1\x11\xaa\xad\x09\x4b\xae\x31\xc4\x8f\x19\x41\x08\x09\x68\xbd\x02\x77\xbb\x6f\xa9\x2e\xeb\xf3\x24\xb1\x92\xdf\x5c\xc9\x69\x51\x6c\x78\xc7\xb2\xd1\x21\x59\xb4\xd1\xc8\xeb\x03\x16\x0c\x4c\xd1\x90\x7f\x62\xed\x4b\x85\x4c\x56\x9e\xcc\x48\x1c\x08\xe6\x36\xf4\x4e\xd7\xc3\x90\xe5\x8b\x59\x37\xd2\x90\x6b\x28\x17\xbc\x37\x69\xda\xd9\xda\x1b\x0f\x79\x39\x1b\x55\x94\x20\x63\x05\x5d\xa0\xd6\xf2\x49\xa3\xe4\x52\xba\xdd\xaa\x03\x29\x98\xd7\xf7\x33\x98\xcc\xd0\x15\x1b\xfc\x92\xc5\xe2\xfd\xfa\x9b\x14\x85\x5e\x6b\x0d\x37\x46\xdc\xe2\x48\xe2\x19\x67\x29\x87\x25\x2e\xc7\x47\xdf\x27\x47\xfd\x3f\xbd\x8b\x71\x4c\x88\x2d\x70\x7e\xe3\x02\xa9\x04\x95\x0c\x34\x75\x4f\x85\x35\x0e\x1a\xa3\xf8\xea\x62\x93\xcf\x01\xf7\x17\xce\xfb\x6b\x83\xa2\x21\x26\xdf\x5c\x4f\x56\x98\xaa\xfd\x06\xa2\x24\x4a\xd7\xd0\x1f\x34\x01\x7c\xa0\xec\xe6\xf2\x10\x40\x04\x8a\xba\x6c\xa4\xae\xb0\x43\x25\xb9\x40\x2b\xcd\x43\xab\x13\x0a\x10\x57\x88\xac\x3d\x7b\x7d\xa0\x1e\xa9\x42\x6d\xd0\xea\x19\x33\xa8\x18\x99\x33\xa6\xc0\xc6\xcd\x64\x8e\xa3\x16\xa7\x46\x9a\x5f\xdc\x6e\x7c\x93\x4d\x91\x86\x58\x60\x97\xb5\x5d\xd5\x1a\xc4\x87\xbb\x80\xed\x11\xd4\xdf\x8d\x33\x62\x6b\xbc\xe9\x5e\x4f\x13\xbd\x49\x92\x2f\x00\xc9\x20\x22\x3f\x4c\xbf\x93\xcb"}, -{{0x67,0x9e,0x3e,0x34,0x77,0x3a,0xbe,0x4a,0xe2,0x5c,0xae,0x7d,0x07,0xcc,0xd0,0xeb,0x3b,0x0e,0xc0,0xa3,0x5d,0x57,0x02,0x57,0xd6,0x25,0x70,0xde,0x58,0xea,0x25,0x16,},{0x18,0xac,0xff,0xce,0x25,0x3b,0x27,0x25,0x95,0x79,0xed,0x99,0x24,0xf4,0x79,0xca,0xe3,0x12,0x16,0x7b,0xcd,0x87,0x6e,0xdb,0xa8,0x8b,0x5d,0x1d,0x73,0xc4,0x3d,0xbe,},{0x1a,0x51,0x02,0x26,0x28,0xcc,0xbb,0x88,0xea,0xe9,0xb2,0x17,0x73,0xc3,0xf8,0x30,0xb7,0xb6,0xe5,0xbc,0x36,0xc9,0x90,0x3c,0xe7,0x0f,0xbc,0xf4,0x59,0xd6,0xa1,0xed,0x8a,0x1d,0xce,0xff,0x5b,0x19,0x26,0x9e,0xbf,0x5a,0x6f,0xd3,0xd8,0x95,0x88,0x60,0xf5,0x54,0x46,0x1f,0x0e,0x9f,0xc0,0xe2,0x9a,0xf9,0xb1,0xfb,0x17,0x44,0xa8,0x0b,},"\xfb\x2b\x64\x8e\xbb\x16\x68\x82\x44\xf7\x8b\x2e\xe9\xa2\x73\x59\x9d\x56\xb6\x19\x89\x00\xd4\x38\xa9\xe9\x9c\x19\x14\x25\xc7\x2b\xec\x4f\x23\x58\x47\xe1\x8e\x47\xf5\x7c\x3c\xb3\x96\x65\x5f\x77\x89\x21\xf9\x08\x58\x0e\x8e\x83\xc9\x6c\x10\x8b\x20\xdd\x41\x66\x78\x02\x1b\xca\x25\x9b\x98\x51\x8f\xab\xb2\xd3\x53\x2e\x48\x51\xd9\xd5\x2a\xdd\x25\x42\xc0\xcb\x3e\xfa\x38\x57\xa1\x7e\x51\x24\x38\xbc\x0e\xc4\x76\x2e\x2f\x9b\xab\xa4\x29\xc0\x3e\x99\xbe\xc4\x03\x8e\x6b\x0c\xa4\x2b\xff\x5b\x23\x3b\x24\xc3\x33\xb4\xca\xea\xd2\xde\x37\x4a\x87\xb2\xab\x5d\x80\xd6\xe4\x9e\x44\x56\x32\x9d\x51\xae\x97\x3b\xc8\x3d\x78\x62\xf3\xd3\x15\xe5\x14\x48\x1b\x12\x85\x4a\x9d\xfc\x09\xe7\xd1\x4f\x0d\x02\x2c\x0b\xa3\x02\x25\x78\xeb\xa8\xf8\x74\xde\xba\x4a\xa8\xc8\x33\xf2\xb1\x32\x86\x1d\x4d\x51\xe5\x0f\xe9\xaa\x4b\x78\x7b\xd2\xf0\x51\xaa\xc5\x0c\x37\x53\x90\xcb\xbc\xfb\xa2\x00\x2b\x80\xad\x00\xcd\xc1\x29\x80\xf8\xba\x8b\xcb\x70\x64\xaf\xc0\x4d\x5c\x46\x82\xc1\x02\x9b\x10\xa6\xd4\x5f\xe6\xec\xd7\x04\x24\x5f\xaf\x59\x8c\x46\x59\x59\x7c\x5d\x68\xa1\x92\xcc\x1c\xd4\xfa\x45\xe8\x4b\x54\x9e\x8e\x5e\x67\xda\xa8\x79\xae\x5a\x52\x0a\x6b\x55\x50\x51\x98\x76\xa5\x62\xac\x49\xc6\xdb\x0a\xa7\x6e\xc6\x9b\xb6\x4d\xd6\xb5\xe1\xa3\xaf\x2e\x13\x1e\x72\x2e\x7c\xdd\x05\xbe\x34\xb5\xfc\xc6\x25\x9a\xa1\x24\xcc\xf8\x14\xcf\x5b\x50\x0d\x17\x6b\xe2\x8e\xbc\x40\xbb\x21\xf0\x3e\x24\xcc\xc1\x31\xe0\xf4\x1d\xaa\x1c\xa0\x2e\x6b\x00\xc9\xc5\x3f\xad\x12\x48\x61\x4e\x94\x0d\x4b\x23\x77\x60\xab\x75\x69\xa7\x67\xb7\x51\x5d\xd2\xd6\x23\xe5\x7a\x28\x41\xb7\xd2\x44\x1c\xf4\x30\x49\xe4\x69\x8d\x2f\x9c\x9e\xae\x7b\x29\x10\xf6\xad\x65\xed\xf9\xcb\x2b\xdb\xd9\xb2\x9f\x60\x6e\x0d"}, -{{0x9b,0xfa,0x60,0x92,0x3a,0x43,0xed,0x0c,0x24,0xe2,0xf1,0x2f,0x5b,0x86,0xa0,0x71,0x63,0x29,0xf9,0x3d,0x4d,0x8d,0x3e,0x06,0x23,0x80,0x02,0x89,0x32,0x78,0xc1,0x9a,},{0xfb,0x1c,0x00,0x68,0x77,0x81,0xb5,0x5b,0x89,0x3d,0x6b,0x2f,0x4f,0x49,0xcf,0x5f,0x73,0xd2,0x90,0x3c,0x31,0x6d,0x1e,0xee,0x75,0x99,0x1d,0x98,0x3a,0x18,0x68,0xc0,},{0x55,0xf2,0x02,0xef,0xb2,0xa5,0x7b,0xe8,0xb4,0xe4,0xfd,0x89,0x4d,0xcc,0x11,0xa4,0xfc,0x5f,0x82,0x76,0x61,0x8e,0xf5,0xcd,0x34,0xa4,0x49,0x5a,0xdb,0x01,0x6a,0x29,0x8e,0x64,0x80,0xa3,0x5c,0xfc,0x53,0xed,0xb2,0x5f,0xf1,0x49,0x9f,0xc5,0x32,0xa3,0x30,0x61,0xcc,0x01,0xa2,0x50,0x45,0x8a,0xa5,0xe4,0xf7,0xf1,0x6f,0x51,0x44,0x0d,},"\xa9\x90\x28\xb0\xf4\xa3\xaa\x5e\x79\xab\xef\x6c\x0d\xf4\xa7\x83\xef\x47\x0f\x1a\x29\xba\x51\xeb\xa0\x0f\x62\x14\xe8\x40\xfe\x19\xe5\xb6\xdc\x60\x21\xab\x59\x9b\xb2\xee\x36\x99\x57\x60\x15\xd7\x9a\x79\x39\xaf\x82\x35\x35\xb6\x30\xe3\x93\x8c\x72\x3f\x6e\x0b\x92\x29\xd4\x6b\xb3\x37\x9a\xcd\xba\x58\x7c\x23\x85\x67\xe3\xd8\x9b\xc3\xbd\x35\x19\xb7\x27\xfc\x69\x4f\xff\x11\x18\xbf\x22\xc8\xbc\x8b\xc8\x2c\x4d\xf7\xf5\xad\x38\xde\x05\xfe\x9f\x76\x29\x99\xec\xaa\x79\x5f\x3a\xe6\x30\xa9\xa3\x16\xd2\x6d\xce\x9f\x15\x68\xff\xa3\xf2\x2b\x02\x95\x21\x40\x20\xb3\xd3\xf5\x33\x7c\x14\x95\x68\x19\x22\x18\x13\x2a\x90\x70\x92\x79\xc0\x1d\x23\xba\xef\xa6\x69\xe1\xc4\xe4\x20\x38\x17\x3f\x13\x19\xc2\x12\xda\x14\x4f\x1c\x4e\xa4\xc5\x2c\x00\x5c\xbc\x0b\x5b\xc2\x83\xe7\x44\x83\xa0\xdc\xa6\x92\x79\xde\xb1\x7a\xe5\xb2\x9c\xfa\xfa\x7d\x00\x63\xf4\xe1\xbc\x93\x53\x7e\xfd\x93\x7e\x58\xa8\xac\xa7\x37\x22\x8f\x93\x7f\xf2\xa7\x41\x89\x0e\x96\xc5\x72\x5d\xa1\x1b\x45\xc4\x13\xa9\xbb\xb4\x18\x0a\x41\x99\x87\xbb\xf0\x46\xbf\xd3\x46\x29\x5d\x62\xf0\x81\xc7\x6d\xaf\x2b\x0e\x1e\xb4\xf6\x71\x2f\xee\xbe\x6f\x0a\x92\xe3\x58\xe7\xdd\xb8\x58\x96\x50\x7c\x34\x0a\x01\xf6\x8d\x1b\x0f\x08\x57\x78\xb7\xc4\x4b\x01\x4a\xa6\x67\x3e\x50\x17\x96\x95\x9a\x17\xa6\x88\xdb\x09\x59\x05\x84\x88\xa7\x11\x25\x72\xf2\x3c\xf9\xcd\xb5\x3b\x5e\xb4\xb4\x5f\x59\x53\xba\x0c\x0c\x69\x0f\x86\xbd\x75\xe8\x9a\x04\x7b\xeb\xaf\x84\x7c\x1d\xfc\x34\x5a\x4f\x3c\x7d\x3b\xee\xc9\x8b\x84\xb0\x21\x90\x03\xe8\x19\xf5\xc2\xad\xb4\x5f\x87\x17\x90\x3d\x1f\x5b\xd5\xd7\x19\x14\xc5\x6f\xca\xbc\x7a\x29\x0f\x9c\x41\x69\x9c\x95\x58\x4d\x6a\x3a\x16\x34\x0c\xb1\x7b\xaa\x1f\xc5\xe5\x46\x7a\xf7\xac\x32\x21"}, -{{0x6e,0x3a,0xf4,0x5e,0x66,0xe2,0x28,0x90,0xc3,0xf3,0xc9,0x34,0xf5,0x23,0xa4,0xd6,0x94,0x27,0x97,0x6e,0x6e,0x52,0x62,0x5f,0x8b,0xad,0x55,0x89,0x93,0x96,0x32,0x19,},{0xe0,0x97,0x36,0x4e,0x76,0xff,0x9f,0x2e,0x1d,0x16,0x7f,0x6b,0x20,0xc1,0xbc,0x58,0x30,0x08,0x5e,0x7e,0xc9,0x93,0xc1,0x38,0xf8,0xb1,0xb2,0x17,0x56,0x37,0xe7,0x41,},{0x26,0xba,0x56,0x2e,0x8a,0x40,0x65,0x70,0x82,0x07,0xc2,0x5e,0x23,0x9b,0x78,0x0a,0xee,0x38,0x79,0x4c,0xf9,0x83,0xa3,0x7a,0xcb,0xb9,0xd5,0x57,0xa6,0x5c,0xee,0xd3,0xc0,0xda,0x47,0xd1,0x7f,0x3e,0x8b,0x8f,0x4e,0xeb,0x1b,0x65,0xa2,0xc1,0x82,0xea,0x6f,0x29,0x62,0x3b,0x63,0xbb,0x0f,0x1c,0x72,0x59,0x26,0x83,0xb1,0x26,0xb9,0x01,},"\x5c\xfc\x2f\x4b\x55\x9f\x82\x05\xb3\x91\x02\x08\x76\x17\xf4\xd8\x6c\x7c\xe6\xcb\x25\x1e\x5f\x89\x60\x1d\xfc\x88\xed\x28\xe8\xd7\xa6\x70\xec\x00\x87\xd2\xea\x5d\x89\x30\x21\xc7\x04\x4d\xa2\x89\x9a\x22\xd7\x76\xfe\x90\x17\x0e\x51\xc2\x03\x25\x06\x90\xd3\x7a\x29\x45\x55\xe7\x4a\xf9\x23\x4c\xbf\x1a\xd8\xf2\x2c\xee\x89\x74\x82\x8a\x0d\x09\xe9\x55\x4b\x71\xee\x3b\xcf\x88\x0a\xb9\x83\x25\xf7\x06\x27\x21\x94\xeb\x2e\x80\xc7\x01\xd4\x41\xb5\xf8\x66\x85\x61\xb8\x88\x49\xf8\x27\xaf\x70\x3a\xb0\x95\x41\x05\xfd\x3c\x54\xb3\xf6\xec\x54\x93\x59\x6d\x0e\x3b\xc6\x78\x18\x04\x83\x10\xc4\xa3\xe0\xc5\x56\xbc\x80\x67\x5f\x20\x1f\x9b\xb9\xc6\x53\x8a\x41\xd9\x9a\xa4\x0c\x88\x6f\xc4\x31\x46\x72\x18\xd8\x19\xc2\x3e\x78\x49\x8a\xed\x06\x13\xfa\x6f\x97\x3e\x22\x11\xdf\x9f\xb8\x7f\x44\x11\x6f\x3f\xe4\xc2\x6d\x6c\xb2\xfa\x33\x4c\x87\xf7\x8c\x08\xca\x8c\x9b\x90\x41\xd8\x3a\x12\x30\x67\x7e\x0a\xf7\x88\x59\x8a\x42\xe4\x4c\xfd\xf6\x96\x4a\x4e\xe8\x0e\x38\x40\x2b\xa6\x7c\x73\xa5\x81\xe5\x52\xba\xa2\x28\x24\x25\xcb\x2c\xa1\x7c\xa9\x2e\xdf\xbf\x98\x29\x91\x02\xfb\xa7\x61\xb9\xb7\x1a\x54\x52\x14\x1b\xb9\xc1\x8d\xd9\x5f\xeb\xc2\xa7\x82\xde\x9c\xee\xc0\x8b\xd2\xee\x3f\x7f\x0c\x1b\xd8\x94\x6d\xba\x99\xcf\x9e\xa0\x86\xab\xaf\xd3\x7c\x9c\xa6\x02\x13\xf0\xde\x17\xc6\x1f\xf9\xc3\x91\xc9\x81\x8e\xd5\xcd\x85\x71\x77\x8b\x7d\xcc\x13\x22\x49\x62\x38\x6f\xb8\xca\x14\xf8\x61\xe9\x9f\x3b\x18\xed\xac\x8a\x5f\x13\x0f\x7b\xfc\xd4\x5d\x04\x5d\x0f\xf3\x4c\x81\x57\x2a\x51\x23\x63\xd6\x53\x0f\x93\x81\x3e\x5f\xb1\x0e\x9c\xb8\x33\x8a\x7f\x93\x80\x04\x91\x00\x6f\x44\x63\xe8\x9f\x0e\xd4\x53\x0e\x5f\x12\xdf\x67\x4f\x59\x89\x04\x78\x0a\xd0\x81\x2b\x1e\x35\x21\xfc\xd0\xf8\x3e"}, -{{0x5f,0x1f,0x27,0x18,0x44,0xd9,0xed,0x5a,0x6a,0x6f,0x20,0x9a,0x21,0x40,0x8d,0xae,0xa4,0x70,0xf6,0xfd,0x53,0xba,0x64,0x79,0xd7,0x40,0x71,0x05,0xb7,0xde,0x4d,0x65,},{0x60,0x85,0xd7,0xfb,0x5a,0x9b,0x2e,0xd8,0x06,0xc1,0xfd,0x30,0xa2,0xaf,0xde,0x76,0x09,0x61,0xf7,0xa3,0x6b,0x48,0xf4,0x87,0x52,0x46,0xe6,0x15,0xa2,0xbd,0x99,0x28,},{0x31,0x9b,0xb4,0xde,0xb2,0x17,0x81,0x12,0x24,0x1b,0x3f,0xb8,0xf4,0x6e,0x10,0x5c,0x3b,0x8e,0x4e,0xf7,0x21,0xeb,0x20,0x0d,0x76,0x2e,0xf3,0x63,0xe2,0x71,0x6f,0x2a,0x89,0xf8,0x0b,0x5b,0x9e,0x89,0x97,0x08,0x90,0xa0,0x98,0x92,0xad,0x6a,0x58,0x80,0x8b,0x47,0x7e,0x94,0x3b,0x3c,0xfa,0x77,0x77,0x4a,0x36,0x45,0xbc,0x74,0x5f,0x03,},"\xee\xd6\xb4\x47\x5d\xc2\x63\xbd\x22\x07\xfe\x9d\x41\xd4\x82\x82\xb7\x13\xf6\x80\xf2\xe0\x37\x38\x4f\x18\xb4\xbf\x22\x43\x47\xf5\xe4\xc4\xb0\x60\xb8\x08\xd4\x12\xea\xab\xcf\x73\x3d\xc3\x9a\x40\xc6\xbd\xa0\x50\x5c\xe7\x1f\xa8\x23\xbd\x1b\x17\x94\x84\x76\x78\xdc\x03\x4e\x79\x99\xc1\x63\x69\x34\x0b\xc6\x0c\x64\xd0\x9b\xb9\x18\x7b\x2e\x32\x60\x55\xa0\x53\xf8\xe5\x05\xea\x41\x96\x86\x14\x71\x62\x2d\xb0\xe4\x6f\x0f\x89\x54\xd8\xa1\xf0\x73\x32\xda\x4d\x8a\xc5\x57\x12\x62\x60\x09\x91\x2f\x8a\x15\xa9\xcd\x63\xa7\x4a\x03\xc9\x2f\x24\x6c\xb6\x3c\xc7\x3f\x92\xe5\x1d\xad\x1b\xc9\x71\x5b\x1e\xd3\xfe\x5f\x2e\x1b\x29\x59\xb9\xb7\x1e\x0e\x37\x36\x0e\xb2\x95\x36\xcf\x79\x71\x47\xfa\xb1\x08\x64\xd6\x14\x6c\x36\xb8\x23\x35\xa0\xce\x93\x14\x08\x47\x9c\x7e\xde\x48\x4f\xf7\x3e\x2d\xbf\xff\xc6\xc9\x22\x7e\x16\xd7\xa2\x3f\x4d\x90\xf1\x55\x84\x51\x4c\x39\x59\x4e\x17\xbf\xbb\x29\x5d\xe9\xd6\x2a\xda\xdb\x58\x9d\xbb\xe0\xb0\x6d\xc8\xda\xc5\xb3\xbf\x51\x7b\x24\xc1\x83\x7b\x39\x47\x2a\x6d\xd3\x89\x31\xff\xbb\xff\x5b\x76\x36\x38\x80\x5b\x4e\x22\x32\x1f\x7a\xfe\x92\xcd\xf5\x02\xfb\x63\xd1\x09\xdd\xcd\x9e\x40\x51\xad\x6f\x45\x59\x85\x32\xbe\x17\x95\x23\x71\x08\x51\xd3\x93\x1e\x88\x7d\x02\xc3\x45\xc7\x9c\x48\x9f\xc1\x06\xa4\xae\x16\x2f\x7d\xf7\x1a\xb9\x0b\x75\x1d\xa7\x03\x8a\x6d\xf7\x61\x6c\xfc\x11\x88\x7e\x21\x06\x8f\xb9\xe3\x3b\xe5\x66\x40\x2b\xe5\x04\xf3\xfc\x27\x42\xb8\x81\x50\x9b\xd4\xfe\x6a\x0f\xc7\x22\x64\x98\x83\xf8\xcb\x65\x55\x98\xa1\x5a\x1d\x4c\x22\x9d\xd8\x6b\x5c\xae\xb7\x11\xa0\x28\xde\xfd\x43\x11\x54\xbb\xa4\x6b\x48\x17\x2a\x4d\x8c\xbd\x45\xbc\x90\xaa\xf8\x74\xb6\x08\x5f\xa2\x84\xf5\xfe\xd6\x55\xad\x6f\xa1\x7d\x67\xb3\xb9\xa7\x96\xfa\x3e"}, -{{0x04,0x8a,0xc9,0xec,0x3e,0xcb,0x30,0xa3,0xb1,0xbf,0xda,0x9b,0x3b,0x79,0xa4,0x8c,0x07,0x93,0xb4,0x90,0x87,0x9e,0x3c,0x8a,0x5e,0x23,0xee,0x2b,0xab,0xcd,0x9b,0x7c,},{0x94,0x6c,0x18,0x6f,0xea,0xfc,0x35,0x80,0xa5,0x8d,0xdd,0x52,0x6f,0xf2,0x29,0xc0,0x47,0x20,0x25,0x0f,0x4c,0xf6,0xbd,0xe0,0x27,0x1e,0xef,0x9b,0x12,0xb1,0xc3,0xf3,},{0x2e,0xcf,0x5b,0x8a,0x59,0xa8,0xe2,0x7d,0x25,0x89,0x0a,0x2a,0xa3,0x2f,0x4a,0x06,0x73,0x27,0x5d,0x53,0x9b,0x17,0x4a,0xfa,0x7b,0x2c,0xeb,0xf2,0xe7,0x62,0x80,0xdf,0xfc,0x33,0x8e,0xde,0x85,0xac,0x8f,0x61,0x40,0x39,0x56,0x0e,0x28,0x06,0xd9,0xe1,0xe3,0xcf,0x9c,0xce,0x2c,0xeb,0x78,0x74,0xff,0xe1,0xa7,0xe8,0x0c,0xde,0xf4,0x0b,},"\xd6\x8b\xe8\xef\x7b\x4c\x7a\x42\x89\xf2\xb1\x8b\x16\xad\xe9\x7f\x4e\x4f\xa1\x64\x52\x97\x6a\xfb\x58\x16\x93\x38\x0c\xc5\x4d\xe3\x8a\x07\x58\x7f\x32\xe2\xd4\x54\x9f\x26\x59\x5f\xee\x23\x93\xbd\x06\x2e\x9b\x00\xba\xe7\x24\x98\xe4\x14\x8c\x8b\x88\x2a\x88\x40\xe1\x5b\x58\x5c\x82\xb5\xc0\xde\xfb\x23\x35\x18\x40\x99\x16\x61\x5d\xeb\x3a\x55\xa5\xf8\x4e\x6b\x3a\xab\x93\x84\x4d\xe3\xb1\xe4\xd8\x6e\x09\xf8\x89\xac\x71\xc3\x24\xeb\x12\xd0\xfb\xd8\x61\xcc\x31\x22\x95\x40\xe8\x43\xa3\x4f\x8d\x5b\xe4\x7c\x0e\xc0\xd2\x3d\xf4\x3e\x06\x81\x3f\xca\x30\x94\x39\x90\x4c\x16\x7d\x10\x43\xc0\xdc\xd4\x44\xb0\x04\xbe\x1f\xf2\x7b\x78\x62\xb0\x0e\xba\x94\x33\xb9\x4b\x0f\xcd\xc6\x75\x21\xda\x0c\x1d\x53\x58\x63\x6c\x78\xf5\x30\x43\x11\x64\xdd\xe2\x0a\x1c\xf1\x64\xf5\x1e\x29\xb8\xe6\x3e\xac\xde\xcc\x86\x9b\x41\x39\x2c\x66\x76\x64\xd9\x16\x80\xd9\xac\x51\x6a\xf5\x48\xf0\x9e\x60\x56\x4e\x81\x4e\x36\xe0\xb5\x63\xdb\xae\x55\xc6\x27\xff\xc1\x41\x58\xa5\x6d\x8e\xb3\x60\x9e\x17\x43\x81\xb2\x1d\xe4\xba\x82\x34\x44\x66\xdd\x57\x7f\x4d\x11\x03\xc4\x3c\x27\xfb\x83\xcb\x83\x3d\x87\xaf\xdf\x74\x12\xb4\x09\x09\x09\xb1\xdd\xe2\x64\xda\xdd\xce\x96\x7f\x49\x6b\xf6\xf1\x71\x12\xbf\x35\x1e\x41\x7d\xb5\x95\x3b\x13\xb8\xf0\xfc\xcc\xbf\x30\xf5\xbc\xf3\x76\x86\x1c\x12\xef\x20\xee\xc8\x9e\xd2\x3c\xf3\x84\xee\x78\xdc\x6e\xb4\x0f\xd5\x81\x1a\x7b\x23\x92\x7c\x13\xe7\xdc\x5d\xa3\xa9\x21\xb8\x83\xa9\xb2\xb1\x15\x59\x70\xfb\x0d\xa7\xd2\x99\x3d\xcd\xfd\x43\x43\x64\x2a\x9d\x5a\x63\x47\xe4\x3c\x19\x3b\x57\x93\xe4\x45\x3a\xc1\x53\x7a\xa3\xd0\x4d\xc9\xf7\x74\xe8\x40\x93\x48\x81\xd7\x8a\x39\xba\x25\x04\x38\xc5\x07\x25\x0e\xed\x2f\x6e\x07\xcc\x95\x3f\x78\x3d\x6b\x72\xb1\xcc\x61\x99\x81"}, -{{0x2f,0x05,0x7d,0x20,0xb1,0x67,0x85,0x31,0x61,0x1f,0x48,0xf0,0x03,0xb7,0xd2,0x2e,0xba,0x5d,0xbb,0xd7,0xe2,0xdd,0x41,0xb7,0xc7,0x9d,0x09,0x07,0x1f,0x85,0xe9,0x93,},{0x62,0x0f,0xc4,0xea,0xa3,0x4d,0x78,0x7d,0xf6,0x75,0xcc,0xbf,0x7e,0x89,0x32,0x04,0x82,0x8d,0xb9,0x2e,0xad,0x17,0xa1,0x16,0x5a,0xc7,0xfa,0x1a,0xb4,0x27,0x19,0xd8,},{0x30,0xdf,0x7b,0x0b,0x1c,0x04,0xfb,0x1e,0xfa,0x35,0x17,0xe9,0x28,0xd6,0xd5,0x7c,0x2c,0xa0,0xd0,0x7f,0x4e,0x04,0xff,0xb1,0xf0,0x8b,0x47,0x92,0xc5,0x93,0x7d,0xd2,0x71,0xcc,0xab,0xdc,0x00,0xdc,0xe8,0x50,0xaf,0xe5,0x0a,0xf5,0x99,0x0f,0x22,0x4e,0x84,0x20,0xa6,0x81,0xd9,0x5f,0x9f,0x7f,0x51,0x5a,0xfe,0xc1,0x02,0xef,0xd1,0x0e,},"\x6e\x35\xf6\xea\xa2\xbf\xee\x06\xea\x6f\x2b\x2f\x7a\xb1\x5f\xa9\x7c\x51\x80\x95\x8a\xf2\xe9\x0a\xf9\x18\xad\xfb\x3d\xb8\x32\x3f\x44\x7c\x7b\xf2\x6d\xc5\x34\x99\x7c\x38\xb7\xfc\x97\x7f\x64\x2d\xe2\x88\xcd\xf2\x53\x07\x1c\xac\xf3\x56\x4e\x3b\x8e\xd6\xdc\xe5\x7d\xdf\xba\x9f\xf7\x83\xba\xd2\xe7\x6d\xf1\x24\x82\x8f\xc1\x03\x1a\xcf\xad\xf0\x1a\x44\xd4\x1b\x42\x16\x1a\xd9\x06\x03\x01\xc1\xaf\x19\x28\xb9\xe5\xb7\x3b\x9b\xd2\x1c\xac\x60\xa8\x42\xb5\x04\xdc\x3c\xc3\x11\xc5\x22\xe3\xbb\x04\x8b\xf2\x21\x44\x4f\x53\xce\xb0\x8e\x77\xe9\x48\x59\x0e\x94\xed\x98\xf1\xb6\x04\xcb\x9e\xad\xc9\x3b\xbe\x74\x31\xc1\x14\x9b\x23\x19\x3f\xf9\x3e\x85\x69\xf1\x13\xe1\x68\x4d\x89\x76\xec\xae\x6f\x09\xe0\x10\x36\x14\xbe\x41\x8a\x47\x2e\xf5\x5b\xb8\x89\x0d\x72\xb3\x41\xcd\xd7\x50\x5b\x50\xa4\x55\x22\xab\x63\xed\x79\x1c\xe8\xf8\x2f\xed\xdd\x7a\x62\x0a\x4f\x6f\xb1\xd2\xfb\x0e\xd0\xc4\x56\x0d\x78\x44\x6d\x83\xb3\xd1\xb1\xbb\x56\xb3\x66\xd1\x96\x02\x0d\x06\x24\xb1\xfb\xdb\x75\xce\x73\x5d\xd4\x3e\x8e\x8d\xf1\x63\xc4\x4e\x23\x69\x93\xdc\xa3\x41\xf5\x13\x2d\x82\x5d\x0a\x4e\x39\x3a\x19\xd3\x8f\x61\xe1\x1e\x0c\xf3\x92\xcb\x9b\x64\x6e\xa2\x3c\x58\x09\x98\x24\xdd\x8d\x9f\xbe\x26\xa4\x9e\x33\xb2\x3d\xf8\x06\x07\xab\xf1\x97\x15\x79\x9c\x19\xac\xc7\x22\xed\x9b\xcf\x94\xa0\xc2\x9a\xd2\x4b\x78\xb0\xb0\x35\xb3\x24\x1c\x64\xcd\x86\xed\xea\xc8\x10\xe6\x67\x45\x69\x4b\x5e\xb1\x62\x50\x60\xed\xf2\xd9\x49\xde\x0d\x34\xf5\x22\xdf\x2d\xc6\x0a\xe6\x94\xa1\x93\xf3\xb8\x2c\x1d\x6f\x83\xa0\xcb\xb8\x40\xf4\x6c\x49\xa3\xd7\xd1\xcf\x06\xde\xaf\x96\xc6\x4f\x8f\x9e\x17\xbd\x9a\xd5\x12\xae\x63\x09\xc4\x86\xd9\xe2\xa7\x8d\xce\xec\xa4\x73\xa0\x42\x1d\xd1\xb6\x43\xc7\x87\x54\x27\x1b\x53\xce"}, -{{0x3a,0x3d,0x27,0x97,0x0f,0xe2,0xac,0xb6,0x95,0x1e,0xdd,0x5c,0xa9,0x0d,0xda,0x0f,0xc6,0xdd,0x22,0x9c,0x0a,0x56,0xdf,0x6e,0xb1,0x1a,0x9c,0x54,0xd2,0x42,0xdb,0xbf,},{0x56,0x4f,0x0d,0xc3,0xdc,0x47,0x20,0xe6,0x8e,0x44,0xdd,0x16,0x71,0x1e,0x04,0x9e,0x61,0x12,0x00,0x00,0x98,0xfa,0x62,0xa1,0xb9,0x8c,0x28,0x80,0x42,0xf7,0xc3,0xbd,},{0x22,0xeb,0x8e,0xa0,0x50,0x73,0x49,0xb6,0xa0,0xac,0xe2,0x5c,0xf9,0x18,0x0c,0xb0,0x8e,0x03,0x57,0xb0,0x45,0x02,0x90,0x5f,0xbe,0x69,0xb4,0xe2,0x1b,0x2b,0xd9,0x4e,0x22,0xcf,0xbd,0xb8,0x51,0xae,0x71,0x6a,0x5c,0x25,0x3c,0x70,0xd5,0xe2,0xb2,0x4e,0xa7,0x8f,0x35,0xbc,0x21,0x32,0x92,0x54,0x3d,0x94,0xe1,0x41,0x10,0xb2,0x41,0x06,},"\x43\x74\xf6\x1c\x2c\xd8\x8a\x3b\x89\x72\x24\x9b\xfa\x79\xb3\x6a\xb6\x9e\x3e\xd4\x84\xcc\x60\xe5\xd9\x54\x1f\xa7\x68\x6c\xf4\xee\xd1\x21\x0c\x5d\x0d\xcf\x42\xdd\x25\x97\x25\x01\x90\x91\x93\xca\x76\xae\x6e\xb7\xf4\x71\xd8\xbd\x0d\x5f\xb5\xa6\xb4\x31\xbc\x3d\xe0\xe0\x31\x8d\x50\x51\x45\x24\xde\x87\xc4\xb8\x30\x05\xdf\xb4\x12\x45\xfb\x1a\xf7\x9b\x84\xa9\x7b\x83\xd3\xca\xc7\xad\x7a\x53\x36\x4e\x2e\x9b\x21\xc9\x7b\x76\x9b\xdc\x57\xf0\x70\x31\x16\x16\x83\x80\xf3\xcc\x88\x36\x89\xeb\x4a\x7f\xa3\xb2\x6d\xbe\x12\xbc\x28\xf8\xc4\x03\x81\xaf\x64\xdf\x4b\x53\x61\xd1\x74\xcf\x75\xac\xbd\x46\x42\x87\x40\xb0\xd1\x32\x2d\x32\xbb\xe9\x48\x45\x21\x59\x66\xae\x58\x87\x77\xa8\xc0\x53\x36\xe3\x52\x30\x6d\x49\x27\x8d\x32\x8e\x49\x6d\xb6\x5e\x9e\xcf\x6c\xe6\x40\x5e\xd1\xc8\x93\x49\x0b\xc4\x8c\x13\xa1\x34\xe1\xfb\x6e\x80\xde\xbe\x6d\x32\xfc\xe6\xef\x74\x78\x3c\x8d\x77\x98\x0a\x44\x1a\x26\xae\xb4\xfd\x83\xcc\x85\x53\x52\xce\xdc\x18\x8f\x52\x79\xce\x21\x1f\x74\x4a\x40\xb2\x3c\xe7\xff\x24\x43\x7a\x1d\xd3\x37\x3e\xc5\xb2\x90\xda\x1f\x94\xf4\x3a\x07\xa3\xff\xea\x5b\x5f\x67\xb5\x2c\x19\x61\x85\xbc\xe9\xe9\xa8\x58\x25\x7f\xcd\x7a\x8e\xba\xf9\x04\x0e\xd0\x91\xfa\xce\x5a\x15\x5a\xa4\x47\xfa\x15\xe1\x21\x22\xd2\x5e\x8f\xc3\x6e\xae\xe2\x13\x7c\x7b\x3a\xa3\x0b\x7e\x3f\xf6\xcc\x86\xb6\xdc\xb9\xea\xf4\x9c\x95\x76\xf0\xf4\x62\x00\x84\x39\xcb\x1a\x3a\xba\x01\x3e\x89\x7a\x0f\xaf\x99\x4c\xb7\xd5\x9e\xde\x57\x74\xbb\x14\x47\x74\xf7\x3c\xa3\x0e\x64\x14\xa7\xcc\x7c\x74\xb2\x0c\x51\xa1\x40\x4d\xdc\x41\x9e\xf7\x62\x45\x93\xe9\xbc\xfb\x37\xc0\xa7\x62\xea\xb6\x8f\xac\xa5\x86\x34\x43\xe1\x6e\xdb\x75\x9d\xbc\x87\x88\x73\x2b\x9e\x4f\x59\xc1\x11\x92\xc3\xfc\xc8\x72\xaf\x55\xf3\x2d"}, -{{0x06,0xd4,0x98,0x31,0x8d,0xa4,0x56,0x24,0x2b,0x9c,0x3b,0x9a,0xb6,0xd5,0x32,0xa1,0x28,0xfc,0xe0,0x44,0xf5,0x38,0x82,0x68,0x2e,0x92,0x62,0x14,0x9c,0x16,0x52,0x88,},{0x41,0x35,0x17,0xaa,0x63,0x20,0x0a,0x17,0x17,0x32,0x09,0xa4,0xb3,0xe7,0x8a,0xb9,0x38,0x3c,0xb4,0xe3,0x9e,0xfd,0x67,0x94,0xc4,0x6a,0x2d,0x13,0xfa,0xfa,0x99,0xc0,},{0x82,0x50,0xf7,0x6d,0xc5,0x99,0xc5,0x12,0x87,0x87,0xe4,0xf6,0xd3,0xda,0x23,0x17,0x33,0x30,0xce,0x33,0x20,0xdb,0xa9,0x59,0xbd,0x71,0x4c,0xc8,0xcc,0x07,0xc6,0x79,0x45,0xd6,0x3e,0x75,0x66,0x2c,0x07,0x5e,0x26,0x74,0x60,0xab,0x7b,0xf5,0x61,0xf2,0x4f,0xaa,0xe3,0xb4,0x1d,0xbf,0x67,0x68,0x99,0x19,0x1e,0x3b,0x02,0xb5,0xaf,0x0a,},"\x3f\xe3\x0e\xcd\x55\x07\x7a\x6e\x50\xdf\x54\xbb\x1b\xf1\x24\x8b\xea\x40\x63\xe3\xfa\x75\x5f\x65\xfc\xd1\x15\x9e\xe0\x46\xef\xd0\xeb\x5f\x2f\xbb\x38\xb5\xc0\x09\x47\xc9\x7d\xc8\x79\xb3\x6b\x9e\x53\x61\x92\x28\x60\x86\xd0\xdc\x12\x05\x36\x10\x38\x61\x74\xa7\xc5\x6f\x22\xa8\x5b\x73\xff\x20\x8c\x59\x44\xf3\x93\x23\x6c\x32\x41\x58\x09\xda\x03\x6e\x73\xca\xd8\xfc\x3c\x30\x37\x80\x64\xa7\x6a\xfa\x93\x0a\x3b\xaa\xe9\xaa\x35\x70\x61\xa8\xc5\xe8\xe7\x56\xa9\xce\xcf\x94\xb7\x2d\xf4\x3f\xac\xd8\x8f\xa4\x9c\xb4\x94\x8c\x63\x68\x31\x8a\x6b\x1e\x5c\xff\x52\xe5\x87\xec\xdf\xae\xfd\xb6\x90\x81\xf2\x8c\x2d\x13\xbf\x8e\xab\x81\xdb\xaa\x5e\x37\x28\xc4\x31\x7f\xb7\x93\xdd\x19\x6b\xca\x0f\xe5\x4a\x6c\x24\x2c\xf2\x6e\x2d\x12\x9b\xa0\xd8\x2a\x2c\x3a\x45\xbc\x8d\x1d\xfd\x6f\x54\xf8\xda\x4f\x51\x89\xc9\x1a\xc2\x14\xfd\xab\xf4\xc5\x97\x38\x1b\x2e\x5c\x40\xcc\x71\xfa\x70\x51\xcf\x2e\xa9\x39\x06\xa3\x7d\x57\xdf\x12\xd5\xc7\xe5\xcd\x77\xc9\x07\xe4\x42\x56\x63\x15\xba\xe5\x1a\x22\x22\xd6\x2e\x3f\x42\xd1\x76\x78\x82\x63\x7d\x66\xa1\xd5\x30\x5a\xb4\x01\x0a\x0e\x49\xc5\x7d\xef\x69\xdc\xea\x83\x9e\x1b\x76\xa4\x11\x35\xba\x95\x2c\xc4\x24\x95\x0e\x8d\x3a\xac\x19\xe1\xd9\x3d\xe7\x75\x7c\x15\xff\x99\x97\xb3\xd2\xa8\x61\x3c\xd9\xa1\x64\x78\x1d\x1b\xe3\x31\x79\x9f\xa6\x10\x9c\xef\x61\x43\x05\xa1\x95\x8f\x62\x90\x3c\x8c\x9e\xa0\xb2\x3b\xa7\x06\xd4\x9c\x54\xba\xcc\xc1\xe6\x3c\xb4\xbf\x14\x78\x5f\xc7\xb0\x62\xa9\x80\x03\x49\xbd\xb0\xbb\x92\x72\x60\xb6\x77\xb6\x0f\x10\xe6\x2c\x87\x80\xf3\xeb\xb5\xeb\x6f\xf0\x36\x02\x63\xd4\x57\xab\x52\xfd\x11\x25\xc9\xce\x04\x6a\x95\xd8\x9d\x28\x73\x50\xc8\x04\xcf\xd4\xff\x2b\x2d\xdd\x18\xa9\xe1\x35\x19\xf2\x0b\x4d\x1e\x05\x1a\xf6\x24\x64\x0f"}, -{{0x8e,0x8e,0x1d,0xb5,0xb1,0x10,0x2e,0x22,0xa9,0x5c,0x47,0xaf,0x36,0x61,0x46,0x9f,0x00,0x0a,0x33,0xf1,0x3b,0x8b,0x87,0xb1,0x15,0xd2,0x45,0x2a,0x41,0x1f,0x6f,0x39,},{0x56,0xd7,0xb3,0x16,0x9a,0x95,0xc2,0x29,0x98,0xec,0x93,0x79,0x25,0xbd,0x7c,0xad,0x13,0xcc,0x65,0x80,0x8c,0xd5,0xd3,0x4a,0x6c,0x4d,0xa8,0x70,0xea,0xf3,0x23,0x64,},{0xf6,0xee,0x5e,0x13,0xcf,0xaa,0x36,0x2c,0x89,0x71,0xd5,0xa4,0xa8,0x79,0xa7,0xe3,0x69,0x66,0x52,0x5c,0xcd,0x86,0xc5,0xa4,0x8c,0xba,0x08,0xd9,0x13,0xec,0xe1,0xa7,0x9c,0x4c,0xd1,0x46,0xb8,0xe9,0xc6,0x51,0x25,0xfb,0xad,0xf1,0x7b,0xac,0x1c,0xab,0xcd,0xe8,0xfd,0x17,0xcf,0xd6,0x8f,0xa1,0xf9,0xc4,0x4e,0xa6,0x1c,0x08,0xa4,0x05,},"\xb2\x46\x34\xfb\xdd\x1b\x76\x61\x31\x5d\x9d\xc1\x53\xba\x90\xd6\x6a\x88\x62\x2a\x41\x58\xf8\xbc\xff\x25\xba\x9c\x29\xe6\x5f\x29\x7f\x8e\x60\x31\x18\x00\xb7\x33\x1b\x69\xfc\x20\xc9\xf8\x5b\xb7\xc1\x84\xbd\x40\x86\xb3\xa9\xf9\xa2\x71\x02\xb6\x23\x62\xbd\xb4\xfa\x5b\x20\x15\x94\x25\x0f\xc6\x28\xfd\x2e\x0e\x0d\x1b\xe0\x3d\xcf\x81\x8c\x60\x94\xc4\xc2\x91\x21\xcb\x2b\xf6\xd9\x08\xed\x8a\xab\x42\x7c\x37\x71\xc0\xc9\x5f\x0a\xc1\x46\x9a\x08\x10\xb6\x03\xa4\x70\x28\x2e\x59\x80\xa6\x07\x29\x19\x7f\xe6\xc2\x0e\xf6\x81\xcd\x1b\x96\x93\x2d\x20\x58\xf8\x96\xea\x74\x16\x42\x2a\x7e\x54\x1f\x22\x4a\x5f\x04\x25\x30\x80\x74\x1c\x5d\x4e\x3e\xb0\x39\xdb\x6b\xa0\x51\xb4\xca\x54\x17\xce\x8a\xfd\xc7\x02\x14\xba\x4d\xcc\x85\xb6\x23\xd1\x1e\x68\x1c\x60\x09\xae\xe4\xe6\x13\x0a\x83\xed\xd0\xd2\xc9\x9f\xb0\x64\x7e\x11\xed\xe7\x30\x1a\xe5\x6b\x59\x90\x4e\xf7\x02\x57\x32\xcd\xe0\x38\x80\x1e\xc7\xe8\xd9\x0a\x9a\x1b\xba\x04\x7f\xe6\x28\x35\x1b\x3b\x89\xd0\xbc\x5a\xe6\x65\xa7\x00\x89\x1f\x09\xeb\xee\xc0\x55\x91\x84\x2a\xdf\xcc\x25\xad\xc3\xc7\x1c\x1e\xbc\x4a\x31\x2e\x54\x71\xbe\x67\x25\x3b\x0e\x94\x28\xb0\xca\xe3\x76\x45\xa0\xf7\xec\xb8\x9d\xd7\x9f\xbd\x9b\xe2\x87\x54\x33\x66\x7a\xe0\x7d\x74\xa7\x98\x3c\x4c\xea\x60\x1e\x72\xe9\x75\xc2\x1d\xf9\x93\xe7\xfa\x22\xa9\xfa\xbd\x45\x45\x5d\x45\xe3\x70\x31\x55\x8e\x13\xa7\xa4\xf5\xf4\x97\xea\x78\xfb\x73\x99\xf8\x83\x8c\x0f\xd5\xde\x4e\xbb\x66\xdb\x29\x0f\x43\xa4\x86\x7d\x50\x53\x09\xf1\xc1\xbc\x27\xe9\xfa\xbc\xbb\xa7\x13\x02\xfc\x12\x04\x71\x5c\xe3\xfc\xb0\x90\x5b\xfa\x41\x1c\x9d\x1c\x9a\xb4\xa3\x99\x54\xe5\x0b\x8e\x0c\xf7\x36\xc1\x02\x89\x56\x3b\xdf\xa9\x67\x55\x3c\x36\xcd\x9e\x55\x5b\xc8\xcc\x56\xbe\x59\x48\x47\xde\x9f\x26\xf9"}, -{{0x38,0x84,0xb8,0xb7,0x9a,0xbf,0xd3,0xbe,0x6c,0x13,0x98,0x5e,0xb8,0x59,0xab,0x74,0x3f,0x15,0x7c,0xd9,0xde,0xb8,0x1b,0x2f,0xe9,0x7e,0xa4,0xd6,0x17,0x3e,0x46,0xf5,},{0xbd,0x7f,0xd9,0xa8,0xde,0xf1,0x3a,0x54,0x2e,0xd2,0xf2,0xfb,0x04,0x88,0x86,0x88,0x5b,0xa9,0xb5,0xce,0x59,0xcb,0x70,0x19,0xfb,0x54,0x66,0x79,0x86,0xee,0xbc,0x26,},{0xf4,0x20,0x6f,0xcd,0x34,0x50,0x24,0x41,0xd5,0x4a,0x73,0x32,0x3f,0x33,0xa5,0xdb,0xb4,0xc9,0x85,0x57,0x31,0x9f,0x21,0x24,0x6f,0x26,0x0f,0xfb,0xbe,0x58,0x44,0x88,0x6d,0xb5,0x67,0xf4,0xb6,0x3c,0x47,0x94,0x3d,0xbb,0x78,0xfc,0x35,0x65,0x7d,0x7c,0x04,0xd4,0xfe,0xb0,0x42,0xff,0x85,0x36,0xf6,0x72,0x92,0x5c,0x31,0x9e,0xfb,0x09,},"\x12\xad\xaf\xe3\x0e\xaf\x2b\x9c\x72\x03\xca\x5d\x44\xb9\x7f\xfe\xd4\xbf\x65\x17\xa4\x99\x88\xe4\xe6\x76\xc8\xe3\x14\xad\xbd\xbe\x23\xd8\xf2\xd3\xe2\xb0\x81\xa7\x02\x4f\xa5\x25\xab\x5a\xae\x26\xe6\x00\x57\xc1\x01\xe8\xf3\x68\xd3\xad\xdb\x93\x76\xc4\x68\x2c\x1f\x42\x24\xd7\xf1\x49\xa8\x47\x4b\xb9\xa8\xf6\x63\xef\x21\x0e\x95\x72\xce\x82\x9d\xa3\x88\xd8\xaa\xe7\x2a\x46\x71\x41\xad\xc1\x53\x47\x3b\xe3\x65\x3b\xaa\xa6\x4b\x5b\x1e\x2e\x30\x68\x3f\x6f\x06\xda\xc2\x78\x4d\x5b\xbf\x0d\x08\x2a\xab\x47\x30\x5e\xd8\xa8\xef\xd0\x88\x6c\xe6\x3a\x17\x93\x15\x22\x5d\x1e\x4d\x4f\xfc\xf1\xf2\x4a\xc2\xf4\x64\xcf\x5e\xd3\xa8\xb6\xd3\x99\x84\x54\xf1\xc0\x2c\xdb\xf0\xa4\x44\xee\x2b\x59\xdd\xbe\x0a\x17\x4a\x0d\x93\x7f\xa6\x28\x65\x08\x8a\xc6\x47\x49\x99\x57\xd2\x81\xc6\x94\x98\x03\xa5\xfb\xdf\xdd\x0d\xd9\xe9\x1b\x69\x76\x86\x1f\x3c\x5f\x21\x26\xf3\x9a\xac\x93\x5b\xe0\x9f\x4b\x97\x15\xbd\x4f\x0d\x5c\x55\xdf\x73\xa6\xb9\xf2\xc0\xad\x26\xce\x49\xd8\x22\xbf\x85\xbf\xa2\x34\x6f\x31\x65\xb0\x38\x59\xa7\x1c\x3d\x2a\x7b\x86\xdb\x6e\x9f\x2e\x5d\x7b\x16\x9a\x91\x0e\xeb\x7e\xf3\x8f\xbd\xfb\xbe\xc4\x3a\x9a\x25\xf0\x4b\xc3\xac\xfd\x3b\x06\x91\x54\x2a\xb6\xde\x9d\xb6\xf0\x30\x58\xf9\x58\x40\x24\xf9\x91\x8e\xde\xcd\x90\xfb\xb8\x57\x35\xd6\xdc\xec\x5b\xd5\x93\xae\x63\xe2\xcc\x96\x55\x35\x99\xa3\x10\xf8\xf2\x00\x9b\xa9\x53\x71\x19\x6b\x4d\x5b\x80\xe7\x55\x96\x37\xf2\x29\x26\x77\x8b\xe5\xe1\xcc\xef\x51\x26\xe2\x44\x3f\xa9\x39\xc2\xa5\x3d\xdd\xb0\x49\x61\xee\xfd\x34\xe5\x38\xcd\x8d\x7f\x0b\xec\x2b\xff\x1e\xf0\xd3\xa4\xbd\xd3\x58\x31\x76\x37\xf4\x2d\x59\x55\x38\xc1\x12\x22\x51\xa9\x4e\x96\x3d\x1f\x81\xe7\xb9\xae\xb1\x64\xf9\x5d\xa9\xa4\xed\x75\x29\xb8\x45\xeb\xc9\x61\xb2\x7b\x5c\x19"}, -{{0xec,0xd5,0x19,0xf2,0x87,0xad,0x39,0x50,0x52,0xb0,0xb3,0x0d,0xea,0xc3,0x41,0xd2,0xa9,0xdf,0x13,0xd6,0x56,0x7c,0x89,0x1c,0x81,0x3a,0x0c,0x9c,0xa5,0x2e,0x87,0x1e,},{0x8e,0xe9,0x4c,0x58,0x8e,0x0b,0x34,0x35,0x85,0xfc,0x67,0x48,0xfd,0x1b,0x54,0xb5,0x77,0x0c,0x64,0xe9,0x93,0x7a,0x56,0x35,0x7a,0x48,0xd4,0x4a,0xe2,0xf5,0x18,0x24,},{0xe8,0xf5,0x1b,0xe7,0x3f,0xc4,0xe0,0x23,0x5a,0xa1,0x53,0xa2,0xe1,0xb3,0x54,0xe9,0xc5,0xd2,0xd3,0x3a,0x11,0xae,0x0e,0x33,0x34,0x78,0xde,0x1d,0x8e,0x6c,0x44,0x56,0xd2,0xe2,0x50,0x82,0x4c,0x32,0x46,0xca,0x0e,0x8d,0x6a,0xe3,0xe1,0x66,0x77,0xa9,0x73,0x44,0x14,0x41,0x08,0xc1,0x3b,0x95,0x9e,0x1d,0xaf,0x51,0xcf,0x0f,0xe5,0x01,},"\xaa\x71\xbe\x5f\x55\x7e\x10\xc9\xfb\x5f\x09\x1a\x3a\x27\x44\x53\x94\x7c\x07\xa0\xe2\x5b\x26\xf9\x50\x92\x24\x54\x1d\xff\x76\xf4\xd9\x6e\xff\xd0\xd5\xa4\x1d\x31\x9b\xc9\x32\x1a\x86\x66\x7d\x55\xcf\x49\x43\x2f\xb5\xc3\xe7\x15\x38\x8f\x3f\x10\x6c\x91\x74\xb1\x61\x0c\x8f\x30\x75\xd5\x93\x1c\x29\x00\x99\x38\x5c\xe9\x24\x9e\x23\x51\x28\xe9\x07\xc5\x33\x90\x03\x6f\xbf\x5d\xa9\x68\xf8\xd0\x12\x33\x69\x58\xde\x90\xc5\xe8\xe6\xb1\x01\x6a\xd4\x3f\xb5\x7c\x8e\x28\x8d\xaf\xe1\x4e\x90\xe6\x4b\x63\x79\x1e\x5c\xbe\x55\x7e\x02\xdf\x8a\xc9\x37\x06\x42\xa7\x1f\xaf\x85\x10\x75\xe5\x56\x5f\x6f\x9a\x26\x7f\x4f\x6b\x45\x4c\xe4\xc5\x47\x48\x10\xb8\x04\x84\x4d\xda\x38\x39\x29\x39\x71\x97\x93\x24\x6a\xa4\x74\x54\xb9\xb0\xe8\x2e\x98\x03\xc0\x99\x35\xd0\x02\x7f\x39\x95\xcc\xa9\x71\x30\x69\xbb\x31\x02\x7f\x7b\x2a\xf1\x2f\xe5\xfe\xec\x7e\xeb\x06\x84\x3d\x82\x96\xec\x56\x82\x26\x2a\x07\xda\xe7\x47\xed\x7b\xc8\x21\xec\x17\x01\x8d\x89\x9f\xd1\x67\xb3\x6a\x7e\x37\x73\xb4\x27\x49\x9d\x99\xdc\x58\x3b\xbe\x4b\x42\x9a\xfa\x6a\x26\x59\x39\x53\xf9\x43\xe4\x67\x3b\xdd\x0d\x2a\x84\x42\x56\x13\x16\x03\xcd\x09\x03\x25\x6f\x33\x4d\x4f\x8e\xc8\x2d\xe1\x15\xb6\xca\x53\x38\xc7\x5c\x8b\xaa\x44\xb4\xba\x96\x3c\x7c\x78\x51\x0d\x8d\xe9\xb2\xa5\x85\x2f\x42\xf3\x46\x3c\x68\x5f\xb3\xa6\xda\x61\xa8\xe0\x89\x26\x62\xd6\xa2\x50\xfc\xaa\x6f\xef\x74\xd4\x50\xfc\x45\x7b\x98\x71\xd0\x8b\xb5\xbe\x30\x11\x29\x4a\xc8\x88\xfc\xe2\x15\xd5\x35\xc3\xb1\xa4\x3b\xb4\x7e\xfe\x3a\xd2\x5d\xa1\x59\x19\x1a\xed\x55\x19\x54\x69\xc5\x90\x93\xff\xb2\x4f\x65\xd6\x0c\x40\x20\xbf\xbe\x64\x7f\xf5\xdb\x7a\xb8\xa0\x1d\x5e\x48\x7b\x0b\x1b\x64\xef\x25\xda\x15\x6d\xb1\x42\xe6\xad\x87\x2a\x4d\xc1\xee\x9b\xa6\x68\x46\x52\x65\x37\x9e"}, -{{0x19,0x3f,0x3c,0x63,0x0f,0x0c,0x85,0x5b,0x52,0x9f,0x34,0xa4,0x4e,0x94,0x49,0x70,0xf4,0xa6,0x97,0x2e,0x6c,0x38,0x59,0x35,0x9c,0x2e,0x0c,0x87,0x62,0xba,0x9e,0xaf,},{0x32,0x56,0xf2,0xc8,0x2e,0x7c,0x80,0x12,0x01,0x21,0x01,0x40,0x56,0x9f,0xaf,0x18,0x50,0x7e,0x60,0x33,0x8c,0x2c,0xc4,0x11,0x8b,0xb1,0xce,0x60,0x5b,0x0e,0xbe,0x61,},{0xb1,0x25,0x10,0xac,0x5f,0x2f,0x6d,0x33,0x36,0x0c,0xdd,0xc6,0x72,0x91,0xd6,0xc2,0x70,0xfd,0x9e,0xe6,0x2d,0xc0,0x86,0xb3,0x8d,0x93,0x2d,0x26,0x47,0x3f,0xe9,0xa2,0x4e,0xfb,0xd4,0x24,0x88,0x67,0xea,0x7e,0x91,0x5a,0x30,0xc5,0xbf,0xb3,0xb8,0xb1,0x9a,0xa0,0x1a,0xa2,0xfe,0xbf,0x0d,0xac,0x6c,0xfd,0x66,0x38,0xa2,0xba,0x7e,0x0c,},"\x98\x62\x3f\x65\x16\x98\x08\x5b\xde\x02\x76\x2e\x8c\x33\x21\xf1\x4d\xa1\x61\x9b\x5c\x3f\x7c\x1a\x56\x8e\x8c\x26\xff\x0c\x62\xfd\xcc\x41\x24\x75\x91\x2e\xb8\xe8\xc4\xb0\xd3\x09\x18\xb8\xff\xee\xf3\x50\x93\x15\xe5\x8d\xa3\x59\xcd\xc2\xf2\x6b\xeb\xfb\x57\x03\x95\x3b\xe1\x6b\x8f\x3b\xeb\x1e\x54\xa1\xab\xee\x0a\xeb\xe2\x4e\x64\xdb\xe8\x73\x40\x2e\x15\x6f\x37\xdf\xc1\x68\xea\xf8\xa1\x14\xce\x08\xa6\x79\x5d\x3f\x64\xf5\x15\x1e\x9a\x8b\x82\x75\xcc\x7b\x49\xa6\xb8\xd8\xa6\x6b\x6d\x4b\x76\x32\xef\x80\x74\x0d\xc1\xc1\xb0\xa3\x8d\x1a\x28\xf7\xc1\xb2\x9f\xa4\x45\x41\xc1\xaa\xd3\x54\xd4\x59\x0c\x23\x1d\xae\x68\x7a\x2a\x8f\xed\x09\xe8\xc1\xeb\xbf\xcc\x38\xf3\x47\xbf\x06\xd9\x45\x77\xe4\x9a\xd1\x39\xf7\x10\xed\x8b\xb1\xfd\x07\x66\x3c\x03\x20\x84\x6f\xbb\x45\x5a\xb8\x37\xef\x96\x4a\xe7\xd4\xec\xee\xa4\x5f\xd7\xbd\x8d\x50\x9f\x82\x1e\x6e\xb0\x27\x49\x4e\xfd\x8d\xd8\xe9\x92\xb8\x86\x98\xee\xc2\xeb\xc5\xe0\x30\x25\xbe\x78\x9c\x18\x01\x3f\x20\x1f\x77\xaa\x2d\x34\xf5\x68\x64\x60\xe4\x3f\xb4\x89\xe0\x87\x76\xf9\x8b\xcd\xe2\xce\xeb\x9d\x4f\xaf\xdf\xfe\x03\x75\x60\x43\x71\xec\x32\xf4\x6b\x81\xfe\xc4\x74\x38\x29\x08\xe9\xd2\x50\xa0\xba\x27\x80\xa7\xd6\xdf\x40\x7b\xd2\xb1\xeb\x12\x67\x48\xd7\x25\x11\xb9\xb0\x69\xeb\x1c\xd4\x42\x70\xf2\x9f\xe8\x4b\x9a\x71\x77\x51\x83\x1d\x04\xc2\x81\x8e\x40\x8f\x22\x78\x93\x76\xc6\x1c\x2c\xa4\x5e\x32\xe7\x88\xea\xd3\xa7\x53\x6b\xf0\x9d\xa8\xaf\x47\x03\x90\x2f\x55\x16\xa0\x20\xd8\x92\x63\xe9\x37\x01\xa2\x56\x5e\xef\x12\x70\x41\x89\x25\xf3\x5a\x28\x8e\x32\x7b\xab\x62\x8a\xc2\xf0\x24\x8c\xfb\xca\x34\x82\xe2\x65\xd1\x62\x1c\xc3\x43\xc3\x1f\x65\x49\x3f\x06\x4b\xad\x0d\x76\x02\x46\x07\x15\xfa\x48\x6f\x29\x42\x63\x46\xaf\x53\xe3\x33\xb7\x5f\x59\x05"}, -{{0xa8,0x8a,0xd0,0x04,0x8d,0x38,0xc4,0x4c,0xeb,0xe7,0x35,0xea,0x38,0x02,0xca,0x57,0x6e,0x37,0x12,0x1c,0x7d,0x4d,0x76,0x0d,0xfd,0x88,0xde,0x16,0x63,0x06,0x4a,0xbb,},{0x14,0xdd,0x8b,0xb3,0x06,0x80,0x3e,0x5a,0x75,0x8e,0xd6,0x8a,0xd2,0x1d,0x07,0xd8,0x81,0x61,0xd5,0x0f,0x1c,0x74,0x71,0x37,0x77,0xda,0x12,0x09,0xaf,0xba,0xea,0x0b,},{0x13,0x41,0xa1,0x48,0xda,0x45,0x93,0xc8,0x8e,0xbc,0x5a,0x58,0x82,0x1e,0xef,0x77,0xf9,0x21,0x86,0x39,0x0f,0xf6,0x33,0xe7,0x62,0x07,0x08,0x4e,0x78,0x74,0xcc,0xf0,0xeb,0x1f,0x9e,0xc7,0x0a,0x3a,0x3f,0x96,0xb5,0x89,0x34,0xbc,0xb0,0x61,0xff,0x92,0x01,0x24,0xf7,0xe5,0x80,0xfa,0x2b,0x0b,0x27,0x95,0x83,0xad,0xf9,0x23,0x2d,0x0c,},"\x2c\xe8\xbc\xa2\x61\x78\x91\x3b\x16\x76\xe9\x0f\xfe\xfd\x94\x5b\xc5\x61\x98\x26\x60\xe2\xa7\x5d\x48\x2f\xf3\x0a\xab\xa1\xba\x43\xf8\x2d\x2e\x6b\x90\x9e\xc1\x0f\xc0\x97\x89\xff\x5c\xf3\x2a\x51\x80\xb6\x01\xea\x80\xfa\xde\xce\x6d\x7e\x7b\xae\xef\x48\x1d\xc6\x97\x9e\x2f\x65\x8a\xe0\xf6\xd8\xe4\x16\xb9\x32\x98\xf7\xd3\x40\x31\xbb\x76\xf7\x16\xed\x99\x1a\x16\xd0\x9a\x58\x2e\x58\xba\x40\x03\xac\x17\xbe\x8b\x44\x69\xe1\xa8\x89\xb2\xfb\xb2\x28\x9e\x98\xaf\x1c\x6d\x5b\xbe\xe7\x77\x56\x71\x3c\x07\x78\xb0\xdc\x44\x6a\x1f\x6c\x48\xc4\xd4\x08\x18\xec\x79\x99\x05\xf0\x69\xbc\x95\x34\x16\x57\xca\x5d\x02\xb7\xa5\x39\xa1\x3a\x02\xcd\x03\x76\xa5\x0e\x83\x43\xc0\xdc\x20\x34\x6d\xe5\x27\x5b\x1d\xcd\x4a\xd7\xaf\x72\x51\x31\xac\x75\xe9\x54\x82\x5d\x30\xea\xa5\x7a\x68\xbb\x98\xdf\xc4\x1c\xaf\xe5\x71\x05\x56\x64\x7b\x38\x7d\x9b\x7f\xd4\xe4\x76\x51\xe5\x13\x80\x50\x79\x8f\x6d\x40\xf4\xee\x71\x20\xb5\x8f\x74\xda\x94\xd7\x3c\xac\xbf\xd3\x93\xd1\x34\x73\x88\xee\x00\xb7\x9b\x8d\xbf\xeb\x57\x81\x41\x21\xbd\xda\x60\xc6\x27\xdc\xe1\x47\xd4\xd5\x68\xd7\x90\x52\xe9\x7b\x9a\x5f\x3e\xb5\x40\x7c\xc4\x64\x61\xa5\x5e\x18\xa9\x60\xd8\x09\x4a\x5f\xea\x48\xb6\x93\x75\x29\xcc\x4e\xc9\x19\xcd\xbe\xdf\x91\x85\x45\x6d\xc0\x0e\x8d\x98\xad\x15\x37\xee\x10\xa0\x57\xf4\xee\xc4\xb8\x1d\xc6\x03\x92\xfc\x91\x88\xd3\xe5\x61\x78\x59\x65\x09\x2e\x44\x31\x7f\x2a\x48\xe3\x66\x05\xfc\x58\x3f\xc1\x73\xb0\x5d\xb9\xdc\xbc\x75\x57\xd0\x64\x87\x39\x0f\xbb\xba\x77\xaf\x3a\x01\x4e\x1a\xc3\x51\x39\xca\xa1\xc5\x3a\x8d\x17\x34\x7f\x17\x8e\x1c\x54\xd0\xf5\x2b\x40\xe9\x10\x42\xc9\x3e\x7e\x48\x1d\x79\x2e\x28\x8f\xc2\x7e\x4c\x2f\xcf\x11\x1f\xe9\x7d\x9e\x23\x37\xd2\xfc\x1c\x30\x98\xf0\x66\x84\xa3\x1d\x55\xeb\xf3\x62\xc0\x27"}, -{{0x3f,0x59,0xd6,0xa0,0x18,0xf5,0x0a,0x82,0x21,0x17,0xe5,0xb4,0x73,0x60,0x9e,0x30,0xcd,0x64,0x92,0x0c,0xa1,0xc2,0x75,0x0d,0xcb,0x09,0xea,0xab,0x80,0x7a,0x3e,0xac,},{0x45,0x7d,0x0e,0x59,0xc1,0x1f,0x34,0x8f,0x3b,0xfb,0xdd,0x3f,0x32,0x7d,0xe7,0x8c,0x0a,0x75,0x77,0xc0,0xae,0xef,0x42,0xd4,0xc1,0xe5,0x67,0x00,0xd1,0x08,0x80,0x8b,},{0xd7,0x42,0x5e,0xa1,0x94,0xa6,0x71,0x5c,0x45,0x2e,0xc4,0xf6,0xd6,0xc7,0x6e,0x6d,0xd3,0x74,0xd3,0xca,0x7a,0xe7,0xa1,0x19,0x95,0xd0,0x2b,0x94,0x2d,0x4a,0x31,0x87,0x0d,0xd7,0x34,0xc1,0x2f,0xca,0x89,0xa8,0xeb,0x02,0x13,0xeb,0x13,0x9c,0x14,0xa8,0x7a,0x6a,0x33,0xe8,0x18,0x60,0x3b,0x2e,0x31,0x30,0x23,0xfa,0x58,0x73,0x7d,0x0e,},"\x7d\x10\x3a\x6c\x6b\xa2\xd0\x90\x87\xee\xf2\x25\x4c\x1c\x90\x3f\x06\x76\x95\xa5\x4c\x45\x15\xe4\xd1\x3b\xc1\xfb\xfb\x54\xd6\xe7\xa1\x67\x34\x9c\x14\x80\x99\x76\xda\x04\xa7\xe5\x8d\x96\xb4\x0a\xac\x3b\x2b\xdd\x14\xb9\xb5\x03\x22\xbb\x11\x64\x5f\x05\xe5\xe9\x78\xbc\x7f\xbd\x02\x49\x2e\xf8\x8f\x87\xd6\x68\x28\x0f\xd7\x08\x37\x32\x07\xff\x67\x0f\xcd\xa9\x7d\xf8\x48\x5d\x5e\x46\xdc\x3b\xd0\x43\x47\xf4\xd7\x52\x7e\xab\x27\x18\xf7\xd9\x3d\x13\x2b\xa7\x75\x82\x18\x89\x4e\x75\xa7\xde\xab\xe6\x93\x33\x5b\xa0\xdc\x73\xbf\x26\xc2\x88\xbf\xe9\xbe\x8a\x73\x6d\x75\xe5\xe0\xea\xa7\xbb\xe8\xd0\xb7\x7a\xbd\xd5\x14\x6e\x0f\xc9\xb3\x0d\xb9\xf0\x7c\xf4\xbf\x36\x26\x0a\x1f\x41\x41\x03\x31\xf8\xb4\x7c\x6b\x38\x33\x8c\x6d\xc9\xe8\x01\xff\xe1\xd5\x85\xf9\xb7\xfc\x31\xe9\x77\x8b\xca\x30\x27\xc2\x32\xc0\x74\xcb\x18\xe5\xb7\x29\x97\x00\x5f\xfe\xee\x4b\xf3\x7c\x8f\x87\x4b\x1b\x24\x6a\x63\x45\x41\x5d\xac\xac\xa7\x07\x5a\x60\x44\x3a\xc3\x31\x92\x36\xe2\x3c\xf6\xb7\x54\x47\x40\x80\x70\x52\x11\x49\x84\xb8\xd8\xf7\xe8\x57\xdc\xc6\xfa\xec\x88\x69\xcf\x96\xb9\x97\xdf\xa9\xaf\x91\x84\xad\x62\x3f\x1d\x90\xb8\xca\x75\x9b\x44\x8e\xab\xfc\xe1\x8c\x17\xcf\xdf\x9a\x3e\x33\x12\xe6\x3e\x5f\x08\x4c\xea\x90\x4c\x1c\x90\x99\x13\xcc\x4b\x19\xd0\x44\xa3\x72\x00\x34\x97\x3c\x73\x84\x94\x9b\xd6\xf9\xba\x92\x56\xf9\x8c\xd3\x94\xc5\x66\xda\x83\xc3\x11\x80\x10\x9f\x16\xd1\x03\x47\xb7\xe3\xe9\xdd\x6b\xe3\xbd\x3c\x77\xff\x1a\x79\x96\xa0\x78\xdc\xf8\x9d\xcd\xce\x2d\x1b\x61\x56\x95\xf4\xcc\x9f\x8f\x4f\x2a\x08\x80\x46\x41\xbc\xa8\x26\x62\xce\x88\xfa\xa5\x31\x45\xb6\xa4\x59\x55\xae\xc8\xcc\x2a\xf8\x1c\xcc\xb5\xd7\xc6\x4f\x9e\xce\x1c\x99\x83\x32\x64\x84\xa1\xe5\xec\xe4\xce\x36\x54\x4d\x63\x73\x5f\x77\x76\xf2\x1a\x20"}, -{{0xa1,0x21,0x2b,0x34,0xdb,0xca,0x63,0xb7,0x09,0x36,0x12,0xd0,0x5d,0xab,0x7b,0x4c,0xc8,0xf7,0xb6,0x76,0xa9,0x34,0xad,0x01,0xf6,0x59,0x85,0x1b,0x3b,0xb4,0x4e,0x4e,},{0xba,0x2f,0xcc,0xea,0x9a,0x08,0x05,0x91,0xbe,0x71,0x26,0x8d,0x7e,0x95,0x1f,0x25,0x0d,0xed,0xc0,0x04,0x16,0xe5,0xf3,0xf9,0x08,0xdb,0x6c,0xc5,0x71,0x25,0x49,0x25,},{0xfa,0x93,0xed,0x65,0x95,0xbc,0x95,0x8d,0xc0,0x42,0xce,0x16,0x45,0x16,0x7b,0x79,0xe8,0xf6,0x73,0x4c,0x46,0xf8,0x0f,0x63,0x1f,0xd5,0x48,0x49,0x08,0xf5,0xe5,0x1a,0x22,0x42,0x7e,0xe6,0x86,0xf5,0x64,0xff,0x98,0x2f,0x6e,0xf4,0xd2,0xca,0x1f,0x0c,0xa5,0x62,0x49,0x10,0xcd,0xd6,0x3c,0x11,0xa3,0xc2,0xb1,0x6d,0x40,0x97,0x3c,0x07,},"\x07\xc3\x7c\x46\xbe\x3c\x68\xd0\x56\x89\x57\x7a\xa6\x4a\x93\x2b\x90\x64\x46\xb2\x9b\xaf\x12\xf6\x17\x4a\x6b\x42\xbb\xae\xfd\x1f\x1f\x37\x3e\x0b\xcc\xc4\x73\xdd\xfc\xee\x1a\x7f\x21\xb9\x6a\x62\x60\xef\x0a\xa1\xf2\xd8\xb2\x95\x9e\x71\xd1\x2c\x95\x33\x58\xa2\x77\x4c\xc5\xe6\xf3\x79\xa3\x13\xe4\x35\xed\x69\xdf\xd6\xd4\xa5\x9a\xde\xe3\xcc\x7e\xc4\xba\xcb\xdb\xb3\xfe\xe5\x43\x0b\x73\xf6\x05\x1a\x60\x96\xc6\x0e\x9b\xc9\x2c\xc8\xfa\x05\x9f\xac\x2a\x93\xef\x70\x07\xd6\x4f\xbe\x50\x06\x49\x64\xd5\xa0\xad\x60\x11\x75\xcd\x9c\xab\xa4\x53\xf9\x10\x3b\x25\x48\x55\x45\xd3\x01\xf0\x3c\x5f\x9f\x94\x78\xbd\xf9\xd4\x14\xbf\x1d\xca\x3b\x1c\x1d\x9d\xaa\x99\x71\xf9\xe6\x17\xfb\xfa\xf5\xb0\x2a\x7f\xbd\x5d\x4f\xb8\x94\xc0\x97\x5c\x54\x59\x2b\x49\xa0\xfc\x85\xdd\x08\x53\xf3\x0c\x51\x50\x2d\x98\xfc\x1a\xb8\x5a\x17\xcc\x58\x96\x1a\xae\x97\x64\x57\x0b\xa5\xcb\xdb\xc9\x6d\xfc\xeb\x8d\x11\xda\x53\x36\x4b\x40\x25\xfe\x0b\x8b\xa8\xa3\x53\xad\x23\x68\x67\x20\x16\x9f\xe9\x73\x43\x2f\xfe\x29\x1a\x4b\x11\xde\xdd\xa0\xaa\xc7\x9a\x5e\x42\x62\x0a\x64\x58\x7d\x20\x59\xe7\x87\x01\x3b\x40\xce\xec\x59\x92\x08\xf6\x6e\xd0\xca\x6e\x1b\xe9\x09\x2e\xc2\x7d\xb2\x16\xee\x6d\xad\xfe\xbc\x21\x70\x5b\xc4\xa8\x5a\xee\x57\x7e\x57\xd2\x39\xaf\x58\x6e\xfe\xec\x22\xcf\x38\xd1\xcf\xb3\xcd\x74\xdd\x0d\x9a\x33\x81\xaa\x81\xe6\xa2\x97\xe3\x9b\x81\x91\x37\xad\x27\xd4\x75\xe2\xbf\x54\xaa\x42\x6d\xc2\x9c\x4c\xa8\x17\x6d\xf3\x43\x13\x7a\x2d\x79\xd1\x2e\xf9\xaa\x7b\xe1\xcf\x67\x75\xe5\xd8\xa4\x43\x0a\x85\xc3\x3d\xb6\x1c\xd2\xf3\x51\x87\xb4\xf6\xea\x9e\xbd\xd7\x53\xd1\xc4\xef\x72\x47\x11\x59\xff\x07\xb7\x78\x70\x90\x64\x96\x24\x9d\x42\x78\xe3\xf3\xca\x6b\xcb\xf3\x7a\x26\x5b\x89\x65\x39\x19\x0f\x9a\x31\xf1\xe7\xb4\xb6\x5c\xd1"}, -{{0xd9,0x68,0x20,0x86,0xfe,0x7d,0xda,0x30,0xb8,0x71,0x11,0x06,0x01,0x93,0xd8,0x47,0x56,0x6a,0xb9,0x4c,0xfd,0x9c,0x97,0xab,0x6b,0x43,0xe7,0xa8,0xd3,0xf7,0x93,0x82,},{0x8b,0x0b,0x13,0x72,0xd8,0x87,0x33,0xef,0x72,0x33,0xf6,0x37,0x97,0x90,0xd1,0xe4,0x6e,0x1e,0x07,0xe9,0xd3,0xfb,0x8b,0x0b,0xe2,0x52,0xed,0x04,0xc5,0xfa,0x16,0x3d,},{0x17,0x93,0xe4,0x97,0xeb,0x52,0x1c,0xa7,0x4e,0x35,0xd1,0x4a,0x63,0x86,0x8c,0xbe,0x94,0x99,0xda,0x2f,0x21,0xb4,0xeb,0x52,0x60,0x34,0x0f,0xca,0x3c,0x1f,0xec,0xa7,0x8d,0xbe,0x5b,0x14,0xac,0x10,0xf3,0xfa,0x76,0xfa,0x2e,0x71,0xe4,0xc9,0x14,0x61,0xaa,0x75,0x97,0x7e,0x5e,0x70,0x79,0x26,0x70,0xef,0x7f,0xf0,0xe6,0xa2,0x87,0x08,},"\xe8\x81\x4b\xe1\x24\xbe\x3c\x63\xcc\x9a\xdb\x03\xaf\x49\x3d\x44\x2f\xf2\x0d\x8b\x20\x0b\x20\xcd\x24\x93\x67\xf4\x17\xf9\xa9\xd8\x93\xfb\xbb\xe8\x5a\x64\x2b\xe2\x70\x1d\x1d\x1b\x3c\xd4\x8a\x85\xcf\x58\xf1\x59\xa1\x97\x27\x31\x43\xa5\x78\xf4\x2e\x8b\xcc\x8b\x62\x40\xf9\x32\x71\x90\x05\x38\xff\xc1\x87\xc0\xaf\xc8\xdb\xcc\x49\x2b\xcd\x67\x9b\xaa\xef\x3a\xf5\x08\x84\x34\xa9\x45\x86\xf9\x4b\x49\x97\x0b\xba\x18\xf5\xea\x0e\xbf\x0d\x27\xee\x48\x2a\xa8\x3a\xd0\xdd\x0e\xe6\x09\xdf\x59\xd3\x7f\x81\x8b\x2c\x8d\x7c\x15\xf0\xf6\xf5\x44\xdd\x4c\x7e\x7c\xb3\xa1\x67\x24\x32\x4f\x77\xd5\x89\x48\xf8\x47\x5a\x60\xd5\x3e\x5b\xd5\x10\xc1\x71\x37\xc9\x9e\x1c\xfa\x51\x5a\xf9\xbc\x85\x56\x9d\x21\x2a\x21\x19\x07\x29\xf2\x81\x7d\xe8\xc4\x69\x15\xe0\x21\xdf\x70\xff\x6d\x60\x21\x5f\x61\x4f\xc2\x11\x39\x90\x4d\xf3\xb2\x92\xb7\x49\xdc\x4d\xea\x02\x51\x8b\x62\xd1\x58\x62\xc9\x2d\x2a\x4c\x99\x67\x01\xcd\xec\xae\xd8\x4a\xb6\x28\xee\x98\x4f\xc1\x11\xee\xcb\x59\xe4\x84\x44\xef\xc0\xd4\x56\xe2\xc8\x52\x51\x84\x41\xc3\xdb\x76\x30\xdd\xd5\x15\x62\x49\xa2\x87\x30\x98\x38\x38\xae\x59\xac\x4c\xc7\x11\x0f\xd6\xde\x68\x10\x1e\xa5\xb2\xff\x69\xfd\x36\x4e\x3c\x94\x48\xde\xfe\xfe\x17\x5b\xcb\xe1\x17\xcc\x11\xb4\xff\x75\x49\xc3\x3e\x10\x25\xb6\xb5\x92\x04\x8a\x8e\x31\x96\x9e\x81\x8d\xcc\x18\x8b\xb1\x9d\x7a\x24\x40\xa3\xba\xba\x4e\xb1\xb8\x1c\x45\x67\x9d\xb4\x6b\x31\xbc\xde\x77\x76\x75\x7d\x99\x31\xec\x20\x63\xfc\x6f\x1f\xcd\x76\x1e\xcc\x57\xa7\xd0\x30\xa8\x5e\xa2\x73\xef\x18\x25\xb0\x50\x92\xab\x96\x45\x35\x9a\x44\x4f\xf7\xd1\x66\xb5\x75\xfa\xc2\x98\x30\x8d\x9f\xaa\x68\x46\x3d\x1d\x0f\x7b\x7d\xf8\xa5\x1c\x68\x15\xd3\x71\x59\xad\xc0\xb5\x93\x22\x4a\x81\x83\x21\xd7\x21\x9f\x09\x68\x6c\xfc\x95\x22\x59\x71\x8d\xfc"}, -{{0xb5,0x2b,0x24,0x9a,0x7a,0xea,0xe0,0xfb,0xd9,0x4f,0xfc,0xf9,0xa9,0xfd,0xe1,0x0d,0xe6,0x1c,0x3f,0x4c,0xbd,0xa1,0x4b,0x28,0x9f,0xe0,0x1f,0x82,0x70,0x73,0x34,0xca,},{0x73,0x51,0x63,0xbf,0xcf,0xd5,0x4f,0x9d,0x35,0x2e,0x1c,0x2f,0x3c,0x01,0x70,0xc9,0x5c,0x18,0x42,0xcc,0xc7,0x42,0x16,0x23,0xae,0x04,0x96,0x98,0x0c,0xee,0x79,0x1c,},{0x6f,0x48,0xa9,0xf7,0xf0,0xfa,0x19,0x2b,0x66,0xd1,0x21,0x75,0xa3,0x33,0x61,0x23,0x03,0xe1,0x80,0xb9,0xfa,0xb1,0x8e,0xda,0xbe,0xbc,0xdf,0x66,0x74,0xfd,0xfc,0xc5,0x36,0x07,0x08,0x9b,0xf9,0x80,0xce,0x35,0x89,0x4c,0x2f,0x9b,0xab,0xdc,0x44,0x38,0x66,0x7a,0xb3,0x29,0x7a,0x62,0x48,0xec,0x02,0x69,0xfa,0xa9,0x9c,0x72,0x48,0x07,},"\x1d\x44\x5e\x8e\xe3\x6f\x6e\x10\x64\xee\x12\x81\xe6\xb4\xa4\xce\xc5\x0a\x91\xc2\xb6\x67\xc8\x30\x5d\x1e\x9a\x5f\x7b\x73\xa3\x44\x58\x82\x58\x1f\xb0\xc1\x1e\x64\xf6\xee\x92\xe8\x11\xf9\xf2\xd6\xc5\x9c\x63\x44\xbe\x76\x91\xd1\x16\xdd\xa4\x93\xca\xde\x51\xc0\xce\x77\x37\x2b\x61\xa7\xc4\xfb\xb6\x33\x40\x13\x33\xcb\xf7\x13\x72\xad\x2f\x04\x4e\x99\x2a\xc0\x35\xf5\x87\x9c\x05\x30\x04\xf8\x22\x3f\x23\x7a\x24\xa4\x09\xb7\x89\x4f\x6a\xd5\x18\xe0\x46\xb8\xa8\x4c\x3f\x4c\x62\x60\xe6\x16\x9f\xd9\x44\xd5\x7f\xbc\xf9\xba\x27\x75\xf2\xd6\x0e\xd7\x72\xc4\x6c\xcd\x63\xc8\x50\xb8\x0d\x58\x7c\x52\x08\xdf\xb1\xa2\x58\x78\xc0\x2d\xec\xe3\xe6\x02\xe9\x63\x2f\xc3\xc2\xc7\x9b\x25\xab\x41\x03\x4c\x6e\x26\xb8\x69\x25\x53\x57\xa6\x86\x78\x1d\xfe\x6e\x64\x4b\xeb\xa9\xb6\x27\xda\x1f\xcb\x5e\xc0\xbe\x49\x7c\xf1\x88\xe1\xef\x1a\xf0\x60\x1b\xf1\x6b\x29\x11\xfd\x9f\xf3\x4f\x0e\x97\xac\x95\xa7\xfe\x2c\xf9\x0e\xa6\xce\xd3\x3c\xcb\x0e\xd1\xef\x2d\x41\x60\xef\xb0\x7c\x59\x1a\x5c\xb1\x6c\x70\xca\x16\x94\xfb\x36\xf2\xca\x19\xeb\xa5\x2b\xe3\xd4\xad\x89\x5a\xbc\xad\xa4\xb3\x6f\x02\x61\xd6\x5f\x59\xe0\xcf\xd2\xa6\x14\x8a\x88\x92\xdd\xbb\x45\x81\x0d\xb3\xbf\x4a\x9e\x26\xe9\x2c\x15\xea\x26\x18\xcf\xee\xb4\x62\xd8\x62\x8f\x25\x4f\x54\xd2\xaf\x27\x11\x3b\xab\x4f\x9a\x7d\x06\x79\x18\x11\x94\x2b\xdc\x32\xf8\x45\x92\x2d\x7b\x2d\xdb\xa9\x59\x14\x09\x28\xf8\xc2\x8d\x98\xb4\x4e\x1d\x19\xb9\x7f\xd3\x9c\xc0\xf9\xa5\x23\x6d\x34\x9f\xc8\x35\xac\x49\x21\x92\x46\x2e\x40\xac\x62\x9b\xeb\xff\xd2\xeb\xa7\x2d\x27\x88\xb2\x44\xbb\x77\x7a\xd0\xf7\xb7\xf9\x6f\x23\x41\x23\x99\xfc\x1d\x87\xa1\xd0\x87\xba\x08\x90\x27\xea\xbb\xc0\x5e\xda\xfe\xe4\x33\x79\xe8\x93\x29\x13\x31\xb4\x60\xbf\xa7\x33\x2e\x08\x42\xec\x25\x73\x39\x3d\xe9\x53\x06"}, -{{0x78,0x2a,0x93,0xef,0xe0,0xef,0x06,0xcb,0x25,0x34,0x33,0x0e,0xfd,0x0e,0x96,0x84,0xe9,0x96,0x9b,0x52,0x58,0x12,0x3e,0x49,0x02,0x39,0xbf,0x24,0xbf,0x9f,0x65,0x23,},{0x94,0x2f,0xa1,0x40,0x6e,0xe2,0x68,0x3e,0x29,0x37,0x7e,0x49,0xf7,0xba,0x75,0x7c,0xf5,0x0e,0xf0,0x72,0x37,0x07,0xd4,0x40,0x3d,0x28,0x62,0x25,0x70,0x45,0xde,0x87,},{0x93,0xe7,0x40,0x5a,0x40,0x44,0x51,0x01,0x66,0xc8,0xac,0x26,0x4c,0xe3,0xb5,0xba,0x66,0x65,0xd6,0x8b,0xad,0x45,0x87,0x12,0xdc,0x93,0xc2,0xc3,0x90,0x56,0x8d,0x74,0x02,0xef,0x7d,0x57,0xf5,0x49,0xb8,0xa1,0x04,0x2f,0x7f,0x69,0xa6,0x79,0xaa,0x85,0x5f,0x34,0xf8,0x01,0xd5,0x7d,0x79,0x89,0x5d,0xeb,0x8d,0xea,0xdb,0x35,0x23,0x08,},"\x46\xa4\xe3\x19\xa6\x70\xac\x99\x39\x94\xa5\x33\x00\xc3\xf7\x91\x44\xc2\xf7\xfe\xc1\x11\x6e\xee\xb3\x62\x1c\x76\xac\x35\xda\x79\xdb\xff\x6e\x18\x9c\xa9\xdb\xfc\x9a\xbb\xda\x05\x48\x47\xb2\x97\x1b\x02\xfa\xce\xbb\xe9\x26\xd4\x69\xeb\x0a\x86\x03\x89\xac\x74\x41\x62\xbf\x6f\xb1\x3b\x42\xcb\x9b\xb8\xc9\xd7\x26\x07\x13\x8e\x78\x00\x12\x1e\xe0\xcd\x63\x3e\xd5\x35\xc7\xae\x5f\x40\x60\xbb\xdd\x27\x1c\x9d\x11\x0a\xbf\xf5\xe0\x60\xea\x6e\xe8\x38\x90\xb1\xe9\x2a\x92\x56\xd7\xb2\xba\x98\x2a\x31\x14\xbb\x6d\xef\xfe\xe2\x69\x6f\x0a\x2f\x9c\x21\xaa\xa5\xb2\xde\xfa\x11\xaa\xb7\x07\x6d\xe6\xe5\x7e\x86\xf2\x84\xbb\x67\xf5\xa4\x9e\xe6\x85\x92\x10\x32\xc9\x5b\x74\xe7\xe3\xea\xc7\x23\xf1\x75\xaf\x08\x2c\x85\x8e\x0d\xfa\x01\x72\x8c\x38\xfb\xbb\x4c\x83\x58\x1f\x81\xac\xe6\xc6\x3c\x6b\xda\xac\x56\x20\xeb\x9a\x56\x8e\x7e\xbb\x7b\x72\xb3\xd1\xa1\x64\xef\x52\x4e\x7b\x9f\x00\x79\x9a\xb0\x86\x71\x59\x76\xc1\x4d\x0d\xf6\x5f\x7b\x96\xbf\x9e\xbc\xda\x7f\xee\xef\x11\x34\x22\x00\x1a\x03\xa7\x63\x3d\xf5\xe4\x99\x39\xa1\x21\xdb\x89\x9d\x9b\x8a\xc2\xdb\x4f\xad\x0c\x30\xcf\x0b\x8b\xdb\xc9\xe9\x80\x2a\x79\x7c\x82\x38\xe4\x65\x11\xff\x24\x06\x8c\xad\xcf\xf2\x44\x8c\xc0\xbf\xf9\x27\x69\x22\x33\x48\xd4\x5d\x6b\x6f\x2c\x8f\x15\x93\x38\x8c\x0b\xbb\xf4\x4b\x6d\xdb\x50\xb9\x8c\xd7\xf0\x9c\x73\x0f\x7d\xe4\xd0\x08\x15\x6c\xb3\xcd\xe0\xca\xb3\xad\x0a\x58\xa8\x39\x54\xe2\x34\xa0\xa8\xa0\x4b\x57\x3c\x9a\x8e\x9b\x92\x9e\xd3\x8b\x8b\x22\x8b\xf5\x5a\x3c\x6e\x2c\x6b\x51\xf6\x82\x65\x2f\xbb\x70\x8e\x74\x64\x0e\x33\x13\xe1\x7b\x46\x94\xd7\xfd\xf0\x11\x1f\x90\x60\x8c\x1b\x5a\xf4\x22\xdc\xde\xca\xd9\xdd\xb7\xf5\x0d\x1b\xf5\xbc\x63\x78\xcc\xaf\xfc\x32\x01\xe6\xc7\x87\xb4\x8c\x44\x3b\xa2\x40\xd9\xd5\x0f\xf6\xc0\xe9\xdf\x7f\x1a\x5b"}, -{{0x6f,0xe7,0xbc,0xf7,0xa6,0x84,0x42,0x3d,0xe1,0x07,0x6f,0xd7,0x6d,0xa7,0x83,0x42,0x33,0x73,0xb3,0x81,0x32,0x9e,0xfd,0x61,0x57,0x42,0x4e,0xc4,0xb2,0x65,0x5a,0x94,},{0x77,0x40,0xe9,0x1a,0xfe,0x45,0x32,0x4f,0x8b,0xb9,0x90,0xca,0x2a,0x34,0x12,0x79,0xdd,0xaf,0x23,0x2c,0x3b,0xb4,0x15,0xf1,0x78,0xb6,0x09,0x2f,0xba,0x19,0x5f,0xec,},{0x99,0x14,0xcc,0x50,0xfe,0xf0,0x93,0x5e,0xfb,0x89,0xb3,0xd6,0x4e,0x3c,0x1c,0x34,0x12,0xae,0xd6,0x59,0xb9,0x01,0x66,0x22,0x2c,0x0d,0x13,0xec,0x1c,0xe3,0xa6,0x8a,0xe6,0x28,0x1b,0x7e,0xfd,0x9d,0x4e,0xc6,0x4b,0x82,0xe7,0x3e,0x14,0x47,0x9f,0x03,0xfb,0xac,0x8f,0xa3,0xab,0xdb,0x41,0xea,0x42,0x15,0xc4,0xa4,0xd4,0x94,0x9d,0x09,},"\x0b\xaf\x0a\xd4\x40\x61\x2b\x4c\x5a\x13\x6c\x3a\x42\xbe\x1c\xa2\xb7\xc3\x19\x86\x2a\x44\xa9\xfd\x50\xc4\xee\x73\x54\x1c\x5e\x64\x57\xef\xa8\x18\x25\xb6\xdd\x4a\x72\x19\x4a\x29\x68\x68\x8b\xd4\x9e\x5a\x8f\x4c\x04\xdb\xaf\xc2\xe7\x88\x4c\x0c\x70\xc2\x08\xd4\xe9\x54\xcd\x16\x75\xda\x8e\x74\xc6\x5c\x49\x7c\xf9\xdc\x69\x42\x49\x65\xbd\xcb\xa5\xde\x52\x93\x6f\x92\x5f\x62\xe2\x01\xf9\x95\x05\xd3\x77\x7b\xeb\x3c\x2e\x08\xb2\xec\x9a\x87\x3e\x5a\x9c\x21\xfb\x4a\x2f\x3e\x86\x1f\x3c\xf4\xd6\xb5\xdc\xd1\xc8\x8b\xcd\x91\x63\x53\x9a\xc6\x2c\xd0\x65\x9f\x4e\xf2\x32\xc2\xce\x57\xfc\x77\xf9\x02\x85\xeb\x35\x01\x69\xed\xc6\xa8\x06\xff\x50\xf6\x1c\x7e\x0b\xee\xeb\xec\xec\x63\xbf\xc9\xd3\x98\x3f\x5b\xb4\xb2\x61\xc7\x46\x47\x1f\xcb\xf2\x89\x2c\x61\x08\x97\x0b\x68\xdb\x5e\x43\xc4\x50\x4d\xda\xe2\xd0\xff\xff\xa2\x8b\x67\x59\xae\x11\x28\xe1\x6f\x66\xd4\x92\xad\x61\xe3\x72\x2c\x96\x0f\x88\x69\x2b\xe8\x1a\x9f\x41\x28\x90\xff\xa3\x46\xe7\x02\xc8\x67\xdf\xa2\x59\x70\x3b\x73\xf5\x25\x07\x4f\x32\x27\xc4\x9c\xec\x1b\x64\x5a\x10\x3b\xd4\x47\x1f\x33\xf9\xf1\xba\xc3\x27\xd7\x91\x78\x61\xd0\xad\x91\xab\xee\x60\x22\x2e\xa2\xa3\xc8\xca\xc0\x52\xae\x9a\x2c\xbd\x90\x85\x5d\x73\x3d\x53\x19\x13\x3f\x95\x41\xbd\x0b\x61\xf0\x99\x52\x68\x35\x1e\x28\x63\xc1\xca\x2c\xa5\x1e\x3c\x97\x63\x83\xf5\xc4\xc1\x1f\xf4\x10\x03\x6f\xd5\x1d\x5a\xc5\x6b\x02\x3c\xe9\x02\x9c\x62\x0f\x22\x55\x70\x19\xad\x9b\x42\x64\xed\x4d\x71\xb4\x34\xf4\xa4\xd1\x7a\x7d\x57\x69\xfa\x1e\x14\xa6\x9f\x7a\xe4\x19\xcc\xf5\x94\x7f\x8c\x76\x82\x69\x71\x16\xc2\x40\x5f\x5a\x19\x59\xc5\x4b\x48\xf0\x87\x2f\x59\x6e\xd4\x59\x64\x48\x8d\xde\xc1\x2b\xdb\x63\x6d\x0b\x34\x9e\x74\x9e\xb6\x60\x92\xff\x45\x11\xfb\xa5\x9b\x59\x62\xcb\x93\xcc\x85\x51\x5c\xc8\x6a\xb0\xc6\xb2"}, -{{0xdd,0xa4,0x8a,0x0d,0x15,0xa2,0x9e,0xba,0x9a,0x76,0x30,0x5d,0x36,0x0e,0x46,0x6e,0x72,0xd8,0x04,0x0e,0xfe,0x2e,0x89,0xc0,0x4b,0x64,0x61,0x31,0x5a,0x9b,0x8b,0xf4,},{0x4f,0x5c,0xc3,0x6a,0x80,0x94,0x16,0xb5,0x8e,0x15,0xd2,0x4c,0xc5,0x79,0x68,0xcb,0x57,0x3b,0x76,0xad,0x90,0x88,0x7a,0x8e,0xf3,0x6c,0xde,0x7e,0xca,0x40,0x0f,0xcc,},{0xce,0x71,0xbc,0x82,0xd5,0x31,0xd0,0xf9,0x3b,0x57,0xbf,0xdc,0x2f,0x73,0x16,0xcf,0x40,0x4e,0xe0,0x9a,0xf8,0x8f,0x33,0xbf,0x80,0x6c,0x7c,0xad,0x6b,0x8f,0xfa,0x36,0x62,0x36,0xba,0x74,0xe7,0x5c,0x15,0x09,0x6d,0xda,0xa6,0xe3,0xa6,0x2a,0x8f,0x5e,0xb1,0xc8,0xc3,0xf6,0xb6,0xc9,0x4a,0x6a,0x34,0x9f,0xc7,0xc0,0xcb,0xfb,0x19,0x0d,},"\xf5\xac\x19\xb8\x1f\x21\x11\xa0\xdb\x0a\xe3\x0d\x15\x13\xed\x34\x3e\x7f\x57\xf7\xf7\x7d\x65\xb8\xac\x7c\xe3\xa6\x01\x17\x4b\xae\xd9\xbf\xa1\x36\x03\x59\x76\xf5\x16\xd5\xa8\x70\xf4\x5d\xb1\x91\x9f\x1e\xb1\xcb\xec\xbe\x88\xec\x32\xd1\x91\xe9\x24\x88\x21\xa7\xe7\x68\x1f\xe3\xab\xec\x11\x58\x4b\xdb\x33\xde\x1b\x4c\xa9\x48\x91\xeb\x66\xdc\xb8\x53\x9a\xc4\x11\x63\x73\x6c\xcf\xd6\x9a\xbb\x83\x81\x4d\xd3\x8c\xd6\x03\x81\x31\x87\x28\x05\x2a\x25\xcb\x66\x54\x71\x05\x86\x50\xcc\xc7\x57\x56\xdb\xee\x68\x8a\xb8\x26\xec\xad\x4a\xd5\xa7\xdb\x57\xe8\xf6\x5f\x1b\x64\xab\xff\x82\xdd\x53\x33\x4b\x79\x7a\xc4\x02\x28\xdd\x81\x7f\x23\x9d\x3e\xe8\x04\xa1\x9a\xea\xc8\xcf\xe3\x3e\xb6\x57\xec\x9c\xe9\x23\xd6\xb3\x88\x91\x4c\xfb\xa2\xe7\x2b\xfc\x2b\xc3\xd6\xf9\x85\xc0\xd9\x75\x34\xdb\x95\x8e\xed\xe5\x7b\x16\x49\x1f\xfb\x75\x5c\x1a\x58\xd7\x8a\xb3\x77\xfa\xec\x0d\x31\x18\x18\xe8\x99\x26\x0e\x3e\xbd\x1c\xcd\x29\x24\x6f\xa8\x2d\x0b\x76\x62\x2b\x2c\x4b\xc5\x2f\x54\x9f\xee\x72\xa3\x0f\x55\x4f\x33\x1f\x36\xd2\xa7\x4d\x99\x9e\xc1\x0a\x08\x29\x4f\x00\x2b\x43\x61\xe5\x90\x27\x9c\x2f\xb1\xbd\xa4\x31\x2c\xcb\x24\xd7\x52\x82\xce\x7c\x06\x1a\x0c\xa5\x52\x0c\x74\xf6\xf6\x33\x3b\x18\xc4\xb5\x41\xcb\x6c\x51\xe0\x15\x75\xba\x80\x51\x2f\xfa\x7c\xe0\xac\xcd\x22\xd1\x40\x27\xc5\x3a\xba\x1f\x74\x37\x83\x5f\x11\x14\xd6\x8e\x3a\xcf\x3f\xf8\xde\x94\xc8\xe4\xef\x6d\x3a\xb3\x12\xc9\x1d\x02\x97\x01\x57\x50\x8f\x54\xa5\x81\x6f\x46\x7a\x21\x4e\x9b\x12\x84\x30\x02\x89\xe6\x5f\x36\x5a\x61\x0a\x8e\xa2\x84\x66\x6c\xfe\x55\x18\xe4\x35\xbc\xcd\x21\x62\x75\x01\xc7\x25\xf0\xb8\xeb\x57\x25\xe0\xe0\x6e\x0c\xef\x5d\xb2\x01\xb4\x8e\xc9\x1e\xbf\x87\x8d\xd5\x7c\xe8\xda\xc7\x33\x48\x48\xa1\xbc\x82\xc1\x8b\x06\x59\x55\xe4\xf5\x9b\xe3\x39\x85\x94\xdc"}, -{{0xec,0x57,0xb9,0x41,0xad,0xf3,0xca,0x13,0xe7,0x7a,0x78,0x05,0x77,0xcf,0xd0,0xdf,0x5b,0x49,0xed,0xc8,0x53,0x51,0x05,0x2d,0xa3,0x4e,0x99,0xf8,0xa9,0xbf,0x32,0x08,},{0x28,0x59,0xc0,0x71,0x97,0x8a,0x04,0xb7,0xf5,0x40,0x7b,0x6d,0x22,0x40,0x1a,0x78,0xef,0xd0,0x39,0x4b,0xb9,0x66,0xb9,0xa0,0x4d,0xa6,0xb5,0xef,0x81,0x9d,0xe3,0xfa,},{0x11,0x8e,0x14,0x62,0x12,0x6b,0x45,0xb8,0xc6,0x80,0x35,0x23,0x75,0x5c,0x56,0xdf,0xc4,0xe1,0x23,0xe4,0xac,0xbb,0x66,0xba,0x0b,0xa6,0xfe,0x3e,0x05,0x3d,0xa4,0x11,0x9f,0x57,0x19,0x29,0x5e,0x0c,0x82,0xac,0x64,0xd7,0xc5,0xcb,0x1a,0xc8,0x98,0xdf,0x26,0x3d,0xdf,0xd3,0x60,0xf3,0x00,0x8d,0x91,0x01,0x8b,0x26,0xf6,0xa1,0x73,0x0a,},"\xd2\xbc\xbd\x1b\xc3\x61\xab\x32\xc6\x6d\x72\xfd\x48\xa8\xe2\x27\xdc\x6b\x8d\x6b\x15\x08\x48\xba\x71\x5f\xf4\x7d\xd3\x5c\x8e\x49\x38\x1b\xb4\xe2\x93\x3f\x42\xcd\x26\xb7\x5b\x14\xd9\xc0\x03\x92\x82\xb6\x2b\x85\x56\xaa\xa1\x1c\xd6\x91\xe8\x28\x38\x2b\xe3\x06\x88\x9f\xc9\x20\x51\x37\xb1\x69\xd3\xbf\x17\xb7\xf3\x76\x93\xfc\xe2\x86\x03\x9f\x03\x80\x9d\x7d\x9d\x98\xc8\xfd\xe4\x6f\x11\x01\x94\x2a\x27\x9c\x51\x67\x06\xf5\x01\x91\xa9\x11\x2f\x6a\x24\x63\x0e\x1a\x26\xc3\x21\xe4\x6c\x9c\xcc\x85\xb6\xef\x94\x2f\x35\x3a\x64\x2b\x9e\x7e\xf9\x98\xc0\xfc\xe2\xd3\xa7\x5b\x99\x9e\xeb\x77\xf3\x1f\x9b\x08\x13\xa9\x7e\x30\x14\xc3\xa8\x6e\x25\x58\x73\x46\x21\xa3\x06\x6d\xae\x35\x84\x50\x31\xe3\x56\x65\xf1\x92\x29\x07\xdb\xb7\x39\x78\x6a\x8b\x76\x58\xab\x60\x27\x6f\x2d\x92\x1d\x1a\x51\x23\x0f\xc7\x4d\x19\xe8\x01\x84\xa4\xf1\x0e\x9e\x83\x4a\xbc\x9a\x36\xc4\x29\x72\x6b\xc0\x55\xdc\x8c\x06\x3f\x0e\xca\x9c\x61\xa8\xa9\x70\xbd\x4b\xb5\xf4\x24\xee\x4d\x04\xbf\xc2\x95\xe3\xbb\x1f\x34\xbe\xcb\xd9\x92\x0f\xe2\xe7\x7f\xcf\x36\x76\x3f\x32\xfc\x9c\xfd\x5e\x46\x59\x79\xc1\x67\xca\xbf\x5a\x12\x44\xb4\x91\xfc\x06\xb8\x94\x64\x19\x04\x6b\xa5\x16\xc5\xb2\x33\xc4\x14\xdd\xef\xb6\xda\x04\xf2\xe1\x3d\xaf\xf7\xa9\xa0\xc0\x2a\x51\x8e\xde\x57\xad\x95\x21\xde\x64\xed\xdf\x6f\x49\xa9\x67\x0f\x63\x2d\x3f\x7d\x42\x42\x52\x07\xd0\x53\x60\x4f\xe3\x9d\x13\xb9\xf5\x2c\x8b\xc2\x92\xb0\x07\x6e\xa4\x2a\x56\x00\x56\xdf\x25\xde\x51\xad\x35\x88\x1d\x08\x54\x32\x24\xd7\xfa\x5d\x70\xb8\x60\x3e\xf2\x3c\xe0\x63\x39\xd6\xcd\x09\xe2\x2a\x95\x74\x9e\x50\xdf\xbd\x3b\x8a\xd6\x9f\xd3\x04\x96\xb9\x84\xd1\xc0\xa1\x99\xc8\x59\x48\x05\xf3\x8b\xa4\x46\x31\xa2\xc5\x9e\xad\xc6\x55\x4d\x19\xf9\xbc\x98\x36\x6d\xfd\xec\x2a\x12\x1d\x0e\x48\x14\xd2\xcd\x3f\x58\x71"}, -{{0xcb,0xfd,0x91,0xd7,0x69,0x5c,0x1f,0x27,0x0f,0x69,0x24,0x6a,0xb3,0xdf,0x90,0xed,0xb2,0x14,0x01,0x10,0x1c,0xa7,0xf8,0xf2,0x6c,0x6d,0x00,0xf4,0xdc,0xb7,0x23,0x3e,},{0x51,0x38,0x79,0xcf,0x79,0xd2,0xf4,0x6d,0xf4,0xb8,0x5a,0x5c,0x09,0x49,0xeb,0x21,0x16,0xab,0xf9,0x81,0x73,0x5a,0x30,0x31,0x64,0xcb,0xd8,0x5a,0xdf,0x20,0xb7,0x52,},{0xf3,0x36,0x13,0x7d,0xfe,0x6f,0x42,0xa6,0x66,0x9b,0x55,0xf7,0x4b,0x80,0xb3,0x03,0x5a,0x04,0x03,0x67,0xf9,0x06,0x56,0xfc,0xef,0x0a,0x64,0x4c,0x52,0x27,0x2d,0xdc,0x39,0x27,0x3c,0xd7,0x72,0x60,0x10,0xeb,0xcd,0x8a,0x30,0xa0,0x52,0x01,0xab,0x70,0xb8,0xff,0x97,0xd0,0x28,0x8a,0x2c,0xb9,0x4c,0xbc,0x49,0x02,0x06,0x47,0x39,0x0b,},"\x26\x4a\x93\x3f\x7d\x0a\xec\xba\xc1\x3e\xef\x64\x4b\x0b\x53\xdd\x53\xa1\x28\x09\x04\x10\x0d\xbc\x1a\xb8\x7b\x51\x14\x89\x98\xf9\xda\x0b\x3a\x0a\x63\x37\xf5\xe3\x48\x6c\x2b\x7e\x54\x8d\x21\x12\x59\x39\x7a\xaa\x19\x4e\xe4\x69\x5b\xf9\x8c\x2d\x5f\x44\x87\x69\x9f\x73\x97\xe5\xd3\xa7\xe6\xd5\xf6\x28\xfb\xd0\x54\x97\xc5\x56\xa5\x0a\x4d\x05\xe2\xb7\x12\xcd\xbc\x35\x10\x68\xe4\x2a\xf1\x95\x38\x90\x1b\x88\x25\x31\x0e\x34\x3e\x1a\x17\xa1\x86\x7d\xde\x0e\xb4\x7d\xda\xb4\x56\xd3\x16\xf3\x52\x15\x54\x93\x7b\xf8\x08\xae\x4e\x4b\xc1\xc3\xc5\xb4\x75\x6e\x4a\x16\x5a\xd9\xe8\x82\x7f\x53\x16\xf7\x48\xca\xc6\x99\x8e\xd2\xd2\x10\x4f\x26\x84\x07\xc1\x35\xe6\x2f\x26\xa9\x22\x46\x0e\xab\x6d\x85\x16\x39\xa0\x0e\x5f\x08\xb3\x47\x65\xea\x02\x44\xf4\x75\xbb\xfe\xac\x18\x3e\x3b\x5b\xd1\xaa\xb7\x98\x52\x27\x98\xa0\x8e\xc6\xbf\x22\x57\xd4\x69\x2f\x5b\x03\xcd\xd0\xa2\x13\x3d\xe9\x70\x60\x3e\x32\x51\x47\x5a\xad\x8d\x93\x4a\xf6\xb2\xbf\xc7\xa6\x50\xb9\x1b\xde\xc1\x43\xf8\xad\x25\x4c\xfa\x50\x6b\xbf\xf2\x8a\x03\xbe\xb6\x59\xef\x5e\x5d\xdf\xfe\x76\xe2\x32\x30\xc4\xcc\xd4\x63\x10\xb3\x7d\xd9\x1f\xa6\xaa\x68\x16\x7f\x62\xa5\x5c\x8a\x69\xf9\xed\x1e\xc6\xcd\xb1\x44\xdd\x81\xab\x0b\xcb\xd6\x26\x43\x42\x0b\xca\xe6\x78\x69\xf6\x4c\x0b\x16\x9f\x3c\xdf\x3c\x90\x58\x95\xb7\xd3\x5b\x6f\xaf\xda\x25\xcc\xf2\x3c\x3d\x10\xde\x32\xe7\xf2\x71\xe3\x00\xd3\x95\x97\xda\x8f\x84\x37\x22\xef\x08\x36\x4a\x5f\x7a\x10\x5b\x96\x55\x17\x2d\xf7\xc8\x2d\x73\x74\xf9\x82\x64\xc9\xcd\xcc\xb4\x96\xf2\xe1\x0f\xd8\x26\x2f\xb1\xa9\xa9\x96\x5b\x0b\x84\x1a\xc0\xd0\xe9\xc1\xa3\xd9\x49\x3e\xa7\xaa\x60\x02\x05\xb8\xf9\x00\xbe\x0d\x7a\xbb\x4d\x98\xa0\x65\x83\xd2\x29\x5c\x27\x63\x18\xbe\x28\xd4\x21\x98\x2d\xed\xd5\xbf\xc3\x3b\x88\x65\xd9\x4e\xf7\x47\xd6\x26\xaf\x99"}, -{{0x51,0xa4,0x19,0x7a,0xb7,0x68,0x6f,0x82,0xf6,0x00,0x3a,0x0c,0x32,0xf3,0x9d,0x0f,0x2e,0x47,0x55,0x5f,0x4e,0x9f,0x8d,0xee,0xe7,0x5b,0xcb,0x1b,0xd1,0xef,0x69,0xe5,},{0x06,0x38,0x6d,0xf8,0x6b,0x61,0xf1,0xf8,0xf4,0xdc,0x45,0xb7,0x3e,0xda,0xa8,0x41,0x92,0x09,0x68,0xbb,0xd1,0x31,0xcc,0x5c,0xa1,0xc5,0x29,0x4e,0xee,0xd5,0xc8,0xba,},{0x2c,0x07,0x29,0x69,0xff,0x47,0x19,0x21,0x2a,0x12,0x19,0x38,0xb5,0x06,0xc6,0x02,0x99,0x5b,0x4d,0x02,0xa2,0x2e,0x61,0x98,0xd6,0xe8,0x7d,0xd6,0xae,0x07,0x62,0x25,0xac,0x70,0xbb,0x25,0xef,0x8c,0x0e,0xe8,0x1e,0xb6,0xfe,0x95,0x3d,0xf6,0xb1,0x81,0x59,0x49,0xe8,0xed,0x05,0x06,0xcb,0x01,0x2e,0x87,0x3c,0xd3,0x6c,0xd0,0x9b,0x0a,},"\x2a\xed\xb7\xe8\x2f\x1f\xe4\xce\x46\x9a\xda\x48\x34\x5d\x00\x6d\x1b\x3b\xff\x40\xeb\x21\x86\x7f\x51\xfc\xe9\x65\x64\x0c\x40\x9e\xc1\x3a\xd4\xd5\x2f\x89\x1b\xd7\x90\x66\xd6\xb4\xd9\x44\xca\x86\x8d\x89\x86\xd2\x42\xb5\x7e\xcc\xc4\xc4\xa4\x88\x29\x1b\x15\x9c\x8d\xe4\x39\x2b\xe4\xb8\x6f\xeb\xaa\x75\xea\xc5\xd2\x2d\x3c\x4f\x8d\x6b\xef\x79\xad\xb9\xb9\x2b\x49\x14\xd5\xea\x07\xc7\xf0\x21\xe2\xc2\x9f\x58\xd0\x7b\xe8\xa0\x84\x10\x0b\xc1\x52\xd5\x1c\xa8\x97\xd7\xc1\x31\x64\x4d\x08\x95\x32\x2e\x94\x40\xa8\x33\x9e\x1a\xa3\x90\xa7\xf4\xfc\xb5\x1d\xdf\xb6\xdf\x48\xaa\xf5\x67\x63\x37\xd8\x7d\xdd\x85\xb1\xd9\x25\xe1\xa9\xc2\x9f\xe0\x81\x8f\x51\x4e\xf7\x2f\x74\x7a\x67\x49\x46\x47\x69\x07\xa7\xca\x99\xe9\xdb\x8d\x20\x96\x41\x05\x7a\x7f\x44\xa3\x17\xb9\x09\x74\xbc\x86\xf9\x61\x7a\x96\x8a\x76\xa6\xb8\x38\x7c\xf5\x85\x3e\x60\x81\x90\xc1\xa7\x9f\x1e\x1d\x68\x6e\x0d\xe2\x2d\xb6\xcd\x9a\xeb\x85\x32\xc5\xc8\x5c\xc9\x0b\x5a\x01\x85\x79\xf2\x8e\x50\x2a\x77\x0a\x4e\xc6\x75\x26\x3d\x0d\xd7\x81\xb4\xfa\x53\xc9\xdb\xf8\x09\x8d\x57\xb3\x3a\xe2\xaf\xba\xeb\x3e\x68\x26\x6a\xd9\xaa\xb7\x17\x4b\xa6\x8c\x64\x79\x88\x39\x92\x67\x0c\xcf\x3e\x5a\xc6\xa1\x7e\x65\xe3\x1e\x1f\xdc\x85\xe2\x69\xc8\x09\x35\xef\x57\x4f\x20\xd2\x39\x56\x84\x86\xe7\xd9\x4a\x4f\x72\x4a\xb7\x00\x60\x98\xb2\x4f\x3f\x61\x58\x76\x91\x43\x5c\x7f\x29\xce\x4e\x5c\xa7\x1b\x2b\x18\x74\x55\x64\x33\xa3\x58\xc8\xc5\xef\x3c\x88\x08\x43\x03\x0c\x2d\x13\xd5\x1b\x78\xc9\xbf\x1a\x88\x24\xe6\x2e\x11\x18\x44\x39\x6f\x5a\xf2\xe2\x5c\x31\x26\xef\x36\x26\xe2\x6e\xfa\xfa\xcf\x99\x83\x0a\xa4\x12\x12\x33\x2f\x37\x8a\x16\x72\x33\xa0\xb4\x22\x13\xaf\xe3\x6d\x83\xdc\x45\x82\xa7\x96\x93\xb9\xd5\x71\xa5\x77\x12\xa0\x8b\x85\x66\xd3\x61\xac\x90\x26\x47\xaf\xc8\x86\x60\x3e\x24\x28\x3e\xfb"}, -{{0xb1,0x11,0x9c,0x36,0x11,0x8b,0x7a,0x06,0x5a,0x19,0x5b,0xfb,0x8b,0x79,0xa5,0xc2,0x87,0xe0,0x9b,0xd2,0x87,0xc2,0xda,0xac,0x5e,0x6b,0x01,0x16,0x4c,0x5d,0x73,0x7f,},{0x88,0xf2,0x18,0xec,0xba,0x99,0xe7,0x70,0xed,0x21,0x4a,0x8d,0x01,0xa9,0x2a,0x10,0x40,0x0a,0xca,0xf1,0xf6,0xee,0xd4,0x20,0x06,0x7e,0x13,0x6e,0xe2,0xc0,0xc6,0x70,},{0x24,0xec,0x1e,0x54,0xfc,0x7e,0x72,0x2d,0x37,0x55,0x1d,0x02,0xcf,0x13,0x5d,0x33,0xf5,0xd3,0xff,0x53,0x57,0x73,0xe0,0x29,0x91,0xee,0x85,0xff,0xd3,0xaa,0x29,0x99,0x7f,0x9c,0x46,0x44,0x70,0x19,0x7f,0xee,0x81,0xdc,0xe1,0x10,0x60,0x9f,0x87,0x0b,0x27,0xc1,0x8d,0xfb,0xcf,0xd9,0x32,0x05,0x48,0x52,0x5e,0x93,0x14,0x8e,0x22,0x05,},"\x88\x16\xb1\xeb\x20\x6d\x5f\x6d\xcc\x2e\x4c\xc3\x91\xd2\x32\x09\x00\x6d\xe9\x35\xe3\x18\x15\x2e\x93\xfc\x8c\x2c\xf0\x8e\x26\x43\x2b\xad\x9a\xdb\x32\x03\xd8\x98\xdf\x0a\x2e\x7f\x1f\x83\xdc\x2f\x3e\xd3\x20\x5b\xec\x8e\xfc\xfd\x31\xad\xc1\xac\xa5\x75\x5d\xb9\xbd\x4e\xfe\x54\xcc\x17\x07\x30\x77\xde\x4a\x3f\xdd\x11\x99\x6e\x84\xb6\xa0\x52\xf0\x34\xb4\x10\x99\x22\x6c\x9c\x27\x2e\xae\x12\x52\x8f\x16\x58\x1b\x91\xb8\x12\x85\x0c\x20\x71\x44\xdb\xff\x3e\x85\x0c\xca\x84\x8e\xc2\xb1\xdd\x16\x47\x44\xd7\xb5\x93\x37\xd7\xe3\xef\xef\x00\x81\x62\xe6\x80\xbd\x4a\x08\x99\xce\xd6\x0b\x17\x1f\x8c\xbe\xb4\x8c\x51\x58\xdf\x6c\xbf\xdb\x26\x24\x08\x81\xbd\x58\xeb\xb8\xb6\xa0\x79\x58\x72\x79\x67\x9c\xb5\xad\x82\xf3\x71\xb5\x3c\x80\x13\x80\x4c\x35\x59\x6c\x88\x7e\x43\x6d\x23\x92\x6f\x99\x4e\x09\xd9\x8f\xbb\x8c\xe2\x70\x41\x74\xef\x38\xb6\x82\x62\xa7\xf1\xa7\x12\xda\x0e\xf0\xde\xc6\x39\x60\x68\x14\xb3\xbd\xca\xf2\x53\xff\x31\xc4\x8e\x8a\x75\x2c\x11\x1b\xd7\x10\x10\x31\xcc\x3d\x38\xef\xb0\xc9\xc7\xf1\x9c\x59\x08\x15\x84\xa0\xe0\x15\xee\x7c\x75\xb1\x0a\x4c\x51\xff\x54\x3a\x30\xe5\x2d\x5f\x94\xd8\x18\x8c\x6b\x08\xe9\xdf\x1e\x84\xa4\xe2\xc8\x07\x17\x0a\xc1\x24\xa7\x71\xb9\x94\x65\xa0\xd3\x8b\x1f\x1c\x63\x30\x40\x3c\x82\x54\x35\x82\xc5\xbb\x61\xb2\x20\xde\x1b\x9e\x0e\xf6\x9b\xda\xe2\x60\x23\x18\x1b\xa4\xcc\x07\x7a\x5f\x0d\x42\x57\x32\xac\xe1\x32\xae\x0c\x6f\xf0\xbb\x18\xba\xea\x83\xe8\x87\x7a\xfb\xe6\x50\xfe\x0b\xd0\x20\x93\xf0\x0a\x7b\x53\x65\x72\x8d\xcb\x66\xfb\xb8\x81\xf5\x92\x94\x50\x58\xa5\xb3\x50\x66\x5a\xf9\x1c\x55\x7a\x54\x72\x50\xad\x29\x5e\x68\xb4\xfb\x72\x45\x7c\xfb\x9d\x5e\xa1\xa7\xb2\xa3\x9c\x9a\xb7\xd7\xac\xe0\xaf\x5d\x51\x66\x9c\xb6\xc2\xc4\xc0\x7b\x22\x56\xd1\x0e\x5f\xfc\x6b\x97\xc6\x60\x00\x63\x13\xc4\xeb\x8d"}, -{{0xcb,0xb5,0x87,0x51,0x4e,0x0a,0x34,0xff,0xc3,0x4c,0xbc,0x04,0xf2,0x8c,0x9b,0x4f,0x64,0x65,0xf1,0xeb,0x22,0x5c,0xca,0x19,0xb8,0x64,0x87,0x6d,0xae,0xf3,0x7d,0x7f,},{0x6b,0x70,0x5d,0x46,0x77,0xd2,0xd8,0x49,0xb6,0x74,0x4b,0x1e,0xbe,0xd1,0x67,0xdb,0xcb,0xf6,0x45,0x92,0x4b,0x1f,0xf2,0xe6,0x36,0x07,0x94,0xbd,0xd0,0xe0,0x97,0x88,},{0x12,0x74,0xd6,0xf3,0x56,0xeb,0x64,0x14,0x72,0xb6,0xb9,0xe5,0xb3,0xce,0x65,0xd2,0x65,0x4e,0x6c,0xb8,0x7d,0x3a,0x83,0xfb,0x49,0xd0,0xf7,0xda,0x9c,0x44,0xbe,0x2b,0x53,0x26,0x04,0x46,0x5f,0x60,0x89,0xd6,0x80,0xd2,0xd9,0x4b,0x0e,0xdd,0x2b,0x6b,0x2b,0x80,0x5c,0x5e,0x84,0xc3,0x79,0xef,0xc0,0x59,0x67,0x3d,0x31,0x00,0x7a,0x09,},"\xbd\xf7\xd1\x7c\x70\x67\x96\xef\xd3\x48\x95\x59\xb5\x27\xb1\xc0\x58\x4b\x90\x22\xc9\xcb\xda\x3a\xac\x51\x46\xda\x34\x0d\x9c\xea\x69\xf9\x16\x03\x7c\xd2\x1b\x3e\xb1\x10\x43\x48\x88\x0f\xd5\xc5\xb7\xc6\x5f\xf8\x20\xf7\x49\x93\x46\x01\x69\x51\xcb\x71\x5d\x8d\xf2\xb4\x1c\x88\xcd\x3c\x66\x10\x54\x58\xb7\xb5\x90\xc2\x1c\x1a\xe2\xf6\xea\x9d\xde\xa7\x47\x0f\x25\xe0\x20\x27\xd1\x71\xe0\xe5\x74\xa2\xbb\x21\x64\x2f\x8f\x9d\xa5\x08\xe2\x1d\x8e\x73\x35\xb5\xac\xe5\x93\x52\x99\x40\x7b\xd1\xb0\x1b\xdd\x14\x23\x13\x3e\xf0\x45\x23\x4e\x70\x1f\x55\x54\x94\x34\xad\xe9\x4a\x60\xbe\x1e\x14\x06\xca\x5c\x75\x8c\x36\x79\x9c\xe1\x70\x30\x84\x47\x6e\x48\x4f\xb1\x74\x05\x30\xae\xe8\x42\x66\xd0\x7a\xdf\xb4\xcc\x68\x9f\x32\x65\x13\x3a\x59\xcd\xf9\x92\xfb\xb9\xa4\xb1\x2d\xef\xbe\x24\x1d\xdb\xf6\x5d\x12\xb2\xfb\xdd\xfc\x05\xaf\x0f\xb8\xde\x42\x08\x07\x75\xba\xd2\x9c\x6b\x04\x59\x84\x1c\xbb\x64\x8a\x9a\x95\xe4\x8d\x6e\x36\xac\x51\x44\x80\xa3\xde\xb4\xb3\x65\x54\xd8\xda\x62\x08\x08\xae\x9d\x47\x32\x97\x10\xd2\x0a\xaa\x6e\x5d\x7f\x54\x7d\x81\xad\x30\xf8\x4c\x0e\x3d\x23\x9c\xde\x5b\x16\x9d\x9d\xdf\x29\x48\x32\xd6\x7a\x80\x60\xba\x32\x9c\x4e\xf3\x9b\xe9\x4a\xc4\x64\x34\xdd\x21\x85\x93\x1d\x12\x31\xf9\xb6\xdf\x87\x8a\x5a\xf0\x83\x1e\x0e\x9d\x8a\x08\xd0\x80\x69\xde\xd6\xa9\x61\xef\x7f\x39\xfa\xd5\x01\xff\xd1\x7d\x6d\x9b\x7c\x65\x46\x53\xc1\xf5\x8f\xce\xe1\xa6\xcd\x80\x3d\x2a\xef\x16\x6c\x78\xef\x55\x14\xa3\x27\x6d\x69\x98\xdc\x7c\x09\xa3\xfa\x98\x2e\x42\x7c\x78\x5a\xa6\xa9\xe2\x56\xf7\xba\x72\xd5\xa6\xba\x33\xeb\x46\xf1\xf9\xfe\x9b\xe2\xbf\xc1\x41\x09\xf6\x47\x73\xc0\x0c\x06\x3b\x4d\x5c\xb4\xf4\xf8\xa0\xbe\xca\x92\xa9\xa0\x16\xc4\xf5\x40\xfe\xea\x9c\x3a\x31\xe3\x13\xbb\xcb\xc2\xff\x5e\xca\x99\x67\x85\x7f\x5f\x8a\x90\x9a\x29\xd7\xf2\x0d"}, -{{0x8b,0xde,0x3f,0xf6,0x1a,0x16,0x99,0x5a,0xb9,0xd5,0x39,0xf6,0x05,0x32,0x19,0x08,0x1b,0xca,0xea,0x1d,0x45,0x8e,0xc3,0x36,0x84,0xfc,0x1c,0x01,0xfb,0x56,0x5b,0xfa,},{0xcd,0x9d,0x78,0x2a,0x35,0x6e,0x84,0x7b,0x7a,0x04,0xc8,0x85,0xa9,0xb0,0x90,0x7c,0xc3,0x3b,0xa9,0x7a,0xd5,0x39,0x0d,0x4e,0xa5,0xfe,0xe5,0xeb,0x19,0x8d,0x08,0xb3,},{0x74,0x64,0xdf,0x0b,0x67,0xeb,0x90,0xb4,0xb7,0x3f,0xf0,0x82,0xad,0x0d,0x60,0xeb,0xfe,0x06,0x60,0xda,0xe9,0x70,0x69,0xb5,0x2c,0x37,0x27,0x22,0x3b,0xf7,0x0e,0x29,0xe4,0x87,0x11,0xa2,0xbb,0xb4,0x38,0xf5,0xf8,0xd8,0xa3,0x3b,0xb9,0xc4,0x8f,0xe7,0xb6,0x28,0xfa,0x8a,0x54,0x2f,0xf0,0xb5,0xae,0x36,0x26,0x9d,0x40,0x07,0xa5,0x05,},"\xa1\xf4\x0e\xc5\x80\x7e\x7a\x27\x06\x9a\x43\xb1\xae\xbf\xf5\x83\xef\x03\x70\x28\xc0\x2c\x85\x95\x25\xeb\x8f\xa4\xc3\xba\x95\xa9\x01\xff\x3a\xed\x78\xc4\xf8\x77\x52\xfb\x79\x55\x22\xf5\xbf\x71\x5b\xe7\xe3\xde\xfa\xc1\x0f\xcf\x17\xe3\xfa\x5c\x54\xb2\x00\x89\xa4\x72\x33\x33\x27\x25\x2e\xc9\x45\x71\x8f\xb4\x55\xe3\xf2\x7c\xcf\xde\xf8\x23\xd1\x2d\x40\x6e\x62\xa4\xae\xba\x3c\xb9\xd1\xc6\x1b\x2b\x17\xe4\x9e\x20\x0a\x84\x18\xf9\x35\xf2\x6e\xeb\x57\x60\x2c\x7a\xa3\xb3\xa2\x4f\x7e\x62\x38\xd3\xe0\x8d\x2d\x60\x9f\x2e\xad\xa0\x33\x2b\xc8\xcb\x12\x91\x6c\xb0\x3b\x0d\x4f\x9c\xd6\x02\x00\x25\x86\xd3\xe4\xcc\x7e\x0e\x03\x81\xc0\x45\xad\x2e\x1e\xe2\x82\x98\xae\x7f\xcf\x0c\x10\xf2\x12\x80\x85\x65\x29\x6f\x15\x8d\x2c\x32\xe8\xcb\x28\x15\x65\x81\xaf\x52\xbf\xc3\x47\x0c\x3c\x95\x82\x13\x8d\x22\x55\xe8\x42\x6d\x64\x8c\xa2\x37\xd7\xaa\xd2\x85\x6f\x17\x16\x38\x55\x82\x41\xd8\xae\x3f\x62\xba\x92\xdb\x59\x65\x68\xed\xee\x3e\xc0\xef\x37\x0f\x83\x62\x6a\xa0\x44\x5a\xf0\x8f\x96\x78\x63\x66\x0e\x8f\xba\x5a\x41\xc8\xe8\xed\xe1\xc9\x60\x51\x4a\x14\x68\x7a\x4a\x81\xe7\x76\xae\x0e\x8e\x77\x7f\xb0\xf2\x50\xd5\x1a\x83\xb5\x5f\x8c\x1f\xfd\xd7\x8d\xf3\xbd\xc9\x7f\xf1\x77\xaf\xec\xa0\x46\xc7\x2d\x72\xaf\x92\x4a\xd0\xd0\xab\x2b\xfc\x11\xb7\xf4\xab\xde\xd5\x1c\x39\x87\xa8\xbb\x94\xd6\x40\xc8\x71\x0e\x5f\xc9\xa4\x19\x0e\x8a\x00\x83\x63\xd7\x41\x9c\xea\x17\xc4\x0d\xea\x20\xea\x51\x56\x02\x9f\x3d\xeb\xf0\x52\x41\x91\x8f\x54\xaf\x50\x39\xe2\xc4\xcf\x2c\xa2\xe1\x39\xf6\x0e\x45\xcc\x65\x59\x5c\xdf\x54\xa6\x7d\x92\xb6\xac\x66\xfc\x0c\x5a\x29\x04\x95\xca\x57\xb0\x7e\xf5\x75\x0d\x05\xf5\x7d\x87\xd0\xc2\x28\xf7\xe4\xe1\x5a\xd0\xba\x01\x78\x73\x0f\x95\x1c\x69\x75\x83\x48\x1c\x66\xcb\xfc\xd4\x80\x32\x54\x4a\xa8\xd5\x09\x08\x30\x4b\xd8\x19\x40\x30\x87\x06"}, -{{0xda,0x59,0xbb,0xc5,0x23,0x40,0x4f,0x07,0x64,0x6a,0xdd,0x79,0x08,0x29,0x49,0x77,0xe4,0x66,0x45,0xbc,0x8a,0x38,0xba,0xd2,0x80,0x96,0x41,0xa2,0x3d,0xe3,0xb1,0x5a,},{0xb2,0x2c,0x0f,0x21,0xaa,0x1c,0x2d,0x45,0xf4,0xb2,0xe5,0x6c,0xc9,0xb5,0xe0,0x2f,0x9e,0x31,0xa2,0xea,0xa3,0x67,0xec,0xb4,0x82,0xf8,0x74,0xcb,0xd8,0xe9,0xfe,0x34,},{0x14,0x72,0x45,0x9c,0xbb,0xae,0x2c,0xf2,0x1c,0xe4,0x4a,0x15,0xba,0xe9,0xfc,0x85,0xdc,0xa4,0x0b,0x81,0x82,0xda,0x7d,0x52,0xcb,0xf5,0x6e,0xd5,0x38,0xd1,0x8e,0x03,0x47,0x7c,0x14,0x0a,0x3d,0xdd,0x0e,0xfb,0xa4,0x3c,0x96,0xaa,0x92,0xf5,0xf9,0xbc,0xdf,0x34,0x81,0x28,0x6c,0xe7,0x62,0xa7,0xe2,0xbd,0x1e,0x77,0x9b,0xa9,0x9b,0x0d,},"\x09\x71\x06\xc3\x62\x4d\x77\x4d\xde\x25\x51\xe0\xc2\x7e\x19\x50\x4e\x65\x18\xcc\x86\x36\x9a\xb2\x6f\xf8\x10\x96\x9e\x7d\xe2\x4a\xbc\x68\xb4\xb5\x3f\x11\xd9\x45\xd4\x9e\xf0\x78\xeb\x4f\x6b\xa6\xbf\x25\x7f\xf7\xb6\x08\xaf\xdc\xb3\x0a\x5c\x59\xa7\x56\xfd\x77\xa6\xc1\x24\x7f\x6f\x2a\x41\x10\x0d\x99\xfc\x52\x06\xaf\x3b\xcc\x6d\xe1\xd3\xe4\x96\x8e\x28\xfb\xa0\x12\x3f\x60\x45\xa1\xb5\x4d\x69\x3a\x42\xbd\xfa\x07\x1b\x2b\x91\x4b\x3c\x3c\x0c\x29\xb2\x59\x3d\x07\xe8\xbd\xc8\x6c\xa4\x2a\xc5\x55\xb7\xdc\xd9\x43\x9d\xf9\xfb\xd4\xbb\xec\x73\x0d\x63\x27\xbf\xae\x4f\xc4\x1e\xd4\x98\xb4\xf0\x4a\x0e\xb1\x4c\xee\x60\x82\x83\xaa\xa6\xe6\xaa\x46\x67\x6b\xc8\x8a\xed\x5d\x99\x39\x03\x7a\xad\x49\x15\x66\x1a\xf9\x4b\xb5\xf6\xe6\x53\xa2\xca\xc1\x23\x28\x70\x73\x27\x0e\x0b\x13\xfd\xa1\xdd\x48\x71\xaf\x6a\x92\xf9\x92\xf5\x39\xdf\x88\x17\x12\xfe\xfb\x03\x85\x40\xd4\x11\x91\x12\x3b\x6b\x3b\x4b\x6f\xf8\x7f\xfc\x92\x9a\x6b\xe5\x3c\x6c\xef\x02\xf4\x8f\x2f\x0c\xf2\xfe\x64\xa4\x5f\xd6\x60\x25\xcc\x2d\x7e\xe5\x5e\xbe\x23\x16\xc0\x00\x85\x56\x61\x16\x5e\x2a\x5b\xa4\x1a\xfc\x20\x97\x95\x7b\x6f\xe4\xc5\x52\x21\x20\x4b\x6f\xc1\xf3\x17\xdd\x3b\xa1\x3c\xac\x39\x92\x40\x26\xbd\xb6\x6b\xe4\x54\x22\x68\x87\x56\x31\xd2\x77\xf2\x10\x10\x7a\x33\x76\x7f\x6d\x95\x96\xe2\x57\x42\xd7\xa9\x0e\xa7\x91\xea\x4b\xc9\xee\x84\xa6\x7f\xd3\x28\xb8\x0f\x79\x1e\xde\x96\xd8\x96\x63\xe9\x37\xf0\xb7\x55\xba\xa9\xd5\x2b\xda\x21\x0c\xee\x1d\xb3\x39\xff\x1d\x3c\x4b\x00\x0b\x65\x3b\x9b\xde\x33\x80\x49\xaf\x84\x36\x4e\x21\x77\xf8\x0d\xd5\x1e\x2a\x16\x72\xee\x55\x5d\x63\x17\x58\x9f\x6f\x1d\x5a\xbe\x6c\x28\x77\x35\x8b\xf9\x4b\x0b\x80\x8f\xf8\x57\x36\x3f\xbf\xbe\x32\xe9\x73\x37\xe4\xb8\xa8\xc2\x21\xa9\xe7\x59\x62\xa8\xdc\x9b\x5a\x3d\x7c\xa5\xf9\xc9\xb6\x1c\x73\xc1\x46\x9a\x72\xbd"}, -{{0x40,0xea,0x82,0xda,0x41,0xfd,0x15,0xb0,0x6f,0xfe,0xb9,0x9c,0xd6,0x16,0xdc,0x6b,0xc8,0xc1,0xb2,0x14,0x77,0xea,0x23,0x94,0x66,0x08,0x8e,0x28,0x49,0xbf,0x10,0x16,},{0x59,0x10,0xe5,0x80,0xbf,0x41,0x2c,0x31,0xa8,0x74,0x51,0xd9,0xdd,0xf3,0x2b,0x3a,0xb7,0x13,0xf9,0xe4,0xa2,0x2c,0x59,0x0c,0x64,0x1c,0x14,0xa5,0xdf,0xbb,0xe0,0xd7,},{0xd2,0x98,0xfc,0xc9,0xa8,0xec,0xb7,0x6a,0x98,0xd4,0xa7,0x1d,0xfb,0x01,0xd2,0x76,0xab,0x2d,0x96,0x70,0xa9,0x5b,0xab,0x34,0xcf,0x1d,0x83,0x64,0x51,0x6d,0x1e,0xbd,0xb2,0x39,0x03,0x46,0x02,0x15,0x30,0x71,0x25,0xaf,0xd0,0x9c,0x75,0x8e,0x98,0x1a,0x45,0x2d,0xa9,0x5c,0x0a,0xc2,0xc0,0xb9,0x58,0xc6,0x91,0x7e,0x68,0x74,0x19,0x0d,},"\xa0\x6c\x4e\x02\xb8\x3a\xb7\xe1\x91\xad\x81\x8c\xb8\x18\x7b\x52\xa8\xda\x00\x4f\xe8\x38\xdb\x33\x3c\x4e\x02\x54\x8d\xb6\xbd\xf7\x91\x44\x46\x42\xe5\x7f\xdb\xc8\x59\x4e\x59\xd7\x02\x32\x80\xbb\xae\x82\x98\x6f\x39\x98\x05\x43\x4b\xb0\x72\xc8\xa2\x7a\x2d\xcd\x5a\xa6\x2f\x06\x5b\xc5\x8b\x06\x21\xfc\xd3\x65\xf6\xcd\xbf\x4d\x57\xd5\x77\xd9\x11\x50\x30\x1f\xa4\x8f\x18\x2f\x87\xe8\xdc\xa7\xce\x45\xa7\xd6\x48\x45\xff\x43\x4d\x1b\xab\x05\x34\xcc\xc8\x3a\xa0\x97\x4e\x88\xb3\x8f\xc2\x50\x8c\xef\xcb\xbc\x82\x13\x5b\x73\xb3\x84\xc8\x0e\xcc\xb8\xa0\x9e\x28\x73\xcc\x07\x12\x90\x21\xd8\x1c\xe1\x29\xa9\xdf\x65\xe6\x13\x41\x0a\xf9\x50\x19\x7d\xbf\x9a\xfc\x28\xed\xc4\xe6\x5c\x3e\x84\xda\x40\xd2\xef\x84\x1b\x88\x6b\xc4\x47\x19\xa5\xd5\x9d\xb2\xc6\xdc\x77\x64\x01\xc8\x95\xe2\xb3\xc8\x37\x83\xd7\x81\x7b\xba\x68\xba\xff\x59\x47\x0d\x60\x15\xbb\xa8\xd9\x75\xf0\xeb\x71\x2f\x3b\x89\x02\x91\x28\x05\x52\x3a\xa7\x1c\x90\x49\x9d\xe6\x89\xd3\x1a\xe4\x4e\x21\x0b\x84\x46\xf2\x48\x47\x27\xcc\x49\x1b\x92\xa8\xe8\xb1\x99\xd6\x28\xe1\xdf\x79\xa2\x8c\x56\x1e\x5a\x7d\x88\x2e\x30\x78\x7d\x08\xfb\x2d\x51\x96\xba\x61\x19\x63\x09\xb3\xbf\x0c\x58\x24\xa3\x54\x8c\x70\x00\x03\xfe\x99\x13\xbe\xfe\x12\x22\x31\x50\x01\x26\x85\xe9\x07\x20\xe9\xec\x6b\xc4\xdb\x60\x74\x25\xae\xc5\x31\xc4\xfa\x36\x08\x6d\x3b\x9b\xe3\x91\xa3\xf0\x46\x35\xa8\x07\x7a\x44\x7a\x16\xa6\xfd\x89\xaf\xbb\x9a\x72\xd0\xd3\x55\xcb\x0b\x22\xd5\x62\xf4\x3f\x59\xd4\xe3\x71\x28\xb3\xe2\xd9\x06\xc8\xae\x23\xd0\xaa\x59\x9c\x70\xd3\x77\x8a\x07\x6c\x1a\x39\x72\x8f\x1d\x69\x37\xbd\x48\xb9\x78\x74\x08\x50\x56\x61\x38\xd3\x48\x52\xb6\x30\x75\xe8\x9a\x8e\x22\x80\xed\xba\x6f\x4e\xe8\xf6\x15\x11\xe9\xb7\x68\xe9\x5c\x78\xd1\x97\xb6\x93\xb1\x09\xe8\x88\x18\xb4\x86\xa9\xdf\xdb\x74\xb4\xc5\x55\x0a\xcd\xfb\xd5"}, -{{0x28,0xbb,0x81,0xa1,0x7d,0x45,0x84,0x75,0x4d,0x52,0x81,0x8c,0xd0,0xf1,0xf2,0x1b,0xaa,0x77,0x7e,0x69,0x58,0x44,0xa1,0x51,0x22,0xac,0x05,0x34,0x4d,0xdd,0xc0,0x27,},{0xd5,0xf6,0x1d,0x51,0x99,0x44,0xd1,0x3b,0x84,0xbf,0xa7,0xcd,0x67,0xcb,0x0b,0xea,0x4e,0xf2,0x28,0x1e,0xfa,0x46,0x1f,0x22,0xad,0xe4,0xba,0x88,0x2d,0x11,0xb2,0x52,},{0x9c,0xe4,0x5a,0x07,0xdb,0xd2,0x8d,0x3f,0x6f,0x1b,0x35,0x63,0x0a,0x3f,0xd5,0x6f,0x1d,0x54,0x8f,0x84,0xff,0xb1,0xc6,0xae,0x64,0xb2,0x14,0x98,0xae,0x38,0xe5,0x96,0x91,0x6e,0x77,0xf7,0x99,0x05,0xe6,0x09,0xfb,0x1a,0xe0,0xda,0x36,0x13,0x8a,0x80,0xf2,0x42,0x12,0x21,0x67,0x06,0x80,0x92,0xcc,0x60,0x57,0x96,0xc5,0x66,0x9e,0x06,},"\x92\xe8\x4c\x7a\x55\xb0\xbe\xa0\x3e\x17\xcf\xb6\x5f\x70\x85\xce\x3f\x44\x5b\x15\x42\xba\xe9\x97\xde\x5f\x09\x2a\x24\xff\x24\x33\x80\x28\x6d\x13\x70\x91\xa5\x98\xf3\x5e\x6d\xae\x1a\x1c\x64\x8f\x5a\x49\x4c\x81\x9d\xfb\x24\x06\x52\xff\x90\x83\x81\xf3\x2d\x70\xbc\x51\x31\x00\xac\xa1\x6f\xe7\x22\x02\x95\xb1\xc7\x18\x35\xf1\x6d\x93\x10\xa9\xd2\x7a\x04\xa9\x80\xac\xe2\x97\xd5\xaf\x3f\x7c\xb7\xc7\x8b\x24\x99\x7c\xcb\x41\xf5\x4e\xcb\xab\x50\x7e\xb7\x3e\xa6\xa3\xed\x47\x0e\x49\x59\x05\x09\xf5\xd1\xe6\x03\x2a\x26\x05\xdb\x87\xf4\xa9\xb9\xec\x91\x60\x25\x83\xf1\x4e\x2f\xe1\xbd\xb9\x00\xec\xb8\x97\x11\x96\xb5\x5c\x0d\x43\x34\x89\xf2\x6b\xe9\xca\x15\x7c\xbd\x56\x57\x28\x87\xba\x85\x9f\x39\x67\x4a\x8e\x0c\xa0\x8f\x2d\xbb\x0f\x27\x07\x35\x51\xd0\xb1\x99\x06\x85\x17\x8b\x1a\xe9\xe7\x88\x54\x99\x14\x3d\x9d\x72\xc8\x57\x1d\x11\xe0\xd8\x5b\xf5\x8d\xf9\x4e\x2a\x74\xd9\xb6\x84\x65\x57\xf9\x12\x5c\xa0\x94\x4c\xe5\x71\x8d\x2c\xba\xe1\x67\x2b\xa0\x2b\x84\x7c\x17\xa6\xf6\xb4\x45\x63\x4d\x2f\x01\x75\xa7\x5c\xf6\x88\x3c\x62\xe5\xb5\x21\xc5\x71\x41\xf2\x18\xb2\xfb\x09\x94\xb3\x72\xa7\x16\xc4\xa2\x17\x43\x4b\xea\xb7\x57\x40\xb8\xe9\x1c\x62\x21\x87\xd0\x3c\x85\xda\x00\x1e\x00\x24\x73\x12\xa4\x65\x22\x5f\x5d\x6a\xf2\x32\x06\x4a\x42\x7d\x30\x18\x70\x0d\xed\x77\x4b\x90\x26\x77\x7a\x52\x75\xfc\x04\x75\x46\x06\xc8\x66\x00\x29\x7b\xf7\xb7\x1a\xaf\xf8\xb9\xa7\x46\x67\x7a\x36\x62\xf3\x75\x0e\x81\xb5\x01\x66\xf6\x23\x70\x00\x05\x1f\xfa\x15\x86\x8d\xef\xdf\x09\x00\x57\x72\x2a\xe2\x29\x96\x4a\x4e\xa0\x85\xe0\xdb\xc0\x4c\xe1\x99\x77\x22\xc5\xbb\x65\xd2\xb4\x7e\xcb\x74\x6f\xd8\x3a\x9f\x6a\x69\xc8\x15\x45\xa9\xb5\x02\xf5\xe7\x6d\x31\x30\xc5\xaf\xcb\x1c\x9a\xf9\x9d\x91\x87\x40\x83\x7c\xe8\x9d\x7c\xd2\x13\xfe\xf2\xfd\x06\x2c\xe8\x85\x0f\x69\x65\x9e\x4a\xd3\x27"}, -{{0x24,0xbf,0xd4,0xfc,0x45,0xd5,0x09,0x35,0x85,0x67,0x81,0x01,0xcf,0x56,0x3a,0xb8,0x01,0x1f,0xd6,0x43,0x0d,0xe1,0x55,0xf2,0xa4,0x25,0xf0,0x63,0x3e,0xe3,0xb7,0xcd,},{0x9c,0xf5,0xc5,0xfc,0x0c,0xcf,0xae,0xb2,0x8a,0x08,0xba,0x67,0x70,0x7b,0x18,0xdc,0x84,0xea,0x06,0x98,0xff,0xbd,0xbc,0x16,0x9a,0x09,0xc2,0x81,0x23,0xe6,0xc2,0xac,},{0xdc,0x93,0x5b,0x60,0xfd,0xe4,0x43,0x59,0xaf,0x8f,0x50,0xed,0x7f,0x91,0x9f,0x48,0x3c,0xe3,0xf2,0x4e,0x23,0x20,0xc5,0x5b,0xa9,0x2f,0x3e,0x76,0x17,0xc1,0x9b,0xfb,0x54,0x70,0x19,0x03,0xff,0x18,0x3b,0x42,0xcb,0xed,0xfe,0xf0,0x87,0x5f,0x42,0xb1,0x28,0x75,0xd3,0x6a,0x0a,0xee,0xc7,0x3f,0xfd,0x09,0x50,0x9d,0x92,0xb2,0x8b,0x0d,},"\xba\x54\x12\x8f\x45\xbe\x20\x01\xdb\xb0\x60\xd5\xdc\xc4\x71\x44\x99\x74\x15\xd4\x29\x4f\x6e\xba\x8d\xce\xba\x4f\x6c\xf2\x23\x46\x83\xc4\x26\x5f\x88\x03\x22\x05\x29\x6e\x9b\x27\xd6\x85\x06\x23\x2d\x57\xb6\x88\x40\x76\x48\xf8\x7c\xeb\x34\x20\x52\xbd\xe9\xd0\x06\x55\x42\xff\x17\x15\xc9\x42\x02\x7e\x67\x48\x2a\xf4\xbc\x27\x8f\xf7\x19\x66\xfb\x3f\x62\xa2\xa5\x32\x3c\xb1\xb4\xba\xe1\xe7\xb8\xfe\xdc\xbc\x73\xea\x05\xb4\x07\x64\x21\xb0\xb4\xfa\xe8\xbc\x33\x37\x41\x6a\x17\xfe\x12\x4e\x7e\xe4\x65\xeb\xb3\x8d\x87\x92\x30\x64\x29\xd8\x27\x9a\x1b\xd5\x4c\x37\xbe\xe8\xf9\xc8\x5e\xeb\xe3\xaf\xd1\xf6\x44\x89\xd4\xe5\x3a\xc5\xf5\x06\x57\xbb\x6f\xfb\x97\x12\x07\x44\xb7\x5d\x47\xc6\x22\x6d\x5a\x9c\x9c\x26\x4e\xe3\xe6\xa6\xde\xd0\x50\x62\xca\x10\x06\x66\x91\x18\x45\x45\x50\x01\x09\x19\xc2\x63\x3c\xf0\x86\x95\x03\x45\xe5\x14\xaf\x38\x43\x14\x8e\x5c\x64\x35\x2e\x69\x03\x7d\xfe\x60\xd4\xa8\xea\xb3\xeb\x8c\xb5\x4b\xd3\x9a\xf2\xf3\x53\xd5\xde\xd2\xe2\xbc\x8b\x11\xc0\x9f\x61\x2e\x12\x8c\x6e\xfa\x41\xf6\xeb\x2c\x95\x80\x87\xbe\x34\xc6\x33\x5a\x43\x00\x5d\x11\xa9\xd3\xb5\xa5\x29\xc2\xd1\xb0\x64\x2f\x77\xaf\xdd\x8c\x6b\x1d\x6f\xb2\xa9\xdc\xb6\x5f\x42\xf4\xec\xa8\xea\x9a\x05\x40\x58\xbe\x86\x13\x66\x76\x10\xe3\xee\xd8\xd1\xdf\x07\x39\xec\xa1\x71\x95\x41\x17\x98\x9d\x1b\x12\x18\x9a\xb5\x79\x04\xaa\x96\x0b\x0c\xa8\x55\x41\x74\x63\x85\xef\xa9\x85\xbe\x9d\x97\xb5\xa9\x02\x99\x89\xa9\xc7\x14\x98\xdf\xab\xdb\x81\x36\x81\xf5\x7e\x27\x6b\x64\xdb\x49\x1b\x8f\x08\x2a\x88\x51\x45\x46\x9a\x53\x1b\x7f\x9f\x04\xca\x0a\x2c\x2f\x8d\xff\x20\xcc\xb9\x9c\x28\x61\xf5\x4e\x5e\xaf\xa9\x62\xcc\x53\xea\xf1\x8d\x3d\x5e\x50\xd3\x37\xaf\x48\x5f\x19\x97\x5f\x05\x93\x07\x00\xa8\xa7\x25\x3f\x11\xf1\x84\x13\x0d\x0a\xee\x70\x96\x9d\x96\xfe\x08\xf2\x16\x95\x1d\x9d\xce\xd5\x23\x88"}, -{{0x2f,0xc2,0xf9,0xb2,0x05,0x0a,0xd7,0xd1,0x39,0x27,0x3e,0x93,0xe2,0xa0,0x45,0x1c,0x7b,0x5c,0xce,0x57,0x59,0x9a,0xa6,0xb0,0x8d,0x3e,0xdc,0x5b,0xb0,0x75,0x90,0xc8,},{0xff,0xe5,0xa1,0x78,0x80,0xd7,0x18,0xcc,0x79,0x88,0xc2,0xfd,0x98,0x25,0xb0,0x3b,0x93,0x45,0x0a,0xc1,0xde,0xb8,0xfb,0xd1,0xf1,0xbf,0x3b,0x8f,0x87,0x80,0x59,0x54,},{0x7a,0xff,0x16,0x2a,0x3c,0x0d,0x28,0xdf,0xf4,0x17,0x15,0xa9,0x74,0xaf,0x07,0xec,0xac,0x21,0x32,0xfc,0x18,0xbc,0x43,0xa1,0x98,0xfe,0x66,0x46,0x59,0x05,0x0d,0xa1,0x9a,0xe2,0x27,0x58,0xd5,0x2c,0x9c,0xbb,0x94,0xf1,0x35,0x8b,0xb0,0x26,0x10,0xa8,0xa3,0x51,0xc2,0x11,0x62,0x79,0xe7,0x24,0x5a,0xdf,0x69,0x67,0x5d,0xfd,0x36,0x0a,},"\xdc\x12\x97\x99\x0c\xc0\x27\xd5\x6d\x1f\xee\x26\x5c\x09\xbc\xf2\x07\xa9\x58\x3e\x6b\xab\x8d\x32\x47\x82\x28\xe0\xbc\x30\x5b\x98\x18\x15\x4c\x33\x8c\xee\xc3\x4b\x04\xc4\xad\xe7\xac\x61\xdc\xb0\x9b\xfa\xc8\xad\xe0\x0d\x1f\x29\xde\x31\x70\x60\xb8\xa4\xda\xf1\x98\x7d\xe4\x09\xca\x2c\x3f\xe4\x38\x00\x88\x07\x3c\xcf\x48\x5e\x9a\x69\x51\x6b\x5b\xbb\x41\x30\xf2\x0b\xe6\x9b\x2d\xd6\xa9\xb4\x65\x15\x9c\xca\x1a\xc8\x8b\x32\x8b\x80\xc5\x1b\x66\xaf\x7f\x4c\x50\xf6\x22\x87\x72\xf2\x87\x34\x69\x3c\xe4\x80\x5a\x41\x63\xdf\xf1\x4b\x4d\x03\x98\x11\xee\x3f\xce\x65\x93\x54\x44\xa6\xea\x9a\x72\xd7\x8b\x91\x5c\x9c\x3b\x76\x6c\x60\xb7\xe0\x32\x9e\x43\xc9\xc5\x7e\xde\x94\xb9\x15\x25\xce\x5a\x07\x5a\x72\x97\x21\x97\x72\xef\x3c\x02\x96\x49\xb5\x86\xa9\x5a\x73\xbb\xdf\x16\xd8\xfc\x20\x36\x8d\xe4\xba\x44\xde\x10\x64\xbe\x58\x26\xb3\x76\xbe\x31\xa8\x6c\xa4\x78\xa5\x2e\xfb\x98\xf1\xfa\x33\x31\x57\x71\x9b\xd6\xe0\xda\x80\xed\x68\xd0\xef\xea\xfe\xe5\xa1\x3b\xcc\x3b\x45\x75\x25\x25\x8f\x1f\x7e\x03\x1f\x7b\x40\x3a\x46\x15\x06\x92\x7b\x1e\x6c\x7d\x4a\x0c\x8d\x84\xb5\xf3\xdd\x0e\xb8\xbd\xb1\x3e\xdc\x2b\x51\x4a\x81\xd0\x88\xeb\x07\x7a\x52\xc8\xa8\x31\x86\x1f\xee\xe8\x11\x0e\x41\xa3\x25\xdc\xe2\x06\xb2\xd6\x7d\x25\xf9\x0e\xf5\x7e\x0f\xde\x70\x9f\x3e\x5a\x39\xc0\x4e\xed\x31\xe5\x7c\x19\x3b\x28\x3e\x2d\xa7\x27\x9e\xe3\xf1\xee\xd4\x82\xb3\xbb\xcd\x37\x39\x02\xc1\xdf\x81\x1a\xc3\x3e\x1d\xe0\x64\x29\xe8\xf8\x44\x3f\x60\x20\x19\x65\x0b\xdc\x2e\xe8\xd7\xf6\x50\x03\x6a\x7a\x22\xb8\xfd\x88\x51\x75\x11\x22\x9c\x72\x9a\x32\x69\xb3\xa3\xe8\xfc\x72\xb0\x1b\x5a\x4b\x3e\x33\xf5\x27\x2f\x3a\xd2\x16\x29\xd0\x8b\x1f\x71\x79\x35\xe9\xe1\x04\xad\xd2\xf0\xf2\x03\x34\x32\xbe\xc8\x2e\x21\x21\xd9\x8c\x9c\x1a\x58\xe0\xda\xba\x25\x53\x6a\x1b\xe8\xe5\x08\x83\x47\xf4\xa1\x4e\x48\xd8\xe3"}, -{{0x8a,0xfe,0x33,0xa0,0xc0,0x8a,0xa3,0x48,0x7a,0x97,0xdf,0x9f,0x01,0xf0,0x5b,0x23,0x27,0x7d,0xf0,0xbb,0x7e,0x4c,0xe3,0x95,0x22,0xae,0xc3,0xd1,0x78,0x16,0xe4,0x67,},{0xd0,0x04,0x37,0x0e,0x6e,0xdc,0x34,0xb3,0xe8,0x81,0x86,0x67,0x21,0x6f,0x5b,0x22,0x6b,0x0f,0xf7,0x5a,0x58,0x48,0x4c,0x86,0x16,0xe1,0xa8,0x66,0x44,0x4c,0xab,0x57,},{0x63,0xa8,0xae,0xac,0x02,0x5f,0x2d,0xde,0x9a,0x73,0x28,0x6e,0x56,0xc2,0xd6,0x2d,0xcb,0x79,0xa2,0x41,0xba,0x0b,0x2e,0x2d,0xba,0xca,0x87,0x52,0xed,0x2f,0xc8,0xcc,0x7a,0xb8,0xe6,0x60,0x0b,0x67,0x64,0x5f,0xb5,0xe8,0x18,0xa4,0xe8,0x2c,0x29,0x18,0x0a,0x6b,0x2c,0x3f,0x58,0xd0,0x99,0xcb,0x63,0x5c,0xe5,0x2b,0xdc,0x15,0x70,0x04,},"\x86\xfb\x74\x1f\x1b\x97\x08\x92\x91\x95\x03\x1a\xa1\x64\x5f\xb7\x09\xa8\xae\x32\x3f\xff\x85\xe5\x47\x01\x94\x45\x2e\x11\xb7\xb1\x27\x91\x94\xb5\xe2\x42\x7c\xe2\x3e\x1d\x74\x9c\x3d\xdf\x91\x0b\x01\x7e\x4f\x2d\xff\x86\xdb\xe4\x82\xc9\x1b\xd9\x94\xe8\x49\x3f\x2e\x68\x24\xbb\xa3\xbc\x7d\x7a\x84\x5f\x21\x7a\xe9\x76\x0b\x3c\xd0\x02\x26\xd9\xff\x26\x16\xd4\x52\x75\x1a\x90\xc3\xd0\xd3\xc3\x6d\x4a\xb4\xb2\x52\x0f\x67\x28\x81\x71\xbd\x3a\x34\xb2\xea\xca\xe8\xd4\x4c\x1e\x15\x3d\xda\x1f\x90\xbc\xd3\x59\x5d\xad\x37\x71\x3b\x8d\x34\x01\x56\xea\x90\xa4\xe1\x35\x95\x1b\xa7\x16\x9a\xc1\x75\x57\x8b\x81\xe9\x7a\x54\x1a\xb9\xbf\xb7\x63\x28\x79\x8d\x7d\x63\x1c\x14\xdf\x2a\xd6\x13\xe9\xc6\xe1\x14\x7a\x0e\x84\x06\x2d\xdb\xa0\x35\x85\x9d\x46\xba\xde\x5f\xad\xd9\xb3\x2b\x43\xda\xd4\x83\xc6\xb8\x02\x3b\x32\x39\x1e\x51\xef\x15\x20\xc6\x8c\x61\x91\x32\x6c\x49\x44\x23\x08\x0c\x62\x3d\xc4\xad\x0a\xa0\x74\x74\x8d\x82\x6c\x29\x64\x4c\x38\x98\x6a\x77\x00\x2f\x0c\xab\x90\x68\xe6\xc9\xec\x73\xcc\x2e\x0c\x58\x4b\x80\xe0\xbc\x37\x57\x21\xf7\xa8\xfc\x35\x31\x7a\x5e\x24\x0e\x8c\x66\x09\x2f\xb6\x30\x5b\x01\x2c\x70\xe1\x7a\xea\xff\x13\x38\x6d\x5e\x28\xd0\x64\x30\xca\x58\x5b\x0c\x85\xb2\x74\xe7\xfc\xbb\x63\xe3\x42\x3a\x98\x25\x79\xe5\xa6\x4a\x02\x62\xc4\x19\x08\xe5\x5d\xbe\x43\xda\xc1\xe5\xcc\x1b\xb7\x29\x8b\xe4\x28\x72\x0a\x12\xe3\xb0\x72\x55\x9e\xc2\x67\x5d\x45\x7a\xaf\x8f\x13\x25\x2e\x28\xaa\xd6\x3c\x15\x13\xf5\xf2\x39\x56\x4d\x36\x3c\x85\x05\xff\xa4\xe5\x0f\x66\x48\xc1\xcb\x82\xbb\xa8\x52\xbf\xf0\xac\xb0\x30\xcb\xe7\x3f\x05\x9d\xd8\x7b\xbd\x73\x18\xc5\x58\x6e\x70\x86\x18\xa4\xf4\xc9\xf3\xbe\xc3\xf4\xf0\x7c\x60\x9e\xeb\xb2\x4b\xa8\x78\xc6\xbf\x1e\x4f\x2d\x0f\xd1\x45\x0a\xb9\x4e\x31\x75\x52\x17\x78\x6f\xb1\x51\x82\x76\x0f\xfb\xe5\xa2\x67\xcb\xe9\x98\xa4\xff\x90\xa2"}, -{{0x6d,0xc7,0xcc,0xf3,0x29,0x37,0x8e,0x81,0x31,0xb6,0xde,0xfc,0xd8,0x93,0x70,0x30,0x10,0x68,0x94,0x63,0x36,0xb0,0xb7,0x62,0xac,0x5e,0xa5,0x14,0x87,0xdb,0xd3,0x9e,},{0x04,0xe9,0x0d,0x27,0x5e,0x79,0xdf,0x5f,0x2b,0x6e,0xf4,0xa3,0x15,0x05,0xaa,0xc0,0x5a,0x69,0x45,0x9b,0xaf,0x2c,0x58,0x1b,0x3c,0xe3,0xdb,0x29,0xf0,0xf1,0xfc,0x14,},{0x04,0x50,0x9d,0xb0,0x03,0xa1,0xa6,0xed,0x3f,0xbc,0xec,0x21,0xac,0x44,0xec,0x10,0xcc,0x06,0xd7,0x9f,0x27,0x14,0x96,0x08,0x82,0x17,0x03,0x16,0x27,0x5d,0xf8,0x04,0x23,0xa1,0xc1,0xa1,0x12,0xd8,0x81,0xfc,0x24,0xd2,0x81,0x25,0x26,0x07,0x90,0x58,0xaa,0x8b,0x60,0x8b,0xfc,0x6b,0x5e,0x57,0x63,0x22,0x40,0xc6,0x36,0xd6,0xeb,0x00,},"\x20\xce\xbb\xe9\x84\x01\xac\x89\x34\xc3\xe6\x5a\x57\x38\xcb\x0e\xc0\xcd\xc7\x5f\xdb\x09\xdc\x96\x31\x28\x94\xb1\x87\xc0\xa4\x6d\x2c\x38\xf4\x85\x5b\xe3\xee\xcc\xdc\xdc\xc5\x6d\x92\x6a\x8c\x08\xce\x6e\x74\x8e\x2a\x85\x8f\x53\x53\x2e\x7e\x5f\xc5\xf7\x01\x4c\x8c\x6f\x86\x31\x0c\xc2\x6e\xfe\xf3\x0a\xe5\x25\xa5\x15\x79\x40\xab\x53\x5e\xd8\xe4\x03\x11\x2b\x08\xe3\x5e\x2b\xb3\xdd\x91\xa9\xae\x8f\x77\x2d\x2a\xff\x37\xd8\xc4\x0d\x2b\x5c\xc8\x87\xa6\xf1\x50\x50\xa0\xf5\xbc\xf0\x36\x0c\x3a\x9d\x12\xd5\x91\x86\x55\xed\xc3\xc1\x3c\x86\xba\x6f\x4a\x2f\xa3\xbf\xcd\x40\x5e\xd3\x8f\x87\x1c\xf7\xdf\xf0\xf7\x5d\xaf\x2c\x32\x10\x84\xee\x9f\xa8\x12\x11\xad\xb1\x05\xb2\x5c\x22\x88\xf0\xf2\xf7\xf9\x3e\xf6\x56\xb2\xde\x19\x01\x22\xe7\xa4\xbf\xd4\xa1\xbd\x98\x93\xa8\x48\x5b\x50\x9f\xf0\xbc\x46\xcc\x96\x10\x51\xc1\xdb\x5a\x12\x49\x0c\x7e\x74\x19\x22\xcc\xc0\xa6\x65\x49\x64\x70\x27\x6f\x69\xc7\xb7\x70\x98\xc1\xe6\x70\xaf\x6b\x9f\x85\x12\x52\x99\x68\x75\xeb\x80\x35\xa8\x17\xfa\x9b\xe0\x7f\x2b\xe0\xbb\xb1\x20\x25\xe0\x56\x54\x14\xc8\x17\xe9\x42\x1a\xc7\x00\x37\x38\x93\x86\x2f\x24\xcb\x16\x5f\x9a\x27\x1a\x64\xfd\x23\x05\xc6\x67\x2c\x46\x76\x7f\x8f\x07\x5b\xe5\xd2\xd4\x07\x9b\xfa\xdc\x39\x56\x28\x8b\x02\x15\x60\x53\x11\xb5\xbf\x32\xf0\x03\x7b\x7c\x5a\xd5\x02\x01\x3e\x82\xae\x34\x19\xd9\xd8\xf3\x9c\x54\x5b\x58\x88\xf4\x71\x06\xc9\x4d\x5f\xd6\x08\x4d\x26\x03\x4a\x99\xf5\xdc\xbf\x26\xa8\x4e\xb4\xee\x14\x9c\x62\xa0\x41\x0d\x8c\x70\x7b\x1a\x9b\x07\x1f\x74\xed\x23\x93\x25\x85\x07\x2c\xe6\xcb\xd3\x3d\x4d\x54\xee\x91\x79\x16\xf5\xdf\xc6\x4d\x26\xa4\x98\x01\x84\x38\xb4\x55\x73\x93\x45\xdd\x60\xae\x0f\x47\x50\x62\x59\x15\xcc\x82\x9a\xb6\x82\x2d\x6f\x05\xf6\xd2\xbd\xa0\xa7\xbf\x56\x01\xe9\xa2\xed\x6d\xe9\x60\x37\x1d\x17\xe6\xf4\x37\x09\xc9\x67\x8c\xa7\x43\xad\xfb\xdb\x45"}, -{{0xcc,0xae,0x07,0xd2,0xa0,0x21,0xfe,0x3e,0x6e,0xe2,0x38,0x36,0xa7,0x11,0xb9,0x7b,0x04,0xe0,0xa4,0x41,0xf1,0x69,0x60,0x75,0x72,0x73,0x1c,0xb0,0x8c,0x26,0x94,0x88,},{0xa3,0x22,0x65,0xe5,0x32,0x8a,0x4f,0x49,0xcf,0x06,0xb4,0x67,0xa9,0x8b,0x9f,0x9d,0x5b,0x99,0x7b,0x85,0xdf,0xb7,0x52,0x3c,0xa6,0xa0,0xa1,0xd6,0x27,0xd3,0x28,0x91,},{0x0e,0xec,0x75,0x41,0x05,0x44,0x7f,0x97,0xd4,0xa9,0xcd,0x24,0x6c,0x7e,0xed,0xe3,0xfd,0x06,0x90,0x18,0xf0,0xd0,0x1a,0x41,0xdf,0xab,0xca,0x3e,0x90,0xa7,0x41,0x83,0x5e,0xa4,0xa9,0xd6,0x82,0x34,0x22,0x67,0xb2,0x50,0xfc,0x1c,0x8c,0x54,0x7c,0x89,0x63,0x2d,0x9f,0x68,0x9a,0xf5,0x36,0xc7,0x92,0x90,0x04,0xde,0xd0,0xd9,0x6f,0x09,},"\xa4\xbf\x82\x97\xd0\xdc\x5e\x4c\x92\xbd\x00\xad\x5b\x9c\x09\xb1\x23\x8b\x50\x3d\x61\x91\x16\xef\x74\x26\x03\x78\x34\x9a\x92\x82\xb4\x1f\x3f\x46\x76\xa6\x21\x5e\x3c\xe6\xd0\x22\x38\x48\x0a\x96\x04\x3b\x29\x42\xb3\xfe\xed\x12\x62\x0b\x1f\xa9\x7f\x77\x03\xb3\xeb\x68\x3c\x16\x01\xbd\x2f\x51\x82\x5c\x45\x0d\xf4\xfd\x1f\x33\xb0\xbf\x9c\x23\xc0\x32\x23\x78\x9e\x06\xe2\x4c\xf1\x36\xd3\xb5\x57\x40\x3a\x66\x98\x1f\x4b\x77\x7d\xcf\xe8\x90\xd2\xba\x96\xda\x4a\x47\x42\xae\xed\xdd\x6a\x61\x1d\x05\xfc\x21\x56\x94\xa5\xd8\x9a\x5d\xe6\x76\x0b\x1d\x94\x15\x15\x50\x44\xc0\x49\xcb\x02\x29\x1a\x15\x14\xfa\xa2\xe7\x7d\x2a\xe3\x3d\x44\x58\x5b\xda\xc6\x36\x5b\xf4\x81\xd9\xc9\x78\x33\x93\x7e\xab\x63\x6e\xd6\x57\x42\xa0\xd5\x97\x3b\x24\xd5\x40\x89\xb2\xda\xf0\x84\xd5\x41\x47\x65\x10\x5e\x4e\xca\x14\xaa\xad\xd1\x05\x33\x38\xa8\x47\x05\x05\x23\x2e\x4a\xc6\x33\x34\x5c\x5c\xde\xe1\xe4\x65\x3d\x1d\x93\x58\x3a\xf1\x18\x54\xb1\xd9\xb6\x5f\xc2\x02\x81\x83\x8c\x56\xdf\x11\x48\xf3\x5c\xcf\x9b\xfe\x2f\x3f\x80\xab\x73\xf5\xb7\x91\xcb\xed\x2d\x92\x06\x44\xcf\x03\x16\xf0\xcb\x5d\x36\x62\xb9\x12\x06\x47\xda\x56\xaf\xbe\xb4\x7a\x95\x29\x53\xbc\x1a\x37\xde\x85\x7e\x4b\x39\xfd\x92\xb6\x32\xb8\x51\x59\xf4\x6c\xd0\x5b\x6a\xbc\x23\x38\xd4\x63\x2d\x48\xe9\xa1\x78\x86\x0d\xe8\xf6\x5d\x9b\xc2\x3f\x24\x50\x7b\x7c\x56\x29\xe0\xbd\xaa\xc0\x67\xc4\x76\xc9\xc3\x94\x1d\x86\xf7\x88\x94\x4d\x74\x48\x52\xa6\x1d\xa7\x16\xf9\x5f\x3b\x04\xf0\x78\x3a\x56\x29\x41\xbc\xdd\xa4\x39\x59\x0f\xd1\x86\xb2\xa8\xeb\xf1\x9a\x5a\x7e\x4f\x4a\x3a\xaa\xb7\xa8\x7a\x43\x45\x24\xfb\xc9\x79\x9c\x99\x31\xeb\x8c\xe4\xe3\x4e\x99\xb6\x08\xca\xc9\x4a\xb7\xe7\x44\x95\x66\x8d\xf1\x36\x18\x5f\x48\x7d\x9f\xbc\xb6\x60\x5a\xd7\x25\x34\x54\x03\xec\x57\xf3\xf6\xdb\x36\x4a\x87\xf3\x8f\xea\x4b\x4c\x27\x15\x52\xe9\xf2\xe4\xa1\xbe"}, -{{0xdb,0x5d,0x5f,0x41,0xfd,0xdd,0x67,0x68,0x70,0x97,0x47,0xab,0x82,0x39,0xbb,0x4f,0x42,0xa3,0x1d,0x34,0xb4,0xfa,0x88,0x82,0x4d,0x94,0xbf,0x78,0xd3,0x14,0x92,0x64,},{0x03,0x85,0x8c,0xe6,0xb2,0xd2,0x40,0x79,0xee,0xad,0x66,0xca,0x0d,0xfe,0x77,0x2e,0xcd,0xa9,0xaf,0x4d,0x46,0xbc,0x9b,0x5e,0xdf,0xdc,0x28,0x6b,0x95,0xfe,0x97,0x16,},{0x5b,0x3d,0x0d,0xa7,0x10,0x23,0x55,0x48,0x6b,0xe4,0xd6,0x9c,0xfd,0x65,0x88,0x6c,0x9d,0x9c,0x87,0x38,0xb2,0x93,0xca,0xfb,0x23,0xb2,0x10,0x4b,0xfd,0xac,0x8d,0x7d,0x01,0x29,0x8e,0xeb,0x18,0xfd,0xe3,0xde,0xd6,0x49,0x1d,0x41,0xb4,0x19,0xcc,0x66,0x37,0x52,0xc4,0xe6,0x7d,0xbe,0x89,0x86,0x83,0x3d,0x20,0xe4,0xef,0x34,0x18,0x0b,},"\x67\xee\x03\xde\x45\xc3\xe7\x03\x0d\xb5\x24\x6e\xe5\xb5\x1b\xf2\x98\xbb\xa3\xe4\xd0\x93\x49\x37\xfc\x12\xd9\xa6\x29\x60\x4c\x53\xc0\x70\xe3\x0d\x61\x19\x99\xa9\xcd\xda\xf2\xd9\xac\xda\x6a\x9f\x67\x20\x2b\x35\x23\x69\xd4\x82\x60\xee\xbc\xe0\xe7\x8e\x4d\x5a\xe5\x4f\x67\x75\x21\xf8\x4a\x7b\xe0\x01\x7f\xab\x27\x8b\x2b\x57\x27\x5e\xfc\x5f\xa5\x7c\x61\x71\x86\xfc\x1b\xa4\x9e\xdf\xbd\x33\x08\x63\x48\x78\xd8\x64\xf2\xda\x15\x83\xca\x8d\x56\xce\x9f\xae\x77\xc4\x62\x03\x9a\xbc\x32\xd0\x53\x9c\x0a\x60\xb7\xbb\xba\x50\x29\xe9\x32\x9d\x27\x56\x83\xd9\xc4\xce\x77\xd0\xb9\x08\xad\xe9\x8b\x0e\x32\xb4\x42\x0d\x9a\xee\x2c\xc1\x0e\x4b\xe9\x22\xf9\x57\x25\x82\xdd\x89\x67\x14\x1c\x1d\x40\x2e\x21\x5f\x20\xae\xe0\xa8\x90\xe2\x36\x8e\x40\x6d\xea\x11\xbd\x11\x17\x7f\x2e\x03\x8a\xa2\xf1\xa0\xdf\xf5\x1a\x12\x8d\x95\x5d\x5e\x5f\x8d\x5d\x00\x09\xaa\xa8\x24\x40\xa9\x68\x64\xd6\xc6\x97\xf9\x10\xd1\xdf\x23\x0f\x46\x7f\x0e\x02\xa2\xe0\x2b\xf9\xe4\x5d\xa9\x5f\x25\x54\x10\xcc\x5a\xab\x8d\x85\xf4\x49\xa5\xde\x99\xaa\xbd\x44\xfd\x76\x3e\xc1\x46\x29\xf3\xdb\xab\x1a\x24\x7b\xff\xb7\x17\x46\x48\xe4\x3b\x9f\xb1\xeb\x0d\xf5\xe4\x10\x9b\x7a\x88\xe0\x55\x12\xb2\x08\x65\xba\xd3\x9f\x9e\xa7\x9d\x52\xf5\x18\x8e\x7c\xa5\x19\x44\x05\xbf\xb1\xa0\x97\x27\x61\x7f\x3f\x6c\x88\x19\x20\x08\xed\xbc\x0c\x65\x85\xdb\xf2\x61\xf1\x49\xdf\xfb\x59\x3d\x42\x71\x6e\x5a\x57\x77\xf5\x46\x2b\xee\xb1\xe9\xa5\x6a\x2c\x76\xe6\xcb\x73\x51\x17\xcc\x11\x83\xa3\x8d\x1e\x00\xb3\x03\xd1\x74\xaa\x9c\xf5\xc7\x31\xb2\xc7\x0e\xdd\x79\xcc\x5d\xc9\x6f\x40\x18\xf1\xd7\x1d\x71\x98\xbb\xb7\xd1\x34\xcd\x2f\xf8\xc1\x5f\x9a\x04\x28\x0d\xb2\x6a\x8f\xa9\x99\x7e\xb8\x6b\x13\x3c\x02\x2e\xda\x15\xd8\xad\x5e\x77\xcc\x9f\x62\x61\x59\x60\xba\xc2\xf9\xbb\xc3\xeb\xbd\x19\x8f\x72\xc5\x72\xb9\x71\x56\xfa\x7f\xa2\x29\xa9\x80\x14\xe1\x70"}, -{{0x7f,0x04,0x8d,0xfc,0xc2,0x65,0x0c,0xda,0x59,0x49,0x1d,0x4c,0xe2,0xb2,0x53,0x3a,0xec,0xc8,0x9c,0xc4,0xb3,0x36,0x88,0x51,0x94,0xb7,0xad,0x91,0x7d,0xb5,0xcd,0x14,},{0x08,0x00,0x1b,0x5d,0x40,0x95,0x8b,0xcb,0x27,0x0b,0xee,0xa9,0xba,0xba,0x33,0x87,0xe3,0xa4,0xb9,0x00,0xfc,0x42,0x27,0x56,0x57,0xc6,0xc6,0x91,0xa2,0xe2,0x64,0xf2,},{0x58,0x33,0x70,0x97,0x1d,0x24,0x65,0x2a,0xd2,0x13,0xc4,0x26,0x15,0x91,0x19,0x38,0xfa,0x9a,0xa3,0xd9,0xb7,0x19,0x69,0x40,0xe6,0xeb,0x08,0x15,0x12,0x00,0xc7,0xb6,0x72,0x9d,0x1e,0xff,0x8f,0x4f,0x09,0x04,0x07,0x4d,0xab,0x3d,0xdd,0xa6,0xaf,0x1e,0x4e,0x56,0x2b,0x7d,0x62,0x20,0xc1,0xa5,0x62,0x68,0x3b,0xea,0xb2,0x68,0xf8,0x0e,},"\x91\x75\x19\xcd\xb3\x35\x19\x68\x0b\xca\xe0\x4f\xaa\x79\x07\x71\xce\x7d\x13\x97\xc3\x45\xf1\xb0\x3d\xd7\x62\x57\x76\xf3\xf1\x95\x80\x99\x32\x61\x8b\x1c\x64\xac\xd9\x3a\xd0\x00\xea\xd0\x96\x54\xa3\x3d\x14\xf7\x48\xb4\x6b\x67\xaa\xe0\xff\x12\xdf\x3c\xc1\x63\x28\x0f\x47\xce\xdc\x16\xa8\x57\x90\x34\xe4\x98\x84\x29\x67\x72\xec\xbd\xbb\x71\xca\x29\xc1\x66\x23\x35\x33\xc8\xde\x54\x01\x2b\x41\x2c\xa1\x3c\xc2\x58\xf7\xc5\x46\x5d\x83\x42\x2f\x52\x4e\x4c\x05\xf8\x06\x31\x34\x78\x31\x9f\xd1\x43\xcf\x50\x88\xe6\x98\x37\x69\x7d\x36\x15\xd8\x0a\x7f\xa7\xe7\x44\x3f\xca\x65\xe7\x53\xac\x1b\x11\xd8\xef\xf3\x47\x66\x36\xae\x02\xd7\xa2\x0f\x4b\x23\x88\xda\xd6\x84\x00\x2f\x5c\xe9\x57\xca\xdd\xd2\x05\x3d\x0e\xd5\x33\x13\x2a\x81\xca\x19\xbb\x08\x0b\xd4\x3b\xe9\x32\x02\x8c\xb5\xf6\xb9\x64\xf0\x08\xb5\xb1\xc1\xc5\x99\x3b\xc9\xb5\x48\x5b\x22\xbb\xef\x70\x1f\x0a\x26\xa3\xe6\x75\xea\x31\x12\x2b\xba\xe9\x1d\x86\x4b\x54\xd8\x95\xaf\xdc\x79\xca\x58\xd4\xfe\x44\x92\x13\x35\x3b\x14\x9f\x31\x43\xb5\x14\x4d\x74\x7c\x5b\x46\x97\x47\x9a\xe6\x85\x28\x48\x53\x84\x04\x4a\xa2\xc9\x9b\xa4\xb1\x7b\x18\x4e\x94\x98\x22\x69\xbd\xe2\xde\x0b\x17\x70\x5d\x0b\xfc\x46\xd6\x90\x6a\x90\xed\xef\xe8\x91\x95\xde\x6b\xb8\xf3\xfb\x6a\x37\x41\x86\xc7\xcd\x08\x6d\x13\xd1\xb3\x52\x5a\x39\x94\xdc\x80\x20\xe1\xa0\x05\x54\xac\x8a\x82\xd6\x04\x7c\x5b\xff\x5e\x7f\x12\x45\x0f\x48\x65\xda\x16\x1e\x1a\x02\x1f\xd9\xbe\x8b\xd3\x3a\x32\xbb\x54\xa4\xdd\xf8\x74\x51\x2e\x74\xb5\xcf\xd3\xfc\x3c\xd9\xac\x11\xed\xd8\x78\x43\x36\x68\xe3\xfc\xc7\x82\xb9\x7b\x6d\x90\x5a\xdb\x0e\xbe\xc4\x2c\x92\x54\xac\x90\xf3\x58\x22\xc0\x0f\x97\xff\x3f\x0c\x7c\x39\xed\x3c\x7c\xb3\x92\x0f\x56\x08\xbb\x45\x83\x8b\xb2\x42\xa5\x2a\x86\x37\xd7\xce\xcd\xcf\x48\x9f\xa1\x83\xb4\x54\x51\xc6\xc9\xfc\xbb\xbf\x91\x4f\x5f\x7e\x6b\x22\x3b\xcb\x46\x75"}, -{{0x9f,0xeb,0x3d,0xf8,0x8c,0x49,0x4a,0x99,0x84,0x9c,0x6f,0xca,0x19,0x42,0x01,0x47,0x7a,0x2f,0xa7,0x56,0x4e,0x29,0xfb,0x06,0xcb,0x44,0xc1,0x15,0x4e,0x8c,0xea,0x3a,},{0xc3,0x56,0x28,0xca,0x6e,0xe2,0x8e,0xc1,0xc2,0x39,0xdd,0xc5,0xbb,0xa2,0xa9,0xe0,0x9e,0x48,0x46,0x81,0x6b,0x14,0x3c,0x74,0xdf,0xa2,0xae,0xc1,0xf6,0x25,0x51,0xb6,},{0xa1,0xc2,0x60,0x78,0x35,0xbe,0xc1,0xa1,0xd8,0x78,0x72,0xfd,0x8e,0xe4,0x88,0xd0,0xae,0x9e,0xd2,0x3d,0x49,0xfd,0x67,0x86,0xfc,0x49,0x96,0x72,0x5e,0x49,0xb3,0x26,0x21,0x18,0xba,0xbb,0x48,0x34,0x87,0x7c,0x7f,0x78,0xfb,0xea,0xc0,0x2d,0xf4,0x0a,0xb0,0x91,0xb8,0xb4,0x20,0xdc,0x99,0x51,0x38,0x1e,0x3b,0xcd,0xa0,0x67,0x05,0x02,},"\x95\xfb\x75\x81\xbd\x25\xff\xd4\x42\xc3\xae\x38\xa1\x9b\xea\x73\x49\xc7\xb7\x68\x3b\xa6\x76\x7e\x14\x8f\x0a\xfc\x15\x37\x3f\x67\xc1\x6d\x47\x17\x81\x20\x2e\x6d\xa8\x05\x4e\xd7\xfb\x9e\xe2\x04\xcc\x0f\x63\xc2\x10\xa6\x70\xa5\xf9\xce\xd4\x29\x45\x88\x19\x63\x30\xd3\x1b\x8e\x83\x92\xbe\xf6\xb4\x8f\xe3\xc9\x20\x78\xfa\xe1\x12\x84\xb4\xc3\xba\x20\xd9\x37\xe2\x71\x9d\xe7\xbf\x67\xc0\x06\x69\xad\x23\xe6\x13\x84\xeb\xdf\x8c\x6e\x60\x73\x54\x28\xc0\x84\xfe\x21\x7f\xdb\x47\x09\xcc\xb6\x08\x3f\xc0\xae\x4a\x05\x27\x3e\xef\x73\x90\x23\xd3\x4b\xb7\x3f\x66\x2d\xac\xdf\x11\x0b\x6d\xbd\x3e\x74\xfc\x14\x91\xe8\xc9\x65\x96\x07\x5f\xae\x5c\x36\xaa\xbe\x2a\x0a\x53\x05\x2b\xf7\x7c\x44\x62\x43\x80\x63\xaa\x7b\xc0\xc5\x0a\xb9\x20\xc9\xeb\x28\x86\x71\x56\x0c\xa5\xba\x7a\xf4\x4a\x53\xdb\x2e\x2f\xf4\x3c\xa5\x60\x69\xea\x55\x17\xcb\x21\x4e\x76\xfa\xa5\x3d\xbd\xa1\x00\x00\x3c\x4f\x61\x75\x41\x40\x41\xbe\x74\xde\x22\xce\x15\x5d\x22\x81\xb6\xf4\x03\x5b\xe3\x98\x41\xaf\xdb\x96\xdd\x89\xaa\x80\x8e\x68\x65\xba\xe6\x2d\x6b\xed\xd9\x19\xd3\xe8\x65\x10\xb9\xfa\x5f\xed\xd1\x97\x7c\x41\x31\xb2\xb8\x6e\x0f\x48\xd7\x21\x5e\xb1\x3d\x54\x98\xca\x5d\x23\x68\xf8\x18\x95\xed\x85\x5a\x52\x71\x24\x65\x7e\xc9\x53\x9e\xfe\x3b\x24\x99\xa3\xb0\xb3\x38\x26\x2f\x26\x34\x0e\x22\x55\x4c\x79\xf4\xfa\xd2\xb4\xe4\x19\xc7\x0b\xc1\xa2\x10\x7d\x20\x64\x56\xb6\x36\x87\x81\xbe\x4b\x5e\x2c\x54\xda\x42\xd3\x36\x04\x0f\xb7\xba\x49\xc3\x2d\x75\x23\x21\xad\xcd\x92\x98\x6e\x78\xbe\xdb\x22\x6c\xea\xc5\x02\x92\x08\x9b\xb5\x79\x02\x7f\x70\x22\x17\x74\x5a\xfe\x06\xa5\xbe\x13\x6b\x39\x98\xa3\x60\x4c\x9f\xf2\xac\xd6\xfa\x3f\x3f\x71\x63\x3d\x31\x02\xfb\xf0\x30\x47\xc5\x48\x6f\x84\xc4\xdc\x24\x47\xd8\x63\x79\x63\x83\xd5\x5f\x08\xc9\x81\xfd\x4d\xd7\xdc\x1c\xb7\x2b\x8b\xa4\x43\x5a\xf6\xab\xdd\x74\xe6\xf6\xe6\x79\x8f\x1a\xe2"}, -{{0xbf,0xf6,0x89,0x55,0xdd,0x6a,0xe0,0xe8,0xba,0x85,0xab,0x0d,0x0c,0xda,0xf0,0x4a,0x9f,0x5b,0xef,0xd5,0xef,0x60,0x14,0xf4,0x99,0x94,0xa7,0x83,0x63,0xdc,0x17,0xf7,},{0x0a,0xd9,0x49,0x3a,0xf8,0x0b,0x15,0xf0,0x7a,0x52,0x1c,0xcd,0x67,0x4f,0xe9,0xe5,0x21,0x2a,0x4a,0x28,0xc1,0x7c,0x74,0xf6,0x60,0x5f,0xfe,0xf7,0x8a,0x4a,0xed,0x72,},{0x93,0x19,0xee,0xf7,0x40,0x63,0x3a,0xda,0x1a,0xf0,0xe1,0x37,0x64,0x4c,0x61,0xfb,0x3e,0x11,0xba,0x4b,0x01,0xd3,0xc6,0xf2,0x53,0x92,0xdc,0x93,0x67,0x87,0x2a,0x23,0xbe,0x56,0x31,0x0d,0x31,0x2e,0xfc,0xb9,0x1b,0xdb,0xab,0x78,0xa7,0x5e,0x57,0x6e,0xbe,0x90,0x81,0x97,0x24,0x15,0xf5,0x62,0xdb,0x41,0xba,0xf5,0xe2,0x33,0x8b,0x07,},"\xd8\xf5\x65\x0a\xa3\x58\x1c\x4d\x39\xbd\x1b\x8a\xfc\x96\xc1\xad\x7c\x4b\xf7\x23\x42\x6f\x9d\x7f\xab\xd1\xa5\xc8\xac\x1d\x2f\xe5\x4a\x97\x1f\xac\x76\x5e\x05\xaf\x6e\x40\x7d\x72\x69\xba\xb6\x61\xb3\x43\x22\x92\xa4\x84\xf9\x52\xc1\x10\x95\xbb\xd2\x0a\x15\xd7\x7c\x41\xf8\xf3\x73\x1a\x50\x4d\x51\x8e\xe1\x0c\xd0\x06\xc9\x6e\xe5\x73\x72\xde\x5b\xea\x34\x8e\xc8\xba\x15\x91\x62\x17\x0c\x63\xe9\x70\xf1\xc7\xa3\x46\x5a\x3d\x59\x2e\x1d\x56\xc6\x54\x0f\xbd\xb6\x02\x28\xe3\x40\x90\x96\x46\x32\x0c\x95\xf2\x56\x98\xcd\x48\x96\xbd\xff\x58\xe2\x56\x1e\x3b\x3d\x9a\x73\xb8\x97\x47\x91\x2a\x1c\xf4\x67\xd6\x3e\x41\x45\x5f\xda\x77\x47\x7f\x46\xfe\x69\x37\xbb\x0e\x79\xd9\x2c\xcd\x52\xe8\x2d\xba\x90\x8a\x05\xa5\x7c\x7e\xcf\x49\x55\x4a\xb4\x4c\x0b\x71\x8e\x3b\xdd\x5f\xc0\xbf\x70\x70\xd9\xc5\x8f\x86\x05\x91\xc1\x8b\xca\x8b\x3a\x9a\x14\x8a\x06\x54\x8e\x0f\x01\x60\x2b\x1e\x6f\x68\x60\x37\xc9\x4f\xf7\x32\xe1\x55\xd5\x2d\x5b\x0b\x44\x70\x3b\x3d\x11\x16\x3e\x3f\x56\xe3\xb9\xc1\xb8\x64\x76\xe4\xdc\xbf\xc5\x3f\xa0\x59\x84\xe8\xc7\x5d\xd2\x18\x43\xcf\x96\xf9\xe4\x94\xab\xba\xe7\x18\x4a\xa4\x27\x36\x63\x3e\x38\x11\xae\xff\x40\x2b\x2f\xcb\x7d\x7f\x70\x2e\x44\x72\x41\xe2\x2a\x58\x84\x2f\xd6\xd0\xc0\x3d\x33\xff\x5b\x8c\x79\x22\x00\xe1\x73\xda\xa7\xb2\x17\xe4\xb2\xf4\x43\x3e\x6c\x02\x0a\xcc\xe5\x01\xb9\x32\x3a\xa0\x24\x11\x44\x43\x4b\x08\xe9\xd2\x46\x91\x39\xff\x67\x34\x22\x08\x90\x05\x46\x20\x0f\xd9\x71\xa6\x5d\xbd\x6d\xb6\xc2\x1e\x3e\xf9\x17\x2a\xbb\xa1\xea\x9e\xa2\xa2\x49\xad\xdf\x1a\x1e\xaa\x3c\xe1\x19\x38\xb1\x3e\x30\x91\x3c\xd0\xda\xd4\x91\xfc\xbb\x32\x85\xea\x37\x8b\x8e\xf9\x22\x7f\x3f\xa8\x0b\x58\x6e\xcf\xea\xe1\x37\x06\x6f\x84\x48\xac\xdf\xb7\x8d\x6d\x3e\x9e\xf4\xa6\xb3\x62\xdf\x42\x41\xad\x9a\xe2\x53\xb8\xe1\x59\x7d\x65\x6e\x00\x0c\xea\x44\x7a\x02\xfa\x49\x33\x32\x86\x09\xbb\xa0"}, -{{0x1b,0xa9,0x19,0xc0,0x66,0xbb,0x56,0xe6,0x40,0xc3,0x33,0x59,0x68,0xe1,0xd1,0xb5,0xbc,0xc0,0x93,0x38,0x3e,0x2d,0x7c,0xf8,0xb5,0xff,0xf5,0xc6,0x1e,0xc4,0x7a,0x77,},{0x80,0x4c,0x90,0xbd,0xc2,0xb3,0x61,0x8b,0x01,0xf0,0x75,0xe0,0x41,0xfa,0x97,0x1b,0x83,0xc5,0xb6,0xcf,0xa3,0xb6,0xb3,0x97,0x4f,0x3f,0xa4,0x35,0x99,0xbe,0xac,0xab,},{0x50,0x3e,0xb7,0xed,0x6d,0xe1,0xb7,0x76,0xc9,0x52,0xf2,0x55,0xbb,0xd4,0xbc,0xfb,0x0e,0x48,0xbc,0x70,0xc2,0xcc,0x2f,0x1f,0x72,0xbf,0x68,0x81,0x47,0x90,0x40,0xc4,0x75,0x24,0xec,0x54,0x2a,0xe1,0x3f,0x60,0x05,0xca,0x50,0x16,0xb5,0x8b,0x73,0x6a,0x50,0x89,0x8d,0xd0,0x56,0x9d,0x4d,0x38,0xad,0x29,0x86,0x30,0xd6,0x8a,0xdb,0x0b,},"\x87\xc5\xc7\x5d\x8a\xd0\x7d\x52\xac\xd7\x81\xd1\xbb\x95\xf7\x8c\x70\xe2\x1c\x2d\xd6\x6f\x7a\xa4\x42\x34\x15\x2f\x98\x23\x4d\x12\x83\x58\xa8\xae\xe9\x8e\xa9\x03\xa7\x7b\x44\x1d\xb1\x44\x7a\xe6\xff\x34\x32\xdd\xd4\x57\x0f\x7f\x58\x03\x61\x22\xc1\xfd\xcc\x93\xcb\x21\x57\x37\x39\xc1\x9c\xca\xa4\x11\x50\x8e\x08\xde\x26\x06\xf3\xd8\xf2\xdb\x89\xdf\x6a\x44\xa4\x61\x33\xd5\x70\x18\x46\x26\x27\xe2\x2f\x57\xef\x36\xd1\xde\x02\x4d\xe3\xd4\xae\x41\xb7\x52\xdf\x48\x21\x15\x59\x34\xb4\x47\xb2\xef\xfe\x51\x24\x87\x52\x1b\xe0\x35\x68\x32\xa7\x4c\xe0\xe2\xd8\x30\x1b\x79\xf9\x31\x75\xe8\xb6\xb9\x61\xb1\xdf\x63\x7d\x8a\xca\xdc\x88\x45\x43\xc6\x86\x4f\x80\x25\xec\xec\xec\x7c\x6e\x4f\xe0\xfe\xcf\xc4\x0d\xcd\x95\xe8\xd6\xab\x93\xce\x25\x59\x53\x84\x43\x6b\x59\x8b\x73\xc7\x4b\x03\xd4\x9e\xd5\x00\x2c\x0f\x85\x8c\xfd\x9d\x0d\xf6\x1e\xde\x93\x7c\xc4\x16\x59\xd6\x70\x8b\x96\xfc\x5a\xaa\xde\xe1\x09\xe2\xa6\x88\x46\xba\xf2\xc2\x46\xdf\xcf\x3d\x27\xc2\x8b\xd1\x37\x1e\x35\xfc\x94\x12\x63\x14\x42\xee\x75\xf3\x8c\x6e\x49\x58\x07\x0a\x74\xf6\xe6\xa2\x20\xf7\x5c\x72\x80\xea\xb4\x73\x7d\x97\xe3\x78\x82\xf3\x62\x48\x11\x67\x5f\x16\xca\xf6\x0c\xb9\x44\xbc\xe9\x2e\x75\x88\x4c\x56\x48\x3c\x61\xf2\x6b\x63\x71\xb1\xb5\x12\x37\x62\x1a\x06\x54\x3e\xb4\xab\xea\x7b\xec\xc4\xfc\x31\xdb\xb5\x47\x5b\x3d\xeb\x9b\xb3\xc8\x99\x23\x87\x10\x48\x30\xc6\x07\x2a\xfe\x1a\xf2\x44\xbf\x68\x1a\x40\x32\x9c\x9b\x37\x77\x2b\x09\xc5\xe8\x8e\x78\xf7\xdf\xfb\xc0\x45\x49\xff\xa1\x3b\x41\x44\xdd\xfa\x53\x8f\xc4\xb3\x30\x05\x40\xad\x83\x02\x15\xe2\x5f\x11\x44\x6d\x28\x9f\x33\x12\x2c\x2c\x88\x0d\xe3\xda\x71\xc4\x53\xd7\xe8\x8f\x7c\xa4\xea\x3d\x12\x55\xe8\x2f\x4b\xc9\xe5\x53\x3d\xc4\x01\xc3\x30\x40\xe1\x69\x40\xb2\xcf\x9c\xf2\x1f\xea\xca\x1c\x2c\x6c\x33\x33\x7c\xf7\x5e\x18\x84\xb4\x83\xbf\x80\x15\x36\xd3\x04\x08\x91\x15\xa0"}, -{{0x9b,0x36,0x24,0x7c,0x17,0x71,0x0e,0x95,0x26,0x1a,0x7d,0x70,0x2f,0x57,0xfe,0x81,0xf2,0x97,0x11,0x17,0xa5,0x0c,0x87,0x92,0x01,0x93,0xb3,0x86,0xd4,0x94,0xca,0x97,},{0x29,0xae,0x39,0xf2,0x73,0xe3,0x5f,0xb3,0xf6,0x11,0xda,0x09,0x16,0x00,0x65,0x0e,0xfb,0xc4,0xfc,0x4d,0x1e,0x7b,0x4c,0x76,0xac,0xed,0x5a,0x83,0xf8,0x26,0x34,0xf3,},{0x03,0x59,0x70,0xa6,0x72,0xe9,0x3f,0x87,0xeb,0x42,0xcc,0x39,0x6f,0x6e,0xa7,0xe1,0xb3,0xdd,0x5c,0x59,0x51,0x57,0x28,0x26,0xd1,0x07,0x5a,0x15,0xc2,0xd7,0xe4,0x54,0xdf,0x19,0x5b,0x51,0xaa,0xe8,0xdc,0x61,0xef,0x7a,0xb8,0x95,0x48,0x5f,0x64,0xe5,0x98,0x95,0x73,0xd9,0x8a,0x06,0x2e,0x67,0xae,0x73,0x56,0xfe,0x5c,0x9e,0x3b,0x0f,},"\xe8\xd9\xd5\x3b\xa2\x7e\x98\xed\xd5\x5d\xf3\xc6\xb2\x45\xea\xcd\xdc\x8a\x40\xe3\xef\xb0\x07\xbc\x91\x8e\xc5\xa8\x69\x17\x8a\x17\x0b\xb4\xa6\x35\xb7\xf8\xf7\x42\xe3\x7a\xd4\x5d\x14\xa7\x43\x44\xa6\xb5\x22\x83\x0a\x52\x21\x06\xeb\x96\x0d\xaf\x19\x2d\xc1\xe0\xfd\x70\xf1\x61\x60\xe1\x22\x51\x68\x92\xd0\xe2\xab\xd0\xd4\xae\x0f\x0d\x2e\x5a\xdc\xc9\x9a\xd5\x53\x02\xe2\x51\xb3\xe7\xa4\xd0\xcb\x33\x77\x4a\x49\x70\x49\x90\x5c\x33\xde\x1f\xbb\xc1\xad\x2b\x6c\x64\x52\x95\xfe\x41\x6b\x4d\x12\xb2\x32\xef\xe0\xa3\x3c\xd2\xad\x87\x32\xeb\xa1\xc3\xcb\x0e\xae\xb0\xb2\xa5\x7f\xa0\x3e\xc5\x67\xca\x29\x21\x0b\xf6\xff\x95\x42\xa7\x66\xf4\x96\xfe\x68\x05\x8a\xa9\x83\x80\x6c\xbe\x7a\xb1\x0a\x47\x92\x0b\xac\x82\x48\x81\x8e\x54\xa4\x15\x51\xc9\xa0\x95\x9e\x89\x94\xca\xc6\x0f\xc8\x68\xad\x48\xb5\xa2\x4d\x5f\x24\xa7\xa5\xa3\xfd\x90\xb8\x47\xe8\x17\xad\x3d\xd5\xd0\xd6\xf8\xde\x2d\x20\x4f\x64\x24\x83\xbd\x53\x58\x5a\x92\xef\x92\x54\x15\xa9\xb3\x8f\xbb\xf0\x7f\xc0\xf3\x5e\x70\x75\x69\xcf\x48\x8b\x20\x54\x53\xce\x54\x33\xeb\xa6\xfd\xe8\x78\x1a\xf7\x2b\x52\xbf\xbc\xab\x85\xea\xd3\x85\xd9\xd3\x17\x5e\x21\xad\x33\x73\xad\x53\x5c\xf0\xe3\x57\xed\x6b\x53\x83\xef\x38\x29\xa9\xd5\x09\x5b\x87\xdc\x9a\xad\xbe\x0c\xa7\xab\xad\xf3\x3e\xc3\xb6\xff\xd6\xeb\x94\xaf\xdc\xc1\x2e\x8d\x66\xa6\xfc\x05\xac\xf9\x73\x68\xdb\x0f\x69\x56\x5d\xcd\x8f\xef\x4d\x1e\x49\xd7\xdd\x4a\xc0\x53\xc2\x18\xf5\x24\x0c\x81\x2d\x4e\xbb\xa4\x40\xdc\x54\xca\xcd\xdb\x1c\x39\x32\x9e\x5b\xd0\xc3\xc8\x0d\xc3\x25\x9a\x80\xf0\x59\xf9\x46\x79\xaa\x07\x94\xca\x01\x15\xcc\x62\xaf\x25\xe1\x24\xcb\x8a\x9d\x41\x60\xea\xce\x6d\x22\xc7\xb1\xc4\x45\x44\xf8\x11\x42\xa1\x9e\xbb\x02\xa9\xbd\xa6\x42\x9c\x50\xe7\x83\xdb\x4a\x07\xf0\x21\x9e\x85\x7c\x8d\x3c\x56\x55\xa5\x82\x83\x1c\x8e\xab\xc3\xf1\x9b\x59\xad\x8d\x2c\x71\x4a\xde\xaf\x40\x39\xd5\xcf\x70"}, -{{0x6f,0xed,0xe7,0x39,0x6c,0x46,0x20,0x33,0x18,0x9a,0xcd,0x23,0xd2,0xf9,0xd0,0x2b,0x68,0x89,0x8d,0x35,0xf3,0xa0,0x1a,0x79,0x8f,0xc2,0x4d,0x48,0x8d,0xe9,0x3a,0x78,},{0xb3,0x40,0x62,0x06,0x0b,0x2c,0x20,0x07,0x6a,0x98,0xfe,0xa9,0x39,0xb3,0xb3,0xa5,0x04,0x51,0xa5,0xf4,0x9f,0x83,0x51,0xc0,0xad,0x75,0x91,0xdb,0xbe,0xbb,0x13,0x0f,},{0x88,0xa8,0x3e,0x20,0x12,0xd2,0x09,0xca,0x03,0xb8,0xeb,0xf6,0xde,0x5b,0xb7,0xef,0x4c,0xcb,0x5e,0x3d,0xf5,0xca,0xc7,0x89,0x54,0xaa,0x69,0x49,0x30,0xe4,0xde,0x82,0x54,0x4e,0xf5,0x08,0x3c,0x48,0x92,0xdb,0x9f,0x05,0xd7,0x7b,0xf6,0x3f,0x4f,0xdf,0xce,0x15,0xa4,0xd1,0xc3,0xf8,0x5b,0xae,0x80,0x77,0x06,0x2b,0xec,0x0e,0x7b,0x07,},"\x5a\xbc\xc1\x4b\x9d\x85\x78\xde\x08\x32\x1d\xe0\xd4\x15\xe3\xd4\x0e\x9d\xe3\x1e\x18\x88\x13\x74\x75\xce\x62\xbc\x6f\xbe\xe8\xfd\xd0\x3b\x9d\x47\xc7\xb8\x8b\xbc\xeb\x80\x44\x44\x49\x0b\xf6\xa3\xcc\xb7\xa2\x73\x26\x1e\x24\x00\x4e\xa6\x7c\xef\xa3\xd5\xd1\x73\x57\x6d\x01\xe3\x8f\x76\xc1\xe0\xe5\x15\x08\x3c\x97\xe7\x99\x14\xac\xf2\xbe\x41\x60\xef\x93\x60\xbb\xe9\x86\xb3\x6e\x9f\xf9\x33\x46\xb0\xe7\x06\x91\xd9\x34\xe4\x7f\x8a\x50\x3f\xa9\x33\xab\x2a\x50\x42\x69\x47\xcd\xa8\xe8\x10\xc9\xeb\xe3\xb3\x69\x82\xf0\x9a\xee\x60\x92\x73\x9f\xa2\x35\x8b\x61\x3c\x7f\x12\x9d\xb0\xdc\xbe\x36\x8b\xee\x52\xf2\xf7\xf1\xdf\xe3\xd2\x43\x46\x05\xb5\xaf\xcf\x25\x60\x71\x71\x7d\x92\x4f\xd0\x80\x3b\xbd\x0d\xd1\xf9\x55\x5c\xe8\x34\xda\xc7\x81\xdf\x4c\xc7\xaa\x19\xe7\xf1\x1d\xa9\xfb\x99\xcb\x9e\x6b\x9e\x1e\x6f\xb4\xf7\xe8\xdc\xb2\x23\x6c\x28\xae\xb6\xcb\xc5\x5a\x13\x0e\x03\xc1\xb1\x7a\x99\x1c\xca\x1b\x79\x4e\x6c\x13\x73\x2d\x5b\x0a\x66\xf6\xeb\xa8\x60\xec\xb9\x85\x55\xaa\x4c\x21\x8d\x11\x2b\x11\x6b\xce\x23\x82\x95\xde\x14\x27\x41\xf6\x87\xbe\x0b\x24\x87\xf5\x8f\xfc\x5c\x12\xa0\xa5\x19\xf1\xe2\x37\x93\x24\x2e\xf8\x57\xed\x39\x8a\x20\x69\x9d\x43\x51\x45\x3f\xc2\xf0\x92\x76\x2a\xbd\xe3\x4f\x4d\xa2\xdb\xe0\xce\x2a\xab\xaf\x6b\xc4\xc0\x15\x9f\x3f\xe1\xae\xa1\x6a\x03\x6f\x7e\xae\xcd\x62\x95\x38\xf3\xe0\xee\xd8\x3c\x9a\x4d\xc1\xab\xc2\x38\xf9\x0d\xaa\xf4\x89\xfd\x61\xb3\x4d\x93\x7b\x6f\x46\x07\xa7\x88\xba\xa8\x20\x61\x94\x3d\xba\xb2\x6c\x1d\x38\x4d\x8d\x49\xf9\x93\x48\x80\x0b\xf3\x61\xf8\x71\xf5\xd6\xcd\xa1\x8f\x68\x99\x18\xce\xc3\x1a\xd1\x58\xf1\x86\x3d\x13\xff\xac\x54\x05\xc1\x62\xc3\x2d\xe0\x6e\x32\x99\x4c\xc4\x10\x6f\x95\xbb\x4f\xff\xdb\xef\xe7\xd6\x29\xec\x77\x97\x39\x46\x09\xfd\xbf\xea\xdb\x46\x92\x73\x70\xa1\x1f\xb3\x84\x71\x54\x0f\x95\x1b\x93\xc6\xeb\x23\x86\x68\xdc\x00\x6c\x21\x66\x0b\xa2"}, -{{0xd5,0x59,0x58,0x01,0x34,0xab,0x05,0x0a,0xca,0x44,0x6e,0xa7,0x75,0x0e,0xf6,0xb3,0x71,0xd9,0x2d,0x76,0x45,0xec,0x76,0x35,0xfe,0x78,0x51,0x10,0x0b,0xc4,0xe5,0x1e,},{0xde,0x50,0x20,0xcd,0x21,0xa8,0xb3,0x23,0x39,0xde,0xcb,0xed,0xff,0x24,0x66,0x4d,0x95,0x80,0x32,0x63,0x27,0xae,0xdf,0x09,0xc5,0xec,0x6b,0x3f,0xe5,0x40,0x52,0x26,},{0x6f,0xcb,0x1a,0xc9,0x29,0x0a,0xb7,0x67,0xd5,0x9b,0x59,0x8c,0x9a,0x24,0xec,0xdb,0x6c,0x05,0xbb,0x02,0x3e,0xc3,0x60,0x14,0xa4,0x0d,0x90,0x8e,0xf0,0xdc,0x37,0x8a,0x45,0x28,0xb3,0x76,0x0d,0x88,0x9a,0x79,0x17,0x4e,0x21,0xca,0xe3,0x5d,0xf4,0x5d,0x42,0x7b,0xa6,0xea,0x81,0x2b,0xdd,0xca,0x16,0xe3,0x5a,0x69,0xb5,0xe7,0x9f,0x0a,},"\x68\x42\xe3\x19\x0a\x11\x0e\xee\x96\xc5\x07\xd4\xbc\xb4\xc5\x48\xc3\xa0\xed\x7b\x1a\x8e\xd7\x7d\xd9\x3b\x38\x61\x3b\x23\xc7\x3e\x83\x0b\x20\x5e\x62\x65\x19\x21\xad\x82\x96\xb0\x8d\x1e\x10\x08\xad\x78\xf2\x99\x6e\x3c\x7f\x38\x03\x2e\x46\x7c\xff\xec\xd7\x7b\x85\x25\xe2\x43\xce\xc0\x21\xf8\x52\x96\xaf\xd5\x45\xd7\xbe\x1a\x62\x56\x8b\xb0\xcf\xcd\xb9\x0d\x61\x4e\xd7\x98\xbf\xb7\xef\xc6\x55\x32\x68\x16\xa6\x10\x82\x25\x1d\xf0\x16\x13\xaa\xc8\x8e\xfc\xea\x1e\x0e\xa2\x96\x1b\x8f\x92\x1e\xbe\x15\x58\xde\xe8\x33\x74\xa0\x11\x3a\x78\xc5\x58\x57\xce\x20\x55\xbb\x2c\x48\xba\xdb\xd3\xd8\xf4\xcb\x19\x73\x4d\x00\xd0\x60\x4b\x61\x90\x73\x02\x0d\x72\xa9\x9a\x19\x23\xe6\x16\x0a\x09\x94\x65\x67\xfd\x4b\xda\x66\x44\x2e\xf5\xa7\x36\x07\x86\xd1\x78\xda\xe4\x49\x22\xf3\x50\xce\x2e\xdc\x6a\xf7\x3d\x1b\xd8\x0d\xc0\x3e\xc3\xca\x70\x05\xf4\x10\x9d\x10\xc6\xd4\xf7\xd8\xfa\x61\x73\x51\x10\xf8\xdb\xae\xdf\x91\xa0\xba\xd7\xd7\xfb\x5c\x04\xd7\x06\x37\x3c\x15\xc6\x45\x06\x3f\xf4\xb4\xfb\xd2\xd5\x59\xb0\xaf\xad\x43\x2d\x4c\x49\x6c\xd8\xab\xfe\xa2\x86\xfa\x67\x5d\xc0\x76\x72\x6e\xc5\x22\xb3\xa3\xc2\xf4\x7a\xec\xc5\x39\xf4\x8a\x79\x21\x69\xc4\xcc\x8c\xd4\x1c\xd2\xcb\x6b\x63\xdd\xbc\x19\x37\x3a\xc9\x69\x1c\x2b\xc2\xf7\x8f\x22\x60\x3d\x55\x13\x71\x5a\x16\xd4\x57\x4e\x7a\xcc\x4b\xea\x6d\xcd\x8c\xa7\xf1\x98\x65\xa4\x9d\x36\x64\xa2\x10\xdf\xad\x29\x07\x74\xb1\x0b\x71\x88\xf2\x55\xb3\xbe\x4d\xc8\xfa\x86\xf8\xda\x3f\x73\xa4\xe7\xc9\x29\x95\x1d\xf3\x0f\xe6\x6a\x17\xc8\xce\xe2\x3e\x4f\x2e\xd2\x06\x3f\x0b\x02\xab\x40\x37\x2c\xbe\x54\xb9\xa7\x08\xdf\x7c\x48\xa0\x65\x66\xd3\x9b\x19\x43\x4c\x6c\x76\x69\x87\xb3\xeb\xb0\x06\x75\xf4\x4c\x4b\x3c\x1e\x9f\x45\x04\xe7\xa9\x27\x05\x89\xc0\xd0\xf4\xcb\x73\x42\x35\xa5\x8e\xf0\x74\xcf\x9d\xec\xf3\x60\x1a\xee\xca\x9f\x1d\x8e\x35\x6c\xb2\xdb\x5f\xce\x79\xcb\xc3\x61\x43\xf3\x4b"}, -{{0x9d,0x4c,0xe9,0x75,0x54,0x78,0x76,0x63,0x6f,0xea,0x25,0x43,0x7c,0x28,0x80,0xc9,0xaa,0x8e,0xe6,0xb2,0x70,0xd1,0xb2,0xda,0x19,0x7c,0x8d,0x7f,0x95,0xe7,0xdc,0xcc,},{0xbd,0xe4,0x99,0x3c,0x03,0x04,0x77,0xc3,0x58,0x90,0xaa,0xe8,0x2b,0xb5,0x08,0x7e,0x91,0x4e,0x64,0xb9,0x4f,0xfc,0x64,0xe2,0xd7,0xa5,0xa7,0xc9,0x19,0xe2,0xd9,0x02,},{0xbe,0x17,0x44,0x4c,0xd4,0x65,0xa8,0x7a,0x97,0x1d,0xf8,0x4e,0xb1,0x02,0xf9,0xc7,0xa6,0x26,0xa7,0xc4,0xff,0x7a,0xea,0x51,0xd3,0x2c,0x81,0x35,0x3d,0x5d,0xbc,0x07,0x39,0x3c,0xa0,0x3d,0xb8,0x97,0xd1,0xff,0x09,0x94,0x5c,0x4d,0x91,0xd9,0x8c,0x9d,0x91,0xac,0xbd,0xc7,0xcc,0x7f,0x34,0x14,0x4d,0x4d,0x69,0xeb,0x04,0xd8,0x1f,0x0c,},"\xea\x0f\xa3\x2a\x4a\x28\x88\x11\x30\x1b\x9e\xe5\x33\xfa\x35\x1f\xdf\xbf\x6b\xc1\xd0\x55\x5a\x74\x02\x76\x7a\x3a\x91\x98\x55\x8f\x74\xbb\xa7\x03\x18\x57\x99\x5b\x9f\x32\x62\x26\xf1\xdd\x5d\xf1\x07\xb0\x63\x42\x20\x3e\xb8\xd4\x0c\x5f\x1d\xc9\x5b\x4f\x3f\x88\x97\x5a\xa2\x4a\xf8\x76\x9e\x26\x70\xc4\x66\x71\xbe\xbb\x7a\x0f\x1b\x75\x68\x72\x9a\xee\x47\x7e\x89\x88\xaf\x9c\x74\x9f\x32\x02\x70\x81\x71\xfd\x94\xb3\x37\xae\x67\xed\x21\xa6\xc4\x41\x74\x01\x4b\x0b\x0e\xb5\xba\x71\xc2\x77\x97\x8d\x48\x8c\x24\xc4\xa7\x84\x13\x09\x84\x6b\x4e\x30\xa4\xfb\xbc\xfc\x45\x07\x8d\x7e\x14\x01\x41\x14\xb1\xac\x64\xf7\xc3\x3c\x9a\xc2\x5e\xa5\x62\x6c\x2c\x81\x9f\xba\xa2\xa4\xde\x8a\x2b\xf5\xf1\x36\x5d\x6b\x70\x40\x7e\x80\x94\xf9\x91\x97\xce\x1f\x0c\x35\xe1\x1a\x98\xfb\xe3\x72\x41\x4e\xa2\x06\x4a\x3a\x12\xd1\xcd\x5c\x8d\xf8\xfc\x0e\x79\xf5\xb7\x70\xb5\x8f\x47\x7f\x91\x97\x6c\xa0\x13\x98\x95\x12\x0e\x24\x6b\xaa\xb5\xa0\x26\xf2\xd3\x9c\x68\x7d\xc0\x78\x83\x34\xb5\xc6\x26\xd5\x2c\xde\xbe\x05\xea\xf3\x08\x64\xb4\x13\xee\xbd\xc5\x58\x1e\xf0\x0d\x43\x92\x76\xe5\x2f\x47\x9c\x9c\x05\xb1\x16\x39\x58\x26\xb6\x04\x90\xb3\xce\x70\x0c\xc0\x02\x7f\x61\xe4\x6c\xa2\xf6\xfb\xc2\xc9\xde\x2e\x80\x08\x06\x55\x0a\xfb\x06\xd4\xa0\x8e\xac\x7a\x75\x8e\x24\x58\x2a\x4d\x6d\x42\x8b\x43\x3d\x36\x5f\xc3\x1d\x44\x44\x60\x7a\xfb\x64\xf1\x5e\x37\x07\x94\x00\x5a\x3a\x22\x44\xe6\x66\xd5\xd4\xc3\x8a\xd2\x00\x9c\x76\x9a\x51\xcd\xbf\x73\x8d\x23\x59\x42\xf4\x12\xd0\x7f\xee\xb7\x3b\x36\x57\xd0\xb0\xc9\x1c\xb5\x94\x0b\xad\x6a\x70\x6e\x14\xed\xcd\xc3\x42\x25\xb1\xc1\xf3\x8b\x1a\xbe\xcb\x2a\xdc\xaf\x81\x91\x55\xa9\x4f\xe1\x90\xfd\x55\x68\x22\xd5\x59\xd9\xc4\x70\x85\x4d\x3a\x43\xbf\xb8\x68\xda\xdd\x6e\x44\x3d\x98\xee\x87\xe4\xd8\x28\x4f\x5c\xf3\xa6\xda\xfa\xf2\x95\xb9\x02\x83\x6c\x64\x05\x11\xe6\x10\xae\x7d\x0c\xb1\xb1\xd3\xd6\x07\x9f\xe6"}, -{{0x02,0x73,0x86,0x82,0x32,0xf5,0xbe,0x48,0x59,0x2c,0xfa,0x05,0x13,0x4e,0x8d,0x55,0x54,0xed,0x1f,0x9a,0x57,0xbc,0x7e,0x39,0x82,0xa3,0x30,0xc5,0x7e,0x5a,0x7f,0x3a,},{0xf1,0x72,0x20,0x87,0x82,0xdb,0x66,0xd4,0x66,0xcb,0xe4,0xf4,0x41,0x7f,0x6f,0xc4,0x77,0xb7,0x34,0x9f,0x2a,0x98,0xdb,0x56,0xc0,0x3a,0x47,0x22,0x75,0x46,0xbc,0x5a,},{0x15,0xe8,0xd8,0xdc,0x7d,0x5d,0x25,0x35,0x9d,0x6a,0x10,0xd0,0x4e,0xe4,0x19,0x18,0xa9,0xc9,0xdf,0x4c,0x87,0xbe,0x26,0x9f,0xa8,0x32,0x43,0x4d,0x53,0x01,0xdb,0x02,0x24,0x81,0xbf,0xa3,0x95,0xa3,0xe3,0x46,0x6f,0x95,0x54,0xce,0xee,0x05,0x32,0xa8,0x18,0x3a,0x0d,0x05,0x50,0xe7,0xd1,0xab,0xe9,0x9f,0xc6,0x94,0xc6,0xff,0x93,0x01,},"\xf7\xa1\xd4\x61\x4c\xc6\x4a\x3b\xc4\x8f\x00\xc6\x27\x63\x04\xf3\x4d\x4d\xfd\x15\xe0\x61\x7b\x93\xcc\xef\x12\x6c\x5c\x63\x8c\x9d\x99\x53\xaa\xbb\x7d\xf4\x2d\xf4\xe0\xaa\xa7\xea\xc9\x6a\x4b\x38\xc7\xba\x75\x8d\x86\x0c\x90\xd0\x5e\x3d\x14\xe4\x79\xe5\x45\xf3\x19\xb0\xe5\xa8\x5a\xd8\xf0\x99\x1b\x43\xd6\xe4\x9c\x24\xfa\x06\x0e\x3e\x5d\xf9\x5c\x98\xd9\x45\x1a\xb8\x33\xe1\x2a\xa9\x7f\x40\x46\x11\xbb\xa3\x59\x49\x62\x65\xa6\xdb\x11\x91\x7d\x0d\xa5\xc6\xa7\x02\xd0\xb1\x02\xde\x36\xdd\x0c\x98\xdf\x5b\x54\x80\x6c\xe6\x26\xbb\x96\x37\x44\x75\xf6\x8a\x60\x60\xeb\x35\x0a\x7d\x2a\xae\x32\x04\xb3\xdf\xdf\x9f\x1e\x31\xbe\x81\xf7\x17\x0f\x8a\x1b\x93\x85\x41\x3f\xf8\xf6\x88\x1e\x10\xc1\xe8\xda\x4c\x88\xaf\xb5\x06\x39\xab\x44\x88\x7a\xca\x2a\xbe\xec\xed\xf1\x10\xd2\x95\x8c\x13\xfd\x33\x90\xd1\xb9\x6a\x76\x2d\x16\xce\x19\x69\x20\xce\x85\xf6\xc4\x15\xbe\xd5\x45\xb1\x44\x53\x02\xa6\xf0\x01\xeb\x8d\x00\xe9\x7c\x75\x18\x87\x86\x8d\x48\x1a\x0b\x1e\x4d\xfa\x04\xb6\xf7\x61\x08\x6e\xe8\xe6\x97\xb0\x19\xe0\x17\x10\x4b\xaf\xb9\x8f\xca\x24\x2e\x33\x4c\x6f\x18\xf1\xdb\x5b\x6f\x29\x5f\x05\xc5\x59\x36\x1c\x68\x31\xda\xbc\x42\xc2\x11\x07\x03\xf9\xd1\xf6\x4e\x12\xdd\xf2\x6a\x86\x79\x85\x4e\x9f\x8e\xf8\x47\x9e\x1f\x12\xc3\x54\x47\xaa\xc0\x2e\xa7\xf2\x42\xe5\x86\x32\xcf\x2f\xd0\x63\xfe\x66\x50\x70\x44\x5b\x80\xf3\xdc\x6a\x33\x03\xbb\xa9\x6e\x05\xfa\x88\xee\xc2\x01\xc5\xc2\xd0\x0c\xa8\x1b\x8d\xa6\x96\x9d\x0a\x4d\xd0\x48\x3b\x34\x77\xd3\x25\xa7\x1f\xac\xd6\xfa\x22\x09\xb4\x8c\xb4\xf6\x52\x5d\xa7\x3c\x9c\x05\xb2\xd9\x78\x9b\x01\x44\x8e\x15\x27\xe5\x6a\x09\xa9\xbc\x61\x36\xd9\x83\x72\x43\xc2\x07\x7b\x92\x5b\xbb\x93\x3f\x8f\xb1\xda\xac\x96\x33\x98\xc5\x80\x2a\xed\xa3\xbb\xca\x8a\xe3\xb8\xf4\xa9\xa8\x71\xf7\xea\x8e\x2c\x0c\xe8\x98\xc5\x66\x21\x7b\x5c\x06\xff\x55\xff\x9f\x4f\xe7\x83\x98\xae\x79\x73\x64\x1e\xaf\xb5\x21"}, -{{0x33,0x6a,0x83,0xb5,0x5a,0xbf,0x4c,0x02,0xe2,0x5e,0x54,0x03,0x29,0xb5,0x27,0x58,0x43,0xc2,0xec,0xb8,0xdf,0x69,0x39,0x5b,0x5a,0x5e,0x24,0x1b,0xd0,0xd8,0xc1,0x0d,},{0xdd,0x60,0x56,0x98,0x44,0x57,0x0c,0x9f,0x0a,0x82,0x64,0x3f,0x44,0x64,0x78,0xb5,0xac,0x6f,0xc5,0x42,0x21,0x42,0x31,0xa7,0xca,0x65,0x6a,0x92,0xb5,0xfd,0xaa,0x54,},{0xd2,0x63,0xf5,0x6d,0x59,0xcb,0x9b,0x28,0x96,0xa9,0x47,0x26,0x7c,0x2e,0xd7,0x8a,0x94,0x5b,0xac,0x5a,0xbd,0xbf,0x3c,0x14,0xdc,0x3a,0xd0,0x92,0xb2,0x30,0x8c,0xb9,0x31,0x5c,0x46,0x49,0x42,0xa0,0xa2,0x0b,0x20,0x24,0x51,0x1d,0x76,0x6e,0x85,0xc9,0x36,0x49,0x9a,0x14,0x9c,0xd0,0xbb,0xb2,0x09,0x15,0x0a,0x16,0x43,0x26,0x52,0x00,},"\x9a\xfe\xe8\xab\x48\x20\x10\xe2\x92\x64\xb4\x06\xd9\xb4\x94\x53\xd1\xce\x6d\x55\x09\x39\x07\x21\x82\x86\x3e\x46\x65\x28\x4a\xb0\x5d\x86\x25\x8e\x06\x23\xb1\x87\x54\xc4\x78\x52\x38\xf6\x97\xf0\x75\xad\xfb\x9e\x1d\x31\xa4\x2e\x85\x93\x4e\xc0\x71\xdd\xdd\xec\xc2\xe6\xc2\xf6\x13\x34\xa7\x95\x26\x78\x8b\x49\x52\x19\x07\x16\x90\x6d\xde\x17\xfb\xa5\x56\xee\xa4\xc8\xb5\x97\x27\x51\x4f\x6f\x56\x15\xa1\x9c\xa3\x6d\xa3\x58\xfa\xe6\xa6\xc5\x4f\x7f\x4b\x7a\x92\x9e\x31\xba\x7c\xc7\x1b\xde\x78\x82\xfa\x9f\xfd\x87\x30\x01\x36\x40\x9c\xaf\x3c\xa6\x4e\xef\xea\x61\x6a\xed\x58\xda\x5d\xfb\xf2\x8b\x66\x8e\xc1\xcc\xcf\xfc\xef\x6e\x2e\x14\xf8\x10\x9e\x9c\xbf\x76\xcf\xa4\x14\xf9\x1a\xc0\x0f\x48\xe9\x3e\xad\xa3\x85\xdd\x3d\x5c\x16\xe1\xa3\x9e\xa3\xdd\x55\xc7\x61\xfc\xa3\x61\xb4\x28\xf5\x16\xc0\x5e\x69\x4f\xe5\xc3\xc3\x45\xcd\x94\x45\x71\x87\xa8\xe6\x04\xb2\x00\xa1\xa0\xf9\x37\xae\x89\xf4\xd6\xb5\x42\x1d\xff\xcf\x7c\xa1\x5f\x2e\x2c\x25\x37\x8a\x41\x13\x23\x3f\x76\x13\xf4\x57\x0a\xa4\xb9\x09\xa9\x13\x5e\xae\x4c\x7b\x9e\xad\x45\x80\x07\xae\x17\x12\x6a\x11\xd1\x45\x25\x8a\xf9\x56\x3d\xb2\xf7\xe8\x92\x54\x31\x87\x8b\x0e\xec\xa8\xaf\xfc\x01\xac\x59\x13\xbf\x5b\xac\x4f\xa3\xa8\x57\xc5\x4c\xc8\x90\x6d\x6a\xf7\x7d\xe6\xb9\x32\x6b\x65\x06\x15\x10\x99\xe8\x7e\x99\xb1\xe8\x19\xc6\xfb\xe0\x82\x68\x8f\x34\xb8\x03\xd5\x88\xe4\x16\xd8\x53\x16\x97\x65\xd6\x2f\x7e\x0b\xdf\x72\xc5\xcd\x66\x66\x9a\x03\x35\x56\x23\x36\x73\x5e\x7e\xfb\x73\x4a\x2f\xad\xa3\x27\xf8\x58\xbe\xc6\x02\xd0\xda\x08\xeb\xa4\x47\x9e\x7f\x6d\xc4\xde\xf6\xe4\xeb\xdb\xb7\x30\xee\x91\xa3\x34\x45\xca\xdc\x9d\xf5\x2c\x82\x5a\xd3\x61\x49\xce\xfb\xc5\x1a\xb1\x02\x03\x35\x30\x81\x4b\xaf\xa7\xe8\x79\x61\xb0\x63\x67\xff\x89\x6f\x08\xae\x33\x4a\x9b\x1a\xad\x70\x3d\xa6\x86\x70\x6c\x11\xa0\x49\x43\xea\x75\xe1\x29\x92\xdc\xf6\x10\x6e\x37\x20\x77\xcd\x03\x11\x02\x9f"}, -{{0x88,0x40,0x91,0x72,0x61,0x8b,0x49,0x03,0x93,0xdb,0x27,0xd9,0x60,0x17,0x1c,0xbc,0x18,0x7e,0xaf,0x4d,0xd8,0xb3,0x20,0xb3,0xd2,0xf8,0x24,0x98,0x00,0x43,0x71,0x8f,},{0xce,0x2e,0x7c,0x58,0x39,0xef,0x56,0x32,0xa1,0x23,0xdc,0x37,0x3d,0xc1,0x4b,0x1f,0x05,0x05,0x76,0x6e,0x96,0x75,0x40,0x76,0x04,0xca,0x7c,0xf5,0x4e,0x8d,0x44,0xb2,},{0x93,0xb6,0xe2,0x9d,0x63,0x94,0x5d,0x5c,0x42,0x73,0x87,0xd0,0x06,0xc7,0xf0,0xb0,0x19,0x56,0xa9,0x5f,0xc0,0x43,0x6e,0xd4,0x2b,0x46,0xd0,0xf1,0x7b,0x5b,0xb1,0x93,0xea,0x8c,0x0e,0xbb,0xf3,0xd6,0xd1,0x3b,0xb5,0x39,0xe3,0x5c,0x91,0xf3,0xf0,0xf9,0xfa,0x34,0x14,0xa0,0x22,0x3c,0x90,0x60,0xba,0xc8,0x36,0x53,0xc6,0xfc,0xd9,0x06,},"\xfb\x3e\x82\xf1\x1b\xc2\x86\x26\x7e\x12\x38\x17\xad\x88\x64\xe0\x77\xd9\xf7\xa8\xe7\xa1\x63\xac\x7e\xea\xf9\x3d\x55\xdd\x11\x1d\xe8\x08\x3b\x66\xb5\x3c\xe7\xbc\x77\x1f\xc5\x07\x1a\x2d\x7a\xc2\xf8\x5d\x6f\xc6\xad\xcf\xce\xc4\x46\xe1\x6a\xa1\x04\x6d\xf3\x72\x09\xad\x7a\x29\xcf\x96\x65\xb4\x39\xa5\x4d\x6f\x8d\x94\x2f\x89\xbd\xaa\x56\xf2\xf1\x12\x60\xcc\x95\x99\x30\x38\xb0\xe8\xfb\xdb\x32\x14\xf1\x42\xe6\xc9\x0b\x61\xa1\xd2\xb1\x42\x07\x62\x06\xaf\x30\xac\x35\x78\x4a\x6d\xc1\x5a\x1e\x79\x25\x1a\x8c\x77\x31\xa1\xc5\x39\x78\x03\x8f\x8d\x76\xd7\x0c\x6c\x1c\xdf\x52\x9f\xbd\xb8\x4d\x15\x07\xdc\xff\xdd\x42\x87\x3d\xfa\x6a\x8f\xe6\xbd\x6f\x7f\xd2\x9c\x80\xe4\xb2\xf9\x33\xd2\xb6\xc9\xe6\x2c\x94\x57\xe6\x65\x47\x26\x55\x05\x9b\x63\xb6\x18\xe2\xa9\xa8\xe5\xb9\xe4\x1c\x36\x46\x17\x3a\x89\x2b\x8e\x6d\x4b\xca\xd6\xa6\x2a\x6f\xcc\xd3\x45\x58\x90\xb5\x8e\xc2\x68\x1a\x95\xcc\x97\x76\xa9\xfc\xe8\x3c\x54\xa9\xef\x31\x2a\x33\x19\x59\xc7\xef\x3f\x79\xee\x57\x6e\xb7\xb7\x94\x69\xc9\x23\x4b\x1e\xae\xf6\x09\x88\x47\x08\xfe\x4b\xb0\xef\xac\x66\x2d\xa8\x71\xba\x61\xdd\xab\xb3\xfc\xbd\xeb\x8f\x63\x56\x57\xdd\x9a\x5d\x73\x11\xe6\x39\xa8\x24\x85\x8b\x9a\x98\x68\xd3\xf9\x38\x4d\xa6\x12\xc7\xf2\xe7\x71\xa4\x6b\xd2\x62\x4c\x99\xea\x2b\x6c\xcb\xca\x99\x6c\x1d\x9c\x37\x55\x54\xf2\xa5\x51\x61\x9c\xe6\xd5\xe6\xe4\xd6\xb8\x44\xa4\xdb\xea\x83\xba\x73\x23\x31\xfc\xf4\x65\x72\xc1\xfb\x0e\x25\x7c\xe1\x04\x1b\x26\x5d\xf0\x2e\x69\x0a\x92\x81\x4b\xbf\x3b\x5e\xca\xc6\x9e\xe9\x98\x76\x6a\x02\xb0\xd2\xf9\x08\xb3\xc1\x5f\x95\x26\x99\x61\x6f\x2c\x07\xd5\x89\x19\x89\x89\xe6\x05\x6c\x16\x31\x9a\xab\x6c\xf8\x77\x19\x02\xc0\x78\x04\x6a\x88\xb2\x57\x0c\x13\xbc\x5e\xde\xba\x2e\xd1\xe3\xba\x13\x1d\xaf\x94\xe6\x89\x18\x62\xbb\x3d\xe7\xd1\x06\x3f\xe4\x05\x30\x7a\x5c\xd9\x75\x69\x3e\x9d\x58\xe1\x7c\x69\x0e\xee\xf4\xa2\x60\x3c\xaf\xc6\x8c\x2b"}, -{{0xe5,0x71,0x18,0x9b,0x5c,0xd9,0xe7,0x88,0x30,0x2d,0xe3,0x91,0x9d,0x85,0x0c,0x22,0x7d,0xcb,0xb6,0x15,0x02,0x2e,0x56,0x8b,0xda,0xeb,0x37,0xac,0x5b,0x29,0x39,0xc5,},{0xed,0xda,0x89,0x0f,0x42,0xdd,0x5f,0xbc,0x73,0x16,0xa5,0xfa,0xdf,0xbe,0xc3,0x85,0x56,0xf2,0x3f,0x51,0xb8,0xef,0xd2,0x62,0x54,0x37,0xf6,0xb5,0x06,0x9f,0x1e,0xe5,},{0x7f,0x79,0x7a,0x31,0x71,0x5d,0x7c,0x35,0x6f,0x8f,0x1f,0x78,0x37,0x00,0xaa,0x99,0x74,0xbb,0x93,0x6d,0x66,0x16,0x61,0xad,0x96,0x8c,0x7c,0xde,0x1a,0xc9,0xe7,0x67,0xbe,0x56,0xa2,0xdd,0x49,0xb9,0x23,0x0e,0x90,0x11,0x0c,0x67,0xc0,0xed,0x18,0x7c,0xb7,0xe7,0x5c,0x30,0x53,0xec,0xe8,0x44,0x98,0x4d,0x29,0x6f,0x0d,0x85,0xcb,0x07,},"\xb6\x2c\x86\x7a\xd6\x22\x74\x35\xbf\xa6\xda\xb8\x30\x68\x4e\x38\xd1\x96\xe1\xf8\x61\xaa\xde\x0f\xd6\xa7\x69\x9b\x6d\x60\x90\x1f\xef\xb2\xd7\x99\xc3\x5c\x6f\x3d\x8b\xb9\x4d\xee\xe8\x34\x40\x39\x81\x86\x6b\xab\x84\x94\x6a\xe9\x47\x6c\x75\xe9\xf1\xd3\x60\x2b\x42\xcb\x2d\xb4\x37\xbf\xf3\x3a\x77\x58\x22\xf0\xd6\xa2\x57\xd4\xb7\x54\x00\xeb\xa5\xb8\xab\xb3\x14\xb7\x1f\xc6\xb4\x6f\x8a\x34\xe8\x61\xa9\xa6\x2a\xbf\x33\xde\x84\x82\xf6\x3f\x9d\x71\x69\xe7\x73\xa2\xdc\xeb\xee\x03\x70\x5d\xac\x11\x7f\xd1\x49\x9b\x68\xe7\x41\x4f\x51\xff\x94\x37\xf2\x53\xa1\xd9\x90\x1e\xc3\xb0\xbb\xa8\x69\x65\xa1\x93\x83\x65\x54\x87\xb5\x80\x10\xf8\x04\x90\x9d\xe1\xff\xb2\x21\x2c\x02\x52\xdd\xd9\xbf\x2a\x56\xac\x46\xbd\x59\xc0\xc3\x4d\xd5\x9e\x46\x59\x8b\x6b\xab\xd4\xe5\xf3\xff\xfd\xe5\x5e\x48\xda\xb0\x39\x8c\x22\xaf\x9e\x26\xba\xdd\xf7\x72\x75\xe5\xf0\x17\xb3\x5a\x9b\x8f\x84\x35\xf9\x63\x19\x36\xb3\x91\xcb\x95\xd7\xad\xf3\x5d\x1d\x85\x45\xa0\xfd\x06\x64\x12\xd5\x08\x96\x7b\xbe\x9a\x20\x24\x5a\x26\x9e\x3b\xe2\x77\x71\x17\xe7\x5f\xba\xc1\x70\xdb\xa3\x52\xbe\x69\xb2\x54\xd3\x53\xb3\xb2\xcb\x3b\x7e\x21\xb7\x21\xaa\x9f\xe0\x44\xf8\x91\x6b\x4b\x2a\x6f\x8c\x28\xf8\xab\xe6\x6a\xc9\x2b\x91\x32\x3a\xc7\x3a\xfd\x93\xdf\xbe\xea\xee\xf2\x6d\x19\xbd\x9f\x67\xe9\x9d\x48\xcd\x2a\xd2\xd3\xe5\x5e\x45\xd2\x4d\x54\xb5\x0f\x44\xa3\x9b\x90\xe2\x42\xeb\xe9\xb4\x2b\xeb\xdb\x23\x0c\x47\x0b\xdf\xde\x1b\xc7\x72\x1c\x31\x20\x00\x84\x77\x39\x3d\xcc\x2e\x15\xfd\x22\xb2\x51\xfe\xb0\xe1\x8b\x02\x88\x3c\x07\x8a\xee\x4f\xb7\x60\x65\x5a\x67\x1d\xc7\xb8\xaa\xdb\x9a\x56\x24\x20\xa3\xc2\xef\xa2\xd3\x42\xe1\xe0\x09\x9d\x95\x1b\x42\x24\x29\x84\xf5\x94\xe6\x91\x4f\xe2\x82\xb1\xee\x12\x87\x35\x98\x4e\xf9\x3a\x66\x9e\x6e\xcb\xa2\x6c\x9f\xcb\x9f\x09\xf0\x92\x56\x64\x56\x17\xf1\x39\x2d\x35\x90\x89\x17\xcb\x8d\x29\xe0\x89\x7c\x75\x03\xcd\xdd\x5d\xe1\x95\x96\x86"}, -{{0x37,0x17,0x44,0xab,0x63,0xc1,0x15,0x61,0x39,0x29,0xa3,0x43,0x70,0x9b,0xb0,0x19,0xb7,0x35,0x7d,0xff,0x72,0xd2,0xa1,0x49,0xf1,0xd0,0xf7,0x1d,0x3a,0x20,0x1e,0xfe,},{0xe5,0x8a,0xbf,0xad,0x4a,0x13,0x85,0x9f,0x0a,0xcb,0x05,0xd0,0xe4,0x7d,0x59,0x63,0x8f,0x7b,0x1b,0x49,0x36,0x10,0x0b,0x98,0x8d,0x61,0xe6,0xe7,0x0e,0x22,0x66,0x7d,},{0x5e,0xae,0x4a,0xc7,0x2a,0xf0,0x17,0x4a,0xb2,0x56,0x52,0x7b,0x7c,0xd3,0x37,0xa0,0xe5,0x48,0x2e,0x61,0x5a,0xf0,0x68,0xdb,0x21,0xda,0xe3,0x5a,0x64,0x64,0x07,0x42,0x60,0x4d,0xf7,0x3f,0xd4,0xca,0x02,0xed,0x95,0x15,0xa5,0x60,0x8d,0x73,0x19,0x52,0x30,0xfa,0xdc,0xa7,0xb4,0x26,0xf0,0x2a,0x2f,0xbf,0xd0,0x20,0x61,0xaf,0x36,0x00,},"\xc2\x19\xde\x1e\x8d\x7a\xd8\xdf\x08\xc4\x93\x77\x39\x6f\xe7\xc1\xf2\xd5\x7b\xd2\x17\x06\x33\xa0\x0d\x70\x8f\xaa\xde\xe1\x80\xce\xba\x92\x84\x9a\x77\x78\x50\x6c\xbb\x36\x68\x75\xbf\x91\x24\x70\x18\x94\xce\xcd\xb3\x38\x51\x47\xd0\x67\x18\x43\x92\x2a\x64\x9a\xff\x7c\x43\x5e\xb5\xa9\xc7\x49\x27\x50\x30\x72\xd0\x06\x79\x78\x71\x6d\xc8\x0b\xe1\x54\x5a\x2d\xbf\x5a\x1c\x38\x53\x6e\x12\xbd\x77\x20\xc1\x96\x5d\x38\x03\xa4\xe8\xaa\x55\x76\x51\x92\xa1\x3b\x70\x5c\xa1\x05\x9d\xed\x0e\x80\x63\x62\xfc\x5b\xbe\x6c\x76\xa1\xc9\x67\x4b\xb8\x53\x79\x0f\x7e\x90\xaf\x00\x75\x3e\x00\x43\x6d\xa4\x8c\xd0\x82\xea\xd6\x4f\xdd\xb6\x89\x89\x01\x62\x08\x2f\x84\x82\x92\x4f\x33\xac\xd6\x04\x64\x0f\x69\x92\x73\x52\xb4\x3f\x64\x40\x2d\x27\xa8\x83\xfa\x6b\x72\xaa\x70\xd2\x41\xdf\xfa\xa1\x70\x1a\x25\xcf\x10\x79\x35\x82\x60\x79\x38\x75\xf7\x6a\x29\x78\xe9\xf9\xf9\xd6\x86\x34\xeb\x3f\x5f\x01\xbd\xe1\xce\x49\xe5\x92\x12\x52\xf9\x49\xf0\x82\x79\x5e\x4e\xaf\xed\x7b\xe5\xb4\x9a\x9f\x95\xed\xbb\x4a\x13\x53\x2e\x3f\x3b\x3b\xe6\x2e\x26\x52\x23\x12\x53\xa2\x0c\x1d\x54\x77\xe8\xf4\xbc\x57\xed\x76\xfa\x19\xea\xf0\x3a\x11\xbb\xa4\x29\xb6\x49\x6c\xe7\x62\x46\x17\x0e\x04\x3b\xc1\x4f\x2d\x2f\x70\x3d\x96\x8f\x1d\xeb\x09\x38\x87\x15\xc3\x7c\xb4\x75\x2d\xa8\xd4\x64\xe3\x48\xe0\x31\x3c\x89\x93\xe2\x41\x33\xa7\xc5\x45\x28\x4e\x3c\x9c\x90\x7d\x01\xb2\x60\xc4\x88\x3f\x9c\xb3\xe3\xdc\x5b\x6f\x7f\xb6\xd7\x55\x36\x36\x5f\x21\x32\xea\xed\xda\xb5\x70\xe7\x27\x3a\xfa\xc0\xbf\xf5\xc9\xfc\x0b\x82\x0f\x20\x78\xe0\x33\x60\x52\xe1\xfe\x7b\xde\xc8\x66\x74\xd0\x99\x8e\xc7\x8d\xa1\xc3\xf3\x47\x51\xf8\x86\x72\x76\x95\xf3\x5e\xca\x13\x04\xb1\x47\x34\x76\x6a\xb0\x5c\x11\x86\x30\x6d\xed\x9d\xb3\xee\xf6\x5d\x3c\x04\x56\xcd\xae\x81\x81\xaf\xee\x04\xb2\x96\xc6\x72\x2a\x88\xc7\xef\x30\x88\xd2\x6f\x7f\xe7\x4b\xc8\x9c\xf5\x28\x5c\x68\x8f\x02\x7b\x7e\x68\x60\x04\x86\xaf"}, -{{0x49,0x8b,0x6e,0xe6,0x49,0x2d,0x53,0x23,0x1b,0x35,0x32,0xd1,0x93,0x57,0x8b,0xa7,0x5d,0x6a,0x89,0x4e,0x2e,0x53,0x00,0x34,0xe2,0x1a,0xb8,0xad,0x8d,0x2c,0x0d,0x1f,},{0xd1,0x24,0x66,0x5b,0x28,0xfa,0xcd,0x2d,0x17,0x94,0x6a,0x04,0xdf,0xe3,0xd1,0x29,0xa4,0x56,0x1a,0x2b,0x24,0xeb,0x32,0x6d,0x84,0xb6,0x2b,0x42,0x2e,0x44,0xdb,0xcf,},{0x11,0x2f,0x5c,0x6d,0x3b,0xcb,0x3d,0xd9,0x93,0x46,0xd3,0x2a,0xd6,0x9c,0xbf,0xac,0x3e,0x65,0x3b,0xef,0x29,0xc6,0x8a,0x33,0xf4,0x32,0x31,0xf6,0x6c,0xea,0x1d,0x0a,0x19,0x54,0x27,0xd6,0xe1,0x0c,0x0e,0x77,0xc5,0xd5,0x5f,0xe2,0x79,0x42,0x87,0xee,0x32,0xe5,0xe2,0x2b,0xaf,0xbb,0xd8,0x05,0x2a,0xd3,0x60,0x6b,0x90,0xf9,0x45,0x05,},"\x04\x98\xa5\x9b\x87\xcd\xae\x28\x69\x55\x47\xe1\x08\x63\xbc\xe8\x04\xd9\x7d\xe0\xac\x80\x08\xf3\xd5\xfb\x65\x2c\x17\x57\x41\x9f\xdc\x9e\x0f\x97\x36\xf4\xc5\x9a\x34\xf2\x1c\xfc\x74\x59\x9f\xa7\x88\xfc\xc1\x0c\x67\x30\xc7\xdf\x8c\x3d\x2c\x1b\x6a\x78\x6d\x12\x30\xb6\x55\x85\x71\x9d\x1c\xb5\xc4\x90\x35\x9b\x94\x43\x5d\x6d\xd6\x71\xf5\x4d\x6e\x9a\x19\xb9\xb5\xaa\xad\x7e\x0f\x23\x3f\x87\x97\xdf\x99\x78\x28\xd8\x8c\xd9\x2e\xf0\x89\xef\x7d\xbf\x1e\x95\x27\x78\x94\xa2\xf7\xc2\xfd\x0c\x8e\x4d\xfd\xfa\x6d\x3d\x14\x58\x9f\xf0\x19\x16\xdb\xf9\xdd\xd8\x11\xc2\xf5\xe0\x1e\x94\x29\x89\x90\xa1\x45\xa6\xcf\xc2\x68\x95\x61\x4c\x7c\x96\x3f\xef\x30\x8a\x4e\x38\x56\xc3\x2d\xd3\xe3\x59\xbc\x56\xd2\xcc\xa4\x96\xad\x19\x9f\xf1\xa5\x68\xd6\x43\x0a\xc5\xcd\x20\x8e\x0e\x2d\x07\x80\x3c\xa5\x23\xe0\xd8\x13\xad\x37\x33\xab\x50\xbd\xca\xdc\xb9\x88\xae\xe7\x58\xea\x50\x43\x9b\xf3\x8e\xe6\x49\x99\x76\x04\xf1\x51\xc6\x02\xc8\x29\x00\xa8\x20\x5d\x8f\x6f\x67\x0c\x86\x84\xbf\x5a\xbb\x5f\x75\xff\x29\xa3\x7e\xb9\xbf\x81\x05\x19\x9f\xbb\xfb\x47\x07\xe1\x62\xe6\x4c\x71\x52\x70\xf8\x53\xe6\x48\xb0\xaa\x26\xfe\xa0\xf6\xdb\x56\x28\x96\xbf\x42\x4a\x9f\xfc\xb2\x92\xfa\xe8\x5b\x76\xce\xfb\x8b\xd5\xa4\xb3\xce\x1f\xb3\x9b\xd2\xa5\x0d\x0c\x9e\x6d\x93\x3e\x16\x7f\xf6\x29\xb8\xa4\x94\xf2\xa9\xb7\x74\xeb\x30\x3c\x78\x1e\xa0\x2a\xff\x1a\x8a\xfa\xdc\x24\x65\xcc\x61\x69\x68\x01\x5e\xd6\xa5\xa3\x3c\x31\x20\xb9\x45\xed\x53\x51\x98\x1e\x32\xfb\x9f\xb9\x6b\x22\x12\xdc\xf8\xfe\x9a\xc5\x6e\x3c\xf4\x1d\xc5\x24\xf8\x00\x63\x10\x20\xb0\x25\x91\x91\x78\xce\x07\x4e\xef\x07\x8d\x68\x42\x01\x2a\x27\x6e\xfa\x62\x8d\xb5\x40\x58\xd1\xeb\x5b\x5b\x70\x5f\x1e\x18\x18\xd2\xdf\x51\x64\xba\xab\xb0\xc6\x19\x56\xec\xdb\x8c\x70\x6e\x56\x2f\xc4\xfd\x64\x05\x28\x70\x53\x0a\xe4\x25\xb2\x21\xf8\x9d\xd6\xf9\x0d\xab\x88\x2e\x76\x3e\x7a\x7f\xfa\x14\x1b\xba\xa8\xbf\x7a\x3f\x21\xb0"}, -{{0xce,0xfc,0xfc,0xd1,0xcf,0xf4,0xd8,0x91,0x07,0x49,0x27,0x91,0x31,0x83,0x0b,0x1d,0xa1,0x9d,0xfc,0x52,0x45,0xf7,0x8c,0xa6,0x8b,0x8c,0x3c,0x1b,0x62,0x2b,0x45,0x51,},{0x1d,0x39,0x4a,0xbd,0x1b,0x4e,0xd1,0xae,0xdf,0x96,0x6a,0x60,0xef,0xd3,0xff,0x88,0x21,0x40,0xa7,0xe5,0x6b,0x42,0x83,0x74,0xec,0xb4,0x43,0x28,0x9a,0x9c,0x7f,0x00,},{0x7d,0x83,0xff,0x66,0xec,0x79,0x30,0x7b,0x1c,0x0c,0x09,0x3f,0xda,0x39,0x68,0xa9,0x6c,0xf6,0x04,0x4f,0x5c,0x80,0x28,0x88,0x58,0x40,0x18,0x84,0x5e,0x7c,0xaf,0x2a,0x13,0x5a,0xc6,0xf1,0x67,0x7e,0x84,0xd2,0x2e,0x45,0x8e,0x22,0x7e,0x4f,0x93,0x02,0x09,0x91,0x9b,0xc1,0x1b,0x12,0xf7,0xaa,0xf2,0xb8,0xc9,0x43,0x02,0xd6,0x42,0x00,},"\x5e\xc9\x4e\xd0\x6f\xc1\x25\x7a\xe9\xc1\x83\xce\x56\x27\x12\x07\xac\xa3\x7a\x23\xfd\xb4\xb0\xe7\x4a\xc9\x30\x7a\x1b\xb1\x12\xe0\x5e\xd5\xa5\xd0\x47\xc9\x31\x09\xe2\xe5\x94\x77\xb0\x33\x78\x34\x64\x22\xde\x36\x71\x4c\x29\x61\xbb\x97\x36\xa5\x13\xca\x36\x71\xc6\x03\xa6\x8c\x2b\xe7\x31\x7b\x1b\x52\xa0\x76\xda\xe2\xaf\xf7\xbc\x88\xcd\x5e\xea\x0a\xa2\x68\xfa\xaa\xda\xe5\x39\xc9\x38\xbb\x4f\xd4\xb6\x06\x9b\x19\x45\xeb\x6a\xf0\xc9\xe6\xc8\xaa\x5e\xe4\xa4\xaf\x37\xe9\x0c\x67\xe2\x48\xe8\xd2\x7b\xd7\xf9\x58\x9c\x4d\x30\xe9\x05\x65\x1b\xaf\x45\x36\x4f\xa0\x49\x95\x7e\xa5\xd9\xb7\x14\x6c\xa6\x82\x04\xe5\xe9\x73\xd0\xf1\xc9\x1a\x1c\x4b\xde\xd6\x61\x15\x02\x8a\x71\x11\x4f\x0f\x4f\x85\x1b\xd1\x15\xfa\xeb\x95\x4e\x3f\x71\xa0\x14\x70\xb2\x48\x1a\x00\x98\xd9\x9f\x9d\x74\x89\x8c\x8b\xa0\x28\x7c\xc7\x83\x41\x55\x21\x41\x73\xd1\xfc\xba\xfc\xfe\x9b\x08\x25\x03\x84\x43\x94\x76\x05\x58\x83\x83\x38\x16\xc9\x52\x4c\xfd\x57\x44\xaa\xa2\x59\xdb\x7e\xbd\x3a\x6a\xa2\x0b\x5a\x65\x46\xda\xde\xfd\x14\x06\x68\xeb\x0e\xcc\xb5\xf6\x68\xdb\x9f\xc6\x29\x83\xdf\x98\x08\x50\xc9\xd1\x98\x82\xa1\x75\x50\xd5\xdc\xa3\x54\x2c\xd3\x60\x03\xa0\xd0\x3c\xff\xb0\x45\x75\xa3\xe8\xe1\xd0\x70\x15\xc7\xb3\x0e\xca\x91\x15\xcd\x2b\x72\xe4\x6d\xfd\xdf\x6a\x4d\xda\x1f\xaa\x2d\xbd\xc8\x90\x00\xd4\x33\xf6\xec\x9a\xdc\x46\x14\x6d\x93\x9f\x32\x12\x1b\x99\xb2\x89\x83\xd9\x8b\x9d\xde\x8c\x3f\x6e\x57\x79\xf2\xb0\x70\x0c\xb0\x23\xdb\x13\xde\x65\x6e\x0a\xed\x1d\xa2\xd5\xc6\xba\x26\x52\x34\x36\x48\xad\x42\x0f\x6a\xb9\xe5\x5a\x97\x48\x2a\x1a\x22\xb3\xbc\x2e\xe5\x98\x62\x9a\xba\xd9\x54\x7e\xdb\x5f\xf7\x90\x99\x05\x64\xbd\x87\x1f\x81\xb2\x4b\x12\xf2\xbf\x8d\xbd\xfe\x7a\x88\x37\x5f\xad\x9c\xcb\xd9\xfc\x0b\xa1\xd3\xbb\xa5\xe3\xc4\x81\x3c\x18\xa0\x34\x8a\xad\x83\xfb\x1b\x82\x68\x90\x54\xd9\x9b\x46\x00\xdd\x17\x60\xd0\xdc\xce\x44\x75\x74\x67\xbe\xc1\x94\x64\x06\xd5\x30"}, -{{0xd1,0x07,0xcf,0x26,0xf5,0x27,0xdb,0x71,0xa2,0x06,0xe4,0x1d,0x17,0x95,0x53,0x21,0x01,0x32,0x25,0xbb,0x20,0xf9,0x3e,0x12,0xdf,0x3d,0xc7,0x39,0x9e,0x72,0x0c,0xa3,},{0x18,0x6b,0xf4,0x53,0xc9,0x5d,0xc0,0xa2,0xfd,0x58,0x9a,0x78,0xe2,0xc8,0x00,0x40,0xb3,0xf6,0xdd,0xf9,0xa6,0xf8,0x68,0x1d,0x14,0x60,0x36,0xcf,0x21,0x46,0xe8,0xfc,},{0x80,0x71,0xd9,0x7f,0x32,0x4f,0x10,0x35,0x8f,0x13,0xac,0x8c,0x61,0xd4,0x24,0xb4,0xf3,0x00,0xdd,0x04,0x19,0x57,0x1c,0x39,0xe4,0x0d,0x99,0xae,0xa5,0xf0,0x31,0x40,0xe6,0x2a,0xb4,0xc9,0x71,0x27,0xab,0x33,0xe9,0x82,0x69,0x96,0x6a,0xe1,0xd4,0x55,0x7e,0x45,0x9b,0xf7,0xf5,0x97,0xb3,0x13,0xf3,0x51,0xa2,0x01,0x22,0xf0,0x66,0x0e,},"\x78\xeb\x9e\x13\x78\x99\x28\xa7\x4f\x36\x01\x41\x72\x8e\xde\x98\x38\x96\x85\xc8\x36\xb9\x1f\xaf\xbf\x1a\x7e\x8c\x19\xcf\xbe\x21\xbd\x3c\x3d\x6c\x6e\xd8\x3c\x40\x9e\xf6\x93\xf1\xd7\x35\xda\x3f\xa4\x66\x49\x7e\x19\xf3\x8e\x30\xfb\xa2\xa1\x02\x37\x85\x45\x90\x70\xe6\xe9\x2c\x1c\xb7\xc9\xbd\x0c\x9b\xa6\x12\x20\x15\x78\x66\xc3\xbe\xd2\xb0\x1e\x6e\x6b\x9b\x8d\xd3\xf0\xc4\x7c\x02\xf1\x81\x34\x6a\x0a\x9b\x9b\x5d\x3d\x7e\x18\xa9\x4d\x69\x56\x85\x5e\x16\xe8\xea\xaa\xab\x71\xb1\x03\x02\xf3\x5b\xd8\xfb\x1f\x9b\x58\x47\x30\x41\x60\x32\x49\x26\x64\x5b\x05\x82\xc2\xf2\xf1\x53\x3a\x24\x28\x14\x61\x51\x42\x41\xdb\x28\x50\xef\x31\xc5\x76\x3b\x2e\x3d\x4f\xb1\x8f\xc6\xd8\xc1\xd7\xe5\x2f\x7c\x13\x39\x2c\x17\xe2\x70\x19\xff\x60\x00\x8e\x43\x1f\x17\x14\x37\x0b\xc0\xef\xd9\x45\x2a\x61\xf5\xc5\x64\x88\xd9\x1a\x18\x50\x37\xf1\xf6\x47\xf7\x2f\xa7\x85\x01\x0d\x5d\x78\xf0\xa1\x15\x87\xcc\xf6\x6b\x80\x88\xe0\xe6\x35\xff\xf3\x77\x41\x93\xb2\xed\xef\xfd\x92\xd6\xe8\xa0\x32\x11\x28\xae\x64\xcd\xb8\x62\xe6\x31\xe2\xee\x5b\xa0\xda\x44\xbb\xd5\x89\xdc\x39\x2b\x5a\x11\x3b\x86\xa7\x27\xa8\xdd\xb6\x98\xa3\x34\xcc\x66\x8b\x39\xb1\xcd\xe1\x99\xb8\x88\x37\xca\x5f\x00\xf5\x53\xf8\x9c\x62\x28\x34\x27\x36\x41\xd3\x9b\xc1\x0c\x6a\x24\xe1\xeb\x42\x58\x75\x42\xf0\x3f\xc1\x62\x75\x24\xed\x6b\x74\x93\x91\xf1\x10\x28\x70\x6c\x42\x36\x44\x25\xb2\xca\xf2\x01\x80\xe1\xb8\x02\xc7\x44\xb4\x9b\x7b\xcd\x9b\xf7\xb1\x5c\x23\xa0\xbf\x1c\x69\x65\x96\x0d\x34\x15\x54\xe1\x96\x6b\x6e\xf8\x2f\xcf\xbb\xe4\x1d\x1e\x09\xd7\x41\xe3\x09\x25\x44\x46\x77\x7f\x13\xc2\x9a\x67\xb8\xbd\xeb\xc5\xf7\xf0\x4d\x16\x0d\x60\xe3\x32\xe3\xd0\x44\x1a\x0f\x2f\x7b\x19\x2c\x3e\x2b\xdf\x6d\xad\xec\x2a\x42\x4f\x88\x66\x98\x06\x23\x6e\xe0\x4d\xea\x69\x2b\xd8\xbb\x6f\x91\xca\x06\x82\xec\xe3\x49\x14\x25\x75\x35\x8b\x9b\x7b\xe7\x06\x00\xb3\xcb\x81\xe1\x45\x6b\xa0\x79\x9f\xdc\x01\xff\xd6\x86\x23"}, -{{0xaf,0x7e,0xa8,0xe4,0x1c,0x89,0x37,0xa4,0xec,0x47,0x5a,0xd8,0x13,0x71,0xa1,0x71,0xd3,0xd0,0xf9,0xfd,0x75,0x19,0xa0,0x4c,0x75,0x1e,0xd4,0xad,0x8f,0xf8,0xfe,0xf9,},{0x15,0xdf,0xc7,0x15,0x85,0xba,0xc7,0x1e,0xf2,0x0f,0x37,0x49,0x87,0xc5,0x55,0xa3,0xf2,0xf0,0x7d,0x6b,0x9c,0x78,0x70,0x66,0xc1,0x0d,0x63,0xcf,0x06,0xe0,0x2a,0xb0,},{0xc0,0xf1,0x73,0x91,0x67,0x27,0x4b,0xf9,0x18,0x31,0xc7,0x4b,0xeb,0x64,0x5a,0xf7,0x90,0x45,0x9b,0x28,0xbb,0x3f,0x21,0x32,0x53,0x65,0x13,0x0f,0x40,0x9a,0xcb,0x66,0xdf,0x1d,0x22,0x37,0x59,0xa9,0x75,0x8e,0x08,0xfd,0x72,0x53,0x73,0x74,0x84,0xe2,0x85,0xa6,0xfb,0x47,0x40,0x4a,0xbe,0x2e,0xba,0x5e,0xf2,0x49,0xfd,0x02,0x5c,0x0a,},"\x05\xf2\x26\x3f\x02\x45\xec\xb9\xfa\xeb\x14\xe5\x7a\xca\x43\x66\x68\x30\x8c\x81\x25\xdf\x31\x16\xc4\xee\x20\x50\x1d\x0c\xde\x70\x1b\x36\x6e\x2b\x50\xa1\xc5\xed\xf4\x84\x14\x4c\xe1\x6b\xfb\x1f\x7d\x26\xdc\x42\x75\xea\x97\x32\xe2\x64\xba\x4d\x4a\x36\x2b\x40\x27\x5b\xa4\x73\x77\xdb\xc3\x32\xcb\x65\xe2\xf4\xc8\x85\x38\x94\xaa\x87\x8a\x4c\x17\x5d\xc5\xb3\xb2\xa7\x57\xff\x3c\x8d\x7d\xe6\x60\x97\x3b\x89\xda\xdf\x07\x6e\x2e\x4f\xc7\x62\x39\xb7\xbc\x75\x2a\x22\x9d\x44\xe0\x00\xce\xb6\x67\x10\x4c\xb0\x74\x6b\xfc\xf5\x9d\x69\x60\x3a\xe7\xfc\x1b\xcf\x11\xd2\xe3\x3f\x61\xdc\x49\x7e\xc1\xb0\xbd\x5e\x4f\x1d\xbe\xf4\x35\xf2\xf2\x91\xf3\x0b\x00\xa8\x5e\x83\x39\x46\xc8\xb1\x04\x84\xe4\xab\xd7\xd6\x0b\xdb\xb1\xfe\x6d\xff\x58\x07\xa5\x3b\xb8\x93\x82\x15\x30\x13\xb7\x0c\xa0\x8e\xfc\x91\xb7\xe9\xfc\x5b\x5d\xbb\xb6\xaf\x12\x3b\x57\xbe\x2e\x14\x0f\xc4\x71\xa4\x5d\x89\xfa\x82\x84\xcc\x27\xe0\xa1\xfe\x77\x1f\x55\x59\x8b\xbd\xcf\x06\x8d\x50\x6d\xad\x0a\x59\x21\x79\xce\xca\x39\xee\x95\x26\xf9\xe4\xfe\x47\xbf\x2b\xb1\x4f\xb1\x48\x6a\x67\x7d\x4d\x7b\x99\xa5\x20\x54\x56\x76\xa0\xf1\xfa\x80\x90\x49\xaa\x24\x14\xae\x7b\x81\x7d\x9a\x03\x6e\x5c\x15\x78\x86\xe8\x34\x1d\x4e\x81\x9c\x09\x2a\x3b\x48\xb3\x60\x6b\x03\xac\xb7\x27\xc6\xc2\x21\x7d\x0a\xf3\x01\x21\x54\x6a\x94\xaf\x6b\x49\xca\xa2\xa8\xc9\xb1\x78\x6f\xa0\xc2\xa5\x24\xec\x7a\x02\x3e\x92\x4b\x5f\x8a\x89\xa5\x37\x80\xc7\xf8\x78\x1c\x5b\x8e\x86\x94\x30\xca\xa0\xe6\xd0\x43\x79\x67\xe3\xae\xd4\x4f\x45\xc9\x01\xcb\xcf\x10\x26\xfb\xbd\x4e\x3d\xd9\xa0\x91\xec\xf8\xb3\x4f\x7d\xd5\x03\x8e\x54\x3d\xc7\xeb\x6a\xd5\x49\x4e\xfb\x14\x5c\xf6\x3e\xc0\xd3\x55\xbb\x8e\x17\x2f\x45\x5d\x8a\x6b\x13\xda\xca\xad\xdb\xc5\x6e\x47\xde\x3c\xf7\x62\xa1\xa7\x38\xef\x09\x2f\x14\x36\x68\x04\x67\xb5\xcd\x82\xe9\xe3\x6e\x2d\x2b\x68\x42\xb3\xbd\x5d\xce\x77\x18\x0d\xda\xf0\xb6\x43\x37\x8e\x69\x85\x99\xdd\x47\xf5\xcd\xbb"}, -{{0x0c,0x57,0xcb,0xfc,0xeb,0xde,0x10,0xed,0xe0,0x2d,0x1c,0xb0,0x1d,0xf3,0x60,0xd4,0x1f,0x2e,0x66,0xa5,0x04,0x43,0xd5,0x8b,0x5d,0x4f,0x08,0x28,0xc9,0xa1,0x8b,0xb7,},{0xc4,0xd7,0x61,0xba,0x18,0x99,0x71,0xb9,0x46,0x2c,0x61,0xbf,0x46,0xa7,0x65,0xf8,0x8e,0x2e,0xca,0xa5,0xbf,0x22,0x11,0x22,0x0a,0xfb,0x00,0xac,0x65,0x7f,0x7c,0xe5,},{0x8a,0xf7,0xbb,0xe0,0x1b,0x8a,0xb9,0x39,0x51,0xd1,0x6f,0xca,0x05,0xa9,0xc9,0x67,0xd1,0xc5,0x2c,0x97,0x4b,0xea,0x15,0x1e,0xa7,0x2e,0x4c,0xeb,0xaa,0x20,0xcc,0x78,0x3b,0xb6,0x1d,0x8d,0x69,0x38,0x5c,0xac,0x5b,0xc6,0xd7,0x2d,0xbd,0x16,0x2b,0xee,0xf1,0xfc,0xb5,0xdd,0x0e,0x0a,0x08,0xb4,0x8c,0xa0,0xb9,0xf6,0xd9,0xa9,0x88,0x0c,},"\x33\x77\x03\x24\x3a\xb5\xb4\xe4\xd3\x48\x1e\xe8\xdd\x1f\x44\x94\x50\x71\x74\x41\x26\x58\xa9\x39\x88\xb5\xc3\x04\x03\xa7\xb7\xed\x85\x22\xce\xb4\x6f\xa1\xee\x02\x75\x3a\x87\x4e\xf0\x67\x5d\x39\x7c\x57\x5d\xa0\xb0\x8c\xaa\x8c\xee\x33\x93\x78\x4d\x0f\x0d\xb8\x45\x98\x37\xaf\x90\xb9\x05\x6d\xf4\xe3\x8e\x41\x7f\x3a\xd2\xeb\x1a\x10\x0e\xf2\x07\xce\x2c\xa6\xc6\x10\x01\x80\x21\x66\x1e\x30\x70\x99\xf2\xb7\xc4\xae\x87\x59\x91\x14\x0b\xdd\x3f\x0f\x99\xad\x2c\x5d\x55\xaa\xcb\x84\xcc\x1c\xdc\xd5\x79\xe0\x80\x72\xb6\x95\x1f\xd4\x5e\xd2\x89\xac\x9f\xf7\xf0\x98\x6a\xc8\x8a\x4f\xbb\x9d\xc9\x20\x3d\x9b\xaf\x18\x0c\x90\xed\xf9\x37\x25\x8c\x9d\x0a\x6d\x48\xe2\x20\xf7\x2d\x25\x0c\x7f\x2c\x77\x7e\xaa\x7f\xb9\xfa\x11\xd5\x0a\x57\x98\x77\x2f\x9f\xd9\x76\xb0\x05\x99\xf1\xf0\x27\x6f\x3a\x2e\x4d\x98\x8a\xe9\x21\x25\x46\x7a\x8d\xed\xb7\xa1\x6f\x9e\x3a\x56\xe8\xd0\x06\x62\xb3\xeb\x67\xa3\x5b\x9b\x60\xe7\x3b\xd9\x35\x07\x7e\xe2\x38\xdf\x8f\x6e\x83\x3b\x9a\x55\x23\x38\x68\x26\xc1\xf2\x91\x7b\x1c\x3e\xc9\x8e\x0a\x5f\xde\x89\xc4\x8b\x1d\x44\x6d\xa5\xd0\xc8\x85\xfe\xf0\xe3\x74\xbf\xf3\x0a\x99\x7c\x7b\xaf\xd5\xe7\x43\xc8\x5d\x0c\x6a\xaa\x6e\xf1\x0a\x06\x12\x11\xa2\x32\x7c\x6d\x84\xeb\x74\x7a\x56\xe9\xbf\x60\xfc\xd5\xb5\x53\xb7\x98\x83\x4d\x0c\x5c\xca\xdb\x9d\x4b\x54\xe7\x23\x7d\x12\xc6\x79\xc1\x93\xa2\x87\xbb\x2f\x51\x1c\xd4\xee\x2a\x2d\x85\x49\xb4\x4b\x21\xc1\x1f\xbe\x57\x23\x38\x1c\x6c\x5f\x78\x46\x87\xfd\x90\xce\xbc\x5b\x49\x5a\xf9\xe4\x14\xf2\x96\x1b\x06\xa1\xc8\x43\x3b\x9a\xa3\x29\x2b\xcf\xf4\x24\x1c\x22\x71\x67\xf8\xd1\xde\x05\x4b\xa3\x3a\xd8\x1d\xa3\xeb\x3e\xc6\xe4\x0a\x6e\x26\x85\x4a\xf3\x49\x54\x01\x71\xb7\x5d\x75\xfb\x9a\x8d\x12\x93\x78\x27\xfd\x59\x4d\x31\x7b\x7a\x8d\x9f\x1c\x2f\xca\xbd\xa5\x63\x75\x56\x8c\x3e\x9e\x51\x4c\x2e\xff\xfc\x38\x78\x36\x3d\xcf\xad\x9f\xd9\x54\x36\xb0\x22\xe8\x77\x2a\x88\xcb\x71\xe8\x03\xbf\x90\x38\x19\x62"}, -{{0xfe,0x71,0x72,0x27,0x83,0x64,0x19,0x4b,0xcf,0xef,0xb4,0x78,0x31,0x42,0xb7,0x9f,0x59,0xd5,0xfd,0x97,0x8b,0x1e,0x47,0xc3,0x14,0xd7,0x8d,0x4c,0xb3,0xf6,0x1c,0x8a,},{0x2e,0x82,0xcc,0xe4,0x79,0x10,0xc7,0xe2,0xa7,0x9b,0xc1,0xf4,0x19,0xdc,0x3c,0x3d,0xf5,0x4f,0x23,0x29,0x1f,0xc8,0x19,0x3e,0x82,0x58,0xcc,0xd2,0xfd,0x38,0xd5,0x48,},{0xf6,0xc2,0xa4,0x29,0x6b,0x9a,0x34,0x07,0xc6,0xd7,0xa5,0x67,0x9d,0xae,0x86,0x66,0xb5,0x03,0xd1,0xa1,0x7e,0xac,0xf7,0x1d,0xf4,0x93,0x79,0x1b,0x8f,0xf0,0xc0,0xaa,0x8e,0xed,0x36,0xb3,0x27,0xa2,0x9a,0xb7,0x82,0x8f,0x46,0xf2,0x2d,0xe8,0x68,0xb6,0x28,0xb1,0xcf,0xd5,0x01,0xe8,0x59,0x9f,0xa3,0x16,0x93,0xb1,0x5f,0x61,0x08,0x0f,},"\x23\x50\x94\x51\xa0\x59\x96\x9f\x2b\x4b\xdf\xce\xe5\x38\x89\x57\xe9\x45\x6d\x1f\xc0\xcd\x85\x7e\x4f\x4d\x3c\x25\xa4\x15\x5d\x5e\xe9\x1c\x20\x53\xd5\x58\x06\x2e\xea\x68\x27\x95\x0d\xe8\x63\xbc\x9c\x3d\xf9\x67\x2c\xde\x8b\xa7\x41\x74\x4e\xbb\xdd\xb4\x5e\xc1\xf4\x28\x45\x70\xfd\x0a\xac\xd0\x7e\xa5\x8c\x58\x1b\xe2\xaf\xc9\x5a\xe4\x44\xe6\x78\xed\xc2\xa0\x24\x39\xf3\x87\xce\xc9\x82\xea\x3a\x44\x81\x4a\x8a\x30\x2b\xb3\xbf\xe8\x22\x8d\x58\xde\x03\x9d\xeb\xdf\x7c\x2a\x7e\xdd\xb4\xe7\x1c\xa4\x74\xf9\x4f\x7e\x2b\xd8\x9d\xc6\x5b\x16\x10\x73\x3c\x91\xff\xf8\x9b\xd4\x99\xf4\x01\x54\xa6\x19\x8f\xdf\x5e\xc7\xad\x37\x22\xd9\x25\xb2\x92\x19\x6c\x42\x94\x99\x07\x5b\xe0\xc5\xb6\xda\x9c\x09\x0c\x07\x91\xa7\x01\x9e\xb5\xe7\x36\x6b\xe6\xce\x58\xab\x2f\x04\xfe\xcd\x91\x27\xc4\x27\x18\x04\x7b\xf4\x70\x30\x69\x15\x21\x31\x2c\x08\x77\xaa\x3f\x36\xcc\x5f\xbc\x9c\xaa\xe0\xfd\xe3\x94\x5d\x2a\x86\x8e\xe2\x50\x2a\x38\x33\x20\x8e\xb8\x50\xa1\x63\xcf\xcb\xf6\xda\x9e\xe6\xad\x9f\xe0\x67\xfe\x24\x19\x86\xfe\x44\x36\xd6\xae\x4e\xdc\x61\x56\x19\x38\xe2\xa3\x3f\x4a\x33\xdb\x63\xf6\x9d\x3f\x1a\x88\x50\xed\x40\x02\x88\x69\x16\x41\x03\x48\x8f\xb7\x95\xcd\x82\xca\x06\x7f\xe1\xb4\x89\x7c\xaa\x49\xa7\xca\x9a\x80\xf3\xa8\x15\x1f\xd1\x3b\xbb\x7f\xf3\x50\xe8\x57\x9f\x56\x5d\xc1\xc4\xa9\xca\x93\x8d\x27\xb1\x5b\x3f\x85\x8e\xf4\x5d\x3d\xd7\x8b\x2c\x35\x86\x35\x35\x63\x15\xf5\x5a\x97\x52\x8e\xcf\xec\x5d\x11\xa5\xb7\x21\x50\x31\x07\xfa\xa4\x06\xc1\x70\x34\xe6\x01\x47\x4b\x3b\x60\xcf\x48\x69\x2e\x26\x92\x61\x15\x8f\xc3\x53\xd4\xdf\x42\x74\x38\x13\x57\x79\x0b\x77\x56\x08\x7b\x00\xcc\x79\xe3\xb9\xd2\x8a\x3f\x24\x39\xfe\xbf\x19\x9e\x64\xa8\xb3\x7c\x91\xb5\xa4\x33\x4e\x33\x54\xe8\xfa\xf3\xa3\x61\xe8\x56\xc5\x4b\xda\xa4\x3b\xfd\xcd\x6e\xe6\xc9\xf9\x67\x95\x88\xf6\x06\x99\x50\x83\x23\x48\xaa\xcb\xa2\xbf\xee\xba\xca\xa2\x07\x1d\xdc\x7d\x77\x89\x8e\xf0\xf6\x87\x93\xcd\x25"}, -{{0xa9,0x51,0xe4,0xe6,0xba,0x9f,0x1f,0x0b,0x35,0x48,0x31,0xc9,0x86,0x94,0x24,0x48,0xfa,0xed,0xe3,0x7e,0x11,0xb0,0xf2,0x47,0xda,0x27,0x06,0xdc,0xee,0xf7,0x3a,0xc7,},{0x30,0x36,0x20,0x14,0x97,0x4b,0xf7,0x5c,0x84,0x95,0xc2,0xe2,0x71,0xe7,0x13,0xd5,0x73,0x84,0x38,0x4d,0x0a,0x5d,0xa8,0x8e,0xde,0xea,0x79,0x27,0x9c,0x0c,0x58,0xec,},{0x02,0x78,0xc8,0x6a,0x15,0x20,0x8d,0x9b,0xe5,0xb1,0xe1,0x57,0x47,0x61,0x86,0x1b,0x8a,0xf7,0x2a,0xe0,0x8d,0x40,0xcd,0xcb,0xec,0x35,0x4e,0x65,0xa9,0xc3,0xd0,0xa0,0x6b,0x5f,0xcb,0xb2,0x97,0xd0,0x9b,0xef,0x39,0x74,0x62,0x39,0x59,0x86,0xc3,0x09,0x3e,0xeb,0x22,0x64,0x4c,0x00,0x3c,0x30,0x78,0x17,0x8c,0xdf,0x67,0x4e,0x99,0x0a,},"\x20\x57\x7d\xca\xc8\x91\x74\x88\x5e\xed\xb0\x62\x48\x9c\xd5\x12\xfa\x72\x86\x3e\xc5\x43\x8e\x31\xe9\x58\x78\xb7\x5c\xe2\x77\x2a\xee\x62\x90\xa0\xba\x3c\x8f\x64\x2c\x1d\x0e\xf5\x5d\xa8\xd5\xbc\x14\x84\xf8\x3b\xb9\x87\x6c\x7a\x8c\x0b\x6b\x60\x9b\x94\xd1\x12\xa0\x6f\xc8\x3c\xe8\xd2\xc1\xe0\x8e\xd6\xc7\x35\xe5\x7b\x24\x4a\xad\x6e\xcf\x70\x75\x36\x3d\x56\x5b\xa4\x78\x65\x69\x5c\x84\x23\x51\x09\x09\xe0\xa3\xdb\x4b\x61\xed\x7a\xa6\x7a\x74\x71\x33\x1e\x83\xa0\xc5\x8b\x82\x20\xa6\x24\x5f\x65\x66\x15\x49\xc1\xa1\x2d\x4c\x0d\x50\xc3\x26\xfb\x94\x91\x7c\xbd\x07\xbe\x51\xe8\x3f\xe8\xbb\x3e\x46\xca\x01\xb0\xa2\x60\xda\xaf\x1d\x6a\xbe\x37\x03\xd6\xa9\x25\x11\x3b\xb4\xd5\x7e\xa1\xa4\x8b\x4c\x7d\xbd\xaa\x03\xee\xa8\x14\xa4\xb5\xf0\x2e\x1d\xfb\x54\x5c\xc6\x23\xfe\x17\xa3\xbb\x18\xe4\x37\x3f\x5f\x7e\xc2\xfb\x52\x17\xd2\x3e\x4f\xed\x54\xa7\x72\xe1\x13\x23\xe7\x30\xaa\xd7\xef\xca\x8c\x46\x44\x00\xe7\x67\x90\x55\xfc\xc1\x25\xa8\x76\xef\x7b\x8b\x9d\xe1\x86\xe2\x29\xa7\xab\xf1\x91\xd0\xc5\x6d\x91\x81\x5f\x67\x87\x2e\x95\x7b\xfb\xc7\x63\x4a\xac\x40\x35\x76\xa5\x8f\x42\x7b\xdb\xb3\x0e\x8c\x4b\x6f\xc6\xc4\x47\x74\x10\x24\xeb\xb5\x03\xa5\xa9\x02\x51\x24\xa4\x88\x7f\x82\x5a\x43\xee\x94\x0f\x21\x0a\x1b\xd5\xae\x4f\x67\x32\xd6\x0f\x95\xf2\xb8\x32\x01\xc4\xc6\xdf\xe2\x79\x41\x2d\x75\x02\xa5\x21\x1f\x8f\x48\xf8\x00\xdb\x30\xfc\x37\x76\xc4\xed\x3a\x38\xbb\x46\x34\x82\x2c\x98\xa6\xd6\xdd\x32\x33\xbe\x60\xe4\x2c\xca\x45\xa3\x16\x3c\xc8\x4e\x9e\x8d\xa6\x47\xc0\x71\x1b\xc4\xc6\xcc\xd6\x5a\xa1\xe9\x72\xc0\x74\x04\xd1\x03\xe7\x4b\xcc\x31\xa7\xe2\xc3\xee\xa5\xac\x92\x57\xab\x42\x89\x47\xab\x3d\xd3\xfb\x15\x3d\x90\x69\x4a\x40\x73\x37\x3c\x4d\xd9\xce\xb1\x31\x15\x4f\xe8\x77\x47\x3f\xd9\x96\xf4\x24\xf3\x3e\x31\x6e\x4e\xb0\x2b\x8c\x75\x13\xbe\x69\x98\xe5\x16\xcb\xba\x54\xd9\x4c\xd0\xa4\x35\xe0\xff\xcc\x2c\x0a\x8e\xf7\x2b\x63\x0e\xc2\x47\x81\x06\x6a\xa5\xef\xb9"}, -{{0x38,0xa9,0xb2,0xd4,0x9b,0xa8,0xb8,0x2f,0x30,0x1a,0x57,0x72,0xce,0xa0,0xef,0xc2,0x21,0x84,0x55,0xc8,0xb2,0x18,0xb2,0x2c,0xba,0xa2,0xaa,0xd2,0xd7,0xad,0x3b,0x35,},{0x9d,0xf5,0xea,0x1f,0x78,0xf8,0x10,0xa5,0x21,0x77,0x46,0x02,0xbb,0xba,0x49,0x42,0xf0,0x45,0x92,0x38,0x96,0x6c,0x8b,0xcd,0x21,0x90,0x0a,0xfb,0xf3,0xd8,0x42,0x93,},{0xe1,0x9e,0x62,0xac,0x53,0x9a,0x9c,0xa2,0x51,0xd1,0x2d,0x4c,0x71,0x05,0x5b,0x0a,0x3f,0x58,0x1d,0x19,0xf2,0x68,0x2e,0x67,0x24,0x04,0xc7,0x8a,0xc1,0xf1,0x2b,0xbe,0xfc,0x91,0x51,0x92,0x76,0xa5,0xcb,0xe1,0x6f,0x52,0x0c,0xf7,0xa7,0xf6,0x87,0xa2,0x40,0xf0,0x32,0x91,0x57,0xc5,0x9f,0x50,0x02,0x6a,0x58,0xdc,0xdc,0x50,0xfc,0x08,},"\x17\x78\x16\x7c\x49\xb3\xa4\x4d\x4a\x5b\xa8\x38\xb7\x38\x85\x53\xb1\xe1\x3d\x36\xea\x4f\x86\xd3\x02\x42\xe1\xa8\x22\xa3\xbb\xaf\xf5\xce\xa6\x3e\x2a\xe2\xa4\x63\x5b\xe2\x36\xfe\xf2\xb8\x13\x5d\x14\xfb\x62\x1c\x0b\xb7\x73\xc9\xc1\x77\x53\xf8\x09\x26\xeb\x55\xd0\xf1\x15\xbd\x09\xa8\x85\xd8\x44\xb8\x18\xc9\xf0\x44\x89\xa3\x31\xbb\x5e\x03\x2b\x8e\x58\xcd\xa3\x69\x49\xc5\xa8\xd0\x8b\x55\xbb\x8d\xe9\x65\xe1\xf9\x0d\x3b\x9c\xfe\xec\xfc\x6a\xd9\xa4\xee\x5c\xb4\x04\x7e\x94\x50\xac\xdc\x64\x64\x01\x66\xa8\xc0\x69\xea\x84\x9a\xeb\xdd\xac\x1a\xe4\xaf\xec\x91\xdd\xd1\x7f\xa5\x55\x3f\xa8\x7c\x56\xf7\xe5\x1e\xc1\xcd\x6b\x5c\xc2\x33\x51\xd0\x57\xa4\xce\x4a\x89\x23\xc8\xae\x6a\xc7\xa8\xaf\xdc\xc0\x88\x1c\x0e\x74\xeb\xb0\x24\xef\x72\x96\x16\x2c\xb9\x3c\x68\xe5\x0b\xbb\x07\x4e\x65\x1a\xc8\x7d\xac\x9e\xa5\x9d\x4c\x3f\xbf\x0f\xe3\x79\xf3\xe9\x7a\x24\x56\x6e\xca\xe5\x43\x03\xbc\xfb\x6f\x0c\xc9\xf1\x5f\x66\x39\x43\x0e\x66\xb1\x9a\x42\x78\x49\xfd\xff\xf8\x33\xdf\x02\x68\x9e\x9d\xe4\x40\x06\xc9\x03\xc5\x59\x18\x34\x59\xb9\xf4\xa9\x7f\x54\xa0\xf2\xa2\x8d\xf7\xb0\xe9\xde\xed\xa8\x23\x9d\x7b\x51\x69\x77\xf5\xe7\xd6\x97\x1b\x45\x02\xe9\x88\x5f\x75\x0a\xf8\xd1\xa6\x66\x9e\x25\xe7\x7d\x5f\x32\x7c\x77\xc8\x7a\x86\xe0\xa1\x87\x2b\xc9\x6a\x76\x06\x0f\x5f\x8a\x0c\x40\xcc\x97\x3b\xfc\x7f\xe6\xed\x9b\xca\x78\xf8\x84\xe6\xa2\x82\x8b\x94\xd4\x89\xd3\x2a\x0f\xd3\x37\xe6\x9d\xb8\x3f\xb8\x78\x9a\xfd\x4e\x8e\xf5\x4c\x22\xa7\x8c\x25\x87\x46\x8b\x9a\xe0\x71\xba\xe3\xb2\x02\xd3\x18\x3a\xd5\xf0\xf8\xe8\x42\xe5\xa8\xde\x85\xbf\xff\x49\xe0\x3c\x83\x81\xbc\xa7\xfd\x42\x78\xdd\xcc\xaf\x01\x34\xfb\x55\x93\xa3\x95\xa7\x7a\x5c\xbd\x43\x45\x93\xbc\x4a\xd0\xff\x4b\x84\x00\xec\x67\x4c\x4e\xca\xf1\xd5\x77\x54\xbe\x0c\xb2\xfa\x9a\x64\x41\xa9\xab\xad\x7b\x42\x19\x7a\xd8\x2e\x50\x82\x7e\x4a\x42\x45\x57\x3a\x8f\x0e\xf8\x7f\x58\x22\x8a\x28\x67\xf4\xb3\xb8\x34\xb6\x63\x50\x37\x94\x0a"}, -{{0x9a,0x17,0x17,0x87,0x36,0x89,0xa0,0x3c,0x11,0x2d,0xd6,0xb4,0xd7,0x6a,0xe7,0x3b,0x89,0xb4,0x16,0xa5,0x98,0xce,0xec,0x20,0x9e,0x27,0x96,0x1e,0x7b,0xb1,0xee,0x8a,},{0xee,0xca,0xd1,0xe0,0xe4,0xb8,0x63,0x29,0x18,0x81,0xa8,0xc2,0x41,0xdb,0x9c,0xcf,0xff,0xe4,0xe5,0x5d,0x8b,0x5a,0x42,0xf3,0x07,0xb4,0x43,0x6a,0xcd,0x06,0x49,0xa6,},{0x1a,0xf8,0xbe,0x09,0x55,0x38,0x96,0x58,0x00,0xd8,0xef,0xf6,0xd7,0x23,0xd0,0x28,0xd6,0x5d,0x0e,0x9c,0x6e,0xb5,0xe9,0xd1,0x25,0xbb,0x3b,0x17,0x83,0xf1,0x1e,0xf7,0x07,0x9a,0x49,0xa8,0x07,0xe2,0x7e,0xf1,0x26,0x0b,0xe2,0x6a,0x3b,0x23,0x1d,0x03,0xb2,0xae,0x15,0x1e,0x49,0xf6,0xf1,0x89,0xf1,0x5b,0x1c,0x83,0xea,0xb0,0x1c,0x02,},"\xe2\x65\x80\x47\x09\x01\xa0\x7a\xb0\x93\x1a\xa2\x38\x29\x80\x2c\xe0\x4d\xa5\x9f\xdc\x2f\x77\x3b\xc5\x67\xf1\xe6\x5b\x4f\x2e\x2d\x4a\x1a\x6a\xec\x1f\x54\x15\x8a\xdf\xce\x9b\x09\x97\x90\xb5\x03\xa1\x3d\x22\x09\x7a\xe2\x3e\xbc\xcf\x92\x3f\x3b\xb1\x98\x6d\x6e\x49\x11\x1a\x8c\xf0\xd4\xeb\x82\x36\xbf\xe0\xd7\xc9\xe9\x3a\x5e\xfc\x7f\xeb\x8e\x6a\x9c\xd1\xb8\xd9\x21\xef\xa2\x1e\x44\x9f\xf4\x9e\x06\xc1\xcc\xfe\xa3\x1f\x93\xe0\x33\xc3\xc2\xa5\x4d\xdb\x0f\x65\x3a\x09\xfb\xd1\x8a\x70\xb5\x63\x15\xf1\x93\xe7\xbe\x56\xe5\x16\x8f\x59\x56\x38\x21\xd4\xbc\x3b\xbb\x0e\xaa\x20\x48\x28\x6b\xbe\xee\x5a\xa3\xf3\xe7\x53\x6c\xf2\xb7\x50\xfd\x32\x26\x02\xbb\x38\x47\xce\xca\x39\xb7\x54\x74\x32\x2d\x76\xb1\xde\x80\xfa\x2e\xad\xba\x15\x2d\x6f\x8f\x02\x0d\x4d\x93\x1c\x53\xf0\xa2\x80\x12\x24\xd3\x5d\xeb\x6e\xc1\x3b\x01\x48\x73\xe6\x89\x90\x36\x07\xde\x96\xd9\xb7\xa7\x43\xa8\x87\xd2\xf4\x8d\xaf\x2e\xd2\xee\xfb\x20\x2a\xbf\x60\x82\x79\x69\x81\x12\x3b\x96\x6e\x93\x6d\xcf\x34\x83\xe2\xd2\x4d\x69\x4e\xcb\x86\x5f\xbe\xb6\x96\x9f\x34\x70\x27\xfb\x8b\x17\x5d\x24\xa4\xc0\x45\xc0\xbb\x4a\xb5\xe0\x2d\xdc\xbe\x77\xd4\x75\x6c\x46\xd1\x37\xb0\x94\x47\x3a\x02\x30\x7a\x10\x83\x40\xac\xad\x9d\x03\xba\xe8\x40\x3a\xf1\x99\xcb\x75\xca\xe3\x16\x2f\x38\x15\x81\x3c\xc6\x8b\xf2\xa5\xe4\x99\xe5\x94\x92\x11\x49\xf3\xbb\xd2\x14\xda\x51\x37\xe7\x56\x52\x15\x59\xdc\x80\xd9\xa4\xb7\x4a\x0f\x49\x43\x02\x2c\x7c\xd5\xfc\xa4\x23\x15\xe0\xbc\xee\xae\x90\x69\x61\x5c\xe6\x7a\x04\x38\x24\x12\x31\x3a\x31\xd6\x7b\x34\x6c\x32\x9a\xd8\x2e\x74\x2c\x0a\x6c\xe0\xa6\xa0\x24\x54\xc1\x13\xe5\x20\x22\xf3\xcc\x03\xfd\xa6\x91\xeb\xdf\xe1\x4c\x53\xc8\xce\x5c\xa9\xb9\x32\xca\x1a\x38\x6e\x3e\xb4\xe9\x0a\x4d\xc6\xe8\xad\x85\x33\xb5\xaf\x1a\xae\xf5\x00\x31\x28\x65\x5c\xa6\x4f\x67\xfc\xd9\x7c\x6a\xc8\x03\x00\x24\x04\x90\x0b\xc0\xfa\xe9\x84\x63\xbc\xc3\x14\x09\xf9\x98\x17\x48\x78\x9a\xde\x2d\x07\x78\x3b\xc3\x2b"}, -{{0x43,0xbd,0x92,0x4d,0xb8,0x15,0x60,0x08,0xc6,0xb3,0x99,0x4a,0x81,0x30,0xd4,0x27,0xd5,0x14,0xdb,0x8a,0x61,0x3b,0x84,0xdf,0xb0,0xb8,0xe0,0xde,0x6a,0xc3,0x06,0x76,},{0x1b,0x34,0x61,0xc2,0x69,0xd5,0xb0,0x06,0x2d,0x5d,0xf6,0xfa,0x65,0x4a,0x25,0x86,0xf6,0x47,0xa0,0x68,0x42,0x18,0xa0,0x6e,0x5e,0x2f,0x7b,0xad,0xfb,0x39,0x41,0x31,},{0xd2,0xa0,0x5d,0x88,0xd9,0xd5,0x43,0xd9,0x4d,0x57,0xec,0x88,0xae,0x55,0x68,0x17,0x50,0xf2,0x0b,0x9b,0xe9,0xc1,0xe9,0x18,0xcd,0xaf,0x45,0x77,0x67,0xf2,0x94,0x8d,0xd6,0x29,0xe9,0x4f,0x06,0x8e,0xdc,0xf3,0xd9,0x92,0x7e,0x33,0x02,0x34,0xba,0xdc,0x3a,0x02,0xfa,0x5a,0xd3,0xd9,0xd8,0x5e,0x94,0x8c,0xb0,0xb0,0xcb,0x3c,0xd7,0x0a,},"\x61\x84\xe6\x48\x0c\x42\xe9\x6c\xc8\x77\x26\x9b\x16\x37\x15\x45\xff\x95\x23\xc4\x5e\xa8\x8e\x76\xa1\x34\x8c\x68\xae\x7f\x31\x8b\x08\x8f\xe4\x61\x09\x28\x23\x91\x85\xb6\xb5\x5b\xfa\x0f\x43\x64\x4c\x4a\x4c\x97\xc5\x6e\xd7\x7d\x08\xb1\xf4\xaa\xd2\xf4\xaa\x06\x99\x94\xab\xec\xa9\x6b\x7b\xf8\x1b\x80\x64\xea\x43\x50\xd8\xa8\xb0\x22\x97\xa5\x13\x08\xb6\x1c\x57\xc8\xf1\x87\x3c\x6f\x97\x00\x7a\xca\x31\x80\x42\x9e\x73\x0a\x66\x43\xf2\x87\x33\x54\x7b\xcf\x7b\x9a\xdf\xe3\x27\xe8\x57\x36\xbd\x04\xaf\x7f\x1d\x9f\x4f\xb8\x4a\x7f\x3a\xff\xdf\x4e\x22\xb5\x74\xec\xb4\xbc\x88\x36\xb1\x0b\x84\x53\xae\xaa\x5c\x1b\xf1\x32\x24\x8b\x82\x6c\xc5\x23\x0f\x75\xe0\x75\xfa\xc9\xf0\x37\x56\x11\x36\xe0\x06\x43\xd0\x82\x53\xe7\xad\x65\x2f\x70\x2c\x0d\x15\xb6\xd7\xd4\x8a\xa6\xf8\xe9\xb5\xf5\xcc\x14\x6e\x3f\x15\x6f\xb2\x52\x27\x51\xc3\x71\x00\x41\xbd\x92\x2f\x37\xa5\x03\x77\xe0\x28\xb0\xc4\xe4\xbc\x34\x65\xd7\xc8\x4a\xf6\xa5\xfb\x42\x7a\xcb\x3b\x41\x37\x8b\x10\x2b\xda\x46\xd8\xf6\xf2\x03\xa5\xff\xcf\x39\x5d\x43\x5e\x93\x45\x8a\x0b\x0a\x4c\x2e\x77\x82\xfa\xfe\x11\x9f\x76\x9f\x67\x05\x8c\x66\x77\xf6\xd1\x0d\x9c\xf5\xcb\x87\x48\xe1\x80\x57\x98\xed\x23\x3f\x6f\x93\x0e\xee\x0e\x50\x75\xbc\x58\xb9\x7a\xf9\x17\x7f\xda\x75\xd5\x37\x08\xbe\xb0\x4d\xc4\xf1\x9a\x43\xe7\x68\x07\x46\x09\xf1\x40\x65\xf4\x8f\xda\xd5\x07\x7c\xe1\x09\xba\xcc\x35\x71\x74\xa6\xb7\x95\x6f\x6e\x7f\x32\xe3\x84\x15\xbe\x52\x63\x70\xfa\x58\xc3\xc0\xb3\x1f\x51\xe6\xcd\x4b\x2c\xf2\x7f\x8b\xcb\xc2\x12\x59\xd9\xe5\xc3\xb5\xc2\x94\x6a\x9f\xc1\xb0\x0d\x9d\x15\xc3\xb7\xd8\x0b\xfd\x9d\x05\xdb\x91\xd2\x49\xd3\xe4\x2d\x89\x56\x68\x20\x44\x54\x8d\x83\xbd\xa8\xd5\xcc\x92\x12\x44\x2f\x30\xb4\x5c\xf4\xae\xad\x80\xcc\xe9\xb3\x51\x2c\x39\xc5\xc7\x37\xd3\xf8\xd7\x47\xaf\xba\xb2\x65\xaf\x5e\xee\xf8\xca\x93\x62\xec\x76\xe9\x43\xb0\xa0\xd7\xa3\x9f\x3d\xb1\x1e\xca\x14\x45\x8a\x7b\x59\x2e\x5e\x4f\xf2\x27\x5d\xd4\x8b\x28\x53"}, -{{0x8f,0xb0,0x86,0x20,0x6d,0xd9,0x5a,0x26,0x21,0xf5,0x98,0x56,0x0c,0xcb,0x28,0x1f,0x82,0x73,0xc8,0xfc,0x72,0xe2,0x36,0x11,0x08,0x9b,0xaa,0xc8,0x9d,0x3c,0x3c,0x78,},{0x20,0x27,0x6e,0xf4,0x79,0xf4,0xd4,0x52,0x3a,0xb7,0x74,0x20,0xd4,0x24,0xe8,0x81,0x9c,0x33,0xc8,0x37,0x79,0xed,0x80,0xc7,0xf6,0x66,0xe8,0xf4,0x40,0x3f,0x94,0xd7,},{0xa9,0x30,0x5e,0x00,0x16,0x00,0xd5,0x97,0xd0,0x5e,0xf6,0x71,0x69,0x9b,0xf0,0x9f,0x0d,0xcc,0x0c,0x44,0x47,0x5d,0x3c,0xa3,0x1e,0x7f,0xf1,0xbf,0xfe,0xdc,0x0c,0x67,0xda,0xa1,0xf3,0xb7,0x6a,0x03,0x59,0x48,0xc5,0x9c,0xd8,0x7f,0x82,0x45,0x3a,0x40,0x95,0x0a,0x1c,0x97,0x03,0xc2,0xe7,0xd9,0x28,0x0e,0x73,0x03,0x96,0x6d,0xa3,0x01,},"\xf0\x29\x03\xed\x42\x66\xe8\x49\xa4\x48\x52\x05\x95\x4f\xff\xa8\xa1\x08\xc3\x23\xb7\xe3\xf8\x43\x31\x04\x35\x14\xe4\x85\x56\xab\x01\x94\x97\x23\x3a\x5a\x12\x7b\xff\x3c\xd7\xc9\x70\x86\xbe\xce\xf5\x38\xb3\xf3\x39\xd7\xd0\x6e\x53\x2d\xc7\x32\x5e\x59\x7a\xe3\x57\xf8\x16\xde\xa4\x2a\x6a\x22\xc7\x9d\x22\x07\x4a\x2e\x1a\xd8\x02\x3c\x42\x4b\x7e\x09\x6e\x5a\xd8\x89\x7b\x05\xef\x7d\x00\xd3\x0a\x04\xaa\xf2\x98\x1e\xdd\xff\x2b\x34\x7f\x1e\x27\xe2\x0a\xab\xbe\x7e\x7a\x95\x44\x97\x8e\x09\x2b\x00\xcc\xe4\x20\xab\xa0\x61\x87\x37\x4f\xfb\xb3\x7b\x4c\x22\xd7\x5f\x04\xe5\x75\x90\xf6\x10\xa2\x73\x47\x28\x6c\x29\x83\x12\xa6\xc9\xb1\xbd\xf2\x4f\xbd\xa8\x51\x3c\x4f\x83\x56\xcc\xf7\x57\x06\x8f\xfc\x11\xbc\x65\x11\x37\x83\xa5\xdd\xe7\x72\x2f\xaf\x4c\xeb\x19\xfb\xb6\x2f\x40\x70\x2e\x2c\x6e\x6a\x8b\xb4\x9e\xf4\x04\x46\x45\x0c\x4c\x59\xa2\x99\x09\x44\xda\x47\x44\xf6\xee\x77\x0b\x93\x0c\x24\x66\x69\x81\x3c\xe5\xa9\xf5\xa4\x7d\xd8\x03\x88\x98\x1b\xfc\xc3\xa5\x6b\x5b\xe2\xc4\xc7\xe6\x59\xa2\xe9\x18\x2d\xec\x0a\xaa\xfe\x90\x31\xaa\x39\x54\xd4\xfe\x7c\x43\x11\x96\xa5\x61\xa5\xb7\x8e\xab\xa6\x4f\x3d\xb1\xb5\x86\xc5\x3b\x16\xf6\x79\xa8\x49\x21\xa6\x42\xc2\x60\xe4\x65\x3a\x61\xde\x10\x8e\xbd\xe6\xf7\x05\x3a\xfa\x2c\xb3\xf3\x66\x8e\xde\x12\x10\x20\xdd\x1b\xac\xe8\x41\x8a\xeb\xac\x3a\x5b\xd5\x14\x2f\x10\x5a\xc2\x6f\xe4\x9e\x5f\xb1\x40\xc1\x9b\x22\xd5\x4a\x62\x91\xdf\xc9\x54\x67\x02\x47\x88\x16\x46\x87\x4d\xef\xad\x81\x49\x95\x51\x9f\x62\x60\xe9\x77\x4a\x8d\x18\x5c\x37\x88\x1b\x4f\x25\x43\xc4\xb6\x3f\xbf\x19\x85\x01\x6a\xb4\x1c\x4d\x72\x8c\xbc\x90\xb3\xab\x87\x62\x67\xbe\xd4\x1d\x0c\x09\x02\xf6\xb5\x0e\x8f\xa9\x06\xfc\x47\x88\xf7\xb8\x20\x46\x73\x06\xe0\xfe\x9e\x03\x6a\x0a\x00\xf8\x04\xf9\x1c\x3c\xa7\x18\xb9\x5f\xf6\xd9\xe2\x20\x4b\xc3\x16\x1b\xf7\x0f\xcc\x17\xb2\x96\x4b\x56\xbc\x61\x2e\x29\x40\x2d\x96\xf5\x09\x86\x51\x4b\xc7\xd8\x31\xd5\x8e\x42\x79\x37\x86\xd5\x80\x6f"}, -{{0xaf,0xa1,0xb8,0x46,0xc2,0x10,0xb5,0x23,0x00,0xe9,0x76,0x96,0xf8,0x1b,0x8e,0xa7,0x74,0xd1,0xdf,0x12,0xe6,0x12,0x52,0x7c,0x55,0x74,0x7f,0x29,0xc1,0x93,0x73,0x96,},{0xb6,0x09,0x56,0x6b,0xbd,0x19,0x47,0xbd,0x7a,0xfa,0xce,0xb1,0x43,0x89,0xe8,0x36,0x22,0x71,0x69,0x21,0x5f,0xab,0x66,0x85,0x1a,0xa5,0xd7,0x0d,0x6e,0x2e,0x3b,0x89,},{0x98,0xb0,0xc6,0x31,0x3c,0xec,0xaf,0x7c,0x82,0xcb,0xde,0xb3,0xd0,0x28,0x06,0x41,0xc6,0x1a,0x06,0x0f,0x65,0xe5,0x63,0xaa,0x93,0xce,0x18,0x30,0x0a,0x9b,0x58,0x27,0x2d,0xc8,0x68,0x0b,0x48,0x5e,0x8c,0xd1,0x1c,0xf8,0x0f,0xdc,0xa8,0x68,0xfa,0xb3,0x65,0x37,0x83,0x84,0xa1,0x42,0x72,0x7f,0x2f,0x84,0x4f,0x87,0xcf,0xdf,0x19,0x05,},"\x4c\xac\x1b\x1f\x4b\xd4\x82\x84\xdc\xc9\xaf\xc8\xb5\x95\x5b\x64\xb4\x36\xdb\x70\x4b\x03\x35\xd9\x75\x5c\xc1\xf9\x74\x77\xf8\xd3\x23\xcb\x64\x10\xef\x14\x6a\xb8\xa9\xef\xb9\x52\x6d\x8b\x62\xe3\xbb\xad\x1f\x72\x95\xf4\x7b\xa9\xf0\xde\x95\x8f\x8e\xc9\xb7\x7a\xb4\x22\x32\x43\x7e\xd9\x74\x85\x64\x44\xcd\x22\xe2\x0b\xe3\x5e\x91\x81\x3b\xff\x4b\x01\x6f\x81\x0d\x0f\x61\xd8\x9f\x6b\x61\x4d\xb3\x3f\x34\xbd\x09\x98\x5b\x59\x3f\xe3\xe0\x6e\x06\x5b\x7b\xc6\xcd\x39\xd5\x5c\x2c\xfb\xec\x7b\x6d\x59\xc0\xb3\x7d\xd1\xd0\xd3\x51\x35\xab\x1d\x1b\x04\xf2\xf3\x0c\x2f\x04\xf4\xba\x2b\x36\x58\x27\x38\x08\x1c\xf5\x91\x90\xf5\x28\x36\x3d\xb9\x44\xed\x61\x29\x31\xd1\xd5\x14\xc6\x21\x4f\x9a\xb9\x2a\xbb\x18\x33\x92\x61\x83\xac\x52\xfb\xa2\xa4\x55\x1e\x20\xe4\xc0\xac\x95\x9a\x49\xdd\xb1\x67\xa3\x81\xe0\x24\x1d\x40\xc0\x86\xe9\x0e\x52\xac\xa0\x17\x25\x89\x75\xdb\xab\x2b\xa4\x51\xee\x53\x9a\x71\x8f\x07\x6a\x58\x70\x9c\x66\x97\x41\x8d\x9c\x6f\x13\xe4\xd3\x91\x36\x8b\xf0\xe8\xbd\x8f\x29\x32\xdd\x95\xce\xaf\x7a\xac\xa1\x24\x11\x47\xd3\x41\xa3\xac\xd0\x8d\xc3\x29\x05\x48\x35\x72\xb8\x9a\x80\xcc\x47\x23\x14\x68\xab\x8d\xe3\x59\xdd\x52\x5a\x62\x57\xcf\x19\x6c\x2e\xcb\x82\xfa\x8a\x78\xaa\x3a\x85\x1c\x7c\x96\xca\x25\xbf\x7c\xa3\xdc\xf3\xca\x21\x45\x3d\x0d\xfd\x33\x23\xd5\xa4\x22\xde\xc8\x43\x16\x10\x2f\x68\x4c\x35\x9f\x22\x6b\xb5\x37\x79\xc0\xb9\x95\x09\x39\x28\x1e\xf7\x9a\x58\xc0\x11\x99\x3e\xac\xe0\x85\x49\x7a\xfa\x4d\xaf\x64\xc9\x68\x7b\x0a\x11\xaa\x11\x6c\xfa\x7b\x03\x93\x62\x41\xa5\x56\x7b\x64\x6e\x7e\x42\xe9\xfb\x59\x24\x05\xb8\xfa\x3c\x0a\x82\x1f\xc3\x12\x1b\x45\xb1\x75\x3c\xec\x9a\x83\x94\x7d\x21\x1a\x45\x49\x9b\xd6\x37\x90\xb8\x7f\x01\x47\x2f\xe5\x66\xd8\x76\x96\xef\xed\xbb\x74\xed\x00\x04\x8c\x38\x4b\xa7\xf0\x27\xb3\xaa\x42\x98\xdc\x41\x10\x34\x9f\xed\xf5\x2a\x96\xcd\x05\xd0\x8b\xd6\x35\x77\x1e\xd4\x51\x07\x38\xd8\xf0\x7a\x60\x21\x24\x4d\x19\x03\x57\x9a\x3e\xa7\x39"}, -{{0xc8,0x59,0x13,0xa6,0x87,0x78,0x77,0x13,0x10,0x01,0x62,0x3c,0xcd,0xa9,0xcd,0xc1,0x2b,0x9d,0x40,0x43,0xb8,0xa8,0x37,0x93,0xc4,0x46,0x96,0x63,0x2c,0xd6,0x42,0x1c,},{0x9c,0xc6,0x7c,0x69,0x48,0xf7,0xbf,0x6e,0x55,0x6d,0x08,0x49,0xd3,0xb8,0xd2,0x03,0x45,0x7a,0x7b,0x61,0x54,0x9b,0x36,0x68,0x1d,0x75,0x4f,0x1d,0xc0,0x84,0x1e,0x96,},{0x01,0xfc,0xcf,0xdb,0x1f,0xb6,0x88,0x8b,0x03,0x10,0xa9,0x13,0x17,0x0f,0x7e,0x36,0x68,0x16,0xda,0xeb,0xe7,0x65,0x0d,0x72,0x51,0x3d,0x95,0x06,0xe6,0x6f,0x7d,0x62,0x20,0x8a,0x49,0xec,0xe0,0xaf,0x18,0x71,0x49,0x7f,0x45,0x41,0xef,0x60,0x5b,0xde,0x71,0x1c,0x9e,0x0a,0x12,0x05,0xef,0x48,0xf2,0x6c,0x03,0xdc,0x1a,0xd4,0xaf,0x03,},"\x91\xb5\x00\x9e\x83\xd0\xf6\x10\x33\x99\xc2\xd3\xfe\xec\x00\x84\x97\x3a\x30\x5b\xf4\x17\x6e\xc7\x82\x53\x75\x60\x47\x2d\xb1\x87\xa1\x1b\x4d\xcb\x4b\x2f\xfb\x7f\x06\x44\xfe\xb3\x94\xb2\x8e\x5b\xfe\x97\x24\x7c\x4a\x4a\x23\x1c\xf6\xe9\x16\xbf\x99\x34\x4c\xcd\xa8\x8a\x7f\x5d\x83\x1d\x6d\xe3\xd5\x63\xdd\x10\x2e\xae\xb1\x08\xc5\xbd\xce\x44\xe0\x63\x2d\x17\xe6\xfa\x55\xb1\x80\x67\xdf\x2f\xa8\xd2\x00\xa9\x86\x9f\x6a\xff\x92\x0c\x51\xd4\x6a\x1c\xed\x2d\x90\x3b\x1d\x9b\x6b\x07\x5f\xac\xbf\x91\xcd\x05\xeb\x41\xad\x81\x1a\x8e\xf4\x0d\x91\x18\x26\x10\x12\xc7\x2b\x89\x79\xf1\x51\x53\xdb\xb8\x56\x12\x93\xda\x9f\x8b\x77\xc8\xff\x14\xf7\x53\x87\x53\x6f\x00\x36\xd1\x71\x3a\x72\xce\x8c\x35\xb1\x06\x2f\x2c\x67\x32\xae\xbf\x32\x93\x67\x99\xb5\x1c\x2c\xbc\xd6\x57\x24\x13\xe7\xdf\xaa\xb8\x64\x1a\x02\xc1\x50\x23\x73\x81\xcf\x7a\x14\xe2\x2c\x74\xc6\xc2\x00\x09\xde\x7d\x3b\x7e\x69\xcd\x1b\x45\x84\xac\x2c\x01\xba\xba\xf9\x73\xc5\x6b\x38\x14\xbb\x00\x89\x72\x0e\x41\x96\x81\x06\xcf\x26\x50\x9d\x4a\xa5\x46\xfc\xad\x55\x34\xaf\x30\x3f\xfc\xa4\x2b\x16\xae\x6c\x93\xee\x06\xbc\x3c\xac\xe1\x2e\x4e\xc7\x18\x84\x4b\xd3\x0d\x22\x24\xcc\x48\x6d\x10\x6d\x1c\x45\x6b\xfa\x16\x5e\xa0\x12\x0f\xab\x3d\xf2\xc5\xab\x3a\x52\x3b\xbf\xa7\x89\xde\xed\x44\x03\x2a\xb0\xbe\x86\xeb\x7c\xc0\x9c\xdb\x7c\x07\xaa\x94\x8d\xd5\x27\x7c\x3d\xf1\xd9\xd1\x84\x35\x67\xde\xc8\x4f\x92\x88\xe0\x85\xb0\x5a\xe4\xb8\xaf\x2c\xea\x5d\x9a\x18\x4d\x50\xbe\xf8\x55\x50\xc8\x36\x61\x3d\x5d\x3a\xf5\xf9\xc2\x92\x8e\x6a\x89\x66\x0f\xa6\x27\x19\xeb\xff\x77\x3e\x46\xb7\x7e\x34\xbc\x04\x70\xda\x4d\x2c\xdb\xc7\x07\x1d\xa7\x58\xc4\xd3\x9f\xe6\x52\x01\xc8\x8a\xaa\x8e\x66\x03\xd0\xbb\xe7\xc3\xe9\xb2\xd9\xe4\x1b\x63\x46\x82\x09\x2f\x14\x73\x41\xad\x6d\x66\x7f\x20\xc6\x4e\x81\xa6\x8d\x62\x94\x67\xa5\x4d\xd8\x6e\x1c\xe1\x2c\x56\x0a\x6f\x9b\x64\x51\x2d\x6f\x38\x86\xcb\xb9\xf3\x7c\x37\xeb\x39\x85\xc8\xac\x38\xdd\x66\x82\xf4\x8f\xe1"}, -{{0xfa,0x1e,0x11,0xdc,0x83,0x64,0x20,0x8d,0x8e,0x1c,0xb6,0x6a,0x36,0x1b,0xe7,0xe8,0x4c,0x5e,0x36,0x81,0x66,0x58,0x7d,0x4f,0xdb,0x06,0xac,0xed,0x7f,0x62,0xe1,0x7c,},{0x4d,0x8e,0x6f,0x4b,0x34,0x15,0xdf,0x6c,0xed,0xab,0xfb,0x29,0x5c,0x19,0x84,0xfd,0x41,0x99,0x23,0xc6,0xac,0x41,0x76,0x4e,0x32,0xd2,0x2d,0xaf,0x37,0x2c,0x50,0xfc,},{0xe8,0x57,0xdb,0x08,0x7e,0x28,0xd6,0x75,0x0b,0xf5,0x4e,0x53,0x79,0x72,0x51,0xd8,0x43,0x99,0x89,0x57,0x6c,0x12,0xda,0x2d,0x9c,0x81,0x1a,0x14,0x87,0x7c,0x3b,0xd4,0x6c,0x4e,0xfa,0xb8,0x61,0xa1,0x0e,0xeb,0xe7,0xda,0x04,0xc0,0xb0,0xb4,0x45,0xc7,0xa3,0x90,0xa5,0x0c,0x13,0xde,0x36,0xf3,0xa3,0xc7,0xae,0x01,0x57,0x02,0x2c,0x0e,},"\x29\x4e\x63\xba\xcc\xcb\x80\x1b\xbf\x04\xc1\xf1\x9d\x0a\xee\x16\xf5\x65\x0a\x6e\x8e\xea\x6f\xe4\x11\x10\x66\x3e\xc0\x15\x32\xbd\x49\x60\xa5\x27\xf1\x5e\xca\x4a\xf2\xf4\xe6\xb7\xb0\xfc\x34\x0c\xf9\x7a\xa2\x34\xe9\x2c\xf7\xd6\x9d\x50\xe4\x00\x9c\x24\x96\xe3\xed\x4d\x9a\xff\x00\x0f\x9e\x18\x52\x75\xb8\x17\xd2\x6a\x0b\xab\x69\xb7\xf7\xee\x1e\xa3\x0d\xae\xc8\xbc\xee\x38\x7a\xe4\x6b\x4b\x29\x9c\x27\xbd\xc0\x6e\xea\x63\xf2\x4d\xbe\xe9\x55\xa6\xc0\x96\x90\x37\xee\xf9\x1c\x34\x32\x1e\x3c\x5c\x97\x2f\xde\x99\x31\x83\xb7\xd2\x3f\x6e\x01\x9c\x3e\x0c\xac\x75\x89\xae\x4a\x15\x21\xaf\x87\xea\x42\xdf\x8c\x22\xc2\x27\x0e\xc2\x3d\x6d\x14\x0f\x9c\xf6\xd4\xd5\x2f\xac\x1b\x9d\x6c\x89\x39\xef\x81\x31\xcb\x62\xa0\x35\xc5\x26\x15\x38\xbc\xdf\xd6\xdb\x41\x9a\x55\xef\x9f\xe5\xd7\xa5\xac\x44\x57\x9d\xe7\x00\x85\x8d\x74\xa3\x43\x48\x44\xf2\x83\x42\xc5\x65\x89\x27\x22\xe2\x7f\x40\x7d\x7f\x17\xb7\x4a\x59\x34\xbe\x91\x5b\x20\xc2\x40\x06\x43\x23\x5f\x8a\xb5\x79\x5f\x32\x4e\x33\xc5\x06\x44\xa0\x40\x33\x54\x2c\xb3\x81\x6d\x77\x0f\xa8\x99\xe7\x31\x1c\x14\x30\x1c\x1b\xd0\xf5\xaa\x60\xa2\xeb\x31\x65\x68\x0c\x72\x0e\x1e\xfa\x80\x96\xfc\x25\xd2\x77\x92\x75\xf1\x84\x2b\x2d\xb5\x3b\x4d\xa0\xad\x3e\x59\xc0\x75\x40\xc2\x84\x60\xce\xc1\xfd\xd3\xcd\xb7\xa3\x47\x8b\x91\xa9\xca\xf9\xac\x89\x1c\xdf\x3a\xea\xee\xca\x9a\x96\x56\xac\x13\x07\x25\x99\x22\xfc\xa7\x4c\x5c\xc6\x9f\x7e\x25\xc6\xbf\x58\x79\x73\xa4\xb7\xd3\xe3\xac\x06\x35\xb0\xdb\x22\xa0\x09\x3a\x79\x07\x68\x81\xc7\x17\x36\xee\x1d\x4d\x45\xf8\xed\x2d\x29\xa0\x67\x1a\x64\xe6\xca\x2f\x7a\x5e\xf4\x04\xb1\xed\xeb\x84\x20\x34\xf5\x71\xb6\x99\xbc\x59\xe5\xa3\x7d\xf0\x20\x54\xe8\x48\x2b\xf1\xe7\xb7\x7d\x8e\x83\x97\xda\x15\xd8\x9d\x73\x55\xa5\xdc\xe8\x6b\x16\x83\xa9\xac\x4e\x40\x6c\x08\xa9\x4a\x6e\xb0\x0e\x5a\xe1\x6d\x96\x72\x29\x72\xe5\xc5\x0c\x7b\xee\x4a\x84\xd0\x69\x7b\xbe\x67\xce\xb7\xef\x29\x5f\x06\xaa\xea\x5a\xbb\xa4\x44\x66\xbe\x0f\x67"}, -{{0x24,0xa9,0x14,0xce,0xb4,0x99,0xe3,0x75,0xe5,0xc6,0x67,0x77,0xc1,0xed,0x20,0x43,0xbe,0x56,0x54,0x9d,0x5e,0x50,0x2a,0x84,0x47,0x10,0x36,0x40,0x42,0xba,0x9a,0xcb,},{0x20,0xd2,0x1e,0xe7,0x64,0xb1,0xf3,0x5f,0x94,0x56,0x82,0x00,0xd6,0x3b,0xd5,0x82,0x8a,0xca,0x8c,0x5d,0x3e,0x90,0x47,0xd2,0x3f,0x47,0x8b,0x92,0x52,0x95,0xfa,0x2e,},{0x3a,0xe0,0xcc,0x7b,0xca,0x8d,0x73,0xbe,0x83,0xa9,0xb8,0x09,0xb1,0x33,0x38,0xc1,0x27,0x06,0xaa,0xef,0x75,0xc4,0xd1,0xa4,0x78,0x17,0x8f,0x9d,0xc5,0x65,0x51,0x4c,0x75,0x29,0xe2,0x98,0x04,0x3e,0xa7,0x8d,0x21,0xa5,0xa0,0x9d,0xd0,0x4f,0x10,0xae,0x87,0x44,0x1e,0x56,0x86,0xa9,0x33,0xc9,0x2c,0x75,0x54,0x84,0x27,0xad,0x3a,0x03,},"\x3f\xf9\xf6\x6f\xa2\x64\x6e\xc6\x6a\x1b\xf9\x33\xc2\xb4\xcc\x0f\xbf\x91\x2b\x4d\x6d\xb5\x05\x34\x25\x7f\x97\xd0\x1e\x69\x8d\x05\x48\x57\x47\xde\x25\x44\xe9\xf5\xa4\xa4\xa0\x75\x38\x8c\xf4\x40\x0a\xb8\x9b\x03\x53\xce\x86\x19\x82\x02\xdb\x3a\x90\x37\x67\xb8\x79\xa2\xaf\x9d\xaa\x15\x58\x43\x11\x1a\xf1\x5a\x2b\xc3\x5e\xfe\x41\xbc\xc9\x2c\x82\x07\xe0\x01\x13\xb0\x4f\x13\x03\x00\x79\x49\xff\xb6\xce\x8d\xf4\xb0\xb3\x42\x48\xfe\xdf\x5d\x9c\xb2\xce\xe9\x4b\x81\x2e\xd5\x8e\xce\x2a\x0c\xe0\x45\x4c\xf1\x4c\x20\xe4\x9e\x09\xfe\x66\x4d\x6e\x25\x76\x2e\x87\x89\x59\x32\xcd\x5c\xd3\x2e\xb6\xa3\xab\xb3\x8e\xe1\x63\x07\x8c\x13\x3e\x93\x58\x87\x91\xdb\xf6\xaf\x49\x9a\x31\xea\x44\x53\xbb\xcc\x7a\x85\xe4\x06\xc9\x84\x8a\x66\x40\x52\xf1\x11\x13\xfb\xb4\xff\xa7\x60\xde\xe4\xc2\x61\xe3\x96\x94\x24\x91\x11\x9d\xa2\x9a\x33\x58\x2f\x82\x1d\x41\x25\xe0\xb4\x16\x2f\x28\xbe\xb0\x66\x03\x1a\x65\x2d\x05\x74\x9a\xa7\x24\x4d\xd4\xf3\xd3\xbb\x15\xd2\x68\x32\x8d\x6a\x02\xfc\xe2\x50\x18\x15\x25\x7f\x8a\xd5\xaf\x4e\xcb\xe7\xcb\x8a\xe9\x66\x1e\x34\x4f\x90\x72\x31\x87\x91\xf3\xe8\x59\x09\x11\x21\xe0\x8a\xef\xca\x89\x82\xea\xaf\x66\x25\x9d\x9d\xe4\xf4\x6a\x31\xe7\x16\xdc\x03\x3d\x0f\x95\xd1\xfa\x93\x6b\x6c\x60\x79\xb1\x37\xdd\x11\x58\xd1\xde\xf1\x13\x01\x8c\x73\xf8\xeb\xb9\x80\x7e\x0f\x74\x15\x40\x4e\xa9\xc7\x85\x44\xac\xe7\xce\x46\x3c\xd1\xd1\xc5\x7e\x31\xf4\x09\x1b\xc0\x91\x80\x4c\xbc\xdd\xad\x0e\x15\xa4\x0c\xa9\x1a\xcb\xe1\xc6\x22\x4e\xd1\x3c\xaf\xb4\xdf\x2c\x84\xac\x9f\x0c\x3c\x9b\x54\x60\x07\xd9\xdd\x6e\x52\x4c\x46\x70\x72\x56\x3d\x4a\xc0\xd7\x00\xcc\x1b\xf3\x0f\xeb\xb3\x34\x31\x3d\xae\x57\x61\x74\x5e\xc0\xa5\xe9\xe8\x81\x50\x25\x95\x8f\x00\xfa\x2e\x58\x06\x0d\x7e\x9a\x5f\x2b\x72\x7f\x48\x69\x9f\x92\x9c\x84\x59\x93\x08\x92\x57\x3f\x78\x4f\xef\x56\x92\x51\x8b\x5c\xa2\x68\xe2\xa7\x3e\xbe\xad\x6e\xbd\xeb\x7e\xc2\x4e\xac\x92\xaa\x7d\xcb\x41\xb5\x98\xbd\x6e\xff\x36\x32\xd0\x69\x72\x62\x91"}, -{{0x55,0x32,0xe0,0x9b,0x93,0x7f,0xfd,0x3d,0x5f,0x4c,0x1d,0x9f,0x1f,0xfc,0xde,0xd2,0x6e,0xe7,0x4d,0x4d,0xa0,0x75,0x26,0x48,0x44,0x69,0x0b,0xd9,0xc8,0x61,0x39,0x94,},{0x50,0x93,0x96,0x9f,0x37,0x7b,0xec,0x3e,0x35,0xf5,0x9e,0xfd,0xa0,0x1a,0xb4,0x18,0x6c,0x5d,0x2a,0x36,0x74,0x0c,0xf0,0x22,0x67,0x5e,0x01,0x09,0x6b,0x1a,0x3f,0x0a,},{0xd5,0x27,0xff,0x0d,0x4a,0x21,0x9d,0x61,0xf4,0x18,0x12,0x12,0x06,0xa5,0x4a,0xe4,0x98,0x58,0x54,0xa3,0x10,0x48,0x27,0x44,0x48,0x6e,0x4d,0x13,0x0a,0x7d,0xe9,0x7c,0x31,0x9d,0xf8,0x37,0x2c,0x82,0x82,0x8c,0x93,0x6e,0x6a,0x8a,0xfd,0x9c,0x5d,0xe1,0x82,0x85,0x73,0xd8,0x26,0x1a,0xe9,0x36,0x5b,0x8f,0x23,0x76,0x76,0x18,0x24,0x02,},"\xad\xd4\xd7\xa9\xce\x3f\x63\xd1\xf9\x46\xe8\x67\x90\x65\x54\x5d\x8c\x7b\xf0\xa2\xcc\x3a\x4c\x00\xb8\xf1\x42\xf0\x94\x5a\xe3\x62\xc4\xc9\x46\x2a\x75\x76\xa4\x05\x9d\x57\x86\x16\x62\x88\x4b\xd8\x0b\x96\xd9\x0d\x27\x9a\x95\x2e\xda\x95\x2d\x37\xd4\xf9\x5c\xf0\xd7\x0d\xa9\x8f\x4f\xba\xca\x39\xe1\x69\xf9\xd9\x45\xd4\x1f\x87\x23\x97\xbb\xdd\x57\x01\x45\x43\x03\xd7\x7d\x31\xe8\x63\x48\x27\x1d\xa4\x0a\x1b\x8f\x1e\x57\xc3\x6f\xcd\x80\x3e\x14\xfa\x17\x71\x6c\x56\x31\xef\xa0\x1d\x3a\x79\x5d\xc2\x0b\x2b\xde\x36\xab\x73\xff\x6a\x2d\x53\x3b\xc1\x5c\xce\x22\x32\x87\x13\xc3\xc9\xcc\xd0\x72\xc3\xe4\x50\xd7\xf2\x2c\x0c\x9f\x94\x91\x97\x52\xcb\xfe\x45\xee\x65\x5d\x1b\x53\x67\x65\x93\xcd\xb4\x48\x70\x41\x02\x63\x1c\xaa\xa9\x76\x95\x2e\xaa\x1f\x6c\x2e\x87\x65\x64\xe4\x20\xf0\xc6\x46\xa0\xf8\x83\x65\xf7\x64\x15\xb4\x08\x5f\x60\xa3\x38\xb2\x9c\x51\x63\x3e\x54\x0f\x0b\xf3\x2d\x40\x87\xe7\xd0\xfb\x68\x5b\xe8\x8c\x75\x95\xdc\x53\x1c\x99\xb4\x89\x58\x45\x60\xad\x82\x34\xb1\x8e\x39\xa1\x07\xcf\x5d\x84\x2d\xab\xd4\x21\xe7\x7d\x26\xea\x5e\x0f\x14\x05\xce\x35\xfe\x79\x27\x14\xeb\x4e\xe1\xa8\x01\x76\x48\xac\x1a\xe7\x39\xa3\x3d\x7b\x1e\x08\x91\x05\xd1\xe5\xad\xd2\x7a\x62\xce\x64\x15\x45\x70\x34\x0a\xf9\xeb\x14\xe7\xfd\xfc\x2f\x9a\x2c\x2f\xcf\xcd\xac\x3c\xc4\x22\x77\x63\xf4\xd6\x29\x49\x74\x79\xf8\x49\x21\x6e\x5d\x90\xec\x16\xdf\xa3\x6b\x72\x51\x7f\x7b\x54\x86\xba\xee\x7f\xda\x44\x50\xc3\x52\xcf\xfb\xba\xe7\x39\x26\xc8\x43\x22\x4f\x8c\xe4\x4b\x38\xda\xe5\x3f\x3e\xad\x21\x89\x0b\x52\xa7\x80\x10\x75\x29\x16\x84\xfd\x59\x10\xed\x86\xad\x33\xe8\xa0\x07\xf6\xc3\xf8\x5c\x16\xb2\x09\x29\x37\x40\x18\x4f\x58\x90\x87\x4d\x43\x1c\xd4\xe0\xea\x40\x87\xc4\x9c\x34\x71\xd7\x89\xc8\x13\xc6\xdc\x9a\x78\x69\x93\x63\xa1\xd8\x71\x97\xd3\xb9\x2c\x02\x86\x68\x93\x11\x82\x3f\x4d\xf2\x2c\xe8\x03\x5e\x75\x73\x2c\xde\xa7\xf5\x62\x1f\x67\xdb\x0e\x2a\x4c\xa6\x61\x61\x93\x22\x1c\x0a\xa3\xd6\xde\x50\xd8\x52\x82\xee"}, -{{0xeb,0x36,0x51,0x10,0x09,0xd3,0x7a,0x9c,0x46,0xc4,0xd1,0x37,0x4d,0x0b,0xbd,0x0d,0x99,0x81,0xe7,0x8c,0xee,0x7d,0x18,0x8c,0x5a,0xab,0x98,0x3e,0xc2,0x39,0xe1,0x0c,},{0xb1,0xcc,0x21,0x2b,0x45,0x21,0xbb,0xe7,0xb1,0x9a,0x76,0x93,0x87,0x8a,0x55,0x84,0x40,0xee,0xc3,0x62,0x05,0xd8,0x43,0x9d,0x04,0x0a,0x46,0xa9,0x90,0x2f,0xbf,0x55,},{0x9f,0x58,0x37,0x24,0xde,0x55,0x2e,0xae,0x82,0xf2,0x54,0xac,0x6e,0x2e,0xd4,0x83,0xec,0x1a,0x07,0x34,0x62,0x66,0x73,0x5c,0x49,0x09,0x20,0x69,0x0c,0x1e,0x3f,0xb2,0xa9,0xe9,0xa3,0x41,0x94,0xed,0x64,0x73,0x73,0x3b,0x30,0x0d,0x4f,0x23,0xc9,0xae,0xc0,0xda,0x5a,0x20,0x22,0x05,0x4c,0xa4,0x38,0x85,0xa1,0x5a,0x29,0x84,0x32,0x0e,},"\xba\x24\x66\xe5\x6c\x1d\xf7\x7f\x22\xb6\xf0\x24\x1f\xc7\x95\x2a\xe9\xbc\x24\x75\x64\x19\xa9\x44\x6d\xd2\xb4\x9e\x2c\xb9\xdf\x59\x4e\x5b\x6c\x77\xa9\x5a\xa5\xfb\xd9\xdc\x57\xfe\xc8\x39\x62\xc7\x75\x1e\xeb\xb4\xba\x21\x82\x53\xf9\x16\xa9\x22\xa5\x13\x96\x63\xe3\x20\x3e\x3b\xe4\x82\xbe\x37\x9c\xa1\x51\xc4\x63\xd9\xad\xa2\x14\x46\x13\x5f\x35\x69\x94\xfa\x54\x49\xf0\x84\x47\x8f\x5b\xb4\xf5\xba\x61\x45\xc5\x15\x8e\xb7\xb1\xc4\x3c\x32\xeb\xea\x25\xe0\x9c\x90\x0f\x01\xef\x91\xe9\x2f\x88\xc0\x3c\x76\x50\x4a\xce\x96\x46\x01\x6f\xfc\x27\x89\x55\x9d\x0f\x3c\xc9\xd0\x0f\xb6\x1b\xdc\x6a\xf7\xd3\x94\x0f\x30\x2e\x58\x8e\x04\xf7\x9f\x7b\x3d\x4b\x91\xa5\xd1\x93\xa4\xf8\x22\x2b\xfe\xb6\x9b\xf0\x34\x7d\x98\xad\x81\xef\x99\xd1\x30\xeb\xc7\xb3\x6b\x07\x83\x39\x4e\xea\x92\xa3\x8d\xdd\x5e\x74\x80\xd2\xad\xd4\xe4\xde\xf5\x3e\xb9\x9c\x44\x9b\xff\x94\xe4\x71\x8b\x09\xf2\xea\x9b\x1f\x2b\x88\x65\x94\xa9\x5c\x33\xa6\x9e\x03\x33\x15\x4e\x44\x0a\xb3\x4b\x7b\x6c\x11\x34\xd8\x17\x9b\x6f\x0c\x56\x25\x1a\x9a\xd8\xe1\xb6\xb0\xf9\xb8\xa5\xc9\x70\x81\xa7\xf8\xfd\x05\xd0\xb0\xaf\xfc\x82\xdb\xdd\xc8\xb0\xc0\xab\x7e\x83\x3f\x30\x06\x26\xd4\xb9\x73\xb3\xf6\x0f\xea\xc5\x55\x71\xe8\x9c\xda\x0f\x2b\x44\x1e\xd2\xfa\xa6\x69\xa7\x0d\x55\x6c\xb4\x8f\x9b\x1d\x1c\xbc\xe3\x2e\xde\x5d\x16\x6b\x11\x43\xe2\x64\xb1\x1e\xa3\x27\x68\x1c\xb5\x59\xed\xd1\x3c\x36\x4b\xd2\xba\xf1\xfd\x54\xbb\x78\x18\x07\xbd\x59\xc8\x68\xb0\xe4\x79\x5a\x77\x9e\x67\xf0\xbd\x0d\x14\xb5\xa6\xb9\xe4\x40\xb5\x7a\x58\x23\x32\x8b\x59\xaf\xfb\xd0\x27\xed\xa7\xdd\x78\x50\x79\xc5\xf0\x2b\x5e\x32\x89\x0b\x03\x87\x30\x98\x6a\x39\xa5\xa9\x83\x4a\x3f\xed\x86\x8b\x6f\x45\xcb\xdd\x28\xac\xb2\x70\x9a\xff\x55\x62\x63\x86\x4f\x9a\xe1\xe7\x57\xb3\x27\x8c\x28\x8d\xbe\x29\x32\x82\x57\x12\x77\x3e\x43\x1f\x7c\x29\x32\x98\x57\xfd\xae\xa7\x98\xed\x93\x92\x08\x93\x63\x14\x02\xe6\xb1\x3b\xab\x62\xb4\x85\x54\x61\xed\xb9\x46\x20\xf2\xd1\x75\x18\x65\xf4\x45\xc4\x66"}, -{{0x7d,0xbc,0x81,0x90,0x2e,0x4e,0xaa,0xb3,0x07,0x75,0x40,0xf5,0x59,0x99,0x5c,0x38,0x74,0x03,0xca,0xc3,0x06,0xd4,0x86,0xe9,0x59,0xc5,0xeb,0x59,0xe4,0x31,0xc0,0xa8,},{0xe0,0x30,0x66,0x13,0x90,0x82,0xf6,0x13,0x44,0x8b,0xdb,0xc2,0x7f,0xe5,0x3a,0xa3,0xf8,0x89,0x94,0xc3,0x1d,0xdc,0xe0,0x02,0xe3,0x6b,0xbb,0x29,0x63,0xdf,0x3e,0xc8,},{0x5b,0x7f,0x65,0x2f,0x08,0xf2,0x29,0xfd,0xa1,0xb0,0xbd,0x75,0x93,0x77,0xb3,0xfb,0x72,0x6c,0x1b,0x9c,0x9a,0x10,0xef,0x63,0x42,0x6d,0x35,0x2d,0xd0,0x86,0x9b,0xd5,0x4d,0x87,0x6c,0x30,0x92,0xf1,0xcd,0x41,0x1c,0x37,0x57,0xd3,0xc6,0xb6,0xea,0x94,0x2a,0xa7,0x0c,0x3a,0xae,0xb4,0x21,0x7a,0x4c,0x73,0x64,0xd1,0x8e,0x76,0xe5,0x0f,},"\xdf\xf7\x98\xb1\x55\x7b\x17\x08\x5a\x06\x34\x37\x1d\xed\x5d\xdf\x7a\x5a\xcb\x99\x6e\xf9\x03\x54\x75\xe6\x82\x63\x36\xf6\x4a\xd8\xb8\x4b\x88\x2e\x30\xba\xde\xc2\xb4\xa7\x11\x99\x87\x52\xf4\xa1\x57\x4b\xc1\xf8\x9d\x43\x25\xcf\x2b\x39\x86\x10\x44\xdd\x03\x69\x1e\x71\xd0\x77\x68\xb5\x93\x3a\x30\x52\xcc\x7c\x81\xd5\x71\xa9\xde\x06\x1d\xc1\x90\x26\xc2\xf1\xe7\x01\xf2\xdc\xf2\x6a\x88\xd3\x40\x1b\xc9\x9f\xb8\x15\x59\xdc\xa7\x6d\x8a\x31\xa9\x20\x44\xa2\x73\x58\x7d\x62\x2a\x08\xd1\xcc\xe6\x1c\x8f\x94\x8a\x34\xde\xd1\xac\xb3\x18\x88\x1c\x9b\x49\xf6\xf3\x7c\x30\xa6\x5d\x49\x5b\x02\xd5\x42\x9e\x7a\xb4\x04\x0d\x8b\xeb\xeb\x78\x79\x4f\xf7\x36\xd1\x51\x10\x31\xa6\xd6\x7a\x22\xcd\xf3\x41\xb9\x80\x81\x1c\x9d\x77\x5f\xb1\x9c\x64\x78\xf0\x5e\xd9\x84\x30\x10\x3e\xa2\x4c\x0f\x41\x4d\x4c\xc0\x7d\x86\x0b\x72\xdc\x54\x2f\xf2\x2d\x83\x84\x5a\x42\xf8\xba\x45\xca\x7f\xf3\xaa\xb0\xb1\xe7\xde\x2b\x10\x94\xde\xac\x08\xd1\x6e\xee\x01\x96\x9f\x91\xbc\x16\xfe\xc2\x9c\xcc\x06\x1c\x54\xdb\x53\x45\xba\x64\x84\x2d\xac\xc9\x9e\xe7\x72\x94\x68\xd8\x0a\x3f\x09\x55\x83\xd8\xe8\x01\x24\x08\x51\x9d\x58\x2c\xc3\xff\x9a\x2e\xb7\xae\xba\xa2\x2d\xb8\x1f\xfc\x78\xee\x90\xef\x4e\xc5\x89\xdc\xce\x87\x11\x8d\xab\x31\xa6\x32\x8e\x40\x9a\xd5\x05\x9a\x51\x32\xc8\x2d\xf3\xce\xfe\x2e\x40\x14\xe4\x76\xf0\x4c\x3a\x70\x18\xe4\x52\x67\xec\x50\x18\xec\xd7\xbf\xf1\xdd\xa9\x26\x7e\x90\x66\x6b\x6b\x14\x17\xe8\x9d\xda\xcb\x50\x85\x94\x3b\xef\xc7\xad\x2f\x4d\xf5\xf1\xee\x0a\xf9\x43\x1a\xee\xb6\xb2\x4a\x55\x15\xb9\x3d\xbc\xf6\x86\x40\xf7\xda\xf8\xc9\x61\xe5\x67\xd7\x53\x49\x00\x20\x5c\x3d\xf2\x18\x4b\x6a\xc2\xda\x96\x1c\x4c\x1d\x2b\xc4\x9b\x4e\xa9\x6b\x81\x54\xff\xd4\xef\xff\xdc\x5e\x55\xa7\x11\x9c\xb8\xaf\x42\x9e\x85\x10\x5d\xff\xd4\x1f\xe4\xa2\xeb\xba\x48\x16\x8a\xa0\x5f\xa7\xdf\x27\xc4\x29\x87\x35\xff\x86\x8f\x14\x96\xbe\xb4\xb2\xed\x0b\x89\x80\xc7\x5f\xfd\x93\x9d\xdd\x1a\x17\xe4\x4a\x44\xfe\x3b\x02\x79\x53\x39\xb0\x8c\x8d"}, -{{0x91,0xb0,0x95,0xc8,0xa9,0x99,0xe0,0x3f,0x3e,0xd7,0x49,0xcd,0x9f,0x2f,0xaa,0xcc,0x00,0x76,0xc3,0xb4,0x77,0xa8,0x7a,0xb5,0xcc,0xd6,0x63,0x17,0x38,0x76,0x74,0x46,},{0xda,0xd1,0x74,0xd3,0x59,0xda,0xec,0xca,0x9c,0x6b,0x38,0x9b,0xa0,0x96,0x45,0x2a,0xb5,0xca,0x91,0xe6,0x38,0x3c,0x6d,0x04,0x2a,0x28,0x4e,0xce,0x16,0xba,0x97,0xb6,},{0x64,0xee,0x9e,0xfd,0xb0,0xc2,0x60,0x1a,0x83,0x5f,0x41,0x85,0x20,0x64,0x1e,0x43,0x6c,0x7d,0xd4,0x7c,0x33,0x3d,0x9f,0xc3,0x0c,0xfb,0xb9,0xe3,0x90,0xfe,0x76,0x45,0x30,0x65,0x47,0x08,0xb4,0x0b,0x03,0x58,0x18,0x99,0xa9,0xac,0x87,0x0e,0xfd,0x76,0x6f,0xfb,0xb4,0x63,0x71,0x52,0xf8,0xff,0x27,0x79,0x64,0xfe,0x35,0x42,0x52,0x09,},"\x9b\x0d\x8b\x00\x29\x98\x52\xd6\x8b\xbf\x49\x7f\xe6\x03\x96\x1a\x48\x54\x66\xa9\x9a\x54\x84\x00\x5d\xb7\x3d\x4e\x4b\xad\x81\x4e\x85\x74\xef\xd5\x4d\x64\x8b\xd5\xc9\x1a\xe8\x48\x3c\x54\xb2\xf9\x98\xb0\x2e\x1a\xbd\x6f\x40\x1a\x25\x52\x68\x43\xa5\xf2\xa2\x3a\x97\xbd\x58\x9d\x1f\x7e\x1a\xb1\x49\x15\xb1\xe3\x59\xa3\x96\xd3\x52\xc3\x60\xae\x65\x84\x32\x5a\xe4\xbb\x7d\x62\x4f\x61\x25\x5c\x5c\x7b\xf0\xa6\x7a\xca\xb4\x6c\x3b\x57\xb3\x45\x34\xc0\xee\x84\x31\xd2\x60\x57\x66\x06\xcb\xd8\x4d\x8d\x18\x39\xe7\x3d\xa6\xfe\x4b\x0b\x8b\x78\xf0\xf9\x58\x82\x7c\x2f\x1d\x93\xba\x7a\x34\x6d\xcc\x75\xcb\x56\x3d\xff\xde\x26\xf9\x97\x59\x8e\x8b\x5c\x2f\x16\x17\xc6\xfe\xfc\x9b\xe4\xb2\x8b\x54\x01\xb0\x00\x64\x13\xa2\x51\x69\x0d\x12\x03\xaa\xae\x4f\x6d\x8a\x3f\xb2\x1f\x24\x00\x9a\xb3\xbf\xf1\x37\x37\xa8\xa7\xe6\x64\x6c\x02\x73\x2d\x9e\xc5\xa4\xa5\x10\x46\x9e\x2d\x29\x9e\x4c\xc1\xad\x64\x80\xa4\x82\xaa\x95\x6f\x89\xdd\xcc\xcc\x64\xa1\x36\xfb\x15\xb8\x76\xb6\xec\xd8\x8c\x7c\x86\xa4\xdf\xc6\x0e\x66\x62\x07\xc6\x04\x16\x7d\x16\x34\x40\xca\x9a\xb9\xcf\x87\xa5\xe0\xf7\xbb\xc5\x51\x7d\xe4\xde\xe8\x76\xc0\x37\xf8\xcc\x9d\x95\x9c\x8f\xf5\xdb\xe9\x44\xff\x54\xcd\x91\xa7\x71\xe2\x92\x31\xf8\xb5\xf1\x7d\x61\xde\x90\x4c\x95\x5f\xe2\x02\x5d\xc5\x2e\xd4\x80\xfb\x3c\xc9\x0f\x23\x24\x59\xc6\x07\xef\x7e\x2a\xdb\x52\xc7\x48\x2b\xec\xd6\x7a\xd2\x14\x9a\x41\x28\xf9\x84\x03\x8b\x58\xaa\x90\x17\x67\x82\x39\x36\x04\xaa\xc7\x4c\x18\x20\x9a\x3d\x6a\x78\x63\x0c\x01\x95\x5a\x7c\xec\xe5\xda\x83\x84\xda\x3b\xaf\x63\xaa\x2d\xdf\x59\x63\xfa\xe0\x5b\xa3\xb8\x1c\x6a\x03\xd8\x6a\x00\xef\x78\xed\xb4\x18\x4f\xdc\x89\xb1\xd6\xbf\xeb\x31\x0f\xd1\xb5\xfc\xce\x1e\x21\x95\x24\xa3\xcf\xb2\xe9\x72\x57\x7f\x06\xb1\xdd\xde\xba\x00\x86\x5d\xae\x49\x79\x00\x0c\x00\x8a\xd9\x9f\x3b\x63\x8c\xce\xb8\xe8\xc7\xa0\xf9\x98\xd3\x4d\x92\x14\x3d\x81\xc0\xe1\xc0\x96\xa9\x25\xce\xba\x65\xc4\x30\x03\xee\x18\xd4\x94\xd0\x03\xe9\xc6\x1f\x77\xd6\x57\x59"}, -{{0x8c,0x56,0x8b,0x31,0x0a,0xce,0x7d,0x1f,0x0e,0xde,0xce,0xfd,0x60,0x3a,0x88,0x40,0x00,0x54,0x4c,0x79,0x25,0x65,0xd4,0x81,0xc3,0xd3,0xe0,0x6e,0x2d,0x82,0xca,0x96,},{0x5f,0xa6,0xe2,0x67,0xc7,0x66,0x73,0x68,0x41,0x41,0x10,0x72,0xd1,0x98,0x3d,0x19,0x00,0xac,0xf0,0x1d,0x48,0xc3,0xce,0x11,0x77,0x0b,0x26,0xf7,0x8d,0xa9,0x79,0xf7,},{0xde,0xbd,0xd8,0xe5,0xd3,0x11,0x2f,0xd7,0x7b,0x39,0x4a,0xa0,0xe3,0x6e,0x94,0x26,0xba,0xc9,0x1d,0xf1,0x26,0xfa,0x9c,0x31,0x7c,0xea,0x7c,0x9d,0x45,0x95,0x7c,0xdd,0x96,0xa4,0x5a,0xe3,0xad,0x76,0x04,0x13,0xee,0x12,0x05,0xaf,0xd7,0x1a,0x29,0xf9,0xc3,0xcb,0x58,0x6c,0xd2,0xd7,0xcd,0x1e,0x93,0xbc,0x16,0x52,0xfc,0x34,0xdc,0x04,},"\xb5\x9f\x5f\xe9\xbb\x4e\xcf\xf9\x28\x95\x94\x72\x1f\x26\x47\x04\x7b\x0d\xa5\xe0\xe4\x94\x1b\xbe\x57\xc5\xb7\x22\xb4\x76\x72\x3f\x0a\xc5\x97\x0b\x41\x11\xf8\x93\xbc\xaa\x41\x1f\x28\xfc\xeb\x4f\x58\x5a\x2a\x71\x87\x01\x8a\x90\x4b\x70\xef\x8f\xe1\xf6\x56\x9a\x54\xd0\x0a\xda\x37\xb6\x9c\xb5\xe9\xc9\xd2\x6c\x16\xa9\x03\x51\x81\x48\xe0\x4a\x1b\x93\x6a\x32\x32\x9c\x94\xee\x1a\x8f\xb6\xb5\x91\x89\x2c\x3a\xff\x00\xbf\x6e\x44\xdd\x0a\x76\x2b\xab\xe8\x9d\x70\x60\xc1\x7b\x90\x39\x0d\x23\xbf\x9d\x36\x0a\x29\x3b\x83\x08\x38\x30\x86\x91\x6e\x11\x82\xb1\xba\x43\x36\xf0\x01\xb8\xd2\x0d\xea\xe9\xa0\x29\xf7\xe8\x53\x97\xa9\xae\x5c\xf3\xca\x10\xc7\xf3\x87\x55\x88\xb8\xff\xab\xb0\x63\xc0\x0c\xa2\x6f\x58\x0f\x69\xed\xc5\x27\xa1\xac\xcf\x4f\x41\x39\x7b\x33\x76\x6b\xcf\x6d\x55\xeb\x8d\xe0\x81\xa4\x8c\x98\x1d\x05\xc0\x66\x61\x7b\x80\xd8\xf6\xf5\xe6\x0e\x59\xdd\x9b\x93\x0b\xc4\xd0\x45\x86\x40\x3b\xb8\x68\xdf\x75\x93\x3b\xdd\x86\x23\x0e\x44\x70\x36\xc1\x75\xa1\x0d\xe9\xbb\x39\x95\x3d\xcb\x19\x66\xa1\xf1\x19\x12\x07\x8e\x35\x8f\x48\xc5\xb2\x09\xa6\x36\xc7\xf7\x83\xf4\xd3\x6a\x93\xad\x2c\xc2\xe3\x24\x45\x19\x07\x8e\x99\xde\x1d\x51\x58\xb3\x96\x1e\x0f\xc5\xa4\xf2\x60\xc2\x5f\x45\xf5\xe8\x58\x5e\x60\x1d\xb0\x8b\xa0\x58\xd2\x90\x9a\x1b\xf4\x99\x5f\x48\x13\x46\x0d\x36\x95\x03\xc6\x87\x36\x85\xeb\xcd\x33\x30\xa1\x30\xb7\x5f\x23\x65\xfb\x2a\x5a\x34\xea\x63\xd9\x58\xa2\xa8\x67\xe9\x05\x52\xd2\xce\xc8\xc3\x90\x08\x4b\xe0\xc1\x08\xb0\xfd\x2d\x83\xcb\x92\x84\xdb\x5b\x84\x2c\xbb\x5d\x0c\x3f\x6f\x1e\x26\x03\xc9\xc3\x0c\x0f\x6a\x9b\x11\x8e\x1a\x14\x3a\x15\xe3\x19\xfd\x1b\x60\x71\x52\xb7\xcc\x05\x47\x49\x79\x54\xc1\xf7\x29\x19\x9d\x0b\x23\xe5\x38\x65\x40\x3b\x0a\xd6\x80\xe9\xb4\x53\x69\xa6\xaa\x38\xd6\x68\x5a\xbd\x39\x7f\x07\xfb\xca\x40\x62\x7e\xca\xf8\xd8\xd3\x01\x33\xa6\xd9\xd5\xaf\x00\x91\x92\x75\x1c\x9c\x45\xf7\x7c\x0b\xc0\x11\x26\x88\x00\xbf\x55\x25\x12\x73\x0e\x69\x97\x3c\x5b\xf3\x62\xab\x16\x48\x94\xbf"}, -{{0x3d,0x09,0xaf,0xce,0xe3,0xc4,0x32,0xfd,0xfb,0x6b,0xdc,0xea,0xd5,0x4e,0x3d,0xa5,0xb1,0xb4,0x16,0x5c,0x50,0xd6,0xd3,0x10,0xb7,0xfa,0xd7,0x87,0xb4,0x44,0xd6,0x80,},{0xb0,0xd9,0x02,0x8c,0x4d,0x14,0x87,0xd2,0x93,0xed,0x58,0x5a,0x76,0xbc,0x94,0xff,0xfb,0xaf,0xe2,0xc6,0x5d,0x98,0x0c,0x49,0x4e,0x14,0x1e,0x48,0x10,0xa3,0x5c,0xb9,},{0x89,0x73,0x9f,0xe4,0x41,0xca,0x0c,0xed,0x08,0xa6,0xeb,0x57,0x96,0xe9,0xbd,0xda,0x0e,0x74,0xfb,0x47,0x35,0x28,0xfd,0x49,0x07,0xed,0xb6,0x59,0xaa,0xb4,0x4d,0x33,0x43,0x22,0x90,0x46,0x71,0x63,0x68,0xfa,0xf8,0x8e,0x85,0xc1,0x64,0x4a,0xf6,0x6f,0xf2,0xdc,0xaf,0x0b,0x17,0xac,0x93,0xca,0x13,0x81,0x9f,0x3f,0x24,0x1d,0xd3,0x00,},"\x76\x71\x65\xca\xae\x0e\x57\x8f\x16\x53\x7e\x17\x50\xbe\x7d\xe8\x7a\x78\x9a\x51\xff\x2d\xe1\x18\x38\xf5\x64\xe2\x58\x0b\x23\x91\x36\x2d\x28\x68\xa5\xa4\x70\x8a\xf1\x5d\x2e\x2d\xb7\xb9\xbe\x39\xc1\x6a\xdc\xc1\x20\x0b\x34\xe6\xb4\xd4\x02\x7d\xdf\xfc\x1a\x2a\x35\x95\xe2\x9e\x85\x5e\xc5\x26\x1b\x20\xbd\x55\xc4\x28\xb0\x13\x09\xba\xdb\x59\xe2\xca\x3e\xdb\x96\x7f\xc2\xf4\xba\xc0\x72\x9d\xdf\x54\xfb\x6c\x20\x05\x7b\xdd\xa9\xe7\xaf\x7c\xbf\xc0\x92\xfb\xa8\x65\xfd\x32\x75\xb9\xd3\xbc\xb0\xc3\x46\xb9\x51\xd1\x70\xac\x9a\xa6\x50\xa8\x6d\xf4\x98\x55\xd4\x8a\x1b\x37\xce\x56\xc9\xf2\x73\x89\xf5\xc8\xb1\x5f\x5c\x2c\x90\x0c\x4f\x10\x7c\x06\x4f\x60\x3e\x4f\x86\x7e\xf2\xe9\xc1\x0a\x1b\x74\x21\x0e\x6b\x89\xbb\x01\x17\x93\xaa\x85\xde\xd4\x3b\x51\xb7\x49\xba\x7f\x70\x28\x7b\x6b\xc1\xb8\x94\x34\xdb\x8b\x8c\x8b\x5d\x73\xb2\x14\xb4\x1e\x36\xb5\x28\x00\x5b\xfb\xfe\x00\x2e\x21\xb1\x00\x6f\xb9\xd2\x4b\xab\xd7\x21\x06\xd0\x93\xe3\xc7\x09\x3b\x31\x38\xae\xa7\x19\xd6\x94\x79\x08\x46\x47\x49\x8c\xd6\xc9\xbb\xb7\x44\x50\x9c\xd7\xda\x8d\xd6\x1a\x62\x71\x00\xf0\x3c\x21\xe7\x50\xac\xb3\xfc\xf4\x63\x1d\x7c\x0f\x61\x81\x54\xd2\xe5\xfa\x66\x56\xfb\x76\xf7\x4c\x24\x79\x50\x47\xbb\xce\x45\x79\xeb\x11\x06\x43\xfa\x98\xe1\xf7\x76\xca\x76\xd7\xa2\xb7\xb7\xb8\x67\x81\x73\xc7\x73\xf4\xbe\x7e\x18\x2f\xd2\x4d\xd7\x62\x91\xac\x67\xd9\xf2\x6a\x28\xc5\xe3\xcb\x02\x5c\x68\x13\xa3\x78\xb3\x83\x22\x46\x42\xb4\xae\xfa\xd0\xc7\x6a\x65\x79\x51\x7b\x8f\x36\x07\x97\xdd\x22\x61\x3e\xe6\x82\xb1\x79\x38\x19\x50\xfb\x71\x60\x9a\x5f\xb5\x49\x4d\x2d\x57\xdc\xb0\x0f\x26\xd1\xe7\x29\x56\xf4\xd6\x67\x28\x30\xe0\x5c\x01\xb3\x77\x96\x77\xc0\x7e\xa0\x09\x53\xc6\xb8\xf0\xdc\x20\x4c\x8d\xbd\xcc\xb3\x81\xbc\x01\xb8\x9c\x5c\x26\x1d\xb1\x89\xab\x1f\x54\xe4\x6b\xc3\xed\xc4\xde\x5a\xd4\xf0\xeb\x29\xc0\xa1\x20\xe4\x37\xcd\x8f\x37\xac\x67\xd4\x8c\x7f\x0e\x73\x02\x78\x70\x8f\x02\xb5\x4a\xee\x62\xb7\x29\x52\xbc\x1c\x0e\xb4\x37\xca\x8b\xd5\x65\x54\x37"}, -{{0x41,0xc1,0xa2,0xdf,0x93,0x69,0xcd,0xc9,0x27,0x16,0x4a,0xa5,0xad,0xf7,0x75,0x71,0x36,0xab,0xe5,0x13,0x95,0x60,0x42,0x66,0x33,0x4c,0xc5,0x46,0x0a,0xd5,0x68,0x3e,},{0x40,0x55,0x78,0x34,0xcc,0xe8,0xe0,0x43,0x58,0x0a,0x42,0x72,0xa8,0x80,0x4d,0x4f,0x92,0x6e,0x88,0xcb,0x10,0xd1,0xdf,0x0c,0x5e,0x28,0xb9,0xb6,0x7e,0x1b,0x63,0xda,},{0xb8,0xb2,0x75,0x2a,0x09,0x71,0x96,0xc2,0x89,0x84,0x9d,0x78,0xf8,0x11,0xd9,0xa6,0x2f,0xc7,0x67,0x27,0x8f,0x0c,0x46,0x62,0x8b,0x52,0x1f,0x62,0xed,0x27,0x59,0xd7,0x44,0x62,0xa1,0x75,0xda,0x22,0x40,0x3f,0x15,0x02,0x04,0x45,0xca,0xe0,0x6d,0xa3,0xed,0x61,0xcc,0xa6,0x20,0x3b,0x70,0x06,0x36,0x2a,0x0e,0x19,0x89,0x63,0xd2,0x0e,},"\xb6\x4b\x14\xba\x77\xd2\x39\xe6\xf8\x1a\xbe\x06\x0a\xcc\xef\x85\xf0\x44\x2b\x65\x0c\x44\x01\x5e\xfc\x43\xa0\xaa\x2b\xa1\x0b\xf4\x8d\x30\x18\xb1\x95\x3d\xdf\xff\xbc\xda\x5b\xf3\xbb\xe0\xb6\xb3\xe4\xb0\xd9\xa3\x2c\x6b\x72\x5b\xbb\x23\x1e\x0a\x27\x04\x47\x1e\xe8\xbc\x1d\x59\x4f\x5c\x54\x22\x6f\x5d\xd9\xdf\xa1\x63\xcf\xc1\x45\x2c\x61\xf9\x3e\x4f\x81\x39\xab\x4c\xe4\x47\x6f\x07\xec\x93\x36\x61\xea\xe9\x1b\x6d\x50\x0b\xf5\x08\xac\x63\xe4\xba\xaf\x1f\xfc\x8f\x00\x07\xd8\x02\xe0\x05\xf1\xb4\xfc\x1c\x88\xbe\xe4\xd5\xe9\xe7\x63\x84\xf5\xa7\x04\x3b\xd6\x60\xcc\xe7\x1f\x3b\x67\xf0\x1f\x6a\xb8\x44\x29\x85\x31\xaa\xc7\x3a\x39\xd0\x45\x37\x00\x88\x85\x50\x05\xa0\x9c\x6d\x04\x23\x8e\xa4\x78\xdf\xac\xad\x1e\x6b\x22\xb2\xbe\x4c\x46\xb0\xd5\x9b\x1e\xba\x1f\x06\x0b\xf7\xda\x5d\x15\x66\xcf\x1f\xdb\x5c\x54\x3a\x33\x92\x6a\xf6\x3f\x01\xa0\xdb\x86\xe1\xa6\x71\x1c\x47\x3d\xc7\x95\xab\x28\x3c\x8d\x93\xfa\xcf\xb5\x70\x1f\xa2\xf2\xf6\xbb\x99\xf9\xb7\xe3\x74\x9b\x07\x1d\x58\x60\x7b\xe4\x4a\x70\x89\xbc\xb5\x03\xec\x14\x95\xb5\xfe\xed\xb3\x99\x96\x1f\xd3\x67\x7d\x74\x93\xea\xa3\xb3\xe9\xcc\x5e\x36\x42\xf4\x0d\x47\xde\x9b\xfe\xe7\xc2\x0b\x0e\x51\x9c\x4e\xb4\xa4\x0f\x4d\xa4\x46\xed\x6a\xc7\xaa\xca\x05\x3e\x75\x9c\x97\xda\xbe\x0a\x8e\xc2\xf5\x8e\x7f\x2f\x9b\x20\x72\x76\x2f\x9f\x79\x4a\x6a\x4e\x36\x06\x0b\x88\x72\xbd\x2c\x18\xd0\x6a\x85\xc2\xc1\x41\xa7\x82\x93\x77\x3e\xe8\xcf\xbf\x15\x4b\x99\x30\xcd\x39\xda\x31\xb4\x97\xe7\x37\xa7\x75\x0c\x90\xa1\x3f\x5a\xaa\x14\x7c\xd0\xdc\x43\x11\xf2\xe3\x49\x41\x25\x2e\xf1\x98\xb0\xc1\xf5\x08\x27\xe5\x6c\x9f\x16\xf5\x95\xac\xed\x6d\x2a\x69\x34\x65\x31\x49\x5a\x64\x99\x77\x4d\x36\x07\x66\xca\x9b\xe5\xed\x88\x81\xc0\xdb\x26\xed\x7c\x5e\x6f\xf3\xa4\xf9\xb7\x3c\xd8\xb6\x54\x64\x0d\xc9\x6b\xf4\x3b\xd4\x26\xa0\xf2\x8c\x9b\x25\xfa\x70\x4d\x62\xff\x02\x88\xfc\xce\xff\xaa\xeb\xd3\xea\x30\x97\xbc\xbb\xd7\x78\x42\x0e\xbc\x52\x0a\x41\x77\x30\xa1\xb5\xb3\xb8\xc9\x6c\xda\x9f\x4e\x17\x7d"}, -{{0xa0,0x06,0x11,0x48,0x94,0x67,0x12,0x2c,0x4c,0x16,0x4b,0xfb,0x6a,0x61,0x6e,0x6a,0x61,0x9b,0x9f,0x83,0xc4,0x36,0x72,0x06,0xb8,0x5d,0x3f,0xbe,0xc3,0x8c,0xd6,0x2c,},{0x57,0xab,0x58,0xba,0xbb,0x41,0xdc,0x0d,0xa0,0xbc,0xd5,0x06,0x05,0x9a,0xac,0x9f,0x46,0xec,0xa9,0x1c,0xd3,0x5a,0x61,0xf1,0xba,0x04,0x9a,0x9a,0xc2,0x27,0xf3,0xd9,},{0xc7,0x71,0xba,0x0a,0x3d,0x3c,0x4a,0x7b,0x06,0x4b,0xd5,0x1a,0xd0,0x5c,0x9f,0xf2,0x7f,0xd3,0x26,0x61,0x0f,0xbf,0xa0,0x91,0x83,0x03,0x9e,0x5e,0xdf,0x35,0x47,0x2d,0xde,0xd8,0xfc,0x22,0x75,0xbb,0xcc,0x5d,0xf1,0xbf,0x12,0x98,0x60,0xc0,0x1a,0x2c,0x13,0x11,0xda,0x60,0x2f,0xba,0xff,0xc8,0xb7,0x9c,0x24,0x9c,0x9c,0xc9,0x55,0x02,},"\x34\xdb\x02\xed\x75\x12\xbf\x8c\x67\xd3\x59\xe7\x20\x3a\x2e\xa4\x41\xe2\x0e\x72\x97\x66\xc1\x5a\xa0\x0f\xa2\x49\xa3\x51\x8f\xc2\x9e\xf8\x90\x5a\xa5\xb4\x67\x09\x58\xc6\xa4\x60\xd7\x7b\x3a\x80\xef\xcb\x47\x38\x59\xbb\xaf\xf8\x62\x22\x3e\xee\x52\xfe\x58\xac\xfd\x33\x15\xf1\x50\xf3\xc6\xc2\x7f\xf4\x8f\xca\x76\x55\x2f\x98\xf6\x58\x5b\x5e\x79\x33\x08\xbf\x59\x76\xba\xd6\xee\x32\x7b\x4a\x7a\x31\x32\x14\xb9\xae\x04\xb9\x65\x1b\x63\xcd\x8d\x9f\x5b\x3b\xec\x68\x9e\x0f\xd0\x00\xdd\x50\x17\x70\xdd\x0e\x99\xb8\xf9\x9e\xaf\xa0\x9c\x39\x6a\x24\x5a\x4a\x96\xe5\x68\x96\xa2\x9b\x24\x19\x0b\x1e\xf1\x10\x63\xf3\x9b\x63\xee\x3a\x58\x6b\x07\x62\x7d\xd3\x50\x0c\x4e\x17\x0b\x83\x5d\xc0\xec\x23\x6f\xa5\xa3\x5c\x44\x18\x47\x07\x56\x5c\x4a\x50\x66\x2d\x8d\xbc\xcf\xff\x7f\x9a\x7a\x68\xd0\x21\xb4\xaf\x64\xd5\x32\xb7\xc3\xd2\x74\x74\x18\xc2\xd7\x17\xbb\x6a\xca\x6b\x58\x74\x7a\xe4\xdd\x56\x41\xd8\x26\xf7\x9a\x8a\x31\x5c\x38\x21\x1a\x53\x8a\x92\x9e\x5b\x45\x1f\x62\x3f\x4f\xcb\xbc\xac\xdb\x86\xc8\x75\x2e\xa1\x3a\x61\x7a\xb4\x14\xab\x65\x3e\xb2\xe6\x8d\x54\x20\xdf\x7c\x6d\xf9\x24\x38\x16\x8d\xcf\x9c\x06\x65\x81\xdf\xe7\xb2\xc4\x68\x19\x4a\x23\x70\x7d\xe4\x65\x9b\xd6\x7e\xb6\x34\xff\x02\x47\x41\xc5\xfc\x86\x98\xfd\x4d\xc4\x1f\xe5\xdf\xc6\x29\x9b\x7a\x08\xe6\xff\xca\x37\x10\x9c\x02\x10\xc8\xf9\x4e\xa2\xd3\xdd\xc9\x77\xff\xc0\xb3\x79\x4f\xe6\xba\x43\x37\xc7\xaa\xb4\x34\xa6\x8a\xc6\x65\x48\x4e\xa8\x24\x3a\x84\xb7\x9a\xa1\x81\xee\x6a\xb5\xaa\x37\xa3\x2d\x87\x97\x25\xed\xc0\x18\xf8\x55\x21\x81\x81\x6d\x7d\x27\x2c\xa8\x81\x8a\x7b\x92\xe6\xee\x44\x54\xd1\xf7\x82\x8d\xd8\xaf\xba\x1a\x79\x03\x64\xb4\xff\x28\xd8\x4e\x02\x85\x97\x35\x3e\xbb\xef\x24\x83\x7b\xc3\x19\xe1\xae\x8f\x2b\x0b\x6a\x85\x1b\x48\x9c\x3e\x17\x0e\xef\x53\xe0\x65\xf7\x03\x26\x53\xcd\x6b\x46\xd8\xe5\x7e\x4e\x11\x1b\x78\x9b\xa9\x50\xc4\x23\x0a\xba\x35\xe5\x69\xe0\x66\x15\x40\x34\x07\xbc\xe0\x36\x9a\xaa\xb4\xea\xfa\xef\x0c\xae\x10\x9a\xc4\xcb\x83\x8f\xb6\xc1"}, -{{0xde,0x16,0x34,0xf3,0x46,0x0e,0x02,0x89,0x8d,0xb5,0x32,0x98,0xd6,0xd3,0x82,0x1c,0x60,0x85,0x3a,0xde,0xe2,0xd7,0xf3,0xe8,0xed,0xd8,0xb0,0x23,0x9a,0x48,0xcf,0xaf,},{0x9d,0xc1,0x46,0x5b,0x33,0x83,0xf3,0x7d,0xe0,0x0e,0xa2,0xd3,0xc7,0x0f,0x2c,0x8f,0xac,0x81,0x5f,0x01,0x72,0x02,0x9c,0x3f,0x57,0x95,0x79,0xc9,0x84,0xa5,0x89,0x5e,},{0xd2,0x05,0x06,0xeb,0x84,0x69,0x23,0xa0,0xb1,0x6f,0xf8,0x2f,0xb2,0xc3,0x92,0x3b,0x00,0xc1,0xb3,0xbc,0xc6,0xe2,0xf6,0x48,0x2f,0xba,0x24,0x80,0x75,0x21,0xe8,0xe0,0x22,0x3f,0x69,0x2e,0x62,0xea,0xc9,0x93,0xf4,0x98,0xf6,0x71,0x02,0xa0,0x4f,0xd1,0xac,0xf9,0xc7,0xe3,0x88,0x8d,0x85,0x7c,0x9a,0x08,0x0b,0x8a,0xf6,0x36,0x10,0x06,},"\xd1\x0c\x3e\x4d\xe7\xfa\x29\x89\xdb\xa8\x75\x37\xe0\x05\x93\xd0\xee\xd4\xd7\x5e\xe6\x58\x46\xda\xb1\x49\x8b\x47\x49\xd6\x4f\x40\xe3\x4b\x59\x11\xc5\xce\x3b\x53\xa7\xe3\x7d\x2d\x02\xbb\x0d\xae\x38\xed\x96\x2a\x4e\xdc\x86\xc0\x02\x07\xbe\xe9\xa8\xe4\x56\xec\xca\xe8\xbd\xf4\xd8\x7a\x76\x74\x60\x14\x20\x1a\xf6\xca\xff\xe1\x05\x66\xf0\x8d\x10\xda\xaf\x07\x71\x60\xf0\x11\xfe\xac\xa2\x5b\x9c\x1f\x6e\xca\x9f\xc5\x33\x14\xa8\x05\x47\x95\x17\x54\x35\x55\x25\x25\x7d\x09\xa7\xfd\xad\x5b\xc3\x21\xb7\x2a\xa2\x8d\x1e\x02\xd8\x69\x6d\x4f\x9e\xb0\xad\x3b\x21\x96\xf8\xbc\xfa\xeb\x1d\x61\x48\x28\x7a\x3f\xae\xfe\xf9\x1a\x7a\x3e\x06\x09\xc2\x8c\xe5\x9d\x0c\xa1\x4d\x0b\x30\x50\xdd\x4f\x09\x6b\x7b\xc2\x51\x39\x88\xba\x21\x21\x28\xd5\x02\x6d\xaa\xa7\x18\x88\x46\xdb\x21\xc5\xc1\xd1\x79\xab\x94\x87\xc1\xa5\xbd\x34\x65\x88\x12\x7c\x20\x39\x8d\x36\x2d\x4c\x75\x9c\xfa\xb2\xa6\x77\x75\x0b\x9e\x45\x67\x6a\x1e\x7e\x09\x2e\xf0\x2e\xdb\xf2\x78\xfb\x19\xa5\x8e\x9b\xf6\xc9\xe9\x96\xe2\x4e\xda\xd7\x3f\x3c\xe3\x1f\xa0\x4b\x6d\x85\x33\x43\x6b\xf8\x0b\x4b\x2f\x80\x5e\xd9\x1e\x7f\xcd\xa3\xbc\x2b\xab\x3b\x2b\xb1\x57\x15\x8a\xf0\xea\x8e\x3f\x07\x31\xdf\xad\x45\x9d\x2e\x79\xb6\xd3\x71\x5f\xe7\xbf\x1e\xaf\xc5\x39\x75\x93\x20\x88\x57\xe5\x7b\x7f\xeb\x2f\x73\x87\x94\x3a\x8e\x09\x13\x47\x0c\x16\x1a\xef\x4f\xe2\x05\xd3\x63\x7f\x23\x17\x7f\xf2\x63\x04\xa4\xf6\x4e\xba\x3f\xe6\xf7\xf2\x72\xd2\x34\xa6\x72\x06\xa3\x88\xdd\xd0\x36\x6e\x89\x4e\xaa\x4b\xb0\x5d\x73\xa4\x75\xf1\xb3\x4c\xa2\x22\xbb\xce\x16\x85\xb1\xb5\x6e\x03\x4e\x43\xb3\xc4\x0e\x81\xff\xf7\x96\x82\xc1\x9f\x32\xaa\x3f\x2a\x89\x5c\x07\x09\xf9\xf7\x4a\x4d\x59\xd3\xa4\x90\x29\xec\xfc\xb2\x83\x08\x2b\x06\x7f\x1a\x0d\x95\x05\x75\x0f\xd8\x67\x32\x19\x99\x48\x42\x49\xef\xa7\x25\xf5\x2c\x94\xc7\x59\x62\x06\xa9\x11\xf3\xf5\x05\xd6\x3f\x03\x13\x25\x4b\xd4\x45\xf0\x5b\xe3\x99\x6b\x58\xfe\x18\x19\xaf\x87\x35\x2e\x7f\x0a\x2c\xa3\x20\xd9\xcc\x00\xa5\xfe\x77\xad\x41\x64\x0d\x50\xbe\x84\x36"}, -{{0xc7,0x38,0xef,0x5f,0x09,0x35,0x28,0x1b,0xa6,0x25,0xfa,0x40,0x14,0xd4,0xa4,0xd0,0xbe,0x7e,0x28,0xfe,0xd7,0x79,0xa9,0xcf,0x65,0x8e,0x21,0xdb,0xa4,0x3c,0xeb,0xc1,},{0x95,0x79,0x9f,0xaf,0x70,0x6d,0x19,0x5e,0x54,0x4c,0x76,0xca,0xfd,0xdf,0x09,0xd0,0x2d,0x1b,0xea,0xfc,0x42,0xc9,0xd6,0xc9,0xea,0xd4,0xc1,0x84,0x55,0x87,0xd3,0x9e,},{0xf4,0x43,0x71,0xe6,0xc3,0x39,0x16,0x39,0xd4,0x57,0xed,0x14,0x64,0x81,0x84,0x80,0x94,0x11,0xe8,0x0a,0x32,0x01,0xf8,0x81,0x16,0x70,0xe5,0x00,0xfc,0xad,0x92,0xf3,0x00,0xaa,0xbf,0x7f,0xc6,0x8e,0x44,0x01,0x91,0xe8,0x81,0xd6,0xc3,0x47,0x4e,0xfd,0x6d,0x28,0xf0,0x9d,0xc4,0x43,0x12,0xfc,0xfc,0xb8,0x27,0x01,0xba,0x3c,0x29,0x0a,},"\x16\x8d\x0b\xc5\x59\x8b\xe0\x2f\x54\x43\xbf\xe7\xdf\xb8\x82\x99\x85\xca\x5d\x28\x2a\xf9\xcf\x1b\x14\x82\x60\x2f\x24\x3d\x48\x6b\xd8\x2b\xa0\x39\xa0\x75\x09\x09\xe9\xb3\xc7\xd4\xd5\xf8\xb8\xba\xf4\x57\x18\xaf\x03\x11\x85\x4f\x4d\x1c\x78\x37\xf3\x1d\x8e\xe6\x8d\x35\x58\xe7\xe5\x1e\x0c\x64\x6a\x4a\x63\x75\x96\xee\x90\x05\x7b\x01\xed\x0a\x17\xda\xa3\x95\x0b\x81\xab\x47\xae\x8b\x94\xc1\x7d\x40\x74\x69\x13\xc4\x6b\xa1\x47\x8b\xfc\xa5\x1b\x16\x76\x28\xfc\x3e\xe1\xe2\x2f\x2f\x19\xd6\xd8\xda\xf9\x3d\xf6\x54\x0c\xed\xb7\xa8\x59\xd1\xa2\xba\x59\x11\xba\x71\x76\x6e\x8b\x7f\xce\x0c\x0e\x86\x63\x61\x6d\x01\x80\x69\x7d\x78\xce\x30\x40\xd4\x38\x13\x19\x82\xf3\xf8\x11\x2a\xcc\xa2\x9a\xe5\x3e\x53\x9f\xf8\xc9\xec\x41\x06\xd1\x32\xf4\x02\x01\x85\x18\x30\x84\x85\xf2\xaa\x6c\x9e\x8d\x1e\x62\xfe\xd6\x0c\xb2\x49\x45\x7d\xb3\x3c\x6f\xd1\xfe\x07\x44\x53\x61\xf0\x81\x94\xa2\xb5\xa0\x57\xcb\x03\xcc\x75\x4e\x5c\x7d\x4a\x7e\xea\x53\xa7\xf7\xd2\x07\xca\xcc\xa5\xe6\x8c\xaf\xa9\x69\xa3\x52\x1d\xbb\x81\x03\x99\xa1\x7f\x32\x8e\xe7\x67\xcf\x55\x92\x6b\x2b\xd5\xf0\x29\x54\x9d\x3b\x46\x45\x79\xc4\x26\x55\x26\x53\x98\x47\x2e\x1c\x77\xcc\x8d\xd9\xaf\xf1\x87\xf7\xac\x34\xdd\x45\x6a\xce\x99\x9a\x73\x6e\xcc\xa6\xd4\x05\xd4\x92\x2c\x77\x9c\x60\x0c\x47\xb8\x4c\x9c\x1d\xf5\xe5\xf8\xed\x3b\x28\x11\xd3\x51\x33\x91\x13\xf8\x45\x3c\xca\x4c\x44\x11\x68\x8c\xb0\x38\x82\x58\xeb\xbd\x18\x72\xb8\x36\x10\x04\x22\x49\x49\x4e\xd5\x60\xd4\xcd\xa6\xa6\x84\x55\xd9\x57\xe8\x06\xdd\x0b\xdd\x83\x00\x4c\x4c\xa8\x07\x74\xb8\xa0\xa1\x66\x58\x66\xf1\x70\x85\x01\x4e\xad\xb3\xea\xe7\x38\x2f\xa8\x70\xde\xb2\x9d\xd8\xc9\x31\xb5\x30\x19\x62\x57\x40\xe2\x83\x92\xf3\x85\x75\xc0\xe2\xa9\xe5\x04\xfc\x35\xbd\x95\xdf\x56\x43\x9a\x89\x82\x30\xa2\x39\x8c\xd2\x22\x5c\x76\x6e\xf3\x6f\x12\xae\x7e\x49\xb3\x0a\x9c\x0a\xad\x46\x9d\x58\x95\xbb\xf7\x21\xcc\x0f\xf5\x1d\x84\x0c\x80\x2d\x4a\x7e\xef\xba\x84\xfe\x52\x05\xa2\xc2\xf1\x40\x11\x92\x2d\xde\x56\x14\x56\xf7\x9e\x61\x61"}, -{{0x5f,0xea,0x38,0x73,0x9c,0x61,0xca,0x83,0xbf,0x7b,0x4a,0xd1,0x75,0xa2,0x11,0x76,0x27,0xb9,0x71,0xa6,0x34,0xa3,0x05,0xa8,0x4f,0xa5,0x7f,0xec,0xb8,0x03,0x56,0x24,},{0xdd,0xd1,0x4b,0x0f,0xc0,0x67,0x68,0xd5,0x10,0x4c,0x50,0x76,0x4b,0xfd,0x3b,0x95,0x23,0x52,0xa3,0x40,0x07,0xc5,0x0d,0x5d,0xdd,0x22,0x4f,0xf5,0x1a,0xfc,0xdf,0x9c,},{0xf4,0xe2,0x74,0x82,0x3f,0x2c,0x39,0x6f,0x3a,0x32,0x94,0x86,0xaa,0x64,0x10,0xc5,0xff,0x19,0x26,0x6f,0x07,0x70,0xfd,0x04,0xfb,0x14,0xa7,0x60,0x2d,0x2b,0x69,0xa4,0xa2,0xb0,0x09,0x28,0xe9,0xe1,0xd9,0x23,0x89,0xf8,0x03,0x33,0x59,0xed,0x6f,0xb2,0x14,0x64,0x67,0xaa,0x15,0x4c,0xba,0x59,0x7d,0xec,0x6a,0x84,0x17,0x3f,0x8d,0x07,},"\x10\x13\xc6\x0a\x73\x95\x35\x49\xe5\xed\x10\x5b\xde\xa1\x50\xb9\x1e\x60\xec\x39\x20\x0d\x43\x72\x13\x04\xbf\xc8\xec\x43\x9d\x39\x60\x96\x13\xc2\xd8\x78\x04\x4a\x9d\xa0\x1b\x26\xd8\x6d\x6d\x65\xdb\x93\xd9\x1a\x13\x7e\x9c\x48\x08\xa9\x7d\x4e\xf2\x86\xa9\x03\xf3\xf1\x38\x2c\xc6\xd1\x29\x42\x16\xb9\xfa\xfc\x01\x3c\x86\xb9\xff\x68\xb5\x5a\x50\xea\x37\x66\xe6\x1d\xc1\xce\x38\x34\x8e\x91\xd6\x2c\xe7\x32\xc1\x52\xd7\x66\xb9\x33\x5c\x68\xd6\xca\xd7\x7b\xe2\xb4\xa0\xcd\x50\xb9\xa1\xec\x63\x2b\xa5\x56\x48\xa6\xe7\xe1\x1a\x14\xc0\x68\x53\xc0\x2a\xec\x48\x09\xbd\x14\x7a\x5d\xdd\x9f\xbc\x3b\xe9\xf0\xc8\x15\x8d\x84\xab\x67\x95\xd7\x71\xb4\x2b\x18\x14\xa1\x7a\x3c\x7a\x6c\xa0\xf4\xa8\xf7\xb3\xa0\xdb\x1c\x73\xba\x13\xb1\x64\x00\xdf\xec\xbd\x03\xd2\x16\x65\x0e\x4d\x69\x70\x4a\x70\x72\x46\x44\x4d\x57\x91\xfa\x27\x37\x52\xf5\x9c\xb5\xae\x9f\xd4\x16\xa5\x18\x66\x13\xd6\x6a\xfd\xbd\x1c\xe6\x91\xa8\x7b\xd7\xd8\xb6\x71\x90\xe9\xac\x68\x70\x62\xa0\x80\xd2\xec\x39\xfe\x76\xed\x83\x35\x05\x82\x51\x87\x28\x39\xe8\x5e\xb6\x2f\x18\xec\xe1\x87\xca\xba\x55\xb5\xf7\xd5\xed\xca\xde\x01\xcd\xc5\x43\xcc\x67\x7e\x50\x23\x8b\x89\xc5\x63\x5a\xd5\xc8\xfc\x22\x0f\x5e\x0b\xe1\xbc\x66\x7d\x20\x98\x97\x53\xa6\xd6\x16\xfa\x69\xf8\xb1\x29\x40\xb8\xca\x9e\x2c\x48\x57\x71\x32\xd8\x69\x1b\x05\x37\x79\xa1\x52\xcb\xac\xff\x3b\x8b\x1b\xd7\xaf\x69\x2e\x56\xc7\x3b\xba\xe4\x63\x47\x76\xcf\xc2\x13\xc9\x9b\x9a\xe4\x58\xdf\x1b\xef\xc8\xc8\x77\x74\x26\x64\xb0\xa0\xbb\x1f\x69\x15\xc8\xda\xe3\xb3\xf5\x5d\xd7\x5a\xba\x6a\x3b\xcc\x41\x76\xb4\xe3\xba\x03\xd0\xc1\xc0\x4c\x3c\x64\x08\x77\x8b\x2b\x8e\x5a\x8a\x3e\xb5\x2e\xd3\x2a\x74\x28\xc0\x0a\x98\xa5\x89\xd8\xca\x93\x90\xa2\x10\xf4\xa7\xac\x00\x4f\xa1\xfe\x4c\x6d\xa6\x94\xf1\x22\x76\xe3\x20\xb4\x1b\x0b\x59\xf7\x5d\x26\x4a\x39\x6d\x45\x0b\x63\x1a\xb3\x53\xf1\x61\x27\x09\xe7\xa2\xe6\xa5\x0d\x01\xcb\x11\x0e\x53\x04\x05\x46\xdd\x3b\x1e\x11\xd2\x57\x32\x81\x3a\xa7\x6b\xe5\xe8\x1f\xcf\x7a\x57\x73\xf6\x81\x5b\xbd"}, -{{0x60,0xf9,0xa1,0x4c,0xce,0x5d,0x43,0xfd,0x9a,0xab,0x4e,0xe8,0xcc,0x83,0x79,0xd5,0x75,0x94,0x91,0x52,0x69,0x3b,0xf2,0x9a,0x67,0x90,0xb0,0x35,0xe4,0x2a,0x44,0xde,},{0xbd,0x4a,0x70,0x74,0x0d,0x5a,0xca,0xbe,0x49,0xf9,0xa2,0x15,0x20,0x82,0xfa,0x20,0x25,0x33,0x0e,0x64,0x40,0x43,0x7f,0x1d,0x04,0x7f,0x31,0x3d,0xe4,0x90,0xdc,0xa5,},{0x72,0xf5,0x4b,0xb8,0xbd,0xd1,0x7e,0x9e,0x42,0x2c,0xd3,0x39,0x63,0x1d,0xd3,0x9f,0x57,0x35,0x50,0x15,0xd4,0xcb,0xd1,0x5a,0xca,0xb7,0x54,0x2e,0xfd,0x78,0x4a,0x32,0x1c,0x1f,0x61,0x25,0x76,0x4c,0x0d,0x15,0x40,0x45,0xb3,0x2e,0x70,0xdc,0x2e,0x03,0xfb,0xfe,0x11,0x17,0x46,0x8a,0xc3,0xe7,0x31,0x27,0xb5,0xfa,0xc8,0xd4,0x21,0x02,},"\xdd\x7f\x44\xf9\xeb\x72\x8a\xb4\x8d\xe5\x4e\xcd\xe6\xb6\x18\x4b\xd5\xdd\xd8\x70\x75\x45\xa0\x12\x9f\x2e\x90\x59\x05\xb5\x5d\x3e\x7f\xd5\x7e\x28\x48\x5d\x25\x81\x48\xf6\x60\x5e\x23\x77\xd5\xb2\x67\xd2\xea\xf4\xcd\x4b\x46\xe4\x54\x96\x22\x19\x86\x82\x32\xb6\xf4\x1f\x88\xa7\x97\xf9\xcd\xd5\xc3\x9a\xda\x51\xa6\x41\x21\x4f\xb9\xdb\x2c\x2a\x9b\x5a\x5b\x16\xe3\x03\x57\x53\x18\xb6\x25\xcc\xa9\x70\xb7\x43\x48\x72\x79\x02\xa1\xcf\x26\x8b\xd1\x6e\x10\x71\x13\x16\x1c\x8c\xbc\x99\x30\x3c\x2b\x9f\x23\x55\x41\xa7\xb3\x1e\x43\x31\x20\xfe\xba\x14\xfe\xbe\x4b\xcb\x0f\x5b\x93\x6c\x7e\xdd\xdd\x0e\xcf\xc7\x2c\x8d\x38\xf6\x4c\xdb\x6c\xfc\x29\x10\xbc\x29\xa5\x21\xc5\x0a\x51\xab\xcb\xc2\xaa\xbf\x78\x9d\xe8\x22\xcb\x04\xf5\x72\x8f\xee\x15\x3d\xd5\x50\x1b\x2d\xb5\x9c\x59\xf5\x0c\xab\x17\xc2\x92\x16\xd6\x69\x51\x01\x9e\x14\x5b\x36\xfd\x7e\x84\x1b\xfb\xb0\xa3\x28\x55\x4b\x44\xdd\x7e\xf5\x14\x68\xc3\xd5\xb7\xd3\xa1\xf7\xb9\xde\xf5\x8d\x8c\xf9\xd9\xbc\xaf\xe9\x2c\x86\xcf\x6d\x61\x19\xe9\x8d\xba\x6f\x38\xea\x57\xe3\x22\xdd\xc9\xc2\x19\x8d\x4b\xbc\x3b\x94\xea\x13\x29\xdb\x0d\x45\x8e\x01\xc7\x08\x1b\x33\x92\x5a\x3e\x28\x7f\x59\x9a\x85\x8c\x50\xc3\xa8\xf1\x8c\xc2\xaa\x63\x4d\xf6\x3e\x7f\x10\xe4\x03\xad\xea\xb2\xf4\x1d\xb5\x57\x87\x90\xc3\xb4\xf0\x41\xa8\xb7\xa4\xf6\x9c\xd6\xe0\x62\x15\xdf\x82\x01\xae\x5b\x3e\x1d\x1d\x25\xa0\xa3\x9b\xfc\x3d\x04\x1a\x2f\x98\x21\x3e\xf4\x14\x12\x45\x79\x2a\x76\xf0\x6d\x4d\xe2\x5f\x64\x67\xa0\xe5\x6f\x2f\x5c\xf6\x94\x00\xd2\x21\x17\xde\x7b\x46\x14\x95\x54\xb7\x0c\x75\xb9\xf9\x94\x84\xa4\xf6\xf0\x35\xad\x3f\x10\xe3\x75\x3c\xb1\x4f\x4f\x39\x8d\xcf\x6a\x64\xd1\x0c\xf6\xc4\xfa\xc0\x7c\x91\x19\x3c\xc0\xf5\x4f\x0d\xe5\x8c\x63\x43\xe9\xca\xaa\x6b\x4f\x47\x5e\xf9\x1a\x59\xe0\x83\xf9\xf2\x11\xf5\xbc\x8e\x7e\x45\x16\xb4\x5c\xf0\x6b\xf5\x0b\xeb\x8f\xc4\xab\x57\x9d\x86\xd4\xa4\x19\x0e\xea\xc7\x48\xd0\x6e\x08\x52\xc4\xb9\xba\x8c\xfc\x50\xdd\x0a\x03\x7a\x7b\xad\x7f\xad\x55\xaf\x30\x9a\x5f\x13\xd4\xc9\x1e\xd3\xe0"}, -{{0xa3,0x90,0x53,0xc5,0xc5,0x8b,0xf3,0x1d,0x46,0x2b,0x27,0xa6,0x20,0xb0,0xb3,0x7b,0x80,0x52,0xc6,0xb1,0xc4,0x10,0x2b,0x61,0x45,0x66,0x3a,0xa1,0x5e,0x97,0x87,0x18,},{0x36,0x42,0xac,0x2a,0x32,0x80,0xdc,0xe5,0x2a,0xd8,0xdf,0xcf,0xd3,0x70,0x94,0x36,0xed,0xc4,0xe7,0xe4,0xae,0x1b,0x45,0x2d,0x9b,0x22,0x07,0x80,0xb0,0x86,0x79,0xfa,},{0xf7,0x38,0x3e,0x96,0x6c,0xb2,0x30,0x9d,0xee,0xdf,0x86,0x01,0x00,0x18,0x3a,0xae,0xfa,0xc6,0x72,0xca,0x16,0xd5,0x41,0x9c,0xd6,0x42,0x2c,0xa7,0x0e,0x16,0xb3,0x97,0x6f,0x5f,0x16,0x5a,0xfc,0x27,0x86,0x11,0x7c,0x86,0x82,0x34,0xba,0x11,0x09,0xed,0xe0,0x31,0xf8,0x97,0x9b,0x50,0xe5,0x67,0x35,0x8b,0xd4,0xf8,0xbd,0x95,0x82,0x02,},"\xf6\x55\x40\xd3\xab\xeb\x1e\xe5\xea\x98\x70\x62\xc1\xb5\x79\x51\x6d\x3c\x29\xc3\x9c\xbc\x6b\x09\xd6\x0e\x18\xfe\x27\x4c\x2b\xef\xe0\xf5\xfe\x7d\xbd\x57\xc2\xd5\x83\x52\x29\xbb\x75\x4e\xc4\x34\x13\x94\x76\x57\x76\xd6\xa9\x17\x8c\x4e\x6a\x31\x2c\xd7\x4b\xdb\xac\xa0\xe8\x82\x70\x62\x8c\xd8\x41\x00\xf4\x72\xb0\x75\xf9\x36\x92\x83\x01\x22\xf0\x0f\x9b\xd9\x1a\xc5\x82\x83\x6c\x8b\xfa\x71\x4a\xa4\x8e\x97\x70\x03\x55\x6e\x1b\x69\x6d\xf3\x28\xef\x58\x4f\x41\x3f\x8a\xb6\x14\x76\x06\x99\xc4\xd1\x47\xc3\xee\xa1\xda\x04\x35\x83\x5c\x9b\xf7\xad\x54\x60\x6f\x02\x13\xeb\x74\xa1\xb4\x76\x14\x15\x06\xae\x2c\xd1\x24\xcd\x51\xd6\x6e\x7e\x7e\x57\x95\x60\x57\x63\x05\xc5\xfb\xe8\x43\x0b\xe3\xeb\xeb\xaa\xcb\xa3\xf9\x98\x9d\xd7\xd1\x99\xf5\xa4\x55\xa5\x0c\xdb\x37\x55\x03\x7e\x1a\x70\x67\x4a\x4f\xef\x40\xb4\xa3\xaa\xf7\xbd\x3c\x95\xb1\xab\x41\xbb\x20\x62\x11\xc3\xa1\x27\x6d\x3e\x37\xd8\xa3\xa5\xc3\xd5\xd0\xf3\x6e\xf5\xb4\xf3\xde\x26\xb7\xf2\x0f\x6b\x29\x00\x71\x6d\xcc\x22\xab\x73\x4e\xba\xf1\xe8\xd0\x00\x20\xe5\xf0\x19\x55\x16\x53\xb9\xc2\xf7\x0a\x40\x38\xdf\xb2\xf1\x2d\x25\xd6\xd8\x4e\x79\x07\x3a\x65\x48\xfe\x15\xe4\x82\x8f\xe5\xde\x83\xac\x3d\x8d\x98\xb7\xda\xf9\x27\x10\x48\x2c\x37\xf7\xbd\x24\x31\xa8\x11\x4c\x61\x37\x65\x7b\xb1\x77\x88\x2d\x8a\x3c\x76\xba\xbf\x1c\x67\x1a\x70\x55\x36\x5f\xe9\x08\x66\x16\x7a\x2d\x1d\xbc\x87\x0b\xe8\x3b\x36\x01\xf0\x9d\x4a\x31\x7a\xe2\x54\xca\xc9\xf9\x8d\xcc\x7a\xea\xd9\x22\x4c\xd9\xc9\xd8\xa2\x00\xab\xc8\x0a\x2d\xd1\x08\xaf\x28\xfd\x46\xad\x70\x80\xae\x74\x1b\x50\x05\x4b\x9b\x9a\x92\x01\xef\xb7\x83\x8b\xc4\xc5\xc2\xcc\x3d\x76\xba\x0f\xcc\x49\xc4\x6e\x79\x2c\x26\x29\x2b\x7d\x03\x12\xaf\xf9\x55\xa9\xf8\xed\xf0\xc6\x96\xa7\x0a\x61\x4f\x35\x53\xad\x38\x69\xbf\xde\x48\xd2\x6a\x4d\x36\x7b\x6c\xec\x05\x7e\x62\xa4\xe5\x48\x55\x4b\x48\xb5\x3e\xcd\xa7\x90\xba\x7a\x0a\xb2\xe3\xde\x58\x7b\xdc\x22\xb0\x2f\x59\x47\x63\x4d\x73\x09\x9f\x54\x7d\xb2\x2e\xc1\xbb\xf8\x23\x43\xf9\xa2\xca\x38\xbc\xe4\xeb\x59\xbe"}, -{{0xe0,0xc2,0x9d,0xf4,0xde,0x45,0xc4,0x75,0x39,0xe0,0x89,0x6b,0x3a,0x59,0xbc,0x3d,0xe6,0xb8,0x02,0xfd,0x14,0xdb,0xdc,0x9f,0x25,0xe7,0x17,0xac,0x82,0xc3,0x28,0xf3,},{0xa6,0x90,0x02,0xb0,0xf5,0xef,0x35,0x4c,0xe3,0xb2,0xd6,0xb8,0xd8,0xba,0x70,0xab,0x77,0x84,0x32,0xb2,0x2f,0x14,0x4d,0xc9,0xc2,0xeb,0x92,0xd9,0x9d,0x99,0xdd,0x2a,},{0xbb,0x3b,0x8c,0x5c,0x27,0x59,0x1f,0xd8,0xb9,0xc5,0xba,0x48,0x9d,0x6b,0x6e,0xe5,0xb0,0xfb,0x4a,0x7b,0x0d,0xe5,0x1f,0x16,0x39,0xaf,0xc6,0x73,0xd0,0xe5,0xf7,0x5e,0x31,0x3a,0xa7,0xe1,0xd0,0x00,0x90,0x81,0xdb,0xca,0x74,0x35,0xb6,0x87,0xcc,0xd1,0x2f,0x64,0xf7,0x4a,0x38,0x6e,0x77,0x2b,0x9e,0x24,0x78,0x1b,0x92,0x5c,0x8c,0x0c,},"\x6a\x37\xcb\x4c\x74\x9c\x58\x35\x90\xc8\xd8\x49\xbc\xe3\xfa\x65\x7f\x10\x00\x91\x90\xca\xd9\xbe\x41\xed\xe1\x9b\xf2\xfd\xb3\xc5\x62\xa6\x10\x1f\x27\xbd\x37\xf2\x23\xca\xb1\x3c\xed\x24\x5a\x1c\xed\xf8\x52\xf5\x51\xf8\x57\xaa\xd9\x72\x7f\x62\xc9\x67\xc0\xa9\x21\xdf\x11\x6f\x48\xa8\x0a\x60\x40\xb3\xc7\x23\xab\x5c\xb5\x94\xc4\x50\x7a\x3d\x20\xcd\x60\x51\x4e\x22\x16\x4a\x82\xb7\x4f\x19\xdc\xfd\xd8\x3c\x57\xbc\x36\x52\x37\x55\x17\x41\x4a\xf5\xd1\x8e\x0a\x64\xcc\xab\x36\x69\x97\x68\xd0\x7c\xf4\x0b\x70\x63\xa8\x3e\x43\xd5\xf6\x07\x96\x4b\x1b\xf0\x84\x0a\x45\xad\x50\xab\xf8\x3d\xbc\x84\x9f\x40\xe5\xb4\xcf\xb6\xa3\x34\x7b\x29\xfe\xc5\x07\x74\x04\x6a\x4b\x50\x04\x10\x32\xaa\x4d\x56\x7e\x85\x64\xb3\xee\xd1\x64\x20\x40\x68\x2d\xd8\xae\x7d\x71\x79\x28\x6c\xf6\xe1\x85\x3d\xc8\x7d\x27\xc3\xe9\xe6\x0f\xa4\x7c\xf8\xcb\x2d\xa0\x18\x1d\x53\xee\xc4\x06\x14\xb0\x73\x31\xa4\xfb\x70\x28\x08\x6d\x0b\x1c\xe2\xe1\x11\x5b\x73\xa1\x62\xc5\x27\xbd\xd7\xca\xb5\x33\x5b\x86\x3d\x10\x8b\xe0\x47\xbd\xbc\xa1\x12\xcc\x6e\x77\x6b\xb4\x53\xc3\x17\x31\x43\x88\xbb\x96\x53\xef\xb4\x44\x4b\xf5\xcf\x1e\xc8\xda\x23\xb7\x11\xba\x71\x79\x6c\x0a\xe0\x2b\xa1\xdc\xc8\x38\x45\x50\x78\xc3\x89\x7f\x07\xe9\xe1\x3b\x76\xe4\x92\x74\xc2\xe2\x07\x50\x6b\x00\xa0\xb5\x58\x88\x3a\xa1\x22\xb6\x67\xdb\x9d\x67\x05\x08\x60\x6a\x3f\x54\x32\x06\x36\xcd\x19\xf9\x73\x91\x7f\xb1\x87\x5f\x43\x63\xe2\x20\xf1\xe1\x23\x98\xcc\x6a\xfd\x79\x09\x47\x43\x33\x84\x56\x81\x3a\x58\x26\xad\x3f\x1a\xba\x7c\xd7\xbe\xab\x1f\xe1\x83\x85\x9c\x0c\xc9\xef\x40\xa5\xea\xb9\x12\xca\xf5\x15\xa8\xd4\xc3\xb9\x3d\x64\x1b\x7a\xb3\xe7\x6b\x16\xc1\x29\x71\xac\xe8\x8f\xf3\x3e\x5a\x1e\xd9\xb4\x4e\x45\xdb\x8f\x30\x85\xdb\xf0\x70\xb2\x56\xb0\xd7\x51\x2e\xe1\x06\x94\x32\x60\x3d\x73\x09\x5d\xb8\x74\x9c\xa5\x47\x96\x3b\xd7\x1a\x8a\x68\x4a\xb8\x51\x6b\x14\x6c\x41\x87\x17\x63\x86\xaf\xdf\x6c\xb1\x36\x8a\x3d\xd8\xfc\xb2\xcf\xff\x77\x05\x6a\xaf\x78\x23\xf8\x00\xb2\x66\xac\xce\x72\xbf\x64\x3c\x6d\x0c\x28\xf0\xab"}, -{{0x19,0x8b,0x5f,0xd1,0xc0,0x38,0x27,0xe0,0x99,0x4a,0xd5,0xbf,0xee,0x9b,0x5b,0x7b,0xe9,0x96,0x6c,0x9c,0x3a,0x26,0x7e,0x4d,0x74,0x30,0x34,0x37,0x67,0x40,0x3c,0x67,},{0x66,0x82,0xc6,0xf1,0xa8,0x66,0xb4,0x9b,0x2f,0x8e,0xe9,0x7f,0x2e,0x53,0x2f,0xa9,0x16,0x66,0xbf,0x38,0xda,0x1b,0x4d,0xd6,0x55,0x43,0xa1,0x77,0x77,0x94,0xcb,0xee,},{0xf4,0x54,0xf3,0x5b,0x18,0x53,0x8f,0x87,0x7e,0x5d,0x61,0x4a,0x76,0xb5,0x27,0x6a,0x27,0xfc,0x0b,0x43,0x3f,0x21,0x5d,0xc4,0xe9,0x63,0xb3,0xf0,0x47,0x69,0x4c,0x78,0x0c,0x51,0x5c,0x6e,0xf6,0xfe,0x2d,0xb4,0xb0,0x09,0x00,0x9b,0xc2,0x73,0x3a,0xec,0x4f,0xd4,0x6e,0x61,0x53,0x57,0xcc,0x0b,0xcc,0x9f,0x1f,0x7f,0xc2,0x1e,0x3c,0x02,},"\x3f\xda\xa1\x5c\x46\xf2\x51\x43\xdb\x97\x20\x79\xd7\x01\x3c\x7f\x69\xa1\x36\xf4\x5f\x3f\x6b\xa2\xce\xd8\xb8\x28\x46\x8e\xb3\xda\xa6\xb5\x0b\x4f\x8d\x33\x80\xfe\xc6\x4a\x03\x43\xbe\x11\x6f\x6f\x83\xb6\xee\x64\xcc\x4c\x1b\x1d\x08\xd5\x4f\xd4\x20\x29\xe4\x28\x5c\xfc\x6c\x6d\xd5\xcd\x18\x1a\xb5\x33\xff\xcd\x41\x1f\x23\xa1\x00\x3d\xa9\x4e\xc9\x34\x0e\x2e\xc7\x11\x99\xd6\x78\x54\x0d\x51\x82\xe1\x39\xff\xcb\xc5\x05\xa1\x70\xb8\xf0\x7f\x4a\x7e\x69\x4c\xa9\x2f\x58\x32\x0c\x0a\x07\x85\x64\xce\x9d\xe9\x9b\x0f\xa8\xe6\x6b\x0d\x82\x2e\x46\x7a\x5a\xeb\x83\x56\x79\x96\xa4\x8b\x89\xdb\x25\xca\xde\x64\x57\x79\x4e\x54\x14\xd6\x7e\x9d\x4a\xb7\xcd\x6c\xc2\x05\x8b\xb7\xa5\x13\xab\xd7\x09\xf4\xca\xf2\x4b\xb6\x7c\xe1\xc0\x3a\xb6\x2d\xbd\xfe\x30\x9e\xc7\xdb\x0f\xa3\xea\x7a\xae\x82\x36\xf2\x59\xb9\x22\xd4\x53\x61\x15\xa6\x3b\xc8\x9a\xcb\x20\x51\xd0\x9e\x73\x1c\xbb\x0d\xf1\x57\xd9\xd3\x45\xbd\x91\x09\x97\x3c\x2b\x59\x4f\x14\x8e\xfc\x6f\x33\x77\xde\x51\x63\xb7\xf6\x98\x69\xff\xef\x85\x3e\xae\xfe\xb4\x02\xe2\x35\x29\x59\x4f\xbd\x65\xca\x05\xfe\x40\x62\xc5\x29\xd8\xe3\x21\xab\xc0\x52\x00\xca\xc1\xe8\x39\xe8\x7b\x1f\xd3\xfd\xf0\x21\xd6\x8c\xbb\x3a\x41\x42\xb6\x9c\xc3\xaf\x6f\x63\x2e\xdd\x65\xb8\x3f\x5a\xa4\xcb\x17\xda\x5b\x6b\xa3\xfc\x03\xed\xb1\x7c\x2a\x3c\xb5\xb0\x48\x36\xe7\x66\x0e\x63\xc8\xa0\x48\x3e\x24\x39\x83\x37\x1d\xfa\x98\x39\xf9\x16\x4a\xd4\xda\x0d\x59\x53\x65\x5e\x3a\x95\x18\xe1\x36\xda\x74\x57\x37\xc7\x92\x43\xc3\x55\xfc\x12\x5c\xbd\xcc\x76\xae\xc9\x22\x16\x84\x6c\x45\x74\xf4\xf7\xf2\x98\xbc\xde\x54\xfd\x24\x44\xad\x30\x25\x95\x5c\x10\x03\x15\xde\x5a\x4e\x27\xc3\x33\xa0\x02\x84\xb2\xf7\x02\xfd\xd3\xde\x22\xac\x6c\x24\x0d\xbc\x14\xbf\x71\xe6\x2d\x13\x1b\x62\xf2\xdb\x99\x24\x73\xf2\xf9\x13\xf6\x0c\x91\x6e\xcf\x57\xdf\x5f\x3f\x02\x1f\xb3\x30\x83\x43\x95\xb7\x94\x72\xca\xff\x19\xfc\xfa\x0a\x27\x17\x95\xc7\x6d\x69\xb4\xdb\x3f\x85\xb8\xd2\xe5\xc3\x44\x19\x65\x48\x4d\xcc\x39\xab\xa5\x9b\x70\x12\x74\xf7\xfc\x42\x52\x46\x85\x60\x69"}, -{{0x43,0x92,0xf7,0xd4,0xfb,0xd6,0x8f,0xe1,0x54,0xe4,0xba,0x38,0xad,0x52,0x07,0x61,0x2a,0x06,0x48,0x55,0x60,0x56,0xc3,0x9a,0xc1,0x16,0xad,0x46,0x8f,0x89,0xbd,0x2d,},{0xcb,0xea,0xef,0x41,0xac,0xac,0x02,0xbf,0x1f,0x78,0x0c,0xe9,0x34,0xaa,0xbd,0x63,0x13,0x64,0xb3,0x69,0x56,0x7b,0xe1,0xbe,0x28,0xe3,0x90,0x6f,0x9d,0xb1,0x20,0xfa,},{0x86,0xe7,0xcc,0xf0,0x6e,0x79,0x36,0x2d,0x40,0xcd,0xb7,0xfb,0x75,0xa9,0x89,0x78,0xbb,0xd3,0x34,0xa1,0xdb,0x75,0x90,0x36,0x7d,0x60,0x84,0x9b,0xd5,0x3e,0x2f,0xb1,0xa4,0xbd,0xae,0x59,0x0d,0x1f,0x47,0xb5,0x49,0x0d,0x87,0x02,0xe7,0xc1,0xa8,0x72,0x68,0xb8,0xee,0x9d,0xb6,0x12,0xde,0x7b,0xdc,0x2e,0x38,0xfa,0x6d,0xeb,0x7e,0x05,},"\xcf\x17\x09\xdc\x9a\x08\x67\xee\x90\x87\x21\xb1\x36\xcb\x93\xa8\x42\x29\xe8\x3b\x46\x20\x47\x77\xca\x81\x94\xd0\x8b\x7a\x3c\xa9\xc9\x12\xeb\x24\x3e\x5b\xda\xbf\xee\xd3\x52\x34\x9d\x20\xbe\x80\x1b\x72\x2a\xf0\x89\x22\x38\xe7\x2e\xdf\x19\x0e\x63\x61\xf5\x75\x72\x78\x1a\xd3\xc2\x59\x0b\x19\x73\x57\x64\x1c\x80\x53\x83\xba\xa1\xd4\x97\x2f\x76\xc6\x54\x48\x53\x2c\x11\x08\x34\xa0\xba\xa8\xf4\x88\x63\xe1\x66\xb7\x06\x65\x37\x08\xcd\x40\x57\xd3\xa4\xf9\xfc\xb2\xce\xb4\x12\x00\x01\x27\x7d\x38\xc4\x38\x47\xd8\x22\x82\x2b\x77\x7c\x2b\xb4\xda\x40\x15\xa1\xc2\x4d\x41\x6d\x50\x62\xa8\x71\x84\x91\xd8\x55\xaa\xa5\xdb\xf5\x57\x9c\x16\x4d\x8e\x52\x4a\x9f\x2f\xa3\xf2\x2e\xb0\x98\x61\xff\xe6\xad\x65\x9f\xe3\x6e\xb4\x04\x31\x22\x2c\x22\xd7\x13\x7a\x6c\xab\xca\x8d\xb7\x86\xe3\x9d\x81\xf6\x61\xaf\xde\x4e\x39\x58\x9b\x4d\xb4\xd3\xc5\x1c\xa5\x35\x90\xa1\x4e\x11\x5d\x0a\xfc\x3a\x87\x7b\x83\x9a\x96\x38\xbe\xce\x80\xc3\x2c\x19\xe5\x1b\x75\x32\x02\x48\x45\xf7\x6c\xfe\x9b\xfb\x2a\xc0\x51\x30\xf6\x75\x8b\xf7\xfe\x99\x3a\xa9\x3a\xa2\x72\xe4\xe6\xbd\x0c\x75\xc1\x40\x99\xd4\x3e\x65\x2a\x22\x3e\x5b\xcd\x64\xc3\x62\xd4\xb8\xf4\xb9\x5e\x01\x6f\x93\x50\xc7\xfa\x74\xe6\x53\x52\x5d\x08\x01\x15\x58\xb2\xc6\xe9\xbf\x4f\xdf\x9d\xbd\x5e\xf9\xb0\x9b\xbc\x84\x6a\xfc\x2b\xcb\xc8\x6c\x4c\xcc\x31\x5f\x6d\x1c\xcd\x48\x9b\x0c\xf8\xed\x0d\x93\xf2\xf5\x32\xa4\x26\x26\x5c\x59\x0b\xa3\xa5\x90\x23\x34\x7d\x81\x9d\x9b\x28\x1e\xf8\x53\x10\xb0\x53\x16\xd4\x6c\x8a\x8c\x03\x65\xd0\x68\xa8\x70\x86\x64\xea\x4d\x77\xac\x0c\xd1\x50\xa6\x5a\x56\x58\x6b\xab\xd3\x4b\x74\x36\x5b\xb8\xfe\x3e\x61\x87\x26\x22\x84\xd6\x44\x32\xe4\xc8\x1e\xa4\xc0\xe5\x7c\x1d\x71\xae\x98\x0c\x7f\x4d\x1d\x87\x10\x32\xe1\x88\xbb\xf9\xd1\x75\x8c\xdc\x1d\xff\x98\x9f\x2d\x12\x88\xfe\xf4\xe2\x05\xe9\x9e\x7c\xbf\x2c\xc3\x24\xb8\xc9\x30\x46\xf4\x76\xc5\x9d\x3d\x0a\x59\xdb\x6f\xe3\x73\x82\xdc\x79\xc5\xec\x16\x05\x6a\xb3\x93\x4a\x52\xf7\xd2\x88\x0d\x04\x71\xa3\x77\xb6\xa8\xae\x84\xd5\x6a\xc2\x2d\x1d\x54\x55\x1c"}, -{{0x0b,0xea,0x98,0xab,0xe7,0xd6,0x3f,0x15,0x83,0x90,0xee,0x66,0x8a,0xa0,0x50,0xe8,0x4a,0x25,0xd2,0x89,0x3e,0x49,0xfc,0x83,0xf0,0x79,0xf9,0xbb,0xa6,0xa5,0x5a,0x75,},{0x22,0x19,0x2e,0xc0,0xd3,0x2e,0xf9,0x83,0x56,0x65,0xa6,0x1b,0xc8,0x8b,0xcf,0x4e,0x16,0x04,0x63,0x79,0x21,0x15,0x2c,0x11,0x6a,0xf5,0x03,0x36,0x5b,0xf6,0xbe,0x42,},{0x7e,0xb3,0x13,0x9b,0x88,0x0f,0xdf,0x66,0x37,0x6a,0x20,0x90,0x81,0x88,0x40,0x04,0x97,0x67,0xc8,0x37,0xf3,0xad,0x00,0x36,0xb1,0x41,0x66,0x70,0x52,0xb3,0x36,0x09,0x81,0x7c,0xa5,0xe2,0x40,0xed,0x8c,0xdf,0x3c,0xcf,0x3a,0xee,0x29,0x27,0x45,0x34,0x59,0x4d,0xb0,0xb4,0xcc,0xc5,0xc6,0xe5,0xbb,0xa3,0x28,0x0b,0x87,0x3f,0x29,0x01,},"\xc1\x78\xe3\x8d\x4e\x83\xed\x2b\xe5\x7c\xe1\xc3\xab\x64\x25\x3a\x81\x71\xe6\x10\x00\x81\x81\xfb\xfc\x6d\x75\x22\x69\xf7\xf1\xc5\xa9\xec\x62\xcb\x27\xf1\x9a\xd9\x9c\xe1\xf5\x11\x6a\x36\x3d\x96\xfd\xc5\xa4\x2f\x35\x8b\x6d\xbe\x7c\xab\xdf\xc9\xf6\x07\x18\xe4\x01\x2c\x1b\xb1\xf8\x42\xc5\x56\x08\x11\xba\x83\x74\xa0\x63\x77\x47\xff\x92\xea\xc2\x1c\xa6\x5d\xde\xaf\x43\xe9\x98\x9b\x7d\xe2\xd4\x32\x52\x0a\xfe\xe3\x64\xec\xfb\xa4\xda\x66\x9a\xd4\x89\x3d\x0b\xf6\x9f\x9f\x81\xe7\xdf\x69\x65\x7b\xe2\x2b\x92\x06\x97\x45\xf2\x16\xc2\x42\xcc\xd4\x6d\x02\xd3\x56\x16\xe1\x6c\x75\x5e\x0e\x37\xf9\x61\xa6\xf3\x63\x77\x52\x53\x4f\x6d\xfa\xb8\x80\x5a\xb7\x59\xa0\x32\xa4\xe7\xe4\xc8\x19\x53\x32\x5a\x2f\x68\x6b\xb6\x9a\x02\x9c\xe4\xe0\x3b\xec\xb3\x60\x56\x37\xc5\xa6\x5b\x52\xe3\x31\xc2\x6c\x92\x6e\xd4\x71\x1a\x50\x4d\x37\x33\xbb\x53\xc9\x7b\x80\xea\xfe\x4e\x75\xdd\xd9\xf4\x15\x36\x28\x88\xc3\xd4\xd3\x7b\xae\x0e\x63\xfa\x11\xbf\x75\x56\x66\x43\x7d\x72\xf5\x8c\x91\xd7\xa2\xf8\xcb\x61\x9b\x76\x20\xa0\x70\xb2\x6b\x18\xb4\xd5\x01\x84\xc5\x81\x87\x12\x11\x0e\x36\xd3\xe2\x83\x0f\x6a\x85\x76\xba\x57\xf9\xcc\xcb\x8f\xff\x40\x28\xbf\x8e\xf9\xcb\x81\x48\x25\xbb\xca\x82\x7d\x64\x95\x47\xbf\x6f\x2b\xef\x93\x17\x04\xca\x7f\x6d\xf1\x5f\x78\x01\x55\xed\x46\xea\xa7\xca\x7d\x72\xe2\x24\x34\xca\x04\x83\xbf\xb2\xf7\x90\x2d\xc7\x87\xf6\x17\xeb\x9b\xd4\x1e\xd4\x52\x0a\xdf\xd4\x30\x94\x8c\x71\x08\x05\xa7\x3c\x1b\xa5\x49\x2e\x96\x48\x4c\x4b\xaa\x7d\xa2\x4c\x74\x35\xc4\x6a\x05\x2b\xf3\x51\x5d\x33\xe4\x2d\xce\xf5\x17\xca\xa4\x5f\x36\xc8\x79\x12\x10\x78\xc6\x88\xdd\x10\xd7\x66\x56\xa1\x19\x76\x2b\x6a\x83\x41\x36\xfa\x1f\x8a\x64\x32\x24\xb9\x22\x4c\x54\x3c\xf0\x47\x0b\x3f\x8e\xe0\x17\xd6\x20\xdb\xdc\xc8\x4d\x98\x51\x54\xe9\xd1\xae\x80\xe5\xf1\x43\x87\xb8\x8a\x0f\x6a\x5c\x35\x90\x5a\xa5\x7f\xb3\xab\xeb\x0e\xa6\xec\xcd\xdb\x00\x44\x74\x63\x3c\xc4\x83\xb5\x6b\x8a\x8e\x20\xe8\xf2\xe0\x9e\x97\x9a\xa0\x98\x93\x08\x78\x75\xc6\xb1\x17\xb5\xf1\x38\x47\xad\x8f\xc0\x56\x04\xc4"}, -{{0xc2,0x58,0x78,0xb0,0xd1,0xe0,0x92,0x5c,0x8f,0x5f,0x04,0xa1,0xe5,0x79,0x90,0x80,0x96,0x3c,0x41,0x3a,0x13,0x99,0xc1,0x18,0xaf,0xb1,0x68,0x7c,0x79,0x7f,0x48,0x39,},{0x13,0xac,0x2c,0xad,0x41,0x90,0x8c,0x25,0x5f,0x67,0x1f,0x93,0x93,0x4a,0xe5,0xd7,0xbe,0x32,0x53,0x46,0x72,0x5c,0x8b,0x40,0xdc,0x39,0xea,0x80,0xd7,0x0d,0xdf,0x34,},{0x06,0xf5,0x51,0x98,0xb4,0x19,0x19,0x14,0xb7,0x43,0x06,0xf3,0x8e,0x38,0x13,0x16,0xea,0xc4,0x0b,0x5b,0x5a,0xdb,0x8a,0x31,0x24,0x64,0xf6,0x71,0x75,0xec,0xf6,0x12,0xe0,0x14,0x7b,0x1c,0xef,0x46,0xc2,0x51,0x87,0x50,0xa5,0x60,0x6b,0xb0,0x3b,0xc6,0x46,0x7b,0xb9,0x32,0x15,0x14,0xf6,0x9d,0xcb,0xeb,0xce,0x8f,0x69,0x05,0x80,0x02,},"\x68\x56\xcc\x71\x44\xb6\xbd\xdc\xc4\xb5\x89\x54\xd1\xa2\xe7\x10\x1d\x65\x84\xb5\xd5\xe7\x19\xa0\xae\xa0\xfb\xbd\xf2\x21\xc2\xa2\xaa\xcb\xac\xdc\x40\x20\xc5\xc8\xce\x68\x1f\xf7\x38\x1a\xcd\x60\x7b\x0f\x52\x39\x69\x23\x35\x70\x06\x55\xbe\x2d\x94\xc5\x3d\x7b\x51\x48\xe9\x2a\x2b\xc1\x63\x38\xc2\xf4\xc1\xa7\xd1\xc5\x95\xaf\x62\x2c\x24\x0c\xe5\x79\xa5\xe0\xf5\xb6\x51\xbf\x56\x25\x18\xce\xc8\xaa\x2c\xe4\xb4\xaa\xdb\x1f\x2f\xda\x6c\xf6\x29\x5b\xc3\x78\x03\xb5\x37\x7d\xab\x65\xc9\xb9\xa2\x94\x9f\xdd\x49\xbf\x9d\xdc\x8f\x96\xd2\x60\xff\x95\x1b\xf8\xe8\xcc\xf9\x82\x7e\x68\x69\xc4\x4b\xfd\x97\x33\x58\xce\xfd\xb0\x10\xdb\x5e\x1f\xe5\xdb\xd9\xf5\xd2\xb2\xca\x39\x3c\x17\xd4\x46\xf6\x37\x05\x9e\x69\x2d\x7a\x91\xaa\xdc\xc7\x68\x9f\x5f\x9e\x1b\x30\x52\x17\x5d\x9b\x6b\x20\x8f\x90\x26\x78\x7f\xdb\x66\x78\x3f\x45\x37\x2a\x24\x94\x6b\x1b\xd1\x68\x7b\xf0\xcf\xcc\x81\x74\xeb\xe4\xd3\x2e\x43\x28\x4f\xc7\x8d\x78\x44\xde\x0f\xa2\x2e\x20\x65\xe0\x75\x28\xba\xab\xaf\x01\x5c\xb3\x4d\x62\x9c\x35\x96\xad\x04\x0d\xe3\x1c\x56\x20\xeb\x26\x6d\xef\xa7\x53\x3a\xc0\x40\x19\x98\xe5\x67\x3a\x75\x43\x65\x04\x7d\xeb\xfc\xf7\xe1\x37\xa2\x0d\x16\xcd\xd6\xa5\x52\x19\x82\xf4\x44\xcf\xc3\x42\x93\x97\xc6\x41\xbd\x7e\x74\xa7\x70\xbb\x11\xfc\xb2\x94\x83\xe3\x37\xba\xe5\x16\x9e\xe8\x2d\xa9\xa9\x1a\xdf\x3a\xf6\x7c\xd8\x14\xc2\x82\x5d\x29\x01\x8e\xf0\x35\xea\x86\xf8\xde\x4c\x75\x63\xaa\xf6\x6e\x0c\x75\xd1\x7c\xa6\x8f\x49\xf0\x75\x8e\xc2\xd9\xc5\x17\x9d\x01\xaa\xed\x7d\x45\x15\xe9\x1a\x22\x2b\x0b\x06\xfb\xde\x4f\x07\xa7\xd9\xdf\x2d\xe3\xbc\xae\x37\xca\x2c\x84\x60\xc2\xa6\xb3\x74\x9e\x9b\xda\x36\xd0\x8e\x66\xbc\xc3\x56\xb3\x90\x43\x4b\x4a\x18\xcf\xa4\x5a\xf5\x57\xdc\xa3\xd8\x57\xff\x3a\xd3\x47\xcf\xb0\x7e\x23\x58\xc2\xac\xfd\x5c\xd5\x3b\x3b\x0e\xa2\xa4\x1e\xe5\xc0\x80\x2f\xd4\x73\xdb\x5f\x30\x52\x63\x34\xda\x41\xeb\x4b\xc7\x51\x83\x83\x89\x8a\x0b\x75\x07\xad\x4c\xa2\x89\xd6\x6c\x5e\x2e\xb7\x5c\xf2\x55\xdf\xf3\x12\xcb\x1e\x04\xee\xbe\xb4\x7f\x29\x30\xb9\x0d\x5e\x00\x2e\xb0"}, -{{0x0b,0x2e,0xc6,0x27,0x63,0xf6,0x87,0x59,0x31,0x35,0xda,0x19,0x61,0xef,0x29,0xa2,0x88,0x08,0x96,0x96,0xd9,0x44,0xb2,0x65,0xa5,0xf9,0x68,0x93,0xcd,0x2d,0x82,0x25,},{0xc1,0xe2,0x34,0xfa,0x8b,0xc9,0x6d,0x26,0x8e,0x7a,0xad,0x02,0x8b,0x03,0xf0,0xa9,0x11,0xb6,0x97,0x71,0x5d,0xb3,0xa2,0x1c,0x2f,0xc7,0xdf,0x48,0xec,0xda,0x88,0x75,},{0xff,0x70,0x1f,0x34,0xb3,0x59,0x4d,0xe3,0xb8,0x00,0x45,0xf4,0x29,0xe5,0xe3,0x2d,0xd8,0x8d,0x60,0x51,0xd4,0x19,0x5f,0x16,0x85,0xbe,0x78,0x37,0x66,0xe8,0x01,0x19,0x36,0x8f,0x56,0xb3,0x74,0x97,0x25,0xb9,0x13,0xf1,0x22,0x3f,0x87,0xfb,0x0f,0xb2,0x4d,0x9d,0xfa,0x08,0x41,0xd6,0xa0,0xe2,0xeb,0x1f,0xdd,0xf7,0x75,0xc2,0xd2,0x05,},"\xa8\x34\x34\xc6\x86\x93\xd5\xfc\xed\x91\xbd\xa1\x02\x13\xfc\xd5\x0c\x48\x92\x0b\x90\xce\xe9\xb7\x3a\x9c\x61\x08\x1a\x09\x74\x93\x3f\x4f\xdb\x0a\x67\xe6\x71\xf8\x35\x1b\x0e\xd5\xec\x0f\xe7\xb5\xfb\x0c\x87\x58\x6f\xe5\x82\xff\xb1\xbf\xa2\xdb\x5f\xce\xdd\x33\x02\x42\x82\x34\xb2\xbb\x0e\x72\x6d\xed\xf4\x5b\x13\xa7\x0c\xd3\x5a\xb3\xe2\x99\xd1\x3f\x34\x50\x35\x08\x27\x8c\x44\x58\xee\xa5\xb7\x35\x1b\x05\x83\x6b\xda\xd5\xb0\x5f\x60\xe4\x45\xfc\x65\x73\x7a\xe2\x7d\x2e\x52\xdf\x9c\x39\xe5\xda\x02\x86\x39\x2d\x08\xff\xf7\xec\xb7\x06\x68\x20\xfc\x90\xfc\x8a\x44\xd5\x61\x65\x61\xc5\x0b\x52\x71\x47\x02\x30\x2b\xca\x58\x74\xde\x85\xdb\xa0\x45\x04\x5f\x9f\x0e\x60\x4e\xb8\x6d\x6d\x7f\xbd\x77\x5f\x72\xea\x49\x3b\x2c\x4e\xf7\xc3\xbe\x16\xdb\x2c\xa7\xe4\xd8\xbd\x79\xeb\x20\xcf\xb5\xf0\xf6\xf0\x53\x36\xb7\x5c\xc8\x6d\x21\x9f\x3b\x8f\x2e\x91\xba\x7d\x52\xb6\x4f\xdd\x6a\x66\x64\xf0\x4f\x2f\xba\xb7\x58\xcd\xf9\x84\x16\x86\x91\xc3\x2f\x53\xe8\x61\x6b\x49\xf7\x6a\xb7\xb1\x92\xb9\x00\x90\x30\x82\xcc\x89\x65\x6a\x97\x05\x80\x4c\xc9\xb9\x28\x8a\x3e\x42\x17\x09\x84\xf8\xdc\x45\x4e\x08\x64\xb9\x34\x16\x72\x68\x6a\x17\x8c\x06\x00\x50\x17\x8a\x36\xc6\xd9\x06\xb2\xce\x07\x0d\x8f\xaa\xac\xd9\xa5\x8c\x79\x4a\x5e\xa4\x10\x8b\x4a\x48\x5c\x65\x81\x1c\x2d\xca\x2e\xe7\xbb\x10\xbf\xff\xf7\x5d\x45\x86\xb9\x90\xf4\x37\x63\xa1\x6f\xbc\x0b\x48\xae\x1f\xaf\xb0\x8a\x9a\x36\xfa\x43\x26\x84\x5d\xba\x5b\xa2\xfb\xd3\x2b\xbf\x66\x50\x5c\x5e\x86\x57\xed\x01\x07\xe3\xe1\x61\x44\xef\x31\xfa\x6a\xae\x72\xe7\x74\x09\x74\x83\xf5\x48\x0a\xa4\x55\x40\x56\x8f\xd0\x8c\xba\x0d\x57\x77\x68\x00\x4f\x58\xae\x9b\x95\xbe\x37\x4e\xd7\xf0\x29\x9f\xe7\x21\x27\x5e\x47\x6e\x0b\x9a\xb7\x2d\xc0\x6e\xa3\x28\x38\x4e\x39\xbf\x3a\xc3\x31\xc6\x25\x48\x43\x12\xcd\x9b\x06\xb1\x5a\x29\x54\xd3\x3e\x7a\xab\xa6\xbe\x22\x61\x88\x6c\xa8\x11\xdb\x96\xb1\x14\x3d\x06\xdd\x6e\x0f\x3c\xba\x7a\x1a\xe9\xb9\x4e\xaf\x67\x77\x1b\xb2\xd2\x4e\x2f\x94\xde\x9c\x47\x0f\xcd\xe7\xbf\xdb\x32\xf4\x10\x19\x8b\x5a\xa9\x69\x8e\x32"}, -{{0x89,0x60,0xd7,0xbe,0xe8,0xc6,0xb3,0x9c,0xa5,0x93,0x4d,0x7c,0xdd,0xd1,0x6f,0x16,0xb3,0x66,0x3e,0x6e,0x03,0xe8,0x33,0xc0,0x57,0xe2,0x18,0x1e,0x45,0x97,0xcb,0x68,},{0x43,0x40,0x90,0x95,0xd4,0xf5,0x0f,0x5e,0xdd,0xbd,0x5c,0xd4,0xd2,0x01,0x22,0x98,0xcb,0x41,0xa4,0x0e,0x99,0x49,0x2d,0x5a,0x2d,0xb0,0x8b,0xe5,0x37,0x7e,0xa1,0x83,},{0x72,0x13,0xdd,0x4a,0x79,0xfd,0x54,0xde,0xc0,0xc5,0x48,0xef,0x42,0xe6,0xca,0xe0,0x15,0xbe,0x77,0x80,0x2b,0xf5,0x15,0xcd,0x25,0x82,0x76,0x8f,0x72,0xf5,0x63,0xeb,0xb2,0xda,0x36,0xaf,0x4a,0xae,0xac,0x56,0xbb,0xff,0xc9,0x93,0x2c,0x2e,0x24,0xec,0x95,0xda,0xff,0x00,0xa5,0xf7,0xa0,0xac,0xab,0x9c,0x8b,0xd3,0xc2,0x3b,0xb4,0x0c,},"\x30\x8d\x84\xc7\xa5\xf7\x86\xe5\x63\xe5\xc1\xea\x57\xaa\xb5\xe5\x55\xc0\x09\x97\x74\x9d\x15\xae\xe3\x54\x39\xef\xa6\x45\xda\x2c\x39\x67\x70\x31\x15\xc6\xc6\x3e\xd7\xf9\x47\x85\xc5\x47\x8f\x38\x46\x7b\x86\xe7\x62\x6e\x8f\xff\xa4\xd5\x1a\x2d\xc4\x5e\x6d\xf2\xa3\x5c\xec\x99\x55\x5e\xab\xc9\xf7\xa9\x3e\x2e\x2b\x68\x94\x59\xb4\xe0\xc9\x2b\x35\x15\x62\xc4\x17\xb1\x99\x71\x13\x75\x4e\xa5\x9e\x4a\x91\x51\x07\x28\xff\x30\x71\xa2\xbb\xd1\xf4\x65\xa6\x87\xf6\x7d\xae\x95\x56\x15\x03\x1a\x8a\xd5\x51\xfe\x73\x8a\x26\x0b\xbc\x44\x6b\x48\xdc\xa1\xd9\x79\x05\x1a\xb5\x84\x08\x32\xe1\x9d\x47\x3b\x66\x62\x17\xa9\x18\x39\x80\xd6\xb2\x7e\x3d\x3c\x76\xd9\x36\x65\xba\x23\x93\xe6\xab\x1a\x42\xc3\x90\x4d\x40\x25\x93\x2d\x60\x1a\x20\x2a\x59\xa4\xc4\x9f\xdb\x77\xf0\xe0\x28\x68\x24\x7d\xe5\xaf\xdf\xaa\x1b\x89\x42\x08\xac\x00\xd7\x7c\x6b\xb5\x4c\x6b\x2a\x73\xa4\x76\x57\xe4\x4c\x85\x13\x79\x63\xb5\x75\x21\xaf\x20\x97\x62\x48\xeb\x26\x14\x82\x14\x7c\xdf\x7a\x14\x5c\x36\x43\xe2\x9e\x05\x88\xbf\xda\xe6\xa0\x82\x90\x48\x53\xce\x5a\x10\xd2\x49\x70\xeb\xdf\xb7\xf5\x9d\x5e\xfd\xd6\xa5\xe7\xe0\xd2\x87\x97\x1c\x84\x6a\xcd\x54\xd8\x4d\xd4\x54\x68\xa4\x11\x0b\xab\x6e\xf8\xd9\xa5\xb4\xb2\x42\x67\x88\x90\x0b\x7e\x1a\xdf\xe0\x62\x43\x44\xf9\x8f\xe5\x9e\xf8\xa1\xe6\xc4\x05\xb3\x44\xeb\x97\xbb\x20\x47\x73\x74\x4b\x6a\x2d\x8c\x6e\x65\xd1\x7c\xea\x07\xde\x03\xb7\xf0\xfe\x49\xf1\xa5\x5c\x33\xd5\xf1\x5c\xe5\x5d\xf7\xc9\x56\x1b\x25\x1c\x6a\xc8\x07\xa9\x25\x53\xe1\xce\x91\x70\x12\xdc\xcf\xd6\x9e\x7d\xbd\x03\x8c\x7e\xee\xca\xe9\x86\x23\xf1\x8f\xbb\x65\x0e\x22\x18\xa0\xbc\x0f\xff\x43\xa7\x5a\x11\x64\x48\xbb\x73\x62\xf5\x27\xee\x6b\xc8\xe1\x07\x61\xcc\xcf\x9b\xcf\xc0\xd0\x00\xf2\x12\x7b\x4c\xc1\x92\x11\xd0\x95\xa0\xbd\xaa\x4e\x4b\xe4\x51\x9e\x6c\x84\x45\xea\xb9\xb3\x14\x4a\x45\xca\xb9\x99\x61\x35\xbf\x7f\x75\xa7\x8d\x22\x27\x59\x00\xf4\xce\x1f\x0a\x9e\xac\x13\x63\x64\x10\x30\x62\x89\x3d\xad\x43\x90\x42\x2b\x77\xe5\xf5\xd1\xd9\x4d\x70\x29\xc6\x09\x7b\x35\xca\x64\xa7\xa4\x76\xfc\xc7"}, -{{0xef,0x6b,0x9b,0x51,0xfd,0x4f,0x85,0x86,0xca,0x62,0x65,0x8e,0x04,0x2f,0xc0,0x9a,0x83,0xb9,0x43,0x03,0x35,0x26,0xff,0xc3,0x26,0xc6,0x5e,0xb3,0xa5,0xfb,0x59,0x4b,},{0x1d,0x6e,0xec,0xe8,0x05,0xe0,0x88,0x78,0x21,0x87,0x6b,0x7e,0xd6,0xed,0x5b,0x07,0x14,0xd6,0x46,0xfb,0xec,0xda,0x38,0x76,0x4f,0x94,0xc8,0x15,0x5e,0x61,0xd0,0x04,},{0x71,0xd1,0x71,0x07,0x1c,0xd0,0xfe,0xa1,0xc6,0xa9,0xcf,0xad,0x1f,0x7f,0xd8,0x35,0xe8,0x5f,0xf9,0x06,0x77,0x8b,0xc6,0x34,0x5a,0x4d,0xec,0x43,0x13,0xec,0xc2,0xbf,0xf7,0x55,0xa7,0x17,0xeb,0xd9,0x12,0xa5,0xe0,0x28,0x40,0xac,0x07,0x38,0x42,0xf9,0xbf,0xca,0xa5,0x89,0x13,0xe2,0x60,0xe3,0xc7,0x33,0x93,0xd3,0x66,0x85,0xc7,0x0e,},"\xa8\xf3\xf1\x96\x65\xde\x23\x90\xd5\xcc\x52\xb0\x64\xb4\x85\x12\x73\x67\x74\x86\xd8\xf5\x56\x3b\xb7\xc9\x5f\xa9\x4d\xb3\x35\x61\x61\xee\x62\x22\x21\xf1\x0c\xbb\x1f\xa1\x95\xaa\xc7\x23\x1e\xa7\x16\xd7\x4b\x46\xb3\x7b\xc8\x5a\x70\xdb\xa3\xdf\xaa\x16\x75\x21\x7b\x35\x11\x99\xe7\x4a\x97\x10\x28\xf7\x29\xb7\xae\x2b\x74\xae\x8c\x6b\x3a\x06\x79\xc3\xe3\x29\x68\x02\x84\x4a\xd5\xbb\xa3\x43\xf6\xf9\xf7\xc4\x66\x1b\x4a\x29\xb4\x4f\x17\xe8\x9e\x11\x4f\xb2\x20\xe9\x84\xcd\x98\x0e\x94\xc3\xd2\xbf\x98\x73\xe0\x60\x5c\x92\x30\x17\x44\xa3\x03\x5e\xf0\x46\xba\xd2\x66\x6b\x5c\x63\xeb\xec\xf9\x3c\xc1\x40\x29\x19\x46\xc0\xfa\x17\x03\x40\xce\x39\x50\x92\xde\xed\x79\x84\x13\x52\xfb\xfe\xe0\x3a\x92\x7e\xb4\x58\xf2\xa6\x33\xed\x32\x71\x65\x2f\x5b\x0f\x99\x60\xcd\xf9\x01\x5d\x56\xfd\xab\xd8\x9e\xe7\x1e\x25\x9a\xf6\xeb\x51\x4b\x4c\x1b\xd4\xa6\x66\xf5\xb5\xa3\x5c\x90\xf3\x5b\x14\x94\x57\xaf\x29\x44\xdd\x0a\xa8\xd9\xb5\x42\x28\x3a\x7e\x54\x12\xb7\x75\xe4\x21\xd2\x12\x6f\x89\xbe\xbc\x3c\xa3\x7f\x73\x07\x16\x21\xf1\x32\x1e\xee\x52\xe9\x69\x04\x86\xa3\x3c\xd7\xff\x9c\x99\x67\xfb\x65\xee\x4e\x90\x7b\x6b\x85\x22\x11\x47\x3d\x21\xe9\xd9\x1a\x93\x36\x2a\xc7\x61\x76\x0e\x8c\x7b\xbe\xa4\x86\xc3\xd6\x05\xf9\xe1\x1b\x86\x13\x68\x19\xa7\xab\x3f\x32\xf1\x3f\xfc\xa1\x68\x17\xfe\xd1\x97\xff\x88\x0b\x4d\x6d\x9a\x80\x8f\x7f\x87\x87\x63\xa0\x45\x72\x8d\xf7\x2f\xaa\xa9\x63\xe4\xcb\x1c\x09\xcc\x2b\x2d\xa9\x20\x28\x0c\x83\x66\xb7\xd1\x8b\xf8\x97\x2d\xf1\x6c\xc2\x34\x48\xfb\xe6\xb2\xe6\xe1\x6c\xbb\xf0\x74\x51\x29\x85\x40\x53\x18\x96\x37\xce\x11\x5d\x23\x98\x43\x3c\x15\xd6\xf1\x16\xa2\x05\x33\x48\x24\xaf\x28\x2f\xa7\x58\x49\x4c\x47\x86\x8e\xa8\xf4\xdf\xad\xc7\x05\xe8\x61\xaa\xd2\xeb\x8e\xf3\xdb\xbe\xd2\xa4\x56\x9e\x15\x83\x4a\x76\x0c\xce\x0c\xbb\xc8\x4b\x28\x9e\x77\x9b\x98\x83\x46\xb9\x06\x9c\x74\x4c\x97\xab\x2b\xf4\x2b\x08\x6d\x2f\xb0\xa4\x11\xf5\xce\x99\xf0\x81\x9a\x30\x86\xb4\xfe\x9d\x96\xc7\xc9\x90\x8d\xce\x28\xdf\x1d\xdd\x30\xf3\x50\x1d\xda\xf7\x81\x10\x73\x4f\x9d\xcd\xfe\xc3"}, -{{0xba,0xd4,0x7c,0xd4,0xbd,0x89,0x84,0x90,0x67,0xcc,0xe1,0xe6,0x3c,0x3d,0x91,0xe9,0xb7,0x87,0xae,0xa8,0x58,0x4e,0xdb,0x07,0xf3,0x45,0x1e,0xf6,0x7e,0x7b,0xd7,0x9b,},{0xab,0x0c,0xe9,0xba,0x1d,0x29,0xbd,0xfb,0x85,0xa0,0xe6,0x6b,0x76,0xb5,0xe2,0xe0,0x5f,0xf7,0x32,0x56,0x9e,0x43,0x75,0xcc,0xd7,0x50,0x98,0xe9,0xe7,0x1d,0x17,0xbf,},{0xe5,0x72,0x4a,0x1d,0xd4,0x63,0xa9,0x7d,0x12,0x22,0xc5,0x18,0xc4,0x92,0x5d,0x32,0x22,0x02,0xd1,0x0f,0x04,0xcd,0x07,0x8e,0x77,0x1e,0x0f,0xb3,0x95,0x1d,0xbc,0x14,0x93,0xa2,0x34,0x46,0x07,0x54,0xc3,0xaa,0xe3,0xdf,0x93,0x00,0x8d,0xbb,0xfb,0x31,0x0c,0x99,0x59,0x2b,0xed,0xe7,0x35,0xa4,0xae,0xab,0x03,0x23,0xa1,0x21,0x0d,0x0e,},"\xb5\xa6\x1e\x19\xe4\x86\x3e\x0b\xb5\xf3\xfa\xb6\xc4\x97\x0d\x87\x85\x96\x89\x55\x21\xfa\x1e\x7f\x67\x8c\xaf\xa2\xde\x53\x32\x2f\xd4\x58\xa9\x8a\xa6\xe3\x58\x05\x42\x9f\x65\x12\x91\xb9\x5b\xd9\x95\x0e\x15\x5f\x3a\xda\x0b\x60\x91\x59\xa4\xab\xda\x59\x90\xc0\x4b\xc2\xe7\x64\x42\x2f\xb4\x9e\xf4\x2f\x12\x52\x9f\xf6\xf6\xa8\x20\x29\xff\x01\x85\x66\x2e\x65\x8f\x83\xc5\x46\xee\xd0\x9f\x06\xb5\xa6\x8e\x85\x7c\xda\xd0\xeb\x9e\xc4\xee\xcb\xfd\x88\xf3\x4b\xc8\x09\x90\xf8\x64\x4a\x9b\xfd\xde\x1d\x9f\x3a\x90\xd5\x57\xa8\xb8\x28\xd5\xce\x06\xa6\x4e\x3b\x23\x85\x82\xbb\x4c\xbe\xba\x30\xed\xc4\x9e\x81\x22\xc5\x5e\x95\xba\xdc\xf5\x02\xcc\x56\x78\x69\xc0\x9e\x9f\x46\xc6\xff\x3f\x68\x78\x98\x6b\x1d\xe0\x0b\x72\xa1\x85\x80\x46\xfc\xd3\xa6\xe9\xcd\xaf\x5b\x07\x3c\x56\xf2\x02\x50\x63\xa2\xd1\x78\xbd\x4c\x1e\x8c\xbc\x1e\x6e\x67\x1a\xa9\x7f\xb2\xcb\x4c\xc8\xa6\x2c\x20\xbe\x41\xc7\x76\x37\x2c\x8e\x7b\xe6\x3b\x48\x2e\x6c\x63\xfa\x85\xd7\xcf\xfb\xc1\xb2\x82\x0b\xae\x1f\xc1\x28\x34\x3a\x1e\x20\xfc\xf1\xbc\x35\x02\xee\xe8\x13\x58\xcc\x9a\x74\xc7\x2a\xf6\x35\x30\xf9\x6a\x25\xa6\x04\x64\x8f\xf5\x70\xdf\x1e\xb8\x9d\x1f\xdd\xba\xb2\x86\x79\xba\x2e\x9b\x41\x97\x7e\x9a\x9c\x1c\xae\xcd\xbf\xc3\x61\xa1\xdd\x05\x5e\xc5\x16\x20\xa9\xbb\xdb\xba\xf7\x18\xc9\xcc\x13\x6d\x20\x07\x71\x03\x99\x53\x6d\x13\x33\x24\x85\xec\x38\x87\x97\x85\xe0\xc9\xce\x99\x15\xa8\x02\x51\x37\x39\x90\xa5\x9b\xce\x44\x03\x26\x03\x1a\xb1\xb4\x58\xbf\xa5\xb8\xa4\x79\x3d\xa4\xee\x11\xab\x7a\xf2\x0d\xe2\xa1\x18\xc9\xae\x52\x1a\x41\x7b\x68\x20\x7f\xc8\x85\xe1\x09\xd8\x46\x3e\x9f\x02\x27\x87\xcc\x73\x0d\xb0\xb1\xfa\xae\xd2\x57\xbe\xd9\x01\x71\x08\x85\xb7\x4e\x99\x4f\x54\xf6\xf2\xae\xb6\x4f\x0f\x60\xb5\x9e\xfb\xf2\xe3\xbb\x65\x15\x42\x46\x03\xa1\x13\xc0\xb8\xa3\x1b\xa3\xc1\xe9\xa9\xb8\x11\x8c\x87\xec\x69\x49\xb7\x5f\x49\x62\x7e\xa7\xb1\x32\x88\x89\x39\x11\x04\xd4\xf4\xa3\x89\x2c\xf0\x0f\x26\xa7\x3c\xda\x2a\x40\xf9\xb7\x15\x7a\xfc\x40\x66\x7f\x4a\x04\xf6\x47\xdb\xf9\x39\x06\xb8\x4c\x9a\x35\x16\x4e\x1b\xc9\x02"}, -{{0xca,0xba,0x8e,0x05,0x33,0x11,0x3a,0x4b,0xe1,0x73,0x40,0x8b,0xa8,0x3c,0x0d,0xb7,0x42,0x60,0x80,0x2f,0x91,0x86,0xc3,0x91,0x40,0x26,0x55,0xac,0xde,0x60,0x15,0xcb,},{0x2d,0x7b,0xef,0x61,0x64,0xc2,0x79,0xfa,0x10,0x28,0xa9,0x78,0x8e,0x3e,0x8e,0xe8,0xac,0x15,0xed,0xcf,0x92,0xa5,0x85,0x50,0x62,0x95,0x23,0x10,0xb4,0x68,0x45,0x47,},{0xec,0x35,0xec,0x32,0xc8,0xa4,0x00,0x88,0x27,0xe1,0x78,0x49,0x2b,0x3b,0x8b,0xee,0x22,0xa4,0x95,0x4f,0xc6,0xb2,0x5f,0x4f,0x22,0x5d,0xd7,0xed,0x23,0x69,0x89,0x00,0xde,0x81,0x56,0x75,0x6a,0x8e,0xdc,0x35,0xc5,0x1d,0x10,0xf8,0x2b,0x83,0x0a,0x2a,0x65,0x96,0x76,0xea,0xc9,0x11,0xf9,0x60,0x24,0x47,0x66,0xe0,0xc3,0xc6,0x07,0x05,},"\x24\x13\xa3\x2b\xca\x5c\xe6\xe2\x30\xe5\x65\xeb\x85\x84\x93\xd5\xd0\x4e\x6d\x2e\x2a\x7a\xb1\xf8\x9a\x3b\x42\x33\x11\x67\x6b\xfa\x93\xc6\x7d\xaa\xfd\x1c\xfc\x71\x09\xe0\x40\xba\xc5\x2c\xbf\xe0\x7c\x28\x28\x0b\xb6\xac\xf6\xe3\xa3\x10\x73\xda\xb2\x96\x53\x78\xdd\x77\xf6\x1f\xe9\x24\x71\x35\xc1\xa6\x31\xb7\x9a\xd6\x68\xc9\xea\x1c\xd4\x11\x2d\x8d\x3a\x06\x4c\xc2\x1d\xf3\x2a\xea\xc7\xdd\x71\x8b\x09\x1f\xb6\x91\x5b\x8b\xc0\x63\xbb\x58\x15\xc3\x76\xe0\x14\x76\x31\x2a\x2e\x54\x33\x41\x7a\x7a\x93\x15\xd6\x59\x99\xb0\x2f\xf4\x64\xa4\x74\xa5\x97\xe5\x39\x88\x77\x36\x70\xec\xa4\x6a\x6e\x26\xcf\x96\xe9\x48\x8e\x9e\x63\x44\xbc\x78\x3d\xdf\xb5\x35\xe7\x6b\xb3\xb9\xa6\x03\xff\x4c\x59\xc7\xdb\xe2\xd8\xb6\x19\x8d\x5b\x24\x49\x0b\x4e\xa9\x6c\x95\x95\x9f\xfb\xf3\xd8\x21\x8e\x76\x0d\xaf\x20\xe0\x1e\x2f\x36\xc8\x4b\xb0\x97\x11\x5a\xbd\xde\xe9\x2b\xed\x82\xd1\x6b\x15\xa9\xe1\x92\xe9\x89\x3a\xc6\x38\x46\x1d\xf5\x07\x20\x7b\x0c\xf5\x95\x88\x4d\x8a\x99\xfb\x9c\x70\x45\xf9\xbf\xf7\xb7\x3f\x00\xca\x3f\xd5\x95\xa5\xce\xc2\x92\xad\xb4\x58\xbd\x94\x63\xbe\x12\x04\xd0\x16\x78\xd2\xf4\x38\x9b\x87\x20\x11\x5f\xa5\x97\xc4\x02\xb4\xff\x69\x4b\x71\xce\x4f\x3d\x33\x0d\x5e\x2f\x3c\x3a\xd6\xd9\x6a\x9b\x34\x39\x23\x0f\xc5\x3a\x44\x79\x4c\xda\x59\x55\x57\xc4\x06\xca\x15\x89\xbc\x7b\xe8\x1e\x2d\x79\x63\x60\x33\x25\x3f\xa7\xbd\xd6\x00\xc6\x7f\xc5\x59\x36\xbd\x96\xce\x04\x28\xc3\xeb\x97\xba\xd1\xde\x0a\x5f\xbb\x9b\x67\x51\x57\xde\x5f\x18\xbc\x62\xa7\xc2\x2c\x94\x83\xe2\x80\x2e\x67\x9b\x5b\x8f\x89\xdb\x0f\xc3\x7f\x7c\x71\x50\xad\x5a\xc8\x72\x2c\xeb\x99\x9b\x24\x35\xe6\x99\x72\x17\x09\x23\x36\xef\x1c\x8a\x22\x92\xda\xb9\xa4\x6f\xf8\xa9\xe1\x0d\x33\x55\x76\x5c\xac\x9d\x65\x98\x77\x0f\x4f\x01\xea\x63\x91\x25\xfd\x03\x16\x09\xdd\x1a\x50\x7d\x96\x28\x0c\x7d\x01\xa3\xee\x98\x7e\x9b\x21\x0e\xc8\x74\x4c\xd4\x8c\x74\xf8\xaf\xee\x96\x1e\x8e\xf2\x21\xf8\x26\xa1\xfe\x6e\x7d\xf0\xcb\x15\xad\x7c\x7e\xf4\xa9\x1f\x9d\x0f\x4c\x2e\x1b\xde\xa6\x35\xd2\x75\xfa\xc8\xc4\xbc\x06\x01\xf4\x90\xdb\xdb\xc7\x34"}, -{{0x9b,0xf3,0xfb,0xc7,0x30,0x8b,0x46,0xf6,0x03,0x6b,0xad,0xe0,0xc3,0xca,0x19,0x9f,0xac,0x66,0x2b,0x07,0xf1,0x03,0xbf,0x75,0x18,0x1d,0x52,0xba,0x6a,0x58,0xbe,0x05,},{0x2f,0x6a,0xc6,0xfc,0x33,0xbc,0x06,0x0c,0x1d,0xc3,0xcb,0x9d,0x1a,0x2b,0x91,0x15,0x84,0x5a,0xdd,0xb1,0x6c,0x4b,0x84,0xbe,0x37,0xed,0x33,0xad,0xb3,0xb3,0xd3,0xa8,},{0x0c,0x31,0x36,0xe0,0x1f,0x9b,0xcd,0x99,0xe1,0x0d,0x3d,0x12,0x4b,0x0c,0xdb,0x07,0x72,0xbe,0xc1,0x8a,0x86,0x4b,0xe8,0x1b,0xd1,0xda,0xa4,0x4d,0x81,0x8c,0x3d,0x47,0x0d,0xfa,0xa8,0xab,0x6e,0x9a,0x76,0x1c,0xf0,0x3f,0x93,0xef,0x9c,0xc7,0x82,0x91,0x09,0x6e,0xd6,0xd1,0x0c,0x08,0xfa,0x2f,0xba,0x3b,0xac,0x04,0xdd,0xe2,0x0f,0x0c,},"\xd6\x5e\x36\xa6\xa3\x81\x95\xec\xb9\x1d\xe3\xc8\x48\xb5\x1f\x63\x92\x45\xfa\x2b\xab\xa8\xa6\xf8\x59\x47\x15\x9d\xec\x0e\xd3\xfa\xe8\x0c\x5a\x0f\x8c\x66\xff\x24\x79\x3c\x89\xc0\xc6\x87\x54\x3b\xc6\x33\x54\x7a\x1f\x37\xf7\x30\xd9\x70\x12\xeb\xbd\xc7\xac\x33\x9c\x48\x90\xc0\x85\x6b\xbf\xe2\xba\x29\xb2\x5a\x7a\xa6\xb0\x89\xc0\x33\xfe\xcb\x76\xdb\x62\xdd\x3c\x00\xf6\x42\x1b\x9e\x76\xdd\x0e\xa3\x66\xeb\x2d\x4a\x05\x2e\xe6\xcc\x73\x6e\x38\x19\x19\x1d\x5a\xd7\xa6\x6d\x2b\xe0\x42\xcc\x65\x39\xe5\xf3\x56\x52\xb1\x55\xa7\x27\xf3\x88\x8d\x93\xf9\x3a\x91\x02\x59\x8f\x75\x38\xa9\xab\x7c\x77\x7e\xec\x79\x42\x6a\x60\x75\xd6\xf3\x8d\x64\xc4\x85\x52\x0f\x64\x13\xff\x4d\x35\x8a\x8a\x9c\xbd\xab\x01\xad\xf4\xdb\x02\xad\xae\xa2\x64\x94\xd1\xf5\xd6\x17\x63\x7f\x27\x7f\x8b\x0e\x6e\x7e\x61\xe2\xee\xcc\xdd\x33\x7d\xe2\xba\xf0\xca\x26\x4c\x14\xc8\xcb\x83\x68\x00\x0b\x9c\x71\x43\x85\xf4\x13\x73\x7d\x68\x16\xe2\x12\xca\xe2\xae\xcf\xff\xc3\x2f\xd1\x6d\x46\xc3\xec\xee\x6a\xb0\x74\xc0\xd7\x68\xbd\xfe\x99\xb8\x6c\xbb\xc8\xdf\x9c\x47\xcd\x58\x6d\x46\x58\x71\x26\x8d\x4a\x9d\x1c\x87\x72\x36\xab\x78\xf8\x85\x9c\x11\x4e\x25\x1c\xab\xc4\xbe\x0f\x8b\xc2\x5d\x14\x8c\x5f\x54\x3e\x29\x07\x45\xd1\x18\x03\xe4\x9f\x5b\x53\x19\x3f\xe3\x99\x69\xc0\x39\xb3\xf2\x49\xb3\x2f\x2b\x85\x98\xb6\xac\xf4\xed\x64\xd5\x75\x2b\xb7\x72\xff\x4e\xe0\x0c\xe0\xf8\x5e\xcb\xb4\xcf\xc4\xce\x07\xda\xf2\x80\x98\x68\xc2\x90\x3b\x78\x1e\x12\xa2\x74\x10\x5f\x06\x18\x10\x29\xe4\x7f\x2b\xfb\x21\xf4\x94\x80\xaa\x1e\x44\x47\x15\xc0\xb9\xff\x07\xea\xd8\x89\x75\xd9\x35\x85\xd2\xff\x42\x48\x32\xa9\x78\x3d\x94\x90\x6a\x60\xf8\x77\xae\x1c\x85\xff\x15\x31\x7b\xad\xca\x1e\x61\x31\x74\x33\xc7\xce\x96\x27\x9b\x67\x8e\xc9\xd1\x74\xdd\x08\x70\x08\x0b\x23\x41\x54\xf6\x26\xa5\x34\x62\xcf\xd5\x47\x84\x2e\xab\x87\x05\x60\x5b\x8e\xe8\x85\x72\x9e\xe7\x8d\x18\x33\xaa\x43\xf5\x5a\xc2\x27\x31\x98\x9f\xde\xda\x7d\xc5\xfa\x9c\x01\x98\x5f\x26\x61\xe6\xc7\x32\x6d\x34\x6e\x6d\xb2\x7e\x6f\x92\x1f\xae\x7c\x93\xa2\x17\x0e\x10\xdd\x0c\x46\x0b\xdc"}, -{{0x64,0xe8,0x93,0x04,0xa3,0x35,0xe9,0x03,0xcb,0x36,0xc0,0xbd,0xf1,0xa6,0x41,0x2e,0xf3,0x68,0x46,0x80,0x06,0xb7,0x3d,0x3d,0x2d,0x61,0xcb,0x03,0x0c,0xc5,0xf8,0xd1,},{0xa1,0x80,0xef,0x3a,0x66,0x1c,0x3c,0x47,0x9d,0x5f,0x69,0x80,0x7c,0x90,0x27,0x48,0xe3,0x5e,0x7f,0x72,0x51,0x21,0xe3,0x7a,0x5d,0x91,0xb8,0xbe,0xc8,0x8d,0x83,0xa6,},{0x92,0xeb,0x44,0x54,0x81,0x40,0x01,0xec,0xfc,0x18,0x02,0x5d,0x64,0x21,0xf6,0x46,0x45,0xa5,0xbc,0xbb,0x5c,0xb8,0xfd,0x85,0xc1,0x4d,0x77,0x26,0x17,0xc5,0x03,0xe8,0xbe,0x7d,0x3b,0xcf,0x11,0x7f,0x5e,0x68,0x01,0xd1,0xc3,0xb9,0x6f,0x90,0x90,0xa6,0x6d,0xdc,0x67,0xf8,0xcf,0x8f,0xf0,0xf1,0xc1,0x25,0xb1,0x6b,0x15,0xe2,0xce,0x07,},"\x2f\x51\x07\x4d\x98\x1b\xda\xfa\xfb\x02\xa4\x0f\xe8\x26\xc4\x5f\x31\x71\xc1\xb3\x18\x4d\x8c\x26\x0b\x82\xb8\x41\x1f\xc6\x25\xcb\x02\xcc\xfe\x75\x5d\xc2\x9d\xc7\x89\x5b\xf7\x59\xe6\x1b\x24\x50\xda\x1a\x65\x6a\x38\xd4\xf7\x0d\x2e\xe7\x48\xc5\x18\xc6\x42\x03\x06\xe5\xf0\x1e\xc7\xa0\xff\xe0\xe9\xdc\xeb\x93\xf6\xc0\x77\xb1\x26\x62\x88\x15\x84\xf9\x8c\xe6\xab\x94\x5f\x87\xfc\x6d\x12\x3c\x45\xd6\xcd\xfd\x82\x37\xa1\xce\x36\x35\xb6\x23\xa7\x9d\x02\x0d\xf4\x4c\x74\xb8\x9a\xc1\x4a\x32\x1f\xbf\x33\xa8\xc0\xa2\x55\x9f\xea\x1c\x2b\x15\x60\x76\xb8\x13\x90\x8f\x84\x2e\xbe\x4c\x2b\x94\x90\x89\xe5\x2b\x1a\xe4\x0d\xc6\xe4\xb2\xab\xbc\x43\x9a\x0b\xf7\x23\x69\x67\x9a\xab\x6f\x4c\x00\x01\x8b\xe1\x47\xf7\xc0\xa6\x7b\x96\x79\xee\x88\xa5\x38\x19\xc4\x9f\x7b\x67\x5e\x30\xa8\xb5\xaf\x39\x66\x1e\xe8\xdb\x21\x01\x04\x11\x29\x49\x68\xf8\x8e\x5d\x60\x4d\x0d\x88\xd7\x6a\x7e\x48\x64\xfa\xd3\xa5\x6f\x5f\x62\x4b\xa1\xb3\x4e\xa9\xcb\x72\x08\x50\xaa\xd3\xbd\x4f\x0a\x88\x2a\x7d\x25\xfb\xec\x2b\xb7\xca\x86\xda\x61\x6d\xa9\x6c\x15\x62\xc6\xd6\xa1\xab\xcc\x64\x1e\x1b\x58\xb2\xc1\x78\xe1\xc3\xbc\x8a\x3b\x36\xec\x9e\x14\x4d\xd2\xe7\x5b\x0b\xc8\xc0\x8c\xcb\x0d\x6e\x34\x27\xb0\x32\x2b\x3d\x6a\xb9\x3f\x3f\x60\xb9\xcc\x5b\x61\xda\xd0\x23\x85\xa1\x49\x49\xf9\xb8\x7a\x8e\x3a\xf1\xe0\xe0\xfa\xb7\xa9\xa9\x28\xc7\x53\xfc\x61\x10\x44\x4a\xf7\xcc\xaf\x80\x27\xed\x64\x1b\x9e\xd8\x7f\xa5\xd8\xe1\xf7\x6c\xae\x46\x5d\x57\xa7\x0d\xad\x9e\xbf\xdd\x3c\xe7\x57\x6a\xc4\xde\x89\xd9\x8f\x42\xe2\x82\xad\x87\xad\x6a\x50\x42\x57\x7c\xbb\xbc\x4d\x95\x1e\x2a\x86\x76\xfe\xdc\x8c\xb1\xb1\xbd\xf7\x6c\x3a\x38\x84\x63\x85\xa8\x5a\xa2\x47\x06\xc2\x0a\x8b\x38\x46\x5f\xe2\xae\x0e\x41\xf7\x8e\x61\x4b\x8e\x96\x42\xfe\x24\x71\xa9\x01\x57\x47\xdb\x97\x6e\x0c\x78\x48\xc2\x3f\xf3\xf4\x17\xcb\x05\xa8\xd5\xef\x40\x13\x0a\xdf\x85\x5c\x99\x8a\x62\x10\x4d\x7e\x2f\xb7\xc0\xf9\xaa\x2a\x49\x60\x75\x62\x3c\xed\x2c\x0f\x7e\xec\x10\x14\x7f\xf9\x60\x8a\x8a\x04\x2e\xf9\x81\x17\x45\x9b\x93\x83\x7f\xd1\xb8\xd5\xef\x03\x97\x8e\xad\xa7\x4c\xac"}, -{{0x6f,0x63,0x43,0x87,0xca,0x2c,0x0c,0xb1,0x67,0xa7,0x40,0xd6,0xaf,0xd8,0x9e,0x2a,0x28,0xf5,0x30,0x71,0x84,0xe8,0x1c,0xba,0x3c,0x03,0x70,0x46,0xa5,0xed,0xe2,0x3c,},{0x01,0x1f,0x2a,0x9a,0x11,0x1c,0x38,0xf3,0x49,0x0c,0xad,0x16,0x85,0xbe,0x78,0xec,0xee,0xdc,0x6f,0xac,0x4a,0x32,0x21,0x30,0x1c,0x69,0xc8,0x4b,0x1e,0xc7,0xb3,0xa7,},{0xfd,0x17,0xc6,0x18,0xcd,0xbb,0x5d,0x45,0x9e,0xa2,0xac,0xa8,0x86,0xf0,0x51,0x2c,0x62,0x32,0x51,0x28,0x4a,0xae,0x3a,0x83,0xeb,0x5d,0x7f,0x60,0xda,0x1d,0x9b,0x2b,0xa0,0x83,0xc4,0x55,0xa5,0xe2,0x58,0x3a,0x3c,0xba,0x73,0x6e,0x7b,0x96,0x1b,0xa1,0x9c,0x1c,0xc8,0xdd,0x90,0x74,0x5d,0xa8,0x2a,0x15,0xdf,0xc6,0x62,0xe8,0xe1,0x0d,},"\x86\x5c\x20\xa9\x4a\xc3\xf2\xe3\xbd\x5c\xb8\x5b\xec\x9d\x33\x72\x66\x71\xfe\x01\xf9\xc5\x37\x01\x7d\x59\xc8\xd5\x10\x6e\x43\x36\x0b\xf7\x6f\xc0\x61\x86\x70\x59\x80\xc8\xa8\x7b\xa3\x63\x3a\x4a\x17\x04\x26\xec\xc0\xde\xfb\x6d\xb2\x67\x0f\x5f\x59\x25\x33\x77\x4c\xda\x50\x05\x2a\xe5\x97\xd4\x8d\xea\xcc\x26\x37\x06\x3b\xfd\x51\x9f\x2e\x79\xba\xc8\x17\x75\xbe\xcc\xb1\xab\x2f\x5b\x39\x71\x2e\x2e\x82\x94\x69\xb7\x5a\x2d\x2d\xbd\x08\xaa\x6d\x24\x72\x34\x04\xb2\x5e\xb9\x48\xa4\x83\x4c\x55\x24\x6c\x80\x79\xa8\x2e\xc6\x43\x54\xe8\xc2\x38\x8f\x8c\x5a\x61\x6b\x3c\xdc\x37\x1e\x62\x63\xfa\xbc\x9f\x60\x99\x21\x9e\x86\x15\x85\xfe\x82\xa6\x7d\x61\x0d\xd1\xeb\x5c\x81\xc9\x6b\x5c\xb3\x54\xa6\x89\xfd\x8a\xac\x8d\xb7\x6c\x43\x3f\x0c\xb0\xb3\x1c\xf1\xd8\x55\xb6\xa3\x0a\x3d\x2a\x21\x2e\x9b\x4f\x7d\x7a\xfe\x61\x99\x51\xf9\x8d\x2f\x1b\xa2\xc1\x01\x08\x5b\xa8\x1f\x49\xb3\x60\x37\xcd\x64\x57\xa7\xea\xa8\xf4\xf3\xbe\xdf\x68\xd0\x9f\xc9\xfa\x25\xa9\xd7\x54\xdb\x65\x36\x02\x85\x41\x2d\x1a\x6d\xa5\x37\x88\x90\x5f\xcf\x4e\xfa\x8a\x80\xcd\x86\xca\x48\xb8\x45\x63\x3d\x8c\x31\xc2\xae\x06\xf1\x6c\x4c\x6b\xbb\xe9\xcd\x1a\xfb\x59\xe1\x01\xbe\x50\xe0\x35\x35\xdd\x8a\x65\xe4\x5b\xba\x46\xd4\x5c\xb1\x4b\xad\xfc\x8e\x93\xab\x52\x67\xf4\xe4\x92\xab\x1f\x9a\x95\xe6\x1f\xca\xb8\x1c\xbf\x2b\xd8\x67\xa3\xec\x7b\x4b\xaa\x18\x9a\x0f\x08\x56\x70\x75\x59\x61\x29\xdc\xf9\xff\x1c\x50\x2d\x32\x79\xe8\xaa\x6c\xe5\x6e\xaf\x13\x45\x82\xa9\xe4\x30\xa5\xaa\x8c\xa1\x0c\x3d\xa8\xbc\x79\x3d\x02\x56\xad\x19\xae\xa7\x14\x9f\x0e\xa7\xea\x95\xfa\xcf\xac\x1c\x5c\xfd\x29\xd7\xa3\xfe\x1a\x41\x79\x75\x73\x9e\x14\xda\x8e\xdc\x81\x99\x00\x47\x2c\xa8\xc6\x97\x16\x32\x8e\x8a\x29\x9f\x97\x4e\xdf\xf7\x41\xaa\xbc\x1c\x07\x4a\x76\x1b\x3e\xc8\x76\x1d\xda\x2e\x7e\xed\x7a\xf3\x3e\xf0\x04\x09\x84\x9d\x41\x54\x97\xc5\xed\x5d\xfa\xa2\x25\x9a\x31\xd0\x76\x39\x81\x70\xb2\xd9\xd2\x10\x20\x8b\x4a\x4c\x7d\xb8\xc6\x26\xd1\xc5\x33\x56\x2a\x1f\x95\x48\x9f\x98\x19\xe4\x98\x5f\xc4\xe1\xd1\xa7\x07\xbe\x5e\x82\xb0\x05\x48\x1d\x86\x37\x7f\x42\x4e"}, -{{0x4b,0x2e,0x1a,0xe6,0x0f,0xa5,0xd3,0x83,0xba,0xba,0x54,0xed,0xc1,0x68,0xb9,0xb0,0x5e,0x0d,0x05,0xee,0x9c,0x18,0x13,0x21,0xdb,0xfd,0xdd,0x19,0x83,0x95,0x91,0x54,},{0x36,0xc0,0x20,0xb1,0x85,0x52,0x34,0x56,0x19,0xef,0x88,0x37,0xeb,0x8d,0x54,0x94,0x84,0x0e,0x85,0xf4,0x68,0x09,0x34,0x3b,0x4d,0x6f,0x40,0x61,0x25,0xda,0x55,0x7d,},{0x22,0x20,0x11,0x9e,0x83,0xd6,0x9a,0x6a,0x3e,0xed,0x95,0xfa,0x16,0x6d,0x1d,0x11,0x28,0xa3,0xf2,0x32,0xca,0x1b,0x78,0xbc,0x94,0xb4,0xd4,0x76,0xc4,0x77,0x94,0x43,0x61,0x4b,0x87,0x72,0xaa,0x22,0x32,0xcb,0x07,0x20,0xa0,0x55,0xeb,0x71,0xd8,0x40,0x7f,0x3a,0xb1,0x9b,0xaa,0x1d,0x96,0x2c,0x05,0x2c,0x84,0xc0,0xbd,0x58,0x96,0x08,},"\xfa\xb9\x8b\x2b\xbf\x86\xae\xb0\x50\x86\x81\x2a\x4b\x00\x49\xa1\x04\x2a\xbb\x76\xdf\x9c\xd2\x90\x87\x55\x70\x63\x03\xef\xed\xb1\xad\x21\xe8\xbc\x8d\x75\x62\x34\x9e\x1e\x98\xce\x0d\x75\x2f\x4b\x3d\x99\xe6\x77\x36\x8b\xd0\x8c\x78\xfe\x74\x25\xec\x3b\x56\x0e\x38\x3b\xd4\x2a\xf6\x49\x98\x86\xc3\x5a\xdd\x80\xa5\x82\x8b\x61\xd6\x64\x4d\x7d\xc4\x43\xba\x2c\x06\xf9\xba\xd2\xec\xcb\x98\x3d\x24\x45\x8f\x6a\xda\x1b\x10\xbb\x5b\x77\x17\x2c\x5c\xdd\x56\xd2\x73\xd1\xe4\x10\x10\xb2\x5c\xf4\x8a\x7d\x58\xd7\x25\x57\x02\xac\x12\xf2\xa6\xfe\x29\x18\x46\x63\x95\xf4\x60\xd1\x52\x36\xd0\x35\xae\x94\x10\xca\x86\xc4\x60\x51\x28\x29\x9f\xaa\xf0\x90\x15\xf1\xad\xee\x77\x68\xee\x1a\x8f\x8c\xa0\x6d\x10\xdd\x7f\x95\xc4\x6f\xa1\x02\x53\x06\x5f\x9d\x6f\x90\x29\x59\x08\x80\x9f\xd7\x79\x57\x1b\xe2\x9e\x0a\xe6\x6e\x0b\xcb\xde\xb7\x91\x3d\x2b\xbb\x76\xac\x30\x2f\x34\x52\xc5\x5e\xf1\x99\xa4\x8e\xce\xb0\xe3\x59\x6c\x7b\x4c\x03\x86\xda\xe7\x10\x1e\xa2\x44\xa3\x3c\x4c\xdc\x83\x06\x72\xdf\x83\x65\x5b\x35\x33\x80\x52\x30\x7b\x94\xd2\x23\xca\xb1\xaf\x69\xe0\x7f\x78\xe5\x8c\xbb\x0c\xb3\xc5\x35\x1e\x3a\x6b\x0c\x4a\x92\x7f\x75\x62\xc5\x98\xd2\xd3\xdf\x90\x56\x9f\x61\xdb\x1a\x3c\xb0\x14\x0b\x56\xea\x02\xcf\x77\x45\xfb\xee\xc2\x02\x86\x73\xd6\x7f\x1e\xc5\xf7\xda\xf9\x71\x5f\x75\x4a\x9d\x8e\xd4\x6a\x7a\x63\xef\x72\x2e\xe0\xd5\x89\x93\x31\xb6\x3c\x97\x4f\xa8\x80\x42\x94\x35\x76\x7f\x96\x25\x4e\xf4\x6c\x99\x68\xf3\xfe\xda\xaf\xea\xf3\xe8\xf4\x56\x34\xb5\x4f\x5e\x0a\x5f\xc2\xd2\x37\x3a\xb9\xe9\x8d\x9a\xcf\xe3\x69\x7e\x64\x2a\x18\xe0\xdf\xd9\xfb\xc2\xf0\x94\x86\x6d\x40\x1f\x0a\x4c\xa2\xa4\x56\xed\xf6\xa1\xa7\x7b\x9c\x29\x6c\x39\x22\x06\x7e\xb3\xd5\xa5\xca\x0a\x77\xf4\x30\xe4\xc8\x61\x1d\x8f\x05\xa1\xba\xac\x16\x35\xef\x7b\xa8\x3d\xfc\x69\xd3\x01\x94\x98\x56\xbe\x4d\x2c\x8a\xb6\x1d\xe2\x9c\xf3\x92\x50\xc5\x79\x4c\xbf\x57\x50\xcd\xa9\x5d\x04\x68\xaf\xa2\xb7\xf2\x3d\xba\x4e\xf5\xf5\x29\x5a\x3b\xf4\x14\x00\x18\xb7\xed\x06\x18\x84\x44\x4f\x5b\xb1\xb7\xd2\x39\x31\x2d\xd7\x39\x99\x95\x36\xc6\x84\x45\x6e\xa0\x6b"}, -{{0xb2,0x16,0xce,0xbf,0x87,0x80,0x24,0xc2,0x0d,0xfc,0x86,0xce,0x4b,0x37,0xbd,0xc4,0x7a,0xa2,0x8f,0x29,0x20,0x3b,0x5b,0x44,0x92,0x50,0x65,0xd9,0x93,0xa2,0x59,0xfe,},{0xc3,0x6e,0xdb,0xb6,0x25,0x4a,0x91,0x3f,0x08,0xfe,0x25,0x9e,0x23,0x87,0x80,0x63,0x8f,0x72,0xec,0x0b,0x30,0x07,0x26,0x4b,0xcc,0x60,0xa9,0xe8,0x1e,0xe9,0x29,0x8f,},{0xb7,0x38,0x9e,0xe7,0x8d,0xd9,0x76,0x3f,0x9d,0x28,0x92,0x91,0x2e,0xdc,0xbe,0x3e,0x8a,0x23,0x6b,0x8b,0xdc,0x25,0xf4,0x4b,0x9c,0xfd,0xc8,0xc4,0x7c,0xd5,0x81,0x68,0xab,0x56,0xeb,0x04,0x02,0xa5,0xbd,0x75,0x2a,0xc8,0xf4,0x97,0x8d,0x2e,0xa2,0xb6,0x5d,0x2f,0xa8,0x52,0x65,0x96,0x6b,0x9f,0x57,0x22,0x7e,0xf4,0xa5,0x9a,0xe0,0x09,},"\x9c\x87\x17\xcc\x86\xfe\x02\x48\x0b\xfd\x9e\x92\x2b\xd7\x6b\xff\xee\x21\x70\xc4\xcb\x1b\x13\xdf\x83\x4a\xc0\x1d\x45\x00\x60\x86\x29\x7f\x1b\x8a\x26\xf2\xba\x67\x4d\x33\xe1\xd1\x62\xf1\x93\x67\xfe\xba\x97\x35\x2b\x7d\xf2\xe7\x5b\x30\x9d\x4b\x6f\x8b\x07\xcc\x0e\xb6\x77\x7e\x81\xe2\x68\xe0\x2d\x07\xf2\xa0\x8f\x8f\x39\xd5\xa8\x32\x0b\xfc\x01\xfc\x8c\x92\x27\xd2\xcf\x05\xe1\x28\x91\xff\x4d\xe8\x85\xa1\xc9\x33\x71\xa0\x91\x0b\xa5\x33\x92\xaf\xf9\xba\x2e\xed\x9a\x20\x55\x97\x7e\xc4\x15\x7b\xd6\x5b\x34\xdf\x79\x37\x2f\x4d\x50\xed\xbc\x48\x92\x43\x53\xcf\xa1\x69\x23\x19\xd8\x8a\x7a\x5b\xb7\x26\x25\x4c\x20\x92\x91\xe9\xb1\xd2\xc1\xa6\xc8\x23\x63\x98\x10\x9c\x59\xed\x42\xa0\xac\x9e\x76\x33\xc5\x20\x73\x4e\xcc\xfe\xa4\xfe\xa9\x5a\x47\xa8\xf0\xa0\x68\xb4\x27\x50\x00\x43\x9c\xc9\x7c\x57\x87\x1e\x10\x5c\xc0\x79\x0e\x9d\xcc\x9c\x25\xd5\xaf\x70\x63\xff\xd0\x5c\x4f\x37\x80\xe7\xbc\xa4\xc4\x56\xd0\x17\x0d\xa7\x09\xfc\x6c\xb3\xfa\xa7\x2b\xdc\xf5\x62\x90\x8a\xe9\x34\x0a\xef\x4d\x0c\x8b\x91\xf0\xfb\xcc\xbc\xf1\xcd\x89\x8b\x1c\x71\x6f\x4f\x14\x74\xc3\xaa\x31\x62\x42\xab\xdf\x63\x68\xe5\x7a\x24\x7f\xf2\xfd\x5c\xe2\x3d\x18\x7f\x69\x4f\x11\xe3\x8d\xfb\xfb\xc3\xd9\xdb\x20\x90\x3b\x4e\xbb\x44\x9b\x90\x49\xee\x02\x0f\x6e\x2f\x50\x8e\x8b\x2b\x16\x5b\xad\x74\x64\xdb\xdd\x17\x8c\xbd\x42\x32\x33\x76\x5d\x37\x1e\x7a\xe1\xc3\xe8\x78\xcd\xb5\xb8\x24\xb2\x0c\xb3\x09\x86\x7c\x0e\x47\x3c\x06\x7e\x67\x44\x00\x85\x27\xb6\xbc\x07\x6d\x07\x7f\x48\x67\x62\x2a\xee\xd1\xc2\x53\xdb\xde\x7c\x6a\x76\xc7\x01\x59\x62\xfb\x73\x39\x16\x98\x60\x0b\xb3\x18\xff\xa7\xb0\x13\x6e\xe4\xcc\xb0\x7d\xaa\xf0\x1f\x40\xff\x9c\x19\x4f\x98\x68\x1f\x9f\xae\xf8\xb6\xf9\xe9\x9f\x95\xdf\x00\x80\xda\x89\x66\xa8\xba\x7a\x94\x74\xc5\x37\xb9\x2d\xf9\x79\x9e\x2f\xd1\x6f\x78\x8d\xad\x7a\x7b\xcc\x74\x52\x26\xe1\xe6\x37\x1f\x52\xeb\xcd\xbd\x14\x40\x44\xdd\xfe\x63\x2d\xfc\x0a\x43\xd3\xa4\x50\x92\x31\x70\xeb\xc7\xae\x21\x9e\x50\xe0\x78\xa5\x11\xbc\x12\xef\x14\xcd\x14\xb5\x30\x9f\x38\xab\xd6\x5d\xb2\xb2\xa7\xaf\x22\x43\xb2\x29\xc9\xfd\x2e"}, -{{0xaf,0xce,0xce,0xa9,0x24,0x39,0xe4,0x4a,0x43,0xed,0x61,0xb6,0x73,0x04,0x3d,0xcb,0xc4,0xe3,0x60,0xf2,0xf3,0x0c,0xd0,0x78,0x96,0xcd,0xa2,0x0c,0xb9,0x88,0xd4,0xe3,},{0xd2,0x31,0xf6,0x92,0x35,0xa2,0xe3,0xa1,0xdd,0x5f,0x6c,0x2a,0x9a,0xaf,0x20,0xc0,0x34,0x54,0xb9,0xa2,0x9f,0x4e,0x3a,0x29,0xab,0x94,0x68,0x9d,0x0d,0x72,0x3e,0x50,},{0xa6,0x55,0x45,0xcf,0x3d,0xf4,0x56,0xb2,0x8d,0x83,0xa6,0xd9,0x4c,0x03,0x6a,0x19,0xd0,0xd2,0x9f,0xb0,0x65,0xed,0xc2,0x7e,0x5e,0x93,0xa1,0xf4,0x02,0x79,0x89,0x7e,0x1c,0x6f,0x25,0x95,0x9a,0x72,0x5a,0xba,0xbc,0x87,0xcf,0x2a,0xe7,0x27,0xf3,0x46,0x7b,0x79,0x57,0x0e,0x90,0x27,0x11,0x91,0x71,0x91,0xd9,0xcb,0x0d,0x2d,0x66,0x0c,},"\x0b\x05\xf8\x9e\xbb\x33\x97\x94\x76\x87\xaf\xbe\xf0\xed\xe8\x7c\xf3\x81\x06\x76\x27\x70\x37\x52\x1d\x95\x2a\x3b\xbb\xbd\xc8\x56\x59\x88\xa0\x95\xd8\xd4\xf6\xf5\x9b\xe5\x72\xd3\xd8\x21\xdd\x78\x99\x77\xef\x77\xa2\xfd\x71\x10\xce\xee\xd9\xf3\x75\x6e\xd8\xe1\x88\x26\x7b\x97\xa3\x0e\xf8\x95\x7c\x78\xae\xa3\xa2\x96\x3d\xec\xa6\x18\x60\x54\x5e\x0c\x40\x82\x48\x81\xeb\xb1\xdb\x10\xf6\x07\xe1\x0d\xdb\xdd\xce\x40\x0e\xa2\x36\xba\x47\x45\xaa\x99\xa0\x56\x41\x97\x67\x66\x78\x9e\xd0\xda\x7d\xb5\x5f\xda\xb4\x59\xeb\xd4\xb4\x41\xa6\x28\x2f\x7c\xfd\x5a\x20\xea\x06\xef\xfa\x33\x59\x55\xe5\xfd\x29\x18\x16\x71\xbc\x92\xc0\x00\x52\xf7\xf7\x5c\x39\x27\x7c\x9a\x43\xb7\x87\xac\x9f\xb1\x51\x6e\x99\x62\x32\xa5\x09\x77\x4d\x1d\xc2\x1d\x8c\x05\x13\xf7\x84\x4b\x0a\x5b\x5f\x18\x95\x75\x81\xf9\x90\x44\xa1\x42\x23\xcc\xda\x8a\x28\x4d\xe1\x2f\xd4\x24\x26\x5f\xe5\x7b\x27\x02\x15\xf8\xfa\x9f\xf2\xbe\xa5\x17\x93\x4e\x48\x00\xa4\x7d\x34\x6f\xb6\xc3\x61\xcf\xba\xbe\xff\xab\xd9\xc4\x16\x4f\x45\x15\x6e\x24\x5c\x97\x7e\xdb\x47\x36\x42\xc3\x94\x0b\xe5\xad\x6f\xd1\xa7\x11\x9a\x7b\x18\xe9\x8d\x6d\xc8\x43\xe0\xd2\x54\xc9\x3d\x01\x46\xd1\x8e\x5c\x62\xed\xe1\x49\x0f\x89\xa6\x05\xeb\x45\x4f\x97\x47\x78\xcf\xae\x20\x93\x2e\x95\x47\x7b\xd0\x3b\xcd\xb9\x7d\x5b\xcb\x76\x33\x59\x42\xe9\x2e\xe6\x68\xf2\x31\xe6\x9c\x57\x0a\xc5\x44\x6d\x0f\x77\x40\x66\x73\x7f\xdf\x49\xf1\x0c\xeb\x1b\x52\xd6\xd8\xa4\x63\x98\x46\xa3\x37\x3a\x7c\x6f\x3b\x4b\x31\x59\xfe\x2e\x7a\xf7\xee\xe2\xf0\xdf\x17\x2d\x94\xd2\x55\xd0\x17\x65\x1d\xa3\x00\x90\x05\xe5\xea\xc3\x17\x6c\x09\x38\x9e\xe4\x0d\x70\x38\x3b\xd3\x71\x17\xec\xa0\x83\x59\x8a\x18\x01\xf5\x92\xd0\x57\x18\x6e\x56\x8e\x24\x7c\x25\x2b\xe4\xb1\x4f\x72\x3a\xb7\xdd\xb9\x7a\xe9\x76\x8c\x26\x82\xfd\x63\xac\xc3\x00\x77\x9f\xe0\x4e\x2b\x88\x87\x47\x51\x34\x6c\x9e\x0f\x97\xa2\xa2\x16\x77\x2f\xf9\x62\x5c\x33\xbd\x7e\x29\xfe\xd8\x00\x3a\x08\xdb\xd3\x3b\x5d\x17\x89\x9c\x94\x3c\x25\xe9\x5a\xd7\x54\xfb\x63\x2e\x04\x7c\x11\x2a\xf7\xf7\xce\xba\x72\x36\x2e\x1a\x3d\xdd\x29\x35\xaa\xf7\xf8\x18\xa2\x7c"}, -{{0xb8,0x34,0xc6,0xe0,0xfa,0xcb,0xff,0x58,0x0d,0xd3,0xb2,0x37,0x53,0x95,0x9a,0x4c,0x21,0x54,0xc2,0x19,0x52,0x1b,0x3d,0x27,0x03,0x5d,0x07,0x1f,0x65,0x99,0xbd,0x02,},{0xd1,0xc3,0x84,0x71,0x5e,0x3b,0x3d,0x02,0xc1,0x3e,0x09,0x06,0x05,0x53,0x4c,0x7d,0xb7,0x40,0xda,0x2a,0xa5,0x60,0xf5,0x32,0x00,0xa3,0xce,0xd8,0xbe,0xae,0x8c,0xf8,},{0x0f,0x19,0xb7,0x06,0x6d,0x57,0x92,0x32,0x8a,0x98,0x00,0xd9,0xd4,0xf8,0xf6,0x7d,0x5b,0x08,0x9b,0x54,0x12,0x26,0xa1,0x67,0xda,0xcd,0x43,0x9f,0xa4,0x85,0xb0,0x02,0x5a,0x5d,0xc7,0xf2,0xc7,0xe2,0x3f,0xc4,0xa5,0xc6,0x86,0x9e,0x76,0x19,0xd3,0x56,0x39,0x97,0x00,0xc9,0x36,0x50,0xe8,0x9c,0xd2,0x5b,0x90,0xfb,0x99,0x25,0xe3,0x04,},"\x6c\xf1\x47\xb1\x60\x55\x28\xa3\x6b\xe7\x57\x16\xa1\x4b\x42\x0b\xcf\x06\x7c\x03\xf1\xcf\xe9\xc4\x40\x2f\x14\x98\x7f\xbf\xc9\xd3\xec\xc3\xcc\xf4\xf8\xd2\xd0\x3a\x55\x90\x0b\x8d\xc7\x9a\xf3\xb6\xe7\x74\x36\xf6\x9b\x14\x17\xad\x4b\x68\xfd\x44\xe5\xe3\x33\xed\x90\xea\x79\x43\xfb\xd1\x12\x26\x09\xec\x8f\xf6\xbb\x25\xe4\x2e\x99\x14\xf5\x92\x0f\xc7\x2c\x4d\x01\x3b\x6a\x96\x85\xc9\x96\xfb\xd8\x35\x2a\xaf\xb1\x84\xc2\x2d\x9e\x47\x87\x1a\x52\x80\xe4\xab\x7d\xd6\xa5\xcf\xd1\x0a\x59\x94\xa2\x00\xf6\x70\xe0\xb6\x22\xa9\x39\x4d\x47\x93\xd0\xa4\x20\xe7\xd8\x80\x6c\xb1\x27\xc7\xac\x69\x0d\x45\xa2\xe9\x41\x66\xce\xa6\x72\xbc\xd9\x82\xb0\xe9\xba\xad\x56\x31\x2d\x25\x70\xdd\xde\x7e\x0b\x9e\x7f\x47\x13\x6f\x04\x81\xd0\x0f\x66\xa2\xaa\xca\x4d\x1b\x09\xd7\xce\x6c\x5a\x98\xa7\x6b\x68\xcd\x97\xd5\x79\x39\x68\xd6\x67\x07\x3f\x82\x17\xf9\x05\x47\x35\x34\x0f\x9b\x14\x9c\x0d\xce\x84\x5b\x09\x9e\x88\xd0\x70\x96\x80\xf0\xf7\x76\x03\xff\x0a\x23\x31\xc5\x58\xfc\x36\xd5\xf2\x4d\xa9\xa6\x2d\x69\xaf\x51\x90\xd2\x1b\x5c\x85\x7a\x1e\x08\xf0\x14\xc6\xd4\x56\x46\x86\x65\xa7\xf8\x45\xc6\x6f\x91\x11\xf9\xc0\x98\xc6\x89\x40\xef\xcd\x87\xb6\x57\x07\x0c\xb9\x16\x4b\xc9\x74\x3a\xce\xb7\x43\x9a\x0d\x01\xc0\x06\x2a\x11\xaf\x2e\x11\x34\x93\x97\xf5\xd1\x52\x87\x2b\x13\xc5\xab\x32\xf5\x1c\xc5\x8f\x14\x75\xec\x82\xac\x67\x15\x61\xdc\xbd\x34\x3c\xfb\x3c\x5f\x78\xd0\xfc\x73\x05\x3c\x60\x04\xb0\xa4\xca\x3f\x20\x43\xff\x4b\x0c\x54\x27\x5c\x4f\xcb\x9c\xad\xc6\xba\xab\xe5\x7b\x1d\x5a\xcd\x53\x1e\x97\x2e\xf9\x33\x51\x36\xcd\x1d\x65\x51\x2b\xa1\xf5\xb6\xcc\xc4\xb6\x6b\x42\x50\xaa\xfa\x29\x67\xdd\x42\x11\xa2\x74\x2e\x0f\x17\x7d\x8f\x40\x63\x89\x9f\x61\x81\x5c\xbe\x6d\x8f\xbf\xcd\xf7\x48\x12\xbd\x40\xcc\x10\x08\x4e\x46\xa9\x9a\xc1\x28\x05\x8e\xaf\x16\xa4\x9a\x24\xb6\xae\x22\x8e\xcf\x01\x09\xc5\x2d\xfc\x06\xe3\x7d\x6a\x33\x3b\xcb\x24\xab\xa3\x12\x16\x4c\x6c\x02\x90\x48\x5d\x25\x12\x80\x53\x8c\xe9\x54\x1c\x09\x16\x64\x0e\x36\xd6\x92\x9d\xcd\x95\x88\xeb\x99\x57\x7f\x5f\x6d\x82\xbc\xbb\x19\x88\x26\x26\x7e\x49\xf5\xda\xff\x2c\x0d"}, -{{0x22,0x69,0xa5,0xd8,0xf7,0xac,0x2c,0xd9,0x04,0x8f,0x5f,0x49,0xe3,0x49,0xe5,0xc4,0x35,0xa1,0x59,0xb3,0x19,0xfe,0x3b,0x30,0xbf,0xac,0x8d,0x0d,0x50,0x59,0x43,0xf4,},{0x1c,0x81,0x79,0x43,0xdc,0x39,0xc2,0x4b,0x01,0xda,0x38,0xa4,0x87,0xb1,0x75,0x48,0x24,0x60,0xc6,0x09,0xe4,0x72,0x63,0x49,0xa9,0xaa,0x7a,0xea,0x9b,0xc0,0xfb,0x34,},{0xbe,0x0f,0xb3,0x30,0x8a,0x07,0x6a,0x61,0xa4,0xa9,0x2a,0x97,0xf6,0xac,0x55,0x32,0x71,0x90,0xe1,0x34,0x1d,0x6d,0xd4,0x10,0xd8,0x6b,0x41,0xbd,0xaf,0x2d,0x33,0x74,0x09,0x3e,0xf7,0x20,0xbd,0xb7,0x7f,0xeb,0x70,0x14,0xe0,0xf7,0x7d,0x3b,0x80,0x96,0x23,0xc7,0xca,0x53,0xe2,0xae,0x4b,0x09,0x71,0x13,0xe9,0x6d,0xb7,0x7a,0x2d,0x08,},"\x71\x53\xd4\xd9\xe6\x41\xaa\x61\x92\x0d\xb0\xff\x4b\xd5\x37\xa6\xd6\x13\x0a\x39\x65\x54\xcc\x94\x53\x76\x98\xf9\xca\xd1\x6b\x99\xee\xbe\xfa\x5f\x27\x76\xf2\xfe\xaf\xf6\xbd\x9a\x69\x04\x12\x0c\x67\xe0\x88\x3f\x6b\x96\xbb\xbb\x19\x5e\x95\xae\xc7\x53\xb6\x99\xba\xb3\xd0\x39\x44\xc1\x3c\x72\xfc\x84\xe3\xf2\xcb\xf6\x29\x6f\x64\x55\x49\x11\x1c\x93\xfa\xe1\xa7\x59\xbf\xcd\x16\xfc\x09\xe6\x0b\xb9\x78\x55\x35\xad\x27\xda\x24\x4e\xf2\xf8\x57\xf2\xde\x99\xa6\xe9\x21\x88\x89\x0e\x45\x2c\x7f\x5b\x9e\x3a\x4b\x96\x8e\x11\x74\x3b\x6f\xc7\xfa\xf1\x27\x5e\x53\x60\xa5\x46\x89\x41\x79\x78\x94\xd7\x70\xfa\x7d\xa3\x64\xa3\x37\x30\x22\x39\xfe\x83\xae\x0b\x0d\x08\x4a\xa1\x2a\xcd\xc6\x34\x62\x52\x4e\x0e\xb1\x0f\xef\xe8\x1b\xa9\x6f\x71\xf2\x75\xf3\x44\x9a\x3f\x8d\xb2\x1d\x58\x74\x9a\x38\x85\x3d\x39\xb0\xad\x8e\x69\x89\x1b\xd2\x04\xdf\xca\x8f\x6c\x23\x9d\xc9\xa0\xac\x27\xf5\x4d\xb4\x23\x8d\x47\x06\xdf\x11\xd6\x07\x36\x9d\xc7\xf7\x04\xda\x1d\x39\xf2\xe8\x2a\xf8\xc2\x83\xd2\x20\xc1\x24\x31\xf5\x6d\x80\x30\x69\xb4\xac\xb7\x70\x81\xc0\x31\xae\x33\x19\xfc\x77\xfc\xa7\x84\x50\x97\xfd\x72\x7a\xd0\xd0\x80\x89\x5b\xba\x23\xe8\x73\xd2\xde\xf8\xcd\xc2\x16\xc3\xee\xd6\x1b\x08\x76\x1b\xb9\xeb\xce\x02\x82\xcf\x50\x2a\xaf\x6c\xe7\xe8\xc0\x58\x63\x79\x58\xc3\xea\x1b\x72\xfe\x6e\x8d\xf8\xd3\x7a\xc0\x55\xdb\x69\x92\x58\x7f\xab\xbd\xc4\x67\xf5\x24\x75\x64\x4f\x91\x88\x63\xaf\x62\x04\x92\xf3\x46\x80\xf2\x05\x6c\xbc\xab\x75\xe2\x32\x36\x26\xc0\x94\x75\x9c\x0e\x0e\x99\xef\x19\x75\x95\x27\x25\x06\x46\xad\x76\x01\x20\xba\x38\x66\x99\xd5\x39\x34\xf9\x56\xb8\xbb\xc7\x39\x5b\xb4\x96\xce\xb2\xdd\x22\x3c\x7b\x50\x1b\x92\xd3\x6a\x95\xf8\xf0\xa0\x2e\xb5\xba\x4d\xdd\xf1\x66\xb9\xb9\x5b\x4a\x59\xe7\x2a\x30\xc6\x3c\xf2\x1e\x60\x85\x75\x19\x23\xd5\x4b\x30\x28\x1e\x52\xa0\x96\x18\xe6\xf0\x23\xba\x0a\x21\x67\x5e\x7f\x98\x9b\x89\x91\x58\x8c\x96\xc2\xb5\x6a\x78\xf5\xd2\x94\x5a\x7b\xae\xb6\xa0\xc1\xbb\xd5\xd9\x5a\xf3\xee\x83\x0f\x58\x09\xc7\x94\xa1\x5a\xb4\xb5\xf8\x9d\xd2\xbe\x2d\xfd\xcd\x8f\xe0\x52\x0f\xda\x2b\x3f\x02\xa1\xac\x01\x55"}, -{{0xe9,0x65,0xb3,0xf2,0x57,0x35,0x66,0x85,0xc9,0x8b,0x42,0xb9,0x64,0xa2,0x53,0xfc,0x49,0x53,0x99,0xcc,0x94,0xb0,0x99,0xc2,0x44,0x5f,0xc8,0x1c,0x75,0x9c,0x68,0xe5,},{0x68,0x9f,0x54,0x10,0xc8,0xe0,0xf4,0xd3,0x7b,0xc0,0x7c,0x85,0xd7,0xcc,0xe6,0xc9,0xb6,0x36,0x01,0xf9,0xbd,0xaf,0xec,0xaa,0x44,0x8a,0x5e,0xed,0x64,0xaf,0xc8,0xc6,},{0x8d,0x2b,0xc4,0xe1,0xcd,0x25,0x6a,0xad,0x8a,0x15,0x1d,0xec,0x01,0x0d,0xc9,0x3a,0x5e,0x5c,0xca,0x58,0x29,0x8d,0xec,0x49,0xcb,0xc9,0xc4,0x71,0x7b,0x5c,0xfb,0x54,0x60,0xd4,0x30,0xbe,0x72,0x6b,0x0f,0x30,0x2c,0xbd,0x92,0x6b,0xee,0xa1,0x9a,0xa3,0xc9,0x3a,0xeb,0x45,0x2a,0x44,0xf6,0x00,0x7a,0xf4,0x9a,0xdf,0x2f,0x05,0xbb,0x04,},"\x6f\x20\xa9\xad\x27\xe3\x0d\xac\x76\xb3\x0d\x4c\x19\xa5\xbd\x6d\xfd\x6d\x04\x92\x13\xf4\xbe\xcd\xd9\x63\xd7\x2b\x8b\x2d\xad\x68\x7b\x00\x38\x08\x20\x1d\x50\xf7\xdd\x6e\x59\x9e\xf5\x8c\xeb\x60\x68\xc5\x45\xed\x99\xb9\xe7\x63\xf9\xb0\xec\x1d\xb5\xfc\xbd\x7d\x49\x0a\x12\x1e\xce\xc6\xbb\xa1\xeb\x5e\xdb\xd6\xde\x85\x36\x47\x07\xc5\x5e\x30\x0c\x8b\x16\xbb\x25\x30\xf7\x08\x98\x13\x66\x89\xc9\x88\x59\x1d\x53\x91\xd9\xcc\x34\x7d\x79\x31\x06\x1a\x9b\x76\x96\xe2\xc9\xf3\x5b\xc0\xd3\x04\xa8\x1c\x2c\xf9\x54\xd9\xc3\xa8\x8a\x22\xe1\xd6\x7b\xbe\x0a\x85\x30\x84\x77\xf6\x29\x18\xc2\x5d\xb5\x04\xe4\x76\x2f\x0e\x3b\x42\x46\x00\x79\x08\xac\x70\x17\x79\x00\x6b\x77\xd7\x25\x10\xed\xc6\x9e\x17\xd0\xf6\x39\x4c\x77\xe5\x55\x18\x75\xa4\x46\xf8\x12\x33\x41\x5d\x0a\x91\xa0\x46\x0b\x51\xc4\x13\xd6\x44\xe8\x50\xf8\x55\x72\x81\xc4\x66\x99\xe5\x3b\x22\xa7\xc7\x3b\x06\x8e\xa3\x86\x52\xcf\xf3\xb0\xa7\xb8\xba\x30\x97\x1e\xab\x18\xfd\xbb\xd8\x73\x9e\xe1\xee\x0c\xd5\xcb\xfb\x7d\x5d\x41\x75\x7b\x63\x31\x27\x1f\xb7\x80\x97\x51\xe2\x03\x51\x3c\x99\x70\xf6\x6d\x91\xbc\x0c\xe0\x62\xf4\xfc\xb2\x8b\xe0\xa6\x99\x86\x7b\x79\x59\x4c\x64\x58\xa0\xd3\x07\xac\xac\x91\xf4\x13\xc4\x61\x58\x77\xdc\x53\xe1\xb0\x18\xda\x5c\xfc\xe1\xb6\x3f\x40\xbe\x1e\x55\x27\x4c\x43\x74\xcd\xfc\x21\x52\x44\x99\xa6\x83\xa2\x31\xad\xef\x77\x9d\x19\x21\x44\x0e\x5d\x3f\xdb\xd5\x03\x3d\xc9\x83\xcf\xc9\x31\xab\xe6\x38\xc3\x5d\x5a\x95\x86\x9e\x9f\xe3\xd9\x3e\xb9\x0b\xd1\x86\x1f\x85\x5c\xe1\xf6\x08\xb7\xbc\xad\x6b\x5e\x1b\xd9\x7e\xdc\x95\xed\x5d\xdc\xbc\xb7\x15\xd9\x19\xf5\xff\x77\xdf\x2d\xa4\x38\xf7\xa3\xa9\x82\x86\xdb\xd5\xb6\xe0\x43\xfc\x73\x72\xf6\x97\x04\xf0\x9d\x86\x55\x30\xf4\xf0\xed\xd3\x30\x0f\x18\x5b\x6d\x73\xd8\x71\x6d\x32\xd3\x2b\x1c\x9a\xc2\xdd\xf4\xf9\x02\xd3\xf2\x16\xd3\x5a\x33\xf3\x68\x09\x5d\xed\x10\xbe\x94\xbb\x53\xd6\xf2\x56\x56\x0f\xac\x2f\x4a\xf0\xed\xf5\xc5\xc7\x02\x14\x37\x77\x12\x6e\x7d\xe3\x2d\x07\x49\x39\x32\x66\x21\x29\xba\x0e\x7f\xc7\xcf\xb3\x6f\xd2\xca\x53\x16\x46\xe8\xcd\x22\x11\x85\x4f\xc5\x10\xaf\x3b\x1e\x8c\xaf\xde\x7a"}, -{{0xbc,0x3b,0x1e,0x0b,0xf8,0xd6,0x9e,0xa5,0xb4,0xcb,0xbf,0x10,0xbb,0x33,0xfc,0x95,0x5a,0xdc,0xbe,0x13,0xfc,0x20,0xaf,0x8a,0x10,0x87,0x2c,0xe9,0xdf,0x39,0xd6,0xbd,},{0xac,0xcd,0x26,0x28,0x15,0x59,0x19,0xbb,0xc7,0xf9,0xd8,0x6f,0x91,0xda,0xfe,0xc3,0x5c,0x71,0x1a,0x78,0xc7,0x9a,0xd3,0x60,0xed,0xdb,0x88,0xfa,0x8a,0x18,0x0b,0x2d,},{0x6e,0xf7,0xf0,0xe9,0x1f,0x2c,0xc6,0x71,0x5f,0x8e,0x5a,0x98,0x57,0x4b,0x44,0x00,0xc2,0x61,0xa6,0x43,0xe0,0x54,0x5f,0xf2,0x67,0x47,0xf8,0xe1,0x73,0x98,0x99,0xd7,0x66,0x40,0xb6,0x45,0x1c,0x43,0xc1,0xd0,0x3a,0x47,0x75,0xb5,0x4f,0xcf,0x9b,0xce,0x18,0xed,0x3f,0xcc,0xad,0x33,0x8b,0x77,0x64,0x02,0x4f,0xdf,0xa2,0xde,0x82,0x01,},"\x4c\x73\xe0\x4a\xbe\x08\x19\xde\x1f\x84\xd7\x05\x41\xeb\x1b\xb6\x1c\x4f\x42\x92\x0e\x1f\x2d\x1d\x9e\x62\x81\xa8\xa2\xe8\xb3\xeb\x45\x53\x7d\x83\x96\x90\x27\xf9\x9e\xf0\xea\x27\xca\x08\x5b\x13\xf9\xdb\x48\x0f\x00\xc0\x2f\x3f\xd7\x42\x9d\xd5\x67\x70\x89\x53\xbb\xf3\xb9\xe8\xe2\xc6\xac\x4d\x32\x1f\xf8\xf9\xe4\xa3\x15\x47\x23\x08\x5a\x54\xe9\xc9\x57\x3c\xc7\x35\x0c\x09\xf8\x97\x3f\x94\x8b\x08\x73\x03\x73\x59\x7a\x5f\xd0\x34\x98\x21\xae\x0a\x3c\xd6\xc8\x49\x92\xb1\x89\x12\x8f\x34\x90\x98\x7e\x1e\x9a\xd4\xf6\x57\x4c\xa5\x38\xfd\xfd\x83\x28\x4c\x1e\xb0\x95\x3f\x24\xc0\x8f\x74\x93\x2d\x43\x64\xdb\xbe\xf9\x22\x54\x24\x40\xda\xe8\x04\x24\xa9\x2e\xae\xf2\x7c\x18\x89\xbd\x08\xc4\x4f\x9d\xf0\x3a\x3a\xf3\x0d\xff\xb4\x8f\xae\x44\x5e\x62\x5f\x4d\x92\x65\xcf\x38\x7a\x1d\xa3\x5f\xe4\xc2\x31\x50\x45\x35\xdb\x72\xea\x81\xa1\x86\x80\x5f\x85\x6e\xbe\x6a\x6a\x65\x24\x14\x32\x53\x0f\xe6\xc9\x60\xc5\xf9\xbe\x6c\x22\x95\x70\x60\x30\x4e\x9d\xd8\xef\xbc\x1e\x48\x2e\x7d\xdb\xd8\xaf\x03\xbf\x23\x82\x89\x9c\x98\x6d\x91\x66\x11\xe4\xf2\x7a\xe5\x2f\x81\x7e\xf0\x1b\x6a\x14\x1f\xe4\xf6\x85\xd9\x4d\xc8\xcd\x52\x83\x00\x43\x93\x45\x87\x70\x4c\x1e\x64\x2e\x8f\xe5\x6b\xe6\xd6\xb8\x5b\xf4\xa6\xfe\xb2\xb6\x85\x8f\x1f\x00\x7f\x99\xd3\x9e\xa0\x4c\x9f\xe5\xfa\x7e\xf1\xb9\x1f\x49\x5e\xd0\xe7\xfa\x42\x13\xdd\x68\xce\xa4\x2b\x67\x29\xf9\x50\x31\x90\x7e\x27\xc4\x40\x98\x09\x43\x86\xfa\xbf\xb0\x4a\xb9\xb4\xde\x3d\x68\x61\xde\x46\x23\x12\xc5\x9b\x27\xc7\x6f\x7b\x6a\x4f\xc7\x1e\xa0\xd5\xda\xf6\xb7\x32\x05\x21\xa6\x7e\x5c\xb3\x75\x04\x97\x6a\xd7\x3d\xae\x2d\x64\x9f\xeb\x75\xe2\xea\xdd\x34\x01\xa7\xf2\xf3\x6e\x16\xdf\xbf\xbd\xb2\xaf\x57\x16\xcb\xa1\xbc\xe2\x0c\xd4\x7c\xe1\xc1\xd7\xbe\x00\x69\x70\x01\xfb\xbe\xb4\x91\x5a\xa6\xe5\x39\x3b\x5a\xb2\x0e\x0f\x31\xf5\x11\x91\x49\xa2\xcb\x4c\x4d\x45\x2c\x81\x56\x11\x3a\xc7\x82\x4f\x84\xf0\x9a\xeb\x81\x20\x2e\x8d\xd3\xda\xc0\xaa\x89\x39\x9b\x5a\x38\xb1\xe2\x18\x30\x19\x60\xa3\x7d\x52\x63\x2e\xea\xef\xe3\x68\x74\x55\x46\x42\x88\xeb\x17\xd9\xe1\x9a\x3a\x72\xed\x9d\xe3\x2c\x17\xbe\x79\xa3\xb9"}, -{{0x10,0x71,0x8f,0xa6,0xe2,0xd7,0xf6,0xed,0x38,0xfd,0x66,0xcb,0x6d,0xbf,0xa0,0x87,0xe8,0xf1,0xe8,0xa8,0xa2,0x4f,0xab,0x58,0xd7,0x9d,0x79,0x54,0xb8,0x72,0x0c,0x3e,},{0x87,0x0d,0x4f,0x66,0x6d,0x06,0xfd,0xa9,0xf9,0x51,0x1b,0x58,0x60,0x2e,0xec,0x05,0x0d,0x75,0x4e,0xa6,0xd8,0xe7,0x9c,0xdd,0x19,0xf6,0x01,0xc4,0x77,0xdf,0x1a,0xa0,},{0xe1,0x65,0x91,0x86,0xf1,0xf7,0x6f,0xe4,0x3a,0xc8,0xa1,0x17,0x03,0x36,0x0f,0xbe,0xff,0x53,0xb5,0xe5,0x7b,0x59,0x74,0xaa,0xa0,0x8e,0x25,0x75,0x57,0x9c,0x27,0x08,0x4c,0xf6,0x80,0x2e,0x7c,0x20,0x63,0x47,0x31,0x44,0x75,0xb6,0x03,0x19,0x74,0x94,0xe7,0xd6,0x1f,0xe4,0xb1,0xee,0x7b,0x78,0xe1,0x8d,0x94,0x46,0x93,0x52,0xdf,0x0c,},"\x41\x25\x9b\x6e\xef\x13\xd6\xff\xe3\x3c\xdd\xe7\x99\xb9\x95\xc4\x0b\xe7\x82\xcf\x97\x84\x40\xb6\x6b\xe5\x1c\x44\x05\x82\xab\xd4\x2f\x52\x66\x96\xbb\x3c\xb9\x22\x65\xb1\xed\x0e\x4b\xba\x76\x4c\xae\x28\x39\x83\x0a\x25\x26\x35\xdc\x80\xce\x5f\x73\xd5\x21\xb3\xd6\xff\x03\xac\x30\xe1\x98\xad\x20\x56\x7e\x75\xa3\x4f\xa8\x25\xeb\xf9\x84\x15\x08\xda\x84\xcd\x67\x42\x36\xca\x7b\x43\xde\x35\x64\xc9\x4a\xb0\x79\x40\x8f\xd9\x41\x37\xce\x3f\x90\xa5\xdd\x5d\x3a\xc3\x9a\x05\xec\x86\x71\x5a\x8f\x02\x5e\x45\x39\xa7\x64\x0a\xb8\x88\x36\xf4\xef\xba\xbd\x5e\x16\x52\xc4\x9e\xa2\x16\x13\xac\xfe\x34\x3a\x88\x0e\xe5\xa4\x2f\x2f\x91\x34\xef\x4e\x37\x16\xb1\x6d\x13\x4a\x9c\x4c\x71\xc3\x9b\x3c\x1a\x85\x7d\x3c\x89\x43\x97\x83\xee\xf1\xed\xd7\x1b\xf4\x49\x2d\x05\xfd\x18\x67\x3a\x52\x42\xff\x41\x87\xb9\xde\x47\xad\x49\x68\xda\x49\xdb\xa5\xa6\x09\x2e\x95\xea\x27\xdd\xfc\x74\x48\xdc\xf5\x97\x2d\x9d\x22\x8d\x63\xe5\x29\x1b\xa6\xe6\xfb\xd0\x7e\x32\x41\xf9\x36\x6c\xa4\x97\x6b\xb0\x4b\x22\xd0\x1f\x0d\xba\xe7\x94\xfa\x9c\x1d\x90\x29\xf8\x8a\x83\x60\x2b\x0e\x0e\xc5\x5e\x22\xc3\x7b\x20\x11\x25\xca\xdb\x53\x41\xef\x73\xf6\xda\x1a\xbb\xe2\xb1\xc4\x75\xf0\x75\x03\x45\xb1\xbe\x42\x59\xd8\xc2\x85\x31\xff\xe7\x78\x86\x67\xc4\x10\xda\xc3\x39\x91\x8c\x86\x9b\x00\xab\x80\xf2\x0b\xf7\x99\x0d\x36\x6f\x9b\x3d\x5e\x8e\xb2\xf4\x8d\x7e\xd0\xe6\x4b\x85\xdc\x9f\xe3\xbb\x99\x8b\x1e\xec\xd1\x23\x1e\x90\x2d\x2d\x15\x2e\x09\xda\x2d\x25\x92\xbd\xb3\x2c\x8c\xd2\xe2\xc4\x89\x49\x6b\x29\x80\xc0\x3d\xbb\x09\xec\x7f\x8a\x4e\xa2\xc7\x02\x0f\x2a\x0f\xaa\x65\x7c\xd6\xce\xd4\x8d\x6d\xa2\x78\x64\xcf\x5e\x97\xee\xa9\xb3\xc2\xf0\xf3\x4a\xbf\x8d\x87\xbd\x2a\xde\xb6\x0c\x72\x72\xfc\x43\x06\xd9\x55\xbd\xc8\x02\x3d\x7d\x3d\xc2\xf3\xda\xfe\x9e\xbe\x8a\x8d\x13\x89\x65\xa7\xf6\xce\x93\x51\x7c\xd2\x09\x96\x63\xf6\x7c\x34\x55\x21\x76\xdd\xb5\x95\xac\x6e\xa5\x60\x9f\xeb\xcf\x24\xc7\xd6\x9d\x41\x27\x09\xe5\x78\x67\x0a\x21\xac\x8a\xfc\xcb\x8b\xf2\xb1\x8f\xf3\xaf\x7d\xe2\x1d\xc7\x1d\x50\xd6\x0d\x37\xb6\xed\x72\x9d\xb0\x4b\xef\xf7\xd3\x4b\x29\x20\xd8\x75\x51\xce\x15"}, -{{0xc1,0xd4,0x72,0x4c,0x6c,0xb1,0xbc,0x67,0x23,0xb2,0xb4,0x30,0x34,0x27,0x8b,0x3c,0x5b,0x48,0xfe,0xd7,0xf8,0xa3,0xcc,0x23,0x18,0x03,0x3e,0x75,0x52,0x04,0x73,0x51,},{0xc2,0x7e,0x39,0x2e,0x7c,0x36,0x64,0xb9,0x06,0x1e,0xa7,0x6d,0x25,0x75,0xdd,0x7c,0x41,0xea,0xf1,0xda,0x3a,0x65,0xf3,0xa9,0x86,0xe0,0xa5,0x7f,0x6c,0x40,0xc1,0x7e,},{0xd3,0x7a,0x6e,0xc8,0x2e,0xd4,0x5c,0xa9,0xb4,0x85,0x5d,0xe9,0xcb,0x94,0x25,0x64,0xe8,0x83,0xff,0x70,0xa7,0x9b,0x8e,0x71,0x2d,0x5f,0x60,0x4e,0xc8,0x97,0x4d,0xe5,0x36,0x3a,0xc8,0x49,0xcb,0xab,0x28,0xe7,0xae,0xef,0xf2,0x8e,0xd3,0xf2,0xd1,0x4b,0x60,0x8b,0x31,0x46,0xc2,0xef,0xe0,0x73,0x5a,0xd8,0x15,0xc7,0xd7,0x5a,0x1a,0x01,},"\xde\xee\x99\xd7\xa7\x7d\x43\x00\xc1\x7a\xec\x1a\xb3\x23\xc5\x71\xc6\xe9\xe7\x3a\x43\x49\x1a\x3c\x78\x88\xb7\x6f\xc0\x3e\xc4\x3d\x07\xaf\x42\xa0\x5a\x2a\xa3\x22\xd0\x0c\x85\x60\xac\xef\x31\x41\x06\xb1\x0b\x9b\xd1\x26\x54\x35\x7f\xfa\x26\xf2\x39\x00\x50\xda\x63\xd6\x68\xc9\xe2\xdf\x54\x8f\x87\x63\x9e\x09\x6a\x35\x85\x3f\x82\xe7\x61\xfd\x71\x1d\x2a\x26\x54\x38\xf5\xd4\xdb\x5e\x32\x77\x57\x08\x15\x0d\xa6\xcb\x68\x6a\x2b\x4c\xa2\x11\xd7\xf0\x0d\xc0\xab\xcb\x2c\xa1\x50\xe7\x91\x11\x6a\x10\xa5\xef\xcf\xf3\x51\x4d\xab\x8e\xd8\x0a\x70\x92\xc3\xa0\x15\x15\x2c\xb2\x5d\x9f\x86\xec\x0d\x1c\xa6\x7d\xda\xb4\x4d\x64\xee\xb1\xf9\x31\xbf\xab\x2a\xb1\x88\x95\x6c\x74\x3d\xb4\x81\x48\x08\xc5\xcd\xe1\xb0\x74\x5b\x3e\xdd\x34\x0e\xb0\x3f\xfc\xc8\x0a\x78\xf3\xdb\x31\x0f\x4f\x5c\x20\x00\x9f\xc0\x27\x9c\x2c\x1b\xcb\x3c\xed\xf9\x90\xbd\x0e\x20\xc6\xf9\xfb\x75\x15\xad\x6e\x93\x3b\x07\xe9\x9d\xa6\xac\x32\xb9\x71\x41\x18\x7e\xf6\x3b\xdb\x10\x62\xe3\x72\x20\xa4\xdc\xd4\x19\xd6\x24\x4c\xdc\xc3\x4e\xa4\x1d\x0b\xcb\xc3\x13\x8b\x1d\x54\xae\xfc\x01\x90\xe3\x0b\x18\x7d\xb0\x73\xaa\x7d\x6c\xfe\x04\xbd\x3f\xd2\xac\x00\x31\x3e\x3d\xdd\x64\xa1\x81\x93\x5c\xa4\xb8\xb2\xa8\x5d\x36\xbc\x27\xd9\x7b\x76\x26\x76\x7b\x93\xee\x38\xde\xf8\xb6\xb2\xc8\xda\x9b\x00\x26\x36\x14\x34\x2f\xaa\x9d\x3e\x73\x8d\x27\x13\xc4\x5f\xfb\xee\xf8\xc8\x4b\xcd\xbc\x8d\xa4\x30\x9c\x84\x45\x53\x0f\x5c\x61\x7d\xc8\x66\x25\x1f\x54\x89\x50\xa1\x4f\x07\x5a\xa3\x11\x7f\x96\xe4\x1f\x89\x9d\xbe\x73\x40\xb1\xd9\x0a\x13\x52\xd3\xb8\xfb\x41\xb7\x9f\x16\xa8\x2b\xc2\xe4\xa1\x93\xb8\xa7\x23\x24\x00\x99\x6b\x73\xb1\xfc\x00\xb2\xec\x1c\x66\x75\x77\xf8\x28\x24\xd3\x9f\xb7\xf6\xe7\x69\x2d\xcd\x97\xb1\xd8\xce\x94\x08\x3c\xa1\x97\xe9\xa5\xd4\x0f\xad\xff\x0b\x9a\xc5\x7e\x9d\xe7\x61\xc1\x56\xe6\xd3\x1d\x52\xc3\x32\xd5\x13\xe9\xf5\x86\x97\xdc\xbd\xd8\x0a\x5e\x42\xc5\x51\x70\x2c\x3d\xe7\xbe\xcc\xc3\xdb\x84\x5b\x1a\x04\xc8\xcb\xd4\x16\x95\xea\x74\x28\xab\xba\x89\xe0\xdc\xe3\xe3\xd9\xe7\x02\x30\xae\x91\x47\xc2\xb8\x85\x59\xdc\x69\x5d\x68\x09\xa5\x1c\xcb\xc1\xdd\x9e\x08\x9c\x58\x5f"}, -{{0x37,0xc0,0x70,0xd4,0xa5,0x3b,0x13,0xbe,0x76,0x06,0x35,0x11,0x0d,0x1b,0xd4,0xf0,0x19,0x20,0x22,0x5a,0xfa,0xbe,0xc5,0x76,0xfa,0xae,0xc9,0x10,0xf2,0x92,0x6d,0x1a,},{0x0a,0xa8,0x5f,0x2a,0xb1,0xdf,0xf8,0x95,0xd1,0xfa,0xd0,0xc1,0x19,0xf2,0xbf,0x57,0x12,0x6a,0xab,0x60,0x1c,0x52,0x8d,0x37,0x69,0x8e,0x97,0x70,0x2d,0x35,0xf5,0x25,},{0x9d,0xa6,0x0c,0xc4,0xa6,0x4d,0x07,0xde,0xe1,0x34,0x6b,0xd3,0xd3,0x01,0x09,0x95,0xce,0x27,0x38,0x20,0x8a,0xb3,0x5b,0x34,0xc2,0xa8,0xfd,0x17,0x87,0xae,0x3a,0x1e,0x20,0x7f,0xe7,0x84,0x52,0x51,0x54,0xfa,0xe4,0xf5,0x79,0x4c,0xd8,0x50,0x30,0x45,0xfe,0xa8,0x5c,0xf7,0x7f,0xd9,0x2f,0x6a,0x70,0xcd,0x0c,0x5a,0x52,0xc0,0x81,0x0e,},"\x10\xc6\x46\x44\x7f\x81\xad\x94\xd0\x15\xd8\x6d\x0d\x98\xb2\x45\x2d\xca\x60\xa4\x7a\xb3\x52\x64\x03\x5e\x33\xa0\x94\x2b\x95\x4e\x3e\x23\xb9\x1d\x81\x23\xb8\x59\x3c\x6a\xf7\xc8\xd3\xec\xd2\x90\xe0\xe5\xee\x36\xfd\x4e\x53\xb7\xbe\x63\x3a\x6c\xf0\x27\xa5\xac\x3f\x0f\x67\x9e\xb1\xbd\xd2\x10\xa3\x8e\xa6\xe4\x8b\x05\x58\xe3\x03\x01\x0a\xf4\x74\xe7\xf6\xdf\x2a\x4e\x45\x76\x99\xfc\x38\xe3\x69\x38\xb0\x5f\xfc\xaa\x1b\x69\x4e\x32\xf3\xd1\xb2\xcc\x5d\x00\xcf\x25\x6f\x12\x18\x4c\x87\x3e\x51\x90\x89\xec\x1d\xf1\x5b\x0d\xc7\x6e\x7b\xfe\x90\x78\x0d\xf5\x81\x36\xfe\x59\x7f\xce\x89\x4c\xa5\x63\xe0\x8e\xfa\x0f\x2d\x4d\x20\x8b\xed\xe9\xa8\x74\x88\x28\x73\xd2\x51\xba\xf0\x19\xfe\x46\xd1\xd6\x50\x4b\x3b\xcd\x24\x3b\x79\x53\x51\xf3\x4d\x2e\x76\x06\xaa\x97\x55\x28\xee\x50\xd5\x9e\xfb\x6e\xe6\x99\x2a\x89\xb2\x42\x69\x56\xc2\xca\x42\x47\xe0\xdf\x01\x29\x85\x29\x83\xe9\x76\x7a\x8e\xed\x1b\xc7\x33\x5f\xfc\xa8\xd0\x28\x9f\x04\x80\x7f\x67\xca\x7d\xa9\x71\xf5\x8d\xb8\xb9\xbc\x9f\xdb\xe4\xf8\x3c\xfe\x9a\x00\xf1\xca\x58\x47\x98\xbc\x71\xd8\x51\xff\x7c\xd6\xc5\x1b\x89\x90\xaa\xba\x4d\x38\xb4\x16\xb9\x22\x40\xdf\xb7\x0e\xe3\xc1\x2b\x5e\x73\x10\x57\x76\x2e\xf9\x08\x23\xfb\xf6\x83\xca\x06\xd0\x5c\x20\xd3\xae\x2b\x97\xa8\x3e\xbe\x70\xae\x17\xaf\xff\x9d\x16\x60\x9d\x54\x6d\x8d\x3c\x74\xbc\x28\x18\x84\x89\x4f\x3d\x49\xe0\x83\xf1\x0a\xe7\xc1\x1c\x1d\xca\x0e\xff\xef\xcf\xa6\xe0\xf1\x53\x50\x81\xfa\xc3\xa2\x81\x9f\xd2\xe3\x26\x55\x27\x18\x2a\xe9\xd3\x91\xb2\x32\xbb\x75\x42\xe6\x84\x55\xcd\x26\x77\x60\xdb\x65\x2d\x19\xe2\x2f\xb2\xed\x11\xcd\x13\x05\xba\x8d\x98\xc1\xeb\xf2\xd1\x96\x9b\x24\xd6\x4f\x3e\x31\x9a\xf7\x4e\x09\x20\x06\xd2\xa3\xff\x74\x48\x72\xa2\x0e\xbf\x18\xd1\x77\x48\xab\x71\x10\x80\x50\x96\xea\x13\x6b\xce\x2f\x96\x8b\x20\x5e\x65\x0b\x80\x3c\x53\x1d\x06\x77\x5a\xe5\xce\xea\x28\xbb\x92\xe9\xa0\xed\xec\x89\x51\xce\x20\x09\xa8\x8e\xe1\xb6\x4d\x9b\x9e\x89\xf6\x90\x51\x20\x33\x84\x21\x0a\x10\x2a\x44\xd2\xd6\x70\x31\x73\xb6\x85\x07\xdc\xea\xdd\x3b\xf6\x51\x0d\xf2\xa5\xce\xfd\x9c\x80\xe4\xf3\x85\xb2\xf9\xe6\x21\x58\x13\xed\x32"}, -{{0x11,0x26,0x49,0x6a,0x58,0x2c,0xe5,0x8d,0x3d,0x61,0x8d,0xd8,0xa3,0x93,0x35,0x47,0xaa,0x7a,0x8a,0x30,0xfb,0x54,0x06,0x3b,0x8d,0xfd,0xd3,0x16,0x71,0xc6,0xc7,0x3d,},{0xe1,0x02,0x29,0xc6,0x23,0xfa,0x8a,0xd8,0x98,0x2c,0x3e,0x4c,0x36,0xff,0x52,0xdf,0x0f,0x21,0x9b,0x57,0x91,0x5b,0x6e,0x98,0x0e,0x5f,0xe7,0x2e,0xa0,0x96,0x2e,0x22,},{0xb3,0x0e,0xb5,0x6c,0xa9,0xb1,0x20,0xbf,0x84,0x9a,0x3a,0x9d,0x56,0xaf,0x03,0x3d,0xe8,0xa5,0x90,0xc9,0xe1,0x24,0x0c,0x1e,0x36,0xdb,0xc6,0xcf,0x0a,0x71,0xb7,0x8a,0x11,0xec,0x14,0x3f,0xb9,0x95,0x9a,0x8f,0x25,0xb5,0x77,0x11,0xd6,0xa9,0x0a,0x67,0xe0,0x1b,0xe3,0xa4,0xda,0x2b,0x69,0x39,0x48,0x69,0xbb,0x8d,0x64,0xb8,0x7e,0x0f,},"\x6a\x4b\x52\xd7\x30\xdd\xab\x82\x9b\x2a\x17\x95\x90\xcb\xd4\xc3\x72\x49\x8e\x9f\x43\x99\x77\xc0\xa1\x0d\xc1\x3c\x0a\xe1\x73\x6e\xaa\xff\x06\x33\x71\x43\x4f\xd0\xda\x80\x36\x0e\xc5\x89\x06\x07\xd2\xfa\xe1\xc9\xa2\xe1\xab\x0b\x7f\x3d\x66\x7f\x5b\x1b\x9c\x41\x8f\x18\xb1\x0c\x9e\x6f\xd6\x69\xd3\xeb\xec\x16\x8e\xfe\xf4\x41\x63\xe5\x77\xa2\xeb\xd0\xf2\xcb\x76\x8f\x80\xc2\x31\x88\xe8\x60\x69\xe4\xd1\x0f\x41\x03\x06\xce\xdd\x7a\x34\x1a\x61\xe0\xf4\xf3\xbc\x25\x04\x1b\xc2\xf9\x22\xed\x07\x3e\x1e\x2f\x1b\x70\x9c\x57\x9d\x10\x63\x0f\x33\x07\x17\x54\xd7\x07\x89\x4a\x1c\x62\x19\x0d\xe1\x88\x82\xc5\x64\xdc\x4c\x01\xdc\x54\x5d\xd8\x96\x64\x04\xed\x78\xfa\x32\x67\xa9\x46\x9f\x63\xb6\x12\x0a\xbb\x65\xf9\xb3\xba\x3e\xee\x28\xd7\x9c\x2e\xb4\xe7\x02\x0c\xc6\x98\x7d\xfc\x5c\x29\x67\x2f\x8c\x0f\xa3\xe6\x90\xd5\x84\xfe\x00\x0c\x64\xf3\x52\x61\x01\x79\x62\x1b\xfd\x5f\xf3\xeb\x30\xd1\x8f\x1a\x02\x50\x41\x6d\xb9\x3b\x1c\x1e\x93\xcf\x8a\x36\x46\x51\x75\x60\xd1\xcc\x8f\xff\x82\x2b\x51\xef\x27\xb2\x00\xe9\x87\xb5\x92\x39\x07\x53\x45\x3e\xf1\x38\xbd\x3d\x29\xdb\x7c\xb1\xb5\xf4\x5e\x47\x95\xb8\x9c\x53\xf4\x97\x04\x19\x27\x52\x23\x7c\x6a\xb2\x74\x84\x9f\x95\x94\xee\x97\x77\xf6\xef\xe7\x04\x83\x12\x9d\x06\x7f\x97\x19\x9d\x9a\xe3\x60\x90\x70\x38\x64\xf7\xca\x47\x50\xa6\xf3\xb6\xff\x83\x82\x4c\x91\x04\x84\x39\x4d\x1e\x2e\xce\xba\x18\x44\x6f\xe4\xe9\x94\xce\x07\x43\x3a\x74\x0d\xdd\x05\xf0\xe3\x96\xd4\x82\x89\x4e\x6f\x14\xac\xf7\xb9\x7b\xae\x6c\x7e\xb8\x87\x03\x03\x9f\xa7\x85\xd6\x0a\x3a\xf7\x8b\x13\x24\x3a\x4f\x88\xdd\xe1\xd9\x98\x61\x7f\x2e\x3f\xa7\xea\xfc\x2f\x43\x5d\xd4\xac\x1e\xa9\xc2\x38\x40\x7a\xa0\x9b\x4e\xea\x8e\xd4\x34\x92\x7b\x40\x66\x74\xac\x27\x04\x58\xcf\xb3\xbf\x29\xc3\x47\xf9\x45\x59\x61\x31\x79\xb9\x50\x21\x92\x32\x1b\x88\xe9\xaf\x0a\x90\xe9\xa4\xab\x9e\xdd\xaa\xe3\x82\xe3\x73\x4d\x14\x15\xeb\xe3\x24\x99\xc3\x4e\x6f\xde\xaf\x15\xb0\xd9\x78\x79\x85\xe0\x8d\xfe\x49\x54\x60\xc5\x4f\x67\x43\xd8\x1f\xf1\x68\x81\xe5\xe3\x0c\x51\xf4\xb0\x92\x37\x37\x83\xf1\x24\x23\xc3\xe1\xae\x85\x91\x13\x0a\x26\x99\x80\xca\xa1\xcb\x5c"}, -{{0x9c,0x16,0x7a,0xff,0x3b,0x1b,0x78,0x8f,0x13,0x3d,0x42,0x2d,0xe8,0xca,0x9a,0x64,0x31,0x64,0x09,0xf9,0xe3,0x5b,0xfe,0x22,0x03,0x2e,0xc4,0x17,0xae,0x9a,0xbc,0x6d,},{0xef,0xb5,0x34,0xf0,0xd4,0x7c,0x06,0x8e,0x77,0xb2,0x8a,0x90,0x6d,0x95,0xad,0x8d,0x21,0x3a,0x4d,0x4f,0xc1,0xc7,0x05,0x42,0xf0,0x1e,0x59,0x6d,0x57,0xb5,0xf0,0x19,},{0xc9,0xae,0x67,0xfd,0x64,0x15,0xdc,0xba,0xb2,0x92,0xfa,0xb3,0x94,0xca,0x6c,0x3b,0x7d,0x90,0xca,0x24,0x4d,0xc6,0xa7,0x76,0x4e,0x74,0xfd,0x20,0x2b,0xf4,0xb2,0x90,0x5b,0xd2,0x03,0x0e,0x6b,0xeb,0x91,0x4c,0x3c,0x23,0x8d,0xb3,0x71,0xb1,0xcb,0xa6,0xd9,0x26,0x1a,0xa3,0x92,0xec,0x87,0x1a,0x4b,0x8b,0x12,0xfe,0x9c,0x1c,0x97,0x0e,},"\x68\xac\x0f\xc2\xb6\x07\xba\x38\xe3\x77\xfa\xe8\x45\xc8\x08\xc8\xf9\xfa\x61\x4e\xb1\xf3\x11\x58\xa9\x62\x0a\x93\x7d\x3e\x30\x1e\x85\xac\xaa\x69\x14\x4b\xc3\x49\xa3\x9d\xfb\x58\x20\x41\xc4\xa1\x97\xae\x99\xb4\xd4\xd5\x9b\x7a\x2c\xa3\xd1\x62\x28\xb5\x59\x1c\xbf\x57\xc1\x8a\x78\x1e\xfd\x19\x19\x3c\x47\xb1\x6c\x60\x23\xa3\xa8\xba\x3d\x66\x8f\x05\xa3\x7f\x1e\x83\xb0\xd7\xfe\xbd\xd1\x0f\x63\xe4\x8e\xf7\xa2\x0e\x01\x5b\x1c\x67\x25\xd4\xc3\x00\xa9\x86\xc6\x0e\x3a\x11\x54\x69\xc8\xe5\x2b\xa0\x5b\x51\xc0\x5d\x0a\xf4\x0d\x89\xfd\x9e\xd7\x6f\x36\x95\x0a\xee\x3c\x78\x19\x89\x8a\x90\x3c\xfe\x03\x61\xa9\x1c\x69\x10\x0b\x49\x51\x41\xe8\x6e\xe7\x9d\x63\xd1\x74\x03\xfb\x1a\x16\x29\xef\x63\xcb\x7e\x9d\x27\x20\xcb\xff\xf0\x00\x2b\x19\x0b\xcd\xc2\x67\x94\x12\x4d\xd3\x8d\x42\xbc\xaa\x71\x75\x40\x5e\xb0\xbb\xcf\x8e\x37\xd6\x5d\x05\xa3\x71\x95\xb4\x79\x37\x1f\xa2\xbb\xbb\x16\x7d\x91\xce\xe8\x82\x35\xdd\x72\xea\x88\xfc\x73\xce\x3c\xe4\x3d\x33\xb7\x15\xf2\x5f\x19\x2e\xc2\x15\xda\xc1\x24\x89\x9c\x5e\x75\x86\xe8\x63\x40\xd8\xcb\xe5\x37\x35\xde\xfb\xe0\x2e\x4c\xc9\xfd\xe6\x9f\xb9\x79\x4d\x1d\xb7\x2b\x98\xc0\xf1\x97\x66\xee\x51\x38\xbb\xfa\x78\x90\x9a\xa2\x99\xb4\x91\x3c\x49\x9d\xea\xf5\x4b\x48\x41\xd5\x04\x48\x29\x98\x49\x36\x70\x0d\xcf\x92\xf3\x65\x42\xb2\xfc\x7e\x86\x44\x1b\x99\x25\xf5\xd0\xb7\x8c\x17\xa8\x5c\xfc\xfc\xb2\x0b\x0f\xd7\x51\x34\x9c\x27\x46\x3a\xbd\xe4\xd2\x7d\xf7\x42\x65\x28\x87\x13\xf9\x6d\xea\x01\x3b\x94\x55\x21\x80\x8b\x49\x96\xb1\xb2\xdc\x03\x38\xb6\xd2\x36\xef\xd6\xd2\xb2\x7d\xaf\xda\x46\xec\x5f\xa3\x2b\x96\x5e\x8b\xb5\xe8\xbb\x61\xbd\x96\x6e\xde\xb7\x74\x68\x1e\x0e\xa8\xc1\x7b\x8c\x99\xfa\x7d\x66\x0f\x0f\x66\xc9\xbc\x6d\x95\xcb\xd7\xdc\x09\x47\x24\x09\x8e\xb0\x51\x91\xb5\x3a\x3d\xf6\x56\x6b\x9c\x90\xe0\xd7\xdf\xf2\x94\x38\x48\xb6\x1a\x20\xd4\x8c\x22\xb6\xd3\xc9\x58\xe2\x93\xd7\x09\xc8\xf4\x81\x10\x23\x0f\xf5\x19\x18\x56\x28\x77\xda\xf6\xd9\x20\xc8\x5a\x82\xe0\x7c\x45\x1f\xe7\xae\x97\x59\xc0\xa7\x7e\x97\xbb\x29\x8b\x5d\x05\x92\xa4\x1d\x08\xf6\x7a\x4e\xd5\xa1\xbb\x41\xe9\x37\xb6\xa6\x8a\xeb\x38\xfd\x5b\xe9"}, -{{0xe9,0x94,0x88,0x05,0xeb,0x34,0x1b,0x28,0x67,0x47,0x9c,0x66,0x8f,0xd3,0x53,0x2c,0x30,0x99,0x41,0xc0,0xad,0x4c,0xb2,0xe5,0x42,0x31,0x75,0x6e,0x6a,0x1b,0xde,0xcb,},{0x54,0x47,0xa8,0xe3,0x4d,0x6a,0x64,0x00,0x02,0xd8,0xd6,0x0b,0xcf,0x1d,0xdc,0x71,0x1e,0x4c,0x46,0x5c,0x94,0xc3,0x4b,0x50,0xbd,0xef,0x35,0x89,0x60,0xff,0x81,0xf1,},{0xd3,0xdc,0x62,0xd6,0xce,0x9c,0x76,0x6f,0x2a,0xba,0xf9,0xa7,0xfb,0xe0,0x9d,0x6b,0xdb,0x07,0xa4,0x74,0x7b,0x56,0x08,0x0d,0xb0,0x9b,0xeb,0x4a,0x4e,0x80,0x4a,0x70,0xd7,0xdd,0xf4,0x11,0x94,0x75,0xc7,0xbe,0x83,0x4f,0x31,0x95,0x6f,0x4a,0x71,0xda,0xd0,0x29,0xcd,0xf2,0x36,0x3d,0xd0,0x36,0x5c,0xe2,0x2d,0xc2,0x7f,0x07,0x80,0x03,},"\x91\xcf\xfd\x7e\xb1\xcf\x6b\xd4\x75\x6b\xce\x6a\x30\xaf\x9d\xfb\xa2\x6d\xdd\x1c\xce\x03\x94\xc1\x94\xa3\xe3\x9c\xc3\xd1\xcb\xc2\x21\xb7\xeb\x70\xbe\xa1\x8d\x29\xc2\x67\x45\x71\x76\xa3\xc9\xe5\x3c\x18\xe4\x7d\x10\xa6\x7c\x46\x45\x05\x19\x77\x02\xe6\xb2\x47\x0d\x38\x86\x9d\xb5\x17\x4b\x15\x8f\x99\x92\xe4\x43\x5d\x02\x24\x6f\x54\x02\x58\xde\xdd\x3c\xe3\x3d\xf5\x82\x55\x5a\x68\x1f\xb7\x6e\xca\xcc\xb1\xc2\x98\x9b\x17\x7e\x3b\x7e\x45\x4a\xaa\x52\x9d\xe5\x9b\xf5\xa0\x31\x23\xd5\x71\xdf\x2e\x7f\x7c\xb8\x30\x80\x5c\x58\xb7\x4a\x65\x3b\xac\x0e\x5a\x88\x8e\x08\xdc\x22\x36\xd6\xcd\x49\x6a\xa0\x6d\x0d\x67\xcf\x3b\x33\x5e\x21\x8c\x49\xde\xda\xd8\x2f\xc1\xbe\x9e\xf2\x0c\xac\x61\x90\x5c\x30\xeb\x13\x2d\x73\x9b\x16\xca\x8a\x8c\x90\x66\x19\xc0\xe0\xd8\xb3\x39\x85\x32\x7e\x36\xf3\xd4\xb8\xfd\xa3\x87\xc1\x86\xcc\x50\x44\x31\x04\xdb\x76\x1f\x7f\xf9\x30\x12\x70\x20\x4a\x71\x3e\x58\x90\x21\x01\xfa\xd0\x00\xce\x93\x16\x47\xc5\x77\xfd\xec\x14\x8d\xca\x95\xcd\xc0\x89\x18\xeb\xed\x03\x7c\x60\x33\x2f\xad\xf0\x88\xf0\x36\x08\x3e\xbc\x92\xe1\x73\xb7\xdd\xcc\x30\xc4\x93\xf2\x7e\x69\xcd\x17\xa2\x0d\x30\xb7\x8f\x83\xa7\x2e\x4f\x5a\x74\x7d\x86\xd9\x6c\x5e\x1b\xb7\xa4\x38\x16\x62\x04\x01\x3e\x21\x64\xd6\xaa\xbc\x0d\x56\x2f\x54\x01\x5c\x36\x5c\x80\x44\x56\x07\x14\x5e\x56\x92\xee\x34\xf6\x35\x30\x77\xfa\xb7\x45\x2d\x88\xce\x3e\xb0\x1d\x2b\x37\x97\xdc\x91\xb3\x41\xa3\xa7\x26\x30\x15\x16\xba\xae\x18\xe8\x51\xf7\x4d\xfb\xdf\x08\x66\xbb\x23\x76\x86\x7d\xe5\x52\x31\xe3\x62\xc4\x72\xc5\x21\x16\x54\x4c\xd4\xf8\x1e\x93\x57\x1c\x4e\xc8\x20\xe7\xe6\x53\xf4\xe2\x1b\xe0\xa9\x42\x57\x6c\x9d\xe9\x1e\x7d\x12\x51\x68\x3d\x85\x9d\xe4\x48\xf8\x22\xdc\xf3\xd2\xcf\x55\xed\xe2\xf9\xc7\x1b\x60\x63\xd1\x37\x30\x61\xf8\xf5\x93\x6b\x69\x8d\x13\x84\xe6\x54\x59\xea\x2b\xc2\x6e\xc9\x67\x75\xef\x42\x52\x07\x43\x2d\xda\x0a\xc1\xfe\x28\x52\x6c\x5e\x45\x59\x34\x9c\x3d\x8d\xf9\x91\x82\x30\xf4\x04\x46\x83\xcc\x2c\x1b\x85\x8d\x14\x1a\xb8\xd0\x80\x5b\xb9\x33\x60\x67\x52\x2a\xa8\x9c\x81\x0f\x3e\xaa\x7a\xc2\xd8\xdd\x28\xc3\x75\x12\x25\xa1\x9e\xce\xc8\xbc\xca\x52\x43\x99\x46"}, -{{0xb0,0x17,0x53,0xef,0xa7,0x3b,0xb3,0xde,0x7a,0xa7,0x78,0xbe,0x7a,0xfc,0xbf,0xf6,0x6a,0x5d,0x3e,0x2c,0x2f,0x8b,0x5a,0xa2,0xb0,0x48,0x84,0x40,0x50,0x99,0x69,0x65,},{0xd0,0xcc,0x6c,0xf1,0x09,0xc9,0x99,0xfb,0xf6,0xd1,0x6f,0x47,0x1f,0xaf,0xd0,0x23,0x2b,0x0a,0x68,0xd4,0xc4,0x64,0x06,0xec,0x75,0x45,0xdb,0xab,0xa8,0x19,0x41,0x58,},{0x16,0xb7,0x42,0x12,0x27,0xae,0x09,0x13,0x06,0x85,0xcb,0xb1,0xa0,0xc6,0x0a,0xa5,0x7a,0x5e,0x1a,0xfe,0x1b,0xbe,0x6b,0xac,0xea,0x0c,0x28,0x1b,0xcc,0x89,0x98,0xe6,0x82,0x4a,0x77,0x2c,0x32,0x08,0xa6,0xb6,0xb4,0xd2,0x36,0x69,0x55,0x05,0xc9,0xbe,0x82,0x70,0x0c,0xf9,0x3a,0x78,0x39,0x85,0xa3,0x9e,0x16,0xe3,0x77,0xa7,0x41,0x0e,},"\x68\x4e\x61\x2f\x27\xee\xad\x0d\x34\x84\x4c\xc8\x1b\xa9\x11\xc2\x8a\xaf\x6d\x66\xe7\x12\x29\xe8\xcc\x34\x62\xf7\xc7\xa0\x50\xda\xa3\x0c\xb7\x44\x71\x15\x0f\x07\xda\xd4\x59\xb5\xa9\x13\x58\x47\x6c\x05\x98\x25\x5d\x8a\x64\x2d\xd7\xc0\x80\x28\x11\xbd\x88\xe4\xca\xc5\x97\xef\xe4\x1e\xbd\x96\xcd\x0f\x3b\x5c\xe7\x2d\xb4\xbe\x1a\x3d\xbd\x6b\x84\xf5\x44\x6e\x3d\xa6\x00\xd3\xb1\xd2\xb4\x60\xa0\x09\xbd\x31\xca\xcd\x98\xa9\x15\x18\xce\x33\xe9\xa7\x03\xd4\x04\x28\x87\x36\xcc\xc4\x31\x03\xfc\x69\xe6\x79\x74\xf3\x16\x52\xfa\x3d\xad\xef\x33\x37\xf6\xc8\x97\xa3\xd2\x01\x30\x3c\x8f\x03\x59\x7b\x4a\x87\xc9\x8f\x29\x1c\xcd\x58\xa3\xf1\xe8\x98\x33\x2a\xa5\x99\x3b\x47\xfc\xb5\xdd\xaa\x1c\x08\x68\xb6\x43\x74\x2d\x0e\x4a\x4b\x9c\xd4\x27\x03\x8b\x3b\x74\x99\x9b\xc8\x9a\xc3\x48\x4c\x0c\xa1\x3f\x25\xaa\xe8\xe7\x8a\xe1\xcc\xee\x62\x18\xac\xca\xb8\x1a\x4f\x69\x4f\x53\x24\xa3\x47\x62\x9d\x49\xb5\x5e\x40\x37\x50\x4a\x9a\xcc\x8d\xf5\x8c\x68\x41\xdd\xdc\xd4\xfc\x43\x47\xf7\xb6\xf1\xfd\x9d\xe0\x56\x45\x77\xe6\xf3\x29\xed\x95\x1a\x0a\x6b\x91\x24\xff\x63\xe2\x2e\xb3\x6d\x3a\x88\x63\xbc\x1b\xf6\x9c\xea\x24\xc6\x05\x96\x7e\x7d\x89\x48\x95\x3f\x27\xd5\xc4\xc7\x5f\x08\x49\xf8\x72\xa3\xe3\xd1\x6d\x42\x2f\xa5\xa1\x1e\x1b\x9a\x74\xdf\x6f\x38\xb9\x0f\x27\x7d\x81\xfc\xe8\x43\x7a\x14\xd9\x9d\x2b\xef\x18\x9d\x7c\xac\x83\xdd\xc6\x13\x77\xed\x34\x8b\x3c\x4f\xc0\x9e\xc2\xb9\x00\x59\x25\xd0\x4a\x71\xe2\x6d\x64\x16\x67\xbd\xf5\x49\x29\x43\x31\xc6\xea\x01\xcd\x5c\x0b\xd1\xb6\xa7\xec\xfd\xa2\x0b\x0f\x19\x29\x58\x2b\x74\x69\x7c\xb2\x62\xc3\x92\x7d\x6b\x22\x3f\x4b\x5f\x30\x43\xaa\x6e\xb4\x57\x1a\x78\xe9\xda\x11\xc2\xb3\x6f\x64\x55\x25\x80\xca\xa7\xb5\xfa\x6b\x90\xf9\x29\xe0\x16\x2e\x60\x8d\x12\x40\xd7\x24\x2c\xd2\xf4\x70\x25\xc0\x3d\xeb\xe0\x59\xb1\xdc\x94\x77\x02\x32\xbc\x67\x65\x14\x84\x80\xbb\x1d\x9f\x50\xda\x1e\xe6\x44\x8c\xf9\xc8\x8b\x19\xdd\x45\x99\x32\xc0\x6e\xd8\x11\xc4\xa6\x4a\x12\xd5\x93\x8b\xd1\xc7\x57\xbc\xfa\xea\xee\x89\x33\xfe\x5f\xff\x21\x76\x3d\xe7\x40\x48\x2b\xcf\x1b\xa5\x9a\xfd\xc8\xfc\xf8\x73\xc3\xd5\x07\xbb\x39\x4e\x32\xe4\x5f\x73\x65\x19"}, -{{0x4f,0x4b,0x20,0xd8,0x99,0x36,0x6f,0x2f,0x23,0xee,0x62,0x8f,0x22,0x9b,0x23,0x6c,0xf8,0x0f,0x43,0xba,0x18,0x31,0x77,0xc9,0x7e,0xe3,0x48,0x29,0x54,0x6f,0x17,0x42,},{0xc9,0x45,0x76,0x64,0x1f,0x4a,0x89,0x3c,0xdf,0xce,0xe7,0xb3,0x9f,0xc2,0x19,0x29,0xb8,0x6b,0x34,0x99,0x76,0xd7,0xb0,0xa4,0x6d,0x39,0xa5,0x88,0xbc,0xfe,0x43,0x57,},{0x0f,0x80,0xff,0x5d,0x17,0x48,0x8f,0xe2,0x6f,0x93,0xc5,0x43,0xb0,0x4e,0xd9,0x59,0xb5,0xf0,0x64,0x3f,0xc6,0x1c,0x7f,0x2c,0x3b,0xc6,0x01,0x32,0xba,0x9c,0x62,0x10,0xc8,0xb2,0x50,0xea,0x5e,0x84,0xd0,0x7b,0x01,0xde,0x68,0xbc,0x17,0x44,0x14,0xee,0xeb,0x31,0xfd,0xc2,0xba,0x68,0x23,0xe2,0x31,0xe3,0x12,0xa9,0x1e,0xde,0xdd,0x02,},"\xdb\x8e\xf0\x2e\x30\x33\xe6\xb9\x6a\x56\xca\xb0\x50\x82\xfb\x46\x95\xf4\xa1\xc9\x16\x25\x0d\xd7\x51\x73\xf4\x30\xa1\x0c\x94\x68\x81\x77\x09\xd3\x76\x23\x34\x6a\xe8\x24\x5b\x42\xbd\xa0\xda\x6b\x60\x46\x2c\xcf\xdf\xc7\x5a\x9a\xb9\x94\xe6\x6c\x9a\xb9\xfe\xcd\xd8\x59\x96\x10\x91\x0a\xff\xe4\xf1\x02\x15\xcb\x28\x0b\xf8\xf9\xf2\x70\x0a\x44\x47\x96\xda\xe9\x3e\x06\xc6\xbe\xa7\xd8\xb4\xfe\x13\x01\xba\xa7\x9c\xce\xc7\x69\x36\x8f\xeb\x24\x42\xc7\xde\x84\xf0\x95\xe6\xb3\xbf\xf6\x3d\x38\x8c\xba\xfb\x2b\x98\x09\xdc\x38\xe9\xb1\x2e\xbd\x03\x9c\x0a\x57\xf4\xd5\x22\xe9\x1e\xc8\xd1\xf2\xb8\xd2\x3a\x4a\x0a\xe0\x59\xaf\x85\x39\x3b\xb0\xa1\x5f\x74\x91\x10\xf6\x77\x4a\x1f\xd7\x31\xa6\xec\x21\x3e\x4f\xf4\x35\xda\xab\x54\x6d\x31\xed\x9e\xc3\xb6\xd8\xcc\x2e\xda\xce\xbf\x4f\xac\xc5\x56\x65\x56\xee\xa9\x2e\x5b\x3f\x25\x42\x23\x9b\x25\xe2\x80\x12\xdd\x4e\xf4\x00\x72\xee\xbf\x83\xed\x2a\x25\x51\x81\xf3\xa4\x42\x18\x9d\x68\xc6\xc6\x09\xf4\xdf\xdf\x3d\xb7\xd6\x7d\x08\x7a\x2f\xcd\x6d\x2d\xc5\x0b\xbf\xed\x8b\xfb\xbf\xcb\x74\xd3\xc4\x1f\x02\xa8\x78\x65\xb1\x3b\x8e\xfc\xf5\xc3\x58\x12\x57\xbe\x0a\xa9\x13\xf6\x0c\x37\x05\x27\xbd\xe1\x1a\x47\x5c\x13\x6a\x17\xc5\xee\xfe\xb0\x3f\x5b\xff\x28\x69\x3e\xd8\x41\xe8\xed\x1f\x7c\x29\x10\x2f\x55\x99\xdd\x44\x40\x09\xbc\xea\x6a\x92\xd5\x57\x41\x52\x45\x8e\x0c\xaf\x8a\x36\xaa\x72\xb5\xdc\x49\x08\xa6\x46\x1c\x9b\x74\x14\x53\x00\x5c\x8f\xbc\xc6\x81\x13\xae\x18\x42\x08\xee\x14\xb8\x35\x48\x0c\x6e\xfa\xfe\xd1\x8a\x76\x00\x0b\x38\xe5\x85\x82\x90\xf4\xd5\x1f\x52\xf0\x96\xcb\xe4\x90\xe1\xeb\x5c\xac\xb2\x26\xec\x49\x5a\x55\xa7\xfa\x45\x78\x43\xd5\x7f\xab\x67\xf8\xbe\x7e\x20\x93\x34\x78\x5b\xdd\x66\x5d\x7b\x63\xe4\xda\xf5\x7b\x6e\x78\x92\x8b\x60\x3c\x8c\x0f\x9b\xc8\x54\x64\x73\x3b\x61\x27\x3e\xf9\xe2\xb8\xa0\xcd\x7c\x3b\xf8\xee\x0a\x68\x72\xe3\x4d\x5a\x27\xa6\x25\xe3\x5e\xaf\x7f\xf5\x44\x0b\x8b\x14\x1a\xf7\x04\xdf\x70\xc9\xc1\x86\x23\xbd\x11\x20\x95\x13\x19\x25\x05\x10\x5c\xd7\xbc\xfa\x5f\x0d\x91\x9d\xa7\x06\x94\x8f\xbe\x1f\x76\x1f\x31\x58\x46\xaa\x3b\x48\x13\xdd\x9b\xa3\xd8\x1b\x92\x04\xe5\x40\x9c\x03\x82\xb6\xeb"}, -{{0xd2,0xe0,0x1d,0x25,0x78,0xb6,0x25,0xa7,0x06,0x0a,0xab,0xc2,0x57,0x65,0xf1,0x68,0xc6,0x80,0xce,0xf7,0x67,0xaa,0x97,0xca,0x0e,0x5e,0xb3,0xd6,0x67,0x47,0x4b,0x2a,},{0x19,0x1a,0xc2,0x23,0x57,0x54,0x24,0xaa,0x35,0x4b,0x25,0x5b,0x81,0x2d,0xd3,0x02,0x5d,0x70,0xed,0x82,0x9e,0x08,0x26,0xc0,0x16,0x29,0xf9,0xdf,0x35,0x45,0x08,0x2b,},{0x87,0xa0,0x10,0x39,0x4a,0x9f,0x2c,0x90,0x4e,0xff,0xef,0xca,0x9f,0xb4,0xd5,0xce,0x13,0x79,0x33,0x01,0xa4,0x92,0x5b,0xa5,0x1d,0xb1,0x19,0x12,0x3a,0x4d,0x73,0x0a,0xbf,0x76,0x4c,0xe0,0x65,0xe4,0x8d,0x90,0xa7,0x9d,0x90,0x7d,0x72,0x54,0xc4,0x0c,0xc3,0x58,0x98,0x7a,0x46,0x94,0x9e,0x92,0x8b,0xbb,0x3c,0xd0,0x85,0xdf,0xab,0x06,},"\x20\xd5\xdd\x69\x9b\x28\x53\x30\x2a\x68\x17\x09\x4d\x5e\xa5\x12\xbd\xf8\x53\x45\x04\xcb\x28\x9c\x60\x24\x67\x41\x07\x40\xec\x7e\xb8\xea\x64\x42\xc8\x0f\x14\x59\x35\x06\x8f\x91\x22\xfd\xf4\xa3\x9f\x20\x10\xf3\x3d\xb5\x5b\x81\x4d\x97\xbf\x2e\x58\x72\x32\x9f\x11\x26\xd4\xeb\x95\xb8\x06\xca\x19\x73\x11\x31\x65\xb1\x16\xbe\x87\x16\x37\x1f\x81\x33\x17\x79\xdc\x79\xa5\xcb\x39\x42\x08\x1a\xb5\xf2\x07\xf6\xb5\x3d\xb0\xe0\x03\x81\x07\xd6\x3c\xa9\x77\x08\x18\x19\x82\xdc\xb5\xf3\xb9\x30\x10\xec\x6e\xdf\xb2\xcf\xd3\x1c\xab\x00\x09\x0b\x3c\x38\x51\x5f\x97\x81\x76\x96\x86\xcb\x17\xab\x81\xd5\x4a\x8b\x77\x57\x54\xd4\x2f\xba\xd0\x86\xb8\x0b\x28\xd6\x36\xf7\x8b\x7e\xb7\x7e\xd9\xca\x35\xb6\x84\x3a\x51\x0f\x0a\xd0\xac\x1b\x20\x26\x7a\x00\x03\x01\xb3\xc7\x07\xa2\x0f\x02\x14\xd5\x9b\x5b\x81\x99\xc2\xf9\xee\x25\xd3\x20\x60\xac\xe3\xe0\xf2\x59\x46\x50\x41\x6a\x00\x71\x6c\xd3\xf9\x86\x04\xa5\xe1\x04\xb3\x33\x10\xfd\xae\x94\xc3\x14\x01\x3c\xdc\xa5\xba\x24\x14\x40\x9e\xb7\xf1\x90\x13\x94\xf0\x07\xd6\xfa\x0a\x29\xdb\xe8\xec\x3d\xf9\x8c\x39\x3c\x8d\x72\x69\x58\x77\xcc\x9b\xaf\x49\x1e\xf3\x0e\xf7\xdb\x33\x71\x60\x8c\xa9\x7c\xc6\x21\x56\x25\x20\xee\x58\x1d\x5d\x1c\xdb\xc7\x82\x32\xd6\xc7\xe4\x39\x37\xb2\xcc\x85\x49\xe6\xf1\xe0\x8d\xf5\xf2\xea\xc8\x44\xfe\x0f\x82\x2b\x24\x83\xad\x0a\x5d\xe3\x3b\xe6\x40\x89\x49\x0e\x77\xd6\x98\x00\xfa\xe2\x58\x9e\xe5\x87\x12\xac\x15\xa3\xf1\x9e\x6f\xfd\xbc\xa4\x2f\xe1\x89\x4e\x88\x9b\x94\xc0\x4b\x04\x24\x0d\xaf\xb0\xb2\x73\x0c\x23\x6b\x8c\xce\xb2\xcb\x97\xaf\xd1\xd5\x15\xdc\x19\xd1\x06\x7f\xd4\xab\xa8\xce\x29\x7f\xd6\xd1\x10\xb3\x5a\x21\xbd\x3c\x07\x5c\x57\x7d\x93\xfe\x1d\xf7\x7d\x64\x8f\x71\x19\x49\x20\x99\xb0\x17\xaf\x44\xeb\xa0\x9c\x80\x7f\x11\xa4\xc3\xf4\xa1\x1a\x2f\xff\x30\x6a\x72\x8b\xa7\x89\x83\x32\x3c\x92\xa2\xfd\x5f\xcc\x80\xc1\x8d\x42\x34\x26\xf8\x23\xa7\x3f\xe0\x40\x94\x95\x52\x84\x29\x3f\x5f\x6b\x3c\xa4\xff\x10\x80\xdb\xb1\xe4\xc6\xf7\x4c\x1d\x93\x5e\xd2\x1e\x30\x09\x4c\x7d\xe3\x36\xb8\x2d\xd8\x20\x0b\x0d\x65\x95\x83\xc5\xbf\xd5\x47\x0f\x9d\xb3\x42\xe7\x0e\xc4\x00\x07\x42\xc5\x64\x0a\x21\x4e\x3c\x2e"}, -{{0x7c,0xd7,0xec,0x99,0xdd,0x03,0xae,0xde,0x1f,0xf1,0x07,0x3e,0xc2,0xca,0x70,0x10,0x27,0x6e,0x94,0x7e,0x2a,0xa9,0xb0,0xe6,0x5f,0x87,0x7e,0x4c,0xcf,0x1b,0x3a,0x14,},{0xe4,0xc3,0x9d,0xbe,0x94,0x93,0x17,0x6b,0x82,0x13,0xf1,0x42,0x2a,0x9d,0xe7,0xc7,0x4f,0xb6,0xa5,0x91,0x90,0xfc,0xdb,0xf6,0x37,0xc7,0xad,0x5e,0xe1,0x65,0xc0,0x4f,},{0x6f,0x99,0x20,0x27,0x70,0x96,0x45,0x35,0xe4,0x83,0xa0,0xee,0x01,0xa5,0x29,0x44,0x2e,0xb3,0x21,0x30,0x3f,0xa8,0x05,0xd4,0x75,0x60,0x4d,0x7f,0xc7,0x28,0xa9,0x10,0x3f,0xb7,0xb5,0x58,0xb9,0x55,0xf4,0xd0,0x37,0x19,0xee,0xfa,0xa3,0xb7,0xed,0x5b,0x0d,0xa7,0x57,0x10,0xbb,0x98,0x78,0x7f,0x5c,0x22,0x82,0xed,0x66,0xe9,0xf6,0x0c,},"\xa6\x03\x4a\xa3\xc2\x48\x49\x23\xe8\x0e\x90\xe5\xa8\xe1\x74\x83\x50\xb4\xf2\xc3\xc8\x31\x9f\xaf\x1a\x2e\x32\x95\x15\x0a\x68\xe1\xee\xca\x1b\xc8\x49\x54\xcc\x89\xd4\x73\x1a\x7f\x65\x12\xaf\x01\x46\x4f\xdb\xce\x5d\xf6\x8e\xe8\x06\x6a\xd9\xa2\xfd\x21\xc0\x83\x5a\x76\x55\x9c\xa1\xc7\x44\x9a\x93\x3b\xcb\x15\xaf\x90\x22\x3d\x92\x5f\xf6\x1c\xd8\x3e\xb9\x35\x69\x83\x47\xa5\x70\x72\x70\x9a\x86\xb4\xe5\xa7\xa6\x26\xe0\x7a\x3f\x2e\x7e\x34\x1c\x77\x83\xa5\x40\xf8\x4a\xa7\x3e\x91\x7e\x86\x7b\xb8\x0b\xac\xe6\x25\x47\x05\xa9\xd1\xa1\x18\x5d\xe5\x6e\x1a\x4e\x78\xaa\xf5\x39\xe7\x49\xb8\xf7\x65\xbd\x05\x2c\x4c\xd1\x5b\x63\x8b\xf8\xec\xf8\x7d\x98\x14\x60\x6f\xed\x5a\x69\xf4\xda\xe9\xda\x47\xf3\x80\x6d\xd9\x0b\xe6\x4f\xcc\xd3\x36\x5c\xbe\x9e\x01\xc5\x88\xfe\x65\xd6\xb6\x03\x28\x07\x40\x96\x2a\xa8\xdd\xb9\x5a\x3f\x4f\x67\x4c\x03\xbc\x40\x43\x09\x2c\x54\x45\x95\x56\x82\x70\xa2\xc2\xa8\xaa\x06\xe3\xf6\x7c\x31\x99\x8c\x50\xb9\xa5\x8a\xca\xd0\x06\x90\xd3\x84\x81\x14\xcb\x19\x32\x93\xc8\xac\x21\x01\x6f\xd9\x96\xf5\xc6\x42\x14\x06\x4f\x82\x16\x7b\x2c\x92\x0c\xd8\xa8\x39\x75\x58\x52\xac\x77\xc3\xd9\x05\x26\xdd\x3a\xdb\x96\x83\x7c\xf4\xe7\x26\xf3\x4b\xd0\x29\x55\xcb\xac\x5b\x82\xc9\x2c\xf4\xaa\x8b\x54\xbb\x6e\x43\x6d\xae\x9b\xf8\x93\xef\x05\x0c\x6f\x13\x5a\x7e\x62\xfc\xd8\x34\xda\xc1\xd2\xbe\x8b\x8e\x59\xd6\x96\x13\x18\x11\x70\x1c\x43\x18\xbb\x6e\x9b\x5a\x20\xbe\xc6\x56\xfd\x2b\xa1\x92\xe2\x73\x2f\x42\x29\x63\xbe\xd4\xa4\xfd\x1e\xc9\x32\x63\x98\xdc\xe2\x90\xe0\x84\x8c\x70\xea\x23\x6c\x04\xc7\xdb\xb3\xb6\x79\x21\x44\x0c\x98\xd7\x27\x53\xf6\xa3\x32\xea\xad\x59\xfd\x0f\x57\x74\x29\x23\xfb\x62\x5f\xef\x07\x0f\x34\x22\x5e\xa0\x6c\x23\x63\xd1\x23\x66\x6b\x99\xac\x7d\x5e\x55\x0d\xa1\xe4\x04\xe5\x26\xb5\xb2\x29\xcb\x13\x0b\x84\xb1\x90\x3e\x43\x1c\xdb\x15\xb3\x37\x70\xf5\x81\x1d\x49\xfb\xd5\x0d\x60\xa3\x47\x4c\x0c\x35\xfc\x02\x1d\x86\x81\x81\x9e\xc7\x94\xcc\x32\xa6\x34\xbc\x46\xa9\x55\xaa\x02\x46\xb4\xff\x11\x24\x62\x3c\xba\xfb\x3c\xb9\xd3\xb9\x2a\x90\xfd\xe6\x48\xe4\x14\x63\x61\x92\x95\x2a\x92\x29\x1e\x5f\x86\xef\xdd\xb8\x9c\xa0\x78\xae\xa7\x71\x7f\xc7"}, -{{0xe3,0xca,0x37,0x13,0xa2,0xfd,0x41,0x2a,0xd5,0x33,0x6b,0xc3,0x56,0xb7,0x7b,0xe0,0x27,0xd5,0xb7,0x08,0x15,0xb3,0xac,0x2a,0xec,0xd8,0x34,0x0e,0xf5,0xf8,0x89,0xb1,},{0x1d,0x51,0x6c,0xb8,0xbe,0xf1,0x16,0xa0,0xc1,0xb6,0x92,0x90,0x09,0x93,0x3f,0x6e,0xb6,0x2c,0x23,0x05,0x07,0x45,0xfe,0x7e,0x8d,0x3c,0x63,0x16,0x23,0x77,0x81,0x11,},{0xb3,0x85,0x7e,0xa6,0x1b,0xaa,0x9e,0x62,0x83,0x8c,0x4e,0x3a,0x99,0x65,0x02,0xd3,0x36,0x4f,0xe1,0xec,0x59,0x42,0x58,0x35,0x50,0x73,0xdd,0x10,0xe4,0x97,0xc6,0x00,0xbe,0xfb,0x1f,0x8f,0x23,0x3f,0xd6,0xe3,0xb2,0xc8,0x7f,0x10,0xdc,0xb7,0x26,0x1a,0xaf,0x34,0x81,0xbf,0xd0,0x90,0x26,0x05,0xac,0xcc,0x90,0x0f,0xef,0x84,0xd4,0x07,},"\xdd\x99\xba\xf2\x95\xe0\x13\xee\xd1\x07\xba\x8a\xf8\x11\x21\xaa\xf1\x83\x5a\x3c\xca\x24\xf8\xe4\x64\xb4\xcf\xca\xa3\xc7\xbf\xfe\x6f\x95\x36\x01\x6d\x1c\x8c\xf3\x75\x03\x8c\x93\x27\xe8\xe2\x1b\x00\x40\x66\xf5\xea\xc0\xf7\x6a\x3e\x8e\xdf\xb0\x7b\xe8\xbd\x2f\x6b\xc7\x9c\x3b\x45\x6d\xe8\x25\x95\xe2\xc2\x10\x5b\xb1\xb0\xaa\xba\x5e\xee\xe1\xad\xef\x75\x21\x67\xd6\x33\xb3\x22\xeb\xf8\xf7\xcd\x5f\xbf\x59\x50\x8f\xdb\xdb\xec\xf2\x5e\x65\x7a\x9c\x70\x50\xaf\x26\xa8\x0a\x08\x5b\x08\x17\xc6\x21\x7e\x39\xac\xd5\x4c\xb9\xfa\x09\x54\x0f\xc7\xbd\xc5\x22\x6d\x6a\x27\x6d\x49\x2c\xc8\xa3\xdf\xfc\x2a\xbc\x6d\x0b\x9f\xb0\x8c\xbc\xcd\xd9\x43\x2e\x44\x98\x21\xa5\xdc\x98\xcf\xb3\xa4\x18\xe5\x39\xc8\x90\xfe\x5a\x04\x46\xb9\xf8\x1d\x30\x67\x00\x92\x7a\xde\x61\xcf\xdc\xc0\x62\x4f\x13\xb5\x84\x07\x48\x77\x46\x04\x80\x57\x31\xd9\x2e\x77\xd5\xde\xf6\x6b\xe4\x4c\xc8\x17\x94\x6f\x1c\xd7\x58\x19\x6c\xf4\x80\xf9\x9e\x71\x17\x83\x5c\x4c\x87\xcb\xd6\x40\x77\xa5\x62\xa8\x0c\xf1\x1d\x8c\xa6\x5b\xe7\xa9\x4d\x92\xb9\xdd\xae\xa9\x97\xe9\x3f\x14\x48\x57\x7e\xd6\xd8\x43\x6b\x2f\x31\x44\x69\x2c\x1f\xd7\xd2\x8a\x03\xe9\x27\x4b\xc9\xe8\x66\x9d\x85\x75\xf5\xde\x20\xcf\xbd\xbc\xb0\x4e\x9f\x39\xf3\x45\x1d\x70\x48\x37\x5e\x26\x98\xe7\x22\x84\x6c\xb4\xf2\xd1\x9a\x81\x0c\x53\xd4\xc1\xa6\xc3\xb7\x70\xfb\x40\x2d\xf0\x53\x0e\x7b\x29\x07\x22\x3f\xd0\x89\x9e\x00\xcb\x18\x8c\xa8\x0c\x15\x31\xb4\xe3\x7f\xba\x17\x6c\x17\xa2\xb8\xf5\xa3\xdd\xc7\xa9\x18\x8d\x48\xff\xc2\xb2\x72\xc3\xda\x9c\x9b\x89\xdf\xe5\x3f\x2f\xe7\xe3\x67\x2f\x91\xd1\x18\x18\x49\x1a\xce\x14\x0a\xdc\xae\x98\x50\x2e\x11\x4f\x4b\x35\x2b\x90\xe2\xe7\xfb\xd3\x33\xb2\x45\x9e\x7f\x15\xdd\x07\x64\xc9\xc3\x4e\x4c\xb7\xcc\x09\x55\x00\xcd\xa0\x35\xe8\xe2\xe4\xe3\xc8\xfd\x5d\xf5\xf3\xaa\x57\x9a\x73\x5d\xd8\xa9\xf1\x9e\xf3\x36\xfa\x97\x11\x14\xe4\x66\x18\x73\x4a\x4c\x13\xd3\x0c\x81\x12\x8c\xa2\x1d\xef\x47\x33\x01\x03\xd2\x3d\x80\xff\xe6\x74\x21\xa6\xcc\xf9\xf3\x6a\x93\xf0\x56\x03\xc5\x99\xee\x10\xb0\x34\x51\xf3\x6b\x21\x33\xc1\x87\xa7\x9a\xd9\xe6\xfd\xfb\xb1\x25\x95\xab\x73\xbb\x3e\x2e\x2e\x43\x03\x0f\xd3\x7e\x59\x1c\xf5\x5d"}, -{{0x29,0xa6,0x3d,0xcd,0x48,0xa3,0x51,0x77,0x14,0x11,0xfd,0xdc,0xab,0x46,0xbb,0x07,0x1e,0x91,0x49,0x85,0x76,0xe8,0xd0,0x2f,0x8b,0x60,0x44,0xf5,0xbd,0xd3,0xed,0x90,},{0x39,0x23,0xfd,0xcc,0x2a,0x9f,0xe5,0xca,0xbf,0x6e,0x99,0x32,0xe4,0x6d,0xbd,0x2b,0x7f,0x36,0x32,0x50,0x0f,0x9d,0x95,0x55,0x2d,0xb2,0xb0,0x45,0xbc,0x41,0x16,0x6f,},{0x12,0xbf,0x62,0x95,0x93,0xe2,0xca,0xad,0xc9,0x10,0xec,0x40,0xbf,0xe2,0xb7,0xa6,0x25,0x14,0x12,0x6b,0x16,0xba,0x3a,0x43,0x8d,0x88,0xe2,0xd2,0x1f,0x59,0x5a,0xae,0xe8,0xab,0xfa,0x4a,0xf2,0xec,0x87,0x03,0x61,0xd0,0xea,0x04,0xdf,0xc8,0xc6,0xa3,0x30,0xfb,0x28,0x41,0xc2,0xd8,0x21,0x1a,0x64,0xfa,0x1e,0x7e,0x7d,0x27,0x38,0x00,},"\xff\x18\xca\x0c\x20\x4c\x83\x86\xa4\xaa\x74\xec\x45\x73\xc7\xb6\x92\x16\xb3\x14\x70\xda\xed\xd9\x6a\x4f\x23\x02\x11\x6c\x79\x55\xd7\x2d\xac\xc8\x8e\x37\x14\x55\x0c\x09\xe6\xf7\xb9\xa8\x58\x62\x60\xdc\x7e\x63\xda\x4c\x63\x3b\xae\x01\x62\xe1\x16\xe5\xc1\x79\x7b\x78\xd8\x7d\x47\xff\xee\xa3\xd7\x81\x9d\xf9\xc8\x52\xf0\xff\x30\x93\x6a\x10\x5d\x3a\xf5\x53\x1a\x8f\x89\x54\x97\x11\xc1\x4c\x2d\x3e\xe1\x15\x64\xe7\xc8\x52\x5b\xd5\x88\x64\x00\x97\x62\xa0\x55\x41\xd8\xe0\x7a\xd8\x41\xa5\x5a\x6a\x9a\x00\x7e\xf2\x09\xcc\xec\x4b\x56\x40\xba\xbe\x35\x65\x1b\x61\xdf\x42\xde\x4d\x91\x0e\xe7\x3a\x93\x3c\x0b\x74\xe9\x95\x75\x7e\x84\xa9\x9e\xb0\x34\xf4\x18\x07\x18\x3c\x90\xca\x4e\xa8\xd8\x4c\xdb\xa4\x78\x61\x3c\x8e\x58\x7c\xb5\xf8\xfb\x6a\x05\x50\x81\xda\x6e\x90\x22\x0d\x5d\x86\xe3\x4e\x5f\x91\xe4\x88\xbd\x12\xc7\xa1\xa6\xb3\xc9\xfc\xe5\x30\x5e\x85\x34\x66\x58\xef\xfa\x81\x0d\x0e\x8a\x2a\x03\x9d\xb4\xa4\xc9\x49\x65\xbe\x40\x11\xf9\xd5\xe5\xda\x26\x62\x33\xe6\xc4\xe1\x8e\xd4\xf8\xa2\x5a\x57\xe4\x0a\x59\x1c\x7e\xd5\x90\xc0\xf8\xb1\xa1\x19\xc7\xc9\x74\x7f\x69\x1b\x02\x19\x6c\xd1\x8e\x69\x45\x21\x3f\x1d\x4c\x8c\x95\x79\xc6\xe0\xa2\xac\x45\x92\x41\x28\xd6\xd9\x2c\x8e\x4c\x66\x06\x53\x20\x35\x3d\x48\xd1\xd5\xe1\x31\x94\xd9\x05\xf8\x37\x07\x8f\x8d\xac\x0b\x68\xcf\x96\xae\x9e\x70\x55\x4c\x14\xb2\xfa\x29\xb1\x96\x30\xe4\xb0\xf5\xd2\xa7\x67\xe1\x90\xef\xbc\x59\x92\xc7\x09\xdc\xc9\x9a\xa0\xb5\xaa\xf4\xc4\x9d\x55\x13\xe1\x74\xfd\x60\x42\x36\xb0\x5b\x48\xfc\xfb\x55\xc9\xaf\x10\x59\x69\x27\xbc\xfa\xd3\x0b\xac\xc9\x9b\x2e\x02\x61\xf9\x7c\xf2\x97\xc1\x77\xf1\x92\x9d\xa1\xf6\x8d\xb9\xf9\x9a\xc6\x2f\xf2\xde\x3b\xb4\x0b\x18\x6a\xa7\xe8\xc5\xd6\x12\x39\x80\xd7\x59\x92\x7a\x3a\x07\xaa\x20\x8b\xee\xb7\x36\x79\x5a\xe5\xb8\x49\xd5\xda\xe5\xe3\x57\x37\x10\xaa\xa2\x4e\x96\xd5\x79\x1e\x27\x30\xd0\x27\x0f\x5b\x0a\x27\x05\xba\x51\x5d\x14\xaa\x7e\x6f\xa6\x62\x23\x75\x37\x7f\x9a\xba\x64\xd0\x25\x69\xa2\x09\xd3\x3d\xe6\x86\xe0\x89\xec\x60\x11\x8e\x48\x14\xff\xc6\xc0\x77\x8c\x64\x27\xbc\xe2\xb6\xb8\x44\xcf\xcd\x5a\x7c\xed\x0e\x35\x30\x3f\x50\xa0\xdf\xe5\xdf\x5d\xde\x1a\x2f\x23"}, -{{0xc7,0x18,0x8f,0xdd,0x80,0xf4,0xcd,0x31,0x83,0x9e,0xc9,0x58,0x67,0x1e,0x6d,0xd0,0x8b,0x21,0xf9,0xd7,0x52,0x8c,0x91,0x59,0x14,0x37,0x34,0xf9,0x4b,0x16,0x98,0x83,},{0x01,0x97,0x52,0xff,0x82,0x9b,0x68,0x59,0xb9,0x05,0x8d,0x00,0xc2,0x79,0x5e,0x83,0x56,0x55,0x44,0x06,0x75,0x75,0x3f,0x37,0xe8,0x5e,0xb7,0xbc,0x58,0x39,0xc4,0xca,},{0x35,0xc1,0x70,0xdd,0x0c,0x6d,0xc2,0x92,0x0a,0x59,0x57,0x75,0xd8,0xe2,0xdd,0x65,0x24,0x3e,0x9c,0x1b,0xf9,0x6e,0xf4,0x27,0x79,0x00,0x1e,0xd4,0x5f,0x01,0xb7,0xdf,0xeb,0xd6,0xf6,0xa7,0xdc,0x2d,0x38,0x6e,0xf4,0xd2,0xa5,0x67,0x79,0xeb,0xe7,0x7f,0x54,0xe5,0xae,0xcf,0xda,0x2d,0x54,0xa0,0x68,0x47,0x6b,0x24,0xdb,0xd7,0x8b,0x0c,},"\x4a\xf5\xdf\xe3\xfe\xaa\xbe\x7f\x8f\xcd\x38\x30\x8e\x0b\xd3\x85\xca\xd3\x81\x1c\xbd\xc7\x9c\x94\x4e\xbf\xe3\xcd\x67\x5c\xf3\xaf\xbe\xf4\x54\x2f\x54\x29\x75\xc2\xe2\xa6\xe6\x6e\x26\xb3\x2a\xc3\xd7\xe1\x9e\xf7\x4c\x39\xfa\x2a\x61\xc5\x68\x41\xc2\xd8\x21\x2e\x2b\xd7\xfb\x49\xcf\xb2\x5c\xc3\x60\x9a\x69\x3a\x6f\x2b\x9d\x4e\x22\xe2\x09\x9f\x80\xb7\x77\xd3\xd0\x5f\x33\xba\x7d\xb3\xc5\xab\x55\x76\x6c\xeb\x1a\x13\x22\xaf\x72\x6c\x56\x55\x16\xce\x56\x63\x29\xb9\x8f\xc5\xdc\x4c\xbd\x93\xce\xfb\x62\x76\x88\xc9\x77\xaf\x93\x67\xb5\xc6\x96\x59\xe4\x3c\xb7\xee\x75\x47\x11\xd6\x65\xc0\x03\x2a\xe2\x29\x34\xf4\x4c\x71\xd3\x11\x78\xef\x3d\x98\x10\x91\x28\x74\xb6\x2f\xa5\xe4\x02\x0e\x6d\x5d\x64\x58\x18\x37\x32\xc1\x9e\x2e\x89\x68\x5e\x04\x64\xe9\x1a\x9b\x1c\x8d\x52\x51\xe2\x4e\x5f\x91\x81\x3f\x50\x19\xa7\x40\xa0\x4b\x5d\x91\xcb\xb8\x30\x9e\x51\x61\xbb\xa7\x9d\xca\xb3\x82\x39\xa0\x91\xf5\x0e\x09\x9f\xf8\x19\xe3\xa7\xb5\x20\x5f\xe9\x07\xcd\xfe\x9c\x0d\xc3\xee\x85\xe3\x2d\x7b\xcd\x3c\xe0\x26\x35\xe2\x05\x83\x88\x03\x1e\x31\x7f\xbf\x22\xab\x9f\x39\xf7\xf7\xe3\xcd\x1a\x11\xa9\xc1\xf4\x5f\x4e\x1e\x42\xd2\x53\x6c\x12\x2c\x59\x18\x37\x91\x18\x47\x10\x8c\xea\xfd\x99\x08\x13\xc2\xb6\x34\x4c\xff\xc3\x4b\xe3\x71\x61\xdd\x81\x56\x26\x90\x0e\x8f\xcb\x85\xc2\x1a\xfb\x4f\x6b\xe8\xad\x01\x51\x6a\x31\xc2\xa6\x58\x03\x15\x85\x7c\x6a\x21\x67\x35\xca\x99\x10\x09\xdb\xc2\xea\x50\x34\x16\x07\x47\xa8\x69\xd5\xca\xdb\x0b\x47\xff\xbd\x5d\x3a\xc9\x7f\xdd\x05\x26\xca\xe6\xea\xa3\x5c\xff\x7a\x16\xea\xf4\xfb\x95\x0c\xa3\x15\x11\x34\x6f\xea\x61\x41\x99\x9a\x3f\x75\x4e\x62\x81\xcf\xba\x15\xe8\xa8\x26\x93\x2c\x58\x9c\x5d\x24\x7c\x90\x9d\x94\xb4\xea\xb7\xeb\xcb\x09\x07\x76\x48\xaf\x06\x5c\x2d\x86\x61\x1e\xb5\x88\x45\x3e\xd7\xc2\x47\x80\xd7\x3c\x68\x9c\x87\x44\xaf\xd5\x33\xa8\x6d\x9e\xe9\xe3\x36\x57\x32\xcb\xd0\xc3\x51\xe4\x36\xf8\x98\xb7\x04\x32\x92\x09\x7e\x03\xe6\x08\x1a\x23\xac\x86\x5e\x19\xdc\x88\x58\x96\x9b\x99\x9d\x01\xfa\x65\xef\x20\x0c\x3f\x26\x9c\x81\x8e\x30\xb9\x36\x5e\xcc\x68\x3b\xcf\xe6\x9c\x20\x3b\x4e\x0a\xb6\xfe\x0b\xb8\x71\xe8\xec\xaa\xae\x82\xd3\xac\xd3\x5d\x5b\x50"}, -{{0x38,0xba,0x06,0x21,0x70,0x4d,0x21,0x55,0xfc,0x2f,0x78,0x55,0x51,0x96,0x57,0x5d,0xe0,0x6d,0x80,0x25,0x5c,0x35,0xe9,0xdc,0x96,0x5b,0x6f,0xe9,0x6a,0x4d,0x53,0x89,},{0x43,0x88,0xf7,0xf6,0x8a,0x9e,0xff,0xbc,0x36,0x6e,0x42,0xd9,0x07,0x01,0x56,0x04,0xda,0xce,0xd1,0x72,0x7c,0xd1,0xd8,0x9d,0x74,0xad,0xcc,0x78,0x9f,0xd7,0xe6,0xe1,},{0x42,0xbe,0xd6,0xa9,0x87,0x86,0xf6,0x64,0x71,0x5f,0x39,0xbb,0x64,0x3c,0x40,0x5a,0xe1,0x75,0x00,0x56,0x46,0x0e,0x70,0x04,0x69,0xc8,0x10,0x38,0x95,0x04,0xc5,0x1c,0xff,0xd9,0xe1,0xa9,0x4c,0x38,0xf6,0x92,0xfb,0x31,0x62,0x65,0x31,0x6d,0x8f,0x4d,0xc3,0xad,0x1c,0xdd,0x8a,0x6d,0x59,0x91,0xef,0x01,0x0c,0xd1,0x48,0x9d,0x7c,0x09,},"\xed\x4c\x26\x83\xd6\x44\xb0\x5b\x39\xb0\x48\xef\x1f\x8b\x70\x25\xf2\x80\xca\x7e\x8f\xf7\x2c\xb7\xed\xa9\x93\x29\xfb\x79\x54\xb7\x00\x40\x07\x05\x27\x5f\x20\xb8\x58\xcf\x7e\x34\x9a\x35\x10\x66\x5b\x63\x06\x09\xc5\xe2\xe6\x20\x69\x26\x3a\xb9\xc5\x5e\x41\x23\xa5\x64\xdc\xa6\x34\x8c\x8a\x01\x33\x20\x75\xe7\xa5\xbe\xc9\xc2\x0a\x03\x80\x79\x57\xfe\xfa\x91\x0e\x60\xc3\x5a\xe5\x79\x77\x8c\xe2\xce\x42\xe6\xa6\x9a\x1b\x64\x76\x81\xe4\x3e\xc4\xb6\x3b\xd5\xfb\xef\xab\xb3\x17\x12\xcb\x3d\x64\x19\xea\xd7\x8d\xd4\x1c\x8a\x92\xaa\xce\xb6\x3c\xbf\xa8\x9d\x2a\xf3\x96\x06\xde\x01\x0a\x39\x7e\x30\x20\x53\xa6\x15\xc1\x6e\x5e\x95\xad\x99\x35\xc0\x79\xa0\xb8\x10\x31\x25\x78\x94\x71\xa1\xe3\x57\x4f\x42\x9b\x29\xe4\xd2\x25\xc7\x72\x3f\xbb\x3c\xf8\x8c\xbd\x73\x82\x3d\x9f\x0b\x6c\x7d\x05\xd0\x0b\xde\xb0\xfb\x0a\xd3\xd7\x13\x20\x33\x18\x3e\x21\xf6\xc1\xe8\xd8\xe4\xc0\xa3\xe4\xf5\x2f\x50\x01\xda\x68\x71\x71\x34\x5c\x6d\xc8\xb4\x2c\x42\xa6\x0d\x1f\x1f\xfa\x8f\xe3\xe7\xbc\xec\xe5\x9a\x03\x58\x78\xf9\xd4\xd8\x11\x27\xe2\x24\x96\xa4\x9b\xfc\xf6\xbf\x8b\x46\xa8\x0b\xd5\x62\xe6\x52\x55\x07\x1f\x9d\x11\xa9\xeb\x04\x81\xf4\x62\x6d\x4d\x71\xff\xc3\x8a\xfe\x6e\x35\x8a\x4b\x28\x91\x79\xcb\xce\x97\x64\xd8\x6b\x57\xac\x0a\x0c\x82\x7e\x8f\xf0\x78\x81\x33\x06\xa1\xd5\xfa\xdd\x32\xb4\x6a\x1f\xbc\xd7\x89\xff\x87\x54\x06\x3e\xec\xfe\x45\x31\x3b\xeb\x66\x01\xc3\xa3\x01\x0e\x8e\xb9\x7c\x8e\xff\xbd\x14\x0f\x1e\x68\x83\x11\x09\x2d\x27\x3c\x4d\xef\xca\x47\xda\x6f\x1f\x08\x25\x74\x46\x76\xf9\xa2\x80\xb6\xc2\xa8\x14\xfa\x47\xfa\xbc\x19\x80\xd0\xb3\x7f\x08\x7a\x53\xca\x87\x78\xf3\x9f\xfb\x47\x4f\xf5\xf1\x17\x1b\x44\x2c\x76\xdd\x00\x8d\x92\x18\x2f\x64\x4a\x71\x4a\x0f\x01\x1e\x21\x5a\x78\xb9\x7a\xf3\x7b\x33\x52\x0e\xbf\x43\x37\x2a\x5a\xb0\xcf\x70\xdc\xc1\xdc\x2f\x99\xd9\xe4\x43\x66\x58\xf8\xe0\x7c\xdf\x0b\x9e\xa4\xdd\x62\x24\xc2\x09\xe7\x52\x1b\x98\x1e\xe3\x51\xc3\xc2\xdf\x3a\x50\x04\x05\x27\xfc\xd7\x28\x04\x17\x60\x46\x40\x5d\xb7\xf6\x73\x4e\x85\xc5\xd3\x90\xf5\x20\xb0\xc0\x8d\xcb\xfa\x98\xb8\x74\x24\x80\xd5\xe4\x6f\x9b\xe8\x93\xf6\xd6\x61\x43\x40\xf8\x16\x16\x11\xd5\x05\x3d\xf4\x1c\xe4"}, -{{0xae,0x33,0x1f,0xc2,0xa1,0x47,0x59,0xb7,0x3f,0x1c,0xd9,0x65,0xe4,0x85,0x14,0xe1,0x2b,0x29,0xf6,0x3b,0x06,0xcc,0xfc,0x0a,0xd4,0x9f,0x36,0x82,0x0e,0x57,0xec,0x72,},{0x08,0x80,0x3d,0x48,0x23,0x8e,0xda,0x3f,0x9c,0xeb,0xb6,0x28,0x53,0x01,0x21,0xde,0x00,0xf0,0xf0,0x46,0x8c,0x20,0x2d,0x88,0x52,0x8b,0x8b,0xce,0xc6,0x87,0xa9,0x03,},{0x75,0xf7,0x39,0x08,0x88,0x77,0xe0,0x6d,0xc5,0x6d,0xae,0xc8,0xf1,0xe4,0xd2,0x11,0xb7,0x54,0xe3,0xc3,0xed,0xbf,0xa7,0xed,0xa4,0x44,0xf1,0x8c,0x49,0xb6,0x9c,0x5a,0x14,0x2d,0xb4,0x5a,0x0a,0x76,0x50,0xe4,0x7d,0x10,0x55,0x0b,0xa6,0x81,0xff,0x45,0xdd,0x44,0x63,0xc4,0xac,0x48,0xbf,0x44,0xb7,0x30,0x34,0xbd,0x56,0x59,0x22,0x0e,},"\x57\x16\x00\x33\x90\xe4\xf5\x21\x65\x98\xa0\x3d\x7c\x43\x0d\xbf\x49\x5e\xe3\xa7\x55\x7b\x58\x06\x32\xba\x59\xf1\x51\x98\xb6\x18\x0a\x42\x46\x9c\x23\x7d\xb5\xbc\x81\xf2\x9c\xfa\xab\x0a\xff\x3c\x99\x66\x30\x9a\xb0\x69\x58\xc9\xd7\x12\x6a\xdd\x78\xe3\xb3\x24\x59\xff\x8a\x0e\x0b\xde\xf8\x74\xb5\x8e\x60\x83\x66\x8f\x38\xad\x7d\x63\xaa\xe1\xf1\x2e\x26\xa6\x13\x34\x8f\x9f\x03\xea\x5d\x20\x5f\x04\x5d\x78\xcc\x89\x02\xd4\x7f\x81\xe8\xb5\x22\x93\xe7\x0e\x86\xc9\x80\x3d\x4d\xac\xea\x86\xc3\xb6\x74\x58\xae\x35\x79\xbc\x11\x11\x3b\x54\x90\xbc\xf3\xe1\xcd\x4e\x79\x79\xc2\x64\xd8\x35\x16\x1f\xd5\x5e\xfe\x95\x3b\x4c\x26\x39\x5d\xd9\x2c\xa4\x93\x09\x20\xe9\x04\xfa\xdc\x08\x89\xbb\x78\x22\xb1\xdf\xc4\x45\x26\x04\x84\x0d\xf0\x24\xdb\x08\x21\xd2\xd5\xe9\x67\x85\xa5\xc3\x7d\xbf\xd2\xc3\x75\x98\x32\x83\xe9\xb5\xb4\x3a\x32\x07\xa6\xa9\xb8\x33\x94\x83\x29\xd5\xde\x41\xe4\x50\x08\xbc\xba\xd4\x93\xde\x57\x54\xdd\x83\xde\xcc\x44\x0e\x51\x66\xed\xaa\xe0\x20\x8f\x00\x0c\x5f\x6d\x9c\x37\x21\x53\x20\x9e\x5b\x75\x78\x11\x6f\x89\xcf\x2f\x8b\x10\x04\xd1\x30\x7e\xa7\x9e\xd3\x74\x80\xf3\x19\x4a\x7e\x17\x98\x3a\x23\x04\x65\xcc\xc3\x0f\xcc\x1a\x62\xd2\x80\xfb\xba\xcc\xf0\x06\xdc\x4d\xee\x0e\xa7\x96\xb8\x1a\xcc\xc6\x1a\x06\x3e\x2c\x08\x3d\xae\xc0\x39\xbd\x9a\x64\xa7\x70\x24\xaf\x82\xec\x1b\x08\x98\xa3\x15\x43\x29\xfd\xf6\x16\x73\xc3\x6e\x4c\xc8\x1f\x7a\x41\x26\xe5\x62\x90\xe4\xb4\x56\x81\x9b\xde\xbf\x48\xcb\x5a\x40\x95\x5b\xab\x29\x7c\x2b\xbc\xb0\x18\xad\xbf\x24\x82\x86\x60\xa5\xd1\x2a\x06\x13\xbf\x3c\xcb\x5e\xeb\x9a\x17\xfb\x0a\x05\x47\xdb\x8d\xa2\x4d\x2e\xfb\x87\xba\x1b\x84\x31\x42\xa7\x5e\x4c\xa0\xb0\xa3\x33\xe4\xa1\x4f\xab\x35\xa6\x26\x69\x32\x9c\xa8\x75\x3f\x01\x6a\xc7\x0c\xd9\x97\xe8\xbc\x19\xee\x44\x8a\xea\xf0\xf4\xbf\x3c\xe5\x23\x05\x50\x57\x8a\xb6\x4c\x19\x01\x94\x46\xce\x2d\x9c\x01\xa0\x3d\x88\x9a\x99\x09\x86\x0a\xef\x76\xf0\x67\xc5\x0b\x61\xc3\xd0\xf1\x2c\xc8\x68\x6f\x5c\x31\xbf\x03\x2a\x84\x10\x15\xcf\xef\xf1\xcf\xda\xe9\x4f\x6b\x21\xda\xe9\x41\xb3\x35\xdc\x82\x1f\x32\x84\xce\x31\x50\x8f\x5d\xb5\xc4\x48\xff\xaa\x37\x73\xe9\xbe\x1a\x4c\x85\xa1\xc5\x8b\x00\x9f\xa3"}, -{{0x82,0x43,0x5f,0x39,0x79,0x01,0x06,0xb3,0xaf,0x72,0xf9,0x1f,0x14,0xc9,0x28,0xd2,0x46,0x5f,0x98,0xcd,0xd1,0x00,0x84,0xc4,0xa4,0x4d,0x19,0xaf,0x71,0xa1,0x92,0x7c,},{0xc5,0x2a,0x92,0x64,0x6f,0x5a,0xdb,0x21,0xc6,0xdd,0xe0,0xde,0x58,0x78,0x68,0x37,0xf8,0xa3,0x41,0x4c,0x09,0xae,0xdf,0xc2,0x7c,0x81,0x22,0x18,0xa7,0xe7,0x23,0x9e,},{0x1d,0xaa,0x44,0xef,0x06,0xd4,0xc1,0x0d,0xdb,0x48,0x67,0x84,0x23,0xc5,0xf1,0x03,0xa1,0xb5,0x68,0xd4,0x2b,0x20,0xcc,0x64,0xaf,0x11,0x0f,0xce,0x9d,0x76,0x79,0xa2,0xde,0xe4,0x12,0xb4,0x98,0x05,0x85,0xc2,0x6c,0x32,0x0d,0xba,0xa6,0x01,0xc4,0x72,0xde,0xfc,0x3c,0x85,0x41,0x5d,0xae,0xcd,0xd6,0xd2,0xd9,0xea,0xca,0xc8,0x5e,0x07,},"\xf3\xd6\xc4\x6a\xc5\x24\x8d\x53\x86\xb6\xb6\x84\x62\x59\x7d\x64\x70\x39\xf5\x44\xbb\x01\xac\x2d\x10\x67\xda\xaa\xa3\x97\xd2\xdb\xaf\x12\x5a\x1c\xf8\xfd\xf2\x80\xa6\xaf\xec\x32\x4d\x53\x11\xf5\x43\x68\x8a\x15\x6c\x84\x98\x19\xbb\x04\x6b\x91\x1c\x42\xea\x3c\xa0\x1b\x99\x80\x8c\x4d\x1f\x3b\x8b\x15\xda\x3e\xfe\x2f\x32\x52\x3e\xc3\xb0\x9c\x84\xb4\x8c\xff\xd1\x3c\x17\xc9\xe2\x6c\x91\x2d\x9c\x3e\x93\x46\xdf\xae\x3f\xd0\xc5\x6c\x88\x58\x78\x07\x82\xf6\x1a\x4c\x4d\xbf\xff\x1e\x9c\xb4\xb3\x62\xcd\x80\x01\xf9\xcd\xfe\xb1\xa7\x20\x82\xdc\xe9\xc9\xad\xe5\x2e\xff\xc9\x74\x46\x88\xac\x0b\x86\xc8\x82\x66\xb5\x3d\x89\x5c\x17\xea\xd9\xe8\x9e\xd8\xd2\x4d\x40\x64\x2f\x3a\xd3\xb9\xbf\x9b\xbc\x4d\xda\x79\x66\xef\x83\x28\x28\x9f\xb3\x1e\x17\xc8\x1f\xd0\x28\xef\x1b\xd9\xa1\xd4\xc7\x92\xe8\x6e\xc2\xdb\xdc\xe3\xf9\x37\xee\xcc\x3e\xeb\x51\x88\xd3\x25\x94\x19\x19\xbb\xf7\x5b\x43\x88\xe2\x39\x95\x07\xa3\xd7\xfb\x38\x75\x02\xa9\x5f\x42\x1c\x85\x82\x6c\x1c\x91\x76\xc9\x23\xe3\x16\x31\x0a\x4b\xa4\x5c\x8a\x5e\xf7\x55\x7c\xf8\x7b\x77\x02\x0b\x24\xf5\xba\x2b\xfd\x12\x28\x10\x95\x66\x30\x7f\xea\x65\xec\x01\x50\x19\x69\x12\x17\xbc\xe6\x9a\xee\x16\xf7\x62\x49\xc5\x8b\xb3\xe5\x21\x71\xcf\xef\xd5\x25\x4e\x5e\x0f\x39\x71\x69\x18\x6d\xc7\xcd\x9c\x1a\x85\xc8\x10\x34\xe0\x37\x18\x3d\x6e\xa2\x2a\xee\x8b\xb7\x47\x20\xd3\x4a\xc7\xa5\xaf\x1e\x92\xfb\x81\x85\xac\xe0\x1d\x9b\xf0\xf0\xf9\x00\x61\x01\xfc\xfa\xc8\xbb\xad\x17\x1b\x43\x70\x36\xef\x16\xcd\xae\x18\x81\xfc\x32\x55\xca\x35\x9b\xba\x1e\x94\xf7\x9f\x64\x55\x55\x95\x0c\x47\x83\xba\xb0\xa9\x44\xf7\xde\x8d\xf6\x92\x58\xb6\xaf\xe2\xb5\x93\x22\x17\x19\x5d\xa2\x45\xfe\xe1\x2a\xc3\x43\x82\x4a\x0b\x64\x03\xdf\xe4\x62\xd4\x3d\x28\x8d\xb3\x1f\x99\x09\x7e\xc3\xed\xc6\xe7\x65\x47\xa3\x74\x2f\x03\xc7\x77\xef\xb1\x58\xf5\x8d\x40\x53\xfa\x6c\xc8\xd6\x8b\x19\x6a\xf4\xf9\xde\x51\x6f\xd9\xfb\x7a\x6d\x5d\x9e\xe4\xa8\x9f\x9b\x9b\xce\x1e\x4d\xee\x35\x7a\x1e\x52\xc0\x54\x4c\xfb\x35\xb7\x09\x2d\x1a\xa5\xa6\xf7\xf4\xc7\x60\x26\x10\xe9\xc0\x0e\xf5\xb8\x76\x1b\xc7\x22\x79\xba\x22\x8a\x18\xb8\x40\x0b\xd7\x6d\x5b\x2b\xfd\x7c\x3c\x04\xaa\xc4\x43\x6d\xae\x2e\x98"}, -{{0x1b,0xea,0x77,0x26,0xd9,0x12,0xc5,0x5e,0xc7,0x8b,0x0c,0x16,0x1a,0x1a,0xd3,0xc9,0xdd,0x7b,0xc3,0x29,0xf8,0x5d,0x26,0xf6,0x2b,0x92,0xe3,0x1d,0x16,0xd8,0x3b,0x48,},{0xc9,0xdd,0xb4,0x21,0x06,0xcc,0xef,0x4e,0x0e,0xf4,0x79,0x45,0x51,0xd2,0x1d,0xf9,0x4a,0x63,0x06,0x87,0x2f,0x23,0x16,0x63,0xe4,0x7e,0x24,0x1f,0x77,0xcc,0x3e,0x82,},{0xf9,0xb0,0x45,0x17,0xbd,0x4f,0xd8,0xef,0x90,0xf2,0x14,0x0f,0xc9,0x5d,0xc1,0x66,0x20,0xd1,0x60,0x2a,0xb3,0x6c,0x9b,0x16,0x5f,0xff,0x3a,0xba,0x97,0x8d,0x59,0x76,0x71,0x10,0xbb,0x4e,0x07,0xa4,0x8f,0x45,0x12,0x14,0x47,0xac,0x0c,0x1a,0xba,0xc5,0x85,0xd3,0x91,0xd4,0x04,0x20,0x41,0x89,0x86,0x28,0xa2,0xd2,0xdc,0xc2,0x51,0x0d,},"\xb1\x12\x83\xb1\xf0\xce\x54\x9e\x58\x04\x73\x0a\xc3\x20\x7a\xc0\x03\x32\xd2\xaa\xcf\x9c\x31\x0d\x38\x32\xd8\x79\xf9\x63\x4b\xd8\xa5\x8a\xdf\x19\x9e\x4b\x86\x3b\xb1\x74\x81\xd2\x8a\xcb\x2d\xa0\xe1\x55\x7b\x83\x36\xa4\x00\xf6\x29\x56\x25\x03\x1d\x09\xe4\xdf\x4d\x31\x9b\xbc\x1e\x8f\x6e\x92\x32\xd2\x30\x53\xbb\x3f\xfa\xc4\xfe\x2c\x70\xce\x30\x77\xfc\x00\x60\xa5\xcb\x46\x92\xa1\xcf\x0b\x3e\x62\xfe\x45\x48\x02\xae\x10\xb8\x3d\xed\x61\xb6\xbf\x45\x4c\xa7\x5e\x4c\xda\xd5\x53\x2f\x20\xb7\x06\x54\xf1\x2b\xa9\x06\xf0\x03\xa8\xb9\xe9\x86\xf1\x5a\x39\x41\x9d\xeb\x2e\xa1\xea\xd7\x59\x82\x90\xee\xeb\xf9\x25\x2b\x0c\x27\x60\x5a\x7a\x73\xa6\xab\xeb\xb4\x22\x71\xd7\x1a\x3c\x19\x7a\x46\xbc\xc8\xdb\x11\xd9\x24\x28\x42\xf3\x78\x36\x4a\x37\xee\xca\xa3\x4e\x98\x21\x35\xbe\x34\x18\x2c\x69\xca\x8e\x6e\x3c\x8c\x90\xe1\xb4\xb2\xb4\x75\x81\x5a\x17\x83\x77\xae\x01\x65\xa7\x64\xc8\xba\x28\x89\xb5\xab\x29\x09\x49\xd8\x48\x7a\x88\xe0\xd3\xd2\xbc\x7e\x25\x20\x17\x6a\xa6\xff\x9f\xf0\xc4\x09\xff\x80\x51\x5f\x4f\x0b\x83\xc5\xe8\x2c\x23\xfd\x33\x26\xcd\xd6\xb7\x62\x52\xe7\xfd\xdc\xd6\xe4\x77\x09\x78\xcd\x50\x3e\xd2\xd6\xb4\x80\x10\x11\x67\xd3\xf1\x91\xfe\xd8\xd6\xd7\x4d\x74\xa2\x00\x7d\xb1\x09\x2e\x46\xa2\x3d\xde\xcd\xdc\xdb\x98\x46\x64\x04\x7b\x8d\xd7\xcc\x8a\x57\x6e\x1a\x80\x6f\x52\xcb\x02\x7a\x94\x80\xa9\x5c\xc4\x4b\x1e\x6f\x2e\x28\x6e\x9b\x7a\x6b\xf7\xb3\x96\xfa\x54\x96\xb7\xa5\xb1\xc0\x3d\x9c\x5c\x27\xda\x1a\x42\x99\x0d\x10\xb1\x2f\xb8\x64\x0e\x15\x96\xf2\x6b\x36\x6d\x27\x0b\xa6\x4f\x99\xaf\xff\xe3\xfe\xce\x05\xa9\xb0\x25\x4b\x20\x8c\x79\x97\xcd\xb5\x12\xfc\x77\x52\x79\x54\xa1\xcb\x50\xfd\xab\x1c\xc9\xa4\x51\x62\x74\x1f\xd6\xf9\xd3\xfd\x5f\x2e\x38\x28\x53\xd7\x33\x5d\xba\x1e\x6b\x29\x59\xdd\x86\xe1\x25\xe6\x7b\x53\xdc\x8e\x45\x3c\x81\x0b\xc0\x1b\xf2\x0b\xce\x7b\x61\x8d\xd5\xd1\xed\x78\x41\x06\xee\x06\xa3\xec\xaf\x6b\x3b\xee\x0b\x56\x83\x3b\x0b\x81\x31\x39\xc5\xa6\x96\x00\x0a\x44\x9c\x97\x90\x6a\x2f\xbd\xdc\x2d\x9d\xe9\x40\x6e\xa2\x82\xac\x4e\xe5\xef\x8b\xf3\x85\x4c\x74\xa6\xb7\x17\x3d\xd2\xf7\x9c\x7a\x12\x6f\x3c\x7b\x04\x33\xfd\x4e\xa2\x6e\x87\x7a\x14\x83\x1d\xd4\x15\xa1\x9d"}, -{{0xd0,0x1a,0x0e,0xad,0x9d,0x69,0x48,0x33,0x28,0x3b,0x9c,0xd7,0x29,0x9a,0x7b,0xd7,0x5f,0xa9,0x0b,0x1d,0x2d,0x78,0x84,0xe4,0x55,0x7b,0x33,0xc9,0x98,0x77,0x2a,0x68,},{0xa0,0xf7,0x57,0x47,0x9b,0xa6,0x27,0xef,0xef,0x95,0xd6,0xec,0x7a,0x93,0x1d,0xfa,0xc4,0x37,0x3d,0xf3,0x3d,0xaa,0xf4,0xdd,0xc4,0xec,0x68,0x94,0xc8,0x26,0x1e,0xd7,},{0x9a,0x0f,0xf7,0xf3,0x51,0x74,0xec,0x3f,0x66,0xd2,0x2a,0x6f,0x06,0xdf,0x60,0xe0,0x9c,0x8f,0x62,0x3a,0x5a,0xca,0x81,0x0e,0x23,0xa8,0x8d,0x0e,0x6a,0x31,0xcb,0x6f,0x1c,0xe1,0xc1,0xf9,0xdc,0xcc,0x9e,0x14,0x84,0xb6,0x8d,0xd0,0x04,0xac,0x53,0x59,0x7e,0x29,0xad,0x6a,0xb7,0x2e,0x8c,0xe2,0xb7,0x5a,0xd5,0xb8,0x0e,0xb8,0x48,0x03,},"\x76\x27\x53\x4e\x9a\x83\xd1\xe4\x06\xab\x94\x8d\x30\xd1\xda\x9c\x6a\x5d\xb0\x8e\x0f\xeb\x7f\xc5\xba\x5c\xbf\x76\x84\x9e\xe8\xad\xd4\x84\x7e\xf5\xca\x5a\x0d\xae\x41\x1a\xca\x09\x74\x51\xcb\x4c\x2b\x49\x8c\x94\x70\x97\x40\x70\x07\x64\x0d\xc1\x9e\xd9\x38\xe3\xb9\x1b\xf5\x1c\x95\x81\x16\x8d\xf8\x60\xbd\x94\x75\x16\x68\xda\xbd\x72\x1d\xc7\x39\x98\x40\x0b\xe2\x0c\x9a\x56\x3d\x50\x51\xef\x70\xe3\x54\x6f\xee\x67\x33\x12\xb5\x2a\x27\x40\x41\x05\x7e\x70\x84\x8e\xb7\xc5\xa2\x16\x44\xc9\x7e\x44\x8a\xbd\x76\x40\x20\x7d\x7c\xda\xfc\xf4\x5d\xa6\xdf\x34\x94\xd3\x58\x5b\x0e\x18\xac\x5a\xc9\x08\x1c\xb7\xa4\x07\xa3\x9a\x87\x77\x05\xcb\xaf\x79\xa0\x1b\x91\x5f\x73\x6e\xb0\x25\xc5\x8b\x4b\x5d\x80\x7f\xb7\xb7\x56\x6c\x59\x69\x78\x7c\x1d\x6c\xa4\xeb\xa9\x7d\x50\x9e\xf7\xfb\x35\x50\xd2\x1d\x37\x7e\xce\xff\xcf\x0e\xb6\x68\x18\x95\xad\xbd\x24\x6e\xe7\xbf\x3c\x93\x5a\x00\x64\x78\xb8\x32\xec\xe4\x6d\xe6\x11\x8b\x17\xe4\x66\xa2\x7f\xc2\xa4\x4a\x89\x6b\xaa\xe2\x72\xf9\xec\xf0\x18\xc6\x5c\xb5\x0c\xfb\xfc\x8d\x26\x09\x94\xa1\x8a\x83\x2d\x97\x19\x28\xc4\x49\x67\x57\x24\x58\x51\x31\xc8\x71\x53\x3c\x98\x97\xd8\xf8\x0f\x9c\x04\x16\xb7\x18\x78\x6b\x10\xfe\xa8\xeb\x5b\xd8\x13\xa2\x69\xa1\xb6\x77\xb7\xa2\x50\x7a\x44\xb7\x13\xd7\x05\x08\x65\x30\x99\x5e\x59\x33\x5d\xdc\x28\x55\xe8\x47\xe4\xf4\xdb\x06\xc9\x1f\x1d\x54\x02\x3d\x8a\x10\xf6\x9f\x9e\x61\xbd\xce\x4b\x68\x6f\xb6\x17\xbd\x50\x30\xe7\x55\xca\xdb\x1f\x64\x4e\x1d\xdd\x91\x61\x9b\x96\xec\xd6\x05\xb0\x01\x98\xb9\xa6\xed\xdb\x5a\x84\xeb\xd3\x69\x2b\x66\x59\x79\x76\x66\x37\xc6\x77\x37\x8c\x1c\x77\x04\x1f\xd4\xa6\xb3\x55\x5c\x1d\xc8\xa8\x3f\xe9\x01\x3b\xb6\x10\x6c\xc1\x8a\x2b\x03\x7c\x93\x77\xb7\xa1\xa5\xa5\xd0\xdc\xc5\x49\x18\xea\xad\x7e\x32\xc8\x80\x76\x7b\x26\xfd\x2e\xa2\xd6\x8b\x04\x05\xf5\xe0\x74\xf5\x5a\x19\xd8\xa3\x9f\xfb\xb7\xdc\x32\xfa\xee\x6a\x7f\x95\x32\xae\xc8\xa0\x77\x6c\x3f\xf8\x3a\xe3\xa4\x62\x77\x38\x49\x6a\x37\x1e\xb9\xe0\x90\xb7\x4e\x0e\xdd\xec\xfc\xd4\x1b\xed\x0c\x0c\xe5\x81\x27\x52\x43\x47\x2d\x26\xda\x8c\x99\x8e\x4b\x6d\x6b\x44\xfc\x88\xba\x2a\xb5\x46\x42\x22\x54\x17\x12\x02\x94\x41\x78\x05\x74\x2b\xdb\x33\xb7\xb1\x22"}, -{{0xdf,0x64,0x89,0x40,0xb5,0x78,0xbc,0x31,0xd2,0xa6,0x52,0x96,0x5f,0x30,0x39,0x1c,0xaf,0x06,0xd5,0xf2,0x51,0x59,0x9a,0x73,0x7c,0xe1,0x0b,0xe5,0x5f,0x4a,0x9d,0x0d,},{0x27,0xde,0x92,0x04,0x19,0xc1,0x86,0xb0,0x1b,0xe5,0x42,0x79,0xfb,0x8f,0x9b,0xe4,0xbb,0x4b,0x2c,0xad,0x75,0xca,0x7e,0x8f,0x79,0x2b,0xfa,0x7b,0xb9,0x7c,0x7f,0x41,},{0x62,0xbc,0x99,0x1c,0x45,0xba,0x9b,0x26,0xbf,0x44,0x01,0x16,0x26,0x41,0x62,0xc3,0x4c,0x88,0x59,0x78,0x85,0xe9,0x60,0x50,0x83,0xc6,0x04,0xb5,0xf5,0xd8,0xfa,0x6f,0x66,0x2b,0xa2,0x14,0xf7,0x6e,0x6c,0xf8,0x4e,0x5e,0xc0,0x4d,0xf1,0xbe,0xef,0xc5,0xf2,0x5d,0x3a,0x3b,0x72,0xf9,0x8b,0x50,0x69,0x83,0x19,0x16,0xa6,0x32,0x96,0x01,},"\x1a\xe5\x20\xbe\xeb\x4a\xd0\x72\x2b\x43\x06\x7f\xa7\xcd\x28\x74\xab\xcf\x34\xdd\x92\x37\xb4\x47\x8e\xae\x97\x72\xae\xa2\x97\xa6\x7f\xb7\x9b\x33\x07\x02\x04\xba\xee\x44\x0b\x9c\x87\xe2\xfb\xcb\xeb\x76\x80\x1d\xdd\xea\x5e\x45\x30\xd8\x9e\x11\x58\x31\x79\x93\x9a\x00\xa3\x2f\x81\x13\x32\xc5\x22\x91\xcc\x7a\xc9\x1e\x5a\x97\x0c\xd5\xaa\x70\x8b\x1d\xa2\x6b\xe9\xfe\x43\x2a\x9b\xbd\xa1\x31\x9e\x31\xe4\xbc\xc9\xf1\x66\x6a\x05\xb5\xc0\x5b\x87\x6b\xfd\x1f\x76\x66\x87\xcc\xea\x4e\x44\x82\xe9\x24\x32\x9a\xfa\xce\x5e\xe5\x2e\x98\x79\xfd\x69\xb7\x6e\x0f\x7e\x45\x2e\xc4\x71\x3b\xff\x21\x6d\x00\xc8\x25\x99\xd2\x7c\xa4\x81\xf7\x3a\xae\x13\x6f\x08\x75\xc8\x8a\x66\xb1\xb6\xf3\x4c\x50\x52\x3a\xb6\x02\xe9\xd4\xeb\xb7\xee\xb9\xe0\x43\xa6\x5e\x41\x89\x9d\x79\x75\x2a\x27\x9d\x2e\xd4\x69\x93\x92\x6f\x36\x21\xe7\xc3\x2c\x9a\x9b\x3b\x59\xd8\xdd\x57\xbe\xca\x39\x28\x54\x34\xde\x99\x1c\xbd\x2d\xfc\xbc\x5c\xa6\x2a\x77\x79\xf4\x75\xd0\xce\xf2\xf3\xe5\x62\xf2\x9a\xcd\x47\x4f\x3c\x99\xec\x5b\xd8\xde\x01\x10\x1b\xed\x2e\x0c\x9b\x60\xe2\xd7\x0f\xd4\x32\xc8\x92\xfc\x66\xf8\xd4\x61\x9a\x91\x1b\x56\x25\x16\x3e\x9a\x42\xbf\x9e\xa3\x85\x86\xd8\xe7\x64\x00\x15\x64\xd3\x35\x41\x12\x25\xfc\xb0\xa0\x6d\xc2\xa8\x2d\xa0\x77\x9a\x3c\x44\x4e\xb7\x86\x42\x01\xb4\x3e\xbb\x72\xb9\x21\xf3\x4d\x3c\x13\x08\x9d\xf2\xf4\xfa\xc3\x66\xff\x1e\x3c\x0b\x96\xf9\x3d\x2b\x4d\x72\x6a\x5c\xe4\xd6\x91\x6d\x82\xc7\x8b\xe3\x54\xa1\x23\x0c\x2c\xf0\x41\x8c\x78\xa1\x91\x3e\x45\x4f\x64\x8c\xc9\x2c\x8d\xd0\xe1\x84\x64\x5f\xe3\x78\x1d\x26\x3c\xff\x69\xf5\xc6\x0b\x1e\xbb\x52\x00\x5a\x8b\x78\xa5\x15\xc7\xe8\x88\x6f\xfe\x05\x4d\xab\x42\x8e\x2e\x22\x1d\x9d\x76\xaf\xf4\x26\x54\x16\x8d\x83\x3b\x88\x17\x82\x93\xe1\xfe\xdd\x15\xd4\x6c\xd6\x09\x48\x31\x29\xc4\xd2\xd8\x44\x32\xa9\x9d\x31\xff\xe9\xbd\xb5\x66\xf8\xc7\x5c\xe6\x5e\x18\x28\x8e\x4d\xf8\xc1\x67\x31\xa0\xf3\xfd\xde\x1c\xca\x6d\x8e\xde\x04\x35\xff\x74\x36\xca\x17\xd0\xae\xb8\x8e\x98\xe8\x06\x5c\xbc\xbf\xd0\xff\x83\x04\x3a\x35\x7c\xd1\xb0\x82\xd1\x70\x3d\x46\x18\x81\x87\x2c\xdf\x74\x1e\x4f\x99\xbd\x14\x67\x45\xba\x70\x39\x74\xbe\x40\xf5\x79\xbf\x5c\x4d\xba\x5b\xdb\x8c\x94\x1b\xce"}, -{{0xc8,0xac,0x23,0x45,0x58,0xaa,0x69,0x81,0x6b,0x36,0x8b,0x77,0xb7,0xcc,0xcb,0x5c,0x8d,0x2a,0x33,0xec,0x53,0xae,0xef,0x2c,0xe2,0x28,0x71,0x43,0xbd,0x98,0xc1,0x75,},{0x53,0x64,0xba,0xf1,0xfd,0xb2,0xc6,0x38,0x40,0xb3,0x0d,0x40,0x31,0xcf,0x83,0xa2,0xe1,0x8e,0x62,0x07,0x93,0xba,0xe5,0x9d,0x10,0x35,0xc0,0xed,0xe5,0x5e,0x52,0x8b,},{0x32,0x25,0x03,0x61,0xdf,0x6e,0xd2,0x83,0x48,0x5f,0x95,0xf3,0xd3,0x57,0xa4,0xf1,0xc3,0x3a,0x8c,0xf9,0x16,0x58,0x32,0x7c,0xd4,0x53,0xd4,0x9c,0x95,0x36,0x65,0x51,0x08,0x70,0xaa,0x45,0x4c,0xfa,0x3b,0x83,0x24,0x52,0x20,0xa8,0x27,0xd0,0xec,0x74,0x77,0xf9,0xec,0xeb,0x79,0xc4,0xa2,0x9f,0x30,0x1f,0x95,0x3c,0xc8,0xca,0xac,0x07,},"\xce\x48\x8d\x26\x97\x5c\x1c\x93\x28\xb4\x7f\xa9\x2e\x19\x56\x13\x30\x04\x1b\x23\xa0\xe5\x7a\x4b\x8b\xca\x89\xeb\x5f\x61\x5e\x73\xdd\x7f\xae\x69\xc2\x38\x0e\x32\x12\xf9\xb7\x33\x41\xc3\x56\xdb\x75\xa6\x25\x6d\x7a\x20\xa9\x7f\x75\x9d\x4c\xba\x71\x97\x17\x8e\xa7\x24\xdd\x93\x29\x49\x36\x0e\x96\xc5\x0a\x4b\x3b\xa5\x5a\x95\x33\x72\xc3\x97\xb0\x96\x9c\x2b\x14\xd3\x60\x9e\x0a\x85\x2d\x48\x4d\xf7\x0e\xaa\xb1\x12\x49\xeb\xeb\x32\x37\x92\x1f\x0a\x39\xa5\x5d\x7d\xcc\xfe\xf2\x05\xd9\x4e\xc8\x0d\x9e\x1f\xd6\xa2\xc1\xef\xd2\x98\x44\x10\x1d\xfe\x2c\x5f\x66\x8a\xdb\x79\x75\x91\x5d\xed\xd0\x86\x50\x0c\xee\x2c\x1e\x23\x3e\x8e\x48\x85\x5c\xc1\xa6\xf2\x87\xd6\x3d\xce\x10\xad\xdd\x13\xca\xc7\xb7\xa1\x87\xef\xe4\x7e\x12\xd1\xc3\x5b\xb3\x97\x40\x52\xb2\x3a\x73\x66\x8d\x3e\x4c\x87\xdb\x48\x41\xaf\x84\x6e\x80\x86\x72\xc4\x3d\x0a\x15\x22\xe2\x96\x5f\x08\x39\x51\xb2\xb2\xb0\xc4\x09\x54\x8e\xe6\x18\x2f\x0c\x98\x50\x51\x4c\x9e\x6c\x10\x2f\x54\xba\x41\x24\xc9\x2a\x90\x27\x4f\x40\x58\x91\xe6\x62\xf5\xeb\xb3\x77\x1b\x85\x78\x31\x56\xe9\xe5\x83\x67\x34\xd0\x9d\x1b\xaf\x5b\x21\x34\xc9\x31\x62\xee\xc4\xbe\x03\xbd\x12\xf6\x03\xcd\x27\xbe\x8b\x76\xac\xcc\x6e\x8b\x8b\xac\x02\x0c\xba\x34\x79\x65\x1c\x9f\xfa\x53\xce\x4e\xb7\x7a\x77\x31\x3b\xc1\x26\x5d\xda\xb8\x03\xef\x7a\x65\x63\xba\x6f\x79\x9d\x1e\xf3\x0e\xf5\xa0\xb4\x12\x96\x5f\xda\xc0\xb9\xda\xb8\x42\xc7\x8e\xe2\xcc\x62\x8e\x3d\x7d\x40\x61\xe3\x4e\xde\x37\x97\xe1\x54\xb0\x6e\x8c\x66\xce\xbd\xf2\xde\xd0\xf8\x1b\x60\xf9\xf5\xcd\xda\x67\x5a\x43\x52\x77\xba\x15\x24\x55\x7e\x67\xf5\xce\xfa\xfc\xe9\x29\x29\x1d\xce\x89\xec\xb0\x8a\x17\xb6\x7a\x60\xc5\x82\xb4\x87\xbf\x2f\x61\x69\x62\x66\x15\xf3\xc2\xfe\x3b\x67\x38\x8b\x71\x3d\x35\xb9\x06\x66\x69\x96\x0d\xe4\xdb\x41\x3c\xd8\x52\x8e\xe5\x6e\xd1\x73\xe9\x76\xa3\xc9\x74\xac\x63\x3a\x71\x34\xcc\xe3\x83\x19\x73\x5f\x85\x7b\x7d\x71\xba\x07\xf4\x77\xef\x85\x84\x8a\xa8\xf3\x9e\x11\x81\x18\x77\x9e\xd8\x7b\x4f\x42\xaa\x35\x8a\x89\xf7\xec\x84\x4a\x45\x1e\x7e\x8f\xc0\xaf\x41\x8b\x85\xbc\x9b\xf2\xf2\x6d\x1e\xa1\x37\xd3\x35\xec\x7e\xe7\x57\xb7\x0a\xe2\xfd\xd9\xcc\x13\x49\x32\xf0\xe5\x42\x5b\xf3\x7f\xb9\x15\xe7\x9e"}, -{{0x2c,0x47,0xf2,0xb8,0xb9,0xd2,0xce,0xe9,0xe6,0xf6,0x54,0xbc,0x24,0x65,0x8f,0x9e,0xaf,0x43,0x9c,0x23,0xbe,0xaa,0x0a,0x79,0xbf,0x35,0xcc,0x8c,0xd2,0xde,0xba,0xf4,},{0x44,0x4a,0xf2,0xf3,0x4f,0xd3,0x2e,0x5a,0x19,0xf6,0x1f,0x87,0xd0,0x3e,0x10,0x76,0x27,0xa3,0xee,0xb8,0xbd,0x94,0xd2,0xfa,0xea,0xa3,0x48,0xb0,0x5d,0xea,0x19,0x80,},{0x85,0x54,0xb0,0x1d,0x09,0xed,0x86,0xe6,0x13,0x95,0xb9,0x1a,0x2b,0x1e,0xe1,0x87,0x15,0xc4,0x2f,0x9c,0x7e,0x7f,0x07,0x00,0xd7,0x9f,0xf9,0xfb,0x57,0x81,0x29,0x3d,0x61,0xc5,0x58,0xdd,0x5b,0x43,0x1c,0x93,0x71,0x8d,0xcc,0x0f,0x98,0xfb,0x65,0x2b,0x59,0x6f,0x18,0xc3,0x0f,0x82,0x21,0x5e,0x8e,0x63,0xe4,0xf6,0x56,0x8c,0x88,0x00,},"\x04\x4c\x8f\xaa\x8c\x8a\xaf\x9f\x2b\x81\x86\xa6\xb9\xb3\x38\x47\xec\x7b\x45\x24\x23\xb2\x2a\x91\x74\x3d\x2e\x59\x7e\xcc\x1e\x1e\x22\xae\x60\x05\x3e\x9e\xe6\x23\x3b\x04\x4e\x77\x59\x20\xe4\xe3\xd6\x67\x19\x90\x13\x25\xcf\xdd\x39\xbb\x53\x2f\x8a\xa4\x69\xaa\xb4\x2e\x96\x08\xc2\x12\x60\xc0\x4c\x27\x41\x3a\x7a\x94\xe4\x66\xf6\x3c\x49\x52\xe9\x0e\xf9\x0c\x12\x81\x4b\x34\x51\xb1\xca\xd7\xda\x91\x47\xf8\x40\x92\x20\xf6\x49\x8c\xc0\xa6\x7f\xef\x4b\xc0\x4f\xc0\x6e\x1d\x89\x8a\x55\x15\x59\x1e\x8b\xe0\xc4\x3d\x75\xa6\xfe\x42\x5b\x7c\xbe\xfb\x1b\x91\xb1\xbd\x78\xb5\xbe\xc7\x82\x90\x56\x98\x2e\xfd\xc5\xbe\x24\xaf\x66\x78\x00\x6a\xdc\x6f\x04\x46\x20\x2e\x7e\xc3\xa2\xd6\x97\x9c\xb0\xdf\x7e\x25\xd7\x42\x33\x91\x4d\x9c\x58\xb8\x1c\xf5\x5b\xe0\x69\x67\xd3\xa5\x95\xc1\xb9\x67\x28\x69\x99\x4c\xfb\xa6\x71\x62\x83\x3a\x21\x43\xaa\x91\xcc\x93\xac\xda\xfa\x5b\x45\x20\x8d\xf3\xe8\x8c\xcc\x01\xa2\xa4\xd2\x20\xe3\x60\x09\x8d\x91\x54\xd2\x25\xa7\xca\x5f\x2f\x1e\x52\xb1\x00\x3d\x10\x66\x50\xa7\x7b\x28\x3b\x95\xe4\xba\xf1\xe7\x33\x6f\xa9\xa7\x47\xa2\xb3\x82\x3d\x36\x09\x10\x41\x2e\x76\xdb\x72\x5c\xe1\xab\x1e\x1d\x18\x9d\x0d\x3a\xbe\xf8\x2d\x76\x66\xbc\xf1\xb7\x66\x69\xe0\x64\x3b\x44\xf7\x4e\x90\xce\xaf\xa0\xc8\x37\x1b\x57\xc5\x8f\x3b\x37\x0a\x54\x7c\x60\x95\x8f\x0f\xcf\x46\x1b\x31\x50\xf8\x48\xc4\x70\xfa\x07\xe2\x9b\xf5\xf0\xd4\xb5\x9e\xfa\x5a\xb0\xd0\x34\x1e\x04\x51\xd0\xab\xb2\x9d\x74\x14\xcd\xdc\x46\xcc\x6d\x74\xcf\x3d\xc2\x33\xd0\xd1\x70\x73\x87\xbd\x8c\x77\x80\xff\x78\xe5\x46\xfb\x77\x29\x4d\x58\xa5\xdd\xa5\xf0\x5c\x12\x97\xe3\xd1\x77\x11\x56\xd2\x85\x63\x5b\xf7\xec\xed\xb3\x8a\x9e\x5e\x77\x44\x98\x04\xf3\x89\x9e\xa4\x6a\x50\x26\x6b\x25\x5a\xeb\x52\xd1\x8e\x0f\xa1\x36\xe5\x35\xcc\x90\x26\xf6\x78\x55\x2f\xa3\xee\x21\x46\x08\x1d\x99\x96\x85\xe2\x4b\xf7\x80\x7c\xc4\x7c\x13\x04\x36\xc5\x44\xd3\x5b\x4b\x87\x5b\xd8\xaf\xa3\x12\xce\x3a\xe1\x7c\xf1\xc7\xf5\xea\x1e\xce\xcb\x50\xf9\x53\x44\x72\x0c\xec\xf0\x88\x43\x4f\xf8\xe0\xba\x04\x4e\xc1\x9c\x98\xad\xa7\x78\x21\x16\x30\x4c\xbe\xac\x1c\x3e\x35\xf5\xa4\xf4\x43\x13\x35\x4d\xc9\xa4\x0e\xce\x5a\x0f\x9a\xd3\xa2\x02\x5a\xce\xf2\x62\xc5\x67\x9d\x64"}, -{{0x88,0x7f,0xdb,0x48,0x70,0x68,0x1d,0x4f,0xb0,0x6a,0x93,0x62,0x59,0xf7,0x5c,0xae,0x05,0x17,0xf5,0x01,0xaf,0x64,0x6b,0xc0,0x7a,0x4d,0x72,0xbe,0xe7,0xfb,0x1c,0x73,},{0xc7,0x62,0xeb,0xd4,0x8b,0x2c,0xe0,0x2d,0x06,0x38,0x4e,0x38,0x55,0x4b,0x82,0x5a,0xd3,0x22,0xeb,0xea,0x74,0xd2,0x59,0xdf,0x15,0x47,0xa4,0xd5,0x47,0xce,0x00,0x24,},{0x41,0x0a,0x5a,0xf3,0xc5,0x9b,0x7c,0x6b,0xdb,0x21,0x4b,0x16,0x6c,0xb7,0x9d,0x96,0xf8,0x30,0xcf,0x98,0xbf,0x52,0xda,0xd7,0xb6,0xff,0x29,0x79,0xc9,0x7f,0xea,0x4f,0xed,0x5e,0xf7,0xd3,0xd4,0x9f,0x03,0x09,0x72,0x79,0xb9,0xa0,0x99,0x22,0x6e,0x2a,0x08,0xdd,0x30,0xc6,0x07,0x86,0x25,0x4e,0x2d,0xa8,0xde,0xe2,0x40,0xbf,0xc3,0x08,},"\xc5\xdc\x77\x9f\x3f\x3f\xac\x06\xdd\x28\xe5\xa6\x7e\x0e\x52\x4a\xf5\xb5\xdc\x3b\x34\x40\x96\x57\xb6\x3d\xfa\xce\x94\x71\xe9\xa4\x1e\x11\x32\x17\x5a\x0b\x56\x9c\x8f\xea\x9d\x2e\xef\x2c\xf5\xd5\x96\x2c\x7e\x0b\x61\x45\xa9\xe7\xa0\xc1\xaa\x33\x77\x20\x44\xf9\xc3\x99\x8c\x5a\x8c\x48\x86\x45\x8b\x4e\x58\x6f\x93\x07\x60\x83\x61\xf5\x11\xe7\xab\x50\x92\xac\x41\xec\x76\xe0\x58\x6e\xf5\xb9\xc2\x36\xfc\xf5\xca\x2f\xc8\xdd\x6a\xae\xb7\x89\x36\x7f\x2e\x7c\x99\x09\x32\x55\x5d\xc5\x22\x61\xe4\x4e\x49\x42\x34\x98\xb5\x24\x41\x91\x83\xb6\xc1\xf1\xd4\x2c\x45\x46\x4e\xcc\xb0\xc2\xf7\xe2\x51\x77\xfe\x5c\xd4\x63\x50\x2b\x40\x3e\x06\xd5\x11\xfc\xf9\xdc\xb6\x40\x12\xe0\xf2\x0b\x34\xc2\xea\x7c\x00\x4d\x9e\x48\x4a\x7e\xd8\x1f\x32\x60\xc4\x1c\x8b\x19\x53\x52\x9f\x47\xf7\x1e\x86\x78\x43\xcc\x3c\x33\x2a\xd0\x36\x6a\x63\x81\x7e\xd1\x2d\xd4\x73\x0d\x3d\xfd\xbd\x75\x72\xb9\xff\x79\x80\x45\x94\x0d\xd1\x9f\xad\x0c\x8a\xea\x0b\x4a\xb6\x1c\x40\x16\xde\x32\x79\x9c\x73\xaa\x2b\x92\xd2\xc2\x5e\xe9\xb7\x2d\x46\xfe\x8f\x06\x93\xc5\x87\x75\xef\xb0\x5e\x9e\x17\xa5\xc3\x46\xa8\x12\x65\xd3\x5b\xe6\x9a\x22\xd0\x95\xde\x18\x60\x66\xa5\xc6\xd8\xc0\x7a\x3d\x38\xd0\x02\xa1\x0e\x5e\xfd\xb8\x66\xda\x4a\x9b\xdd\x54\xf5\x09\x26\x61\xb6\xc2\xd7\x43\xf5\xae\xaa\x4c\x6c\x31\x8f\xb5\x93\x23\x90\x30\x57\xe4\x9c\x23\x7b\x45\xf6\x75\x42\xa4\xf2\x7c\xaf\x65\xb5\x7c\xfc\xf8\x8b\x71\x20\x3d\x43\xd7\xf9\x53\x22\x16\x0f\x95\xc2\x32\xdd\x10\xab\xb1\x13\xb7\x21\xdd\xba\x22\x26\xb0\x63\x22\x9b\xb4\x41\x02\x33\x6b\x10\xbf\x16\x56\x55\x11\x61\x24\x97\x86\xd4\x54\xf4\xe0\x90\x9d\x50\x00\x17\xf6\xc7\x56\x4f\x73\x3c\x83\x1a\xf4\xe5\xec\x94\xdf\xd3\xbf\x8f\xf5\xf3\x02\x1b\x70\xa5\xca\x5d\x28\xc6\xdf\xb8\xa2\xc1\x8a\x1a\x66\x2a\x33\x35\x9f\x26\x4d\x16\x96\x98\xc1\xab\x55\x78\x3f\xac\xa7\x3b\xd6\x8c\x0f\x79\xd1\xd0\x4a\xe0\xec\xdb\x52\xae\x76\x18\x92\xc0\x24\x93\xff\x35\xf3\xd8\x4f\x66\xe2\x36\xfc\x58\x13\x4a\xd6\xa7\x7d\x92\x25\x49\x05\xd7\x73\x90\x0d\x9d\xdf\x26\x54\xc7\x0b\x46\xf3\x41\xda\xcb\x47\x93\xca\x51\xee\xde\x45\x53\x3e\xae\xeb\x6e\x33\x23\xbc\x3e\x6c\x85\xa7\x94\x06\x51\xc4\xf6\xf9\x81\x91\xc6\x18\xc8\x91\xea\x4e\x22\x0e\xa4"}, -{{0x88,0xb3,0xb4,0x63,0xdf,0xc3,0x0d,0x01,0x5e,0xef,0xbb,0xbd,0xd5,0x0e,0x24,0xa1,0xf7,0x27,0x77,0x75,0xbc,0xef,0x14,0xa6,0xbe,0x6b,0x73,0xc8,0xc5,0xc7,0x30,0x3e,},{0xf2,0xb6,0x28,0x4c,0x93,0x0d,0x4a,0xd3,0x2d,0x0a,0xc7,0x19,0x04,0x0e,0xe7,0x88,0x6b,0x34,0x72,0x2e,0xdf,0x53,0xda,0x80,0x1a,0xcb,0x5f,0x93,0x19,0x69,0xe1,0x19,},{0x82,0x5a,0xff,0x71,0xf7,0x93,0x03,0xbf,0x45,0x92,0xbd,0x8d,0xa4,0xd7,0xd9,0x43,0x7f,0xf2,0x67,0x97,0x6f,0x74,0x64,0x37,0x65,0x59,0x88,0xdd,0xcf,0x29,0x37,0x94,0x65,0xa3,0xb4,0x8c,0x9f,0xb0,0xf3,0x1c,0xef,0x03,0xe6,0x36,0x88,0x61,0xc3,0x69,0xb4,0x36,0x4f,0xb8,0xe4,0xb0,0xc7,0x2e,0x26,0xa9,0xa9,0xdd,0xed,0x1c,0x25,0x04,},"\x17\xc3\x17\xfa\x6b\xc9\x0c\x55\x32\x32\x8f\x02\xcc\xfb\x6c\x09\x9e\x6f\xe1\x00\x01\x74\xf2\xaf\x3a\x3a\x93\x09\x42\x85\x06\x71\x7c\x5c\x43\x35\xbd\xd7\xc3\x67\xff\x4e\x44\x8a\x9c\x04\x75\x03\xaf\xba\x68\xfd\x8f\x79\x87\x23\x7b\xe7\xf7\xfb\xdc\x6d\x73\xf2\x4c\x64\x21\xca\xb4\x22\xb3\xfb\x25\xf6\x7b\x2d\x71\x04\x2e\x71\x57\x0d\xf2\xaf\x37\xbf\xe5\xc1\x14\x21\x1f\xd5\x52\x4b\x6c\x1c\x6c\xc5\x2f\xab\xc3\xcd\x7f\xb4\x64\xcd\x58\x0b\xb7\x40\x71\xcb\x30\x0f\x8c\x9f\x8a\x46\x20\x8e\x5a\xa5\xdd\xfe\xa5\xfe\x90\x69\x7a\xa2\xf1\x4c\x60\x79\x50\xc9\x8f\x23\x12\xa9\xe1\x6e\xf6\x34\x6a\x8f\xd1\x29\x23\x27\x33\x82\x7e\x15\x01\xa6\x60\xc7\x7c\x29\xc5\x6d\x2f\xdd\x1c\x55\x97\xf8\xbc\x89\xaa\xef\xe3\x71\x37\x34\xfe\x82\x85\x82\x01\x89\x1a\x11\x47\xef\xaf\x1d\x78\xa4\x71\xf9\x20\xde\xfc\x88\x03\x44\x55\x3e\xb7\x16\xcc\xe3\x26\x0e\x86\xa1\xbc\x0b\xe2\x83\x73\xa6\xa0\x66\x11\x6e\x8e\xcb\x10\xa0\xc4\xa7\x0c\xa2\xb5\x36\x4e\x11\x9f\x84\xae\xc6\x0d\xec\xed\x3a\x4e\xff\x1f\xe6\x88\xc5\xe3\xe2\x51\x47\x0a\xb5\x16\xfa\x96\x4a\x4b\x6f\x28\x36\x8d\xd1\xe2\x83\x59\x79\x34\x06\x4d\xc0\xc5\xb5\x69\x10\x62\xcb\x2e\x26\x7b\xd1\x5f\xd4\x22\xbc\xfe\xfb\x83\xcc\xef\x7a\xa9\xa2\x27\x5e\xf5\x7e\x47\x31\x49\x98\x8c\x15\x78\xfd\x18\x70\x8d\x2f\xf6\x9f\x8e\x59\x80\xaa\x82\x6a\x82\xca\xb7\xd8\xb9\x2b\xb5\x3b\xdd\x46\xdb\x04\x6e\xcd\xfc\x8c\xd7\xae\x5c\xe4\x4f\x3c\x5b\x8c\x05\x65\xb5\xd3\xc0\x72\xc7\x6b\x95\xce\x90\x0a\xc3\xee\x55\x10\xdb\x0e\x75\xd3\xa4\x15\x0a\x98\xf3\xcc\xcc\xc6\x9e\x93\x0c\x6b\xa7\x41\xdb\xb0\xeb\x9f\xb3\x19\x68\x71\xba\x20\x6a\x58\xe0\xda\xe3\x9c\x8d\x6b\xb7\x2a\x82\x39\x9c\x4b\x7b\x9d\xa3\x85\x77\xac\x17\xff\x15\x24\xd6\x53\xc0\xbf\x33\x67\x93\x23\xca\x7e\xef\x4e\x92\x28\x72\x90\x31\x56\x0e\xd8\xf2\xe5\x19\x3c\x64\x0b\x2f\x5e\x60\x80\x75\xa2\xed\x61\x42\x8d\xfc\xcd\xc0\x00\x50\xba\x4b\x99\xed\x6d\x15\x36\xd5\xac\x1e\x93\x96\x74\xb4\x1d\x16\x31\x2a\xe5\xb0\x7d\xef\x1b\xf5\x35\x89\xbe\xd4\x40\x06\x02\xee\x11\xb8\x50\x33\x0f\x38\xaa\xd3\x3e\xf0\x41\x70\xa3\x90\x5c\x28\xb5\x0e\xcc\x57\xdc\xcf\x4f\x29\xd0\xc0\x0f\x71\x3d\x32\xff\xc8\x57\x95\x65\x88\xa6\x32\x6b\x95\x49\xed\xb0\xe4\xfe\x61\x85"}, -{{0x42,0x7d,0x6e,0x42,0x39,0x17,0x89,0x68,0x31,0x60,0x1b,0x8f,0x4e,0x21,0x56,0x1d,0xb6,0x10,0x85,0x71,0xbe,0x00,0x9e,0x29,0xdc,0xa4,0x9a,0x59,0x60,0xff,0x31,0x4b,},{0x8d,0x9e,0x63,0x60,0xfd,0xef,0x24,0x99,0x75,0xdf,0x27,0xb3,0x10,0x6a,0x71,0x12,0x05,0x87,0x72,0x2d,0xf3,0x27,0x0a,0x85,0xa1,0x3a,0x8c,0x3b,0xb8,0xc9,0x80,0x9e,},{0xd1,0xc9,0xa0,0x1c,0x56,0xe3,0x39,0x60,0xf4,0x9d,0xf3,0x7e,0xab,0x96,0x3b,0xc5,0xa9,0x9f,0x25,0xc6,0x00,0x44,0x6c,0xe2,0xca,0x48,0xd9,0x13,0x9d,0xa5,0x73,0x3b,0x71,0x8f,0xbf,0x1a,0x98,0x73,0x93,0xf6,0xe5,0x82,0x3c,0x2d,0x13,0x0c,0x7c,0xe6,0x0e,0xa3,0xdb,0x35,0x43,0xc8,0x85,0x4e,0xf1,0x2b,0x98,0xd3,0x3a,0xdd,0xe7,0x05,},"\x9c\x2c\xc7\xf2\x46\x2e\x09\xc4\xc5\x8c\x27\x09\xab\x42\x59\x88\x5a\x4e\x88\x7d\x9f\xa5\x31\x88\x15\x05\xaa\xf2\x03\xc1\x63\xfb\x3a\x0d\xc0\x28\xf4\xad\xa6\x06\x70\x63\x8d\x4a\x97\x27\xa3\x90\x83\xbe\xdb\xac\xed\x58\xed\xb7\x79\xe1\xce\x6c\xcd\xfb\x42\x8c\x36\x2b\xb1\xdb\x0c\x10\x53\x00\x6b\xd8\xf4\xbe\xf8\x9a\x1a\x9d\xe0\x1c\x77\x4e\x35\x7f\x91\x0e\x5c\x39\xb2\x24\x77\x55\x5e\x5f\x7c\x04\x98\xb5\xb2\x8f\x36\x9e\x5d\x3f\xa4\x2a\xb3\x60\xe4\xf4\x51\xc6\x9f\x81\xba\x0f\x3c\xce\xd4\x3a\x55\x9d\xb6\x00\x10\x42\x78\xf8\x68\x79\x6b\x2c\x91\x1b\x3b\x03\x2b\x72\x9f\x4b\x22\xac\x14\x9d\xc4\x67\xa0\xca\xe4\x8d\x19\xe9\xd9\x85\xb4\x2b\x62\x54\x9d\xe1\x71\xff\x56\x6e\x1d\x1e\x9b\xb8\xe5\x6c\xfd\x1a\xe8\xf7\xbd\xdc\xfd\x8a\x23\x41\x82\x7d\xbe\x89\xc8\x82\xab\x3e\x49\x83\x39\xff\x68\x1c\x7d\xc1\x10\x4d\xe7\x38\xb4\x80\x31\x69\x43\x10\x9f\x70\x3d\x47\x1a\xb8\x6e\x4c\xa4\x28\x7e\x4c\xd7\x4c\x31\x2f\xf7\xd0\x37\x39\x56\x06\xfb\x25\xf8\x71\xe7\x27\x70\x78\xa7\x87\xd0\x2f\x31\xcc\x9e\x81\x5b\xe8\x60\x0a\x7c\x47\xc6\xfd\xd8\x23\x31\xae\x9c\x49\x6a\x54\x7b\xdb\x23\x5b\x8a\x56\xd5\x32\x59\xe6\x29\x61\x24\xa3\x2c\x3b\x62\x5d\x20\x24\x19\xd0\x64\xb9\xa4\xe8\x3e\xfa\x87\xf1\x35\x37\xb4\xf5\x13\xb9\x16\xa8\x4f\xc8\x66\xd8\xa8\x99\x80\x4c\x78\x33\xea\xa0\x19\xe0\xd7\xe0\xe8\x07\x5b\xd6\xb5\xcb\x6f\xfc\x76\x64\x79\xf3\xf6\xe2\x0e\x48\x1e\x6a\xb2\x7b\xd8\x08\xad\x90\x6c\xdc\xc7\x82\x74\x30\xe3\x12\xf7\x40\xf2\x75\xdd\xf5\x1d\xd8\x32\x48\xfa\x05\x7c\x43\xc9\xcb\x77\x55\x7b\x2f\xd9\xc2\xd5\x28\x24\xff\x9e\x14\x6d\xea\xc1\xe6\x69\x1d\x45\x02\x13\xbc\x59\x0a\x49\xbe\xc7\x2d\x52\xe3\x8f\x6b\x4d\xc6\xcc\xa9\x51\xee\xf2\x18\x4d\x24\x25\x03\x1a\xd5\x9b\x24\x2e\xff\xa6\x8b\x6c\x72\xc5\x4c\x9d\xfd\xb4\x19\xc0\x2e\xb4\x3e\xf3\xf3\x4d\x33\x8d\x2a\x9d\xd0\x3a\x78\xcf\xdd\x01\x40\x98\xe2\x49\x25\x9e\x77\x28\x2e\x0c\x3f\xc1\x01\x0b\x02\xa6\x7f\xf8\x51\xe9\xcf\xd9\x74\x9c\x1c\xd8\xf0\x6c\xf4\x62\xe6\xad\xe9\x95\xac\x46\x6f\xab\x5c\x79\x5e\x9e\xff\x13\xe5\x5b\x43\x50\xb9\x4c\x73\x16\xaa\x49\x8d\xf9\xfd\xee\x99\x58\x04\x77\x93\xe3\xbb\xb8\x9f\xb8\x1d\xa8\x5f\x4b\x9d\x43\xe4\xb0\xd4\x3b\x38\x1b\x94\xcd\xc9\xa9\x9d\x06"}, -{{0xbe,0x93,0x52,0x09,0xf6,0x2d,0xea,0x60,0x12,0xec,0xda,0x6a,0x61,0x56,0xcd,0x16,0x6a,0x4d,0x76,0x11,0x50,0xde,0xed,0x45,0x68,0x16,0xea,0xf0,0xce,0x78,0xa7,0xf6,},{0xd3,0x9a,0x89,0xaf,0x72,0x29,0x39,0x48,0xb1,0x34,0x21,0xfb,0x88,0x3b,0xbe,0x37,0x2a,0xf9,0x08,0x9c,0x22,0x4d,0x42,0xb9,0x01,0x97,0x9f,0x7e,0x28,0x04,0xe1,0xc0,},{0x08,0xe0,0x98,0xa7,0x49,0xfc,0xe6,0xd1,0x23,0x54,0x39,0x58,0x78,0xa8,0xbe,0x35,0xfe,0x9e,0xdf,0x72,0x68,0x4d,0xd8,0x28,0x12,0x24,0x89,0x9b,0x1c,0xae,0xa4,0xed,0x68,0x77,0x85,0xdf,0xf5,0x5a,0x19,0x98,0x9e,0x03,0x63,0x6e,0x16,0x66,0x38,0x6f,0x22,0xc3,0xf4,0x43,0xec,0xf6,0xfd,0x34,0xd5,0x99,0xff,0x3e,0xc2,0xfa,0xf1,0x01,},"\x11\x7f\x42\x7c\xb6\x81\x50\xca\xfc\xfa\x46\x2c\x42\x20\x61\x41\x42\x7c\x4d\xce\xa1\xc8\xea\xcc\x2d\x30\xbe\xd1\xe9\x02\x07\xd5\xae\x30\x5e\x1f\xc1\x6c\x54\xe4\xc5\x4c\xc6\x87\x8c\xdb\xed\xc9\xf5\x1f\xe1\x84\x61\xec\x37\xc5\x57\xb1\x15\xd1\x3c\x86\x82\xc4\xe1\x5f\x50\x52\x96\xa1\x76\x0e\x1e\x75\xf5\xab\x27\xa5\xc1\x5a\x13\x57\xd2\xc8\xc4\x0d\xd5\x35\x5f\x7c\x82\xfe\xa5\xd2\x7e\x28\x87\x63\x58\xc1\x2e\x91\x13\xee\x29\x83\xea\x6f\x09\xc6\x4e\x06\xe2\x97\xdd\x96\xb3\x4d\x9b\x5e\xd4\x9f\xc4\x7a\x88\x39\x54\x9c\x66\xb0\x02\xfe\x94\x5e\x8f\x94\xe7\xd2\x31\x5c\x50\xca\x4d\xc0\x98\xbe\x4b\x32\x89\x81\x2f\xbe\xa9\x6b\x47\xce\x60\x45\x40\xbd\xe0\xe5\xab\x0b\x1b\xc0\x36\xbe\x9b\x6a\x95\xe0\x9c\x81\xe8\x98\x64\x0c\x8f\x05\xd6\x0a\xd9\x42\x18\xd0\xe6\x6c\xeb\x85\xa2\x6b\x78\x29\x22\x20\xbf\xd0\x61\xdd\x07\x35\x12\x92\x3b\x90\xc7\x9d\xcf\x5a\x19\x35\xfa\xfe\x8e\x01\xef\x8b\xf8\x1b\x4d\x37\xc5\xa5\x71\xb5\x0c\x42\x1f\x9b\xd2\x19\x4b\xef\x35\x86\xfc\xb8\x58\x48\x77\xbb\x7e\x04\x81\x65\x5b\x05\xc7\xb6\x43\xb1\xe4\x5b\x04\x03\x62\x72\x84\x18\x52\xe3\x19\x40\xef\x8f\x3b\x6d\x4f\xeb\x5d\xf0\x79\xd1\x76\xf9\x79\xc1\x8a\x11\xa6\x6d\x12\x14\xe5\x2f\x68\x7e\x90\x63\xc1\xc2\xb7\x27\x7b\x68\x5d\x5c\x72\xad\x56\x9f\x78\x73\x83\x8f\x91\x02\x57\xa0\x53\x13\x1c\x83\xeb\xce\x86\xe6\x9d\x73\x63\x62\xbe\xbc\x96\xbb\xfa\x35\xfc\xba\x1c\xb5\x27\xe7\x48\xe5\xf5\x79\x92\x9f\xd4\x0c\x56\xb1\xa5\x1a\x22\x2e\x86\x33\x02\x70\x5c\x86\xf7\xb5\x4e\xbf\xbb\x94\x82\xf7\xe2\x80\xf7\xbe\xc8\xca\xf3\xa6\xb5\x67\x1a\xc3\x0c\xd1\xbe\x52\x92\x88\x79\x7c\x01\x3c\xe5\x6b\xd1\x86\xde\x7d\xfc\x18\x28\x69\x14\x25\xc1\x47\xc5\x17\x4a\x29\x0d\x80\xcb\xd5\x9c\x19\xda\x7a\xdf\x77\x91\x88\x82\xa7\xb2\xa9\xa6\x4e\x6d\x76\xb4\x8b\x92\xf2\xa2\x66\xee\xe6\xe2\x51\xd2\xe8\x17\x65\x2b\x88\xb5\x02\xde\x73\x99\x78\x2d\x75\x29\xa8\x1d\x0a\x36\x39\x96\xb9\xdf\x68\xb1\x5a\x76\x30\x90\x4c\x8c\x24\x60\x81\xfa\x4f\x09\x29\x9f\x15\x75\x79\x58\xe0\x89\xa9\x01\xc3\x56\x46\x15\xc0\xf7\xcf\x27\x52\xb8\xb9\xe5\x21\x33\x8d\x83\x6e\x3d\xae\x4c\xe2\x37\x46\x42\x25\x3c\x4c\x98\x31\x97\x4e\x5d\x8c\x28\x42\xf4\x90\x07\xb7\x17\x75\x09\x3d\xfe\x57\xf4\x44\x92\xf0"}, -{{0x68,0x18,0xc6,0x0b,0xb6,0x43,0x9a,0xc2,0xee,0xe2,0xd4,0xe1,0x28,0xe9,0xd8,0x69,0x1d,0x4a,0xd5,0xd3,0x63,0xfe,0xd7,0xd6,0x57,0x7a,0x62,0xb6,0x56,0x99,0x94,0xa4,},{0x73,0x45,0xec,0x11,0xbc,0xcc,0x05,0x6f,0xc4,0xef,0xfa,0x3e,0x4e,0xf6,0x70,0x99,0x6a,0xa2,0x6a,0x1b,0xb1,0xb8,0x33,0x91,0xba,0xbc,0x39,0xa1,0xa5,0x96,0x01,0xf9,},{0x15,0x05,0x96,0x7a,0x27,0xb9,0xf8,0x6e,0x92,0x42,0x44,0x40,0x02,0xa1,0xe3,0x19,0x7d,0x74,0xdd,0xcd,0x89,0x65,0x9e,0xc5,0x14,0x02,0x02,0xaa,0xc7,0x94,0xb8,0xad,0xc1,0x93,0xe7,0xd3,0x0f,0x33,0x82,0x64,0x29,0x90,0xf6,0xfe,0xd7,0xa9,0x99,0xca,0xc8,0xc6,0x1e,0xaa,0x39,0xb7,0xd9,0x08,0x16,0xf1,0xd7,0x38,0x74,0x4b,0xe1,0x01,},"\xb2\xae\x65\x8b\x3c\x13\xc3\xcd\xeb\x1d\xc9\x93\xb0\xf4\x5d\x63\xa2\xea\x9a\xbd\x0b\x7a\x04\xf1\xf5\xce\x59\x32\x80\x6c\x2c\xa9\xb7\xa2\x04\xfb\xf8\xd0\x66\xb7\xf0\xfe\x6a\xe0\xd1\xda\x68\xc8\x85\xee\x11\xf6\xf6\xdb\x7e\x83\x20\xa2\xea\x65\x0b\x53\x38\x51\xcd\xd9\x9d\x90\x3a\xa0\xb3\xfa\xa3\xc9\x50\xf7\x02\xf0\x4e\x86\xb4\xee\xb3\xa1\xc7\xbc\x85\x4b\x25\x14\xfa\x5b\x47\x66\xd3\x75\xb4\xf1\xad\x61\x07\x53\x78\xdd\x92\xfd\x62\x6c\x2b\x47\xe0\x13\x83\xea\x72\x98\x79\x59\x26\x2c\x56\x28\x62\xb4\x5b\x75\x57\x67\x14\x13\xb6\x66\x14\xbc\xc9\xf7\xbd\xb9\xee\x46\xcb\xed\x89\x65\xbf\xa5\x05\x31\x50\x90\xc7\x20\x4b\xea\x89\x17\x5b\xe5\xf2\x08\x02\xe3\xde\xdd\xcb\xd8\xdd\x64\xcf\xef\x7e\xe6\xa6\xe3\x86\x0c\xe1\xe5\x79\x9d\xf5\xd8\x10\xd5\xec\xf3\x2e\x61\x5d\x16\xdf\xf8\x7a\xbd\x4a\x63\x6e\xa1\x7a\xa4\xec\xe5\xb6\xb2\xc0\x46\xb6\x5b\x5a\xf7\x49\x86\x2b\x45\x79\x0c\x39\x17\x68\x20\xb3\x69\x01\xbe\x64\x9c\xf4\x16\x9d\xf7\xe9\x23\x95\x6d\x96\x06\x49\x50\xc5\x55\xf4\x5a\xcb\x94\x50\x7c\xfd\x0c\x3b\x33\xb0\x80\x78\x5e\x35\xc0\xd2\xb0\xad\xdc\x4c\x0a\xd3\xfb\x21\x6a\xc2\xe6\x01\xc9\xc7\xe6\x17\xda\xbd\xa3\x33\xda\xe6\x03\xcc\x9d\xb1\xfc\x62\xae\x4e\x0e\x45\xe3\xcc\xdd\x16\x6a\x67\x81\xe2\x43\xb7\xda\xa1\x38\x80\x66\x32\xf5\x38\x84\x4e\xe3\xd1\x40\xb7\xa8\xbb\x2b\x54\x01\x00\x77\x8c\x45\x8e\x06\x61\x70\x70\x5e\x5f\xb2\xc8\x80\x29\x09\x8b\x99\x2c\x39\xbc\x9f\xf6\x33\x0b\xfc\xfe\x77\x52\x32\x0e\x6e\xa0\x94\x9d\x2c\x87\x1a\xed\xc1\x87\xbe\x27\xfe\xf7\xdb\x5f\x72\xa6\xa7\x73\xed\xde\x0d\xc5\x2a\xe2\xed\x93\x1c\xb2\x68\x17\xb8\x5b\x15\x45\x89\x4d\x92\x29\x8a\xaf\x87\xcc\xbc\x78\x3e\x8d\xd6\xd1\x64\x93\xf5\x6e\xad\x2b\xa8\x52\xee\x9c\x7d\x10\x07\x44\x06\x44\x0d\x2a\x27\x9a\xbc\x87\x4f\x15\x46\x8d\xd6\x6a\x71\x7b\xac\xe3\x7b\xe7\xb7\x05\x5d\xd9\x68\x1f\x8b\xe8\x13\x29\xee\x7a\xf9\x7e\x3a\xbc\x43\x4a\xc1\xc9\x3a\xec\x58\x2f\x23\xfd\x1e\xc0\xfa\x5a\xaf\xcf\x7b\xfb\xda\x00\xff\xa9\x7a\xe3\x17\xae\x91\x8d\x34\x9d\x21\xa7\xf4\x61\x91\x42\xba\x23\xda\xce\xf7\xb3\x90\xae\x26\xa1\x7e\x2e\x29\x62\xae\x27\x00\x53\x76\xb7\x2d\x4d\xa9\xe2\x97\x96\x53\xa6\x63\x25\xa1\x46\x17\x63\x8d\xbe\x1a\x55\x40\xb6\x83\xac\x00\x17"}, -{{0x6d,0x1d,0xa5,0xb4,0x83,0xe6,0x4b,0x03,0x65,0x99,0x0f,0xf0,0x93,0x81,0xfb,0x17,0x02,0xfd,0x8e,0xc3,0xa1,0xa3,0x69,0xcd,0x52,0xe4,0xc5,0x67,0x13,0xa3,0x14,0xa5,},{0x08,0x05,0x5c,0x26,0x1f,0x26,0xe0,0x2a,0x65,0x8f,0x66,0xd9,0xba,0x01,0xfc,0xde,0x53,0xe9,0xad,0xe3,0xed,0xc6,0xbf,0x81,0x5e,0x4a,0x68,0x02,0xe1,0x67,0x7a,0xb3,},{0xa5,0xb8,0xb4,0x4a,0x91,0x44,0x4c,0x64,0x37,0x4b,0x52,0x3c,0xb4,0xdc,0xb0,0xce,0xf4,0xce,0x52,0x40,0x8b,0x98,0x12,0x6d,0x7e,0x1a,0xe8,0xbd,0xc2,0x8c,0xf5,0x14,0x70,0xce,0x4e,0x25,0x3e,0x0b,0xe6,0x2b,0xd6,0x8e,0xbf,0x5f,0xa6,0xbc,0xe1,0x58,0x5e,0xcc,0xfa,0x92,0x56,0xc0,0x73,0xee,0x03,0xe5,0x4c,0x52,0x5b,0xbe,0x2d,0x0a,},"\x79\xa2\xc3\x70\x55\xf1\x89\xf3\x24\x7f\x1f\x8c\xea\x19\xb2\xea\x40\xd8\x58\xdb\x1f\x5d\x13\x92\xee\x6d\x41\x1c\x78\x02\xee\x23\xde\x52\xad\x02\x81\x17\x25\xa9\x4d\x76\x67\x5d\xa8\x9a\x96\xb5\xd0\x7a\xbc\xee\x23\x3a\x1a\x2e\x1f\xa3\x24\xff\xf9\xe7\x8a\x4c\x19\x61\x47\xf8\x57\x0b\x0b\x13\x71\x3d\x96\xaa\x5d\x75\x0a\x15\xd7\xcd\x16\x2e\x7b\xa2\xe7\x53\x33\x60\x7d\xd6\x98\xeb\x47\x73\xc7\xe9\x1f\x76\x68\xff\x8b\x62\xf0\x46\x40\xeb\x12\xec\xf1\x22\xfc\xe6\xb8\x32\xe0\xd0\xdf\x92\x8e\xef\xd2\xc2\x00\x23\x64\xaf\x6b\xb5\x52\x91\xd3\xf5\x49\x29\x08\x5b\xe3\x38\x34\x2f\x09\xda\x73\xe2\x79\xc8\x7c\x83\x24\x55\x58\x19\xed\x57\xe7\x8d\x7a\xc4\x09\x51\xd3\x3f\x65\xb9\x4a\xa1\xe5\x55\xe9\x2a\x06\x3d\x11\xf1\xff\x7b\x12\x69\x43\x41\xe3\xfe\x44\x49\x33\xd0\x1a\xa3\x67\x53\xed\x3c\xdd\xa8\x90\xbd\xf9\x5a\x82\x05\xb5\xd8\x93\x22\x19\x91\xc7\x95\xad\x0a\x4a\x94\x6f\x58\xd4\x0a\x45\x34\x51\xaf\x21\x4f\xd4\x65\xe2\x8d\x3e\x2f\x0a\x56\xaa\x56\xde\xf8\xdc\x04\xaa\xd3\x57\x13\xab\xfc\x8b\xd7\x85\x6d\x5a\x9d\xc3\xf6\x0a\x3f\x2b\xd3\xe6\x36\x6f\x1f\x24\x4e\x94\x1d\x6a\xea\x89\x2f\x6a\x88\x93\x1f\xe1\xc3\x13\xe0\x90\x78\xe9\x0b\xc6\x39\x2d\x49\x05\x33\xc9\xea\x3f\xf6\xde\xaf\x3a\xad\xfa\x8d\xfd\xc4\xe9\x0f\x64\xaf\x47\x58\x9e\xa6\x5a\x87\xac\xd2\x19\x96\x02\x35\x1d\x3a\xfc\x21\x03\x19\x6e\x03\x94\xed\x52\x3a\xa7\x99\xd3\x1e\x11\xd3\x4f\xff\x54\x6d\x44\xf4\x36\xb3\x48\x59\xf9\xcf\xbc\x9c\xe4\x03\xde\x5a\x98\x30\xec\x3d\x45\x3f\x0d\x45\x97\x0f\x57\x2c\x14\x4f\x19\x1b\x2f\xbb\x2d\x0e\xa6\xcc\x9c\x8e\x24\xd9\xc0\xb2\x18\x3b\x27\x80\x72\xeb\xb0\xbe\x2d\x70\xd0\x37\xfd\x2e\x8e\xc1\x8d\xc4\xc9\xb2\x1a\xbd\xc6\xa4\xce\x8d\x46\x68\xa2\x20\xee\xbd\x69\x34\xf0\x4b\xaf\x0e\x88\xa4\x88\xd2\xdf\xc7\x35\xa7\xc5\xa7\x0d\xbb\x01\x66\xa2\x1a\xe0\x11\xfc\x6e\x7d\xa1\x0f\xc3\x20\x33\x62\x71\xd9\xee\xad\x51\x0a\x6f\x70\x32\xf2\x29\x66\x92\xbe\x50\x80\x21\xbc\x98\xc1\x70\xbe\x42\x35\xf7\xce\x31\xf2\xbc\xd6\x34\x11\x63\x68\x33\x76\xae\x2c\x56\x62\xcb\x47\x70\xc9\x6e\x01\x8e\xf1\xbf\x47\x91\x33\x19\xc9\xa0\x9b\x9e\x96\x5a\xb5\xc3\xe9\x7b\xbc\x75\x6a\x56\x66\xb4\x56\x7f\x2c\xff\x2d\x0c\x3a\x6a\x40\x26\x15\x8c\xb9\xf9\x0f\x95\x00\x56"}, -{{0x51,0x46,0xf5,0xb7,0xf1,0xba,0xa1,0x9f,0xc8,0xcd,0x78,0x5c,0x89,0x6e,0x0f,0x90,0xf9,0xf6,0x59,0xb7,0x7b,0x1b,0x9b,0xb4,0xad,0xca,0xb5,0xa6,0x26,0x72,0x05,0xe4,},{0x68,0x8a,0x8d,0xe6,0x4e,0xff,0x33,0xba,0x6b,0xbe,0x36,0xcd,0xd6,0xa3,0x84,0xbb,0x67,0xb3,0xf4,0x26,0x36,0xdb,0x23,0x4f,0xf5,0xef,0xe0,0xb3,0x17,0x43,0xc7,0xe6,},{0x4b,0xdb,0xd7,0xc6,0x4f,0x13,0xe2,0x78,0xc2,0x39,0x69,0xe7,0xeb,0x38,0x6b,0xbe,0x49,0x9d,0xbd,0xef,0xc3,0xff,0x4e,0x30,0xcf,0xac,0x5c,0xf8,0x6f,0x21,0x6c,0x24,0xc9,0xe6,0xcd,0xe2,0x0e,0x52,0x9d,0x14,0x7f,0xb7,0xea,0x08,0xf2,0x59,0x3a,0xd5,0x09,0x03,0xb5,0xed,0xbf,0x86,0xb4,0xd2,0x8f,0x2e,0xb3,0x2e,0xf1,0x37,0xf0,0x0c,},"\x97\xbd\x99\xf5\x18\xee\x07\x88\xd5\x76\xd9\x9c\x04\x3b\x44\x9d\xfc\x24\x2a\xc5\xee\xae\xc3\x44\xa1\x94\x32\xb3\x45\x96\x2e\xc4\x12\xce\x55\x36\x2b\x3b\x85\x1d\x98\x11\x9f\xce\xb9\x32\x83\x47\xf6\xfc\xc6\x8d\xbf\x56\xa2\x81\x4d\xb0\x9e\x93\x85\x84\x3a\x93\x11\x89\xea\x3e\x72\xda\x9d\x79\xa4\x56\x93\x05\x3c\x03\x57\x01\xdc\x55\x51\x24\x0f\x95\xb3\x03\xfb\xa1\x6f\x89\xaa\x53\xa4\x38\x82\xb0\xf1\x38\x12\x02\xc7\x8f\x9c\x74\x19\x89\x9f\x23\x51\xec\xa9\x5e\x20\xbf\xee\x76\x35\x1c\x48\xd0\x04\x99\xf5\x91\xda\x56\xa9\x95\x24\xbb\x74\xfe\x1c\x83\x4e\xe9\x10\x77\x13\x9f\x1e\xdf\x67\x31\x5c\x07\xa3\xfd\x97\xf8\x0b\x7c\x27\x6b\x6c\xf6\xb5\xcc\x36\xbe\x36\x3b\x73\x12\x17\xf6\x31\x9f\x51\x29\xba\x7b\x14\xd0\x54\xc8\xd8\x1d\x8e\x3a\x3f\x3b\xe6\x2a\xc3\x1f\xf6\x2d\xf6\xa3\xb2\xee\x25\x96\x96\x9b\x99\x17\x04\xb3\x1c\x68\x99\x97\xab\x46\x28\xbc\x26\x60\xc6\x78\x72\x13\x2e\x85\xda\x0c\x4f\xcf\x56\x79\x65\xf1\x25\x4a\x8f\x43\x26\x92\xa1\x7b\xb8\x6c\xb3\xc1\xdc\xba\xac\x93\x95\x52\xf0\x9e\x50\xec\x5b\x0d\xe2\xef\x85\xe0\xac\x25\x3a\x41\x65\x65\x5d\xb5\xb5\xc4\x98\x03\x82\x1d\x85\x9c\x60\x96\x1e\x06\x1d\x58\x27\x8b\x82\x7d\xd4\xd3\xbc\x47\xf1\xc2\x2d\xe0\x94\x90\x6b\xdb\xbf\x3b\xad\xbd\xde\x22\xba\x24\x25\x58\x55\xeb\x86\xd1\xd7\xf3\x70\x82\x05\x93\x11\xdc\x07\x28\xeb\xea\xf2\x6c\x44\x73\xba\xd1\xfa\x9e\x61\x4b\x53\x3b\x81\x1b\x6b\xcb\x06\x50\xc0\x6d\x87\x9a\x52\x45\x78\x8f\x34\x01\xb4\x61\x97\x30\x07\x74\xa9\xaa\x73\xcd\x97\x8c\x05\x30\xc8\x1a\x53\xbd\xb3\xfc\x93\x24\x14\xb3\xe3\x04\x40\xdc\x12\x74\x41\xef\xf1\x60\x5e\x7f\xd9\xac\x8c\x63\x2e\x82\xbf\x1b\x45\x3d\x4f\x33\xa5\x7e\x4b\x67\xb0\xb6\xfc\xf6\xed\x55\x55\xb5\xf5\xa3\x00\xa1\x4a\x00\xd0\x38\x5a\x33\x75\x05\x25\xb0\x0e\xdb\x31\x2c\x6b\xfd\xd6\x4e\xdd\x3b\x53\x16\xd1\x9f\x95\x8c\x51\x76\x34\xf0\x13\xb0\x08\x93\x6d\x34\xe9\xb5\xe1\xe9\x28\x3a\x5f\x0f\xd7\x78\x33\x77\xc0\xe5\x09\x06\x41\xbb\x9d\x33\x8c\xf3\x13\x3a\xcd\x0b\x97\x1e\x53\x79\x04\xf1\x7a\xf9\x29\x11\xaf\xad\x72\xee\x97\xf9\xa8\x28\x3a\x16\xa7\xe2\x6a\xb4\x28\x41\x6c\x10\x17\xda\xe9\xb1\xa9\x9c\x4c\x33\x20\xad\x16\x3b\xdc\xfc\x32\x8b\xfa\xf9\xb8\xd5\xd7\xd2\x6d\x41\xd1\xef\x21\xa5\x20\x8f\x01"}, -{{0x5e,0x6f,0xda,0xc9,0x35,0x1a,0x63,0x7b,0x99,0xf3,0x3a,0x26,0x4e,0x12,0x87,0x69,0x7e,0x2a,0xba,0xb0,0xcc,0xa1,0x66,0x21,0x79,0x24,0x84,0xf5,0x60,0x6f,0x44,0xc1,},{0x57,0xe5,0xf8,0x8a,0xcd,0xdc,0x8c,0xde,0x7d,0xd0,0x7a,0x31,0x46,0xfb,0x1d,0x4f,0x7a,0x9b,0x63,0x83,0xa8,0xf6,0xb2,0xb8,0xd9,0xb0,0x7e,0xbc,0x3f,0xc4,0xdd,0x20,},{0x98,0x7e,0x32,0xe0,0x0a,0x8a,0x16,0x32,0xf4,0x7b,0x50,0x31,0x94,0x35,0x5c,0x98,0x0c,0xb2,0x2a,0xde,0xb3,0x26,0xb4,0xe3,0x11,0x5e,0xca,0xb0,0x4b,0x70,0x4d,0x18,0x6c,0xd9,0x2e,0x3c,0x3a,0xc7,0xb4,0xe2,0x93,0x6c,0xbd,0x07,0xcb,0x79,0x4e,0xc0,0xcf,0xe9,0x1a,0x97,0x87,0x2f,0xf2,0xb4,0x13,0x76,0xf5,0xf1,0x8f,0x55,0xb8,0x05,},"\x4d\x6c\xd3\xbc\x2f\x86\x26\x6b\x8b\xb1\xb6\x1d\x0e\x1c\xaa\x9b\xd2\xd4\xa1\x80\x36\x1a\xef\x3a\x18\xd3\x90\xb1\x0f\x7e\x86\x0f\x69\x7e\x24\x7e\xb6\xc3\xe5\x1d\x3b\x97\x6b\xf0\xca\x18\x3d\x01\xa6\x98\x80\xf1\x5c\x94\xb8\x75\x66\x8c\xa3\x0d\xad\xa0\x89\x5b\xed\xd4\xd7\x05\xa0\xe0\x33\x04\xd0\x63\xde\xa8\x7c\x7f\xde\xc9\x8b\x89\xc0\x6f\x13\x0d\xd5\xbd\x58\x6b\x54\xd9\xba\x73\x78\x26\xbb\x40\x5c\xd8\xac\x8b\xbc\x95\x00\xac\xda\x3c\x07\x46\x1d\x00\x94\x40\xaf\x0b\x25\x31\xe7\x2f\x3f\xf5\x01\x6a\xe2\xd8\x6d\x69\xb8\x7f\xb2\x73\xd1\xe8\xdd\x5f\x6a\x26\x4b\xee\xbb\x2f\x88\x59\x96\x74\x1f\xfd\xa2\x77\xa0\xfb\xf8\xef\x08\xf8\x1f\x22\xee\x59\x61\xd9\xd3\xfc\x93\x83\x62\xe1\xca\x12\x00\x4a\x91\xd9\xb5\xf7\xa6\x83\x3a\x6c\x22\x95\x5a\xc0\xcd\xa3\x39\x06\x71\x91\x0c\xbd\x51\xe6\x85\xfe\x09\x59\x73\xe4\x15\xfc\x2d\xb8\xad\xf1\x0b\x14\x7e\xc7\x08\x0c\x3b\x8e\xbd\x07\xd2\x1b\xb9\x55\x6d\xa8\x54\x30\xa2\x68\xee\xd8\x48\x6b\x1e\x31\xc9\x43\x13\xb0\x16\x49\xfe\x91\xb2\x22\xf8\x5a\xde\xe1\x5e\xb7\x77\x07\xd7\x8f\xfc\xb6\x60\x92\x65\x44\xd3\x3b\xe9\x99\x4a\x29\x76\x20\xdc\x7a\xed\x97\xf3\x92\x63\x90\x53\xf3\x88\xb0\xb3\xaa\x3b\xd0\xac\x5b\x03\x3c\xb4\x14\xbe\x52\x0b\x43\xdf\x68\x26\xb9\x76\x89\x0d\x0c\x53\xb9\x7b\x6c\x92\xe7\xd1\xa1\x57\x3d\x0c\x74\x94\xd7\x47\xe0\xca\xd9\xbd\x8e\xa5\x38\xd6\x2a\xd5\x98\x01\xad\x07\x16\xf1\x70\x19\x3e\x30\x09\xd9\x95\x9c\x55\xd2\xff\x64\x79\x9b\xd9\x59\x35\x9a\xbb\x94\xca\x97\x23\xb5\xff\xc2\x4c\x95\x07\xf8\xc5\xfd\x6e\x88\xea\xae\x7a\x70\xad\xd8\x4d\x74\x4c\xcf\x8b\x98\x36\x37\x88\xf0\xbf\xb1\xa0\x25\x22\x02\x57\x51\xe5\x34\x71\x0d\x40\xa2\xd3\x8a\x79\x11\x94\xeb\xa2\x93\xfd\x20\x46\xcc\x14\xdd\x38\x76\xd1\x68\xfc\x6e\x23\x6c\xbe\x14\x6d\x63\x69\xd2\x25\xbf\xa6\x7e\x53\x97\x98\x65\xf7\x88\x73\xa9\xfc\xf0\x3c\x18\x6f\xa8\x52\x1f\x0a\x55\x45\xac\xce\xe8\x0d\x1e\x55\x10\x72\x21\xe2\x1f\x0f\x22\x91\xc1\x43\xde\x02\x3e\x88\xd7\x33\x0c\xc8\x7d\x4c\x51\xff\x29\xa3\x09\x06\x05\xe9\x73\x94\x90\xc1\xdc\xee\x71\x34\x95\xf2\x31\xc2\xa3\x6b\x11\xab\x23\x55\x47\xfb\x63\x28\xf7\x47\x33\x6d\x9b\x1e\xf2\x5a\x8a\xb9\x9c\xed\xa9\x57\xb2\xdc\xce\xe4\x07\x5b\x0d\x03\x38\x1b\x94\xae\x18\xd0\x41\xea"}, -{{0xfc,0xff,0xf0,0x93,0x2d,0xc8,0x6e,0xa5,0x90,0x2a,0x8d,0x33,0x07,0x33,0x29,0x96,0x0c,0xd8,0x18,0x8a,0x07,0x5d,0xd0,0xbc,0xdf,0xa8,0x38,0x2c,0x20,0xb0,0xe7,0x8f,},{0x0c,0x92,0x05,0xa9,0x0b,0xbe,0x7f,0x2d,0x50,0x5e,0x17,0xfa,0x3d,0x08,0x0b,0x52,0x2a,0x1d,0x7a,0x15,0x2c,0xad,0x2d,0x85,0xd3,0x1b,0x34,0xa0,0x47,0x1c,0x0d,0x4c,},{0x37,0xdd,0xd8,0x3f,0x98,0xb0,0x57,0xb7,0xcb,0x32,0x08,0xa8,0x32,0xc5,0x8a,0xa9,0x06,0x94,0x56,0x3c,0x23,0x54,0x8d,0x43,0x22,0x91,0x38,0x0b,0x73,0x59,0x13,0x01,0xf2,0x74,0xb0,0x4c,0xee,0x2e,0xf7,0x8c,0x06,0xd9,0x6c,0x3d,0x9b,0x7c,0x17,0x52,0x1a,0xae,0x1a,0x8c,0xa5,0x0d,0x34,0x7c,0x09,0xc3,0xcf,0x70,0x3b,0xc8,0x83,0x0b,},"\x3d\x4b\x76\x12\x23\x73\xe2\x12\xa3\x46\xd1\x9a\x66\xbb\xfc\x4b\x62\x32\x92\x64\x9b\xd0\xce\x5c\xf6\xbb\x13\x56\x48\xbd\x01\xdb\x74\x03\xb3\xd0\xbd\xd1\x69\x7f\xf4\xe6\xe9\x08\x90\x41\x16\x75\x4d\x37\x0c\x40\xd7\x00\xcd\xb6\x64\xc4\x6a\x91\xdd\x84\xa3\x58\xb9\xd2\x38\x14\x43\xe6\x0f\x2c\x3f\x56\x40\x26\x1b\x6b\x85\x8b\xa8\xf8\x28\xb0\x97\x1f\x41\x22\xb2\x02\x88\xa2\x6b\xa2\x09\x0b\xa1\x4f\xd2\x76\x36\x0c\xc6\x86\x79\xcd\x84\x19\xae\x19\xc6\xd4\xdc\x7b\x66\x14\xc0\x6d\xf5\xe5\xc0\x51\x0e\x2c\xb6\x86\xde\x0e\xbd\x75\xe5\x21\x0a\x21\x55\x62\x58\x9b\x28\xc9\xcc\xc7\xd2\x72\xb9\x8b\xd4\xbf\x93\x49\x5e\xfe\x4f\xc5\xb7\x8d\xef\xec\xfb\xca\xa9\xfe\x12\x6b\xad\x30\xe8\x9b\x3a\x38\x9b\x42\x56\xf6\xa4\x8a\x76\xc3\x45\xde\x5a\x36\xa1\x44\x9f\x08\x34\x5b\x9a\x5e\x6a\x00\x1d\xa1\xff\x9c\xd4\x33\x70\x93\x48\xe9\xae\xfb\xc7\x8b\xa5\x2d\x3a\xb3\xb4\x69\x86\x93\x5e\xba\x8e\xcf\x81\xed\xc4\x3c\x5b\x2e\x3b\x5e\xb3\x8d\x9a\x16\x5e\x9e\x7f\x72\xf6\x17\x60\x54\x63\xbe\xdb\xa9\x73\xeb\xfd\xcd\xf2\xb0\x88\x9c\x71\x41\x2f\x8f\x85\x0c\x7a\x3b\x55\x18\xec\xd8\x9d\x2e\x25\xc0\xc1\xc3\x0f\x08\x5a\x0f\xfe\x54\x0e\xf9\xc0\xe8\x8f\xc7\xec\x4a\xf1\x94\x8a\x4e\x6f\x7a\x6e\x25\x6b\x30\x7a\x11\x27\xb7\x1b\xa6\x86\xef\xea\xdc\xa0\xe4\x86\x09\x47\xcf\x67\x4f\xce\xd6\xca\xf7\x31\x0c\xcb\xaa\x8d\x90\x47\xda\xed\x30\xfd\x55\x85\xd4\x1d\xde\xae\x4d\xf2\xfe\xd4\xb6\x22\x80\x32\xc3\xe4\xae\x23\x80\xe8\x7e\xc6\xcd\x72\xe4\xd7\x4b\x8b\x4c\x38\x13\xfb\x04\x33\x89\x39\x1e\x9c\x13\xf7\xd3\x3c\x3a\xab\x5a\x78\xfc\x4c\x6a\x63\x4c\x61\xa7\x0f\x02\xa9\x40\x54\x8d\xa1\x77\xc6\x5d\xf6\xab\x17\xcd\x96\x83\xf3\x7e\xa8\x21\xc7\x40\x88\x9d\x82\xe8\x8c\x83\x4e\x7d\x5d\xc1\x16\x62\xea\x78\xb1\x3c\x6a\x4b\x62\x18\xd3\x17\x84\x21\x9a\x47\x67\x59\x5b\x1a\x56\x21\x65\x25\xcd\x68\x93\x8b\x22\xbd\xb1\xf8\xc5\xa7\xf1\x70\x1a\xfe\xb9\x61\x88\x8e\x2e\x0e\xc0\xc8\x38\xcd\x62\x0c\xb7\xdd\x8a\x14\x93\xa0\x2c\xd5\x6b\x54\x51\x25\xe4\x70\x0c\x08\x89\xfa\x26\x44\xe6\x44\xa3\xaf\x53\x1d\x1c\xd6\xbc\x95\xe5\xdf\x91\x75\xf1\x37\xf2\x84\x08\xcb\x69\x9c\x7a\xe6\x6f\x65\xd1\xd2\x93\x0f\xac\x57\xca\x8a\x60\xe6\x31\x1a\x40\x78\x48\x8c\x9e\xa4\x04\x94\x8a\x9d\xeb\xeb\x9d\x5e\x10"}, -{{0xa1,0xe4,0xfc,0xfd,0xe0,0x44,0xf1,0xbb,0x0e,0x7b,0xbc,0x63,0x1a,0x83,0x1a,0x8d,0x07,0xe9,0x0a,0xe0,0x8a,0x96,0x6a,0xd6,0x27,0xb6,0x20,0xb1,0xe2,0x8c,0x42,0xcf,},{0x25,0x56,0x0f,0x31,0x16,0x8b,0xd4,0xb7,0x25,0x52,0xed,0xed,0xd0,0x8b,0xb6,0xbf,0x79,0xa9,0x40,0x63,0xc1,0xf1,0xe1,0xd3,0x04,0x86,0x9d,0xd1,0xce,0x04,0x9b,0x95,},{0xc8,0x00,0x15,0x27,0xbd,0x90,0x2c,0x15,0xc3,0xdd,0x5a,0xe1,0x81,0x80,0x52,0x5b,0x5e,0x82,0x02,0xbe,0x66,0x71,0x1f,0x82,0x88,0x5c,0x82,0x22,0xa1,0x5f,0x06,0x00,0x92,0xa2,0xa6,0xe2,0xf7,0xd7,0xe9,0x80,0x31,0x12,0x09,0x19,0x1b,0x32,0xb8,0xad,0xe4,0x8d,0x3e,0xa9,0x8c,0xf2,0x45,0xf0,0xfa,0xd6,0x2c,0x00,0x9c,0x5a,0x71,0x08,},"\x8c\x14\x54\xd4\xe0\x8a\x14\x01\x64\x6b\xf7\xa8\x85\x9e\x8a\x14\x5e\x85\xee\xeb\x40\xdb\x38\xff\x01\x69\x70\x96\x41\x21\x2c\x81\xb6\x73\x90\x74\x9c\x01\xa7\x98\x07\xf3\xcc\xad\xbb\xd2\x25\x6f\x36\xff\xc1\x80\xcf\x9b\xa4\x4b\xf4\xa7\x61\x2d\x44\x1c\x23\xb2\xe2\x5d\x33\xc4\x8a\x73\xe1\x6c\xe3\x57\x56\x27\x58\xad\xb0\x05\x53\xc3\x14\x2f\xb8\x17\x6b\x6a\xe8\xfb\x61\x0a\x60\xf9\x23\xb0\x91\x18\x14\xb1\x0f\x56\x79\x93\x6c\x36\x77\xb7\x0e\x84\x6e\x21\x8f\x58\x75\x67\xf2\x01\x9c\x7d\x28\x2a\x10\x7f\x3c\xc8\x47\x63\xad\xae\xc8\x89\x93\xc0\xcc\x50\x03\xe7\x7a\xf6\x0d\x67\xdb\x53\xf8\xcb\x72\x7a\xa6\x67\x2d\xe0\x04\x49\x8c\x3b\x3e\x22\x2a\xa7\x08\x2d\x91\xf9\x8a\x1a\x06\x83\x74\xc5\x10\xff\x53\xa5\xe5\x59\xcb\xe2\xd6\xc7\xc3\x44\x2d\x72\x38\x90\x7c\x81\x1d\x58\xaa\x7f\x5a\x46\xb8\x31\x12\x44\xf0\xdb\xe1\xb9\xc0\xe9\x44\xdd\xa1\xd8\x01\x08\x64\x94\x9c\x59\x39\x6c\x6b\x34\x6a\x11\xf3\xaa\x86\x6d\x6b\xce\xad\xfc\x90\x90\x38\xd2\x2e\xfb\xc8\xf1\xda\xc8\x10\xa9\xf2\xfa\xfc\xce\x7c\x03\x89\xeb\x0a\x56\xc0\xf6\x8c\xae\x24\xae\x3d\xdb\xdf\xf7\x11\x6d\x2f\xad\xeb\x9b\x0e\x75\x09\x53\x6f\xdc\x3b\x83\xe7\x13\x54\xda\x6a\x1a\xed\x16\x88\x74\x90\xdc\x2f\x4d\xf5\x7b\xba\xa7\x24\x45\x28\xfa\x30\x94\xb9\x9e\x86\x75\x81\xac\xef\x90\x62\x70\xb2\xcf\x4d\xed\xa6\xb8\xfd\x9d\xbb\x79\xad\xd7\xbe\xa8\xf8\x6f\xcb\x1f\x64\xdf\xd5\x0e\x38\x5b\x42\x09\xec\x0b\x1a\x9f\x6d\x2e\x51\x90\x68\x29\x7a\x2b\x5c\x40\x5c\x21\x6b\x4a\x2e\xd9\x83\xff\x69\xc5\x9b\x53\x0e\xff\xa6\x0c\x03\x67\x05\x12\x67\xdd\x2b\xbd\x1e\x86\xa9\xab\x5a\x11\x4d\xd4\xf6\x9b\x54\x0b\xfa\xbf\xe9\x7c\x04\x03\xb8\xfc\xbb\x27\x62\x57\x61\xed\xa3\xe2\xad\x8e\x62\x5c\xfe\x4b\x61\x5b\x70\x25\x53\x1a\x49\x89\x18\xc2\x4e\x02\xa0\x0e\x79\x7b\xba\xfd\x14\xf9\xd3\xf6\x82\x7e\x39\x00\x63\xc4\x36\x08\x06\x88\xd0\x37\xa6\xe2\x99\x3c\x56\xd3\xa8\xe9\x5f\x37\x5c\x10\x04\x0b\xf0\x4f\x03\x0c\x97\x26\x23\xd9\xe3\x80\x1c\x13\xb4\xec\x8d\x01\xcf\x18\x38\x55\xf5\x93\x5f\x10\xdd\xb2\xc5\x4c\x51\xc8\x0c\xbe\xd0\xc2\x4d\xb5\x6e\x1e\xd1\x48\x93\x1d\x89\x16\x1c\x5e\xa3\x7c\x2f\x97\x87\xf8\x8e\xf7\x33\x0e\x5d\xcd\x0e\x43\xd8\x1b\xfc\x8b\xf2\x3d\xdf\x79\x83\xcc\x1d\x73\x38\x43\xa3\x3c\xcb\x39\x5d\xfc"}, -{{0xbe,0xd1,0xbb,0xca,0xe1,0x86,0x43,0xd6,0xf6,0xaa,0xc3,0x4f,0x3d,0x9b,0x6a,0x14,0x78,0x39,0x4d,0x02,0xb9,0x31,0xcf,0xf0,0x06,0xd8,0x5f,0x21,0xb7,0xdb,0xc7,0x47,},{0x4f,0x52,0x8b,0x38,0x18,0x5a,0x42,0x4c,0x6f,0xde,0xce,0x46,0x51,0x1a,0x0c,0x29,0xb7,0xc0,0x4b,0x32,0xeb,0x04,0x83,0xab,0xb5,0x2d,0x5f,0x8e,0xb6,0xb3,0x52,0xeb,},{0x0f,0xc9,0x9d,0xd3,0xb9,0xa0,0xe8,0xb1,0xfc,0x6e,0x63,0x5a,0xf5,0xc6,0x40,0x06,0xb6,0x72,0x00,0xfe,0x95,0x8f,0x53,0xcc,0xe1,0xb9,0xb0,0x91,0xa4,0xe7,0x06,0x69,0xb5,0x93,0xf1,0x55,0x94,0xbc,0x08,0x42,0xe5,0x57,0x62,0x59,0xf9,0xa6,0x85,0x9a,0x0d,0xb2,0x2d,0x74,0x0f,0x9f,0x80,0x24,0xb5,0xba,0xf1,0xef,0x6f,0x95,0x8c,0x05,},"\xff\x7c\x64\x13\xe6\x18\xa0\x56\xde\x40\x1e\xe1\x0c\x40\xad\xe3\xd7\xc0\xe6\x86\x14\x95\xd9\x7c\x26\x89\xec\x6a\xbb\x69\xdd\x2a\xe7\x01\xfd\xca\xc8\xf0\x83\x31\xea\x5c\x5f\x5d\x80\x5b\x57\x89\xee\x5e\x24\x1f\xf4\xac\x8b\x96\x0f\x4f\x2b\x9f\xef\x6a\x72\x7f\xad\x86\xdc\xd4\x32\xde\x9f\xad\x6b\xa4\x5e\x00\xaa\x36\x87\xb0\xce\xeb\x2c\x0d\x43\x0b\x7d\x5f\xde\x63\xb4\xf6\xb9\x82\xc4\xf9\xe0\x3c\x43\x0a\xba\xd9\x04\x4d\x06\xdc\x49\xe8\x9d\xf4\x81\x40\x5d\x8f\xeb\xbb\x06\x53\xe9\x68\x69\x48\xaa\xd2\xd9\x07\x25\x44\xdf\x94\x24\xfd\x48\x7f\x4e\x24\xba\x7f\x24\x55\xdd\xec\x41\x05\x82\x8c\x39\x81\xbd\xdb\xb1\xb7\xfb\xdb\xac\x15\x59\x03\xe9\x60\xfc\xd9\x4c\x07\x16\xe7\x36\xf5\x19\x86\x7f\xbc\x52\xc5\x12\x60\xf5\x71\xd7\xed\xcb\x08\x1a\x23\x55\x0a\xd8\xc7\x0b\xb2\x68\x86\x4a\xb2\x76\xaa\x2c\xc2\xdb\xf6\x23\x83\xbb\x66\x03\x0e\xbe\x94\x35\x41\x74\xcc\xec\x2d\x2a\x90\x75\x78\x55\x64\x44\x50\x7c\xbf\x84\x88\xbb\x23\xc6\x24\x23\xa3\xa9\x8d\xa7\xcc\x96\x8f\x59\x9d\x3d\xc8\x4d\xca\x3a\xfa\xd7\xf1\x4e\xc3\x06\xe1\xdb\x53\x41\x43\x21\x6a\xa2\x2a\xd1\x80\x74\xc7\x19\x57\x08\x05\xea\x46\xbc\x86\xb7\x1a\x8f\xf5\x8e\x41\xe7\x3c\xb2\x9a\xd5\x75\x0f\xcf\xc9\xa1\xc5\x42\x92\xb6\x4b\x47\xec\x95\x38\xf5\x38\x16\xe3\x6e\xd0\xd0\xc1\xae\x5e\xad\x06\xd4\x77\xaa\x97\x5e\xce\xba\xf6\x2d\x90\x23\xb7\x7e\x50\xe7\xb6\xd4\xab\xda\xa4\x85\xea\x34\xec\x76\x6b\xeb\x1d\x9b\xa0\x3c\x9c\x06\x71\x86\xe2\xe3\x82\x66\xc6\xe2\x53\x1e\x97\x48\x02\x14\x63\x8a\x2b\xb3\x14\x31\xac\x20\x86\x79\x71\x55\xfc\x77\x5b\x3a\xad\x8d\x5a\x0b\x90\x4c\x38\x1e\xdd\x0c\x6b\xc2\x3c\x66\xa1\x90\x49\x55\xed\x45\x0a\x9c\xbd\x16\x45\x9c\x32\xf5\xca\x35\x4b\xbc\x2d\xa7\xb1\xa4\xd8\x14\xf1\xb8\x71\x0a\xad\xb2\xcc\xc4\xf3\x97\x75\x8b\x7e\x9d\x91\xf3\xa9\x1e\x58\x25\xab\x86\x82\xff\x5e\x41\x70\x2e\x07\x84\x1a\xc7\x69\x8c\x3d\xa9\xf5\x58\xed\xd0\x1f\x86\xce\x2c\x50\x6b\xf4\xc2\x14\x9a\xc9\xc1\x95\xa5\x9c\x7d\xd7\xd4\xec\xf9\x3c\x90\xb4\x42\x3b\x43\x50\x58\x8d\x41\x67\x2c\xed\xc8\x51\x0a\x7a\xd5\x3b\x4b\x7e\xdc\xaf\x23\xe4\x3e\x05\x66\x9d\x27\xa1\xfe\x97\xb7\x87\x30\xd3\xfc\x06\x0b\xd4\xed\xd9\x87\x2c\xff\xb9\x62\x85\x35\x1b\xef\x14\x8e\xf7\x83\xab\x39\x21\x16\xbd\x7b\x90\x7b\xad"}, -{{0xc7,0x18,0x82,0x3f,0x43,0xdb,0x22,0x17,0xc6,0x6a,0xb2,0x89,0x97,0x04,0x16,0x5d,0x20,0x85,0x73,0xde,0x60,0xf3,0x3b,0xc0,0xb9,0x33,0x8d,0x88,0x0f,0x19,0x3f,0xb5,},{0x29,0x40,0xb8,0x79,0xb6,0x3f,0x2c,0xb1,0xf6,0xe3,0xef,0x9c,0x9d,0x33,0x3b,0xa9,0x17,0x70,0xfe,0x18,0xcc,0x5a,0x34,0x7f,0xdf,0x12,0xb0,0xef,0xc5,0xca,0x2e,0xc9,},{0x4c,0x9c,0xdb,0x1a,0xd4,0x65,0x09,0x56,0x0d,0x87,0x1d,0x30,0x89,0xaf,0xb8,0x73,0x46,0x48,0x20,0x1b,0x10,0xac,0xc9,0x53,0xe8,0xb6,0x1f,0x2c,0xce,0x2d,0xba,0xe0,0xfb,0x9b,0x86,0x8a,0xc9,0x57,0x43,0x2b,0x72,0x22,0xdb,0xf7,0xe4,0xcf,0x0b,0xc7,0x53,0x09,0xbe,0xa3,0x60,0xb2,0x63,0xab,0xbd,0xe1,0x88,0x53,0x2d,0xda,0x25,0x04,},"\x05\x0e\x68\x77\xf6\x5e\xc7\x26\xee\xc7\x01\x86\x3f\xab\x14\x0b\x99\x4a\xa1\xe9\x2a\x48\x7d\xb1\xa1\x87\x01\x31\x20\x57\xdb\x44\xbf\xde\x70\x91\x1e\xc2\x6e\xaa\x28\x63\x2d\x03\x79\x4d\x54\x5d\xfc\xb2\xae\xd4\x34\x0c\xab\x7d\x09\x25\x95\xcd\x59\xed\x23\x99\x40\x43\xf5\x0b\xa6\x96\xe9\x80\x2b\xd6\x49\x90\x12\x13\x97\x28\x64\x57\xae\x69\xd7\x6c\xb8\xe3\x4d\x7c\x1a\xb2\x45\xcb\x07\xb1\xb4\x08\xf2\xbb\xbf\xdf\x33\xa1\xbd\xd5\x59\x63\x67\x02\xc9\x18\xf9\x82\xc2\xac\x02\x21\xf7\xf9\x4d\xb9\x1e\xde\xfc\xe2\x81\x18\x25\x9f\x89\xd9\x94\xda\xd5\xbb\x01\x3c\x67\x8c\x1c\x33\x8b\x65\x39\x6b\x15\xe8\x89\x9c\x16\x99\x21\xf2\x78\x85\x9c\xe0\xc8\x56\xd8\x89\xb8\xc6\x34\x18\xeb\xc5\x73\xd2\xd6\x25\xd5\xb5\x93\x88\x39\xf2\xb1\x69\xb6\x91\x6d\x8e\x40\xdd\xe7\x0d\x3b\x72\x88\x7a\xd2\x47\x8e\xf6\xfb\x12\x84\xfa\x0e\x4f\xc5\x24\xe3\xc6\xfa\x1d\xd2\x2b\xa6\xb8\x1d\xef\x82\x79\xf3\x82\xbc\xb4\x50\x48\x85\x1b\x17\xcd\x65\x9d\x59\x40\x9f\x57\x1f\xa8\xa9\x20\xa2\x09\x34\xd9\xdb\xe1\x02\x2d\x63\x58\x40\x96\x54\x00\x24\x0f\x87\x0a\xce\xff\xd5\xdb\x7c\x7d\xf0\x8a\xf8\x9e\x47\xe1\xb9\xe2\x0b\xb9\x9f\x96\xab\x07\x3e\xdf\x53\x69\x4c\x74\x82\x89\x0e\x36\x31\x34\x02\x17\xe6\x87\xab\x27\xc9\x84\xb6\x08\x25\x16\x94\x57\xd4\x35\xa5\x40\x9a\xd8\xe4\x2d\xa0\xaa\x63\xe2\x0c\x2b\xc6\x7b\xd8\xb9\xa2\x67\xf3\x96\x73\xa7\x7f\x7f\x31\x36\xdc\x5c\xb2\xd2\x49\x48\xdb\xe7\xbc\xd7\x12\x93\x18\xc6\x8c\x6f\xe9\x5d\xd4\xdd\x4f\xe9\x42\x28\x68\x31\xea\x53\x35\x2f\xbb\x25\x2a\x12\x88\xbc\xd8\x38\x92\x13\x56\x78\x5d\x07\x21\x34\xcb\x82\x0f\x62\x79\xcc\x71\x46\x1f\x43\x1b\xe9\xd3\x01\x47\x24\x32\x1c\x92\xfd\xc5\x76\x32\x01\x37\x70\x5c\xff\xb2\xc2\x36\x64\xb7\x05\xe9\xbe\x60\xae\x1a\x19\x0f\x3e\x34\x84\xf7\x00\x58\xe7\x02\x40\x7b\x05\x6d\x7f\xe5\xd3\x1c\xee\x9c\x2a\x6a\xc6\xea\xda\x35\x16\xab\xc5\x51\x72\x56\xdf\x12\x43\x78\x0a\x03\xbb\x00\xba\x00\xce\x24\x80\x76\xee\xca\x6f\xee\x91\xd5\xef\x9e\xb9\x07\xb8\x01\xaf\x09\x7f\x3e\x9e\xb2\x56\xbd\xcd\xe8\x1e\xfe\x4b\xaf\x81\x89\xb0\x39\x9e\x36\xf1\xea\xa3\xab\x62\x66\x17\xcf\x3b\x47\xdd\x89\xca\xf6\x9c\x64\xc5\xb8\xf6\x8b\xd9\x17\xfe\x03\xe4\x66\x85\x38\x46\x0a\x1b\xe8\x8d\x9a\x84\x6c\xef\x39\x93\x46\x27\xd4\x74\x73\x4f"}, -{{0x25,0x43,0xd1,0x66,0xc9,0xf5,0xf7,0x42,0x7f,0xf3,0x03,0x4f,0xfa,0x81,0x03,0xcb,0x11,0x7b,0xf4,0x72,0x33,0x1a,0x73,0xd9,0xa2,0xf1,0xbc,0x0a,0x02,0xa6,0xff,0x1b,},{0x42,0x67,0x8c,0xf3,0x85,0x70,0x21,0xaa,0x55,0x67,0x70,0x6d,0xb0,0x31,0xe7,0x92,0x71,0x5c,0xca,0xf8,0xab,0xb0,0x2a,0x04,0x2b,0xad,0x17,0xdb,0x3d,0x5f,0xa1,0x03,},{0x20,0xea,0x93,0x68,0xa2,0xcc,0xd0,0x8b,0xf9,0xcb,0xf4,0x8d,0x4a,0x2f,0x7d,0x03,0xf0,0xdb,0x08,0xa5,0x4b,0x87,0x67,0x9c,0xda,0x03,0xe2,0x96,0xaf,0x9e,0xf3,0x78,0xbe,0x9b,0x8f,0x04,0xb4,0x06,0x5b,0x00,0x9d,0xa6,0xdb,0x01,0x6f,0x3d,0xf9,0xdb,0x64,0x82,0x58,0x73,0xe2,0xfb,0x4d,0xe3,0x04,0x49,0x91,0x5c,0xd7,0x3c,0x46,0x09,},"\x74\x6d\x7a\xbf\x0b\xfb\x26\x62\xc2\x5a\xb5\xc5\xe4\x61\x2c\x30\x6f\x16\xd1\x3e\x44\xd0\xdb\x39\x4a\x00\x15\x67\x6c\xe6\x09\x78\x4f\x03\x23\xda\x1d\xfa\x94\xd2\xb2\xf1\xf6\xe0\x24\x44\xa9\x36\xd0\x19\xb1\x43\x02\x1f\x73\xc7\x9d\xf9\x30\x9e\x7b\xdf\xf3\x9d\xae\xec\x4c\xac\xa0\x0c\xba\x4e\xf3\x1c\x83\x10\xc1\xa0\x8e\xf4\xb3\x6f\x81\xc3\x77\x84\x6b\x5b\x90\xac\xd4\x11\xaa\x67\x1e\xd7\xaf\x27\x8a\x24\x22\x9b\x78\x93\xc1\xb4\x15\xd7\x98\x88\xd7\x63\x7f\x5c\xb5\xc9\xc6\xc6\x31\xae\x5f\xfa\x29\xf1\x34\x0e\x44\x40\x96\xab\x53\x36\x17\xfd\xcb\x80\xff\x81\xda\x0a\x7c\x6c\x14\x2e\xe0\xfe\x5e\xa8\x2f\x68\xcc\x3e\xa3\x8b\x56\xf2\x72\xb0\xd8\x0f\xd5\xf4\xf5\x5c\xa9\x34\x8c\x16\x18\x81\x43\x58\x13\xc3\xfa\x9f\xff\x66\xa2\xee\x6d\x5b\xd3\xed\xba\x0d\x2f\x9a\xa7\x4b\x1c\x44\xbf\xd0\xe6\x46\x78\xd3\x71\x51\x24\x96\x3a\xc5\x75\xff\xb0\x9e\xe1\x64\x37\xda\x48\x4b\x3b\xa5\x8e\x5a\xeb\x8e\xd8\xc5\xc0\xf4\x7b\x59\x90\x8f\xe5\x80\xf3\x7e\xc1\xde\x26\x6b\x29\x5d\x6b\xe8\x5e\x62\x35\x8e\x9b\xbd\xc7\x89\x64\xfb\x83\x7e\xea\x29\xfd\xb7\xde\x86\xcc\x56\xf4\x8b\xd9\xa3\xe6\xe2\xbe\x51\xd8\xa1\xdc\xff\x3c\xa4\xd5\x6e\xa9\x34\xc6\x82\x77\x2b\xca\xfb\x51\x49\x7b\xe5\xd0\xf2\xa2\x3d\xd4\x97\x0c\x02\xc4\x4c\x09\xad\x89\x7b\x42\x41\xac\xd7\xd6\xab\x12\xd8\xf0\x0c\x9a\xad\xc3\x34\xb4\x31\xfe\xc5\xbb\x69\xa2\x85\xb7\x55\x0a\x63\x9e\xce\x96\x95\x26\x82\xb7\x33\x4b\x68\xc6\x51\x52\xe8\x93\xb1\xc8\x10\x0c\x69\x4d\x8c\x5c\xfe\x26\xac\x03\xc1\xf3\x91\x4e\x65\xc8\x4f\x0e\x77\x72\x90\xc7\x6f\x6a\xcc\xe3\x40\xbf\xf6\x6d\xa7\x22\x0f\x73\x17\x5e\x94\xaf\x52\xf9\xf1\x9e\x61\xf8\x0d\xc1\xf3\x57\x16\xb3\xf4\x8d\xfa\x50\x25\xc9\xeb\xef\x73\x82\xe0\x55\x83\x0f\x5b\xbf\x15\xc6\xf6\xa9\x50\x32\x90\x9c\x89\x2c\x0f\x89\xc8\xc1\x5f\xc3\xea\x40\xa2\x0e\xe1\xa4\x52\x9b\x52\x19\x51\xdf\x44\xd9\xd7\x9d\x74\xe0\xc4\xc2\xe0\xfe\xd8\x49\xb8\x78\x52\x06\xdb\xe6\x2b\xfa\x2c\xa2\x10\x87\xa9\x12\xe9\xb1\x84\x55\x16\x59\xcd\x8a\x58\x7e\x95\xb0\x43\x17\x19\x25\x96\xbb\x0b\x7f\xc9\xf7\xbb\xb6\xee\x04\x9c\x8b\x02\xfd\xd7\x58\xb4\xe7\x98\x82\x07\x3b\x71\xea\xab\x18\xaa\x29\x37\x01\xc1\x7d\x55\xf9\xec\x46\xc5\x2d\xe1\xe8\x86\xb6\x75\x0f\xb0\xfb\xcd\x64\xf4\x56\x8a\x21\x0a\xe4\x51\xe9"}, -{{0x85,0xe0,0xa8,0x0f,0x3b,0x30,0xc2,0x01,0x99,0xd9,0xc1,0xec,0x66,0x2e,0x39,0x2f,0xdf,0x15,0x46,0x37,0x73,0x43,0xf1,0x24,0x71,0xdb,0x2a,0x03,0x10,0xa7,0x05,0xbd,},{0x54,0x0a,0x3a,0x1d,0x83,0x67,0x2e,0x49,0x50,0x34,0xcf,0xf4,0x08,0xe1,0xfb,0xe8,0x2e,0x53,0x8f,0x09,0x17,0xe8,0xa1,0xc7,0xd1,0x7a,0xab,0x58,0xe0,0x43,0xd3,0xc6,},{0x18,0x5e,0xf2,0x24,0x6a,0xba,0x2b,0x1a,0x56,0x80,0x32,0xc7,0xdf,0x93,0xc6,0x67,0x79,0x9b,0x8a,0x52,0x1a,0x6f,0x97,0x32,0x1e,0xad,0x58,0x66,0xb4,0xcb,0x9c,0x65,0xb6,0x4a,0x1c,0x40,0xb9,0xb6,0xa9,0x10,0xe7,0x42,0xdc,0x32,0xa7,0xe6,0x6d,0x11,0xea,0x45,0xdb,0xea,0xac,0xae,0x9f,0x09,0x51,0x1b,0x81,0x01,0xf8,0xaf,0x0c,0x0c,},"\xd2\x80\x2f\x15\x96\xf8\x38\x3b\x64\xed\xbd\xc5\x94\x06\x0b\xff\x0e\x70\x13\xd5\xb7\xc8\x5d\x83\x0f\xae\x11\xae\xb3\x4d\xd5\x94\x95\x9d\xa6\x24\xe0\x44\x47\x4c\x54\x09\xc0\x05\x96\x73\xbd\xc6\x1a\x67\x1e\xf5\xb0\xb8\xa2\x6f\x30\x10\x0b\x3b\x73\x96\x8d\x8e\x4d\x83\xa7\x2f\x25\xb5\x13\x44\x8d\x2f\x6b\x6a\x44\x75\xfd\xf8\x9e\x31\xca\x92\x68\xa3\x07\x05\xaf\x3f\x64\x9e\x3f\xe0\x1d\xde\x0c\xf4\xb2\x9e\xc2\xda\x54\x36\x44\x4a\xf0\x91\xd6\x27\x30\xac\xd4\xca\xb6\x08\xf0\xdf\x26\xf0\x88\xc6\xb9\xb9\x67\x37\x94\xf0\x74\x7d\xab\x2c\xe1\x90\xf9\x05\x92\x00\x9f\xdc\xe5\x46\x4b\x36\x61\xb7\xe8\x62\x0b\xad\x65\x50\x9a\x6c\x75\x2b\x72\x7a\x8d\xc8\xd3\xef\xa5\x84\xfd\xe0\x27\x2c\x45\x1d\x65\xa9\x3b\xec\xe4\xf5\x9d\x87\xdc\x6f\xbe\xb4\x51\x40\x1e\x3e\x2e\x00\x3c\x6a\xca\x7b\x3d\x3f\x92\x71\x91\x50\xc6\x77\x8f\x01\x5a\xff\x2a\x59\xbf\xbf\x2e\x91\xb2\x1b\x0a\xd6\x87\x75\x36\xeb\x54\x56\x70\x59\xf5\x87\xf5\x4d\x4e\x2a\x6f\xe1\xfd\xcd\xd6\xa7\xfd\xcb\x85\x15\x57\x5b\xcc\x37\x05\xd7\x78\x59\x35\x2f\xa0\xb0\x44\x16\x6e\x3c\x31\x88\x46\xa5\xdf\x33\x56\x30\x03\xcb\x20\xbc\x94\x2d\x30\x39\x10\x93\xe8\xd5\x83\xe8\xe6\x4d\xec\x57\x0e\xe1\xc4\x13\x87\x62\xf6\x48\x38\x98\xd3\x2e\x20\x32\xbd\xe9\xbb\xe0\x7e\xc2\xc3\xeb\x47\xd9\x68\x76\xf0\xfc\x0f\x02\x4d\x75\x3c\xeb\x34\xff\x84\x80\xb4\xcf\x57\x62\x30\xbb\x82\x63\xdd\x80\xee\xac\x66\x2e\xba\x31\xd8\xa6\x1f\x30\x9e\x17\x5f\x4c\x01\x43\xe2\x8a\x85\x2b\x1c\x30\x61\xce\x78\xef\xbd\x16\xa2\x87\x3d\xd2\x81\x98\xa4\x6e\xc0\xa8\x00\xb3\x0d\xc8\xa9\x3b\x8d\xbb\x81\xa7\x30\xde\x45\x0b\x86\x4d\xea\x76\x80\xe5\x09\xd8\x00\xe8\x23\x29\xc2\x61\xb0\x7e\x72\xaa\x80\xee\x16\xec\x37\x5d\xdb\xbb\x6f\xe3\xd8\xd4\x7b\x0e\x3c\x5a\x9f\x23\xc4\xd2\x0b\x72\x4c\x1d\xf5\x98\x35\xd8\x30\xdd\x22\xd1\x04\x03\xd8\xf1\x5c\x10\x2c\x4b\x37\x69\xc4\x16\x66\xc3\xab\x8c\x7e\x80\xb9\x40\xd0\xbb\xb5\x86\x52\xd1\x0a\x3f\xfe\x8d\x44\xdf\x10\x12\xa3\xdd\xc4\xe1\xc5\x18\xd4\x90\x19\xf7\xc5\xd3\xd9\xf9\x5e\xd9\x3a\x31\x97\x46\xd1\xe5\x43\xff\xa6\x9e\xdb\x49\xbb\x34\x39\xf8\xa3\x25\xac\x6a\x0c\xb4\xed\xd6\x5b\xa6\x00\x80\xa0\x44\x7c\x67\x4f\xaa\x72\xd8\xae\xbd\xb5\xd2\x54\x4f\x2f\x2d\x84\x7c\x72\xc2\xdf\xa6\x05\x7a\x69\x0a\xdc\x5c\x44\x1a"}, -{{0x82,0xa2,0xc6,0x49,0x3f,0x11,0xba,0x80,0xe4,0xb8,0xb3,0xb4,0x38,0x41,0xbe,0x97,0x0e,0x2a,0x10,0xa9,0x4d,0x22,0x49,0xd8,0xac,0x6f,0x54,0x14,0xcf,0x5a,0x3c,0xb5,},{0x4c,0x2e,0xe0,0x1c,0xde,0xa0,0x7d,0xb3,0x63,0x5f,0x5d,0x4c,0x10,0x82,0xb9,0x2f,0x29,0x8d,0xeb,0x17,0xd0,0xf9,0x05,0xdf,0x71,0xb6,0x6f,0xb2,0x27,0x4e,0xae,0x99,},{0x68,0xa9,0x1d,0x4f,0x8d,0x24,0x1c,0x1d,0xef,0xbd,0x5c,0xa9,0xe9,0xe1,0xed,0x82,0x74,0x41,0x95,0x06,0x75,0x1c,0x96,0x79,0x47,0xb1,0x0d,0x50,0x11,0x8b,0xbf,0xab,0xc7,0x65,0xff,0xd7,0xb3,0x1a,0x01,0x67,0xc4,0xfd,0x8b,0x11,0x75,0x33,0x24,0x12,0xdf,0x19,0xd8,0xaa,0x1a,0x90,0x95,0x90,0x86,0x13,0x20,0x92,0x3d,0xbc,0xb2,0x04,},"\x09\x85\x4d\x13\x68\x49\x50\x41\x9e\x0b\xb1\x64\x64\xe0\x99\x88\x90\x5c\x02\x17\x18\x3a\xa1\xe4\x8a\xdb\x14\x7b\xfc\xc2\xeb\x57\xc2\x30\x0b\x0d\xfc\x39\xd4\x89\x66\x55\xa5\x7a\xe2\x04\x15\x40\x8b\xb5\xf2\xc2\x38\x01\x39\x55\xf0\xa4\xfc\x78\x2e\x0c\x99\x3f\xe4\x2c\xb0\x8c\xd8\xcf\x41\x5c\xcb\xd6\xcf\x1c\xee\x2e\x80\x97\xf0\x4e\x8f\x09\xae\x5d\xa5\xf4\x15\xb1\x6c\x2c\xb3\x0c\xb2\xab\x66\x52\xba\x50\xeb\xbc\xae\x4a\x59\xe3\x1f\xe1\x1e\x7e\xf3\x69\x9c\xa9\x0a\xaf\xa5\x86\xbb\x24\x2c\x89\xcd\x2e\x33\x2b\x2b\xfa\x2f\x81\x42\xac\xca\xf4\x36\xf8\x9b\x64\x53\xbb\x48\x05\xa1\xe7\xf3\xab\x62\x70\xf0\xda\xf8\x93\x89\xe7\x17\xd1\xb7\x01\x75\xec\x57\x07\xc8\xf5\x12\xc4\x0a\xb9\x24\xc4\x57\xe9\xf0\x91\x47\x91\x75\x0d\xc2\x92\xbb\x27\xd6\xf6\x3b\xa8\xcc\xf5\x4b\x90\xd3\xeb\xa7\xf1\x9e\xb3\x00\xd9\xeb\x8f\x3b\x72\x03\x2b\xa9\x30\x37\xf5\x52\xb4\x09\xb5\x80\xa5\xf6\x51\x16\xfa\xff\xe0\xfd\xfd\xc6\xdb\x38\x81\x38\x6c\x3c\xbc\x16\xb6\x7e\xb2\x57\x63\xd7\xae\x3a\xac\x0b\x85\xaa\x1e\x9a\xa2\x2e\x49\x59\x60\x9d\x43\x81\xe4\xb6\xd7\x15\x9f\xf3\xe3\xb2\xd3\x7b\x64\x0f\x88\xcf\xbe\x4f\x8a\x77\xf8\x01\x64\x57\x22\x8b\xa6\xd3\xaf\x5c\x4e\x33\x12\x5d\x48\xbc\xfc\xf3\x67\x8c\x16\x3b\x69\x8e\x52\xe8\x56\x17\xab\x1a\x75\xff\x20\xc6\x90\xab\x07\x15\x5e\xe7\x57\x59\x85\x78\x07\x2d\x4a\x09\xdf\xc6\xc6\xc0\x94\xec\x04\x85\x67\xd5\x13\xce\x2b\x18\x34\xe1\x63\xdf\x15\x45\x31\x9d\x80\x61\xe0\xe5\x7f\x58\xef\x04\x1b\x7b\xff\xc4\x96\x6a\xc1\x66\x03\x31\xb9\x7a\xbb\xc9\x7b\xe2\x1a\xe2\xbc\x58\xc6\xc3\x27\x4a\x8a\xda\xd5\xfd\x2c\x3b\xc1\x6b\x92\xe1\xf8\xde\x87\x7b\x6a\x26\xf0\xc6\xab\x71\x62\xe8\xaa\xb9\x3a\xf8\xd8\x59\x18\xc1\x3d\x3e\x23\x5a\x27\x37\x48\xc6\x2f\x0d\x22\xcb\x1c\x93\xe1\x34\xa4\x95\xb1\xb5\xef\x8f\x1a\x11\x34\x51\x2d\x53\xb7\xa2\x11\x26\x31\x77\xf7\xa6\x0b\xdf\x47\x46\x91\xf2\x24\xa3\xb5\xba\xc4\x00\x6d\xb3\x45\xca\x67\x25\xf5\xee\x70\x3e\xca\x0d\xea\x10\xd7\x12\x67\x6f\x63\xef\x3e\x53\x7e\x63\xab\xd2\x60\x8c\xb4\xfb\xe2\x00\xe1\x5f\x18\x20\x91\x53\x49\x60\x72\x90\x80\x44\xc9\x5a\x4e\x9c\x53\x56\xaa\xe8\xed\x5f\x09\x59\xea\xc0\x91\xe2\x27\xa0\xb8\x1f\x58\x03\x27\x6b\x3b\x3b\xf4\xb6\x86\x5a\x55\xfc\x67\x82\xf6\x2e\xa6\xd6\x39\x90\xf9\xbe\xfe\x01"}, -{{0xe5,0x5b,0x34,0x3a,0x0f,0xa1,0xfb,0x74,0x71,0x89,0xcb,0x00,0xdb,0xc3,0xa6,0xaa,0x2d,0xcf,0x5b,0x86,0xe5,0x7d,0x76,0x93,0xf3,0x07,0x42,0x03,0x89,0x76,0x11,0x53,},{0x23,0xa1,0x44,0x60,0xea,0x98,0x3c,0xf9,0x97,0xc7,0x82,0xeb,0x45,0x82,0xab,0x3c,0x8a,0xa6,0xdd,0xe5,0x33,0x25,0xb9,0x77,0xb7,0x8e,0x33,0xd2,0xdc,0x5f,0x27,0xaa,},{0x07,0x26,0x6c,0x18,0x65,0x0e,0xcf,0x06,0x32,0xe2,0x25,0x62,0x4e,0xc4,0xc9,0x7f,0xc3,0x87,0xdc,0x37,0x46,0x87,0xa6,0x19,0x56,0xdc,0xcc,0xe7,0x28,0x94,0xee,0x13,0x8a,0xab,0xc8,0x0c,0xfc,0x90,0xc9,0xee,0xa6,0xdd,0x4c,0x59,0xaf,0x45,0x02,0xee,0x29,0x63,0x5a,0x92,0x88,0x07,0x86,0x67,0x8b,0x14,0xa3,0x93,0x1a,0x69,0xf9,0x07,},"\x36\x28\x9b\x5e\xaf\xf2\xa8\x5a\x7c\x6d\x57\x5b\xd1\x5e\xa5\x94\xb2\xfd\x85\x10\x87\x4a\x46\x9b\x52\x10\x91\x63\x69\x6d\x85\xb6\x8c\x5b\x21\x1d\x29\x64\xef\xdc\x66\xe6\x25\xab\xe8\xaa\xfe\x4c\xd9\x22\x0c\xdb\x34\x11\x07\xff\xa8\x27\x6e\xd4\xb3\x70\xfe\x37\x6c\x14\x82\x68\x71\x67\xdb\xc8\xf7\xb2\x05\xa3\xf3\x30\x1a\x16\x64\xd9\x07\x28\x77\xd9\xf9\x8b\x8f\x69\x83\x13\x01\xdf\x99\x94\x71\x7f\xc8\x89\x69\x24\x23\x91\xd9\xb0\x51\x7d\x6e\xfb\x27\x17\x01\xea\xb3\xf4\xa9\xb1\x20\x42\x13\xe8\xcd\x13\xf9\xd0\x99\x04\x8b\x82\x07\x56\x2f\x2e\x4e\xbc\x65\x3c\xc6\x5e\x9d\x55\x12\xd6\x5b\x41\x02\x2c\x79\xb4\xeb\x37\x29\x87\x69\xae\xaa\x6e\xfe\xd6\x9e\x9a\x8c\xb4\x45\xc7\x01\x22\x74\xde\x62\xf5\x09\xf4\xe4\x81\x4a\xdc\xbf\x44\x53\xb4\xfa\xb8\x5d\x7c\x8f\xd8\x45\xe0\x08\x30\xef\x5b\x7b\x1e\x63\xc6\x76\x13\x98\x4c\xae\xfe\x91\x5a\x54\x8e\x18\xe5\x05\x62\x2c\xb2\xb3\x92\x99\xf4\x27\xf4\xd8\x39\x83\xba\x2a\xa0\x0d\x53\xbe\xe1\xf5\x9a\xec\x83\x18\xc5\xea\x34\x5d\x29\x42\x52\x36\x97\x92\x76\x2a\xdd\x3e\x56\xfc\xfa\x6e\x77\x97\xf0\x28\xc7\x99\x47\x90\x45\xed\xb2\xe2\x05\xeb\x6d\xd6\xca\x04\xee\xe5\x6f\x94\x96\xd2\xbf\x26\x09\x93\x57\xc9\x73\x83\x5b\x99\x36\x02\x49\x11\xe4\x65\x5d\x3e\x22\xc8\x11\xc8\xd4\xdb\xd1\xb0\x4f\x78\x97\x3f\x07\x75\x23\xa3\x89\xb6\xf2\x8f\x6f\x54\x21\x61\x42\xcb\x93\xe3\x3d\x72\xb4\xa5\x05\x2d\x27\xe4\x91\x1e\x41\xe6\xce\xc7\xbe\xbe\x1b\x0a\x51\x13\xe6\xb7\x0b\x47\x9d\x2a\xbe\xed\xf6\x9b\x75\x64\xe5\xa5\x73\xb3\x52\xd1\x6c\xec\x89\x07\x01\xbb\x38\x3d\x3f\x66\x56\xed\xa0\x89\x2f\x8c\xcc\x70\x94\x0f\x62\xdb\xe5\x28\xa6\x5e\x31\xac\x53\x88\x26\xc1\x38\xac\x66\x52\x4e\x33\x16\x37\xba\x2d\x37\x73\x03\x58\xe6\xc7\x32\xcf\xf8\xfe\xe9\x40\xaf\xd2\x2c\x39\xae\x38\x1e\x5d\x88\x26\x73\x9b\x23\xfd\xc1\xb8\x0a\xea\x5a\x62\xa2\xcf\x0f\xf1\x52\x5e\x44\x6c\xf3\x10\x46\x19\x50\x51\xd5\x85\x03\xee\xd1\xbe\xfd\x79\x3e\xea\xe1\xd5\xd1\xb6\x2a\x5c\x98\x45\x15\x7a\x09\x5c\xdc\x08\xa1\xd7\x7b\xa4\x7e\x84\xa5\xa7\x39\x98\x0f\x0f\x5b\xe7\xaa\xec\x9a\x21\x5b\x20\x4b\x4b\xb7\xcb\x1b\x38\x6d\xed\x58\xd7\xaa\xf7\x28\x53\x41\x90\x7c\x63\x33\x6e\xe3\xe6\xef\x07\x7a\xd1\x11\xb9\x74\xe7\x50\x4b\xd9\x89\xf5\x66\xfd\xa1\xb1\xb5\x9a\xba\xa9\x1c\x78\xbb\x40"}, -{{0x39,0x73,0x03,0x8f,0xa2,0xef,0x6a,0x27,0x8d,0x3c,0x1c,0xff,0x9a,0x22,0x56,0x69,0xe4,0x65,0xa6,0x9d,0x07,0x50,0x50,0x3d,0xe7,0x48,0xc0,0x02,0xdb,0xf9,0x27,0x8a,},{0xc7,0x5e,0x77,0xc7,0x81,0x49,0xd9,0xd2,0xdb,0xc2,0x63,0xdd,0xf8,0xac,0x4d,0x65,0x4d,0x1f,0xf4,0x55,0xcb,0x18,0x97,0xe1,0xc3,0xce,0x31,0xb9,0x4c,0xfe,0x32,0x10,},{0xfc,0x0c,0x54,0x53,0x83,0x9e,0xa9,0x92,0x96,0xff,0xfa,0x50,0x1d,0x58,0x36,0x66,0x28,0xdf,0x89,0xf6,0x16,0x76,0x69,0x42,0xd5,0x04,0x0a,0x05,0x60,0x56,0xda,0xb1,0x8b,0x44,0x05,0xc0,0x4a,0xbf,0x90,0x59,0xc3,0x08,0x68,0xd7,0x9c,0x93,0x6c,0xcc,0xc8,0x4c,0x4f,0xbd,0x6f,0xd3,0x0b,0x60,0xf8,0xbc,0xbd,0x7a,0x66,0x40,0x42,0x02,},"\x33\x92\xe0\x2f\x3c\x84\x66\x1e\xaf\x81\xa5\xff\x04\x35\x7f\x21\x2e\x92\x36\x1c\x5c\x22\x07\x39\xd9\x6b\x4d\x3d\x9c\x22\xd1\x8d\xf4\x8b\xe6\xb5\x51\x26\xf5\x81\x60\x1f\xfe\x0d\xa6\x3f\x38\xe1\x9c\xbb\x12\x72\x6c\xa0\xa6\xaa\x32\x55\x67\xa0\x03\xa7\x84\x9d\x06\x78\x39\x92\xeb\x9e\xb9\x28\x53\x29\x7d\x72\x28\xdb\xa9\x80\xb2\x50\xbb\x11\x0f\x63\xd0\xb8\x46\x70\xe5\xec\xb3\x19\xcb\xfd\x61\x27\x8f\x1f\x4c\xab\xf1\xfc\xb3\xf7\x01\xf1\x2f\x6e\xf8\xd3\xcc\x42\x82\xfc\xbe\x58\x9e\xb5\x65\x95\x03\xa2\xdd\xd8\xbb\xa3\x8e\x5e\xff\x09\x2d\xfa\xf5\x39\xfd\x80\x4f\x21\xf7\x3a\x90\xad\xf5\x69\xa0\x0b\xf9\xd2\x5a\x9a\xd3\xa6\x33\x09\xcc\x60\x93\x14\x24\x71\xa4\x78\xf0\xb8\x99\x22\x86\xde\x02\x3c\x68\xef\xd4\x99\x87\xec\x27\x0b\xd9\x46\xf6\xdb\x48\xf6\x84\xf1\xc2\xad\xee\xe2\x6d\x68\xdc\xe9\x5a\x55\xe4\xcb\x27\xbc\x60\x52\x30\x80\xdf\x6b\xa2\xb1\x99\x99\x6b\x1f\x1d\xa6\x92\x0d\x15\x59\xf7\x9b\xfd\xe9\xfa\x1a\x02\xde\xae\x14\x80\xc7\x6f\x94\x7f\x9d\x21\x3f\xc4\x3b\xb2\x88\x0a\x1b\x4d\x03\xbb\x14\xf5\xb0\x44\xa0\xfd\x83\xce\x04\x92\xf4\x9c\xa3\xaf\x25\x21\x1b\x86\xfa\xa5\x73\x5a\xd7\xfe\xaf\x31\xa1\xa7\x49\x1e\x70\x8b\x41\x82\x9d\x68\xe3\x24\x14\xf6\x83\x52\xb7\x1d\x1c\xd2\x3c\x8e\x12\xfb\x02\xda\x71\x14\x84\xf6\xef\x97\x52\x8a\x00\xd2\x4f\xcf\x91\xd4\xe0\x6e\x9b\xad\xae\x9a\x44\xdb\xdb\x3f\x77\x80\x41\x76\x8d\x86\x37\x04\xd7\x36\x81\x04\x00\xe7\xf2\x93\x1e\xfb\x85\xc8\x72\x4a\x59\x34\x26\xaa\x2a\xf1\xec\x5b\x66\x4f\x85\xc2\x25\x48\x96\xfd\xcf\x31\x6d\xb0\x92\x4e\x11\xaa\xe8\xd6\x83\xe9\xa0\x21\x92\x9d\x0a\x9d\x6f\xec\xb4\x59\x4b\x1b\x3f\xbc\x16\xb1\x76\xd2\x9d\x1e\xfb\x18\x19\xa4\xa4\x23\xfb\xe0\xca\x05\x59\xc5\x7e\x9e\x54\x49\xf1\x4b\xce\x91\x36\x0d\xaf\xda\x6a\x42\x7c\xe4\xa0\x99\x3d\xd0\x30\x82\xdd\xee\x06\x65\x33\xf6\xd3\xbd\xa5\x66\x0f\x42\xfd\x77\x57\x69\x0d\x67\x05\x98\xec\x70\x96\xf4\x75\xa0\x1a\x51\x99\x50\x34\x1a\x83\x1f\xc9\xa2\x81\xc0\x94\x7a\x86\x3f\x1f\x6e\x03\xbb\xa7\x74\xde\x77\xad\xc2\x3f\xbe\x52\x5c\xae\x6c\xcc\xe4\x7a\x0e\xc4\x97\x9e\x8b\xec\x86\xf3\x32\xfc\x6a\x57\x36\xe3\xb9\x8f\xb3\x32\xe9\xe8\x24\x4e\x68\xa1\x00\x45\x5e\x64\x99\xba\x8d\xba\xe9\x8b\x92\xba\x3d\x9c\x6b\x4f\xf9\x80\x34\x3e\x4c\x8e\xf4\xd5\xa4\xaa\xcf\x8b\x1a"}, -{{0xc7,0x1c,0xc1,0x0a,0xd2,0xd4,0x43,0xe0,0x25,0xad,0x06,0x25,0x68,0x6b,0x12,0x35,0x03,0xe5,0x90,0x19,0x3a,0x2b,0xc8,0xcc,0x57,0xa7,0xb9,0xb4,0x15,0x8d,0xe6,0xcb,},{0xfc,0x06,0xac,0xaa,0xb5,0x3a,0xd0,0x8e,0x97,0x62,0xdd,0x11,0xcd,0x21,0x22,0xb3,0x15,0x99,0xbd,0x25,0x98,0xce,0x6f,0x24,0x87,0x95,0xe7,0x32,0x21,0x9c,0x2f,0xc7,},{0x2e,0xb3,0x3b,0xc2,0xd5,0xde,0xb7,0xf3,0xa2,0xdc,0xc3,0x77,0xb0,0xc6,0xa8,0x62,0x13,0x4b,0xf3,0x19,0x1e,0xc4,0x0f,0xc1,0x28,0xac,0x28,0xab,0xf2,0x31,0x6e,0xf1,0x40,0x16,0x49,0xb8,0xf4,0xcf,0xa1,0xa9,0x36,0xde,0x79,0xb5,0x32,0xdc,0x04,0x3b,0x6d,0x36,0x02,0x4b,0x4c,0x37,0xbb,0xa2,0x92,0x90,0xac,0x9f,0x44,0x9b,0xa6,0x0d,},"\x2e\x08\x46\x53\x6d\xc6\xcc\xe1\x9c\xcf\x82\xdc\x2d\x0c\xd2\x1b\xd4\xe1\xca\x7b\xc3\x17\x06\x7a\xf8\xd9\x0e\xe4\x81\x8c\x85\x18\xbc\x3e\xf9\x60\xce\x11\x2a\x41\xd2\xb9\x97\x9a\x28\x2a\xe1\x3d\x70\x6a\x00\x5e\x00\x34\xf0\x6b\x39\xff\x4b\x0a\x5a\xfa\xed\x70\xb5\x61\xbc\xce\xb1\xbb\xd2\xec\x19\xf9\x74\x48\xea\xed\x4b\xe6\x20\xe3\x6a\x96\x2d\x87\x8c\x6f\x80\x17\x2b\x9f\xad\x43\xee\xd0\x7f\xf9\x3d\xb9\xb9\xca\x22\x62\xd5\xa3\xc2\x29\xc5\x4e\x30\xa4\x5e\x73\x66\x08\x92\xf0\x48\xe3\x63\xf3\x71\x44\xed\x19\x21\xf7\x29\x92\xb4\xd0\x15\x29\x87\x0c\xfe\x37\x3b\x7e\x7c\xbe\xda\xf9\x69\x26\x9f\xb7\x0a\xa7\x83\xd1\xe7\x44\x17\xc7\xba\xe0\xfe\x03\xd9\x51\xfd\xb8\xc7\x1c\x62\xe9\xbe\x7f\xdd\x5d\x23\x3e\x39\xf4\x6f\xed\x05\x7e\x49\xb6\xf3\x40\x68\x45\x91\x48\xda\x3d\x42\x41\x61\xad\x2c\x86\x95\x08\x60\x2e\x9c\x0b\xb3\x0b\xfb\x88\xac\xd5\xf4\xdf\xdf\xfd\x47\x35\x03\xcd\xfe\xda\xbc\x44\x42\xb7\x43\xbe\x07\x5e\x7c\x6f\x61\x0e\x64\xff\xc2\xe5\x31\x87\x74\x5c\xd7\x19\x65\x8f\xc6\xe6\x2a\x5b\xe5\x18\x43\x7c\x5b\xd6\xa4\xfe\xba\x94\xae\x3f\x44\xf2\xf2\x93\x08\xe8\x31\xfe\xef\xed\x67\x69\x09\xce\x5e\x80\xc8\x4c\xbd\xca\xc4\x7e\x47\xd2\x7c\x97\x12\xa0\x1f\x6b\xc5\xda\xed\xc0\x2e\x64\x14\x40\x7e\x91\x1c\x0a\x5a\x53\xe5\x32\x8a\x5a\x5f\xd9\xf0\x40\xaa\x7f\xb7\x0b\x79\xb3\x1c\xd1\xb6\xfd\x9b\xd5\x02\x90\x40\xbd\x22\xae\x22\x2f\xd2\xf6\x87\x0d\x07\xf4\x35\x32\x26\x39\xcf\x31\x93\xca\x57\x09\xb8\x82\xb0\x7a\x58\xf9\x52\xa9\x96\x3e\x56\x8f\x8c\x5a\x58\x4a\x6b\x9e\x27\x5c\x5c\x07\x95\x7a\x4d\x2c\xda\xa9\xf1\xeb\x44\x4e\xd1\x22\x4b\xac\x65\x63\xb2\xf9\x27\x3e\x80\x30\x1d\x44\xd5\x0a\xe3\x83\xb5\x97\x21\x3b\x00\xda\x5b\xf2\x7e\x5d\x1f\xe2\x40\xcc\x3b\xb6\x5a\xa5\x03\x0d\x65\x1b\x6b\x5b\x31\x76\x1d\x53\xce\x0c\x6d\x74\xa1\x5d\xad\x54\x79\xf3\x1c\x91\x5c\xcf\x44\x66\x59\x85\x3b\x89\xa5\x1a\x28\xee\x89\x76\x85\x35\x53\xfd\x2e\x02\xfe\x72\x43\x53\x8d\x00\xb4\xed\x07\xd8\xb8\xa8\x0b\x5c\x16\x5c\xd4\x63\x41\xff\xd8\x16\x3c\x55\x57\x02\x66\x3a\x4e\x6a\xb2\x95\x2b\x7e\x74\x43\xd0\xf6\xb1\x23\xb6\x94\x67\x21\xaa\x63\xe8\x7b\x11\x55\xec\xa8\xa6\xa1\xbc\x9f\xd2\x5c\x67\x62\xe5\x27\x42\xc8\x6b\xca\x1b\xa9\xd8\x37\x04\x15\x24\x4f\x0e\xdf\xdb\xe0\x93\x2b\x5c\xa0\x61\x15\x09\xc9"}, -{{0x0a,0x4f,0x5e,0x16,0x70,0xf1,0xe2,0x4b,0xfa,0x37,0xb7,0x3c,0x99,0x43,0x30,0xb3,0x6e,0x7d,0xaa,0xf9,0x30,0x16,0x1b,0x78,0xa4,0xa8,0x48,0x66,0xff,0x25,0xe3,0xd5,},{0x9d,0xcb,0xba,0x90,0x39,0x81,0x59,0x4c,0x7b,0x67,0x7e,0xa8,0x00,0x20,0x01,0xd6,0x64,0xcf,0xf7,0xce,0x8e,0x5c,0xfa,0xe5,0x88,0x40,0xcf,0x74,0xaf,0xf0,0xd3,0xa9,},{0xdc,0xf3,0x53,0xb2,0xb9,0x9a,0x4e,0xf4,0x5f,0x3f,0xdf,0x65,0x28,0x63,0x2e,0x8a,0xbd,0xc4,0x33,0x34,0x24,0x76,0xa8,0xc2,0xb3,0x79,0x00,0x40,0x4a,0x4e,0x33,0x3d,0x38,0x78,0x14,0x23,0x57,0x57,0xef,0x7a,0xd0,0x38,0x58,0xa0,0xf3,0x5d,0x46,0x15,0xe8,0xab,0xa4,0x84,0xfd,0x64,0xf1,0x11,0x2e,0xc1,0xb1,0xae,0xd2,0xcb,0x64,0x0e,},"\xf4\xb0\x5b\x3e\xfd\xcb\x1d\x5c\x07\xda\x95\x0c\x46\x56\x55\x28\x44\x0b\xb4\x88\x35\xee\x4c\x13\xf4\x3d\x7a\x16\x18\xde\x11\x9e\xbb\xb2\x59\xea\x74\x80\xa5\x04\x81\x74\xfa\xec\xc1\x05\x5b\x32\xdc\x01\xac\x71\x56\x34\x43\x21\xe8\xeb\xa6\x98\xf3\x02\xee\x16\x43\xb5\xf0\x4b\x8e\x7e\xcc\xa6\x3b\x91\x56\x1c\xe3\x51\x4a\xbe\x78\x51\xb6\xfb\x17\xfc\x94\x3b\xdc\x94\xda\x30\x8c\x8e\x47\x69\xfe\xc2\x0f\xad\xf4\xfa\x8e\x7f\x62\xb6\xff\xb5\xf1\x70\xd6\x44\xed\x29\x35\x5e\xbd\x22\xcb\x3a\xa1\x48\x6b\x1e\x36\x7c\x72\x9d\xd3\xf7\x9b\xcd\x40\xff\xd0\x8a\xf2\x8c\xeb\xc8\xd7\x76\xe1\xa4\x83\xe9\x11\xd7\x9b\xc6\x13\xe0\x9c\xc6\x21\xca\xde\xb0\x34\xdd\x6f\x72\x37\x47\x71\x98\x51\x27\xf7\xa3\xa1\xaa\x78\x6a\x52\x3a\xe6\xe3\x4e\xe4\x33\xdc\x30\xc3\x75\x98\x7c\xff\x50\xbd\xcb\xc9\x97\xfc\xd5\x1c\x94\x56\x7a\x67\xae\xfb\x6e\xf5\xed\xf9\xbd\xd6\x59\x64\xd4\x64\xbe\x9e\xbd\xfb\x88\xc0\xe2\x31\xb0\x7f\xf6\x40\x5c\x00\xf8\x25\x31\xe9\x61\xbf\xc5\xea\xd2\x66\xbc\xc0\x87\x18\x87\x8c\xaf\xb1\xd3\x75\x36\xf1\x83\xe4\x8b\xf3\x8d\x3f\x6b\xe9\x00\x25\x2d\x1f\xb4\x19\xe6\xa2\xac\x58\x96\x03\x9f\x63\xc3\x14\x01\xff\xf9\x32\xce\x98\x14\xb0\x85\xab\x20\x41\x69\x72\xa2\xb3\x51\xc8\x15\xa6\x2d\xe5\x09\x67\x46\x28\xb0\xd3\x56\x6f\xc9\xc2\xe0\xa9\x23\x7b\x93\xf9\xbb\xb2\xde\xed\xf0\x2b\xff\x83\xbf\x6d\x86\x8b\x63\x99\x32\x6d\x48\x09\xd0\x41\x9f\x31\xb2\xf3\xa4\x81\x28\x5b\x94\x07\x8b\x47\x06\x1c\xe9\x1d\xad\x58\x3d\xd5\xb1\x3b\xd0\x10\xfb\x30\xf2\x49\x5b\xb7\x04\x20\x18\x3a\x93\x01\x59\xe4\xdb\x19\x3d\xf6\xac\xd1\x24\x42\x3e\x03\x9a\x67\xf1\x56\x88\xae\xc5\x0c\x59\x27\xfb\x27\x18\x22\xaa\xa6\x6f\x29\x4b\xc8\x05\xd3\xbc\x7c\x83\x41\x87\x8a\x54\x10\x09\xf3\x0d\xa9\x9f\xcc\x00\x85\x07\x9c\xe7\xfc\x55\xe0\x01\x16\x85\x56\x2a\xbd\xb3\xa9\x47\x1f\xfd\xe6\x17\x63\x00\xef\x5b\x31\xe0\xdf\x60\x9a\x54\xa1\xee\x66\x24\x07\x0d\xa9\x9c\x87\x76\x89\x1f\xdf\x6a\xa7\x8b\x4d\x55\xb1\xf5\xda\xdf\xc0\x61\xad\xd5\xaf\x00\xfd\x3a\xde\xdb\x44\x8c\x55\x9b\xff\xf2\x04\x06\x80\x43\xa5\xd1\xd6\x21\x47\x48\x62\x8c\x3e\xbc\x5f\x02\x24\x32\x6c\xa1\x8e\xf0\x48\x42\x5d\xa9\x30\x01\x33\xfb\x69\x5d\x4f\x26\x31\x65\xac\x22\xf3\x61\x9d\x40\x5a\xf2\x71\xa7\x1a\x9a\xfb\x19\x8b\xf6\x31\x24\x1d\x34\x59\xb9\x53\x98"}, -{{0xb8,0x55,0xc8,0x18,0x05,0xc7,0x08,0x74,0x10,0xe6,0x9f,0x96,0xb0,0x24,0x02,0x71,0xdc,0x76,0xc1,0xe4,0xad,0xe3,0x8c,0x6a,0x92,0x78,0xe3,0xc9,0x4f,0xbe,0xa2,0x56,},{0x6a,0xdb,0x02,0x5a,0x40,0x26,0x0f,0x56,0x98,0x84,0xb8,0xca,0xb3,0x75,0x2b,0x4f,0x25,0x5c,0x37,0x3e,0x2b,0x42,0x4b,0x62,0x87,0xeb,0xb5,0x10,0xfa,0x06,0xff,0xf0,},{0x3c,0xaa,0x81,0x32,0x73,0xe7,0x53,0x54,0x2f,0xfb,0xfe,0xb2,0x1b,0xc3,0xe2,0xcf,0x8c,0xa7,0xd9,0x20,0xfa,0xac,0x7c,0x49,0xdc,0x2a,0xa9,0x91,0x17,0x68,0xc7,0xad,0x43,0xb3,0x8b,0x02,0x36,0xdb,0x27,0xf3,0xee,0xae,0x0b,0x12,0x06,0x00,0x1e,0x66,0x5a,0x60,0x70,0x78,0xc5,0x22,0xed,0x7a,0x9d,0xc4,0x68,0x85,0x34,0x63,0x59,0x00,},"\x85\xa9\xbd\xb7\x0a\x6c\x75\x28\x97\xe4\x3a\x91\x10\x6e\xe9\xa9\x9c\x2c\xa9\x4f\xf7\xb4\x46\x1a\x44\xa3\x91\x74\xc1\x7e\xcd\x99\xdf\x46\xee\xcd\x81\xc3\xf5\x25\x13\xdc\x9d\x54\x7d\xad\x37\x21\xc6\xd5\xee\x1f\x8f\xac\x0b\xa5\xaf\xb3\x68\x70\x44\x73\x9e\xd5\x35\xb8\x44\x00\x87\x04\xc0\x9f\xe1\xe5\xd7\x85\xd4\xc9\xc3\xd0\xb0\x58\x89\xb9\xc2\x0f\xc3\xfd\x68\xdf\x12\xdb\xeb\x2c\x34\xf6\xf7\xec\x1c\x6f\xb7\xfa\x81\x1f\xf8\x46\xb5\xa6\x1f\xa5\xfe\x55\x37\x9e\xe6\x3a\xbc\xd3\x73\xfe\xd0\x02\x54\xeb\xd0\x6b\xc8\xb2\x2f\x7f\xbf\x2f\x72\x7a\x5f\xad\x88\x51\x41\x59\xe2\x6d\x78\xdf\xdb\x09\x57\xf6\xef\xaf\x51\xa8\xe8\x0b\x58\x5e\x83\x8b\x96\x21\xd0\x51\x07\x4a\x4f\x58\x67\xb4\xae\x2f\x2f\xf6\xd6\x2b\x85\xbc\xce\xc0\xb4\xaa\xa4\x79\x16\x37\x38\x8c\x09\x01\xfd\x49\xdc\xcc\xce\x72\x04\x85\x9f\x81\xee\xfc\x63\x9f\xed\x92\x28\x04\x56\xe6\x9a\x15\x09\xb4\xb1\xbd\x76\x24\x44\x7d\x86\x2c\x45\xa0\xc8\xb0\xc5\xbb\x2c\x4c\xa5\x12\xcb\xc0\x37\xf5\x1b\x78\x09\x82\xb1\x83\xa5\xca\xfa\x15\x29\x75\x85\xc9\x47\xa2\x5b\xe8\xc2\x24\x0e\xbf\xb6\x86\x8e\xce\x5e\xa2\xaa\xb2\xc2\x39\xc8\x37\x54\xc7\xd5\x94\xb3\x72\x5a\xce\xef\x34\x4b\xa7\xe6\xae\xf4\x9f\x7f\x31\x3b\x0a\xe8\x2c\xca\xca\xd3\x87\xa6\xe9\x33\x7f\x05\xf8\xc7\x99\xef\xe7\x82\x9b\x27\xb4\xd5\xb2\x01\xfd\x5a\xe5\x83\x43\x51\x69\x07\x59\xf3\xea\x17\x5f\xd4\x74\x1b\xe2\x28\xd8\x07\xfb\x54\xdf\x4a\x74\x10\x38\xfa\xee\x47\xed\xf1\xf5\x61\x65\x25\x98\x60\x1f\x27\x15\x5f\xc5\x0d\x9d\x50\x11\x43\x37\x11\xc1\x06\xd4\xb6\x07\x85\xa5\xcc\x93\xb3\xfd\xd1\xda\xd7\x0c\x0c\x8e\xaa\x33\xf1\x51\x2e\x35\xa5\x41\x74\x5e\x37\x6c\x15\x16\x7f\xa8\xf6\xb3\xb2\xc4\xc3\xa3\x66\xfc\x41\x49\x7d\x29\x73\x57\x81\x6a\xe7\x95\xa8\x04\xc9\x80\xe7\xcb\xfb\x0c\x74\xd8\x83\x5d\x92\x9a\xe3\xbb\x52\xba\xb1\x29\x64\x56\x6d\x74\x6b\xd2\xc1\xd1\x32\xb6\x23\x3f\xa3\x4f\x75\xe2\x68\xed\xee\x77\x5e\xb3\xce\x13\x2e\x6b\xeb\x2e\x8d\x71\xf0\xc8\x76\x29\x91\xcd\xe4\xe2\x6f\x71\x43\x9d\xfa\x83\x97\x8f\x99\x56\x03\x86\x1b\xc0\xb1\xd9\x06\x0b\xbc\xca\xcc\xf8\x6f\x87\x45\xad\x96\x99\x4d\x5d\x00\x7d\x52\xe8\x3a\xa5\xe6\x94\x12\x96\x4b\xdb\xfb\xe4\x78\x0a\xaa\x8d\xe4\x1b\xe1\x29\x8a\xbb\xe9\x89\x4c\x0d\x57\xe9\x7f\xca\xcc\x2f\x9b\xbd\x63\x15\xd3\xfc\xd0\xea\xf8\x2a"}, -{{0x95,0xb9,0xc8,0xa6,0xef,0x80,0xeb,0xd5,0xcb,0xd4,0x7a,0x04,0xca,0x54,0x38,0x73,0x73,0xdf,0x4d,0x67,0xa2,0xb4,0x75,0x59,0x77,0x65,0xac,0x89,0xfc,0xf9,0x3e,0x93,},{0xf2,0xc9,0x47,0xb1,0x8a,0xdc,0x3e,0xa6,0xa2,0x3f,0x7a,0xbc,0xa3,0x64,0xb9,0x85,0x3a,0xe8,0x5a,0x2b,0x0c,0x8c,0x26,0xf0,0xd3,0x17,0x3c,0x27,0x32,0xc3,0xc7,0xff,},{0x2c,0x8b,0xf5,0x43,0xe2,0xa3,0xe0,0x04,0x15,0xee,0x4f,0x10,0x7b,0x2f,0x5a,0x66,0x87,0x17,0x6f,0x5d,0x52,0x11,0x17,0x75,0x9c,0xeb,0x56,0x17,0x51,0xbc,0xc7,0x7d,0x9b,0x08,0xa6,0xa6,0x31,0xf6,0x44,0x7c,0xd9,0x01,0xde,0x96,0x69,0x9a,0xeb,0xb1,0x68,0xbf,0x97,0x50,0x0d,0xc5,0x4a,0x05,0x43,0xef,0x14,0xe4,0xb5,0xa0,0x81,0x06,},"\x78\x55\xbc\x39\x26\x30\xcc\xf5\x31\xd3\x06\x16\x06\xdd\xfc\x81\xa0\xfd\x92\x94\xc5\x47\x91\xb5\xf9\x55\x9b\x68\x27\x25\x4a\xa1\xf2\x5c\x54\x0b\x7d\x7d\xf3\xec\x9c\xdf\x14\x25\x66\x29\xdb\xcf\x9b\x72\x5f\xeb\x34\x12\xeb\xf3\x5f\x0e\xf9\x37\x9e\x41\x31\xcc\x77\xe0\xf0\xfb\x6f\x74\x59\xa7\x38\x36\x1a\x99\xae\x4c\xcb\x2b\x60\xa9\x9f\xe9\x2b\xd6\xc3\xa5\x3d\x6f\x45\x4e\xe9\x00\x5b\xce\xc5\xae\xdc\xfa\x82\x34\x73\x92\xef\xcf\x11\x75\xe5\x78\x39\x6a\x8d\x80\x0d\xab\xa0\xf4\xc2\xcf\x4d\x49\x13\xb0\x52\x86\x20\xe3\xba\xa0\xf6\xd8\x6e\x06\x28\xe4\x7c\x0c\xa2\x6d\xf3\xb0\xc7\x88\xc4\xe1\x65\x57\xf7\xfc\x28\xdf\x82\x0c\x12\xfb\xb6\xff\xbf\xec\xb9\x82\x9d\xdb\x65\xef\x8d\x63\xe9\x0d\x68\xfc\x71\x94\xb5\xb8\x85\x91\x3f\x08\xed\xee\x84\x56\x76\x47\xff\xa3\xf0\xd0\xd3\x25\xd0\x82\x60\x0c\xe7\x1a\x23\x45\xc7\x7d\x65\xbd\x96\x25\x20\x03\xe5\xc1\x25\xa7\x18\xa0\x73\x70\xc3\x1b\x57\x08\x07\x5c\xf1\x83\x7c\x69\x25\x63\x5c\xc6\x8d\xd1\xb7\x51\xe4\x0a\xb6\x08\xb0\xd9\xd8\x85\x2c\x18\xd3\x06\x92\x19\xef\x80\x7b\x76\xd2\x88\xf9\x2c\x29\xa9\x3e\x3d\x75\xb5\xb2\xe5\x36\x81\x67\x1d\x3a\xe0\x14\x5a\xc0\x3c\xca\xd3\x16\x2e\x44\x70\x3b\x04\x01\xd3\xeb\x16\x7c\xd8\xdd\xc1\xe1\xa5\xa3\x26\xb7\x28\xb1\xe0\xc0\x0a\x94\xd8\x6d\xe6\x13\x52\xa6\x61\xe4\x08\x97\x17\x5d\x28\xd3\x41\xe4\xd1\xd9\x96\x2e\x35\xf4\xde\x18\xa5\x40\x17\x61\x1a\xd0\x53\x59\xce\x08\xb9\x7b\xfe\xdb\xfb\xe3\x99\x2e\xd5\x8e\xd4\x0f\x51\x7a\xab\x01\xc0\xfe\xfe\x8b\x63\x64\x3d\xa1\xa4\x54\x15\x27\x30\xbf\x99\xaf\x87\x40\xad\xf9\x8a\x77\xb8\xd7\x3a\xdb\x08\xe6\x09\xe0\x0c\xe9\xb1\xcc\xdf\xef\x3e\x9a\x9b\x05\xaa\x56\xe0\xbc\x79\xb6\xbb\xba\x80\xdd\x8e\x46\x1a\xf7\xcb\x20\x28\x92\xd8\x9b\x2d\x05\xa4\x45\x8a\xb3\xfa\x54\xb4\x74\xb8\xf8\xf5\x81\x79\x5d\x6c\x27\x39\xe5\x9d\x0f\xe0\x62\x40\x0b\xae\x2d\x2d\x53\x4b\x34\x0b\xb8\xe2\x61\x57\x77\xa9\xa5\x61\x5b\xb2\xcf\x43\x7b\xa5\x25\xe0\x0e\x70\x38\xf2\x2a\x57\x88\x2a\xc5\x20\xb3\x33\xe7\x5c\x3c\x92\xa8\xb9\xf0\xe3\x7f\x67\x1c\x94\xb1\x5d\xd8\x18\x2a\x08\xd7\xc1\x43\xe9\x4e\x92\x62\xb3\xcc\x55\x44\xc2\x94\xf5\xf3\x35\xc2\xb2\x8a\xc1\x19\xfe\xa0\x0f\x96\x34\xdb\x06\x39\x93\x98\x8b\x5f\x15\x05\x79\xc7\xcc\x25\xb6\xa1\xfb\x0d\xde\x94\x80\x4f\xa6\xef\x66\xff\x79\xfb\x91\x07"}, -{{0xb7,0x86,0xcc,0xfb,0x58,0x6d,0x43,0xb8,0xc4,0x6b,0xb9,0x7b,0x96,0xc9,0x18,0x73,0x1b,0xc2,0xcc,0x11,0x92,0x77,0xf1,0x23,0x67,0x1e,0x30,0x14,0x81,0x58,0xd2,0xed,},{0x90,0xc7,0x00,0x46,0x00,0xf3,0xdc,0xe4,0x09,0xfd,0xea,0xdc,0x8e,0xd0,0x18,0xf9,0xea,0x26,0x3f,0x75,0x16,0x0a,0x74,0xab,0x54,0xf4,0xc2,0x39,0x9a,0x90,0xca,0x78,},{0x52,0xba,0x96,0x58,0xa1,0xa0,0xb3,0xe9,0x8e,0xd5,0x20,0x9e,0x39,0x3e,0x42,0x00,0x66,0xa3,0x7d,0x37,0x14,0xda,0xa7,0x3d,0x5c,0x67,0x1d,0x33,0x07,0x5a,0x5f,0x57,0x27,0xfe,0x4e,0x08,0x1e,0xe0,0xfa,0x3c,0x21,0x33,0xdc,0x95,0x3a,0x2d,0xa6,0x20,0x29,0x13,0x71,0xf0,0x0c,0xcb,0x57,0xd8,0x79,0x2e,0xb5,0x96,0xa2,0xff,0x81,0x01,},"\xba\xbf\x48\xbd\x55\xea\x91\xbd\x0c\x93\xb9\x70\x24\x1b\x52\x9d\x9d\xb4\x3d\x49\x27\xfe\xa5\xf1\xa1\xf7\x08\x2d\xd6\xcb\x50\xa5\x2b\x09\x4b\x31\x29\xfc\xd9\x03\xa4\x4f\xec\x8b\xfd\xb5\xc8\x6c\x00\x2a\x2a\x45\x28\x87\xca\x25\xa6\x0e\xce\xb5\xe1\xf9\xf5\xc9\x3d\xc5\x94\x23\xc7\xaf\xe7\x47\xc6\xbf\x40\x7c\xac\xad\xec\xcf\x5d\x78\x79\x70\xcb\x06\x17\xbb\x3c\xfe\x7f\xd1\x75\x63\xd3\xa0\xdc\x91\x63\x1f\x71\xb8\x4b\xe2\x4a\xe8\x00\x11\x37\x50\xf0\x31\xd0\x1f\xd0\x53\x64\xb4\xf2\x7f\x86\xf8\xdc\x3a\xd7\x40\x7e\x1a\xe9\xe7\x68\x15\x4e\x3d\xde\x58\xe8\x67\x12\x9e\x24\x74\x54\x7b\x40\x82\x17\x96\x48\x44\x85\x8d\x05\x6b\x31\xc3\x74\x99\x1b\x7f\x16\x1f\x52\xf0\x88\xb8\x06\xe0\xf3\x13\xd6\x8a\x15\xc5\x40\x1e\xd5\x5b\x2b\x77\xde\xea\x58\x6c\xb0\x54\xdc\xd7\x1a\xf2\xab\x6a\xb1\x1e\x84\xb3\x0c\x53\x93\x45\xde\x3e\xb4\x3f\xb7\xb3\xa3\xb4\x89\x87\xc3\xbf\xa7\x06\x55\xd5\x99\xf2\xe3\x1d\x12\xad\x23\xcc\x96\xe8\x6d\x38\x0b\xfd\xa8\x12\xfe\xff\x3d\xd3\x02\x42\x92\x91\x69\x07\x02\x28\x91\xe1\x19\xbf\xc3\xed\x9c\x25\x54\x6c\xd1\x9f\xc9\x92\xd8\xa6\x1e\x60\x59\xca\x3c\xe7\x80\x2a\xf1\x11\x87\x56\x62\x0b\x87\xa7\x24\x2b\xd8\x38\x97\xc9\x4d\xd5\xa3\x6e\xd4\x0f\xc0\xf3\x4c\x2c\x93\x11\x0b\x37\xd1\x7d\xd9\x6a\x22\x06\x25\x90\xbc\xdb\x54\x67\x42\xef\x72\x18\xad\xcc\xc5\xad\x28\xf4\xfc\xe6\xec\xf7\x05\x83\x5f\x41\x13\xd8\x2e\xa5\x33\x90\x3a\xec\x8c\x38\x20\xfe\x4b\x47\x15\xf3\x7e\x20\xce\xbc\x1e\x71\x51\x9a\xa0\xb2\x40\xb4\x84\x0a\xa4\xfd\xcf\xb5\x24\x67\xfe\xdd\x8f\x4d\x1f\x9b\xc3\x3e\xe1\x14\xf3\xef\x85\xf5\xfd\xb0\x9c\xa8\x84\xaf\x38\x8a\xd3\xad\xf8\x4c\x79\x3f\x38\x6e\xfe\x6f\xf8\xa4\x6e\xd8\x1e\x5d\x45\xa3\x7c\x25\xcd\x80\xf2\xd7\x36\x3f\x43\xae\x45\xe3\x77\x2c\x0d\xf8\x9f\x11\x44\x79\x39\x80\x6c\x09\x6e\xf9\x33\xa1\x39\x44\xf0\x89\x0d\x88\x7c\x2e\x5b\xbb\x6b\x12\xea\x95\x0b\x09\xb8\xfe\x42\x52\x89\x37\x73\x52\xf3\x5f\x84\xcc\x4d\xcd\x4d\x7a\x44\x94\x89\xfa\x92\x51\xc0\x31\x13\x48\x92\x25\x80\x9c\xdf\x3c\xb6\x34\x75\xf1\x0d\x34\x17\x09\x37\x1c\x6f\xd4\xbb\x7a\x94\x94\x83\xd1\xbc\x2b\x31\xdd\xf4\xd9\x63\xa0\x7d\xe7\xea\x5c\x3f\xee\x9a\x0e\x33\xf0\x76\x9f\x2f\xaa\x40\x61\x2a\x54\x69\x74\xbd\xe0\xb7\x33\x91\x79\xe4\x12\x4a\x44\x7b\xd4\x28\x79\xcc\xda\x5c\x8a\xd1\x81\x9c\x53"}, -{{0xdd,0x1a,0x97,0x74,0xf7,0x58,0x4d,0x85,0x89,0xb1,0x9f,0x92,0xab,0x69,0x39,0xac,0x48,0x56,0x02,0xfe,0x16,0x44,0xce,0xe2,0xf6,0xf3,0xcd,0x60,0xfb,0xd5,0x84,0x00,},{0x4b,0xea,0x7d,0x0b,0x0f,0x4b,0xd5,0x90,0xf9,0xe3,0x57,0x9f,0x0c,0x5f,0xa4,0xce,0xf4,0xd6,0x0a,0x49,0xd2,0xc4,0x37,0xa0,0xaa,0xea,0xd9,0xd4,0x3a,0x73,0xd4,0xa3,},{0x19,0x59,0xbd,0xe0,0xa6,0x97,0xa6,0x39,0x93,0xec,0x47,0xd1,0x58,0x22,0x37,0x39,0xfe,0x65,0x87,0x1f,0xa0,0x58,0x70,0xd7,0xde,0x0d,0x38,0x08,0x65,0x91,0x20,0x2a,0x51,0xb1,0x74,0xd1,0xc6,0x18,0x28,0x08,0xc6,0xce,0x62,0x63,0x1d,0x81,0xdb,0xa3,0x4e,0xbe,0xd4,0xaf,0x2f,0x29,0xb0,0x6c,0x00,0xa5,0x7a,0x3c,0xb6,0x66,0x36,0x06,},"\xe5\xdc\x3e\xd2\x6c\x1f\x69\x3c\xf8\x52\x46\x5a\x05\xe3\x04\x8b\x50\x5d\xb5\x11\x6d\x9e\x31\x59\x22\x05\xa9\xc3\xd4\x72\x0b\xc1\x0b\x6c\x20\x63\x9a\x0e\xe2\xf0\xe1\x47\x22\x5b\x5b\x19\xea\x51\x1c\xfb\xa0\xc2\x1a\xac\x10\x71\x5a\x2f\x23\x2f\x10\xc2\xc8\xaa\xd4\x11\x12\xb6\xb0\x12\xe7\x5a\x41\x55\xf8\xc6\x92\x62\x53\xca\x2b\x4d\xdb\x7b\xfe\x7f\x86\xe9\x0a\x53\xdb\xc0\xcb\xa8\x9e\x48\x5c\xec\xa8\xfd\x26\xe5\x0c\x7f\x28\x2a\x25\x35\x73\xcb\x0a\x8f\xa8\x8c\xc4\x46\x23\xe8\x2e\x8f\xa2\xed\xb6\xcb\xc7\x53\x8a\xc9\x2c\x11\xe4\xc5\xb1\xea\x5f\x68\x96\x6d\x15\xd9\x3c\x34\xf3\x96\xd2\x75\x72\xf8\x64\x38\x2a\xb7\x6a\x7b\xe6\x5a\x55\x7b\x13\x97\x66\x36\x8a\x20\x7d\x98\xbc\x0c\x20\x92\x63\x70\xde\xa2\x70\x48\x16\x03\x63\xed\x85\xf4\x09\x9e\x7c\xd6\x6d\x12\xd0\x98\x8c\xfc\x9e\x2f\x16\xaa\x56\x5f\x8f\x33\xb3\x9e\x97\x8c\x05\x87\x37\x1f\x92\xdb\x50\x56\x31\x75\x64\x41\x1b\xd8\xa3\xb6\xfe\xa0\x9d\x34\x87\xaa\xf7\x34\x03\x49\x18\xff\xed\x1c\x9f\xba\x7b\xde\xc6\xfe\x68\x87\x6f\xc7\x36\x0c\xc5\x62\x9b\x92\x10\x40\x27\xfe\x57\x59\xc5\xab\x36\x53\x54\x75\x1e\x79\x69\x11\x6c\x3b\x9a\x21\xb1\x52\x33\x0a\x96\xa9\x38\x1a\xf7\x30\xd1\x78\x22\xd7\x8a\xd6\xea\x86\x00\x06\x91\x5b\x5c\xab\x44\x7a\x75\x93\x72\xe0\x5d\x49\x5e\xbb\x32\x8e\x75\xd2\x48\xda\xa0\x2f\x5d\x2e\xb9\x78\xd2\x71\x0c\xf1\xc5\xfb\x82\x48\x76\x77\x0e\x32\xca\x6d\xe2\xc7\x30\x56\x48\x92\x41\x5b\xcb\x53\xe5\x98\x1d\x70\x7a\xdd\x96\x1c\x5f\x37\xfd\xaf\xa1\x39\x9a\xf8\xae\xa9\x60\x45\x8d\x2c\xa3\x10\x55\x3f\x7c\x98\x66\xcc\xbe\x8e\x9d\x88\xe0\x8a\x44\x68\x72\xea\x66\xfc\x30\x8c\x82\x45\x14\xb7\xda\xce\x03\x34\xdb\x73\x5e\x6f\x14\xc8\x5b\x5e\x61\x9a\x5d\x60\x56\x48\xa8\x81\xe8\x76\xc7\x8d\xbe\x06\x57\x23\x3d\x4f\x7f\x3b\xfd\xdf\x63\xb4\x45\x31\x1d\x6a\xbc\x47\x63\x47\xec\x4f\xb4\x3c\x89\x46\xf9\xd1\x7c\x36\x93\x81\xd1\xc5\x64\xff\xcf\xe2\xdc\x7b\x47\x26\xfd\x57\x38\x7f\x0b\x44\xdb\x8e\xf9\x5a\x0b\x4e\x32\xa7\xbe\xdf\x31\x9e\x53\xa9\xe7\x12\x6c\x28\x11\xf9\x82\x9d\x1f\x4a\xe9\xab\xd9\xd5\xf4\x2e\xfe\xf2\x07\x5f\x47\x05\x1c\x63\xa4\xf8\x20\x20\x40\xec\x47\x23\x68\x63\x82\xc6\x03\x31\x27\xc1\xfb\xff\xf4\xbc\x82\x37\x35\x08\x75\x2d\x43\x1d\xc4\x73\xf5\x2d\xde\xab\x03\x42\xdc\x4f\x54\x47\xf8\xf2\x57\x38\xef\x65\xd7\x85\x56"}, -{{0x66,0xf5,0xea,0x8c,0xdb,0x95,0xee,0x1a,0x75,0xe3,0x24,0x67,0xd7,0xc8,0x3c,0x59,0x44,0x77,0x42,0xc8,0x5d,0xdd,0x49,0x9c,0x43,0xc0,0x86,0x73,0xe1,0x49,0x05,0x3a,},{0xa8,0xad,0x04,0xb9,0xc1,0x44,0xb9,0x7f,0xe8,0x67,0x37,0x4d,0x4f,0xe5,0x7d,0x7e,0xc0,0xc2,0x49,0x18,0x3e,0x43,0xbd,0xfb,0x5d,0x52,0x64,0x4e,0x7f,0xbe,0x1d,0xf3,},{0xec,0x5c,0x7e,0x83,0x92,0xfa,0x8b,0x61,0xbc,0x82,0x96,0x81,0x86,0x6e,0x45,0xac,0x8b,0xe4,0xb5,0xb7,0xb6,0xa8,0x22,0xc1,0xbc,0xd0,0xf2,0xcc,0x2c,0x8c,0x44,0xc3,0x3c,0xf8,0x3f,0xa4,0x2d,0x43,0xa2,0xf1,0x88,0x41,0x41,0xb4,0xa5,0x9a,0xaf,0xf4,0x7f,0x9b,0xe0,0x7e,0x63,0x2e,0x20,0x18,0x75,0x93,0x24,0xea,0xc9,0xd1,0x49,0x00,},"\xc0\xd0\x1d\xce\xb0\xa2\xd1\x71\x91\x10\x18\x79\xab\xb0\x93\xfb\x07\x75\x71\xb5\x21\xbe\x7b\x93\xa1\x17\xc6\x96\xc0\x87\x2f\x70\xea\x11\x39\xab\x62\x83\x29\xee\x56\x55\xfc\x0a\xa7\x7e\x81\x11\xd2\xfc\x88\x47\x48\xc1\xf2\x67\xb9\xeb\x09\xdc\x26\xf5\x7f\xc4\x02\xd6\x1b\xa3\x6f\x63\xf4\xd5\x89\xaa\xe6\x3c\x76\xee\xee\x15\xbf\x0f\x9e\x2d\xcd\xe4\xe4\xe3\xe7\x8f\xc6\xc2\x9e\x3a\x93\xf3\xff\x0e\x9a\x6e\x0b\x35\x66\x45\x95\x38\x90\xde\xbf\x62\xdb\xea\xf4\x90\x51\x78\xd4\xf0\xa5\xa5\x92\xc1\x92\x94\xee\xba\x7c\x21\xcf\x8f\x1b\xb3\xf4\x51\x21\x87\x37\x6d\xe7\x2f\x11\x36\xa4\x8a\xc2\xdf\xaf\x32\xd0\xf3\x7d\xe0\x64\x59\x25\x92\xb6\xe1\xbc\x0c\x51\x2c\xf4\xd2\xd8\x5d\x16\x79\x78\x53\xa8\x09\x33\xb0\x9c\x2f\x7b\xfb\x9e\x54\xa6\x9e\x51\xa8\xe4\x23\xa9\x1c\x3e\x5f\xde\xb4\x79\x05\x33\xe8\x7a\x4b\x1c\x0e\x0e\x23\xa9\xdb\x95\x73\xac\x17\xab\x6e\xc7\x01\x4d\x8b\x7c\x44\x86\xe1\x57\x25\xf8\xd2\x64\xee\xa3\x05\x0e\x83\x5a\xe0\xac\x44\x9d\xb3\x34\x50\x2a\x6d\x97\x35\x8f\xa8\x59\x10\x6a\xd0\xf6\xf4\x29\x5f\x23\x44\x92\x0a\xdf\x93\x55\xa6\x94\x9d\x8d\x14\x5c\x25\x62\x8a\x46\xa1\x04\xca\x09\x9b\xd9\xdd\xe9\x41\x11\x9c\x83\x82\x0c\xdc\x2c\xb2\xd0\x97\x22\x69\x49\x01\x04\x3c\x37\xcf\x0a\xe8\x79\xbe\x20\x30\xd0\x37\x31\x58\xb9\xc4\xb0\x71\x82\x98\xbe\x45\xf6\x30\xf6\xfc\xdc\x19\x0f\x7b\x29\x26\xd8\x76\x55\xa1\x8b\xb7\x97\xac\x50\x75\x7f\xcd\x36\x55\xc9\xe4\x1d\x51\x63\x29\x3d\x9a\x13\xd9\x84\xf5\x91\xf7\x5b\x7e\x4e\x5c\xad\xb6\x4c\x4c\x9f\xdf\xef\x76\xca\xb6\x93\x81\xd0\xf6\x0b\x48\x3f\x80\x4b\xb3\xb3\x33\x64\xdf\x8c\xff\xac\xb3\xc9\xb1\x3f\xf4\xc8\xd8\xd4\xea\x40\x76\x6a\x7d\x42\xd8\x25\x6c\x6b\x1c\x11\xc1\x91\xda\xba\x1b\x8e\xf2\x15\x93\xe4\x7b\x18\x85\x8e\xc1\x9d\x81\x73\x58\x67\x8d\x85\x48\xff\x15\x35\xd5\xfc\xf4\x41\x4b\x6a\x11\xd3\x4a\x37\x42\xf8\xd7\x14\x9f\xa6\x81\x38\x3a\x94\x08\x88\x7f\x1c\x0a\x98\xed\x52\x1e\x72\x79\x32\x77\x82\x4d\x6f\x74\x6d\x49\xb6\x3d\x44\x4e\x31\x2e\x6d\x9b\x98\x66\x11\x25\x81\x96\xa5\xb0\x12\xb8\x8f\xaa\x29\xf9\xa6\xc6\x7e\xd2\x5d\xf8\x7b\x2d\xbf\x0d\xbd\x2d\xc3\x08\x0c\x5b\x8d\x15\xa3\x7d\x34\x72\x90\x98\xed\x0d\xe9\x2d\x75\x80\x74\x29\xb2\xca\xe5\xd7\x28\x3c\x4e\x5c\x9b\xd1\x96\xd1\xad\x43\x6c\x7c\x34\xf3\xc9\x46\x6e\x5c\xb3\x19\x6b\x44\x3f\x4b"}, -{{0xed,0x25,0x58,0xe5,0xc5,0x67,0x84,0xbc,0xfb,0x4f,0x4d,0xde,0xa3,0xc0,0xdf,0xbe,0xf8,0xd9,0x6f,0xf1,0xca,0xbf,0x15,0x8e,0xc4,0xab,0xe6,0x0a,0xff,0x66,0x99,0x9e,},{0x1e,0xdc,0x99,0x10,0x12,0xac,0x6f,0x88,0x8f,0xa7,0xe6,0x04,0x57,0x77,0xe9,0xba,0x1d,0x4c,0x03,0xc4,0x02,0x92,0xd2,0xda,0x6b,0x72,0x2b,0x4a,0xd0,0xa3,0xed,0x74,},{0xab,0x9e,0x01,0x16,0x65,0x24,0xfd,0x28,0x8e,0x5c,0x68,0x9e,0x56,0xd7,0x30,0xd4,0x98,0x30,0x00,0x55,0x10,0x30,0x49,0x33,0x34,0xa3,0x98,0x4e,0x22,0x23,0xdc,0x9f,0x7a,0x5b,0x91,0x0c,0x61,0x76,0x0c,0x61,0x57,0x99,0x0a,0x4c,0x33,0x5e,0x34,0x8e,0x3a,0x7b,0xc8,0x22,0x3e,0x09,0xc1,0x0c,0x5e,0x52,0x0c,0x8d,0x61,0xaf,0xf5,0x00,},"\x2c\x64\x33\xe9\xbf\xbf\x4c\xfd\x4e\x07\x1f\x15\xce\x6b\x12\x9d\x78\x0a\x4b\x3d\xe0\x14\xfa\xc0\x34\xe0\xd4\x4e\xf7\x72\xe2\xc8\xb0\xd6\xa3\x48\x1d\x7b\x3d\xde\xb2\x37\x63\x26\x73\x55\x33\x13\xde\xac\x1e\xfa\xfe\x37\x02\xa7\xa4\x41\x1e\x12\xbd\x34\x1e\x8d\x8e\x96\xc5\x9c\x5e\x30\xc3\x68\x07\xa8\x38\x5a\x53\x8e\x9b\x66\x90\x7d\x6a\x52\x84\x00\xbd\x9f\x95\xee\xdc\x52\x16\xb2\x8f\xd7\x43\x7d\x8f\x4a\x02\x9f\xdb\xdc\x7c\x93\x8e\x4e\xb9\x81\x2f\xec\x05\xea\x69\x32\x29\x62\x9a\xce\x6a\xcc\x7a\xf6\xba\x4c\x23\x8e\x77\x22\xf3\x12\xf7\x89\x6b\x00\x49\x22\xf7\x06\x7e\xde\x10\x6f\x8e\x70\x15\x4d\x78\x3f\xb4\x12\x91\xf3\xc7\xe2\xe4\x82\x60\x45\xb5\x74\x1b\xcb\x4a\x88\x38\xf8\x7a\x32\xe0\x04\x97\x04\xe9\xb5\x32\x34\xc2\x24\xff\x89\x8a\x75\x6e\x52\x91\x34\xc1\xa9\xbf\x50\xfd\x02\x98\x19\xb2\x23\x8b\x60\xb2\xae\xc1\x12\x8f\x34\xd2\x1f\x9d\x66\x98\x3b\xed\x39\x86\x59\xd8\x08\xb6\x7a\x2e\x50\x1b\x5a\x1f\x25\xf7\x1f\x0f\x0c\x1e\xb2\xfe\xa0\xab\x42\xd8\x2f\xf3\xbc\x93\x58\xbb\x20\xc2\x75\x20\xc1\x44\xcf\x21\x16\xf4\xa4\x9c\xbc\x61\x99\x4d\x2d\x71\x05\x46\x69\x4c\x4f\x60\x2d\xc4\x06\xe0\xb0\xc2\x7e\x5f\x5e\x64\x66\x7e\x95\xc2\xec\x9d\xf2\xd6\x52\x9c\xf5\x36\x22\xea\x10\xb9\x56\xb3\x45\xec\x55\xb6\xc3\x9a\x1e\x6e\xd8\x8a\xe6\x6e\x5b\x45\x71\x79\x42\x5d\x1a\x84\x90\x37\xb0\x7c\x46\xcf\x5f\x36\x33\x01\x09\x58\x37\xce\x81\x1b\xff\x49\x60\xbf\x9c\xbd\x15\x20\x1c\x1b\x67\x40\xbd\x70\x10\x21\x40\x74\x4c\x33\x27\xac\xa9\xd6\xd6\xd1\x54\x93\x67\x98\xac\x38\x1f\xa6\x39\xdb\x43\x6e\xe8\x16\x56\x67\xd5\x38\xa6\xc7\x4a\x23\x3c\x12\x4b\xf6\x04\xfd\xad\x51\x98\x4c\x41\x70\xb8\x20\x0d\x2d\xf7\x3c\x29\xbb\x1e\x37\x6a\xff\xc3\x14\xdd\xe3\xe8\x6a\xf9\xd2\xc2\xe6\xc3\xa6\x52\x4d\x32\x1b\xce\x93\xe2\x1f\xc9\x65\x56\x4f\xaf\x77\xd0\xcd\x1a\xcc\xb4\xd7\x62\x94\x85\xf5\x64\xc7\x9f\x4d\x8a\x2f\xde\xfb\x46\x54\x54\x02\x8c\x6d\xd1\x42\x80\x42\x80\x53\x70\x74\x33\x63\xbb\x18\x47\x6a\x3f\x23\x20\xdb\x25\x89\xc7\x21\x33\xcf\x5e\x29\xda\xfb\x7d\x07\xaa\x69\xa9\xb5\x81\xba\xb5\xa8\x3f\x40\x3e\xef\x91\x7a\xfa\x14\xb7\x64\xc3\x9a\x13\xc0\xc5\xea\x70\x19\xd2\xfd\xfb\xd7\xf3\xf7\xd4\x0e\xb6\x3b\x2a\x08\x4d\xa9\x21\x89\x5f\xe4\x8f\x4f\xd5\x94\x01\x7f\x82\x56\x9b\x46\x7a\xb9\x01\x16\x9e\xb5\xda\x9c\x40\x17\x1d\x5f"}, -{{0xb7,0x27,0x98,0xb8,0x11,0xe2,0x33,0x84,0x31,0x25,0x6d,0x24,0x80,0xfe,0x7a,0x36,0x63,0xac,0xec,0xbb,0xe6,0xe6,0xc1,0xb9,0x19,0x1e,0x9d,0x9a,0x22,0x44,0x79,0x40,},{0xce,0x49,0x1d,0xaa,0xd2,0x96,0xb5,0x57,0x27,0xb0,0x95,0x13,0xdf,0x02,0xba,0x59,0x28,0xa3,0x71,0x73,0x7c,0xd3,0x58,0x41,0xe5,0xf7,0x35,0xac,0xab,0x7c,0x5d,0xf8,},{0xdc,0xfc,0x6f,0xd4,0x77,0x99,0xfe,0xc7,0x72,0xc2,0x09,0x9b,0x3c,0x64,0x37,0x24,0x6c,0x3a,0xd0,0x72,0x29,0xfc,0x74,0x0e,0x05,0x31,0x1a,0x20,0x6b,0x18,0xb0,0x2e,0xcd,0xb0,0x26,0xc9,0x26,0xf4,0x9c,0x65,0x52,0xe3,0x47,0xfd,0x35,0xdf,0xde,0x06,0xcb,0x63,0x9a,0x79,0x7c,0x50,0x61,0x2f,0x98,0xe2,0x47,0x8a,0x92,0xaa,0xf6,0x09,},"\xa5\xd4\x62\x98\xb0\x79\x06\x10\xae\xdc\x09\x70\xfe\xa2\xa7\x07\x50\x81\x84\x72\x66\xf2\x2f\x12\x47\x8b\x93\xd7\xe6\x74\xc6\xc5\x17\xf3\xc1\x4e\xd0\x61\x26\x9d\x17\x0a\xc3\x1e\x2a\x64\xf9\x75\x4a\x56\x5b\xac\x1d\xd9\x75\x73\x22\xc1\x11\x32\xe7\xbb\xee\x5f\x32\x81\x8e\x0e\x30\x63\xab\x64\xe5\x52\xd0\x9b\x0f\xd1\x75\x76\x39\xb9\xb9\xd1\xc7\x70\x01\x6b\x67\x74\x65\x87\x2b\x66\x9d\xd4\x8b\xe0\x38\x66\x57\x51\x67\x4d\xd2\xf4\x0a\x96\x6a\x26\x74\x8f\xd3\xe5\xdb\xfd\x92\x26\x5e\xb9\x36\xf5\x5b\x09\x42\x86\xc0\x10\x62\x99\x04\x34\x7c\xb4\xc5\x26\xe3\x77\x47\x0a\xa9\x6e\x81\x69\xa6\xf2\x11\x63\x38\x07\xa5\x00\x30\xe7\xff\x68\xe3\x89\x11\xb3\x55\x5e\x72\x8e\xd8\x59\x0b\x2d\xc4\x5f\xea\x69\x94\x5c\xc0\xc9\xa3\xd3\xe6\xc9\x54\xb3\xe8\x01\x06\xa5\xc9\x1d\x3d\x22\xe8\x9e\x8c\x0e\x1d\xe9\x02\x05\x8e\x9c\xd0\xf8\xce\x80\x6e\xac\x4f\x89\x3e\xe0\x42\x99\x00\xfb\x54\x87\xb8\xfd\x36\xdb\xdc\xb3\x4f\x2d\x54\xfc\x6c\xc7\x4a\x92\x39\x51\xb8\x63\xda\x70\xf1\xb6\x92\xbf\x04\x38\x48\x43\x66\xcd\x85\xee\xb8\x80\xb2\x79\xf8\xfc\xa9\xd3\x24\x2c\x55\x83\x30\xf1\xca\x57\xc6\xa5\x86\x08\xcd\xbc\x07\x73\xe1\x60\x82\xbc\xa9\x64\xdd\xc4\x03\x47\xda\x8a\x36\xb2\xa9\x32\x8c\x2f\x46\x60\x9e\x09\x2f\xd6\x4b\x41\x34\xee\xe1\xd0\x99\x81\x3e\x12\x46\x48\x9e\x8e\xe5\xb1\x9b\x3d\x3b\x89\x1c\x28\xf3\x0b\x38\xb6\xa2\x8e\xc1\xd3\xe9\xb0\x05\xde\xc9\xc6\x3f\x8b\x98\x13\xbc\x1d\xe4\xaa\xf9\x95\xf1\x77\x9d\xde\xd1\x5c\x7a\x43\x0d\x70\xca\x46\xe7\xca\xfd\x4e\x9a\x54\x38\x04\x44\x6a\xb0\x80\x7d\x64\xf2\x55\xe2\x01\xef\x42\x8a\x47\x4d\xae\x8a\x0a\x75\x02\x1b\x62\xad\x39\x88\xff\xb8\x1c\xd8\x22\x1b\x24\x30\x85\xa0\xad\x04\x6f\xdc\x16\xc6\x7f\x17\xb9\xf8\x18\x20\x09\x59\x53\xa5\xb9\x8a\xcb\xdf\x93\xeb\xcf\x80\xbc\x9c\x99\xaf\x5f\xbf\xfa\xcb\x61\xa9\x25\x1c\x5a\xaf\xdb\x22\xb1\x12\x9b\xfc\x60\xc9\x8e\x0f\x17\x52\x63\xbd\xf9\x3d\xc9\xa0\x8b\x8e\xfc\x2e\x8c\xda\xf0\xf8\x3d\x6c\x49\xec\x90\x16\x45\xea\xc5\xa4\xff\x63\x38\x5a\x6f\x1a\xf2\x07\x18\x97\x66\x2a\x37\x22\x19\xc9\x30\x1f\x54\x5a\x2e\xbb\x8f\x59\x17\xdb\x7f\x29\xca\x13\xfc\x86\x1a\xf3\x8d\x90\xc3\x5c\x03\xac\x91\x84\xc1\x22\xe5\x7b\x05\x7c\xde\x42\x6f\xd7\x6d\xca\x79\xe2\x5e\x64\xdb\xb4\x1c\x84\x14\xa0\x45\x0d\xa4\x90\x5b\x90\x2a\xe9\x8d\x2d\xa4\xba\x79\x28\x01"}, -{{0x1f,0xe7,0x32,0x7e,0xa9,0x07,0xd3,0xff,0x17,0x9b,0x11,0x78,0x11,0xd3,0x01,0x93,0xfc,0xba,0x4c,0x34,0x7b,0x90,0x65,0x7f,0xee,0xd9,0x8d,0xee,0xec,0xda,0x9a,0xc9,},{0xee,0xf3,0x01,0xb1,0x6f,0xd7,0xbf,0x3c,0x7b,0x64,0x0b,0xf5,0xee,0x87,0x00,0xac,0x5a,0x87,0x16,0x9e,0xab,0x5f,0x56,0x01,0x5b,0x3f,0x49,0x9d,0x95,0x5e,0x07,0xeb,},{0x9c,0x7f,0xdb,0x53,0xfd,0x60,0x6b,0xc7,0xc9,0xc2,0x23,0xfe,0x94,0x31,0xe1,0xad,0x00,0x95,0x46,0xd0,0x00,0x98,0x81,0x2a,0x49,0x51,0x97,0xf2,0x54,0x1e,0x87,0xf8,0xd6,0xf5,0xda,0x22,0xec,0xef,0xcb,0xb7,0xda,0x56,0x66,0x2a,0x73,0x09,0xd1,0x0a,0x6c,0x4a,0x4f,0x7f,0x29,0x92,0x78,0xd5,0x1b,0xbd,0x11,0xe0,0xcc,0x1b,0x87,0x09,},"\x19\xa8\x32\xf2\x6f\xbb\x02\x39\xf0\xd9\xd2\x6a\x2e\xbd\xed\x24\x03\xc2\xa4\x06\xdd\x1f\x68\x31\x8d\x67\x7a\xfa\x64\xf3\x50\x43\x31\x6a\x5e\xfd\x72\x97\x83\xc7\xf9\xd1\x8c\x09\x82\x46\x14\x65\x20\x91\x88\x6c\xc9\x54\xbe\x9f\x93\x12\xd4\x58\x6b\xf3\x6f\x30\x35\xac\x70\x34\x38\xb0\xcf\xe3\xde\xc5\x07\x78\x13\xc7\x10\xd1\x44\x75\x61\xab\x61\x57\xbc\x7a\xd5\xea\xb5\xb0\xc0\xaf\xdc\xc9\xdb\x77\xe6\x6f\xa8\x07\x13\x66\x82\x9c\x50\x10\x96\xc3\xd3\xa9\x38\x21\x8a\x6e\x42\x07\x10\x9d\x1e\xb8\x1f\x7d\x88\xbd\x6f\xbb\x2a\xef\xb1\xad\xef\x35\x94\xaa\xe5\x7c\x46\xb7\xb9\x84\xdb\x94\x68\xcd\x96\x2c\x61\x84\xfb\x97\x6f\x0e\x2a\xa8\x41\x52\xde\xb1\xc7\x6a\xea\x75\xae\x48\x84\x42\x94\x3a\x80\xba\x7d\x98\xa2\x8c\xb8\x64\xb5\xe8\x7c\xdb\x28\x4a\xd6\xe8\xd7\xaa\xdc\x6b\x75\xd6\x9d\x3b\xd3\x45\x78\x3b\x3e\xbb\x67\x6f\xf9\x5d\x7b\x41\x91\xe5\x99\x85\x1c\x96\x28\x83\x5c\x7c\x01\x19\x7e\x7c\x8f\x86\xf9\xc8\xfb\x49\xfe\x3e\x28\x45\x8b\xa9\xb0\x23\x62\x19\xbd\x46\xc2\x8d\xf6\x53\x24\x96\x99\x4a\xc9\xba\x73\x3c\x01\x05\xa0\x2a\x26\x9a\x2b\xe8\xb7\xcb\x40\x07\x4b\x88\x16\x02\xef\x92\x47\x05\x2d\xe9\xd6\x37\x08\x91\x88\xbd\x4c\x18\x5c\xca\xe2\x58\xa2\xae\x98\x56\xa2\xcb\xf8\x45\x11\x17\x68\x3c\xe3\x41\xf8\x09\x6e\x1d\x91\xe8\x74\xc5\xcb\x8a\x4e\x09\x39\xeb\x77\x37\x3a\x9a\x0e\xb7\x91\x64\x5b\x8f\x54\x60\x47\x2d\x66\x9d\x80\x14\x68\x1a\x5e\x77\x87\x06\xcb\x55\x66\xbb\xd4\x72\x7d\x17\x16\xb2\x3c\x62\x0d\x22\x8b\x5d\x4d\xc2\xb3\x52\xb4\x23\x93\x1f\x8a\x7e\x8f\xb5\x9e\xda\xd8\xae\x42\x45\x87\x29\x86\x1a\x98\xe0\xc8\x50\xa7\x7e\xd6\x55\xe7\xfc\xfe\x4f\xe3\x6f\x97\x72\xdf\x1a\xc3\xc6\x43\xad\x31\xdb\x56\x30\xd5\x71\xdf\x9f\xcc\x9c\x50\xde\x76\x22\x10\x84\x11\x96\x2b\xbf\x72\xde\xfb\xf4\x9e\x99\x70\x59\xc7\x31\x1b\xd9\xdd\xd5\xb3\x38\xa9\x85\x19\x38\xd3\x7e\x7a\x26\x21\x08\xa2\x91\xe2\x01\x68\x03\xbb\xef\xf4\xf9\xc7\x76\x12\x5c\xeb\x7e\x72\x72\xb5\x1c\x7c\x33\x46\x1d\x80\x89\xf8\x40\x8d\x8d\xda\x92\x50\x6d\x50\x02\x08\x4d\x4f\x41\x4d\x8a\x4d\x28\xd3\x69\x4c\x88\x63\x0e\x31\x80\x19\x90\xd9\x52\x71\xce\xf4\x7a\xa5\xc2\x63\xf9\x7b\x7d\xac\xa1\x78\x87\x01\x43\x63\x29\xb5\xbf\xaf\x72\x65\x3c\x16\x6d\xb0\x87\x70\x81\x30\xc5\xc0\xd7\x8c\xc4\xe9\x06\x4f\x86\x06\x80\x27\x1a\xfe\x4c\x40\x98\x53\xc2\xfa\xd6\x75"}, -{{0x5f,0x9d,0xcd,0x93,0xfb,0x14,0x06,0x10,0xb0,0xe2,0x11,0xb3,0x9a,0xdd,0xb1,0xeb,0x87,0xba,0x97,0x80,0x48,0x77,0xaf,0xbc,0xc3,0x81,0x38,0x8c,0xad,0x65,0x08,0x45,},{0x18,0x2a,0x23,0x7d,0x87,0x8c,0x58,0x19,0x33,0x33,0x2b,0x41,0x78,0xb6,0x7e,0xc4,0x08,0xb3,0x19,0x4d,0x44,0xe4,0xe6,0x93,0x92,0xef,0x80,0x0b,0x26,0x7c,0x29,0x49,},{0xc1,0x91,0x5e,0x05,0x2b,0x66,0x47,0x97,0xe0,0xd5,0xfa,0xad,0xc7,0x8f,0x2a,0x00,0x9d,0x6f,0xbc,0xfd,0xe0,0x3f,0x3a,0xaa,0xd5,0x9b,0x9f,0x45,0x88,0xe7,0xfc,0x3b,0x21,0x99,0x0c,0x52,0x08,0xd3,0xd7,0x6b,0x4a,0xa9,0x5b,0xd9,0x34,0xe8,0x8d,0x3c,0x98,0xc5,0x91,0x93,0x0a,0x59,0xde,0x2a,0x05,0x67,0x01,0xd9,0xf7,0x57,0x74,0x00,},"\xc3\x8b\x87\x4d\x3f\xf0\x10\xff\xf1\xa6\x61\x3b\xfa\x13\x42\x57\xb2\x48\x33\xcb\x53\x6d\xe3\xe7\x49\x92\xc3\xcb\x01\xfe\x3b\xbd\xee\xd9\x7d\xc3\xc4\x59\x6f\xa4\x40\x61\x44\x2b\xd3\x1a\x9d\x4a\xa8\xc8\x1e\x34\xad\x98\x88\x71\x82\x06\x63\x55\x09\xb1\x33\xb1\xba\x69\xcb\x1a\xa0\xe7\x5c\x7a\x18\x93\xc0\x80\x16\x1d\x26\x15\x2a\xce\xf4\x0f\x6e\xf4\x21\x0e\x95\x2a\x49\x82\x8b\x5c\xdd\xe8\x04\xbc\xb5\x36\xcd\xc3\x49\xa8\xe8\x31\xb4\xb6\x9d\x37\x85\xa7\x6b\xd9\xfb\x27\x08\x05\x65\x97\x2d\x0b\x8f\xbd\x16\xf3\xf9\x60\xa6\xbf\x3b\xa0\xc5\xb9\xc4\x04\x96\x7e\xc1\xaf\xfe\x59\xb8\xc4\xec\xc6\x50\xfd\xde\x1c\xb0\x6b\x70\x59\x5a\xd4\xd3\x25\xda\x0f\xab\x4c\x55\x40\xa7\xa8\xd5\xeb\xea\xcc\x4e\x99\xbd\x0d\xc9\x6b\xde\x82\xf2\xbd\x7d\x95\x86\x30\x84\x65\xe5\x5b\x1c\xc3\x88\xd7\x50\x48\x6b\xdd\x5c\x72\x64\xd5\x4f\x56\x14\xd4\x87\x26\xd9\x9e\x44\xd7\x77\x8d\x9e\xd0\x32\x39\x58\xab\x98\x58\xe2\xb2\x5d\xf2\xbf\x99\x4b\xa3\xe6\x25\xe2\x80\x3b\x6c\x69\x31\xe7\xa9\x92\x6f\x1e\x61\xed\x86\x24\x03\xce\x39\x2a\xb8\x3b\x7d\x1b\x66\x08\x5d\xcc\x06\xd8\x2d\xbf\x17\x6d\x01\x6d\x9f\x44\xcd\xcb\x50\x72\xd0\x04\x59\x1e\x92\xd0\x45\x9e\xf0\x5a\x51\xb8\xf5\x4b\xa1\x72\x51\xe1\x66\x21\xeb\xb7\x53\xe5\xb1\x59\x0c\x02\xd2\x1e\x40\xf4\xb7\x5e\xee\x46\x02\x86\x0b\x97\x41\xfb\xbc\x0d\x2e\x38\x5b\x8d\xac\xa8\x3c\xce\x68\xc3\x4a\x99\xbd\xe6\xa6\x0d\x13\xba\x64\x34\x7d\x0a\x38\xd6\x4b\x2a\xde\x25\x0f\x38\x85\x2c\x4e\xda\x2e\x2e\x4f\x30\x3c\x3d\xe1\xa8\xa9\xd4\xab\x33\x00\xc9\xe6\x36\x22\x87\x9f\xc8\x53\x7f\xfc\x63\xb1\x85\x61\xfa\x1f\xff\x65\x53\x12\x41\x51\x5a\x62\xbb\x9b\x08\xb8\x0a\xf3\x76\x67\xa6\x01\xae\x04\x17\x17\x93\xcc\x83\xb1\x1a\xdf\x9c\x30\xca\x9f\x4d\xab\xc7\xb4\x01\xe1\x6a\x18\x14\xcf\xc7\x50\x24\x8c\xc2\xf7\x7e\x03\xf9\xc4\x33\x44\x65\xff\x6a\x2c\x83\xcb\xb5\x6d\xb4\xb7\x34\x75\x10\x43\x83\x2c\x40\x00\x97\x2e\xe3\x23\x2f\x92\x9f\x23\x33\x7e\xba\x5e\x65\x1e\x34\xcb\xdd\xfe\x68\xba\x21\x9b\x63\x2e\x7a\xcd\xbd\x46\x30\xa0\x31\xbf\x16\x89\xfb\xbc\x7f\xbb\xb2\x10\xdb\xf2\x5e\xe8\x7e\x2e\xf2\xb3\xcb\xaf\x8d\x9e\xbd\x8f\xc9\x2c\x3a\x58\xd3\xc0\x5b\x13\x85\xa7\x6c\x87\x79\x1d\x7c\xd3\x74\x1b\x71\xb6\xc3\x29\xde\x9a\x9d\x75\x08\xa0\xc1\x56\xa9\x52\x1a\x90\x20\x56\x30\x99\xa8\x2b\x87\x70\xae\x9a\x94\x4a\x7e\x94"}, -{{0x92,0x5e,0xbe,0x04,0xc6,0xea,0xc4,0x9b,0x26,0x73,0x8d,0x6c,0x13,0x00,0xf3,0x1f,0xd4,0x82,0x84,0x78,0xcb,0xe9,0x7d,0xab,0x18,0xbb,0x88,0x96,0x42,0xe1,0xe1,0x10,},{0xcd,0x72,0x31,0xb6,0xeb,0x74,0xe1,0xfe,0x9f,0x92,0x6f,0x00,0xd8,0xde,0x2c,0x51,0x3d,0x49,0x64,0x05,0x25,0xb0,0x79,0x5c,0xab,0x89,0x3d,0x0c,0x89,0x29,0xe3,0xe0,},{0x2c,0x4d,0x69,0xbe,0xd5,0xad,0x8b,0x95,0x84,0xd8,0x49,0xcf,0x3d,0xf2,0xba,0xc7,0x22,0x82,0xb5,0xf3,0x0d,0xe2,0x66,0xb1,0x4f,0x53,0x3c,0xa9,0x6e,0x95,0x50,0xc4,0xb8,0x54,0xc1,0x54,0xbd,0xc1,0x7a,0xa8,0x80,0xcf,0x00,0x1a,0x64,0x54,0xff,0xaf,0xaa,0x2e,0x50,0x17,0x8d,0xe2,0x12,0x16,0xed,0x12,0x6b,0x63,0xf7,0x7f,0x2d,0x02,},"\xe6\xc0\xba\xd2\x3a\x92\xae\x8b\x1d\x85\x77\x82\x88\x15\x7a\xc6\xc6\x17\xc6\x33\x63\x34\x1d\x77\x78\x70\x34\x1b\xb1\x0a\x8d\x3d\xfc\x89\xbe\x4f\x55\xad\x4f\x64\xe8\x3b\xf2\x49\x9b\x69\xfd\xf7\x21\x74\xd2\x84\x4e\x6b\xd2\x89\xda\xaa\x03\x5f\xec\x5b\xf7\xcf\x45\x52\x21\x19\xdc\x7a\x8c\x81\x1d\x79\x57\x8c\x5b\xb0\xf6\xd3\x4d\xb5\x07\xad\x1f\xb6\xdb\xff\xf9\x97\xb7\x9d\xac\xfb\x3d\xa5\x0a\x41\x5e\x35\x0c\x99\x8c\x0a\x02\x80\x0a\xa5\x0f\xfd\xfe\x5f\x42\x76\xd8\xe6\xbb\x82\xeb\xf0\x47\xfe\x48\x71\x1d\xaf\x7a\x89\x3b\xdc\x75\x37\xbd\xae\xdf\x3d\xcb\x4d\xec\x5d\x24\x58\x68\x11\xf5\x9b\x25\xb1\x9e\x83\xca\x61\xe5\x59\x2f\xed\xc0\x8c\xa5\x44\x73\xce\xa2\xec\x12\x1b\xaa\x0e\x77\xfb\x2d\x9d\x76\x56\x57\xde\x67\x98\x0e\xd5\x7f\x2f\x17\x78\x58\xb6\xde\xcf\x84\xff\x90\x21\x2d\x96\x47\xf4\x1e\xed\x9b\x9d\x0e\xa3\xd8\xd6\x21\xe4\xbb\x40\x41\xac\xc5\x14\x6e\x96\xdf\xcf\x14\xea\x96\x2d\x30\xc8\xcc\xb3\x9e\xa2\xbe\x95\x8c\x9b\x87\x74\x45\x1b\xfe\xb7\xdd\xce\x71\x6e\x94\x92\x3c\xc8\x5f\xbd\x3a\x31\x30\x78\x0e\x2b\x3b\x2b\xb7\x6d\xa5\x34\x19\x12\xa4\xe9\x94\xca\xfa\x19\xbb\xa1\x97\x32\xf2\xea\x40\x2d\x71\xd3\xd8\xa9\x69\x67\x9b\x9d\x10\x42\x43\xd9\x83\x9c\x69\xee\x9e\x95\x5e\x1c\x60\x44\x97\x88\xd1\xf4\xf6\x65\x1f\x4b\xc9\xb9\x4d\x73\x52\x2e\xc0\xcf\x72\xca\xcf\xcf\x19\xf1\xf0\x3a\xd6\x23\x21\x04\xb5\x5c\xbb\x8b\x5b\xb1\xe2\x13\x44\x71\x3d\x48\x27\x42\xd6\xab\xc5\xa9\x57\x17\x4f\x62\x3b\x84\x95\x27\x2c\xc1\xe2\xb8\x31\x5e\x5c\x80\xf9\x47\xf5\x00\xc8\x3d\x85\x44\xf7\xcd\x4f\x65\x34\x89\x49\xef\x44\x20\xd7\xfc\x83\x1f\xa4\xae\x2e\xe1\x8d\xbb\xa6\x14\x92\x5c\xe1\xd7\x67\xc1\x77\xa6\x26\xc4\x52\x7a\x81\x54\xb5\x72\x92\x18\x6b\x04\x4c\xbf\x92\x89\x42\x53\xb0\x0f\xd9\x34\x3f\x9e\x69\x7b\x14\x12\xeb\xa4\x35\x97\xeb\x72\xa6\x69\xaa\xa2\xd7\x7e\xac\xb9\x68\xc2\x0f\xe1\x95\x05\xa3\x80\x74\x15\x86\x21\xb6\x06\xf7\x7d\x97\xbc\x6e\xbe\x50\xe7\x58\x92\x93\xdb\x27\xfc\x7d\xfe\x63\x1a\x4b\xee\x83\xb2\x26\x82\xa7\x73\x28\xc3\x6d\x9d\x7d\x1d\x89\x1d\x65\x21\x7c\xc4\x78\x64\xf6\x80\xdc\x8b\x5f\xd1\xa0\x1a\x0f\x7c\x34\x43\x0f\x77\x06\x0b\x69\x1a\x1a\xd2\x13\xd2\x28\x68\xe6\x1b\xbd\x38\xf4\x3f\x0c\x8b\x4d\xa6\x8a\x58\x31\x86\x66\xc0\x99\x76\x61\x70\xc2\xdb\x76\x6a\xaf\x41\x7f\x55\x6c\xc9\xa0\xa3\x93\x4e\x9f\xce\xf1"}, -{{0x4d,0xd3,0xb4,0x78,0xeb,0xdc,0x59,0x47,0x2b,0xab,0x14,0xa8,0xcd,0xd0,0xc2,0xfd,0xac,0x57,0x23,0xee,0x04,0xdd,0x89,0x17,0xc7,0xcf,0xe7,0xa5,0x36,0x48,0x5c,0x77,},{0x5b,0xcc,0xb3,0x7e,0x68,0xc2,0x34,0xbe,0xad,0x49,0x33,0x7d,0xe2,0x08,0xaf,0xba,0xf6,0x11,0x81,0x1d,0x96,0x58,0x59,0xa0,0x6d,0x31,0x30,0x12,0x47,0xd6,0x6a,0xcf,},{0x57,0x88,0xe7,0x9e,0x84,0x3b,0xde,0x9e,0xf1,0x1a,0x9d,0xfa,0xc9,0x70,0x19,0x6a,0x56,0x7c,0x63,0x08,0xc3,0x48,0xe5,0x17,0x4b,0x38,0x77,0x95,0x04,0x6d,0x59,0x0a,0x47,0x49,0x1f,0xd7,0x1d,0x97,0xae,0xaa,0x78,0xc1,0x61,0x59,0x71,0xb8,0x34,0x90,0xe8,0x59,0x28,0x20,0xf9,0x59,0x2a,0xc7,0x62,0x69,0xb9,0xd2,0xba,0x70,0x29,0x01,},"\x1c\xdb\xd2\x85\x56\xec\x44\xe8\x70\x5a\xfd\xa9\x2b\xd5\xa5\x3f\x95\xd8\xfe\x8b\x0f\xfe\x46\x33\x73\x63\x33\x16\xc5\x22\x74\xc1\x1e\xdc\xd6\x15\x51\xe3\x19\x9e\x49\x4d\xff\x6d\x90\x6a\x73\x9e\x7b\x32\x43\x03\xfc\x47\x82\x7e\x56\xde\xf0\xbd\xcc\x46\xb8\x16\x01\x7c\x71\x23\x05\x37\x02\x63\xba\xbd\x2c\x71\xbe\x47\x8f\x41\xce\x30\xb1\xdf\x63\xbe\xdd\x3b\x2e\x6a\x51\x9c\x53\xdf\x51\x58\x52\xc4\x13\x7b\xc1\xac\xa4\x9b\xf4\xc4\x63\x1f\xd6\x56\x46\x57\xd1\x1c\xd8\x3e\xa7\x3c\xc3\xd0\xcf\x9e\x3b\x3c\x3e\x7c\xa9\x9b\x4f\x12\xa9\xc9\xb6\x7c\x87\x98\x14\x8e\x0a\x0d\xc1\xef\x8b\xf5\x86\x42\xa1\x4f\x97\xa5\x72\x13\x55\x14\xc1\x0b\x19\xaa\xbe\xc2\x5a\x9c\x6b\x35\xaa\x40\x34\xa5\x7a\xae\x1b\x6d\x05\xbd\xe2\xb6\x33\x0f\x25\x1d\x78\xdb\x09\x93\xf0\xca\x4c\x26\x38\x6e\x34\x89\xa2\x09\x28\x33\xb8\xac\xbb\xc4\xf4\x91\x7f\xd3\x09\x3d\xf5\x82\xff\xf7\x1e\xce\x21\x9d\x36\x72\x45\x55\x82\x60\x9c\x0d\xb8\xd9\x6a\x70\xfc\x8a\xed\x67\x98\xde\x54\xbf\xb2\xb3\xee\x6c\x5d\x32\x8d\xb1\x63\x59\x3f\x58\x01\x9f\x38\xf3\x39\xfd\x37\x53\xf8\x96\xa4\xa2\xcc\xa8\xc1\x40\x0a\x77\xea\x39\x19\x35\xf3\x4e\x26\x39\xc5\x60\x86\x08\x10\xbb\xbe\x4b\xe1\xd1\x6e\x01\x2c\x11\x49\x0a\xa8\x4f\x29\x64\xc8\x77\xc2\x93\xb3\x00\xf4\x3d\x37\x9f\x3e\xba\x9a\xf3\x91\xde\xe5\x10\x85\x6a\x4d\xdc\xf7\x6e\x0a\x0a\xe0\x6a\x6a\x7c\x0f\x9c\x5e\x3f\xa1\xb8\x35\x4f\xe8\x97\x7b\x4e\xa3\xb2\x06\x61\x49\x1f\xa4\x61\x3b\xa6\x2f\x55\x6d\x5d\x5d\xa8\x21\x3d\x01\x21\xde\x2c\x87\x25\xdf\x0a\xae\x04\x8a\xc8\x91\xab\xbc\x06\xbd\xce\xf3\xc3\xef\xfd\xf5\xa3\x17\x49\x47\x6f\x81\x4d\xb9\x45\x79\x45\xf0\xd9\x1e\x14\x08\x00\x56\xbe\x92\x1a\x16\xaa\x96\x4a\x92\x98\x22\x1b\x15\x75\x94\x97\x3e\x32\x96\x99\x93\x31\x0c\x87\x07\xe1\x9f\x31\x43\xab\xc4\xfd\xa7\xc8\xad\x01\x60\xac\xf0\x31\xab\xa6\x52\x80\x1a\xa8\x1a\x01\x6b\x31\x37\x03\x9e\x27\xd6\x73\x8d\x02\x80\x0a\x93\xa8\x6f\x9f\x55\x85\xc5\x18\xdf\xa9\xe7\xd8\xac\x72\x7f\x37\x43\x7e\x56\xd2\x78\x83\x86\xe1\x16\x53\xa0\x4e\x16\x51\x69\xf9\x03\x97\x2a\x01\x48\x47\x51\xe7\xcb\x38\x63\x25\x90\xec\x80\xd5\xfc\xe4\x54\x16\x01\xa0\xe0\x95\x78\x5a\x9e\xe8\xd3\x59\xed\xf2\x6b\x99\x46\xe7\x98\xda\x59\x98\xcb\xb7\x36\xf9\x4e\xb7\x13\x46\x3f\x79\xf5\x61\x75\x9b\xbc\xb4\xc4\xac\x69\x3c\xab\xf2\xe1\xe0\x36\xb2\xd0\xb0\x87\x9a"}, -{{0x07,0x4d,0x92,0x18,0xc1,0x21,0x7e,0x75,0x82,0x3c,0x90,0xe0,0x10,0x48,0x4c,0x2a,0xdb,0x88,0xec,0xcc,0xd2,0xbd,0xf0,0x12,0x0a,0xa3,0xed,0xff,0xcf,0xcb,0xd4,0xbf,},{0x37,0x35,0xad,0x19,0x19,0x03,0x3d,0x16,0x17,0xb8,0x5b,0xda,0x04,0xb1,0x61,0x21,0xda,0x1d,0x86,0x1b,0x40,0x41,0x54,0xfa,0x96,0x1d,0x49,0x46,0xe5,0x5e,0xcd,0x83,},{0xb1,0xf7,0x1c,0x3b,0xd1,0xb6,0xbe,0xc4,0x33,0x37,0xe2,0x6d,0xee,0x65,0x5a,0x8d,0x5f,0x4a,0x8d,0xad,0x84,0xa5,0x11,0x84,0xb7,0x75,0xb6,0x86,0xfa,0xd3,0x1d,0x80,0x29,0xe3,0x87,0x69,0x27,0xf9,0x57,0x6e,0x90,0xc3,0x62,0x48,0x75,0xfc,0x00,0x29,0xa5,0xc1,0x0a,0x8a,0x0a,0xf7,0x5d,0x7a,0x88,0x0c,0x68,0x44,0xa4,0xa8,0x3a,0x00,},"\x6b\x5a\xa4\x0e\x91\x67\xbf\xdb\x84\x7d\xaa\x7d\x27\x86\xe2\x8e\x75\x33\xe1\xd6\xac\x53\xbe\xb6\xf6\x9b\x59\x53\x79\x5a\x2b\xf5\x9b\xbf\x7d\x14\x19\x26\x96\x8f\x50\x96\x9b\xad\x74\x2a\x4f\xb5\x79\xd3\x25\x0f\xb1\xbe\x4c\x57\xeb\xf4\xf9\x11\x2c\x70\xcd\x9f\x72\xa0\x0d\xb1\xc8\x89\x6f\xe2\xb5\xbd\xa7\xc7\x03\x0f\x49\x7c\x0b\x00\x1e\xa2\x5b\xa0\xd4\x47\xf0\x8c\x36\xdb\x8b\x90\x7c\x2f\x2a\xbb\xbb\x62\x0d\x3e\x8a\x2c\x66\xe4\x17\x12\x85\xad\xca\xad\xd1\xc1\x4f\xe2\x39\xbc\x59\x5f\x09\x83\x96\xaa\x87\x80\xff\xb8\x0f\xe1\x44\x6a\x07\x00\x1e\xc2\x34\xd8\x2a\xbd\xcd\x81\x00\x79\x39\x15\xb0\xb3\xf8\x0d\x84\xe2\x0e\x51\xea\xbc\x79\x78\x06\xf3\xbe\x81\x08\xa4\xf4\x37\x55\x0b\x06\x69\x40\x50\xa8\x29\x31\xac\x40\xc0\xa4\x89\x77\xed\xf6\xce\xd2\x42\x8d\x7c\xfe\xa8\x20\x55\x06\xde\x86\x40\x80\x65\xd1\xa1\x98\x70\xfa\x33\xa7\x08\x10\x37\xb3\xee\x44\x91\xb6\xe7\xf3\xd1\x0b\x14\xa3\x0c\x20\x91\x59\xa1\xc8\x12\x31\xa3\x5f\x03\x65\xb4\x7d\x3e\x0d\xa0\x4a\x32\xc9\x5d\x98\x33\x3c\x44\xf5\x72\xcd\xaa\xa9\x05\xd0\x69\x19\x7f\x6e\x86\x1b\x5d\xfc\xdf\xb9\xdb\x6c\x7b\x0d\x0c\xb0\x0f\x37\xc9\x16\xa1\xc4\xc0\xb8\x98\x5b\x09\xf3\x34\x09\x5e\x12\x83\xed\xfd\xd4\xe6\x2a\x29\x41\x09\x9a\x2b\x69\x36\x96\x60\x4d\x99\x43\x11\xe3\xd5\xf6\x10\x66\x83\xe1\xd7\xa1\xc7\xe5\x3d\xf7\xb7\x90\x94\x7a\x9a\x80\x1a\x0c\xcd\x48\x43\x95\xf6\xcb\xfd\x9c\xa4\xd9\x80\x4f\x18\xd5\x2b\xb0\xf9\x46\xd1\xa8\x9f\x97\xa6\xfb\x06\x80\xa8\xc4\xc0\x57\xb6\x06\x2b\x2b\x9d\xe7\xc0\x37\x48\x79\xb8\xa6\xa6\xd2\xc1\x0a\xef\x78\x05\x08\xeb\x28\xbb\x56\x9a\x08\x35\x09\x44\xc8\x2f\x6e\xf2\x8d\xb2\x30\x4d\xb6\x97\xc3\xae\x1a\xf4\x3a\x50\x0b\x0b\x97\x48\x03\xe9\xf4\x6e\xa2\xa0\x2e\x85\xed\x27\xdd\xa6\x16\xd2\x4d\x6d\xb3\xcc\x4f\x5a\xed\x82\x40\xb1\xae\xa3\xdc\xf6\x9d\xee\x5f\x14\xf9\x5e\x6e\x72\x98\x7b\xbe\x61\x89\xbc\x20\x45\xf0\xd7\x83\xa7\xb4\x7b\xfc\x19\x83\x0b\xc7\xf4\xe7\x98\xab\xe9\x02\x45\xfb\xd4\x3f\x37\xc3\xf0\x36\xd1\xcb\xf1\xe7\x3d\xcb\x1d\x9d\xaa\x87\x37\x9b\x11\x06\x97\x34\x81\xa2\x15\xc1\xf4\xf4\x6c\x16\x03\xa5\xd5\xcd\x97\xb7\x07\x6f\x1f\x5d\xc7\x89\xaa\x6a\x71\xe7\x2e\xf5\x4e\xd3\x28\xa4\xab\x64\x34\x05\x39\xff\xd1\x64\xd0\xec\x64\x5f\x32\x2d\x1b\xc3\x71\x12\xdc\x08\xd8\xc8\x07\x9d\x19\xd3\x7a\xbb\x23\x53\xf4\x8b\x5c\x49\x2f\x80\x6e\xd2"}, -{{0xd2,0xea,0x2d,0xff,0x7a,0xf0,0xba,0x2a,0x6b,0xed,0x7f,0x6c,0xc6,0x8c,0x0d,0xf6,0x64,0xa6,0xb1,0x0c,0xe8,0x01,0xc4,0x2e,0xd5,0xbb,0xe6,0x17,0xbc,0xc8,0xb8,0x4a,},{0xab,0x44,0x70,0x63,0x44,0x02,0x6e,0xd3,0x5e,0x21,0x98,0x29,0x64,0xf7,0xb4,0xdb,0xbb,0xe2,0x07,0xfd,0x27,0xc4,0x67,0x99,0x70,0x1c,0x19,0xa4,0xd8,0x8d,0x1d,0x72,},{0x9a,0xbd,0xb9,0xdd,0x2a,0xb7,0x7b,0x6f,0x5e,0x1b,0x91,0xba,0x0b,0x61,0x3f,0x5f,0x36,0x0e,0xfb,0x50,0x0d,0x3f,0xe9,0x92,0x90,0xef,0x7c,0xa1,0x4b,0xd2,0xb3,0x30,0xf4,0x05,0xa4,0xf7,0xdc,0xda,0xef,0x49,0x23,0xd3,0x11,0x1d,0x40,0xbf,0x03,0x20,0x35,0x33,0x86,0xf6,0x34,0xb4,0x0d,0xe6,0xf0,0x4d,0xe9,0x19,0x0a,0xd5,0x1c,0x08,},"\x03\xab\x5d\xae\xbc\x6e\x70\xd3\x52\x97\x79\x32\xa0\x31\x07\x87\x9b\xd5\x5d\xaf\xd0\xc6\xba\x7a\xd9\x69\x7a\x17\xb1\x27\xb3\xa7\x4a\x3e\xae\xba\xbd\x0f\x8e\xee\xbf\xc0\x48\x3d\x63\xfe\xdd\xe5\x2d\xeb\x46\xa3\x75\x24\x49\xc9\xc4\x49\x5c\x51\xa1\xc9\x1f\x57\xe3\xad\x2e\x6d\x01\xa1\x3d\x0c\x47\x0c\x52\x91\xb8\xe9\x12\x28\x83\x40\x97\x0f\xbb\x85\x78\x7b\x8b\x37\x6d\x72\x17\x52\x50\xe8\xcd\x90\xc0\x78\x88\xbf\xef\x5e\xbf\x50\x86\xc8\xff\x2a\xbc\xdd\x12\xd2\x14\xb9\xc4\x5d\x12\x08\x73\xb4\x60\x2e\x57\xa6\xaa\xb0\xb8\x28\xd1\x08\x4d\xff\xaa\x36\x51\xee\x35\x66\x26\x95\xb7\xf3\x43\x3f\x4a\xb5\x30\xc2\x9a\xc6\xcc\x5b\xb4\x3e\xcc\xd1\xb6\x89\x8b\x9e\xf7\xae\xc6\xd5\xae\xc6\x8d\x5c\x11\x14\xbb\x5d\xf7\x82\x09\x66\x59\x4c\x99\x4d\x64\x08\x91\xb8\xf2\xdc\x5d\x25\x63\x8d\xe4\x35\x49\xd8\x6d\x34\x30\x6f\xf3\xf5\x74\x57\x51\x16\x40\x5b\x9e\x8e\x28\x6e\xe0\xcd\x97\x8a\x76\x00\x2c\x44\x35\xfe\xaa\xc6\xe8\x4e\xae\x16\x54\xf3\x39\xa5\x67\xd8\xd0\x4f\xcf\xa3\xeb\x6a\x04\xb9\xad\xc6\x66\x02\x13\x00\xe9\xee\x59\x72\xb3\xdf\x5d\x4d\x0d\xd4\xbf\x79\x21\xdc\x98\xde\x82\xce\xf2\xd1\xb1\xd6\x1b\x79\x7f\xc9\x96\x8e\x11\x84\x84\xc4\x13\x42\x41\x6d\xdc\x6a\xdc\x4e\xe5\xd6\x87\xd9\x4a\x40\xce\x57\x2f\x42\xa2\x04\x86\x68\xc1\x75\xcf\x7b\x1f\x24\xc4\xef\xd0\x20\x55\x4f\xc6\xf6\x42\xe1\x4a\x57\xba\xec\x23\xe9\x5c\x25\x14\x30\x6d\x0a\x6d\x33\x64\x88\x41\x49\x7e\xac\x48\xea\xbd\x96\xd0\x47\x31\xba\xb0\x8b\xf5\xea\x9d\x43\xe0\xcf\x9a\x37\xfa\xaf\xa7\x32\x86\x9d\x68\xe7\xd5\xfe\x69\x54\xf8\xa3\x19\xef\x55\xda\x1e\x17\x8e\x43\xe8\x4a\x3b\x9a\xa3\xad\x00\xc2\x9b\x1d\x16\x11\x63\xdf\x4b\x79\xf2\x88\xe9\x39\x1d\x70\xa2\xf8\x81\x3d\x66\x62\x2e\x8a\xc3\x33\xfa\x6a\xa5\x31\x1e\xab\xec\x38\x3b\xa4\xcc\x12\x28\x15\xde\x00\x88\x77\xef\xbe\x6e\x12\xc3\x22\xc9\x75\x43\x4a\xfa\xd1\x73\xeb\xe2\x42\x03\xd9\x16\xd5\x75\x78\xbd\x2b\xca\xcc\x78\xf6\xe2\x56\x45\x13\xf8\xd1\x13\xa8\x33\xc2\xc2\x26\xeb\x97\xba\x2e\x23\x36\x1a\x5d\x02\x66\x4a\xb3\x77\xf9\x64\xc4\x30\x0b\xe2\xd7\x7b\x62\xd9\x24\x08\x23\xa0\x98\x84\xdf\x30\x7e\xff\x3b\xe5\x66\x4d\x72\xd1\x1a\xd5\x13\xe1\xbc\x56\x10\xdb\xfd\x10\x09\xdb\x39\xf0\xcb\xfe\x47\x05\x55\xec\x1b\x56\xb8\x71\x67\x07\x93\xd3\xb7\x04\xfb\x06\xee\x95\x0b\x1a\xd2\xa4\xd7\x29\x7c\xa5\x8b\xba\xd8\x10\xc3\xfa\xd4"}, -{{0x7a,0x60,0xcd,0xf1,0x87,0x04,0x60,0xde,0x8a,0xe7,0x78,0x11,0x76,0xd5,0x12,0x7e,0x71,0x20,0x7f,0xaf,0x2f,0x21,0x0b,0xd4,0xdc,0x54,0x73,0x85,0xb6,0x67,0xf2,0xf2,},{0xea,0xd6,0x7a,0x9c,0xf3,0x4d,0x0f,0xf1,0x4e,0x79,0xaf,0xa4,0x6f,0x2d,0xc9,0x96,0xe9,0xac,0x0e,0x3e,0x07,0x63,0x22,0xfb,0xb4,0x00,0x97,0x67,0xb1,0x33,0xf0,0x1b,},{0xb2,0xe0,0x81,0x42,0xbd,0xd6,0x2b,0x78,0x65,0x92,0xc0,0x91,0xf5,0xfe,0x6a,0x9b,0x7f,0x30,0xce,0x13,0x4c,0x3b,0x23,0x6f,0xbc,0x6d,0xfe,0x67,0x34,0xf8,0x82,0x70,0xac,0x58,0xf6,0xd7,0x4b,0x4f,0xd9,0x9c,0x22,0x45,0x1c,0xa4,0x65,0xa4,0x2c,0x00,0x6d,0xb2,0x5a,0xf2,0x15,0xed,0x24,0x1a,0xf1,0x18,0x96,0x27,0xc6,0x05,0x0f,0x00,},"\x9d\xc0\x23\xa5\x25\xd0\x1b\xa3\x51\x37\x98\xb7\x38\xc7\x91\x62\x92\x6e\xbc\xcc\x0a\xdf\x1e\x57\xac\x47\xc2\x0d\xea\x6c\xe1\x37\x5c\x3d\x2a\xaa\x17\x33\xb7\xf0\xc3\xbd\x94\x5c\x33\x5f\xf3\x57\x61\x12\xbb\xdc\x10\xb6\x78\x3b\xa6\x54\xe8\xc6\x10\x47\xf2\x77\x3a\xa2\x29\xbf\x84\x69\x22\xa8\x9c\x6a\x73\xd5\xf1\x05\x1e\x8d\x96\xed\x36\xd7\xd6\x74\x7e\x06\x3a\x7a\xc6\x02\xf1\x9f\xc5\x2e\x02\x1a\x4b\xbc\x28\xb0\x35\x14\xfb\xd5\x1c\x7b\x3f\xd6\x59\xf1\x2d\x54\x7d\x05\x92\xdd\x09\xf8\x73\xc9\xec\xc6\x43\x9c\x7e\x93\x1a\xd0\xe4\x85\x6b\xe3\x1c\x60\x5d\xef\x2e\xd9\xb5\xd1\x3c\x59\x42\xb2\xf3\x25\x39\x7d\xac\x6c\x97\x60\xe9\xb1\xbb\x0c\x06\xf7\x13\xcb\x92\x0c\x23\x4b\xcc\xfe\xe9\xf0\xb8\x5d\xd0\x20\xf7\x98\x8f\x3b\xe1\xcc\x66\xe9\xe5\x1b\xab\xe2\xfe\xe2\x37\xeb\x84\xec\x7e\xff\x94\x09\xaa\x91\xc1\x94\xe3\x0d\xb1\xe0\x65\x01\x59\x55\xde\x97\x46\xbb\xa0\x3f\x7e\xdf\x9a\x58\x75\x12\x40\x9a\x41\x61\xfa\x77\xea\x62\xcc\xf4\x31\x60\x2d\xcd\xcf\x36\x5e\xd6\xbf\x0a\xed\xdd\x32\xf7\xc8\x44\xe3\xa3\x4d\x26\x6e\x28\x38\x2f\x40\x62\xfd\x4d\x6f\x82\x14\x25\x21\x04\xd6\x43\xa9\xbf\xd8\x07\x17\x16\x37\x1c\xcb\xb5\x4c\x8c\xc8\xdb\x79\xad\xd6\x5b\xcb\xce\xa0\xd0\x80\xd8\x40\x28\x03\xfe\x23\x2d\xf7\x0f\x76\x57\x72\x47\xa6\x3d\x55\x83\xbb\xd5\x64\x27\x67\xbc\x63\xf3\xc5\xa7\xbb\x3a\x47\xeb\x12\x98\x4e\x45\x41\xf4\x1f\xdb\x55\x86\x9a\x08\xfa\xde\x66\xc2\x0f\x69\xa5\xa9\xde\x25\xf6\xb3\x6b\xa1\x8a\xce\x5b\x4a\xc3\x36\xbb\x2a\x8e\xbf\x63\x0a\xd0\x3e\x8b\xb8\x73\x1d\x01\xe8\x4b\x91\xd0\x24\xd1\x17\x45\x9a\x74\x89\x2e\x93\xd5\x3b\x61\xe6\xb8\x06\x8e\x4f\x04\xb4\x18\x1f\x03\x87\xb4\x56\x7c\xcd\x45\xe1\xb8\x71\x8a\x2d\x7d\x78\x78\x72\xf3\xdc\xf8\x7a\x15\x93\x5a\xd7\xda\xaa\x74\x4e\xd6\x8a\x28\x66\x6a\x51\xa1\x0d\x39\xfc\x13\x9c\xdf\xe9\xa6\x87\x30\x76\xf7\xc4\x25\x00\x9c\x38\xfa\xee\x13\x5e\x51\x32\x07\xb0\x6e\x7b\xa3\x56\x85\xf5\x07\x2d\xa3\x4b\x60\x45\xb5\x7c\xd5\xd1\xb1\xa1\xfd\xf0\x17\xb8\xaa\x8e\xbd\x27\x52\x2b\xc9\x5e\x47\x90\x87\x34\xe4\x17\x22\xa7\x67\x90\x5c\x5e\xcc\x30\xc7\x24\x81\xb6\xc1\x2b\xf4\xac\xe9\x4d\x5b\xb3\xa3\x15\x56\x91\xb7\x07\x5b\x40\xeb\xf5\x96\x8f\xdd\x90\x3d\x8f\xd3\xcc\x50\xb8\xd6\x46\x48\x59\xb1\x0f\x75\x51\x32\xc6\xd9\xb6\xda\xd1\xd6\xf1\x4c\x41\x85\xb2\x64\xd3\x49\x7a\x4e\x54\x98\x77\xfe\x94\x6e"}, -{{0x33,0x79,0xd2,0x5c,0x11,0x17,0xcf,0x80,0x2e,0xc7,0x9c,0x06,0x57,0x5d,0x18,0xe6,0xbe,0xce,0x4c,0x70,0x93,0xdd,0x43,0xfd,0xee,0x03,0x68,0x5c,0x70,0xb2,0xfa,0x9f,},{0x85,0x25,0x15,0x6f,0xe2,0x9f,0xc2,0xfb,0xf6,0x61,0xba,0x50,0x18,0x2b,0xe2,0x0c,0x89,0x98,0xd9,0x41,0x49,0x3d,0x59,0x33,0xdc,0xa4,0xd8,0xb4,0x1f,0xb4,0x42,0xd5,},{0x4c,0x36,0xbf,0xc8,0x1e,0xef,0x00,0xb9,0xcb,0x3a,0xb5,0x14,0xc6,0xd4,0x51,0xb9,0x93,0x36,0x1e,0x09,0xa4,0xbe,0x4b,0x50,0x40,0x92,0x6f,0xeb,0x0e,0x0d,0x9b,0x52,0xf0,0x3d,0xe4,0x68,0xe7,0xba,0xd8,0x3f,0x37,0x91,0x54,0xbf,0x2c,0x43,0x7a,0x71,0xf7,0x54,0xf3,0xf4,0x07,0x98,0xee,0xeb,0xd6,0x2e,0x55,0xf2,0xbe,0x77,0x14,0x03,},"\x7a\xcd\xb3\x9f\x12\x26\xbd\x3a\xbf\xfa\x50\x35\x0a\x14\x97\xd7\x61\xf8\xf0\xaa\xef\xbf\xbb\xbb\x92\x5f\xf5\x63\xe3\x89\x76\xaa\x17\x2d\x40\x7b\x61\xff\xdf\xb1\xcd\x53\x8a\x4c\xd0\x00\xb5\x78\x18\xa0\xbc\x92\xc0\xe0\xcd\x0a\x5a\xbf\xcf\x57\x83\x00\xf5\xf4\xe6\xce\xfa\x26\x72\x75\xd1\x78\x45\xda\x70\x66\xfd\x4e\x18\x01\x00\x27\x96\x0c\xd3\x95\xe6\x82\xad\x71\xaf\x34\x9b\xbd\xad\x5e\xba\xa0\xf1\x1a\x77\x61\xe1\x9e\xa1\xbe\xf6\x61\x07\x43\x16\x4b\x17\x14\x14\x53\xb4\x72\xae\x2c\x8f\x36\xce\x6b\x08\x0f\x1c\x07\x45\x35\x24\x54\xce\x5a\xea\xe1\x1c\x9d\x75\xde\x3c\x08\x00\x42\x65\xfc\x4c\xa8\x0d\x33\xb2\x6e\xae\x14\x00\xdf\xd8\x97\x7b\xf7\x23\xa6\x16\xda\xeb\x6d\x42\x19\x90\x10\xb7\x3e\x19\x3a\xb7\x2a\x58\xbd\xd2\x48\xa7\xf4\x11\x1c\xa5\x0c\x1d\xe6\x46\xbf\xea\x7b\x4d\x5b\xaf\x0f\x93\xdd\x97\x3e\xe9\x36\x49\xe2\x1e\xc0\xc6\xc4\xfc\xca\x8c\xd6\xff\x69\xdf\x76\x16\x12\x02\x1d\x85\xff\x1f\xb2\xa9\x53\x37\xda\x48\x05\xa7\x6d\x34\x7e\xe7\x1e\xf1\x9c\x0d\xff\xb5\x9f\x15\xf6\x50\x29\x3a\xbb\x97\x21\x05\x3f\x74\x06\x90\x5a\xe6\x83\xf9\x6c\x83\xa3\xa7\x44\x7b\x1a\xfb\x14\xe1\x20\x8c\x63\x9f\x37\xa9\x75\x0b\xa2\x1d\xa5\x55\x2c\xc2\x04\xea\xc4\x53\xca\x03\x62\x82\xf7\xe0\x96\x10\x93\xc3\x9e\xc1\x18\x13\x8d\xcf\x71\xcf\x2d\x28\xfb\x96\xa2\x49\x62\xb5\x2d\x33\x93\xf8\x80\x65\x3b\xcb\xa2\xc9\xb9\xd5\x7b\x77\xc5\x22\xf4\x21\xfc\xf5\xad\x75\xfb\xa9\xcf\x33\x89\xb1\x23\xaa\x97\x52\x17\x13\xff\xf8\x84\x67\xde\xb8\xc8\x99\x1d\x4b\x57\xc1\x43\x81\x70\x53\x7c\xb5\x0c\xdc\xc6\x57\xe5\x0e\x5c\x48\x0e\x12\xc0\xd4\x49\x39\xb6\x39\x99\x44\xe7\xc7\x1e\x18\x6c\x2a\xbb\x81\xfc\x57\x34\x88\x36\xd5\xe5\x7b\x72\xb2\x24\xa6\xb7\x1b\x6c\xaf\x72\x1a\xca\x73\x47\x8c\xb6\xcf\x5f\xb8\x90\x71\xae\x3a\x39\x82\x02\xdb\xb3\x8c\x30\x81\x25\x63\xbb\x9a\x23\x40\x66\x57\xa9\x56\xd3\x05\xa3\x44\x9a\x60\xcc\x86\x41\xb6\x21\x75\xa7\x17\x0c\x23\xbd\x5a\x25\xf0\xf1\x2e\x15\xa7\xed\x91\xfa\xda\x6a\x4a\x2f\x0e\x7b\x15\x5a\x3d\x64\x85\xec\x03\xce\x6e\x34\xdf\x7e\x21\x62\x40\xbb\x28\xa2\xdd\x73\x2f\xf7\x90\xd2\x28\x6e\x20\x0b\x33\xc2\x9a\x31\xa5\xe1\x9a\xd2\xcd\x02\x97\x4b\xad\xc4\xbc\x22\xde\xb7\x50\x4c\x15\x24\x1f\xc1\x06\x0c\x8a\xce\xf4\xfb\xb2\x5e\xc7\x60\x2f\xce\x36\xa2\x7b\xb8\x7b\x6e\x64\x23\xe6\xb4\xf6\xe3\x6f\xc7\x6d\x12\x5d\xe6\xbe\x7a\xef\x5a"}, -{{0xef,0x38,0xc3,0xfc,0x74,0xf0,0x54,0xae,0x43,0xe8,0xd2,0x9d,0x6b,0xa6,0xdc,0x80,0xb5,0xaf,0x84,0x82,0x70,0xd4,0xaf,0x58,0x84,0x4d,0x24,0xbc,0xf9,0x87,0x41,0x4e,},{0x0a,0xe1,0x47,0x8b,0x05,0xfb,0x32,0x99,0x65,0xea,0x0f,0xa9,0x28,0xdc,0xbe,0x81,0xa0,0xbd,0xbb,0x6f,0xf6,0x6c,0x81,0x16,0x71,0x63,0x5e,0x43,0x88,0x88,0x80,0x51,},{0x1d,0x3a,0xc6,0xb6,0xbf,0x18,0xab,0x53,0x09,0x14,0x87,0x99,0x48,0x5b,0x27,0x6d,0x20,0x40,0x1c,0x6a,0xf5,0xf9,0xb2,0xf6,0x03,0x23,0x95,0xa3,0xc2,0xf4,0xb6,0x73,0xb7,0x14,0x0c,0x07,0xcc,0x26,0xf4,0xfc,0x56,0xa5,0xee,0x00,0xb0,0x74,0x6b,0x2a,0x80,0xda,0x6f,0xda,0xd1,0x7e,0xdd,0x11,0x49,0x20,0x10,0x1d,0x2c,0x89,0xc3,0x0e,},"\xbf\x29\x0d\xb3\xdd\xa8\x76\x39\x37\xae\x4c\x83\x74\x67\x05\x32\x72\x95\xc2\xc2\x48\x06\x8f\x5a\xb8\x5c\x8b\x5d\x75\x6f\x4e\x3e\x34\x06\x2b\x55\x49\x38\x72\x61\x47\x6b\xcb\xd1\xe7\x33\x19\x90\xf1\x19\x10\xd1\x1f\x94\x60\x7c\x2b\x71\xf6\x5b\x77\x1a\xac\xab\xdc\x10\xf4\x2a\xe9\x18\xdd\x25\x94\xac\x71\x05\x1c\x85\xb3\x30\x77\x9c\x47\xaf\x00\xa5\xb9\x81\x91\xb5\x6c\xbc\xf7\xef\xe4\x1a\x27\xe8\x7c\x67\x71\x68\xc8\xab\xe9\x49\x6e\xb2\xe7\xab\xbd\x0b\x16\x04\x28\x6e\xd1\xa1\xb1\x8d\x26\x4d\x73\x3d\xe8\x7d\x0d\x3f\x80\x55\x52\x8c\x4d\x42\x6d\x7f\x8e\x6e\xd0\x24\xa7\x41\x40\xab\xd3\x54\x00\x79\x62\xa2\xa9\x7a\x5c\x2f\xf9\x76\x54\x6a\x8d\x1a\xc4\x92\x4c\x09\x22\x3d\x34\x8d\xdc\xd8\x71\x0a\x37\x99\xf9\x1b\xb8\x70\xb3\xf4\x6d\x51\xf1\xe7\xf6\x89\x2d\x6b\x08\xb9\x91\x74\x8a\x03\x7a\x86\x7e\xcc\x39\xee\x8d\x64\x62\xa7\x61\x44\x88\xed\xd3\xc2\xba\x61\x5c\xa2\xe3\x78\x54\x88\x94\x41\xb1\x3d\xc8\x35\xc3\x6b\x38\x65\x3f\x65\x98\x61\x6f\x35\x78\x3e\x2e\x15\x83\x84\xbb\x93\x1c\x90\x1b\x70\x3a\xcb\x39\x91\xfb\x7a\xa5\xba\x69\xd9\xa5\xbd\x05\x70\x24\x29\x61\xa7\x1a\x52\x47\x03\x15\xe9\x82\xe3\x41\xa6\x1c\x64\xa6\x19\xbd\x16\xfe\x81\x19\xaa\xe0\xd7\x50\x3c\xe7\xd7\xe9\x26\x14\x6b\x91\xc2\x89\x2f\x13\x16\x69\xd1\xe3\x9e\x5b\x75\xe9\xc7\x24\x52\x61\x80\x99\xa5\x7d\xc2\xee\x37\x7b\xe6\x58\x75\xee\x01\xbb\x88\xed\x52\x6f\xc3\x94\xe2\xf5\xc8\x12\x7a\x5f\x69\x12\x5e\x67\x38\x5e\xf9\x4b\x1f\x33\xad\x52\x62\x9d\x72\x0e\x31\xc0\x2a\xe0\xb5\x82\x33\x9f\xf0\xf0\xbb\x07\xff\x2b\x03\x0f\x48\xfa\x7b\x69\x27\x16\x50\x1a\xd7\x77\x3a\xd3\x15\x12\x04\xa2\xa5\x40\xfa\x94\x36\xbd\xd4\x20\x2a\x15\x73\x09\xec\x36\xce\xcb\xe5\x8b\x33\xef\xf5\x57\xfd\x33\xe0\x3f\xd3\xeb\x19\x00\x9b\xd7\xa2\xde\xa9\xef\xee\xf8\x78\x55\x67\xaa\xb2\xa4\xc9\x8b\xd1\xf2\xa8\x10\x11\xb3\x43\xa9\xf2\x0c\x44\xc5\x77\xa4\x52\xfd\x54\xba\x21\x02\x9d\x47\x06\x81\x3b\x29\x87\xc7\x6b\xb2\x42\xab\x26\x20\x84\x3c\x22\x60\xb6\x69\xad\x35\x8e\xfe\xe7\xf9\x83\x0d\xc9\xc7\xd4\x78\xa2\xde\x4a\x2c\xf8\xc4\x3d\xa7\x70\xe2\x88\xe2\xed\xbb\x6d\x73\xbc\xf2\xec\xb0\x23\xde\x6b\x2d\xcc\x6b\x16\x6e\x87\xa3\x85\xeb\x0a\xdc\x30\x56\x65\xc5\xbf\xa5\x7f\x25\x0f\xe2\x23\xad\x7f\xf4\x51\x8d\xe3\x9c\x79\xe8\x7d\xc1\x01\xa9\xfa\xa6\x82\x1a\x74\x44\x2b\xfc\xfd\xf0\xa9\xe6\x3a\x50\x9e\x2a\x2e\x76"}, -{{0x7e,0x7b,0x39,0xaf,0x69,0x38,0x0c,0xf4,0x46,0x60,0xe2,0xc1,0xff,0x30,0x83,0x34,0xe8,0x25,0x0f,0xee,0xb8,0x8b,0xe0,0xd4,0x3a,0xab,0xe5,0xe6,0x8b,0x8e,0xf1,0x71,},{0xcc,0xef,0x9d,0xae,0xd9,0x25,0x23,0x53,0x3d,0x4a,0x2d,0xab,0x6d,0x24,0x19,0xf6,0xd0,0x86,0x04,0xdb,0x64,0xce,0x37,0xe3,0x29,0x04,0xac,0x77,0xb9,0xb4,0xa0,0x1c,},{0x10,0x62,0xa2,0xdc,0x9c,0xd5,0x37,0x96,0x75,0xc0,0x4f,0x5e,0x21,0x33,0x8d,0xcf,0xb7,0x7d,0xfb,0xab,0xce,0xdd,0x62,0xb2,0x60,0x71,0x00,0xd7,0x64,0x9a,0x05,0xe8,0x08,0x71,0xe9,0x61,0x23,0x21,0x4f,0x80,0xf4,0xf7,0x3b,0x0d,0x9b,0x06,0xe2,0xd3,0x1f,0x56,0x11,0x9c,0xea,0x69,0xda,0x23,0x47,0xda,0x84,0xa2,0x75,0xb7,0xb2,0x07,},"\xd4\xa3\x97\x6d\xbf\x83\x20\x18\x56\x67\xb5\xa8\x23\x66\x40\xf2\xeb\xc9\xe4\x5e\x6d\x5f\x2a\x8d\x92\x99\x79\x27\xdd\x9b\xc5\xdb\x95\xf4\x46\x34\xbd\x65\x4e\xef\xec\xe1\x0d\x99\xd9\x2b\x46\x71\x57\x91\x64\x50\x04\xac\xcc\x6d\x14\x0f\x32\xa1\xc8\x72\xe5\x4a\xa9\xa7\x49\x3a\xf9\x45\x88\xb7\xbb\x40\x0d\x94\xd4\x58\xd4\x32\x92\x30\x7c\x5a\x1a\x38\x82\xa1\xc8\xa6\xa7\x8d\x9a\x94\x5f\x79\xd6\x4b\x32\x94\xa2\x8c\x3d\x59\xd8\x20\x22\xb0\x09\xcc\x4d\x2d\xa9\x3a\x16\xb0\x71\xc9\xab\x8e\xe9\xa3\x66\x3d\x72\xed\x34\x4f\x15\x1d\x68\xc6\x66\xa4\xb4\x96\x52\xd9\x7a\x46\xd1\x42\xa4\x74\x11\x27\xf3\xc5\x7f\x15\x51\xc4\x09\x76\xcd\x13\x81\xa8\x2a\xea\xe7\xbc\x5a\xdb\x39\x87\x20\xeb\x43\x3f\x08\x99\x48\x7e\xd2\x37\x84\x46\xb1\xa8\xdc\x6a\x33\xfc\xd4\x53\x7a\x05\xfb\x60\x3e\xc0\xa9\x0a\x27\x53\x23\x00\x24\x2b\x20\x00\x10\x86\x21\xb6\x5a\xb0\x00\xbc\x06\x38\x15\x30\xf6\x90\xd7\xe5\x6f\x81\x60\x4d\xac\xff\x19\x10\x71\x50\x40\x41\x0a\xa1\xf9\x44\xc9\x2d\xd9\xbb\xaa\x5b\xd0\x8e\xa0\x0c\x84\x42\xdf\x94\xf0\x85\xeb\x3d\xe9\x73\x35\xb6\x00\x5e\x6f\x84\xf8\x23\xd4\x34\x70\xab\x1c\x67\xda\x12\xad\x44\x99\x36\xc6\xb5\x5f\x9f\xfd\x20\x3d\xfd\x6e\x3f\x33\x30\x9e\x8a\x99\x45\xa5\x93\x20\xe6\x67\x34\xc7\x9c\x48\x14\xdb\xa5\xa1\xc1\x40\x95\xc6\x29\x25\xa1\xe1\x73\x3e\xfd\x94\x81\x7a\x25\xef\x9e\x47\x9d\xd9\xcc\xde\x6c\xa8\xad\xb7\xa8\x05\x3c\x1b\x55\x13\x46\x97\x50\x4a\xf8\x05\x3d\x59\x5b\x84\x46\x40\xb6\x1e\x93\x16\x80\x75\x46\x84\x50\xeb\x5d\xe0\x35\x86\x97\xc1\x04\xaf\xa6\xa3\x79\x6a\x50\x9c\x26\xb4\xc2\x77\xc2\x3f\xff\x42\xdf\x14\x6d\xe5\x5e\x95\xd0\xd4\xb8\x0a\x7a\xa1\x77\xd9\x92\x27\xec\xb2\xa0\x59\x4d\xee\xde\xbb\x9c\xaf\xb1\xa4\x58\xac\xa8\x07\x2c\xc7\xd7\x7c\x71\x75\xf6\x10\xca\x30\x0e\xfd\x7a\xf9\x38\x83\x46\x49\x8c\x22\x99\x15\x64\x50\x0e\x0b\x0a\xa4\xd2\x94\x6f\x18\xe6\xf5\x37\x5a\x84\x82\x86\xf3\x69\x54\xc1\xca\x22\x68\x4c\x69\x28\xc2\xa2\x5c\x7f\xe2\x1a\xba\x4a\x71\x11\xd7\xe0\x5b\xc8\xd7\x0b\x3d\xcb\x4f\x6a\xae\xc0\x64\x84\x5e\xef\x55\x25\xf8\x50\x24\xc2\x57\x0f\x3b\x78\x69\x8c\x4b\xce\xc0\xd7\x1a\xad\x53\x78\xd8\x81\x9e\x1f\xac\x44\xee\x41\x63\x70\x21\x2d\xba\xaa\xe5\x4d\x2a\xf2\x93\x9b\x82\xcb\xaa\xe7\xf4\x2f\xf4\x85\xd4\x5b\x3a\xcc\x21\x09\x0f\x5b\xa4\x1e\xc0\xda\x30\x9e\x52\xef\x28\x38\xd1\xde\x47\x1e\x0b\x7c\xf9\x85"}, -{{0xa9,0x04,0x8a,0xf0,0xc2,0x0a,0x12,0x5f,0x5d,0x39,0xc5,0x0f,0x22,0xb8,0x05,0xae,0x74,0x2c,0xf6,0x4f,0x1f,0xe8,0xdf,0xbe,0x8d,0xfd,0xaa,0x51,0x1a,0xaa,0x57,0x6f,},{0x15,0x86,0x55,0xdb,0x94,0xb1,0x5c,0xa7,0x29,0x83,0x87,0x7b,0x6d,0xb2,0x31,0xa5,0x84,0x3d,0xf5,0xdb,0xca,0x28,0x10,0xa7,0xe4,0x96,0xfb,0x59,0xab,0x71,0x04,0xca,},{0x18,0xa3,0x12,0xb2,0x0d,0x86,0xac,0x33,0x9a,0x58,0xef,0x2b,0x85,0x2d,0x46,0x7c,0x23,0xbb,0x2c,0xb1,0x22,0x7c,0xb1,0x53,0x38,0xaf,0x07,0xfd,0x04,0xb9,0xa7,0x11,0xe8,0x56,0xee,0x5b,0x2c,0x82,0xe3,0x66,0xc1,0x7f,0x86,0x17,0x13,0xd1,0x08,0x8c,0x1b,0x21,0x44,0xd1,0xc3,0x7d,0x05,0xbd,0xc0,0x0d,0x73,0x96,0x73,0x85,0x20,0x00,},"\x8e\xef\x2d\x9f\x5d\x59\x70\x99\x59\xc9\x24\xf8\x7c\x22\x78\x97\x67\x39\x3a\x15\x5d\x5c\x87\xde\x48\x8c\xef\x50\xb7\xbf\x7d\xa8\x70\xe3\xad\xc3\x00\xae\xe6\x60\x3b\x2e\xf0\x87\x64\xd9\x9d\x9e\x77\x51\xe5\xdc\xe9\x2a\xaa\x71\xaa\x18\xa6\x9c\xc8\x23\x13\x4e\x85\x52\xd9\x59\xa0\xdb\xb4\x11\x17\xe0\xa5\x93\xc3\x18\x33\xb6\xec\x21\x72\xdd\xaf\xaf\x78\x48\xdd\xd1\x8d\x28\xd0\xd4\xed\x33\x23\x7e\xc8\x04\xf6\x59\x38\xae\xd8\xe8\xa3\x28\x0d\x42\xe3\x53\xd0\x1b\xe0\x18\x7b\x13\x01\xf8\x3d\x89\x84\x90\x67\xb0\x4a\x90\x31\xf7\xe0\xf3\x3e\x34\x16\x24\x0c\x53\xd9\x26\x5e\xd0\x66\x39\x59\x97\x1f\x41\x7c\xb5\xf2\x10\xcd\xc5\xae\xbc\xb5\xe1\xdb\x7d\xfb\x82\xdf\x43\x58\x76\xa6\xe9\x8f\x41\x5b\x0d\xf8\x69\xf0\xd8\x85\x15\x35\x37\x56\x45\xee\xf7\x0f\xae\xc7\x44\xee\x0d\xc3\xac\xbc\xb0\x40\xf6\x8d\x50\x2c\x2c\x62\xc8\xdb\x45\xeb\xe5\x48\x54\xa4\xb3\x6f\x43\xfe\xb4\x9a\x6d\x1c\x2c\x2e\xa7\x99\x14\xa7\xc2\x3c\x60\xba\xaa\x67\xcb\x47\xb2\x17\x8e\x12\xdc\xe7\x6b\x00\x4c\x87\xb7\xb8\x34\x6e\xfa\xdf\x38\x0b\x9e\x1e\x41\xf6\x31\x48\xda\x51\x78\x1d\x75\xce\xc0\x40\xe4\x26\x88\x20\x21\x1f\x3c\x46\x25\x01\xd8\x08\x99\x89\x4e\x79\xd6\x18\xde\x42\x46\x1d\x78\x5a\xea\xce\x53\xae\x14\xb7\x9d\x33\x50\x1e\xd5\x62\x9b\xbd\xd0\x71\x28\x15\x6d\xb0\x72\x5f\x5b\x4b\xed\x59\x3a\x95\x29\x47\x83\x03\x84\xf6\x1d\xf0\x0e\xe0\xaa\x09\x90\x99\xc3\xcd\x97\x65\xa9\xc1\xc7\xe8\xa6\xa8\x34\x30\xb8\xd9\x86\x7c\x8e\x17\x92\x0a\xd0\xff\x64\xd8\xcd\x2f\xf5\xf1\x14\x38\x8c\xe6\xd4\x3e\xec\x17\x15\xd0\x35\xf0\x22\xfa\x97\x96\x9e\x1a\x5d\xd9\xf5\x8d\x89\x6b\x17\xc1\x22\x1c\x9e\x6c\x85\x55\x59\x72\x35\xee\xda\x6e\xc4\x1b\x0c\x11\x76\x12\xb0\x0c\x5f\x0e\xd1\x81\x6b\x05\x73\x63\x58\x27\x07\xa8\xaa\x0d\x98\xd4\xd4\xbe\x5e\x8f\xa3\x2d\x6c\x9d\x27\x82\x21\xef\x30\x67\xb8\xba\x15\x16\xd9\xe0\x51\xd2\xf6\x8b\x7d\x1b\x15\x1f\x74\xa3\x53\x4e\x78\x12\xc0\x51\xe5\xf2\xb6\x3b\x30\x35\xf8\xe5\x70\x3b\x5f\x68\xfd\x2d\x65\xbb\x75\x65\xe8\xaa\x67\xbf\xd2\xa1\x2c\xaf\x0b\xc5\x48\x11\x97\xa9\xff\x89\xd7\x7d\xf7\xa0\xe9\x65\x5e\xf0\x29\xb4\x3d\xd9\x06\xd0\xb8\x88\xe3\x13\xae\x9d\x1c\x7e\x93\x68\xa0\x13\x52\xd0\x0c\x66\x80\xdd\x0f\x1f\x57\x4a\x58\x77\x34\x8a\x7e\xa2\xc0\xb9\xe8\xe2\x72\x75\x10\xbf\x0c\x9e\xf7\x44\xf3\x69\xeb\x3c\x6c\x4f\xc1\x6a\xde\xb6\xe1\x94\x5b\xe8\x28\x7d\x0f\x30"}, -{{0xf8,0xc9,0x18,0x3f,0x23,0x10,0x5f,0xad,0x0c,0x6e,0x51,0x03,0x35,0x8b,0x58,0x32,0x88,0xf9,0xff,0x6c,0x7d,0xfc,0x91,0x10,0x6d,0x07,0x98,0x7f,0xf6,0x9c,0xe1,0xeb,},{0x4c,0x79,0x62,0x8c,0x95,0x8c,0xde,0x0c,0xc3,0xcf,0x68,0x60,0x95,0xb8,0xa2,0xf4,0x4b,0x71,0x93,0xc6,0x16,0xf5,0x1b,0x21,0xb6,0x70,0xb0,0x38,0xce,0x6f,0x67,0xff,},{0xc6,0xa8,0xbc,0x7a,0x0d,0x5c,0x61,0x85,0xb6,0xec,0xd6,0x03,0x3e,0x42,0x32,0x1d,0x5c,0x87,0x1b,0xf8,0x89,0xbe,0x72,0xbd,0x54,0xcc,0x00,0x83,0xed,0x60,0xa4,0x70,0xb2,0xcc,0x0f,0xb4,0x68,0x2c,0x89,0x4c,0x75,0xb0,0xdf,0x95,0xf1,0xec,0xfb,0xba,0x2d,0x5a,0xce,0xf3,0xe1,0xaa,0xfe,0x54,0xb9,0xf7,0xe8,0x03,0xa1,0xd0,0x15,0x0a,},"\xb1\xd6\x05\x95\x32\x3f\xf3\xc8\x44\x87\x41\x90\xe1\x83\x6e\x41\x01\x40\x9c\xbc\xea\xe2\x8d\x5d\xa8\x1f\xad\x29\x8f\xe4\x7f\x6b\xdf\x44\x74\x5b\x7c\xd0\xd3\x71\x31\xc3\xec\x36\x5b\x92\xf5\xa1\xa6\x9c\x09\xfe\x2d\x9e\x81\xda\x10\xcf\x19\xd8\x5f\xf5\xff\x26\xf9\xe7\xdb\x9f\x07\x93\xb2\x5a\xb2\x6e\x6a\x74\xf4\x4e\xb8\xc4\xf0\x78\xeb\x7a\xd1\x8e\x65\xa1\x62\x10\xd5\xc8\x44\xd3\xce\xf7\x5f\x1d\xaf\x44\xee\xe5\x58\xf9\x0e\x52\x4a\x03\x2b\x6c\xae\x6c\x8d\x23\x36\x7c\x28\xce\x1c\x75\xfc\x25\xac\x87\x43\x39\x77\xd5\x97\x53\x3c\x92\xae\x65\xf2\x91\x3a\x18\x90\x7a\xc7\xd9\x54\x3d\xf2\x41\x27\x74\x39\x43\xfe\xfd\x9c\xf8\x3e\xd8\x33\xf6\x3e\xc8\x36\x72\x33\xd8\x97\xbf\xa1\x2d\x46\x6d\x2c\x4a\x9a\xd7\x0d\x5a\x67\x2f\xc1\x07\x75\xea\x2d\x20\x4e\x63\x6d\xe7\x01\x07\x88\xda\x27\x1d\xf0\x38\x81\xa2\x5c\x8d\xfa\x5a\xf7\x3e\xe5\x59\xf8\x1b\x52\x9b\x35\xaa\x12\x7f\xdc\x0e\xe8\xfd\x36\x9c\x7a\x04\x36\x62\x39\x86\xaa\x64\x07\xfa\x67\xa1\x42\x0c\x46\xf3\x21\x1a\xb8\x4f\x84\x46\x6d\xd5\x8b\xb7\x95\x08\xa1\xfe\xb0\xa5\xa5\xdc\x3b\xb0\xc1\xb2\x48\x09\x82\x62\xa0\x64\xf3\x7b\xb2\xf0\x19\xe2\x90\xc6\x0a\xfa\xa1\x20\x66\x51\xa2\x69\x7c\xaa\xcc\x3e\xcc\x02\xec\xfc\x07\x7f\x27\x2e\x8f\x75\xce\xa7\x1c\x3b\xc3\x35\x6d\x2b\x58\x07\x27\x6f\x19\x55\x00\x1c\xfe\x10\xa6\x17\x16\xb4\x08\x2b\xd6\xf8\x4c\xae\x4b\xb0\xd9\xa4\xb7\x5a\x4b\x57\x62\xf8\x10\x79\xf1\x9d\x7d\x19\xea\xff\x86\x31\xc9\x24\x88\x5b\xd3\xa6\x4e\x12\x9f\x4c\xf6\xb7\x9c\x7a\x98\x29\x66\x55\x11\xe9\xd8\x5c\x74\x5e\xb2\x2c\x1b\x7c\xb2\xa1\x7a\x49\xb6\x28\x5c\xce\x37\xb3\xde\x41\x59\x40\x32\x83\x23\xef\xe2\x4a\x1a\x07\xee\x87\x46\x8f\x65\x10\xe4\x2d\xd2\x06\xfe\x7f\x09\xe3\xd4\x33\xfb\x52\x15\x6a\xe3\x48\x38\x31\x15\x64\x88\x63\xe4\x5b\xf6\xa3\x71\xb1\x7e\x70\xe1\x9f\x96\x27\xd7\xf0\xa5\x8b\x95\xc6\xa4\x78\x8d\x5f\xd7\x86\x2f\x16\x12\xc0\x34\x73\x25\xb7\x97\x65\x1b\xe3\x0c\x3e\x1e\x60\xea\x4a\xe6\x0b\x57\x45\xa3\x8b\x6a\x9d\x4e\xb4\x93\x5d\x6f\x3c\xb8\xd7\x1a\xd3\xf3\x9a\xdd\xa5\xe4\x2e\x22\x19\xde\x0d\x38\x19\x09\xc9\xcd\x31\x7d\xd4\x37\x94\x21\xa2\xa8\x42\x68\xa7\xea\x71\x80\xa6\x4c\x12\x9b\xe1\xe5\xe8\xfc\xbb\xf5\xed\x65\x9e\x9f\x7e\x76\x3c\xe8\x4f\x63\x0d\x54\x07\x95\x4f\x9f\x75\x57\x50\xa6\xdb\xf9\xf7\x66\x07\x17\xde\x8e\x2a\xdc\x1e\x9a\xc9\xee\x31\x65\x4d\x18\x37\xce\xe3\x97\x95"}, -{{0x16,0x08,0x9a,0x1b,0x93,0x2f,0x8d,0x14,0x99,0x56,0x88,0xb4,0x8d,0xd8,0x41,0xed,0xae,0x3d,0xa5,0xcf,0xd2,0xcb,0x16,0x55,0x53,0x06,0xf3,0xfe,0x8b,0xd3,0xed,0xb9,},{0x9e,0xcd,0x9f,0xdd,0x7e,0x0b,0x92,0x3d,0xef,0xf5,0xd8,0x87,0xb2,0x42,0x58,0x5d,0x9d,0x41,0xcd,0x2c,0x7c,0x10,0xf9,0xc3,0x45,0xb3,0x9f,0x63,0x3f,0x4a,0xb9,0x03,},{0x78,0x78,0xab,0x74,0x1e,0xba,0xe2,0x74,0x7c,0x78,0x97,0xcb,0xb1,0xd1,0x05,0x48,0x2f,0x37,0xbe,0x2f,0x5f,0x91,0x79,0x52,0x32,0xcd,0xfb,0xcc,0xc5,0x26,0x60,0x89,0x18,0xe2,0x75,0x6d,0xdb,0x75,0x36,0xb3,0x68,0x0c,0x16,0x2c,0xf8,0xa1,0xef,0x38,0xa3,0x41,0xb9,0x36,0x2b,0xfe,0x5d,0x46,0x8b,0x4b,0xce,0x21,0xdf,0x23,0x4f,0x0f,},"\x58\x50\x02\x32\x38\x8d\x9a\xa4\xb5\xfa\xf8\x5b\x02\x33\x24\x7e\x71\x7f\xd1\x68\x40\xde\x9b\xfd\x0e\xf8\x6e\x01\xe6\x13\x02\x77\x55\x13\xe2\x24\x12\x5e\x0d\x20\x42\x0e\xa9\x49\xf6\xc2\x64\x25\xf7\x00\x77\x91\x1f\x97\x11\x31\x0c\xd6\xfd\x8b\xff\x27\xcd\xea\x11\x48\x0c\x73\xe8\xf8\xb3\xc3\x76\x41\xe7\xe8\xdd\x86\x07\xc1\x64\x02\x18\xfe\xc8\x0a\x02\x09\x28\xb9\x3d\x4d\x55\x7e\xbe\x82\xec\x0b\xb1\x75\x38\x86\x7d\x2c\xb1\x4d\x44\xd3\xea\x72\x7f\xdd\x52\x82\x0b\x0d\xa9\x44\xde\x21\xcd\x5d\xa3\x03\xd7\x76\xfe\x99\xcb\xc2\x64\x83\x65\xe6\xa0\xa9\x8d\x4d\xb1\x50\x84\x26\x61\x76\x8b\xe8\x4c\x68\x50\x7a\x5c\x45\xd2\x07\x84\x0b\x03\x35\x37\x78\x6c\xb2\x1d\xad\xad\x5f\xba\xb9\xc5\xcf\xc1\xe3\x54\x7d\xe5\x50\xd3\x13\x63\x1d\xd4\xfb\xb7\xca\x8f\x71\x93\x86\x27\x60\x8d\x2e\xbf\x65\x5d\xb4\x32\x5a\xbf\x3e\xd5\x04\xdc\x18\x30\x58\xf9\xde\x1e\x44\x93\x12\xd9\x04\xc8\x46\xa1\x84\xa0\x28\xf3\x64\xc0\x28\xb2\x7e\xb4\x94\x64\x27\xe3\x1c\x21\xe1\x05\x1d\xf3\x64\xd4\x99\xf4\x77\xbf\x51\xe7\xa8\x89\x31\x83\xe5\xec\xf7\x7d\x51\x3a\x1a\x76\xb1\xa6\xfd\xfb\x16\xbe\x90\xd7\x4b\xe4\xc4\x34\x5a\x4f\x9f\x87\xee\x44\x1a\x10\x22\xd6\x7e\xe8\x44\x78\x9f\x21\xb0\xc3\x1a\xdc\xc0\xd9\x56\x63\xcd\xfb\x40\xa8\x95\xb9\x22\xdc\xe8\x06\x9b\x93\x2c\x80\x2f\xd3\xab\x1e\xf0\xce\x6b\xff\xdc\xc5\x65\x3b\x1c\xd5\x25\x7e\x19\xa0\x95\x16\x87\xe5\x45\xfa\xf4\xaa\x66\x06\x5a\x55\xc4\xb4\x19\x1e\x34\xe8\x04\x7d\x6a\x4a\xb5\x2d\x1b\x06\xc3\x69\xa4\x26\xca\x2d\x16\xb5\x1a\x02\x71\xf2\x7f\x8d\x74\x4c\x71\x1f\xce\x3a\xad\x9d\x4a\xc0\x38\xee\x70\x0e\x4e\x97\x1b\x21\xca\x48\x9f\xf2\xb8\xc7\x78\xa3\x72\x1a\xdf\x47\xc1\xae\x5a\x41\xb9\xa2\x7f\xa7\x42\xfd\x0f\x18\x16\x4e\xf3\xc2\x6b\x8a\xe7\xd1\xfa\x29\xb7\xc0\xcc\x46\x83\xbe\x65\x02\x5c\x96\x53\x7a\x12\xd5\xfc\xeb\xbd\x05\xe9\x30\xc3\x69\x3e\xbb\xba\x0a\x78\xad\xf5\x9d\x8a\x3b\x59\x8a\x34\x8e\xaa\x9f\x47\xca\xf5\x31\xfe\x44\x96\x52\xdb\x5b\x20\xd6\x89\x94\xe3\x5a\xfe\xc2\xc2\x57\x09\x05\x5a\x1d\xe2\x60\x82\xe3\x91\x2d\x49\x7c\x64\x77\x20\xa3\xf8\x73\x62\x14\x56\xe6\xa5\xb9\xeb\x61\x3a\xcb\x43\xb6\x6d\x47\xd0\xb9\x54\xc6\x9e\x8f\xbf\x2c\x5e\x63\x4c\x48\x6e\x57\x24\x93\x0e\x0b\x56\xa5\x16\x94\x0c\x8c\xb0\xe7\x75\x27\x4d\xef\xf9\x7c\xbb\x77\x59\xce\x90\xa2\xb9\x3e\x9e\xfa\xa6\x24\xe6\xb3\x8a\x39\x84\x9d\xca\x1d\xf6\x12\x73\x6f"}, -{{0x94,0xd5,0x09,0x15,0x14,0x4c,0x7e,0x7d,0xd0,0xf8,0x5f,0xef,0x87,0xed,0xdc,0x22,0x06,0xc1,0x56,0x9e,0xd1,0x43,0x1c,0x8c,0x5a,0x15,0x3e,0x32,0xe1,0xcb,0x2f,0xb7,},{0x3b,0xb0,0x98,0xcf,0x16,0x0f,0x3a,0xec,0x31,0x70,0xb5,0x7d,0x6a,0xdd,0x4f,0x56,0x73,0x92,0x70,0xe4,0xb3,0xa8,0xef,0x79,0x66,0xec,0x30,0x61,0x9b,0x29,0x91,0x02,},{0x59,0xa1,0xce,0x55,0xf5,0xa6,0xba,0xdc,0x1b,0x93,0x91,0x26,0x36,0x20,0x54,0x2c,0xfc,0xae,0x87,0xa0,0xf2,0xb9,0x50,0x22,0x50,0xcf,0xe4,0xbd,0xcb,0xf7,0x6c,0x46,0x19,0x77,0xc3,0x34,0xa4,0x8d,0x91,0x6e,0xde,0xbd,0x56,0xc2,0x1c,0xe2,0x17,0xc3,0x5a,0x64,0x44,0xcf,0xbf,0xd3,0xb1,0x1a,0x3d,0x48,0xfa,0x2e,0xdb,0x6e,0xb4,0x0f,},"\x4d\x91\x5f\x27\x33\x2d\xd7\x50\x51\x71\x9a\x24\xae\x8d\x0e\x9c\x30\xda\x79\x09\x99\xe2\x2d\x9b\x58\x7e\xf2\x03\x21\xbe\xe4\xc0\x7d\x0a\x12\x49\x4f\xfe\x59\x9f\x47\xf9\x69\x25\xf5\xd9\x25\x17\xfc\x3e\x5f\x04\x1d\x0c\x70\x9f\x2a\x97\x83\x12\x5e\xec\xa6\x65\x29\x97\x20\x1c\x42\x9a\xa6\xf1\xce\x2f\x07\xa0\xd4\xa0\xa1\x8c\xf2\x0b\x3e\x9a\x4f\x76\x63\xea\x52\x62\xca\xd8\xf9\x49\x41\x1b\x05\xff\x5c\x5e\xdd\x7b\x30\xb2\x17\xd7\x5d\x8c\x86\xc9\x4e\x5f\x92\xc1\x67\x34\x37\x4e\x8c\xea\xd6\x1b\x0b\x27\xbb\x4b\xf5\xf4\x3a\x31\x3c\x1d\xd5\xb8\x3e\x0e\xa9\x33\xb6\xca\xdf\xed\xd7\xa6\x4a\xa5\xdd\x5b\x5d\x02\xc6\x95\xea\x20\xe0\x91\xfd\xaa\x72\xef\x4e\x7c\xa4\x0f\x38\x39\x5b\xe8\xbf\x7a\x25\x5c\x6d\x06\xa6\x32\xd7\xd7\x85\xd9\xe0\x47\xf2\x32\xaa\x50\xfa\x14\x52\x9f\x98\x6f\x9e\xf9\xd7\xb5\x80\xa0\x39\x65\xb0\x15\x47\x88\x82\x2a\x22\x5b\xb5\xab\x34\x38\xb8\x9a\x5c\x28\x74\x4a\xb0\xbc\x0b\x20\x14\xe5\x79\x6a\xcb\x49\x35\xa8\x1b\x02\xa0\x46\x32\xac\xb8\x8c\xaa\x7e\x39\xe0\x69\xc7\xc8\xe1\x75\x82\x91\x09\x4a\x53\xe3\x62\xfc\xed\xaa\xa5\x83\xec\xa7\x66\xef\xeb\xf6\x9b\x38\xe8\xcd\xe9\xce\x58\xe0\x12\xc6\x0e\xc8\x8e\x8c\x42\xbe\xad\xfa\x83\x8c\xfe\x44\x0f\xa0\xc0\x1d\x65\x9c\x96\x34\x57\x6d\x7d\x7a\x2d\x3a\x04\x4f\x99\xc6\xe4\x26\x3d\x4c\x0b\x37\x4a\x38\x8a\x2a\xcf\x38\xef\xf2\x9c\x77\x7e\x9d\xaa\x60\xd5\x98\x03\x5a\x7d\x9e\xdf\x67\xa5\x02\xc3\xf5\x73\x20\x7b\x11\x9c\xac\xac\x3f\xa7\x1e\x2a\x02\x07\xc6\x01\xcc\x0d\xd6\x37\xef\x56\x2b\xac\xc3\x5c\x57\x04\x27\x38\xf1\xf5\x58\x15\xa5\x26\x80\x82\xcd\x6a\x50\x82\x92\xfa\x29\xe3\x4e\x96\x45\xd8\x7a\x1a\x2b\x6e\x58\xad\xb7\xf4\xa5\x7f\xbb\x53\xe9\x21\x3e\xf3\xdc\x87\x3f\x29\x39\x62\x58\xa1\xea\x54\x6f\xb5\x95\x2c\xe3\x43\xce\xe9\xbb\xb9\x0c\x1c\xda\x72\xc6\x5a\x7c\x8e\x40\x31\x2b\x32\x8e\x23\x19\x20\xc2\x33\x07\x7d\xca\x34\xd0\x4f\x9d\x89\xda\xa9\xa2\xf4\x34\x59\x16\x5f\xd1\x02\xff\x56\x43\xc7\x17\x52\x30\xb3\x9e\xc7\xc3\xc4\x75\x65\x0e\xf1\x31\x60\x9d\x32\x20\xf5\xa2\x94\xa4\x03\xb1\xe1\xc4\x2c\xfa\x16\x2c\xd4\x26\xf0\xae\x43\xfd\x6b\x7a\xb5\x47\xa6\x2b\x7d\x5f\x84\x74\x03\xc4\xe5\x98\x79\x53\x87\x71\x58\xcf\xde\xe2\x3c\x04\xf7\x51\xc7\xc8\x6d\x07\x8e\x82\x4c\xa6\x3b\x5e\x65\x54\x3e\x97\x8b\x6b\x0c\xc6\x89\xef\x66\x44\x12\xb0\x1b\x8f\xf1\x65\xe7\xdb\xde\x3c\x09\x9b\xf4\xf3\x4e\xbd\xdc\xb4\xc4"}, -{{0x0d,0x81,0x92,0x6f,0x51,0x3d,0xb4,0xb2,0x5d,0xfa,0x1e,0x52,0xb5,0xdc,0xa6,0x78,0xf8,0x28,0xa6,0x1c,0x7c,0x91,0x3c,0x82,0x82,0x47,0xc2,0xeb,0x04,0x22,0xb7,0xd1,},{0x0f,0x32,0x41,0x1e,0xf9,0x1d,0x4e,0x4b,0x69,0x41,0xdf,0xca,0xab,0x14,0x2e,0xf3,0xbe,0xc1,0x60,0x98,0x39,0x93,0xa5,0x26,0x2c,0xcf,0x27,0xfa,0xdd,0x2a,0xf8,0x90,},{0xe0,0xcb,0x6c,0x71,0xeb,0xf8,0xd7,0x05,0xe5,0x0c,0xad,0x9f,0x0b,0x8c,0xba,0x3e,0xcf,0x4b,0x9e,0x37,0x93,0x40,0x00,0x92,0xaa,0x5b,0x12,0x1e,0x7d,0xbb,0xc8,0xbe,0xa7,0x1d,0xf2,0x95,0x28,0xca,0x9b,0x47,0xab,0xf8,0x7c,0x19,0x8a,0x8d,0xc4,0xe1,0x4d,0x51,0x80,0xce,0x93,0x2d,0xd2,0x11,0x4a,0x3c,0xda,0xa5,0x55,0x2c,0xc2,0x05,},"\xa9\x38\x37\x52\x2f\x7e\xc2\xe9\x3a\x2e\x4b\x4c\x8b\x46\xde\x92\x6a\x81\xad\xa2\xd2\x48\xbc\xd3\x3b\x39\xb6\xc9\x5f\xb6\x2a\x61\xdb\xbe\xda\x1a\xa8\x5a\x21\xd9\xb9\x6a\x08\x51\x0d\x8d\x3a\x65\x8c\xf3\x20\xa1\x09\x28\x69\x59\x99\xd2\xc0\xd6\x05\xc7\xf9\x5a\x12\xf5\x6a\x87\x18\x50\x7d\xb0\xf4\x97\xe3\xea\xd6\x13\x13\x2a\xb0\x92\xcb\xf1\x9d\x22\x60\x35\x86\x30\x35\x8d\x9b\x26\xe6\x8d\x50\xdd\xae\x37\xc8\xaf\x0b\xb7\xd2\x74\x1f\xd2\x92\x9c\x21\x27\x9a\x78\xd1\x0e\x2c\x5f\x3c\x5b\xf4\xa4\x2a\x36\x17\x03\x6d\x54\x74\x36\x47\x76\x5a\xfd\x8c\xd9\x10\xf8\x1b\x38\xce\xd7\x23\x90\x63\x0e\xe6\x89\x44\xa3\x7d\x29\xc2\xfe\xca\xda\x1c\xc5\x9e\xc5\x44\x07\x5b\xdb\xc1\x4c\x63\xc6\x23\x4b\x88\x40\x49\x00\x0c\x27\xc7\x34\x06\x03\x56\x04\xfc\xa8\x76\x0b\x49\xa5\xe2\x10\x9e\xf9\x12\x85\xad\xc4\xec\x48\xc8\x19\xd6\x2d\x94\x8f\xac\xa9\x0f\x62\xcf\xae\xf0\xb0\x7d\x6f\xe5\x76\xd7\x62\xbf\xd0\xee\xf9\x4c\xf6\xb5\x33\x2c\x4d\x42\x25\x11\x60\x7f\x2f\xac\xc7\xac\x04\x6a\x59\xb9\x61\x7e\x83\x83\xd1\x02\x9c\xc9\x1a\xc5\x92\xb5\x20\x84\x41\x30\x32\xbe\x84\x1b\xaa\x9b\xf9\x62\x51\xa6\xbd\xa6\x71\xd4\xcd\x4b\x12\x5d\xa6\x58\xa4\xe5\xa5\x0f\x44\x28\xee\xbf\x26\x14\xfb\x0c\xe5\xfe\xbe\x80\xf7\x21\xa5\xf4\xc0\x32\x55\x06\xd2\x7a\x8d\x31\xe3\x3d\x86\x25\x38\x70\xdd\x63\xc0\x8e\xdc\x73\x02\xb2\x80\xe9\xb9\xbd\xc2\x8b\xee\xf0\x5c\x7d\xcb\x30\xd4\xc1\x62\xe9\xbe\x83\x2e\x1c\x78\x5e\x37\x55\x12\x18\x42\x1e\xec\x85\x2c\x42\x98\x21\x3b\x2f\x27\xf8\xf8\xc7\x06\xd3\x91\xb9\xc6\x9a\x56\xdb\x7c\xe5\xd8\x15\x48\xfc\xa5\xfe\xd4\x56\xf2\xd8\xaf\xd0\xb7\x5f\x79\xf8\x58\x68\x31\x6f\x4a\x09\x21\xf0\xc6\x63\x99\x26\x51\x6b\x3c\x3e\x52\xa9\xcb\x22\x55\x45\x46\xef\x70\xe1\x4c\x77\xec\xbd\xcd\x5c\x0d\x59\xa8\x17\x69\xb3\x0d\x5d\x13\x1f\x2f\xb4\x49\xc9\x96\xb8\xde\x8a\xc7\xf8\x08\x4f\x84\x99\xe1\xa5\x6f\x7c\xd2\x9d\xb6\xaa\xef\xcc\xae\x8a\x60\xe7\x56\x16\xa1\xf7\x02\xc3\xbc\x8d\xea\xa1\x00\x4a\x8d\xae\x03\x92\xa5\x9c\xee\x54\x81\x0c\x6e\x94\x0e\xee\x25\xfb\x2e\x5d\x57\x32\x67\x04\x4b\x89\x3f\xfd\xe3\x78\xfe\x75\xac\x26\x13\x37\x3d\x84\xa0\xca\x81\x87\xaf\x4a\x33\x58\xe5\x0a\x99\x4e\xd0\x33\x67\xde\x64\x5e\x10\x39\x0f\xea\x4c\x33\xbb\x1a\x6c\x0c\x39\x85\x8b\x8d\xb4\xa6\x9f\xe8\x94\xa4\x22\x3d\x45\xaf\x69\xb3\x6c\x61\x17\xc4\xdc\x25\xde\x49\xa6\x30\x17\x00\x2b\xa9\xae\x55\x1e\xf9"}, -{{0x6c,0x8c,0x53,0xb5,0x6b,0xbc,0xb4,0xc0,0xa2,0x5d,0xc4,0x0c,0x18,0x24,0x0b,0x6a,0x5c,0x75,0x76,0xb8,0x9d,0xde,0x45,0xef,0x13,0xfb,0x15,0x8e,0xa1,0x7f,0x8e,0xd9,},{0x23,0x8e,0x51,0xd6,0xa4,0x4f,0xa7,0xac,0x64,0x26,0x88,0x01,0x26,0x1e,0xa3,0x5b,0x62,0x63,0x8a,0x00,0x6c,0xc4,0x52,0xbd,0xdb,0x9f,0x16,0xfc,0x58,0x03,0x06,0x0c,},{0x4b,0xf1,0xe7,0xd4,0x9c,0xd4,0xd5,0xc3,0xc1,0xfd,0x4a,0x4b,0xc4,0x8f,0xf6,0xb6,0xe5,0x2f,0xd9,0x51,0x0a,0x41,0x18,0x12,0x29,0x69,0x96,0xe4,0xfe,0xc5,0x6b,0xe4,0x45,0x14,0xc5,0x67,0xd1,0xd3,0x34,0x77,0xbd,0x5d,0xc0,0x83,0xc3,0x95,0x8b,0xd9,0x5b,0xfe,0x59,0x9c,0x15,0x3f,0x21,0xae,0x26,0x25,0x29,0x67,0xb7,0x32,0x60,0x03,},"\xb6\x0d\xf2\x94\x4b\xa0\x15\x75\x98\x02\xd3\xc5\x87\xbc\xfe\xbe\x52\x1a\x7e\x77\xb9\x98\x5b\x76\x1c\x96\x76\x45\x4d\x24\xa6\x64\xaf\x0b\x0d\x44\x22\x5a\x55\x75\x12\xe1\xc1\xcd\x7d\xd8\x33\x5c\x8f\x6a\xdf\x92\x8e\x18\xf8\x9f\xd5\xee\xdf\x6f\x41\x1d\xcd\xaf\x99\x69\x12\xe8\xc3\xe2\x3d\x1c\xb9\x5e\xca\x4b\x9e\x24\xe7\x53\x9c\x3b\x98\xbf\x3d\x07\xec\x25\x13\x92\x09\x6c\x19\xac\x53\x74\xdc\xba\x52\x61\x32\xb6\xd9\xbb\x8f\x6c\x85\x9c\xe9\x85\xd5\x84\xc7\xbb\xa5\xb0\x2a\x81\x03\x4b\x6d\x8b\x52\x1b\xd2\x80\xe5\x0d\x77\xda\xa2\xb2\x41\x3e\xd6\x79\x83\x4f\x81\x61\xd5\xd0\x57\x3b\xdd\x47\x6a\xc3\xcd\x0a\x3a\x7d\x8d\xb4\x53\x34\xe8\x9c\x00\xab\x66\xbc\x36\x8a\x07\xb4\x23\xe2\x46\x43\x46\x36\x27\x2a\xa4\xe4\x63\x7a\x53\x06\xb2\xc3\x39\x79\x92\x78\x1f\x30\x23\x8d\xe7\x9e\xc1\x04\xac\xc7\x20\x0d\xef\xad\x96\x08\x83\xd3\x91\x44\x3e\x70\xef\xbd\x22\xf1\xcf\xce\xec\x51\x12\xfe\x9e\x8e\x13\xbb\x94\x1c\x08\x34\x68\xdd\x71\xff\xca\x97\x6c\xd5\x1c\xe1\x61\x79\x31\x10\xef\x00\xaf\xf5\xee\x2c\xcb\x77\x06\xa5\x12\xb8\x5b\xeb\x94\xac\x49\xd1\x9a\xfb\x63\x33\x65\x5c\xf3\xae\xa5\x35\xa6\xf9\xc7\x5e\x03\x48\x41\xe7\x63\xc5\xa2\x49\xb4\x70\x4e\x1b\xe7\x8b\x0e\xca\xc6\x80\x2c\x34\x3c\x1b\x7e\x7b\x57\x70\xde\x4c\x93\xa3\xa7\x9c\x46\xe6\x83\x5d\xa8\xae\x5d\xb3\x83\x8e\x17\x96\xb5\x64\xa4\x80\xa4\xf2\x90\xb6\x0a\x1c\x63\xa7\x25\xff\x3f\xef\x43\x4d\x2a\x0b\x3d\x89\x31\x97\x87\x42\xb5\x25\xc8\x3b\xae\x67\x94\xae\x64\x19\x37\x94\xb3\x70\xc2\x89\xba\x35\xed\x79\xd3\x70\x72\xa8\xdc\xfc\xad\xb4\x6d\x5f\xfa\xee\xba\x1b\xfd\x4f\x87\xd7\x66\xb5\x04\xe6\x2b\x4a\xcd\xd7\x74\x46\xe7\x9b\xa9\x94\xd6\xdb\xf4\x76\x5e\xbd\x74\xb0\x36\x51\x00\xda\x56\x16\x2c\x36\xfe\x5a\x95\x07\x7f\x6b\x42\x65\xe8\x17\x96\xb4\xa5\x74\x43\x78\x29\x70\xb9\x6c\xb4\x56\x9b\xa9\x85\xc5\x5f\xe3\xa7\x18\x38\x0b\xca\x39\xf1\x66\x24\xf8\xe4\x7c\xc6\x3c\x1b\x6f\xa1\xbd\xe1\xae\xba\x9c\x51\xf9\x4b\x70\x2b\x13\x10\x8c\xc1\x48\x1d\x42\xe6\xfa\x98\x1e\x3e\xbf\xe0\x64\xd2\xdc\xa7\x42\x0c\x74\x59\x57\x92\x31\x2a\xe3\xfb\x91\x01\xd4\xb6\x6d\x99\x16\xdf\xd6\xc1\x3a\xe8\x83\xe6\x61\xc6\x28\x22\x8b\xe9\x79\x4c\xf6\x03\x45\x07\x6d\xb2\x61\x84\xb6\x17\xe2\x72\x29\x8c\xd4\x18\x3f\x27\xbd\x52\xd4\x05\x10\xbb\x01\x5d\x20\x97\xd4\xcc\x76\xe7\x6c\x0a\x62\xbb\xfd\xaf\x53\xc7\x26\x87\x75\xbb\xfb\xdb\x88\x70\xeb\x9b\xab"}, -{{0x69,0xb3,0x20,0xfb,0xd4,0x77,0x40,0x30,0xa2,0x97,0x67,0xa0,0xcc,0x15,0x50,0xd1,0x0b,0x74,0x9b,0x44,0xd6,0x19,0xd4,0x1d,0xce,0x11,0x46,0xf7,0xac,0x80,0xa7,0x55,},{0xdc,0x50,0x8a,0x79,0xc6,0xb8,0xab,0x86,0x6c,0xd1,0x17,0xa5,0xa8,0x4d,0xd9,0xd9,0x31,0xfd,0xa4,0x50,0xbe,0xc2,0x93,0x35,0x34,0x4d,0x0d,0x21,0x92,0x16,0xd6,0x5e,},{0x69,0x7d,0x4d,0x89,0x7e,0x0e,0x2c,0xc0,0x2b,0xc1,0xc2,0xdd,0xa5,0x7f,0x0d,0xda,0x62,0x0b,0x37,0xe8,0x61,0x82,0x2b,0xb7,0xf1,0xa7,0x01,0x93,0x5e,0x95,0x9e,0xa0,0xd8,0x45,0x3f,0x74,0x6f,0xb9,0x2c,0x08,0x7e,0xd6,0x5d,0x98,0x0e,0xea,0x1d,0x6f,0xdb,0xf2,0x3e,0x99,0xb2,0x89,0xaa,0xe0,0xdc,0xbb,0x12,0x8e,0xf8,0x36,0x64,0x0a,},"\x21\x7e\x33\xf8\x86\x22\xc9\x6f\x8d\x09\x2c\x9e\x26\x66\x4f\xe9\xef\xc0\xd8\xd2\xeb\x59\xa0\x36\xfa\x46\x4c\xee\x65\xce\x44\x89\xca\xf9\x03\xdc\xe1\x7a\xfa\xfb\xc4\xf1\x8d\xc9\xbb\xfd\x6c\x1a\x4b\xe7\xb8\x34\x85\xa6\xca\x94\x7d\xef\xb1\xd3\x51\x25\xd0\x77\x39\x62\xa3\x44\xa3\x8b\x6d\xca\x9a\x40\xc3\x1c\x1c\x4e\xb2\xd7\xf6\x81\x8f\x97\x8e\x57\x3d\x66\xb9\x90\x92\x1b\x92\xb7\x77\x47\x1a\x4f\x6f\x05\x47\x7e\xbc\x35\x3a\xce\x1d\x86\xb0\x0c\xc2\x51\x77\x7a\xaf\x6a\xf3\xaa\x11\x79\xbf\xf7\x8d\xf5\x04\x8e\x5e\xf2\x99\x68\x67\x0e\x53\x54\x83\x56\x8d\x6b\xb1\x6d\xa8\x29\x56\x8f\x81\xc7\x99\xb9\xaf\xd4\xaa\xd6\xef\x08\x52\x52\xc0\xce\x3a\xc0\x1a\xc2\x1a\x9e\xa6\x9b\xd5\x8e\xad\xc6\x69\x68\xf5\x5d\xee\x38\x6b\x65\x3f\x33\x34\xef\xc3\x98\xef\x3c\x37\xa3\x8c\xe9\x3b\x21\xf1\x07\xcc\x54\xde\xc2\x6f\x53\xfe\xe5\x60\x4e\xb0\x9a\x36\xaf\xe6\xb6\x65\xb6\x32\x4a\x84\xc7\xda\x7b\x7d\xd0\x1d\x92\x78\xe4\x72\xf1\x5a\x5c\xe9\xff\x0f\xd9\x3d\x0a\xa0\x60\x4d\xd2\xdf\x8d\x5b\xf6\xa9\x12\x73\x4e\xc5\x1d\xe7\x7f\x0c\xe0\x99\xba\x11\x67\x02\x10\xa6\xa2\x06\x10\x6b\x0e\xde\x2d\xed\x85\x8a\x6b\xc4\x11\xe7\x61\x3e\x6f\x80\xe1\xaa\x52\xc3\x23\xe3\x0f\xa8\x49\x95\x1c\xc9\xb7\x76\xe4\xcc\x58\xc9\x0c\xfc\x8f\x44\x2d\xf6\x41\x51\xa7\xfd\x4a\x3d\xd6\x1a\x43\x36\xda\x21\xd0\x39\x44\x63\x5d\x3f\xd6\x67\xbe\x74\x1e\xf4\x5b\x1f\x7c\xb2\x76\xd9\xf4\xde\x81\x07\xde\x64\x58\x2f\x79\x17\xc6\xea\xb3\x8e\x0a\x88\x90\xa4\xbe\xe4\x8b\xc9\x26\x17\xa3\x61\xcc\x7b\x1d\x25\xe0\x89\x45\x3c\xe0\xa5\x25\x44\xf8\x68\xdc\xb3\x24\x9d\xe7\x61\xe7\x9d\xf6\x3e\xfa\x07\x94\xe3\xc4\x61\x8c\x55\x47\x53\xee\x28\x1c\x52\xac\x8a\xd7\x8d\x53\x38\xf0\xda\xc3\x60\xa7\x69\x38\x1b\xb4\xa3\x9f\x19\x0b\x88\x7b\x47\x23\x80\x6a\xc4\xa4\xf2\xff\x30\x4b\xc6\xf9\x33\x7a\xb5\x4c\x86\x6e\x6b\xa5\x1d\xf5\x0c\x43\xea\xb5\x2e\x2b\x39\x79\x4c\x99\x17\xe0\xc3\x14\x33\xf0\x36\x81\xd2\xf1\xd9\x3a\x04\x36\x01\x8c\xaa\xae\x20\x20\x6a\x34\x58\xad\x6c\x03\x7a\xcb\x51\x1e\xf1\x28\xf6\xdc\xd0\x53\x05\xf0\x70\x49\xa1\x3b\x6c\x6c\x3c\x5b\x81\x70\xf1\x58\xc8\xf1\x2d\x46\xe1\x60\x93\x1b\xa1\x8b\xd5\x9a\xe1\x29\xec\x07\xa0\x65\x5f\xa4\x82\xeb\xbd\x3b\x85\x0d\x36\xb8\x32\xbb\xb7\x75\xf5\x38\xe3\xc1\xb3\xa4\x3e\xcf\x94\xca\x63\x0c\xa1\x5d\x50\x28\x13\xee\xd3\xe3\x5e\x8f\xd2\x3d\x2a\xb6\x38\x60\x04\x27\xd1\x59\x7c\xb2\x9d\xa2\xa5"}, -{{0x66,0xda,0x8b,0x25,0x4a,0x37,0x06,0x73,0x78,0xf6,0x81,0x38,0xaf,0xed,0xd6,0x64,0x96,0x59,0x6a,0x05,0x85,0x52,0x4c,0x71,0x6b,0xde,0x2b,0x31,0x24,0xc3,0xe7,0xd1,},{0x85,0xbd,0xe2,0x8a,0x92,0x2a,0xb5,0xee,0xaa,0x4a,0x62,0x94,0x52,0x1a,0x2c,0xca,0xc0,0xef,0x23,0x03,0xdc,0xdf,0x8c,0x7f,0xee,0x22,0x8f,0xb4,0x55,0x20,0x12,0xe7,},{0x40,0x82,0xa5,0xbc,0x73,0x0f,0xb5,0x4b,0x6b,0xd0,0xbc,0xd2,0xa0,0x44,0xed,0x5d,0x3d,0x32,0x7d,0xc1,0x9c,0xea,0xc8,0x82,0x5e,0x62,0x9b,0x9e,0x64,0x23,0xcb,0x1c,0x61,0x42,0x36,0xf0,0x97,0xa6,0xb7,0x3d,0x47,0x39,0x47,0xcb,0x81,0xc4,0xe2,0x70,0x85,0x2e,0xe5,0xf1,0x3a,0x5b,0x03,0xdc,0x18,0xe1,0xc9,0xc2,0x7a,0x9a,0x68,0x02,},"\x3f\xae\x36\x63\x88\x37\xd0\xed\xc8\xdc\xee\x51\x7e\x43\xc4\x88\xed\x57\xfa\x6c\x98\x53\xa7\x45\xaa\xed\xfb\x10\x9e\xc1\x40\x9f\xb8\xa2\xfe\x51\xd2\x3e\x0d\xd9\xfb\xfd\x94\xf9\x1c\x18\xe6\x11\x4d\x80\x89\x01\xbf\x61\x7d\x26\x67\xce\xeb\xd2\x05\xc5\xc6\x6f\x5d\x75\x34\xfd\x2e\xc3\x3d\xbf\xe5\x80\xad\x91\x9f\x50\x42\x04\xea\xf2\x42\xaf\x87\x00\xb1\x38\xcf\xbe\x0f\x37\x29\x19\xc0\x6b\x86\x1a\x27\xd7\x20\xd0\x9d\xf2\x0f\x4f\xb7\xb7\x48\xe7\x18\xb0\xfc\x48\x6d\xbd\xfc\xb6\x94\xcb\x3f\x14\x20\x03\x5a\xc1\xbe\x55\xd3\x1f\x30\xf9\x97\xa0\x43\xd0\x47\x08\xa5\xc5\x42\xee\x37\xc0\xf7\xfe\x0b\x32\x11\xd1\x8a\x87\x03\x3d\xcb\x15\xc7\x9e\x66\x81\xc4\x97\x05\x93\xd3\x2a\x13\xc4\x8f\x0a\x3a\xf8\xbf\xc1\x36\xe0\xf9\xb5\x6a\x12\x3b\x86\xc4\xc6\x40\xb6\x50\xcb\x7d\xee\x9a\x89\xe8\x2a\xee\xee\x77\x3b\x5c\xb0\x32\xfc\xa4\x1c\x20\xc4\x07\x32\x8b\xfe\xd2\x92\x44\xe4\x60\x55\xa8\x31\x14\x61\x4d\x3d\xb5\x65\x81\x60\x4b\x11\x5f\xba\x14\xf6\x18\xe1\x02\xa1\xe1\x6c\xb0\x36\xea\x69\xdf\x92\x75\xb9\x77\xa0\x85\x81\x18\xc9\x1a\x34\xb9\xa8\x51\x9b\xd0\xda\xc3\xb6\x14\x34\xea\x08\x8f\x38\x1b\xa0\x8b\xc1\x58\x31\x89\xa4\xa7\xc8\xb6\xad\x18\xf7\x32\xd7\x4e\xff\x3a\xce\xf4\xb6\x90\x4d\xf5\x8c\x64\x69\x43\x21\x51\x37\x2d\xf9\x32\x7a\xe7\x1a\x0f\x35\x6c\x94\x46\x8d\xcf\xc2\xe4\xa5\xc0\xe4\xec\x0b\x16\x6d\x90\xcd\x46\x5f\x92\x60\xeb\xd6\xa7\xa6\x2c\xe6\xc7\x15\xbc\xc7\x15\xbe\x0c\x7e\x1f\x28\xc4\x45\x60\x12\xd3\x31\x77\xa7\xd4\x11\x3c\x9a\x5a\x22\xac\xfa\xf2\xd6\xb6\x33\x09\x07\x8f\xc1\xb1\xba\xa8\xf3\x6c\x7e\x86\x6c\x1f\x97\x2a\x65\x00\xa5\xee\xa7\x92\x01\x65\x1a\x73\x05\x20\x8b\x6c\x93\xc4\x92\xbc\x77\xca\xcb\xc9\x9c\x9c\xde\xd1\x79\xe6\x64\xa2\xf4\xe1\x69\x38\xcc\x26\xfc\xa8\xb4\x33\xeb\x80\x12\xf7\xb3\xad\x19\xba\x1f\xb8\x58\xfe\x4a\x00\xfb\x3d\x1f\x8f\xd0\xed\xdf\x0c\x37\xdc\xdb\x2e\x5d\x35\xc2\x54\x6f\x22\xe8\xc0\xf8\xce\x90\xe2\xdf\x8a\xbf\x24\x82\x7a\x01\x9b\x2c\x33\xfc\x59\x0b\xbe\x71\x2f\x01\x92\x87\x00\x2b\xc2\x21\x7c\x0d\xc0\x93\x1d\xc8\xed\x8f\x50\xbb\x44\x2f\x8b\x2d\xe2\x78\x57\x36\x2c\xe5\xa9\xfd\x97\xf0\xfd\x1b\x2b\x92\x51\xca\xd2\xa4\xac\xa1\xa9\x4d\xe2\xe9\x53\x90\x2d\x72\x28\x14\x24\x07\x44\x3b\x1d\x51\x71\x07\x64\x8a\x7b\xab\x83\x07\x49\x87\xd0\x97\x8b\xc6\x1d\x41\x9b\xc8\x45\x91\xc9\x69\xc3\xd6\xf4\xe8\x6f\xc4\x73\x87\x37\xbc\x05\x58\x75\x5c\x11\x0a"}, -{{0x27,0x65,0x48,0x29,0x0f,0x3e,0x0f,0x90,0x05,0x15,0xdc,0x63,0x36,0x6c,0x03,0xfe,0x0f,0xc6,0xee,0x13,0x0c,0x21,0xfb,0x60,0xa4,0xdf,0x9c,0xf4,0x64,0x79,0x7c,0xda,},{0x7e,0x2a,0x35,0x78,0x00,0x0a,0x08,0x7e,0xdc,0xc9,0xe9,0x4f,0xde,0x50,0x9f,0xc4,0xbe,0x05,0xca,0x0d,0xd0,0x90,0xdf,0x01,0xae,0x11,0x21,0x12,0x35,0x36,0xf7,0x2a,},{0x88,0xa1,0x46,0x26,0x1a,0xd1,0x11,0xc8,0x0f,0xa4,0x29,0x95,0x77,0xe7,0x10,0xf6,0x85,0x9c,0xf0,0xd1,0xca,0x80,0xe5,0x12,0xa5,0x52,0xc7,0x25,0xb8,0x38,0x40,0x37,0xee,0xcf,0x64,0x65,0xce,0x97,0x58,0x5c,0x9d,0x66,0x0a,0x41,0xab,0x91,0x04,0xe5,0xf7,0xc9,0xb2,0xf8,0xec,0x6f,0xb2,0x1f,0x1d,0xdd,0x50,0xd6,0x5b,0x9b,0x66,0x0e,},"\xf0\xdb\x44\x2d\xe2\x9a\x7a\x1d\xed\x55\x0d\x12\x00\x02\xcc\x12\xab\xff\xf9\x8b\x1f\x57\x6d\x65\xbd\xe1\x6d\xea\xba\x68\x7e\x4e\x0b\x0d\x5a\x87\x48\xd7\x50\x3d\xa2\x96\x9c\x64\xd6\xa7\xc2\x8d\x27\xb6\xc9\x3a\xd2\x57\xce\x32\xec\xda\xee\x37\x5f\x43\xff\xf9\x7c\x43\x2d\x45\x3f\x71\x96\xc7\x09\xc3\xbd\xfb\x73\x88\xd4\xd8\xea\xf1\x39\xf1\x82\x94\x0c\xe1\x7b\x45\x52\xe2\xd2\x0a\xed\x55\x57\xba\x4d\x2a\xcb\xf8\x45\x73\x0c\x0a\x66\xb4\x5b\x40\x95\x0b\xaf\x6a\x94\x64\x37\xaf\x6c\x9e\x3b\x33\xa7\x9e\x04\xdc\xea\xe5\x7c\x2a\x54\x95\x42\xea\xbd\x21\x6b\xf1\x39\x48\xd4\x1f\xfb\x94\x83\xfe\x29\x80\x1f\xc8\xc1\x78\x28\x40\xde\xeb\x3f\xb4\xda\x31\x92\x78\x5b\xca\x13\xed\x0a\x9e\xff\x57\xd6\x13\x6b\xaf\xbf\x9d\xec\x69\x7b\x83\x24\x47\xb2\xb6\xe7\x30\xfa\x7f\x99\x95\xba\xc6\xb7\x83\x2e\xaa\x09\x90\x5e\xe4\x9d\x46\x5a\x5e\xe4\x50\xf5\x2d\x1a\x6d\x36\x4c\x61\x81\x44\xe8\x86\xe8\xef\x63\x3d\xc7\x9d\x0a\xf8\x93\xd1\x6b\x3e\xed\xa0\xfe\xfe\xfd\x87\x59\xf2\xa0\xda\x19\x30\x17\x0d\xd1\x9e\xb7\x8f\x0d\x7a\x7b\x74\x51\x54\x03\x37\x5a\x95\xbd\xbc\xce\x01\x8b\xc1\xed\xb0\x8d\x89\x7b\xb7\x98\xa9\x5e\x7e\x86\xa5\x2a\xf3\xd9\xb8\xa4\xa1\x4b\x03\x71\xd6\x34\x98\xdc\xb2\x01\x62\x48\xeb\xd0\xbe\x80\x0e\x9f\x21\xd5\x49\xe5\xe0\xe7\xb4\x89\x5c\xa5\xcb\x72\x5a\x0c\xab\x27\xda\x8a\x8b\x12\x99\xbe\x38\xa4\x26\x09\x00\xae\x10\xdf\x5b\xab\xa1\x1a\xe2\xba\xb7\x17\x9d\xd8\x45\x39\x69\x42\x9c\xcc\x4d\x41\x60\x55\xf2\xbc\xb9\x3c\x1c\xac\x6d\x7e\x80\x4c\xf8\x12\xdf\x14\x62\xf2\x2e\xe9\xe8\x33\xa9\x76\x9e\x8e\x67\x75\x50\x40\x2c\x40\x94\xdf\x21\x2f\xd2\xc5\xfc\xc0\x9a\x72\xc7\xce\x00\x77\x51\x00\x73\x09\x0d\x0e\x63\xdb\x63\x7d\x43\xd4\xc2\x1f\x86\x19\xd3\x4d\xa5\xdb\x08\x03\x3f\x68\x6c\xe8\xb8\xa0\x82\x12\x22\xf9\x54\x34\xac\x4e\x6f\x70\x30\x94\xed\xde\xd6\xfb\x1b\x84\x6e\x97\x96\x50\x97\x9d\x3c\x77\x45\x3f\x40\xf7\xfe\xe7\xc3\xe8\x8a\x96\xfd\x1d\x70\x2e\x81\xc2\xa4\xf3\xf3\x75\x3c\x79\x64\x84\x2d\xfd\x9d\x39\x58\xa7\x43\xda\x06\x3d\x1d\x64\x8e\x51\xb2\x10\xa2\x8e\xd2\x48\x7f\x14\xd5\xf1\xbc\x6f\x33\x9b\x2d\xd1\x7a\x66\x1c\x39\x73\x6d\xa9\x9e\x4a\x4f\x07\x36\x03\x42\xd2\x37\xe3\x81\x3e\xa3\x99\x8d\x66\xeb\x31\xa2\xd7\x08\xaf\x06\x5c\x32\xb9\x27\xf7\x57\xc3\x7a\x80\x06\x60\x67\x4e\x97\x17\xba\x58\xf2\x80\xeb\x2a\xa4\x64\xfa\x74\x40\x21\x08\xa5\xd5\x66\x2e\x8d\x0f\xea\xf3\x29\x68\x7a"}, -{{0x97,0x2c,0x06,0x16,0x55,0x6e,0xf2,0x2c,0x21,0x48,0x68,0xfd,0xd8,0x22,0xc5,0x57,0x39,0xe1,0xf9,0x6a,0x93,0xae,0x83,0x51,0x2a,0xfd,0xa9,0xca,0x7a,0xa7,0x4c,0xd2,},{0x9e,0x1c,0x6d,0x41,0x07,0xf8,0xab,0x81,0x61,0xc5,0xdb,0x5b,0x88,0xa3,0x7c,0xa1,0xde,0x9f,0x4e,0x29,0x13,0x67,0xab,0xb1,0xef,0xc8,0x4f,0x83,0xf7,0x07,0x69,0x53,},{0x54,0xdd,0x06,0xfb,0xb3,0xd7,0xc6,0x3f,0x8c,0xda,0xf7,0x83,0xc2,0xd7,0xba,0xc1,0x6b,0x4c,0x82,0x6e,0x2d,0x1b,0x18,0x07,0xc8,0x4e,0x04,0x9f,0x64,0xe2,0x71,0xb2,0x1c,0xfa,0x3e,0x37,0xc3,0x44,0x26,0x02,0x87,0x80,0x5d,0x71,0x88,0x06,0xb6,0x2c,0x56,0xb4,0x7f,0x6d,0x5c,0x50,0x81,0x25,0xc9,0xfb,0x5d,0x5e,0xa3,0x5f,0xd5,0x01,},"\x86\x89\xe2\xf9\x5c\x8f\xd5\x0d\xc4\x46\x64\xa1\x8f\xb1\xa9\xf2\xc8\xf3\xee\x73\xc0\xf9\x58\x7e\xe2\x8b\xfa\x35\xc9\x23\x1c\x75\xbf\xd3\xd9\x53\x41\x74\xe5\xad\x3f\xa9\xf0\x92\xf2\x59\x94\x2a\x0f\xf0\xba\x2c\xa2\xcb\x59\x04\x3d\x19\x2c\xa8\xe3\xc8\x86\x9b\xed\xd2\x35\x4c\xbc\x5a\xc7\x82\xd7\x27\xc0\xb6\x94\x07\xf6\x8d\x13\x26\xdf\x65\xa6\x0c\x4d\x32\xf8\x7f\x19\xa1\x0f\x3d\x76\x5f\xf9\x23\x43\x4f\x55\x11\xd1\x34\xd3\x97\xc4\xfe\xf6\xbb\x19\x53\xab\xfc\xe6\x08\x27\xc3\x59\xaa\x4b\x54\xf9\x12\xaa\x8b\x17\xb8\x3d\xcc\x7e\x3b\xcb\xc5\x05\xba\x04\x6f\xe5\x7c\x16\xda\xcf\x4e\xe2\xfa\xd5\x38\xbc\x06\x81\x7c\x9b\x9d\x8d\xbc\x5f\x9d\x9b\xbf\x9f\x4a\x93\x4f\x14\xa4\x2c\x29\xe0\xe2\xf3\xa4\x9f\x46\xb2\x0e\xe7\x6c\xfe\x20\xde\xa1\xe9\x74\x50\xeb\x6a\x8f\xda\x04\x81\x68\xdd\x82\x78\x10\x20\x7f\x00\x5a\x3c\xaa\x93\xca\x11\xf4\xee\x60\x8a\x7a\x93\x55\x49\x43\x13\xae\xc8\xd7\x07\x5a\xfc\x94\xc7\xcc\xcc\x75\xc2\x31\x9b\xb4\x58\xc0\xce\x37\x3e\x9d\x00\x7f\x75\x3b\x33\xb5\x27\x93\xd5\x84\x96\xb2\xd2\x5c\xd1\xdc\xd7\x83\x2a\xac\x5d\xdb\x38\xf4\xdb\x19\xc4\x27\x21\x9e\x1a\x04\x20\xea\xd4\x7b\xa9\x5a\xb6\xd8\x9c\x65\x93\x90\x41\xcc\x73\x4c\x08\xeb\x6b\x47\x6c\xaf\x7f\xc7\x6c\x59\x8d\x94\x7f\xf4\x44\xb1\x07\x70\xf6\x29\x45\xae\x65\x04\x4f\x78\x09\x82\x99\xe2\x62\x6b\x63\x8a\x73\x28\xd1\xb7\xda\xa5\x88\x9e\x8d\xb9\x4b\xbf\xf2\xde\xd6\x2e\x14\x46\x37\x60\x22\x7c\x3f\x32\x6e\xd4\x93\x56\x5d\xdf\x0a\x17\x61\xb8\xe4\xbb\x7d\x24\x10\xfa\x0f\xdb\xf3\x56\x84\x39\x7e\xef\xea\x95\x89\x58\x89\xa0\xa9\xdf\xfc\x5e\x02\xc0\x92\x38\x3b\x7c\xe7\x4d\x2d\x90\x93\x99\x16\xf2\x6b\x71\xaf\xd2\x65\xf8\xbe\xc7\x4f\x0d\xe2\x47\xc9\x64\x39\x05\x58\x3d\xf3\xce\xe2\x35\x37\xd6\xb5\x68\xc8\x33\x8c\xe5\xfe\xe4\x2f\x7d\xd1\x5d\xad\x52\x47\xf0\x09\xac\xbf\xd5\xd7\x69\xb6\x36\x69\x59\xcd\x0a\xe1\x50\xf5\x8f\x7c\x80\xfa\x10\xd9\x89\xed\x90\x11\x93\x72\xe5\xfe\xa5\xda\x48\xa4\xe8\xea\x9c\x72\x78\x75\xdc\x4a\x20\x05\xb0\xdc\x2e\x3f\x69\x7c\x0c\xe0\xa4\xbd\xb2\xf7\x50\xc0\x4f\xbc\x0c\x27\xd0\x2d\xd8\x28\x6e\x54\xc9\xc3\x95\x9b\x6f\xfb\xdb\x1d\xe2\xaf\xfe\x9e\x78\x26\x51\xe5\x16\x8a\x50\x0a\xfe\xd0\x37\xb3\xe1\x79\x0d\xdd\x59\x38\x51\xa6\xa6\xcc\xca\x9f\xff\xb4\xa9\x9e\x27\xdf\x43\x81\x88\x71\x53\x6a\xb0\x4f\x14\xa0\x6a\x1c\x7c\xb4\x7b\xed\x62\x41\xce\x74\x30\xad\x3e\x64\x0a\x72\x67\x52\xfa\x06\xa9"}, -{{0xe0,0x40,0x5d,0x37,0x89,0x3e,0x89,0xf5,0x38,0x11,0xd6,0xd4,0x46,0xe1,0xf1,0x93,0xf5,0x1a,0xfa,0x1b,0xbb,0xa7,0x25,0xf9,0x5e,0xb4,0x80,0x33,0x42,0x4a,0x25,0x09,},{0x45,0x10,0x4d,0x59,0x5e,0x44,0x3e,0x8c,0xe6,0x54,0xde,0x9d,0x65,0x50,0x54,0xbf,0x0a,0x99,0xd3,0x56,0x13,0xd7,0x7d,0x57,0x45,0x4c,0xa2,0xd1,0xc8,0x99,0xb5,0x17,},{0x77,0xdd,0xd4,0x91,0xca,0x66,0x2e,0xbf,0xfb,0x12,0xf7,0xf4,0x92,0xd7,0xfb,0xc1,0xa1,0xb4,0x47,0xf6,0xc8,0x59,0x98,0xf2,0xf7,0xcc,0x9a,0xdc,0xe6,0x7d,0xe6,0x3b,0x6e,0xeb,0xd0,0x81,0x17,0x84,0x5a,0x03,0x02,0xf7,0x34,0x97,0x14,0xba,0x9d,0xb2,0xaf,0x58,0x04,0x8b,0x85,0x83,0x7d,0x76,0x60,0xec,0x3d,0xeb,0xee,0xe2,0xd0,0x0f,},"\xdf\x58\xc4\xfd\x07\x02\xa2\x0f\xaf\xa3\xd1\xd4\xfe\x7d\x85\x93\x8b\x12\x0f\xc1\x1e\x8d\x41\xb6\x01\xf0\xe6\x0e\x42\x23\x6a\x49\xf1\x26\x81\x3b\xd5\x12\xee\x71\x35\x90\x61\xe1\x3e\xb3\x14\xd4\x17\xf5\x6d\x6d\x56\x02\x85\xfa\x89\x91\x21\x32\x84\xc4\x2b\xc2\xce\xf2\xdc\x93\x7b\xdc\x0b\x5e\x9d\xc2\x26\x9a\xfa\xb3\x2d\xb3\x0e\x68\x49\x85\x59\x51\xcf\xbc\x53\xec\xfa\x01\x64\x38\x63\xe0\x32\x89\x95\xfe\x85\x0c\x0d\xb5\x54\x21\xbf\xa5\x64\x60\x1b\x8c\x9d\xb7\x55\x2c\x7e\x6a\xa7\xad\xfa\x15\xa5\x80\x21\xa8\x42\x66\xe9\x59\x5c\x65\xfc\xa4\xa1\x5f\xa7\x0f\x55\xf5\xd2\x12\xc9\xe2\x77\xff\xb8\x30\xf4\xca\xd1\x86\x1f\x3f\x49\x5a\x9d\x67\x2f\x56\x91\x31\x06\x39\xc1\x2d\xcd\x07\xe3\xef\x17\xa2\x37\x50\xbc\xb4\x6b\x7a\xd7\xea\xc4\x62\xeb\x51\x22\x25\xf3\xbe\x7e\x32\xf8\xf4\x98\x7a\x11\xdf\x34\x11\x66\x06\x2b\x43\xc6\x3a\xb8\x58\xa6\x00\x49\x76\x67\xfb\xb8\x8e\x93\xc7\xe2\xe0\xaa\xb4\x1c\x09\xc0\x23\xeb\x90\x2e\xc3\xba\xf6\x79\xe2\x5b\x96\xe1\x06\x92\x1a\x91\x4f\xd5\xde\x20\x0a\x47\x88\x9d\xe2\x3e\x7b\x65\xd0\xcc\xdf\x0c\x29\x03\x64\x67\xa1\x21\x0c\x00\x30\x30\x9a\x2d\x04\xec\x25\x6d\x5a\x4d\x8b\x97\xd4\x6a\x3e\x15\xf3\x45\xb6\x67\x17\x08\x03\xcd\xac\xf6\xcb\x48\xad\xd0\xa1\x34\x62\xdd\x30\xfa\x06\x2b\xd4\x56\x66\x41\xda\x07\xd7\xf6\x1e\x06\x36\x86\xed\xd9\x6b\xfe\x8f\x97\xb9\x86\xb7\xc0\xe4\x42\x49\xcd\x2d\x73\x17\x47\x29\x99\xb8\xee\x4e\xa8\x0c\x90\x2f\x3b\x18\x89\x36\x71\x2e\x89\xd8\xbf\x02\xce\x8a\xe7\x7b\x6b\x31\xab\xb0\x63\x20\x65\x45\x5d\xdd\x9f\x9d\x1c\xd9\x53\xa4\xa4\x9a\xac\x1a\x15\x16\x9e\x68\x7d\x4f\xd3\xf7\xc2\xed\xfb\x3a\xab\xc3\xb6\x61\x55\xf7\xd3\x15\xf8\xa2\x94\xfa\xdd\xff\xdb\x49\x51\x36\x7a\x0c\xb8\x70\x75\x9e\x85\xa8\x38\xaf\x66\xba\x3f\xc1\x03\xda\x2b\xab\xc3\xf3\x81\x69\x6e\xf8\x88\x2d\x85\xa8\x27\x8d\x5f\xac\x3a\x72\xf1\x6e\xb1\x19\xee\x99\x00\xb1\xfd\x98\x6c\x2a\x9f\x94\xee\xd8\xe0\xd4\xf2\x73\x69\x7e\x43\x63\xa9\x75\xff\x6a\x7b\x80\xd5\xb4\xec\x53\x55\xbf\x63\xb4\x2b\x71\xcd\x48\x42\x40\x1d\x38\xb5\xe0\x0c\xc9\x7b\xfd\xa4\x0e\x45\x66\x53\x68\x3b\xc8\xe6\xda\xde\x7d\xcf\x98\x5a\x97\xb0\xb5\x77\x6c\x4d\x72\xca\x13\xa1\x47\x4e\x4e\xb2\xec\xcf\xcd\x42\x87\x86\xdd\xd0\x24\x6d\x73\xa6\x37\x7a\x79\xcb\x8d\xa7\x20\xe2\x26\xc1\x94\x89\xbd\x10\xce\xdd\xe7\x4b\x49\xfa\xc2\xcf\xa2\x07\x12\x9c\x6a\x10\x8a\xa1\x64\xbe\x9d\x80\x9c\x4d\x31\x14\x73\x60"}, -{{0x57,0x56,0xe7,0x52,0xdf,0xf6,0x9e,0x3e,0xed,0x84,0x8e,0x4a,0x49,0xc7,0xa8,0xba,0xca,0x12,0x15,0x4f,0x94,0x31,0xde,0xc3,0x56,0x26,0xef,0x8d,0x75,0xa4,0x45,0x14,},{0x59,0x10,0xef,0x00,0xa5,0xb3,0x54,0x14,0x3c,0x46,0x56,0x1d,0xa6,0x2c,0x41,0xaa,0x13,0xd2,0x9c,0x18,0xdc,0x61,0x53,0xbf,0x8e,0x50,0x2e,0x01,0x14,0x00,0x77,0x28,},{0x81,0x57,0xd8,0x33,0x4d,0xed,0x1a,0x32,0x69,0x9b,0x35,0x0a,0xc0,0xd4,0x12,0x00,0x28,0xcd,0x8e,0xf8,0x18,0x94,0x48,0x93,0x48,0x50,0xe5,0x0e,0xe4,0x99,0x9d,0x8f,0xa2,0xcd,0x25,0x76,0x46,0xd9,0x2f,0xba,0x5d,0x66,0x2a,0x82,0x3e,0x62,0x20,0x8a,0xb4,0xfb,0xe0,0x17,0x14,0xa8,0x48,0xa0,0xb9,0x0b,0x55,0xad,0xcd,0x24,0x69,0x02,},"\xeb\x21\x90\xa3\x21\x9c\x79\x2b\x66\x66\xb2\x75\x27\x33\xad\x9f\x86\xfc\x39\x01\x55\xc4\xb4\x38\xbe\x19\x69\x59\x38\x3b\x25\xf3\xa7\x49\x53\x0d\x5a\x4b\x15\xeb\xe2\xc1\x8d\x99\x17\x8e\x6d\x45\xbb\x4a\xa2\x12\x0f\x95\xa3\x52\xe0\x40\x6c\x63\xac\x86\x72\x48\xd9\xef\xba\x12\x42\x31\x06\x48\x73\xc8\x2f\xe9\x95\xdd\x03\x1c\x7c\xbc\x7d\x15\xec\x19\x1f\xbb\x6c\x47\x4d\xc4\xc7\x77\xe8\xf4\x57\x84\x1e\xb4\x62\x48\x41\xc1\x52\xd1\x5e\xde\x26\xe7\x84\x79\xa6\xa2\x5f\xfa\x33\x55\x63\xf1\x06\x4e\xf0\x95\x58\xb9\x10\xe2\x60\x84\x18\x82\x0f\x49\x55\x4b\x67\x0c\x6b\xab\x34\xd1\xd6\x09\x84\xde\xa5\x0e\xd6\xa3\x75\xf4\x5a\x74\xbe\xad\xfb\x04\xbd\x93\x00\xbd\x59\x4e\x2e\x20\xea\x5d\x30\x52\xbb\x7d\xdc\x51\xa9\x49\xa0\x04\x79\x72\x68\x2e\xbe\x66\xd3\x8a\xac\x62\x92\x72\x70\xde\x42\x15\x0d\x58\x22\x1d\x03\xb8\xac\xe3\x58\x99\x33\x48\x7b\xf2\x3d\x29\xc5\xc2\xc8\x43\xae\xfa\x2e\x1c\xa2\x2f\x9d\x16\x80\xf8\x0c\x76\x6d\x14\x3c\xe5\xec\xef\x25\x3a\x74\x5c\xb7\x1e\x72\xf6\x50\x4a\xd9\x11\xf7\xcb\x4a\x81\x9c\xd0\x74\x86\x3a\x92\x70\x69\x29\xa3\x14\x2f\x8d\xb7\xac\x16\x41\x02\xac\x2c\xa0\xd2\xe1\x9a\x72\x5e\x1b\x5f\x81\xf4\x43\xc7\x3e\x04\x84\xf2\x6a\x45\xa3\xae\xf8\x4f\x1f\x3f\xa0\x4a\x4a\xc6\x95\xd2\xda\xb6\xef\xba\x45\x6a\x28\x1a\x39\x73\xcc\x18\x6e\x68\x0a\x66\xdf\x52\x1a\x4d\x1f\x9e\xdf\x4d\xfb\x27\x4a\x42\x70\x97\xbf\x86\x32\x81\xcf\xb0\xed\x80\xf8\xd7\x67\x66\x38\xd6\xcd\xac\x93\x78\x43\xef\xbc\xfc\xe9\x1d\xe1\xdf\x6c\x52\xb5\x94\x57\x1b\x93\x15\x60\x0e\x4b\x65\x52\xde\xfb\x84\x37\xa8\x07\xba\x21\x29\x8e\x3d\x97\x22\x12\xba\x31\x46\x92\x91\x7f\x40\x07\x53\x11\xac\xd0\x09\x39\x52\x41\xb9\xf1\xb2\x56\xc5\x15\x73\x5d\xc6\x74\xf8\xe8\x66\xd1\xee\xb4\xc3\x28\x54\x8a\xee\x71\x23\x1c\x4c\x9d\x5b\xd2\x2e\x39\xde\x88\xd1\x9f\xab\xf4\x9f\x0b\x98\x69\xcb\xf8\x35\x21\x4b\x15\x52\x2a\x93\xd3\xa5\x00\x7b\x11\xf0\xb5\x0e\x52\x28\xd4\xee\xbb\x45\x71\xb3\x5d\xa8\x4f\x4f\x68\x7e\x3f\x43\x79\x3d\x54\xf3\x82\x5b\x37\xa5\x09\xea\x56\x4b\xdf\x21\x7f\xf4\xad\xf6\x84\x7b\xbe\xa4\x31\x6a\x1d\xbc\xc7\x44\x8e\xcd\x53\x63\xea\xab\xc1\x28\xde\xcf\x05\x4e\xe1\xa0\xee\x2d\x87\x19\x79\xf8\xa6\x3b\x26\x92\xb0\x9f\x6e\x98\x6a\x13\x8e\x7f\x68\xf6\x0a\xa4\x26\xa1\xc9\xb0\x1a\x49\x02\xe1\x3b\x17\xbc\x83\x12\x41\x0c\x28\xbe\xd2\x9b\x60\x1b\x0f\xc9\xf3\xbc\x2d\x22\x3f\x87\x52\x51\x10\x0f\x86\x9c\x6b\x58\x44"}, -{{0xb9,0x04,0xac,0xb1,0x9e,0x5c,0xf8,0x72,0xd3,0x64,0x0c,0xd1,0x8d,0xdf,0x3c,0x0b,0x66,0x57,0xe0,0x11,0x7c,0xe6,0x59,0xdb,0xf5,0x02,0x59,0x01,0x5d,0x3f,0xbf,0x32,},{0xe0,0x4a,0x8a,0xa5,0x6d,0x18,0x18,0x48,0x3b,0x10,0xd0,0xa7,0xc9,0x19,0xe1,0xd5,0xd8,0x00,0x1e,0x35,0x51,0x0e,0x1e,0xc6,0x2f,0x71,0x14,0xdb,0xe8,0x1a,0xe0,0xbe,},{0x9a,0xaf,0x8a,0xc9,0x71,0x40,0xd5,0x50,0x8d,0x58,0xf5,0xac,0x82,0xb7,0xfd,0x47,0xe6,0xb1,0xf6,0x8a,0x7c,0x78,0xa2,0xac,0x06,0xf0,0x41,0x6e,0xf8,0xe9,0x91,0x95,0x3f,0x62,0xc4,0x7f,0xd5,0xfb,0xc6,0xc1,0xe0,0x1b,0xae,0x1c,0x92,0xa3,0x3e,0xf5,0x2b,0x7e,0xfa,0x5f,0x17,0xbb,0x86,0x33,0xbd,0xc1,0xae,0xeb,0xce,0x31,0x8f,0x0f,},"\x83\xf4\x12\x4d\x5a\xf9\x55\x13\x9b\x1b\xc5\x44\x1e\x97\xc5\xfa\xc4\x91\xb4\xea\x91\x14\x07\xe1\x54\x20\xa0\x34\x7e\xd7\xfa\x1f\x88\x19\xe3\x6c\x8e\xd5\x74\x0c\x99\xd4\x50\x5a\x78\xb6\x19\xd5\x60\x74\x9a\xf5\x0b\x05\x73\x51\x08\x16\xd6\x13\x22\xcd\xa9\x76\xa5\xd4\xca\x32\x05\xf5\xf0\xe6\x0e\x75\x9a\x5d\xf1\xa0\xbd\xf3\x6d\xfe\x97\x17\x90\x6a\xc5\x7c\xbf\xc9\x70\xab\x43\xb6\xfa\x18\xe6\xc0\x00\x6c\x84\xfc\x72\x54\x47\x0a\x0b\x77\x47\x27\xbf\x5f\x8e\x67\x94\x23\xa5\x31\xe4\x1c\xb5\x31\x0f\x9b\xcb\xf5\xa5\x44\x5e\xbc\x39\xfb\xd9\x09\xce\x11\xe9\x7b\xc2\xf6\x6a\x4a\x1b\xb6\xc2\xf1\x67\xf2\xc6\xe8\x0e\xb9\xb8\xb7\x2d\xf3\xe8\xcf\xd4\xe5\x14\x48\xdc\x14\xc0\xb8\x37\xf2\x94\x96\x93\xd1\xd0\x54\xc8\xf9\x5b\xff\x7f\x1e\x36\x45\x67\xd0\x34\xf2\x22\x3e\x15\x94\x77\x2a\x43\xdc\xfe\x05\x97\xfd\x6d\x13\x3b\x3f\x2e\x96\xff\xc5\x66\x7d\xd5\x92\x8f\x23\xec\x3c\x75\x0f\x84\x59\x93\xa3\x4e\x97\x76\x15\x9a\x68\x30\xd6\xfd\x90\x13\xee\x7a\xea\xa1\xfc\xcd\x69\xb9\x6d\xf2\x84\x70\x4f\xd0\x88\x88\xb1\x5b\x64\xe2\xe9\x0d\x57\x8c\x5c\xfc\x0f\x95\x69\x3f\x6a\xb6\x5c\x69\x47\x44\x6a\x85\x7c\x02\x9c\x7c\xa6\x60\x80\xb7\x54\xc7\x73\x4b\x78\x99\x8a\xbe\x9b\x7c\xc6\xef\xd0\x9a\x44\x18\x19\x4d\x88\xb3\x4e\xc6\xc3\x3a\xf6\x30\xdb\x81\xde\x5b\x99\xfe\x65\xaa\xc8\xb7\x33\x62\x37\x91\x19\xc7\x00\xd1\x07\xed\xfc\x19\xf2\x70\x76\x04\x68\xee\x8e\x5f\x15\x5d\x9a\x34\x7e\x57\xb5\x93\x0f\x32\x7a\x8d\x11\xc6\x67\x4d\xdd\x02\x0f\x9e\x7d\x9b\x76\x1d\xba\x5b\x83\xa8\x73\x02\xf1\x83\x3e\x5a\xbd\x49\x52\x6d\x66\x39\x1e\x5b\xf0\xe3\x5b\x44\x53\xd6\x30\xbf\x7d\x0a\xdb\xfe\x50\x1a\xef\x81\xe6\xc5\x93\x8f\x92\xcb\x75\x2f\x5f\x14\xd2\x80\x6f\x90\xae\x15\x46\x05\x1c\xcc\x7f\x91\x3c\x5d\x6a\x38\xff\x3b\x7b\x9a\x23\x66\x2e\xf1\xf0\x08\x08\xed\xb2\xfa\x31\xec\xba\x5c\x8d\x33\x87\xe8\x75\x41\xcd\x06\x16\xed\xbf\x3a\xaa\x35\xa5\x37\x92\x28\x61\xf4\x4c\xbd\x9f\x99\x2b\x82\x46\xd9\xc6\x4c\x41\x98\x81\x70\x1a\xb4\x3f\x7f\xd4\x64\x21\x0d\x80\x2b\xa6\x56\xd9\x5c\x0f\x24\xa3\x45\x99\xb2\x0b\x1e\xc2\x00\x11\x48\x5c\xfc\xb3\x18\x6b\x7b\xcf\x69\xd7\x45\x81\xa7\xa3\xee\xd6\x13\x4c\x4e\xec\xd6\x55\x74\xa4\x32\x0d\x9c\x57\xa8\x49\xc4\xe7\x8c\x8a\x5c\xe8\x25\x05\x00\x4a\x54\xf1\x9d\x4b\xdc\x82\x23\x40\x1b\x34\x94\x6b\x7d\x66\xe4\x7e\x63\xcf\x9d\x0f\x57\xd0\x94\x54\x91\x38\x4b\xc6\x86\x8c\x4b\x47\x86\x90\xe5\x50\x02\x1d\xf1"}, -{{0x8a,0x35,0x01,0xb7,0x69,0x53,0x60,0x3c,0x90,0x33,0xe3,0xbc,0xbf,0x3e,0xc3,0x78,0xd2,0x57,0x01,0x1a,0x6c,0x50,0xb8,0x97,0x62,0xd4,0x91,0xea,0xa7,0x2c,0x5e,0x0d,},{0x77,0x8f,0x20,0x19,0xdc,0xd8,0xdb,0xb8,0x6c,0x67,0x37,0xcc,0x8d,0xc1,0x90,0xc5,0xa0,0x4c,0x50,0xb5,0xbf,0x45,0x88,0xbc,0x29,0xfa,0x2a,0x47,0xaf,0x25,0x26,0x72,},{0xa8,0xa3,0x09,0xba,0x52,0x12,0x5e,0x76,0xa4,0xa6,0x1e,0xb4,0x3f,0xd4,0x13,0x5c,0x41,0xab,0x11,0x79,0x9b,0x91,0xcc,0x54,0xff,0xc9,0xc6,0xa2,0x0f,0x05,0x0c,0xc5,0x95,0xb2,0x81,0x43,0xc8,0x74,0xbd,0xb9,0x28,0xbe,0xed,0x26,0x1d,0x9c,0x0f,0x12,0xaa,0x19,0x2e,0x66,0x40,0xbf,0xda,0xd5,0x4b,0xa0,0xd4,0x78,0x42,0x6b,0xce,0x09,},"\xe6\x09\xf1\x22\x4a\x6a\x45\x11\x40\xcb\xc0\x25\x4d\x43\x2c\xe5\xfd\xdd\x08\xa8\xe9\x12\xf8\x1c\x41\x2f\xdf\xd5\x18\x2f\xf6\xac\x2f\x13\xc5\x76\xc8\x14\x5b\x15\xf2\x5b\x40\x9d\x85\x3f\x91\x44\x09\xe4\xe0\x2c\xef\xc3\x9d\x9b\xef\x4a\x2a\x06\x04\x98\x57\x0b\x2d\x3a\x28\x38\xc9\xb0\xb8\xe3\xaf\x4f\xc3\x7e\x19\x15\xf8\x04\xa8\x01\x88\x58\x5b\x30\xb6\x8a\x3f\xfb\x2e\x96\x0c\x73\x20\xe8\x27\xd2\xfe\x36\xe6\xa3\x28\xcc\x6e\x78\x06\x34\x8a\xdb\x0b\x77\x3b\x78\x4d\xe5\x29\xbb\x6f\x64\x75\x1b\x21\x05\x85\x94\x94\xfd\x49\xdb\x0b\xc7\xf6\x2d\xf4\x6b\x9d\x7c\xe6\x76\x97\x5c\xc5\xf4\x38\x56\x49\x84\x36\x81\x2e\x04\xf2\x6f\xb8\xb8\xab\x7e\xba\x12\xf1\xd5\x67\x22\xeb\x82\xeb\xfa\xfa\x47\x35\x97\x7a\x26\x68\x1c\xb0\x3f\xa4\xbc\x69\x51\xab\x9c\xbd\xf7\x87\xe3\x27\x8f\x2f\x57\xf2\x9e\x12\x09\x5f\x8c\xa2\xa1\x78\xcf\xa7\x57\x13\x37\xf0\x27\x42\x37\x66\x9f\x97\x65\x7d\x4b\xad\xb3\x94\x36\xd7\x86\x49\x25\x80\xfd\x55\xd8\x6b\xe3\xa0\xcd\x17\xd1\x60\x57\x01\x7b\xaa\xae\xa0\x0c\x1e\x14\x55\x21\x59\xbc\xab\xc0\xe6\x66\xba\xd3\x41\x8e\x4e\xc1\x3b\xfe\x16\x3b\xe2\x56\xf0\xc8\x9b\xc2\x34\x4a\x8d\xdf\x99\xca\x81\x60\xb1\x89\x87\x5a\xd3\x22\xd9\x0f\x58\x13\x25\x28\x1d\x53\x89\x96\x5c\x0a\x7b\x7b\xca\xe2\x29\x4a\x3c\xbe\x35\xa4\xe4\xe8\x3b\x54\xc4\x27\x63\x53\x96\x0f\xad\x11\x85\x32\xd4\x9b\x70\x76\xf2\x5a\xd1\x90\xab\x56\x94\x91\x4f\x71\x08\xb0\xab\x69\x69\xa1\x91\x28\xfb\x0a\xef\x00\xe6\x5a\x04\xfc\x83\x2d\x07\x69\x61\x67\xb9\x34\x2b\x35\x5e\xc5\x77\x37\xca\x37\xcb\xff\x3b\xb3\x19\x31\xcb\x58\x71\x2a\x4c\x46\x89\x52\xc6\x45\x9d\x56\x7a\x26\xe7\x95\x01\xe4\xe3\x1b\x1b\x09\x53\x53\x76\x32\x02\x9e\x9b\x49\x0f\x72\xe5\xa6\xe0\x57\xdd\xb4\xb3\x17\x56\xfd\x97\x04\x21\x8b\x1b\x8f\x4d\xcb\x54\x30\xc0\x25\x04\x2f\x47\x16\x9b\xfc\x7c\x80\xd7\x1c\xab\x8c\xa0\x7f\x34\x0a\xfa\x00\x8a\xbb\xe2\xe3\xa0\xab\xe1\x41\xda\x8d\x41\xca\x6b\xd6\x9d\x36\xfd\xb1\x1a\x41\xce\x0b\x72\xfa\xbc\x00\xd9\x7e\xa6\x05\x27\x00\x10\xb2\x59\xdf\x8e\x10\xdd\x22\xdc\x17\xc1\x39\x90\xa0\x5f\x02\x33\xe3\xca\x85\x6b\x40\x97\x1c\xb3\xe2\x1c\x8b\x39\x50\xb1\x3f\xc8\x4e\x1f\x26\x6c\x2a\x6f\xbe\xce\x88\xd5\x97\x25\xc3\xcf\xb2\x22\x5d\xbc\x1e\xe9\x5b\x68\x6d\xb7\x04\xfc\x93\x7b\x76\x6f\x0a\x9b\xfe\x95\xa4\x2b\x90\x10\xf1\x22\x9c\x61\x0d\x7e\xde\x09\x57\x12\xc8\xf0\xf1\xfb\x00\x47\xc0\x40\xa8\x70\x30\x6c\xd8\xdc\x74\xc4\xda\x51\xbf"}, -{{0x42,0xb5,0x36,0x52,0xd0,0x8b,0x5d,0x76,0x6e,0x66,0xad,0x8f,0x3e,0xbf,0x69,0x3c,0xfd,0x77,0x90,0x7c,0xad,0xd9,0x8b,0x54,0x66,0xdf,0x77,0xdf,0xa2,0xc6,0x37,0xad,},{0x88,0x46,0x3b,0xb8,0xa4,0xb6,0x38,0x8d,0x92,0x4c,0xb8,0x62,0x09,0x83,0x41,0x95,0x43,0x5d,0x79,0xd7,0x7f,0x8c,0x02,0xf4,0x6b,0xbd,0x16,0xd8,0x2e,0xfe,0x42,0xb3,},{0x30,0xc4,0xb9,0x9e,0x68,0xec,0x33,0x51,0x30,0x8f,0xbc,0x76,0xd9,0xca,0xf0,0xaf,0x62,0x21,0xb5,0x96,0xb7,0x01,0x7f,0xe1,0x0c,0xc6,0x33,0x02,0x3b,0xa9,0x7f,0x02,0x38,0x96,0xfe,0x32,0x2b,0xaa,0x34,0x76,0x60,0x61,0x0e,0x05,0xfa,0x49,0x3d,0x21,0x8f,0xa3,0x60,0xf1,0x8d,0x93,0xe2,0x75,0xd1,0xef,0xf6,0x66,0xb6,0x3d,0xb2,0x04,},"\x9e\xe9\x13\xc7\x4e\xe3\xc5\xe8\xc9\x0d\x64\xb8\xae\x3a\x60\x04\x9f\xc7\x65\xe1\x76\x06\x0b\xcd\x1c\xd0\x9f\x0e\xda\x60\xbf\x23\xba\xdb\x8a\x1c\xaa\xc3\xd6\x6e\xbc\x52\x68\x14\x6e\xe4\xa5\x4e\x1e\xb2\x31\xed\x25\xef\xf9\x5b\x90\xa6\xe9\x83\x37\xa5\x40\xa3\xf4\x84\x49\x79\x4a\x48\x73\xbf\xc2\xe8\x47\x28\x96\x6b\xb7\xc6\xff\x67\x6a\x2f\xf5\x73\x11\xc1\xc2\x5e\x15\xfb\xf3\xd4\x0e\x9f\x25\xab\x5d\xb9\x1f\xdd\xb7\xa0\xae\x43\x6c\x8e\xc0\x70\x75\x4b\x6d\x74\x3a\xa1\xd6\x04\x8f\xb5\xbd\x7f\x5b\x8e\x4c\xca\xd2\x03\x28\x38\x95\x30\xf1\x13\x74\xa4\x89\xb1\xd5\x05\x31\xa3\x9c\x9b\x32\xb4\x03\x69\x62\x60\x06\xd2\x64\xa9\x9e\xec\x4f\xac\x13\x41\xf4\xe7\x46\x79\x45\x7b\x41\x8e\x6b\xbf\xba\x23\x3f\x1c\xa1\x58\xf7\xb2\x9d\x40\xd5\x03\x01\xf9\xd9\x25\x36\xfd\xc5\xc2\x3f\xe5\xde\xe4\xd6\xdf\x0e\xbf\x13\xdf\xa3\x75\x4a\x14\xc8\x56\x00\x9a\xde\xa1\xdd\xa4\x09\x30\x4c\x1f\x60\xd2\x53\x30\xfb\x10\x95\x79\x47\xa0\x05\x08\xf2\xfd\x76\x42\x2e\xac\x69\x4c\xc3\x9f\xa8\xae\x7f\xcc\x77\xa0\x2f\xd9\xee\x5f\x91\x0d\x93\xe8\xaa\xc6\x8f\x14\x5d\xd8\x78\x87\x6b\xa8\xed\xa0\xa4\x9f\xcb\x20\x9c\x34\xea\x22\x0d\x4d\x06\x05\x54\x6f\xc4\xa8\x09\xba\xf0\x10\xd5\x33\xe4\x5d\x17\xb0\xe1\x6a\x46\xe9\x1e\xa6\xfe\xc2\xcd\xc5\xa8\xb3\xec\x50\x14\xb2\x5e\x92\xd8\xe5\xc9\x28\xab\x06\x99\x3d\x4f\xe2\x3a\xc8\xd4\x5c\x89\x03\x78\xdd\x13\x3f\x00\xed\xb9\x37\xc0\x71\xf7\x5c\xfc\x13\xa4\x02\xe3\xe4\x29\xa8\x48\x65\x2a\x17\x5c\x9b\x6f\x6e\xac\x86\xf6\x18\x8a\x44\x48\xa9\x6c\xe2\x87\x2e\x5f\x65\xf9\xbd\xb8\x71\x66\xc9\xb8\x7a\x7e\x95\x8e\x80\xbb\x65\x66\xe3\xfc\xf8\x71\x19\x0c\xf4\xa8\x67\xe6\x12\xcf\xc1\xe4\x37\x1d\x2b\x73\xd2\xa0\xad\x0a\xa4\x00\xba\x69\xe6\x63\x36\x23\x3b\x0f\x3c\x52\xb8\xa6\x8b\xca\x05\x12\x56\x01\x25\x50\x46\xe6\xf4\x9d\x68\x8d\x2d\xb8\x5c\x7b\x82\x12\x70\x51\x6e\x3c\x06\x13\xf3\xf2\x3f\x9c\x57\xcb\x4c\x87\x14\x28\x5c\xdf\x95\xe1\x06\xa3\xb5\xaf\xca\xeb\x81\xb7\x2f\x34\x3e\x87\xbd\x92\xf1\x58\x1d\xcf\x9a\xa9\x0a\x02\x4f\xa4\xa1\x04\x80\x59\xe3\x0d\xe8\xff\x0d\x16\x79\x4d\xcd\x74\x5d\x2b\x2d\x53\x4c\x52\x0f\x82\x78\x53\x86\x74\xa9\x34\xc6\xf1\x4a\x84\x28\xe3\xda\x01\x8a\x36\xe4\x5a\xa5\x82\x7c\xf4\xb1\x52\x84\x34\x6f\xd6\x93\x63\x14\x92\x19\xbb\x0d\x1b\xc9\x27\xd8\xd1\x93\xc4\x82\x69\x2f\x97\xdc\x88\xd8\xed\x33\x7d\x0c\x9d\xc9\x9c\x7a\x5e\x11\x1d\xce\xd4\x22\x50\xd5\x80\xe2\x06\x92\xbb\x7b\x88"}, -{{0x14,0xcf,0xe0,0x0f,0xa7,0x19,0x0a,0xe8,0x10,0x88,0x8a,0xe2,0xbb,0xd0,0xff,0x64,0x12,0xcf,0x1f,0xd4,0x08,0xa3,0x08,0x29,0x43,0x83,0xa1,0x94,0x53,0xb5,0x90,0x73,},{0x4e,0x61,0xaf,0xe8,0xc1,0x74,0xb6,0xee,0x1a,0x29,0xfa,0x09,0xcf,0x87,0xb4,0x00,0x81,0x39,0xf1,0x07,0x0b,0xc8,0x53,0x1b,0x6d,0x06,0xf5,0x4c,0x95,0x62,0xa4,0xf3,},{0xf7,0x85,0xa4,0x6f,0x69,0xbb,0xd0,0x99,0xfa,0x01,0x11,0x24,0xba,0x90,0x32,0xc1,0x89,0x74,0x2c,0x9e,0x00,0x1d,0xbb,0x87,0x81,0xd8,0x22,0x33,0x45,0xa9,0x56,0x9d,0xc1,0x44,0xca,0x69,0x4d,0x90,0x24,0x5e,0x0e,0x51,0x3e,0x88,0xab,0x02,0x3f,0x7f,0x0f,0x99,0xb7,0x41,0x61,0x59,0x75,0x8d,0xd0,0x34,0xe7,0xa8,0x9c,0xff,0x36,0x00,},"\xbc\x66\xf8\x01\xda\xa8\x29\x85\x8e\x74\x02\x93\xd4\xd2\x18\x7b\x8e\x1a\x5a\xfb\xa5\xfd\x67\xb1\x09\x56\xc6\x53\x46\xac\xa9\x44\x29\xd3\x2e\x4c\xfb\x35\x84\xab\x0e\x00\x5d\x0d\xd7\x42\x78\x1d\x47\xe8\x94\x47\xc4\xe1\xd8\x1b\xf7\xe6\x15\x4f\x8f\x73\xaf\x03\x36\x1a\xd5\x6e\xa3\xc0\x60\x00\x75\x4b\x9f\x32\x7d\x4e\xde\xac\xc4\xd3\x48\xaf\xb5\x48\x23\xe1\xc9\xd4\x9c\xd8\xff\x2b\x19\xf4\x20\x21\xb4\x0d\x58\x0c\x39\xce\x3d\x24\x36\x61\xb8\x54\x21\xfe\xc9\x15\xba\x9d\xd2\x76\x2f\x85\x0b\xd2\x08\xfd\xbf\x20\xff\xab\xa5\x6a\x46\x86\x60\xf1\x7c\x00\xfb\x1c\x0f\x4e\x85\x27\xa5\x09\xdd\x4e\xec\x13\x36\x0c\xf6\xe3\xca\xc5\x42\xb8\x75\x18\x2f\x2a\x7c\xe7\xbe\x0a\x33\x30\x2f\xe2\x6d\x36\x29\x62\x93\x84\xe3\x5c\x06\x78\x9d\xe6\x34\xe9\x0e\x96\x4f\xbd\xa8\xcb\xba\x98\x11\x1e\x22\xe8\xd0\x76\x26\x84\x26\x6a\xab\x76\xae\xba\x4a\x38\x07\x78\x69\x68\x14\xa1\xe3\x11\x94\x3c\xb3\x50\x58\x92\x64\x0c\x44\xe3\xaa\xc4\x53\x0c\x50\xac\x60\x4a\x8d\x2c\xcc\x7c\xea\xbf\xfe\xa4\xaa\x3d\x7f\x48\xa6\x6d\xcd\x75\x88\xb8\x02\x09\xdb\xc1\x73\xf0\xc6\x63\xe8\xfc\x87\xa3\x6e\x89\x2e\xc9\xa3\xff\x8f\x60\xd2\xe0\xd8\x70\x4e\x5b\x6c\xbb\x87\x32\x75\x15\x1a\xd4\xcc\x00\x57\x16\x50\x31\x90\x50\x39\x65\x1c\xa1\x0a\x95\xc6\xfd\xa3\xb2\x78\x27\xa6\x57\xef\x9a\x5f\xc3\xeb\x5b\x53\xca\xc6\x1d\xda\xf5\xa4\x17\x04\xc8\x78\x57\x0c\xbc\x3c\x41\xc4\x75\xb1\x17\xc0\x5e\xab\x0b\xb1\x96\xbc\xb7\xc4\x33\x34\xde\xbd\x64\xb9\xe3\x74\x50\xd2\x3f\x5c\x10\x16\x1e\xc5\xab\x4f\xcc\xd7\xcf\x30\x8e\x2a\x99\x95\xcc\x9e\x57\x8b\x85\xe8\x28\x5a\x52\x08\xb9\xef\xd4\x2a\xf9\xcf\x2a\xc2\xb3\xb7\x46\x42\x54\x88\x9a\x21\x87\x31\x7e\x32\x49\x97\x09\xb9\x13\x95\x3a\xd4\x6f\x1c\x23\xe1\xb6\xb5\x6f\x02\x4c\x4a\x7d\x48\x46\x11\x92\xc0\x1c\x56\xc5\x4c\x56\x47\x91\xec\x0a\x67\xb6\x1a\xcb\xf9\x57\xe6\xd0\xd7\xda\x80\x53\xed\x13\xa4\x18\x93\xd7\x67\xfc\x57\x37\xcd\x19\x55\x53\xda\x5d\x5b\x07\x06\x5f\x47\xd7\x2a\x35\xc4\x2b\x00\x1e\xb6\xdb\xd0\xf8\xe7\x7a\x4b\x76\xa6\x26\x61\x92\x64\x7f\x41\x55\xea\x11\xbd\x12\x37\xba\x77\xc8\x7c\x62\xbf\x4b\x01\x14\x9f\xc5\x8b\xc2\x8f\x0b\x5a\x28\x64\x85\xd3\x71\x7d\x32\x39\x64\x04\x62\x18\xe7\x0c\x7e\x38\xb7\xd5\xe7\x4b\xa6\xb1\x2b\x02\x2f\x18\x19\x7d\x92\xc1\x3b\xca\x89\x33\x5c\x85\x6c\xbc\x57\x56\xaa\x3b\x64\xec\x1f\x46\xe3\x96\xb1\x16\x1c\x87\x1c\xd2\xdf\xde\xd1\xa4\xec\x91\x92\x74\x29\x37\xc0\x70\x45\x31\xc7"}, -{{0xac,0x0f,0x7f,0x04,0x18,0xde,0x67,0xe3,0x48,0xfa,0x6d,0x56,0x86,0xc4,0x6d,0x21,0xca,0x72,0x62,0x2e,0xe6,0x9e,0xaa,0xbe,0x00,0xd5,0xc9,0x07,0x5a,0x34,0xf1,0x79,},{0xfe,0xab,0xde,0x08,0xf0,0x0a,0x2b,0x68,0x2b,0xce,0x9d,0x45,0x99,0x0b,0xf4,0x5a,0xfc,0x95,0x83,0x39,0xdc,0x44,0x10,0x6d,0xad,0x33,0xb2,0xc4,0x90,0xef,0x70,0x90,},{0x75,0x91,0xcf,0x82,0x57,0xbe,0xad,0x39,0xa1,0xad,0x3b,0xa1,0x91,0x8d,0x51,0x8e,0x67,0x24,0x35,0x6b,0xf6,0x25,0xa5,0x73,0xea,0xe5,0x01,0xd1,0xaf,0x94,0x6c,0x13,0xc2,0x90,0xcb,0x63,0x15,0x6e,0xc9,0xd3,0x62,0x72,0x6e,0xe5,0x0b,0x39,0xfc,0x0a,0x7a,0x2b,0xbd,0x69,0xd4,0xa8,0x1b,0x75,0x93,0x2a,0x90,0xf8,0xc7,0xac,0x7d,0x03,},"\xe8\xd0\xe8\x32\x53\x35\xe0\xf3\x5a\x85\x46\x7b\xee\xd1\xe1\x1c\x6a\x20\x78\xc3\x5a\xe4\xa4\xa1\x05\x43\xed\xe4\x0c\x17\x12\xbc\x95\x20\x12\xd2\xf8\xfe\xc1\x05\xae\xf7\xc6\xc6\x5b\x36\x34\xb4\xa7\x4b\x22\xb4\x98\xb9\x13\x50\x7d\x1f\x6c\xfd\xe8\x38\x58\xe6\x83\x0c\x0a\xf4\xf4\x64\xa6\x89\x9d\x5c\x4e\x27\x9a\xff\x36\x75\x4c\x21\xda\x80\xa1\xbb\xd1\xdc\xf4\x62\x20\x37\x5b\x1e\x11\x2a\x5a\x72\xf1\xab\x6e\x8f\x64\x19\x42\xf6\x6d\x9b\xbd\xbb\x17\x9c\xf0\x13\x9e\xa8\xde\xb0\xf4\xb8\x14\xf5\x0c\x51\x33\x29\xa1\xa0\xe2\x67\xc4\x43\x3a\x23\x31\x82\xbc\x4a\x2a\xcb\x2c\x6d\x4f\x00\xb2\x40\x94\xd3\xbd\xc0\xeb\x81\xcf\x37\xd3\x82\x60\xc2\x10\x7d\xd9\x49\x06\x13\xd2\x76\xee\x1f\x72\x26\x6c\x6e\x4a\xcc\xa5\x24\x98\x11\xa0\xf8\xa7\xda\xe6\x6a\xed\xb7\x5c\x3d\xf4\xc8\xca\x3c\xb5\xd9\xc5\x67\xba\x54\x1e\xe5\xa9\x14\x0c\x50\x58\x72\x72\xaf\x34\x53\x0a\xb8\xb0\x8b\x9e\xc0\x32\xea\xc0\x60\x39\xe6\x92\x63\x0e\x2d\x55\x4d\xf7\x7c\x1a\x03\x88\xb3\xca\xaa\x3b\xe3\x75\x4a\x84\x96\x1f\xb2\x99\xe4\x02\x22\x71\x58\xce\x36\x3e\xac\x26\x47\x8d\x47\x97\x75\xe5\x68\x5a\xdb\xf8\x28\xbb\x35\x5e\x3c\x89\xcc\xe2\x41\x50\x3c\x15\x36\x64\x32\xba\x94\xcd\x3c\xd9\x54\x79\x14\x4b\x63\x6e\x0d\xe7\x0b\x3f\x16\xd1\xa3\xca\x51\x8e\x39\x90\x09\xa4\xc2\x47\xa7\xf9\x63\x67\xc7\x14\x66\x08\xaa\xcc\x00\x14\xfc\x35\xb8\x4a\xf9\x93\x3f\x09\xba\xbb\x89\x93\x7a\xbb\x8c\xed\x11\x18\x91\x34\x3d\xdb\x79\xf6\x0b\x78\x89\x8a\xb5\x93\x8f\x8b\xa3\x81\x4b\xd8\x00\x26\x05\xb1\xdf\xd2\x97\xfa\x07\xc4\x75\xa0\xd4\xf8\xf4\x45\x1a\xcd\x70\x7d\xe8\xaf\x6c\x0e\x88\x18\x83\x3a\x3a\xbe\x5c\x96\xd1\xa8\xc6\xc9\x6e\x2c\xb6\x33\x28\xeb\xa4\x4d\xd1\xd3\x46\x84\xe4\x12\xf2\x88\xe0\x65\x20\x9d\x11\xeb\x80\x94\xd2\x2e\x4c\xc8\x02\x62\x9c\xcb\xa3\x39\x26\xbf\x1a\xd3\x6a\x62\x85\x13\x8a\xbe\xe0\x5c\x5a\x39\xa4\x75\xf3\xfd\xd0\xb3\xec\x8c\x37\x0c\xd9\x57\xa8\x37\x9e\xc2\xcd\xaf\x03\xe8\x95\xc1\xba\x12\xb4\x49\xd6\xcd\x8b\xe0\xf3\x5d\x99\xe2\xb7\xfb\xaa\x92\xdd\x54\xe6\x4e\x7c\x35\xce\xb8\x8a\x71\xa6\x80\x52\x7c\xb3\x73\xaf\xe1\x4c\xdd\x15\x8a\x0b\x90\xbf\x2d\xae\xc8\x0d\x2e\xdb\xdc\x31\x28\xcd\x6b\x63\xfa\x53\x2a\x1c\x27\x8c\xdf\xe0\xf8\xeb\xb4\xab\xba\x5e\x1a\x82\xbc\x5c\x3f\xed\x15\xc5\x79\x5b\xd9\xff\xb5\x76\x08\x2c\xc4\x79\xfa\x1b\x04\xc5\xc5\xaf\xca\xd2\x69\xa0\xf1\xad\xdf\xe7\x60\x42\xc3\xa8\xf1\xf2\x53\x77\xb6\xcb\x72\xec\x16\x14\xeb\x63\x83"}, -{{0xb5,0xa7,0xc7,0x67,0x93,0x63,0x80,0xb3,0xe9,0x87,0x51,0xca,0xfd,0x3e,0xa8,0x9b,0x38,0x8a,0x32,0xcf,0x82,0x8b,0x32,0x1c,0x5b,0xd0,0xcc,0x8d,0xd8,0x5b,0xaf,0x00,},{0xbe,0x7f,0xa6,0x5f,0x1f,0x6b,0xe5,0x10,0x27,0xf8,0xb8,0x48,0xdb,0x7a,0x8c,0x40,0x49,0x61,0xbf,0x1e,0x21,0xa2,0x3d,0xf2,0x3b,0xb8,0xce,0x05,0x85,0x0c,0xda,0xa1,},{0x60,0xe4,0xd2,0x3f,0x1f,0x08,0xfc,0xe4,0x66,0xc9,0x91,0x5d,0xde,0xd9,0x32,0x56,0xb5,0x2b,0x32,0x7e,0x5f,0x81,0xfb,0xb3,0x1d,0x1d,0x10,0xd3,0x21,0xc3,0x90,0x36,0x6e,0xf0,0x01,0xfd,0x75,0x9a,0xa9,0xd0,0xa5,0x51,0x62,0xd5,0x36,0x4d,0x91,0x8b,0x48,0xc7,0x32,0x7e,0x77,0xcf,0x53,0x58,0xbc,0x43,0x19,0xe3,0x25,0xcd,0xd6,0x08,},"\x6b\x67\xc7\x95\xd6\x6f\xac\x7b\xac\x84\x42\xa6\xc0\x99\x2c\xb5\x75\x88\x43\xb3\xe3\x93\x9e\x3c\x27\x6c\x6e\x90\x08\xda\x82\x00\x76\x77\xbf\x9e\x67\xe9\xac\x5a\x1a\x0f\x48\x6b\xea\xc0\xd8\x56\x19\x1f\xae\x25\xa1\x27\x39\x2b\xed\x46\x9b\xc7\x8d\xeb\x0c\x4b\x89\x3f\x67\xf1\x71\x6d\x83\x50\x90\x77\xe4\xa1\xbf\xd4\x13\x6d\x03\x15\x2d\xcc\x3b\x76\xd9\x52\x49\x40\xa6\x06\x4c\x66\x9f\xbf\x51\xf6\xb9\x10\x34\xb6\xd5\xf2\x89\x86\x78\xa1\x3a\x24\x70\xf6\x64\x1e\xc8\x02\x45\x7c\x01\x02\xc3\xeb\xf6\x34\x5c\x32\x7e\x74\x1b\x80\x64\x4b\x3a\x99\xbf\x72\xb5\x9a\xb8\x01\x6f\x35\xd2\x51\x88\xa0\x85\x75\x0d\xc0\x60\xe5\xa8\xd5\x24\xae\x21\x3f\x07\x8f\x28\x8c\x7b\x34\xbc\x41\xf3\xce\x35\x6b\xf2\xda\xfd\xd2\xe0\xdb\x4f\xb8\xd7\xc2\xc3\x19\xf9\x90\x60\x05\x97\x17\x02\xe4\x9c\xa6\x2e\x80\x50\x54\x0d\x41\x21\xd2\x42\xf2\xee\xab\x1b\xd1\x34\xe6\x0b\xf1\x1b\x3e\xc7\x1f\x77\x65\xa9\x7c\x0e\x09\x84\x55\xe5\x9d\x22\x35\xd6\xb3\x7e\x7c\x9f\x5b\x21\xfa\x11\x2c\x3b\xa3\x9e\x4e\xa2\x00\x61\x4f\x58\xdf\xb3\xeb\x7b\x83\x6f\x0b\xec\x1d\xdd\x43\x8d\x14\x22\x45\x0a\xe7\xde\xd1\xdf\x9d\x71\xe5\xd9\xbc\x8f\xa3\xb6\xe6\xf7\x84\x46\xce\x7c\x79\xd0\xbc\xfb\x1c\x2d\x26\xc6\xfe\xce\x68\x68\x2d\xff\xc6\x0a\x9c\x6e\x0a\xd0\x5f\x2a\x09\xf2\x1d\x75\x23\x25\x1c\xb0\xc3\xd0\x8e\xfb\xbf\x8a\xc1\x63\x39\xd7\x17\x02\x4d\x67\x60\x24\xc1\xee\x3c\x1f\x62\xc5\xae\xab\x7f\xff\x93\x7c\x57\x45\x4d\xf7\xbd\x96\xf9\x84\x4a\x2a\x39\x99\x58\x41\x8a\xaa\x6f\x18\x48\xbe\xbf\x7b\xf1\x29\x2c\x24\xeb\x5c\xd8\xea\x56\x34\x0c\x5b\xeb\x26\x88\x02\x4a\x69\x53\x27\x5b\xe6\xef\xd1\xb7\x1b\xa8\xbe\x6e\xb7\x7f\x0c\x65\xa7\xc5\x11\x1b\x96\xc4\xc1\xf3\x9c\xb7\xaa\xf8\x3f\xda\xae\x8d\x14\x8d\x7a\x8a\xf4\x0a\xe9\xe6\x51\x91\x9f\x7c\xe2\x8c\x8b\x2b\x6e\x45\xe4\xd3\xd5\x6f\xdd\x54\xd0\x0c\x24\x12\x79\x0c\xbd\x6f\x80\xe1\x08\x19\xe0\xb8\xf3\x7c\x84\xfa\x00\x49\x88\xad\xaf\xcc\xbb\xc2\x1c\x63\xd6\xbf\x2e\x73\x2d\x9d\xd6\x3b\xd4\x9b\x04\x12\xb9\x67\x4e\x1e\x88\xf6\x14\x2f\x7f\x86\x7f\x1f\x26\x89\x1b\x22\x43\x04\x23\xce\xc4\xdb\x91\xb6\x1c\x2a\xbc\x5c\x8f\xbd\x46\xb8\xb9\x35\x96\xfc\x51\x60\x68\x31\x36\xe2\x11\x29\x82\x27\x96\xeb\x5e\xa0\x88\xe0\xa7\xd8\x12\x1b\x25\x57\x2e\x3e\xc3\x77\x43\xd1\xff\x6d\x8d\x1c\x35\x36\x43\x9a\x10\xe8\x4a\x66\x5f\x2c\x75\xee\x73\xcd\xc6\xff\xac\x4c\xc2\x87\x24\x46\x9f\x79\x70\xb4\x75\x07\xdf\x3e\x1b\x14\xd4\x77\xae\xc2\xbb\x20"}, -{{0xe1,0x36,0xf3,0x98,0xa6,0x05,0xd1,0x34,0x57,0x84,0x8c,0xea,0xd0,0x7c,0x72,0x86,0xf4,0x2e,0x2f,0x28,0xdf,0x8c,0x12,0x8a,0x3d,0x0b,0xb7,0x2b,0x29,0xaa,0xcc,0x19,},{0x6a,0xa5,0x04,0x5a,0x66,0xf7,0x72,0xa5,0x71,0xfe,0x3e,0x42,0xd1,0x17,0xef,0xcd,0xf6,0xc4,0x95,0x91,0x99,0x61,0x86,0x01,0x2f,0xa9,0x8f,0x7c,0x48,0xe0,0xcd,0xa7,},{0x75,0xa4,0x5c,0x6b,0x95,0x66,0x89,0x98,0x29,0xb4,0x1e,0xe5,0x17,0xb7,0x04,0x5a,0x47,0x3a,0x4f,0x7a,0x26,0x41,0x43,0x9b,0x5d,0x7c,0x56,0x73,0xe0,0x0d,0x8f,0x5c,0x06,0x6f,0x12,0x91,0xf8,0x5d,0xea,0xda,0x05,0x02,0xbd,0x16,0xe9,0x70,0x9f,0x82,0x7d,0x47,0x51,0xf2,0x87,0x38,0x62,0xe8,0x21,0x9e,0x57,0x74,0x6a,0x19,0xa9,0x00,},"\xd3\x28\x57\x9d\xe4\xc5\x37\x2f\x3b\x38\x2c\x48\x01\x1b\x2d\x4c\x60\x29\xf9\x04\xf3\xa3\x3e\x07\xd0\x83\xd7\xe2\xb0\x37\x56\xaf\x2c\x4c\x97\xa2\xd6\x6c\x10\xec\x41\x54\xd8\x74\x79\x20\x42\xb6\x46\xe4\xaa\xe5\x10\x1d\x50\x1b\xd1\xbf\x6f\x51\x17\x51\xd0\xaa\xf8\x21\xcd\x7c\x0b\x3e\xe6\xd0\xd7\xc6\x90\xa2\x77\x7f\xe1\x6b\xdc\x7e\x49\xb7\xda\x4b\xbb\x4c\xce\x3b\x61\x8e\xe9\xb6\xf2\xe3\xa1\x92\x40\xcd\xb7\x07\x33\xb9\x84\xb1\xc9\x40\xec\x66\x96\x0b\x72\x8c\xbb\x87\x4b\x80\x64\x31\x23\x72\x2d\xb9\xdb\xbe\x88\x32\x20\x08\x93\x1b\x1c\x89\x4e\xf5\xd2\x10\x99\xe6\x3e\x7c\x65\x00\x7a\xcd\x61\x78\x4d\xb4\x99\x4a\x2f\xb4\x0c\x3e\xfe\x9c\x47\xfa\xd6\x37\x63\xdd\xe0\x6f\xa0\x17\xa2\x6b\x82\xe7\x1b\x9d\xaa\xbc\x4f\xf0\xf6\xc7\x9b\x8c\xa7\xcc\xb4\xdc\x20\x31\xbe\xf1\x08\x73\x67\xc7\x08\x69\x74\xa0\x05\x66\xde\x41\xa7\x1e\x11\xd9\x93\xab\xe4\x33\x56\x98\x92\xb8\xf7\x5d\x76\x37\x99\x32\x45\xc8\x84\x47\x8a\xbe\x3f\x95\xf4\x4b\x0a\x4b\xbe\xde\xfe\xf8\x90\x6b\x75\xe0\xd3\x40\x20\xae\x53\x64\x55\xb0\xe0\x6f\x9b\xfe\xe1\x1e\xc9\xb8\x60\x4b\xac\x2c\xc6\xeb\xe0\x8c\x8f\xd5\xf5\xcc\xcc\xcb\xc1\x61\x7b\x7c\xf6\x9a\x3c\x51\x2e\x1f\x0b\xdb\x58\x5d\xf5\xe1\x27\x43\x06\x1f\x7c\x20\x53\xbc\x37\x14\x43\x61\xc0\xb3\x5f\xd3\x9d\x56\xb1\xef\xaf\x92\xc6\x10\x36\x01\x93\xec\x20\x59\x8b\x82\x85\x80\x50\xa6\xd9\x9e\x08\x2b\xce\xfd\xbd\x53\x18\xee\x5e\xfb\x3b\x26\x0f\x32\x76\xf3\xc7\x3f\x9c\x24\xce\x0c\xda\x33\xc7\xac\xc5\x0c\xa5\xdd\x61\xbd\xb8\x5d\x79\x38\x25\xf6\x73\x2a\x6e\x33\x0c\xe6\x72\xac\x44\xfe\x6b\x2b\x9a\xfe\x6e\x2e\x96\x5c\x02\xd2\xa1\xfe\x0b\x57\xcb\x1b\x31\x7c\x1d\x31\x3e\xfd\xc3\x56\x49\x2f\xe8\x96\xfd\x14\x9d\xae\x51\xc9\x5c\xcd\xbb\x7d\x11\xf7\xd6\x10\xe0\xc6\xe2\xfd\x3e\x57\xfc\xfe\xf1\xc5\x7c\x71\x19\xa0\xaf\x6c\x78\x21\xfe\xcd\xb8\x9d\x80\x30\x2b\x49\xfa\xd4\x17\x43\xf3\xd2\xd7\xa0\x75\x15\x4b\x31\x43\xe5\x1a\xeb\x94\x7d\x4b\x5e\x8b\x7e\x4c\xa8\x6f\xec\x3e\x80\xbd\x9a\x78\x6e\x4e\x46\xed\x1e\x6e\x9f\x7e\x0b\x63\x52\x66\xd9\xfa\x09\x7a\xa9\xe2\x0f\x32\xe3\xd2\x77\x2d\x7c\x1f\x00\x8b\xcd\xd3\xf9\x2c\x72\x83\xc5\x77\x90\xc3\x62\x2c\xba\xd3\xca\x35\x80\x3c\x45\xc8\x69\xdc\x37\x7f\xf3\x6b\xd7\xc0\xe6\xf1\xbb\x89\x2f\x73\x29\xa6\xe0\x8d\xf1\xdb\xeb\xc8\x1d\xc7\xb1\x15\xf8\x52\xe3\x6a\xe5\xd9\x28\x72\x5f\xa7\xc6\xfb\x9f\x28\xb0\xfb\x39\x4f\x9e\x38\xfd\x87\x62\x5c\x5f\xa2\x3a\xab\xa4\x70\x54\xe8\xcf\xea"}, -{{0x97,0xb6,0x70,0x2e,0x24,0x68,0x05,0xdb,0xcf,0xc7,0xfa,0x42,0x4a,0x8c,0xaa,0xbc,0xf2,0x62,0xd4,0x66,0xa0,0x5e,0x0d,0xd2,0xd4,0xe7,0xc3,0x74,0xd5,0x7d,0x52,0x51,},{0xa7,0x16,0xc3,0xd5,0xce,0x78,0xf4,0xd9,0xc5,0xbe,0xe3,0x44,0x7d,0xda,0xf4,0x88,0x1c,0x98,0x6e,0xfd,0xf6,0x67,0xac,0x89,0x77,0xb4,0xfb,0x69,0xb5,0xa7,0x11,0x0a,},{0x90,0x00,0x55,0x41,0xdc,0xc1,0xd7,0xab,0x83,0x7f,0x4d,0xe5,0x39,0x3f,0xad,0xd6,0xa9,0x2b,0x26,0xa7,0xd9,0x3a,0xf3,0xf6,0x69,0xe0,0xf1,0xbf,0xd6,0x21,0xcb,0xd0,0x0c,0x8a,0x23,0x05,0x6d,0x2d,0xa6,0x78,0x65,0x57,0xc8,0x28,0xa4,0x9b,0xe1,0xe4,0x02,0x1d,0x99,0x31,0x12,0x35,0xac,0x0d,0x4d,0x56,0xee,0xfc,0x7c,0x95,0x36,0x05,},"\xea\xa8\x6c\xf7\x6f\xcb\x65\xc6\xf9\xfc\x20\x8a\xc3\x6f\x28\xb2\x00\xd3\xb4\x03\xac\xa7\x32\x07\x46\x1d\x8d\x96\xaf\xa2\x46\xd7\xc6\x9d\x17\xa7\xa9\xbf\x77\xf0\x55\x43\x56\x3a\x7d\x3e\xca\x1d\x40\x79\xe2\x29\x38\xab\xa1\xf6\xe9\xe0\x4b\x49\xfb\xc8\xed\x6f\x63\xb5\x99\x73\x0d\xe9\x97\x98\x31\xc0\x2f\x8c\xba\x61\xe5\x55\x60\xd7\x11\x0d\x4c\x6e\x61\x67\x97\x06\xa7\x15\x5d\x5a\x67\x3c\x54\xd1\x6f\xe4\xd2\x28\xc2\xec\xa7\x54\x6f\xaa\x13\x39\xf2\x6d\x7a\x0b\xb4\xee\x33\x96\x11\xaf\xde\xc9\xa6\x8f\x5f\xf5\xb5\xd2\x03\xb6\x00\x53\x3a\xd5\xa3\xb3\x68\xc8\x5d\xa1\x15\x63\xf0\x98\xcc\x26\x87\x1e\x7f\xa9\x9a\xef\xd3\x8c\xc2\x61\x51\xdb\x3b\x0b\xae\x38\xdb\x6a\x87\xb6\x78\x9e\x58\x40\xb1\x08\x84\xaf\x51\x1f\x3e\xcb\x3e\xcb\xf9\x4f\xf8\x6f\xdb\x90\x55\x05\xa8\xc3\x4b\x2a\xa6\x1f\xf2\xec\x9e\xc8\xfe\xbd\x1d\xfe\xd0\x96\x5b\x6f\xc5\xb9\xf8\x86\x9d\xc3\xa4\x75\x59\x97\x4a\x88\x22\x99\x67\x06\xda\xef\xbc\x6c\x5b\xf9\x84\xce\x06\xb0\xd3\x2b\x31\xcf\x9d\x8a\xd1\x36\xae\xd4\xb0\x52\x58\x6d\xce\x70\x73\xb7\x67\xb2\x34\xe4\xa3\x7b\xeb\xbc\x39\x3d\xd2\xe0\xf7\xd1\x55\x17\x35\x48\xc3\x8a\x15\x83\xef\x94\xe0\xaa\x84\xe7\xfc\xe0\x4f\xcc\x9b\x4e\x30\x0a\xd0\x99\x44\x9a\x49\x23\x2a\xbd\xcf\x3d\x1a\x6e\x6f\xca\xb6\x96\xf5\x99\x6f\x9b\xd1\xb9\x48\x5d\x07\x47\x55\xac\x5b\x42\x97\xfe\xe3\x12\x4c\x7c\x03\x97\x6a\x40\xd5\x70\xbe\xae\xc2\xfa\xc9\x92\x33\x9f\x88\x5f\x74\xd4\x0e\xd4\xac\x87\xa4\xf4\x0c\xef\xbc\x48\x64\xf4\x4c\x36\x83\xaa\x8f\x10\x26\xe2\xc3\x7a\xef\xfc\xeb\xfd\xfe\x24\xdd\x0b\x01\x9c\x36\xa7\x98\x88\x20\x30\x04\xb2\xad\x83\xe8\x92\x21\xf3\xf6\x36\xf4\x55\xbb\x64\xe1\x7d\x17\x54\xc7\xc6\xdd\x7f\xc0\x9a\x0d\x65\xdd\xdd\xed\x46\x22\xfc\x4f\x9f\xba\x07\x2b\x45\x10\x34\x35\xe1\x02\x20\xa5\x86\xf1\x52\x26\xd2\xeb\x37\x7f\x40\x64\xd3\xff\x37\xcb\xb4\x70\x5a\x1f\xaa\xf5\xb3\x48\xf8\xc0\xef\x7f\xd1\x56\x4d\x42\x86\x88\xf5\x8f\x33\x92\x96\x7c\xf3\x96\xa8\xff\x2f\xd9\xe7\xb5\x17\xb7\xd6\xa5\xed\xe7\x44\x03\x73\xd8\xcc\x1a\x83\x99\x00\xe8\x4d\x42\x25\x42\x83\xd9\x69\x9c\x7c\xa3\x7e\x47\x76\x92\xa3\x49\x40\x08\xb8\x04\x44\xc5\xcf\x61\x4c\xbb\xc1\x69\xbf\xb9\x29\x63\x03\xc6\x45\xe2\xce\x28\xd1\x68\xdc\x6c\xba\xef\xae\x9c\x73\x19\x1f\x57\x15\x1a\xa4\x73\x00\x9d\x29\xe1\x80\x0b\x10\xf4\xc4\x98\x60\x9b\xa1\x15\x20\x98\x5c\x78\x09\x20\x58\x69\x6f\xdb\xca\x9c\x02\x0e\x2d\xfb\x8a\x04\x3a\x3d\xe8\xe4\x52\xd5\x8c\xd1\xad"}, -{{0xd1,0x52,0x8c,0x14,0x06,0xa6,0xe4,0x94,0xa0,0x2f,0x63,0x53,0x05,0xfa,0x74,0xd7,0x45,0xc6,0x93,0x27,0xfd,0x31,0xb7,0xd2,0xc2,0x62,0x3d,0xe2,0xc0,0x30,0xed,0x85,},{0x0c,0xfe,0x36,0x9c,0xf9,0x3d,0xaf,0x6d,0x53,0xef,0x02,0x8d,0xdb,0x9f,0x00,0x04,0x43,0xb0,0x97,0x2f,0xe2,0x53,0x2f,0x83,0xa4,0x1c,0xe6,0x57,0xc1,0x83,0x6c,0xa3,},{0xb8,0x39,0x9b,0xc3,0x32,0x6c,0xba,0x0a,0x93,0xa4,0x24,0x97,0x16,0x8b,0xf5,0x7f,0x91,0x06,0xee,0x43,0xd3,0x9b,0xf0,0xfc,0x86,0x68,0x51,0x99,0xdc,0x6e,0x0a,0x13,0xb9,0xc7,0x24,0xef,0x17,0xe7,0x88,0x2a,0xf8,0xc2,0xeb,0x70,0xf6,0xc9,0xe4,0x2d,0xfa,0x2f,0xbf,0x0c,0x1c,0xb5,0x00,0x2b,0x58,0xf1,0x08,0x66,0x19,0x73,0x3e,0x02,},"\xab\xb3\x67\x3f\x3f\xa1\x7a\x33\xa7\xaf\xf7\x6e\xac\x54\xe7\x68\x7c\x04\xbc\x84\xf7\x66\x65\x1a\x8b\x24\xba\x22\x94\x79\x08\xb0\x4c\xa4\x59\xfe\xb9\x8a\xce\x7c\xab\x1e\x74\x33\xa6\xa6\xbe\xff\xd8\xd9\x50\x4e\x29\x91\xda\xa0\x64\x4d\x61\xb8\xb2\xe4\x54\x48\xf5\x4d\xf8\x81\x3f\x50\xc4\x18\xb4\x8f\x49\xe1\x03\x4e\x85\x1c\xbe\xc3\xef\x0a\x18\x50\xef\x72\x67\x33\xaf\xaf\x68\xe1\xa4\x61\x04\x16\x51\xc1\x38\xd5\x4e\x4e\xf7\x81\x87\xaf\x9a\x73\x42\xf7\x12\x87\x27\xf9\x03\xbf\x4f\xc5\xef\x3e\x40\xc6\x4e\xc2\x6f\x89\x2f\x59\xad\xd9\x8f\xe3\x94\x76\x5a\xaa\x7d\x09\xca\xe8\x1b\x9f\x69\x9a\x9d\xd8\xbf\x2e\x2f\xe8\xe1\xec\x78\xfc\x88\x4e\xaa\x0d\x2d\xbd\xbf\xb8\xc1\x68\x83\x3e\xe0\xd2\x18\x03\xcc\x35\xdc\x62\x8d\x7c\x07\xe0\x44\x04\xfb\x60\xe8\xc4\x90\xa8\xdd\x34\xed\xbc\xba\xaf\x80\xcc\xda\xe3\xf7\xd3\x73\x9e\x0e\x89\x70\x23\xee\xb5\xb1\xa8\xc0\x0a\x96\x73\xc5\x92\x58\x24\x0d\xdd\x44\x20\x65\x0f\xe5\x77\x1f\x7e\x28\xcb\x23\x99\xf5\xe1\xe0\x2a\xd0\xb6\x43\x2d\x9b\x49\x60\x8f\xcf\x0b\x1c\x0d\x7c\x41\x2a\x44\x52\x55\xb8\xba\xdc\x53\x21\xc2\x4c\x1a\xc9\x2c\x79\xa0\xba\xcc\xb9\xde\xff\xed\x02\xd1\x2f\x55\x36\xcd\x59\x5d\xc6\x60\x83\xb3\x3a\x36\x03\xa9\xd1\x6e\xce\xa2\xbf\x38\xc4\xf2\xaa\xf5\x70\xf3\x0d\x21\x16\x2b\x2e\xfd\x7e\x4d\x5e\xbf\x1e\xca\xe9\x58\x8e\xee\x36\xdd\x9d\x3d\x8e\x3b\xe7\xbc\x6d\x4b\xc2\x18\x56\x22\xf1\x1d\x1d\xa7\xc4\x9c\x93\xe6\x23\xac\x56\xfe\xe7\xe3\x70\x6d\xb8\x31\x3c\xf9\x26\xbe\x92\xe5\xc8\xa5\x39\xfd\x16\xb0\xf4\x38\xda\x8e\x51\xa5\x1f\x2d\x27\x64\x03\x56\x12\x4e\xf7\xbe\x2f\x91\xff\xa1\x79\x6a\x91\xb1\x23\x01\x93\x4d\xde\xf0\xc7\x93\x8a\x7a\x45\xf3\x6f\x53\xb6\x32\x2d\x9c\x8f\x9d\x27\x5e\x1c\xd2\xc0\xf1\x29\xf8\xab\x8d\x74\x15\x5b\x5d\x9e\x5c\x15\xc0\x15\xb0\xb0\x00\x03\xb2\xbd\xdf\xa0\xbc\xfc\xc6\x93\xa1\xdf\xcb\x4f\x53\xda\xec\x12\x6d\x16\x69\xf3\x3f\x39\xad\x05\x51\x9e\xf7\xc5\xce\x40\xe6\xf4\x57\x3c\x24\x7a\x32\xc4\xa0\x16\x28\x31\x35\x2f\x6d\x55\x8f\xf5\x83\x6a\x53\x17\xdb\xc4\x51\x5b\x3d\xf2\x69\xa8\xac\x76\xd6\x43\x6f\x26\x4b\x64\x56\x1e\x79\x68\xb5\x82\x21\x08\x48\x7b\x04\x5c\x92\xd6\xc6\x14\x2a\x1c\x28\x55\xb3\x8b\xee\xbd\x64\x25\x65\x12\x3c\xc8\x27\xcb\x18\x31\x19\x9e\x6f\x12\xa7\xe4\x23\x68\x56\xb9\x4d\xad\x73\x8f\x69\xd1\x10\x6e\x77\x35\xd7\x11\xf7\xc6\xa3\xa3\x37\x80\x41\xfc\x7a\x21\x10\x3b\xbf\x86\x69\x07\xd4\xed\xdd\xaf\xa0\xe7\xf1\xbb\x5f\xfd\x41\xa6\x0d\x64"}, -{{0x51,0x23,0x40,0xf9,0x61,0xf1,0x42,0xd1,0x91,0x5e,0x85,0xfe,0x4f,0xa0,0xf5,0x51,0xf8,0x08,0x92,0xe7,0x5a,0xcc,0xce,0x7c,0xd1,0x86,0x9e,0x6e,0x2c,0x9e,0x80,0x15,},{0x0c,0xa0,0x26,0x04,0xfa,0x87,0xe2,0xc2,0x05,0x06,0x25,0x1f,0x07,0x92,0xcd,0x21,0x25,0x85,0x6f,0x0a,0xb1,0x6d,0x66,0x3f,0x28,0x11,0x96,0x3b,0x1f,0x2d,0x81,0x72,},{0x6b,0xb4,0xd9,0x75,0xaf,0xae,0xf4,0x1e,0xa9,0xef,0x08,0x5a,0x68,0xc5,0x68,0xa0,0x5d,0xa3,0x7e,0xf2,0x1d,0xad,0x46,0x4e,0xd8,0x6a,0xc0,0xd4,0x08,0x0e,0x7d,0x01,0x29,0xfb,0x02,0x31,0x31,0xec,0xa5,0xf7,0xad,0xb2,0x58,0x6a,0x18,0xbe,0x40,0x56,0x2f,0xa2,0x76,0x4c,0xa8,0x07,0xe6,0x70,0xa0,0x59,0x6a,0x5c,0x54,0x7b,0xc0,0x01,},"\xaf\x37\xb2\xc7\x58\x7a\x8d\x5b\xc8\x95\xcd\x35\x77\x46\xab\x03\x55\x2a\x0a\x56\x1a\x29\x3d\xc7\x16\x4e\x39\xb6\xa1\x33\x3a\x92\x0b\xb6\xda\xca\x60\x06\x67\x6e\x99\xbb\x7e\x92\x8f\x9e\xa3\x91\xe5\x48\x02\xa8\xd3\x15\x96\x28\x9f\xb9\xbf\xe3\x00\x00\xcf\x52\xeb\xf0\xc1\x24\xa5\x89\x5b\xce\x33\x98\xc1\xbf\x53\x56\xbe\x82\x61\x9b\x8d\xdc\x15\xa7\x7c\xa9\x22\x49\x4b\xdb\x04\xf5\xc2\xe1\xb6\xe8\xff\x77\xae\x74\x9f\xaf\x2b\x8a\x41\xd8\x22\xc1\x7c\x06\xdf\xb7\xa5\xf9\x43\x4d\x8b\xd7\x15\xec\x87\x78\xe8\x0b\x81\xd2\xe8\xd0\x62\x98\x74\x86\x90\xc6\x55\x52\x83\xc9\x8b\xb9\xb1\x9b\x92\x46\x66\x7b\xc4\x10\x46\xff\x98\xc2\xc3\x5d\x16\x1e\x1f\x4d\x69\xd2\x54\xec\x5a\x07\x6f\x25\xbd\x5c\x7e\x2c\x98\xca\x3c\x09\xd8\x08\x33\x96\x2c\xf9\x66\x02\x87\x88\x40\x96\xeb\x30\xc4\x6c\x54\x17\x41\x06\xaf\x4e\x29\x79\xa1\x12\xf3\xe8\x94\x4e\xaa\xf7\x66\x9c\x40\xd5\xaf\xb9\x1a\x02\x4a\xbb\xeb\x14\x66\x4e\x30\x89\x03\xe4\xd2\x6d\x70\x09\x44\x6e\xe2\xe8\x30\xab\x5e\xca\x0d\xbb\xc5\x13\xfb\x4e\x04\x35\x1d\xf2\xf6\x74\x18\x64\xfb\x23\x71\xb2\x50\x2b\xe4\x3d\xc1\x5f\xc0\x44\x31\xff\xf5\xeb\x8d\x4b\x68\xd7\x24\x62\xae\x32\x2e\x57\xba\x2d\x4a\xdd\xdf\x15\xa1\x90\x2c\x21\x13\xae\xbd\x3b\x5d\x61\x29\x17\xc1\xbb\x73\xe7\x08\xad\x54\x18\xe7\xd4\x5e\x4b\x72\x80\xfc\x88\x96\xab\x80\x85\x3f\xf5\xf8\xe9\x8f\x26\x55\x3f\xc7\x8e\x30\xb3\xb0\xd7\x27\xbf\x6d\x06\x4a\x8f\x32\x88\x87\x68\xc5\x1e\xbb\x61\xb2\xc6\x00\xb4\x02\x8a\x77\x06\x0f\xeb\xbb\x02\xeb\x3d\x20\x17\x80\xe7\x45\x66\xc8\x6a\x34\x03\x18\x36\xbc\xe9\xea\xda\x81\xe5\xd0\xf3\x39\x60\xcb\x2d\xf0\x8a\xff\x3c\x97\x49\x21\xfc\x9b\x7d\x3a\xa7\xc8\x1e\x9c\x67\x1e\xd6\xd3\x3e\x7a\xe5\xed\x03\xa5\x41\x7d\x7e\x5c\xd6\xfa\xac\x91\xb5\x4b\x8f\x79\x2f\x48\x28\x3c\x60\x64\x7d\xe3\xda\x81\x6c\xa9\x75\x6c\x5b\xfe\x1b\xb8\xb5\x97\x9e\x57\x54\x01\xbd\xa3\x4e\x9c\xbc\x4d\x77\xe7\x11\xd6\xb7\x3b\x82\xda\x19\xda\x47\x3b\x55\xe8\xe7\x2d\x34\x1b\x2d\x85\x03\xe4\x86\x09\xbe\x0f\xe2\x91\x44\x4c\x28\x36\x69\xe5\xde\xad\xea\xf5\x2a\xa8\xec\x48\xda\x83\xf5\x32\x8c\xc0\x99\xfb\x41\xf8\x2b\xec\xdd\x58\xd0\x4b\x1d\x66\x20\x3d\x73\x7b\xed\x06\xcf\x21\xc9\x78\x19\xac\x13\xed\x71\x1c\xa2\x17\xa5\x7c\xf7\xd8\x0f\xf0\x82\xaa\x1a\x1c\xf8\xfe\xa5\x55\xcd\x2e\x47\xe4\xdd\xab\x5e\x3f\x99\x41\xad\x4f\x77\x5f\x49\x41\x9d\xca\xdb\x5b\x00\x4b\x68\xca\xf4\x5b\x27\xef\x49\xba\x14\xfb\x52\xb0\x9f\x1b\x18\x5b\xe9\xf9\xc7"}, -{{0xb1,0xb6,0x36,0xe9,0x57,0x57,0x4c,0x21,0xa9,0x57,0xa4,0x5b,0xd1,0x95,0xc6,0xf9,0xfe,0x4c,0xc1,0xc5,0x7e,0x84,0x13,0x4d,0x39,0xb4,0x2e,0x1a,0x84,0x32,0x9e,0xdb,},{0x95,0xe7,0x7b,0x15,0xdd,0xa4,0x7c,0xaf,0x69,0xb7,0x28,0x88,0xdd,0x69,0x96,0x1b,0xac,0xbe,0xc3,0xbc,0x75,0x35,0x30,0x03,0xe8,0xbf,0xf0,0xa4,0x3d,0xdf,0x4b,0x7a,},{0x76,0x3c,0x7d,0x0d,0x46,0x87,0x8e,0x5c,0x7e,0xcf,0x71,0x04,0xfc,0x1f,0x22,0x30,0xe4,0x61,0x78,0xa2,0x7c,0x75,0xf1,0x96,0x16,0x9c,0x02,0x79,0xed,0xb0,0x1c,0x28,0xfc,0xde,0x3b,0x0d,0x5b,0x86,0x35,0xcf,0xe3,0x39,0xfb,0x23,0x27,0x74,0xb2,0x20,0x6d,0xab,0x8a,0x46,0x0c,0xe4,0x17,0xab,0xf4,0x90,0xbb,0xfa,0x78,0x5c,0x02,0x05,},"\xe2\x5d\x32\x9c\xad\x83\x64\xd2\xde\xc2\x43\x73\xe9\x2d\x9d\x50\xfc\x7a\xbe\x8f\xdc\x3d\x0b\x4e\xe5\x7e\x1c\xfa\x5b\x7c\xd5\x8c\x23\xbe\x91\x8f\x05\x17\x9b\xa8\x41\xb6\x1e\x18\x00\x34\xca\x7e\x74\xd4\x9b\x0a\x1a\x2c\xeb\xb4\xbe\x65\x34\x4c\x91\x3c\x46\xd3\x26\x52\x33\x6e\x6b\xda\x4e\xfa\x3f\x58\x73\x0d\x39\xa6\x33\xa1\x4c\xa3\xd9\xa6\x2a\xbb\x0a\x73\x98\xcc\x29\xaf\xf9\x16\xee\xea\x2e\x7c\xaa\xc8\x08\x45\x56\x2f\x73\xd4\x03\x0f\x9c\xab\x0b\xf1\xc6\x40\x7f\x54\x01\x51\x3e\xf8\x7f\xe6\xdc\x09\x9d\xbc\x5d\xfc\x33\x52\x91\x1c\x07\xaf\x6c\x52\x3b\xef\x4c\xca\x78\x37\x96\x59\xe8\x80\x3f\x58\x59\x04\xee\x6e\xf6\xfd\xe7\x73\x66\xd9\x6d\x2c\xcf\x24\x8a\x53\x20\xd9\xb8\x29\x8b\x2a\x73\x36\x38\x79\x10\x7a\x02\xb4\x7f\x57\x21\x3a\x85\x20\x3a\xbb\xca\x5a\x41\x95\xf8\xaf\x3e\x35\x93\xed\x2f\xa3\x50\x4b\xb7\x6a\x3e\x1b\xe2\x4b\x66\xd3\x55\x66\x29\x32\xcb\x67\xdc\x88\x50\x3a\xfa\xf7\x62\xbf\xf7\x41\xba\x1c\xac\xe9\x7a\xc5\x8b\xaf\xad\x5d\x36\xc3\xaa\x02\xe0\xcb\xe2\x0e\x5f\x3d\xc8\x09\x2c\x51\x2e\xaa\x9c\x49\x43\x47\x4a\xad\x41\x99\x00\x76\x72\x1a\xd3\xf5\x3f\xb0\x8a\xc2\x29\x82\xed\x9b\x15\xc7\x51\xa9\xe2\x33\x82\xf6\xa6\x9c\x72\xe6\xe2\x44\xe0\xeb\x68\x1e\x6d\xd2\x28\xd3\x77\x4f\xcc\xb3\x7e\xb6\x23\x2f\x82\x5d\x16\x9a\x2a\xc8\xb7\xe1\x8a\x42\xcd\xaa\x4f\x2c\xf0\x58\x90\xbb\x0c\x59\x8c\xf8\xc3\x1f\x82\x9e\xf8\xca\x24\x35\xbd\xcc\xeb\x0e\x61\x93\xad\xa7\x84\x1e\xe6\x92\xf3\x0a\xed\xf8\x8b\x62\x73\x11\xb1\x38\xac\x78\xb3\x91\x3e\x06\xf7\xc3\x21\xca\xfb\x39\xd9\x01\xdf\xe1\x74\x30\xb1\xa2\x0b\xc4\x37\xa5\x55\xa5\x78\xfa\x31\xe4\xb6\x80\x79\x54\x45\x6b\xd4\xb0\x4d\x5d\x88\x79\x87\xbd\xf0\x4e\x0f\x14\xaf\x31\x41\xb2\x4c\x3a\x7b\x9a\xc7\x5a\xa3\x2e\x2f\xcd\x21\x71\xa1\x26\x09\xe1\x5e\x73\x09\x4f\xd0\x92\x21\xb4\xd2\x70\x90\xe7\x32\x19\xb6\x48\xbc\xaa\xbf\x38\x07\xc9\x28\x0b\x6c\x4a\xd7\x50\xa4\x68\xbe\x0e\x1a\xd3\xe6\xe6\x30\x16\xcb\x5c\xec\x3a\xad\xdc\x56\x89\xc2\x95\x5a\x2a\x8d\x5b\x89\x84\xd7\xc4\x43\x76\xfd\xd9\x4d\x3f\x5f\xf1\x29\x8f\x78\x17\x2b\x56\x59\x13\x70\x4e\x90\xe5\xac\x03\x8c\xb1\x72\x0e\x19\xb0\x80\xf8\x1b\x53\xd6\xa4\x5d\x45\x28\x53\x07\x11\xb6\x3d\xfe\x1e\x47\x81\xc2\x4d\x74\xae\xb2\xbd\x8a\x73\xfd\x2a\x99\x3c\x5b\x08\x91\x39\x21\x96\xac\x32\xc5\x23\x69\x99\x60\xd8\xb2\x3e\x01\x66\x4c\xf9\x02\x1d\x93\x92\x80\x50\xca\xf9\x7f\xb9\x85\x55\x45\x80\xe3\x33\x36\xa4\x56\x32\x47\xdf\x59\xef\x6c\xae\x53"}, -{{0x10,0xca,0x41,0x3d,0x70,0xeb,0x3d,0xb6,0xe3,0x37,0xf0,0xf1,0x1a,0xbc,0x07,0x5c,0x95,0x85,0x9e,0x82,0x5f,0x87,0x61,0x76,0x07,0x69,0x52,0xd2,0xf1,0x88,0x80,0x30,},{0x50,0x28,0xba,0x38,0xaf,0xec,0xc2,0x42,0x63,0x5f,0x6e,0x35,0x3d,0x5f,0x4a,0xfd,0x12,0x3f,0x86,0x0a,0x04,0x25,0x22,0x0e,0x96,0x65,0x52,0xa0,0x57,0x88,0x08,0x23,},{0x6a,0xec,0x02,0xdc,0x6b,0xdf,0xcb,0x67,0xf0,0xef,0xc1,0xfd,0x31,0xe2,0x3e,0x69,0xe3,0x71,0xab,0x38,0x02,0x50,0x5b,0x32,0x01,0xa9,0x5d,0xd5,0x25,0x41,0x7e,0xd1,0xa1,0x28,0xdb,0x4e,0x18,0x2c,0xb3,0x7c,0x28,0xf6,0x28,0x06,0x66,0x70,0x99,0xa8,0xad,0x48,0x0b,0x0a,0xc9,0xe9,0x4c,0x2a,0x7d,0x5a,0x0e,0x96,0xe2,0xa7,0x36,0x0d,},"\xea\x7f\xaf\x79\xf6\xff\x5d\x78\xa8\x23\xa7\x54\x34\x71\x34\xf1\xb3\xc3\xe9\x1c\xe5\x18\xfd\xd6\x33\xfe\xb4\xf0\x5d\x12\x5f\x05\xcb\x54\x33\x6e\xf5\x60\xe9\x2d\xeb\x68\x51\x12\xa5\xff\xcd\x3d\xfd\x39\x64\xb2\x75\x8c\xe4\x78\x5f\x6a\x34\xbf\xeb\x39\x78\x4f\x0a\xee\x55\x95\x5a\xeb\xd1\x2d\xdd\xa6\x41\xd0\x57\x69\xf7\x44\x02\xf7\x06\xda\xd2\x01\xc4\x4c\x91\x08\x1c\x7d\x7f\x65\xe7\xaa\x42\x46\xde\x6d\xc3\xed\x64\x96\xd1\x0f\x4a\x41\x20\x60\xd4\x93\xba\xc9\xae\xd5\xbe\x4f\x6d\x74\x22\x9e\x3c\x55\xeb\x68\x76\xe3\xbb\x2e\xd4\x1f\xa4\x50\x4b\x66\x70\xdd\xa8\xc7\x98\xf6\xda\xa2\x80\xd1\xaa\x72\x02\x11\x74\xf6\xc0\x1a\xec\x49\xb3\x21\xd8\x7f\x53\xac\xbc\xad\xcc\x46\x07\xd5\xb1\xe4\x5d\x63\xfc\x48\x1a\x6d\x90\x57\x6c\x87\xc1\x88\x0b\x2e\x8f\xf3\xe5\x90\xa9\x6b\xee\xe1\x80\x47\x68\xc7\x56\xbe\xb8\x6b\xf1\xde\x8a\xdc\x40\x8b\x1b\x8d\x66\x6f\x74\xba\x28\x63\x08\x22\xf9\x2d\x18\xb0\x56\xae\x37\xce\x02\x93\xee\x61\xb9\xe8\x0f\x33\xac\x26\x96\x71\xbd\x62\xa4\x05\x9b\x24\xf7\xc1\xa4\x40\x80\x74\x40\xd5\xd5\x38\xa6\x54\x58\xad\xc8\x15\x87\x24\xb2\x5c\x12\x12\x7a\xa0\x34\x9e\x55\xf6\xe5\x5b\xc9\x20\x78\xfd\x1e\xf2\x74\xc2\xaa\x79\x19\x05\x76\x6b\xe3\x94\xa2\x62\x8f\x7b\xbd\x1a\x32\xda\x5e\x48\x74\x46\xbb\xef\xae\x88\xfa\x6c\xf3\xf7\xb4\x99\xf1\x31\xfa\x19\x31\x3d\x13\xb2\x80\xad\xca\x50\xf7\x78\x02\xd1\x73\x31\xb3\x81\x68\x3b\x5e\x7e\xda\xb9\x94\x73\xed\xd3\x1d\x77\x44\x34\x88\x21\x41\x35\xfd\x6f\x26\x44\x50\x93\xe9\xe2\xaf\xf7\xd7\xe8\x92\x33\x7f\xdc\x87\x79\x06\x5d\x4d\x97\xd6\xd6\x73\x57\x67\x94\x95\x8d\xbf\xa6\xc5\x0b\x1b\x13\xac\x39\x60\x7c\x1e\x66\xef\x96\x29\x76\x10\x71\x15\x5f\xbc\xa6\xf3\x6e\xb0\x2c\xee\xae\x16\x36\x7f\xea\xc0\x74\x76\x90\x8c\x84\x7c\x9a\x53\x3e\xf6\x8c\x94\x31\x1f\xa0\x89\xff\x28\xfb\xd8\x78\x09\xb0\xd3\x87\x6b\x43\x1d\x9a\x18\xb2\x02\xf9\xa4\x04\x9a\x05\x77\xb8\x17\x76\x10\xdd\x02\xe5\xc5\x20\xec\xa9\x55\xe8\x03\xc3\xad\x4f\x50\x97\x6f\x7c\x2e\xa8\xaa\x3e\xe4\x83\x6a\x19\x85\xdf\x0a\x4f\x16\xef\x46\x98\x15\x95\x41\x98\x97\x99\x35\x60\xaf\x82\x65\x1c\x2b\x49\x4e\x68\x0b\x37\x80\x2e\x75\x37\xef\x68\xa5\x75\xc3\x4f\x85\x88\x06\x3e\xe0\x19\x72\x06\xd9\xa3\x2b\xb4\x89\x0e\x7c\x21\x6a\x4d\x33\xfe\xca\x36\xb5\x49\xe5\x32\xfe\xa6\x85\x56\xe7\x54\x0a\x4f\xb1\x69\xd4\x9f\xc5\x53\xb2\xe6\x70\x0a\xe4\x2d\x9a\x51\x6e\x68\x16\x0a\xcf\x6b\x27\x0c\x77\xca\x5e\xc2\x6e\x5a\xd5\xdc\x75\xc2\xc3\x93\xe2\x99"}, -{{0x1f,0x0a,0x10,0xa2,0xcb,0x11,0x19,0x17,0xb9,0xa6,0x7a,0x2a,0x1f,0x38,0xfb,0x86,0xf8,0xed,0x52,0x60,0x7d,0x1d,0x65,0x3a,0x45,0x7d,0x7f,0x47,0x18,0xd9,0xa7,0xde,},{0x70,0xc0,0x75,0xb2,0xe9,0x4c,0x4c,0x02,0xf4,0x5e,0x73,0x04,0x4f,0x24,0x39,0x97,0x41,0xb1,0x61,0xfe,0xb6,0xf6,0x9e,0xab,0x63,0x54,0x17,0x28,0x2a,0x4a,0x93,0x68,},{0xa4,0x24,0x5a,0xa3,0x39,0x5e,0x7b,0xad,0xa2,0xbc,0xdf,0x16,0x03,0x14,0x7c,0xc5,0xf3,0xf0,0xba,0x91,0xf4,0x0f,0xda,0xd8,0xf6,0xd3,0x71,0xc3,0xeb,0xef,0xb4,0xc1,0x50,0x1d,0x07,0x87,0x5b,0x57,0x6f,0x40,0x79,0x78,0x06,0xa4,0x84,0xc7,0xa3,0xf7,0x05,0x69,0xe2,0x32,0xb0,0xc9,0x9d,0x29,0xca,0x23,0xa2,0x33,0xb6,0x8e,0xdb,0x0c,},"\x4f\x6a\x43\x4b\xd5\xfc\x77\xf0\xf1\xb7\x04\x9c\x91\x85\x3c\xcb\xd8\x94\x39\x96\x2a\x60\x78\xa6\x74\xb8\x67\x54\x3b\x6b\x7d\x10\x55\x2e\xc1\x75\x8c\x52\x83\x04\x2b\xd6\xb4\xce\xa8\x8c\x95\x20\xdb\x04\x74\x6f\x08\x9c\xf3\xa2\x60\xfb\x0f\x33\x85\x8e\xfd\x6f\x68\x0d\xe5\xb7\x2d\x98\x76\x32\x4b\xa5\x90\x29\x91\x38\xf8\x5a\x76\xf5\xbe\x0e\x05\xe8\x85\x9c\x02\xb2\x35\x12\x55\x9c\x8b\xea\xfc\x9c\xfe\x90\x1b\x28\x3e\x15\xd1\x6c\x79\x2e\xb0\x3b\x92\x88\x0f\x6f\xf9\x7a\xa3\x8e\xee\xad\x3f\x4f\xd6\xc0\xa9\x21\x43\x23\xaa\x39\xa1\xc1\x65\x15\xe3\x0d\xbd\x08\xb8\x33\xee\x40\xa8\x14\xa2\x88\x09\xc8\x70\xe1\xd0\xa6\x2c\x37\x93\x2d\x54\x08\xfc\x6a\xfc\x63\xe7\x9a\x65\x5c\x5f\xe3\xd4\x02\x6e\xf0\x9e\x02\x99\xfb\xde\x5a\xb3\x4f\xce\xab\x14\x13\x0d\xc4\xbe\x00\x7e\x8e\x64\x44\xd7\xaa\xae\xc6\x2c\x87\x3d\xf7\x7e\x80\x10\x74\x3c\x31\xe8\x75\x7f\x1e\xae\x9e\xdb\x55\x97\xa1\xb5\xd8\x4b\xd7\x7a\xe7\x64\x2e\x1a\xca\x99\x87\x3a\x15\x2f\xfd\xe0\x68\xa8\xe4\xad\x92\x40\xb9\x03\x33\x27\x95\xe4\x0b\xb3\x28\x65\xe5\xce\x03\x43\x07\xa6\xc9\xfe\x33\x9a\x1c\x93\x77\x0d\xf5\xca\x46\x32\x9f\x6b\x09\x41\x97\x85\xcb\xf2\x84\x7b\x0c\x68\x32\x83\x71\x23\x85\x3a\xd9\x52\x65\x32\x65\xc5\xb5\x74\x0d\x19\x4e\x00\xf2\x3f\x9e\x96\x67\x91\xf0\x05\xf8\xbf\x55\xc3\x88\xc2\xbe\x9e\x21\x53\x89\x25\xf8\x55\x5e\x0d\xbd\x83\xbe\x07\x3d\xf7\x65\xaf\x49\x40\xe5\x9a\x37\x90\xb9\x83\x6b\xab\x79\x09\xe5\x67\x6f\xbf\x1c\x21\x26\xfe\x22\x6d\x78\x1a\x44\x33\x0c\xc0\x1d\x32\x83\x0f\xf8\xae\x00\xb9\x79\x2e\x39\x8c\x2c\xbb\x4f\xb8\x3a\x10\x05\xc2\x45\x54\x9a\x89\x06\x3f\xbe\x06\xc6\x2a\x48\xda\xc4\x3c\x51\x01\x24\x99\x94\xe9\x5e\x37\xf2\x4c\x1d\x8b\x3b\xc6\x73\x53\x8c\x46\x05\x5f\x80\x0d\xb1\xc0\xf9\x56\x86\x9b\x6b\x29\x7d\x99\x0f\x44\xf0\x5b\x50\xc7\xad\x6b\x85\x6f\x46\x21\x28\x58\x47\x1d\xd0\xd3\x93\x72\xb0\xdb\x75\x15\x73\xdd\xb6\xb5\xb5\x6b\xa0\x1e\x37\x1c\x78\xfe\x58\xdc\xd1\xbe\x53\x11\x2a\x6a\x73\xda\x9a\x6b\xac\x75\xd3\xc3\x9a\x1a\x70\x5a\x36\xf6\x40\xfc\xfa\xd8\xcd\x04\x07\x75\x94\xd5\x96\x85\xf6\xe3\x0d\xe7\x1d\xfd\x4a\x44\xc4\xe7\xc0\x4d\x6e\xc7\xc2\xe8\xbe\x12\x78\x5b\xb0\x5b\x29\xb3\x91\x51\xd3\x29\xf5\x87\xfd\xc3\x81\xc2\xdf\x0c\xef\x73\xfe\x0e\x3f\xd9\x20\x8d\x7c\xcb\x6e\x08\xd0\x2f\x42\xd1\xfe\xed\x27\x56\x1d\x5e\x32\x3a\xa1\x48\x62\x4e\x55\x2a\xbe\x87\x53\x2d\xe1\x5b\x7f\x42\xc2\x2c\x98\xe4\x05\x25\xb1\x74\x7c\xbd\x75\x8b\xfb\x26\xfd\x3e\xed\x3b"}, -{{0x7f,0x05,0xba,0xac,0xf1,0x67,0x58,0x3c,0xf2,0xfe,0x95,0x62,0xa5,0x06,0x99,0x1e,0xd9,0x87,0xf6,0x8f,0xfb,0x71,0x56,0x7c,0x7c,0xcc,0xe3,0xfc,0xc5,0x9b,0x78,0xb0,},{0x0d,0xec,0x39,0x52,0x85,0x2b,0x96,0xfd,0x75,0x58,0x7e,0x97,0x74,0x3f,0x9e,0x41,0xc0,0x9f,0xbe,0x6b,0xa9,0x81,0xbf,0xce,0xb4,0xeb,0xb8,0x89,0x2d,0x98,0x6a,0x16,},{0x0d,0xee,0xd2,0xdf,0x82,0xac,0xf4,0x52,0x9c,0x40,0x8a,0x02,0x93,0x1f,0x67,0x6b,0xec,0x5c,0xb7,0xad,0xe8,0x4e,0xbd,0xcd,0x57,0x8f,0x70,0xf9,0x71,0x38,0x2c,0xf3,0x11,0xbb,0x83,0x09,0x73,0x00,0x45,0x6a,0x55,0x8b,0xc4,0xc0,0x9d,0x89,0x83,0xff,0x13,0x49,0x3f,0xd6,0x11,0xeb,0x66,0xc0,0x43,0xbf,0x01,0x9b,0xad,0x6f,0x33,0x02,},"\xa2\x7d\x1e\xab\x05\x15\x09\x20\xde\xd1\xb1\xc2\x57\x8a\xf5\x82\xb2\x94\xf7\x83\x7f\xe4\xfb\x1a\x31\x69\xc2\x5e\xfb\x70\x63\x4b\xa6\x6c\x7e\x29\x91\xb3\xe7\x5c\xc5\x12\x48\x26\xa0\x3e\x05\x72\x59\xb5\xcb\x70\x62\x28\x78\x0c\xbc\x82\x75\xc3\x39\xf8\x34\x0e\x40\x2a\x66\x50\x32\xa4\xab\x65\x78\x27\xb1\xc3\x48\x1f\x75\x66\xd3\x69\x73\x5b\x82\xdb\x76\x28\xc0\x22\xb2\x12\x73\x0d\xb1\xe4\x7c\x9b\x2d\x9b\xc4\xd8\x1b\x23\x42\xd8\x9c\x6e\xaf\xc3\xe0\xb6\xde\x50\xd4\x84\xcc\xef\x11\x23\x8c\x8e\x2d\x24\x0d\xd5\x95\xdc\xef\x8b\x2f\xc5\x7b\x54\xff\x9a\x8a\x74\x11\x1f\x61\xf8\xa6\x52\xf2\x0e\xa0\x12\xc1\xad\xe3\xe2\x80\xec\xde\x29\x4c\x0e\x35\x71\x71\x90\x16\x2e\xc6\xa2\x26\x5e\x7e\x6f\x3f\x07\x04\xcf\x8a\xb1\xa0\x3e\x5c\xc9\x53\xe2\x92\x62\x91\xcc\xd4\xb0\x59\x0d\x5c\x20\x56\x8f\x94\xf9\xff\x0f\xe2\xab\x78\xcf\x9a\xe2\xc3\x8b\xcd\x49\x1e\x51\x8f\x23\xe9\xb6\x36\xf8\x80\x61\x5f\xc5\x60\x78\xe5\x12\xd7\x57\x7e\x09\x49\x7c\x11\x83\x45\x3d\x50\x81\xfd\x47\x37\xf2\x80\xec\x5e\x26\x7c\x45\x86\xb7\x8b\x70\xff\xfd\xfd\x73\x0d\x80\x9d\xf5\x60\xf2\xe3\x77\x21\x91\x84\x7b\xbc\x3f\x60\x4f\xb7\xf8\xca\x49\xee\xd3\x18\xb5\xe7\xd1\xf2\xb8\x3a\x10\xda\x0c\x85\x94\xb3\x39\xb6\x87\x1a\x57\x72\xdd\x64\x16\x8e\xcc\x27\xe2\x40\xa4\x5c\x76\x72\x5e\x7d\x55\xbe\xf3\x7e\x13\x5e\x3d\x9e\x0e\x34\xe3\x6c\x16\xe3\x4d\x77\x45\x9a\x55\x2f\x40\x74\xd0\x67\xa3\x1a\x3e\xd2\xa4\x8c\xde\xa4\x89\x5b\x10\xbd\xf1\x65\x6f\x4b\x7a\x41\x3c\x6a\x08\x8c\x64\x9f\xc9\xd7\xbc\x56\xab\xf6\x44\x35\x49\x12\x14\x19\x2a\x66\x70\xcb\x8b\x9c\x91\x7f\x8e\x1b\xc7\xb2\xcf\xce\x78\xd2\x8f\xbc\x3a\xfc\x2a\x50\xe9\x82\x13\xe7\xe0\x26\x37\x8e\x4e\xa7\x11\xd1\x51\xad\xaa\xa7\x19\xbe\xb8\x97\x46\x56\xc1\x0e\xbc\x7d\xe4\x6b\x19\xec\x82\x95\x1e\xf4\x6a\x8c\x68\xe7\xf4\x36\xe1\xb3\xeb\xed\xb2\xd0\x9b\x05\x75\xc9\x91\x4e\xad\x27\x96\xb5\x3e\x00\x61\xe2\x12\x99\x4a\xc5\x02\x6a\xea\x81\xec\x37\xc8\x13\x78\xf4\xcc\xfc\x46\x77\x00\x08\x79\x68\x59\x7d\xa3\x8f\xed\x52\xfa\x48\x09\x3a\xe4\xba\x10\x66\xc3\x1e\x3c\x7d\x85\x08\x09\x5b\xb4\x5c\x28\x01\x20\xf4\xaa\x69\xa2\x4f\x3e\xfe\xf1\xf7\x67\x98\x5a\xa1\xa3\x0e\x14\x08\x56\xf7\x6d\x15\x20\x73\x28\x78\x48\x7b\xe5\x3f\x71\x2d\xbd\x7d\x77\x9e\x31\x51\x01\x58\x8f\xd7\xdb\xdb\x13\x2f\x92\xc2\x75\x75\xac\x14\x86\xf1\x76\xc7\x90\x66\x1b\x01\x48\x39\x4e\x92\xff\xa3\xae\x6f\x8a\xfb\x2f\xaa\x2b\x7f\x4f\xbd\x0a\xd9\x1e\x75\x9a\x70\x2b\x3c\x70\x2b\x4d"}, -{{0xd0,0x0c,0x21,0x64,0x26,0x71,0x0d,0x19,0x4a,0x3d,0x11,0xcf,0xc9,0x0a,0x17,0xa8,0x62,0x12,0xe7,0xa0,0xe5,0x4b,0xaa,0x49,0xb0,0x16,0x9e,0x57,0xff,0xf8,0x3d,0x61,},{0xcf,0xe6,0xae,0x89,0x03,0xc6,0xc7,0x01,0xaa,0x30,0x46,0x95,0xc6,0x51,0xbf,0xd8,0x50,0x33,0x1f,0x9a,0xd4,0x81,0x63,0x3a,0xe3,0x70,0xc8,0x6d,0x7b,0xd1,0x3f,0xb9,},{0x15,0xc4,0x5c,0x19,0x42,0x97,0xe8,0x87,0x02,0x9f,0x49,0xd8,0xbd,0xf9,0xd6,0x10,0xdd,0x8c,0x34,0x79,0x9e,0x1e,0x92,0x30,0x26,0x9e,0x7a,0x58,0x92,0x89,0x38,0xcf,0x39,0x6a,0x02,0xcd,0x42,0x20,0x54,0x90,0x39,0x1e,0x1c,0x64,0x35,0x3f,0xb0,0x6b,0x9f,0x8e,0x9b,0x81,0x8a,0x9a,0x36,0x1c,0x20,0x4a,0x38,0x69,0x95,0xbf,0x3b,0x03,},"\x82\xf9\x78\x41\xb3\xba\x22\xdd\x9a\x44\x50\x83\x7e\xa7\xbf\x8d\x27\xa9\x73\x14\x70\xca\xbb\x0c\x20\x78\x03\x4b\xf2\x4e\x4c\x1a\x62\x90\xc0\x3f\x40\x02\xb8\x6f\xa0\x9f\x07\xb5\x20\x9f\x1f\x53\xd0\xec\xf4\xd9\xe9\x22\x3b\xec\x12\x5a\x95\x45\x51\xfe\x8b\xff\x71\x8f\x5e\x26\x48\x68\xe2\x07\xf7\x01\x19\x4e\x41\xde\x39\x97\x1f\xd3\x85\xf4\x9a\x4b\x4a\xdd\xa9\x11\xeb\xa5\x52\x59\xfc\x68\x36\x65\x32\x73\xf6\x56\xf4\xaf\x60\xb2\x06\x64\x95\x6d\x4f\x21\x35\xd9\x0d\x09\xe9\x03\x7d\x53\x66\xa0\x25\x34\x44\xe0\x22\xc7\x21\x2a\xf5\xfd\x4f\xcc\xd7\x42\x37\xd2\x88\x53\x38\xe2\xfd\x72\x15\x22\xde\x67\x63\xc2\x54\x90\x28\xc6\x23\xb9\xcf\x38\x7d\x23\x4a\xb5\xe7\xfc\xbe\x5a\x47\xc6\x85\xb7\x9e\x75\xa5\x7b\x09\x57\x40\x82\xa0\x22\x21\xdf\x64\xa2\xe8\x41\x61\x80\x87\xe7\x22\xa2\x1b\xac\x1b\xa4\xf0\xd7\xd8\x7b\xdc\x51\x0a\xaa\x8f\xbd\x10\x75\x7f\x6c\x02\x9c\xa8\x20\x37\x1f\xc7\x4c\x3b\xc5\x0b\xd8\x98\xc5\x5d\x81\x67\xf7\x3a\xda\x37\x7a\xec\xc9\x16\x29\xd6\x4c\x36\x0c\x2c\x24\x1c\x5c\xb4\x2e\x3a\x51\x8c\x5d\xab\xf0\xf4\x18\xb2\xa7\xf3\xd8\x2e\xef\xd9\x20\x26\xd3\x1e\x8b\x81\x60\x35\x8e\xae\x82\x1f\x73\x0e\xca\xfe\x7a\xce\x64\x7b\xff\x87\x41\xde\x2f\x6a\x13\x1d\x11\xc9\x69\xe9\x78\x7c\xfe\x6a\x2f\xab\x37\xbf\x8d\x1c\x7f\x4a\x2f\x36\x4d\x2f\x1a\x76\xef\x04\x6c\x18\x43\xe6\x3e\xc0\x0c\xf7\x92\x0f\xfa\xae\x56\x1e\x73\x70\xb7\x19\xfc\x16\xfc\xeb\xca\x3c\xfd\xfa\xba\x43\xf4\xf0\x90\xc4\x6f\x47\x73\x03\xa6\x60\xee\x88\xdd\x4e\x89\xbf\x14\xb9\xf8\x04\xb6\xfd\x49\x5c\xb1\x41\x27\x53\x47\x4a\x05\x6a\x0d\x89\x31\xcd\x9c\xcb\xd6\x4f\x8f\xcc\x7a\x31\x23\x46\x7c\x5d\x47\xf6\x90\x67\x9e\x88\x71\x28\x80\x93\x73\x4f\xd6\xa1\x32\x60\x38\x65\x81\x56\x41\x36\x96\x59\x4c\x13\x4d\x73\x88\x7f\x34\xee\x67\x60\x9a\xe8\xff\xb3\x26\x6c\x16\xd8\x7f\x15\x34\x5a\x47\x6f\x72\x95\x0c\x15\x87\x96\xa8\x8b\xbb\x44\x4f\x1a\xa8\x09\xca\xd8\x75\xb8\x5f\xb9\x15\x1a\x0e\x2e\xef\x2e\x00\xe8\x0d\x6b\x7a\x9b\xa4\x06\xc0\x51\x9e\xff\xdd\x94\x12\x62\x32\xfd\xf6\xf1\xe7\xb9\xbb\xc0\x36\x2a\xa7\x75\x16\xfd\xf9\x39\xe7\x90\x6a\xab\x01\x30\x71\x28\xcf\x82\x4c\x10\x2c\x09\xb9\x29\xc9\xb2\xd7\xaf\x8f\x85\xb7\xd7\xf9\xa8\x38\xb2\xae\xd0\xc6\x97\xe8\xbd\xfe\xe6\x6e\xe0\x16\xbb\x1b\xf3\x5e\xff\x6b\x2f\x7e\xf4\xb9\x1b\x1f\xc0\x4f\xac\x9f\x11\x6e\x2e\xdf\xf4\x0f\x95\xc1\x5b\x77\xc3\x1e\xe5\x22\xf3\x93\x7c\x7f\xa0\x04\x7d\x62\x25\xe0\xc8\xe5\x5e\x27\x8c\x81\x03\x91\x1f\xea\xb2\xb7\xf4"}, -{{0xdd,0x12,0x39,0x72,0xe6,0x28,0x58,0x4a,0xcc,0x46,0x29,0x3b,0x8e,0x4c,0xe2,0xb2,0xdd,0x46,0x9c,0xc4,0xed,0xe1,0x4e,0xf3,0x95,0x21,0xcf,0x08,0x37,0x35,0x85,0xb3,},{0x35,0x22,0xf7,0xae,0x59,0x6e,0xed,0xb2,0x17,0x03,0x5d,0x95,0x39,0x5e,0x44,0x8d,0xbd,0x6f,0xfb,0xf4,0x25,0x85,0xea,0xeb,0x30,0x70,0x26,0x54,0x1c,0x78,0xa6,0x51,},{0x89,0x65,0xa8,0x89,0xd5,0x4c,0xd8,0x07,0x6d,0x35,0xbc,0x2e,0x12,0xb0,0x09,0xd5,0x6b,0x07,0x04,0xc8,0x94,0xf9,0x12,0xa0,0xd1,0xd3,0x07,0x20,0xc2,0x32,0xfe,0x44,0x04,0xbf,0x30,0x09,0x54,0x1e,0x8f,0x32,0x83,0xe8,0x9e,0xa8,0x6f,0x67,0x8a,0xfb,0xdf,0x1c,0x21,0xc9,0x24,0xb2,0x3a,0x52,0xb4,0xca,0x6d,0x63,0xf4,0x8f,0xc2,0x03,},"\x2b\x28\x57\xf4\x52\x80\x17\x3e\x2e\x0e\xf9\xd5\x94\xe6\x08\x3f\x1d\xc7\xa6\x54\x92\x97\x5b\x83\x7d\xef\x6c\xad\xd8\xc8\x54\x50\x31\xee\x9d\x68\x36\x9a\x93\x93\xcc\x7b\x79\x2f\xeb\x98\x04\x0b\x21\xf1\xeb\x84\x66\x5f\x87\x85\x37\xce\x41\x2e\x9d\xb6\x80\xd2\x9f\xbd\x8f\xfc\x77\x31\xea\xe9\x1a\x20\xb4\x75\x48\x99\x62\x04\xfb\x06\xad\x74\x0e\x78\xf0\xfc\x59\x0b\x67\x91\xdc\x7a\x0f\x26\x59\x28\x6c\xc1\x6d\x02\xc5\x11\x7b\x56\x58\x36\xb4\xb8\x73\x8c\xf4\x0e\x28\x5c\x69\xc5\x0e\x41\x29\x11\x29\x23\x67\x35\x2d\xfd\xae\xd9\x98\x2d\x0f\x89\x9a\x23\xc0\xab\x51\x81\x2b\x3e\xc6\x78\xf6\x88\x2e\xa4\x27\xcd\xc9\x3a\xb4\xb2\x48\x24\x37\x70\x54\xaa\x25\xd8\x22\x46\x65\x33\x40\x07\x8c\xf1\x1d\x14\xa5\x1f\x0e\x68\x6d\x7e\x01\x8b\x36\x74\x16\x68\xfc\xe7\x45\x8d\x16\x92\x93\x36\x1d\xd1\x6b\x3d\xeb\xbe\xd1\x9e\x1b\xef\x7c\x36\x93\x4e\x20\xf3\x3a\x09\xad\x3e\x82\xb5\x3a\xb4\xe9\x4c\x25\x5d\x04\x18\x98\xb9\x77\x37\xdf\x99\x58\x4a\xf1\x4e\x40\x40\x58\xd0\xc9\x3b\xca\xe7\xbb\xbc\x06\x39\x5a\x2a\xef\xbd\xef\xa7\xb2\xed\x17\xce\xbd\x15\x13\xfa\x39\x0f\xe9\xa9\xb0\xce\x68\xce\xcc\x2b\x9e\x12\x9b\x7a\x29\xf4\x9b\x6d\x18\xc2\x8b\xac\xd3\xaf\x39\xdc\x39\xca\x97\x2f\x0e\x0d\x06\x85\x5d\x57\xc2\xb5\xfc\xac\x2f\x79\xcb\x8c\x05\x79\x9e\x4f\x65\x73\x46\x68\xda\xd6\xaa\x7a\x43\xa1\x18\x56\xe2\x3b\x1e\x73\x2d\x00\xe5\xfe\x38\x85\xb7\xda\xd4\x2e\xc1\x8a\xc8\xe0\x96\xa0\x80\xf7\xd5\x50\x70\xfd\xcf\xf6\x07\xbc\x0b\x85\x2d\x8a\x08\x0d\x2a\x74\x05\xd5\x94\x14\x69\x5f\x2e\xb7\xfb\x0a\xca\x23\xc8\x63\x57\x42\xf8\xae\x57\xf1\x37\x80\x31\x6e\x28\x08\x72\x37\x4e\x69\x29\x59\x8d\x02\x8a\x33\xc0\x5d\x83\x1c\xda\xbd\x02\x94\x93\xc3\xcc\x85\x9f\xff\x1a\x67\xd5\x62\x16\xf0\x2a\x22\x95\x66\x53\x65\x88\x7a\x35\x0a\x80\xaf\xaa\x0c\x36\x7a\x74\xd3\x70\x1a\xe8\x8f\x59\xd8\xa9\xd3\xa1\xdc\xe0\xcf\xd2\xea\xbe\x2a\xf5\x06\x5a\x1c\x7f\xca\x4a\xad\xcf\x8e\x51\xe7\x56\x12\xa1\x37\x1b\x4d\xc8\xff\xc0\xc0\xb9\xc4\xfa\xdb\x2f\x08\x1e\x2e\x03\x2d\x96\x81\x8e\x55\x73\x7a\xdd\xe3\xe1\xac\x12\x1f\x56\xcc\x86\xfb\x58\xa0\xa5\x82\x69\x2f\x62\xce\x58\xac\xce\x17\xaa\xfe\xc7\xbc\xb7\xe4\x4f\x83\x92\x58\xcd\x4a\x85\x1f\xc0\x13\x44\xee\x9f\x1b\xd0\x3e\xb9\x43\x44\xf4\x77\x86\x93\xc1\x71\xdd\x28\x92\xb2\x42\x6a\x88\x29\xab\x0c\xfe\x33\xa7\xd4\xa3\x6e\xb4\x01\x7f\x7f\xcf\xd2\x41\x34\xab\x8a\x45\xf2\x37\x17\xcd\x13\x8a\xa6\x00\x01\x72\xe3\x7b\x40\x64\xdc\x9b\x6d\x1e\x1e\xf3\xaf\x84\x97\x1d"}, -{{0x33,0x35,0xea,0x92,0x81,0x17,0xcf,0xee,0xfb,0xee,0xae,0x14,0x60,0x03,0x88,0x1b,0xdc,0x88,0x89,0xd6,0x58,0x0e,0xed,0x13,0x52,0x37,0x08,0x20,0xad,0x1f,0x58,0x4f,},{0xcb,0x20,0xd4,0xfd,0x75,0x61,0x84,0x80,0x13,0x11,0x1c,0x3e,0x97,0x61,0x7f,0x34,0x18,0x1d,0x2e,0x7f,0xbc,0xf1,0xbb,0x2a,0x2c,0xd2,0xe8,0xc1,0x77,0x5b,0x8b,0x03,},{0xf7,0xc3,0x9f,0x92,0x47,0xd2,0x2f,0x01,0x89,0x99,0x24,0x7f,0x0e,0x00,0x05,0xcd,0x63,0x07,0x6c,0xcf,0x2f,0xee,0x41,0x63,0x42,0x1f,0x86,0x40,0x7a,0x41,0x69,0x8c,0x40,0x58,0x16,0x64,0x73,0x51,0xc0,0x4e,0x93,0xb5,0x44,0x15,0xb6,0x2f,0xc0,0x3f,0xc8,0xc2,0x5e,0x20,0xf7,0x54,0x1d,0xab,0x03,0x19,0x7d,0xc9,0x00,0xb2,0x9c,0x0c,},"\x0f\xa7\xf6\xa6\xfc\xa9\x81\x42\x9b\x57\x2a\x67\x04\x87\x1b\xed\x14\x0d\xab\x93\xee\x19\x92\x00\x6e\x9a\x3b\xb2\xe6\xcc\x9a\x09\xd4\xc9\xcf\x17\x06\x6b\x32\xff\x7e\xf5\xb6\xb2\xe7\x91\x11\x78\xed\x74\x62\xc4\xc1\x75\x60\x31\x71\xca\x61\x36\x68\xb3\xbe\x19\x3d\x94\xc3\x52\x1e\x58\x89\x13\xb5\x94\x8b\x55\x0b\xe9\x9d\x82\xd9\x66\x19\x7d\x71\x0a\xcf\xd9\x59\x14\xcf\x3e\x19\x75\x36\xe8\x3e\x68\x23\x0d\xc3\xd6\x7e\x67\xdc\xdb\xde\xe0\x4f\x0d\x9c\x48\x02\x37\xec\xd2\x8f\x74\x33\x8d\xb5\xf3\xf6\x97\xd3\xd0\x7f\xf3\x36\x13\xbb\xce\x54\x2a\xcc\x9a\x7f\xed\x5d\x12\x49\x0b\x9b\xfe\x1d\x10\x95\x40\xf8\x63\x80\x0d\xd3\x56\xda\x84\x1a\x45\xa3\xcd\x8a\x08\xa9\x45\xbf\xa3\xaa\x98\xe1\x71\x23\x12\xc4\xc0\xf0\xd9\xdd\x64\xf6\xef\xcf\x73\x6b\xd9\x7d\xea\xfc\xa9\xdc\xaa\x3f\x06\xd8\x7f\x2e\xd7\x2a\xeb\x6a\x94\xf3\x28\x00\x00\xc4\xbf\x72\x8a\x01\xc1\x86\x2d\xaf\xd9\xfc\x5c\x7d\x5a\x46\xec\x7d\x3a\x87\xaf\x59\xa1\x1d\x87\xf7\xff\x84\x40\x7d\x37\x01\x0e\x1d\x94\x6c\xf2\x25\xd6\xb3\xb1\xed\xee\x2e\x8b\xbf\x1e\x07\x9e\x47\xfb\x1f\x66\x66\x93\x94\xfb\xf2\xfa\x68\xfc\x56\xfc\x89\x82\x0a\x68\x09\xc2\x51\xdd\x62\xf5\xb8\x65\xc5\x47\xb1\x4f\xbd\x3a\x19\x50\x42\x44\xff\xbc\x7e\x52\x40\xf8\x8d\x43\x60\xf9\xca\xca\xaf\x5f\x82\x43\x3d\x33\x44\xfc\xae\xe0\xac\xde\xb7\xbe\xb9\xc0\xb3\xc7\x69\xea\xc9\x20\xef\x4f\x09\xab\xc2\xa2\x09\x55\x12\x04\x59\x43\xec\xcc\x53\xb1\xc0\x3e\xd2\x4e\x56\x7f\x3d\x7a\x71\x97\x7c\xab\x98\x40\xce\x89\x8e\xe5\x8e\xd5\xc7\x3f\x6a\xde\xa8\x23\x39\x4c\x5c\x8e\x36\x58\xa6\xbf\x5a\xcb\xbf\x00\x55\x99\x2c\x31\x2c\x26\xc7\x9c\x5c\xfb\xea\x38\x60\xb8\x76\x4a\x6d\x8f\xfe\x44\x91\xf8\xa5\xb8\xa2\x15\xe0\x11\x7a\x9a\x68\x16\x4a\xee\x25\xf8\xc0\xbb\x38\x11\x95\xb2\x40\x0b\xcb\x46\x44\xeb\xce\x1c\xde\x5a\x9a\x26\x58\x2c\xab\x9d\xc7\xf4\x3c\x33\xea\xe3\x50\xdb\x65\xaa\x7d\xd2\x2a\x07\x9b\xdd\xdc\xf5\x6d\x84\x8d\xeb\x0c\xfa\x50\xb3\xbd\x73\x2d\x9d\xa9\xe8\xd8\xab\x79\xe9\x34\x69\xde\x58\x02\xb6\xdf\xf5\xac\x2a\xa8\x48\x2b\xb0\xb0\x36\xd8\xf9\xd5\x95\xb8\xea\xd9\x4b\xb8\xd7\x41\x8e\x2e\xa4\x31\x92\xef\xcb\xfc\x05\xc4\x67\xbd\xe0\xa8\x68\xa5\x16\xa7\xc1\x4a\x88\x9b\x72\xc5\xb7\x3e\x7d\x85\xc2\xba\xe9\x02\xe4\xe6\x8d\x1f\x3c\xea\xb2\xb2\x77\x3a\xf5\xbb\xae\xe6\xa0\x0d\x08\x06\x3e\x78\x33\xcd\x4e\x29\x53\x47\xe5\x8f\x5d\x1b\x33\x97\xf6\x40\xc1\x59\xcc\x60\xa6\x74\xa2\x27\xb4\xcd\x8c\x10\xf1\xdb\xae\xd5\x16\xcc\xac\xdd\x29\x5f\x11\xb0\x81\x47"}, -{{0x32,0xa1,0x88,0x3e,0xff,0x57,0xa3,0xa7,0xec,0xdb,0x31,0x02,0x21,0xee,0x83,0xc4,0xde,0x92,0xb7,0x22,0x15,0x96,0x13,0xec,0xf8,0x16,0xe3,0x82,0x43,0x7b,0x60,0xb9,},{0x82,0xdd,0x1a,0x03,0xe5,0x85,0x20,0x62,0xba,0x4a,0x8b,0x6b,0x3b,0x93,0xc5,0xe9,0xc4,0x3f,0xf6,0x99,0x5b,0xd2,0xaa,0xc7,0x26,0x06,0xfa,0xc8,0x58,0x02,0xc6,0x82,},{0x83,0x09,0xcb,0xe7,0x2f,0x80,0x4b,0xd9,0x52,0x1d,0xef,0x5d,0xad,0x4d,0x8b,0xc1,0x38,0x86,0xb1,0xd4,0xf6,0x62,0xc9,0xbb,0x5b,0x97,0xba,0x47,0x90,0xf4,0x4b,0x80,0x1f,0x31,0x95,0xea,0xd0,0xd4,0xdd,0xb6,0x60,0x81,0x8e,0xcb,0xf9,0xa6,0x83,0xca,0xcf,0x85,0xf1,0xdc,0xc9,0xe8,0x2c,0x09,0x11,0x6d,0x73,0x36,0x58,0x09,0x1a,0x00,},"\xed\x2b\x12\x3b\x5d\xd7\xf5\xe7\x18\xe0\x26\xc7\x9c\xfa\x61\x11\x92\x49\x02\xd1\x89\xa4\x06\xef\x2b\x2e\x56\xa9\xee\x55\x73\xa7\x6d\xdd\x1d\x06\x29\xeb\xcd\xec\xf2\xaa\xa7\x4e\x84\xfc\xd0\x20\x8f\x14\xee\xa2\xe1\x71\xe7\xc8\x60\x8b\x81\x8f\xef\xf4\xdb\xea\x52\xdb\x35\x42\x27\xd0\x23\x25\x0b\x1f\x01\xcb\x4c\xc8\xc5\x21\x32\xa9\x8d\x4a\xcf\x55\xa5\x4f\xee\x81\xe0\x94\xae\xd6\x6f\xa0\xd6\xb6\xa2\x00\xb6\xb8\x74\x14\x40\x22\x78\x53\x8b\x90\x52\x9a\x8c\x60\x3d\x92\x7e\xdd\xda\x97\xbc\x4b\x8c\xb9\x5d\x04\xb5\x33\x7f\xa2\x2c\xea\xfc\x8b\x34\x0c\x46\xfe\xf6\x71\x98\xd1\xfd\x98\xd8\x9c\x65\xcd\x08\x9e\x23\xf5\x3d\xbd\xca\x96\x77\x98\xb5\xcd\x92\x32\x05\xad\x51\x1e\xdf\x70\x6f\x12\x25\xf4\x64\x8c\x98\x5e\x00\x9e\xf8\xa2\xf6\xa0\x11\x7c\xdb\xe1\x4e\x75\x31\x2d\x8a\xc1\xf0\x3d\x04\x6b\x37\xcd\xee\x7d\x69\xc0\xf2\x5c\xcf\x18\x14\x5a\x68\x8a\x8b\x3c\xa8\x87\x5f\xe8\xd9\x0b\xaf\x86\xd4\x39\x69\xe4\xd6\x10\x21\x4f\x1a\xc5\xdb\xba\x87\xa1\xef\x10\x37\x7e\x40\xd7\x80\x6f\xd9\xd2\x34\x57\xfc\x9d\xf2\x98\x99\x23\x9f\xd1\xd2\x78\x84\x96\x81\xa9\x43\xad\x9c\x91\xfd\x1b\xbd\x92\xb7\x3c\xb1\x77\xa8\x78\xf9\x05\x9e\xe0\x7a\xf7\xa8\x73\x16\x13\xe3\x3d\x59\xdf\x3d\x97\x79\x60\x79\xd5\x63\x1e\xd8\x5e\xb2\x24\x51\x06\xa5\xff\x6a\x2b\xca\x40\xdf\x5c\x6e\x87\x47\x3b\x2c\x08\xc2\x21\x2f\x56\xfc\x29\x33\xa9\x69\xa3\xc9\x58\xd3\x7c\x53\x43\xba\x27\x60\xc8\x13\xa7\xa5\x16\x5d\x23\x1c\x5f\xea\xae\x62\xb7\x55\xdf\x49\xfe\xca\x80\x04\x1a\x65\x35\xf7\xe0\x3b\xc4\x8e\x5f\x27\xf9\xbe\x26\xef\x53\x67\x3e\xb7\xc3\x7a\x2b\x64\x74\x4a\x6c\xf1\x7e\x88\x77\x34\xae\x01\x0b\xf4\x0e\xea\x03\xcd\xa2\x12\xf5\x12\xfb\xa0\x58\x59\x47\x17\x96\x40\xbc\xc4\x54\x4b\x8d\xeb\x4e\xad\x12\x9b\xc3\x32\x28\x00\xad\xf9\x88\x18\xf9\x95\x74\xbe\xfd\x9b\x00\x16\xd4\xee\xc8\x1a\x8e\x78\xdc\x3a\x2a\xf1\x3c\xab\x01\x64\x9a\xe2\xe3\x3d\x51\x6b\x9d\x42\x08\xad\x66\x13\xd8\xe2\x78\xc3\x93\xba\xa8\x82\x34\x0e\xf4\x61\xff\x4f\x94\x42\x3d\x55\xcf\x3c\xed\xd2\xa6\xb5\x6e\x88\x36\x55\x31\xdd\x29\xd6\x82\x73\xad\xbf\xe3\x69\x40\x2e\x6a\x7c\xee\x05\x3d\xa1\xf1\x00\x54\x00\x91\xa0\x09\x29\x25\x29\x83\x44\x90\x24\xb1\xc3\x39\x11\x10\x65\x00\x82\xf0\xe7\xdf\xdd\xb8\xed\xc2\x04\x2f\x3c\x17\x13\xc6\x94\x4b\xa5\x14\xee\x74\x07\xd3\x2b\xf0\x6c\x85\x8e\xfe\xc4\x2a\x78\xbe\xe9\x77\x46\xe5\xb4\x87\x91\x41\xa1\x3d\x9f\xc5\xcb\x12\x3b\x78\x32\x73\xb8\x4d\x57\xad\x35\x26\xb7\xda\x3c\x68\xb8\x39\xef\xd2\x3f\x5f"}, -{{0x22,0xec,0xef,0x6d,0xab,0xe5,0x8c,0x06,0x69,0xb8,0x04,0x66,0x49,0x73,0xe4,0x57,0xc0,0x5e,0x47,0x77,0xf7,0x81,0xc5,0x25,0x22,0xaf,0x76,0xb9,0x54,0x81,0xa9,0x14,},{0xd4,0x78,0x40,0x10,0xef,0x04,0x03,0xed,0xdc,0x5a,0x62,0xd5,0xd4,0x5b,0xb2,0x43,0xb8,0x0b,0x4b,0x9d,0x69,0xc3,0x9c,0xa3,0x87,0xc6,0xf5,0xcb,0xa0,0x28,0x64,0x0f,},{0x5d,0x0d,0x2a,0xf6,0x78,0xb3,0xd1,0xb6,0x77,0x51,0x6d,0x08,0xa7,0x9a,0xaf,0xd3,0x6e,0xc6,0x7c,0x14,0xca,0xf5,0xbc,0xda,0xae,0xaa,0xcc,0x51,0xa1,0x4f,0xb8,0x05,0xcf,0x29,0x04,0xe8,0x72,0x1d,0xb2,0x71,0xb2,0x0d,0xf7,0x09,0xbe,0xe1,0xa4,0xfb,0xfe,0x62,0x56,0x50,0x73,0xb2,0xa7,0xe9,0x42,0x72,0x44,0x61,0xf9,0x27,0x93,0x0d,},"\xc5\x35\xc1\x3d\x77\x9f\xc0\x98\x59\x73\xd6\xbc\xd5\x52\xd8\x17\x34\xe9\x2b\xdf\x10\x99\x4b\x00\xcd\x4d\x53\xce\x36\x5f\xad\x8c\x7c\xfa\x96\x20\x6a\xdb\x62\xd4\x56\x7b\xe5\xe4\x66\x31\x32\x38\x53\xe3\x8c\xe4\xbd\xc1\x6d\x7b\x8f\x63\x2a\x3a\xd9\xe0\x26\x19\xef\xf3\x71\x74\xea\xc3\xf0\xbf\x2f\x7a\x75\x17\xd4\xb8\x2d\xe6\xaa\x1a\xf0\x06\x38\x19\xd5\xe1\xf9\x27\x8f\xb4\xf2\x4c\x8c\xc0\x02\xaf\xb1\x5f\x33\x4c\x04\xfa\xdb\x00\x30\x30\x13\xc0\x16\x67\xf4\x93\x2a\x6c\x4b\x97\xd3\x9c\xd4\xa4\x59\x85\x06\xc0\xbd\x74\x0e\xa9\xf1\x16\x96\x35\x7d\x7d\x17\xfe\x4d\x75\xf9\xd7\x42\x41\xa7\xaf\x71\xf9\xd8\x69\xef\x6c\xd6\x95\x68\x7c\x03\xfc\x34\xad\x65\xa6\x8a\x48\x88\xa1\xa7\x41\x26\xcb\x55\xcf\x7d\xa9\xcb\x4a\x67\x17\xf6\xeb\x88\x48\x40\x89\xd2\xc5\x18\x9a\xe3\x81\xf2\x5e\x7b\x3b\xc3\xb2\x3d\x0c\x9d\x9f\x9c\xdb\xbe\xec\xfd\x1e\x72\xa0\x5e\x67\xbb\x48\x3a\x97\x64\xd9\xfc\x75\xad\x69\xe4\xab\x12\x70\xfb\x40\xf3\x95\x8f\xea\x4d\xa5\x59\xb4\x39\x80\xb2\x46\x81\x31\x3e\x85\x91\xe6\x85\x46\xa3\xbf\x76\xee\x34\xb3\x39\x70\x92\x95\xa8\xd4\x6f\xb2\x43\x2d\xda\x2f\x22\x18\x12\xdf\x69\x28\x95\xe6\x7c\xb2\x9c\xbf\x6f\xf4\x50\x2b\x43\x9a\x4e\x9e\x43\x63\x9e\xc0\x67\xbc\x90\xae\x81\x4a\x29\x3a\x7b\xd4\x69\x68\xe6\x56\x78\x76\x42\x30\x0a\x0f\xf2\x69\x7e\x33\x13\xf6\xa4\x18\xd3\xd1\x2a\x5f\x7c\x51\xa4\xc5\x7b\x63\x38\x5f\x2d\x2a\x21\xd5\xd1\xd7\x63\xfc\x8d\x1b\x93\xc1\x34\x35\xf9\xe4\x7e\xe7\xa4\x25\x98\x0a\x6a\xe6\xf1\xa9\xd0\x07\x60\x74\x76\x78\x3c\x6d\x0c\x78\x87\x38\x0f\x86\x8c\x65\xb3\x82\xd4\xcc\x8c\x04\x47\x8b\xbd\x79\xa1\xd9\xa9\x64\xb7\x81\x71\xd6\xbc\xf0\xb8\xee\xc5\x0a\x06\xa4\xea\x23\x4d\x1c\x23\x46\x5d\x3e\x75\xb8\x8b\xc5\x40\xda\xde\x74\xed\x42\x67\x5b\x07\xf7\xcf\x07\x82\x11\xe9\x07\xf8\x6d\x0d\xc4\xb9\x78\x62\x3d\x9f\x08\x73\x8a\xf9\x28\x69\x5e\x54\x2e\xc2\x98\x0e\x55\xa1\xde\x49\xe2\x52\x47\xfa\x0a\x09\x67\x81\x18\xe3\x93\x0b\xc4\xd2\x4b\x32\x14\xd6\xdc\xfb\x6e\xbd\xf4\x90\x6c\x92\x8d\xeb\x37\xbb\x9b\xa2\x9c\x8d\xe1\xbb\x94\x18\xdb\x71\x8b\x28\x53\xba\x57\xad\x8c\xae\x46\x77\xad\xdf\xd1\x8b\x6c\x7e\x8c\x24\x26\x21\xb3\x5c\x7f\x0e\xfe\x8d\xd5\xeb\x26\xff\x75\xfd\x57\x48\xb1\xd7\x83\xf6\xd6\x8a\x7d\x9d\x56\xda\x2c\x1a\x97\x8a\xc2\x5f\x84\xfb\xb2\xbe\x55\x68\xd9\x1e\x70\x93\x82\x21\xc1\x02\xae\xe6\x04\x09\xbc\xbe\xc0\xc8\x2e\x12\xdd\xb4\x25\xee\xb6\xec\xd1\x15\x51\xec\xd1\xd3\x3d\xda\xe8\x71\xae\x0c\x8f\x24\xd0\xd1\x80\x18\x73\x2b\x5e\x0e"}, -{{0x8d,0xe8,0x63,0x30,0xb2,0x56,0x09,0x5e,0x11,0x14,0xb6,0x52,0x9b,0xed,0xce,0x18,0x2c,0x16,0x6f,0x67,0xa9,0x15,0x39,0xce,0xbc,0x4b,0xec,0x25,0xad,0xd7,0xa4,0xa9,},{0x33,0xcb,0x05,0x4b,0x55,0xbb,0x79,0x0a,0xc0,0xf3,0xaf,0xdd,0x9a,0x6e,0x7c,0x05,0x0e,0xfe,0x90,0x06,0xc2,0x4f,0x60,0xb8,0x04,0x4f,0xd0,0x8a,0x5c,0x10,0x6c,0x11,},{0x6d,0x01,0xd2,0x37,0xdd,0x2b,0xb4,0x18,0x8d,0x29,0xbf,0xde,0xc3,0x87,0x97,0x6a,0x71,0xbe,0x7a,0xdf,0xbf,0x9e,0x23,0x63,0x9b,0x21,0x6d,0x0a,0xa0,0xc1,0x19,0x32,0x23,0x5e,0xdc,0xcb,0x3b,0x42,0xad,0xcd,0xb6,0x29,0x1a,0x0d,0x29,0x9a,0xed,0x64,0x8d,0xe8,0xb1,0x95,0x79,0x49,0xb9,0xd1,0xcf,0x2e,0x50,0x49,0x30,0x30,0xa4,0x0f,},"\x39\xe6\x1e\x0e\xcc\xec\x92\x9c\x87\xb8\xb2\x2d\x4f\xd1\x8a\xea\xbf\x42\xe9\xce\x7b\x01\x5f\x2a\x8c\xac\x92\xa5\x24\x48\xa4\x2f\xed\x4c\xba\xdc\x08\x5b\xbb\x4c\x03\x71\x2a\xe7\x2c\xfc\xb8\x00\xb9\x78\x35\x06\x69\xb0\x99\x00\x84\xf2\xda\xb7\x6e\xca\x60\x6d\x1a\x49\xfc\x55\xc5\x29\xe1\xe7\xda\xdf\x39\x12\x2d\xd5\xbd\x73\x38\x93\x85\x8b\x05\x23\xef\x62\xdf\x4f\x13\x4c\xf6\xc2\x6e\xed\x02\xfd\xbc\xb3\x0c\xe4\x74\xb1\xad\xa3\xf0\x60\x76\x9f\x93\x4b\xbe\x68\x6c\xce\xbd\x60\x88\x3e\xce\xc9\xce\x3f\xfb\x8a\xc4\xa0\x67\x8c\xdc\x5b\x00\x5a\xe3\xdb\xa7\xe4\xfe\x8b\xc0\x45\x73\x99\x57\xd8\x49\xf6\x9c\x14\x74\x05\x7b\x42\x8c\x54\x25\xf3\xcc\x25\x16\xe8\xbb\xe3\xbe\x81\xaf\xd4\xe7\xb5\x75\xab\xe8\x8c\x87\xf2\xf0\x3b\x56\xf6\x9f\x9e\x3b\x61\xb3\x78\x81\x20\xda\xa4\x95\xef\x0e\x50\xeb\x97\x0a\x64\x5c\x13\xd2\x13\xc7\xcf\xb7\xd0\xad\x55\x5c\x92\x0a\x1e\x5d\xbc\xb4\x67\x97\xd9\x39\xfe\x04\x01\xf5\x47\xbf\xd1\x75\x43\x22\x1a\x53\x01\x0d\xe0\x1f\x25\xb6\x45\x19\xc8\xf0\x39\x63\xe4\xb9\xca\x58\xb0\x11\x36\x27\xc0\x5b\x96\x08\xee\xaa\x7b\x9a\xe6\x30\x5c\x96\x18\x81\x60\x00\x0e\xe3\xa7\xad\xe9\x6e\x0b\x4b\xde\x9d\x0e\xd6\xa0\xce\xd7\x65\xd7\x86\x84\x0a\x48\x17\x5a\x6e\x09\x0a\x38\xaf\x6a\xde\xaa\x14\x86\xa9\xcb\x5c\x8c\x8c\x92\x23\xee\x0a\xe4\xc6\xc0\x26\x91\xa3\x54\x7e\x32\x58\x2a\x5b\x70\x59\xd2\xee\x66\xfa\x9c\xd9\x65\x61\x5c\x31\x5b\x47\x6f\xd8\x61\x27\x9c\xd1\xdd\x76\x07\x74\x3f\xc5\x56\x12\x96\x31\x2f\x11\xe4\x65\xca\x40\xbc\xe3\xcf\x0b\x1f\x1d\x5a\x30\xaf\x60\x87\xde\x4d\xe9\x6c\xe4\x39\x65\xa4\x6c\x4f\xcc\xa1\x5f\x28\x11\x49\xb5\xc1\xa0\xc8\x8f\xdb\xf2\x74\x09\xa1\x34\xed\x4f\x1f\xb7\x30\xfa\x19\x18\x16\xea\x78\x4d\x98\x6c\xc9\xec\x4b\x69\x44\x02\xde\x1d\xcc\xa9\xcc\xc6\x4f\xbd\x07\xb0\x7e\x54\xe9\x31\xde\x82\x7a\x84\x24\x60\xca\x0b\xf6\xb0\x4e\xbb\x57\x1f\xa7\x77\x87\xe3\x88\x4b\xe2\x2f\x1e\x40\x2c\xf2\xb8\xa9\x6a\x5d\x39\x77\x0e\xc4\xa8\x43\x03\x61\x42\xa0\xbe\x97\x0b\xb1\xab\x16\x5a\x63\x74\xdc\xf4\x3d\xeb\x8b\x98\x30\xb2\xc4\x9d\xb9\xcd\xfe\x4b\x52\x42\xe3\x6f\x95\xe0\xc3\xe0\x77\xe8\xd2\x38\xfa\x6a\x8a\xc0\xd5\x86\xbf\x61\xb8\x24\x8f\xb3\xa7\x9a\x27\x0a\xb2\x2b\xe8\xa9\xda\x05\x5f\xf3\xd5\xbb\x2d\x1c\xa9\xbc\x25\xf7\x01\x4b\x96\x40\x77\x19\xde\x34\x4c\x3e\x73\xb8\xc1\x14\xf7\x92\x07\x5a\x5c\x22\xfd\xd4\x16\x15\x4d\x34\x94\xec\x3f\x02\xfb\x11\x2e\xe5\x73\x7f\x70\x70\x4c\x1b\x6b\x07\xea\xcb\xf9\x45\x62\xca\x7b\x90\xdd\x84\xd9\x8c\x3e\xdf"}, -{{0xba,0xb5,0xfa,0x49,0x18,0x7d,0xa1,0xca,0xb1,0xd2,0x91,0x90,0x00,0x19,0xe6,0xcb,0xaf,0xec,0xcd,0x27,0xbf,0x7e,0xcb,0xf1,0x26,0x2a,0x70,0x05,0x16,0xe7,0xc2,0x9f,},{0xf6,0xfb,0x19,0x85,0xec,0x59,0x1f,0x69,0xe3,0xba,0xc8,0x07,0xb2,0xea,0xbf,0x26,0x39,0x90,0xcd,0xfa,0x09,0xb1,0x78,0x09,0xe4,0x8e,0x38,0x5d,0xa0,0x65,0xec,0x21,},{0xe3,0x16,0x03,0x8d,0x6a,0xa1,0x5b,0x1c,0x1b,0x61,0xc1,0xa1,0x6b,0x36,0x90,0x4f,0xe8,0xa2,0x89,0xc8,0xd6,0x02,0xbe,0xcc,0x51,0x4d,0x99,0x22,0x00,0x86,0xb2,0x67,0x85,0x9f,0x5b,0xf6,0xe9,0xc0,0x86,0x35,0x59,0xac,0x62,0x3a,0x56,0xd7,0x53,0x23,0x44,0xe8,0xd2,0xf2,0x8b,0x3f,0x9d,0xf9,0x20,0x89,0x70,0x8b,0x1b,0x05,0x90,0x08,},"\x5c\xf8\xff\x58\x7e\x52\xcc\xcd\x29\x84\xf3\x47\x91\xee\x68\x43\xe7\x70\x17\xc3\xb5\x5a\xd4\x5c\x44\x45\x09\x65\xb7\x5d\x83\x6e\x78\xfb\xd7\xa1\xd1\x72\x9e\xff\x6d\x6d\x34\x0a\x90\x3f\x3c\xf1\x7d\x9e\x2a\xec\xaa\xff\x2a\x32\x1f\xcd\xde\x0a\xbc\xfb\xbc\xbc\xc0\x9f\x40\x86\xf8\x12\xc4\x6e\xfb\x01\xb7\x83\x43\xaf\xbe\x48\x30\x9f\x91\x74\x78\x45\x5f\x32\x00\x0c\x6a\x69\xf7\x9f\xe2\x11\xb9\x9f\x03\x7f\x59\x56\xd7\x22\x75\xa7\xfe\x7b\x45\x29\x6b\x5f\x73\x9a\xa4\x51\xff\x05\x75\xbc\x70\x58\x85\xaa\x56\x31\xb0\xd0\x85\x0b\xc2\xb1\x2c\x41\x92\x43\x5a\xe5\xd2\xf5\x2b\xc5\x43\x86\x49\x7c\x4a\x24\xb8\xb6\xdb\x51\x6b\xe0\x9d\x8c\xcf\x1e\xca\x78\x5b\xde\x97\xe9\xbe\x1a\xc0\x64\xf0\x94\xe2\xaf\xcc\x30\x7c\x0e\x06\xb4\xc5\x64\xcd\x9a\x9a\x95\x30\x5b\x37\xb8\x1f\x43\x46\x11\xdc\xa5\x5c\xaa\xa0\x31\xe8\x84\x95\xd5\xdc\x5a\x04\xff\x5f\xaf\xdf\x0a\x82\xa0\xc0\x3a\xff\x1b\xfb\xf4\xff\xeb\xae\x71\x82\x4e\x35\xe7\x51\xb0\x92\x70\x00\x76\x69\x86\x0b\x58\x00\x35\x65\x9e\x23\xac\xe7\x6b\x3b\x36\x9f\xa3\x06\xf2\xbe\xd9\x57\x99\xfa\xfa\xbc\x2e\x69\xc1\x41\xbe\xb0\xba\xca\xc7\xea\xa3\x47\xe7\x7b\xe5\xaf\x3f\xcd\xbe\x7b\x36\x4a\x7f\x9a\x66\xd5\xe1\x7a\x07\xdf\x62\x02\xfd\x98\xc1\x4b\xfe\xe2\xca\x6f\x07\x45\x65\x1f\x0c\x85\x50\xf9\xff\xff\xca\xfb\x96\xff\xb3\xf1\x03\xe6\x52\xe7\x8f\x53\x91\x6c\xd6\xf1\xdd\x05\xb3\xfe\x99\xb3\x42\x01\xb0\x7e\xac\x26\x52\xf5\x25\x35\x71\xfd\x38\x22\xc6\x95\xd2\x65\xc7\xdf\xdd\x6c\x6b\x14\xa8\x0b\x6e\x87\x18\x3e\x6e\x03\x2e\x5f\x24\x01\xcd\x23\x8c\xdd\x37\x69\xbb\x6e\x39\x08\x23\x43\x8f\x56\x73\xea\x9a\x47\x9e\x5c\x63\xfe\x07\xa0\x7f\x4e\x14\xf5\x77\x57\xc4\xd7\xd2\x2b\x35\xd7\x1c\x44\xea\xad\x48\x73\xc8\xec\xa6\xf6\xb2\x1d\xcf\xa9\x55\x20\xff\x96\x14\xab\xf7\xa0\xe1\x88\x53\x09\xf2\xce\xd3\xbc\xdf\xc3\x19\x36\x3a\x2d\xa4\x6d\xed\x79\xa5\xcc\x7b\x6f\x69\x38\x3f\x94\xab\x35\xc2\x50\x62\x9c\xb9\x15\xd6\x67\xb6\x28\x11\x86\x75\x48\x95\x80\x3e\x4b\x95\xe7\x41\x82\x89\xa6\xac\x3b\xcd\xb6\xe1\xe7\xf6\xf1\xdc\x38\xe7\x7d\x28\x19\x14\xcc\x40\x4f\x97\xcf\xf1\x4f\xb2\xc4\xfd\x81\x41\x2d\x10\x1c\x1b\xfb\x36\x8c\xe5\x93\x11\xe8\x92\xa8\xb9\xcd\xca\x86\x93\x6f\x3b\xca\x7e\xc7\x91\x63\xed\xdf\x1c\xee\x68\xf4\x9f\x1e\xba\xa2\x7e\xc5\x0f\x49\x0d\x61\x60\x1c\xa3\x5f\x8d\x6e\xd2\x66\x05\x4a\xeb\x9b\x19\x9f\x93\x3b\xff\xd6\xe0\x05\x0f\x26\x1b\x4e\x13\xd5\xeb\xfe\x2c\xaa\x65\x57\xc3\x2d\xde\xae\xeb\xc2\xa1\x1f\x0a\xa2\x33\x24\x0d\xa1\xc7\xe4\x0f\x76"}, -{{0x74,0xca,0x12,0x2a,0xb6,0x0d,0xe5,0x0c,0xdc,0x04,0xa8,0xe2,0xed,0xa4,0x5d,0x96,0x31,0x06,0x1b,0xf1,0x87,0xd3,0x16,0xbe,0x5b,0x7c,0xc0,0x6f,0x02,0x0c,0x48,0x3e,},{0x78,0x7d,0xef,0xd4,0xfb,0x24,0xa3,0x99,0xbd,0x2a,0x4e,0x76,0xdf,0xf7,0xd6,0x03,0xed,0x0a,0xcb,0x32,0x69,0x81,0x3e,0x4d,0xf6,0x90,0xbb,0xf5,0xb2,0xbc,0x69,0x6e,},{0xbc,0xb4,0xb8,0x50,0x69,0x60,0x11,0x99,0x7e,0xb5,0xdf,0xe1,0x43,0xf1,0xa3,0xd5,0x62,0x8e,0xf1,0xa5,0x40,0x76,0x91,0xee,0x48,0xc7,0x9d,0x69,0xab,0xe4,0xd5,0x33,0xf8,0x17,0xad,0x73,0x13,0xb5,0x79,0x5e,0x46,0xe5,0x95,0xf3,0xae,0x3a,0x91,0x65,0xb1,0xb6,0xfd,0xda,0xe8,0x61,0x64,0xff,0xcb,0xa3,0x76,0x24,0x98,0x37,0xf6,0x09,},"\xa8\x0b\x46\x07\x9f\xa7\x75\xf8\xc1\xa1\x9f\xa0\x82\x9b\xe6\x66\xbd\xfd\xca\x07\x9c\xad\x43\xd7\x0e\x08\x42\x18\x3b\xc0\xdb\x95\x46\x8a\x53\x9f\x0d\xb2\xae\xa3\xab\x9c\x70\x73\xb4\x5d\x22\x8a\x9b\xde\x23\x28\x97\xa6\xeb\x6f\xc9\xed\xf7\x36\x5e\x71\x01\xba\x97\xc4\x46\xa5\x19\xa3\x64\x9c\xf5\x27\xc8\xa6\xde\x72\x51\xb9\x28\x06\x81\x5a\xc2\xfa\x00\x82\xef\xf7\x5e\x25\x82\xcb\xca\x7e\x1e\x4d\xa2\xa4\x46\xea\x23\x3e\x7c\xf7\xce\xdf\xb0\xe2\x39\x8e\xb6\xe1\x1b\xba\xef\xe3\xf7\xec\x89\xf5\xd7\x3d\xd3\x4b\xd4\x7f\xbc\xb4\xd7\xb2\x2f\x2a\xae\xe3\x73\x78\x56\x51\x84\x11\x35\xcd\x86\x61\xa7\x01\xb2\x10\x84\xa3\x16\xde\xac\x30\x74\xe2\x4a\x2e\x35\xa0\x33\x0f\x7d\x14\x79\xb9\x32\xf2\x85\x27\x7c\x18\xa4\x41\x78\x72\x24\xfb\xbe\x46\xc6\x2e\x83\x4a\x18\x51\xed\x23\x79\x98\xd4\x8d\xce\x20\xba\x11\x4d\x11\xe9\x41\xbe\x29\xd5\x6d\x02\xf7\x37\x0c\x8f\x6d\x6d\x7e\x50\x24\x8d\xcd\x8e\xc8\x9d\x3b\x22\xf4\xf5\x87\x78\x12\x9f\xaf\xd4\xbb\x92\xed\xe1\x77\x14\xbf\x02\x2a\x5b\xf9\x2b\xe4\x79\xf1\x8e\x63\x85\x2e\xcd\xcf\x8c\x42\x11\xf5\x30\xdd\x30\xf7\x9c\xbf\x4b\xfa\x57\x37\xf0\xba\xd3\xb0\x10\x60\x67\xf4\x13\x27\xc3\x18\x9e\x6f\x20\x6f\x0d\x4f\x3c\x70\x4b\xf2\xbd\x0b\x16\x1f\x01\x8f\xd2\x1c\xdd\xfb\x41\x8b\xac\x4d\x52\xef\x02\xc4\x1c\x87\x92\xe4\x13\xb0\x4f\x08\x36\xce\xa1\xf8\x6c\x92\xe5\xd5\x70\x3b\xee\x2b\x5c\x58\x99\xe2\x85\x99\x20\x24\xf6\x4e\x0d\x16\xc6\x0a\xd0\xfd\x92\x54\x79\x32\xd0\xc5\xcb\x98\xd8\xda\x22\xfe\xeb\xdb\xba\x8d\x1d\xe1\xe7\xe9\xbb\x21\x9a\x92\xeb\x6c\x1c\x69\x8d\x3b\x33\xa3\x7f\x9b\x81\x97\xd2\x6b\x55\x0f\xeb\xd2\x60\x1e\x7a\x64\x3e\xa7\xe1\xd9\xe4\x48\xae\x03\x7f\x62\x9a\x30\x6c\xe4\x17\xae\xb7\x9f\x2e\x3c\xa4\x4d\x8d\xb3\x84\x8a\x81\x1f\x18\x46\x81\x1c\xbc\xb8\x74\xf8\xaf\x09\xe0\xfd\x01\x73\xcf\x17\x5f\x30\x41\x15\x47\x6b\xf2\xc6\xc2\xd2\xf3\x32\xeb\xa5\x34\xf4\x6a\xae\x80\x1c\x26\x92\xc2\xd2\xfa\xdd\xfe\xac\xc0\xf1\xda\xce\x44\x0a\xbc\x2a\xe5\xe5\xa4\x9d\x57\x8f\xd7\xf9\xde\x2a\x84\x1a\xd6\xb6\x76\x9c\x32\xb1\x44\xce\xea\x16\xd0\xf3\xc0\xcb\x3a\x8e\xe6\x94\xc3\x8c\x28\x07\x35\x95\x09\x6c\x81\x37\x62\xcc\x2c\x5e\xc4\xb0\xd8\xd7\x23\xdd\x66\x08\x53\x27\x8f\xc7\x2f\xd6\xbd\x9d\x12\x72\x93\x3d\xd2\xa3\x8e\xd9\xd0\x4b\x13\x90\xff\xe4\xb2\x94\xa6\xff\xfa\x72\x1e\xe3\xbb\xa3\x3a\x03\xa1\x49\xc4\xa0\x34\x52\x65\xc0\x1c\xe0\x15\xe9\x4d\xb4\x19\xcf\xf7\x04\x98\x52\xee\x00\x00\x48\xa8\x57\x58\xf6\xd7\xb1\xc5\x9c\x50\x89\xee\x01\x8e\xd0\x9b\x52"}, -{{0x65,0xee,0xa9,0xff,0xb7,0x56,0x12,0xbd,0xe1,0xd9,0xba,0x3e,0xa4,0xfb,0x5e,0xda,0x0a,0xa6,0xf2,0x55,0x6a,0xb1,0x5b,0xf1,0x81,0x7c,0xee,0x3b,0x95,0xbb,0xba,0x12,},{0x5b,0x39,0x36,0xdc,0x74,0x9b,0x6b,0x92,0x39,0xf1,0x57,0x98,0xac,0xca,0xfd,0x88,0x4c,0x36,0x59,0xee,0x01,0xb2,0xd1,0x7d,0x74,0xfc,0x7d,0xa7,0x82,0x74,0xe7,0xe6,},{0xba,0xa7,0x11,0x31,0x55,0x35,0x8c,0x92,0x4f,0xed,0x57,0x48,0x8a,0x65,0x67,0xf8,0x72,0x38,0x50,0xa9,0xf5,0xc0,0x3a,0x0d,0x7d,0xe8,0x5f,0xcc,0xd8,0xfb,0x4d,0x17,0xd7,0x75,0x35,0x23,0xb0,0x0c,0x0d,0x8a,0xdb,0x88,0x4d,0xc0,0xc8,0xa7,0xa4,0x4d,0xc2,0xa6,0x00,0x83,0xaa,0x5b,0x3c,0x5b,0x94,0xa8,0xd8,0x80,0xf2,0xa9,0x4d,0x09,},"\xc0\x69\x36\x32\x3c\xe3\x25\x3c\xac\x5a\xb4\xf6\xb8\x32\x70\xcd\x4c\xfe\x85\xd0\xbf\x8b\xac\x1e\x1b\x8d\x5f\x0b\x15\x3f\x54\x1c\x8e\x8e\xd9\x5f\x28\xd5\xc8\x5a\x23\x15\xcd\x93\x1b\x7c\xf3\xed\xae\x50\xf9\x28\x30\x59\x91\x62\x80\x4b\x13\x63\xd3\xac\x0d\xa0\xab\xd0\x97\x51\x02\x3b\xdd\xc1\x62\x88\x94\x4e\x61\x6d\x21\xd9\x12\x71\x97\x8b\xb7\x82\xd3\xeb\xed\x7f\xa6\x12\x84\xc7\x49\x0d\x27\x59\x3c\xa8\xa3\xd5\xb4\x75\x62\x33\x07\x01\x0a\xbc\x1f\xbf\x79\x3a\x81\x6a\xaa\xb5\xe0\x92\x4d\xec\x79\xd6\x04\x98\x96\x5c\xf7\xf8\x0a\xb5\x9f\xc0\x29\xf7\x82\x16\x67\x55\xb7\x2b\x86\x90\x75\x43\x4a\xb6\x06\xcc\x87\x0a\x7c\x0b\xc8\xbf\x29\xae\xe0\x33\xfa\x9c\xc1\x22\xed\x7c\x8e\x06\x9b\x54\x7d\xba\xe2\x59\x01\xb9\xe2\x49\xb4\x1f\xea\x0b\xf8\xda\xf3\x82\x68\x66\xbc\xae\xd2\x75\x3b\x5e\x91\xae\x93\x7e\x71\x7b\x50\x8a\x0a\xcf\x4c\x3b\x06\x1f\xf0\xcb\x9c\xfd\x38\x0e\x24\x94\x50\x09\x51\xa6\x62\xfd\x49\x28\xfc\x5f\xca\xf6\xc1\x8e\x84\xb1\xd3\x78\xe4\x9b\xd9\xd5\x96\x86\xd0\x87\xeb\xd5\x52\xd0\x7f\xa9\xba\x81\x6f\xa5\x40\x2c\xa9\xe7\x25\x2a\x64\x8d\x10\x6c\xfe\x6c\x43\x1c\xc2\xa0\x53\xe2\x29\x46\x37\xcd\xb9\x9d\x96\xab\xe6\x89\xed\xab\xc5\xca\x07\x0f\x77\xc1\xec\xd1\xd5\x2d\x53\x85\x28\x9f\x17\xce\xd7\x68\xc3\x97\x16\x71\xb9\xc0\xb2\xf8\x55\xb8\x46\x1c\x1e\x74\x6c\x7b\x38\xf7\x78\x96\xb8\x5a\xfb\xbe\xdd\x08\x37\x5f\xe9\x22\x98\x46\x14\xdd\x84\x9f\xe2\xcb\x89\xae\x71\x49\xdc\xd1\xd3\x7f\x49\x36\xe6\x7b\x14\x40\xbe\x72\xe0\x09\x39\x8b\xe6\xf0\x83\xbf\x96\x11\x48\x0b\x59\x2f\xe2\xf0\x11\x8e\x25\x3d\xb5\xd2\xe9\xe4\xb4\x54\x1c\x11\xda\x00\xf7\x16\x1a\x73\x6e\x5f\x0b\xb9\x34\x20\x8e\x3e\xf4\xe0\xb9\xa5\x22\x58\x20\x3f\x06\x0d\x18\xa1\x95\x15\x9e\x5e\x26\x8a\xa2\x80\x53\xc8\x34\xf7\xbd\x5d\xb9\xbd\x71\xf5\x07\xd9\x13\x70\xb3\xff\xca\xbb\xd4\xac\xb3\x07\x1d\x3f\x6d\x52\xc3\x49\xac\xf3\x50\x95\x34\x8c\xeb\xf5\xa8\x6f\x8c\x59\xdd\xc9\x65\xef\xf6\x10\xac\x42\x58\x04\xc0\xe2\xf6\xbe\x42\x85\x3f\x5b\x46\x43\x4a\x2c\x31\xd9\xac\x99\x53\x9b\xfd\xc0\x4e\xcf\x2f\xef\xd0\x45\x98\xfa\x63\xc1\x39\xff\x6c\x6d\x88\x41\x0e\x73\xbd\x32\x8c\xc4\x34\x9a\xb4\xbb\x86\xf2\xe2\xed\x7c\x73\xde\x96\x52\x0e\xf7\x73\x0e\xf3\x83\x45\xe0\xf9\x72\xa8\x4c\x53\x88\x10\x36\x87\xe6\x8c\x50\xf9\xd8\xc9\xaf\x90\x3b\xc6\x32\xd4\x32\x04\x06\x2a\x4f\x50\x2e\x21\x4c\x07\x05\x9c\x2c\xbe\xf7\x2a\x54\x11\x0d\xbf\x73\xe4\x25\x40\x2d\x17\xe9\x78\xec\x19\x9b\x51\x8c\xec\x03\x10\xbf\xbf\x7d\x9a\xd3\x00\x43\x4a\x4a"}, -{{0x08,0xda,0xbd,0x4e,0x5c,0x11,0x9e,0xa9,0x07,0xce,0x45,0xf0,0xa7,0xaf,0x9e,0x62,0xc0,0xc3,0xf1,0xc9,0xec,0x61,0xad,0x10,0x56,0x7d,0x79,0x36,0x28,0x54,0xc5,0x57,},{0x94,0x54,0x06,0xb8,0x5d,0x7b,0x32,0xe0,0xb1,0xab,0x12,0x00,0xb9,0x42,0x22,0xde,0x1a,0xaa,0x68,0x62,0x4c,0x60,0xbb,0x47,0x16,0xb0,0xbc,0xe9,0xdf,0x00,0x57,0x71,},{0x33,0xad,0xbf,0xcd,0x4e,0xd4,0xfa,0x67,0xc5,0x8b,0x5c,0xb5,0x9e,0x16,0x98,0x71,0x48,0x69,0x78,0x12,0x66,0x0b,0x35,0x31,0xff,0x6a,0x21,0xc7,0x49,0xb9,0x60,0x16,0x60,0xba,0xee,0xe2,0x48,0x9b,0x82,0xb4,0xcd,0xe1,0x32,0xb6,0xe6,0x2f,0x2f,0x90,0xd8,0xf9,0x92,0x78,0x60,0xaa,0xad,0x25,0x28,0x1d,0x03,0xeb,0x17,0xa9,0x52,0x0f,},"\x6c\x47\x19\xa5\xa2\xa6\x89\x48\x35\xc4\xac\x1e\xd6\x91\x59\xe5\xeb\xb5\x69\x2a\xd8\xea\xad\xa4\x39\xf7\x9e\x96\x68\x4b\x36\xce\xcf\xb4\x4b\x89\x01\x56\x31\x66\x3e\x06\x44\xf6\xc7\xab\x71\x39\x89\xd7\x42\xda\x27\x42\x72\x53\x31\x8a\x52\x43\x2d\xfa\xb2\x12\x1d\x1e\x92\x33\xea\xd7\x19\xe2\xc8\x6a\x6b\xe0\x73\x63\xd0\x02\x17\x3f\x20\x54\x46\xca\x95\xfc\x17\xb2\x46\x35\x82\x7f\xe3\x15\xf2\x22\x40\x8e\x45\xe8\x33\xf2\x9f\xf0\x8f\xf3\x1d\xac\x58\x3a\x4b\xec\x70\x76\xd5\xcc\x78\xcf\xc9\x44\x51\xcb\xf4\xf7\xe2\xfc\x5b\x5e\xd8\x07\x0f\x4e\xf8\x08\xbe\x1d\x8a\x68\x0e\xcd\xff\x59\x01\x0f\x39\xb1\xde\x80\xbe\xf1\x71\x9f\x1e\x21\x8e\x0c\xe0\xa1\xe3\x93\xa5\x66\xc5\x17\x64\xd2\x37\x0d\x95\xa6\x11\x91\xd8\xf7\xaf\x74\x0d\xc2\x08\xfa\x78\x31\xb2\x10\x67\x05\x12\xcd\x73\x76\x6e\x60\x9e\x9b\x78\x00\x21\xeb\xb2\x0c\xc8\x79\x0d\x8d\xa5\xf1\x0f\x5b\x6a\x11\x4a\x1d\xb8\x8f\x66\x76\x65\x01\x80\x2d\x9c\x36\x6e\xa3\xfa\x6f\x1b\x1e\x1e\x8b\x04\x20\x94\x34\x13\xcc\x6f\xea\xb2\x8c\x6b\x68\x3c\xd2\xb3\x33\x06\x9c\x89\x51\xbc\x45\xe8\xa1\x3b\xd5\x22\x57\x83\x51\xc8\x82\xf7\xc3\x42\xfe\x43\x31\xb9\x21\xf5\x33\xc9\x2e\xc0\x4a\x49\xb2\x92\xbc\x56\x9d\xdc\xef\xca\xb5\x72\x7f\x9b\x56\x25\xb1\x67\xa9\x02\xdc\x89\x6d\x8b\xc7\xd8\xe9\x99\x20\xf5\xdb\x8d\xd7\x67\x83\x9c\x43\xe3\xcd\xf9\x47\x08\x0d\xec\x95\x42\x14\xa6\xfb\xbe\x04\x87\xa2\xf3\x2c\xd1\x7a\x6b\x00\x03\x70\xbd\x41\x44\x84\xfb\x73\xc5\x10\xea\x01\x24\xc6\xcf\x0f\xe5\x6c\x08\x46\xa7\x9b\xfc\x59\x77\x9d\x3b\x07\xa1\xbd\x2c\x7f\xb7\xe2\xd0\x03\x9f\x0b\xd2\x1c\x8a\x30\x8f\xb0\xf5\x8f\xdb\xf9\x4e\xfa\x08\x57\xac\x3b\xdd\xdd\x86\xd5\x76\x3e\x20\x5e\xe1\xb2\x21\xf0\x60\xce\xdb\x8b\xc0\x5f\x03\x1b\x60\x6c\xc7\x4d\xad\xc5\xdb\x04\x23\x27\x48\x86\x5a\x73\xd6\xcc\xdd\xb4\xd5\xe9\x30\xd5\x28\x34\x8c\x5b\xe9\x08\x8b\xfe\x34\x45\x84\x87\xa6\x7b\x19\xa1\x8e\xca\x25\xc0\xd3\xfb\xe2\x19\x5e\xb9\x17\x07\xb6\x5d\x91\x61\xea\x93\xed\xdd\x64\xa6\x34\xb2\x32\x80\x19\x5f\xdb\x0d\x13\x88\xf6\x99\x8e\x18\x58\xa4\x5b\x88\x69\x99\xb8\x44\xe6\x79\x5d\x83\xd3\x18\x37\xe4\x41\x1f\x71\x69\x92\x26\xde\x1b\xa0\x24\x56\x08\x00\x0d\xcf\x22\x3d\xd1\x83\x59\xb7\xc6\xd4\x59\xa6\x5d\xbe\x66\xc9\x0f\x5c\xb8\xc0\x91\x22\x18\x7a\x30\x46\xa1\x6d\xd1\x79\xc3\xf4\x37\x3e\x57\xcf\x5e\xe0\xea\xb6\xa2\x12\xcc\x9e\xd8\xb5\x4b\xf3\x7f\x1d\x27\xfb\xd7\x98\x48\xe4\xec\x1f\x56\x72\x43\xab\x87\x40\xa0\x51\x49\xd9\x60\x2e\xad\xa9\x20\xa4\x6d\x61\x0d\x3c\xc8\x23\xb5\x64\x98"}, -{{0xe0,0xf7,0xd0,0x08,0x24,0xc5,0xf3,0x70,0x1e,0x55,0x17,0xa4,0xab,0xc1,0x3e,0x2f,0x2c,0x0b,0x13,0x8c,0x83,0x69,0x77,0x84,0x3b,0xbd,0x1e,0xef,0xfa,0xbd,0x96,0x8a,},{0x52,0xfd,0xda,0xe3,0xe0,0x18,0xa6,0x84,0x73,0xb3,0x16,0x8d,0x07,0x64,0xcf,0xe2,0x74,0xdc,0xc8,0x34,0xc9,0x0a,0x91,0xfb,0x4f,0xe7,0x4b,0x93,0x9d,0xd2,0x38,0xb1,},{0xcc,0xdf,0xe1,0x8a,0xd6,0xd0,0xb6,0x5d,0x08,0x6d,0x63,0x2f,0x83,0xcc,0x46,0xff,0x3b,0x3f,0x2c,0x07,0xbb,0x8e,0x76,0x9d,0x0f,0xb4,0xe8,0x2d,0xf8,0xa3,0x87,0x3f,0x9a,0xee,0x35,0xfd,0xd1,0x8a,0x57,0x83,0x60,0x31,0x80,0xa9,0x5c,0x9f,0x74,0xce,0xd9,0xdb,0x51,0x46,0xaf,0xcf,0xbb,0xdd,0x40,0xdf,0x29,0xe0,0x42,0x01,0x20,0x0c,},"\xb3\x9e\x3a\xc7\x5a\x22\x1a\xdc\xce\xd0\x9a\x85\x91\xac\x5e\x2f\xe1\x5d\xfe\xd5\xb9\x19\xcb\xaf\x14\xc6\x5e\xb7\xcd\x93\x08\x6d\xde\xe3\xf7\x47\x25\x47\xe6\x6d\xdc\x70\x06\x2b\x97\x62\x97\xd1\xa3\xc1\x70\xee\x52\x5c\x9c\x53\xba\x93\xa4\xc4\xfd\xb2\x35\x72\xb7\xca\x6e\xd1\x38\x53\xe7\x0d\xb1\xd7\x2e\xde\xb9\x94\x4b\xbc\x35\x4a\x52\x0e\x77\xae\x59\x1f\x31\x80\x92\xef\xd5\xe6\x6d\x9c\x09\x81\xc4\xa4\xbd\xa9\x8a\xa4\xe5\x90\x45\xff\x9c\x4b\x4c\xa3\xac\xb2\xff\xd8\x93\x20\x1c\x70\xb3\x4a\x77\xf2\x4e\xda\x54\x54\x9d\xc8\x4a\xd1\x34\xa3\x55\x32\x55\x38\x15\x88\x8a\xe3\xdd\x9e\x24\x1e\xc4\xeb\xbf\xf8\x6f\x8c\x1e\x8a\xdb\xaa\xc4\xb9\x1a\xfd\x18\x22\x8c\xbb\xd5\xdd\x80\x5a\xca\xbf\x0a\x1e\x29\x0c\xe5\xdd\xa0\x25\x1a\xdf\xb3\x7c\xb7\x14\xc1\x39\xb5\xa3\x24\x2d\x88\xc6\x44\x84\xa3\x76\x55\xcc\x8f\xcb\xec\xff\xa9\x7f\xbd\x14\xd6\x4d\x51\x2b\xf8\xf6\x30\x5f\x89\xc5\x09\x22\xde\x54\x16\x92\x15\x8f\xb5\x47\xfd\x53\x9f\x1e\x58\x77\xcc\x64\x94\x95\x16\x63\x32\xea\x2b\x68\x5c\xfa\x3f\x60\x20\x19\xdf\x2a\xb2\xc2\x5e\xd9\x6b\x68\x74\x5e\x9a\xe8\x9c\x94\x8d\xa1\x1a\xd8\xa8\x30\xdf\x8b\x00\xf2\xe6\x68\x19\x2d\xad\xf2\xc5\x62\x0d\x35\xc6\xe8\x1a\x28\x53\xf8\x41\xe3\x75\xa0\xd9\xfc\xa2\xd2\x96\xef\xce\x2a\xc3\x8d\x40\xb0\x30\xb5\x75\x60\xae\x6e\x83\x41\x33\x9b\x3d\x3c\x2d\x06\x11\x64\x12\x43\x19\x59\x86\x88\xfc\xa6\x18\xfc\x64\xc9\xe8\xf5\xf8\x31\x09\x7a\x05\x3a\xf1\x9d\x7d\xbd\x61\x21\x8d\x92\x67\x42\xc2\xe9\xa4\x2a\x79\xcc\x1b\x14\x89\x12\x72\x2d\x8c\xd5\xca\x79\x3a\x1a\xd7\x3b\x5f\x14\x1b\x41\x80\x9c\x2f\xc0\x53\x0b\x76\x30\xe8\x03\x90\xc6\xb3\x38\xc7\x18\x68\xda\xcc\x59\xbf\x46\x3f\xfc\x48\x90\x16\xbf\x67\xf9\xc9\xd5\x55\x3c\x1e\xde\x17\x15\x28\x13\xfe\x0b\x26\x4b\x65\xdc\xa1\xb2\xb3\x8e\x4b\x80\x9f\x8c\x97\x25\xac\x5b\x1d\x8d\x2e\x56\xbe\xc9\x64\x9f\xe5\x5c\x75\x83\xff\x23\xb0\x43\xd6\xf3\x76\x86\x28\xf1\xf0\x51\x63\x37\x82\x4a\x5a\x56\xb4\x09\x52\x0a\x6a\x6c\xb7\x7e\x4f\x5f\xc2\x0b\x9f\x68\x99\xe0\x0a\xb2\x2d\xb1\x0d\x18\x2f\x09\xb8\x1e\x94\xf3\xad\x56\x8a\x0b\x81\x24\x4d\xf3\xf1\x85\x5c\x6e\xf2\x22\xa4\x1a\x51\xb6\x2a\x46\x49\xbb\x82\x69\x0a\xb6\x5f\xac\xac\x0d\x81\xd6\xfe\x02\x60\x11\x70\xa8\xdb\x62\xcb\xc5\xec\x99\x55\xd7\x71\x1a\x1c\x39\x65\x6a\x9f\x6e\x1f\xb6\xbc\x18\x3d\x9b\xea\x15\x03\x53\x1f\x17\x36\x27\x68\xbb\x84\x1f\x9d\x21\xf1\x3a\x2c\x99\x1e\x55\xdf\xf7\xf2\xb3\x36\xe2\x9e\xb2\x95\x07\x63\x8b\xdc\xad\x7b\xb3\x1c\x69\xe9\x09\x20\x7e\xba\xbc\xc6\x53\xff"}, -{{0x6a,0xcd,0x93,0x9e,0x42,0x22,0x26,0xcc,0x54,0x43,0xd4,0xaa,0xbf,0x58,0xc1,0x1a,0xf6,0x50,0xcb,0x40,0xb9,0x64,0x8b,0x4d,0xa3,0x8b,0x92,0x7b,0xff,0x9a,0x58,0xdb,},{0x4c,0x0b,0x91,0x75,0x6b,0x9e,0x20,0x6f,0x78,0x63,0xb1,0x55,0xff,0xc5,0x50,0x9b,0xb5,0x24,0x77,0xce,0xac,0xd0,0x1c,0xa0,0x11,0x43,0x51,0x53,0x67,0x86,0x46,0xcc,},{0x79,0x99,0x58,0x77,0xed,0x24,0xc7,0x91,0x68,0x4f,0x29,0x84,0xbd,0xf9,0x60,0x9c,0x3f,0x7b,0x57,0x6c,0x57,0xd1,0x62,0xee,0x62,0x2d,0x4c,0xe8,0xf3,0x6d,0x9c,0x55,0x73,0x16,0x9d,0x88,0x01,0x21,0x6f,0x1c,0x46,0xff,0xe2,0xf6,0xe2,0xc0,0x90,0x48,0xe4,0x7d,0x4b,0xeb,0x99,0x7e,0x9a,0xbc,0x4a,0xbb,0x12,0x9f,0x9b,0x79,0x69,0x0a,},"\x82\x50\xd5\x31\xcf\x2b\x66\xaa\xc2\xb3\x78\xd5\x4b\xc5\x7f\xd3\x29\xad\x5a\x41\x4a\x59\x92\x55\x89\x8b\x3c\x3b\x45\xbf\x9c\x0d\x2c\x77\x54\x75\x66\xb6\x60\xee\xcc\x76\xa6\x95\xa2\xd6\x08\xab\xf1\x1a\x5f\x6d\xb3\xe6\x07\xfd\x5a\x21\x71\x4b\x0f\xad\x5d\x81\x4c\x01\x5e\xbf\x48\xbb\x73\xad\x75\xda\x9c\x03\xc4\xaf\x54\x89\xe7\x82\xb6\xbf\x79\x08\xa1\xbd\x52\x8d\x7c\xe7\x88\xa1\x8b\xa3\x52\x8e\x35\x37\xaa\x7b\xbf\x75\xf6\x52\x4b\xbd\x19\xa5\x30\x4b\xa2\xa4\xa3\xee\x58\xc4\x1f\xec\x31\x32\xee\x65\x01\x64\x12\x15\xef\xf7\x46\xd7\x80\x0c\x4d\x33\xf5\x2b\xe8\x35\x7e\x0e\xe7\x58\x04\x1d\x91\xcf\xe4\x3c\x60\xc3\xce\xdc\x09\xb0\xd4\x6d\x4c\xfb\x9a\xe2\xa0\x23\x9b\x6f\x33\xc6\x94\x1c\xff\x35\x37\x26\x70\xee\xf5\xc8\x85\x9a\xb6\x5b\x6e\x9f\x7e\xbc\xe3\x2f\xa1\x5a\x9a\x47\x7a\xec\xdc\x96\x83\xa1\xe3\x3a\x1e\xdc\xdc\x90\xd4\x20\xa3\x1e\x78\xc1\x53\xd2\x60\x20\x87\x1d\xaa\x4f\xff\x28\xac\xc3\xf1\x1a\x72\x06\x78\x88\x06\xb6\xfa\x02\x34\x68\xea\x5a\x3d\x18\x6d\x10\xf0\xdd\x56\x77\x96\x66\x3b\xa3\x7c\x83\x2f\xe7\x5a\xae\x7d\xcc\xeb\xf3\x19\xf9\x36\x00\xc4\x6a\x22\xf5\x72\x23\x81\x2d\xdd\x0a\x68\xd7\x6b\xaf\x5e\x27\xa9\xfc\x8b\xd6\x8c\xc1\x0b\x5b\x51\x51\xd6\x2b\x41\xf9\x34\x8e\x21\xb7\x15\x35\x2f\x26\x30\xb6\x17\xf8\x13\xb0\xc2\x89\x96\x28\x59\x04\xcf\x29\x4e\x9c\x28\x56\xb1\x7b\xa3\x5f\x9a\x82\x19\x8b\x82\x14\xa0\x35\xe2\x89\x6d\x65\x68\xbe\x42\x39\x2c\xce\xf3\x2c\xd4\xeb\xfe\xeb\xf1\x2b\xe0\x12\x52\x06\xbb\xe8\x93\x36\xd3\xe7\x62\x99\x1d\xfa\xb6\x8f\xc9\x9d\xc1\x64\x9b\x89\x13\x83\xdb\x31\xfa\xb6\x49\xe6\x28\x82\x3f\x45\x98\xcb\x63\x6a\x38\xfe\x1d\xf7\x3e\x68\xd7\x42\x5f\xc5\xd2\xeb\x55\xa0\xfd\x1b\xc9\xf5\xce\xaa\xbd\x6d\xd4\x1f\x23\xe4\xf0\x86\xc6\x92\x63\x3d\xc3\xc4\x61\x9a\x97\xab\x0e\xad\xa1\x71\xf8\x4a\xdf\x20\xec\xc8\xec\xd4\x7c\x51\xcc\xa3\xe5\x9d\xd8\x09\xb0\xae\xaa\x73\x0d\xf9\x4b\xe3\xba\xcf\xd8\xee\x88\x8b\xba\x9d\x57\x08\x50\x65\x2c\xd4\xd5\xe6\xc5\x52\xa5\x7e\x9f\x48\xa2\xb0\x6a\xac\xdc\x70\x8d\x84\xa3\x76\xfb\xc6\xc9\x4b\xa6\xbf\x64\xa5\xf0\x18\x80\x0a\x7c\xc8\x51\x24\x5a\xed\xb2\x03\x78\xb3\x29\xac\xeb\xb2\x97\x7c\x13\x98\x08\x2b\x3a\x0e\x5e\x2a\x9c\x24\x84\xfa\x30\x1d\x30\x37\xa8\x22\x4d\xdc\xc0\x95\xb1\xdb\xd8\xa2\x31\x5b\x55\xbf\x33\x18\xc2\x78\x10\xef\xc3\xd8\xe2\x5f\xa7\xa8\x78\x9b\x73\xa4\xf5\x50\x59\x08\x0b\x08\xab\xb3\x69\x9b\x7b\x86\x26\xcb\x2a\x78\x0d\x97\xcc\x1c\xa8\x03\x28\x51\xba\xf4\xed\x8b\x64\xfc\x43\x30\x86\x5f\x84\xcc\xb1\x2a\x3d\xae"}, -{{0x4d,0xef,0xf6,0x47,0xcb,0xc4,0x5e,0xca,0xed,0xc3,0xf7,0xdd,0xf2,0x2c,0x16,0x7a,0xf2,0x4e,0x3d,0x63,0xda,0x22,0xb0,0xe6,0xa5,0xb8,0x43,0x9c,0x0f,0x3b,0x19,0x34,},{0x0c,0x27,0xc9,0xd7,0x7a,0xc8,0xc7,0x25,0xbb,0x06,0x63,0x93,0x3a,0xb3,0x0d,0x1a,0xad,0x09,0xcb,0xcf,0x2c,0xd7,0x11,0x6c,0x60,0x85,0xa8,0x49,0x9f,0x70,0x14,0x02,},{0xdd,0x54,0x89,0xfd,0xe4,0xba,0x87,0xd1,0x17,0x3d,0x4c,0xee,0x06,0x82,0xaf,0xdd,0x4b,0xad,0x80,0xdd,0x77,0x0e,0xa7,0xd0,0xdc,0xeb,0xaf,0x21,0xac,0xc6,0x1d,0xd6,0x32,0x4a,0xca,0x29,0x5e,0xd0,0xe2,0x3a,0x91,0x5e,0xcf,0xda,0xd5,0x0f,0x17,0x5e,0xbc,0x51,0x6f,0x1b,0xe5,0xb6,0xd8,0x7d,0x90,0xbb,0xe3,0x86,0x22,0x49,0x53,0x02,},"\xd6\x20\x1e\xbc\x21\xce\xc1\xe9\xbc\x28\xf9\x57\xc9\xd0\x29\xcc\x38\xf9\xe8\x5e\x06\xdf\xc9\x0b\xf2\x97\xe6\x1f\x2b\x73\xb4\x07\xd9\x82\xa6\x6b\x91\xe9\x4a\x24\xe9\x1d\x06\xab\x8a\x5c\x07\x9d\x0f\x69\xbe\x57\x88\xea\x8f\xea\xce\xbd\x91\x72\x91\x19\x22\x33\x86\x2e\x6a\xcd\xa1\xe8\xcf\x9a\x48\xbf\xfb\x54\x91\xdd\x65\xaf\x54\x1b\x6c\x72\xaf\x68\x1a\x81\x82\x3d\x98\xa0\xab\xee\xb6\xba\x9f\x95\x46\x5b\x84\x11\xf9\x9e\x11\x9c\xd2\x84\x79\xda\x98\x42\x59\xbd\xf8\x6c\x9f\xef\x3c\xca\x34\xe2\x24\x69\x1f\x18\x3c\xf0\x95\x03\x77\x27\xda\x9c\xad\x29\xf2\x42\xf8\x3e\xb4\xf7\x36\xe2\x7f\xdf\x67\x01\x8d\x71\x1b\x74\xc4\x5b\x29\x55\xa6\xa7\x6e\xc1\x53\x30\xdf\x5b\xad\x80\x30\xc6\xb3\xa8\x8d\x72\xf2\x84\x47\x65\x2a\xc8\x90\x2b\x5b\x76\xcb\xf6\xb9\x45\xce\xab\xfe\xc0\x4a\x9b\x8c\xb3\x0f\x43\xd9\xeb\x77\x3e\x67\x05\x59\x4f\x0d\xe1\xb7\x0f\x1a\x20\xc9\x9f\xc4\xb1\x22\x1f\x8c\x81\xb0\xbc\x30\xda\x12\xcd\x5d\xea\x8f\x4d\x90\xf1\x3a\x81\x1a\x2c\xc1\x1a\x96\x84\x6a\xaf\xb4\xc4\x2a\x00\xe9\xae\x7d\xa2\x56\xa0\xd2\x2b\x19\x8a\xfc\x25\xcc\x10\x41\xd2\x4e\x05\x6c\xf3\x87\x60\x1d\x7b\xf7\xeb\x31\x82\xd6\x05\xfe\x5e\x63\xb1\x8d\x53\x1a\x5f\x84\xe5\xdb\xd0\x18\x4a\x76\xc6\xc4\x67\xa8\x26\x3a\x98\xb5\xc0\x05\xfc\xb2\xaa\xf9\x89\xf5\xcb\xd0\xa9\xd9\x03\xfc\xfc\x60\x9d\x6e\x57\xd9\xc4\x39\x02\x1c\xea\x93\xe4\xc4\xe9\x91\xf1\x93\xca\xf3\x24\x37\x70\xb3\x25\x78\x74\x80\x76\xb7\xf4\xcb\x97\xf1\x7c\x17\xa7\x9b\x82\x25\x3c\x24\x23\xdb\x69\x8c\xd0\xa3\x3a\xb3\x3b\xb0\x9b\x0b\x08\xcb\x8c\xea\xdc\xa1\xe2\x9c\x5d\xe2\xfc\x12\xb2\x40\x7b\x6c\xc5\xaf\x5a\xe9\x76\xdd\x3e\xc6\x30\xd8\x33\x9b\x7d\xd1\x1f\xa3\x4c\xaa\xc1\x50\xc7\xc4\x79\x1d\x8c\x42\x7b\x0a\xd9\x2e\x05\x29\x06\x7a\x88\xd5\x20\x11\xe1\xe0\xa1\x82\x99\xb9\x69\x89\x6f\x8b\x83\x60\xf7\x5c\x45\xc4\x96\xda\x47\xb0\x9b\x45\x0f\x98\x22\xbc\xbc\xd4\x3f\x42\x93\xc5\x16\x80\x2b\xf7\x47\xc4\xab\xee\xdf\xaa\x3e\x79\xcb\x91\x03\xd3\x77\x0f\x56\x07\xb7\x75\x16\xe5\xb1\xce\x0f\x64\xb6\xee\xc7\xbe\xc3\xc6\x47\xc0\x06\x95\x6d\xc5\x5b\x6c\x79\xf6\xaf\xb3\x9d\x1f\xc3\xec\xf1\x1b\x97\x4b\x44\xae\xdb\x72\xae\xd1\x31\x66\x35\x08\x3c\x21\x24\x50\x2e\x5c\x72\xd8\x6e\xca\xb6\xac\x90\x24\x3e\xb3\x9a\x6a\xa9\xcb\x94\x80\xda\x38\xe1\xed\xb8\xd2\x8f\xf9\x09\x24\xc0\x5d\x5d\x21\xaf\x5a\xf9\x59\x57\xb8\x02\x07\x81\x37\x87\x11\xa2\x9d\x09\x20\xac\xad\x8c\xcb\x39\xa3\x11\x69\x32\x78\xc9\x90\x0b\x47\x0d\xa2\xbd\x4c\x12\xa0\x1d\x73\x96\x26\x44\x01\x7b\x60\x34\x71\x3b\x2a"}, -{{0x5a,0x19,0xbf,0x6c,0x94,0x1f,0x39,0x4e,0x93,0xbd,0x36,0x25,0xfb,0x81,0xcd,0x9d,0xa8,0x1c,0x90,0x20,0xb1,0xc5,0x31,0x25,0x7a,0x7b,0x59,0x57,0xbb,0x07,0x92,0x11,},{0x20,0xe8,0x69,0x9d,0x08,0x7c,0xe5,0xe8,0x15,0x1d,0x28,0x05,0x3d,0xce,0x66,0xc2,0x3f,0x28,0x08,0x1f,0x35,0xbd,0x26,0x81,0x9b,0xbe,0x85,0xd3,0x8a,0x09,0xd7,0x02,},{0x2a,0x2f,0xd6,0x05,0x4e,0xf4,0xe7,0x9b,0x72,0x19,0x1a,0x0c,0xcb,0xd2,0xb1,0x8a,0xeb,0xab,0xe8,0xb9,0xa7,0x18,0x61,0xde,0xd9,0x8b,0x7c,0xdc,0xb6,0xa6,0x25,0x53,0x28,0xbc,0x1a,0xec,0xb0,0xc9,0x33,0x57,0x21,0xa9,0xa9,0x6e,0xe4,0xb5,0xb4,0x3f,0x90,0xd3,0x22,0xec,0xf8,0x35,0xf7,0x8b,0x26,0x4d,0xae,0x6e,0x38,0x7b,0xfb,0x04,},"\xf7\x21\xca\x3a\x32\xc1\xe8\x1c\x9c\x6f\x46\xd5\xe1\xfb\x50\xe7\xce\x2f\x4e\x70\x93\x33\xca\x2b\x55\x0d\x52\x13\xb6\x77\x3d\x67\x0c\xa5\x9a\x2b\x50\x86\xa4\x43\x84\x3a\xc5\x08\x13\xb2\x44\xc9\xc9\xfa\xc6\xd1\x19\x69\x89\x27\x81\x35\x12\xc8\x4f\xe3\x0a\x89\x55\x30\x10\x13\x8f\x91\xe8\x17\x6f\x5c\xf2\x57\x89\xd7\x28\x1d\xdb\x83\xa2\x46\x70\x5d\xcc\xb9\x99\xc4\xcd\x0a\xe2\x19\xc6\x45\xf6\xd7\x1d\x45\x1a\xe1\xf8\xd2\xf9\x89\x1a\xf8\xcc\xce\x03\xf4\x38\x55\x9f\xb8\x36\x67\xb8\x07\x7f\xbe\x43\x5a\x74\x4a\xf0\x19\xd6\xd1\x39\x9f\xd2\x13\x7f\x5a\xfb\x8e\xf3\xf4\x7b\xcf\x73\x5e\x7c\x9e\xd8\xa5\x4b\xa0\xc1\xc6\x56\xb6\x65\x0b\xb3\x0a\xdb\x1d\x57\xec\xd2\x07\x46\x39\x49\x42\x31\xa2\xe9\xe2\xf9\x85\xed\x84\x22\xee\x03\xcb\x3f\xd7\x38\xc7\x35\xa1\xb8\x28\x06\x04\x74\x60\xed\x84\xf7\x46\x8c\x3c\x64\xb3\x5d\xb0\x6b\xc5\x8d\xe4\xbb\xa4\x63\xe6\x38\xa9\x41\x33\xdf\x10\x6a\xc4\xf4\x70\x36\x1c\xcd\xe4\x41\x57\x29\x9d\x22\x5b\x17\x79\x88\x91\xba\xf5\x92\x19\x86\xa2\xba\xe3\x26\xdd\xa0\xb8\x96\x17\xc6\x77\xbd\x14\x08\xba\x27\x48\xba\xa6\x7c\x8a\x2c\x5a\x96\x9b\xc0\x0c\xb4\x0d\xbf\x49\x0e\x07\xe2\x2c\x91\x3a\xfd\xde\x63\x04\xa0\x7f\xc9\xe6\x08\x46\x99\x24\x56\xbf\xb0\x66\x3a\x09\xde\xf6\x8d\xef\x67\xa1\x6d\x29\xe9\x8c\x7b\x55\x35\x18\x48\xa8\xcf\x92\x31\x0c\x74\x63\xc4\x75\xf2\x49\xc6\xf7\x55\x7f\xd0\xd7\x55\xca\x88\xf8\x77\x84\x7f\xe0\x76\x57\x56\xac\x34\xa2\x3f\x78\x40\xd9\x5c\x3d\x29\x4e\x66\x3b\xb1\x51\x8b\x75\x92\x7c\x41\x07\x57\xe0\xf5\xc0\x7c\x5a\x7f\xb2\x15\xdc\x72\x07\x43\x3e\xbf\x79\x1e\xdf\xce\xc9\x0e\x93\x0f\x8e\x3b\xa9\xdb\xbb\x98\x54\x13\xc2\x23\xbe\x87\x87\x3b\xd3\x23\x99\x75\x81\x80\x4d\x88\x96\xda\x38\x6a\x6e\x91\x20\x05\x0a\x0e\xae\xd3\x12\x40\xaa\x17\xc7\xb6\x69\x4c\x30\xcb\xcc\x3c\x69\x56\xa6\x82\x0f\xc9\xab\x21\x87\x55\x33\x96\x3d\xc3\xb0\xd8\x83\x58\x27\x12\x76\xc6\x05\x65\x28\x91\x0d\xd9\x89\xae\x0c\x33\x0d\x17\x98\xf7\xd8\xe7\xd1\x18\x4b\x84\xa8\x14\x34\x32\x5b\x8c\x30\x2e\xdf\x60\x1d\xc5\xe6\xf8\x47\xfb\xac\xbd\xee\xff\x78\xc6\x62\x1d\x1d\xaf\xdc\x23\x9b\x18\xb8\xc1\xaf\xdc\xb4\xb9\xda\xbd\x5d\x3a\x92\xa9\x32\xea\x15\x99\x54\x6e\x62\x5f\x96\xd6\xec\x6f\xb1\xcc\xcb\x76\xb4\x76\xb3\x30\xac\x59\x25\x9c\x63\x4f\xac\x9b\x3f\xa7\xde\x7a\xe7\x05\x37\x73\xb5\xbe\xfa\x00\x1b\x04\x92\x9f\x74\xb7\x12\x41\xe1\xb2\x57\x69\x6d\x65\xa2\x6c\x1b\x4a\xc8\x6b\x7b\x1f\xbd\x69\x57\xfb\x9b\x95\x08\x4c\xe7\xd7\x00\x90\xf5\x5d\x44\x53\x46\x94\x30\x5e\x91\x76\x9a\x82\x94\x13\x04"}, -{{0xb5,0x06,0xc0,0x1d,0x69,0x74,0x6e,0xb4,0xbc,0x63,0x58,0x72,0x0e,0x43,0x8a,0xd3,0x30,0xc8,0x8b,0x60,0x5a,0xad,0x65,0x2f,0x47,0x99,0x57,0x3a,0xb0,0xa1,0xaa,0xf9,},{0x7a,0xc8,0xb6,0x88,0x63,0xbd,0x69,0x15,0x15,0x83,0x78,0x9d,0x86,0x4a,0x73,0x57,0xe3,0xa0,0x45,0xfa,0x86,0x52,0x2a,0x9d,0xaa,0x6e,0x26,0xfb,0x79,0xed,0x6d,0x23,},{0x17,0xa1,0x9d,0x26,0x91,0xb7,0xb0,0x46,0xd7,0xb1,0x96,0x69,0xad,0x73,0x14,0x0d,0xb9,0x2f,0x0c,0x97,0x8c,0x7f,0x61,0xbc,0x38,0x67,0xd9,0x2c,0xa9,0xd4,0x75,0x80,0xa0,0x38,0x0b,0x59,0x01,0xba,0xd8,0x2a,0xf4,0x5f,0x67,0x6f,0x74,0x28,0x73,0x01,0x98,0x0f,0x71,0x87,0x1a,0x42,0x26,0x1d,0xbe,0x08,0x02,0x95,0x03,0x36,0xe6,0x0b,},"\xf7\xfc\x18\x06\x6e\xd0\x4b\x30\xe6\x33\xd9\x86\x5d\xa3\x21\x4b\xec\xa6\x0b\xd7\x96\x01\x9c\xd7\xec\xc9\x18\x66\xf9\xef\x24\x46\xc1\xfa\xb0\x6d\x86\x51\xbe\x7f\x10\x1a\xec\x7b\xb8\x4e\xe2\x1e\x71\xad\x02\x02\x15\xfc\xfb\x36\xf2\xd1\x1e\x45\x79\xac\x39\xf8\xe2\xb1\x29\x0e\x38\x96\xd5\x22\xbc\xf5\x13\xaa\xa0\x67\x71\xf8\x6e\xe2\x28\xcf\xf3\xa2\x0a\x1f\x10\xc5\x64\x33\x95\x89\xbb\xa9\x60\x53\x44\xc0\xa6\xe6\x82\xad\x5b\xa4\x0d\x10\x41\x94\x1b\xc4\x6f\x98\xb9\xd0\x9c\xa1\x7f\x8f\x04\x4e\x98\x3b\x8a\x49\x08\x93\x3d\xf2\x26\x3c\xf7\x88\x11\xc2\x4c\x8f\x48\x14\x35\x4f\x6f\x4c\x68\xb7\xee\x7b\x78\x30\x82\x93\xbf\x78\xfd\x0f\xf1\x22\xf0\x95\xc1\x4a\x73\xa5\x97\x97\x17\x2a\xe0\x5c\xfc\xec\x19\x56\x3e\xb1\x8d\x2b\xc5\x30\x0e\xd4\xbf\x6b\xdc\x44\x3e\xa9\xb8\xbc\x1c\xbe\xde\x94\xca\xb9\x05\xed\xa5\xa6\xa9\x31\x59\x7d\xe4\x02\x14\x6f\xac\x9c\xf8\xcd\x6a\x8d\x10\x46\x69\xf9\x13\xfa\x83\x40\x01\xca\x4d\x09\x0f\xb7\x94\x9d\x31\x09\xa6\x3c\x05\x49\xb0\x3f\x15\x1b\x71\x17\xc4\xf4\x69\x74\xba\x59\xc6\x82\x96\xed\xfd\xde\x76\x92\xee\x43\x2a\xce\xf7\x61\x06\x47\xe0\x95\x78\x65\xe6\x2c\x1a\x0c\xf0\x56\x59\x82\x3a\x55\x45\x2d\xd5\xe4\x71\xb3\x1c\x5a\x49\xab\x05\xb5\xaa\xfd\x5a\x0e\x53\x0e\x89\x6b\x58\xcc\x52\x2e\xcf\x19\xe5\x2e\xc8\x2f\xa1\x47\xf9\xe3\x85\x17\x4c\x7e\xc3\x3d\x1d\x9b\x86\x93\x4a\xeb\x4f\x6c\x57\x00\xf7\xd5\xeb\x33\xff\x73\xc9\xfc\x6a\xa4\x7d\xf5\x1e\x09\x22\x9e\x6a\xe8\x94\xe8\x6c\x81\x8b\xef\x06\x5f\x82\x59\x71\xa4\xcb\x90\xad\xfe\xfb\x31\xeb\xd9\xd1\xb7\x94\x22\xdc\x98\x68\xf9\xf7\x4e\x7a\x32\xcd\x40\x71\xef\xb6\x9b\x27\x23\x3e\x6e\x5c\x60\xde\xdc\xd5\x32\x1c\x03\x0a\x46\xcd\x26\xf5\x60\x2c\xac\x74\x7e\xe4\xb5\x22\xd8\x57\xa3\x32\x1a\x03\xf4\x03\xa6\x00\x62\x50\x40\x63\x61\xe4\x88\x15\xaf\xba\x77\xce\x08\x90\x34\x41\x84\x5b\xa8\x72\x25\xd8\xb2\x40\x46\x74\x5d\x40\x65\x64\x5a\x1b\x98\x41\x0c\xac\x48\xd1\x37\xcb\xbb\x8a\xb1\xeb\xa5\x0d\xa9\xc2\x31\xe9\xac\xf3\x22\xa6\xdb\xec\x0e\xf4\x16\xa4\x46\xc3\xb6\x10\xd9\x35\x69\xfd\xf4\x5a\xa6\xcd\xc1\xb6\x40\xd8\xf3\x01\xd7\x86\x93\xb2\x82\x6c\xc6\xed\x46\x85\x68\xad\x9a\x0f\x94\xaa\x9b\x9f\xb9\x2f\x7e\x78\xd4\x84\xfd\xf5\xd8\xd4\x5c\x99\x1e\x28\x07\x4d\xcd\xd6\x80\xd3\xb1\xf1\x89\xef\x6b\xdc\x32\x0e\xe6\xe6\x4d\xd1\xf8\x0d\x92\x64\xd8\x30\x42\xd2\xc4\x3d\x83\x58\x1e\xf0\x39\x4b\x1b\x5d\x1f\x69\xf3\xbb\xbf\x04\xb7\xc8\x08\xba\x34\xc1\x58\x0f\x16\xf7\x65\x37\xb6\xa7\xeb\xd0\xa1\x90\x8b\xe9\x49\x4d\x3f\xca\xa9\x87\x1d\xb1\x57\x50"}, -{{0xe1,0xcc,0xb8,0x0a,0x26,0x2f,0xf8,0xaf,0x1e,0xda,0x07,0x5c,0x97,0x2c,0x8e,0x94,0x1e,0x77,0xce,0xf5,0x7b,0xdb,0x0a,0x82,0x57,0x2c,0x28,0x20,0x0b,0x49,0x3c,0xa3,},{0x3d,0x37,0xe2,0xa5,0x02,0x7e,0xff,0xde,0xe0,0x7f,0xa5,0x11,0xe4,0x23,0xb2,0xbc,0x56,0xed,0xce,0xa0,0x75,0xb4,0x16,0x49,0x76,0x67,0x25,0xc6,0xb3,0x0a,0x10,0xf4,},{0xfd,0xa3,0x4b,0x65,0x2b,0x79,0x74,0x6f,0x89,0x7e,0x22,0x2d,0x37,0xb7,0x7a,0xa2,0x50,0xd0,0x2c,0x52,0x7c,0x48,0x33,0xdf,0x80,0xea,0x41,0xd5,0x21,0x89,0xd5,0x07,0x00,0xe1,0x28,0xb7,0x8e,0xe8,0x14,0x9c,0x9b,0x19,0xf3,0xab,0xf7,0x55,0xac,0xef,0x53,0x48,0xf5,0xfb,0xaf,0x1c,0xeb,0x41,0xc0,0x38,0x90,0x6a,0xc5,0x94,0x60,0x01,},"\xcf\xdc\x54\x97\xb0\x23\xaf\xa6\x2a\x7f\xe5\x92\xca\xa9\x2b\x87\x5c\x77\x05\x74\x78\x34\x00\x2f\x77\x84\xff\x16\x61\x89\x39\x88\x15\xd4\xe8\xa7\xa0\x03\x8e\x1f\xda\xdd\xde\xba\x51\x05\x73\x27\xad\x19\x60\xe8\x59\xce\xe5\x65\x26\xbb\xb4\x12\x7b\x6a\x5f\x90\xd0\x4d\x08\xb1\x5e\xee\x66\xc9\xcc\xf8\x8b\x4b\x7d\x1e\xe9\xd3\xb8\xb8\xc6\xf4\x2d\xb3\xc3\x4e\x59\x04\x8a\x15\xc6\x04\x1f\x14\x2c\x40\x79\x36\x8b\x7b\x11\xe2\x99\x70\x11\x8b\x99\xe5\x67\x0a\xe3\x1f\xcc\xfd\xff\x13\x99\x14\x2e\xe0\x6b\x2e\x3e\x2b\x3c\x97\x07\xdd\x64\x11\x97\x86\xe2\xfa\xb4\x7e\x0b\xad\x2c\xc8\xb5\x58\xd9\x63\xbb\x48\xa4\x9a\xd2\xc6\x37\xdd\x35\xb2\x5d\xb5\x4b\xc5\xa2\x63\x02\x22\xfa\x2a\xce\xce\x9c\xe1\x2a\xb0\x81\x30\x77\xf7\x65\x9f\x50\x74\x42\x9c\xa6\xb4\x94\x33\x10\x32\xae\x79\x2a\x59\x9c\x42\x5e\xe2\x97\x45\x1d\xcf\x5e\xe1\x95\x29\x03\x12\x74\x2e\x64\x7a\x77\x95\xb8\x4d\xcc\x66\x4d\xda\xe2\xa1\xfb\xf8\xc4\x54\x8a\x37\xfd\x82\xd8\x10\xe2\x14\x5f\x01\xdf\x1a\x6d\x3b\xcc\x42\xa9\x1a\x10\x76\x8e\x09\x1f\x3d\x69\x32\x9a\x7b\xad\x6c\x07\x2c\xac\x6d\x89\xaf\xa3\x1c\x02\x90\x56\xd6\xb6\x22\x12\x16\x5c\xeb\xcd\x49\xac\x67\x2e\x38\x30\x26\x7a\xf9\xf2\x8e\xa3\x19\xbd\x04\x2f\x6c\x59\xde\x47\x01\xe5\x82\x48\x73\x6c\x8d\x97\x6a\xcf\x93\xb9\x9d\x2f\x46\x47\xa5\x47\xd3\x92\x44\x7a\x48\xda\xc1\x11\x81\xe1\x6b\x15\x01\xa9\x4c\x93\x16\xe5\xa6\x7c\x99\x0b\x35\x81\x0b\x4c\xda\x04\x73\xa6\xa4\xe5\x76\x14\x21\x58\x68\xe2\xe0\x02\xc6\x05\x8b\x42\xe4\xee\xec\x84\x13\x9d\xc1\x9e\xdf\x5f\x80\xae\xef\xfa\x4f\x5b\x07\xe8\xfd\x23\x13\x9e\xdd\xa3\x18\x99\xeb\xe6\xfe\xe7\x86\x43\xce\x68\x6b\x29\x63\xa3\x20\x72\xbd\x3b\x3b\xba\x68\x48\x5a\x05\xc2\xcc\x04\x56\xc3\xda\x50\xc7\xc8\xc6\x51\xa3\x06\x6d\x13\xa3\x66\x0b\xd4\x7a\xb6\xdf\xec\x49\xe0\x15\x57\xa6\x74\x28\x96\xaa\x4b\xc6\x36\x3a\x79\x7d\xba\xd1\xa4\x09\xcd\x4a\x50\x91\x1e\x70\xea\x00\x7a\xf8\xe9\xb1\xbb\x7e\x3a\xb5\x62\x15\xa5\x75\xc9\x0f\x73\x9c\x2d\x48\xb3\xb3\x46\x94\xb5\xac\xdf\x07\x98\x0a\xe5\x28\xde\x06\x21\xed\xfa\xc8\xb8\xfa\x84\x95\x4d\x56\xdb\xb4\xd0\x30\x82\xb9\x84\xf1\x3e\x5d\xbe\x9c\x71\x12\xff\x97\x16\xf5\x50\x53\x06\x46\x62\xce\x0f\xb8\x1e\xa3\x5f\x98\xfd\x2c\xd5\x11\x37\xa4\x6f\x64\xe0\xc1\xca\xf4\x4e\x54\x07\xdc\x96\x17\x60\xb2\x59\x7f\x7f\x92\x00\x61\x7d\x47\x13\x40\xcf\x15\x17\x6c\x3d\xa8\x80\xfe\x4e\x0e\x93\xa7\x2f\xb9\x49\x26\xfa\xed\x86\x5d\xfd\xc7\x72\xe1\x85\x29\x2c\x1e\x36\xb1\x21\x17\x81\xc3\xe9\x38\xe3\xd4\xf2\x4e\x29\xaf\x51\x7a\x37\x96\x83"}, -{{0x4f,0xc5,0x12,0xef,0xd8,0x6e,0x3a,0x63,0xb3,0x95,0xea,0xff,0x1b,0xa0,0x11,0xe1,0x59,0x0f,0xb9,0x32,0x6a,0xd3,0xff,0xed,0xe7,0x87,0x6d,0xcc,0x3e,0x9f,0xab,0xdc,},{0x26,0xc2,0xa2,0x2f,0x9b,0xfa,0xd9,0x06,0x06,0xdc,0x61,0x3f,0xf1,0x07,0x02,0x1f,0xcd,0xdb,0xec,0x72,0x37,0x06,0x66,0x60,0xb4,0x88,0x96,0x43,0x49,0xe0,0xc8,0x28,},{0x82,0xc8,0x24,0xa7,0xd1,0x13,0x9e,0xc7,0x3a,0xe1,0xd0,0x23,0xad,0xf6,0x28,0x11,0x44,0x1e,0x96,0x82,0x87,0xf1,0xa5,0x80,0xb8,0x59,0xcd,0x66,0xcb,0x33,0xb5,0x8e,0x40,0x9b,0xde,0xb2,0xa8,0x74,0xbf,0x4c,0x23,0x61,0x0b,0xd4,0x4f,0x69,0x31,0x47,0xf2,0xf7,0xc2,0x9d,0x44,0x3a,0x90,0x50,0x84,0xf3,0xea,0xaf,0xd9,0x33,0x0e,0x04,},"\x07\xcd\x1e\x9b\xfa\x38\xa7\xd8\x85\x34\x65\xa9\x3c\x77\xab\x4f\x30\xfa\xf9\x14\xe4\x8b\xc4\x76\x3b\xa0\x7b\xf9\x6b\xa8\x08\xc1\xf5\x9a\xd4\xce\x9b\x7d\x92\x1f\xbb\xc7\x79\x65\x9d\x7c\xa3\x6e\xdb\x7d\xd3\xac\xf7\xa2\x94\x52\xa8\x45\xb4\x9f\xb6\x54\x3a\x3b\x6c\x5c\x1c\x29\x3a\xff\x61\x84\x85\xa1\x0e\xea\x60\xee\x96\x49\xac\x9d\x48\x1e\x69\x49\x96\x7d\x39\x38\xb5\x2f\xe0\x9c\x36\xb9\xad\xe0\x75\x81\xdb\x4e\xb5\x42\xa9\x7f\x5a\xc8\xac\x73\xd3\xee\xa1\x84\x72\x25\x56\x76\x0c\xf4\x83\x09\x05\x64\x55\x30\x61\xb9\x0a\x0b\x6d\x2d\xff\x47\x07\xbe\x76\x39\x37\xa1\x05\x94\xa8\x2b\x76\x6b\xb2\xcf\x6d\xaa\x52\xfa\x8d\x7b\x48\xf3\x21\x27\xc4\x31\xad\x9a\xae\xd3\xbf\xde\xb9\x9a\xd4\x21\x18\xa1\xb4\xde\x7b\x99\x21\x34\xed\x9c\xda\xd0\xb5\x29\x6d\x19\x7a\x48\x5e\x49\x3e\xcf\xec\xa3\x65\x3a\xd2\xce\x0f\x92\x41\xaa\xbc\x09\x6d\x7c\x4b\xa6\x03\xba\x7d\xdd\x07\xa8\xb2\x57\xfe\x52\x32\x76\x41\x70\x73\xa6\x5f\xa4\x43\x42\x56\xfd\x1f\x23\x9e\xc1\xde\x5d\xa1\xa0\xa8\xc5\xe6\x86\xee\x14\xd9\xdf\xa4\x38\xc5\x3b\x99\xc9\x54\xaf\xab\x2f\x79\xe6\x0b\x71\x26\xf2\xcb\x58\xa2\x6e\x29\x0d\xa1\xdc\xcf\xc3\x01\xf2\x39\x74\x8e\xde\x7b\xcf\x1b\xb7\xcc\xb4\x72\x0e\x69\x2f\x57\xe5\x3e\x6f\x59\x07\x53\x99\xe1\x08\x0a\xc8\xaa\x9a\x61\xa5\x68\xc4\xc5\x69\xd3\x6e\x76\xa2\xd7\x27\x1f\x2c\x44\xde\x4e\x36\x3a\x8c\x91\x6a\x4e\x44\x6b\x02\x7b\x64\x39\x2e\x90\xce\xab\xf6\xb6\x07\x1b\xc4\x7a\x13\x79\xb6\xaa\x63\x44\x76\x3b\x2a\x0e\x7f\xf7\xc4\xa2\x7b\xff\x31\x06\x72\x1c\x25\x3e\x4c\x1d\x67\xc3\x7f\xa3\xd7\xc1\xec\xd0\x55\xb8\xe9\x29\xd5\x2a\x8e\x45\xed\x89\xfb\x18\x0f\x74\xb5\x52\xfe\x06\xf0\x66\xc7\xe4\x31\x8c\xa2\xf9\x15\x94\x6e\x83\x20\xd5\x80\x65\x61\x47\x2f\xb8\xff\x7f\xa8\x07\x2d\x8e\x6f\xd1\xce\x63\xcf\x87\x38\x2f\x7b\x94\x04\x54\x0c\x1d\x40\x6c\x70\xb2\x26\x85\x36\x77\x09\x26\x45\xce\x99\x69\x22\xe7\x34\x5d\xc0\x7f\xb7\x33\x9f\x9a\x54\xff\x07\x35\x2d\xd2\xb9\x93\x06\x3c\x2c\x83\xd1\x28\x1a\x4f\xd1\x78\xe5\xa5\xf8\x0a\x5b\x33\xc2\x29\xd0\x57\x83\x67\xd4\x41\x92\xe9\xa4\xd2\x1e\x97\x34\xd3\xbd\xa0\x83\xb7\x0f\x47\x10\x3f\xd1\x25\x17\x70\x21\xdf\x3e\x53\xd7\x99\x86\xef\xea\x2d\xc0\x4f\x02\xc0\xac\x27\x87\x88\x31\x9e\xf3\xa9\x13\x2e\x62\x32\xea\x6d\xb3\x9c\xa5\x87\x08\x55\xf9\x59\x2f\xff\x6c\x20\x9a\xd2\xf1\xc2\x9d\xd1\x68\x55\x28\x98\x97\x9e\xcf\xf8\xc8\x11\x27\x24\x8f\x83\x10\x51\x53\x00\x65\x61\x29\xd9\xb7\xac\xbb\x7e\xd1\xe4\x6b\xc9\x8c\x04\xd1\xa3\x5b\x18\x91\x37\x38\xe9\xdd\xe4\xd2\xb0\x65\xf4\x18\x42\x42\xd8"}, -{{0x0b,0x7d,0xfa,0xd0,0x5b,0xa6,0x65,0x11,0x1e,0x16,0x81,0xbd,0xc0,0xbc,0x8b,0xa9,0x73,0x76,0x7c,0xb8,0x58,0x77,0x02,0x0a,0x2d,0xbf,0x91,0x83,0x25,0x57,0x1d,0x9f,},{0x95,0x05,0xd9,0xe8,0x6d,0xce,0xf5,0x6c,0x9d,0xb7,0x6f,0x28,0x62,0xb9,0x0e,0x1f,0x27,0x73,0x20,0x2f,0x17,0x50,0x40,0x5e,0x7e,0xe5,0xae,0xd0,0xfc,0x54,0xf8,0xb9,},{0x41,0x5a,0xdb,0xb2,0xf2,0xb9,0x84,0x05,0x77,0xfd,0x18,0x41,0xf9,0xaa,0xe2,0x52,0xaf,0xe8,0xf5,0xa7,0x22,0x36,0x01,0x7d,0x50,0xdb,0x22,0xd2,0x28,0xcd,0xee,0x9f,0x5b,0x3e,0x8f,0xe9,0xa1,0x7a,0x4d,0x4e,0x98,0xb7,0x34,0x13,0x81,0xe8,0xd8,0x62,0x5c,0xdc,0xea,0x95,0x6d,0x25,0x3b,0x74,0xe0,0x2d,0xac,0xb8,0x49,0x20,0xa0,0x09,},"\xc4\x3f\xd3\x4b\xb1\x42\x4c\xca\x4e\x4d\xfb\xa7\x5c\x28\xbe\x80\x18\x44\x44\x6c\xa0\x89\x02\x08\x85\xc7\x48\x38\x25\x47\x16\x4a\x9d\x4a\x7f\x95\x70\xd3\xd1\x71\xad\x69\x81\xab\x50\xee\xee\x08\xa4\xa6\xc6\x6d\x76\x99\xd2\x3e\xdb\xe1\xfa\xaf\x44\x66\x0c\x72\xf4\x55\x2d\x87\xd2\x65\xac\xe8\x79\x28\x23\x47\x4b\x90\xa5\xd7\xf7\x40\x1d\xeb\x93\x77\x62\x7f\x60\xb0\x36\xb3\x6e\x04\x4e\xb7\x6b\xf1\x32\xfd\xdf\xcc\x0e\xf5\x70\x4a\x63\x3d\x84\x5e\x96\x2b\x47\x51\x7f\x0b\xaa\x34\xd3\xd6\xe9\xa8\xb9\xf8\x16\x8b\xcd\xc8\x4c\x6d\x2b\x30\xc6\xf3\x43\xe7\x53\x57\xf7\xf2\xc0\x03\x9b\xd2\x54\xb2\x44\xd3\x6c\xd6\x16\x75\x58\x1f\xb8\x34\x57\x0e\xd4\x11\x3a\x78\xe6\x06\xf1\x45\xa1\x11\x99\x2c\x2c\x6b\x61\xc4\x26\x76\x28\xec\x87\xcd\x88\xc3\x6a\x3c\x84\x70\x6e\x44\xae\x96\xa9\x6e\x0c\x84\x80\x31\x85\x46\xd6\xea\x6a\x6d\xf1\x8a\x2b\x4f\x19\xf8\x36\x0c\xfb\xce\x4e\x9d\x1c\xf1\x01\x1f\xfe\xa5\x63\x3a\x66\x61\x9a\xa4\xa6\x5c\xf6\x9b\xe4\x45\x96\x17\x94\x5e\x43\x59\xa9\xd4\x32\x60\xca\x1a\x20\xf4\xed\x7c\x1a\xe5\xff\xff\x3b\xd9\x22\x94\xea\x70\xab\xba\xe0\x38\x5b\x09\x35\xcd\x1c\x0e\xb5\x18\x30\x29\xc5\x85\xa0\x29\x4b\x79\x99\xe3\x2e\xf7\xa2\x90\xfc\xb0\x95\x67\x5d\xc4\xf6\x01\xe8\xf2\xc9\x6f\x35\xb7\x34\x9a\x37\x05\x75\x09\xf4\xec\x70\xc9\xf5\x0f\x60\x11\xf1\xf5\xe6\xb0\x61\xc0\x91\xd1\x1c\x0e\xd5\xde\xc8\xec\xe8\x81\xaa\x34\x05\x08\xf6\x96\xd9\xe9\xcc\x72\x98\xe6\xbc\xcd\x7c\x21\x0e\x2c\xe0\xde\xd8\x35\x92\xa3\xcf\xa1\x3e\x80\x78\xfd\xb3\x25\x8b\x39\xf1\xd1\x1c\xdf\xe0\x96\x70\xc1\xe6\x0a\x39\x10\xa4\xff\xf5\x1c\x6c\x7f\x7d\x66\x24\xf4\xc9\x3d\xf8\x88\x8c\x52\x6f\x48\x4f\x9b\x13\xe0\xa7\xf6\x29\x64\x78\x39\x78\x68\x4e\x29\x26\x79\x80\x0e\xd5\xeb\x28\x0e\x28\x7c\x7e\x63\x9e\x85\xfa\xa5\x3f\xba\x2f\xa2\x04\x5c\xe2\x7d\x8f\xb3\x08\x36\x07\x26\x55\x0d\xf9\x75\x2d\xb3\x05\xf8\xf0\x66\x47\x97\x0d\x01\x46\x91\x99\x9a\xfa\x97\xb6\x19\x3f\xfc\xc6\xd5\x32\xf4\xfa\x69\xe1\x33\xa1\xd1\x0f\x30\x47\xfc\x00\x38\x1f\x49\x97\xbb\x84\xe5\xb6\xcd\x60\x28\xc6\x21\x32\xcf\xc0\x24\xbf\xeb\x98\x03\x01\xf2\x95\x12\xbb\xd1\x09\xd0\x89\xac\xe1\x82\xcf\x9c\x2f\xfa\xb1\xb1\x7e\xb0\x0b\x6e\xb4\x6a\xe1\x98\xda\x99\x3f\x5e\xfe\x7c\x1d\xc2\x2d\x25\x04\x7c\x1e\xe5\x24\x65\x17\xe7\xf5\x75\x8f\x99\x6a\xbd\x83\xf1\x3d\xa2\x2c\x13\xdd\x20\x5e\xe1\x91\xb5\x5a\xfd\x48\x31\xef\x07\x8b\xb6\xea\x07\x3a\x62\x5b\xc9\x7c\x81\x29\x61\x60\xbb\xf2\x55\x9b\x27\x5c\xc3\x7c\xcf\x01\xb9\x1f\xd8\x7d\x4d\x99\xa3\x67\xaa\x99\x78\xda\xdd\x06\x89\xf8\xa6"}, -{{0x78,0x18,0x8d,0xf8,0xc7,0x54,0x78,0x56,0x21,0xe2,0x7a,0xe5,0x8e,0x10,0x0d,0x50,0x80,0xe1,0x6e,0x0a,0x15,0xe2,0x77,0x05,0x1f,0x95,0xf0,0x80,0x90,0x0e,0xc0,0xd3,},{0xa1,0xbd,0xee,0xe9,0x8b,0x07,0x57,0xba,0x9c,0x2d,0x84,0x09,0xb8,0x74,0x24,0xe6,0x4e,0x42,0xf9,0x93,0x2a,0xcf,0xa9,0xbc,0x71,0xfb,0x3f,0x8c,0xa0,0xe1,0x1d,0x52,},{0xb9,0x41,0x14,0xed,0xa4,0x6c,0xcf,0xc2,0x2a,0x44,0x71,0xa6,0x4d,0x79,0x08,0x92,0xe5,0x9c,0x5d,0x50,0x56,0x18,0xeb,0x0e,0x70,0x13,0x92,0xc7,0x09,0x61,0x3e,0x2d,0x50,0x3a,0x5c,0x2b,0x66,0x60,0x1e,0x63,0x6a,0x3c,0x1c,0x7d,0x49,0xb1,0xac,0x79,0x8d,0x90,0x89,0xb0,0xf9,0xcc,0xd0,0x57,0x9b,0xb9,0x06,0x34,0xd0,0xbd,0x75,0x0e,},"\xcf\x70\xcc\xa5\x7f\xeb\x1b\xee\xfe\x98\x5a\xd5\xaf\x9d\x43\x48\xd3\xa4\x6a\x63\xde\x10\x75\x38\x1f\xb3\x63\x9a\x04\x4f\xd6\xe6\x09\x1f\x5d\xb9\xc9\x4d\x39\xbe\x0f\x13\xad\xe6\xd9\xa0\x74\xe6\x7b\xa7\x06\xb3\xa8\x80\x62\x95\xf6\xb6\x54\x86\x57\x28\xc5\x8c\xa6\xe9\x41\x9d\x5d\x04\x3f\x21\x10\x81\x4b\xbf\x36\xfc\x40\x70\xe4\xd9\x45\x49\x65\xc2\x51\x20\x2c\xa3\x95\xef\xe3\xfd\xbd\x54\x4f\xeb\x18\x7e\x34\xca\x3c\x80\x79\x51\x79\x55\x2f\xce\x9a\xa8\x04\x43\x0e\x5b\x6c\x86\x85\x34\x1e\x91\xd5\x88\x9f\xbf\x3f\x98\x19\x04\x62\x0f\xfe\x70\x13\xf5\x3b\x93\x9e\x17\x44\x3d\x61\x4e\x7e\x6b\xb5\x7a\xd6\x74\xf3\xb4\xb0\x01\x63\x05\x26\xcf\x73\x02\xa7\xd0\xaf\xe7\xdc\x24\xd6\xda\xde\xf6\xfe\xba\x3f\x96\x97\x3a\xa5\xb8\xd6\x27\x52\x62\xe4\x30\xa8\x2f\x67\x86\x96\x97\x1a\x8b\x60\xe3\x8d\x3b\x2b\xcc\x17\x0d\x5b\xc2\x03\x02\xa3\x9c\x59\x6d\x27\xfe\xe3\x9e\x5d\xa5\xb1\x0e\xa9\xf3\x82\x29\x9e\x19\x81\x97\x17\xa7\x18\xd3\x7d\x15\x5f\x13\x92\x31\x82\xb5\xb7\xa1\xc5\x4c\xa1\x09\xb2\x2c\xa8\xe8\xb2\x6c\xa5\xca\x3f\x3b\x90\x62\x21\x94\x61\xba\xce\x97\xe8\x90\xc9\x4e\x41\xca\x3d\x84\x58\x7f\xbd\xf6\xe2\x40\xc3\x5c\xca\xb7\x1d\x58\x47\x7d\x28\x16\x8e\x93\x37\x26\x86\xd4\x2a\xad\x32\x4a\x3f\x16\xaf\xe0\xe9\xb8\x9e\xe2\x0e\x48\x5f\xe6\xc8\x64\xb5\x01\x3b\xa8\x83\x99\xee\xaa\x15\x98\x35\xa8\xb2\xbb\x2f\x25\xf5\x79\xca\x3b\xae\x67\x5c\x63\xda\x1b\x50\xd9\x9d\x4e\xd9\x78\x69\x2e\x56\x00\x23\x3f\x38\xab\x7e\x7a\x5a\xe0\xfb\xf8\xc0\xb6\x9c\xc3\x8b\xd3\x0e\xab\xd9\x77\xef\xa0\x5e\xe2\xc8\x35\x14\x30\x2b\xd4\x0c\x4b\xdc\xe7\xa4\x11\x0a\xfb\xb6\x57\x9c\x62\x0e\x97\xf8\xcf\x2e\x9b\xab\x2d\xcc\x7c\x33\xf1\x96\xe5\x7f\xe7\x61\xa0\x50\x12\x28\x94\xb7\xa7\x5a\x92\x95\x31\x99\x6d\xda\xad\x78\xde\x1d\x4d\x92\x4c\xd9\x3a\x61\xdf\x22\x77\x76\xbc\x1c\x39\xfb\xb8\xde\x1c\x44\x38\x86\x8b\x6a\x3a\x2c\xd9\x4c\x07\xb2\x9e\x3f\x6b\x23\xcc\x7e\x0b\x63\x68\x90\x09\xd9\xd0\xba\xe1\x60\x6b\xaf\xc7\xa8\x08\xf2\xd2\xfa\x25\x62\xb8\xdc\x09\x38\x42\xc0\x1f\xdb\x84\x0d\xa4\x86\x0a\xce\xd3\xfc\x52\x5c\xa3\x34\xed\xcf\x65\x94\x8b\xc4\x16\xf9\x8c\x45\x0f\x00\x12\xa6\x10\x7d\xd7\xf8\xed\xe4\x0e\x1c\x48\xc9\xe8\xa5\x65\xa8\x10\xb9\xcf\xd2\x03\x56\xdb\x19\xf1\xdb\xde\x59\x89\x21\x33\x2e\x0d\x81\x3f\x0c\xb8\x76\x84\x37\x03\x88\x77\x2f\xf3\xcb\xfc\xbf\xa2\x99\xc1\x98\xc9\x7b\xfb\x96\x17\x76\x8a\x05\x16\x1f\x41\x69\xff\x5d\xe5\xd9\xf4\x00\x62\x09\x0f\xb8\x82\x98\x4d\x9d\x5c\x7a\xa7\x8e\xdd\xcb\x96\x34\xe4\x66\xb8\x85\x3d\x51\x2b\x4a\x54\x6d\x74\x23"}, -{{0x73,0xcb,0x02,0xb0,0xbf,0x26,0xa0,0x15,0xda,0x1d,0xc3,0x01,0xfc,0x12,0x5d,0x7e,0x6c,0x30,0xb6,0x3c,0x9e,0x6e,0xee,0x9e,0x06,0x5d,0x4e,0x84,0x71,0x32,0xc3,0x25,},{0xac,0x9e,0x3d,0xd2,0xce,0xb9,0xb2,0x3e,0x74,0x8c,0x04,0xba,0x75,0x77,0xfe,0xdf,0x7c,0xea,0xb9,0xed,0x87,0xdc,0x43,0x0b,0x5f,0xe2,0x2e,0xac,0x50,0x95,0x0e,0x0d,},{0x1a,0x5d,0xd4,0xc8,0x91,0xc8,0xe1,0x32,0x57,0x01,0x87,0xc2,0x3b,0x9a,0x1e,0x4b,0x26,0xf0,0x54,0x60,0xe8,0x75,0x67,0x38,0x19,0x39,0x6d,0xf5,0x61,0xc8,0xaf,0x0e,0x48,0x33,0x3b,0x62,0xc7,0x77,0x29,0xd4,0x9f,0xc4,0x0e,0x17,0x4a,0x7f,0x3c,0x21,0xf8,0x5e,0xf4,0xd3,0x39,0xce,0xb8,0x0b,0xd2,0xe0,0x37,0xd8,0x03,0xaf,0x56,0x0e,},"\x0a\x2b\x61\xba\x35\xe9\x6e\x58\x19\xb8\x8b\xfd\xb2\x8b\x7c\xe0\x2e\x64\xae\x9c\xf5\x72\xb2\x1f\x13\x55\x2c\x0d\xb1\x0f\x39\x60\xd4\x4b\xa3\x47\x2f\x43\xab\xc4\xe6\x29\x5b\xdf\x79\x0b\xd9\x33\xba\x39\x75\xfd\x44\x65\xfa\x3e\x2f\xe2\xdb\x02\xb6\x37\x77\x52\x22\x3d\xec\x98\xfc\xb2\x40\x4f\x3a\xba\x43\x26\x5a\x6f\xa7\x97\x6b\x6c\x6c\xb6\x86\x8b\x88\x1b\xd6\xf3\xd2\x5c\xd9\xd6\xf7\x0e\x51\x2f\x80\x89\xc8\xef\x26\xfd\x58\x24\x50\x53\x77\x9e\x59\xc4\x72\x5a\xef\xa2\x64\x67\xc9\xf5\x00\xe1\x7f\x3e\x15\x73\xf1\xa8\x55\xe9\xb8\xb2\x19\x25\xea\x05\x27\xf3\xce\x8d\x88\xfb\x54\xa4\x7a\xbe\xed\x14\xf3\x99\xcc\x2d\x9f\x1f\xe5\x46\x65\xfa\xe0\xa8\xf0\xc6\x88\x72\xa6\x00\x04\x6d\x1d\xc3\x63\x97\xd3\x10\xce\x39\x3f\xce\xaf\xe8\x7c\x17\xeb\xe1\x22\xfd\xb5\x43\xae\xa7\x10\x85\xba\xec\x98\x27\x3f\x41\xac\x96\x69\x8c\x15\x0c\xf9\x11\xd0\xe5\xde\x23\x92\xd8\x48\x41\xd0\x12\x76\xae\xfb\xfe\x99\x95\xe1\x0a\x6d\x46\xef\xdc\x26\x78\xd4\x56\xc9\xf3\x6b\x2e\x10\x11\x4d\x11\x87\xe7\xac\xa7\x39\x03\x7e\xa5\x1f\x85\xfd\x62\xa2\x94\x29\xba\x52\x9c\xdd\x8a\xd9\x13\x47\x49\x74\x87\xed\x7e\x87\x09\xd4\x77\x6e\xf6\x86\x70\x79\x2d\x06\x15\xbc\x96\xda\x51\x78\xd6\x06\xdb\x63\xe4\xe5\xcb\x17\x2a\xcf\xbc\x1c\xbe\x20\x26\x93\x50\xf1\xb6\x05\xf3\x5d\xcd\x47\x91\x35\xbd\x30\xfb\x4b\x5a\x39\x17\x6c\xff\x74\x4d\xdb\xb3\x06\xc9\xe7\xb4\x16\x7d\xe0\x37\x9a\x61\x66\xbe\x5a\xaa\x74\xd7\x15\x7f\xac\x95\x7d\x88\xdc\x57\x59\x7c\xfe\xf2\x3e\xb5\x10\x8b\x3c\xe5\x3f\xc6\x32\xda\xd1\xb9\x72\xa2\x9d\xa5\xde\x32\xd2\x0d\x8e\xce\xde\x67\xff\x00\xda\x4a\x08\xa0\xcc\x1a\x98\xbe\xe7\xa9\x4e\x3c\xb3\x2f\xee\x94\xae\x25\xa4\x13\x54\x47\x02\xc3\x7b\x3e\x17\x78\xa0\x70\xcd\xd4\x84\x0b\xd3\x9f\x5f\x45\x79\x51\x92\xa8\x67\x86\x38\x76\xed\x0d\x13\x0d\x46\xe2\x91\x39\x35\x08\x28\x09\xf7\xe1\x5a\x49\x67\x10\xf2\x55\xd7\x83\xda\x3d\x01\x6a\x65\x4c\x15\xff\x5d\xf9\x07\xa3\xcc\xaf\x37\xcf\xe1\x1c\x8c\x3d\x49\x65\x07\xd6\x76\x0c\x05\x38\x20\xf0\xf5\x94\xc3\xd0\x1c\xa2\x69\x17\x8a\xca\x52\x5a\xb2\x82\x1e\xf5\x5f\x92\xd8\x5f\xe6\x85\xea\x34\x47\x2e\xd1\x39\x81\x71\x06\x4d\x74\xa4\x22\xec\x91\xd1\xa6\x70\x61\x8f\xc9\xf3\x24\x24\xbc\xb1\x1a\x77\xf6\xfb\x4e\x2f\xef\xd2\xc4\xe8\xa7\x3c\x45\x28\x86\xe9\x31\x66\x4d\x1a\x83\xbd\x92\x73\x29\xc0\x4d\x25\x0b\x83\x52\x1d\x7d\xc1\x3c\x91\xce\xe1\xec\x05\x0e\x11\xd4\x2a\x4b\x0c\x8c\x06\x9b\x61\xc4\x42\x2d\x3a\x49\xc0\x7e\xff\x29\x05\xb7\xbc\x7f\x4a\x5b\x43\xe6\xb0\xd6\x1d\xfb\x50\xe4\xee\xa2\xe9\x0d\x29\x8a\x78\x1d\x05"}, -{{0xdb,0x05,0x60,0x63,0x56,0xba,0xcf,0x23,0xaf,0xf6,0xcd,0xdd,0x42,0xb2,0xc6,0x94,0x35,0x2b,0x5a,0x0f,0xec,0x56,0x0a,0xff,0x54,0xd9,0xbd,0x97,0x10,0xef,0xe0,0x6a,},{0x32,0xa5,0xc7,0xcc,0x49,0x09,0x78,0x6b,0x48,0xa5,0x3f,0x31,0x09,0x3f,0x54,0x9a,0x9f,0x17,0x30,0xca,0x66,0x90,0x38,0x3f,0xdb,0x5f,0x14,0xc2,0x66,0x6e,0x31,0x32,},{0x53,0x09,0x9b,0x76,0x6a,0xdf,0x29,0x44,0xb6,0x82,0x13,0x74,0x84,0x2c,0x25,0xd6,0xe6,0x7b,0x0c,0xcd,0xe9,0xc6,0x37,0xfe,0xcb,0x11,0xb8,0xb8,0xb0,0x72,0x03,0xe3,0x07,0x57,0x32,0x80,0x5f,0x4f,0x14,0xae,0xae,0x73,0xbd,0x62,0xe3,0x08,0xb5,0x88,0x7d,0x68,0x9e,0x29,0xcd,0x89,0xb2,0x3a,0x47,0x69,0x43,0x11,0x07,0x17,0xb1,0x00,},"\x1b\xc9\xc2\x83\x3f\x37\xcd\xf1\x35\x6f\xad\x16\x67\x68\x64\x27\x17\x70\x1b\x38\xa0\xab\x0c\x2f\x58\x1a\x26\xd2\x22\xd6\x5c\xce\xe4\xbf\x0f\x6d\xfe\x64\xd3\x3b\xc0\x23\x9f\x71\xd4\xb8\x26\x44\xb0\x16\x25\xa1\xa3\x5f\xe7\x98\x67\x62\x39\xe0\xca\x77\x9e\xf2\x31\x38\xee\xbe\x3b\xd1\x9d\xe2\xd8\xf7\xc1\x5b\x4d\x96\xf1\x3e\x51\xbc\x63\x3b\xea\x5d\x61\x22\x5b\xca\x1d\x63\x39\xba\x53\xe8\x1f\x7d\x8d\x24\xc5\xd6\x0f\x04\xce\x8c\x72\x67\x61\xd2\x64\x58\x4f\x1c\x7e\x5b\x5b\x69\x92\x45\x6c\x1c\x76\x89\x2d\x63\x52\x11\x1e\x3b\x92\x6f\xe0\x25\xc0\x00\x9d\xb6\x7c\xe0\xdd\xc7\xf7\x64\xe0\xc9\xad\xb0\x48\x1b\xc2\x79\x54\x84\xd9\x63\x73\xa9\x62\xa7\xb7\x4a\x55\x96\xf5\x27\xa7\x34\x76\x49\x8c\x78\x23\xdf\xfa\x6c\x85\x43\xb0\x79\x71\xb5\xaa\x27\x1c\x12\x25\x5e\x09\x18\xdd\x73\xf5\x0c\x30\xc9\xa8\x5a\xc7\xc2\x99\x3d\xd6\x55\xda\x59\x43\x12\x63\xf5\x91\x4b\xe7\x06\x37\x4b\xe9\xc0\x75\x85\xc2\x87\x13\x28\xb4\xdb\xc3\x94\x01\xc9\x57\x07\x38\x7e\x6e\x06\x9d\x44\xb9\xd8\xfb\x05\x8f\x22\xe3\x15\xaa\x0d\x5b\x4f\x11\x68\xfc\x10\x79\x62\xb0\x64\xf7\xd8\x45\xaf\x8e\x21\x31\x95\x1d\x1c\xd6\x6d\xc8\x4d\xba\x46\xd2\x00\xaf\x4f\x4c\x5f\x51\x22\x1b\xc9\xb2\x19\x69\x42\xf8\xb4\x0e\x7d\xdb\xc9\xae\xb3\xd9\xaf\xc0\x71\x25\x95\x13\x13\x5a\x01\x6f\x28\x66\x09\x9f\xa1\x0f\x4c\x3b\x73\x50\x0b\xd5\x5c\x47\x7b\x24\x15\xe1\x0a\x27\x9b\xa1\x10\xd2\x94\xf3\xdd\x18\x42\x17\x7d\x0b\x4b\xfb\x17\x34\xdd\x0c\xcb\x7e\x39\x4b\x43\xd1\x6f\x0b\x75\x48\x36\x22\x80\xf4\x34\x76\x4d\xa5\x7f\x19\xed\x3e\x30\x2e\x53\x70\xfb\xa4\x96\x64\xc2\x30\x05\x74\x33\xcc\x64\x7e\xb2\x7c\xd2\xc7\xc1\x8c\x7d\x66\x90\x6f\x08\x82\x46\xc2\x2f\x7f\x79\x03\x99\xde\xb4\xc5\xfb\xb9\x06\x18\x17\x69\xbe\xf5\xaf\xbe\x8a\xd1\xf5\xde\x55\xbe\x58\x8f\x52\xf6\x9c\x54\xd4\xef\x5a\x96\x9a\x0d\x99\x5c\x27\x40\x7b\x23\xed\xd9\x24\x3d\x24\x99\xfd\xf2\x94\x73\xb1\x95\x5c\x84\xb3\xf7\xcb\xdc\xd8\x1b\x76\x56\xec\x0b\xe9\xe0\xfd\xb3\x38\x13\x56\x96\x0f\xd0\xca\x70\xe7\xea\x74\xb6\x46\xfc\xd3\x13\x94\x8e\x6d\xdb\x47\x60\x94\x76\xfb\x6f\xa4\x84\x2f\xa7\x88\xa0\xd5\x7b\xe3\xb0\xa6\xca\x18\x19\xf7\x16\x14\x76\x00\x43\xec\x49\x04\x88\x19\x39\x96\x8a\x43\xb5\xd1\x92\x8f\x84\xa5\x91\x90\x93\xbc\x38\x41\x58\x81\x71\xa9\xcd\x39\x0f\x8f\xcd\x61\x53\x8b\x54\xe6\xef\x99\x77\x05\x73\xe1\x98\x6d\x15\x0f\xa9\x6b\x7a\x07\xe1\xd1\x94\xaf\x1c\x0b\x40\x55\x00\xac\xb3\xd1\x0e\x3b\xe6\x47\xc8\x98\x62\x00\x6f\xa7\x85\x83\xe7\x61\x66\x84\x29\x20\x16\x0e\xb5\x7f\x0b\x2a\x6e\xdf\x19\x3c\x44\xc5\xee\xac\xf4"}, -{{0x1d,0x13,0x9b,0x1a,0xd0,0xc3,0xaf,0x1d,0x5b,0x8b,0xe3,0x1a,0x4e,0xcb,0x87,0x8e,0xc6,0x67,0x73,0x6f,0x7d,0x4f,0xa8,0x36,0x3a,0x98,0x09,0xb6,0xd1,0xda,0xbf,0xe3,},{0x24,0x28,0xcf,0x1d,0xeb,0x20,0xfb,0xad,0x1f,0xdc,0x66,0x5d,0x82,0x5b,0x61,0x41,0x22,0xdf,0x10,0x1f,0xbe,0x14,0x73,0xa7,0x99,0x96,0xba,0xf6,0x96,0x74,0x34,0xb8,},{0xdd,0x64,0x5e,0x51,0xed,0xab,0x04,0xdb,0x31,0xe3,0x31,0x72,0xcf,0x27,0xac,0xee,0xed,0xcc,0x04,0x63,0xa9,0x63,0x91,0x4a,0x0e,0xac,0x8e,0xfd,0x5a,0x34,0x34,0x1f,0x6b,0xbc,0x52,0xe0,0x42,0xba,0xaf,0x3b,0x40,0xc8,0x9a,0x57,0xef,0xb6,0x45,0x74,0xe6,0x96,0x77,0xfc,0xe9,0x55,0x24,0x6c,0x1f,0xc0,0xf2,0x69,0xef,0x81,0x90,0x00,},"\x8d\xf2\xd2\xdf\x9b\x98\x4d\xa8\x44\x33\x48\x6a\x81\x3c\x98\xc5\x97\x3a\x69\x6c\x11\x62\x46\x10\xb2\x3a\xa4\x38\x08\x34\x64\xf6\x5a\x76\x79\x66\x15\xb7\x28\xc2\xed\x4e\x60\x71\x58\x55\xaf\xc2\x39\x45\x0d\x5b\xc0\x91\x1f\xf2\xa8\x52\x30\x20\x5c\x6f\x13\x49\xba\x5b\xd8\x7e\xa6\xf7\x20\xdb\x6b\xa7\x0b\x77\x42\x17\x88\xe0\xc6\x54\xae\xbc\x23\x07\x4c\x5f\x41\xd2\x29\x07\x72\x14\x0d\x98\x1a\x6b\xc4\xfe\x70\x9a\x26\x8e\x64\x17\x2a\x02\x6b\x27\x01\x18\xb4\xdb\x51\xab\x6a\x13\xc9\x9b\x06\x31\x86\xd8\xd5\xb3\x38\xe9\x77\xed\xdc\x6b\xb5\xfd\x7d\xd5\x7d\x98\x45\xa3\xc3\xfe\x76\x17\x7d\x57\x38\xdc\xa1\x6a\x8f\x91\x02\x85\x75\x00\x17\x4f\x23\xff\x4c\x3b\xf3\xc8\x53\x6f\x11\x58\x0e\xf8\x51\x4a\x40\x9f\x5b\xbc\x9c\x02\x96\xf1\x2e\x34\x78\xd4\x08\x7f\x95\xef\xaa\x6c\x63\x60\x71\xd2\x11\x57\xbf\x11\x77\x4b\xbf\xe7\x69\x33\x06\xca\x72\x13\xda\x47\x13\xeb\xaa\xab\x35\x54\xed\xf0\x80\x11\xa5\xff\x73\xda\x12\x03\x75\xae\xd1\x96\x28\x67\x0f\x28\xab\x24\xb6\xf5\xd5\xa1\xd5\x70\x48\x0f\x65\xd3\xc1\x52\xbf\xf1\xb4\x7b\xf0\x66\x69\x29\xcb\x7c\x99\xd9\x03\x3f\xaa\xe8\x53\x4f\xc3\x5d\xa7\x30\xb8\x11\xeb\xcc\x25\xae\x10\xa1\x95\xaa\xb1\x2c\x32\x6a\xa4\x5b\xf8\x05\xc6\x2d\xd4\xcd\x5f\x86\x86\x23\xc0\x4a\x8e\x1c\x6a\xa7\x2f\x1e\xa4\x40\x0c\x60\x86\x7d\xff\x62\x2f\x31\x64\x34\xf1\xec\x89\x50\x3c\x6f\x9f\x65\xc1\x37\xb4\x94\x4c\xbc\xb3\x5f\x08\x6c\x74\xcc\xea\xfa\x22\x42\xac\xca\x6f\xfe\x61\x1c\x4b\x55\x87\xf5\xb7\x5f\xfa\xd3\x49\xf0\x0b\xf9\x6e\x4a\x58\x0a\x87\x5b\x92\x65\x40\x69\xb6\x2e\xea\xc0\xbf\x78\xe5\xae\xdd\x71\x86\x9e\xe0\x5b\x9a\x94\xe1\xc9\x8e\x35\xa9\x78\x00\xa4\xa2\x12\x20\xb0\x39\xcd\x5e\xbb\xb7\x56\xd4\x0b\x40\x42\xe2\xc8\x4a\x2a\xe9\x81\x82\x51\x1d\xae\x8e\xd3\xb8\x9f\x4f\xa0\x0f\xb8\xed\x94\x63\x16\x45\x97\x10\x05\x2a\xd4\xc0\x2f\x63\xdf\x05\xd3\xbb\x1a\xce\x33\x67\x21\x51\xbd\xf5\xda\xb4\x6c\x7b\x58\x3d\xb3\x73\x89\x9d\x4f\x03\x5b\x6c\x11\x12\x58\xb4\xe5\xa9\xe7\x07\xa1\x1d\x21\x5e\x44\xe6\x8e\xf1\xa6\xf0\x53\x80\x9a\xa5\x1b\xd9\x02\xe1\x3c\xa9\x9c\x1b\x1c\xec\xc8\x3b\x9c\x23\x5c\x71\x0e\x79\x7d\x2b\x1a\x24\x9b\x2e\xa0\x79\xb5\xc1\x67\x4e\xd7\x16\x9f\x1b\x6e\x67\xf1\xac\x77\xf8\x6b\x74\x32\x98\x96\x93\x35\xa7\x72\x44\x0f\x7f\xbf\xa7\x25\x13\x50\x0d\x84\x16\x61\x14\xa8\xfd\x54\x13\x94\x64\xd4\x2b\x99\x55\x30\xd3\x23\x70\xb6\x9b\xff\xc7\x58\x9d\x6d\xcc\x97\xe0\xbf\x17\x85\x6c\xc3\xbf\x41\x64\xdb\xec\xcc\x8a\x88\x1d\x41\x4d\x6a\x62\x02\x92\x76\xc5\xf8\x13\x7c\x0b\x3c\x68\xbc\x8f\x4b\xd4\xe7\xcf\xf6\x5e\xf2"}, -{{0x4d,0x22,0xe3,0x31,0xe0,0xcf,0x6f,0x6a,0x27,0x2d,0xb4,0xd2,0x06,0x87,0xff,0xb0,0x59,0xf1,0x22,0x5d,0x81,0xe4,0x11,0x23,0xb8,0xc8,0x9b,0x07,0x4d,0xe7,0x6a,0x3b,},{0xb1,0xe4,0xcf,0xae,0xad,0xd6,0x7b,0x12,0xd7,0xb9,0xdb,0xfc,0x0f,0x88,0xed,0xd0,0x37,0x3f,0x9a,0x88,0xc7,0xfa,0x33,0xfb,0x7f,0x2b,0x1e,0x47,0x5e,0xcc,0xb6,0x1b,},{0xc3,0x66,0xb8,0x02,0xf6,0x82,0xfc,0xd7,0x05,0x25,0x26,0x4f,0xb1,0xa3,0xcb,0xcd,0x0e,0xe3,0x5e,0xcf,0xf5,0x97,0x7c,0x2a,0x55,0x4d,0xa9,0x39,0x22,0x9f,0x17,0x81,0x9a,0x96,0x1e,0xa7,0x4c,0x3d,0x7a,0x78,0x81,0xac,0x5c,0x1f,0xa1,0x6b,0xf9,0x84,0xd9,0x45,0x6a,0x13,0x88,0xd3,0x46,0x3c,0x44,0x94,0x42,0x9b,0x1d,0xc4,0x54,0x02,},"\x9c\x8e\x3f\x5b\x4d\x70\x40\x30\xe1\xba\x71\xf0\x2e\xfc\x4b\x87\xd6\xff\xfb\x55\xbc\x3d\x8d\x03\x81\x8f\x91\x56\x24\xfc\xf7\x01\xc5\x4a\xdf\xaf\xa2\xb6\x94\xb8\x77\x51\xcb\x9f\x69\x91\x8c\x0f\x05\x0f\x4c\x10\x5d\x5c\xcb\x40\x10\x0b\x28\xdf\xd4\xf4\x11\xd5\x91\xc1\x20\x19\x17\x6a\xc2\x01\x6b\xfb\xfd\xf0\xdd\xf1\x1d\xb8\xa7\xe3\x9a\xa7\xb9\xe2\x16\xf6\x67\xc0\xa1\x5f\xb9\x77\xea\xa9\xba\x3b\xc4\x55\xcc\x58\x94\x5f\x3e\x94\x4b\x8a\xc2\xfb\xf4\xd2\x4f\xe7\xe1\xe6\x19\xcd\xbe\xee\x3e\x5e\x12\xa9\xa5\x27\xd2\x8f\x5f\xd7\xcf\xd9\x22\x0f\x13\x08\xd8\x97\xb6\xd4\x31\x4a\x5a\x01\x87\x86\x4a\x2d\x62\x1c\xf1\xb2\x84\x42\x61\x24\x7b\xf5\x20\xba\xfa\x9b\xf2\x26\xe1\x15\x68\x1e\xcd\x77\x42\x79\x80\xcd\x12\xb0\x8c\x35\x9c\xec\xd1\xde\x3f\x55\x45\xf8\x07\xf8\x1e\xd7\x63\x02\xff\xd6\x47\x7f\x89\xb9\x58\xcd\xf1\x29\x54\xcf\x70\xc1\x42\x53\x29\x93\x83\x16\x47\xea\xca\xb0\xb4\x80\x7b\xfd\xad\xb4\x38\x9d\x7d\xff\x2c\x4e\xf0\xef\x5a\x5c\x61\xd0\xdf\x76\x2e\x2e\x90\x80\xa7\x18\x1c\xec\xd0\x6a\x53\x19\x9f\x0d\xfe\xf7\x02\x62\x7a\xde\xcf\x5f\xcd\x9b\x3e\x68\xc7\x23\x33\x16\x17\x27\xf8\x71\xc7\xd1\xc4\x30\x51\xff\x1c\x92\x1f\xd5\x3b\x64\x22\x38\xb9\x78\x80\xd6\x4e\x25\xfa\xc5\x12\xab\x95\x4b\xed\xbc\xa5\x40\xf5\xb2\x00\x91\xec\x72\xe6\x7f\x88\x77\x0a\xfc\x32\xf2\x12\x5c\xa0\xda\x4f\xe8\x7b\x56\xaa\xc9\x17\x7f\x1f\x4f\x67\xc8\x51\x72\x5c\x5e\x8a\xfe\x64\xf6\x64\x79\x98\x33\xfd\x79\x10\x0b\x77\xea\xd2\x58\x38\x87\x9f\xff\x47\x47\xaa\x0d\x56\x72\xec\x0a\x94\x34\x81\x34\xbd\xbd\x4b\xb3\x9b\x0c\x67\xa0\xcd\x30\x60\x2e\xdf\x4f\xec\x6f\x7a\xf0\xcc\x2b\xda\xe1\x26\xce\xa8\x42\xdf\xaa\x43\x91\xdc\x5d\xde\xa9\x38\xe1\x79\x21\x68\x24\x0c\x2d\x8b\x25\x35\x2f\x9f\x3a\x64\x42\x35\xce\x36\xfe\xfe\xb6\x99\x2a\xd8\x8e\x28\x7a\xd2\xd8\x5b\xd8\x50\x39\x6f\xc2\xe5\x17\xa1\x52\x09\xf5\x92\x0a\xc9\x8c\x53\x2b\x1f\x4d\x86\x9b\xeb\x08\xbb\x03\xcf\x7c\x91\xaf\x3f\xfc\xed\x68\xd5\xfb\xfe\xf8\x6f\xf9\x4e\xce\x6e\x2e\xad\x34\x84\xce\x08\x0d\xb1\x7b\xbe\x40\xf1\xdb\x43\x2e\xc1\x65\x0e\xd2\x4f\xdd\x25\x0f\x33\x45\x74\x5c\x9b\x7b\x91\x98\xc9\x10\x9a\x37\x26\x1f\xc5\xec\xbb\xb1\x2f\x83\xa0\xe1\x22\x0a\x18\x67\xd4\x5f\xdd\xfe\xa8\x1d\xcf\x75\xf4\xec\x7f\xdb\x52\x50\xe5\x77\x54\xd6\xde\xa2\x70\xb6\x28\xa7\x95\x30\xec\x28\xb6\x19\xbc\xa9\x49\x3e\x63\x05\xcf\xc4\x41\x4c\x1c\x1d\xe3\x38\x9e\x89\x01\x97\xc8\x5f\x28\x40\x4f\x3f\xa9\x6a\x1e\x2f\xd9\x20\x6b\x47\x2e\x8a\x0a\x0d\x32\xaf\x55\x60\x6b\xb0\x83\xf7\x6a\x19\xb8\xea\xe3\x47\x9a\xe5\x1d\x98\xa9\x9a\x62"}, -{{0xa5,0x22,0x8f,0xf9,0xbb,0xb6,0xf2,0x32,0x32,0x7e,0xb8,0xd8,0x79,0xd7,0xf8,0xb2,0x77,0xca,0x72,0xba,0xe1,0xf9,0xa9,0xd0,0xe2,0x60,0xdd,0x90,0x57,0x1d,0xb4,0xf9,},{0xd8,0x2f,0x6a,0x69,0x74,0xf5,0x1c,0x88,0x08,0xd9,0xd6,0x17,0xf4,0xce,0xc2,0xd8,0xa3,0x7e,0xb1,0x1a,0x14,0x23,0x7c,0x9a,0xb9,0xcf,0x11,0xeb,0xc8,0x0f,0xf6,0xc0,},{0x97,0x65,0x0f,0xae,0x3f,0x59,0xca,0x76,0x47,0x7f,0x25,0x47,0x16,0x77,0x49,0xc5,0x83,0x02,0x48,0x88,0x32,0x25,0xe3,0x54,0xff,0x46,0xc7,0xe3,0x81,0x96,0x52,0x20,0xd9,0xbe,0xf2,0xc2,0x05,0x7c,0x7d,0x19,0x90,0xf0,0x8b,0xca,0x4c,0xfd,0xe8,0x77,0xff,0xf2,0xb4,0xaa,0x81,0x3d,0x9c,0x4b,0x84,0xfb,0x79,0xec,0xed,0x81,0xef,0x05,},"\x1d\xf7\xa6\x83\x5e\x33\x10\x98\x3e\xe7\xec\x73\x11\x25\xf5\xb5\xcf\x11\x7a\xf0\xe3\x6b\x36\x85\xbf\x54\xac\xe1\xc4\x8c\x46\x30\x05\x60\xa4\x5e\x9f\x9b\xdd\x96\xa0\xbc\x4d\x14\xe8\x9d\x4b\x57\x21\xa2\xca\xff\x66\x18\xb1\x82\xed\xb1\x20\x2f\x3d\x0c\x5d\x11\x8d\x09\xb6\x18\x12\xc0\x10\xe8\xb1\x96\x34\x45\x41\xcd\xee\xfe\x5f\xd1\xf9\x61\xc5\xdd\x75\x45\x95\x55\xab\x72\xef\x2a\xa7\xa7\x59\xa4\xf3\xad\x3c\xae\xd4\x4f\x4c\x9a\x8e\xf9\x5b\x76\xed\x9a\x99\xb5\x5d\xd8\xa2\x60\xba\x08\x01\x0d\x29\xff\x81\x9f\x2a\xf3\x51\x3c\x1a\x64\x0d\x6c\xcd\xde\x49\x99\x20\x5f\x9f\xca\x88\x57\x11\x5d\x8b\x5d\xb9\xf7\x0a\x62\xe5\xee\xa0\xd5\xaf\x06\x5d\xe1\x53\xf2\xed\xed\xee\xc6\x3e\x15\xc8\xe0\x9a\x92\x58\x21\x82\xac\x07\xd8\x1c\xa6\x3c\xa4\xaa\x59\x7a\x22\x20\xe7\x04\x81\x95\x7d\x41\x52\x64\xe2\x58\xbc\x26\x3e\x1c\xc3\x6e\x53\x47\x8a\xac\x5c\xa0\x16\x94\xcc\xb0\x9b\x4f\xfd\x84\x73\x99\x72\xc7\xdc\xcf\x3d\xef\xea\xfd\xed\xe1\x62\xab\x6c\x58\xa1\xdf\x27\x37\x1e\x3f\x54\x93\x06\x7f\xc9\xe2\x06\x7e\x57\x96\x23\xc0\x09\xfc\x82\x5e\xef\x0e\x01\x0f\xd1\xcc\xf2\xa8\xd3\xfb\xbb\x31\x56\xf9\xdf\xde\x0c\x7c\xbb\xaf\x84\x33\x09\x85\x17\x49\x1b\x78\xdb\x96\x98\x61\x4e\xa4\x0e\x0b\x1e\x6a\x1e\x36\xb9\x00\x45\x3a\x16\xea\x27\x6f\x34\x42\xbb\xd2\x7a\x7e\xcb\x98\x15\x11\xf5\xc9\x20\x9e\xb0\x96\xe2\x85\x88\xb6\x5b\x96\xb5\x01\x88\xc0\x38\x1f\xf7\x12\xbc\x06\xb2\xc6\x55\xcc\xa0\x75\x1c\x09\x5d\x80\x16\x25\x15\x85\x85\x1e\x67\x74\x34\xdc\x3e\xfd\x08\x7a\x12\x68\x0f\xc2\x2e\x5b\x83\x10\xa1\x0e\x32\xca\xac\x9b\x71\xc8\x76\xee\xd3\x1e\xf0\x9f\x7f\xa0\x12\xba\x08\xdf\xd2\xad\x68\xc1\xe1\x47\xf5\x05\x98\xe5\x50\x46\x7e\xf9\x9f\x29\x5a\x31\x8f\xaa\x50\x7e\xbe\x77\x6c\xe5\x5c\x4d\xa1\x64\x32\x3c\x30\xa5\xe7\x2d\xbe\x02\x7c\x3c\xcf\x96\xc7\x01\x97\xa6\xfb\x1b\x74\xaf\x13\x3a\x8b\xe2\xb0\x3c\x1b\x99\xfd\x25\xb3\xce\xd5\x1f\xe3\x88\x20\x21\xa3\xaf\xd9\x22\x9f\x64\x1b\xc6\xca\xd4\xe1\xd3\xcb\x6e\xd9\xb6\xb6\x8a\x25\xf1\xe1\x39\x72\x89\x98\x1f\x78\x92\x4b\xff\x24\xc8\xde\xe6\xa1\x8a\x04\x21\xfa\x32\xae\x3a\xb6\x0a\x0d\x93\x3a\x6a\xf4\xff\x70\x48\x74\xb0\x9b\x07\x39\xe2\xf2\x9d\x8f\x25\x2d\x79\x05\x5f\x89\xd3\xbf\xf1\x0a\x22\xc5\x4a\xc3\xd8\xaf\xee\xce\x81\x83\x53\xa6\xab\xe2\xb7\xfb\x8e\x8e\x0d\xa5\xb7\xac\x1c\xfc\x98\x5d\xf9\x75\x80\xb1\x82\x11\xa4\xe3\xed\xff\x95\xaf\xdd\xa0\x61\x54\x7d\x3a\xe0\x40\x6d\x32\x86\xcd\x30\x5b\xdf\xd2\xc3\xab\xf8\xf7\x4a\xf9\xa0\x34\x20\xe5\xb0\x3f\x82\x5e\x9c\x53\x90\x7e\x13\xa5\x81\x21\x74\xbe\x42\x89\x86\x45\x14\x9d"}, -{{0xc0,0x4d,0xc0,0x9f,0x11,0x9d,0x67,0x0f,0xb1,0xea,0xe0,0x13,0x6f,0xcc,0x06,0x08,0x5f,0x29,0x0f,0x4a,0xd1,0xaa,0x1f,0xfc,0x9c,0x16,0x0e,0xa5,0xcf,0x47,0xf0,0x9d,},{0xff,0x49,0x8c,0xe8,0xc9,0xdb,0x78,0x67,0xf6,0xd0,0x27,0x64,0x52,0xa4,0x66,0x72,0x48,0x87,0xe6,0x17,0x2f,0x66,0x81,0x67,0x1b,0x8a,0xe0,0x35,0xf5,0x86,0x5e,0xa3,},{0x4b,0xd1,0x9f,0x3d,0x9c,0x51,0x16,0xec,0x6a,0xe0,0x02,0x4d,0x0f,0x24,0x6d,0x2c,0xe2,0x50,0xd9,0xe0,0x63,0x4a,0x23,0x2b,0xa0,0x6f,0xd3,0x56,0x6a,0xed,0x55,0xcb,0xe5,0x9f,0x12,0x33,0x2c,0xba,0xd6,0x5d,0x43,0x49,0xa9,0xd2,0x2e,0x7d,0x6e,0x46,0xd2,0xfb,0xdc,0x71,0xd5,0xc8,0xf9,0xda,0x15,0xdf,0xbf,0x17,0xba,0x22,0x51,0x07,},"\x1e\x42\x29\x7f\x8a\xee\xf2\x9a\x84\x2e\x0e\x21\xf5\xdb\xae\x06\x8e\x2c\x9d\xda\xa6\xfd\x34\x8e\x48\x88\x1f\x0d\x42\xc5\x0b\xf0\xec\xf1\x70\x6b\x94\xa5\xd1\x98\x17\xca\x02\xd8\x3e\x9a\xb2\xf9\x9d\x8b\xfa\xaa\x5c\x85\xad\x39\xa1\x50\xb2\x25\xad\x3e\xaf\xa0\x67\x81\x5b\x74\x67\x2f\xe0\x26\xc3\xcc\xc6\x77\x25\x54\x40\xb6\x84\xa7\x6e\x12\x8c\xa2\xcc\xc4\x29\xf1\x52\x57\x7d\x25\xb6\x9f\x40\xdb\x58\x2d\x49\x47\x9a\xfa\xe6\x80\x71\x2d\xc0\xfd\x1f\xe1\x41\x88\x39\x68\x7c\xa6\x0c\xdd\xe9\x74\x14\x04\x62\xf9\x61\x48\x29\x5d\xf1\xce\x43\xa9\x77\x35\x1c\x77\xf2\xf0\xb0\x9a\x6b\x26\xd6\xfe\x96\x5f\xce\xae\x17\xd7\xb8\x62\x03\x71\x40\x24\x28\x54\x4f\xdf\x91\x69\x0b\x44\xe9\xaf\xc2\xe9\x08\x8c\x83\xca\x48\xdc\x85\x76\xf6\x28\x72\x47\x98\xdc\x90\x32\x31\x74\xc4\x49\x96\x59\x65\x02\xa3\x5d\xf8\xb9\x82\xc5\x70\xa6\xcb\x51\xb9\xa1\x97\xd4\x31\xaf\x33\xf0\x2b\x80\x01\x15\x67\xfe\x50\xcf\x45\xac\x11\x1b\x3d\x55\x6f\x8c\x8c\xe5\xae\x8c\x99\x72\xf2\xa9\x93\x6b\x1a\x01\x2b\x9c\x33\x9e\x30\xc9\x73\x12\xb6\x5e\xa5\x9c\x10\x0f\x79\xd7\x95\xb8\xa2\x4b\x31\xa0\xa9\x7d\xc2\x5c\xce\xd6\xb8\xff\x5a\xe1\x45\x33\x9a\x04\x8c\xa1\x2a\x57\x90\x17\xfa\xe8\xd5\xcb\xcb\x61\xd5\x2e\x31\x4d\xd7\xc2\xe7\x20\x10\xc4\x72\x17\xb1\xd0\x68\x78\xbf\x28\x18\xca\x18\x8e\x8e\x30\x79\x60\xc1\x68\x9d\x7d\xfc\x02\x02\x97\x3c\xd2\x9f\x2f\x7b\xa7\x43\x46\x9e\x68\x5e\x0e\x70\x4b\x04\xba\xca\x4f\xab\x54\x88\x44\x8a\x92\x2e\xab\xf4\x0b\xe5\x81\xc1\x99\x4d\x74\xd1\x3a\x36\x6c\xe8\x57\xfb\x40\xa6\xe0\x5d\xa8\x55\x36\x94\x17\x2c\xc3\xfd\x28\x06\x2f\x53\x82\x50\xaa\x8c\x11\xf6\x81\x39\xe7\x9c\xd1\x19\x1b\xa3\x31\x4b\x5c\xea\x08\x64\x43\x7e\xd2\xe4\xb6\xfb\xd7\x5b\x9d\xed\x09\x87\xb4\x1c\x20\x2a\x58\xec\x02\x54\xd9\xd3\x71\xa7\x95\xf1\xdb\xec\xdd\xac\x11\x2b\xe8\xd0\x9e\x2d\x7b\x9c\xa5\x75\x2f\x40\x6c\xff\xb9\x11\xca\x36\x45\x0b\xc0\x5f\x1e\xc1\xca\x3c\xa8\xd3\x51\x24\xd1\x28\x6c\x55\xf1\x0f\x61\x33\x4e\x46\xec\xe4\x18\x3b\x92\x21\x9a\x9d\xcd\x0e\x5e\x78\xef\x2a\x76\xcf\xe9\xa9\xab\x37\x95\xdf\xdc\xb4\x4f\x63\xd4\x5f\x5f\x48\xff\xb4\x15\x61\x33\xad\x2e\x99\x50\x88\x4c\x5b\xbd\x2c\x1c\xb8\x72\x9e\x40\xa8\x78\x7f\x78\x49\x69\xfa\x88\x0c\x07\xff\xcc\x97\xd5\xc0\xd2\xd4\x88\x08\x5e\x91\x16\xd7\x10\x7c\xd5\xdb\x16\xce\xcc\xde\xad\x55\x02\x5e\xea\x2e\xde\xe9\x3c\x1b\x10\x64\x27\x61\x8e\xe0\x9d\xc3\xda\xd1\xe0\x56\x76\xa2\x36\x80\x69\xc8\x04\x5c\x3e\xbc\x6c\x67\xaf\xa5\x2d\x59\x39\x82\x48\xef\xcf\x15\xe9\x04\xc7\x14\x23\x04\xff\x61\x97\x1f\x4d\x9b\xf6\x46\x0c\x1d\x64\x17"}, -{{0x67,0x91,0xbd,0x74,0xd3,0xb4,0x62,0x0e,0xf5,0xf1,0xff,0x56,0x40,0x64,0x32,0xc2,0x6a,0xb6,0x46,0xf6,0xd5,0xe9,0xdd,0xa6,0x84,0x2e,0xd6,0x90,0x52,0x27,0x53,0x92,},{0xda,0x99,0x15,0xa7,0x55,0x2f,0x11,0x0f,0xae,0xa1,0x2d,0x47,0x92,0x0a,0x09,0x60,0x14,0x43,0xd4,0x00,0x0a,0x9c,0x7e,0x21,0x8d,0x5b,0xa7,0x2b,0x74,0x98,0x9f,0xa6,},{0xb1,0xe8,0xd4,0x81,0x06,0x5b,0xd5,0x12,0x1b,0xb3,0xbf,0x56,0x96,0x00,0xbc,0xc2,0x6d,0xf4,0x0c,0x49,0x9f,0xba,0xa9,0x54,0xb3,0x9a,0x61,0x9d,0xc4,0x0b,0x95,0x90,0xc3,0x17,0x56,0xb8,0xb6,0x3f,0x86,0x01,0x51,0x69,0x4b,0x95,0x76,0x5d,0x69,0x7b,0x2e,0x1a,0xde,0x08,0x06,0xe9,0x2a,0x06,0xc4,0xa5,0x59,0xe9,0x0f,0xcf,0xa5,0x06,},"\x36\xa2\x0e\x66\xbb\x29\x15\x51\x61\xad\x85\xee\xfe\x89\x3b\x53\xac\x5a\xde\x16\x5f\x08\x9a\x77\x19\x0b\x0c\x23\x9d\xec\x8a\x20\x16\x85\xb0\x76\xb4\xde\xd4\xa1\x0a\xa4\x59\xb9\x80\xa8\xcc\xa4\x7d\x5f\x8d\xe4\xd2\xa6\x62\xe4\x46\xd5\xf7\xfb\x70\xed\x9b\xe0\x5d\xb1\xcc\xea\xdd\x13\x0b\x33\x46\xd9\x40\x9f\x9d\x6e\xf5\x28\x24\xc7\x64\xac\x6f\xb1\xcd\x15\x6d\xbd\x6a\x47\x3a\xe7\x22\xd0\xeb\xb2\x56\x38\xc5\x12\x65\xa2\x2f\xeb\xbb\x14\x96\x7d\x6d\xd8\x25\x3c\x1d\x03\x88\x95\xc6\x73\x7f\x06\x7c\x8f\x73\xc3\xc1\xcb\xe6\xcd\xa4\x36\x96\x32\xd7\xf4\xc9\xac\xeb\xe8\x7d\x05\x71\xc8\x1a\x58\xcf\xd7\x2c\xce\x4a\x5c\xf5\x3a\x1e\x75\x25\x9f\x4c\x99\x3e\x67\xef\xc8\xd9\xc3\x57\x6c\x43\xaf\x04\xa5\xca\xf3\x3d\x85\x6f\x7f\x27\x55\xd3\xa9\x75\xab\x2b\x68\x5c\x6f\x65\x68\x0c\xba\x9a\xc8\x79\xf3\xa8\xc9\xa4\x76\x5b\x87\x9c\x0a\xde\x1e\x4b\xd0\xd4\xa7\x0b\xb6\xf9\x2b\x24\xd4\x29\xdc\x74\x6c\xc7\x8f\x84\x81\x1f\x07\x6f\x32\xc6\x1e\x35\x85\xcc\x8a\xad\xe9\xb0\xca\x15\x22\x4b\xfb\xfe\x18\xbe\x10\xa3\x36\x43\x60\x0f\x66\x12\xbf\x01\x3f\x0e\xfc\xca\x83\x72\x46\xa0\xee\x5b\x03\xc0\x2f\x15\x73\x62\x4c\x4a\x44\xa9\x0f\x9e\x42\x3d\x4e\x56\x06\x1a\x71\xd0\x14\x4f\x5a\x88\x7a\x8c\xd4\xa9\xd6\xf2\x47\x90\x4e\x26\x79\x59\x51\x95\x9d\xa1\x21\xc8\x3c\x6c\x94\x1e\x2b\x6b\x9a\xb7\x62\x09\xff\xe9\x17\x85\x91\xea\xd6\x82\x30\xb9\x4a\xe9\x7d\xf5\x8f\x9f\x17\x24\x28\xc9\x50\x67\x59\x8a\xc5\x82\xff\xb9\x50\x84\x0d\x82\x66\x30\xc4\x62\x5f\x5d\xea\xdd\xec\x13\x05\x20\x3b\x4d\xb6\xb9\x45\xf9\x91\xed\x7c\xd3\xd6\xfa\xbc\xa5\x1e\x21\x66\xad\xad\x0a\xad\x51\x17\x33\x6d\x52\xd5\x94\x22\xf0\x13\x5c\x8f\xa8\xcd\xd0\x88\x4b\xe7\x35\x86\xbf\x28\x4e\x5d\xdd\xdb\xcb\x95\xb4\x11\xf9\x85\x68\x52\x6f\xbe\x71\xa5\x59\x2b\x56\xad\x5a\x73\x45\xf2\x87\x4d\xb1\xd5\x7b\xea\xb4\x3e\x8c\xc6\x95\x47\x52\x06\x29\xf0\xee\x76\xdb\xf4\x32\xa3\x76\xfa\xd2\x8b\xfc\x77\xe1\x4d\x84\x0f\x0c\x02\xd4\x78\xf1\xe2\x33\x7c\x23\xb8\x9e\x73\xe5\x27\x91\x08\xb5\x60\x9b\x18\xe8\x0d\xb0\xde\x11\xcf\xa9\x4e\xcf\x72\x39\xbc\xff\x59\xc5\x41\x18\xe4\xed\xe4\xfb\xfc\x08\x23\xae\x54\x60\x16\xf7\x74\xc5\x21\x98\xa9\x63\xb5\x54\x5a\x34\x89\xb8\x9d\xf7\x62\x6f\xd1\x1e\xd4\x65\x8d\x71\x5a\x46\x57\x99\x40\x35\xd4\x03\xb3\x37\x0d\x14\xee\xd9\x71\x8d\x59\x8d\xb6\x75\xf0\x42\x59\x2f\xea\x89\x05\x65\x44\xb3\x2e\x5b\x9c\x80\x62\x82\x8a\xaa\x3c\xf5\x9c\xb4\x76\xad\x36\xdb\x1d\xaa\x24\x82\x22\x7a\x9b\x7a\xfb\xc1\x53\xce\x93\x25\x3d\x1b\x39\xda\x95\xeb\x96\xf8\x31\x28\xff\x25\x54\xa5\x47\xe3\x4e\xea\x4a\x00\x00"}, -{{0x23,0x4c,0xe4,0xd3,0x9b,0x5e,0xba,0xbe,0x9a,0x2c,0x1e,0x71,0x97,0x0d,0x71,0x81,0x38,0xdc,0xb5,0x30,0xcf,0xd2,0x96,0x02,0x34,0x27,0xd8,0x92,0xbf,0x88,0xf8,0xa4,},{0xcb,0x73,0x93,0x0d,0xb4,0x21,0xf6,0xd2,0x45,0x36,0x83,0x7b,0xd0,0xbf,0xf6,0xfa,0x75,0xbb,0xd1,0x41,0xc9,0x8a,0x40,0x5d,0x42,0x44,0xa3,0xc4,0x24,0x55,0x07,0x79,},{0xf6,0xd0,0x60,0xed,0x7d,0x18,0x27,0x3f,0x18,0xf7,0xa6,0x9c,0xd1,0xd8,0x12,0x6e,0x47,0x8e,0x88,0xa1,0xd7,0x29,0x4f,0xf6,0x04,0x08,0x46,0xd4,0x61,0x07,0xc3,0xe4,0x1a,0x42,0x3b,0xab,0xb2,0x41,0x71,0x39,0xfe,0x58,0x7d,0x29,0x10,0x27,0x1a,0x35,0x7f,0xe5,0xbf,0x57,0xc9,0x2e,0xe3,0xa7,0xb7,0x75,0x33,0x72,0x9d,0x0a,0xc2,0x0d,},"\x77\x73\x0c\xf8\xc8\xf9\x6b\x91\x87\x90\x2a\xcf\xf9\xff\x0b\x21\x74\x6c\xca\xf0\xa3\x82\xa7\xb3\x43\xd1\xc7\x20\x27\xae\x3c\x31\x68\xa7\x3a\x6b\x8f\x49\xbc\x87\x98\x14\x1e\x15\xc2\x73\x2b\x6a\x6b\x3f\x75\x7f\x8a\x8e\x86\xc7\xa4\xba\xcb\x39\x55\x1c\x54\x87\x4d\x6b\xf7\x16\x89\x7e\xe4\xaf\x13\x25\x3a\xa5\xbb\x79\xa1\x92\x10\x4f\x44\xdc\xb3\xde\x96\x07\x45\xa8\xe6\xaa\x98\x80\x52\x4a\x62\x9f\xb5\x10\xa4\xce\x4c\xbd\xa7\xe2\x95\x7d\xff\x1d\x62\xe7\x05\x60\x6a\x2c\xc8\x4f\x91\x85\x0b\xea\xac\x5e\x58\x46\xe1\x42\x0b\xc9\x1d\xcd\xd2\x42\x7b\x69\xcf\xa4\x6a\xe3\x8a\x4f\xef\x41\x46\xea\xe3\x5f\x9c\x22\xe9\x67\xcb\x14\xa1\xaf\x9c\xab\xf8\x3b\x18\x04\x65\xbe\xd6\xef\x2c\xda\x38\x2a\x84\xd9\x99\x4a\xad\x65\x5d\x89\x52\xe0\xfb\xb0\xf9\x6f\xc8\x08\x9f\x2e\x74\x89\x49\x7f\xac\xdc\xd6\x56\xa8\xa4\x51\xb9\x28\xc1\x1e\x7a\x40\x75\x07\x2a\xaf\xbf\x17\xd8\xf1\x05\x4c\x91\x96\x28\x8d\xed\x3a\xe2\x1f\x9a\xfd\x58\x10\xa1\x00\xd8\xe4\xd8\x4c\x4a\x35\xa9\x8b\x30\xd3\xe1\x85\x24\x43\x8d\xd4\x40\x2d\xfd\x8e\x76\x75\xf0\x9d\x08\x0c\xd9\x15\xf1\x4a\xf4\x37\x2f\x7c\xe5\x83\x84\x97\x2d\x5d\x11\x10\x79\x65\x1b\x2a\xcf\x39\xd2\xa1\x67\xc6\xa0\x0b\x2b\x17\xce\x0b\x26\x87\x91\xbd\x2b\xe5\x17\x8f\xe0\xf8\x2d\x64\xda\xcd\xde\x37\x7a\x1e\x8b\xe9\xe7\xd8\xdf\xc8\x2b\x08\x64\x45\x37\xbd\xc8\x70\xc5\x81\x92\x86\xfd\x51\xf6\x79\x2d\xc5\xf6\x7b\x54\xbe\x33\x6d\x44\xd5\x4f\xeb\xf8\x1b\x8d\xf8\xde\xc5\xd8\x68\x6d\xb1\x2f\x16\x4d\x0e\x8f\xf1\xaa\x2c\x16\xba\xcc\x98\x06\x01\x0e\xc8\xe9\x11\x96\x59\x7e\xf0\x6a\x4c\xf1\x70\x7d\xef\x50\x67\xa0\x48\x89\xd8\xe4\x8a\x9b\xc2\xc0\xbe\xf6\x64\xf5\xac\xd1\xb4\xf5\xbc\x2d\xa7\xda\x43\xdc\xb5\xf9\x63\x24\x5b\xa5\x52\xfd\x49\x30\x01\xd8\x70\xa9\x51\x7a\x17\x9c\x2f\x0d\xe8\x5b\xe0\xc6\x82\xd0\x57\x48\x8e\x35\xc7\x81\x6f\xf4\xba\x52\x9a\xef\xd7\xc6\x60\x91\xf2\x06\xf5\xf4\xd7\x5c\xac\x8b\xd2\x09\xec\x2f\xa5\x5b\xe7\x4a\xf2\x31\xe2\xf3\x89\xdc\xc2\xd6\x68\xbf\x69\x5e\xd2\x67\xc3\x59\x4b\xad\x9e\xfc\x00\x21\x7c\x7a\x0e\x9e\x7b\x6a\x56\xa3\x30\x79\xa3\x0e\x73\xc3\x73\x3f\x2d\x24\xef\xec\xdd\xe8\x7f\x72\xf9\x48\xd2\x77\xd6\xb6\xd5\xb0\x35\xb4\xc5\x31\x80\xd2\x3d\x66\xcc\x0f\xf1\x7c\x15\xdd\x46\x85\x85\xe3\x89\xd9\x1a\x4c\x97\xfd\x80\x11\x0b\x21\x8a\x0b\xf7\xa5\xe0\x35\x3f\x46\x09\xd2\xcf\x01\x8a\x06\x55\x71\x00\x1c\x78\x88\x55\x5e\xed\xbd\x36\x22\xc3\xb1\x76\x9c\xd1\x3f\x33\x37\x47\x72\xaa\x6c\x8a\x8f\x58\x81\x02\x01\x7d\x4e\xe4\xe5\x0d\xcb\xbd\xb1\xd6\x10\xc3\x26\x70\x93\x4a\x6d\x9e\x6d\x9b\x78\x4b\xbf\xe7\x18\x62\xbb\x38"}, -{{0x10,0x3d,0x11,0x8c,0x7d,0xd6,0x5d,0x07,0xe8,0xd5,0x58,0x2e,0x45,0x04,0x2a,0x75,0x79,0x24,0x17,0xc6,0x92,0x00,0x1e,0xe6,0xbd,0x9a,0x92,0x7b,0x2b,0x3d,0x90,0x16,},{0xb4,0x5c,0xc9,0x45,0x14,0xa6,0xad,0x67,0x24,0x96,0xcd,0x4e,0xb9,0xfd,0xaf,0xc1,0xd4,0xa1,0x67,0x07,0x2c,0x68,0x74,0xdc,0x8f,0xf1,0x6d,0x76,0x1f,0xb6,0x69,0x86,},{0x2f,0xaf,0xc1,0x3c,0x43,0xaf,0xe5,0x05,0x43,0x72,0xb9,0x23,0xd2,0x4f,0x29,0x2b,0x28,0x3a,0xfc,0xa3,0xac,0xa3,0xb3,0xe4,0x32,0x38,0x06,0x84,0x96,0x17,0x13,0xc8,0xd2,0x3e,0x86,0xb3,0x58,0x04,0x95,0xdf,0xba,0xe4,0x24,0xb7,0x67,0xe4,0x79,0x5a,0x0f,0x92,0x2f,0x71,0xb5,0x0f,0x5d,0x7a,0x36,0x9a,0xb8,0xc6,0xe8,0x80,0x42,0x0c,},"\x5a\x8e\xe0\x79\x18\x6b\x51\xcf\x46\x29\x83\x4d\xe0\xc6\xbd\x73\x34\x85\x50\x39\xa7\x63\x1d\x68\x87\x65\x2a\x77\x28\x99\x59\x72\xe3\x62\xc1\xc4\x09\xf0\x84\xf5\xaa\xf2\x98\x6a\xe3\xf5\x36\xbe\x00\x70\xc4\xba\xf4\x59\xef\x60\xa0\x15\xef\x9d\x70\xdf\xa3\xea\x96\x71\x1c\xbb\x18\xe9\x2a\xf5\x0c\x52\x7d\x7e\xd4\x57\x87\x7a\x07\xab\x83\x72\x15\x18\xc8\x9f\x7a\x86\x41\x91\xb1\xe9\x74\x33\xb7\xc6\xcd\x63\x4a\x83\x2e\x19\x89\x1e\x76\xc6\x21\x22\xa4\x9d\xbf\xfd\x83\x49\x8a\xa4\x16\xac\xcc\xb7\x73\x7f\xe7\x5f\x4f\xb2\xc3\x53\x28\xe6\xf6\xec\xec\xaa\xa4\x2e\x43\xdb\xa5\xbc\x96\x89\x67\x3d\xab\x96\xf0\xbe\xfa\x3c\x83\xeb\x41\xd4\xd8\x87\xb3\xa1\x17\xd0\x55\xe3\x0b\xb8\x7f\xbe\x7c\x71\x94\x72\xf6\xc7\xa4\xcc\x45\xf6\x28\xf5\xfa\xdd\xc4\x8c\xa3\x44\xf7\x7b\x73\x3c\x0e\x3b\x9f\x50\x79\xdb\xd0\x7a\xf3\xa3\x84\x7a\xf1\x41\x71\x9c\xca\x2f\x6a\x76\x65\x52\xb4\x5d\x0f\xdc\xdb\x98\x68\xf2\xc7\x62\xb6\xd4\x93\x3b\xa1\x08\x36\xf9\x5b\xff\x71\xcb\x88\x04\x00\x24\xc9\x05\x34\xc4\xd7\xa9\x5a\x23\x03\xb0\x4c\x29\x61\x01\x2a\xf5\x8b\xc7\x84\xa9\x63\x27\xbb\xfe\xd0\x39\xd0\x80\x2a\x05\x26\x2d\x8e\x66\x3b\x78\x50\x8e\x92\x50\x8b\xc1\xf2\xea\x2b\x9b\xe7\x58\x0b\xde\x10\xa4\xd6\x63\xd0\xd2\x5b\x0e\x97\x3b\x8c\x5d\xed\x59\xde\xbf\x19\xbb\x04\x4a\xff\x1c\x60\xc7\x0e\xa1\xae\xfe\x85\xf6\xd1\x5c\x2c\x1b\x84\x75\x3b\x59\x57\x6a\x49\x47\x3d\x65\xaf\x3e\xd9\x41\xa3\xd5\x14\xb5\xc4\x52\x2c\x14\x1b\xdb\xee\xd9\xcb\x33\x96\x95\xb2\xe0\x2d\xc0\x70\x00\x86\x7f\x1b\xf8\xed\x8c\xfd\x3b\x1a\xfe\x68\x8f\xbc\xa8\x0e\x2f\x9b\xa5\xc0\xb1\x88\xa1\x9a\xda\xff\x66\x86\xca\x0f\xf0\xed\xd4\x44\x66\x12\x91\xfa\x27\xca\x1f\xc5\x29\x42\x9a\x5d\x8f\xf7\x9e\xd2\x02\x7c\x60\xff\xe3\xb2\xc0\x3f\xb8\xa6\x6a\x39\x85\x41\x7b\xa4\xac\xe7\xd1\x4f\xd0\xe2\x37\x1e\xdf\x5d\x71\xbc\x02\xb9\x05\x27\x67\xc7\xf7\x2c\x4e\x6f\x3f\x30\xe0\x63\x82\x76\xb9\xc4\x20\xaa\x43\x33\x09\x5d\x31\x31\x30\x33\x09\x05\x82\xe3\xac\x4d\x9f\xd3\x20\x31\x20\xba\x25\x14\x97\x3a\xb9\xd1\xc7\xfc\x42\x29\x01\x16\xb5\x1d\xae\x9f\xd5\x79\x41\x0a\xe0\x78\xed\x32\x0a\x5a\x1b\x49\xaa\x7b\x5f\xef\xcd\x75\x63\x95\x21\x3a\xf8\x64\x1e\x29\xb0\xeb\xb5\xb8\x3e\x37\x80\xe5\xd1\x0e\x9d\x3d\x11\x99\x81\x48\xf6\xc6\xf8\x6c\x4d\x4e\xb2\x52\xe2\x8c\x70\xfa\x3a\x55\xc4\x3d\x4d\x7f\xaa\xfc\xbc\xdd\x45\xad\x26\x37\xf2\x15\xe8\x15\x49\xeb\x8a\x4c\xde\x47\x15\xb7\x10\x72\x07\x50\x3a\x79\x59\x50\x60\xb8\x3a\xce\x8f\xeb\x67\x3b\x99\x79\x68\x46\x9d\xd9\xb4\xad\x6a\x7e\xa8\x1c\x6e\x61\x81\x00\x33\xf3\xed\xfc\x13\x7d\x97\x42\x09\x57\x5c"}, -{{0x47,0xee,0xe2,0x02,0x4d,0xbe,0x09,0x95,0x3e,0x98,0x1f,0x69,0x86,0x52,0x0f,0x66,0x60,0x82,0xaa,0x9e,0xf4,0x89,0x2d,0xfd,0xfb,0xdb,0xd2,0x50,0xd2,0xa1,0xdf,0x28,},{0x9f,0x13,0xcd,0x8e,0xbf,0x50,0x80,0x34,0x79,0x75,0x15,0x9f,0x36,0x02,0x96,0xa7,0x16,0x40,0x14,0xd8,0xd0,0x69,0xe8,0x31,0xda,0xb0,0x33,0x26,0x07,0x99,0x7c,0xde,},{0x5d,0xef,0xae,0x0e,0x17,0x3e,0xcc,0x18,0xd5,0xf0,0x1e,0xc9,0x29,0x1b,0xe1,0x60,0xd5,0xea,0xbf,0xf6,0x3f,0xd5,0x42,0x3f,0x2b,0xc6,0x6e,0x3f,0x64,0x08,0xc1,0x96,0x35,0x35,0x02,0xdc,0xef,0x21,0xef,0xfa,0x4b,0x9c,0x14,0xbf,0x27,0xb6,0x87,0xd1,0xb6,0xe8,0x6b,0x2a,0x20,0x5a,0x89,0xeb,0x35,0xc3,0x76,0xa3,0xa3,0x25,0x69,0x0d,},"\xc1\x33\xf0\x33\xcf\x3b\xec\x6c\xd1\x92\x12\xea\x47\xdb\xec\xb1\x3f\x2c\x60\x18\xf9\xe0\x87\x8a\xc8\x84\xbf\xb5\x75\xc0\xf5\xd3\xfc\x5b\x49\x99\x58\x0e\xb8\xac\xbc\xaa\xc8\x3a\xe9\xac\x9b\x44\x3e\x6d\x1c\xff\x44\x9c\x36\x89\xb4\x33\xd5\x09\x00\xb2\xe8\xb7\x1d\x00\xe1\x19\xc8\xb8\x75\x09\x4b\xda\xb9\x16\xad\xaa\xb7\x5b\xcc\x85\x29\x59\xd8\xd7\x59\x79\x5b\xbd\x6b\x36\x0e\xe4\x84\xaf\xe4\x7b\x1a\xd2\x83\x91\xf2\x5a\xfb\x8d\x4e\x3a\xfe\x0c\x5b\x60\x04\x98\xa1\x28\x33\xfe\x2a\x1a\x54\x83\xdf\x94\x0b\x17\x3b\xa0\xd9\xd8\xc4\xd1\x32\x1f\xa4\xb7\x33\x33\x4b\x0f\x6d\x87\x8a\x0e\x5a\x76\xf4\xf1\x80\xac\x11\x9a\x82\x08\x2a\xcb\x14\x88\xe4\x9b\xbc\xa7\xa0\x36\x9c\x19\x1b\xd6\xd0\xc5\xd4\x45\x65\x68\x21\xa9\x9c\xcb\xc9\x45\x94\x9e\xca\x81\x36\xcc\x6e\x12\x7d\x9d\xe9\x2e\xf6\x4f\x17\x4a\x6c\x04\xc8\xb5\xe5\x24\x95\xf0\xdd\x67\x4b\xb5\xca\x12\x8a\x92\x09\x96\x8f\xd4\x50\xdc\xe3\x19\x91\x3f\xd6\xa3\x0c\x33\x82\x79\x81\x63\xe6\x58\x5f\x58\xef\x20\x8b\xe4\xd0\xc6\xa2\x51\x3a\x75\x23\x88\x39\x7a\x4a\xe4\x44\x83\x8c\x84\x66\xdb\xc3\x6f\xbc\x36\xae\x08\xbe\xc8\x8e\xed\xa1\x31\xc1\x4d\x06\x36\x6b\x67\x31\x51\x45\x41\x00\xde\xa1\x11\x81\x50\xfb\xe4\x41\xb1\xe7\x82\x6e\x54\x5d\x98\x68\x24\x2e\x89\x9f\x5e\xa5\x3e\x43\x4c\x37\x93\x6c\xe6\xfd\x06\x14\x62\x83\xe8\xfb\xd5\x36\x48\x0d\xe5\x5a\x16\x10\x2c\x44\x75\x4b\xc5\x54\xd5\xbc\x2d\xe2\xf2\x5e\x19\xe5\x67\xa0\x23\xdf\x46\x40\xe7\x4f\xf3\xa4\x9e\x4d\xd3\x0e\x0e\x25\x58\xb3\xdb\xc2\xaa\xb9\x2f\xdd\x5e\x79\x42\x5e\xcb\xc4\xc6\x99\xfe\x1f\x16\x19\x65\xf1\xd0\xb4\x5d\x8b\xda\xb5\x2e\xc9\xbf\x7a\x69\xd8\xaa\x0b\xd1\x71\xe7\x55\xce\x7b\x8d\x07\x18\xf7\x26\x7a\xfb\x73\x3e\xfc\xa5\x4b\x21\x3e\x6f\x5a\xda\xb4\xc9\xd7\x6c\x86\x7f\xcb\x69\xae\x05\xc7\x4b\xd2\x15\x16\xcf\x34\x2c\x61\x61\xf6\xfc\x9e\xcc\xac\xf9\x70\xeb\xce\x54\x0c\xd8\x92\xbc\x10\x6c\x6b\xd5\x63\x61\x02\x98\xb7\x09\x68\xf0\x91\xbc\xc6\xe1\xf7\xab\x4a\x5b\x2c\x63\x74\xa1\x90\x3f\x4d\x3a\xd5\xe1\xbd\x86\x43\xa9\xc2\xf8\x78\xc3\xd7\xa4\xdc\x49\xef\x31\x97\xed\xbc\xda\x7b\xb9\x1e\x7e\x06\x60\x60\x87\xd4\xe9\x81\xbf\xab\x93\xa6\x02\x49\x77\x96\x2e\x45\x26\x25\x17\xf3\x38\xb6\x85\x7e\xec\x21\x58\xa2\x97\xb2\xaa\x91\x52\x4b\x67\x7a\x21\xaa\xc5\x7b\xe0\xb6\x3a\x80\x74\xfe\x54\xe7\xa9\xdc\x70\xc5\xa5\xc3\xde\x72\x8b\x9c\x17\xec\x12\x12\xab\x11\x30\xeb\x17\x62\x2c\xd7\xb2\x2a\xb6\xeb\xa9\x18\x5e\x8d\x67\xbe\x6c\x47\xa2\xe5\xad\xc6\x63\xd4\x64\x2c\xc1\x20\x22\x2e\x29\x9f\xe1\x34\xfd\x7f\xcd\x00\xad\xab\xcf\xaa\x64\x2f\xe2\xe0\x8d\xd5\x2e\x2c\x3f\x32"}, -{{0xb6,0xc8,0x8b,0x4c,0x90,0xfd,0x19,0xa1,0x49,0xd3,0x81,0x67,0x19,0x53,0xb9,0xb1,0x6d,0x42,0x8f,0x63,0x61,0xcf,0x50,0x3a,0x11,0x04,0x77,0xe2,0x97,0xf8,0xd2,0xf8,},{0x8e,0xbf,0xb0,0x84,0xf9,0x97,0xb2,0xea,0x79,0x32,0xa2,0x35,0x3b,0x2c,0x8b,0x16,0xbd,0x82,0x5e,0x1a,0xf5,0x87,0xa8,0xeb,0xc5,0x1a,0x6c,0x45,0xae,0xa3,0x43,0xae,},{0x74,0x47,0xa2,0x01,0x81,0xb0,0x2c,0xf1,0xb6,0xad,0x52,0x95,0x69,0xce,0x43,0x7c,0x2a,0x05,0x08,0x11,0x6f,0x50,0x20,0x5c,0x41,0xe6,0x37,0x8b,0x74,0xfe,0x2f,0xc5,0x36,0x30,0xaa,0x0d,0xc4,0xb8,0x0c,0x31,0xcb,0x26,0xc8,0xf0,0x9b,0xf8,0xfa,0xb2,0x7e,0x3a,0xbc,0x8f,0x1f,0x60,0x4a,0x5e,0xc0,0x66,0x31,0xa8,0x4f,0x6f,0x2e,0x06,},"\x7f\x4b\xf4\xf5\x21\x73\xef\xf0\x72\xf8\x18\xd0\xaa\x97\xe6\x93\x5d\x8b\xac\xcf\x48\x39\x66\x32\x53\xb2\x41\x4f\xe6\xb1\xf3\x4c\xf4\x3a\xb1\x20\x15\x5a\x1a\x3a\xea\x7b\x48\x19\xdd\xd1\x03\x16\x73\xb8\xa7\xa6\xbd\x0b\x9d\xda\x4a\xde\xfe\x69\x2a\x56\x16\x2c\x64\x61\x80\x79\x42\x64\xc5\x12\x21\x15\xeb\x90\xa6\xd3\x05\x4f\x08\x43\x02\xdc\xe3\xd8\x36\xac\x3d\xe8\x20\x63\x8b\xd8\x9a\x86\xbf\x0a\x4c\x01\x54\x7c\xfd\xc5\x43\xd6\x76\xfe\x16\x39\xef\x72\xc5\xb8\x45\xc4\x94\xe0\x78\x14\xce\xc8\xa4\x7d\x03\xdf\x73\xbe\x4e\x33\xc0\x5a\xfe\x9a\x19\x0d\xda\x04\x33\x60\x49\x6b\xe4\xcf\x3a\x63\x19\xda\x9a\xb0\x64\x81\x67\x7f\x1a\x43\x74\xd6\x0d\x3d\x3b\x63\x94\xf8\x84\x3c\x86\x9b\x0f\x41\xa1\xe8\x1c\x2b\x1a\x54\xbf\x5a\xac\xbd\x98\x20\x7c\x8d\xba\xcb\x36\x42\x2a\x3a\xa0\x13\xd5\xe8\x49\xe0\x44\xaf\x92\x85\x45\xc0\x46\x09\x7c\xaf\x14\x9d\x97\x02\x15\x11\x5d\xea\x0b\x5a\x85\x40\x1f\xf6\x72\xe0\x2e\xd4\x0b\xd0\xf5\xa4\x40\xcd\x56\x49\x40\x53\xc8\x96\xc3\xbd\x32\x60\x63\x49\xf7\xcb\xe7\xec\xe2\xa2\x23\x0c\xf2\x36\xda\xc5\x9f\x78\x17\x96\x5f\x3f\xa8\x0f\xb4\x8a\xa3\x0b\x0b\x19\xef\xa9\xa9\x65\x91\x64\x6b\xd2\x5e\x67\xc1\x85\xf7\x7e\x21\xd6\x63\x0b\x28\x8d\x4e\x55\x14\x6b\x2a\xbc\x15\xe9\x50\x88\xd9\x36\x08\x07\x75\x61\x81\x54\xbb\xdd\xa1\x15\x70\x2a\x2a\xfd\x6f\xd5\xf5\x6b\x92\x3e\x18\x88\x33\xec\x44\x89\x44\xd3\x02\x83\xe3\x37\x25\x42\x42\xc5\x81\x2d\x72\x45\xa4\xe9\x26\x70\xbc\xe3\x54\x6e\xfa\xed\x22\xd2\x74\xe1\xe6\x04\x8b\x5a\x0f\x01\xef\xbf\x89\x5d\xc4\x24\x94\xba\xf1\x74\x71\x85\xcb\x1a\x4b\x88\xfd\xf1\xe6\x09\x9b\xaa\xbc\x6a\x5a\xb5\xa2\x72\x7b\x1e\x24\x87\x89\xd1\x70\xca\xa2\x44\x96\x71\xa8\xf6\xe0\x94\xc1\x13\x32\xea\x0a\xc2\xaf\xe8\x81\x32\xc6\x44\xff\x88\x3d\x0c\x49\x9a\xd7\x6a\x93\xdf\x47\x2f\xa0\x13\xea\xa2\x7a\xb4\xda\xd6\x79\xd2\x51\x1b\x50\x49\xc4\xe9\x8b\xaa\x2e\x7b\x00\xa5\x34\x89\x1e\x29\x02\x65\xed\xb0\x76\xf7\xdc\xa8\xe6\xfe\xf3\xf4\x33\x03\x4a\x16\x57\x5f\x0e\x53\xda\x45\x77\xe6\xb1\x3f\x0c\xb0\xd7\x85\x87\x0d\x0d\x09\x8d\x5d\x80\xf4\x13\xa2\x68\xba\x84\xe0\x43\x1a\x78\x69\x23\x77\x13\x78\xcd\x57\xb8\x19\x22\x58\xe2\x63\x3c\xdb\xe0\x3c\xc3\x16\xa0\x95\x09\x70\x52\x6f\xd3\xe0\x93\x76\xbc\xef\x0d\x03\xb7\x07\x4e\x59\xa5\xa8\x4f\xc6\x4e\x79\x5a\x81\x21\x56\xd9\x60\x56\x76\x50\xbb\x1e\x14\x24\xb3\xcc\x9a\x4d\x99\xd5\x7b\xa8\x58\xdd\x1a\x0c\xad\x35\x32\xe9\x98\x14\x6e\x79\x26\x40\x45\xe2\x8e\xbb\xfd\x75\xa4\x26\xb0\xbb\x85\x1a\x24\x4a\xd6\xbe\x7b\xd5\x76\x5a\xf4\x93\xdf\xc4\x4e\xe3\x78\xcd\x04\xda\xf3\x91\x7e\xef\x2a\x62\x06"}, -{{0x79,0x49,0xa9,0x47,0x2f,0x72,0x5c,0xe7,0xc6,0x8d,0x7e,0xa8,0xfc,0x16,0xe1,0x3d,0x9e,0x0e,0x0a,0x58,0xf5,0x8c,0x24,0xf9,0x22,0x8c,0x88,0xe8,0x02,0x64,0x09,0x0d,},{0xa3,0x70,0xf8,0x28,0x33,0xf8,0x8b,0x4f,0x5f,0x53,0x10,0xb9,0x18,0xe6,0xaf,0x93,0xbb,0x72,0x4b,0xfb,0xdf,0x3c,0x02,0xc5,0x03,0x78,0x0b,0x2c,0x83,0xab,0x6c,0xc6,},{0xe0,0x28,0x98,0xcc,0x7c,0x30,0xee,0x01,0x64,0x82,0x47,0x49,0x7b,0xe8,0xa9,0xc6,0x37,0x85,0x93,0xdc,0x88,0x20,0xbf,0x7c,0x17,0xff,0xcd,0x18,0x11,0x8a,0xf0,0x98,0x79,0xa7,0x69,0xf5,0x39,0xdd,0x92,0x37,0xe9,0x68,0x21,0x16,0x66,0x34,0x99,0x8f,0x94,0x6d,0xa6,0x5e,0x6d,0xba,0xd8,0x27,0x15,0x11,0x66,0x9e,0x2d,0x6c,0xad,0x02,},"\x95\x53\x86\xb9\x2d\xd6\xbf\x92\x60\x1b\xf8\x1e\x84\xd2\x51\x44\xb5\xfc\x0b\xcd\x7d\x23\xc7\x6e\x7d\xeb\x5f\x5b\xa6\x31\x6b\xb6\x1a\x5d\x8e\x74\x18\x5b\x01\x29\x67\xf0\xa4\x43\x8b\x53\x16\x96\xde\xb4\xb8\x10\x10\x89\xe0\xc0\x48\x2a\xdf\x13\xc0\x61\x31\x91\xb9\x77\xf7\x7b\x04\x19\x81\x41\x47\xf5\xda\x64\xa1\xd3\xbe\xb1\x27\x5b\x98\x49\xd1\x29\x7b\xa8\x53\x2a\xe0\xa6\x47\xa8\xac\xe3\x95\xae\x0e\xd0\x0f\x67\x34\x8c\x5e\xe5\xea\x19\xb5\xf1\xc5\xbd\x2e\x62\x28\x18\xe8\xad\xcb\xa3\xc1\x7c\x27\x98\x7e\x4e\x3d\x6d\x91\x0a\x56\xc7\xe5\x14\x9d\x3f\x55\x74\xfc\x06\x00\x9b\xf4\xdd\x3e\x37\xcf\xe3\xeb\xda\x2c\x21\x16\xd3\x66\xdd\x88\xce\x5e\xa7\x2a\xb3\x87\x49\x05\x85\x44\x3b\x08\x6e\x8a\xa3\x8d\x11\xd3\x82\x0b\x72\xc6\x58\xe4\x63\xcd\xb5\x9c\x53\x93\x01\x1d\x4a\x8f\x4c\xb6\xa1\x95\x22\x93\x04\xe7\x62\x39\xfa\x5e\x8c\x2c\xbe\x0f\x39\xdc\xad\x13\x8a\x0e\xcb\x3c\x51\x57\x9e\xc9\xa1\x20\xa5\x16\x07\xee\xfe\xbf\xa5\x9a\x44\x62\x0e\xa5\xb1\x91\x60\x87\xea\x33\x85\x33\xfc\x13\x2f\xf2\xe4\xa4\x3d\x05\x2f\xd0\x8b\x6b\x1b\x24\xfb\x67\x2f\x73\xc9\xb9\xba\x20\xb7\xc1\xc4\x1e\xa2\x4d\x91\x2d\xe9\xb5\x55\xb6\xe5\x68\x2b\x97\x06\x08\xff\x22\x9a\xd3\x08\x6f\x43\x1f\x9b\xe1\x90\xec\x39\x22\x4b\xa2\xed\x8a\xcb\x4c\x8e\xac\x85\x82\xe2\x3a\xaa\x79\x82\x7c\x44\xe2\x48\xc5\xba\x09\x2d\xda\xc0\xf2\xf7\x96\x84\xaa\x93\xfc\x06\x10\x73\xe1\x82\x1a\x56\xaf\xb9\xbf\xec\x95\x2d\xf2\x71\x9a\x9c\x7a\x40\x3e\x6a\x93\xf7\xa6\x56\xd7\x4b\x61\xc1\xd1\x90\x83\xf8\xd3\xf1\x9e\x65\x9f\xa2\xb7\x18\xe0\xbd\x04\xb6\x93\xd6\x3d\xaf\xb8\x6a\xdb\xee\x5d\x87\xc7\x5b\x7d\x12\x91\x22\xf1\x78\xa0\xe6\x69\xeb\x03\x5c\xa4\xd8\xeb\x45\x39\x7f\x18\x51\x26\x4e\x2c\xf0\xa0\xcd\xd3\x07\x20\xc5\xe1\x39\xcd\x6a\x57\x3f\x1f\xa2\x41\xca\xe9\x42\x58\x05\xac\x79\x60\x3e\x8d\xe3\x50\xef\xdb\x0b\x9b\xc9\x5b\xa7\xb0\x85\xc1\xed\x92\xc1\x2a\xcf\x53\xf5\xd4\xa1\x13\x75\x98\x00\x8f\x2a\x36\x72\xc8\x4e\x5f\x76\x9a\x25\xc7\xa4\xa1\x65\x79\xd8\x62\x88\x77\x49\x72\x60\x6e\x4e\x7d\x85\x26\x3a\xd2\x17\xe0\xdb\xcf\x34\x3f\xe5\x54\xc1\x09\xc5\xd9\x40\x9b\x79\x39\x07\x3a\xc5\x5a\x03\x42\x0f\xec\x28\x9b\x11\x4a\x5c\x54\xc2\x0b\x45\xea\x69\x93\x85\x33\xad\xe7\xb3\xae\x85\xe1\xa7\x83\xdd\x97\x89\x7c\x3a\xe8\x25\x41\x83\xcc\x54\x04\x5c\x2a\x18\xec\xbe\x52\x16\x91\xf2\x61\x9d\x9b\x8f\x1f\xb3\x47\xca\x05\x5a\x7b\x0b\x4c\x24\xf6\x4d\x17\x73\xe0\x14\x16\x44\x1e\xfe\x15\x99\x23\x21\x7a\x84\x87\x4b\x9c\x4e\xc2\x65\xcd\xaa\xb6\x43\x90\x80\x68\x49\x78\x12\xc1\xaf\x15\xc1\x88\x07\x1e\x78\xf5\x97\xfe\xdf\xce\x91\xc5\xd4\xc6"}, -{{0xd6,0x8a,0x5e,0x3c,0x47,0xee,0xdb,0x30,0x99,0xdf,0xfc,0x80,0x4c,0xf1,0x9c,0x5e,0x74,0xbf,0x7b,0xf5,0xf0,0x1f,0x54,0xd4,0xd9,0x1d,0x75,0x74,0xf3,0xd3,0xdc,0x7c,},{0x46,0x46,0x7f,0xe9,0xce,0x3a,0xcf,0xd0,0xd7,0x43,0x46,0xbe,0x21,0xc4,0x62,0x16,0xdb,0x81,0xae,0xce,0x6c,0xe0,0x30,0x8f,0xb8,0xdc,0x63,0x86,0xfc,0x34,0x46,0xcf,},{0x89,0x6f,0xc3,0xca,0xba,0x7f,0xd3,0xfc,0x28,0x5d,0x5e,0xdd,0xdd,0xc0,0x12,0x0c,0xd4,0x6d,0xa7,0xc6,0xef,0xab,0xe6,0x6b,0x15,0x0b,0x00,0x27,0x60,0xb8,0x41,0x4a,0x89,0xac,0x9e,0x7f,0x1f,0x7b,0x7c,0x7b,0x33,0x59,0x8f,0x61,0xf4,0x57,0x18,0xe4,0xff,0x4a,0xc3,0x68,0xff,0x12,0x96,0x14,0xb4,0xfe,0x92,0x19,0xf2,0x37,0xb0,0x09,},"\x59\x6c\x03\xd0\x87\x3f\x57\x2f\x45\xc3\xb1\x6f\x0e\xf4\xb5\x2a\xd2\xbf\x59\xec\x76\xd3\xc0\xe5\x34\xd6\x2c\x1f\x84\x16\x4d\xda\xa4\x25\xfb\x85\xc9\x54\x84\x85\xb7\x06\x46\x77\xe9\x9d\x04\xc3\x9b\x6e\xba\x04\xc9\x66\x39\x7b\xa6\xa5\xf4\xeb\xaa\x69\xa2\x41\xdf\x95\xa6\xe4\x45\x02\x50\x9d\x63\x50\x55\x7e\xbf\xea\x60\x26\x4b\x62\xad\x7f\x74\xd1\x6e\x5d\x25\xd4\x59\x70\xcf\xeb\xeb\x33\xe7\xb1\xba\xc3\x34\x8d\xd0\x3a\x8e\x99\x13\x3b\x26\xbb\xfd\x7a\xa7\x22\xc2\x58\x7f\x72\xd5\x52\x6e\x98\x0d\xa9\xee\xbd\xf1\x08\x21\x1d\xae\x50\xbb\xe8\xc6\x5f\x9a\xbe\xe6\x9a\x1b\xbf\x84\xc0\x3e\x40\x44\x8b\xab\xad\x03\xd3\xcf\x3b\x7d\xe4\x88\x7d\x2b\x47\x73\x77\x02\x79\x64\x82\xd2\x26\x5c\x56\x6b\x0f\x62\x3b\x53\xc8\x67\x1b\xd3\x71\x9e\xde\xc0\xff\xd5\xf4\x9b\x49\xb0\x72\xc1\x56\x4a\x57\xf9\xba\xb6\xb9\x2d\x1f\x06\x8d\x75\x66\x39\xa4\x33\x14\x52\xe6\x1a\xa7\xb2\x18\xa8\x8b\x9d\xb7\x7a\x19\xfb\x82\xf1\x3e\x98\x68\xed\xb7\x98\xd5\xbe\xec\xa5\x5d\x1a\xb0\x95\xb3\x16\x22\x5f\x3f\x63\x90\xf8\x95\x78\xf0\x16\x04\x28\x74\x7b\xcd\x21\xbe\x6a\xe1\xd8\x69\x91\xb4\x8e\xf8\x0d\x56\x92\x50\x85\x8f\xeb\xf3\x27\x6b\xd5\xde\x3d\xb6\x5a\x24\x5c\x8b\xdc\xf1\x48\x8c\x48\x25\x96\x89\x45\x78\x6b\xed\x63\xf3\xd1\x3f\x14\x09\x36\x3b\x94\x85\x60\x47\x68\x58\xb3\x96\xbc\xe5\x88\xe4\x0b\x31\x1d\xdf\xc2\x2a\xd6\x22\xca\x7d\x1e\x69\x56\x14\x64\xdd\xa5\x00\x9e\x63\x8a\xa5\xec\x9f\x4c\x03\x92\x93\xaa\xec\x75\x00\x1f\xfc\x68\xa7\xcb\x3a\xe0\x18\x74\xdc\x7f\x39\xd7\x50\x27\xf5\x9a\x28\x96\x5f\xc1\x95\x30\xc0\x75\x2f\xe9\x9b\x15\x3d\xa7\xc0\xe5\x42\xbd\xa7\x6c\xa1\xe1\x0b\x7e\xa1\x58\xef\xb4\xd8\x21\xfb\xc6\x5e\x72\x71\xad\x99\x41\x09\x53\x15\x44\x7a\xbc\xad\x08\x80\xa0\x07\x5d\xd0\x4b\x13\x25\xc7\x26\x33\xac\xbc\xb2\x61\xfc\xb4\x07\xc2\x64\xa3\x4d\x70\xbf\x1f\x04\x4f\xee\xad\x06\x9a\xf5\xa8\x7d\xd3\x52\xf4\xbd\x81\x10\xfa\x17\x8a\xdb\xd8\xdb\xf2\x3c\x6b\x57\x5c\xdd\x5d\xf2\x2c\xc9\xa5\xcd\xd3\x7d\x9c\x8f\xaa\xb8\x1a\x4c\xb3\xfb\x5c\x4f\xe7\xff\x62\x9d\xba\xa9\xfc\x06\xb8\x0c\x1f\xb6\x91\xc2\x86\x55\x95\x5c\xfe\x5c\xa4\x41\x49\xb1\x50\xb3\xcf\x14\x0d\x9a\xca\xcb\x14\x31\x3a\x72\xc8\x40\x98\xde\x72\xba\xcc\x02\x72\xd7\x9e\xd6\x61\x7f\x72\xde\xc8\x8e\x19\xb8\x44\x25\x49\x2a\x42\x9e\xc6\xd2\xec\x08\xb8\x63\x46\xdf\xbf\x20\xea\x2a\x36\x19\xe7\x7b\x6a\xc6\x42\x30\xeb\xe2\x5f\xa0\x06\x7a\xbb\x5f\x33\xee\x49\xad\xc7\xc4\x4b\xda\x70\x46\xd7\xf2\x24\xf2\xe7\xa4\x89\x56\x83\xfc\xa8\x68\x4e\xd6\xa0\x31\x84\x4f\x57\x86\xbc\xda\x48\xb5\x04\x23\x94\x48\x7b\x52\x40\x2a\x09\x90\x77\x88\xa1\xe1\x40"}, -{{0x31,0xe8,0x2b,0xc1,0xcc,0x5c,0xed,0x21,0xcd,0xc8,0xbf,0xc2,0xdb,0xbb,0x97,0x6b,0x08,0x78,0x0a,0xfc,0x69,0x44,0xaf,0x7e,0x88,0xe5,0x0e,0x67,0x87,0x4d,0x84,0xf1,},{0x8d,0xf9,0x77,0xe2,0xb0,0x40,0xac,0xeb,0xd3,0xda,0xfd,0x67,0xb8,0x7f,0x92,0x16,0xe8,0xc3,0x71,0xbe,0xce,0xd6,0x18,0xfe,0xf3,0xa4,0x96,0xd6,0x51,0xa5,0xd7,0xb5,},{0x24,0x07,0x02,0xac,0x6c,0x68,0xd5,0x97,0xd2,0x22,0xda,0x94,0x9d,0x0c,0x47,0xd1,0x6b,0x39,0x0a,0x47,0x7d,0x1f,0xb5,0x79,0xe9,0xd8,0x94,0x8a,0xdf,0x9b,0x3b,0x6a,0x7f,0xd4,0x45,0x8a,0xe6,0x38,0x5b,0x7e,0x2b,0x68,0x4a,0x05,0xb5,0x5c,0x63,0xfa,0x6c,0xd0,0x87,0xbb,0x90,0x11,0x3c,0xba,0xb8,0xe4,0xaf,0x14,0x2f,0xcf,0x81,0x0e,},"\x69\xd4\x61\xb6\xb7\xa8\x66\xe9\x4c\xd5\x9a\x5a\x23\xbb\xa4\xa1\x27\x66\x02\xf0\x42\xba\xa8\x50\xd5\xb2\x92\x49\xd6\x74\x3a\xda\x04\xd3\xd9\x38\x21\x9a\xbb\xc2\x2a\xda\x66\xa1\x77\x81\x97\xf7\x0b\xf8\x0b\x59\x7a\x8b\x4a\xe0\x0b\xdb\x87\x68\x12\xd3\xab\x4e\xc0\x11\xdf\x73\x34\x1c\x85\x05\x3e\xeb\xcc\x2d\xf0\xac\xfc\x21\x54\x82\x83\xb5\x53\xec\xde\x01\x54\x82\x8e\xd5\xaf\x47\x57\x19\x85\xf8\x97\x67\xb0\x05\xb6\x22\xc9\xe7\xc0\x79\xdd\xe6\x94\xe4\x9d\xc0\x55\x0c\x79\x18\xcc\x51\x5c\x27\x4d\xbd\x9c\x54\x69\xd2\xf1\x8e\xcd\x90\xde\x66\x4e\x03\xca\x41\xe5\x3b\xe2\x0b\x96\xe2\x5a\xf4\x0c\x54\xab\x0f\x7c\xbe\x9e\x05\xca\x3f\xa5\xa3\x7c\x1a\xa8\xeb\xfb\x64\x44\xa3\x2c\x49\x6e\xfc\x68\x15\x7c\x69\xf3\x58\xc1\x5f\x6a\xc0\x9d\x46\xef\xef\x9a\x68\x5d\xf7\xe8\xdd\x63\xb3\x04\xbd\x3c\x63\x8c\xcf\x53\x2f\xe9\x01\xf1\x1c\xf9\x7c\x5b\x1c\xbe\xd3\x3c\x70\x63\x7c\x72\x1b\x02\x89\xad\xf6\xbb\x6d\x87\xc3\x04\x79\xfa\x92\x6e\x04\x30\x74\x30\x2b\x76\xf1\x15\x7d\x0a\x81\xde\xc4\x93\xe8\x7a\x3c\x64\x3e\x7a\x20\xb7\xa4\x15\x25\xa3\x8d\xb0\x4e\x78\xda\xe5\xe7\x79\x70\x66\xbf\xae\x2c\xf4\x48\xa4\x47\xe9\x00\x4c\xce\x8e\x41\xf0\x98\x79\x91\xfa\xd3\x03\x11\xdd\xaa\x45\x9a\x26\x44\xf4\xb9\x41\xc0\x68\xc0\xd6\xc0\x77\x1a\xfc\xf4\x2b\xf9\x13\x9a\x68\x4d\xa2\x98\x48\x6e\xcf\x67\x52\x3b\xf8\x50\x9a\x45\xba\x5c\xb8\xb3\x86\x4a\xd2\x2c\x0c\x6a\x82\x8c\x6d\xb7\x2e\x37\x1d\xe4\x10\xb4\x7d\xac\x49\xae\x9d\x3b\x57\x02\xb1\x73\x9b\x8d\x76\x0c\xe9\x86\x11\xc0\x7d\x88\xdf\x5f\x04\x68\x38\x08\xa2\x1a\xfc\x2e\x61\x71\x3f\xc2\xc0\x25\xcb\x25\xfc\xc4\xee\x94\x18\x41\x08\x3b\x22\xf6\x1e\x26\x56\xfb\x3b\x8d\xad\x41\xc2\x62\xc8\x9d\x2f\x17\x61\x03\x09\xf2\xd5\xc2\x95\x89\xa2\xdf\x61\xe5\x51\x49\x89\x50\x32\xca\x98\x1e\x45\x57\xe1\x30\xa2\x37\xfc\x08\x26\xfc\x87\x25\x29\x86\x1b\xbb\x83\x28\xd6\x73\xf3\x9b\x58\xb7\x3d\x06\x0e\xc5\x96\xbf\x22\xe7\xee\x08\x1f\x44\xe9\x2c\x02\xa5\x67\x76\x79\x52\x0e\x2a\x2b\x4d\x22\xc7\x7f\x2b\x21\x2d\x5a\xaf\x05\x0b\xf2\xc1\x41\xe3\xe2\x8b\x85\x71\xd4\x32\x19\x37\x42\x62\x35\xc7\xa6\x46\xd6\x47\xe3\xef\xe1\x83\xc2\x7b\x74\x92\x56\x5e\xca\xcd\x7f\x43\xc6\x7a\x74\x45\x3f\x47\x80\xe8\x87\x11\xba\x2d\xd4\xa3\x94\x1b\x12\xdd\xd3\x90\x92\x70\xfb\x3d\xeb\xd4\x22\x43\x6a\xb6\x16\x6f\x08\xc9\x9c\x88\x6c\xc0\xe8\xe3\xce\xcd\x06\x42\xe4\x42\x85\xb8\x86\x4a\xa4\x16\x94\x3c\x5a\x18\x69\x74\xf4\x64\x53\x5a\x87\x0a\x01\x28\x61\xbc\x2e\x58\x71\x49\xca\xe9\x71\x62\x4e\x61\xc3\x1d\x8a\x50\x7e\x3a\xd8\x27\x73\xe7\x23\xbc\xb7\x5d\xf5\x4b\xef\x84\x7a\x40\x7b\xcb\x7b\x1d\x57"}, -{{0xcc,0x56,0xbc,0x7c,0xdf,0xa6,0x11,0x92,0x4e,0x72,0xb0,0x7f,0x68,0xab,0xc6,0xca,0x5b,0x85,0xff,0x8b,0xba,0xcd,0xff,0x40,0x6e,0x51,0xba,0x72,0x0d,0x09,0xa8,0x66,},{0x5f,0xfe,0xe2,0x21,0xab,0x4d,0x0f,0xe6,0xf4,0xc9,0x34,0x6c,0x5e,0x5a,0x4b,0x8a,0x63,0x6a,0x6a,0x0b,0xad,0xce,0x96,0x67,0xbe,0x73,0x9f,0x4c,0x9e,0x67,0x33,0xc1,},{0x9b,0x86,0xa1,0x92,0xb6,0x4f,0x4f,0x04,0x4f,0xfb,0xf8,0x7b,0x41,0xc7,0xee,0x52,0xf7,0xa7,0x21,0xaa,0x32,0x0e,0x7b,0xad,0x64,0x25,0x99,0x59,0x90,0x31,0x5c,0xdd,0x50,0x2b,0xe4,0xe1,0x11,0x60,0x19,0xd1,0x31,0xa9,0x21,0x8d,0x19,0x61,0x4a,0xd9,0x55,0x43,0xb1,0x88,0x9a,0xf0,0xa9,0x7e,0xd4,0xd2,0x56,0xdc,0x33,0xd7,0x6e,0x08,},"\x08\x83\x04\xf2\x2e\x1a\x28\x60\x62\xde\xfb\xeb\xb1\x82\x7a\x64\xb7\x6a\x14\xe8\x70\x15\xe7\xf6\x46\x17\x87\x77\xab\xa7\x97\x04\x68\x8d\x7b\xf3\x2e\x1e\xfa\xc9\x7a\x9f\xc3\x39\x81\x0e\xbd\x3d\xf9\x3e\x4e\xa0\x24\x68\x69\x53\xed\x91\xfa\x6d\x2a\xb6\xe0\x7e\xc7\x81\x1a\x6d\x91\xca\x91\xb0\x98\xdb\x47\x25\xdf\x65\x84\x6a\x95\xb8\x08\x63\x5a\x8d\x0c\x5f\xe5\xac\xe2\x5f\x07\x80\xe8\x96\x17\x7b\xc1\xbb\xa1\xcd\xb4\x44\x92\x51\xc0\x1b\x48\x2f\x02\x38\x62\xf8\x8e\x07\x2e\x79\xcd\xe5\xdb\xd6\xc1\xd9\xad\x9c\x07\xc6\x06\xf5\xdf\x85\xa6\xec\xa2\x96\x6c\xbf\xe0\xa1\x67\x39\x68\x11\x2f\x26\xa3\x17\x05\x3f\x16\x7f\x61\x1a\xf2\x97\xef\xa8\x02\xe0\xa9\x4b\x3e\x1f\x33\xa2\x7b\x73\xe5\x59\x7a\xbb\x22\x41\x15\xeb\xe7\x5e\x29\x4a\x1b\xcd\xcd\x97\x92\x55\xb0\xa8\x02\x65\xc0\x89\xaa\xa7\xd6\xbe\xd2\xe3\xd0\xc9\x18\xf5\x6f\x4a\x55\xf4\x48\xd8\x63\x36\x5c\x6c\x58\x46\xfb\x9b\x2b\x9b\xb5\x5f\x6b\x7c\x6d\xff\x58\x47\xb7\x1b\xfd\xd4\xbb\x5b\x9b\xb2\xe4\x24\x9b\xc0\x24\x3a\x02\xab\x4d\x22\xba\x78\xa4\x3d\x18\x21\x95\xae\xd7\x8f\xec\xe8\x4c\xb1\xdd\xae\xb9\xef\xf6\x81\x56\x04\x5b\x29\x32\xe6\x38\xd7\x73\x1d\x0e\x8b\x4c\x9c\x8c\x38\x3b\x0d\x6d\x39\x2d\x21\xfc\x64\x07\x62\xc8\x7d\x36\x92\xb1\x81\x0b\xcc\x4a\x42\x39\x2f\xf1\x3d\x45\x16\x9e\xcb\xf0\x13\x50\x55\x09\x31\x05\x09\x8c\x86\x9b\x68\x88\x7e\x93\x4e\x2b\x9d\xa5\x23\x2a\xc6\xc9\x37\x38\x00\xf7\x0b\x64\xec\x64\xa4\xaa\x0c\xa0\x44\xc0\x77\x7c\xa3\xa3\xac\xaa\x13\x8c\x14\x24\x96\x72\xa5\x5b\x24\xdd\xfe\x4d\xc3\x57\x57\x32\x41\xe1\x4a\xd0\xac\x16\x47\x5a\x8e\x38\x67\x88\x6d\x41\xee\xa3\x5f\xe7\x93\x2b\xa9\xae\xaa\x0c\x86\xc9\xeb\x6d\xb7\x80\x80\x49\xad\xe7\xb5\xcc\x1a\x40\x82\x2c\x66\xde\xa9\x3a\xd2\x2d\x44\xb9\xe4\x29\x04\xb5\xb8\x36\x84\xae\x29\x31\xfe\x36\xc6\x08\xff\x70\x96\xf1\xb0\x9f\x81\x1b\x02\x67\x28\x04\x40\x6e\x08\xed\x9e\x77\x45\x67\x6c\xe0\x47\xf0\xf7\xf6\x47\x08\xe4\x9b\xb7\x87\x54\x72\x0b\x8a\xa2\x26\xf5\x55\x6a\xbf\x05\xb5\x65\x84\x64\x52\x92\xda\xd0\x8e\x24\x73\x63\x9a\x8c\xe5\x47\x5e\x0c\xe9\x19\x2f\x8b\xa2\xdd\x32\xce\x14\xc9\x19\x75\xab\x60\x2f\x7c\x13\x53\x8c\x52\x95\x2d\x03\x96\x15\x8c\x7c\xc6\xb9\x42\xbe\x7d\x92\x3e\xeb\x52\x3a\x73\xb5\xb4\x11\x96\x6d\x14\xac\x96\xe5\xb0\x96\xa5\x29\x32\xa4\x16\x29\x2e\xcc\xdd\xb9\x10\x71\xc8\x85\x60\xe7\x0e\xcd\x4f\xe2\xfe\x24\xd5\x23\xfa\xfc\xb9\x8e\x40\x21\x50\x2f\x41\x90\xa0\x51\x5e\xdc\xb2\x40\x19\xea\xca\x09\xec\x26\x15\xa9\xbf\xde\xb6\x0e\xb3\x54\xc8\x4a\x1f\x3c\xec\x7f\xfd\x7e\x65\xa5\x51\x5d\x47\x95\x9a\x4c\x4e\xc4\x8d\x80\x21\xb1\x75\x4a\xe2\xbf\x84"}, -{{0x7a,0x57,0xf2,0xdd,0xa0,0xad,0x03,0x38,0xab,0x9a,0x13,0xc9,0xa3,0x49,0x7e,0x9c,0x75,0x23,0x8c,0x15,0x31,0x58,0x97,0x89,0x22,0x7c,0xd2,0x74,0x9b,0xc6,0xe9,0x50,},{0x6f,0x73,0x8d,0xc5,0xe7,0xd9,0xe2,0x40,0xc9,0xf4,0xd0,0xc0,0x6a,0x5e,0x02,0x17,0x47,0x56,0x8b,0x69,0xa7,0x5d,0x50,0x7a,0x2e,0x0b,0xe7,0xea,0x61,0x35,0x26,0xc5,},{0x98,0x91,0x23,0x76,0x1d,0x93,0x56,0x32,0x78,0xfd,0x0a,0x78,0xae,0xd6,0x4e,0x2d,0xe6,0xf4,0xa7,0x00,0xfc,0x9a,0x70,0xd2,0x18,0x77,0x48,0xac,0x06,0xd9,0xc2,0xc3,0x77,0xd1,0x99,0x5f,0x89,0xc7,0x72,0x7f,0xe2,0xf1,0x20,0x78,0x4e,0x41,0x71,0xc4,0x2d,0x63,0x53,0xac,0x3d,0x4e,0x3f,0x62,0x0c,0x63,0x9c,0x75,0x78,0x6c,0x46,0x0a,},"\x8c\x85\x75\xa1\x1d\x2f\xf2\xc2\x38\xe4\x19\xcc\xb0\x06\x33\xd0\x4e\x8b\x8b\xd7\x74\x29\x01\xd5\x88\xdd\x6a\x2f\x00\xaa\x12\xf0\x8a\xe4\x1d\xca\xa9\x33\x8f\x8c\x47\xe9\x53\x12\x19\x2c\xf6\xb2\x45\xa0\x0c\xe6\x88\xa0\x29\xda\x56\xdd\x1b\x1d\xeb\x0d\x34\xb5\x41\x4f\xe1\xc2\x1d\x6b\x63\xd0\x6b\x85\x34\xac\xe8\xe8\x66\xc9\x33\xfd\x7c\x5a\x65\xed\xa9\x5a\x17\x37\xa9\xec\xdb\x17\x85\x91\x49\xac\x69\x69\x51\xb8\x2c\x23\x0e\x82\x75\xe9\x6d\xd0\x2f\xd4\x55\xea\x67\x53\x79\xe6\x7b\xa6\x34\x84\xb6\x28\x38\x31\xfe\x3f\xfe\x52\xd6\xec\x49\xb7\x09\x10\x67\x05\xc9\xd1\x9b\x85\x9d\xe9\xfd\x20\x08\x87\xcb\x44\xd8\xfd\xfe\x69\x61\xfa\x4c\xa2\x34\x09\x44\xc7\x64\xc7\x04\x49\x12\x08\x25\x7e\x73\x54\x82\xaf\x8c\xb6\x90\x41\xdd\xe6\x85\x24\x1d\x3f\xbf\x46\xfd\xa0\x57\x24\x8b\x89\x87\xbe\x1f\x80\xb5\x4e\xb5\x40\x09\xf3\x24\xdc\x45\x0e\x88\x6e\x79\xf9\x12\x58\x5b\x91\xc9\xdf\xaf\xe9\x01\x22\x62\xc4\x71\x40\x3b\x1e\x8b\x5c\x31\xfc\x53\x75\xa1\xdd\xf9\x9b\x68\xed\xf9\xed\x70\xaf\x85\x94\xf7\xd8\x4b\x2c\xc4\x91\x1f\xe9\x05\x00\xc6\xee\xbf\xba\xc0\x85\x55\x35\x50\xe3\x5b\xd2\xe5\x25\x14\xe9\x79\xe7\x24\x1e\x9f\x8e\x34\xcd\xf8\x51\x3a\xbe\x72\x51\x0d\xff\x3c\xfe\xc7\xe2\xbc\x64\x88\x64\x1c\xfd\x0a\x65\xae\x0e\x09\xeb\xe9\x9b\x15\xb2\x9d\x45\xea\x67\xa5\x7a\xad\x55\x4d\x4f\x8b\xfc\xe1\x38\x6a\xce\x22\x88\x39\xe3\xa8\xa5\x34\x14\x0e\xec\x3d\x37\xd5\x1b\xe3\x61\xf5\xea\x18\x83\x73\x9f\x56\x61\x5f\x75\xb0\x55\xa0\x6a\x91\x47\x1b\xe9\x8b\xc9\x45\x37\x83\xc3\x58\x38\x2b\xd0\x55\x5a\xe9\xeb\x0b\xdc\xd6\x66\x29\xa6\x11\xfc\x1a\x11\xc6\x53\xc8\x22\x14\x58\x7d\xec\x12\xba\x12\x0e\x25\x13\x07\x0f\xe6\x9e\x98\x2f\x7a\x80\xad\x15\x9f\x6a\x32\x5d\x97\x7d\x01\xd0\x50\xd1\x16\xa6\x2a\x4f\x8a\xca\xb6\xc3\xd6\x9f\xf6\xc8\x78\x21\x3c\x60\xa9\x48\x45\xca\xe1\x06\xde\x6c\x5d\x6f\xe2\x50\x8d\x94\x56\x5b\x7b\xa7\x5d\x58\xd1\xad\x47\xd7\x6a\x20\xde\xfa\x75\x68\xcb\x7f\xd6\x6f\x57\xcf\x37\x74\xa2\x1d\x3f\xfa\x7d\x8a\xa6\xd8\x6d\xc2\x84\xb7\x0e\x0f\x17\xe7\x63\x0b\xfc\x10\xcd\x1f\xc9\xa8\xd9\xc5\x92\xd3\x9f\x24\xa7\xb5\xc8\xe8\xaf\xf3\x53\x57\x7e\x6a\xc9\x00\x86\x90\xc7\xa1\x59\xa7\xe8\x3b\xe5\xa6\xae\x8f\xca\x96\x44\xbd\xdf\xa3\x7a\x92\xb0\x70\x55\xf9\xfa\xc9\xfa\x97\xfb\x3e\x8f\x5f\x4d\x91\x7d\xda\x5c\x6d\xc6\xea\x34\xb6\x4d\x30\x24\x05\xbc\x38\x06\x2e\x07\xce\x93\xa1\xa8\x8a\xed\x5f\xba\xf9\x95\xa0\x9b\x45\xb2\x8a\xd4\xa6\xb2\x73\xde\xc1\x41\x3c\x54\x04\x52\x9d\x82\x5b\x5e\xdc\x2e\x27\xa3\x90\xeb\x7e\x8c\x2b\x43\x90\x5e\x11\x6d\x88\x7a\xb5\xfb\x99\x3d\xfe\x15\x0e\xbd\xcf\x81\x7a\xe6\x2e\x03"}, -{{0x32,0xef,0x6d,0x78,0x9a,0x1e,0xa3,0x93,0xf1,0xbf,0x9f,0x11,0xde,0x34,0xf5,0x7d,0x65,0x3c,0x4e,0x77,0xd5,0x1e,0x60,0x50,0xfe,0xf4,0xe8,0xd7,0xbf,0x18,0x3d,0xb5,},{0xc1,0xaa,0x18,0x1e,0x62,0x0f,0x60,0x52,0x5c,0x2b,0x17,0xda,0x8d,0x29,0x0b,0xae,0x5d,0x33,0x9e,0x17,0xea,0xbc,0xea,0xb5,0x8c,0xd7,0x6a,0xe0,0x66,0xf4,0x11,0x79,},{0x88,0xf3,0xa6,0xe0,0xbb,0xaa,0x3e,0x06,0x0b,0xc9,0xd9,0x1f,0xe2,0x96,0x8c,0x61,0x12,0x6b,0x20,0x31,0x7f,0x59,0x84,0x2e,0x4a,0xe4,0x87,0x11,0xcd,0xba,0xf6,0x2c,0x6c,0x02,0x07,0x40,0x5d,0x1c,0x48,0x49,0x95,0x02,0x71,0xf0,0xaa,0xa7,0x59,0x30,0x91,0x10,0x9e,0x47,0x8d,0x13,0xf3,0x56,0x96,0x4f,0x7d,0xba,0xb7,0x29,0xaf,0x00,},"\x11\xa9\xc3\xc1\xba\x7c\xfb\x61\xad\x10\x33\x05\xc2\x58\x86\xde\x9f\x88\x15\xc6\xc2\x1f\x17\xa8\x73\x3a\x02\x4f\x94\x97\xda\x05\x40\xdb\x36\x03\xa6\x71\xaa\xe8\x37\xdb\xbb\xa1\x9e\x19\xf8\x2d\xdf\xc8\xaf\x85\x59\x80\xa7\x01\x25\xfc\x61\xcd\x7f\xfd\x10\x77\x7e\x36\x6e\x5e\x95\x69\x92\x7a\xf0\xf2\x45\xd4\xf3\x9b\x3f\xd0\xf4\x58\x79\xc2\x53\x40\x14\x12\x85\x5e\x57\x61\x90\x5e\xd6\xef\x31\x8b\x6a\x06\xea\x6e\x9f\x90\x6f\x9b\xd0\x16\xbc\xb6\x94\xa0\xdf\x65\xa0\x16\xbd\xfe\x84\x5a\x09\xf2\x3e\x50\x86\xc5\xaa\xf3\x75\xef\xeb\x86\xda\x51\x23\x9d\xdc\x35\x0b\xac\x0c\xdb\x03\xb8\x74\xdb\x15\x07\xe6\xad\x4e\x2c\x9f\x46\x02\x8c\xa2\x38\x83\x63\x54\x14\x93\xb6\xcb\x92\xc1\xdf\xca\xa3\xef\xd6\x8c\x6b\x4e\x91\xef\xb4\x67\x51\xd2\x3f\x4c\x48\xa9\x73\xf0\xa5\xc7\xc6\xfe\x2a\x12\x69\xd2\xa6\x9e\x9f\xc4\xab\x8b\xa3\xb9\x2f\x79\x64\x49\xba\x3d\xc7\x02\x45\xed\x50\x5c\xc0\xee\xee\x16\x36\x64\x7a\x68\xc7\x67\x9d\x0b\x6d\x65\x1b\xba\x35\xc2\x9b\x81\x47\x8d\x17\xca\x36\x85\x70\x7a\xd6\x16\xe6\xe5\x60\x43\x81\xf8\x4e\xe5\x2b\x25\xad\x02\xfc\x0d\xfb\x85\x43\x2e\xfb\x1f\xec\xd0\x90\xc0\x2a\xd0\x02\xc1\x85\x7f\xce\xd8\x8f\xdf\xb2\xff\x26\xdd\x0f\x50\x18\xfb\x47\xd8\x13\x58\x1f\x65\x08\xca\x63\x7c\x73\x65\x17\x7c\x51\x3d\x1e\xe0\x58\x79\xa6\x5c\x5b\x67\x6b\x3a\xa8\x73\xa1\x93\x5c\x54\x37\xea\xdc\xb6\x6d\xfb\x05\x2a\x5e\x7c\x3e\x81\xd4\x4b\x3d\xaf\x69\x8f\x42\x24\x4e\xe2\xee\x4b\x6e\xd2\xb7\xe6\xe5\x6e\x61\xff\x9c\xb4\x5e\x71\x9f\xd7\x46\x19\x8b\xf2\xa7\xde\x6d\x25\xaf\x3b\xc6\xc7\xb0\xed\x8a\xbe\x3c\xb3\x89\xaf\xd8\x4f\xfa\x2a\x23\x0d\x93\xbc\x0c\x29\xd5\xa9\x41\x9c\xbf\xf1\x1b\x78\x83\x32\x99\x21\x48\x0b\x58\x44\x65\x5d\x99\x6c\x7c\xab\x29\xdf\xb2\xa3\x92\x7b\x82\xba\x7c\x30\x6c\x45\x77\xb6\xf8\xb5\xdb\xe2\xaf\xaf\x9b\xf1\x4a\x8f\x95\x54\xcd\x01\xa6\x9a\x99\x1b\xf2\x12\x82\x8d\xe1\xe6\x31\x72\xe8\x33\xde\x06\x69\x8c\xdb\x3b\x28\x71\x63\x80\x31\x45\x72\xbf\x5b\xcf\xd3\x4e\xf5\x2a\x6f\xad\xda\x87\xba\xbe\x6b\xac\xdb\x20\xce\x63\xc7\x25\xcb\x0f\xf6\x1f\xe3\x0c\x1b\x51\xdb\xda\x2c\x26\x25\xf9\x9d\xfe\xb0\x29\xa3\xe5\x8c\xba\x7d\x01\x90\x51\x11\xca\xf4\x2f\x27\x02\x5e\x72\x0e\x18\xee\xb0\x7d\xae\x91\x55\xc5\x5a\xa3\x00\xe2\x2e\xb5\xe9\x4d\xc7\xa0\xa8\x4e\xe6\x7d\x91\xa9\x60\xae\x08\xca\x63\x2d\xbb\x17\x37\xfc\x9a\x43\xdb\xcf\xb3\xa8\x79\xeb\x9f\xbf\xfd\x72\x99\x33\x8e\x26\x4b\xc1\x23\x7a\xb6\xa5\xbc\x2a\x26\x3c\xfa\x99\xe8\x54\x44\x39\xd9\x63\x31\x63\x9f\xe9\x40\x8e\x54\xa3\x50\x61\x0f\xf0\x1d\xe3\xf8\x57\x99\xad\xeb\x73\xd8\x2b\xe9\x38\x07\x4d\xea\x85\x8e\xa6\x36\xb6\x3a\xbd"}, -{{0x0a,0x55,0x25,0xa4,0x59,0x8f,0x60,0x99,0x2f,0x86,0xba,0x1a,0xb9,0xee,0xe6,0xe2,0x67,0x56,0x22,0xf9,0x43,0x28,0x4f,0xc0,0x55,0x3e,0x44,0x46,0xac,0x5a,0x4c,0x53,},{0xdb,0x60,0xd7,0xea,0x29,0xf8,0xd6,0x0d,0xad,0x33,0xd0,0x2e,0xc5,0xf4,0x22,0x32,0x05,0x7b,0xd1,0xc4,0xbd,0x61,0x80,0xa2,0x42,0xcb,0x7a,0xb6,0xf4,0x42,0x67,0x81,},{0x8f,0xa6,0xb0,0xae,0xac,0x71,0x13,0x2a,0xd8,0x82,0x97,0x58,0x68,0xf1,0xbd,0xb8,0xc1,0x1f,0x1a,0x6c,0x1b,0x9c,0x54,0x59,0x4e,0x0e,0x46,0x28,0x6e,0xa6,0xc9,0xa5,0xd6,0xd5,0xb0,0xea,0xea,0xca,0x9a,0xe3,0xaf,0x74,0xe7,0x23,0x26,0xb3,0xb6,0xf2,0xea,0xa8,0x93,0xc0,0xec,0x42,0xa4,0x9c,0x56,0xef,0x51,0x4f,0x75,0xc7,0x7f,0x01,},"\xf7\x87\x32\x1b\x42\xc0\x8d\x40\x52\x44\x9a\x48\x85\x93\xd8\x85\xb4\xe0\xc3\x4a\x5d\x64\x14\x9f\xa8\xb9\xc8\x5e\xe5\x4b\xcb\xec\xb5\x09\x09\xb2\xa8\x6b\x88\x25\x8a\x10\xe0\x7e\x8f\x8c\x2d\x06\x8a\x89\xfb\x16\x5a\x6a\xce\x7e\x64\x99\x8b\xa5\x7d\x89\xd9\xbf\x2b\x8b\x38\xa1\xf6\xd8\x36\x4a\xee\x05\xce\x33\x48\xbe\xd4\x8b\x88\xc2\x47\x3b\xf5\xf2\x66\x5f\x51\xca\x07\x3a\x53\x05\x35\x8e\xaa\xd4\x36\x5d\x58\xb8\x3b\xc9\x81\x4e\x25\xf5\x4c\x37\xcd\x9b\x68\xa8\x08\xa5\x7d\x6c\x2d\x7d\x7b\x6d\xeb\x5f\xe2\x0f\x4f\x96\xfe\x72\x5f\x8d\xe6\x5c\x29\xa4\xf1\xcc\xef\xd7\xc2\xc6\xf2\xfc\x01\x16\xd5\x86\x76\xac\xbc\x58\x69\x1c\x79\xc2\xb0\x06\x78\x5a\x09\x75\xa3\x1d\x8d\x3c\x94\x91\x61\x59\x6a\x06\x8a\xaf\x22\x26\xab\x84\x25\x50\xe9\xc0\xb2\x61\x0a\x29\x53\x1d\x1f\x3f\x7f\x00\x82\x6b\xb6\xc7\xdb\xe0\x4e\x28\xae\x1b\x9f\xf6\xf8\x88\xa4\x9d\x82\x81\x2f\x45\x2e\x1b\x32\x74\x0b\x23\x4d\xdd\x96\x42\xe1\x8f\x32\xad\x9a\x9a\xf7\xf8\x95\x25\x28\x67\x4a\x2c\xda\x25\xb4\xf7\xba\x86\x70\x07\xff\xa7\xf7\x8f\x16\x3d\xb8\xf3\x69\x14\x95\x6b\xfa\xec\xd5\x0f\x6d\x1a\xf4\xee\x13\x32\x75\xa8\xea\xab\x94\xbb\xc0\xae\x52\xb6\xd9\xb2\x83\x26\x34\x23\x2e\xc0\xe8\xb5\xf8\x02\x2d\x3e\xf1\xea\xd9\xb7\x9e\xf9\xa1\x65\x64\x27\x71\x94\xf2\x38\x0d\x90\x21\xe1\xf1\x7b\x18\x4b\x8d\x3a\x7a\x34\xd1\x51\x39\xa3\x9c\x77\x28\xc2\x2e\x1a\x3a\x67\xa2\x7a\x6c\xa4\xb8\xa8\xa0\x63\x6c\x60\x54\xd0\xf7\x41\xf0\x46\x67\x36\x19\xfc\x6b\x07\x0e\x62\xff\x48\x62\xf5\x9d\x26\x90\x07\xf3\x43\x13\x39\x63\x7a\x89\xf5\x64\xc0\xdb\x3d\x9b\xcf\xcd\x19\xfc\x25\x13\x8a\xc6\x6d\x47\x4d\x80\xf4\xad\x79\xf6\xd1\xe7\x84\x44\x08\xe8\x80\x34\xee\xaf\xf4\xa7\x90\x33\x8d\x54\x6b\xfc\xd7\x42\x4c\x11\x9e\x21\x1f\x36\x3c\xb8\x9c\x88\x87\x49\x34\x6a\x89\xd3\x2f\x02\x3b\xb6\xb0\x36\x6a\x1e\xde\x43\x25\x03\x2a\xa3\x5f\x52\xe9\xdf\x93\x8a\x50\x27\xeb\xee\x96\x88\xae\x48\x0d\xde\x1a\x9c\x9b\x42\xd1\xa9\xc0\x8f\x71\x92\x23\xdf\xae\x1c\xfc\xd4\x9d\xd1\x05\x3a\xaa\x38\x1c\x24\xcc\x9c\x7a\xbf\xcf\x8f\x6d\x86\xd6\xaf\x72\xee\xf0\x53\x04\x41\x2f\x3d\xb2\x58\x5a\xa9\xe0\xf3\xa4\xf1\xb6\xd7\x10\xd0\x2a\xb1\x1d\xb1\xfc\x90\xad\x4d\xe2\x5d\x04\x29\x9f\x31\x29\xc2\x12\xe9\xcb\x73\xc0\x04\x79\x53\x45\x5b\xf9\x8e\xc8\xfd\x26\x74\xe4\x7b\x94\x99\x57\xde\xed\xa0\x18\xba\xdc\x9f\x2f\x68\xa1\xb1\x8e\xf5\xc5\x83\xb0\x95\xe0\x8d\xd9\x06\xda\x5f\x22\x0d\xa0\x29\xb9\xc4\x00\xe3\xca\x91\xc7\xcb\xd8\x7f\x34\x30\xc7\x42\x33\x7f\x61\xcf\x54\x74\x5b\x06\x22\xbc\xb9\x07\x62\xc6\xba\xfe\xf8\x7e\x1e\xc8\x88\xc3\x64\xfa\xd6\x46\xc3\x3a\xcc\x22\xaf\x54\x38\xb8\x4c\xd5"}, -{{0x2d,0x5d,0xdf,0xfa,0x2e,0x58,0xc9,0x04,0x51,0xea,0x05,0xde,0x47,0xb8,0xc4,0x92,0x34,0xe2,0x6c,0xed,0x54,0x85,0x4e,0x3a,0xce,0xf1,0x1d,0x8e,0xe6,0x85,0x2d,0xa7,},{0x7b,0xfd,0x1c,0x8a,0x4a,0x0b,0xbb,0x46,0x06,0xd2,0xe5,0xbc,0x09,0x0f,0x56,0xb2,0x0d,0x58,0xf2,0x20,0x4b,0x6a,0xed,0x83,0x1d,0x3d,0xf4,0xd4,0x06,0xb4,0x76,0x05,},{0xce,0xd9,0xd6,0x10,0x10,0x33,0x9c,0x47,0x1d,0xdf,0x9f,0xef,0xca,0xa8,0x2d,0x1e,0xab,0x3a,0x2e,0x0e,0x60,0x27,0x85,0x53,0xb4,0xdd,0x9f,0x39,0x5b,0xe5,0x81,0x49,0xc9,0x15,0x94,0xe5,0x61,0x8b,0x0b,0x10,0xbf,0x3a,0xab,0x94,0xf1,0x59,0xb5,0x30,0xf6,0x44,0x63,0xee,0xd6,0x6f,0xa2,0xac,0xe5,0x4f,0xd9,0x25,0x72,0xa0,0x6a,0x0e,},"\x4f\x1c\x5b\x4e\x6f\xac\x3b\xaa\x3e\x90\x10\xf3\xbf\x29\x3c\x77\x9e\x61\xfd\x7b\xbe\x05\xa5\x86\xf5\xaa\xf0\x80\x26\x37\x16\x27\xa2\x09\xac\xd1\x88\xaf\xb2\xdb\xe0\x31\x15\x47\x94\x05\x59\x71\x16\x40\xf7\x8a\xea\x9a\x62\x81\x89\x62\xf4\x45\xa8\xe7\xed\x6f\xe6\xc5\xf4\x91\x62\xe7\x43\x5d\x1b\x62\x5b\x88\xba\x39\xda\xb0\xad\x56\xfd\x2c\x0a\xd6\x51\x26\x61\x36\x2b\xf7\x8a\xfe\x5a\x14\x16\xb6\x47\xf3\xb8\x8a\x05\x6c\x9e\x72\x89\xc9\xb0\xcc\x3a\xfb\x43\x40\x21\x98\x56\x34\x93\xe7\x37\xb1\xda\x05\x25\x06\xb6\xc9\x30\x6d\x75\xad\x66\x93\xdb\x6d\x15\x71\xf9\x6f\x6f\x52\x99\x0c\x4d\xf1\x96\x65\xa6\xbb\x63\x07\x3f\xdd\x9f\x55\x59\x68\x96\xa2\xe9\xc2\x62\x2f\x2b\x0c\x2c\xc9\x9d\xdd\x1b\x64\x9f\xb0\x31\x80\x58\xd7\x47\x94\xe3\x8e\xc6\x57\xeb\xc8\x2a\xbd\x5b\xed\xf8\xb3\xf4\xbb\xa3\xbb\x6c\x99\x35\xfd\xf6\x82\x65\x02\xb7\x69\x04\x6b\x36\xd9\x6d\xc6\x95\xd7\xc8\x54\x04\x28\x4d\x2a\x2a\xb7\xfc\xf3\xb0\x2f\x68\xa1\x49\x3d\xd3\x83\xca\x63\x39\xfa\xc1\xcd\xe4\x7f\x53\xc5\xe0\x26\xd0\x86\x9f\xaf\xfe\x40\xab\xdb\x98\x19\x52\x30\xf1\x7d\x0c\xfa\xa5\x33\x31\x5a\xfd\xbf\xe7\xd1\xaf\xc3\xa6\x15\xb4\xf7\x50\x90\x23\x3a\x50\x3f\x88\x61\xe3\x23\x74\xe1\xea\x95\x57\x67\x42\x31\xd9\xd7\x37\xd4\x77\xb3\x3f\xf8\x2a\xc0\xb2\xc0\xba\x93\xc1\x1f\xb5\x23\xe6\x13\x61\x8e\xd3\x70\x52\x4a\x60\xf4\xd4\xc8\x36\x94\xc0\x33\x60\x6d\x1d\x06\x9d\x54\x4d\xcc\xd3\x90\x0c\x37\xa3\xb3\x36\x3e\xfb\xcf\x66\x97\xf9\xf7\x62\xb3\x3b\x12\x94\x58\x39\x53\xfc\x53\x77\x3e\xf5\x67\x26\xee\xb4\x70\xeb\xe9\x21\x49\xb7\x36\x48\xa1\x61\x61\xd4\x94\x12\x0a\x31\x8b\xfb\x08\x0c\xc3\x8e\x49\x96\xf4\xb2\x63\xff\xe7\x8c\x78\x77\xfe\x13\xc2\xfc\x55\x21\x9f\x44\x26\x0e\x8f\x25\x3b\xdd\x37\x9d\x87\x0e\x6c\x91\x04\x8b\x1d\x8d\x4e\x88\xb8\x82\x18\xb2\xb0\x49\xfe\xf5\x3b\x2a\xe1\xf8\xc9\x21\xed\x2b\xcb\x43\x46\x69\xe3\x97\x5d\xcc\x3f\xe4\x52\x0c\xa8\x02\x48\x42\xf7\xff\x2b\xa1\xe2\x2c\xfe\xb5\xd4\xc9\xe4\x35\xea\xda\x60\x1f\xf1\x83\xb2\x63\x64\xee\xe1\xfa\xa5\x9d\x19\xe6\xaa\x4f\x09\x75\x23\x84\x96\xa7\x09\xe4\x6b\xf6\x83\x36\xb0\x68\xbd\x80\xb3\x46\xf1\x1f\xaa\x38\x17\xa0\x7d\x1c\xbd\x84\x38\x2b\x21\x02\x98\x6f\x29\x5a\x13\x98\x07\x7b\xa2\x91\xd6\xb5\xf5\xbd\x86\x0e\xc6\x17\x72\x73\x46\x8f\x0e\xe0\xf2\x59\x1b\x57\x5c\x43\x66\xe1\x89\xb2\x24\xe9\xff\xa3\x5b\xc7\x8a\x4a\xa8\xc0\x69\x54\xfe\x33\xd0\x80\xff\xc0\xb2\x3e\x20\x9f\xd0\xe7\x94\x21\xf1\xbd\xe8\x18\xa8\x68\x90\xcf\x17\x22\x36\xdb\x21\x16\x57\xd1\x00\x31\x19\xfe\x91\xd4\xe2\x7c\x52\x4c\xcc\x11\xfa\xde\x0a\x25\xf5\x7a\x7a\x1d\x67\x7e\x1d\xa0\xb9\xc0\x43\xd0\x2f\xca\x38"}, -{{0x4d,0xf5,0xe1,0x1d,0xec,0x80,0xec,0xd8,0x82,0x83,0x75,0x54,0xfa,0x31,0x35,0xb9,0xd5,0x02,0x9d,0xf4,0x20,0x27,0xaa,0x3b,0x3c,0x92,0x92,0x46,0x32,0x9f,0xee,0x96,},{0xef,0xd9,0x28,0x89,0x8f,0xa1,0x44,0xc2,0xd1,0xc8,0x33,0x4f,0xa2,0xe6,0xb5,0xb6,0xa3,0x25,0xa7,0x10,0x2a,0x2c,0x34,0x4a,0x14,0x55,0x41,0xee,0x9a,0x6c,0x04,0x6d,},{0x62,0x54,0x5e,0x6c,0x07,0x80,0x1f,0xde,0x95,0xb4,0x61,0xe2,0xe7,0x53,0xc4,0xb6,0xc8,0x4c,0x25,0x12,0x4e,0xb3,0x30,0xa2,0x72,0x59,0x89,0xd5,0xe3,0x40,0xdc,0xef,0x0c,0x74,0x56,0xd4,0xc7,0xc6,0xa1,0x78,0xa2,0x21,0xb6,0x32,0x83,0x48,0x25,0x3d,0xb7,0x87,0xa9,0xe5,0x51,0x0a,0xb9,0xcc,0x27,0x85,0x15,0xae,0x3e,0x58,0xfb,0x01,},"\xfb\xd6\xf3\x71\xb4\xc8\xb1\x52\xc9\xce\x0c\x63\x96\xa7\x7c\x0f\xe4\x80\xbc\x02\x00\x7f\x33\x6a\xc5\x8f\xd4\xad\xdd\xa9\xd6\x98\x55\xac\x9e\x93\xa4\x5d\x3e\x35\x0f\x41\xff\x50\x2a\xa1\xd8\xfe\x15\x9c\xe8\x9b\x06\x48\x02\xa0\xa1\x89\x0f\x6a\x40\xa7\xef\x57\xc6\xe5\xe5\xed\x04\x02\x80\xdf\x07\xe7\xf4\x8f\xe8\x19\xbe\x63\x17\x67\x10\x75\x7c\xb6\xe4\x40\xb4\xf7\x8b\x57\x59\xdc\xe0\x28\xbf\x58\x5b\x3c\x3f\xec\xa1\xcf\x59\x81\xda\xda\xdf\xd2\x7e\xa1\x24\xaf\x45\xef\x63\x85\x42\xa8\x61\x7f\xf4\x9f\x94\x70\xac\x22\x85\x94\x3c\x7c\x3b\x11\x63\xb9\x03\x95\x5a\xb9\x9b\x6e\xab\x17\xf4\xd4\x9f\xfa\x87\x20\x7a\xbb\xfc\x11\x1c\x4b\x91\xf5\x41\x3d\xfc\x9b\xea\x31\x84\x3d\x11\x5d\xde\xb1\xda\x40\xb4\x5f\x58\xf4\x7c\x41\x7b\x5e\x77\xd5\x81\x89\x34\xe7\x30\xeb\xa9\xc4\x55\x7b\xbf\x48\xcb\x7f\xd4\xe6\x64\x55\x8a\xf4\xfb\x44\xee\x3d\x94\xc1\x6e\x88\x36\x31\xf3\x84\x76\xf4\x83\x7d\xb9\x4d\x54\x12\x2f\xa1\x34\xca\x51\xa5\x25\xaa\xd5\xe2\x4b\x76\x01\x8f\xee\x9a\x2e\x8f\x60\xe2\xbb\x48\xd2\x4a\xb8\xb1\x46\xf8\x4f\xfa\x98\x20\x12\x0e\x7c\x50\xd4\x5c\x0c\xfb\xe3\x5c\x8c\x31\x41\x9b\x07\x8e\x90\x71\x2c\xfe\x93\x4c\x3b\xe3\xa9\x4f\xf2\x15\x88\x73\xae\xfe\x34\xdc\x6e\x36\x90\x2b\x16\x75\xe1\xa4\x7c\xb6\x08\xdf\xe9\x60\xfb\x4d\xa8\xd2\xa8\x49\x0c\xc3\x8e\xba\xdc\x73\xa1\x00\x3c\x49\x41\xfd\xa8\xfa\xe9\x44\xa1\xde\x8e\x3b\x10\xef\x6d\x9e\x67\xce\xec\x74\x59\x77\xd3\x33\xac\x9e\x71\x21\x41\x21\xed\xe8\x89\x22\x95\xe2\x77\x99\xf2\x06\x67\x5a\x9d\x54\xac\x12\x15\x9d\x3a\x1f\x95\x4f\xd0\xee\xff\xbd\x30\xa3\x19\x04\xfb\x2e\xee\x77\xa8\xaa\x9d\xc4\xcc\xbb\xe2\x85\x10\x96\x14\x6a\x4c\xe0\xe8\x1f\xb9\xc6\x24\x98\xdb\xd8\x3b\xf8\x3b\x55\x02\x9a\x5e\x90\x00\x86\xb9\x53\x1c\xe3\x24\x7a\x98\xf8\x65\x4e\xfd\x8f\xe7\xa8\x36\x43\x1f\x75\xda\xf0\x86\x8f\x01\x08\x32\x6e\x23\x02\x6d\x2d\xb4\xa7\x21\x24\xec\x4e\x39\xd4\xbb\xf3\xd8\x46\xc9\xf5\x1c\xa3\xcc\x31\xeb\x1d\x02\xc2\xba\x32\x1e\x46\x19\xf2\xb6\x59\xc0\xbf\x0f\xe5\xc1\x9b\x21\x3f\x3c\x79\x12\x4f\x36\x43\xf7\x4d\xd0\xff\x9c\xe5\xd2\x77\x27\xbe\x6c\x69\x58\x15\x9c\x16\x44\x04\xf4\x33\x01\xfe\x17\x42\xe2\x79\xde\x9e\xfd\x44\x1e\x73\xe4\xea\x7a\x84\x25\x87\xa7\x9d\x11\x5d\x36\xec\xa9\xc0\x3c\x90\xff\x0d\x14\x74\x74\x10\x9f\xc2\x0a\x91\xd7\xb3\xcc\x22\xeb\xcb\xb8\xc7\xf7\x1b\xd6\x1e\x8c\xae\x47\xc5\x05\x0c\xec\x1d\x48\x49\xa1\xd4\xa8\xe7\xa6\xf8\x45\x54\x84\x37\x70\x6c\x25\x33\x1c\x9e\x57\xc2\xcc\x6d\xa1\x17\xf2\xe5\xa0\xf4\xb3\x68\xc4\xcb\x20\x62\x65\xc4\x17\x8e\x06\x55\xff\x67\x5f\xfc\x1d\x4c\x58\xec\xeb\x9e\xdb\x4d\xa3\xad\x2c\x5f\x62\xcd\x13\xab\x48"}, -{{0x85,0xd3,0x23,0x30,0xe2,0xe0,0x73,0xa4,0x60,0x30,0xca,0x0e,0xe2,0xdf,0x2f,0x8e,0xb8,0x74,0xa9,0xfd,0xdf,0x56,0x24,0xc8,0x03,0x17,0x75,0x11,0x1f,0x11,0xee,0xa2,},{0x6e,0xa7,0xde,0x2e,0xd5,0xea,0x5c,0xdf,0x50,0xbf,0xff,0xee,0x77,0xf7,0xbd,0x2f,0xcc,0x21,0xd4,0x86,0x66,0xbb,0x1f,0x48,0x90,0xc7,0x6a,0x69,0xcc,0x7b,0xa4,0xe8,},{0x41,0x43,0x63,0xfe,0xad,0x6e,0x59,0xa3,0x43,0x8c,0xe5,0xa3,0xa2,0x77,0xd6,0x2b,0xdd,0x00,0xfa,0x2e,0xfa,0xc6,0x46,0x3d,0xd1,0x3f,0xcd,0xde,0xd9,0x3a,0x7f,0x10,0x8a,0xe1,0xf5,0x28,0xff,0xc8,0xff,0x4e,0xca,0x33,0x1d,0xab,0x91,0xae,0x5b,0x14,0x16,0xe2,0xdd,0xb7,0x3b,0x6d,0xaf,0x85,0x3b,0x03,0xc8,0x1e,0x99,0x36,0x56,0x0a,},"\xae\x61\x07\xf3\x8f\xf9\x4e\xd0\x32\x79\x03\xcb\xaf\x6c\x3e\x3a\x34\x98\xc4\x7a\xbb\x29\x89\xa8\xb3\x7b\x3a\x19\xdf\x88\xc6\xde\x79\x0a\xcc\xb4\xb7\x25\x81\x77\xb9\x15\x1d\x1f\xe0\x40\x63\x57\x7d\x3c\x3a\xcd\xb4\xc9\x29\x96\x8a\xfd\xad\x6f\x25\x2a\x67\xed\x4c\xa8\x9d\x06\x0f\x1a\x46\x53\x98\x3f\x7a\xb5\x8d\xdb\x93\xe2\x87\x8f\xba\xb0\x63\x7d\xbb\xeb\x95\xd2\x5c\x59\x86\x83\x9d\xe2\x74\x8d\x9f\x34\x02\x7a\xee\xbf\x1d\x9e\xb9\x36\xcb\x67\x70\xe0\x8d\x45\xb8\x09\x5b\xac\x9c\xbb\x71\xdb\x14\xe8\xa3\x42\x22\xb1\xf2\x23\x7b\x9f\x0b\xc9\x76\x6a\x23\x1a\x6d\x10\x27\x99\xf7\xc0\x81\xd5\x00\xfb\xea\xde\x60\x3c\xdc\xdd\x7d\x5b\x96\x5f\xba\xce\x4b\xe5\xc2\xcd\x93\x2d\xcf\x5f\x6e\xd3\x17\x22\xf4\x1d\x5a\x36\x3b\x34\xba\xbf\x3f\x63\x6f\xb3\x03\x82\x4a\xa7\x01\xdf\xe1\xd3\xe4\x12\x63\x07\x8c\x1e\xbb\xdc\xb1\xf7\x3f\x12\x45\xb8\x3e\x3f\xa7\x0a\xb8\xe3\xf1\x41\x3e\x6b\x06\xbd\xae\x02\x2b\x71\x4d\x60\xa4\x01\xd5\x74\x80\xdc\x64\xe7\xaa\xc6\xd3\xde\x85\xfc\x94\xd8\x53\xca\x13\xb7\xe6\x74\x15\x57\x9d\x5c\x67\x21\x23\xa5\xaf\x19\x4b\xee\x14\xae\x35\xdc\x27\x24\xff\x20\x9f\x11\x66\x63\x86\x61\xf8\x81\xb1\x19\x4a\xa4\xe3\x1b\x42\xa5\x27\x96\x47\x81\x59\x15\x04\xba\x76\x10\x3f\x97\xb7\xf5\x52\x03\x15\x47\x3e\xc9\x4b\xb0\x17\xa1\x66\x67\xb2\x2a\x85\x76\xa7\xcc\x2a\xc0\xb7\x75\x63\x03\xc7\x56\xf0\xdd\xaa\xe9\xd0\x18\x9e\x6c\x8d\xe3\x49\xf9\x19\x57\xc7\x2a\x52\x9e\x9f\x7e\x9b\x94\x56\x52\x48\x40\xba\x02\x34\x4f\x55\xad\x3c\x11\xa0\xb2\x59\x90\x14\x39\xf2\x65\x5a\xb9\xf8\xc6\xc8\xe8\xe9\x60\xc0\x57\xd9\xc7\xda\xfe\x42\x5c\x75\xd4\xa3\x3b\x80\x1d\x45\x47\xcd\x05\x51\xa6\x80\x2a\x80\x05\xdd\x72\x42\x47\x64\xdc\xf5\x7e\x4a\xa2\x22\x90\xea\x4f\x5b\xaa\xc5\x1d\x79\x39\xc0\x53\x42\x88\x2e\xe1\x43\x80\xef\x2d\x47\x04\xb4\x19\x49\xb2\x28\x2a\x1e\x1a\x3f\xa7\xdd\xea\x9f\xe8\x3b\x9f\xc5\x1d\x4e\xef\xa2\xeb\xac\x72\x2e\x4c\x0a\x7c\x59\x9b\x69\x25\xf0\x1b\x8a\x20\x66\xdc\x0c\x26\xf9\x21\x96\xf4\xf5\x03\xe8\x87\xc1\xe6\xef\xb0\x93\xf1\x53\x13\x87\xbd\x88\xc6\x91\x99\x7b\x9b\x89\xe3\xcd\xf7\xda\x12\xd3\x73\x41\x83\xa4\xb6\x12\x6b\xe9\xe0\x77\x47\x04\xb5\x29\x65\x9b\x55\x48\xf1\xb8\x75\x12\xcc\x18\x78\xca\x4e\xf5\x59\x90\xb4\x83\xc9\xaf\x6a\xa9\x76\x35\xf4\xf0\x79\x49\x72\x70\x65\xab\xf2\x1e\x21\xe3\x29\x90\xb1\xa7\xd0\x7d\x74\xe0\x2d\x9b\x07\xec\x63\x99\x31\xbf\x9e\x2c\xa3\x94\x1f\x2b\xa6\xb5\xef\x14\xdc\xc2\xa2\x47\xd2\x11\x7e\x9c\xb4\x1e\xfa\x3f\xcc\xa2\x47\x16\x64\x14\x52\xbe\xed\x2f\x92\x65\x7c\x2f\xb7\x31\xf0\xb9\x4e\x8c\x89\x2a\x81\xbb\xa9\x1f\x63\x9d\xf4\x37\x96\xac\xd3\x01\x3a\xc0\x44\xf6\x08"}, -{{0x66,0x59,0x0d,0x36,0x99,0x84,0xc6,0xf5,0xad,0x3a,0x89,0xc7,0x8d,0xdf,0xca,0x10,0xa0,0xa7,0x65,0x79,0x95,0xdc,0x01,0x88,0xb6,0xb5,0x7a,0xc3,0x16,0x47,0x31,0xa4,},{0x98,0x87,0x3a,0xb1,0x33,0x46,0xee,0x48,0x67,0x7c,0x4f,0x86,0x12,0xdb,0x31,0xeb,0xd1,0x3d,0xb5,0x8b,0x2b,0x03,0x4f,0xd1,0x55,0xaf,0xa8,0x72,0x0f,0x4e,0x93,0xe8,},{0xf0,0xdb,0x63,0xa1,0xbc,0x76,0x24,0x16,0x1c,0xa0,0x06,0x38,0x53,0xb2,0xde,0xe4,0x5f,0xcc,0xd2,0x24,0x71,0xe0,0x12,0x36,0x6f,0x86,0x8a,0x4a,0x9c,0x74,0x65,0x4e,0x13,0xf1,0xa3,0x15,0xad,0x83,0x91,0x6e,0xbf,0xb8,0xdc,0x31,0xa4,0x20,0xf8,0x3c,0xf6,0x45,0xc4,0xc9,0xd1,0x6b,0xb4,0xd5,0xd9,0x9d,0x23,0xc7,0xb4,0x3e,0x23,0x00,},"\x2e\xc1\xc6\xb0\x82\x97\x37\x83\x2c\x9c\x79\x8a\x92\xeb\x49\x0b\x23\xd3\x34\xc3\xbb\xe6\x27\xcb\x58\x2d\x17\xa9\xe4\x29\x60\xef\xcd\xc7\xd3\x47\x50\xe0\xb4\xaa\x86\x4c\x20\x4f\xb8\xd6\x2b\x47\x99\x2e\x91\xdb\xfc\xfd\x69\xf5\x1d\x93\x7d\xc0\x6c\x48\xc0\xad\x43\xe8\x59\x83\x71\xcd\x0e\x3b\xbc\xe4\x16\xbf\xd4\x4b\x09\x44\xb9\x93\xaa\x29\x93\xfd\xea\x48\x71\x34\xcd\xe4\x22\x77\x72\x3e\x06\x83\xec\x98\xe6\x95\x95\xe9\xb7\xb1\x4c\x8c\xf9\x61\x7a\x1e\x30\xdd\xb8\x06\x0e\xac\xba\x48\xd8\x82\x53\xb1\x65\x33\x61\x08\xde\x0c\xb0\x2f\xf2\x0f\x54\x24\xb5\x67\x83\x08\x69\xc9\xb4\x32\x9c\x99\x45\xf0\xbf\x2f\x3c\x7a\xcd\x1e\x77\x43\x58\x93\x0c\xd8\x90\xfd\x9c\xb8\x64\xd9\x50\x93\x5a\xd8\xa4\xa3\xbe\xcc\xae\x8f\x83\x3f\x63\x56\x19\x13\x71\xc3\x26\x33\xdc\xf8\x82\x70\x9b\x0d\x98\xbd\x80\x7b\x38\x3a\xed\x8d\x7b\xb0\x97\xb6\xe2\x62\xef\x70\x0c\x9d\x76\x8f\x4b\x56\x90\xe3\xa1\xa8\xf2\x17\x55\xd6\x58\xdb\x2d\x1b\xfd\x2f\x70\x71\xe0\xca\xec\x7c\x2c\x53\x81\xc5\xef\x5c\x2c\x22\x81\xc6\xbc\xed\xc8\x67\x39\x0b\x90\xf3\xb2\x7b\x0f\x0f\x64\xa3\x36\x58\x57\x8a\x5c\x0d\x66\xe2\x11\xe6\xff\xf6\xe8\x64\x88\xac\xf8\x2b\xc0\xf5\xe2\x66\x4b\x83\x69\x90\x46\x03\x7c\x0d\x33\xd3\x40\xff\x98\xed\x62\x63\x35\x4c\x24\x27\x31\x36\xff\x0e\x4f\x0f\x23\x3a\x6c\x82\x54\xfc\x0c\x90\x76\x43\x30\xe3\xb1\x05\x7b\x1e\x66\x6d\x5e\xcd\x5a\x2e\xfe\xaa\x6a\x10\x5b\xfc\x85\x84\x31\xb8\x8e\xd7\xfe\x55\x1e\xb3\x2a\xc0\xaf\x27\xc6\x6a\x98\x03\xa3\xbc\xf8\x76\x34\xc6\x6c\x70\x66\xdd\x01\x97\xa3\xcb\xd2\xd6\xf4\xe6\x5c\xfd\xb8\xf3\xda\xf9\xf3\xca\x5c\x4f\x4e\x0a\xdd\x45\xf5\x54\x1a\xa1\x8d\x04\x1f\x70\x6e\x4f\xa8\x7c\x34\xe9\xa2\x23\xd8\x85\x72\xeb\x50\x08\x3e\xe8\xc7\xc4\x75\xdf\x56\x8b\xc7\x3b\xd0\x8c\x0f\x0d\xea\xa3\x74\xaf\xb1\xc1\x78\xd0\xdd\xdb\x23\x6e\x15\xa8\xbc\x23\x85\xed\x3f\x52\xb8\x76\x1e\x63\x78\x87\x40\x7a\x20\xae\xc3\xe9\x9e\xc8\x30\xda\xe3\x16\x7e\xf0\xcd\xb3\xf3\xff\xd2\x00\xd8\x3b\x75\xb7\x49\x69\x0b\x9e\x25\xe2\x17\x1d\x07\x2c\xa5\x6f\x71\xba\xec\xd2\x1f\x7d\x45\xa1\x2c\x91\xb2\xc0\xfb\x3f\xea\x3b\x15\x8e\x54\x64\x82\x84\xbb\x00\x95\xb3\x62\x44\xb0\xb1\x21\xf9\xf1\x38\x4c\xe9\x00\x43\x65\xe7\x77\x2f\xa3\x08\x28\x25\x0f\x51\x98\x5f\x1b\x17\xb2\xd2\xf8\x0a\x33\xe8\xfc\x6d\x85\x65\xea\x15\xcd\xaa\xcd\x42\xa8\x7b\xd7\xc9\x40\x8b\x1f\xe1\xc7\x70\x66\x5b\xdd\xed\x75\x4b\xc2\xff\x2e\xf9\x1b\x97\x3a\x86\xb9\x9f\x10\x59\xc6\xf2\x27\x24\x6a\x69\x8b\x38\x54\x15\x09\xdd\x54\x49\xfc\xe6\x0d\x38\x62\x24\x18\x3b\x7d\xce\x1b\x38\x84\xf7\xba\xe1\xc2\xe4\xeb\x59\x45\x10\xb5\xca\x58\x52\x79\xd9\x04\x1d\xf8\x81\x7b\x06\x19"}, -{{0x41,0xcf,0x07,0x1f,0x48,0x42,0xec,0xd4,0x94,0x19,0x1b,0x8c,0xf2,0x8c,0xc0,0x92,0x31,0x85,0xef,0x1b,0x07,0x45,0x8a,0x79,0xa5,0x9a,0x29,0x6d,0x35,0x49,0x82,0x2e,},{0x6d,0xc8,0xe4,0x46,0xdb,0x1d,0xa3,0x53,0xb5,0x8d,0x0c,0x45,0xd8,0xb4,0xd8,0x16,0xba,0x59,0xe2,0x5b,0xb6,0x80,0x71,0x2d,0x62,0xd6,0xd3,0xdb,0xf7,0x8d,0x06,0x98,},{0x41,0x05,0x2b,0xc4,0x17,0xb2,0x4d,0xc4,0x83,0x83,0x96,0x6a,0xf0,0x14,0x3f,0x9c,0x0b,0xa8,0x5b,0xbe,0xfb,0xda,0xf7,0x91,0xb1,0x6a,0x4d,0xad,0x1f,0x57,0x0e,0xb8,0x07,0x03,0xc0,0xa2,0xcd,0xeb,0x2f,0x7a,0xd6,0xdc,0xd3,0xfa,0x7b,0xdb,0x5c,0x22,0x5e,0x86,0x9c,0xd8,0xfb,0x27,0x8d,0xff,0x06,0x67,0xd3,0x8a,0xcc,0xf3,0xdb,0x08,},"\xda\xeb\x5f\x0e\x84\xf1\x59\x0b\xca\x2b\x9d\x97\x19\xef\x5d\x1c\xfa\x79\xe0\x58\x34\x46\x33\x2f\x18\xe9\xe4\xfe\xb0\xb1\xf1\x53\x40\x29\x7a\xc9\xad\x67\x24\xc8\x5b\xb1\x65\x58\xea\x54\xeb\x5d\x70\x2a\x47\x24\x8b\xad\xc6\x25\x2a\x80\x43\x71\xb7\x4c\xfe\x10\x62\xd1\xdb\xa1\xec\x68\xfd\x1d\x4d\xd0\x29\xcb\x55\x03\x4b\xbf\x61\x06\x82\x51\xef\xf3\x98\x36\x36\xf6\xde\xbd\x57\x27\xbe\x91\x99\x3b\x3e\x4d\x0a\xbc\x96\xec\x19\x64\x21\xa4\x7b\x78\x93\xf8\x39\x86\xd6\xc0\x32\x3f\x0d\x19\xaa\xf2\xcd\xe9\xd3\x56\x5c\x10\x4c\x9d\x31\x76\xec\xb5\xed\x5e\x17\x3f\xee\x52\xb5\xa0\xc4\x2b\x6a\xb2\xfc\xb1\xcc\xba\x96\x49\xc2\xc6\x7c\x52\x0e\x9b\x96\xce\xa6\x93\xdf\x3e\x58\x60\x9a\xd6\xa0\xbd\x52\x2e\xfa\xaf\x03\x85\x8d\x24\x5d\xd0\xa3\x8f\x84\xa2\xfb\x10\x20\xf4\xdd\x97\xc3\xae\xef\x0e\x24\x47\x7d\x30\xd2\x56\x70\x1e\x90\x0b\xef\x26\xa8\xa6\x26\x9a\xb6\x60\xd7\x42\x93\xa2\xbf\x1d\x20\xc2\xcf\xae\xbb\x7c\x28\x20\xf5\xf5\xb0\x74\x53\xbb\x69\xee\x76\x9b\x52\x39\x15\x39\xf0\xc6\x06\xd2\x2e\xb3\x92\x3e\xe6\xf5\xa1\xd4\x60\x50\xaf\x90\xf0\x11\xf8\x51\xac\xe7\x63\x27\xd3\xd1\x8c\x48\x17\x0a\x9a\x25\xb0\x4b\x77\x0f\xd9\x38\xef\x8a\x30\xb7\xbd\x03\x39\x1d\xd3\x6c\x51\x6b\x62\xf0\xcb\x78\x67\x07\x40\xe0\x0e\x69\x59\x5c\x41\x8d\x96\x72\x53\x82\x0b\x75\x4c\x4f\xd6\x66\xe3\xcc\xe1\x6e\xe0\xc9\x41\x83\xbb\xea\x70\x6f\xe2\x98\xe1\xc9\x9d\xdb\x82\x12\x17\xed\x90\x08\xcc\x8e\x8b\x83\xbc\x8b\x81\x99\x15\xb0\x7b\x14\x6f\xe7\x45\x02\x4a\xc3\xc4\x61\x16\xcb\x4c\xce\x5e\x32\xec\x5d\x75\x24\xa2\x38\x8d\x9f\xe2\x97\xeb\x02\x81\x1a\xf4\x54\x6f\xcd\x58\x60\xe1\x4c\x0d\x13\xf0\x3d\xd7\x5a\x42\x49\x61\x59\x00\x07\x8a\x3c\x35\x8c\x53\x42\x96\x2b\xc1\xbe\xac\xf6\x8c\x24\x68\x21\xa4\x59\xab\x53\x21\xec\x9f\x57\x4f\x49\xd1\x03\x89\xf4\x0f\x14\xdd\xfc\x85\x13\xff\xe3\xde\xaa\x73\x36\x03\x5a\x67\x5f\xa5\x85\x8b\x49\x0c\x5d\x24\x77\x80\x06\x4a\xdb\xaf\x75\xa7\x63\x35\xee\xc9\xab\x91\x87\x71\xb0\xb1\xdf\x51\x47\x64\x2a\xef\x4a\x16\x6a\xb1\x72\xed\x60\x1f\xed\x21\x0f\x6c\x0c\xff\xd9\x18\x69\xf7\x49\x0b\x57\xe7\xc6\x52\x41\x86\x3e\x7e\x8c\x0a\x26\xeb\xa6\x3b\x53\x42\xd0\xfd\x82\x14\xac\x73\x1e\x1c\x43\x8d\x01\x77\x11\x5f\x6a\x19\xe0\x93\x5c\x7a\xf6\xbc\x7d\xbe\xb7\x55\x11\xd9\xbd\x8e\x63\xe3\xe2\xf4\x7a\xb0\xdd\x1c\xed\xd7\xb1\x80\xd7\x4a\x4b\x44\xd4\x61\x19\x7a\xef\xdd\x36\x20\x46\x51\x66\xa3\x9b\x45\x39\x50\x43\xce\x88\x74\xcd\xd7\x2c\x60\x2b\xd3\xd2\xee\xcb\xad\x34\x66\xb5\xcb\x1a\xa4\x1a\xe9\x2a\x8a\xfe\xf2\xd7\x64\xce\xc0\xc4\x49\xd2\x7e\xfa\xc4\x37\x93\x8f\x28\x0b\xea\x9c\x50\xa5\x82\xe5\x7c\x27\xf9\xb3\xde\x87\x2f\x0c"}, -{{0xa2,0xc8,0xe1,0x61,0xa8,0xd9,0xd6,0xe8,0x88,0xc3,0xd0,0x9b,0x0b,0x97,0x27,0x37,0x30,0x7a,0x2c,0xbd,0x2a,0xcd,0x7c,0xcd,0x80,0x4d,0x24,0x31,0xac,0x6c,0x58,0xd2,},{0x3a,0x32,0x57,0x75,0x88,0x67,0x32,0xde,0xca,0x40,0x68,0x57,0xa8,0x05,0x60,0x10,0xaa,0xea,0x28,0x75,0x54,0x5b,0xa6,0xf3,0xdf,0x30,0x75,0x45,0x71,0x38,0x69,0x92,},{0x56,0x0d,0x01,0xb9,0x4d,0xf1,0x1d,0x83,0x34,0x77,0x52,0xff,0x51,0xb3,0x54,0x5e,0xf5,0x5c,0x56,0x32,0xae,0x7c,0x8e,0xfb,0x11,0xaa,0xdd,0x83,0x12,0xde,0xf7,0x25,0x62,0xe8,0xf5,0xd7,0x5e,0xce,0x10,0xad,0x46,0xbc,0x96,0xc8,0x60,0xde,0xec,0xe3,0x9e,0x63,0x4a,0x5f,0x50,0x65,0x4d,0x4c,0xdb,0xa8,0x4a,0x8e,0x6f,0x70,0x24,0x0a,},"\x83\xa3\xbe\xbc\xac\x5f\x28\xc5\x43\x3e\x3c\x4f\x1e\x7b\xf5\xd2\xe4\xdc\xd2\xf5\xe5\x9d\xbe\xe0\xa8\x3b\x07\x02\x57\x15\x35\x07\x46\xf8\x56\x75\xf1\xdf\xea\x37\x4a\xa7\xd7\x94\x28\x7b\x89\x2e\xf9\x09\x7f\xf6\xd2\xe1\x22\xf0\xa6\x56\xfb\xa0\x79\x8c\xdc\xfc\xb3\x64\x5d\xfc\xfd\x78\x8c\x74\x0c\x0f\xd0\x45\x20\xe7\xa0\x6a\x02\xa0\x58\x29\x63\x0a\x2b\xf0\xcd\xfe\x2e\xcc\xa0\x09\xec\x44\x04\x99\x46\xbb\x1d\x23\x26\xdd\xd6\x1d\x7e\xc6\x40\xbf\x69\xeb\x44\xfb\x23\xcc\x1f\xf4\x78\xc5\x70\xc7\x5d\xb7\xe7\x66\xe3\x5b\x7c\x43\xdb\x73\x68\x0d\x14\x07\xa9\x43\x99\xfb\x62\x1b\xaf\x38\x45\x74\x5c\x1c\x4e\xd0\xb9\xf0\xb4\x85\xbe\x2d\x53\xc5\x68\x54\x5d\xdf\x18\x77\x5a\x83\x7a\x05\xd9\xc9\x15\x7b\x08\x4e\x8c\xd0\x1f\xc3\x24\xf0\x7f\x11\x68\x77\xe4\x07\x5d\xba\x24\x32\xc8\xa7\x75\x2e\x9e\x93\x95\x86\xad\x93\xf0\xc0\xaa\x5e\xda\xc9\x4b\x8d\x82\xe5\x44\x99\x97\xb1\x5b\x8c\x89\x61\x58\x9c\x44\x28\x21\xaa\x83\xb6\x02\x39\xec\x5f\x15\x8c\x3f\x5e\x9e\xc5\xbe\xa5\x11\x5d\x5f\xed\x61\x91\x8e\x8f\xcd\x5b\xce\x61\xc7\x77\xf2\x0b\x6b\xfe\x80\x3a\x69\xc6\xfc\x79\x4a\xb8\xc5\x7d\xf2\x71\xda\x86\x38\x72\xa6\x13\x35\xb1\xfa\x29\xf4\x60\x8f\xf0\x37\xf7\x12\x06\x98\x09\xca\x64\x2a\x03\x07\xc7\x9a\xa9\x2e\x10\xcb\x89\x3a\x29\xd1\x72\x01\xa0\xb6\xd1\xb4\x6a\x72\x12\xb3\xba\xec\x97\x03\xc0\xb0\x39\x2b\xa6\xb7\x6e\x5c\x9c\x10\xf8\x35\x99\xb8\x1e\xa2\x22\x83\xf9\x54\x7a\xac\xda\xa7\xf3\x08\x96\xd1\xff\x73\x1e\x11\xfb\x9e\x56\xad\x06\x03\x04\x17\x11\x98\x05\xba\xb6\x35\x21\x49\x6c\x3b\xb9\x2a\x12\xf5\xe5\x5a\xfc\xf6\x0e\xd4\x21\x77\x37\xf3\x04\x6b\x16\xca\x50\x66\x57\xa6\xd6\x96\xd7\x5a\x6d\x8e\x18\xe9\xef\xe2\xb0\x8c\x8b\x1f\xa0\x72\x82\x38\xe2\x7c\xfb\x32\x21\x66\xee\xe4\xee\x76\x96\x8b\x77\x7b\x50\xee\x6a\x2b\x80\x4e\x1e\x9b\x46\x01\x66\x20\x13\x2b\x65\x88\x71\x8d\x97\x8c\xa2\xc0\x02\x69\x79\xc4\x00\xd3\xc5\x33\x67\x51\x21\x0f\x0b\x00\xd2\x69\xec\x8f\x4e\x2f\x95\x59\xe1\x80\x33\x2d\xd2\x70\xe5\x0c\xc9\x46\x5c\x55\x58\x93\x63\x55\x52\x1b\xc3\xc9\x56\x0f\xc1\x9e\xc1\x42\x42\x12\x1e\x6b\xb2\xff\xf8\xf5\x03\x37\xfc\x26\x4a\xcf\x1a\xc1\x70\x43\x28\x33\x4b\x3b\x52\xcb\xa9\x6d\x93\x03\xb1\xb5\xdb\x85\x9d\xae\x31\xd8\x0f\x17\x11\xfb\xa2\x51\xe1\x0b\x4d\x12\x21\x28\xf9\xfa\xff\x68\x72\xd0\xc0\xb8\x1e\xef\x59\x54\x1f\x83\x2b\x0a\x9d\xf3\xa4\xcd\xd5\x91\xc8\x77\x36\xb1\xae\xcf\x24\x2c\x27\x5a\x10\xc3\xfd\x67\x83\x9d\xad\x4e\xf3\x99\xb9\x49\x4e\xcd\x77\xf7\xba\x5b\x5d\x4f\x2c\xa3\x04\xe5\xb2\x29\x21\x30\x7c\xb1\x8f\xa6\x4a\xa3\xd0\x1c\x44\x11\xc8\x36\x9c\xce\xde\x46\x5e\xe3\x69\xee\x63\x7d\x43\xd2\x88\x26\xbf\x60\xdd\xde"}, -{{0xd3,0xd1,0x88,0xb3,0x90,0xba,0xcc,0xd9,0x50,0x24,0x52,0x61,0x46,0xb8,0x2b,0x91,0x84,0xe1,0x97,0xe4,0x6a,0x93,0x40,0xa0,0xe6,0xec,0x18,0xbf,0x75,0xbe,0x7f,0xc5,},{0xd8,0xf7,0x94,0x94,0x8a,0xa6,0x98,0x61,0x00,0x21,0x4e,0x9b,0x7b,0x90,0x24,0x42,0x08,0x06,0xb4,0xc6,0x78,0x46,0xd5,0xbd,0x50,0x61,0x13,0xb3,0x53,0xa2,0xea,0x3d,},{0x16,0x97,0x6b,0x26,0x7d,0xe9,0x6e,0x38,0xdd,0xdc,0x84,0x78,0x07,0x5f,0x6b,0xdd,0x71,0x59,0xe5,0x63,0x34,0xb2,0xd2,0xd1,0x92,0x09,0x46,0x29,0x4f,0x33,0xcd,0x6b,0x7f,0x9c,0x50,0xf8,0x05,0x7f,0x49,0x6c,0xab,0x5d,0x94,0xbb,0x4d,0xca,0x26,0x2f,0x9f,0x0f,0xdf,0x9b,0x1b,0x64,0x74,0x1f,0x4b,0x72,0x2d,0x32,0xef,0xa8,0x22,0x03,},"\x5e\x65\x65\x8e\x42\x03\x75\x43\x3f\xd7\xc1\xf6\xbe\x67\x88\x41\xe5\x81\x04\xf1\x0b\x4c\x67\x63\x59\xd8\x4f\xce\x79\x92\xf5\xc5\x75\x57\xd7\x38\xf8\x30\xb5\x05\xfa\x0c\x2b\x9e\xab\xf8\xd1\xa9\xf8\x1f\xe8\xf3\x15\xd6\x62\xe2\xb8\x4c\xe9\x52\x99\xeb\xf4\xe5\x03\xb5\xe1\xf7\xf8\xcd\xb6\x68\xae\x73\x3f\x3d\x0c\xdd\x4c\x74\x2a\xb5\xf2\x72\xbe\xa4\xf1\x8d\x18\x3e\x89\x23\x84\x76\x62\xf9\xa3\x9c\xd4\xb1\x4e\xc7\x6d\x11\x03\x2f\xe5\x73\xc2\x62\x01\xae\xf6\x66\x01\xce\xc6\x83\xe3\x4b\x89\xaf\xd9\x64\xe9\x87\x80\x1c\x70\x6a\x85\xe2\x7b\xab\x33\x70\x1c\xd1\x09\xbc\xf0\x7b\x27\xca\x67\xf0\x22\xc4\x94\xa0\x4c\xbe\x5a\x9c\x6d\x63\xaa\xd9\x36\xcd\xf1\xa1\x80\xfd\x05\x86\x51\x98\xb9\x6f\x06\xa7\x8d\xa9\x57\x99\xd3\xaa\x4d\xf3\xb1\x70\x03\x3c\x69\xe8\xfb\x04\x28\x8c\x35\x46\x55\x3b\x57\x9c\x0a\xe3\x93\x80\x62\xd3\xd8\x42\x1c\xfa\x66\x26\x85\x29\xbe\xc0\x27\x1e\x53\xb4\xee\x7d\x09\x9e\x71\x48\xa8\x02\xdf\x80\xfe\x5e\xed\xee\x1c\x90\x3a\xe8\xed\x4d\x64\x0e\xad\x76\x12\x62\xdd\x40\x14\xf2\x5f\x93\x97\xba\x3f\x1c\x08\xd8\x3a\x3c\x48\x5c\xfb\x55\xf8\x99\x19\xaa\x97\x2d\x6b\x7e\x77\x11\xbe\x9e\x30\xc1\xeb\x96\xa0\xc3\x84\x53\x09\xfb\x23\xdb\xc7\x5b\x69\x91\xdd\x6e\x48\xcd\xde\x90\xe0\x4f\x22\x8e\x8c\xcf\x3b\xa2\x3f\x27\x47\xcf\xb9\xd3\x38\x1a\x93\x05\xf8\x16\xf2\x6c\xdd\xe4\x1c\x02\x20\xfa\xd2\x28\xff\x6a\x8b\x09\x5c\x77\xb6\xba\xe8\xfa\x33\x68\x14\x27\x24\xbf\x1f\x5e\x0f\x6f\xbc\xa5\x32\x0c\x21\x5b\x6b\xa8\x6b\x91\xe3\xa8\xac\xf7\x50\xe9\x3f\xa7\xea\xa6\x5c\x4f\x78\x5e\xf8\x42\x1a\x19\xc1\xe2\x7b\xc2\x4b\x42\x8e\x08\xa9\x02\x42\xab\xac\x9b\xd4\xaa\x03\xc6\x56\xf8\xf4\x6d\xc4\x0b\x36\x15\x2c\x1b\xd0\xde\xf1\xac\xfc\x0d\xa1\x0a\x2f\xa1\xdc\x3d\xa7\xac\xe5\xa8\xfd\x76\x22\x7b\xb1\xa6\x02\x39\x0f\xe5\x7a\xfd\x32\xef\xe2\x81\xf2\xea\x6b\x2e\x4d\x25\x45\xcb\x88\xd2\x30\x8d\x72\x69\x1c\x9a\x52\xb4\xca\x25\x23\x1a\x01\x07\xf2\x5d\x11\x7c\xc9\x35\x39\x76\x21\xc6\x83\xbd\xc8\xf2\x2e\x81\x03\x40\xf2\xcb\xac\x4c\xea\xa3\x46\x86\x65\x26\x18\x79\xf0\x07\x42\x00\x74\x3e\x0d\xe5\xf3\xe5\x83\x08\xb9\x8b\x04\xb8\xc7\x14\x8a\x4e\x00\x4e\x66\x7e\x83\x2b\x00\x84\xb5\xf2\xbd\xc6\xfd\xc9\x59\xf2\xfc\x28\xa8\xd3\x1d\x9a\x9e\x78\xe5\xd5\xf9\xc0\xb1\x19\xe5\xff\x1f\x68\xf7\xc0\xda\xf0\xc0\xf1\x69\x47\xcc\xa5\xb7\xce\xd0\x96\x01\xe2\xeb\xed\x28\x2e\xf2\xbf\x8f\xe9\xa2\x7e\xd2\x7f\xc5\xbc\xda\x8a\xed\x6c\x71\xbe\xe3\xe7\x75\x10\x04\x47\x26\x89\xbb\xf6\xd9\xd0\x79\x52\xa2\x42\xff\x87\x0d\x7c\x3f\x5e\x1f\xfc\x2c\x1f\x40\xfc\x9a\xb7\x57\x9b\x39\x2b\x55\x4f\x3d\xc5\x88\xc0\x3a\xb9\x57\x43\x1f\xe5\xd0\x2c\xbc\x71\x1a\xd4\x89\xfe"}, -{{0x61,0x91,0x7a,0x97,0x5c,0xb7,0xec,0x56,0x4c,0x70,0x8a,0x56,0x53,0x88,0xc5,0x72,0x36,0xa6,0x6b,0x69,0x7d,0xcd,0x5a,0x7f,0x10,0xba,0xe6,0x71,0x57,0x2a,0xc7,0xf0,},{0xec,0xc0,0xf0,0xb9,0x92,0x76,0xe5,0x28,0xf8,0x2b,0x42,0xf2,0xef,0xce,0x85,0x79,0xf8,0x3e,0x63,0x8c,0x6a,0xce,0xfd,0x07,0x28,0x28,0xc0,0x4e,0x43,0x4f,0x55,0xaf,},{0x6a,0xbb,0x3e,0x37,0x7b,0x5c,0x80,0xb7,0x4f,0x77,0x21,0x9c,0x1a,0x9e,0x09,0x6f,0xba,0x0e,0xb6,0x89,0x90,0x81,0x7a,0xcf,0xf1,0x2d,0xba,0x7f,0x61,0xc7,0x7c,0xcf,0x59,0x5f,0xb6,0x60,0x85,0x52,0x00,0x3c,0xea,0xd0,0x6c,0xa1,0x31,0x7c,0x9c,0xd5,0x1a,0xc4,0x72,0x4b,0x29,0xf4,0x09,0x21,0xfb,0x92,0x84,0x33,0x76,0x87,0x64,0x01,},"\x6e\x97\x0e\x0b\x1c\x92\xa7\xf4\x96\xa8\x2d\x8a\xe8\x0c\xfd\x0c\xce\xf1\xd2\xc7\x99\xd4\x17\x28\xf3\x5d\xdc\xd6\x03\xb4\x21\xc2\xa5\xab\x3b\x48\x9e\x78\xf4\xb6\x22\x97\xde\x43\x7c\x5a\xd1\xa9\x68\x3f\xf8\x7f\xa2\x8e\xb3\xcc\x38\xce\x24\x2a\xf5\x94\x19\xf9\xfd\x43\xfc\xaa\x54\xfc\x39\x89\x92\xf8\xc8\xe3\x1f\x2b\x33\xdc\xcc\xd0\xee\x11\xba\x7b\x38\x8e\x8d\x2a\x36\xea\xd0\x67\xc6\xbe\xce\xd5\x89\x0a\xb7\xd4\xa9\x4f\x55\xda\xb9\x21\x28\xa0\xf8\x14\xc0\xe6\x89\x71\xdf\x57\xbd\x50\x78\xa7\x40\x31\x75\xc7\xc2\xfd\xd4\xa5\x24\x47\x15\x3a\xb3\x74\x56\x72\x9a\xee\x33\xe5\xfc\x93\xdb\x8e\x7f\x48\x03\x09\x87\x5e\xcf\x6d\xb0\x7c\xe7\xf3\xca\xc5\xde\x49\xe3\x61\x27\x5c\xa5\x0b\x6b\x71\x9f\x4b\x71\x5b\x3e\x30\x86\x3c\xbb\x3b\x71\x64\xba\x9e\xb9\x6e\xf3\x30\x4b\x19\xad\x4d\x74\xdc\xe4\xbd\x25\xe7\x7b\xbb\xbe\xff\x1e\xe7\xd1\xfb\x55\xb9\xc4\xf7\xfc\x4c\xd9\xbd\x55\x10\x8a\xfc\xf9\x9c\x1a\x41\xcd\x6f\x6b\x1a\xdb\x29\x7b\x10\x6c\x8b\xa2\x4e\x31\x34\xf8\x7d\xd8\xef\xe5\xcf\x85\x49\x22\x91\xb9\x4d\x66\x00\x95\x8c\x28\xb9\x12\x2f\xe6\xe0\x1b\xd3\xe3\x29\xe4\x2d\x19\x26\xb8\x9f\x7a\x8c\x40\xa4\x98\x67\xe5\xaa\x3a\xd7\x49\xbd\x98\xda\xe7\xd0\x06\xb4\x53\x60\x9e\x7d\xae\x26\x36\x4d\x91\x72\xbe\x72\x83\x33\x01\x21\xed\x2b\x40\x27\xe0\x88\x51\x18\x74\x3a\x6e\xa0\xcb\x7d\xc2\x74\x09\xa9\xb2\x82\x0b\xcc\x24\x2e\xa1\x0a\x00\x93\x7b\xf8\x49\x20\x1e\x0f\xb6\x19\x94\x21\xf1\x63\xe9\x79\x4f\x2d\xd4\xb3\x32\x01\x4a\x09\xd3\xee\x80\x71\xda\x78\x77\x47\xf9\x90\xf5\x17\x99\x19\x02\x7d\xdf\xf7\xca\xb0\xf5\x5e\x9a\xfa\x8e\xcc\xb1\x6c\xc2\xdd\x3c\xbb\xea\xd7\xff\x7e\xc8\x18\xc2\x53\x39\x3f\x74\x87\x41\xf5\x54\x07\xf7\x40\x8e\xe3\x3a\x42\xae\x2d\x6e\xcb\x3f\xb6\x00\xa7\x1f\x30\xab\x63\x06\x06\xe5\x53\xb4\x36\x78\xe5\x98\x54\xf3\xa2\x94\x7b\xcf\x4e\xa0\xfc\xfe\xdc\x31\x4d\x83\x70\xd1\x26\x63\x95\xfd\xa3\xc9\x10\x5e\x97\x59\x52\xf6\x0e\x30\x86\xbb\x82\x48\x15\x13\xd6\xfe\x8a\xdb\x4f\x95\xef\xb9\xa9\x5b\x66\xd4\x80\xd2\xbb\x17\x10\x78\xcf\x40\x68\x4a\xc6\x9a\x78\x9c\x7f\xb7\xfa\x42\x53\x33\xd7\x05\xdb\x00\x06\x67\x55\xdf\x72\x8d\xe0\x2d\xf2\x5b\xae\x34\xf1\xd7\xd4\x9c\xaf\xfc\x51\xe9\xba\x2b\x10\xb9\x8f\xe4\xcd\x9d\x22\xb7\x76\x4e\xd9\x31\xed\xb5\xf0\xb5\x54\x49\x6e\x99\x53\x91\xe0\xaf\x0b\x8d\x1c\x7a\x82\x95\xa8\xd1\x5a\x7c\x65\x56\xd2\x9c\xb1\x9e\x08\x55\xca\x50\x5a\xd0\x1d\x2a\xa3\x09\x28\xa8\x4b\xc4\x89\x59\x57\x6d\x81\x2d\x9b\x27\xb8\xe8\x88\x79\xfa\xa2\x80\x6c\x08\x41\x36\x0e\xcd\x0f\xe8\x3f\x5b\x84\x8f\xc1\x2f\x65\x8f\x1e\x7f\x40\xe5\x61\xc2\xe7\x8d\x3b\x01\x25\x21\x0a\x92\x06\x1c\x2d\xb2\x1b\xa6\x60\xe8\x60\x8f\xf5"}, -{{0x7b,0xa2,0x5f,0x27,0x97,0xa2,0x83,0x6f,0x37,0x9d,0x6b,0xbc,0xbe,0x9a,0xbf,0x4f,0x2d,0xef,0x5e,0x52,0xf7,0x2b,0xd9,0xe0,0xb0,0x06,0x57,0x10,0x22,0xfa,0xc2,0xf3,},{0x6c,0x2e,0xd4,0xe8,0xc0,0x12,0x4d,0x5d,0x05,0x40,0x79,0x6d,0x39,0x45,0xd1,0xde,0x71,0xaa,0x69,0x69,0xe6,0xab,0xea,0x0f,0x1b,0x0e,0x6f,0xc4,0x29,0xc7,0x04,0x6f,},{0xf1,0xf5,0x90,0xa9,0x07,0xba,0x98,0x0e,0xb0,0xd6,0x48,0xab,0x4d,0xed,0x5f,0x92,0xfa,0xf7,0xcb,0x85,0x1d,0x81,0xd8,0x58,0xa7,0x8f,0xa6,0xb7,0x7c,0xbb,0xe1,0x2f,0x64,0xd2,0x0d,0xf5,0x27,0x71,0xa7,0xd5,0xe5,0x39,0xa1,0x52,0xd7,0x31,0xe1,0x90,0x3d,0x42,0x11,0xfd,0xcf,0xef,0x9a,0x48,0xb4,0x6c,0x8f,0xd5,0x39,0x4c,0xa0,0x09,},"\x17\x1a\x34\x09\x87\x80\x97\xb3\xb2\x2b\x2c\x00\x66\x0b\x46\xe5\x42\xc2\x16\x4c\x00\xbb\xee\x54\x55\x48\x37\x94\x0e\x70\xf0\x3d\xa9\x91\x6a\x40\xf9\xbd\xe8\x28\x8f\x45\xe4\x7b\xef\x7f\xfe\x4e\x55\x7c\xd4\x47\x40\x45\xe7\x40\xfd\x95\x9d\x98\x4f\x4e\xc8\x1d\xa8\x8d\x44\xa3\x73\xc1\xed\xa0\xcf\xc6\xb0\x8e\x35\x13\x73\xd3\xb8\x2a\xb0\x90\x2d\xf8\x06\x3f\xd9\x08\xe7\x03\xe0\xcb\xec\x41\x0a\xb5\xcd\xfe\xaa\xe0\x01\x88\xce\x2a\xd4\x2b\x8b\xf0\x4f\x7d\xaa\x5f\x0e\xe3\x33\xa6\xf9\x31\x1b\x4a\xd9\x81\x09\x52\xd5\xd5\xa6\x4b\x20\xf3\x7e\x84\x54\x15\xfc\x3c\xdd\x61\x6f\xeb\xec\x50\xdb\x29\x6f\xb3\xf3\xbb\x7f\x6b\x36\x6b\xbe\x52\xe4\x89\x7a\x05\x61\x7b\xf7\xc9\x81\xa6\x2e\xdc\xbb\xbe\x5d\xa4\xc3\x9c\xaf\xa8\x69\xaa\x2b\x27\x34\xe6\xcf\xed\x90\xed\x8b\xe7\x59\x49\x39\x0e\xe4\x45\x66\x89\x24\x55\xb8\x90\xcf\x56\x8b\x94\x5a\xab\xb7\x58\xd3\x85\x4b\xe6\x53\x9f\x3b\x86\xbf\x01\xd1\x88\xe4\x8c\xf2\x62\x6a\x0d\x7d\x38\x17\x03\xbe\x6e\xd1\x29\x0d\xfb\x94\x7b\xc2\xe0\xf8\x3d\xbc\x58\x70\x30\x80\xd7\xf5\xb9\xef\x19\xae\xf9\x30\x90\x8f\x68\xf0\xc8\x00\x10\xa9\x40\x1b\x30\x3a\x9f\x6d\xa8\x05\xbb\x8a\x0e\xd0\xf3\x94\x13\xee\xfe\xdf\x91\x9f\xfd\x8e\xa6\x39\x1b\xf9\x5d\x42\x29\x60\x4e\x49\x45\x7b\x8e\x23\xbe\xc6\x11\x48\x4c\xc7\xf9\x83\x2d\xd9\x5b\xdc\x3a\xd1\x77\xc0\x50\xf4\xab\x63\x3d\xcd\xb3\xe6\x91\xf5\x90\x28\x73\xb3\x8c\xb0\x72\x0b\x91\x13\x35\x7f\xe0\xcf\xb9\x8a\x68\xcc\xcb\x5d\x5f\x08\x09\xd5\x9a\x37\x5c\xf7\xb5\xa2\x75\xd4\x3c\x4c\x34\xff\x68\xe4\x48\x52\x6e\x8e\x1a\xad\x44\xe2\x00\x08\xa2\x32\xaf\xbc\xf5\x32\xa4\x2b\x50\xa0\x25\xa1\xb2\xee\x4e\x07\x7e\xb0\x12\x5a\x59\x3d\x51\xa2\x00\xec\x20\xd8\x72\xc0\x58\x38\xad\x36\xaa\xae\xec\xcc\x3e\xd9\xef\x41\xf6\xd1\x22\x67\x02\x17\xd5\xc0\x8f\x6e\x13\xc1\x72\x19\x45\x89\xac\xc3\xc5\x9f\x7e\xf7\x90\xc7\xc8\x5a\xa6\xd5\xeb\x69\xd4\xc8\x9a\x72\xf5\xe7\xc9\x24\x69\x85\xc1\xac\x0c\x5d\x19\x7f\x76\xa7\x3e\x37\x74\x83\x9d\x4a\xa2\x09\x6a\xca\x19\x0a\x30\xf4\xaa\xc5\x40\x57\xb6\x4f\x35\x8e\x0e\x06\x40\x0c\x0d\xf2\xf8\x76\x41\x2d\x34\x48\x4c\x43\x44\xf4\xd7\xc8\x66\x51\x7d\x3e\xfb\xa4\xa9\x0f\xa7\x14\x4c\x9b\xa5\xdb\x33\x61\xdb\x57\x69\x40\x3e\xc8\x16\x26\xa5\x11\xf9\x3e\x30\xf8\x58\x6e\xad\xfc\xaf\xd9\xa3\x6e\xcf\xf8\xd2\x4b\x42\x07\x9a\xda\x8e\x57\x9a\xc3\x08\x51\x17\x7b\xce\x90\x38\xb0\xe1\x30\x00\x72\xd6\x8e\xfd\xd7\x23\xf6\x35\x50\x64\x84\x32\x75\x81\x5a\x66\xb9\xd7\x3a\x12\x99\xaa\x59\xa1\x81\x2f\x64\x52\xfb\x41\x15\xea\x2b\x1f\x9f\xf4\xa9\x96\x90\x59\x6e\x3f\x20\x22\xd8\x1e\xd8\x74\xdd\x67\xe6\x18\x9c\xa0\xe6\x8b\x93\x04\xe9\x93\xa9\x5b\x66\x66\x5e\x0d\x07\x4c"}, -{{0xd1,0xe1,0xb2,0x2d,0xe5,0xe0,0x4c,0x9b,0xe4,0x65,0x1d,0xd7,0x39,0x95,0xa3,0x66,0x6c,0xb5,0x35,0x2c,0x65,0xac,0x7b,0x70,0x51,0xb3,0x66,0xfe,0x1a,0xc0,0xc3,0x10,},{0x12,0xfe,0x56,0xf1,0x01,0x2d,0x5c,0x12,0xf1,0x35,0xed,0x59,0x82,0xf3,0x82,0xae,0x5f,0x11,0x43,0xbc,0x90,0xe8,0xcb,0x8c,0x93,0x05,0x17,0x54,0x55,0x1e,0xe9,0x0a,},{0xab,0xaa,0xb4,0xfa,0x6a,0xeb,0x0a,0x0b,0x34,0xee,0x0d,0x61,0x3a,0x0a,0xf0,0x49,0xed,0xb4,0xce,0xdb,0xfe,0x9d,0x3b,0xeb,0xe9,0xc0,0x06,0x18,0xb1,0x15,0xb9,0xd1,0xfa,0x52,0x4e,0xc3,0x49,0x5e,0x13,0x30,0xb0,0x93,0x61,0x81,0xea,0xbb,0x14,0x29,0x9f,0xac,0xcc,0x40,0xea,0xa8,0xcc,0xa5,0x7e,0xd3,0x24,0xb7,0xa6,0x42,0x0c,0x0e,},"\xc7\xf2\x18\xb5\xaa\x7a\xae\x17\x99\x62\x5a\x56\xc4\xd7\xd7\xb0\x26\x37\xe5\x72\xf1\x41\x1a\x61\x22\xf1\x13\x79\x1a\xa3\xc6\x28\xe8\x19\x60\x2f\xb4\xf0\x33\x5a\x61\x23\x01\x3f\xa6\x4e\x9f\xdc\x4e\x4a\xe4\x97\xbd\x16\x9c\x2f\xa7\x7b\xc2\x36\x12\x97\x17\xf4\x62\x88\x6b\x41\x08\x93\xfa\x78\x09\xcb\xfd\xc8\x92\x22\x3b\x40\xee\x04\x1e\xbd\x4e\xc7\xdd\xab\x55\xbe\x60\x81\xa1\x64\x66\x43\xa9\x12\x0b\xaa\x46\x28\x9a\xcb\xa1\x5b\x3b\x48\xaf\x3b\x7a\xde\xcd\x69\xf4\x3e\xed\xe7\x9d\x9b\x19\x57\xe1\xd8\xc3\x12\x9e\x0f\xa0\x57\x9d\x3d\x39\x53\x70\x46\x1b\x0e\x12\x55\xc9\xca\xa9\x4e\x47\x25\x60\x1c\xb9\xd0\xe2\xd6\x02\x44\xd1\x5b\x64\xe1\xf7\xbc\x90\x15\x59\x0a\xd0\x99\x1f\x12\xf8\x26\x73\x11\x20\x6e\x9e\xb5\xd1\x6a\xdd\x0b\xa5\x21\x8f\xce\x5f\xff\xe1\xc9\xce\x5f\xfe\x1f\x73\x11\x32\xf4\xb1\x2c\xac\xb0\x2f\x97\x45\x17\x10\x84\x6b\x7f\x82\x4f\x4f\xa9\xe0\x89\x19\x26\x64\x69\x78\x9c\x00\xce\x0d\x94\xd3\x8f\xa8\xfe\xc3\xf5\x1f\x2f\x88\x6e\x9d\xb0\x9b\x80\x44\x70\xb1\x9e\xc9\xe8\x06\x63\xf1\x55\xb4\x98\x4d\x2b\xbd\x0b\x2c\xe9\x93\x02\xe0\x6c\x64\x44\x4b\x69\x6e\x31\x29\xfc\xef\x34\xc3\xdd\x00\xf7\xab\x5b\xed\xa7\x47\xa3\xfc\x63\x39\x19\x2b\x74\x0f\x35\x69\xb6\x7d\xbd\x6f\xfa\x39\xe2\x71\xfa\xa4\x00\xd9\x61\x6b\xff\x86\xec\x49\xa6\x59\xde\xf2\xe7\xf5\xd4\x51\xf2\xa2\xb3\x5e\x66\x2a\x6e\x7c\xc2\x2f\x1e\x5c\xdc\xde\x8a\x59\x98\x81\x35\xb7\xe7\x65\x62\x74\x3c\x1e\x6a\x09\x99\x01\xb3\xef\x97\xcb\xff\x23\xf2\x09\xbd\x70\x88\xc2\xf0\x32\x45\x27\x9a\x1d\xc7\x8d\xdd\xc1\xbb\x0c\x1d\x35\x10\x03\x57\x88\x21\x26\xb3\x28\xd3\xd9\x4e\x08\x71\xb6\x0b\xe2\x53\xfd\x1b\x6e\xcf\x03\xc1\xdb\x73\x1d\x9e\xed\x0e\xdf\x2b\x26\x43\x23\x07\x80\xa4\xd6\x6e\x99\x17\x9a\xad\x1b\x82\x40\x2e\x55\xf6\xd7\x85\xeb\xc8\x0f\x8d\xd2\xfd\x2b\xeb\x09\xf3\x10\x35\xdf\x62\xc1\x7f\x42\x8e\xd0\xb2\xd5\x65\x08\xdb\x31\xe6\xd2\xdd\x5f\xb6\x9e\xbe\xee\xa3\x25\x70\x70\xcf\x2f\xe6\x7d\x42\xd2\x88\x16\xa5\x5d\xba\xe0\xb1\x85\xdb\x44\x21\xbb\xfd\xae\xfc\x79\xc0\x8c\xdc\x1a\xcc\xf7\x16\x42\x56\x2e\xc7\x00\x36\xda\x2b\xba\xfa\x4a\x89\x19\x54\xc4\xee\x40\x49\xb5\x5c\x64\x0e\x91\x93\x0e\x39\xe3\xef\x10\x18\xdc\x16\x47\xf2\x69\x42\xc6\xdb\xdf\x4d\x56\xe4\x1e\xb2\xc8\x98\xc8\x21\xfa\xc1\x7c\xc2\x73\xe8\xe4\xaa\x56\x08\xa8\x12\xcf\x4b\x82\xf9\x60\x19\xc2\x52\xd5\x6e\x78\x05\x29\x8c\xcb\xe8\xce\x40\xb0\xbd\x0f\x93\x3b\x88\x4c\x0f\xaf\x97\xa9\x58\xb2\x04\x08\xb8\xa5\x29\x7c\xce\x55\x27\xb2\xca\x21\x28\x06\xe7\x2a\x32\x64\x45\x7a\x7f\xac\x86\x62\xb8\x2c\xa2\x33\xe1\xc7\x75\x8d\xc6\xe4\xf1\xb9\x99\x58\x63\xf2\x5f\x74\x7b\xce\xe4\x3b\x63\x9b\x1f\x8f\x20\x26\xd2\xd2"}, -{{0xdf,0x29,0x4e,0x47,0x7b,0x1b,0x91,0xc5,0xac,0x5b,0x98,0xc3,0x30,0xd2,0x22,0xd7,0xcd,0x2d,0x53,0xe7,0xd0,0xbc,0x0c,0xa4,0x03,0xdf,0x4e,0xc7,0x53,0x27,0xa2,0x74,},{0x5f,0x0b,0xd2,0x2f,0x2f,0x18,0x96,0xd1,0x56,0x3b,0x4f,0x69,0x40,0xc7,0xdf,0x89,0xef,0xc2,0x58,0xc0,0xff,0x6c,0x2f,0xcd,0x67,0x4d,0xaf,0x4f,0x59,0xfc,0xdb,0x60,},{0x99,0x45,0xab,0x73,0xb5,0x85,0x62,0xb3,0x55,0xda,0xbc,0x4e,0x2b,0x6b,0xe7,0xe0,0x5f,0x37,0xf8,0x95,0x71,0x44,0x0c,0xcc,0x32,0xc1,0xa9,0x47,0x37,0x09,0x5b,0x78,0x66,0x74,0x7d,0x21,0x00,0x70,0x00,0xa0,0xf0,0xe3,0x51,0x11,0x4b,0x88,0xe0,0x13,0x8b,0x55,0xdf,0x44,0xfe,0x72,0xeb,0xe9,0x59,0x14,0x10,0xe7,0x07,0xfa,0x9d,0x02,},"\x3e\x42\xd6\x68\x40\x96\x30\xcb\xb8\x48\x12\xac\x7f\xf1\x15\x4f\x70\xfc\xa8\xbd\xff\x3f\x1a\x04\x0f\xa3\xaf\x86\x8a\xa1\xc4\xe9\x15\x08\xb1\xae\xfd\xf5\xc3\xa8\xb4\xb0\x77\xa4\xd1\x62\xd2\xc0\x5b\xd3\x64\xfb\xbe\x8c\x5a\x08\x31\x4c\x2e\x07\xdf\xfb\xd6\xe8\xdd\x2e\x08\xa0\xdc\xc9\x6e\xa9\x2d\xdd\x4c\x97\xf7\x9d\xb9\x42\x5a\x6c\x6b\x34\xc4\x60\x43\xd0\x9a\x68\xb7\x68\x72\x36\xa9\x18\xd2\x1a\x56\x16\x10\xa1\x3a\xc5\xe4\x46\xe0\x88\x1b\xb2\x6c\xc8\xe2\x8a\xad\x16\x54\xf8\x67\xad\x82\xae\x33\xf8\xf7\xa7\x8a\x65\xbe\x57\x69\x94\x75\x51\x6a\x1a\x87\x46\x84\x3e\x93\xa1\xa2\x94\x35\x46\x24\xfa\xc0\x4d\x45\x2c\xcf\xbe\x4f\xdd\x92\xa9\x51\xaa\xa0\x7d\x26\x67\x6d\x5c\xb0\x77\xa5\x00\x0d\x43\x9c\x12\x42\x76\xc0\xdb\xcf\x86\xe7\xaa\x15\x3c\xc2\x4b\x5a\xff\x67\x7c\x6b\xad\xc2\x61\xc2\x89\xf4\xa4\xae\x51\x9b\x2e\x2f\xff\x31\x2f\xbf\x0f\x5b\x4c\x46\x98\xf6\xae\xdd\x8f\xcb\x1d\x23\x48\x94\x2d\xe3\xfb\x73\xba\x27\xf6\xdb\x14\xc2\xf0\x91\x80\x35\x6e\x5f\xca\xe1\xad\xf6\x5e\x22\x42\x5f\x8c\x27\xf1\x9e\x98\x94\x83\x50\x6e\x5d\xf5\x7a\x1b\x61\x3a\x22\xe3\x45\x03\x8b\x3e\xa9\x1c\x0f\x78\xff\xff\x46\x38\x3f\x38\xc7\x22\x25\x35\x8a\x34\x57\x0d\x6f\x66\x4a\x17\x45\x4a\x15\x16\x13\xf0\x1c\xba\x77\x7f\x62\xec\x83\x18\x75\xec\x5e\x27\xd2\x57\xf1\x80\xb6\x36\x6c\xb1\x83\x10\x7c\x40\xf5\x0b\x01\xb2\xb9\xbf\x91\xb3\xb5\x54\x9e\xd9\x31\xa3\x53\x7a\xa4\x16\x89\xf7\x2b\x25\x7a\x6a\xa3\x9c\xdc\x6f\xce\xdf\x14\x39\x83\xbe\x5b\xff\xe3\xae\x2b\x29\xf8\x2f\x88\x21\x22\xd6\x6a\x79\x25\xf5\xa7\x10\x82\x6c\x0d\xad\xb7\xe4\xfa\x4e\xc0\x79\xba\x2e\x76\xda\xda\x43\x3f\x30\x77\xcb\x1e\xf7\x46\x13\xfc\x5d\xbf\x82\x58\xb6\xda\x7c\x73\xc8\x66\x37\x24\x57\xed\x50\x0f\x97\xf9\x90\x7e\x1f\xc2\x63\x53\xc7\x0b\xa3\xbd\x9c\x36\x15\x1d\x46\x86\x5d\x2c\x65\x98\x65\x62\x48\x5c\xf8\x42\x1f\xeb\xbe\x77\x7c\x73\xe6\xcd\x00\x26\xd6\x6d\x35\x12\x8b\x9f\x8f\x33\x26\x4a\xeb\x56\xbd\x3e\x4b\x8d\x1f\x52\x66\x41\x1e\xf3\xb2\x3b\x76\xb3\x6d\x4c\x9d\xf3\xc5\x12\xfd\x56\x0c\x2b\xe5\x2a\xc5\x23\xc1\x93\x77\xad\x2a\xdc\x0e\x8c\x30\x9c\xf5\xbb\xf7\x2d\x9e\xb8\x5d\x65\xa9\x48\x47\xd4\x97\xd8\xd1\x02\x42\x4f\xb8\x43\x81\x66\x6e\xcb\x1c\x35\xa3\x72\x5d\x7d\x9e\x92\x84\xfd\xeb\xb6\xb3\x62\xaa\x6a\x9c\x6f\xb3\x7a\xba\x87\x35\x7f\x57\x4c\x0e\x63\xb4\x49\x7d\x49\x8f\xfb\xb7\xd0\x69\x2d\x78\x4b\x4b\x18\xce\x9f\x91\x50\xc1\x46\xd3\xd1\x8c\x38\x2e\xda\x04\x93\x8c\x69\xd0\x77\x8f\x29\x02\xd5\x23\x5a\x56\x52\xb9\x7c\xef\x6d\x5f\x60\xda\x6b\xd7\xed\x4f\xf9\x7c\xd9\x4d\x49\x39\xca\xca\x3b\x6b\xaa\x3c\xfd\xac\x04\xcd\xa9\x55\x96\xf4\x67\xcb\xc6\xcb\xcd\x92\x64\x16\x77\x43\xea\xc1"}, -{{0x70,0xc6,0x85,0x9f,0x08,0xcf,0x42,0xb4,0xbd,0xa9,0xeb,0x62,0x97,0x9d,0xff,0xb7,0xcb,0x08,0xeb,0x3d,0xab,0xe9,0x3f,0xe9,0x4b,0x01,0x38,0x46,0x17,0xcf,0x67,0x30,},{0x40,0x1c,0x9e,0x20,0x33,0xe2,0x25,0x9f,0xb6,0x38,0x3b,0x3e,0x8b,0x9e,0x17,0xb3,0xf2,0x06,0x27,0x46,0xbb,0xe6,0x48,0xcf,0x48,0x45,0x16,0xdb,0x0f,0x2f,0x1b,0x06,},{0x0f,0x03,0xa4,0xf1,0x5c,0x33,0x9b,0x4f,0x7b,0x88,0xb4,0xe2,0x1a,0xd9,0xe3,0xd6,0xbb,0xf3,0xef,0xfb,0x7b,0x67,0x8f,0xfa,0x50,0x0d,0x47,0x38,0x3b,0x71,0xa7,0x45,0x4f,0x62,0x90,0x7b,0x56,0xf5,0x9f,0x9b,0x9a,0xf6,0xd5,0xb2,0xa0,0xfc,0x1c,0x73,0x7a,0x64,0x10,0x51,0x95,0x08,0x98,0x99,0xf5,0x7a,0x2c,0x9d,0xba,0x50,0x9e,0x0a,},"\xdd\x06\x09\xea\x15\x99\x21\x39\x5d\x11\xfb\x2d\xa8\xea\x4f\x74\x7d\x7f\x74\xb5\x80\x52\xe0\x1c\xad\x40\xa2\x71\xfa\x0b\xbe\xed\x91\x02\x0f\x4f\x0c\x08\x46\xc4\xf0\x77\x78\xa6\xaa\x76\x8e\xb5\x17\x12\x29\x4e\x9e\x1f\x32\xa6\x02\xb1\x52\x51\x4f\x5e\x6d\x39\xf9\xe0\x8f\x7a\x78\x12\xbd\x90\x0c\x10\xa9\x14\x69\xe4\x7e\x8a\x78\xe5\x4c\xd4\xbd\x7c\xfe\xde\xde\xc1\x71\xef\x37\x3f\x1c\x4f\x9b\xbc\x2c\x81\x40\x2f\xb1\x4e\xd0\xbf\xac\x8d\x04\x3f\x11\x7d\x61\x24\x52\x1a\xfa\xe0\x91\x6a\x51\x0d\x56\x8a\xcf\xa3\xaa\x33\x01\xbc\x97\x9a\xc2\x8d\x55\x1d\xbb\xea\x6c\xea\xc4\xc2\x12\xaa\x8c\x84\x92\xb3\x61\x3a\xe7\x39\x5d\xd4\x12\x5f\xc4\xc2\x5d\x5b\x4d\x99\x23\x08\x21\xd4\xb1\x7e\xc2\xee\x6b\xe7\xd6\x04\x19\x5a\x21\x54\x33\x3b\x97\x35\x26\x58\x0c\xa7\xef\x9e\x30\xc6\xc1\xdd\x42\xef\x2a\xfe\x42\xb1\x1b\x1a\xa4\x9b\x9c\xca\xba\xca\x17\x09\x1e\xeb\x38\x0e\xc5\xe3\x4a\xd1\xe3\x82\x7c\xc6\x0d\xac\xf1\x44\x28\x6c\x78\x92\x59\x0b\xd2\x67\x1a\x8d\xc5\xf3\xa7\x02\xc1\xde\x7c\xd3\xb4\x2c\x1b\x15\x0b\x09\xc3\xe5\x8e\xf6\x94\x3b\x45\xd8\x9d\x41\xdf\x36\x1f\x1d\x5c\x25\x56\x55\x91\xb6\xac\x8d\xea\xa7\x36\x76\x53\x1f\x6e\x5a\xbe\x58\x04\xb0\x09\x7f\x8d\x45\xea\x29\x39\x17\x73\x33\xca\xce\xf1\x2e\x4b\x71\xfe\x49\x36\xba\xfe\x00\x74\x7a\x89\x30\xbc\xea\x55\xb8\xfd\x84\xa0\x1f\x6d\xf8\x4e\x7a\xcb\x93\x1f\xc7\xc0\x1d\xdf\xd6\x3d\xee\xc3\xad\x3e\x69\xdf\xa2\xb7\x35\x50\x58\x3d\x57\x47\xee\xe9\x6c\x55\x36\x36\x87\x97\xe2\x47\xf2\x3f\x53\x7d\x79\x07\x9a\xb6\xda\x31\x41\x02\xc7\x44\x3d\x41\x96\x0e\x3a\x3d\x8c\x35\x9c\x4a\x4e\xc6\x26\xfc\xc4\x4e\x11\x0e\xa7\x44\xd4\x17\xaa\x85\x0d\xb8\xec\xdb\xfe\x34\x0a\x96\x2d\xb0\xd8\xc5\x7d\xc5\x17\xbe\x8b\x40\xd1\x4d\xe9\x7b\x1e\x9e\x04\x26\x44\x7f\xde\x0a\x04\xe5\x06\x79\xc5\x3b\xa1\xaa\x3c\xdc\x38\xc7\xed\xe6\xdb\x6c\x05\x4b\x1e\x9c\xe7\xde\xad\xaf\x93\xeb\xdd\x47\x07\x91\x53\x5f\x3e\xcf\xab\xf3\x41\x63\x55\xf7\xa1\x8a\x38\xaf\xe6\xbf\xe5\x07\xef\x08\xc4\x37\x3a\x4a\x69\xde\xe1\xfc\xb6\x5b\x16\x31\xa0\xde\x14\x88\x64\x9d\x0b\xb2\x67\x9a\x9a\x45\xf6\x78\x20\xb2\xa4\xa1\xe5\xa5\x48\x07\x2d\xa7\x03\x2d\x17\x25\x55\xe7\x88\xcc\x98\x60\xeb\xb3\xc0\xc3\x59\x49\x37\x51\xb0\xc2\xc9\x50\xa7\xfc\xf4\x80\x3c\x14\x7f\x93\x40\xfc\x93\xd8\x5f\x1e\xfa\x57\xb3\x90\x81\xb9\x2d\x93\x47\x3f\xd2\x35\x16\xc4\x95\x0e\xd4\xb2\x9a\x2e\xd3\xa0\x42\xae\x3d\x92\xa1\xe5\x2c\xb7\x09\x63\x6f\xc7\x27\x2f\xd7\x47\x20\x8b\xee\x2b\x16\xd1\x91\xe4\xc6\xde\xb2\x76\x72\xaa\x34\xe4\x39\x14\xcf\xf2\x05\x5c\xa4\xee\x8b\xa3\xe1\xdc\x58\xa6\x79\xc7\xf7\xde\xe2\xc1\xd5\x3e\x28\x75\x09\x70\xf5\x7d\x85\xea\xb1\xc2\x6b\x89\xbb\x73\xe0\xb1"}, -{{0xc5,0x96,0x29,0x61,0x81,0x5b,0x57,0xcd,0x16,0x24,0x03,0xce,0x08,0xe4,0x10,0x5d,0xdb,0x8a,0xae,0x2d,0x3f,0x53,0x3f,0xb4,0x9c,0xc2,0x36,0xb5,0xff,0x50,0x4d,0x6e,},{0xdb,0xad,0xe7,0x22,0x36,0xba,0x12,0xd4,0x97,0x7b,0xa4,0x6c,0x36,0x4b,0xb6,0x9a,0x88,0x7f,0xf4,0x02,0xde,0x91,0xd4,0x7a,0xfa,0x9b,0x93,0xc9,0x5b,0xe7,0x1e,0x7e,},{0x81,0x01,0xba,0xef,0x00,0x4e,0xb6,0xf5,0xad,0x4d,0xe0,0x97,0x9f,0xf3,0x6d,0x34,0x39,0xb8,0x21,0x2b,0xdc,0x92,0x89,0x42,0xe4,0x31,0x91,0x5b,0x3f,0xd1,0x8b,0xc2,0xad,0x67,0xb2,0x6f,0x18,0x94,0x1d,0xcb,0x16,0xd2,0xc2,0x91,0x91,0x42,0x1e,0x77,0x9f,0xed,0x62,0x2f,0xd9,0xf5,0x82,0x64,0x4e,0xaa,0xdb,0x3f,0xe5,0xc0,0x98,0x03,},"\x4a\xe4\x14\x8d\x79\xca\x94\x25\x59\x2a\xa2\x40\xbd\x15\x34\x24\xa3\xbf\x4a\xe2\x73\x95\x87\x2c\xe5\x72\x8a\xc7\x61\x35\x96\xa7\x7d\x5c\xe8\x56\x5d\x8d\x6e\x1b\x59\x35\xb3\x90\x6c\xaf\xe1\xff\x88\x8e\xbc\x98\x15\xe0\x4a\x62\x4d\xfc\x4c\x69\x07\xb8\x5f\x6f\x1a\x0d\xbd\xdf\xf6\x2e\x91\x51\x22\x0d\x47\x44\x62\xcb\x9f\x13\xd8\x9d\x3a\x93\xa0\x0b\xa2\xb6\x0f\x7e\x7c\xa6\x3d\xa1\x7a\x63\x79\xd6\x73\x55\x1e\x79\x0b\x59\x11\x72\x7c\x90\x6d\xc9\x4f\x86\xd8\x27\x75\x46\xc1\x56\x4a\x45\x57\x3a\x77\x43\xbb\x8a\x13\x8c\xde\x87\xb3\xb2\xf2\x8e\x5e\x24\x59\x40\xa5\x1e\x7c\x45\x8c\xf8\xc5\xf0\xa7\x02\x75\x96\x25\x53\xe0\xd2\x39\x0d\x17\x1d\xb4\x4c\x2f\x7a\x5c\x9e\x9f\x93\xb9\x0f\x7a\x5f\x54\xf1\x91\xb0\xd8\x75\xba\xd7\xe0\xbe\xb9\x80\xc2\xa3\x36\x5c\xd7\xb9\x20\x87\x24\xf4\x65\x44\x18\x11\x7e\x16\xef\x71\x34\xe3\xe2\x79\x4b\x6f\x9e\x80\xec\xab\xec\xa3\x25\x4e\x70\x4c\x21\xb7\xad\x30\xc5\xde\xe0\x17\xea\x25\x33\xfc\xd9\x42\x51\xe5\x5a\xe7\x5a\x8c\xc6\xdb\x66\x74\xb3\x9c\x88\xca\x42\x00\x60\x43\xd6\xbd\x9b\x00\xec\xf6\x4c\xea\xfe\xeb\x40\x2b\x1f\x22\xfd\x89\x1f\x2d\x11\xc5\x15\xc1\xab\xa6\xa2\xd4\xc0\xbd\x21\x81\xa4\x8e\x43\xfd\x1c\x0a\xf9\x1f\x9b\x7b\x7d\x37\xf3\xdc\xd9\xe4\xc0\xa7\x59\x74\x84\x67\xd3\x48\xa8\xb1\x16\xdf\x6a\x4e\xac\xf1\x78\xae\xcc\xcd\x30\x66\xe9\x2d\xca\x45\xda\x7a\x3e\x31\x9f\x37\x71\xeb\x34\x90\x02\x21\x93\xc5\xb6\x52\xf0\x45\x68\x7e\x17\x05\xf2\xe5\x69\x1c\x13\x4b\xe4\x00\x63\x53\xd7\xec\xd0\xe9\x18\xd5\xde\x0f\x3b\x87\x80\x9f\xca\x4a\xcf\xab\x94\xe1\x14\x8f\xf7\xcf\x07\xf7\xcf\xd0\xc7\x45\xdd\x2b\xe0\x1a\x24\xa5\xe0\x69\x28\x06\x98\xbc\x3f\x54\x00\xa6\xdc\xd0\x8e\x44\x59\x5c\x03\x88\xe4\x48\x33\x76\x8f\xc4\x91\x04\xee\x11\x5b\xdc\xb0\x2b\xfb\xda\x17\x9d\x16\x4c\xe9\x69\x93\x66\x29\xf2\x33\x56\x01\xb5\x6f\xe8\xf7\x85\xcc\xa3\x80\x5f\x04\x03\x87\x2c\x62\xf7\x3c\x3c\xe8\x05\x63\xd0\x70\xe9\x76\xd8\xec\xc5\x11\x24\xe2\xca\xce\x7e\xe1\x86\x99\x04\x7c\xb0\xf8\xfb\x8d\x9c\x59\xb8\xa6\x0d\x12\xc0\x8a\x09\xfc\xe5\x8f\xd9\x2c\xd3\x6d\xb6\xa8\xe8\x9d\x11\x8c\xf8\x8a\x92\xdc\x8a\x26\x00\xbd\x95\xf5\xa8\xe8\x5d\xb5\xcd\xbb\x24\x9c\xa8\x12\xca\x20\x9c\x76\x18\x05\x1c\x45\x64\xa3\xa0\xe1\x92\xb7\xe4\x59\x92\x45\x6c\x87\xd1\x74\x12\xc1\x1a\xde\xad\x52\x6a\xb8\xdb\x21\x45\x2f\x74\x71\xd1\x7f\x2e\xbc\x90\x01\x54\x50\xed\xf4\xf0\xa4\x4f\xb2\xf4\x90\x5f\x74\xd7\x02\x75\xcc\xd8\x9b\x93\xa6\x50\x47\x3c\x02\xa7\xda\x0c\xbc\x67\x91\x5c\xeb\x7a\x1e\xa5\x9f\xa8\x88\x44\x72\xdc\x91\x7e\xe9\xd2\x46\x33\x9c\x59\x26\x84\x3e\xcf\x53\xfa\xfd\xc5\x6a\x69\x56\x01\xa2\x76\xc2\x3a\x84\x3e\x4d\x30\xf8\x9c\x97\xc9\xee\xe6\xdf\xc7"}, -{{0xde,0xe6,0x86,0x6c,0x78,0x74,0xc1,0x27,0x02,0x9e,0x96,0xe0,0x25,0xbf,0xfd,0x35,0xfc,0xfd,0xf4,0xdc,0x36,0x96,0x6c,0x15,0xee,0x62,0x93,0x36,0x80,0x13,0xd3,0x79,},{0x08,0xc9,0x4d,0xa3,0x51,0xbb,0x2b,0xee,0x72,0xe6,0xe1,0x96,0xbe,0x74,0x88,0x07,0x58,0x37,0x62,0xc5,0x29,0x6e,0x05,0xb1,0xe5,0x29,0xc4,0x7c,0x6b,0xba,0xce,0xc6,},{0xb7,0x8e,0xbd,0x6d,0x65,0xb1,0x75,0xd4,0xbb,0xd3,0xd9,0xa2,0x08,0x2a,0x0e,0xfe,0x6e,0x99,0x1c,0xb2,0xe4,0x03,0x52,0x1e,0xec,0xe0,0x0f,0x41,0x8f,0x2e,0x95,0x6b,0x66,0x90,0x78,0x80,0x65,0x8b,0x9e,0x8e,0x47,0x69,0x96,0x53,0xd1,0x59,0x13,0x23,0x80,0xd9,0xce,0x11,0x09,0xaf,0x9c,0x27,0x57,0xda,0xf4,0xcd,0xf1,0x8c,0x9c,0x0a,},"\xf1\xaa\x19\x77\xf5\x31\x1b\x53\x8b\x94\x0a\xe4\x42\xa3\xab\xc8\x9a\xac\xcd\xcd\x0a\x79\x38\x0a\x24\x25\x8d\x4a\x9f\x1c\xe6\x38\xfc\x2f\x5b\xa2\xe5\x3f\x8e\x1f\xa6\x17\x6f\x17\x8d\x90\x24\xa7\x78\x94\xc2\x8c\xad\x42\xd6\x29\xc7\x93\xd6\x8a\x02\xbe\x94\x11\xb5\x27\xac\xad\xae\x7e\x5c\x38\x51\xba\xbb\x45\xb5\xfe\xce\x32\x9e\x29\x03\x4c\xd4\x25\x71\x08\x37\x27\xf3\x5a\xec\xad\x7c\x9b\xe5\x95\x4e\xc6\x4e\x8f\x6e\xca\xb7\xcc\x05\x90\xe5\x41\x56\xa4\xe1\xa4\x53\x03\x84\x9f\x78\x97\xe7\x2c\xf2\xfb\xcd\x84\xf5\x6c\x72\xf9\x41\xdb\xb0\xb0\x9a\x32\xe6\x38\x6f\xbe\x18\xa4\x3b\xb9\xbd\x8b\x79\x3e\x4b\x9e\xdd\x53\x21\x03\xea\xb5\x4d\x62\x71\x17\xd2\x81\x39\xb6\x4e\x60\xfb\x0b\x81\xd0\x90\x01\xbb\x24\x04\xd9\x25\xe2\x65\xba\xbd\xc6\x9f\x96\xb1\x35\xe9\xe6\xab\x7f\xeb\xb1\xed\x30\x75\xd6\xaa\x2a\xbd\x2b\xbf\x9b\x65\xfa\x9b\x3b\x71\x91\xef\x37\xb6\x33\x60\x59\x10\xee\x88\xf6\x6e\xad\xa7\x9f\x00\xf5\x36\xd3\x80\xb8\x2f\x2f\x4b\x59\x85\x11\x2d\xe0\x04\xa5\x66\x03\xf4\x43\x6d\x8f\xf3\x00\xf4\x2b\xf5\xac\xdc\x7a\x4b\xf1\xea\x9d\x41\x96\xc4\x80\x49\x5b\xac\xb0\x06\x76\x30\xfc\xc0\x00\xb4\xf2\x79\xdd\x3f\x30\xf3\x53\x27\x60\x92\xd1\x52\xc3\xf4\x3e\xfd\xc0\x41\xde\xaa\x0b\xc5\xaa\xab\xa7\xf8\xbb\xd8\x5e\x69\xc1\x37\x42\xd6\x78\xdb\xb6\x53\x60\xaa\xf7\xb5\x48\xa0\x44\xc0\xec\x60\xa5\x7a\xf6\x50\xbc\x31\x97\x3f\x83\x2f\x96\x12\x65\xbc\x23\x18\xf8\x07\x75\xaf\xd5\x1f\x55\x19\x4c\x42\x42\x3f\x7b\xf4\xe0\x05\x2f\x98\xcb\x20\x69\x13\xff\xea\x48\x86\xec\xd2\x7a\x41\x79\xb1\x37\x73\xf9\x47\x50\x2e\x18\x1b\xf1\xa1\xf2\xc6\x2c\x6f\x08\xc2\x03\x59\xf0\x6d\xf2\xb1\x81\x27\x04\x3b\x10\x70\xd0\x19\x4e\xf5\xe5\xbf\xd3\x7d\x22\x79\x84\xcf\xb1\x09\x89\xf2\x1c\x71\xad\x0f\xe3\xb8\x12\x27\xd3\xa7\x17\x89\x45\x5e\xda\x38\x3c\x22\xf4\xd2\xfc\xc7\x25\x79\xf4\x65\xe0\x66\xf3\xd3\x8b\xef\xc0\x24\xef\xef\x6c\x2e\x32\x96\x49\xce\x43\x4d\x62\x73\x67\xa9\x00\xd0\x7f\xe6\x23\x42\x35\xc8\x46\x56\xea\xc5\xdd\x0d\x78\x8c\xf4\xcb\x31\x87\x18\x24\xd6\x6a\xe4\xbc\x89\xed\xeb\xa1\xb3\x67\x01\x29\x84\x53\xe8\xda\x1e\x69\xcf\xb8\x68\x09\x5c\x3b\xe6\xed\x21\x82\xda\x1c\xff\x49\x05\xaf\xd2\x07\x31\xac\x1e\xd9\x84\x16\x47\x37\x90\x3c\x7d\x8b\xb0\xad\x16\xae\xcf\x2f\xae\x33\x74\x04\xfe\x35\x66\x45\x15\xd9\x3b\x70\x1e\x2f\x87\x86\x64\x45\x4c\x0d\xec\xd1\xc6\x55\x8a\xda\xce\x3c\xdb\x22\x75\x07\xa5\x16\x06\xf0\xa5\x4d\xf8\xdf\xaa\x42\x02\x05\xdd\x57\xc6\x52\x42\xff\x24\xa4\x05\xef\x85\xc9\x2d\x60\x28\x86\x93\x2b\x35\xfa\xbe\x9c\x3b\xce\xbf\xc6\x23\x56\x39\xe8\x73\xfc\x2d\xd0\x84\xc5\x2c\xd6\xa7\x41\x3b\x83\x1d\x1c\xc9\x99\x31\x37\x3a\xab\xd8\x47\x62\x0e\xb6\x9b\xb0\xfa"}, -{{0x52,0x36,0x23,0x55,0x59,0x95,0xba,0xaf,0x2a,0x27,0xad,0xcb,0x1e,0xba,0xfa,0xa8,0x02,0xd2,0x3e,0xf7,0xab,0xfa,0x97,0x75,0xf2,0xc9,0xbf,0xa0,0x7d,0x64,0xe0,0xac,},{0xd3,0x4d,0xea,0xe6,0x52,0x3e,0x61,0x9d,0xd1,0xbf,0xc8,0xf3,0xc4,0xca,0x4b,0x78,0xb3,0x68,0xc0,0xf7,0x20,0x03,0x5e,0x14,0x4c,0x3f,0x2f,0xc1,0x05,0xd4,0xce,0x21,},{0xb1,0x87,0x17,0x29,0xfe,0xc8,0x3a,0xea,0x0a,0xaa,0x47,0x2b,0x70,0x0a,0xcd,0x09,0x48,0x13,0xfb,0x7d,0x57,0xb9,0x09,0xe0,0xea,0xaf,0x21,0xee,0x93,0x18,0x47,0xad,0xde,0xdd,0x2b,0xe8,0x53,0x3d,0x0c,0x30,0x5c,0xb9,0xcf,0xe5,0x08,0x0e,0x76,0xc2,0x80,0x8b,0x6e,0x51,0xc9,0x82,0x62,0x90,0xdd,0xb7,0xb9,0x4b,0x6f,0x7d,0x58,0x0b,},"\x05\x53\xe6\x9e\xf2\x11\x65\x2d\x62\xbf\x28\x1b\xfb\xdd\x37\xbe\x22\x76\x9d\x81\x97\x46\x36\x1c\x7d\x65\xdd\xd0\xfa\xd6\x77\xcc\x04\x38\xb3\x01\xd1\x51\x45\x78\xe0\xda\x58\xe5\x5f\x72\x9f\xa8\xe6\x6d\xde\xb7\xf9\x73\xa8\x18\xd2\x4e\xd8\xfe\x02\x7b\x84\x91\x17\x9d\x07\x77\x3f\xb5\xd2\xbb\x96\xaa\x85\xd6\xb3\x75\x04\x54\xe5\x0d\xe9\x1f\x9b\x88\xae\xe8\xaa\x68\xe6\xbb\x53\xed\xc6\x66\x77\xb4\x1e\x60\x1a\x46\xab\x4b\xb1\xe6\x56\xe7\xfa\x5f\x01\x79\x93\x36\x80\xa6\xec\x95\x04\x27\x5e\x7a\xdf\x7a\x32\x48\xe6\x3a\x0f\xc9\xc1\xea\x5a\xe9\x6c\xd0\xc6\x5a\x89\xa7\x7c\xec\x2b\x1f\xd8\xf4\x53\x7e\x82\xc1\xc4\x88\xa6\x9a\x0e\xf6\x4f\x58\x73\x4d\x9e\x73\x47\x8e\x1d\x1f\x12\x31\x14\xef\x66\x08\x5e\x0b\xa3\x19\xcb\x81\x0b\x66\xaf\x96\xd1\x30\x8b\x1a\x2b\xd9\x2b\xa2\xc2\x65\xaa\x30\x9e\xcd\x55\x57\xd4\x02\xc3\x80\x2c\xae\x8d\x7e\x95\x00\x7f\xe6\x10\xc2\xaa\x75\xfc\x66\x19\x6c\x3f\xad\xfe\x99\x7d\x6d\x59\x98\xe1\x8d\x26\x0e\x9d\xa3\x1d\xa9\x21\x8c\xba\xd1\x03\xcb\xfc\x2c\x75\x47\x76\x5d\x67\xe8\x1f\x24\xac\x83\x02\x2e\xf5\x1c\x6c\xc5\x08\x64\x36\x6a\x35\xf6\xb9\xb9\xaf\x94\xe8\x4c\xaa\x9f\xd3\xd7\x67\xc8\x31\xf0\x96\x7a\x61\x46\x2f\xbc\xfc\xc8\x03\xf1\x2e\x37\x39\x03\x9a\xcd\x5d\xbe\x93\x66\xf0\x5a\x33\xdb\xea\xf3\x60\xe2\xdd\xcb\xe5\xc4\x43\xf8\x0e\xf2\xad\x62\xe0\x3c\x1d\x5b\x70\xcd\xea\xb4\xa7\xdd\x41\x55\x30\x64\xc8\xd1\x52\x70\x9d\xef\xf8\x20\x76\xb9\x07\x11\x92\x37\x6f\x51\xd4\xc2\xc7\x1a\x84\xe8\x9f\x2d\x94\x01\x32\x0c\x2e\x45\x9b\x3e\x24\x3c\xca\x7c\x26\xfd\x09\x8c\x26\x4a\xc8\x8e\xf6\x38\x92\x1d\x98\x0b\x0a\xe9\xe5\x12\xd3\x72\x03\x7d\x81\xad\xc4\x81\x26\xd7\xc9\xe4\xb5\xaf\xa5\x7e\xc2\x65\xd4\x01\xb9\x65\x3e\x92\x8a\xfb\x7d\xff\x9b\x48\xe2\x95\xe4\x70\xd6\xb5\x2e\x88\xb3\x9d\x0a\x40\xcb\x8e\xba\x24\x9f\x8b\x13\xd8\x11\x13\xdb\x1d\x3e\x01\xef\x75\xc7\x22\xf2\x69\x48\x8e\x96\x3c\xc8\x18\x27\x04\xf8\xca\x01\x8e\x73\xdc\x07\x14\xe9\xa9\xfc\x79\xbc\x43\x63\xc2\x8c\xb3\x98\x43\x74\xf7\x3b\x2a\xa8\x78\x6e\x74\xe0\x15\x95\x07\xa2\x98\x83\xfe\x0e\xd1\xc6\x00\xf5\x25\x88\x5f\x2f\x10\xea\x00\x6c\x39\xe5\x9b\x92\x5b\x76\x5b\x1e\xde\x53\x42\x57\xa1\xf4\x0f\x28\x46\x58\x4f\x06\x97\x46\xb5\x2f\x56\x00\x43\x0a\x28\x63\xd7\x93\x60\x95\xfb\xc2\x2a\x6a\xda\x67\x4d\x41\xb3\x74\xe2\xb8\xb9\xa1\x9f\xa7\x12\xb5\x94\x45\x33\xbb\x6d\x6e\xc4\x3b\x89\xd4\x97\x1b\x70\x20\x5a\x6a\xcd\x72\xa8\x99\xda\x12\x61\x82\x04\xdb\x0c\x3e\x82\x67\xb8\x45\x79\x16\x93\xe0\xae\x6a\x35\xf1\x4d\xa1\xf8\xf4\xdd\x17\x4b\xce\x03\x18\xfb\x5a\x00\xf6\x72\xed\xe4\x23\x04\xcf\x04\xa6\x27\x60\x57\x75\x90\xf2\x7e\x2d\xfa\x6e\x5e\x27\x95\xd6\x60\x53\xb3\x0a\xf7\xf1\xbf"}, -{{0x57,0x5f,0x8f,0xb6,0xc7,0x46,0x5e,0x92,0xc2,0x50,0xca,0xee,0xc1,0x78,0x62,0x24,0xbc,0x3e,0xed,0x72,0x9e,0x46,0x39,0x53,0xa3,0x94,0xc9,0x84,0x9c,0xba,0x90,0x8f,},{0x71,0xbf,0xa9,0x8f,0x5b,0xea,0x79,0x0f,0xf1,0x83,0xd9,0x24,0xe6,0x65,0x5c,0xea,0x08,0xd0,0xaa,0xfb,0x61,0x7f,0x46,0xd2,0x3a,0x17,0xa6,0x57,0xf0,0xa9,0xb8,0xb2,},{0x90,0x3b,0x48,0x4c,0xb2,0x4b,0xc5,0x03,0xcd,0xce,0xd8,0x44,0x61,0x40,0x73,0x25,0x6c,0x6d,0x5a,0xa4,0x5f,0x1f,0x9f,0x62,0xc7,0xf2,0x2e,0x56,0x49,0x21,0x2b,0xc1,0xd6,0xef,0x9e,0xaa,0x61,0x7b,0x6b,0x83,0x5a,0x6d,0xe2,0xbe,0xff,0x2f,0xaa,0xc8,0x3d,0x37,0xa4,0xa5,0xfc,0x5c,0xc3,0xb5,0x56,0xf5,0x6e,0xdd,0xe2,0x65,0x1f,0x02,},"\x2c\xc3\x72\xe2\x5e\x53\xa1\x38\x79\x30\x64\x61\x0e\x7e\xf2\x5d\x9d\x74\x22\xe1\x8e\x24\x96\x75\xa7\x2e\x79\x16\x7f\x43\xba\xf4\x52\xcb\xac\xb5\x01\x82\xfa\xf8\x07\x98\xcc\x38\x59\x7a\x44\xb3\x07\xa5\x36\x36\x0b\x0b\xc1\x03\x0f\x83\x97\xb9\x4c\xbf\x14\x73\x53\xdd\x2d\x67\x1c\xb8\xca\xb2\x19\xa2\xd7\xb9\xeb\x82\x8e\x96\x35\xd2\xea\xb6\xeb\x08\x18\x2c\xb0\x35\x57\x78\x3f\xd2\x82\xaa\xf7\xb4\x71\x74\x7c\x84\xac\xf7\x2d\xeb\xe4\x51\x45\x24\xf8\x44\x7b\xaf\xcc\xcc\xec\x0a\x84\x0f\xec\xa9\x75\x5f\xf9\xad\xb6\x03\x01\xc2\xf2\x5d\x4e\x3b\xa6\x21\xdf\x5a\xd7\x21\x00\xc4\x5d\x7a\x4b\x91\x55\x9c\x72\x5a\xb5\x6b\xb2\x98\x30\xe3\x5f\x5a\x6f\xaf\x87\xdb\x23\x00\x1f\x11\xff\xba\x9c\x0c\x15\x44\x03\x02\x06\x58\x27\xa7\xd7\xaa\xae\xab\x7b\x44\x6a\xbc\xe3\x33\xc0\xd3\x0c\x3e\xae\x9c\x9d\xa6\x3e\xb1\xc0\x39\x1d\x42\x69\xb1\x2c\x45\xb6\x60\x29\x06\x11\xac\x29\xc9\x1d\xbd\x80\xdc\x6e\xd3\x02\xa4\xd1\x91\xf2\x92\x39\x22\xf0\x32\xab\x1a\xc1\x0c\xa7\x32\x3b\x52\x41\xc5\x75\x1c\x3c\x00\x4a\xc3\x9e\xb1\x26\x7a\xa1\x00\x17\xed\x2d\xac\x6c\x93\x4a\x25\x0d\xda\x8c\xb0\x6d\x5b\xe9\xf5\x63\xb8\x27\xbf\x3c\x8d\x95\xfd\x7d\x2a\x7e\x7c\xc3\xac\xbe\xe9\x25\x38\xbd\x7d\xdf\xba\x3a\xb2\xdc\x9f\x79\x1f\xac\x76\xcd\xf9\xcd\x6a\x69\x23\x53\x4c\xf3\xe0\x67\x10\x8f\x6a\xa0\x3e\x32\x0d\x95\x40\x85\xc2\x18\x03\x8a\x70\xcc\x76\x8b\x97\x2e\x49\x95\x2b\x9f\xe1\x71\xee\x1b\xe2\xa5\x2c\xd4\x69\xb8\xd3\x6b\x84\xee\x90\x2c\xd9\x41\x0d\xb2\x77\x71\x92\xe9\x00\x70\xd2\xe7\xc5\x6c\xb6\xa4\x5f\x0a\x83\x9c\x78\xc2\x19\x20\x3b\x6f\x1b\x33\xcb\x45\x04\xc6\xa7\x99\x64\x27\x74\x1e\x68\x74\xcf\x45\xc5\xfa\x5a\x38\x76\x5a\x1e\xbf\x17\x96\xce\x16\xe6\x3e\xe5\x09\x61\x2c\x40\xf0\x88\xcb\xce\xff\xa3\xaf\xfb\xc1\x3b\x75\xa1\xb9\xc0\x2c\x61\xa1\x80\xa7\xe8\x3b\x17\x88\x4f\xe0\xec\x0f\x2f\xe5\x7c\x47\xe7\x3a\x22\xf7\x53\xea\xf5\x0f\xca\x65\x5e\xbb\x19\x89\x6b\x82\x7a\x34\x74\x91\x1c\x67\x85\x3c\x58\xb4\xa7\x8f\xd0\x85\xa2\x32\x39\xb9\x73\x7e\xf8\xa7\xba\xff\x11\xdd\xce\x5f\x2c\xae\x05\x43\xf8\xb4\x5d\x14\x4a\xe6\x91\x8b\x9a\x75\x29\x3e\xc7\x8e\xa6\x18\xcd\x2c\xd0\x8c\x97\x13\x01\xcd\xfa\x0a\x92\x75\xc1\xbf\x44\x1d\x4c\x1f\x87\x8a\x2e\x73\x3c\xe0\xa3\x3b\x6e\xcd\xac\xbb\xf0\xbd\xb5\xc3\x64\x3f\xa4\x5a\x01\x39\x79\xcd\x01\x39\x69\x62\x89\x74\x21\x12\x9a\x88\x75\x7c\x0d\x88\xb5\xac\x7e\x44\xfd\xbd\x93\x8b\xa4\xbc\x37\xde\x49\x29\xd5\x37\x51\xfb\xb4\x3d\x4e\x09\xa8\x0e\x73\x52\x44\xac\xad\xa8\xe6\x74\x9f\x77\x78\x7f\x33\x76\x3c\x74\x72\xdf\x52\x93\x45\x91\x59\x1f\xb2\x26\xc5\x03\xc8\xbe\x61\xa9\x20\xa7\xd3\x7e\xb1\x68\x6b\x62\x21\x69\x57\x84\x4c\x43\xc4\x84\xe5\x87\x45\x77\x55\x53"}, -{{0x03,0x74,0x9c,0xa2,0x04,0x58,0xa3,0x5a,0x37,0xa8,0xd7,0xa2,0x6f,0x95,0x9f,0x0d,0x59,0xf6,0xdc,0x99,0x73,0xfa,0x36,0x3c,0x1f,0xf8,0xca,0x4e,0x63,0x8c,0x2c,0xd3,},{0xea,0xeb,0x94,0xf4,0x06,0xbd,0xe6,0xa7,0xcf,0x8b,0xde,0x2a,0xdf,0x30,0x81,0xf8,0x37,0x5b,0x87,0xd9,0x33,0x5d,0x49,0x6c,0x71,0xd0,0x42,0xcd,0x2e,0xaa,0x16,0x6c,},{0x78,0xa3,0x87,0x7e,0x02,0xbd,0xfd,0x01,0x5e,0x7f,0x86,0xa3,0x27,0xa4,0x8c,0xc3,0xa5,0x23,0x0b,0xbd,0xb1,0x24,0x3f,0x1a,0x8c,0xf2,0x27,0xf7,0x8a,0xb5,0xe7,0x68,0x0d,0xe3,0x01,0xa9,0x15,0xdc,0x11,0xb3,0x36,0xfb,0x5f,0x65,0x66,0x84,0x8b,0x42,0x50,0x0a,0xdb,0x5d,0x67,0x39,0x69,0x12,0x2b,0xa8,0xf0,0x05,0x3c,0xd3,0x06,0x0b,},"\xee\xf5\xce\xeb\xd0\x44\x5e\x9c\x91\x81\xaf\xf9\xc6\xf2\x66\x01\x28\xfc\xfb\x63\x69\x1a\x42\xcf\xa4\x43\xd6\xa6\x49\xef\xc5\xfa\xd8\xc2\x08\x03\x76\x3e\xe9\x7d\x1d\xba\x08\xe6\x3e\x08\xa2\x61\x6d\xa0\x50\x77\x48\x9f\x2f\xa2\xc5\x6b\x75\x34\xf9\x40\x26\x19\x25\x1f\xdf\x9c\x32\x0d\xe7\xaf\x10\x9e\x2f\xd8\xb2\x56\x5c\xe8\xa7\x52\x4c\x94\x05\xec\x0f\x8f\xca\xa7\x14\x9a\x6d\x21\x0e\xfd\xe8\x3b\x11\x1c\xf8\x2d\xc0\x83\x5c\xf9\x4f\x20\xcd\xb0\x21\xb7\x3b\xd2\x62\x66\x65\x55\xe6\xd6\x27\x07\xb4\x6e\xe4\x2f\xa9\x00\xb4\xf4\xf7\x05\xde\x33\xd3\xdb\xdc\x68\xa8\x8d\x1a\x4d\x0a\xe9\x33\x56\x6d\xb6\xc6\x23\x7e\xc8\xab\xe1\x02\x4d\xac\x4b\x7f\x46\xd4\x07\xbe\x16\x59\x4d\x90\x46\xc7\x31\x2d\xda\x66\x14\xd9\xbc\xdb\x01\xfb\x83\x24\xfc\x62\xb8\xee\xaf\x0a\xbc\x23\xcd\x57\x0e\x30\x4f\xca\x08\xe8\x8c\x73\x5e\x5d\x31\x59\x24\x09\xce\xb5\x83\x86\x2e\x6b\x0a\x76\x77\x29\xf7\x55\x6f\xa2\xc0\x53\x64\x4d\x36\xc8\x33\x7c\x02\x74\xe7\x49\x20\x29\x82\xfb\x4a\x17\x1a\xca\xc1\x96\xc0\x2b\x7f\x16\xa8\xda\x49\x07\x1c\x8a\xb8\x07\x6d\xd5\xd3\xab\xad\xfe\x3a\xf8\x2c\xa8\x5d\xa0\x2d\xcc\x1c\x4a\x6f\x2e\x19\x30\xbe\xe2\x00\x9e\xee\x0d\x97\x1e\x40\xdd\x12\x17\x5c\x8d\x00\x69\x4f\x03\x25\xa3\xb3\x13\x3c\x0d\x0b\xd3\x82\xa5\x19\x4f\xb2\x14\x22\xce\x67\xc7\x8a\x5a\x6e\x15\x37\xe3\xb9\x7d\x5e\x20\x4e\x5d\x19\x56\x96\x39\x0f\x77\xd1\x90\x24\xc1\xbf\x6b\x51\x25\xa0\xcd\xbf\x7b\x98\x80\x03\x61\x81\xc9\x8e\x1a\xc2\xe5\x16\x5b\xd4\x96\xcf\x99\x74\x51\xa1\xc1\x21\x02\xe6\x69\x46\xb1\x67\x6a\xbd\x4c\xbd\xd2\xc1\x16\x73\xf4\xf2\xcd\x5f\x3c\x9a\x43\x4d\x74\x7f\xa0\x5b\x40\xfb\xc7\x22\x68\xb4\xeb\x28\x42\xe4\x74\x1f\x51\xb7\x70\x9b\x6a\xcc\xc4\x7f\xca\xf7\x0d\x9c\x1c\x4c\x35\x86\x71\x19\xd8\x1c\xb3\xff\x1f\x16\x08\x11\x33\xf1\x65\x9a\xed\x85\xf6\x3b\xc9\x01\x98\x9e\x26\x17\xfc\xce\x15\x3c\x29\x78\xd7\x08\xfd\x02\x44\x9a\xe4\xd5\x38\xd1\x22\xdd\xb8\x52\x7c\x0a\x76\xa1\x02\xee\xff\x6e\xdb\x65\xdb\xa2\x98\xd3\xc2\x17\xf6\x55\x18\x14\xed\xde\xec\xe1\xae\xf5\xf3\x71\xa5\x4f\x12\xbf\xfd\x6b\x49\x61\x81\x9a\x0f\x24\x4f\xf0\xd7\xd8\x69\x4c\x14\x42\x2d\xe9\x82\x2c\x13\x17\x9e\x4e\xeb\x81\x59\x50\x79\xb9\xdd\x2a\xd1\xe7\xc3\x9b\xd3\x03\xcc\x44\xae\x3f\x36\x34\x88\x15\x77\xa2\x66\xfd\x6b\xb7\x91\x78\x12\xb9\x99\xdc\x80\x9d\xc0\x9c\x3d\x70\x19\xda\xcd\x28\xe4\x30\x13\xa2\xf9\xe4\xf9\x4b\xb0\xbf\x71\x24\xef\x09\x17\x83\xf7\x96\x39\x7f\x64\x63\xbf\x1e\xfb\x39\xcd\x46\xf3\x79\x0a\x1d\x9b\x6a\x7c\x30\xf1\x49\xb5\xe6\x6c\x29\x37\xe3\x9c\xb9\x74\x4d\xdc\x66\xab\x56\x1b\xad\x4e\x6f\xa8\x53\x4d\x69\x88\x38\x22\x64\x3d\x63\xd8\xbd\x7b\x18\x16\x21\xa2\x67\xe9\x55\xe7\x58\xd1\x79\x2b\x44"}, -{{0x53,0xcb,0xd6,0xf6,0x8c,0xee,0x27,0xb9,0xf7,0xbc,0x05,0x9b,0x80,0x3b,0x44,0x79,0x49,0xbb,0xc9,0xc5,0xd5,0xa3,0x86,0x52,0xd7,0x78,0x9c,0xa1,0x54,0x20,0xde,0xa1,},{0x61,0x16,0x99,0x0b,0x53,0x31,0xe2,0x16,0x5f,0x82,0x74,0x3f,0x01,0xd8,0xe7,0xbd,0x5d,0x70,0x88,0xb3,0x01,0x59,0x83,0x3f,0xa7,0xb9,0x39,0xcf,0xb1,0xcc,0x04,0xd7,},{0xd8,0x25,0x04,0x40,0x5f,0xf1,0x6b,0xa6,0x44,0x3d,0xc4,0x82,0x36,0x72,0x63,0xa8,0xe2,0x00,0x36,0x0a,0xca,0xaa,0x83,0xfc,0x4e,0x4b,0x72,0xbd,0x24,0x9f,0x16,0x10,0x3e,0xc7,0xe5,0xa7,0xe9,0xca,0x17,0x19,0x8f,0x88,0x8e,0xac,0xa1,0x6b,0x74,0x0c,0xc3,0xf5,0xc3,0xb7,0xb6,0x17,0xa3,0x4b,0x94,0x91,0xc3,0xed,0x76,0xaa,0xb3,0x0d,},"\x30\x6f\x8e\x1d\xf0\xa4\xca\x78\xbd\x77\xe8\xe1\x19\x1c\x94\xde\xaa\x82\x64\x83\x55\xc2\xae\xcb\x7e\x82\xfc\x56\xd6\x4c\x50\x46\x19\x24\x7e\x7c\xf8\x94\x33\x28\xd1\x1f\x3d\xb4\xb1\xdc\x14\x8e\x8e\xf6\xf6\xc3\xbc\x35\x59\x69\x66\x2a\x28\x1a\x65\x57\x63\x91\x24\x2b\x7b\xd5\xa6\x2f\x8f\xa7\xac\xb6\x04\xe3\xa3\x44\xae\x1a\x9d\x73\x2a\x25\x43\x15\xf3\x1a\x04\x64\xc1\xe6\x58\x74\x62\xd2\x92\x12\xc4\x0e\x5e\xcf\x06\x1e\x26\x9a\xa0\xb9\x03\x90\xba\x41\x04\x07\x21\x68\x4b\xf2\xaa\x95\x82\xd8\x30\x66\x22\x1d\xb6\x0d\x0f\x7a\xe2\xf1\x49\xa3\x6e\x16\x95\x27\x04\xfb\x1f\x3a\x98\x2e\xac\x6b\x45\x83\x66\x5c\x63\xe5\xa8\x99\x6f\x24\xa5\x66\xdd\x50\x6a\x33\xd4\xec\x8a\x02\xb2\xbd\x34\xb7\x14\xc7\x45\x00\x0c\x01\x28\xa3\xc8\x9d\x94\x25\x06\xd1\x2f\x4b\xeb\x90\x0e\x29\x03\xcd\xb3\x4b\x35\xca\x9b\x6d\x3a\xd9\xb3\x50\xac\x99\xf4\x1d\xb3\xac\xfe\x7f\xe5\x5a\x28\xc0\xf0\x06\xb8\x44\xc9\xdc\x48\x53\xfd\x98\x53\x5a\xda\x79\x41\x6d\xca\x5f\xee\x58\x03\xa2\xd9\xf5\xd6\x8e\x6b\x80\x53\x9f\xf3\x02\xe9\x73\xf2\x4e\x9b\xc8\x8b\x7c\x41\x94\x11\x7d\xdb\x9f\x93\x2b\x32\xd5\xec\x74\x86\x8a\x13\x63\x1e\xce\x68\x81\x4b\x93\x14\x21\xdc\x89\x02\x49\x57\x03\x41\xf4\xb4\x23\xe8\x6e\x8e\xe0\x81\xb2\x27\x02\xf6\x49\xa6\xc7\xa0\xb7\xbd\xf5\xfb\x75\x62\x02\xbd\x10\xb0\xbb\x22\x15\xc7\xd6\x59\x7e\xff\xd8\x52\xf0\xb8\x9a\xbe\xc1\x5e\xa8\x22\x57\x68\x9d\xf8\x1e\x33\x82\x54\xf9\x3e\x81\xcb\xf0\x61\x72\x9d\x48\x3e\xb5\xcf\x64\x98\x05\xd7\x8e\xd8\x92\xdd\x0b\xd2\x48\xca\x1e\x25\x2b\xea\x51\x84\x7e\x1e\x82\xd3\x9a\xf5\x80\x50\xdc\x4a\xfb\xf9\x11\x5a\x3a\x60\x49\x3e\x8c\x0b\xa2\xe8\x6e\x08\x98\xcd\x0d\x43\x08\x91\xb9\xeb\x0a\x40\xf8\x74\x31\xe2\x5f\x41\x53\x8a\x03\x0f\x88\x4f\xab\x36\xad\x11\x16\x5d\x26\x7e\x8d\xd9\x4d\xcb\x05\xb9\x3a\x5a\xe7\x79\x69\x43\x0e\x18\x10\x13\x4e\x15\x72\x51\xb9\x82\xdf\x34\x3d\xff\xae\x61\x23\xa9\x9a\xa0\x56\x2d\x5d\xf7\x24\x08\xf1\xa6\xe2\x9c\x40\x59\xa5\xa8\xaa\xa4\xe6\x21\x52\x8f\xc6\x3a\x9c\xbe\x1f\x4c\x0f\xef\x25\xfe\x3f\x8e\x18\x15\x77\x74\x09\x7a\x9d\x91\x02\x0a\x90\x06\xb6\xc8\x60\xec\x1e\xe1\x0d\x52\x1d\x20\x3a\x1f\x8b\xb8\x25\x61\x29\x6f\xaa\xd4\xb2\x20\x3d\xa5\x3b\x20\x7a\x45\x9b\x29\xc1\x8b\xc0\x64\x93\x32\xb1\x80\x7c\x13\xca\x61\xac\xfa\xf9\x07\x79\xfe\xbb\xc7\xf3\x24\x21\x64\x79\x7e\x6f\x57\x2c\xb1\x5a\x9b\xe5\x88\x73\x43\x45\x5e\x26\xb9\x10\xc8\xbe\xfe\xe4\x2a\xeb\x04\x7f\x9a\xbe\x6b\x37\x50\xdb\xd7\xde\x99\x20\x2a\x0b\xb5\x76\xce\x14\x89\xe6\x1c\x1f\x5d\x27\xc6\x79\x2e\x63\x21\x8e\xdb\xfd\xb9\xb3\xdc\x51\x5b\x42\x54\xd8\x2c\x85\x9e\x52\xce\x6b\xd7\xad\x29\x6d\xd0\xe3\x70\x9d\x4c\x46\x63\x62\xf9\x02\x65\xe9\x9d\xa7\xd0\xb7\x01"}, -{{0x8b,0x65,0x74,0xf6,0xd7,0x39,0x69,0x81,0xe2,0x23,0xa4,0x83,0x7b,0xc3,0x39,0xc3,0xfd,0x65,0x94,0x19,0x84,0x5a,0x21,0x21,0xbf,0x85,0xbe,0x2e,0x69,0x5d,0x86,0x0d,},{0xe3,0x81,0x1a,0xca,0x70,0x63,0x4f,0x5a,0x9c,0xe4,0xb5,0x92,0xa1,0x7b,0xb5,0xcf,0xda,0x53,0x44,0x24,0x22,0xe2,0x03,0xcd,0xa9,0x50,0x4c,0x9d,0x65,0xb2,0x63,0xe8,},{0x2f,0xd0,0x90,0x54,0x75,0xa2,0xce,0xc3,0xe7,0x6f,0x99,0x09,0xb8,0xaf,0xd8,0x3b,0xeb,0x8d,0xae,0xfa,0x77,0xaf,0xcd,0xa3,0x4c,0xb4,0xf1,0x17,0x28,0xef,0x15,0xfc,0x9c,0x1d,0x7f,0x6f,0x6a,0xff,0xfc,0x28,0xf3,0x87,0x4f,0x91,0x3e,0x17,0x98,0x0f,0x0e,0x8e,0x3d,0x5a,0xd2,0x39,0x51,0xdf,0x2b,0x32,0xef,0xaf,0x62,0x19,0xce,0x0d,},"\xa4\x8a\xac\xc0\x49\x5f\xa0\xf1\x25\x9b\x27\x86\x5d\x3d\x75\xdc\x52\xc2\xc8\x28\xea\x8c\x4c\x2a\xd7\x85\x77\x07\x2f\xef\x72\x70\xf6\xa4\xd5\x82\xbb\x7b\x96\x2f\x4c\x3f\xd1\x49\xa6\x0a\x06\xbc\x8e\xfd\x29\x70\xef\x03\x14\x8d\xdf\x61\x98\xb9\xb6\x95\xa6\x9f\xad\xb5\x34\x09\x51\xcb\x75\x39\x8a\xc5\x1a\x4f\xd5\x54\x30\x37\x8c\xd5\xda\x88\x85\x21\x0b\xfd\x21\x46\xf9\x5c\x62\x76\x32\xfe\x8b\xe0\x6d\xe0\x1a\x7c\x27\xb8\x9d\xee\xfd\x67\xef\xc6\x9c\x9b\x5c\x62\xb3\x81\x08\xf7\x76\x22\x91\x43\xda\xe6\x60\xc1\x0c\xbe\xa3\xcd\x4f\x7e\xe5\x3d\xc3\x69\x2e\xd0\x11\x77\xe4\xa6\xf7\xe4\x24\xb5\x66\x6f\x7f\x49\x5f\x2a\x65\x60\x2c\x7d\x08\xc5\xd5\x72\x23\x4a\x56\x7c\xb6\xc3\x8a\xfd\x79\xca\xb5\xc4\x03\x6d\x62\x63\x7a\xef\xab\x55\x88\x76\x9a\x44\x8a\xb4\xc6\x5e\x24\x55\x4b\xd4\x15\x80\x50\xe0\x9e\xb5\x8f\x99\xab\x40\x77\x7b\x03\x56\x70\x9b\x7c\x02\x5a\xe5\xae\x54\x22\xac\xf8\x74\x44\x93\x1a\xe4\xd9\xa8\xb3\xd9\x44\x76\x88\x11\x28\xba\x1e\xb7\x32\x8f\xaf\xc7\x5f\x6b\x9d\xac\xc9\x6d\x3b\x64\x87\xdd\xef\x7c\x59\x26\x2d\xca\xda\x42\x6a\xac\xb1\x39\x22\x93\x54\x11\x56\x62\x35\xe0\x58\x37\x26\x22\xd8\x85\xbd\x0c\xc0\x49\x58\xdc\xfb\x17\xe0\x8f\xcd\x7f\x14\x7e\x20\x15\x6c\x8e\x26\xaf\x85\x53\x0f\x55\x11\xa6\x8d\xb4\x3d\xaf\xc4\xe6\xa2\x3f\x66\x7d\xf3\x74\x3e\xed\xd7\x1a\x3f\x07\xf7\x6f\x94\xd1\x68\x8a\xfc\x84\x63\xbf\xa5\xa4\x39\xae\x31\x14\x69\x94\x8e\x74\x47\x06\x4f\x0b\x05\x06\xf3\x67\x19\xc1\x34\x66\xa1\xb9\x87\x76\xd9\x67\xec\x58\x20\x8b\xa6\x74\x03\x73\x03\xdf\xc6\x19\x0d\xa7\x83\xff\x27\x30\x3b\x86\xb5\xfc\x32\x11\xf0\x1c\x91\x5e\x83\xa6\xad\x01\x21\x44\x79\x11\xcb\xe1\xcf\x69\x6f\x61\x8f\x60\x23\x66\x43\xf2\xe9\x4e\x15\x5d\xb6\x57\x18\x29\x44\xc1\xa4\x3b\xdc\x7b\xd5\xea\xf3\x48\x1f\xe1\x28\x40\x92\xcb\x37\x89\xa8\x92\xbd\x79\xa1\x11\xfd\x41\x01\x43\xcf\x91\xae\x33\x28\x60\xb1\xd2\x9a\xa0\x41\xd1\x77\xb5\x0d\x6c\xc2\xb9\x66\x0d\x32\x8c\x0f\x23\x0a\x35\x15\xe6\xa0\xd6\x88\x70\x9c\x0c\xd3\x47\xad\x2f\xf3\x2d\x61\xd1\xe1\xe9\xba\x76\xf8\x1e\x87\x3a\x6c\x42\x0f\x17\x07\xf3\x84\x1d\xb5\x19\x6c\xb5\x3f\x50\x6f\x00\x06\x35\x2c\x7c\x44\xc0\x80\xf3\x09\x68\x01\xa5\x7a\x49\xcf\xe8\x42\x05\xbd\xd7\xa9\x80\x1f\x84\x3c\xf2\x6b\x95\x58\xa2\xdb\x78\x8e\xf1\xb2\x37\x91\x5d\x58\x7b\x9b\xa9\x77\x98\x90\xf6\x1f\xdc\x91\xe0\x3e\x4f\x4c\xdb\xef\xe4\x17\xcc\x22\xd5\x22\xa8\x6a\xdd\xdb\x53\xf3\x74\x74\x50\xab\x62\xb5\x76\x56\x5d\xb3\x2e\x0c\xd4\x42\x76\x54\x7d\x9a\x16\x65\x3c\x27\x96\x59\xdd\x4d\x17\xec\x04\x82\x7c\x53\x3e\x33\x39\x0f\xe9\x4f\x79\x35\x09\x25\x6d\xb6\x75\x31\x73\x6a\xb3\xfc\xee\x2a\x30\x1a\xc3\xf0\xa2\x4d\x3b\x10\x8d\x7e\x75\xc3\x2a\x5a\xba\x36\xd6"}, -{{0x29,0xb2,0x88,0x1b,0x8c,0xaa,0xdb,0x33,0x6e,0x78,0x80,0xc5,0x10,0xb8,0x00,0x85,0xf4,0xb1,0x22,0x18,0x60,0xb3,0x01,0xeb,0x45,0x25,0x65,0x07,0x52,0xa6,0xd2,0x89,},{0x0c,0x5c,0x44,0xed,0x29,0xd2,0x1b,0xca,0xde,0xe2,0x1c,0xbd,0xe6,0x1a,0x9c,0xdb,0x6d,0x59,0x36,0x00,0x9b,0xa2,0xf5,0xb2,0xe7,0x77,0xc9,0x24,0xdd,0xfb,0x67,0x51,},{0x99,0xe9,0x96,0xe8,0x5a,0x49,0x4f,0x19,0x80,0xcb,0x07,0xde,0x9c,0xa6,0x16,0x5e,0x7d,0xe1,0x04,0xd3,0x9f,0xe3,0xc3,0x22,0x67,0x35,0xc5,0xda,0xa5,0x69,0x51,0x6f,0xca,0xf1,0xb6,0xe4,0xdf,0xad,0x0d,0x38,0x9b,0x6d,0xb0,0xec,0x8a,0x8f,0x20,0xdd,0x2c,0x60,0x26,0x56,0xb5,0xe7,0x61,0xc8,0xf3,0xa6,0x55,0x83,0x82,0x15,0x19,0x09,},"\x19\x74\xa2\xe2\xb4\x79\x49\xf4\x67\xa9\x31\xd1\xd9\xdd\x5c\xe1\x16\xe9\xf5\x03\x0a\xd0\x9a\x8c\xc7\x28\xd1\xae\xb1\x48\xbb\xf9\xac\xf5\x98\x74\xda\x80\xe7\x08\xd5\x3c\x66\x8f\x2f\x14\xd7\x52\x20\x71\xe9\x09\x80\x84\x27\xb2\xab\x5a\x05\xf8\xb9\x4f\x21\x50\x5c\xd2\x6a\xbc\x53\x45\x89\x78\xc7\x84\xd4\x79\xea\x6d\xab\x10\x5c\x4f\x79\x84\xa0\xfb\x97\x90\xe5\x06\x24\xf4\x73\x4b\x55\x19\x05\xaa\x5f\xfa\x60\x18\x4c\xd2\x01\xcf\x2b\x26\xc9\x79\x5d\xa6\xe7\xe0\x8d\x6a\x0b\xc7\x72\x24\x00\xfe\xf9\x4f\xc2\x10\x38\xbe\x89\xd3\x4b\xcd\x14\xc4\x27\xb8\x5b\x68\x66\x73\x71\x96\x15\x2d\x4e\xeb\x66\xd0\x5b\x24\x5a\xe8\x4b\xdc\x77\x87\xc1\x4a\x8b\xec\x2e\xea\x53\x60\xf0\x42\x43\x3d\x70\x79\x44\x67\xd4\x73\x93\xb9\x37\x57\xf3\x31\xcf\x2b\x53\xc6\x60\xd7\x1c\x29\x58\x2a\xee\xa7\x9b\x12\x52\x7a\x28\xb0\xc5\xe1\x10\xdf\x6f\x85\x4e\xea\xd9\xa2\xb0\x0d\x42\x54\x2c\xa8\x27\x6b\xb8\xbf\x98\x8b\xaa\xb8\x56\x59\x96\xfe\xe5\x0c\xf3\x1b\x24\x59\xc4\xc5\x0a\xb4\x75\x26\x5e\x83\xe2\x28\x5d\x43\xfe\x1f\x75\x2a\x55\xb2\xdb\xc4\x9f\xca\x04\xa8\x10\xf0\x41\x3b\xf6\xbd\x81\xb7\x9a\xc6\x4e\xe1\xf8\x9b\x97\xbd\x7d\x26\xd6\x25\x12\x27\x3e\x24\xa6\xba\xb2\xd5\xf7\xd2\x22\x6b\xaa\xab\x7b\x11\x12\x09\xbb\x03\x73\x3d\x8a\x60\xdf\xa3\x1a\x51\x6f\x4a\x8c\x76\x99\xd8\x28\x5c\x10\x65\x15\x9a\x6c\x73\x31\xc1\xde\xfb\x47\xa3\x0e\xf5\x85\x8c\x50\xb7\xd0\x45\x12\x4a\x09\x81\x3d\x1c\xfd\xa5\xc9\xcc\x3b\xb5\xbf\xae\x73\xc9\x84\x19\x7f\x8f\x85\x7f\x18\x6c\x41\xab\x87\xfb\x79\x62\xb6\x31\xf4\xd0\x07\xcf\xbe\xe2\x21\xfc\x65\x72\x78\x4a\x55\x11\x94\xc1\x97\x77\xb0\x8e\x6b\x59\x67\x57\xe7\xcb\xa7\xa0\xe2\x7f\xe4\x53\xf9\x0d\xc5\x9c\xc0\x8c\x64\x72\x43\x1c\x02\x0e\x8d\xd0\x91\x75\x90\xe7\x9c\x1f\x20\x73\x83\xaf\xb3\x90\x76\xad\x24\xda\x8e\xe5\x24\x86\x73\x94\x53\xa2\x59\x0e\x51\xbf\xc8\x9b\x13\xc2\x03\x3c\xfa\x5f\x89\x03\xcb\xe9\x96\x1a\x85\x98\xba\x55\x62\x32\x86\x9d\xfa\xb4\xd5\x6e\xdf\x4f\x05\xe8\xb7\x7d\x05\x87\x18\x95\xe6\x3b\x53\x51\xf7\x6c\xb2\xd2\xc8\x38\x5c\x10\x9d\x73\x06\x19\x2a\x25\x44\x6e\x4d\x62\xdc\x7d\x62\x4f\x0c\x66\x73\x98\x6b\xe0\x62\x8b\x2c\x2d\x73\xeb\x94\x1d\x35\xa3\x43\x30\x90\xf5\x9b\x28\xa5\x97\x9d\x56\xdb\xc9\xfd\x69\x73\xf6\x36\x47\x64\x2c\xd9\x03\xb0\xcf\x7a\x6a\xcd\x33\x0d\x87\xe2\x29\x27\x10\xde\x99\xe0\xc1\x79\xca\x78\x92\x9c\xca\xec\xfa\xed\xbf\x27\x42\x41\x4f\x17\x6b\x60\x90\xc0\xd5\x9a\x9d\xb7\x81\xc9\x96\x7e\x28\xfa\x4e\x77\xd2\xa0\x82\xe4\x2f\x52\x16\x91\x67\xe9\x2d\x4f\xdd\x82\xe2\xcc\x05\xdd\x91\x84\xc7\xdf\xee\x49\x0a\x23\x7f\xda\xd4\xdf\xeb\xc0\x18\x68\xe0\xa4\x35\x3a\x29\x54\xd0\x90\x92\x84\x61\x82\x1a\x7a\x84\x8d\x1b\x60\x81\x7f\xc3\xbd\xef\xa1"}, -{{0x42,0xaf,0xe8,0x9d,0xac,0x83,0xe7,0xd3,0x89,0x96,0xc0,0xdb,0xce,0x0c,0x98,0x74,0xc0,0x09,0x27,0xba,0xbd,0x77,0xca,0x8c,0xea,0xc3,0x4e,0x56,0x44,0x74,0x28,0x2b,},{0xa4,0xc5,0xf5,0xe3,0x80,0x3f,0x0a,0x03,0xd5,0xc1,0xc9,0x06,0xca,0xec,0x9c,0xc6,0xd2,0x85,0x14,0x07,0xf1,0xca,0x29,0xf7,0x2a,0x45,0xf2,0x33,0xe6,0x65,0x62,0x44,},{0x4f,0xba,0x2d,0x6c,0xc1,0xb7,0x19,0x3d,0x35,0x62,0xf8,0xc8,0xbf,0xe6,0x90,0x5c,0x82,0x9d,0xb2,0x65,0xa5,0x42,0x7c,0x5c,0x26,0x57,0x14,0x78,0x5b,0x83,0xf6,0x95,0x14,0xc5,0xe3,0x0e,0x28,0xb5,0x66,0x84,0xc8,0x2d,0xae,0x26,0x37,0x58,0x1b,0xf3,0xf4,0xef,0x27,0x14,0x20,0xbc,0x7e,0x60,0x10,0x61,0x3a,0x38,0xfa,0x10,0x1a,0x0d,},"\xe7\x10\xa1\x63\xad\x28\x85\xae\xb7\x65\x8e\xb3\x74\xf1\x18\xb7\x68\x42\xec\x36\xef\x3b\x01\x0c\x3c\x6b\x95\x59\xe8\xb1\x60\xc2\x62\x8d\xed\x0b\x85\x11\xeb\x49\x07\x18\x0d\xa4\xb6\x21\xe9\xaa\x4a\x32\x22\x88\x88\x8a\x1c\x09\x13\x0f\x69\xf8\x90\x59\x7a\x92\x93\xe7\x4f\x92\x89\xbd\xaa\x5c\x91\xb6\xfd\x24\xaa\x04\x4a\xb9\xfc\xb3\x40\x2f\x7a\xbc\x48\xd2\xab\x7b\x38\x80\xa0\x48\xda\xa4\x48\x64\x5a\xd2\xec\xb5\x5b\x3c\xae\xe2\xd6\x8a\x8b\xed\xb5\xd1\x86\x5d\x5e\x21\x1d\xe3\x9b\x0e\xaf\x22\xe5\xda\xf1\x0f\x71\x68\x20\x3a\xa1\x5b\x85\xaa\x47\xbb\xd3\xcc\x41\x69\xcb\xc1\xfe\x80\xb4\x70\x0b\x62\x58\x71\xed\xab\xcd\x4f\xe7\x4a\x3e\x96\x55\x69\xce\x24\x5c\xfc\xde\x42\x09\xcc\x8a\xbc\xd6\x79\x7d\x44\x18\x5b\x4f\x96\xc0\x18\x1b\xbd\x27\x00\x87\x83\xe9\x35\x8a\x53\x94\xfe\x3a\x34\xa0\x68\x71\xd3\x79\xda\x35\xb2\x0b\xb5\x7e\xef\x9e\x55\x24\xee\x79\x12\xa6\xf4\x1b\x4a\x1f\x68\x4c\x39\x19\xcf\xcd\xc0\x0f\x45\x80\xba\xf9\xe0\x9d\x31\x6c\xef\xa0\xf4\x65\xdc\xa5\xd8\xee\xc5\x14\xe9\x5e\x5a\x57\xbb\xcd\x27\xe4\x1f\x81\x19\xb2\x64\xae\x14\xa3\x19\xd8\xc3\x85\x9b\xab\xf1\xf4\xa6\xb6\xb7\x7e\x44\x2c\x86\x1d\x6e\xe2\x8a\xd1\x2b\x82\x36\x2e\x90\xdb\x0c\x36\x72\xb0\xe0\xd9\xff\x58\x14\x6f\xd1\x59\xaa\x8f\xa9\x9d\xc7\x55\xfc\x85\xb9\x0c\xf9\x41\x92\x79\xc0\x62\x4b\x93\xe7\x5e\xda\x0e\xf7\xc0\x96\x95\xae\x93\xbd\x72\x82\x41\x93\x77\xb7\x6c\xa8\xbd\xc0\x52\x1c\xfe\xe6\xf6\xd7\x29\xc3\xad\xff\x89\x46\x87\xb1\x77\xef\x19\x52\x9a\x6b\xda\xce\x70\xb6\x85\xc6\xd7\xa5\xd7\x4a\x08\xe2\xa9\xe7\x24\x03\x59\x75\xc8\x0d\x18\xcb\x36\x94\x70\xde\x72\x99\xcb\xd6\xb0\xa2\x7c\x92\x32\xc7\xea\xba\xc8\x6d\x50\x93\xa6\x5f\xfe\x0b\x40\xd4\x0b\xef\xe8\x0b\x68\xcd\x9d\xce\x1e\xa1\xe6\x57\xe4\x5e\x9c\x49\x9d\x0b\x69\x0f\x74\x45\x5f\xb4\x70\x96\xed\x8c\x18\xd1\x51\x7f\x90\x44\x29\x01\xa6\xc4\x10\xb7\xf6\x41\x5f\x20\xae\x48\xc5\x8a\xde\x8d\x67\x5b\x6c\x05\x8d\xf1\x6a\xe7\x69\x8f\xce\xae\x95\xaa\x77\x1b\x4c\xd8\x8a\x0b\x3f\x22\xc5\x1f\x98\xc7\x1c\x1e\xb4\x6b\x26\x4b\xf9\x7a\x30\x0e\xcb\x1f\xd2\x62\x26\xad\x8e\x87\xa0\x58\xcf\x3e\x70\x8e\x26\x0f\x56\x6b\x68\x53\x14\x04\x51\x33\xf4\xa5\xe8\xfb\xc3\x45\x61\xb9\xa0\xf1\xff\x93\x39\xf5\x52\x31\x07\x6b\x73\x6b\x6e\x11\x52\x43\x19\xa2\x72\xbd\x44\x53\xa0\xaf\x14\x93\xda\xa0\x91\x67\xe8\x46\x43\xd2\x07\xa0\x2f\xee\x98\xfb\x22\x3b\x01\xa9\x9a\xa5\xce\xf2\xb7\x00\x1e\x47\x0f\x6f\x94\xa5\xdc\x20\x8e\xdf\xc0\xcb\x8c\xf3\x11\x4a\x91\x96\x00\xf0\x61\x17\x2f\x0e\xfe\x03\x90\x36\xbf\x4d\xdd\xbf\xd0\xd4\x5f\x91\x44\x3b\xf2\x6f\x8e\x15\xed\x7d\xb8\xe5\x5f\x08\x6a\x4a\x45\x83\xf4\xbd\xa0\xf5\x56\x28\x4d\xcf\x71\x29\x2f\xe7\x0f\xca\xa8\x25\x9b\x9f\xaf\xf3"}, -{{0x10,0xf0,0x09,0xaa,0x88,0x7d,0x91,0xce,0xd8,0x09,0xaf,0xe1,0x92,0xd7,0x8e,0x47,0x99,0xd9,0x03,0x77,0x62,0xf4,0xa9,0xd3,0xa4,0x29,0xfd,0xe0,0xf3,0x9f,0x7b,0x7a,},{0xcf,0x51,0x16,0xb9,0x21,0x21,0x2e,0x9b,0x78,0x82,0x9a,0x02,0x63,0x46,0x36,0x91,0xc6,0xfb,0xcc,0xdc,0x0c,0x11,0x8b,0xe1,0x41,0xc9,0x6f,0x8c,0x88,0x05,0x3d,0xd3,},{0xc3,0x7b,0xb7,0xb7,0x3b,0x11,0x05,0xbe,0x08,0x6f,0xf3,0x07,0x69,0x72,0x07,0x72,0x62,0xdf,0x4d,0x73,0x32,0xf6,0x08,0xc7,0xb2,0xb9,0xd9,0x78,0xd4,0x74,0xcb,0xbc,0x27,0x10,0x46,0x08,0x00,0x35,0xf3,0x96,0xee,0x36,0x47,0x9b,0x7a,0x67,0x11,0xc6,0x8e,0x25,0x61,0xc7,0x41,0xc0,0xec,0x5f,0xc9,0xec,0xa1,0x73,0x4e,0x81,0x1f,0x04,},"\x2e\xdf\x14\xd6\xcd\x56\x89\x6e\xea\xa7\x70\x21\x1c\x49\x84\xbe\xd8\x0e\xca\x8d\x65\x34\xd5\xd5\x10\x88\x4f\x55\xf1\x1f\x99\xff\xa9\xf8\x9b\x58\x6f\xfe\x7b\x1e\xc7\xea\xab\x6a\x9d\xc1\xa2\x4a\x3e\xe3\xc7\xa6\xab\x44\xad\xe9\x91\x78\x83\x26\x4e\xde\x2f\x13\x61\xbe\x7d\x7a\x38\x17\xf2\x9d\xec\x95\x81\xc3\x19\xf1\x8f\x95\xd5\xbe\x26\xd9\x11\x8b\xe6\x78\x34\x00\x37\xa6\x8a\xbf\xc5\xef\xbb\x9a\x3f\x3f\x38\x78\xaa\xe3\x72\x1f\xfe\xf5\xbb\x6a\x26\xc7\xb1\xa3\xa5\x6d\x2b\xda\x6c\x6e\x86\x0e\xb4\x1f\xd8\xd8\x37\x11\x74\xd9\x1c\x74\xc5\xeb\x67\xc3\x85\x5c\x63\x0d\x64\x1d\x2e\x57\x1a\x9a\x51\xc6\x40\x2c\xfe\x18\x42\xce\xf3\x89\x80\xcb\x8d\x0a\x64\xbc\xc8\x9b\xe3\x18\x9e\x68\x11\xf4\x7e\x8f\x4d\x00\x63\xa5\xb1\x60\x1f\x44\xfd\xa2\x0c\x1c\x4c\x2f\xc4\x9c\xbe\x27\xa4\x13\x7d\xc4\x63\x8c\x2a\xd2\xd0\xa5\x47\x47\x47\x22\x9c\x56\x8e\x38\x05\x43\x1f\xa3\x6e\xeb\xa7\x85\xf7\xb9\x78\x44\xb5\xe3\x19\xfa\x6a\x09\xcc\x5a\xe8\x40\x34\x74\xbb\x91\xdd\x89\x6c\x1e\xc2\xba\xc7\x3d\x2e\x50\x5e\xfc\x62\xbd\x50\x2b\x5c\xeb\x08\xd1\x6e\x83\x2e\xc5\xdc\x4f\x98\xb5\x1b\x9d\x07\x38\xb9\xfb\x28\xf3\xab\xe8\x96\x6b\xf2\x23\x75\xa0\xb2\x2c\x47\x1a\x9e\x58\xe3\xfd\x70\x0d\xe1\x5c\x52\x96\x37\x3c\x1b\xc9\xd4\x64\x0e\xb7\x81\x6e\x1d\xc9\xc8\xce\x86\x19\xa8\x11\x83\x00\x9e\xc9\x74\x87\x1e\x8f\x0a\x97\x72\xed\xe0\xa6\x38\xb3\x57\x4b\xf7\x5d\x8f\x55\x98\x7f\x3c\xfa\x6f\xec\x68\x97\x0b\xfe\x00\xb2\x3b\x59\xfb\x5b\xf4\x99\x6e\xa5\xd7\x70\x4f\xcf\x2e\xff\xcc\x0f\xd7\xf3\xd8\xe6\x05\x60\x08\x09\x7f\x26\xca\xff\xd5\x41\x5a\x28\x2a\x27\x6a\x9b\x26\x45\xe5\xca\xb1\x29\x68\x87\x2e\xb0\x52\xf4\xd7\xc1\x0c\xc7\xc2\x1d\x51\x61\x81\x8b\xb4\x4c\xc8\x56\xb0\xde\x76\x9d\x55\x9c\x55\xdf\x64\xad\x9a\xdc\x16\xc0\xac\x65\x83\x8f\x66\x0d\xa8\x13\x86\xb7\x0b\x93\x52\x5e\xc2\xf4\x0f\x6f\x63\xf8\xea\x5d\x48\x30\xb9\x64\x6c\x46\x18\x3b\xb4\xe6\xf2\x70\x47\xbd\xa2\xa5\x46\xbd\x34\xbd\x4d\xb5\xfb\x88\xfd\x8a\xb7\xc7\x5f\x65\x2e\x15\xd5\xaa\xa6\xb4\x6a\x8a\xcf\x6e\x44\x8b\xf2\xdd\x64\xde\xe3\xc1\x05\x64\x7c\x7f\x83\xad\x20\x0d\x80\x97\xc4\x44\xa1\x58\xd8\x5a\x54\xf0\xe5\xdb\xb1\x2b\x43\xde\x94\x3a\xf1\xa8\x18\x56\xac\x96\x9f\x52\xa0\xbd\x45\x43\x81\xbd\x26\x50\x41\xa2\x69\x1d\x1a\x4a\x0d\x81\x9f\xa7\x90\x92\xc8\x80\x35\x21\xfa\x53\x68\x9a\xb8\x52\xf1\xfb\xab\xe0\x0c\x94\xb7\xf6\x82\xd1\x21\xcf\xf5\x43\x91\x32\x25\x29\xc8\xd5\xad\x7b\xbb\x98\xea\xfe\x30\x0a\xb9\x22\xf1\xc8\x92\x40\xa1\xe6\x33\xcf\x56\xa7\xb0\x2f\x74\xa2\x92\x14\xe5\x69\xa0\x57\xbd\x58\x5e\x40\x4d\x7c\xd5\x35\x20\x41\x45\x6e\x6c\xf9\x0c\x15\x34\x2e\x02\x56\x70\xf4\xfc\xcd\xf9\x87\x83\xb6\x85\x32\x14\xca\xc3\xfa\x80\x8a\x66\xc2\x7b\x65\x3c"}, -{{0x45,0x78,0xc6,0x5a,0x7c,0xa4,0x8f,0x27,0x74,0x05,0x0a,0x7b,0x0c,0xe7,0xa4,0xfd,0x5a,0xd4,0xe6,0x96,0xb2,0xb8,0xaf,0x23,0x96,0x16,0x4a,0x1c,0x7e,0x1b,0x7b,0xd7,},{0x15,0xbf,0x9d,0xbd,0x3b,0x81,0x73,0xe6,0xf0,0x3d,0xcf,0xd5,0x75,0xd9,0x09,0x84,0x5f,0x03,0x8e,0xaa,0x09,0xc5,0xd9,0x08,0xfe,0xf9,0x08,0xa9,0x74,0x58,0xb3,0xef,},{0xa1,0xc2,0x42,0xb4,0x5e,0x94,0xfd,0x18,0x0f,0x05,0x4c,0x71,0x01,0xe5,0x5b,0x39,0x65,0x68,0xf4,0x83,0xdb,0x6f,0x0d,0xfc,0x41,0x68,0xb6,0x9b,0x59,0xd3,0x85,0x81,0x4c,0x19,0xeb,0x30,0x75,0x23,0x7d,0x1f,0xbb,0x1f,0xee,0xbb,0xfe,0xa5,0x0c,0x56,0x81,0x3c,0x8c,0x39,0xc2,0x27,0x52,0xe0,0x2d,0xb7,0xe5,0x7f,0x3e,0x3f,0xbf,0x0d,},"\x50\x6f\x32\xb9\x68\x14\x24\x3e\x4d\xd8\x87\x0a\x8f\xd6\x0d\xde\xf0\x9b\xb8\xc5\x63\x15\x10\x70\xd9\xbc\xb2\xb1\x60\xa3\xea\xbd\x71\xa0\x44\xd7\x1e\xc9\x3f\xba\x95\x28\x8e\xd6\xfe\x1a\x7b\x92\x16\x51\x60\x43\x07\xd6\x5a\x45\xec\x5d\x3f\x26\x31\xac\xe4\x0e\x58\xd5\x3c\x72\xe5\x26\x88\x6e\x16\x97\x2f\x6e\x0d\xb9\x4d\x57\xb5\x56\x34\xfd\x39\xd5\x5e\x9b\xb7\xf2\x12\xaf\xab\x00\xf7\x74\x64\x09\x26\x7e\x8d\x56\x5f\xf5\xc2\x25\x73\x33\xc3\xd0\x41\x52\x17\x4f\xe1\x2d\xe6\xa5\x7b\xea\x05\x7d\xc2\x19\xe2\xfb\xa5\xf1\x91\xed\x81\x41\xc0\x18\x96\x9d\xe1\x94\x72\xd6\xaa\xf7\x63\xf1\x9e\xc5\x54\x70\x2b\xb3\xdc\xbe\x13\xca\x9b\x23\xb2\x41\x8c\x99\xe7\x18\x38\xa8\x8c\xf4\x54\x72\x8c\xf9\x20\x8a\x16\xc8\x4e\xa3\x98\x29\xb4\xba\x9b\x4c\x77\xe1\x76\x11\x2b\xfe\x1b\xf3\x5f\x95\xc4\x02\x8c\x7d\xb8\x0b\x36\xfa\xa2\x9d\x2b\x89\xe9\xe8\x62\xf3\x10\x00\x06\x5f\x13\x9b\x3d\xa7\x7d\x9d\x86\x85\x30\x57\x4b\x7e\x39\x1e\xd9\x7b\x34\xf8\x78\x16\x4f\x6b\x8d\x87\xb4\x06\xc7\xdc\x78\x60\xa5\x17\x5f\x92\x0e\x5a\x62\xdc\x1f\xc8\x2e\xd8\x45\x25\x43\xb1\x07\x36\x0d\x35\xd2\xb4\xc4\x23\x9e\xab\x46\x6d\x32\xbf\xda\x34\xf5\x10\x37\xa6\xfa\xe7\x6f\x6d\x8b\x83\xe8\xf7\xf4\x89\xdd\x4c\x1b\x49\xc3\x8f\x53\x57\x6e\x62\x17\x2c\x17\xde\xe3\x66\x5f\xde\x8c\xbf\x01\x5a\xf9\x66\x5b\x0f\x1d\xa2\xfb\x77\xb1\x34\xf0\x4b\xe2\x71\xe4\x02\xf3\x15\x37\xc2\xfc\x05\xc2\xf9\xb6\xfc\x3f\xfe\x47\xde\x33\x69\x13\x38\x67\xc6\x9d\x10\xe7\xf5\x37\xba\xe4\x56\x7d\x46\x8e\x0f\x2e\xd8\x06\xfe\x33\x5f\x93\x9c\x75\x99\x4f\x36\x3c\xe3\xb7\x0d\xaa\x7d\x5b\xd2\x31\x7c\x83\x38\x51\xfd\x8c\xc9\x72\x51\xec\x41\x90\x23\xd9\xd0\x17\x4d\x84\xd5\x60\x9a\x69\x18\xa1\x74\x0e\xb1\xe3\x09\xbd\x12\x73\x66\xde\xb9\xc5\xab\x12\x99\x2e\x99\x02\xe0\x15\xfe\x58\xd6\xad\xbf\x52\xd2\x2a\x76\x0a\xcd\x63\xe1\xed\xd8\xf1\x38\xe9\xfb\x01\x37\x18\x86\x01\xe1\x97\x8e\x7d\x04\xfb\x2a\xda\x2b\x2a\xee\x12\xf4\x9f\x28\x36\xc6\x84\x2d\x88\xcf\x48\xc8\x66\xe3\xd3\x3f\xcd\x26\x9c\x27\x5c\x89\xc2\x5e\x36\x69\xca\x90\xde\x7b\x67\xa7\xe7\xa3\x82\xcb\x7e\xfa\x47\xe9\xc2\xbf\x76\x57\x1c\x79\xa2\x50\x85\xef\x02\x04\x87\x15\x2f\x06\xbf\xa1\x33\x01\x5a\x1b\x8f\x1c\x0f\x6a\x9f\x0e\xae\x1b\xa6\x2b\xf1\x04\xf1\xc1\x6a\xc1\x4e\x1e\x96\xc4\xeb\xdf\x06\x1e\x0c\xc7\x10\x1d\x38\xda\x7e\x9e\x09\x94\xda\xf0\xf3\x22\xaa\x3c\xfe\xf9\x1b\x61\x6c\x2d\x00\x06\x89\xab\x18\xed\x45\x26\x8d\xcd\x27\x50\x94\xf6\x56\xba\x3c\xf5\x15\x26\x10\x24\x74\x1f\x74\x44\xab\x7f\xc4\xde\xcc\xe1\x67\x56\x03\x2a\x1b\xe2\x70\xff\x0b\x03\x17\x54\x2b\xa0\x26\x62\x26\x0a\x37\x6f\xc9\x12\xcb\xb0\x29\xca\xc5\x45\x15\xf5\xa5\x51\x36\x4f\x6a\x99\xff\xad\x0b\x9c\xbc\xd0\xe6\x93\xb7\xa5\x21\xcb"}, -{{0xc2,0x1e,0x70,0xc4,0x6e,0xde,0x66,0xe6,0x8a,0x88,0x73,0xbb,0xc6,0x4b,0xa5,0x12,0x09,0x30,0x3a,0x0a,0xc4,0xfc,0x49,0xb1,0xd8,0x3e,0x81,0x93,0xad,0x46,0xc0,0x37,},{0x9f,0xbf,0x80,0xa4,0x25,0x05,0xd2,0xc9,0x52,0xf8,0x9f,0x45,0x58,0xc3,0xe6,0xd1,0x87,0xa7,0xbc,0x1e,0xf4,0x46,0xb2,0xe3,0x73,0x23,0x43,0xc1,0x3b,0x33,0xd2,0x00,},{0x0a,0xe3,0x43,0xbb,0x84,0xe3,0xa2,0x99,0x07,0x8e,0x24,0x34,0xba,0x22,0x00,0x22,0xf3,0x16,0x0f,0x96,0x8a,0xc0,0x44,0x82,0xbf,0x8c,0xad,0x13,0xb4,0x23,0xf2,0x67,0x0f,0x01,0xfb,0x5f,0x7b,0x32,0xc5,0x97,0x52,0x0f,0x84,0x60,0x7e,0x0f,0x79,0xc0,0x75,0xfa,0x70,0x78,0xe6,0xe6,0x9d,0x3c,0xec,0x31,0x92,0x65,0xd4,0x66,0x08,0x0b,},"\xf5\x5a\xa5\x70\xce\x4f\xc9\x5f\x73\xf5\x17\x20\xd2\x54\xe4\x69\x5f\xcd\xc8\x1a\xaa\x04\x01\x30\xc7\x68\x7f\x03\x9b\x8b\xa5\x9e\xd8\x57\xce\xb2\x9c\x12\x10\x25\xa8\x57\xfe\xac\xb4\xa0\x1f\x38\xe0\x11\x78\x31\x0a\xe6\xe3\x5c\x99\x8e\xbf\x89\xdd\x79\x05\x7b\x4a\xfc\x6d\xb3\x40\x60\x1c\x81\x70\x3c\x87\xa8\xc4\x0e\x5c\xeb\xb0\x44\x1d\xf7\x8a\x6d\xe1\x3a\x44\x7c\xb0\x16\xc6\x5e\x74\x1b\xb7\xdf\x30\x4d\x83\x05\x6b\x72\xc6\x82\xc7\x31\xfa\xc0\xa0\xc7\x0b\x78\x11\xca\x14\xa5\x01\x54\x61\x30\x99\xc2\xc4\x37\x52\x1c\x40\x4b\x63\x61\xde\x36\x21\xf8\xea\x56\xb0\x8e\xbf\xdb\x07\xb4\xf2\xbb\x8b\xa2\xec\xc1\x64\x33\x6d\xa8\xef\xc9\x42\x76\x6e\xf0\xc7\x4d\xfd\x3b\x49\xe0\x87\xe9\xa2\x7a\xe5\x4a\x7a\x2b\x98\x28\x1b\x9a\xf9\x3d\xc1\x1a\xa2\xf0\x92\x24\xab\x5a\x73\x0f\x02\x18\xf4\xa6\xe1\xea\x48\x85\xa7\x7f\xbd\x93\xa1\xc5\x82\x77\xd9\xe0\x1b\xe7\x3a\x25\xcd\xa9\x18\xfc\x27\xdd\xdb\x45\x3a\x5d\xa6\x90\x2a\xd0\x2b\xa0\x57\x75\xc6\x7e\x07\xbe\xa4\xdf\x86\x91\x34\x66\x74\x43\x65\xc1\x32\x6e\x0a\xb5\xe1\x25\x4c\x17\x96\x74\x47\xd5\x91\xba\x5e\xd1\xb6\x3a\x42\x54\x3b\x87\xfe\xd4\x14\x59\xa0\x89\xbc\xea\xff\x21\x98\x02\xa8\x7a\x87\x2a\x76\x3e\x69\x23\x33\xce\x1c\xc7\x39\x78\x25\x08\x4b\x2b\x83\x1e\x93\xd8\x0d\x67\x37\xf3\x29\x80\xf2\xf3\xae\x82\xc6\x21\x90\xfe\x3f\xa7\x00\xc5\xb7\x32\x9d\x6d\x50\x04\x2b\xdf\x83\x1f\x37\x54\x8f\xcc\x80\xb1\x1f\x57\xcf\x20\xf6\x7a\x3b\xb6\x51\xa7\xbe\xff\xcc\x48\xb7\x0d\x17\xeb\x60\xf7\x25\x9c\xc5\x3b\xf7\xff\x60\x80\xeb\x2b\xd0\x92\x3b\x04\x83\xaa\x30\x65\xa8\x95\x5f\x01\xd2\x3b\xa8\x09\x51\xe0\xae\xfd\x2a\x93\x72\x19\x15\x72\xbc\x52\x91\x6a\xa2\x2a\x2a\xec\x39\x37\x67\xfa\xfd\x08\x68\x39\xe2\x36\xfe\x04\x60\xce\x6d\x63\x9c\x7c\xe6\x9f\xe7\xf9\xd3\xaa\xd2\x13\x05\x73\x44\x35\x70\x44\x3b\xe6\xba\xb9\x3a\x06\xa5\x4b\x8a\xc2\x9b\xf3\x3f\xf9\x94\x9b\xc9\x21\x58\xe6\x92\x4b\x6b\x68\xec\xda\x5f\x6f\x3a\xaf\x42\xb3\xd2\x2d\xf6\xd5\xe6\x7d\x5c\xb3\xab\x71\xeb\x8e\xe0\xb0\xe6\x67\x32\xe1\xda\xca\x6c\xd6\x0d\x9a\xa7\x43\x05\xfc\xd5\x70\x07\x6d\x22\x8d\x44\x6d\x5e\xe5\x42\xb1\x04\x88\xbf\x8a\xa9\x88\xf4\x51\xfa\xeb\xe7\x4a\xb6\x69\xd6\x04\xd9\xdd\xb1\x51\x06\x62\x0e\xa0\x2e\x8d\xb3\x8c\xe6\x39\xb5\x74\x78\x12\xbb\x90\x48\xee\x8b\xf7\x2b\x1a\x95\x1a\x05\xdf\xfa\xc9\x54\x17\xcb\x43\xb0\x6d\xce\x61\xee\x3d\xa6\xf2\x83\x2e\xe8\x3b\x2e\x72\x88\xdd\xd6\x2e\xeb\x58\x93\xf7\xf2\xf6\xc8\x09\x0d\x99\xe3\x36\xc9\xf9\x06\x9e\x18\x15\x98\x58\x41\xbd\xd5\x05\xb5\xf8\x3d\x89\x5e\x87\x95\x93\xda\xde\xe7\x2c\xeb\x97\x65\x69\x9b\xf8\x0b\xd0\x6a\x5c\x55\x33\x1b\x25\x45\x52\x7d\x0c\x7c\xae\xce\x96\x58\x4c\xe3\xec\x7f\xe0\x22\x60\xf2\x0b\x8a\x1c\x06\x35\x76\x3f\xf4"}, -{{0xf2,0xc1,0x05,0x77,0xf7,0xdf,0x77,0xf0,0xc1,0x15,0x7a,0x8c,0x33,0x1a,0x7b,0xd2,0xae,0x63,0x86,0x67,0x0e,0xb6,0x5f,0x0f,0xae,0x12,0x23,0x31,0x69,0x0f,0x82,0x8a,},{0x0d,0x4c,0x34,0x0f,0xc2,0x31,0xaa,0xfb,0x3b,0x6f,0x74,0xb8,0x9b,0xce,0xf7,0xee,0xaa,0x0b,0x04,0xf2,0x93,0xec,0x85,0x44,0x24,0x7b,0xfc,0x3f,0x2d,0x57,0xc1,0xe0,},{0x60,0xb7,0x03,0x11,0x5a,0x32,0x2a,0xb8,0x92,0xc2,0x76,0xbf,0xd1,0x8f,0x70,0xa9,0xeb,0x0c,0x73,0x23,0xe2,0xc0,0xa6,0xeb,0x5f,0xc7,0xe3,0x30,0xb0,0xbc,0x3b,0x07,0xa5,0x78,0xa0,0x82,0x84,0x62,0x64,0xf0,0x32,0xc6,0x19,0x1d,0x04,0x0b,0xd9,0x8e,0x5d,0x5a,0x4d,0x4f,0x07,0x6f,0xb9,0x06,0x2a,0xcd,0x36,0xbe,0xa4,0x0c,0x91,0x02,},"\x38\xea\x1e\x02\x8a\x49\x3d\x1c\x60\xec\x70\x74\x9f\x14\xd4\x36\xeb\x3a\x2b\x2d\xe5\x4f\x21\x3d\x01\xa6\x45\xb5\x80\x43\x0e\xcd\x8e\xce\x6b\x55\x69\xcc\x01\x7a\x49\x43\xe5\x59\x5c\x5e\xd6\xe4\x8c\x94\x43\xf2\xfa\x5e\xb2\x22\x7f\xfe\x56\xd2\x11\xf2\x69\xbc\x8f\x6f\xa9\xee\x8c\xd5\x6f\x6b\x84\x70\x53\x92\x08\xaf\xe2\x9a\xb0\xa1\x95\x04\x4d\x95\x7b\x31\xf9\x3e\x18\x4a\x9c\xbe\xf1\xa1\x4e\x14\xf8\x08\xbb\xf5\x89\xac\x77\x70\x08\x4f\x99\x8e\x1b\x25\x4d\xa5\x9c\xa6\xd3\xe6\x2e\x7b\xe1\x79\x07\x16\xd2\x56\x0f\x01\x5f\x39\x9c\xbb\xce\x48\xcf\xd0\x39\x1e\xad\x19\x93\x44\x6f\x6b\x24\x93\x97\x7d\x93\xd7\xb0\x9a\x07\xa7\x9a\x59\xce\x15\xdc\xe7\xa1\xda\x9c\x64\x6f\x45\xaf\x2c\xca\xd5\x5b\xa1\x58\xe6\x38\xc4\xa3\x0c\x5d\x30\xe9\xac\x6e\x3a\x33\x39\xc2\x43\x42\x6d\x86\x49\x1b\x2d\x92\xda\xc1\x47\x8e\x8d\x74\xff\x0b\xf1\x49\xbd\xb5\xe0\x9e\x3f\xb6\xb8\x26\x2e\xb0\x68\x79\x81\x55\x4a\xe2\xcb\x47\x19\x63\x39\x07\x9d\xa0\xa1\xa5\x72\x39\xc1\x9b\xf7\x81\xf6\x2f\xda\xf4\xe3\x15\x60\xa8\x43\x17\xef\x03\x04\x92\xcf\x1b\xb1\x30\x5b\xa8\x51\x8e\xba\xf2\xb4\x34\xd3\x64\x16\x72\xc8\xf6\xea\x2d\xef\xa6\x96\xdc\x7e\x4f\x39\xef\xc0\x8d\x28\x8d\x1c\x96\x6a\x6c\x71\x48\xc0\x12\xee\xc4\x39\xf7\xe1\x2d\xba\xb5\xb8\x7c\xfa\x44\xc9\xae\x19\x00\xf8\x38\x6f\x24\x44\x4e\x10\x92\xb2\x3a\x27\x4c\x13\x8e\x95\xc6\x61\xe9\x37\x7e\x8a\xd2\xd1\xfc\xaf\x19\x39\xec\x9a\x63\x2a\x87\x3f\x7e\xad\xbe\x68\x7b\x4a\x03\x3b\x92\xa4\x77\xf2\xe0\x2e\x9e\xd9\x2c\xe4\xf9\x5c\xf1\x70\xb3\x90\x15\x18\xa0\x62\x14\x3e\x56\xdb\x05\x4d\xf4\xe4\x43\x15\x44\x78\x5a\x6d\xfa\x24\xee\xc0\xf0\xde\x7a\x69\x9c\xcf\x28\x6d\xad\xfa\xd8\x59\x03\x61\x22\x50\x76\x4f\x25\xcd\xea\x81\x27\xd0\x07\x8d\x55\x48\x25\xea\x6e\x73\x71\xc4\x38\xbc\x46\xf2\x9f\xb8\x93\x7f\x8d\x9a\x39\xcf\x88\x49\x05\x2d\x43\xec\xbf\xf6\xc4\xa3\x76\x2a\x5f\x40\x0c\x15\x14\xe8\x5e\x91\x38\x4f\xef\x9b\x40\xf4\x31\x4e\x22\x3a\x9d\x68\xc5\x26\xac\xc7\x02\x27\xd6\x2b\x8b\x63\x7a\x34\x2d\xf1\x13\xd3\x18\x20\x2c\x51\xed\xd3\xc1\xef\xd1\xff\x20\xb1\xff\x07\x8b\x32\x06\x8e\x79\x4d\x92\x81\x33\x03\x7f\x1e\x3a\x34\x68\x9e\x62\x9e\x43\xfd\x2b\x8e\x88\xea\xb5\x0d\x7e\x7a\xb0\x64\x70\x14\xab\x5e\x4a\xd5\x82\x00\x65\x67\xef\xf7\x2b\x5a\xf2\xda\xc5\x36\x89\x2c\xcc\x87\x1f\x8a\x80\xb5\xcb\x79\xd9\x0b\xcc\x6b\x77\xd4\xcd\x08\xf8\x76\x18\x4e\xf5\x8c\x06\x4a\xe4\x30\xbb\x79\xa6\xb9\xe9\x6b\x0a\xd8\x73\x68\xaa\x83\x8a\x8d\xcc\xff\xac\x0c\xd8\xce\x9e\xa0\xd0\xec\x4c\x4b\x0f\x42\x67\x34\x16\x65\x9c\x98\x49\x92\xcf\x53\xb1\xe4\x45\x43\x10\x07\x64\x0d\x47\xec\xe2\x6d\xee\x4a\x29\x43\xaa\x70\x97\xdd\x35\x6c\xff\x47\x54\xf2\x1a\xc0\x7f\x6b\x3f\x73\xc4\x69\x05\x55\x12\xf3\x7a\xba"}, -{{0x04,0x1a,0x97,0x90,0x6b,0x59,0x56,0xb9,0xd3,0x40,0xf2,0xe0,0xd7,0xa1,0xdc,0xbf,0xef,0xe6,0x63,0xe9,0xbb,0x40,0x26,0xf8,0xcc,0x1a,0xe7,0xe2,0xa1,0x4d,0xe2,0x7e,},{0xf3,0x82,0xd3,0x2e,0x88,0xc3,0xa7,0x2c,0x7c,0xad,0xda,0xfc,0xf8,0xaa,0x69,0x9e,0x21,0xdb,0x7a,0x6b,0xf4,0xed,0xd6,0xe4,0x9a,0x00,0x5a,0xad,0x70,0x2e,0x6a,0x79,},{0xa2,0x3f,0x03,0x2e,0x66,0x92,0xa0,0xe8,0xbf,0xee,0x5b,0x2d,0x30,0xb4,0x14,0xcb,0x16,0xc3,0x5a,0xd0,0x8d,0xa3,0x1f,0x69,0x6d,0x46,0x1a,0x02,0x85,0x78,0x22,0xc4,0xef,0x35,0x7f,0x0c,0xcf,0x31,0x02,0x5a,0x4d,0xc9,0x5c,0xed,0x30,0xa9,0x94,0xf4,0x1e,0xdd,0x1d,0x08,0x7a,0xfc,0xaa,0xf3,0xe8,0xe8,0x75,0x70,0x83,0x20,0xf8,0x0c,},"\x71\xa7\x59\x57\x41\x15\x44\x97\x5a\x48\xcf\x10\x3a\xa1\xf8\xe2\xad\x15\x24\x44\x59\xcd\xc0\xe3\x36\x96\x6e\xb8\xb2\x6c\x97\xf2\x16\x9e\x5d\x78\x53\x70\x37\xef\xc0\x77\xe8\x6f\x06\xe0\x5e\x9c\x1d\xc3\x41\x82\x88\xc0\xa2\xbe\x6b\xa3\x4b\x3a\x04\xab\x20\xba\xe7\xf3\x62\x10\x94\xb8\x7d\x78\xa7\xea\xcb\x86\x4d\x40\x78\xcb\x4e\xfc\xba\xc5\xad\xd9\x37\xa2\xc6\x01\x2e\xe1\xa8\xb2\x56\xcc\x27\x6b\x65\xd5\xe9\x2b\x4d\x00\xb9\xb1\x1f\xad\x88\x49\x91\xde\xc4\xc1\xcb\x9d\xce\x18\x63\xc8\xb0\xa2\x10\x16\x1a\xe6\xb3\xf8\xbf\x9c\xc4\xdc\xe4\xad\xfd\xc8\xed\x57\xd8\x3e\x95\xab\x9d\xd2\xd9\x26\x58\xdf\xbd\x3a\xfa\x99\xe3\xf8\x95\x1e\x2a\xd7\x4a\x14\x8f\x6f\x59\x7e\xb2\xc9\x45\xc1\xf1\xb9\x44\x61\xae\x07\x45\x48\x1f\xd0\xed\xf8\x38\xc6\x28\x60\x35\xe3\x6f\x01\x12\x38\x87\x5d\xbb\xa2\x28\x9d\x3d\x6a\x39\x42\xa7\xf9\x55\x4c\x64\x43\x05\x24\x4d\xdb\x77\xc1\x17\xcb\x4b\x56\x23\x77\x29\xdd\xe4\x28\xb8\xbb\x42\xdf\x9c\xe2\x9e\x14\x4d\xfc\x96\xcf\x6c\x67\x67\xb1\xee\x6d\x05\x3c\xe4\xf8\xbb\x20\x56\xab\x78\x10\xaa\x13\x68\xa8\x91\x0f\x2f\x69\xe0\x61\xc1\x9d\x88\x47\x18\x4f\xed\x53\x4f\x98\x75\x8d\x70\x3a\x76\x88\x5f\x91\xeb\x75\x2a\x21\x95\x4a\x10\xc6\xf6\xb4\xda\x10\x46\x4d\xed\x36\xb0\x00\x89\xf6\x62\x91\x54\x21\xbf\xda\xd4\x96\x75\x36\x89\xcc\xd0\x3b\x62\x40\x21\x08\x07\x61\xe6\x81\x76\xb1\x06\x97\xda\xc8\x78\xe4\xc3\xdb\x2f\xd0\xb2\x8c\x65\x53\x35\xd9\x80\x16\xf1\x9f\x26\x5b\xb0\xb2\x43\x4c\xb4\x63\x78\x44\xd9\x1e\xd0\xce\x05\xed\x25\x91\xfd\x99\x89\x65\xf8\x3f\x31\x97\xd1\x0e\xef\x44\x88\x50\xe7\x92\x03\x27\x24\x70\x1d\xa3\x05\xcb\x6d\x79\x46\x69\x48\x3f\xc3\xdc\x6f\x68\x6b\x18\x3e\x29\x99\x13\x0c\x8f\xc0\x05\x8d\xca\xbb\xc9\x18\x8f\x26\xb2\xd6\x3e\xbd\x6c\xb1\xe1\x8a\x09\x7c\x77\x04\xa5\x9b\x5e\x18\x7e\x01\x42\x59\x3b\x70\x83\xf7\x40\x0a\xfa\x9b\x1b\xf0\xc1\xcc\x6c\x35\x6b\xc4\x33\x4a\xf7\x72\xe6\x71\x53\xb4\x5b\x33\x1b\x99\x09\x20\xc2\x4e\xed\xe2\xc6\xe3\x23\x70\x3f\x52\xec\xd6\x07\x35\xb2\x3b\xf2\x2b\x81\xee\x77\x59\x27\xc3\x7e\x53\xda\xd7\x59\x6e\xa6\x5a\x73\xbb\x96\x77\x5f\x3b\x87\xc8\xb3\xc0\x88\xec\x69\x5b\xc3\xa7\x50\x2c\x0c\x51\x0f\x02\x0b\xf9\xac\xa3\xcb\xb7\xa2\xc0\x11\xc6\x7f\xf2\x7d\x63\x4c\xaf\x1d\xcf\xc5\x8e\x5e\x39\x7e\x66\x58\x25\x22\x72\x01\x1c\x8f\xfd\xd6\x42\x30\xa9\x32\x41\xff\xf6\x83\x72\xc4\xba\x85\x38\x2b\xbb\x22\x93\x09\x65\x29\x22\xdb\x68\x83\x66\x31\xe5\x5b\xe6\x9a\xb6\xad\xb8\xe4\x33\x53\x57\xfc\x92\x3e\xfe\x15\x4a\xfc\xc2\x22\xd6\x0d\x07\xf5\x69\x90\xa3\xe5\xa2\x14\xb2\x27\xae\xcf\xf2\xcd\x1b\xb6\xf0\xc7\x9f\xf5\x45\xf7\x0a\x61\x61\x41\xa9\xd5\x3f\x92\x2a\x02\x44\x3f\x7d\x2a\x46\x89\xc3\x5b\x09\x5d\xd3\x94\xd5\x0b\xf4\x9f\x96\x80\xa5\xf7\xd9"}, -{{0x4b,0xc5,0xe0,0x5a,0xa0,0x03,0xa4,0x49,0x2f,0x4b,0xad,0x10,0x2a,0x53,0x90,0xf7,0xce,0xba,0xb3,0xd3,0xec,0xa9,0x15,0x21,0x42,0xad,0x5e,0xf7,0xd8,0x40,0x30,0xae,},{0x67,0x51,0xd3,0xad,0x8b,0xb6,0xc6,0x4d,0x6a,0x17,0xd7,0xe4,0x47,0xa2,0x7d,0xa2,0x2f,0x5f,0x04,0x03,0xf4,0x37,0xba,0xc9,0x44,0x9f,0x13,0xcc,0x85,0x3d,0xd8,0x40,},{0xa2,0x4f,0xee,0x11,0xf7,0xec,0x6d,0xa3,0xe9,0xdf,0xaf,0x6c,0x85,0x8a,0xc0,0x04,0xb4,0x53,0x1a,0xbd,0x1c,0x9d,0x3b,0xb6,0x4f,0x40,0xdd,0x24,0x7f,0x00,0x35,0x93,0x50,0xe4,0x3b,0x2d,0x4b,0x8f,0xbe,0xc5,0xf6,0xb2,0x41,0xec,0xf9,0xf1,0x10,0x14,0x85,0xcf,0x41,0x87,0x35,0xb0,0x5f,0x71,0x20,0x18,0x33,0x5b,0x20,0x06,0x83,0x08,},"\xa8\xf7\x94\xdb\x17\x95\x66\x7d\x28\xd2\x4b\x70\xac\x22\x00\xa6\x23\x9a\x34\xe2\x43\x8c\xed\x1d\x03\xf9\x7e\xd4\x8b\xeb\x4d\x6b\xea\x67\xc1\x43\x38\xf7\x73\x64\x19\xdc\xd2\xa2\xa7\x97\x37\x26\x57\x2e\x6a\xfe\x7e\xdf\xef\x22\xc9\x9b\xe8\xb0\x69\xf0\x4f\x6d\xc6\x1a\x13\xb3\x43\xc6\xe5\x85\xab\xad\x22\x14\xd8\x5c\x36\xf0\x29\x96\xfa\xbb\x46\xbb\x91\xb5\x17\x6a\xc7\x08\xe4\x9a\x0b\x05\x30\x17\x04\x8f\xbb\x55\x45\x3f\x2b\x82\x08\xd6\x67\x8d\x1a\x8c\xf6\xa1\xee\x9a\xd7\xa9\x1e\x38\x03\x25\x63\x5d\x1e\x23\x6a\x6c\xa1\xd6\xcc\x7f\x6b\x59\xf2\xa2\xbf\x18\x4f\x5e\xe4\x51\xd6\x79\x9f\x69\xba\x11\xa0\xcd\x6b\xc0\x4b\xe8\xa3\x51\xa8\x0e\x72\x5b\x5f\xc4\x56\x3e\x45\xbd\x47\x49\xec\xbc\x45\x20\x52\x29\x10\x5b\x9d\xe7\x32\x61\x49\x85\x27\xf3\xd4\xec\xfb\xb5\x83\xff\x53\x27\x53\xd0\x7c\x38\x52\x6b\xb4\x82\xd1\x71\xa2\x61\xb9\xcf\x89\x90\x6a\x7d\xea\x8c\xbd\x7e\x72\x6b\xa3\x1e\xa6\x88\x03\xa6\xb0\x04\xf6\xdc\xd1\x9e\x67\x19\x50\x46\x37\x38\xcc\xa7\x8b\xb0\xdf\xfa\x3d\x64\x57\xe4\xae\xca\x65\x7e\xc6\x49\xb9\x7e\xe3\x0e\x97\xc8\xcb\xe6\xce\x43\xc2\xaa\x9a\x69\x95\x8e\x9d\xc8\x81\xe4\xaa\x7b\x32\x78\x07\x4e\x78\x7a\xce\x5f\xb6\x01\xd7\xfa\xf7\xca\x51\x03\xec\xbb\xd3\xbd\x55\x4e\xb1\xb0\x66\xf8\x29\x6d\x2c\xc5\x7e\x8c\x8a\x32\xe9\xc0\xe6\xa9\x26\x96\x4d\x6d\xf2\xd8\x64\x58\x64\xb3\x22\xc3\x22\xf1\xca\x80\x73\xce\xdf\x2b\x55\x67\x11\xa7\xa2\x0b\x77\xc0\xa1\xed\x27\x7a\x9a\x6c\xa2\xc0\x71\x54\xe8\x63\xfe\xf5\xa4\x04\xe3\xe8\x9f\x0d\x7f\x30\xf2\x18\xec\x4d\xe7\xa5\x3a\xeb\x9c\x41\xee\xaa\xf6\xce\x74\x96\x49\xc9\x99\x8f\xd6\x2b\xcb\xa2\x87\x23\x38\xe1\x9c\x94\xe5\x9d\xd5\xe2\xdd\x77\x6f\x53\x71\x9d\x21\x74\x69\x76\x93\x2e\xf1\x1a\xbf\x7a\x32\xae\x6b\x07\x44\x66\x5d\x0e\x0c\xe5\x13\x95\x5a\x9e\x68\x53\x1d\x8e\xe4\xde\x9a\x8d\x35\xdd\xfb\x88\xeb\x5a\x48\x6a\xd6\x31\x37\xe8\x89\x2f\xd7\xc6\x89\xd4\xf9\xe7\x02\x1b\x11\x73\xbb\x37\x52\xa5\xee\xcf\x29\x92\xe3\xfd\x46\x42\x26\x3c\x7b\x3d\x81\x5c\x29\xb4\x66\xab\x69\x28\x5f\xfe\x4b\x8d\xaf\xcb\xf3\xd0\x1d\x63\x55\x53\xab\x75\x75\xa7\xa3\x47\x1e\xdc\x7b\xe4\x12\xd3\xd0\x1e\x6f\xe8\xe3\xcd\xc3\xfa\x04\xd2\xa7\x59\x93\x81\xe2\x2b\xba\x49\xc5\x53\x9d\x79\xc6\x2b\x52\xbb\x0e\xca\x33\xf7\x42\x55\xe4\x1a\x95\x26\xa8\x92\x89\xb1\x5f\x18\x50\xd9\xaf\xa8\x7e\x6b\x6f\xa1\x27\x10\x1c\x1a\x6d\x88\xd4\x33\xe0\xc8\x6a\xa6\x0b\xba\x8f\xe7\x10\x0e\xd6\x1d\x5a\x9d\x00\xa0\x07\x64\x51\x3e\xb1\xc7\xf5\xf5\xc3\xb3\xef\xc4\x53\x2a\x36\xb4\x07\xfe\x2d\x17\xcf\xb4\xe6\xfc\xd6\x04\x9c\xff\x3a\x35\x56\x23\xa3\xa4\x13\x90\xea\x48\xf4\x21\x20\xd8\x97\x94\x91\x11\xbe\x3d\x16\x9b\x2d\x2e\xf4\x5b\xdb\x89\x4f\xe2\x0b\x1a\x95\xef\x66\x14\x94\x27\xa9\xd8\xf8\x0a\x9b\x2e"}, -{{0xa3,0xbe,0xd9,0xfe,0x23,0x54,0xbd,0x28,0x60,0x14,0x9a,0x3d,0xb7,0x5a,0x85,0xb1,0x29,0xcf,0x83,0xe9,0xd7,0x3e,0x63,0x17,0xba,0x70,0x54,0x52,0x19,0x33,0xf8,0x96,},{0x5a,0xc0,0x3b,0x4f,0x13,0xd9,0x1d,0x06,0x6b,0x2c,0xe3,0x59,0xe9,0xbb,0x1d,0xfb,0x6b,0xfa,0x5a,0xfa,0x38,0x2f,0xd1,0xcc,0xd7,0x2a,0xef,0x11,0x76,0x07,0x9f,0x89,},{0x33,0xbc,0x1e,0x0b,0xf1,0xb4,0x93,0xe0,0xcf,0xb7,0xea,0x40,0x48,0x0a,0x14,0x23,0xe0,0x91,0xf7,0x14,0x57,0x45,0x01,0x31,0x73,0x78,0x7d,0xf4,0x7a,0x10,0xdb,0x24,0xc1,0x65,0xd0,0x05,0x96,0xfa,0xb7,0x0e,0x68,0xc9,0x4c,0x10,0x4e,0x8a,0x74,0x07,0xcf,0x69,0x5c,0xd3,0xfb,0xe5,0x85,0xb5,0xb1,0x76,0xb8,0x5c,0xcc,0xa4,0xfd,0x08,},"\xdb\x85\x38\x08\x68\x6d\x6d\x21\xf4\xc5\x7b\x54\x1e\x5a\xd6\x33\x94\xd4\x65\xe6\x00\x78\x64\x3c\xab\x1e\x06\x5c\x9f\x30\x6c\x50\x00\x78\xf0\xcc\x41\xef\x0f\x95\x42\xb5\xfe\x35\x6a\xec\x47\x77\xef\x8a\x95\x55\x4c\x97\xb6\xa4\x40\x99\xe9\xbd\x64\x04\xfb\x0b\x2e\x41\xf9\x19\x14\xb0\x74\xd1\x22\x37\xcd\x44\x2e\xbd\x40\xb5\x1b\x8b\xc8\xbb\xe4\x37\xa2\xc5\x33\x32\xd2\xbe\xb2\x28\x1b\xf7\x32\x4a\x0c\xf5\xb7\x41\xbb\xf9\x8d\x1e\xb9\x85\x8b\xe9\x26\xe9\x15\xa7\x8e\x8d\x31\x4b\x41\x44\xf3\xd2\x0d\xfc\x6c\xb7\xf4\x8c\x23\xaf\x90\xf8\x71\xc6\xcd\xa9\x08\x45\xa4\x1a\xff\x17\x07\xa8\x7b\x4e\x55\x16\xf1\x8e\x8b\xd7\x68\x3c\xfd\x74\x07\x08\x03\xe8\x88\x33\x8c\x9a\x18\xf7\x92\xc8\xd3\xa7\x04\x17\x0f\xf9\x82\xbf\xfc\x9e\x8e\xc9\xea\x5d\x1a\x62\x59\x2f\x16\x88\xd4\xf2\xb0\x1e\x11\xf9\xf8\x87\x74\xc4\x7a\xc1\xd5\x8f\x69\x0b\xcf\x28\x8c\xf8\xa4\x73\xd3\x50\xa8\x23\x9d\xf9\xd3\xa6\x28\x81\xda\xdd\x33\x85\x31\xfd\xce\x76\x15\x80\x7c\xe9\x65\x49\x6d\x6f\x35\xd6\xc0\x42\xf0\xce\x7f\x21\xef\xe5\xce\x64\x25\x18\x59\x41\xed\x56\x36\xb8\xae\x91\x3a\x75\xd2\x1a\xb9\xdb\xdb\x3c\x3b\x66\x87\xa4\x5e\x04\x49\x38\xa9\xf1\xc1\x3a\x33\x0e\xa9\x76\x1e\x28\x3e\x61\xd4\xa3\x20\xe1\xf5\x59\x88\x2f\x34\xb6\x07\xfe\xfe\x32\xc3\x43\x17\x4a\xbc\xdc\x77\xb0\x65\xa9\x29\x04\xb4\x2d\x96\x1d\xb8\xed\x91\x6c\x01\x46\x4f\xfd\x43\xf9\x3c\x10\x77\xf1\xdf\x7e\xe6\x50\x31\xcf\xe0\x5d\x78\x0d\x01\xd0\x8e\xe0\x36\xf2\x2a\x2b\x05\x12\x19\x3b\x0c\x0f\x38\x01\xe0\xa0\x20\x8e\xef\x24\x5c\x9e\x51\x93\x52\xd2\xb0\x09\x63\x82\xf2\xcb\xa0\x6e\xb2\xa0\x1d\xac\xf6\x19\xea\xbb\xc8\x83\xc5\xd4\xf2\xfd\x7c\x34\x23\x17\x9c\x0f\x5f\xfd\xaf\x8c\xaf\xff\x5c\x46\xb3\x4a\x09\xc3\xc5\x0e\x29\x49\xc0\x60\x00\x20\x7d\x70\xd3\x7d\x65\xa7\x43\x07\x5f\xdc\x2b\xe6\x2d\x41\x2a\xa6\x3e\x36\x37\x06\xca\x90\xe6\xef\x44\xe1\x52\xea\x4d\xc5\xc2\x89\x3e\xcd\x08\xd7\x96\xd4\x1f\x17\x22\x54\xc3\xd1\xd1\x4b\xb0\x67\xb5\x3a\x08\x97\xbb\xd7\x3c\x99\x54\xd9\x64\x8b\x2a\xf1\x0d\x9c\x27\x03\xe3\x8b\x6c\x62\x46\x9f\x6f\x95\x8a\x1c\xa0\xa3\x20\xc1\x23\x39\xe9\x0c\xf7\x68\xc8\x7b\x47\x38\xc2\x19\xf8\x09\x3b\xff\x4c\x2c\xfd\x29\x45\x9f\x6d\x32\x81\x34\x93\x78\xe9\x15\xa3\xb0\xe7\x24\xc7\x4d\x2b\xd7\xa8\x51\xac\x7c\x6b\x48\xe8\xaf\xc7\x12\x4f\xdc\xbc\xab\x5f\xf8\x0d\x1d\xee\x30\xa6\xc0\x24\xcb\x43\x31\x97\x23\x66\xeb\xab\x26\xbb\xb9\xf6\x08\xca\xac\x7e\x51\x91\x4d\xf0\x58\xb9\xb3\x74\x5d\x98\xc5\xd2\x7e\x97\x10\x54\x75\xec\x01\x73\x77\xe6\x31\x61\x98\xec\xe4\xec\x59\x09\xf0\x4f\xc2\x7e\x7b\x38\x2e\x66\xad\xb6\x2a\xc8\xa9\x77\xf3\x76\xfd\x5d\xae\x43\x4f\xb5\x51\x75\x24\x9c\xa1\xab\x6b\xb0\x2d\xec\x06\x96\xf0\x89\xbe\x34\x54\x88\x7a\x0c\x32\x36\x1d\x17\x2b\xd2"}, -{{0x88,0xa2,0x4f,0x0d,0xf3,0xae,0x29,0x14,0xdf,0x79,0xda,0x50,0xec,0xf8,0xec,0xb4,0x2f,0x68,0xc7,0xba,0xad,0x3b,0x6c,0x3a,0x2e,0x0c,0xc9,0xc2,0x5d,0x09,0xd1,0x42,},{0x12,0xe6,0x60,0x3f,0x71,0x3b,0x23,0x05,0x35,0x85,0x68,0x71,0x00,0x18,0x68,0x5e,0x14,0x15,0x53,0xc4,0x75,0x91,0x39,0x6f,0xb4,0x25,0x9e,0x42,0xdc,0x53,0xb9,0xc9,},{0x17,0x07,0xcc,0x00,0x91,0x86,0xbf,0x3f,0x03,0xf7,0xbb,0x9e,0x3c,0xd4,0xcf,0x6b,0x73,0x7b,0x7a,0x6b,0xaa,0xde,0x7f,0xc6,0xc3,0xff,0x5c,0x12,0x25,0xdb,0xb2,0xba,0xf5,0x4f,0x47,0xc8,0x5e,0xaf,0xa1,0x32,0xc3,0x1e,0xac,0xa0,0x3e,0x6a,0xec,0x14,0x47,0x73,0x3f,0xac,0xd3,0x71,0x49,0xb7,0xc6,0xcf,0x0c,0xd4,0x1f,0x61,0x14,0x04,},"\x65\x4e\x9e\xdc\x69\xfe\x63\x4c\x23\x08\xba\x8c\x46\xa9\x55\xe8\x82\x45\x62\x86\xea\xe3\x59\x3c\xae\x73\x9c\x44\x86\x6c\x0d\xe9\xed\xcb\xbf\x0d\xb1\xc4\x41\x49\x66\x84\x67\x70\x9d\xc9\x70\x62\x98\xdd\x2e\xac\x33\x01\xda\xba\xd5\xbd\x8e\x93\xc5\xe8\xa9\x3f\x19\x4e\x0f\xc1\xd9\xf3\x76\xc1\x44\xc2\x93\xae\xfd\xa0\x86\xb2\x21\x8f\x2e\x9d\xfd\x7c\x2d\xc5\x2b\xa3\x3e\xb2\x29\xdc\xf7\xbb\x68\xce\x0f\x87\x6c\x5f\xd4\xe8\x1a\xfd\x80\x16\x9f\x73\xcf\x26\x4e\x5d\xc0\xce\x16\xe1\xb8\x76\xcd\x11\xc7\xad\x89\x05\x8e\xe0\x82\x0c\x40\x00\x5d\x01\xf1\x19\xf8\xbe\x6f\x1a\xfb\xe2\x4c\xa4\xae\xdc\x18\xe9\x78\x96\x82\x7c\x3e\xd6\x7f\xc4\x56\x30\xe7\x90\x3b\x7f\xee\x9c\x99\x0e\x36\x19\x37\xbf\x4e\xa0\xa4\xd8\xd1\x6c\xf6\xd9\xcf\x03\x81\xe9\x06\x5e\x36\x25\x14\x8f\x8a\xe0\x49\x1a\x03\x41\xd0\xff\x9f\x72\x7b\xe1\xf3\x10\xca\x1e\xc3\xf0\x10\x4a\xa0\x54\x32\x17\x84\xdd\x24\xd5\x3c\x98\x5b\x28\xd4\x40\x82\xf8\xe1\xc1\x08\xa4\x41\x09\x63\x8f\xf5\x11\x6e\xdd\x85\xae\xb8\x6b\x6e\xa5\x12\xa1\x9b\x60\x2e\xdd\x9d\x21\x10\x70\xd0\x44\xaf\x5b\xed\xb6\xc8\x52\x7b\xa3\x49\x1e\x34\x5b\xac\xc1\x30\xb3\x69\x60\x28\x2a\xe7\x37\xb8\x5c\x76\x92\x74\xf0\xf7\xc5\x88\xf4\x0e\x66\x25\xb2\x36\xbd\xc1\xa3\xb8\x73\x20\x46\x0e\xee\xad\xa2\x78\x12\x4b\x56\x68\x87\x4f\x39\xf5\x9c\x2e\x6a\xa2\x08\xc3\xb6\xa9\xb8\x45\xc4\xd0\xa2\x7a\x05\x46\x78\x6f\xa1\x3e\x51\xcc\x98\xb7\x3f\xd7\xee\x32\x7b\x62\x15\xec\x6b\x62\x9f\x4c\xc7\xe4\xbd\x3c\x0a\x3d\xb7\x8a\x21\xff\xfe\x24\xc7\x04\x38\x71\x6b\xc3\x7b\x8d\xa7\xc5\xff\x7c\x36\x88\xa9\x03\x39\xc2\x2e\xb5\x0b\x7c\x2c\xd3\x6b\x68\x83\x1f\xd5\x93\x91\x75\x68\x9b\xd3\xe2\x2c\x38\x81\xaf\x33\x7e\xe1\x44\x35\x70\x9e\x35\x10\x40\xef\x3d\xa9\x55\x72\x4e\x51\xc2\x4a\x5e\x2c\x09\xf8\x91\x80\x83\x93\xfb\xf8\xef\x7f\x1f\x5f\x02\x98\xde\xeb\xdc\xd8\xd6\x66\xcb\xcf\x3e\x86\x6c\x71\x89\x99\xab\x6b\x1f\xee\xc9\xc4\x7e\x02\xe7\xd6\x35\x40\xf8\x99\x63\xd5\x42\xc5\xd0\x1f\xb6\xfc\x30\x76\x89\x68\xae\x81\xb2\x0c\x35\x4b\x40\x00\xc1\x32\x77\x47\x64\xd6\xd4\x43\xad\xd6\x4f\x6d\xd7\x48\xf5\xfb\x5b\x7f\x6e\xba\x40\x1d\xb4\x31\x8b\xe9\x93\x98\x9f\xcc\x25\x77\x96\x1f\xa5\xad\x31\xf6\xa2\xa9\xd6\xa7\x55\x28\x58\x65\xcd\x5d\xc3\xa8\x8c\xfb\x5a\xba\x7d\x92\x3b\xaf\x78\xb5\xd1\x31\xb4\xc2\x14\xdf\x55\xb6\x17\x1f\x45\x20\x9e\x21\xca\x66\x45\x49\x0d\x3a\x36\x44\xdd\xa6\xdc\x92\x9c\x7c\x40\x95\x76\xd3\x71\x64\x75\x5e\xf8\xaa\xf3\xdc\xd4\xd2\x27\x75\xee\x7d\xea\x0e\x56\x5b\xd5\x47\x27\x92\x1c\x64\x9b\xc5\x1f\x20\xc1\xf6\x8c\x1f\xde\xac\x45\x5c\x67\xd7\x1a\x1c\xb8\x83\x7f\x46\x91\x44\x8b\xf0\xbf\x04\x4a\x46\xf1\x68\x5f\xbe\x22\xb1\xe0\x18\x77\xf7\x47\x7d\x34\x99\x40\x8c\x4c\x31\x65\x10\xce\x2e\x55\xb9\x80\x05"}, -{{0x18,0x4d,0x0c,0xe2,0xe9,0xdb,0x7f,0x25,0x7a,0x8b,0xf4,0x64,0x6d,0x16,0xd2,0xc5,0xef,0xc2,0x70,0x2c,0xed,0x02,0x6b,0x69,0x06,0xd3,0xc8,0xc0,0x11,0x8f,0x22,0x61,},{0xe9,0xda,0xb8,0xfd,0x9d,0x94,0xdc,0x9b,0x24,0xcc,0x79,0xc6,0x35,0xcc,0x57,0xce,0x66,0x51,0x89,0x82,0xba,0x3e,0x24,0x47,0x24,0x07,0x41,0xba,0xc0,0x73,0x0e,0xc5,},{0xb1,0xe3,0xbf,0x5f,0xa7,0x4d,0x7e,0x44,0x2c,0xed,0x9a,0x98,0xd9,0x27,0xd8,0xc4,0x5e,0x0e,0x64,0xd8,0x74,0xf8,0xea,0x59,0x20,0xa3,0x60,0xa4,0xbf,0x42,0xd8,0x3c,0xe1,0x8a,0x92,0x4a,0xc7,0x96,0xe1,0xa7,0x7d,0x1b,0x02,0x08,0x29,0x4b,0x50,0xf8,0x22,0x17,0x7f,0xdb,0xdd,0x45,0x8c,0x74,0x35,0x6f,0xcf,0x6b,0xd7,0x94,0x51,0x06,},"\x6a\x9b\x87\x6b\x0b\xf4\x18\x9b\x3c\xc1\x5f\x9e\xb4\xfb\xe7\x93\x2b\x55\x77\x89\x2a\x22\x20\x0c\xe1\x07\x15\x68\x53\xd6\xd3\xca\x36\x3f\x02\x5a\xd7\xa2\xd8\x62\xaa\xdc\x74\x2d\x94\x15\xbd\x8d\x1f\xca\x13\xc9\xdc\xa3\x58\x60\x44\xe5\x5a\x8c\xf5\xde\xe1\xce\x56\x45\x76\xe3\xe8\xe3\x65\x54\x05\x46\x50\x1b\x34\xca\x67\x5c\xf2\x00\xe0\x77\x1a\x81\x8c\x73\xd3\x7f\xcd\xa8\xcb\x15\xe4\x8d\x5a\x0b\x9e\xa3\xbe\xec\x0f\xf6\x61\x0b\x2a\x8a\x21\x4c\xa4\xf7\xef\xac\x0e\x71\x38\x10\x52\xd9\xbf\x3c\x00\xc3\x29\x59\x34\x74\xeb\xd0\xa6\x87\xa0\xb4\x1d\x14\x4b\x5e\x7a\xb1\x41\x2b\x97\x0a\x74\xba\xba\x4d\x27\x4b\xb0\xdb\xfd\xb0\x2b\x11\xf7\xf6\x39\x64\xba\x6f\x3b\xa0\xad\x23\x34\x1d\x08\x3b\x91\xa4\x30\x82\x39\xe3\x3d\x50\x82\x43\x96\x12\x65\x88\xde\x72\xa2\x39\x0c\x1c\x0f\xc0\x67\x47\xc2\x87\x72\xf6\x30\xbf\x4d\x14\x3f\x7a\x11\x59\xf0\x28\xc0\x93\x40\x48\x94\xe6\xd1\x6f\x63\x46\x35\xd4\xfc\x33\x0f\x3d\x7a\x73\x13\xef\x75\x6f\x5d\x49\xd8\xf6\x20\x5e\xb1\xc7\x92\xa9\x49\x5d\xa1\x31\xb4\x33\x45\xa0\x09\x0c\x12\xca\x56\xe6\xad\xac\x5b\xe0\xcb\xca\xc3\x60\x9d\x69\xf7\x24\x15\xf6\xc3\x7f\x3c\xfb\x2c\xf7\x6b\x3e\x65\xf3\xc9\x3a\xc9\x2b\x63\xf2\xba\xa4\x66\x24\x90\x75\xbc\xa6\x9d\x4c\x1d\x1f\x3a\xde\x24\xab\x31\xef\xfc\xb9\x04\x69\xc2\x4b\xb4\x10\xab\x47\x23\xe1\xb7\xe1\xc8\x8b\x3a\x36\x43\x35\x63\xf7\x1a\x99\xaa\xd5\x8f\xe8\x05\x68\xf9\xc1\x02\xda\x89\xba\xd9\x79\x63\xe7\x7d\x66\x22\x48\x31\x66\xf3\xae\x26\x1f\x32\xa5\x2a\x86\x10\x1e\xbd\x64\x5f\x61\x42\xc9\x82\xe2\xcd\x36\x25\xcf\x8b\x46\xb9\xb2\x89\x12\x46\x92\x0f\x69\x7f\xca\xed\x39\x7c\xb9\x22\xc2\x74\x94\x51\x67\xa0\xe6\x19\xb0\xb5\x06\x37\x76\x06\xdb\x04\x57\x83\xb0\xb8\x8e\xa0\x4e\x93\x2d\x21\xff\xc0\x64\xa1\x2a\x40\xeb\xe9\xb4\x80\xf1\xa2\xc7\xdd\xd3\x95\xa9\xb1\x5e\xfd\xc4\x95\xc9\x71\x4f\x36\xfa\x99\x6f\x79\xf8\xeb\x8e\xfa\x52\xd9\x9a\x24\xab\xfe\xf4\x3b\x32\xa2\x37\xc5\xbc\x00\x18\xda\x3b\x16\x2f\x59\xb8\xd3\xd4\x74\xe2\xce\x08\xfa\x80\x24\xc5\x8a\xcc\x0a\x99\xff\x61\x4e\x6c\xd7\xfd\xd9\xca\x4e\x8f\x41\xa1\x44\x9a\xa6\x18\xd0\x33\x37\xe8\xa3\x74\xd5\x60\x55\xb2\x07\xa9\xdb\xe6\x9f\x59\x48\xf9\x01\xca\x7d\xb0\x41\x0f\x01\xaa\x37\x3d\x9e\x02\x27\x62\x35\x99\xbc\x21\x28\x45\xb0\x06\xe9\x42\xfa\xbc\x58\x2c\xd7\x26\xdb\x5c\x44\x3e\xb2\xdf\xfb\xc9\xe3\xe7\xf0\xe5\xcb\x67\x44\xf7\xad\x71\x60\x50\xfd\xf2\xc6\x0c\x7c\x77\xc2\x53\xab\x74\x5d\xb9\xc8\x55\x26\x55\x68\x3e\xa7\xea\x68\x0a\xa4\xaf\x34\xdf\x13\x25\xc2\x9b\x88\x74\xb6\x1b\xe2\x3d\xe4\xff\xba\x25\x42\x4f\x46\x19\xec\x68\x2c\x26\xb3\xa6\x7b\xda\x9b\xc4\xc9\x4b\x79\xa9\xfc\x4d\x82\xd3\x40\x49\x5b\x43\x7a\x1c\xbd\x6b\x60\x30\x7c\xfc\xb1\x00\x26\xf9\x64\xa0\x17\x62\x3e\x33\xdb\xf2\x33"}, -{{0xd0,0x2b,0xbf,0x70,0xd5,0x13,0x51,0xe3,0xb4,0x7a,0xd8,0xe5,0xed,0x26,0x3d,0xbf,0x55,0x6d,0x14,0x98,0xfa,0x9b,0xd5,0xdb,0xd9,0x9f,0xb4,0x26,0x90,0x09,0xdc,0xed,},{0x8c,0xe4,0xb5,0x9f,0x94,0xce,0xd6,0xec,0x96,0x14,0xd6,0x7d,0x30,0x66,0xd9,0xd3,0xa0,0xdf,0x7a,0x46,0xb3,0x7b,0x4c,0x17,0x25,0xef,0x1e,0x57,0xbc,0x68,0xa0,0xd1,},{0x6e,0x7c,0x66,0xac,0xc9,0x54,0xff,0xd9,0xdd,0x4c,0x1c,0x63,0x35,0xab,0x4f,0xe7,0x9d,0xbb,0xed,0x78,0x2c,0x4a,0x47,0xec,0x30,0xd8,0x48,0xd8,0xbb,0x2b,0x4f,0x10,0x69,0xdc,0x62,0xe5,0x22,0xa1,0xe8,0x01,0x7f,0x54,0xa6,0x34,0x5e,0x17,0x28,0xc0,0x73,0xaf,0x64,0x47,0x85,0x6d,0x8c,0x1e,0xd3,0x58,0x78,0xb5,0x71,0xe5,0x23,0x0d,},"\x55\x45\x60\xf7\xa7\xfd\x1a\xe7\x75\x8a\x2f\xce\x7d\x78\x0f\x6b\x3f\x04\x3d\x3a\xf8\x9d\x4f\x19\xef\x57\x3c\x34\x99\x75\x54\xdf\x24\x3f\xaf\x2a\xaa\xb6\x5b\x2a\xfd\xd2\x86\x10\xd4\xa5\x1e\x9a\x4b\x46\x4d\xb6\xdb\x09\xeb\xf7\x3b\x7d\x24\x05\x4c\xc9\xb1\x28\x14\xbb\x29\xee\x99\xe1\xa7\x3b\xd6\x03\x89\x83\x60\xf9\xdc\xf0\x1e\x67\x08\x36\x28\x6f\x82\x36\xed\x8c\xef\x07\x5f\x3d\x56\x33\x12\xc1\x6c\x73\xfc\x37\xee\xdf\x25\x2f\x8f\x42\xd3\x0a\x13\xe7\xfb\xa3\xb1\x65\x23\x8c\x7f\x81\xea\xae\xb5\x31\x90\xf3\xec\x3b\x5d\x63\xf0\xee\x03\xe3\x98\x7e\x39\x0d\x1d\x81\xe8\x27\x7e\x9f\x6c\x1e\xe6\xec\x4e\xc3\xfa\x0d\x72\x0e\x9f\x53\xf9\xc2\x6f\x04\xaa\x2e\xd2\xb5\xef\x31\x60\x89\x59\x99\xea\xce\x29\xcf\x5d\xc2\x54\xad\x71\x10\x6b\xb7\xe8\xbc\x29\xa5\xb1\xd2\x41\x25\x93\xd0\x81\x94\xe8\x8e\x16\x59\xa7\x31\x59\xa2\xa2\x20\x33\xab\x06\x6e\x8d\x3d\x8c\x3b\xc8\x6b\x7b\x01\xde\x81\xa8\xc6\x60\x47\xb0\x7f\xe2\x4e\xd2\x40\x31\x8b\xa3\x7b\xa3\xef\xb6\xcf\x63\x26\x04\xca\x4f\x44\x6a\x75\xfd\x8e\x70\xc4\x53\xf0\xc6\x0e\xe1\x6e\xca\xf5\x24\xe7\x03\xf4\x7d\xf5\xc2\x82\xca\x32\x89\xb3\xaf\x61\xde\xe4\x70\x9e\xe0\x85\x32\x3b\x1e\x5c\x8a\x6b\xc0\x76\x62\x01\xc6\x35\x03\x14\x46\x89\x1f\x34\x94\xe9\xdb\x20\xdd\x4e\x9e\x08\x38\x24\x9a\x67\xe1\x38\xd1\x3e\xe2\xc9\x6f\x61\xe7\x71\x06\x15\x42\xaa\x16\xef\x20\xd8\x1e\x3a\x0f\x4e\x45\x21\xa6\xcd\x6c\x92\xfc\x26\xfe\xef\x03\xb6\x6c\x70\xe0\x35\xca\xfc\xc1\x9c\x96\xfb\x9d\x82\x91\x8f\xe1\x97\x78\x0e\xff\x0e\xda\x6e\x25\x12\xc5\x6e\x2a\x73\xd7\x70\x32\xb7\x68\x91\x9b\xea\x97\x72\xf5\x98\x9c\x8b\x6c\x65\xc3\xd1\xe9\x7a\x21\x80\xcc\x3a\x37\x57\x9d\xa7\x0c\xe9\x80\x6a\xc1\x28\x5a\x3e\xab\x41\x5c\x06\x07\xd8\x8c\xb8\x65\x42\xea\xb9\x0b\x9d\x2d\x67\xfa\xff\xfc\xad\x23\xa7\x14\x00\x0e\xe5\x9e\xd6\x8c\x95\x6e\x81\xc4\x45\x42\x88\x82\xf9\x7a\xf7\x4d\xb3\x62\xe4\x5c\x0d\x1b\xd8\x85\x6e\xed\x16\x6e\x4a\xec\x4b\xfd\xf9\x5e\xad\xb2\x51\xe2\xa1\xef\x80\x48\x52\xa9\xea\x77\xd3\x45\x77\xfe\x70\x83\x1a\x92\x8b\x10\x1b\x60\xac\x61\x3e\x7b\xa2\xe6\xba\x0a\x94\x01\x3a\x64\xc2\xf8\x21\x9f\xd3\x0b\xff\x40\x90\x99\x66\x7a\x78\x6f\x99\x32\x7b\xb0\x3e\x2f\x21\x87\xf4\x45\xb4\x6b\xee\xda\xb6\xd3\x25\xaf\xd9\x04\xe3\x95\x43\xe9\x3f\x4b\x6c\x54\x43\x24\x9d\x74\x4b\x2d\x1a\x43\xe1\x41\xe4\x76\x8b\xd4\x0a\xab\xe4\x05\x72\x44\xe1\xea\xdd\x9d\xae\xc1\x75\x71\x9e\x51\xa0\x93\xac\xe3\x2f\xe8\x2b\x2e\xac\xb5\xec\xb0\xda\x6c\x1f\xfe\x98\xc8\xce\xe7\x88\x6e\x30\x16\x70\xdf\xf8\x71\x13\xef\xed\x42\x82\x47\x1a\xfb\x6b\x8a\x0f\xdb\x50\x5e\x2e\x8e\x7d\xbc\x1a\x08\xa2\x2e\x96\x80\xbd\x09\x8b\xf1\x27\x58\x02\xbd\xb4\x59\x41\x3a\x3b\x23\x7d\x77\x13\xa1\xbb\xf5\x97\xe6\xad\xf2\xb6\x0e\xaf\x82\x37\x91\xb3"}, -{{0xaa,0x0f,0xda,0xe2,0xa5,0xa4,0xc9,0xc0,0x45,0x21,0x91,0x30,0x04,0xcd,0x89,0xef,0xbc,0x88,0xb2,0xda,0xdf,0x5a,0xbb,0x24,0x6f,0x3c,0xa7,0xf6,0x92,0x35,0x44,0xaf,},{0xbf,0xfc,0xb1,0x7c,0x35,0xc1,0x30,0x4c,0xdd,0x9d,0x62,0x4f,0xf6,0x9b,0xee,0x60,0xec,0x7c,0x9e,0xc3,0x27,0xd1,0x23,0x50,0xd7,0x0f,0xac,0x12,0xb4,0x7c,0xc2,0x5c,},{0xf9,0x37,0x29,0x89,0x69,0xca,0x34,0xd9,0x75,0x84,0x44,0x89,0x07,0x35,0x8b,0x0f,0x47,0x84,0x1f,0x30,0x23,0xaf,0xc7,0xef,0x76,0x81,0x52,0x1c,0x5b,0xe0,0xf5,0xe5,0x62,0x8a,0x8f,0x60,0x7e,0x2f,0x31,0x63,0x6e,0xf6,0x36,0x46,0xb0,0xe9,0x89,0x8a,0x72,0xad,0x35,0x57,0x06,0xd2,0xc8,0x06,0x0f,0xbc,0x64,0x0e,0xfb,0x3d,0x66,0x05,},"\xb1\x41\x84\xcf\xdc\x4a\x5f\x0c\x7f\x83\xf9\x4a\x83\x2f\x58\x85\x07\xe2\xd7\x2a\x89\x32\x98\x70\x07\x85\x71\xd2\x08\xa0\xc4\x96\x0c\x2f\xdc\x4c\x23\x6c\xf8\x82\x29\x98\x1d\x12\xb1\x0a\x1b\x68\x84\xc8\x65\x0d\xda\xf1\xd4\xb2\xeb\x98\x15\x75\xb1\xe0\x19\xfe\x3f\x60\x42\x36\x76\xf8\x85\x6a\x99\x2c\xce\x36\xd6\xd0\xa3\xd0\x26\x63\x1c\x8c\x1e\x1f\xfe\x34\x13\x4b\x29\x6f\x40\x84\x2b\x6d\xf4\xf8\x6f\x83\x3e\x01\x75\xba\xe5\x0e\x86\xbf\x85\x6d\x1e\xe7\x99\x25\xf4\x34\xb8\xbf\x2c\x84\x51\x9f\x1f\x5d\x25\x38\x60\x49\xce\x3c\xa6\x17\x77\xe3\x0b\x70\x0a\x60\x2d\x39\x52\x50\xb6\x0f\xc6\x4a\xc6\xf8\xdb\x02\x7e\x8d\xa8\xb9\x55\x0f\x24\xed\x11\xa1\x1d\x9f\x9f\x9c\x5e\x0a\xf1\x45\xb8\x65\x97\x51\xac\x6b\x55\x86\x1f\x63\x88\xa6\x43\x36\xb3\x1e\xfe\x45\xc0\x80\x2d\x76\xa5\x34\x86\xa8\x1e\xba\x07\x31\x4b\x4d\x96\x1c\x14\x1a\xb3\x4e\x2f\x76\xed\xac\x0e\x6d\xe3\x14\x22\xdf\x79\x2a\xf0\x81\xe7\x69\xc7\xed\x05\xda\x9a\x5a\xf2\xfd\xf3\x6f\x14\x17\x69\x90\x8b\x70\x09\x37\xf0\xe1\x06\x8c\x13\x1f\x17\x6e\xb9\x6c\x67\xaf\xdb\xe7\x8f\x40\xd8\x60\x07\xfb\xcd\x47\xe4\x9e\x2e\x4c\x4c\xe0\x49\x93\x6a\xdf\xf1\xce\x3e\xac\x42\xb9\x6b\x34\x29\xb5\x62\x6b\x1a\xa6\x2a\xcd\xe0\x7f\x45\xa1\x3c\xe1\xbd\x21\x1f\x32\xbd\x7e\xfe\x47\x90\xc8\x37\x1e\xbf\x87\xc1\x64\x47\x7a\x5c\x9f\xa3\xe7\x8c\x2f\x88\x07\x7b\x09\x73\x44\xcf\xfa\x03\x1c\x44\x29\xc7\xf4\x2d\xca\x07\x73\x78\x50\xee\x7a\x76\x9b\x36\xd0\xf0\x62\x5a\xdf\x12\x0e\xa2\x3f\xf4\xe3\x93\xa4\xfd\xcb\x65\x58\xdb\xf9\xb2\x66\xa0\x32\xe3\xb0\x59\x9b\x9d\x66\x92\xfc\xeb\xd8\x15\xa3\x89\x76\x07\x85\x63\x25\xfc\xd0\x11\x5d\xc3\x10\xdb\x3a\x87\x92\xfb\xeb\xd3\x99\x49\x4c\x83\x71\xe5\x85\x72\x7b\x3d\x63\x24\x14\x49\x68\x93\xd0\x38\x13\xba\x1f\x99\x66\x1b\xce\xb9\xdc\x18\xec\x5d\xc2\x7f\x52\x67\x03\x18\x68\x77\x69\xfc\x67\x8d\xdc\x7e\x40\x22\x7c\x20\x05\x22\x01\x3f\x5c\x0e\xec\x0e\x47\x81\xe6\xfc\x15\x3a\x0c\x2f\x4f\x3f\x95\xe5\x17\xc8\x41\x99\x24\xab\x39\x99\x2a\xf8\xc1\x94\x65\x05\x7f\x13\x44\x86\x69\x6b\xa7\xfd\x46\x51\x76\x8b\x4e\x74\x9e\xf3\x6f\x02\x44\x46\x17\xcf\x97\xf0\xa4\x23\xe4\xc1\x3b\x7b\x66\xba\x2b\x6c\x45\x68\x78\xb0\xb5\x0c\xe2\xee\x5e\xc5\x64\xed\x88\x54\xf7\x82\xaa\x1d\x1c\x6a\xa7\x60\xf2\x52\x2c\x7d\x97\xb9\xb1\xab\xe0\xba\x81\x09\x59\xd7\xaa\x40\x3a\x99\x37\x5a\xa3\xe3\x9a\x11\x5d\x1f\xc6\xfe\xdd\x00\x2f\x38\x30\xa5\x0a\x83\x7d\xc7\x20\x32\x9e\xc0\xc7\x3d\x5b\xfd\x50\x03\x85\xc7\x36\x83\x82\x87\xe1\x92\x01\x52\x5d\x18\x9c\x3a\x08\x4c\xd5\xa3\xf3\x59\x87\x5e\x3b\x83\x25\x28\x9c\xed\x18\xb6\x3b\x00\xff\x9c\xd0\x70\xc3\xe6\x74\x44\xbd\x3d\x83\x46\x17\x40\x85\xcc\x45\x13\x5c\xaa\x0c\x67\xb3\x22\x6e\x4a\x52\xe9\xa1\xc5\x5a\xed\x7e\xc5\xfa\xde\x6b\xf1\x6c\x19"}, -{{0x71,0x62,0xfe,0xf0,0xac,0xa4,0x97,0x4b,0x09,0x4a,0x6a,0x08,0x05,0x43,0x95,0xf8,0x77,0xff,0x94,0x33,0xf1,0xe3,0x3e,0x20,0xe8,0x8e,0xaa,0x90,0xf9,0x38,0x99,0x7d,},{0xa2,0x80,0x64,0x0f,0x13,0x9f,0x45,0xc3,0x5a,0x48,0x71,0x53,0x7e,0xef,0xe6,0xef,0x9d,0xb0,0x2d,0xe7,0x85,0xee,0x9f,0xd5,0x4f,0x80,0x5f,0xb5,0x7d,0x37,0x46,0xef,},{0xae,0x16,0x1c,0xce,0x95,0x40,0x33,0x84,0xb6,0x5c,0x6b,0xc9,0xb3,0x93,0xeb,0x07,0x25,0x64,0xc3,0x5f,0x3a,0x6c,0x04,0xfa,0x51,0x7a,0xb0,0x68,0xbc,0xd2,0x37,0x67,0xcc,0x0c,0x8e,0xdd,0x92,0xb1,0xa1,0x3a,0xe9,0xa9,0xce,0x48,0x64,0x13,0x7f,0xb8,0x9c,0x1f,0x37,0xb7,0x48,0xcf,0xc9,0x13,0x4b,0x67,0x41,0xba,0x1b,0x22,0x28,0x0d,},"\xc9\x0f\x45\x0b\xda\x1c\x6e\xfd\x8d\x12\x78\xde\xbd\x7a\xe0\x3e\x2e\xac\x27\x40\xa5\xa9\x63\xfc\xf9\x6c\x50\x4e\x31\xd4\xd6\xfc\xc5\xe2\xb5\x2a\x25\x18\xd2\x74\x1c\x55\xe9\x59\x18\x67\xb2\x42\x32\x28\xf9\xc1\x9f\x33\xc6\xf3\x87\x05\xc6\x20\x36\xd4\x80\xff\x53\xdf\x12\x07\x7e\x38\xfd\xb0\x73\xc6\x73\x10\x5d\xa1\xe1\x16\x19\xba\x53\x21\xa7\x1b\x5f\x49\x93\x23\x4a\x11\x94\x8e\xa1\x10\xcf\xa2\x42\xbc\x23\xfa\xc9\xaa\xe4\x62\x60\x6e\x39\x64\x1c\xa7\x14\x7e\xeb\xba\x1e\xec\x55\x3f\xce\x94\xe5\x3e\x4e\x01\xb0\x73\xdd\x78\x0a\x2f\xf6\x78\xb3\x15\x72\xca\x11\xee\x08\x77\xe7\x56\xbc\xdb\x66\x53\xe5\xe1\xb4\xcb\xfb\x56\x9a\x9d\x60\xe3\xee\x33\x61\x82\xdc\xb9\xb2\x5d\x1b\xe6\xdb\xf9\xb5\xc7\x14\x6d\x77\x55\x85\x83\x4c\xab\xde\x02\x78\xae\xe5\xd5\x7c\x85\xe9\x83\xf8\x4d\x88\x33\xa9\xe1\x5b\xcc\x11\x19\x8e\x1c\x1d\xa6\xba\x59\x28\x21\x29\xf1\xdb\x96\x6f\x54\x60\xc8\xfb\x65\x30\xfb\xc3\xa9\x8a\x31\xfc\x0f\x4e\x9b\x33\x73\x66\xee\xc1\xdc\xe1\x08\xc8\x26\xd4\x90\x45\xab\xfa\x12\xee\x88\x79\x7f\x08\xf0\x68\x3f\xef\x77\xed\xaa\x35\x43\xb9\x1c\xb1\x18\xe4\x24\xd9\xc4\x08\xda\x54\x74\x31\x12\x51\x07\xd9\xb0\x74\x4c\x24\x43\xce\x99\x17\xe1\xe3\x28\xd8\x18\x50\xba\xbb\xc9\x4d\x92\x0a\x1d\x06\xe5\x24\xdb\xb6\xc2\x3d\xd8\x2e\x17\x87\x82\x2d\x71\xc4\xcd\xc4\x09\xae\x85\xba\x4d\xeb\x58\x1f\x93\x47\x48\xf7\x5e\x7a\x76\x9b\x9d\x68\xc4\x58\x9e\x59\x4e\x65\xcb\x6c\x8f\x49\x03\xff\xba\xbd\x5a\x32\x6e\x89\x44\x1a\x54\x2f\x8a\xc2\x64\xcc\xc6\x4e\x95\xa8\x98\x2a\x71\x0b\x6c\x56\xff\x7d\x10\x91\x6a\xfc\x40\x9e\xa8\xa4\x1b\x74\x67\x9d\xd6\xa7\x66\xf5\x9c\x52\xb9\x30\x5b\xa7\x33\xb1\x3c\x9e\x81\x1e\xe1\x30\x83\x92\x5f\x42\x00\x68\x2b\xd0\x5d\xea\x33\x95\x32\x52\x29\x70\xaa\x14\x9d\x00\x4a\x2e\xa2\x0f\xf4\x61\xe9\xec\x0f\x3b\x62\x56\x5c\x1a\x10\x62\x59\xc8\x36\x60\x5c\xc2\x7c\xad\xc9\x51\x5c\xb9\x97\x9e\x89\xaf\x28\x7c\x02\x7d\x75\xed\xbf\x87\xd5\xcf\xf6\x3a\x7f\xec\x9b\xd1\x0e\x78\x77\xab\x9b\xf8\x68\xd7\x34\xbd\x3a\x23\x74\xce\xf7\x02\x5c\xc4\xda\xb7\x10\xe2\x54\x80\x66\x85\xa1\x36\xec\xd0\x3e\x36\x77\x03\x46\x51\x3a\x15\x14\x5b\x89\x0e\xee\xf4\x7b\x80\xea\x08\xe4\x6c\x81\xd2\x02\xe5\x33\xe9\xa0\x6a\x38\xa6\xf7\x6e\xf5\x7a\x9c\x73\x6e\xc7\x8d\x00\xb8\x08\xe3\xff\xd9\xc7\x9b\x9d\xc7\xa2\xe5\x89\x90\x76\x56\xc9\x32\xab\x8a\x8b\x57\xda\x1a\x49\x5b\xa7\x45\x20\x15\xe7\x92\x4b\x52\x69\xab\x1f\x67\xbd\xb4\x3a\x35\x83\x14\x87\xab\x90\x02\xf5\x2d\x78\xb1\x34\xcd\x37\x51\x92\x5a\xaa\xb0\xb4\x5c\x8e\x6b\x0f\x2b\xf0\xcc\x9a\x46\x59\x31\x71\x08\xfb\xa9\x13\x6a\xab\xb0\x92\x1a\x58\xfb\xb9\xb5\x0e\x51\x24\x3f\x9b\x53\x18\x47\xdc\x96\x57\xe9\x6f\xba\xf7\xaa\x69\x8f\xe6\xfe\x44\xf9\x05\x90\x14\x4c\x70\x33\x72\x50\xc5\x8b\xc5\xdd"}, -{{0xde,0xa1,0x80,0xc9,0x1b,0x53,0x3a,0xaf,0x73,0x6b,0xc5,0xd3,0xc8,0xe4,0x74,0xd5,0xe5,0xd4,0x75,0xb7,0x5b,0x92,0xcd,0xe6,0xbd,0x1d,0x10,0xf3,0xb8,0xf5,0x5a,0xd4,},{0x30,0xb2,0x0f,0xb3,0x20,0xb0,0x0e,0x77,0xc4,0xe0,0xa8,0xeb,0x37,0x30,0xaf,0x3c,0x0b,0x1c,0x5f,0x5e,0xd9,0xee,0x2b,0x05,0x62,0x70,0x7e,0x4f,0x55,0xc4,0x93,0x8b,},{0xd0,0x83,0x33,0x3f,0xb8,0x4e,0x79,0xc9,0xb3,0x3e,0x55,0xe8,0x19,0x2d,0x57,0x1f,0xfc,0x8d,0xc5,0x07,0x45,0xb6,0xb5,0xfd,0xd8,0xc4,0x4d,0x92,0xa6,0x3f,0xd1,0x78,0xc4,0xe5,0x7c,0x2a,0xb3,0xa1,0x21,0x1c,0x0b,0xa2,0xd3,0x9d,0xa3,0x0b,0x06,0x62,0x9d,0x8d,0x1c,0xc1,0xd9,0xf2,0x59,0x32,0x63,0xd5,0x24,0xfa,0x5a,0x2e,0xbc,0x03,},"\x60\x61\x44\xb7\xd4\xf9\x6b\xef\x7f\x11\x2b\x6d\x41\xbc\xb5\x00\xd2\x13\x6c\x13\x4c\xed\xa2\x20\xe2\x4d\x0f\x15\x24\xec\xa1\x2c\x30\xf2\xb1\x02\xc7\xf3\x78\xd6\xbb\xa2\x59\xc5\xb4\xa5\xef\x8e\xc9\x30\x9d\x5c\x8d\xa7\xe8\xd2\xde\xd3\x79\x2a\xee\xea\x21\x08\xf7\x7d\x66\xb2\x30\x45\x93\x8e\xd6\x47\x51\xf2\x0d\x48\x32\x6b\xe2\xfb\x99\x62\x8c\xfb\x18\x73\xd7\xdd\x27\x58\x1c\x10\x5e\xc1\x32\x49\xa9\x52\xa5\x07\x84\xb8\xb3\x4c\xb3\xb2\xc1\xa0\x04\xfa\x8b\x62\x8a\x07\x67\xfa\x9a\xbf\x05\x8d\x95\x5d\xf8\x5d\x13\x4a\x0f\xc7\xf4\xb7\xd7\xfb\x0c\x8d\x31\xbc\xe3\x45\xdd\x0a\x42\x82\x14\x5a\xfb\x2f\xf1\x97\x51\xf2\xcc\x3a\x1c\xae\xa2\x42\xba\xaf\x53\x87\x49\xbf\x38\x80\x00\xe3\xdc\x1d\x73\x93\x59\xdf\xeb\xae\x64\xae\x1e\x10\xfb\x6f\xc1\x7c\xc9\xfb\x95\x05\x35\xc2\xde\x12\x95\x87\xa8\x68\x59\xb7\xbe\x36\xdf\xe9\xb6\xc1\x14\x1b\x25\xe0\x91\x5c\x8d\x4a\xa1\xcc\xea\xe7\x04\x6b\x3d\x7c\xfa\x94\x0b\xc9\x8d\x4d\x69\xfc\x5a\x30\xdd\xe1\xde\xe4\x2f\xb5\x27\x22\x81\xbf\x8f\x8e\x7f\x3e\x1a\x04\x39\x7f\xb4\xf3\xad\xef\xc5\x75\x32\xdd\xbd\xe3\x68\x33\xa6\x76\xe6\xf3\x9c\x82\xaf\xf6\xbf\x48\x32\xec\x97\x1e\x03\xbe\x38\x29\xc0\x2a\x20\x3c\x82\xd9\xeb\x8c\x16\x30\xee\x96\x93\xf4\x5d\x26\xf5\xf5\x1a\x31\x03\xca\x64\xd4\x68\xec\xea\xc1\xb2\x9a\xf4\xc4\x2e\xb2\x16\xd7\x6e\xc8\x99\x48\x36\xb4\xbe\xc7\x64\x89\xca\x50\x70\x68\x0c\x2c\x2e\xb4\x57\x21\x0a\x77\xc4\x7f\xdc\xbf\x60\x01\x72\x07\x3a\x53\xf1\x45\x3b\xb5\xc8\x04\x39\xc8\x82\xf0\x73\x6d\xe4\x06\x37\xb4\xf5\xab\x1f\x76\x1f\xf3\x55\xc6\xe9\xbd\x4a\xbd\xe7\x56\x0d\x5f\xc1\x13\xc8\x30\x15\x9a\x1b\x77\xc4\xe8\x7b\xc2\xc6\x98\x80\xa4\x0c\x58\x05\xec\xc8\xaa\xaf\x57\x57\x5b\xcc\xd8\x17\x7f\xc6\xb8\x35\x69\x23\x3c\x0f\x5c\xa2\x23\xac\x40\x13\xca\x10\x6c\xac\x28\x54\x70\x6a\xea\xd7\x14\xfa\x29\xf2\x86\x0a\x5f\x97\x53\x26\x8a\x36\x71\xd9\xf5\x9c\xde\x60\x48\xcf\x0b\x89\x86\x05\x0f\x7f\x54\x9e\x4f\xd7\x55\x7f\x2f\xc3\xfc\xdc\xcd\xdc\xef\xda\x58\x6a\x64\xb3\x00\x6e\x58\x25\xf2\x7c\xa3\x16\x87\xca\xf6\x63\xbd\x90\xa0\x5b\x11\x52\xd7\xc8\x8d\x7f\x10\x51\xa9\xd7\x91\x74\x86\x51\xd8\x88\xa6\xa1\x2f\x22\xd6\xc8\xc3\xf7\x8c\x2b\x86\xea\xf5\x39\x4b\x4e\xf7\xee\xfb\x89\x79\x7b\x25\xe5\x42\xdc\x93\x10\x2d\x02\x1a\x1d\x0b\xed\x6a\x7d\xcd\xd8\x10\x2b\x8f\x04\x30\xa0\xbc\x21\xd9\x04\xa3\xc9\x34\x6c\x01\x83\x43\xdd\x99\x37\xcb\x35\x25\x00\x07\xa2\x84\x82\x5d\xb0\x8e\x9a\x11\xfe\xe3\x1c\xff\x7a\x31\x4c\x48\xc4\x2d\x8b\x31\x4a\xcc\x27\x82\x2a\xf0\x3d\x19\x54\xc7\xcc\x8b\xf9\xad\x4e\x9e\x98\xf4\xad\x4e\xfb\x35\x52\x88\xda\xa8\xc9\x0d\xe9\x03\x7e\x64\xa7\x86\x1f\x5e\xe4\x3a\xda\x9f\x0f\xcc\xde\x34\xd0\xbc\xf5\x02\x88\x55\x0f\x70\x0f\x21\x5a\x79\x44\xa5\x38\x0e\x2a\x8e\x3f\x04\xf2\xb4\xf5"}, -{{0x9d,0xaf,0x6d,0xbb,0x7f,0x76,0x29,0x66,0xe7,0xa5,0x7c,0x2e,0xc1,0x99,0x6e,0x9f,0x5b,0x55,0x5b,0x98,0x66,0xb8,0xe3,0x1d,0xea,0xab,0x43,0x56,0xeb,0x13,0x81,0x6e,},{0xf0,0x21,0xb5,0x5a,0x36,0xd9,0xfb,0xfb,0xf2,0x97,0x8b,0xc0,0xdf,0x73,0x6b,0x28,0x9c,0x82,0x41,0xd6,0x43,0x53,0x09,0x84,0x1a,0x13,0x4b,0x07,0xd4,0x7c,0xe4,0xed,},{0x49,0xb6,0xbc,0x46,0xb7,0xab,0xb5,0x69,0x4d,0xa9,0x42,0x15,0xef,0xc4,0xb3,0x0e,0xea,0x04,0xae,0x2e,0x73,0xeb,0x2d,0xa8,0xe8,0xc9,0xef,0x9b,0xe2,0x22,0x24,0x98,0xb1,0x7e,0x13,0x93,0x96,0x46,0xc2,0x9e,0x32,0xd6,0x45,0x58,0x46,0x40,0x64,0x15,0x90,0xb1,0xbb,0xdb,0xfe,0x24,0xf3,0x6c,0x6f,0x69,0x4b,0xf8,0x72,0x38,0xee,0x04,},"\x54\x45\x23\x90\x0d\xaa\x67\x78\xc0\x39\x1a\xe4\x04\x4a\x51\xc0\xc4\xa5\xe4\x44\x13\x3f\xbd\x77\x47\xd5\x39\xa7\x44\xfa\x60\xab\x5d\xc5\x4e\x18\x19\xdc\x8e\x56\x89\x9c\x56\xef\xd7\xef\x3d\xa3\x41\x79\x0e\xcc\x49\x64\x5e\xf3\x25\xc6\x56\x8a\xe9\x71\xd3\x0d\x21\xbb\x7f\x23\x46\x4f\x46\xa2\x4b\x80\xd4\x9b\xb9\x3c\x6e\x91\xde\x79\xb2\x43\x31\xd0\x70\x7f\x43\xd0\x66\x5d\x01\x97\x74\x3a\xdf\xf6\x90\xd6\x15\xa1\xc9\x25\x87\x77\xfc\x47\xd0\x21\x71\x42\x42\x6a\x47\x34\x89\x2e\xb6\x22\xab\x8e\x50\xbb\x12\x8e\xc3\xa8\x95\x26\x6a\x38\x61\xa3\x97\x68\xbc\x76\x09\x6f\x58\x1f\xd0\x82\xdf\x9b\x72\x23\xe8\x5a\x8a\xfb\xdb\x5c\xaa\x49\x22\xaf\x2a\x01\x4b\xf8\xa5\xcd\x11\xe5\xc5\xea\x93\xe9\x1c\xd4\x6d\x5a\x1b\x99\xb8\x5a\x26\x70\xe3\x21\xde\x2e\x32\x25\x5a\xfd\x67\xfe\x2c\x37\xfd\x93\x2c\xac\xa2\x2d\x24\x1f\xaf\x4c\xce\xfe\xff\x58\xd6\xbd\x04\xcf\xaf\x11\xde\xdd\x29\xc8\x71\x9f\xfc\xb0\x2e\xf6\x5c\x5d\x3e\xb7\x8b\x4f\xc0\xd1\x70\xa2\xe3\x43\x2c\xc8\x12\xf0\xd0\x41\xd9\x76\x0c\x13\xc1\x2f\x7c\x7f\x2f\x84\xfe\x5e\x0f\x70\x0c\x10\xb1\xa6\x9c\xa4\x66\xa7\x0b\xde\xff\x8d\xbe\xc7\xd3\x18\xfb\x09\xdd\xd8\x27\xef\x61\xca\xa6\x91\x0b\xbc\x06\x1c\xbd\xa2\xb5\x27\xef\x2e\x59\xed\x4c\x17\x22\x99\x72\xf8\x95\x67\xd7\x05\xde\x92\x31\x92\x4b\x41\xbb\x6e\x7c\x01\xfe\x85\x42\x64\x47\x4f\xa7\x6b\x1f\x88\xcd\x57\xea\xc3\x11\x17\x1a\xf1\x03\xd2\x30\x78\x42\x4a\x12\x67\x5f\x2f\xa3\x6c\x2d\xe0\xbf\x53\xc2\x95\xfe\xeb\x31\x57\xde\x95\x89\x22\x98\x6e\x32\x51\x3d\xfa\x33\xb3\x5e\x15\xc3\x94\xa1\x1c\x0f\xcc\x55\xb8\x2d\x6d\xd0\x59\x7c\xdd\xd2\x7e\xde\x7d\xe1\x29\x85\xa6\x16\xe6\x40\x26\xbe\xfb\x5d\x69\x04\x82\xb3\xff\x22\xc0\xdd\x21\xf2\x7a\x08\x6d\x37\xa0\x49\x9e\xa3\x6f\xe2\xc4\xb5\xa9\x59\xd1\x0e\x9a\x61\x0c\xab\x1f\xe0\xd2\x8c\xf1\x01\x3d\xca\xe6\x3d\x8f\xde\xe0\xec\xbd\x8b\x4e\x19\xd5\xd0\x40\xe2\xfa\xd7\xd0\x41\x3a\x38\xe8\xc4\xe7\x35\x52\xad\x46\x04\x7b\x5b\xbd\xd1\x5c\x09\xcc\x0d\x34\xe4\x8b\x91\xfd\xba\xe2\xa9\xd1\x62\xd4\xb2\x1e\xe2\x0a\x1e\xf5\x35\xea\x88\x35\x95\xbc\x49\x51\x69\x2a\x67\x16\x34\x54\xc7\x36\x7f\x13\x4b\xf6\x45\xd4\x8f\x99\x69\xe3\xd4\xf0\xf9\xea\xf4\x14\x4c\xe9\x80\xa0\xa2\xe3\x34\x2c\x74\x6c\x2b\xdc\x3c\xcd\xc2\xf8\xa7\xda\x57\xa0\xe8\x02\x87\x82\xd3\x0a\xf5\x85\x7d\x9e\xfb\x37\x66\x6d\xf6\x5d\x7c\xc3\x84\x71\x66\x61\xe6\x1f\xf5\xc0\x97\x52\x59\x5e\x94\x11\x2c\xa1\xa8\x40\xd6\xe4\xf6\xec\x0e\x55\x49\x4c\x5b\x44\xf7\xc0\xf0\xd4\xa9\x9c\xd7\x09\x05\xbf\x84\x85\x56\x17\x48\xf4\xdc\x0f\xd7\xa4\x4a\x1b\x13\x91\x13\xc3\x8a\x1e\x8e\xb5\xc7\xa2\x0f\x3e\x95\x2e\xae\xa8\xce\x38\xb2\x07\xc2\x8e\xd9\x72\x71\x8f\x03\x1f\x47\x7c\x62\x07\xce\x43\x3c\x51\x5f\x5a\xc2\x84\x0f\x49\x74\xf1\xf1\x69\x89\x62\x6c\x76\xbc\x98"}, -{{0x71,0x86,0xf8,0xd1,0x68,0xd9,0xdd,0xf1,0x7e,0xdb,0xaf,0x0e,0x7b,0x1a,0xbc,0xb2,0x6d,0xa3,0xe4,0xc0,0x27,0x2d,0x98,0x79,0xc7,0xfd,0xff,0x64,0x21,0xc4,0xea,0x50,},{0x96,0xb4,0xa6,0x56,0x23,0x20,0x29,0xfc,0x1b,0x83,0x64,0x70,0x3c,0xbe,0xa7,0xa5,0xd7,0x38,0x75,0x18,0xa8,0x8c,0xed,0x1a,0x91,0x5e,0xc8,0xd8,0x86,0x84,0x81,0x32,},{0xa9,0xc0,0x49,0x9f,0xc2,0x16,0xa1,0x45,0x32,0xd7,0x36,0x36,0x5c,0x63,0x55,0xf9,0x38,0xf8,0xd8,0x19,0x4f,0xa1,0x13,0x28,0x48,0xf8,0x3e,0x49,0x04,0x54,0xd4,0xbb,0xf6,0x92,0x69,0xf1,0x22,0x59,0xfc,0x6c,0x07,0x4c,0x10,0x15,0xe4,0x25,0xe4,0xf4,0xf2,0x7c,0x02,0x9c,0x93,0x33,0x49,0x51,0x36,0x1a,0x35,0xad,0x11,0x76,0x54,0x0e,},"\xa3\xe6\xcb\x6b\x84\xcc\x5c\xf1\xfb\x1a\x84\x8b\x4b\x8e\xa7\xcb\x7c\x87\xe0\x44\x57\x50\xc6\x1f\x9a\xa5\xd7\x7d\xed\xdf\x94\x94\x63\xec\xd3\x9b\xfc\x71\xf2\x61\x0c\x2a\x94\x24\x84\x7f\xb7\x6f\x84\xc5\xda\x1f\xa1\x0e\xf7\x18\xa3\x45\x66\xce\xc1\xb3\xe8\x99\xe7\x25\x2e\x8d\x4d\x34\x60\x16\x49\x8f\xf1\x19\x97\x27\x50\x06\x16\x60\xba\xed\x31\x28\x27\x58\x31\x81\x07\x3d\x1d\xc7\x4b\x76\xc4\x30\xca\x30\xd4\x09\xe4\xe8\x43\x9c\x0f\xc4\x8c\x00\x68\x06\x29\xd4\x3a\xe2\xa7\x7d\x69\x22\x8f\x7f\x8a\x12\x53\xaf\x15\xbd\x2c\xb6\xbb\x1c\x16\x96\x55\x0c\x4c\x79\x0f\x44\x98\x69\x63\x0a\xb9\x2b\x9c\x11\xcd\xe1\xf9\x61\xaa\x21\x03\xec\x23\xf7\xd9\xf0\xfe\x9c\x3c\x41\x32\x58\x2e\xfa\x79\xa6\x6a\xe3\x42\x6e\x51\x05\xb8\x0b\xfe\x5e\x04\xdc\x8b\xb1\xe3\x8a\x31\x10\xcd\x72\x98\x4b\x3e\xf0\x2a\x0c\xa6\x2a\xb6\x38\xcb\xcf\xbc\x8a\x6b\x59\x3d\x26\x13\xdc\x06\xec\x86\xfe\xe3\x4f\x65\x18\xd4\xa3\xfb\xdc\x15\x72\x37\x17\x45\x64\xda\xeb\x66\x74\xcd\xc3\x4f\x4d\x65\x37\xcf\x81\xd8\xaa\x9b\xdd\xbf\x3a\xed\xa3\x12\xda\xae\xee\x33\x6f\x9e\xd8\xbf\xf8\x1e\x29\x4b\xc7\xd4\x4d\x25\xcd\x78\x70\x72\xe6\xcb\x41\x4b\x65\xfb\x7a\x84\x6f\xc0\x65\x36\x7b\xa8\xe3\x7b\xef\xfd\xf0\xb7\xba\x8f\x98\xcd\xf1\xeb\x87\x0f\x4e\x8b\x71\x30\xfa\x34\x29\xd2\xe2\x4b\xce\x59\x94\xda\xf1\xaa\x65\xe5\xf6\x03\xb6\x31\x05\x3d\xc5\x10\xb2\xf0\x97\xe8\x6e\x9b\x9b\x55\x23\x02\x75\x79\x68\xd0\x13\x6e\xe6\x75\x4c\x42\xa3\x2c\x99\x0a\xdd\x9c\xb5\x29\xbc\x89\x75\x1d\xfa\x4e\x5e\x3a\x0b\xad\xaf\x4c\xc4\x0b\x6a\x09\x50\x7f\x9f\xcd\x24\xc3\xca\x72\x25\x95\x99\xc6\xee\x58\xd8\x57\xb3\xa1\x89\xe0\x48\x90\x2e\x88\x5a\x36\x07\x42\x60\x93\xcb\x0f\xab\x43\x7c\x0f\xb0\xed\x2f\x1e\x96\xe9\x44\x1a\x7e\x95\x4f\xe3\xef\x76\x46\xe2\x6a\x39\xa0\x70\x33\xd0\xa1\x55\x5d\xfe\xed\x9a\x6f\x57\x79\x4a\xf3\xa2\xab\xf0\x05\x7e\x9f\x85\x3a\xe5\xc3\x01\x38\xfd\x80\xe2\xf2\x9c\x2f\x4a\x93\xad\x31\x45\xda\x10\xa3\xe3\x1c\xe9\xff\x97\x86\xac\x65\xd8\x60\x37\xd9\x8b\x7a\xa6\xd1\x1d\xe8\x80\x00\x10\xe1\x33\x86\x9e\xb6\x7a\x50\x39\xb9\xb8\xfe\xb6\xef\x90\x3d\x0c\xc7\x46\x41\x26\x07\xda\x72\x5c\xe2\xdc\x6a\x35\x21\x09\xdb\xc6\xa5\xe4\x0b\x17\x0c\x23\x05\x0b\xc4\xfb\x1e\xfa\x0c\x34\xfe\xc0\x0e\xae\x32\x19\xc2\x90\x40\xe8\xf5\x97\x8c\x93\x84\xee\x91\x5d\x8c\x93\x98\xdd\x12\x0d\x5c\x3c\xba\x38\xf8\x52\x6b\x06\x19\x7c\xb2\xc2\x61\xde\xc7\xd7\x26\xae\x13\x0f\x9b\xee\x17\x26\x17\x00\xe9\x99\x31\xfa\xc4\xb4\xdc\xa0\xf7\x58\x70\x1a\xcb\xf3\x70\x7d\x47\xdf\x53\x21\x13\x0e\xc1\x0b\xb3\xb1\x30\x78\xc4\xdc\x5d\xe3\x47\x0f\x15\x8b\x57\xdb\xeb\x87\x8b\x3a\x85\x24\xe0\xed\x2c\x95\x47\x54\x5f\x0f\xdd\xf1\x31\x25\xe4\x5b\xb2\x3d\x6a\x7b\x38\x3a\x18\x7f\x4c\x5d\x54\xa7\xb4\xc8\x3d\x59\x57\xf2\xcd\x7e\x6f\xbc"}, -{{0xe8,0x6e,0x8c,0x62,0x56,0x6e,0x15,0x75,0x3b,0xd5,0x57,0x7e,0xaa,0xe7,0xf2,0x41,0x05,0xb7,0x40,0x55,0xa2,0x56,0x29,0x58,0x07,0x08,0xbf,0xc8,0x3a,0xeb,0xf0,0x6c,},{0x8c,0x8c,0xe8,0x82,0xd5,0xf7,0x65,0x86,0xd8,0xdd,0xcc,0xc5,0x57,0x9b,0xcc,0x1c,0xdf,0x4c,0xfd,0x71,0x62,0x30,0x4c,0xb1,0x0e,0x76,0x96,0x02,0x6e,0x70,0x7f,0x17,},{0x54,0xd2,0xfd,0x44,0xac,0xf9,0xe2,0x09,0xbc,0x7e,0x43,0x33,0x72,0xbd,0x73,0x07,0x4d,0x07,0x80,0x6a,0x77,0xc6,0xce,0x22,0x8e,0x9b,0xe9,0x94,0x41,0x8b,0x00,0xc7,0xec,0xbc,0xb7,0xac,0x00,0x6c,0x29,0x4a,0xec,0x9d,0xe6,0x68,0x57,0x2a,0xdd,0x51,0x7c,0x06,0xb4,0xeb,0x4f,0xe2,0xff,0x35,0x23,0xbf,0x04,0x3d,0xf4,0x4d,0x3d,0x0d,},"\x12\xfa\x63\x1b\x0e\x48\x2e\x9b\x9d\x63\x3e\x94\xb8\x2d\x8a\xb4\x36\xfe\x54\x8e\x5b\x95\xda\x92\x62\x46\x23\xd1\x3f\x2c\x70\xda\x77\x5b\xa1\x36\xc5\x22\x9c\x16\xa0\xc7\xa6\xfa\x91\x4b\x2f\xed\xa5\x64\xe1\x72\x19\xe4\x73\x70\xf9\x51\x5b\xb1\xd5\x9d\xe6\xe9\x58\x62\x04\xd9\x43\xdc\x56\x0d\x73\xe2\xe7\x57\xf7\xeb\x39\xbb\xc7\x11\x1b\xb4\x6b\xc6\x43\xc1\x3f\x60\x21\x12\x73\x9b\xec\x77\x8d\x7d\x4f\x49\xd0\x92\x56\x3d\x68\xf5\x77\x6e\x43\x0e\x3b\x0b\xf2\xdc\x1b\x01\xbe\xb3\x04\x01\x96\xda\x63\x02\x90\x8b\xfe\x91\xe0\xfc\x38\xe0\x4c\x15\x0e\xf9\x07\xdc\x73\x6c\x44\x5f\xf2\x1f\xdb\xd2\xdc\x1e\xac\x0a\x0f\x5d\x00\xa3\x0a\xf0\x28\xaf\xe2\xff\x61\x16\x2b\x75\x8c\x7d\xa9\xa7\x76\x66\x6a\x11\x23\x59\x43\x1c\x48\x85\x6a\x87\xca\x82\xd3\xdd\x1c\x8a\xf3\x76\x59\x86\x35\x43\x2b\xf8\x91\xbe\xcb\xc3\x3a\x8f\xda\x44\xce\x88\x3e\xa8\xaf\x4a\xd8\xb9\x1a\x92\x61\xce\x76\xb9\xe9\x39\xc4\x61\xfa\xc5\x3a\xe0\xf0\x76\xe8\x2d\x87\x9a\xac\xe8\xf3\x8f\x12\x0b\xc9\xb0\x4d\x81\x25\xed\x24\xbc\xd7\x79\xd9\xd2\x43\x86\xb1\xdd\x20\x17\xeb\xee\x81\x97\x37\x6e\x8c\x36\xfa\x3a\xef\x8c\x1e\x71\x3e\x2b\x8b\xce\x49\x66\xd8\x48\x88\x68\x1b\xa7\x84\x95\xfb\xd1\xd6\xcc\xa5\x86\x26\xe6\x85\x4c\xda\x60\x6b\x83\xd6\x29\x3d\x01\xe8\xe3\xe1\x3b\xbf\x4a\xac\x85\x1d\x9a\x1e\x00\xd0\x02\x4e\x26\x99\x3b\x0b\x30\x91\xbe\x7e\x80\x61\xbc\xbb\x3c\xbb\x23\x02\xce\xab\x96\x89\x7a\x8e\x1f\xf3\x67\xec\x86\x25\x69\x3c\xf3\x15\x34\x12\x4a\x9d\x5d\x72\x5b\xca\xe0\x01\xd6\x7b\xc2\x11\x1d\x0a\xb8\x11\x1f\xa1\xd2\x4e\x4e\xd0\x6d\x63\x58\x3c\xe6\x90\xf2\xa0\x46\x26\xd7\x91\xd2\x9e\x3e\x31\x5a\x41\x5b\xf2\xe8\x53\xa5\xf2\x97\x4c\x83\x3a\x3f\xe2\xe2\x90\x9c\xf6\x69\xc7\x3c\x1f\x59\x39\x2d\x30\xc3\x7f\x3b\x9c\x5a\x3d\xdc\xfd\x75\x62\x1f\xda\x36\xe4\xba\x2f\x16\x14\x78\x58\xf6\xf2\x06\xb9\xa1\x40\xf1\xdd\xc1\x46\x6c\x9a\x53\xed\x73\xf8\x24\x90\xbc\x95\x32\x2c\x95\x5f\x61\xd1\x1c\xb5\x1d\x5e\x8a\x58\xc6\xb3\xcb\x0f\xdf\x04\x19\x76\x32\x01\xbe\xea\x93\xa8\x51\x2b\x14\x05\x24\x5b\xfc\x38\x41\x55\xad\xc5\xce\x77\x8a\xa7\x4d\x00\xa3\x22\x72\x64\x65\x11\x9a\xf7\x95\x01\xf0\x40\xdd\x0a\x7a\x84\x06\x00\x01\xca\x89\xd2\xfe\x5e\x9c\xf9\x77\x9a\x54\x7e\x3e\xbd\x3b\xf8\x64\x29\x90\xa3\x69\x0e\x2b\x2c\x3e\x54\xcb\x7e\xee\xea\xbc\x24\x2b\x4d\xd9\x92\x74\xc4\x25\xa8\x67\x93\x1c\x92\x9c\xa7\x08\x08\x60\x1c\x39\x08\xcf\xd7\x88\x86\x7d\x68\x7d\xc3\x66\xe9\x76\x35\x0c\x9e\x70\x58\x4b\xd3\x90\xd6\x7e\xeb\x7c\xfe\xa2\x6c\x42\x68\x6d\x3d\x96\x20\xf6\x2f\x64\x10\x4e\xf4\x1e\xd1\xd1\x30\xd7\x9e\x32\x59\x38\x48\x62\x96\xb7\xab\x2d\x2a\xdb\x78\x52\x67\x43\xe4\x00\xac\xb2\xb7\xaf\x09\x62\x8d\x68\xcf\x94\x75\x10\x16\x25\xc2\x0e\x1d\xc0\x51\xd7\x3c\x99\x7c\x95\x2e\x12\x81\x2c\x80\x5b\x68\xff"}, -{{0xa5,0xca,0xb2,0x72,0x7e,0x2f,0x13,0x1a,0x4d,0x63,0xfa,0xce,0xe7,0x99,0x33,0x66,0x63,0x93,0x0a,0xa0,0x7a,0xfd,0xa6,0xbd,0x5a,0x8e,0x98,0x5a,0x02,0xde,0xb1,0xea,},{0xac,0x35,0x5f,0x95,0x26,0x0f,0xbf,0xea,0x77,0x8c,0x55,0xb5,0xaf,0x8b,0x3f,0xd1,0xf2,0x4d,0x26,0x93,0xda,0x35,0xde,0x4e,0xe5,0x08,0xa2,0x7e,0xd3,0x50,0x39,0x1f,},{0x13,0x8c,0x7a,0x8e,0xca,0x5b,0x5c,0x37,0x15,0x88,0x13,0x84,0x3c,0x9a,0x90,0x4e,0x5f,0x53,0x0a,0xd9,0x71,0xee,0x43,0x2a,0x44,0xf3,0x44,0xf8,0xc6,0x4b,0xbf,0xaf,0x10,0x2f,0xf4,0x1d,0xaa,0x5c,0xf7,0x22,0xa4,0xbc,0x66,0x40,0x58,0x87,0x59,0xb8,0xf3,0x6f,0x9c,0x05,0x9e,0xab,0x93,0x6c,0xc4,0x5e,0xd4,0x79,0x63,0x94,0xa0,0x02,},"\x48\x34\x39\x15\x4d\xd5\xe5\xd1\x09\x85\x7c\x24\xd1\xc4\xe7\xfb\xbe\xfd\x2f\x38\x65\x1d\xa8\x12\x89\xf2\xad\x3d\x61\x54\x30\x65\x38\xb8\x2a\xc7\xdb\xa9\x21\x0e\x74\x07\x76\xed\xe4\xcc\xf5\x1d\x4f\x63\x09\x4b\x03\xe4\x6a\xd3\xaa\x3c\x31\x94\x7d\x8c\x36\xce\x6f\x94\xe8\x52\x96\xbd\xed\xcc\x1e\xad\x62\xea\xa1\x44\x1e\xcd\xe0\xa2\x25\xd0\xbf\x02\xed\xca\xcf\x86\x50\x14\x89\x9a\xf6\x6d\x98\x08\x04\x0c\x2d\x02\x00\x0a\x0f\x5c\xe4\xf1\x68\x3c\x1a\x49\x52\x76\xd9\xc4\xd7\x28\xc9\xec\xd6\xf0\x78\xdb\x8a\x0c\xfc\x26\x71\x87\x23\x85\x62\xab\x1a\x1e\xa2\x81\x3f\xb4\xf1\x2e\x87\x8e\x1b\xa1\x43\xf4\xd0\x6a\x3b\xc8\x10\x0c\x35\x50\x11\x8d\x69\xda\xe6\x7b\x55\xed\x69\x2a\xcf\x94\x44\xda\xa5\xc3\xe3\xc0\xa9\x8e\xe2\x8c\xf1\x72\xde\x0c\x58\x4c\x9f\x2e\xc9\xbb\x6e\x9b\x57\xf5\x72\xa8\x6f\xf8\x72\x9f\x65\xf4\xc6\x5b\x7f\xea\xcc\xaa\x21\x72\x0e\xd7\x9e\x90\x61\x8b\xca\xfb\xfd\x95\x33\xda\x85\x23\x2b\x45\x08\x83\xaa\x91\x9f\x82\x7f\x04\xc4\xa9\x7b\xf5\x13\x90\xd4\xf8\x56\x9c\x19\x17\x26\xf4\x4f\x7e\x39\xfb\x3d\xb7\x3b\xfc\x41\x5b\x6f\xfc\xa8\xb9\x1a\xca\xad\x69\x23\x85\x72\xf1\x4b\x49\x98\x5e\xa0\x3c\x98\xd7\xb1\xd4\x4b\x3a\x65\x54\x76\x5b\x19\xab\xf9\xb2\x52\x74\xe9\x7e\x46\x34\xe4\xb0\xf9\xe8\x02\xeb\x6f\x74\x3f\xff\x95\x07\x57\xee\x01\x3a\x69\x88\x22\x18\x81\xa7\x44\x3f\x1f\x32\xbc\xcb\x00\x7e\x99\x37\x9c\x7c\xa4\xf9\x06\xd5\xfe\x11\xcb\x12\xf6\x6b\x53\xa3\xd2\x1a\xc9\x47\xbe\x0c\x81\x50\xbc\xd0\x4f\x1c\x81\x6b\x3f\x0c\x07\xc5\xfb\xc0\x90\x5a\x71\x36\x95\x68\x49\xda\x03\x83\x6d\xae\xc2\x5c\x3e\x1a\x06\xec\x3a\xeb\x20\x56\x48\x17\x6f\x89\xf4\xa2\x91\xfa\xc4\xf1\xd3\x89\x9f\x56\xc9\x06\x5e\xeb\xb8\x76\x8b\x84\xb3\x1b\x7c\xc0\x31\x08\xbd\x08\x88\x33\x8d\x17\x74\x99\x49\x70\x29\x2d\x93\x50\x31\xfe\xa3\x35\xd9\xe7\x90\x8f\xe0\x25\x48\x89\xc0\xb1\x71\xcf\xe0\xaf\x2e\x6f\xde\x7a\x5e\xa3\xde\x1f\xdc\xda\xe5\x37\xb6\x31\x31\x19\xc2\x7f\x77\x20\x24\xef\x36\xe4\x5c\x8b\x89\xf2\x6c\x93\xd9\xee\xa1\x37\x25\xe1\x2d\x81\x0c\xf9\x82\x4a\xea\x04\xcb\x80\x2d\xa7\xe4\x58\xe8\x42\xca\x37\x5e\x36\x71\x34\x6e\x00\x89\xde\xc5\x71\xbe\x16\x9b\x0d\x90\x96\x6b\xf3\x68\xfe\x36\x98\xfd\x3e\x72\xbf\x16\x24\x9d\xd9\x00\xaf\x6d\x29\xff\xa4\x83\x51\x36\x0f\x12\x24\x17\x14\x58\x5f\x7a\x9b\x4c\x7b\xaf\xc9\x52\x22\x67\x35\xde\x14\x62\x74\x3d\x78\xab\xad\x0f\x67\x11\xf2\x49\x5f\x33\x13\xad\x4e\x0b\xa2\x16\xb0\xde\xa5\xdc\x15\x16\xa9\x54\x9f\x7d\xfc\xfe\xb9\x3e\x59\x1a\xbe\xda\x5e\xa3\xc7\x04\x59\x06\x52\x3b\x40\x86\x8c\xa5\x73\x5d\x6a\x33\x71\xc3\xc2\x94\xc1\x11\x26\xd0\x97\xf4\xc7\x08\xe9\x04\x64\xc1\xad\x91\x42\xfa\x0b\xed\xf0\x7d\xfc\x5f\x4c\xb6\x7d\x6e\xd8\x0f\x1b\xfe\x72\x68\x3c\xfb\x2a\xd6\x65\x30\xdc\x43\xd7\x02\x3f\x37\x90\xff\x42\xd9\x5b\xd8"}, -{{0xcb,0x63,0x19,0x61,0x37,0x79,0xa4,0xef,0x66,0xbe,0x14,0x14,0x4b,0x28,0x40,0xad,0x01,0x67,0xc0,0x3f,0x3b,0x8d,0x04,0xff,0x59,0x2c,0xd1,0xd2,0xd7,0x22,0xe3,0x30,},{0x18,0xeb,0x03,0xf0,0xa3,0x34,0xb0,0x80,0xe1,0xaf,0x43,0x99,0xd8,0x37,0x6d,0x83,0xc5,0x33,0x31,0x6d,0xc6,0x87,0xcf,0x34,0x1f,0x0a,0xfa,0xb4,0x50,0x96,0x52,0x99,},{0xc1,0xb3,0x99,0xcd,0xc1,0x98,0xe9,0xa1,0x59,0xe6,0x84,0xfc,0x26,0x68,0x6d,0xe6,0x60,0xda,0x54,0xcf,0xe3,0x12,0xca,0x73,0x45,0xdf,0x0c,0x7d,0x15,0xa3,0x57,0x43,0x01,0x44,0x10,0xbd,0x2f,0x6c,0xd1,0x1e,0xef,0x33,0xa8,0x9b,0x3d,0x15,0xcb,0xc1,0x7c,0x7a,0x35,0x89,0x37,0xfd,0x99,0x72,0x05,0x05,0x1f,0x92,0x57,0xc2,0x56,0x09,},"\x87\x4a\x6c\x81\xd6\xdb\x71\x33\xa7\x91\x69\x76\x0c\x84\xd3\x6e\xea\x3d\x42\xea\x08\x92\xb7\xc8\xdd\xe8\x44\xa3\xa6\xb6\x0a\xa9\xf2\x66\x07\x26\xc9\xc4\xdd\x26\xa0\x1f\x4e\xd0\xdc\x1c\x53\xba\x60\x05\x46\x3f\x7e\xa6\x4a\x1e\xc6\x39\x53\xbc\x3d\x81\x05\x2a\x2f\x10\x84\x38\x9a\x77\x06\xdf\x74\xed\x41\x36\x08\x2a\xb5\xc6\xe8\xc7\xf4\x11\xdf\x9d\x3a\x0f\x3c\x40\xf5\xa6\x0e\x2d\x21\xa8\x54\x8e\x7a\x25\xde\xe3\x40\x30\xb3\xc3\xe7\x5c\xaa\x93\xdd\xaa\x9c\x19\x0c\xb6\xde\xda\x24\x13\xd5\x4e\x37\x3d\x43\x53\xdb\xa4\x3d\x39\x49\x1a\x2f\x56\xc8\xb3\x6d\x45\x01\x6f\x77\xd7\x47\x16\x91\x63\x45\x39\xe7\x6c\x4f\xb4\x19\x13\x47\x2b\x0a\x23\x05\x4f\x54\x8f\x54\xb1\xe7\x10\x9c\x8b\x65\x21\xb5\x7a\xe9\x81\xd0\x50\x31\x6a\x33\xc4\x9c\x71\x16\x26\x8d\xcc\x4b\x78\xc2\xba\xe5\x3a\x3a\xe4\xdd\x17\x8b\xb8\xb7\x6b\xb3\xbe\xfe\x19\xe4\x1a\x2c\xf1\x2c\xeb\xb7\x11\x68\xf9\x71\xf2\x02\x46\x1c\x63\xf7\xd6\xee\xf1\x07\xf5\xb1\x03\x0e\xdd\x4e\x75\x00\x9e\x91\x16\xc3\xcd\x0e\x8b\xdd\xc2\x99\xb4\x1f\x1a\x45\xe7\x84\xef\xa6\x46\xda\xda\x64\x06\x8e\x92\x48\xec\x98\x8f\x23\x26\x34\xad\x3d\x5a\xab\x19\x56\x0e\x83\x0a\x5b\xd6\x65\x45\x7c\x94\x29\x5e\x1a\xf0\x16\x0f\xbc\xe2\x72\xef\x48\x45\xdd\xf0\xc4\xf2\x4d\x97\x6f\x51\x86\x90\xea\x1f\x82\xff\x4d\xfa\x48\x13\x64\x1a\x67\x59\x8e\xa9\x84\x01\xe0\xff\x10\xa0\xe5\x82\xe2\xb9\x08\x67\xb4\xe6\x23\x2c\x34\xea\x49\x9c\x16\x99\x09\xa4\x41\x26\xf3\x77\xd8\xcc\x1c\x11\x90\x58\x66\x34\x0e\xfd\x1e\x7b\x07\x7d\xc7\x45\x6d\x59\xc9\xb9\x6a\x12\x4a\xac\x3b\x33\xbb\x22\x74\x41\xbb\x7a\x52\xe6\xc3\x14\x0d\x7a\x4f\x67\xca\x05\xbb\xc9\x3c\x93\x77\x5b\x92\x91\x19\xa2\x24\xed\x8f\x39\x00\x58\x20\xf4\x20\xcc\x6c\x53\x0e\x61\xe2\x0a\xdc\xa0\x1e\x93\x9c\xc0\x31\xdf\x49\xcd\xb1\xec\x8f\xf4\x93\xc9\xef\xbc\xad\x34\xc5\x71\x08\xef\xd7\x64\x55\x89\x66\xfb\x14\x70\xb0\x74\x5e\x69\x66\x19\x1a\x9a\x9e\x44\x58\x1b\x09\xfa\xf4\x69\xf9\x51\x53\x72\x03\xd9\x26\xbc\x8a\x55\xd0\x80\xa8\x05\x18\x1d\xd7\x29\x6e\xd2\x0a\x81\x82\x68\xf7\x55\xea\xa6\x6b\x08\x22\x42\xf4\xd0\x20\xf7\xcd\x67\x20\x89\x04\x84\xc0\x1c\x75\x7f\xe3\x5d\x87\xb5\xbc\x90\x6d\xea\xcc\x2e\x30\x71\xde\x46\x01\xbc\xf0\xdd\x6b\x83\x7c\x43\x31\x06\x04\x7f\xd8\xec\x9b\xd0\xe9\x8c\x9e\xe8\x06\xf7\xec\x8c\x5a\x10\xea\x21\x36\xf1\xf9\x0f\x90\x0b\x85\x3f\x95\x3f\x00\xb0\x76\xbd\x1e\xbd\x92\x9d\x08\xa3\x8b\xec\x68\xd8\x66\x43\x50\x47\xbc\xb6\x72\x1e\x06\xb6\x40\x85\xdc\x05\x58\xc1\xfa\x85\xa2\xc8\x3b\x0c\xaf\x4c\x81\x60\x84\xf1\x0a\x4c\x58\x85\x29\x5b\xca\x15\xff\x7c\x18\xe5\x96\xc6\x2c\x92\xee\x99\x21\xa2\x7c\x29\xd1\x95\xbd\x28\x22\x13\xff\x36\x60\xb6\xe7\x54\x6b\x4e\xaa\x77\x7c\xe3\x9f\xc5\xd2\x04\x84\xc7\x1e\xd6\xca\x06\xf9\xb7\x7a\xb1\xd8\x72\x39\x3a\xb2\xd1\x02\x55"}, -{{0xb2,0x98,0xad,0xf3,0x8a,0x67,0x08,0xf8,0xd1,0x8f,0xf1,0xed,0x96,0xbf,0xba,0xb4,0x21,0x54,0x0d,0x09,0x6c,0x4e,0x43,0x51,0xb9,0x22,0x09,0xb5,0xe6,0xaa,0xab,0x65,},{0x77,0x0e,0xdf,0x42,0xb8,0xa0,0x39,0xc6,0xca,0xb9,0xba,0x65,0xeb,0xfb,0x13,0x5a,0xbc,0x2d,0xa3,0x14,0xa4,0xc3,0x09,0xf4,0x6a,0x8f,0x32,0x5b,0x52,0xd0,0x65,0x93,},{0xe5,0x5f,0x8d,0x30,0x41,0x22,0xdc,0x17,0x5c,0xf0,0x27,0x46,0x74,0xfc,0x9d,0xed,0xfe,0xc2,0xb5,0xf8,0xa2,0xee,0xb1,0xe3,0xe7,0xf8,0xe0,0xdf,0xba,0x0d,0xac,0x2d,0x32,0xf4,0xe7,0x04,0xce,0x91,0xcd,0x59,0x91,0x84,0x13,0x3c,0x3b,0xf1,0x06,0x3d,0x2f,0xae,0x63,0xd7,0x3a,0xcc,0x57,0x72,0xd7,0x18,0xd8,0x11,0x83,0x31,0x86,0x02,},"\x9d\xf4\xd5\xd7\x56\x5d\x2c\x05\x22\x62\xdd\x34\xd6\x00\x7d\x86\xd9\xc0\xf0\x7c\x70\x89\xaf\x61\x19\xe3\x04\xf4\xd8\x01\x1d\x7e\xaa\xd7\x7b\x3e\xf7\x0c\xc2\x80\x84\x7d\x59\xf2\x97\x20\x2b\x7e\x18\x61\xae\xf3\x34\xbf\x38\xde\x14\x74\x0e\x80\x73\xc9\x55\xa8\x51\xd2\xcf\x3d\xad\xc3\xed\xce\x15\xbe\x49\x0e\xaa\x84\x5b\xa5\x53\xfc\x6e\x87\x46\xe5\x29\x15\xe6\x55\xaf\x4b\x86\xc6\x29\xd4\xc5\x22\x78\x36\x35\xd4\x64\xa2\x82\x57\x77\xd8\x9d\x70\x97\x67\x7e\xf0\xe5\xee\xae\x38\x53\x7e\xcb\x65\x6e\x3b\x28\xdd\x07\x35\x8f\xd9\xfb\x2c\xd4\x62\x51\x72\x86\x65\x9a\xef\xc7\x9d\x37\x4d\x1d\x13\xed\x93\x96\x7c\x53\x0c\xde\xa4\xf3\x14\xa0\xf9\x1d\x62\x89\xb4\xc7\xa4\x27\x9b\x6f\x4c\x4a\xbc\xa3\x33\x57\xf6\x9e\xd8\x4b\x91\x19\x63\x7a\xdb\x7c\x18\xe6\x94\xcb\x3c\x56\xe7\x36\x37\xda\x91\x07\x35\xd4\x3c\x38\xaa\x80\x86\x67\x5a\x06\xad\x37\x0e\x57\x26\x88\x1d\xa5\xe1\xa1\xdc\x61\x44\xd6\xa6\x2a\xff\x7f\xb0\xc3\x52\xd8\x8d\xc9\x71\xa3\xd7\x2d\x30\x71\xe1\x4b\x47\x42\x53\x56\xaf\x1b\x01\x92\x33\x53\x82\x61\x45\x1a\x99\xa6\xcf\x4a\x07\xce\x9a\xb1\xc3\x99\x0d\xe6\xab\x8d\xe2\x11\x6c\x75\x61\x05\xc5\x12\xb7\xa3\xee\xb3\x15\x7b\x15\x8b\x32\x1e\x44\x4e\x80\x6d\x89\x0b\x38\x90\xed\x9d\xdc\x86\x9f\x17\x11\x72\x3b\xb9\x9a\x72\xbd\xb9\x23\xd1\x31\xba\x4e\xdb\xfb\xb6\xda\xe9\x9a\x5c\x7b\x32\x8d\x31\x0d\xf9\xa6\xd1\xdc\xd8\x59\x18\x96\x28\x33\xe8\x9e\x20\xf5\xc5\xe6\x33\x3a\xc8\x61\x09\x4a\xe9\xe7\x99\xc8\x64\x1b\x9b\xae\xa1\x1a\x2e\x0e\xc2\x34\xbe\x59\x30\xe0\x28\x80\x85\x9c\xde\xc0\xd9\x78\x23\x7c\xbe\xa5\xc7\xc3\x2c\x11\x1b\xaf\xdd\x4b\xfb\xff\xe4\xfb\x34\x85\xef\xfe\xcd\x51\xbd\x19\x5a\x71\x40\x4c\xa5\xb5\x9a\xfa\x25\x2d\x7b\x5f\xf9\xd0\x30\xf4\x8c\x6f\xaa\xdb\xdb\xa9\x18\xf2\x1a\x0c\xd3\x9a\xf5\x69\x66\xdc\xcf\xa2\x5f\xb5\xa5\xcf\x9a\x4b\x26\xa7\xf5\x44\x1d\xf6\xe3\x20\xe3\x4b\x27\x39\x3d\xe2\xec\xfb\xd6\x9a\x15\x94\x90\x9a\x6c\x68\x5e\xc6\x45\xfc\xf3\x04\x8d\x01\x48\xfa\x38\xd3\xe8\xa6\x4d\xc3\xc2\x1a\xe4\x4d\xa7\xe4\x6a\x5e\xa7\x93\x6c\x2b\xa0\x83\x68\x9a\x78\xca\x3a\xc6\x0b\x87\xbe\x6d\x23\xea\x40\xf5\x96\x15\x83\x74\x28\x42\xe3\x75\x25\xa4\x9c\x5f\xe8\xfd\x15\xd7\xb0\xc9\xe8\xfc\xcd\x07\x93\x6d\x19\x53\x82\x12\xf7\x37\x3d\xbb\xf3\xdf\x7d\x46\xad\xf9\xd9\xf5\xdb\x09\x52\x4c\x65\xb8\x83\xae\x6f\x6c\xef\xa2\x4b\x19\xec\x48\xce\x28\xcf\xa7\x34\xd9\xbd\x6e\x77\x83\x7d\x1a\x14\xd6\xa1\x9d\x34\x5b\xfb\xea\x55\x9e\x7e\x6b\xfb\x71\xdd\xad\x83\xcd\x8d\xee\xab\x68\x7f\xe7\x3c\x05\x74\x88\xf8\xf2\xb3\xe2\xe2\x6d\x13\x00\x9f\x4d\x23\xe6\x61\x9a\x23\xc0\x69\x2a\xf7\x66\x69\x21\x7d\x5e\xbd\x46\x08\x5b\x39\x88\x90\xe5\xc9\x1f\xdb\x4d\xb5\xba\x40\xe7\x77\x3d\x51\x8d\x3c\xf0\x0c\x0a\x5b\x5a\x4b\x0f\x1b\x85\xd6\x29\x16\xa5\x9e\x56\x07\xb7\xb1\xeb\x80"}, -{{0xe9,0xcf,0x16,0xd6,0x96,0xf6,0x3b,0x59,0xe5,0xe2,0x5c,0x9e,0xe2,0xd7,0x5b,0xb0,0x5e,0xd2,0xba,0xa5,0x91,0xa7,0x55,0x7f,0x9f,0xb1,0x29,0xcf,0x98,0x3d,0xe0,0xba,},{0x6d,0x1a,0xe3,0x85,0xe8,0x0a,0x39,0x55,0xe8,0xd0,0xc5,0x93,0xa8,0x1f,0x43,0x1c,0xd4,0x32,0x67,0x1e,0x78,0xcd,0xba,0xfe,0x83,0xfe,0x58,0xdb,0xcd,0xb9,0x85,0x60,},{0x81,0x12,0xac,0x37,0xea,0xfb,0x74,0x9d,0x3f,0x4a,0x1e,0xa1,0x48,0x43,0x79,0xdf,0x3e,0x38,0x3b,0x01,0x9c,0x12,0xde,0x85,0x15,0xe3,0x49,0xe4,0xf6,0xf9,0x98,0x63,0x2e,0x30,0x96,0x83,0x47,0xa1,0xd1,0x5b,0x09,0xda,0x2e,0xb8,0x00,0xb0,0x3d,0x81,0x9d,0x20,0x2b,0xd1,0x0a,0x6a,0x46,0x3b,0xb0,0x2b,0x36,0x6d,0x68,0x55,0xfe,0x0e,},"\xa1\x0f\xea\x8f\xc9\x3e\xcc\xfe\x2a\x6b\x78\x26\x07\x95\x63\xad\xf8\xaa\x9a\x66\x64\x44\x93\x22\x00\xcc\xa9\x44\x7d\xd0\x27\xc5\xc7\x20\x4e\xa6\x2b\xf8\xf5\xe2\xe3\x91\x45\xac\x39\x48\xab\x3f\x31\x86\x88\x7b\x30\xbc\x60\x23\x30\x24\xb4\x83\xf3\xf5\x19\x03\x6a\x3e\x94\xc8\xd7\x51\x0a\x85\x3a\xc6\xe2\x0c\x6e\x52\x6e\xe3\xcd\xb7\x6d\xe6\x63\xf6\x73\x05\xad\x80\xdf\x23\x42\xc8\x50\x1b\x4f\x4a\x8e\xe3\x66\x5a\x79\x8f\xc4\x37\xdd\x81\x4e\x4e\x47\xe7\xa4\x66\x89\x0e\x0f\xfa\x8f\x51\x0f\x3e\x6e\x19\xc9\xc9\x69\xf7\x0a\x76\xe5\xcf\x30\x54\xd1\x7d\xe4\x59\xac\x8e\xe9\x95\x50\xbd\x38\x31\x9f\x36\xe4\x33\x43\x4a\x92\x6a\xd6\x8b\x96\x1e\x0c\xa1\x0a\xdd\x4b\xa9\x92\xb3\x65\x06\x60\xa2\xc3\xc2\x6f\x5d\x74\x0a\x31\xaf\xb7\x76\x3f\x54\x2f\x72\x3b\x8a\x3c\x92\xd8\xae\x92\xa5\x67\x76\x4e\xfc\x70\x53\x03\x12\xba\xab\xdd\x3f\xbb\xd5\x27\xfe\x0f\xcb\xca\x3f\x6a\x70\x64\xcd\xde\x18\x56\xe9\x7a\xb7\x86\xaf\x7d\x70\x22\xa9\xd4\x6a\x33\x8e\x8e\x17\x54\xaf\xd9\xad\xac\x85\x6a\x38\xde\x2a\x4c\x97\x66\xde\xe8\xdb\xc7\x09\xb0\x67\x1a\x6a\x6e\x6e\x1e\x5d\x12\x07\x4d\x22\x24\x5c\xd7\x3b\xee\xeb\x1b\xd8\xec\xfc\x1e\x85\xa2\x1b\xde\x25\x3f\x7c\x46\x5a\xbc\x1f\xea\xa9\x61\xc0\xff\x5c\xff\x2d\x89\x64\x72\xae\x17\xab\x84\x88\xe3\x3f\xfe\xfd\xb7\x2c\x10\x5e\x20\x4f\x94\x4a\xda\x51\xee\x13\x98\x1a\x13\x6c\x0f\x38\x42\x6e\x3e\x49\xb0\xe9\x18\x41\xc3\x27\x94\xd5\x2f\x13\x35\xdf\xa6\x37\xf1\x51\xc7\xe4\x0f\x9b\x83\x0a\xed\x53\x9a\xc5\x73\x1b\x81\xcd\xe3\x26\x4d\x22\xbe\xad\x31\xa6\xcc\x68\xd1\xa7\x31\x43\xb5\xba\x48\x16\x13\x92\x32\xf3\xf7\xf9\x79\x83\xf4\xec\xba\x64\xc4\x95\x53\xbe\x9d\x6d\x94\x3f\x91\xdf\xe0\x3d\x1e\xe8\x61\x8c\xd4\x0d\x2f\xb7\x23\x8a\x31\xd1\xbc\x38\xe7\x6a\x55\x1f\x9e\xee\x22\xe7\x3a\x27\xd7\xa4\x8b\x40\x87\x72\xea\x72\xc3\xed\x63\x7b\xb4\xb1\x68\xf9\xd7\xae\xad\x94\xea\x03\xbc\x11\x10\x99\x01\xc8\x89\x92\x7d\x51\xcd\xac\xf9\x62\x12\x59\x62\x55\x99\x79\xd3\xe4\xc8\xe3\xb5\xae\x58\x2f\x2d\xba\xd4\x99\x88\x02\x85\x6c\x4d\xf6\x9e\x8f\xb5\x49\x17\xe2\xf3\x6b\xb6\x7a\x19\xa2\x6e\x9a\x9a\x94\x85\xbc\xe9\x8d\xbf\xff\x0d\x2b\x02\xb9\x37\x7a\x91\x37\xa7\x34\xe5\x7b\x5c\xe6\x65\x05\x30\x17\xe9\x92\x67\x7a\x1a\xa0\x79\x24\x0d\x2c\xf9\x63\xcd\xf9\xbf\xea\x8d\x46\x00\x91\x23\x2d\xaf\x89\x80\x1f\xd7\x51\x71\xa6\x19\x5a\x5c\x04\x68\x15\x91\x4b\xe1\xf6\x28\x68\x78\x3d\x6f\x2c\xf2\x8a\xf9\x37\x8d\x6c\x68\x93\xe7\x5d\xe6\x41\x11\x1c\x68\x47\x27\xef\xfa\x31\xb8\xbc\x9b\x0a\x01\xdb\x9c\x9e\x81\xcc\xd8\xf4\xd4\xe8\x75\xd4\xbd\x90\xd2\x53\xf5\x89\x89\xa8\xa5\x2a\x20\x3a\x77\xa4\x96\xd6\x97\x98\x6b\x03\x1e\x9f\x69\x9b\xc6\xa1\x6c\xd5\xf9\xc3\x60\x18\xeb\xda\xa3\x6b\xad\x0e\x01\x4f\x4c\xf3\xb4\xb7\x46\x17\x1b\xf8\x93\x14\xe8\xb7\x2c\xbd\x47\xcc\x61\x6a"}, -{{0x23,0x8a,0x6d,0x49,0x79,0x32,0x1a,0x14,0xa9,0x97,0x23,0x6f,0x45,0x85,0x04,0x6c,0xf7,0xa0,0x5c,0x0a,0xdc,0x6b,0xa1,0xfd,0xb1,0x9e,0xc2,0xa3,0x2f,0x62,0xbe,0xeb,},{0x0b,0x4b,0xa6,0x74,0xe4,0x01,0x66,0x5b,0x67,0x90,0xcf,0xda,0x08,0x07,0x04,0xcd,0x90,0xe2,0xf3,0xd3,0xef,0xab,0x25,0x3e,0xd8,0xdc,0xfb,0xd1,0x8e,0x40,0x67,0x89,},{0x29,0x42,0xf7,0x08,0xc0,0xed,0xe4,0xcb,0x0d,0xde,0xf1,0x3b,0x85,0xd7,0x1d,0x72,0x13,0xe0,0x38,0x3d,0xd2,0x94,0xf5,0x34,0x13,0x5f,0xd6,0x9c,0xaf,0xbc,0xfc,0x0e,0x33,0x09,0x0a,0x2a,0x0c,0xa3,0xfa,0x57,0x2c,0x72,0xcd,0xf5,0x59,0x2d,0xe9,0x03,0xb1,0x58,0x44,0x95,0xab,0x63,0x99,0x81,0x50,0xf2,0xb3,0x93,0xa3,0xb3,0x40,0x0c,},"\x97\xcd\x61\x9a\x22\x51\xed\xa9\x16\x64\x64\x31\xd4\xcd\x15\x98\xc2\xd4\x4d\x06\xaf\x3e\x48\xbd\x18\xe3\xde\x7f\xb4\xbd\x4f\x78\xe0\x0a\x69\xee\xab\xde\x3f\x82\x06\x5c\xfe\xe6\xcd\x71\x1f\x07\xd2\x26\x37\x16\x1f\xf6\x85\xf6\x5a\x7d\xdf\x54\x55\x31\x97\xfd\x31\xc5\xc6\xb7\x1d\x9e\x36\x5a\x94\x1d\xce\x4c\x3e\x22\x5d\x19\xcc\x63\x3a\x7e\x12\x86\x2c\xd2\x3e\xbb\x7c\x74\xa7\x04\x85\x0f\x76\x1a\xc0\x24\x1b\xe5\x17\xce\x7c\x36\x09\x36\xce\x07\x25\x0d\x9f\x2e\xb2\x78\x71\x15\xee\xc3\x77\xe1\x13\x4d\xc0\x8f\x44\xeb\x0a\x2a\x2a\x27\x16\xf0\x01\x44\xa4\x9f\x01\x2a\x57\xb3\xcd\x06\xef\xeb\x3f\xae\x92\x0f\x28\x5c\xff\xd9\xa4\x01\xa0\xb9\x86\x59\x4e\x17\xb2\xc9\xc8\xfd\xab\x83\x5d\x9f\x3f\x5d\x47\x4b\xe7\x33\xc1\x92\x5e\xe6\xf0\x93\x86\x71\x10\x66\xc3\xfc\xd6\x45\xee\xb0\xfb\xe7\x05\x41\x69\xeb\x70\x9d\x4a\x3f\x0d\x16\xf2\x8a\x1f\xf5\x06\x6c\x84\x2b\xc6\x3e\x35\x9e\x92\x48\x5b\x38\x75\x7f\xf4\x6c\x27\xf7\x9d\x0c\xdc\xf0\xe1\x6e\x97\xe3\xc7\xb7\xe2\x17\x8d\xff\xd2\x70\x28\x2d\xd6\x12\x05\xd5\x85\x4d\x84\x1f\x0e\x3f\xc0\xe4\x82\xcc\x1e\xe4\x85\x52\xcf\xe6\x58\x93\x5b\x54\x27\xc3\x66\x23\x0a\xef\x79\xae\xf4\x02\x1d\x6f\xab\x5f\x18\x75\xcc\x84\x9e\x32\x1a\x75\x50\x0e\x9e\x1b\xa5\xdd\x59\x6b\x43\x8c\xf8\x8b\x23\x5b\x01\xa6\x76\x25\xc4\xbf\x84\xd0\x72\x4a\xe6\x88\x0a\x37\x85\xe3\x3b\xd9\x23\x5f\xd0\xf5\x98\x18\x04\xd2\x1c\xbd\x63\x3c\xb1\x80\xf3\x44\x56\x46\x02\x07\xa2\x90\xa2\x54\xd9\xfe\x61\x06\x3d\x40\x63\x4c\xa3\x87\x2f\x09\x35\xfa\x28\x32\x87\x95\xca\x41\xb0\x06\xa2\x11\x1f\xc5\x93\x2b\x1e\x77\x9c\xe9\x66\xcc\x47\xad\xb7\xc0\xdd\x98\x73\x33\xba\x75\x29\xa1\xa4\x99\x6c\xe9\xf5\x6e\x05\x19\x81\xfe\x1f\x55\x3e\x57\x8f\x43\xc3\xba\x94\xbe\xac\xc9\x3c\x3e\x73\x96\x67\xc7\xa7\xc6\xfa\x27\xe1\xe0\x81\x69\x5d\x20\xba\x70\x5c\x3f\x10\xb2\x0d\xf5\x30\xcb\xb0\xec\xb8\x74\x56\x50\x11\x09\x68\x70\x19\x31\x84\x52\x78\x5d\x38\xe7\x66\xb3\xcd\x35\xb0\x07\xd7\xe3\xcf\xe0\xb2\xcc\xa8\xaa\x6e\xf7\x39\x55\x99\xdc\xb9\xc4\xd2\x8b\xcc\x35\xc7\x6d\xfc\x35\x34\x3c\xb1\x34\x8b\xa3\xe9\x62\xf1\x0e\xe8\x6f\x86\xf5\xb6\xd4\xca\xe2\xe8\xc2\xb1\x85\xe3\xea\xa1\xae\xb8\x7b\xcf\xcf\x2f\xb7\x6c\xc7\xfc\xc6\x89\x50\x71\xb1\x68\xe8\xb7\xf6\xca\xa0\xfd\x63\x98\xe7\x78\xcc\x07\x91\x2f\xf5\xd6\xe6\x10\x21\xa8\xa5\x9a\xe0\x35\x21\x60\xf5\x6d\x54\x88\xfe\x2f\x2a\xcc\x94\x03\xda\x9a\x9f\xfc\x66\x1c\x1e\x9d\xc5\xbe\x88\xc4\x20\xdb\x0f\xd7\x7d\x84\x5d\xc8\xdd\x9d\x8e\x58\xf9\x96\x1b\x79\xaf\xc6\x86\x24\xba\xa8\x6a\xa6\x43\xa8\xa3\xc7\xed\xf7\x1d\x55\x3c\xc0\xd3\x22\x4a\x60\x69\xec\x67\x4f\x52\xda\x29\xa1\xcb\x60\xc4\x19\x23\x01\xa2\x43\x47\xa8\xaa\x83\x26\x26\x9e\x0a\x14\x78\x0c\x95\x83\xcd\xff\x51\x59\x27\xfd\x5b\xef\x52\x8f\x9d\x23\x78\x7a\xeb\x80\x3d\x70\xeb\x91\x6b"}, -{{0x59,0xd5,0x01,0x39,0x3d,0xc5,0x99,0x97,0x23,0x81,0x07,0x06,0xfa,0xd7,0xd6,0xef,0xd1,0x63,0xc4,0x47,0x10,0xc7,0x41,0xc1,0x85,0xc2,0x7e,0x04,0x25,0xe3,0xc0,0x5b,},{0x82,0x65,0xd4,0x3c,0xfb,0x07,0x35,0xb5,0xd7,0x25,0x0f,0xcf,0x0f,0xcb,0xd1,0x54,0xbf,0xc0,0xee,0xcb,0x13,0xb7,0xad,0x93,0xb6,0xb0,0x29,0x40,0x58,0x8b,0x84,0x3b,},{0xe6,0x46,0xf1,0x64,0xcf,0xed,0x8c,0x2e,0x06,0x07,0x10,0xdc,0xfb,0xc3,0xe9,0xfa,0x5e,0xb3,0x96,0x37,0x68,0x13,0x19,0x01,0x84,0xe3,0x46,0xf5,0x2b,0xb0,0xba,0x57,0x46,0xcc,0xb6,0xb5,0x95,0x22,0xb1,0xaf,0xf9,0x83,0x0f,0x2f,0x98,0xb9,0xe5,0xda,0xfc,0xd8,0x32,0x07,0x78,0x83,0xc4,0x4e,0x8a,0x35,0x38,0x8f,0x71,0x8b,0xf4,0x0c,},"\x56\x4e\xd2\x2c\x17\x2f\x5c\x3a\xfb\xb0\xb9\x5a\xd2\xfc\x64\xe4\xbe\x6d\x4d\xb1\xeb\xb8\xd3\x99\xc4\x3a\x5e\x16\x04\x8e\x7f\x87\x32\x18\x1e\x5d\x0e\xed\x8e\x63\x8e\xf2\xa5\x5a\xa0\xd7\xb6\x81\xfe\x02\xbb\x54\x23\xaf\x94\xbd\x35\x2d\x3c\x2d\xde\xc0\xf8\x47\x60\xa4\x11\x2b\x4f\xe0\x17\xcf\xbc\x50\x2f\x95\x43\xcf\xa4\x1f\xb2\xaa\xe7\x5a\x3a\x08\x1f\x8c\x49\x90\x33\xd1\xfa\xe5\xd9\xc5\x0c\xb4\x4d\xbc\x63\x60\x5a\x54\x39\x8f\xbf\x07\x98\x52\xeb\xa8\x6f\x2f\xdf\xc2\x72\xd0\xc4\x17\x9d\x7c\x13\xcb\xc1\xc2\xa3\xda\x0b\x82\x84\x5c\xf1\xa4\x6e\xbb\xe3\x1e\x79\xb6\x00\x97\x33\xc7\xbf\xe7\xaa\x4f\x9f\xfd\x71\x9c\x77\xdc\x7d\x74\x8e\x49\x2e\x14\xee\x5e\x41\x79\xbf\xa9\xe6\x49\xcf\x0d\x89\x53\x41\x86\x38\x5e\xe9\x94\x10\x05\x1d\x66\x56\xe6\x23\x43\x8c\xc7\xb2\xe7\x07\xe4\x8c\x84\x91\x55\x49\xae\x8d\x67\xa3\x06\xc6\x7b\x10\x6b\x7a\x25\xf4\x5f\x8e\x10\xdd\x7d\xd3\xea\xac\x31\xf1\x05\x22\x57\xeb\x6a\x75\x76\xb6\x85\xcb\x9e\x6c\x1c\xd0\xd7\x3c\x7a\x3c\xed\x5a\x8d\xd2\x73\x08\xae\x00\xf9\x5e\xab\xda\xe9\xd1\xc4\xaa\x89\x34\xe2\x42\x4c\x93\x28\xa5\x22\x8f\x4f\x82\xdd\x4a\x66\x55\x6d\x82\x17\xc5\xa2\x2b\x2b\xeb\x86\xa2\xa4\x34\x13\xee\x5e\x10\xf8\x83\xf2\xcd\x6c\x2e\x87\x49\xb5\x50\x88\x42\xec\xae\x5f\xfc\xcb\x79\x6d\x96\x33\xe8\x7e\xf4\xa9\x6c\x0d\xf7\xef\x47\xb2\x83\xd0\x96\x72\x3b\xa3\x13\x5b\xad\x75\xb2\xe1\x9e\xc0\x4f\x70\xa4\x78\x42\x8a\xd5\xd0\xaa\xc0\xdd\x2a\xb9\x90\x59\x13\xe7\xe5\xad\xe4\x08\x80\x1d\x5d\x3c\x54\xd9\xcf\x7b\x8f\x0f\x0c\x5e\xb0\x54\xc1\x47\x5c\xc2\x10\xa2\xc7\x98\xd8\xbd\x89\x93\x2f\xf9\xf3\x60\x42\x18\x58\x05\x3a\x70\x7b\x8b\xbd\x32\x05\x5c\x44\xb2\x07\x12\xa2\x67\x8a\x9a\x6a\xf9\xe3\x6d\x04\xdc\xff\x44\xf4\x31\xcf\x19\x30\xcd\x18\xfc\x93\x5d\x22\x67\x77\x5c\x69\x09\x67\x25\xed\x89\xa2\x91\xdd\x60\xe2\x1a\xc0\xb0\x12\x87\x34\x07\x29\x92\x82\x3e\xf8\x7b\x5e\xfa\x6c\xc5\xb0\x50\x17\x7f\x55\xf4\xce\xc9\x2a\x08\xa6\x5b\xca\xdc\xab\x9a\x41\xc3\x60\x86\x37\x0b\x7b\x9d\xd6\x29\x8a\xc7\xb0\xae\x6a\x09\xc9\x71\x0a\xbb\x46\x76\xa8\xfc\x87\xa3\x65\x12\x90\x14\x4b\x6b\x30\xef\x4f\x6f\xbe\x5b\x9a\xd2\x52\x37\xfe\x06\x05\xe3\xb9\xf1\x8a\x77\x18\xac\x9f\xca\x6f\x32\x5e\xa5\x5f\x49\xa8\x07\xfb\x80\xa2\x40\x2a\xe1\x34\x23\x08\x0d\x32\x77\x58\x64\x90\x23\x79\x8d\x57\x28\xe0\xdc\x64\xac\x88\xa6\xe2\x94\x5d\xbb\x3e\x3f\xfa\x9f\xdb\x4c\x7b\x58\xfb\xa3\xf5\xfb\xd6\x7c\x68\x6b\x29\x71\xbb\xd8\xba\x4d\x27\x5d\x57\x3e\xb7\x96\xeb\x91\x46\x77\x5d\x8c\xdc\xd5\xfd\x3e\xb5\xa8\x8e\xa5\xa9\x30\xec\x32\x44\xe6\xa3\x7c\x81\xf6\xa2\x55\x4e\x5b\xa7\x87\xf0\xe4\x53\x19\xfe\x4b\x8a\x2f\xfb\xfe\xd5\x07\x70\xe7\x82\x7b\x3e\x7b\xc2\xb4\x4c\xe5\x12\xae\x60\x51\xb6\xf9\xf1\x39\x31\xea\x6a\xcc\x09\x6b\x8d\xcb\x01\x96\xbe\x42\x24\x84\xdb\x5f\xcb\x29\x9d"}, -{{0x83,0x9f,0xb1,0x32,0xe6,0x92,0x50,0xca,0x1a,0xd9,0x45,0x10,0x08,0x7f,0x92,0xce,0x06,0x87,0x69,0x21,0x3a,0x19,0xb2,0xa6,0xc8,0x94,0x90,0xf1,0xf5,0x78,0x80,0x7a,},{0xeb,0x58,0x66,0x19,0xb4,0x4a,0x15,0x37,0x9a,0xcc,0x46,0x21,0xa2,0xac,0x71,0xea,0x58,0x97,0x00,0x26,0xc2,0x8e,0x24,0x09,0xfc,0x1b,0xa2,0xbd,0x8b,0x23,0x6d,0x1d,},{0x66,0x43,0x7b,0x6b,0xc0,0x5e,0x75,0xdd,0x16,0x26,0xc3,0xc4,0xff,0x1f,0x72,0xe6,0xdb,0x38,0x1b,0xa1,0x59,0x09,0x48,0xf8,0xf1,0x6a,0xd4,0xd6,0x6e,0x59,0x91,0x65,0x9a,0xa8,0x44,0x05,0x56,0x8c,0xfb,0xc0,0xa7,0x7c,0x02,0x5e,0x59,0xe4,0x3f,0xd5,0x3a,0xb9,0xff,0xab,0xba,0x7b,0x25,0x8f,0x78,0x79,0x62,0x39,0xf9,0x0d,0x45,0x01,},"\xc5\x72\x32\xfe\x32\xf1\x1e\x89\x4b\x43\x7d\x40\x45\x62\x07\xcc\x30\x6d\xb4\x81\x69\xb2\x0e\x07\x81\x10\x3a\xff\xe8\x02\xf5\xaa\xbe\x85\x82\x95\x2c\xa8\xe9\x57\x45\xe9\x94\x0d\x53\x5e\x00\xff\x65\xab\x3c\x64\xbe\xd3\xd1\x17\x3a\x0f\x3d\x70\xce\x4e\xbe\x2b\x50\xd0\x48\xbb\x47\x16\x4d\x2a\x2c\xd9\xd9\x5a\x10\xcf\x0d\x07\x3e\xd1\xc4\x1b\x3d\xe3\x33\x52\x8e\xe3\x29\x68\x22\x3a\x0d\x84\x7c\xad\xbb\x5b\x69\xf3\x82\x16\x4e\x9a\x28\xd2\x3e\xc9\xbd\xe9\xa8\x28\xe8\x77\x1c\x9e\xb4\x92\x20\xaf\x54\x18\x55\x08\xaa\x07\x3a\x83\x91\x95\xf1\x03\xbc\x2f\x32\xfe\x04\xf9\x51\xca\x45\xbf\xbf\x30\xd2\xfb\x81\x14\x05\x6a\x73\x6a\xdd\xf2\x7e\xcd\x9a\xf0\xf6\xe5\xe9\x7e\x57\x73\xc4\xfa\x90\x22\x68\xc3\x2a\x15\x14\x10\x95\x5f\x3c\x76\xaa\xe2\x55\x54\x9e\x0f\x03\x3f\x89\xe1\xa7\x8f\x26\x5c\xba\xb6\xbe\xb7\x51\x6d\x4b\xad\xc4\x9c\xda\x45\x88\x31\x62\x25\xb4\xc8\x5e\xa9\xfa\x99\xc7\xd6\x76\x6e\x94\x90\xc4\x9d\xe5\x9d\xa7\x17\xf6\x67\x65\x35\x30\x07\x1d\xd2\xf0\xc5\x3e\x31\xd8\x76\x81\x56\xfe\xb0\x8f\xaf\x00\xdb\x0a\x04\x53\x3d\xf9\x79\x57\xa8\x4a\xa4\x6a\xeb\x7e\x36\xc0\xb0\xbe\x69\x01\x89\x46\xf1\x53\x8a\x6a\xea\x71\xdf\x53\x6f\x14\x42\xc2\x44\x4a\x43\xa0\x43\xd0\x46\xab\xde\x1a\x78\x2b\x0f\x4f\x5c\x6a\xa7\x20\xaa\x60\xaf\xed\x94\x7c\x0c\xee\x47\x7d\xbe\xc0\x05\x57\xb3\x72\x12\xd9\x33\x57\xca\x2b\x6b\x6f\x82\x71\x5b\xa0\xe4\x84\xf6\xda\xf2\xd0\xb7\xa9\x8c\x03\x35\x19\xce\x38\x26\x35\x86\x79\x6d\x5d\x31\xcb\x2b\xc3\xd1\x12\x5b\xc0\xcc\xd3\x29\xa5\xc2\x1f\xd2\x7a\x21\x8d\xed\x60\x7a\x0e\x75\x15\xb5\x71\xf1\x92\xc3\x3f\x5f\xba\x51\x4a\xfe\x4d\x45\x81\x00\xf3\xcc\xba\x3f\x38\xeb\x43\x0b\x4f\xc8\x8f\xae\xf9\x99\xfa\x71\xee\xe4\x88\x22\x89\x03\xbe\x29\xf2\x4d\xf8\x1d\xc9\x11\x04\x4e\x92\x4c\xda\xa0\x17\xcc\x7d\x87\xe5\x6a\x6c\xba\x87\x60\x85\x9b\xd6\x3d\xd2\xd4\xf5\x81\xb9\x55\xec\x92\x4a\x49\xaf\xb4\x7c\xa0\xd6\x3e\x78\x26\xfd\xc7\x12\xb4\x94\x3b\x73\x9e\x18\x57\x75\x5a\x33\xc6\x50\x36\x75\xfd\xde\xae\x06\x27\x06\xe3\x4f\x74\x4f\xd9\x32\x64\x8a\x56\x08\xce\x60\x8a\x61\x99\x57\x83\xf3\x33\x9c\xa3\xfe\x10\x7e\x19\x72\x74\x4b\xf6\xd4\xed\xaf\xbf\x47\xce\x02\x1e\x05\x82\x1f\xb1\x24\xc7\x08\x39\x30\xe6\x8e\x6f\x5c\x32\xd2\xd9\xfc\x4a\x88\x4c\x0b\xc8\x84\x04\xe4\xcf\xe3\xc1\xa2\x42\x0d\x41\x82\x3a\x38\x5f\xb3\x28\x8d\xb6\x5c\x89\x54\x5f\x6e\x73\xf0\xd8\x00\x4b\x2b\xa1\x2a\x4e\x07\x72\x75\x23\xef\x08\x56\x70\xda\xff\xaf\x41\xc2\x8a\x4c\x11\x57\xbd\xd2\x45\xe6\x87\x50\xdd\x20\x0e\x02\x3a\xf9\x0c\x67\x56\x1e\x0f\xe4\xba\x34\x0c\x43\x3f\x75\x5e\xef\xab\xd4\xb0\x39\xbf\xc3\x23\xdc\x11\xad\xb7\x5a\xec\xc4\x48\xa8\x69\xc7\xf2\xa5\x8b\x9d\x86\x17\xc6\x4b\x8f\x89\xfc\x58\x3f\x8c\x94\x8e\x2d\xf0\x25\x1a\x6c\x7d\x8c\x73\x8c\x3b\x5a\x42\xb7\x49\xad\x5e\x8e\x98\x6b\xd8"}, -{{0xad,0xc1,0xe5,0x6c,0x3a,0xc9,0x4e,0x6c,0xda,0x04,0x11,0xcb,0xc3,0xce,0x2a,0xf1,0x28,0xd1,0x85,0xa2,0xa2,0x73,0xbd,0xb2,0xaf,0x8d,0x7e,0x50,0xfb,0x96,0xb5,0x26,},{0x5d,0xcf,0xec,0x1f,0x91,0x12,0x75,0x15,0x64,0xec,0xb6,0x07,0x15,0xeb,0xb2,0xc5,0x17,0xb5,0xec,0x37,0xb2,0x53,0x4f,0xd6,0x32,0x99,0x24,0x42,0x9b,0x7f,0xd5,0xc5,},{0xf0,0x2e,0x5d,0xbc,0xb6,0x87,0x04,0xaf,0xad,0x03,0xac,0xa8,0x10,0x61,0xdb,0xdb,0x99,0x85,0x70,0x04,0x9f,0x10,0xce,0x65,0x0e,0xc7,0xa2,0xef,0xf1,0x5c,0x79,0x3d,0xdf,0x5a,0x27,0x2c,0xb6,0x83,0xc2,0x2c,0x87,0x25,0x7c,0x59,0xbd,0xef,0x39,0xef,0xea,0x79,0xbd,0x67,0x95,0x56,0xea,0x15,0x05,0xed,0x00,0x36,0xcb,0x46,0x04,0x0c,},"\xd4\xf9\x59\x47\x4e\x0b\x89\xe2\xdc\xd0\x20\x66\x98\x4f\x88\xd7\x39\xdd\x11\x34\xa3\x33\x09\xf0\xa8\xb7\x80\x2e\xaf\x01\x33\x03\xc1\x35\x15\xdf\xeb\x46\x1e\xa3\xd2\x48\xe9\x98\xb9\xa4\xe5\x4d\xae\x5b\x00\x19\x0a\x45\xe7\x0d\xc6\x7e\x98\xf3\xd4\xcf\x90\x6c\x21\x4d\x4f\x63\x6d\x29\x52\x92\x5e\x22\xb1\xa8\x6a\x1a\xab\xb3\xa8\x92\xa9\xf8\xed\x45\x4f\x39\xc6\x3d\x35\xb7\x1e\x87\xa2\xda\x55\xa8\xe1\x67\xac\x83\xa8\x66\xad\x16\x7a\x17\xae\xd1\x83\xc0\x85\x18\xc1\x5e\x6b\xe3\x48\x58\xb4\xce\xe2\xb8\x42\x73\x14\x76\x0f\xff\xdd\xd5\x92\x38\x54\xb1\x74\x7f\x79\x6e\x1a\x52\x49\xfb\x30\x44\x89\x4e\xd6\x46\x82\x9f\x65\x43\x16\xee\x52\xf4\x01\x0c\x8d\xd3\x21\xfa\x1d\xec\x39\x7e\x50\x14\x5e\xd9\xe3\x16\x86\xfd\x52\x03\xf7\x23\x3b\x8d\xa7\x80\xac\xaa\x91\xee\x0b\x5b\x47\x20\x78\x66\xaa\xd8\x5f\x83\x7e\x03\xb4\xe6\xf6\xde\x8c\x04\xac\xaf\xd7\x07\xbd\xc1\xdd\x45\x50\x0a\xb5\x64\x80\x1b\xee\x9a\x58\xec\xe3\x60\xd0\x04\x82\x8b\xaa\xf5\x23\xe2\xf5\xab\x69\x32\x6a\x03\xaa\xbe\x01\x08\x78\xfd\x43\xff\xaa\x56\x87\x22\x44\xd7\x68\x1f\x16\x18\xe6\x23\xe3\xd4\x74\xc7\x3a\xf8\xb0\x80\xa6\x18\x21\xa5\x74\xef\x2f\xd7\x52\xd2\x3b\x60\x5e\xc5\x21\xc1\x9c\x15\x50\xde\x98\x0c\x09\x4d\x05\xe0\x23\x8f\x3e\x00\x8e\x6b\x19\x5a\xbf\xdd\x40\x28\xee\x1e\xe1\xd6\xc6\x6a\x76\xf1\x78\xf0\xb4\x31\xe4\xaf\x44\xdd\xcc\xfc\x52\x90\xed\xff\x36\xec\xe6\x3e\x83\x85\x56\x70\x13\xf4\x3a\x2a\xeb\xb6\x7e\x3e\xf4\x06\x30\x8c\x20\x48\x8a\x76\xd5\x8a\x21\x4f\x31\x39\xd9\x83\xb1\x9a\xfb\x12\xe3\x28\x36\x07\xfd\x75\x10\x7b\xd3\x1f\xeb\x62\x56\x17\x4b\x7a\x18\xae\xca\xc9\xf8\x56\x25\x82\x01\x8b\x0e\x6d\xe4\x05\x35\xe3\x5b\xef\x2b\x56\x25\x53\x88\x51\x29\x39\x75\x62\x90\x0d\x34\x17\xf9\x8c\xdd\x1e\x29\xd7\x31\xff\x48\x93\x3f\x29\x52\x95\x81\x63\xba\x67\xd5\x95\x61\x81\x1b\x83\x77\x2b\xd0\x57\x10\xb6\xe3\xcc\x04\x34\x60\x99\x37\x50\x72\x23\xab\xb7\x1a\x6a\x8c\x83\x8f\xec\xdb\x1d\x2d\x37\xc9\x5d\xc8\x06\xf6\x5f\x3f\x96\x63\xd9\x9f\x06\xe6\xc0\xf3\xc3\x2e\x95\xaf\x1d\xd7\x08\xe8\x11\x08\x63\x6a\x26\xb9\x68\xe9\x83\x39\xc7\x41\x28\xb6\xcf\x67\x13\x35\x88\x4a\xc7\x2f\x75\xb6\x37\x19\x5e\xa9\xec\xa0\x53\x60\x89\x96\xc3\x2e\xd4\x45\x41\x0f\x67\xfa\x10\x4b\x39\xf0\xfd\xf3\xc9\xb5\xc6\x15\x7b\x76\x80\x37\x56\xb2\x7f\x4c\x3b\xa1\xb4\x7f\x32\x85\x76\x24\x8e\x9b\xc5\x3e\x7b\x8a\xb0\xb2\xed\x97\xc2\xf9\x99\x8b\xcc\x7d\xfe\x39\xe2\x64\xaa\xd3\x0c\x6c\xfe\xf2\xb5\x55\x3f\xfb\x5a\x69\x9a\xa4\xbd\x0e\xab\xe4\x38\xce\x05\x22\xcc\x91\xfe\x4e\x72\xbf\x7e\xac\xba\x47\x71\xcc\xf6\x3a\x37\xaa\xfc\xad\xbf\xbf\x99\xdd\x76\xb8\x5b\x80\xee\x07\x5d\x3a\x7d\x1a\x90\xa5\x5b\x77\x29\xa5\x41\x6e\x5b\xe6\x96\xbf\x9f\xb7\xf3\x15\x8c\xfd\xb5\xcf\xda\xcd\xde\x81\x72\xee\x1a\xb9\x48\x6e\x24\xcc\xea\xd2\x9b\x45\x7a\xcf\x43"}, -{{0xdb,0x89,0xdf,0x6a,0x23,0xd8,0x90,0xb7,0xf0,0x02,0x60,0xe8,0x1f,0x4a,0xd9,0x8f,0xd0,0x94,0x40,0x36,0x51,0x31,0xe8,0x5e,0x22,0xc7,0x95,0x1a,0x18,0x7b,0x02,0x18,},{0xc9,0x67,0x63,0x67,0x2e,0xe4,0xa2,0xcc,0x5a,0x93,0xb6,0xa6,0x83,0xdf,0x9b,0x5d,0xe4,0xd9,0x38,0x6a,0x79,0x08,0x35,0x68,0x1d,0x12,0x17,0xd1,0x92,0x96,0xbd,0xc8,},{0x80,0xb7,0xfc,0x8b,0x6a,0xe6,0xee,0xce,0x81,0x66,0xb7,0xea,0x53,0x4c,0xb5,0xb2,0x14,0xc9,0xea,0x99,0x73,0x92,0x1e,0xd0,0x5d,0xe4,0x0c,0x78,0xe1,0x4f,0x16,0x2b,0x09,0xe9,0x78,0xca,0x6d,0x86,0xee,0x43,0x4d,0x98,0x4b,0x8b,0x00,0x70,0x40,0x9d,0xd2,0xad,0x11,0xb5,0x31,0x78,0xe2,0x39,0xda,0xb5,0xbc,0x39,0xc7,0xba,0x46,0x0d,},"\x54\xc1\xc5\x11\x1e\x08\xc9\x82\x45\xba\x4f\x13\x18\xba\x1d\xb1\xdc\xc7\x4d\x14\xa5\xc9\x8a\xb9\x68\x9c\xba\x1c\x80\x2c\x68\xbc\xfc\x81\xfd\x87\xff\xc6\x1c\xaa\x94\x2f\x66\xd7\xe5\x15\x7f\x65\x53\x8c\x7e\x7b\x33\x17\x04\x84\xb4\xb6\x54\x3f\x36\x20\xff\x29\x63\x8b\x64\xd4\xda\xe7\xb0\x22\x21\xcf\x77\x83\xf1\x87\xec\x42\x31\xe6\xb6\x94\x6d\x82\x76\x20\x74\xf0\x9c\x32\x78\x1c\x2f\x38\x46\xde\x3e\x82\x17\xf6\xe1\xb6\xe0\xd2\xb5\x59\x5d\x74\x2e\x2c\x4e\x32\x5a\x28\x41\x92\x40\x44\xdf\xcf\x12\xb4\x79\xeb\x69\xf1\xbb\xd4\x0e\xab\xdd\xd1\xff\x54\xa9\x18\x4d\x36\x6d\xff\x9d\x8f\x2d\x86\x3e\x37\x8a\x41\xf1\x0c\xd1\xda\xe9\x22\xcd\x7f\xbb\x2a\x54\x4e\x47\xea\xbf\x47\xca\x0a\x38\xab\xba\x34\x45\x49\x19\xbb\x9a\x4e\xf0\x44\xbf\xb9\x7b\x70\x8c\x2f\x74\x28\xd6\x8f\x9c\x57\xc0\xee\x7e\x79\x25\xf7\xa2\xb5\xc6\xe7\xdf\x82\xbb\x26\x80\xc8\x62\xdc\x7c\xc6\x8b\x0f\x54\x53\x0e\x64\xaf\xe2\x76\x3d\x9c\x7b\xaf\x45\xcc\x6f\xe6\x12\xd1\xf7\x82\x77\x39\xc4\x41\x13\x98\x88\x8f\x73\x67\xc3\xd4\x37\x79\x07\xac\xc0\x6a\x06\xf9\x3f\x88\x72\x26\x79\x8f\x48\xaa\x54\x64\xf6\x01\xc2\xc1\xed\xda\x77\xed\xfe\xb9\xb9\xb5\xd5\xf9\xcb\x6f\xed\x37\x90\x05\x47\x47\x7f\xca\x1d\x09\xab\x52\xd6\x3e\x49\x1f\xeb\x12\xfd\x6d\xc8\x05\xa7\x8c\xee\x3b\xaa\xde\x43\x52\x98\x20\x61\xde\xa5\xa2\x65\x3d\xb8\xe7\x60\x77\x72\xe8\x34\xb3\xa5\x05\xc1\x6d\xd6\xe7\xc7\x1b\x91\x1e\x84\x2e\xba\x92\x5d\x77\xa3\x3c\x5c\x57\xce\x11\x84\x09\x80\x78\xca\x2e\x6a\x3f\x69\xaa\x6a\x14\x63\x9d\xc9\x7b\x4b\x30\xc9\x9d\xc4\xfa\x3e\x2c\xf6\x3c\x70\x1c\x30\x6c\x5e\x25\x3c\x51\x13\x85\x4c\x18\x5e\xbc\x8b\x47\x98\xf6\x8d\x1f\xd7\x80\x05\x4d\x3e\xed\x2f\x39\x4c\x45\x43\x04\x96\x6b\xdd\xbd\x12\x28\x08\x34\xec\x9b\x40\xc1\xe9\x8b\xc2\xd9\x8f\x48\x45\xf6\xeb\x44\xf2\x53\x15\xee\xdb\x3b\x79\xff\xca\x41\x80\xc1\xbd\xdd\x97\xd0\xc9\xaf\xfb\xac\x58\x81\x49\x37\x68\x26\x80\x07\x6f\xe5\xa3\xba\xbb\x65\xd2\x8f\x25\x17\x03\x6c\x0c\xfb\x42\xf0\x29\x3e\xb2\xac\xb1\x39\x49\xfe\x91\xe0\xad\x06\x78\xaa\x24\x3d\x77\x34\xa8\x9d\x99\x78\x70\xbf\x9a\x6a\x58\x4e\xd6\xe6\x28\x16\x3e\x39\xd8\xaa\x61\x0d\x46\xb9\x28\x5b\x9e\x1d\xd7\xe8\xf8\x07\xfd\xf5\xca\x2b\xbf\x6d\xe5\xe5\xe6\x8a\xf7\xcb\x7e\xbd\x43\xec\xce\x22\x7c\xd7\x0c\x7b\xf4\xee\x14\x33\xed\xfc\xfe\x88\x66\x14\x67\x0c\xdd\x19\x63\x43\xfb\x91\xe1\x54\x16\xd2\xf6\xac\xba\xe3\xea\xdc\x03\x02\x31\xee\x9d\x2e\xcc\x52\xa8\x8c\xe8\xdc\x7d\x09\x8e\x7f\xac\x77\x68\x5b\x4e\xb5\x40\xe3\x01\x93\x07\x14\x32\x21\xb8\xef\x77\xf3\x63\x2c\x89\x3d\x55\x6e\x0b\xb7\x43\xa1\x96\x3e\xc1\x58\x86\xc8\x54\x5e\x87\xc9\x5c\xc8\x25\xf2\x00\xd0\xf3\xcf\x4f\x55\xa3\xd6\x60\xa5\x36\xa2\x3a\xef\xcc\x42\x8a\x43\x20\x34\x85\xee\x84\x34\x2f\x5c\x00\x1e\xe8\x40\x4e\x75\x90\x17\x00\x62\x82\xab\x8b\xa8\x90\x3e"}, -{{0x00,0xe6,0xbb,0x17,0xaf,0x3c,0x2d,0xf6,0x52,0xb3,0x4f,0x9a,0xbe,0x19,0xf9,0x90,0x19,0x07,0x42,0x33,0x68,0x6c,0x71,0x14,0xe3,0xa0,0xed,0xf0,0x83,0x09,0x93,0x4f,},{0x7b,0x82,0x32,0xa6,0x6c,0xec,0x2f,0x91,0x5a,0xaa,0x79,0x51,0xd2,0x9d,0x2b,0x9e,0xe9,0x3d,0x32,0x1d,0x15,0xb2,0x03,0xc5,0x1e,0x61,0xe8,0xce,0x83,0xd1,0x87,0xf8,},{0x04,0xb3,0xb8,0x50,0x1e,0x39,0x6c,0x4a,0x78,0x8e,0x14,0xac,0x49,0xf6,0x17,0x4c,0xdb,0x5c,0x85,0x5e,0x65,0x12,0x03,0xcf,0x68,0xd1,0xef,0xa8,0x9a,0xa5,0x86,0x78,0xd4,0xd1,0xf3,0x03,0xa9,0x87,0x7a,0x37,0x86,0xd2,0x03,0xc3,0x55,0xb0,0x9d,0x52,0x86,0xc1,0xca,0x0d,0xf0,0x4a,0x89,0xaa,0x06,0xcc,0x3f,0x9d,0x0f,0xd3,0x05,0x04,},"\x06\x32\x81\xe4\x1e\x8b\xa9\x70\x3e\xd0\x9e\xf3\xbf\x0e\xa4\x6e\x4c\xab\xdd\x6e\xbd\x76\x9d\x05\xdc\x04\x5d\x4f\x99\x0d\x69\xfc\x55\x41\x30\xa4\xe6\x1a\xa2\x1e\x2d\xe4\xc9\x2d\xb4\x8a\x20\xa3\x7b\x17\x47\xa7\xea\xc5\xeb\xb2\x73\x5a\x89\x38\x19\x7f\x13\x9f\xad\x14\x97\xb3\x51\xad\x06\x4c\x0f\x18\xf8\xfa\xf1\xfe\x11\xf6\x39\x79\xa6\x99\x68\xe2\x4c\xf9\x1e\x58\xa3\xab\x03\x26\x69\xe4\xef\xee\x27\x4f\x96\xb5\x8b\xe7\xd9\xe3\x91\xf3\x6f\xcf\x07\x09\xb2\xcb\x2d\x22\x69\x4a\x6c\xeb\x17\x24\x69\x45\xeb\xb3\xbc\x7f\x0f\x03\xbf\x0b\x08\xdc\x96\x26\xe3\xe7\x15\xc9\x91\x67\x1d\x53\xeb\xb9\xae\x83\xa7\xd0\x8d\x44\xf6\x36\x35\xc4\x0f\x8d\x48\x17\xf5\x8d\xe9\xeb\x77\xcb\x25\xb2\xac\xd6\xde\xf9\x69\xab\x56\x9e\x97\x4a\x8a\xda\xc1\x1a\x86\xb5\x8f\xe6\xc1\x00\x67\x49\x9f\xc9\x14\xdf\xf5\x69\x02\xcb\xc3\x93\xa7\x1c\xc2\x5e\x8f\x05\xc0\x3c\x94\xf1\x3b\x84\xa2\xb0\x1a\x58\xc1\x0d\xbc\xbb\x60\xeb\xce\xe4\x87\xf5\x29\x17\x74\x66\x29\x99\x25\xda\x50\xe2\xda\x5b\x55\x57\xf0\xae\xee\x3f\xd7\xf4\x7b\x5c\x2e\x3f\x84\xce\xfa\xb4\x67\x96\x91\x39\x4d\xd1\x22\x30\x3b\xb7\x69\xaf\xb3\xad\xfe\x83\x58\xb0\x2b\x67\x92\x73\xb3\x5a\xbd\xc6\x40\x25\x76\xcc\xce\x5e\x10\x44\x2a\x13\x7e\xf9\x45\x69\x39\xb2\x89\xef\x4e\x41\x7b\x1c\xc6\x23\x9f\x7c\xee\xdd\x68\xf1\xa8\x26\x41\x80\xe0\x68\xb4\x96\x6f\xd6\x7f\x2b\xad\x6e\xdd\x8b\x4a\x1e\x8d\x2b\x54\x2d\xaf\x26\xdb\x83\x1f\x1f\xb5\x1e\xb8\x6f\xfa\xde\xcc\xd9\xac\x3d\x66\x4f\x34\x6e\x7d\x04\x6c\x33\xa5\x72\x84\x1e\xa8\x33\x4e\x7f\x2f\x41\x7a\x05\x71\x2a\x9e\x33\x4e\x48\x7f\xd3\xae\x17\x54\x55\x16\x2f\xe8\xf4\x9c\xc0\x26\xa6\x40\xc6\xcf\x93\xcf\x58\x87\x50\x52\xf4\x1c\xc9\x82\x06\x15\x65\x3e\xa2\xd0\x84\xc8\x96\xea\xfe\x5a\xd4\x72\x55\x79\x65\x30\x84\x99\x4f\x95\x6d\x5c\x94\x59\x0a\x24\x09\x58\x1b\x6f\xc8\x6e\x40\xaa\x58\xbf\x6e\x60\x57\xa6\xf9\x0a\xf3\xb8\x7a\xea\xf3\x29\x94\xa5\x5a\x54\xf7\x9b\xdf\x3d\xbb\xf5\xce\x0f\xf8\x12\xe4\x86\xb0\x54\x5d\x9e\x9c\x2b\x0b\xce\x0d\x4c\x36\x47\xb1\x82\x72\x62\x49\x88\x34\xe1\x98\xa3\xec\x70\xf3\xb0\x3d\x6a\xad\x2c\x49\xeb\x80\xb5\xe2\x05\x14\x39\x22\x5f\xd9\xce\x94\x68\xd6\x9a\xf7\x0a\x26\x2e\xe3\xb8\xb6\x2a\x8e\x5b\x41\x34\x6d\xa3\x01\x2f\xfb\x45\x81\x6b\x7b\xec\xb0\xe7\x9a\x60\xbf\xf7\x16\x36\xa3\xe4\xbb\x1b\x35\xca\xf1\x95\xf5\x51\x17\x28\x0f\x78\x72\x17\xb3\xca\xa2\xe7\x93\x72\x6f\xc5\xa7\x4d\x11\x60\xdc\xad\x86\x89\x04\xc1\x97\x38\x11\x34\xed\x8c\x3d\xb3\x75\x0b\x75\x56\xf6\x9c\xcc\xe1\x8b\x77\x38\x8b\x58\xc5\xb8\x11\x3e\x59\x0a\xd6\xea\xc5\xb9\x1e\xce\x5a\x67\x05\x02\x5c\x80\x35\x3c\xeb\x1e\xd8\x4a\xaa\x1c\xc4\x8a\x41\x6b\xc0\x16\xae\xf1\x73\xbb\x80\xb2\xba\x28\xc5\x79\x60\xc6\xb0\x11\xb6\xb4\x95\xa3\xf3\x31\x1e\x79\xfe\x46\xbd\xb6\xa4\xc3\x81\xfb\x9d\xc4\x62\x8b\x0a\x83\x02\x35\x58\xf1"}, -{{0xfb,0xdd,0xf6,0xe6,0x1e,0x20,0xd8,0x06,0xe5,0x59,0x17,0x75,0x6d,0xe6,0x0d,0x0c,0x9a,0x99,0x97,0x6f,0x64,0x67,0x16,0xff,0x2f,0xf1,0x31,0x2c,0x54,0xdd,0x97,0x1d,},{0xac,0x53,0x8f,0xab,0xad,0x43,0x80,0xe6,0x0e,0x97,0x71,0x26,0xe7,0x69,0x5e,0xed,0xa5,0x41,0x7d,0x85,0xf7,0xd2,0x3d,0xb2,0x1b,0xd0,0xad,0x11,0x11,0x16,0xf0,0x5d,},{0x8c,0x9b,0x77,0xaa,0x0f,0x1c,0xf5,0x2e,0x8f,0x7a,0x91,0x8b,0x21,0xb4,0x68,0xe6,0x23,0x35,0x91,0x1b,0xc5,0x93,0x06,0xb3,0x0c,0xe7,0x7b,0xf6,0x92,0xc1,0x10,0x59,0xb0,0xee,0x9c,0x5d,0xaa,0xf6,0x83,0x9b,0xb8,0x13,0x73,0xc6,0x1d,0x28,0xd0,0x72,0x70,0x2b,0x59,0x5e,0x4d,0xce,0x28,0xcb,0x99,0x38,0x22,0xb2,0x48,0x13,0x04,0x0b,},"\x3e\x99\x53\xca\x55\xd0\xcd\x23\x3b\x98\x83\x3e\xb1\xbc\x79\xd3\xb5\x5f\x18\xc8\xfa\x1c\x42\x02\x7b\xca\x25\x57\x91\x53\xb5\x5d\xa0\xc5\xa1\x78\xb8\x38\x69\x56\xd9\xa5\x41\x83\xb2\x4c\x91\xdc\x4b\xe9\x94\x84\x72\x37\xd3\x66\x6a\x0a\x01\x30\xfe\x19\x92\x4b\xc0\xee\x50\x89\x6c\x35\xa2\xe1\x6a\x29\xe2\xe2\xac\xf1\x80\xbd\xd9\x37\x93\x54\x68\x7f\x0e\xce\x68\x82\xd2\x6e\x98\x0e\x68\x66\x98\x04\x3b\xb1\xb0\x12\x13\xaa\x64\x4a\x4f\x8d\x61\xf9\xb6\x13\xe6\x2e\xaa\x35\x76\xce\xa0\xb0\xb8\x3f\x05\xce\x25\x58\xff\x63\x56\x49\x5c\x45\xed\xe4\xa8\xf6\x5b\x81\x4a\xb8\xa7\x30\x94\x03\xdf\xd4\x3c\xbe\xa9\x08\x93\x93\x9b\x78\x00\xaa\x00\x23\x2b\x5f\x6b\x77\x14\xeb\xdc\xd8\xbc\xf3\x4a\x5a\x7e\x82\x2a\xc7\xb1\xb0\x99\xac\x61\x5f\x13\x5f\x8c\x35\x1d\xc4\x1a\xe5\xf6\x6d\x5f\x9c\x26\x00\x45\x4c\xa0\x1c\x00\x9b\xa6\xde\x04\x16\x2a\xe5\xf1\xf2\x70\x89\x3c\xa3\x90\x7a\xff\x7f\x78\xe0\x33\x96\xe3\x2b\x62\x2f\xf3\x40\x53\x7b\xf1\x23\xe5\x59\x95\xe9\x20\x96\x09\x33\x0b\x2e\xee\x51\x12\x74\x84\xa4\x0e\x25\x07\x00\x82\x3f\xeb\x0b\xc9\x7b\xb5\x09\xff\x73\x26\x75\xde\xc3\x2e\xcb\x63\x5e\xd9\x2c\x7d\x78\xfe\x30\x50\x20\x0c\xf1\xd9\x41\xd6\xb3\x88\x80\x0a\x84\x19\xd9\x6a\x59\x5e\xce\xd5\xec\x4e\xfd\xcb\x6f\x98\x7f\x54\x72\xa5\xc4\x30\x58\xd3\xa3\xa7\xbb\x56\xd7\x98\x03\x65\xed\x43\xdb\xc2\xbe\x48\xf1\xd1\x8c\xe7\x6a\x89\x18\x54\x26\xfd\x5c\x69\xdf\x7e\x92\x91\xab\x78\x23\xc2\x3a\x76\x94\x1e\xd3\x83\x6a\xac\x7b\x58\xc0\xd5\xfb\x6b\x63\x6c\x42\x47\x1a\x4d\x17\x03\x51\x6f\x03\xe9\x35\xf3\x1f\x19\x54\x50\xe5\x37\xb2\xa0\x7d\x54\x5b\xa4\xb6\x8a\xfb\x06\x38\xc6\x5b\xb0\xff\xaa\x0c\xfd\x69\xd7\x10\x48\x19\x79\x66\x19\xd4\x83\xa0\x24\x5b\x4f\xd9\x01\x7f\x62\xa7\xd3\xa5\xfc\x3b\x72\x89\xd7\x57\x35\xf2\x87\xca\x0a\x95\x1a\xd5\x83\x44\xb2\xab\x7d\x7d\xf8\xdb\xd7\x92\x2a\x5a\xbb\x8d\x7c\x2e\x79\x14\x7e\x6d\x36\xee\x31\xf9\x30\x47\x3b\x07\x27\xdc\xfd\x58\xd6\x44\xd7\xd7\x0a\x0e\xd3\x1c\xa6\xa1\x3e\xd9\xdb\xd2\x24\x49\x2e\xfd\xa1\x9e\x4f\x8e\xed\x46\x18\x0f\xe7\x50\xf0\x7b\xbe\x8e\x99\x85\x4d\x13\xf5\x8b\xa9\x68\xce\x38\x59\xd6\x11\x89\xcd\x2b\x66\x7f\x3b\x2d\x06\x65\xb5\x74\xc4\xba\xc1\x9d\x9e\x37\xe5\xb7\xa8\x0e\xb3\x34\xe3\x68\x10\x53\x0a\xa5\xd1\x76\x63\x93\xf8\x11\x5a\x52\x09\x0c\x91\x82\x34\x28\xc8\x97\xa5\xf3\x5e\x12\xa8\xaf\x2c\xd4\xfb\x13\x90\x7c\xa6\x60\x3a\x4f\x76\xf5\xc2\xe0\x23\x74\xa8\xdc\x3a\x47\xc1\xbe\x6f\x1d\x1c\x8e\xbc\x59\xb3\x6d\x1c\xfa\x0a\xb2\x3e\x9b\x0a\xe9\xb0\xe6\x37\xee\xed\xb9\xc6\x6b\xea\x62\xdc\x63\x0c\xde\xfa\x71\x82\x39\x61\x7e\x31\x18\xe5\xb6\xde\xb7\xc2\x94\x47\x52\x82\xe8\xab\xe2\x4f\xd5\xa5\x4b\x78\x6f\xff\x90\x28\xc5\xa0\x33\x38\x4e\x4b\xc8\x01\x4d\xec\x8d\xa1\x00\xa9\x4b\x17\x8e\xf8\x8e\xc3\x57\xb6\x6d\x2b\x90\x98\xab\x64\x79\x16\x96\xb1\xa6\x6b"}, -{{0x8a,0x55,0xe7,0x7b,0xb0,0xc8,0x74,0x0b,0x8c,0x2e,0x8d,0xdf,0xdf,0xdb,0x40,0xf2,0x7e,0x45,0xfe,0x81,0xfe,0x45,0x71,0x11,0xbf,0x1c,0x87,0x30,0xea,0xb6,0x16,0xb4,},{0x9f,0xf1,0xfd,0x0c,0x50,0xeb,0x24,0xf9,0x9f,0xe2,0xf7,0x71,0x1d,0x52,0x87,0x2d,0xfc,0x90,0x03,0x80,0xdd,0xdc,0xdb,0x86,0xfe,0x6f,0x4a,0x5f,0x35,0x0a,0x87,0x43,},{0x8a,0xae,0xba,0x53,0x5c,0x51,0x1c,0x31,0xd3,0xf8,0xe9,0x5c,0xb0,0x77,0xa9,0xa7,0xec,0x7d,0x08,0x44,0x1e,0x53,0x42,0xa6,0xab,0xe0,0xbf,0x2a,0x5d,0x7f,0xc9,0x30,0xb4,0x3d,0xac,0x3d,0x1e,0x8e,0xf2,0xcb,0x03,0x45,0x52,0xeb,0x4d,0x08,0x39,0xbc,0x8b,0xf2,0x94,0x55,0x1d,0xd2,0xd8,0x0c,0x53,0xfd,0x62,0x79,0x35,0x1a,0xc2,0x0c,},"\x20\xfb\x41\x4e\x26\x4a\x95\x47\x84\xf1\x12\xba\xce\x7e\x04\x74\xb3\x9c\xb3\xc9\xe5\x3d\xee\x0a\x21\xf4\xcf\x6d\x4a\x99\xb9\x34\x7d\xdf\xfb\xe2\x81\xa6\xc2\x30\xa7\x5d\x63\xa7\x2f\xd0\x5f\x6d\xb5\x3e\xa7\x01\x4e\xf7\x70\x9d\x18\xff\x97\x0f\x48\x5f\xe8\x3b\xa1\xd3\x71\x47\x33\x8a\xde\xd6\xda\x4c\xfd\xac\xc1\xe6\x9d\x2f\x3e\x0e\xf3\x62\xf4\x7b\x5b\xcf\xb7\x8a\x1e\x17\x9e\xb5\xc5\xb1\x06\xc8\xd8\x2a\x0a\x0b\x29\x0d\xf0\x75\xab\x27\x43\x69\x29\xcd\xe6\x56\xf0\x23\x09\xf9\x57\x50\xeb\x67\x65\x83\x26\x2e\x5f\x2f\x69\xf0\xff\x72\xa8\xe0\x57\x26\x63\x82\x26\x92\x05\x31\x87\x40\xbf\xe0\x6b\xf5\xc2\xcb\x45\x33\x90\x8e\xf9\xf9\xf2\x86\x9a\x75\xb9\x53\x35\x79\x82\x0e\x3b\xc0\xca\xff\xd6\x46\x17\x1c\x82\x86\xc3\xa4\xab\xa1\xff\x09\x15\xd9\x36\x11\x20\x5e\x23\x0f\x39\xff\x4c\x4c\xaf\x3f\x33\x3e\x75\x3f\xce\x2b\x71\x21\x3e\x53\xd6\x08\x41\x5e\xe1\x7f\xd4\x82\x12\xee\xdd\x88\x40\xf3\x37\x10\x1e\xf0\xd0\xb6\xf7\xbe\x4b\xff\xc0\x6e\xee\xfe\x80\x66\xdd\x27\xa0\x54\x1a\x46\x88\x31\xac\xdd\xc4\x90\x2e\x2f\xef\xef\xbe\xd1\x9c\x30\x8e\x56\x21\xe0\xbf\x46\xbc\xd5\x38\xaa\x13\xfa\xf0\x4d\x38\x07\x59\xc0\xe1\x07\xe9\x12\x00\x18\x39\xdf\xd0\xb6\x35\x44\x0e\x96\x38\xf5\x37\x7c\xa8\x45\x0f\x35\x0c\x01\x12\x9e\xe3\x37\x64\x41\x5c\x53\xcb\x2f\xfb\xf9\x68\xdf\x78\xb7\x42\xfd\x06\x65\xe7\x8a\x34\xab\xf4\xde\xcd\x1f\xd3\x86\x28\x9a\x13\x64\xe6\x45\x55\xee\xc5\x8b\x0a\xf9\xa4\xcd\x6b\x36\xd1\xd5\xc6\x11\xa2\x84\x6d\xfb\x55\x89\x34\x4b\xbb\xb0\x25\x60\x24\x1b\x74\xb9\x93\xa2\x5b\xef\x50\xfb\x1e\x73\x19\x08\x6e\x6a\x23\x98\x63\x00\x83\x4e\xd2\xdb\xa9\x8a\x16\x87\x21\xc2\xf7\x84\xdf\xb8\xd3\x80\x0d\x06\xa0\x54\xae\xf1\x4d\x17\x72\xb6\xc5\x74\xaf\x25\x63\xd1\x93\xef\x2e\x51\xbd\xc6\x2d\x2a\xbc\xe2\xee\xbe\xad\xa7\x92\x03\x49\x8e\x66\x86\xc2\x87\xf3\x7b\xd8\x8a\xeb\x16\x6f\x7d\xff\xc3\xe6\xad\x02\x94\x11\x7e\xf6\xee\x9d\xa8\x47\x9e\xd8\xa1\x6f\xe9\xbe\x24\x6d\x26\x68\x04\xf2\x96\x58\xdb\x75\xe7\xa0\x87\x3b\xe7\x1d\xc7\xd4\x07\xe3\x9f\xab\xd6\x6f\x98\x8b\x45\x74\x77\x42\x7f\xad\x81\x30\xf0\x9a\xb6\x65\xf1\x59\x7c\x90\x46\xe7\x37\x3a\xf9\xa8\x35\x2a\x86\x83\x0c\xb9\x2a\x80\x44\x88\x70\x0f\xe6\x89\x19\x24\xfe\x2a\x72\x01\x73\x3d\x95\xe5\x91\xee\x0a\x1f\xef\x1c\x26\x36\x07\x8d\x37\x0e\x7a\xd3\xb6\xa9\x44\xfe\xd2\xcf\x2b\x30\xab\xa2\xd5\x6f\x34\x95\xb2\x84\x9c\x03\xbb\x61\x4f\x48\xbc\x4e\x50\x7c\x39\x5a\x6c\x35\xd3\xee\xd4\xc7\xbe\x8e\x68\x0f\x2d\x45\xa3\x10\xb1\x87\xeb\x88\xcf\x0e\x8e\xd4\xde\x7d\x37\x24\x6a\x50\xa6\x36\x7b\x97\xee\x37\x84\x32\x2c\x0b\x71\x13\x1a\x28\x31\x98\xda\x48\x04\xde\x75\x1d\xcf\x70\xc4\xba\xd0\x0d\xd9\x8d\x87\x3a\x69\xdd\x1a\x09\xcf\x69\xdd\xfa\xd7\xae\x60\x35\x00\xb6\xa4\x62\x25\x80\x98\xd8\xb6\x6b\x85\x29\x35\x94\xe2\x08\x82\x9b\x52\x28\xfa\xe2\xfa\xfc\x39"}, -{{0x16,0x3b,0x0c,0xb6,0xa1,0x2e,0x8f,0x07,0xb0,0xc2,0x9d,0x6a,0x63,0xf6,0xa6,0x52,0xce,0x49,0x72,0x70,0xb5,0xe4,0x6f,0xcf,0x83,0x3c,0x99,0xbd,0x84,0x3f,0x8c,0x64,},{0x68,0xa3,0x5d,0xe4,0xba,0x6f,0x0f,0x82,0xec,0xf4,0xb1,0xe0,0xdf,0x8e,0x24,0xcb,0x4f,0x18,0xf2,0x10,0x3f,0xf0,0x4d,0xc1,0xb5,0x33,0x39,0x91,0xb6,0xd3,0x14,0xba,},{0x17,0x73,0x8f,0x57,0x26,0x55,0x07,0x80,0x65,0x1d,0x60,0x19,0x9f,0xda,0x39,0xd9,0xc4,0x76,0x8d,0xb5,0x91,0x7e,0x32,0x39,0x36,0x31,0xc5,0x4a,0x41,0x9d,0x59,0xf1,0x8e,0xf9,0x60,0xdd,0xd4,0x39,0x38,0x0d,0xab,0xc3,0x14,0x76,0x1b,0xd0,0xcd,0xb5,0x7c,0xce,0x48,0x1e,0x61,0x09,0xfe,0xd0,0x95,0xde,0xa6,0xe8,0x65,0xaa,0x67,0x0b,},"\x56\xa1\x60\x3f\x72\x5b\xe0\x76\x13\x05\x8c\xdb\x3a\xcd\xc5\x23\x54\xe3\xbb\x1f\xf2\xbe\xd1\x3f\x89\x51\x75\xb1\x5c\x8c\x5a\x90\xff\xbe\x46\xb1\x1a\x06\xcf\xe3\x62\xda\xdf\x73\x23\xc9\x40\x41\x72\x55\xaa\x7a\xa5\x43\x12\x10\x3e\x71\x46\x3d\xaa\x0b\x5c\xda\xeb\xd0\xbe\x72\x3c\x73\x22\x73\xe3\xc3\xf5\xbf\x7a\xa3\x51\x9d\x69\xdf\x6f\x47\x70\xda\xa1\xdf\x82\x80\xbb\x3c\xd2\xc7\x14\xac\x03\x02\x00\x54\x65\x79\xf5\x6c\x60\xb9\x1a\xe1\x1f\x4c\xf8\x74\xa3\x5f\xc5\x9b\x35\x4b\xed\x80\xf5\x6e\x11\xa6\xcd\x62\xa8\x8c\xe6\xb4\xf6\xbf\x39\xd6\x4c\xe3\xd8\x04\x09\x82\x5f\x90\x16\x2c\x3d\x96\xd1\x0e\x47\x86\x07\x36\x5f\x7a\x24\x1e\x71\xaf\x98\x00\x42\xfe\xc2\xd6\x88\x91\xe0\xc8\xa3\x7c\x58\xec\x4e\x60\x0f\xd5\x81\xe7\x90\xb0\xaa\xe8\xe0\x9f\x35\xd4\xcc\x18\x76\xdf\x43\x4b\x80\xee\xe0\x53\x69\xf8\x48\xfc\x49\x30\x57\x7d\x16\x84\x27\x58\x88\xf3\x25\x9c\xb4\x73\x76\xc5\x16\x9c\x99\x37\xf8\x55\xa9\x6a\x9e\x74\x8a\xd0\xa6\x9a\xe4\xab\x2f\x2f\x17\x44\xa3\x92\xf9\xac\xc6\x20\x99\x75\xb7\x84\x98\x4c\xb1\x2f\x98\x29\x2c\x36\xa5\x32\x21\x99\x4a\xbc\x56\xf9\xa6\x6d\xae\x45\x60\xb7\x93\x56\xff\x47\xe1\x28\xc0\x79\x6a\x7f\xb0\xe0\xbb\xc9\x60\x0a\xf4\x8e\x49\xea\xa9\x42\x7c\xf6\xeb\x66\x20\xb1\x0c\xd2\xc0\x85\xb0\xb3\x42\x00\x4d\x5b\x0d\x3e\xdc\x11\xd2\x92\x42\xa4\x63\x87\x80\x76\x2c\x9d\xc6\x06\x9b\x66\xbd\x84\x97\x3b\x50\x11\x96\x1c\xe5\x6d\xb5\x8b\xda\xf4\x8e\x6b\xe1\x2a\xb9\xad\x24\x41\x62\x97\x00\x4d\x02\x91\x4b\x95\x9f\x54\xe0\x92\xf8\xcd\x43\x65\xfa\x6a\xb7\x8d\xdb\xff\x4c\xe8\xda\xd4\xe2\xf5\x3a\x05\xc0\xcc\x49\x9b\xfb\x47\x81\x4a\x27\x13\x55\x1d\xcd\x19\xd4\x47\xf6\x27\x57\x6e\xa4\xea\x4b\xbd\xa8\xba\xe1\x8a\x64\x65\xce\xd7\x47\xea\x17\x18\x0b\x00\x9f\x01\x21\x21\x60\x48\x2b\x04\x33\xaa\xc6\x8e\x67\x64\x4d\x00\xf4\x1f\xdf\x99\x90\xb9\xe1\x11\x17\x63\x4d\xeb\x13\x9b\x1a\x40\xad\x3f\xce\x42\x99\xa1\x7f\xe1\xdd\x22\x53\x01\xc7\xf8\xd8\x01\x0a\x79\x6d\xc7\x9c\x13\x30\x7d\x3f\xf9\x92\xa8\x8b\xe6\x64\xd4\xc8\x86\xd6\x8c\xa9\xe4\x47\x0c\xfb\xe6\x3e\xbf\xfc\x42\x40\x10\xe3\x72\xb6\x92\x2a\xa9\x5c\x80\x1d\x1e\x94\x06\xda\x4b\xc1\x88\xca\x82\x06\x64\x05\xbc\xdb\x3e\xaf\xc9\x37\x62\x9b\x32\x63\xdc\x7d\x50\xee\x52\x78\xcc\xec\x6f\x11\xd5\x51\x7f\x56\xbc\x26\x9c\x87\x36\x91\xe7\xeb\x53\xfa\xef\xf0\x75\x64\xab\x46\xb4\x03\xf1\x5d\x9e\x0e\x69\x24\x86\xee\x09\x8e\x7b\x51\xb4\x28\x13\x46\x9b\x82\x35\x04\x22\x33\xca\x3f\x9c\x4f\x8f\xf2\x4a\x57\x1f\x47\xe0\xad\xf9\x14\x4a\xea\x48\x8a\x2d\x2d\xd0\x01\xe3\x1f\xc9\x61\xe0\x5c\x3e\x85\xf0\xd9\x81\x40\x7c\x87\x31\x58\xbb\x0d\x35\xba\xfe\x4b\x60\x42\x2e\x67\x55\x1e\x97\x01\x65\xce\x3f\xc5\x99\xd0\xfc\xc9\x2b\x16\xac\x36\xa9\x2b\x2c\x1d\xc6\xb3\xf0\x33\xfe\x31\x0c\xd1\x96\xda\x04\xa4\xe6\x39\x03\x11\x77\xcd\x27\xd7\xc2\xfb\xec\x65\xa0\x0b"}, -{{0x8c,0x83,0x93,0x81,0xb6,0xa7,0xce,0x26,0x49,0xc1,0xea,0x46,0x4a,0xe3,0xc2,0xd3,0xfd,0xb1,0xec,0x66,0x6d,0x7b,0x4b,0xe4,0xe2,0xa9,0x41,0xab,0x6d,0x65,0x57,0xa7,},{0x5c,0x72,0x4a,0x30,0xc6,0xfb,0x32,0x81,0x53,0x43,0xa8,0x0d,0xde,0xe6,0xee,0xe5,0x44,0x51,0x64,0x18,0xea,0x95,0xe1,0xba,0xc8,0x0a,0xfc,0x80,0x40,0xd6,0x3f,0xc6,},{0x5d,0x21,0x10,0xd1,0xd2,0xf3,0xed,0xd6,0x83,0xbd,0xfd,0xbe,0xa3,0xff,0xa7,0xcf,0x55,0x28,0xa4,0x0b,0x8b,0x3d,0x8d,0x8c,0x9b,0xfd,0x22,0xae,0xac,0x28,0xba,0xd4,0x71,0x66,0x6e,0x06,0x2f,0x7d,0x38,0xce,0xda,0x8b,0xb3,0x73,0x97,0xa1,0xc5,0xc3,0xf7,0x33,0xb5,0x37,0x96,0x70,0x45,0x70,0x64,0x78,0x43,0x7d,0x4d,0x18,0x7a,0x0a,},"\xcb\xcf\x89\xc3\x54\x89\x64\xc3\x8d\x70\xfd\x8f\x68\xe8\xec\xe3\x6c\xc3\x97\x55\xc9\x71\xd1\x4d\x7e\x05\x6f\x39\xb0\x23\xef\x16\x6d\x17\xf2\x43\x85\x22\xf0\x10\xd6\xd8\x35\xd8\x86\xe7\x1f\x47\x4c\x67\x27\xa4\x22\x1f\xd0\x3a\x75\x74\x57\x82\x89\xed\x54\x93\xac\x4c\x09\x47\xe3\xf4\x28\xd8\xfe\x06\x40\x06\xa2\x56\xce\xf2\x18\x11\xd7\x26\x78\xf5\xdf\xc6\xba\x66\xac\x29\xec\xd1\xb3\x2f\xf5\x55\x7c\xb0\x8c\x5f\x13\x05\x59\x21\x7a\x04\x13\xb7\x59\xc2\x4d\x83\x38\x8a\x2b\xb9\xb2\x9b\x6b\x91\xd1\xf3\x10\x1e\xd6\x25\x21\x1e\x4d\x73\x80\x51\x93\x47\x8c\xf9\x95\x39\x6c\x10\xb1\xc5\xaf\xfa\xcb\x00\x89\x9d\xa0\x4e\x3c\xce\x19\x3b\x49\x4e\x2a\x93\x3c\x4e\xeb\xe0\xa3\x7b\xfb\x8f\x1b\x83\x71\xbd\xe5\xfd\xa0\x9e\x80\x4e\x94\x0f\x34\x48\x96\xa5\x29\x46\x7a\xde\xe4\x5a\x8f\xeb\xf8\x5a\xb0\x36\xca\xb8\x80\x14\x3b\xe4\xf5\x9b\x77\x41\xd8\xe4\x50\x27\x8b\x06\x36\x55\x78\xd4\x0b\x19\xdc\xec\xc6\xe1\xee\x3d\xa3\x4a\xb2\x90\x13\xfa\x3a\xf7\x72\x92\x72\x96\x21\x10\xe3\x85\xab\x9a\x02\x2f\xae\x41\x46\xf8\x97\x16\xf7\xba\xb9\xd3\xdc\x68\x2f\x4f\xac\x77\x36\xd3\xe0\x89\x73\xc6\x85\xbb\xb2\x75\xbb\xf8\xf2\x17\x41\x9e\x5c\xae\x02\x19\xeb\xa5\x16\x6a\x5d\xe1\xb1\x1e\x3f\x9a\x90\x8b\x8a\xc7\xe6\x5b\xcd\x62\x3f\x8c\x18\xbb\x02\x4f\x60\x5d\xcb\xac\xda\x79\x0d\x83\x62\x95\x74\x44\xa9\x5c\x13\x0a\x37\xee\x9d\x56\x3d\x0c\xbb\x4c\xb2\xb0\xff\x71\x59\x1d\x93\x90\xb6\xc8\xfc\x28\x75\x3a\x0e\x40\x2d\x64\x87\xcf\xac\x60\x71\x35\x92\x7d\x89\x26\x75\x12\xb3\x4f\x87\x70\x57\xd9\x27\x1b\xcc\xc0\x24\xdf\xed\xcc\xc6\xc3\x2e\xdf\x75\xc8\xb7\x55\x1c\xdf\x80\x15\x4e\xe8\xe0\x8a\x0c\xc4\x30\x44\xe1\x03\x6b\xae\x01\x7e\xb4\x8b\x65\x02\xc7\xa9\xd6\x0c\x8b\x37\x0c\xf3\x79\x9c\x46\x4f\x96\x4a\x69\xee\x65\x95\x01\x22\x3e\x78\x9a\x64\x97\xb6\x34\x96\xdf\x1a\xda\x2e\x80\x8d\x24\x34\xfc\x8b\xb9\x79\x4e\x5e\x2a\x20\xbb\xf4\xd6\x92\x5c\xb3\xc5\xbb\x14\x84\x2f\x19\x20\x09\x05\xba\x93\x54\xe0\x0d\xc3\x3c\xff\x5b\x42\xd4\xe9\xd9\x66\x8b\x34\xe6\x61\xd4\x4b\xef\x76\xfe\xfe\x2e\xd5\x1f\x94\x42\x3a\x93\x3a\xc9\x4f\x15\x23\xbf\x37\x82\x3a\x23\x8d\x61\x6c\x6b\x17\x97\x34\x41\xe3\x5f\x94\x05\xa0\x4d\x99\xea\xa8\xf5\x04\x53\x4c\x8b\x5f\xa5\xe8\xe3\x35\xc7\x43\xbc\xf2\x1f\x5d\x49\x2b\x71\x12\xe0\x0f\xd8\x64\x2c\xb1\x2b\xfe\xc8\x49\xdf\x62\x12\x0d\xbb\x06\xbf\xc2\x94\x6a\x56\x01\xe2\x5b\xe7\x50\x11\xc6\xf0\x0c\x65\xd3\x5f\x44\xa4\x6a\xf9\xe4\xf7\x80\x9e\x57\x89\xa3\xa6\x1b\xa0\xa3\xb2\x13\x89\x04\x97\x29\x6c\x81\xe4\x2e\x88\xf0\xec\x0f\x5d\xef\xc1\xf5\xd3\x9f\xf2\xa4\x8b\x7e\x30\x26\xc9\xe5\x47\x20\x2e\xdc\x7e\xb7\x38\xc3\x4a\xd3\xa1\x5d\x37\x3e\xf8\x2a\x4c\x1d\x18\x1f\x28\x5a\x98\xbd\x33\x14\xc2\xc1\x94\x7c\x9e\x2c\x60\xac\xa5\x17\x50\xee\x7f\x94\x3c\xaf\x0c\x4e\x1e\x5c\x7d\xf7\x29\x1e\x97\x3b\x1f\x93\x6b\x73\x70\x76\x19"}, -{{0xaa,0xbb,0xb2,0xef,0xed,0xb5,0x99,0x42,0x4a,0x5f,0x3e,0x08,0xf9,0x0f,0xa8,0x82,0x6c,0x5c,0x92,0x17,0x0b,0xe5,0x01,0xa1,0x18,0x1f,0xe8,0xe8,0xdf,0x97,0x4e,0x0e,},{0xce,0x73,0x19,0xef,0x88,0xb2,0x42,0x42,0x06,0x66,0xca,0x69,0x7b,0xa8,0x50,0x1d,0x27,0x4e,0xc4,0xa5,0xdc,0xf8,0x44,0x59,0x66,0x08,0xb9,0xdd,0x5a,0x8a,0x3a,0xcd,},{0xa0,0xb1,0x9c,0xfa,0x6c,0x80,0xde,0x77,0xbf,0xcd,0x32,0x10,0x30,0xbf,0x8c,0x03,0x89,0x3e,0x2b,0x21,0xac,0xe6,0xc6,0xba,0x1f,0xf7,0x40,0x8e,0x6f,0xf0,0x7d,0x84,0x7e,0x6b,0x2b,0x68,0x8d,0x4f,0xd5,0x1a,0xa9,0x32,0x70,0x1d,0xb6,0x40,0x2e,0xf2,0x23,0x22,0xe6,0xe9,0xfc,0x7e,0x32,0x0a,0xbb,0x4d,0x24,0xe1,0xac,0xc6,0xcf,0x06,},"\xfc\xc1\x5c\xc5\x79\x70\x56\x9e\x9c\xcf\xa5\xa7\x78\xfc\x7a\xed\x71\x97\x8a\x3f\x56\x24\x57\x7b\x6f\x57\xfa\x3f\x16\x7e\xa2\x23\xef\x31\x76\x4c\x48\x8d\x05\x9d\x06\x53\x1d\x01\x6b\xcb\x17\xd5\x44\xd4\x69\x77\xaa\x24\x1f\x8e\x07\xaf\x47\x87\xa0\x81\x0f\x98\xd7\x66\x46\x0c\x08\x41\xad\x81\xb8\x8f\x4d\x5d\x81\x64\x48\x5a\x12\x58\xa9\x46\x22\xc5\x49\x24\x28\xd6\xd5\x75\x94\x37\x15\x76\x6c\x2b\x0a\x86\x5b\xed\xba\x16\x7d\x5d\x34\x0e\xdb\x57\x9c\x47\xaa\x32\x45\x9b\x8f\xc9\x8a\x79\xbb\x0b\xed\x1c\x96\x0b\x4c\xcb\x7f\x2d\x4b\x56\x81\xa2\xa7\x0d\x50\x5b\x85\xb8\x1e\x3d\x99\x67\x27\x14\xe4\xea\xb4\x1f\x3a\xb0\xca\x87\x4f\x41\x71\x86\xfe\xb6\x9e\xd1\x3f\xb9\x11\xf4\x9d\x15\x84\x75\x8b\x2d\x18\xb4\x67\x3e\xdf\xae\x49\x5e\x68\xda\xd5\x13\xa7\xac\x0d\x47\xb2\x75\x3c\xb4\xed\xa7\x8f\xb4\x31\xf0\x4d\xda\x8f\xe8\x03\x0d\x7b\xb4\xe8\xdb\xcc\xb9\x69\xd7\xf5\x80\xd9\xc1\xef\x93\x5d\x07\x4d\x7a\x41\xd1\xf8\xb9\xdc\x45\xc9\xa2\xe4\x10\x6a\x55\x29\xa9\x8b\x95\x52\x9a\xb0\xed\xea\x0b\x57\x22\xdd\x68\x6f\x5a\x7f\x3c\xd8\xfb\x26\x24\xab\x26\xc4\x2d\xf1\x1f\x51\x0a\x10\x3d\x8a\x92\x98\x30\xad\x85\xf5\x21\x24\xe3\xd5\x82\x7b\xa6\x0b\xfb\xcd\x73\x6c\xb6\xc5\x90\xee\x77\x7e\xad\x7a\xa2\x22\x4d\x7a\xe4\x6d\x25\x7a\x90\x40\x72\x47\x96\x0c\x9c\xb0\x38\x60\xae\xaa\x7f\x54\xc1\xa8\xe1\x11\x60\xd1\x1b\xb4\x73\x06\x5e\x19\xb7\x07\x21\xc8\xf0\x72\xe1\x90\x9d\x53\x9e\x9a\xc9\x41\x85\x90\x4b\xbb\xfe\x54\x87\x37\x54\xae\x1c\xa7\xbc\xed\x6f\x40\x56\x1a\xf4\xb5\x05\xf0\x3a\xc9\x72\xa6\xf0\xbf\xa7\x3b\x5f\x83\x2f\xe2\x3b\x89\x8b\x2b\xbb\x05\x74\xa6\x66\x2e\xe9\x3b\x3b\x36\x0d\xa1\xec\x7e\x83\x8e\xb2\xc7\x7c\x7c\xb7\xfc\x16\x4f\x7c\x46\x27\x01\x04\x89\xc8\x58\x90\x07\x52\xc9\x2d\x9d\x75\xad\x54\x71\x67\xe4\xbd\xd1\x1a\x07\xd2\x8b\x65\x1a\xa3\x0f\x16\xa8\x50\xe0\x60\xdd\x28\x82\xfb\x82\x09\x19\xa3\x98\xe8\x05\xeb\x63\x69\x9f\x4f\xf5\x95\xf9\x91\x52\x47\x31\x64\x1e\xce\x25\xfb\x3f\x8e\x89\xad\xa5\x01\x19\x2b\x1e\xdd\xae\xcb\xac\xc8\xb8\x98\x52\x8f\x2d\x5b\x33\x12\x69\x4f\x5e\xc2\xdc\x91\x42\xe1\x51\x3f\x77\x7a\x5c\x83\x34\x09\xc1\x71\x63\x3f\xf9\xfa\x26\x09\xd0\x49\x7f\x5d\xf4\xfb\xf4\x8e\xf2\xb7\x7d\x55\xe2\x55\x19\xd2\xee\x79\xb5\xfe\x9d\x8f\xa4\x60\x00\xde\xcd\xb4\xf2\x5d\xfb\x3f\x2b\xaf\xb1\x9f\xbe\x2c\xbd\xac\x00\x2a\x35\x9a\x95\x4b\xc6\x9b\xdf\xe2\xfb\x36\xad\xfd\x9a\x15\x09\xf3\xe3\xa4\xc6\xb1\xf3\xf3\x6e\x7c\xf8\x0d\x58\x3d\x44\x0f\xf2\xa1\x44\x64\x30\x98\x97\x4d\x71\x49\x3e\xcb\x64\x17\xc0\xb8\x06\x5b\xd2\xc2\x1c\x1e\x34\xaf\x09\x24\x3f\xb4\x9e\x9d\x35\x29\x7e\xb0\xa5\x2d\x56\xdd\x27\x0f\xea\x6d\xc5\xc0\x80\xa0\x55\x99\xf7\x85\x81\xe9\x0f\xd8\xcc\x4c\xd1\x1a\x50\x5e\xdd\xe8\x4b\x89\x2d\x89\x53\xbd\xbb\x23\x79\xd3\x3a\xad\x64\x65\x8a\xe2\x06\x07\xdd\x35\xb0\xbf\x3a\x26\x37\xd2\x0c\x3f\x86"}, -{{0xc2,0xe0,0x74,0xfa,0xa2,0x34,0xe9,0x9a,0xb2,0x0a,0xdb,0xbe,0xae,0x11,0xb8,0x10,0x97,0x23,0xb7,0x08,0xc5,0x45,0x86,0xdf,0x65,0x2b,0x40,0x2c,0x35,0xcd,0xd1,0x27,},{0x5e,0x52,0x4e,0xce,0x1c,0x69,0x6e,0x70,0x5a,0x35,0x14,0xdd,0x00,0x82,0xb8,0x40,0x79,0x5a,0x59,0xc3,0x6a,0x96,0xcb,0xc4,0x82,0xbf,0xf5,0xab,0x4e,0xf5,0x15,0xd1,},{0x65,0x7c,0x38,0x26,0xb3,0x48,0x3f,0xd4,0x2a,0xb6,0xdf,0x86,0x9d,0x1b,0x77,0xa8,0xc4,0xdf,0x67,0xa6,0xa5,0x90,0xc7,0xc6,0x77,0x29,0x69,0xe3,0xdf,0x33,0x12,0xae,0x06,0x54,0xfb,0x83,0x84,0x7a,0xf2,0x21,0x93,0x5a,0x05,0x12,0x29,0x16,0x36,0xec,0x05,0x95,0x70,0x08,0x79,0xeb,0xdb,0xa8,0xa1,0x46,0x7c,0x53,0xd4,0x0c,0x23,0x06,},"\x31\x29\x03\x38\xe4\x6d\x1c\xc2\x5c\xe9\x9c\xba\xcc\x40\x16\x03\x41\xb7\x85\x82\x3c\x82\x3c\x4a\xb9\xba\xee\x3b\x61\x25\x79\xf1\xc0\x11\x71\x67\x96\xe5\x6e\x26\x93\xf6\xdd\xad\x43\x92\x2a\xa7\x84\x7c\xbb\x41\x48\x10\x16\x51\xbb\xe6\x2d\x50\xbe\x90\x82\x5e\x8e\xab\x77\x7a\xa4\xb8\x02\x6d\xc5\x38\x5a\x97\xd3\xdf\x76\x16\x01\x91\xf9\x22\xcd\xd2\xf0\x7b\xa5\xf8\x5e\x95\xf4\x5d\xb2\x29\x28\xf9\x07\x34\xff\x52\x0c\x44\xdc\x8f\xe3\x90\x3b\x4c\x51\xcd\x23\xe0\x64\xf0\x1c\x82\x9e\xc7\x4f\xbf\xfe\x25\xfd\x0d\x36\x9d\x27\x65\x74\x0f\x43\x85\x6b\xd7\x39\x8a\x19\x11\xad\x74\x98\x36\x16\x0f\xd9\x8d\x04\xb2\x8e\xe8\x7e\x11\x1d\x40\x71\x8b\x5a\x16\x6f\x05\xc9\xa4\x71\xa4\x15\x66\x55\x70\x69\xf7\xa1\x4d\xe9\x88\xbb\xbf\x67\x77\x52\x1f\xcb\xa6\xdd\x65\xde\x4c\x06\x67\x4a\x11\x85\x3a\xf8\x3a\xcc\xb7\x0f\xb3\x28\xdd\x8f\xd6\x10\x5a\x7d\xf5\x26\x9c\x9f\xae\xc8\xd9\x00\x14\x7e\x92\x8d\x97\x0c\x36\xcd\x83\x4b\xd6\x05\x4f\x70\x65\x0d\xfa\xce\x94\xb7\x62\x9d\x16\xe3\x70\x3d\x76\x6c\xe7\x63\x8d\x0a\xd1\xe1\x7b\x77\x46\x9b\x95\x8d\x2b\xa2\xa1\xe6\x31\xa1\x63\x5e\xfd\xcb\x00\x6e\xbc\x6e\x5d\x8b\x9f\xaf\x7e\x5f\xb9\x89\xdc\x08\x96\xc5\x61\xa2\x6f\x3c\x25\xf0\x55\x71\x6b\x36\x71\x38\xea\x5d\xa1\xf8\x1d\xc7\x2c\xff\x7a\x55\xaf\xae\xe5\x83\x9e\xf5\xaa\x82\x2b\x29\x70\xaa\x18\xa8\x98\x21\x63\xbf\x5e\xed\x1b\x67\x7c\xca\xac\x12\x24\xff\x6c\x6c\xf2\x56\x37\x47\x80\xae\x65\x80\x3b\xf5\xc6\xe2\x3c\x80\xba\xcd\x76\xec\x3e\x2d\xdd\x3a\xb7\x19\x97\x50\x64\x48\xe1\x9d\xb1\x98\xef\xad\xc9\xf7\x57\x49\x1f\x1b\x09\x72\xc8\x2d\xb2\x94\x10\xe1\xe8\xbb\x67\xbb\xb2\x3d\x53\x56\x3b\x88\x07\xe5\xe0\xc2\xe3\x2e\xe5\x96\xb5\xb4\x40\x23\x28\xf9\xe1\x79\xe9\xce\x85\x6d\x3b\xd1\x99\xd5\x8d\xe6\xc5\xc2\x52\xe7\xa6\x12\x4d\x81\xfc\x9e\xea\xf2\x3d\x34\x7d\x2a\xb8\x89\x17\xaa\x68\x44\x50\xdd\x58\x30\x35\x16\xc1\xa4\xd2\xbd\xcd\xde\x22\x0c\x9a\xe3\x79\x0f\x29\x8d\x7d\x38\x4b\x70\xc2\xfe\x25\x88\x07\x84\x8f\xc3\x53\x20\xb5\x78\xb3\x35\x03\xb7\x5f\x38\xa1\xdf\x63\x0b\xd3\x3e\x6a\x85\xa4\xdd\x4d\xf9\xf6\xe5\x5a\x6e\x68\x67\xc7\x38\x01\xe5\x93\xe1\xd5\x91\xdb\x89\xba\x9a\x9a\xf0\xfc\x29\x2e\x06\xfb\x51\x5a\xc8\xa5\xe8\xe3\x43\xa8\x21\x33\x55\x75\xba\x48\xfb\xaa\xe3\xfb\x12\xde\xea\xae\xe6\x0f\x4b\x3d\x31\x7e\xc0\xa5\x54\xdd\xd4\x25\xc8\x49\x32\xc2\x7a\x7a\x12\xf2\x9d\x63\x71\x51\x07\x83\xbd\x75\xe6\x0e\x2f\x6d\xa2\x00\x52\x06\x9e\xd7\x1e\x69\x5a\x94\x31\x82\x19\x3c\xb6\x85\x1a\x7d\x2f\xa3\xc6\x66\xc1\x93\x02\x80\x15\xac\x8b\x7e\x7d\xaa\x6c\x52\x04\xf7\x7a\x62\x32\xb8\x8b\x4a\xbf\xfc\x53\x62\xfd\xe7\xde\xc3\x6b\x9d\x45\x48\x80\x84\x92\x83\xb1\x15\x63\x39\xea\x2e\x8c\x3b\x10\xe5\x1b\xfa\xbd\xf7\x25\x78\xc7\x26\x41\x9a\x38\x54\x2c\xf8\x64\x9d\xf9\xa0\x90\x9f\x58\x2d\xeb\xad\x5f\xd8\x9d\x8c\x81\xf8\x3d\x9e\x42\x3e\x75\x03"}, -{{0xb9,0xda,0x4e,0x6a,0xf0,0x7e,0x39,0x8a,0xb4,0xd2,0x17,0x52,0xa3,0x2c,0x8f,0xfa,0x9b,0xe0,0xc3,0x10,0xd3,0x50,0x59,0xfb,0x66,0x1b,0xd7,0x3a,0xfa,0x97,0xe2,0xa8,},{0xf8,0x62,0x80,0x3c,0x96,0xcc,0x42,0xad,0xc8,0x25,0x28,0x84,0x54,0x72,0x30,0xb9,0x70,0x04,0x7b,0x7e,0x5d,0xa9,0x96,0x26,0x0c,0xcc,0x02,0x40,0xab,0x71,0xa6,0xec,},{0x62,0x5e,0x1f,0x42,0xc8,0x74,0x34,0xa2,0x5d,0x62,0x2d,0x80,0xd1,0x25,0x32,0x80,0x6a,0xfb,0x25,0x09,0x33,0x24,0x49,0xe6,0x96,0xb6,0x5e,0x1e,0x58,0x88,0x50,0x8f,0x11,0xc4,0xac,0x25,0xf5,0x9b,0x8d,0x94,0xd0,0xbf,0x27,0xe4,0xc8,0xd1,0x86,0x70,0x07,0xc4,0x08,0xda,0x57,0x30,0x82,0xdc,0xf1,0x9d,0x15,0xa9,0xd5,0xcc,0xcb,0x0c,},"\x6b\x95\xaf\x0e\xeb\xb6\xa0\x8a\xfa\xda\xa1\x96\x21\xf7\x6a\x83\x9b\xe8\x08\x51\xc6\xdd\x31\x5e\x82\x76\xf5\x01\x99\x5d\x4c\xe6\xd1\x34\xdf\x5e\x79\x8e\xd5\x17\xa2\xf0\xe6\x2a\xa1\xd6\xc9\x8c\x36\xef\x14\xbb\x1e\x5d\xdf\xc9\x8d\x5a\x7f\xcc\x81\x14\x0a\x13\xc2\x0d\x2c\xa0\xc4\xb4\x0e\x6e\x6a\x03\xee\xd8\xc8\x99\xf9\xd1\xf7\x92\x46\x81\x52\x19\x9f\x4b\x95\xa4\x32\x66\x89\x47\xa5\x1d\x7b\x8e\x10\x4d\x8d\x1f\x12\xaa\xcd\x96\x7e\x08\xb0\x8c\x41\xc3\xc8\xca\x3f\xee\xda\xa5\xb8\xb6\x3b\xce\xc0\x61\x38\x64\xd9\x53\xd8\x11\x43\xec\x81\x42\x5b\xde\x29\x16\x4a\x08\x76\xf2\x3f\x37\xac\x9a\xc9\x47\x36\x72\xce\x11\xa0\x8b\xd5\x47\x6f\x6f\x66\xd6\x65\xe9\xad\x61\x7e\x34\xeb\x32\xee\x56\xff\xa4\x59\xf2\x0d\x1b\x93\x53\xd7\x82\x12\x98\x54\x57\x50\xc6\xef\xf3\xe7\xd4\x07\x3d\xc3\x18\x5e\xde\x03\x91\xcc\xe0\x57\x5f\x8b\xa6\x37\xd8\x00\x06\x8d\x9d\x7e\x54\x03\xba\x70\x38\xd2\xdb\x77\xda\x14\x47\x84\xf2\xe8\xea\x76\xae\xdf\xe5\x21\xe7\xdc\x6a\x67\x4e\xde\x35\x57\x95\x95\x99\x3f\xb2\x0d\x44\xb4\x05\x27\x83\xf5\x6c\x8c\x0b\xbd\x04\x40\xb6\x9e\xab\xde\x84\x46\x8d\xd1\x3c\x67\x1f\xb1\xbb\xd5\xcb\x02\x2c\x2a\x4f\xcf\x35\x42\xd8\xb3\xbb\x51\x8e\x5a\xde\xbd\xdc\x84\xe7\x14\xb1\x3b\xe5\x2c\x56\xb2\x82\xb4\x2a\xc0\x89\x2a\x54\x59\x28\x1b\xe7\x16\x07\x29\xf4\x11\x2c\x7d\x99\xdf\x9b\xe5\x43\x4f\x82\x3a\x9c\xe0\x50\x17\x89\xde\x1d\x55\x0a\xd5\x0b\xb1\x8c\x8d\x89\xa3\x36\x68\x27\x0b\xff\x7b\x91\xff\x11\x8f\x5c\xd9\x90\x9a\xdd\xde\x90\xc0\x24\xa3\xad\x71\x39\x15\x17\x46\x74\xf2\x8a\xaa\x9f\x94\xa3\x22\xba\xa5\x43\x73\x8e\xda\xb4\x97\x33\x12\xb5\xbf\xa1\x21\x55\xde\xbc\xee\x16\x3c\xfe\x2b\x04\xac\x9c\x12\x2a\xc8\xa4\xe1\xbc\x41\x8c\x14\x95\x5d\x96\x10\x45\x5b\xd9\x45\xe9\x79\x3b\x91\x62\x67\xc9\xc5\xf9\xe5\x3a\xc0\x45\x18\x92\x6e\xc9\x8e\xcb\x84\xa4\xf0\x44\x5d\xcb\x12\x36\xc7\x6c\x3a\x67\x8c\x69\xab\xe4\xe9\x2c\x22\x97\x1d\x62\x21\x72\x01\xa1\xbd\xf0\x5c\x04\xdf\x84\x20\xa3\xde\x6a\x91\x7a\x85\xe7\x1e\x2b\x97\x25\xe7\x7b\x52\x29\x15\xd4\xc9\x94\x60\x77\x63\x7c\x2d\x88\x13\xf0\x10\xb9\x49\x1c\xf0\xed\xdc\x3d\x46\x68\xcc\x0f\x8b\xc8\xa6\x83\x57\x9b\xe5\x43\x93\x4d\xa2\x85\x3a\x16\xf5\x71\x57\x24\xf7\x79\x81\x9f\x44\x43\x9e\x1d\xeb\xca\xa4\x27\x0d\x9b\x85\x94\xba\x4c\x86\xe1\x06\x3b\x3c\xe4\x79\xd7\x1a\x54\x09\xbe\xf2\x7e\xf4\xe5\xc1\xd1\xc9\x6e\x8b\xe1\x38\x65\xaf\x7b\xb4\x3f\x09\x16\x2c\xcb\xc8\x3a\x2c\xa9\xe9\xb8\xa2\x32\x4e\x6d\x99\x65\x75\xee\xfe\xd3\x7e\xf4\x99\x08\x18\x57\x38\xb8\xea\xe4\x3f\x8a\xdc\xa3\x30\xc9\x9b\xc6\x6c\xc1\xfd\x52\xc5\x30\xd7\x37\x1c\x60\x86\x9c\xe4\x2c\x19\x7d\xca\x0a\xd1\x28\xb8\x5f\x61\xc8\x75\x8f\x0d\x54\x2f\x3d\x32\x98\xb6\x5e\x93\xc6\xe8\xa6\x8f\xa0\xe9\xa1\xd5\xe8\xc5\xfe\xc8\x05\xb8\x3a\xff\x43\x90\xe1\x15\xeb\x64\xf3\xf0\x78\xa0\xb9\xb6\x6c\x27\x38\x43\xfc\x6c"}, -{{0x14,0x3f,0x7b,0x42,0x47,0xd5,0x49,0xf6,0xb7,0xc0,0x91,0x72,0x66,0xc5,0x0f,0x96,0x2c,0x28,0xa2,0xea,0x24,0x76,0x2f,0x53,0x7a,0xa0,0x6a,0xd1,0x5e,0x40,0xb3,0x5a,},{0xc9,0x95,0x9f,0x90,0xa2,0xd5,0xfe,0xac,0xba,0xe2,0xc4,0xc8,0x03,0xde,0xd5,0xde,0xab,0x86,0x98,0x76,0x37,0x06,0x43,0x37,0xaa,0x2a,0x0b,0x0d,0xde,0xf2,0xfd,0x86,},{0xc1,0xcf,0xae,0x58,0x51,0x57,0x13,0xea,0x72,0x8c,0xfa,0x09,0x09,0x0e,0x89,0x42,0xf8,0xdf,0x18,0x62,0x1b,0xa7,0x09,0x0e,0x3a,0x33,0x76,0xc3,0x80,0x27,0x75,0xa1,0xec,0xaf,0x43,0x6b,0x18,0x49,0x78,0x04,0x1e,0xbb,0x75,0x22,0x6f,0x97,0x0d,0xf7,0x1d,0x6a,0xd3,0x53,0xc0,0xfb,0x46,0x50,0x23,0xf9,0xe2,0x98,0xf6,0x4a,0x70,0x02,},"\xe2\x74\x20\x23\x47\xa0\xd0\x57\xa4\x8b\xf2\xa1\xf6\xe9\xf6\xcb\x42\x56\x07\x9d\x80\x03\x74\x09\x3c\x02\x0c\xbf\x52\x0e\x5f\xa2\x7f\xe9\x96\xff\x07\xf3\x3a\xd3\xb2\x1f\x74\xab\x0c\xd9\x3c\x86\x47\x5f\xf3\x7c\xf6\x22\xd3\xf9\xfa\x4d\x13\xbc\x99\xf0\x13\xe8\x50\x2b\x24\xe4\x6c\xc8\x7c\x47\xe6\xb2\xc3\x66\x2b\x50\xe9\x79\xa0\xf3\x45\xb7\x84\xff\x21\xa8\xa4\xd9\x2a\xdc\x65\xe8\x6e\x33\xb4\xdb\xe1\x7f\x52\x8c\xcd\xf5\xb4\x86\x46\x64\xba\x94\xff\xdb\x7c\x7d\x24\x12\xb4\x38\xe6\xe4\x3f\xa9\x66\x81\x47\xee\x33\x28\x22\x4d\x1f\x52\xa3\xf5\xb5\x43\x59\xb4\xf7\xfe\xf6\x9a\xf8\xf8\x67\xb4\x78\xf1\x30\xa1\x47\xbe\xa4\x2e\xd3\x98\x03\xbc\xbc\x25\x57\xbc\xa8\xc3\x99\x9f\x1d\x24\xf0\xa6\xb0\x3c\x98\x84\x60\x11\xf9\xec\x74\xf6\x66\x41\x7b\x95\x02\x0e\xb1\xfb\x2f\xb8\x8b\x63\x12\xe5\x00\x8c\xff\x03\xe2\xd7\x7a\x26\xaa\x53\x2d\x17\x80\xb5\x07\x7f\x9e\x8b\x82\x86\x74\x45\x5d\x6b\xc9\x57\x97\x5f\x7b\x2a\x50\xe7\xfd\x7c\x16\x12\xce\x02\x36\x2e\xfa\x4c\x55\x5a\x1e\xef\x68\xec\x34\xa5\xc0\x06\xa6\xda\x00\x8a\x31\xd4\x19\x3d\xc2\xcc\x64\x76\x85\xad\x3c\xfa\x3b\xd7\xc5\x60\xb7\xae\xd4\x5f\x0f\x1a\x3d\x1b\x5b\x36\x22\x68\xde\x53\x28\x57\x05\x5a\xb9\xd1\xd5\xd8\x58\xd9\xae\x9a\x75\x9a\x51\xbb\x94\x78\xe8\xf0\xee\x93\xc9\x84\xb5\x76\xb8\xb4\xab\x46\x02\x80\xbe\x3d\xe2\x05\xa3\x2f\x1d\xc3\xd5\x72\x92\x3f\xb2\x13\xac\x15\x12\xd8\x0e\xb5\xad\x5c\x18\x94\x4b\xe7\x7f\xc1\x7d\xef\x13\xa6\x1b\xbd\x31\xbc\x71\xac\xc2\x3d\x25\x0e\xc5\x89\x4e\xbc\x21\x4c\xfe\xc0\xc1\xb9\x06\x51\x6d\x32\xd8\x36\xad\xc8\x38\x80\x2e\x8d\xe3\x0d\xd7\x6d\xf6\xe6\x1c\x1b\xc4\x38\xb6\x8d\x2b\x02\x5a\x84\xf2\x11\xfa\xcf\x3f\x13\x84\xd2\x61\x2d\x0f\xae\xf5\xd1\x71\x31\xcf\xe0\xcf\xe8\x33\xfe\x95\x0e\x47\x9b\xc2\x9c\xbe\x7f\xd6\xda\x0c\xce\x30\x7c\xf0\xb1\xbd\x92\xc8\x0e\x87\x8e\x43\x2f\x63\x6e\xa0\xcd\x42\x48\x0c\x07\xe8\xb8\xe5\x7e\x69\xb2\xf9\x38\xb7\x81\x20\xf6\xaf\x4a\xbe\xbf\x7d\x4b\x05\xca\xcd\x6e\xed\x85\x44\x91\xc0\x29\x75\x5c\x4e\x66\x33\x89\x93\xed\x2a\xc2\x5d\x19\xa0\xc5\xb4\x0f\x5e\x32\xc8\xa8\xb1\xbc\xe3\x69\x71\x81\x86\xc9\x1d\x60\xed\xff\x24\xa8\x37\x7a\x99\x69\x75\x75\x99\x06\x7d\xd3\x12\x63\xa0\x6d\x6a\x61\x15\x47\x81\xf2\x96\x11\xab\x81\x2f\xf8\x2e\x81\x37\x39\x64\x62\x63\x70\x4c\xd6\x04\x63\x57\xa2\x3c\x04\x5e\x24\x07\xb7\xa8\x95\x08\x25\x93\x91\x31\x4f\x2f\xbe\xe4\x9a\xef\x08\x55\xc6\xe5\xe6\x3d\x91\x2a\x19\xdf\x15\xb1\x1e\xce\x34\xe2\x76\xdc\xb8\x8b\xf2\xf2\xe4\x75\x63\x58\xf3\x4a\x0e\xe3\x95\x2b\x68\x6f\xcd\x17\x57\x8a\x88\x41\x76\xd3\x4e\xa2\x91\x6c\x5d\x9f\xcd\x00\xeb\x9e\x0a\xa9\xf2\xcf\x0f\x16\xe2\x56\x4b\xfd\x28\xb6\xab\x59\x68\xb8\x44\x8f\x06\x83\x20\xe4\x18\x71\x60\xf8\x66\x57\x81\xb1\xe2\xed\x9d\x04\x9e\x1b\x54\xa7\xd7\x27\x20\xff\x9d\x4f\x07\x30\x51\x99\x6a\x9d\xb6\xf0\xc6\x82\x1c\x42\x4f\xa5\x1d"}, -{{0x0d,0x1f,0xe9,0xd8,0xb9,0xa2,0xf0,0x4c,0x22,0xbb,0xb0,0xed,0xea,0x38,0x33,0xa0,0xce,0x43,0x33,0x93,0x47,0x53,0x1f,0xdb,0x67,0xed,0x51,0x3a,0x13,0xd3,0x6b,0x39,},{0x67,0xc4,0x9f,0x41,0x0f,0x48,0x53,0x29,0x3d,0x0c,0x4d,0x39,0xf4,0xc1,0xb3,0xd6,0xc6,0x10,0x3c,0x5c,0xfe,0x20,0xa9,0xa5,0x9b,0x53,0x93,0x20,0x43,0x51,0x73,0x69,},{0xb0,0x57,0x25,0xe7,0x37,0x1e,0xd0,0xa9,0x1e,0xbc,0x89,0xf3,0xc3,0x0b,0xaa,0x99,0x18,0x37,0x63,0xed,0xb4,0xce,0x34,0xfe,0x90,0x1a,0xf3,0x73,0x1e,0x00,0x1c,0xc5,0x4f,0x28,0x71,0x18,0x91,0x5e,0x90,0x36,0x5d,0x91,0xac,0xa8,0xfe,0xb1,0x70,0x87,0x69,0xf9,0xf1,0xd6,0xee,0xf5,0xaa,0x11,0x3b,0xee,0x00,0xb5,0xef,0xab,0x27,0x04,},"\x64\x21\x7a\xc8\x41\xfd\x4d\x64\x59\xbf\xc4\xa4\x9b\x88\x01\xd6\x92\x9b\xf1\x9b\x40\x8e\x8a\x53\x79\x0c\xeb\x51\xec\x34\x1f\x9b\x46\xa3\x51\xe8\xc2\xe5\x9d\x88\x7e\x1e\xac\xcb\x91\x42\x31\xcd\xca\x1d\x3e\x5c\x47\xd1\x66\xb4\xcd\xb9\xb5\x8c\x01\x3c\x59\xa3\xbd\x28\x3a\xd1\x0f\x6b\xd6\x2c\x0f\x15\xf7\x64\xce\x14\xf3\xb2\x65\xf5\x37\xc6\x3e\x73\xb6\xc4\xfa\x65\xe0\x6c\xe1\xe1\xf4\xae\x0d\x11\x48\x9d\xd2\x60\x2f\x95\xfc\x40\x2b\x77\x12\x05\x2a\xbc\x84\xbd\xc7\x78\xc1\x9f\x10\x00\x1b\x4e\x0d\x5f\xbe\x46\x30\x90\xe8\x3e\xf4\x38\xfe\x06\x8f\x3b\xb6\xfb\xc2\xc1\x39\xaf\x06\x78\xed\x2a\x11\xfa\xa1\xb9\xe4\x9a\xaa\x46\x20\xab\xfc\x08\x43\x9f\xbf\xe2\xc6\x18\x40\x76\x9e\x5f\xda\x26\x77\xf8\xe2\xf0\xa1\x45\x64\xf9\xf5\x04\x23\x2a\x9f\xc0\xd9\xda\x47\x1e\x67\xfb\xc5\x74\xc3\xd5\x6d\x2a\xeb\x93\x7a\x58\x6e\xd5\x58\x35\x56\x30\x8a\x99\x8e\xb1\xdc\x47\x6a\x01\x4f\x5a\x08\x22\x8d\xbe\xd9\x5a\x12\x08\xbc\x1d\x1f\x5d\x76\xb4\xe8\xd0\xb2\x43\x4b\x99\x5a\xd4\x58\xe4\x29\xee\x61\x42\xa0\xc9\x71\x76\x8c\xc4\x0c\x40\xbc\xb0\x8e\x96\x03\xf0\x96\x11\x47\x44\x71\xb3\x85\x9d\x7f\xd5\x84\x21\x9f\x02\x65\x7b\x43\x0e\x9e\x56\x95\x5b\x34\x67\xac\x56\xff\x2e\xab\x22\xcc\x49\x84\x89\x03\x6a\x57\x41\x20\xe2\xdb\x76\x9a\x3b\x21\x50\x03\x89\x14\x2c\x78\xa8\x7d\x06\x9f\x0e\x25\x76\xca\xfd\xa8\xcd\xdd\x79\x15\xa9\x22\x87\x73\xd2\xac\x9a\x07\x5c\xb3\x87\xf2\xa8\x98\x61\x72\x13\xb2\xcc\x50\x59\xd1\x19\x41\xbc\x4f\xe5\x86\x41\xe7\xc1\x75\x02\x67\xe5\x3e\x99\xc4\x21\xcb\x4c\xf2\x1d\x09\x8c\xa2\xd1\xf4\x16\x44\xf7\x90\x89\x83\xeb\x17\x4a\x23\xa7\x81\xcf\x15\xef\x38\xeb\x91\x16\xed\xa4\x12\x3a\x15\x22\xf5\x3b\x81\xfb\x73\x68\xe8\x07\x5f\xb8\x38\x59\xd2\xcf\x98\xd9\x21\x53\x5a\x70\x9f\xaf\xa9\x87\x3c\x4a\x03\x9a\xae\x68\x2f\x7e\x62\x86\xb8\x99\x25\x7c\x09\x24\x01\x6c\xa5\xbf\x6d\x31\x69\x09\x92\x11\xa9\xa4\xa6\x74\x5c\xdd\x31\x98\xf1\x33\x7f\x60\x92\x82\x27\xce\x3c\x7d\x60\x96\x0b\x53\xde\xdf\x01\x1a\x89\x40\xf5\xc4\x68\x20\x7a\x38\x94\xbb\x08\x72\xb3\x33\xcc\xde\xc9\xd5\xec\xd9\x11\xec\xbb\xb9\x6c\x9b\xc4\xbd\x48\x75\x32\x0e\x4d\x3e\x9c\x02\xd9\xdc\x76\x10\x9e\xc4\x5e\x61\xd1\xcf\x5a\xc7\x29\xf2\xe3\x4a\x96\x47\xb9\x5b\xce\x70\xb0\xc6\x33\x17\x1a\xda\xf0\xdf\xdb\x5a\xfb\xa4\x03\x5b\x3c\xce\x8c\xb7\x14\x1a\xd1\x42\xbb\x7a\xdd\x4f\xc3\xf9\x61\xd4\x2d\x72\x03\x75\x4a\x4e\x31\x32\x21\xd4\x87\x83\x1e\x32\x94\x7d\xa9\x11\x38\xab\x64\x8b\x59\x52\xef\x69\x56\xe2\x7a\xa5\xd2\xc1\x75\x79\x4b\xf8\x1e\xf2\x77\xfa\xa6\xb9\x05\xe1\x45\x02\x86\x68\x87\xd8\x78\x80\x60\x6e\x81\xb2\x7a\xf0\x1b\xb2\x63\xec\xf2\xc5\x82\x05\x85\xea\x6c\xe8\xd8\xb3\x91\xd8\x6f\xce\xda\xdc\xd1\x1f\xdb\xb5\x66\xfd\xf1\x47\xf4\x02\x01\x0f\xc3\x5f\x51\x57\xe0\x36\x14\x6b\x37\x36\xc8\xa4\x33\x59\x12\x7c\x26\x1f\x6b\xf0\xca\xd3\xbd\x8a\x34\xcb\x15\x09\xf7"}, -{{0xc1,0x0b,0x5a,0xc6,0x05,0x5a,0x1d,0xdb,0xca,0x28,0x55,0x2e,0x5c,0x72,0xeb,0xd0,0x52,0x78,0xc9,0x22,0x39,0xb2,0xfc,0xd0,0xc1,0x35,0x36,0x51,0xa8,0xe5,0x59,0xa0,},{0xb2,0x18,0x3e,0x1b,0x00,0x81,0x6d,0x29,0x30,0x5f,0x74,0x68,0xe7,0xe4,0x5e,0xed,0x3f,0xd8,0xf2,0x3c,0x15,0xb3,0x05,0xf9,0xfd,0xa9,0x3e,0x81,0x2d,0x65,0xbc,0x27,},{0x8a,0x9a,0x32,0x17,0xfd,0xf0,0x64,0x3a,0xaa,0xa5,0xc8,0xfb,0x2a,0x88,0xa5,0x56,0x39,0x88,0x59,0xb8,0xfe,0xef,0xbc,0xb4,0x8c,0xcd,0x88,0xe5,0x85,0xa1,0x67,0xc9,0x4d,0xbb,0x5c,0x0c,0xad,0x24,0xd1,0x5b,0xca,0xbb,0xc1,0xed,0xb2,0x1f,0x02,0xa8,0xc4,0x57,0xc5,0x61,0x20,0xa3,0x23,0x4a,0xc3,0x35,0x77,0xb9,0xaf,0x2d,0xdc,0x01,},"\x35\x94\x90\x5f\x9e\xa4\x64\x61\x5f\x41\xb8\x7a\xbb\x9d\x16\x73\x37\xf2\x9d\x45\xd9\x7f\x7a\x14\x64\xec\x9f\x2e\xe5\x0f\x90\xf2\xe6\x73\x39\x87\x4d\x3f\x20\x93\xbe\x92\x26\x10\x77\x01\xec\x1a\xab\x94\x1c\x4e\x05\x9f\x1b\xb2\x6c\xe8\x6e\x14\x8d\x1d\x9f\x0d\xa2\xa2\xa0\xf9\x82\x9a\x36\x4f\xb4\xf1\x3f\x58\xb9\x60\xd0\xf8\xd7\x23\x23\x28\x3c\x44\x90\xef\xdf\x57\x87\x86\x45\x89\x0f\xf7\xbc\x50\x65\xda\xd6\xe5\x1d\xd1\xe5\xb9\xa5\x07\x51\x50\x97\x8b\x33\x67\xf1\xba\x84\xe4\x5f\xf1\xf1\x27\x6c\x57\x6e\x4b\xc7\x2b\xe8\xaa\x8e\x40\x5f\xc2\xb2\x7f\x81\x46\xb9\x99\x84\x5f\xaa\xa0\x59\x5d\x3c\xb7\x0e\x5d\x37\x12\xed\x54\xa0\xfb\x3e\x32\x2d\x45\x38\x0b\x5d\xe3\x60\x9b\x96\x7b\x95\x9b\xca\x5a\x58\x3c\xc5\x20\xcd\xcb\x7b\xcb\xb8\x29\xaa\x25\xd7\x93\x20\x95\xec\xb3\x03\x92\x3c\x25\x60\xaf\xc3\xfd\x73\x24\xb7\xb7\xac\xd0\x89\xa9\xf0\x0c\x03\xa7\x3d\x04\x3d\xc0\xcf\x0b\xa0\xd8\x41\x1e\x2b\x1b\x18\xd2\x1d\x2a\x32\xa7\x26\xa5\x30\x59\x14\x0f\x78\x4f\x7c\xed\xf2\xf3\x3c\xec\x66\xfe\x4a\xd5\xcc\x9e\xac\xcb\xe4\xae\x10\x03\x6a\xc3\x52\x3b\xac\x70\x0a\x11\x3a\x98\xb5\x98\xe6\xdf\x03\x04\xc6\xfa\x32\x12\xac\xc0\x4c\x4e\x3c\x7f\x66\x87\x36\x2e\xf8\x6d\x61\x7c\x6d\xd4\x83\xf8\xd8\x0c\xea\x66\xd1\x95\x11\x27\x42\x8a\x61\xc1\xe1\x55\xa6\x85\x0b\xb2\xaf\xb7\xf9\x1c\x82\xd7\x3e\xb2\xb0\x54\x3e\xe8\xfc\x1f\x38\xe1\xdc\xdb\x3c\x50\x3d\xdc\x9b\xa0\x81\x24\x56\xa5\xce\x2e\x11\xd5\x56\x48\x7a\x64\x69\x74\xa7\xbb\xf8\x6e\x80\x6c\x58\xc6\x8c\x42\x69\xa7\xc9\xbb\xca\xc0\xff\xef\x98\x35\xb3\x3d\xc4\x49\xa7\x54\x79\xec\xd2\x3f\x6d\x14\x9c\x1e\x5e\xa8\xb6\x92\x08\xff\x36\xe5\xfb\xd6\x82\x95\x55\x03\x18\xbf\xa0\xd3\xb1\xd6\xc1\xad\x42\x70\xbc\xab\x09\x04\xae\x53\x49\x1f\x9b\x1c\xa5\x02\xe0\x12\xee\xd7\x7c\x42\x7d\x49\xa0\x96\x2f\x10\x55\x12\x5d\xd7\xb5\x37\x33\xd8\x52\x89\x34\xb5\x58\x0d\xd5\xfd\x5b\xbe\x85\x49\x78\xba\xe3\xd2\x5b\xb4\xae\x94\x4e\x90\x65\xe8\xe2\xe0\x79\x46\x51\x8a\x6f\x54\x8e\x36\xe0\x56\xbe\x82\x4d\x9e\x02\xa7\xa3\xea\xad\xd3\x79\x29\xf5\x81\x01\xcb\x18\x53\xbe\x3d\x75\x47\xf5\x8f\x49\xe3\x8b\x01\x8a\x74\x8d\x3f\x19\xc4\x85\x82\xab\xbd\xbe\x95\x3a\x8a\x25\xba\x9d\x36\x5d\xea\x83\x59\x35\x89\x9c\x19\xfb\x0b\x51\x90\x6a\xa9\x72\xc5\xac\x45\xe9\x9c\x40\xb3\xb7\x6e\x35\xd3\x27\xe3\x21\xe8\xae\x23\x06\xa6\xeb\x3d\x8c\xb6\xec\x2f\xa5\x39\x9a\xdd\x19\xea\x00\x28\xa0\x17\x92\xc0\x8e\x27\xc1\x6c\xf4\xf8\x5a\xaa\xae\x72\xf9\x86\xb0\x99\xf9\xeb\xe4\xad\x0b\x25\xd0\x6d\x3d\xe4\x4a\x8b\xfa\x52\x84\x4b\xe4\xa9\x39\x44\x83\x3c\xe2\xad\xd5\x1b\xb5\x54\xb3\x56\xa7\xdc\x49\x74\x8d\xd4\x5a\xe7\xec\x9e\x8d\xb4\x26\xc9\x7a\x25\xda\x5e\xdd\x3b\x62\x1e\x4a\xdb\xde\x48\x19\x7a\x33\x14\xde\x1c\x50\xf4\xd6\x00\x20\x27\xdd\x75\x19\xdd\xe3\xe1\x57\x29\xe4\x86\x95\x5a\xc4\x0d\x9d\x66\x87\x6f\x90\x66\x8c\x68\x9d\x8a\xb5\x98"}, -{{0x06,0x1b,0xdd,0xab,0x28,0x0b,0x0f,0xdc,0xb2,0x6b,0xfd,0x9a,0x0f,0xc7,0x21,0xf6,0x8f,0x88,0x34,0x3b,0x5d,0x39,0x83,0xa1,0x6b,0x6d,0xfa,0xa5,0xe7,0x69,0x69,0xf3,},{0x81,0x55,0x78,0xbb,0xa6,0xe7,0x07,0x0e,0xbd,0xec,0xa1,0x17,0x56,0x8b,0xd7,0x7e,0xbf,0xf9,0xe1,0x4c,0xb8,0xbc,0x20,0x0c,0x32,0xbd,0x87,0xdb,0x1f,0xb3,0x7d,0x6c,},{0xb8,0x32,0x97,0xcc,0xdd,0x6d,0x00,0x98,0xeb,0xf5,0xd1,0x32,0xd1,0x74,0xde,0x19,0x58,0x31,0x1a,0x76,0x6b,0xcc,0x4d,0xa1,0x5f,0x86,0x4d,0x80,0x1f,0x38,0xe0,0x9d,0x61,0x3e,0x7a,0xa8,0xc3,0x36,0x30,0x27,0x35,0xd7,0x5b,0xe4,0x16,0x6d,0x73,0xb0,0x18,0x4b,0x0e,0x0b,0xc5,0xef,0x39,0xed,0xbc,0xcb,0x6e,0x0e,0x61,0xaf,0xeb,0x0c,},"\xee\x76\xb4\x0c\xd4\x29\xea\xc7\xbc\x12\x83\x9c\xa2\xf7\xcd\x31\xf1\xe0\x09\x8a\x39\xc5\xfc\x19\x80\x5b\xe0\x33\x1f\x44\x79\x9e\x31\x8d\x12\x57\x1f\x06\xe2\x99\x37\x53\xa3\x68\x5c\xd2\xa9\x6b\x23\x01\xe2\x00\x24\x20\x9a\xdc\x5a\xdf\x74\x79\xff\x90\xc4\x77\xc3\x69\x5a\xbb\x99\xbd\x28\x57\x9d\xbc\x78\x31\xa1\x92\xbe\xed\x0c\xe1\x7b\x03\x8b\x20\x76\x48\x00\x65\x3a\xf7\xaf\x02\x4e\x2a\x10\x4e\xd0\xf3\xe5\x2d\x4b\xbd\x3e\x10\x9c\xf1\x26\x29\x1f\x49\xb0\xa2\x1b\xe4\x33\xc1\xc5\xa2\x58\x9e\xa5\x72\x99\x7f\x63\xd2\xbb\x39\x72\xd5\x32\xbe\x35\xa0\x47\x1e\xf0\x57\x3d\x79\x5c\x07\x2b\x6a\x86\x85\xb9\x5e\x47\xb0\x9e\xa9\xf4\x75\xd9\x3b\xf1\x2b\xbd\x77\xb7\xd2\xbf\x5d\x5b\xdd\xf0\xae\x02\x37\x53\x71\xd1\xd7\x99\xea\x92\x04\xbe\x38\x9e\x6a\x8e\x5d\xee\xdc\xd4\x92\x02\xe9\x2d\xf7\xc3\xe7\x61\xf9\x2e\xf8\xd7\x9f\xa7\x38\xd2\xc5\xbc\x28\x0e\xd3\x28\x79\x83\x2f\xf2\xb0\x26\x42\x45\x89\xcd\xbd\x52\xd1\x5b\x60\xf2\xaa\x35\x26\xb8\x98\x84\x9a\x34\xa8\x5f\xf1\xc4\x7d\xc6\x55\x4b\x85\xac\x76\xaa\x79\x35\xcb\xf3\xf7\xbc\x80\xad\x00\x91\x92\xa8\x75\xca\x20\x9b\x40\xfe\xb0\x47\xcc\x44\x69\x68\xf9\x70\xda\x47\xb8\xcd\x67\xda\x7e\xb4\xe5\x4a\x0e\x5a\xb2\x0c\xb3\x5b\xc6\xfb\x7f\x13\x30\x7c\xe6\x7e\xb6\x20\x4a\x67\xce\x9b\xb1\xd1\x39\xc1\xb4\xbd\x5d\xbe\xd5\x80\x10\xc8\x7b\xf8\x31\xe6\x52\x2e\xe1\x82\xda\xd9\x45\x80\x4b\x76\x7c\x4d\xf2\x55\x4f\x15\xb9\xe9\xaf\xd2\x59\x9e\xf2\x58\xc6\x7a\x22\xca\xeb\x92\xa5\x79\x88\x00\x6b\xbc\x72\xc1\x04\xfa\xc7\xe5\x41\x3c\xd3\xd3\xb8\x02\xc8\x3e\x63\x9e\xaf\xe2\x12\xa3\x8b\xb7\xef\x77\x9a\xf1\xa9\x4e\xe1\x37\xf6\xc6\x06\x67\xbc\x48\xf2\x7b\xf4\xa2\x22\x41\xbc\x44\xbb\x60\x33\x83\x62\x39\xbd\x6e\xaf\x3e\x2e\x22\x31\x87\x84\x1e\x46\x41\xb0\xf4\xe9\xff\x8d\x5a\x41\xdd\xbe\xab\xb4\x13\x8f\x6b\x58\x5a\xce\x0f\xb6\xb5\x3d\xc3\xc9\xed\xc0\x37\x3b\x60\x47\xf2\x7d\x83\x5e\x8e\x24\x66\x44\xfd\x83\x2c\xcf\xe0\xdf\x25\xc3\xd7\xda\x18\x7c\x9f\xa0\x54\x20\xd4\x34\x55\xf2\xd0\x8b\x57\x19\x29\x38\x6b\x59\xc6\xe0\xe1\x0a\x35\x60\x1d\xa8\x99\xb1\xb4\xdc\x3d\x95\xb6\x7d\xd9\xa8\x38\x18\xb0\xa3\x18\xbf\xdd\xa0\x64\x64\xb4\xa4\x2d\x3c\xb9\x85\xf3\x0e\xc9\x7d\x6a\x2a\xf1\x32\x91\x15\x5d\x60\xce\xc5\x7c\xbd\x58\xd5\xcf\xcb\x35\xc1\x85\x35\xe8\xd2\x99\xb5\xb0\x07\x59\x08\x92\xea\x94\x9d\x1b\x13\x7a\x62\xb3\x9a\x43\x6c\xd7\xe5\xb9\xf8\xd1\xb6\x93\x8d\xba\xa6\x2c\x22\x68\xd4\x59\xc6\x22\x0a\x3e\x6f\xcb\xf8\x0b\xa0\x11\x8a\xcd\x23\x42\x56\x3f\xbd\xbc\x1f\x7c\x9d\xba\x7e\xa2\xc0\x72\xaf\xc8\xae\x21\x28\xe3\xeb\xca\x06\x44\xff\xd8\x16\x3e\x80\xa1\xa5\x57\xd9\xd3\x90\x34\xcc\xd9\xdb\xd1\x2c\x88\x55\xa6\xf9\x16\x5b\x08\x01\x83\x9c\xf6\xe0\x7a\x9f\xba\x4c\x64\xd9\xc0\x99\xe1\x54\x10\xe2\x90\xe6\x77\x03\x1b\x65\xcf\x7d\xeb\x00\x79\xbd\xad\xc5\x73\xcc\x05\x6d\x76\x66\xd9\x5d\x03\x3a\x0b\x6b\xdb\xa7\xec"}, -{{0x2c,0xab,0x5b,0xf5,0x5f,0xfa,0x91,0x4e,0x9a,0xd0,0x76,0x22,0x19,0x0d,0x34,0x3e,0xc5,0x5c,0x13,0xcd,0x91,0xb3,0x88,0xcb,0x75,0x00,0xff,0xe0,0x6d,0xf7,0xc1,0x80,},{0xb6,0x1e,0x43,0x2b,0xb9,0x7c,0xba,0xe3,0x88,0xa2,0x57,0x8a,0x74,0x84,0x99,0x8e,0x00,0xe9,0xad,0x3d,0xdf,0xd6,0xca,0xb8,0xd3,0xa5,0xfc,0x5b,0xa0,0x43,0x07,0xc8,},{0x4c,0xf0,0x8f,0x4f,0xab,0xbd,0x06,0xdc,0xcb,0xcc,0xe2,0xa7,0xa5,0x94,0x1f,0xe9,0xaf,0xdd,0xc4,0xd2,0xd0,0xbc,0x80,0x80,0x2e,0x93,0xb1,0x2c,0xb1,0x35,0xd3,0xac,0xf6,0x51,0x1e,0x0f,0xe4,0x11,0x3c,0x5e,0x3c,0x55,0x41,0xb2,0x7d,0x3a,0x21,0x50,0xa7,0x57,0x74,0x2a,0xc6,0x5f,0x95,0xa9,0xce,0x66,0x73,0xff,0x0c,0xd2,0x1c,0x0f,},"\x2c\x2d\x04\xdc\x3a\xd1\x98\x23\x59\xec\xd5\xbc\x3e\xe0\x35\xf3\x49\x8e\xed\xff\x61\x04\xa9\x3c\x60\x2a\xf2\x17\x9a\xeb\x2c\xb1\xf4\x1c\x5c\xdb\x0a\x77\xb1\x24\xf9\x46\xaa\x8a\x82\x4a\xa3\x07\x6c\x2e\x1a\xcf\xd4\x8f\x68\x07\x0b\x26\x27\x6a\x65\x6b\x4a\x47\x58\xab\x15\x1a\x6a\x9c\x41\xbd\x74\xe0\x9b\xbd\x9a\xdc\xce\x1e\x87\xa0\xa8\x0d\x17\xfd\x92\xe8\x5e\x4b\xda\x47\x2c\x98\x8b\x6b\xb1\x18\x3b\x7e\xe5\x9a\x09\xd8\x05\x70\x46\x6d\xb9\x0d\xd3\x74\x95\x79\xc4\xeb\x19\xab\x75\xfc\x15\x2e\xcd\xcd\x68\xcd\x10\x78\xef\x06\xe5\x93\xc7\x35\x16\xfa\x82\x91\x48\x1a\x66\x7d\x3f\x95\xbf\xeb\x14\x4b\xab\x59\xd6\xdd\xc7\x3a\x27\x95\xc1\x01\x7e\x09\x53\x6b\x31\x62\xe4\xbc\x58\xf8\xea\xd3\x89\x57\x01\x8c\xfe\xc7\x2b\xad\xbf\x22\x81\x9a\xb0\xb4\x06\xc6\x47\x30\xfc\x73\xfd\x9e\xe6\x1f\x74\x18\x7e\xda\x91\xed\x4e\x79\x93\xe6\x68\x84\xaf\x43\xef\x4c\x6b\xf7\xf7\xc3\x79\xe8\xf0\xf6\x3d\xcb\x80\x41\xe2\x6b\x8b\x82\x92\xb6\xb6\xd1\x90\xe4\xad\xf4\x30\xfa\x82\xdd\x74\xc5\x73\x85\xb9\x19\xc4\x46\xdb\x37\xb5\xe8\x76\x7e\x4a\x0c\x95\x01\x3b\xe8\x9b\x2b\xc4\xe9\xfd\x62\x75\x4a\x84\x44\x18\x40\x09\x68\xae\xd2\xdd\x32\x8d\x7b\x1d\xc9\x1e\x1a\x2b\x30\x09\xdc\x7a\xd1\x40\xa0\x68\x6f\x67\x31\x68\xa6\x0e\x88\xd8\x0c\x52\x0f\xc2\xdc\xfc\x56\xca\x9d\x4b\x0c\x88\x85\x90\x99\x23\x07\x14\xde\xc8\x3d\x26\xb4\x63\x05\x54\xdc\xb9\xc4\x90\x18\x95\xf7\x8f\x38\x34\xb0\x97\x66\xb6\x7a\x46\x5d\xe8\xc9\x49\x00\x65\xbf\x56\x83\x39\x24\x33\x99\xfd\xc9\xd5\x10\x03\x24\x66\x7c\x5a\xb2\x8f\x35\xc0\x0f\x61\x25\x63\x8e\x61\xda\xb7\x0d\x1e\xec\x48\x95\x1d\xe0\xfb\x3f\x7b\x23\xd3\xcd\x98\x24\x37\xc6\x34\x73\x41\x5b\xef\x37\x4a\x66\x32\x96\xf2\x98\x6b\x1a\xe9\x57\x9b\x9f\xfc\xe7\x1e\xc3\x5e\xec\xa1\x16\xd1\x94\xf8\xfb\xa9\xa4\x5a\x91\xba\xe2\x7a\xc4\x55\xdb\x71\xa6\xb0\x1a\x72\x9d\x0c\x13\x5f\xcd\xcb\xc2\x3e\x50\x4a\x29\x43\xc0\x0a\xa4\x20\x70\x51\x9d\x9c\xd7\x7a\xe6\x75\x4f\x31\xeb\x46\xa3\xe5\xbe\x9e\xeb\x3f\xc8\xd3\x1f\xf1\x82\xda\x9b\x08\x7b\xe3\x46\x2c\x84\x59\x12\x6e\x86\x29\x09\x23\x2f\xd5\xf2\xd8\x9c\x01\x81\x59\x57\x61\x1e\x6a\xe7\xca\xa9\x8b\x60\x53\x77\x6a\x77\x15\xc2\xf9\x3c\xcf\x03\x08\x87\x03\x0c\x56\xc2\xb8\x22\x6d\xae\x29\x77\x99\x5a\x6d\x3f\x1e\x9d\x79\x11\xa9\xc9\xd2\xa3\x03\xf0\xe0\x1f\x32\x33\x8e\xfd\xaf\x8e\xe6\x3f\xc4\x1b\x25\x39\x9c\xff\xd0\xb3\x5f\x7e\xe5\x67\x6b\xd8\xfd\x3d\xa2\xcb\xee\x4a\xe2\xea\x98\x08\xd7\xe7\x35\x83\xd9\x94\x33\x99\x31\x46\x67\x4a\x40\x40\xf4\x2f\x63\xd1\xb3\x13\x5c\xc7\x97\xa8\xd8\xf0\xb8\x85\x73\xa3\x28\x90\x69\x6c\xac\x94\x39\xd1\xe1\x5d\x19\x6d\x90\x90\xb6\x2b\x6d\xb7\xe6\x3c\x96\x47\x2d\x94\x6e\x66\x8c\xbd\xa1\xf4\xdb\x88\x93\x00\xcd\xcc\x25\xe8\x4c\x9f\x38\x57\xd1\xd9\xe5\x32\x41\xcf\x62\x5f\x39\x09\xaf\x1c\x8a\xaf\xf4\x30\x9f\x68\xf6\x54\xb7\xa1\x5b\x67\x71\x1c\x5b\x7f\x9d\xe7\x67\x75"}, -{{0xdd,0x7b,0x59,0xa3,0x3d,0x97,0x0b,0xef,0x62,0xe0,0xe2,0x1a,0x7b,0x6e,0x4c,0x30,0x96,0x06,0x86,0xf1,0x7f,0x49,0xaf,0xdb,0x4a,0x9f,0x4e,0x80,0x8e,0x35,0x5c,0x7f,},{0x53,0xa0,0xe5,0x72,0x77,0xd9,0xbb,0xee,0xcf,0x99,0xc4,0xd1,0x38,0xfd,0x66,0xfa,0xfc,0xae,0xc7,0xbc,0x5f,0x56,0x7f,0x83,0x20,0x80,0x0c,0x4e,0x58,0x4f,0xf8,0x2e,},{0x87,0x29,0x4d,0x22,0xd4,0xad,0x0d,0x08,0x14,0xe2,0xd6,0xd5,0xfa,0xf5,0x57,0x49,0xe9,0xb3,0x98,0x03,0xb4,0xd4,0xb7,0x87,0x9e,0x60,0xb7,0x77,0xc1,0xfc,0x41,0x58,0x4f,0xe1,0x51,0x35,0xba,0x11,0x23,0xff,0x5f,0x20,0x0d,0xb3,0x5a,0x34,0x68,0xdd,0x4d,0x58,0xda,0xd7,0x7b,0xd9,0x6e,0xe2,0xb8,0x88,0xa5,0xa8,0xb1,0x8c,0x32,0x04,},"\x75\x58\x03\x67\x93\x05\x18\x16\x8b\x0a\x76\x4d\x09\x58\xbe\xc4\xfc\x46\xcf\x59\x19\x99\xeb\x37\x37\xe4\x2a\x02\xea\x72\xd2\x10\xda\xad\x53\xe5\x4a\x7c\x2c\x13\x4a\x6d\x47\x83\x37\xd2\x63\x33\x68\x54\x81\x70\xed\xef\x0d\x85\x17\x9f\x30\x23\xe1\x50\x38\x68\xa6\xe5\xe2\x77\x5e\x41\x2a\xc0\x5f\x05\x89\xd4\x2a\x37\x7e\x75\xaa\x6b\x8f\x52\x20\xa7\x69\x9a\xe8\xaf\xf0\x10\x94\xec\x46\x9d\x63\x61\xd3\xe8\xf3\x86\x15\xed\xcd\xa4\xd2\xd5\x28\x9a\xcf\x73\xdb\x64\x56\x98\x57\x80\xc9\x2e\x07\xf6\x2c\x77\xa9\x09\xfb\x6e\xf5\x98\x82\x20\x62\xbd\x57\x2b\xf7\x05\x8d\xcb\x83\x5e\xf3\x44\x3d\x3e\x47\xb5\xc6\x03\xd9\x27\x36\xdd\x1d\xf2\x6b\xe4\xb9\x28\x3b\x76\xe3\x21\xd5\x5c\xe2\xb6\x38\xcd\xe2\x25\x77\xca\x59\xc9\x63\xc2\x47\x95\x56\xc5\x75\xcc\xb0\xd6\xd1\x8c\x80\x4e\x2e\xb0\x1f\xf5\x35\x81\xeb\x04\x0f\xfd\x2c\xc4\x67\x60\x73\x7a\x74\x67\x2e\xa6\xbf\x78\x05\x8a\x6a\x0a\x1f\x5e\xbf\x56\xde\xcb\xf9\x4b\x54\xaf\xb2\x3c\x11\xd3\x41\x79\xbf\x09\x76\xb4\x15\x80\x17\xd4\x07\xc9\x5a\x40\x1f\xa6\xf9\x62\x4d\x77\x13\x5e\xae\x81\x41\xeb\xea\x9f\x35\xd5\xf5\x1b\x3d\xed\x99\x5c\x7f\x70\xc0\x25\xb0\x94\xad\xef\x2b\x07\x1f\x97\x11\x55\xd7\x79\x6d\x61\x3a\x55\x0d\x09\xe7\xf4\xdf\xc3\x45\x17\xb3\xf8\xfa\x43\x93\x28\x6a\x2b\x22\x80\x17\xda\xf2\xe0\x15\x38\x7e\x13\x52\x7f\x63\x66\x1d\x3c\x13\xe7\x8e\x90\xfb\x29\x55\xee\xe3\x45\x73\x91\x19\xb7\x91\xf0\x5b\x07\xc8\xf4\x2a\x43\x6e\xfc\xad\x1e\xc5\xea\x10\xf3\x08\xf8\xe2\x3c\xa9\x8b\xc6\x5a\x5f\xd9\x39\x3e\xfa\xaf\xe5\xcd\xef\xba\x81\x05\x81\x70\xcc\x54\x93\xc0\x0c\xed\xf2\x54\x09\x74\x35\xd2\xe2\xfd\xe5\x5f\x86\x6b\xb8\x2d\xbd\xfb\x91\x54\x34\x49\x74\x86\x63\x59\x16\x7b\x46\x6c\xaa\x90\x9b\x91\x53\x0c\x9c\x7e\xe8\xc5\x3f\xa9\x01\x64\xbb\xd0\xb1\xfa\xdb\xdc\xd0\x81\x27\xf1\x9b\xe5\x03\x30\x71\x51\x8d\x3c\xf1\x0a\xe6\xbd\x6f\x98\x27\xe1\x20\x6f\x5e\xc0\x95\xc1\x98\x61\x70\xe8\xd5\xd8\xe7\x2e\x57\xd4\x22\x87\x01\xdf\x2a\x48\xc9\x54\x87\x30\x56\xcf\xdf\xba\xaf\xb1\x0e\x46\xa0\xc1\xf1\x44\xb1\xa0\xea\xcd\xd2\xcb\x66\xbb\x91\x2a\xc4\x71\x78\x7d\xab\xe4\x83\x53\x85\x91\x20\xb0\x34\x03\x56\x7c\x41\x5d\xdb\x88\xfc\x0d\x7f\xba\x40\x69\xbb\xfe\xf4\x06\xee\xd7\x24\xa1\x1a\xbc\x04\x1e\x8e\x7b\xeb\x66\x3d\x0d\xc9\x9d\xce\xf3\xac\x6a\x14\x90\x07\xb4\x2d\xd1\xf2\x2a\x77\xdd\x52\x90\x18\x14\x32\x51\x72\x22\x4a\x27\x78\xf3\x66\xfb\x9e\xb0\x2c\x81\x2b\x84\x2a\x42\x84\x25\x61\xc6\x8f\x2a\xc2\x31\xc2\x6c\xe9\xe8\xb1\x9a\xe9\x1e\xbf\xad\x3c\x0e\x9f\x66\x36\x3a\x13\xec\xd8\xb8\x97\xa3\xd0\x0a\x26\xd2\x57\x64\x8d\x56\xc6\x74\x74\x41\xca\x1c\x6e\xe9\x9f\x08\xdd\xad\x25\xd1\x16\xdf\xad\xab\x03\x83\x00\x0d\x3d\x72\x25\xcf\x2e\xff\x70\x76\xb2\xad\xab\x95\x22\x29\x25\x55\xf3\x19\x32\x06\x78\x60\x00\xd4\x2c\xa3\x4d\x70\x8d\xc0\x42\x84\xa9\x4d\x17\x4c\xc9\x2f\x10\x2e\xfd\xdf\x31\x48\xc2\x99\x69\x16\xd4"}, -{{0xd8,0x80,0xd2,0xfb,0x06,0x26,0x2f,0x57,0xab,0x87,0x78,0xe3,0x3d,0x16,0xb4,0x73,0x06,0x09,0x78,0xa6,0x54,0x9c,0xdb,0xcd,0x55,0x86,0xba,0x81,0x05,0xf5,0xac,0xa8,},{0x0d,0xe4,0x86,0xd2,0x11,0x5f,0xaf,0x2d,0x54,0x72,0x66,0x77,0x2e,0x43,0x0f,0xd9,0x72,0x7b,0xdc,0xac,0xe6,0xec,0xbf,0x2f,0xe2,0x3a,0xb6,0x0f,0x7b,0x52,0x54,0xb1,},{0x4c,0x00,0xa7,0x16,0x68,0xd3,0x21,0x3c,0x29,0xc7,0x04,0x1c,0x5a,0x03,0x7e,0xdf,0x13,0xc6,0x51,0x4b,0xd0,0xeb,0xc8,0x80,0xc9,0x09,0xca,0xff,0x15,0x06,0xa4,0x5d,0x27,0x80,0x9f,0xb7,0x4e,0x66,0x02,0xea,0x2a,0xad,0x0f,0x84,0x28,0x31,0xb7,0x4f,0xb3,0xd6,0x90,0x0c,0xcc,0x52,0x06,0x52,0xda,0x28,0x36,0x8f,0xd9,0x0c,0xa3,0x0e,},"\x11\x47\x43\xe8\x2a\x09\x93\xce\xc9\x70\x50\x67\xab\xd7\x7c\x16\x8b\x53\x67\x7e\xde\x5c\x15\x9f\xad\x36\xf0\x6f\xc1\xa1\x4a\xcd\x77\xf8\x83\x79\x9e\xd9\x88\x3f\x99\x15\xae\xa6\x38\xec\x17\x41\xf3\xf4\x21\x58\x55\xfb\x5b\x07\xdf\x37\x93\xbb\xe5\xb5\x68\xeb\x35\x94\x39\x1a\x9e\xf5\x72\x7f\xab\x93\xe5\x74\x69\xb3\x7d\xe1\x25\xb1\xe9\xf2\xe6\xfe\x2c\x3d\x1a\x10\xec\xf8\x7b\x6c\x0a\x66\x5c\x6d\x46\x0a\x17\x0e\xef\xb9\xbf\x71\x6c\xd8\xfa\xea\x97\x64\xf5\x79\xff\x34\xeb\xfa\x9c\x4c\xfb\x34\x70\x6d\x8d\xd7\xc9\xeb\x1d\x10\xb2\xdf\x46\x0a\x46\xbb\x57\x89\x43\x0b\xf4\x49\x15\x8b\x58\x24\xf2\xa3\xa7\xb9\x18\xb3\x3a\xcf\x2d\x9e\xbe\x90\x21\x6d\x1b\x7c\xbf\x4a\xf7\x70\xc5\xdb\x95\xfc\x62\xff\x3a\x3c\x38\x5c\x3a\x82\x17\x85\x3b\x73\x46\x63\x4a\xaf\x30\x60\x72\x88\xdb\x0c\x48\x3b\xd4\xc2\x22\xeb\x33\x2c\xb8\x9d\xc4\xa2\x17\xe6\x33\x4a\x26\x84\x13\xa3\x90\xbb\x37\x1a\xec\x35\x5f\xbe\x4c\x73\x6f\x7d\xa7\x5f\x9c\x88\x75\x41\xa2\xb7\xd0\xda\xc0\x18\xb6\x13\x8f\x02\x1e\x77\x26\x6d\xde\xce\x84\x68\x45\x2a\xda\x39\xf5\xe6\x3d\x02\x09\xb9\xd6\xda\xbf\x97\x54\x13\x25\x6d\xca\xa1\x5a\xc1\x4b\x60\x68\xe1\x77\x05\x6c\x7b\xf0\xf0\xf7\xc8\x84\xa3\x40\x20\x32\x29\x8c\xd5\x59\xa6\x31\x20\x39\x40\x06\x32\x32\x7f\x9c\x0e\x76\x3e\x52\x79\x8c\xb1\x77\xda\x44\x75\xe4\xb2\x40\x5c\x15\x7c\xa4\x27\x74\x11\x08\xd3\x3e\xd0\xb7\xa3\xf5\x34\x38\xce\x6b\x72\x5c\x6d\xd5\x81\x4a\xf5\x1c\xfa\x45\xdb\xce\xd5\x57\xf7\x26\xdb\x13\x0d\x55\xcd\xe7\x53\x3b\xc2\x09\x2d\x6b\x69\x9c\x2c\x87\x0a\xf2\x82\x73\x1e\x18\xd6\x51\xae\x85\xb3\xdb\x4b\xa0\x28\x53\xf8\xc8\x7f\xd5\xe3\xab\x69\xbc\x57\xb0\x8b\x81\xf8\x3c\x23\x9c\xcf\x22\xe8\x17\xe2\xad\xa4\xd0\xad\x14\x48\x7e\xd1\x46\x12\xc8\xb0\x97\x3e\xc0\x65\x0a\x55\xf6\xbf\x9a\xf4\xae\x92\x56\xad\x35\x46\xa3\xf6\x7d\xd3\x5d\x98\x7e\xf2\x19\x09\xa9\x4c\x50\xf0\xef\x06\x40\xe7\x55\xb1\xc4\xe1\xa0\x12\xaf\x0d\x31\x76\x6e\xeb\x5d\xf3\x1c\xd1\x04\xc6\x4e\xb6\x2e\xb4\xef\xb1\x39\xcf\x30\x57\x69\x40\x1d\x21\x3f\x96\xa4\x88\xd5\xee\x7e\x3c\xe3\x2b\x01\x92\xee\x8f\x08\x31\xbf\xbe\x8f\xe9\x5d\xe9\x56\x88\x6b\x52\x4d\x33\x19\xb7\x3f\xd5\x6d\xc6\x0e\x9f\x1c\x72\xd7\x81\x55\xa9\x7c\x6f\x43\x69\x7b\x20\x46\x6b\x3e\x7a\xeb\xd3\x57\xb9\x16\x96\xe7\x34\x8f\x45\x99\xb3\x4f\x35\x91\xed\xdf\xce\x2a\x7b\xd8\x49\xab\x16\xf7\xb4\x3e\xbb\x16\xe2\x3d\x6f\x52\x10\xef\xa3\x0a\xb3\xba\x8d\x32\xc4\x06\x62\xb8\x66\x2f\xd9\x11\x54\x4b\xc2\x45\x8c\x65\x69\xef\x75\xa9\xb9\xdf\x6a\x0f\x6d\x80\xd6\x58\xba\x86\xb2\x41\xca\x19\xce\x9a\x6f\xcf\x01\xd3\xda\xa9\x5a\xfb\x59\xc3\xd8\x9a\x18\xb9\x48\x62\x13\x94\x32\x7f\xc5\xe9\x20\xa7\x5f\x98\xf5\xe2\xb3\xd6\xc9\x5f\xd8\x52\xad\xf5\x67\xb6\xd3\x7c\x54\xd2\x97\x08\x56\xa5\x99\xf7\x49\xe2\xc5\x5d\xac\x7c\x23\xe3\xfb\x1a\x63\xbb\x4c\xc4\x7b\x8b\x94\xf3\xd5\x89\xac\x4b\xee\xf0\xaa\xd4\xe6\x29\x2f"}, -{{0x58,0x58,0x71,0x94,0x1c,0xc2,0x82,0xe3,0x33,0xd5,0x7b,0xbf,0xc3,0xd4,0xae,0xda,0x86,0x2c,0xfa,0x0a,0x37,0x50,0x30,0xcd,0x59,0x4b,0x36,0x92,0x84,0x8c,0x5f,0x00,},{0x4f,0x34,0x38,0x16,0xcd,0x48,0x05,0x0b,0x67,0x8d,0x3a,0xdf,0x70,0x00,0x88,0x77,0xc9,0xfc,0xf5,0xcb,0x66,0x2c,0xc4,0xad,0x2b,0x93,0x86,0x4c,0x02,0x09,0x07,0x07,},{0x29,0x88,0x56,0xe5,0x70,0x18,0x8a,0xef,0xca,0xd8,0x1b,0xb9,0x70,0xf0,0x76,0x96,0x57,0x70,0xc2,0x67,0x62,0xfe,0x29,0xe6,0x55,0x4d,0xc7,0xaf,0xcd,0xb8,0x01,0x72,0x3b,0xf6,0xc7,0x63,0xb4,0xcc,0xd6,0x5f,0x4e,0x15,0xd7,0xd8,0xea,0x38,0xfc,0xf6,0x7e,0xa9,0xd2,0x85,0x90,0xc7,0x92,0x55,0xc1,0xcf,0xeb,0xa7,0xb5,0xe4,0x5a,0x00,},"\x65\x1c\x10\x1b\x3e\x2d\xfe\xf0\x78\x3c\xe9\xf6\x1b\xd0\xa8\xbd\xc9\x30\x7a\xc0\x48\x8b\x9d\xd7\x0c\xd9\x0a\x7e\xd8\xf1\x79\xa7\x89\x35\x55\x62\x95\xb9\x1c\xc2\xb9\x72\x11\xe3\xb9\x81\xb8\xda\xfc\xb3\xd0\x6b\x76\xd0\xb6\xed\xa7\xfc\x61\x94\x5c\x0e\xe2\x65\x2c\x5a\xc4\x54\x25\x64\x96\xcb\x82\xf9\x8c\xc1\xcc\x92\xd8\x18\x93\xb1\x08\x2b\x31\xb4\x7e\x6d\x22\xa2\xde\x60\x9d\xe4\xce\x8d\x7c\xc4\xf4\xa1\x52\xc4\x7f\x41\x0d\x7f\xc3\x7d\x38\xcc\xd6\x29\xa4\xb3\x3e\x62\x21\x89\x60\x81\x79\x7d\x07\x53\xdd\x4f\xaa\x8a\x8b\x44\xd6\xc4\x67\x71\x66\xdf\xb4\xd5\x21\x54\x46\x36\x0a\x3c\x28\xd8\xf6\x8e\x38\xab\x54\x60\x8b\x98\x82\x1b\x83\xc1\x87\xb5\x39\x3a\xd8\x74\xa7\x6f\x4f\x5d\x72\x94\x93\xa1\xfd\x74\xcc\x77\x19\xca\xea\x99\x1d\x22\x9c\x5d\x0c\x8c\x4c\x5f\x89\xd8\xe4\x34\x5f\x4f\x52\x21\x43\x13\x41\x0b\x8c\x06\xb3\x31\x5f\x45\xed\x0c\x2f\x91\x38\xab\x96\x6a\xec\x0a\x64\x5b\x6d\xba\x76\x38\x0a\x53\x91\x23\xe0\xf3\x3b\x97\xf3\xd0\x60\x39\x4a\x30\x53\x58\x1f\xfd\xef\x3e\x6d\x36\x53\x11\x66\xb5\x53\xa9\xdd\xe0\x31\x05\xc0\x4a\xf6\x97\xd9\x5e\x95\x21\x7f\xd6\xdc\x96\x8b\xf3\xb4\x48\xd5\xf3\xa8\xe4\xf5\xae\x7e\xdc\x30\xec\x78\xb1\xae\xa4\xf0\xdb\x18\x9a\x94\x9a\x12\x21\x38\xcd\xfb\x5f\x96\x93\xdb\x00\x4b\xae\xd1\xa4\x21\xdc\x44\x12\x2f\x32\x72\x87\xf7\x27\xcf\x98\x9f\xca\xe3\xcf\x3b\xe3\xe3\xdd\x9b\x9f\x53\x50\x2c\xf5\xd9\xfb\x18\x6d\xe7\x91\xd3\x10\xd1\x22\x86\x9c\x9f\xc3\xb6\x95\xde\xc1\x60\x74\x77\xf3\xe1\x49\xe5\x2b\x63\xcf\xdf\xb0\xd9\x83\xe8\x9a\xf2\xf7\x5a\x8f\x48\x98\x43\xec\x05\xc5\xea\x5f\x0e\x72\x1a\xca\xb3\x87\xc6\x80\x25\xf2\x0a\xbe\x0d\x27\xb4\xce\x29\xf4\xa6\x4f\xb7\xf8\xe8\xa3\x32\x87\x3d\x3e\xd1\x21\xfb\x49\x34\x14\xb8\xcb\x0c\x00\xad\x3a\xb6\x16\xc5\xbe\x52\x41\x47\x1a\xde\xe9\xf8\xf4\x69\x74\xea\xe8\x4a\x4a\x8c\xe6\xfa\xbb\x7f\x5d\x9a\x6b\x75\xa7\xe6\x70\x45\x6f\xcd\xcd\x1d\x98\x2e\x8f\x82\x7a\x4b\xbb\x69\xde\xc7\xe3\x05\x3d\xfe\x83\x5b\x70\x30\x1b\x7b\x76\x3f\x00\x04\xbc\x90\x6e\x14\x55\x42\xf4\x87\xb4\xdb\xa2\xed\x56\x1b\xd1\xa2\x03\x06\x23\x6a\xf4\xb3\x6e\x40\x68\xe8\xc0\x07\xb9\x45\x4f\x87\x41\xa5\xf8\xf0\x79\xec\x1d\xb8\x83\x5e\xb6\x54\x42\x90\xd6\xad\xb5\x2a\x70\xd7\x67\x5d\x85\xdf\x4a\x9a\x12\x55\xbf\xd9\x36\xc3\x31\xfe\x51\xc0\x97\x7d\x12\x4b\x5a\x50\x6d\x29\xc6\xee\xc3\x3c\xaa\x25\xd8\xeb\x28\x95\x2d\x6f\xfb\x9d\x6e\x3d\xa8\x90\x38\x2d\x88\x87\x96\xd3\x74\x60\x7f\x66\x43\xb8\x9e\x73\x26\xd9\xed\xc4\x9a\x0f\x53\xbd\xcb\x8c\xc7\x6f\xfd\x39\x3a\x77\x06\x52\x2d\x04\x17\x00\x36\xcc\xb6\x63\x30\xdb\xac\x9d\xa7\xe6\x16\x8c\xaa\x88\xcb\x62\x18\x1e\x55\xa7\xb6\xd5\x21\xa2\x11\x5e\x23\xe2\x02\xee\x24\x80\xb5\x87\xbe\x45\x01\x44\x79\x79\xa8\xd7\x36\xf9\x01\x2e\xcf\x00\xe6\x7b\x31\xe8\x10\x4f\x6e\x7d\xf0\x8a\x96\x83\xcd\xc8\x9c\x03\xa4\xe3\x7e\xe2\x29\x28\xd4\x5f\xa1\x90\x94\xe0\xd6\xe7\xb4\x0b"}, -{{0x05,0x88,0xac,0xd4,0xe0,0x9b,0xa9,0x02,0x74,0xc8,0xf3,0xd1,0x57,0x5b,0x2b,0xf3,0x64,0xa7,0x76,0x88,0x4a,0x9a,0xeb,0x41,0x03,0x41,0x5e,0x16,0x3b,0xa0,0xbf,0x81,},{0x3e,0xca,0xe6,0x97,0xb4,0x25,0xd8,0x7e,0x34,0xa1,0xd9,0x44,0x09,0x8e,0x3d,0x32,0xe2,0xc1,0xec,0x56,0xc3,0x62,0x7d,0xf8,0x0b,0xa2,0xb8,0xa4,0x3d,0xdc,0x19,0x03,},{0xa1,0x11,0xb9,0x70,0x6d,0x24,0x2c,0xd3,0x6d,0x6e,0x87,0x41,0xcb,0xb0,0x97,0xb9,0xe2,0xff,0xfa,0x40,0xf4,0x3f,0xd6,0xf2,0xd3,0xd9,0x16,0x93,0x66,0x73,0x32,0xb5,0xf2,0xdb,0x5e,0xe3,0xea,0x20,0xb8,0x32,0x91,0xb8,0x40,0x57,0x95,0xb7,0x4d,0x63,0x3d,0x46,0xf4,0x75,0xab,0x7c,0x47,0x61,0x71,0x18,0x53,0x5b,0x80,0x51,0xd9,0x07,},"\xf8\x28\xf8\xc9\xda\xd2\x98\xc5\xb7\x19\xda\xa8\x52\xb1\x7e\x76\x25\x98\xa7\x0f\x4e\xcd\x16\xa2\xfc\x59\x6e\xb0\x26\x38\x99\xe9\x83\xd4\x4e\xdc\xc7\xbd\x24\x0c\xb0\x76\x10\x60\x0a\xe9\x6a\xac\x0d\xfc\x3b\xe3\x87\xb6\x16\x85\x08\x99\xb5\xcf\x44\xe1\x76\x7f\xfa\xca\x3d\xf3\x81\x58\x59\x84\x24\xf8\x07\x14\x14\xc7\x04\xe6\x0b\x42\x2a\xd7\x73\x77\xfa\x7f\x6a\x8c\x5d\x0e\xbc\x02\x35\xe2\xd4\x3a\x98\x4f\x3a\xdf\x75\x9e\xb1\x04\x47\xf3\xc2\xf6\xb8\x0d\x5a\x11\xef\x41\xd3\xa0\x98\x52\xc0\x93\x2a\x1b\x9a\xc2\x3e\x6f\x40\xa1\x67\xde\x21\x04\x1b\xec\x88\x85\xf9\x43\x3e\xb8\x0b\x95\xc9\x78\x59\x58\x04\x6c\xdb\x7b\xf1\x47\xa7\x99\x47\x82\x3b\x41\x49\xae\x05\x21\xd7\xe5\xaa\xbc\x15\x64\xfa\x40\x44\x10\x6e\x2e\x39\x2e\x9c\x34\x44\x57\xe9\x92\x93\x76\xea\x9b\x42\x29\xc6\xe7\x73\x8f\xe7\x90\x08\xd5\x54\xc4\x29\x39\x69\x14\xc3\x63\x87\xf5\x79\xb4\x6b\xab\x14\x6f\x6a\x95\x10\xeb\x6f\x8c\x85\x55\x1c\xbd\x84\xc7\xdc\x0d\x0b\x1c\x01\x0c\xcb\xa5\x96\x3a\x7f\x39\xf1\x81\xe4\x4d\xbc\x98\xe4\x95\xaa\x63\xc0\x10\x59\xcb\xe6\xa9\x9b\x07\xb4\x49\xe7\x75\x9c\x9a\xf9\xe0\xf8\xd9\x05\x4a\x67\xa3\x48\xfa\x19\xd7\xf9\x1e\xc0\xa4\xd4\xf2\xc7\x02\x6c\x3b\x84\x92\x59\xa3\x50\x41\x7f\xd8\x6c\xab\x21\x42\xe4\xcf\xe3\xc0\xaf\xbf\x25\x18\x2a\x2d\x52\xbd\x2e\x0b\xc9\x20\xe8\x50\x80\x83\x2b\x91\xb9\x27\xb6\x29\x48\xa6\x7c\x31\x7e\xb0\x90\x91\x46\x1d\x49\x3e\xea\x5f\xfc\x47\xbf\x08\x55\x82\x96\x82\x58\xa3\xc8\xdd\x81\xa8\x58\x27\x0b\xdd\xaf\xe7\x92\x56\x84\xa1\x5f\xfb\x51\xbc\xfa\xab\x93\x1a\xfa\x46\x5e\x30\x90\xe8\x6b\xe4\x1e\x35\x47\xcb\xa2\x34\xb8\x5f\xe7\xdb\x70\x04\x96\xa5\x05\x00\x2d\xf3\xca\x4e\xae\xc7\xb9\x62\x78\xc7\xd1\xa7\x7d\xb8\x34\xa9\x17\x97\xbb\xb8\x26\xd0\x92\xaa\x28\xb4\x95\x45\xed\x3b\x1e\xda\x23\xbe\x11\xa3\xf5\x28\xb9\x55\xcb\x0c\x4f\xa6\x6e\x16\xe9\x57\xe5\x70\x4c\xf3\x19\xe5\xf7\x9c\xc0\x9f\x2d\x05\x4e\x6d\xaf\x19\xe2\x92\x6b\x11\xe1\xe4\x13\xff\x82\x2c\xa1\x41\xf7\xc3\xd3\x85\xae\x95\xdd\x20\xb3\x46\xe5\x83\xcf\xb0\xc2\x29\xec\x39\xcf\x88\x9a\x54\x19\xcd\x37\xbc\x18\x4e\xf5\xfb\x14\x46\x22\x08\x0a\x30\x2d\x9d\x77\x45\xc4\x51\xf7\xd8\x82\x42\xcc\x26\xb9\x16\xa3\x56\x9a\xbc\x7d\x1f\x21\x6d\x57\x79\x7a\x47\x2b\xc6\x21\x76\x17\x58\xe8\x40\xeb\x8e\x29\xbc\x8e\xfc\xb7\xaa\xfc\x7c\xf8\xf4\xe5\x93\x30\xd3\x5e\xe1\x07\x49\x6d\xec\x6e\x71\x4b\x1f\xa4\x30\x98\x37\xbb\x47\xeb\x3a\x06\xb4\x60\x4d\xd2\x07\x33\xcc\x0e\xaa\xc2\x64\x9e\x18\xc0\x73\x42\xef\x55\xd1\x9b\x8d\x03\x95\x91\xac\x28\x69\xac\xc3\x4b\x6c\x3c\x1c\xa3\xcf\x26\x3f\xf8\x4c\xa4\x3a\x5f\x64\x65\xba\x34\x88\x8c\x10\x90\x13\xb3\x2b\xfc\x0d\x0d\x15\xf5\xa7\x6c\xec\x27\x0a\xb3\xac\x9a\x10\x63\x31\x31\x2f\x5a\x0a\x84\x28\x2c\x3a\x3d\x4a\xea\x1e\x7c\xf5\x3d\xbf\x8b\x24\x0b\xdd\x11\x1c\x34\xd2\xa9\x3d\xfd\x12\x58\xfe\x92\x67\x13\x3f\x75\x54\xdc\xc2\x1a\x8f\x43\x9c\x16\x5d"}, -{{0x7d,0x14,0x02,0x3e,0xb4,0x8b,0xbd,0x43,0x76,0x49,0xa2,0x41,0x87,0x79,0x05,0xa3,0xc9,0x32,0xf1,0x46,0x40,0xf2,0x9a,0x0f,0xb1,0x34,0x11,0x4e,0x8f,0x33,0xf5,0x82,},{0xea,0x5c,0x11,0xb4,0xb2,0xc5,0xef,0x4a,0xb7,0x06,0xcc,0xa3,0x47,0x50,0x43,0xc9,0x58,0x18,0xeb,0x56,0x5a,0x79,0x7e,0x33,0x68,0x8a,0xfe,0xac,0xd6,0x8a,0xdc,0xca,},{0x31,0x33,0x9d,0xce,0x23,0x33,0x6d,0xf5,0xb2,0xb1,0x93,0x52,0x2a,0xa3,0xdd,0x2d,0x41,0x14,0xa6,0x6a,0xf1,0x65,0x62,0x89,0xc9,0x52,0xbc,0x11,0xc9,0xb2,0x10,0xf7,0x7a,0x54,0xd4,0x61,0x61,0xf4,0xe0,0xc5,0x2b,0x30,0x13,0xe4,0x0b,0x9e,0x9e,0x84,0x27,0xd8,0x51,0x32,0x5b,0xd7,0x1c,0x4d,0x99,0x35,0x3e,0xee,0xd7,0x51,0x08,0x0d,},"\x90\x01\xdb\x31\xf2\x79\xbe\x50\x53\x19\xb8\xe7\x2b\xde\x11\x99\x51\x29\x80\xdf\x65\xf0\xd8\xa9\xb4\x93\x04\x67\x41\x3a\x99\x7b\x97\xa3\x62\xb5\x72\xa4\xb4\x4b\xc9\x40\x48\x7f\x18\xb2\x08\xce\x6a\xc5\xc6\x87\x16\xd3\xaf\x1b\xce\xf1\x70\x38\x3b\x5c\x4b\x5c\x47\xe4\x47\x37\x72\x6f\x93\x83\xbc\x4f\x14\x47\x68\xbf\x5c\xaf\xb4\xe9\xdf\xe3\x97\x61\xe6\xed\x47\x89\x71\xd1\xc7\x0e\x6d\xab\x2f\xd0\x49\x9d\xff\x92\x93\xb2\x39\xd1\x6c\x96\x02\x61\xc6\x82\x18\xb9\xf5\xb1\xbe\xe6\x90\xf0\xd2\x40\xc1\xb3\xdb\x71\x1f\x9e\x82\x1f\x08\x09\xbb\xeb\x9a\xaf\x24\x9c\xcb\x16\x8c\x67\xd9\x65\x56\x2d\x24\xf8\x48\x51\x61\x40\xbf\xd9\xfc\x05\x0d\x4f\x20\xda\x5a\x17\x94\x46\x8a\x9c\x07\x25\xea\x5c\x66\x9d\x5c\x63\x0d\x93\x10\xe5\x74\x51\x07\xda\xd3\x72\x61\xb5\xd9\x1e\x38\xe0\x85\x12\xe6\xf3\x73\xec\x5d\xca\xd5\xca\x09\x07\x29\x07\xc8\xfb\x7b\xf3\xb9\x26\xc3\x33\x94\x90\xb3\xf5\x1f\x76\x44\xe7\x3a\xe2\xec\x01\xd6\x1b\xe7\xc6\x52\x65\x36\xb4\xff\xd1\xab\x68\x49\xfe\x0c\x2f\x40\xd3\xbd\xa2\xa4\x9e\x55\x50\xb8\xdf\x97\x90\x81\xda\x85\x16\x8d\x0f\x71\x58\x2b\x90\x36\x77\x52\x6d\x1f\x1b\x15\x11\xe1\x38\xb6\x84\xfc\x46\xaa\xc8\xbd\x80\xc3\xde\xf7\xee\x81\x38\x19\x04\x61\x80\x7c\x55\x36\x12\x5c\xb0\xe2\xc3\xd0\x83\xa1\x87\xc7\x26\x9c\xb5\x31\xec\x36\x78\x78\x7b\x32\x55\x5c\xf0\x4a\xb0\x93\xc9\x00\x2e\x7d\x79\x2b\x4d\x93\x3f\x2e\x30\x70\xf3\x9a\xc8\xcc\xf8\xd5\xf5\x45\x5f\x12\x10\x9d\x8a\x8a\xeb\x4e\x21\x2f\xad\x4a\x70\xb1\x47\xc0\x4a\x7b\x91\x84\x60\xb1\x31\x63\x76\xe6\x40\x20\x85\x95\x17\xeb\x7e\xe3\x0c\x29\x0b\xe8\xb8\xd6\xf9\x67\x39\x15\x25\x6c\x3b\x04\xb9\xd9\x05\x4b\x52\x33\x8e\x0d\x36\x07\x85\xe4\x6a\x18\x28\x44\xc5\xc3\x76\x6a\xea\x8e\xd3\x11\xb2\xd4\x81\xc0\xb7\xb2\x11\x4e\x41\x8e\xd1\x7f\x8d\xeb\xf0\x1a\x83\xff\x37\x51\x70\x24\xee\x9e\x28\xe0\xc9\x0d\xce\x6d\x05\x9f\xfe\xe4\x13\xd2\x7c\xd6\x27\x83\xa8\xb8\xb5\x01\x6a\xd2\x76\xe3\x9d\xfd\x8f\x8f\x3d\xdf\xc4\x28\x10\x18\x18\xce\x50\x7f\x00\x3e\xb5\x8c\x9a\x5c\xc8\xb1\xaf\xf0\x5a\xab\x8f\x0d\x7f\x1d\x1f\x6d\x4b\x87\x1d\xbc\xed\x1f\x3d\x28\x66\x23\x97\x52\xfb\x13\xf6\xe1\x80\x34\xbb\x2b\x5a\x66\x35\xca\xa6\xec\xc4\x62\xe0\x58\xeb\xe2\xfa\x65\x1d\x3d\x0f\x36\xe2\x0a\x31\xf7\x65\xe4\xb9\x58\x27\x0b\xd8\x25\xc6\x81\x8a\xac\x1a\xd7\x56\x31\x35\xae\xed\xf1\x4a\x2b\x6d\x39\x8b\x6e\x34\x00\x84\x01\xb2\x18\x46\x18\x20\x07\x1c\x5a\xf7\x78\x46\xcb\x9c\x32\x81\x90\xc0\x61\xd5\xaa\x6e\x0e\xcd\xe7\xef\x58\x56\xb0\xe6\x81\x4f\x83\x3f\x70\x40\x96\xdf\x08\x25\xfa\x4b\x46\xdc\xda\xcf\xa2\x7c\xd8\x7b\xd7\xbf\xef\xf7\xf8\xca\xe1\x66\xa3\xa0\x4d\x43\x7c\x7b\xe7\x16\xc4\x90\x45\xc7\xbd\x3d\x13\x49\x62\x7c\x9c\xbd\x04\xc1\x5f\x00\xa6\x96\xe3\xcf\xfb\xb4\x5a\xf2\x91\x22\x62\x7e\x7e\xd3\x3b\x42\x49\x91\x3b\xec\x00\xf0\xe2\x8a\xa1\x12\x98\xcc\xe8\xb6\x49\x08\x1f\xe3\xb1\x69\xb4\xaa\xea\xca\x48\x5b\xda"}, -{{0xe8,0x30,0x6b,0xad,0xa6,0xd5,0x5e,0xb1,0x88,0xd9,0xf7,0x5c,0x81,0x5c,0xc9,0x14,0xe9,0x3c,0x9c,0x72,0x22,0x39,0x1c,0x15,0xbb,0xae,0xaf,0x93,0x54,0x43,0x79,0x35,},{0xbf,0x27,0x98,0xb8,0xe5,0x54,0xf5,0x1e,0x22,0x86,0xc3,0x03,0x4a,0x88,0xe5,0x77,0xff,0x23,0xfa,0x32,0xa6,0x72,0x44,0xea,0x82,0x45,0x91,0x2e,0x8b,0xf4,0x6d,0xa4,},{0xcc,0x66,0x27,0x30,0x8e,0x2f,0x42,0x43,0x83,0xfa,0x70,0x59,0x4f,0x57,0x57,0x91,0x60,0x05,0x40,0x02,0x7a,0x27,0x51,0x61,0x9b,0x28,0x3a,0xff,0xea,0xeb,0xc9,0xc9,0xd2,0x9a,0xc6,0xdb,0x28,0x6d,0xd2,0xc1,0xb5,0x96,0x58,0x7b,0x87,0x8d,0x1d,0xf4,0x78,0x1d,0x43,0x6b,0xb5,0x70,0xc1,0xc0,0xf0,0xd3,0x33,0x68,0xdc,0x66,0x52,0x0b,},"\xd7\x04\x38\x09\xc3\xe3\xdc\x00\xb1\x7e\xfd\x52\xc9\x13\x0b\x11\xb7\x86\xf1\xe2\x57\xb5\xe2\x2f\x81\xa7\xfa\xae\x60\x0b\xbc\xdf\xd5\x18\x53\x7f\xe8\x52\xc6\x42\x35\x97\x62\xfb\x75\xe8\xad\x85\x92\x49\xe6\xab\x49\xce\x1b\xb0\x4f\x24\x92\xf2\xaa\xc3\x54\x46\xba\x6e\xb0\x3e\x76\xde\x3a\xbd\x2d\x5f\xc7\xe6\x14\x68\x43\xad\xd0\x42\x86\x0a\x4a\x16\xb5\x9b\xdd\x7d\x03\x83\x78\xa3\x5e\x1a\x04\xb1\x21\x7a\x55\x71\x0d\x93\x7e\x2c\x90\x32\x23\x2e\xa2\xcd\xd1\xd2\x5a\x0b\xff\x71\xef\x5d\x3e\x0c\x05\x6b\x29\xcb\x92\xf6\xdf\x69\x2b\xde\x14\xdf\xa5\x0e\x13\x2b\xeb\xd8\x9e\x9f\x18\x33\x88\x0b\x65\x7a\x78\x1e\x94\xec\xb6\x03\x04\x17\x56\xe5\x51\x7d\x44\x23\xc5\x6f\xad\xc1\x3e\x2b\x31\x80\x88\xfe\xdd\xf3\xb5\xc8\x3c\x20\xb4\x6f\xdd\xbb\xa9\x23\x05\xe4\x86\x06\xda\xb7\x48\xce\x38\x48\xb8\x43\xf4\x71\x1f\x37\x0c\x3e\xc7\xd5\xe1\x9a\xb4\xc0\xac\x1a\xe1\x5a\xaa\xf2\x3d\x65\xfe\xce\xda\xbc\x08\x04\x9b\x9e\x29\x11\x3e\x57\x61\xed\x9d\x1c\x62\xeb\x07\x5c\xab\xb2\x67\x4c\xdb\xe1\xe3\xa8\x89\xba\xe4\xb1\xdd\x31\xb6\xa5\xb2\xea\x1b\x8d\xed\xcc\x3c\x51\x5e\xdc\x44\x67\xc3\x02\x31\x17\x6c\xd4\x4b\xec\x8a\x05\x79\x51\xab\x5c\xd3\x9a\x96\x23\xf8\xaf\x84\x73\xcd\x27\xd9\x33\x02\xbf\x8a\xa6\x24\xc9\xc3\xc5\x79\x9d\xa1\xdc\x49\x44\x94\xef\x8f\xf1\xdb\xe0\x18\x7e\xa5\x16\x26\x70\xb8\xd0\x98\xc3\xa9\x49\x19\x39\x8d\xad\xf7\x9e\x6c\x24\x91\xc4\x44\x39\x2c\x29\xcd\x50\xd5\x74\x35\x06\x32\x90\x84\x2b\xfa\x0e\x85\x30\xfa\xeb\xc0\x06\xd6\xea\x78\x01\x11\x7e\x0a\x3f\x01\x9e\xe2\x8f\xb3\x79\x22\x35\x40\x2e\x2f\x69\xb8\x7a\x43\xdc\x22\x7f\x9d\xe3\x16\x02\x97\x56\xc3\x16\x7d\x64\xa3\xa3\xf6\xd7\x31\x60\x33\x1d\x5a\x18\xee\xe5\xb0\xe6\xe2\x2a\x66\x3e\xfd\xcc\x8d\x67\xaf\x3b\xce\xd0\x41\xea\x84\x3a\x56\x41\x60\x3e\xc7\x2e\xfd\x64\x4e\x17\x3d\x19\x9a\x8c\x83\x0b\x2e\xa5\xfe\xc0\x37\x80\x27\xc3\x72\x25\xaf\xcb\x60\x4c\x4c\xdc\xf4\x09\xbe\x1c\x50\x9c\x9a\x37\x7b\xe0\xd0\x52\x41\x07\xc6\xd9\x2b\x5f\x09\xa2\x9e\xfb\x71\x09\x29\x56\x70\xbb\x1a\x1d\xd3\xea\x00\x8b\xb7\x91\x85\xf0\x9b\x98\xf0\x20\xc4\x3f\x14\x39\x68\x5b\x96\xf6\x19\x93\x11\xa0\x90\x87\x0f\x0d\x9b\x10\xd4\x95\xcd\x41\x0a\xa9\x5b\x7e\x53\x74\x9b\xe3\xa6\xc0\xfb\xc7\x29\xf9\x6c\xf8\x56\x43\x97\xb0\x9c\x13\x51\x40\x16\x82\x5f\x72\xf1\x4e\xb9\x32\x94\xd7\x01\x0a\xcc\xfd\x11\xf1\x7a\x6a\xc8\xf5\x44\x26\x3d\x60\x38\xd5\xc7\xdb\x29\x48\x62\x91\xb3\x0e\xa4\x9b\x6b\x54\xcf\x88\x82\x6d\xd2\x52\xcd\x9d\xbb\x57\xd8\x41\xb5\xa4\xcf\x70\x2a\x32\x64\xfa\xa4\xdc\xcc\x86\xab\x14\xda\xf1\x24\xef\x3d\x53\x35\xa6\x87\x8d\x06\x5c\x6b\xa2\x99\x91\x04\x57\x65\xee\x55\x42\xcc\x9f\x5d\x9f\x35\x4d\xcd\x2c\x6e\x0c\xf7\xff\x3a\x30\xf6\x49\xb5\x91\x2d\x97\x1d\x63\x35\x78\xf1\xe9\xf2\x63\x87\x4d\x05\x65\xc2\x47\x30\x1d\xcb\xd1\x5d\x76\x21\x1a\xe2\xd3\xd5\x06\xfc\x64\xde\xb7\xe0\x42\x56\x5d\x43\x8e\x2b\xfb\x24\x92\x43\xb7"}, -{{0x36,0x3c,0x1e,0xa7,0xc3,0x2e,0xa3,0x28,0xa0,0x55,0xaf,0x7b,0xd8,0xb3,0xbf,0xd2,0x04,0xfb,0x0b,0xbd,0x4b,0xf4,0x2f,0xfe,0x26,0x2f,0x3a,0x5e,0xbd,0x54,0xda,0x55,},{0x7a,0x83,0xec,0xca,0x51,0xef,0x6e,0x5a,0xa0,0x43,0xa5,0xce,0x04,0xd9,0x28,0x8a,0xdd,0x49,0xa2,0x77,0x54,0x8b,0xd3,0x01,0x6b,0x69,0x3f,0xfa,0x79,0xa2,0x2e,0xdc,},{0x5f,0xd1,0xe5,0xf9,0x92,0x2a,0x12,0xf6,0x36,0xb7,0x2a,0x7d,0x62,0x17,0x09,0x1f,0x94,0x8a,0x55,0xbc,0xb1,0x82,0x6b,0x8f,0xca,0xf9,0x9d,0x26,0x41,0x6c,0x7a,0xb1,0x35,0x1c,0x10,0xf4,0x09,0x3f,0xfd,0x8a,0x2a,0xf8,0x69,0x14,0xa0,0xa9,0x81,0x84,0xec,0x7e,0x06,0xd2,0xde,0xe8,0x7f,0xdc,0x0f,0x4a,0x47,0xf8,0xc6,0x3c,0xf5,0x01,},"\xc4\x1c\x1e\x1f\xb7\x59\x54\xa0\xae\x0e\xbc\x29\x09\x0b\x9f\xc5\x33\xe6\x93\xe7\xc7\x10\x5c\xfe\x40\xef\x52\x6e\x4e\x12\xa7\x40\x52\x21\xf2\x18\xc7\xac\x01\x9e\x1d\x4c\x92\xda\x28\x53\xf2\xd7\x26\xaa\x62\x27\x79\x24\xdf\x0c\x34\x3f\xc3\xd4\x7c\xd5\xa9\x9a\x3e\x27\x9b\x26\xa1\xb1\x3b\x1f\x2a\xa3\x6f\x7c\xcb\x4b\x54\xfb\xef\x18\xbd\x87\xa5\x5f\x1b\xc4\x0c\xe7\xb2\x02\x91\x45\xee\x7a\xab\x39\x17\x95\xac\x68\xde\x61\x99\xf5\x05\x94\xfc\x79\x61\x1b\x85\x13\x1c\x14\x30\x21\xf2\x6f\xa3\x58\xda\x0c\x7c\x6a\x65\xdd\xe0\x76\xda\xb4\x88\x67\x5b\x72\x23\x09\xe5\xed\x97\x46\xd1\x8a\x89\x30\x99\x06\xa7\xa9\xdf\x23\x7d\xd2\x7b\xd5\x90\xcc\xc7\x7c\x40\x2e\xf6\xe1\x9c\xa6\x3c\xc8\x6b\x85\x16\x03\x30\xee\x6e\x1f\x1f\x47\xa2\xff\x80\x7e\xef\xad\xc0\x09\x63\x52\x0a\x1c\x60\x0a\x3e\x45\xaa\x7f\xb2\x55\x4f\x47\xd8\x97\xbd\x86\xd8\x1c\x3b\x08\x77\x10\x12\x22\xfa\x78\x50\xb8\x0c\xe3\xbc\x06\xc9\xe5\x8c\x0c\x96\xe3\x2f\xec\x85\x30\xc9\xfa\x1e\x41\x63\xf0\xef\x84\x56\x95\x2b\xf6\xdd\x58\x04\x5a\x36\x3d\x61\x88\x0e\x9a\xc9\x76\xa3\x60\x3e\xf7\x7a\x4c\x39\x5e\x6a\x07\xe3\x42\xf6\x02\x3b\x8a\xf1\x02\x25\xcf\xf2\x40\xef\xc0\x36\x6a\x79\x9f\xd8\x6e\x9d\x06\x20\x60\xd8\x72\x40\x33\xbd\xf6\x75\x88\xcd\x73\xac\x28\x4d\xe4\xc6\x94\x3c\xf4\x5e\xe4\xf7\x5f\x59\x37\xd9\x7d\x78\x10\x5f\x0b\xbe\xce\x04\xd3\xdc\xb5\xe4\x24\xef\xf8\x9b\x77\x3e\x5d\x6b\x4f\x37\xef\xa9\xa0\x65\x4c\xb3\xef\x34\x52\x78\xa6\x2d\x87\x6c\xfe\xf9\xa3\xdc\xdc\xeb\x70\x81\x44\x18\x77\xeb\xd5\xfa\x30\xc9\xd9\x54\xe3\x68\x4f\xa4\x76\xa4\xf4\x85\xd4\x26\xfd\x3c\x8c\x32\xbe\xa0\xf9\xcc\x20\xb1\x5e\x8f\xdf\xc3\xca\x4b\x30\x2c\x07\x4f\x50\x81\x32\xd1\x5d\xe6\x25\xc1\x0a\xe0\x73\x78\x11\x46\x3d\xcc\x55\xfc\xc4\x01\x4b\x20\x20\x8f\xff\xce\xfa\x9d\xd4\x52\x11\x9b\x16\x52\xde\x41\x34\x8f\x69\xf2\xc4\x88\xf5\xcc\x18\x56\xd6\xe7\x8a\x5c\xbe\x3e\x37\x3d\xd4\x59\x8e\x2d\x39\xf8\x76\xeb\x94\xe0\xb0\x1b\x21\xfa\x91\x29\xef\x41\xb6\x39\xf4\xe0\x5e\x69\xde\xb1\x83\x5e\xd4\x4b\x91\x12\xa6\x86\x2a\x5b\xce\xa0\x72\xc6\xe1\xb8\xf0\xf0\x58\xf4\x6b\xac\x2a\x84\x5a\x58\x2d\x14\x8f\x17\x76\x0b\x9e\x0a\x2b\xa6\x0b\xbb\xf3\x88\x4a\xf9\x4d\xd4\xc7\xec\x9d\xb0\x8e\x9a\x5b\xcc\x6d\xde\x13\x46\x44\x2e\xe1\xf4\x70\x7d\x1f\x79\xb6\x9b\xa8\x67\xf4\x18\xdc\x27\x91\x73\xf7\x7a\xdb\xc5\x8a\xb8\x5e\xa3\x93\xb9\xdc\x68\x26\x19\x00\xc1\xca\xa8\x2d\x2f\x50\x47\x4c\x42\xae\xc9\x11\x31\x42\x78\xc0\xaf\xfa\x2a\x6b\x6c\x36\xd1\xff\x88\xf3\xb4\x9f\xb2\xb7\xc3\x39\xd2\xa7\xc2\xb3\x04\x9f\x8c\x0a\x08\xd1\x6a\x9e\x8d\xf9\x3d\x13\x0d\xa4\x84\xbd\xba\x6d\xbe\xc5\x34\xcd\x51\x09\x7a\x04\x82\x21\x10\x6b\xab\x48\xd6\x7f\x95\x1b\x75\x05\xa1\x48\x48\x92\xb8\x57\x79\xc5\xa3\x11\x17\x02\x12\x4d\x95\x7a\xcf\x2d\xc3\x52\xef\x9b\xa2\x47\xbc\x80\xe2\xce\x96\x26\x9c\xe8\x5e\x78\xb9\xeb\xda\x98\x90\x76\xdd\x5f\xf7\x3e\x1e\xb2\x75\xe5\xd7"}, -{{0xdb,0x22,0x28,0xff,0xff,0xa9,0xd2,0x53,0x4a,0xef,0x91,0x8f,0xb8,0x5b,0x82,0x1a,0xd3,0x60,0xe2,0xd3,0x9d,0xec,0x5a,0xeb,0x2d,0xb0,0xdf,0x02,0x49,0x7f,0x94,0x16,},{0x6d,0x01,0x95,0x77,0x7f,0x81,0x05,0xff,0x52,0x3b,0x79,0xc5,0x9e,0x3c,0x30,0x81,0xfe,0x89,0xdb,0x6f,0x87,0x03,0x3f,0x09,0x4f,0xa5,0xa9,0x40,0xce,0xf8,0x4b,0xb4,},{0x82,0x18,0x9d,0x34,0x0b,0xc1,0x1c,0xea,0xa4,0x00,0x41,0x0e,0x08,0xba,0xe9,0xd9,0x01,0xaf,0x05,0x91,0x25,0xe9,0x53,0x78,0x6f,0x8a,0x04,0x3d,0xdf,0x11,0xf7,0xb2,0xf8,0xe3,0xb6,0x17,0xac,0xcd,0x78,0xe2,0x93,0x9a,0xdf,0xab,0xf2,0xd2,0x47,0x1f,0xaf,0xd6,0xf5,0xbc,0x45,0xb1,0x40,0x75,0xb3,0x28,0xe3,0x4d,0x80,0x75,0xb2,0x07,},"\xfc\x07\xcd\x99\x04\x0f\x13\xe5\xa8\x4f\x94\x74\x6d\x6b\xb8\x68\xf7\x52\xb4\x48\xb6\x2d\x99\x59\x3e\xf2\x9e\x43\xcc\x82\x45\xf0\x47\x0f\x65\x55\x2d\x64\x32\x20\xf6\x71\x92\x85\xe1\x5c\x37\xa6\xd1\x74\xae\xf7\x60\x88\xcc\xda\x5f\x88\x68\x5b\x52\xda\xe2\x84\xc6\x5b\x38\x0d\xa3\x45\xa2\xe1\xaf\x2e\xd7\x64\x80\xd2\x69\xcb\x93\x4b\x43\x17\x62\x0b\x79\x2e\xbb\x39\xb2\xa6\x78\x24\x7d\x6d\x81\x5f\x2a\x5c\xb9\xaa\x56\x0e\x4b\xf6\xde\xba\x4c\x0a\x0d\xdc\x82\xd0\xe5\xa5\xa6\x5a\xcb\xc4\x78\xe1\xec\x6b\x06\x4d\x7b\xb7\x38\x8a\x73\xf6\xed\xa3\x0b\x0b\x6b\x73\xdd\x8f\x87\x92\x63\xad\x1a\x03\x48\x67\x1d\xcf\x21\x1c\xb9\x6e\xd0\x8e\xd5\x2f\x33\x17\xda\x68\x18\x5d\x6b\xb2\x58\x9d\xc1\x1d\x75\x5d\x47\xa3\xb6\xf6\xa0\x38\x6a\x85\x94\xd9\x57\x0b\x2e\x9b\x0d\x4b\x5e\x13\xdc\xcd\x9b\xb7\xac\xbe\xf0\xab\x27\x6a\x7a\xeb\xe1\x29\x31\xbe\x67\xf1\x0d\xe2\x67\xa0\x29\x89\x53\x01\xf5\x66\x25\x30\xad\x8a\xb3\xd2\x30\xb3\xb6\xd7\x09\x3a\xcd\xfb\xf2\x74\x75\x7a\x90\x78\xe2\x0c\x23\xbc\x82\x2d\xef\xfa\x61\x00\x54\x86\x10\x2c\x01\xab\x82\xbd\xc8\xcd\xcf\x1b\xb3\x7f\x9b\x56\xd3\x9e\x50\xfd\x5a\x68\x95\x41\x6e\x76\x7f\x4e\x36\xc1\xa4\x17\x78\x90\x81\x25\xb5\xca\x3f\x92\xa9\x0d\xa9\xad\xdf\xf1\x55\xfb\x1f\xd7\x76\x88\x08\xa8\x0f\x20\x3e\xd7\x37\xef\x00\x77\x63\xbd\x2f\xea\x9f\xf2\x8c\x84\xb4\x35\x51\xc9\xfc\x43\x8f\xfc\x47\xfc\xfc\xf6\x4d\xc7\x70\x06\x13\xaa\x8b\x3a\xf8\x63\x3a\xe8\xb6\x98\x74\x37\xc0\xaa\x47\x81\xbe\x1e\x82\x13\x96\xc5\x36\xcb\x30\x05\xd0\x55\x49\xb1\xcb\xa7\x01\x35\xaf\xb7\xfe\x30\x68\x96\x1c\xad\x3a\x14\x63\xcc\x0b\x55\x60\x68\x4e\x27\xbb\xa7\x7a\xef\x41\x9d\x82\x38\x68\xe0\xce\xba\xd1\xf1\xce\x0a\xe9\x02\x74\x4a\x15\x2d\xd2\x94\x51\xa1\x7e\x28\xa8\x9a\x71\x58\xa1\x83\x6e\xfc\xe4\xa3\xe5\xc7\xd1\xfa\xa4\xc3\x87\x5b\xc4\x6c\x4d\x9b\xe2\x2d\x66\xd3\x66\xac\x6f\x59\x53\x8a\x00\xb2\x75\xb0\x2f\xac\x6d\xa7\x55\xa8\x54\x08\x19\x97\xd5\xd1\xd0\xe6\xe5\x68\xa5\x95\x8c\xf3\x34\xc5\x18\xcd\x51\x7a\xb9\xd7\x3c\x48\xd6\xcb\xc4\xae\x4e\xea\x43\x53\x11\x3e\x7e\x4a\x7c\x05\x92\x0e\x68\x6b\xf0\x7a\xfb\xfb\x8d\xd2\xec\x4f\x18\xfa\x71\x38\xe5\x7d\x33\x2c\xd7\xa4\x22\x8f\xea\x73\xbc\x09\x25\x2f\x24\x42\x72\x94\xeb\xd3\x64\x5e\xe0\x99\x6c\x2e\x85\x1a\x8a\xa5\x1a\x7c\xd9\xfc\x2e\xab\x47\xc0\xab\x21\x3f\x4f\x51\xd2\x16\x09\x1e\xd0\x89\xe4\x59\x2e\x9b\xb0\x82\x8b\x85\x8f\x84\xf6\x0b\x93\xad\x84\xa0\xa2\x28\x27\xcb\xd2\x74\x14\xb7\x81\x32\x2a\x04\xd3\x96\x08\x28\xf6\x38\xdf\x28\x34\xc7\xf7\x83\x9d\x70\xdb\x12\x6b\xee\x5a\xf2\xee\x75\x59\xa8\xac\x4c\x01\xa6\xc3\x91\x39\x6a\xf9\x3f\xa0\x60\x89\x40\x29\x7d\xdf\x89\x00\xc5\xdd\xb4\x66\x34\x0a\xe5\x1c\x60\xc7\xea\xd7\x62\x44\x7e\x76\xd8\xbc\xcb\x57\x39\x97\xcf\x66\x14\xd1\x88\xa0\xb9\xa2\xf5\x6e\xed\x9b\x0f\x9d\x46\x3a\x19\x78\x7f\x40\x92\x58\x1a\x65\xc6\xbf\x78\x1b\x93\xc5\x60\x87\xe5\x4e\xe1\x34\x3a\xab"}, -{{0x66,0xb5,0x0f,0x69,0x2e,0x39,0x5e,0xb8,0x33,0x86,0xe0,0x27,0xc8,0x2c,0xe3,0xfd,0xee,0x3b,0xd8,0x99,0xb0,0xd3,0x17,0x9d,0xb0,0x86,0xfb,0xf5,0x24,0xf5,0x74,0x59,},{0x44,0x85,0x36,0xe9,0x82,0x40,0x84,0x37,0xce,0x89,0x67,0x40,0x53,0xe3,0xc5,0x89,0xc9,0x8c,0x09,0x5c,0x60,0x02,0x1a,0x11,0x81,0x78,0xc6,0x26,0x1d,0x88,0x10,0xfe,},{0xbd,0x13,0xf6,0x36,0x2c,0x07,0x07,0x89,0x22,0xf3,0x0c,0x63,0x30,0x75,0x1b,0xf6,0xe7,0xcf,0x42,0xa7,0x69,0x16,0xee,0x65,0x3e,0xb1,0x7a,0xcc,0xff,0x1f,0xbb,0xca,0x35,0x25,0x8c,0x4c,0xbc,0x58,0x2a,0x5e,0x8c,0xc9,0x4f,0xd2,0xc7,0xed,0xeb,0x53,0x76,0x2f,0x1f,0xc2,0x31,0x23,0xd7,0xf4,0xf1,0x45,0x40,0x9b,0x31,0xcd,0x38,0x02,},"\x74\x28\xa9\x64\x21\x2b\xcb\xe8\xdf\x7d\x59\xe4\x8e\x92\x34\x80\xaa\x0e\xe0\x9b\x91\x0d\x04\xef\xb6\x90\x36\x62\xef\xc3\x10\x7a\xc8\xfd\xc0\xc5\xf3\x92\x72\x74\x0c\xd8\x77\xe1\x6c\xd7\x1c\x54\x92\x38\xc3\x37\x22\x0c\xe2\xf6\xb5\xa1\xfc\x6f\x7b\x0a\x1c\xd4\xed\x21\xd9\x38\x89\x08\x1e\x34\xfb\x7f\xde\xcf\x41\x78\xbb\xd4\x31\xe6\x11\xe5\x39\xd9\x00\xc3\xd0\xac\x3d\xc7\x10\x7b\x36\xb4\x1d\x6d\x0d\x5d\x32\xc1\x97\x27\xf9\x08\xb6\xeb\x36\x7f\xeb\xb3\x52\xa4\x93\x58\x1f\xf1\x28\xb5\x6c\x4c\xaf\x6f\xb8\xe0\x99\x81\xf0\xd3\x79\x57\xd1\x28\x20\x17\xfb\xb8\x07\x61\x4c\x20\xf4\x65\xdc\x02\xb0\xcd\x96\x99\x83\xbd\x5a\xe1\xeb\xf6\x57\x8d\x7f\xf3\xce\xff\x32\x0e\x25\x56\x21\x99\xde\xe9\x34\x75\x7c\xc1\xf5\x8d\x55\x40\xc4\x1a\xac\x1c\xe4\xf2\x11\xf0\xb8\xec\x41\x07\x17\x40\x30\xe7\x02\xbc\x6a\x8a\x9c\x85\xc5\x05\xc9\x31\x6a\xef\xea\x3e\x43\x72\x24\x2d\xe0\x19\xb3\x5e\x2b\xd3\xc5\xa9\x56\x52\x19\x71\xc1\x06\xa3\xad\xbb\xc1\x3c\xdc\x4f\x7f\x9d\x3c\x58\xb9\x6a\x34\x4b\x4a\xc3\xef\x6b\xd8\xac\xa6\xed\x98\x76\xb4\x3e\x64\x97\xfa\xf7\xfa\x4c\xf2\x7f\xbc\xb6\x65\x73\x0c\x09\x1e\x13\xaa\xf7\xe9\xef\xe7\xdd\x10\xe1\x4e\xb1\x9a\x92\x00\x42\x42\x10\xec\x8b\x8f\xba\x7e\x69\x44\x4c\xe1\xa9\xe3\xa7\xb2\x6c\x11\xf6\xb7\x14\x5b\x69\x83\xa7\x80\x57\x76\x48\x40\x31\xbf\xf5\x2e\x81\xae\x76\x9b\x70\xa2\x82\xb0\x94\xff\xb5\xfb\x55\x25\xdc\x1a\x87\x2e\x20\x7e\x82\x7a\x2e\x11\xf4\xec\xf7\xb5\x30\x8c\x74\x8a\x92\x78\xea\x7b\xd6\x61\x88\x19\x44\x00\x43\x0c\x8c\xd5\x96\xeb\xb8\x72\x21\xe5\x36\xf6\xaf\xe1\xf1\x50\x5d\x6a\x59\xf4\x1d\x16\xa2\xf0\x14\xe1\xcf\xa5\x13\xf7\xa6\x97\x31\xd7\xbf\xdb\x2a\xff\xce\xfe\x05\x37\xd4\x2c\x79\x6e\x3f\xd2\x7e\x41\xb7\xca\x72\x05\x1b\xef\x28\xbb\x7b\xde\x70\x10\xdc\xfe\xd8\xaa\x16\xef\x67\x6d\xb6\xe5\x20\xc3\xce\xf8\xd6\xf5\x8a\x9a\x28\x13\xcf\xf0\xf7\x04\x1f\x87\xfb\xfb\x84\x31\xe0\x20\xed\xe1\xd4\xea\xf1\x9e\x23\xb9\x83\x44\x5c\x59\x15\xb5\x4a\xdf\xb5\x57\xfc\x20\xd0\x05\x8f\x40\xf5\xe0\x98\x25\xdb\xa8\xd8\xf2\x0c\x00\xf4\x3b\x3a\xee\xbb\x61\x57\xbe\x32\xec\x54\x62\x7d\x5d\x42\xab\x81\x3c\xf9\x7f\x09\x5d\x26\xdb\x80\x36\xc1\x2e\x82\xcb\x96\x3e\x80\x01\x16\x7e\x61\xab\x39\x3b\x4c\xca\x75\x5e\xce\xa8\x69\x95\x4e\x32\x3f\xa5\x26\x2c\x5f\xda\x3e\x0b\xe9\xa5\x1e\x5a\xf5\x1f\xa6\x44\x48\x24\xfb\x83\x7c\xc6\x7b\xe5\x37\xa8\x75\x69\xc3\x0c\xf0\x11\x4d\x39\xa0\x39\x42\xde\x4e\x1c\xd5\x23\x35\x5d\xab\x1a\xf3\x60\x80\xa9\xa9\xa5\x48\xbe\x1c\x2a\x7f\xbe\x54\x33\x77\x23\x15\xd2\x83\xe5\x15\x6d\xf6\x48\xbe\xe4\xb7\xdc\xda\x74\xf1\x59\x05\xd5\x42\xbe\x54\x87\x3c\x15\xc5\x3f\xf4\x2a\xca\xbf\x8c\x56\xf2\x57\xd7\x64\x72\x2d\xb4\xe9\xc7\x18\xe1\x20\x98\xa3\x45\x74\x86\xa6\xc9\x47\xac\x2d\xe0\xaf\x53\xe8\x2c\xf9\x50\xbb\x37\xca\x29\xc8\xda\xdf\xa3\x64\x6d\xb4\x98\x2a\xf5\x72\xd3\x9b\x26\x8c\x7f\x96\xb0\x3e\xf6\xb6\x53\xc8\x79\x45\xf2\x9b\xc5"}, -{{0x55,0x32,0x8b,0xe4,0xb3,0x70,0x82,0x27,0x33,0xff,0x39,0x89,0xa6,0xa3,0x28,0x2d,0x65,0xfe,0x8f,0x20,0x7a,0xb7,0x27,0x0d,0x7c,0x2e,0x72,0x7c,0xa3,0xcf,0xaa,0xc4,},{0x51,0x8e,0x02,0xee,0xf5,0x2f,0x5a,0xae,0xbd,0xe3,0xd1,0x08,0xea,0x79,0xec,0xad,0xfc,0x4d,0x99,0x4c,0xe1,0x95,0x36,0x21,0xe5,0x4b,0x7b,0x3b,0x12,0x1f,0xf8,0xff,},{0xf5,0x8d,0xb1,0x9f,0xd8,0x34,0xe1,0x51,0x94,0xc3,0xc0,0xf8,0xa6,0xa5,0x0e,0xbc,0x4c,0xf0,0x74,0xe8,0x0e,0xa2,0xe7,0x0c,0xda,0xf1,0xe1,0x69,0xbd,0x51,0xeb,0xd0,0x99,0x0b,0xad,0x77,0xc4,0xfa,0x20,0x8b,0x8d,0xd1,0xe2,0xc8,0x57,0x4c,0x01,0xb5,0xf5,0x96,0xc8,0xdf,0xa6,0xbb,0x8e,0x6a,0xe3,0xa4,0x7f,0xf4,0x12,0xe7,0xe2,0x09,},"\x6c\x24\xc9\xaf\xbb\xf1\x2d\xca\xee\x6f\x10\xe4\x08\x92\x52\xf2\xc6\x0b\x2a\xb9\x3a\x02\xc1\x60\x2f\xb5\xde\x4c\xe3\xbd\x92\x3e\xb0\x2f\xe1\x03\x9f\xdc\x15\x99\x6a\x44\x69\x15\xe7\x67\xde\xe0\x17\x6d\xdd\xb7\x8e\x9d\x6b\xbf\x06\x96\x75\x77\x5a\x82\x9d\xd8\x08\xd3\x76\xb0\xcf\x79\x20\xbf\x1a\x66\xe1\x30\x3b\xa5\x24\x19\x78\x5f\x25\xf2\x8b\xb3\x38\x99\xeb\xde\x84\x0c\x0a\xb1\x4b\x91\x9a\x65\x80\xcb\xaa\xc3\xa8\x05\x62\x7b\x9c\x4a\x77\xba\xa1\x6f\x82\x5a\x9e\xac\x2d\x6d\x36\x41\x65\x14\x93\x37\x0e\x50\xee\xe9\x4c\x74\x04\x97\x64\x36\x56\x05\xab\x4d\xac\x1a\x03\x02\x27\xa3\x30\xaa\x17\x8f\x2f\x8d\xa3\x77\xaf\x73\xf0\xbb\x04\x0b\xac\x12\x36\x6e\x65\xe0\x59\x10\x55\xf9\xf2\x3e\xac\xa3\x5e\x96\x88\xd8\x37\xa3\xc0\xd9\x9c\x16\x8f\xd8\x86\xac\xc9\x22\xcf\x37\xa7\x11\x8e\xf8\xa4\x4b\xb0\xa4\xfa\x42\x88\x04\x93\x09\xa7\xdc\x1b\xed\x80\x62\x1e\x10\x63\xe3\xe5\x92\xc0\xfb\xa4\x2d\x73\x98\xeb\x15\xf7\x40\x28\xac\x15\xd7\xed\x65\xa6\x36\x8a\x13\xb7\xf9\x56\xd1\x95\x47\xeb\x50\x6c\xe7\xec\x90\x73\x4e\xb9\x49\xcf\xf1\xd9\x8c\xe4\x14\xf1\x0a\xdc\xba\x8c\x00\x73\x20\x01\x87\x50\xa7\x1b\xd3\x6d\x3b\x6b\xfd\x61\x27\x05\x45\x08\xe3\xef\x65\xd9\x98\x48\x51\x4d\x33\xd6\x8b\x58\xe3\xa4\xb2\x24\xf7\x9b\x6e\x34\xdd\x48\x03\x40\x46\x7f\xe7\xf0\x25\xcc\x88\x21\x3d\x80\x8f\xbb\x5b\x91\xe2\xe4\x3c\xf9\xd9\x50\x64\x07\x98\x65\x92\x73\xd4\x7a\x25\xf1\xf0\x13\x2f\x68\x82\xfa\xad\xba\xfb\xa2\x8f\xee\x5f\xa1\x72\x72\xc1\xa9\x00\x11\x72\xb3\xab\x6f\xf2\xc3\x15\xf2\x6c\x07\x73\x44\x05\xb5\xee\x8b\x5e\x4f\x08\xe1\xe3\xb8\xae\xa0\x19\x46\x7f\xb0\x71\x88\x7f\x19\x19\x01\xa2\x1c\x59\x76\xc1\xca\x8a\xaf\x0a\x1d\x4a\x2e\x69\x8e\x76\x23\xe9\xbb\xe9\xca\x2a\x67\xa1\x53\xa1\x6f\x89\x5e\x6d\xd9\xea\x92\x44\x41\xb4\xbd\x0b\x67\x45\x52\xe3\x98\xb8\xd9\x70\x34\x3a\x9b\xc7\x76\xa3\xa3\xfc\x1a\x86\x60\xc5\x62\x5d\x60\x81\xb5\xd8\x7f\x0f\x8a\xc9\xf0\x7a\xb5\xab\xe7\x7c\xdb\x8e\x30\xd2\xfd\x1f\x6f\x46\x52\x5c\x75\xdd\x0d\xd1\xca\x32\x81\xcc\x89\x34\x6f\xb3\xe6\xd7\x38\x8e\xbe\xe1\x54\xcb\x59\xbd\x9e\x95\xed\x6a\x41\xd5\xdf\x66\x8b\x59\xea\x13\x78\x68\xeb\x12\x0b\x8a\x2c\xfd\xf4\x67\x44\x14\xfd\x27\x96\x99\xf2\x8b\x5a\x5c\xcc\x2e\x2f\xc8\x02\xa4\xc9\xe0\xb8\x5b\x76\xf2\x0f\x6b\xce\x2a\x49\x54\x88\x6f\xc4\x02\x67\x0a\x71\xef\xd2\x61\xf5\xdd\x7b\xca\x16\x88\x4a\x28\x7c\x62\x2f\xd4\x45\xf6\x8d\x44\x15\x1c\xc0\x13\x4b\x22\x9d\xa3\x8d\xaa\xab\x81\xb5\xc9\x60\xd5\x77\x00\xca\x92\xb2\x6d\x0b\x14\x21\x34\xce\x94\xb7\xbe\x6c\x18\x61\x0e\xa2\x13\x6f\x8b\xa8\x32\x9a\x2e\x8c\x00\x0b\x8f\x02\xfe\x05\xbc\xf7\x2c\xb7\x1f\x8c\x72\x53\x5f\xfc\xd8\x18\xe3\x8e\x79\x92\xa8\xf0\xc3\x2a\xc6\x21\x77\xd1\x52\x2a\xe5\x52\xc6\x0c\x1e\xe6\x16\xb7\x5e\x4b\x34\x42\xe7\x96\x57\xe4\xa3\x33\xc0\xb3\xd7\x44\xea\xf2\x60\xd0\xc3\x36\x93\x16\x86\xa6\xd6\x68\xc6\x4f\xef\x44\x00\x52\x35\x2c\x2b\x25\x8c\xfb\x65"}, -{{0x7d,0xa0,0x5f,0x04,0xe5,0xd3,0x8b,0x98,0x9b,0x83,0xf7,0x2f,0x7a,0xb2,0x6c,0x13,0x87,0x76,0x75,0x8f,0x4f,0x57,0x7e,0x49,0xdc,0x73,0xd6,0x01,0x3f,0xf4,0x37,0x59,},{0xb1,0xde,0x51,0x67,0xf4,0xd3,0x30,0x80,0x4e,0xec,0x9e,0xb5,0x65,0xef,0x40,0x55,0xf1,0xb6,0x4d,0xd9,0x5e,0x1c,0x9b,0x27,0xc6,0x7f,0xfe,0xf9,0x14,0x82,0xcc,0xa8,},{0x05,0xf1,0x17,0xf9,0xbc,0x3e,0xa5,0x5d,0x45,0x5e,0x9e,0xf1,0x35,0xe9,0x2e,0x76,0x65,0xd1,0x80,0x70,0xd8,0xf5,0xe3,0x75,0xdf,0x67,0xbe,0x18,0x17,0xce,0x14,0x35,0x7a,0x55,0xe7,0x01,0x66,0xf3,0x26,0xb7,0x7d,0x85,0x24,0x32,0x27,0xcf,0x67,0xd8,0xf2,0xe0,0xbf,0x84,0x40,0xca,0xbf,0xb0,0x52,0x75,0xb3,0x73,0xf1,0xe1,0x19,0x0e,},"\xa6\xa8\x61\xd8\x94\x7c\x5c\xd6\xad\x08\x19\x60\x2e\x32\xea\x76\x81\xc8\xf7\x30\x10\xee\xe5\x53\xe5\xde\xfb\xf7\x98\x20\x98\xb5\xf7\xb3\x99\x24\xbb\x79\x59\xad\x64\xc3\x03\x26\xbe\xd5\x60\xbf\x51\xe9\x98\x3c\xda\x5d\xff\x4f\x31\x1e\xea\x24\xcb\xe6\x8c\x61\x06\xce\xac\x9b\x84\x3a\xa4\xe2\xad\x1b\x6f\x8a\xe1\xe4\xf9\x68\x71\xfc\x02\x5b\xe4\xa6\x16\x38\x5f\xf2\xd4\xb7\xf5\x68\x29\xab\xef\xaf\x6a\xac\xbb\x78\x0d\x6c\xbb\xc9\x51\xb6\xe0\x5a\x78\x7f\x88\x5e\x33\x25\x61\x16\x65\xec\xc9\x24\x27\x4a\xa5\x31\xbc\x13\x3f\x62\xc7\x6c\xb3\xad\x14\x8f\x3c\x95\x79\xa8\x15\xa1\x42\x00\xb7\x64\x8d\xae\x0b\x07\xb3\x27\xd3\xbf\xcc\xdb\x6f\xe3\xb6\xcb\xd7\x0e\xa6\x5e\x6c\x0c\xc2\x51\x6a\x89\x66\x96\xd0\x7b\x2e\x77\x71\x3b\x0b\xee\x3b\x92\xfb\x1b\x6f\x75\xb0\x82\x0a\x5c\xb6\x2c\x5f\xe6\x20\x40\x03\x94\x3e\x24\x85\x71\x66\xfb\xdf\x57\x1f\x11\x5d\x45\xf4\x2e\x75\x90\x1d\xf8\xb1\x2c\x32\x61\x8a\xac\xb0\xd2\x42\x86\xc8\xd3\x03\x96\x05\x1f\xc2\x72\xaa\x17\xf4\xd2\xd4\x74\x61\x15\x2a\xac\xd3\xfa\xa2\xb7\xb2\x08\x31\x22\x78\xe8\x09\x24\x05\x92\xd1\xd1\xaa\x58\x5c\x56\x28\x0e\x66\xff\xd9\x2b\x57\x17\xd0\xcd\x1e\xb9\xfb\x74\x01\xde\xf8\x79\x48\x7c\x37\x4e\x5c\x53\x0b\x6f\xeb\xf9\x11\x12\x25\x74\xd2\x4f\xe1\x04\xb4\xf4\x5c\x7c\x60\x1e\x6c\x91\x7d\x3c\x18\x82\xc1\xad\x3c\x55\x5d\x8f\x2c\xe9\x55\xb5\xa1\x0d\xb0\xd5\xa8\xb8\xac\x7a\x62\x66\xb2\xe6\xb2\x7a\xd0\xee\x34\xf4\x7a\xd8\x57\x36\x7d\x52\xf7\x09\x6d\x4b\xac\xef\x0e\x46\x72\x54\x88\x42\x4b\x93\xb8\x9a\xcd\x42\x9f\xfb\x5e\xf3\x3a\x0b\x08\x1d\xd0\x94\x79\x67\x91\x96\x02\x3c\x39\x67\xf4\x4a\xd4\x1e\xb1\xa2\x39\x55\x27\xfd\x3b\x79\x76\x8f\x1b\x88\x5f\x04\x29\xb4\x95\xab\x60\x52\x56\x91\xbe\x84\x65\x06\x32\xa2\xf6\x6c\xb6\x3a\xd5\xbf\x2f\x6a\xe7\x0b\x66\x8c\x5a\x19\x3f\x74\x99\xfc\x4f\xc4\x2c\xf8\xcb\x30\x8c\xe5\x02\x9a\x50\x27\xba\xbe\xf5\x5d\x19\x25\xec\xfb\xa9\xf2\x7e\xb6\x08\x16\x19\xed\x0d\xf8\x56\x9f\xd8\x0e\x9d\xa1\x04\xdb\x39\xb5\xb8\x14\x0b\xfe\xbe\xbd\x29\x08\x54\x40\x06\x58\x19\xde\xba\x8d\x46\x9a\xe8\xb3\xea\x6d\x3b\xac\x58\x91\xf9\xa4\xdd\xfb\x7f\x1f\x06\xd1\x3c\x31\xa0\x7e\xe5\x3f\xb5\x4b\xc9\x7b\xd0\x86\x96\x39\x4c\x38\xe7\xf3\x68\x0c\x0f\x02\xf9\x75\xf4\x69\x92\x11\x47\xa4\x09\x85\x90\x97\x81\x3b\x4c\x3f\xa4\x3d\x17\x4a\xc4\x02\xf1\xa5\x28\xcb\x5f\xc4\xb8\x07\x51\x84\x32\xef\xf3\x34\x07\xa1\x11\xca\x3a\x3d\x7e\x9e\x84\x13\x5a\xba\xc8\xa8\xf5\x2e\xa6\x31\xc8\x6d\x74\xa1\xc6\xe5\x74\x9e\xdd\x14\x91\xc0\x02\x4e\x7d\xe7\xfe\x52\x85\x68\x29\xb7\x2f\xd1\x3d\xa6\x3a\x1a\x23\x43\x34\x9d\xf6\x62\xab\x31\x63\x53\x60\x32\x34\x6e\x53\x47\xf0\x43\xff\xf5\x28\xbf\x67\x15\x09\x22\xff\xf2\x02\x6b\xab\x74\x2d\xb9\xca\xe7\xcb\x2e\x3c\x74\x58\x07\x19\x65\x2c\x28\x44\x7c\x5e\x20\x98\x23\x17\x97\xee\x6e\xf1\x23\x1f\x57\x92\x05\x4b\xc3\x35\x9a\x32\xc8\x6d\x2f\x94\xf8\x5f\xa7\xd4\xa7\x41\x9d\xd2\x41\xff\x66\x2a"}, -{{0x1b,0x8e,0xc6,0x58,0x80,0xed,0xbf,0x03,0x9a,0x13,0xe9,0x70,0xb1,0x5a,0xa6,0x7e,0x19,0x2a,0xa0,0x2c,0xa6,0x5c,0xff,0x9a,0xda,0x17,0xd4,0x55,0x8f,0x40,0x13,0x7d,},{0x12,0xc1,0x19,0x1e,0x4d,0xe3,0xbd,0x44,0xd0,0x39,0x07,0x01,0x53,0xad,0xb7,0xb5,0x81,0xf6,0x00,0xe9,0xa1,0xdd,0x69,0xaa,0x89,0xf2,0x77,0xc7,0x06,0x9e,0x76,0xf8,},{0xbf,0xf2,0x69,0xa3,0x5d,0x6c,0x8e,0x55,0x2c,0xe7,0x16,0xd1,0x63,0x81,0x81,0xce,0x85,0x83,0xb4,0x5c,0x0e,0xc5,0x93,0xb4,0xe5,0x8c,0x40,0xac,0x76,0xe7,0xf8,0x5c,0xa1,0xda,0xff,0xfd,0x68,0x54,0x1e,0x62,0x3a,0x1e,0x35,0xa7,0xc0,0x97,0x26,0x88,0xb2,0x5e,0xed,0x72,0xf4,0xda,0x57,0xec,0xa1,0x68,0x57,0xa8,0x26,0x3c,0xaa,0x0b,},"\x37\xf1\x8b\x7f\x64\xc5\x13\x34\x79\xd6\xda\xe3\xbe\xf6\x79\xcd\xc2\x1e\xce\x3f\x5b\x57\x9a\x6a\x9c\x3f\xa2\xe5\x9e\x9b\xe8\x7d\x20\x09\xf7\x4e\x1c\xfd\xac\xcb\x1c\xe3\x7d\x00\x70\x23\x69\xbd\x16\x9d\x94\xfd\xcf\x85\xaf\x9f\xa3\x21\x7d\x27\xe6\xed\x6d\x1d\x8e\x5d\xf7\x61\x5e\x8e\x37\xea\x55\xde\x1f\xd0\xb0\x6d\x77\xb4\xc8\x3b\x92\x9d\x80\x58\x6f\xa0\x69\x4b\xe7\x2e\xc8\xb3\x65\xad\x2c\xbc\xdd\x2b\x1a\xd8\xcf\x7f\x03\x6d\xfa\x4d\xaa\x1a\x90\x36\xcd\xb1\x20\x43\x22\x27\xb1\xf0\x7b\x88\x66\xb1\x22\x12\x03\x09\xeb\x91\x4a\xb8\x4c\xdd\xeb\xa1\xde\xc4\x8a\xb9\x26\x36\x72\x85\x88\xfe\xdb\x3a\xaa\xd7\xe7\xdb\xb2\xac\x30\xe6\x3c\x6f\x5f\x90\xfc\x6c\xe6\x2d\x6d\x3b\xd8\x8b\x0d\x5a\xac\xfa\x61\xde\x9f\x32\x67\xb3\x00\x91\x7b\x57\xa4\x80\x36\xab\x20\xc9\xa0\x54\x46\xb8\x76\x74\x94\xaf\x24\x9e\x7d\xe7\xbc\x50\x7a\x22\x07\xcc\x95\x6f\x71\x84\x55\x5a\x7d\x5d\x88\x83\xbb\x4b\x3e\x93\xf2\xdc\xfc\x57\xb0\xda\x86\x38\x65\x8d\xcd\xce\x88\x5d\x44\xd9\xcc\x68\xb1\xd8\x17\x0a\x36\x77\xcc\x5e\x50\xcb\xf3\x3d\x54\x3e\xba\xe4\x47\x7d\x92\x39\xcf\x83\x38\x4e\xc5\x9b\x42\x33\xe8\xff\x33\x43\xf0\x6f\x30\x18\x77\x72\x9a\x53\xd4\x20\xbf\x01\xc6\x2e\x66\xab\x7f\xe5\x5d\xd8\x7e\xe8\x23\xa5\x8f\xcb\x87\x87\x0e\x1f\x52\xe8\x79\x17\x7c\xd4\x39\xc5\x33\xf5\xa2\x23\xe5\xa3\x43\x6f\xe9\xd6\x42\x65\x48\xda\xcf\xc8\x6a\x08\x46\xd3\xed\x23\xac\x04\x25\x63\xe8\x87\xff\x46\xaa\xd0\x05\xf4\xe1\xde\xe3\xee\x0e\xe4\xc2\x7a\x72\x51\x70\x9a\xe4\x0a\xbc\x5e\x25\x68\x64\xe4\x78\x5a\x4e\xdd\x8b\x2a\xdf\x1b\xc5\xb4\x01\x8e\x28\xd0\xb1\x75\x86\x7b\x02\xd0\x52\xa6\xe1\x7e\x41\x1a\x3d\x8b\xeb\x2a\x42\x08\xb7\x6c\xc6\x21\xfd\x18\xbe\x14\x8e\x23\x5d\x55\xaa\x71\x27\x70\x65\x57\xde\xc0\x53\xa1\x3f\x1a\x47\xdf\xda\x40\x5b\x3f\xe5\xbd\x28\xef\x5d\x34\x86\x19\xf5\x1e\x59\x5e\xf5\x05\x5f\x83\x9e\xfa\xf1\x10\xe4\x90\x16\x31\xac\x31\xa0\x2f\x4f\x7e\xe4\x24\xa3\xa2\xc3\xe0\x0d\x26\x02\xd2\xcc\x1e\x49\x29\x06\xee\xa4\x20\xa9\x26\x82\x38\xac\x66\x22\xa0\x89\x74\xe5\x73\x02\x92\xe6\xed\x51\x02\x56\xef\xde\x66\x7e\x0d\x9a\x0f\xf2\x21\x3f\x54\x12\x0c\xcd\x81\xff\xaa\x6b\x7c\xc4\x81\x41\xa2\xb7\x29\x85\x2a\xf5\x83\xd2\x6a\xa5\x1f\xbd\xe6\x7b\xe4\xdf\x14\xe5\x20\xc2\x25\x7a\x73\xc5\xc2\xe3\xc3\xd8\x7d\xfb\x25\x36\x11\x75\xfd\x18\xab\xd7\xe9\x9a\xa0\x9b\x85\xf8\x8f\x19\xc8\xd8\x2d\x45\x85\x8f\x31\x44\xc5\xdf\xb7\xa4\x9e\xde\x45\xb4\xef\xd8\x71\x05\x92\xa3\x72\x06\x36\xe7\xe8\x89\xc7\xe2\x2a\xd1\x3b\x2d\x44\xbb\x7e\x2b\x47\xb2\x96\x3a\x5f\xa3\xf2\x55\x7b\x85\xbc\x0c\x69\x3d\xe3\xd2\x2e\xf9\x46\x4f\x7b\x81\x4a\x20\xa4\x67\x6a\xd2\x6f\xca\xa0\x35\x44\xc6\xaa\xd4\x12\x83\x09\x5f\xcd\x12\x10\xaa\x8c\xc0\x29\xff\x5a\x26\x00\x5a\x89\x12\x26\xc2\x98\xe9\x4a\x52\xaa\x71\x33\x91\x3e\xc9\xd2\x2a\x5b\x2a\xc0\xbc\x6f\x15\xb2\x51\xd0\xb9\x38\x89\x21\x3c\xd1\xb1\xe5\xc6\xfd\x08\xf1\xa8\xf5\xcb\xd4\x21\x53\x29\xa3"}, -{{0xe7,0x53,0x88,0x02,0x6a,0x6a,0x6d,0x6c,0x6d,0x19,0x9e,0x36,0x29,0x93,0xa5,0xb1,0x04,0x49,0x01,0xe1,0x8a,0x76,0xc2,0xfa,0xc7,0x26,0x1a,0x6d,0x1c,0x19,0xa4,0xf3,},{0xb9,0xce,0x14,0x25,0x1c,0x0c,0xdf,0x3b,0xdd,0xb2,0x06,0xdc,0x6b,0x8b,0x2b,0x7f,0x5b,0x7e,0x4d,0xd1,0xbe,0x2c,0xe1,0x86,0x3f,0xf1,0x88,0x06,0xae,0x00,0xf1,0xee,},{0x6d,0x0f,0x83,0xd9,0xc5,0x5d,0x84,0xbc,0xf9,0xa8,0x61,0x47,0xd9,0xb6,0xba,0x9a,0xd5,0x37,0x83,0x2f,0xd0,0xf9,0x9d,0xae,0x7e,0x72,0xc8,0x13,0x9a,0xfc,0xb3,0x0c,0x7b,0x24,0xf6,0xb2,0x92,0xe3,0x2f,0x98,0x47,0x09,0x75,0x51,0xb7,0xfb,0xfd,0x51,0x0c,0x84,0xe8,0x9b,0xe9,0x82,0x54,0x44,0x14,0x57,0xbd,0x08,0xe5,0xf0,0x53,0x02,},"\xb9\x9c\xdc\x84\x72\x11\xc0\x66\x42\xdd\x11\x1b\xc5\xe0\xbe\xca\x53\xa7\x4f\xfb\xa2\xe3\xac\x93\xaf\xb4\xb0\x94\x75\x18\xe8\x32\x35\x27\x33\x0a\x4e\xfe\xfb\xe4\xba\xfa\x00\xba\xfe\xcb\x43\x4a\xb1\xe5\xb7\xce\x65\x65\x6f\x7a\x4f\xd8\x56\xaa\x6c\x38\x5e\xd8\xd7\xbd\x62\x85\x58\x0d\x7d\xd6\x08\x82\xe6\x9c\x19\xda\x07\x69\x09\xd6\x47\xde\x09\x5a\x80\xe9\x8a\xd8\x9b\x81\x4a\xad\xcb\xbf\x6f\x03\x3c\x49\x20\x2f\x65\x6c\x09\x10\x50\x39\x59\xcf\x97\xcd\x0f\xa8\x2d\x5f\x6d\x22\xfb\xa3\x38\x99\x51\x29\x4c\x4f\x7c\xdc\x21\xeb\x82\x44\xbd\x65\x60\x63\x7a\x5e\xca\x62\xa8\xeb\xa1\xf4\xa9\x33\xd1\x87\xa7\x5f\x86\x71\x16\x43\xaf\x35\x88\x31\xc8\xc1\x6a\x9a\x0f\x09\xe2\x53\xb2\x39\x5e\x9c\xb3\x71\x61\x1e\xec\xdd\x66\xb4\xab\x52\x1a\xa9\x4b\x3f\x20\x23\x7e\xae\x41\xcd\x10\xc5\xe2\x1a\x45\x2d\x48\xe7\x48\x18\x7f\x35\x4a\x67\xad\xf6\x81\xb0\xfe\x61\xcd\xae\xc9\x4a\x5e\xaf\x01\x26\x9f\xce\xb5\x70\xd5\x14\xff\x3c\x55\xff\x1d\xba\x2f\xd2\xdf\x17\xf8\x6a\x8a\xeb\x74\x78\x38\x11\x3d\xee\x94\xa4\x3b\x13\x84\xcb\xe1\x33\xcd\xf6\x42\x7e\x8d\x12\x2e\x4e\x93\x37\x04\xda\x6e\x26\xcf\xce\xe9\x7f\xe3\xf6\x29\xb6\x0b\x91\xb2\xdd\x86\x38\x67\xfa\x79\x80\x1e\x2b\x91\x6e\xc4\xc0\xfb\x62\xe0\x71\x59\x42\x1e\x65\x79\x74\x30\x7a\x1d\x02\xf7\xf2\xed\x47\x24\xa8\xb5\x21\xa8\x61\xf5\x5f\x35\x52\x1e\x8b\x2e\x1a\x84\x90\x4c\x42\x8c\xfc\x5b\x60\x14\xbb\x0f\x8b\xa8\x43\x4c\x22\x09\xbd\x40\xac\xa3\x11\x30\xdb\x97\x74\x33\x33\x59\x7d\x23\x51\xd5\xf6\x81\x17\x41\xf6\x26\x88\x97\x3b\xd7\x73\xd3\x02\x66\xfd\x1e\xfb\xd8\x9d\x47\xa9\x64\xf9\xd0\x19\x97\x15\x3d\x08\x7d\x92\x69\x66\x16\xdd\x10\x3a\x93\x4c\xcb\xac\x4c\x1d\x14\x2f\x20\x75\xd4\xe2\x2c\x3d\xa4\xa0\xe9\x73\xb2\x38\x63\x19\x62\x87\xb7\x91\x74\xfa\x29\x75\x5f\xc6\xd9\xb5\xe1\x00\xac\xe0\xa4\x59\x75\xe5\x03\xb2\x54\xd3\xf1\x95\xc2\x61\x71\x09\x10\xfe\xf1\x06\x89\x2c\x08\xbb\x29\x6d\x23\x0c\xde\xa9\xf5\xa1\x1f\x91\xac\xaa\x6e\x7c\x05\xe9\x2c\x28\x1d\x2b\x31\x55\xfe\x44\x80\xb0\xaa\x5e\x0d\xb4\x1d\x10\xe0\x5c\xfd\xef\xa4\x36\x40\x51\xcb\x75\x5d\xc7\x2f\xfa\x97\x8c\x00\xb9\x4a\x5f\x21\x2d\xc6\x91\xf8\x39\xb4\x9d\xe9\x7e\x01\x39\xd6\x5e\x8d\x73\xb2\xb2\x89\xb2\x6a\x12\xc6\xcc\xd8\xed\xc0\x4a\xdb\x45\x2a\xf7\xff\x09\x4a\xa9\x01\xea\xf5\x76\x51\xeb\x1b\x87\xb8\x33\xd0\xa0\x9b\x4a\x4a\x64\x62\xf4\x06\x64\x62\x37\x69\xe9\x50\x79\xf3\xc9\x62\x85\x0c\xc3\xb4\x01\xbb\x00\x58\xb8\x47\x5b\x10\xc8\x62\xf3\x2f\x30\x0a\x2b\x14\x3b\x3d\xea\x26\x9d\xdc\xbe\xa7\xbe\x7d\xd2\x42\x6d\x0d\x42\x04\xeb\x66\xa3\x9f\x13\x18\x82\x2d\xcb\x9c\x56\x13\x98\x63\x7f\x4a\xb8\xde\x19\x67\x68\xac\xe7\x4f\x34\x8c\x01\x2d\xd1\xba\xbe\xc1\x7f\x53\x00\xff\xe0\xd7\xaa\xae\xaf\xef\x7d\xb6\x50\xa8\xf2\xf3\x09\xa9\x79\x3f\x52\xc6\x85\xc7\xe1\xd5\x13\x32\x74\x91\x57\x84\x89\x9c\x48\x1d\x48\x5c\x9b\xd3\x0e\x99\xfc\xdc\x97\xd9\x6e\xf0\x74\x87\xda\x66\x3b\xef\xe6\x82\x99\xdf"}, -{{0x5b,0x32,0x3f,0xc0,0x1a,0x16,0xc4,0x5d,0x10,0x64,0x66,0x7d,0x2e,0xa4,0xa7,0xea,0x59,0xd2,0x03,0x42,0x56,0x2d,0x12,0xfb,0xc5,0x98,0xd5,0xaa,0x73,0x00,0x68,0x8e,},{0xd4,0x14,0x1b,0x45,0x5d,0x30,0x16,0x42,0xba,0xda,0x28,0x14,0xaf,0xcb,0x16,0x20,0xd5,0xeb,0x56,0xd9,0x2b,0x11,0x85,0xfe,0x5d,0xad,0xef,0x55,0x96,0x25,0xfa,0x71,},{0xe2,0xef,0xf6,0x07,0xf0,0x22,0x7a,0x29,0xd5,0x82,0xd6,0x9f,0x34,0x58,0xac,0xad,0xd3,0x22,0x6f,0xce,0xaa,0xc0,0xab,0xbd,0xae,0xd5,0x26,0x75,0xc5,0x16,0x30,0x07,0x3c,0xd3,0xa9,0x01,0x70,0x7e,0xcf,0x05,0xe8,0x93,0xf2,0xc3,0x6d,0xaa,0xf0,0xcc,0x49,0x01,0x11,0x69,0x46,0xb5,0x77,0x0d,0xc0,0x38,0x12,0x5f,0x6d,0x13,0x1b,0x09,},"\xad\x24\x66\x9e\xf5\x5c\x54\x0a\x8e\xd1\x62\xce\x1d\x28\xf0\x17\x60\xa6\x07\x19\xa0\x37\x73\x36\xeb\x00\xb1\xec\xbe\x6f\x61\x60\x1c\xd5\x64\xf9\x2c\x95\x68\x04\xf9\xbe\xd4\xe1\x47\x6b\x94\xe5\xea\x8c\xca\x80\xcb\x49\xa3\x04\xef\x85\x1f\x7f\x67\x5a\xbe\x58\xe6\x68\x1d\xc0\x12\xad\x55\xe5\x1b\x02\x1d\x98\x28\x56\x9d\x0b\xcc\x9e\x05\x27\xa3\xfc\x03\xc8\x91\xd1\x7a\x90\xe6\x33\x7a\x1e\xa6\x7f\x2f\x08\x81\x05\x87\x69\x38\x37\x08\x1e\x4c\x08\xa3\xd7\x2c\x53\x6c\x21\x40\xda\x20\x0b\xa4\x56\xc3\x76\xf6\x1d\x05\x65\x1f\x0c\x5f\x39\x57\x11\xf4\x1c\x0d\x6e\xae\x98\xc9\x06\x76\x4d\x1e\xbe\xf3\xf9\x04\x6c\xb7\xc8\x62\x26\x40\xfc\xaf\xaf\xbf\xb8\xf6\x2e\x1c\xd3\x2c\x66\xee\x1c\x55\x50\x94\x89\xa5\x38\xab\x61\x29\x99\xe7\x99\x7b\x77\x9c\x64\x22\xef\xf1\x09\xda\x4d\xf8\x29\x20\x93\x0d\x8d\x36\x3d\x78\x30\x90\x87\x95\xa3\x88\x8f\x25\xd6\x67\xe1\x4d\x15\x5e\xd4\x45\x81\xbe\x43\x0f\x79\x73\xb5\x74\xe2\xbc\x0b\x13\x4c\xf1\x39\xfb\x4b\xb0\x1d\xbd\xa4\x1b\x67\xb9\x81\x47\xd8\x01\x2f\x40\x67\x7f\x4b\x80\xce\x4a\x53\x4c\x90\xad\xea\xbf\x48\x4b\x21\xfa\x99\x4b\x7a\x17\x5f\x8a\x8b\x8a\x40\x75\x56\x44\x78\xdd\xb0\x50\x24\x58\x0b\xab\x03\x8c\xd9\xea\xa1\xdf\xda\x55\x2f\xb3\x12\x29\x42\x9b\x61\x4f\xa1\xd8\x0c\x52\x61\x4e\x84\xfa\xa2\x21\x7f\x26\x0f\xf7\xcc\xea\x8c\x7b\x06\xe3\xd7\x7f\xf8\x74\xeb\x81\xfc\x85\x97\xe5\xfc\xdc\xec\x95\x1b\x5f\xe6\x4a\x1a\xf8\x6e\x73\x19\x3a\x88\x24\x69\xeb\x3b\xa3\xc3\x82\x73\x4b\x28\x87\xb4\x19\x31\x6e\xa4\x48\xaf\xc2\x82\x47\x8c\x25\xf7\xbc\xa1\x84\x29\xcb\xbf\xfd\x88\x71\x17\x7c\x5e\xcc\x7d\x8a\xa9\xa1\xb9\xec\x87\x19\x2d\x29\xa5\x25\x39\xc0\x81\xc3\x59\x33\x32\x44\x4c\xbe\x66\x87\x2c\xf3\xd0\xe1\x97\x29\x2b\x82\xb0\xbe\x5f\xcd\x85\x8c\xd6\xca\x48\xb5\x3e\xe5\xb6\x16\x41\xbc\xaa\xf3\x1d\x81\x9c\x7e\x1c\xed\xaf\x9e\xe6\xb0\x7e\x09\xca\xed\xfb\x30\xb9\x20\x4a\x1d\x4d\xdb\x70\x56\x0c\xbe\x1e\xb0\xc0\xec\x43\xf1\xd1\x78\x20\x1b\x29\x08\x19\xfc\xdc\x92\xc6\x3e\x0d\xb6\x0f\xb8\x7d\xff\x00\xe5\x12\x64\x8c\x89\x58\xa8\x47\xef\xc3\x63\x46\x07\x3f\x1a\x4f\x1f\x23\x17\x06\x0f\x1c\x54\x3e\x6f\x01\xb4\x24\x85\xbe\xeb\x56\xca\xb3\xba\xb2\x6e\x6a\x0c\xa6\x93\x58\x02\xc7\x62\xb7\x99\x15\x9e\x32\x0f\x36\xb5\xe8\x3d\x4a\xca\x89\x62\xaa\x2c\x3c\x2b\x7a\x38\x70\xe9\xe0\x47\x31\xf3\x94\x8c\xf9\x41\xe2\x1d\x50\x96\x4e\x5d\x63\x5a\x35\xa5\x3e\x29\x98\x11\xb8\xca\xdf\xcb\x44\x16\xc5\x75\x98\xa3\xfd\x05\x41\x09\x10\xdb\xc0\xea\x2c\x78\xfd\xb9\x25\x74\x99\x7d\x58\x79\x62\x79\xea\xaa\x78\xb3\x6d\xce\xf1\xc9\xa1\x29\xee\xff\x82\x39\x9a\x26\xd0\x08\xff\xa3\xbf\x04\x18\xff\x7d\x39\xb6\x42\x7f\x34\x18\x95\x02\x4d\x16\xe2\x2a\x0c\x62\xa8\x2b\xeb\xa2\xe2\xba\xc2\x3d\xee\x18\xcf\xcd\x5d\xb2\x39\x7f\x37\x8c\x53\x67\x30\x90\x82\xc4\x4e\xb4\x3c\xed\xc1\x52\x20\x25\x3a\x62\x32\x03\x99\x66\x5f\x71\x34\x9c\xc1\xb9\x44\xf5\x8c\x73\xa1\x0a\x0b\xbf\xd4\xca\xf1\x28\x91\xe3"}, -{{0xbe,0x1c,0x11,0x2f,0x78,0xcf,0x13,0xae,0xfc,0x5c,0xe7,0xe3,0x37,0x64,0xac,0xa4,0x48,0x1f,0x9f,0x88,0xb0,0x18,0xe1,0x22,0xdb,0x9f,0x8d,0xac,0x14,0x62,0x46,0x05,},{0xae,0x38,0x99,0x36,0xbb,0xf6,0xd1,0x6e,0x3c,0x1e,0xeb,0x64,0x74,0x29,0x89,0x70,0x86,0x6e,0x12,0xec,0x9c,0x1d,0x6a,0xea,0x2f,0xd9,0xdb,0x6b,0x56,0xaa,0x59,0xc4,},{0xf5,0xfc,0x5a,0xcb,0x17,0xe9,0x95,0x7e,0xa3,0x04,0xf1,0x23,0xb6,0x50,0xe1,0x44,0xc9,0xe4,0x37,0x72,0x83,0x50,0x9d,0x43,0x1d,0xa6,0xa2,0xbb,0xd5,0x27,0xbe,0xb3,0x82,0xc9,0xf5,0x87,0x45,0xa3,0xe5,0x6d,0xcc,0x65,0x5b,0xd2,0xeb,0xb7,0xae,0xef,0xc9,0x3e,0xdc,0x3f,0x20,0xd8,0xd3,0xc3,0x79,0x23,0x03,0x1e,0xec,0x0c,0xb4,0x07,},"\xd7\x7f\x9a\xee\xa0\xfe\x98\xed\x7f\xb7\x4d\x58\x2a\x40\x2b\xcb\x79\x31\x47\x4b\x4a\x95\xd5\x23\xf3\xfb\x76\x9f\xb7\x09\x7d\x2b\xe4\xc6\xec\x10\x52\x14\x01\x63\x22\x25\x53\xaa\x8f\x4f\x89\xe4\x21\x73\x00\x14\xec\x73\x46\x97\x20\xce\xa9\x67\xf8\x8b\x6a\x48\xd0\x2a\x2d\xdc\x1a\x12\x1f\xdf\xfb\x8a\xe1\x27\x73\x8e\x29\x3c\x4d\x6b\x1b\x74\xad\x03\x84\x4d\xe6\xbf\xe8\x21\x50\x6b\x3a\x7a\x81\xd1\x9c\x37\xa7\xf0\x1c\xa4\x81\x47\x12\x19\xef\xe2\xa7\xb9\x2c\x4b\xd2\xac\x07\x74\x3b\x49\x75\x69\x64\x41\x71\x4b\x84\xd6\x3c\x54\x9d\x7a\x6f\xb6\x1f\x16\xfb\xcd\xb7\x2b\x91\x4d\x78\x82\xd0\x91\xf9\x70\x6d\xa3\x8c\x1a\x81\xa1\xc6\xa4\x0f\xbe\xc0\xd8\xe2\x38\xb5\xd5\x6d\x46\x0e\x90\x9f\x85\x47\x9f\x7a\xd8\xb1\x19\xf3\x54\x55\xe3\x40\x10\xca\xa7\xe5\xd0\x1f\x38\xe3\x01\xad\x37\xe8\x00\x5f\x6e\xd2\x9e\x4a\x10\x2d\xb3\xf6\x1d\x84\x09\x3f\x78\xc4\x9a\x96\x48\xc9\x77\xbf\x4d\x5b\x68\x9f\x71\xf4\x06\xf8\xad\x7b\x9a\xeb\x1a\xe2\x21\x33\xa8\x4c\xe1\xb2\x78\xb2\xcd\xde\x46\x59\x01\xb2\x3a\x17\x9d\x07\x2a\x80\x87\x9d\x0a\x24\xd2\xaf\x19\x7b\x32\x2a\x07\xbf\x5d\x40\xee\xab\x3a\xf1\x21\x17\xf1\x30\x21\xdf\xc1\x68\x1a\xba\x5c\x08\x3f\x25\x96\xe3\x7f\x11\x23\x42\x2b\xbd\xca\x3b\x2c\x32\xcb\x59\x4f\x56\xc3\x25\xe0\xc5\x64\xa1\x73\x32\x88\x05\x34\x59\xc6\x24\x88\x92\x5c\xd8\x0e\x7c\x94\x4d\xb9\x98\xc3\xc7\xbe\x54\x6b\xf8\x9d\x7a\x51\x1c\xcd\xba\x4b\x80\x9e\xee\x0f\xc2\x87\x3d\xad\x72\xb4\xcf\x3b\xa0\x51\x28\x9b\xb3\xf4\xe9\x92\x57\x32\xe4\x5a\xe7\x74\x10\x58\xc8\xfd\x11\x59\x9d\xd8\x43\x92\x7e\x3d\x14\x59\x8b\xb8\x30\x52\xd3\x35\x69\xcf\xb0\x2a\xf0\xc8\x8f\xa7\xae\xa4\xbb\x46\x84\x1c\xd2\xdd\xbd\xf5\x98\x8f\xcf\x32\x5f\xf1\x04\xa5\xdf\xc4\xa3\x0d\x26\x9d\x2a\x94\x97\x30\xc3\x61\x3b\xdd\xd3\x67\x3b\x42\xf6\x09\x0e\x6a\x60\xe4\xa2\x53\x06\x24\x63\xa6\x5d\x7e\x7f\xc0\x03\x0b\xba\x76\x9c\xa3\x44\xbf\xa9\xac\x82\x3f\x58\xcb\x5c\xee\x8a\x5f\xc0\xca\x37\x22\x8d\xe5\xa4\xd9\x3e\x0e\xcf\x7f\x10\x82\x16\x59\xa2\x26\x1f\x7e\xf1\x59\x6e\xda\x4e\x41\x1c\xf3\xc9\x66\x9d\x81\xde\x74\x54\x7c\xe4\xbf\x83\x3e\xb4\x32\xf3\x85\xce\x90\x38\xfe\x84\x8a\x8c\x96\xda\x7f\x01\xfd\x95\xbe\xa0\x6d\x1d\x74\x7c\x8a\xe7\x36\x49\x5b\xba\x22\x85\xbe\x5c\x32\xaf\xea\x44\x95\x20\xcf\xe8\xe1\xce\x25\xf9\x07\x7e\xd0\xec\x0f\x65\x98\xa9\xb8\xf7\x38\x6f\x15\x35\x81\x70\xcc\xef\xc3\xd5\xff\xb0\x09\x28\x81\x54\xde\x87\x7c\x24\x09\xae\x5f\xd8\xfe\xf0\x09\x3f\x1c\x36\xb3\xa8\xf5\x47\x43\x2c\xd0\xf6\x2c\x40\x33\x24\x2a\xd9\x92\x1a\x8f\x11\xc0\x0f\x36\x6d\xa9\x39\x69\x30\xa8\x0c\x99\x7d\xf4\x29\xa4\xf5\xf4\xe4\x5c\x7a\x6d\x7e\x02\xaf\x03\x31\x86\x75\x7c\x73\xcb\xe6\x4d\x2d\x4e\x78\xea\xaf\xe2\x75\x39\x52\x80\x35\xf2\xcf\xcf\x8e\xaf\x0a\x42\xbd\x25\xf8\x8b\x2f\xc6\x9e\x42\x66\x8f\xae\x66\x77\xc9\xac\x90\x91\xd9\xd1\x5a\x41\xf3\xac\xe6\x5d\x90\xa0\x22\x98\x73\xdc\xf2\x54\x25\x6c\xca\x44\x9e\xd4\xc1\x7d\x54\x35\xba\xe4"}, -{{0xbd,0x85,0x23,0xed,0xa8,0x99,0xb9,0x84,0x23,0x0e,0x32,0x88,0x75,0xb9,0x67,0x2e,0xdc,0x9f,0xcd,0x24,0xea,0x5c,0xc1,0x2d,0x7b,0x57,0x2d,0xa4,0xbe,0x01,0xfb,0x7b,},{0x02,0xb7,0x34,0xeb,0xbe,0x88,0xc1,0x3b,0xfa,0x95,0xa5,0xd9,0x64,0xfc,0x7e,0xf9,0xd3,0x95,0xbd,0x63,0x03,0xf0,0x65,0xdc,0x4e,0xe1,0x7b,0x3a,0xc1,0x54,0x8b,0x7b,},{0xfc,0xfc,0xdb,0x08,0x8d,0xcb,0xd0,0xa5,0x1b,0xd3,0x01,0xe3,0xe1,0x56,0x16,0x71,0x93,0x5d,0x8b,0x6f,0x71,0x9c,0x5d,0x92,0x69,0x06,0x40,0xd3,0xc9,0x1e,0x77,0x5b,0xf4,0x05,0x41,0x32,0xef,0xc0,0x5a,0x21,0x22,0xfc,0x20,0x9d,0xb3,0xc3,0x34,0x32,0x33,0xff,0x8a,0xec,0xeb,0xd5,0x2d,0xaa,0x2b,0x3b,0x21,0xee,0xb1,0x5f,0xd1,0x02,},"\x16\xc2\x16\xc9\xbe\x9f\x0d\x4b\x11\x54\x10\xbd\xfd\x15\x93\xc8\xe2\x62\x22\x1a\xb9\x7a\x2a\x39\x5a\x12\x19\x8f\x95\xc3\x02\x05\xb0\x89\x62\xd4\x89\x31\x18\xba\x9f\xf9\x9a\xb1\xc7\xa6\xe1\xf2\xf1\x75\x19\x10\x70\xac\x94\x53\x27\xad\x6c\x47\x0b\xab\xf7\x92\x8b\x07\xdd\x78\x8c\x85\xb6\x4b\x71\x2e\x0a\xae\x6c\x0e\xa2\x02\x81\xe4\x2f\xd5\x61\xe8\x3e\x3f\xba\xc6\x7f\x14\x00\x0e\xe5\x6d\x98\x1d\x2a\x2f\x0b\x9c\xa0\x0a\x9e\xa4\x7c\xa2\xf6\xfc\x8d\xca\x10\x35\xfc\xeb\x14\x2c\x3f\x26\xf2\x0e\x3c\x73\x22\x07\xff\xff\x11\xb7\x96\x95\xbd\xaf\xa4\x15\x21\x4a\x44\x99\x30\x23\x26\x60\x5c\xf0\xb8\xc8\x2f\x2b\x11\x39\x2e\xcc\x90\xcd\x74\xa7\xb4\x11\xb6\xd9\x07\xa3\xd5\xc1\x30\xc8\x79\xb7\xcf\x88\x0f\x22\xbb\xd7\xf0\xe9\x59\x33\x71\x8e\x96\xd7\xd1\x6c\xae\xa9\xf2\xc3\x9e\x89\xb1\x3c\xd5\x22\x66\x27\x36\x04\xa9\x6b\x51\xd6\xe3\x4f\x70\x67\x35\xdd\xd9\xfc\xa4\x4d\x09\xcd\x86\xbb\x72\x17\x60\x0e\x0d\x34\xd4\x16\xac\x24\x9f\x2e\x41\xbd\x0f\x4a\xbc\xbd\x25\x80\xad\xae\x21\xd7\xeb\xa5\xfa\x44\xf3\x9d\x78\x0f\x17\xeb\x85\xcc\xbe\xf5\x8f\xef\x90\x3a\x28\x0d\x95\xf8\xf3\x21\x07\x89\xfa\x12\xe1\x20\xe2\x1b\x6e\x8c\xad\x91\x78\x35\xbb\xdc\xc3\xb0\x7e\x84\x69\x39\x54\xe2\x3a\x94\xf9\x9f\x93\x7d\xdb\x0d\x4a\x18\xd4\x2c\x3e\xa8\xfc\xa7\xd1\xea\x6e\xd5\x3a\x00\x24\x6f\x99\xea\x52\x0e\x64\x05\xbd\x2a\xa5\x49\xb0\x6e\x7d\xa7\x22\xc1\xba\x74\xaa\x1c\x13\x6e\x8e\xa5\x8b\xaa\xf8\xd3\x76\x58\x69\x3f\x3e\x0b\x44\xf6\x31\xdd\x6d\x08\xff\xdf\x4f\x09\x18\x9d\x30\x35\xa3\xf0\x34\x68\xe2\x96\x96\xef\x05\xe0\x2c\xc1\xaa\xbf\xec\xbd\xa2\x30\x1b\x54\x0c\xb0\xeb\x0a\x75\xbc\xce\x73\xdb\x92\x73\xa9\x16\x1a\x98\xad\x89\x8f\xcd\x65\x79\xfb\x7e\x4b\x32\x79\x54\x4f\x2e\x0b\xd7\x74\xdd\x1a\x81\x57\xda\xa8\x8a\x70\x32\x11\x67\x70\x3c\x60\xa6\x08\xa4\xb5\x42\x16\x59\x03\x75\xe5\x97\xfe\x21\xae\xa9\x7b\x52\x18\x5d\x0e\x37\xa5\x3b\x63\x88\xa7\x07\xa2\xbc\x24\xac\xf9\x44\x25\xf8\x4f\x3d\x56\xbc\x9f\x7e\xe7\x41\x2a\x9e\x18\x33\xad\x55\xb7\xea\xe6\xda\x58\x16\x98\x16\x63\x83\xa2\xeb\xa8\xb6\xf5\x39\x20\xf5\x17\xa5\xc8\x0b\xd3\xe0\x3f\xaa\xd4\x08\x7e\x3e\xe8\xfe\xc9\xa7\x9a\x01\xc7\x79\x51\x21\x33\xd7\xb6\xe5\xf1\xde\xc7\x66\x30\x0d\xc4\x05\xcc\x21\xa8\xc5\x83\xfb\x73\xbc\x90\xcf\x24\x38\x5b\x08\x60\x49\xd3\xbf\x20\xc3\x00\x98\x3c\x0b\x35\x15\x38\xdc\xcb\x22\x7a\x14\xfa\xfd\x23\xac\x4b\x26\xbe\x81\xa2\xb1\x20\xcf\x21\x6f\xc5\x83\x54\xf9\xdc\xbf\x05\xf6\x63\x39\xad\x6d\xdc\x2c\xac\x14\x67\x7b\x90\xe2\x47\xeb\xb6\xc5\xc2\x29\x00\x7d\xc6\x0f\x37\x4a\x06\xd4\x04\xeb\x23\xeb\x1e\xc4\x99\x07\xc6\xe8\x81\x62\x9e\x18\x67\x26\x8c\xa6\xff\xfa\x59\xaa\x3c\xa8\xf6\xc2\x95\x16\x2b\x95\x36\xc2\xbe\x22\xbb\xe3\xb7\x23\x80\xef\x11\xb6\x1b\x35\x7a\x62\x53\x10\x0e\x30\xa5\x86\x81\x8b\xa0\x03\xfa\x3f\xfd\x1f\xc9\x19\x88\x1c\x05\x02\x2f\x94\x84\x85\x98\xf2\x17\xfe\xa2\x22\x50\x72\x20\xd1\x08\xa2\x8f\xc7\xbc\x39\xa8\xa1\x1c"}, -{{0x33,0xa8,0x5a,0xe1,0x50,0xbb,0xf5,0x52,0xf4,0x16,0x63,0xb2,0x15,0x21,0xc2,0x96,0xd2,0x46,0xdd,0x6c,0xf8,0x19,0x5d,0xf8,0x51,0xc6,0x95,0xbd,0x15,0xf4,0xa5,0x02,},{0xc8,0xc9,0xc4,0x25,0x21,0x00,0x8d,0x5e,0xff,0xf5,0x76,0xc7,0xe4,0xa5,0x60,0x83,0xce,0xd9,0xa9,0x28,0xda,0x6f,0xd5,0xcf,0x93,0xfd,0xa5,0x72,0xa5,0xa2,0xd0,0xc0,},{0xbb,0xe4,0xcd,0x63,0x67,0x6e,0x26,0xd6,0x75,0xa1,0x91,0x15,0x1d,0x30,0xdb,0x72,0xb5,0xb8,0x4d,0x46,0x1e,0xec,0x65,0x64,0xaf,0x86,0x7a,0xb4,0x1b,0xae,0x99,0x31,0x14,0x78,0x85,0x51,0x9e,0xc9,0xd7,0xe6,0xc8,0x18,0x74,0x3c,0x8e,0xf6,0xd5,0x16,0x7b,0x35,0xb4,0x21,0x36,0x3c,0x09,0xb3,0x57,0x36,0x7f,0xe8,0xde,0x44,0x3a,0x06,},"\x93\x7e\x05\xf2\xf1\xfd\xbd\x41\x73\x15\x53\xe7\x7c\xf1\x81\xb5\x07\x97\x58\x94\x0a\xee\x8e\x92\x62\x3f\xb1\xd5\xf0\x71\x28\xb7\xd7\xf1\x7e\x48\x42\x70\x7a\x56\x2c\x45\xba\x69\x26\x4c\x0f\x73\x0a\x82\x1c\x7d\xb6\xbf\x82\x99\x0d\xc6\x51\x26\x9b\x29\x6c\x33\x51\x79\x11\x30\x53\xd6\xf8\x5b\xb0\x96\xb2\x91\x11\x65\xfa\x39\x00\xcb\x10\x24\x16\x48\x7b\xa8\x07\x86\x79\xc6\xb3\x36\xdf\xf3\x87\x63\xc0\x8d\xcd\x20\xfa\x66\xdd\xa4\x5c\x57\x5d\xf1\x50\xd8\x51\x16\x5a\x48\x04\x97\x38\x30\xf4\x36\xdf\x60\xb8\x13\x19\xf9\xcf\xb5\x64\xc0\x65\x28\x96\xed\x5f\x18\x49\xcb\x33\x54\xf5\x0f\x00\x12\xf2\x86\xe8\xa3\x0c\x21\x35\x28\x69\x34\x74\x00\x4e\x85\x04\x01\x2b\x94\x55\x60\xc0\x74\xa6\xa1\x63\x43\x2c\xf4\xac\x4b\xa7\x17\x5c\xf2\x60\x05\xdb\x71\x99\xee\x96\xd8\x93\xcd\x1a\xad\x3f\xdf\x5d\x57\x46\x0e\xf0\x2d\xda\x6d\x3a\x14\x08\x25\x19\x6f\x3f\x8e\x2f\x37\xda\x36\xb6\xfd\xad\x18\x4f\x27\x40\xf1\x16\xde\x75\x8a\x92\x91\x70\x30\xc5\xfb\x80\xf0\x26\x24\x96\xd2\xdf\x93\xc7\xe2\x76\xf2\x5d\xa7\xdb\xed\x8e\xb8\xdd\x4c\x56\x3a\xba\x55\xb8\x2a\xf6\xba\x3a\x70\xca\x5f\x85\x8b\x44\xa0\x33\xcf\xb7\x95\x60\x4d\xde\xe7\x46\xe7\xc8\xae\x79\xd2\x72\xfb\x9a\x23\x41\xa2\xa2\x02\xdf\x5e\xac\x08\xde\x75\xad\x80\xc6\x58\x0d\x92\xb1\x69\xf2\xe1\x31\x88\x57\xb1\xb1\x42\x1c\x30\xf3\xdd\x46\x10\x93\xde\x2d\x34\x5e\xde\x74\x04\xb7\x2a\x45\x0d\xe0\x7b\x16\xee\xe6\x8c\xe6\x28\x87\xb6\xea\xa4\x36\xee\xe6\x84\xbe\x75\xce\x0e\x1f\x96\x26\x3e\x8d\x87\x36\xf9\xba\x00\x0d\x88\xe9\xe5\x86\x0f\x32\x8a\xe1\xe2\xdc\x73\x09\x9d\x32\xfc\xeb\x1b\xd2\xc0\x12\x36\x98\xa4\x9b\xea\xd1\x90\xa0\x0e\xc9\xa6\xf8\x71\x33\xed\xdd\x45\x31\x6f\x65\xeb\x0d\x32\x9b\x07\xb9\xa6\x6b\xb9\xfe\x42\x58\x8b\xf7\xb8\xd0\x6e\xfe\xc1\x98\x6b\x82\xa0\x81\xed\x3f\x68\x02\xe9\xbe\x73\x46\x47\x84\x55\x9a\x4f\x2c\x09\x7b\xa1\x4b\x0b\xfd\x5d\x7e\x0a\xff\x65\xcb\x69\xab\xd0\x3f\x86\x16\xcd\x7e\xdf\x7e\xc3\x68\x21\x9e\xdc\xf8\x93\xe9\xee\x71\xda\xd9\xf1\x8d\x79\xe5\x68\x26\x5d\xdc\x67\x16\x22\x32\x13\x23\x5b\xb9\x28\xe9\x08\xde\xa8\x27\x78\x4c\xd1\xaf\x39\x6d\x59\x0c\x81\xf4\xea\xcd\xfc\xf8\x9c\x5c\xac\x96\xfa\x05\x00\x64\xa2\x28\x41\xea\x71\x5f\x8c\x89\xd6\xd5\xaf\xbf\x59\x7a\x4d\x00\x5d\xbc\x6b\x13\x85\x6d\x33\x5b\x42\xa9\xa8\x2e\xdc\xb9\x49\x83\x5c\xca\x20\xb0\xa2\x3d\xe5\x1c\xc3\xae\xc3\x55\x66\xef\xf0\xc5\xae\x1a\xb3\x75\x13\x20\xd2\xc3\x10\x49\x52\x38\xed\xa3\x83\xc3\x8a\x41\x63\x15\x2b\x88\x15\x69\x0b\x8f\xf0\x15\x03\x5d\x1d\x00\xea\x4a\x0d\x6c\xaf\x32\x4b\xb7\x1a\x66\x4a\x1b\xed\x31\x48\x07\x84\xa6\x8f\x43\x8c\xaa\x35\x9e\x8d\x26\x73\xc8\x57\xd4\xb8\xc0\xb6\xc6\x95\x84\x7b\x86\x80\x0e\xa3\xd7\x34\xb5\xec\xc4\xd5\x2b\x50\x7a\xc6\x9b\x3a\x67\x78\x91\x60\x16\xeb\xc2\x31\x5f\x44\xc9\x0b\xf0\xc3\xe7\xda\xe0\x1d\x49\xcb\xc3\x03\x40\x2b\xbc\x63\x4a\xe1\x19\x1f\x3f\x6f\xd6\x3d\x30\x3b\x0c\x0b\xe0\x33\xa4\x7b\x90\xf8\xd3\xa7\x7f\x0a\x44"}, -{{0xba,0x9e,0x68,0x62,0x04,0x97,0x5c,0x3b,0xde,0xd4,0xc1,0xe9,0xf7,0x4c,0x7e,0x4c,0x7a,0x7e,0x3c,0x99,0x81,0xd0,0x1b,0xfc,0xa0,0xad,0x01,0x15,0xc3,0xf0,0xf5,0xc3,},{0x49,0x90,0xfc,0xe6,0x95,0x2e,0x8b,0x7d,0x0a,0xfc,0xf4,0xbf,0x9d,0xba,0x9b,0xce,0x1b,0xc4,0x81,0x5e,0x37,0x51,0x1d,0xa7,0xc2,0xad,0x48,0x92,0x58,0x1d,0xe0,0x3a,},{0xc7,0xd2,0x3a,0x58,0xe2,0xfb,0x2a,0x8d,0x4b,0x8e,0xd1,0xe9,0xea,0xe9,0x1e,0x11,0x29,0xc2,0xaf,0x8b,0xd0,0x5f,0x0b,0xd5,0x72,0xab,0xeb,0xbe,0x0f,0x30,0x82,0x59,0x25,0xf0,0xdf,0x71,0xcf,0xb7,0x21,0x8c,0x68,0x6e,0x55,0x48,0xd9,0x42,0x77,0x10,0xa6,0x90,0x36,0x6b,0xa8,0x55,0x41,0xc7,0x91,0x01,0xa5,0x8a,0x10,0xe8,0xaf,0x0a,},"\x46\xbb\x48\x95\x2a\xe5\x8f\x2b\xf5\x8f\x5b\xe8\xdf\x4f\x31\x6b\x50\xf3\x63\xec\x84\xee\xd8\xf8\x2f\xf4\xc0\x4b\x06\x92\xd0\x3a\xef\x26\xe8\xe1\xe6\xc9\x54\x9a\x22\x47\xd5\x40\xa6\xe2\x2f\xeb\x11\xe5\x7f\x4b\x80\x8a\x20\x97\xe8\xa7\xb6\xb3\xb7\xaf\x37\x69\xe6\xd8\x1d\x64\x88\x6e\x69\x62\x37\x2f\x4f\x39\xe4\x9c\xd4\x6c\x1b\x5f\x73\x5f\x38\x0f\x7c\x27\x7d\x09\x97\x76\xed\x1a\xea\xa5\x7a\x35\x9c\x0a\xa8\xc7\x2f\x40\xeb\x91\xa1\xbf\x07\xea\x15\x7f\x5d\xdb\x30\x40\x9d\x6e\x3a\xf9\x89\x90\xce\x7f\x30\xaf\xfd\xac\x5e\x22\x01\x06\x46\xdc\xa9\x6a\x54\x00\x60\xfc\x90\x8a\x31\x25\xb0\x00\xad\x1e\xd3\xa0\xf2\x55\xcd\x34\xf1\x5d\x7d\xd1\xfd\x68\x1c\x3c\x35\xa1\xcd\x65\x20\x56\xec\xc5\x26\x4d\x39\xaa\xf7\x2a\x9b\xb8\x3a\x55\x1c\xc9\x34\x88\x7a\xe1\x07\xaf\xdf\xef\x06\x32\x17\x27\x0d\x95\x96\x89\x14\x18\xbd\x46\x1b\xba\x63\xde\x65\xbe\x06\x7b\x1b\x78\x64\xfe\x46\x48\x4c\x7c\x9e\x96\x34\x9a\x7c\x03\xa8\x0f\xa0\x55\x05\x0a\xa1\x8a\xce\x2a\x44\xb4\xa0\x3c\x94\x78\x24\x17\x2b\x30\xe2\x10\x11\x15\x94\x43\xca\x3c\xef\xaf\x69\x6a\x7a\xa8\xf9\x80\x11\x26\x0c\x94\x36\xbf\x48\x99\x1f\x41\xd4\xd5\x07\xb9\x6c\xe7\x32\x3e\x53\x1a\xdc\xf6\x63\x47\xc5\x5c\x88\x55\x67\x3a\x9f\x2e\xc8\x9b\x5c\x80\x24\x46\x06\x17\xec\x72\x71\x77\x3b\x36\xd6\x4f\xc1\x4e\xb5\xd8\x26\x52\xc5\x3a\x30\x31\x45\x72\x27\x09\x3d\x11\x8f\xd8\xeb\x93\x84\xe8\x02\x29\x04\x1a\x96\xa6\x49\x34\x50\xf9\x7e\x67\x36\x26\x3a\xbf\x1e\xcd\x9e\x9f\xb9\xa4\xf0\xf6\xd6\x67\xfa\x82\x41\x51\x48\x5e\xdc\x37\xb3\x4a\xcf\x3d\x8c\x35\xf9\xc1\xbe\x48\xb5\xe9\x6a\x12\xaf\x8e\x2d\x35\xc2\x3a\x03\x58\x0f\x21\x1d\xa6\x31\x6b\x34\xc5\x6b\xee\x87\x2d\x47\x64\x1b\xca\x77\xda\x64\x0f\xdb\xba\xd5\xa9\xad\x8a\xb9\xdc\x79\x57\x91\x3d\xa7\x34\xad\x37\x49\x2b\xa4\xde\x8c\xf1\x36\xcc\xcd\xeb\x6b\xa3\xf1\xbd\x3f\x00\x3b\xe7\x26\x3c\x4f\x2a\x40\xc3\x3f\x24\xca\x33\x39\x59\x6e\x6c\x34\x28\x33\x81\x00\xeb\xcc\x07\x22\xd4\xf5\x0d\x30\xb3\x3b\x91\x2d\x4e\x7c\x1a\x9f\xe6\x5f\x66\x58\xa6\xf2\x39\x14\x0a\x62\xc3\x26\x1e\x10\x39\x2e\xd1\x93\x0a\xa9\x17\x65\x2d\x3b\xd2\xbe\x4e\x8a\x08\xab\x97\xe1\x45\xb9\x20\xab\xb3\x1e\xe4\xbc\xd5\xa0\xd7\x1f\x63\x81\x80\xf6\x1c\x24\x58\x23\xa3\x99\xa7\x34\xa4\xdc\xde\x09\x97\x88\x02\x45\xed\x71\xeb\x9b\xc6\x5e\x3c\x6f\xc9\x5a\xb9\x20\xb8\x02\x4c\x17\xd4\x4c\xed\x00\x37\xd0\x4a\x13\x3c\x26\x41\x78\x2f\x1d\x62\x2d\xf4\x52\x69\xb4\x91\xd3\xfa\x2a\x12\x27\x57\x9e\xaa\x38\x6d\xe3\xe7\xde\x7b\xc4\x55\xc6\xa1\x54\xee\xe5\x72\x7f\xff\x04\x37\xa2\x00\x76\xc5\xc3\xb0\x57\x7c\xac\x5b\x4b\x69\x34\xe2\x69\x38\x02\x22\x46\x1a\x60\xf9\x54\xe4\x89\x79\xc0\x67\x12\x17\xf1\x6f\x70\x27\x98\x30\x34\x12\x10\x93\x18\x6c\x78\x70\x5f\xc2\x7d\xc9\x2e\x2e\xda\x41\x16\xa6\xbf\x7d\x23\xe0\x54\x8d\x62\xb6\x7b\x25\xc4\x1e\xd0\x61\x92\xbc\x26\xef\x13\x97\xbf\x16\x01\xf3\xa6\xe2\xa0\xe7\xf6\x61\xfb\x05\x05\xee\x38\x2f\x27\xae\xc2\x80\x5a\x3e\x21\x17"}, -{{0x59,0x07,0xa8,0xc0,0x84,0x04,0x38,0x75,0x23,0x8e,0xdb,0xdc,0xb7,0x83,0x2f,0xbb,0xa4,0xc0,0x5e,0xa3,0xc5,0xf8,0x8a,0x96,0xf1,0xfb,0xf9,0x50,0x40,0x1e,0xc1,0x64,},{0xe2,0xf4,0x95,0x09,0xd1,0x00,0x7f,0x61,0x8e,0xfe,0x4f,0x1f,0xd6,0x7e,0xaa,0x6e,0x2a,0xb1,0x8a,0xfb,0x2d,0xec,0xce,0xd5,0xa0,0xb2,0xba,0x83,0x63,0x78,0x92,0x60,},{0x8c,0x49,0x12,0xc0,0xf8,0x85,0xd7,0x6c,0x91,0x40,0x59,0x50,0x53,0x73,0xa6,0x4b,0xdd,0xd6,0x7d,0xd4,0x68,0x36,0x9a,0xb9,0x18,0xf2,0x3e,0xa2,0x8e,0x04,0xc1,0x91,0x77,0xa8,0xd4,0x61,0x14,0x4f,0x0a,0x8b,0x51,0xd2,0x15,0x17,0x6c,0xb0,0x8b,0xd6,0x53,0x01,0xc3,0xc4,0x62,0x37,0xb6,0x1b,0xb1,0x49,0x8c,0xa7,0x9d,0x4b,0xe7,0x0e,},"\x43\x3b\x24\x78\xe1\x8f\xad\x5c\xb8\x10\x67\x06\x1d\x22\x55\x28\x22\x97\x78\x30\x78\x85\x47\x54\x60\xfb\xe3\x13\x7a\x5b\x44\x02\x48\x94\xdd\xbe\x56\xfa\x6e\xd0\x21\x49\x6f\x07\x86\xe4\x2b\xc6\xc2\xd2\x79\x7e\xa0\xa6\xbf\x35\x5e\x88\x11\x5f\xaa\x55\xcd\x92\xed\x42\x13\x3d\x9d\xcd\xa6\xb9\xeb\xf6\x3c\xe4\xa9\x94\xd1\xa8\x2d\x2a\x49\x26\x75\x58\xbe\x54\x18\x2a\x6f\x85\x11\x2b\xd1\x2b\x24\x7a\xda\xcf\x14\x05\xfc\x7e\xc7\xa0\x15\xd4\x3a\xb4\x0b\x82\xc6\x77\xf7\xf8\x5a\x0e\x48\x19\x7c\x5b\x96\x57\x61\x99\xf4\xc3\x34\x3f\xf7\x65\x4d\x52\x3a\x30\xc4\x3a\x05\x4c\x3e\x46\x44\x51\x27\x80\x34\xb7\xf1\x96\xc3\x66\x76\x8c\x62\x8a\xf9\x4f\xc0\xcc\xfc\x9a\x29\x55\xf9\xd3\x23\x38\xb9\x44\x78\x0f\x8e\x32\x70\x85\xb1\x03\x78\x18\x68\xe4\xfb\x79\xd5\x61\x22\xd7\xf3\xf5\xab\x30\x9e\x5d\x63\x4a\xdd\x15\xda\x38\x2c\x0d\x23\x58\xe6\x47\x18\x2b\xe4\xde\x6e\x9a\x9e\x43\xe6\xa3\xa3\xb8\x21\x5b\x20\x4d\x95\x07\x61\x0d\x46\x16\x21\x00\x0f\xb1\x89\x37\x07\xaf\x7d\x25\x95\xbf\xef\x8a\x8c\x5c\x5c\xd0\x8f\x30\x9a\x5f\xb5\x5e\x45\x51\x9a\xea\x9b\x84\x74\x8c\xa5\xc6\x72\xbf\xec\xd3\x0d\x25\x65\x12\x34\xa3\xcc\x31\x9b\x43\xdf\xce\xfc\x1a\x07\xb5\x5b\x4a\xca\x71\x4c\x2e\x7e\xf9\x63\x8f\xe7\x88\x4a\x77\xb2\x22\x53\xa0\x1a\x22\x29\x50\x0e\x9c\xe1\x0f\xda\x73\xa8\x43\xc1\x9c\xc0\x96\x26\xd2\x45\x6c\x22\xa9\xc9\x01\x88\x1d\x52\x1f\x4b\x15\xd2\xf6\x13\xcb\x46\x9d\x30\x4d\x57\x92\x23\xbc\x5f\xf7\x38\x04\xdf\x63\x71\x51\x7e\xba\xa5\xb6\x77\xea\x91\x0f\xf1\xa0\x2a\x26\xfa\xfe\x48\xfe\xf4\x69\xed\x79\x9b\xed\x6d\x56\xce\x96\x18\x34\xa2\xed\xc2\xe2\x3c\x0d\x94\x26\xec\xcd\xcc\x93\x4f\x4c\x22\x0e\x37\x81\x5f\x7c\x33\x4b\x73\x83\x60\x7d\x43\x05\x20\x94\x6a\x88\x1a\x08\x32\x5b\x41\x64\x97\x9d\x5e\x82\xcd\x81\x34\xd7\x8c\xec\x48\x61\xc0\x19\xf6\xde\x30\x1c\x1b\x9a\xec\x52\xbb\x98\x20\x33\xfb\x79\xb2\xe9\x73\x1b\xab\x29\x68\xbc\x3f\x93\xfa\x56\x04\xb8\x93\xc6\x02\x8c\x20\x4c\x36\xbb\x8c\x6b\x07\x4b\xe2\x8c\x96\x4d\x28\x49\xb5\xbb\x19\xd7\xe0\xba\x24\xe2\x2a\x20\x4d\x4f\xda\x83\xb1\x01\x31\xd3\x83\xf1\x0b\x13\x6b\xd0\xdb\xa3\x9e\xc2\x6a\xf3\x0e\x3f\xfb\x4d\xbc\x0c\x92\x1f\x0c\xc9\x91\x07\x15\xd5\x1c\x81\xfe\x4c\x62\x95\x0e\x85\x55\x49\xa1\x7c\xd7\x3a\x09\xac\x91\xe0\x6d\x46\x15\x18\x37\x6d\x0f\xcf\xa1\x23\xdf\x0a\x83\x71\x03\x45\x8d\x9c\xe2\x21\x80\x8d\x1f\x9e\xf2\xed\xc5\xcd\x2e\x68\x23\x14\x5b\x52\x48\x94\xea\x48\x52\x6d\x98\x5e\xef\xd3\xf6\x06\x79\x39\x95\x48\xe1\xed\xea\xdb\x53\x95\xb4\x3d\x87\x04\x4b\x2b\xfe\x7c\x60\x37\x02\x9b\x34\x6a\x40\x22\x27\xea\xb8\x1f\x33\x3e\x10\xe7\x7f\x1d\xbc\x06\xa2\x11\xd4\x3b\x82\x55\x86\x76\xc2\xdc\xff\x90\x82\xb1\xdd\x53\x36\x8d\xf0\x02\xde\x13\x29\xaf\x30\x00\xb1\x71\xa6\x91\x43\x89\xbb\x80\xec\x0c\x9f\x3e\x41\x2a\x44\x1b\x80\x0a\xfc\xeb\x04\x86\x70\x9a\xda\xc6\x6c\xaf\xee\xf2\x48\x83\x93\x31\xf5\xd8\x92\x19\x7e\x25\x42\x0f\x1e\x37\xd7\xc0\x24\x7f\x66\x9f\x5f\xcb\xf0"}, -{{0x60,0x20,0xae,0x27,0x3e,0x0e,0x05,0x37,0xba,0xc8,0x81,0xd7,0x54,0x9d,0x92,0x3e,0xb1,0xcc,0x20,0x0d,0x49,0xca,0x65,0xd4,0xbe,0x63,0x5e,0x39,0x17,0x3d,0xf9,0xda,},{0xda,0xaf,0x0e,0x69,0x9a,0x12,0xa9,0x2c,0x16,0xe0,0xde,0xd3,0xeb,0x34,0x50,0xa3,0x63,0x11,0x82,0x45,0x77,0xe3,0x61,0xf0,0x56,0x96,0x60,0x33,0x00,0x16,0x62,0x97,},{0xb1,0xba,0x88,0xfe,0xd7,0xe5,0xf4,0xb7,0x57,0xf3,0xfa,0x4d,0x1e,0xd9,0xb1,0x9e,0x49,0x8e,0x5d,0x2f,0x5e,0x6c,0xd4,0x6e,0x42,0x6f,0xe8,0xf0,0x39,0x88,0x2f,0x1b,0xe7,0x7a,0xc9,0xe5,0xa9,0x26,0x5c,0xbf,0x7e,0x3c,0xd2,0xa9,0xe9,0x92,0x6c,0x18,0x19,0x91,0x43,0x79,0x8d,0xa5,0xbe,0x47,0xa4,0x08,0x64,0x40,0x49,0x6b,0xa0,0x0f,},"\x6a\x80\x11\xde\x09\xaa\xc0\x0d\xb1\x6f\xf7\xe5\x5c\x2d\xe6\x7d\x8c\x98\x83\xfc\xb2\x04\x0d\xed\xbc\x1e\x32\x1c\xab\xa7\xbb\x03\x69\x71\x53\x01\x76\xd1\xdb\xba\xa9\x27\x52\x0b\xdf\xcc\xbe\xd8\x84\x01\x26\x04\x3e\xdc\x44\xcb\xb7\xfa\x35\x28\x68\x0e\x5f\x1b\x56\x64\x95\x1d\xc9\x01\x09\xae\xa4\xb9\xc3\x36\xca\x04\x3d\x82\x21\xa4\xc8\xd2\x01\x16\x56\xbf\x94\x4e\xfd\x36\xba\x0a\x10\xa4\xb3\x89\x19\x60\x55\x75\x0b\x0e\x38\x8f\xb5\x28\x70\xbb\xec\x8c\x55\x19\x81\x31\x44\x39\x45\xc0\x9f\x3a\xac\xe3\xe6\x91\x50\x14\x37\x40\x73\x26\x6f\x34\x88\x74\x42\xd7\x4f\x46\x8f\x8d\x70\x78\xbb\xa0\xbd\x81\x4c\xd6\xdd\x42\x3c\x97\xb5\x69\x05\x58\x7b\x15\x2d\x1f\xcf\xba\x0e\xb9\xfd\xe2\x11\x26\x91\xda\xfa\xf4\xf9\x21\x56\x2f\x24\x1b\x62\x84\x10\x01\x83\x4f\x6c\xe3\x66\x85\xf8\x2a\x8f\xaa\x3b\x7a\xfa\xd7\x3a\x5e\x59\xbf\x5f\x9e\x71\x3e\x59\x16\x3f\x31\xdb\xe6\x96\x11\x8a\xf3\x35\x06\xd2\xff\xea\x3d\x9c\x15\x56\xfb\x15\x2f\xd2\xb3\x21\xc3\x17\x57\xd0\xc3\xc0\xf6\x0e\xe1\x13\xed\xac\x02\xd6\x7e\xfb\xb3\x03\xdc\xe6\xfa\x88\xf7\xb9\x74\x6c\xa1\x10\xe6\xa0\xcd\x09\x9c\x08\x31\xf5\x3c\x55\xc2\x8b\x6c\x82\xaf\x44\x64\x56\xb8\x42\xb2\xc9\x50\xa5\x53\xee\x2c\x76\x5e\x97\x29\xe6\xb0\xc5\x46\xbf\xc2\x6b\xd6\xd4\x2d\x06\xb2\xed\x5d\x4c\x8c\xbb\xc7\x5f\x2a\x3a\xd8\x12\x93\x95\x79\x3d\x97\x9c\x03\x1f\xce\x7e\x20\xb3\x8b\xd8\x9c\x9b\x62\x47\x48\xb2\x01\x34\x23\xce\xba\xda\x02\xcd\xe2\x05\x2d\xa5\x66\x4c\x6c\x64\x26\xcb\xfc\x88\xf8\x4f\xf6\x02\xe2\xe2\x0d\xf9\x67\x8f\xbb\xa5\x77\xa4\xc1\x34\x51\x7e\xe0\x50\x68\x11\x51\x58\x0f\x7c\x5c\x97\x87\xb9\x6e\x55\xc4\x07\x5a\x26\xf4\xf8\xcc\xff\xbb\xb6\xea\x18\xde\x1b\x2c\xc8\xc4\x49\x6b\x16\x04\x27\x70\xb7\xec\x6e\xb5\x42\x9e\x7a\xc1\x89\x12\x32\xaa\x4e\x47\x46\x7f\x4e\x9a\x98\x5d\x80\x54\x7e\xcc\x4c\x6f\xd9\xf5\x97\x63\xed\xe9\x16\x71\xf2\xaa\x57\x36\xa5\xd1\x48\xe3\xa8\xff\xc8\x8e\x61\x25\x3a\x85\xb0\x95\x36\x54\x95\x8e\xb2\xd6\x94\x01\xcb\xea\xe7\x75\xf8\xcb\x8c\x3c\xa4\x2d\x21\x69\x3e\xbe\x29\x88\x38\xdf\x94\xc1\xd7\x7b\x12\x6a\x12\x05\xcc\x47\xd5\x0d\x53\x67\xb6\xf2\x76\xec\x8d\xb6\xb9\x53\x24\xa3\x1e\x8f\xd2\xed\x2e\x43\x42\x0c\x4a\xd0\x2e\xa2\x77\xdd\x94\x8a\x55\x19\x3d\x0f\x0b\x4d\x1c\xf2\x83\x86\xc7\x25\x97\x5c\xe5\xc1\x2d\x2a\x6f\x35\x67\x3c\xc2\x2a\x06\x94\xcc\xa4\xda\xf6\xaf\xbf\xd3\x26\xd8\x8c\x18\x50\xf8\x34\xc4\x2f\xf0\xe2\x92\xba\x4f\x13\xe5\xef\x07\x74\xa5\x96\xd3\x39\x04\xc0\x26\x2d\x31\xdf\x2c\x58\x4a\x0a\x4f\x45\x3f\x6a\xe4\xa8\x8a\x27\x5f\x7d\xe7\x9c\x13\xae\x1a\x73\x11\x5b\xe0\x2f\x42\x5c\x6f\x17\x7a\x1e\xc4\x63\x9c\x42\xa7\x92\x80\x9a\x2b\x09\x19\xeb\xd3\x21\xe3\x16\x00\x1d\x5b\x2f\x84\x89\x4f\xce\xbd\x50\xa1\xdc\xf4\x4d\x70\x2b\x92\x45\x32\xfc\x0e\x4d\x3f\x9f\xf8\x48\x6c\x0e\xd1\x80\xee\xcc\x3e\x09\xe2\x27\x2a\x94\xdc\x7d\x24\xa4\xe8\x7a\x93\x1f\xe2\x49\x5c\xbf\x99\x2c\x0a\xae\x92\x01\xe0\x79\x62\x98\xf9\x36\x3d\xba\xc4\x75\xe8\xed"}, -{{0x93,0x2a,0x20,0x0e,0xce,0xe7,0x22,0x3f,0x24,0x14,0x62,0x83,0xa4,0x04,0x8c,0x67,0xa6,0xa2,0xd2,0xfc,0x4b,0xa0,0xf9,0x24,0x8b,0xdf,0xfd,0x82,0xc6,0xcc,0xe3,0xcb,},{0xec,0x9b,0xfb,0x7a,0x6d,0x04,0xe7,0x26,0xfc,0x1e,0xa0,0xc4,0x24,0x61,0x0d,0xcb,0x79,0x67,0xbf,0x15,0xd6,0xd6,0x62,0x68,0x58,0xd4,0x11,0x19,0x8d,0x40,0xe2,0x39,},{0xcd,0x1e,0x4b,0xdf,0x4a,0x3e,0x4a,0x31,0xd6,0x52,0x54,0x33,0x3c,0x8c,0xc4,0x08,0x7e,0x4c,0xc4,0x0b,0x02,0xe2,0xa3,0x47,0xd0,0x9a,0x3d,0xde,0x69,0x84,0x90,0xc0,0x87,0xd7,0x10,0x9a,0xd0,0x20,0x9c,0x53,0xe9,0x87,0x58,0x9c,0xbf,0x3c,0xe2,0x64,0x12,0xa2,0xb0,0x2c,0xb8,0xa3,0xbc,0x93,0xfe,0xc7,0x5a,0xb5,0xd2,0xc3,0x87,0x03,},"\xdf\x95\x32\x07\x04\x82\x13\xaf\xb8\xe2\xaf\x45\x2c\x88\x9a\x21\xca\x13\x6a\x68\xc9\x29\xbd\xc8\x24\xf9\xa8\x9a\xc5\x96\xdc\xb9\x00\x19\xa4\x6f\xb6\x82\xbc\xfd\x96\x2f\xcc\xb2\x7d\x00\xba\xf8\xec\xca\xf9\xd9\xa7\xd8\x18\x3c\xab\xd7\xdf\xa5\x06\xf7\xba\xfb\x49\x35\xab\x04\x59\x31\xff\x8f\xae\xb7\x16\x31\xf9\xed\x6b\xb8\xf8\x47\x3a\xd6\x29\x0d\x7c\xf5\x19\xdb\x31\x0a\x44\x42\xc4\x61\x11\x8f\x67\xd1\xa6\xd1\x03\xba\xe6\xf2\x69\x7c\x94\xb7\x42\x6d\x9e\x02\xe3\xcb\x95\x22\xfd\x0b\x44\xae\xf6\x00\xc9\x62\xfe\xff\x58\x73\xd9\x8c\x27\x90\x88\x7b\x8e\x88\xd1\x60\x82\x4f\x1b\xba\x22\x01\x76\x39\xf8\xdc\xe6\x8f\x74\x34\x80\xde\xea\x1f\x92\xaa\x1f\xd4\x13\x5d\xd0\x64\x57\xa6\x0f\x36\xb7\xd7\xf5\x17\xd4\x0c\x94\xc0\xdd\xdc\x2e\x46\x58\x47\xd9\x09\xb9\xf6\x82\x45\xff\x2b\x42\x1d\x59\x19\x00\x1a\xae\x5a\xef\x24\xe0\x2c\x00\x2d\xa9\x07\xe8\x60\x5f\x16\x0e\xa6\x09\x6b\x58\x0b\x75\xce\xa0\x22\xd4\x02\xf7\xf5\xfd\xc4\x64\xf8\x7f\x78\xc7\x90\x6a\x01\xe8\xe4\x8f\xb5\xb3\x51\x74\x61\x2b\x48\xac\x8b\xc7\x50\xe0\xf3\xae\xb0\xa1\x2f\x7d\xfc\x09\xb0\x84\x2c\x17\x80\xa5\xfd\x9c\x54\xaf\xb9\x39\x9b\x94\x08\xba\xac\xcd\xa2\x0a\xfb\xe3\xd6\x82\x24\x8d\x7b\xf1\xef\xde\xf4\x90\x5a\x31\x9b\x0f\xfb\x10\x8b\x75\x3b\x71\xcc\x97\xe9\xe2\x1e\xc9\xb3\xdd\x28\xce\xe0\x39\xd9\x41\x8a\x11\x35\xf0\xad\xd0\x92\xaa\x66\x31\x2e\xa2\x91\x33\x00\xd1\xcc\x89\x16\x52\x43\x02\xbd\x3d\x1b\x09\xe6\xb2\x9c\x68\x57\xcb\xdc\x56\xef\x4b\x3f\x35\xd8\xee\x67\x72\x08\xef\xfa\x84\x6f\xdb\x06\x6b\x05\xeb\x71\x7b\x4d\x45\x12\x0c\xab\x72\xa7\xdb\x7a\x7c\xa8\x46\xe8\x7b\x16\xb6\x90\x47\xeb\x76\xd8\xf1\x8d\xa8\xe1\x39\x9e\xc0\xa8\xc9\xc3\x28\xcb\xe6\x0e\x0b\xf4\x20\x44\xd2\xeb\xf2\x81\x8b\x3c\x04\x75\x88\x45\x2f\xcd\x2b\x3e\xfc\x1e\x10\x09\xae\x07\x68\x87\x27\xdb\x8f\xb6\xdf\x2a\x2f\xe7\x5d\x1c\xf2\x2f\x32\xba\xc0\x9c\x82\xa6\xa3\xd7\xee\xd7\xd0\x05\x08\xcb\xe5\xb7\x24\x60\xec\xfc\xdd\x3e\xe9\x11\xef\xe5\x89\x8d\xbd\x8e\x4c\xe8\x59\x13\x26\xdd\x15\x22\xf9\xd2\x55\xda\x86\x1b\xf9\xeb\x2a\x1d\x57\x25\xd7\xd5\xd4\x27\x34\x03\x41\x94\x5e\x7b\xca\x8c\xf2\xff\x8a\x99\x74\x50\x95\x3e\x77\xd2\x03\x68\x3e\x4b\x0d\xaf\xc3\x30\xe0\x56\x72\xd2\xec\xd1\x3a\x3f\x44\x2d\xf1\x37\x04\x4e\x0f\x55\x6f\xfb\xce\xff\xea\x26\xcb\xae\x26\xcb\xa6\xf2\x56\x8c\xf3\x9f\x90\x84\x89\xe1\xa9\x2e\x76\xaf\xbf\x29\x79\x95\xda\x4b\x2c\xb1\xab\xc9\xee\x1f\xe4\xdc\xa5\xaa\x83\x8b\x2f\xbd\xc1\x09\xe8\x9b\xef\x3c\xe5\xa3\x6e\x5b\x2f\x71\x2a\xc4\xc8\x89\x43\x82\x48\xfa\x5a\x21\x50\xca\xc6\xc9\x77\xb5\xe0\x54\x3f\x40\x10\xb7\x31\x47\x32\xfd\x18\xe7\xfd\x59\x82\xe8\x32\x76\x51\x9e\x78\x72\x5e\x5a\x5e\xeb\x86\xf4\x89\x20\x84\xae\x52\xda\x38\x49\xc2\x28\xc8\x09\xed\xbf\x69\xa2\xcc\x47\xc4\x78\xd1\x87\x19\xf1\x11\xd7\x37\x88\x7c\x7a\x2e\xb3\x25\x08\x98\xdb\x34\xe5\xe5\x07\x6f\xab\x9f\x4a\x9e\x6e\x19\x29\xa3\x48\x08\x36\xde\xa0\x7b\xa4\xd6\x3f\xce\xfc\xe5\x54\x34\x30\xa8"}, -{{0x5c,0x48,0x3e,0x83,0x7e,0xb0,0x1e,0xd5,0xa4,0xad,0x5d,0xb3,0x79,0x26,0x99,0x82,0x4d,0xf1,0x3e,0x57,0x6b,0xe9,0x67,0xd1,0x21,0x15,0xc8,0x5e,0x02,0x86,0xe6,0x28,},{0xfe,0x1a,0xa8,0xb0,0x69,0xda,0x56,0xe6,0x76,0xef,0x3a,0x57,0xd9,0xbb,0xa8,0x83,0x05,0xea,0x03,0x28,0x08,0xee,0x63,0x52,0x73,0xb3,0x7c,0x5c,0x63,0x5d,0xef,0x4e,},{0xc1,0x7c,0x2f,0xbf,0x8c,0x00,0xbc,0xea,0x30,0x35,0xbf,0x0a,0x62,0xd3,0x02,0x29,0xdb,0x74,0x2c,0xab,0x11,0x99,0x67,0x7c,0x7e,0xb4,0xeb,0x0e,0xf5,0xc7,0xb5,0x1a,0xd4,0x87,0xa4,0x97,0x1b,0x63,0x1e,0x79,0x4a,0x58,0xbb,0x08,0x23,0xcc,0x0f,0xe6,0x26,0x10,0xfd,0xa6,0xa9,0xe0,0x3f,0x8c,0x4c,0x33,0x81,0xcb,0x15,0x4c,0xef,0x0b,},"\x58\xd5\xe2\xcd\x89\x9b\xa9\x85\x37\x8b\x3e\xc3\x3e\x9a\x86\x98\x22\xb2\x3d\x5d\x89\x6a\x28\xf4\x24\xfc\xd6\xe4\xcc\x28\xb8\x0d\x4a\xaf\x2d\xe8\x04\x36\x7e\xfd\xf5\xe4\x23\xb1\x23\x4d\x82\x1d\x63\xac\x05\xea\xed\x12\xc7\x3e\x8e\x36\x08\xaf\x0d\xdc\xcc\x83\x86\xb7\xd8\x42\xb1\x2e\x60\xd3\x0c\xed\xe3\x25\x53\x94\x5e\x78\x29\xe9\xb2\x3f\x5c\xcc\x2e\x71\x03\xa0\x8f\x2c\xdd\x9e\x75\xa7\xb3\x6f\x5e\x63\x72\x0e\xf0\xd4\x9b\x25\x92\xbe\xf3\x74\x02\x68\xc8\x9c\x86\xa6\xcb\xdf\xe2\x01\xde\x0d\xb9\x98\x5c\xeb\x19\x39\x9c\x9a\x1d\x5b\xb0\x58\x6a\xf3\xc8\xcd\xf2\x71\x32\x99\xeb\x04\x43\xa5\x41\xa4\x73\x84\x60\x72\x43\xc5\x4a\x05\x91\x50\x58\x36\x7d\x3f\x2d\xb3\x80\xed\x31\x7a\x8c\x12\xc7\xa6\x3e\x80\x9c\x2e\x84\xd4\xac\xb9\xd9\xee\xf5\x4c\x6f\x5a\xf7\xab\x59\xcb\x91\x68\xb1\x06\x8f\x9d\x2c\xcd\x97\x8f\xe7\x21\xba\xd6\x8a\x66\x9f\xfe\xde\xa3\xe9\x2c\x76\xb3\x2e\x31\x66\x65\x8e\xe3\xbd\x0d\xeb\x1b\x08\x41\x94\xce\x35\xd9\xa7\x41\xc5\x7f\xc2\x24\x1e\x68\xef\xaa\x65\x32\x0b\x23\xa1\xdd\x19\xea\x8b\x7e\xc8\x1e\x76\xf1\xe9\x16\x3f\x95\x92\xee\xee\x5a\xf8\xec\xed\x02\x72\xf3\x35\x12\xd0\xd4\xca\x06\x7f\x05\x55\x1b\x26\x53\x96\xe1\x00\x14\x78\x3c\xac\xac\x79\x43\x7b\x19\x84\x2d\xe6\xab\x91\xb9\xd9\x23\xbb\xeb\x50\x33\x25\xbc\x54\x86\x9f\x66\x3e\x6e\xa4\xae\x68\x97\x70\x1b\xe7\xe1\x1d\x16\xcd\xfa\xe0\xee\xe8\x61\x86\x20\x00\xe7\xa4\x16\x07\x81\x54\x7e\x42\x52\x6a\xf5\x1b\xa9\x69\x8d\x23\x4a\xaf\x51\x0d\xa8\x1a\x0d\xbf\x26\x43\x66\x15\x3d\x7a\x6d\x5e\xb3\xfb\x08\xb9\xbb\x5e\xa0\x65\xc2\xf5\xe5\xb6\xbb\x67\x9d\x2e\x21\x0b\x5b\x40\xe2\xbc\x82\xf7\x8d\xc9\xab\x58\x24\xb7\x4a\xad\xad\xd8\x9b\xf8\xa8\xb7\x3a\x0a\x2f\x43\xac\x74\x83\x78\x92\x1a\x73\xa2\x52\x70\x4a\x4a\xdb\xf7\x40\xcb\x99\xc1\xe1\x59\x4c\x37\xac\x9a\xcc\x19\xf5\x23\x15\xc6\xa8\x46\xa5\x7b\x36\x12\x8c\x64\xd7\x67\xaf\x44\xe9\xc8\x63\x05\xbf\x18\xba\x7c\xd5\x26\x80\x52\x3a\x3b\x10\x2f\xba\x6f\xe5\x55\x67\x06\x9d\x20\x47\xcb\xdd\x96\x05\xea\x12\xc8\x87\x7d\x39\x9c\x1e\x66\xe3\x38\x17\x73\x1f\x50\xb8\x4f\x81\x7d\x1f\x07\x60\xa4\x0f\x97\x46\x86\x18\x93\x41\x05\xeb\x00\xec\x50\xc7\x6d\xb3\xc5\x3f\xcf\x43\xfe\x17\x02\x90\x7d\x9a\x75\x6b\xcf\x43\x9f\x88\x31\xd0\xbf\xac\x92\xe7\x05\x8f\xb1\x57\xbe\x3e\x59\x1d\x37\xeb\x34\x16\x5e\x3c\x6f\xc6\x0e\x72\x29\x4c\x08\x3e\x47\x76\x26\xf9\x00\x1c\x1d\x73\x7c\x29\x03\x77\xdf\xa5\x8e\xa4\xea\xd3\x02\x8f\xc7\x62\xce\x8a\x3a\xfe\xc2\xe6\xe1\x32\xc6\x62\xdf\x60\x34\xab\x55\x4f\x93\xef\xac\x65\x7a\xd3\x4f\x61\x07\xd3\x47\xfc\x5c\x5e\x53\xf3\x73\x3e\x17\x8b\x76\x01\x4d\x2f\x9b\xbd\x06\xef\x2d\xfe\x60\xe2\x08\x3d\x88\x65\xf7\xf5\xb2\xac\xc0\x25\xd9\x12\xe5\xcf\x6c\xda\x6e\x79\x81\x43\xe9\xdb\xbc\x70\xa0\x21\x1d\x8e\x40\x03\xd7\x8b\x38\x3d\x66\xa6\xad\x29\x71\x7c\xa2\x4e\xdd\xef\x7d\xf7\xcd\x3a\x7e\xf6\x52\xab\xa5\x48\x7a\xfe\x5d\x02\x6c\x9b\x10\x28\x07\x29\x4e\xb2\x7d\x98\x24\xee\xb6\xb4\x0f\x08\x3d\xe7"}, -{{0xb0,0xd0,0xab,0xdd,0x84,0x44,0xe1,0x0f,0x29,0x37,0x54,0xac,0x9f,0x16,0xe3,0x1b,0xdc,0xdd,0x97,0xb7,0x06,0x71,0x28,0xaa,0xe8,0xe4,0xd7,0xf1,0x12,0x89,0xe2,0xcd,},{0x1c,0x78,0xcc,0x01,0xbe,0xa1,0x53,0x52,0xb6,0x3c,0x56,0x97,0xf1,0xcf,0xe1,0x2f,0xfd,0xd1,0x6d,0xdc,0x1d,0x59,0xe7,0x79,0x51,0xb6,0xe9,0x40,0x8e,0xe2,0x28,0xad,},{0x64,0x40,0x8b,0xdd,0x2d,0x0f,0xc8,0x92,0xa5,0xb6,0x2b,0x5a,0xcf,0x8e,0x3b,0x3c,0x73,0xc0,0xb5,0xc4,0xfa,0x2a,0x72,0xe3,0x9d,0xd6,0x08,0xd4,0x93,0x7f,0x93,0x32,0xf7,0x3e,0x14,0xd0,0x8b,0xad,0xc6,0x27,0x01,0x14,0xd1,0xf1,0xa5,0x56,0xcc,0x6e,0xe8,0x48,0x8a,0xbb,0x90,0x7f,0x79,0xae,0x17,0x5c,0x35,0x2e,0x9f,0x11,0xee,0x05,},"\xaa\x27\x6c\xc5\x43\xfc\xc6\x2d\x70\xa7\x04\x60\x8d\x98\xce\x51\xb6\x45\xb5\xc2\x4a\x64\x0a\x5d\xf1\x0a\x55\x91\x41\x7d\x10\x89\x26\xdf\x3f\x0c\xe1\xb9\x21\x03\x33\x09\xeb\x8d\x86\x59\xf4\x89\xfd\x6f\x79\xaa\x1b\xf4\x88\x2d\x72\xac\x69\xcc\x58\xd3\xbc\xe0\xfa\x89\xb1\x64\x11\xe9\x75\x3e\xb4\x0c\x6c\x4d\x59\x8d\xc8\xf4\xab\xb0\xbc\x48\xf1\x37\x03\x71\x32\x6c\x9a\x86\xbb\xc2\xac\x62\x14\x47\x8e\x78\xa3\x84\x08\xbd\xda\xfa\xa9\x59\x26\x00\xc4\x9a\x12\x9c\x05\x39\x2f\x8a\x7d\x64\x2b\x49\x13\x7a\x20\xf3\xfe\x9f\x11\xee\x17\xcf\xa3\xaf\xd2\xaf\x71\x56\x5e\x9c\x40\x08\x0b\x60\xcd\x0d\xbc\x37\x8e\xda\x06\x2c\x7c\xbc\x7f\xe9\x72\xbd\xe4\x50\x9a\x1d\xe9\x5f\x14\xdf\x48\x2f\x48\xaa\xcc\x46\x3c\xd5\x94\xf6\x6d\x64\x8d\x37\x94\x73\x8a\xd6\xab\x49\x6e\x2d\xa5\x0b\x0d\xb2\xba\x7b\x65\x91\x85\xe4\x58\x7f\x18\x2e\x83\x3d\xe7\x50\xfa\xac\xdd\xf2\x1a\xf5\xe0\xcf\x4c\x9a\xf3\x85\xb0\x4f\x7b\xe2\x31\x49\x8a\xd0\xb7\x42\xd5\xa8\x7c\x06\x11\x5d\xb2\x30\x97\x3a\x51\x42\x7f\x20\x2f\xa3\x9a\xfb\x98\x28\xb5\xf0\x3f\xa3\x27\xcb\xd5\x2d\xfe\xc6\x6d\x71\xea\x31\x98\x65\xdc\xf6\x81\x0f\x18\x58\x47\x2d\x8b\xea\x3e\x44\x7a\xdf\xb4\xb6\x07\x58\xe8\x6b\x48\x13\x37\x09\x73\x2d\x2b\xcf\x51\xc7\x6c\xaa\x84\x7b\x65\x37\xfc\xb0\x5b\xb8\xc8\x7d\xc5\xe9\xfb\x02\x2b\x32\x60\xc1\xd7\x1b\x14\x98\x59\xc9\x66\x3d\xbd\xae\x6a\x7b\xbf\xd6\xde\xb9\xd1\x23\x80\x9c\x24\x14\x01\xaf\x10\x71\x9c\xf9\x1a\x6b\xed\x16\x08\x4c\x44\x46\x07\x35\x9e\xd8\xf0\x18\xdb\x11\x15\x11\x89\x2b\x46\xbd\xac\x6c\x9c\x61\x38\x41\xde\xd8\x86\xb9\xde\xc0\x6c\x01\xe8\x04\x87\xe4\x8f\xbe\x77\x8e\x9e\x97\x50\x8f\xfd\xa0\x57\x78\x53\xaa\xbd\xca\xca\x8b\x0b\xab\x6c\xe4\x15\x57\xaa\xb9\x63\x1c\x96\xd6\x09\x77\xe3\x57\x18\xb6\x05\x95\x27\x3f\xdb\xa1\x40\xf5\x50\x0a\x8d\x35\x76\xf5\xa9\xfc\x8f\x3c\xa4\xc0\x2c\x16\x7a\xf2\xe0\x3d\x25\x75\x0b\x42\xad\xb0\x3b\x14\x17\xf2\xb6\xd2\x19\xbe\x5f\x84\x29\x33\x1a\x26\xa4\x49\xb5\xd4\xdb\x2b\x1a\x09\x15\x2e\xea\x2b\x25\xd2\xdf\x7e\xf6\xfe\x0a\x32\xe2\x5f\xae\x79\x36\x0a\x9a\xee\x15\x11\xfd\xa8\x06\x45\x50\x93\x7a\x71\x30\x97\x19\x30\xc6\x73\xbb\x35\x8e\x5f\x55\x95\x1f\x50\xb1\x46\xd8\x5d\x38\x3f\x3e\x01\xc1\x51\xec\xe6\xc0\x6d\x83\x67\x01\x25\x32\x80\xfd\xcf\xf4\xe1\x39\xd3\x31\x9a\xb2\xe2\xca\x71\xbc\xc3\xfa\x0f\xaf\x7c\x70\x2c\x9c\x60\x4e\x56\x51\xde\x4a\xf5\x70\x0e\x9e\xde\x72\x58\xb9\xbc\x14\x8d\x55\x95\xcd\x34\x17\x0e\x3e\x5c\xf2\x92\x82\x83\x90\x90\x8f\xda\x96\x1f\x22\x30\xac\x0b\x8c\xac\x64\x73\x97\x32\x70\x6c\xe2\xd5\xe5\x9a\xbd\x6d\x5e\x20\x7b\xda\xfe\xa7\x4d\x28\xd7\xa7\x58\xf2\x20\x0e\x4e\x00\xa0\xbc\xf0\x30\x6a\x3c\xab\xda\x47\x02\x4f\xab\xea\xe4\x88\xab\x5c\x32\x37\x15\xcf\x3c\xa7\x72\x0a\xf9\xeb\xbf\x85\x82\xe1\x15\x8a\x09\x9d\x73\x6b\x56\x9b\x9d\x40\x29\x58\x17\xea\x25\x54\x06\x8b\xef\x32\x44\x2c\x11\x1e\xc8\x14\xc6\xed\x41\x59\x19\xba\x73\x52\x63\x34\xdf\x30\xba\xc6\x66\x08\x4e\x56\x01\xc2\x28\x1c"}, -{{0x49,0x84,0x97,0xfd,0xcc,0x6a,0x10,0x58,0x91,0xe0,0x23,0xff,0x32,0xd7,0x5f,0x7c,0x37,0x48,0xd8,0xc5,0x2d,0x87,0xdd,0x3b,0x27,0x75,0xae,0xfd,0x81,0x60,0xa1,0x43,},{0x2d,0x79,0xae,0x9c,0xee,0x4a,0xc6,0x27,0x5b,0x05,0x74,0x9c,0x43,0x8e,0xbe,0x55,0x2b,0x41,0x3d,0x87,0x3c,0xc0,0x7f,0x14,0xf5,0xfa,0x13,0x01,0x77,0x21,0x4c,0x54,},{0xb0,0xa3,0x6a,0x2c,0x93,0x47,0x56,0x34,0x8e,0xb4,0x7c,0x25,0xa3,0x2c,0x3f,0x2a,0x5d,0xdb,0xd5,0x8f,0xcc,0x72,0xa0,0x8c,0x3c,0xea,0xd1,0xa2,0xd9,0x00,0x33,0x5c,0x30,0x01,0xe3,0x5b,0xfe,0x1f,0x3f,0xb5,0xa5,0x55,0x00,0x9b,0xa8,0xe9,0x68,0x74,0x49,0x4b,0x97,0xe8,0xb0,0x97,0x00,0xed,0xcb,0x1f,0x25,0x84,0xb9,0xd0,0xfe,0x03,},"\xbe\x38\xbc\x8c\xdf\x46\x19\x0e\x30\x4a\xb5\x3d\xd2\x9c\x2b\xc4\x09\x54\xfd\x4c\x6d\x2b\xb9\x90\xf9\x3b\x2b\x5c\x69\x1f\xdf\x05\x27\xc2\x60\xf5\x06\x61\x87\xf2\xd0\xf3\x1f\x43\xa0\x8b\x36\x0e\xa1\xed\x82\x00\x65\x17\x64\xb8\xfa\x49\x59\x5a\x15\x94\x10\x9e\x49\x67\x59\xab\x66\x23\xfa\x33\x37\x8d\x80\x0e\x61\x17\xe0\x79\xe1\x3f\xe8\x5c\x81\xb6\x3e\xbe\x24\x7b\x3d\xf6\xc1\x58\x4b\xc7\xcf\xfb\xdf\xa4\x5f\x2a\x2c\xe7\xc2\x37\xaa\xaf\xef\x8c\xbc\xa7\x0b\xca\xbc\xe0\xb8\x47\xd5\x51\xf4\x6a\x7d\x15\xce\x2a\x0d\x3d\x54\x5a\xba\xcc\x59\x30\x01\x0c\x53\x64\x88\x87\xd4\x76\xe0\xd1\x3a\x34\xfc\x1c\x54\xdf\x09\xd1\x06\xed\x75\x8d\xee\xdc\x76\x1d\x55\x7a\x73\xb2\xbc\xdd\xde\xfb\xa4\xed\x00\x59\x97\xb1\x92\x79\xb9\xd2\xde\x37\xd0\x41\xfe\x01\x3e\xef\x05\xa2\xe1\x1c\x9a\x23\x4e\x87\xcc\x0e\x16\xc0\xc6\xda\x42\xaa\xa5\xbf\x99\x64\x17\xbf\x64\xe5\xb7\x85\xd6\x7d\xc3\x25\x47\xc1\xf0\x52\x17\x8d\x69\x4c\xf2\x0f\x16\x98\x58\x9e\x7e\xd4\x9b\xe2\x9d\xd5\x9f\xd5\xc0\x1b\xa1\xd9\xf5\xfb\x06\xa7\x58\x95\xb7\xb1\xe1\x58\x95\x09\x7e\xbd\xe8\x4c\xad\x63\x03\xaa\x0a\x86\xdb\xc3\x24\x74\x7d\x97\x24\x5d\x70\xc5\x20\x3b\xe0\x1b\x06\xcb\xde\x06\xae\x03\x72\x04\xd2\x37\x30\xcd\x69\x61\x89\xf7\xac\x26\x7c\xf2\x02\x17\x99\x29\xce\x54\x10\xe0\xe3\xad\xe5\x13\xd2\x20\x1b\xfd\x20\xfe\xfa\x40\xb4\x47\x6f\x27\xbf\x90\x7c\x76\x2e\xb7\x26\x2a\x5b\xe1\x3c\xfc\x04\x7a\x84\x6d\x20\xa9\xf2\x31\x1b\x64\x69\xb0\x6a\xb5\x45\xf0\xec\x9f\xc4\x46\xea\x25\x0c\xd3\xb7\x3a\x7b\x6b\x96\x0c\x10\xca\x4c\x2d\x6c\x64\xa1\x56\xa1\x8c\x9f\xb8\x10\xe4\x9a\xfd\x0c\x36\xda\xab\x8b\x8b\x85\x66\x43\xa4\xcc\xaf\xa9\xad\x88\x6e\x91\xe5\x44\x53\x5b\x8e\xdd\xa2\x7c\x90\xc0\x6a\xb6\xbc\xc5\x36\x28\xbe\x18\xd7\xd6\x36\x9c\xa1\x80\x1f\x91\xc2\xe0\xb9\x5f\x36\xd7\x02\xf7\x72\x34\xb4\x10\x07\x19\xc0\x59\x95\x1e\x45\xb1\xf9\x16\x98\x39\x34\xe3\x2b\x4d\x4d\x8f\x29\xc0\xa3\x73\xf8\xd8\xf0\x91\x8b\x96\x78\x65\xcd\x0e\x4b\xec\xa0\x13\x27\xc9\x9d\x5f\xde\xd4\xc1\xa6\x9a\xc2\xd4\xd9\xb7\x8f\xfb\x83\x05\x67\x00\x21\x04\x02\x50\xcc\x27\x73\x7e\x75\xdf\x75\x76\x0f\xec\x8b\x8d\x30\xb2\x45\x65\x4f\x3c\x12\xf1\xf7\xce\xa0\xbc\xe7\x8a\xb3\x69\x35\x78\xaf\x3e\xa6\x1f\xfc\xcd\xf9\xba\xf7\xc3\xea\x65\xb8\x8f\xc8\x54\x12\x81\x26\x47\x67\x96\x89\x2c\x66\x3b\xd1\x45\x18\xc9\x91\x86\x29\xa1\x09\x5f\x61\x4e\x04\x92\x44\x6c\x3d\x84\xb1\x6e\xc9\x4f\x7e\xca\xda\xeb\x6b\x65\x9b\xbb\x48\x67\xb5\x79\x06\x17\x14\xfd\x5b\xb0\xfa\xa4\xad\x6b\xe0\xff\xb3\x88\x8b\xea\x44\x7e\x4e\x34\x38\xc8\xf0\xea\xe6\x44\xfb\xd4\x5a\x38\x02\xdc\x40\xec\x45\x1b\x21\x2b\xd5\x92\xda\xcd\x4d\xa9\x66\x86\xdc\x8b\x20\x24\x25\x7f\x25\xe9\xc8\x30\xbf\xf7\x95\xee\xe8\x5d\x87\xa0\x90\xc1\xa4\x23\x21\xe7\x10\x55\x57\x64\xed\x82\x57\xc9\x41\x5c\x7f\x22\x4b\x53\x75\x58\xce\xfd\xc6\x15\x12\x9f\x28\x35\x02\x67\xc0\x1b\xa0\x40\x3e\x07\xf5\xc6\x06\x7f\x91\xc8\x5a\x2c\x50\xc8\x66\xdc\x43\x88\xaf\x38\xd2\x16\x02\x03"}, -{{0xd9,0x62,0xa6,0x71,0x9e,0x5c,0xc7,0x72,0x4c,0xa4,0xa1,0xd5,0x59,0x53,0x68,0x12,0xb4,0xe2,0x2a,0xa7,0xbc,0xb1,0x3e,0x4f,0xb1,0x72,0x2d,0x28,0xe0,0x45,0x21,0x7c,},{0xa9,0x44,0x59,0x2d,0xbc,0x7d,0x77,0x03,0x9d,0x72,0x02,0x56,0xc3,0xfd,0x34,0x0d,0x34,0xdb,0x89,0x2a,0xb1,0x3e,0x48,0x12,0xd6,0x62,0xe2,0x84,0x0c,0x28,0xb6,0xd0,},{0xdf,0xb9,0xb6,0x35,0xac,0x0e,0xdf,0x83,0xb7,0xb5,0x9d,0x0b,0x84,0x09,0xaf,0x47,0x5f,0x66,0xfc,0x99,0x46,0xaf,0x0b,0x7c,0x63,0xab,0x8c,0xf5,0x92,0x9d,0x47,0x01,0xa1,0xbf,0x66,0x95,0x9c,0xde,0x62,0xfb,0xcf,0x59,0xa4,0x8a,0xb3,0xbb,0xaf,0x0b,0x9a,0x61,0xb6,0xe0,0x0b,0x21,0x81,0xeb,0x93,0x42,0x82,0x07,0x0a,0x5d,0x53,0x00,},"\xa6\xaa\x7a\x19\x0d\x00\x3a\xb1\x75\x33\x2b\x8f\x58\xe7\xca\xeb\x69\x08\x54\xd9\xdb\x56\xdb\xb6\x95\x7b\x3f\xb6\x54\xe2\xe0\xda\x99\x1f\x31\x54\x21\x42\x04\x13\x5d\xf1\xe1\x10\x43\x17\xc9\xe3\xc5\x8e\xed\xff\x1f\xc6\x1a\xba\x57\x74\x4c\x0c\x7e\xf4\x86\x00\x0a\x70\xb2\xc1\x42\xeb\xad\xdc\x07\xab\x06\x5e\x2a\x85\x5d\xaf\x19\x8a\x68\x03\xac\x24\xef\x37\x24\x48\x7c\x13\x51\xdd\xed\xa0\x51\x39\x13\x45\x7d\x76\x86\x0d\x78\xa9\xb6\xbc\x3d\xba\x66\xc4\x0e\x5f\xc3\x49\xa8\x73\xad\x60\x65\xce\x7d\x7f\xdc\x2c\xc4\x83\xb3\xae\xfb\xf2\xf0\x3d\xd6\x69\xbd\x9c\xb8\xf6\x3c\xee\x47\x78\x5c\xac\xb0\x9d\x87\x2c\x9a\xeb\x83\xe9\x86\x84\x05\x25\x43\x24\x03\x79\x82\xe0\x86\x13\x45\x5d\x95\x21\xd8\x8e\xa2\xfd\xa0\x20\xbe\x73\x0c\xfc\x8c\x07\xcb\x0b\x37\x61\x4c\xcb\xa2\xfa\x3e\xc4\x98\xb8\x15\xbb\x5a\xdb\x99\x6e\x84\x8b\x38\xc0\x15\xa6\xa5\xc7\x52\xeb\xda\xc7\xb9\xee\xd8\xb6\x96\x19\xd8\xc8\x46\xb6\x6f\x78\x16\xd1\xdf\x1e\xbc\x21\x07\x1c\xef\x0b\x25\x1e\x2e\xab\x59\x82\x7f\x6d\x60\x55\x08\x43\x70\xfd\x27\xc2\x03\xe8\x6a\x18\x9f\x1e\xe1\x1e\x84\x03\xab\xdc\xbd\x1f\x45\x34\x1a\x82\x05\x25\xd8\x63\x7d\xc4\x84\xa5\x18\x5d\x65\x51\xcb\x88\x2a\x96\xb9\x98\x1a\x5f\x1a\x82\x1f\x27\xb6\x56\xff\xf9\x0e\x7f\x69\xbf\x28\x6f\x75\x2f\x97\x0f\xfc\xa5\xc5\x3e\x08\x50\xb2\x0b\x94\xf9\x43\x16\x27\x09\x4a\xce\xa9\x12\xa8\x80\xb7\x49\xa6\xf8\x0b\xb2\x06\xcc\xaa\x74\x6f\xa7\x0c\x83\x3c\x9f\x32\x30\x89\xce\x05\x58\xc9\xdc\x20\x0d\x57\x39\xd1\xe4\x99\x63\x4f\x2c\x16\xe5\x4b\x7f\x6d\x78\x19\xc4\x70\x71\xb6\x0b\xd5\x4d\xd0\xf2\x73\xa3\x19\x75\x0f\xd3\xc5\x10\xa4\x9a\xb5\x6f\x63\x0c\x7c\xe6\xd8\x02\x3d\x97\x86\x23\x46\x85\x9b\xc0\xb4\xd6\x05\x22\x49\x69\x70\x89\x03\x76\x03\x01\x40\x9c\x60\xab\x25\x17\x56\x11\xf0\xbe\x98\xb2\x3a\x8c\xd8\xac\x53\x5e\x35\x13\xbc\x77\xe1\x45\x21\x93\xda\xdf\x44\x35\xe6\x3c\x36\x29\xb6\x66\xa5\xea\x4c\x4b\xad\x36\xea\xca\xd2\x60\x14\x04\xea\xbd\x8d\x9a\x07\x95\x6e\xc2\xb4\xb7\xbb\x63\x36\xed\x75\xb8\xdf\x8f\x16\xde\x42\xc0\xfc\xae\x93\x65\x2e\x3c\x40\x7c\xbd\x45\xe8\xd4\x13\xef\x51\xe8\x54\x2d\xf6\x25\x12\xee\x79\x3e\x41\x35\x8a\x1d\xe1\x92\x46\xc6\x58\x6b\x3c\x14\x07\x41\x04\x21\xf6\xe8\x65\xc7\x5a\x9f\x4a\x6a\x47\x88\xf8\x4a\x9c\x78\x1d\x8f\x80\x24\xbf\xdb\xe2\x5b\xdc\x7d\x4b\x69\xcb\xaa\x77\x19\x62\x8c\x0b\x07\xec\x2c\x4a\x23\x4f\xff\x4a\xc3\xd4\x93\x5b\x9c\xe4\xc8\xa1\x69\x47\xab\xe7\x95\x1f\xf8\xd9\xac\x92\x15\xe3\x38\xfa\x0f\xe9\x12\x41\x76\xd1\x7b\xac\x1e\x05\x59\x2c\x43\x98\x68\xae\x5a\x4f\x75\xfd\x1e\xa8\x2a\xa4\x54\xc2\x0a\x93\x9d\xed\xa7\x29\xa0\xe1\x96\x46\xce\xbd\x82\x20\x49\xc8\x25\xc7\xe3\x1c\x6e\xfa\xd4\x5e\x30\x6f\x2d\x9f\x05\x69\xe0\x71\x73\x31\xf4\x80\x04\xc2\x6e\xbf\xe6\x8f\x38\x43\xe9\x0f\x80\x67\x03\x2d\x21\xe7\x86\xc8\x53\x9e\x01\xbe\x3c\xea\xc5\x95\x4a\x05\x46\xc8\x4b\x73\x4d\x99\x94\x56\xa7\xc4\x5f\x8c\xeb\xaa\x47\x8e\x54\x80\x07\xf9\xd3\xaf\x83\x6f\x75\x4d\xe4\x12\x3f\x2f"}, -{{0xe1,0xd1,0x41,0x65,0x18,0x92,0x1d,0x07,0xc8,0xc3,0x9e,0x29,0x73,0xd8,0xea,0x12,0x49,0xca,0xa8,0xbf,0x65,0x9c,0xc3,0x6c,0x79,0x37,0xf8,0x4e,0xce,0x7a,0xd4,0xfc,},{0x48,0xbd,0xcc,0x3f,0x1a,0x5b,0x80,0x58,0xed,0x9a,0x32,0xef,0x1c,0xc4,0x8c,0xf7,0xa8,0xab,0x76,0xa6,0xe4,0x51,0x9e,0x5a,0x82,0x85,0x52,0x41,0xad,0x6f,0xff,0x8a,},{0x42,0x32,0xd2,0xa4,0x81,0x08,0x4d,0x11,0x96,0xdb,0x62,0xf2,0x2d,0xc7,0x4c,0xf2,0xea,0xf2,0xdb,0x0d,0xf0,0x5a,0xd7,0xcd,0xde,0x67,0xbf,0xc2,0x9b,0xff,0x56,0xcd,0xe0,0x19,0xac,0x9f,0x03,0xd8,0x1f,0x18,0x27,0xeb,0x1e,0x3b,0x0a,0xbe,0x02,0x04,0xca,0x7f,0x77,0xfa,0x87,0x4a,0xb5,0x26,0x83,0x54,0xff,0x08,0xbb,0x7f,0x48,0x00,},"\x3d\x26\x3d\xe1\xab\x91\xe8\xdd\x7b\x31\x7f\x7a\x27\xfb\x60\xa6\xe1\x83\x8c\x0c\x79\x3b\x03\xab\xbe\x70\x82\xb6\xbd\xa0\xc7\xc4\x60\x62\x26\x21\x92\xc8\x8b\x65\xc0\x26\xc1\x74\x58\x4d\x29\x64\x97\x10\x42\x9a\xe4\x4a\x46\x14\x0b\x4c\x82\xc8\xa0\xb7\x4d\x56\xa0\x04\xf8\xe2\xf5\xc1\x8f\x84\xf0\x46\x41\x53\x77\x2f\x83\x12\x63\x3f\xc6\xad\x28\xa7\xd9\xfb\x55\xf7\xd7\x8c\xd6\x48\x8c\xa5\x81\x17\xea\xf9\x23\xfa\x28\x87\x5e\x2b\x31\x89\x89\x31\x85\xaa\x3c\xcd\x04\x4d\x3f\x11\x0e\x2e\x7c\xab\xdf\x6f\x81\x4b\x9f\xdd\x67\x33\xbd\x5f\x30\x7a\x87\xbc\x73\xb6\x25\x0d\x58\x83\x93\x6d\xeb\x1d\xb0\xe0\xaf\x1b\xe7\xab\x32\x9b\x5c\x6b\xd9\x35\xbd\x8f\x8d\xc8\x88\xf0\xd1\xc4\x64\xed\xbc\x02\x3c\xbc\x08\x07\x53\xee\x8f\x79\x9f\x10\x72\xba\xd1\x14\x4d\xfa\xa6\x15\xa5\x9e\x2a\xed\xc6\x62\xe8\x3c\xb1\xf8\xe5\x20\x96\xa7\xee\x48\x3b\xf8\x73\xb2\x5a\x0c\x04\xc1\x85\x1a\x0e\x87\x37\x50\x63\xaa\x1a\x94\xfa\x83\x5c\x05\x26\x40\x36\x6b\x79\xf7\x35\xd3\x28\x61\x97\xab\x32\xeb\xdb\x51\x23\xf6\xb4\x7a\xd3\xf4\x42\xc4\x4c\x53\x0a\x68\xf8\x51\x27\x59\xe9\xcf\x38\x6f\xba\x07\xb8\x06\x4b\xc8\xfe\x83\xe2\x45\x49\x5e\xc4\x5f\x89\x38\xf8\x25\x9d\xc8\x01\x62\x05\xf7\x8d\x39\x54\x44\x2e\xc1\xb4\x45\xd8\x3d\x95\xad\x18\x05\xa5\xe0\xe8\xb3\xd5\x6b\x87\x0a\x20\xda\x18\xd7\x4f\x26\xf5\x50\xa9\xc7\x53\x4a\x41\x44\xdc\xbc\x1c\x3c\xdb\xbe\x47\x0c\xc1\x53\x90\x50\x43\x08\x8f\xac\xf1\xd3\x03\x55\x9d\xe4\x1e\x96\xc0\xab\x40\x9b\xb3\x6d\xcf\x38\xcc\x90\x38\xa6\xa4\x90\x8d\xea\x82\xa6\x53\x19\x5c\x16\xf2\x90\xa7\xc3\xac\x48\x76\x36\xcc\x5b\xcb\x18\xd1\x5a\x14\xac\x62\x4c\x70\xb6\xf6\x46\x2b\xf2\x49\xe0\x00\xce\xe9\x24\x01\x8b\xdf\x7d\xde\x39\x11\x4c\xb4\xf6\x52\xe1\x22\xe8\x74\x4d\xa2\x8b\x05\x89\xe1\x28\x4d\x70\xd9\xf1\x06\xde\x16\xd0\x73\x64\x80\x80\xe6\x43\x7f\xf3\x84\xe6\x81\x77\xd5\xcb\x71\x8e\x2c\xe3\xf1\x7b\xa1\xe9\x90\xae\x3c\xe9\x40\x66\x01\x30\xe9\x37\x50\xb8\x2e\x2f\xb4\x1a\xa3\x69\x77\x45\x68\xd7\xcf\x28\x67\x25\xe3\xc5\x8f\x63\xe7\x3f\x86\x97\xae\xec\xc7\x17\xc5\xcf\x1a\xf7\xad\x74\xf4\x46\x29\x2c\x90\x5d\x84\xe2\x2b\x23\xd4\xe0\xd2\x60\x4b\xff\x48\xfe\xfc\x40\xc6\x20\x4b\x5e\x34\xc0\x42\x29\x2e\x53\xbe\xc9\x36\x01\x59\xa5\xcd\x97\xb2\xdf\x57\x86\xb8\xf5\xa2\x92\xc0\xb3\x9d\x14\xa8\x70\xa4\x58\x8e\x67\xbd\x12\xb2\xc2\xf7\xa4\x40\x84\x62\x85\x1d\x2a\xa7\x87\x97\x1d\x93\x15\x19\x0f\x42\xcc\x58\x8a\xf0\xd2\xdc\xd9\x1f\x31\xbb\x71\x5e\x92\x50\xf1\x19\x28\x14\xf7\xb8\xa2\x1f\xef\x45\x17\xb0\xcf\x8b\xb8\xa1\xa1\xa5\xf5\x00\xee\x21\x9d\xfb\x46\x13\x2e\xfe\x8e\x90\xbc\x49\x09\x3a\x55\x59\xf9\x68\x1b\x4f\xb5\x9e\x5b\xa9\xef\x3f\x05\xd3\x4e\xed\x03\x4c\x14\xd7\x7e\xe9\x5e\xbd\x76\xff\xa5\xaf\x0b\xef\xcb\xa1\x8f\xdf\x93\x2a\xf4\x85\x45\x10\xb7\x5d\xb0\x0a\x72\x57\xb2\x34\x88\x7d\x49\x60\x7d\xfd\x16\x18\x0d\xb5\x16\xc7\xa2\x0c\xcf\xca\xed\xa6\xae\xdf\xb6\xa2\x37\x7f\xbf\x31\xe6\x7b\x51\x76\x55\xdb\x73\xca\x29\xe1\x18\x62\x4d\x60\x80"}, -{{0x2b,0xf7,0x4f,0x00,0x4d,0x7d,0x0a,0xf7,0x3a,0x83,0xea,0x20,0x8c,0xc2,0x06,0x72,0x3d,0x18,0x8f,0x4c,0xf6,0x07,0xbc,0xad,0x4b,0x69,0x80,0x26,0x8f,0xf2,0x1f,0xa7,},{0x8f,0xdc,0xd9,0x93,0x52,0x43,0x8b,0xeb,0x52,0xf0,0xd1,0x74,0x2b,0xae,0x71,0x84,0x45,0x12,0xdd,0x06,0x85,0xaa,0xf1,0xc9,0x09,0xe3,0x8f,0xc4,0xb5,0xaa,0xb6,0xcc,},{0x3e,0xb5,0xb3,0x39,0xe1,0x91,0xa3,0xb6,0x16,0x85,0x45,0xda,0x5f,0xb0,0xca,0x9b,0xe2,0x09,0x04,0x39,0x19,0xb9,0xc7,0x0a,0x07,0xb4,0xa7,0xa3,0xbf,0x64,0xb1,0x02,0xf6,0xff,0xd6,0xd2,0xb0,0x25,0x59,0xdc,0x68,0x1e,0xd3,0xb9,0xc8,0x22,0x97,0xb2,0x01,0xdc,0x25,0xc4,0x97,0x38,0x80,0xe1,0x55,0xe1,0x3a,0x29,0x42,0x6e,0xb4,0x0d,},"\x89\x8e\x43\x03\xea\x5b\xeb\xd2\x00\xa5\xf7\x56\x2b\xe5\xf5\x03\x26\x40\xa3\xf5\xcc\xfa\x76\x42\x92\x04\x5a\x1a\x36\x8d\x02\xaa\x59\x10\x77\xd8\xf3\x04\xf7\x4d\xbd\xfc\x28\x07\x34\x45\x4e\xd8\xc2\x72\x7a\xff\x39\x2c\x10\x8c\x52\x6e\x52\x7e\x67\x2c\x53\x97\xb2\xd7\x7c\x01\xf7\x74\x1e\xf8\xdc\xc2\x51\x0e\xe8\x41\xb5\x9d\xd1\x0f\x4e\x1d\x3a\xc5\x01\xaf\x7c\xbd\xb8\x5b\xa3\x11\x29\xc2\x62\xfd\xe1\xa0\xc8\xbc\x83\xd6\xff\x94\x4b\x6b\xae\x3f\xa7\xfb\x62\x58\x7c\x68\x1d\x8e\x34\x29\x65\xc5\x70\x5f\xd1\xa6\xab\x39\xe5\xa0\x77\x0e\xe7\x79\x8d\x9f\xb6\xc0\x01\x8a\x51\x4d\x53\xaf\x84\x8d\xb6\x04\x7c\xd0\x2d\xb3\x52\xd5\x56\x3b\x53\x66\x23\x73\xb9\x71\x93\x5a\x1a\xc2\xb7\xb6\x36\x1d\xac\x67\x48\x77\x18\x13\xf7\x74\x93\x16\x69\x49\x61\xb9\x40\xff\x38\x05\x81\x1a\x49\xfa\x27\xa9\xba\x45\x7a\xd2\x88\x48\xc6\x97\x05\x0e\x01\x88\xd0\x77\x3e\x17\xfb\x52\x19\x4e\x19\x0a\x78\x72\xa3\x98\xf3\x1c\x0f\x0a\xe0\x65\x37\xa2\x73\xff\xb5\x0c\x2c\x81\x64\x45\xab\x88\x28\x11\x92\x2c\x06\x21\x55\x6c\x46\xa3\xa0\xec\x40\xbf\xed\xb4\x11\xe9\x0b\x6d\xb1\xdd\xd4\xbb\xeb\xb5\x7d\x10\xdf\x56\x6a\x63\xd7\x26\xa3\x33\x08\x51\x4c\xe3\xb4\x99\xd5\xe5\x26\xc2\x2b\x95\x6d\x8b\x99\x91\x3d\xcb\x13\xe4\x37\xe9\x47\xb6\x66\xc4\x1c\x54\xd8\xb3\xae\x23\x56\x64\x7e\x80\x17\xab\x67\x83\x86\xc9\x27\x21\x9a\xe7\xbd\xdc\x0d\x82\x12\x65\xf9\xdc\x4f\xf3\xf8\xce\x5b\xe6\x0f\x8e\x9d\xef\xc5\xca\x33\x50\x68\xee\x29\xfe\x83\x04\x91\x7b\x78\x87\x84\xa2\x38\x8a\x32\x01\x92\xf9\x32\x5d\x0e\x6c\xff\xfe\xa2\x1e\x6e\xaa\x29\xe7\x70\x7f\x63\xa9\xea\x4f\xbb\x25\x58\xe3\xd0\x83\x5b\xab\x1f\x52\x36\x10\x37\xae\x59\xe5\x03\xee\x96\xb9\xd7\x08\xa4\x7a\x3a\xe4\xba\xd1\x13\xe2\xa4\x60\xa2\x69\xcc\xf2\x5a\x00\x03\xcb\x3e\x68\xa5\x51\x86\x4e\x59\x84\x09\x14\x79\x11\x26\xf9\x54\x78\x8b\x25\xb5\xaf\x5a\xaf\x58\x6e\xbb\x87\xfa\x5f\x37\x7b\x4d\x7d\x7f\x84\xc0\x00\xdd\x2c\xb4\x40\xe2\x14\xd3\x8d\x5e\xcf\x70\xf2\x0e\x98\x81\x82\x8e\xda\xa1\xdb\xec\x37\x09\x3d\xb9\x60\x68\x6c\xa1\x23\xf1\xec\xba\x63\x36\xb3\x7f\x46\xcf\x76\x5b\xe2\x81\x4b\x9e\x67\x05\xbc\x9d\x6a\x49\x31\x81\x18\xc7\x52\x9b\x37\xc8\x4e\xc8\x8d\x58\xa8\x45\x3d\xcb\x69\x2c\x9a\x36\x01\x6b\x94\x8e\xbe\x6f\xb2\xc1\xd0\xad\xf5\xf1\x98\xee\x30\x97\xa6\xff\x0b\x8e\xeb\xba\xd8\xb0\x76\x93\x30\xb1\x86\x89\x51\x6b\xc0\xfe\x66\x8b\x0d\x05\xe3\xa5\x84\xfc\xf8\x9c\x49\xdb\x50\x1d\x61\xc2\xde\xf7\xed\x37\x22\x07\x01\x93\xa5\xb6\x83\xc5\x08\x7e\xf2\x74\xce\x6a\x19\x3d\xd4\xa3\x03\x53\x6c\x67\x93\x4b\x46\x60\xa8\x41\xee\x1b\x44\x6a\x68\x92\xb1\x4d\x0b\x0a\xa3\xe9\x8f\xdf\xfd\x43\xc7\x97\xad\xd3\x65\x83\xf7\x4c\x94\xd0\xe2\xd6\x8e\x2d\xe8\x18\xd9\xaf\x20\x05\x98\xf0\xb2\xbe\xae\x16\x9c\x8d\xfb\xc4\xd3\x97\xe6\xd1\xce\xb6\xda\xa6\xc9\xf6\xbb\xf4\xf8\x31\x1b\xa2\x6f\xfb\x19\x4d\x44\x21\x6c\x51\x30\x52\x67\x07\x4e\x85\x6a\x1d\x6e\x92\x27\x80\xf4\x79\x8e\x2f\x22\x02\x23\xff\xf1\xdc\x37\x0c\x8e\x34\x51\x4a\xba\x42\xdf\x51"}, -{{0xf5,0xf7,0xd5,0xb7,0x3c,0x5a,0x65,0x30,0x1b,0x5b,0x4c,0x67,0x10,0xed,0x12,0xc1,0x6e,0x79,0x03,0x17,0x7d,0xb7,0x92,0xca,0x71,0x5e,0x23,0x38,0x9d,0x05,0xd8,0x3e,},{0x7c,0x47,0x62,0xe9,0x79,0xf0,0xc7,0xe2,0x07,0xbe,0x18,0x43,0xe2,0x66,0x6a,0xca,0x27,0xea,0x89,0xbf,0xf5,0xb6,0x1d,0x57,0x3c,0x98,0x5f,0xc7,0x02,0x5e,0x1e,0x28,},{0x58,0xfb,0x39,0x2f,0x82,0xd5,0xe5,0x2f,0xf0,0x72,0xcc,0x77,0xef,0xe0,0x48,0xf2,0x23,0x52,0x50,0xc7,0x11,0x25,0xee,0x82,0x1c,0x5f,0x3b,0x39,0x3b,0xcf,0x2f,0xa4,0x6b,0xe4,0xc5,0xd8,0xca,0xf1,0x3c,0xb5,0x19,0xef,0xe0,0xc2,0xfa,0xd9,0xee,0x23,0x1a,0xe9,0xb6,0xfd,0x1f,0xd5,0x09,0xc9,0x8c,0x69,0xc2,0xd3,0x6c,0x75,0x3e,0x0e,},"\x7c\x93\x18\xd5\x6e\x63\xf1\x65\x35\x43\x6f\xa4\x5a\xfe\x27\x8e\x74\xe6\x18\x81\xbb\x46\x89\x97\xd0\x41\x8b\xc7\x20\xb6\x30\xda\xdb\x81\x28\xb4\xb6\x5c\xa6\xe9\x21\xe5\x01\x81\x3d\xf9\xfe\x03\xb4\xef\x0a\xae\x80\x35\xdd\x08\xc5\xf8\x20\xce\x5d\xf1\x2e\xe1\x18\xd9\xc3\x6d\x3b\x15\x1a\x52\xc3\xf9\x6a\xe1\xca\x4c\x82\xfd\x19\xda\x66\x9d\xdb\xa9\x4f\xeb\xf8\xea\xc8\xc4\x2b\x44\x7b\xab\xc8\xa6\x0b\x36\xe8\x03\x62\x4f\x7d\x20\x47\xbd\x8d\x8a\x15\x36\x87\xf1\x0d\xc1\xca\x82\x10\x0b\x7c\x87\xd3\x23\x70\xec\x8f\x26\x71\xed\x7d\x06\x7c\xc8\x05\x87\xca\xb8\xdb\x3a\x71\xce\x5e\x40\x63\x27\xf7\x63\xec\x1b\x3c\x16\x67\x70\xa7\x55\x36\x63\x0c\x81\x5f\xd8\x26\x75\x82\xd1\xb5\x05\x1f\x0f\x82\x1c\x02\x15\x0b\x2e\xef\x34\x9b\x50\x59\x03\x14\xaa\x25\x70\x79\x3f\xa6\x4a\x76\xed\x2e\xd8\x3d\x2b\xa1\xf9\xb9\xf1\x16\x31\x54\x61\x2b\x49\xa6\x4a\xd8\xd5\x57\x3c\x25\xb1\xcd\x37\xc4\x1a\x44\xe3\xdf\x78\xf1\x05\x3d\x90\xb0\x68\xf0\xd3\x7a\xe0\x0c\x4a\x32\xb1\xa3\xff\x87\x4c\x41\xda\x4a\x70\x43\x39\x2f\x18\xef\xe5\x51\x8d\x76\xe8\x8b\x41\xce\xd6\x9e\x6f\x4c\x01\x4f\x06\xeb\xc5\x14\x6e\x61\xe8\x2f\xae\x1c\x49\xc3\x7c\x39\x4f\xea\x34\x19\x9a\xb8\x6c\x11\xa4\x46\x7a\x37\x4e\x40\x25\x5a\x05\xd4\x26\x97\x14\x30\xd5\x6c\xdb\xa2\x5a\x21\xad\x77\x9c\xc7\xf6\x2d\x22\xcd\x87\xb6\x0f\x08\x91\xbd\x85\x6a\x51\x7e\x14\xb7\x2a\x9a\xc7\x67\x2e\x4e\x8f\xb3\x74\xa9\x75\x8a\xb0\xc4\xe5\x96\x4a\xae\x03\x22\x89\x73\xf1\x73\xa5\xd4\x2a\xef\x9d\xb3\x37\x36\xc3\xe1\x8d\x8e\xec\x20\x4a\x1a\x17\xb9\xd0\x45\x93\xde\xa4\xd8\x04\xcb\xc8\x1b\x9a\xc5\x45\x80\x50\x49\x55\x39\x99\x9a\x99\x85\x48\x7e\x7c\xa1\x1c\x37\x58\x2e\xf8\x5c\x84\x1e\x8f\x06\x5e\xa9\x8f\xdd\x6b\x1c\x60\xde\xa1\xec\x28\x83\x52\x15\x68\x85\x6a\x6e\xbb\x27\x49\xf2\x07\x2e\xb4\x34\x48\xbe\x07\x05\xed\x47\x7c\xf4\xb2\x00\x48\x65\x21\x7d\xe5\xfa\xdb\xe2\xa0\xf9\xd6\xb8\x4b\x3f\xe7\xf7\xbf\x6c\x77\x53\x74\x96\x24\x6e\xc7\x96\xb8\xef\x2c\x04\xf6\x8a\xb5\xb1\x4f\xce\x0c\x6d\x28\x7b\x83\x62\x27\xd9\xf0\x8f\xa0\xee\x19\x72\x2f\x67\x98\xa5\xd8\x28\x0d\x10\x7c\xfc\x1b\xd5\x92\xd9\xdd\xc7\x24\xea\x86\xfc\x39\xdc\x94\xa3\x94\x01\x9e\x3a\x3d\xe9\xe0\xd1\xc7\x35\xe8\x62\xde\x2b\xb9\x52\x5b\x5f\xb4\xbd\x12\x12\x12\xbf\xaf\xf9\xff\x58\x6a\xc3\xc7\x5c\x5a\xce\x74\x6d\x9c\xa3\x07\xf7\x95\xff\x26\x97\xf2\xb4\x1a\x63\x46\xed\x23\x39\x7e\xb3\x88\x98\x69\x1e\x6f\x66\x84\x16\x37\xd0\xab\x0d\x96\x83\x09\xe0\x19\x40\x02\x30\x90\x15\x41\x6e\x74\x47\x2f\xe3\x24\x25\xd4\x5f\x07\xc7\x71\x19\x18\xb1\xe5\x79\x0f\x57\x2c\xe4\x44\x10\x42\xd4\x26\x03\x37\x92\x29\x7b\x5f\x81\xe0\x80\x9b\xd9\x69\x1f\x0a\x50\x5e\x32\x59\xfc\x03\xc9\xff\x10\x7e\xb9\xb4\x87\x95\xf4\x9f\xb0\x9c\x1b\xab\x56\x59\xd3\x9f\xfe\xcb\xdc\xc4\x03\xe3\x80\x3d\xc0\x12\x43\x8c\x2f\xb3\x6f\x68\x30\x15\xc5\xdf\x04\x82\xcb\x7d\x7f\xc5\x75\x73\x64\xa0\xa3\xc1\x0d\x0e\x12\x59\xc0\x1f\xcc\x4d\xd5\x49\x4b\x52\x90\xa6\x94\xae\xa3\xf6\xfa\xe5\x47\xac\x57\x6f"}, -{{0x43,0xd4,0xbe,0x6d,0xe9,0xcb,0x00,0x89,0x8e,0x99,0xdd,0xcc,0x2e,0x15,0x30,0x11,0x0f,0xa2,0xcb,0xc4,0x37,0x6c,0x48,0x5e,0x9c,0xa5,0x7f,0xd6,0x55,0x86,0xd8,0xa3,},{0x36,0x32,0xad,0x38,0x9b,0xe2,0xfa,0xb3,0xfb,0xa0,0xd8,0x04,0xbf,0x63,0x45,0xcd,0x32,0x2e,0xdd,0xd6,0xa7,0x5d,0x8c,0x37,0xfd,0x4b,0x5b,0xa1,0xc9,0xc2,0x5e,0x8f,},{0x86,0xae,0x93,0x25,0xf8,0x0b,0x98,0x86,0xc8,0x38,0x1f,0x96,0xa1,0x8c,0x21,0x20,0xe6,0xdb,0x01,0x6a,0x0d,0x6c,0xa2,0x82,0xed,0x93,0xba,0x9b,0x61,0xca,0xec,0x02,0xde,0x88,0xef,0xca,0x8b,0x8e,0x91,0x6a,0x4b,0x16,0xa5,0x85,0x25,0xa2,0xf6,0x8d,0x21,0xe5,0xfb,0xe6,0x7d,0xb4,0xc4,0xd6,0x20,0x95,0x95,0xc4,0xab,0xc3,0x2b,0x09,},"\xd9\xd5\x5d\xab\x0f\xa6\xda\x76\xb6\x8e\x84\x1c\x24\xd9\x71\xba\xc1\xf7\x9a\xf5\x13\xd8\x34\xe4\x26\xa5\xd0\x81\x14\xce\x8b\x54\xce\x8b\x7a\xfe\x01\x6b\x0f\xad\x03\xee\x74\x50\xc6\xc3\x09\x71\x73\x68\x1a\x4b\x2e\xb9\xf9\xc1\x79\xa8\x8e\x7c\xc3\x68\x13\xf2\xf5\xd1\x5f\x79\x98\xaf\xa9\xfd\x4e\x54\x6c\x73\xbb\x42\xe7\xf9\x52\x2b\xe6\xaf\xab\xca\x8c\x7b\x64\xfe\xd0\xe2\x92\xe4\x37\x5f\x3e\x1e\x5f\xd9\xfc\xb5\x39\xf4\xe5\xe5\x43\xfb\x6a\x11\xa0\xdf\x32\x1e\x70\x08\x4a\xaa\xbb\x70\xa9\x95\x0c\xee\xe3\xd8\x79\xc3\x86\xef\xca\x1e\x59\xc3\xcb\x7c\x45\xb5\x60\x09\x5e\x7a\xf0\x0f\xf5\x2f\x8a\x1a\xaa\x9c\xcf\x09\x2f\x0b\xb8\x06\xd9\x76\x10\x74\x2a\xc5\x82\xa3\xab\xbe\xdd\xf3\x9f\x49\xd2\x29\xd3\x2a\x11\x86\xd0\x21\x51\x8d\x74\x72\x8d\x13\xd9\x62\x63\x5d\x63\xba\xa6\x74\x3b\x12\x6b\xf4\x58\xfa\x2a\xc7\x56\xfb\xf8\x80\x96\xc8\xd3\x34\x0c\x62\x23\x90\x53\x4a\x74\x3f\x18\x64\xd5\x4d\xea\xb5\xe5\x53\x63\x72\xce\x5a\xc9\x37\x62\x28\x74\x14\xea\xe1\x58\xa7\x6b\xf8\x1d\xf5\x41\x7c\xf4\xc0\x47\xbe\x3a\xc1\x47\x5c\x51\x7e\xbd\x3a\xc1\xd1\xd1\xbd\xda\x11\xb3\xf9\x9c\x18\x17\x3e\x03\x0a\xcd\x51\xd2\xb5\xcf\x79\x51\x65\x09\x41\x54\x05\x07\x75\x11\xbd\xd9\xcb\xe1\x7d\x04\xf4\x78\x05\xe9\x8d\x0d\x14\x5e\x60\xa5\xd0\xe0\xf4\x53\xcd\x9b\x5c\x1a\x24\xf1\x2b\x75\xe8\xcc\x34\xd5\xe0\x06\x91\xff\xac\xbf\xf7\x88\xfe\xa8\x34\xd9\xd7\x79\xc1\xe6\x10\x29\x4d\xce\x19\x17\x0d\x28\x16\x0c\xff\x90\x9b\xea\x5a\x0a\xa7\x49\x40\x17\x40\xea\x3a\xf5\x1e\x48\xb2\x7c\x2b\x09\xf0\x25\x44\x42\x76\xc1\x88\xc0\x67\x1a\x6d\xa9\x4b\x43\xd1\xe5\x25\xe6\xa4\xa8\xa1\xa7\x3d\xfe\xdf\x12\x40\x18\x46\xba\x43\x06\x8a\x04\x09\x2b\x12\x91\x22\x70\xd2\xb6\x0d\xf6\x09\x97\x79\x75\x6b\x8b\xbb\x49\xec\xe8\x2d\x55\xf0\xf8\xdb\x1b\x80\xfb\x4b\x59\xbb\xa8\x60\xbd\x18\xc7\x5d\x6c\x83\x4d\x69\x44\x2a\xe0\x31\x4c\xf2\x39\x9f\x53\x92\xa3\xc6\x72\x8c\x63\xe5\xc5\x16\xc4\x22\x2a\xac\x60\xf9\x16\xdd\x63\xd1\xd0\x51\x7e\x8e\xb1\x0b\xd0\xe1\x5e\xb9\x06\x14\xde\xb2\x96\x40\x3a\xd1\x5b\x8c\x12\xb9\xe9\x71\xef\x2f\x01\xe5\x9f\xc3\x5d\x90\xc5\x5a\x8e\x20\xe9\x43\x7d\xd4\x34\xb2\x6d\x5c\x2c\x6e\xc2\xd5\x3a\xce\xc1\x7e\x81\xe4\x78\x31\xdc\x2d\xe8\x21\x83\xd7\x13\xb5\x9a\x4d\x1f\x46\x96\x9d\xdc\xdd\xaf\x27\xf4\x4e\x5a\x31\x1a\xaa\xc3\x9c\x3d\x5a\x97\xbc\x90\xca\xd7\x12\xf4\x6f\x85\xe6\xc8\xfb\xf5\xd5\x8d\x8b\xc3\xec\x27\xd3\x10\xa9\xea\xf2\xc3\x69\xcb\x00\x64\x97\x70\x39\x0a\x3f\x98\x8f\x36\x2e\xfc\x15\x5f\x56\xa1\x46\xa6\x26\x50\x54\x7e\x91\x53\x25\x07\x01\xee\xad\x1b\xd0\x1c\x89\x46\x22\x72\xdf\xaf\x0a\x43\x1a\xf4\xbd\x7c\x3d\xb4\x51\xad\xa6\x03\x23\x3f\xda\xd3\xaa\x89\x99\xaa\x21\xe2\xd3\xa4\x3b\x0b\x56\xfc\x6a\x91\x24\xd3\x35\x98\xb3\x73\x7f\x4e\x5c\xb2\x58\xbe\xda\x75\x6a\xd2\xe1\x7d\x06\x91\xd1\x5d\x41\x6b\xb7\xcb\x07\xec\x8d\x8c\x7a\xf5\xde\x80\xe5\xb9\x39\x4e\x32\x0c\x4c\x6e\x43\xef\xaa\xe6\x84\xad\x00\xf6\xdd\x20\xa8\x75\x0e\x95\x9c\x2f\x04\x20\x6f\xc0\x23\xaa\x19\x0c"}, -{{0x7d,0x01,0x0d,0x76,0x0f,0x24,0xe5,0xa2,0xde,0x34,0x08,0x9c,0x9f,0xdb,0x19,0xc3,0x3b,0x15,0x5b,0x0a,0x37,0xca,0x45,0x5a,0x5e,0x5b,0x1d,0xae,0x7a,0x07,0x31,0x76,},{0x4c,0x87,0x7b,0x3c,0x49,0x71,0xfb,0xb5,0x51,0x16,0x6e,0x21,0x4d,0x1c,0x76,0x24,0xc5,0x22,0x77,0x90,0x3c,0x59,0xa5,0x62,0xa8,0x0b,0x91,0xa8,0x54,0x83,0xfb,0x47,},{0x55,0x70,0x61,0x38,0x79,0xae,0x22,0x77,0x8b,0xd5,0x4f,0x14,0xfb,0x6e,0x8c,0x02,0x56,0xa7,0x1f,0x3d,0x79,0xc3,0xe5,0xcd,0x8e,0x41,0xae,0xa8,0xcf,0x77,0x3e,0x24,0xd2,0x9f,0x1f,0x1b,0x24,0xf8,0xc8,0x0d,0x29,0x49,0xe8,0x20,0x14,0x65,0xdb,0xde,0x89,0x40,0xb1,0xfa,0xb6,0x48,0x3b,0x08,0x5d,0x41,0x8e,0x25,0x10,0x14,0x20,0x0c,},"\x86\xe2\x11\x55\x72\xbf\x4c\x01\x3e\x6b\x4b\x04\xd0\xb0\x3e\x60\x6e\xe7\x0d\x92\x9c\xb8\xec\x36\xf4\xe2\xf3\x55\xdb\x3b\x5e\x15\x73\xd6\x58\xd1\x7b\xb1\xa3\x10\xc1\x69\x89\xa1\x6b\x95\x58\x92\x2e\xe4\x93\xf3\x59\x04\x21\x03\xc4\xdc\x1b\x40\xdf\xf7\x70\x99\x01\xfd\x58\x30\x13\x3f\x42\xc4\x65\x1e\xca\x00\x8b\x49\x9e\xe4\xf8\x4c\xd4\xec\x1e\xda\xa7\x82\x56\xed\xb6\x2f\x24\x02\x1a\x00\x76\x25\x69\x19\xe4\xe2\xce\x0a\x5a\x20\xf9\x21\xc2\x78\xcc\x29\x91\x59\x64\x4b\x5e\x3a\x3b\xbd\x08\x9d\xcb\xbe\xba\xd3\x76\x6a\xea\x77\xe9\xf0\x8e\xe5\xf7\xd4\xc1\x9d\x81\x70\xbc\x3d\xe1\xba\x77\x9a\x76\x99\x14\xf9\x65\xdb\xde\x2b\x61\xba\xd2\x14\xc5\x08\x18\x60\x41\xf7\x6c\x25\xbe\x95\x76\x56\xf5\xcf\xb7\x33\x4e\xb8\x38\xa3\xcf\xbc\x55\xcf\xba\xb6\x7a\xdf\x15\x52\x61\x99\x41\xb8\x35\xcd\x3e\x34\x10\x3b\x18\xb4\x91\x31\xe8\x20\x96\xf0\x5f\x57\x0b\x89\x98\x04\xba\xb8\xb6\xcb\xad\xdb\xbc\x02\xf9\xf3\xb5\x59\x73\x6d\x99\xca\x7b\x02\xd3\x26\x8f\xa2\x73\x99\x6f\xcf\x05\x71\x97\x7d\x1c\xc3\x00\x8c\x4e\xf8\x48\x97\x0e\xe3\x50\xb1\x58\xc4\x7e\xc2\x77\xad\xd4\x74\x2f\xa2\xbc\xbe\xa9\xbd\x55\x49\xc7\xbc\xa0\x38\x02\x0e\xce\x68\xf1\x88\xc1\xea\x3a\x62\xdd\x9a\x07\x3d\x4c\x13\x8c\xa8\xa9\xac\x04\x08\xdc\xfd\x46\xe3\x6b\xdf\xf7\x39\x88\xa5\x8b\x96\x17\xca\xa0\x8b\xd4\x1b\xf3\xe8\x12\xe7\x82\x4f\x0f\x7e\x81\x46\xa4\x44\xf3\x6b\xf5\x3a\x1c\xd8\x92\x03\x9c\xcd\x33\x5f\x5a\x2e\x79\x74\x5e\xac\x96\x14\x8c\x2a\x29\x99\x47\xf1\xb2\xe3\x28\xa3\x78\x9b\xf1\x3c\x6d\x73\x50\x6f\x3b\xdc\x68\xea\x48\xab\xf0\x02\x27\x0f\xe4\xee\x9e\xf9\xed\x6b\x10\xc2\xfb\xb4\xff\x12\x75\xb9\xd7\xdd\x35\xd8\xa5\x2e\x37\x17\x58\x57\x4c\xb4\x66\xc5\x7b\x5a\xbc\x24\x29\x76\xbe\xfc\x8d\x98\xa0\x13\x1b\x9b\xb8\x46\xb2\x19\xe4\x66\x91\x86\xa8\x3c\x05\x6c\xd8\x08\x06\x61\xde\x16\xb5\x1c\xe5\x76\x7b\x22\xe9\xa9\x32\x42\xbf\x8d\x32\x05\xc6\x6a\x67\x3c\xe7\x83\xd1\xc0\xd3\x7b\x63\x00\xfb\xf0\xd6\x12\x79\x40\xf8\x8f\x18\x19\xc4\x50\xdc\xc9\x05\x43\xed\x79\x4f\x1f\xd4\x4e\x65\x39\xfe\xba\xf1\x9a\x4c\xc9\x88\x70\x01\x4d\x7c\xca\xd7\x4d\x18\x76\xa1\x23\xec\xd1\x45\x51\x6c\x74\x3b\x4b\xba\x62\xd8\x21\xca\x9a\x79\x51\xe0\xdf\xb2\x3f\x38\xd9\xe3\xa3\x65\xfd\x83\x22\xf2\xee\x47\x99\xe9\xff\x11\xe1\xc5\xc3\x0b\x55\xa3\x55\xc8\xa5\xde\xea\x81\xa5\x45\xe3\x47\x05\xab\x56\xd1\x7b\x1f\xa0\x6e\xd7\x64\x15\x55\x67\x02\xf3\x64\x80\x82\x46\xf8\x63\xc3\x19\xf7\x5c\xdf\x6b\xd7\x48\x43\x8d\x1a\x2e\xaf\x42\x06\xc5\x60\xbf\xaf\xc2\x35\x67\x9a\xd6\x04\x9c\x1a\x01\x52\x6f\xcb\x9a\x3c\xe1\xb1\xd3\x9b\xe4\xdf\x18\xb1\x5f\xa0\xea\x55\x27\x2b\x17\xeb\xde\xdf\x6c\x30\x49\x8a\x8a\x14\xf2\x04\x2b\xe1\xc2\xcd\xb0\x9e\x9e\xf3\x84\x6d\x66\x59\xa9\xf6\xd6\x73\xdf\x9a\xfb\x7e\xde\xd0\x4b\x79\x3d\x97\x31\xf0\xac\xcc\x41\x46\x8d\xc1\xf3\x23\x6c\x99\xac\xad\xee\x62\x39\xc3\x61\xb8\xbd\x7e\x2d\x0c\xfe\x8b\xb7\xc0\x66\x87\xe0\x8e\x76\xb7\x1a\xd5\x7a\x03\x61\x79\xf2\x91\xd0\x96\xae\x2f\xa0\x81\x8e\xf4\xbf\x48\x66"}, -{{0xaa,0xaa,0xbb,0x7c,0xe4,0xff,0xfe,0x4d,0xc3,0x57,0x47,0xba,0xea,0x2b,0xc5,0xf0,0x50,0xbe,0xf0,0x6e,0xe0,0xc1,0xfd,0x63,0x2a,0x06,0x7f,0xec,0xe1,0xef,0x4f,0xb5,},{0x82,0x0a,0x24,0x42,0xd5,0xf4,0x5f,0x3c,0x79,0x14,0x78,0xe0,0x98,0xfb,0x3b,0x06,0x8d,0xa5,0x2e,0xc4,0xe8,0xda,0xde,0xc8,0x50,0x65,0xc3,0x56,0x59,0xf4,0x37,0xe0,},{0x05,0x0a,0xe8,0xae,0xce,0xec,0x96,0x27,0xb8,0x01,0x37,0x35,0x7a,0x22,0x96,0x2a,0xc8,0xb4,0x50,0x48,0x66,0x17,0x08,0xd3,0x94,0xd0,0xa5,0x1a,0xad,0xc3,0x81,0xfe,0x85,0x35,0x02,0x3d,0x6e,0x1b,0xda,0x0e,0x72,0xb3,0x49,0xb5,0x0b,0x26,0xda,0x7c,0x3a,0x30,0x85,0xe8,0x1e,0x9d,0xd6,0xcf,0x12,0x78,0x68,0xfc,0x5b,0xae,0xab,0x01,},"\xf9\xd2\x85\x97\xa3\xe2\xb6\x4b\xa3\x27\xac\x5c\xd2\x9f\x08\x1e\x74\xbf\x46\x1b\x2e\xb2\xd3\xcf\xd9\xd5\xe9\x21\x58\xd2\x1d\x1d\x2a\x47\xab\x50\x98\x1c\xb1\x9f\xe3\xf8\xc6\xfe\x48\x82\x49\xb1\xc4\x9f\xb8\x97\xa0\xfe\x21\xab\x54\x04\x41\x4f\xd9\x14\x87\x5c\x22\x0f\x1c\xbc\x12\xf5\xc3\x8c\xfb\xa7\x9f\x7a\xc3\x03\xa5\x23\x1a\x37\x2b\x02\xfa\xd6\xc8\x46\x2f\x8c\xc4\x9f\x0f\x64\x96\x5b\x65\x1d\xcc\xef\x0b\xb9\x60\x82\x15\x09\x08\x49\x17\x7b\xe4\x7b\x2d\x30\x72\x94\x4d\x36\xe8\x56\xda\x18\x5c\x7b\x3a\x68\x9f\x7e\xde\xf9\x88\x33\x8e\x09\x63\xed\x31\xa6\xb0\xa8\x0d\x5c\xb0\xb1\xcc\xcf\x6f\x39\x48\x37\xaa\x6f\x8b\x2f\x3d\xa5\xef\xbd\xf4\xd3\x60\xd4\xbf\x4d\xd7\x08\xce\x64\x45\x58\x7d\x94\x2b\x79\x76\x1c\xe9\x51\xb1\xbb\x4d\x90\x50\x70\x36\x18\xa6\xd9\x30\xa8\x0c\x69\x57\x6f\xc4\xaf\x30\x6a\x2a\x56\xdb\xd8\x84\xa0\x5a\x1e\x4e\x9f\x31\x36\xcd\x0b\x55\xae\x47\x4b\xb5\xd3\xd0\xfb\xc9\xb0\x33\x9c\xec\x34\x4f\xdd\x08\x5c\x19\x28\x10\x14\x81\xc6\x87\x94\xf5\xc8\x90\x13\x71\x08\xce\xa7\x91\xd2\x1f\x81\x68\x3d\x3e\x1a\x9e\xec\x66\xac\xe5\xc0\x14\xd8\x9e\x69\x80\x8e\x5f\xa8\x3d\x38\x12\xee\x68\x0f\x5a\x99\x71\x68\x1b\x8a\xdc\xd4\xa1\x6e\x9a\x4c\x16\x5b\x5e\xf9\x93\x2c\x5e\xd8\x25\x23\x7f\xd5\x03\x7b\xcb\xef\xe4\xcb\x11\x56\x4f\xa7\x07\xc8\xa9\x32\x90\x75\x14\x14\x89\x1b\x1e\xdd\x33\x13\xc6\x5f\x8b\x91\xc2\xe9\x25\xa3\xc1\x2a\x9d\x3a\xa4\x5f\xd5\xa6\x67\xb7\x83\x93\xc3\xe3\x9d\xf8\x8a\x8f\x0d\x11\x48\xb5\x31\x1e\x3d\x87\xc4\xa9\x2e\x0a\x3f\xb9\x15\xbc\x90\xd5\x55\x8d\x05\xb4\x75\xa8\x83\x47\x78\xaa\x94\x3e\xa3\x9b\x8e\xaa\x95\xad\x18\x32\xe5\x91\x6e\xa3\x10\x2d\x7d\xe0\xb8\x36\xcd\xe8\xf3\x75\x9d\xbb\x3b\x9d\x56\xea\x81\x7b\x3e\x49\xc9\x83\x21\x02\x77\xc2\xc7\xc5\xb0\xdb\x18\x74\x22\x53\x2f\xca\x98\xa2\x8b\x3b\x65\x9c\x6b\x81\x5a\xc1\x26\xfa\xdb\xe2\xf4\x00\xc7\x3e\x9d\x2d\xed\xcb\xbd\x2d\x3a\x36\x5f\xfa\xd7\xe6\x66\xc8\x96\xe3\x1e\x61\xb3\x84\xed\x3a\x9f\xcf\x12\x90\x53\x8d\xf1\x1b\x94\x74\xc6\x28\x1c\xc5\x92\xc7\x1c\x88\x08\x86\x8b\x42\x92\xc1\x7e\xce\x6b\x3e\xdf\x5e\x35\x42\xa7\x0b\x91\x15\x93\xe9\x3f\x35\xec\xd9\x72\x9b\xd8\x88\x0a\x24\xea\xf4\x1f\xbc\x65\x74\xdf\xe1\x67\xec\x2d\x0e\x7a\xb3\xdf\x5e\xc3\x4b\x8b\x55\xd5\x48\xab\x93\x73\x8a\x2e\xea\xf2\x1c\x88\x4c\x5c\x85\x51\xdb\x2e\xdf\x2b\x04\x9f\x1a\x2a\x84\xfa\x72\xac\x89\x78\xa4\xc2\x78\x09\xf2\x09\xc1\xb2\x19\x5a\xff\x50\x4f\x69\x98\x56\xcc\x4f\x22\xd4\x4e\xbd\xd0\xfe\x50\x37\x44\x68\xd0\xb1\x79\x2e\x57\x4b\x51\x10\xa1\xf4\xcd\x0e\x22\x1e\x82\x4a\x78\xdd\xc4\x84\x5f\xeb\x46\xd6\x6d\x63\x3d\x23\xcd\x23\xf4\xb6\xfb\xe4\xc8\xce\x16\xcd\x1a\xf6\x15\x36\xda\x5f\xa6\x7b\x10\xac\x75\x55\xa6\x8c\x0e\x0b\xdb\xf2\xf8\xd7\x23\x09\xd9\x95\x51\x6b\x81\x18\xbf\x43\x83\x5d\x0a\x01\xc0\x8f\xfe\xba\x3e\xa3\xed\x05\xcd\x2d\x54\xf0\xea\xbc\xda\x05\xd0\x03\x7d\x52\xca\xed\x3b\x19\x37\x4f\xaf\x73\x99\x90\x94\xf7\x90\x55\x92\x4b\xea\x9a\xec\x44\x70\x13\x5f\x5e\x8b\xf1\x83\xc9\xd1\xc9"}, -{{0xe9,0x5c,0xc2,0xa4,0xd1,0x19,0x3b,0x75,0x39,0xfc,0xbb,0xea,0xae,0xed,0x98,0x5b,0x6f,0xb9,0x02,0xdd,0x0e,0xfb,0xd6,0x38,0x74,0x57,0x55,0x0d,0x0d,0x6a,0x2f,0xea,},{0x72,0xa1,0xff,0x1e,0x9b,0xb1,0x1c,0x8d,0x88,0x96,0x8a,0x7b,0x16,0x96,0x37,0xad,0xee,0x43,0x8e,0x22,0x63,0xf0,0x06,0xdc,0xa4,0xfe,0x02,0xfe,0x06,0x6c,0xba,0xd3,},{0x1b,0x8d,0x7c,0xc2,0xad,0xf3,0x6c,0xae,0x16,0x31,0x25,0x0c,0x82,0x43,0x1b,0xd8,0x84,0x37,0x16,0x3a,0x63,0x49,0xad,0x96,0xe7,0xa8,0x64,0x44,0x7e,0x9f,0xee,0x75,0x3a,0xc3,0x65,0x5c,0x98,0x35,0xb4,0xd1,0xec,0xbb,0x30,0x6c,0x63,0x8b,0xa5,0x40,0x2a,0xd0,0x2b,0xa6,0xd2,0x25,0xd9,0x68,0x82,0x88,0x9f,0xe8,0xd2,0x04,0xa6,0x04,},"\x84\x26\x74\x39\x20\x1b\x05\x91\xdb\x60\xc0\xf1\x7a\x9c\x15\xe4\x54\x09\x29\x56\x52\xd5\xf5\x5b\x87\xfb\x35\x19\x67\xc8\x46\xa5\x67\xf5\xce\xba\xae\xd1\x76\x2b\xff\x54\x85\xf0\x48\x53\xca\x92\x69\xf4\x64\x09\x4e\x51\x2d\xf1\xf0\x2e\x13\xe5\x17\xb1\xda\xa5\x8d\x34\xca\xa2\xd5\xff\x9f\x9e\x79\xbc\xaf\xb4\xce\x96\xe8\xa0\x89\x25\x8a\xd6\x13\x43\xb4\x46\x62\x8e\xbc\x4f\x5b\x2a\x84\xd0\x3b\x72\xef\x3f\x73\x85\x89\xfa\x13\xc4\x25\x19\xa8\x28\x29\x9a\x3f\xae\xc0\x35\x03\x7b\xc1\x0b\x44\xe3\xbd\xfe\xd9\xe0\x87\x07\x17\xcb\xaf\x31\xbe\xf8\xb2\x2c\x4e\xa1\x6e\x81\x57\xfc\xbc\x63\xee\xfa\x39\xed\x82\x2e\xfd\x42\x15\xc2\x47\xdd\xa4\x87\x86\x27\x7e\xc0\x30\xa8\x6c\x0e\xf4\x85\x1d\x67\x3c\xfe\x75\x2d\x06\x77\x88\x3c\x2c\x45\x20\x38\x97\x0c\x09\xbd\x48\x17\x14\xbc\x3f\xbe\xcf\xa4\xff\x2a\x3c\x24\x56\x95\xd7\xec\xc2\xf4\xde\xc7\xf5\xed\xe0\x4f\xf6\xdb\x43\xe2\xbb\x91\xc0\x66\xb6\x49\xef\x73\xfd\x3b\xe8\x60\xcb\x83\xfa\x80\xb0\x74\x14\x9f\x43\x1e\xeb\xb9\x17\xec\x84\x78\xda\x87\x0c\x11\xe3\x17\x70\x38\x59\xf9\xf2\xf4\x00\x8a\x6c\x7c\x75\x4b\x06\xe1\xf7\xd2\x47\x96\x89\xda\x84\xe8\x89\x22\xf3\x82\x74\x98\x5e\x11\xce\x13\xcd\xbd\xb0\xf2\xec\xe6\x8f\xb6\x02\xad\xe0\x3d\xd5\x49\xa3\x62\x49\x1f\x4a\x20\x3f\xf8\x07\x44\xf6\x63\xc5\x23\xa0\x26\xb4\x31\xaa\xd4\x5c\x58\x29\xe0\x29\xad\x62\x56\xd1\x27\x6f\xd7\xb7\xa1\x2d\xdb\xf1\x72\x7d\x9e\x23\x3f\xb5\x34\x45\x73\x70\xa4\x26\xe5\x6f\xb3\x9c\xf4\x04\xa3\xec\xbf\x0c\x4b\x50\xbb\x52\x2d\xce\x98\x1e\x08\x30\xfd\x84\x06\xe6\xd9\x72\x5c\xeb\x1d\xdd\x3a\x19\x47\x93\x7d\x90\xe0\x4d\x76\x8a\xe1\xd1\x26\xe2\xae\xac\x21\xb8\xc9\xef\xc5\x4c\x40\x96\x1b\x7f\x4e\x9e\x88\x02\x5f\x7e\x0b\x9d\xe9\x01\xeb\xf0\x04\x9e\x74\x1b\x79\x79\x97\xd8\xdb\x78\xe9\x28\x3b\xbb\x5f\x90\xf3\x5a\x2c\x4d\xee\x27\x31\x42\xec\x25\x8c\x02\xad\x0e\xcc\x61\xcc\x5c\x9f\x12\x13\x2d\xb2\x8a\xf4\x1c\x1f\xb7\x8e\x52\x4b\xe5\x32\x7b\x5f\xfc\x35\x96\x27\x79\xfb\x11\xff\x0c\x5d\x3e\xe0\xa3\x1f\xf4\x7e\x73\xb1\x72\x9d\xfa\x46\xe8\x98\x6b\x1b\x89\xab\xc8\x8a\xd0\x6a\xbd\x5b\x6f\x76\x6d\x23\xab\xf6\x42\x25\x78\x94\xeb\xdf\xa7\x9e\x63\x09\xf1\x27\x23\x74\xee\x94\x33\x67\x7b\xa1\x3e\x45\x1b\xaa\x95\x33\x0e\x66\x0c\x80\x52\xae\x87\x2e\x0e\x32\xe2\xb2\xd1\x28\x6d\x01\xa0\xab\x58\x10\x42\x4e\xd8\xb9\x40\x54\x65\xbd\xeb\xa0\x3b\x69\x83\x84\x67\x6f\xe5\xea\x46\x4a\x03\x44\x6c\x4f\x7c\xd7\xb4\x33\x12\xec\xf1\x51\x36\x04\x64\x57\x1a\xd2\x86\x10\x58\x1f\xba\xdb\x94\x5a\x1d\x68\x18\x1d\xeb\x40\x3a\xa5\x6e\xba\x0b\xb8\x40\x32\x8e\xee\x36\x10\x3c\x7d\xe0\x73\xa6\x87\x9c\x94\x1c\x75\x54\xc6\xf6\xf2\xa0\x80\x80\x9e\xb0\xe5\xbd\x0e\x13\x0f\x29\xa2\x29\xe9\x30\xdb\x01\xfe\xca\xc2\xe0\x36\xbd\xf0\xe0\x01\xe2\xa8\xea\x32\x64\xf8\x64\x9d\x5b\x60\xc2\x91\x03\xf0\xb4\x9c\x24\xc9\x7f\xac\xaf\x7e\x81\x06\x9a\x2b\x26\xab\x3f\x93\x3f\x42\x7d\x81\x27\x2c\x6c\x8b\x7c\xd0\xdf\xb7\xc6\xbb\xe9\xc0\xea\xab\x32\xbb\xda\x22\x18\xb9\x62\x3a\x21\x19\xaa\xb1\xf3\xeb"}, -{{0x77,0xad,0x0f,0x94,0x2c,0x37,0xf0,0x31,0x3e,0x6b,0x04,0x56,0xda,0xba,0xec,0x81,0xb2,0xd6,0x1f,0x6c,0x11,0x8d,0xdb,0x29,0xea,0xf3,0xac,0x5b,0xf1,0x95,0x04,0xd4,},{0x69,0x2d,0x2d,0xa5,0xa9,0x5f,0x48,0x61,0x1a,0x6d,0xa8,0x9c,0xfb,0x3b,0x35,0x40,0xf6,0xaa,0x0c,0x85,0x0d,0x6d,0x98,0xde,0xea,0x87,0x0e,0x39,0x7f,0xed,0xe3,0x28,},{0x69,0x6b,0xd5,0x52,0xdd,0x01,0xdb,0x80,0xb3,0xd6,0x7d,0x61,0xee,0xb7,0xec,0xc5,0x68,0x78,0x40,0x4a,0xb1,0x19,0x44,0x2a,0x1c,0x74,0x22,0x99,0x2c,0xfa,0x35,0xae,0xa9,0x20,0x82,0x5d,0x2d,0xaf,0xd8,0x92,0xad,0x7e,0xb6,0x82,0x5a,0xd9,0x99,0xae,0xe5,0xc8,0x3b,0x7b,0x50,0x79,0x06,0x53,0x4f,0x91,0xac,0xe7,0x59,0xc5,0x51,0x0c,},"\x87\xe6\xde\xad\x2c\x85\x54\x9e\x3d\x8d\x25\x88\xa0\xa3\x36\x06\x03\xa6\x24\xfb\x65\xae\xbb\xc1\x01\xbf\x7f\x1f\xec\x18\xd0\xb2\x8f\xbd\x5d\xba\xee\xd3\x87\x52\xcd\xf6\x35\x5c\xe8\xdc\x84\xe1\x8a\xc1\xa4\x39\x3d\x2a\xb8\x88\x88\x2c\x4f\xf1\xc9\xc8\x13\x7f\x83\xbe\xe3\x63\x36\xbc\xbf\xbb\x72\xd5\x04\x9e\x0a\x40\x08\x74\x51\x4f\xdc\x36\x33\x04\x6e\x89\x38\x3d\xde\xd9\x3c\xa3\x1f\xde\x0d\x89\x8e\x11\xe9\x26\x8d\x3d\x5c\x24\x06\x66\xed\x55\x27\x61\x3d\xa7\x9f\xb7\xe4\x96\x25\xb4\x4c\xde\x78\xb4\x1c\x67\x90\x2e\xb0\x21\x6b\x3a\x7a\x3e\x56\x0e\x26\x1d\x71\xd7\x64\xaa\xcf\x15\x95\x9c\x17\xfc\xd6\x17\x6f\xb2\x5e\x24\x9e\xe6\xbb\x1b\x3b\xd7\xbd\x90\xf6\x0b\x0b\x0f\xfa\x03\x15\xa0\x65\xa2\x4b\xba\xe8\xf2\x55\xbf\x29\x8d\x7e\x4d\x44\xf0\xb4\x30\xc4\x15\xb4\xfb\x36\xcf\xa6\x62\x6a\x83\xf4\x9a\x25\x67\xf6\x24\x4f\x40\xe9\x23\xad\xd1\xd4\x9a\x72\xf5\x7b\x15\x30\xf5\xb3\x79\xde\x3a\x91\xc2\xe9\xa1\xac\x79\xab\x37\xbc\x3b\x9b\xa7\x3d\x88\x28\x13\x6b\xcc\x87\xd2\xc0\x11\x90\xde\x54\x57\xfa\xcd\x90\xf3\x69\x55\x3f\x7a\xc5\x21\xc5\x67\x2b\x08\x67\xdf\xa8\xda\x3b\x95\x2a\xd9\x5b\x67\xda\xb9\x9b\x48\x20\x57\x2f\x2d\x4a\x29\x8e\x95\x18\x63\x77\x79\x28\x9c\x03\x1b\x79\x3d\xee\x85\x9c\xde\x7b\x24\xad\xd6\x49\xff\xf8\x71\x24\x8a\x66\x02\xd2\x51\x62\x79\xda\x60\x58\xcb\xb6\x96\xfa\x8b\x1d\x89\xa2\x0d\x20\x99\xe6\x46\x44\x32\x10\x48\x3e\x5d\x41\x34\xe9\x28\xfa\xeb\x38\xa3\xb5\x08\x19\x9e\x0d\x69\xbb\x55\xee\x34\x77\x42\x05\xc0\xa6\x12\x05\xb5\x0b\x08\xfe\xbe\xaa\x40\x1e\x6e\x3a\x51\xa2\xbf\x98\xef\xac\x78\xb7\xae\x2b\x85\x2c\x53\x95\xa1\x2c\x40\xe2\xc7\xdd\x1b\x20\x25\x04\xb5\xa7\xd2\xf7\xe4\xfd\x4f\x86\x10\x93\x0d\x28\x68\xcb\xa8\x86\x43\x39\xe0\x41\xda\x21\xc0\x71\x5f\x41\xb2\xb2\x3d\x14\xd0\xb5\x45\x48\x0b\xc3\xbd\x7d\x72\x15\xcf\x2f\x81\x6a\x33\x32\x08\x1e\xca\xa0\x8c\x0f\x8b\x99\x52\x52\x51\xf5\x72\x31\xb6\x75\x0c\x2d\xbd\x11\x09\xac\x41\x60\x48\x6b\x76\x83\x24\xb6\xba\xc8\x7e\xf5\xa2\x26\x44\x8c\x43\x12\x40\x32\x8f\x42\xcc\xa5\x86\xbe\x7a\xff\x3c\xbe\x76\x05\xfa\x34\x15\x14\xfc\xcf\xb9\x66\xaf\x3d\x45\x30\xe8\xcd\x90\x37\xa1\x1c\xe5\x93\xc2\xd3\x83\xe1\x03\x5a\x0c\x2e\xda\x09\x8d\xe9\x0d\x50\xc5\x18\x4a\x9c\x01\xb5\x7f\x26\xb9\x4d\xed\xd1\x45\x4c\x34\x06\x37\xec\xcc\xee\x70\x62\x57\x54\xa3\x28\xc6\x5f\x42\x64\x5b\x5e\x1a\x56\x55\xee\xf9\x7d\xfb\x1c\x63\x08\xed\xf4\x9f\xa3\x68\xd1\x7d\x17\xe0\x6a\xdc\x51\x2b\x39\x73\xea\x65\x2a\xc4\x0a\x99\x78\xe1\xbb\x1b\x2f\x86\xc5\xa9\xff\xbf\x60\xdc\xc4\xf6\xbb\xc9\x8a\x64\xf4\xde\x65\xe7\xec\x61\x72\x1e\xde\xb0\xe5\x23\x84\x56\xf7\x61\xd2\xd1\x29\x3a\xf0\xde\x9f\x79\x3b\x11\xd8\xca\xdf\x01\xa9\x43\x19\xa0\x2a\x42\x73\xff\xc4\xd3\xff\xa7\xb3\x4d\x74\xfd\x2e\x0b\x10\x0f\xca\x58\xb5\x32\x5f\x90\x7a\x74\x91\x93\xe7\x51\xd6\xc1\x16\x68\x7a\xee\x37\x47\xb5\x94\x60\xd4\xef\x15\x6e\x72\x47\x6e\xae\x1b\x84\x55\xd7\x6e\x71\xb3\x06\xb9\x81\x29\xb7\x2f\xe1\xcb\x5e\xb4\x05\xa7\xc2\xf4\x32\x7f\x38\x62\xd4"}, -{{0x29,0x32,0x14,0x69,0xee,0x9f,0x2b,0xb1,0x65,0xa0,0x69,0x64,0x03,0x32,0xb4,0x89,0xbf,0x5c,0x3f,0xab,0x68,0x2e,0x93,0xda,0xe9,0xd8,0x63,0x17,0xbf,0x50,0xc5,0x2c,},{0x96,0xf7,0x30,0xf8,0xef,0x89,0x70,0x26,0x8d,0xba,0x0f,0x75,0x70,0x41,0x0b,0x61,0x88,0xa1,0xa3,0xc8,0x63,0x97,0x74,0x09,0x13,0xd5,0x3a,0xda,0x26,0x2a,0xb8,0x7e,},{0x4e,0x1a,0xff,0x84,0x63,0xbc,0xa1,0xb7,0xde,0xb1,0xd3,0x77,0x3d,0xf2,0xe7,0xa0,0x68,0x64,0x11,0x1b,0x6d,0xc4,0x2a,0x62,0xae,0x98,0xde,0xb2,0x31,0x39,0x43,0xb3,0x15,0x3e,0xe4,0x66,0x96,0xb1,0x5c,0x24,0xef,0xc2,0xa8,0x08,0xaa,0xba,0x81,0xc7,0x8e,0x3d,0xfa,0x4d,0xfb,0x50,0xca,0x9f,0xe8,0x44,0x45,0xea,0x68,0xbc,0x8e,0x0a,},"\x9c\x71\x2c\x83\xd5\x4f\x2e\x99\x3c\xa6\x8a\x96\x32\x84\x60\x04\x49\x9c\x51\x95\x44\x8d\xdc\x49\x1c\x3a\x0d\x2e\x3a\x66\x6d\x6b\x33\x09\x8e\x48\x64\xfd\xf8\x6e\x61\x9d\x50\xf1\x0b\x7c\xc6\xc3\x9b\x3f\xf2\x80\x1a\x94\x91\xf6\xfa\x97\xc5\xf1\xc4\xaf\xa7\xae\xff\x31\xd7\x38\xf9\xa7\x68\xa7\x9c\x73\xb2\x55\x77\x31\x0f\xb0\xad\x4f\xaf\x85\x43\xa0\x98\xf8\x59\x57\x1b\x61\x48\xe8\xb5\x29\x26\x44\x57\x57\xd5\x54\x9f\xd2\x5a\x26\x51\x85\x31\x56\x63\x79\xd1\xc2\x74\xe6\xc6\xa9\xd6\x41\x32\xe4\xac\x25\xac\x9a\xf9\x38\x1b\xcb\x88\x53\x32\x11\x3f\x43\x01\x4a\x13\x9a\x81\xf8\xd4\x3c\x8a\x6a\xb5\x4c\x11\xa5\xc9\x2e\x06\x19\x1c\x1e\x51\xb7\x57\xac\x9f\x11\xe3\xdc\x15\xdb\x44\x86\xd1\x67\xff\x9f\x2d\x65\xe2\x3e\x6c\x96\x22\x3d\x9a\xff\x8d\x10\xd1\x50\x2c\xf3\xdb\xce\x5e\x35\x7e\x6b\x12\xdb\xe9\xb7\xe9\x97\xc3\xd0\xa5\x07\xd3\xba\xe3\xcf\xef\x1f\xfc\x8d\x05\x6e\xf7\xdc\x72\xdd\xc1\xc8\x1e\x31\x0a\xd2\x05\xbe\x16\xe7\x7f\x27\x38\x35\x4b\x10\xb4\x84\xd3\x07\x6c\x27\xe6\xb4\xf1\x66\x38\x85\x81\xf3\x50\xbe\xfe\x22\xfb\xb0\x82\xb5\x41\x21\xee\x59\xec\xc7\xae\x5d\xec\xe8\x98\x82\xac\xf2\x6c\xb7\x47\xff\xaa\x3e\x2d\x05\xa6\x96\xf6\x0f\xd9\xe8\x29\xc7\x09\xd8\xf0\x2d\xaf\x53\x7b\x23\x69\xb8\x91\xfe\x6c\xcb\xf8\xdf\xcd\xd7\xf4\xa3\x64\xb1\x99\x85\xbe\x7e\xde\xc6\x7d\xdc\x1d\xb7\x13\xc0\xa9\x0f\xaf\xa4\x88\x37\x77\x25\x62\xde\xac\xc2\xd2\xa0\xe7\x89\xe1\x8a\x8b\x5b\x3b\xd9\xe0\x83\xea\x92\xff\xfc\x31\x83\xd5\xd4\x14\x15\x32\x59\xb3\x3a\x43\x29\xcf\xc8\x08\x24\xeb\xcb\xe0\x44\xa7\xe3\x3a\xb8\xa2\x4f\xde\x54\xbd\x95\x20\xae\xa2\x84\xb0\xc4\xc4\xfa\x94\x27\xd2\x51\xc0\xdd\xd0\x13\xec\xdd\x82\x90\xef\x55\x65\xf6\x08\x50\x8e\x36\x35\x89\xe5\x29\xd8\x4f\xf0\xf2\x6f\x9e\xcb\x03\x05\x2d\x58\x97\xfa\xbc\x91\x7e\x56\xe6\x01\xb6\x4a\xbf\xe5\xa1\x7c\x39\x50\x28\x9d\x0c\xdc\xaf\x1f\x60\x05\xa9\xf8\x10\x6f\x43\xe1\x7a\xdc\xaa\x2d\x1e\x26\x91\x66\x76\x2f\x80\x54\xde\x05\x13\x5d\x5d\x13\x93\xd7\x00\x0a\x15\xb8\x7b\xd6\x88\x46\xa8\x9d\x5b\xc2\x28\x63\x32\x51\x51\xaa\xc8\x43\xf7\x22\x78\xae\x6f\x4a\xf7\x2a\x4e\x44\x9a\xdb\x7e\xae\x6d\x43\x6a\x1e\xc7\xe5\x8e\x59\xb7\xb8\xbb\x9e\xf0\xdd\xaa\xa0\x01\x82\x6f\x8d\xcb\x44\x64\x79\xde\xaf\xd8\xb8\xd5\x42\x04\x1c\x19\xa0\x5b\x1e\x0e\xe4\x7b\x46\x40\x91\x0c\x31\x93\x0c\xa4\xe2\x0b\x10\x57\x58\xec\x75\xf1\x95\x03\x56\x94\x7f\x62\x61\xd0\x03\x7f\xe3\x07\x73\xa3\xec\xe6\xa9\x6c\x8d\x54\x33\x33\x3d\x82\x2c\x27\x77\xef\x7f\xf8\xbe\x60\x33\x34\x5b\x50\x55\xd5\x8f\x5e\xb3\x72\x9a\xf5\xae\x88\x24\xf3\x31\xee\x07\x31\xc8\x9b\x20\xac\x11\x8f\x55\x04\x27\xcd\x95\x8a\x55\xf6\xb1\xa2\x88\x8a\x08\x7b\xb7\xdb\x55\xbf\xc7\x3b\x29\x42\x9b\x44\x48\xdb\xe9\x11\x9c\x45\xa8\x73\x39\xb4\x49\x7a\x69\xa4\xcf\x83\x3e\x8f\x37\x70\xcc\xe5\xe0\x1f\xaf\x5e\x73\xbb\xaf\x62\x76\x83\xc0\xa2\x8c\x73\x05\x2f\xbe\xce\x20\x30\x43\x38\x9d\xfb\xfd\x45\x49\x5e\x51\xda\xb8\x6a\x25\x2e\x5b\xc1\xb4\xb7\xfe\x28\x07\xe3\xd0\xe2\x36\x3b\xea\xb5\x1c\x67\xfb\x31"}, -{{0x04,0x65,0x77,0x50,0x49,0x7e,0x68,0x15,0x2c,0x43,0xce,0x34,0xa5,0x8d,0x21,0x06,0xe6,0x4c,0x55,0x7c,0xd7,0xa8,0x4e,0xf0,0x5d,0x9e,0xb8,0x2e,0x6b,0xcb,0x05,0xf5,},{0x3b,0x3a,0x19,0x47,0xb4,0xcb,0xf6,0x0b,0x82,0x6d,0x60,0x9f,0x19,0x2d,0xc2,0x30,0xaa,0x9b,0x9b,0xaf,0x4c,0xd6,0xa6,0x09,0x2e,0x49,0x5f,0x1d,0x2e,0x47,0xad,0x62,},{0x7e,0x2e,0xae,0x5a,0x29,0x3f,0x41,0x83,0x91,0xf6,0xd8,0x5a,0x79,0x94,0xb0,0x7c,0x45,0x22,0x80,0x01,0x7e,0xe6,0x53,0xbf,0x61,0x7a,0x8d,0x5b,0xe2,0x4c,0xbb,0x5d,0x0e,0xfd,0xfb,0x7f,0x7f,0x00,0x13,0x12,0x26,0x0f,0x34,0x4e,0x6f,0xb9,0x15,0xad,0x8d,0x7d,0xe9,0xc0,0x51,0x98,0x27,0xc0,0x57,0x26,0xf9,0xce,0x25,0x45,0xdd,0x0b,},"\x29\x48\x22\x7a\x89\x0f\x6f\x84\x5b\x77\x5e\x62\xc5\x3a\xf3\x80\x50\x64\xa1\x57\x64\x46\xf0\x85\xd9\x0f\x8b\x9a\x5e\xd6\x8d\xf1\xea\x39\x3c\xe4\x79\xc4\x41\x41\x49\xa9\xec\x5a\x17\x10\x36\x42\x4d\xff\x03\x44\xb4\x95\x8f\x61\x32\x29\x8d\x0e\x24\xc9\x26\xd2\x8a\xd9\xd7\x9f\x98\xc6\xe6\xbc\xf1\xc5\x76\x76\x06\xec\xd2\x91\xc6\xad\x47\xb4\xf9\xfb\x2b\x02\x01\x15\x5a\xda\x62\x7b\x7a\x1f\xd5\xb0\x74\x19\x87\x40\x83\x05\x9e\xb5\x2b\x2f\x6e\xc2\x28\x18\xb7\x82\x46\x22\x8f\x3f\xe6\x35\x5d\xfd\xa7\x0e\xbb\x9b\xbe\x73\x22\x93\x78\x73\x63\x99\x55\x7c\xe2\x4b\x30\xbf\x64\x5a\x14\xe2\x25\x6f\x70\x01\x9b\x33\x36\xb2\x03\xfb\x77\xc6\xec\x94\xa7\xa2\x63\x48\x88\xfe\xea\xd4\xd7\x2c\x23\x91\xe9\x9e\x8c\x8d\x53\x3f\xd8\xa4\x2b\x08\xc1\x1f\x88\x7a\xb2\xde\xb6\xeb\xbf\xe3\xd2\x51\xde\x63\x53\x6c\x36\xcd\x53\x42\x23\x98\xe5\x44\xcf\xf8\x7b\x07\xa6\x33\x49\xfc\x50\x85\xdd\xe9\x3a\x1b\xfd\x71\x71\x13\x3a\x20\x43\x98\x1f\x60\x75\x22\xc8\x13\x3c\x63\x42\x8d\x1b\x92\x62\x6c\x79\xb7\x35\x8e\x70\x21\xcf\x1f\x41\x2a\x78\xaf\xa7\xcb\x3f\x59\xff\xef\x92\x79\x88\x5a\x5b\xdb\x24\x66\xac\xd3\x4c\xd5\x15\x80\x83\x0b\x83\x51\xeb\xd4\x40\xa9\x66\x23\x90\x7a\xd1\xf4\xb5\x62\x03\xf5\xe1\x59\xa4\x29\xe3\x54\x6e\xad\x0c\x01\x1d\xbe\xd0\x90\x28\x71\x7e\x3c\x3d\xfe\xd3\x91\x97\x76\x4d\x4d\x24\x5e\xf2\x28\xb9\x80\x44\x71\x8e\xf4\xd8\x82\x2f\x21\xb2\xc5\x68\x50\x38\x47\x3b\xf9\x3d\xc0\x93\x74\x51\xeb\x02\xd3\x1a\x46\xc8\xdc\x7e\x94\xc3\xe8\x67\x8c\x83\xb9\x8a\x43\x81\x8f\x12\x5b\x52\x8b\x47\x6a\xad\x31\xd1\x58\x4f\xfd\x48\xf1\x49\xe5\x73\x6e\x58\xf9\x42\x05\xd3\x88\x9e\x56\x7e\x4d\xd1\xea\xc2\xfa\xc1\xf8\xf4\xdc\x54\x0e\x53\x22\x46\x0f\xb9\x40\xe1\x2e\x93\xc4\xc9\x8d\xed\x19\x41\xc1\x90\x4f\x96\x7f\xb4\x64\x36\x84\xc1\x9a\x4d\x5c\x44\x1d\x60\xb0\xe9\xf4\x08\x55\xe5\x23\xfe\x7f\x99\x10\x76\x57\xa6\x80\x76\x27\x5b\xf8\x4b\x7c\x69\xa3\xf2\xb3\x85\x5b\xc8\x02\x6b\xa9\xb0\x0b\xc6\xfe\x34\xb9\x9d\xa0\x63\x17\x00\xa6\x7f\x52\xb3\x4e\x17\x96\x33\x98\x87\xa4\x83\x05\x12\x1d\x53\xab\x44\x40\xfc\x4b\x5c\x9b\xf7\x23\x94\xd5\xed\x37\x2f\xf1\x8c\xa3\xf0\x07\xbd\x02\xdf\x65\x1d\xc3\xac\x43\x82\x75\xf1\xa3\xe5\x24\x22\xb8\x6c\x45\x86\x76\x6a\x21\xcd\x89\xf8\x05\x80\x5d\xbb\x44\xfd\x89\xfe\x24\xfb\x2c\x0b\x40\xd1\xb7\x54\xc3\x35\xdb\xaf\xfc\x3b\x3b\xb8\xbb\x46\xc7\x4c\x36\x37\x45\x04\x04\x2d\x86\x78\x92\x27\x59\x98\x62\x31\x2e\x99\xca\x89\xeb\x50\x4c\xc3\xd7\x5d\x19\x49\x5a\xa8\x6b\x20\xb2\x73\x6b\x12\x1b\xb2\x07\x5c\x88\xed\x4a\x3f\xbd\xaa\x6b\x2c\x3f\x76\xd1\xff\x55\x25\xd3\xa2\x86\x3e\x4d\x83\xc7\x2b\xfe\x01\xe1\x02\x78\x80\x94\x74\xe1\x82\x2d\xe2\xd9\x62\x83\x48\x93\x20\x02\x96\x11\xaa\x9d\xff\xc4\x82\x9d\x66\x86\x9e\x63\x49\x4f\x9a\xad\xe7\x0b\x77\xa7\xb8\x0f\xbc\x93\xe3\xde\x4d\x93\x59\x13\x75\x2d\x04\x5e\x13\xb3\x12\xc5\xd0\x82\xf6\x24\x2d\x49\x85\xb0\x53\xb3\x78\x3e\xb0\x2c\x66\x14\x96\x3d\xc0\xd5\x5d\x4c\xbe\x88\x7b\xae\x29\xcc\x18\x97\x9e\x5e\x2e\xa9\x45\xbc\xd4\x0d\x89"}, -{{0x8b,0xd9,0x90,0x70,0xc5,0x0a,0x9f,0xa4,0x18,0xef,0x7f,0x75,0xc0,0x01,0x29,0x91,0x6a,0x41,0xc8,0x60,0x70,0x96,0x1c,0xcb,0x2b,0x20,0x2b,0xe1,0x8c,0x2d,0x10,0xd7,},{0xdd,0xd7,0x33,0x08,0xfc,0xe8,0xca,0x65,0x52,0xd0,0x39,0x42,0x8c,0x7a,0x1a,0x94,0x92,0x33,0x20,0xa3,0x1c,0x0f,0x58,0x0d,0x3c,0x23,0x52,0x80,0xf0,0x3c,0x18,0x30,},{0xb1,0x4a,0x7b,0x26,0x20,0x12,0xc5,0x90,0x9e,0x21,0xd5,0x87,0xfb,0x4f,0x29,0xa9,0x09,0x3c,0x8e,0x1c,0x29,0x99,0x81,0x6a,0x82,0x11,0x8f,0xef,0xbf,0x10,0xe6,0x8e,0xa8,0x98,0xbf,0x0d,0xa1,0x8e,0xbf,0xd0,0x34,0x1e,0xa8,0xf8,0x2a,0x18,0x44,0xc8,0xe0,0xdd,0x53,0x06,0xe5,0x09,0xb9,0xd0,0xc3,0x5b,0x47,0x3a,0x7d,0x20,0x95,0x07,},"\x48\x5f\x8d\x68\x0f\x79\xee\x2d\x82\x8b\xe7\xd0\x18\xa6\x5e\x0b\x64\xb0\xf0\x18\x48\x19\x86\x3e\x71\x10\xee\xa8\xf2\x99\xa7\x2c\x4d\xc8\x7f\x8e\xe8\xa8\xae\xaa\x81\xaf\x91\xdc\x71\xad\xea\x79\xfc\x97\x97\x42\x1c\xcc\x64\x6e\x6c\xd5\xdd\x48\xb4\xde\xc1\xde\x96\x86\x93\xfb\xce\x0d\x00\x21\xa3\xd9\x8d\x38\xa8\xbb\xc5\x81\x95\xe6\xdf\xc3\xb5\xe1\x46\x1b\x2a\x59\x41\x03\xe8\x0a\x29\x44\x1d\x5a\xaa\xf8\x89\xe3\x1c\xc8\x65\x14\x1f\x0c\x6b\x2c\x8c\x81\xf7\x21\x67\x9e\xa2\x39\x4e\xc6\xe4\x08\x1e\xc2\x03\xc2\xea\x39\x7d\x94\x84\x75\x7a\x7a\x0e\xcd\x53\xe6\x52\xdb\x9d\xf1\x7b\xea\x0e\x32\xfe\x8b\x2c\xbc\xe0\xd1\xd9\x7b\x96\x1e\xd7\x4e\x8e\x62\x2b\xcd\xd3\x55\x8b\x7c\x48\x69\x5a\xdf\x18\xaa\xe6\x11\x0e\xa9\xa3\x39\xb9\xda\x40\x7a\x9e\xda\xf2\xab\x08\x1a\x68\x1e\x18\x32\xcc\x21\x5b\x1f\x08\xa6\x7d\x55\x9a\x47\x44\xaf\x7c\xd5\x03\x18\xc2\x06\xee\x91\x15\x75\x82\xf8\x2e\xb6\xc0\xfc\x29\x02\x7b\x44\x61\xc3\x07\x33\xb8\x16\x9d\x14\x81\x32\x2c\x48\x60\x50\x9b\xa0\x96\xba\xcb\x71\xa5\x79\x24\x67\x51\xd5\x67\x54\x0e\x41\x43\x1e\x14\xf1\xb4\x6e\xf1\x6e\xba\x27\x61\x04\xbc\x01\x65\x0d\x5c\x49\x26\xe4\x7c\x9c\x60\x40\x78\x4b\x04\x3c\xd0\xaa\x48\x54\xef\xe8\x79\x7f\xd0\x46\x2d\x45\x39\xf3\x80\x35\xae\xf0\x8b\x45\x77\xc1\xa9\x11\x8d\x00\x4b\x6d\x01\x86\x2f\x52\x76\x77\x6d\xfe\xf1\x37\x18\x64\xf1\x55\xac\x0f\x07\x83\x89\xc2\x05\xcf\x05\x38\xd8\x5f\xa3\x48\x24\x4d\x7a\x42\x29\x11\x31\x0f\xf6\xc1\x01\x32\xb1\x59\x8b\xb4\x45\xc7\xe2\x07\x7b\x76\x3c\x47\x3d\x1e\x7a\x61\xa3\x8b\x64\x92\x9a\x64\x8b\x60\xb2\xe5\x43\x54\x37\x39\x22\x4b\x40\xfb\xf6\xd8\x7f\x10\x79\xc3\x0b\xc8\x73\xac\x38\x99\x1d\x51\xb8\x9e\x9d\x26\x1c\x4b\xcc\xb3\x75\x35\x5c\x07\x2c\x1e\xa2\x0e\x4f\xf9\x1d\x55\xd9\xf7\x54\x4e\x90\xd1\xc6\x64\x6c\x59\xaf\x72\x42\x4d\x8a\xaa\x8e\x0a\xed\x07\xb3\x88\x9d\x4e\x45\x0c\x12\x09\x68\x4c\xe1\x38\xd0\xc9\xda\x07\x95\x25\xf5\xaa\x02\x05\x0a\xf5\x70\xe4\x31\x5c\x2f\xa8\xb0\x99\xb7\x76\x5b\xfb\xb8\x94\xfa\xd3\x59\xb8\xe2\x48\x04\xec\xe0\x52\xac\x22\xa1\x91\x70\x53\x35\xe9\x88\x40\xa6\x24\xe4\xcb\xf3\xa1\xa1\xa3\x27\x81\x27\x85\xb2\xc0\xf5\xd6\x38\x14\x57\xb7\x2f\xdb\x63\x3e\x81\x93\x8b\xbb\x54\xb8\xc3\x7c\xcc\xb5\xd5\x9c\x58\x27\xc7\x68\x3a\x52\x47\x54\x49\x77\xe9\x84\x44\x21\x78\xd0\x85\x29\x06\xca\x6f\x94\x5c\x42\x29\xeb\x08\xad\x27\xe6\xc2\x75\xd7\xb4\xec\x8d\xc2\x5f\xb2\x81\x93\x37\xe5\x3e\xad\x6c\x7a\xa7\x87\xf9\x1a\x7d\xc6\xdd\xaf\xd5\x36\xee\xfc\xbd\xec\x2c\x50\x16\x7b\xe3\x43\x06\xa8\x2e\x16\xd5\xd5\x2b\x3b\x1b\xe0\x08\xa7\xa6\x11\x27\x4c\xe2\xcf\x8d\x62\xe3\xb9\x00\xc0\x99\x43\xbe\x70\xcc\xc7\x7b\x07\x06\x37\xc2\x50\x61\xd6\x1b\xe9\x10\xee\xf5\x0d\xf1\x87\x44\xc3\x3e\x76\xf6\x70\x1e\x0a\x8f\xf6\x29\x7f\xa6\x7e\x4b\x41\x08\xc1\x37\x56\x72\x7a\x9d\x74\xbc\x9e\x17\x98\x3e\xec\x08\xf8\x66\xb7\xc7\xff\xb3\x7f\x3c\xcb\x01\x41\xa8\x0f\xef\xf6\x32\x2b\x2a\xc6\x2b\x84\xce\x27\x97\xfd\x98\xd6\xff\x26\x9a\x41\xa0\xc3\x84\x82\xdb\x67\x98\x62\xa3\x8c\xd2"}, -{{0x1a,0xf4,0xcf,0x6d,0x24,0xab,0x37,0x82,0x86,0x7d,0x96,0xa1,0xc2,0x75,0xce,0xeb,0x02,0x2c,0x69,0x1a,0x30,0x8e,0x62,0x45,0x66,0x5d,0x61,0x6b,0xf6,0x7c,0x2c,0x32,},{0x19,0xd3,0x17,0xea,0x98,0xd3,0x5b,0xa5,0xfa,0x67,0xc1,0x2e,0xcf,0xb3,0x27,0x50,0xdf,0x27,0x5d,0x7a,0x45,0xb8,0xe2,0x11,0xa7,0xac,0x47,0xed,0xe7,0x71,0x2d,0x9f,},{0x7e,0xb4,0x6c,0xd0,0xde,0x31,0x55,0xb4,0x37,0x47,0xd7,0x32,0xf1,0x04,0x5d,0x8e,0xf7,0x44,0x92,0xad,0x82,0x7a,0x22,0x45,0xbd,0x17,0x10,0x28,0x28,0x44,0x2e,0x43,0xa0,0xce,0x7e,0x8b,0x26,0x8e,0xd7,0xfd,0x8d,0x3e,0x7b,0x28,0xf0,0x72,0x79,0x5d,0xa3,0xe0,0x70,0xf1,0x2b,0xc4,0xe2,0x3e,0xae,0xf5,0x7b,0x85,0x3c,0xee,0x88,0x0a,},"\xf4\x45\xfd\xcf\xe2\x8c\x17\xbd\x44\x27\xae\xa5\x67\x6c\x0e\x12\x80\x84\x15\x97\xe9\xd6\x6d\xe7\xd7\xa7\x17\x23\x11\x09\x39\xbe\xd0\x0f\x4e\xba\xf9\x60\x3d\x53\xc9\xcb\xf6\x27\x1b\xe5\x47\xaf\x29\xb2\xa0\x45\xec\x41\x28\x8a\x7b\xb7\x9d\x66\x2d\xc2\x10\xe2\x15\x95\x7f\xa8\x46\x88\xc9\x16\x54\x3e\x56\x17\xf5\x60\xe4\xd3\x8f\x73\xba\xef\xc3\x7e\x11\x91\x4e\x47\xc5\x15\x06\x78\x51\xe8\xed\x21\x39\x3e\x13\xdd\x19\xed\x9b\x73\xd9\x89\x45\xfc\x82\x6a\x25\x8e\x95\x7d\xc0\x83\xdd\x8e\x53\x5c\x30\xa5\x4b\x42\x66\xdd\x71\xd1\x13\xce\x85\x6b\x46\x28\x2a\x18\x03\x36\x27\xa9\x8e\x64\x72\xcc\xb4\x63\xed\x3d\x96\xfa\x7b\x35\x5d\x3b\x2c\x2a\x2b\x60\x10\xdd\x14\xf4\xea\x39\x65\xdd\x87\xbe\x1c\x42\x9b\xde\xa8\x30\x0b\x4b\x0b\x44\x45\x86\x35\xb4\x97\x9f\x5e\x3e\x8e\xb5\xc6\x18\xd4\xe1\x3e\x1d\x68\x8b\xf8\x8c\x7e\x4a\x3d\x93\x8e\x84\x33\x6d\x67\xbe\x68\xdf\x34\x35\xc5\xc9\x90\x86\x32\x1c\x02\xe1\x3b\x4a\x12\x52\x4b\x34\xe4\x6a\x0b\x4d\x27\xf3\x0d\x7e\xd4\xf5\xce\xcb\x36\xde\xad\xf0\x9e\x7e\xfc\xc7\x55\xca\x66\x75\x68\x29\x79\x14\xc6\xbc\x24\x06\x27\xd9\xd0\x9a\xac\xf8\x54\x15\x41\x2c\x06\x35\x62\x34\x53\x27\x8d\x9b\xf0\xe1\x0e\xec\x65\xfc\x72\xaf\xff\xfa\x93\x92\xdc\x78\x81\xd1\xe5\xc7\x60\xa4\x02\x80\xf1\x6b\x14\x75\x12\x7b\x91\xb6\x9c\xcb\x65\xdc\x4b\x35\xde\x10\xf9\x43\x25\xc0\xcb\xe1\xc4\x70\x19\xa2\xea\xf2\xb4\xba\x92\xd7\x85\x22\x9a\xac\xfa\xd1\x82\x6e\xbb\xde\xbe\xfb\x7d\xad\x4b\x05\xf8\x82\x43\xe1\x5f\x27\x97\x66\xe3\x32\x1d\xd8\xdb\xa6\x50\x44\x4d\x81\xfb\x08\x78\x76\x7a\x9c\x63\x53\x4b\xb4\xba\x21\x28\x5a\x24\x16\xcb\x8f\x85\x6d\x11\xa9\x6e\x0a\x8c\x8d\xe1\xe1\xa7\x51\x32\xf1\x56\x4c\xd9\x94\x99\x56\x90\xbb\xed\x2e\xe1\x54\x53\x7f\xb6\xf2\x79\xfb\x09\xc8\xde\xa6\xf6\xaf\xab\xc6\x28\x56\xe3\xd1\x28\xfd\xfa\x79\xfc\x49\x76\x19\x3b\xb9\xb3\x36\x86\x1e\x47\xb5\x6d\xc2\x58\x23\x93\xd2\xe5\x44\x65\x1a\xc8\x5b\xc5\x8e\x9e\x6a\x94\xdc\x4c\x39\xc4\xef\x72\x53\x8a\x14\xf8\x56\xcd\x95\xc3\xe2\x79\x0a\xde\xe0\x3a\xb2\xe5\x2c\xa0\xae\x47\x1d\xe5\x02\xcb\x19\xe6\x76\xaf\x35\xf5\xf9\x3d\x84\x0f\xef\x96\x06\xcb\xe9\x2d\x8b\xc2\x50\x06\x10\x5d\x92\x34\x45\x88\x83\x88\x42\xc3\xbe\x50\x5c\x73\x50\xe3\x51\xb7\x35\xe6\xcc\x6f\xb7\x92\x75\xb2\x7b\xd9\xeb\xd3\x6b\xa4\xd0\x60\xac\xee\x73\xb5\xa3\x15\xce\xff\xab\x86\xd0\x6f\x21\x68\xa6\x70\x65\x57\x81\x96\xa0\xed\x04\xa4\xdd\x71\xd6\x73\x48\x37\xdb\x08\x38\x57\xab\x1e\xb5\xe0\xee\xc4\xff\xba\xc9\x54\x4f\x4e\xc1\x9b\xde\x19\x4d\xf8\x4b\x1c\x84\x83\x41\x57\x4b\xf1\x0d\xae\xe8\x5b\x81\x78\x19\x6f\xb6\x08\x12\x3a\x80\x81\x71\xd7\x3c\xe4\x20\x6a\xd6\x52\x16\xad\x1a\x5c\xbd\xe4\x0b\x19\xd6\xae\x7f\x40\xdf\x97\xab\x84\x32\xe2\xc5\x3a\x50\x4e\xd1\x22\xe2\x5f\xb7\xa5\x1c\x14\x35\x4a\xb3\x92\x8e\xde\xb3\x9c\x29\xeb\x24\x6b\x74\xa0\x76\xf8\x9d\x03\x50\x4f\x40\x1b\xd1\x76\xb5\xcf\xfe\xe4\xb9\xdb\x09\x7c\x45\x76\x4f\x51\xaa\x37\x67\x04\xb5\xa7\xf2\x10\xb3\xf1\xa9\x05\xe2\x5d\x67\x00\x2f\x65\x57\xeb\xb7\x49\x73\x7c\xda\x31"}, -{{0x2a,0xac,0xc8,0x19,0x7f,0xf8,0xfa,0xe1,0xc1,0xcf,0x38,0x62,0xe3,0xc0,0x4a,0x21,0x78,0x29,0x51,0xf8,0xe4,0x8e,0x40,0xb5,0x88,0xf8,0xbc,0x74,0x60,0xc3,0x0a,0x03,},{0x9a,0x1b,0x01,0xe2,0x15,0x4f,0x1c,0x36,0xa8,0xe1,0x6b,0x79,0xee,0x7d,0x2d,0x05,0xb8,0x71,0x2e,0x0d,0x27,0xa0,0x61,0xa6,0xd4,0x1d,0x47,0x57,0x78,0xb0,0xdf,0x8c,},{0x64,0x7c,0xdd,0x6c,0x1a,0x67,0x29,0x0e,0x57,0x67,0x6a,0x78,0x11,0x3a,0xaa,0xdc,0xa6,0x9a,0xc5,0x7b,0x99,0x77,0x15,0xc5,0x09,0x89,0x5b,0x8c,0x5c,0x94,0xe8,0x2c,0x0b,0x6a,0xce,0xcc,0xf3,0xba,0x8b,0xd7,0xcf,0x61,0x75,0x2b,0x1b,0x19,0xd1,0x3b,0x49,0xf1,0x5f,0x8b,0xfa,0x04,0x6e,0xb4,0x42,0xa5,0x5c,0xd5,0xba,0xb1,0x42,0x02,},"\x5d\x82\x75\x2c\xe5\xda\x31\x80\xfa\xf4\x78\x7a\xed\xfb\x19\x29\x4b\x43\x48\xa1\xd9\x20\x2c\x85\x39\x83\x31\x32\x3e\x0f\x42\xb0\x83\x52\x27\xe6\x8e\x11\x56\xf2\xd4\xba\x2f\xe4\x50\xe6\xd6\xef\x2b\x92\xd8\x9b\xbb\xe4\x09\x6e\x12\xca\x83\x97\xeb\x2f\x45\xe6\x76\xf1\x67\x3a\xa4\x1c\x95\x9f\xcd\x30\xd5\x57\x88\x53\xb5\xdb\xd1\xc0\xd5\xb3\xa0\xf0\xd8\x70\xec\xa7\x1e\xa1\x33\x90\x11\x1b\x25\x8f\x65\x48\xb3\x2f\x37\xa0\x5e\x97\x44\xa6\x56\xfd\x77\x8d\x65\x72\x19\x65\xc6\xd9\xb3\x28\x60\x0b\x45\x70\x47\x70\xe0\x4b\x09\x97\x90\xaa\x78\x84\xf0\x0d\x7b\xb7\x65\x9e\x33\x72\x10\xbd\xc2\x3e\xaa\x71\xd7\xb0\x16\x03\x0a\xca\x62\x23\xb5\x56\x9b\xdf\xc2\x90\x81\x1a\xac\x40\x95\x24\xdc\xcb\xf9\xba\xbc\xbe\x4b\xf2\x09\x46\xb5\x44\x31\x7c\xa6\xf2\xf9\x18\x31\xc7\x9f\xb2\x73\xb6\x40\x4e\xb4\xe6\x1e\x1f\x7b\x10\x6e\xbd\x0d\xb9\xf2\xb1\x97\x4d\x2f\x03\x1b\xce\x25\x80\x36\x06\x55\x2c\x34\x41\x65\x5e\xfc\xf2\xc7\xea\x52\xad\xcb\x30\x99\x3d\x85\xf2\xdd\xa7\x96\x03\xe9\x41\x5a\x02\x32\x45\xa6\x6c\x07\xa9\x56\x93\x31\x46\xf5\x3c\x99\x3c\x08\x89\x18\x08\xb8\x16\x6b\x30\x72\x1f\xbd\x1f\x8a\x1b\x93\x7d\x14\x07\x0d\x78\x6e\x9e\xb4\x51\xf2\xab\x51\x42\xf8\x3a\x60\xf3\x5d\x76\xad\x8b\x81\xd6\xa5\x7c\xf3\x68\xfc\x6f\xca\xcc\x0c\x47\x58\x44\x0d\x9c\xd5\x95\xb1\xb0\x94\x2a\x36\x55\xe2\x50\xda\x98\x3b\x72\x41\x54\x6d\xcf\xbe\x0a\xe8\x10\x77\x65\x02\x95\x40\x9f\xf9\xe9\x09\x77\xfb\x99\x60\xcb\xf4\x0a\x2a\xf5\x17\x74\x02\xba\x2f\xaf\x50\xdb\x6f\x1a\x73\x65\xcf\x99\xe9\x92\x42\x9e\x38\xdb\x43\xea\x83\xfd\xdc\x95\xa6\x48\x67\x6c\x0b\x16\xbc\x95\x2b\x15\xde\x99\xd5\x2f\x6b\x52\x33\xda\x4e\xae\x19\x78\xe8\xba\x25\xe6\x23\x5a\xfb\xc5\x11\xc7\x6c\x4c\x87\x4c\x92\x37\x92\x2b\x1c\xef\x08\x47\xd0\x7a\x80\x20\x0c\xba\xe3\xc7\xc8\x1f\xcb\xd0\xd1\x72\x52\xed\x8c\x61\xad\x19\x54\xfc\x86\x2e\x1e\x04\x44\x4c\x32\x08\x6f\xee\x38\x0d\x1c\x17\x54\x13\x22\xb9\xa6\x0d\xa6\x62\x35\x2e\x21\x0e\x9a\xe2\x15\xe3\x53\x29\x6d\xb9\x22\x33\x9a\xa1\x7d\x21\x73\xec\x31\xf1\xc5\x30\xa2\x4b\x1f\x34\x8a\x31\x57\x2e\x14\x69\xca\xac\x80\x8f\x9c\x76\xec\x27\x31\x87\x3b\x80\x3e\xad\x3e\x54\xea\x24\xbc\x24\x49\x9b\x97\x04\xb3\xbd\xce\x81\x38\x9b\x9d\x14\xd4\x95\x27\xc0\x4b\x3b\xb9\xe3\xba\x6d\x94\x6c\xea\x58\xcf\x78\x6d\x4d\x28\xb8\x9b\x41\xc5\x82\x74\x03\x5a\x86\x90\x5a\xd9\x57\x58\xc3\x16\x13\x66\xab\x93\xda\x81\xe6\xb4\xc8\x08\x36\x4e\x08\x7d\xae\xea\x4c\x4c\x5c\x2a\xa6\x87\x19\x37\xc5\xfe\xab\xa2\x14\x9f\x01\xf7\x38\xf4\x53\x96\xe6\x6e\xa8\x06\x32\x21\xe1\xc8\x1c\x05\x25\x5b\xa5\x64\xad\x44\x0c\xb5\xd0\x7c\xbd\x4b\xab\x94\x1e\xa5\x93\x24\x49\x30\xbc\x5c\x28\x9b\x31\x65\xd3\xec\x88\x47\xeb\xc4\xb6\x74\xc0\xa4\x9f\x91\x69\xad\xef\x78\x6d\x77\x67\xbc\x8f\x21\x3d\xb7\xd9\x5c\x06\xe9\x9b\xc1\x1e\x20\x00\x55\xb6\x5e\xb7\x9a\xda\xa0\x1b\xcd\x2c\x85\xda\x43\xce\x63\x70\xe1\x2e\x34\x9b\xf6\xd4\x75\x48\x7a\xff\xdf\x92\xe2\x0a\x3a\xcd\xed\x1d\x76\xf9\xe8\x3e\x91\x9e\x98\xde\xf1\x95\x07\x2a\x50\xd0\xc5\x71\xdd\x25"}, -{{0xff,0x86,0x21,0x56,0xc7,0xea,0xb6,0x81,0xc9,0x5e,0xff,0xf8,0x00,0x3e,0x00,0xa1,0x4f,0x1f,0x0d,0x50,0x5d,0x55,0x07,0xe6,0xe5,0xb3,0x91,0x79,0xdf,0x9b,0x1c,0xda,},{0xe1,0xb8,0x9f,0xb3,0x11,0x14,0xea,0x46,0x10,0x7f,0xfd,0x03,0x29,0xf1,0x06,0x64,0x28,0xde,0x54,0x70,0x8e,0xdb,0xec,0xf3,0xed,0x9d,0x47,0x08,0xcd,0x14,0x3f,0xe2,},{0x4b,0x81,0x37,0x04,0x2d,0x67,0x84,0x75,0x7d,0x4a,0x9c,0x06,0xbc,0x74,0x32,0xf4,0x80,0x9b,0x1c,0x6a,0x90,0x35,0x42,0x73,0x6d,0x9a,0x57,0x66,0x8c,0x20,0x84,0x5c,0x17,0xd4,0x68,0x55,0x70,0x85,0xc5,0x7f,0xb6,0x32,0x13,0xda,0xd3,0xbe,0x0f,0xa3,0x6a,0x11,0x8f,0x7c,0x1a,0xef,0xf2,0x56,0x2f,0xf4,0xb8,0x88,0x8c,0x26,0x90,0x0e,},"\xb3\xd1\xdb\x72\xa6\xa9\x85\xec\xd7\x0a\x2c\xff\x6c\x18\xc1\x79\xe2\x17\xd4\xf4\x10\xfd\x39\x34\x96\x96\x85\x90\x1b\xd0\x71\xbc\xe6\xc2\xfb\x67\x63\xe1\x0c\x6f\xa1\x6e\x75\xa1\x17\x60\x66\xb8\xec\x81\xae\x3a\x80\x39\xe7\x1d\xc2\xcd\xc6\x4a\x40\xfd\x62\xb7\xce\xe7\xbe\x4b\xa0\x33\x2f\xe4\x5d\x0b\x60\x15\x86\x52\xe3\x3f\x8d\x3a\xff\x3c\xb4\xd6\xb0\x21\x74\x4d\x0d\xd1\x78\xb1\xbf\x0a\x1c\xc1\xd3\xfe\x93\x21\xbe\x28\x42\x1e\xb8\x82\x63\xa1\x24\xf4\x97\x92\xd0\x79\x47\x5a\x8c\x55\x5f\xf5\x69\x08\x73\x51\x4b\x5d\x48\x3e\x53\x21\x7e\x0c\xbb\x12\x86\x2b\x85\x0f\xe3\x90\xc8\xf8\x30\x08\x08\x6e\x64\x9a\xc9\x04\xb0\x18\x35\x0a\xb4\x91\x57\xee\x9b\xca\xe6\xc0\x7a\x4b\x87\x8b\x48\xe2\x5e\x98\x4f\xbb\x4d\x36\xb6\x1d\x68\x9b\x13\x46\x8a\x28\xd1\xe3\x87\xe0\xe8\x86\x57\xf8\xc8\xac\x95\x86\xa6\xe2\x6c\xf9\x4d\xff\x6f\x82\x64\xe3\xff\x62\x58\x86\x5c\x6d\xcf\x85\x7b\x00\x14\x78\x86\xe1\x75\xdf\x04\x32\xe3\x2f\x04\x40\x0e\x29\x9f\x21\x18\x83\x12\xb3\x2d\xfc\x05\x0e\x7b\x7e\x87\xee\xaa\x0c\xba\xac\x6b\xe9\x93\x7a\x5e\x0c\xc3\x11\x13\xde\x7c\x8b\x23\x3e\x1c\xe8\xe5\xd9\xc5\x64\xfb\xe9\xf3\x7b\xbd\x41\x1d\xf7\xa5\xe4\x4e\x6c\x7e\xbb\x67\x6d\x85\x89\x4d\xcc\xf4\x86\x5e\x4d\xda\x0c\xad\xef\x2b\xbc\x55\x00\x0b\x3a\x29\xf1\xf7\x1e\xf4\x46\x1d\xdc\x3b\x33\x1d\x91\x56\x65\x34\xc5\xd6\xd8\x4c\x73\x13\x76\x29\x53\x20\xf8\x0a\xdc\x90\x28\x8f\x99\x53\x55\x4f\xcd\xf9\x21\x3d\xe6\xa9\x05\x21\x0d\x4c\x80\x64\xaf\x91\xcd\x98\x32\x5e\xf9\x18\x98\xd3\x3d\x70\x03\x82\x02\xe3\x2f\xb6\x70\x9c\xa3\xd7\x88\xfe\xcb\xd1\xb8\x41\xfa\x4e\x5e\x90\x62\xd6\x42\x67\xc3\x5c\xfd\x44\x4f\xb6\x9e\x2f\x60\x47\xf5\x8b\x1c\x2a\xf4\xcc\x7e\x4c\xac\x2f\x89\x08\x88\x36\x05\x92\x11\x3e\x96\xad\x3a\x85\x7e\xd0\x5e\xaa\xba\x6f\x91\x53\xef\x89\xb9\x3e\x00\xe8\x74\x37\x33\xec\x47\x2d\x9b\x0e\xec\x1c\xd8\xfa\x52\x42\x5c\x4a\x26\xbd\x7d\xf7\x3a\x27\x12\xbe\xbe\x51\xae\x3b\x25\xeb\x78\xdb\x82\x14\x90\x31\xfe\x7b\x28\x1a\xf6\xcb\x77\x14\xed\xf8\x9d\xe9\x15\xf3\x47\x0f\x15\x3e\xed\x7f\x45\x62\x43\xbb\x90\x34\x2e\x19\x0e\x64\x7f\x39\xe0\x46\x88\x3c\xe2\x8a\x89\x20\x03\x31\x5e\xa3\x79\x42\x9e\x95\x82\xa9\x35\xeb\x78\x96\x33\x96\xd1\x36\x84\x5f\x86\xc4\x66\xe8\xfa\xf2\x27\x2f\x43\xff\xef\xc2\xad\xa5\x60\x1f\x8a\x6b\x2a\xc4\xcc\x6b\x92\x82\x09\x17\xf2\xe0\x39\x3c\x8f\xaf\x98\x2d\x6c\x5f\x4f\x23\x0e\x27\xce\x22\x78\xa7\x23\x77\x47\xfa\x85\xa9\xc8\x57\xbf\x18\x02\xc3\xea\xe0\xd2\x35\xb5\xad\x58\x49\x7d\x66\xa0\xd3\xa9\xba\xeb\xcc\x41\x7f\x18\x33\xe9\xcc\x44\x60\xf9\x75\xd7\x28\x58\xcd\x11\x8d\x7a\xaf\xaf\x1c\x87\x82\x97\xca\xcf\x71\xac\x75\x67\x6d\xc1\xb4\xfb\x51\xc1\x77\x58\x10\xd0\x35\x37\xf2\xd7\x66\x27\x8b\x99\x71\xbb\x97\xd3\xc4\x9b\x51\xfe\xb2\x6d\x37\x5e\x0c\xb9\x10\x95\x74\xa8\x16\xf8\x4e\x76\xfc\x7e\xf0\x72\xd5\x79\x3c\x2f\x65\xab\x2e\xfd\x90\x52\xe6\xb8\x56\x9f\x28\x05\x86\x1c\x31\xa7\x34\x4a\x3c\x44\x06\x9a\x94\x32\x0d\x27\x4e\x27\x12\x71\xea\xfa\x3b\xfe\x64\xde\x75\x37\x84\x6a\x01\xe5\x1f\xda\xe0"}, -{{0x58,0x26,0x19,0xab,0x3c,0xf5,0xa3,0xae,0x77,0x66,0x88,0xbf,0x6d,0xba,0xcb,0x36,0x33,0x0a,0x35,0xad,0x75,0x24,0xe4,0x9e,0xf6,0x63,0x68,0x77,0x64,0xcf,0x6e,0xc7,},{0x20,0x02,0xea,0x0a,0x38,0xa3,0x27,0xe0,0x38,0x4a,0xea,0xe4,0x68,0xdb,0x0f,0x6c,0x85,0x16,0xa6,0x96,0x09,0xaf,0x9e,0xee,0x93,0xe9,0xec,0xb9,0x4b,0x44,0x9c,0x66,},{0xfe,0x97,0x01,0xda,0x1a,0xa8,0x1c,0x55,0xba,0xc3,0x36,0x38,0xf7,0x75,0x54,0x2b,0x80,0x44,0x80,0xf3,0x4b,0x7b,0xfc,0x78,0xda,0x99,0x16,0xe5,0x24,0x6a,0x60,0x4d,0x39,0x0b,0xf9,0x20,0xc8,0x72,0xa7,0x79,0x24,0x24,0x6e,0xe8,0xd0,0x39,0x3b,0x20,0x2e,0x7b,0x25,0xb2,0x48,0x4f,0x65,0x4a,0xc3,0x67,0xcb,0x09,0x25,0xec,0xe3,0x05,},"\xca\x74\x28\x4f\x11\xc5\x6e\x25\x98\xd7\x8a\x4e\xcd\x03\xb4\x0e\x01\x7a\x55\x81\x76\x01\x2b\x26\xfd\xf6\x95\xc3\xde\x98\xa7\x4f\x8f\x40\xa4\x7d\x79\x78\xed\xc2\x4e\xe8\x09\x2b\xfe\x5e\x61\x59\x68\x34\xde\xed\x1d\x9d\x34\xa0\xf5\xcd\xae\xbe\x34\x21\xaa\x19\xe0\x12\xde\x86\x5b\x9e\xe1\xb7\x34\x79\xb2\xbd\x1a\xc9\x82\xf9\x7e\xd9\xc7\xcd\x20\x45\x9c\x60\xfb\xb1\x1e\x1e\x2b\x4e\xac\x5d\xb6\x84\x4c\x71\xd7\x29\x49\x50\x2b\xba\x50\x3a\xce\xc9\x05\xad\xba\x25\xf6\xb1\x19\xea\xf9\x63\x9f\xa8\xab\xb3\x02\xdf\xf9\x93\x2d\x85\x0c\xc4\x4c\x57\xcf\x90\xb2\xe5\x8a\x8b\x52\x51\xc1\x26\xa9\xe2\x8f\x5c\x76\x1b\x62\x80\xe2\xcd\xdd\x79\xcb\xd6\x8e\x53\xff\x4a\x62\x26\xd3\xbd\x4c\x96\x1b\x9b\x9e\x43\x45\xa2\x54\x58\x62\xc7\x97\x38\x66\xf0\x42\x0b\x89\x8e\x7b\xae\xa9\x0e\xa4\xee\x00\x40\x42\xef\x38\xa1\xfd\x95\x6a\x72\xfd\xf6\xfd\x43\x25\x7d\xa9\xfd\xb9\x66\x80\xef\x4f\xdf\x9e\x94\x3d\x26\x5c\xdc\xf2\xe5\x2e\x32\x01\xd5\x40\x8b\xc6\xce\x10\xe5\x70\x0a\xdf\x12\xb5\x5b\xa1\x4a\xa8\x29\xd8\x69\x1c\x31\xf2\x4f\xc4\xa5\x1c\xe6\xfa\xa1\xf3\xef\x2e\xad\x78\xe5\xe7\x53\x44\x6a\xd3\xfa\x4a\x84\xc1\x93\x97\x9a\xeb\xc8\x30\x9b\xad\x60\x81\x4f\x48\x59\xb9\x31\xd7\x04\x14\x76\x44\x91\xc6\xc9\xed\x8d\xb6\x73\xc5\x43\xd3\x51\x85\xcd\x28\x88\xaa\x21\xc1\xa9\x20\x34\x27\xe0\xac\x0b\x1f\xe3\x4c\x0e\x4a\x40\x01\xe0\x95\x6c\x13\xcb\x59\xa3\xba\xf8\x7c\x21\x09\xa8\x88\xa4\xc9\xe7\xaa\x48\x17\x67\xd8\x02\x0f\xf3\x5d\xd7\xc5\xcc\xec\x7c\x08\xe9\x71\xa7\xe2\x18\x13\x8c\x90\x54\x6a\x7d\xdf\x36\xad\x11\x4b\xe5\x85\x57\x43\x2c\x2d\xdf\x34\xce\xd3\x37\x9f\x70\xd4\x40\x7e\x58\x79\xf9\x84\x2f\x38\x17\x17\x05\x1b\x16\x85\xaa\x7a\xb0\xad\x38\x54\x1e\xc1\x68\xf5\x1c\xb6\x88\xf3\xcd\x1a\x01\x9a\x33\x6c\x9f\x4f\x3f\x82\xde\x78\x5c\x07\x48\x67\xfd\xc8\x80\x0f\xc7\x6f\xba\x04\xc8\xad\x8d\xe1\x0d\x2e\x9b\x43\x05\x81\xbe\x44\xc4\x1e\xcc\x8f\xc8\xa6\x16\x31\x43\x99\xd1\x8c\x64\x79\xf5\x7e\x57\x3b\x22\xa6\xee\x5c\xe2\xdc\xc0\x89\x48\xa0\xde\x1f\x0d\xd2\x5b\x65\x71\x5a\xb1\x8c\x70\xc7\x62\xfc\x3d\x7d\x60\x0c\xad\x63\x22\x60\x38\x50\x9c\x19\xab\x35\xb5\x49\x3e\xee\x73\xa7\x03\x73\x1e\xc5\x35\xc9\x0c\x6f\x06\xd9\x4d\x3e\x5f\x7e\x51\xa0\x9f\x9f\x8f\x42\xc5\x01\xb8\x50\x46\x86\x36\x5c\xee\xe9\xe0\xfe\x00\x13\x29\xf3\x03\x52\x21\x46\x71\x7c\x6a\x12\x58\xd0\xf1\x57\xcb\xea\x4b\x5a\x5e\x3d\x13\xbc\x90\x7e\x95\xfd\x6e\x8a\x71\x89\x6a\x02\xc3\x10\x6b\xd2\x6a\x51\x00\x51\xf1\xb3\x02\x58\xab\x27\xf8\x75\x67\x3b\x13\x37\xee\x36\xb7\x1a\x37\x6e\x0f\x9e\x78\x09\xa6\x7c\x67\xd9\xac\xc1\x6c\x25\x1d\xcb\x8c\x92\x6c\x8e\x93\x25\x16\xd3\x8b\x72\x33\xea\xc6\x15\x9c\x59\xca\xd0\x30\x7c\x59\x0e\x71\x31\xb6\x22\x19\x14\x5a\xaa\x35\x5b\xfb\x4a\xcb\x6a\xf0\xa5\x50\x00\x06\xcd\xd8\xb8\x13\xfe\x19\x08\x60\x2e\x08\x74\xc9\x62\x2b\xb3\x76\x73\xba\x1a\xcb\xa4\x14\x23\x16\x67\xbc\xc4\x90\x7a\xc8\x71\xf8\x7e\x6c\xe3\xf5\x91\xc1\x91\x71\x05\x7a\x9f\x45\x7f\x53\x62\xae\xda\x10\x5d\x18\xfb\x84\xf7\xd0\xf0\xa7\xda\x7e\xf8\xda\x91\x14"}, -{{0x2b,0xbd,0x83,0x0c,0xe7,0xde,0xf3,0xfe,0xce,0xa1,0xec,0xd6,0xea,0x0a,0xe9,0xc9,0xf4,0xfa,0x8f,0xfc,0x3b,0x1f,0x19,0x38,0xc5,0x05,0x05,0x1b,0xab,0x40,0xcf,0x7a,},{0x0f,0xdf,0xed,0x8d,0xe3,0xc1,0xea,0xf8,0x91,0xce,0x37,0xe3,0x4c,0xb4,0xa2,0x44,0x1c,0xbb,0xae,0x08,0x83,0x38,0x3d,0x70,0xde,0x24,0x64,0x85,0x0b,0x4a,0x64,0x2a,},{0x13,0xeb,0xc9,0x79,0xa8,0x87,0x10,0xe3,0xc5,0xf3,0x45,0xcf,0xbb,0x82,0x48,0x13,0xb3,0x08,0xa9,0xd5,0xc6,0xde,0xe3,0x28,0xbf,0xd2,0x35,0xa9,0x7d,0xe7,0xb3,0x26,0xde,0x6c,0x73,0x8f,0x96,0xf6,0x98,0x31,0x94,0x92,0x09,0x99,0x68,0x52,0xdd,0x9c,0x09,0x8d,0x58,0x08,0x41,0x87,0x09,0xf2,0xbf,0x51,0x0d,0x46,0xb7,0xf0,0x36,0x06,},"\x5f\x1e\xde\xaa\x3c\x0b\x2a\x63\x31\x1d\x97\xf1\xc5\x4e\x7e\x2f\x68\x71\x70\xe6\xb4\x6e\x21\x69\xcb\xf5\x6c\x66\xf2\x31\xbf\xc4\xa5\x76\xbd\x2b\x84\x20\xbf\x35\x7d\x3a\x90\xf8\xf3\x2e\xa1\xad\x99\x39\xb4\x67\x25\x4b\x66\xa1\xdf\x1f\x5b\x4c\xba\xc6\x3a\x5c\x27\x24\x26\x0d\x24\xd8\xdf\x8e\xdb\x58\xae\x24\x7a\x25\x91\xe9\x20\xb1\xa4\x20\xcf\x8d\x85\x39\xea\x57\xdb\x0d\xad\xff\x1a\xd3\xe9\x8c\x31\x72\xd0\x33\x16\x3c\xb4\x34\xa7\x66\xb0\xc1\x18\xa5\x6a\xbd\xcc\xe7\x9c\x82\xaf\x7b\xac\x74\xed\x0e\xa0\x24\xac\x4c\xe0\x22\x2d\x0a\xa9\x14\xf4\x32\x09\x2b\x1b\x51\x78\x04\xdb\x59\x18\xa8\x45\xe9\xcc\xa5\x5a\x87\xdb\x7c\x28\x52\xf7\xdd\x2e\x48\x36\x01\x85\xcc\x44\x2c\x79\x30\xaf\xe1\x5d\xd6\x22\xcc\x02\xbc\xd1\xee\x77\x8b\x59\x70\x5f\x14\x33\x32\x41\x58\x8a\x52\x2d\xe2\x44\x07\xe8\xe6\xe1\x0d\x5e\xf3\xa8\x8e\x3a\x3c\x44\x38\xc1\x7f\x75\x04\x67\x4f\xd7\xe4\x18\xcb\x2f\x77\xad\x0a\x56\xd2\x38\x67\x03\x15\x5e\x9a\x40\x1c\x43\xdd\xb5\x1e\xad\x55\x20\xaa\x7b\xa0\x38\xe7\xde\x53\x31\x41\x8a\xd5\x52\xbd\xcd\x18\x5f\x50\x3a\x85\x48\xf5\x5b\x63\x86\xe4\x68\x7c\xa5\x15\xf7\xc0\xee\xa5\x70\x98\x3b\xfb\x24\xbe\x16\xf7\xb3\x00\x3f\xb7\x56\xe3\x26\x56\x2f\x2a\x32\xfe\x65\xff\x84\x4c\x39\x84\xc7\x2e\x40\xdd\x49\xe4\xf3\xae\x8c\x0f\x81\x9a\x79\x39\xb2\xe7\x36\xe3\x81\xf5\x82\x3c\xbc\x61\xb2\xed\x01\xd9\xb0\x5c\xf8\xb1\x46\x48\xa4\x8b\x0d\x7c\xbe\x88\x2a\xc1\x6c\xad\xd8\xc4\x2a\xa2\xc7\x02\x46\x34\x7b\x4d\x84\x95\x36\xa7\xac\x22\xc7\x20\xda\x3c\xf1\x78\x72\x5e\xe5\x57\xa9\x2c\x25\xb1\x2b\x8b\x95\x6d\x3b\xf4\x80\x2e\x9e\x8a\x15\xb5\xab\x75\x42\x35\xcc\xa0\xe5\xb7\xe5\x5e\x4a\xec\xe4\x5a\x47\xe0\x84\xce\x14\x47\x44\x05\x98\xef\x5d\x4f\x5f\xdc\x2c\x98\xa5\xad\x13\x6c\xff\xbf\x87\xd3\xcf\x52\xf6\x73\x8c\xca\x79\x48\x35\x60\x92\x07\x8f\xdf\x25\x45\x77\xf5\x59\x69\xa0\xc6\x52\x46\xda\xc8\x09\xa2\xfc\xa1\xf6\x0a\x1d\x92\x98\x77\xb9\xa6\x54\x0e\x88\xa9\xe6\xe9\x15\x59\x38\xd2\x2c\x68\x7e\x63\xb3\x87\x53\x4d\x38\x5e\x89\x61\xe5\x88\x67\x43\xf9\x5f\x4a\x70\x80\xd9\x16\x62\x45\x17\xb1\x53\x36\x03\x0a\x46\x71\x4b\x16\x8b\x83\xd6\xf9\xcc\xe0\x60\x66\x49\xc0\x1f\x0a\x1d\x0a\x2a\x53\xf5\xe3\x78\xf6\xaa\x98\xc3\x84\xaa\xfb\x3e\xef\xdb\x34\x21\xfa\x3a\xc9\x8a\x0d\x3a\x9c\x02\x9c\x23\x00\xae\x02\x41\x06\x7d\x1a\x4f\xc9\x2e\x43\x86\x88\xea\x88\x9f\xcb\x1a\x1a\x9e\x86\x34\xb9\x16\xc6\x0b\xaa\x0c\x18\xbf\xcd\x13\x9b\xfe\x30\x17\xbf\xbe\x16\x29\x13\x43\xce\x86\x05\xbb\x78\x72\x55\x8c\x6b\x5f\xd5\x6d\xfd\x22\x15\x77\xed\xcf\xfa\xa8\xbd\xa3\x4d\x7a\x11\xab\x8c\xb2\x78\x28\x8e\x58\x34\x84\x26\x76\xfc\xcf\xfa\xa9\x11\x1b\xce\xd2\xb3\x57\x5f\xdd\x49\x62\x1b\x76\xe8\xd1\x29\xb6\x17\x00\xee\xab\x03\x14\xef\x94\xd5\x50\x50\x6a\x4b\x8d\x1e\xe6\x55\x08\xd8\x9d\x0e\x99\xe9\x33\x6b\x41\xd9\xf7\x4a\xa4\xd7\x22\x11\x4d\xe0\xf3\x1e\xcf\x00\xb0\x97\xf5\x3c\x9a\xca\x9c\x7a\x28\x5b\x58\xa3\x5d\x70\x29\x8c\x5c\x34\xf7\x4b\x4a\x70\x53\x08\x03\x31\x00\x34\x9f\x0c\x62\xf9\xc2\xeb\xf7\xde\xad\x0a\x77\xb2\x98\xeb"}, -{{0x1a,0x7a,0x3c,0x2f,0x54,0x81,0x13,0x1b,0xe5,0xf8,0x68,0x45,0x6a,0xa2,0xfa,0x90,0xe5,0x6d,0x52,0xcb,0x72,0x1c,0x71,0x84,0xeb,0xff,0x06,0xfe,0xd2,0xfe,0x68,0x5d,},{0x7c,0x2a,0xd0,0xf2,0xa5,0x70,0x55,0x03,0x26,0xfb,0x50,0xa8,0x50,0x83,0x58,0x21,0x67,0x6d,0xe1,0xde,0x12,0x7f,0x6d,0xe1,0x67,0x02,0x99,0xd8,0x14,0xf6,0xe3,0xce,},{0x97,0x61,0x60,0xfb,0x5b,0xbd,0xab,0xe5,0xc8,0x96,0x2f,0x23,0xba,0xba,0xcf,0x0b,0x0a,0xb4,0x1c,0x2b,0xb1,0x3e,0x9c,0x0d,0x44,0x90,0x67,0xb7,0xde,0xcc,0x7d,0xb4,0xe9,0x4e,0x76,0xa7,0x1b,0x9c,0x0a,0xc4,0xd6,0xaf,0x38,0x7a,0x72,0xa8,0xcd,0x73,0xe3,0xbc,0x63,0xb7,0xed,0x65,0x0b,0xee,0xbf,0x17,0x42,0x4c,0x49,0x0b,0xd6,0x0d,},"\xc6\x28\x34\xd9\xd5\x5d\x1a\x44\x03\xe9\x25\xd0\xa5\xb5\x52\xda\x17\x4c\x02\xf4\xe9\x45\xde\xc3\x38\xc1\xbb\xb2\xae\xb4\xff\x40\x02\x0e\xf7\x0f\xf5\x05\x20\x5c\xf8\x81\xb6\x29\x96\x0a\xbd\x62\x76\x4e\x5a\x54\xf2\xb5\x10\x56\x67\xb1\x1c\x7d\x5b\x7a\x4c\xcc\x3f\x48\x8b\xdd\xdb\x95\x8a\x7b\xe9\x54\x62\x07\xe6\xc4\x67\x18\x97\xc0\x53\x50\x8e\x1f\xd8\x32\x22\x13\x0a\x79\x33\x97\x6d\x2b\xec\x61\x4e\xd8\xf9\xb6\xa6\xb9\xf4\xef\xb2\xa5\x8b\x9d\x00\x5b\x94\x3e\x42\xf1\x71\xb7\x09\xa7\x31\x30\x70\xcb\x2e\x06\x8d\xa3\x9c\xf9\x99\x22\xb6\x9e\x28\x5c\x82\xad\x97\xf2\xd6\xc7\x79\x22\xca\xe2\xb5\xe3\x20\xe8\x35\x77\xc0\xd0\x88\x76\x1e\xc8\x81\x52\xc2\x97\x49\x29\x78\xa9\xd7\xa3\xff\x67\xed\xe4\x4c\x2a\x70\x7c\xf3\xe2\x35\x2e\x23\x2f\x53\xc8\x78\x2b\xa4\x89\x28\xa9\x7f\x8a\x36\xb2\x0a\x41\x68\x16\xe9\x45\x79\xb9\xd7\x25\x0a\x29\xdc\x84\x70\xf6\x3a\x70\x58\xe2\xd2\xa9\x9d\x6f\x0c\xcb\x53\x0d\xf5\x96\x95\x05\xef\x5c\x78\x44\xeb\x16\x7d\x20\xf4\x12\xa5\x08\xfa\xb1\xf8\xcd\x9c\x20\xc5\xeb\x9a\x41\x7a\x54\x12\xb5\xda\x6a\x57\x13\x57\x59\xfa\xb1\x7f\x63\x14\xf6\x8d\xf3\x5b\x17\x72\x42\x14\x43\x67\x6f\x31\x25\x79\xaf\x6b\x14\x11\x53\x5a\xda\x8f\x76\x01\x2b\x69\xbb\xeb\x60\xb2\x89\x7e\xe6\x60\x7c\xb3\x69\xcd\xf5\x2f\x4f\x6d\xdf\x88\xcd\xb2\x63\x0d\x78\x89\x6f\x13\x61\xfe\xa2\x2a\xe6\x34\x21\x76\x96\xff\x11\x4f\xb4\x2d\xbe\x4f\x43\x46\xf1\xbe\x5b\x57\xad\xb3\x84\xae\x7e\x49\xb4\x1f\x74\xb3\x1b\x9a\x62\xbc\x69\xdc\xa1\x65\x89\xc6\x34\xeb\x9d\x7c\x6c\x94\xf8\xec\xe4\x4b\x60\x62\x8f\x98\xe1\x02\x4c\xf3\x2e\x3e\x3d\xd6\xdc\xe5\x5a\x12\x22\x53\x2f\x49\x0d\x63\xe6\xa2\x75\x28\x1c\x0f\x3a\x6c\x10\x18\x91\xb8\xd5\x7a\x45\xde\x11\xde\x35\xeb\xb1\x51\xc0\xdc\xd7\x5e\x6c\x05\x0b\x3c\xd8\xba\xba\xe8\x45\xc3\x9f\x66\xc3\x6c\x77\xcd\xe0\x5b\x68\x3e\x4f\xb0\x10\x3d\x93\xe7\x65\x93\x35\xc8\x7f\xc0\xe3\x23\x5b\x2e\x82\x48\x8c\xda\xbe\xb5\xc5\xc8\x75\x80\x87\x45\xee\xa9\x2d\xe8\x6b\x8e\xfc\xb6\x3e\x16\xd0\x82\x91\x9a\xee\x2e\x92\x89\x9c\xb0\xbc\xf1\xc1\x42\x15\x77\xa4\xa0\xd9\xdb\x09\xee\x1f\x9f\xeb\x92\xa5\x38\x21\x03\xcf\x7c\x32\xcf\xe4\x63\x72\x5a\xe4\x86\x6d\xaa\xfe\xda\x05\x34\xc1\x69\xf8\xf9\xbe\x40\x4f\x3b\xaa\xe1\x23\xfa\x76\x8a\xce\x46\x17\x8d\x4b\x9b\xbc\x5b\xd7\xae\xec\x79\x03\xb0\xa5\xbc\x57\x53\x89\x86\xee\x09\xe0\x7e\x32\x07\x7b\x3b\x9d\xe5\x0d\xd1\x96\x7a\x37\x2c\x38\x5a\xc8\x86\x28\x7c\x18\x45\x1a\x64\xef\xb3\x7d\x05\x6f\x9f\x41\x94\xc0\x8b\x1e\x3e\xc9\x70\x22\x26\x7b\xf0\x04\x3c\x13\xd2\x6b\x9c\xe1\xf5\x39\x05\xf6\xe4\x1b\x3d\x99\xdc\x81\xb3\x31\x90\x9b\x72\x26\x66\xef\x24\x32\xe6\xaf\x8a\x45\x31\x07\x53\x12\x30\xce\x4a\x1a\xf8\xee\xd6\x26\xda\x22\x3d\xa7\x6b\x46\x50\x7e\x33\xd7\xcd\xbd\xe0\x2d\x41\x10\x40\xc8\x9a\x11\xd9\x51\x56\xed\x4a\xc2\x60\x5b\x82\x69\x39\xc6\xcf\x87\x7b\x4e\xe7\x36\xc5\xda\x77\xcf\x46\x50\xa9\x99\x7a\x3b\x9c\xf4\x6a\x82\xba\x2b\xc0\x13\x33\xc0\x44\x78\xb5\xc9\x2e\x24\x98\xbd\x00\x2f\x01\x31\x40\xae\xdb\x30\x1b\x95\x99\x3d\x1d\x75\x08\x70\xd9\x88"}, -{{0x19,0x1a,0x1d,0x90,0x32,0x1c,0x7f,0x4e,0x74,0x94,0xbb,0x98,0x29,0x09,0xa9,0xeb,0x40,0xc3,0x34,0x1d,0xd3,0x2a,0xe4,0xd9,0x67,0x50,0xb7,0xd0,0x29,0x66,0xb4,0x0f,},{0x95,0x62,0xd9,0xe2,0x13,0xf1,0x45,0xc4,0x56,0x93,0x5b,0x70,0x31,0xc6,0x80,0x66,0x9f,0x8b,0xbd,0x31,0xa4,0xc2,0xed,0x3c,0x91,0xc4,0x00,0x2a,0x56,0x29,0xe9,0x7b,},{0x74,0xcb,0x02,0x8d,0xc6,0xb7,0x5b,0x37,0xa1,0xda,0xea,0x1c,0xf8,0x84,0x65,0xdb,0x83,0xa0,0x09,0x3f,0xec,0xb2,0x2d,0x99,0xba,0x85,0x5e,0x9a,0xb5,0x9d,0x05,0xcb,0x22,0xc8,0x7d,0x0b,0x09,0xdf,0x7c,0x11,0x62,0x13,0xba,0xa8,0xf1,0x89,0xb2,0x70,0x3f,0xf9,0x53,0xcd,0x20,0x2e,0xb9,0xde,0xa3,0x97,0x6e,0xe8,0x8f,0x5f,0xa7,0x03,},"\x85\x89\x0d\xb4\xe2\xfb\xce\x09\x3d\xde\x5a\x80\xbf\x8f\xe0\x9a\x98\x4b\x83\xa4\x9b\x7c\xcb\x5d\x4b\x06\xcd\xaf\xdd\xd3\x82\xe4\xb8\xa8\xa5\x05\x30\xe8\x2c\x20\x06\x12\xc9\xd7\xd8\xa0\x89\xbc\x8a\xa8\x45\xc3\xcf\xcc\x38\xa6\x19\x5d\x21\xc2\x61\x8c\x3d\xba\x2b\x57\x09\x20\xec\xcf\xcd\x23\x6f\x17\xf0\x8d\x81\x42\x68\xf8\x82\x24\x2d\xdf\x07\x02\xda\x87\x85\xf4\x07\xaa\x8f\x86\xfe\xcf\xa9\x03\xc4\x8d\xa8\x3f\x83\x97\x77\xeb\x6b\x4a\x2b\xbf\x5d\xf7\xa4\xda\x53\x47\x5a\xf1\xff\xe4\x4b\x5f\xe0\x07\x2b\x8f\xbf\x3d\x26\xe6\xd8\x9e\xa6\x7d\x8a\xc8\x45\x94\x92\x89\x0a\xda\x65\x7e\xb3\xdc\x24\x92\xb8\x8d\xe1\x75\xb4\xbb\xa1\xa5\x08\x06\x4d\x61\x96\x74\xaa\xae\x2a\xf0\x9d\x31\xa5\xc2\x7c\x8d\x5d\x5a\x29\xb0\x37\x79\xf4\x28\x6b\x89\x66\xce\x40\x7e\x6f\xf6\x92\xfb\x94\x25\x20\xa9\x93\x8d\x69\xcc\x70\xac\xb0\x6b\x01\x4b\x6d\xfc\x19\x83\x42\x06\xcf\x1a\xc6\xc4\x48\xae\x6f\x07\x80\x25\xb5\x5f\x3d\x82\x72\x01\x26\x8a\x92\xad\xd9\xad\x17\x8e\xf7\x6a\x29\x89\xfe\xdc\x6e\x39\xf4\xeb\xb9\xf9\x6c\x9b\x83\x52\x69\x4f\xa5\x4f\xa0\x22\x01\x9c\x0e\xc0\x01\x2d\x0d\x76\x9e\x23\x67\x80\x3f\x92\x5f\x17\x5f\x9f\xb9\xcb\xec\x4a\x0c\x9c\x1e\x2c\x83\xea\x57\xe6\xa9\x2a\x17\xf5\x55\xca\xb9\x34\x27\x1e\x72\xc8\xcc\x32\x15\xfc\xb8\x7c\x20\x53\x9b\xf1\x42\x77\xb1\xbf\xbd\x6e\x58\x80\xef\x95\x3f\xc7\x5f\x23\xc0\xdd\x4f\xcc\x1e\x0b\xe3\x40\xaf\x94\x7d\xe0\x2e\x87\x7f\xd5\xc7\x7d\xd1\xdf\x7b\x41\x4b\x5c\x0b\x40\xc7\x49\x56\xa5\x45\xa1\x15\xb0\xc6\x99\x3a\xb2\x33\xb7\xe7\x2c\x82\x2b\x6b\x33\x81\xbb\x1f\xc1\x08\x75\xbf\xfe\x3e\x2e\xd1\x19\x0f\xa3\x3f\xc1\x5d\xa0\x83\x79\x4f\xcc\x2c\x5b\xf5\xa0\x79\x09\x06\x3c\xb2\x89\xa0\x8a\x2c\x8a\x33\xd3\x43\x84\x2c\x2d\x6a\x3c\xfa\x2a\x16\xca\x2e\xaf\xca\xb7\xea\x10\x0d\x1c\x71\x4b\xaa\xbb\x71\x49\xf0\x7e\x25\xde\xe3\x23\xe7\x80\x75\x7d\xfa\x80\x16\xfa\xa7\xc0\x62\x62\x22\xc3\x65\xf8\xf2\xf6\x68\x7d\x1d\xed\x23\x4f\x79\x9c\xc5\x0d\x1c\xd2\x6b\x4c\xfa\x40\x45\x91\x70\x56\xfc\x79\xc3\xb8\x8b\x2b\x19\x08\xe3\x72\xdf\x66\xda\xc8\x73\x46\x31\x64\x83\x49\xbc\x37\xfa\x34\xb2\x5f\xff\x3b\x07\x47\xb6\xbc\x16\xb9\x4e\x3e\x58\x95\xe4\xbb\xd9\x3d\x47\x8a\x6c\x1f\x75\xe4\xfa\x30\xfa\xa9\x22\x04\x9e\xd4\xc5\x0f\x12\xf4\xb3\x12\xa8\x97\x4d\x0f\xed\x8d\x44\x25\x5d\xcb\x2b\xf0\xfe\xbe\x47\xfb\x3f\xb8\xed\x99\x03\xb5\xba\x4c\xa1\x8e\x3c\xc6\x76\x2c\xfa\x1e\xaf\x04\xdf\xa9\x44\xd4\x96\xe0\xfe\x8b\xb7\xdc\x04\x54\x51\x39\x6b\xfa\xba\x54\x85\xd9\xd5\xf3\x91\xa9\x54\xc3\x71\x42\x53\xcc\xd9\xb1\x99\x64\xd4\x28\x06\x80\x72\x07\x83\x03\x6b\x3a\xbf\xaf\x28\x84\x58\x3e\xa5\xbd\xbc\xf6\x9d\x08\x89\x7a\xb2\x88\x31\x46\x35\xab\xb4\xc2\x96\x4b\x71\xad\x92\x91\xfe\xb5\xb6\x1f\x80\xe9\xb0\xcc\x07\xf9\x12\xa8\xe5\x59\x8d\x55\x48\xde\xfe\x0e\xea\x1c\x44\x85\x73\x71\x0a\xac\xdd\xb1\x52\xf9\x3c\x7c\x6f\xd3\xf7\xe4\xed\x9f\x74\x42\xa6\xb9\x00\xf2\x3c\x3c\x54\x4c\xe5\xc9\xba\x5f\x5e\x92\xaa\xfd\x11\xc9\xff\x5f\x79\xc0\x8b\x9d\x04\x5f\xef\x07\x97\x06\x25\xf6\x2e\x2f\x43\x34\xa4\xd6\x64\xca\xf7"}, -{{0x62,0x85,0x63,0xaa,0x3e,0xe2,0xfc,0x61,0x1b,0xcf,0xf7,0x8b,0xfb,0x2a,0x75,0xe9,0xfd,0x87,0x80,0xe8,0x7a,0x93,0x94,0x99,0xa6,0x1b,0xea,0xa6,0xa4,0xb7,0x19,0x13,},{0xda,0x20,0x61,0x6e,0xe4,0xa4,0x1c,0x2e,0xbf,0xdc,0x50,0xab,0x54,0x95,0x3b,0x6d,0x38,0x7b,0x06,0xc6,0xde,0xf7,0x57,0x96,0xb0,0x88,0x09,0x56,0x5c,0x6c,0xf8,0x05,},{0xc9,0xa6,0xaa,0xa9,0xb4,0xe1,0xcc,0xe1,0xb5,0x84,0x45,0x72,0x5f,0x61,0xf5,0x52,0xc8,0xfb,0x45,0x83,0x1f,0x03,0x48,0x27,0x98,0xf0,0x1f,0x66,0x3e,0x99,0x83,0xdb,0x1a,0x82,0xfd,0x33,0xab,0xa3,0xec,0xcb,0x96,0x22,0x64,0x26,0xd5,0x0a,0xe1,0x7c,0xc5,0x12,0x74,0xce,0x18,0xa3,0x88,0x60,0xf4,0x0b,0x2f,0x82,0x36,0x1b,0x5c,0x03,},"\x05\x6f\xb9\x54\xfb\xe6\xa6\x01\x4f\xad\xac\x1e\x1a\x9f\x56\xcc\x08\xaf\x37\x34\x8e\xba\xf6\x92\x06\x83\x38\x4e\xfa\x47\x62\x6c\xcd\xdf\xea\xd2\xd5\xe9\xe8\xcf\xff\x45\xf7\xac\x63\xde\x63\xf6\x9d\x12\x84\x8c\xe3\xc0\xef\x1f\x53\x0a\xde\x43\x0f\x0a\xfd\x5d\x8e\xcf\xd9\xff\xd6\x0a\x79\x74\x6a\x2c\x5b\xee\xdd\x3e\x67\x24\x99\x82\xf8\xb6\x09\x2e\xe2\xd3\x40\x47\xaf\x88\xa8\x1f\xea\xb5\xd5\x2b\x47\xd5\xb3\xf7\x6c\x20\x41\x72\x5f\x6f\x81\x32\x93\x05\x0a\xaa\x83\x4b\x01\xa3\xa5\x8f\x69\xaa\x4a\x8c\xa6\x1f\x5b\x74\x6f\x60\x0f\x3d\x45\x2c\x62\x82\xff\xdc\xa4\x42\x9b\x93\x38\x96\x7b\xa3\xa7\x26\x66\x90\xae\xc7\x5e\xbf\xbf\x7b\xe9\x8d\x99\x9b\x03\xed\xdc\x72\x92\x58\x1b\x0d\x69\xe3\x0a\x03\x51\xa1\x51\xdb\x70\x41\x2b\x0b\xfd\x43\xd3\xba\xa9\xd4\x56\xcb\x3e\x0b\x4f\xc1\x9c\xb0\x9e\x6c\xad\xcb\x6d\x3f\x3b\xe5\x13\x7c\xc7\xa8\xd3\x21\x9e\xc2\x03\x6e\xc6\x70\xed\x7e\xc5\x23\xb1\xb1\xc6\x87\xb5\x46\x53\x07\x88\x2f\xe3\x8d\x74\x72\xd0\xba\x87\xa4\x71\x86\x83\x09\xd2\xf7\x73\xff\x24\xc8\x7d\x39\xc1\x6b\x70\x8a\x4e\xd9\xaf\x43\xf7\x4c\x8d\x85\xcf\xe8\xab\x54\x06\x90\x7e\x94\x1a\x14\x97\x0e\x20\x9c\x29\xff\x7e\xd8\xa2\xf9\x35\xae\x41\x70\x9f\x27\x0d\x0d\x08\x55\x5e\xf7\xaf\x2e\xdf\xe4\x0d\xf3\x99\x22\x3c\x78\x5a\x43\xe7\xf3\x69\x15\x89\xe2\xea\x4c\x03\x6f\x11\xd0\x3d\x7d\x1e\xea\x14\xf6\x20\x03\x53\x25\xcf\x2b\x33\xba\xf3\x86\x39\x3e\x8a\x97\x2a\x7a\xf6\xcd\x9b\x85\x43\xb3\x2e\x25\x33\xd1\xfc\xc3\x17\x7f\xd9\x6d\x1e\x13\xbf\x8b\x68\xde\xb2\x22\xf9\x44\x97\x26\x5d\x3c\xcb\x34\x57\x51\xbd\x5b\x66\x90\x78\x08\x19\x98\xd6\x08\xca\x5f\xdc\x13\x48\x39\xd4\xed\x2b\xeb\xb2\x95\x2f\xea\x5a\x39\xc6\xf0\x33\xc1\x55\x8f\x69\x8c\xe4\x94\x6e\x4f\x6c\x08\xaf\x87\x4f\x27\x35\x7f\x87\x0e\xbe\xeb\x21\x99\x97\x6f\xfa\xef\xac\x95\x1f\x8e\x17\xfe\x7d\x08\x21\xe1\xb9\x2a\x90\xaa\x4e\x9d\xef\xd3\xfa\xfd\xa0\x52\xa4\x44\x47\x6d\xb1\xce\x38\xa9\xe1\x76\xe8\x41\x18\x9a\xbd\x8f\xec\xde\x0f\xbc\x5c\xb5\x5f\x51\x1f\x5f\xde\x07\xea\x97\xde\xb3\x9b\x7a\xa8\xdc\x84\xa3\x94\x6a\x6c\xf9\x26\xd3\x9b\x95\xc1\x1a\xf9\xd6\x4d\x98\xb8\x07\xf4\x70\x4d\x0a\x2b\xda\x97\xda\xd9\x88\x1a\xda\x1b\xf6\x63\x63\x66\xe6\x0a\x52\x2b\x48\x21\x04\x78\x61\xc7\xaa\xe2\x14\x6a\x02\xee\xf6\xb2\x5d\x51\x37\x1a\x0f\x17\xd2\x4b\xc1\x87\xdc\xdd\x05\xd5\x41\xc2\xf7\x22\x01\x42\x79\x15\xa3\x92\x8c\xd3\x78\x68\x91\x03\xac\x50\xb3\x3f\x87\xa4\x7e\x8c\xdf\xa6\x87\xa5\xf0\xaf\x8a\x56\x73\x1d\xab\xe6\x62\xf4\xf2\x83\x6d\xe0\xba\x8f\xaf\xd8\x6a\x38\x54\xbc\xa0\x12\xd7\x08\x8a\x00\xb9\x85\x4c\x2d\x3c\x70\x8d\xdf\x58\xfa\xa3\x55\xa8\x9a\xfc\x2c\x80\xf3\xf5\x33\x6d\xa0\x1d\x72\xa2\x77\x1a\x05\x58\x13\xfb\x35\x33\x0f\x7d\x2e\x01\xb1\xd1\x2d\xaa\x95\xed\x55\xd3\xbd\xc5\xdf\x77\x39\xcb\xc3\xca\x09\x7a\x41\xb6\xb2\xbd\x7f\x0f\xf9\xdd\x1d\x86\x58\x98\x3b\xa3\xff\x79\x20\xc1\x5f\x29\x2a\x1e\xf9\xfc\xad\xa1\xc6\x07\xec\xb4\x5d\x3a\x73\xc9\xff\xd4\x2f\x3e\x16\x02\x2f\xdf\xe1\x27\x44\x92\x63\x95\xf7\x4f\xb3\x11\x17\x93\xfa\x92\x81\x82\x1a\x66\xa0\x1d"}, -{{0x91,0x41,0xf7,0x9e,0xd3,0x0b,0xf6,0x00,0x61,0x1a,0x13,0xf3,0x67,0xb4,0x03,0x96,0xf2,0xec,0x83,0x9c,0x56,0x12,0xbb,0xf1,0xe6,0xe4,0x97,0xf8,0x39,0x54,0xbc,0x88,},{0xf1,0x4e,0xda,0x96,0x26,0x40,0xbe,0xcb,0x66,0xc4,0xd1,0xf1,0xa0,0x21,0x11,0x02,0x51,0x91,0x7b,0x8b,0x1d,0x34,0x82,0x82,0x98,0xd3,0x21,0x45,0xba,0xf6,0xe5,0xd9,},{0xcf,0x20,0x2d,0x7f,0x2f,0x9e,0xd1,0x17,0xf4,0x29,0x50,0x2b,0x2a,0x5a,0xff,0x54,0xa7,0xf7,0x51,0xd2,0x17,0x15,0x15,0xa4,0xd2,0x03,0x75,0x34,0x46,0xdf,0x0e,0xba,0xc8,0x69,0x84,0xc8,0x8b,0xd4,0x2b,0xd1,0xfb,0x8d,0xcb,0x40,0x87,0x76,0x72,0x2a,0x38,0xf3,0x2c,0xce,0xb2,0x5f,0x32,0xa2,0x5d,0x73,0x93,0xf1,0x38,0xee,0xdf,0x0a,},"\x8f\xec\xaa\x7a\xe9\xa3\xd4\xa4\x85\x1a\x66\x36\x2b\x36\x6e\x16\x7b\x9f\x43\x00\xfd\xab\x20\x56\x54\x75\x19\x87\xf0\x85\xde\x61\xbe\xc9\x34\x4a\xa8\x6f\x5e\x5c\x64\x77\x51\x4c\x28\x04\xce\xd7\xac\x0c\xd0\x62\x85\x29\xa3\xa1\x59\x92\x36\xed\x67\xbe\xbe\x1f\x2e\x95\xaa\x15\x1f\xe0\xf3\xb3\x01\x1a\x1d\x4b\xe9\x90\x1c\xaf\xab\x2f\x18\x91\x90\x4d\x4b\xff\x01\x28\xc1\xd3\x5e\xce\xcb\x32\x2b\x3c\xc0\x1d\xac\xc5\xae\x3d\xca\x69\x14\xa7\xd3\x4d\xa8\xc9\x65\x7b\x95\x0f\x89\xd1\xd6\xae\xc3\x29\x9b\xb6\x90\x11\x10\x71\xfa\x87\x28\x27\x74\x94\x3d\x96\xa4\xab\x7c\x3d\x6d\xe7\xd1\xbf\x11\x93\x63\x06\x8c\xc8\x2d\x45\xe4\xb7\x64\x54\xc6\x08\xbc\x35\x66\xb7\xf9\xb3\x85\xcc\x7e\xb3\x8e\xe4\x29\xaf\xc2\xda\x99\x66\x9f\xc5\xc1\xbe\x82\x16\x1a\x1b\x0c\x33\xf7\xba\x9a\xd4\x41\x9d\x20\x62\x97\x19\x01\xdb\x00\x3b\xfa\x23\xc4\x47\x14\x99\x5c\xb0\x6b\xfa\x96\x6e\x50\x23\xaa\x93\x46\xfd\x37\x5a\xe2\xa1\xe8\x40\x84\x31\x4d\xf3\xf0\x8c\xe2\x08\x00\xc2\xc2\xad\xfb\xb8\x13\x66\xf6\xb1\x04\x24\x3d\x62\xd5\x04\x1e\x72\x73\x43\x3f\x17\x58\x1b\xf9\x3f\x4c\x61\x46\xfa\x96\x6f\x63\x8a\xb0\x7e\xa1\x66\x94\xa7\xce\x30\x5c\xc6\x09\xa6\xe1\x06\x23\xff\x7f\x6c\x79\x16\xb6\xe4\xdb\xde\xbb\x7b\x52\xec\xa7\xf0\xd5\x18\x7f\xf6\x64\xd7\xc3\x70\xed\x22\x88\x6a\xa2\x67\x13\x29\xd9\x28\xe0\xa3\xbe\xa3\xb4\x71\x1a\x12\x8b\x9a\xab\x90\x26\x6f\x86\x51\xd2\x20\xb9\xcc\x1c\xbf\x5b\x1c\xe7\x26\x59\x31\x80\x36\x90\xd3\x29\x1c\x01\xea\xd4\xdb\xc3\x32\x9a\x97\xe8\x5c\x4f\xe1\xd3\x56\x60\x8c\xc9\xe6\x0b\x05\xbc\x14\x83\x8a\x86\x08\x27\x9a\x00\x61\xde\x28\xff\x7b\x8e\x81\xf5\x9c\x8a\x8c\x55\x23\x92\x4c\x4c\x48\x5e\x6e\xa8\x0a\xc8\x17\x50\xbb\x0e\x41\x9e\xfc\x78\x58\xcd\x4a\xf5\x0c\x8b\x8c\x80\x65\x0f\xac\xab\x4d\x82\x58\xf9\xca\xfa\x03\x10\xa0\x07\xcc\xcb\xc4\x18\x5c\x82\xfd\x14\x6d\xf1\xd8\x11\x87\x9d\xa3\x65\x0d\x57\x16\xf1\x00\x4b\x71\xd2\xc7\xf2\xbd\x65\x03\xc3\x54\x58\x9f\x86\x02\xc9\x50\xa1\xf5\x13\x9f\x81\x14\x60\x75\x28\x80\xa3\x41\x11\x66\x30\xe4\xff\x84\x94\x8e\x74\xa9\xeb\x35\x0d\x64\xd8\x29\x30\x02\x20\x02\x33\xf2\x09\xb1\x7d\x78\x89\x7c\x7c\xe6\xce\x29\xe2\x9f\x82\xd4\xad\x6c\x61\xeb\x79\xf5\x73\x9c\xb6\x68\xb2\x1a\x74\x55\x55\xc9\x6e\x19\x52\x68\x45\xe8\x2c\x6e\xd2\xb1\xc6\xbd\xd6\x36\x4b\x8f\xc7\x9b\xa9\xa3\x2d\xbd\x3f\x8b\x97\x5e\xb9\x23\x62\x39\x58\xae\x0d\xaa\x4f\xfa\x13\x92\x17\xc0\x0e\x02\x1f\x93\x7e\x9b\x79\x1c\x37\x99\x1a\x35\xe5\x23\x1a\x19\x14\xc0\x45\xa7\x87\x43\x2f\x97\xb8\xe2\x06\x3d\xb1\x05\xe1\x4d\xa9\x79\xc1\xc4\xcb\xa7\x85\x21\x0e\xb0\x20\x11\x33\x4b\x23\x0c\xfb\x68\x31\x99\x8c\xcc\xe2\x53\x86\xf4\xf3\xba\x0d\xce\x20\x06\xe9\xc3\x94\x0b\x4d\x5a\x56\xaa\xcc\xdc\xab\x02\x71\x86\x89\x81\x63\x60\xf1\x88\x52\xfd\x19\x98\xa9\x9f\xce\x9a\x04\xda\x3f\x5e\x23\xaf\x94\xc6\xe8\xa5\xba\xdf\xd3\x93\x04\xb9\xe2\xa3\x76\xa1\xf9\xba\xc0\x9a\x85\xbd\x04\x24\x76\xe2\x6b\x58\xec\x73\xf1\x23\x6d\x41\xab\x4b\x4e\x7a\x54\xde\xf9\xd6\x6a\x38\xf8\xe5\x46\xde\x7b\x38\x8e\x1e\x7d\x66\x81\xe5\xe2\xa0\x96\xf1\x60"}, -{{0x69,0x5c,0x96,0x0b,0xbb,0x0d,0xd5,0x7f,0xfa,0x36,0x15,0x1c,0x85,0xde,0x73,0x51,0x54,0xfe,0x5a,0xd5,0xf5,0xfc,0x77,0xd0,0x05,0xa0,0xa3,0x20,0x11,0xde,0xb3,0x0c,},{0x34,0x12,0x5e,0x4e,0x21,0xf7,0x89,0xed,0x0e,0x11,0x80,0xc1,0xf6,0x36,0x9c,0x72,0x1d,0xca,0xe9,0x85,0x9b,0x6f,0x7b,0x04,0xf9,0x57,0xe5,0x10,0x01,0xee,0xde,0x8a,},{0x4a,0xf4,0x1c,0x55,0x4d,0x99,0x08,0x12,0x68,0x6c,0x32,0x9a,0x87,0x5c,0x41,0xee,0x24,0xb4,0xa7,0xfd,0x7b,0x3d,0x4f,0x8c,0x8d,0x52,0x75,0xf2,0xe7,0xcb,0x24,0x2b,0x25,0x8b,0x58,0x58,0xa4,0x66,0xde,0x59,0x5c,0xe2,0xa2,0x17,0x7e,0x35,0x1c,0x7f,0x08,0xc7,0xfc,0x4e,0x0b,0xf9,0x7e,0xc5,0xfb,0x2d,0xcb,0x82,0x52,0xd2,0xc9,0x0a,},"\x37\x06\x69\x6c\x7a\x90\x66\x90\xd0\xd3\xb7\x1e\x7e\x21\x1c\x7b\x06\x71\x68\xf3\xa8\xf1\xed\x98\x4a\x0a\x5e\x60\x78\x59\x76\x62\xe4\xe7\x88\x9d\x52\xdb\x0f\x78\xe0\xd5\xef\x0e\x5f\x7a\x0a\x0f\x42\x63\xb6\x84\x8b\x07\x25\xca\xa4\xb1\xce\xa6\x98\x74\x09\x51\x1c\x8e\x5e\x98\x2d\x3f\x5b\x82\xbb\x56\xa4\xa7\x94\x71\x21\x93\x7f\x8e\x10\x5c\x5a\x14\xb5\x3e\x6c\x37\xcc\x71\x6b\x1e\xba\x92\x24\x21\x82\x8b\x04\x6f\x68\x56\xc4\x4f\xab\xf1\x3a\x75\x16\xc6\x2a\x5f\xf9\x85\x68\x45\x0c\xee\x78\xb1\x40\x33\x50\x47\xbf\x1c\xa7\x7e\x15\x49\xa8\x94\xfe\xeb\x07\x80\x45\xe4\x64\x18\x32\x25\x3b\xf6\x95\x48\x54\x52\xec\x36\x90\x65\xa6\x00\x29\xa6\xc9\x07\x7a\x37\x9d\xb2\x04\x85\xea\x2e\xdb\x6c\x96\x95\x47\xbb\x26\x53\x28\x9b\xc6\xe8\x1f\xfc\xb8\x4b\xdb\xf7\x73\xdd\xea\x4b\x37\x50\xe9\xa7\x23\x95\xd1\x17\xf6\x44\xb0\xe2\x20\x61\xd4\xf3\xbb\x7c\x5b\x61\x2e\x4b\x70\x39\x5e\x07\x79\x51\x6b\x46\x65\x91\x16\x90\x2f\xd0\xfb\xcd\x23\x40\xee\xa4\x5e\x9c\x23\xdb\x25\x64\xa5\xe1\x1d\xc7\x9e\x8f\x4b\x33\x2a\x44\x3e\xc3\x5a\xad\x96\x04\xfe\x79\x12\x52\x08\x82\x95\xe8\x4f\x65\xa3\x07\x31\x25\x50\xd9\xeb\xf6\x1f\x36\x7e\x4a\x0f\x2b\x56\x23\xe5\x3e\xf6\xbc\x13\x28\x25\xfc\x24\xeb\xee\x4e\xbf\x33\x8c\xbf\xb5\xdf\x69\xb3\x2d\x03\x0d\x44\x7c\x44\xf3\x13\xba\x96\xfe\x07\xbb\xfe\x5b\x01\x66\xea\xec\xbc\x61\x9b\xb6\xb2\xe5\x92\x40\x10\xba\x3e\xc1\x50\xff\x6a\x69\xfe\xc4\xde\xd9\xc4\x42\xf9\x8c\x15\xe7\x7f\x31\x9b\x48\x43\xb3\xb7\x48\xb5\xd2\x60\x89\xa7\x6c\x2b\x83\x4f\xf9\x3c\x41\x3e\x04\xca\x95\x50\xcd\x21\x1c\xe2\xd6\xa5\x83\xd7\x82\x57\x50\x66\xdb\x6d\xd3\x3e\x8d\x5e\x83\x74\x35\x5d\x06\x8a\x5e\xb9\x6f\x8b\x3d\xa8\xdd\xdf\xb5\xba\xf5\xc5\x96\xda\xaf\x55\x6a\x8f\x2c\xb5\x78\x1e\x50\x42\x32\x7f\x92\xae\x06\x21\xea\xe0\x88\xb5\xf0\x13\x59\x2e\x77\x87\x3a\x81\xd7\xe0\x68\xd7\xb8\x33\x7d\xb9\xf1\x09\xa8\x35\xb4\x75\xe5\xca\xf7\xce\xa5\xaf\x3b\x4a\xd6\xd9\x0b\xaa\xf1\xc7\x36\x55\xec\x67\x67\x47\xfc\xdd\x41\x77\x5b\x4f\xbe\x39\x24\xc3\xf4\x1d\x8a\x73\x75\x28\xd1\x2d\x61\x56\x65\x3a\x22\x35\x8c\x68\x21\x42\x6b\x2c\x0a\x33\xe1\x63\x4c\x62\xc7\xc8\x38\x56\x49\xbc\x23\x3e\x7d\xaf\x94\x39\xf0\x9d\xb9\xbd\x11\xea\x01\xe2\x8b\x77\xec\xbb\xc4\x59\x0e\x29\xfd\xcf\x0f\xdd\xe1\x52\xf6\x47\x81\x32\xfe\x4c\x3a\x5b\x45\xa7\x30\x5a\xf6\xe3\x81\xca\xdd\x72\x49\x6e\x66\xbb\xb8\x66\xce\xa4\x7f\x7e\x7d\x7e\x63\x34\x16\x00\xaf\x3f\x49\xce\x9c\x9e\x4e\x37\x39\x4d\xf5\xdf\x71\xdc\x10\xcd\x39\x1f\xdc\xb8\xa1\x93\xdc\x98\xfc\x19\x05\x9f\xa3\xac\x23\x0e\xc5\x47\x6b\xf9\x4d\x85\x55\x6a\xce\x6e\x1b\xa3\x24\x21\xbf\x59\xdc\xbe\x05\xc5\xe1\x5d\x34\xc6\x64\x4e\x27\xd0\xa0\x2b\xe9\x7f\xa8\x38\x7e\xe0\x37\x06\xf2\x2a\x8f\x4b\x3b\x40\x40\xad\x7d\x3f\x8a\x86\x97\x1a\x20\xa0\x9e\xc8\x1b\x76\x96\xd8\x34\xc5\x26\xb8\xe5\x1c\xb9\x7d\x27\x64\x3f\x9a\xbf\x5e\x29\xff\xd0\x33\x3f\x95\xde\x15\xd1\x10\xc2\x06\x4c\xa4\x94\x67\xc1\x4e\xf2\x27\xf4\xba\xbf\x1a\x55\xe7\xb1\xcd\xa0\x42\x9c\xff\x25\x6b\xe3\x1c\xf1\x16\x71\x9a\x81\xb9\xc5\xfb\x75\xfd\xf6\x4e"}, -{{0x25,0xcb,0x17,0xfc,0x33,0xd2,0xbf,0x83,0x84,0xae,0x4d,0xf2,0x0c,0x1f,0xad,0x5c,0x35,0xfd,0x76,0x5a,0xff,0xde,0x04,0xb5,0x25,0x6d,0x4d,0xe0,0x1c,0xa8,0xde,0x14,},{0xb8,0x6c,0xa3,0x12,0xfe,0x59,0x85,0x20,0xc6,0x4b,0xe5,0xc7,0x2f,0x5b,0x23,0x81,0x65,0x07,0xf6,0x9e,0x07,0x0f,0x82,0x8e,0x02,0xd2,0xaf,0xcf,0xe1,0x1b,0xfa,0x01,},{0x8c,0xcb,0x0d,0xbc,0xf7,0xcc,0x03,0xe8,0x3e,0x21,0xc5,0x74,0x74,0xaf,0xd3,0xad,0x88,0x98,0x09,0x7b,0x97,0x2e,0xde,0x17,0x5a,0xca,0xae,0x48,0xe3,0xec,0x17,0xb2,0xdb,0x06,0xfc,0x82,0x77,0x6b,0x07,0x51,0xc0,0xf9,0x56,0xfd,0x71,0x96,0xf3,0xd1,0xc9,0x63,0x21,0xa6,0xcf,0x3d,0x89,0x24,0x15,0xd8,0xf8,0xee,0xb4,0xa1,0x41,0x08,},"\x4b\x4a\x71\xcb\xf8\xcb\xaf\x57\xa7\x7d\x4e\xa1\x88\xa6\xf9\x64\x84\x0f\x0d\x71\x4a\x5f\x38\xa0\x95\xa1\x3b\x4e\x57\x12\x97\xa8\x8b\x79\x24\x17\xd1\x61\x84\x42\x7f\x90\xe0\x43\xdd\x8a\x55\xb7\xf1\xc1\x3e\x00\xdf\xa6\x05\x16\x44\x5c\xbe\x77\x06\x8c\x79\xc8\xc3\x5e\xbe\xac\x33\x0c\x33\xf1\x12\x1d\x05\x73\x1a\x8f\x51\x32\xd6\x48\x00\x73\x27\x46\x41\x19\x5a\x75\x20\x21\x16\xff\xf1\xc3\x18\x81\x71\x78\xfd\xd7\x68\xbb\xdf\x10\x5f\xa0\x69\xc7\xa3\xd1\x43\xfd\xf5\xd1\x7b\xfa\xd7\xc0\x62\x4e\x52\x92\x06\x8f\xd7\xbb\x6d\x30\x3b\x4a\x27\xcb\x20\xa4\xe6\x18\x75\x07\x67\x87\xd1\x9f\xa6\xf7\x29\xc9\x4d\xc0\xba\x9b\x8c\x0b\xfd\x98\x66\xda\x5c\xb2\xe7\xa2\xcd\x2e\xdb\xdc\x95\xac\x34\x9e\x5e\x5c\x21\x72\xe5\xa4\xcf\x7b\xd9\x0c\xab\xe2\xc6\xe2\x24\x59\x80\xbd\x72\xd0\xf6\xf5\x47\x98\x81\xe8\xc4\xc3\x54\xf6\x8a\xa7\x28\x41\xd0\xc7\x3b\x98\x6b\xa5\x10\x21\x20\x31\x61\x02\x6e\xe3\xd7\x29\xdd\xf1\xa0\x49\xff\xe9\xeb\x25\x43\x98\x02\xf0\x30\x11\xd1\x44\xe5\x0b\x02\xbd\x4a\xca\x5e\x55\x06\xd3\x2f\xcf\x69\xe3\x2f\x54\x25\x44\x79\x8f\x4e\x87\xf7\x2b\xdf\x24\x33\xb1\xff\x32\x59\x29\x2e\x1d\x90\x81\x2c\xff\xd7\x9f\x6a\x54\x32\x70\xba\xf2\x4a\x3c\x39\xdd\x35\x98\xe1\xc6\x61\x61\x29\x22\x52\x2f\x38\x7d\x51\x59\x76\x92\xf3\x14\xc4\xd5\xac\x4b\xf1\x88\x3a\x61\x46\x36\x33\x6a\x55\x44\xd5\x9f\xf4\x1d\x1e\x0d\xbc\xf8\xe6\x62\x7e\x7c\x80\x85\x64\x63\x22\xdf\xc2\x0c\x33\x2c\xbd\xf3\x53\x70\xd4\x7d\xca\xbb\x80\x2e\x17\xca\x84\x78\x0e\xec\x66\x1c\x90\x4d\x5b\xfb\xc2\x40\xad\x6a\x14\xa7\x53\x3f\x71\xa2\x75\x00\xc6\x1d\xd3\xe4\x73\x98\x38\x87\xa8\x68\x35\x18\x7a\xbb\x0d\xf0\x8f\xa6\x2c\xda\x69\xdc\xe8\x6e\x21\xfa\x5a\xe9\x54\xc2\x2e\xdd\xb6\x0e\xe3\x13\x15\x04\xa6\x9b\x50\x48\x6a\x17\x76\x70\x91\x88\x37\x60\x63\x8a\x29\xc3\x80\x30\xe1\xe0\x5f\xdb\x28\xe1\x58\x63\x30\x10\x38\x5a\x62\x06\x13\xcc\x10\xd5\xa5\xf3\x50\x95\x5f\x4a\x34\x7c\x65\xed\xdd\xb7\xe2\x51\x59\xda\x8d\xcc\x26\x55\x92\x8a\xd6\xf6\xd8\xc4\xc1\xab\xb8\x17\xd7\xfe\xf3\xba\xe5\xde\x04\x02\xed\xde\xe7\xb5\x15\x21\xce\x28\x0a\x66\xb7\x96\x14\x0f\x56\xaf\x9b\xc2\x0e\x46\x58\x75\xce\x26\x28\xa8\xa1\x04\x77\xce\x9b\x2e\xac\xc7\xd8\x6f\x88\x27\x24\x57\xbf\xd4\x43\xe7\x12\x52\x69\x96\x25\x43\x80\xf0\x13\x52\x27\xe9\xfc\x15\x1c\x86\x95\xe9\xcc\x64\xd2\x72\xb2\x56\xab\x95\xc9\xa9\xf5\x68\xe9\x37\x16\xe0\xe5\x3d\x29\x88\x2e\x3c\xe7\x42\x61\x25\x7a\x02\xcd\x49\x7c\x37\xd7\x64\xd9\x0f\x7f\xd4\x78\xa1\x7a\x89\x0a\x8b\x2e\xa6\x1a\xb8\x1f\x68\x69\xb1\x20\xa2\xf6\x48\x4a\x88\xc1\x51\x95\x33\x91\xec\xa4\x45\x01\x53\x77\xb3\xa5\xdf\xfe\x4c\xfb\xac\xfb\x5b\xab\x2c\x47\xf6\x54\xf7\x2a\x9d\x19\xcb\xc4\xd2\x95\x37\x19\x84\x05\xe3\xa0\x4b\x4b\xfe\x11\xbc\xdb\x5c\x1f\x30\xd9\xac\x02\xf5\x48\x49\xc5\x7a\xa9\x6f\x7b\x56\x63\x61\x16\xf2\xbb\x6f\x25\x83\xd9\xaf\x94\xc8\x6a\xff\x5c\x13\x7f\x63\xce\x54\xe8\xf0\xc2\x1b\x6c\x25\xc1\xf0\x47\x2a\x22\x9c\x90\x81\x7e\x61\x62\xea\xc7\x1c\xcd\xa3\x09\xa1\x64\x3b\xd6\x31\x2a\x52\x63\xa2\xef\xe6\x46\xdf\xfe\x79\xeb\xd8\x15\x7a\x28"}, -{{0x49,0xe2,0x4d,0x16,0x99,0x83,0x37,0x26,0xb1,0x8c,0x78,0xea,0x65,0x68,0x40,0x1a,0x97,0x1e,0x1c,0xa3,0x9d,0xd0,0x6d,0x75,0x63,0xac,0x8b,0x42,0x50,0xd4,0xa9,0xf5,},{0x71,0xcf,0x05,0xe9,0x0d,0x30,0x1a,0x6d,0x9f,0xad,0x7f,0x0b,0x38,0xec,0x8b,0xb0,0x44,0xfc,0xfd,0x97,0xc8,0x49,0xb0,0x4c,0x00,0x36,0x25,0xde,0x29,0xbe,0x86,0xbb,},{0xa0,0xb6,0xa2,0xaf,0x15,0xb6,0xbe,0x9e,0x95,0x1e,0xf3,0xf3,0x2c,0xbd,0x1c,0x67,0x02,0xe8,0xe0,0x17,0xfb,0xd3,0x15,0xa3,0xf2,0x59,0x9c,0x3f,0x1a,0x11,0x86,0x5d,0x46,0xe7,0x84,0x59,0xa0,0xd7,0xf7,0xbe,0x04,0x6a,0xae,0x29,0x3c,0xad,0x09,0x13,0x7e,0xc8,0x47,0xe2,0x69,0x28,0x10,0x6d,0x9a,0xa3,0x5e,0x09,0x82,0xb9,0x92,0x02,},"\x6d\x26\x05\xf6\x1e\x1a\x04\xb6\xae\x18\xc2\xc2\x5a\xe1\x00\xdd\x42\xa6\x1e\x66\x4e\x2d\xb5\xc3\x4d\x7a\xd1\xf8\x4a\xc5\x07\x55\x2b\x74\x1c\x20\x86\xc1\x7c\x85\x2b\xab\xe0\x7a\x91\xe1\x29\xa5\x06\xee\x59\xed\xb9\xce\x73\xbe\x1b\x1d\x06\xd1\x20\xec\x36\xa1\xe9\x4c\x62\x81\x05\x4e\x78\xce\xb1\xbd\xef\xfb\xcb\xf4\xf0\x10\x51\xed\x38\x1b\xfc\x8a\xd1\x76\x9f\x41\xe2\x40\xbf\x60\x59\xd9\x70\x4c\xac\xec\x66\x66\x11\xf4\x1e\x4d\xd4\x38\xb7\xf5\x02\x42\xea\x86\x75\x6b\xb1\xf8\x1e\x59\x42\xc0\x92\x12\x9f\xbc\x6d\xe4\x95\x5d\x28\xdf\xf3\x52\x37\xdb\x30\xe4\xa5\x03\x6a\x99\x14\xc9\xf8\x4d\xbd\x8c\xcf\x82\xba\x2b\x1b\x3b\x55\x54\xa2\xb7\xa7\x4c\xb0\xb2\xa1\xe1\x96\x33\x45\x28\x6e\x25\x8d\xc8\xe7\xd5\x67\x18\x03\x5f\x95\xf3\x13\x81\x1c\xfb\xd8\x52\xa0\xf8\xf4\x9a\x29\xef\x93\x3e\x7c\xda\x7e\xd9\xc7\xe8\xb1\x62\xcd\xba\x1a\x82\x26\x2c\xd4\xdf\x7c\xf8\xea\x4b\x58\x6d\xb4\x3d\xcc\x1e\x37\x64\x59\x8e\x9c\xa4\x66\x73\x82\x2b\xaa\x2a\xd8\x7f\xb1\x4b\x6f\xdb\x9e\x20\x32\xd0\xca\x51\xc2\x6c\x5e\xf3\xd9\xf7\x97\x85\xfa\xc2\x49\x1c\xdb\xf7\xc3\x99\xf3\xcd\x17\x74\xc1\xa6\xb1\xe4\xa6\x7f\x54\x36\xd8\x0d\xb0\x25\xf8\xfb\x64\x09\xe2\x75\xbd\x0e\xd5\x08\xb5\xe0\x39\xed\x2e\x4e\xec\x8b\x0f\x4d\x5b\xe9\x9d\xca\xfa\x6a\x14\x01\x25\x27\x32\xa6\x5b\x37\xc9\x43\xc0\x7e\xf3\xac\xbc\xfb\xb3\xdc\x06\xda\xd0\xa8\x8f\x2f\x5e\xb5\x51\xa3\x99\x7a\xd6\xc6\xee\xd9\x5e\xdd\x9a\x0a\xf4\xa2\x88\xd5\xe4\x32\x86\xb2\xac\x07\x29\x77\xc4\x36\xb7\xc5\xff\x7a\xb6\x1c\x94\x84\xf2\x57\xf5\x8e\x01\x0c\x9b\x6a\xd4\x15\x81\xd7\x42\xcd\x19\x75\x2c\xde\x54\xd2\xb4\x20\xd6\x43\x65\x4e\x90\x96\xa8\x1e\xb9\xdc\xf8\x04\xc7\xc2\xed\x0e\x38\xd1\x3a\x5c\xe3\x99\x78\xcd\xd0\x2b\x25\x35\x09\x45\xde\x78\xfe\xec\xc0\xc2\xc2\x2f\xfd\x70\x5c\x3b\xa8\x11\x32\x65\xc7\xb9\xa7\xc8\xdd\xb5\x91\x78\xbd\x21\xd7\xf6\xc3\x1c\x6b\xe2\xc3\x67\x49\xee\x0f\x9a\xb8\xbc\x1d\xcf\x5d\xa5\xcb\x2d\x2d\x59\x62\x35\x8f\x71\xf9\x6a\xb3\x79\x2a\x25\x2a\x51\x9e\x41\x53\x51\xf4\x3e\x7e\x12\x03\x5b\x03\x28\xf2\x82\x08\xcf\x4b\xe5\x29\xd2\x99\xaa\x5c\x12\x8c\x9d\x5e\xd5\x75\xbf\x90\xc5\x35\x05\x69\xea\xa6\xf2\xd5\x52\x1d\xe1\x18\x03\x09\xf6\x86\xc9\x7e\x9a\xd6\xfa\x1e\xc1\xdd\x86\x27\xae\x89\x51\x58\x1c\xf6\x04\xb8\xb9\x17\xc5\xba\x43\x4a\x63\x7b\xe1\xbc\x8b\x79\xf4\xac\xaf\x77\x95\xf4\xe5\x1a\xab\xdb\x88\x50\x77\xbc\x4f\x3c\x68\xfc\x33\x18\xde\x58\x23\xd7\xe0\x80\x4e\xe9\x95\xb7\x03\x87\x95\x0f\x79\x93\x53\x68\x23\x00\xd4\xe7\x97\xf3\xca\xd6\x11\xb4\xc5\x62\xc8\x64\x0f\xf2\xb3\xfe\x29\x29\x16\xa9\x70\xfb\x98\xc1\x47\x5c\x1f\x4e\x27\xb9\xb3\x3c\xfe\x0d\x3a\xd9\x32\xa1\xeb\xe6\xa2\x7f\xc3\xb4\x46\x62\x29\x54\xae\xe1\x68\x36\x68\xc8\xbd\x4a\x3f\x90\x3b\xe5\xc7\x7d\xfd\xb8\xe8\x91\x4c\xed\xc5\x1f\x65\xfe\xd2\xd9\xc4\xd0\x3e\x13\xa6\x68\xd4\xc7\xea\x5e\x31\x88\x3e\x1b\x3d\xb6\x43\x63\xe2\xac\x5c\xc5\x4b\x54\xce\x69\xc6\xad\x52\xf8\x74\x99\x9b\x5d\xd2\xc5\x78\x2f\x03\xc3\xd5\x15\x05\xdf\x53\x6a\x1f\xe0\xd8\x60\xd3\x3e\xab\xed\x64\x1a\x94\x00\x89\xf1\x29\x7d\xd0\xf5\x7f"}, -{{0xf8,0xff,0x97,0x03,0x2a,0x34,0xcf,0x99,0x99,0x08,0x80,0x58,0xaf,0x56,0xff,0x70,0xb6,0xac,0xb2,0xed,0xf7,0x59,0xe1,0x31,0xfa,0xec,0x84,0x40,0xfd,0xec,0xf6,0xc4,},{0x54,0x38,0xb4,0xe3,0x3f,0x1c,0x5e,0xa1,0x12,0xfb,0x1b,0xaf,0xef,0x40,0x59,0xbf,0x09,0x5a,0x11,0x40,0x9b,0x64,0xd4,0x6b,0xfb,0x4d,0x25,0x47,0x3c,0x1c,0x08,0x74,},{0x50,0x9e,0x9e,0xad,0xfe,0x8d,0xde,0x79,0x14,0xac,0x20,0xca,0xfc,0x0b,0x0a,0xf2,0x2b,0x84,0xdd,0x8a,0x21,0x0a,0x48,0x12,0xcd,0x8c,0xae,0x39,0xb0,0xa2,0x72,0xe5,0x3e,0x02,0x24,0x6d,0xc8,0x93,0x9e,0x92,0x26,0x92,0x03,0x36,0xe1,0x40,0xb3,0x15,0x32,0xd0,0x68,0x13,0x7a,0x34,0x16,0x1e,0x59,0x9a,0x86,0x94,0xa9,0x5d,0xdf,0x01,},"\xdf\xb4\x1f\xb9\xd5\x37\x02\xcb\x2b\x9e\x3f\xfc\xad\x4e\xa6\x02\x71\x6f\x71\x8a\x7e\xa3\x3e\x21\x84\x3e\x2a\x6c\x05\x2c\x70\xc6\xc5\x14\x85\xd7\x2b\x53\xa5\xbb\x4e\x34\xe0\x3e\x3e\x1d\x1a\x52\x51\x8e\xb3\xe7\xf1\x8f\x2a\x1e\x1c\xaf\x78\xac\xb2\x11\x60\x89\xbe\xd4\xc6\x17\x13\x8e\x71\x6a\x91\x43\x1f\x2c\xf6\x44\xa1\x21\x0f\x6d\x19\x20\xd2\x85\x99\x42\x64\xd6\x46\x6b\x0d\x8d\x2c\x62\x63\x80\x44\x61\x6f\x57\x6e\xdc\x7d\x0d\x93\xcb\x66\x01\x31\xd4\xbb\x50\x87\x5e\x15\x36\x40\x12\x3a\x96\xf1\x5b\x75\xa5\xbc\xee\x46\xd5\xcc\x5e\xb1\xa4\x31\xc5\x9d\x2e\xad\xdf\xd5\x53\x15\x02\xfe\xb1\x55\x1b\xf7\x79\x1c\xd5\x98\x9d\x17\xd1\x02\x96\xd0\x1b\xa3\xae\x3e\x38\x4c\x67\x45\x26\xca\xb6\x2a\x7c\x24\xc0\xff\x67\x7d\xe7\x1c\xa1\x72\x62\x1a\x28\xa8\x5e\x01\xee\xfe\x07\xf6\xee\xf9\xc3\xec\xfd\x7f\x94\x98\xac\x42\xf4\x6a\x43\x71\x6f\x61\x53\x18\xa3\xb2\x87\x57\xc3\xa1\x5f\x4f\x1c\x38\x22\xae\x7a\x75\xc2\x03\xa2\x98\x25\x8d\x75\x36\x38\xcf\x42\x5e\x15\xbb\xc4\x62\x02\xb0\x93\xb8\xe4\xf3\xe6\x70\xfb\xb6\x63\xdb\x2b\x69\xc8\xfb\x0f\x62\x50\x74\xd8\x5a\x44\xd3\x50\xe0\x42\xbb\x1b\x74\x02\x1d\x19\x29\x97\xa2\xc2\x7d\xd6\xc8\x63\x48\x41\xd1\x00\xa0\x34\x4b\xae\xd7\x50\xa3\x9f\xf5\xdc\xd9\x84\x8d\xfc\xf0\x9e\x5c\x8c\x47\x96\x7b\x96\x55\x6e\x23\x32\xca\x17\xd8\xe4\x2d\xd8\xf3\x93\xa5\x44\x5a\x37\x22\x44\x60\x0b\x30\x01\xb8\xfe\x86\xc4\x5e\xaf\xc6\xe7\x38\xaa\x7e\x11\x7b\x4a\x79\xfa\x2e\x6b\x00\xf4\x64\x92\x8d\x18\x56\xc8\x3e\xcf\xe8\x7d\xd3\x4d\x15\x8f\x5c\xb4\xe4\xf4\xd6\x10\xf5\x97\x17\xec\x79\x0b\xd3\xff\x87\x20\x40\xb6\x7e\x8d\x39\x39\xe8\x04\xe3\xb5\xdb\x98\x5a\x09\x56\x21\xcb\xcc\xd6\x86\xc0\x93\x4e\xce\x3e\x27\xab\x2c\x6c\xe3\x3f\xb5\x2b\x11\x1f\x48\xe4\xf2\x74\xbd\xf3\x20\xd0\xb0\x23\x84\xc8\x3c\x49\xe1\xa0\x41\xbd\x23\x19\x10\x9c\x85\xa0\x6d\x80\x48\xa9\x93\x35\x7a\xbf\xd8\x11\xac\x2f\x38\x05\x9d\x07\x7a\xcb\xc3\x6a\xa9\x66\xc0\x28\x90\x37\x48\x62\x5f\x92\xe8\xf7\x9d\x51\xbd\xa1\x0f\x78\x52\x29\x77\xf7\x6e\xc4\xe8\x85\xe4\x9a\x46\xc6\x8d\xe0\x9f\x3d\xa8\xf8\x6b\x71\xae\x64\x23\xbd\x29\xde\xef\x1c\xc6\xa1\x13\xea\xc1\x15\xa6\xcd\xe2\xcc\xd0\x11\xfc\x1c\x0f\x0e\x34\x27\xf4\x3c\x3e\x96\xfc\x41\x56\xed\xf6\x2d\xdf\xb7\xb0\x83\x6b\x88\x8b\xab\x3c\x43\x45\x05\x5a\x6c\x41\x78\xe9\xe2\x28\x29\xfd\x8c\xfc\xe3\x9b\x0b\x84\x44\xeb\x26\x48\x7c\xc9\xdc\x82\x60\x6f\xea\xad\xaf\x49\x78\x69\x4e\x65\x64\xf2\x72\x9c\x1b\x13\xab\x37\xc9\x07\x2d\xb4\xe9\xde\x94\x0e\xe5\xf1\xd0\x58\x84\xae\x7f\xd9\xd9\xec\x9c\xb7\xde\x56\x34\x76\x00\xa8\x8d\xea\x92\x08\xa6\x34\x19\xfc\xe2\x9e\xe5\x00\x55\xa3\x74\xa8\xf2\x2f\x9a\xe2\xbe\x98\x05\xa9\xf4\x76\x15\xaa\x59\x57\x6b\x44\x04\x2f\xf1\x26\xa8\x98\x24\xe3\x6a\xd6\xbc\x58\xe0\x6b\xb9\x0f\xbe\xef\xba\xe5\xd6\xd7\xd6\x24\x30\xf3\x73\xb6\x29\x6f\xbf\xcd\x4d\x66\x20\x16\x83\x53\x58\x3f\xbd\x3d\x5a\x29\x2b\x95\x72\x51\x75\x34\xe2\xfb\x0b\xee\xf2\xfa\x98\xa4\x64\xe5\x91\x03\xe7\xa0\x42\x87\xf1\x5d\xad\x0f\xac\x54\x97\x0e\x77\x15\x07\x8d\x63\xec\x26\x36\x2f\x6f\xba\xbc\xdd\xea\xf7"}, -{{0x2e,0x4c,0x39,0x21,0x9f,0xc9,0x2a,0x53,0x8e,0x48,0xe9,0x5f,0xbf,0xcf,0xef,0x30,0xf5,0xa2,0x1b,0x78,0x94,0x0b,0x81,0x05,0x3b,0xda,0xd4,0x60,0x2b,0x4c,0x96,0x90,},{0xf8,0xee,0xd8,0x92,0x17,0x66,0x20,0x43,0x4c,0x7f,0x0e,0xc5,0x3d,0xcf,0xf3,0x98,0x63,0x10,0x9e,0x7c,0xa4,0xd0,0xb3,0xc6,0xc4,0xb5,0x64,0x10,0xbe,0x01,0xe5,0x37,},{0x39,0x45,0x20,0x12,0x2b,0xb0,0xa5,0x64,0x64,0x8a,0x7a,0x8b,0xc8,0xdc,0x73,0x63,0x6c,0x51,0x77,0x46,0xa3,0xc8,0xa0,0x5b,0x90,0x1e,0x72,0x52,0xfe,0xf0,0xe5,0x02,0x3d,0x90,0x99,0x1e,0x31,0x1b,0x53,0x82,0xd4,0x91,0x00,0xe5,0x26,0x33,0xc7,0x0f,0xe9,0xc2,0x6c,0x14,0x50,0xe0,0x60,0x3e,0x6d,0x45,0x22,0x99,0xaf,0x4d,0xae,0x07,},"\xc8\x7d\x1f\xba\x9d\x94\xa6\xa5\x40\x89\x80\xfc\x80\x83\x98\x0f\xd2\xd2\x52\xfa\xe5\x40\xf6\xee\xc1\x9e\xd6\x74\x6c\x29\xe3\x39\xa1\xc2\x9f\x6f\x53\xbc\x23\xfd\x6b\xfa\x43\x85\x07\xef\xf5\xda\xf9\x03\x40\x3c\xda\x70\x7b\x4d\xc5\xe8\x44\x80\x5d\x6b\x1c\xeb\x4a\xff\xf4\xb2\x32\xe8\xe6\x9d\x7d\x27\x1f\x3c\x06\x7c\x48\x54\xf3\xd9\x4f\x27\xfe\x32\x55\x81\xfa\xca\x79\xd1\xf0\x2a\x26\x29\x0a\xd2\x3a\xf7\x11\x00\xc1\x2c\x09\x15\x76\x47\xca\x9d\xa4\x3d\x76\x90\xdd\xcd\x94\xdb\x65\xe0\x00\x98\x9c\x87\x8b\x75\xa0\xff\x22\xd2\xc7\x09\x62\x59\x4c\x9b\x08\x08\xf2\x78\x46\xcc\xac\x85\x67\xbc\xe5\xd2\xe3\xb7\x60\x28\x09\xf2\x3b\x59\xcd\x71\x8a\x08\x05\xd1\x08\xf3\x1a\x63\x2a\x05\xb8\xdf\xa5\x03\x5a\xb9\x46\x1a\xeb\xa4\x16\x00\x9d\x74\xfd\xf9\xe0\x07\x20\x28\x56\x89\x0d\x2c\xff\x80\xfa\x24\x0b\x97\x8a\x48\x27\x0f\xcb\x2f\x47\x36\x97\xbc\xba\x8e\x73\x0a\x55\xc2\x87\x61\x91\x9a\x23\xbe\x41\xda\x27\xff\xea\x09\xe3\x55\x9c\xaa\xab\xf9\x51\x9e\xc0\x8e\x1f\xfa\x86\x81\x7a\xa3\xe8\x87\x4f\xa8\x16\xe7\x71\x8c\x5b\x2f\x34\x49\x67\xba\x1b\xc2\x81\x9c\x4f\x04\x5a\x97\xb4\x05\x44\xea\x61\xd7\x17\x08\x3c\xca\xf1\x1e\x9d\xdc\x04\xa3\x59\x8e\xf1\x81\xe7\xbe\xf4\xac\xef\x45\xb6\x55\x1b\x47\x8a\x0d\x77\x31\xc4\xf0\x8c\xe5\x80\x2f\x78\x25\x8d\x41\x90\x17\x66\x10\x76\xd7\xd6\xd2\xef\x39\xe5\x7c\xf9\xcd\x93\x97\xdc\xc5\xde\xbf\x64\xab\x82\xb6\x61\x59\xf5\x78\x31\x6e\x74\xcd\x49\xf5\xad\x2c\x6f\xef\x83\xcf\x08\x68\x3b\x95\x70\xa9\x46\xad\x49\x03\xdf\x4e\x96\xec\x00\x8e\x14\xa5\x01\xfa\x93\x86\xbd\xaf\x2a\x63\x99\x3c\x6c\x9b\xdf\x23\x1f\xd0\x9e\xa6\xf9\x6e\xf4\xd4\xe2\x9a\x3a\x33\x27\xcb\xf7\x4e\xa8\x31\x05\x4e\x66\xca\x86\x68\x0c\x6c\xe5\x3b\x66\xf9\x46\x5d\x06\xb3\xfa\x07\x98\xbb\x69\x05\xae\x38\x45\x59\x34\xf2\xfb\x7e\x0b\xa4\x72\x32\x89\x89\xf0\x01\x30\x86\x71\xcc\xcb\x56\x6d\x22\x2c\x72\x16\x5b\xb3\xa7\x44\xfb\x98\xe2\x21\x0f\x96\x20\x68\x0d\xf3\xe3\xcd\x14\xa8\xbd\x94\xb5\x74\x5c\x00\x16\xdd\xa7\x7f\x05\x9f\x26\x05\x3b\x64\xcf\x45\x23\xc3\xd4\x29\x11\x2f\xb6\xb3\x28\x39\x8b\xc6\x30\xa2\xe9\x06\xb9\x5a\x6c\x57\x80\xcf\xdc\x06\x41\xbe\x47\x51\xbe\xbd\xdf\x77\x24\xdc\x9c\x27\xe7\x8d\x60\xed\x0f\xd7\x36\xd5\xab\xd8\x89\x29\xc1\x79\x5d\x47\x3a\xbd\x2b\x03\x20\xc5\x40\x47\x57\x28\x82\x18\x67\xa4\x09\xa2\xff\x13\xcc\x44\xce\x35\xe5\x98\x1e\x9f\x6b\x87\xa2\x8d\x4f\xa8\xb8\x67\x5e\x50\x3f\xae\xfc\xa7\xc1\xd7\x98\x47\x37\x87\x1f\xe9\x19\xac\x41\x4e\xea\x26\x5e\xe3\x1f\x9f\x78\xf5\x21\xf3\xf4\xf8\xd0\x0c\x3f\xb7\x91\x71\xf3\xc6\xa5\xdb\xf5\xe1\xac\x8b\xf6\x3b\x4c\x3d\x8d\x8b\xc1\x21\x03\x6e\x9e\x55\xbb\x70\x2e\xa6\xc8\x6e\x92\x5e\xc0\xb9\x84\xde\xd2\xc7\x1f\x3b\xfd\x49\x32\xe6\xc4\x1b\x58\x2f\xd0\x2c\xa5\x9f\x53\xce\x29\x74\x45\x78\x5c\xc4\xca\xc2\x47\xb0\xb8\x4e\x7f\xa0\xbc\xdc\xf7\x9b\x3e\x4a\x15\x5f\x98\x78\xc1\xf6\x43\xbe\x9c\x42\xf7\xa4\xf2\x72\x60\x44\x45\x05\xc1\x84\x5b\xd5\x3b\x55\x0a\x31\xd7\x95\x3c\xc7\x38\x86\x1f\x46\xbd\xf4\x87\x0f\x3a\x77\xac\xe1\x91\xab\xd6\x3c\x45\xad\xb1\x53\x90\x9f\xb5\x9a\xb5\xdb\x9b"}, -{{0xf0,0x92,0xe6,0xbe,0x8d,0x2d,0x9a,0xd0,0x69,0xa3,0xe2,0xb9,0x76,0xd2,0x44,0xe3,0x4c,0x15,0xc2,0x8c,0x48,0xd3,0x2f,0x55,0x60,0xa5,0x41,0x85,0xd1,0x50,0x15,0x02,},{0xcf,0xeb,0x3e,0x74,0xe4,0xb5,0xc8,0x35,0x6a,0x81,0x75,0x7b,0x8f,0x1b,0xe4,0xb4,0x29,0xfc,0x18,0xfc,0xaf,0x49,0x7c,0xbf,0x8d,0x8b,0xc0,0x48,0x0f,0xf9,0x78,0xf9,},{0x63,0xcd,0x4c,0x0b,0xa3,0xbe,0x93,0x97,0xcc,0x0f,0x3c,0x1a,0xf3,0x48,0xec,0x4b,0x8a,0x91,0xe4,0x2f,0xee,0x67,0x5d,0xa1,0xd0,0x59,0x00,0xb9,0xa8,0x6c,0x13,0x8f,0x91,0x74,0xeb,0x99,0x6b,0xbd,0xf3,0x1c,0x42,0x95,0xe0,0xc5,0x78,0xac,0x0f,0x9d,0x53,0x76,0x41,0xa2,0xaf,0xd5,0xdf,0xf9,0x3a,0x39,0xc5,0xcd,0x9d,0x3c,0x48,0x0b,},"\x2c\x25\x5f\xb2\x5d\x45\xb0\x86\xc0\x71\xe0\x3e\x52\x5b\x4d\x72\x85\x78\xfb\xb6\xb0\xc6\x0d\xa9\x41\xe6\xbf\x2a\x48\x98\xb2\xd5\xb6\x98\x8c\x53\x30\x27\x85\xab\x7a\x3b\xc4\xbb\x2c\x20\x5a\xcd\x27\xd6\xa4\xcb\xdd\x1a\x0c\x08\x89\xde\xd7\x84\x26\x4c\xb7\xc0\x28\x89\xc5\xc7\x11\x3f\xc9\x0b\xbb\xcd\x31\xff\x00\x14\x32\xc0\x53\xf9\x71\x07\x3c\xf6\x71\x2f\x66\x7f\xce\x46\x98\x77\x6b\x98\xcc\x54\x44\xc6\x92\xab\xd1\x28\x81\x98\xbe\x5a\xd5\x67\x46\x09\xf7\xe1\x39\xad\x1b\x9c\xcb\x94\x3f\x8d\xfd\x9d\x12\xc5\x4e\xce\xe2\x78\x34\x1b\x2e\xe1\x27\x79\x91\xca\x62\xcd\x3b\xfe\x12\x8d\x13\x92\x96\x4e\x95\x88\xe2\xf9\x7c\x32\x17\x04\xa3\xde\x10\x61\x88\xc5\xeb\x33\x5a\xa5\xa1\x9a\xcc\x90\x67\xb4\xa9\x41\x29\xb9\xd1\xa6\x16\x7c\x4b\xbf\xb5\x6f\xb9\x76\x84\xcb\xbd\x72\x0c\x86\x86\x9e\x00\x20\xab\x07\x76\xcd\xc9\x95\x4f\xeb\xa8\x62\x12\x4b\x07\x3f\xba\x8d\xe9\xea\x9a\x38\xea\xcf\xa0\x03\xae\x4f\x1c\xdc\xbf\x15\xc3\x2f\xb6\xb9\x70\xc7\x31\x15\xdd\xff\xcd\x4f\xa3\xb7\x18\x46\x11\x0e\xde\xc2\x57\xfc\xae\xd6\x11\x36\x04\xf7\x19\x25\x72\x57\x72\x64\xb9\x90\x5c\xa6\xae\xd8\xda\xec\x13\x84\x03\xca\x41\xaa\x95\x42\x78\xa5\x72\x0b\x26\x7b\x90\xca\x16\x3a\x9b\xdf\x44\x7e\xad\xe8\xde\xb7\x69\xa3\xb4\x92\x37\xa7\x35\x16\x97\x7c\x28\x73\x45\x55\xdd\x23\x4c\xa7\xde\x49\x99\x26\x1b\xc7\x96\x0f\x53\x6b\xa8\xa3\x5a\xd3\xd0\x2c\x75\xf1\xc2\xbe\xa0\xa0\x61\x2e\x7d\x49\xc4\x03\x97\xdd\x6a\xf5\xff\x58\xba\xe6\xa6\x4b\x6a\x77\xe9\x81\xf9\x2d\x15\x9e\x0b\x2b\xd2\x05\xab\x15\x70\x52\xf4\x70\x17\xa3\xe1\x8a\xec\x94\x4d\x04\x65\xee\x00\x17\xe9\x61\x48\xa6\x12\x9f\x74\xd3\xcc\xb4\x89\xfe\xa1\x3a\x15\xa9\xb9\xac\xed\x58\xc6\xee\x0e\x6e\x84\xe0\x5f\xda\xdf\xae\x07\xb3\x34\xa9\x8f\xc3\x7f\x7e\x51\x1c\xd5\xa4\x4e\x9c\x74\xe4\x78\xd3\x49\xe3\x0e\x29\xae\xb4\x6a\x4d\xf0\x1e\x43\x07\xfe\x65\xe1\x39\x4a\x75\x8f\x6a\xda\x2f\xb1\x20\x22\x5c\xcd\x50\xa4\x90\x13\xe6\xc9\xf1\x75\xaf\x90\xf3\xfc\x8c\x57\xe7\xa6\xa9\x69\xa9\x16\xc3\xf1\xaa\xcc\x22\xf3\xe0\x1a\x07\x0c\xc4\x8e\x6f\xd8\x78\xe2\xbd\x07\x3d\xf9\xee\x6f\x05\x9b\x98\x56\x84\x04\xfc\x7e\xae\x7d\x4b\xf6\xfa\x16\xc0\xc8\x03\xc6\xbe\x84\xe8\xb7\x9c\x67\xaf\xfc\x8c\x88\xca\xbd\xee\xbc\x11\x34\xbb\x23\x86\xe2\x2b\xa4\xd2\xe9\xe0\xf3\xe1\xab\x3a\x0d\xac\x7c\x80\xdd\xee\xd7\x73\xcd\xa0\xc4\x1d\xc9\xde\xfa\x67\xfe\xa3\x77\x69\xcb\x4a\x1e\x15\x22\xd7\xe0\xb3\xd7\xc4\x63\x8b\xcd\x98\x31\x53\xd4\x78\xbe\x5e\xcf\x2b\x6a\xb1\xb4\x01\x24\xe4\x22\x2b\x8c\xaa\x46\x47\xbd\x50\xd7\x4d\x20\x39\x43\xab\x20\x93\x8d\x5f\x27\xd9\x08\xa6\x73\x67\x40\x46\xce\x2e\xf1\x8e\x85\x8b\x0a\x01\xa7\xe7\x53\x0d\xed\x0f\x8c\xc8\x9e\xf0\x9b\x73\xca\x59\x7c\xf7\x3a\xfb\xc9\xa2\x71\xa4\xd2\x3c\x92\xfe\x59\x18\x83\xc4\x40\x10\x9c\x4e\xf4\x16\x67\x0b\x7f\x2c\x59\x05\xb7\x7f\x65\xf5\x6d\x09\xd4\x02\x50\x35\x6f\x9b\x1d\xbc\xaf\x1e\xe2\xc0\xb6\x36\x96\xf8\x4d\x68\xdd\xbe\xa1\x60\x08\x51\x51\xa9\x52\x62\x74\xd7\xb8\x46\xcc\xeb\x6c\x43\x48\x09\x84\x84\xde\x3b\xb7\x23\xae\x5e\x85\x27\x6d\xf4\x9f\x56\x34\x13\x0f\xf9\x05\x75\x4f"}, -{{0x01,0xa2,0x47,0x94,0x3a,0xfe,0x83,0xf0,0x36,0xb6,0xb6,0x0f,0x23,0xd9,0x77,0x74,0xfd,0x23,0x20,0x8e,0xdc,0x31,0xcf,0x3d,0x88,0x20,0xe9,0xdc,0x63,0x66,0x11,0x03,},{0x8c,0x97,0xa5,0x8b,0xe0,0xe8,0x47,0xc4,0x8a,0x6a,0x39,0x87,0xcf,0xe2,0x50,0xa8,0xd7,0xb0,0x7d,0x97,0xf9,0x61,0xf6,0xb7,0xb7,0x9e,0x7d,0x80,0x42,0xb8,0xbd,0x7b,},{0xed,0x2c,0xed,0x1a,0x4f,0xdd,0xb3,0x44,0x2a,0x63,0x73,0x48,0x17,0x9a,0x6a,0x5b,0xee,0xdc,0xb4,0x4c,0x8e,0x98,0x8c,0xa2,0x6f,0x78,0x93,0x6d,0x2c,0x8d,0xb5,0xc5,0x16,0xd5,0x4b,0x8c,0x4f,0x08,0xd9,0x1d,0xd7,0x04,0x2a,0xb6,0xab,0x26,0xd8,0x7f,0x23,0x0e,0xb2,0xb2,0x15,0x6f,0x3c,0xe2,0x99,0x4f,0xce,0x7c,0x2b,0x0f,0x10,0x0e,},"\x08\xd8\x14\x95\xda\x77\xf4\x07\x25\x5c\xc4\x1a\x81\x8e\xef\xa7\x27\xe2\xc4\x7a\xe4\x11\xf4\xb5\x41\xf0\x1f\x81\x1d\x90\x6d\x55\xfb\x1e\x3c\x9c\x48\x4d\xf3\x05\x65\x36\x4d\xe9\xdc\xb9\xfe\xa0\xaf\x66\x11\x2f\xe7\x5f\xd1\x1a\xe8\x1d\x26\x41\xb5\x47\x58\x9f\x8b\x97\x4a\x97\xe7\x97\x6e\xd6\x92\xaa\xd6\x40\xed\xd2\x88\xbd\x86\x3d\x11\xc4\xca\x98\x36\xf9\xd7\xc1\x15\xc3\xd9\x88\x30\xd6\x42\x47\xcb\x6f\x8f\xb6\x03\xc6\x98\x11\x33\x55\x2a\x32\x04\x04\x19\x61\xbd\xd8\x3e\x2f\x9d\xeb\xa7\x70\xc0\x39\x4f\x9b\x60\x2a\x45\x35\x51\x07\x49\x21\xa3\xde\x28\x32\x13\x69\xd7\xf8\xca\x64\x0c\x45\x10\x9e\x8f\x52\x2c\x97\xed\x9f\x35\xb9\x27\x7a\x35\x0e\x29\x59\x31\xb4\x2e\x01\x35\xe9\x4a\x92\xfe\xd3\x63\xd6\xca\xe3\x92\xf7\xc4\x51\x99\x32\x7e\x24\xb4\xcf\xa5\x89\x8a\xb5\x99\xae\x7b\xd5\x0b\xd3\xa0\x0c\x0d\x00\x7e\x95\xfa\xf8\xf2\xae\x10\x38\x02\xca\x7e\x53\xb2\x79\x18\x4d\x06\x90\x5f\x57\x48\xca\x8b\xe1\xf7\x2e\x66\x8c\xb8\x32\x83\xdd\x00\x40\x64\x91\xf8\xb9\xb4\xe5\xa9\xd4\xa5\x43\x8b\x2f\xa4\x37\x1e\x0b\x05\x68\x6f\x87\x57\x5b\xaa\x79\x6e\x30\x2f\x08\xff\xc4\x25\x66\x27\x50\xa3\x3a\x0c\x9c\xfa\xa4\xb4\xd7\x04\x1f\x92\x64\xfe\xd7\xbe\x4f\x9f\xde\x2c\xac\x68\xa2\x15\x82\x36\xf6\xac\x43\x04\x7e\x91\x1f\x4c\x4e\x8b\xc6\x63\xfd\xd5\x05\x17\xdf\xaa\x8f\xbc\xd2\x19\xdd\x7a\x0e\x93\x69\xf4\x3d\x0d\xd2\x5b\x4f\x0c\xf9\x30\xf2\x0b\x7b\x7c\x6d\xb9\xd5\xbe\x0c\x6e\x19\x60\x94\x1a\x3e\x04\xd1\x41\xc0\x3e\x59\x61\xaa\x33\xe9\x02\x44\x77\xd5\x33\xc9\x95\x37\x87\x96\xbf\x22\x92\xad\xe9\x22\x69\x5b\x14\x56\x9f\xc3\x39\xb3\xd9\x08\x5c\x63\xfc\x6e\x5b\xef\x4d\x99\x0c\x80\x33\x3a\x6b\x57\xaf\x47\x8f\x93\x8e\x3e\xe7\x38\xb1\xd1\x29\xbd\x97\x6a\xfe\x68\x61\x28\xbc\xac\x08\xcc\xbe\xb0\x34\x9b\x9b\x53\x73\x13\xbc\x7b\xf5\x91\xc6\x5d\x4a\x71\x23\xad\x30\xbd\xbe\x14\x86\xb4\x28\x08\x47\x48\xb6\x50\x7f\x6f\x5e\xf6\x7c\x26\xca\x86\x2c\xf7\x26\xaa\xc1\x40\xb8\x61\xae\x0d\xc7\x4b\xb3\xc0\xb4\x89\x78\x9f\x17\x14\x5e\x9a\x85\x5a\x3e\x2b\x5d\xaa\xc4\x18\xd8\x35\x37\x33\x23\x9e\xf6\x9c\x7b\x56\x5b\x53\x03\xeb\x87\xbd\x7f\x64\x9a\xbf\x40\xa2\xf1\x35\xa2\x9e\xd2\x7e\x3b\xe4\xc1\x2c\xd6\xdd\xd2\xe5\x41\x8a\x99\x97\x43\x83\x66\x3f\x58\x49\xbf\x3c\xe5\x53\x2b\xf6\x4a\x80\xaa\x52\x11\x91\xd2\x53\x90\xbc\x19\xa4\x5e\xed\x1d\x3f\xec\xa1\xd9\xfc\xc0\xdb\x03\x1b\xfb\x48\xe4\x50\xbe\x3d\x45\x93\x35\x6d\x5b\xa0\xf3\x10\x47\xb4\x57\x74\x5f\x21\xe3\x2e\xbe\xa3\xca\x6c\x35\xf0\x5d\x78\xd8\xc3\x16\x40\xb0\xfe\xcb\x94\x01\x16\x56\x75\xc7\xf9\xcb\xb1\x9b\xc4\xb5\x67\x7c\x2c\xce\xdc\x4e\x7a\xaf\xb8\x41\x84\xc1\x91\x99\xac\xa0\xdb\x21\xcf\x50\x67\xdc\x3a\xf7\x69\xbc\xc6\x29\x35\x5f\xf7\x25\x7a\x9e\xfd\x71\xa6\xa9\x2d\x13\x0d\x35\xab\xee\x6e\x70\x60\x5b\x5c\xab\x93\xc0\x28\xfa\xc3\xaa\x23\x44\xba\x86\x1a\xc1\xe8\xce\x9a\x4b\x07\x0c\x3d\xf7\x40\xd2\x8c\x5e\xce\x0f\x1b\xc3\x1c\x2d\x7d\x1e\x5e\xcc\x76\x10\x44\x80\x93\x91\x33\xa1\x86\x60\xe4\xa3\xe4\x84\x6b\x25\x17\xbe\x3b\x8e\x7a\xfa\xfe\x07\x83\x91\xd8\xaa\x8e\x5c\x30\x13\x7e\x85\xd9\x4d\x64\xa2\x79\xfb\xee"}, -{{0x91,0xfd,0xef,0xcd,0xbc,0x99,0x0d,0x3e,0x8e,0xeb,0x60,0x17,0x04,0x34,0xda,0x10,0x83,0x1b,0x03,0x08,0x1f,0x6a,0xfd,0x0d,0x7e,0x12,0xb1,0x00,0x11,0xe0,0x2a,0xef,},{0xc5,0x8d,0x3e,0x20,0xb8,0xd4,0x7b,0xa4,0x55,0xb9,0x12,0x57,0x2d,0xc8,0x40,0x81,0x5e,0x3d,0x88,0x5f,0xa5,0x91,0x7d,0x1d,0xa4,0x84,0x08,0xb9,0xa9,0x56,0x40,0x98,},{0x51,0x01,0x12,0x22,0x3b,0x33,0xa5,0xab,0x15,0x64,0xf7,0x53,0x71,0x91,0xcd,0x29,0x2a,0x9d,0xbd,0x5a,0x32,0x3d,0x7a,0xdd,0x05,0x84,0xc1,0xb0,0xad,0x00,0xd0,0xac,0x71,0x99,0xc3,0xfb,0x75,0x8e,0x91,0x3f,0xf3,0xd7,0x16,0xc2,0xe9,0x0d,0xd9,0x0d,0x4e,0x8f,0x59,0x95,0x1e,0x87,0xef,0x8b,0x78,0x21,0x4a,0x51,0x75,0xc4,0xe6,0x08,},"\x5b\x0c\x1a\x3a\x95\xe0\xba\x74\x74\x76\x6c\x9b\xad\xfa\xe3\x4a\xb8\x60\xe0\xa6\xc0\x33\xa2\x2f\xba\x72\x11\x27\xf5\xbb\xee\xe8\xe2\xcb\xde\x1a\x1d\xfe\xb1\x8d\x55\x1c\x95\x99\x4d\x21\xe3\xeb\xc6\x8a\xfa\xe6\x85\x44\x4a\x3a\x41\x95\xbc\x75\x55\x38\x90\x3a\xcf\xa6\x71\x55\x92\xdd\xe2\x56\xe7\xa1\xb4\xc3\x63\xec\xa7\x1e\xf0\xf3\xa4\x8a\xe3\x44\x2d\x50\xd5\x66\x1b\x39\x40\x96\xb7\xec\x27\xbb\xf5\x29\x53\xf3\x04\x0c\xd2\x5b\x78\xce\x47\x55\x27\xe0\xcc\x59\xf1\xef\x9a\xe2\xe0\x59\x04\x31\x58\x2b\x2d\xf8\x14\x14\x99\x82\x9a\x2c\x5f\x7b\xbe\x35\x98\xe4\xc9\x6c\xc0\x1e\xde\x2f\x43\xb6\x56\x05\xb4\x88\x59\x37\x09\xc0\x94\xb5\xa0\x42\xb2\x85\x55\xfb\x52\x27\xa6\xd1\x56\x37\x6f\x3f\xf0\x7b\xd5\xc8\xbc\x68\x04\xd3\x9a\x32\x82\xac\x59\x70\xba\x08\xae\xbf\x75\x42\xb8\x45\xf6\xb5\xc2\x38\xc2\xce\x20\x44\x3f\x7f\x77\x55\xd7\x5f\xe4\xfa\x16\xb9\x64\x4c\xa3\xe2\x1d\x91\xa9\xa8\x7c\x68\x61\x15\x74\x8a\x16\xc0\xae\x4a\xe4\xe1\x6d\x1c\x71\xae\x60\x0b\x39\xcd\x25\xe5\x63\x3b\x39\x9f\xee\x7f\xf2\xe3\x62\xbe\xd2\x51\x25\xc6\xfd\x5c\x7f\x5f\xfa\x2d\xa2\x35\x3f\xd3\x5b\x78\x4a\x1b\x1b\x03\x19\x77\x47\x58\xb7\x39\x0c\x44\xdc\xc9\x2f\xca\x42\x01\xdf\xe1\xa3\x75\x69\xde\x05\xf0\x66\x4d\x08\xb9\x0d\x6e\x2b\xad\xc2\x1b\x92\xf9\xce\x87\x21\x42\x35\x7b\x96\x15\x08\x0a\xb7\x65\x9a\x24\x6f\xf0\x85\x2a\xdb\x17\xdf\xda\x70\xcf\x17\x54\x15\x7b\x13\xbc\x03\x2b\x4c\x5d\xeb\x8e\x10\x68\xb4\x69\x2b\x93\x16\x5d\xa3\x5e\xfc\x9d\xa8\x6a\xcb\xe6\xf8\x0f\x01\xbb\xc2\x6f\x57\x5e\xc5\xaf\x5b\x05\x0e\x98\x28\xaf\xde\x6c\x3b\x78\xe7\x33\xeb\x5a\x91\x24\x92\xf7\x65\xbc\xad\x73\x1b\x95\xe3\xab\x88\x96\xb6\x17\x58\xbf\x91\x3b\x9a\x15\x68\xf9\xc5\xb4\x60\x33\xcf\x45\xdc\xc1\x75\x0d\xa2\x06\x6c\x60\x8d\xc3\xd3\x43\x73\x8e\x84\x8d\xc3\x90\xcd\x47\x44\x32\xe9\x91\xd7\xaa\x2c\x5b\x27\x81\x42\x1e\xfe\x55\xe3\x6b\x0b\x42\xc1\xf4\x9a\xe2\x77\x48\x0b\x0f\xc5\xff\x68\x5b\xb5\xa3\x1b\xe3\xa0\xfa\x44\x82\x38\x16\x07\x70\x37\x54\x8a\x5c\x9b\x0e\x1c\xc6\xc6\x35\x04\xa4\x07\x57\x9a\x36\x32\xb3\xc9\x6f\xcd\x0d\xe5\xea\x1e\x4d\x6e\x87\xc0\xca\xf7\xb6\xca\xe3\x12\x0d\xb8\xb1\xf4\x61\x5c\xe6\xa7\x5a\x81\x65\x4f\x39\x04\x28\xb6\x4c\x21\x3e\x72\x7e\xec\x3a\xe7\xf9\xf4\x2d\xb9\x06\xf4\xde\x1f\xda\xdd\x34\xa3\xda\x2a\xeb\x12\xb4\xd9\xa1\x85\xf4\xa6\x0c\xb0\xc2\x67\x45\xf5\x30\xb4\x81\xfc\x97\x6a\x09\x3c\xe2\x4a\x30\x91\x6a\xf6\x05\xee\x94\xb0\x87\x85\x19\x3a\x94\x9d\x56\x9c\x4b\x7e\xf5\x96\x03\xbb\x62\x43\x60\xe7\xb4\x08\xd9\x8c\xa5\x09\xda\xf5\xa9\x2a\x6d\x40\x15\xbd\xb6\xf9\x7a\xd4\xff\x0c\xf0\x5c\x8f\x0c\xd5\x47\x6a\x93\x44\x26\xa0\x59\xf2\x44\x44\x46\xe5\x86\x4f\x08\x9e\x0f\x06\x75\x61\x59\x10\x66\x2d\x7c\x1e\x79\xa6\xc7\x5f\xa3\x14\xb7\xba\x2c\x64\x3b\x0d\x37\x65\x3e\xef\xe5\x93\x17\x2d\x1d\x33\x2c\x8d\xd6\x44\x92\xea\xf1\x04\xfb\x19\x57\xba\xa5\x20\x49\x44\x2d\x10\xb5\x6a\xf8\xea\xe8\xff\x82\xcd\x8f\x46\xa0\x49\x4b\xec\x2f\xcb\x9f\xad\xf1\x0c\xf7\x1a\x6e\xec\xd0\x54\x7d\xaf\xdc\x7a\xdb\xaa\x45\x03\x78\x3f\x94\x3a\x46\xb4\xad\x0e\x6d\xd7\xf2\xca\xb5\x56\x17"}, -{{0xef,0x00,0xb3,0xc1,0x81,0xf6,0x32,0x7d,0x02,0x25,0x67,0x51,0xcb,0x51,0xc2,0xc3,0x6c,0x0c,0x0a,0x78,0x07,0x63,0x40,0x54,0x8f,0x5b,0xc0,0x70,0xd8,0x6d,0x9e,0x26,},{0xdb,0x14,0xcd,0x32,0x58,0x8f,0xd7,0x41,0xe8,0xf4,0x2e,0x51,0x21,0xcc,0x81,0x1a,0xd4,0x50,0x63,0xf2,0x81,0x41,0xe8,0x3c,0x66,0x8f,0x07,0xd9,0x12,0x28,0xf0,0x49,},{0x13,0x9f,0x9c,0xb9,0x9b,0x99,0x5b,0xe6,0x58,0x8c,0xdd,0xb5,0x05,0x16,0x94,0x83,0x8f,0x9d,0x82,0xa6,0x07,0x61,0xfd,0xe3,0x04,0xb0,0x02,0x7f,0xf8,0x65,0x84,0xbf,0x65,0xc7,0x3c,0xc6,0xd2,0x53,0xe5,0x60,0xf6,0x55,0x25,0xdf,0x04,0xbf,0xe1,0x46,0xc8,0x3b,0x42,0x26,0x9c,0xf3,0x78,0x0f,0x8b,0xc3,0x92,0x43,0x78,0x94,0xae,0x01,},"\x7d\x6a\xbe\xc7\xa1\x1a\xf6\x73\x24\xce\x17\xb1\xd2\x0b\xb4\x0c\x66\x8a\x21\x9b\xc9\x5d\xf0\x5e\x32\x5d\x86\xf8\x87\x95\xe2\x64\xd4\x54\xfc\x5f\xa7\xd9\xc8\xaa\xfe\x77\xe9\x0a\x6a\xf6\xb5\x74\x53\xd8\x5b\x97\x0b\x55\x2a\x85\x6b\xa6\x59\xab\x31\xbd\x8a\x66\x0e\xb7\xd3\x58\x7b\x45\x3e\x5c\x5f\xc6\xb7\x94\x72\xb2\x6e\x8f\xf7\xdd\x6d\xb6\xbe\x35\x72\x54\x8b\x0d\x75\x4e\xd4\xd9\x85\xb8\xd9\x96\x5f\x88\xb9\x52\xfc\x4f\xa3\xb7\x61\xcc\xff\xc3\x53\x54\xdb\x0e\xb9\xc5\xa1\x71\x71\x8a\x8a\x55\x92\x87\x02\x13\x82\x7d\x36\x91\xba\xe7\xfd\x9c\x63\xf2\x05\x03\xe0\x43\x19\xb5\xe9\x53\x57\x9d\xe4\x7e\x3e\xf8\xe1\x62\x85\x49\x50\x3c\xb4\xf6\x87\x1b\xa2\x5d\xb8\x73\x47\x08\x0e\x53\x1a\x51\x7a\x8b\x72\x21\xe6\xad\x84\xdf\xf8\x32\x56\xd9\xab\x9a\x43\x3d\xe8\x71\xb9\xcb\x9c\x50\x44\x58\x9e\x67\x20\x6b\x31\x7a\x52\x06\xae\xba\x96\xc9\x2f\xd6\x09\x40\x71\xc6\x44\xfe\x52\x65\x8d\xed\x92\x20\xcf\x6a\xbd\x50\xe2\x30\x5a\x1c\x90\xfd\x66\xaa\xcf\xb3\x8e\xb0\x5e\xaf\xf6\xca\x5f\x85\xf4\x29\xcd\x57\x71\x6e\xb8\x77\x39\xa0\x2b\x64\xcf\xfa\x08\xc4\xf6\x85\xb0\x03\x10\xb5\xb4\x84\x49\x20\xdf\x21\x5a\x9f\x24\xa1\x76\x13\xae\xf8\x5f\xec\x94\xf5\x11\xdc\x8a\x42\x94\xed\xdc\xea\x11\xc0\x8c\x0b\x39\x9a\x23\xd9\x16\x38\x3e\x29\xad\xeb\x98\xc6\x5d\x41\xc7\x05\xa5\x7f\x84\x05\x20\xfa\x80\x8d\x7f\xd2\x5f\xdc\xe1\x59\xf7\xa0\x84\xd0\x62\x97\x4b\x30\x13\x2a\x57\x12\x42\xba\xff\x41\x96\x24\x6d\x6d\x75\x7b\x31\x2e\x9d\x60\x85\x53\xd2\xdc\x53\xb6\x23\xb2\xe9\x5c\x75\x38\xfb\xc5\xde\xb6\x2b\xa7\x37\x76\xd8\x5e\x51\x18\xfa\x1a\x30\x2d\x4d\x07\x6d\x99\xe1\x00\xf0\xdf\x11\x9c\x33\xfc\x66\xcd\xfe\x6f\xd4\x4d\x71\x99\x7b\x78\xc8\xf7\x89\x0c\x70\x73\x46\x05\x62\x20\xd1\xe9\xde\x88\xbc\x17\x3c\xf0\xb7\x6c\xb3\x02\x87\x7e\xc1\x6a\xf4\x6e\x4c\x31\x63\x9f\x54\xee\xdc\x16\xda\x9d\x9e\xb0\xad\x95\xbd\xa5\x45\xdf\xc4\xa7\x32\xb6\xda\x98\x14\x13\x6a\xb1\xb9\x39\x2a\x07\x1b\x02\x24\x73\xb3\x49\x05\x57\x69\x8b\x77\xe7\x44\x7a\xc8\x59\x0d\xca\xf4\xf2\x42\xad\x3d\xfb\xc0\xdf\x71\x6c\xc0\xea\x75\x36\x26\x97\x3d\xf0\x8d\x93\x5d\x17\x8e\x33\x12\xfb\xe2\xa7\xba\x9c\x50\x93\xc5\x3b\x92\x55\xea\xca\x29\xb7\x25\x78\xe3\xba\x1b\xdf\xaf\x0c\x9e\xce\x21\xa5\xdf\xf6\xea\x42\x15\x24\xf7\x0f\xc1\x90\x4e\x9a\x2c\xf7\xc5\x18\xbf\xcc\x7e\x36\x73\xee\x87\xff\x27\xe1\xca\x2a\xc3\x2b\xcb\x40\x91\xcb\x34\xa8\x2a\x71\x56\x3f\xf6\xa6\xa1\x5d\xa0\xeb\xd5\xbd\x10\x25\x6c\xe9\x60\xf4\xea\xa7\xfe\x35\xe1\x28\x88\x60\x50\xd0\x49\xfe\xc3\xa4\xab\x16\xd5\xb0\xc1\x07\x26\x7e\xae\x1a\xb8\x01\xea\x5b\x91\x98\x38\x39\xda\x1c\x48\x8c\x12\xf8\x64\xd7\xc3\xa7\x7f\x2b\x6a\xe2\x7d\x54\x01\x09\xf6\x8d\x78\x36\x4b\xb6\x27\x18\x3b\xd5\x03\x91\x75\x47\xaa\xf3\xb3\xa1\x80\x9d\xa0\x25\x77\xb3\xf0\x3a\x9a\x3f\x5a\xf4\x8c\x88\x02\xe2\x97\xc8\xbb\x63\xdb\x6a\x86\xd3\xea\x72\x7a\x6d\x71\x48\xb3\xaa\x44\x4b\x8d\x16\x8f\x38\xc6\xc8\xf2\x40\x88\xa4\x9a\xf3\x31\x77\xa3\x44\xad\xab\x2c\xf6\xe0\x8e\x0c\xb0\x37\x1e\xd5\x2b\xde\xad\x13\x2f\x77\xe7\xae\x3e\xe5\xd8\xfb\x17\xaf\xc0\xa0\xbb\x73\x11\xb9\x56\x0b\x67"}, -{{0xd0,0x71,0xd8,0xc5,0x57,0x8d,0x02,0x59,0x49,0x93,0x2a,0xa6,0xbf,0x6a,0x80,0xb1,0xcc,0x41,0x2f,0x10,0x6f,0x91,0x57,0x4e,0xe2,0x46,0x54,0xb4,0x45,0xee,0x9a,0x97,},{0x9b,0xcb,0xf7,0xd2,0x21,0x2f,0xb6,0x2c,0xcc,0xf8,0xb6,0xc7,0x68,0x03,0xa5,0xea,0x24,0x40,0x9d,0xa6,0x28,0x7e,0xfb,0xb8,0xb1,0xf0,0xc7,0xb3,0x0e,0xbd,0xd9,0x3e,},{0x0c,0x29,0x7a,0xbe,0x0f,0xd8,0xeb,0xcc,0x6b,0x77,0x19,0x98,0x75,0x5e,0x2c,0x6b,0xe0,0x7c,0x81,0x2b,0x5a,0x80,0x54,0x49,0x57,0x06,0x31,0x70,0xca,0x69,0x43,0x2e,0x72,0xb6,0x0d,0xaa,0xe3,0x22,0x95,0x8a,0x22,0x38,0xcd,0x6a,0x46,0x28,0x94,0xa3,0x87,0xee,0xf6,0x5b,0xf9,0x6f,0x63,0xf5,0x4c,0x08,0x56,0x87,0xa5,0x02,0x75,0x0e,},"\x3e\x8e\xe7\x0e\x51\xe5\x6e\xf5\x7f\x6e\x66\xb3\xa8\x84\xaa\x04\xa7\xb4\xd4\x59\x9f\xb9\xb4\x39\x96\xb3\x93\xa8\x68\x09\x35\x12\xea\x74\x1a\x0c\x6a\x94\xf4\x0c\xe4\x98\x62\xd2\xfd\x1f\x75\x51\xf4\x64\x7a\xbd\x80\x75\xbc\x1b\x74\x2a\xd4\x0e\x29\xa6\x04\x61\x30\x12\x24\xfe\x8f\x76\x92\xb1\x47\x72\x78\x2b\x4e\x89\x6b\x63\xfe\x05\xab\xd5\xff\x53\x14\xf9\xec\x80\x75\xf2\x8d\x90\x8c\xca\xaa\xce\x5e\x90\x5e\xa7\xf5\x7a\x49\x1b\x99\xb3\x59\x1e\xea\x54\xa6\xb7\x81\x91\x67\x74\x9d\x38\xa0\x47\x62\x06\x76\xa1\xa7\xaf\x11\xf4\x85\xa5\x5b\x7c\x87\x9e\x68\x50\x38\x08\x58\xc8\xf4\x5c\x0c\x1c\xcb\xd7\x40\x6e\xd0\x99\xd8\x4a\x74\x71\xb9\x35\x0c\x4d\xdb\x28\x47\x0b\xf5\xbf\x32\x7d\x5b\x3c\x22\xd8\x99\xb4\xc6\x60\x83\x9e\x10\x4a\x06\x22\xae\x85\xc8\x4a\xa9\xfc\x7f\x0a\x2c\x7c\xeb\x6e\x69\x1c\x49\xc0\x64\xb5\x31\x34\x99\x68\x3e\x8e\x03\xb2\x11\x5e\xda\x7d\xda\xd5\x5a\x49\xf9\xfb\xe6\x25\x44\xf9\x14\x51\x1c\xfb\xec\x6b\x84\xdb\xde\x7e\x80\x90\x9b\x45\xfb\x10\x50\x2e\x2c\xaa\xa7\x21\x24\xfd\x94\x56\xa3\x87\x2f\x95\x92\x70\x7e\x9a\x4c\x50\x12\xda\xa9\x72\xea\xf6\x5f\xab\xe5\x53\xde\xbe\x82\x57\x01\xef\xef\x5c\x75\x6b\xb4\x65\xe9\x66\xab\x68\xdd\x52\xf3\xdd\x00\xa4\x5c\xf6\xdc\x3f\x19\xb8\x6b\xb0\xdb\x4a\x86\xe4\x66\x98\x85\xa0\x74\x69\x6a\x67\xd8\xea\x21\x18\xc7\x66\xef\x62\x5f\x8a\x98\x02\x6f\x9f\x4a\x3c\x5c\xcc\xf9\x84\x6f\xdc\x90\xed\x93\xec\x7c\x1f\x3c\x70\x86\x95\x4f\xa2\xf0\xa4\xca\x96\xd4\x01\x84\xaa\x57\x54\x55\x27\xa1\xf9\x65\xc1\x1d\x84\x3c\x90\xc5\xa5\xe0\x8d\x7c\x11\xf2\xd5\x61\x00\x4e\x90\x57\x48\x52\xeb\x50\x46\xaa\x1e\xa7\xb6\x10\x09\xfd\x5d\xd7\xd6\x24\x2a\x8d\xf5\x8a\x9e\x8e\x55\x5c\x7f\x4c\xdc\x13\x0d\x69\x01\xbf\xe6\x79\x7f\xdc\x6c\x39\xbe\xec\xfb\xba\xb6\x62\x5b\x2e\x4f\xb9\xd8\x00\x02\x76\xd4\xa9\x4f\xc6\xfc\x10\x51\xfe\xff\xf5\xad\xeb\x72\x4b\x87\x09\x0d\xb0\xa2\xc6\x97\xd0\x56\x66\x4d\x99\x1f\xad\x80\xdc\x80\xfa\xb7\x00\xb1\xf1\xf2\xee\x27\x73\x4e\xbc\x26\xb2\xa6\x41\xc3\x2a\x0c\x91\x1b\x27\x0a\xc7\x6b\x0d\xa5\xc0\x89\x14\x97\x1c\x91\x12\x46\x3a\x70\x70\x9c\x0d\xda\xc7\x91\x00\x16\xf9\x13\xf6\x21\x00\x86\xd7\x25\x5c\xef\x11\x95\x57\x10\xf6\x51\x88\x9c\x83\x62\x1d\xd8\xa4\xfc\xd5\x36\x63\x02\xd6\xc9\xb5\x6e\xef\xcf\xac\x85\xc1\x4a\x94\x78\xb6\xd7\x18\x07\x54\x28\x80\x07\x60\x51\x5c\xab\x5f\x3d\x44\x55\xe2\xb9\x70\xdf\x9f\xe4\xbe\x83\x83\xd7\x04\x83\xbb\xdd\x75\x60\x71\xf5\x3b\x2f\x9c\x27\x5c\x7c\x85\x12\xd1\x63\x51\x8f\xe5\x55\x83\x75\x14\xc8\x67\x76\xc9\x47\xf2\x9a\x77\x57\x02\x87\x44\x6b\x69\xbe\x40\xc8\xd4\xab\xbd\x65\xef\x25\x07\x24\x9b\x5a\xec\x33\xac\xb7\xb8\xbd\x3f\x35\xbc\x85\x9b\xa4\xe3\x7b\xdb\x49\xcf\x91\x3d\x93\x98\x9c\x44\x38\xd2\xab\xcf\xa3\x88\xcc\x89\xd7\x8a\xc0\x62\x70\x65\x64\x92\xe7\x52\x8f\x29\xbd\xfe\x8c\xbb\x9b\xfa\x9e\x73\xc1\xda\x01\x3f\xc3\xce\x21\x05\x65\x76\x13\xff\x62\xbb\x0c\x3b\xf4\xde\xe3\xb0\xd2\x65\x9c\x72\x6e\x7b\xcd\x9e\x97\xec\xce\x92\x47\xd4\x60\x0d\xfe\xaf\x60\x44\x4e\xd8\x62\xb0\x0b\xa1\x1e\x70\xea\x88\xd4\xf0\xb6\xb5\x39\xfc\x9f\x36\xbb\x2a\x1a\x9e\xd2\xb3"}, -{{0xe9,0xd4,0x86,0xc2,0x9a,0xe8,0x11,0xb9,0x42,0xe1,0x0d,0x81,0xf0,0xa6,0x71,0x63,0x17,0xb8,0x42,0xc2,0xc5,0xbf,0xde,0xf5,0x5c,0xc4,0x32,0xb7,0xfc,0xae,0xb8,0x18,},{0x43,0xa5,0x2d,0x15,0xb9,0xf7,0x31,0xd7,0x37,0xb1,0xc4,0xdb,0xc3,0x22,0x27,0xa4,0x80,0x96,0x30,0x91,0xd2,0xc6,0x28,0x6f,0x48,0x2e,0xf1,0xe8,0x36,0x70,0x54,0xe5,},{0x65,0x19,0x1a,0xa8,0x85,0xdd,0xab,0x9f,0x67,0x27,0x18,0x79,0x95,0x2f,0xc6,0xaf,0xfe,0x41,0xca,0x20,0xeb,0x3b,0xcd,0x86,0x67,0x31,0x61,0xb0,0x3b,0x53,0x26,0x94,0xd6,0xdd,0x88,0x90,0x8e,0xb1,0xb1,0xee,0xc0,0x03,0xcf,0xcb,0xe6,0x14,0x6b,0x45,0x38,0xe2,0x1d,0xf5,0x59,0x69,0x91,0x2a,0x0d,0x7d,0x88,0x18,0xad,0x79,0x59,0x0d,},"\x14\xfe\x1e\xd5\xbb\xbd\x76\xcc\x73\xdc\x56\x50\xbd\xa9\x2d\xe8\x63\x26\xe2\x4d\x2f\x1f\x62\x24\xba\x85\x68\x94\x4d\x6f\xe3\x44\x26\x75\xdb\x96\xf1\xd8\x49\x8f\x16\x34\xff\x9b\x6e\x50\xcb\xa9\xdb\x4e\xb0\xb0\xb0\x21\xb2\xbe\xcf\xce\x4b\xef\x33\xc4\xce\x0e\x32\xc8\xa9\x83\x89\xec\xa9\xe0\x59\xa6\x62\xd6\xf0\x37\xc5\x4a\xa4\x0c\x76\xcd\xee\xe8\x56\x50\xf0\x89\xea\x56\xe1\x38\x3a\xb0\xf5\xc3\x6f\x6d\x66\x45\xff\x7e\x87\x66\x73\x01\xf9\x44\xfd\xc2\xed\x35\xb0\xd2\xc3\x5c\xb2\xe4\xb4\x56\x36\xe7\x49\x8e\x92\x7f\x58\x46\xb3\xe1\xed\xfb\xd1\x60\xa4\xae\xf3\x32\x0c\x34\x28\x49\x6b\xda\xaf\x7d\x3e\xd5\x6e\xf0\xb7\x25\x4a\xc5\x97\xbe\x58\x9a\x70\x58\x44\x16\x30\x0c\x1a\xdc\xfb\xa4\xf2\x2c\xfd\x4c\xd6\x61\xe1\xf5\x0f\x15\x5d\x17\x2f\xa5\x74\x8d\x29\x6b\x29\xcd\xd7\xeb\x81\x21\x48\x3f\xf1\xd9\xfe\x95\x3f\x94\x51\xc7\xc7\xa5\x42\x00\x72\x85\xee\x72\x46\xbc\x0f\xde\xa9\x38\x81\x40\x29\xab\xce\x05\x7a\x0e\xcb\x97\x4b\x12\xd3\x60\xea\xb6\xaf\xd3\x07\x97\xd6\x14\x45\xad\x2b\xac\x7e\x52\xbc\xe4\x34\x63\x15\xf7\x8e\xb8\x75\x42\xd5\x95\x28\xb2\xf6\xc5\x6d\x66\x24\x1c\xb4\x42\x03\x3f\x64\x3d\x3d\x2a\x67\xcb\x63\x7d\x8d\xa9\x5d\x4f\xd1\x23\x4b\x03\x1a\x3e\x51\x72\x3a\x1d\x26\xe6\xf5\xca\x07\x98\x73\x21\xad\x11\xa9\x0f\xcc\x1d\x4e\x2b\x0b\x89\x66\x50\xc3\xa7\x51\x8d\x56\x55\x29\xbe\xa8\x06\xa0\x5d\x44\x7e\x08\xd2\xa6\xa3\xdb\xf1\xa3\x69\x15\xb2\x95\x7c\xa5\xb4\x0e\x58\xb9\x7a\xd0\x36\x97\x35\xc4\x28\xbd\x6d\x69\xbd\x21\x00\x44\xb6\x51\x41\x8d\x98\xb0\x59\xd9\x0c\x83\xe4\x60\x11\xf4\x1c\x03\x2c\x56\x55\xa5\xef\x21\xac\x2c\x8c\x2b\xc9\x4b\xe0\x7e\x45\x42\x6a\x7a\xe5\xd4\x7b\x45\xf2\x7c\xf4\x28\x9c\xa4\xdd\xab\xe0\x8a\x12\xb9\x10\x20\x7d\xab\xb3\x4a\x46\xab\x75\xce\x69\xb5\x8e\x7e\x17\x66\x4b\xf3\x35\x9a\x8f\xb6\x8e\xb0\x32\xc9\xea\xa6\xdf\x87\x38\x29\xf0\xe0\x84\x85\x53\xf7\x32\xe1\xc3\xc0\x84\xb3\x2b\x7a\xf7\x50\x74\xe7\xbb\xaa\x4e\xb5\xd7\xea\xd7\xaf\xf9\x75\x80\x10\x9b\x60\xf4\xc7\x92\xf9\xe2\xa6\x51\x37\xb0\xaa\x48\x17\x5b\x81\x15\xd9\x13\x05\xf4\xc7\x7e\x2d\x08\xe7\xe8\xd7\xe7\x78\x5c\x96\x68\x42\xc2\xe3\x50\xfe\xd4\xf9\xe3\x3b\xf6\xe1\x84\xc5\x50\xb4\xb0\x6e\x95\x74\x14\xed\xf5\x2f\xa0\x79\xe8\x19\x73\x45\x84\x61\xfb\xb9\xb7\xd7\xd3\x4b\xef\x15\x03\x57\xf4\x32\xca\xac\x3a\xe9\xf3\xdc\x96\xeb\x5a\x2d\x12\x3e\x09\xed\xa1\x70\x2e\x1d\x10\x70\x17\x7b\xb2\x20\xc4\x23\xc0\x96\xec\x24\x42\x43\x85\xc6\x79\xbe\x02\xef\x84\xd0\x9e\xd1\x02\xf4\x9c\xad\x3b\x1f\xd6\x70\x67\x9a\x39\x71\x4f\xf1\xd6\xe4\x22\x8d\x8d\x7d\x0e\x19\xed\x0e\xba\x13\x2f\x21\x28\xd4\x7b\xaa\x56\x9a\x8e\xcb\x7b\xd4\x8a\x82\x62\x82\xf9\xcf\xcb\xf6\x0d\xde\xce\xaf\x1d\x02\x13\x2c\x8a\xff\xed\x3a\x03\xd2\x34\x0d\xeb\x78\x7c\xd6\x49\xc5\x1c\x6e\xcb\x9f\xf7\x5d\x7a\x7b\x4e\xf9\xb1\x51\x39\xcf\xea\x27\x62\xab\x18\x61\x51\x97\xa6\xb5\x1f\x6e\x75\xdb\xd0\x45\x73\xa2\x44\x80\x94\xd0\xcd\xeb\x0f\xe4\x58\x58\x83\xff\x9b\x68\x82\x4a\x04\xb8\x3e\xc9\x1c\xf8\x4a\xcd\x6a\x74\x46\xcb\x1f\x5e\xe3\x7d\x5d\xf8\x0f\x17\xcb\x2b\xdc\x3f\x31\x22\xa8\xfa\xf7\x6e\xbd\x06\xcf\xe8\x17"}, -{{0xe6,0xfa,0x10,0xdb,0xb4,0x78,0xe1,0xe3,0x6b,0x35,0xdf,0xeb,0x02,0x50,0xf6,0x3c,0x08,0x51,0x50,0x70,0xae,0x79,0xb2,0x2f,0x04,0x7e,0x27,0x17,0x08,0xd6,0x4f,0x5c,},{0xe0,0x2e,0x1f,0x2b,0xd8,0x79,0x2e,0xf4,0x83,0x48,0x1c,0x6d,0x11,0xf7,0xc7,0xc9,0xdb,0xde,0xec,0xc9,0x85,0x94,0x32,0xe7,0xf2,0x79,0xe9,0xd1,0x73,0xd3,0x11,0x64,},{0xc0,0x3c,0x47,0x03,0x59,0x12,0x7e,0x9d,0xe3,0xaf,0x0e,0x0e,0xd7,0xd3,0xb1,0x9f,0xae,0xe0,0xec,0x14,0x0b,0x79,0xc2,0x99,0xe2,0xcb,0x6d,0xac,0x0a,0x3e,0x7e,0x31,0x41,0x41,0xcc,0x85,0x4b,0x45,0x96,0xce,0x4c,0x51,0xc7,0xb0,0xde,0xc8,0xa5,0xc8,0xcf,0x09,0x36,0x20,0x53,0x61,0xd5,0x36,0x5f,0x4b,0xcc,0x07,0xc4,0x28,0x7c,0x07,},"\xad\x31\x60\x75\x8d\x8c\x08\xa6\x61\x52\x5c\x95\x28\x0a\x37\x18\x87\x49\x69\x85\x9f\x1c\xc9\x18\xe3\x4f\xec\x00\x8a\xcf\x23\xb8\x89\x6e\x8d\x50\xc3\xc0\x51\x23\x31\xdc\x89\x78\x0f\x8b\x10\xfc\x34\x9c\x67\x5c\x4c\xd8\x2a\x5d\xf8\x58\x6b\x43\xc8\x64\x44\x8f\xac\x00\xb8\x47\xb9\xc9\x80\x54\xab\x79\x3f\x63\xc7\x1a\xa5\xe5\x24\x8e\x22\xd0\x69\xbd\x3f\x85\x2a\x3b\x8c\x6e\x2a\xc8\xef\x86\x1d\x90\xbc\xd9\x84\xbf\xca\x87\x58\x3e\x59\xe9\xa7\x46\x8f\x29\xb8\x08\xdc\x2f\xe5\x30\x2a\x98\x9d\x6f\x2e\xcd\xe7\x58\x5c\xd9\xbe\x4e\x4c\x76\x1c\x4d\x4b\x3e\xea\xf4\x69\x9f\x65\x56\xef\x03\x9a\xf2\xb8\x0f\x94\x07\x60\x5a\xc3\x97\x35\x1d\xd8\x55\x95\x58\x44\x95\xba\xa1\x77\xb0\x8c\x88\xd2\xec\x1f\xc4\xe3\x2d\x1c\x0b\x8d\x7e\x7a\xc5\x83\x9d\xfb\x92\x3f\x09\xb3\x23\xe7\x8e\xce\xb7\xe9\x6c\x06\x04\xb0\x1a\x19\xe4\x9c\x9b\xea\xf4\xf2\x5e\xc4\xa8\x4c\x1a\x08\xf2\x38\x0e\xdd\xc3\xa7\xf0\x12\x18\x49\x59\xcc\xd1\x9e\xcb\xba\xc6\x5e\xac\xa1\x55\xce\xe9\xec\xfe\xc1\x1e\x7f\xee\x05\x8e\x17\x4f\xc4\xed\x7c\x67\x9f\x2c\x15\x63\x1d\x4e\x15\x27\xbc\xdb\x0e\x3b\xb0\x81\x5f\xfd\xff\xc0\xc8\x56\xbe\xf0\xdc\x0f\x5c\x82\x37\xf7\x09\x8e\x26\xbd\xb6\x9e\x87\x82\xd1\xca\x51\x11\xec\x3c\x7e\xdb\x42\x5d\xff\x80\x32\x02\x6c\xba\x3d\x2e\x08\x1b\x71\x31\x0d\xb9\xba\xda\xd1\xad\x02\xf1\xec\xcc\x53\x7d\x87\x4c\xd1\x8c\x6b\xb0\x12\x21\xf7\x1e\xe6\x62\x50\xd9\x4c\xf8\xec\xce\xaa\x96\xd3\xc5\x7e\xea\x2b\x0a\x8e\xc7\x24\x29\xd7\x60\x64\x88\xbd\xf1\x9e\xc3\xbb\x16\xe5\x08\x67\xc7\x93\x7d\xef\x09\xfc\x78\x3f\x20\xa2\xa5\xec\x99\x25\x3d\x6b\x24\x0d\xf4\x67\x7d\xd2\xd5\x27\x7b\x01\xc5\xb8\xe5\xbd\x6c\x7d\xf0\x87\x42\x05\xbc\x8c\x2f\xff\xdb\xa1\x31\x46\x74\xd3\x1c\x9b\x2c\x91\x99\x22\x8e\x19\xe0\x42\x18\x34\xc1\x65\x7d\x06\x98\x28\x69\x16\xc7\xe3\x92\xf0\xab\xd5\x54\x5b\x96\x3a\xc1\xff\xa9\x97\x21\x61\x6c\x23\x79\x6f\x85\xc3\x4a\x5c\x66\x4a\xe8\x1d\x16\xb2\x16\xa5\xb0\xcf\x5b\xc6\xb5\xa9\x08\x29\x72\x85\xd6\x16\x44\x12\x8f\x88\x6f\x38\xaf\x9e\xdd\x25\x19\x3d\x7e\xcc\x77\xa7\x99\x94\x27\x8d\xa0\x71\xf5\x44\x95\x93\x7f\xee\xf5\xa5\x19\x57\x52\x7c\x3e\xec\x7c\xb0\xb4\xe8\xaa\x7a\x4e\x85\x6d\xef\xd5\x7d\xd9\x23\x34\x15\x1b\x98\x6a\xa6\x9c\xa6\x92\x60\xd1\xe2\xd7\xb5\x3c\x05\x67\x7e\xe0\xd2\x16\xb2\x8d\x03\x62\x52\xdd\x30\x06\xde\xbe\x1b\x65\x74\xa2\x5e\x6b\x19\xdf\xb4\x8f\xa6\x43\x16\xaf\x8f\xd6\x8d\x78\x93\xb3\x97\xe7\xdb\x57\x80\xab\x27\xbf\x87\x26\xff\xf6\x05\xd3\xb4\x6d\x80\x05\x95\xb4\x62\x4b\xee\x30\x2c\x96\x43\x26\x03\x4b\x52\x34\xd1\x75\xdf\xdc\xc2\xce\x88\x2e\x65\xb3\xd9\x3a\x04\x38\xf6\x92\xe9\x69\x5d\xe1\xf2\x4c\x70\xa7\x9b\xee\xd2\x54\x15\xec\x5a\xae\xcf\x33\x91\x95\x3b\x2f\xfd\x45\x3a\x8f\x04\x67\x56\x1a\x4a\x47\xee\x14\x4a\x43\xfd\xff\x83\xdf\x2b\xea\x5f\x66\xa7\x22\xb5\x2a\xbe\x86\x13\xf2\x0c\x59\x4a\xf0\x98\x2e\xb3\xf0\x45\x05\xa5\x24\x61\xdd\x03\x4d\xa8\x6c\x36\xca\x16\x21\x77\x05\xc0\x48\x23\x91\x1d\x72\xa2\x47\x69\x51\x76\x33\x56\x28\x86\xf2\x50\xf2\xcf\x78\x8b\x8f\x32\x86\x4a\x94\x74\xf5\x7e\x62\xe5\x7d\xe8\xfd\xaf\x95\x9a\x6b\x72\x28\x74\x40\xa8"}, -{{0x05,0x8e,0x36,0x80,0xb8,0xfc,0xc0,0xaa,0x14,0x90,0x08,0x9c,0x11,0x24,0x67,0x7f,0x98,0xd7,0x4b,0x1b,0xfb,0x71,0xee,0x86,0x63,0xf0,0x25,0xf0,0xd9,0x46,0xcd,0x20,},{0xec,0x72,0xce,0x0e,0x82,0xc6,0xa3,0xb2,0x12,0x43,0xd2,0xf0,0x0e,0x9e,0x88,0x3a,0xdb,0xc5,0xcb,0x63,0xb3,0xd9,0x36,0xef,0xa5,0x0c,0x07,0xcb,0x92,0x91,0x48,0xe2,},{0x57,0x34,0xec,0x50,0xa7,0xf8,0x2e,0x48,0x53,0x6b,0xdc,0x43,0x70,0xcf,0xef,0x2e,0x15,0x0a,0x63,0x1d,0xab,0xaf,0x89,0xed,0xcf,0x0f,0xda,0xbe,0x4f,0x58,0x39,0xf4,0xf5,0xfb,0xd8,0xdf,0x8e,0xc4,0xa3,0xac,0xd4,0x0a,0x8b,0xfb,0x96,0x3d,0x18,0x55,0xff,0x92,0x74,0xdb,0xc3,0x31,0x65,0xb5,0xe6,0xd3,0x7a,0x23,0x9d,0xac,0xe9,0x03,},"\xe6\x3d\x14\xf5\xbe\xa7\xa1\xab\xb8\xfe\xe6\x97\x74\x6c\x22\x80\xdf\xd0\x62\x2d\xe7\x35\x72\x26\xcc\x07\x42\x72\x2a\x32\x29\xbe\x12\x6b\x08\x3e\x86\x8a\xea\xf0\x7d\x2f\xc9\x7a\xdc\x33\x42\x70\x96\x74\x19\x3c\xa2\x81\x74\x4e\x85\x0e\xa1\x54\x40\x05\x0a\xec\x93\x0e\x45\xd7\xa8\x7b\x8a\xc8\x01\x5c\x89\x67\xc2\x00\x33\xa5\x32\xd2\x95\x91\xb1\x35\x58\x6c\xe0\xfd\xd2\xe6\x68\xb5\xc8\x64\xb3\xbd\xe7\x0c\x7e\x71\x9a\xd2\x41\x93\x12\x51\x86\x19\x33\xff\xbf\xa9\x64\x83\xff\x82\x85\x67\x48\xc5\x6d\xc2\x6e\x25\x7d\x69\x2e\x51\x34\xd8\x2f\xc7\x19\x1c\x11\x0d\x95\x90\xd3\xfc\x75\x1c\xd6\x36\xb0\xc4\x6f\x44\xf8\x80\x3e\x59\xe2\xf9\x3f\xa0\xcb\xe2\x47\xa1\xa6\x25\xb4\xbc\x2c\x7b\x1f\xdc\xeb\x5a\x2b\x22\x59\x1f\xa6\x13\x7c\x54\x04\xdf\xec\x6a\x69\x63\x9e\x3f\x63\x2b\x59\x76\xab\x9f\xe1\xc6\x3a\xa3\xda\x9d\x52\xb0\x44\x00\x8f\x3a\xe4\x4b\x7c\x36\x4f\x08\x56\x64\x32\x3a\x88\xeb\x45\x83\xe8\x71\x40\xf7\x63\x78\x2b\xff\x88\x19\xcf\x74\x1a\x87\x5d\x50\x6c\x92\x9d\x34\xbb\xd4\x30\x07\xde\x4b\x18\xf6\x87\xa7\x58\x11\x11\x28\xb1\xdb\x86\xfc\x5a\xd2\xfb\x9f\xca\xd1\x2c\x9d\xd2\x8f\xee\x5a\xd1\x0d\xe0\x73\x9f\x8e\xfd\x9b\xff\x66\xf8\x40\xb1\x1b\x3f\x91\xc5\xe0\x7c\x21\x45\x2c\xab\x24\x24\x2b\x6e\x32\x16\x5c\xd1\xe6\x95\x72\xbf\x21\x6e\x86\x04\x53\xda\xd2\xfd\x12\x9c\x33\x37\x58\x58\x0b\xb7\xd0\xf1\x95\x09\x74\x5e\x85\x14\x63\xd1\x27\xa5\xf9\xbe\x21\xfe\x54\x9c\xae\x55\xd5\x6b\x8b\xea\x80\xbf\xaf\xda\xc1\x0a\xcd\x83\x8e\xa8\xaf\x31\xc0\x07\xdc\x32\xbf\xd7\x40\x82\xd9\x11\x0a\x3e\x91\xe6\x1e\x03\x57\x58\x7e\x4e\xd3\x28\x27\xad\xe9\xb6\x91\x0a\x98\x8c\x1d\x3b\x2d\xd2\x2c\x0e\xe7\x6e\xf3\x5f\xe1\x5e\x09\x94\x04\xa4\x5d\x4b\x2a\xca\xb9\x12\x3e\xcc\x45\x55\x0a\x40\xfa\xf8\x33\x6b\x46\xc6\x30\xa9\x08\x03\x58\xff\x8b\x8e\x58\xaf\x0b\xcc\xbd\x35\x01\x0c\x1e\xcc\x12\x81\x66\x55\xa5\xec\xeb\xa9\x5a\xd3\xf5\x03\xa1\x8e\xc5\xbe\xce\x3a\x33\xf4\x69\xdf\xe9\x17\xe1\xc5\x5e\xf1\xd8\x1e\x5a\x75\x56\x1e\x6b\xbd\x99\xc6\x53\xa6\xd0\x95\xb9\xf3\x87\x91\x1e\x40\x33\x2f\x62\x16\xf9\x56\xa3\x5c\xf7\xd9\x9a\x9f\xdd\x0c\x44\xc5\x1e\x90\xa5\x64\xf1\xc3\x6b\xf3\xd4\x0a\x7f\xaf\x4b\xa2\x8b\x1a\x12\x0b\x32\x05\xfb\xac\x1a\x98\x56\x92\x90\xbe\x37\xc5\x8b\xbd\x74\x5c\xe0\xfb\x74\x83\x52\x70\xab\xa2\x25\x2a\xda\xec\x15\x7d\xc4\x24\x61\x22\x1a\x2c\xff\x68\x7b\x9e\x65\xce\xb5\x7c\x2d\x77\x70\x0a\xea\x63\x20\x48\x6c\x5b\x1b\xec\x9c\xc5\x3e\x7e\xf9\xe4\x8f\xcd\x1b\x77\x83\xac\xbe\x75\xa6\xbe\x02\x67\x27\x88\x12\xdb\xf3\xd2\x57\x6c\xf7\xad\x39\x11\x27\x1a\xce\xbe\x0f\x2c\x04\x60\x2a\x08\x0c\x8b\x96\xc1\x20\xfd\x86\xfd\xa2\x82\xaa\x4e\x1c\x13\x1f\xe9\x7c\x90\x7c\x15\x85\x5f\x87\x75\x5f\x51\x1c\x03\x7b\xef\xad\x0f\x56\xb3\x9f\x32\xa2\x13\x3a\x22\xf3\xd5\xa9\xbe\xc3\x44\x3f\x29\xa6\x94\xe9\x7f\xe0\x5e\x10\xfb\x8e\xf9\x99\x13\x02\xb9\xe0\xd8\x4d\x92\x9a\x19\xeb\x03\x47\x1f\x3a\x86\x13\xd3\x93\x68\xe1\x58\x83\xa7\xe4\x97\x0b\x53\xcb\xaf\x29\x29\xd8\xde\x43\x1b\x48\xb4\x35\xd7\x53\x3c\xaa\x2e\x36\xce\xab\x6c\xdd\xb3\x46\xe5\x35\xe5\x15\xc4\xb3\xdb\x76\xde\x07\xd9\x85\x54\x14"}, -{{0x51,0xba,0x3a,0x4f,0x3d,0x85,0xd1,0x54,0x8c,0x2f,0x24,0x94,0xa3,0x51,0x1f,0x3b,0x95,0x15,0x66,0x3d,0x7e,0x85,0x37,0x0f,0xb6,0x15,0x02,0x37,0xe9,0xbc,0x98,0x0b,},{0x77,0x49,0xde,0x02,0x10,0xbc,0xe0,0x6d,0x48,0xf5,0x9b,0x95,0xae,0xb1,0x52,0x8f,0xd9,0xb4,0xe5,0x2c,0xdd,0xe2,0x2f,0xb8,0x19,0x3b,0xed,0xd5,0xdf,0x12,0x81,0x7c,},{0x16,0xfb,0x29,0x0c,0x91,0x3b,0x20,0xeb,0x1c,0x3d,0x7b,0x79,0x82,0x49,0xeb,0x84,0x59,0xd4,0xbe,0xe8,0x12,0x5d,0xb2,0xb3,0xf1,0xda,0xab,0x8a,0xf9,0xd9,0xa7,0x00,0xed,0x79,0x8a,0xdd,0xd8,0x02,0xdf,0xcd,0x29,0x7a,0x41,0x25,0x93,0xcd,0xa7,0xbe,0x99,0x79,0xa1,0xf0,0x93,0x50,0xe8,0x6f,0x69,0x8a,0xc3,0x38,0x0e,0x34,0x1d,0x07,},"\xd1\x8d\x0c\xbf\xc1\x6d\x0f\x9b\x67\xf2\x53\x9a\xd6\x20\x7c\xd9\x21\x7a\xd5\xed\x03\x33\xcd\xdb\x10\x41\xe0\xac\x2b\xdd\x92\x02\x76\x62\x96\x52\xb4\x9c\xbc\x98\x02\x59\x3e\xc3\x64\xea\x79\x5a\xbc\xd1\x58\x20\x85\xf5\x5b\xc6\x6c\x48\xfd\x3e\xed\xe6\x18\xd6\x36\x96\x17\x10\x0e\xae\xcc\xc1\x5f\x24\x9d\x6e\xee\x5b\xb2\xc4\x3c\x01\xb0\x62\x3f\xe6\x03\xce\xee\xe4\x9b\x40\xfb\x7c\x53\xfc\x68\x47\x36\x73\xc0\x9b\x1a\xc7\x7e\xa9\xbe\xb7\xe8\x53\x03\x79\xa8\x6d\x69\xec\xd1\xff\x11\x81\x3f\xbb\x88\xf6\x92\xf0\x5e\xf1\x32\x07\x42\xb4\xfe\x7e\x06\xd5\xba\x71\x65\x66\x46\xcd\x75\x00\xde\x19\xbb\x93\xd8\x44\x53\x66\x03\xf4\x0b\xd4\xae\xea\xf0\xc4\xdb\xc0\xac\xfd\x20\x2b\x28\x6b\x64\xaf\xb8\x3d\x4a\x37\x8d\xd4\x5e\xe3\xc1\xdf\x6b\x3e\xf1\x6b\x8b\x1a\xcc\xbc\x04\x06\x32\x50\xec\x47\xb8\x6a\xe5\xa7\x1d\x1d\xab\x38\xb5\xeb\x80\xd6\x63\xfa\xa7\x88\xf8\xb5\x9a\x75\x4c\x0f\x9c\x9f\x6d\x90\x62\x52\xaf\x46\xab\x1f\xff\xed\x27\x6d\x23\x88\xdb\xe7\x0d\x96\xba\x67\x47\xd1\xfe\xd4\xfc\x0b\x55\x29\x3d\x5f\x78\x7b\xda\x0c\x0d\xf4\x6a\x73\xf4\xaa\x7d\x29\xe1\xc9\xcc\x85\xcd\x04\x3e\x3d\xff\xe0\x57\x46\x2c\xa5\xfe\x5c\x64\x70\xe7\x39\x27\x6f\x8b\x53\x4c\x01\x72\xe4\x60\xf3\x40\x48\x7a\x56\x94\x68\xaa\x58\x90\xcc\x14\xf2\x0d\x67\xd7\x9c\x66\x1e\x87\xfe\xba\xc6\x27\x59\x71\xc3\x73\x08\x07\xeb\xf1\x75\xe0\xde\x10\x49\xbe\xe6\x7c\x89\x5e\x57\xb7\x1a\xb8\xa2\xf3\xcf\x36\x41\xfd\x54\x8d\x09\x41\x4f\x5f\xc3\x02\x6a\x0a\x35\xf6\xba\x95\x16\x73\x94\x49\x41\xcb\x23\x6f\x3d\x19\x76\xdc\x69\x07\x7d\x95\x14\x50\xe7\x66\x03\x16\x98\x8f\x6f\x2a\x6f\xbb\xff\x3b\x37\xce\xaa\x02\xfd\x6f\x02\x73\xbd\x80\x31\x85\xa1\x09\x03\x9c\x63\xf2\x51\x9b\x98\x3d\xaf\x65\x54\x25\x3b\xed\x54\x97\xc0\xb0\xbd\xaa\x0b\xd4\xa1\xfa\xc9\x00\x26\xad\xe3\xe4\x0c\x55\x4c\xff\x2c\xcb\x36\x99\x0e\x71\x55\x67\x08\xc5\xc4\x03\x92\x56\xff\xc7\x33\x7e\x5f\xea\x11\xf5\xe9\x0d\x3e\x4d\x93\x35\x91\x79\x11\x6a\x85\xc2\x41\x36\xca\x34\x83\x5c\xd3\x40\x12\xe4\xd7\xdd\xc7\xb7\x21\xc2\x46\xc7\x37\x00\xe2\x76\xdc\x2f\xf9\xf2\x77\x0b\x43\xc8\xe8\x0a\x17\xf0\x1d\x32\x68\x0b\xae\x22\x8e\x64\x23\xa8\x80\xc3\xfb\x99\x6a\xb8\xd2\x21\xbc\x62\x74\xac\x5f\xa7\x70\xd2\x05\xfc\x87\x8f\xba\x9b\xbd\x77\x6a\x3d\x79\xed\x77\x04\x89\x50\xf3\x6d\xc0\xaa\x3c\xcd\x28\xe4\x75\x6a\x99\x19\x04\xae\x05\x1b\x8a\x4b\x7d\xe3\xa1\xf2\xad\x0f\xb4\x5a\x33\xd0\xc6\x82\x25\x84\x1f\x8e\xb6\x5b\x6a\x16\xe9\x5f\x89\x35\x91\xe1\xaa\x73\xa6\x4f\x0d\x2e\xe9\x38\xab\x69\xad\xcc\x8c\x59\x51\x8b\xec\x50\x1c\x39\xf1\x39\x17\x4b\xbb\x00\x69\x9e\x1a\x0f\x0e\x0d\x88\x9a\xae\x54\x3a\x55\xe6\xac\x56\xd5\x20\x4c\x1a\xde\x1f\x27\xd8\x2a\x6a\x95\xe1\x4b\x2d\x69\x09\xdd\xa7\xbf\xaa\x7f\x48\x7f\xb6\x19\x59\x01\x4b\x78\x79\x5c\xb4\x63\x9f\x09\xf0\xd3\x29\xfe\xb3\x5c\xcf\x52\xed\xc2\xdb\x72\x19\x14\xe4\x23\x30\x68\x89\xa4\x83\xfe\xe8\x76\x36\x0e\xe3\x26\x33\x53\x19\x07\x0c\x56\x4f\x3a\x8b\x95\x3f\x52\xf4\x15\x13\xa2\x26\x08\x83\xc3\x8d\xd9\x78\xa2\x48\x60\x4a\x41\xbd\x4b\xfc\x9e\x84\x18\x4d\xc9\xe8\x4d\x25\x89\xf4\xaf\xff\x84\x17\x82\x4c\xe5\xad\xba"}, -{{0x7d,0xde,0xc5,0x26,0xa4,0x97,0x1d,0x89,0x12,0xa6,0xbd,0x43,0xc6,0x9f,0x92,0xed,0x86,0x44,0x2b,0x15,0xf4,0x2f,0xba,0xbb,0xf2,0xd1,0x7e,0xff,0x98,0x99,0x31,0x61,},{0x0d,0xfe,0xff,0xb2,0x76,0x23,0x09,0xb4,0x73,0x4e,0x4c,0xe2,0x52,0x3c,0xf1,0x86,0x31,0x49,0xf7,0xe1,0x9a,0x7c,0x14,0x7e,0xc0,0x89,0x9e,0x11,0x0c,0xa9,0xd8,0x7d,},{0x9e,0x60,0x3b,0x01,0x5f,0x42,0x87,0x1b,0x78,0xeb,0x27,0x52,0x3f,0xbb,0x7c,0xe9,0x62,0xfc,0xa3,0x2a,0xe2,0x70,0xe8,0xe1,0x2d,0xca,0xdd,0x25,0xaa,0x85,0x2b,0x89,0x1f,0x6f,0xef,0x77,0xb5,0x9a,0x54,0x6c,0x9a,0x7a,0x7c,0xac,0xb5,0x5e,0x1d,0x32,0xad,0xc8,0x05,0xae,0x5f,0x61,0xa6,0x9e,0x67,0x64,0xc7,0xc0,0x82,0x92,0xeb,0x03,},"\xe8\x77\x4a\x45\xd4\xd8\xf8\x6d\xda\x5c\x08\x80\x2b\xa2\x47\x2e\xf3\xc8\xd3\x6c\x7f\x38\x3a\xc0\x46\x12\xa4\x64\x38\x2e\x9d\x6c\x07\xd8\xd3\x58\x22\xc5\x3f\x43\x88\xf5\x15\x36\x14\xfe\xfa\xf4\x63\x74\x74\x7b\x9d\x4f\xd4\x46\xa8\x64\x76\x9a\x4c\xad\xe8\x43\xc1\xea\xb8\x57\x43\x19\x11\x2f\x01\x79\xd2\xea\x9e\x3c\x19\x5d\xc0\x68\xf0\x69\x74\x62\xb9\xe0\x7c\x87\x94\x87\x0f\x8f\xb8\xff\xc0\x81\xe4\x58\x6a\xfb\xcd\xba\x7a\x4f\x59\x25\xe9\xfd\x9e\xc9\x42\xd8\x43\x47\x33\xc2\xdd\xd5\xe2\x9b\xbd\xfc\x73\x42\xb9\x28\x68\x71\x9b\x54\x40\x88\xa4\x8e\xba\x4c\x82\xf1\x87\xdd\xca\x8f\x47\x46\x25\xa7\x1c\xf6\xb7\xaa\x5f\x08\x1c\x74\xf7\x40\x8f\x53\xb7\x81\x63\x6e\x7e\x9d\x29\xb0\x7f\xdb\x6d\x9c\x35\xe5\xeb\x38\x2d\xb7\xa3\x1a\x8b\xa5\x16\x91\x5d\xf8\xde\xe9\xe1\xad\x3f\x18\x28\x43\x68\x3e\x8d\x1d\xc5\xd8\x66\x9d\xbf\xcf\x09\x54\x1a\x43\xc0\xa0\x46\x13\x38\x1a\x5b\x5e\x4e\x71\xb2\x3c\x5a\xd0\x9b\x8e\xaa\x51\xcb\x93\x8d\x0c\x75\x2c\xc3\xd3\xa1\x0f\x10\xb4\x2b\xe8\xee\x7f\x6b\xda\xc8\x07\x85\x68\x43\x49\x46\xbb\xf5\x6d\xa7\x0e\x7d\x54\x15\x7a\x6e\xfd\x48\x46\xeb\x15\x52\x78\xc9\x4c\x38\x88\x65\x8a\x7a\x2f\x8e\xa3\xba\xc1\x47\xaa\x89\x16\x92\xae\x8b\x23\xf1\xaf\xe7\x1e\xcf\xde\xca\xa6\xc1\x13\xb5\xca\xaa\xa1\x93\x98\xc7\xdf\xe7\x3f\xac\xb4\x15\x5f\xd6\xba\xc1\x8d\x5d\xf2\x12\x9e\x8b\x29\x07\xec\xee\x15\x1b\xdd\x14\x7a\x7c\x3e\x46\xea\x72\x75\x4d\xe3\x2c\xeb\x06\x6d\x9d\xb1\xc2\x6e\x80\xdf\x36\x31\x29\x2b\x16\x17\x4c\xfa\x6f\x1d\x9c\x08\x28\xb8\x49\xc2\x2d\x29\x65\x1a\x73\xe9\x10\xd9\x27\x58\x77\xf4\x64\xce\x93\x26\xc6\xe4\xed\x6b\x07\xdc\xb3\xa3\x53\x63\xc1\xaa\x64\x72\xe0\x2c\x5c\xd8\x55\xe3\x8a\xab\xe9\x65\xac\xe9\xf3\xf5\xa4\xf5\xde\x03\x00\x86\x94\xcb\x90\xaf\xe4\x16\xc9\xd4\x86\x88\xde\x7f\x75\xcf\xe2\x43\xff\x7f\x41\xe0\x59\x31\x09\x34\x90\x3d\xb5\x68\x84\x45\x08\x26\x2c\x89\x9d\xfa\x75\x0c\xd6\xa2\x82\x98\x24\xba\x02\x7a\xea\x1b\x6d\x01\x77\x72\x6a\x34\x3a\xdd\x4e\xcd\xc5\xf7\xe6\xe9\x09\xab\x7d\xe6\x15\xef\x28\x07\xf9\xe7\xd7\x1c\xe2\xf7\x8a\xcf\xf5\x7e\xba\x79\xc3\xf5\xe0\x7c\x8b\x66\x1c\x1e\x30\x27\xf8\x17\x6d\x28\xbf\xef\x76\x7d\xd6\x8d\x4e\x5d\x62\x8f\xec\x0b\xfe\x88\x79\x93\x41\xf3\x06\x12\x87\x34\xfa\xd2\x02\xaa\xfc\x9f\x11\x12\x3f\xb3\xe3\x63\xd1\x0a\xee\x0d\xb5\xe2\x7a\x15\x70\xdf\xae\xe4\x7e\x24\xda\x47\x3b\x07\xfe\xe5\x9a\x6c\x93\xf0\x98\x1d\xbe\x32\x5c\xd8\xcc\x2d\x2e\xd7\xdc\x17\x16\x6b\x26\x7c\x1b\x11\x05\x36\xf2\x63\x6b\xba\x34\x75\x1a\x78\xf7\xf6\x29\x81\x82\x44\x2d\x83\xc1\x23\xbb\xee\x4f\x50\xc5\xb0\xfa\xcf\xf0\x3e\x7c\x55\x6e\xd9\xe6\x4c\xa2\x7c\x4b\xca\x5a\xb0\xde\x0d\x5f\x9c\x2c\xbb\x54\xcc\x2d\x94\x73\xa3\x2d\xf9\x99\x39\x0a\xc2\xff\xee\xd3\xd4\xcb\xa3\x49\x73\xdc\xec\x3f\xba\xba\xfc\x4d\x54\xca\xe4\xe7\xe8\x5d\x4a\x6e\x8a\xfe\x45\xca\xcd\x71\xe0\xf2\xe6\xd0\x4b\x4f\x9d\x3b\xcf\x43\xd3\xfa\x41\xe9\x98\xcc\xbe\xd0\xf1\x50\xd5\xca\x1d\x52\x72\x93\x2d\x93\xec\xa1\x04\x95\xc6\x83\x34\xfa\x32\x68\xf3\x1d\xe5\x22\xcb\x12\xa7\x44\x9f\xfb\x5c\xb5\xe8\xf1\x46\x2c\xd9\xb5\x17\x70\xcc\xaf\x58\xb1\xe0\xd8\x2e\xf9\x29"}, -{{0x0b,0x65,0x90,0xdd,0x7c,0x2f,0x15,0xf9,0x4a,0x56,0xe2,0x40,0x16,0x93,0x63,0xc2,0x67,0x32,0x30,0x2b,0x9d,0x44,0x0b,0x53,0x27,0x23,0x00,0x2e,0x15,0x5d,0x02,0xd9,},{0xcd,0x18,0xe0,0x32,0x57,0x7c,0x55,0x76,0xf2,0x23,0xf3,0xe3,0xd8,0xa1,0xfa,0x8e,0x9a,0x87,0x0f,0xef,0x09,0xe9,0x40,0x9f,0xaf,0x40,0xd7,0x14,0x3e,0x52,0xfc,0x44,},{0x64,0x2d,0x81,0xac,0xf3,0x8c,0xf0,0x99,0xa8,0x33,0xa7,0x4f,0x2d,0x80,0xb8,0x54,0x48,0xec,0x2b,0x1a,0x5d,0xdc,0x64,0x47,0x0b,0x21,0x3d,0x54,0xb7,0xbe,0x61,0x33,0x68,0x9a,0x71,0x94,0xf5,0xd8,0x97,0x92,0xe1,0x6e,0x5d,0xf7,0x55,0xa4,0xfd,0x9e,0xf4,0x68,0x9e,0xa9,0x52,0x92,0x6e,0x0e,0x4e,0xcb,0x3b,0xd4,0x81,0xfd,0x91,0x02,},"\x71\xfe\x0f\xd5\x5d\x5e\xd1\x20\x6f\x28\xee\x16\xe4\x19\xfa\xb6\xfa\x66\xa2\x51\xfa\x6b\x06\x01\xda\x26\x1e\x42\x9f\x55\xb8\xd5\xae\x3f\x3c\x52\xa1\x7f\xe1\xec\x73\x4b\x81\x0a\xb6\x3a\xad\xe4\x44\x70\x39\xca\x0a\xe4\x68\x7c\x24\x35\xf5\x61\xe4\x6c\x5b\x30\x97\x17\xab\x31\xe0\xf6\x40\x76\xb2\x16\x92\x11\x57\x2b\x74\xe1\x8a\x1f\x45\x25\xa6\x4f\xa7\x17\xa5\xed\xf1\x49\x75\x81\x29\xcb\x04\x03\x5e\x7e\x20\xba\x40\x05\xb7\x48\x09\xde\xc6\x44\x50\x4c\x24\x54\xa7\x7f\x99\xb2\x0c\x53\x74\xf3\xce\xe7\xd8\xc6\xb6\x8b\x24\x3c\xaf\xb3\x00\x98\xdc\xe9\x04\x90\xfd\xc3\xb9\x2f\x54\x94\x8f\x42\x46\x39\xe1\x9f\x8f\x20\x20\xd1\x55\x13\xda\xef\xad\xd9\xe9\xb1\x2a\x84\x76\x1e\x5e\xce\xa0\x88\xad\x56\x1f\x06\x20\x9f\xd4\x42\x3f\xcd\x00\x3f\xbc\xd1\x87\x3e\xa5\x49\x63\xa2\xfa\x07\xc7\x47\x6b\x13\x88\xf9\x01\x5d\x9e\xac\x30\x5b\xea\x5a\x3d\xe1\x94\xf5\x5a\x17\xb4\x2d\x59\x9e\x5c\xe6\x2c\x8b\x7c\x19\xe7\xe7\x09\x61\x37\xb9\xd0\xa6\x5e\x63\xc1\xa3\xb8\x45\x38\xca\x65\x36\x9a\x20\xe8\x82\x2f\xff\x5e\xcb\x57\xfc\x09\xb4\xe6\x84\x5b\x4f\x24\xd4\x88\x69\x71\xac\x1a\xc2\x8c\x77\x58\x0e\xa5\x67\x2a\xd1\x4c\xe4\x44\x17\x19\xc2\x14\x54\x6d\x07\x36\xcb\x7a\xd0\xbd\x9f\xb5\xb2\x6c\x6d\x9c\x53\x6b\xf8\xc8\x57\xae\x42\x57\x7b\x36\x34\x1d\x39\x2b\x43\x32\x3b\xda\xe7\xdf\xaa\x49\x19\x86\x87\x2a\x23\xd8\x27\xc6\xef\x8b\x57\xe7\xd0\x0f\xea\xe3\x83\x4c\x46\x64\x00\xaa\xd1\xd3\x67\x82\x39\x84\xaa\x02\xd2\xef\x49\x29\x14\xae\x11\x27\xe7\x55\x1b\x81\x25\x59\x37\x83\x05\xe4\xfd\x52\xd8\xbc\x7e\x41\x57\xec\xca\x45\x1f\x43\xee\x9f\x54\xc8\x21\x53\xc7\xdb\xfa\xf7\xec\x35\x23\x87\x73\x05\x1b\x4e\x58\x7d\xb1\x36\x95\x7e\xc5\x71\x38\x2b\x90\x59\x0b\x5d\x10\x26\x02\x45\x80\x96\x6b\x72\x52\xd2\xcd\x3f\x4f\x16\x25\xc4\x85\xba\x90\x6b\xff\x17\x59\x92\x18\x89\x78\xf2\xd6\x27\x4f\x3a\x03\x17\x49\xba\x7e\x70\x2f\x56\x54\x7e\xdc\x96\xec\x26\x7b\x84\x89\x28\x80\xd7\x50\xd7\x31\x0e\xbf\x6d\xb2\x41\x25\x3c\xab\xe4\xb2\x5a\x97\x74\x58\xc6\xff\xc9\xe3\x53\xe6\x2a\xdf\x05\xe6\xef\xc0\xfc\x1e\xbe\x89\xf5\x27\x70\x5b\xcc\x26\xb7\x01\x28\x56\x10\xd9\x8a\xa3\xbf\x23\x87\x2b\x69\x96\xd3\xde\x48\x0e\x8d\x09\xd7\x83\xc4\xa0\x8c\xd3\x83\xc9\x01\x26\x35\xaa\x68\x97\x8b\x50\x06\x81\x8b\xbd\xe4\x4f\x29\x87\x47\x9b\xcb\x2b\x71\x1c\x1b\xee\xed\x27\xcf\x09\x97\x0a\x16\x4e\x45\x4f\x71\x08\x22\xee\xf5\x55\xc1\xc7\xbf\x9f\x76\xd5\x25\x4c\xe2\x20\xc9\xaa\xa7\x16\x84\x7a\x24\x94\x88\xf9\xcd\xb4\x4c\x48\xf4\x52\xab\x52\xc4\x0f\x6d\x03\xad\xc8\xbf\x3f\x19\x7b\x25\xe3\xd1\x27\x83\x0e\x74\xfd\x81\xeb\x14\xf7\x54\x20\x5b\x3a\x48\x44\xc5\x96\xb6\xe3\xa9\x93\x6a\xd6\xfd\x9e\x80\xa1\x63\x20\xb3\x81\xc3\xff\xc7\xb6\x9e\xab\x54\x53\x6f\x55\xab\xe2\x2c\x91\xd8\x98\x40\x8e\x88\x0c\x6d\xbf\x0f\xa5\x64\x8d\x51\x77\x72\xca\xa5\x35\x3b\x25\xdb\x60\x50\xd7\x53\xfa\xf1\x98\xec\x1d\x37\x5d\xe0\xfa\x72\x18\x0a\x93\xba\xb0\x3d\xed\x77\x16\xcb\x87\x50\x5b\x68\xac\x6a\x35\xe7\x3d\x0f\xcf\x34\x45\x7e\xff\x82\x17\x89\x52\x14\x2c\x7b\xac\x9d\xfd\x87\x2a\x9a\x82\xf8\x5b\x24\xb8\x8f\xa4\x2d\x4b\xe0\xa0\xca\x0b\x2c\x70\xf4\xc6\x22"}, -{{0xc6,0xd9,0xac,0xc5,0x17,0x5f,0xa2,0xb8,0x96,0x5c,0x15,0x8c,0x56,0xba,0x0a,0x5a,0x66,0x6a,0xd2,0xc7,0x40,0xcd,0x5b,0xb6,0x79,0xbb,0xa9,0xb1,0xdc,0x50,0x92,0x84,},{0xf5,0xcf,0xca,0x21,0x1b,0x02,0xfb,0xa7,0x72,0x03,0x47,0x70,0x3b,0xf1,0x63,0x1c,0xb3,0x08,0xfa,0xbc,0xda,0xa6,0x74,0x29,0x52,0x7c,0x5b,0x7b,0x67,0x6d,0xba,0xef,},{0x4d,0x2c,0xe7,0x07,0x09,0x0b,0x0f,0x3f,0x41,0x46,0x2f,0xd7,0x5b,0xd6,0x09,0xa2,0x72,0x4f,0xad,0xfe,0x5c,0xa3,0x90,0xe3,0x13,0xa4,0x2c,0xab,0x42,0x86,0x8e,0xd6,0xe9,0xa8,0x91,0x4d,0xc1,0x39,0x09,0xc0,0xd6,0xf6,0x1e,0x63,0x71,0x29,0x57,0xc7,0x6f,0x3b,0xd8,0xb7,0xf5,0x53,0x49,0x71,0x5a,0x3a,0x31,0x75,0x15,0xc0,0x71,0x08,},"\xf2\x45\x10\x0c\xd2\xd3\x16\x48\xf5\xf3\x51\xbd\xa5\x64\xc9\xdb\x4a\x35\x82\x0c\xc3\x0e\xf6\x51\x33\x7c\x4c\xd8\x88\x07\x05\x69\xd1\x17\xa9\x34\xb9\xc9\x18\xe5\xdf\x8b\x37\x44\xdd\x66\x20\xcc\xbc\x49\xf6\xb3\xe5\x78\x2a\x30\x33\x9d\xbb\x9c\xbe\xd0\x5d\xd2\xb3\xb8\xc5\xbf\x15\x46\xe7\x0a\xf6\x36\xe6\x61\x5c\x48\xb2\xc3\xc2\xd1\x9f\xe3\x54\x20\xdf\x53\x14\xf6\x3c\x48\x12\xb5\x8e\x82\xa2\xa6\x0b\x18\x02\xf3\x8e\x50\x5c\xe7\x48\x01\x7a\xfa\x97\x7d\x3f\x9b\x1b\x6b\xea\x21\x92\xac\xec\x73\xbd\xce\x12\xd6\x5e\x68\x4d\xa4\xd8\xb4\x1f\xa9\xa8\x6f\x11\x08\x6e\xdc\x2d\x52\x96\xf6\x7e\xfc\x53\xac\x84\x07\x0f\xde\x13\x69\x3e\xb2\x31\x8f\x5a\x8c\x3b\x11\x7c\x23\x34\x22\xad\xcd\xd3\x52\xf3\x28\xf0\xec\x69\x9a\x46\x50\xc9\x3f\x9b\x4a\x7d\x79\x5d\x7f\xc2\x62\x2a\x03\xd9\x9b\x64\xf7\xb3\xdc\x31\x94\xf6\xc3\xb1\xb6\x9d\x99\x07\xce\x09\x24\x01\x07\x3f\x47\xa2\x8f\x47\x99\xd2\x29\x09\x2a\x1b\x07\x41\x29\x95\x4b\xe8\x0c\xa4\xa3\xe6\x58\x2e\xe0\x5c\x30\x2c\xac\xb7\x43\x1d\x1c\xa6\xa4\x51\xaa\xed\x72\x78\xab\xc7\xf7\x85\x75\x24\x1c\x2a\x2e\xea\x2e\x84\xcb\xf9\xa3\x34\xdf\x40\x21\x09\xc0\x28\xe3\x45\x47\x3a\x13\xaf\x9b\x00\x8e\x20\xbc\x8c\xf0\xbc\xef\xbb\x7a\xa7\x27\xec\x85\x6e\x99\x25\xb4\xdd\xd9\x9d\xeb\xa8\xf2\x52\x91\x1a\x59\x01\x54\xb5\x79\xa8\xaa\xa3\x1f\x07\xdd\x50\x25\xdf\x5c\xd8\xa0\x9f\x74\x29\x64\xcc\x8c\x36\x5d\x8a\xff\x4e\xb1\xd7\x9f\x6e\x5a\x07\xda\xc5\xf4\xed\xe9\x2b\x4e\x2e\x61\xd3\x4c\xc2\xd4\xf0\xaa\xaa\xb0\x37\xad\x5f\xdb\x95\xde\x6c\xd5\x98\x4e\xba\xf7\xcc\xe7\xf0\x8d\x0c\xa0\xdb\xbe\x48\x3c\xe3\xcb\x35\xcd\x79\x0c\xa0\x42\x70\x65\xa3\x4d\xf7\xf4\xc2\xaf\x86\xef\xe9\xb7\x65\x71\x3a\xff\x25\x7f\x5c\x1d\x54\x70\x95\x27\xad\x18\xac\x33\xab\xcd\xee\xdb\x20\x80\x64\xeb\xae\xa4\x83\x5b\xe4\x94\x2b\x8f\xc6\x66\xad\x1b\x79\xb6\x65\x13\x09\xe5\xea\x1d\xa3\x02\xd7\xfb\xa2\xe9\x9f\x0e\x63\x19\xe8\x2b\x99\x05\xa1\xea\x48\x2b\xa0\x43\xb6\x80\x0b\x33\x0d\xc4\x8b\x33\x13\xf5\x9b\xb2\xf9\xe8\xa7\xf0\x7e\xb1\x80\x0a\x70\x27\x45\xdb\x14\xc6\x29\x9a\x98\x2d\xad\x89\x79\x54\x44\x5b\x7d\x98\xeb\x58\x37\xfd\x70\xbf\x19\x0c\x64\x95\x52\xc8\xe8\x6f\xeb\x7f\xf5\xb3\xed\x8e\x0a\x06\x70\x4d\x45\x53\xa3\xc2\xdd\x74\xf1\x8e\xa8\x23\x3a\xe0\xa5\x0d\x91\x4f\xe0\x8f\xbc\xd3\xa1\x43\x5f\xed\x56\xa9\xf3\xa7\xef\xfa\x14\x0f\xb5\x52\xdd\xd2\x1d\xff\xff\x7f\xa4\x73\x32\xdd\xfc\x1e\x53\x17\xf4\x17\x7d\x5e\x2f\x11\xa0\x6e\xc8\x4c\xcf\xb8\x9b\x65\x4e\xa8\x1b\xd4\x2d\x7e\x07\xa3\x87\x30\x1d\x0f\x40\x26\x4a\xbb\xf9\xf9\x10\x7b\x30\xed\xe8\x64\xcc\x76\x90\xc0\x6d\x2e\x24\x7a\x06\x0b\xb2\x24\x4a\xd7\x8e\xd5\xc5\x51\x5a\x1a\x2a\x61\x2d\x61\xe3\xd9\x31\xe2\x8b\xc9\x39\xb4\xd3\x43\x5e\xee\x4f\x73\x31\xb1\xf0\xf8\x53\x75\xd8\x2a\xc9\xa7\x7c\x43\x74\x00\x32\x05\x17\x46\xdc\x92\x69\x45\x8c\x14\x7d\x18\x8d\x84\x40\x19\x54\xa4\x89\xcb\x4f\xbf\x9b\xf8\x4b\xa7\xd8\xf1\x00\x90\x3c\xe6\x78\x31\xb4\x05\x4d\x0f\x58\xcd\x88\x3d\x54\x2c\x49\x33\x10\x3f\xf0\x70\xcd\xfc\x9d\xbb\x0f\xcc\x31\xef\xca\x46\x6e\x77\xa3\x3f\x1a\x81\x3d\xa6\xdc\x0c\x7c\x31\x58\x5e\x8f\x4f\xef\x1e\xbf\x42\xfb\xd1"}, -{{0x7d,0xfa,0xe4,0x16,0x41,0x9d,0x7b,0x0d,0x4f,0xc1,0xf8,0x23,0x84,0x0c,0x3e,0x4b,0xd4,0xad,0xcd,0x4d,0xc2,0xdc,0x17,0xb3,0x86,0x37,0xac,0xed,0xac,0xbd,0xbb,0x45,},{0xbc,0x51,0xd7,0x74,0x59,0x31,0x31,0x7e,0x1e,0x34,0x6e,0x2e,0x7c,0x92,0x03,0x91,0x81,0xb6,0xbf,0x38,0xee,0x2f,0x5a,0x44,0xfb,0xe2,0x33,0x9c,0x4f,0x95,0x2a,0xb9,},{0xda,0x34,0xb1,0x98,0x3e,0x8c,0x55,0xe4,0x1f,0xda,0x8e,0xc8,0xab,0xf2,0x3b,0x36,0x7a,0x0d,0xa6,0x06,0xc8,0xcd,0xbb,0x1e,0x8b,0x57,0xe0,0x34,0x3c,0x05,0x57,0xa5,0xf0,0xe8,0x15,0xe7,0xf2,0x2f,0x86,0x05,0xae,0x93,0xb2,0x7d,0x03,0x77,0x6a,0xc1,0xf7,0xde,0x3d,0x79,0x2e,0xa2,0x93,0x3a,0xc2,0x2d,0x2d,0xc2,0x3b,0x32,0x3d,0x0c,},"\xec\x84\x3d\xc4\xdd\xa6\xe9\x02\xe9\xbe\x31\xb7\x0f\x11\x76\x3b\x75\x7a\xb6\xce\x73\x34\xdc\x00\x76\x4b\x2d\x08\x4e\x9d\xaf\x24\x84\x48\x59\x84\xee\x28\xa2\x83\x0f\xcb\x94\xc5\x41\xcb\x46\x94\x40\x03\x67\x31\xde\x80\xff\x56\x0f\x53\x0c\x9d\x9e\x6e\x1f\x7d\x9c\x4c\x5b\xdf\x50\xb0\x4f\x54\x03\xc2\x9f\x76\xd7\xe3\x6e\x00\xbb\xea\x35\xdb\x1c\xc6\x0d\xa8\xd7\x76\x52\x62\x66\xc3\x32\x4c\xe7\xef\xec\x64\x50\x85\x96\x09\x26\x68\x56\xd7\x01\xa4\x7a\x48\xde\xe8\xbf\x37\x40\x95\x65\xc7\xfb\xfa\x99\xa2\x04\xe5\x53\x0c\x97\x1c\x60\x5b\x44\x30\x5d\x5c\x74\x67\x89\x41\x14\x25\x3c\xf4\x3c\xdd\xf1\x8b\x62\x96\xdd\x25\x4a\x4d\x96\xac\x70\x00\x91\x81\x86\xdf\xd4\xbf\x45\x4e\xd3\x09\x74\xc5\x53\xd0\xae\x15\x1a\xd4\xcf\x54\x0c\xec\xaa\xa0\xb5\x94\x8b\x09\x85\xa9\xc7\xb6\xe7\x81\x59\x32\xba\xc1\x17\x32\xfc\x7d\x10\x26\x7f\x6b\xf8\xf1\xe7\xc0\x8d\x65\x0e\x56\x7b\x4e\xdd\x15\xae\x79\x58\x41\x0e\x42\xf1\xf5\x37\xfa\x73\x2f\x72\x7a\x26\x83\x88\x32\x1d\x53\x44\xc4\xe7\x8b\xb9\xa7\x4e\xab\x9d\x6a\xbf\x96\x89\x65\xc6\x66\x93\xd5\xf1\x12\xdd\x4c\x14\xfd\xfd\xd9\x60\x05\xea\xa6\x75\x7f\xa2\xcc\x10\x13\xfe\x43\x27\xab\x09\x99\xd1\x17\xf3\xdb\xf3\x25\xb0\x7c\xd4\x54\xd4\xb1\x41\x99\x1e\xf7\xe2\x3d\xb5\xee\x24\xbe\xda\x35\x88\x4a\xa3\x70\x48\x08\x64\x8a\xa4\x3c\xd6\x25\x62\x59\xf7\xd3\xdb\x5e\x05\x53\x11\xf2\x53\xe8\xb5\x7a\x4c\xda\x5a\xfe\x0b\x0a\xdf\xc3\x64\xe1\x60\xca\x37\xe8\xde\xc6\xb9\x5a\xa6\x15\x2e\x5d\x5d\xa6\xeb\x91\xbe\x0e\x44\xff\xe8\xe4\x95\x33\x26\x7b\x7e\xb7\x95\xf5\xf8\xe0\xb2\xc3\x5b\x29\xdf\xbc\x87\x58\x5f\x22\xbd\x5b\x90\x9d\xfd\x6a\x5e\xdc\x0e\x3a\x9d\x97\xb0\xc4\xf3\xad\xc5\x1e\x96\x99\x37\xc0\x8f\xd6\x5f\x53\x7a\xac\xda\x8f\x11\x27\x5a\xf0\x2c\x33\x54\x54\x26\x30\xf3\x92\x0c\x39\x3f\x5c\x42\xb9\xfc\x63\x3d\xe9\xd9\x4c\x72\xe3\xf2\x00\x02\x34\x9a\xd0\x41\x80\x35\xb3\xf2\x5f\x02\xca\x92\x8e\x5b\x2d\x40\xa7\x7a\x1c\x3e\x56\x22\x1f\x4b\x9d\xb0\xc2\x5b\x09\x6d\x6e\x5d\x0f\xe7\x58\xda\x2c\x69\x05\x3e\x8d\x08\x6d\xef\x4e\xdc\x6e\x34\x53\x78\x3f\xfc\x63\xa4\x96\x01\x22\xd9\x23\x67\x1a\x90\x60\x08\xba\xc1\x05\x61\xae\x62\x19\xd2\xb5\x1d\x53\x67\xbf\x13\xcc\xab\xf5\x93\x1b\x9f\x18\x6e\xb1\x09\xba\xcd\xe4\x0e\x1a\xf2\xb5\x64\x81\xe0\xc6\xdc\x6f\x5c\x54\x73\xf8\x00\x1c\xf3\x71\x91\x9a\xcb\x40\xce\xc5\xb9\x62\xeb\xba\x80\xe3\x2d\x6e\xba\xc4\x80\x6d\x04\xd2\x47\x68\xc2\xad\x2e\x3f\x92\xa8\xcb\xe4\x77\x54\xf9\xbf\x61\x59\x53\x52\x2b\x26\x3d\xc2\x49\x37\xfb\xd9\x32\xc8\xc4\x59\xeb\x8b\x10\x94\x43\xaf\x6c\x19\x5a\x59\xfd\x27\x21\xb0\x12\x56\x28\xf2\xb8\x14\x3c\xf3\xc1\x28\xbc\xec\x13\x92\xef\xd1\x6b\x73\x4c\x10\x71\x6d\x96\xba\x7d\x1f\x41\x39\x17\xcc\xaf\xa5\xbf\x5f\x83\xf5\x24\xfe\x84\x06\xa1\x52\x11\x5e\xa7\x70\xe1\x74\x5e\x82\xe8\xb5\x1d\x75\x2b\x8b\xd7\x85\xdf\x48\xbf\xc1\x20\x41\xbf\x87\x4f\xc7\x3a\xfb\x42\xca\x5d\x69\xc6\x41\x64\x79\xce\xb4\xaa\xa0\x49\x2b\x6f\xf2\x1e\xe1\x2d\xb2\x21\x3a\x42\x86\xfd\x56\x05\xc9\x3a\x7b\xb8\xa3\xb0\x71\xb0\xb2\x5f\xb0\x1d\x77\xab\xbc\x87\x71\x48\x94\x70\xa1\x07\xaa\xda\xe9\xf6\x40\xc2\x4d\xfd\x53\x28\xf6\x0f\x4b\x7d"}, -{{0x70,0x94,0x16,0x07,0x49,0x97,0xb9,0xc9,0xaf,0x4d,0x37,0xa0,0x11,0x39,0xe8,0xa3,0xf9,0xf2,0xce,0x5d,0x72,0xa5,0x7d,0x80,0x5e,0x82,0x2a,0x81,0x18,0x6d,0x01,0x7e,},{0xae,0xe1,0x10,0xf1,0xf4,0xd4,0x6e,0xa6,0x06,0x49,0xd7,0x86,0xb1,0x50,0x05,0x2e,0x28,0x7a,0x9d,0xa6,0x01,0x22,0xc4,0x7b,0x09,0x08,0xfa,0x8b,0x2c,0xa2,0x8a,0x80,},{0x8e,0x4b,0x41,0xf0,0x97,0xd8,0x36,0x14,0x18,0x4b,0xa7,0xf5,0x2b,0xa2,0xfd,0x9f,0x05,0x65,0xf8,0xa6,0x37,0x21,0xef,0x55,0xf9,0x31,0x62,0x82,0x6b,0x9f,0x0a,0xc0,0x70,0xc0,0xe2,0x86,0x4b,0x5f,0xfd,0x8e,0xcc,0xc1,0x8e,0xfa,0xd1,0x8b,0x2c,0xe8,0x4b,0xe5,0x7c,0x0b,0x4a,0x41,0xc5,0x2e,0x20,0xef,0x37,0x72,0x23,0x77,0xc6,0x0f,},"\xed\xda\xa3\x69\xc0\xe3\x1a\x1f\xcc\x1d\xa4\x6f\x65\x36\x24\x42\xa0\xcc\x21\xc7\xdc\xdd\x5c\xd9\x0e\x0a\x2e\xe9\xf2\x51\x10\x81\x2b\xa1\x14\x93\x1c\x86\x8a\x70\x86\x07\xac\x16\x08\x4d\x79\x71\x5d\x13\xb3\x38\xc0\x5c\x6a\xef\x73\x43\xe7\xda\xd2\x82\xf9\x6f\xe2\x81\x93\x18\x8f\x0c\xc8\x93\xc7\xdc\xe8\x05\xfd\x3a\x7c\xd2\x68\xb7\x28\x94\x16\x0b\x52\x45\xfe\xd9\xfa\x99\x43\xb7\xc8\x0a\xdb\x3c\x2d\x1a\x35\x3d\x8f\x12\xdf\x25\xa3\x1d\xde\x7f\xa3\x85\xbb\xec\x35\x1d\xa6\x6f\x15\x30\x32\xe1\x77\x56\x27\x3f\x8d\x54\xe9\xa3\xb9\xea\x25\xae\x67\xd1\xe9\xc1\x8c\xc6\x8b\xe6\x01\xe3\xd6\x82\x82\x81\x8c\xe0\xe7\xcf\x88\xa4\xd1\x33\x64\x53\x02\x17\x32\xf0\x8d\x9e\x76\xcd\x23\x63\x79\x29\xb0\x91\x1d\x5f\x86\x14\xf4\x84\x2e\x67\x0c\x14\x28\x60\xaf\xc2\x65\xc5\x01\x72\xb1\x3b\xfd\x35\xad\x8f\xc5\x4b\x28\x65\x7d\xa3\x2b\xac\x15\x3b\xa9\xaf\xfc\x89\x7a\xfb\x3c\x72\x1f\x48\xca\xa4\x62\x40\x58\x57\x10\xb0\xf2\xd2\x4d\x5f\xf4\x96\x5d\x1d\x10\xf1\xa0\x7b\x06\xab\xea\x6a\x08\xe1\xd6\xf1\x50\x0d\xa1\x2c\x43\x4a\x6d\x77\x8c\x94\x10\x67\x10\x80\x00\x47\x5c\xe8\x31\xbc\xfe\x2d\x0a\xfe\x40\xb7\x41\x9d\x07\x05\x9b\xc0\xcd\x8d\xce\x4b\xe9\x58\x7f\xf2\x9a\xd8\xbf\x0b\x26\x8a\xe2\x3c\xe0\xda\x5b\xb5\xbf\x74\xff\x0b\x2b\x31\xb8\x21\x12\xa9\xfd\x5a\xbd\x9b\xfd\x0a\x90\xe6\xf4\x72\x35\x48\xc6\xbb\x2f\x99\xdc\x06\x1b\xa3\x2e\xba\x2d\x53\xe6\xbc\x79\xbf\x44\x1b\x23\xfb\x74\x60\xde\x04\xe8\xe8\xef\xbc\xd4\xd4\xcc\x73\x55\xde\x9e\x3b\x08\x61\xa6\x81\xb9\x83\x83\x9d\x44\x88\xe5\x51\x75\x1f\x23\xe9\xa6\xe2\xe4\xd4\x43\x27\x3b\x9e\x0f\xe6\x4d\x8a\xcd\x1c\x74\x8b\x55\x59\x43\x82\x23\xdd\x21\xb5\x18\x31\x89\xe0\xf3\xc0\xe8\xed\x41\x4c\x03\x56\xba\xb7\x7a\x65\x4d\xe1\xa5\x77\x14\x62\xef\x14\x34\x49\x70\xa4\x91\x51\x1a\x72\x29\x14\xf4\xa8\x9f\x4f\x1a\x82\x7e\x18\xcd\x84\x47\x9c\xc9\x25\x92\xea\xdf\x8d\xe2\xdf\x82\x4b\x97\x6d\xcb\xd2\x84\xa3\xba\x64\xbc\xdb\x0d\xf1\x5e\x8f\x41\xc0\xb2\x47\x15\x86\xb2\x6a\x06\x35\x3d\x90\x50\x28\x23\x5c\x1c\x6e\x5c\x45\x87\x22\x27\x25\xaf\x08\x3e\x11\xe7\x9c\x94\x3a\xa4\x44\xd4\xaa\x41\x21\x8d\x3e\x97\x43\x36\xe3\x72\x81\x3e\x99\xe2\xb0\xc5\xf0\xae\x81\x0f\xfe\xd9\xa7\xa3\xd6\xcb\x74\xc5\x47\x3d\x99\x0a\x59\x11\x32\x9b\x8e\x82\xec\x6b\xf2\xbd\x43\x21\xbb\x48\x73\x70\xf8\x73\x9e\x7a\x2a\x4a\x53\x43\x08\x33\xd4\x5b\x9f\xe3\xde\xb9\x3f\x79\xfc\x6a\x51\xd5\x63\x69\x5e\xcd\xb9\x78\x58\xd2\x13\xda\x58\x44\x34\xb7\xc7\x15\x46\xaa\xe8\xd9\x67\xe1\xc6\xd0\x08\x2b\x10\xd4\xa7\x2d\xe1\x74\x2e\x53\xc4\xb2\xf9\x2e\xb8\xb5\xc8\xc3\x5a\xb6\x53\x5e\xa8\x10\x0b\x37\x92\x4a\x0a\x91\xd2\xa7\x28\xd0\xf5\x64\x24\x37\xaa\x66\xc8\x2a\xb7\x4b\x5d\x07\x45\xec\x08\xf7\x70\x5c\xb8\x1f\xa0\x79\xd8\x9e\xcd\xc9\xaa\x1f\x8d\x7d\x82\xdc\x77\x46\xd3\x46\x15\x34\x3a\x69\x25\xdc\x31\x8f\x35\x2a\x2b\x45\x01\x24\x38\x42\x4f\x90\x98\xfd\xdf\x6e\x61\xfd\x1f\x8f\xb4\x9d\xa4\x0b\x3e\xec\xe8\x9a\x1a\xf1\x99\x6d\xe7\x0c\xd1\x69\x6c\xbf\xd9\xe3\x01\xea\x5f\x44\x37\xc7\x1a\xc2\xa0\x32\x25\x4c\x14\x0a\x90\xe8\x5f\xb8\xff\xc4\x66\x7f\xa1\x39\xc1\xee\x9b\xbf\x12\xee\xd9\x06\xa9\x67\xbc\x09\x21"}, -{{0x3d,0xcb,0x7a,0xe7,0xd9,0xf0,0xf1,0x41,0xf1,0xd9,0xf0,0x78,0x83,0x63,0x5b,0x91,0x3e,0xd2,0x9f,0xb6,0x1d,0x0f,0x74,0x1c,0x9a,0xfd,0x05,0xa2,0x7b,0x04,0x5b,0x06,},{0xae,0x62,0xb7,0xee,0x1b,0x8d,0xb5,0x76,0x4d,0xaf,0xdd,0xd9,0x72,0x4a,0xcc,0x10,0x6d,0x6c,0x0a,0x4d,0x1e,0x85,0xd8,0x90,0x6f,0x75,0x84,0xb5,0x58,0xf5,0x77,0xdf,},{0x09,0xa1,0xe6,0xfe,0xdf,0x97,0x1b,0x3e,0xdb,0xfa,0xef,0xbe,0xb8,0x9a,0xa5,0x39,0xca,0x0b,0x02,0xb3,0x7e,0x7a,0xc4,0xea,0x89,0x20,0xd6,0xd4,0x34,0x8e,0xe0,0xcf,0x9a,0x2d,0x5e,0x96,0xfc,0xe5,0x17,0xc6,0x65,0xe7,0xc3,0x83,0x68,0xba,0xf2,0x49,0x79,0x24,0x9a,0x95,0xb7,0x0e,0xa7,0x43,0x6c,0x00,0x78,0x5f,0x16,0xa3,0xae,0x09,},"\x38\x11\x6a\x57\x26\x69\x07\x0d\xd5\x86\x32\x18\xc9\x1a\x77\xa4\xab\x47\x55\x36\x88\x48\x8c\x79\x28\x38\x50\x9e\x9a\xba\x25\x06\x7a\xdb\x7e\xa4\x24\x98\x48\x00\x9d\x91\x4a\xe9\x87\xa6\x03\x23\x48\xc1\xc0\x68\x1c\xf9\x77\xa9\x55\x2d\xd6\xbb\xf4\xe6\xff\x32\xac\xc9\xfa\x61\xcb\xee\x25\xa3\x93\x07\x65\x0f\x8b\xa6\xa7\xce\x42\x1e\xf2\xf7\x1b\xcc\xc0\x95\x81\x38\xf9\x32\x4c\x86\xbf\x2e\x52\x8f\xa3\xe4\xd1\xb1\x9f\x9f\x2c\xa5\x26\x84\x09\xb8\xcc\x19\xc6\x2d\xd9\x79\xb8\x96\x97\xe4\x57\xed\x2d\x98\xbd\x20\x96\xf6\x2d\x3d\x9e\x24\x73\x88\x79\x59\x27\x80\x3e\x79\xab\x71\xd4\xf7\x2f\x56\x8e\x94\x5a\x8a\x16\x21\x59\xd9\xb8\x48\x36\xe4\x58\x56\x44\xd4\x97\x9f\x61\x4a\xad\xa7\x3a\xd4\x13\xa8\x33\x91\xe9\xcf\x88\x0c\x42\xac\x2a\x98\x34\x3b\x6a\x82\xcd\x2b\x61\x58\x14\x56\xf6\xde\x5c\xeb\x24\xfe\x46\xb7\x62\x5d\x52\xab\x2c\x2c\x32\x4a\xc7\x47\x03\xd1\x5e\x15\xf1\xae\xff\x80\x55\xd2\xf7\x39\xf7\x36\x3e\x16\xec\x1d\x78\xbe\x2c\x62\x99\x43\x6c\x8c\x8d\x33\x6b\xd2\x92\x71\xa8\x97\xa6\xec\x93\x2e\xd0\x87\x25\xbe\x21\xb2\x8f\x9a\xa1\x4e\xaf\x4f\x71\x85\x31\x54\xdb\x14\x58\x7c\x93\x0a\xb3\xeb\x02\x27\xad\x7f\xfb\x45\xb3\xba\xa6\xa9\x99\x49\x9c\xc8\xa6\xe4\x5b\x1a\xb4\xd0\xb3\x39\x78\x2b\xcd\x9c\xfb\xcf\x88\xcf\x7e\xae\x89\x1c\xc8\x41\xe9\xc8\x8a\x1f\x6a\x69\x1f\x39\x48\xa6\xbc\x85\xba\x7f\x46\x11\x64\x2e\x84\x22\x3c\x3b\x17\x89\x46\xdd\xbe\xdd\xcf\xcd\xef\x4a\xe4\xc4\xe1\xa8\x14\xb9\xb1\xf0\x2b\x1e\xaa\x82\x4d\xb9\x3f\x44\xb2\x7d\x14\x20\x6b\x34\x04\x65\xa1\xce\xfc\xf5\x35\xc6\x3e\x55\xc4\x28\x72\x24\x26\x27\x33\xd9\x8a\xaa\xa1\x54\xf3\xad\x42\xcd\x85\x46\xa4\x61\xce\x0d\x46\xd8\x86\xd3\x46\x1a\x21\x50\xcb\x45\xdb\xe5\x64\x73\xff\x63\xd3\xdc\x7a\x2b\x95\x7b\x82\x39\x69\xf1\x9b\x59\x68\xe8\xb4\x24\xc8\x79\x74\x19\x26\xd8\x2c\x63\x86\x75\x3b\x0f\xa1\xf0\x80\x28\x4e\x55\x78\x94\x23\x63\xaa\xde\xb2\x1f\x8e\x1e\x89\x09\xfa\x6c\x38\x07\x64\x14\x9b\xc9\x15\xb2\x28\x60\x4e\xfc\x56\xd9\x2e\x4b\xeb\x72\x0e\xdc\x74\xc4\xd7\x8f\x92\x5d\x6c\xfd\xf7\xba\x2f\x14\xb5\x62\x37\x75\x81\x0d\x2d\x07\xbd\x38\x8c\x57\x3e\x36\x52\x3f\x21\x57\x38\xe6\x91\x14\xdc\xf8\xd8\x0f\x17\x0b\xfa\x67\x6e\x31\xfb\x62\x6a\x7d\x44\x9e\xd9\x66\x47\x36\x34\x75\x97\x0c\x8c\x47\x80\x97\x09\xbc\xb5\xe7\x20\x0f\x2a\x22\x7c\x7c\x8e\x7b\x00\x0f\x30\xc0\xbd\xe6\x1d\x67\xbd\x68\x95\x36\x16\x29\xa3\x6c\x8f\xdd\x5a\x56\xb8\x1e\xfb\xac\xf1\x5c\x1b\x35\x30\xa0\x8c\xde\xd5\xb1\xfd\x45\x7f\xbd\x2f\x03\x04\x2f\x56\xf1\xb3\x7e\xd1\x5c\xdb\x91\x2f\xa0\x29\x8c\x27\x67\x25\x08\x7e\xe2\x7d\x3c\xf2\x55\x0f\xe6\xe8\xa0\x33\x0a\xf4\x17\xf4\xf5\xba\xf0\x36\x27\xed\x67\xc5\xf8\x32\x33\x63\xab\xac\x5a\x1f\xe3\x48\x23\x18\x0e\x3e\x0e\x20\x80\xf7\x5b\xfd\x91\xc2\x07\xcf\x6b\xaa\x9a\x22\x9c\xf4\x43\xdd\x44\x2c\x59\x02\xe0\x67\x3f\x32\x52\xb8\x52\x63\x46\x58\x58\x72\xf6\xcd\x36\x60\x25\xa5\x69\x92\xb7\x0e\xde\x39\xbc\x8d\x32\x2f\x9c\x22\xa1\xdc\x59\x9e\x9f\x0d\x52\x4c\xb6\xd2\xea\x5a\xe2\x87\x8e\xf6\xbe\xd4\xb7\x02\x80\x7f\x1e\x1e\x73\xeb\xf2\x90\xeb\x6c\x0e\xeb\x85\xc1\x37\x16\xf6\x26\xaa\x90\xd3\x64\xb4\x90\x48\x37\xce\x05"}, -{{0x29,0x73,0x11,0xdd,0xef,0xfe,0xc9,0xd2,0xbe,0x68,0xef,0x7b,0x2a,0x20,0xfe,0x2d,0x27,0x7e,0x1d,0x8e,0x51,0x64,0x8b,0x03,0x57,0x2a,0xda,0x27,0xec,0x1f,0x9f,0x43,},{0x6a,0x6c,0x28,0xe7,0x61,0x64,0x0c,0x40,0x08,0x33,0x3a,0xae,0x5a,0x33,0x66,0x30,0x2e,0x2f,0x46,0x77,0xa9,0x53,0xba,0x48,0x2a,0xb6,0xfb,0x4a,0x1d,0x70,0xb4,0x47,},{0x4b,0xf0,0xb9,0x2c,0x6e,0xe4,0xea,0xce,0x5e,0x8e,0xb1,0x03,0x70,0xff,0x9d,0x9c,0x68,0xa5,0x74,0x9d,0x59,0x89,0x9d,0x04,0x32,0x7a,0xaa,0x38,0xf8,0xf8,0x25,0xe0,0x32,0xe5,0x97,0x42,0xb3,0x7d,0xe2,0x31,0x07,0xa3,0xec,0xdd,0x3f,0x7a,0x0d,0x08,0x12,0x26,0x14,0xb7,0x8f,0xdd,0x37,0x29,0x3c,0x8d,0x05,0xe2,0x8f,0x5f,0x71,0x08,},"\x26\x52\xac\xfc\x3b\xdf\x09\xa5\x99\xec\x67\x86\xbb\xd9\x4f\xe5\x77\xcf\x57\x8e\x02\x63\xcc\x68\xd9\xf5\x7a\x6c\x83\x45\x8f\x80\xac\xd8\xa7\x5e\xf0\x30\x40\xa6\x35\x67\x2b\x96\x8f\xf2\xaf\xdb\x28\x8d\x28\xb9\x99\x6f\x64\x15\xb2\xf3\x17\x5e\x9e\xa3\x7a\xeb\x05\xdf\x81\x81\x2e\x38\xa4\xc9\x76\xeb\x92\x85\x6c\xed\xb9\x1a\x26\x9a\x46\xfc\xa5\xdf\x9b\xd7\x30\xfd\x84\x45\x2b\x4b\xd9\x35\x77\xc6\x1f\x42\xc1\x41\x13\x97\x98\x82\xa8\x6a\x9f\xe6\x32\xe4\x75\x6a\xfd\x89\x81\x6f\xc4\x67\x0a\x31\x05\x03\xfd\xaa\xd2\xdb\x76\x4c\x37\x21\x21\x3c\x3e\x60\xf2\x9c\x26\x68\xd4\xde\x8f\x42\xb0\x87\xf2\x5c\xd5\x6c\x69\xa4\xe4\x8f\x13\x4f\x55\x98\xcf\x14\x5b\xe6\x38\xa5\xc2\x31\x88\x63\x32\x90\x61\x72\x9a\xac\x91\xda\x6a\x19\x1f\xd7\x74\x88\x0c\xf9\xcb\x55\x5e\xec\x15\xb0\x04\x4f\x10\xe5\x43\x3f\xb4\x6a\x9b\x88\x92\xda\x8f\x6d\x24\xf1\x42\x58\x8b\x70\xff\x0b\x49\x20\x0c\x50\x6b\x88\xbe\xd4\x49\xad\x10\xd3\xf9\x2c\x2b\xae\xda\x6b\xbf\x58\x67\x6c\x5b\xbc\x67\xd3\x1f\x64\xfb\x12\xe8\xd5\xe7\x88\x76\xd5\xc8\x49\xfc\x31\x4b\x2c\xf8\x01\x0c\x51\x02\x04\xc8\x63\x3d\x0c\xc3\x18\x56\xec\x6a\x11\x4e\xa8\xa8\x9c\x48\x92\x7b\x07\xa3\x1a\xb8\x42\xc9\xb8\x35\x2d\x93\x67\x34\x51\x41\xa9\x9b\x40\x04\x9d\x5c\x48\xe7\xd2\x7c\xab\x42\x7a\xde\xfd\x1f\x0f\xc1\x13\x6b\x35\x3c\xb0\x1c\x3d\xef\x91\xff\xfe\xe8\xad\x91\xe8\x8f\x4b\xb7\xd2\x61\x5c\x0d\xcc\x95\x34\x4c\xd0\x19\x50\x93\x8e\xcb\x14\xb8\x44\x6b\x56\xa0\x6b\xf2\xf2\xf6\x5f\xb8\x73\x5e\x8a\x7b\xc9\x6b\xb4\x6c\xe9\xca\xc7\x1a\x88\xeb\x8f\xda\x5e\x69\xd6\x9e\xb2\x9a\xa4\x2a\x01\x6b\x85\x83\x89\x3e\x9d\x72\x77\xcb\x13\x59\xc5\x68\x7e\xed\xcd\x59\x9d\x8a\x46\xe6\xc1\x49\x63\x63\x7d\xb0\x4a\x92\x9f\x4b\xc7\x93\x04\xac\x2d\xae\x73\x3b\x3a\x83\x9e\xb7\x4f\xbe\x3d\xe5\x04\x2f\xd6\x55\xea\xec\xb1\x5f\x39\xb2\xfe\x16\xda\xd8\xa6\xff\x8d\xbc\x05\x4f\xed\x51\x28\x2a\x85\x6e\x9d\xa6\x31\x6f\xac\x6d\xb5\xd5\x6f\x77\xf1\x8d\xa8\x41\x2e\xb3\x77\xe5\xb1\xb8\xf4\xcb\x13\x54\xec\xfe\x8f\xe8\xfd\x54\xe6\x2d\x76\x7a\x80\xde\x04\xcb\x76\x20\x22\x9a\x88\x31\xdb\xc9\xec\xd4\x57\x8f\xfa\x2f\xf0\x6b\x54\x45\xe4\x40\xd6\x9a\xab\xc9\x4c\x47\xbd\x17\xf2\x2b\x69\xf5\x2e\xea\xe5\xcf\xcd\x01\xa5\xca\xfe\x05\x80\x07\x2a\xe9\x16\x6b\x95\x74\x3d\x68\xc3\x56\x4c\x5a\x7e\x46\xf2\x4b\xc4\x8a\x89\x8a\x1a\xb2\xeb\xe6\x3f\x36\x85\x1d\x2a\xac\xfa\x0c\x4f\x32\xd9\x93\x77\x1d\x31\x4e\x72\x5a\x43\xd9\x80\x5d\x13\x71\xcf\x72\x3e\xf1\x61\xd4\x2e\x63\xff\xca\x68\x8d\x7f\x0e\x21\xef\x5b\x3f\x9a\x56\x1a\x62\x10\x70\x2b\x85\xfb\xd1\xf8\xca\x75\x38\x9c\xc7\xa2\x27\x39\xba\xe4\xde\xd9\x37\x57\xf1\x52\x0d\xc3\x88\x44\xa1\xa8\x8b\xe8\xe0\x96\x45\x05\x91\x48\x80\x7b\x93\x37\x70\x87\x8c\xb8\xa9\xad\x92\x11\x31\x71\x31\xe6\x93\x24\x53\x2f\xd0\x27\x9b\x83\x18\x5b\x62\x8f\xc2\xf9\xe2\x15\x00\x38\x46\x93\xfa\x29\xf2\x6b\xd1\xb9\xc3\x01\x60\x13\x67\x66\x5f\x05\xf3\x72\xda\xb4\xe3\x10\x77\x26\xcd\x3f\x63\x9c\xa6\x2b\xf6\x3a\x75\xf7\x7e\xaa\x75\xf7\x13\x61\x57\xad\xa2\x37\x4e\x65\xfb\x4f\xd3\x49\xb4\x5e\x25\x44\x1f\xd2\x1b\x13\xe6\x91\x13\x66\xb9\x7c\xfb\x4d\x6a\xd5\x22\xb8\x50\xad\xf4\x0c"}, -{{0x4d,0xb2,0xb5,0x81,0x44,0xa8,0xd2,0xd0,0xec,0x03,0xbb,0x9b,0xc2,0x9b,0x4c,0xa8,0x93,0x85,0x4c,0x80,0xb6,0x4a,0xfa,0x4a,0xf7,0xa9,0xc9,0x36,0x93,0x5e,0xcb,0x04,},{0xfc,0x5c,0xd7,0x50,0xe1,0x74,0xed,0x71,0x8b,0xd9,0x38,0xfa,0x8e,0xd9,0x9a,0x1b,0x9d,0x55,0x6b,0xa7,0x67,0x0f,0x2a,0x77,0xda,0xf1,0xc7,0x20,0x11,0x37,0x32,0xa5,},{0x42,0x45,0x17,0xaa,0xdd,0x85,0x3c,0xe3,0x98,0x57,0x59,0xa3,0x27,0xe7,0x76,0x0d,0x91,0x56,0xd3,0xb2,0x73,0x45,0x38,0x3f,0x0e,0x4a,0xd6,0x66,0x1e,0xe4,0xa3,0x72,0x4d,0x18,0xd8,0x20,0xf6,0xc5,0x57,0xf8,0x27,0x97,0xbe,0xb6,0x2d,0x2f,0x08,0x54,0x33,0x74,0x4f,0x89,0xa2,0xd8,0x52,0x93,0x79,0x64,0x81,0x86,0x2e,0xf8,0xa4,0x0f,},"\xc8\xd1\xdb\xc9\x36\x91\x1e\x12\x2c\xee\x18\xf9\x2b\x16\xa3\x9a\x2e\xef\x08\x23\xb2\x27\xf8\x98\xcd\xf5\x84\x2b\x93\xd5\x9f\xc0\x02\xed\xb5\x49\x8a\x20\x87\x2e\x19\x55\x4e\xf7\x39\x99\xeb\x3a\x7b\x3e\x2f\xdd\x90\x70\xe1\xef\xa9\x22\x8e\x9e\x93\xb2\x9a\x86\x8a\xe3\x79\x9e\x4e\x57\x23\x24\x83\x6b\x1a\xd5\xaa\x81\x2b\xf0\x0f\x84\x5b\xc2\x17\xeb\xbc\x3f\xab\xdc\x4e\x1b\x6e\x51\xef\x9e\xfa\xc2\x77\x0a\xa0\xa4\xa1\x1e\xe5\x2a\xb9\x56\xac\x64\x48\xaa\x26\x29\xcb\x61\xdb\xb1\xf1\xed\xb3\xbd\xe9\x9b\x48\x76\xda\x39\x2a\x6e\x0b\x9a\x0c\x31\x84\x9a\x58\x90\xae\xa9\x52\x2f\x56\xd0\x15\xa1\x93\x50\x15\xb9\x1b\xf4\xc6\xa0\x01\x1d\x23\x77\xd6\x71\xc3\xd0\xd7\x53\xc2\x7f\x8c\x76\xe4\x05\xd0\x23\x0f\x1f\x4b\x9b\x88\xfc\xeb\xba\x1e\xaf\x13\x77\x72\x35\xe5\x53\x24\xb7\xd3\xf8\x1e\x68\x61\x09\xd9\x1c\xe6\x89\x53\x0b\x90\xd2\xc5\xc7\x1d\xd1\x87\x72\xb3\x85\xd6\x2c\xcb\xfd\x2e\x08\x9a\x1b\x67\x09\x83\xf6\x0c\x21\xc4\x45\x5c\xb9\xd1\xa0\xdc\xaa\x74\xc8\x74\xe3\x52\x11\xf8\x22\x7f\xf7\xc2\x34\xdf\xf8\x5e\xc0\xb0\x7e\x36\x8c\xfa\x50\xa3\x43\x57\x83\x95\xa1\x4c\x68\xf1\xf8\x9b\xd4\xec\xbc\x17\x2e\xf8\x05\xe5\x83\x1e\xc8\x94\x75\xfc\xc8\xd6\x85\xca\x92\x55\xa7\x7e\x3b\xa3\xc1\x47\x50\x8e\xc9\x2d\x7b\xcc\xe8\x79\xaf\x0a\xbd\xd2\x41\x6b\x67\xb5\xf5\x05\x07\x33\x79\x14\xf3\x90\xbb\xe0\xb4\x50\xb6\xa2\xf1\x15\x93\x72\xc4\xbc\xce\xa3\x82\xce\x3d\x6d\x9f\xb2\x51\x5e\xcf\x79\x30\x05\x9a\x05\x52\xb7\x5f\x97\x88\x62\xbf\x97\xe8\x32\x5a\xf2\x4d\x1b\x8c\xe9\x51\x2b\xfc\x7c\xef\x88\x42\x32\x04\x23\x41\xd8\x2f\x9b\x5d\xad\x2e\x50\x2a\xc6\xac\x79\x5f\x99\xda\xc7\xfc\x60\xe3\xb8\x63\x9d\x0e\x15\x00\xde\xad\x4e\x78\xac\xa1\x09\x95\x7d\x57\x7a\x13\xc1\x92\x5d\x74\x03\xc1\xac\xf9\x89\xa9\xde\x67\x11\xe2\x3c\x67\xbf\x87\x22\xf5\x51\xb7\x74\xca\xda\x93\x1b\x5f\xd9\x73\x43\x4e\x3b\x71\x72\x81\x98\x83\xe7\x0c\x52\x78\x5e\x3b\x49\xd3\x23\xd0\x56\x36\x64\x11\x58\x64\x0d\xcf\x6a\x4c\x20\x0e\xb2\xc1\x3b\x1b\xee\xb2\xdc\x36\x03\x52\x47\x0d\x15\x38\x6e\x59\xe6\xfa\x60\x36\x7e\x5e\x7f\x17\x2b\x21\x15\x9d\x5e\xe7\xca\xb0\xd7\xf5\x86\x82\x39\x85\x8e\x2a\x93\x55\x04\x80\xfe\x8f\xb4\xdc\xaf\x4f\x22\x4c\x4b\x2a\xd5\x44\x87\x91\x63\x2d\xf3\x0e\x8e\x5f\xb9\x98\xb3\x5e\xa9\xae\xc8\xc9\x34\xa4\x40\x3a\xef\x82\x18\x7c\xa1\xab\xf8\x2a\x34\x4d\x00\xff\xb9\x93\xd9\xff\x34\x61\xd6\xfe\xcd\xaf\x5d\x3b\x48\x1e\x0d\x31\x15\x3d\xbf\x6a\xed\x28\x8c\x8a\xdd\x06\x4e\x83\x31\x55\x01\x41\xbd\x5f\x7a\x7e\x04\x7b\x86\x07\xd8\x46\xa6\xbf\xb7\x2d\x68\x34\x46\xa4\x45\x11\x46\x06\x25\x0d\x8d\x2d\x3a\x8b\x95\x08\xbb\x07\xd4\x62\x3c\xdf\x17\x88\xb5\x49\x9e\x9c\xb9\xa1\x37\x98\x49\xbf\xa1\x9c\x9a\x9f\x4c\xd3\xd9\x25\x3a\xdf\xfd\xa2\x5f\x47\xc8\x11\xbe\x83\x3b\x02\xf3\x32\x7e\xbb\xa8\x37\x30\x19\x5d\x61\x4b\xae\x6f\xe4\xe7\xa3\x83\x08\x15\xd2\xaf\x40\x0d\x20\xa9\x41\x7a\x09\x5e\x7e\x8e\xea\x10\x44\x91\x7c\xbe\x51\x2c\x40\x18\xd6\x56\xe2\xdb\x67\xbb\x98\x9c\x00\xe1\xe5\x07\x62\x3e\x82\x78\xd7\x29\x92\x5b\x84\xfb\x5c\x18\x6a\x7b\xac\x18\x9e\x6d\x6a\xb1\x4f\xd7\xb6\x2f\xdc\x63\x2b\xeb\xb5\xf7\x7c\xb5\xcc\x2f\x70\x7d\xf4\x05\x30\x99"}, -{{0xc8,0x20,0x41,0x3c,0x24,0x56,0x74,0x71,0x04,0x66,0x2e,0xf4,0xdf,0xf3,0xac,0x23,0x3a,0xc4,0xb9,0x1a,0x76,0xd3,0xc4,0xea,0x75,0x44,0x90,0xbc,0x9b,0x1e,0x29,0x1f,},{0x89,0x93,0xce,0xa2,0xf7,0xf2,0x80,0x6c,0x77,0xb3,0x98,0x1b,0x54,0xbf,0xa9,0xbf,0x17,0x62,0x15,0x1b,0x41,0x8e,0x5e,0x72,0x53,0x71,0xca,0x2c,0x04,0xd2,0x23,0xee,},{0x7e,0xf7,0x0e,0x4a,0x14,0x95,0x4d,0x50,0x9f,0x11,0x7f,0x4b,0xd0,0x1b,0x22,0x0b,0xcc,0x19,0x2d,0x3b,0x5f,0xdf,0xc3,0x48,0x2f,0xbb,0xc3,0xb6,0x9d,0xc0,0x68,0xa7,0xc4,0x76,0x1d,0x1b,0xeb,0xc2,0x31,0x7d,0x6d,0xb7,0x4f,0x90,0x6a,0x15,0x56,0x42,0xb0,0xa3,0xc6,0x59,0x2b,0xdc,0x72,0xe6,0x4e,0xac,0x6f,0x20,0x3f,0xb7,0x4e,0x02,},"\xd2\x99\x2f\x83\x92\x4a\x59\x48\x87\xe6\xef\x13\xf2\xae\x80\x8f\xc8\x63\x9c\x7b\x2c\x99\x4f\xaf\x0f\x79\x5e\x36\x01\x6d\xab\x77\x00\xa0\xee\x53\x01\x70\xf0\xb9\xfe\x98\xab\x75\x88\xce\x03\xbc\x50\xc2\xba\xe6\x5e\x05\x26\x47\xe7\x56\x73\x5b\x35\xd0\xb5\x9c\x96\x4e\x91\x7d\x8c\x83\xe2\xf9\xfe\xcc\x4c\xb0\x55\x64\x28\x7f\x0e\x34\xc9\x49\x40\x05\xe2\x5b\x1a\x8b\x1b\x94\x2b\x54\xd8\x90\x35\xf1\xb1\xc3\xc9\x45\xfc\xc8\x4e\x4a\x39\xef\xa2\xca\x50\x95\x9b\x45\x9a\xf7\x4d\x21\xb6\x24\x2e\x2f\x56\x51\x8f\x70\xe8\x67\x92\x57\xc0\x89\xd2\x6c\x3b\xb7\x92\x68\x7c\x92\x33\x55\xb2\xc1\x8e\xe2\x13\x6d\x40\xcb\xa4\x5a\xcb\x64\x24\x0d\x96\x67\xf3\x9d\xba\x36\x39\xb6\x51\x6d\x4c\x49\x47\x57\x3e\xf4\xce\xd8\x76\xb5\xb2\xea\x34\x89\xea\xea\x53\x9f\x55\x7f\x58\xda\x20\x46\x91\xa7\x6e\x29\xc9\x4b\x8b\x05\x38\x23\x2c\x5f\x7d\x0b\xb0\xfd\xd0\x16\x91\x04\x31\x35\x4b\x3e\x1e\x7c\xe6\x2a\xd4\x36\x91\x7c\xd5\xc3\x15\xa5\xbe\x9b\x97\x1c\x80\xf9\x7b\xc9\xd5\xc1\x56\xff\xd6\x4f\xd4\xe3\x1d\xa5\x60\x83\xe0\x2a\x0c\x8f\xce\x55\x4d\xb6\x86\x74\xcb\x62\x70\x0b\xa9\x51\x75\x2b\x82\x9b\x03\xc5\x42\x32\x74\x12\xee\xc9\xcc\xc6\xa5\x0a\xdf\x47\xbb\xee\x15\x44\x66\x82\xda\x2f\xea\x42\x04\x89\x36\xd7\x63\x06\x0c\xd8\xf5\x39\x65\x26\x16\xdf\xa8\x08\xd6\x23\xff\x77\x7b\x41\x13\x65\x2e\x78\x9e\xc0\x25\xb8\x5e\x04\xef\xe8\xad\x4c\x96\x0b\x19\x0b\xf4\xa5\xa6\x32\x4d\x6f\x57\xc1\xad\x22\x01\x8c\x83\xcd\x7e\x7e\x09\x7f\xc6\x7b\x80\x26\x9c\x13\xb4\xdd\x97\x01\xca\x98\xf9\x87\x69\x58\xba\x76\x89\xc6\xf6\xf1\x0a\x73\x2a\x64\xbe\xf2\x2e\x8b\x98\xbd\x30\x4d\x5d\xbf\x4f\xb1\xf9\xe4\xca\x53\x9a\x5c\x4a\xa6\x19\xc4\x4d\x6f\x58\xf8\x24\xb2\xdb\xae\x77\xb7\xe8\x3b\x56\xdb\x5e\x5a\xa7\xb0\xae\x9c\xe1\xcd\x10\xa6\x9f\x04\xa8\x0f\x13\x79\xeb\x0c\x47\x4e\x47\x82\xdf\x0e\x3b\xa6\xa1\x48\x22\x6b\xd1\xa6\x62\xd9\x5e\xe2\xd6\x7c\x52\x07\x33\x3c\xb1\xd5\x41\x76\xd9\xe5\x06\x45\x94\x79\x02\x9f\x31\xdc\xac\xe2\x69\x93\x8f\x6b\xc5\x62\x78\x78\x41\xdc\xfe\x10\x1f\x4d\xb6\x0b\xd6\x60\x16\xe1\xee\xbb\x6b\xfb\xd9\xcd\x83\x04\x2d\xd1\x37\x9a\x46\x4f\x40\x5a\xaa\xe3\xc1\x18\x07\x84\x8c\xc4\xf9\x5c\x3c\xc6\xfa\x92\xab\x4e\xa5\x30\x58\x34\xeb\x86\xb8\x73\xfa\x30\xed\x1f\x7f\x47\x0b\xf6\x63\xf1\xa7\x0c\xf9\xe6\x0a\xb6\x80\xcd\x1d\xbb\xd0\x3a\xc0\x43\x3b\x3d\x4b\xb4\x82\xf8\xb3\x44\xd4\x6b\x3a\xa9\x34\xb8\x63\x3f\x57\x09\x0b\xea\x5f\xcc\xca\x64\x88\x79\x98\x35\xf1\x33\xf8\xbc\xf6\xe8\x87\xca\x59\xd1\x90\x76\xd6\xca\x19\xd4\xe2\x83\x49\x05\x1e\x01\x6b\x03\xe9\xa9\x20\xf4\x12\x0f\xb5\x23\xd1\x37\x1d\x0e\x38\x46\x73\x19\x54\x3f\x12\x7e\xd9\x14\xb4\x3a\xd0\x62\x22\x6a\x53\x65\x82\xdb\x72\x8c\xcd\x76\xe9\x83\xf1\x17\x66\xa8\x86\x3c\x2f\x42\x4f\x65\x50\x8d\xcb\x26\xfe\x0c\x5a\x80\x0c\x35\x09\x39\x60\xa1\x21\x97\x6e\x30\x51\xe2\xef\x1a\x2a\x99\xc1\x2f\xb7\xbd\x8b\xc0\x37\xa4\x39\x68\x68\x06\xeb\x72\x01\x7a\x07\x1a\x91\xb3\xe3\x9c\x90\xe8\x6b\xc3\x35\xf9\xbb\x54\x3b\x12\x7c\x98\x86\x73\x8c\xb5\x38\x06\xb9\xcb\x3c\x25\x94\xc7\xef\xfc\x2a\x59\x20\xaa\x83\x4b\xe6\x5c\x49\xf4\x79\x64\xe8\x9e\xec\x74\x72\x8d\xe7\x71\xf3\xd6\x75\xde\x9d\x1e"}, -{{0x67,0x69,0xcc,0x8e,0x12,0x56,0x17,0xc2,0x2c,0xe5,0x72,0x37,0xa4,0xfc,0xa1,0x50,0x7f,0x94,0x12,0x34,0x66,0x1d,0xf7,0x43,0x28,0xd0,0x4a,0xb6,0x2e,0xf8,0x6c,0x47,},{0x05,0x11,0x2c,0xa6,0x0b,0xaf,0xf7,0x9b,0x49,0x16,0xc1,0xbe,0xe2,0xb9,0x39,0x0c,0x04,0x7a,0xf0,0x8c,0x35,0xeb,0xb3,0xc3,0x81,0xb9,0x74,0x8d,0x1d,0xd4,0xc4,0xfd,},{0xd3,0x9d,0x85,0x3d,0x2c,0x2c,0x5d,0x21,0xb5,0x87,0x1e,0xa5,0xa7,0x5c,0x04,0x10,0x48,0xd9,0x3a,0x47,0xdc,0x59,0x9a,0x5f,0xdd,0xc0,0x85,0x62,0x85,0xce,0x63,0x6f,0xcd,0xfd,0x85,0x64,0x08,0x3d,0x06,0xff,0x28,0x4a,0x52,0x4b,0xc6,0x33,0xcf,0xdf,0xc3,0xb0,0x37,0x16,0x3d,0x67,0x4c,0xb9,0xbb,0x5b,0xa3,0xbc,0x25,0xbe,0xd0,0x0e,},"\x68\x54\x89\x73\x9b\x98\x56\x47\x49\x58\x7f\xf1\xac\x96\xba\x68\x2d\xa3\x0b\x40\xa4\xde\x24\xf5\x4e\xc8\xb0\x83\xdd\xa4\x53\x33\x16\x21\x67\xcb\x3f\x97\xb2\xc7\x31\x4c\xe7\xa3\xf3\xf3\xd3\x19\xcc\xc3\x5b\xb6\xa9\xf0\x07\x7d\x56\x31\x61\xe2\x81\x46\x9c\xf0\x89\x68\xd9\xdc\xf7\xae\x5f\xff\x83\x0a\x5d\xb0\x0b\xc3\x80\x10\xe6\x66\x2d\x49\x4f\x3c\x86\x47\xc4\xf7\x0c\xe2\xd2\x9a\x9d\xa8\x46\x10\xa0\x80\xb5\x75\x9a\x3b\x58\x20\x52\xdf\xde\x66\xe4\xa7\xfa\x5f\xb2\x7f\x06\x50\x73\xfe\x72\x3d\x83\x70\x1d\x5b\xac\x06\xca\x43\xb4\x6d\x1e\x58\x09\x76\x70\xc1\x94\xa1\x3a\xf8\xb5\x73\xa3\x79\x1a\x96\x61\x55\x7c\xbc\x04\x27\x57\xab\x8a\xdd\x0e\xf7\xcf\x4f\x35\x43\x5a\x42\x12\x35\x3f\xcb\x3c\x20\x3c\x73\xdb\xc9\xd2\x68\x52\xd0\xe9\x17\x32\xe3\x62\x1c\xe8\x28\x92\x9c\xdc\xa4\xd9\x19\x20\x48\x75\x19\x22\xed\x22\x5e\xab\x29\x00\xcf\xf9\x71\xa2\xa2\xd3\x42\x46\x36\x48\xbb\xb1\x94\x43\x19\xa8\xef\x6d\x43\xdb\x62\x48\x0f\xbf\x1d\x72\x57\xd2\x26\x94\x53\x97\x93\xf2\x5c\x92\x79\x17\xca\xab\x25\xc1\x19\x3a\x2d\x2b\x23\xbb\x5c\xb8\x56\x9a\xef\xff\x4f\x0c\xa4\x23\xd1\x9b\xbd\x46\xfc\x5e\xf7\x52\x4f\xf8\xcb\x70\x6f\xfc\x47\x07\x65\x09\xc0\x5a\x81\x58\xaf\x77\xf9\x8d\xf6\xa9\xb5\xcb\x32\x44\xab\xa4\xb5\xc5\xf9\xce\x59\x7e\x7d\x29\xba\x07\x01\x3d\xca\xc1\x91\x1b\x6d\xe7\x11\x3c\x73\x6a\x40\x05\xc4\x59\x99\x29\x79\x01\x9a\x45\xb2\xdd\x80\x2a\x07\x66\x09\x09\xeb\x4c\xe2\x05\x40\x81\x70\xd8\x25\x45\xda\xcb\xa8\x68\x6d\xbd\xe9\x27\xdb\xc9\xc7\xd9\x62\x05\x8e\x9a\x95\xea\x66\xb8\xdf\xd3\xea\x43\x53\x57\xa9\x3c\x73\x94\x8c\xd3\x55\xf6\xac\x65\x52\x32\x3f\x17\xc2\xa6\x78\x66\x2b\xc0\xe9\x72\x6a\xd5\xa5\x25\x1d\xd2\x76\x47\x40\x4c\xbf\xe6\x1c\xea\xaf\xdc\xfc\x08\xa4\x75\xff\xd8\x7c\xb7\xf5\x97\xe5\x6a\xc1\x67\x04\x09\xdd\x94\x08\xae\x47\x70\x42\x0c\x6e\x5e\x6d\xd8\xe7\x48\xfe\x03\xa7\x2d\xc1\x28\x03\xd0\x27\x71\xd9\x2f\x47\xe6\xe7\x17\xcc\xc1\x44\xfc\x03\x72\x75\xb6\xf7\x45\xdd\x30\xda\x1a\x45\xd2\x9d\xb6\xd9\x07\x3e\xee\x50\x09\xcf\xd5\x46\x27\x33\x41\x4a\x49\x5f\x34\x9d\xb0\xb6\xdb\xf2\xce\xa9\xcc\xd5\x72\x38\xed\x5e\xe9\x1a\xd8\xbc\x86\x17\x9a\xd5\x69\x5a\x85\xa5\x04\x84\xe6\x17\x75\x1d\xe5\xef\x7a\x7d\x8a\x8d\xb9\x50\xa9\x8a\x6b\x7f\x7d\xee\x9d\x42\xa5\xdf\x69\x2f\xcc\xf5\x55\xc9\x40\xdc\x39\xcf\x2e\xac\x48\xcb\x9d\x15\xcd\xa1\x4d\xd2\xa7\xec\xc0\xb7\x6e\xbe\xc6\x8a\xd4\x17\x7d\x11\x17\xe0\x77\x66\xc4\x85\x90\xd4\x3c\xa7\x66\x28\x68\xeb\x97\x90\xac\x29\xf4\xf2\x39\x2b\x9a\x93\xf8\x97\x59\xe7\xba\x54\x6b\x92\x5b\xd8\x6f\x80\x7d\x8d\x16\xc7\xe6\x37\xdc\xc6\x66\xe9\x05\x90\xbf\x43\x0d\x98\x6a\x67\xf1\xb0\xc7\xc2\xc9\x49\x30\x84\x58\x69\xed\x8d\x8a\xdd\xe1\x8f\xc1\x88\x74\x56\x88\x1b\x4b\x26\xb5\x3d\xcb\xa7\xa5\x26\xf0\xec\xa1\x4e\x8b\xb6\x89\xd6\x6f\x0a\xa1\xb2\x53\xc3\xdc\xfc\xf5\x95\x40\xd5\xd2\xf5\xad\x61\x7f\x52\xc3\x09\x38\xa5\xa9\x2e\xa3\x85\x07\x7d\x75\xaa\x4a\xc0\x7a\xfc\x2b\x35\xfb\x8c\x1d\x5e\x78\xeb\x29\x5f\xc2\x0f\xe3\x7c\x41\xac\x06\x95\x9d\x3a\x17\x97\x84\x3a\xd7\x05\x6c\x1b\x41\x2d\xd0\xb4\x80\xaa\x3b\x39\xbc\xc2\x05\x87\xd9\xa0\xfe\xf9\x2c\x6c\x95\x0e\xbc\x5b\xb8\xe1\x42"}, -{{0x1d,0xf7,0xac,0xfb,0x96,0x33,0x04,0xe5,0x1e,0xc4,0x71,0xca,0xf1,0x81,0x10,0x25,0x56,0x78,0x3c,0xb7,0xd9,0x1e,0xad,0x30,0xbd,0xc2,0x53,0x4d,0x07,0x8a,0x14,0x88,},{0x05,0xa3,0x1f,0xfc,0x70,0xe4,0xe3,0x56,0x9f,0xc2,0xbe,0x11,0x0c,0x64,0x3a,0xd5,0xf0,0x87,0x91,0x3c,0x7a,0xa4,0x76,0xdc,0xd8,0xd6,0xe4,0xbc,0x7e,0xc2,0x2d,0x24,},{0xb1,0x81,0x93,0x8d,0xe1,0x01,0x42,0xf3,0x24,0x07,0xb4,0xe7,0x86,0xcd,0xdd,0xe9,0x32,0xeb,0x11,0xdb,0xc0,0xbf,0x0e,0x5a,0xc5,0x09,0xfa,0xe7,0xa5,0xbc,0xc3,0x29,0x61,0xfe,0x34,0x48,0xf9,0x12,0xc8,0x50,0x0f,0xc6,0xdb,0x4e,0x1d,0x32,0x62,0xa8,0x3c,0x9d,0xbe,0x76,0x9b,0xb8,0xc3,0xa7,0x61,0x00,0x0f,0xe3,0x6c,0x0d,0x71,0x04,},"\xb0\xc3\xee\xb5\x7f\x14\x60\x6a\xb7\xab\xea\xb2\xee\x05\x73\x84\x3c\xa2\x2e\x6d\xb2\xfd\xf2\xc9\x06\x4c\xea\x51\x98\xdc\x58\x30\xeb\x15\x8d\xa8\xe2\xda\xa8\x88\x57\xaf\x8b\x8e\xef\xcc\xf0\xc2\x6c\x3e\xc0\xf3\x30\xe9\x2c\xff\x06\xbc\x05\xa2\x9b\xfc\x99\xf9\x40\xb6\x1f\x3c\xfb\x29\x64\xb3\x37\x09\x7a\x65\x50\xa3\xe9\xa3\x28\xc8\x5b\xe6\xf1\x60\xd2\xc0\xa5\x7f\xf6\xf1\xb3\xc5\xff\xcc\xa8\x90\x89\x42\x5a\xb6\xbe\x01\x72\xe1\x75\xba\xf4\x0c\xf1\x2b\x24\xa8\x15\xf7\x0f\x29\xa3\xa4\xcd\x0a\x6a\x13\x2f\x12\x00\x97\x75\x2f\x4b\xc7\x43\xed\xe0\x8f\x5f\x21\xd4\x2f\x28\x2f\x76\x71\xf7\x78\x3e\x27\xb2\xa8\xe2\xc1\x46\x92\xf1\xe0\xe5\xde\x82\x85\x5d\xab\xf9\x8a\x1a\x63\x97\x60\x06\xff\xbf\xe5\xf5\xa5\x79\xb4\x60\xe2\x6d\x06\xbd\x54\x28\x42\xa5\xf9\x26\x1b\xbf\x26\x04\x51\xd2\x32\x1c\x50\x89\x32\x01\x3c\xc6\xe9\x04\xf7\x9b\x5e\x46\x86\xd0\x33\xe1\x2c\x7b\xbd\x7e\xb1\xc9\x23\x79\xc5\xec\x34\x1b\xf6\x45\x7a\x3f\x17\x26\x4a\x7c\x27\x8b\x27\x50\x1e\xca\xed\xc3\x61\xeb\xa8\x44\x44\x23\x42\xb4\xb1\x0f\xa9\x4d\x26\x58\x65\x11\x6a\xcf\x43\xfc\xbe\xc9\x65\xd2\xab\x4b\xbb\xe6\x14\xc4\xf9\x0a\xb6\xb3\xe0\xd5\x38\x3f\xa0\x49\x88\xbf\xbb\x26\x03\x07\xdd\xe2\x2d\x84\x09\x8b\x63\x31\xd1\x55\x14\x1a\x92\x7b\xb7\x8d\x66\x4b\x34\x1d\x2f\x2a\x93\xe2\x91\xcf\x79\xba\xae\xcd\x26\x12\xf6\xb1\x04\xf3\xfc\x81\x37\x3a\x7c\x6a\x04\x5b\x59\x24\xbf\x95\x0c\xd5\x42\xf7\xb7\xac\xce\xf3\xaa\x7d\x72\x5d\xe0\x53\x05\x5d\x95\x1b\xd7\x68\x11\x13\x92\x59\x66\x38\xae\x09\x71\x70\xf4\x49\x2b\xa5\x0a\x46\x8f\x8e\x34\x77\x63\xdb\x61\x2d\x3c\x7d\xe7\xe5\x64\x59\xb2\x6e\xe0\x29\xc6\x30\x82\x7a\x35\x3a\xee\x73\xde\x68\xd6\xd7\x2b\x27\xaf\xd7\x5d\x22\x16\x45\x27\x94\x5c\x72\x26\x84\x4f\xab\x15\xb8\xdc\xc9\x14\x34\x9e\x31\x41\xc6\x13\x16\xad\xc8\x94\xde\xdc\xdc\x84\x39\x84\xd9\xc7\xfe\xae\x39\xdb\x33\x2d\xc3\x93\xe9\xe8\x96\x1b\xbd\xe0\x71\xc3\xd2\x85\x8b\x3c\xb5\xf3\x3b\x16\x4a\x15\x61\x6c\x6f\xe1\xbb\xc2\x4a\x35\xf2\x13\x36\xd2\x61\xc5\xd8\xcf\x75\x9e\x27\xe2\x2c\x91\x01\xc4\xae\xbd\xe3\xe1\x26\xcf\x64\x6c\xa7\xb2\xe0\x31\x28\x09\x5c\x59\x76\xbf\x3f\x6e\x49\x1a\xf0\xf0\xb6\x40\xc7\x31\x09\x66\xac\x59\xc5\x9f\xbc\x5b\xfe\x05\x48\xf8\x8e\xe6\x1a\xd9\xec\x40\xc1\xc0\x6d\xd2\x9d\x79\x4c\x44\xa3\xea\x22\xc3\xd4\x76\x26\x22\xec\x1e\x8b\x33\x3e\x45\x07\x4d\xb9\x37\x41\xfd\xa1\x93\xc9\x11\xf6\xdb\x58\x79\xe5\x5e\xe3\x6e\xf6\x02\x61\x4a\xe6\x4a\x5c\xde\x9d\x83\x06\xd2\x2f\xbc\x4a\xe9\xc8\x81\xa5\x94\xbd\xe6\x79\x61\x25\xfc\xb6\x28\xb9\xf3\xb6\xfb\x3f\xfd\x51\x1b\x35\x3f\x14\x6a\x27\x27\x2a\xfd\x3e\x5d\x28\xb7\x7f\x58\xa6\x7f\x1f\xd2\x72\x85\xc2\x5e\xcc\x1c\xcf\x64\xe3\x8d\x21\xf3\xb9\xff\x22\xe0\x0e\xe9\x00\x62\x9e\xf1\xa6\x3e\x71\x3f\x25\x88\x83\xdd\x91\x1f\x30\xc0\xd3\x98\xb7\x4b\xd7\x97\x14\x9b\xe5\xe2\x69\x67\x22\xda\x09\xd5\x2d\x4e\xbf\x3c\x67\x39\x29\xd2\x98\xaa\xc3\x4c\xe0\x5b\xea\x08\xea\x9a\x42\x4e\x93\x45\x9c\x2e\xb8\xfc\x22\x22\xc3\x1c\xc1\x3d\x80\x3b\x90\xa8\xa7\x0b\xcd\x0a\x30\xc2\x09\x21\x1d\xc2\xcc\xc8\x5b\x0b\xcd\x45\x82\xc6\x95\xf5\x8d\x80\xbf\x6e\xc4\x71\xa2\x50\x5f\x68\x84\x7a\x75\xf6\xe9\x11\xfd\x87"}, -{{0x7e,0xd8,0x7c,0x36,0xdf,0xdb,0xae,0x60,0xc9,0x40,0xa3,0xb3,0x25,0xc1,0x9f,0xde,0xd8,0x14,0xd7,0x6a,0x54,0x48,0x20,0xa3,0x2f,0x28,0x6a,0x5c,0x0a,0xd7,0x1d,0x72,},{0x3c,0x4a,0xc5,0x10,0xb3,0x62,0x22,0xc2,0x52,0xa2,0xdc,0x1a,0xfc,0xb4,0x0f,0xb0,0xeb,0x85,0xbc,0xa9,0x03,0x91,0x19,0x6a,0x58,0x83,0xaa,0x2c,0xc9,0x12,0xb2,0xdf,},{0x57,0x9b,0x38,0x12,0x4b,0xd0,0x59,0x1a,0x59,0x7c,0xc9,0xa3,0x89,0x12,0x7c,0xea,0xf5,0x51,0x56,0x07,0x73,0x63,0xed,0xb8,0x11,0xd0,0xb6,0x55,0x52,0xac,0xfc,0xc6,0x77,0xb2,0x72,0x94,0x21,0x99,0xca,0x25,0xab,0x79,0x0d,0xe6,0xe0,0x84,0x60,0x3a,0xd1,0x05,0x2e,0xc2,0x10,0xcf,0x6f,0xcb,0x14,0x17,0x28,0x90,0x67,0xce,0x3c,0x08,},"\x62\xd3\x13\x91\x2a\xbb\xb0\x06\xb7\x77\x4a\x67\x37\x71\x4a\x34\x99\x70\xce\x04\x21\x11\x2f\x40\x04\x63\xd3\xdb\x0e\x2f\x7f\x12\x8d\x7b\x96\x93\x9f\x43\xc1\xe7\x10\x7b\x51\x18\xa7\x7c\x11\x96\x83\xd8\x66\xb7\xe3\xd7\x2a\xc2\x1f\x6b\x42\x72\xb4\xbe\x92\x89\xb6\x55\x6f\xe3\x1b\x60\x51\xa0\xb4\x2e\xd5\xea\x0c\xf3\x47\x69\x6d\x30\xfb\x8b\xff\x6b\x8b\x57\x27\x19\xde\x19\xa2\x31\xcc\x85\x45\x9a\x99\x0c\x37\x80\x1f\x08\x37\x18\x6c\xef\xbb\x55\x21\x56\x96\x66\x96\x7c\xd4\x24\x3d\x73\x07\xf1\xb0\xb2\x4c\x8e\x2b\x9b\x69\x23\x17\x30\x4f\xbe\x3d\xd0\xa2\x63\x65\x01\x91\xb3\x52\x16\xf5\x29\x16\x57\x3a\xf9\x05\x24\xf9\x1d\xb1\xa9\x24\x71\xd7\x58\xc9\x2d\xc6\xd1\x4d\x1a\x4b\x26\xf4\x1b\x40\x40\x3c\xa8\x7d\xcf\xab\xdc\xa4\x7b\x9f\xc2\x53\x35\x78\xf1\x61\xf3\xb0\x19\x9b\x5c\x69\x8e\x08\x07\x04\xb2\x1c\x9e\x61\x52\x69\xfc\xd0\xd4\x04\x39\xed\x8b\xc3\xbd\xfb\xc9\xaf\xb4\x4c\x11\xfa\x89\x27\x5f\x0e\xaa\xa5\xd0\x8f\xa9\x59\xd6\x37\x8d\x0d\xb8\x99\x10\xd4\x8f\x2d\x86\xa1\xeb\xfc\x5c\xbf\x10\xeb\x2d\x5a\xad\xf5\x1b\xbd\x83\x44\xff\x8b\xbb\x5b\x8a\xfe\x05\xa4\x50\x11\xb5\xe4\xb7\x2e\xb8\x64\xad\x26\x3e\x8a\x03\xa6\xc7\xf9\x8a\xee\xb3\x54\xf7\x30\xa3\x18\xaa\x30\xfb\x56\xd3\x3d\x80\x74\x8c\x98\xeb\xec\x15\x87\x8c\xcf\x3c\xe8\x22\xf6\x9d\x34\x56\x84\x3c\x40\x0d\xc5\x6b\x48\x1a\x95\xe6\x88\xb8\xa4\x73\x5b\xf3\x84\x3f\x58\x33\xdd\xa0\xef\xe0\x9e\x71\x75\xb5\x67\xc6\x61\x38\x7a\xfd\x2e\xbc\x07\x9a\x48\xe3\x49\x67\xec\x97\xb9\x27\xdf\xa5\x81\x88\x8f\x23\x1a\x98\xa7\xed\x33\x10\x3b\xfa\x8e\x8f\x9b\xa6\x51\x35\x27\x90\x0b\x39\xb8\x62\x31\xda\x79\x11\xa2\xfc\x93\x58\x88\xa7\x5f\x11\x29\x58\x4a\xff\xf2\x02\x52\x49\xc4\x18\x8f\x09\x05\x2f\x85\x68\x77\x06\xd0\x5e\x29\x91\x44\xd4\x0d\xe8\x89\x8b\x7c\x8b\x2d\xfe\xf0\xc3\x70\x85\x73\xd8\xb0\x56\x3a\x6b\xd0\xa5\x04\xc0\xb6\x74\x57\x02\xb1\xb5\x71\x21\xc6\xf0\x40\xaf\xf2\x71\x98\x94\x8b\xa6\x9c\x21\x25\x3a\x28\xd3\x9e\xba\x72\x62\x19\xbe\xda\x1f\x82\x09\xfb\x83\xe9\xad\xb0\x7a\xd4\x09\xfb\xd6\xd2\x55\x65\x88\x9a\xb4\x51\x23\xf9\xd9\x45\xec\xd7\xd9\xca\x70\x28\xec\xe0\x92\xe3\x5f\xbb\x7c\xb3\xf3\x28\x12\x6e\xfd\xda\xc5\xd8\x59\xf2\xb2\xc6\xeb\x09\x01\x33\x69\x0e\x20\xc1\x7d\xea\xf3\x88\x26\x85\xf0\x7e\x9e\xd2\x65\x3b\x80\x3b\x9b\x38\x3b\x70\x74\x8a\x1f\xa9\x2c\x86\xf8\x6d\x6c\x47\xea\x87\xb1\x0b\x12\xe3\x63\xba\x50\x80\x60\xf4\x7c\xe2\xa2\xf3\xb6\xa3\xee\xfc\xd4\xda\xcf\xc7\x1c\x41\xf4\x36\xfe\x0c\x2b\xc3\x4d\x4b\xaa\xd4\x95\x74\xe7\x44\x3c\x12\x6a\x58\x9f\x6e\xf7\xbc\xa4\x49\x54\xf0\xbb\x28\xec\x71\x51\xb0\x51\x1c\x23\xc6\xbc\x42\xd5\xe8\x59\x83\xec\x16\xbb\x5f\x50\xa3\x82\xd6\x88\x15\x0a\x49\x60\x9c\xbd\xe5\x69\x8e\x86\xdc\xbf\x02\x12\xc2\x29\x22\x99\xdc\x4d\xcf\x87\x42\x9f\x6c\xd2\xee\xc8\x09\x48\xce\x86\x7e\x25\xc9\x45\x84\xcd\xc6\x4b\x09\x90\x29\xeb\x85\x4e\xdc\x26\xea\x21\x42\x1e\xff\x48\xcf\x4e\x41\xf4\x9e\x2d\x89\x47\x8d\xef\x06\xc4\x2b\xea\x22\x0a\x13\x3e\x50\xf5\xc7\x44\x64\xc7\xe7\x3f\xb1\xc1\xa7\x7c\x50\x7c\xf6\xcd\xa8\x5b\xe4\x02\xb7\xe6\xd6\xd2\x1e\x81\x0d\x6d\x0b\x59\x72\xb9\xfe\x77\xe5\x4e\x74\xae\xe1\xf3\xbb\xfd\x6e\x7d\xe6\xb5\xc0"}, -{{0x6a,0x29,0xf8,0x1b,0x8d,0x9a,0xa4,0x8a,0x1b,0x23,0x36,0x4e,0xac,0x8f,0x6a,0x4b,0xdd,0x60,0x7a,0x84,0xcf,0xe8,0xe8,0x8d,0x90,0x17,0x5d,0x80,0x64,0x3a,0x58,0xa8,},{0x4c,0x3b,0xe3,0xa2,0xa8,0x42,0x5f,0xf3,0x1c,0x3a,0x0d,0xb4,0xa5,0x2a,0x0c,0xb1,0x41,0x6c,0xeb,0x48,0xcc,0x3e,0x4c,0x28,0xa4,0xf2,0x28,0x4a,0xb3,0x46,0x07,0x15,},{0xdf,0x09,0xcb,0x9b,0x87,0x8d,0x3d,0xc9,0xe5,0x42,0xdb,0xac,0x28,0x94,0x3e,0x28,0xe4,0x1d,0xce,0xcb,0x92,0xcb,0x7e,0xa4,0x40,0x09,0x88,0x5e,0x46,0x49,0x97,0x43,0x33,0x05,0x61,0xba,0x1d,0x36,0xae,0xdd,0x46,0x76,0x75,0xfd,0xca,0x2b,0xaa,0xa4,0x70,0x1b,0x6f,0xad,0x97,0x9f,0xd8,0x39,0xc4,0x70,0xd1,0x3c,0x82,0xda,0xa9,0x05,},"\x78\x76\xa3\xf4\xeb\x69\xbb\x7e\x54\xe9\xff\x95\x4e\xbd\x3b\x10\xb9\x3a\x4c\x1a\xfe\xae\x92\xfa\x03\xc1\x03\xcb\x63\x13\xa2\x01\xc5\xb3\x3a\x9a\x72\x23\x75\x5c\xb5\x10\xe2\x5e\xc5\x82\xb5\x4e\x81\xb8\x49\x56\xf6\xc5\x3f\x1f\x08\xa6\x3b\xf0\xc4\xa2\x61\xaf\x45\x0e\x52\x3f\xe8\xf6\x1d\xdb\x3c\x0e\xea\xb8\x75\x10\x72\x68\x88\x01\xb2\xa4\x73\xb7\x1a\x2e\x38\x70\x8d\xa6\x8c\x2f\x37\x92\x5c\xb0\x5a\x20\xc4\x28\x3b\x3a\xf9\x7b\x6f\x0b\xa6\x5a\x54\x03\x55\x43\x75\xe2\x15\xd9\xe3\xaa\x1b\x0f\x9f\xdb\x0f\x84\x99\x23\xed\xbd\xaa\x0a\xb4\x81\xc5\x45\xa5\xdf\x8f\x51\xd1\xf6\x8b\x22\x35\x07\xea\x0e\xcc\xfa\xeb\xb5\xfc\xcf\x5e\x3d\xfa\x65\xa4\x4e\xea\x50\x45\x68\xa8\x81\x80\xa0\x60\xbb\x06\xc5\x15\x57\xb8\x1e\x66\x7b\x4b\x04\xe3\x21\x0f\xa4\xc3\x79\x87\x6c\x49\xf3\xe5\x6b\xf2\xbe\x1c\xf5\x19\xa7\x41\x83\x93\xd2\x40\xdc\x8a\x22\x4c\x6c\x38\xac\x2a\xb9\xd8\xfa\xdf\xc5\x36\x20\x30\xc7\x93\x0c\x3c\xe7\x79\x5b\x14\x7c\x26\xc8\xa2\x8c\x65\x34\x29\xd9\x0a\x17\x3a\x86\xa8\xb1\x8a\x00\x9e\x62\xae\xf6\xec\xa9\x5d\x39\xbd\xbe\x45\x64\x77\x78\xa2\x53\x2a\x41\x5a\xe1\x9b\xad\x23\x11\x29\x12\x78\x42\xfe\x1d\x0f\x11\xfa\xb4\xa1\xcf\x0b\x17\xe4\x98\xcd\x59\x52\xc9\x39\xe0\x90\x09\x02\x87\xb1\x44\x89\x5d\xff\x00\xce\xc8\xd6\xae\xda\xf6\x24\x81\xa4\x17\x83\xe0\x21\x08\x2c\xe3\x52\x06\x3e\x62\x81\x1f\xd9\x99\x90\x10\x4d\x8a\x46\xcd\xca\xee\x2b\xab\x45\x8e\x52\x47\xfb\x02\x3e\x92\x33\x30\xa4\x28\xc7\xbc\xfd\x20\xb0\x8f\x52\x0e\x89\x46\xdd\x65\x83\x47\x35\x2a\xe0\xc4\xbe\x73\xc3\xd5\xec\xcd\x11\x14\x9f\x3a\xb7\xb8\x05\x2c\xfd\x95\xc3\x5d\x41\x64\x54\x6f\x5d\x8f\x37\x75\x17\xa7\xf4\x32\xc0\xd5\x56\x3a\x7b\xcc\x7b\xd1\x19\xd3\x42\x1d\xfe\xba\xae\x84\x45\x99\xb2\x9b\x38\x3b\xb8\xd5\xdb\xf1\x40\xd9\xbd\x47\xa0\x78\xb7\xae\x7c\x6a\xa8\x7b\x1e\x29\x23\x6c\x9f\xcf\xd6\x54\xb7\xf8\x09\x79\x4c\xcc\xb2\x61\x58\x8e\x18\xde\xc6\xc4\x04\x6a\x93\x40\x67\xd0\xdf\xa0\x37\x91\xd0\x3d\x83\xb7\x18\xac\x4d\x24\xdc\xe7\x85\xa3\x02\x8d\xe0\xc9\x59\x2d\xba\x7c\x5c\x58\x45\x18\x4a\xfc\x9c\x0d\xfc\xf9\x40\x95\x86\x0f\x0e\xb8\x02\xeb\xea\x20\x17\x8e\x78\xb5\x64\x2e\x5d\xd6\x1c\x33\xb3\x97\x69\x05\x2d\x9d\x85\x4d\xce\x90\x2f\x47\x6e\x21\xf9\x6c\x65\x0b\x46\x3b\x7b\xc3\xd0\xff\x29\x96\xb6\x5c\x57\x83\x1f\x8b\x7c\x0f\xb9\x15\xf4\xdd\x72\x26\xac\x95\x5c\xbc\x7d\xfb\x03\xf9\xb7\x58\xdd\x3e\x0d\xfc\xe2\xe0\xe5\x80\xc9\x1a\x30\xc7\x83\xff\x56\x7b\x17\xf1\x2d\xfd\x5d\x31\x37\x64\x6e\x20\x01\x1c\xdc\xaa\xe1\x11\x02\xdc\x71\x68\x86\xcb\xf1\x23\xc0\x94\x88\xb1\x73\x63\x6a\xbd\x54\xe9\x62\xca\xee\xc9\x7d\x5e\xb9\x40\x68\x2e\x70\x3b\x73\x0f\x61\x56\x2c\xd1\x4b\x9e\x65\x61\xb5\xe9\x3f\x60\xcd\x0e\x1e\x86\xd1\xa1\xb4\x71\x9c\x5b\x50\x82\x42\xbd\x6b\x2d\x9a\x54\x8f\x59\xbb\xb8\x75\x07\x59\x69\xef\x20\x32\xf3\x19\x6b\x8a\xec\xcc\x45\xa4\x4d\x9d\xbd\xaf\x87\x8e\xd1\x6f\x1d\x85\x5e\x89\x18\xed\x65\xa4\x5e\xe5\xc7\xfa\x32\xa1\xec\x69\x32\xa1\x59\xcf\xb5\x0f\xfc\x87\xbe\x06\xdf\xcf\x72\x28\xae\x88\x70\xcc\xd3\x57\xfc\x65\x6e\x33\xfa\x4b\x6b\x8b\x7d\x1a\x72\x15\x55\x3c\xab\xac\xc7\x0a\x39\xc9\x80\xb9\x71\xe5\x1a\x17\xed\x63\x18\xb4\x3b\x29\xbb"}, -{{0xef,0x12,0xdf,0x47,0x9d,0x98,0x3a,0xd9,0x6e,0x8b,0xa6,0x53,0x30,0xb3,0x6d,0x49,0xaa,0xdb,0x98,0x31,0x64,0xe1,0xc0,0xb4,0x52,0xb5,0x60,0xde,0xd1,0xd0,0x8d,0x60,},{0xf7,0x61,0xcf,0x28,0x26,0x92,0x7a,0x7c,0xda,0x8c,0xb0,0x4f,0xaa,0x2c,0x59,0xf8,0x42,0x5a,0x8f,0x7d,0x39,0x8f,0x76,0xe8,0x67,0x02,0x1c,0x95,0x1f,0x07,0x38,0x09,},{0x4c,0x80,0x10,0x86,0x6d,0x91,0x15,0xf0,0x52,0x93,0xb9,0x34,0xca,0xc6,0x81,0x04,0xcc,0x2c,0x34,0x37,0x56,0x8c,0xb9,0xd5,0xc5,0x70,0xb1,0xa8,0xbe,0xe7,0x06,0x60,0x30,0x75,0x53,0x70,0x33,0xbd,0x70,0x8a,0x9c,0x9f,0x3d,0x1e,0x25,0x19,0xa9,0x15,0xb1,0xc4,0xae,0x4c,0xcd,0xdf,0xcf,0x0e,0xd0,0xc0,0x49,0xd3,0x42,0xa0,0x2e,0x02,},"\xe5\x8f\x34\xda\xea\x75\x5a\xc4\xe4\x13\x33\xd6\xf0\xed\x01\x35\xf7\xdb\xce\x50\x30\x9b\xb1\x95\x6b\xc7\x1a\xcb\x12\xc7\x70\x67\xa6\x47\xff\xd8\x6a\xa5\x87\x0c\x0c\x00\x07\xe8\xf9\x95\xa2\x2b\x88\xc4\x67\xde\x22\x54\x44\x54\x42\x01\xc5\x57\x49\x5e\x25\x3e\x33\x19\xcc\x5c\xa3\x76\xd3\xe7\xcc\x1e\xb4\x67\x34\x6e\x52\xad\x95\x6a\x6f\xa7\x33\x72\x0b\x17\x11\x7b\x5b\x75\x85\xe4\xd5\x59\x40\x9a\xae\xfa\x95\x58\x0f\x91\xe5\x02\x01\x5f\x49\x7c\x5c\xdc\xb7\xd4\xd5\x61\xf5\x44\xef\xa3\x5c\x1e\x2a\x53\xb7\x2b\xdd\xec\xee\xc2\xd1\x05\x0f\x17\x7d\x48\x0f\x68\x74\x05\x66\x4d\xfd\xde\xc0\x6e\xee\x4b\xd1\x47\xa9\x12\xfd\xbf\x74\xf2\xa9\x5d\x1f\xd1\xe1\x12\x68\x69\x4c\xe4\xd4\xec\x4f\xff\xd6\xdd\xb3\x25\x4d\x36\x0f\x23\x6f\xab\x4d\x1a\x17\xf8\xd0\xd1\xa5\x11\xf9\x44\x69\x2f\x23\x96\x39\xae\x03\xd6\x4f\xac\xec\x65\x38\x42\x7a\xb7\x1f\x71\x27\xf4\xa2\x76\xf9\xbc\x45\xbb\xa6\x11\xdf\xcc\xe6\x44\x6c\xc1\x39\x68\x97\x6c\x8b\xb6\xd6\xfe\x21\x06\xd7\x05\x92\x2d\xca\xc9\x56\x96\x6a\x76\xd4\x8f\x2a\xff\x4b\x86\x51\x4e\x39\xa6\x7e\x16\x43\xfc\xc3\x21\x85\x80\x24\xe6\x93\x18\x98\x33\xc8\xad\x59\xb4\xb6\x25\x29\x8e\xba\xfe\x64\x62\x6b\x48\x0f\x32\x6f\x13\x40\x72\x3c\xb3\xd3\x83\xf4\xfc\xcb\xfc\x23\x7a\x3f\x4c\x4f\x7e\xcf\x0b\xa4\x36\xb3\x2c\x2f\xe3\x51\x79\xda\x93\x11\x1b\x48\xcc\x9e\xa2\x42\x02\xbd\xc1\xb2\xfb\x60\xa4\x31\x9d\xfd\x98\x64\x47\x0f\x73\xf5\x41\x37\x20\x6e\x0b\xf0\x07\xf5\xae\x88\xa8\x87\x47\x00\x8a\x60\xf4\x78\x9a\xd1\x67\x72\x4f\x17\x9c\x02\xb6\x3a\xed\x00\x25\x73\xd2\x8a\x6b\xcf\x88\xe0\x7c\xe8\xda\xea\x5d\x5f\x1a\xcf\x48\x7b\x4c\x5c\x16\xc2\xbf\xe1\x12\x31\xea\x5e\xa7\x63\xe8\xf3\x32\xcc\x73\xda\x1b\x2f\x8c\x19\x8e\xa8\x17\x3f\xd3\x3d\x4b\x2a\xe6\x9e\x5d\x4d\x1a\xad\xdd\xf2\xfd\x82\x1b\x85\xbe\x45\x15\x19\x62\xd1\xf9\x9d\xf8\x13\x08\x61\x88\x52\xad\x7c\xf4\x1d\x72\xda\x08\xa1\xb3\x9d\xf7\xd8\xb9\x94\xb4\xdd\xff\x37\xf9\xdf\xe8\xf3\x8c\xe3\x0e\x91\x06\x1d\x95\xd5\x8f\x7a\xe8\x26\xb0\x23\x85\x27\x2e\xc0\x9f\x01\xa7\xb3\xe4\xb3\x91\xd0\x9b\xce\xd6\x65\xda\xd6\x95\x05\xb4\x19\xda\x84\x81\xbc\x37\x92\xbf\x8b\x8e\x7a\xd6\x4b\x63\xf2\x45\x66\x6c\x8c\x32\xfd\x5c\x1b\x1b\x48\xc9\x95\x1e\x1c\x21\xa1\xeb\x5f\x50\x7c\xff\x13\x7c\xfb\x86\x2c\x2c\xc9\x87\x66\xe8\x78\xc9\x30\xa0\x83\x82\x8c\x9d\x8d\xb1\x8b\xf1\x67\x16\x68\x5f\x39\xd6\x57\x2a\x8c\xa8\xb2\xa5\x14\xf7\x70\x03\xd4\xe7\x5b\xc1\x54\xae\xbf\x14\x10\x37\x78\xf3\x65\xb1\xc3\xf0\x35\x41\xdd\xbd\x07\xd6\xe2\x3e\x56\x76\x2d\x97\x1e\xb0\x29\x83\xe9\x3c\x4e\x01\xba\x4b\x8a\x21\x78\x92\x8c\x43\x37\xd3\x02\xf3\x1c\x9c\xcb\x75\xb2\x49\xa8\x2d\xc9\x68\x21\xe9\x5a\x03\xab\x6b\x77\x0d\xf2\xc3\xdf\xdb\xf1\xfe\x97\x73\xf8\xbc\x1b\xc5\xb3\xaf\xa0\x44\x0b\x10\x25\x78\xf3\xd2\x13\xc8\xd0\x19\xcf\xf1\x24\xf7\x5c\xe4\xac\xcc\x8c\x66\x7f\xeb\x27\xc7\x51\xa6\x12\x00\x74\x81\x31\x04\xe0\xcd\x07\x0c\x9f\x5e\x45\x1d\xcc\xff\x4c\x80\xd7\x11\x07\xc9\x75\xab\xfa\xc0\x7d\x4d\x27\x0c\x72\x7d\x8a\x2f\xec\x34\x9b\x53\x39\x68\xe2\x71\x89\x2d\x2b\x62\xc1\x25\xfb\x79\x74\x60\x3c\x30\x5e\xa3\xbf\xa3\x0f\xb6\x10\xfc\x5a\x23\xeb\x68\xa8\x40\x64\x44\x39\x1a\x52\x13\x37"}, -{{0xf7,0x31,0x31,0x7c,0xf5,0xaf,0xfe,0x58,0x70,0x4c,0x4d,0x94,0x97,0xae,0x86,0x0b,0xbf,0x73,0x9d,0x0f,0xd9,0x6b,0x7c,0x02,0xef,0xb6,0x77,0x7b,0x3c,0x85,0x8a,0x19,},{0xd7,0xd6,0x38,0xae,0xcc,0xe1,0x46,0x1e,0x31,0x42,0x55,0xaa,0x29,0xd9,0xa6,0xb4,0x88,0xae,0xa1,0x39,0x6e,0x96,0x82,0x69,0x5a,0x47,0x0e,0xff,0x23,0xf3,0xed,0x84,},{0x2a,0x4f,0xea,0x98,0xf9,0x24,0x01,0x71,0xa1,0x82,0x3f,0x2f,0x69,0x35,0x20,0x62,0x67,0x2e,0x6c,0x6e,0x66,0x52,0xd3,0x88,0xa8,0x77,0x14,0xd6,0x47,0x99,0x5d,0xf7,0x5b,0x6e,0x1e,0xd1,0x74,0x6a,0xf2,0xad,0xf4,0xe8,0x06,0x13,0x5d,0x60,0x75,0x4e,0x60,0xfe,0xa0,0x32,0x12,0x8e,0x35,0xab,0xc1,0xf1,0x61,0x51,0x81,0x12,0x5f,0x0b,},"\x16\xf5\x1c\x59\xe9\xae\xfc\x26\xb0\xda\x5e\x00\x85\xeb\x2e\x2f\x1f\x85\x6d\xef\x97\x25\x76\x9e\x3a\xf1\x2f\x86\x09\x05\xae\x13\x3f\x65\x07\x4d\xa7\x6d\xbf\x25\xc6\x7f\x62\x57\xd2\xdc\x66\xc0\x5f\x9b\x31\xae\x17\x7b\x69\x92\x9f\xc1\x83\xb5\x88\xc5\x19\xbc\xa1\x47\x96\xa0\x89\x6d\x29\x05\xfd\x94\x2d\x7a\xb4\xa3\xfd\x95\x41\xa5\x52\x9f\x72\x9c\x58\x51\x41\x9b\x5f\xbe\xf7\xb1\x34\xd6\x76\x2e\xb9\x7e\x8a\x95\x1a\x8f\xf5\x2a\xa0\xd7\xe6\x74\x44\xd0\x6b\x07\xaa\x55\xe4\xeb\x9a\xb8\x92\xf4\x7b\xfd\x11\x1d\xf5\xb6\x2f\x6f\x3f\xd1\xa5\xed\x84\x12\x5f\xee\xbb\x77\xda\x63\x7c\x05\xd5\x26\x5c\xed\x11\x3d\xfe\x87\x82\xdb\xd1\xce\xcd\x2c\x6c\x03\x2b\x8f\xa8\x85\x5b\x3a\xe7\x8d\xe7\x4f\xaa\x5a\xa2\x0a\x76\x14\x63\xc2\xa3\x0b\xe6\x6b\xd3\x8c\xde\xc7\x5f\x89\x57\xcb\x94\xc1\x13\xa4\x5d\x54\x6d\xaf\x47\x5d\x89\xaa\x14\x82\xf8\xd2\x80\x3a\x23\xc9\x39\x20\x20\x15\xa0\x8e\x94\xb1\x32\x72\x8f\xbe\x8f\x60\x19\xd7\x16\x8a\x08\xa5\x93\x01\x70\xe5\x63\x9d\x11\x0e\x47\x39\xdb\x85\xe6\x1e\x64\x49\x59\x44\xb5\x42\x3a\x74\xad\x5a\x8a\x0a\x51\x06\x12\xec\xe6\x55\xce\x18\x86\x40\x51\x52\x5b\x90\x8e\x0b\x19\x29\x0a\xbe\x8b\x11\x82\xc4\x8c\x70\x0d\x35\x05\x15\xfd\x34\x99\x56\xe8\x08\x73\x27\xf3\x0b\x6f\xc3\xf1\x31\xc2\x14\x4a\xbb\x3f\x0e\x9c\xa3\x31\x17\x2b\x35\x06\x4a\x82\x81\x1a\x68\xe2\xcf\x36\xb4\x3e\x3a\xd2\xe8\xdf\xa5\xb1\xce\xf5\x0e\x2a\x60\x29\x3f\xc5\xf6\x35\xc9\xa9\x99\x8d\x8c\x1a\xd2\x96\xe7\xc7\x8f\xc0\x58\x20\x22\xd6\x30\x67\x18\x6b\x65\xe7\x64\x82\x8c\xc0\xf5\xf7\x63\x2d\x5e\xef\x86\x3e\x6c\x6d\x90\xe3\x8c\xcc\x87\xd7\xb7\x47\xfa\xc8\x49\x1d\x63\x2c\xf7\xf5\x4b\x9a\x9e\xed\x16\xee\xbe\xc0\x1b\x6c\xc3\x3d\x24\x63\xf7\xf9\x50\xd8\x28\xb5\x5e\xe3\xf7\x7c\xbe\x97\x4f\x48\x94\x8e\xb7\x57\xae\xd4\xe0\xdb\xb0\x0a\xd9\x5e\xe0\x13\x23\x48\x6e\xba\x3c\x8d\xa8\x86\xed\x7f\x57\xbb\x40\x0d\x63\xa1\xb2\xeb\xea\xa2\xe7\x0a\xdf\x03\x79\xe3\x39\x30\x01\xba\x62\x6c\x0d\xd5\x4b\x7f\x0c\x9a\x25\xaa\xe6\xc9\x87\x5d\x4e\x76\x22\xf3\xed\x42\x8f\xb3\x12\x4b\x29\xc5\xdb\x9a\x7e\xf1\x6e\xbd\xdd\x68\x05\xf0\x95\xf5\xe7\x69\x82\x3c\x43\xf2\x62\x86\x8f\xf4\x3e\x3e\x05\x25\x74\x6d\x94\x97\xaf\x12\x4a\x01\xdf\xf6\x1e\xc7\x18\xaf\x3b\x5b\xb7\x46\xfc\xc0\x8a\xeb\xd1\x66\x84\xd4\x56\xae\x79\x32\xff\x5e\xd7\xd6\xb0\xf1\xb2\x5c\x7a\xde\xef\x59\x8b\x5d\x58\x87\x75\x90\xac\x1d\xc0\x59\x75\x15\x67\x96\x99\x87\x74\x08\x1e\x5b\x66\x82\x2a\x94\xa6\xa8\x02\xc3\xa2\xcd\x9f\x48\x9e\x16\x28\xaa\xf4\x65\x2b\xe1\x18\x4b\x0f\xc7\xc5\xee\x7f\x97\xce\x08\xb9\x23\x3b\x4b\x83\xd9\x36\x7b\xe5\xf4\xaa\xe9\x78\x25\x93\xa3\x52\x65\x15\x4d\xea\x4c\x37\x5c\x16\xf0\xca\xf6\xdc\x45\x94\xd2\xbd\xbf\xc3\x37\x5b\xb2\xa0\x43\x2c\x48\x2f\x13\x94\x1c\xe2\xaa\xab\x4d\x83\xe7\x4d\x11\x6f\x5d\xe4\xab\x28\xf8\xdc\x3d\x1c\xd1\x9d\x27\x1e\x56\xe1\x03\x98\xbd\x1d\xf5\xc8\x70\xfc\xbf\x93\xa7\xd1\xdf\x39\x39\x54\x7c\x10\x7b\xfd\x90\x64\x3f\x6f\x50\x01\xae\x7e\x06\x39\x7a\xe1\xa2\x71\xbb\x82\xa1\xf3\x8e\x09\x7b\xec\x66\x74\x66\xb8\x0e\xe3\xe5\x0d\xd4\xfc\x9d\x5d\x54\xf1\x8f\xaf\x7a\x5b\x55\xa8\x83\x45\x94\xef\x0c\xb7\xe5\x08\xbb\xd2\x8f\x71\xfd\x34\x23\x5b\xbf\xd3"}, -{{0x49,0x8e,0x5a,0x21,0xa9,0xb0,0xc3,0x47,0xba,0x83,0xa4,0x7a,0xc1,0x00,0x69,0x45,0x7f,0x57,0x83,0xc2,0xe1,0xe6,0xe4,0x64,0x00,0x45,0xe5,0x94,0xb1,0xc6,0x93,0x32,},{0xfb,0x39,0x48,0xc8,0x11,0x99,0x56,0x91,0x05,0xcc,0x1b,0x7d,0x9c,0xeb,0x3b,0x41,0xa3,0x43,0xbb,0x00,0x57,0x55,0x38,0x59,0x2e,0x09,0x84,0xf4,0xf4,0x71,0x0a,0xbe,},{0x28,0x60,0x83,0x0c,0xcd,0x1d,0x41,0xd9,0x50,0x76,0x81,0x6a,0x39,0x84,0x24,0xf7,0xb7,0x39,0xc4,0x9f,0xda,0xcf,0x56,0x54,0x52,0x9d,0xa8,0x5f,0xe3,0x56,0x55,0x84,0xf6,0xaa,0xc2,0x61,0x4c,0x63,0xf7,0x74,0xb6,0x1d,0xb9,0x08,0x1f,0x14,0x10,0xfb,0xa8,0xe5,0x0a,0xb3,0xb4,0xc3,0x9d,0xc0,0x63,0x14,0x24,0x3f,0x3f,0x0d,0x8e,0x0f,},"\xe4\xfb\xea\x86\x4a\xa5\x11\x90\x82\x66\x45\xd2\xf7\x72\xcb\x0f\x9e\xdd\xd3\x03\x44\x73\xfa\x31\x77\xc7\xaf\x9a\x5d\x41\xe1\xa7\x3a\xd5\x78\x4c\x70\x96\x55\x9f\xcd\xdb\x7b\x7c\x85\x89\x1c\xf2\x4e\x82\xc5\x88\xd7\x47\x74\xff\xca\xc0\xc6\xb4\xee\xbc\x2f\x3f\xa4\x3e\x9d\x45\xf2\x59\xd6\x75\x64\x03\x0c\xfe\xea\xb9\x23\x6c\x66\x5b\x65\x0a\xf0\xc9\x2c\x87\x51\x89\xf5\xf9\x38\x35\x04\xb1\x53\x60\xa0\xb9\xa5\xa0\x0d\xa3\x1f\x63\x5b\x96\xf6\xc7\x3e\xf4\x7b\x6b\x06\xf0\x28\x11\xd1\xd1\x9c\x2e\x8e\x53\x55\x0c\xe2\x2e\x42\xec\x50\xa1\xeb\x2e\xa2\xf4\xcd\x03\xc4\x42\xd4\xaa\x43\x68\x94\x23\x8c\xeb\x18\x35\xfe\x99\xb2\x40\x35\x8a\xa0\x56\x2c\x24\x96\x98\xa3\xf1\x23\xc2\xc1\x7e\x59\x10\x10\xbd\x6f\xdf\xcb\xd7\xdb\xe7\x0b\x04\x52\x05\x02\xec\xe3\x7a\x9a\x1d\xfa\x1a\xe3\x37\x04\x17\xb0\x04\x21\x7a\x5b\x8f\xe9\x90\x3c\x9a\x3b\x9f\x4b\x6d\x5c\x46\xc0\xed\x0c\x53\x8c\xec\x22\xf2\xdf\xcb\x2a\x28\x0a\x42\xad\xc4\x89\xcf\x2e\x06\x29\x12\xbe\x99\x28\xf0\xc0\x60\x89\x1e\x43\x20\x91\x17\x75\x26\xf1\xb3\xa9\x68\x06\x9d\x4a\x57\xad\xe8\x28\x55\x98\x10\xae\x03\x60\x68\x1f\xf9\x93\x29\xfa\x0f\x59\xe7\xe5\x9c\xdf\x87\xf9\xf3\x3c\x40\xe9\x70\x31\xb9\xf8\x1d\x48\xfc\x12\x28\x6e\xfb\xb3\xd4\xe5\xa6\x2e\xf5\x7b\xc0\xd5\x2d\x53\x3b\x99\xc5\x10\x6a\xa7\x9c\xfe\x17\x93\xa9\x08\x51\x85\x96\xc3\x83\x48\x3e\xc4\x9f\xf9\x8e\xc5\x57\xbf\xff\x74\x90\xa4\x6d\xaf\x67\x14\xf2\xc2\xc3\x2f\x57\x93\x2c\xa0\xd7\x30\xf0\x3f\x38\x1d\x69\xde\xcd\xbd\x9a\x7a\x6d\x4a\xfc\x62\x40\x65\x43\xc8\xeb\xe9\x0a\xc7\x6e\x6a\xfa\xbd\xb8\x24\x92\xa2\x06\xa3\x69\xe0\x42\x86\xd3\x13\xe1\x11\x07\xd8\xcd\x9b\x4b\xf6\x8f\x81\x5d\xba\x4e\x99\x0b\x04\x9d\x79\x21\x6d\x36\x53\x13\x83\x42\xcd\x11\x8b\x13\x0f\x66\xb0\x06\xf3\xd8\x9a\xc3\xcf\x89\x83\x70\x48\xb0\xf8\xa6\x2d\x94\x05\x1d\x2e\xab\x89\x1a\xc5\xf4\x78\x88\x87\x9d\x88\xe5\x46\x67\x6d\x1d\xae\xeb\x4d\x17\x5d\x3f\x04\xa9\xd7\x4f\xfc\xdd\x47\x74\x60\x16\xf8\x4a\xd0\xd1\x12\xaf\xb5\x9a\xd1\x21\x87\xe9\x4f\x22\x53\x5d\x77\xe9\xe0\x51\x6f\xa4\x21\x85\xc1\x97\xba\x77\x4b\x39\x32\x27\xf7\x41\xfe\x68\x27\x3f\x42\x3f\xb0\xe0\xe0\x47\x4b\xfd\xaf\x2d\xa7\x8a\xeb\x1c\xd5\xb9\x8c\x1d\xc0\x83\x21\x24\x74\x2a\x47\x54\x12\x5f\xc7\x8b\x19\xc5\x59\xa5\xb3\xf7\x71\x1e\x06\x8c\x44\x0c\xc0\x46\x9a\x1c\xfa\x5c\x18\x64\xbe\x18\x73\x5a\xa8\xbc\xd4\x06\xc4\x37\x1e\xb8\x57\x75\x4d\x90\x8b\xf3\x79\xb9\x1f\xcb\x24\xe3\x43\x96\xbf\x87\xc1\x9a\x04\xa8\x3d\x59\xda\xe7\x1f\x3f\x38\x39\x82\x9d\x06\x22\x13\x01\xef\x59\x56\x96\xe7\x19\xd5\x6b\x79\x52\x0a\x0e\x50\x99\x29\x83\x3b\x1d\x80\x4a\x6a\x0e\xa4\x04\x00\xbb\x45\x02\x8c\xe5\xd3\x69\x33\x88\x3e\x17\x40\x6e\x27\xa8\x10\x90\x57\xb1\xa1\xa5\xe5\xda\x21\x0a\x69\x21\x99\x4f\x46\x7a\xb4\x1a\xa8\xf0\xd8\x87\x75\xa8\xa8\xeb\xb4\xec\x77\xd7\xc8\x0e\x45\xa7\xbb\x42\x2a\x4c\x00\xc9\x05\x83\x91\x14\x65\xe6\xb5\xf0\xfd\xcd\xea\xb7\x28\x71\xca\x54\x2e\x1d\x1a\x2c\xa9\x4d\xf4\xed\x2e\xab\xf9\x0d\xed\x00\x45\x29\x03\x24\xa9\xff\xfb\x30\x14\x54\x70\x20\x9f\x38\x26\x58\x09\x89\x34\x91\x99\xdc\x5a\xb8\xd4\xa2\x5d\xf7\xa0\x52\x9c\xf9\x14\x71\xe3\x08\x42\xab\xfa\xcd\x44\xab\x78\x1d\xfc\x13\x95"}, -{{0xc2,0x4c,0xbf,0x40,0x1a,0xd0,0x3b,0xd8,0x8d,0xcc,0x7b,0x51,0x9e,0xcf,0x62,0x4d,0xb2,0x22,0x3e,0x99,0x02,0x89,0x30,0x9e,0x1e,0x9f,0x1f,0x8f,0x61,0x27,0xc6,0xc9,},{0xa7,0x46,0x66,0xf3,0x57,0x20,0x9f,0x71,0x89,0x90,0x37,0x88,0xf1,0x07,0x56,0x3e,0x50,0xc0,0x51,0xc3,0xd4,0x0c,0x3f,0x3d,0xad,0x10,0xd3,0xc3,0xcf,0xf1,0xe6,0x78,},{0x58,0x1e,0x6c,0x85,0xae,0xc6,0x23,0xb6,0x2b,0x3d,0x4c,0x9b,0xc9,0xc7,0x77,0x59,0xd5,0x49,0x27,0x22,0xe2,0x52,0xd4,0x4c,0x1f,0x8a,0xda,0x9d,0xa2,0xec,0xc6,0x7c,0x17,0x08,0x32,0x73,0xaa,0x09,0x1b,0xba,0xc0,0x46,0xae,0x63,0xc7,0x88,0x93,0x15,0x2e,0x14,0xd9,0x26,0xc4,0x1a,0xe3,0x5f,0x0e,0x6e,0x39,0x59,0x49,0x6b,0x13,0x06,},"\xe7\xfa\x35\x9e\x6a\x09\xb2\xc5\x4a\xab\xed\x3b\xba\xbf\xb7\x28\x53\xa8\x05\xaa\xbc\xf4\xd1\x8d\xda\xd3\x9f\x03\xf3\x46\x01\xe5\x5b\x6c\xe2\x63\xc9\xa3\xca\x6a\x3e\x5f\x14\x25\xc8\x21\x92\x8c\x61\xe7\xf7\x50\x91\x9b\xd3\xaf\x32\xbc\xb7\xb9\x4d\x45\x9a\x7a\x9a\x35\xf6\x1c\x94\x17\x92\xe2\xcc\x2e\x43\x27\xbe\xb3\x44\xa8\x41\xa0\x7f\x32\x06\x8a\xf1\x02\xb3\xde\x61\xea\xb6\x4e\xf6\xd5\xe6\x90\x62\xe3\x93\xab\x5e\xdf\x6a\xc9\xef\x7b\x38\xd4\x9a\x01\xbe\xf0\x00\x3f\x42\x11\x74\xc8\x88\x59\x75\xc0\x18\x32\x89\x9c\x31\x35\xe7\xa8\x6e\x5b\x55\xd9\xb1\x32\x8b\xb4\x28\x9b\x5c\x40\x20\x0f\x49\xe5\x52\x3b\x3c\x46\x1d\xc7\x17\x5e\x14\x65\x02\x22\x97\xc3\xd3\x80\xf2\xb1\xfe\xf3\x9c\xb8\x2c\x00\xfd\x16\x0f\x44\x7e\xb5\x12\x63\xfa\x25\xb4\xdf\x0f\xca\x41\xec\x0c\xa2\xec\xe7\x47\x22\x01\xaf\x86\xc3\x03\x8c\x49\xdf\x09\x9a\x9a\xef\xa1\xf8\x8d\x0e\xdf\xd1\x7c\x0b\x3c\x86\x04\x66\x29\xc0\x94\x54\x05\x4a\xa0\xfb\x2c\x69\x49\xdd\x9c\x13\x01\x85\xdf\xa5\xd9\x03\x89\x1e\x08\x74\x2c\xd0\x42\x94\x03\xf5\x7f\x40\x52\x15\x8b\x2f\x40\x1d\xa4\x75\x68\x54\xe4\xaa\xf0\x24\x22\x1e\x37\x51\x3c\xf6\x77\xee\x6a\x0b\x15\x9f\x50\x1d\x37\x7e\xa3\x2e\xb7\x1e\x77\x80\x04\xf2\x72\x03\xcd\x6d\x55\x3f\xda\x5d\x65\xe1\x87\x94\x77\x04\x6f\x3e\xa3\xd1\xd7\x5c\x9d\x0d\x30\x31\x14\x56\x70\x9c\xc7\xf6\xab\x68\xc7\xb0\xd5\x2b\xe4\x0f\x04\xcf\x65\x56\x55\x32\x32\x85\x31\x83\x29\xe8\x4c\x6a\x5b\x07\xe0\xce\xed\x5f\x78\xf7\xf1\xfa\x62\x29\xbe\xf8\x78\x79\x3c\x58\x47\x28\xab\xf4\x51\x0b\x7f\x27\x79\x4b\x59\x42\x91\x62\x54\xc5\x89\xa0\x9c\x8e\x91\x1f\x0b\x95\x42\x11\xa6\x36\x99\xa7\x52\x14\x7f\x2a\x4e\x1a\x18\x95\x66\x44\xbe\xa2\xca\x26\x92\xba\x18\x22\x80\xe0\x4a\x72\xdd\x89\xb0\xd1\x26\x85\x00\x93\x8f\x34\x7b\xf4\x3f\x2a\x24\x2e\xe9\xb9\xa6\xba\xac\x9b\x35\x0d\x65\x6f\xb1\x9e\xc8\x34\xab\xe3\x16\x44\x40\xf2\xd2\x07\x1f\xe5\xe3\x2c\x8e\x4c\xf9\x05\x53\x9b\x83\x9c\xee\xca\x26\x20\xfc\xb2\xa0\x87\xf7\x80\xe6\xc7\xf5\xe0\x5c\x50\x68\x88\x25\x0e\xa7\xc8\x56\xfb\x30\x98\x32\x00\xaa\x8f\x78\xfc\x17\x71\x05\x4a\xda\x0f\x3f\xac\x38\xae\x2f\x33\xdc\x4a\x4f\x85\x1b\x76\xed\x74\x0c\x09\x62\xa7\x6a\x4d\xe4\x40\x80\xdc\x62\x0a\x44\xad\x8f\x23\xd3\x46\x2b\x79\x2a\xb3\xaf\xb1\x9c\xb8\xa9\xf4\xd9\xe5\x9a\xd7\x65\xa7\x71\x89\x9d\xa8\xcb\xec\x89\xe5\x07\x7e\x85\xc0\xc9\x31\x26\x37\x6c\x94\x1b\xef\x1f\x8b\xb9\x92\xd3\xa3\x5f\x27\x07\x25\x84\x6f\xb2\x52\xf8\xb5\xfb\xb7\x56\x7e\x40\x6a\x1b\x53\xb6\x19\x76\x9e\x63\x2b\x2b\x40\x87\xcd\x4c\x27\x6e\x5d\x58\xff\x2b\x56\xe8\x9e\xde\xc4\x8c\xe5\x3a\x52\xe3\x29\xca\x15\x59\x53\x8f\x10\x90\x2c\x01\xa8\x5f\xbb\x3c\xd7\x2e\x6b\x82\x91\xe5\xfe\x63\x9b\xee\x9d\x47\xd3\x4c\x24\x9a\x7a\x07\xd7\xa1\x42\x7a\x01\xf6\x3d\x60\x98\x4c\x45\x0b\xef\x81\x9b\x19\xf6\x5e\x26\x14\xfd\x9c\x2f\xae\x7b\x92\x31\xa0\xbc\xa4\x14\xed\x94\xa5\xee\x7e\x66\x32\x7d\x2a\x99\xc8\x48\x78\xb7\xbe\xe0\x87\xe8\x91\xf2\x53\xfa\x1f\xec\xe3\x13\x64\x8c\x06\xc4\x5d\xb2\xd9\xf3\xbc\x85\x99\x93\x7b\x75\x2d\x38\xce\x50\x63\xd0\xed\x9a\x43\xec\x9d\x40\x15\x89\x3d\x43\xbf\x5b\x2d\x1c\x60\x47\x85\x10\x46\x89\x68\xb7\x96\xf0\x15\x37\x89\x59\x54\x41\x72\x2a"}, -{{0x8b,0x3d,0xcd,0xe4,0xab,0xbf,0x4e,0x62,0x11,0xc4,0xa5,0x1c,0x4b,0x02,0x68,0x00,0xa8,0xa2,0xa0,0x61,0xcb,0x38,0xa2,0xec,0xc7,0xc9,0xcf,0x11,0x3f,0x92,0x70,0xbf,},{0x51,0x45,0x35,0x58,0x0f,0x0d,0xe3,0x59,0xbb,0x0d,0x41,0xf2,0xef,0xdd,0xaa,0x04,0xc2,0xec,0x95,0x01,0x19,0xf3,0x16,0x34,0xb2,0xc1,0xa3,0x2f,0x19,0x5f,0x69,0x68,},{0x4f,0x3d,0x4d,0x22,0x85,0x03,0x01,0x7e,0x74,0xa6,0xbb,0x58,0xaa,0xfa,0xe3,0x5c,0x3f,0x37,0xbd,0xee,0x4f,0xf6,0xbe,0x2e,0x62,0x40,0xb5,0x08,0x2f,0xed,0xdb,0x22,0x27,0x35,0xe1,0x2f,0x31,0xe0,0x56,0xfa,0x68,0x54,0x47,0xe5,0x38,0x48,0x03,0x00,0x7e,0xa7,0x91,0x0e,0x60,0x5c,0x1b,0x78,0x11,0x8c,0xd5,0xac,0xc5,0x87,0xa6,0x06,},"\x48\x14\x25\x02\x7d\xa6\x72\xb6\xf2\x6c\x91\xb8\x0e\x55\x58\x2c\xae\xf4\x7b\xb1\x5a\x2d\xe8\xfc\xa8\x52\x22\x17\x85\x18\x0b\x20\xa7\xfd\x6d\x49\x07\xb5\x88\x1c\xc1\xd6\xe3\x9a\xb9\x61\x2c\xc7\x4d\x69\x77\xe9\x14\x1f\x70\x87\xbb\x27\xab\x30\x84\xa2\x62\x85\x58\x6f\x84\x11\xdb\x1f\x50\x3a\xdf\x52\xdc\xb2\x5a\xb8\xff\xfd\x2e\xc1\x50\x4c\x17\x77\xb9\xd6\xdd\x4a\x29\xe2\x01\x9e\x5c\xba\xe1\xb7\xeb\x26\xf9\x5b\xbe\x07\xd9\x0c\x2f\x6f\xb0\x88\x4a\x59\xa8\xd5\x8d\xde\x51\x16\xed\xc3\xbc\x34\x9d\x37\xc1\x60\xb2\x7b\xef\xbe\x5a\x5c\x18\x1c\xe7\x25\x63\x92\x35\x4d\x22\x1b\x58\xc4\x7e\xb0\xbb\x10\x92\x9e\x74\x21\x79\x5f\x4b\x7a\x7c\x27\x5e\xdd\x08\xc0\x88\x56\x87\x72\xe9\x93\x21\x8d\xd6\xf3\xc2\xcb\x4a\xc6\x57\xa0\xa3\xf9\x1f\x31\x26\xb9\x91\xad\xf6\xcb\xe7\xd1\xb1\x9b\x8c\xd8\x3b\xe3\x60\x2e\xd1\x8f\x03\x96\x33\xfb\xd2\x38\x7b\xda\x69\xe2\xcf\x03\x87\xd8\x64\x4d\x97\xb3\x03\xfb\x00\x63\x9a\xee\xe7\xae\x46\x3f\x6f\xe1\xa2\xc4\xb8\x9a\xeb\xa3\xe9\x09\x4c\x11\xfc\x29\x11\x4b\x20\x28\x3f\x28\x7c\x6d\xd2\x8c\xb0\x98\xda\xe8\xda\xbc\x48\xe8\x5b\xb5\x9c\x0d\xc6\xe7\x8c\x95\x66\x05\xcb\x7c\xf0\x69\x42\x35\x3e\x7a\x22\xe9\x6f\x80\xa3\x7a\x66\xf7\x18\xd9\xe4\xdb\x8c\x52\x45\x2a\xa0\xa3\x57\x72\xe8\x1b\xa2\xb3\x03\x20\x5b\x41\x2d\xd2\xbf\xc1\x5c\xe9\xb4\x36\xf9\x9f\xbb\x32\x12\x6b\x63\xce\x9c\xb4\x31\x99\xf1\x57\xd8\x17\x51\xa7\xc4\x93\x7d\x13\xaf\x4c\x58\x29\x52\xb5\xd6\x06\xb5\x55\xb0\x46\xbf\x1d\xe0\x6c\xf3\x9b\x63\xa8\x02\x87\x37\x18\x03\x60\x9a\x38\x7e\xe8\x0f\x3a\x5d\x88\xb9\xd6\x21\x96\x50\xed\x17\xd3\xcc\x18\x3b\x2c\x70\xd5\xeb\x94\xe3\xbc\x52\xae\xa7\xaa\x7f\x53\xbe\x0e\x20\xb8\x97\x2f\x14\x3d\x8e\x20\x16\x2e\x80\x3e\xdb\x4a\xa8\x3d\x55\x53\xfd\xd5\x53\x39\x8b\x0f\xa1\x76\xb9\x59\xcb\xa1\x40\xd6\xe9\x80\xc9\x25\x1b\x0f\xa0\xb6\x5e\x90\x84\x17\xf8\x2f\x45\x1f\xf9\xf2\xde\x6b\x9c\xa5\xe3\xb5\xf4\x1b\xa4\x0d\x05\xa5\x4f\x3d\xab\x48\x86\xaa\xcc\xa0\x5c\x9c\x27\x98\x13\x9a\x4c\xb3\x3e\x96\xa9\x14\x94\x74\x99\x10\xa1\x7c\xe8\xb3\x92\xfc\x0f\xc7\x76\x29\x74\xd7\x9d\x33\xdb\x92\x4b\xfe\xf8\x65\x5a\x72\x37\x76\xff\x87\xf9\x50\xfd\xc5\x68\xb1\xe5\x26\x53\x45\x41\xf5\x72\x72\x3b\x84\x06\x63\xc1\x91\x88\xc4\x24\xf7\xc4\x89\x23\x5a\x42\x4b\x09\xfe\x25\xc3\x07\x27\xea\x1c\xb0\x49\x53\xd7\x06\xd6\x8b\xfe\x12\x10\x0e\xf6\xf6\x4c\x35\xc6\xb8\xde\x67\xed\xf0\xe3\xad\x01\x4a\x40\x0e\x82\x1e\xa3\x40\x24\x32\x19\x99\x86\x7b\x43\xc8\x2c\x45\x01\x84\xb7\x8f\x74\x25\xce\xbd\x73\x19\xdc\x6f\x65\xd3\x60\x66\x5d\xfb\xe7\xc3\x66\x74\xda\xc3\xa5\x4e\x96\xda\x91\x0c\x02\xd3\x64\x07\x80\xb2\x2d\x51\x2c\xa0\xe3\xca\x35\x87\xb9\x4e\xa9\xfc\xd7\xa3\x1b\x4a\xf6\x9f\xd6\x20\x7c\x68\xfe\xd2\x5f\x89\x92\x1c\x1c\xdc\xde\xfd\x1c\x09\x02\x04\x49\x2b\xff\x9b\xbb\x52\xe0\x88\x85\x82\x9d\x01\x2b\xc2\xdf\xb4\xfe\x8c\x35\xe5\x9c\xd1\x3b\xcb\x8e\xad\x34\x19\x3c\x40\xb0\x3e\xe4\xd8\x25\xee\x13\x22\xff\x4e\xf0\x71\x27\x95\x74\xcb\xae\xe7\xc0\x7f\x14\xbe\x60\x6b\x9c\xd0\xe2\x61\x11\x1e\xf2\x0d\x96\x81\xd7\x6c\xf7\x8c\x89\xa8\xc3\x97\xd6\xb8\xdc\x77\x8f\x49\x84\x16\x6a\xd5\xdf\x3a\x81\xaa\xf2\xe6\xde\x09\xf7\x00\x19\x5a\xe2\xc1\xd4\x60\x96\x47"}, -{{0xd4,0xa7,0xa9,0x52,0x4d,0x30,0xa6,0x33,0x7c,0x0a,0x0b,0xe9,0x5c,0xa9,0x05,0x91,0xde,0x98,0x88,0x03,0x8e,0x3e,0x59,0xe1,0xb2,0x5a,0x41,0x81,0xef,0x94,0x66,0x29,},{0x9f,0xc3,0xeb,0xd1,0x39,0xcc,0x5b,0x7c,0x0e,0x05,0xaf,0x47,0xbf,0xf6,0x61,0x9b,0x81,0x28,0x15,0xbb,0x01,0xce,0xec,0x39,0x2a,0x3f,0xf0,0xae,0xc3,0x81,0x1d,0x2c,},{0xd1,0x57,0x88,0xbc,0xd8,0x8d,0x1d,0x81,0xb9,0xe6,0x1d,0x4f,0xe2,0x6e,0xa4,0x9e,0x66,0x81,0x9a,0x59,0xd2,0xae,0x48,0x32,0x32,0x1b,0x81,0x4d,0x50,0x62,0xfa,0xdb,0x87,0x80,0x7d,0xb6,0x85,0x2e,0x1d,0x82,0x95,0xe3,0x1a,0x29,0x1b,0x1e,0x78,0x5d,0x01,0xd8,0x34,0x89,0x5f,0x88,0xf4,0x00,0xdf,0x88,0x32,0xc1,0x60,0x7b,0x5b,0x0c,},"\x17\x19\x80\xc0\x3f\xdf\x7a\x72\x7b\xd5\xba\xb3\xba\x09\x45\xe6\xad\x5f\xaf\x0a\x7f\x50\x6a\x56\xd1\xd0\xed\xd9\xa3\x06\xb3\x15\x8d\x84\x32\x66\xd3\x09\x1f\xc1\xe4\x22\x81\xdf\x97\x55\x9a\x22\x01\xf5\xbd\xdd\xfe\x68\x3d\x0e\x10\x28\xd1\xd9\x5b\x2f\x31\x3b\x48\x4c\x39\x2f\xfd\xb1\xcd\xf8\x85\x08\xaf\xde\x3d\x6f\xd2\xa1\x28\x88\xba\xce\xde\xb7\x9f\xf3\xdb\x40\xc9\xac\x0e\xc3\xfb\x90\x1b\x22\x86\x98\xad\xf8\xd8\x45\xff\x4f\xce\x10\xde\x55\xd4\x24\x36\xdc\xe9\x30\x97\x3a\x34\xbe\x05\xd1\x40\x1f\x33\x4d\x4c\xe8\xe3\xa7\x93\x79\x9e\xaf\xdb\x94\xd0\xf2\xab\x09\x50\xb0\x79\xe6\x65\x3e\xeb\x49\x9f\xc7\x44\x7c\xcb\xee\xed\x8d\xbd\x54\x56\x80\x8c\xd7\xa3\x8f\x9a\x15\xa2\xa9\xc7\x38\xd6\x13\x34\xca\xb8\xce\xeb\xbb\xf4\xa4\x81\x4d\x94\xc6\x18\x59\x17\x87\x84\x60\x4e\x0c\x21\x54\x59\x7e\x72\xcf\x58\x7c\xd1\xf5\xda\xfe\x59\x22\x05\x18\x90\xe7\x6d\x61\x6d\x8c\xd5\xb0\x5d\x64\x78\xd0\x62\x6e\xa8\x3c\xe8\x08\xc4\x61\x43\xe6\xfb\x06\xb4\x18\x2d\x22\x8d\xa8\xf6\xd4\x13\x9e\xca\x5b\x8f\x3b\x1b\x98\xaf\x68\xc5\x9b\x4b\x5a\x53\xc1\x36\xee\x90\x43\x2a\xca\x2b\xb9\x15\x52\x9d\x26\x36\x79\x49\x82\x62\x33\xb4\x3e\x55\x80\x4b\x55\xfc\x9f\x21\x5e\xb0\xb0\xb7\x92\x91\x46\x5b\xb3\x4e\xda\xea\xdf\xfa\xbf\xe6\xcf\x41\xbc\x07\xb5\xdd\x4d\x01\x42\xf0\x36\x1f\x05\x8e\xe1\xb3\xb9\xfc\xc1\x96\xeb\x9b\x35\xb1\x34\xbe\x3d\x1d\x23\x20\x04\x48\x9e\x8f\x69\x93\xf6\x25\xa6\x30\x15\xbc\xd3\xf1\xe8\x75\x88\x32\x48\x58\xcc\xfb\x77\x0d\xdd\xd8\x94\xbf\x29\x7b\xd7\x63\xef\x58\x28\xe2\x1f\x5c\x89\xaa\x98\xcf\xbc\x1c\x08\x2d\xd7\xfb\xaa\x43\x07\xbd\xa4\x0b\x4a\x75\x8c\xa8\xf3\x9f\x4e\x4a\xae\xd3\x09\x04\x12\x68\xdb\xcf\x0a\xf3\x2d\xe0\xd7\xfa\x90\xa5\x23\x96\x3b\x78\x0b\x6a\x93\x2c\xf8\x94\x99\x02\x5f\x0e\x0d\x04\x74\xc7\x43\x48\x94\x75\x10\xe6\xc5\xec\x7c\x9e\x05\x06\x6e\xeb\x4a\x73\x52\x0c\x3d\x92\x7c\x39\xac\x26\xad\x75\x96\x32\x5b\x2c\xc4\x7c\x5e\x82\xa7\x75\x45\x5b\x7a\xf0\x31\x20\xb1\xcf\xbf\xd6\xec\x3f\xc0\xc3\xbe\x60\x78\xb0\x0c\xfd\xf8\x34\x2a\xe8\xbf\x14\x71\x59\xf5\x0e\x9d\x56\x4e\x2f\x68\x30\x6d\xae\x3c\xae\xdd\x10\x19\xf3\x23\xc4\x78\xa1\xe1\xf6\x75\x98\xdd\x83\x4b\xd1\xd1\xa8\x73\x3f\xd7\xfd\xd8\xa8\x76\x52\x6c\x53\x15\x18\x93\x6e\xdb\x72\xd0\x16\x56\xb3\x44\xc7\xd6\x5a\xc1\xce\xe3\x7c\xe5\x99\x7b\xa4\x8d\x3f\x4d\x06\x4d\x88\x05\x7e\xfe\x9a\x48\x2d\x9e\x00\xab\x5c\xae\xb5\xac\xa2\xd6\x60\xe3\x37\xbd\x15\x48\x73\x65\x69\x79\x56\xa5\xe4\x7b\x02\xab\xdc\x30\xd8\xe3\x53\xfe\xd4\xe1\xac\x41\xd2\xbc\x21\x20\x02\x11\x43\x63\x59\x35\xc6\x20\x18\x6a\x52\x2b\xde\x54\xbe\x04\x46\xfb\xd2\xdc\x88\xb5\x63\x04\xb3\xa6\x42\x27\xd0\xac\xd5\xf8\x5a\x6b\x67\x87\xa3\xad\xcf\x2d\x7c\xfc\x86\xc6\x34\xb4\xd7\xab\x43\x15\xb9\x7d\xe9\xe6\x66\xcf\xf3\xff\x1b\x88\xf3\x29\x5e\x7b\xab\x9e\x9f\xd4\x6f\xaf\xdd\xb4\xf5\xfa\xc5\x1c\xc0\x17\x01\x29\xc6\x51\xb4\xef\x4d\x39\x50\xd6\x94\x2f\xf0\x20\xd1\x66\x8a\x52\x8b\xde\x1d\xa9\x36\xc0\xec\x1a\xe0\x9e\x84\xf8\x20\x58\x61\xff\xf4\x91\x50\x2a\x87\x2c\x81\x54\xa9\x6e\x7e\xa2\x5e\xda\x95\x5a\x7f\xd2\xe4\xb4\xc7\xa8\xd2\x73\xf6\x0b\xc7\x4f\xab\x7b\x49\x68\xca\x6f\x75\xda\xea\x50\x40\xf8\x39\xfd\x56\xc2\xa9\x80"}, -{{0xd0,0x8f,0x4b,0xab,0xba,0x3b,0x53,0x65,0xfa,0xf7,0x38,0x79,0x5c,0x9d,0xa4,0x5d,0xb1,0x86,0x2c,0xb2,0x8b,0x93,0xeb,0x66,0x35,0xd1,0x32,0x0d,0xa0,0xf4,0xd9,0x37,},{0xef,0x31,0xb4,0x54,0xf7,0x34,0xe5,0x2b,0x34,0x38,0xee,0x2f,0x1c,0xbc,0x35,0x63,0x1b,0x19,0x69,0xde,0x54,0xac,0x98,0xfe,0x46,0x33,0xf2,0xf5,0x00,0xac,0x87,0x12,},{0xac,0xeb,0xe4,0xc8,0x6f,0xa9,0xfe,0x2c,0x1a,0x5c,0x57,0x6a,0xc0,0x50,0x1e,0x8a,0xb0,0xf6,0x40,0xfa,0x40,0x38,0x05,0x36,0xfc,0xf9,0x50,0x59,0xd5,0x3d,0x4a,0x35,0x55,0xd2,0x20,0xac,0x36,0x35,0x87,0x17,0x5e,0x4b,0xde,0x16,0x3c,0x0d,0x00,0x65,0x0a,0x12,0x96,0x3d,0x46,0x76,0x6c,0x99,0xbb,0x62,0xbf,0x75,0x73,0xe2,0x87,0x0c,},"\xa3\x94\xd8\x85\x4c\xeb\x5c\x43\xaf\xee\x1a\x48\x92\x6b\xbd\x66\x85\xaa\x8a\xec\xfd\xcf\x85\x41\x33\x33\x39\x74\xd6\x24\xbf\x2f\x1f\x9c\x30\xf0\x05\xbb\xf3\x4c\xee\x3a\xfe\x2b\x29\x06\x00\xee\xae\x6f\x1d\xd1\x2a\x0c\x34\x6f\xbb\x2a\xb9\xc9\x16\xc5\xd5\xd8\x0d\xcd\x87\x88\x78\x75\xa0\xac\x84\x76\x78\x03\x9f\xdc\xd3\xa9\x79\x35\x41\xf5\xd6\x75\x14\x3a\x6a\xba\xdc\x3b\x18\xf0\xfe\xf5\x10\x8c\x19\xc2\xdb\xfb\x59\x71\x0e\xef\x98\x66\xa4\xf3\xf2\x97\xa0\x9e\xe4\x8c\x68\x03\x00\x7d\xd6\xba\x8f\xd4\xbe\x84\x1c\xfb\x10\xff\x05\x14\xc3\x0f\xc4\xdd\x49\xa3\xcd\x43\xbb\xd1\x6e\x46\x04\x43\xa1\x1a\xfe\x64\x9e\x90\x1d\x63\xd8\x9a\xf5\x98\xaa\x68\x6b\x2f\x60\x7e\xc1\x1f\x35\xe1\x7a\x79\x8a\x42\x13\xb7\x5a\x38\x78\x8d\xa4\xf2\x7c\xf2\xb0\x2c\xad\xdf\xe6\x1c\x37\x29\xa8\x7e\xc6\xe6\xb0\x98\xf6\x8e\x7a\xed\x28\xa8\x00\xc4\x84\xdf\xa0\x13\x04\x01\x20\x8f\x98\x6d\x79\x2f\x54\x63\x5a\xdd\x28\x48\xe1\x51\x26\x2a\x36\x5e\xb2\x1e\x27\x27\x19\x1e\x1f\x70\x0f\x3b\xf5\xc7\x3b\x0f\xb4\xc5\x46\xd0\x04\x8a\x15\x5c\x18\x71\x79\x20\xfc\x04\x25\xc8\xc8\xfa\x8f\x16\x7c\x43\xa2\x77\xbb\x36\x6e\x0a\xd7\x02\xc8\x9b\xc5\xaa\x06\xfd\x47\x09\x43\xbe\x05\xcb\x9e\x32\x59\x78\x72\x29\x71\x4c\x30\xa4\xe8\x7b\x00\xa6\x33\xaa\xf7\xbe\x6b\x58\x75\x01\x0d\x12\xe1\x07\xc9\xa5\x26\x1c\xa5\x62\xd6\x70\x25\xbe\xa0\xfe\x22\x34\x63\xed\xb9\x2e\xa0\x1c\xca\x92\xc4\x4f\xf2\x4d\xa9\xd8\xa8\x0a\x64\x21\xf3\xd4\x13\x5d\x64\x7d\x1b\xb0\xfd\x98\x8c\x46\xc8\xa1\x70\xce\xb4\xf3\x3f\xff\x9c\x0f\xfb\x6a\xba\xd1\x09\x2c\x84\xdf\xad\x82\x90\x89\x8b\x24\x95\x16\xa2\x92\xe8\xda\x96\xfd\x51\xa8\x10\x05\xee\xcf\xde\xbb\x05\x93\x30\x99\x27\x7d\x07\x3a\x48\x0c\x3f\x9e\xb8\xaa\x11\x96\x8c\x4d\x8d\xc0\x78\x7a\x9a\xec\x3e\x05\x27\xb7\xfe\x4c\x06\x35\x41\x13\x35\xa1\x81\x16\x89\xe8\x8f\x6d\x5c\xed\x0d\x40\xd6\xb4\x8b\x7f\x2d\x99\x29\x52\x93\x48\x94\x15\x30\x76\xa8\xd3\x73\x72\xfa\x00\xd9\xce\xfc\x5c\xf8\xc2\x6a\xdb\x5a\xcf\x32\x5a\x01\xcd\x00\x5a\xb8\xd4\x74\xa5\x2d\x67\x11\x40\x78\xc6\x51\x6a\xef\x80\x4b\xba\x19\xb8\x87\xa2\x8e\xd5\xe4\x6e\xe9\x99\x5e\x5a\xd3\xa8\x2f\xb9\xcd\x93\x28\x34\x33\x68\x09\x21\x11\x4b\x4d\x9a\xf8\xfc\xb6\xb2\xb5\x35\x83\x9c\x36\xde\x8d\xf1\x2b\x17\xea\x6d\xdc\xfc\xb3\x33\x4f\xf4\x0e\x6c\xf0\x4c\xcd\x5c\xa6\x40\x3b\xa0\xb6\x2b\x4c\xb7\x1b\xbd\xe9\x1d\x8b\xab\xda\x69\x15\x2c\x9c\x93\xae\x76\x9b\x55\x29\xc8\xd5\x2f\xd9\xa6\x90\x9a\x15\xe1\xa0\x60\x1a\x71\x46\x49\xc9\x6e\xc9\x96\xc1\x70\x6d\x10\x21\xb9\x74\x87\x98\x0d\x7b\x2c\x2a\x39\xbb\xb0\xe4\x70\xd8\xe4\x6a\xc4\xaa\x60\x9a\x09\x22\xc9\xbd\xc0\x16\x12\xea\xde\xac\xcd\x5f\xa5\x23\xb2\xa8\xd0\xe6\x2f\xfe\x56\x28\x16\x47\xd6\x1f\xff\xbb\xc8\x40\x53\x57\x45\xd1\x44\x25\x9c\xc8\x13\x00\xfe\x99\xdf\xbf\xfe\xa6\xb0\xb9\xbc\xd2\x84\x73\x98\x2d\x32\xe9\x3e\xd4\x66\x34\xa9\x98\x79\x06\xd6\xf4\x89\x39\xd8\xdf\xbf\xb3\x7d\x33\xb8\x88\xdb\x60\x8c\xb2\xff\xe3\x9a\x8c\xf6\x7b\x72\x64\x46\x11\xc7\xd3\x2a\x4a\x8d\xf6\x12\x46\x8c\xd5\xe5\xd7\x5f\xbb\xa7\x9e\x63\x8a\xa1\xda\xa2\x8c\x4e\x0e\xeb\x9a\x63\x7f\xf8\xa0\x8b\x65\xf7\xa7\x61\x24\x14\xdf\x76\xbc\x7b\x0b\x56\xb5\x53\x7d\x66\x6f\xac\xfd\xda\xf6\x5a\xf1"}, -{{0x8f,0x47,0x4f,0x88,0xcf,0x86,0x3c,0x48,0x54,0x56,0xa5,0xa2,0x15,0x52,0x81,0xff,0x27,0xb2,0x84,0x59,0xf6,0x3b,0xc4,0xf1,0xdb,0x00,0xe0,0x03,0x10,0x64,0xf6,0x49,},{0x43,0x14,0x4a,0x32,0x9d,0x75,0x1d,0x04,0xe0,0x71,0x69,0xb7,0x79,0xee,0x92,0x0d,0xd0,0x29,0xcb,0x44,0x5b,0xf3,0x76,0xba,0x3a,0x66,0x85,0x72,0x18,0x23,0x44,0xa3,},{0xf6,0x1f,0x78,0x07,0xc3,0x3e,0x19,0x6d,0x0f,0xe1,0x82,0xef,0xa4,0xd4,0x51,0x6a,0x98,0x15,0xdd,0xd4,0x49,0x53,0x8b,0xba,0xa6,0xb8,0x6b,0x69,0x01,0xa0,0x5f,0x5d,0xdd,0xa0,0x60,0x1e,0xc9,0x0f,0x39,0xf1,0x55,0x47,0x79,0xdb,0x7a,0x09,0xa6,0x05,0x72,0xef,0xfd,0x4d,0x12,0x8d,0x0d,0x3c,0x2d,0xd4,0xe8,0x83,0x57,0x4b,0xc6,0x0b,},"\x84\x08\x91\xd9\x48\xec\x19\xc8\xc7\xf7\xc9\xd3\xc4\x77\x53\x62\xa5\x44\xa0\xec\x97\x45\x7a\xb5\xd1\x4e\x12\x5d\xc5\x4b\x59\xc8\xdc\x9a\x63\x5e\x7b\xad\xb6\xbe\x73\xc3\xa5\x8d\xc0\xe9\x92\x9f\x2b\x42\x0d\x83\x56\xd6\x17\xc3\xd4\x1b\xfe\x69\xb4\xe1\x58\xd4\xbf\x08\xfb\x17\xe6\x88\xd3\xcf\x3c\x94\x8b\x69\xb3\x5f\x0b\x6d\xb6\x62\x72\xa8\xeb\x2b\xd4\x10\xd6\x50\x9f\x6c\x82\x8b\x6a\x20\xd6\x58\x6e\xaf\x85\x76\x01\xed\x9d\x60\x54\x79\x9c\x25\x32\x0e\xba\x80\x77\xfe\x1a\xe2\x26\x71\xb3\x3a\x15\x88\xff\x2b\x23\x5d\x3c\x71\xa2\x7c\xe5\xc6\xc6\x6e\x18\x88\x91\x98\xd1\x16\x93\x36\x76\xbc\x4f\xb0\x71\x0d\xb7\xff\x1a\xc2\xf2\x0c\xe3\x69\xbe\xf5\x6b\x43\xcd\x1d\x40\x6c\xef\xda\xcf\x00\xf1\xf3\x48\xb8\xca\x7a\xa6\x14\xdb\x11\xa3\xa6\x40\xfd\xb5\x93\x89\xd1\xa6\xa3\x94\x75\x5c\x13\x3f\x1b\x01\x9c\x83\x08\xca\x5a\x95\x1e\x73\xb8\x10\xa1\x80\xf6\xff\x25\xb2\x9d\xbb\xcc\xef\x4c\x13\xa9\x75\x03\x39\x39\x07\xa2\xdb\xa0\x96\xa8\xce\x5c\x86\xc0\xee\x6f\x97\xc1\x44\x1b\x8d\x63\x31\xcb\xa5\x3b\x19\x60\x6b\x42\x1a\xf5\x2f\x65\xf9\xc6\x63\xe6\x3d\x39\x82\x71\x8f\x94\x8c\x6b\xae\x96\x1b\x8e\x4b\xf8\xcd\x9e\x31\xcd\x09\x92\x8e\x4e\x80\x61\x65\x97\xcc\xfa\xdc\xb8\xa6\x14\x15\x49\x33\xbc\x37\x58\x9c\x85\xc7\x76\xe3\x4e\x5a\x90\x66\x0f\x59\xa6\x5b\x5e\x93\xad\x43\x88\x42\xf9\x82\xd0\x2b\x04\x1e\x6d\xbd\xdf\x17\x10\x99\xf8\xdb\x70\x99\x57\x31\xa0\xdb\x8c\x46\x25\xc9\xbc\xa7\x10\x80\x59\x61\xfb\x17\x6d\xae\x81\x97\x68\xfc\xad\x7f\xf9\xbf\xce\x36\x40\x3c\xa7\xf7\x83\xe7\x61\x37\x26\xd7\xdc\x59\xf2\x4e\x24\x7c\xf1\x50\x68\xff\x3b\x19\xc7\x25\xfa\xd6\x5e\xa8\xe8\xa7\xf7\x22\xd5\x28\xc9\x5f\xce\xf1\xc0\xcc\x79\xd1\x8e\xf0\x7c\xee\x8b\x01\x1e\xea\xbd\x99\x21\x63\x4d\x76\xa6\x1a\x8a\x3c\x89\x31\xb8\x27\xe8\x18\x98\x81\xf8\x1f\x7a\x17\x5f\x21\xfb\x03\x78\xb8\x18\x8e\x58\xbd\xb2\x01\x7b\xef\x39\x0f\x18\x00\xd9\xd7\x4f\x26\x3a\x81\xdf\x8e\x67\x52\x2d\x09\x2e\x77\x5d\x01\xe0\x04\xe7\xf8\xd8\x28\x1a\xe2\xc2\xfd\xf8\xc3\xa4\x45\xf9\xef\xf7\xfd\xf1\x3f\x26\x1a\x77\x3d\xdf\x2d\xd9\xcc\x6b\xa5\x58\x5d\x99\x0c\x99\x5e\x6e\xb8\x9d\xff\xd9\xff\x0a\x9d\xbb\x76\xce\x5e\x10\xdd\x02\x72\xd5\x00\x14\x97\x88\x13\x66\xf5\xd6\x36\xa9\xcc\xea\xa2\x83\x22\x8d\x3a\xc6\x14\xdb\x21\x7a\xb8\x91\xd6\x68\x9d\xbe\xb9\x50\xe1\x20\x0c\x3d\xe5\x3b\xc5\xda\x07\xf1\xd3\x63\xda\xe9\xbe\x6e\xc3\x6e\xda\x6e\x68\x7d\x26\x29\x0f\x7a\xbc\xa2\x68\xa7\xfa\x03\xd9\x31\x88\x64\xed\xa9\xa1\x1e\x3b\x26\x14\x06\x05\x92\x0a\xc1\x3a\xde\xc1\xb5\x54\x8c\x9a\x7a\x32\x15\xa5\x87\x6b\x7e\x94\x1a\xfa\x1c\xb5\xd7\xf7\xf0\xc1\x16\x30\xcd\x42\x9f\x3b\x2b\x37\xdc\x76\xc6\xcb\xea\x4f\x3b\x72\x6a\xa8\xa5\xf8\xb9\xf7\x05\xb0\x5d\x7e\x94\x51\x95\x6f\x8a\xf1\x3c\xe0\xa8\x59\x55\xc7\x13\x5d\x64\xad\xe5\x49\x6e\xa5\x42\xe7\x0f\x8d\xa5\xb5\x73\xaa\xf1\x37\x08\x5d\xc9\x6c\x69\x27\x09\x96\x95\x67\x26\x68\xb3\xc7\xc6\xf9\x3c\x97\x7a\x4e\x8e\x9e\x77\x02\x95\xf2\x0d\x52\xdf\xf1\x87\xf8\xdb\xb2\x5e\xe7\xe7\x74\x02\x4e\xb9\xbe\x08\x12\x1e\xd7\x4b\x6d\x54\x62\xf4\xbb\x7d\xc2\x00\x38\x74\xca\xa3\x1b\xb7\x59\x5c\xd9\x3a\x99\xeb\xe1\xef\xf9\x28\xbb\x5f\xcb\x9e\x9c\x89\xdd\x31\xd4\x87\xfc\x0e\x20\xbb\xe1\x50"}, -{{0xe4,0x2b,0x30,0xd4,0x9c,0x43,0xc4,0xfa,0xd8,0x3d,0xd5,0x1f,0xdc,0x2a,0x4a,0xc5,0x90,0x13,0x27,0xad,0xd8,0x00,0xb6,0x69,0x72,0xc8,0xc7,0x0b,0xde,0x18,0x0a,0xdc,},{0xf7,0x34,0xaa,0xfa,0xa4,0xdb,0xaf,0x31,0x5c,0x25,0x8c,0xca,0x8b,0xbc,0x1d,0x4f,0x34,0xe8,0x36,0x01,0x10,0x98,0x74,0x22,0x2a,0xa0,0x55,0x89,0xf3,0xa6,0x63,0x5f,},{0xff,0x8e,0x07,0x6e,0x34,0x3c,0x8b,0x73,0xaa,0x45,0x3b,0xfe,0xe9,0xb2,0xba,0xb6,0xd5,0xc2,0xf7,0x4c,0x35,0xe1,0xba,0xd1,0xe5,0x2a,0xe7,0x77,0xd6,0x9f,0x79,0x76,0x40,0x83,0xf9,0x94,0x36,0x8a,0x1a,0xc8,0x51,0xa6,0x41,0xcd,0x24,0x70,0x08,0xa3,0x4f,0x3b,0x60,0x89,0x62,0xf4,0xdd,0x51,0x09,0xac,0x71,0xcc,0xe9,0x78,0xec,0x02,},"\x0d\x49\x70\x51\x86\x1e\x22\xd8\xa9\xc6\x0e\x5f\x7d\xe6\xc8\x95\xcb\xa3\x35\xb2\xe8\x2e\x60\x21\x18\xad\x83\x42\xb4\xd4\xed\xaa\x80\xf9\x5e\xfb\xb5\x9c\xfd\xa1\xfc\xc0\x29\x17\x25\x70\x0e\x8a\x81\xbb\x12\xa0\xb8\x62\x3b\x1f\xe2\x89\x1b\x8d\x98\xf7\xa8\x4c\x59\xfd\x92\xf8\xa7\xad\xfc\x06\x50\x42\xf7\xf4\xfd\x7e\x1a\x79\xf5\x5a\x1d\x4d\x5e\x54\xe0\x4e\x67\x2f\x1c\x9e\x4c\x4c\xd8\xd0\x00\x3f\x3c\xd5\x4b\x76\xe2\x16\x3d\xd7\x37\xac\xb2\xde\x5c\x26\x3a\xc1\x02\xa4\x8f\x69\x6b\x60\xca\xf9\xbe\x39\xc6\x65\xcc\xe1\xe0\xf3\xd4\x98\x55\x3f\x57\x90\x61\x88\x9a\x5e\xc5\x60\x3e\x4d\x14\x1c\xfd\xed\xe8\xe7\x31\x75\x72\xcf\xe7\x6a\x0f\x48\xe4\xae\x06\x06\x2c\x91\x57\xb5\xea\xac\x34\x68\x93\x81\x92\xdb\x4b\x16\x10\x5c\x73\x64\xa9\x44\x32\xb2\x15\xa7\x17\x97\xfe\xe1\x4c\x3c\x9c\xe2\xf7\x46\xed\x79\x03\x02\xfc\x41\xdc\x49\x2d\x37\xd9\xef\x02\x4a\xb5\x1d\xa3\xbd\xaf\x0f\x81\xd9\xa9\x30\xaa\x0e\x02\x5c\x04\xfd\x71\x02\x6b\x6a\xfe\xb7\xed\x01\xa9\x1a\x1e\xfd\x6c\x39\xf5\xe4\x47\xc6\x6d\xd3\x8a\x76\x56\xc6\x13\xd0\x21\x26\xf3\x58\x5d\xfa\xa0\x2d\xf9\x30\x25\x3f\x83\xbd\x42\x19\x64\x63\xeb\xc5\x0f\x8c\xfc\x94\x9e\xd3\x50\x39\x2e\x61\xce\xec\x13\x09\xda\x15\xa4\x32\xf8\x0d\xfe\x94\x8e\x26\x1c\xe6\xd8\x42\x1c\x54\x59\xcd\x21\xf3\xff\xa2\xed\xb5\x00\x98\x2b\x2a\xbf\xa5\x2e\x82\x43\x7c\xa2\x30\xf6\x09\x11\x63\x20\xd9\x89\x3e\xb8\x2a\x14\xdf\x72\xb7\x73\x66\x67\x51\x6f\xc0\x12\xb2\x8a\x03\xc9\xdd\x88\xea\x43\x08\xd8\xce\xea\x44\xcc\x60\x44\x54\xcd\xfa\x2c\x79\x76\x15\xbc\x0a\x6b\x3e\x00\x89\xaf\x0a\x81\xbe\x54\xd1\xb1\x10\xa1\x3a\xb9\x11\xb4\x52\xc3\x42\x80\x0c\xee\x2a\xd2\x39\xa2\xb1\x88\xa7\xfa\x87\x5e\x94\x1d\xaa\xeb\xcf\xc8\x8b\x70\xae\x4b\x1c\x57\x5c\xdb\x6e\x6d\x89\x44\x81\x36\xf6\x0e\xe8\x1c\x70\x3c\x47\x82\x2d\x2c\x0e\x50\xc7\xf1\xe8\xb7\xfc\x7e\xbd\x80\x78\x9f\xcd\x7e\x06\xc7\xe5\x0b\x5f\xc8\xb7\x76\xe8\xb9\xa4\xcd\x59\x05\xa2\x90\x69\xbc\x3a\x55\x8d\x7c\xab\xce\x2a\xf4\xf3\x10\x76\x7d\x5b\x11\x7e\x30\x76\xb3\xa0\xd5\x27\x17\x55\x43\xb2\xcc\xea\x28\xd5\xf7\x16\xfa\xc3\x2e\xfe\xd3\xd2\xe0\x27\x6b\xe4\x4a\x89\x56\xfc\x82\x40\xf2\xdb\x33\x97\x61\x4f\x2f\x2d\xa0\x21\x66\x69\x4e\xc6\xa7\xfe\xec\x6e\xce\x39\xd7\x2b\x64\xbb\xc6\xb4\x76\xa4\xf8\x4f\x8d\x87\x93\x80\xa3\x84\x88\xe4\xd6\xe5\x8c\xac\x03\x90\xae\x25\xa5\xfc\xb7\x3d\x47\x41\x4b\x4c\x26\xbb\xb9\xb4\xcc\x66\xe4\x25\x94\xbd\x56\xd8\x41\xa3\x60\x92\x34\x91\xd1\x17\xbe\x2c\x6e\xb2\x32\x0f\x3c\x61\x75\xe4\x4e\x27\xb6\x65\x3c\x5d\xac\x6f\xae\x73\x60\x0b\x67\x96\x0d\xca\x50\xaa\x85\x5a\x89\xe0\xff\x51\x1e\xa0\x4f\x14\x3e\x89\xf1\xda\x02\x84\x76\xbe\x4b\xf6\xd9\x4c\x80\xff\x72\x63\x39\xe8\xbc\xfb\x7d\xd9\xf8\xcf\x20\x22\x59\xc0\xac\xb6\x27\x6c\x28\x1e\x38\x47\xc2\xcc\x8d\x2f\xba\x84\x43\x8d\x2d\x3c\x60\x31\xf2\xa7\xb9\x5c\x1d\x8f\x9f\x3c\xc8\x6a\x5e\xff\x65\xcc\x01\x1d\xe9\x5a\xd8\x96\x85\x8e\x1f\x7f\x6d\x6b\x94\xbf\x49\xdf\xff\x5d\xe2\xd7\xfd\x71\xef\x10\x81\x34\x28\x5f\x61\xae\x47\x54\x83\x44\x2d\xc9\x0b\xf0\x13\xfa\xed\xf3\x77\x1c\x47\xc5\xb9\x6d\xc3\xcf\x8e\x48\x51\x00\x60\xad\x8d\x45\xfd\x54\x61\x62\x27\x80\xd8\x69\xd4\x61\x7b\x57\xfe\x3c\xb5\xcc\x02\x03\x15\x3a\xae"}, -{{0x5c,0xb5,0x14,0x21,0x74,0x82,0xbf,0x42,0xf6,0x11,0xfc,0xec,0x36,0xa5,0x28,0x68,0x07,0xc2,0xbd,0xbb,0x56,0x96,0x76,0x91,0x35,0x3f,0x54,0x31,0x0e,0x1a,0xd5,0x53,},{0x28,0x06,0x99,0x00,0x3d,0x5d,0x3e,0x1c,0x05,0xad,0x10,0xfb,0x10,0x95,0x9b,0xbc,0x59,0x5c,0xfe,0x21,0x30,0x69,0x96,0x5c,0xd8,0xcf,0x39,0xdd,0x42,0x6a,0x05,0x68,},{0xd5,0x3e,0xe2,0xe0,0xf0,0xfd,0x65,0x7b,0x20,0x52,0x47,0x8f,0xd1,0x5d,0xf1,0xd3,0x8f,0xe0,0xe9,0x3a,0x54,0x83,0xeb,0x4a,0x6e,0x7d,0xe9,0x3d,0x02,0xa4,0xcd,0x54,0x4d,0x8f,0xdd,0xdc,0xea,0x82,0x2b,0x71,0x57,0x6e,0xd0,0x28,0x53,0xd9,0xa6,0xb1,0x4e,0x1a,0x54,0x8a,0xef,0xe9,0x0d,0x92,0xf8,0x83,0x79,0x2b,0x7f,0x1d,0x86,0x09,},"\x2f\x57\x25\x8c\xca\x79\x32\xe5\x8b\xed\x54\x6c\xb0\x04\x11\x15\xbb\xad\x23\xd1\x83\x46\xef\x7a\xb5\xe3\x11\x00\x82\xb3\xa9\x71\x2f\x6c\xbe\x12\x70\xe6\xdc\x0c\xea\x33\x64\xa0\x6a\x5f\x2f\x28\x3e\xc3\x9b\x63\x05\x8d\x34\xd5\x99\x79\x07\x2f\xcb\xbd\x7a\x5d\x0f\x44\x2b\xbd\xf0\x82\xd5\xbf\xe2\x99\x8a\xeb\x51\xbd\x26\x12\x78\x03\xe5\xc7\x96\xc3\x88\x43\x20\x0a\xe2\xf6\xe6\x05\xaf\x31\x2f\x54\xfd\xff\x17\xed\x1d\xfa\xa8\x9d\x28\xfa\x67\xdc\xe4\x62\xde\x4f\xe2\x52\x68\x21\x2b\x28\x2e\x22\x2a\x44\x3e\x2f\x31\xe2\x69\x05\x41\x71\xaa\x73\xc7\x19\xa8\x96\xcd\xb7\xa5\x39\xdf\xd1\xd4\x29\x91\x97\x81\x97\xd7\xc4\xf2\xd3\x0a\x64\x1b\xe3\x4b\xf1\x38\x0a\x4f\x4d\xc6\xd9\xb1\x01\x63\x66\x36\xa4\x96\xbe\xb3\x57\xe3\x47\xc1\x66\x65\x16\xdf\x8e\xb5\x60\xa0\xe0\xd1\xe1\x52\x9c\xe3\x6a\x60\xe0\x0e\xd2\x78\xda\x38\x02\xbe\x19\x23\x42\x98\x9b\xb6\x11\xb4\xe3\xcb\xd9\xc3\x7e\x8c\xce\x07\xef\xc1\x2d\x29\xbe\xfd\x7e\x2f\x3a\xdb\x13\xd2\x8f\x70\x8d\x97\xb6\x3e\x10\x74\x82\xc8\x62\x95\x6d\x7c\xe8\xdf\xc2\xaf\x5c\xac\x8d\x51\x65\x92\x67\xb0\xbb\xed\xdd\x5e\xfa\x41\x4d\xde\xab\xd1\x7b\x23\xca\x6e\x84\x3f\xf4\x9e\xff\xc8\x2a\x5d\x07\xe3\x6a\x83\xb6\x7c\x2a\xd7\xe4\x8e\xb9\x99\x0b\x42\x1c\x55\x58\x00\x9b\xd6\x93\x4e\x86\xd5\x4a\x8a\x6a\xc4\x07\x87\x96\xe3\x05\xc7\xcc\x81\x0d\x3f\x66\xea\x6b\x95\x04\xfe\x0a\xe6\x75\x7c\x50\x4c\x55\x52\x53\x0a\x6f\x8b\xbb\x52\x40\x9b\xe0\x79\xd8\xe4\xa2\x8a\x6f\xd7\xdc\x89\x35\xf8\xeb\x94\x98\xad\xc0\xf2\x3d\x08\x07\xec\x86\x29\x5f\x48\x98\xf5\xd0\x5e\x15\x0b\xdc\x43\xaa\x8b\x7b\xdc\x89\x3a\x0a\x68\x4c\x30\x63\x89\x8b\x6c\x95\xe7\xd5\x6a\x4c\x10\x26\x90\x43\x8e\x9d\xf9\x97\x58\xa9\x0f\x47\xc6\x08\xda\xcc\x4c\xa2\x40\x26\x6f\xab\xa3\x5f\xa1\xeb\x2e\xaa\xbe\x28\x8d\x2c\x2a\xd5\x0b\x6c\xbf\x10\x7c\x00\x25\x75\xe9\x1f\xf4\x72\xa4\x41\x79\x40\x66\x7b\xe8\x18\x01\x73\x85\x4c\x93\xdf\x84\x46\x4b\xcd\x31\x2b\x7a\x7a\xe4\xdc\x2b\x90\x59\xfb\xe6\xf8\x3f\x53\x80\x64\x25\xbd\xff\x03\x1c\x6a\xed\x6e\xfa\xfd\x9d\xe8\xdc\xd0\xdf\xab\xea\x8e\x6f\xa6\x81\xe9\x91\x93\xfb\x3c\x64\x7e\x44\x21\x12\xc9\xa2\x3f\x59\x6e\x65\x41\x1d\x8d\x6b\xfc\x39\x23\x00\x4e\xce\x91\xea\x6d\xeb\x88\x11\x11\xb1\xdc\x29\x94\x3f\x57\x89\x81\xee\x8c\x3b\xce\x85\x25\xf7\x85\x65\xf3\x4b\x85\xff\x20\x01\x5f\xea\xe8\x46\xf9\x5b\x18\x70\x0b\xc5\xcd\xf1\x4b\x2d\xb6\xca\xc6\x98\x14\xd6\x3d\x74\xbf\x20\x32\x93\x03\xe5\xca\x9f\x04\x73\x1f\x68\x81\xce\xc6\xd3\xab\xf8\x7f\x5e\xac\x08\x73\x4f\xaa\x34\xcf\xf4\xd3\xcd\x9a\x4a\x11\xd7\xb1\x2f\x73\x25\x3b\x4d\xd0\xa4\x31\x78\xf0\xd3\xc1\x9c\x0c\x40\xd9\xed\x91\x8d\xd1\x76\x46\xf6\x16\xaf\x79\xfd\xf6\x19\x42\x62\xf0\xfa\x4f\x71\xb3\x18\x7d\xed\xca\x48\xd9\xcb\xcc\x19\x93\x1a\x15\x19\x67\x74\x56\x25\x6e\xd3\x83\x54\x56\x7c\x3a\x67\x57\x1c\xdf\x82\x17\x0a\x2c\x85\xbd\x2c\x5e\x68\xe0\x5a\x0f\x3b\x93\x90\x3f\x19\x1b\x89\x4f\x84\x94\x6f\x89\x00\x05\x68\x05\x4c\x1c\xea\x9f\xd0\xb8\xbb\x55\x01\x95\x06\xc5\x43\x41\xc2\x49\x31\x98\x45\x48\xba\x45\x8a\x4d\x81\x30\x89\x89\x6e\x86\xa2\xdc\x33\xd9\x46\x04\x00\x3f\x35\x4a\x7c\xc9\x41\xc7\x54\xaa\xea\x24\x25\x3c\xbe\x4c\xf2\x14\x7f\xfe\xc5\xe7\xb9\x50\xcb\xf2\x8e\x28\x44\x81"}, -{{0x87,0xd3,0xba,0x95,0xc4,0x0d,0xf8,0x00,0x69,0xb1,0x79,0x7d,0xdf,0x68,0xe8,0x66,0xe6,0x6d,0x46,0xc5,0x1f,0xde,0x60,0xe7,0x68,0xa9,0xdb,0xc5,0xc9,0x2f,0x57,0xa9,},{0x2b,0x81,0x2b,0x2c,0x9b,0x60,0xff,0x31,0x97,0x5c,0x42,0x9a,0x86,0x73,0x6d,0xcc,0x17,0xa5,0x8d,0x3d,0xc1,0xda,0xa3,0x46,0x23,0xa4,0xbb,0xcb,0xe2,0xcc,0x05,0x81,},{0xfa,0x0d,0x12,0xcd,0x53,0x23,0x6c,0x41,0x08,0x6b,0xea,0x8c,0x0c,0xc6,0x0b,0x77,0x64,0xa3,0xed,0x72,0xbd,0xeb,0x9d,0x1a,0xe5,0xee,0xac,0xb4,0x88,0x11,0xfe,0x52,0x97,0x62,0xa2,0xc6,0xf2,0xbb,0x06,0xd9,0xb3,0x18,0x21,0x8d,0x96,0x8f,0x64,0x44,0x35,0x49,0x7a,0x1b,0xd0,0xd0,0xd8,0xc1,0x61,0x2a,0xb8,0x99,0x6d,0x98,0xd7,0x07,},"\xe1\x12\x56\xf8\x2a\xd7\x6f\x3f\x4a\x49\xd7\xba\xd3\xce\xd8\x71\x8d\x36\xd2\xf2\xbb\x3d\x31\xbb\x61\xed\xd1\xec\xbc\xee\x66\x21\xfd\x2e\xee\xd3\xe3\xde\xb5\x97\xb1\x49\xff\x71\xb8\x51\xf6\x1c\x8c\x68\x19\xe1\x31\xf9\xa2\xaf\x76\x73\xc3\xf2\x07\x02\xac\xfd\xc8\xb8\xf9\x06\x4b\x41\x5c\x9a\x3e\x35\x56\x8e\x37\x1d\x74\x0a\x38\x12\x7c\x1f\x27\xb3\x91\xb4\x5d\x07\x04\x5a\xea\xf0\x0a\x54\xe5\xb7\xfa\x54\x8a\xfb\x5f\x96\xfe\xb5\xf5\xb4\x4f\x60\xcd\x17\x07\xe8\xfa\x95\x67\xf7\x80\x6e\x15\xf6\xa0\x1a\xa0\x20\x77\x73\x3f\xe7\x38\xb0\x8f\x21\xef\xbc\xf9\x8c\x19\xd5\xb9\x70\xe6\x16\x3e\x5f\xe8\xf4\x80\x0e\xf9\xed\x22\xa0\xf9\xb5\x12\x6f\xf1\xeb\x1c\x7d\x65\x01\x9c\x8b\x44\x03\x91\x92\x70\x29\xb8\x13\xda\xb7\xc7\xe8\x63\xd4\x82\x29\xf8\xdf\x85\x39\x43\x45\xfc\xc8\x8a\x30\x0f\x60\xa8\xd5\x16\xd8\x77\xa5\xa3\xa7\xe3\xc4\x9a\x9e\xb0\x6c\xd9\xf2\x66\x5c\xe2\xa8\x90\x22\x96\x2b\x1d\x49\x59\x2b\x09\xc7\x54\x3d\xa8\x35\xce\x63\xbc\x9a\xbb\x82\x21\x45\x76\x2b\x71\xcb\xe1\x50\x29\x2c\xe5\xc8\x70\x4e\x5a\xd3\x4f\xb4\x59\x2f\x97\x20\x44\xe4\x3e\x69\xf0\xe1\x67\x2d\x6c\x83\xcf\x25\xaa\xc6\x8e\xfe\x3d\x27\xaf\x2a\xd3\x42\x74\xb9\xd2\xb7\x77\x42\xd9\xc6\xdf\xbd\x57\xf9\x2f\xf6\x4d\x3e\x4c\x67\xc5\x41\xd8\x50\x2a\x7d\x03\x18\x95\xaf\x85\x31\x9a\x4e\xae\x2d\x25\x43\x35\x83\x5e\xff\x11\xe7\xa3\x67\x1a\x6a\x0d\x21\xb7\x2c\xe1\xfc\x2a\xcb\xa1\xa9\x20\x18\x38\x34\xbc\x0a\x4b\x73\xf6\x39\xff\xcb\x0f\x6b\x81\xcd\x92\x0f\x2e\x94\x20\xd6\x12\x16\x6d\x56\x82\xa0\x60\x60\xea\x0b\x6f\xa6\x95\xfe\xcc\x77\x04\xbb\xe4\xb0\x52\xaa\x3e\xc8\xf7\x20\xf7\xd4\xf3\x2e\x8a\xff\x86\xb8\x0b\x8c\x1c\xc1\x27\x64\xa0\x48\x74\x03\x7c\x31\x03\xe9\xdf\xec\xb8\xf7\xab\xcb\x0e\x07\x3b\x23\xe6\x7c\xa0\xa9\xb1\xfc\x72\x99\x3a\xbf\x31\xdb\xc2\x4a\x8f\xee\x09\x5b\x32\x51\xc2\x26\x26\xaf\x5d\xd1\xb6\xd3\x4b\xe5\xea\x06\xa0\x2a\xe1\x76\xc7\xb8\xcb\x9d\x06\x35\x01\xbe\x6f\x61\x20\x82\x88\x9f\xdb\xdc\xbf\xad\xc3\x3a\x0d\x31\x1b\x08\x0b\x8d\x64\xe4\x9f\x16\xb1\x6d\xd8\xed\xd3\xb2\xed\x11\x93\xa7\x4e\x5b\xe5\x07\x60\x9b\x04\x27\x27\xcc\xf0\x8a\xfb\x05\xcc\x6c\x50\x52\x4e\xf0\xe2\x66\x46\x21\xdc\x8b\x05\xb1\x5f\xfa\x81\xab\x6f\x7e\x3c\x8a\x5b\xb3\xea\xb1\xf6\x8e\x36\x56\xc1\x19\xd9\x69\xe4\x14\x4c\xf3\x28\x5a\xf2\x3c\x04\xdb\xec\xc0\x38\xae\xfd\x91\x83\xc4\xe7\x24\x47\xb2\xaa\xa8\x31\x5f\x46\x96\xce\x6d\x1e\xf4\x29\xba\x0e\x5c\x3d\x5f\xfa\x7f\x05\x0b\xe3\x9c\x7f\x61\x2f\x4e\x10\xf8\xef\x07\x0d\xf7\x2f\x8a\xdd\xbe\xaf\x33\x39\xc1\xad\x8b\x5f\xc3\x9a\x2e\xcf\x29\xa8\x7f\x82\xe2\x9a\x01\x17\xba\xac\x66\x25\xad\x5c\x80\xcf\xe7\x59\xfa\x1d\xbc\xfa\xa1\x2b\x37\x44\x77\xd8\x0b\xfc\xf0\x67\x96\xc3\x0f\x2c\x39\xcf\x03\x03\xd0\x0d\xc5\x6a\x32\xd1\xd0\x39\x59\x2d\xdb\x06\xc2\x2a\xa0\x68\x84\x1c\x0b\x46\xfd\x48\xdf\x8f\xbb\x74\x92\xcc\xbc\x59\x0c\x56\x3c\x8f\xec\xce\x42\x63\xc8\xc7\x53\x92\x18\xbb\x97\xb3\x57\x11\x53\x7e\x98\x81\x95\xdb\xf5\xbc\xd5\xcc\xaf\x06\xfa\xf5\x08\x47\x09\x77\xa5\x35\x8e\x6f\x02\x60\x83\x49\xfb\xb9\x9a\x23\xfb\xe3\x6b\x8c\x97\x15\x5a\xdc\x24\x6a\xd7\xd9\x3a\x8c\x20\x3f\x75\x44\x6c\x83\xc4\x34\x2c\x35\xba\x10\x4e\xcc\x67\xe6\x69\xdb\x4a\x95\x46\x6e\xe6\x8f\x45\x8a"}, -{{0x7c,0x27,0xae,0x47,0x07,0x2b,0x0c,0x9b,0x9c,0x2c,0x35,0x1f,0x13,0x27,0x89,0x98,0x95,0xef,0xa5,0x36,0xc9,0xc0,0x67,0xd0,0xe0,0xce,0x8e,0x82,0xe6,0x29,0x27,0x93,},{0xf9,0xfe,0xbd,0x12,0x1e,0x17,0xdb,0x72,0x29,0xb5,0x67,0x09,0x02,0x18,0x49,0xc3,0x5d,0x69,0xfa,0x08,0xb5,0x06,0x20,0xe6,0x67,0xf8,0x42,0xec,0x7a,0xc7,0x82,0xdc,},{0x32,0x71,0x96,0xdd,0xd4,0x3b,0xb6,0x02,0xd0,0x4d,0x19,0x64,0xcc,0xc0,0x59,0xed,0x62,0x7c,0xef,0x0a,0x88,0xd8,0xad,0x91,0xbe,0x49,0x31,0xf1,0x7c,0x25,0x0d,0x55,0x29,0xf5,0x52,0x79,0x4a,0x3e,0x26,0x9d,0x17,0xa6,0x3b,0xd3,0x29,0x33,0xeb,0x5e,0x51,0x9c,0x1d,0x50,0x65,0x74,0x77,0x0a,0xe4,0xa7,0x29,0x64,0xe0,0x6f,0x7d,0x00,},"\x15\x47\x87\x6a\x98\x8d\x1b\xe7\x14\xa4\x2f\xb9\x1c\xb0\x37\x63\xf1\x91\x3a\x89\x2e\xcb\xd4\xde\x2c\xcf\x83\x44\xd2\x07\x58\xb7\xb6\xd0\x02\x59\x10\x1f\xe9\x72\x25\xb2\x97\xf8\x7b\xfe\x22\x20\x04\x32\x5d\xb7\xf6\x32\xce\xaf\xfb\xd1\x34\xc9\x6c\xbd\x57\xe9\x85\xbe\xc8\x43\x4f\x81\xa4\xee\x6a\xf8\x5c\x3f\xad\xe5\x0e\x4c\x4e\xf2\x0c\xb0\x39\x35\x45\xe4\xd4\xa8\x6e\x1f\xa3\x9a\xaf\x33\x3f\xe4\xde\xd0\x54\xbf\xc0\x50\xa8\x98\x3a\x03\xdd\x1e\xcf\x2b\x5e\x95\x17\xba\xf9\xe1\x15\x21\x29\xa8\xa7\x59\x35\x71\x1e\xdb\x20\xaf\x5c\x8c\xf9\xc6\x94\xa3\x3c\xee\x45\x1c\xd9\x50\xb2\xff\xf0\x8e\x31\x58\xc5\xcf\xb7\xb1\x5c\xb3\xe9\x0d\x46\xf4\x94\xb6\xa1\x08\xd8\x88\x8d\x5e\xc2\x9a\x33\xc0\x66\x02\x3b\x49\x77\x09\xb2\xd9\x40\x1f\xea\xf2\xe7\x4f\xf2\x6c\x16\xd3\x6c\x39\xe6\x51\x7f\xf9\x54\xbd\x98\xbc\xe7\x70\x06\x71\x98\x8f\x66\xe8\x51\x07\x64\x4b\xa2\xea\x00\x7a\x13\x01\x8c\x1c\x14\x4e\x3c\x5b\xb8\x0d\xb9\x51\x1f\xcc\xa4\x10\x1b\xf4\x9f\x8c\x80\xff\x3c\xa7\xd2\x98\x25\x7c\xbf\xea\x62\x9f\x83\xd5\xe0\x66\x39\xd3\x1f\x63\x9d\xb4\xb8\x72\x6c\xbe\x22\x4d\x75\x88\x29\xba\xb1\x09\x05\x17\x1c\x9c\x0e\xc3\x70\xd5\x80\x31\xef\xe4\xcc\x5a\xe7\x2a\x49\x5a\xcf\xf6\xcb\x2e\xd9\xee\xc6\x58\xba\x11\x70\x88\xdd\x3c\x6e\xd1\xdf\x8f\x9c\xb1\x0b\xd4\xfe\x0e\x5e\x8a\xd9\xf5\x03\x4e\x34\x65\x2d\x98\x66\x8d\xb1\x5c\x85\x33\x39\x3a\x6e\x9e\xc0\x87\x0c\x35\x66\x6c\xe5\x4e\xfe\x2b\xcb\x45\xc3\x4a\x72\x30\xe6\xa7\x00\x67\x63\x49\xc7\xb3\xab\xf3\x1d\xe7\xb7\xb0\x52\x1f\x89\xb3\x0a\xc4\x03\x4c\x2a\x4b\xa8\x21\x8e\xef\xdf\x8d\x2a\x5c\x1f\x8e\xd9\xb7\x01\x57\x9e\x47\xaf\x8a\x52\x9a\x95\xa1\xff\x64\xd8\xfd\xb8\x85\xc3\x68\x39\xb4\xc5\xf6\xd7\x2a\x99\x25\x7e\x86\x78\xdc\xcf\x31\x27\x54\xb9\xd4\x61\x9b\xee\xce\xb8\x25\x52\x6d\xe6\x22\xbd\x96\x76\xfd\x5f\x35\x76\x93\xab\xab\x07\x8b\x9e\x03\xae\x21\xe8\x7c\xa1\x61\xe7\x78\xaf\x77\x09\x6e\xaa\xc2\xd2\xd3\x2b\xfe\xc8\xec\x94\xaf\x79\x65\xf6\x1d\x68\xef\x66\xa4\x52\x3c\x1c\xc7\x0c\x95\x19\xb0\x75\x0b\x3c\x9e\xed\x5a\xeb\xa9\xf0\xa9\xb7\xef\x52\xcd\x4a\x2d\xe2\x9b\x39\x5b\x70\x5f\xa5\x3f\x02\x8f\xa7\x66\x15\x9f\x20\xe7\x5f\x4d\x38\x4e\xc4\xfd\x66\xdf\x06\xe7\x44\xc9\x9a\xc8\x8c\xb8\x49\xc2\x85\x75\x7c\xc5\x57\xe2\xee\xdd\x86\x95\x9d\xa2\xc1\xb8\x1f\x5b\x27\x15\xa6\x51\x98\x48\x90\x1a\xe4\xf8\x9d\x09\x13\xc8\xde\x57\xc5\x3d\xad\xf2\xe5\xe1\xaa\x2a\x9c\x5f\x46\x4f\xc7\x61\x0e\x8e\xf5\xf5\xcd\xd8\x20\x3a\x67\xa9\x3c\x33\xa0\x6d\xab\x35\x8d\xc5\xae\x23\xed\xfe\xe6\x33\x42\x62\xf4\x7b\x19\xb1\x13\xd6\xca\xfe\xda\xc1\xb4\x39\x02\x53\x9d\x74\xfb\xa2\x9a\xaa\x7b\xce\x68\x88\x4b\x72\x61\x6a\x05\x42\xc9\xfc\x69\x54\x7c\xd1\x9a\xe1\xdf\x01\x72\x3a\xbd\xda\x65\xe9\xbf\xac\x5d\xa0\xd0\x42\x40\xc6\xa2\x17\x5c\x00\x62\xe4\xe1\xed\x8a\x5b\x39\x7a\xfc\xd4\xde\x38\xe8\x62\x09\x27\x2c\x7a\x42\x4b\x5a\xe8\xd5\xa4\x0b\x48\x4c\xe1\xb4\x70\x4a\xf2\x83\x16\x09\xad\x0f\x36\xe9\x0e\x07\xb2\xaf\xed\x01\xdc\x05\x57\x4a\xd3\x97\x17\x23\xc5\xb5\xc1\xdd\xd4\xfc\x8b\xd2\x63\xbc\xdf\x56\x8a\xf7\x5e\x73\xd8\xab\xd1\x00\x8c\x9e\xc7\x12\xf8\x0f\xfc\x65\xac\x34\xe2\xa7\x93\x04\xea\xde\x1d\x2a\x1d\xff\xec\x0e\x4c\x98\xc3\x58\x24\x68\xf3\x20\xbf\x8f\x66"}, -{{0x08,0xed,0xdc,0xb5,0x62,0x5a,0xe1,0x9f,0xfe,0x7b,0x49,0xa7,0xdc,0x82,0x9c,0x89,0x3c,0x75,0x38,0xb0,0x88,0x5e,0x18,0xf9,0x8d,0xb7,0x8c,0x8b,0xeb,0x56,0x9c,0x26,},{0x83,0x47,0x8b,0x1c,0x58,0x57,0x6a,0x0d,0x18,0x34,0xb2,0x8d,0x46,0xfb,0x80,0x51,0x6d,0x6f,0xb6,0xf9,0xf5,0x91,0x69,0x4b,0x44,0x35,0x2e,0xec,0xd1,0xe7,0xe8,0x9a,},{0xec,0xe7,0x53,0x22,0x99,0x51,0x54,0xb2,0x92,0x43,0x7e,0x47,0xd3,0x8a,0x6a,0x70,0xaf,0x37,0xe2,0x02,0x07,0x16,0xfd,0xe4,0x6b,0xfd,0x39,0x3b,0x3d,0x36,0x9b,0xdd,0xb5,0x32,0x53,0xb5,0x56,0x62,0x1c,0xfb,0x34,0xc8,0xa9,0x02,0x54,0xe1,0x32,0xfd,0x28,0xec,0xd0,0x98,0x43,0x34,0x13,0xa2,0x1b,0xd3,0xa9,0x79,0x8c,0xa1,0xf3,0x09,},"\x01\x5b\x1d\x3e\xeb\x00\x92\x9e\xa8\x0b\xd8\x68\x7d\x18\x28\x6f\x0a\xdf\xe6\x45\xcc\xf2\x5a\x22\xb5\x06\x19\x21\xe2\xa0\x30\xfc\x76\xd0\x33\xfb\x53\xd0\x93\x7c\x69\xb3\x1c\x5b\xe4\x99\x13\xca\x1f\x2c\x3d\xca\x12\x1b\x2b\x87\xc5\x9b\x3c\x84\xc7\xae\x52\xaf\x19\xc6\xb9\xfa\x1b\xd6\x75\xfb\x6d\xd8\xb3\x29\xd5\x66\x87\x86\xdc\x78\x83\xe2\xd2\xe8\x58\x6f\xf4\x12\x8b\x90\xde\xe8\x4b\xe0\xab\x54\xd6\x81\x3f\x7a\x8c\x61\x34\x75\x71\x73\x98\x17\x75\xde\x84\xc4\xdd\x39\xe3\x36\xf8\xa4\xef\x8d\xca\xde\xc9\x43\xe9\x0d\x42\x1b\x22\x9c\x11\x78\x5f\xcd\x3f\xe9\x63\x03\x74\x58\xe7\x6c\x82\x0b\x3b\xc2\xc9\x47\x60\x01\x26\x2b\x26\x1d\x28\xb6\x5b\x48\x9d\x76\xb4\xbe\x23\x65\xe4\xa8\x0f\xa8\x71\xb0\xa5\x3b\x6a\x5f\xb2\x43\x68\x82\x35\xac\xc5\xf4\x77\x4d\xb1\x5d\x47\xb4\x2d\xd6\xc8\xd9\xe1\x2d\xcb\x0b\x5d\x98\x0d\xab\x0f\x3a\xd8\xa4\x96\xf7\x6e\x50\x06\xc2\xca\x82\x67\x5f\xf1\x94\xca\xf8\x07\x0d\x04\xbd\x38\x4f\x97\xe5\x83\xe7\x3c\xbc\x4f\x7f\x25\x73\x10\xa6\x1b\x1c\x80\x62\x32\x2d\xce\x81\x15\xf6\xdd\x93\xee\xe8\xa9\x3f\xfa\x5c\xab\x66\x34\x11\x6e\x1a\xb7\x05\xfa\x86\xc4\xa8\xea\xa5\x56\xc6\xc8\x9d\xbc\xad\x01\x04\x36\xbf\xfe\x45\x18\x22\x49\x1f\x1e\xa8\x6c\x20\x20\x7e\x4d\x12\xdf\xa3\x62\x61\x6c\x58\x9f\x97\x10\x7e\xa5\xd8\xbd\x8a\x72\x15\xc6\x00\xff\xc7\x0b\x80\xe2\xab\xb1\x5a\xcb\xe4\xbe\xcc\xa2\x0d\x72\x15\x5a\xbc\x3d\xbe\x8e\x37\xcf\xd7\x3f\x74\x20\xf2\x1c\x9b\xcd\x0c\x32\x73\x51\x3b\x50\x49\x67\x08\x74\xd5\x51\x9b\x3b\xc1\xdb\x52\x3c\x1d\x7e\x90\xc1\x65\x96\x7c\x4c\xb2\x84\x5a\x2e\x8b\x47\xb5\x88\x92\x54\xf5\x8a\x9b\xbb\x82\x6f\x94\x52\x1c\xdb\xd0\x41\x6f\x5f\x18\xff\x78\xa3\xfd\x0d\x7a\xb8\x97\x90\x62\x64\x48\x3c\xde\x64\x2d\x8e\x70\x3f\xd8\x2e\x5a\xe7\x0a\x9f\x97\x8f\x64\xee\x80\x52\x05\x54\x85\x05\x28\x58\x1c\xa9\xa0\xb3\x8c\x19\x6f\xd1\x66\xda\xe5\x87\x9b\x3f\x72\xf5\x9c\xde\x91\xcc\xa2\xc8\xbf\xaa\x47\x8b\x98\xd6\x24\xcd\x34\x72\x44\x02\xde\x57\x8e\x57\x54\x82\x5c\xe2\x27\xd2\x87\x1b\x45\xa5\x11\x71\x49\x51\x5b\xff\x81\xa9\x23\x24\x6f\x3b\x72\xd0\x7b\xd4\x58\x12\x5c\x70\xa1\x4d\x87\xc3\xfd\x13\x39\x2a\x3b\xda\x65\x53\x01\x6e\x8b\x2d\x07\xbd\xe9\x03\xcf\x68\x7b\x44\x5c\xfd\x6f\x76\x14\x92\xeb\xa4\x65\x22\xad\xa8\x4a\x96\x15\xd8\xda\x34\x98\xb2\x58\x06\x72\x69\xb7\x88\xe5\x59\xb6\x59\xd4\xb4\x8a\x87\xd8\x80\xd6\x37\x8b\xe6\xa8\x87\x46\xf3\x5b\x32\x2b\x04\x78\x45\xaa\xdc\x52\x3b\xea\xff\x30\x70\xf7\x21\xc3\xc0\x71\xea\xa3\x19\xb7\xa4\x7c\x1b\x20\xd3\x00\xdc\x03\x21\x90\x9b\x66\x9e\x57\xd3\x9a\x1c\xe2\xfd\xbe\xaa\xfa\xc2\x13\x50\xec\x2d\x6e\x6d\x5b\x88\x01\x86\xc0\x28\xa8\x61\x47\x4d\x50\x76\xa4\xad\xc5\x03\x2f\xec\x91\x40\x78\x7c\x36\x80\x6e\xf7\x9c\x72\xe3\xa1\x9d\x8c\x8b\x70\xbd\xaf\x20\x72\x95\x54\x2d\x96\x82\x5a\x5d\xe7\xdf\xe1\x08\xef\x57\x45\x99\xb8\xf1\x84\xc6\x3a\x5a\x13\x1d\xb1\x9b\x3b\xe5\x3f\x69\x9c\x10\xfc\x4c\xa7\xc6\x3f\x35\x00\x21\x1b\x35\x6a\x0a\xc6\x64\xdd\xfc\x1a\x92\x52\x59\x00\x26\x39\x5b\x47\x9b\xe9\xa5\xe4\x75\x84\x23\x56\x0b\x65\xbb\xce\x5b\xba\xde\x49\x3b\x13\xd0\x0c\xf8\xc1\xd3\xb7\xe9\x22\x13\x67\xe8\xf0\xea\xda\xb6\xe6\xd1\xb5\xff\xfd\xe7\xb2\xd7\x41\xfc\x2c\x83\x02\x24\xff\xf7\xff\x14\xae\x5c\x07"}, -{{0x22,0x73,0x94,0x2d,0xb3,0xe5,0xd3,0x22,0x1e,0x80,0xd9,0x94,0xfd,0x5e,0x11,0x63,0xaf,0x55,0xf5,0x45,0x5a,0x8e,0x52,0xbe,0x85,0x2d,0xd3,0xad,0xf7,0x62,0xb4,0x40,},{0xbc,0x58,0x67,0x4e,0x99,0x6b,0x6f,0x3e,0x32,0x20,0xb3,0xe9,0x4f,0x00,0x67,0xbb,0x0e,0x9b,0x0d,0x97,0xd9,0xe1,0x05,0x9c,0xf1,0x39,0x97,0xa1,0x93,0xac,0x03,0x2a,},{0x87,0x4d,0xde,0xce,0x08,0xf3,0x0b,0x30,0xf0,0xd4,0xc8,0xb3,0xed,0x7c,0x61,0x51,0x49,0xb8,0xaa,0x74,0x0d,0xaa,0x34,0x7b,0x55,0x95,0x8f,0x1e,0x21,0x19,0x04,0x4f,0x69,0x5a,0x21,0x06,0x96,0x90,0x50,0x64,0x48,0xd8,0xe7,0x35,0x2b,0x90,0x46,0x51,0x1d,0x7f,0x39,0xa5,0x41,0x5b,0xb9,0xc5,0x70,0x50,0xfc,0x17,0x05,0x5c,0x38,0x08,},"\x8a\xa0\x50\x9e\x4b\x91\x41\x86\xff\xff\x07\xae\xb9\x7a\x04\xb5\x46\x27\x2d\xa2\xf9\xea\x7b\xfa\x65\x9a\x24\xcb\x50\x96\x6c\x23\xeb\x65\x42\xe4\xf2\x2d\xeb\xe3\x3b\x65\x76\x92\x45\xc4\xd1\xb5\xdc\xf3\xe6\x99\xc7\x0c\x5c\x2b\xaa\xd9\x73\x4e\x9d\x1e\xfe\x54\x48\xab\x71\xc8\x94\x6a\xec\xce\x52\x68\xd2\x6f\x19\xcf\x60\x5e\xb3\xbf\x38\xb0\xb3\x32\x26\x94\xac\x0d\xcb\x76\xb0\xf9\x46\x84\x2f\x6c\x5c\x68\xd7\x63\xfc\xe7\x47\x01\xbd\x6b\x78\xe7\x1c\x8c\x31\x42\xad\xd4\xed\x46\xe0\x96\x9b\xb9\x55\x5b\xe0\x36\x02\xd5\x62\xe4\xc8\x9f\x3a\x91\x99\x40\xe8\x83\xa9\x69\x40\x54\x2f\x27\x79\xfb\xf9\xec\x0a\x28\x5d\x9d\x8a\x72\x36\x01\x46\xe3\xff\xbd\xb7\x8d\x21\x03\x16\x03\x8d\x95\xd6\xab\x75\x71\x65\xaa\x94\x3c\x03\x3e\xeb\xb3\x21\xc0\x5a\x39\x95\x69\xbc\xf6\x6b\x4d\xdb\x0b\x2e\x0e\x33\xc4\x79\x3d\x81\x7c\xcf\xf5\x7f\x99\xb3\x18\x9c\x60\xd5\xd7\xb9\x41\x9d\x1e\xbc\x94\x3a\x79\xd4\xd8\xc3\x94\x56\x61\x80\x59\x4f\x55\x9a\x80\x52\x9c\xc1\xba\x28\x87\x7a\xf8\xf5\xc0\x50\x3e\x94\x3c\xd3\xaa\xd9\x98\x11\x64\x52\x72\xda\xfb\x49\xb9\xb3\xe6\x10\x7e\xb5\xe5\x18\x6e\x16\x08\x75\x71\x26\x05\x3d\xeb\xce\xc7\x5d\xd9\x56\x5c\xee\xa0\x6a\x13\x91\xa8\x22\x6d\x1f\x45\x93\x79\x22\x40\xcc\xd9\x7c\x67\xa6\xc2\xb1\x34\x4c\x22\xc9\x1f\x42\x03\x3a\xde\xf5\x28\x61\xf3\x2a\x4e\x07\x12\xa9\x17\x87\x9a\x0b\x05\x18\xb5\x42\x4b\xcd\xc0\x54\xb4\x4e\x97\x2e\xd2\x4d\x01\x68\x9f\x4f\x27\xf5\xf1\x76\xf0\xa5\x78\xab\x2d\x3c\x08\x78\x27\x2e\x8c\x08\xc2\x15\x82\x11\x86\x54\x12\x4d\xca\x39\x58\x53\x37\xc1\x3c\x18\x65\x81\x4c\xaf\x09\x96\xca\xdf\xa6\x5b\xe5\x80\xde\xe3\x22\xeb\xcc\xda\x70\x4b\x22\x80\x58\x26\x04\x06\x7d\xc3\xc6\xb1\xf7\xd8\xa2\x69\x78\xa6\x5c\xff\xd1\xed\x31\x96\xa2\xb0\x65\xfb\x3c\xaa\x79\xe6\xb5\xb6\x6c\x13\xd7\xbd\x7d\x0e\xc1\x4a\x3a\x4d\x58\x41\x3f\x21\x2f\x47\x1e\xca\xad\x3a\x84\xaf\x35\xe5\x98\xa8\x9f\xb3\x44\x7d\x33\x24\xf0\x20\xfb\xf1\xb7\x3e\x2a\x98\x6e\x0d\xa1\x6c\x01\x83\xbf\x92\xa3\x98\xc4\x19\xa0\xf9\xf3\x05\x37\xbe\xa0\xdf\x8d\xf2\xdc\x53\xc1\x54\xe8\xea\x16\x06\x89\xe7\xbb\x4d\x72\x9d\xd8\xab\x90\x03\x14\x27\xaa\x39\x45\x86\x3a\x85\xe8\x96\x52\xb9\x35\x38\x05\x16\x6f\x7c\x0a\x18\xc9\x39\x95\x4b\x27\x87\xc3\x70\x94\xf9\x25\x12\x72\x2e\x52\xb0\xc9\x76\xb9\xe4\x2a\xf4\x03\x9d\x2c\x05\x78\xff\x14\xfa\xe1\xd8\xc2\xd1\x39\x6b\xeb\x2d\x6a\xa6\xeb\xd5\x54\x74\xa9\x34\x98\x67\xa0\x3f\x3a\x99\xd7\x87\x80\x63\x4a\xb4\xb3\x5c\xfe\x1b\x87\xa9\x13\x32\x52\xa6\x98\xbc\x40\x7d\x63\x84\x28\x70\xe2\x2c\xcf\x39\x33\x62\x0a\xc0\x42\x3c\x3d\x1f\x68\x1d\xd7\x3c\x01\xd0\x6c\x3b\x94\x15\x06\xc9\x8e\xed\x9b\x78\x68\xe0\x17\xb7\xf9\x97\x16\xb0\xb7\x7f\x11\x32\x1e\x5a\xb2\x3d\xbf\xcf\xca\x93\x50\x84\x5e\xe1\x80\x44\x4c\x50\xff\x0a\x9c\x96\x5f\xcb\xf7\x77\x70\x8e\x4f\x34\xcc\xc6\x37\xc6\xa0\x8d\x85\x43\x84\xf8\xd3\xe2\x51\x69\x56\xc1\x51\xd0\x31\xbb\x1c\xbe\x71\x2a\x5e\xf9\xee\x16\x61\x92\x28\xbd\x29\x6f\x2a\xfe\x58\x2d\x99\x53\xd5\x90\xd1\x8b\xb2\x05\xf7\x0f\x84\x4c\x16\xc0\xa2\xd8\x31\x80\x37\xd4\x3d\xd8\x0f\x65\xc6\xa7\x53\xf2\xa8\xe2\x7c\x89\xc8\x3e\x7e\xd7\x0c\x52\xf7\x06\x2d\xfb\xb1\xf5\x44\xaa\x23\x6b\x5c\x70\x4e\x7b\x39\xce\x0a\x55\xfd\x46\x52\x80\x83\xca\x61"}, -{{0xdb,0xfa,0x45,0xab,0xaa,0x55,0x41,0x52,0x38,0xb1,0x28,0x76,0x34,0xd5,0xee,0xc4,0x02,0xda,0xdf,0x62,0x2e,0x27,0x0c,0x04,0xa8,0x91,0x4c,0xed,0x27,0x0a,0x72,0xbe,},{0xc0,0xfe,0x32,0x35,0x81,0xea,0x29,0x67,0x50,0x79,0x7e,0xb5,0x50,0x8c,0xa1,0x9a,0x58,0x3b,0x53,0x7f,0xa7,0xdf,0x45,0x29,0xf0,0x80,0x4a,0x33,0xc1,0xa4,0xbe,0xf4,},{0xa4,0x62,0xa9,0xba,0xa5,0x6d,0xc0,0xf7,0xa7,0x1b,0xf8,0x7b,0x95,0xf4,0x8d,0x64,0x20,0x22,0xd9,0xd1,0x73,0x3e,0xe3,0x68,0x37,0x77,0xa3,0x78,0x22,0x28,0xac,0x85,0xfc,0xd8,0x30,0x26,0xbe,0x4c,0xa9,0x7a,0x34,0x5b,0x08,0x4f,0x50,0x87,0x4e,0x91,0x24,0xe1,0x6b,0xa1,0x7d,0xea,0xd4,0xad,0x85,0xc0,0xe5,0x6f,0x16,0xef,0x18,0x04,},"\xe2\x6e\x8d\xcb\x44\xe6\x41\xfc\x20\x08\x0e\x95\x47\x4b\xd3\x9d\x71\x6c\x5a\xfe\x5a\x1f\xfb\x05\x6d\x1e\xaa\xb0\xc4\x9f\x85\x70\x71\x7d\xb6\x43\x7a\x03\x22\x8a\x9a\xd9\xf4\xbb\x0b\x34\x3b\x95\xe1\x60\x23\xc0\x80\x7e\xb2\xa1\x51\x06\xa6\xeb\x12\xdc\x76\x68\x3e\x69\xdd\xa3\x36\x31\x48\xc5\xd7\xdd\x97\x13\xaf\x6f\x87\xa0\x94\x10\xea\x8f\x76\xb6\xb7\x8a\x11\x44\x29\xbc\x85\xf7\x84\x81\x2f\xca\x31\xac\xb0\x30\x95\x52\xcc\x18\x8c\x6e\x96\x97\x09\x3c\xf4\x04\xc6\xf0\xf4\xab\xe8\xa1\x60\x86\x73\xfd\xfa\x5e\xb7\x8f\x65\xfc\x1d\x49\xcd\xec\x40\x94\xb1\xbd\x23\x4a\x46\xe0\xec\x62\xa4\xb6\xd3\x1b\x82\x96\x11\x54\x01\x27\x87\x6b\xff\x4c\x17\x3d\xe0\x58\xcf\x61\x00\x4b\x01\x4a\x7b\xdf\x79\x3d\xfd\x6b\x63\xc5\x07\xd2\xb2\x3e\x0f\x56\xbc\x2f\xe6\xba\xf6\x37\xce\xe4\x0d\x18\x99\x22\x95\xd8\x48\xef\x49\x8f\x8a\x16\x1b\xd8\x7e\x60\xc9\x1f\x97\xa9\x1e\x9e\xf3\xf6\xd9\x7f\x2b\x2d\x21\x04\xba\x6f\xdd\xd6\xc6\x80\x70\x62\x73\xda\xe8\x7e\x6e\xec\x1a\xf2\xa4\x59\x84\x98\x50\x69\xe8\x09\xe8\xde\x32\xc1\x28\x89\x29\x9a\x32\xd4\x0f\x38\x77\x45\x99\xac\x33\x24\xb7\xcb\x0a\x4e\xa6\x32\xc5\xf9\x10\xad\x87\xf5\xad\xbf\xa5\xc3\xbb\x20\x49\x82\x79\xfd\x53\xc1\xc2\x67\xfe\x0a\x84\x77\x30\x85\xda\x26\x6b\x25\x3c\xd8\x53\xdf\x7e\x96\x35\x58\xcb\x06\x88\x07\x80\x97\x34\x23\xc5\x64\xcd\x0b\xcd\x6b\x93\x33\x4c\x19\x59\x53\xd7\xcd\x89\x9f\x8a\x54\x7d\x1a\x1a\x0a\x8d\xef\xf1\x38\x1b\x43\x21\x57\x47\x28\xcf\x71\xb9\x6f\xf2\x09\xe8\x99\xda\xa8\xf1\x3f\x41\xb2\x30\xe1\x7b\xff\xdf\xdd\x2a\x89\x43\xaa\x5d\x21\xe5\xf3\x6e\x1d\xa0\x7e\xdd\x6c\xee\x92\xdc\x48\xb5\xb2\xa7\x58\x01\x46\xa9\xba\xf7\x13\x95\x0c\xe6\x76\x25\x5a\x89\xe3\x4f\x87\x87\x54\x7d\x62\x86\x8d\xb1\x4b\xa4\x65\x94\xda\x31\x0d\x7e\x2d\x9e\x7c\x7d\xbe\x17\xdb\xd7\x1e\xb4\x7c\x56\xc5\x72\x1d\xc9\x6d\x69\x64\x70\x57\x37\x94\x80\x94\x11\xcd\xfa\x27\x6b\x05\x9d\x00\x07\xc2\x5d\x74\xb2\xa6\x7d\x38\x24\x6d\xe1\x1e\xf4\x6d\xfe\x26\x70\x92\x6f\xe4\xb6\x36\x56\x23\x1b\xc7\x26\x8b\xba\x23\xf3\x78\xe8\x4a\x42\x8c\x3c\xbf\x45\xcc\x53\x96\x78\xfd\x46\x7c\xd3\x3d\xd0\x75\x7c\xfa\x02\x4e\x54\xda\x1f\xf5\x4c\xe8\x20\x22\x9b\x77\x8b\x18\x4b\xe1\xfa\x2e\x84\x68\xcc\x19\x95\x59\x40\x73\x5e\xaa\xa8\x84\x02\x2f\x64\x18\xb0\xb1\xf2\x6b\xcc\xf1\x69\xf1\xbc\xac\x7d\x82\xa3\x5a\xb6\xef\x84\x7e\x1d\xba\x53\x7d\xca\xff\x57\x25\x0a\x8d\x1c\x71\xfa\xcb\x13\x4c\xd0\x6b\x01\xc4\x53\x19\x13\x27\x45\xdc\x48\x88\x88\xa1\xd7\x76\x1b\x84\x86\xa3\x7e\x69\x88\xa1\x12\x0b\xcc\x16\x82\xdb\xfc\x89\x14\x3f\xc3\x5b\x46\x93\x5d\x8a\xcf\x6e\xf3\xc4\x2f\x0f\x4b\xf6\x79\xdf\xd6\xff\x44\xb6\xad\xa2\x6b\x01\xa9\xf8\x9f\x37\x4c\x7d\x2e\xe4\x8d\xfe\x1a\x41\x0e\x89\x7c\xdf\xd9\x7f\x62\x6d\x26\x68\x50\x28\x14\x40\x07\x93\xb3\xb0\x7c\x87\x20\xbb\xdd\xc5\x9c\xb0\xf9\xde\x96\x4a\xe0\x75\xb4\xaf\x3d\xd4\xba\xf6\xd0\xe4\xf9\x4f\x29\x4e\x81\x09\xd6\x57\x7c\x4f\x8a\x9c\x7a\x5f\x7d\x69\x4b\xf8\x8f\x1a\x5e\xa7\xeb\xa0\xa6\x6d\xa6\xc7\x70\xc0\x8b\x3a\xbf\xfc\x53\x4d\xf2\x19\xdc\x3e\x33\x23\xb0\x22\xe9\x6c\xc8\x60\x02\xb1\x89\x18\x1a\x1d\x2b\x52\x7d\x27\x95\x0b\x7f\x42\x5a\x47\xda\x40\x13\x77\x8b\xd0\x0b\x71\x10\x59\x22\x20\x49\x21\xe9\xdc\x69\x2c\x23\x3f\x7b\xaa\x04"}, -{{0xef,0x64,0xe1,0x7a,0x53,0xf7,0xfb,0xca,0xfe,0x3e,0xa4,0x68,0x76,0x84,0xa0,0xda,0xdb,0x18,0xd0,0x37,0x35,0xa4,0x0a,0x53,0xb3,0xed,0xb0,0x49,0x07,0xee,0x61,0x62,},{0x91,0x86,0xe6,0xbc,0x14,0x29,0x61,0xc4,0xd3,0xeb,0x36,0x9e,0x9e,0x11,0x57,0x82,0x92,0xde,0x5b,0x6a,0xf5,0x34,0xd4,0x23,0xff,0x24,0x0f,0xa2,0x6e,0x21,0xa7,0x81,},{0xf5,0x8f,0x39,0x6b,0xa2,0x7e,0x06,0x7a,0x5f,0xe0,0x03,0xe3,0x85,0x58,0x2a,0xe3,0x49,0x0e,0x05,0x95,0x77,0x15,0xd7,0x04,0xda,0x0d,0xa6,0x3a,0x64,0x19,0xd2,0xe4,0xf6,0xdc,0x66,0xb7,0xe8,0x8e,0x42,0x8a,0x6f,0x21,0xb9,0xea,0x20,0x22,0x99,0xa3,0xc3,0x6b,0x24,0x2b,0x0e,0xa0,0x64,0x76,0xff,0x12,0xd0,0xb6,0x58,0x0c,0x04,0x03,},"\x68\x82\x45\x6c\xc3\xd1\xad\x0d\xaa\x9b\x88\xef\xf0\x96\x9f\x15\xe9\x7b\x48\xd0\x51\x96\x7e\x13\x90\x84\x72\x25\xf2\x6a\xc2\x55\x59\xf0\x24\x6b\xf7\xd6\x83\xfa\x28\xec\xed\xad\x21\x49\x1d\x77\xbd\x26\x96\xfa\x83\x5d\x0f\xd1\x19\x88\x4f\xec\xe9\xd8\x03\x69\x1b\x2f\xd3\xde\x17\xee\x08\x7c\x74\x00\x7a\x7d\xe9\xbc\x65\x34\xbb\xfe\x95\xfd\x32\xe9\x7c\x37\x5f\x4c\xb6\x57\x31\xaa\x1e\x83\x46\xbe\xa2\x1b\xe9\xf2\xc3\xdc\x87\x4a\xf0\x43\x19\x06\xcc\xbc\x2c\x60\x01\x27\xf4\xd3\xb0\x69\xeb\x09\x1d\x16\x5e\xc4\x53\xe6\x72\xe9\x3c\xae\x8b\x72\xf0\x33\x71\xd8\xb8\xa8\x24\x4e\xc4\xec\x2e\x09\xf3\x1d\xf4\x02\x06\xa2\xb1\xc8\x4c\xaa\x1b\x99\x3c\xc6\x75\xfd\xe1\xc7\x9b\xd4\xa7\xd1\x59\x74\xfa\x29\xce\x2e\x89\x2c\x28\x99\xcf\x48\x2c\x3d\x96\x63\xf6\xd2\xa7\x97\x84\xf4\x1c\x1f\x58\x66\xd3\x7c\x85\x46\xf3\x57\xd5\x64\xd3\xc4\x21\x8d\xfa\x6d\x20\xb6\xc2\x82\xb4\x00\xfe\xdd\xe5\x24\x39\xd4\x72\x21\x2c\x57\x67\xa3\x5d\xa5\x20\x10\x32\xda\x87\x30\x96\x8b\x07\x20\xe8\xa6\x04\xde\x6c\x1b\xaa\x3f\x4e\x89\x6a\xc2\x61\x4f\xb1\xab\x6e\x3f\x6c\xf3\x87\xa8\xeb\x2f\xf8\xa9\x21\x47\xab\x34\x92\x38\x43\x2e\x50\x9d\x82\x9c\xb7\x5b\x2c\x17\x65\xc5\x12\x21\x84\x8e\x25\xaf\xff\x5f\x16\xe4\xdd\x0c\xd5\xc9\xf7\x13\xc4\xaa\xab\x2c\xe8\x36\xf8\x49\x45\x06\xb5\x30\x9d\xc2\xb0\xae\x74\x5b\xb9\xc4\x79\x80\x98\xfb\x86\x41\xd5\x20\xa0\x8b\x02\xf7\x5a\xd8\x0d\xbc\x2c\xe2\x9e\x89\x0b\x4d\x72\xa3\xff\xb2\xa1\xcb\xd5\x38\xe1\x22\x9f\x57\x9c\x29\xae\x66\xbc\xa8\x5e\x0f\xa0\x8c\x86\x47\xa1\xab\xcf\xe8\xa4\x9f\x5e\x50\x8d\x4d\x24\x95\x55\x66\x23\xd9\x26\xce\x49\xef\xa4\x35\x0a\xaa\xab\x5c\xec\x2c\xd8\x85\xbe\x1d\x63\x47\x5e\x3b\xab\x7c\x7c\xdc\x8d\x65\x61\x73\xb8\xd4\x56\x02\xf4\xb3\xd2\x81\x24\x1d\x17\x19\x03\x27\xb2\x4c\x38\x36\xb1\x93\x11\xa1\x93\xaf\x86\xa6\x76\x8f\x04\x85\x2a\xb0\x6e\x67\xc8\xea\xd5\x91\xcd\xcb\xf3\x78\x9c\x61\x32\x09\xcf\xe0\x3f\x58\xc0\x30\x5f\x63\x20\x3b\x48\x7f\x7c\x5f\xc0\x98\x87\x7e\xc9\x8a\x68\x9c\x9d\x35\xaf\x81\xe8\x40\x78\xd6\x6f\xe9\xe4\xec\xcb\xb1\xcc\x6c\x71\x99\x1c\x03\x01\x7b\xb8\x11\xf4\x1f\x07\xde\x68\xfa\xd1\x94\x14\x60\x61\x32\x4f\x3d\x0e\xf2\x17\xa5\x4c\xf3\x8f\x7a\x62\x5a\x38\x86\x9f\x67\xd0\xb7\x43\x1d\xf9\x37\xcd\xe3\x49\xc1\x75\xce\x8b\x26\xac\x88\xd3\x9a\x43\xe2\x79\xb0\x18\x76\x4e\xfa\x4d\xd6\x27\xcb\xf5\x91\xf6\x20\x9c\x4a\x5b\xb1\x9e\xbf\xa7\xc7\x13\x55\x92\xd0\x2e\x50\x1c\xae\x5e\x6b\x31\xc9\x0e\x72\xfa\xab\x47\xf7\xdc\xed\x2c\x48\xad\xf8\x84\x43\xb3\xed\xe6\x0c\xef\xb0\xd6\x37\x9d\x69\x22\xec\x43\x7f\x08\x6b\xad\x62\x17\xd4\xd4\xff\xef\x18\xe2\x25\x23\x66\x4b\xf4\xe9\xca\x1e\x65\xa2\x8c\x2a\x7a\x60\xc5\xf6\xbc\x90\x6b\x73\x7c\x29\x93\x5f\x90\x97\x46\x30\x48\x57\x5b\xef\xd1\xa2\x54\x9d\xc4\x74\xb1\x3e\x68\xae\xec\xf1\x66\x04\x3e\x07\x5a\xac\x51\x55\x40\xf8\x31\xb4\x30\x66\xce\xf9\x32\xe6\x3d\xcd\x5b\x37\xb6\x15\x78\xc3\x5b\x09\xe4\x5c\xc2\xa8\xde\xf5\x71\x03\xed\xfc\x5f\x64\x98\x31\xa8\x96\x1f\xe4\xa4\xb3\x72\x1f\x1d\x6d\xf4\xea\x9f\x03\x38\x81\xb4\x74\x30\x0e\x0f\x12\xcb\x9c\xd3\xba\xbd\xcf\xfb\xb9\x18\xdd\x9b\xb0\xe2\xf5\xb2\x10\x33\xe4\x30\x23\xa0\xd2\xe6\x6d\xa3\xab\x0f\x07\xee\x98\x8b\x16\x88\x9c\xa5\xd5\x1a\xbd\xc0\x5f\xde"}, -{{0x33,0x47,0xdc,0x47,0xbb,0x3d,0x2e,0x5d,0x02,0x86,0xac,0x06,0xa5,0x4f,0xd9,0x21,0xc9,0xe9,0x6b,0x68,0x99,0x86,0x2a,0x54,0xe5,0xcc,0x81,0x15,0xd3,0xd0,0xba,0x99,},{0xd0,0x0b,0x64,0x5d,0x86,0xdb,0xb7,0xe5,0x24,0x75,0x7e,0xc7,0x78,0xc6,0x2b,0x7e,0x60,0xd0,0xb6,0x57,0x68,0x83,0x33,0x8c,0x9b,0x67,0xc2,0xc7,0xe4,0x50,0x92,0x68,},{0x9a,0xb4,0x29,0x9b,0x17,0x72,0x93,0x44,0x75,0x0b,0x69,0xdc,0x60,0x37,0x36,0x8c,0x98,0xf4,0x7b,0xe6,0x27,0xfb,0xd9,0xad,0xfd,0x8d,0xb3,0x9f,0x99,0x64,0xdd,0xb7,0xbc,0x92,0xd6,0x74,0xc7,0xbe,0x74,0x07,0x56,0x39,0x6b,0xaa,0xee,0xac,0xbf,0x74,0x94,0x7b,0x61,0x91,0xc6,0xed,0x1f,0x5d,0x32,0xa6,0x3d,0xf3,0x6d,0x54,0x26,0x01,},"\xe2\xf4\x8e\xdf\x9d\x64\x33\x20\xab\x99\x1c\x8f\xf9\xf6\xaa\x75\xfe\x06\x6e\x7d\x88\xff\x1e\x47\x2a\x5a\xc9\xc5\x18\xde\x1f\xb6\x29\x83\xb1\x00\x7f\x64\x22\x80\x91\x17\xbd\xbe\x8a\x0e\x57\x87\xf6\x6b\xb0\x57\xd2\x7f\x12\x9a\x20\x0b\x40\x57\x6e\x17\x19\xcf\x9e\x98\xfc\xb7\x2a\xf9\x4b\xb8\x2e\xe7\x0f\x37\x19\xa2\xe2\xcd\x9b\x64\x77\x7c\xea\x5e\x44\x64\x59\x87\x4b\x74\xbf\xbf\x56\xb2\xd2\x52\x64\x00\x59\x2a\x9b\x45\xa5\xcb\x79\x80\x92\xb6\x0a\x81\xb7\x1d\x82\xf0\x68\x5f\xae\x7f\x81\x0b\x52\xd2\x26\xad\xac\x7a\xd8\xa9\x18\x3f\x09\xfe\xbe\xe9\xd2\x50\x46\xc0\xfe\x30\x66\x81\xac\xe2\xbf\xf9\x1b\x34\x82\xb0\xbc\x30\xb2\x02\x1c\x43\x41\x64\x5d\x67\x51\x34\xfe\x30\x81\xc5\x1e\x5c\x59\xe4\x0b\x37\x5a\x14\x34\xf6\x3b\x42\x6e\x30\x53\x0d\xa9\x35\x3b\xb2\xa9\x42\x32\x20\x43\x4a\xe5\x9d\x7b\x6f\xdc\x14\x3f\x49\x82\xeb\x8c\xfa\x77\x51\xb7\x5b\xf3\xe9\xc9\x13\xc7\x3b\x76\x0b\x07\xd3\x95\x31\x0c\x59\xf3\xb7\x7e\xbf\x12\xed\x2d\x7b\x03\x59\x0d\x33\x17\xaf\x17\xdf\x42\x1e\x78\xb0\x84\x9f\xd5\x6d\x94\x5c\x56\x96\xa0\x40\xfc\xaa\x78\xa9\x3e\xcc\x16\xd5\xac\x34\x45\x06\x36\x11\xf3\x01\x3e\x9a\x3a\xe2\xe1\xc2\x70\xdd\x01\xa8\xff\xe3\xe6\x12\x6b\xc1\xe4\xc9\x5f\x65\x47\xa8\x65\x1f\x26\xb6\x40\x4e\x39\xee\x4c\xe7\x61\x89\x18\xf3\xf9\x37\xa5\x25\x73\xec\x27\x7b\x77\x1e\x91\xad\x09\x6f\xa1\x5c\x7a\x34\x0a\x80\x9b\x47\x03\x18\xa4\x63\x64\x23\xeb\x48\x88\xa1\x21\x60\xc4\x66\x3f\xce\x29\x96\xd6\x38\x89\x6c\x83\x9b\x2c\x7a\xd4\xb3\xa9\xb2\xe6\xcb\x71\xe9\x12\xfe\x39\xb8\x43\xc6\xe0\x83\x2e\xca\x22\xde\x93\x8b\x50\xae\x86\x3e\x48\x58\x2c\x10\x85\x12\x32\xf7\x5e\x52\x25\xb8\x89\x6b\x5a\x47\x0f\x81\x8b\x6f\xa3\x9e\xb7\xbb\x59\x03\x57\x67\x86\x12\xd2\x5f\xe1\xa4\x0e\xa1\xb9\xd7\x1d\x88\x09\x09\xc1\xbd\x4a\xd1\x76\xcc\x0c\xef\xfd\xce\xe7\x09\x9e\x78\x82\xa7\xc9\x07\xe4\xbe\xc7\x98\x30\xc6\x77\x1a\xcb\x89\x94\x4b\xd5\x4a\x51\x65\xb3\x18\x70\x91\x69\x21\xb1\x98\xac\xd4\x43\x2e\x7e\xed\x8c\xe1\xde\xb3\x45\xb1\x07\xed\xa7\x60\x26\x6f\xcb\xda\x3b\xa5\x22\x94\x00\xa3\x03\x60\xa4\x64\x5c\xa8\xdb\x38\xc3\xd5\xf4\xa8\xde\xf1\x57\xbb\xdb\xbf\x2c\x1f\xa1\xdc\x6b\x05\x14\xa4\xf5\xa0\x36\x4f\x92\x83\x81\xb4\x0f\x95\x57\x9a\x26\x46\x7f\x22\x82\xa8\xa2\x55\x75\x84\x02\xac\x9c\xa8\x0e\x89\xb9\xcc\x68\x60\xa3\x4b\xb3\xf9\x0c\x32\x37\x65\x7c\x21\x29\xea\x48\xc8\x52\xb9\x25\x69\xe8\x11\x06\xbc\xe4\x61\xe2\x02\x44\x54\x82\x1a\x91\x75\x92\xd1\x99\x1b\x5b\x69\xf2\x7b\xbe\x01\x99\x77\x52\x8a\x2f\xc0\x11\x92\xc5\x6b\x4a\xea\x87\x3c\xf8\xc5\x8d\xfd\x7c\xb4\xb0\xe9\x17\xe8\x7a\x87\x04\xc9\x92\x82\x0f\x98\xd7\x74\x04\xd3\xf1\xd2\x05\x0c\x67\x43\xf6\xe9\x3c\xdb\x51\xa6\x1a\xa6\xf4\x5b\x35\x1b\x26\x46\x1d\x13\x29\xf3\x15\x12\x72\xac\x39\x62\x34\xd0\xd6\x7c\x17\x8a\xcf\x91\xfc\x51\x0d\x86\x42\x9c\x69\xa8\x7f\xdf\x10\x11\x55\xda\x8d\x94\xde\x67\x22\x23\x8a\x6f\xb1\x70\x16\x86\x2b\x11\xd5\x02\xc6\x67\xee\x9c\xa0\xaa\xbe\x1c\x20\xb9\x77\x89\xf1\x86\x7a\xdd\x78\xb8\xb8\x7e\x9a\xb5\x19\x34\xc0\xb4\xa1\x6c\x2c\xbc\x4d\x2e\xfe\xdb\x79\xc0\x5b\x23\xe0\xcf\x78\x92\x01\xac\x75\xfe\x07\x6d\x31\x5f\xcb\xac\x20\xba\x0d\x31\xe4\xdc\x61\x69\x27\xd6\xea\xb1\xb1\xc8\x7a\x1c\x9c\x77\x8e\x4b\xd2\x85\x29\x58\x74"}, -{{0xff,0x15,0xd6,0xe7,0x4e,0x28,0xe4,0x1d,0x05,0xa8,0x66,0x3a,0x70,0x2f,0x03,0x8d,0x5b,0x85,0x78,0xc4,0x27,0x5e,0x77,0x2b,0x73,0xba,0x44,0x0b,0xc5,0xf5,0x5a,0x06,},{0x47,0x47,0xe2,0xe9,0xb8,0x26,0x37,0xb3,0x84,0x4b,0x85,0xf7,0x5b,0x59,0xf7,0x13,0x6b,0x7f,0xdb,0x1a,0x62,0xe7,0xb7,0x0d,0x6a,0xac,0x17,0xb3,0xc5,0x75,0x2f,0x2f,},{0x42,0xc1,0x29,0x5f,0xaf,0xe2,0x6d,0xe3,0xea,0x34,0x92,0x6b,0xf1,0xef,0x80,0xbc,0xaf,0xe4,0x7b,0x21,0xb9,0x0e,0xae,0xd1,0x96,0x35,0xed,0x75,0x38,0xd7,0x67,0xcb,0xf3,0xa1,0xe5,0xde,0xda,0xab,0x82,0xad,0xf7,0x51,0x20,0x37,0x3e,0x92,0x32,0x02,0xf7,0xfd,0xa0,0x82,0x67,0x84,0x29,0x2e,0xba,0x8b,0x23,0x8b,0x6c,0xb8,0x83,0x04,},"\xce\x7b\xf9\x72\x84\x4f\x51\x84\xae\x8e\xac\x87\xb1\x2b\xe9\x20\x2c\x72\x39\x96\x1d\xc2\x3c\xd4\x1f\xf5\x5b\x9b\xfa\xac\x0c\xc0\x6f\x3f\x1d\xec\xfa\x95\x71\x09\x5c\x8e\x82\xb4\xeb\x6f\x8a\x1c\x52\xc8\xd3\xde\xaa\x61\xa9\xaa\x94\xe2\xec\xd9\xab\x5b\x80\x63\xf2\xda\x6d\x80\x15\xdf\x0a\x51\x44\xfa\x3a\x48\xe3\x05\xad\x9f\x41\xea\xa1\x1c\x4d\x74\x85\x43\x74\xec\xbf\x38\x2e\x30\x02\x57\x9a\x9a\x24\x9e\xfa\x1e\x1c\xa0\x4d\x33\x84\x47\xd7\xf2\x20\x67\x03\xe6\xca\xbf\x5b\xbd\x33\x2b\x42\x57\x3b\xcb\xd3\xb6\xf7\x1b\x7c\x3b\xf7\x3d\x4c\x77\x4a\xa0\x1e\x86\x68\x41\x43\x28\x29\xd0\x7f\x96\xe1\xf6\x1a\x20\x21\x6d\x96\x8c\x90\xe3\xed\x11\xf6\x63\xf7\xd6\x27\x16\x22\xfe\xfc\xf3\xab\x68\xf3\x44\x32\x85\x15\xd5\xcc\xe2\xce\x85\xe8\xbf\x3d\x1d\x09\x04\x36\x92\xe1\xfb\x8b\xbd\xdc\x07\xa4\xab\x0a\x3e\xef\x8c\xa6\xa4\x20\xe7\x4b\xff\x8d\x3d\x71\x55\x96\xaa\x82\x16\x82\x95\x4f\xe8\x96\x29\xae\x27\xc1\xbb\x03\xb6\xaa\x09\xf3\x6a\x39\xa3\xe3\x7b\xa9\x81\x32\xf4\xe2\x38\x88\xf9\xf3\x35\xe7\xbe\xaa\x2c\xb2\x72\x7a\xcc\x3d\x27\x77\x30\x9b\x85\x29\x52\x32\xe5\x4d\xa8\x8e\xbb\x6f\x10\x53\xd6\xde\x79\xac\x66\x09\x85\x2e\xb9\x3a\x0a\x35\xbc\x1a\x7b\xdc\x22\xd6\x28\xbc\x86\x12\x4d\x69\x6c\x3f\x98\x28\xb6\xf8\xb9\xaa\xde\x1a\x65\x21\x61\x77\x48\x6c\x25\x2a\x4b\x42\xd9\x0a\x4e\x0f\xea\x20\x93\x48\x9e\x24\x4d\x80\x8e\xf7\x02\x1a\x97\xd5\x60\x8c\x0a\xe1\xd6\x63\xc7\x75\xe8\xbb\x9e\x9a\x73\x15\xf1\xfe\xb6\xd1\x29\xb5\xa5\x41\xea\x59\x29\xa2\xc6\x33\xb6\xd8\xc3\xc4\x54\x41\x71\x79\x46\xcf\x87\x3e\x9b\x4c\x51\x21\x80\x13\x5d\x54\xf0\x53\xab\xe4\x4c\x6d\xf3\x9b\x7b\x06\x2e\xf7\x24\x01\x62\xcb\xd0\xb8\x51\xaf\xe5\xf9\x15\x36\xa9\x49\x94\x18\xe8\xbf\xf4\x99\x64\x73\xd8\x05\xeb\xc1\xae\x48\xda\x2d\x0b\x12\x9e\x8e\x82\x52\xf1\xd5\x3c\x32\x8f\x32\xdb\x25\x2d\xe3\xbe\xfb\xe5\xf3\x12\x80\x12\x11\x43\xa8\x00\x4a\x4c\xae\x63\x1c\x82\x74\x09\xe5\x20\xe3\x94\xcd\x0f\x89\x50\xcd\x4c\x3c\xf3\xf3\xdb\xd4\x95\x2a\x4d\xfe\x69\x87\x5f\x56\x53\x89\x06\x1a\xd0\xa0\xce\xe6\xb6\xaf\xf0\x9c\xec\xa2\x6d\x99\x0e\x89\x6a\x2a\xba\x9f\x3b\x26\x01\x5b\x63\x42\x37\x68\x68\x4c\x03\xed\x0d\xe6\xce\xe7\xac\x5b\xbd\xf9\xf4\x85\xc2\x27\x5c\xd1\x2a\xef\xa8\xf9\x07\xb8\x51\xa0\x2d\x51\xc3\x4f\x12\x1b\x77\xf3\xa5\x6a\x9e\xbd\x1d\x65\xff\xe8\x9b\xee\x38\x1f\xf2\xa7\x48\x0e\x89\x68\xcf\xf2\x5a\xc8\xd0\x4e\x14\x9a\x9d\x50\x27\xd1\x4b\x88\xf8\xae\x26\x04\xd2\xac\x22\xac\x67\xd1\x3e\x90\xad\xa6\x20\xc2\x04\x6d\x28\x29\x93\x84\xd0\x95\x9f\xb7\x6e\x22\x58\x87\x96\xce\x42\x7a\xae\xaf\x4e\x2a\x8a\xae\xc3\xe8\x7f\x84\xcc\xd0\x82\x52\x4c\x96\xd7\x66\xee\xc6\x6f\x0b\xec\x3e\x79\x95\x58\x14\x5f\x09\xd3\x30\x13\x4f\x1c\x63\xf3\x70\x53\xcd\x4b\xdc\x1c\x37\xfd\xe9\x72\x91\x85\x75\x51\xf5\x0a\xc8\xe1\x5f\x06\xac\x1c\x73\xda\xa1\xe8\xc5\xbc\x92\x77\xe3\xd6\x9c\xb4\x4a\x32\x37\xec\x57\xdb\xbc\xcf\xdf\x66\x85\xad\xa2\x0b\x74\xa1\xbc\x6b\x74\xab\x05\x69\x0e\xaf\x9b\xd0\xc4\xbe\x17\x04\x2f\x5c\xd3\x20\xcd\xd6\x13\xdc\x08\xd2\x9a\xf3\x46\xaa\x41\x91\xce\x0b\x4f\x85\xbb\x2a\xd7\xf3\xba\xc7\x38\xa9\x37\x7e\xc6\xb8\x40\x62\xcc\x70\xfc\xa9\xec\xfb\xe1\xf5\x7f\xe5\xb2\xce\x7a\x4f\x73\x9c\x81\xca\xbc\xde\x04\x64\x51\xdd\x61\xce\x1d\xbc"}, -{{0x1e,0xd3,0x7b,0x61,0x0b,0x8b,0x35,0x41,0x7d,0x04,0xe5,0x9a,0xaa,0xda,0xc6,0x88,0xff,0x81,0xf1,0xe5,0x07,0xc8,0x9b,0x4f,0x40,0x01,0x60,0x94,0x19,0x08,0xcb,0x8c,},{0x48,0xe8,0xcb,0xeb,0x12,0x40,0xbd,0xeb,0xf0,0xa2,0xd9,0x29,0x53,0xaa,0x89,0xb2,0x82,0xc4,0x9a,0xab,0x2c,0x38,0xae,0x69,0x04,0x4c,0x51,0x51,0x5c,0x33,0x00,0xd5,},{0x86,0x08,0x81,0x5e,0x10,0x59,0x0d,0x55,0x04,0x87,0x4d,0x89,0x99,0xfd,0x6f,0x09,0x62,0x6f,0x95,0x0b,0xe2,0x0c,0x91,0x2c,0x27,0xc9,0xde,0x6e,0x79,0xb0,0xfa,0xf7,0x77,0xa5,0x33,0xbd,0x5b,0xb6,0x67,0xab,0x51,0x3a,0x49,0x45,0x8e,0xcd,0x67,0x87,0xa0,0x9e,0xc0,0xdf,0x6c,0x9c,0x9d,0x63,0x33,0xc5,0xe3,0xae,0x61,0xea,0x37,0x0a,},"\x1e\x67\x67\xdf\x97\xdb\x1c\xfb\x40\x88\xda\x7b\x20\x0d\x9f\x59\xec\x8d\xd4\x53\x3b\x83\xbe\x30\x9f\x37\x65\x00\x31\x06\x57\x27\xcd\x52\x02\xce\xf4\x84\x26\xa5\xf3\xa1\x1d\x50\xb3\x81\xf8\xbc\x22\xff\x10\x18\x27\x35\x9f\x2d\x0a\x61\x0a\x4f\x75\x54\x64\xa0\xc8\x91\xcb\xd9\x8d\x2d\xcb\x41\xd9\x77\x9d\x28\x8f\xcf\x1f\xea\x62\xe5\x21\x63\xae\x67\xe9\x04\x28\xb8\x63\x98\xef\xa2\x18\xf1\xb9\x82\x08\x1f\xc5\x13\x30\x5f\xd3\xe8\xec\xe7\xf9\xac\xb0\xe1\x0e\x00\x1d\x2e\xd2\x99\xa4\x8a\x80\x87\x0b\x3d\x5d\x8a\xb9\x00\x63\x09\xb3\x15\x91\xca\xf0\x58\x33\x80\x07\x3a\x2d\xb6\x1f\x45\x25\x4a\xb9\x65\xb5\xe4\x67\x2c\x4b\xfa\xa8\x6e\x33\x6c\x49\x27\x85\x52\x72\x9f\xb2\xda\x76\xff\xe5\x02\xec\x61\xe1\x69\x6c\x7f\xc9\xef\x19\xf7\xcc\x2a\x27\x75\xb2\x97\x00\xcb\x38\x42\x94\x06\x3a\x17\xfe\xd4\xfc\x63\x5b\xc1\x32\x82\xa9\x0d\xad\x0c\x00\xaa\xdb\xcd\x56\x9f\x15\x6a\x85\x4f\x8b\xa9\xe7\xd6\x07\xd2\x0f\x2e\x9e\x53\x37\x98\x11\x61\xd8\x04\x64\x46\x68\xd0\x64\xfa\x63\xdc\xeb\x9f\x58\x01\x35\x3d\x0a\xb9\xf4\x1d\x1d\x8b\xdc\x76\xc1\x3a\xb2\xf0\x23\xea\x01\xad\xbc\x4c\x81\x68\xd9\x39\xe9\x8f\x64\xfd\x89\x19\x38\x4a\xbe\x76\x70\x92\x63\xc0\xcd\x7c\x3e\xfa\xdc\x28\x01\xcc\x4a\xbd\x80\xa0\x9b\xb3\xed\x6b\xb7\x8c\xd6\x20\x96\x9c\xd3\x5c\x6a\x3a\x5d\x01\x48\x5e\xad\x4c\x45\xeb\xb6\xac\x6a\x83\x21\x2a\x7c\x76\x67\x54\x27\xb2\x1d\xa8\xa7\xa5\x04\x7b\x30\xa6\x10\x0c\xda\x02\x47\x6c\x18\x6e\x6c\xe4\x0d\x27\x68\xa9\x42\xc9\xf8\x73\x05\xe9\xd3\x63\xb5\x24\xc0\x09\x4a\x9e\x2e\x29\xf5\x85\x89\x4c\x0a\xdb\xfc\xd6\x06\x90\xfc\x7f\xb0\xa9\xc7\x17\xcf\x43\xb4\x84\xfd\x45\x15\x1b\x13\x04\x16\x9c\x26\x92\x1d\xb2\x27\x6e\xc0\x5a\xd2\x2a\xd1\x66\x85\x4f\xd2\xf9\x40\x85\x77\x8c\x47\x0d\xc4\x52\xe5\xcf\xa4\xae\xe0\x4f\xac\xb7\x70\x52\x6e\x1f\x24\x8d\x3d\x15\xc2\x72\x80\xfd\xfa\x1f\xd2\xc1\x04\x4b\xcb\xc8\x81\xc3\xd9\x98\x15\xc9\x7f\xbe\xa4\x61\x10\xbe\x02\xda\xb7\x74\xf3\xa6\x10\xe5\x80\x2a\xbf\x36\xa4\x98\x75\xc6\x82\x63\x8e\x0a\xe4\xcc\x82\x77\xc5\xe9\xaa\x73\x07\x44\x5e\x6b\xbc\xbe\x54\x9e\xec\x2a\x45\xb1\x59\x7f\x74\x47\x10\x7b\x62\xe2\xce\xe0\xa5\xfc\x51\xbe\xae\x3e\x1f\xe9\xbe\xfb\x18\x85\xd9\xb3\x0f\x9b\x4f\x1f\x56\x20\x6d\xee\x0d\x67\x77\x9c\x57\xf4\x84\xc8\xc3\xc8\x99\xa5\x15\xa9\xd1\xc1\x0f\x60\x59\x84\x0c\x1c\x73\xd3\xf0\x5b\xcb\x88\x59\x0c\x52\xf7\xda\x39\x18\x38\xdc\x2e\x73\x22\x8f\x09\x81\xc2\x89\xa4\xc2\x7f\x0c\x75\x7f\xaf\x7b\x3b\x89\x14\x6e\x33\xda\xfa\x49\x0d\x9e\x0f\x92\x75\xb0\xcf\xa6\xa7\x71\x0a\x73\x83\x14\x59\x59\x5b\xf7\x32\x11\x2b\x62\xfc\x86\x4c\xa4\xc8\x29\x78\x4a\x3f\x16\xee\xc4\xe1\x8f\x93\x69\x18\xa7\xb9\x89\x16\x69\xe9\x33\x22\x3f\x74\x5f\xda\x56\x2b\xc0\xa4\xe6\x1e\x3d\x14\xea\x45\xdf\xc3\x27\xe2\xfc\x0c\xdf\xe6\xf2\xf9\x75\x46\xc9\x0f\xce\x82\xf5\x22\x29\x14\x80\x11\x1a\x1e\x6b\x93\x88\x27\x2c\x0b\xe2\x8d\x20\xed\x84\xbb\x84\xd4\x9b\xc1\x99\xcd\x59\x99\x48\xb8\xf2\x03\x9d\x07\x82\x7a\x3f\x40\x75\xd3\xa6\x7e\xe5\x72\xa0\x13\x79\xa3\x62\x13\xfe\x11\x6e\x76\x8b\x41\x14\xe8\xa4\xb3\x13\x4c\x38\x18\x96\x07\x72\xd7\x27\xb0\xca\x6f\x7c\x99\x7c\xa9\x98\x43\xb7\xeb\x02\xff\xc0\x13\x97\x1c\xbe\x0e\x6e\x60\xd4\x97\x73\xf1\xe8\xc0\xb3\x06\x06\x13\x1c\xb1\x0c\x3e\x04"}, -{{0x84,0x36,0x44,0x78,0xec,0x94,0xbd,0x25,0xc4,0xbd,0xb8,0x2d,0x29,0x62,0x29,0xe6,0xda,0xce,0x2b,0x13,0x59,0xd6,0xd2,0x1b,0xe2,0xb3,0xaf,0xcd,0x7b,0xda,0x19,0xc7,},{0xa1,0x81,0x4f,0x8c,0xe0,0xfc,0x3b,0x23,0x60,0x93,0xa5,0x0f,0x46,0x8c,0x13,0x16,0x21,0x1f,0xe6,0xc5,0x2e,0x23,0x45,0xd9,0xf0,0x76,0x6b,0x36,0x88,0xa0,0x3c,0xad,},{0xb4,0xc2,0x32,0x1a,0xde,0x3c,0x19,0xed,0x4e,0xd4,0xc6,0x39,0xd5,0xa4,0xd6,0xf2,0xbe,0x8e,0x2f,0xb1,0x3b,0xb7,0xbd,0x62,0x5a,0xd6,0xdc,0x87,0xe2,0xc2,0x0f,0x93,0xad,0x6b,0xe7,0xb7,0xe4,0x27,0x11,0xa8,0x78,0xdb,0x9d,0x76,0x05,0x4b,0xfd,0x7b,0xc2,0x5e,0x37,0x74,0xa9,0x3d,0xa1,0x54,0x3c,0x9b,0x4f,0x66,0x33,0xb0,0xbe,0x09,},"\x7b\xb7\x29\x3d\xe5\x5f\x05\x8f\xb2\xec\x22\xb6\x87\x26\x05\x43\xdc\xaa\x90\xf1\x40\xb9\xf4\x5e\xdd\xd4\xbc\x22\xe4\x09\x77\xe0\x0e\xd3\x3c\xd1\xef\x1b\xba\x13\xc1\xd0\x99\x08\x59\x00\x55\x69\xa8\x07\x67\xe4\x86\x4a\x2c\xd2\x88\xc8\x13\x93\xe0\x4a\xd9\x71\x78\x2e\x2b\xc4\x93\x10\x8c\xbe\x80\xda\xcf\x0b\x7b\x9c\xd5\x34\x98\x84\x07\xa4\xf9\x32\x7e\xc8\xe9\xc4\x04\x32\x84\xef\x6e\xe5\xa2\x6a\x5b\x41\x77\x65\xd3\xea\xbb\x48\xa0\x07\xe7\xc7\xf3\x29\x87\xd7\x0a\x13\x9a\xc4\x16\x78\xcd\xf7\xa5\x5c\xb8\x0c\xf9\xdb\x5e\xaa\x45\xf3\xde\x0f\xbf\xba\xdf\xfc\x40\x99\x63\x70\xe4\x8b\x1f\xf5\xed\xd9\x79\x40\xe7\x50\x79\x21\x64\x83\x6a\x4a\x5a\xc2\xe3\xff\x53\xe4\x8a\x1e\x55\x6d\xb9\xad\x0c\x5c\x0b\x94\x4f\x4a\xee\x51\x9a\x2b\x0a\x88\xbb\x1c\x1f\xc7\x45\x45\x24\xcd\x57\xaa\x53\x50\x98\x62\x43\xd3\x4f\xc5\x8e\x24\xe8\x19\xec\x0b\x85\x45\xd8\xdf\xcf\x6b\x20\x31\x14\x41\xd3\xa3\x5d\x3e\x71\xb3\xe3\xec\xd7\x88\x4d\xda\x84\x33\xa4\x05\xe3\xd9\x96\x90\x00\xc8\x20\xa8\x9b\x95\xd1\x97\x84\x1d\x98\xae\x73\x4a\x2e\x81\xda\xf6\xa7\xdc\xf5\x6c\xb2\xfc\x26\xf2\x16\x5a\x5f\x42\xb8\x6c\x7e\x9e\x5b\x11\x16\x17\x00\xa1\xab\x98\x31\xf3\xfa\xe5\x8e\x14\x20\x8b\xe1\xbf\x33\xb5\x8e\xcc\xe8\x1b\x0c\x6b\x7e\x02\xf8\x8a\xdf\x9a\xb0\x30\x26\x3e\x2c\xc9\xb6\xe3\x3e\xbc\xa3\xf4\x95\x49\x2e\x32\xbf\xe3\x72\x53\x7d\xe6\xc6\xb8\x76\x44\x82\x8f\x74\x94\x2a\x02\xb0\x07\xf1\x4c\x3f\xc5\xdb\xde\x76\x33\x3d\x36\xd0\x76\x31\xb7\xa9\x92\x4f\x71\x75\x50\x04\x06\x97\x92\x3f\xa7\xb9\x54\x6b\xfb\x02\x17\x02\x4e\xa3\xf2\x52\xb5\x15\xb5\xd6\x4a\x62\xc4\x8e\x02\x7c\xef\x67\x50\xbe\xda\x49\xa0\x24\x47\x03\x9b\x25\x0a\x0b\xda\x07\xdc\x06\x24\x91\xa6\x62\xe2\x68\x74\xc8\xd0\x0f\x80\xe6\xcf\xc8\xb3\x0f\x2c\x3b\xf7\x72\x0b\x57\xf2\x61\x5f\xc4\x78\xfe\xfa\xa6\xd3\x17\x05\xb4\x3c\x5a\x54\xf7\x58\x66\x6b\x30\x2a\x8d\x34\x95\x31\x31\x94\x1b\x79\x57\x73\x04\x76\x79\x4d\x0b\xd9\xd2\xdf\xa7\x2f\xd2\x03\xf2\x2d\xf5\xec\x6b\xba\xac\xe8\xb9\x39\x4b\xeb\xda\xea\xa5\x61\x46\x10\x11\xb4\xfc\xa6\x18\x5c\x9a\x38\x28\x3f\x54\x03\xfd\xac\x32\x6d\x1f\x73\x4c\x6a\x5d\xed\x67\x24\xd9\xf3\x84\xae\xbd\x6c\xab\xfc\xbe\xc1\x2a\xba\xb9\x82\x0d\x08\x07\x32\x51\x5e\x05\x00\xcf\x5d\x3e\x2f\x9e\xf8\x0a\x4d\x76\x46\xa7\xda\x9e\xff\x41\x0f\x50\x7c\x69\x87\x3b\x32\xd5\x40\xec\x32\xb2\x83\xef\x31\x79\xa4\xc6\x32\xb3\x66\x57\x6d\xff\x05\x8f\xaf\x8c\x8c\x70\xbc\x69\xbe\x80\x89\x82\xec\x14\x97\xae\x89\x11\xb0\x01\x65\xa6\x66\x95\xf4\xd3\xb9\x87\xe7\x39\x0b\x5c\xf8\x78\xe3\x5e\x67\x65\x41\x28\x5e\x4e\x13\xdf\xae\xb2\xf3\x68\xcb\x51\x1b\x77\x8b\x10\x6a\x42\x87\x78\xa1\xb8\xf2\xa7\xd2\xe0\x93\x51\x9b\xc9\xb5\x18\x8e\x38\xc6\x79\x3e\x96\xbd\x0d\x30\xe2\xa3\xdb\x9e\xe1\x46\x8c\x3d\xc8\x7c\xc3\x65\xc8\x10\xf9\xdb\xdf\x01\xa4\xb5\x14\x21\xf6\xfc\x8d\xfd\xa3\xa1\x6e\x2d\xa7\xca\x71\x59\xb6\x86\xa5\xe1\x67\x33\x89\x37\x88\x2f\xf7\x15\xd3\xe7\x50\xd9\x58\xfc\x9e\x4b\x1f\x05\x53\x12\x92\x99\xaa\x84\x30\x18\x3e\x50\x6c\xd7\xf2\xb2\x79\x07\x6e\x0e\x1c\xca\x97\x49\xcf\x12\x3c\xe5\x07\xfe\x07\xdd\xbb\xc4\xdc\xca\x6c\xdb\x9e\xf1\xb8\x33\xf6\x1d\x4b\xff\x00\xbe\xc0\x12\x15\x8f\x43\x2c\xeb\x75\xb4\xf2\xed\xb1\xbb\x84\xe5\xeb\xb9\x25\x9e\x09\xf9\x62\x5c\xe3"}, -{{0x00,0xdb,0x37,0xad,0x2a,0x19,0x5f,0x08,0xa0,0x84,0x40,0xd0,0x59,0x25,0x9e,0x53,0x9f,0xeb,0x40,0xb4,0x74,0x92,0x82,0x55,0xe7,0xc9,0x4e,0xbc,0x3b,0x05,0x03,0x8c,},{0x04,0xf8,0x8b,0xf6,0x39,0xe0,0xf7,0x1a,0x57,0xd0,0xd0,0xaf,0xff,0x5f,0xe9,0x7d,0xde,0x38,0x09,0xff,0x28,0xec,0x68,0xeb,0x6f,0xc4,0x23,0xf4,0xfa,0xff,0x43,0x90,},{0xf4,0xd1,0xc8,0x0f,0x5e,0x7b,0x91,0xc5,0xc7,0xa8,0x2a,0x68,0x2d,0x49,0xba,0x6f,0xb1,0x9d,0x40,0x0a,0x29,0x97,0x48,0xa0,0xc9,0x69,0xbb,0x99,0x81,0x69,0x98,0xbe,0x63,0x4e,0x84,0xda,0x78,0x58,0x1b,0x06,0xe3,0x47,0x0e,0xfe,0xc3,0x98,0x04,0xfe,0xd9,0x3d,0x29,0x73,0x9f,0x04,0x39,0xa8,0x09,0x5a,0xc4,0x0d,0x9d,0x38,0x5e,0x04,},"\x5a\x94\xf7\x29\xd3\x0d\xd8\xaa\xe2\xa5\xc8\xc2\x85\x47\xbf\x45\x06\x29\x5d\xc6\x1b\xfe\xad\x97\x27\x74\x60\x82\xd4\x3b\x0f\x81\x14\xc8\xc1\x8c\x5e\xda\xf2\xfe\xc7\xca\xe8\x19\x35\x63\x38\xf0\xbf\x11\x5a\x17\xb0\x38\xac\xfd\x7c\x96\xba\x62\x62\xca\xbd\x57\x10\xfc\x0e\xfb\x43\xd1\x3d\xf4\x06\x5b\xec\xbf\x1b\x9e\x27\x9c\x03\xec\x9b\xbf\xed\x54\xd9\xa1\x3f\xe0\x6a\x55\xa3\xbd\x05\xc8\x07\x85\x8b\x41\xe1\x8d\xbd\xe1\x3b\x09\x07\xd4\x03\x41\x32\x26\x2d\x9c\x2f\x4d\x2d\x37\x6e\x16\x09\xad\x28\x0d\xe2\x0b\xa7\x09\x84\x4d\xbd\x12\x95\x02\x57\xf1\xb0\x7e\xf8\xcc\x33\x37\xc0\x1a\x70\x26\x93\xfb\x4d\x92\xd0\x47\xe6\x98\xc3\xa6\xdd\x46\xc4\xa9\x2a\x10\xd4\xc7\x80\xe5\x2e\x50\x25\xe0\x9d\x56\x53\x5d\x7e\xeb\x9f\xe7\xf0\x33\xe6\xe9\x26\x0a\x68\xf9\xd5\x4b\x6f\x37\xcc\x06\x96\x56\xe3\xbc\xee\x06\x92\x2b\x34\x96\x81\xa8\xe7\x75\x1c\xde\xcb\xe1\xec\xb6\x63\xfb\xc6\xf7\xc8\x61\xf8\x53\xdc\x31\x0f\x33\xde\xfa\x98\xee\x34\x3a\x68\x63\x2e\xc2\x2c\xaf\xec\xb7\xf3\x21\x2f\x81\xe7\x0b\x71\x84\x3b\x9f\xe8\xc8\x6a\x68\xb5\xc8\x6f\x03\x22\xd3\x48\xa7\x6d\xa7\xf1\xba\x0c\xa3\xcd\x7b\x6f\xd1\x5f\xf8\x92\x92\xb3\xf6\x36\xcd\x08\xcf\x62\x5c\x74\xd5\x10\x2c\xab\xb5\x71\xa3\xdb\xa8\x6a\x1c\x92\xf4\x1c\x72\x03\xb4\x49\x42\xf5\xa2\x46\x25\xac\x37\xd7\x7e\x49\xa5\x7f\x11\x82\x38\x69\x9d\x80\x7c\x25\x0d\x5b\xf4\x6f\x7a\x3c\xec\x57\x79\xa6\xe5\xae\x1a\x6c\xa1\x60\xcf\xf3\x7f\xb3\xb7\x83\x88\xfe\x9c\x03\x0c\x40\xe7\x15\x46\x01\x08\x1a\x51\x7f\xc0\xaa\x18\x02\xcd\x3b\x84\x5b\x94\x6e\xfe\x94\xaa\x8b\x9e\x03\xf6\x8a\x80\xde\xd0\xdf\xbf\xad\x4d\xae\xe4\x0f\xa8\x38\xc1\x33\x84\x1a\xe8\xa3\xce\x0d\x79\xfa\x8a\x2b\x94\x34\xba\xc5\xe1\xda\x6e\x0c\x71\x93\xe8\xde\xa4\x35\xa0\x3a\x85\xf7\x61\x84\xf7\xeb\xe2\xaa\x74\x9b\xe9\x41\x31\x04\xa1\x78\x68\x9b\xa6\xd2\x7e\x94\xfc\xcf\x61\xeb\x3a\xba\x0e\x6a\x5a\x63\xaf\x0c\xa8\xf0\x5a\x35\xcb\x63\x70\x51\x94\xe4\x4d\x92\x93\xde\x39\x29\xb0\xd9\x2b\xe6\xf8\xe6\x27\xc3\x50\xa8\x3f\xc9\x00\x0a\xa9\x5b\x93\x82\x0b\xe9\x79\x5c\x80\xb5\x66\x2c\xd7\xb3\x48\x22\x32\x80\x61\x35\x6d\xc5\x80\x57\x8d\x1a\x35\xb1\x01\x40\xdc\xd2\x48\xe4\x85\x31\x04\xd2\xc5\xb2\xc1\x3f\xf6\x83\xdd\x5c\x30\x79\x4b\xe4\xa7\x68\x58\xaf\x1c\x0d\x9a\xf3\x47\xce\x1d\xcd\x97\x2e\xe4\x9a\xac\x12\xbb\xcd\x89\x9c\x93\x29\x87\x1d\x3e\x7a\x06\x83\xd1\x75\x77\x9a\xfe\x35\xf2\x6a\x2d\x24\x8f\xd7\x80\xea\x85\x1d\xc4\xba\x6d\x21\xf8\xa1\x71\xaa\x6c\xb8\x69\x7d\x9d\x11\x21\x61\x54\x03\x07\xcd\x54\xf9\x31\x77\x5d\x70\xb3\x3d\x3b\x6d\xe1\x09\x1f\xc1\x75\x05\x31\xc0\x8f\xa7\x0f\x7b\xe3\x8a\xa1\x10\xd6\x74\x6b\xb5\x65\xdb\x7b\x47\x0f\x90\x08\x50\xfb\xbf\x1c\x66\x2f\xd6\x13\xe4\xf3\xa5\x68\x95\x49\xe3\x10\x7e\x9b\x0f\x17\xde\xf7\xa5\xbd\x7f\xd7\x59\x6c\x4d\x04\xc7\xf4\x8c\x77\x9f\xc3\x5e\x09\x33\x5e\x1d\xf7\x84\x08\x4e\x55\xd8\x55\x1d\x1f\xf4\x9d\xe5\xb3\x11\xcd\x35\x0f\x34\x7a\x0b\xd2\x86\x3a\x2a\x30\xe6\xea\x18\x3a\xd2\xe3\xee\xde\xbc\x18\xdd\x28\xc6\xa5\x96\xe6\x93\xdc\x33\x89\xf7\xd9\x0b\x71\x3e\x3a\x85\xa6\x25\x16\x30\x5a\x70\x66\x7f\xc1\xfb\x3c\xb1\x0e\x8a\x95\x57\x50\x27\x39\x43\xc5\x68\xe1\x07\x69\xce\xf7\x81\x99\xdf\x44\x50\xdb\xc4\x90\xfe\xf1\xb3\x04\xb0\x52\x22\x1b\x2d\xb9\xc4\x4f\xe0\x03\x45"}, -{{0x6c,0xa1,0xa1,0x48,0x2a,0x07,0xf2,0xa6,0xc5,0x7f,0x04,0x11,0x97,0xb3,0x4a,0x51,0x19,0xe6,0x89,0x03,0xcf,0x6d,0xfb,0x51,0x71,0x1d,0x95,0x50,0x97,0x31,0x63,0xc0,},{0x80,0x34,0xa5,0x5e,0x3b,0x6e,0xd7,0x99,0xf4,0x9e,0x2e,0x70,0x3a,0x81,0xf4,0xac,0x02,0x57,0x3c,0x44,0x5d,0x76,0x5e,0x30,0x69,0xbe,0x42,0xf0,0x9c,0xbd,0x18,0xad,},{0xdd,0x9b,0xdb,0xad,0xd9,0xfd,0xc8,0x1c,0xe2,0x30,0x28,0x8c,0x4a,0x06,0x8d,0xf0,0x7e,0x18,0xb4,0xc7,0xcc,0x51,0xc0,0xca,0x48,0x11,0xdf,0xbd,0x04,0x76,0x5c,0x56,0xbc,0x88,0x32,0x40,0xe4,0x6e,0x3a,0x42,0xc0,0x1d,0x8d,0x24,0x24,0xfb,0xc3,0x32,0xb7,0xc5,0xa1,0x7b,0xce,0xb1,0xf6,0xe8,0xda,0xd0,0xbf,0xe5,0x62,0xca,0xd3,0x02,},"\x08\xfd\x84\x87\x50\x3c\x3f\x32\x96\xb6\xf1\xb6\x4d\x6e\x85\x90\x6f\xd5\x98\x6c\xf9\xc5\xd9\xfa\x8a\x59\xd9\x2f\x44\xe6\x47\x0a\xf3\x4b\xcd\xef\x33\x6f\xfd\xc8\x64\x56\xec\x7a\x7b\x57\x61\xf1\xad\xea\x02\x73\x26\x63\x0e\x68\xab\xc6\xb8\xcd\x5d\xdf\x40\xb6\x41\xa2\x59\xad\x02\x43\x21\xbf\x3e\xf9\x8e\x76\x32\x79\x71\x49\xc4\x92\xd5\x35\x94\x75\x2c\x55\x0d\xfb\xc4\xfa\x6b\xf4\x71\x76\xf4\x23\xa2\x70\x56\x93\x94\x7a\xa9\x0d\x68\xdd\xc8\xef\xb6\xcb\x9d\xbe\xca\xfd\x28\x30\xd0\x4f\xd9\x3b\x1e\x9e\x7c\x12\xb9\x3e\x0d\x0f\x3e\x26\x34\x90\x0f\x25\x86\x0d\xda\xdb\xae\xce\x17\x80\xff\x2d\x3f\x3d\x9f\xb8\x38\xfd\x0d\x5d\x66\xf8\xaf\xb3\x05\xff\x1a\x1a\xed\xca\x2b\x97\x4b\x63\xe4\x3f\x5b\x3c\xc9\xdf\xed\x1b\xcf\x11\x99\x91\x76\xed\x95\x85\xac\x82\x9b\xc6\x79\x4e\xf3\xac\xd8\x72\xe8\xd2\xe9\x26\x08\xb3\x20\xf8\x94\x99\x6a\x56\x2e\x1e\xb1\x77\xe2\x1b\xe5\x7c\x22\xc4\x1e\xc2\x59\xa3\xdf\xf9\xc7\xc9\x49\x1d\xb8\x38\xd7\x6c\xf9\xb0\x38\x31\x11\x59\x8e\x35\x7f\x44\xba\xbe\xbf\x12\x1b\xdb\x24\xee\x9d\x55\x7b\x7d\x5a\xf4\x91\xa0\xa0\x36\x5c\x90\x36\x1f\xe4\xf7\xe3\xd1\x3a\x17\xda\x3a\x39\xfd\x43\xf6\x90\xdf\xb0\xb2\xd8\x60\xca\xb4\x19\xf7\x75\xab\x71\x52\xcd\xc8\xf2\xaf\xdc\x50\xe8\xd5\xda\x5d\xa0\x17\x06\xee\xa2\xa2\xff\xad\x4b\xab\xee\x8b\x03\xda\x33\x6a\x4d\x84\x3d\x9d\x7e\x0a\x93\xf3\x6a\x92\xe6\x61\x0a\x36\x8b\x63\x13\x3f\x05\xa3\xfd\xc5\x5e\x3e\x1a\x44\x0b\x0f\x87\xa5\x33\x64\xc1\xd3\x72\x42\xc5\x7a\x10\x9e\x6d\xf6\x93\x45\xb0\x1c\x21\xc1\x08\x9e\x79\x0a\x66\xf4\xf3\x38\x0d\x3b\x76\xff\xb4\x20\xdf\xe1\xe6\x20\x0e\xac\xe5\x79\x26\x5a\x42\x7f\xbd\x35\x55\x14\xef\x95\x3e\x1a\x6e\x96\x8e\x37\x02\x1b\x3c\x6a\x29\x0d\xcd\x02\x93\xda\x67\x68\xda\xd7\xc6\x63\x11\x63\x30\x51\xc0\xac\xcb\x0b\x91\x65\x46\x4d\xfd\xdf\xde\xd2\x3b\xd1\x3e\xf9\x08\x74\x4f\x9c\x21\x11\xdc\x15\x31\x42\xd2\xf1\x05\x34\xd8\x93\xfe\x0b\x54\x5f\xec\x53\xfd\xb3\xb3\x5b\x51\x83\x98\xb0\x2a\xb2\x17\x91\xfa\x97\x7e\x30\xcf\x4b\x40\x4e\x7a\x29\x9d\x37\x87\x10\x8b\x83\x6a\xa0\xd5\x9c\x11\x4f\x1f\x36\x71\x9a\x7a\xcf\x85\xac\x99\x4d\x9c\xb7\x23\x06\xf2\x58\xf7\x8a\xc0\xa3\xb6\xc0\x53\x43\xe0\xb7\xa9\xaa\x72\x6e\x52\x26\x7e\xdf\x97\xf4\x97\x2f\x76\x64\xf4\x37\x20\xad\x33\xce\x6e\x61\x54\x40\xe3\x65\x37\xcb\xc5\x69\xbd\x6f\xf9\x4f\xfd\xae\xa5\x1e\x06\x02\x9d\xae\x78\xc5\xb9\x15\xc5\x37\xca\xea\x6f\x15\x04\x14\x79\x79\xb8\xaa\xae\x0b\xcd\x96\x18\x43\x7e\xbe\xd0\xb5\x5e\xfa\xec\x32\x0e\x84\xc7\x59\x59\xa3\x7a\x26\x0a\x02\xd4\xef\x1b\xb6\x26\x41\x52\x0f\x1a\x03\xdd\xea\x8c\x4c\x1d\xe8\xd7\xfa\xc5\x8d\xa4\x08\xb0\xab\x47\x57\xa1\x35\xf1\xd0\x75\xc9\xf7\xc9\x9f\xb9\x9d\xb9\x42\x7c\xe9\xb0\xd6\x26\xcb\x1a\xc1\x89\xad\x86\x63\xd7\xa7\x14\xfb\x5c\xd1\x58\x5c\x3b\xf9\x9a\x0a\xa4\x6d\x76\x39\x78\xd0\xb1\x2d\x65\xc4\x38\xbb\xb7\x3f\xea\xa5\x1b\xa2\x6a\x45\x9e\x7b\xea\x25\x43\x94\x66\xc0\x86\x13\xe4\x25\x40\xc8\xc6\xd5\x43\x67\xf2\x21\xfc\xce\x0c\x5e\xb6\xaf\x2f\xaa\x18\x1e\xa2\x15\x21\x80\x9b\xe7\x56\x49\xcf\x8d\xee\x76\x71\xdb\x7f\x94\x8f\x34\x6c\xbd\x03\x02\xbf\x9a\x06\xea\xbc\x72\xe2\xe5\x12\xb3\xdf\x88\x5f\x6d\xaa\x39\x8f\x93\xe3\x6d\xae\x2d\x6a\x04\x47\x81\x21\xf9\x77\x87\xd4\xce\xdf\xf6\xdb\x09\xaa\xf1\x0f\x27\xb1"}, -{{0x27,0x84,0xdf,0x91,0xfe,0xa1,0xb2,0xd2,0x1d,0x71,0x3d,0xe2,0xed,0xc6,0x65,0x24,0x51,0xa0,0xc1,0x59,0x54,0xb8,0x65,0x60,0x62,0xea,0x1d,0xed,0xc2,0x44,0x5b,0x2a,},{0x95,0x56,0xdb,0x53,0x70,0xf8,0xfb,0x3c,0x74,0x78,0xde,0x03,0xd2,0x3d,0xf1,0xcd,0xa9,0x6f,0x27,0x40,0x11,0x8e,0xfd,0xd3,0xd1,0xa9,0xfa,0x4c,0x3b,0xfe,0x88,0x49,},{0x17,0xd1,0x71,0xd9,0x46,0xde,0x35,0x16,0x15,0x84,0x07,0xe1,0x32,0xcc,0x1a,0xce,0xca,0xef,0xd6,0xd0,0x92,0x11,0x2b,0xe6,0x53,0x99,0x95,0x23,0xe2,0x0b,0xd4,0x95,0xf7,0xb7,0xf6,0x00,0xe8,0xd5,0xa6,0x71,0x33,0x0d,0x32,0x69,0x3d,0x60,0x19,0xc0,0x8d,0x2d,0x00,0x3b,0x17,0x6e,0x63,0x19,0xc3,0x53,0x94,0x20,0x0e,0x02,0x7d,0x0e,},"\x2e\x3b\xc5\x4d\xf4\x16\x74\x1d\xbe\x79\x16\xad\x25\xf0\x4e\x48\xd5\xa9\xd7\x7a\x62\x3e\x57\xf9\xcd\x61\xec\xb4\x4f\x09\xf7\x68\x33\xeb\x2a\x3e\x9a\xb7\xaa\x89\xff\x5d\x2d\x56\x0c\x07\x17\x7d\x85\x4d\x7c\x49\xcb\xef\x49\x2b\x7f\x4f\x7e\x56\x7d\xe1\x27\x51\x24\xe1\x6c\xa4\xa7\x98\x01\x62\xfa\x0f\xd1\x62\xa8\xe5\xfd\x6f\x35\x61\x70\x07\x03\x4b\xce\xec\x57\xc8\xfa\xf7\x66\x4f\x4b\x3b\xaf\xfd\xea\x8d\x8f\xc2\xba\x22\xd5\x85\xe9\xe2\xd7\x39\xf5\xff\xc9\x9b\x4e\x0d\xbe\x9c\x36\x86\x54\x7e\xa0\x48\x15\xa5\x9c\x4a\x25\xb5\xf2\x39\x06\x68\xe4\x18\xba\x0f\xcb\xdf\x4c\x4a\x51\xf3\x39\x05\xc7\x4f\xbb\x83\x0a\x19\xf9\xbc\x86\x36\xdb\xaa\xff\x20\x99\x95\x44\x79\x96\xd2\xe5\xb1\xc3\x77\xb4\xcb\x87\xa4\xe1\xef\xe1\x2d\xe3\x4d\x33\x59\x9f\xf3\x97\xb7\x40\x17\xd7\x11\xed\xd3\xe7\x72\x15\x5b\xe5\xa4\x40\x6e\x74\xcb\xe2\x93\x1e\xf5\x13\x59\xaf\xd5\x1b\x5b\x1a\x7b\x3e\xa2\x2e\xe8\xed\xa8\x14\x76\xbc\xc1\x7e\xa7\x68\x0f\x6f\x31\x04\x70\x3b\x9f\x2a\x35\xcf\x26\x27\xeb\x74\x1d\x1a\x30\xaa\x4b\xee\xf6\x57\x9e\xc7\xd0\xb0\x7a\x4e\xf3\x2a\xbc\xb4\xd7\x56\x97\x0f\x70\xa3\x67\x8e\x17\xe6\xe5\x73\x18\x90\xae\xbc\x8c\x92\xb9\x56\xd4\xb3\xb5\xfe\x2a\xdf\xd7\x9b\x21\x1a\x18\x83\xdf\xc8\xc9\xa4\xb1\xb9\xc8\xc1\xbb\x26\x5e\x1f\x3d\xd3\x92\x44\x5e\xa5\x9b\x59\x0a\x01\x95\x51\xf8\x12\x18\x49\xf4\x35\xb3\xac\x1b\x29\x90\x2f\xc8\x39\x25\x54\x05\x6b\x93\x90\x3d\x5f\x26\x3b\x3d\x54\x08\x43\xd6\xaf\xa7\x5a\x2a\xd8\x30\x4b\x76\x90\xde\x99\xa7\x34\xc3\xd1\x30\xb6\x95\x47\xb1\x8b\x09\xe9\x8c\xbf\x25\x27\x30\xe4\xae\xdb\x6d\xc4\xb5\x8b\x22\x43\xfe\x55\xe8\x09\x39\xd3\x7b\x0a\x59\xd7\x22\x26\xd8\xa2\xcc\x51\x53\x09\x5e\x15\x99\x4a\xd6\x21\x95\xaa\x31\x0f\x2a\x64\x26\x67\x6b\x66\x1e\x47\xb9\xfc\xff\xfa\x04\xd6\xdc\x62\x5f\x29\xf4\x4c\x7c\xf6\x20\xb3\x78\xa6\x5d\x23\x83\x44\xb3\x80\x44\x8c\xd1\x19\xcc\x7f\x37\x3f\x62\xcd\xfa\xd6\x41\x49\x90\x63\x53\xf3\xa5\x41\x07\xc5\xdb\xa6\x5e\x3c\xc4\x94\xb0\x53\x1f\x4d\x64\x74\x93\x63\xf2\x30\x73\x8b\x2c\xfe\xed\x98\x35\x20\x22\x7d\xd5\xbc\x43\xbe\x59\xb3\x26\x8e\x28\x32\x16\xf6\xe9\xc7\x5e\x0c\x1c\x71\x27\x2e\x54\xfd\xb2\x9c\x78\x58\xd2\x87\xd1\xef\xa1\x91\x7b\xe3\x7c\x8e\xea\xb5\xe4\x4c\x3a\xd7\xb3\x6e\x8a\xc9\xf6\x69\x91\xeb\x82\xa5\x14\x8e\x59\x72\x03\x4a\xd0\x1c\x62\x61\x5a\x45\x15\x45\x79\xfa\x50\x86\x9e\x7b\xe9\x87\x6b\x56\x56\xea\xad\x2e\x43\x02\x5a\x62\xdd\x13\x4b\x61\x2d\x8f\x4d\x5e\xbc\xf8\x05\x6e\x19\x8b\x71\x34\x38\xe8\xe0\xe3\x47\xca\xfb\xfc\xb8\x9e\x39\x4a\xa3\x30\xd4\xc7\x88\xd4\x9c\x65\x8f\xcf\xc8\x0b\x3e\x00\x78\xf0\xe8\xe1\x9a\xa9\xb8\xfe\x8e\xb0\xba\xb9\x3d\xe7\x85\xd0\x43\xe0\xf4\x75\xae\xb6\x0d\x62\xe3\x8f\xb1\xf8\x38\x4a\x00\xb7\xa9\x02\xda\xee\x13\xd2\x13\x62\x69\xe5\x08\x01\xb8\x0a\x65\xb2\xf9\x13\xcf\xe3\xff\xb3\x65\xd9\xaa\x2f\xd1\x93\x72\xa0\xb0\x22\x56\x95\x44\x4e\x4b\xc5\x48\x71\xd1\x08\xe0\x9c\x7e\x1c\x2b\x42\xdc\xbb\xac\xce\x24\xea\x5b\xd5\xbf\x1f\xcf\x4a\xc6\x97\xa3\xfe\x09\xa5\x46\x77\xb7\xa8\xdc\x8d\x5e\xec\xb8\x6c\xc7\x92\xee\x9b\x6f\xea\x2d\xe1\x6a\x47\x32\x69\xfd\xc6\x5d\xbb\x73\xc2\x58\xc8\x21\x44\x04\x07\xc6\x42\xf7\xd3\xd3\xf5\xc7\x08\xd5\x53\x32\xda\x83\x43\x10\x6c\x19\xb2\x30\xa5\x14\x27\xf3\xb7\x71\x91\x6a\xe3\x68\x8b"}, -{{0x4b,0xb7,0x92,0x36,0xfa,0xda,0x31,0x44,0xb6,0x82,0x96,0x49,0x9b,0xa4,0x4a,0xe5,0x34,0x07,0x4c,0xa9,0x4d,0x4b,0x58,0x1e,0x5e,0xdc,0xff,0xfe,0x13,0xb3,0xad,0x19,},{0x0a,0x83,0x99,0xf1,0xe5,0xa4,0x23,0xdc,0xf7,0xb2,0x5b,0x2f,0xb0,0xac,0x9e,0x1e,0x95,0x48,0x14,0x8b,0xea,0x84,0xd0,0x21,0xe0,0x42,0x87,0x60,0xe0,0x5d,0x58,0xbf,},{0x69,0x8f,0xab,0x68,0x51,0x0d,0xb8,0x12,0x1a,0x46,0x5d,0xb7,0x7e,0x4f,0x8b,0x58,0x6a,0xee,0x89,0x58,0x16,0xe6,0x3b,0xbf,0x0b,0xeb,0x24,0x2d,0xb4,0xe8,0x4c,0x15,0x7f,0x4b,0xe2,0x01,0xae,0x65,0x64,0x51,0x7a,0x87,0x0d,0x17,0xf6,0x0c,0x85,0x83,0x70,0xc0,0x1c,0xca,0x17,0x18,0x9c,0xb4,0x18,0x9e,0x81,0x43,0x91,0xd1,0x50,0x0d,},"\xad\x81\xab\xf6\x93\x7a\x7a\xcd\x7f\x18\x37\xf0\x4d\x3f\x10\xe7\x08\xc6\x1a\x5f\xbe\xde\xee\x4d\xb7\x6e\x15\x98\x57\x03\x84\xe6\xef\xec\xe9\x7c\x92\x5d\x2e\x5c\x34\x88\xca\xb1\x0b\x5b\x52\xb8\xa5\x48\x6e\x99\xd8\xff\xe8\x6c\x19\x81\xa1\xf1\xd5\x32\xdc\xd4\xd4\x89\xe5\x54\x6d\x86\x65\x32\x98\xe7\xa5\xf9\x6e\x81\x44\x55\x2d\xda\x8a\x18\xe7\x5b\x5f\x73\x55\xb1\x35\x41\x62\x11\x06\xe4\x97\xe5\x1a\x56\xd8\x65\x9d\x19\x8f\xe1\x00\x37\xe2\x21\x28\xaf\xc2\x71\x4a\x2c\xb5\xa1\x2c\xc5\xdb\x09\x68\xa3\x43\xef\x91\x8e\x87\x69\xdd\x6a\x3e\x5b\x9e\x32\xaa\xb6\x6c\xb0\x23\x9e\xbe\x4c\x17\xf1\x82\x18\xe2\x52\xeb\xa6\x16\x2e\x97\x70\x49\xeb\xac\x0b\x38\x04\x8b\x3a\xaf\xb7\xd4\xd7\x22\x63\xe9\x21\x28\x99\xa3\xbf\xe0\xa6\x9c\x99\xe2\x2a\xc6\x1c\x5e\x96\x12\x45\x63\x03\xd9\x24\x58\xb5\xc5\x02\x91\x6c\x34\xa8\xee\x5c\xd9\xa5\x82\xa5\x25\x76\xb6\xdc\x9d\x7d\x4c\x64\x2f\x21\x29\x98\xbf\x33\x58\xd4\xa8\xc2\xea\x67\x68\x6e\x55\xd4\x89\xf6\xa7\x6e\x6b\x07\x0e\x6e\x99\x5a\x74\x53\x26\xc9\xaa\x63\x63\x0a\x00\x33\xad\x30\x72\x1a\xa6\x5f\xac\x60\x4a\x6e\x58\xc7\x50\x72\x1a\x56\xca\x67\x60\xc9\x41\x34\xd6\x11\xfa\xb4\xd3\x54\xe4\xf6\x6a\x29\x67\x7b\x1a\x66\x66\x01\xe9\xda\x79\xf2\x13\xf5\x82\x03\x74\x33\xc0\x7f\x94\xd5\xf0\xde\x6a\xa9\xfa\xa0\xb3\x2f\x7b\x02\x3f\xb9\xfc\x13\x5a\x26\xf9\x70\x52\xac\x80\xb3\x9b\x30\x6a\xed\x13\x92\x6c\x28\x54\x19\xa2\x9b\x20\xe2\x37\x0d\x8a\x09\x5b\x32\x25\x8f\xa9\x89\x34\x89\xee\x21\x08\x9c\x75\x2e\xc0\x62\xe1\x20\x35\x9e\x2f\x35\x15\x12\x82\x54\xc8\x09\x8c\xca\x65\xa9\x1a\x02\x2d\xd0\x57\xa2\xc2\xa1\xb6\xb8\x5d\x13\x7c\x3c\x96\x7d\xcb\x70\xaa\x17\xa2\xff\x4b\x37\x67\x8b\x38\x29\x02\xf0\xf9\x31\xee\x74\x3f\xc3\x98\xac\x1b\x8c\x10\x46\x98\x67\x30\x84\x79\xe4\x0d\x7f\x2f\x04\xa4\xb0\x4c\x44\x89\x15\x84\x88\xdd\xb7\xbe\xc5\xa4\x7f\x20\xff\x35\x6d\x99\xa1\xb3\xe9\xd0\xb7\xfe\x9b\x0a\xd9\x49\xf2\x98\x96\x0e\xfa\x4d\x97\x28\xf8\x10\x1c\xf5\x3d\xa3\xbf\xfd\xd9\x52\x4b\xf4\x40\xa5\x8b\x32\x73\x8d\x0b\x62\x93\xe8\x53\xf4\x66\xff\xd4\x2c\x56\x07\xac\x9e\x35\x3b\xa0\x3e\xfb\x57\x8c\xc9\x96\x3d\x8a\xaa\x9d\x2e\x26\x6d\x1d\x2a\xe9\x29\x6f\x30\xc9\xef\x44\xec\x69\x10\x30\xd5\x96\xa4\x01\xb6\xce\xe7\x2a\x54\x0e\xf3\xc4\x2e\xc0\x17\x42\x66\xba\x54\x01\xf3\x54\xad\xc8\xe2\x54\x04\x43\x7e\x88\x8b\x08\x28\x69\x39\xbe\xde\x30\x8a\xcd\x30\x32\x7e\xbf\xf0\x62\x70\x09\x7c\xc2\x94\xf0\xa0\xf3\x9f\x9a\xa3\xc6\x65\x85\xca\x47\xe6\x0c\x4b\x8e\xa3\x60\x89\xeb\x8a\x90\x88\xbb\x18\xb0\x34\x31\x35\xbb\x6a\x45\x6d\x2f\x6a\x3b\xf3\x90\x72\x3e\x78\xb4\x2c\x03\x7c\x2d\xe2\xe1\x43\x2c\xaa\xd3\xa5\x94\x02\x12\x94\xd4\x3f\x5b\x15\xa2\xe8\x19\xdc\x74\x8e\x45\x1d\xe4\x00\x68\xc8\xf0\x32\xf1\x3b\x47\x11\x37\x70\x12\xed\xcd\x4f\x11\xde\xc1\x11\x1b\x12\xeb\x6e\x1b\x00\x63\x38\x18\x70\x6d\x71\x32\xd9\x91\xce\x20\xdf\x3b\x92\x1d\xb2\x18\x5e\xe2\x5b\xb6\xf5\x82\x75\x76\xec\x01\xad\x89\x0f\x79\x79\x3b\xaa\x35\x8c\x2b\xbf\xb6\xfa\xad\x11\xd8\xcb\x0d\x0d\x2d\x2b\x29\x81\xfb\xf4\xe3\x72\x34\x9f\xc6\xa0\x1c\x36\x07\x7b\x59\x32\x5f\x70\x2b\x38\x00\x59\xa6\x5c\xf2\xf5\xea\x98\xd6\xbd\xc8\x15\x20\x53\xb8\x5b\x28\xc8\x1e\x41\x3c\x4c\xac\x7e\x22\x6c\x13\xdb\x32\x67\xd2\x18\x30\xf0\xe5\x43\x11\x02\x91\x70\x05"}, -{{0xaf,0xd7,0x65,0xe6,0xaa,0xc0,0x14,0x6d,0x48,0x11,0xef,0x95,0x97,0xbc,0x3f,0x44,0x76,0x3f,0x03,0x37,0x8b,0x7b,0xe0,0x33,0xd6,0xe6,0x4c,0xa2,0x9d,0xec,0xae,0xf9,},{0x6b,0xb7,0x61,0x23,0xd9,0x25,0x89,0x22,0x68,0x6c,0x53,0xfb,0x69,0x17,0xb9,0xa4,0x59,0xca,0xbd,0x30,0xbe,0x8c,0x43,0x97,0x0d,0x80,0xf5,0x35,0x0c,0x2d,0x98,0xef,},{0x3d,0xc9,0x19,0x4d,0x50,0x81,0x14,0x19,0x04,0x9e,0xaa,0x07,0xb6,0x55,0xb7,0xd4,0x06,0x4b,0xcb,0x0e,0x7f,0xb5,0xf9,0xe5,0x32,0x6b,0x5f,0xc8,0x56,0xfc,0x0a,0xb8,0x70,0x59,0x73,0xae,0x10,0x01,0xdf,0x55,0x37,0x39,0x77,0xdd,0xe2,0xd9,0xb8,0x10,0x79,0x55,0x14,0x14,0xad,0xc7,0x1c,0xc8,0x52,0xd4,0x99,0xb0,0xcf,0x82,0x4f,0x07,},"\x18\x3b\x10\x92\xc7\x90\x4e\x47\xa1\x42\x03\x17\xa2\x5d\x0f\x59\x11\x0a\xa8\x4d\x6b\x34\x19\xad\x45\x68\x65\xc4\x3b\x29\xe9\xd1\xda\xcf\x75\x5d\x9e\x5c\xf9\x4c\x55\x91\xd5\xd9\x12\xd0\x5c\xa9\xa5\x2d\x01\x5d\x6e\x8f\x5d\xc9\x4e\xfd\xce\x0d\x7c\xf5\x65\x12\x03\xb1\x1e\x54\x27\xa9\xf6\x79\x42\x9e\x00\x41\x4a\x48\xea\xb1\x3f\xd8\xe5\x8b\x87\xeb\xa3\x9d\x10\x25\xd6\xa1\x8b\x2c\xdc\xbe\x14\x74\x36\xdb\xf3\x8a\x1c\xe8\x64\x13\xae\x31\x87\x65\xe1\xbb\x1d\xf7\xe2\xb3\xbe\x97\xe9\x04\x08\xb1\x17\x17\xcf\x45\x9b\xcd\x0f\x3c\xac\x58\xb4\xa0\xd3\x5b\xff\xb5\x33\xe2\x0d\xf3\x74\x51\xc1\x14\x01\xce\x1d\xab\x02\x05\x5c\x7e\x08\xc5\xec\x46\x39\x0c\xd6\x17\xa6\xb5\xf2\x2f\x65\x18\x30\xa1\x11\x2a\x06\xed\xe4\xc4\x0a\xb7\x95\x78\x51\xd6\xc6\x6f\x17\x1c\xd1\x62\x41\x59\x09\x00\xb8\x52\xa3\xd0\x19\x95\x7b\xe1\xb7\xbb\x7a\xcb\x89\x23\xf2\xa3\x57\xc3\x26\x44\x56\xcf\xca\x9b\x42\x9d\x71\xfe\xcb\x7e\xda\xe3\x9b\x25\x2b\x4e\xb6\x10\xe8\xc7\x18\x83\x56\x99\x75\x4b\x8d\x41\x24\xb4\x92\x48\x8e\xde\x62\x61\x0c\xce\x44\xb5\x92\x18\x66\x3b\x6c\x96\x46\xa1\x4a\x84\x17\xed\xdb\xb6\xf4\xfb\xe5\xa4\xbb\xbb\x48\x2b\x37\xa4\x45\xe3\xc1\x6b\x65\xa1\x41\xcd\x3e\x12\xa5\xb2\xc0\x48\x1d\x61\x4d\x6d\x20\x84\x79\xb9\xb2\x09\xb8\x28\x85\x4d\xae\x0e\xa1\xed\xed\x50\x65\x55\xfe\x18\xe1\x85\x40\x05\xcf\x00\x1a\x80\x77\x08\x34\x98\xd2\x7f\xad\xf1\x18\x28\x6b\x53\xb8\x97\x4d\x69\xfa\x28\x25\xbe\x8c\xa3\xd6\x03\x6a\x92\xca\x52\xf9\x1d\xde\x6d\x5b\x1f\xfe\x28\x88\xf4\xd6\x07\x79\xfa\xd1\xfb\x41\xd8\xc0\x71\x40\x49\xaf\x68\x1b\x75\x5f\x2d\x42\x04\xee\xcd\x09\xe0\x77\x21\x0a\x48\xa1\x95\xe7\x2c\x80\xe1\x27\xc3\xd4\x87\x50\x95\xc6\x57\x0a\x1f\x78\x09\x59\x07\x52\x8c\xf7\x74\x6f\x31\xd9\x71\x11\xc6\xf4\xcb\x25\xb3\x74\x12\x99\xa7\x57\x48\x22\xd4\x6b\x6e\x79\xed\x23\xc2\xfe\x05\x7b\x3a\xc7\x29\x0b\x46\x0b\x16\x6e\xe9\x0a\x45\x56\x2e\xff\xed\xcc\x6b\xa8\xf4\x79\x5f\x73\x95\x81\x8d\xb5\x6b\x6e\xdd\x59\xca\x2c\xc4\xae\xa1\x84\x1f\xd9\x56\x5b\xec\xd6\xc0\x81\x04\xcd\xee\x26\xba\x9d\xe2\x00\x77\x3d\x09\x1b\xc7\x7a\x57\xc5\x47\xf1\xa6\xba\x0a\x2c\xd7\x17\xab\x32\x56\x1d\x74\x22\xea\x72\x35\xad\xb0\xcb\x36\xbf\x5c\xbd\xf8\x8f\xca\xe0\x66\x30\xa1\x56\x47\xd9\xa3\x57\xb4\xe0\xe5\x02\xd2\x73\xf3\x79\x6a\x51\xe0\xbc\x3f\xed\xbf\x7a\x1e\x64\xaa\xd7\x22\xaa\xc5\xfd\x02\x2f\xa7\x9d\x60\xfc\x70\x73\x25\xf1\x27\xeb\x1f\x03\x86\x87\x95\xcc\xdc\x0b\x4c\xb2\x6f\x20\x23\xd1\x52\x15\x3a\x97\xa2\x60\xbf\xf1\x17\x45\xd2\xe2\xcc\x0b\xf8\x60\xd4\xa6\xe3\x58\xa6\xd8\x17\x6d\x2a\xc1\x78\xa9\xae\x1a\x2d\xc7\x5e\x8b\x49\x04\x08\xff\x7c\xdf\x99\x13\x29\xf3\x3c\xb0\xc0\x5e\x1e\x35\x69\x25\x08\x7e\x0b\x8d\x96\xa5\x23\x51\xd1\xd1\x77\x68\xeb\x13\x4c\xdb\x21\xa1\x54\x6a\xae\xdc\xc6\x87\xdf\xa1\xb2\x2e\x92\xfb\x52\x41\xa8\x36\x77\xa1\x53\x44\x5b\x77\xd5\xe7\x03\x50\x8e\x2a\xbc\x58\x8a\x9f\x42\xe5\xbc\x71\x06\x73\xe4\xdd\x8a\xd7\x03\xfa\xb2\xd7\xdb\x1e\xb8\x42\x26\xc8\x9d\x87\x62\xa7\x09\xe3\xe9\x13\x8a\x1f\xa7\x90\xf2\x92\x9b\xff\x61\xbc\x1e\xa6\xe8\xaa\x1a\xd0\xe3\x88\x7d\x70\xa5\x6d\x4e\x65\x47\xfc\x60\x6a\x50\xd3\xbe\x3b\xd6\xdb\x03\x66\x3e\x00\xca\x9e\x4f\x24\xfe\x8c\xbf\xd7\xd8\xc9\x73\x8d\x63\x67\x55\x4b\x7b\x60\x1f\x74\x19\x0b\x59\x70\xa3\x98"}, -{{0xeb,0x34,0x71,0x45,0xf3,0x39,0xed,0xd8,0x02,0x78,0x5b,0x6f,0xbe,0xcd,0x5c,0xb8,0x08,0x89,0xac,0x7c,0xe4,0xeb,0xad,0x2f,0x67,0x07,0x67,0x65,0xdb,0x93,0x9b,0xca,},{0x99,0x4a,0x45,0x6e,0xad,0xa0,0x30,0x20,0x92,0x1c,0x3d,0x10,0x9c,0x13,0x5e,0xb9,0x61,0xfc,0xd4,0xa0,0xa4,0x00,0xba,0xfd,0x32,0xca,0x06,0x1b,0xbc,0x86,0x25,0x43,},{0xfd,0xbd,0x15,0xe1,0xe6,0x46,0x9d,0xf7,0x20,0xd9,0x55,0x2c,0xb5,0xdd,0x17,0x7b,0xcb,0xd2,0x92,0xfc,0xda,0x83,0xcd,0x93,0xc8,0x8d,0x01,0x14,0x91,0x2d,0xc8,0x70,0x31,0x09,0xba,0xc0,0xd4,0x59,0xac,0xe9,0x95,0x7d,0xf2,0x29,0x3a,0xc1,0x6d,0x40,0xd5,0x14,0x89,0x35,0x56,0x85,0x32,0x99,0xb9,0x7b,0x4f,0xd4,0x13,0x7a,0x3d,0x00,},"\x5b\x8b\x31\xba\xf8\x84\x83\xf0\x95\xb5\xd0\x2e\x17\xd8\xb7\xb4\x6c\xf4\x64\x60\xe6\x4c\x6b\x02\xc5\x6d\x8d\xaf\xe3\x48\x23\x70\x6c\xb5\xc1\x5f\x33\x8a\xd9\xb5\x65\x86\xa9\x49\x71\x1a\xa7\x31\x2c\xc9\x34\x50\xd2\xfb\x9a\xf4\x61\x3f\xc3\x07\x93\xa6\x31\xa5\x5c\x14\xe5\x3c\x0c\xb1\x5f\x06\x11\x63\x99\x39\x8c\x8d\xd6\x18\x76\xc6\x29\x15\xf9\xf9\xe4\xcd\xf8\xf7\xd8\x9a\xde\x12\x9e\x6d\xde\x7d\x63\x67\x1a\x18\x63\xf5\xda\x8f\x42\xea\x64\xc0\x79\xec\xb9\xa2\xc1\xb1\xdd\x9a\xda\xe6\x0e\x96\xb9\xcb\xbc\x76\x24\x53\x2a\xa1\x79\x75\xeb\xa1\x7a\x7a\xf0\x2b\xfb\x21\x9a\xac\x02\xb3\xd4\x30\x6c\xd3\x89\x33\xa8\x50\x60\xcd\x62\xab\x51\x3a\x39\x65\xb0\x91\x50\xa4\x88\xc9\x2b\xf7\xca\xb0\x48\x2e\xee\x56\x46\x3f\x01\x39\x00\x9b\x9f\xbb\x3f\xf4\xec\xae\x21\x1f\x42\x8b\x5b\xfb\x88\x76\xf0\x04\x98\x3b\x90\xc4\x47\x84\x6c\xa4\xb7\x45\x66\xe9\x79\xbc\x30\xc9\x5e\x99\xfa\xab\x69\xa3\xeb\xbf\xe4\xda\x60\x34\xc8\x2d\x63\xe9\xc5\xcc\xaf\x84\x86\xaf\x3b\x5e\x0d\x38\x14\x22\x93\x8b\x0c\x22\xf5\x16\x95\x5b\xdc\x36\x94\x31\x73\xf5\x83\x27\x08\xa3\x3c\xf5\x2d\x88\x75\xd9\x7f\xde\x58\x5b\x49\x17\xe4\xad\xec\xdd\x1e\x79\x85\x67\x62\x03\x3a\xf2\x2f\x25\x4b\x50\xce\x9d\x0c\x70\x0e\x77\xa7\x31\x55\x4f\xa0\x11\x3a\x0c\x66\x66\x83\xf3\xfd\xb1\x9e\x3a\x42\x63\x02\x23\x0b\x63\xe3\x3a\x78\x5e\xf2\x4a\x92\x89\x45\x5b\x3b\x8f\xc6\x18\xff\xfe\xf4\x9c\x2c\x6e\x48\xfd\x4b\xb4\x22\xf5\x04\x14\x9d\xe2\xb4\xc0\x35\x5c\x36\x34\x08\xe6\x6d\xa8\x1c\xbb\x58\x15\x52\xa4\x11\xe3\x64\xfe\x3e\x4c\xa9\x6d\x70\x72\xab\x07\x2e\x75\x68\xc1\x3d\x35\xe4\x1c\x78\x25\xa1\x3a\x5c\x68\xfb\x9f\xb5\x98\x8b\xbb\xfb\x9a\x0b\x51\x16\x57\x64\x66\x0c\xdf\xa2\x41\x1f\x3d\x42\x16\x5d\xa1\x87\xc5\x8e\xde\xf0\x10\x5a\x6d\xb1\x77\x42\x05\x43\xe9\x58\xd5\xd5\xe8\xa3\x71\xf7\x98\x70\x51\xc4\xe1\x78\x6d\x01\x8e\xb3\xd7\x32\xc2\x10\xa8\x61\xac\xaf\x67\x1b\xe9\x5b\xb6\x3f\xbc\x88\xbf\x8b\xe7\xbe\x53\x90\x93\x9c\xd9\xfb\x2a\xcf\x39\x81\xdd\xa6\x1b\x78\x7a\x7b\xbd\x78\x46\x8e\x1d\x32\xca\x46\xaf\x8f\xb3\x2a\x18\x46\x3c\x18\x0f\x52\x4b\xe1\xda\x91\x0d\xa5\x50\x8d\x42\xa0\x05\x17\x41\x22\x7c\x9b\x62\xde\x6d\x19\xb3\x3c\x0b\xd4\x80\x67\xb0\x35\x85\x9a\xd9\xbd\xc2\xdd\xd9\x7b\xef\xca\x31\xe6\x5a\x88\x6c\xfc\x75\x3a\xfc\x4f\xf2\xa7\x21\x2a\x89\xd3\x7c\x04\x6c\xdf\x39\x99\xc0\x51\xff\x13\x96\xbd\x99\xcb\x54\x94\x56\x39\xeb\x64\x62\xdb\x9e\xce\x84\x07\x7b\x0b\x3d\x6b\x3d\xf3\x95\x2d\xd3\x67\x56\xc6\xda\xb2\xab\xc2\x5a\x51\xbf\x32\xc1\xe9\xcd\xd0\xa7\x28\xa7\x98\x5f\x7b\x7e\x0d\x9c\x1a\x6f\x66\xce\x12\x16\x37\x3d\x25\x2d\xaf\x59\x58\xf2\xe8\x97\x3f\xd2\x68\xfa\xd0\xef\xe2\x51\xce\x76\xfe\x47\xbd\x0a\x4d\x0c\x4f\x10\x17\x94\x9d\x4c\x2b\x16\x71\x72\x18\xe1\x49\x15\x4e\xd6\xfb\xe5\x6f\x86\xd8\x2e\x19\xef\x0a\x91\x63\x19\x12\xf2\xa8\xf3\xde\xbb\x00\x76\x6b\x61\x77\x80\x2f\x4b\x2e\x79\xf6\xe7\xbf\xa9\xc6\x2c\xfa\x2f\x75\xcd\xb6\x04\x92\x63\x0a\x85\xc9\xb4\x31\x77\xd2\xdd\x9b\xa8\xd0\x54\x8a\xbe\x24\x92\x3a\xe8\x44\x3e\xea\xdc\xd0\xf5\x8a\x7b\x82\xdf\xf5\x0d\x88\x40\x03\x88\x9c\xb5\x60\xf7\xac\x53\xe7\x10\xa7\x55\x75\x36\x24\x64\xb1\xaa\x43\xd2\xa9\xb2\x2f\x2b\xd2\x16\x2d\x30\x2f\xaa\x74\x52\x34\x4c\xe7\xad\xe9\x98\x36\x87\xb6\xc6\x8e\xca\x47\xdd\xdb\x28\x9b\x15"}, -{{0x32,0x08,0x83,0x7d,0x15,0x54,0xb6,0x51,0x1a,0xdd,0xa0,0x9c,0xba,0xe5,0x65,0xda,0x78,0x43,0x9a,0x47,0x2a,0x5d,0x1b,0x10,0x7c,0xe0,0xa9,0xb1,0xd7,0x75,0x7d,0xb7,},{0x9b,0x52,0x5e,0x35,0x36,0x8a,0x92,0x1e,0x3a,0x2e,0x9a,0x35,0xa4,0xde,0x9e,0xa4,0xc4,0x36,0xca,0xba,0x27,0x12,0x3e,0x5c,0x36,0x9e,0x2a,0x6c,0xf5,0xc9,0x0a,0xb6,},{0x70,0x9d,0x1c,0xa9,0xca,0x2f,0x74,0x2a,0xb9,0xdd,0x0b,0x04,0x93,0x35,0xf5,0x44,0xcf,0xfb,0x2f,0x1a,0x36,0x93,0xd5,0xf5,0x3f,0x8b,0xa0,0x83,0xb9,0xb0,0xd8,0x6e,0x52,0x08,0xfa,0x8e,0x1e,0x81,0x56,0xc9,0xcc,0x22,0x42,0x77,0x5a,0xbb,0x7e,0x15,0xaf,0x30,0x85,0x86,0x8e,0xf4,0x57,0x63,0x4e,0x99,0x26,0xc4,0x04,0xec,0xf3,0x0f,},"\x43\x6a\x3c\x31\x76\x3f\x93\xd4\xd5\x46\xc6\xd1\xec\xfb\x7a\xe4\x59\x16\xaf\x75\x4f\x83\x9d\xcf\xe9\x6d\x6b\x69\xc6\x12\x14\xd0\x16\xfc\x84\x2f\x56\x46\x2a\x3f\x07\xf6\x61\xb2\xe2\x50\x5a\xcf\xaf\x48\x2a\x0b\x0f\x4f\x55\x01\xee\xc4\xb2\xd2\xd7\xd4\x44\x54\x4d\xe0\x00\xb9\x90\xf4\x36\x3d\x3f\x98\x3f\x5d\x4e\x09\x30\x97\x52\xff\x57\x9c\x73\x20\xc9\x15\x95\x1c\xc3\xa1\xe3\x23\x8c\x1b\xa7\xa1\x91\x30\xea\xbf\x6a\x37\xf5\xf0\xbc\x56\xe2\x52\x42\xf7\x52\x06\x1f\x3c\x63\xac\xad\x99\x2a\x75\x01\xe9\x67\xde\xb9\x25\xb3\x0e\xd1\x05\x43\x1e\x58\x21\x02\xfa\x4f\x30\x8c\x2f\x06\x83\x61\x2b\x56\x68\x6d\x52\xda\xed\x69\x43\xa7\x21\x9f\x3b\xee\xa2\xe0\xa2\x92\x42\xe8\x6d\x55\x62\xff\xab\x83\xb5\x6b\x26\x33\x26\x66\x4e\x02\x9e\x96\x1e\x70\x17\xd8\xe8\x9f\x5e\x3e\x1d\x10\xf5\x93\x28\x54\x55\x0c\xe6\xe5\xcd\x76\x97\x1f\xd2\x35\xcf\x9c\x00\x27\xd0\xcf\xed\x33\x15\xc2\xcb\xf1\x85\x08\x62\x4d\x8a\xcf\x04\x7f\x9b\x96\x8f\x90\x7d\x9e\x6f\x4c\xfa\x5e\x45\xc8\x0a\x27\x2c\x2d\xbb\x62\xc5\xd4\x19\x45\x80\xdf\xab\xed\xd8\x2c\xb4\xd7\x64\x92\x34\x4b\xe9\x6c\xcf\x5d\xaa\xf6\x1e\x6b\x2b\x55\xef\xdb\x3f\x65\x21\x0a\x3d\x6e\x1f\x36\x98\x87\xca\x0e\xa0\xd5\x8c\x3d\x14\x6a\xe3\xcf\x9b\x00\x00\x76\x88\x41\x15\xfa\x51\xb5\xfd\x66\xbe\xc0\xcc\xbf\x0d\x29\x20\x19\x6a\x7d\x7a\x38\x44\x5f\xbe\xd2\x2d\xfc\x75\x64\xdc\x56\xf6\x0d\x6e\x29\xe5\x92\x48\x53\x74\xc6\xbd\x1e\x5b\x15\x93\x1b\x69\xca\x6e\xe6\xb3\xaa\x25\x25\xc2\x35\x85\xf0\x92\x9f\x31\xcb\xd1\x1f\xb1\xa5\x33\x02\x16\xb9\x0a\xe5\xa6\x56\xdf\x7a\x07\x4c\xec\x64\xe5\x98\x18\x4f\x50\x3f\xb2\x3c\xc0\x5e\x65\xda\x9a\xe7\xe8\x44\x1f\x40\xe2\xdc\x26\xb8\xb5\x6d\x2c\xb5\x23\xa7\xc6\x35\xdc\x08\x47\xd1\xcd\x49\x8a\xbf\x75\x6f\x5a\x13\xea\x14\xf8\xfa\xb2\xc4\x10\xb1\xa4\x70\xf4\x9a\xa8\xdc\xa4\xac\x02\x56\xb1\x18\x00\xde\x0d\xd0\xec\x42\xb1\x42\xc5\x61\x12\x8d\x35\x7e\x78\x3b\x12\xf6\x1c\x66\x8f\x5e\x6e\x06\xb7\xb4\x8b\x7b\x22\x54\xde\x5b\xdc\x18\x04\xb7\x23\xd5\xfd\x6a\x0f\x4b\xc7\xc5\x9e\x7c\x50\x54\x18\x26\x13\xbb\xd2\xfa\x92\xb4\xc1\xda\x16\xbc\x8c\x97\xe1\x6b\xcb\x0d\xbf\x8c\x92\xb7\x48\x99\xb3\x7f\x31\x87\x57\x14\x0b\x6c\x4f\xd5\x35\xe2\xe1\xe0\x57\x0a\x50\x81\x8c\xf7\x8f\xb9\x88\xe1\xf4\xce\x40\xe7\x6e\x8f\xe3\xd6\x97\xd7\xa4\x58\x50\xf2\x93\xce\x17\x0f\xd8\xab\x07\xcf\x15\x34\xea\x5f\xfa\xd3\x4f\x6f\xcf\xa4\x2d\x0d\x21\xa9\x1d\xfb\xfe\x05\x97\xc7\x3f\xd9\xb9\x76\x76\x14\xeb\xdf\xd0\x2c\x3a\xc0\xc4\x9a\xd1\x0c\x94\xbe\x59\x69\xee\x08\x08\xc0\xa3\x0b\x2a\x1e\xaa\x90\xea\x43\xb8\x57\x5c\x30\x56\xf4\x23\xcd\x4b\x6f\x34\xae\x51\xc2\x22\x37\x65\xa9\xea\x21\xf6\x45\x73\xc1\xa1\x39\x61\x32\x12\x46\xe3\xb5\x34\x9e\xe0\x48\xfb\x62\xd5\xfb\x61\xb1\x71\x43\x91\x18\x25\x62\xb9\x15\x98\x36\x0e\x5f\x9b\xf4\xac\x80\xdb\x24\x64\x32\xaf\xb3\xa4\x3d\x34\x96\x50\xde\x03\xd3\x43\xc2\xe9\x7a\x8e\xef\xd1\xbf\x30\xc1\x0c\x25\x86\x7f\x53\x26\x6b\xd1\xf0\xdc\x14\xae\x1a\x6b\xe9\xef\xde\xcf\xf6\x7e\x7d\x29\x2c\x6c\xdf\xc9\x0d\x80\xb8\x86\x66\x8f\x04\xc2\xa0\xf5\xad\x7f\xa1\x7c\x17\x8b\x6e\x9b\x45\xa1\x1f\x4d\xdf\xe2\xd6\x69\x60\xa3\xf7\x51\x35\xad\x5e\xd1\x54\xe5\x13\xe1\xa5\xd1\x38\xe7\x37\x1e\x84\xd7\xc9\x24\x53\xe6\xc6\x2d\xc5\x9b\x8e\x1f\xa9\x3d\x77\x3a\x25\x40\xd9\x1c\x25\x7c"}, -{{0x4e,0xc6,0x82,0x9b,0x43,0x99,0x70,0x56,0xd9,0x96,0x85,0x38,0x9b,0xd5,0x3c,0x52,0x8d,0xe7,0xe5,0xff,0x27,0x15,0xd6,0x5c,0x95,0x66,0x19,0x82,0x6e,0x3f,0xb5,0xb5,},{0x7d,0x92,0x2d,0x57,0xfd,0xb1,0x27,0x92,0x87,0x9a,0xec,0x4e,0x8c,0x65,0x14,0x63,0xec,0xe0,0x64,0x49,0x2c,0x72,0x17,0x53,0xd2,0x2e,0x11,0x55,0x09,0xfe,0xd7,0x06,},{0x15,0x9c,0xa4,0x04,0xf7,0xf7,0x41,0x17,0xc5,0x16,0x3c,0xf4,0x04,0x11,0x09,0x49,0xeb,0x57,0xae,0x2d,0x76,0x62,0xb1,0xff,0x41,0x78,0xcc,0x67,0x56,0xe9,0x0a,0xda,0xea,0xb7,0x1b,0x06,0x4c,0xe1,0xdf,0xf4,0x57,0xb2,0xdb,0xa7,0xe2,0xdc,0x13,0xc2,0x17,0xbc,0xae,0x8a,0x61,0xfc,0xf8,0xce,0x14,0x87,0xa6,0x49,0xc2,0x57,0xff,0x07,},"\xed\x26\xb4\x13\x0d\x4e\xbf\x3f\x38\x61\x49\x1a\xa3\xdd\x96\xa4\xeb\x69\x75\x21\x73\xfa\x6c\x84\xca\x65\xdf\xc9\x91\xc7\xfe\x44\xe0\x2b\xd6\x16\x50\x25\x2a\x1d\x23\x78\x66\x82\xec\x38\xc1\xfe\xe8\x2c\xc3\x50\xdb\x7c\x3c\x39\x49\xa1\xc9\x35\xff\xeb\xd7\xba\xa2\x4f\x35\xa3\x93\xfb\xd2\x7e\x7c\x34\xc2\xf9\xff\xda\x60\xa1\x8d\xf6\x6c\x3e\x46\x5d\x90\xed\x48\xfb\xba\xd3\xfa\x79\x47\xde\xe7\xe6\x59\xa3\xee\xad\xb8\x87\xf0\x96\x3f\x6b\xdd\x76\xc3\x6c\x11\xae\x46\xd0\x88\xee\x50\xbc\xa8\x18\x7a\x0a\x88\x32\xdb\x79\x84\xb7\xe2\x7c\xbe\x6a\xbf\x12\xd2\xc9\x4f\x33\x7e\xc7\x8c\xb3\x8b\x26\x24\x1b\xd1\xa3\xd2\xf5\xfa\x44\x07\xfd\xd8\x02\x27\xd2\xb1\x70\x14\x4b\x41\x59\x78\xe3\x72\x01\xd0\xfc\xf4\x31\x74\xb9\xd7\xb2\x11\x5d\x5e\xb8\xbc\xec\x27\x6a\x77\x5a\xea\x93\xf2\x34\x0d\x44\x25\xd3\x4d\x20\x47\x49\x4d\x91\x7e\x0d\xbe\x37\x85\x7e\x6c\x99\x85\x9b\x71\xc9\x14\xaa\xd5\xe5\x4f\x7b\x2b\x03\x3e\x59\x4e\x27\x2c\xc5\xcf\xe9\x19\xf8\x88\xe5\x5c\xb6\x15\x7a\xff\xcf\x35\x72\x46\xd0\x0b\x53\x2c\xc4\x71\xb9\x2e\xae\x0e\xf7\xf1\xe9\x15\x94\x4c\x65\x27\x93\x15\x72\x98\x53\xda\x57\x2c\x80\x9a\xa0\x9d\x40\x36\x5f\x90\x87\x5a\x50\xd3\x1c\xa3\x90\x0d\xa7\x70\x47\xc9\x57\xc8\xf8\xbf\x20\xec\x86\xbd\x56\xf9\xa9\x54\xd9\x98\x8e\x20\x6b\x44\x4c\xa5\xa4\x43\x45\x21\xbf\xc9\xc5\xf3\xa8\xa0\x61\x47\xeb\x07\xd1\x1d\xfe\x11\x71\xec\x31\xff\x55\x77\x15\x88\xb3\x33\xee\xe6\x21\x5d\x21\x6c\x47\xa8\x56\x6f\xbb\x2b\x18\x97\x46\x46\xac\x5a\x92\xc6\x99\xd7\x75\x84\xc0\xde\xfe\xfd\x2d\xfa\x58\xfc\xa2\x71\x99\xe4\x1e\xc5\x8a\x24\x63\x20\xb3\x5f\xaa\xb7\x5b\x97\x95\x19\x24\x22\x6d\xa4\xab\x28\xf0\x1b\x47\x07\x8e\x71\x2e\x4f\xd9\xf7\x7b\x25\x1c\x96\x67\x85\x8c\x28\xe3\x2e\xf1\xcd\x01\xfc\xbe\x43\x5c\x54\x2d\xba\xd0\xa8\x4a\x13\xcd\xbb\x57\x75\xe6\x2d\x81\x1d\xc6\x90\xd9\x55\x5c\x37\xf1\x5f\x91\x76\x7a\x56\x13\x57\xdf\x10\x6e\xef\xe0\x56\xe7\x36\x06\x70\x65\x0f\xb8\x18\xfc\x6a\xdc\x59\x97\x3e\x9a\xd5\xcd\xcd\x80\x98\x07\xab\x56\x39\x7f\x3c\x13\x94\x87\x32\xd9\x8d\x67\x6f\x4a\x44\x70\xa9\x5d\x8b\x51\x82\x37\xe2\x26\xf0\xcc\x5f\x47\x65\x16\x4a\x5c\x3e\xf0\x50\x71\x4b\xe0\x2a\x12\x6b\xe8\xf6\x65\x46\x48\x15\x81\xb9\xe9\x4a\x26\xaa\xd2\x4c\x69\x3b\x7f\xdb\xc1\x8a\xcd\x3e\xd7\xcf\xc4\x7d\x8a\xb2\x67\x45\xd7\x8e\x70\x1d\x0c\xf0\x5d\xd8\x44\xb5\xb3\x45\xa2\x9d\xab\x68\x4c\xbc\x50\x92\xba\x02\x2e\x3c\x58\x2d\xfc\x04\x4c\x31\x00\xad\x02\x75\x66\x97\xa8\x49\x82\x29\x15\xa1\x6e\x2a\x2b\x81\x0e\x68\x15\xf5\x44\x21\xd2\xf3\xa6\xff\xf5\x88\xc0\xd9\x01\x3c\x76\xf3\x3e\x09\xbe\xae\xef\x60\xd8\x77\x42\x30\xe8\xce\x71\x31\x28\x9a\xef\x2a\x40\x68\x6c\x81\x9f\xb2\x04\x0b\x06\x12\x4d\x3d\x9a\xa4\x19\xd5\x67\x88\xf1\x7f\xa7\xed\x9b\x9b\x57\xce\xaa\xd1\x33\x7a\x01\x01\xbe\xa0\x44\x0c\xff\x74\x5d\xdd\x97\x22\x05\x5d\x1f\x9b\xcf\xb0\x09\xce\x2c\x2f\x41\xa9\xe7\xe8\x68\x06\xb8\x72\xcd\xc2\x05\x9b\xc8\xec\x68\xf5\xee\x56\xc4\xba\xcf\x4b\xbd\x30\xea\x4c\x71\x55\x86\x4d\x60\x0c\x0e\x2e\xee\x73\xb3\x19\xbd\xa4\x37\x2e\x9c\x60\x3c\x77\x2c\x25\x89\x0c\x76\x10\x48\x99\x89\x47\x5d\x37\xa7\x7a\x45\x74\xa2\xba\x55\xbf\xd9\xc9\xcf\xd1\x46\xfb\x97\xe6\x16\x5d\xcc\x19\x55\x9f\x4f\x85\xdf\xca\x2f\x97\xf3\x70\x2e\xd8\xfa\x6b\x3c\x2a\x97\x41\x97\x4a\xa0\x7a\xb6"}, -{{0xb1,0x50,0xa7,0x89,0x29,0xed,0x1e,0xb9,0x32,0x69,0x21,0x3e,0x1e,0xbc,0x22,0xe2,0xe4,0x0a,0x60,0x1b,0xdb,0x00,0x54,0x99,0xb7,0xbe,0xb0,0x58,0x91,0x7c,0x53,0x40,},{0x28,0x86,0x6b,0x6d,0x1c,0x39,0x3c,0xb0,0x8e,0x46,0x4c,0xf5,0x57,0x14,0x40,0xa6,0x49,0xe5,0x06,0x42,0x38,0x0d,0xdf,0x4f,0xfb,0x7a,0xd1,0x50,0x48,0x5c,0x10,0x8e,},{0x27,0x6d,0xd0,0x96,0x2e,0x6e,0xe6,0x4f,0x05,0x92,0x44,0x1a,0x8a,0xf0,0xe5,0xef,0x8f,0x93,0xbf,0x0b,0xae,0xba,0x20,0x50,0x4b,0x9d,0xb4,0xf9,0x5a,0x00,0xb9,0x39,0xea,0x38,0xde,0xf1,0xc7,0x97,0x86,0x28,0x98,0xca,0xbe,0x9d,0xc4,0x64,0x4f,0x0e,0x67,0x7e,0x87,0xc0,0xa3,0x3b,0x87,0xb6,0xa4,0xd2,0x2a,0x80,0x7d,0x0e,0x1e,0x02,},"\x1b\xf5\x5d\x27\xf9\xdd\xe6\xc4\xf1\xc0\xdd\xd3\x60\xa2\x5d\x94\x93\xc0\xff\xdc\xa7\x4a\x7e\xd5\xe5\xa5\x14\xe9\x55\x15\xcd\xa4\xaa\xd8\xf4\x5c\xd6\xed\x79\x01\xf8\xf2\x24\xa6\x3b\x38\x12\x1c\xbe\xac\x2f\x56\xda\xe2\x10\xdd\x05\x37\x50\xcb\x20\x75\x14\xa8\x89\x1e\x24\x5a\x5d\x07\xe7\xde\x78\xa2\xe3\x81\x44\x63\xf1\x48\xd2\xac\xb7\xdc\x71\xf9\x95\xc9\x29\x9a\xd0\xd6\x26\x6c\xfe\xfc\x94\x26\x96\x57\xfd\x47\xcf\x53\x12\xb9\x2a\xf2\x75\x06\x51\xc4\x79\x63\x6c\x9d\x36\xae\xf0\x8f\x7d\x11\x95\xe7\xfa\x1b\xa3\xab\xb5\xdc\xb9\x01\x36\xb0\xfb\x9a\x37\x66\x8b\x87\xa2\xdb\x88\xd1\xe2\xb6\x44\x0d\x3e\x6e\x60\x1e\x6d\x4b\xc1\x0c\xf1\xcb\xdf\x1d\x61\x69\xc0\xdc\x2c\x4a\xec\xde\xb6\xcd\xd4\x56\x7d\x42\x50\xb2\xaf\xa7\x15\xb1\x66\xc9\x46\x7f\x90\x7d\x3f\xa5\xa6\xda\xf2\x00\xb3\x09\xc1\x09\x37\x68\x30\x49\x9c\xaf\x31\x49\x00\x1c\xf3\x33\x94\x48\xca\x3d\x76\x52\x25\xd6\xb3\xc1\xcd\x26\x7c\xba\x93\x6e\x7a\xa4\x83\x25\x39\x46\x6f\xd2\x0c\xbb\x38\x32\x3c\xbb\x22\x28\xa2\x71\xf2\xd2\x82\x56\x1c\x73\xed\x79\xa1\xad\x04\x69\x8e\x27\xef\xe3\x93\x23\x5f\x34\x56\xc2\x95\x40\x7d\xa0\x96\x0f\x00\x34\xd8\xde\xef\xd1\xc1\x85\x73\x6f\xd3\xea\xf1\xf9\xa1\xe3\x2f\x09\x17\x4c\x1f\xe1\x27\x20\xb7\xc9\x6f\xeb\xdb\x33\xe0\x1b\x1b\x6a\x1c\x63\x71\x50\x19\x4b\xe4\xff\xab\x15\x9e\x45\xb2\x45\x85\x57\x68\x46\xbb\x64\x27\x4e\xca\x7b\x39\xa3\xed\x93\x57\xde\x7b\x08\x42\x13\x02\x4a\x9e\x85\x89\x26\x36\x00\xa2\x86\x7c\x2a\x7c\xf8\xb9\x90\x76\xa1\x2a\x07\xbd\x7d\xf8\xd5\x27\x7b\xb0\x4a\xd7\x2e\x63\x9b\x77\xea\xca\x1e\xc5\x8e\xf9\x63\x7e\x9a\x23\x76\xba\x87\x8a\x45\x72\x35\xa0\x6f\x78\xfd\xf0\xe0\xd9\x25\xcb\x2f\xd2\xa3\x8c\x77\x18\x8f\x60\x37\x2e\xf6\x00\x97\x92\x42\x43\x99\xc9\xb6\x79\x28\xda\x2e\x3b\xa9\x1c\xbd\xe4\x07\xe7\xe8\x76\xba\x98\x13\x9e\xd2\x2c\xa3\xb9\x83\xbe\xde\x00\x00\x52\x87\x96\x44\x8e\x4a\x10\x55\xac\xb2\xde\xaa\x56\xbc\x30\x82\x54\xc5\xbd\x49\x8c\x27\x5e\xce\xdc\x13\x57\xef\xe1\xfd\xa0\x1d\x34\xd9\x16\xdd\x4d\x86\x47\xe5\x77\x19\x95\xa6\x53\xe0\xf8\xa5\x28\x4c\xc7\xbf\x73\x15\x7b\x33\x49\xd5\x9e\x6f\x92\x0c\xad\x6c\xdd\x17\x19\xf0\x38\x02\x5c\x43\x00\xe0\x21\x0c\xe2\x49\xfa\xf3\xc8\x2d\xe1\xfd\x1c\xda\xbe\x61\xc1\x4e\xcb\x1d\xf0\x0c\x5c\x46\x6a\xa6\xa0\x12\xa9\xc1\x0d\xcf\xe5\x9b\x7e\x9d\x3b\x15\x5d\xab\x6c\x7b\x7c\x16\x08\xc1\xed\xd5\x1d\xbd\xad\xf6\xba\x58\x76\xb5\xe6\x0f\xdf\x7f\x19\xe6\xef\x71\x2c\xd1\xa7\xdd\x3a\x06\x2a\x65\x74\xa7\x43\x6b\x31\x9e\xfb\x94\x4e\x42\x23\xf5\x42\xb2\x50\x2c\x1b\xa9\x76\xbe\x91\xe0\x5b\x0f\x85\xa0\x9f\xd7\x93\xbe\xca\x88\x33\x75\xfb\x67\xcd\x13\x3f\x52\x84\xd8\x99\x84\xff\x3c\xaf\xa7\xe1\x1a\x9d\x85\xe7\x89\x32\x32\xa5\x24\xec\x54\xb2\x0f\x97\x5d\x3c\x0a\x11\x43\xa0\xef\x41\x17\x6b\x70\x51\xea\x91\xd4\x0c\x5f\x44\xfd\x9e\x10\x05\x58\xbf\x12\x12\xa7\xb8\x91\xe6\x8b\x55\xca\x61\xf4\xbe\x94\x52\x66\xd9\xa1\x00\x7a\x14\xaa\xeb\x68\xc4\x8e\x25\x7f\x0f\x46\x31\x0a\xd1\x64\x81\x46\x7e\xc1\x77\x35\x35\xd5\xfc\x08\x49\x15\xf5\xd0\x04\xba\x0d\xc7\x59\x1d\x21\x23\xc6\x22\x07\x90\x9d\x84\xf2\xb3\x82\xf5\xef\x12\x75\x9a\x95\xcd\x3f\x51\x89\x80\x6e\x27\x39\x60\xae\xe1\x62\xc0\x0f\x73\xe7\xfa\x59\x36\x39\x57\x65\x4b\xb1\x91\x6b\x57\x09\xbb\x0a\x9d\x04\x05\x14\xae\x52\x84\x95\x1e\x6b"}, -{{0x9f,0xc7,0xc4,0x9c,0xb8,0xc4,0xf0,0x97,0x2d,0x6e,0xd9,0x70,0xae,0x2c,0x6a,0xc3,0x37,0xe6,0x75,0x42,0x5c,0xc8,0xdc,0xe7,0x30,0xfc,0x41,0x44,0x43,0x02,0x93,0x5d,},{0x47,0x82,0x52,0x0b,0x06,0xf9,0x33,0x44,0xaa,0x76,0x67,0x80,0xe5,0x44,0x01,0x36,0x3d,0xfd,0x7d,0x96,0x7c,0xc3,0xbf,0x06,0x48,0x8a,0xf9,0x09,0x20,0xa3,0x0f,0x85,},{0x5c,0x78,0x3a,0x86,0x0a,0xa6,0x68,0x18,0x4d,0xd2,0x2c,0x4f,0x9a,0x54,0x6b,0x5e,0xc9,0x6e,0xba,0xd2,0xe4,0xaf,0x00,0xf9,0x68,0xc6,0x88,0x67,0x13,0x54,0xe0,0xcc,0x9b,0x57,0x2c,0x73,0xbc,0x6f,0x19,0x93,0x7a,0x05,0xf1,0xba,0xf3,0x43,0x47,0x63,0x96,0x5c,0x96,0xe1,0x03,0x40,0x7f,0x0e,0xb6,0x42,0xc5,0x64,0x41,0x54,0x29,0x0b,},"\x82\xbc\x2c\x70\x0d\xb2\x22\xa4\xac\x91\x4a\xa2\xbe\x8f\xa2\x8e\x42\x20\x67\xf9\x4f\x33\x44\xf5\x36\x2b\xeb\xaa\xbe\xd7\x61\x2b\x0e\x46\x4a\x73\xa6\xc4\x56\x90\x35\x64\xb1\x53\x93\x48\x51\x40\xdd\x0f\x3a\xff\x90\xaa\x6e\x16\x61\xdd\xf6\x82\x85\x0d\x04\x90\xaf\xc3\xd7\x35\xde\xa0\x5b\xa4\x7c\x85\xd9\x7e\x83\x35\x33\x51\x4c\x19\x8b\x4c\xf6\xe6\x6d\x36\x0e\xe5\xbf\x00\xe1\x4a\x3a\xab\x1a\xd0\xe7\xb8\xab\x2a\xac\xc9\x64\xd4\x28\x30\xc7\x84\x53\xdf\x19\x55\xbb\xed\x1c\xd6\x8a\xda\x3d\xb0\xec\xdb\x60\x1a\xd7\x66\x7d\x5c\x5e\x2f\xd4\x9e\x36\xf7\x32\x8e\xaa\x33\x7d\xbd\x6f\xf7\x0e\x78\x98\xa3\xf9\x8c\x15\x9d\x04\x5a\x24\x27\xad\xe5\x33\x3c\x88\xfc\x4a\xfd\x38\x19\xdc\x82\xf4\xda\xa3\xc5\x23\xcb\x57\xe3\x5a\x2a\x5a\x72\x5d\x63\xd4\x02\xba\xef\x51\xe5\x1f\x1e\xf4\xf8\xf9\xa5\x95\xc9\x37\x9c\x9a\xba\x87\x3f\xb4\xe7\x65\xa9\x31\xda\x09\x14\x8a\xba\x6e\xc5\xb4\x48\x59\xb0\xe8\x1f\xf9\xfc\x22\x95\x98\xac\x9f\xbd\xb0\xbd\xbd\xdb\x56\x92\xa5\x22\x22\xdf\x52\xea\x38\x7b\xbb\xf3\x6a\xd6\x4d\x19\x46\xbd\x28\x2e\x32\x3f\xf4\x82\x2a\xd9\xda\x89\x7f\xf7\x3f\x01\xb3\x90\xcf\xe2\xe6\x4d\xe4\x92\xd5\x5d\xe7\x7f\x5d\x7d\x00\x60\xa6\x87\x2a\x01\x83\xcc\xba\x61\x0f\x53\x27\x4c\xcb\x29\xce\x6d\xce\x6a\x03\x6c\x53\x17\xa1\xed\x2a\x7c\x10\x68\xc1\xb2\x46\xfc\x1d\x58\x81\xd0\x0d\xe0\x6e\xb4\x01\xcf\xf9\x5e\x6b\x69\x14\x86\x99\xdb\x13\xe9\x4b\xb5\xb2\x80\x21\x2d\xff\x54\xc7\x0e\x56\xde\x23\x5a\x5f\x14\x00\xb5\xbe\xa5\x67\x72\xd0\x60\x17\x0f\x1d\x06\x57\x32\x15\x61\xe4\xb4\x91\x07\xeb\x96\xd9\xb3\xbc\x5a\xdf\x45\x1c\x2a\x52\x4e\xba\x4d\xb0\x03\xb7\x7b\x63\x2a\x5d\x89\x82\x7a\x62\x24\xcc\x79\x8e\x09\x6b\xa2\x7f\xb3\x3b\xf6\x1e\x3b\x8e\xaf\x18\xd0\x01\xae\x8e\xb5\x2f\x85\xc9\x0d\x9e\x12\x54\x48\x03\xe6\x7f\xf0\x20\x47\xe0\xd2\x3c\x22\xe7\xf8\xb9\x80\xc0\x1c\x3d\x48\x24\xb2\xa9\xa1\x4a\x2e\x8f\x67\x2a\x7b\x0c\xe0\x3b\xdb\xb3\xbd\x56\xd7\x54\xa0\x96\x4d\xb0\x1c\xa8\x99\xd4\x88\x00\x15\x08\x65\x7b\x7b\x02\x2c\xcf\x04\x2c\x38\xfc\x19\x49\xd0\xe0\x0a\xf4\xd3\x01\xd4\xf0\x0c\x3d\xea\x20\xe3\x08\xa0\xf9\xdc\xac\xb4\x32\x22\xb3\x82\x41\x44\xaf\x77\xbe\x18\xa5\x04\xaa\x8d\x26\x8b\x8a\x56\x00\x72\x5e\x7c\xc5\xf3\xa2\xe6\x25\x6a\x80\x74\xd1\xae\xbc\xa1\x23\xea\x53\xa0\x76\x7a\x92\xe1\x78\x3a\x49\x83\xc5\xef\x3d\x7d\xd7\xf0\x2a\xa9\xd1\xf4\xf9\xaa\xc6\xce\x25\x45\x93\xf0\x87\x92\x01\x4f\xb8\x67\xea\xf8\x79\xb8\x8a\x4e\xfb\x18\xe8\x9b\xa1\x10\x06\xad\x09\xd8\x54\x31\xcc\x26\x57\x5b\x53\x8d\x8e\x78\x90\x64\x6c\x59\x88\x64\x7c\xc1\x05\xd5\x82\x90\x7a\xe6\x25\xe0\x9c\xd0\x89\xf4\x72\x49\xe8\x18\x14\xda\x14\x04\x4c\x70\x14\xe8\x0e\x7a\x8e\x61\x9c\x7b\x73\x5f\x70\x16\x16\xb6\xa3\xc6\xf4\x92\xcd\xc6\xed\x46\x3e\x71\xa3\xd2\x22\x91\x48\x2d\x90\xa1\xde\x6f\x09\x7c\x4a\xe2\x54\x87\x61\x84\xc5\x62\xb1\x65\x75\xb9\xd0\xd1\x93\x13\xed\x98\x86\x4f\x49\xfe\x2e\x1d\x07\x4a\x21\x21\x1b\x2b\x2a\x6d\x27\xdd\xb2\x86\x11\x52\x0d\x5f\x71\x23\x05\x8f\xd0\x07\xbb\x01\x00\x1d\xef\x07\xb7\x92\xbb\x05\xbb\x74\x1c\x12\x9c\x6a\x36\x37\x6c\x38\x53\xb8\xbb\x4f\x66\xb5\x76\x0c\x8e\xb4\xec\xc7\x30\x6b\xa3\xa9\x0c\x70\xda\x47\xc9\x65\xf6\xdc\xcb\xdb\x61\xa7\xfd\xa1\x8e\xe9\x67\xcf\x8c\x5f\x05\x03\x11\x09\x2d\x0f\xde\xea\xed\xd1\x26\x5d\xef\xdd\x66\x0a\xbe\x70"}, -{{0x08,0xbf,0x05,0x9b,0x4d,0xa9,0xaa,0x7f,0xfc,0x70,0x2f,0x5b,0x23,0x04,0xc4,0xf9,0x6c,0xa4,0x9b,0x7d,0xab,0xb6,0xaf,0xb4,0x1d,0xc9,0x1c,0x0f,0x00,0xc6,0x5b,0x78,},{0xa6,0x28,0x9b,0xa2,0x8e,0x80,0xe8,0xd1,0xa3,0x19,0x22,0x3e,0x41,0x65,0xdc,0x0b,0xce,0x73,0x52,0xaa,0xf2,0x42,0xf7,0x0c,0xc9,0x68,0xd2,0x1d,0x77,0x75,0x28,0x32,},{0xe2,0x47,0x65,0x86,0x01,0x37,0x68,0x9a,0xad,0x50,0xeb,0xee,0xfc,0x8d,0x6d,0xb8,0xe9,0x36,0xa4,0xcb,0xa6,0x2c,0xe8,0x7a,0x7f,0x58,0x02,0x09,0x38,0x4a,0x9d,0x7e,0xec,0x90,0x70,0x90,0x5f,0x60,0xad,0x63,0xa7,0xbe,0xfd,0x7c,0x70,0xf0,0xae,0x7c,0x81,0x09,0x16,0x9a,0xee,0x4e,0x51,0x8f,0xce,0xbf,0xac,0xa7,0x23,0xc5,0xb2,0x07,},"\xbd\x4f\xb2\x8a\x1d\xd0\x8b\x07\xba\x66\xe1\x7f\x0c\x4f\x21\x85\x3f\xef\xef\x1c\x9d\x20\xba\x79\x77\xf1\x54\x64\x1e\xa1\xa1\x8b\xec\xf6\xbb\xb8\x03\x88\x88\x62\x94\xe0\x75\x6a\x3c\x50\x8f\xfd\xfe\x90\xb5\x1e\x13\x56\xd1\x12\xd8\xcd\xe5\xee\x2c\xc6\x33\x2e\x61\xd1\x69\xcc\xc8\xcc\x93\x49\x94\xf1\xbb\x56\x0f\xa4\x66\x0c\x0b\x0f\xd4\xe8\x14\x9a\x22\x5e\xd4\x88\x3e\x68\xfb\xb6\x9d\xa7\xaf\x8a\x52\x4b\x17\x14\x1c\xcb\x76\xb5\x0c\xd8\xe1\xb6\x7d\x3c\xe0\x37\xde\xd7\xdf\xa5\x9b\xc7\xc2\x67\x42\x26\xec\x7e\x07\xb7\x8e\xa3\xf7\x82\xfd\xa3\xe5\xf1\xe9\xca\xea\xb6\x08\xca\x38\x7c\x30\x46\x54\xf8\x01\xd0\x0e\x10\xa7\xc2\x9f\x4b\x0d\xa3\xe5\xf8\x95\x13\xa9\x80\x37\x71\x9a\x1a\xef\x4c\x25\x06\xc1\x77\xaf\x54\x51\xa0\x07\x57\xa5\x9f\x16\x22\x9c\x4f\x44\x14\xdf\x51\x58\x0d\x48\x21\x0d\xab\xc9\x37\x73\x70\xb6\x06\x8a\x88\xe8\x1d\x3a\xd1\xbe\xd4\x98\x51\x55\xc3\x60\x0f\xf4\x87\x68\xb9\x03\x02\x2f\xe0\x2a\xe4\x80\xf2\xe6\x32\x9f\x0b\xcc\x91\xd7\x5f\x5c\x6a\x09\xfd\xf7\x7b\xde\x90\x49\x9f\x3c\xa3\x95\xcb\x20\x06\x2a\x09\x84\xad\x6a\x01\x41\xfd\x01\xc2\xd5\x4d\xfb\xb1\xee\x58\x46\x10\x64\x07\x73\x43\x9a\x16\x58\xd2\xc9\xf8\x62\xf1\x83\xbf\xef\xb0\x33\xa3\xbe\x27\x18\x12\xf1\x3c\x78\x70\x46\x57\xe7\xfb\x4f\x85\x01\x75\xfc\xd6\x3d\x3e\x44\x05\xd1\x92\x24\x2c\x21\xf2\x7c\x51\x47\x7f\x32\x11\xa9\xce\x24\x8e\x89\x2b\x42\xfb\x6d\x85\x82\x0f\x41\xb8\x97\x83\x6f\x20\xf8\x5a\x13\x11\x53\x4b\x5c\x40\x4f\x8b\x7a\x4a\x03\x19\xbc\x6c\xec\xaa\x57\xfe\x4d\x4f\x20\x60\x7c\x99\xc2\xdf\x22\xfa\x06\x76\xf9\x9d\x1b\xd8\x78\x86\xc9\x28\xc4\x98\x8c\x6e\x78\xc5\x7d\x75\x83\x30\xe6\x92\x2c\xbe\x03\xc1\x03\x40\x25\x3d\x0d\xd4\x83\x79\x2c\xe7\x5e\x6c\xd0\x9d\x12\xfb\xbb\x04\x1f\x02\x05\xe6\x5a\xd2\x5c\xe7\xc1\xb2\x4e\x77\xee\x8d\x6f\x91\x5e\x3b\xc3\xe1\x0d\x09\xfb\xd3\x87\xa8\x4b\xda\xab\xfd\x1c\xed\xb5\x2c\x0b\x17\x33\xb5\xf4\x70\x88\xc0\xd3\x5e\x0e\xf4\x58\xc8\x54\x14\xc2\xb0\x4c\x2d\x29\xf6\x3f\x77\x58\x61\x31\xee\x65\x53\x0f\x20\x9b\x51\x8a\x0f\x25\x7a\x07\x46\xbb\xd5\xfe\x0a\x2e\x0c\x38\x8a\x6c\x48\x0e\x1b\x60\x71\x4f\xee\x1c\x59\x41\xbb\x4e\x13\xf7\x07\xea\xc4\x87\xa9\x66\x6a\x72\x3b\x57\x93\x13\x4a\x26\x8b\x77\x59\x77\x86\xc3\xa3\x19\x3b\x46\xd3\x55\xdd\x08\x95\xfc\x62\x16\xc5\x36\xa5\x42\xff\xd7\xd7\xb0\x80\x10\xc8\x6f\x54\x7a\x5d\xaa\x38\x33\x5a\x8b\xfa\x26\x55\xd5\xf7\x1b\x4d\x88\x07\xf5\x0c\x85\x45\xc5\x83\xdd\x0b\x69\x00\x22\xee\x65\x87\x3a\xea\x3e\x8f\x1a\x56\x5f\x3b\x0e\x4e\x02\x95\xfb\x0d\x32\x1f\x5c\x0b\x39\x7f\x2f\xd0\x52\x8f\x86\xa0\xd1\xb7\x07\xf7\x37\xb1\x75\xc6\x9e\x9e\x7a\xe3\xc8\x4d\x4b\x2c\xf3\xa3\x8a\x63\x1a\xa8\x03\x2b\x3e\x65\xbb\x45\x28\xf6\x6d\x0b\xfd\x34\x47\x3e\xd0\x10\x1d\x2a\x61\x25\x5b\x21\x5b\xc1\xcb\xab\x9a\x26\xd2\xb9\x69\x32\x4b\x77\xc8\xa5\x46\x4e\x5b\x23\xdf\x6c\x51\x12\xf9\xd1\x7c\x58\x7d\x95\x55\x9d\xe2\x12\xad\x24\x1d\x8b\x12\x60\x50\xe5\xfd\xdf\xcc\x83\x9a\x7e\x5a\xa2\xfd\xa1\xca\x20\xc0\x91\x0d\x86\x34\x18\xf1\x95\xb3\x8a\xdf\xcc\x36\xe9\x2f\x23\x96\xac\x31\x44\xb5\x37\xb3\x0f\xbe\x4d\xde\x61\x49\x02\xf8\x99\x78\xb7\xfb\x42\xcd\x99\xf1\x3d\x99\xc4\x5c\x73\x4f\xb8\x2c\x32\x59\xf9\x0b\x88\xfd\x52\xbd\xcb\x88\xf7\xee\xec\xdd\xe4\xc2\x43\xd8\x80\xba\xc7\x61\x4e\x15\xcf\x8d\xb5\x99\x3f\xfa"}, -{{0xdb,0xbd,0x0f,0x7e,0xcb,0x64,0x82,0xcb,0x01,0xc4,0xdb,0xdc,0x38,0x93,0xc0,0xdb,0x81,0xe8,0x31,0x35,0x3a,0x5b,0x01,0xcc,0x75,0xd3,0xb1,0x1f,0x2f,0xf3,0xc5,0x9c,},{0x2d,0x4e,0x58,0x8d,0x31,0xa3,0x84,0xb1,0x78,0x58,0xc0,0xd7,0x84,0xf6,0x71,0x2b,0xaf,0xd0,0xb4,0x12,0x04,0xcf,0x8f,0x0d,0x57,0x97,0x3e,0x59,0xc7,0x70,0xd3,0xda,},{0x96,0xc0,0x03,0x61,0xfb,0x71,0xc5,0x23,0x05,0xe1,0xab,0x77,0x07,0xe0,0x46,0x52,0x03,0xeb,0x13,0xdf,0x3e,0x06,0x55,0xf0,0x95,0xfb,0x33,0x19,0x42,0xa4,0x0b,0x15,0x58,0x41,0x43,0xb3,0x70,0xa7,0xdd,0x57,0x61,0xfb,0x03,0xc0,0x75,0xd0,0x4a,0x83,0x48,0x66,0x1c,0xce,0xa9,0xad,0xa5,0x33,0x65,0xb5,0x00,0x08,0x7d,0x57,0xec,0x0c,},"\xe0\xff\xf3\x59\x75\xeb\xa7\x8d\xa2\xb0\xff\xcc\x5c\x1b\x66\x36\x00\x88\x8e\x82\x55\xcd\x20\x8f\x6d\xce\x7e\x88\x95\x3b\x71\x42\x93\x73\x89\xa3\x37\xae\x82\xf4\xcf\xe3\x2f\xcb\x34\xf5\x52\xa4\x8f\xa8\x89\x9e\x1a\x65\x9e\x3e\xd3\xd3\xd2\x90\xef\xc9\xa0\xf7\xde\xdf\x33\xe2\x1d\x04\x8d\x8d\x91\x07\x57\x03\x7b\x76\xe8\xa7\xee\x9e\x4e\xca\x30\xf5\x29\xdd\xc0\x2c\xef\xfc\x26\xd6\x4f\xda\x73\x03\xcc\x0d\x89\x40\xe9\xef\x59\xdc\x98\x3c\x12\xcc\xd1\xd2\x71\x7e\x64\xd3\x00\x6a\xf8\x2a\xb1\x5b\xb8\x78\xbb\x89\xd1\x75\x8b\xe4\x43\x10\x42\x06\x38\xb9\x6a\x0b\x5e\x1e\x65\x00\x9d\x69\x39\x5d\x02\x7a\x5d\xa4\xa8\x5e\x90\x1b\xe9\xaa\x2c\x0b\x3a\xcc\x50\x8e\xe1\x85\x74\xc1\xb2\xfa\x9b\xd5\xd7\xae\x7c\x7d\x83\x07\x12\xda\x5c\xbf\x26\xbe\x09\xa3\x12\x84\x70\xa1\x2a\x14\x90\x9a\x80\xa2\x66\x65\x9b\xef\xda\x54\x8f\xd2\xb2\x2f\x24\xc5\xfd\xc2\x06\xed\x3a\x4e\x75\xf5\x32\x06\x82\xed\x0e\x4c\xe8\x17\xd6\x3d\x5c\x7f\x1e\xe2\xb4\x40\x64\x33\x55\xbe\x65\x42\xf5\x9d\xc6\xc4\x5a\xb1\x57\x72\xf2\x21\x9a\x81\x2e\xf7\x52\x76\x42\x01\x5b\xc7\x5f\xe4\x5b\xa9\x69\xe8\x10\x0c\x26\x8e\x24\xce\xef\x92\x05\xa8\x3a\x3f\x7b\x5a\xe8\x00\xad\x06\xe0\x95\xb9\xb1\x39\x21\x94\x89\x79\x3a\x7b\xce\x84\xeb\xeb\x65\x4a\xb6\x66\x9e\x28\x55\xcc\xbe\xb6\x94\xdd\x48\x65\x15\x05\xb9\x59\xd3\x2a\x77\x02\x0b\x86\x95\x33\xe3\x25\x6d\x40\x68\x5a\x61\x20\xba\xb7\x94\x48\x5b\x32\xe1\x16\x92\x56\xfb\x18\x8f\xe7\x6e\x04\xe9\xef\xa6\xd1\x0d\x28\x6a\xe8\x6d\x6f\x1c\x87\xe8\xfc\x73\xad\x9b\x59\xfe\x0c\x27\xee\x92\xa4\x64\x15\xb3\x9d\x78\x6d\x66\x32\x5d\x7f\xa6\xfd\xa7\x12\xf1\x99\xda\x55\x4f\xc1\xc8\x99\x44\xa4\xe8\x4c\x19\x6e\x97\x9a\x80\x75\x53\x71\x8c\xb8\x1c\x07\x6e\x51\x1e\x60\x9d\x5c\xac\x23\xd8\xf4\x5b\x38\xb9\x4b\xcf\xcf\x15\x8d\x0d\x61\x60\x22\x38\xd5\x2e\x3a\xe8\x4c\x81\x53\x22\xf5\x34\xf2\x54\xe6\x33\x89\xae\x15\x5d\xee\x2f\xa9\x33\x96\xf0\xea\x49\x9d\x5d\x08\xc2\x47\x59\x08\xc6\x48\xbd\xdc\xee\x59\x1e\x13\x37\xe9\x42\x1d\xc5\xa2\x57\xce\x89\xcc\xce\x4c\xee\xa8\x09\xd7\xe8\x71\x34\xe0\x39\xdb\x1b\xe5\x98\x19\x6d\x30\x89\xfd\xcf\xa8\x97\x8e\x02\xc1\x55\x58\x32\xda\x0a\x72\xb0\x8a\xd0\x7c\xdd\x07\x26\x27\x40\x9c\x87\x39\x37\xb0\xe8\x35\x71\x5b\xaa\xf2\x60\x8b\x23\x95\x32\x74\x67\xcf\x69\xa1\xcd\xcc\xe6\x37\x24\x18\x38\x3e\x7b\x89\xc8\xdf\x4d\x53\x1f\x58\x51\x49\x50\x9e\xad\x1e\x41\xb6\x62\x7f\xea\x81\xc7\x95\x8c\xb4\x9d\x2d\x3c\x3e\x2f\xc6\x91\xe0\xb8\xcf\x72\x67\x9c\x08\xb8\x90\x46\x54\x53\x1b\xc4\x36\x8f\xb6\x17\xac\x75\x57\xd9\xdb\x8d\x32\x9d\x77\xe4\x8d\x8f\xb4\xde\x73\xab\xe7\xcb\x93\x88\x27\x4a\xf5\x85\xf8\x75\xc0\xda\xb7\x93\xe4\x35\x35\x18\xbb\x24\x69\x53\x42\xaf\x0f\x5d\xf5\xbe\x4e\x9c\x7a\xd2\x15\xbe\x90\xe2\x55\x40\xda\x34\x89\x71\x7d\xd3\xd2\x92\x54\x58\x5a\x45\xc1\x3e\x6d\xcc\x7e\x9c\x8a\x3a\x79\xff\x75\x5c\xbe\x46\x5b\x25\xe2\x3a\x1d\xa6\x08\xe1\x08\x4f\xec\x83\xbf\xf8\x0c\xfb\x74\x42\xb1\x46\x01\x87\x30\x7a\xcd\x75\xe3\xf2\xd1\x28\x43\xa7\x70\x94\xac\xc3\x28\x88\xfb\xe5\xf1\xfc\x24\xc6\x15\xd1\x9a\x06\x53\x91\xd4\x17\x64\x74\x64\x42\x46\xb5\x34\x3d\xa7\x76\x26\xa2\xd4\x83\xfe\x20\x4f\x83\x93\x28\x77\x5b\x71\xa4\xcb\x56\x72\x73\xe1\x69\x64\x0a\xf9\x3d\xde\x3e\xca\x91\x16\xf4\x00\xe2\x3a\x7a\xd3\xd8\xfc\x3a\x28\xe5\x65\xf1\x25\xd6"}, -{{0x74,0x8b,0xb3,0xcd,0x47,0x71,0x37,0xbc,0x88,0x0e,0xa7,0xc6,0x1d,0xf2,0x5c,0x1d,0xac,0x6e,0xbe,0xc9,0xe6,0xc3,0x19,0x3d,0x81,0xff,0xa6,0xf7,0xa8,0x1e,0xc6,0x67,},{0x10,0x6f,0x28,0xcf,0xed,0xf0,0x96,0x45,0x42,0x26,0xb3,0xb0,0x1f,0xc2,0x4a,0xb1,0xc9,0xbb,0xd7,0xf2,0xb0,0x97,0x3e,0x56,0xfe,0x2f,0x4c,0x56,0xa0,0xb1,0x47,0x5b,},{0xe1,0x3c,0xa8,0xe5,0xce,0x7c,0x26,0x80,0x90,0x90,0x8d,0x61,0xcf,0x2f,0x0a,0x3e,0x45,0x72,0x41,0x2b,0xf5,0xad,0xfc,0x5a,0xdd,0xfe,0x88,0x55,0x6f,0x14,0x8b,0x5f,0xcb,0xe3,0xe1,0xbc,0x65,0xff,0x16,0x11,0x7d,0x35,0xc9,0xd5,0xdc,0x3b,0x11,0x71,0x98,0xf8,0x84,0x92,0x5b,0x40,0x35,0xb2,0xc0,0xde,0x6c,0x40,0x2e,0xd4,0x7a,0x01,},"\x00\xde\x6d\x99\x0c\x84\x33\x8a\x39\x8f\xda\x5f\x4a\x2c\xca\x73\x3c\x56\xb2\xa2\xea\x39\x6c\x2f\xe6\x67\xc2\x68\xe3\x81\x45\x87\x85\x39\xbd\x41\xbc\x14\x0a\x2c\xdf\xe7\xe1\x83\x60\x41\x10\x48\xcc\xa6\x0f\x35\xce\x51\x09\x91\xdf\x26\x1c\xbf\x66\x90\x39\xd9\xd2\x56\x87\xa0\x7f\xc0\x47\x6a\x41\xf5\x0e\xcc\xf3\x81\x53\xee\x6a\xe9\xff\xd3\x92\xb2\xbe\xc0\xcc\x67\x10\x1e\xc3\x69\x6d\x7a\x2e\xc8\xcb\xd4\x47\xb6\xa6\xea\x06\x3d\x33\xec\x12\x8a\xe8\xb5\x75\x77\xde\xe1\x7b\x97\x16\x25\x63\xf1\x5e\x42\xb5\x5c\xa4\xbe\xdb\xdf\xb6\x31\xa9\xf6\x26\x2f\x94\xae\x35\xbb\x35\xf7\x95\xc3\x5a\x01\xde\xdb\x46\x45\xa7\x3c\xfa\x6e\xd9\xee\x52\x1e\x46\x31\xfb\x17\xbb\xc0\x6e\xe5\x73\x16\xbe\x52\x74\x27\xc8\xaa\x55\xc6\x31\x18\x74\x62\xd4\xb2\xc8\x82\x2c\xa4\xe1\x8b\x7a\x5d\x4c\x11\x4c\x11\xdc\x22\x06\x9b\xc8\x32\x65\x6d\x5f\x4d\x39\x54\x87\x18\xc5\x1f\x5e\x4f\xc8\x28\xf6\x0e\x37\xf0\x13\x07\x50\x52\x65\xac\xb2\x2d\x5e\x8d\x76\x7b\x9a\xa7\xb8\x66\xa1\x57\xc6\x43\x87\x3e\x09\x08\x4a\x1a\x40\x4a\x7b\xb5\x8c\xcc\x4b\x5a\x39\x0f\xd3\x06\x01\xc8\x96\x93\x5e\x35\x56\xf6\x0d\x2d\xc6\xbd\xff\xe4\x7d\xa0\xa6\x87\xc8\xec\xe1\x24\x1f\xf6\xc0\x7d\x77\x61\x11\xca\x65\x98\xfc\xa9\x68\xcb\x6a\xfa\x0a\x14\xa3\x4a\xb8\xf5\x4b\x95\xd3\xd8\x47\x3a\x17\x4b\xc7\x25\x52\x3f\x86\x74\xdf\xb2\xb1\x0f\x87\x42\x07\xfe\xe1\xb0\x8b\x42\xda\x1f\x58\x65\x53\x05\xa3\x59\x75\x7a\xa0\x25\x1f\x14\x13\x8e\xed\xbc\x28\x0c\xbd\x38\x5b\xf4\xbb\xf5\x53\x01\x14\xcc\x43\xb0\x47\x47\x79\xe2\x04\x96\x2f\x85\x60\xd4\xaa\x42\x3e\x17\xe6\xae\xca\xce\x66\xc8\x13\x78\x4f\x6c\x89\x8b\x5b\x9c\xb7\x46\xa9\xe0\x1f\xbc\x6b\xb5\xc6\x60\xf3\xe1\x38\x57\x4f\x59\xb9\x74\x54\x45\x48\x6c\x42\x2b\xc0\x6a\x10\xcc\x8c\xc9\xbc\x56\x45\x8e\xf8\x5e\x0e\x8a\x02\x7c\xb0\x61\x7d\x03\x37\xdd\xda\x50\x22\x0b\x22\xc5\xc3\x98\xf5\xce\x05\xec\x32\xf0\x9b\x09\x0f\x7c\xf6\xc6\x0f\x81\x8c\x6b\x4c\x68\x30\x98\x3e\x91\xc6\xea\xdf\x1e\xae\x4d\x54\xbd\xe7\x54\xf7\x5d\x45\x0a\xe7\x31\x29\xf6\xc4\xff\x5c\x4c\x60\x6f\x7c\xad\xbf\x4f\x78\xa1\x8d\xb2\x96\x1c\xc8\xc8\xdd\xab\x05\x78\xcf\xed\xfc\xf9\x5e\xf0\x88\x8a\xfd\x38\x55\x37\xd1\xd0\xa0\x76\x48\xa5\xce\x25\x22\xd0\x63\x35\x07\xd7\x75\x93\xe1\xa0\x36\x6d\x1e\xce\x84\x3d\xe6\x98\x67\xd7\xac\x44\x2b\xa7\xda\xd2\xa9\x0b\x59\xd8\x98\x4e\x4a\x94\x6b\xbe\x5f\x17\x2d\xa4\x27\x63\x8b\x2b\x61\x20\x90\x41\xff\xf5\x0e\x60\xec\x02\xec\x2c\x0b\x1d\xc4\xbe\x2e\xdd\x13\xe8\x7b\x64\xd1\xd1\x66\x31\x14\x57\x3c\xf5\x8a\x17\x73\x9f\x46\x3a\x1c\x3d\x6b\x21\x23\x39\x01\x83\xb5\x05\xc8\xee\xff\xb2\x05\x39\xbd\xfe\xeb\x40\x77\x6d\x20\xc4\x59\xba\xc4\x56\x99\x68\xfc\xaf\xe4\x4e\xa4\xcd\x62\x4a\x84\xbf\xcc\xd7\x87\x6d\xd7\xbf\x55\xf8\x3a\xc7\x04\x0e\x30\xf3\x26\xdc\xe3\x25\x58\x8e\x1b\xa5\xbc\x07\x90\x26\x5d\xfd\xba\x09\x83\x9e\xef\x57\x16\x41\xe8\xa1\x23\x4b\x6c\xfc\x3a\x36\xa8\x66\xbd\x6b\x92\xcd\x71\xec\x74\xe0\xd4\xde\xb9\xe7\x4d\x15\x82\x01\xaa\x50\x2f\x07\xc8\xba\x34\x8a\xc2\x6a\xaf\x9b\x3d\x07\x0c\x9a\x40\xb5\x2a\x44\xe9\x32\x55\x2b\x67\xa2\xdf\x05\xa7\xf0\xf0\x3c\x61\x7b\x48\xdc\x27\x82\x36\x6a\x23\x1e\x0c\x4e\x39\x38\xa4\x27\x4b\x36\xaa\x94\x50\xff\x93\x6b\xe1\x32\xdc\xb6\x92\x83\x8d\x65\x4c\x94\x54\x2c\x6e\x04\x7a\x7f\x78\xba\x71\x19\x19\xf9\x08\xa1\x5b\x30\xb9"}, -{{0x39,0x3d,0x44,0xdd,0x0d,0xed,0x71,0xfc,0x08,0x47,0x7b,0xd2,0x5e,0xd0,0xe6,0x62,0x9f,0xa7,0xf8,0x8f,0x08,0x2e,0xbc,0xef,0x09,0x18,0x98,0xe5,0xc9,0xe3,0xd5,0xb8,},{0xc5,0x2a,0x99,0x3b,0x80,0x2d,0x84,0x54,0x0d,0x27,0x54,0x79,0xa1,0xaf,0x5e,0x28,0x7d,0x19,0xea,0x13,0xb3,0x80,0xfa,0x30,0x68,0xd2,0xf2,0xc6,0x8e,0xb9,0x7a,0x09,},{0x84,0xc7,0x16,0xe6,0x0d,0xe6,0x7b,0x02,0x0c,0xc1,0xa6,0xa2,0x4e,0x65,0x49,0xfe,0x56,0xc6,0xd9,0x41,0xa8,0xed,0xea,0xe4,0x07,0x62,0x66,0x66,0xc3,0x1c,0xb6,0x0d,0xee,0x6b,0xe5,0xa7,0x1e,0xbd,0x76,0xba,0xf7,0x1b,0x75,0x11,0x4b,0xcc,0xfd,0x37,0xd1,0x63,0xa9,0x68,0xbb,0xee,0xc1,0xf7,0x69,0x72,0x15,0x12,0x96,0xc4,0x7e,0x07,},"\x14\x2b\x6e\x82\x50\x13\x62\xd5\x5a\x04\xb8\x9d\x54\x1a\x79\x68\x63\xd7\x78\x38\x40\xd3\x4c\xbd\xfc\x51\x6a\x3c\x84\x77\x2f\x92\x44\x6f\x5f\x0d\xf4\xc4\x5c\x6e\x0d\xc8\xec\x1e\x9b\xb0\xff\x7e\xc1\x69\x6a\x09\xcd\x7a\xe3\x4c\x10\xf8\xe6\x1a\x9a\xca\xbd\x43\x03\xf0\xa9\x24\x72\x37\x62\x1c\x49\x0e\x8d\x9d\x0f\xe4\x44\x82\xc5\x60\xd0\x51\xb8\x2b\x07\x4a\xc3\xd8\xe4\x9b\xb2\xac\x71\x5a\xc4\xcd\xe3\xd4\x70\x9d\x0e\xa3\xaf\xc5\x1b\xfd\xef\x4b\x65\x67\x71\xfb\xd5\x5f\x89\xda\x9f\xa6\xdc\xaa\x62\xcb\xae\x56\x12\x08\xd9\x8c\xfa\x24\xcb\x81\x25\x2b\x89\x5f\x6a\x4a\x92\xc8\xe4\x07\xaf\x6c\x1f\x1e\xf4\x9d\x8d\xde\x15\x4f\xbc\xb1\xca\x45\x7a\x20\x4b\x5e\xa5\x43\x2e\x4d\x71\xfb\x7e\xb2\x4d\x43\xf6\xfe\x25\xe7\xb4\xc6\x59\xb0\xee\xbc\x4c\xbc\xc8\xb3\xcf\xde\x07\xc8\xf0\x7b\x18\xa5\x15\x70\xe7\x16\x3e\x33\xb3\x17\xb6\x13\x60\xf9\xce\x08\xd9\x5d\xe2\xc3\x15\x6a\xf1\xcc\xc9\xb5\x5b\xcf\x81\xea\xbf\x3c\x40\x43\x40\x46\xbb\xe8\x2e\x02\x99\x2a\x2a\xc8\xb3\xb4\x25\x68\x0a\x23\xd9\x34\x72\x6c\xb1\xb7\xbf\x26\xce\xb5\x2a\x39\x02\x2c\x00\xac\xf4\x25\x25\x71\x67\xb8\x21\x18\x5f\x68\xe3\xed\x17\x90\x3d\x8d\x22\x27\x54\x98\xc3\x9a\x9e\x8d\xf8\x84\xec\x00\x55\x8d\xcf\xa4\x3b\x8a\x11\x9c\x2e\x85\x3b\x9a\x03\x18\xbb\xea\x08\x7f\x9c\xec\x17\xca\x49\xb7\x08\x17\xb8\xd7\xc1\x70\xa8\x90\x6f\x3e\xe9\xe8\xf8\xcb\x27\xa1\xd0\xf5\x75\xab\xfa\x62\x7e\x88\xf0\x8c\xa4\xb9\x3c\x32\x97\xc4\xf3\x17\x07\x2f\x42\x1c\x5e\x60\x2e\x2f\x83\x1d\xfb\x82\x55\x1b\xdc\xe8\xd7\x12\x16\xf0\x5c\xf9\xa2\x77\x3b\x90\xfc\x93\xb9\xd8\x55\xa9\x1e\x35\xad\xe3\x32\xa5\x06\x1f\xdb\x82\xb3\x09\xba\xb4\xf5\x6e\x2d\x58\x6a\x84\xc6\x74\x81\xd1\x90\x2c\x26\x1b\x3f\x97\xdc\x30\xb1\x84\x61\x9d\xf9\xfd\xfc\x7a\x32\x9d\x06\x1a\x41\xdf\x33\x22\x02\x13\x3d\x8e\xae\xed\xdb\x4c\xfc\xee\x53\x53\x6e\x07\xaa\xd1\x15\x53\xdc\xf5\xed\x1e\x94\x9d\x45\x35\x5f\x9e\xf4\x2c\x78\x32\xb0\xde\x7c\x2f\x15\x26\xfb\xef\x86\xb6\x36\x49\xb6\xb8\x5a\xe5\xca\x86\xf0\xce\xa6\xdf\x9c\x12\x6c\x1d\x79\x48\x9c\xc3\xbf\xc6\xe8\xbf\x03\x46\xeb\x30\xd0\x16\x43\xc0\x10\x15\x0c\x5c\x8d\x0e\xb5\x01\x0a\x46\x11\x22\x15\x13\x79\x91\x08\x5e\x57\x49\x3b\x22\xe8\x35\x26\xb7\xb1\x72\xc6\xc7\x34\x1c\x40\x32\x1e\x9c\xeb\x7c\x82\xbf\xba\xa4\x8f\x3b\xd8\xf5\x13\x72\xd9\x6d\x47\x44\x4f\xf0\xd8\xbb\x2e\x5f\xd2\x65\x14\xeb\x63\x91\x05\xe3\x38\x95\xfd\xc4\x1f\x6d\xf1\xfb\xfd\xcb\x08\x46\x6e\xc2\xd2\x17\xfc\x99\xfb\x01\x2f\xe6\x54\x0c\x0c\x5a\x59\x66\xed\x3e\x66\xfa\xb1\x20\x2a\xb9\xda\xff\xe8\xe2\x7e\x8f\x74\x62\x82\x8d\x66\x26\x59\xea\x3b\x2c\x60\x8c\xf6\x8e\x30\xdb\xac\x62\xff\xd8\x22\x9f\x4a\x53\xf5\x9a\xe1\x68\x33\xb8\x1a\x15\x91\x61\xf1\x93\x69\xf6\x0f\x51\xc4\x3a\x21\x7e\xfc\x5e\xfd\x6a\xb7\xa9\x1f\xe2\x49\xc7\xb8\xa0\xc1\x4e\x9f\xae\xa5\x33\xde\x13\x38\x49\xa9\x24\x47\x67\x6f\x6c\xc1\x8b\xef\x4f\xec\x7f\x37\x31\x97\x59\xce\x80\xea\x3e\xac\x18\xfa\x2d\x9f\xa0\x23\x09\xe1\xce\x93\xac\x6c\xf4\xcd\x2c\xb2\xc9\x5f\x1e\x2a\xff\x7b\x2a\x88\x56\x40\x5a\x7b\x8e\xba\xbe\xb4\x90\x6d\x9b\x97\x34\xda\x9f\xb5\xe5\xd3\xf3\x22\xbb\x5b\x55\x9f\xa6\x1e\xc8\xf5\x15\xdb\x90\x65\xab\x4b\x91\xa7\xa3\x1d\x5c\x62\x50\x61\xc2\xfd\x2b\xcf\xe1\x7f\x94\xbb\xde\x47\x76\x30\x2b\x8a\xef\x3d\x5b\x52\xdb\x3b\xc7\x3a\xe4\xa3\x0c\xc4\x41\x7a\xcb"}, -{{0x71,0x19,0x36,0x40,0xa0,0xa2,0xb2,0x2f,0xb2,0x2d,0x00,0xa8,0x0b,0x33,0xa5,0x51,0x4f,0x3d,0x10,0x00,0x03,0x4f,0xcc,0xd8,0x85,0xd8,0xea,0x86,0x38,0xf0,0xb0,0xf8,},{0xb1,0xd3,0x6f,0x72,0x3b,0x70,0x86,0xd9,0x23,0x11,0x9f,0x46,0x75,0x9b,0x39,0xfa,0x1e,0x40,0x38,0xc6,0x41,0x8c,0x37,0x9b,0xa9,0x8b,0x58,0x40,0xc7,0xea,0x50,0x68,},{0xa9,0x70,0x2a,0x33,0x95,0xac,0xd2,0x0d,0x75,0x43,0x73,0x09,0x5d,0xc6,0x14,0x45,0x58,0x4d,0x8e,0x57,0x10,0x80,0xe1,0x79,0xad,0xcb,0xa3,0x10,0x6b,0xb0,0x6a,0x7c,0xe4,0xd4,0x60,0xf1,0x26,0x1a,0xef,0x86,0x43,0xab,0x16,0x34,0xf4,0x7c,0x94,0x14,0xa3,0x2e,0x18,0x3a,0x32,0x76,0x91,0xe6,0x58,0x43,0xdd,0x6c,0x05,0x50,0x72,0x07,},"\xe0\x28\x79\x48\xbb\x85\xa3\x98\xe6\xaf\xfa\x2d\x25\xfc\xff\x8b\xdb\x93\x26\xf5\xd1\x4f\xde\xb6\x05\x49\xf5\xfb\xf0\xc1\x81\x6f\x11\xcb\xdd\x4e\x90\xfe\xa0\x39\xdc\xa6\x0f\xaa\xd1\x69\x60\x03\xf9\x15\x15\xc9\xb2\x72\x88\x2c\x95\xc9\xa4\xab\x6e\x27\x77\xbd\x92\x7e\x7d\x84\x42\xae\xa6\xce\xa6\x19\xc9\xb1\x52\x55\xfe\xd6\x12\xb5\xcc\x31\x58\xfc\x70\x5b\xb7\xa5\x06\xf4\xaf\xec\xf4\xe3\x4e\xd5\x17\xb2\xc1\x2b\x83\x62\x61\x0e\x5e\xa2\x70\x48\x5c\xcc\xb3\xc9\xaa\x97\xec\xd6\xcb\x19\x63\x09\x00\xf0\x7d\x94\xcb\x29\x3c\xb6\xe0\x89\xa9\xa7\x7c\x01\x94\x07\x3a\x7f\x71\x77\xb0\x23\x0d\x25\x76\x3a\x2e\xf9\x8d\x47\x70\x4c\xb2\xc3\xaf\x4c\x3c\x1b\x49\x56\x31\xb4\xa5\xb2\x1b\x2e\x56\xbf\xf2\xed\xe0\x3e\xa4\xfe\x7c\xf8\x29\x17\x34\x7e\x3a\x9d\x4d\xbe\xef\x37\xd1\xcf\x17\x61\x5a\xda\xa0\xfd\x17\x05\x79\x69\x91\x7d\x47\x8d\x03\xcc\xd8\xf8\xb8\x8e\x5e\x5a\xca\xe6\x73\x2a\x81\x61\xdf\xb5\xf7\xd0\x21\x23\xc8\xd5\xa5\x65\xcf\x4d\xd9\x8d\xfc\x9a\xaf\x5a\x33\x50\x58\xa9\x41\xca\x43\x07\x3f\x26\x59\x61\x5a\x72\xfe\x78\xc1\x01\xc4\x1a\xed\x07\xf3\xbc\xf9\x80\xb0\xa5\xb3\xfb\xaf\xdb\xbe\xa9\x2f\xd8\x89\xcf\xd5\x3d\x40\x32\x78\xbc\x15\xa5\x9a\xa1\x40\xc2\xd7\x73\xb8\x88\x9b\x96\x3d\xce\xa3\x65\x36\x2e\x42\x6e\xf4\x60\x98\x45\xc9\xbc\xe9\xf8\xae\xb5\x91\xd1\xa4\x69\xb0\x72\xb4\x12\x09\xf5\xa8\xb6\xdc\x23\x95\xad\x90\x60\xeb\x2e\x37\x09\x78\xae\x33\x11\xd1\xcf\x0a\x8f\x20\x51\x42\xd4\x36\xba\xb6\xb9\x59\x43\xa9\x7c\x23\xe6\x1b\xd1\x4b\x2d\x95\x67\x2c\xb9\x32\x5e\x9a\xb1\xfc\x9e\xee\xaa\xcc\xd5\x8b\x9f\x4a\xc1\x55\x0b\xde\xc8\x44\x9b\x03\x60\x39\x49\x6c\x5f\x07\xa5\xed\x64\xd5\xd8\x51\x71\x69\x01\x44\xdb\x5c\x81\xc8\x1c\xbc\x4c\x16\x71\x8d\x52\xc4\xdf\xd1\x95\x8c\xa5\xc9\xc8\xba\x58\x2c\xd9\xd7\x06\xf2\x7a\x74\x74\x4c\x3a\x05\xbf\x1c\xcd\x51\xf1\x09\x20\x10\xd3\x6f\x15\x78\xb5\x78\xae\x0e\x9f\xfa\x47\x07\x90\x55\xef\x94\xfa\xbc\x9f\xf7\x2f\x73\x8b\xef\x68\x46\x1e\xb3\x40\x4c\xce\xe9\x53\xf5\xee\x86\x4c\x97\x4c\xe7\x0e\x90\x37\xe3\x38\x8f\xba\xf2\x88\x9e\x13\x66\xca\xa0\xf6\x51\xe2\x1b\x33\x9e\x3d\x56\xb9\xd9\x5a\xc3\x0b\x35\x92\xa9\x48\x91\x2c\x90\xbf\x54\x47\x3c\xeb\xc4\x67\xb0\x9a\x39\x43\xdc\xac\x48\x68\xac\xb5\xb3\x5e\xa6\x91\xef\xf4\xd8\xcc\x1c\xda\x0c\x6c\x0a\x9c\x16\x9a\x4e\xe1\x00\x41\xf3\x5f\x43\x3f\xb5\x3d\x26\x06\x7b\x29\x10\x56\xb1\xda\x69\xff\x46\xfb\xea\x1c\xa7\x21\x36\x59\xa9\x90\xd5\xd5\xdf\x14\x06\xb0\x93\xda\x2a\x33\xc8\xdf\x95\xab\x3c\xe8\x11\xaf\xb9\xc9\x8c\x5b\xfd\x7c\x4e\x98\x1b\x3e\xa9\x4e\xef\xd2\xe2\xfe\x95\x70\x7d\x89\xf3\x07\xfa\x76\x82\x8b\x5c\x67\x74\x95\x0a\xee\x80\x62\x67\x14\x25\x6e\x19\x7d\xc7\xda\x97\x21\x58\xc7\x68\xbb\xee\x7f\xbd\x16\x9e\xc1\x5b\x4b\xb7\xbe\x72\x97\x6d\xbe\xd3\xe5\x12\x76\x6e\xf2\x2e\xf3\xb8\x12\xbc\xac\x4a\xa3\x11\x5a\xfe\x83\xd3\x12\x84\xaf\x8e\xac\xea\x4e\xe4\x9a\xfd\x42\xd9\xc4\x4f\xff\x2d\x86\x1c\x08\x62\x9b\x55\xda\xe0\x0f\xf6\x74\xfb\x02\x8e\x73\x8b\x05\xdc\xb3\x8a\xea\xa6\x96\x3c\xc3\xfa\xaf\xc7\xb6\x92\x45\xa2\xa1\x22\xa9\x6d\xd2\xf0\x3a\x82\x4d\x72\xb0\xfe\x0d\xd7\x98\xdf\x5c\x4b\xb7\x5a\x87\x32\x4e\x76\x4a\x50\xa5\xff\x52\x54\x7a\xda\x8f\x8f\x88\xe6\xf3\x8a\xee\x49\xd5\x8d\xdb\x01\x26\x48\x85\x4c\xd5\x9d\x0e\xc9\x7b\xc3\xd5\x8d\x0a\xd4\x49\x1f\x08\x59\x07\x67\xce\xb1"}, -{{0xbf,0xc9,0x62,0x6c,0x91,0xf3,0x48,0xfd,0xaf,0x46,0x9d,0xef,0x23,0x02,0xe9,0xe3,0x8f,0x90,0x51,0xe7,0x34,0x9e,0x48,0xf8,0x50,0xcf,0x35,0x2a,0x83,0x31,0xa2,0x8b,},{0x4e,0x81,0x93,0x06,0x1c,0x9d,0x65,0xa8,0x2b,0xcb,0x25,0xda,0x08,0x9b,0x4a,0x80,0xba,0x41,0xb3,0xdd,0x2f,0x8e,0xd1,0xdc,0x81,0xe1,0xcf,0xd0,0x3c,0x84,0x91,0x15,},{0x66,0x02,0x42,0xc1,0xdc,0xf3,0x29,0x13,0x69,0xc6,0x5c,0x9d,0x7f,0x89,0x87,0x2e,0xab,0x48,0x22,0x00,0xe3,0x44,0xb2,0x96,0xe3,0x36,0xa0,0xa2,0xe6,0x31,0xfa,0x79,0x60,0x24,0xb6,0xe1,0x11,0x9c,0x27,0xd5,0x22,0x64,0xa4,0x98,0x15,0xdd,0x78,0x19,0x27,0xa7,0xdf,0x46,0x7e,0x88,0xb8,0x01,0xe6,0x84,0xfc,0x60,0x22,0x96,0x25,0x0e,},"\x2f\x11\xf4\x0b\x2a\x19\xf6\x40\xc0\x04\x4c\x7b\x13\x96\x80\xc3\xc3\xb6\x9f\x00\xff\x9f\x6a\x41\x86\xfd\x7d\xed\x56\x9c\x1d\x8c\x57\x20\xf1\x9d\xd3\x5c\x78\x16\xd0\x8a\x94\xc0\x82\x04\xe4\x76\x43\xe2\x64\xd4\x25\xe2\x1c\xef\xb8\x31\x29\xc9\x09\xa3\xd7\x8c\xaf\x72\xc4\x6b\xf1\xa7\x29\x76\x5e\xf4\xb8\xca\x80\x3f\xda\xf8\x05\x2f\xfc\x6c\xc4\xa6\xb5\x79\xa1\x60\xb7\x03\xb1\x53\x55\xc6\xfc\xd3\xb9\xa2\xec\xbc\x26\x7e\x60\xdd\x59\xf6\xa2\xb1\x94\x20\xe5\x57\x27\xa8\x0b\x0b\xb6\x41\x67\xc8\x3b\xa0\xc8\x05\xde\xed\x49\x1d\x93\xe7\x23\xf3\xb4\x32\x63\xd1\x74\x20\xb8\x5b\xe8\x6c\x16\x5c\x55\x27\x79\xdb\x96\x0e\x0a\xa9\xeb\x4d\x9f\x3a\x16\x4a\x5a\x21\xfa\xb3\xf5\x09\xa8\xf0\x19\x9a\x69\x43\xc4\xb2\x23\xcf\x9d\xac\xa7\xe1\x10\xe0\x56\xa8\x1d\x9c\xe0\xe0\xc0\x2a\xc2\x65\xee\xac\x05\xec\xd8\x44\x48\x46\x8a\x4d\x12\x2b\x87\xa3\xe0\x4c\x28\x37\xe4\x3d\x21\x27\x04\xfd\x41\xe7\xf3\xd1\x98\xa2\xe7\x6b\xec\xa0\xe7\x02\x9c\x43\x2a\x06\x54\xec\xd4\x4f\x98\x4c\x5d\xf0\x67\x41\x96\x4d\x83\x72\xc8\x6e\x16\x2a\x8c\x54\x18\x84\x9b\x41\xe5\x71\xfe\xb8\x3e\xb4\x2f\xbb\xcd\xdb\x8a\x08\x21\x43\x90\x9e\xaa\x50\x12\xb9\x79\x93\x1d\xc7\xe3\xcc\xcb\x44\xc7\x91\xe0\x4b\x80\x65\xee\x63\xf0\x56\x1d\xa1\xbb\xf3\x7b\xf6\x50\x34\x77\x87\x9c\xfb\xaf\x6d\x9d\x7d\x9a\x74\x75\x55\x3f\x53\x53\x5f\x84\x7a\x76\xdc\x3b\x2b\x7a\x3d\x1d\x47\x0b\xbe\x17\x12\x4a\x88\xe0\x3f\xe9\x94\xba\x10\xc2\x42\x21\xe3\x9e\x3d\x0f\xf5\x3c\x79\xe2\xfa\xaf\xa1\x90\x12\xd5\xef\x19\x2b\xc6\xd5\x26\x0b\x66\xf9\x97\xb6\x44\xcf\x48\xd9\x9f\x38\x99\xd7\xc4\x85\xe6\x84\xaa\x1e\x6e\x30\x85\x5c\xf7\x5c\x2d\x80\xc7\xa3\xee\x43\x54\xfe\x13\xc6\x76\x09\x1c\x86\x67\x37\x3d\x30\xe6\x0f\xf8\xe0\x9f\xed\xef\x17\x5a\x1a\x87\x39\x5f\xef\xa0\x72\x2b\xf6\xc0\x1c\x65\x55\xcf\xf0\x68\x89\x2a\xfe\x94\x86\xcb\x1f\xcc\x5f\xb6\x64\x1e\x82\xd8\x70\x79\xba\x5d\x7a\x9c\x13\x93\x55\xd6\xc1\x4c\x50\x7d\xbd\x59\x47\x24\xb5\x53\x51\x10\x09\x65\xbe\x9e\x5d\xbf\xa7\x70\x88\x78\xc4\xb2\x9f\x4d\x54\xc2\x17\x74\x6e\x32\x6a\xb2\xa5\x4f\x99\xb8\x81\xd7\xda\x5b\x11\xed\xb0\x8a\x6d\x79\xd8\x85\x69\x1b\x1f\x70\x85\x51\x73\x10\xb3\x09\xcf\x9b\x1b\x71\x4a\xab\xc5\xc1\x7a\x50\x9b\x14\x0b\x89\xb3\xf9\xdc\xee\x50\xca\xb4\x41\xbf\x5a\xd3\xbb\xc2\x99\x90\xf6\x27\x40\x61\x70\xa7\xa1\x0f\x2d\x47\xdf\xc9\x25\x61\x54\xf9\x62\x30\x8e\x76\x9a\x2a\xb1\xb2\xa0\x0e\x27\xe3\x27\xf0\xd1\xfa\x16\x4d\x1e\x38\xea\xd5\xce\xaa\xe2\x38\xba\x52\x6f\x54\xb8\x1b\x45\xde\xa6\xc8\x97\x41\x86\xb1\xb6\x72\x5f\xa4\xc8\x3e\x62\xf3\xe2\x54\xf7\x29\x87\x1b\xda\x4d\xc4\x44\xbc\xe7\x8f\x09\x03\xfa\x31\x8e\xaa\xc8\x22\xa9\x55\x32\xab\x01\x9e\x9c\xfc\x56\x19\xe2\xc2\x06\x7f\x25\x8f\x43\x75\xd2\xe0\x22\x2e\xa5\xbf\x96\xa2\x53\xa2\xa3\xfa\x9e\xea\x02\xc3\xee\xcc\xb0\x28\xc7\x6b\xc6\x0d\x38\x29\x8b\x95\xb9\xaf\xe6\x60\x31\xb1\xa2\xa2\x61\x52\xfd\xaa\x7e\xf4\xf8\x37\xab\xb5\x11\x85\xdf\x8b\x2e\xf8\x5a\xd2\xc9\xbe\x6d\xfb\xa7\x5e\x37\xdc\x7d\x12\xe1\x78\x7f\xc5\x5f\x86\x6f\xd0\x66\xf1\x22\x91\xdf\xf1\x97\x6a\xfc\x10\xda\x91\x31\x01\xe7\x04\x95\xd8\x78\x33\x48\xd6\x11\xb0\x11\xec\x67\x1c\x0d\xa7\x37\xbf\x96\x2c\xdc\xc9\xe4\xa8\x00\xb5\x13\x93\x5a\x56\xd0\x84\xea\x64\xa7\xd4\xe8\xe9\x9e\xe9\x44\x0a\x73\x61\x32\xe4\x2c\x90\x95\x03\xc2\x22\x4a\x14\x1b\x25\xce"}, -{{0x39,0x3b,0x76,0x94,0x82,0x37,0x5b,0x82,0x14,0x27,0xa6,0x6d,0x16,0xe4,0xf5,0x51,0x85,0xb7,0xa3,0xb7,0x33,0x8f,0x1a,0x06,0xf6,0x7c,0xdf,0xa7,0xe3,0x5c,0x54,0x1c,},{0x84,0xaf,0xd7,0x06,0x78,0xff,0xa8,0x5a,0x9f,0x65,0x74,0xcb,0xcf,0xe3,0xb1,0x5d,0x04,0xa9,0xfd,0x15,0x01,0x6f,0xf8,0x55,0x0a,0x98,0x7c,0x4b,0x95,0x1c,0x71,0x22,},{0x31,0xf9,0x8c,0x0a,0x08,0xfd,0xa8,0xe7,0x35,0xb5,0x73,0x66,0xaa,0x1b,0x83,0xb9,0x3d,0xae,0x63,0xb5,0x81,0x0c,0x82,0x1d,0x99,0xcb,0x39,0xdf,0x52,0x1f,0xea,0xc0,0x7f,0x3c,0x41,0x0b,0x27,0xba,0x33,0x07,0x75,0x7d,0x60,0x49,0xf2,0x24,0x54,0xfb,0x6d,0xe9,0xe2,0xc3,0xc2,0x43,0x8d,0x68,0x31,0x90,0x97,0xd1,0x12,0xcf,0xdb,0x07,},"\x8a\xe8\x05\x3e\x03\xbe\xbe\xae\x54\x40\x43\xb8\x41\x4b\x38\x53\x64\xad\xd1\x67\x37\x37\xcf\x8a\xb2\x01\x93\xd4\xaa\xbc\x8a\x78\xe1\xd6\x9b\x9c\x7e\x52\x72\x9e\x69\x30\x78\x06\xe9\x27\xce\x38\x07\xb0\x7c\x68\xc8\x33\xc4\xfc\xf1\x6d\xb1\x5e\x7d\xce\x60\x4d\x17\x98\x91\x5f\xd4\x21\x16\x89\xb4\x86\x46\x42\x50\x2d\x38\xe9\x1b\x19\x97\xb7\x18\x23\x31\x8b\x69\xab\xe5\xbe\xd6\xf5\xe3\x01\x5b\xfb\x22\xdf\x30\xdb\x37\x1f\x22\x60\xc5\xc2\x2e\xba\x60\xdf\x39\xb3\xed\xd3\xc4\xd7\xa1\xe1\x11\xcd\x9b\x8a\xa4\x6f\x67\xbd\x0c\xf3\xa7\x17\xaf\x06\xec\x0c\xe5\x67\x02\x8e\x06\xe4\x79\x79\x34\xad\x69\xb1\xf5\xbe\x44\x0f\xf3\x7a\x8a\x03\x4b\x15\x33\xfa\x94\x64\x24\xac\x59\x54\x00\xad\x27\xd3\xbe\x76\xdc\x89\xba\x9d\x6c\x49\x93\x9a\x09\xf2\xe4\x01\xc8\xf2\x0f\x7f\x7b\x4b\x9e\x63\xb9\xd5\x52\x01\x53\x4a\xb4\xcc\x7b\xe8\x85\xf0\x43\x2a\x2c\x66\x73\xd2\xe7\x65\x19\x4d\xff\xd9\xb6\x09\x6d\xd2\xb2\x84\x39\x18\x75\x09\x59\xa8\xdd\xe4\xa3\xab\x40\x7e\xb2\xf7\xe1\xa4\x9c\x25\x97\xe3\x08\x05\xf8\x48\x0d\xd0\xcc\x82\x72\xa3\x20\xc0\x0a\xa2\xb2\x10\xf5\x76\xe4\x25\x77\xd3\xaa\x41\x97\x03\x69\x7c\xa4\x06\xd4\x3a\x1a\x4f\x99\xb0\x73\x36\x64\xf6\xd6\xb2\x40\x3c\xba\x1b\xdc\xc5\x1f\x54\x1c\xf2\x42\x36\x07\x05\x70\x54\x07\x55\xc7\xa8\x63\x1f\xcc\x2f\x18\x93\x8f\xa1\x1b\xc2\x91\x15\x5b\x39\xd7\xa7\x62\xa1\xff\x4d\xca\x97\xb4\x48\xf7\x0e\x2d\x3d\xe4\x47\xcb\x08\xf9\x18\xea\x20\xcb\x43\x3f\xa1\x15\xe3\x08\x80\xc9\x6c\x8c\xf5\xf0\xeb\xbc\xf4\x82\x30\x9d\xb6\xdc\x1f\xb6\x4e\x17\xc0\x4d\x7c\xdf\x7a\x90\xf4\x01\x4d\x15\xae\x76\x96\xb4\x44\x23\xb0\xba\x08\x4e\xed\x4d\x3f\xb2\x8c\x1e\xfb\x39\x82\x8a\xca\x2f\x40\xca\x6d\xf3\x42\xc2\x0e\x95\xf8\x00\x6b\x27\x67\xa8\x3f\x50\xc3\x1f\xcc\x15\x81\xa0\x97\x53\xe7\x82\x91\xf0\xd9\x93\x1d\x99\x2a\xd3\x60\x44\x73\xce\xb8\x85\xec\xbe\x78\x57\xcc\x52\xad\x55\x85\x33\x4d\x14\x85\xd0\x22\xe1\x06\xb7\x1c\x29\xbd\xfc\xf2\x3e\xe8\xa4\x75\xdf\x2c\x09\x05\x32\x35\x6a\x6f\xfc\x02\x23\x23\x17\x98\x8a\x2c\xbc\xfb\xc2\xa3\x6b\x4b\x48\x3c\xb4\x45\x10\xe8\x55\x99\xb6\x12\x59\x6b\x62\x65\x72\xb0\x99\x6d\x8a\x61\xc0\xee\x3e\xff\xf1\xf7\xc7\x1c\x05\xfb\x5a\x8d\x8c\x5d\x09\xd9\x24\xeb\xaa\xc8\x80\x04\x51\xc9\xdb\x24\x56\x71\x0a\x27\x9d\xfe\x2d\x22\xf6\xae\xa9\xde\x31\x80\x1d\xc7\x42\x53\x43\x62\xb0\xe8\x10\xe9\x9e\x84\x1d\xbb\x7f\x0c\xf9\xaf\x1a\xef\x54\x2a\x52\xc7\x76\xcc\x51\xf2\x87\x36\x8f\xbe\x6a\xd6\x51\xfa\xd5\x78\x7e\xf7\x7c\x73\x53\x5f\x3d\xfb\x36\x18\xcc\x8f\x0d\xbb\x54\x9d\xdc\xa9\xb9\xbf\x91\x13\x5a\x34\x56\x00\x1a\x46\x21\x5a\xde\x38\x8e\x7c\xeb\x9f\xcd\xfd\x0d\x2d\x0a\x03\x56\xaf\xbe\x2c\xec\x1c\x2e\x78\xb4\xd9\x98\xd4\x55\x4f\x46\x21\xf1\x15\x1d\xd3\xff\xd3\xba\x4c\x0b\xc8\x52\xf3\x11\x75\x8c\x5d\xca\x42\x5d\x18\xba\x15\xa8\xd6\x7c\xa4\x01\xd0\xe6\xcf\x28\x0c\xb8\x83\x84\xa2\xda\xd4\x9f\xae\x39\xba\x2a\x77\xb4\x67\xb3\x23\x8a\xa2\x8c\xfd\x13\x7e\x5c\x5c\x0f\xf9\x00\x0f\x8b\x06\xa2\x19\x2e\x16\x29\x20\x69\x22\x65\xdb\x24\xab\x6a\xed\xe5\x35\xe3\x1c\x20\x93\xbe\x57\xeb\xf8\x80\x5d\xf1\x78\x89\x14\xf3\xa8\x84\xf8\x84\x17\x90\x15\x80\x8d\xb4\xd3\x02\x0f\x3e\x78\xbc\x34\x28\x5d\x23\x37\x62\xe8\x99\xeb\xff\x28\x42\x82\x15\xe2\x44\x40\x4d\xe2\x91\x72\x8f\xbf\x41\x24\xce\x5b\x24\x35\x26\x0a\x8e\x34\x11\x80\x07\x5a\x56\x51\xe6"}, -{{0x26,0xcb,0xc2,0x51,0x0e,0xe6,0xea,0x39,0x0a,0x2c,0xb9,0x48,0xa0,0x15,0xd1,0x31,0xab,0xf4,0xc0,0x95,0x49,0x15,0x62,0x0b,0x78,0x16,0xae,0xcf,0x4e,0x11,0xda,0x6d,},{0x14,0x5e,0x8d,0xd2,0x2b,0x44,0x00,0x28,0x9d,0xaf,0xb6,0x26,0xd9,0x5a,0x94,0xc2,0xf3,0xb6,0x9c,0x65,0x19,0x77,0x17,0xcb,0xdc,0xd8,0x50,0x98,0xc5,0x49,0x21,0x07,},{0x67,0x10,0xd0,0xdd,0x00,0x54,0x5b,0x44,0x4c,0xf7,0x14,0xb7,0x91,0x44,0xfe,0x79,0xf3,0x8c,0xb1,0xc0,0xf5,0xb7,0x42,0x48,0xd4,0xf0,0x1f,0xe3,0x60,0x11,0x7a,0x26,0xff,0xed,0x4a,0x3b,0xf2,0x13,0x23,0xb2,0x8a,0x39,0x3a,0xe9,0xde,0xe0,0x7d,0x69,0xe5,0x83,0xe3,0x16,0xc6,0xa5,0x73,0xd3,0x7c,0x64,0x4a,0x8d,0x62,0xc4,0x05,0x06,},"\x9c\xeb\xe2\x4b\x4f\x8a\xde\x86\x43\x0e\x27\x9a\x3c\x43\x3e\x4a\xe1\x7e\x00\x88\x52\xa2\x4f\x08\x69\x0c\xbc\x3d\x75\xe3\xb7\xf2\x00\xda\x89\x7c\x25\xf7\x48\x3b\x37\x63\x7d\x4b\xc1\x10\x08\xd9\x22\x4c\xd5\x81\xfb\xc0\x38\xad\xad\xa0\x2d\x27\x1e\xd2\xa5\xd2\x85\xd8\x43\xa0\xf8\xb7\x9e\x37\x94\x5d\xc3\x5b\xc2\x64\xbe\xcd\x80\x43\x07\xe1\xd4\x42\x18\xa6\x43\xe4\xb5\x9a\x93\x11\xde\x98\x5d\x24\xb4\xc2\x6f\xb1\x46\x03\xbe\x5d\xba\x18\x39\xee\x0c\x8d\x2e\xde\x6c\xb5\x0a\xf6\x7c\x80\x45\x19\x03\x7b\x1b\x16\x63\x31\x8c\xfc\x6e\x75\xd0\xf0\x51\xdb\xb5\xd3\xea\xf3\xaa\xd1\xf7\x8e\xf0\xcf\xf4\x8d\x5c\x55\xb2\xfd\x25\xdb\x15\x39\xd0\xf0\x2d\xae\x9f\x25\x14\x8a\x8d\x33\x8b\x97\x87\x9b\xbd\x39\xdf\x96\x1a\xa2\xc3\x96\x31\x5a\x2a\x86\xcc\x78\x35\x81\xe6\x7e\xa8\x44\xac\xfe\x86\x45\x42\x8a\x27\xb8\xd3\x2e\xa3\x06\x4e\x3b\xf6\x2d\xcf\x58\x01\x0e\xc4\x34\x88\x62\xfa\xc2\x5e\x3d\x9f\xcd\x4e\x5d\x65\xbe\x59\x90\x5d\x81\x6d\xfb\x96\x49\x92\xba\x7a\xce\xef\x8c\x20\x75\xa3\x12\xe5\xff\xc4\xf9\x53\x0e\xa2\x0f\x77\xf9\x3e\x81\xcf\x8a\x01\x9d\xc3\x94\x56\x34\x36\x4b\xab\xf7\x97\x72\x04\x5a\x0d\xba\xa7\x7c\x47\xa2\x2b\x77\x22\x3b\x70\x4d\xeb\xd2\xd0\x03\xf6\xa5\xc7\xbf\x6b\x19\xcd\x2c\x49\xb6\x14\xfd\x4d\x47\xfd\x25\x1f\xe6\x22\xcb\x98\x17\x85\xc1\x46\xbd\xb7\xc1\xd2\xea\x02\xb1\x16\x92\x3b\xf9\x8a\x1a\xfb\xb7\x85\x8a\xdf\x2d\xf9\x38\xa7\x90\xec\x1f\x90\x74\xad\xb8\xd1\xaf\xb5\x63\x3f\xa9\x61\xa8\x47\x64\x01\x0d\x3b\xde\xd1\xc0\x33\xd2\x5a\xbd\xb4\xb0\x0f\xb0\x5e\xd7\x64\x0f\xae\x61\x87\x9d\xf8\x8f\x0b\x09\xe3\xab\xd0\x57\xb9\xa5\x21\x08\xa9\xbc\x98\x5f\xb7\x3a\x5f\x29\xd8\x4d\x1c\xa6\x92\x1b\x62\xf1\xb7\x03\xc7\xee\xb4\x81\x5d\x9d\xd6\xd0\x66\x73\x8d\xb1\x18\xba\xf6\x1b\x04\x22\xf3\x88\xf1\xbf\xc9\xe3\xa9\xbe\xd8\x3a\x1a\x72\x7d\xcc\x26\x6a\x99\x88\x36\x48\x46\x80\x7f\x4d\x55\x18\xbc\x2e\xdd\x0e\xcb\x34\x13\xc2\x6f\xd0\xc7\x9b\x75\xd8\xcb\x5b\xcd\x85\xc0\x6f\xcc\xea\x4d\x03\xfb\x89\x88\xdf\xf3\xed\x0c\xc9\xdb\xae\x78\xd6\xae\x8d\x5f\xc4\x02\x46\x17\xa2\x3f\x52\xbd\x61\x53\x85\xd4\xee\xe0\x8f\x91\x34\xeb\x3b\x25\x0c\x8f\x82\x2b\x47\xd9\x1e\x8c\x4d\x4c\x29\x29\x80\x16\xe6\xfc\x81\xf1\xf1\x09\x92\x53\xd7\x94\x5e\x07\x98\x95\x5d\xa0\xdd\xe1\x4e\xbb\x93\x4e\xcf\xae\xea\xba\xe8\x78\x83\xe1\xcc\x39\x80\x67\x40\x0f\xe4\x62\xa2\xc4\xe9\xf2\x32\xdb\x5c\xdd\x61\xeb\xa9\x49\x18\x8c\xf0\x1b\x23\x8b\xe7\xad\xa9\x38\xf0\x02\xdc\x3a\xe3\x1f\xdf\xd4\x25\xc8\xd4\x6e\xa0\x32\x32\x3a\xaf\x20\xdd\x3d\xe2\x50\x7d\x36\xbb\x45\xfb\xb9\x1c\x40\x96\x9a\x9e\x5d\xa2\x0f\x7f\x93\x6b\x0f\x4b\x13\x7b\x62\xfe\x2b\xa3\xa6\x67\xbc\x03\x62\xd9\x3f\xc5\x0d\x3f\x22\x95\xe1\x67\xfc\xba\xb0\xfb\x3a\x39\xb7\xcb\x02\x4b\x57\x8f\x94\x90\xf7\x34\xb2\x8c\x9c\xcf\x71\x92\xf1\x83\x94\x7d\x5a\x51\x3e\xfa\x49\x16\xe4\xd8\x2b\x2a\xb4\xba\x7e\xc2\xff\xba\x21\x3c\xe8\x2a\xd6\xed\x3b\x10\xe4\x85\x53\xe7\x33\xc9\x40\xaa\x9b\x9c\xe7\x13\x37\xc6\xc2\x80\x5d\xfb\x8d\xd6\x61\x8b\x6d\x40\x90\xa3\xd6\xcc\x96\x3e\xce\xa2\x6d\x1c\xdc\x2b\xf5\xac\x99\x9c\x11\x27\x61\x68\xa9\x31\xd8\x16\x46\x9d\x79\x08\x3c\x24\x08\x1a\x50\xdc\xbd\x22\x27\x52\x38\x52\x67\xce\x1b\xfc\x1d\xb7\x6b\x15\x54\xad\x57\xe3\x47\x52\xb7\xf8\x98\x31\x47\xc1\x16\xd4\xa3\xfa\xe6\xf6\xd5\x7e\x65\x4f\xed\xd7\x37\x8d\x2b\x49\x89\xea"}, -{{0xb1,0xf5,0x9e,0x3c,0x23,0x80,0xd7,0xaa,0x41,0x4d,0x0b,0xf9,0x08,0x93,0xa3,0x8d,0xdd,0xfc,0x29,0x38,0x59,0x30,0x3d,0x16,0xf0,0x0d,0x9e,0xae,0x6c,0xb3,0x45,0x0e,},{0x84,0xe3,0xf5,0xf7,0x2f,0x19,0x09,0x5b,0x0f,0x53,0x38,0x48,0xa5,0xa9,0x1d,0x0f,0x07,0x43,0xb8,0xe3,0xa3,0xe2,0xf5,0x2f,0xcb,0xd7,0xeb,0xe7,0xc5,0xb5,0xa9,0x98,},{0x60,0xaf,0xc1,0xe9,0x91,0xfd,0xd2,0x7c,0xc4,0x72,0xb9,0xac,0xc9,0xd4,0x05,0xb4,0xd2,0xb9,0x13,0x08,0x92,0x90,0xb3,0x11,0xc4,0xfa,0x89,0x1a,0xe2,0xee,0xa0,0x56,0x71,0xfd,0xe7,0xa0,0xef,0x86,0x55,0x7b,0xd8,0x67,0xd1,0xc0,0xb7,0x47,0xca,0xf3,0x52,0x29,0xd6,0xef,0x52,0x8f,0xe3,0xe0,0xd0,0xbc,0xf6,0x30,0x38,0x0e,0xa9,0x0e,},"\xc6\x17\x4c\x9a\xd3\x68\x5d\xd6\x48\x63\x60\x17\x83\x7b\x8d\x99\x22\x00\x31\x9e\x9a\x5a\x0d\x26\xd9\x4d\x2d\xa7\x5e\x2c\x3a\xff\x46\xf4\x2d\x7b\x3a\xba\x47\x2b\x7f\x86\x0b\x0f\xe1\xf6\x95\x52\x97\x31\xfd\xc8\xcf\x0d\xa7\x05\xd1\xd0\x9a\xca\xd0\x4f\x01\x08\x37\xec\xef\x41\x9d\x57\xe9\xea\x6c\xac\xf1\x68\xc5\x21\x56\x96\xf4\x71\xf3\xca\xa8\x97\x60\x7c\x62\x9d\x44\x3d\xe0\x99\xd3\x17\x53\xc2\x46\x77\xd8\xd7\x5f\x4b\xf1\x72\x46\x81\x8b\x58\xad\xc0\x42\x4b\x76\x2a\x19\x1e\xf3\x9a\x70\x76\xa5\xad\x12\x61\x4c\xf5\x4c\x47\xeb\x09\x08\xbb\x86\x65\x18\xc5\xfa\xc1\xca\x2d\x2e\x5b\x65\x75\x20\xa2\xb3\x69\x5c\x6f\xb3\x60\xf1\x6f\x4a\xb3\x57\x99\x8e\x4c\x0e\x97\x23\x1d\x6f\x89\xc9\x68\xdc\x29\xec\xc1\xaa\x91\xfa\x0d\x75\x43\xb5\xd2\x24\x7b\x0d\x85\xe4\x87\x43\xab\x7c\xc8\x15\xcf\xda\xa8\x2b\xf6\x8c\xa6\xd3\xe2\x25\x0b\xfd\xa2\x70\x24\xd6\x1b\x47\x4c\x6b\x81\x54\xac\x8d\x1b\x5a\x36\x20\x97\x82\x51\x5c\x16\x46\x68\x0d\x37\x06\x9b\x8b\x44\x12\xf9\x51\xb0\x25\xa4\xd5\x43\x62\x5d\xd0\x22\x90\xbf\x03\xc6\x73\x46\x13\xf9\x9b\x7a\x4c\x3a\xf5\xc5\xf9\xe9\xac\x34\x74\x46\x5e\x64\x84\x23\x01\x8d\x40\xa6\xad\xbe\x88\xa3\x30\x1d\x3d\x25\x9b\x04\xee\x44\xcc\x05\x62\xee\x0d\xed\x4f\x5e\x26\xad\x97\x7a\xb5\x63\x1f\x85\x76\x8d\xbc\xe5\x3f\x61\x6c\x02\x9a\x8b\x8f\x93\x3e\x2a\x92\x64\xb1\xc8\x1f\x51\x7e\x9f\xf5\x8a\xb9\xf4\x5a\x23\xee\xed\x42\x04\x35\x8f\x8f\xff\x0c\x8f\x97\x5e\xf1\xdf\xa5\x77\x6a\x5f\x77\x93\xba\xe2\xf2\x81\xd7\xb0\xcb\xef\x24\x0b\x3f\xc6\xbe\x05\x88\x21\xea\x2b\x80\x0f\xff\xe5\x5a\x7d\xe0\xaf\xc9\x3e\xde\x9c\x60\xc8\xde\x00\x5a\xbb\x9a\x2c\x88\xf4\xe6\x1e\x8d\xeb\x31\x70\xf1\x07\x8a\x36\xe2\xd8\xf2\xa5\x82\x39\xbd\xee\x49\x6e\x90\xd1\x37\xd2\x11\x0f\x0a\xd8\x57\xa8\x8b\x35\x27\x66\x4f\x78\x19\x39\xe0\xb2\xf7\x66\x34\xff\x9f\x6c\x57\xe1\xc4\x3f\x58\x24\x31\x71\xcd\x86\x2e\xf4\x28\x45\x76\x17\x2a\xf1\xf6\xc3\xbd\x37\xd5\xd7\x4b\x28\xa7\xa9\x86\x98\xbd\x74\xe5\x7b\xbc\x14\x2e\x67\xf7\x03\xf9\xd6\x2c\xde\x76\x1a\x02\x26\x8f\xec\xb3\x43\xfc\x01\x41\x88\x36\x41\x4f\x12\x22\xca\x24\xbc\xdd\x69\xd0\x05\x90\x1d\xa2\xa0\xf9\x44\x65\xe4\xd4\xba\x68\x89\x88\x16\xbf\x7e\x3e\x4b\xb7\x9c\x8c\xa5\x99\x7f\xba\x9a\x8d\xf8\x4f\xaa\x2d\x24\xb0\x44\xc4\xea\x61\x02\x9a\x46\xcb\xa7\x03\x42\x1e\x36\x1d\xfa\x52\xca\xaf\xf3\xbb\xaa\xb7\xfd\x75\x3f\x28\x56\xd7\xc0\x83\xae\xb9\x76\x8d\xa1\x1d\x82\x1e\x2d\x30\x9f\x7a\x73\x5c\x39\x96\x92\xda\xc2\xf2\x62\x84\x6b\x89\x1b\xf6\x46\x1a\xf2\x3c\x8c\x7c\xe1\xd4\xd9\x03\x2c\x3c\x14\x0f\x73\x9e\x55\x84\xc3\x6f\x05\xea\xf4\x34\x9f\xf4\x54\x5f\x28\x3a\x4e\x0f\xea\x49\x43\x0a\x1b\x18\x0d\x08\x71\xe3\x74\x2b\x88\xcc\xb5\x91\x12\x4f\xc4\x27\xed\x67\x3b\x5f\x27\xb0\xb0\xa6\xf5\x4a\xf2\x2b\xa4\xa6\xd1\xc6\xc1\xdb\x2a\x1f\xca\xa6\xd8\xa0\x30\x8b\x77\xef\x2d\x0c\x61\xbb\xf5\x1b\x95\xf1\xe8\xb6\xab\xc5\x04\x1d\x97\xb6\xb6\xf1\xb5\x69\xb3\xf6\x3c\xec\x05\xcb\x56\x7a\xae\xa1\x06\x72\x70\x96\xee\x8a\x9e\xa8\x7b\x88\x04\x90\x1f\x7e\x88\xa7\x40\x9c\x66\xf1\x52\xde\x9d\xbf\xcb\xe3\x19\x52\xe6\xfd\x83\xb2\x87\x7a\x77\x5f\xae\x42\x5b\x38\x51\xe0\xef\xf8\x79\x2f\xfb\x38\x48\xf8\x4a\x65\xcc\x31\x72\x53\xb2\x72\x47\x5e\x71\x7e\x49\xe9\xc6\xff\x6b\x78\x59\xd1\x1b\xba\x7c\x44\x28\xc8\x2d\x17\x89\xe0\xdc\xa5\xbc\xad\xca\x2f\xdb\x25\x9e\x98"}, -{{0xdb,0x46,0x1b,0x9f,0x70,0x7e,0xb2,0xcd,0x77,0x48,0xc4,0x4c,0x99,0x56,0x2f,0x13,0x02,0x39,0x74,0x89,0x35,0x3d,0xf5,0xf3,0x03,0x79,0x7f,0xe0,0xd0,0xb5,0x8d,0xe1,},{0x63,0x51,0x16,0xda,0x8b,0xa5,0xa3,0x6a,0x37,0x77,0x28,0xe2,0x86,0x18,0xe7,0x5c,0x55,0x92,0xae,0xcc,0x18,0xe3,0x40,0x11,0xc4,0xc4,0x25,0x91,0x97,0x0b,0x73,0x66,},{0xdd,0x04,0x9c,0xa7,0x9b,0xeb,0x9e,0xac,0x32,0x5a,0xcf,0x44,0x67,0x2f,0xf5,0x78,0xa9,0x68,0x50,0x2f,0xe1,0xbc,0xf5,0xea,0x19,0xd5,0x2c,0x0f,0x67,0x78,0xc7,0xf1,0xc7,0xbb,0xf7,0x42,0x74,0x79,0x07,0x78,0x6e,0x60,0x81,0x23,0x91,0x1a,0x92,0x07,0x78,0xd2,0xf9,0x59,0x6f,0xe2,0x9b,0xe7,0xcc,0x28,0xfd,0x00,0x9d,0x7c,0x44,0x0e,},"\x1a\x2a\xc8\xc1\xb9\xea\x09\x9b\x83\x1a\x68\x12\xd2\xb4\x26\x13\x09\x05\x8e\xa5\x88\x3d\x70\xb1\xc6\x07\xb9\xcd\x3f\xdf\xdb\x86\xe7\x99\x02\xb0\xfe\x89\xe8\x0e\xa7\xc4\x78\x20\x76\x74\xb2\xd8\x03\xb0\xb9\xca\x14\x7f\xfe\x62\xe5\x94\xf5\x06\xc7\x96\xd6\x89\x97\xce\x48\x2b\x51\xa4\x6e\x49\xb4\xa5\xd8\x58\xcd\xea\xe2\xc6\xec\x9b\x69\x41\x98\xe6\x82\x2f\x0e\x33\xed\x57\xbe\xdb\x03\x35\xc7\x89\x0a\x72\xa7\xee\x3c\x23\x82\x3b\xe7\x9b\x7f\x94\x71\xe0\x33\xc7\x9a\xee\xd5\x2e\x57\x60\xfb\x0c\xcb\xb9\xd3\x8f\xde\xd8\xb4\x73\x83\xc1\x91\x03\xce\x44\x70\x58\x34\xc5\x9d\xdd\x86\xf7\x03\x39\x48\x61\x2d\x66\x62\xf5\x16\xce\x4e\x39\x9f\xf2\x03\x63\xcc\x72\x81\xa6\x9b\x2d\x5c\x30\x7b\x10\xb7\x04\x15\x01\x84\xec\xe3\x2f\x39\x0d\x77\x2c\xcf\xa7\x84\x83\xbb\x77\xa9\xfb\xa8\x44\x25\x36\x69\x84\x17\x1c\xc2\xbb\x60\xb0\xec\x6c\x62\x8d\x4e\x90\x30\x74\x6d\xac\x1c\xab\xca\x60\xf0\x56\x83\x81\x33\x46\xa1\xa5\xbc\x14\x72\x75\x49\x79\x5c\x1c\x92\x68\x69\xe1\xaa\x25\x09\x3d\x59\x1b\x43\xe0\x86\xe4\x3a\x04\xd1\x70\xd9\x42\xc4\x16\x5e\x1c\x5c\xe7\x6c\x3e\x64\x97\x3d\x91\x36\xf9\x32\x5b\xee\x82\x16\x82\xf1\x04\x3e\x95\x1b\x02\x76\x7f\x3f\xb4\x58\xd0\x24\x49\xad\xd3\xe8\xa6\x6e\x51\x6f\xdb\x1e\xd5\x80\xe0\x56\xe0\xf7\x8e\xe3\x3f\xd9\xee\x32\x80\x91\x2f\xae\x07\xfe\x1e\xa0\x25\x27\xcd\x00\x1d\x6f\x6f\x2f\x89\xee\x64\x9f\x51\x74\x14\xd5\x6f\x57\x35\x9a\x84\x68\x91\xf0\x22\x2c\x32\x1d\x7e\x70\x81\x79\x95\xa8\xcd\x8e\x94\x76\x0b\x6e\x74\x83\x2b\xab\x68\xd5\x5b\xc4\x64\x18\x84\x22\x1f\xd2\x9f\x12\x2d\x87\xa9\xa8\x68\xb6\xa6\x06\x0c\x87\xb2\x38\x2c\xf7\xbb\xdd\xa4\xcd\x6a\xaa\x1b\xbc\x8e\x6d\x63\x4a\xb5\x80\xc8\x65\xf5\xad\xd6\xa1\xd5\x4e\x61\xa6\x07\xdc\x2c\x37\xb0\x8a\x8c\xba\x6e\x61\x0c\x12\xcf\xeb\xef\x9c\x98\x9e\xef\x3b\x78\x2a\xcb\xd1\xbc\xec\x5f\x04\xe8\x35\xca\x10\x12\x98\xb5\xe9\xbd\xd8\x81\x3a\x71\xb0\xd4\x69\xfc\xf1\x27\x27\xd3\xde\x1c\x3f\x97\xdd\xbc\x6a\xb2\x65\x84\x40\xdd\x64\x21\x01\x9b\xc6\x8f\x35\x6d\x6f\x25\x53\x68\x65\x85\x1d\x92\xd9\x0f\xe9\x96\x9c\x3b\x7c\x35\xa2\xe8\x8c\xe1\x53\x47\x6e\xc3\x97\x3a\xf9\x35\x9f\x16\x77\xa4\xca\xf1\xcc\x48\x1c\x71\xbd\x90\x22\x8f\xf5\xfc\x6d\xd8\x3b\x8a\x69\x9f\xfe\x51\x49\x29\xf5\xc9\x5c\xb4\xf0\x4b\x00\xdd\x18\xa2\x87\x2c\x41\x86\x8d\x3b\xeb\x76\x49\x8d\xdc\x92\x34\xb6\x3f\x59\x9d\x70\x71\x80\x1d\xb2\xc2\x87\x8f\x7b\xef\x4f\xfd\xdd\x81\x32\x26\xf0\x6d\xb8\x4e\xb3\x02\x17\xa7\x18\x30\x82\xe3\xc1\x24\x2b\xb6\xd0\x1c\xd3\xa6\xce\x27\xbf\xf1\x6b\xfb\xfd\xd7\x5b\x7e\x51\x04\x31\x2c\x49\xc4\x3a\xad\xfc\xd5\xb4\xed\xba\x0f\xf5\x0d\x28\x90\xca\x3c\xd9\xcc\xa3\x3e\x4f\xc6\x94\xc0\x57\xc4\x7e\xbe\x1c\x20\xa4\xad\x11\x5f\x98\x5d\xc7\x44\x2c\x6f\x6d\xa7\xbe\x53\x0b\x69\x02\x28\x9c\xab\x9c\xa1\x39\xc6\xb2\x4c\xb8\x0f\xfd\xd7\x82\x32\x4e\x60\x2c\x45\x91\x0d\xb6\x3d\x8b\x5c\x44\xca\x29\xd2\x7f\x56\xdb\xf0\x01\x86\xba\x58\x3c\x34\xe1\x60\x31\xdf\x35\x75\x46\xb3\xab\x9a\x3d\xd6\x5e\x91\xd7\x12\x8c\x93\x91\x95\xe6\x46\xa0\xf0\xb8\x9b\xf5\xdf\x04\xba\x23\x3d\x6a\x12\xa2\x71\xf7\xe0\x4a\xa4\x5c\xda\x99\xb4\xa5\x5a\x21\xcb\xbb\x73\x85\x15\xe3\x2c\x56\xaa\xc2\x49\x62\x32\xb1\x00\x8a\x67\x61\xc8\x04\x5a\x1f\xe0\xf9\xa3\x64\x40\x47\xb5\x96\x6a\x58\xa6\x00\x46\x6c\x1b\x1d\x11\xdd\xad\x5a\xa5\x73\xc4\x3e\xbd\xa8\x87\xe1\x6a\x05"}, -{{0xf5,0xc0,0xa7,0xf8,0xf6,0x58,0x4c,0x5d,0x2f,0x2e,0x1d,0x08,0x10,0xe8,0xe8,0x61,0x03,0xe4,0xe2,0xd4,0x5c,0xf9,0xa7,0x21,0xd8,0xc4,0x7f,0x67,0x49,0x33,0x96,0xa4,},{0x3c,0x6d,0x6c,0xce,0x49,0x63,0x31,0x41,0x07,0x86,0x96,0x13,0x1a,0x8d,0x84,0xed,0x82,0x3f,0x30,0x66,0x4b,0x28,0x9a,0xf9,0xdd,0x30,0xc6,0x40,0x7f,0x6f,0x03,0x13,},{0xd4,0xc3,0x0a,0x48,0xc4,0x52,0x3b,0x1f,0x84,0xb1,0x4b,0x65,0x7a,0xf8,0xf8,0x59,0x75,0x5b,0xba,0x63,0x59,0x98,0x8b,0x67,0x5c,0x6d,0x85,0xdd,0xf3,0x54,0x62,0x82,0x0d,0xa4,0x76,0xd8,0x4f,0x6c,0x40,0x2e,0x65,0xb0,0x20,0xd9,0xe8,0xa2,0xc2,0x85,0xc1,0x67,0x08,0xae,0x58,0xd1,0xf8,0xdb,0xc6,0x57,0x82,0xa8,0x98,0xa6,0x65,0x08,},"\xd6\x8a\xbc\x60\x9a\x7a\x0c\xe2\x56\x69\x9e\xb1\x70\x43\xde\xfe\x1e\xb8\x22\xc9\x70\x8f\x65\x71\x8a\x06\x58\x1f\xab\x21\x10\xec\x2d\xb0\x92\x13\xbb\x9e\x0f\x36\x12\xce\x4a\x3f\x8f\xdb\xe7\x57\xa9\xf0\xeb\x2c\x3e\xba\x43\x8a\x90\x88\xb1\x8f\x6c\x5c\xaa\xbb\xe5\xc8\x2f\x7a\x9a\xb2\xfe\xcf\x0f\x58\x59\xd1\x75\xe1\x39\x26\x30\x33\x74\x24\x58\xf8\x2a\x6f\x38\x75\x6c\xd5\xbc\xdf\x9e\x07\x36\xdb\x2c\xab\x20\xa0\xcd\x3f\x0f\x1c\xdb\xea\x85\x56\xd8\x49\x09\x35\x8d\xd8\xf6\x9f\x0d\xac\xd4\x9a\xbf\x8a\xc1\xbf\xe7\x59\x40\xd6\x93\x9e\x6a\x55\x38\x5b\x5a\xce\x7c\xe1\xfd\xe1\x20\x67\x9a\xb6\xea\x7a\x89\xd1\x42\x68\xd2\x9f\xfb\x46\xdf\x10\x5b\xf3\x90\x92\x42\xc6\x60\x5f\x3e\x3e\x2a\xb7\x44\x89\x37\xd6\xdb\x2b\xa0\x54\xc7\xb1\x4f\x43\x2d\xb4\x1d\xc1\x8a\x5b\x95\x73\x36\xb7\xf5\x2d\x97\x8e\xc0\x3e\x7d\x57\x64\xe9\xbd\x2f\x4b\x68\x95\x8d\x93\x7b\xf2\x98\x23\xb2\x7e\xfb\x31\xe2\x5b\x43\x92\x5c\x4d\xac\xbe\x67\x18\xa6\x0f\xea\x3b\x32\x70\xe7\xb7\x6b\x0d\xe0\xe7\x0f\x7f\xa3\xc1\x2c\x21\x5e\xf7\x2b\x95\xdc\x1b\x52\x76\x23\x81\x79\xdf\xc5\x2f\xc4\x88\x59\x64\x9f\xa5\x82\xd0\x5a\x60\xdf\x68\x59\x9a\x1c\xee\xa6\x4f\x64\x12\xd3\xf8\x49\x8a\xe2\xce\xdb\x12\x42\x45\x88\x3a\x24\x0b\xc0\x85\x1f\x0e\x32\x49\x65\xbe\x12\x04\x86\xe1\xea\x89\xa0\x18\x2d\xfa\x8e\xab\xd3\xb8\xfa\x66\xa9\x9c\x51\x49\x13\x89\xf3\xc8\x3a\x3c\xdb\x42\x67\xf3\xe4\xdb\xc9\x8f\x0c\x44\x85\x6b\x04\x4d\xc8\x8d\x90\xee\xee\x84\x15\xbf\x73\xde\x17\x1a\xfe\x84\xbe\x90\x35\xe0\xdc\x4c\x80\xcf\x04\x22\x46\x9f\xe0\xc9\xbd\x1c\x6a\xa6\x54\xa5\x9b\x5e\x34\xee\xd3\x51\xcd\xa2\x87\x12\x69\xac\x47\x8e\x8d\x38\x2e\x74\x0e\x9a\xc7\xab\x4d\xdc\x4c\x0d\xef\x0a\xea\xb7\x97\xb6\xf1\xa4\x27\xb8\xe4\xa8\x49\x7a\x0b\x97\x97\xda\xdc\xd3\x5c\x41\x4f\xd5\x5b\x78\x31\x30\xf6\xcd\xed\x38\xa4\x4c\x1a\x89\x28\x83\x07\xeb\x84\x25\x48\x41\x37\xa8\xae\xdb\x03\x0d\x54\xb6\x16\xa8\x2e\x3c\x5a\xcf\xfb\x08\xd6\xcc\x1a\x61\x74\x5c\x29\xaf\xc6\x8a\x0c\x18\x38\xb1\x39\x15\x9c\x5f\xa6\x67\x4d\x66\xb9\xe3\x38\x11\x5a\xad\x4b\x1b\x47\x10\xaa\x5d\x95\x17\xbc\xf7\xe1\xcb\x12\xd4\xe6\xa5\x1c\x11\x78\x9f\xdc\xae\x9d\x9b\xbe\x78\xf6\x9a\x33\xe5\x2d\xf1\x83\x3c\x87\x6b\x02\x68\x7a\x40\x4f\xac\xad\x32\x84\x1c\xb2\xd5\x25\x54\xe7\xb8\xe2\x20\x9e\x3f\x88\xfd\x94\x8c\x1e\xcf\x83\x95\x7c\x96\xf4\x3b\x03\x4b\xed\xa6\xc4\x76\x09\x6b\xcb\x09\x30\x1a\xd6\x1f\x83\x67\xcc\x43\xe1\x56\x13\x18\x62\xb4\x2e\xce\x28\x5b\xec\x2d\xcc\x2d\x02\xd0\x94\xd0\x42\xa1\x60\x72\xeb\x22\xab\x98\x88\x01\x3b\xe8\x23\x71\x56\x94\x00\xec\x1f\x8e\xc7\xe7\x91\x08\xc4\x1b\x85\x33\x65\x26\x8f\xa4\xcf\xbc\x62\xc4\xac\x12\xcc\x98\xd2\xec\x38\xa8\x7d\x60\x85\x85\x95\x67\xc0\xf2\x7d\x6d\x43\x1a\x04\x6e\x88\xa9\x81\x55\x58\x66\x07\x05\xfd\x05\xeb\x06\xc6\xc0\x5e\x5b\x7d\x62\x34\x7c\xee\xe2\x7d\xff\xed\x71\x41\x54\x0d\x60\x8c\xb9\x75\x07\x5a\x96\x44\xac\xc6\x32\x84\x39\xf9\xfa\x68\x2b\x22\x6b\x18\x61\x54\x54\x90\x11\xc3\xb0\xf0\xff\x4f\x74\xca\xa7\x1c\x19\x44\xe4\xcb\x83\x6c\xe8\x51\xd9\xb5\xd9\xe7\x27\xc5\x53\xe3\xc7\x23\xcf\x98\xc2\x73\xe5\x67\x5c\xab\x89\x9b\xb6\x6f\x46\x33\xa7\x6d\xea\x35\x73\x41\xf9\x83\xc5\x3d\x91\x58\xad\x31\x9a\xda\x75\x40\x8b\x41\xc0\x6f\x26\xb7\x43\x5b\x80\xdc\x3b\xc0\xaa\xf2\x2a\x83\x3d\xde\xdc\xd6\x78\x5c\x87\xd1\x96\xb0\xaf\x2c\x9a\x43\xd1"}, -{{0x1a,0xb9,0x46,0xc0,0xc1,0xae,0xbf,0x9c,0xa3,0x7c,0x2f,0x4e,0x2a,0x4b,0x33,0x7d,0x5b,0x1e,0xbc,0xcd,0x24,0x73,0x4c,0x9c,0xb2,0xa1,0x60,0x8c,0x88,0x1e,0x57,0x57,},{0x9a,0xfc,0x63,0xdf,0xce,0x0d,0x48,0x9b,0x40,0x90,0x7a,0xee,0xd6,0xdf,0xfe,0x4c,0xd8,0xef,0x5a,0x6f,0xfa,0x22,0x98,0x95,0x56,0x44,0x5c,0xbf,0x9b,0x35,0x19,0xc2,},{0xbf,0xab,0xde,0xa4,0x18,0x10,0xa5,0x3f,0x8e,0x52,0x7a,0xcd,0x66,0xec,0x10,0x6c,0xe2,0xae,0x1a,0x67,0xff,0x6a,0x9b,0x52,0x2e,0x0f,0x08,0xfb,0xbf,0x12,0x52,0x68,0x2c,0xb3,0xa1,0xdc,0xc8,0x75,0x60,0x19,0x44,0xcb,0x88,0x00,0x0f,0x72,0xe1,0x39,0x07,0x00,0x79,0x03,0xa7,0x7c,0xd0,0xdb,0x03,0x16,0xd4,0x19,0xac,0x38,0xc2,0x04,},"\x9b\xb0\x71\xb6\x2c\x04\x06\x4b\x0c\x96\xe2\x43\xdd\x19\x8c\x39\x71\x7b\x25\xc9\x94\x48\xc2\xc0\x02\xb8\x4a\x99\x20\x4c\x5a\x6e\x23\xb4\xb9\x12\x02\x86\x75\xbf\xdc\x4d\xf9\x3c\x5b\x2f\xb8\x08\x81\xa2\x3e\x0d\x44\xba\x18\xbd\xe9\x91\x21\xee\xe8\x6a\xdc\x6f\x84\x28\x19\xd6\xeb\xc7\xa2\x88\x99\x2d\xa3\x28\x58\x05\xa8\xb8\xb6\xfb\xcd\x22\x67\xb6\x86\xb3\xe1\xbf\x79\x60\xb4\x5f\x24\x4f\x85\x2e\x82\x49\x29\x44\xe3\xd6\x18\xbc\xc4\x51\x4c\x17\xf7\x22\xba\x49\xac\xa7\xf2\xf3\xbb\x4e\x91\xf9\x40\xe9\xce\xf0\x15\x65\x0c\x3e\x40\xb0\xc8\x55\xa1\x7c\x42\xf1\x1e\x3a\x34\xac\xc8\x52\x87\xdb\xe0\xf9\x09\x3c\x00\x37\x3d\x50\xc0\xb3\x06\x4a\x5a\x5f\x2b\x1e\x89\x20\x65\x17\x52\x82\x95\xfd\x87\x17\x03\xa8\xe7\x62\xb5\xe7\x6f\xb9\xb7\x47\x3d\x21\x49\xb8\x5b\x94\x61\xf5\x58\x7e\xd7\xe7\xfc\x8b\x50\xaa\x09\x87\x6d\xee\xb6\xe2\x37\x07\x85\x02\x14\x2c\xec\x6b\xdd\xc7\x01\x40\xfe\x1d\x1f\x16\x58\xd5\xd3\xe9\x10\xfd\x70\x36\xa2\xf9\x24\xb4\x99\xdb\x17\x56\xf7\xc8\xce\x0d\x5f\x0d\x04\x5b\x39\xbc\x81\xc5\xc2\xf1\xa7\x61\xf5\x2f\xf3\x93\xe0\x64\x9b\x8d\xb0\xbd\x88\x54\xbd\x02\x6b\xe2\xc7\xc3\xcd\x63\x52\x6b\xa5\xa8\x0d\x48\x33\x5f\x03\x38\x32\xd6\x33\x76\x07\x1b\x63\x08\xf0\x59\x60\xcb\x3f\xc9\xfa\xc9\x32\xed\xd8\x37\x6d\xae\x51\xf2\xc6\x61\xf7\x5b\x7c\x6f\x4a\xc8\x56\x75\x3a\xca\x62\x06\x28\x77\x60\x9f\xc4\xa0\xff\x60\x67\x02\x82\xc0\x5e\x88\x2d\x1a\x03\x5b\xf9\x89\x0c\xab\x29\x6a\xc7\xa8\xdf\x24\x4c\x56\xf4\x90\x25\x0f\x02\x00\x54\xb8\xaf\x51\xbe\x4f\xc3\x18\xbe\xba\x50\x62\x32\xbf\x45\xe1\x7f\x5c\x74\x0c\xf0\x9d\x37\x51\x5a\x8b\xc8\x94\xbc\x95\x5c\x8a\x46\x08\x77\xc7\x85\x4f\x8b\xe3\x63\xb2\x19\x33\xe1\x62\x87\xae\x0c\xb7\x0f\x22\x2d\x4e\x36\xb8\xb4\x24\x97\x55\x59\xbb\x4b\xfc\x8d\xd1\xd5\x1b\x3c\x0f\xaf\x4a\x53\xe3\x02\x19\x6f\x9f\xed\xb5\x32\x87\xd0\x93\x15\xdf\xff\xa2\xbc\x4b\x3a\xcf\xf1\x37\xf9\xa7\x6d\x68\x56\x21\x7f\x79\xcb\xb2\x54\x33\xfc\x97\x89\x9f\xd6\x54\x0f\x18\x08\x8e\x84\x41\x7e\x48\x33\xe4\xa9\x1a\xab\xa4\x65\x8a\xe9\xad\x7f\x76\x0d\xd9\xc5\xb7\x19\x1a\x0d\x3c\x05\x54\x1b\x83\xc0\x25\xa7\x99\x21\x38\xe6\xd1\x08\x0d\xa1\x4c\x2c\x88\x7c\x6d\x67\x0a\xab\x37\x4d\x43\x6c\x27\x2f\x9e\x96\xf8\x5a\x9c\x42\x33\x79\xc0\xd4\x7c\x46\xdf\x6d\xe3\x34\xea\x20\x57\x15\x8d\x33\x23\x1e\x14\x26\xa6\x6d\x3c\x70\x82\x7a\xad\x55\x11\xb8\x46\xe0\x3b\x94\x92\x3d\x5f\x94\xba\xf1\xf8\xcf\x11\xa8\x61\x37\x3a\x5b\x80\xad\x5e\x31\x7e\xc2\xa5\x29\xe9\x4e\x63\x6c\xdc\x3a\xa2\x9e\x5d\xac\x20\x5a\x0c\x13\xf6\x8f\xb1\x98\xcf\x94\x56\xe6\x39\x0a\xea\xd4\xd9\x78\x2a\x10\x38\xf6\x47\x8d\x33\x9a\x81\xba\xe7\xaf\x2a\x04\x15\x1c\x2f\x22\xe8\xd3\x9f\xe0\x71\xe1\xa5\x21\x68\xd5\x7c\x84\xc3\x62\x93\x41\x3f\x8e\x6f\xf6\x93\x4f\x05\xe7\xef\xad\x6f\xa1\x20\xc8\xc1\xc3\x8a\xd1\x88\x6a\x3d\x00\xbf\xc3\x06\x45\x92\x03\xc0\x2c\xdf\x4f\x06\x65\x2b\xc8\xfa\x0e\x8b\x9c\xc7\x79\xd4\x3f\xbb\x78\x9e\x7d\xad\x5d\xc9\x9f\x41\xd4\xcc\x58\x8c\x1b\x65\x42\x6a\x4e\x77\x38\x9e\xdd\x04\x97\x75\x78\xf8\xf3\x16\xbc\xdd\x94\x61\xd6\x66\x47\x2c\xdd\x27\x6a\xa5\x69\x72\x1c\x65\x23\x22\x56\xba\x1c\xf0\xe7\xf5\xea\x55\x32\x17\x29\xbb\x0e\x03\x86\xa7\x7b\x86\x55\x32\x02\x46\x96\xed\xde\xf4\x85\xb7\xd7\xb2\x8c\x15\x73\xb9\x34\x7e\x41\x4d\x42\x61\x99\x54\x82\xe3\xb3\x12\xde\x13\x31\xf8\x4e\x75\x48\x60\x7a\x84"}, -{{0x04,0xbb,0x88,0x7a,0x8a,0x31,0x84,0xff,0xc7,0xea,0x09,0xc9,0xbc,0x7c,0x1f,0x7c,0x34,0x11,0x55,0x6a,0x7c,0x7c,0x39,0x8c,0xb8,0xb2,0xd9,0x8f,0xfd,0x9e,0xe8,0x66,},{0x6a,0xb1,0xe4,0xae,0x4a,0xa0,0xd3,0x89,0x89,0xae,0xef,0xa8,0x05,0xb5,0x78,0x80,0x6e,0x2e,0x97,0x1a,0xc7,0xac,0x05,0x40,0x99,0x58,0xbf,0xe6,0x00,0x71,0xf4,0xa7,},{0xcd,0x84,0xf5,0x5e,0x5e,0xf4,0x53,0x19,0x24,0xc5,0xa2,0x18,0x1e,0xc8,0x7a,0x64,0x54,0x13,0x88,0xc1,0x05,0x94,0x06,0xbc,0x07,0xd5,0x31,0x57,0xa1,0x68,0xe2,0x03,0xcc,0x8a,0xa0,0xf0,0x06,0x9d,0x53,0xff,0x58,0xa9,0x5b,0x8a,0x8c,0xaa,0xfd,0xad,0x26,0x36,0x3c,0x7d,0x0f,0x80,0x45,0xc4,0x35,0x9e,0x97,0xb4,0x36,0x02,0xc6,0x06,},"\xb7\xab\x0c\x81\x63\xf4\x78\xc6\xca\xbf\x2b\xbd\x7c\xa3\x7c\xb0\x24\x56\xd7\x6e\x52\x7e\xea\x1b\x0d\x26\xdb\x24\x2e\x37\x87\x76\x32\x98\x5a\x3e\x3c\xa4\x1b\x52\xe2\x1d\x79\x01\x7b\xff\x81\xee\x55\x1a\xd7\x2a\xf2\x77\xb4\x10\xe4\x2a\xf8\x22\xc6\x08\xcd\x69\xd0\x0b\xf4\x40\xb7\x5b\x78\x7a\x8c\x91\x5d\x70\xb6\xc6\x37\x6c\x3f\x67\xfa\x64\xd6\x12\xa1\xb4\x49\xa7\xe2\x13\x4d\x9c\x23\x23\x01\x57\xd5\x76\xe0\x6a\x66\xa8\x42\x2a\x61\x1e\x2a\x0f\x09\x72\x86\xc1\x99\xea\x2a\x16\x28\x61\x86\x4b\xd0\x35\x07\x6a\xb2\x0b\xba\xe2\xb4\x40\x8a\x2c\x64\x33\xcb\x23\x43\x3a\x88\x9f\xe6\x59\x8f\x47\xbe\x53\xbb\xd2\xc8\x0f\x07\xa8\xfc\xcb\x8a\xae\x51\x11\x61\xe6\x09\xda\x4d\x18\x0a\xce\xa5\x44\x81\x1e\x94\x49\xc5\xdc\x22\x50\xe3\xe5\xa0\xcd\x41\xda\x33\xa2\xda\x63\x2e\x60\x38\xbd\x86\xf1\x6d\x5b\x7c\x1b\xe4\x9f\xc6\xdb\x49\x90\x76\xca\x91\xf7\xaa\x02\x8f\xe3\x85\x29\x70\x0b\x21\xd0\x72\xd2\xb7\x5d\xcc\x8b\x43\x78\x1d\x4b\xc4\xd3\xbb\x58\x4d\x9d\xa0\x1c\x3e\xcc\x85\xb1\xe9\x3f\xce\x04\x5d\xad\xce\xea\x51\x06\x46\x8b\xdf\xe5\xf7\x0d\x66\xa4\xfa\xd6\x0e\x4f\xb8\x64\xec\x15\xea\x50\xf6\xcb\x79\x72\x23\xc8\xc7\x56\xf7\xa1\x93\x1a\x39\x46\x4e\xbb\xb9\x67\x9f\x6b\x01\x68\x7c\x17\x4e\xaa\x32\xb9\x68\xb9\xcf\xac\xe8\xc1\x67\x12\x0a\xa7\xbd\x02\x42\xf0\x03\xa0\xc3\x77\x70\x25\x51\xb3\x0d\xa2\x48\x8e\xb2\x94\x40\x52\x93\x4a\xef\x4b\xfe\x11\x5f\x0a\xb7\x40\x5a\x3d\x5f\xa9\xbd\x79\x6b\x37\x17\x42\xbc\x11\x4a\x9b\xf2\x8c\x5b\xd2\x56\x26\x29\x5c\xe2\x61\xa6\xa8\x3e\xf6\x0b\x77\xd2\xd3\x2d\xd7\x10\x5f\xc8\x36\x64\xaa\x89\x76\x5b\x3f\x81\x91\xee\xee\xd8\x78\xf2\xeb\xff\x2f\xb9\x76\x63\xa6\x18\x77\xc0\x93\x93\x3b\xbd\x07\x31\xe6\x37\x57\x57\x1b\x0e\x37\xca\xc9\x9e\xd0\x1f\xd2\x14\xcb\xd4\xfe\xb9\x77\xe8\x56\xe0\xa1\xa7\xef\x0c\x40\x8c\x20\xe0\xdd\xaf\x1f\xd8\xf0\x28\xcf\xa0\x8c\x85\x0f\xa7\x09\x0d\xca\x8c\xdd\xe0\xcb\x69\x03\xda\x18\xc6\x29\x0c\x66\xa1\xc0\xae\x0a\x08\x4b\xf2\x50\xc5\x1a\x9d\x03\x5e\x5b\x16\xec\x61\x66\x36\xaf\xb9\xb5\xbc\xe3\x6a\x77\x5f\xe2\x17\x5b\xcc\x2e\xe0\x72\x20\x83\x4e\xeb\x31\xca\xee\x50\xe9\xf8\x06\x3f\xb1\xfc\x84\x68\xae\x25\xe3\x96\x67\x89\xa6\xd8\xdf\xfe\x08\xa6\xf7\xa1\xe6\x72\x6f\x93\xae\x74\x82\xde\x02\x62\xbb\x1f\x8d\xe0\xc9\x5a\x99\xec\xb9\x56\x84\xd4\x4b\x3f\x1a\x33\x2a\x18\xd2\xcd\x3d\xcf\x25\x3c\x33\xd7\x35\x52\x2f\x79\x6b\x65\x1c\x9a\x63\x3a\x8e\xbe\x95\xd0\x2b\xc0\x46\x58\x25\xee\x54\x1a\x7d\x92\x7b\xb5\xb9\x0a\x6d\xb5\x49\x9f\x8d\x99\x3a\xb4\x04\xb1\x65\x0b\x75\xe7\x92\xa7\xc8\x34\xeb\x41\xf0\x47\x01\x38\xb0\xf5\x78\xa0\x4c\x9b\xa5\xad\x95\x0a\xc7\xc9\xb5\xd3\x28\xf3\x40\x8b\x64\x5a\xd9\xc6\xbf\x19\x6d\xd9\x61\x44\x55\x96\xbc\x78\xf2\x84\xb8\x91\x4b\x2a\x8c\xf9\xb7\xbd\x3a\x71\x6d\x8f\x14\x4b\xb6\xb1\x5d\x83\x10\x23\x71\x3b\x5e\x41\xfd\xa9\xb5\x87\xff\x9d\x6c\xc4\x3c\x08\xd3\x5a\x70\x7f\x49\x52\x83\xe1\xac\xe9\x60\x48\x7e\x7f\x02\xb7\x54\x3b\x68\xa7\x31\xa2\x9b\xf3\xbe\x14\xb6\xe9\xc3\x71\x74\xa9\xf4\x6f\x56\x11\x99\xdb\xd2\x7b\x46\xbf\xe6\x22\x43\xe0\xc1\x1c\x0e\xdf\x13\xb6\x4f\x41\x1c\x8e\x8e\xce\xd3\x5d\x84\x28\xf7\x9f\x10\xea\xcf\xfb\x72\x34\xe5\x46\x41\x3d\x1e\xb0\xfa\xd8\x8c\x0e\x93\x85\x93\xb4\x3b\x5e\xe0\xe4\x28\x5d\x4d\xdd\xf5\x29\x5d\xbf\x1a\x3d\xdb\xe9\xf4\x13\x4d\xd7\x6d\x3d\xe7\x04\x62\xc2\xf0\x4f\xe0\xae\xbd\xf5\x9a"}, -{{0x97,0x76,0xa4,0x67,0xfa,0x14,0x00,0x73,0x54,0x12,0xa7,0x9b,0x49,0x5f,0x9f,0xca,0x07,0x8c,0xe1,0xd8,0x7a,0x85,0x30,0xd8,0x5c,0x26,0x05,0x5d,0x3a,0x39,0x44,0x88,},{0xc7,0xdb,0xe0,0xe4,0x1c,0x0a,0x31,0xc0,0x94,0x27,0x93,0xff,0xd1,0x42,0xd8,0xb9,0x5c,0xc8,0x2e,0x5c,0xaa,0x92,0xa3,0x79,0xba,0x23,0xf6,0x44,0xed,0xf2,0x24,0xda,},{0xe1,0x31,0x7b,0xa2,0xa1,0x23,0xae,0x3b,0x29,0xe7,0xb6,0x0e,0x8e,0x93,0xbe,0xed,0xd7,0xa0,0x84,0x51,0xa0,0x13,0x69,0x5b,0x6d,0xcf,0x35,0x8e,0x40,0x34,0x02,0x6d,0xc7,0x40,0x37,0xaf,0xbd,0xd2,0x17,0xff,0x4b,0x14,0x8b,0x02,0x91,0x38,0xf4,0xbc,0xc8,0xf9,0x83,0x6a,0xbb,0xae,0x7e,0x62,0x76,0xe9,0xe7,0x69,0xdb,0xd8,0xf0,0x07,},"\xd7\x85\x53\xa1\xb7\x05\x5b\x58\xb2\x13\x10\x1b\x1c\x84\xc5\x3e\x16\x4e\x39\xc6\xe9\xd3\x6d\xb4\x3f\x30\xe1\x9e\x2a\x12\x5a\x9a\x67\x70\x9e\xaf\xef\x96\x4f\xa5\xba\xb7\x26\x1d\xdb\x3a\x8a\x01\x88\x45\x7d\xfb\xf5\x15\x9c\x40\xe5\x1d\xa8\x20\x84\x83\x24\x57\x81\xd7\x13\x1e\x23\xa8\xbe\xe5\xe5\x06\x33\x18\x16\xb9\xde\xee\xfe\x6e\x55\x6e\x3f\x0c\x95\xc6\x68\xd1\xbe\xdb\x7d\xa6\x35\x06\x54\x58\xad\x20\x46\x70\x12\xf5\x9f\x17\x13\x52\x06\x80\x20\xce\x3c\x75\x87\x86\x93\xf6\x43\x7b\xc4\xa0\x9f\x13\xb9\xb0\xf0\xcd\xda\xf1\x69\x1b\x87\x2f\x82\x00\x80\x93\xeb\xfb\xe2\x33\xd0\x31\x3e\x72\xc8\x63\x2d\x7d\x17\x93\xf0\xb8\x1c\x76\x88\xf5\x44\x70\x33\x0f\x04\xe6\x48\x60\xe6\x44\x6b\xfc\x6d\x96\xc8\x75\x69\xbf\x18\x2f\x0f\x43\x85\xaf\x48\x5d\x42\x99\xca\xc0\x4e\x06\xba\x47\x34\x65\x56\x6c\x47\x7f\x07\xb9\xdb\x27\x7a\xb4\xa9\xde\x2f\xb2\xde\xd0\xa5\x01\x1c\xd0\x6d\x67\x5c\x08\x00\xb3\x4f\x55\xbc\xf3\xec\x72\xd2\x1c\xa1\x50\xc8\xbf\x23\x61\x28\x7b\xe8\x1e\xfa\xbb\x96\xd8\x68\x8a\x1d\xee\x3f\x43\x0f\x06\xf6\x37\xdf\xd0\x6f\x15\x14\x64\xa0\x5c\x95\xf5\xfe\x76\xaf\x2e\x06\xd0\x12\x3f\x69\x48\xa2\x6b\x3b\xe8\x35\x04\x5a\xa2\x68\xcc\x1b\xe9\x76\x69\x71\x07\x77\x02\x08\xa7\x56\x8f\x02\x5c\x2d\x53\xc7\x19\xe5\x24\xcc\x36\x9d\x9b\x4a\x33\x7d\x8f\xd1\xef\x34\x5b\x9b\xca\x57\xfb\xd7\xb6\x5a\x6b\x99\x7c\xad\x3f\xce\x4c\xf0\x6f\x2c\xa4\x3e\xbe\x29\x86\xd0\x96\x82\xd4\x7c\x92\x2b\x2c\xb7\x56\x9d\x98\xde\x97\xa6\x16\x4f\x54\x70\xee\xc7\x1c\xed\xa5\x20\xcc\xec\x77\x32\xbd\x01\x68\x9e\xf8\x16\x56\xe9\xf6\xd0\xc5\x8a\x89\x55\x58\xae\xe8\x63\xf5\x46\x9e\x7a\xb9\x79\x15\xbf\xe0\xb8\x0a\x06\x4c\x65\x9b\x18\x30\x31\xf7\xf1\xa8\x6f\xb1\x1a\x9d\x52\x8c\x28\x15\xdc\xaa\x2f\x0d\xec\x3d\x21\xa8\x82\xe1\x06\xe2\x04\x93\xee\x0a\xcb\x77\x08\xea\xa2\x91\x25\x74\xae\x97\xbb\x28\x8b\x41\xfc\x09\x25\x05\x3a\x29\xb0\xbf\xbc\x0e\xba\xe8\xd6\x3c\xc0\xb4\x6e\x37\x38\x04\x6c\x5a\x20\x25\x30\xbc\xb1\x5b\x18\x7a\x72\x85\x4a\xa2\xd8\xa7\xa7\x6c\x89\xa8\x9a\x5d\xb4\x60\x32\x07\x4e\x1b\xd7\xde\x77\xef\x20\x65\xa0\x8f\x38\x9d\x78\x3c\xf7\x59\xeb\xd5\xa6\x3a\x44\xd9\x19\xf9\x48\xf5\x60\xc3\xe9\x4c\x42\x39\xe2\x74\xe0\x51\xa2\x04\x85\xa4\x30\xcb\xd5\x29\xf3\x13\xd9\xf7\xed\x67\x9a\x34\x18\x7b\x24\xf8\x41\x30\x87\xa9\x02\x1e\x47\x31\x73\x0f\x5f\x46\x1f\xc5\xaa\xd6\x65\x4d\xfa\x1c\x05\x04\xd2\x61\x24\x70\x7e\x63\xee\x57\xf9\x31\xb2\x78\x59\x08\xf8\x6b\x10\x4b\x3e\xcb\x96\x00\x02\x51\xd0\x6c\xe1\xfa\x45\xe4\xcd\x6d\xf9\x1a\xc1\x5b\xbf\x7c\xa3\xc3\xeb\x8e\xe0\x82\x76\x12\xa2\x9e\xcb\x7a\x36\xd5\x47\x0c\x40\x50\x51\x82\xfa\x9a\xc9\x13\x57\x0d\x0c\x10\x50\xd9\xa4\x34\x55\xcb\x7b\xdc\x17\xd1\x69\x80\x5f\x01\x89\x56\xf8\x54\xf8\x91\x9b\xbf\xb7\x19\xe1\x86\x7b\x36\xa6\x4a\xab\xcd\xb8\x07\xf4\x8d\xcc\xc0\x67\x2f\x67\x88\x74\x50\xb3\xf3\xe9\x58\xd7\x84\x99\xe0\xd1\xab\x36\x8a\xa4\x94\x42\xe5\xe8\xa3\x32\xbf\xfd\x44\xc1\x69\xea\x67\x62\x9c\x85\x72\x4d\xb6\xf1\x58\x6b\x6c\x6b\x5b\xe4\x86\x4d\xfd\x53\xda\x7c\x0f\x7b\x8b\xb3\x57\x31\x16\xbe\x50\x77\xd3\x32\xbd\x12\xa6\x30\x0f\x3a\x68\xa8\x98\x66\xb4\x79\xec\x2b\xaa\x27\x7f\x9f\x56\xf6\xe1\xd4\x9d\x74\x1e\xb3\x22\x03\x5f\xf8\xcb\x1d\xe8\x5c\x8d\xc8\x7a\xc8\xe6\xe4\xc5\xd2\x0b\xfb\x6d\x31\x7a\xb1\x25\x93\x0c\x42\x60\x9b\xe3\xae\x82\x24\x2a\x9e\xf0\x56\x88\x58\xd8"}, -{{0x09,0xd8,0x12,0x26,0x97,0x12,0x6d,0xfc,0x7e,0x11,0x68,0x5a,0x04,0x12,0x3f,0xdf,0xb4,0x7c,0xcd,0xdb,0x44,0x99,0xd8,0xa3,0xae,0xf4,0x18,0xcb,0x65,0xae,0xd7,0xa7,},{0xf8,0xdd,0xb1,0xc0,0x0f,0x6e,0x0f,0x4b,0xea,0xa6,0xfc,0x38,0xe5,0xd0,0xa5,0x77,0x5e,0xe2,0x8c,0x80,0xdb,0xde,0x3f,0x0c,0x79,0x30,0xa3,0x3a,0xad,0x71,0x50,0xf3,},{0x18,0xcf,0xaf,0x6d,0xc8,0xe4,0xe8,0x58,0x2b,0xce,0xfe,0x0c,0xdc,0x6f,0xce,0xfe,0x6a,0x4a,0x87,0xea,0x62,0x95,0x85,0xf3,0x7d,0x2f,0xba,0x44,0x6b,0x3a,0xeb,0xd4,0x52,0x42,0x63,0x82,0xda,0x0d,0x49,0x1c,0x39,0xcb,0x7d,0x54,0xd2,0x73,0x00,0x5d,0xc1,0x32,0x12,0x15,0x68,0xd2,0xab,0x67,0x45,0x20,0xad,0xda,0x75,0x23,0x84,0x0d,},"\xa0\xd8\xd8\x79\x8e\xba\x22\xf5\x67\x60\xc3\x06\x43\xe9\xfc\x67\x95\x54\x7e\xa5\xf2\xf2\xbb\xd1\x1c\x03\x92\xb2\xeb\xf7\x11\xac\xa2\x2f\x08\x24\x19\x9f\xc3\x18\x8a\x45\xbd\xff\xde\x70\xec\xe9\xab\x15\xa5\xea\x89\x62\x2a\x58\x71\xe0\xef\x76\x85\xd1\x0f\x12\x74\xcc\x19\x5b\x4f\xda\x81\xf8\x79\xd1\xe9\xbf\x42\xf8\x73\xb2\x0a\x85\x9c\x23\x3f\x9e\x49\xad\xbf\x05\x77\x31\xe1\x13\x35\xe9\xb6\xd8\xed\x0e\x06\x9e\x13\x4e\xc4\x61\xca\x88\x90\xd7\xb0\x47\x3c\x40\x5e\x8a\x9d\x95\xd1\x57\x11\xb1\x24\x76\x10\x37\x62\xc6\x26\xd9\xf2\xaa\x5d\xd5\x19\xbd\x82\x5b\x60\xb3\x23\x4e\xbf\x65\x1e\x0d\x19\x33\x37\x1c\x52\xbf\xd8\xce\x33\xfc\x36\xbb\xa3\x28\xf7\xf3\xf2\xcc\xc0\x10\x00\xa8\x99\x04\xaf\x37\xe4\xe1\xe9\xe1\x5f\xff\xab\x5c\x2b\x0c\x47\xf3\x7c\xdc\xb0\x68\xdb\x33\xac\x36\xa5\xf0\xd6\xde\x12\x03\xfb\xf8\x94\x93\x24\xbd\x3e\xfd\xa0\xf9\x88\x9d\xb0\x0d\xa2\x31\x7b\x49\xfd\x18\x69\x99\xdf\x7f\xcd\xc3\xcb\x4e\x1d\x18\xfa\xa2\x54\x56\x1c\x25\x11\x78\xb8\xd3\x3f\xdc\x9d\xcc\xd8\xd2\xd7\x21\xb9\x3a\x53\x6c\xcd\x3c\x0e\x9c\x85\x63\x37\xf1\x95\xee\xe7\xda\x9a\x7f\x6b\x0a\x42\xb7\xc5\x41\xc6\xa6\x8c\x59\x5b\xf3\x47\x04\xd9\xfe\x3a\x56\xd2\xec\x84\x81\xd5\x77\xc9\x6e\xcc\x08\xb8\xe4\x0a\xcd\xbf\x05\x0e\x20\xc6\x83\xf3\x9c\x41\x4e\x8c\xbf\xcf\x4a\x01\x52\x31\x4c\x05\x98\x7a\x83\xbd\xe3\x02\x5b\x73\x5c\xca\x30\x23\xab\xc5\xfe\xb7\xe0\x0d\x02\x36\xb4\xf2\x4b\x15\xe6\x79\xdb\x05\x2c\x8d\x2f\xdd\xb3\xbe\xf8\x66\x3a\x6d\xf8\x19\xa9\x81\x55\x27\xa1\xa2\xf6\x0a\x0f\xa4\xe5\x07\x8d\xdc\x6d\x43\x5f\xe8\x92\x87\xb3\x0f\xfd\xeb\x5d\x9a\xe0\x5d\x1a\x86\x90\xfb\xc7\x59\x0a\xad\x57\xd4\x3d\x22\xc1\x2a\xce\x2c\x81\x96\x88\x8e\x35\x4e\x9f\x78\x2f\x5d\xbb\x44\x14\x9e\x83\xfb\x8b\xbc\x9d\xa6\xd8\x9c\xe2\x06\xc1\xe2\xb6\xb2\xb2\x8f\x93\x3f\x3e\x5f\xf1\x17\x5a\x31\xa8\xff\x5d\x31\xe6\x5c\x8b\x00\xc5\xba\x46\x22\x24\xa1\xe0\x9d\x4f\x09\xcb\x40\xfc\x87\xc3\x6e\x7d\x28\x5c\x77\x4a\x96\x97\x62\x03\x65\x18\x28\xe7\x83\x62\x88\x47\xac\x51\x2e\x5d\x1c\x35\xb3\x5b\x03\x01\x71\xf9\x23\x96\xf5\xff\xaf\xf5\x85\xce\xad\x04\xb6\xae\x21\x0d\x80\x70\x7c\xc6\x83\x2d\x98\xa2\x0d\x3a\x94\x76\x48\xda\x26\x04\x93\x7f\xef\xd2\x5a\x9f\xe0\xfc\x5c\xac\x08\x3d\xdd\x7d\x20\x75\x30\x7f\x4f\x38\x26\x64\xf6\x87\xdc\xe8\xc6\x55\xde\xd9\xc1\x2d\x48\xff\x76\x01\xdf\x2a\x48\xd3\x7f\xe2\x14\x97\x08\x44\xc0\x75\xf2\xea\xb0\x02\x05\x9f\xc2\x27\x1e\x61\x7c\x96\x57\xa0\x1b\xec\x1d\xd3\x8f\x6c\x28\xba\x8a\x61\x7b\xd3\x08\x51\xe3\xf9\xdb\xac\x90\x44\x18\xdf\x1d\x02\x15\xad\x45\xdf\xc9\xf0\x2b\x5c\x5e\x9f\x9b\xbc\x6d\xe8\xb0\x7a\xf0\xbd\x1f\x7f\xa8\x92\x25\x44\xf1\x2d\x2a\x3e\x1a\xad\xff\x7e\x9c\x6b\x93\x32\x0c\x3a\x61\xef\x33\xda\x07\xeb\x87\xb1\x61\x7f\x9e\x77\xd7\x70\x2e\x55\x8b\xc7\xd8\x12\x2e\x0d\xfe\x2a\xe8\x3e\x83\x6c\x5b\x1a\x62\xaa\x58\x5c\x0d\xff\xe7\x16\xf7\x46\x3c\x0b\x33\xda\x5b\x1e\xda\x55\x6a\x1e\xf1\xe4\x50\x42\xc7\x9b\xdd\x3e\xc3\xcb\x88\x63\xa7\xbc\x1b\x0f\x7e\x1c\x05\xbd\x99\x20\xf0\x5b\x4e\xda\x86\x51\x77\x05\xed\x07\xf6\xdc\xa7\xbb\x00\xae\x04\x56\xe6\x78\x7d\x9f\xae\x8e\xde\x4e\xcd\x0b\xc5\x72\xeb\x5c\xc6\xd1\x9e\x89\x1f\x1b\xcb\x22\x9e\x94\x09\xe0\x65\x74\xc7\xdf\x05\x81\x73\xcb\x58\xc3\xfd\xf2\x0f\x3f\xf1\x7c\x37\x05\xaf\x62\xd9\xb7\x22\x5c\x57\x43\xf6\x00\x60\x7f\x77\xcb\xe7\xd6\xe7\x61\x8a\xbc\x79"}, -{{0x10,0x20,0x1b,0xf0,0x08,0x43,0x67,0x59,0x0d,0xe6,0x74,0xcc,0x0e,0xd2,0x64,0x8e,0xc2,0x5d,0x3b,0xa8,0xdb,0x40,0xd0,0x0e,0xde,0x15,0x33,0x98,0x50,0x8b,0xc1,0x26,},{0xba,0xdb,0xd0,0x5e,0x5f,0x79,0xe3,0x11,0x69,0xf7,0x40,0xba,0x46,0xa5,0x89,0x10,0xa1,0xb7,0x77,0x05,0xaf,0x45,0x71,0x7b,0x2a,0xf8,0x08,0x56,0x45,0x7c,0x58,0xc9,},{0xf1,0xd9,0x96,0x58,0x8b,0x29,0x8f,0x27,0x1e,0x97,0x0c,0xeb,0xd2,0xa1,0xb3,0x39,0x97,0x9c,0xd2,0x9d,0xdd,0xee,0x36,0x45,0xd0,0x7f,0xab,0x8a,0xb4,0x65,0xdd,0xe3,0xe9,0x86,0x67,0xec,0x01,0xad,0x7f,0x1c,0x0a,0x65,0x92,0xe0,0x69,0x7e,0x66,0x5c,0x72,0xfd,0x38,0x14,0xdb,0xe1,0x89,0xed,0x5f,0x4e,0x76,0xc7,0x94,0xe5,0x38,0x09,},"\x7b\xb1\x47\x06\x17\xd1\x1e\x45\xeb\x60\x2a\x82\x9a\xd7\x73\xee\x2b\xb7\xe6\xb8\x8d\xa4\xc0\x4a\x72\x16\xa4\x50\xf8\x49\x93\xa4\x98\xcb\xd3\xb9\x25\x40\x28\xf2\xf9\x9f\xc2\x1a\x23\x28\x8b\xdc\x1e\x15\x1a\x72\xa9\x13\x0c\x3d\xed\xda\x1b\xbb\xcc\xd4\xe6\xc0\xf4\x8a\xe9\xf3\x53\x18\xcb\xef\xc9\x59\xf4\x05\x04\x5e\x6e\x0b\x5f\xb2\xe7\x38\xf2\xb7\x65\xbe\x11\xb1\xb6\xa0\xf1\xe8\x31\x95\x49\xd9\x5f\xa8\xd1\xdf\x81\x67\xcd\x4a\x77\x17\xae\x16\x36\xa9\xdf\x54\xd9\x6e\xaf\x2d\x63\x23\x69\x00\xfd\x11\x33\x82\x52\xa5\x00\x8d\x5d\x48\x0e\x2b\x1e\x98\x61\xd1\xf7\x06\x88\xc4\x7e\xae\x46\x89\xda\x01\xa4\x7d\xa3\xdf\xb6\xd2\xba\xb3\xcd\xf5\x05\xee\x5d\x80\x1a\x15\x2c\x26\x70\x93\xd1\x7e\x9b\xf7\x13\x7a\x6e\xe7\xb8\x34\xd0\x08\x55\x00\xe4\x01\xc1\x7f\x32\x86\xc1\x57\x5d\x1c\x01\x00\xfa\x98\x07\x63\x0c\x4a\x99\x06\x54\xc1\xe7\x1a\x8b\x71\x56\x27\xbb\x13\xd4\x42\xc8\x4a\x44\x98\x44\xc4\x04\xb8\x72\xbf\xba\xc7\x18\xa4\x8d\x0e\xa0\x94\x5c\x77\x16\x6a\x53\x13\x9b\x0f\xf0\x09\x81\x34\x76\x4f\x9e\xcd\xb8\x8e\xab\xe0\x7c\xcb\x2c\xce\xd4\x95\x5e\x08\x24\x9b\x2f\x57\x70\xad\x41\xfc\xcd\x7b\x5b\xb3\x72\xe6\xc3\x37\x67\xe0\x7f\x5b\xe7\xd1\x07\x12\xde\x81\x84\x1b\x13\x4e\x19\x3d\xf0\x77\x6a\x0f\xc1\x56\xff\x5d\x0e\x96\xf4\x0a\x70\x47\x53\xe1\x14\x5e\x9f\xa0\x83\xc4\xdd\xee\xf4\x41\x62\x34\xf6\xe1\xa2\x38\x2c\x8e\x5b\x3a\xd4\x05\x45\x8e\x89\xd2\xf4\x93\xa4\xd7\xc2\x9a\x23\xde\x21\x07\x48\x5b\x7f\x56\x35\x01\x24\xe7\xe0\xd6\x95\xc5\x22\xb6\xde\x7a\x92\x47\xa2\x92\x4c\xe6\xf2\x86\x32\x36\xc1\x0c\xc2\x12\x64\xad\x54\x59\x0d\x31\x47\x63\xea\x1a\x19\xaf\xac\xd9\x0e\xba\x95\x58\x70\x40\x7e\x8c\x63\x65\xa1\x43\xa5\xc1\xb9\xa8\xbe\x5e\x4a\x4d\xca\xdb\x72\xe0\xd4\x76\x49\xbd\x53\xab\xd4\x6b\x5c\x69\x60\xea\xe2\xca\xb7\x73\x75\x3c\xc0\xe0\x4e\x99\x41\x4b\xc2\xcb\x30\xf4\x8b\xb5\x41\x39\xd0\x66\xe4\x3e\x2f\x0e\x1a\x4a\xe9\x63\x85\x8b\xef\x96\x7d\xf8\xc8\x41\x40\xd2\xd0\x92\x02\xb4\x06\xd5\xd8\x5c\xb7\xa9\x6c\xc5\x7f\x23\x3e\xb2\x18\x7f\xfd\x02\xf9\x4e\x92\x29\x7b\x5e\x69\xd9\x69\xd3\xa5\x93\x6e\xfe\x49\x29\x14\x4f\x25\x8b\xfb\x39\xdd\x0c\xe2\x63\x59\xc4\x54\x9f\xc2\x18\xa0\xaa\x54\xf3\x1b\xd5\x51\xb8\x78\x1a\xcb\xbf\x61\xcb\x3f\x73\x2c\xda\xf6\x22\xc6\xa6\x91\x88\xcf\x55\x7a\x3a\x92\xed\x15\x3e\x69\x12\x5a\x40\x90\xac\x45\x15\x36\xa0\xe9\xa6\x3a\x41\x78\x29\x10\xff\xcc\xb4\xe8\x50\x02\x11\x23\xff\xd1\xf3\xbf\x39\xc7\x34\x60\xa6\x5c\xcf\xe4\xdb\xa9\xbd\xef\xb5\xd5\xf4\xda\x6c\x46\x9a\xa1\x32\x2f\xa2\x70\x43\x23\x83\x63\xee\x72\x91\x86\x88\xd7\xca\x1c\x4c\x29\x52\xe4\x30\xd5\x63\x25\x6b\xb8\x6d\x35\x0a\x35\xee\x82\xe0\x15\x04\x74\x7f\x31\xd0\x2e\x03\xae\xdd\xa5\x46\xd0\xf1\xb2\xf4\x51\xb8\x70\x82\x16\x02\xd0\x0e\x81\x90\x36\xad\xe5\xa7\xc7\xfc\xd2\x1a\x6d\xe6\xaf\x35\xb1\xf9\x63\x2a\x70\xaf\x65\xdf\x64\x45\xf6\xfa\xdf\xbc\x0f\x41\x67\x55\xc8\x24\x66\x40\xe5\x6b\x85\x6b\x66\xdd\xd9\x2a\x60\xc0\x35\x38\x22\x1d\xc8\xfb\x14\x2c\xe2\xdb\xac\xdb\x74\x25\xf3\x3c\xb8\x5d\x85\x0c\xc0\x2c\x31\x5c\xfc\x11\x1f\x6f\x65\x1d\xde\x1b\xdb\x67\xfb\x20\x8e\x1f\x6b\xde\x78\x4d\xdc\xf7\xbd\x18\xc8\x05\x1a\x2e\x0b\xbf\x10\x18\xb8\xf3\x95\x36\xc5\x89\xde\x65\xea\xdc\x6c\xf3\x79\xb7\x7c\xad\x13\xf9\x08\x9c\xb3\x23\xfb\x2e\x94\x3d\x06\xcd\xd1\x07\x05\xc1\x21\x13\x4c\x65\x48\xdc\x53\x41\x5f\x8c\x37\x0e\xc6\x90"}, -{{0xc4,0xaa,0x42,0x52,0x46,0xb5,0x17,0x3f,0x5e,0xf8,0x98,0x15,0x2e,0xca,0x3d,0x09,0x2b,0xb4,0xc2,0xdd,0x02,0x85,0x3f,0xcf,0xc7,0x17,0x83,0x99,0xf4,0xe2,0xf7,0x58,},{0x29,0xb7,0x7a,0x30,0x75,0xf4,0x19,0x24,0x3c,0x0c,0x1b,0xc3,0x96,0x59,0xd7,0x31,0x17,0xac,0x00,0xe5,0x5e,0x8d,0xe3,0x8f,0xe9,0x82,0x9a,0x87,0x9c,0xc5,0xb8,0xa0,},{0x5d,0x85,0x45,0xa4,0xbe,0x3f,0xd6,0xda,0x25,0x78,0xc2,0xec,0xcb,0x64,0x8d,0x83,0xfc,0xfe,0x58,0x71,0x33,0xfa,0x7a,0xe4,0xa1,0xcf,0xca,0x9a,0xe6,0xda,0xa4,0x92,0x59,0xc9,0x52,0x04,0x4a,0x85,0xa2,0x0b,0x6f,0x53,0x24,0xf8,0x27,0xdb,0xa2,0xd1,0xa8,0x38,0x8c,0x40,0xa9,0x28,0xb9,0x50,0x91,0x3c,0x63,0x4f,0xb3,0x09,0x27,0x07,},"\x7d\xf9\x78\xa1\xf4\x97\x68\x38\xff\xed\x74\x49\xa4\xdc\x13\x8b\x60\x4f\x4b\x2a\x4a\xe6\x89\xce\x75\x01\x8e\xbc\xcd\xab\x2e\xaa\x0b\x60\x76\x8f\x72\x08\x25\x7f\x2b\x28\xe7\xaa\x09\xbf\x6c\x05\x88\x8d\xa4\x6f\xd3\x96\xd1\xc8\x03\x01\x17\x50\xe3\x0e\xb4\x84\x87\x0c\x88\x06\x97\x76\x96\xf1\x2e\xbb\x9f\xee\xb4\xca\xf9\x2a\x02\xdb\xaa\x22\xbb\xff\x63\xf8\x42\xc3\xba\x14\x7b\xca\x7c\x00\x31\x42\x78\xac\xd0\xdb\x17\x35\x69\xf4\xe3\x65\x27\x95\x8e\xf6\xf1\x00\x2b\xd3\xcd\x01\xf4\x07\xa8\x65\x31\xed\xcb\xd9\xf3\x1b\x3a\x4a\xb8\x80\xa4\xf5\xb5\x2b\x42\xd0\xd4\xa1\xba\x66\xa2\x09\x86\x51\xae\x3e\x6c\x91\x51\xf4\x02\x73\x28\x5f\x7f\x6a\x4e\x81\x60\x6b\xf9\x80\xf6\x89\x50\x4b\x42\x08\x0f\xdb\x97\xc7\x28\x46\xfb\xa9\x04\x7c\x7e\x66\x0b\xa5\xc6\xbf\x12\x6a\x9a\x59\x9e\x25\x71\xfa\x13\x50\x5a\xf7\x58\x1b\xfe\xbc\x16\x51\x3f\x5c\x94\xdc\x71\x93\x7e\x6e\x61\xb3\xea\x10\x93\x9b\x02\xea\x10\x85\x9f\x32\xd7\x91\x2b\x9e\x38\x06\xab\xef\x61\x85\xfc\xff\xa6\x88\x21\x47\x80\x05\xcb\xfc\x1d\x63\x7d\xd0\x20\x42\x56\x20\xa3\x18\x07\x48\x98\xbd\xc3\x09\x31\xc5\x9a\xc0\xc6\x6c\x4d\x12\x38\xb0\x97\xcd\x5b\x17\x0f\x08\x44\x35\xd4\xba\xe4\x8a\x03\xd9\x2f\xd4\x8f\xc2\xca\xa4\xff\xc5\x05\xf1\xbc\xa5\x16\xfb\xd6\xe4\xf8\x88\xcc\xed\x98\x2a\xe0\xdd\xb8\x8f\xc2\x8a\xa6\x97\xb7\x07\x1d\x01\x5b\x0a\xcb\x28\x09\xb0\x1d\x1d\x9c\x7e\x7b\x53\xee\xe6\x82\x4c\xc3\x7c\xce\x5b\x69\x93\xd8\x8d\x83\xea\xfc\x2e\x92\x8a\x6f\x14\x7d\xb6\xeb\x80\xb1\xa6\x9f\x01\x60\x5b\x04\x6b\xd2\xfd\x1d\x92\xc5\x45\x9d\x6d\x33\x98\xa9\xca\xa2\x99\xdd\xd0\xc3\xba\x2e\x08\x94\x13\x07\xb1\x20\xcc\x13\x99\x2f\x70\x03\xac\xed\x14\xa4\xa4\xd9\x23\xbb\xb1\x2f\xc3\x93\xff\xcf\x92\x0b\x9f\x6d\x47\x75\xe9\x4d\x4a\x51\x22\x67\xfd\x26\xa6\x99\x7c\x60\x62\xb4\xc9\x90\x0f\x98\x62\xb9\xea\x0c\x8d\x7d\xf1\x9f\x05\xc2\xb6\x04\xaf\x5b\x98\x64\xfb\x27\x54\xa8\x07\x3b\xbb\xfb\x18\x23\x3e\x6e\x15\x0f\x72\xa5\x25\xe3\xa5\x76\x0f\xcd\xa7\xd3\x2a\x60\x03\x4f\x95\x6e\x3c\xbd\x34\x36\xc2\x00\x83\x0b\x3e\x7a\x14\x57\x12\x20\xbc\xb6\x27\xd5\xa4\xbe\x72\xc2\x0b\x23\x35\x1b\x2d\x92\x06\x02\xa5\x1c\x3e\xb3\x2c\x12\x37\x03\x9d\xfb\xff\x43\xc9\x87\xfd\x85\x63\x77\x7f\x0e\x5a\x39\xf8\x14\x6c\x16\x4b\xdf\xfc\xe4\x4f\x3b\x13\xee\x74\xd6\x4b\xfd\xcf\x98\x03\xf0\x3d\xd0\x17\x2a\xc4\xfa\x4b\xf6\xc7\x83\x9c\xb1\x1f\x3d\x34\xba\xef\x0e\x32\xb5\x49\x42\xfc\x4f\xa3\x8f\x47\x3e\x29\x66\xf4\x91\x1c\x0e\x80\xd7\x69\x37\xb2\x5b\x76\x32\x27\x5b\xa8\x83\x09\x63\x5a\x60\xdf\x13\x54\x89\x20\x8d\x3e\x73\x4b\x67\x2e\xda\x7d\x2b\xa2\x15\x79\xab\xa8\xd8\x86\x0e\xa7\x64\xfd\x67\xea\xf9\xc3\x8e\xa7\x63\x7d\x1b\xad\x57\xb2\xf3\xd7\x82\xb9\x1e\x1d\x5d\x92\xac\x30\x0b\xdb\xa7\xab\x91\x13\xce\x91\x3d\x0c\x79\x3c\x12\xa9\xa7\x26\xe3\xfc\xab\x05\xcb\x47\x99\x77\x87\x16\x40\x63\x0d\x45\x9e\x69\xe8\x1c\xa5\xcf\x56\xdd\xb2\xa0\x61\x1d\x61\xd4\x81\xc1\xb8\xce\xf3\x80\x4b\xd4\xe5\x75\x4a\x61\xeb\x49\xb1\x7e\xf2\xb0\x3c\x83\x05\x7b\x5d\x20\xd8\x82\x05\x8c\x00\xf5\x4b\x6c\xca\x86\xbe\x95\x35\x0d\xd7\xbc\xb2\x5e\x4c\x1c\x46\x58\xf4\x52\x29\xc8\xbb\x9f\x5c\xdf\xcc\x44\x79\x5c\x97\x8e\x33\x88\xd3\x25\x76\x01\x06\xe5\x2b\xe9\x83\x4b\xd8\x1f\xfc\x5c\x62\x48\x6b\x6f\x33\xc2\x74\x59\xdf\x17\x8e\xb9\x46\xe7\xa8\x2d\xb9\xce\x0d\x29\x5b\x92\x5b\xb6\x12\x6d\xd5\x5c\x31\xf4\x9a\x68\xdc\xef\xc7"}, -{{0xf1,0x3c,0xaf,0xde,0x6f,0x39,0xb9,0x63,0xdc,0xa9,0x66,0x26,0x86,0x2f,0x4f,0xbc,0x5c,0x2e,0x00,0xdd,0xf0,0x8b,0xec,0xea,0xc7,0xa6,0xe2,0xfc,0xa9,0xe1,0xcc,0xf7,},{0xc1,0xb0,0x1a,0x91,0xe8,0xee,0x0b,0x9f,0x19,0xa7,0x2e,0x5e,0x7e,0x0a,0xef,0xcf,0xdc,0x44,0xa1,0x57,0x47,0x4e,0x99,0xfe,0xeb,0xd0,0xff,0x55,0x2d,0x73,0xb2,0xac,},{0x6c,0xa9,0xf8,0x0a,0x62,0x50,0x1f,0xaf,0x31,0x9f,0xb8,0x4a,0xf4,0x71,0xf6,0x76,0xae,0x3f,0xff,0x85,0x56,0x5c,0x97,0x98,0x1f,0x14,0x57,0xcb,0xb8,0xc4,0x9f,0x97,0xb2,0x66,0x31,0x6a,0x99,0x2d,0xb0,0xd4,0x2b,0xc5,0x02,0xf0,0x95,0xa5,0xf2,0xd9,0xa4,0xe1,0xcf,0xac,0x0c,0xc9,0x35,0xd3,0x88,0x2c,0x8a,0x3a,0x0e,0xa6,0xe1,0x0e,},"\x2b\xee\x73\xb7\x4f\x1b\x76\x22\xeb\x09\x6a\x28\xd8\x3a\x81\x9b\xce\xc2\x2d\x99\x99\xa3\x20\x62\x10\x3d\x60\x4a\xe6\xd7\x8e\xdf\x8f\x89\x38\x95\xd2\x22\x0a\xb7\x56\x90\x41\x0c\x58\xaa\xb5\x90\xa9\x8d\xdf\xf2\x3a\x94\xd2\x35\x0f\x88\x9e\x53\x46\x42\x00\xa5\x27\xd5\x4d\x62\x57\x11\x07\xb2\x7e\x57\x4f\x54\x2e\xba\xc2\x49\xb8\xe2\xe3\xce\x08\xd1\xbd\x27\xbd\x8d\x29\xf2\xe6\x12\x43\xde\xef\x0e\x69\x38\xe5\x2e\xe2\x99\x2f\xf2\x18\x7d\x7a\x7f\x52\x82\xed\xd9\x8f\xc4\x98\x5b\x61\x9a\xcb\x80\xaa\x9d\x03\xd6\xcb\x84\xb8\x21\x10\x6f\x40\xd6\xe5\xf4\xc3\x87\xab\x0a\xf6\xf2\x06\x61\x5d\x0a\x17\x5f\x7e\x60\xee\x27\x55\xae\xa3\x46\x75\xfd\xd8\x23\xeb\x24\x10\x9a\x9b\xd8\x18\xea\x2d\x9d\x9b\xd1\x99\xcf\x8d\xfe\x79\x62\x4b\x03\x72\xae\x85\xe9\x8c\x60\x20\x02\x34\xbd\x41\x3f\x4a\x62\xce\x68\xa4\x7b\x6c\x9b\x12\x85\x7c\x0d\x39\x9a\x44\x8e\x5a\x52\x80\xe9\xf2\x2f\x9b\x12\xea\x2c\xd3\xc6\x87\x13\xe7\x7d\x0a\x11\xf3\x62\x8d\x8e\xc5\xe0\x60\x63\x90\x31\xd3\xb6\x40\x02\x1c\x9c\x38\x80\x9d\xc5\xf4\x2d\x2e\x1c\x2e\x23\x46\xc8\x6e\x24\xee\xdc\x59\x84\xa1\x15\xa4\x2d\xe8\xde\x7e\x35\xc9\x91\x75\x39\xe8\x98\x85\xca\x91\x6e\x07\x2a\xfd\x5d\x46\x84\x6b\x2a\x93\x59\x61\xc2\xfe\x28\xe9\xeb\x3c\x8f\x89\x6b\x86\xfc\x12\x0c\xbd\x3a\xf2\xaa\x13\x9c\x49\x9d\x29\xcf\xc3\x69\x9d\xb7\x9c\x14\x48\x4e\x9e\xc2\x57\xa5\xf6\x43\x44\xb7\xad\x1e\x3d\xfb\x34\xee\xe7\x65\x4c\x6b\xf1\x2f\xd3\x8f\xbb\xa8\x0f\xe1\x76\x2a\xab\x57\x11\x2b\x3a\x94\xe2\xbe\xe7\x90\x41\xd1\xe8\x84\x40\xf8\x5f\xb7\x2d\xde\x68\xd4\x9e\x84\xbc\xed\x99\x8a\x2f\x63\x35\x44\x6e\x4a\x83\x5e\x70\xc5\xf8\x27\xfb\x3a\xd7\x82\x3d\x5f\xbe\x3b\xe5\xf6\xec\x7e\x43\x4e\xe5\x24\xcc\xd9\xff\x5b\x7e\x72\xa3\x2d\x09\x1a\x7e\x17\xc8\xb1\xae\x41\xa1\xaf\x31\x79\x3c\xce\x91\xd8\x4c\x36\x22\x67\x89\x69\xc8\xf5\x17\xdc\x26\xe3\xcd\x61\xd2\x44\x69\x12\x28\x3f\x93\x53\xbb\x5a\xd0\x3c\x11\x1c\x62\x33\xde\x31\x4c\x61\xb8\x31\xcb\xf3\x8b\x04\xfe\x58\xcf\x44\xf1\xd2\xd0\xb4\x5f\x25\xa6\xb4\xe0\x25\x68\x59\xcd\x5d\x83\x0f\xac\x5e\xc3\xc8\xd7\x63\x98\x55\x9e\x9b\x26\x01\x0f\x5e\x1d\xa5\xf2\x5d\x22\x00\x93\x54\x53\xff\xac\x5a\xea\x51\xf7\xe8\x1e\x72\xec\x8e\x5f\x04\xd2\xf8\x85\xc7\xb4\x5c\x63\xf6\x44\x56\xcf\xe2\x31\xb8\xcb\x24\xaa\x16\x20\xa9\x02\x63\x9c\xa7\x8d\xd3\x91\xaa\x4a\x3d\x03\xe1\x19\x75\xc8\x90\x7f\x96\x4f\xd5\x5d\xf9\xbb\xb1\x40\xe3\x8d\x6d\xb9\x32\x56\xb4\xb3\x9c\x2b\x7b\xcb\xe3\x5b\x11\x82\x6b\xbf\x8c\x08\xf1\xdc\xb4\x8e\xdc\x4b\xfb\x70\x46\x2a\x35\xea\x8c\xd8\xcb\xa7\x9f\xab\x8b\x4c\x44\xe7\x3b\xe7\xec\xfa\x11\x21\x66\xf6\xdc\xab\x70\xd8\xbb\x55\xd8\xb8\x42\x8c\x2d\xa7\x1a\xac\xa2\xfc\x3d\x90\xf3\xcc\x5e\xd0\x15\x51\x35\x8d\x60\x78\x9b\x9d\x57\x1e\xfe\x10\x89\x20\x27\xfa\x37\x40\x4a\xaf\x59\xec\x1c\x2d\x71\x11\xec\xc3\x59\x24\x67\xed\x1d\x9b\x8a\xba\x8e\x22\x9e\x32\xd2\xa0\x0c\x19\xdb\x71\x87\xfb\xcb\x12\x20\x61\x96\x1c\x1f\xda\xca\x30\x7e\x9c\x9c\x9d\xe9\x72\xad\x51\x40\x2f\xa6\x7d\xc1\xc2\xa4\x03\xb3\xc5\xe8\xb1\xe2\x46\x86\x2d\x6a\xd6\xa4\x98\xdb\x6d\x76\x1f\xb5\x66\xf6\x06\x59\x42\xb6\x0a\xd4\xb4\x30\x9d\x18\x2b\xc5\x15\x4c\xfc\x36\x86\x31\x85\xa8\x7e\x23\xab\xaa\x1d\x54\x1a\xb7\x63\xa4\xa1\x06\x6c\x0a\x7a\x8c\x3d\x82\x1a\xe3\x2f\xd3\x1c\x88\x92\x40\x10\x46\xd0\xa2\x0e\x91\xa6\x47\x79\xf4\xbd\xa8\x11\x20\xaf\x3f\xb3\x48\x6d\x3f\xc0\xa7"}, -{{0xc8,0x46,0x34,0x42,0x61,0xa3,0x48,0x65,0x39,0x38,0x34,0xbf,0xaa,0x3a,0x15,0xa3,0xf5,0x3a,0xc9,0xe1,0x38,0x33,0xb0,0xb2,0x87,0x12,0x27,0x81,0xb7,0x9d,0xe3,0x92,},{0xeb,0xad,0xe0,0x22,0x61,0x95,0xae,0x25,0x4b,0x61,0x15,0xe2,0x16,0x96,0xa9,0xc6,0x5a,0x19,0xd5,0xe0,0x40,0x44,0x31,0x31,0xc2,0x2b,0x89,0xf0,0x2f,0x69,0xab,0x78,},{0xd5,0xe4,0x1b,0x47,0xad,0x0f,0x34,0x00,0x70,0x97,0x70,0xed,0x43,0x91,0x9b,0xaf,0xdf,0x24,0x38,0x1b,0x66,0x15,0x44,0xe5,0x1d,0x8b,0x5c,0xee,0x9e,0x97,0xb3,0x67,0x6a,0x4c,0x0f,0xfa,0xeb,0xb2,0xcb,0xd2,0xdb,0x79,0x85,0x32,0xb6,0x5c,0xf6,0x54,0xa5,0xb6,0xc1,0x66,0xef,0x88,0x6c,0xb0,0xfb,0xbf,0x4a,0x4f,0x84,0x4c,0x44,0x0b,},"\x5a\xbd\x13\xe9\x5b\x6e\xe1\xd5\x51\x47\x68\x28\x22\x00\xa1\x4f\x7d\x1a\x57\x1f\x34\x68\xe2\x2e\xfe\xc9\x93\x46\x30\x66\xa3\x7a\xec\x83\x73\xe5\xfb\x49\x95\x64\x19\x1f\x32\x94\xa9\xb3\x0a\xfb\x5f\x1a\x34\xd4\xd8\x8a\xbc\x3e\x9b\xc3\x03\xc1\xab\xa0\x5b\xd8\xfa\xca\x90\xee\x35\xd9\x7a\xc3\xdd\x91\x06\xf6\xfa\x3c\xa8\x1a\x38\x10\xec\xce\xfa\x6a\x20\x9e\xa3\xf3\xfc\x30\x49\xdc\xb1\xb0\x03\xc7\x28\xf7\xf6\x37\x4c\xa9\x8c\x58\x2d\xe6\xdb\x1a\xf7\x60\xf0\xa0\x21\x33\xca\x4a\x01\x03\x24\x30\x4d\x26\xa0\xe5\x0a\xf0\xd1\x3c\x13\x4d\xa3\x4a\x03\xa4\x1e\x83\xec\x8f\x10\xea\x5b\x85\x9b\xec\x1f\x51\xb0\x1c\xab\xb2\xd1\x6c\x1f\xc5\x2b\x05\x8f\x8e\x5d\xef\xae\xde\x12\x81\x71\xc2\xe0\x26\x90\x23\x16\xf8\x71\xb3\x5e\x32\x92\x65\x6f\x0e\x5b\x39\xbb\xbc\x81\xd0\xc0\x83\x0e\x6a\xc0\x1f\xac\x9b\x45\x39\xf4\x7f\x9a\xcf\xbd\x58\xb7\xab\x9f\x5a\x12\x56\x00\xf2\x51\xa2\x71\xd7\xbf\x16\x7f\x29\x54\xca\x8e\x1e\x0c\x96\xe1\x6b\x06\xe8\x30\x7d\xf8\x8b\xb8\xe9\xd5\x7d\x5b\xa0\x44\xf2\x7f\x3e\xaf\xf8\x1d\x9f\x15\x05\x54\xaa\x71\x22\xfd\x10\xd1\x1f\x35\xd2\xbe\x2b\x16\x24\xe3\xe1\xa1\xd7\x7f\xea\x4c\x5c\x7f\x8b\x98\x3e\x94\x5b\xa8\xc0\x8d\xc1\x54\x5b\x3e\x6b\x29\x73\xad\x04\x1c\x44\xd0\x61\x7e\xcc\xc8\x71\xa3\x82\x1a\x9f\xfe\xa9\xdb\x7c\x2b\x0d\x05\x5d\xa5\x5d\xe0\xb3\x50\x63\xe4\x22\x5a\xee\x6b\x22\x5a\xb2\xa7\x90\x6a\x8e\xe3\x29\xd1\xb3\x97\x2e\x0d\x1f\x70\x81\x7c\x50\xcc\xfe\x94\x03\xd1\x2a\xd6\x2c\x94\x92\x3b\x9a\xa2\xd7\xf8\x5a\x8d\xda\x47\xbe\x4d\xce\xc0\xdc\x2b\x0b\x58\xf7\xac\x19\x0a\xe0\x57\x9b\x9b\x13\xbb\xb8\xb1\x6a\x31\xb0\xab\x4d\x6f\x27\x91\x25\x3a\xb4\x75\x1b\x53\x6b\x88\xd3\xb4\x93\x7c\xc3\xa1\x10\xaa\x82\xa6\xff\xed\x68\x53\x52\x4b\x66\xb3\xef\xfc\xd2\xf6\x3c\x6f\x96\x45\xce\xa1\x3a\xa2\x3c\xd1\xc9\x9d\x9f\xfd\xa4\xcd\x3a\x9c\x5d\xf4\x5e\xc7\x47\x26\xc3\x47\x11\x28\xb7\x08\x9f\xbd\x82\x69\x4d\x2d\x3f\x08\xdc\x93\x06\xc0\xfc\x9c\xe7\xc8\x01\x13\x8e\xb1\xec\xb7\x56\xe5\x71\xe9\x05\x9b\x75\xed\x03\xf9\x2a\x31\x50\x2f\xbe\xb5\xfe\xc5\x1d\xe9\x35\x90\x10\xc4\x39\x7d\x28\xb6\x5e\x35\x6e\x38\x00\x1d\x0d\x51\xac\x96\x00\x72\x8c\x78\xb5\x76\x6e\x0f\x21\x79\x38\xb4\x10\xe7\x85\xb4\xc0\x1e\x86\xa3\x45\x2b\xcb\x38\x84\xac\xa4\x75\x40\x85\x9c\xc4\x9b\x00\x0f\x0b\x61\xfd\xbe\x72\x75\x25\x74\xb2\x7a\x22\xd4\xc4\x04\x13\xa4\x3b\x31\x09\x24\xb1\xbb\x14\x0f\xc9\xfd\xaa\xe2\x66\xd6\x59\x30\xe3\xf2\x34\xfe\x84\x1d\x82\xb2\x61\x76\xff\x86\xc5\xd2\xbd\x8d\x96\x5c\x52\xd7\x28\x06\x4e\xbd\xf6\x8d\xc8\xe4\x83\x49\x41\x80\x1c\xca\x0b\x2f\x25\x6d\x4f\x6c\x3d\xd1\x9d\x35\xd5\x36\x2b\xbf\x9b\x8a\x3a\x1c\x86\x3e\x09\x26\x89\xdd\x28\x52\xad\xd4\x88\xbf\x42\x68\x5b\x11\xe1\xe1\xad\x57\x45\xd0\x75\x62\x8d\x73\x1f\x91\xcf\xd7\x49\x15\x9e\x2e\x1c\x83\x7f\x4e\xf8\x3d\x80\xea\x1d\xd9\xbd\xed\x5f\x88\x01\x8c\xe1\xd4\xb3\x37\x1f\x95\x43\x53\xf3\xd8\x94\x37\x00\x62\xc0\x96\x5d\x67\x98\x6d\xbc\x48\x17\x15\xf4\x2d\xd2\xc9\x16\x07\xab\x8b\x5f\x0d\x89\xf6\x6e\x68\xd7\x3d\x50\xd6\x40\x52\x4d\x72\xe6\x91\x34\xb8\x87\x29\x8e\x5c\xd8\xc4\xb9\x05\xba\x5e\xfa\x0e\x9d\x68\x52\x14\xb8\x42\xf5\x0a\x2a\x39\x83\xa1\xaf\x58\x5a\xf2\xca\x43\xdb\xcf\x02\xc4\x08\x97\xae\x2e\x1a\xb5\x1d\xbc\xe5\x70\x34\x5e\x8e\x13\x5f\xb7\xb4\xeb\x0a\x1d\x6a\x0b\xb5\xa8\xa1\x80\x7e\x42\x5b\x2d\x62\x83\x60\x76\x80\x58\xe6\x1a\xd1\xcf\xaa\x20\x99"}, -{{0xfa,0xaf,0x55,0xd3,0xc2,0x97,0x14,0xb6,0x5c,0x22,0x81,0xe2,0xc2,0x2d,0x61,0x34,0x97,0x1a,0x2e,0x74,0x00,0x8f,0xb9,0x40,0x89,0xa7,0x73,0xee,0xeb,0x44,0x83,0xa6,},{0x39,0x86,0x2e,0xac,0x6d,0xd5,0x2e,0x38,0x1b,0xb3,0x4d,0xc1,0x96,0xba,0x8a,0x37,0x4d,0xcb,0x7d,0xf6,0xcb,0x14,0x0f,0xd0,0xcf,0xa6,0xcf,0xa3,0x9b,0x8c,0x75,0x3f,},{0x5b,0x00,0x83,0xf7,0xa8,0x20,0x61,0xc6,0x5c,0xf6,0xc7,0x56,0x40,0xc8,0x1c,0x28,0xe8,0xd6,0xd2,0xe8,0x7f,0x6d,0x57,0x95,0xc9,0xaa,0x3b,0xb3,0xe3,0x90,0xe9,0x19,0x90,0xe8,0x2d,0xb6,0xf0,0x7e,0x61,0x4f,0x50,0x7a,0x56,0x0a,0xba,0xa1,0xec,0xa6,0x56,0xc6,0x78,0xdd,0xca,0xe8,0x19,0x82,0x51,0xe6,0xaf,0x0b,0x76,0xb8,0x8d,0x0d,},"\x94\xe6\x61\xc2\x52\x40\xa8\x9e\x82\x3d\x7f\x5d\xc0\xe6\x92\xed\xdd\x13\x70\xc3\x5a\xc4\x4d\x5a\x8c\x87\x98\xd0\xc9\xaa\xfd\xf0\xbb\xfb\x54\x92\x60\x56\x8d\xba\x1c\x69\x08\x6b\xee\x63\x6b\xe8\xed\xcc\xd3\xcb\xb2\x70\x16\x24\x4d\x54\xd7\xed\x2f\xeb\x7f\xa6\x46\x14\xd4\x54\x49\xd7\xe0\x58\xe7\x1b\x30\x6c\x22\xe6\x91\x1c\x2a\xc7\x42\x07\xba\xe5\xa8\x4d\x0f\xc2\x47\xbe\x49\xd3\x56\xe5\xd4\x35\x3b\xa5\x58\x6b\x6e\x4b\x2b\x97\xce\x9e\x23\x77\xb6\xee\xd9\x2c\x84\x9e\x67\x69\x44\xae\x90\xdc\x42\x08\xe3\x00\xe1\x9c\xc9\x1d\xc2\x6b\xbd\xd5\xa3\x0c\xfa\x92\x81\xa1\x5e\xfd\x87\x30\x66\xf8\x5a\xf3\xa2\x6f\x31\x06\x23\xe0\x09\x80\x48\x53\xcc\x68\x55\x90\x3e\xa6\x4a\x90\x98\x97\xe3\x15\xe7\x3d\x31\x29\x48\x98\x0e\xf6\x28\x9d\xb2\x1a\x5e\xbb\xec\x8c\x8e\xfe\x20\xd1\xd5\x3d\xfa\xad\x6d\x9f\x42\x96\x53\x2e\x88\x7c\x37\x35\x01\x05\xa6\x33\xab\xc7\x73\x18\x87\x51\xb2\x8c\x3a\x08\xf1\xb5\xee\x04\x72\xde\x46\x27\xe6\xb6\x1b\x68\x27\x8d\xd5\x1c\xed\x6a\x61\xec\xf3\x88\x86\xe4\x53\x39\xdc\x6c\x60\xc3\x1e\x85\x0e\xf8\x29\x6a\xe8\x0f\x9d\x31\x70\x17\x76\xeb\x9a\xf2\x16\x93\xf4\xc5\x2e\xc0\x62\x62\x57\x38\xd4\xe3\xaf\xbf\x71\xd1\xc8\x1f\xc4\x84\x63\x60\x36\x3e\xa5\x41\xa9\x76\x62\x3a\x5e\x4e\x6b\x6a\x67\x23\x7e\x92\x37\x17\x3f\x1a\x1d\x54\x33\x02\x85\x88\x85\x71\x4c\x2a\x59\x1d\x0a\x78\x62\x82\xa0\x28\x5a\x37\x11\xf7\xbc\x2b\x63\xca\x79\x87\xe9\xae\x7d\x02\x03\x55\x55\xcf\x3b\x6a\xd6\xf7\x1c\xa9\x8a\xa9\x28\x88\x3b\xf8\x1d\xd6\xf8\x64\x93\xea\xab\x56\x37\xb4\xdd\x56\x9d\x1e\xe8\xde\x6a\x44\xbc\xed\xb6\x2b\x97\x06\xb1\xdb\x89\xe3\xf0\x5d\xf1\x63\x10\x01\x7d\x89\xef\x3e\x4b\xc0\x99\xb7\x21\xa5\xc8\xd3\x80\x43\xd6\xe4\xa2\x2c\xf0\x40\x09\xc0\xfc\xee\x6b\xe6\x99\x37\x82\x99\x54\x94\x1b\x8b\x4a\x1e\xbf\x4d\xae\xa0\xd7\x74\xd0\x78\x2b\xe1\x76\xc8\xe5\x91\x90\x77\x56\xc2\xcf\x75\xde\xa6\xf7\x87\x7d\xd6\x87\x5b\x8f\xe1\x01\x2f\x30\x50\xcf\xb1\x28\x9c\xf0\x88\x66\x7e\x15\x22\xee\xed\xc9\x27\xac\x86\xbf\xe2\xc4\x07\x43\x2b\x4a\x81\x3a\x6a\x7a\x55\x04\xe9\x99\x20\x6d\xb1\x82\x7e\x25\xfa\xfd\x70\xce\xd3\x6d\xb3\xb2\x81\xb6\xf7\xb1\x4e\xd5\xba\xa0\x57\x23\x15\xa9\x39\xc5\xbf\x4a\xbb\x13\x3d\x2e\x7b\x16\xd5\x2d\xe2\x08\x17\xaf\x05\x5d\xf5\xf1\x41\x20\x77\x34\x61\x0a\x0c\x6e\xeb\xed\xaf\xff\xd9\xcc\x9f\x06\x9b\x67\xf9\xa1\xc0\x45\x4b\xe4\x1d\x54\xc1\x38\xbe\x54\x2e\x5e\x38\xcf\xe2\xf2\x93\xf7\xd2\xd3\xdf\x66\x97\x7a\xcb\x36\x6a\x42\xc1\x9b\x31\x85\xac\xfa\x1b\x36\x3c\x61\x31\xa4\xa8\x11\x1c\x3b\x1f\x4f\xd7\xac\x40\x6d\x0e\x69\x10\x3b\xa1\x5b\x8c\x4b\xf2\x9b\xc2\xed\x9c\x45\xcf\xd1\xd2\x79\xd8\xd9\x31\x44\x4b\x2b\x18\x49\x25\x2b\x8a\x70\xee\xd8\x0f\xd2\x60\xed\xf5\xa3\xc0\x1b\x96\x90\x16\x0d\x23\x11\x85\x1d\x21\xc9\x30\x2d\x98\x59\x86\xea\xee\xb3\xae\x2c\x07\xc7\xc7\x67\x20\x94\xf9\x1d\xb0\xbd\x50\xbe\x37\x7e\x4d\x1e\xb0\x7e\xe7\x6a\xf4\x9d\xc1\x36\xa1\x45\xa1\x1b\x17\x2f\x08\x11\xfe\x73\xd6\x25\x9b\xe3\x70\xc4\xdf\xca\xb6\xf1\x9e\x4a\x64\xb1\x51\xd0\xa6\xdb\x80\x50\xc3\xde\x2c\xc3\x25\xf5\xc5\xf6\x59\x4c\xf6\x24\x8e\xb0\x81\x20\x95\x39\xe0\x8c\xa3\x42\x29\x84\xe7\xbf\x80\x3d\xe3\xa4\x19\xb1\x44\x23\xf1\xe5\xa5\x42\x24\x04\x2c\xe4\xf0\x54\x88\xa6\x04\x4f\x40\x42\xbd\x64\x9b\x1a\x08\xce\x10\xc2\x00\x6e\xa7\x6e\xfa\xb4\x64\x1f\xef\x28\x97\xef\xd7\x24\xe6\x05\x4a\x3b\xd1\xa6\x9e\x39\xa4\xa5\xe2\xd5\x02"}, -{{0x6d,0x78,0x55,0xe3,0x0f,0x7a,0x13,0xe2,0x37,0xb0,0x67,0x14,0x43,0x46,0x43,0x4b,0xb4,0xb0,0x51,0x78,0xc7,0xd8,0x8d,0x49,0x2e,0x79,0x02,0x7c,0x4b,0x0f,0x3c,0xdd,},{0x72,0x73,0x29,0x38,0x28,0xef,0xa3,0x49,0x82,0x23,0x92,0xdb,0xba,0xb0,0x78,0x79,0x57,0x7e,0x1a,0x77,0xa6,0xfd,0x6a,0xfe,0x33,0x75,0x3a,0x9e,0xec,0x88,0xc4,0xaf,},{0x0f,0xe2,0x8e,0xad,0xd9,0xe5,0xdd,0x57,0x4b,0x3f,0xaa,0xea,0x81,0x0d,0x44,0x52,0x2c,0x8b,0x1b,0xfb,0xb3,0xe3,0xd5,0x7e,0xd8,0x89,0xfa,0xed,0xec,0x91,0xd0,0xe1,0x4a,0x86,0xb9,0x14,0xc4,0xc7,0x66,0xf1,0xbf,0x9b,0x8f,0x18,0xb0,0xdb,0x89,0x0d,0xb6,0xc1,0xb1,0x25,0xd5,0x78,0x04,0x33,0x36,0x19,0xb1,0xe0,0x72,0x0a,0x33,0x00,},"\xf8\xb9\x36\xe7\x93\xb0\x17\x58\x0c\xc0\xe9\xcb\xda\x2a\xcb\x64\x74\x50\x7f\x4b\xca\x3a\xfc\x87\x83\xec\x46\xee\xb8\x2c\xcd\x4d\xd2\x52\x56\x76\xaa\x6a\xb5\xc0\xdc\xf7\xd7\x5f\x7e\x03\x11\xe6\xfe\x6b\xf2\x72\x63\xf8\x57\x8f\xeb\x55\xc5\x61\x2d\x1f\x28\xe8\x88\xb7\x66\x56\xc4\x1c\xcd\x8a\x70\xb9\xbc\x60\x4b\x42\x72\x4f\xa2\xbc\x41\x1d\x44\xc3\x1a\xb6\x8c\xe8\x4f\x83\x93\x39\x9e\x34\xd5\x40\x85\x79\xc2\xba\x29\x21\xf2\xf8\xd1\x14\x87\xaa\x7e\x52\x55\x7f\xee\xd9\x67\x57\x19\x9d\x3a\xae\x63\x77\x77\x01\x54\xb1\x7f\x35\x77\xc7\xac\x3d\x8c\x76\xcf\x74\x61\xb5\xe8\xd4\x2a\x71\x85\x07\x8e\xd4\xf8\x62\xfc\x57\x50\x2f\x61\x50\x75\x30\x7b\x6e\x10\x3c\x77\xc1\xf6\xc8\xbd\xa7\xaa\x17\xe4\x35\xe2\x1b\x94\x9a\xf4\x4d\xff\x5a\xa3\x0a\x62\xda\x71\x2f\xa9\x96\x6a\x61\x2f\xfc\xa1\x48\x71\xfd\x6f\x86\x0b\x4a\x96\x14\x01\x2c\x53\x69\x91\x0e\x0f\xfd\x6f\x0f\xbd\x88\x9a\x9c\x25\x7c\x32\xbd\xcf\x90\xbb\x80\x62\x7c\xb2\x72\xec\xd4\x59\x98\x97\x55\x59\x55\xe1\xfe\x08\xcd\x7e\xbb\x21\xc0\x71\xbe\x0f\x48\x98\x96\x96\xcb\x39\xaa\x82\xad\x11\xba\xa5\xd4\xac\x61\x3a\xbf\x1b\x6d\xb8\xa2\x0e\x68\x68\x36\x22\x28\x33\xf8\xb6\xdd\x2f\x00\x06\x22\x7b\xe4\x8e\x85\x80\xdc\xc8\xde\x62\x0d\xac\xb2\xf6\x5a\x69\x36\x75\xd6\xcb\x45\xba\x5d\xd1\xaa\x70\xdb\x76\xbc\x64\x1d\x4f\xb5\x67\xec\xbc\x71\x11\x44\x2e\x29\x41\x58\xbe\x57\x5c\x71\xdd\xc2\x6e\x94\xf4\x12\x66\xa2\xfd\x3a\x0d\x43\x57\x81\xfc\x09\x46\x48\xfa\xdf\x5f\x17\xcd\x41\xab\x89\x58\x21\x89\x4e\xc0\x80\x6b\x26\x2c\x39\x35\x34\xfe\x66\xf2\x1e\x37\x83\xc1\x4a\x96\xc8\x8f\x2e\x06\x53\xfe\x32\xe7\x5d\xce\x8a\x46\x3b\xb9\x7e\xed\x6c\x16\xf3\xf3\x22\x81\x69\xab\xb5\xb4\xbf\x9e\xa3\x27\x8c\x1f\xf0\xf8\x6e\xae\x71\x38\x9b\x64\x33\xac\xd0\x97\xee\xfa\x9e\x6e\x05\xf4\x95\x5c\xd5\x17\x83\x0b\x8d\x98\x70\xcc\xb5\x22\x74\x15\xe5\x0f\x23\xf6\x47\x32\x17\xa7\x45\x09\x64\x70\xdc\xa9\x3d\x2b\x34\x67\x3c\x5d\x6a\x57\xed\x02\xc8\xe0\xca\xe1\x19\xb3\xf3\x29\xd8\xab\x64\x98\x49\x4c\x29\x21\xbb\x6f\x49\x6d\xd0\x83\x81\xe7\xd3\x9f\x2d\xb5\x76\x3b\x14\xa2\x82\x1b\xef\xcc\xa0\xa9\xfd\x31\x25\x45\xde\x68\xab\xf2\x06\xd1\x2d\x8e\x02\xe7\x3b\xc7\xe3\xcb\x79\x6e\x7e\xe2\x6c\xc6\x3d\x74\x1e\xfa\xfc\x53\x45\xf8\x13\x29\x51\xbc\xfb\xfd\xdf\x63\x1f\xb7\xcb\x43\xef\x35\xb9\x45\x3c\x93\x90\xeb\x23\xb1\xf9\xd8\xb1\xc7\x2d\xeb\xd2\x4f\x09\xa0\x1a\x9d\xc6\x0e\xe6\x81\x53\x06\x18\x83\x57\x78\x1a\xf6\xe1\x82\x0a\xa3\x5e\x4e\xc1\x21\xb7\xca\x34\xd7\xde\x76\x11\xb2\x46\xa3\xe7\x03\xed\x48\xc7\xeb\x03\xa6\xfe\x8f\x85\x2e\xe7\xd3\x25\x45\xc9\xd8\x52\xd6\x4d\x5d\x75\x93\x0e\x5f\x1e\xbe\x21\xa3\x07\xef\xa7\x62\x2e\xda\xce\xd6\xd8\x79\x02\x6f\x0f\x85\xa9\x11\x20\x12\x80\x37\x05\x58\x22\x69\xd3\x9f\x14\x32\x34\xdf\x89\x09\xab\x3d\x94\x8e\x76\xd3\xda\xaa\x24\x22\x6d\x9a\xc6\x01\xee\xf2\x77\xfd\x2c\xfc\x4a\x19\xae\xdf\x43\x87\xa2\x16\x17\xb0\x3e\xc3\xd3\x84\x5a\x38\x55\x4f\x5e\x97\x03\x6e\x56\xec\x1c\xe6\x60\xdf\x9c\x06\x2c\x2c\x99\x3b\x77\xc5\xba\x6a\x6d\x05\x23\x1d\xae\x37\x64\x18\x3c\x3e\x96\xaa\x53\x9c\xfb\x34\x15\xfb\x16\x3c\x64\x5b\x23\x03\xb2\xd6\xd4\xbd\xa8\xca\x6c\x72\xbc\x03\xd5\x30\x5f\x9b\x11\x8e\x92\x5e\x27\xd2\x9a\xb7\xdc\xb1\x96\x47\x0e\x63\x39\x63\x1b\x23\x80\x74\x4c\x04\xd1\xda\x34\x8f\xc0\xfe\x27\x42\x77\xf8\x2f\x95\xbd\xfb\x0b\x64\xb4\xcf\x3b\x51\xe5\x71\xc0\xdd\xb3\xb5\x3c\xa6"}, -{{0x7e,0xe4,0xe7,0xe9,0x8c,0x6a,0x40,0xf0,0xe7,0x44,0x13,0xf2,0x40,0x39,0xbd,0x22,0x0d,0xf1,0xf8,0xc7,0xf0,0x15,0x52,0x8d,0xbf,0x52,0x84,0xab,0x9f,0x7c,0x82,0xe2,},{0x4d,0x5a,0x80,0x0f,0x9b,0x22,0x07,0x0e,0x01,0x6e,0xe2,0x3a,0xf8,0xa3,0x10,0x90,0x2b,0x36,0x9d,0x58,0x9a,0x84,0x7f,0x34,0x5c,0x2e,0xa2,0x96,0x8d,0x6d,0x09,0x24,},{0xac,0x3b,0xfe,0x3a,0xdf,0x94,0x1c,0x93,0x4d,0x33,0x49,0xc4,0x92,0xde,0x70,0xd5,0x16,0x6b,0xe3,0x89,0xf9,0x55,0xbe,0x87,0xc2,0x88,0x3f,0x41,0xf2,0xda,0x14,0x6c,0x91,0x06,0x51,0xa3,0xb4,0x52,0xc2,0xd7,0x39,0xdc,0x9b,0x53,0x1c,0x57,0x45,0x56,0x5e,0x69,0xd9,0x83,0x59,0xf1,0xd7,0xd9,0x3e,0xbd,0x36,0xd7,0x0a,0xbb,0xf0,0x0d,},"\x8f\xb0\x13\x73\xc4\x2e\x69\x61\x4a\xea\x99\xaf\x49\x32\x37\x85\xf3\x38\x61\xb9\x4e\x90\xf5\x65\x38\x9e\xbf\x70\xe2\x19\xf5\xde\xc7\x32\xe0\x01\x0b\x58\xf7\x29\x05\x30\xdf\x22\x2a\xc9\xc7\x3e\x1c\x2e\x92\xa5\xe6\x06\x1d\xe5\x59\x0c\xaf\x9c\x0d\x50\x21\xd7\x29\xea\xa1\x15\x41\xfa\x1d\x08\x21\x60\xbe\xaf\x61\x1e\x7c\xfd\xc0\xeb\xb3\x15\xd3\x88\xe5\x38\xb4\xb5\x02\x8f\x9b\x30\xd3\xd9\x73\x34\x7f\xfd\x44\x26\x3e\xef\x08\x3b\x81\xb2\x1b\x82\xec\xa5\x75\x6a\x49\x4b\x1d\x81\xc0\x7d\xe8\x49\x50\x6d\x3e\x3b\x66\x87\x97\xa5\xc5\x44\x25\x4d\x4e\xbe\x5c\xf8\x17\x1b\x39\xf8\x72\x4c\xbc\x41\x89\x29\x1b\x3c\x53\xc2\x1e\xce\x49\xa1\xd7\x39\x56\x3c\x65\xb4\x90\x25\x93\x56\x47\xa7\x30\x3a\xe0\xef\x7f\x6d\x24\x55\x46\x45\xa4\x28\xdb\xbb\x42\x44\x9f\x53\x99\xe3\x6d\xc7\x87\xb7\xd6\x95\x8a\x02\xee\xbb\xb8\x36\xe5\xe5\x3e\x26\xe4\x87\x23\x9d\xe9\x4d\x1d\x25\x0e\x79\x43\xac\x0e\x22\xd9\x27\x50\xa0\xcf\x34\x73\xbe\x1a\x62\x25\xcb\xe7\x95\x45\x04\x82\x69\xf6\x23\x7e\xc9\xf9\xec\x30\x7e\x8a\x34\xb7\xbb\x34\xcd\x49\x06\xe4\x31\x62\xa3\x70\x8f\x32\x9c\x5b\x98\x9d\x7a\x7f\xcd\xe1\x09\x9a\x54\x25\x46\xfe\x9c\x33\x18\x2b\xa5\x1b\x84\x3e\x96\xd1\x1c\x79\xe9\x1a\xd2\x1f\x71\x70\xe2\x57\xfd\xc2\x81\x8e\x12\xf9\x16\x8a\x97\x4c\x96\x8a\x4d\x27\x3f\xa3\xff\xa9\xf3\x5f\xf9\x05\x98\x0e\xaa\xd3\x72\x1c\xae\x80\x2b\xee\x36\x21\x0b\x40\xb9\x93\x19\xbb\x66\x99\x82\xe9\x43\xb2\x70\xa4\xc4\xd0\xa9\x2e\xcb\x5b\xba\x2d\xd8\xb4\x0a\xc3\xd2\xf0\x32\x5c\x46\x9d\x5e\x9d\x48\x3f\x52\x41\x97\x40\x10\xc5\xc0\xda\x33\x5f\x16\xe9\x62\x19\x6c\x2e\xf1\x4e\xb2\x4a\xaf\xbb\x31\x1b\xfd\x5f\xa8\xdc\x8d\x2d\x61\xe6\x87\x8a\xd2\xcc\xe0\xdc\x99\x39\xe4\x45\x22\x72\x3d\x42\x7e\xf3\x2f\xb4\x3b\x96\x7f\x5e\x44\xfc\x66\x57\x92\x79\x6f\x8c\xf9\x34\xf0\x1c\x32\x5d\x63\xd5\x83\xdc\x3c\xa9\xd4\xfc\xc7\x57\xd9\x17\x85\x80\xda\xef\x53\xaa\x3a\xb2\x1d\x2c\xe4\x35\x95\x5d\x1c\x6d\x47\x63\x8c\x5e\xdb\x62\xff\x55\x61\x69\x3d\x1c\xbd\x10\xec\x9e\x39\x9a\x71\xbf\x9d\xb1\xc9\x96\x9f\xd5\x9e\x4e\xeb\x31\xaa\x59\xbf\x39\xe9\xf1\x84\x17\x8d\xef\x72\x46\xed\x4b\x8f\x4b\xe5\xba\xda\xa5\xdb\x4a\xf8\x67\xf4\xf2\xec\x39\xa1\x37\x04\x20\x2c\x87\x84\xfa\x16\x8c\xe9\x6f\x9c\xfa\xc7\x10\x17\x23\x62\x75\xfd\x85\x7c\xc3\xc5\x1a\x9c\x7a\xc2\x56\x21\x5e\x14\xb8\x43\xf7\x21\x4d\xc9\xf8\x24\xb9\x1d\x1a\x51\x70\xd0\xef\x1d\x37\x69\x6f\x93\xee\x96\x6a\x2b\x7d\xec\xe2\x2b\x4f\x3a\xfd\x39\xc1\x6d\x60\x1e\x5f\xf8\x40\x8d\x45\xc1\xa6\xce\x71\xf0\x60\x97\x6c\x5b\xe4\xc0\x42\xb1\xb7\x38\xdf\x95\x80\xba\x5a\xe7\x78\x80\xa7\x0c\x0b\x94\xf0\xe1\xc9\xf9\xaa\x34\xc0\x90\xd6\x12\xd5\x7a\x9b\x93\x1f\x50\xa1\x25\xfa\x35\xce\x40\xa2\xcb\x7f\xaa\xd5\x30\xf8\x09\x08\xc7\x3c\xb7\x82\x58\xaf\xd2\x63\x13\x90\x04\x1d\x92\x61\x7e\x9b\xf6\x4c\xe9\x6e\x8e\x4a\xc7\xf3\x12\x6d\x8a\xf8\xa0\x4c\x75\xff\xd4\x38\x76\x9d\xe0\x6f\x74\xc2\xfc\x20\xcc\x81\x92\xda\x35\x3e\x79\x06\x12\x83\xbb\xa0\x8a\x8d\x24\xe6\xe4\xe2\xe8\x3b\xa5\xb0\x8e\x42\x75\x22\x60\x62\x14\x8d\x8a\x02\xaf\xad\x65\xb6\xf6\x27\xcf\xbd\x29\xb7\x1c\xa1\x8a\xee\x5b\x1f\x97\x16\x9b\xf0\x22\x8b\x37\x6f\x41\x06\xb5\x0f\xd9\x1a\x38\xa6\x62\x11\xd6\x9e\xbb\x4a\x7a\xf0\xe1\xc2\x21\x7f\x1b\xa0\x14\xd1\xe0\xcd\x17\x50\x8d\x58\x15\x5d\x16\x3d\xd9\xde\x2f\xe1\xc6\x4c\x7f\x88\xd5\xb5\x53\xe9\xba\x1e\x1f\x25\x43\x0d\x7e\x12\x5b\x07\xa8\xc2\xed"}, -{{0x1f,0x28,0xd9,0x09,0x1d,0x19,0x6c,0xba,0x3d,0x45,0x52,0xe5,0xa3,0x37,0xa4,0xd8,0xaf,0x3f,0x29,0x5e,0x62,0x9e,0x4b,0xa6,0xfe,0x99,0x70,0x31,0x20,0xae,0x41,0xe0,},{0x81,0x4d,0x34,0xbf,0x28,0xee,0x6d,0x90,0xf0,0x39,0x59,0x90,0x41,0xdb,0x81,0x0f,0x7c,0x9d,0xaa,0x91,0x8e,0x03,0xe9,0x61,0x97,0x41,0x4b,0xc9,0xaa,0x31,0xec,0xdc,},{0x5b,0xe5,0x52,0xfa,0x73,0x1e,0x83,0x67,0x93,0xf6,0xdd,0xa8,0x95,0xdc,0x9b,0x1e,0x2c,0xcd,0x66,0x9d,0xe1,0xc8,0x43,0xe0,0x0e,0xa6,0xfa,0x3c,0x5e,0xbf,0x97,0xa3,0x4b,0x26,0xf1,0xf3,0xac,0x7f,0xf2,0x22,0x5e,0xe4,0xa7,0xe4,0x30,0x07,0x2c,0x13,0xda,0x40,0x66,0xdc,0xdc,0xc0,0x5b,0xa2,0xb5,0xf6,0x1a,0x6e,0x8d,0x21,0x07,0x09,},"\xa6\x94\x68\xbc\x33\xeb\xfe\xf0\x61\x5c\x64\x3c\x49\xda\xc6\xe0\x4f\xdb\x6c\xfb\x8e\xc4\x58\x57\xbb\xb7\xa2\x7e\x52\x8f\xd6\x31\xfc\x34\x11\xba\xee\x65\xcc\x1f\x94\xfc\xc9\x4a\xed\x4a\x43\x32\xfa\x68\x61\xe0\x65\xe0\x61\x63\x54\x17\x09\xd7\x97\x28\xe0\x1b\xe2\xb1\x40\xa0\x22\xc8\x3e\x7b\x23\xb9\xed\x2a\xd2\x83\x21\x69\xdf\xc9\x56\x90\x91\x3c\xf3\x72\x01\x30\x65\x70\x80\xc9\xd5\xa7\x82\x7e\x56\x60\x75\x74\x52\xc5\xfc\x3d\xcd\x80\xcc\x6b\xe0\x98\xc6\x29\x22\x6d\x54\x66\xe0\x2b\x97\x12\x6b\xe7\x4a\x14\x52\xee\x16\x81\x50\x95\xde\xb4\x2b\xf0\x65\x66\x71\x50\x28\xc1\x18\x25\x82\x0a\x8a\x23\xc6\x0d\xa2\xb6\x8d\xd9\xa5\x5d\xad\x2a\x29\xa4\x96\x44\x43\x81\x7c\x07\xd7\x76\xb2\x44\xb1\x51\x86\x81\x9a\x3b\xbe\xd4\x14\xab\xf4\x57\x9a\x3e\xce\x3a\x3d\xc7\xb1\x05\xd0\xa9\xdb\xa3\x7b\x9e\xaa\x78\xbe\x8e\x46\xe1\x69\x8b\x59\xb0\x94\x0b\x01\xf3\x8b\x28\x3c\x33\xa9\xa4\xb1\xd4\xf8\x14\x4b\x16\xee\xb5\xfc\x0a\x7a\xf0\xd0\x81\x69\x66\x45\xa1\xea\xb3\xa7\x87\xcb\xcf\x88\xfa\xd9\x3d\xd6\xcd\x46\xd2\x95\xa8\x79\xa1\x77\x50\x33\xa9\x85\x63\x82\x2e\xf1\xf6\xb6\x9a\x58\x1e\x49\x73\x6c\x8d\x70\x1b\x44\x53\x96\x93\x40\x52\x1e\x4a\xd4\xbf\x94\xb9\x11\xb0\xe2\xd8\x6f\x34\xee\xce\x4a\x63\x85\xff\x1f\xe6\x32\x20\xcd\x3c\xc5\x92\xf3\x6d\x6c\x49\x1f\xa1\x8f\x7c\x14\x04\x36\x0d\x2a\x77\x53\xfe\x07\x3e\x09\xa2\xfc\x42\xa4\xbb\xea\x55\xbc\x96\xd7\xf0\x5c\x98\xae\xd2\xcc\x4a\x9f\xae\x8f\xd4\xa0\x19\x7f\xf0\x1f\xa7\xf0\x04\x6e\x3c\x3e\xb5\x9a\xaa\xbc\xa3\x13\xa4\xdd\xaa\x5d\x20\xd2\x7c\x2c\x5f\x1a\xc6\xd8\x7f\xd3\xcb\x4b\xd3\x5a\x1e\xc7\x5d\x10\x4f\x7c\x36\x73\x31\xa3\xe2\x95\xe5\x3c\x4e\x80\xba\xe1\x4b\x97\x92\xd0\xd5\x26\xf7\x40\xd4\xff\x03\x6f\xaf\x54\x87\x96\x7f\xfa\xbe\x8e\x88\x3d\x3f\xb0\xd1\x6f\xaa\xdb\x28\xe1\x28\x5d\xed\x41\x57\x0c\x0b\x07\xc2\x55\x9b\x53\x1e\x0f\x92\x54\xef\x88\xe5\xb1\x0f\x64\xf4\x83\x9a\x9a\x0b\x6c\x3c\x7f\x1b\x78\x50\xf4\xad\x9b\xf0\x99\x9a\x7f\x2a\xe7\xc4\x5a\x65\x8e\xa5\x30\x36\xfc\x70\x19\x98\x42\xb8\xe4\x9e\x60\xf9\x67\xde\x1f\xf3\xab\xff\xf6\xcd\x73\x5b\x7c\xd8\xb8\xf9\xe2\x48\xf1\x56\xf6\xc6\x54\x38\x69\xeb\x99\x82\x3d\xae\xa8\x8d\xeb\xaf\x79\xf0\x1e\x65\x21\xec\x63\xfe\x72\x72\x4e\xe3\xc8\x22\xb8\x8b\x39\x68\xb2\x48\x52\x09\x15\x83\xc4\x9a\xb3\xc1\x5f\xa1\xf7\x9b\x18\xd9\x8f\x04\xd9\xb6\x84\x1c\x9a\x7c\xa0\xde\x2f\xcc\x02\xf9\x5d\xd6\x49\x49\x2e\x8b\x56\xa3\x1e\xc1\xe2\x44\x33\x7a\xf6\xaa\xae\xde\x8b\xf9\x9f\xc8\x14\xef\x57\xc0\xd5\xe0\x8c\x3c\x7e\xcc\x18\x97\x98\x0a\xa1\x69\xa9\x92\x6d\x20\x69\x8d\xf6\x93\x0e\x21\x10\xcb\x46\x0f\x49\x39\x01\x00\x74\x10\x95\xf8\xed\x00\x41\x2a\xe6\x96\xd9\x8e\xfe\xfd\x29\x0d\xa5\xf7\xd0\xb7\x28\xd2\x0a\x1e\xbf\xa6\xbd\x7d\x27\x0f\x28\x1a\x98\xc7\xb1\xe4\x08\x43\x51\x25\xaa\x48\x3c\x6b\x7d\x63\x3f\xf7\x58\x8a\x94\x16\x58\xf6\x12\x95\x44\xd6\x29\x45\xb9\xb8\xaf\x71\xa8\xc6\x2c\x0a\x50\x07\x6c\xb8\x54\x1b\xa7\xe4\xbd\xe4\xed\xe4\x41\x72\x2c\x6e\xb9\xdf\x8c\xfd\x06\x56\x33\x9e\x86\xd2\x26\xab\xae\xa0\x5e\xa0\x47\xf6\xb8\x30\x77\x01\xf6\xc9\xa4\x4c\xc9\xcb\x83\x7b\x8e\xb6\x24\x45\x92\x5e\x8a\x88\x81\xd2\x53\x8f\xcb\x2b\x24\x9e\x4e\xe8\xb6\x86\xec\xfb\x49\xc4\xdf\x86\x40\x1d\x24\x9a\xac\x35\x84\x1e\x91\x40\x04\xf9\x45\x5d\x3f\xde\x37\x5d\x20\xa0\x1f\xba\x27\xb1\x97\xa6\x98\xd3\x84\xc7\x65\x05\x10\x68\x01\x62\x7e\x83\x36\xbd\x2d\x76\xd7\x61\xa8"}, -{{0xc6,0x4d,0xd2,0x0d,0x42,0x62,0x75,0x26,0x19,0x8a,0x22,0x64,0x76,0x90,0xc8,0x95,0xb5,0xb4,0x5b,0x69,0x8f,0x57,0xa6,0x9d,0xfb,0xe4,0x8d,0xbd,0x42,0x6a,0xa4,0x70,},{0x2e,0x01,0xd4,0x04,0x16,0xf7,0x8a,0xcd,0xdb,0x34,0xb8,0x44,0x5e,0xa4,0xfd,0x0a,0xb3,0xfa,0x9e,0x66,0x43,0x04,0x47,0x52,0x21,0x3f,0x07,0xc7,0xf0,0xff,0x43,0xa0,},{0xde,0xac,0xc8,0xc2,0x32,0x18,0x72,0x76,0x76,0xd5,0x40,0xa2,0x3b,0xda,0xd7,0x81,0x02,0x11,0xe6,0xd5,0x7a,0xd2,0x94,0xc3,0x7d,0x4b,0x1c,0x9a,0xf6,0xb3,0x37,0xa5,0x3f,0x78,0x80,0xd2,0xba,0xfa,0x73,0xb3,0x05,0x08,0xc0,0x08,0x42,0x6b,0xf8,0xd7,0xc9,0x65,0xa1,0xf4,0xa4,0x22,0xa1,0xbc,0x7d,0x6a,0xd6,0x22,0x6f,0xd1,0x97,0x06,},"\x82\x1b\x9f\x7c\x16\x10\x4b\x53\x3b\xd1\x27\x18\x4f\xd7\x2a\xde\x09\x2b\x13\xbb\xd9\xac\xee\xd2\x9b\x8d\x10\xf1\x66\x88\x92\x2d\x16\x5f\x89\x31\xd5\x3d\xf5\x90\xfb\x71\x3b\x67\x4d\x80\x5c\xe0\xc9\xd6\xce\x6c\x43\xba\x69\x68\x19\x1d\x12\xbf\xa0\x8a\x8c\xe2\x2e\x8f\x33\x6b\x2b\x49\x1a\xf2\x5d\x1b\x16\x06\xf9\x30\xca\xeb\xe5\x22\x39\x2a\x87\xd4\x2c\xe7\xbc\x16\x7a\xa7\xb6\x10\x59\x72\x20\xaf\x31\xa6\x65\x35\x30\x71\xe8\xd9\xe5\xf4\x20\x78\xb9\xc3\x88\xbf\x04\x02\x58\xe2\x1f\x9c\x3a\xb3\x8c\x04\x27\x61\x8b\x2c\x28\xd3\x43\x0d\xf2\x79\x21\xbf\xc5\x84\x87\xb3\x46\x19\x78\xbf\xa8\xbf\x58\x6c\xfe\x83\x58\xe0\x92\xf8\xf4\x74\x66\xe7\x62\x45\x1d\x50\x16\x4a\x0d\x74\x36\x0f\x66\xb4\xcd\x3a\x35\x75\xda\x01\xda\x23\x75\x24\x30\xc0\x35\xda\x85\x9f\x57\x7d\xe2\x22\x90\xaa\xb4\xed\x7f\x34\xd2\x67\x40\x6a\xb5\x47\xeb\x44\x5c\xc6\x4d\xf5\x30\x19\x42\x7f\x4e\xb7\x2b\xca\x55\x39\x71\x53\xd0\x1c\xcf\x7e\xc9\x7d\x7a\x96\x7d\x9a\xff\x46\x23\x1d\x2e\x20\x27\xb3\x8f\x3b\x41\xbd\x2c\xb1\xb7\x98\xa4\xae\x88\xab\xf4\x89\x62\x16\xd3\x15\xbd\x53\x83\x02\x42\x59\xe5\x97\x42\x80\x2a\x91\x1b\xad\xcf\x84\x73\xdb\x91\xaf\x31\x97\x33\x32\x0c\xb9\x52\x1e\xf9\xce\x43\x72\x67\xb6\xea\x17\xbc\xaf\xe5\xd0\x90\x3b\x12\x3a\x35\xc9\x88\xf4\x98\x34\xf6\x1d\xd5\x52\x64\x0a\x32\x76\xda\x26\xaf\x17\xec\x21\xa2\x02\x96\x58\x6d\xd6\xf4\xb3\x6c\x7a\x4f\x0b\x89\x9d\x70\xb4\x2a\xf8\x9e\x29\x37\x01\x32\xed\xfb\x72\xd6\x83\x41\x94\xa1\x60\x93\x60\xb1\xf1\xfe\xab\x89\xb9\x6b\x8e\x8f\x0f\x68\x98\x7c\x57\xcc\xe0\xba\xb7\x68\x11\x37\x18\xfb\x17\x09\xde\x2d\xf3\x21\x77\xd4\x40\x85\xda\x5e\xfd\x9d\xa7\x0e\x1a\x85\x8c\x92\xf2\x45\xac\xfe\xe6\x4b\x71\xf3\xeb\x16\xe0\x4f\xc1\x39\x89\xe6\x93\x37\x99\x97\x01\xdd\x73\xab\xc2\x66\xc9\xfd\x4c\xff\x91\xa0\xfd\x04\xfb\xd8\xb1\x3b\x12\xe6\xf4\x50\x38\x57\x15\x84\x8e\x00\x7f\xa0\xd4\x63\x11\x9f\xd7\xde\x63\x25\xb6\x40\x04\x2b\x65\x42\x12\xe0\xdb\x8d\xa1\xad\xeb\xd2\xa7\x58\x9f\x77\xee\x4f\x75\x2d\x28\x2c\xa1\x11\x9c\x43\x1b\x17\xad\x0a\x02\x1e\xf2\xbf\x95\xe5\xac\x47\x04\xe6\x2d\x70\x39\xd0\xe6\x51\xe4\x56\xd6\x0e\x63\xba\xde\x40\x1c\xca\x77\xc9\xa8\x91\x63\x17\x4d\x50\x22\xd7\x45\xab\xdc\x76\xb9\xff\xe2\x54\x41\x55\x23\x5e\x30\x63\xe6\xe4\xae\xec\x44\xed\x5d\x8a\xb4\x08\xd9\x66\xfe\xc1\x20\x16\xc1\x30\x73\x0b\xbc\x55\x87\x32\x06\x5d\xa8\x00\xa7\x0c\xbf\xb0\xfc\xcc\xa4\x5d\x00\x28\xcb\xfd\x96\x32\xdd\xb2\xf0\xed\x12\xed\xae\x7b\x93\x0b\x10\x6c\x9d\x12\x85\xa4\xb8\x70\xde\x75\x07\x99\x9c\x74\x79\x3d\xd4\x97\x40\x87\x19\xc8\x98\xab\xe4\x9f\x7f\x33\xa3\x3e\x69\xb5\x0f\xa5\xaf\x94\x80\x06\x85\x66\xd1\xfd\xdf\x44\x82\xd7\x97\x04\xad\x8e\xf1\x1b\x88\xb4\x2c\xc6\x9f\xce\x8a\x55\x7b\x5b\xa5\x10\xe7\x08\xb9\x37\x51\x23\x03\x85\x68\x27\x0d\xe4\x07\x23\x2e\x95\x62\x1e\x2d\x04\x57\x0b\xec\x2c\x41\xec\xcf\xd8\x55\xb2\x1f\x0c\x9b\xba\xa2\x3b\x5c\x58\x15\xfc\x88\x8f\x7f\xbe\xd4\x82\xc3\x20\xff\xa1\xe0\x63\xe8\x7b\x55\xbc\x8f\x7e\xee\xa3\x74\x06\x3a\x9b\xe6\x5f\x7e\xd9\x22\x5b\xf6\xca\x34\xcf\xa3\x11\xb7\x9f\x3a\x25\x8c\x25\x2e\x63\x45\xed\x6a\xc8\x47\x48\xf4\x68\x07\xa5\x5d\x4b\xa4\x12\x66\x16\x9c\xd2\x62\xd4\xf7\x22\x79\xef\x0c\xaa\x77\xff\x44\x93\x35\x32\xbd\x13\x74\x75\x6c\x23\xec\x85\xf5\x5e\xfe\x9f\xc2\x33\x1f\x26\xf8\x81\x62\x9f\x80\xc2\x69\x2f\x7f\x53\xe4\xbc\x6f\x22\xef\xb4\x54\x57\xa2\x23\xf0\xd1\xc4"}, -{{0x0f,0x8e,0x9f,0x35,0x26,0xb4,0xfa,0xea,0x92,0x76,0xf2,0x2a,0x17,0x79,0xe6,0xf8,0x27,0x09,0x80,0x8f,0x6d,0x0c,0x61,0x2a,0xdf,0xe3,0x2a,0x6e,0x8a,0x06,0x10,0x05,},{0xd4,0x8c,0x3f,0x0f,0xde,0xf3,0x82,0xd1,0xd8,0x03,0x13,0xe8,0x46,0xfc,0xa9,0x5e,0x41,0x81,0x76,0xbb,0x5d,0xfa,0x9d,0x39,0x8c,0x1d,0x21,0x24,0x77,0x6f,0x69,0x0a,},{0x2f,0x59,0xa2,0x93,0x60,0x73,0x91,0x38,0x34,0xeb,0x15,0xa0,0xe0,0xbc,0xb9,0xaa,0x80,0x40,0x89,0x46,0x8f,0x24,0xdd,0x1b,0x2d,0x37,0xa1,0x93,0x4a,0xe9,0xba,0x10,0x20,0xff,0x64,0xb7,0x2e,0xec,0x03,0x26,0x8d,0x0a,0x7c,0x01,0x2c,0x4e,0x79,0x63,0x00,0xf6,0xdf,0x7a,0xdd,0xa0,0x1c,0x8b,0xc5,0xe9,0x01,0x5c,0xcd,0xee,0x1a,0x00,},"\x0c\xcd\x37\xc4\xcf\xd8\xe7\x0c\xa3\xbb\x39\x46\xd0\x9d\x70\xd0\xf6\xa4\xb8\x1d\x6d\xfb\x07\x9d\x78\x73\x74\x80\x71\x58\x98\x80\x92\x73\x82\xf7\x43\x6a\x6e\xf8\xf5\x1c\x25\x54\x73\xdd\x01\xfe\xb5\x2c\x8e\xdb\xe4\xd3\x25\x57\x13\xe6\x8d\x64\x0f\x3d\xcf\x15\x8f\x2b\xfb\x9f\xbe\xcf\x71\xf0\x71\x9d\xfe\x8c\xe6\xb6\x01\x28\x1b\xa6\xc2\x0a\x56\xb4\xf8\xe7\xca\xa4\xaa\x9f\x86\x8f\xbf\xc5\xe4\x32\x1c\x22\xd6\x5f\x03\x82\xc4\x89\x6b\xf9\xbe\xbe\x35\x46\x94\x9e\x81\x85\xa4\xd8\x17\xe4\x5b\x5d\x12\x93\x95\x38\x21\xbd\xd9\x8e\xc2\x59\xf6\x4a\x3d\xe5\x38\x65\xb1\x49\xea\x01\xc8\xf6\x83\xec\xda\x61\xda\x5d\xc1\x0e\x7e\xbd\xdd\xfe\x74\x84\xf5\xeb\x10\x31\xb7\x91\x65\x87\xca\xa3\x99\xa0\x6b\x6f\xea\x4c\x5e\x6e\x0b\xe6\x50\xfb\xdf\x06\xc1\x03\x6d\xf2\xcc\x35\xf6\x2e\xa0\xea\x71\x3f\x52\x80\x9d\x77\xf4\x7c\x2e\x55\xc9\x23\x92\x48\x16\x80\xb6\x33\x20\x56\x22\x69\x13\xb0\xce\x88\xa6\xc5\x5a\x26\xbd\xb5\xb8\xba\xb3\xcf\x46\x95\xa8\xc5\x22\x30\x2c\x4e\xba\x37\xd3\x1f\xf7\x7e\x58\x30\x1b\xcc\xfc\x7c\x7b\xe8\x58\x0c\x63\x42\x68\x79\x95\xf4\x4a\xcd\x19\x09\x65\xae\x0d\x7b\xf0\x66\x95\x92\xb6\xad\x88\x74\x3e\xbb\x36\x0c\x73\xe0\x48\x4a\x23\xd2\xf9\xe9\x9e\x9e\xb0\x38\xdc\xbd\x87\xca\x9b\x1a\x49\x8f\x1b\x2d\x35\xfe\xdd\x7f\x8e\x1f\x7f\xd8\xca\x52\x64\x86\x91\x1e\x07\x6a\xea\xb4\x87\x7b\xba\xcf\x37\x8a\x28\x55\xf9\xc5\xac\x03\x91\x30\xdc\x69\x0e\x17\x7d\x67\xb2\x44\xcc\x8a\xd0\x32\x37\x9e\xf7\x1f\xe0\x5e\x9c\x86\x13\xd8\xf5\xd6\xea\x3d\x4e\x3e\x47\x22\x20\x29\xcc\x00\x42\x53\xbe\x47\xf8\x7f\xb5\xe3\x31\x4c\x48\x98\x13\x4b\x87\xac\xf1\x0b\x25\x38\xba\xd8\x97\xbd\xc5\x01\x2d\x8f\x97\x62\xc8\x71\xb6\x53\xd4\x00\xfe\xe0\xce\xed\x5e\xf6\xbd\xd1\x6f\xaf\x3f\x0a\xbd\xbd\x72\xcd\x0a\x12\x94\x05\x46\xf0\x99\x5f\xf1\x4b\x0f\x1b\xd5\x48\x56\xff\x74\xc3\x6e\xb4\xf2\x2d\x72\x87\xae\xfd\xc6\x09\x99\x8c\x1f\x41\xbc\xc3\xbb\x3a\x5f\xa4\x92\x34\xf4\xfa\x8e\x92\x9c\xd0\xf5\x54\xb3\x15\x39\x5d\xae\x87\x3c\x61\xca\x70\xe0\x41\x0c\x2f\xd5\xa1\x15\xd2\xa6\xff\x1f\x1c\x94\xb2\x7b\xa4\x50\xb8\x19\x4b\x21\xf0\x95\xc6\x1a\x5f\x21\x5e\x3c\x84\xf5\xd4\x3f\x0e\x73\x62\x86\xd3\x3b\x8c\x47\x81\x4d\xb9\x79\xf9\xdc\x00\x91\x98\x46\xbe\xe6\x85\x33\x7d\x99\x55\x5a\x24\x47\x2e\x6b\x00\xb3\xf4\xa1\x43\x11\xa6\xc7\xc9\x04\xba\x58\x89\xda\x6c\x1d\xdc\xc1\x11\x75\x80\xf5\xfb\xc4\x1f\x2b\x8a\x42\x68\xcf\x0e\x9f\xa5\xbf\x41\x25\x34\xc9\xe4\x05\x2a\xac\xb5\x04\xcb\x86\xe2\x14\x7a\xb8\x02\x3d\x58\x80\x0b\x76\x3f\x9a\xbf\x9d\x04\x40\x78\x8a\x51\xdf\xe5\xcb\xd4\x42\x30\xba\x52\x28\xf1\xf5\x96\x0e\xa3\xa4\xe4\x04\x4d\x36\xda\xf8\x11\xcb\xdb\xec\x5d\x69\x64\x63\xd8\xe9\x41\xf2\x72\x17\x56\x3b\xb4\x4a\x21\x18\xa4\xf5\xac\xd6\xe7\x94\xde\x17\xe0\x28\xcb\xde\xef\xde\xf2\xcb\xf0\x3d\xd3\x2e\x78\x99\xe6\x5a\x1c\xf8\x39\xf5\xd9\x0e\x1f\x8c\x36\x4b\x57\x7f\xe3\x10\x53\x53\xf6\x67\x68\xdb\xf7\xaf\x0c\x52\x1a\xa8\xa4\x9f\x7a\x22\x08\x2d\x88\xf9\x01\x49\x8c\x90\xb9\xd7\x77\x7e\xd2\xf9\xf0\xe8\xa5\x52\xd8\xa1\xfa\x5e\x96\x32\xed\x85\x32\x58\xc9\xc2\x15\xb6\xdb\xb4\x11\x1d\xcf\xca\x55\x4b\xfb\xc9\xbb\xa2\x2f\x88\xbc\x55\x55\x2c\x6d\x86\x25\x56\xd7\x41\xda\xd5\x9f\x21\x5e\x37\x28\x83\x46\xca\x7d\x7f\xd8\xc6\x5a\x38\x0d\x72\x0c\xaf\xf9\xef\xa1\x49\xf3\xfd\xa2\x32\xda\xa5\xb1\x2e\xf1\x1c\x0a\xf0\x86\x2b\xd0\x22\x9e\x07\x5a\x3c\x6b\x60\xef\x0b\xbb\x3d\xad\x7f\x29\x08"}, -{{0xfe,0x7c,0xdc,0x79,0x66,0xd0,0xff,0xb9,0xc7,0x6f,0x4a,0x18,0xe7,0xf0,0xbf,0x90,0x69,0x0e,0xb7,0x6d,0xc3,0xd3,0xd5,0x08,0x84,0x64,0x8e,0x2e,0x39,0x37,0xd0,0x20,},{0xa1,0x2e,0xe9,0x81,0x2d,0x6a,0xf6,0xaa,0x48,0x79,0xfa,0x72,0xbc,0x0a,0x69,0x80,0x4e,0xa1,0xa8,0x5f,0x9b,0xc4,0xa2,0x6a,0x5b,0xa7,0xcf,0xbb,0x91,0x4d,0x0d,0xd9,},{0xb5,0x2d,0x03,0xfd,0xeb,0xcd,0x42,0x97,0x37,0xef,0x70,0x92,0x06,0x87,0x21,0x1f,0xbb,0x4c,0x04,0xf8,0x1e,0x35,0x5c,0xec,0x70,0x72,0xc5,0x05,0x41,0x75,0xd2,0xed,0x77,0xf3,0x8f,0x46,0x6f,0x00,0x14,0x22,0xda,0x8f,0xcd,0xf0,0x67,0xdb,0x14,0x51,0x00,0x7c,0xab,0x60,0x7f,0x04,0x9c,0x2e,0x26,0x07,0xb5,0x7d,0x44,0x71,0x3c,0x04,},"\xdc\xb9\x1c\xf1\x55\x46\x1a\x60\xdf\x07\xee\xc2\x9d\x98\x61\x6e\xd1\x72\x8b\x34\xef\xa9\xe1\xf7\x44\x5a\x91\x58\xa8\xf8\x8d\x7f\xaa\xae\x0e\x24\x72\x5a\xef\xf2\x63\xc3\xf7\x4f\x0c\x68\x4f\x18\x58\xf0\x5b\x69\x95\xd2\x84\x6b\x6a\x83\x2f\x67\x08\x5a\x42\x76\xd8\x66\x1a\xeb\xd3\xbf\xcc\x73\x18\x1f\x1f\x51\x02\x93\xb6\xde\x5e\x4b\xb2\x3f\xf2\xdc\xa1\xdf\x60\x8c\xb1\x4a\xe5\x22\xac\x4b\x51\xe1\xf9\xb9\x73\xab\x8b\xaf\xcd\x53\x4e\x71\xc5\x71\x81\xb1\x18\x96\xee\x10\x61\xfb\x36\x9c\xa4\xd2\x93\x9d\x1e\x57\x06\x0d\x9f\x4d\xb0\xa5\xc0\xb0\x7d\x52\x68\x7f\x15\x78\x17\xe6\x3e\x2f\xe7\xeb\xcc\x3e\x7c\x95\xef\xe0\x5b\x85\x99\x10\xc9\x5e\xed\xe8\x6d\x14\x39\x9e\x61\x62\x48\xa2\x8c\x24\xc4\x14\xdb\xb6\x93\xaf\x9b\xe4\x35\xa3\xa9\xcd\xc3\x3e\x0e\x2a\x58\x69\x18\xd9\x1b\x8a\x85\xce\xdd\x16\x12\xd7\xc1\xa2\x17\x92\xbd\xd4\x3a\x91\x5b\x15\x7e\x04\xbb\x3a\x44\xec\xbe\x23\xfa\x49\xcc\x55\xda\xab\xbe\xaa\x15\x5a\x73\x7f\x76\x5b\x8d\xdb\x0f\x3b\x15\xd4\xec\xf2\xce\xf7\x05\x4c\xa7\x3e\xc8\x7d\x91\x75\x2c\x2e\x99\x19\x5c\xdb\x19\x58\x84\x4f\x14\x4e\xda\xb8\x2a\x97\x54\x9f\xc9\xce\xc0\x8e\x87\x11\xcf\xf8\x63\xb6\x3f\xc2\x31\xa7\x7f\x76\x2e\x5c\xd9\xda\x9d\x59\x40\x92\x52\xe9\x9a\xb0\x4c\x42\xbc\x57\x09\x7e\x46\x4e\x3c\x6a\x48\xd8\x02\x41\xe6\x32\x5e\x3e\x40\x94\x98\x9b\x34\xc0\xe8\xb3\x2b\x1a\x78\x29\xd5\x4d\xf3\x2a\x05\x0e\xe8\x7d\x8f\x7c\x4f\xe3\xe4\xf4\xf7\x04\x9d\x1f\xee\xcd\xbe\xa6\x71\x08\x35\x0d\xb4\xe8\xed\xbe\x3c\x3f\xf8\xab\x2a\x25\xd1\x47\xb1\xc1\xc5\x82\x1b\x0f\x8c\x21\x04\x2d\x65\x5d\xb8\x31\x69\x1f\x59\x98\x3f\x27\xd2\xed\x1d\x49\x06\xc5\x44\xe2\x4e\x79\xbe\x68\x65\x3c\x9b\x22\x9a\x7f\xb6\x1e\xf5\x45\xba\xb1\x6e\x98\x81\xcb\x4d\x92\x65\xe2\x93\x59\x0a\x0b\xc2\xdc\x86\xba\xd2\x30\x07\xff\x40\xc9\x58\x61\x92\x3b\x49\x82\x41\xc1\x0d\x26\xbf\x48\x48\xf6\x2b\xa7\x38\x3f\x64\x9d\xc3\x8a\xf1\x84\x0d\x0d\xe9\x28\xa9\xbf\xee\x5e\x11\xb5\x14\x34\x16\x3a\x7a\xb1\xed\x53\x74\x15\xf1\xe9\x32\x85\xe3\x69\x92\x05\x72\x01\x58\xf9\x55\x7d\x86\x41\xed\x2b\xf4\x85\xb8\x21\x2c\x8f\x82\x66\x8b\xac\x3c\x22\x8e\x69\x24\xc1\x7d\x0d\x98\xf2\xe6\xd9\x23\x43\x71\xc4\x42\x5e\xb7\x58\x68\x9f\xdb\x0d\xc1\xce\xa1\x39\x4a\x28\x62\xe8\x7b\xb3\x8e\x62\x4c\x34\x79\x91\x68\x61\x32\x78\x22\x5f\xb5\xe1\x9c\x92\x47\xad\xa3\x55\x54\xf2\xc4\xad\xdb\xb6\x1d\x5a\x50\x2a\x70\x81\x27\xd6\xef\xbc\xa8\xf7\x35\x09\x0b\xdf\xdd\x88\xdb\x29\xfb\xd1\x4b\x69\xab\x12\x62\xf0\xc3\xe2\x6d\x26\x3a\x59\xc5\xae\x46\x39\x06\x53\x83\xd5\x25\x0b\x54\xcf\x59\x2b\xb7\xad\xfe\xaa\xe0\xd2\xfe\x81\x6b\x63\x81\xe8\x6e\xa2\xd1\xc7\x18\x13\xcb\xc3\xd8\xfe\x2d\x31\xde\x7b\x30\xfb\x6e\xc2\x29\x4f\xe4\x53\x6a\x36\xc6\xa1\x83\x5a\x71\x62\xab\x4b\xf8\x9d\x19\x46\x61\x19\x65\x7b\x0e\x46\x45\xae\xf5\x03\x50\x5b\x4d\x55\xdf\x97\x7b\xd2\xc9\x0c\x64\x40\x6f\x49\x70\xd5\xcf\xf2\x45\xb8\x35\x32\x2a\x6f\xbe\x23\x4e\x5e\xfb\xb5\xea\x45\xe8\xf0\xd3\x97\x3b\xe4\xaa\xa2\xaa\xda\xab\x07\x7d\x6c\x9b\x25\xbd\x44\x94\x40\x9e\x93\x47\x9d\x2d\x15\x07\xf6\x6b\xc8\xbe\xf8\x29\x99\xa1\x3c\x79\x43\xb4\x72\xb9\xe6\x1e\xc2\x9d\xeb\xef\xbf\x22\x41\x42\x3e\x0f\xaa\x42\xc1\xa3\x38\xa7\xa6\x13\x1d\xed\x93\x5b\xa0\x3a\x28\x66\x2e\x68\x59\x33\x68\xdd\xe5\x4b\x46\x2f\x2a\x5f\xb7\x46\x18\x5f\xf5\x50\x3e\x69\xba\x36\xbf\x16\xf7\x14\x58\xcd\xd0\x57\xe5\xc1\x72\x67\xf6\x74\x98\xd6\x52\x86\x0b\x46\x5e"}, -{{0xf6,0xc9,0xab,0x5e,0xa7,0x5f,0x29,0x4e,0x8e,0x0c,0x07,0xc4,0xc0,0x9e,0xd8,0xee,0xa3,0x11,0x3b,0xdf,0xc2,0xef,0x75,0x9e,0x20,0xa2,0x64,0x57,0x16,0x04,0x10,0x8d,},{0xb1,0x2f,0xf5,0x5b,0xd3,0xec,0x42,0x61,0x0e,0xac,0xea,0x28,0xb3,0x13,0xa1,0x6e,0x19,0xc9,0xe8,0xb4,0x7c,0x2b,0x15,0x17,0x09,0x91,0xbe,0x08,0x8d,0x65,0xcf,0x63,},{0xa7,0xf9,0xd0,0x8b,0xa1,0x41,0x83,0xef,0x24,0x7f,0x2c,0x25,0xfe,0xcc,0x2b,0x83,0xed,0xa6,0xde,0x58,0x02,0x2e,0x46,0x6c,0xe7,0x8f,0xcf,0x50,0xf7,0x1c,0xe2,0x61,0x62,0x44,0x65,0x62,0xee,0xa4,0x5d,0x63,0xa2,0x1c,0x3b,0x22,0x56,0x1f,0xd4,0x68,0x00,0x58,0xac,0xb8,0x25,0x40,0x7a,0x15,0x40,0x8f,0x27,0x13,0x61,0xa1,0x46,0x0f,},"\x71\x62\x3b\x39\x74\x3e\x39\xc7\xe0\x86\x38\x80\x6d\x46\x8a\x1a\x8a\x6f\x35\xc2\xae\x38\x8e\xef\xc2\x73\x74\xbb\x52\x53\x88\x14\xc4\xb3\x6c\x9b\x8e\x38\x9a\xd8\x31\x83\xde\x02\xa1\xbb\xd0\x32\x57\x34\xe4\x61\x87\x54\x09\x23\x37\xd3\xe7\xdc\x12\x56\x92\x8e\x35\x28\x87\x0c\xa7\xf0\x06\x13\xa2\x5b\x71\xbb\x15\xd1\xd9\xea\xaf\xf9\xf2\x26\x9b\x71\xc1\x97\x69\xe0\x03\xce\x84\x56\x14\xb2\xec\x95\xed\x28\xca\x85\x5b\x52\x21\xd4\xcb\x80\xa6\xca\x94\x66\xaa\x33\xe2\x51\x0d\xdf\xf7\xdc\xe1\x86\x15\x9d\xa7\x0f\xc8\xb1\xfb\xac\x12\xa2\x6e\x1f\xc0\x94\x22\x76\x89\x2a\xd6\xe9\xb0\x03\xf5\x69\x59\xbd\x31\x3a\xf2\x89\xe7\xa0\x53\x2a\x66\x4b\x76\xb9\x6b\x91\x98\x54\xe0\x65\x0c\xb8\xc5\x2e\xc4\xc5\xfb\x50\x53\xaf\x2f\x0c\xf8\xc0\xf2\x2a\x52\x3f\x9e\x2c\x64\x19\xdf\x8d\x0b\x71\x4e\xe3\x77\x68\x00\xeb\xfa\x70\x77\x60\x84\x66\x7d\x6d\xcf\x54\x1f\x14\xcf\x16\x62\x62\xe0\xf6\x4c\x42\x76\xae\x28\x88\x5e\x6c\xfd\x09\x7b\x70\xc0\xd6\x18\x6e\xa5\xdb\xd0\x33\x32\x3c\x98\x76\x13\xda\x08\x64\x5d\xe0\x72\x08\xba\xe1\x2a\x17\x8d\x8f\x7f\x65\x0a\x25\xaf\xbd\x70\x1c\x85\xa1\xba\x63\x9e\xf9\xf1\x21\xc4\x0c\x5c\x12\x9a\x47\x37\x34\x33\x86\xa4\x81\x83\xff\x3c\x59\x13\x89\xd8\x9e\xcd\xa5\x26\xcf\xfb\x26\x74\xf1\x7b\xb1\xc2\x30\x90\x55\x4b\x13\x40\x84\x97\x96\xa6\xd4\x44\x46\x0b\xb4\x19\x42\x7e\x93\xe6\x58\x5b\x0f\x4f\x06\x5a\xd8\x7e\xe6\xed\xf5\x4b\xe6\x18\x8a\x1d\xd5\xac\xe1\x36\x4d\xef\xa5\x61\xf7\x4e\x26\x76\x9c\x9b\x29\x1e\xe7\x55\x52\x76\x50\x1c\x6a\x49\x08\x0d\xa0\x92\x4f\x37\x92\xc2\xa7\x28\xa5\x20\x07\xb1\xc0\x7c\x95\x57\x8f\xed\xaf\x40\x39\x96\x23\x9e\x9c\x55\xa9\xa4\x4c\x3d\xfc\xc3\x7c\xdf\x03\xfb\x48\x5d\xb5\xa0\x8d\xff\x15\xa7\xa4\xf7\xb7\xf1\x54\x74\x2e\x84\x31\x56\x4d\xc1\x7d\xbd\x43\x2e\x10\x33\x7c\x22\x76\xfc\xfd\x9d\x70\xf7\xc3\xd5\x70\x39\x3a\x0c\x19\xf6\x40\x51\xc7\x3a\x87\x0e\x20\x55\x84\x10\x65\x31\xd1\xfd\x2a\x1d\xd1\xc9\xd0\xfc\xe1\x4f\xfa\xaa\x07\x7b\xb7\xe2\x60\x25\x1e\xed\x6c\x62\xbc\x6e\xdc\x24\x22\x51\x94\x40\xc2\x24\x4e\xba\x38\x40\x46\xb0\xed\xda\xa6\xcf\x2c\x1c\x7e\xee\xbf\xcd\x78\xfc\xae\x18\xb8\x22\x90\x55\x2b\x59\xc0\x46\x3d\xc4\x50\x61\x8b\xa6\x7c\x77\x0d\xec\x0e\x22\x9b\x84\x60\x93\x6c\xa8\x19\x56\x2b\xcb\x36\x96\x9c\x8f\xf7\x0b\xf1\x13\xc1\x16\x71\xe0\x0b\x94\x13\x55\xbf\x01\xad\x54\xb0\x5c\xfe\x2a\x04\x8b\x38\x72\x8c\xbd\xd1\xb4\x98\x09\xe1\xf2\x07\xac\xa3\x09\x8d\x99\x42\xee\xc4\x7d\x6c\x9d\x41\x3b\x37\xc9\x14\xfe\xdd\x38\xac\xd5\xff\xe4\x96\xca\xc7\x57\xc2\xef\x8b\x77\xbd\x84\x03\xd1\x4b\x1f\xc9\x8a\x90\x3f\xe2\xb9\x79\x46\x82\x33\xa7\xf2\xae\xd6\xf8\xd5\x09\xd8\x74\xe1\xdc\xe0\x51\x49\xaf\x9d\xf3\xfe\x45\x95\xc7\x1e\x8b\xc4\x63\xde\xe9\x38\x4d\x5e\x05\x05\xd2\xa6\xb0\xa2\xb8\xa1\xed\x62\x16\xaa\xae\x9d\xcc\x76\x02\x48\x7a\x4c\x08\x51\xfd\xf0\x96\x29\xc1\xe9\x91\x18\x80\x9a\x95\x44\xa6\x57\x7a\xf9\xf9\x15\xd1\xe6\x5d\x81\x62\x20\xc4\x8c\x84\x90\xfa\x9b\x70\xda\x42\x2a\xd6\x80\x02\x23\xd6\xd8\xc3\x40\xf9\xea\xb2\xcc\x7e\x14\x93\x62\x12\x4a\x30\x0b\x40\xcb\xb8\xc0\xa6\x5d\xa3\x01\xdb\xba\x93\x1b\xa5\x64\xf3\x59\x73\xca\x8b\xf2\xd1\xed\xb5\x6c\x19\x46\x61\x95\x5b\x3b\x68\x38\x1f\xa1\x5d\x4b\x8d\xc6\xad\xa1\xa5\xce\xbd\xa3\xa4\xcc\xc5\x51\x23\xe0\x05\x7f\x4f\x82\x10\x41\x93\x7d\xd5\x49\x20\x9c\x82\xe1\x16\x57\x0b\xc9\x08\xa2\x8e\x32\x99\xa9\x44\x14\x43\x49\x8f\x74\xb3\xcc\x88\xe1\xa6\x2d"}, -{{0x43,0x10,0x3d,0xf0,0x1a,0x48,0xa0,0x3c,0x57,0xf3,0x2f,0x52,0xd7,0x0c,0x68,0x49,0xee,0x44,0x58,0x0b,0x2a,0xb4,0xee,0x72,0xd5,0x48,0xd8,0x48,0x13,0x4f,0x7c,0xeb,},{0xa3,0xcb,0xe0,0xd6,0x4b,0x05,0x60,0xbc,0xb5,0xae,0x00,0x90,0x01,0xe3,0x14,0xd9,0xec,0x90,0x79,0x01,0xdd,0x74,0xa8,0x04,0xa0,0x05,0x90,0x22,0xed,0x9c,0x6d,0x04,},{0x19,0x54,0x47,0xbe,0xb1,0xde,0x4a,0x7e,0x36,0xea,0x89,0xa6,0xce,0x3c,0x99,0xbc,0xc8,0x94,0x11,0xdf,0x5e,0x0b,0x15,0xf7,0xba,0x0b,0x1d,0x11,0x0c,0x45,0x6a,0xbc,0x6b,0x3f,0x5f,0x1d,0xa6,0x10,0x6e,0xd8,0x87,0x86,0x4b,0xa5,0x6a,0xab,0x46,0x6a,0x8a,0x63,0xb3,0x35,0xcf,0xcf,0x4c,0x64,0xd6,0x5c,0x0e,0x6f,0xb4,0x80,0xb4,0x01,},"\x73\x8c\xbf\x06\xd0\x0d\x4d\xcd\x5e\x5f\x24\x3a\x1c\x18\xdd\x5e\xc2\x02\x78\x88\x46\x95\xa1\xcf\x3b\xea\x67\xbb\x5b\x05\xdd\x7e\x60\xa2\xa2\x4f\xd3\x25\xbe\x6b\xf4\x6b\x46\x28\x73\xec\x90\x7f\x9d\xe8\x8d\xc2\xc7\x62\x62\x0b\x7e\x0e\xf7\x27\x65\xd4\xbd\xa6\x62\x45\x49\x93\xc8\x28\xa1\x74\x6e\x9e\xd8\xd1\x9d\xff\x43\xc4\xc4\x85\x27\xac\x84\x5f\x21\x86\xa4\xad\x7c\x1d\x99\x2a\x16\x24\x5c\xd5\x73\x07\x3e\x09\x40\xdc\xee\xd3\x68\x11\x0b\xb5\xfd\x0a\x4c\x88\x34\xce\x88\xa7\x71\x25\xb9\x14\x73\x93\xc8\xb5\x8c\xb1\x6e\x5e\xbd\xc1\x82\x44\xeb\xfa\x48\xba\xba\x46\x97\x3f\xdc\xd4\x85\xb1\xb2\xe5\xf3\xb0\xe7\x09\x92\xcf\x19\x99\x58\x06\x38\xd8\x7f\x1f\x5b\x27\xc4\xd7\xf9\x1d\xec\xf3\x7d\xe2\xe7\x34\xe3\x19\x55\x35\xc6\x31\x08\x2b\x3e\xba\xa8\xce\x30\xa9\xc2\xc2\xdb\x01\x6d\x7d\x35\x47\xe6\x21\x61\x88\x50\xe2\x20\x40\x03\x8d\x0f\xe0\xfa\xea\x2f\x9b\xf5\x10\xb6\x82\xc4\xfd\x14\x75\x0e\x89\xb4\xc1\x99\xef\x0c\x99\x05\x00\x54\x3e\xee\xab\x5f\x0b\x50\x7a\x31\x31\x99\xc2\xa2\xa0\x26\x2d\x6d\x81\x4c\xbc\x09\x33\xc5\x92\xe2\x56\xc3\xe2\x9d\x52\x4b\x06\x6e\xa5\xa4\x54\x33\x61\xa1\x04\x50\xe0\xaa\x67\x5c\x61\x40\x8f\x30\x7f\x26\xee\x58\x96\x9d\x63\x27\x8f\x13\x5b\x7d\xcb\x66\x6b\x93\xf2\xca\xcf\xd8\x38\x73\x47\x1e\x97\x4a\x28\x6b\x09\x02\x3f\x50\x15\xfa\x1a\xaf\x18\xbf\xbf\xa5\xf7\x43\x85\xd0\xdf\x6b\x9a\xdd\x51\x6f\xfc\x0c\x31\x13\xe3\x7e\x09\x78\x38\x64\x6a\xc9\x30\x54\xff\x4d\x96\x02\x06\x67\x44\xba\x33\x96\x95\x3f\xd7\x81\x68\x13\x01\x70\xbb\x27\x5c\x15\x2b\xdd\x36\x6f\x73\x06\x5c\x0a\x7a\xd7\xad\x00\x75\x8c\xb9\x9a\x7a\xc1\xb7\x80\x9d\x26\xdf\xaa\xc7\x58\x46\x82\x01\xee\xb6\x0d\xea\x36\x8c\x33\xf2\x57\xaf\xe2\xf1\xb4\xc0\x2e\x37\xba\xfe\x40\xf5\xd7\xfd\x40\xc8\x7d\x1c\x56\xa0\xcb\x28\xe9\xd2\x83\x69\xa3\x92\x4b\xce\xf8\xb6\xd9\x99\xdc\xf4\x29\x4d\xd8\xc4\x14\x3d\x75\xc6\xc2\x5b\x5a\x45\x44\x48\x8d\xde\x72\x52\x48\xc7\x8d\x93\xc1\x5b\x81\x5b\x01\xcb\xd0\xf3\x1d\x1b\x00\xac\x04\x83\x7e\xf8\x5b\x40\x03\xfc\x96\xd4\x45\x7a\xc5\xa0\x23\x62\x3e\x67\xb6\x6d\xa4\x70\x0a\x08\x59\xf8\x3f\xdc\xcd\x3c\x7a\xae\x09\xde\x09\xa0\x57\xe0\x0d\xb4\x4a\x2a\x6a\xac\xaa\x21\x74\x6a\x49\xb8\x22\x46\x89\xa5\xcc\x18\x54\xba\x3d\xc4\xaa\x2a\xa3\x45\x24\xe7\xa5\xa8\x9d\x11\xee\xa3\x56\xaa\xea\x5e\xf5\xfb\xf5\x42\xc9\x9f\x54\x4d\xb9\x40\xf5\x08\x68\x38\xee\x2a\xb2\x18\xb8\xd3\xf2\xe1\x07\xd0\xb2\x9d\x4b\x04\x83\x0e\xed\x79\xc0\x76\x8e\x02\xc2\x84\x4b\x3c\xba\x32\x68\x95\xf4\xab\x38\xa3\x99\x4b\x83\xab\x30\x60\x0f\xf5\x11\xcc\xb5\x95\x99\x2f\x8c\xc0\xd2\x95\x48\x07\x97\x2d\xa3\x65\xb0\x6f\xbd\xab\x53\x9b\x2e\x03\x59\x8b\x34\xe5\x3c\xfc\xf9\x39\x90\xb9\x7a\xac\x1d\x32\x97\x83\x36\x6d\x45\x1f\x97\x2b\x8d\x8a\x00\xb6\xb8\xec\xdb\x37\x27\x96\x44\xce\xc1\x44\x7c\x09\x98\xee\x4f\x70\x90\xf3\x4c\x9c\xc8\x53\x05\x90\xca\xe7\x65\x36\x0a\xad\xb0\xab\x31\x35\x00\x49\x41\xc9\x23\x02\xcb\xb2\xb3\x50\xa1\x4e\x8f\x30\xaf\x53\x25\xc2\xb4\x38\x00\x5e\x3a\x9d\x45\x85\xe6\x32\x65\xc3\x27\xba\x72\x57\x54\xb3\x32\x56\x91\x7f\xb9\x65\xae\x9f\x02\xed\x21\x26\xb4\x81\x47\x3d\xc0\xe9\x31\xc2\x52\x2b\xf0\x0f\xe6\xa2\xec\x95\xc7\x92\x24\x7b\x1e\x03\x39\x61\x12\xf7\x83\x07\x0e\x2f\xe6\xc2\xcb\x98\x22\x50\xd1\x3f\x2d\x54\x60\xc7\x44\xfd\xe4\x53\x23\xe6\x31\xcc\xcb\x54\x0c\xd7\x25\xf2\xc5\x5a\x70\x58\xf2\x30\xe8\x2b\x79\xf3\x66\xaf\xcb\xb0\x25\xb4\x92\x55\x43\x95"}, -{{0xf9,0x13,0x9e,0x57,0x9f,0xa9,0x6e,0xbd,0x62,0x87,0xdb,0x3b,0xab,0xcd,0xa6,0x0f,0x92,0xe7,0x31,0x53,0x56,0x6f,0x92,0x4c,0xb5,0xde,0x04,0xde,0x44,0x93,0x48,0x1e,},{0xc0,0x6c,0xe3,0x35,0x53,0x3a,0xf8,0xd8,0xf3,0x37,0xf2,0xb3,0x8e,0x0a,0xaf,0xa2,0xce,0x9b,0x27,0x22,0x3c,0xd9,0xdd,0xc5,0xef,0x32,0x02,0x7f,0x04,0x88,0x9b,0x7f,},{0x05,0x1d,0x8d,0x7f,0x0b,0x68,0xd2,0xee,0xc7,0x2c,0x81,0xad,0xfc,0xfb,0x31,0xae,0x85,0x58,0xf6,0x0a,0xb6,0x3c,0x9f,0x56,0x52,0xa8,0xdf,0x63,0x8f,0x66,0x6f,0x1e,0xbc,0x0c,0x6e,0x0b,0x41,0x19,0x53,0xbc,0xda,0x6b,0x51,0x51,0xb2,0xb9,0x3a,0x39,0xe3,0xc5,0x33,0x0a,0x85,0x73,0xe1,0x68,0x79,0x22,0x72,0xab,0xd3,0x6c,0x81,0x0a,},"\xb3\x30\x76\x4d\xdc\x62\x8e\x4a\xd6\x7a\xa4\x98\x2a\xe8\x6d\x45\x81\x07\x1c\x19\x3e\xc3\xc5\x8f\x81\x3d\x79\x21\xb8\x4d\x2a\x54\x56\x2b\xd8\x74\x17\xae\x1d\xe5\x90\xa1\xa4\x8c\x4e\xc7\xd5\x56\xad\x93\x1d\x65\xc0\x54\x3f\xdf\x06\x07\xc7\x49\x85\x9e\xe1\x2f\x99\x52\x02\x0c\x19\x5c\xf8\x74\x60\x95\xe1\x08\x7c\xc6\xc3\xc8\xef\x9d\x24\x05\x25\x60\xce\x81\x3d\x61\x39\xb7\xa7\x5c\x8f\x4b\x8e\xa3\x0a\x9c\x4a\xb8\x88\xd0\xa6\x34\x1c\x99\xab\xd3\x5e\x09\x03\xbf\xe5\x6c\x93\x15\x23\x40\xc4\x12\x76\xd7\xf2\x4e\x09\x12\xb1\x2a\x4d\xb3\xd7\xee\x44\x84\xdf\xa5\x3a\xfc\x0b\x1a\xea\x14\x09\xd1\xe0\x32\x8a\xa1\xc8\x60\x41\x27\xca\x2e\xb1\xa5\xe8\x1b\xf3\x1f\x8c\x7a\x51\xc6\x05\x2c\x53\x4e\xfe\x6b\x3d\x0e\xe7\x4f\xf5\xa9\xb1\x1c\x61\x57\xe3\x64\x77\xef\xa9\x38\x2f\x57\x51\xbe\x8c\x8c\x64\x54\xc4\x46\xd6\xf8\xdc\x7e\x92\x95\x25\xcc\x3d\xe7\x8c\xb1\xba\x4a\xba\x9b\xd4\xbe\x15\x26\x10\x43\x75\x82\xc9\x65\xee\xa4\x8c\xbd\x4c\xaa\x6f\x30\x8f\x85\xf4\xf8\xd0\x06\xa0\x42\xf6\x19\x20\x07\x62\xe1\xbb\x9b\xa4\x22\xe6\x54\x75\xb3\x3a\x94\x94\x29\x8c\xfb\xb7\x5a\x15\x2b\x36\xd2\xa0\x55\x01\x80\x77\x05\xb9\x52\x76\x53\x50\xcd\x14\x14\x1d\x35\xd4\x98\x66\x92\xd6\xc3\xbc\xfc\x6d\x61\xdf\x00\x52\xa6\x20\xaa\xb8\xcc\x13\x20\x5e\x75\x4c\x16\xf9\x3e\xca\x79\x20\xbb\xea\x51\x57\xef\x11\x2f\x0b\x64\xc1\x05\x4f\x90\xa5\xdd\xc1\x75\xa8\x9e\x29\x24\x2f\x57\x64\x6e\x74\xcc\x88\x5e\x81\xa1\xcc\x14\x4c\x3d\x78\x2d\x11\x52\xa9\xe4\xcf\xe7\x6c\xb3\xff\xab\xe7\xdb\xe6\x03\xfb\x38\x69\xec\xa8\x69\x96\x98\x70\x9c\xc8\x7f\xc9\x61\xc1\xe2\x99\xcf\xca\x22\xe3\x24\x2e\xae\x78\x8c\xff\x11\xbf\xca\x61\x02\x67\x45\xf4\x97\x62\x25\xb2\x6e\xe2\x00\xc4\xf1\x91\x0c\x4b\x83\xdf\x5c\xe4\x6e\xf4\x87\xd7\x48\xd9\xc4\xc5\x02\x14\x1b\x78\x74\xca\xf4\x1e\x5a\x29\x7b\x24\x8c\x2b\xac\x69\x90\xa1\x5b\x07\xb4\xcf\x81\x0e\x59\x28\x74\x42\xd9\xa3\x69\x6c\x02\xe8\xd7\x32\x4d\x3c\xf7\x30\xdd\xa5\x40\x53\x6b\xeb\x13\xcf\xde\xae\x61\x80\xdd\x74\x84\x83\x2d\xfa\x94\xe9\x4a\xa6\xcb\xa1\x17\xaa\xe1\x72\x70\xf4\x8f\x93\xb2\xf9\x8a\xe9\x58\x17\x18\x16\x3f\x44\x63\x54\x6c\x0a\xe0\xf2\x79\xc3\x6b\x92\xbe\xe6\x6f\x1c\xa2\xd6\xa4\xf7\x26\xd2\xdf\xee\x0b\xc1\x1c\x1d\x8a\x1f\xa6\x2c\x3c\xc8\xab\xa2\x66\xb9\x87\x59\x28\x6c\x10\x68\x48\x3b\x23\x76\xb4\x03\xc8\x87\xfb\xb6\x57\xdc\x0f\x25\x5d\xea\x90\xdb\xd2\x33\x08\xf7\xe0\xe8\x42\xb4\x98\xa8\xdf\xc7\xc9\xcd\x5a\xef\x0e\x87\xd5\x6b\xe4\x0d\x50\xfc\x1d\xd4\xc0\xaa\x7d\xee\x55\xae\xbe\x4d\x6b\x6a\x52\x05\x39\x62\xb8\x7b\x0f\x2e\xe0\x9a\x90\x81\x61\x55\x33\x3d\x5c\x57\xa1\x47\x24\xe0\x01\xbc\x3d\xed\x17\x84\x3b\x76\xe2\xc4\x7a\x17\x63\x39\xc8\xde\xfc\x54\xb5\x5b\x23\x58\xae\x7d\x01\xb0\xf6\xe0\x8f\x31\x21\x6a\xe9\x03\x40\x69\x41\x68\xa5\xa7\x9e\xe8\x83\xea\x78\x58\x00\x7d\x17\xc3\x73\x59\xc9\x9d\x65\x97\xef\xe4\x60\xc1\xa2\xf7\x73\x8a\xc3\x2c\x5e\xb5\xe3\x9e\x50\x0c\x49\xc0\xdf\xf9\xc4\x65\x9e\x8c\x50\xcc\x5c\xa7\x9d\x8b\xa4\xe5\x97\x2d\x67\x22\x54\x68\xfb\xa6\x41\x67\xa6\xb2\xc6\xf3\x68\x93\x5c\x7a\x04\x9d\x35\xd3\x55\xc7\x67\x25\x20\xd3\xc9\xe4\xe4\x3c\x67\x1c\x3c\xb8\xde\xe2\x59\x04\x74\x95\xde\x0f\x56\xdd\x71\x91\xd5\xbd\x4b\xbd\x29\x51\x7e\x36\x47\x92\xff\x89\xd3\x37\x99\xb6\xe7\x81\xc2\x01\x93\xf5\xa3\x16\xfb\x40\xde\x74\xfe\xe2\xac\xc2\x5e\x47\xf5\x12\x21\x4d\xe3\xb1\xe9\xb3\x82\xa8\x69\x29\xc1\x57\x3d\x37\x24\xc2\x50\x17\xc0\xe5"}, -{{0xc8,0xee,0x95,0x4d,0xb5,0xa1,0x1b,0x29,0x2e,0xd9,0x77,0x64,0xfa,0xe6,0xb2,0x83,0x05,0x1d,0xb5,0x7d,0xcd,0xc0,0xaa,0x0d,0xf5,0x39,0x3b,0xb6,0x0c,0x11,0x2e,0xd3,},{0x5c,0x2f,0x81,0x82,0x4e,0x99,0x75,0xdd,0x7e,0xa3,0x53,0xbc,0x66,0x80,0x7d,0xed,0xc7,0x61,0x03,0x49,0x79,0x4e,0x2f,0xc0,0x8e,0x5a,0x31,0xe0,0x02,0xe3,0xfe,0x07,},{0xf3,0x07,0x7a,0x75,0x10,0x1e,0x12,0x1e,0x5c,0x3e,0x77,0xd8,0xed,0x97,0xb5,0x78,0xd2,0x39,0xbd,0x42,0x18,0x03,0xd3,0x45,0x5b,0x56,0x54,0x40,0x5a,0x4c,0x58,0x6a,0x60,0x92,0xe1,0x3a,0x85,0x29,0xba,0xce,0x46,0x8a,0x30,0x57,0x84,0xb3,0x73,0xe4,0x33,0xfe,0xe4,0xa3,0xdf,0x89,0x56,0xbe,0xfa,0x01,0x2f,0xd8,0xa8,0xee,0xd1,0x0c,},"\x7b\xa3\xfb\x56\x83\x15\xaa\x81\xe2\x1f\x19\x77\x80\xed\xc2\xc6\xea\x26\xd8\xd0\x6a\x43\x78\x91\x2f\xca\x23\x01\xcf\x1e\xab\x3d\x80\x3c\x84\x69\xde\xdd\xf3\x76\x70\x3d\xdb\x7c\xe0\x6a\x77\xda\xb2\x0e\x02\x34\x4f\xad\xcc\x50\x02\x2a\xb3\xc7\x13\xcd\x03\xc1\xda\xa9\x3f\x1c\x7e\xa5\x72\x62\x9f\x61\x0b\x5e\x3c\x51\x41\x1b\xb8\xc1\x96\x94\xbb\xce\x90\x3c\xac\x47\x05\xf9\xb5\xdd\x0f\x47\xbc\x5d\x0a\xa3\x25\x3f\x90\x88\x70\x29\x90\x27\xff\xbd\x34\x49\xee\xba\xd4\x53\x32\xb5\xd0\xc4\xf5\x33\xdb\xed\x18\xa9\x9a\x24\x98\xb9\x16\x4e\x24\x5f\xb6\x5c\x0a\xfa\x0b\x05\x37\x03\xa0\xcf\x95\x94\x0a\xc7\xa0\x19\x5d\x4f\x70\x46\x60\x9c\xf0\x43\x71\x33\x87\x06\xb9\xb1\x98\x6c\x0f\x11\x81\x75\xd2\xcd\xfc\xe7\x4a\x6f\x88\x65\x98\x25\x85\x4e\x94\xec\xe5\x8f\x51\x57\x63\x6d\x62\x35\xb7\x6d\x32\x74\x5a\x2a\x81\xa9\x67\x1a\x8f\x86\x02\x7b\xa9\xe0\x17\x63\x88\x8f\xc1\x71\xce\xf7\xc4\x51\xc3\x60\x72\xbc\x74\x99\x83\x9d\x43\x1c\xf1\x8c\xd7\xc6\xc9\xfb\xa3\xaa\x71\x2a\x05\x43\x28\xcc\xd6\x2b\xe4\x82\x0a\xbd\x5e\x78\x21\x62\x76\x46\x11\xd4\x53\x9b\xa2\xce\xbd\xc2\x09\xb3\xf4\xe4\xb6\x9c\x3d\x64\x07\x3e\x92\x0d\x21\x52\x14\xfb\x0f\xda\x44\x18\x5a\xad\xa5\xc3\x61\x27\xa1\x5b\xa1\x5c\xa2\x8a\x3a\xd0\x86\xe9\xd0\x33\x66\x86\x9c\x60\xc3\xfb\xce\xbd\x86\x9d\x2e\x40\x64\x3e\x83\x3f\x89\x48\x03\xf9\x80\xa2\xda\x7e\xa4\xe5\x9c\xe4\xd7\xc0\x6f\xd2\xaf\xf0\x87\xee\x7b\xcf\xdd\xaa\x3b\x32\x81\x7c\xe6\x3a\x63\x58\x7d\xba\xfe\xf3\x80\x01\x3a\x6f\x1e\xe3\x73\x4b\x94\xca\x3d\xf9\x64\x4d\xd0\x43\x43\x02\xec\xb3\x24\xaf\xe3\x5f\x46\x5c\x9c\x1c\x93\x1b\x27\x29\x4f\xc6\xee\x02\x72\xde\x22\x42\xae\x90\xd7\xf2\xe0\x67\x02\x7e\xf8\x64\x2e\x8f\x17\x1e\xd8\x80\xff\xab\xce\x8a\x20\xa1\xb3\xe3\x39\xad\x4e\x3f\x1a\x90\x01\xf2\x0f\x90\x02\x61\x88\xfd\xe3\x4b\x21\x7a\x6e\x26\xaa\xff\x18\x42\x2b\x7f\x84\x3d\x0f\xdd\xa3\x21\xc3\x19\xc7\x78\xf2\x31\x37\xf2\x0c\xcc\x1b\xda\x18\x90\xe5\xbc\x91\x6a\x54\x56\xd0\x68\xd3\x7b\x5a\xcc\x63\x47\x72\x0c\x56\xa5\xa4\x91\xbc\x34\x8d\x6c\x84\x8a\x9c\x8f\xec\xfe\x58\xc9\x2b\x1f\x30\x2f\xe1\x49\x19\x71\x8c\xd5\xe7\x8b\x7f\xd6\x01\xd0\x9d\xc0\x1e\x69\x04\x86\x1e\x8d\x68\xb3\xc5\x75\x35\xb6\x13\x66\x76\xcb\xc6\xe8\x39\xaf\x0d\xd7\x39\xdb\x89\xa7\xab\xd9\x13\xfd\xf6\xb0\x0e\x9c\xa0\x26\x02\xde\x6c\xa0\xaf\xd0\x91\x3d\x99\x2f\xba\xa8\xff\x82\x2b\x9d\x9b\x09\xdd\xa7\xa2\x9b\xe9\x19\x10\xd8\xfa\x3c\xaa\x2a\x5e\x51\x83\x46\xc1\x67\xc9\xf5\x19\x41\xcf\x73\x53\xf3\xf3\x4c\x1d\xab\x33\x48\x5d\x0a\x8c\x19\xda\xf9\x51\xfd\x3e\xf2\x0d\x0b\x11\x9d\x80\x38\xdf\x90\xc1\x14\xa2\x5a\x5b\x93\xae\x40\xec\x44\xb9\xa5\xd2\xbc\x1c\x65\x17\xc6\x82\x50\x0d\x4c\xdc\x19\x71\x42\xbe\xc3\xaf\x82\x32\xc0\x71\x42\x8d\xc5\x4c\x0d\x30\x45\x42\x72\xe7\x33\x6b\x0b\x58\x88\xa6\xe8\xfe\xcd\xe8\x59\xe2\xac\xcb\x7f\xb0\x94\xac\xc5\x4f\xfa\x48\x1f\x76\x23\xd9\x44\x69\x1f\x04\xfb\x36\x13\xa9\x95\x49\x80\xf1\x7e\x2a\xd2\x17\x3d\x68\xcf\x0e\xc1\xb6\x7d\x8a\x91\xd6\xec\x82\x94\x6b\xcf\x05\xcb\x90\x68\x1a\x71\x62\x7b\x59\x02\x38\x33\x4e\x3d\x5a\xb9\xda\x6a\x08\x9b\xd7\x26\x24\xdf\x90\x74\xcd\xd2\x30\x9e\x04\xdf\xca\xe0\x32\x81\x2f\xe8\x4f\x9d\xb8\x82\xcd\xea\xae\x69\xee\x5d\xaa\x5a\x66\xff\x42\x7f\xc4\x52\xed\xd0\x76\x9b\x6a\xab\xcc\x13\x9d\x0f\x70\xaf\x8b\x97\x43\x0e\x64\x4f\x58\xa4\x12\x87\xa9\x3f\x63\x1d\xed\xa8\x2c\xa0\x71\x6d\x79\x75\x4c\x5c\x50\x3e\x52\xa6\x65\xda"}, -{{0x6d,0xbc,0x55,0x9e,0x4a,0xb1,0x93,0xee,0xbf,0x70,0xc5,0xc3,0x2d,0x79,0x7b,0xe0,0x0b,0x73,0x11,0xe8,0xe6,0x69,0x1d,0xa9,0xaf,0xcc,0x18,0x72,0x91,0xf2,0x50,0x1c,},{0x38,0xa7,0x03,0x44,0x76,0xfb,0x93,0x82,0xf1,0x41,0x77,0x68,0xc4,0x21,0x62,0x95,0x1a,0x26,0x36,0x90,0x2c,0x38,0x98,0xc0,0x29,0xbe,0x27,0x8a,0xb4,0xc3,0x1f,0x31,},{0x31,0xf1,0x6a,0x7c,0xaf,0x2b,0x74,0xf6,0x5e,0x05,0x7c,0x93,0x33,0xa1,0xa2,0x63,0x3d,0xac,0x73,0x46,0x33,0x8f,0x79,0x85,0x10,0x73,0x0e,0xb8,0xd5,0xd3,0x25,0xfc,0x10,0x80,0xdd,0x5a,0xad,0x5f,0xce,0x05,0x34,0xe9,0x54,0x3f,0x3c,0x93,0x58,0x68,0x04,0x46,0x4a,0xf5,0x88,0x6e,0x86,0x44,0x12,0x9c,0x77,0xeb,0xaa,0x48,0x5f,0x01,},"\x88\xee\x23\x65\xf7\xcf\x9d\xe3\x3a\xcd\x53\x56\x49\x68\xb2\xdc\x7f\x73\x70\xb7\xe7\x03\x3f\x4c\x66\x3a\x88\xc2\x5f\x60\xf7\xf7\x11\xd6\x19\x08\xeb\xf1\xf5\xbb\x72\x83\x55\x53\xc8\xaa\x8c\x8e\x4f\xcd\xec\xd3\x79\x78\x23\x82\x89\xbf\x6c\xa8\x48\x76\xd2\x28\x21\x7a\x28\xd8\x1b\x0b\x45\x7c\x92\x2e\x91\xec\xba\x8d\x3e\x1d\x2e\x66\x59\xc2\xb0\xae\xa0\x51\xb9\xc2\xe0\x9c\x7d\xfe\xb5\x1d\x30\xed\xe7\x67\x57\x03\x41\xff\xac\x1e\xcf\x0d\xe2\x0c\x82\xd1\xe9\xed\x07\x75\xde\xac\x72\xda\x7c\x2d\xec\x23\x48\x65\xde\xc8\x3f\x67\x15\xe1\xc3\xc5\x9d\xe2\x03\x3c\xc2\x4d\x86\xbc\x2d\x31\xaa\x16\x64\x96\x86\xed\xe0\xdb\xbd\x89\x64\xc3\xa6\x4a\x3d\xca\x55\x88\xd7\x24\x8b\x1f\x24\xdf\x8d\x75\xf0\x9a\xac\x62\xc0\x78\x28\xca\x43\x1a\x3a\x2d\x77\xa6\x0c\xc9\x3c\xfa\x34\x95\xca\xbe\xb1\x90\x4e\xd5\xb5\x63\x98\x4e\x8c\x20\x77\x7b\xac\x87\x74\x10\x8a\x64\xed\xa5\x8f\xb3\x20\x24\x4a\x3a\xdd\x3e\x3e\x7a\x76\xcd\x13\x7c\xfa\x4a\x09\xb6\xe6\xe9\x30\x11\xea\x0a\xe6\x51\x71\xaf\x13\x07\x11\x76\x6c\xd2\x5b\x3c\x74\xec\x54\xc0\xbd\xfa\x02\xb3\x12\x0a\xc2\x90\x87\xeb\xac\x98\x37\xfc\xa6\x5b\xa9\x71\xbc\x42\x81\xdd\x55\x7c\x50\x0e\x22\x5e\xa6\x6c\x3c\x3f\xd5\x22\x06\xc1\x9a\x9f\x93\x95\x46\x31\x69\xf8\xc7\xa8\x46\xbd\x9f\x83\x4d\x7f\x33\x7d\x0b\x61\xfb\x30\xbc\xe2\x94\xf4\x78\xae\x1f\x1d\x97\x7e\x45\x4e\x43\x3e\xe8\x72\x9f\xb0\x65\xcc\xe0\x3f\xb2\xe4\x35\xdc\xbc\xbf\xba\x01\x53\x7e\x7a\x67\x62\xe5\x5e\x7e\xd2\x25\x28\x30\x37\x04\xbe\xb5\xae\x38\x1f\x2e\x18\x10\x56\xf2\x51\x33\x27\x3c\xf1\x7d\xdf\x2b\x06\xe2\xd9\x47\x7f\x2c\x09\x75\x5f\xc8\xd9\xc7\x3c\xb3\x31\x00\x46\x8c\x64\x13\x1c\x68\x6c\xac\x79\xfd\x38\x45\x01\xe5\x0f\x8b\x0b\xee\x28\xba\x39\x58\x3f\x42\xe4\xfd\x37\x99\xe2\x4f\x60\xda\x5f\xd3\xc7\x79\xaa\xbf\x69\x9f\xfd\x23\x21\xed\x04\x5a\x85\xbc\x64\x24\xf6\x0f\xdc\xc4\x9c\x1c\xb3\x1f\x24\x9a\x42\x36\xc0\x94\x91\x76\x81\x81\xb9\x21\xf5\x86\x02\xfd\x41\x5c\x1e\xde\xb2\x6f\x39\x32\x4a\xdd\xff\x14\x77\x13\x24\x73\x7c\x67\x20\xcc\x92\x39\x1b\x94\x9d\xcb\x42\x12\xbd\x69\x31\xd4\xde\x51\x40\x1e\x7f\x95\x3b\x7b\x03\x6b\x22\x3f\x0a\xf7\xa8\xe4\x08\xb0\x4e\xa6\x35\xa2\x3f\xa0\x70\x9b\xa0\x42\xa5\xd9\x92\x95\x4c\x09\xd8\x58\x1d\xcc\xcf\x52\x56\x8a\xd2\x7a\x1c\xc7\x1d\x18\xaa\x27\x40\xf6\x21\x21\x2e\x7f\x4c\x5e\x5e\x5e\x5e\x45\x32\xd9\xa6\x7e\xc2\x77\x3a\xc2\x1c\x8a\x4b\x00\x2d\x65\x24\xf6\x18\x2d\xd3\x71\x73\x5d\x2c\x2a\xbe\x6c\x95\xc2\x81\xc6\xfb\x1e\x97\x6b\xc1\x7e\x38\x3f\xd5\x2a\xea\xaa\x9f\xbd\x4a\xbb\x82\xa2\xcc\x65\x39\x5f\x8c\x2c\xc7\xd8\x18\x2a\x0d\x25\x0c\x68\x5c\xfc\xba\x93\xa9\x51\xee\x7c\x50\x3c\x6e\x3e\xec\x23\x6c\xe3\x3e\x08\x6c\x61\x07\x28\x73\x7c\x1c\x3b\x3a\x24\x25\x2d\xa7\xf2\x16\x72\xd9\x28\xeb\xda\x99\x3a\x94\xc4\x58\xab\x99\x0f\x5d\x19\xd8\x00\x23\xc3\x6a\xa1\x6e\xaf\xca\xb1\x43\xf3\x52\xe9\x7d\x64\x09\xf3\x24\x99\x41\x11\x9b\xfd\x9f\x5f\x90\x84\x72\x4d\x9e\xba\xd3\x83\xb1\x0f\x34\xd3\x3a\xc8\x30\xcc\xe9\xe5\xcb\x8a\xec\xee\x6f\x40\x30\x1c\xbb\xe3\x09\xfd\x06\x15\x34\xa7\xd0\xc3\xed\xaa\xea\x02\xa1\x71\xd8\xb2\x34\x9d\xbe\xec\x62\x85\x20\xac\x33\x4a\x5b\xfe\x28\xa9\xd5\xf4\xc0\xd7\x40\xf7\xc7\x2d\x4d\x72\xd8\x9a\x97\x32\x6a\x03\x00\x2d\x1e\xf3\x85\x22\xbc\xd3\x7b\x42\x84\x7a\x31\x4b\xd8\x43\xec\x88\xd1\xf2\xf9\xd3\x9f\x57\xf2\xf1\xa1\x3d\x01\x40\xa8\x84\x74\x50\x44\x8c\x88\x0b\x3a\xe7\x65\x31\xe9\x5c\x43\x92\x97\x32\x50"}, -{{0xc9,0xd4,0x16,0x83,0x0a,0xe2,0x02,0x8f,0x21,0x75,0xd2,0x2b,0x61,0x4c,0x79,0x19,0x8c,0x67,0x0c,0xfa,0xa0,0xe7,0xa3,0x61,0x50,0xef,0x0f,0xee,0x21,0xa9,0x5c,0xe6,},{0x6e,0x3e,0xb4,0xd0,0x18,0x73,0x07,0x2d,0xf9,0x46,0xf1,0x79,0x2f,0x71,0x06,0x33,0x08,0x95,0xe7,0xa7,0x6d,0xd9,0xae,0x27,0xf8,0xa9,0x88,0x03,0x94,0x90,0xfd,0x4b,},{0x47,0xfa,0xad,0x4e,0x65,0x52,0x93,0xed,0xa1,0x56,0xb2,0xa1,0xfa,0xbb,0xfb,0x7e,0x00,0x9f,0xc2,0x90,0xaa,0xfe,0xdb,0xd5,0x65,0x21,0x14,0xa4,0x78,0x53,0xbc,0x77,0xa8,0x23,0x3a,0x2b,0x17,0x9f,0x60,0x54,0x77,0xd7,0x87,0x87,0x8c,0xbb,0x15,0xea,0x61,0x24,0xdf,0x8d,0xc5,0x7b,0x2c,0xe7,0xbe,0x7d,0x18,0xb7,0x16,0x2f,0xb5,0x0d,},"\xff\x9a\xd4\x83\x7c\xd0\xbb\x77\xd6\x21\x0f\xdd\xdc\x75\x5e\x6c\x0f\x1a\x73\xc2\xbc\xd0\x3f\x7a\x58\x69\xe7\x34\x2c\xfd\x73\xcf\x70\x86\xf8\x65\x56\x15\x60\x27\x7b\xf6\xc3\x42\x1a\x91\x2d\x67\x65\x8b\x1f\xa9\x70\x57\xc4\x96\xf4\xbe\x8e\xdc\xbe\x18\xb5\xec\xd0\x8a\x1e\x7d\xb2\x52\x23\xab\xda\x20\x8f\xa5\x31\xf4\xb2\x80\xaa\x03\xb0\x4b\x60\x60\x34\x11\xd3\x74\xba\x7c\xbb\x02\x0b\xb9\xa8\xce\x4c\x0e\x45\xa7\xe1\x32\x14\x48\x43\xc3\x1f\x8b\x45\xc5\x8e\xb3\xea\x85\x3c\x2c\xeb\x61\x37\x6e\x9d\xf8\x1d\x97\x78\xe7\x21\xad\xac\x77\xb5\x03\x54\x93\x7f\x34\x37\x2f\xcc\xd5\x75\xe8\x8d\x9d\x05\x8e\x43\xdf\x94\x2f\x2c\x43\xb5\x23\xc8\x09\x8e\x6d\xd9\xe6\xbd\x21\xd5\xa6\x49\xb4\x72\xd4\x1e\x34\x5f\xcd\x5e\xfd\xdd\x49\xea\xb3\x02\x70\xcd\x87\x88\x40\x4f\x28\x51\x6e\x09\xd3\xac\xc4\x00\x48\xb3\x9d\x32\x46\xf7\x57\xe4\x82\xe1\x45\x9c\x62\x6b\x79\x9e\x04\xd0\x67\x27\x13\x73\x71\xe1\x20\xaf\xb9\xfe\xc3\x9a\x25\xf4\xe6\x76\x4b\xf9\x79\x2f\xe4\x92\xee\x0f\x21\x0b\x57\xdb\x9e\xbb\x9e\x8e\xf4\x1b\x02\xc7\xfe\xe9\xed\xd4\xb6\x17\x4c\x57\x0d\xe0\x20\xa3\x91\x28\x71\x33\xfe\x8c\xcb\x41\xa8\x3f\x91\xbd\x22\x38\x2b\x21\xe1\xd7\xeb\xc2\xc7\xe5\x01\x8e\xf5\x14\x2d\x82\x63\x7d\x02\x62\x0f\xbc\x05\x69\xcc\x09\xc4\x4e\x91\x11\x12\xbb\xae\x99\x06\x4d\x68\xd1\xc6\x9e\x77\xc9\x93\x0b\x0d\xe0\x30\xc8\xc1\xd7\x48\xc4\x14\x05\x9d\x5e\x29\x9b\x7e\xdc\x08\x94\x06\x51\x89\x4b\x30\x3a\x2b\x32\xdd\x2c\x36\x5a\x06\x7c\x97\x23\x58\x55\x94\x64\x4d\x3e\xe8\xde\x1a\x51\xfa\xea\x0e\x65\x0f\x21\x24\x88\x5a\x94\xcb\x99\xeb\x90\x3b\x7d\x45\x79\xbd\xe5\x91\x49\x7d\x95\x39\x30\xd3\x63\xdd\xdb\xda\xc6\x27\xb9\x7a\x91\xf4\x96\x82\xdf\x8e\x72\x50\xa7\x07\x3d\x38\x3a\x7a\x22\xcf\x11\x3f\x28\x58\xce\x6b\x63\x2a\x28\x92\xc4\xe8\x8a\xa9\xa0\xd2\x89\xeb\x57\x62\x9b\x00\x8d\x3b\x1b\x60\x81\xe6\xfe\x5d\x3c\x0a\x6c\x80\x21\x89\xb5\xf1\x08\xe7\x66\x31\x9e\x15\xb3\x3e\xaa\x5b\x8c\xed\x40\x27\xea\xec\x83\xb4\xac\x68\xb1\x4b\x82\x98\xbc\x51\xcd\x8e\xb3\x80\x9b\x7a\x2d\x68\x4f\xe3\x2b\xbd\x9f\xab\x5c\x91\x8e\xeb\x17\xcc\x44\x4d\x73\xf7\x30\xd4\xc8\xcc\x05\x7b\xd3\xa2\xf1\xf0\xae\xbb\x61\x63\x29\x34\xe6\x17\x02\x16\x88\x29\xcd\x7e\x91\xde\x81\x50\x96\x29\xd0\x1a\x8c\xde\xfe\x0d\x1a\xc4\x9e\x21\xf0\xc5\xfb\xe1\xb2\x24\x48\x27\x26\x8a\x0a\x27\x35\x7e\x15\x8b\xd7\x68\x84\xa2\x1e\x7f\x1f\xac\x1b\x62\x72\x16\x6d\x5a\x9f\x64\xf9\xb6\x72\x98\x9a\x87\x62\xf5\x12\xbf\x1d\xf4\xb2\xab\x69\x97\x65\xf2\xcd\x83\x96\xf4\x76\xe7\xf5\x99\x95\xde\xe7\xd8\x90\x20\x7e\xff\x0f\xd2\x72\x63\xec\x23\x2e\x37\xcf\xed\xfe\x7c\x44\x05\x55\xd4\xca\x74\xe5\x2d\xa2\x46\xc4\xb8\x37\x57\xbe\xaf\xd2\xab\x2a\x51\xef\xe1\x60\xbb\x02\xb9\x8c\x26\xd6\xb2\xc3\xf0\xc1\xaa\xcb\x2f\x3c\x34\xa5\xb2\xa3\xb6\x6f\xee\x17\x5b\x78\x75\x48\x07\x3d\x8b\x57\x77\xc6\xbe\x88\x0b\xdc\x19\x6b\x33\x74\xa2\x15\x4f\x94\xd9\x36\x0f\x77\x55\xac\x68\x15\xa2\x8a\xf2\x96\x27\x1e\x22\xa8\xf2\x35\x43\xc7\x49\x55\xa6\x09\x12\x5b\x02\xa5\x69\x21\x80\x11\x42\x02\x95\xcc\xf0\xd7\x35\x69\x99\xa5\xb8\x95\xcc\x88\x48\x3f\xad\xf7\x97\x0c\xec\x6c\x64\x24\x0f\x70\x79\xfd\xb1\x5f\xfc\x5c\x42\x27\xe5\x39\x26\xd2\x78\xba\x0f\xed\x3c\x39\x93\xbc\x86\x82\x28\x23\xdd\x58\x1a\x32\xab\x2e\x3a\x07\xf7\x94\x30\x22\x4b\x27\x4e\xad\xd8\x45\x59\x8a\x7d\x1d\x89\x67\x6a\xaf\x23\x67\x77\x74\xb7\xb0\x58\x3b\xcc\x83\x59\x9d\x15\x5d\x14\xb0\x9a\xdc\xf4\x9e\xd5\x05\xe8"}, -{{0x2d,0x27,0x7d,0xd5,0x5f,0x57,0x19,0x5e,0xc0,0x72,0xb4,0x7c,0xb1,0x44,0x8c,0xb5,0x82,0xc8,0x35,0x73,0x9e,0x6c,0x98,0xba,0x71,0xab,0x12,0x8f,0x70,0xce,0x6b,0x79,},{0xdf,0xa9,0x25,0x93,0xef,0x0f,0x0d,0x97,0x4a,0x11,0x37,0x83,0x0a,0xd1,0x38,0x48,0xaf,0xef,0x3b,0x81,0x0c,0x2a,0x21,0xbf,0x77,0x91,0x78,0xce,0x4b,0x3a,0xb9,0x74,},{0x73,0xc1,0x06,0x06,0x49,0xa7,0xc0,0x14,0xed,0x01,0x94,0x58,0x51,0xb5,0x3e,0x28,0x53,0x24,0xe6,0x0d,0x06,0x1c,0x83,0x1d,0xda,0x41,0xf0,0x33,0xb5,0x65,0x83,0x06,0xa1,0xf1,0x12,0x32,0x7a,0xfe,0x93,0xca,0xa9,0x21,0x02,0x07,0x30,0xaa,0xe0,0x06,0x9c,0x9a,0x2b,0x45,0xee,0xf5,0x5c,0xbb,0x4a,0x5a,0x9c,0xd4,0x6c,0xda,0x80,0x08,},"\x14\x54\x9e\xdd\xd5\xf2\xb7\x90\x5d\xda\x19\xd7\x4a\xb2\x07\xaa\xc6\xfb\x3e\x3d\xf3\x29\x5d\x84\x52\x31\xef\x3a\xea\x6e\x1f\x04\xee\x03\x3c\x90\x38\xdc\xb4\xbd\x3d\x5e\x45\x2c\x54\x83\x4d\x0f\xf2\xb7\xde\x3f\x32\x2e\x56\x26\x94\x9c\xd6\x1d\x6e\x89\x01\x38\xff\x0e\xa8\xad\x84\x6e\x8f\xe8\x87\xae\xe1\x5f\xc4\x8b\xbe\x4f\xba\x42\x45\x5f\x5c\x17\x45\x7a\xe7\x89\xb4\x05\xaf\x85\x96\x11\xfe\x1f\x87\x46\x18\x5a\x65\xae\xf2\x13\x4e\xa4\xd8\xf3\x98\xd4\x8d\xf7\xc1\xbb\xa4\x30\x44\x08\xae\x7e\xfb\x35\x29\x24\x09\xd5\x08\xdd\x55\xce\x21\xde\x8c\x28\x16\x0d\xc9\xe8\x77\x70\x0c\x76\x3d\x06\xb0\x1b\x85\x42\x05\x2d\x7d\xdb\x63\x35\x54\xe3\x58\x42\x79\xc7\x96\x93\x70\x23\xc8\xea\xc3\x72\x77\xbe\x2b\x82\x04\xff\x3e\x0e\x10\x31\x19\x0a\x01\x01\x4c\xf5\xf5\xb4\xd7\xad\x99\x67\x27\xf9\x75\x31\xe0\x35\x5b\x87\xc9\xe6\x11\x52\x5a\xad\x07\x99\x58\xe9\xaf\xe2\xab\x10\xe4\xa3\xe7\xa1\xb6\xba\x0a\xff\x81\x5d\xa2\xcd\x81\xea\x9e\xb9\xf5\x36\x98\x66\x33\xf3\x16\xdd\x06\xc2\x50\x3c\x6b\x19\x8d\xc5\x93\x04\x80\x7b\x98\xb4\x29\x35\xf5\x1f\x63\x7d\xdb\x59\xe2\x33\xfe\xd5\x66\x43\x9c\x1f\xe9\x6c\xda\xaf\xa4\x9f\x44\x12\xd0\xc1\xe6\x54\xd8\xc6\x90\x42\x47\x0b\x3a\x59\xac\xb6\xbf\x67\xe4\x0b\x38\xa7\x70\x67\xd5\x99\x7b\x8d\x35\xed\x61\xd6\xeb\x3c\xc7\x8b\x8b\xdc\xb9\x57\x4b\x1c\xed\x9f\x6f\x33\x9e\x9e\x38\xf9\x41\x46\xef\x63\xf0\x49\xe6\xb8\x02\xbf\xed\x2a\x51\xab\x42\xe7\xd4\x89\xf3\x16\xff\x4d\x1c\xd8\x98\xbc\xf8\x50\x56\x51\x68\x74\x40\x74\x9c\x0f\xb7\xa5\x7d\xbe\xff\x72\xe6\x46\x89\xfa\xa4\x1c\x07\xb4\xad\xe5\x99\x33\xd2\xfa\xc6\xd5\x73\xde\xb7\x39\x54\x9e\xb7\x5f\x1e\x6f\x73\x85\xd8\xc6\x14\x28\x94\x97\x3e\xd6\x85\xeb\x8e\xd0\x80\xc2\xa4\x9f\x3a\xc6\x57\x11\x61\xaf\x96\x63\x5a\xd0\x57\xdf\x14\x86\xd3\x96\x77\x3a\xc8\x98\x32\x10\x97\x89\x86\xe1\xbf\x21\xa2\x08\x06\xd6\x67\xa4\x8a\x55\x5a\x96\x32\x21\xd5\x06\x14\xa8\x97\x6b\x2e\xec\x97\x51\x2d\xb1\x1a\x35\x81\x94\x49\x2a\xb5\x45\x58\x01\xba\xa1\x4a\x51\x1b\x26\xeb\x0c\x68\x28\x9d\x79\x05\x23\x71\x2f\x2f\xf8\x70\x98\x92\x69\x5c\x4d\xb9\xad\x31\x0d\xf8\xc6\xee\x7b\xd8\x3c\x87\x1f\x05\xae\xc3\x3b\x7a\xd3\x26\xf4\x46\x69\x2a\x42\xf7\x22\x23\x76\x24\x6d\x53\x6a\x32\x6c\x4d\x73\xeb\x57\x2f\xea\xda\x11\xb8\xac\x71\x14\xf6\xcb\x44\x4c\xa2\x78\xfc\xf0\x7b\x97\x0d\x2a\xd4\x65\x37\x2a\x68\x7d\x36\xb7\xda\xac\x47\x87\x48\xec\x6a\x93\x2d\xa2\x08\x43\x94\x8e\xfa\x39\x30\x97\x81\x42\x72\xe5\xca\x1c\x73\xe7\x11\x97\x3a\x52\x68\x3f\x98\xc0\x1e\x55\x24\x1c\x15\x4d\x28\xe3\x8d\x3e\xdf\xad\xe2\x30\x3a\x4e\x7c\x45\xc2\xa7\xa1\xc9\x96\xee\x11\x37\xaf\x86\x4a\x98\xb6\x98\x09\xfc\x92\x14\xee\xa8\xcf\x3a\xfe\x84\x2f\xee\x3e\xb9\xa9\x32\x2c\x3b\x82\xfd\xdb\x05\xd4\xd1\xa2\xde\x09\xc1\xce\x72\x73\x44\x53\xa8\xdd\x3a\x89\x20\xd0\xd0\xac\x96\xef\x77\x8b\x9e\x02\xc6\xa3\xf1\x28\x72\xe1\x7d\x3a\x81\xba\x75\xfd\x23\x3b\xaa\xdb\xe2\x16\xea\x0a\x58\xe9\xdd\xa0\x08\x40\x87\x02\x08\xae\x41\x35\x40\x03\x0b\x3c\x05\xe5\xd0\xb8\x32\xdf\x87\xc8\xee\x7f\x15\x34\x87\xaa\x11\xba\xd9\xf1\x39\xc7\xdd\x4b\xcf\x41\x8f\x4b\xcb\x95\xbe\xe8\x57\xd0\xe9\x60\x84\x47\x23\x87\xcb\x39\x12\x7a\x94\x71\x34\x50\x19\x63\xa7\x07\x1b\xdb\x34\xde\x69\x61\xbe\x2b\x6b\x06\xe4\x03\xe7\x59\x18\xe6\xf6\x9d\x08\x02\x1c\xf2\xa8\xac\xb8\x0a\x01\x11\xf4\xd5\x06\x10\xc1\x52\xd3\x9c\x66\x21\xc0\x57\x8a\xc6\x89\x95\x9b\x1c\xe6\xf3\x76\xf4\x3d\x18\xaf\x06\x2e\x4a"}, -{{0x42,0x80,0x66,0xc5,0x24,0x45,0x72,0x6d,0x0e,0xa2,0x00,0x7e,0x50,0x46,0x37,0x27,0x4d,0x84,0xee,0x23,0x23,0x25,0xb5,0x05,0xf2,0xc5,0x16,0x35,0x7f,0x80,0x75,0x83,},{0xdd,0x40,0xfe,0x8f,0x67,0xc6,0x65,0x61,0x3b,0x3c,0x45,0x9f,0x6a,0xce,0x8d,0xc2,0x8d,0x34,0xe0,0xe7,0x7e,0x2f,0x6a,0xa0,0x60,0x59,0x28,0x19,0xbe,0x6a,0x9d,0x68,},{0xc9,0x38,0x82,0x9f,0x59,0x8b,0x1f,0xf1,0xb8,0x18,0x33,0x60,0xd2,0x23,0xf4,0x3c,0x59,0x47,0x30,0x60,0x68,0x76,0xa9,0x9a,0x3f,0x31,0xb2,0x06,0x5d,0x04,0xe6,0xf0,0x75,0xd1,0x39,0x6b,0x3c,0x8c,0xff,0xb0,0xe1,0xe2,0xea,0xab,0xda,0x7d,0xa5,0xe7,0x89,0xcc,0xd1,0xc0,0x20,0x83,0x5f,0xe3,0xa7,0x1d,0xcd,0xb6,0xaf,0x03,0x96,0x0c,},"\xe2\x79\x6c\x50\xd9\x3d\xf8\x12\xbc\xa4\x1b\xf2\xa1\xe1\xdd\x73\x7d\x8c\xf6\xf6\xb4\xf7\x62\x42\xe3\x91\x78\x18\x67\x58\xcb\xae\x08\x84\xe6\x0c\x6b\x4a\xaa\xdd\xae\xc9\xa8\x99\xa9\x12\xe5\xc5\xb9\x80\x4d\x7b\x04\x97\xba\xb4\x45\x8c\x58\x5d\x4f\x25\x92\x22\x49\x8c\xe9\xe8\x0e\xb6\xa7\x97\x9b\xbe\xd6\xd5\x2c\xc3\x80\x72\xf7\x45\xcb\x2c\x63\xe6\x63\xbc\x3b\x9d\x6c\xaf\x01\x2a\x60\x7f\x6d\x3b\x70\x6e\x15\x57\x57\x87\x17\xec\xbb\x97\x1a\xeb\x7c\x48\xe1\xdf\x95\x71\x1c\x55\x0e\x00\x69\x93\xbf\xfb\xa9\x11\xcb\x64\xad\x52\xd5\x17\xed\x18\xbe\x82\x36\x9e\x81\x58\x19\xd3\x17\x59\x47\xd4\xa3\x5b\x2c\xc7\xb9\xdc\x6c\x10\x05\x13\x26\xb3\xf1\xdc\x1e\xdb\x1b\x68\xba\x01\x5f\xf7\xca\x1d\xc3\x61\xd8\x96\x7a\xbc\xff\xd3\xc3\x1f\x7d\x6b\x0c\xb1\x39\x6a\xe5\x41\xf2\x97\x59\xc4\x13\x0b\xe5\x2e\xcc\x11\xd9\x92\x61\xc3\x65\xbf\x7c\xde\xc7\x81\x49\x4c\x5f\xa0\x52\x6d\xb4\xdb\xbe\x66\x0a\x43\x2b\xe5\x60\x43\xc6\x6e\xa0\x7c\x25\x62\x7a\x5f\x72\xb7\x81\x23\xdc\xf9\x86\xff\x71\xed\x1a\xff\xd1\x65\x9b\x13\x93\xd9\x62\x1f\x71\x1d\xfa\x63\xea\xda\x38\x34\x30\x79\x70\x58\xf1\x56\x6a\x00\x05\x2d\x67\xba\x53\xc1\x23\x7b\x56\x91\xde\x3b\x03\x9f\xd4\x47\x6f\x11\x51\xe5\xed\x5f\x5a\x98\x67\x2f\xa3\x3a\x1d\x85\x4f\xa0\x15\x66\xb3\x32\x31\xd4\x6a\xcd\x7f\x34\xb8\x03\x44\x79\x98\x18\x53\x76\x4d\xab\x87\xf4\x98\x44\xcb\x62\xc6\x3d\x53\x6f\xac\xa9\x20\x44\x7d\x8c\xd1\xe8\x11\x3e\xdb\xc8\x3e\x4a\x6b\x78\x15\xe1\x80\xcd\x78\xb9\x33\xd9\x68\x7f\xd5\xbe\x99\xd0\x51\x8a\x44\x66\x29\x89\xbc\x64\x01\x11\x24\xf1\x87\xd4\x39\x79\x99\x4a\x95\xe0\xc9\x03\xa0\x06\xc1\xc0\xbe\xf1\xc0\xf3\xdf\x1e\xb7\x00\xf9\x80\xc2\x8c\x3c\x1e\x99\x7d\x0c\x56\xd1\x13\xda\xe1\x96\x88\x2b\x05\x01\x8f\xca\xb3\x14\xd8\x11\x7f\xaf\xba\xbe\x77\x00\xb9\x32\xd4\x7c\x57\x36\x2b\x20\x35\xed\xdc\xe2\xd2\xef\x33\x64\x1e\xa9\x0c\x3e\xa3\xfe\xc6\xea\x5b\x87\xe1\x61\x01\x4c\x4f\x82\x14\xfd\x03\xce\xbf\x94\xab\xe1\x22\x53\x7a\x98\x70\x32\x39\xdf\x58\x21\xc5\xab\x63\x3f\x98\x36\x5c\xc6\x36\xe3\xf1\xd2\xf7\x4e\x0f\xf8\xf1\xfe\xe0\x6a\x3f\x73\x90\x7e\xe5\x04\xb3\x10\xfd\x52\x24\xad\x4d\x05\xcd\x23\xc3\x56\xdf\x8b\x34\x64\x72\x98\xc4\x98\x28\x72\x5b\xa5\xfd\x60\x61\x1e\x82\x9b\x63\x37\xbc\xc9\xdc\xf8\xe8\x97\x1c\xab\x3e\xe9\xc2\x63\x37\xd3\x8d\xfd\xfa\x03\x6b\xf6\x09\x6b\x63\x5a\xc1\xbd\x55\x25\xec\xd3\x77\xa1\x52\x72\xa8\xac\x9b\xbe\xf1\x33\x10\x7a\x42\x25\x8d\x8b\x19\xec\x69\xdc\x42\x61\xbe\x53\x00\xa2\xd2\xd5\xca\x99\xf3\x1e\xfd\xf2\x59\xf9\xd0\x79\x86\x9a\x34\x41\x37\x79\xf3\x02\x88\x24\xd7\x47\x68\x6c\x46\x0f\xfc\x49\x6f\x20\x10\xf4\x03\xe9\x03\xe2\x7a\x87\xdd\x07\x5a\xe0\xa7\xf1\x68\x94\x16\xd3\x1b\xcc\x15\xf4\x90\xca\xf9\x75\xc4\x0e\x71\x5d\x54\x99\x03\xe8\xbc\x0f\x7d\x91\x41\xe0\x20\xf4\x10\xf3\xca\x2b\x2c\x07\x97\xca\x0d\xc8\xd7\x39\x2b\xff\x24\x35\x28\xc7\xf3\xbe\x13\x89\x97\x18\x5a\x4b\x36\xf4\x53\x76\xd9\xfd\x70\xba\x20\x98\x9d\x2d\x1a\x91\x1d\x4b\x98\xd1\x60\xd2\xb8\xde\x59\x2d\xe2\xf4\xc0\x4f\x35\x86\x0d\xf3\x20\xc5\x48\x44\x0d\x5e\x3a\x34\x6a\x14\xd3\xa6\x3f\xe4\x85\xc2\x88\x91\x26\xb7\xf4\x1d\x55\xa6\xeb\x23\xd5\x62\x0b\xab\xf8\x56\x4a\xa7\x9d\x15\x6e\x98\x3f\x36\xd9\xed\x49\x8d\xa9\xca\x88\x8d\x94\x6b\x53\xcc\x47\x68\xa5\x89\x2d\x52\xd5\x41\x52\x69\x60\x28\x25\x24\xba\x61\x94\xda\x65\x94\x1d\x1e\xa3\x0f\x80\x6b\xb6\xd9\x7c\x74\x88\xb9\x3f\xd0\xa7\x70\xa9\xb1\x5e\xfc\xd1\x2c\x5c\x46\x94"}, -{{0x31,0x45,0xbc,0x68,0xd8,0x29,0x79,0x40,0x8e,0x46,0x57,0xb7,0x75,0xf1,0x50,0xc6,0xd2,0x8a,0x32,0x4d,0x74,0x6e,0xa6,0xde,0x90,0xfd,0x72,0xb1,0x7a,0x25,0x79,0x82,},{0xc7,0x76,0x18,0x6c,0xe4,0x7f,0x30,0xad,0x08,0xfa,0x1d,0x2c,0x61,0x6a,0x36,0x44,0x66,0x5b,0xa5,0x4f,0xf7,0x30,0xfc,0x2f,0x4d,0xb1,0xdb,0xa3,0x8d,0xde,0xed,0xca,},{0x24,0xa4,0x33,0x33,0x76,0x83,0xbc,0x71,0xa6,0xca,0x3b,0xcc,0xd8,0xcc,0x24,0x00,0xc2,0x44,0x64,0xfa,0x67,0x71,0x4b,0x46,0x51,0x5f,0x2a,0x14,0x32,0x71,0x27,0x05,0xd5,0x70,0x61,0x4d,0xb6,0xd2,0x6b,0xbb,0xd3,0xf0,0x26,0x7c,0x14,0x27,0xca,0x1c,0x2f,0x40,0xdc,0x9a,0x6f,0x1f,0xb0,0xf0,0xfc,0x71,0x4a,0x02,0xe2,0x4b,0x47,0x08,},"\x2e\xa8\xdc\xe1\x48\x7f\x45\xd6\xff\x8e\xb8\x3c\x54\xfb\x7e\xdd\x76\xad\x6e\x60\x8b\xb8\xda\xf1\xa1\x82\x3d\xa4\xf4\xe4\xe9\x86\x31\x73\x89\x7c\x19\x7a\xc6\x58\x04\x82\x3b\xca\x95\x09\x1f\x59\xe8\x6d\x63\xc1\x8d\xbc\xdb\x85\x74\x3f\x88\x93\xee\x69\x4d\x81\x56\x01\xf8\xf2\x2f\x4d\x7d\xf0\x87\xf0\x11\x4b\xb2\x6c\x37\x95\xe1\xfe\x4b\x7f\x4a\x8f\xa3\x1f\xd9\xf4\xff\x10\xfe\x5d\xd4\x52\xc5\x4c\x55\x78\xc7\x52\xf8\x88\x21\x30\x76\xbe\x46\x7b\xa3\x0d\x2e\x2f\xbb\xee\x87\x7c\x4b\xe9\xb6\xec\x4f\x04\x02\x1c\x00\x6f\x92\x66\x31\x19\x43\xca\xb7\xce\xa9\x9a\x2a\xce\xbb\x69\xee\xc3\xe6\x18\xc1\x31\xf9\x74\x30\x07\x5f\x79\x75\xe3\x9f\x26\xd5\x31\x51\x78\xb6\x9a\x1d\xdf\x73\x17\x61\x05\x1b\x93\xfb\x8d\xf7\xe0\xe8\xb4\x1e\x82\xe7\xf4\xf7\x5e\x91\xd6\xc8\x90\xb1\x4c\xa5\x33\xe0\x94\xeb\x8e\xa4\x48\x6d\x38\x71\x85\x96\x6c\x98\x29\x5d\x3f\x58\xb1\x7e\xef\x6c\xc3\xb4\xd0\x7e\x93\xa3\xd9\xf4\x77\x2e\xe5\x2f\x18\xa5\xbb\x30\xaa\x39\x72\x85\x0e\x65\x81\x70\xbd\xdb\x67\x6f\x33\x26\x6c\x9f\xd1\x0f\x59\x90\xba\xd8\x91\xf0\xce\xb7\x82\x73\x6b\x40\xf0\x1b\xd8\x65\x09\xb0\x63\x04\xa9\x6d\x93\xda\x23\x3d\xbe\xd1\x8a\xfa\x18\x18\xaa\xf5\x7a\xf9\xbd\xbc\x86\x7b\x39\x7f\xf2\x35\xa8\x3e\x85\x72\x24\xb1\x50\x65\x22\x5e\xec\x03\x9d\xd4\xe2\xd6\x9a\x04\xee\x10\xbe\xa0\x69\x50\x41\xed\xa5\x9b\x05\x8e\xc0\x5f\x49\x04\x8e\xe3\x24\xd1\x6c\x4d\x61\x07\xb6\xec\xd0\x48\x75\xeb\x74\x4e\x93\x65\x47\x1b\x4c\x5f\xe6\x61\x1b\x26\x18\x93\xf9\xd2\xb1\x28\xe1\x35\xf9\x2e\x47\x41\x56\xb2\x71\xb3\xc8\x2e\x9a\x76\x63\xda\xd4\x95\x3d\x30\xe1\x0e\xda\x08\x62\x60\x7d\xec\x33\x72\xb3\x99\x70\xf2\xa8\x4b\x12\xf6\x0e\x6d\xae\x7f\x31\x79\x90\x86\xd3\x8a\x7e\x34\x94\x84\x19\xc1\xb0\x7f\x44\xc2\x15\x9c\x86\xb8\xc0\xcf\xe8\x74\x7f\xc2\xba\xd5\xbf\x47\x53\x56\xcf\xe6\x9d\xe2\xdc\x6a\xd5\xa5\x19\xfd\x65\xc1\x25\x64\x70\x1c\x05\xf7\xc2\x77\xec\xaf\xcf\x4c\x87\xb1\x48\xdf\x1f\x98\x79\xa9\xae\x44\x3c\x55\xae\xa5\x21\x38\xc6\xfa\x01\xef\x0c\x3a\xbb\x5f\x2d\xf9\x0a\x57\xab\x66\x24\x17\x8c\x73\x7b\x54\x91\x5b\x7a\xa2\x9e\xa7\x8e\x8e\x49\xef\x5a\x81\x6d\x8a\x92\xc2\xf8\x1b\x8a\x19\x63\x27\x79\xc8\x92\xd6\x6f\x75\x3d\x51\x8c\x41\xcc\xcc\x9e\x59\x3e\x50\x74\x26\x25\xbc\xaf\xa4\x68\x80\x5c\x37\xa2\x1f\x8e\x29\xa6\x96\x0d\xdf\x5c\x5e\x5c\xa1\x4a\x7b\x05\x2a\x7b\x60\x15\x69\x7a\x02\x10\xed\x6f\x01\x43\xe6\xb4\x84\xc3\xf5\xb3\xb4\x72\x6c\x60\x7d\x07\xbf\xb3\xd5\x4a\x09\xc9\x80\x43\xf2\x1d\xcc\x5c\xc2\x0b\xb4\x75\x4e\x2e\x5a\x73\xb2\xf8\x06\xc2\x20\x4b\x72\xf3\x6a\xb9\xe9\x6a\x62\xc6\x27\x7c\x0a\xd6\x6b\xe7\xab\xff\xc1\x63\xb4\xe8\xfa\xfc\xef\xf5\xe2\x02\xe5\x94\x3f\x4f\x0e\x6b\x92\xb4\xdd\xb9\x53\xcb\xb7\x91\xf8\x31\x66\x03\x69\x38\xe6\xc4\x4a\xd9\x1a\x59\x6a\x55\x73\x44\x0f\xb3\x07\x41\xe6\x60\xb6\xcd\x5f\x86\xff\xa7\x46\xe6\xe9\x72\xb8\x05\xc1\x0b\x7b\x7b\x9a\x63\xc0\x55\x1d\xb8\xeb\x4f\x84\x00\xcd\xe2\x86\x8c\x0d\x0d\x4e\xb4\xcf\x11\x7f\x8e\xc4\xab\x97\x44\xfc\x58\x79\xde\xa7\xf0\xef\x16\xc2\x91\xd5\x5c\x17\xf0\x8b\x73\x1b\x7c\x65\xd0\xc4\x41\xb6\x3b\xc8\xff\x5e\x94\x90\x4c\x02\x6a\x13\x61\xda\xcc\x80\xa9\x3a\x9b\x9f\xba\x3b\x40\x36\x17\xae\xb9\x4a\x56\x85\x41\x84\x80\x11\x95\x42\x34\xae\xad\x70\x0f\x03\x4c\x47\xc7\xde\xf8\x77\x90\x52\x55\xf1\x8b\xdb\x9a\x25\x7c\xe5\xbd\xcf\x0e\x17\x67\x0c\xda\xaf\x13\xb1\xc7\xe0\x9d\x58\xf9\x2a\x96\x63\xaf\x23\x9e\x22\x07\x8e\x18\x0a\x23\xcc\xb6\xf6\x4d\x64"}, -{{0x5a,0x25,0xea,0x5e,0x18,0x2d,0x9b,0xf8,0xe9,0x30,0xa2,0x0b,0x6c,0xf5,0x5e,0x24,0xe8,0x38,0x62,0x78,0x9b,0x38,0x39,0xb1,0xce,0x9a,0x71,0xe9,0x38,0xc4,0x2d,0x37,},{0xc9,0x81,0xfc,0x36,0xf1,0xa6,0xd5,0xf7,0xd4,0x51,0xcd,0x5e,0xf3,0x9c,0xd3,0xab,0x02,0x08,0x7f,0xcc,0x6a,0xf2,0x7d,0xd7,0x8e,0xa8,0x27,0x49,0x7e,0x77,0x9e,0x21,},{0xa4,0xf3,0x5b,0x49,0xd7,0xe1,0x98,0xe5,0xd3,0x26,0xe3,0x53,0xfb,0xb0,0x1f,0xa1,0x3b,0x6a,0xe2,0x60,0xd1,0xe4,0x8e,0x30,0xc1,0xb9,0x67,0x73,0x7a,0x5e,0x79,0x93,0x6c,0x97,0xca,0x2b,0xa7,0x99,0xca,0x34,0xe5,0xe7,0x88,0xce,0xa5,0xac,0x8e,0xd1,0x0d,0x5c,0xd1,0x5d,0xae,0x53,0xe4,0x24,0x32,0x32,0x1c,0xc2,0x6d,0xc9,0x98,0x09,},"\x21\x4d\xd1\x92\x7f\x2c\xac\xd9\x88\x87\x14\x24\x9b\x85\x43\x46\x02\xac\x78\x45\x3b\x4a\xf5\x38\x6e\xee\x39\x29\x5d\x3d\x5a\x22\x67\x80\x6e\xb0\xcf\xf2\xc1\x32\xd3\x64\xc2\x42\x0d\x04\xe3\xf6\xcc\x0a\x96\x7b\xf0\x5a\x10\xff\xcf\x12\x17\xbb\xf3\x15\xe7\x5b\x98\x06\x0f\xd4\x58\xd6\x7e\xba\xad\x93\x80\xf4\xad\xc4\xdb\xdf\x74\xcb\xf1\xc6\x47\x92\x02\xbd\xd7\xfe\xd3\xa9\x46\x69\x7d\xc3\x84\x44\xd8\x8b\xfe\x51\xd4\x1d\x7a\x9b\x38\xda\x60\xb8\x50\xc5\x6b\x48\xba\x98\x4f\x6a\x18\x89\x51\x49\x55\xc0\xda\xdb\x69\xa8\xc7\x36\xcc\x76\xcd\xc4\x9f\x13\xf8\x5a\x8b\xfb\x79\x28\xff\x0a\x0c\x0c\x03\xf1\x7c\x74\xb5\xe1\x06\x2d\x75\x53\xfb\xeb\x9d\xd3\xd5\x08\x1d\xe1\xdf\xd8\xa6\xa9\x97\x66\x97\xc6\xa2\x59\xbc\xf7\xd4\xbe\xf1\xc2\x1e\x0a\xaf\x32\x98\xb0\x42\x1b\x91\x9f\xdd\xfc\x1d\xcb\x3e\xc6\x83\xd8\x6f\xf3\xd4\x23\xd7\x1c\x8f\x2d\x72\x3a\x42\xff\x68\xd8\x2e\x9f\x39\x17\x49\xb8\x29\x98\xdc\xfa\x11\x21\x60\xf5\x2a\x41\x3a\x23\xd9\x5f\xc4\x2c\x3b\xd2\x23\x84\xba\xd7\x77\x54\xa7\x10\xd8\xb9\xf8\x4a\xe0\xa8\x02\xfc\x46\x50\x9e\x7f\x2b\x07\x07\x90\x12\xb4\x3b\xfe\xea\xb7\x19\xbd\xe5\x6f\x00\xe5\x9b\x8e\xdf\x1c\x47\x28\x83\xb1\x98\x5b\x2f\xa6\x99\xa1\xae\x90\xcf\x45\xd7\xac\x58\x0c\xeb\x5f\x27\x97\xde\xf5\xb8\xbf\x4f\x2b\x9b\x35\x19\xa7\x27\xb9\xf2\xcd\x12\x56\xa2\xf0\x76\xed\x22\x96\x49\x5b\x5c\x2d\xf7\x88\x7f\xf8\x9e\x88\xe2\x36\xa1\x4c\xde\x63\x24\xf4\x3d\x68\xd9\x01\x72\xb0\xb8\x8b\xd2\x88\x03\xe9\x99\xdb\xed\xcc\x50\x1d\xb6\x54\x54\x4e\x17\x1e\xc1\xf9\xf3\x2d\x4d\x33\x21\xd5\x89\x39\x2e\x03\xca\x65\x9f\x96\x75\x2e\x1f\x08\xa5\x5d\xb5\x53\xd8\x66\x98\x55\x41\xf5\xbe\xf8\x4c\xe2\xee\x32\x3e\x17\xd1\xf7\xdc\x16\x4b\x50\x51\x5a\x28\x7d\x53\x05\xfc\x28\xc5\x98\x3b\x9e\x53\x98\xb2\x40\x7a\xe4\x72\x96\xfe\x4a\x48\x1d\x22\xff\xb4\xb8\x65\xa6\x6b\x97\xa6\xc2\x79\x35\xdd\x8e\xb8\x69\x94\xb7\x9d\x36\x83\x63\x71\x3f\x10\x1d\xc3\x7f\x42\x9e\xee\x0f\xee\x24\x41\xc2\xdc\x17\xbf\x43\x92\x4f\x0c\x04\x4f\x14\x32\x90\xea\xf3\xf9\xee\x4d\x94\x6d\xbe\x45\x83\x1a\x0d\x83\xc0\x76\xe7\x51\xc1\x4f\x3b\x1a\x72\x67\xf5\x44\x6c\x18\x86\x98\xd2\xb4\x6d\x87\xe6\xf3\xb2\x0b\xb3\xfd\xaf\xe2\x4c\xc0\x96\xbc\x31\x2d\x86\x78\xb3\x8a\x80\xc3\xf0\x52\xa0\xc9\x6d\x5a\xd8\x7a\x5d\xd8\xc1\x33\xcc\x9a\x15\xbe\x33\x57\x4c\xd9\x43\x08\xc2\x4d\xec\x1a\x9b\xdf\x18\x9b\xa6\x87\x19\x9f\x72\xef\x67\x09\x87\x8e\x10\xf8\x7b\xd8\xa0\x3d\xc8\x4c\x8f\xa9\x64\x20\x28\x58\x98\xca\x32\x11\xd8\xb0\xcc\xef\x64\x01\x1e\xc2\x4f\x38\xe5\x74\xda\x34\xda\xb9\xd2\xf0\x02\x10\x52\x27\x89\x0f\x92\x48\x8c\x62\x1e\x57\x13\xe4\x7d\xbc\xb1\xa8\x2a\x6d\xa6\x0d\x8b\x22\x01\xeb\x29\xd4\x94\x49\x33\x60\xed\x5a\x3f\x4b\x52\x25\xea\xe7\x70\x7e\xe0\xb4\xc0\x40\x73\x05\xc1\x67\x54\xc7\xf6\x30\xfc\x85\xc1\x3e\x49\x17\x04\x7b\xcf\xf3\xb2\xa2\x93\xfe\x95\x55\x06\xc7\x26\x4e\xa6\x5b\xf3\xa9\xb2\x5a\xcf\x34\x36\x00\xd8\xfa\x0c\x7c\x1a\x29\x0d\x02\x71\x10\x1b\x7f\x40\xb9\x6e\x7f\xda\xf2\x9d\xef\x9d\x93\x27\xa5\xae\x05\x44\x6c\xb5\xa6\xd3\x22\x45\x3a\x8b\x09\x8b\xcf\x3a\xee\x1f\x70\x4e\x14\xd0\x0b\xe3\x42\xb8\x93\x4d\x19\xe5\x29\x21\x88\x72\xea\x3a\x2f\xb2\x12\x4b\x52\x66\x7c\x01\xfc\xa5\x84\x1c\x66\xe1\xe6\x4a\x1e\x68\x0e\x09\xba\x18\x6e\x04\xd1\x05\x18\x6c\xf6\xeb\x72\x8b\x9d\x50\x2a\x66\xb8\x29\xfb\xc9\x92\xa3\x88\x10\x04\xec\xdc\x80\xad\xfd\x04\x4e\xda\x88\x0f\x8a\xf7\x2a\x14\xfb\x55\x0d\x7c\xc7\x41\x94\xa9\x45\x20\x7d"}, -{{0x42,0x33,0x5c,0x30,0xb3,0xf6,0xb3,0x59,0xce,0xf5,0xaa,0xb6,0xa3,0xce,0x28,0x58,0xa1,0x51,0xb7,0xa4,0xfd,0x78,0xd2,0xfd,0x3e,0xe3,0x6f,0xc2,0x9d,0x24,0x94,0x04,},{0x30,0x1c,0x51,0x5a,0x02,0xa4,0xc6,0x6b,0xc6,0x40,0x10,0x80,0xc6,0xca,0x79,0x23,0xb7,0x83,0x1e,0x3c,0x9a,0x72,0xb5,0x5b,0x14,0x02,0x7e,0xb2,0xe7,0xb3,0xb1,0x52,},{0x67,0xb0,0xf1,0x74,0x49,0x03,0x9e,0x8c,0x79,0x7b,0xf9,0x13,0xaa,0xe6,0xe4,0xf0,0xbb,0x99,0xc7,0x4d,0x6d,0x10,0xc9,0x73,0xb9,0x90,0xff,0xe0,0x3e,0x7e,0xe4,0xab,0x5b,0x35,0x80,0x6d,0xb1,0x5a,0x98,0xc0,0x84,0x6a,0x82,0x7e,0x7b,0xcd,0x53,0x9c,0xd3,0xbc,0x09,0xdd,0x11,0x8a,0xb3,0xe5,0x26,0x63,0xa3,0x57,0xb1,0x29,0x91,0x07,},"\x6d\xa2\x25\x1e\x6f\x55\x95\x36\xb0\x9b\xfa\xfb\x81\x60\xa2\xe8\x10\x2d\x31\xf8\xb5\x93\x24\x08\x3e\x52\x27\xb2\x0c\x3e\x5c\x3a\x06\xe2\x39\x67\x68\xdc\xa3\xec\x76\xdc\x7f\xc0\xeb\x3d\x14\x5e\x62\xed\x07\xfc\x1a\x8b\x1b\x2e\x34\x70\x13\xa0\x52\x72\x74\xd0\xb2\x34\xfe\x72\x50\x26\xa9\xd1\x28\xf8\xdf\x20\xdb\xfa\x3b\x65\x03\x81\x8e\xde\xbd\x7f\x24\x93\x40\x80\x94\x5a\x7e\x1e\xa0\x22\x73\xfe\x48\xb6\xed\x1e\x83\xfd\x16\x8d\x79\x73\xfb\xb7\x94\x1b\x40\x37\xd3\xcd\xa5\x55\xe0\xe8\x9c\x2b\x94\x3f\xb1\xe2\x07\x65\xac\x7d\x4f\xa3\x77\x7f\x35\xa0\xa8\xbc\x11\x8f\x59\x9c\x84\x7b\xe3\xfd\xb2\xd8\xe2\x01\xae\x12\xa3\x0b\xde\xfb\x03\x4f\xf2\x4e\x3e\x2e\x70\x1a\x0d\x17\x33\x73\x40\x78\xbd\x1f\x9a\x69\xbb\xc6\x67\xe4\x61\x21\x1f\x2c\x76\x9d\x29\xdb\x7c\x4d\x62\xd6\xb1\xb9\x2b\x56\xf5\xf1\x8a\x93\x1a\x92\x60\x64\xb7\x8d\xa1\x46\xe1\x8b\x48\x13\x9b\x9b\x39\x86\x2a\xec\x37\xbc\xce\x12\xcb\x78\x94\x29\xe6\x8e\xa3\x81\x12\xd0\xb5\xcc\xe3\x0b\xd2\xd2\x6c\x5f\x7f\xd4\x15\xda\xf7\xca\x31\x7b\x33\x68\xb7\x61\x7d\x45\x25\xe5\xbc\x97\xd9\x46\x1d\x5d\x64\xf6\xb5\xd3\x18\xd0\xbc\x3b\x76\xf2\x5b\x06\x05\x42\x69\x09\xf2\xaa\x0c\xd6\x67\xa4\xf0\xe0\x75\xb9\xa9\xfb\x2e\x9a\x6c\x82\x70\x4d\x8a\x9f\x16\x66\x84\x4e\xdc\x32\xf6\x3a\x3d\x4e\x0f\xd9\xfd\xba\x30\xb5\x1b\x33\x36\xb9\x6e\x9e\xae\x39\x2a\x34\x2d\xe4\x9e\x9b\x5f\xa0\xf9\xb9\x01\x71\xbd\xe0\x9c\xf1\xe9\x46\x49\x91\x40\x00\x81\x59\xeb\x18\x65\x56\x3c\x28\x39\x4b\x03\xa8\xd7\xa5\x52\x27\x1b\x28\x76\x68\x75\x66\xb8\x0f\xd3\xbe\x2b\x66\x33\x2f\xca\xd1\x96\xca\xb8\x52\x7c\x56\xe2\x15\x36\xa1\x41\x65\x2c\xdc\x7f\xa7\x45\xb2\x6a\x33\x1d\x78\x7b\x93\xe5\xe8\x16\xd8\xd8\x51\xa5\x8f\x6a\xc0\x7a\x58\x27\xfc\xdf\x47\x2e\x86\x85\x43\x3a\x40\xca\xc0\xc4\x9a\xa5\x69\x31\x9a\x2e\x57\xb4\x1c\x99\x98\x16\x5e\x69\x72\x3b\xa7\x7e\x5c\x04\x23\xc4\xb4\xca\x07\x18\x7b\xb7\x44\x2e\x7d\x31\xca\xac\xb2\x77\x00\xc7\x1a\xe4\x8c\xd0\x55\xed\x2f\xe4\xda\x36\x3f\x44\x82\x11\x24\xcc\xa1\xbf\x2e\x63\xd9\xb8\xab\xd2\xfa\x41\xb1\x42\x2f\x52\xd5\x58\xbc\x5f\x11\x0c\x86\x3c\xc6\x00\x86\x49\x84\xed\x25\x9b\x73\xcd\xdd\x57\x96\xb3\x29\x79\xed\xdf\x76\xa0\x7b\xc5\x9b\x73\x68\xc4\x8e\x12\x9e\xcc\x0d\x45\x35\xdc\xce\xe2\xc3\xb8\xe5\x6d\xe5\x0e\x6f\x5c\xc6\xea\x51\x5c\xd6\xa0\xeb\xdf\x1c\xa7\x9a\xa2\x79\x48\x21\xad\x2e\x10\x9e\xdd\xa4\x50\xc9\xfc\x3c\x84\xd8\xc9\x6b\xc3\x8d\x4b\x43\x7a\x73\x8f\x81\x8b\x4d\xdc\xb6\x84\x38\x3c\x09\xb1\x1b\x36\x05\x2e\x9d\x2f\x76\xa6\x1e\xb4\xd6\x20\x49\xce\xd5\xf6\x16\x62\xc4\xb9\xec\xd2\x4a\x67\xf4\x51\x9d\x46\x52\x8c\x5b\x2e\xb2\x10\x05\xf4\x9c\x73\xa3\x37\x0c\x68\xe3\x7a\xc2\xb1\x8d\x48\x1f\xa1\x0f\x96\x71\x4f\xe0\x5c\x16\x8d\xf1\x1c\xda\x54\xf1\x4f\x49\x37\xe9\xfc\xe1\xf5\x16\xc0\x37\x1b\x36\xa2\xc0\xa0\x50\xba\xc7\xfa\x51\x22\xa6\xe3\x5e\xc9\xc4\x04\x36\x58\x5f\x31\x6e\x6c\x91\x1b\xdf\xd7\xdb\x4b\x80\xb4\x30\x64\x79\xb8\x2a\x2b\x24\x3a\x52\xb2\xd2\xb6\x27\x42\xed\x11\x28\x27\x90\xcf\x6f\xdc\x7c\x9c\x82\x43\x64\xcf\x25\x63\x6a\x85\x51\x50\xbd\xdb\xdf\x7e\x64\x0f\x9f\x95\x2a\x94\x7e\xc7\x97\x49\x25\xe8\x24\x50\x68\xb2\x92\x10\x1b\x1f\x4b\x20\x18\xe8\x5d\x07\x8c\x2f\xee\xf4\x49\x23\x49\x72\x9a\xd4\xac\xb3\x8f\x1c\x7c\x02\x70\xb6\x1d\x3d\xfd\x76\x36\xc6\xcb\xf1\x81\xe4\xc8\xa0\xe6\x4f\xa0\x61\x32\x55\x3c\x2b\x9d\xb7\x01\x9e\x3b\x3c\x48\x5d\x8d\x5b\x7d\xfd\x5f\x51\x5e\x4d\x71\xed\xe5\x35\xae\x7f\x2a\xae\xdc\x23"}, -{{0xbe,0x6b,0x2b,0xab,0xdd,0xd2,0xdc,0xa1,0xb0,0xe1,0x0d,0x12,0xd2,0x0a,0x9c,0xe2,0x9c,0x67,0x85,0xda,0xc1,0xd6,0x0f,0x2e,0xdf,0xa9,0x4a,0xc2,0x78,0x4b,0xa7,0x66,},{0x39,0x8f,0x22,0xf0,0xef,0xbf,0x8c,0x38,0x35,0x5e,0x47,0x91,0xbf,0x67,0x08,0x98,0x95,0x1f,0xbb,0xd5,0x51,0x8f,0x0e,0x2a,0x60,0x5d,0x46,0x00,0x23,0xf6,0x13,0xf0,},{0x70,0x2a,0xb9,0xac,0xbf,0xa7,0x5e,0xa2,0xad,0xbe,0x4b,0xe2,0xb6,0x84,0x76,0x25,0xae,0xb4,0x09,0xee,0xf9,0x59,0x6f,0xab,0xe3,0x9d,0x2c,0x53,0x3a,0x03,0x43,0x1e,0x5e,0x57,0x95,0x52,0xe8,0xa6,0x4f,0xc4,0xfb,0x7d,0x92,0x6a,0xa8,0xff,0xfe,0x06,0x40,0x69,0x84,0x64,0xc4,0x45,0x4c,0xe3,0x5f,0xe8,0x3f,0xf2,0x63,0x05,0x1a,0x01,},"\x5c\x92\x95\x88\x1b\x7a\x67\x06\x69\xb0\x4c\xbe\x0d\xab\xd8\x96\x93\xb7\x7f\x7c\xce\x0d\x4a\x33\xf5\x2e\x02\xeb\x26\x95\x9e\x71\x3d\x9a\xef\x5f\x95\x44\x2b\xdf\x91\x72\x83\x83\x32\x52\x02\xaa\xcc\xc0\x37\x47\x7e\x36\x66\xfa\xca\xf2\x4e\xac\x95\x34\x87\x9a\xa3\xef\xe1\x8f\xfc\x1a\x5c\x54\xe3\x9c\x76\x87\xd0\x93\x7b\x24\x71\xba\xb3\x89\xb6\x46\xcb\xe6\xb3\xe5\xd5\x96\x1e\xa6\x3b\xd4\x52\xb4\x74\x33\x44\xce\x4c\x79\x33\x74\x52\x37\x95\xc7\x81\xee\x84\xd5\x11\xe2\x94\x11\x19\xba\xd1\xf4\xa7\x46\xed\x9d\xba\x89\xc8\xd0\x75\x1a\x64\x02\x71\x86\x35\xf6\xe3\x1d\x9e\x18\x68\x1c\x69\x56\xc5\x37\x32\x51\xd3\x5f\x53\xba\xa1\x98\x7c\xd4\x48\xc9\x03\x1a\x07\xf3\x2c\x80\x29\x11\x9d\xe3\xa9\x16\x31\xde\xde\x1d\x93\x3e\x0f\xa3\x26\x29\xaf\xe1\xb4\x2e\xb5\x91\xc2\x2f\x87\x33\x1e\x93\xcc\x08\x3c\x23\xf6\x4a\x6e\x5e\x58\x6f\xf3\x1c\xc0\x4e\x42\x3c\x56\xae\x3f\x6a\x73\x94\x6c\x48\xde\x4d\x85\xab\x00\x17\xba\x24\x45\x6d\x69\xb5\x9d\xca\x6d\x40\x3b\x64\xb0\x7c\x40\xd3\xb9\x0e\x12\x23\x21\x5e\x3f\x7e\x87\x6c\x67\x01\x11\x1e\x37\xe5\x17\x77\x08\x87\x31\x0c\xa8\x56\xf0\x09\xa0\xd6\x06\x54\x83\x5d\x94\xe6\x58\x7a\x43\x9d\xa5\xdb\x0a\x0c\x37\xd7\xc9\xd3\x7c\xa1\xd7\x03\xe1\xb3\x22\x76\x31\xad\xac\xaa\x79\x42\x1a\x1c\x43\x9d\x60\x34\x9a\xe5\x77\x41\xb7\xa8\xad\x09\xec\x29\x31\x23\x03\x0b\xf6\xba\xc0\x68\x9e\x53\x1c\xa7\xe7\x27\x18\x22\x3f\x9e\xa4\x3b\xec\xb0\xee\x9d\x9c\x1a\xb8\x45\xed\x1c\xae\x44\x3e\x3c\x5d\x4a\x9b\x1e\xde\x6d\xb3\x41\x7c\x3a\xce\x28\x11\x43\xf4\x2d\x85\xf5\x99\xb3\xb9\xd3\xd0\x5f\xa0\xed\x07\xc1\xec\x35\xff\xab\x03\x05\x16\x8b\x4e\x56\xe5\x8a\xfa\x06\x17\xf9\xa8\x6b\x1b\x5b\x20\x1d\xcc\xb0\x72\xb4\xce\xf0\xbb\x7b\x95\xc5\x2d\xae\xef\x9d\x9e\x74\x24\xa5\xc0\xf1\x48\xf9\xff\xe6\x0a\x5b\x23\xe0\xff\x82\xc7\x30\x99\x2a\xc9\xc1\x7f\x97\xf0\x65\xcf\x0a\xd5\x37\x7e\xac\xcb\x31\xd8\xbb\x92\x3b\xd2\x60\xea\x11\x9e\x6f\xa9\xbd\x69\x83\x48\x2d\x70\xd9\x21\x91\x02\x40\x2d\xc6\xa3\x49\x91\x93\xd0\xc1\xcd\x3e\xd2\xa6\x69\x21\xa9\x8d\xf6\x9b\x79\x14\x13\xf4\x97\x0b\xbc\xe0\x4f\x63\x9a\xf9\x09\xc6\x4f\x45\x60\xdb\x0a\xf6\x00\x3d\xc4\x62\x19\xe8\xad\x2b\x37\x2f\x8b\x5f\x81\xcf\xaa\x04\x1a\xb7\x1a\x34\x8c\x93\x1e\x8d\xfd\xbc\x40\x9c\x22\xd7\xee\x6e\x07\x62\x6e\x10\x4e\xc6\xcc\x7c\x6a\x41\x16\x17\x7f\x93\xaf\x16\xf1\x24\xf1\x96\xda\xb6\x19\xb6\xf6\x98\xc2\xd1\x91\x85\x8e\x96\x0c\x2e\x94\x7b\x51\xf3\xac\x48\x38\x75\x9c\x21\xfe\xf7\xeb\xae\x35\xda\x24\xf5\x5e\xbd\xa9\xb9\x87\x9a\xea\x17\xa6\xd8\xd9\x27\xde\x48\x7b\x17\x5f\xd7\xfa\xa2\x14\x38\xa2\x09\x23\xdd\xbb\xca\x72\xe6\x72\x69\x34\xbd\x6c\x21\xe8\x11\x80\x19\xf6\x5b\x38\x10\xa0\x7f\xa2\x7b\x1c\xba\x64\xd0\xf3\x9f\x0b\xfd\x49\xdc\xfa\xfd\xef\xe3\x79\xbd\xea\x82\xf3\x1a\x9c\x39\xf7\xe8\x1d\x29\x43\x37\xd1\x0f\x1e\x9d\x8b\x50\xeb\xa4\x58\xce\x7b\x75\x3d\x36\x96\x85\x38\x51\x3e\xdd\xb0\xe8\x45\x34\x41\x1c\x4a\xf3\xf0\x21\x46\x10\xee\x39\x01\xa0\xeb\xf3\x16\x17\x3c\xca\xf1\x5c\xd7\xee\x49\x6d\xbf\xc2\x46\x5e\xb8\x34\xdf\x62\x02\x9d\x62\x1f\xe9\x11\x82\x4d\x79\x87\xdf\x2d\x46\x34\x6b\x4d\xce\x1e\xce\x7d\x19\xd5\x51\x18\xc0\x37\xc9\x95\x51\x11\xd0\x7f\x1f\xc3\x62\xc7\x39\xf1\xea\x5b\x27\x5c\x71\xc0\xae\xbf\x59\x65\x5e\x2d\xef\x16\xe1\x23\xb3\xeb\x25\x26\xc3\xca\x5e\x83\xcb\x24\xd5\xb6\x8d\x7a\xc4\x0a\x67\x59\x33\x84\xc5\x63\xaf\xe0\xb5\x52\xad\xaf\x60\x80\x50\x35\xbe\x97\xb8\x06\x76\xad\xeb\x15\x76\x52\x08\x33"}, -{{0xb1,0xe4,0x7c,0xa3,0x1c,0x64,0xb6,0x8a,0xaf,0xaf,0xb4,0x43,0x51,0x2e,0x66,0x78,0x7c,0x65,0x92,0xf3,0x34,0xaa,0x78,0xfa,0x21,0x9a,0x3d,0x93,0xc3,0x3a,0x4a,0xb3,},{0x58,0x11,0x9b,0x38,0xe6,0xa1,0x48,0xa9,0x36,0xbc,0x5f,0x92,0xf4,0xf2,0x9b,0x98,0x2f,0xf2,0xcc,0xa6,0x4a,0x5a,0xff,0xa1,0x4c,0xa1,0xb6,0xa6,0x2f,0xe3,0x28,0xc4,},{0xdf,0xac,0x86,0xdf,0x58,0x6e,0xc3,0x4c,0x7c,0xfe,0xa5,0xd5,0xa6,0xcd,0x11,0x40,0xe5,0x0b,0x6b,0xf0,0x50,0xf8,0xe4,0x1a,0x19,0x0e,0xbf,0xd3,0xb1,0x43,0x2b,0x95,0xa5,0x7d,0x56,0x52,0xdb,0xae,0x8f,0x53,0xe0,0x37,0xae,0x32,0x6e,0x7f,0x18,0xcf,0xef,0x7c,0x77,0x9f,0x40,0x34,0x6f,0x7c,0x0d,0x86,0x44,0x61,0x05,0x93,0xf2,0x09,},"\x76\x7e\xc1\xb3\xda\xf2\x04\x38\x7f\x3f\xd3\xb2\x00\x10\x78\x1a\xfb\x1f\x38\xf6\x14\x47\x42\x13\x28\x7f\xff\x11\x30\x7f\x5f\xf5\xae\x7e\xc9\x45\xa2\xb9\xb4\x87\x00\x49\xd4\x53\x2f\x8f\x61\xc1\xa7\xb5\xf2\x11\xfc\xa2\xe6\x7c\x37\x4d\x96\x21\x9d\x8e\xa9\xde\x73\xf0\xe3\x87\x04\xfc\x94\xc0\xe9\xe7\x2f\x2e\x15\xda\xba\x3f\x88\xf7\x49\xb1\xed\x70\x26\x60\xdb\x1a\x35\x2a\x26\x67\xd4\xdf\xd4\xe0\x0a\x18\xef\xa4\xc6\x60\x9e\xe9\xc9\xa8\x8a\xda\xcb\xbb\x98\x5d\x3d\xe8\xdd\xd1\x7d\x4e\x4e\xb7\xcf\x74\xa1\xda\x91\xed\xb3\x90\x85\x2e\xa4\xcb\x9a\x42\x4f\x7f\xa2\x22\x9e\x08\x30\x33\xa3\x40\x59\x11\x7e\x5e\xfa\x7b\x66\x13\xd7\x5e\x58\xb7\x02\xc6\xce\xe5\xd0\x04\xe8\x59\x9b\x97\x50\x3a\x5f\x10\xc4\xc4\xe5\xb9\x57\x73\x71\xd3\xd0\x5b\x2d\xfb\xf7\xcb\xef\xe6\xd0\x92\xd6\x5c\xbd\x40\x51\x38\xd9\xb0\x4c\x51\x86\x23\x59\x83\xfa\xb6\xd4\xce\x85\xb6\x36\x27\x62\x06\xd7\x4a\x2e\xe7\xdb\x61\x64\xda\xc4\x7c\xce\x78\xf5\x0d\xb9\x9a\xf6\xac\x6e\x70\x64\xc1\x3a\xab\x79\x3b\xe8\x7e\x66\x28\x9c\x94\xa0\x9f\xb0\xa3\x1d\x97\x97\x1e\xdd\x74\xea\x9c\x0c\xe8\x74\xd2\xb7\xd6\xc4\xab\xae\xff\x07\xf8\x70\x22\x51\x51\x94\x6a\x5c\x47\x6f\x6b\x97\x89\x96\xb8\x7d\x8c\x98\x46\x06\xc7\x91\x28\x7d\xa6\xba\xd0\xaa\x44\xb0\x13\x0b\xe8\x86\x71\xa5\x56\xe2\xde\x35\xc4\xcb\x03\x8e\xe7\x81\x27\x35\x30\xac\xe0\xa1\x04\xc2\x78\x09\xae\xe0\x33\xc8\xbf\x90\x29\xd9\x0f\xe7\xba\x06\xaa\xa9\x4e\x16\xa5\x2c\x64\x3d\xfd\x92\xa7\x62\x4f\xbb\xee\x77\xa7\x15\x8b\x2c\xc1\x51\xbd\x3f\x61\xa1\xa7\x6f\x32\xb2\x84\x89\x30\x7a\xcf\x0d\xd8\xc2\x6c\xc4\xad\xbb\xb8\xde\x43\x0d\xb4\xe4\xf5\x83\x08\xb6\xab\x90\x45\x61\x11\xde\xac\x29\x78\x17\x2f\xe1\xfc\x0c\xe4\x98\x08\x8a\xdd\x4c\x31\xc2\x1f\x24\x27\x90\x25\xfe\xb4\x8c\xbb\x7a\x92\x0c\xff\x2d\x28\x71\x05\x87\xaf\x52\xc8\x44\xdb\x8a\x7a\xeb\x7d\xf1\x0d\x43\x41\x1a\x3c\x8e\xee\xbb\x40\x6d\x6e\xfc\xb1\x92\x48\x88\x7d\x45\x0b\x57\x3d\x90\x30\x5e\x1f\x23\x75\x3e\x89\x05\x11\xdc\xc7\x7c\x74\x0e\x31\x6a\xd7\xf5\x2d\x49\x02\x07\x3d\xb3\x99\x8e\x4e\x4a\xcc\x4e\x01\x88\x5b\xd1\x18\x8e\xcd\x61\x65\xae\xde\xd1\xe7\x78\x70\x2b\x6a\x6a\x79\xa9\x49\x99\x10\x2d\xf7\x20\x18\xf7\x92\xf8\xf1\x62\x00\x7e\x81\x2a\xef\x8f\x95\x6e\x12\x32\x82\xbb\xdb\xd0\xc3\x56\x12\xc2\xd3\x47\x3f\x94\x4c\x6d\x76\xbe\x9e\x86\xff\xfa\x46\xcc\xb1\xae\x13\x50\x5a\x4a\x81\xf3\x1b\x84\x26\xb8\xb6\x0d\xe8\xe8\xa7\xc1\x6d\x1e\x16\x65\xb2\x71\x43\x46\x65\xc4\x42\xa9\xc6\xa9\x77\xce\x98\x6f\x69\x93\xb7\x43\x9a\xf0\x3b\x40\x2e\xea\xff\xf1\x45\x6d\x15\x15\x26\xd9\xc5\x8f\x51\x5f\xd2\x48\x5e\x0c\xbb\x32\x4a\x50\x3a\x8d\x49\x13\x44\xcd\xb2\xaf\xf4\xc4\x1a\xa8\xe2\xed\x66\xe5\x80\x83\xbf\x0d\x2f\xbf\x48\x77\xc8\x5a\x4b\xcd\x6b\x9c\xbb\x82\x12\x42\xc9\x41\x47\xe5\xfd\x8b\x7d\xd7\x92\xad\x0a\x28\xd4\x9d\x41\x10\x0b\x43\x1b\xb4\xd8\xc7\x83\x3d\x85\x05\xdd\x9e\x26\x49\xf9\xca\x70\x51\xbe\x68\x71\x2e\xf3\x63\x71\x02\x03\x6b\x00\x26\x49\x47\x3c\xe2\x59\x67\x7d\x82\xc6\x06\x28\x95\xe1\x61\x92\x8b\x75\x2f\x13\xc9\x1a\x45\x95\x5e\x80\xf0\x07\xde\x69\x0e\xdf\x8a\x0e\x5e\xee\x44\x22\xe1\x62\xb9\xd2\xb4\xa9\x21\xd3\xa6\x48\x45\x79\x3a\xa2\x22\x9e\x9c\x23\x9e\x57\xa6\xb1\xa9\x0a\x52\x54\xc3\x51\x2f\x99\x34\x53\x15\xac\x7d\x34\x57\xf9\x15\x42\x96\xc6\x68\x22\xab\xe1\x84\xd6\x4e\x57\x2b\x9c\x38\x49\x29\x58\xe2\x1b\x02\x92\x67\x54\x10\xe7\x34\x8b\x2b\x71\x8a\x0b\x75\x92\xca\xee\x94\x58\x1a\x94\x8d\x2f\x41\xfa\x03\xc6\x1e"}, -{{0xfb,0xd5,0x5f,0xa7,0x43,0xc3,0xa5,0x91,0x0b,0x38,0x57,0xdd,0x0b,0x6a,0xa5,0x84,0xf3,0xb2,0x38,0xde,0x05,0x6b,0x76,0xab,0x76,0x17,0xae,0xb5,0x26,0x38,0xfe,0xf6,},{0xa7,0xa1,0x63,0xc4,0x18,0x3b,0xd8,0x4b,0x75,0x6d,0xf3,0xc8,0xaf,0xdf,0xb9,0xcd,0x5b,0x24,0x23,0x52,0xd9,0x49,0x9e,0xbd,0xab,0x90,0x78,0x5c,0x3b,0xd6,0xdb,0x2d,},{0xef,0xfb,0x29,0xda,0x69,0x85,0x97,0x1c,0x20,0x2e,0x24,0x50,0x30,0x1d,0x49,0x71,0x1b,0xed,0x25,0xfa,0xd8,0x5f,0x61,0x99,0xd1,0xeb,0x1e,0x71,0x91,0x4d,0x96,0x4c,0xbe,0x18,0xe3,0x4c,0xc3,0xe3,0x28,0x72,0xcd,0xec,0x02,0x6b,0xd1,0x19,0xa4,0x1c,0x1c,0x07,0xca,0x41,0xe8,0x2a,0xcb,0xa6,0x2f,0xb0,0xa7,0xc8,0x2a,0xed,0x80,0x0c,},"\xbf\x52\x52\xb2\xae\xca\x11\x63\x77\x1f\x76\x62\x78\x76\x80\x66\xf2\x19\x71\x35\x7e\xa7\x99\x61\x58\xa8\xd6\xe9\x08\xdd\x59\xb5\x99\x71\x34\x9f\xa1\x78\x82\xcb\x92\x24\xb9\x72\xd0\xff\xab\xe8\x55\x10\xdc\xf2\x5a\x9f\x9f\x9b\xde\xfa\xd2\xf4\xca\xdf\xbb\xda\xcc\x1f\xca\x9d\x94\x8c\xb5\x41\x2f\x47\x4c\xad\x23\xb5\xb9\x19\x9b\xf3\xc7\x37\x06\x41\x33\x9b\x75\x0e\x1f\x78\xc2\xad\xb4\x60\xaa\x5b\x21\xb1\xfa\x8f\x97\x71\x4a\xbb\x4e\xd5\xe9\xcb\x51\xd6\xde\x55\x81\x66\x18\xab\xd3\xfd\x2b\x28\x6b\xc1\x1c\x67\xba\x01\x12\x93\x73\xd4\x35\xb3\xe7\xe3\x91\xba\x37\x26\x14\xda\x83\x22\x87\x5e\x46\xa6\x75\xb6\x45\x15\x60\x24\xca\xd2\xdd\x13\xf9\xa0\x81\x61\x6b\xf1\x31\xa2\x43\x58\x89\x4e\x0e\xfa\x1d\x56\x64\x8f\xfb\x42\xef\xb5\x40\x31\xda\x7f\x37\xd1\x97\x61\x51\x55\xae\xdb\x69\xc4\xe7\x09\xc8\xbb\xbe\x7f\xbf\xcb\x59\x83\x47\xac\x5d\x0c\x63\x84\x07\x84\x7b\x28\x1c\xf1\x16\x43\x30\x97\xf5\x66\x21\x58\x71\x9f\xcd\xd3\x7b\xeb\x48\x92\x68\xce\x71\xde\x7d\x70\xed\x92\x5f\x74\x3f\xc6\x3a\x71\x5f\x7e\xee\x75\x49\xfd\xb9\x09\xcc\x45\x4c\x98\x8b\x30\xae\x4d\x77\xd6\x2f\x65\xa0\x7e\x2c\x8f\x93\x62\x38\x5d\x02\x8a\x60\x31\x08\xc9\x45\x87\x2f\x5e\x1a\x97\x41\x98\x78\xed\x49\x54\x2e\x28\x8e\xf0\x7b\x5c\x90\xf5\xc4\x15\x9e\x16\x23\x03\xd0\x80\xf6\xac\x2b\x05\x8d\xdc\xac\x60\x74\x6f\x9e\x1c\x9e\xc1\xdf\x8e\xda\x42\xd6\x27\x38\x58\x6d\x3f\xdd\x65\xdf\x55\xf4\x37\x4f\x32\x94\xe0\x86\x8d\x41\xef\x0b\xb1\xfd\x55\xe0\xcb\xf1\x95\xbb\xfc\xfc\xde\x5b\xdb\x41\xfa\xd9\xa0\x47\x7e\x4c\x90\xca\x27\xfa\x8c\xf5\x03\x36\x2a\x33\xfd\xec\xa5\xa4\xf0\xff\xea\x26\xe8\xd7\xe1\x34\xfa\xd3\xb1\xec\x3d\x05\x60\x55\xbb\xa5\xe6\x5d\x81\x15\x3e\xe8\x31\x87\x3b\x93\x8d\xf7\xd2\xc8\x3c\x2a\x52\xb3\xc2\x21\x82\x7f\x96\x1b\xd0\x08\x36\x22\x32\xd8\x82\xa0\x41\x2a\x04\x7a\xfd\xfb\x85\x97\xc8\x65\xa2\xaa\x2c\x2c\xf5\x18\x99\x34\xa8\x3e\xe6\xb7\x52\xa6\x26\x94\x1e\xdc\xe0\xc2\x0b\x6f\x7a\x69\xf1\xcf\x12\xf9\xa3\x31\xcd\xfa\x9e\xda\x24\xc8\xde\xfa\x76\x9c\xcc\xe2\xef\x74\x6c\x30\x7d\x8b\xb0\x48\x91\xfc\xef\xd4\x9a\xf3\xe6\xf9\x69\x91\xa7\xa2\x0f\x27\xb6\xc0\xaf\x12\x18\xbe\x31\x79\x1d\x1d\x02\x93\xe0\x81\xb9\x0a\xf3\xb9\x2e\xcb\x17\x5e\xc8\xc7\x89\xf7\xa8\x64\x2e\x04\x1e\xc3\xa6\x1a\xae\xfe\xf6\x2a\x80\x7d\x1a\x50\x54\xad\xf8\x32\x3b\xed\x94\x22\x41\x62\x37\x32\xa2\x05\x1d\xc0\x1f\x9a\x20\xa2\x9a\xa4\x8b\x3f\xdf\x26\x5d\x0b\xa6\xc1\x38\xfb\x57\x93\xe2\x87\x50\x02\xe7\xde\x3f\x5c\x3f\xf7\xe8\x3a\xd2\x7d\x11\x1c\x84\x8b\x7e\x6e\x2e\x5a\xd5\xf2\x8e\xb7\xc3\x63\xf9\x5f\x96\x0c\xbc\x42\x13\x36\xce\x98\x5f\x94\x6b\x05\x15\xb1\xbd\xd3\xa8\x32\xc3\xfe\x90\x3f\x7b\x44\xe2\x0c\x92\xea\x80\x82\x6f\xbf\x97\xe2\xa4\xfc\xaf\x2d\xb1\xa0\x86\x98\xdd\x62\xed\xd0\xa8\x45\x89\xd7\x46\x2c\x44\x7b\x4a\x89\x6f\xe0\x08\x60\x04\x24\x96\xbd\x51\xb1\x92\x5c\xb7\x9c\xc3\xb8\x29\x01\x6a\x4c\x7e\x62\x79\x0f\x80\x58\xc5\x46\xf2\x14\x5a\xaa\xef\x4d\x4b\x1e\x27\x3f\xf6\x13\x00\xf8\x00\x8e\x94\x6b\x62\x2f\x60\xe5\x05\xf5\xf6\x29\x0d\x51\xeb\x99\x7d\x20\xfc\x3f\xbb\x3e\x99\xed\xd6\x8f\xf5\xcc\xe9\xe8\xc2\x83\x88\x1c\x36\x4f\xf2\x15\xcb\x50\x04\x5e\x60\xf4\xa7\xee\x45\xb6\xc9\xd8\x64\x47\xf3\x81\x41\xd3\x42\xdb\xc5\x30\x8f\x8c\x66\xef\xc4\x7f\x7c\x45\xf6\xd2\x5e\x65\x64\x30\x9a\x86\x2d\xb9\x0f\x4d\xf3\x31\x78\x7e\xcd\xd8\x9d\x3a\xaa\x46\x05\x3e\x29\xf1\x02\x62\x4d\xdf\xe8\x0e\x8a\x3f\x99\x28\x7c\xec\x19\xfa\x83\xe4\x4d\x55\x7c\x04\x41"}, -{{0x5d,0x66,0xce,0xb7,0xc6,0xe5,0x8c,0xac,0x91,0xe2,0x88,0x27,0x91,0x70,0xe8,0x18,0xe7,0x87,0x18,0x0c,0x6b,0x42,0xdf,0xa1,0x68,0x78,0x7d,0xd0,0x7f,0x80,0x9f,0xa4,},{0xef,0xc9,0xb3,0x5d,0xb8,0x1f,0x34,0x61,0x98,0xa7,0xac,0xc6,0x9f,0x65,0xfd,0xfb,0xf4,0xc2,0x2e,0x68,0xdd,0x76,0x12,0xe3,0xb8,0xec,0x68,0xd3,0x78,0x55,0x3b,0x8d,},{0x6e,0xf2,0x64,0xab,0xf8,0xb0,0xe5,0xc2,0xd7,0x93,0xb2,0xc7,0x52,0x79,0x61,0x4a,0x39,0xc7,0x75,0xeb,0x2b,0xcc,0x08,0x91,0x06,0x7a,0xbc,0x61,0xf6,0xd6,0x44,0xa6,0x9f,0xf8,0xf8,0x14,0xa3,0x05,0x22,0xcc,0xa9,0x05,0x36,0xf0,0x12,0xc6,0x28,0x3a,0x76,0xc3,0x2b,0x89,0xee,0xe1,0xbd,0x9a,0x43,0x36,0xf4,0xfd,0xda,0xc8,0xdc,0x0b,},"\x94\xd7\x2f\x6d\xec\x4f\x7c\x92\x06\xb4\x15\x10\xce\x71\xa0\x29\x55\x60\x4f\x3c\x5d\xe8\xe4\x47\xd5\x87\x18\x65\xa7\x58\x98\xa4\xd2\x07\xa2\x6c\xf3\x3d\x10\xca\xf0\x5a\x0b\x6e\xd0\xd3\x89\xfe\xe9\xed\x49\x27\x50\x98\xa8\x8e\x1c\x0d\x83\x04\xe8\x1b\x40\x74\x21\x4c\x7a\x5c\xe1\x57\xeb\x26\x17\xef\x04\xe1\x32\x4b\xa9\x42\x12\x9f\xaf\x32\xc3\x1c\xb4\xaa\xe4\xa5\x91\x6c\x75\x08\x08\x72\x68\x56\xf7\x18\x0e\x57\x97\xed\xe4\x43\x62\xd7\x47\xd7\x0c\xec\x15\x9d\x3b\x6a\xce\xc6\x3a\x51\x4c\x7e\xf3\x1b\x2e\xcd\x16\xdb\x7f\xe6\x8e\xa9\xc5\xea\xd9\xd8\x70\x92\x18\x00\x34\x8f\x69\x54\x12\xf3\x09\x3e\x61\x98\x5a\x31\xea\xdb\x79\xb5\x9d\x91\xdd\x9a\x37\xf8\xd4\xef\x7a\x5d\xdf\x22\x3d\x4b\x24\x77\x4c\x2e\x44\xe3\xf2\x71\xff\xb8\x50\x0d\x59\x53\x81\xb3\xdf\x2e\x8e\x6b\x79\xee\x65\x53\x5a\x51\x9a\x43\xea\xa5\xe5\x2b\x25\x6c\x26\x43\x30\x5e\x31\x70\xcb\xe5\x76\x06\xa0\x54\x5f\x85\x86\x56\x5c\xfb\x75\xbf\x5e\x95\x64\xc6\x2a\xf0\x5f\x15\xee\x6e\x62\xaf\xee\xf8\xc2\xc7\xa9\xda\xe2\x35\xc9\xed\xd1\xd7\xc2\x5c\xf4\x9a\xdc\x03\x3e\xe7\xb5\x83\xf5\x18\xbc\x16\x8e\xa4\x88\x36\xb5\x0f\xfe\xdd\x20\x32\xb3\xf6\x30\xcc\x56\xda\xad\xd5\x13\xeb\xda\x86\x48\x23\x61\x0f\xc6\x7a\x72\xb9\xa7\xd8\x11\x71\x05\xc1\xc7\x1d\x85\xa9\x6b\x1d\x27\xa4\x41\xfa\x1e\x7c\x6c\xf8\x02\x33\xa4\x9f\xe0\xe7\x6a\x40\x27\x8d\x06\xe3\x43\x47\xd8\x7b\xe7\x7b\x98\xde\xd5\xe2\xa3\xea\x1a\xfb\x13\xbe\xe1\xe6\xcd\x6c\xa6\x3b\xe5\x4f\xcf\x88\xa2\x0c\xcb\x7a\x9f\xc3\x24\xbf\x61\x43\x20\x1b\x44\x48\x3b\xcc\x96\x40\x33\xda\xb7\x1c\xf8\xf2\xa5\x91\xfc\x05\x0d\x57\x24\xe9\x5a\xa5\x0d\x32\x89\x6e\xec\x0f\x3b\x34\x31\x1d\x2a\x99\x34\xe9\xf8\x52\x97\x7e\x25\x3f\x15\x30\x4c\xae\x24\x16\xc2\xc4\xfc\xd8\xf1\xfe\xcc\x3f\x1f\x64\xbb\x79\x75\x99\x29\xab\xb0\xe8\xe8\xf5\xf7\x29\x3d\x69\x1a\xf2\x2a\xbd\x3b\x2a\x67\x70\xb0\xcf\x14\x46\x08\xf2\xd6\x2c\xc7\xe5\x2b\xfe\x33\x3b\x2e\xd2\xde\x39\xb9\x9a\xfd\x37\xe3\xac\xf0\x7e\xda\x37\xdd\xf0\xdf\x02\x9b\xff\x2e\xc2\x25\x44\xb6\x0b\xd7\xdb\x23\x8d\xf1\x97\x5f\xfa\x00\x75\xa8\x2a\xbd\x8d\x6b\x05\xb2\x67\x18\x0b\x87\x0e\x21\xab\xf3\x69\x81\xae\x77\x68\xde\x53\x99\x3b\x30\x4f\x1c\x54\x53\x87\x2f\xdf\xa8\xed\xad\x45\xf8\x00\x1a\xa0\xe7\x34\x2b\x3b\x58\xec\x0f\x38\x9d\xcb\xc2\x71\xfb\x0f\x90\x00\x62\x87\x57\xab\xba\x58\xc0\x57\xe1\xa0\x89\x9f\x6f\xaf\x15\xf3\x74\x0f\x31\x43\xf5\xc0\xb7\xa9\x15\x96\x80\xde\x8c\x55\x72\x66\x44\x1b\x3b\x01\xca\xac\x12\xec\x27\x8f\x5a\x10\x25\xdf\x53\xed\xb6\x13\x4c\x96\x66\x3a\x96\x66\xae\x3b\xaa\x90\xfc\x83\x51\x11\xef\x05\x1b\xd9\x12\xf6\x79\x67\x44\x91\x13\xb6\xa8\x5f\x71\xdf\x8c\x60\x37\x72\x4e\xb8\xfc\x7d\x83\x19\xbc\x03\x85\xbe\x9b\x0e\x99\xe9\x5f\x9a\xed\xca\xe8\xd4\x5a\x51\x44\x76\xf0\x5b\xcd\x72\x35\xc0\x13\xeb\xc3\xae\xa9\x12\x3c\x67\xaa\x6f\x3b\x79\xc8\x5e\xa5\xdb\x15\x9e\xef\xad\xfb\x75\xa5\x0a\xc6\xb9\x5b\x49\x6b\x55\x72\x58\x1a\x76\x11\x2f\xf6\xdb\x26\x3f\xc1\x4c\x58\x18\xaa\xd5\xbc\xa3\xb2\xcb\x3a\xc8\x11\x6d\x42\x94\x82\x78\x1e\x06\xf6\x1e\x75\x63\xe6\x50\x5e\x51\xc8\xff\x99\x8b\xf8\x4a\xed\xb5\x20\x2e\x2f\x9f\xf4\xc2\x68\x98\x20\x29\x6c\xc6\x96\x03\x09\x1b\x8b\x81\x8f\xbe\xb2\xaf\x5f\x4c\x57\x06\x0d\x98\xc1\xa9\x04\x84\x3a\x70\xbf\x97\x5b\x3c\x3c\xa6\x03\x1a\x4c\xad\x5b\x4b\xbf\xba\x7e\x9b\x47\x49\x1a\xb7\x40\xd9\xeb\xe4\x1d\x76\x88\x10\xcb\x8c\xc5\x1a\x93\x7f\x7e\x3b\x22\xe3\xcf\x07\xce\xae\x0c\xe2\x08\x31\x49\x5a\xfc\xdd\x8c\x1a\x98"}, -{{0x62,0xed,0x86,0x82,0xbd,0x3a,0xb3,0x96,0x6e,0xba,0x3b,0xff,0xb7,0x75,0xa3,0x18,0xa0,0x3d,0x99,0x93,0x19,0x79,0xe9,0x9f,0xeb,0x2d,0xdb,0xd6,0x94,0x55,0xa0,0xef,},{0xd3,0x2a,0xda,0x17,0x8b,0x3e,0xc7,0x70,0x0c,0x47,0xdd,0x6d,0x36,0x53,0x22,0x03,0x3f,0xe4,0x31,0xc3,0x02,0xb4,0x6f,0x8d,0x58,0x79,0x8e,0xd8,0x33,0x71,0x56,0x6b,},{0x3d,0xa8,0xd1,0x4d,0xc4,0xe7,0x1f,0xe6,0xc3,0x2e,0xde,0x46,0x37,0x88,0xe4,0x1b,0x82,0x6b,0x4e,0x21,0x60,0xba,0x10,0xc9,0x5f,0x1c,0x8a,0x27,0x49,0xaa,0xd8,0xf1,0x2e,0x98,0xae,0x24,0x68,0x30,0x3b,0xaf,0x69,0x08,0xbd,0xb3,0x5e,0xf3,0x8a,0x5e,0xcd,0x77,0x74,0x1e,0x72,0xee,0x3a,0x42,0x7f,0xd9,0x04,0xda,0xe6,0x6f,0xcf,0x03,},"\x9e\xb1\x3b\xc7\xfa\xcf\x51\xa1\x80\x54\x1e\xc1\xdc\x5f\x5a\xcb\x14\x8c\x8d\x5e\xad\xcd\x2c\x4e\xf0\x68\xbc\xdd\x11\xb3\x49\x25\xea\xbf\xaf\xab\xfe\x82\xa2\x84\xbc\xba\xee\x13\x81\x15\x2a\xf8\xe5\xe0\x9f\x03\x7c\xf1\xbb\x64\x84\xac\x18\xe3\x73\x59\xbf\xaa\x4c\x87\xaa\x07\xd3\xd1\x4e\xd0\x89\xb0\x53\x91\x0d\x1f\xa4\x73\xf7\xbc\xe1\x43\xe2\xa5\x9c\x4d\xaf\x99\xb6\xc6\xe4\xe9\x29\x1d\x97\xc8\x64\x71\x2a\xf3\xea\xba\x53\xce\x25\x17\xa4\xf7\x5c\xd7\xec\xf2\x78\xf3\x4e\x22\xb7\xdf\xfd\x08\x8f\xa5\xec\xad\xc0\xdd\x22\x13\x5e\x42\xa5\x36\xc6\x84\xf2\x19\x5d\x31\x5f\x69\x24\x57\x1e\x46\x3f\x5c\xfc\x11\xb9\xf9\xd0\x5a\x7e\xa1\x1b\x98\xa1\x69\xa1\xe3\x93\x60\x97\x3c\x50\xad\x45\xc7\x49\x1b\x57\x13\x8e\xc0\x50\xf4\x3c\xbd\x5d\x17\xeb\x3f\xe0\x01\x3e\x3d\x28\xd5\x26\x05\x4e\x07\x63\x31\x52\x24\x6f\x16\x55\x4f\x30\x54\x74\x9e\xea\x68\x7b\x9c\x37\x1b\x40\x9c\xd3\xec\xef\xb1\x11\xa1\xd6\x00\x40\x73\x44\xe6\xd6\xec\x38\xc6\x0f\x6e\x54\x5a\x92\x38\x2e\x46\xc4\xd1\x13\x12\x5d\xbe\x5b\x98\x26\xe1\x27\xf1\x01\x81\xa3\x5a\xcf\xff\x28\xab\x37\x64\xca\x7f\x23\x8f\xf4\x79\xfd\xbc\x45\xb7\xa2\xad\x0f\xf5\x38\xc8\xac\xd0\x01\x8d\x44\x70\xfe\xbc\xc6\xa3\x07\x65\x1c\xb5\x83\x2f\x32\x6b\x19\x24\x1b\xe9\x86\x7e\x4e\xca\x6a\xe3\x6f\x0e\x2d\x83\xfd\x77\xb9\x72\x02\xb3\x64\x71\x6e\x36\xd1\x89\x5a\x36\x85\x3e\x7e\x76\xe8\x8f\x62\xdb\xbf\x77\x26\xc2\x18\x05\x69\xc6\x66\x73\x83\x7a\xd7\x2f\xf9\x36\xcf\x0e\x2f\xdb\x9e\xc6\xaf\xcc\x79\xf8\x82\x9e\x15\x7f\x95\x22\x88\xf4\xe0\x0d\x04\x10\xa7\x22\x53\xbf\x60\x5e\xdd\xce\xb0\x14\x40\xde\xe5\xdd\x32\xb5\xa8\x03\x43\x9f\x03\x8c\x06\xaf\x1c\x90\xb2\x7b\x5f\xe9\x84\x3c\x27\xae\x76\x60\x9c\xbf\x83\x28\x35\xc0\xe3\xc4\xbb\x59\x97\x6c\xce\xde\x44\x87\x86\xd9\x1e\x43\x8e\x07\x75\xc0\x6a\x92\xd0\xf0\xb8\xdc\x0e\xf6\x82\x60\xf7\xdd\x9e\x68\x71\xc4\xd0\xc0\xc0\x94\x63\x85\x26\x15\x21\x85\x16\xf4\xa6\xde\xbf\xdb\x46\x27\x3b\x28\x33\x82\xcd\x9c\xa7\x44\xab\xf9\xfd\x43\x91\x94\xb8\xcf\x1b\xdb\xb3\x17\x5c\xa9\xc5\x7a\x1c\x37\x3c\x41\xfc\xe9\x2b\xd5\xfc\x01\x2b\x19\xa0\x69\x8a\xef\x37\xba\xf8\x06\xae\x09\xad\xd8\xcb\x97\x2a\x9e\xf9\xa7\xa5\xa9\xb1\xfd\x9a\x41\xd8\x54\xc3\x0c\xca\x13\x96\x14\x0e\x20\xc2\xb9\x86\x54\xfe\x6e\x51\x1b\x62\x6a\x43\x91\x5b\x22\xfb\x2d\xad\x74\x7b\xa7\xfe\x74\x60\xd8\xce\xbb\x20\x06\xfe\xa1\x9b\x32\x84\xb0\x9c\x06\xa6\xf5\x2f\x17\x9a\x32\xbe\xb5\x63\x57\xb9\x29\xa6\x59\xf0\xfe\x6a\x26\xb6\x97\x03\x3d\xef\x58\xba\x60\x3f\x43\x0f\x74\xaa\x35\x07\x09\x81\xdb\x74\xcc\xf1\x91\x90\xa1\xfb\x05\x14\x4e\xc0\xa0\x9a\x51\xe5\x47\x65\x06\x97\x30\xb0\x9a\x7a\x23\x31\xff\xb3\xde\x2a\x7e\x02\xc5\xe1\x84\xda\x40\x13\xdf\xe9\x37\xc3\x71\x11\x75\x24\xf7\xb2\x10\xba\x60\xe2\x69\x2d\xcd\xce\xf3\x6a\xb2\x27\xb4\xc4\xf0\x2a\x9f\x48\x89\x72\xb8\x47\xf0\xd6\xb5\x9d\x02\xee\x54\xfe\xde\x88\x21\xdb\x6c\xf7\x31\xcc\x8a\xc8\x95\x35\x0a\xc5\xcd\x4d\x6b\xaa\x3a\xd0\x36\xf0\x6f\x20\xd1\x0a\x14\x0c\x4a\xd3\xd1\x0c\xa9\x85\x53\x2e\x31\x60\x46\x27\x73\x38\x5a\x2e\xb5\xe4\x64\xd5\x28\xe1\xe5\x9c\x29\xf6\x6b\x3d\xe5\x9e\x9e\xa2\x8a\xf3\xf9\x7b\xfc\x55\x89\x03\x57\x52\xa5\xa5\x52\x3d\xec\xd2\xdf\xf0\x1f\xc0\x0f\xf3\x1b\x30\x15\x2f\xf5\xda\xfa\x33\x1c\x6a\xb1\x58\x73\xaf\x41\xaa\x96\x0a\xac\xe7\xd2\xcb\x4f\x95\xc2\x3d\xf4\x4b\x9e\x6c\x6e\x2f\x86\x78\x8a\x87\x2f\xd3\xa5\xcb\xe4\xac\xc9\x58\x10\xda\xa0\x9d\xcc\x1d\xf9\x33\x46\x5e\xf0\x40\xc5\x3d\x9d\x95\x9f\x9d\xad"}, -{{0x4e,0x57,0xf0,0x31,0x1f,0xff,0x0e,0x5d,0x53,0x88,0x49,0xb1,0x21,0x6f,0x69,0x5b,0x1a,0x52,0x77,0x94,0x17,0x08,0x20,0x4d,0xb2,0xf0,0xc1,0x5b,0x3c,0x73,0xc8,0x2a,},{0xe3,0x37,0x1f,0xe2,0x36,0xad,0x2f,0x6f,0x42,0xf9,0xe1,0xfa,0x4e,0x1e,0xda,0x2c,0x3e,0x29,0xc3,0x6c,0x8a,0xd2,0x21,0x8a,0x3c,0x03,0x79,0x82,0xf0,0xb5,0x79,0xec,},{0x4f,0xdc,0x7b,0x6e,0x28,0x27,0xf6,0x4b,0xa3,0xc0,0x33,0xc7,0xfb,0x6d,0x1b,0x35,0xdd,0x68,0x0f,0x53,0x29,0x99,0xa0,0xd7,0x7a,0xeb,0x27,0x6c,0x31,0xbd,0x9e,0x39,0xc6,0x70,0x97,0x8b,0xe4,0x72,0x43,0xc1,0x13,0x22,0x3a,0x57,0xaa,0x10,0x23,0x31,0x50,0x67,0x8b,0x40,0xdb,0x78,0x59,0x1c,0x04,0xd0,0x8d,0xf5,0x7a,0x70,0xa2,0x09,},"\x05\x2a\x1f\x41\xeb\xfd\x4b\xf6\x5e\xfb\x0e\xc8\xe7\x4d\xd7\xb3\x06\x5e\x9c\x48\x2c\x49\xb9\x92\x62\xe6\xdf\xa8\x40\x7d\x9e\x31\xed\x34\xd2\x29\xba\x41\xfc\x49\xa9\x4a\x13\x09\xf9\x90\xa9\x9c\xb9\x90\x2f\xb8\x4f\x4e\xde\x91\xbb\x64\x71\x45\x64\xa9\x13\xd5\x74\xd4\xa3\xc2\x86\xf0\xa1\x92\xa7\x8c\xe2\xd5\x5a\xae\x5c\x9f\xb0\x57\xff\x36\x12\x00\x18\xb2\xa8\xb5\x4d\x98\x08\x55\x37\xea\x64\xae\xa9\x99\xd5\x32\x1c\x78\x80\xb3\x6a\xb4\x30\x18\xea\x2c\x92\xa5\xe6\x83\x50\xd3\xde\x85\x26\xe2\xc8\xbc\x91\x41\xf4\x34\x9a\x18\xa3\x4f\x21\xde\x0a\xbb\xf2\x93\x09\x87\x56\x7f\x0a\xaf\x8e\xb1\x91\x45\x58\x0d\x71\x30\x6c\xe8\xa6\x9e\x79\xf8\xee\xa2\x6c\xfa\x0b\x8b\xeb\x49\xcc\x5a\xa2\xbc\x77\xb7\x97\xd4\xf8\xd5\x03\x26\xff\xb9\x37\x39\x9e\x94\xfd\xec\x85\xe1\x92\xf1\x27\x2a\x80\xe9\xa0\xeb\xba\xf5\xd0\x1f\x1b\x97\x06\x08\x02\xbd\x4a\xf3\x4c\x0f\x7d\x7e\x98\x54\x3f\x9d\x66\xd6\x0e\x0e\x6b\xc0\xbf\x9c\x99\x0b\xe3\x1e\xea\x19\x78\xff\xd1\x67\x33\xa8\xab\xe4\x95\x58\xb3\xad\xd0\xdc\xe6\xde\xfd\x64\xdc\x04\x3f\x15\x19\xb1\xe9\xbe\x66\xe0\x6e\x41\xec\xab\x16\x8c\x83\x39\xa8\x5e\x0b\x91\x38\x18\x64\x4e\xa7\xc5\x33\x44\x68\xfd\x71\x96\xa0\x1e\x1d\x4c\xe8\xdd\x1e\x7e\xe3\x13\xdd\x53\x50\xb8\xdc\xe4\xf5\xd7\xa6\xac\x09\x85\x7c\x4d\x3d\x0f\x10\xa3\xd9\x06\x26\x09\x75\x45\x92\xad\x10\x77\xb2\xe2\x09\x6f\xc9\xe5\xb1\x97\x8c\x98\xb5\x66\x0d\xdf\x51\xb4\x6e\xde\x9f\x9d\xcd\x41\xb2\xef\x44\xe7\x9f\x6d\xaf\xf7\xd3\x62\x68\x70\xe2\x24\x3c\xaf\xb2\xf4\x36\x79\x39\x10\x9e\xd9\xc0\x14\x84\xb7\x9e\xaa\x30\xa1\x89\x1e\xa1\x8f\x98\x4e\x16\x1d\xcd\xd1\xbd\xa3\x71\x34\xbf\x67\x35\xd2\xb2\x14\x9b\x48\x98\xda\xcb\xfd\xa6\x1e\x60\x02\xd7\x2a\x6f\xc5\xd2\x1f\x10\x98\x21\x32\x31\x13\x2d\x56\xdf\x68\xd6\xa9\xbf\xdf\x4e\xdd\xc0\x52\x4d\xb8\xfd\x8f\x24\x88\x52\x04\x9a\x68\x25\xa5\xed\xd2\x36\x0c\x00\x9a\xf2\x4f\x0a\x94\xc5\x07\x9d\xdf\x6f\xe7\x96\x94\x5f\xf9\x84\xaa\xc3\x64\x11\xce\x80\xd9\x87\xc6\xed\x67\xb6\xb0\xdd\xb6\xd4\x17\xf6\xe8\x09\x99\x1e\x72\x9d\x14\x7d\xd0\xd2\x1a\x09\x32\x41\x36\x3c\xf4\xef\x3b\x8e\x3b\xa0\x2d\x48\x66\x33\xb6\xb2\x17\xf5\x49\x3e\x2e\x43\x2b\x8c\x2e\x27\xd0\x0c\x5b\x56\xc9\xb6\x5f\x9a\xed\x49\xce\x93\xd7\x7e\x7d\x0b\xf5\xf9\x2f\x92\xf5\xbb\x4b\x59\x5d\x66\xf8\x87\xa4\x88\x01\x33\xf9\x70\x46\x3a\xb8\xb7\xf3\xd8\xc7\x94\xc0\x40\x6e\x88\xe3\xea\xb9\xae\x65\xf1\xa1\x85\xd6\xe3\x9e\x2d\xd6\xab\xb8\xa9\x3d\x2a\xc4\xb9\x20\x83\x98\xda\xb8\x9d\xbc\x07\xa4\x1a\x50\x26\x40\x26\x41\x2d\xa0\x22\xb5\x8f\x48\x9d\x4d\xba\x31\xfb\x88\x2f\xec\xb1\xff\x8c\xa1\x82\x0d\xda\x18\x65\xaf\x15\x51\xe4\x6c\xd6\x18\xb4\x4c\x4e\x6e\xb3\x03\x7a\x93\x33\xfd\xcc\xef\x4b\x89\x51\x89\xe4\x39\x0e\x93\x14\x5d\x26\x4c\xa5\xf4\x52\x02\xa3\xeb\x28\x53\x59\x3f\xee\xd6\xc6\x6d\xbb\x28\x8f\xf3\xa3\xc0\xfa\x83\x2b\x2a\xa7\xe5\x29\xb5\x56\x88\x97\xb3\x14\x94\x02\xa9\x07\xe7\x41\xe1\x01\x1c\xe0\x73\x1c\x91\x5f\x91\x44\x6a\xa0\xd5\xca\xf0\x59\x5f\x18\x16\x43\x4f\xa4\x57\x6d\xb3\xbc\x31\xe1\x0c\xc2\xaf\x33\xf6\x13\xf0\x3c\xa7\xb9\x49\x1a\x0a\x34\x05\x25\x27\x1a\xb5\x37\xf6\x2a\x11\xa8\x4d\xa0\x1c\x7f\x55\x81\xad\x57\x38\xc3\x72\xb5\x33\x5b\xab\x9b\x2b\x9d\xc2\xfe\x91\xe9\x33\x30\x4d\x94\x01\xba\x8e\x1c\xe8\xdc\x55\xc4\xfb\x46\x6b\x3a\x8e\xd7\xf5\x3a\x12\x2b\x83\x81\xd8\xf2\x90\x47\xd7\x26\x4d\x06\xfb\x51\xec\x3e\x70\x07\x1f\x27\x36\xa4\xe7\xe1\x53\x7a\x52\xfa\x25\x6a\x04\xee\x86\xfa\xd2\x7a\xd2\xd2\x8a\x9b\x36\x29"}, -{{0x39,0xf0,0x55,0x6b,0x1c,0x5d,0xca,0xb3,0x87,0x10,0x41,0x81,0xbb,0x30,0x4d,0xe0,0xcf,0x81,0x59,0x20,0xb9,0x72,0xe8,0x71,0xd5,0xf0,0xfb,0x41,0x6d,0x8e,0x61,0x6a,},{0xd8,0x5f,0xb7,0x6e,0x78,0xc3,0xd5,0xbb,0x7c,0xa6,0xb0,0x5b,0x31,0x01,0x91,0x82,0x1a,0x4a,0x7d,0x2d,0x9b,0xdf,0x02,0x29,0x2c,0xc7,0xae,0xa5,0x64,0x2e,0x48,0x19,},{0x01,0x66,0xaf,0xed,0x5a,0x8f,0x7c,0x3f,0x7a,0xd6,0xf3,0xfd,0xd2,0x93,0x8e,0xff,0x00,0x89,0x8e,0xab,0x81,0x5c,0x54,0x55,0xac,0x90,0xfb,0x51,0xf6,0xe1,0x85,0x4f,0x0c,0x07,0x53,0x19,0x4b,0x76,0x29,0x59,0x4c,0xc1,0x27,0x1b,0x00,0x34,0x31,0x22,0x1c,0x57,0x4b,0x0c,0x0d,0x19,0x08,0x2f,0xee,0xda,0x51,0xb0,0x84,0xae,0x5e,0x03,},"\xa8\xd0\x34\xe1\x70\xfc\x22\xb5\x7a\x44\xaa\x62\x69\xed\x1f\x01\xcb\xa8\x01\xf3\x98\xdf\x1a\xdf\xe7\xdf\x04\x4d\x5f\xa4\x68\xbb\xfa\x8a\xf4\x74\x9a\xb5\x0d\x24\xd6\x2e\x31\x3a\xc0\xe7\x3a\x64\xb4\x28\x2b\x74\x62\x6a\xf2\xb4\xa4\xb5\x4c\x27\x4e\x5a\x6b\xc2\x80\xb6\xdc\x25\xdc\xfe\x07\x81\x4c\x9c\x81\x6d\x2f\x9e\x36\xc0\x5b\x9b\xfe\xdf\xf7\xc6\xb0\x3c\xdd\xeb\xd4\x73\x5e\x09\x93\xd3\xc3\xfd\xc6\x54\x04\x43\xc6\x00\x5e\x90\x0b\x40\x35\xe1\x40\x8a\x85\x01\x6a\xa1\xb8\x92\x02\x99\x0e\x5d\x84\xed\x99\x81\xc2\x9b\x77\x20\x6d\x7c\x11\x30\x52\xa2\x02\x98\x12\xc6\xea\x13\xaa\xe8\xbe\x0a\xca\x7a\x33\x06\xbf\x61\x72\x42\x29\x8e\x68\xbe\xcd\x0d\x5d\x16\xc8\x88\x7f\xd1\x95\x0b\x77\x85\xa4\x6b\xb0\x22\xb3\x9f\x76\x07\xcd\x89\x13\x71\x8b\x30\x17\xfc\x3f\x86\xd6\x93\x3f\x75\xee\xc5\x19\x1a\xd1\xf1\x98\x9a\x8d\x26\x17\x86\xf5\x6b\xe4\xa9\x88\x37\x0d\xb8\x29\x61\xa9\xfc\xc9\x53\x54\x2e\x51\xc2\xe0\x86\xdb\x0e\x02\xb4\xfc\x34\x66\x94\xab\xd9\x05\x9d\x5b\x11\x72\x26\x47\x66\x9e\x7f\x17\xb7\x45\xa6\x0b\x02\xf7\x33\x9f\xcc\x99\xbc\x35\xd5\x9f\xd0\xb9\x8b\x60\xc3\x14\xab\xd4\xbf\x8a\xa4\xb7\xea\xe0\x9d\xd0\x09\x7a\xcb\x91\x89\xf0\x2c\xf8\x5a\x25\x1a\xc9\x2a\xaf\x69\x1b\x15\xcd\x4a\x33\xb5\x8d\x76\x63\xab\xd0\xb0\x44\x43\x33\x04\x4a\xf5\xce\x20\xfd\x71\xcb\xaf\xfc\x0d\x29\x83\x58\x19\xf4\x92\x93\xfc\x26\xe7\xf9\x78\x7f\xc3\x68\xc4\xd3\x5c\xae\x92\x74\x7f\x21\xca\x1f\x3e\xfd\x87\xa0\xd8\x10\x41\x99\x41\x64\x82\xd0\x7b\xfe\xc1\x28\x1c\x66\xf5\x65\x28\x5b\xf6\x72\xd5\xe7\x48\x64\x00\x66\x0c\x01\x75\x55\xe9\xfa\x2b\xf6\xa4\xe7\x02\x7f\x0e\x7e\x5f\x44\x3e\xd6\x58\xb7\x5b\x59\x06\x12\xab\xde\x0d\x80\xd1\xa2\x6c\xb8\xbd\xe7\x6b\x99\x6e\xff\x6a\x74\xe3\xda\xfc\x59\xeb\x1b\x58\x4f\x45\x97\xa2\x39\xcd\x83\x9f\xa1\xf1\xb7\xbd\xa1\xa2\x4d\x15\x0c\x4e\x24\xb9\x1c\xec\x01\xee\x53\xa3\xac\x85\x2a\x91\x2d\xe1\x95\xa3\xc2\x9d\xd7\x07\x9a\xa7\xe8\x8a\xa8\x1e\x9d\x31\xb8\xfc\xcd\x43\x5e\xda\x11\x3c\x3f\x82\x45\x8b\x7f\x79\x33\x57\x2b\x77\x67\x53\xc9\x22\x40\xcc\x03\x61\x58\xa4\xba\x0e\x56\xef\xed\x53\xec\xb5\x3f\xc0\x93\xfe\xad\x14\x34\x34\x85\xae\x5d\x91\x05\xbb\x16\x3f\x26\x25\x14\xe4\x8b\xe7\x41\x59\xc9\xfa\xbc\xb7\x1d\x1a\x42\x80\xd9\xed\x70\xd7\xe4\x2b\x75\xf7\xfd\xad\xd0\x2d\x69\x19\x8f\x5f\x46\x5b\xf6\x04\xcb\x42\x54\x41\x7b\xac\x37\x14\xb3\xa9\x9e\x6f\x1a\xce\xc9\xe3\xb3\xd0\x97\xf9\x72\xfb\xc3\x6f\x2e\xda\x39\x26\xd5\x61\x12\xd4\xe9\x09\x7d\x89\xbd\xc3\x59\x37\xb9\xa3\x15\x8e\x7c\xdd\x5d\xa4\x01\xe1\x80\xd3\xed\xe6\xb1\xff\x02\x86\x41\x92\xeb\x72\x97\x81\x53\x4f\x49\x64\xdd\xf2\xaf\x11\x80\x0d\x8b\x5b\x6d\x01\xb2\x09\xaa\x33\x69\x36\x6c\x19\xa2\x8c\x79\xa8\x7d\x21\x74\xec\x22\xfb\x14\x89\xa6\x75\x5c\x34\x8a\x99\x6d\x0a\xa5\x6e\x0f\x60\xd5\x8e\x26\xbe\xfa\x23\xa8\x6b\xef\x4e\x35\x29\x51\x2e\x30\xa9\xd1\xc5\xe4\x88\x50\x18\xcb\x97\xae\xb7\xc9\x3c\x5c\x41\xca\xa3\x42\x36\x57\x5c\x22\x6f\x3b\x23\x5e\xdd\xba\x36\x4e\x28\x5b\x6e\x35\x27\x07\xbb\xb3\xb3\x39\xbb\xf2\xa6\x3a\x9c\xb9\xbd\x33\x3a\x77\xe7\x9b\xd5\x8a\x48\xe1\x4c\xe5\x88\x6e\xd0\xcd\x07\xc2\xd1\x65\xa8\x1b\x5e\x6a\x31\xa8\xae\x78\x06\xbc\xf2\xe0\xc4\xec\x29\xa9\x67\x72\x5e\x57\x7f\x17\x41\xee\x68\xf3\x45\xf5\xf7\xab\x0f\xad\x31\xc8\xb4\xb1\x8b\x43\x1c\x49\x77\xd5\xc5\x84\x00\x4b\x45\xf7\xcd\x19\x61\xaf\xfe\x87\x38\xe2\x4c\x38\x26\x10\xef\xe9\x98\x35\x3d\x7e\xba\xf9\x19\xb2\x79\xbb\xb6\x91\xc3\x05\x2b\x8b\x2c\x5f\x09\x80\x8e\xf3\xa6"}, -{{0xba,0xb3,0xff,0x7a,0x44,0x48,0xd8,0xa0,0x3d,0x8a,0xcf,0xdb,0x91,0x3f,0x77,0xfe,0x77,0x80,0x43,0x95,0xc3,0xe5,0x4e,0xc2,0x35,0x11,0x79,0x27,0xe3,0x2b,0x50,0xd5,},{0x54,0x97,0x5e,0x35,0xe5,0xb1,0xd0,0x32,0x3f,0x2d,0x6f,0xb5,0xc6,0x15,0x8b,0xf6,0x65,0x4b,0x08,0x4f,0x76,0xbb,0xdc,0xfd,0x72,0x34,0x92,0x29,0xe8,0xe4,0xa6,0xe8,},{0xd6,0xb4,0x13,0x5f,0xc7,0xac,0xb3,0xd7,0xcd,0xf9,0x87,0x89,0x6d,0x91,0xb8,0xa9,0x0d,0xb5,0x84,0xd8,0x93,0x3a,0x6f,0x30,0x29,0xe3,0x26,0x1e,0xc1,0xc3,0x90,0xcb,0xac,0xfa,0xaf,0xef,0xf4,0x43,0xb6,0xda,0x4f,0xdb,0x1d,0x84,0xc6,0x4a,0x54,0x56,0x0f,0xef,0xfa,0x2f,0x1c,0x7a,0x91,0xbd,0xe9,0x73,0x02,0x22,0x92,0x3b,0x67,0x03,},"\xb6\x47\xb6\x7c\xf0\x1c\x2c\xac\xc3\x9d\xe5\x96\x9e\x19\x9b\xe6\xd9\x32\x01\x67\xa4\xce\xbb\xf1\x62\x59\x50\xb1\xe6\xb7\xad\xf5\xca\x24\xd1\x34\x95\x68\x86\x5f\xbb\xfd\x90\xf5\x13\xf0\x5f\x79\xf7\x0a\x63\xa2\x38\x73\xdc\x7a\x19\x5d\x4b\x28\x5a\x08\xf3\x0e\xe0\x61\xd0\xb8\xe6\xb4\xd6\xbf\x9b\x2e\xcf\x2c\x69\xf3\xd5\xa0\x7a\x67\x30\x53\x7c\xca\x4a\x4e\x4c\x7e\xe6\x84\x70\x2b\xff\x88\x3f\xab\x8b\xca\xf8\x93\x11\xc5\x49\x8b\xcc\xb5\xa0\xf7\xc8\xd4\x9b\x54\xf4\x82\xff\xfb\xca\x6e\x7d\xa2\x62\x45\x2b\xa5\x9a\x57\xa6\x87\x9d\x81\xb7\x3c\xd7\xad\xf7\x2a\x3b\xe2\x8a\x37\x3c\xd6\x33\x10\x40\x84\x61\xc2\x1b\x90\x7f\x63\xe0\x86\xb2\x92\xff\x02\x83\x3e\x8a\x2f\x46\xad\xbd\x67\x1d\x02\xb0\x3a\x69\xac\xa2\xe1\x1d\x28\x7c\x52\x2a\x95\x45\x20\x44\x2e\xce\xfa\xa9\x05\xdb\xfc\xc8\x25\x4c\x58\xc3\x95\x4a\x89\xbf\x56\xcb\xe0\x1a\xd5\x63\x19\x71\xeb\x39\xeb\x43\x2a\x85\x4e\x69\x19\x29\xdf\x7e\x48\xb9\x00\xca\x6e\x74\x0a\xcc\xf5\x78\xb3\x17\x95\xb4\x9a\x6c\xa7\x74\xbd\x8b\x99\x31\x06\xa9\xc4\x94\x8c\x18\x71\x49\x48\x31\x59\x90\xa5\xf1\x91\x69\x24\x20\xf2\x89\x32\x8a\xb7\x13\xec\x19\xb7\xea\x89\x4d\x16\xe6\x47\x61\x00\x87\x1c\xf3\x16\x8e\x4f\x93\x5b\x55\x05\xd1\xed\x5b\x0a\xa2\x9b\xe3\x6f\xa3\xa3\x46\xac\x3e\x76\xf1\x43\xc4\x6c\xa6\x91\x23\xb7\x9c\x36\x39\x9a\x0d\x2e\xd3\x02\x77\x24\x94\xad\xf4\x42\xbb\xaf\xbc\x4d\x01\x53\x26\x92\xc7\x85\x9d\xf0\x4d\x2c\xa7\x8b\xa5\x5d\x77\xfd\xf3\xe5\xad\x99\x37\x86\xa2\x4c\xff\x21\x99\xbb\x49\x38\x78\x73\xcc\x41\x4b\x4c\xf1\x13\x7a\xbb\x7e\x94\xae\x3d\xdb\xf9\x7f\x53\x4a\x18\xfc\x5a\xe5\x85\x23\xa3\xcc\x52\x28\x3d\xc7\xb0\x16\xf3\x1c\xd6\x55\x79\x81\xc5\x07\x6c\x77\x4f\x30\x3a\x47\xc4\x27\x87\x0e\x20\x7e\xd8\xbd\x66\x64\x0f\xf0\x92\xdb\x50\x3f\xa1\x24\xbf\xdc\xf0\x20\x05\x1d\xad\xd1\x06\xdd\x24\x58\x40\xb3\x19\x10\xb8\xa9\x06\x0d\x59\x86\xf0\x2b\x60\xaa\x5e\x33\xb4\xd7\x55\x09\x12\xcd\xc5\x77\x6c\x77\x2a\xac\x93\xae\x19\xc7\x3b\x7e\xcf\xca\x38\x9e\x62\x76\x81\xa8\x78\x1e\xb4\x7d\x84\xe9\x34\x60\xba\x89\x1d\x3f\xf6\xea\xdf\x8f\x2a\x90\x3c\x38\x34\x74\xbe\xaa\x42\xb9\x0e\x03\x22\x36\xdc\xd8\x98\xd0\x2a\x40\xef\xb4\x4e\x47\xea\xd5\x2b\x75\xb0\x9c\x7d\xa1\xcd\x6a\x2d\xfd\x4d\x1c\x04\x52\xde\x69\xf6\xac\xac\x1a\x68\xdd\x78\xda\xf9\x72\xae\x26\x08\x21\xe2\xec\x52\x2f\xb5\x74\x9b\xeb\xe0\xad\xb4\x52\xbf\xa4\xfa\xa1\xe9\x79\x11\xc1\x29\x9f\x16\x56\x8d\x68\xee\xf4\x05\xf4\xb1\xcd\xac\xab\xed\x59\xf7\xb0\xfb\xce\xab\x71\x9a\x34\xb2\x99\xf5\x8a\x4a\xe8\x15\x4f\x98\xf4\xd9\xf4\xf1\x40\xb1\xf0\x85\x00\x69\x46\x72\x5e\x7c\x29\xbb\x0b\xc6\xcc\xf2\x53\x44\x97\xc6\x1d\x4c\x16\x12\x62\x4a\x61\xd7\x0d\x26\xc3\xef\xb7\xd7\xc3\x51\x84\x86\x57\xf7\xf8\xee\xbf\x8b\x99\x07\x47\x74\x0e\x6f\x91\x0c\x97\xce\xf1\x50\x37\x57\x65\xc8\xc0\xb3\xb4\x49\xc0\xd0\x9d\x66\xf0\x08\xe6\x7c\xfa\x76\xea\x2b\x68\x08\xb6\xfe\x63\x2e\xaf\xe0\x58\x7f\x37\xe3\x6b\xe9\x8d\xcb\x17\xa3\xf4\xa1\x5b\x65\xa9\xf6\xfc\xf9\x64\x2b\x52\x52\x20\x77\xb1\xfb\x4c\xc3\xc0\x8d\xf4\xb4\x67\xca\x71\x6d\xb1\x6b\x73\x7f\x78\x2c\xdf\x38\x71\x70\xa5\xf1\xf6\xa7\xae\x0a\xb3\xf5\xb7\xc5\x85\xe3\xb0\x65\x5a\x64\x56\xa5\x03\x59\x5c\xe8\xea\xea\x25\x37\x85\x5e\x7f\x0d\x50\x61\xbc\x29\xb4\xe6\x7d\xaa\x82\x46\x3c\x19\x0e\x9f\xdd\xd5\x2f\x83\x22\xdd\xb4\xe0\xf2\x6b\x68\x77\x82\x28\xeb\x57\xe1\xa1\x85\xb7\x02\x5d\xa1\x49\x87\xd4\x4b\xaa\x76\x7b\x22\xee\x7f\x4c\x84\x59\x10\x32\xe8\x8e\xc1\x2e\xb8\xc5\xa4\xb9\xe1\x57\xec"}, -{{0x48,0x6c,0x7b,0x43,0x6c,0x1d,0x43,0xd6,0xb7,0x03,0x51,0x22,0x83,0xc1,0x66,0xdc,0x86,0x3e,0x5a,0x33,0x80,0x2f,0x4e,0xa6,0x5f,0xc7,0x38,0x77,0x89,0x02,0xd0,0x14,},{0xb5,0xdc,0x94,0x7d,0x64,0x33,0x7c,0xae,0x82,0x12,0x2b,0xd6,0x8c,0xc8,0x08,0x40,0x59,0x6d,0xe3,0xbe,0x56,0xcb,0xd0,0xc8,0x33,0xaf,0x3f,0xaa,0x3a,0xdc,0x37,0x76,},{0x31,0xf9,0x5c,0xbb,0x74,0x63,0xb8,0x75,0x28,0x65,0x42,0x27,0xbb,0x13,0x97,0xbf,0x10,0x65,0xb4,0xf5,0x76,0x80,0x80,0x78,0x20,0x7d,0xfa,0xf0,0x6d,0x12,0x4b,0x41,0xf4,0xc3,0x18,0xf4,0xa9,0x31,0x5a,0x66,0x08,0x5b,0x9e,0x56,0x8a,0x71,0xe4,0x14,0xed,0x94,0x14,0x51,0x73,0x10,0xc6,0x99,0x94,0x6d,0xb0,0xc9,0x76,0x28,0x52,0x07,},"\xaf\x03\x60\x53\x67\x2d\xcf\x3a\xa2\x6e\x28\xec\x6a\xa6\x42\xce\x28\x4b\x89\x6c\x69\x88\x7d\xfd\xcf\x08\x24\x51\x5e\xb0\x84\x8d\x9d\x97\x0c\xa2\x72\xdf\x77\xa8\x6b\x3f\xf6\xdd\xaf\x3c\xba\xdd\x3a\xb6\x28\x3b\xc3\x7c\xdf\x7a\x56\x07\xd5\xdf\xc7\xcf\x96\x32\x92\x99\xcc\x53\xed\xbb\xe6\x57\xfd\xfa\x2c\xa2\x44\x67\x05\x0a\x0a\xeb\x8c\xff\xd7\xd3\x3d\x54\x3e\xc2\xc1\x91\xcc\x0b\xce\x89\xac\x37\xd3\x32\x93\xb1\x88\x8c\xcb\x76\xc2\x8a\xdc\x67\x1a\x49\x35\xa8\x46\xd9\x07\xe4\xad\xd0\x11\x0f\xeb\xbe\xe5\xae\xc8\x0f\x9d\x2f\xf7\x4e\x2a\xf4\xfd\xbe\xbb\xcf\x49\x10\x5a\x64\x69\xd7\x38\x00\x06\xb2\xca\x44\x36\x48\x14\x45\x4e\x44\x5e\x36\xdc\x00\x12\xf3\x39\xc9\x68\x54\xf8\x36\x44\x2a\x05\xa5\x0b\xec\x90\x73\x27\xf7\x4b\xa9\xf6\xfd\x79\x0f\xf0\xad\x37\x83\xd2\x97\xbd\xcc\xa7\x64\x60\x78\x37\x03\xeb\x5f\x2b\x1f\x51\xb0\xa7\x40\xce\x7a\x8f\x00\xa3\x87\xe3\x63\x62\x70\xa9\x71\xfa\x8f\x15\xb4\x49\x67\x30\xd8\x8a\xdd\x80\x7a\x7f\x7e\x98\x7c\xd4\x15\x95\xa2\xe7\x43\x5d\xf5\x19\x55\x76\xa3\x5f\x5e\x91\xb2\xfc\xfa\xc9\x4e\xd5\xd7\x76\x63\x78\x3b\x61\xe6\x67\x1d\x34\x83\x8b\x6b\x56\x44\xfb\xc1\xc5\x39\xfe\x15\x9b\x77\x92\xdb\x96\x7e\x83\x52\x61\x8d\xda\xca\x0c\xde\x73\x43\x7b\x59\xe7\x80\x1b\x49\xeb\x46\x09\xb1\x05\x77\xca\x26\x92\xdd\x6f\x9d\x5e\x9d\x4b\x5e\x5e\x62\xc5\x91\x3e\x7b\x87\xe6\xb3\x47\xbe\x61\x53\xb1\x71\x99\xc9\x16\xa1\x3f\x8a\x88\x5b\x37\x8e\xf0\x9e\x13\xca\xe4\xd8\xb0\x79\xd7\xd5\xcb\x90\x94\x19\x9b\x0f\x20\x53\x3c\x90\x08\x3b\xc3\xac\xb2\x66\x76\x97\xee\xd2\x2e\x36\x70\xab\xb4\xa5\x53\xe9\x95\xc9\xdd\x95\x94\xe5\x92\x39\x1a\x00\x04\xb6\x55\x65\x44\xf3\x56\x12\xc4\x97\x13\x59\x57\x7c\x47\x63\x82\xca\x53\xb3\xf2\x62\xa5\xe3\x3e\xd2\x6e\xec\x80\x9f\x4f\xdb\xa4\x89\x8a\x11\x36\x75\xcb\x6a\xf7\x17\xdb\x62\x57\x9f\x39\x80\xb2\x14\x63\xbe\x02\x9c\xb4\x16\x0f\xe5\xd2\x57\xc4\x6c\xd6\x66\x4f\x98\x61\xac\x50\xfe\x05\xc1\x44\x05\x7d\xce\x2f\x8d\xf1\x53\x2a\xa7\xaf\x58\x9f\x41\x27\x06\x01\xce\xf0\x6b\xbe\x4f\x35\xc3\x1c\x78\x2b\xb3\xcf\xff\x7d\x5a\xb6\x4a\x14\xec\x41\x73\x61\xf1\xd3\x2c\xbd\x38\xb6\xbd\x0e\x02\x50\x5d\x14\x16\x30\x2b\x85\x05\xae\x2a\x96\xe8\xd5\x33\x9c\x34\x6c\x2b\x06\x62\xd3\x50\x25\x9c\x50\xc5\xe4\x87\x95\x91\x4e\x6f\x88\xe9\x7c\x81\x1c\x39\x3b\xdf\x9a\xec\x7e\xf8\x20\x47\xca\x28\xee\x97\x1c\x17\x5c\x27\xe3\x6e\x10\x97\x27\x96\x0d\xdf\x1a\x1b\x97\x6a\xb4\x4f\x48\x51\x60\x7b\xd9\x66\x80\x8a\xc4\x6d\x54\x00\x31\x28\x29\x7f\x5f\x44\x87\x10\x8d\x6a\x02\xe7\xa1\x64\x13\xd2\xb7\x5e\xcb\x42\xfd\xdf\xb6\x69\xc8\x01\xd2\x3d\xe5\x0a\x6f\x7b\xf6\x58\xf7\x53\xc6\xb2\xb3\xb4\x7c\x06\x40\x10\x5d\x0a\x80\x1b\x32\xa1\x94\x3c\xdc\x15\xc8\x86\x55\x5e\xb7\x5b\xb7\x92\x7b\x93\xc3\x5c\x5b\xe1\xf9\x8b\x19\x6c\xaa\xc2\xda\xd9\x91\xb1\x04\x4e\xa8\x63\x94\x4d\x54\xd8\x83\xab\xc3\xc6\xde\x66\xed\x86\x8e\xe8\x4b\xcf\x9c\x34\xcc\xdb\x80\xfc\xd9\xcc\x04\x02\x74\x77\x32\xcd\x63\x0b\xbf\xa3\xbb\xe8\xb0\x38\xdc\x1d\xbd\xaf\x43\x6d\x9a\xc0\x0c\x02\xd5\x28\xec\xe2\xe7\x91\xee\x31\x2a\x86\x8f\xeb\x2f\x58\x7c\xa4\x4d\xb5\x73\x13\x84\xfa\x18\x31\x14\x20\x61\xb2\xea\xd2\xb8\x0c\x66\xbd\x2f\xa5\xdc\xca\xbe\x6a\x25\xf2\xa4\x93\xfe\xaa\xcd\x23\x1d\x2f\x40\x96\x46\xb9\x42\xa5\x78\x54\x5e\xa4\xfe\xea\x9a\x73\x47\x3f\x79\xdc\xf1\x3e\x0c\x9f\x1b\x49\xfd\x89\x12\xec\x48\x73\x28\x04\x5b\xd0\xfa\x22\x89\x22\xee\x6e\x97\x3e\x61\xf6\xe9\x33\x65\x29\x65\x78\xdc\xc2\x1c\x36\x14\x79\xee\x2d\x24\x87\x9f\x2e\x9b"}, -{{0xa6,0xe6,0xad,0x2c,0x37,0x9c,0x6f,0xcc,0xad,0xb4,0xa4,0x9b,0x23,0x2a,0x91,0x42,0x61,0x8e,0xa3,0x01,0x03,0xc3,0x3c,0x22,0x6f,0xf6,0x28,0xbc,0xfd,0x81,0xf4,0x26,},{0xf7,0xc4,0x32,0x3f,0x5c,0x41,0x9d,0x9b,0x3f,0x34,0xa8,0xeb,0x42,0xae,0x7f,0x1f,0xaa,0x23,0x33,0x07,0x90,0x30,0xc5,0xd6,0x4f,0x9f,0xfb,0x1e,0x9b,0x16,0x00,0x2d,},{0x07,0xd9,0xfc,0x24,0x4f,0xda,0xb0,0x01,0x59,0xeb,0xec,0xc5,0xa0,0x08,0x83,0x45,0x3f,0x08,0x31,0x01,0x71,0x76,0x9d,0x29,0x70,0x01,0xe8,0x77,0x01,0x0e,0x3e,0xce,0xd9,0xfb,0x60,0xec,0x91,0xcb,0x4d,0x88,0xe7,0xba,0x40,0xc5,0x30,0xb1,0xf9,0x23,0x79,0x78,0xcc,0xd9,0x6d,0x5c,0xba,0x9e,0x4f,0xa2,0x7e,0x2a,0x0a,0xd9,0xd6,0x0c,},"\x2e\x85\x76\x76\xa5\xbb\x1c\x6e\x9e\x94\x50\x7f\x83\xc6\x0a\x67\xf5\x47\xc5\xde\x9e\x94\x56\x6b\x19\x7a\x6a\xf6\xcf\x47\x52\xe9\x3d\xbd\xef\x6b\x9f\x66\xd1\xfe\xbd\x95\x7e\x42\xa7\xf5\xad\x64\xef\x1d\xbc\xc4\xfe\x69\xae\x95\x25\xd1\xa4\xde\x67\x05\x4c\x88\xf2\x9c\x06\x47\xba\xcf\x8b\x82\xf3\x21\xff\x99\xfe\x9e\xed\xc9\x92\xed\x34\xc1\x17\x7f\xc5\x42\x12\x27\xcc\xac\x10\xfe\xb9\xce\xd4\x08\x2f\x56\x58\xda\x63\x71\x47\x23\x97\x97\x37\xe7\xdc\xbf\xe2\xe8\xb5\xd5\x0f\x91\xdf\xca\x83\xe7\xf9\x5f\x35\xd1\xad\x8d\xd5\x11\x44\x50\x2f\x3d\xf6\x72\x43\x26\x11\xf0\xe7\x66\xa9\x0d\xcc\x2a\x57\x39\xc8\x05\xd9\x5f\xe5\xb0\x41\xde\x9d\x7f\xb4\x7b\x44\x04\xaf\xc8\x03\xa3\xbd\x48\x04\xc7\x81\x7e\xbc\x5b\xdf\xef\x8a\xdd\x9e\x25\x0b\x50\x96\x6c\xa8\x93\x9b\x22\xb3\xc6\xff\x93\x6e\xaa\x65\x9a\x24\x0c\x0c\x84\x8b\x81\x0a\xce\xcf\x61\x81\xe0\xe4\xdb\x8e\x4c\xf8\xfc\xce\x7d\xe5\x59\xcb\xe8\xaf\xa9\xdb\x84\x99\x57\x09\x11\xa3\x88\x7e\x85\x0e\x50\x9c\xdb\x70\xde\xbc\x34\x77\xd1\x21\x75\x01\x4f\x79\xf8\x1b\xa1\x13\xd0\xb7\xb3\x35\x11\x8f\x85\xcf\x59\x99\x6f\x80\x67\x58\xeb\x90\x3c\xc4\x50\xf5\x2f\xee\x10\x2e\xfc\x01\x44\x1e\x9a\xe5\xfa\xe7\x4c\x23\x1d\xfd\x85\xeb\x6b\xad\x17\xd6\xb7\x0e\x93\x85\x84\xfa\xcb\x21\x72\xcb\x03\xbd\x5e\xa0\x7b\x7f\x0d\x37\x1f\xfa\x35\x1c\x0e\xe4\xef\xe9\xba\x4a\x3f\xd5\x43\x87\x46\x55\xe7\xd3\x9c\x53\xae\x86\x32\x98\x02\xe5\xc3\x85\xe9\x28\x3a\x29\x73\xca\xb8\xcf\x7a\xc7\xff\x0f\x91\xd1\xd4\x8b\x58\xab\xfd\xad\x65\x8d\x81\x2f\x07\x88\x16\x76\xbd\x22\x6b\xfe\x95\x7d\x7d\xf3\x0c\x41\x30\xa4\x48\x35\x4a\x6b\x94\x40\x5a\x41\x16\x50\xa9\xc8\xfc\x85\x11\x55\xec\x5a\x8a\x3e\x3b\x67\xae\x0c\x4b\x5c\xb8\x9b\xb7\x3f\xc8\x29\x74\xbe\x62\xda\x73\xf0\xe2\x30\x92\x93\x7d\x40\x5b\xa4\xaf\x6c\xab\x94\x65\xea\x43\xa6\x25\x3f\x44\x57\x08\x2a\x06\xac\x12\xb7\x5e\x88\xec\x68\x44\x87\xf9\x07\x63\x73\xfa\xb8\x89\x28\x59\xd8\xe8\xba\x43\x14\x23\xaa\x80\x5a\x22\x0c\xbf\xda\x43\x1b\x32\xb1\xe0\x31\x21\xf7\xfd\x4d\xe1\x85\x91\xf2\x50\x5c\xc0\xf5\xb2\xb1\xa7\x60\x5f\xbc\xc6\x37\x57\xb0\x7e\x29\x9f\xef\x5a\x2b\x73\x65\x23\x0c\x2e\x92\xa2\x59\x62\xc2\xe8\x01\x2a\xd3\xfa\x9e\xe9\x48\x82\x70\x96\x25\xba\x68\xc7\xb2\x13\x66\x4a\xe2\x53\x2b\x60\x9d\x7c\x9a\xa0\xe8\x3d\x49\x3d\xbc\xe7\x63\x2f\x35\x58\x0e\x06\xd3\x11\x1c\xed\x32\x0d\xd0\x19\x04\x41\xf6\x2d\x9e\x35\xf5\x0d\xe5\x9c\x27\x2f\xb0\x0f\x56\x8a\x00\xb0\x74\x6c\x33\xa9\xbd\x24\x90\xc0\x74\xb9\x1c\xdd\xc4\x87\xef\x2e\x45\xa0\xf0\x30\xe0\x8f\xdc\x18\x17\xbc\xa8\xa9\xce\x29\xd2\x92\x79\xe7\x55\xde\xbc\x28\xdf\xad\xc3\xc4\xd1\xb4\x58\x48\x6e\x3c\x8d\x0c\x43\x18\xe7\xe6\xf9\xeb\x5a\x36\x53\xb3\xf7\xc4\x95\x07\x07\x7c\xd5\xeb\x81\xf1\x0b\x88\x10\x7c\xc0\xf9\x31\x69\x32\xab\xe9\xb6\x4e\x88\x86\xd0\x68\x56\xa8\x5b\xe6\x3b\x0c\x2b\x47\x5c\x0a\xfc\xb0\x69\x44\x26\x86\x0f\xb2\x4b\x5c\x17\xab\x6a\xb7\x73\x3d\x5e\x64\x1b\xe7\x4f\xd5\xf6\xa1\xff\x18\xd2\xf9\xa4\x27\x70\xfb\x30\x75\x0f\x56\xf4\x85\x4e\x38\xd5\x8a\xef\x18\xa2\xa6\x1c\xbf\xb4\x9e\xe5\x76\xed\x97\x73\x7b\xc2\x8d\xf3\x26\x8a\x33\x41\x75\x51\x3d\x97\xaf\x00\x9c\xbb\xcf\xdf\xad\x50\x39\xd6\x9b\xb4\x6f\x70\x88\x67\xd9\xb3\xce\x0b\xf2\xf5\x69\xe3\xcf\xbc\xf6\x13\x6f\x88\x70\xd2\x52\x08\xb2\x1a\x3e\xdc\xb7\x33\x93\xdf\xcd\x41\x72\xc1\x40\x2c\x41\xf3\x6e\x3f\x82\xa4\xea\x6d\xcd\x89\x16\x86\xba\x66\xe1\x43\x20\xaa\x0e\x22\xba\x0c\x1e\xf0\x33\xd6\x62\xcd\xb8\x60\xcd\xfa\x3a\x40\xf6\xcc\x53\x2a\x08"}, -{{0x9b,0x6d,0x7e,0x28,0xeb,0x05,0x15,0x97,0x32,0x4d,0xce,0xb7,0xa1,0x89,0x41,0x24,0x67,0x25,0xe8,0x8d,0x53,0xab,0x2c,0x34,0x77,0x11,0x05,0x33,0x0c,0xf1,0xf4,0xae,},{0x88,0x72,0xa5,0x0b,0x5f,0xe3,0x62,0xf8,0xea,0xd1,0xd4,0x0e,0x20,0x45,0xf0,0xd4,0x0b,0x2e,0x7b,0x50,0xb5,0x9d,0x80,0x90,0xbc,0x47,0xad,0x68,0xeb,0xee,0x09,0xed,},{0xc6,0xdc,0x5c,0xa1,0xe8,0x56,0x00,0x15,0xb4,0x93,0xaf,0xe2,0x66,0x6c,0xcf,0x6f,0xef,0xa8,0x03,0xd8,0x52,0x6c,0x83,0x7f,0xe7,0xf1,0x23,0xc7,0x99,0x14,0x27,0xab,0x03,0x0d,0x7c,0x77,0x0e,0x45,0xf6,0xde,0x84,0x81,0x52,0x3b,0x94,0xec,0xe9,0x7f,0x3f,0x16,0x1c,0xf5,0xb8,0xc7,0xae,0xa3,0x9f,0x5a,0xd8,0x26,0xbf,0x8d,0x0a,0x02,},"\xd1\xe1\x98\x7b\xff\x65\xf6\x2a\xd6\x76\x24\xc6\x65\x79\x24\xf5\xd6\x73\xb7\x82\x4e\xbe\x40\x40\x26\xc0\x56\x2d\xed\x31\x43\x44\x0b\xe6\x37\xf9\x8c\x9e\x01\xa6\xaf\xdf\xa9\xa4\x7d\xd4\x9c\x7c\xba\x6e\x3f\xd2\x3e\x45\x52\xf7\x63\x2b\x14\x38\x0b\x27\xcd\x3e\x96\x06\xcc\xe3\x50\xf1\x52\xab\x12\x6b\xea\xd0\xa5\xd3\xbc\xe4\xd4\x20\x92\xd9\x34\xc8\xca\x33\x7e\x98\x7e\x11\xd8\x6c\xfb\xfb\xd2\xac\xc3\x22\x3b\xd1\x67\x44\xa9\x27\x72\x8f\x48\x53\x72\x17\x5c\xc6\x94\xdf\x30\xa7\x3f\x9d\x33\x76\x5f\xf0\x14\xef\x00\x8d\x58\x63\x21\x03\x38\xcc\x34\x82\xcc\x27\xea\x31\x7e\xec\x92\x1b\x0c\x56\x8c\x38\xab\x27\xc4\xa5\x64\xe8\x02\xb1\xb9\x46\x68\xc6\x51\xe2\x0a\x0b\x55\xf3\xa7\x9d\x21\x5f\xc3\xa0\xd0\x49\x04\x01\x09\x32\xc4\xcc\x68\xc2\xa9\xe7\xd0\x0e\x5d\x38\xd8\x2d\xf5\x52\x06\xba\xb9\x5c\xf6\x97\xbe\xbc\x72\x06\xee\xde\xf6\xfd\x18\xd9\xa2\x0c\x2c\xbb\x28\x5b\x00\xef\xa7\x69\xa0\x8d\xab\x2b\x3a\xba\xdf\x00\xd1\x98\xb4\xf1\x92\xdd\x44\xbc\xb9\x14\x31\x82\x3a\xe6\xfd\xf9\x84\x58\xec\xa3\x9c\xd2\x92\x63\xf0\x99\x93\x03\xe7\x0d\xc6\x94\xfe\x01\xc5\x3a\x11\xc1\xd1\xc3\x4c\x1e\xe5\x06\x8a\x20\x1d\xbe\x7e\x10\x08\xd7\x64\x35\x89\x68\xb4\x02\xaa\x39\x85\x49\x50\x7f\x7b\xd1\x85\x08\x00\xe4\x11\xb1\xc4\xe2\x8d\xdc\x04\xa8\x59\xe1\x79\xbe\x8a\xd7\xe6\x67\x0e\x50\x9d\xb0\x27\xad\x7e\x51\x7e\x44\x25\x95\x4f\x5a\x80\x74\x14\xa6\xda\x26\x7a\x76\x4e\x71\x2a\x99\x84\x65\x06\x49\x82\xd8\x51\xa2\x65\xea\x3c\x4d\xfb\x74\xf9\x92\xa7\xcc\xcd\x9a\x82\x68\x7f\xa6\x1c\x32\x2c\x4f\x58\x9e\x86\xb8\x82\x52\x13\xbf\xa9\x51\xda\xe6\xaf\x35\x4a\xce\x18\xf0\x73\x99\x5a\xdc\x95\x83\x9d\xac\x01\x65\x51\x1d\x61\x75\x37\x91\xa5\x3e\x48\xe3\xa8\x27\x3d\x44\x82\x3d\x25\x96\xf2\xa2\xdb\x2e\x5f\x1a\xe5\x97\x22\x1b\xa7\xf3\xeb\xaf\x4a\x7b\x28\x88\x39\x50\x02\xbd\xaf\xf5\x1f\xa5\x4b\xfb\x97\x9d\xe1\x03\x14\x04\xca\x77\x89\xfe\x09\x5d\x4d\x17\xf0\x7a\x35\x55\x6b\x10\xfe\x8e\x14\x17\xc8\xa6\xa6\x31\xc2\xed\x36\xcb\x7a\x0e\x61\x81\x77\x62\x89\xc3\x44\x81\x4d\x42\x13\x1a\x73\xb1\x2f\xaa\x35\xd7\x78\x14\xc6\x81\xa6\x01\x37\x4b\xa7\x1c\xb9\xad\x53\x15\xfa\xd4\x2d\x3a\xcf\xc7\xc1\xd6\x28\x81\x02\x56\xda\xf7\xd8\xc3\xc9\xa2\xe5\xbd\xcf\xb7\x70\x08\x2f\xa6\x38\x16\x89\x58\x52\x3a\x1c\x3b\x03\x5d\xbc\x6d\x5a\xdf\x26\xdf\x89\xa7\xcc\xab\xed\x3e\x7d\xd3\x77\xc1\x6d\xa8\x41\xf1\x3c\x68\x94\xd4\x3c\xeb\xb4\xe3\x90\x22\xf1\xcc\xec\x22\x74\x44\x5c\x78\xb3\xad\xc7\xbb\xf7\x0d\x89\x0b\x80\x23\x6c\xc4\x46\x8f\x95\x69\xc5\x9a\x7e\x33\xb5\x70\xe6\x70\x38\x0d\x24\x4e\x4e\x31\x0e\x11\xc3\x92\xf1\xe3\x34\x05\x4b\x92\xc8\x38\x6c\x16\x1c\xe0\x41\x09\xb0\x37\xbd\x62\x8d\x91\x9d\xcb\x62\xda\x14\x35\xbf\x94\xe8\x8b\x0a\x88\x46\xd4\x86\xd1\x67\x78\xf7\xa3\xb8\x80\xe6\x60\xf4\x41\xfd\xf8\x6e\x56\xb8\xaa\x06\x61\xf5\x5a\xae\xce\x27\xf9\xdd\xaa\x0e\x2a\x22\xc2\x15\xb0\x40\x53\x97\x26\xb9\x85\x39\x15\xa1\x59\x2d\xff\xea\xe3\x2d\x7b\x5b\x67\xeb\x62\x05\xbb\x0b\xd7\x27\x9f\x78\x8d\x5f\x83\x3c\x40\x66\x78\x0c\xa0\xa4\x2d\x3e\x4e\x1a\xa2\x2b\xd0\x6b\xb5\xee\xd8\x9b\x94\x13\x77\x1e\xca\xb6\x44\xca\x72\xd1\x29\x1d\x00\xf7\x40\x90\x1a\x73\x11\xdc\x03\x67\x15\xd2\x3e\xbd\x9a\x59\x89\x16\x28\xf0\xd8\x7e\xd4\x89\x50\x2f\x06\xd7\x5b\xbd\x11\xcd\x16\x02\xa3\x5e\xe7\xe1\x33\x35\xd6\xa1\x44\xb0\x88\x30\xe6\x69\xc0\x2e\x65\x2f\x3f\x10\x0d\x39\x3e\xf9\xb4\xac\x05\x32\x14\x39\xbc\xe6\xce\x36\xff\xc5\xab\xca\x89\x0b\x87\x96\xcc\xb5\xe1\x63\x03\x55\x9c\x5d\x91\x17\xf0\xf3\x1d"}, -{{0x70,0x09,0xed,0xd0,0x79,0x50,0x96,0xed,0xc4,0xfe,0xd5,0x5a,0x17,0xcc,0xf4,0x84,0x13,0x1e,0x60,0x8c,0x6d,0x5d,0x66,0x96,0xbf,0x33,0x76,0xe2,0x69,0x24,0x95,0x9b,},{0x77,0x57,0x4b,0xf0,0x69,0x52,0x71,0x45,0xe7,0x2d,0x3e,0x85,0xce,0x7d,0x4f,0xcd,0x67,0x1a,0x33,0xe0,0xa7,0x1e,0x6b,0xf0,0xda,0x7e,0xa4,0x71,0xdd,0x6e,0x86,0xa4,},{0xb7,0x01,0xb8,0xf9,0xa4,0x34,0xe0,0x6d,0x71,0x9a,0xd2,0x5d,0xcc,0x54,0x06,0x0c,0x79,0x86,0x64,0x7f,0x44,0xf3,0x88,0x4b,0xcb,0x6e,0x5e,0xe1,0xd7,0xa4,0x46,0xcc,0x26,0x5c,0xec,0x02,0x9b,0x53,0x7d,0xa7,0xf2,0x52,0x33,0x26,0x55,0x8a,0xc9,0xba,0x34,0xf4,0xcc,0x2a,0x97,0xcc,0xa3,0x45,0x2e,0x70,0x56,0x2e,0x7a,0x8f,0x55,0x04,},"\xb1\x2c\x12\x47\x05\x39\x54\x7c\x2d\xe6\xbc\x4e\xea\xc7\xb6\x3e\x50\x8e\xd7\x10\xf3\x56\x37\xd9\xfd\xd2\xdc\xca\x32\x2a\x7a\x50\x71\xda\xb2\xb2\x84\x5e\x30\x79\x28\x06\x03\x5c\x9f\xcd\xaf\xe2\x78\x3e\x3b\x67\x7d\x6b\xe5\xaa\xc7\x0b\x33\x91\x0a\x2b\x95\xe8\xb5\xd5\x9b\xda\x61\x59\x35\xa4\x17\xb7\xae\x19\xa7\x85\x37\x74\xe8\x9a\x12\xaa\x54\x7b\x41\x92\x97\x9a\x01\xef\x6e\xf3\x2a\x40\xde\x79\xd6\x80\x05\x7a\x83\xa0\x74\x61\x7c\xa6\x50\x1f\x59\xe7\x35\x64\x92\x7c\x38\xb5\x8c\x19\x58\x5a\x2c\x03\x65\x9c\x02\x6e\x4d\xe3\x80\x6d\x6c\x1c\xa8\x95\x8d\xee\x47\xbc\xb8\x89\xe7\x6d\x2c\x3a\x9a\xb5\xb8\xb6\xaf\xb2\xe8\x42\x29\x80\x56\x56\x7b\xf9\xb5\x89\x57\x41\x54\x83\x33\x62\x33\xef\x49\x20\xfa\x57\xf4\x96\xe1\xf0\x34\x8c\xca\x20\x36\x64\x96\xfa\xb3\xa7\x5b\xf4\x21\x4e\xce\x47\xa4\x5f\xea\xa1\x39\x2d\xb3\xf2\x54\xd9\x6a\x7f\x37\x40\x2c\x98\x11\x14\x0d\x73\x58\xb4\xef\x8f\x20\xa2\x98\xee\xef\x90\x4e\x37\xd6\x8f\x37\x8d\x33\xcb\x96\xd0\x0c\x03\x10\x9f\xc8\x3f\xd0\x6a\x87\x6c\x92\x48\x2f\x61\xab\x79\x14\xeb\x7c\x2e\x5e\x84\x06\x6e\x0e\x91\xe2\x1e\x42\xe9\xbe\x23\xdf\x12\xb5\xc7\x47\x97\x3c\xb8\x64\x42\xc3\x22\x91\xd3\xd1\xae\x71\x9b\x36\xa6\x2f\xaf\x3a\xba\xa2\x05\x3a\x31\x3f\x62\x5d\x85\xc5\x1a\x51\x98\x57\x19\x15\xef\x8a\x2b\x19\x9b\xa3\x7d\x25\x88\x45\x75\xba\x1b\x72\x84\x4c\xab\x43\x28\xb5\x7f\xab\x1e\xc9\x74\xee\x8e\xa1\xdf\x7c\xa9\xc7\x8a\x4d\x3a\x03\xbc\xb0\xab\x41\x69\xbf\x06\xa3\xa4\x38\xd9\x56\x6c\x6c\x50\x1d\x8d\x9c\xcc\xcb\x1a\xc2\x6b\x4d\xa4\xae\x1a\x9d\x8e\x8b\x9d\xf6\x62\x82\x1a\xd9\x75\xc9\xb0\x15\xfe\x26\xf6\x89\x8d\x22\xab\x91\x2f\x0e\x40\x5a\x5b\x27\xcf\xd3\x9d\x65\x7d\xcd\x92\xcd\xeb\xe6\x79\x19\x02\x71\x34\x84\x40\x6d\xdd\xce\x71\x18\x87\x31\xe4\x43\x19\x38\x1a\xf2\x7d\xaf\x76\x79\x22\x73\xb8\xc3\x52\x51\xd1\x1b\x83\x6a\xfe\x8b\x3c\xe9\xb4\x02\x73\xf6\x91\x5e\xbe\x6b\xc9\x5a\x75\xbb\x94\x1a\x42\x92\x09\x86\x7f\xba\x87\x64\xbf\x6c\x40\xdb\x6e\xec\xb4\xf2\x17\x47\x83\x7c\xf6\xae\x7f\xbf\xe3\x6d\x50\x23\xdf\x7f\xce\x2c\x0c\x3c\x57\xaf\x28\x98\x88\x53\x13\xc5\xc4\xbd\xa3\x5c\x7d\xa6\xcb\x29\x93\x2f\xb1\x99\x1f\x62\xbb\xb0\x80\xb3\x2e\x20\x50\x61\x93\x11\xae\x69\xab\xb3\x02\x2d\x91\x3f\xa9\xea\xbd\x5d\x5c\xb4\xdc\x54\xd7\x5d\xca\x63\x8c\xda\x9a\xf3\x31\xc0\xcf\x4d\x20\x07\xb6\xca\x39\xf6\x55\xa6\x1c\x01\x03\x9f\x12\xa4\xb9\x78\x2b\xc3\x9a\xec\x4d\x22\xef\x00\x93\x38\x8d\xd7\xd5\xb5\x6d\xfb\x8a\x7f\x9d\x86\x69\x00\x4e\x28\x78\xdd\x8a\x6d\x76\x85\x7c\x08\x45\x24\x50\x68\xfe\xe1\xc5\x31\x96\x31\xe7\x8d\x37\x85\x16\x5c\x70\xaf\xd6\x52\x99\x30\x13\x78\x55\x1e\xbf\x61\x35\x84\xc6\xa7\x62\x0a\x0e\x3b\x67\x79\xf3\x8c\x09\x40\x06\x24\x97\x00\x8e\xb2\x33\x87\x08\x68\xc2\x1c\xcc\xac\x23\x95\x01\xb6\x3b\x74\x9a\x85\x60\x2c\x28\xa0\x95\xca\xfc\x74\x9b\x05\x11\xa6\xc8\x78\xed\xb3\xb7\x80\xea\x17\x4d\x07\xb1\x21\xe3\x15\xa8\x26\xdd\xa6\xec\x8d\xc5\x43\x63\xe2\xcd\x2e\x63\x05\xa1\x94\x82\x5c\x0e\xa9\x0e\xfd\x7a\x9f\xd8\x9c\xd9\x7b\x99\xc4\x30\x0b\xd3\xbf\x93\x53\xd8\x2f\xbc\xce\xea\x71\xb4\xee\x3f\x1a\xae\x95\x39\xb4\xcc\xe9\x0c\xa4\x77\x59\x7c\x17\x4e\xf2\x0f\x4b\x9f\x4e\x62\xd0\x9a\x57\x0d\x31\x35\xaa\xbe\xe9\x55\x1f\xa6\x09\x83\x95\x8c\x0b\x7b\x8c\x37\x44\x55\x3e\xe1\x4e\x7f\x3c\xd1\x03\xa1\x92\x51\xc9\x9b\xf6\x38\x4a\xbb\x60\xa7\x6a\xfc\x66\x58\xb8\x0d\xfc\x51\x10\xad\xc4\xc7\x32\xfe\x0e\xe3\x29\x33\xfb\x28\x48\x28\xe0\x08\x88\x7a\xef\x80\xf6\xf8\x13\x34\x04\x46\xc0\x21\x7c\x12\xee"}, -{{0x12,0xfe,0x8e,0x5c,0xe2,0x0c,0xaf,0xaa,0x32,0x79,0xda,0x7b,0x34,0xaa,0x87,0x75,0x2e,0xad,0x67,0x9f,0x15,0x61,0x28,0xaa,0xef,0xb4,0xaf,0xa5,0xdb,0x4f,0x2a,0x6f,},{0xe7,0x7f,0x44,0x20,0x6b,0xb0,0xc4,0xc5,0x9a,0x28,0x70,0xcf,0xc2,0xec,0xac,0x63,0x36,0x2d,0xee,0xcb,0xe8,0x11,0x5d,0xe5,0xcb,0x1a,0xfc,0x2d,0x9a,0x3d,0x47,0xf1,},{0x04,0xea,0xf9,0x00,0x96,0x6e,0x09,0x92,0xd3,0x6e,0x3c,0x22,0x0a,0x4b,0xd4,0xd8,0x2b,0xcc,0x6e,0xb9,0x98,0xed,0x05,0x1d,0xbc,0xb9,0x16,0x0b,0xcd,0x35,0x74,0x09,0x73,0x6b,0xcf,0xf7,0xe6,0x63,0x0e,0x96,0xf5,0x53,0x8a,0xec,0xa6,0xab,0x8b,0x0d,0x0b,0xd8,0x2c,0x0c,0xd7,0xc4,0x54,0x99,0x17,0xfe,0xbb,0x9c,0xba,0xda,0x08,0x0c,},"\x6b\x80\xcc\x6f\xbb\xd3\x32\xf8\xc6\x19\x7c\xdf\x2e\x6d\xc1\x9a\x21\x30\xfa\xa2\xec\x93\x8e\xf5\x58\xb8\x84\xba\x4f\xa5\xe1\x13\xe5\xb3\xe4\xb1\xaa\xf5\x1b\x69\x5f\x13\xef\xfe\x13\xf7\x7d\x39\xca\xb3\xc0\x7d\x04\xd6\x6d\x43\x0d\x99\x74\xb1\xda\x3d\x39\xdf\x12\x78\xc0\x0d\x6b\xcb\xfd\x4b\xae\x75\xb8\xc0\x76\x40\x4d\xbb\xb8\x34\x48\xfb\x49\x3d\xf6\x70\x00\xf9\x7d\x24\x7e\x8f\x23\xdc\x08\x1f\xce\x99\x2b\x65\xa2\x1b\x35\xd7\xbd\x7f\xa7\xdc\xcc\x54\xa5\x60\xaf\xd1\x4b\x1e\xc4\x36\xc1\x09\x46\xf6\xaa\x59\xea\xe1\xbe\x3e\xcf\x31\x1d\xef\x51\xe4\x6b\x6b\x4d\x1d\x08\x0d\x17\x84\xb2\x33\x4b\x80\xcf\xba\x72\xcd\x93\x1f\x55\xec\xd2\x98\xb0\x5d\xc8\x36\xab\x12\xd0\xad\x8b\x5d\x6e\x9b\x1e\x3c\xea\x3d\x84\x33\x68\xee\xf1\x9f\x5c\x14\xc6\xbb\xad\x94\x14\xcc\x7a\x4d\xb6\xa7\x26\xe4\xfc\xae\xd4\x44\x40\xa0\x19\xfe\x12\xa6\x05\x73\x40\x3c\x0e\x66\x2d\xc9\x02\xd1\xc8\x73\xff\x30\xc9\x31\xba\x7e\x43\xa3\xb3\xbf\x71\xd5\xb0\x94\xea\x50\x49\x71\x64\x7c\xa9\x43\x56\xf0\xa5\x3e\x44\x4b\x4c\x00\x8e\xe5\x97\x72\x04\x22\x1b\x40\x0d\xee\xc3\x7f\xc2\x73\x45\x25\x45\xf8\xf2\x18\xbe\x98\x87\x25\xbc\x38\xc8\x5d\xf2\x12\xea\x73\xdc\x0b\xc7\xcb\xba\xc9\x07\x98\x2f\xef\xad\x68\x0f\xbd\x97\x5c\x20\x93\xa7\xfe\x8e\x6b\x37\xc1\xcc\xed\x87\xf8\x1d\xaa\x57\x29\x1a\x5a\x18\x47\x6d\x11\xa1\x8e\xc4\xb5\xcb\xce\x5d\x55\xac\x9b\x62\x4b\x04\x84\x30\xf2\x54\xf6\x71\x07\x85\x06\xe6\x98\x9d\xf7\xc0\x92\x56\x52\x50\x39\x08\x5a\xb7\xc1\x30\xc2\x40\x00\x4a\xbb\xb3\xaf\x6b\x48\x1c\xc1\xa0\x61\x7e\x57\xe3\x88\xee\x4b\x1f\x05\x2f\x34\xa0\x03\xfe\x6b\xb2\x02\xcb\x87\xd2\x74\x1b\xd8\xe3\x45\x4c\xa7\x3d\x2f\x61\x20\x11\xec\xc7\x4d\x88\x34\x35\x10\xa6\x3c\x93\x13\xdd\xc3\x6c\x25\xd3\xfb\x03\xe1\x88\xf5\x60\xbd\x02\x9c\x80\x15\x85\xce\x55\x29\x88\xdc\x55\xb7\xd8\x52\x2a\x33\x96\xc0\x1d\x5e\x71\x5a\xe2\x6c\x62\x2c\x64\xfe\xd5\xb9\x8e\x9c\x55\x9e\x4a\xa7\x8d\x1e\xd3\xb7\xb8\x90\xd4\x77\xec\x8c\x50\xa0\xff\x10\x7a\x3f\x83\xb0\x7b\xd3\x5e\x9c\xe9\xa0\x8b\xcf\xc0\xf1\x68\xee\xc7\xaa\x31\x1f\x71\xc6\x6a\x71\xce\xb9\xd5\xa2\x19\x9a\x14\xbe\x36\x86\x5c\xa8\xd0\x7e\x18\x6b\x13\x92\xb9\x29\x0c\x57\x80\x04\xd5\x84\xf1\x91\xc8\x2a\x53\xd8\x50\x89\x0b\xcc\x0d\x12\xdf\xf8\x40\xe0\x43\xdd\xdc\x2e\x67\x0c\x83\x60\x20\x92\x4f\x58\xc0\x44\xb2\x18\x76\x3c\xa6\x19\x82\xbc\x33\x2d\x24\x7b\x2a\x00\x8a\xb5\x70\xb6\x56\x5a\x06\x89\x2a\x26\xcf\xb0\x85\x3d\x79\xda\x28\xef\x8b\x91\x0a\x93\x29\x54\x4b\x79\x2a\xe4\x45\x6b\xa7\x76\x50\x66\xb9\xd1\xb4\xa3\x00\x21\x04\x48\x66\x0a\xe4\x8b\x50\x44\x41\x01\x7c\xdd\xd1\xf6\xf0\x09\x38\xb1\x07\x2c\x8a\xb8\x24\xad\xfe\x8a\xe3\x49\x23\xc8\x2e\xec\x75\x4b\xee\x1a\x65\x50\xab\x1d\x3d\xa0\x86\xe3\xae\xbb\xf2\x11\x69\xc4\x44\x69\xe0\x3b\xba\xe0\xd7\x2c\xe8\x63\x45\x77\x84\xcf\xe1\xdf\xc2\x76\xf1\xaf\xad\x9e\xe5\x3e\xba\xb5\xa3\xc6\x57\x2e\xb1\xca\xe0\x99\xa4\xa5\xfe\x19\x31\x92\x90\xe6\xa1\xb8\xb0\xe7\x54\x1e\xd7\x35\xb3\xf2\x1b\x1e\x2c\x75\x09\xf8\x7f\xd1\xfe\xd0\x00\x07\x47\x9b\x3c\x1b\xb7\x84\x32\x46\x63\x02\xd2\x46\xd8\xd0\x31\x99\x63\x07\x26\x0a\x0c\x41\xa0\xe3\xec\xd1\xe7\xfd\x83\x4d\xac\x11\xa1\x3e\xb0\x36\xb3\x9c\x36\x99\x66\xfd\xef\x39\x4c\x18\x3e\x54\xe7\xb0\xcb\x3d\x0c\xeb\x19\x8b\xd0\xe6\x6c\x00\xd3\x8d\xb7\x03\xaa\xce\x30\xcb\xbd\xab\x36\x9d\xfd\x1d\x9e\x51\x4d\x09\x68\xf1\x00\xc9\xf0\x7c\x31\x50\x89\xad\xb3\xad\x02\xe5\x9c\x04\xb9\xbe\x46\xe9\x9f\xbf\x5a\x62\xc6\xbb\xec\xdf\xf5\xb3\x81\xe5\x51\x27\x82\x4d\xdb\x18"}, -{{0xee,0x9b,0x6c,0x2e,0x0c,0x9b,0x01,0x47,0x2c,0xe3,0x2d,0x54,0xd1,0x76,0x2a,0xb0,0x30,0x33,0x17,0xd7,0x6d,0x3a,0xa7,0x8f,0x5e,0x08,0xa9,0x02,0x4c,0xa1,0xe0,0x83,},{0x01,0x6d,0xf0,0xf7,0x17,0xbc,0xb7,0xad,0xf6,0x26,0x95,0x8d,0x83,0xbf,0x8a,0xa3,0x25,0xc7,0x05,0x18,0xc6,0x8b,0xc7,0xef,0xd8,0x42,0x53,0xb7,0x5d,0xb0,0x87,0x88,},{0x4b,0x00,0x1d,0x96,0x42,0x83,0x5d,0x72,0x13,0x8d,0x68,0x01,0x98,0xe6,0xaf,0x70,0xb5,0xde,0x7a,0xf0,0x15,0x13,0x1e,0xa7,0x26,0xf4,0xe5,0x1b,0x5e,0x8b,0x6d,0x48,0xc2,0xa6,0xca,0x8e,0x87,0x09,0xcc,0x82,0x22,0xa5,0x04,0x7c,0x09,0xa6,0x6e,0x51,0x8a,0xc5,0xe8,0xb6,0xe5,0x35,0x48,0x94,0x82,0x61,0xf0,0x70,0x1f,0x68,0x73,0x08,},"\x77\x2c\xc2\x5c\x3b\x69\xbb\x3f\xf5\x65\x56\x64\xef\xa4\x78\xac\x41\x4a\xdf\xae\xa7\x0a\xc4\xa2\xa8\x87\xed\x39\x68\xc5\x4d\x34\xdb\xf1\xbe\x32\xcc\x9a\x9b\x54\x20\xa4\xad\x3c\x9a\x87\x7b\xc8\xcc\xec\x94\xad\x47\x3a\xa7\xa3\xc7\xde\x08\xa0\xfd\xb5\xed\x1e\x89\x87\x2b\xe7\x81\x70\xbe\x22\x1d\x27\x97\x76\xbb\xc6\xed\x9c\x5a\x67\x16\x89\x80\xd5\xea\xf8\x95\xe1\x34\x0f\x5d\xfa\xa3\xdf\x62\x2d\x65\x44\xb3\x99\xd7\x49\x45\xfd\x13\xbb\x11\x73\x62\x1e\x05\x61\x51\x46\x40\x13\x7a\xa7\xbc\x9c\xb7\xde\xbe\xff\x2c\x62\x69\x77\xd4\x47\x26\x3b\x7e\x57\xd4\x3d\x69\xef\xb2\x30\xcd\x25\x86\x5e\x4d\x92\x48\x28\xf5\xe3\x6f\x96\x4e\x40\x3e\x34\x93\xf3\x0d\x6d\xfe\xa6\xca\x3b\x78\x10\x75\xb5\xe3\xb2\x5c\x05\xac\x50\xe5\x55\xf1\x5b\xa1\x2b\x0e\x05\x9b\xff\x99\x64\x84\x12\x9d\xb6\xea\xfd\x88\x99\x3d\x6f\x0b\x7e\xcd\x15\xdc\xe2\xfc\x99\xf8\xb8\xe4\x35\x16\x35\x2d\xdb\x46\x1a\x04\xb9\xff\x34\x86\x45\x2e\x6a\xa6\xa5\x4b\x2d\x10\x62\xa7\x71\x42\x50\xcd\x2a\x88\xff\x6c\x4c\x17\xb6\xcc\x66\x52\xd8\xc5\xac\x27\xd4\x44\x3a\xeb\xf3\xd5\xfb\xaa\xee\x45\x21\xec\x76\xf0\x41\x3d\xb6\x44\x21\xec\x8d\x69\x49\x62\x67\x25\xfe\x56\x16\x0a\xb3\x07\xc0\xe7\x39\x06\xc4\x51\x55\xef\xab\xb4\x72\x22\x02\x1f\x22\x0d\x32\xbd\x3d\xb0\x71\x2a\xbd\xe2\x59\x9e\xa4\xff\x79\x97\x17\x81\x1d\xcd\xf8\x18\x2d\xf6\x71\x6d\x2a\x03\x8a\xee\x15\xd7\x78\xda\x55\xac\x20\xf0\x1f\x25\x30\x9c\xea\xd5\xb5\xb7\xb2\x23\x22\xe1\x82\x8e\xa7\xc9\x1a\xe6\x66\xf2\xdc\xd6\x84\x07\x31\x48\xe3\x1b\xb2\x24\x7d\x5f\x93\x50\x6e\xa8\x08\x52\x27\xad\xc9\xae\x19\x82\xe9\x50\xf0\x06\xa9\xda\x15\x8b\x9c\xec\xff\x89\x29\x76\x1c\x84\xf9\xd9\x76\xfd\xcd\x31\x7f\xfe\xd3\x6c\xbf\x6a\xcd\xa3\xe5\x0c\x9b\x73\xbd\x2c\x80\x85\x40\x9d\x11\x9b\x64\xce\xd7\x34\x9a\x26\x74\x26\x2a\x83\x2b\xec\xb0\x3c\x2e\xdc\xca\xc0\xec\x54\x12\x4e\x82\xf8\x10\x18\x17\x92\xda\x49\xea\x10\xbd\x94\x1f\x98\x95\xa0\x69\x59\xfd\xe0\xd3\xb0\xae\x84\xc3\x9d\xf0\x53\x90\xab\x33\xc3\x6c\x79\xca\x22\xe6\x59\x4d\x7f\xc6\xe3\xf8\x69\x22\xd7\x8e\xb7\xf5\xc2\x54\x95\xd8\x22\xa3\xb4\x10\x51\xb2\x4e\x57\xa7\x6f\xcf\xc1\x65\xcd\xe6\xd0\x96\xcc\x7b\x7e\x9d\x05\x5f\xe8\x64\xd5\x29\x42\xd6\x29\xa8\xac\x26\x1b\xe1\xdc\xd3\xa2\x1f\x89\x5f\x49\xb6\x7e\xe4\x7e\xab\x7c\xf1\x64\x4d\x57\x1d\x5f\xf3\x8c\x17\x9f\x5c\x6a\x54\xa3\x61\x2f\xb3\x47\x53\x41\x2a\x1b\x95\xbf\x62\xff\x31\x79\x80\x4f\xfb\xb9\x90\x51\xf2\xb0\x80\x56\x3a\x4a\xe0\xf2\x7c\xf9\x96\xea\x8b\xe3\xba\xe0\xa4\x33\x9d\xcc\xdf\xf6\xb6\x67\x15\x59\x26\x6e\xaf\xf4\xef\xf6\x82\xb8\xde\xe8\x9c\x9d\x2d\x45\xac\xdb\xec\x4a\xa6\xce\xcd\xbd\xb1\xd2\x84\x60\x9e\x65\xef\xb7\x7b\xb8\xf1\xa5\x1f\xc4\xd4\x56\x8a\x70\x5f\xb9\xc9\x7b\x23\x03\xc1\x46\x7d\xff\x8c\x8c\x5e\xe2\x75\x59\xb9\x3a\xd1\xc5\xb9\xc5\xc6\xc7\xc5\x29\xfa\x8c\x55\xc7\x5e\xbb\x59\xb2\xa8\x18\xaa\x9b\xda\x1e\x9e\x79\xbc\x66\x02\x97\x72\xf8\xae\xa1\x1b\xad\xd3\x22\x65\x65\xd5\x4f\xd0\x1b\xda\x8c\xb2\x70\xe7\x0d\xc9\x33\x9b\x46\x90\x0b\x58\x18\xe9\x32\x07\x5b\xe6\xc2\x8e\x73\xa1\x91\xd0\x2c\xbd\xc7\x45\x4b\xe1\x23\x87\xb0\xd4\x7a\x1a\xb1\x42\x32\xd2\x34\x2a\x6f\x15\x18\xea\x97\x09\x8b\x81\x5a\x1c\xa3\xf9\xc7\x0b\x25\x72\x2b\x1b\xcd\x7d\xac\xda\x63\x56\x22\xfc\x8e\x72\x95\x9f\x57\xf7\x67\xea\x56\x3d\xa4\xc1\x58\xee\xf7\x20\x01\x09\xf6\x14\x16\xc2\xe7\x04\x39\x92\x30\x62\x43\x7b\x1d\x08\x2a\x8c\x7f\x43\x94\x71\x3c\x1b\x7b\xa0\x58\x7b\x84\x1c\x11\x44\x75\xee\x3f\xf0\x59\xdf\x8c\xfa\x12\xa3\x21\xd9\x01\xcb\x47\xf5"}, -{{0xa3,0xd2,0x35,0x05,0xd0,0x7c,0x5f,0x93,0x7f,0x13,0x63,0x9d,0xbd,0x81,0x8e,0x85,0x14,0x52,0x34,0xee,0x70,0x17,0xec,0xee,0x86,0x36,0xc7,0xba,0x76,0xeb,0xef,0x5b,},{0xfd,0x7f,0xdb,0x3d,0x02,0x2b,0xa3,0x6e,0xad,0xfe,0xd0,0xda,0xaa,0xe5,0xbf,0xf0,0x45,0x05,0x40,0x3f,0x17,0x14,0x73,0xe4,0xd3,0x61,0xee,0x8d,0x15,0x0a,0x0e,0xb4,},{0x67,0xa6,0x67,0xee,0x0d,0x62,0x54,0xca,0x0a,0x8f,0x21,0x25,0x82,0xc0,0xcb,0x8b,0x6e,0xd9,0x7c,0xc9,0x67,0xdb,0x02,0x12,0x96,0xad,0x6a,0xa9,0x9f,0x0a,0xd3,0xa9,0x44,0x97,0x8c,0xfd,0xaf,0xf1,0x3f,0xe5,0xf8,0xc6,0xe8,0x8c,0xbd,0x83,0x1a,0x54,0x73,0xd0,0x74,0x2e,0x37,0x34,0xb3,0xe2,0xdf,0x00,0xff,0x32,0x40,0xa5,0xde,0x02,},"\xbc\x29\x8e\xd6\x98\x92\x90\x40\x28\x72\x5e\x21\xb1\x14\x46\x2d\x89\xd8\xc0\x06\xdc\x88\x4b\x17\x87\x56\x83\x8a\xf4\x95\x4f\xf0\xf1\xb7\x95\x17\x30\x7a\x25\x8a\x0e\x76\x81\xe8\x79\xac\x47\xd7\x92\x02\x30\xb0\xcc\x1d\x66\x17\x1e\xb2\x14\xd7\x7c\xd9\x7f\x61\x7c\x40\x5e\x6c\x21\x72\xfc\x58\x9f\x16\x25\xcc\x5e\x1b\x59\x31\x10\x53\x1f\x6e\xb5\x3f\x1e\x6f\x48\x6d\x19\x64\x61\x24\x47\x75\x0a\x04\x1f\xe5\x1b\x33\x2e\xb3\xfb\xc7\x11\x61\x6c\xe3\x5f\x04\x04\x42\xb4\x31\x63\xb8\x0b\x75\x1e\x21\xec\x12\x45\xf1\x2e\x48\x83\xc7\x9d\x3b\x41\x32\x82\xc6\x9b\xfc\x6a\x46\x5d\x1e\x78\x96\xba\xb0\x38\xdc\x89\xb4\xcf\xc0\x32\xfc\xcd\xfc\x87\xb0\x7f\x06\x11\x0e\x1f\x50\x6a\xcc\xa8\x15\x7a\x32\x25\x43\xbf\x1e\xd8\x90\x67\x27\xf2\x8d\x0d\x68\x9b\xcd\x7d\xd3\xdf\x85\x93\x52\x04\xa9\x04\xab\x3f\x7a\x0d\x99\xc1\x6e\x5a\x54\x2c\xc2\xbc\xde\xbf\x5b\x50\x2d\xba\xbe\x33\xb9\x72\x48\x0e\x02\xe7\x1a\x43\x8a\x19\x80\xa8\x76\x6f\x10\x8b\xd8\xad\x51\x10\x42\x23\x99\x4d\x9b\xfb\x3c\x3a\x4b\x7a\x59\x23\x8c\xe2\xef\x7d\x72\x88\x38\x3f\xfb\xf2\x91\xe1\x60\x2b\x38\x4a\xf6\x07\x00\xd7\xda\xf0\xe8\xfe\x60\xf8\xca\xed\xe4\x3d\xb0\x6b\x3f\x4c\x8c\xff\xf7\x49\xae\xaf\xa4\x6f\xc6\x1c\x49\xb2\xd5\xa4\x12\x04\xcf\x86\xf0\x49\x25\x4d\x80\x9e\x94\x98\xaa\x9d\x4c\xfd\xb9\x4a\xcb\x2b\xab\xfc\xf7\x86\xdd\xfb\x03\x69\x15\x16\xb3\x83\x8b\x0d\x4f\x20\x1c\xb2\x59\x1e\xdb\xb0\xb0\xf6\x74\xe1\xe2\x82\x03\x16\xb7\x2e\x81\xb4\x8c\xc5\xa6\xb2\x93\x38\xbc\x36\x68\x1f\x8f\x7d\xca\x43\xee\x6c\x0b\xd2\xe4\x02\xaf\xbf\x96\x77\x97\x51\x64\x53\xbc\x01\xbe\x86\xbf\x42\x29\x9d\x1b\x73\x6a\x0d\x97\xbb\xc9\x22\xf5\xa7\x8a\xf2\xdf\x42\xe6\xf8\xc2\x8e\x95\x3f\x2c\xea\xda\xff\xc5\xe9\x30\x64\x04\x1e\x42\x5a\xd6\x97\x5f\x88\xc7\xaa\xdf\x81\xc3\x68\x69\x1a\x58\x1e\x88\x5f\x2a\x6b\xa7\x2e\xd6\x8b\x8f\xef\xbc\xd6\xce\x36\x86\x26\xd4\x48\x92\xa2\x02\x70\xb5\xf7\x09\xc2\xe3\x4b\x83\x35\xd4\x2e\xeb\xd6\x7a\x24\xdf\x73\xf4\x54\x55\xc4\x19\x44\x18\x7b\x66\x92\xf0\x54\xb2\xfc\x95\x91\x37\x3f\x19\xfc\x71\xaa\x7f\xa2\x7d\xf6\x00\x6a\x1d\x54\x9b\xbf\xae\x7d\x3c\x3e\xb3\x6e\x5a\xb2\xaa\xa1\x0a\xa5\x53\x8d\xa7\xef\x36\xc8\xff\x35\x4b\x60\x58\x13\x40\x04\xd6\x60\xa4\x03\x63\x21\xca\xad\x00\xa3\x0b\x1c\x49\x8b\xa3\xd8\x08\xc4\x40\x5e\xf7\x96\x18\xfc\x22\x12\xa7\xb8\x33\x96\xa3\xd7\xce\xdc\xeb\x86\x3c\x66\x37\x4d\xc4\x69\xae\x18\x3c\x7e\xd7\x4b\x3e\x70\xd6\x37\x4a\x06\x2d\xe0\x37\x9b\x21\xcf\x25\xd3\xc4\xc5\x76\x21\x15\xcd\xfe\x75\x55\x45\xe8\x9a\xd4\x05\x2b\xb0\x27\x9d\x93\x8e\x90\xde\x3a\xbf\x50\x44\x10\xca\xad\x72\xb7\xc2\x9f\x53\xd0\x1d\x9d\xd7\xf2\xec\x5e\x45\x9a\x04\x59\x2b\xdd\x66\x41\x66\x13\xe6\xed\xd0\x04\x56\x9e\x0e\x6c\x98\x82\x7b\x8c\x1d\x70\x02\xa6\xd1\xbf\x30\x3e\x18\x25\x95\x01\xdd\x89\xf6\xee\x94\x76\x6d\x18\xaf\x81\x04\x63\xeb\x13\xb2\xef\xdd\xf1\x72\x3a\xf7\x35\xa8\x87\x16\xe1\xfc\xb4\xb7\xb4\x3c\xb9\x7e\x1c\xc9\x03\xb2\x40\x8e\xf4\x53\xad\xa4\x16\x47\x86\xf0\x08\x45\xfb\xfa\x1f\xfc\xa5\xcc\x3e\x1c\x4b\xd9\x94\x0e\x7d\x99\xae\xf9\x19\x16\x6d\x05\x8b\x51\x45\x3c\x9c\x14\xfb\x9f\x32\x51\xec\x5f\xe4\xf1\x53\xc7\x0a\x44\x92\xdc\x34\x96\x29\x61\x86\xf2\x3a\xd4\x7e\xba\xd1\x3c\x66\xe6\x87\x27\xce\x50\xba\x94\x87\xf1\x80\x18\x90\xb6\x93\xef\xeb\xfc\x37\xbb\x5d\x95\xf8\xaf\x54\x8e\xc8\xd6\x49\x82\x89\xe5\x5f\x98\x83\xfc\x5b\xe8\x4c\x25\x6d\x2b\xc5\x48\x49\x38\xc7\x09\x82\x0d\x9b\x6b\x80\x59\xc0\xaa\x42\x67\xdd\xe6\x90\x78\xe4\x87\xc8\x86\x5c\x0b\x13\x0a\x0c\xa8\xca"}, -{{0x6e,0x26,0x51,0x05,0xee,0x71,0x71,0xd1,0xbd,0x79,0x3e,0xff,0xd8,0x7d,0x1e,0x2c,0x79,0x45,0x0d,0x5e,0x18,0x8b,0x57,0xbe,0x3a,0xa1,0x62,0xe2,0xa5,0x25,0x28,0xad,},{0x1f,0x40,0x3c,0x7a,0x75,0x50,0x31,0xc1,0x3c,0xa6,0x3a,0xf5,0x76,0x35,0xdc,0x6e,0x2c,0x4f,0x23,0xbd,0x6b,0x1d,0x67,0xca,0x65,0xda,0x68,0xb0,0x99,0x43,0xc5,0x54,},{0xb5,0xa8,0x3a,0x11,0x7a,0x60,0x34,0x5a,0x67,0xe4,0xa6,0x65,0xf3,0x7d,0xe7,0x22,0xa6,0xec,0x03,0x91,0x38,0x29,0x38,0x99,0x59,0xf3,0x76,0xee,0x62,0x64,0x77,0xe6,0x54,0xac,0x8d,0x72,0x0f,0xc7,0x27,0xd4,0xbb,0x8f,0xe1,0x54,0x4f,0x5d,0x0b,0x0b,0x85,0x05,0x14,0x29,0x0b,0x24,0x27,0x3c,0x4c,0xd4,0xb7,0x3a,0xca,0x4a,0x53,0x00,},"\xf8\xb9\xd4\xb0\x27\xeb\xb1\x0e\xe5\x11\x81\x9e\x6e\x56\xfb\x1b\xa9\x58\x40\x18\x41\x8d\x82\x88\x5a\x38\xa4\x49\x08\x60\x07\xb8\x78\x5b\x51\x05\xca\xf7\x82\xbf\x9b\x36\xda\x03\x9c\xc6\x0e\x22\x7c\x7e\x16\x14\xf2\x9b\x64\x0b\x1e\x9b\x22\x74\x7e\xea\x7a\x67\x25\x61\x4e\x89\xe0\x78\x3e\xbe\xbb\xb7\xee\x55\x7e\xf3\x6b\x2b\x46\xcf\x64\x61\xe5\xbe\x2a\xd1\xd7\xa7\xc2\x71\x1a\x47\x5c\xa4\xfb\xc3\x30\x92\xba\x42\x56\x67\xe3\x4d\x09\x00\x60\x51\x8f\x2f\xec\x63\x6b\x04\x91\x23\x87\x6a\xb2\x1c\x8b\xd9\xc5\x0d\xcc\xb9\x84\xca\x01\x1a\x02\xee\xa0\x20\x56\x4f\xa8\x21\xfc\x36\x2b\xfe\x39\x2a\xab\x50\xc2\x73\xfc\x7b\x5a\x04\x21\x88\xe3\x31\x62\x1b\x9d\x2f\x74\x3e\x5c\x8c\xf3\xab\x1f\xaf\xfa\xfe\x2a\x00\x04\xc8\xef\x7c\xdf\x5e\x6d\xbb\x5e\xb5\x44\xe4\x28\x9f\x71\xa6\xfd\x15\xc6\x38\xce\x29\xd2\x8e\xfb\x9c\x03\x9e\x47\x74\x29\xa3\x49\x7a\x83\x82\x7e\x76\xce\x77\xa4\x98\x16\xd9\x0b\x41\xa8\xe1\x52\xf3\x7a\x09\xe6\x34\x0d\xfe\x06\x9a\x4a\xc6\xf2\x7d\xd2\xea\xc7\x47\xfd\x21\xe3\x15\x20\x88\xc1\xb1\xec\xd3\x2a\xc6\x79\x92\x74\x90\x75\x04\x88\xc2\x91\x78\x51\x47\xb6\x3b\x0b\x8f\xf1\x1d\x18\x9b\x90\x49\xb8\xa3\x96\xb6\x93\x2f\x85\xbd\x6a\x15\xef\xf9\xf0\xce\x18\x08\x41\x1a\xf0\xf9\xc8\xe6\xe9\x7b\x81\x4f\x11\x0b\xd4\xdf\x13\x86\xa9\x79\x7d\xc5\x11\xf0\xaa\xb6\xab\x65\x07\x1d\x9e\xa8\x36\x53\x2c\xec\x51\xb9\x2c\xa7\xfb\xdb\x8d\xe1\xc8\x43\x66\x58\xde\x2e\xb6\x5e\xdd\x86\x04\x4f\x6c\x1a\xba\x31\x78\x64\x7a\xd6\x78\x61\x2e\xe7\x4f\x04\x6c\xa3\xc7\xfe\x2f\x39\xc0\x9d\xd2\xe0\x7d\xf2\xb4\x22\x70\x85\xfe\x93\x6e\x79\x4d\x22\xfd\x5f\x40\xa2\x5f\x08\x77\x15\x80\xac\x80\x1d\x98\x89\xf5\xa7\x6a\xea\xe1\xf0\xcc\x4a\x9e\x1e\xdb\xdd\xa3\x75\x0c\x74\xc8\x50\x52\x4b\x32\xf4\x49\x33\xfd\x88\x3b\x53\x72\xbf\xb7\xe7\x61\xe0\x69\xfe\x7c\x1c\x0e\x7f\xbd\x4a\x7f\x58\x46\x7e\xa6\x88\x3f\x9d\x5b\x7f\x66\xd3\x86\xb0\x49\x9b\xb6\xfb\x5e\xad\x89\xc9\xa1\xfd\x2c\xce\xb9\x73\xe2\x87\x9b\x5d\x03\xea\xa4\x52\xe1\x60\x22\xd5\x96\x17\xda\xa0\x48\x6f\x4d\x4c\x11\x78\x07\xfd\xa8\x49\x9d\xfb\x7a\x28\x6f\xd2\xf7\x1a\x8e\xb5\xfe\x64\x06\x5c\x41\xe4\xe1\xe2\x36\x2a\xb4\xe4\x77\x96\x9e\x3a\x40\x8a\x24\x7e\x3a\x56\xfc\x86\xf2\xb0\x1e\xf8\xd3\xcd\xda\x87\x25\x82\x34\xbc\x7f\x25\xb6\x69\x07\xf3\x64\xb3\x7b\x62\x45\x29\x6c\x4f\xdf\x49\x9f\x20\x23\x7f\x48\x64\x85\x2f\xc5\xd8\xcd\x5d\x05\x41\x8b\xe8\xb1\x38\x59\xee\x9a\x43\xe1\x7e\x1f\x57\xa4\xc3\x5e\xa2\x82\xed\x68\xeb\xcd\xa6\x82\x81\x74\x24\x5a\x49\xc6\xcb\x65\x90\xeb\x1f\x2d\xcf\xb0\x07\xbf\xa1\xc3\x20\x77\x95\x6d\xa9\xac\xbe\x3e\xf0\x72\x37\x99\xfd\xb8\x69\xd8\xde\x30\x70\x6a\x9c\x02\x68\x14\xd1\x6a\x01\xe0\x33\xc9\x1b\x59\x07\x0d\xfe\x44\x5c\x5b\x84\x8a\x51\x66\x12\xe5\x13\x1f\xe8\x48\x69\x21\xe3\x6b\x8e\x7e\xf1\x57\xa8\x88\x22\x88\x6c\x68\x1b\x5d\xa7\x1f\xea\x94\xd9\x57\xda\xfe\xc2\x6f\x41\x47\xa3\xb2\xac\x38\x3a\x5f\x47\xc8\x58\x5e\xb1\x7a\x8a\xc6\x57\x90\x64\x1b\x42\x18\xd7\x55\xf8\xbe\xa4\xd9\x7a\xe2\xa4\x5b\xdc\xdc\x23\x23\x62\x94\xd8\x52\xc9\x5d\x08\x40\x6d\x2e\x9b\xd3\x0c\x32\x64\x52\x53\x8c\x1f\x5e\x50\x04\xd4\xa1\xa8\x27\x20\xda\x32\xe5\x9d\xc3\xab\x18\xea\x08\xa0\x58\xf7\x91\xd2\x44\x18\x55\x60\x86\xc1\xe4\xed\xce\x89\x82\xaa\x23\xb1\x18\xfb\x26\x6e\x60\xb5\x42\x78\x0a\x69\x33\xad\xd9\x13\x26\x55\x12\xc0\x7b\x11\x49\x78\xd4\x4a\xf7\x3b\x20\x30\xec\x47\xb0\x6f\xd0\x9d\xda\x8c\x4f\x1d\x4e\x31\x37\x75\x46\x8c\x45\x1f\x9e\xe6\x11\xe9\xcd\x4c\x08\x45\xc2\x50\x19\x48\xa7\xb1\x4e\xf1\xd4\xb5\xcf"}, -{{0xc4,0x37,0x0d,0x2a,0xaf,0x35,0xac,0xd1,0x58,0xfc,0x0d,0x16,0x22,0xa3,0x99,0xc9,0x9f,0x41,0xb9,0xda,0x4e,0x97,0x0b,0x35,0x4e,0x5b,0xa0,0x5c,0xbe,0x84,0x4c,0xa8,},{0x35,0x45,0xd7,0xd4,0xc9,0x5c,0x3d,0xb6,0xa5,0x45,0x30,0x53,0x7a,0xfa,0xfa,0x4d,0x86,0xdd,0xec,0xf9,0xcc,0x7e,0x66,0xc3,0x19,0xba,0x9f,0x7d,0xd7,0xd0,0x7e,0xe7,},{0x9f,0xeb,0xab,0x5a,0xe1,0x61,0xd6,0x92,0xa6,0xa3,0x94,0x50,0x0a,0x28,0x90,0xd2,0x1c,0x7f,0x0e,0xe2,0x6f,0x46,0x40,0xaa,0xba,0x4f,0xe6,0x6b,0x90,0xb8,0x9e,0xdc,0xb8,0x0e,0xa4,0xcd,0xca,0xbb,0x4d,0x2c,0x3a,0x5c,0x41,0x54,0xe8,0xff,0x20,0xd0,0xe2,0x37,0xfe,0xfd,0x00,0xc7,0xba,0x97,0x82,0xe1,0x74,0x8f,0x64,0x88,0xac,0x01,},"\x61\x9f\x57\xde\x2b\x1d\xba\xee\x20\x9a\x82\x5d\x8c\xa9\x7f\x84\xee\x49\xeb\x12\xa0\xb1\x3d\xcd\xd2\xb3\xa4\xee\x45\xe0\x17\x6d\x47\x4c\xf0\x94\x60\xc8\x31\xa8\xae\x1d\x3f\x39\xbe\xeb\xd0\x88\x08\xb3\xed\x17\x61\x21\x3b\xa9\x53\x42\x18\x60\xcc\x07\xe2\xdb\x31\x2e\x68\x0d\xf0\x3e\x60\xa6\x87\x02\x64\xab\xca\x8f\xd5\x13\x01\xe1\xc1\x56\x20\x23\xd8\x02\xcc\xd5\xc7\xd1\x96\xdb\x39\xfb\xb8\x30\x4b\x0e\x59\xe3\x33\x16\x41\x92\xec\xc3\x33\x38\x7e\xef\x69\xc7\xa7\x8a\x5d\x11\x25\x88\x62\xd6\xc2\x81\xb1\x9c\x0b\xd3\x36\xcd\x3e\xdb\x2f\x9f\xaa\xd4\x02\x1a\xc2\xf2\x05\xc1\x68\x14\xb3\x85\x48\x43\x3f\xf9\xed\xdf\xd6\x11\x33\x77\x97\x69\xdc\x69\xaf\xac\x65\x8a\xfc\x1d\x1b\x41\x6d\x39\x0a\xd5\xb4\x5a\x1a\xd5\xcc\x4b\x00\xb4\xb2\x78\xfb\xe4\xb5\x9d\x52\xe6\x1a\x6a\x5f\xd0\x02\x41\xc6\xcb\xc3\x82\xd2\xd6\x21\xa3\xde\xd0\x02\x01\x9b\x33\x05\x60\xe3\x61\xfa\xab\x28\xf4\x1d\x1a\xf9\xc9\xc0\x02\x0f\x2b\xaf\x99\xe8\xd8\xee\x58\xe3\x12\x22\x02\x14\x7c\x0a\xdc\x57\xd6\x70\xc5\xb3\x80\xaf\x59\x4c\xc7\xed\x57\xb8\x7e\xc6\x67\x4a\xb6\x3f\x3a\x98\x49\x75\x3b\x94\x62\xaa\xb5\xde\x88\xc9\x48\xa8\xb1\x09\xaf\x4d\x49\x54\x92\x7a\xac\x58\xbe\xe9\x53\xbe\x0d\x8d\x7d\x71\xaa\x11\xd1\x1f\x1a\x87\xb1\x47\x7b\x91\x70\xbd\x73\x5c\xfc\x24\x49\xf0\x51\xb8\x2b\xc5\x9b\x0b\xee\x76\xa1\x72\xe8\xd3\x26\x70\xf5\x1d\xdd\xdb\x80\x4a\xd1\x10\xa5\x65\xe3\x84\xcd\xb7\x6f\xad\x04\xcf\xf6\x78\x93\x09\x1e\x41\xe6\x9c\xfd\xf7\x0e\xa9\x26\xc2\x63\x69\xa5\xb6\x19\x3b\x19\xab\x0a\x62\x55\x8d\xa5\x5f\xfa\xfe\xb8\x78\x97\x57\x71\x06\x44\xaa\x19\xf4\x74\xbe\x4a\xda\x9d\xc1\x84\x9b\x07\xd5\xe1\x7b\x85\xf9\x21\xe1\x01\x6a\x54\xaa\x60\x95\x77\x72\x53\xa7\x34\x26\xfc\x78\x64\xb9\x95\x5f\x04\x90\x70\x23\xdb\x20\x7f\x85\xdd\x21\xa6\x51\x06\xcf\x0d\x62\x23\x85\x87\x0c\x34\xc2\xda\x9a\x11\xe4\x72\x63\x95\x12\x1e\x4a\x67\x61\xfb\x52\x22\x29\xd9\xe5\xcc\x9d\xab\x35\xae\xb8\x7d\x0d\x79\x69\x3c\x00\x6f\xde\x1c\xfa\xf1\x16\x20\x8b\xba\x96\x20\x59\xcf\xc0\xd2\xd6\x37\x0a\xac\x77\x48\x36\x2e\xe6\xa0\xa3\xca\x7b\xf1\x33\xeb\xcf\xa2\x0f\x1c\x4e\xd8\x30\x7f\x80\x0c\xca\x7e\x6c\x4b\xea\xa3\xfb\x2a\xb0\x86\x12\x53\x64\x28\x5c\x44\xed\x1a\x73\x7a\x67\xcb\xf3\xb7\x63\xc9\xf8\xb1\x42\x7e\x89\xdf\xa9\x6d\x29\x0e\x9d\x48\x42\xfe\x63\x16\xaf\xef\x83\x4c\xd8\xcd\x1f\xdc\x1f\x12\x4c\xa3\xfe\x26\x26\x6d\xa6\x2e\x27\x5c\x0b\xf7\xfc\xc8\xe5\xf9\xbb\xa6\xc0\xd3\x8e\x23\xfa\xfa\xb1\xe0\x49\x48\x17\x94\xc1\x4f\x4a\x8c\x53\xbe\x1c\x96\xf7\x69\xc9\xb1\x3e\xac\xa3\x9a\x0e\x49\x36\x6d\x2c\x9f\xfe\x8f\x20\x63\x60\xa9\xd5\x03\xde\xc5\x98\x62\x11\x12\xe3\x77\x67\x13\xe7\xfc\x06\x49\x43\x3e\x25\x7e\x50\x3a\x54\x60\x59\xa9\x89\xda\x89\x15\x7d\x76\x47\x60\x05\xfd\x90\xe4\xb0\x7a\xaf\x0d\xb0\xbc\x0b\xc0\xb6\x7d\xb8\xdc\xba\xdf\xf3\x93\x74\xe1\xaf\xae\x55\x16\x34\xe0\xe3\x28\x31\xad\x0e\x5f\xa7\xd5\x21\x6f\xa7\xc6\x44\xf7\x3e\x1e\x8e\x07\x23\x83\x94\xa4\x16\xc1\x69\xaa\x9d\x53\x03\xf4\x69\xa5\xd4\x07\x43\x08\x72\x1f\xfd\xde\xff\x65\x59\xe5\xad\xf0\xc2\x77\x3b\x3f\x52\x64\xe7\xaa\xa8\xc2\xdb\x88\x8e\x28\xe8\x15\xc7\x10\x69\xc3\xb4\xce\x6c\x29\x03\x4c\x0a\xb3\xb5\xc1\x9a\x80\xa9\xd8\xc2\xe8\x74\x81\x35\x31\xc4\x22\x75\x2a\xd6\x2b\x3c\x5a\x1a\x3d\x6c\x5a\x5d\xb5\x87\x27\x06\x93\xaa\x75\xd5\xf1\x72\xee\xdd\xf4\xeb\x83\x9b\xd7\x93\xaf\xfb\x1c\x79\x6a\x1d\xf0\xe4\x42\xdd\xf9\x9b\x78\x0a\xa4\x1e\xea\x0f\xe6\xf8\x65\xbb\x53\x9c\xa5\x3a\xa4\x5d\xb9\xa8\x56\xcb\x75\xd0\x15\x1d\x35\xed\xea\x80\xf2\x94\x6d"}, -{{0xbd,0x3d,0xe1,0xa1,0xd1,0x64,0xbd,0x6e,0x9b,0xe0,0xa6,0xd1,0x07,0xf7,0x03,0xa6,0xdd,0x91,0x4c,0x86,0x67,0xcd,0x34,0x1d,0x13,0x9f,0x19,0x57,0x8d,0x93,0x3b,0x16,},{0x9b,0x02,0x49,0x64,0xbd,0xfa,0x85,0x2e,0xb2,0xd4,0x14,0x4f,0x35,0xb7,0xcd,0xc2,0x67,0x81,0x14,0x3c,0x2b,0xd7,0xf6,0x60,0x23,0x3f,0x8b,0x8a,0xa3,0x60,0x71,0xee,},{0x13,0xcc,0x15,0x8f,0xd0,0x61,0x79,0x2f,0xce,0xd1,0x56,0x87,0x95,0x98,0x25,0x1d,0xd0,0x1d,0x57,0x5b,0x40,0x0f,0xe3,0xe3,0x9a,0x70,0x08,0x63,0xaa,0xe8,0xdb,0x1f,0x91,0x97,0xfa,0x50,0x1c,0x0c,0xf9,0x93,0xe4,0x4d,0x6a,0xc5,0x51,0x80,0xb8,0x69,0x83,0x8e,0x8a,0xe2,0x4b,0x21,0x4f,0xa3,0x5e,0x24,0x4b,0x7a,0x6c,0xff,0x6d,0x0d,},"\x17\x69\xfc\xdb\xf5\x12\x47\xed\x4c\x83\xa0\x0b\xbb\xf0\x2f\x44\x28\xda\x6f\xce\xdd\xd0\x16\x1a\x02\xfc\xcd\x15\x00\x97\x06\x65\xe1\xc7\x63\x0a\xd2\x2e\x3d\x97\x49\xc7\x92\xe7\x1a\x26\x0c\xff\xf6\x05\x32\x56\xe0\x2f\x5b\x47\xbb\xa1\x4b\x76\x1a\xe5\x3c\xa7\x21\x9e\xd2\x80\x1d\x2d\x78\x8e\x26\x41\x9f\x36\xc8\x1e\xf9\x2c\x23\x03\x68\x37\x35\xc8\xa1\x75\x6a\xda\xb6\xa4\x87\x92\x31\x53\xe4\x35\x60\x3c\x96\xb2\x39\x55\x3e\xdf\xde\xb0\x93\x29\x8f\x7a\xe7\xdc\x90\xf1\x6a\x7e\x56\x64\xb9\xe4\xc0\x2b\xa7\x31\xa2\x3c\xf2\x23\x4e\x25\x0a\xc9\x74\x26\x33\xa9\x32\xa9\x48\xbb\x83\xdc\x3d\x79\x4d\x05\x9f\xed\xf4\xec\x86\x18\xc7\x43\x3c\x5d\x8f\xe5\xe6\x2c\xf0\x7b\x57\x68\xc4\xd9\xb2\x61\xc7\x15\x36\x80\x4f\xe2\xe7\xca\x70\x98\x87\x65\x21\xd5\x76\x77\x36\x14\x24\xe4\x7f\x1b\x95\x92\x37\xf9\x07\x10\x42\x1f\x5b\xc4\xf1\x09\xf7\xd4\x89\xc7\x55\xe9\x4e\xef\xdf\xb3\xc8\x5b\x90\xec\x01\x31\x81\xa2\x3b\xb9\x53\x5f\xee\xa4\x94\x1d\x0a\x06\xa5\x40\xbd\x6b\x58\x8e\x55\xb7\xf3\x57\x57\x14\x9c\xa3\xe6\x40\x96\x5e\x1a\x0f\xf7\xf3\xc8\x25\x92\x59\x95\x7f\xf5\xda\xb9\xfb\x87\x32\xea\xe7\x19\xb6\x24\xa4\x49\x28\x78\x17\x9b\x5a\x83\xab\xe5\x1c\xaf\x02\x08\x3d\x73\x7c\xeb\x4f\xcf\x04\x2f\x2e\x60\xba\x02\x97\xac\x72\xb8\x7f\xe3\xe1\x4b\xa5\xfb\xc5\x4b\x48\x09\x10\x73\x89\x68\x23\xbf\xa2\x89\xce\x8e\x16\x87\x3b\x48\x81\x2c\x32\xbf\xea\x5f\xf6\xbb\x22\x1d\x1e\xa5\x46\x3d\x32\x5b\xbe\x31\x1e\x7f\xd1\xe7\x83\xde\x65\x0b\x79\x52\xea\xe4\x61\xd6\x3b\xc7\x47\x05\x22\xaf\x5b\x77\x89\xf8\xfc\x2e\xb1\x92\xd2\xcf\x77\x6c\x5c\x24\xb4\x4e\x29\xcd\xb0\xcc\xcb\x1d\x90\x36\x14\x38\xe4\x95\x0f\xf3\x4d\xbc\xb3\xcb\x0e\x81\xcc\x45\xf8\xd0\xff\x57\x09\x49\xf7\x80\x84\xe1\x06\x0f\xf5\x59\x4a\xd5\x16\xf5\x0f\x1c\xb0\xa7\x65\xe1\xc0\xe0\x38\xd5\x94\x3b\x93\x6e\x4a\x8b\x49\x33\x54\xe7\x9a\xbc\x91\x7b\xb9\x27\x12\x66\xee\xba\x77\xa9\x3a\x65\x7f\x9a\xd8\x7b\x29\x1a\xc7\xea\x38\x6f\x5d\x4f\xcb\xc5\x82\xe7\x2d\x5c\x23\xd9\x2b\xa9\x44\xb0\x06\x4c\x20\xe3\xe2\xdc\xf5\x04\xbc\xc7\xc6\x96\x6c\x63\xf2\x08\x08\x43\x60\x0b\xa3\x13\xec\x27\xcb\xa9\x5e\x7e\xf3\x18\x16\x8c\x90\x67\xdc\xe8\x6c\x1e\xf0\xd5\xd9\xeb\x7a\x61\x58\x48\x9d\xf3\x2e\xd5\x8b\x69\x31\x03\x08\x18\xf0\x07\x05\xa0\xdc\x55\xd3\xdb\xf8\x00\x6a\x85\x46\x64\x1b\x18\x65\xd9\x19\xbc\x24\x22\x02\xcb\x3a\xe3\x00\xbf\x86\x53\xe3\xb3\x78\x94\xc3\xdc\x0e\x47\x7b\x9d\x7c\x41\xba\xf8\xd3\x88\x7c\x2e\xb5\x9b\x1e\x4d\x50\xbb\xb6\xf1\x79\x2a\x1c\x93\x67\xc6\x5c\xdb\x45\x0c\x2d\xfa\x21\x45\xe6\x11\xa9\x7a\xd8\x1c\xff\x1f\xd8\x3c\x6c\xf7\x23\x09\x47\xea\xff\x4c\x21\xdc\x1b\xaf\xb7\x1e\xc4\x1e\x5b\xc7\x2b\x37\x45\xec\x3e\x38\xbf\x59\x30\xc1\x26\xd0\x60\xf0\xc5\x0a\x89\x5f\x00\x9a\xa1\x8e\x87\xf2\x17\x4f\x58\xab\x53\x79\xa7\x21\xfd\x83\xaa\xd5\x51\x7f\xd9\x9d\xff\x14\x6e\xde\xea\x61\x52\x12\x35\xe2\xf1\xa1\x6e\xe5\x83\x03\xe0\x91\xbe\x8d\x57\x90\x94\xc1\xd8\xa2\x0b\xc7\x4a\x55\x0d\x77\xc0\x0d\x08\x75\x71\x51\x7a\x63\xcd\x41\x26\x93\x3a\x4f\x09\xa0\x70\xbf\x8e\xa4\xff\xb8\x46\xa9\x78\x0e\x97\x34\x04\x3b\xac\x4c\x0f\xf4\x7b\x1a\xfc\xcf\x52\x93\xac\x14\xbc\x73\xeb\xf6\x71\x29\x65\x7e\x4b\x8a\x8b\x33\xdd\xac\x7b\x0f\x4d\x71\x9d\x2d\xc6\x5d\xf6\xea\x0a\x3f\x24\xcf\x44\xc8\x33\x8e\xd6\x01\xa3\x93\x9c\xa3\x58\xfc\x4b\xe1\x3e\x8e\xde\x02\x75\x39\x71\x2c\xa2\x3e\x3f\xfb\xa7\x06\xe8\xfd\xd6\x2a\x07\x4e\xe0\xad\x74\x20\xf7\x80\x60\xcc\x96\xfb\x2a\xbf\x30\xe9\xea\xa2\x41\xc0\xf8\x7e\xbb\xe3\xec\x73\x51\x75\x96\xf7\xc3\xc5\xa8\x0c"}, -{{0xf6,0xae,0x51,0x6a,0x51,0x29,0x6f,0xc5,0x23,0xce,0xa5,0xf0,0x08,0xcf,0xbd,0x09,0xe7,0x3f,0x78,0xb6,0xfd,0xd3,0xb6,0x94,0x26,0x12,0x80,0x41,0xa5,0x60,0x4c,0xf9,},{0x37,0x6c,0x82,0xba,0x7b,0x87,0xaa,0x77,0x41,0x87,0x27,0xdb,0x33,0xd3,0x26,0xae,0x75,0x8b,0xf7,0xa1,0x35,0xc1,0x04,0x60,0xcd,0x8b,0xf8,0xfe,0xb8,0x3c,0x2b,0x10,},{0x0f,0xe4,0xdd,0x7e,0x1f,0x60,0x8e,0xe8,0x2b,0x7f,0xe8,0x63,0xd1,0xb0,0x3a,0x81,0x84,0x3c,0xe2,0x0c,0x76,0x2c,0xd8,0xbb,0x24,0xef,0xd4,0x6b,0xa0,0x25,0xff,0xf3,0x33,0x1d,0x87,0x57,0x52,0xca,0x72,0x20,0xc5,0x3d,0xd3,0xc7,0x1f,0x2b,0xc1,0xe2,0xc6,0x4a,0x2f,0x9c,0x58,0x86,0x5a,0x2a,0x24,0x48,0x09,0xf4,0x13,0x4e,0x53,0x07,},"\x83\x42\xf2\x5a\xc4\xb1\x7e\xba\xd6\xf7\x9b\x9a\x03\x31\x75\xc7\xf2\x8a\xf0\x9e\x65\x8e\x8c\xb9\x8c\x29\x4f\x15\xc3\xc8\x34\x26\x29\xcb\x2a\x32\x47\xdf\xc8\x75\xb8\x2f\x5b\x38\x0c\x5d\x11\x42\x6a\x2e\xeb\x62\x45\x0b\xd8\x85\x65\x01\x07\xc6\x83\x62\xa3\xb7\x2c\xe8\x23\xf2\xd1\x59\x42\xb7\xdd\xa3\x01\xd2\xfb\x63\x8f\x30\x2a\xa9\x57\x0b\x47\x91\x1d\xad\xd3\xbd\xdb\xfe\xd5\x54\xc1\xc8\x0b\xd7\x18\x07\x8b\x8b\xd2\xc9\xc3\x14\xa5\x16\x6f\x26\x5e\x82\x66\xee\x2d\xb3\x57\x56\x1a\x55\x85\xc4\x14\xa7\x84\x0b\xfa\xe6\x09\xd7\xcd\xdd\xe1\xfa\xde\x85\x56\x0f\x23\xd6\x38\xef\x3d\x52\xe5\x1f\x5c\xf3\x13\xa0\x72\xc5\xea\x0f\x81\x7f\x72\x81\xe2\xcb\xa5\xc5\xc8\xd2\x6c\x92\x85\x92\xb8\x1f\x0f\xf8\xcd\x18\xdb\x5a\x2c\x41\xd8\x80\xd7\x44\x73\x86\x3c\x7b\xbd\x00\x56\xfa\x4d\x4a\xfa\xbd\x17\xa3\xb8\x9d\x97\xd3\xfe\x5d\xc0\x6b\x0f\x61\x2a\x1d\x66\x42\x39\x23\xba\x8d\xfb\xb8\xec\x82\x46\x62\x4d\x83\x78\x4e\xba\x4f\x57\x36\xba\x38\x5e\x44\x22\x96\xc8\xcb\x0f\x1b\x68\xe0\x33\x42\xb2\xc6\xc1\x03\x34\x6f\x6d\xd7\x40\xe2\x6c\x3d\x13\xca\xef\x80\x1d\x1b\x26\x21\xd8\x9f\x06\x93\x91\xa0\x78\xd4\x3a\xe6\xff\x12\xee\xca\x66\xbc\x32\x63\x7b\x45\xf0\xac\x62\x7c\x2d\x7b\xbf\x8a\x49\xd9\x46\x81\x75\xe2\x68\x85\xe0\x28\x21\xd3\xa3\xba\xa2\xc3\xe3\xa6\xbb\x96\xb5\x75\x26\xe2\x24\xcf\x3d\x85\x9f\x66\x95\x73\xcb\xd5\xc8\x73\x93\x74\x61\x56\xf3\xd1\xc7\xa8\x03\x08\xdc\x1f\x24\x05\xbf\x0d\x40\xbe\x1c\xa7\x3b\x76\x7d\xed\xf4\x03\x13\x37\xc0\x81\xbf\xa3\xae\x6e\x54\xf6\x02\x3f\x42\xf0\xcb\xd8\x77\x62\xdb\x55\x91\x3c\x70\x72\x06\x03\x40\x10\xdf\x2a\xa8\x75\x3d\x03\x0f\x03\xc2\x67\xe7\x1a\x9d\xd2\xc6\xc1\x9d\xe3\xe1\x85\x1a\xbf\xac\xbb\xd5\xdd\x5b\xf8\x96\xfa\xb8\xe4\x15\x31\x7b\x49\xf1\xe4\x09\x6e\x3d\xa9\x9a\x5b\x5d\x0a\x3c\x42\xda\xf9\xde\x94\x84\x7c\x1e\x53\xc8\x81\x8a\x5b\x84\x33\x23\xf5\x01\xe3\xa7\xfa\x68\xdf\x89\xa5\xf4\x1f\x2c\x62\xc3\x8d\x17\xf2\x50\xb0\x2a\x67\xfa\xe4\x7d\xaf\x06\x3f\x55\x89\x42\x37\x7e\xf8\xa8\x90\x52\xf1\xa2\x15\xd7\x68\xf7\x91\x3a\x7e\xc1\x4e\x98\xb8\x1e\x4b\x2c\xcf\x26\xba\xca\xd6\xf3\x96\x64\xaf\xc0\xe9\x1a\x3c\xad\x69\x1d\xb2\xbf\x56\xa7\xab\x66\x77\xb4\x95\x96\xdb\x88\x7c\x97\xde\xf4\x35\x08\xa7\xa2\xec\x2a\xb7\x55\xec\x36\x8e\x2e\x53\xd1\xe1\x6b\x60\xff\xf0\x9c\x3b\x52\x26\x3f\x0f\x7c\x1e\xa9\xcc\x35\x37\x31\x97\xe9\x5c\x11\xe6\xd2\x2f\xa9\xd8\x29\x9c\x42\x37\x36\xf5\x81\x4f\x1e\x79\x8d\x22\x75\x18\x60\x0d\xf6\xa7\x90\x35\x8d\xea\xe3\x8d\x56\x39\xe1\x98\x3f\xe0\x18\x43\x6e\xa5\x8b\xa8\x46\x75\x48\xc9\x29\xef\xbb\x16\xdf\xea\x41\x02\x25\x3a\x35\x0f\xb8\x4d\x98\x31\xc4\xc2\xcb\xcb\x76\xe1\x8d\x7f\x3e\x95\x36\x41\xad\xa4\x14\x21\x39\x30\x91\xe6\x3d\xfe\x66\xde\x24\xc9\x92\x32\xc7\xd6\xa2\x83\x7a\x48\x98\x3c\xf5\xb1\x63\x31\xce\x00\x05\x0d\x1c\x71\x39\x58\xff\xce\x5f\x2e\x93\x48\xc5\x2f\x53\x12\x05\x79\xa7\xc9\xa1\x60\x08\xd1\x34\x83\x8e\x59\x61\x29\xc7\x02\xfc\xd2\x11\x48\xbd\xf9\x17\x4d\x48\xe2\xda\x0a\x8a\x66\x35\x9e\xde\xe0\x1c\x50\x09\xef\x67\x42\xfe\xc4\x1c\x1a\xce\xcd\x03\xef\xe1\xcc\xc9\xb1\x30\xd6\xe5\xac\x92\x57\x6a\x85\xcc\xb7\xcf\xc7\xd0\xe4\x23\x31\x06\x17\x29\x31\xa0\x86\x99\x79\x0b\xc4\x1a\xcf\xbb\x73\x1a\xdb\xb2\x6d\x56\xb3\x9a\xaa\x5b\x33\x3b\xc1\xa1\x0e\x2c\x70\x64\xca\x86\x11\x9d\x8c\x71\x71\x48\xf9\x24\x41\xaf\x24\xcd\x2a\xa8\xf5\x7c\x86\xba\x38\xa5\x9a\x10\x0b\x92\x76\xdf\x38\x27\xec\x7f\xb4\xd3\xfa\xf5\x8b\xe3\x1c\x6e\xca\xfd\x69\xcf\x1c\x64\x10\xa4\x9c\xd7\x08\x1f\xf6\xe9\xfc\x39\x7c\x2d\x20"}, -{{0x83,0xf7,0x89,0x90,0x0f,0x04,0x0d,0xc6,0x2f,0x4d,0x18,0x78,0x4c,0xb6,0x4b,0x63,0xc8,0x8e,0x8d,0x18,0x00,0x16,0x96,0xbb,0xeb,0x47,0x07,0xc4,0x69,0xd1,0x1a,0x5b,},{0xed,0xfc,0x2b,0xab,0x7e,0x79,0xf4,0x00,0x37,0xfe,0x4d,0x90,0x41,0xde,0x48,0xda,0x9a,0xee,0x8f,0x97,0x80,0x98,0xd7,0xb0,0xae,0x17,0x92,0x90,0x25,0xe4,0x27,0x3d,},{0xea,0x65,0x82,0xcc,0x23,0xe0,0x46,0x09,0x17,0xf7,0x82,0xd9,0x64,0xe3,0xbb,0x6d,0xcd,0xe0,0xae,0xea,0xc4,0x2c,0xc1,0x49,0x19,0xd3,0x6c,0xe7,0x8a,0xa0,0xaf,0xd9,0x80,0x72,0xf5,0x4c,0x79,0x5f,0xbf,0xd7,0xa4,0x1d,0x99,0xd7,0x06,0x06,0xc2,0x8a,0x5d,0xcf,0x19,0xbe,0x38,0xa0,0xce,0x2d,0x09,0xbb,0x8f,0x84,0x4c,0x31,0xbf,0x00,},"\x6c\x11\x2a\x20\xd3\x06\x57\xab\x5f\x8c\x5c\x04\x47\x8d\x6c\x42\xd1\xc6\xbd\xef\x38\xcd\x4f\xe0\x06\xac\x2a\x57\xe2\x90\xff\x29\x28\x78\x96\xee\xa8\xc3\x0a\x01\x39\xc1\x8f\xc8\xc9\x75\x64\x56\x3e\x86\xc8\xd3\x40\x56\xa6\x71\x9b\xfe\x47\x9d\x9e\x87\xe8\x1b\x19\x45\x23\x31\xbf\xa1\x54\x80\x68\x82\xe5\x03\x9a\x20\xc9\xe9\x54\xb1\xfc\x7c\x01\x5d\xcf\x58\x15\xbd\x7c\xf7\xb6\x35\x7d\xf9\x28\x0b\x9b\xd4\x3f\x89\xff\xc9\x19\x45\x32\x3b\x5a\xcb\x2a\xe0\x02\x54\xd4\x16\x28\x68\xd1\xc8\x3e\xc6\xe0\xfc\xbe\x7a\x8a\xb9\x25\x41\x92\x14\x9c\x6b\xc9\xe5\xfe\x35\x06\x94\x16\x5d\x66\x38\x33\x1e\xb2\x4e\x3b\x13\x90\xc6\x98\xc4\x83\x83\x78\xc0\x1b\x2c\x61\xa3\xeb\xe2\xc0\x60\xb9\x8b\xa6\xee\x02\xb5\x19\xb4\xea\xc1\xe0\xbc\xc0\x9b\x23\x24\xcc\xf5\xb1\xa7\xfe\x8f\xd0\xb1\x54\x5a\x94\x27\x83\x2a\xbb\x25\x74\x4e\xeb\x36\x32\x6b\xe6\x4e\xfe\xd3\xa7\xb0\x7d\x63\x0a\x21\xc3\x08\x1b\x55\x26\x1c\x35\x32\x87\xc6\x6c\x57\x66\x3a\x99\xdb\x46\x6a\x5d\xee\x22\x74\x6b\x81\xc7\x50\xef\x85\xbe\x51\x14\x3e\x22\x1e\xcd\xf1\x14\xfe\xf1\xb3\x08\x2f\xf5\x4f\xd0\x44\xbc\x88\x4b\xfb\x3c\xc5\xc5\x33\x59\x97\x00\x98\x67\xce\x94\x91\xa8\x0f\xe6\x96\x82\x5f\x99\x42\x6d\xef\xab\x6a\x49\xba\xdc\xde\x40\x3f\x58\xe8\x31\x79\x66\x21\x07\x47\xb5\x67\x75\x4d\xe5\x30\x76\xb3\xec\xbf\x65\x34\x6c\xb8\x39\x05\x83\x2e\x16\xd0\x1b\x50\xb9\x3d\x37\xeb\x9b\xfe\x20\x17\x2a\x31\x63\x0d\x25\xf3\x21\x7d\x87\xd9\x34\x65\xfd\x8a\xc5\x54\xcb\xbb\x39\xd9\x82\xea\xd7\x21\x93\x91\x23\x4c\x88\x9f\x0b\x92\xa2\xe0\x41\x3d\x86\x6c\xac\x08\x7d\x62\x8c\xe3\x1c\x61\xc6\x32\x3e\xcb\x8e\x68\x95\x55\xaf\x10\xde\x2b\x65\x6e\x6a\xea\x2c\xde\x93\x2e\x24\x1f\x6d\x1f\x8a\x9e\x33\x16\xcf\x13\xf1\x35\xac\xef\x83\xa0\xc0\xcf\x22\xf9\x5c\xa8\x18\xe6\x1f\x92\x76\x87\x74\xc6\x30\xe0\x92\x5b\xe9\x9d\xbd\x32\xb4\x99\xc0\xfe\x7d\x84\xa4\x2e\x39\x32\x87\xf6\xf5\xce\x3d\x0b\x27\x1f\x17\x00\x45\xa6\xd4\x8e\xab\x31\x6f\xe1\x7b\x18\x58\xb1\xff\xee\xe9\x08\x88\xf3\xa3\x7a\x24\x80\xdf\xd0\x4a\x4a\x86\x29\xf8\x68\xb5\xc0\xa8\x0e\xe1\xf0\x37\x19\xf3\xa4\x7d\x40\x95\xbe\xf1\x0e\x02\x34\xfc\x30\x0e\x2a\xf4\x82\x28\x5d\x78\x93\x79\x68\x31\x9d\xa9\x4b\xeb\x6c\x40\xe0\x78\x57\x7c\x02\x4f\x3a\x5c\xda\x00\x84\xe2\xf8\x55\xa9\x39\x6a\xaa\x9e\xe9\xbf\xaf\x2c\xc7\x71\xfe\x68\xc4\x0b\x62\x9e\x8d\xcf\x11\x5e\xf0\x3e\x75\x7a\x2a\xc9\xee\xf0\x73\xf1\xbd\xf9\xc5\xa4\x41\x00\x31\x55\x8a\x6d\x38\x2b\x5f\x16\x02\x4b\x15\x1b\x1c\x01\xee\x78\x17\x41\x3a\x3c\x4d\xe9\xdd\x64\x78\x78\x5b\x81\x10\x1d\xf5\x52\x24\x30\x05\x87\x80\x20\x7e\x79\x0f\x61\x2d\x78\xe5\x70\x5c\xee\xd4\x6b\x0e\xc0\x75\xe7\xc1\xdc\x07\x3b\x17\xb2\xb4\x3d\x72\x53\x59\x27\xbf\xd2\x71\xe9\x2e\x3c\x93\x63\x8e\x40\xa9\x60\x1d\xc2\xc1\xab\x76\xd9\x1a\x41\x03\xdf\x65\x7d\x91\x1c\x82\x9e\xe8\xa5\xf7\x47\xf7\x64\x2f\x5a\x91\x5a\x5f\x40\xf6\x30\xb4\x30\x39\xc7\xd4\xbd\x2a\xd2\xb3\x21\x29\xd9\x4e\x5b\x2f\x03\xad\x4a\x3d\x45\x57\x7e\xb8\x1f\x36\x9c\x9e\x3e\x2a\x4f\x6a\x8e\x41\xac\xf8\x28\x3b\xe5\x84\x25\xea\x99\x3b\x8e\x98\xee\xa6\x33\x05\x56\x64\x86\x18\xda\xd9\x8f\xa2\x55\x62\x0d\x83\x6d\x3c\x7f\x29\xb9\x07\x89\x58\x49\x28\x61\x67\xc7\x18\x1e\x2c\xaf\x55\xc2\xc1\x84\xa9\xa9\x11\xf8\xe4\x1c\xb0\x42\xe2\xcd\x48\xb0\x54\x4e\xa7\x9f\xe2\xef\x38\x1e\xbc\x5b\x15\xe3\x9a\x9b\x5c\x6d\x99\x8f\xae\xaa\xa7\x77\x3c\xfe\xc0\x84\xc0\xbf\xae\xd1\xbc\xab\x96\x3a\x4e\xf3\xd9\x4d\xbb\x3d\xfe\x72\x4c\x04\x0c\xe4\xd1\xe2\xee\x7f\xc2\xda\x4b\x25\x12\x7c\xe3\xa5\xdf\x69\x3f\xcf\x5a\x6e\xd1"}, -{{0x43,0xbf,0xf3,0xcd,0xd5,0x30,0x7e,0xd7,0xd2,0x5c,0xf9,0x6f,0xdb,0xba,0x64,0xab,0x18,0x11,0xc8,0xbb,0x93,0x4e,0x21,0x87,0xea,0x7f,0xfc,0x01,0x8d,0x85,0xe0,0xf2,},{0x00,0xf1,0xb5,0xd3,0xca,0xc6,0xe5,0x6c,0xa5,0xf8,0x94,0xd4,0xcd,0xbf,0x9b,0xeb,0xd9,0x68,0xd2,0x4d,0x5e,0xff,0xa5,0x05,0x8b,0x0e,0x20,0xbb,0x08,0x98,0xf6,0xf1,},{0xa6,0xb5,0x6b,0x76,0x86,0xdf,0x1d,0xc5,0xf4,0xed,0x54,0x4a,0x4d,0x97,0xe6,0x70,0x36,0x19,0x5a,0x32,0xb2,0x2e,0xcd,0x5d,0x31,0xea,0x17,0x30,0xe6,0xed,0x8f,0x81,0x0d,0x25,0x8b,0x44,0xc0,0x8e,0xa4,0x5f,0x03,0x2b,0x93,0x74,0x41,0xb7,0x2c,0xd0,0xdc,0x37,0x55,0x6f,0xd7,0x87,0x4e,0x9f,0xe6,0x4f,0x15,0x76,0x5c,0x52,0x10,0x03,},"\x64\x6f\x8b\x34\x18\x2d\x5e\x60\x2b\x51\xca\x73\x29\x34\x7c\x0e\x19\x8c\xb7\x47\xe4\xda\x0a\x6b\x80\xf3\xf6\xf9\xf3\x36\xf6\x70\x8d\x85\xcb\x42\x9a\xb2\xd6\xbe\xd3\x5d\x50\x13\x12\x9c\xd1\x00\x14\x2c\xdd\xce\xe8\x63\x51\x79\x02\x1b\x3e\x24\x92\x2b\x81\xae\xf1\x3c\x13\x70\x28\x69\x39\xd6\x3d\x6b\x6a\x41\x95\xed\xa1\xd8\x12\xca\x51\x82\x04\x76\x8f\x87\x34\x8c\x68\x89\x55\x2c\x63\xd1\x37\x2c\xde\x6a\x5e\x9d\xaa\x7f\x84\x45\xec\x8d\x61\x30\xa3\xf5\xae\xf0\xed\xea\xce\x01\x0b\x6c\x7f\x0b\x9d\x24\x16\x2a\x8d\x04\x45\x4b\x81\xd4\x8e\xa9\x09\x7b\xd8\xdf\x09\x34\x59\x71\x9c\xcb\x54\xaa\x10\xf5\x1c\x24\x6a\xa9\x9c\x58\x0b\xea\xf9\xc9\xc5\xbc\x60\xfa\xf0\xae\x5c\xec\x7f\x51\x37\xf6\xc5\xc1\x44\xdf\x45\xd1\x2e\xe9\x95\xad\xcc\xf2\x5a\x9d\xb8\x1b\x85\x58\xbd\xfb\x65\x83\x01\x86\xe7\xb9\xd4\xee\xd9\xf6\xb4\xd7\x32\xb1\xb5\x82\x2d\x03\xeb\x01\x7c\x07\x24\xf4\x8f\x87\xba\xaa\xe1\x04\x5d\x6f\xdb\x12\x5c\x91\x34\x06\x4f\xaf\x18\xdb\xed\x58\xd8\xfb\xac\xea\xcd\x4f\x09\x7d\xf9\xb3\x42\xe5\xc4\xa5\xbc\x85\xb2\x95\x97\xd4\xb6\x40\xf1\x55\x1c\x5b\x62\x4a\xb2\x1b\x48\xe9\x4a\x90\x30\x04\x9b\xe1\xf0\x5a\xa8\x51\xd0\x82\x7e\xaf\x87\x00\xdf\xe1\x47\xfd\xcd\xee\xdb\xc9\x8c\x4f\x15\x77\x4f\x01\x20\xfb\x59\x70\xa2\xf8\xb2\x17\x94\x34\x0b\x62\x83\x79\xa8\x02\xb9\xf7\xc0\x68\xb0\xdf\x63\x19\x3e\x51\x0f\xc7\xb2\xaf\x97\xee\x38\xde\x47\x92\x97\x85\x53\x55\x28\xd3\x50\xd8\x86\x20\x61\x0c\xfd\xb5\x5d\x24\x9e\x38\xfb\x73\xc8\x28\x71\x13\x91\x9c\xe3\x32\x67\xd7\xdb\x92\x4e\x49\x19\xa4\x4e\x6e\x29\xa9\x0d\xbe\x3b\x7b\x0d\x39\x21\x16\x3f\xeb\x5a\xc1\x05\x62\x4e\xd8\x52\xbe\xce\x35\x38\xe9\x91\x93\x30\x0c\x89\x33\x45\x69\x93\x50\xa8\xf9\x9e\x8c\x6a\x41\x09\x5f\xc9\xfc\x08\xda\x07\xf7\x57\x11\xf7\xdf\x03\x44\x06\xde\x14\xed\xd8\xe2\x2a\x63\x3a\x86\xe4\xa5\xa5\xc9\x75\xac\x5d\x34\x89\x1c\xcc\xfc\x85\x43\x77\x1f\xfa\x08\x0e\x0b\x45\xd6\x5a\xb8\x30\xa3\x61\xac\x4c\x42\x62\x94\xd3\x68\x5e\xa8\xc2\x60\x39\xc7\x1c\x90\xfc\x3f\xb5\x12\xbe\x9f\xc9\x48\x07\xd7\x6d\xbd\xaf\x8f\xfa\xa4\xfb\xf9\x84\x9d\x68\xe8\xa5\x7d\x30\xc4\xa0\xb9\x73\x5c\x23\xf0\x8e\xf2\xe2\x84\x45\x84\x67\xe1\x5d\x66\x53\x62\xcb\x64\x6f\xde\x69\x37\xec\xba\x53\x09\x12\x64\x63\x83\x57\xa7\x22\x42\x5b\xc6\x2d\x1e\x30\xec\x5f\x0d\xd8\xfe\xa2\x6b\x2e\xa4\xa8\x49\x00\x35\xde\x43\xf2\x74\x84\x6f\xb0\xcf\x02\x09\xec\x74\x37\xf3\xc3\xd0\xa5\x60\x37\x3d\x03\x4e\x5f\xd7\x9e\x25\xb6\x42\x4d\x9b\x2c\x17\x61\x63\x2b\x35\xa1\x21\x32\x52\x18\x27\x34\x5c\x55\xe4\xe7\x14\x2d\xd6\xfe\x94\xd6\x20\xfe\x51\x5c\x15\x3e\x83\x95\xb5\xd1\x30\xc7\x44\x13\x9b\x6a\x92\xef\xd3\x7f\x22\xba\x13\xfe\x4c\x09\x53\x73\x55\x0e\x2e\x4f\xcb\xa0\x32\x5b\x3e\xa3\xb9\xfe\x25\xcc\x7d\xd9\x2c\xbf\x42\xe1\x5f\x45\x54\xb7\x7a\xc2\x7a\x4a\x34\x63\x82\xff\x61\x00\x45\x15\x08\xd6\x02\xcf\x64\x3f\x60\xb6\xca\x42\x86\x35\x6f\x21\xa3\x11\x0d\x4e\x2c\x8a\x89\x62\xa7\x80\xfc\xff\x43\x9b\x3a\xa8\x04\x99\xdf\x27\x0f\xc3\xe6\xca\xd8\x89\x33\x48\x87\x2f\x0f\x70\x2f\x93\x90\x00\x0c\x7f\x6e\x06\x27\xd2\xbb\xb7\xb7\xce\xf5\xc4\xda\x25\xda\xdf\xea\x80\x32\xe5\x02\x32\x97\xa7\x0a\x65\x8e\x9a\xe7\x3b\xdd\xc3\xb2\x27\xa1\xc1\x17\x41\x13\x3f\x01\x2f\x0f\x48\xfe\x26\x44\x6f\xa6\x7e\x64\x72\x0f\xc8\xdc\x97\xf3\x0d\x0d\xd0\x26\xf6\xdc\x21\x64\xea\xd8\x57\x82\x4a\x0a\x7a\xeb\x20\xf1\x15\xd5\x0d\x1b\x65\xdd\x5d\x82\xe0\x9a\xbe\x83\x4e\x8c\xa8\x89\x57\xe3\x99\x84\x82\x49\x55\xa1\xa1\x3e\x3b\x94\xa0\x01\x57\x18\x6d\xcd\xc2\x89\xe3\x4b\x67\x8c\x91\xcb\x2a\x1a"}, -{{0x06,0x3b,0x90,0x25,0xe3,0x21,0xe9,0x72,0xd6,0x53,0xa0,0x62,0xbe,0x34,0xf9,0x93,0x65,0xaf,0xfd,0xcc,0x98,0xec,0x9f,0xf4,0x3e,0xf4,0x22,0xbe,0x0f,0x80,0x44,0x60,},{0x10,0xd0,0x1a,0x63,0x01,0x2a,0xc0,0x99,0x56,0xba,0x9e,0xd6,0x1d,0xf3,0x5b,0xb7,0xaf,0xe3,0x65,0x8b,0xb3,0x00,0x48,0x52,0xe4,0x71,0x74,0xbd,0x07,0xdd,0x4d,0xe7,},{0x85,0xc8,0x1d,0x6b,0x0d,0x85,0x78,0xfa,0x58,0xe1,0x3a,0xb3,0x91,0x00,0x15,0x28,0xb4,0x6a,0x1d,0x63,0xa0,0x32,0x7c,0x7a,0x4a,0x04,0x08,0x7f,0xc6,0x68,0x75,0x8a,0xa6,0x5c,0x01,0xd5,0xa1,0x50,0xf9,0x35,0x67,0x4e,0xf3,0x07,0x50,0x7e,0x6f,0x4c,0x91,0xe1,0xfc,0x35,0x00,0xb2,0x6f,0x64,0x9b,0xee,0xa8,0x7d,0x27,0x56,0x37,0x04,},"\xa7\xee\xd2\x96\x52\x84\x4e\xe0\x04\x9b\xaf\xb2\xcf\x63\x40\x29\x71\x02\x0d\x7e\x65\xc1\x0b\x91\xac\x57\x26\xee\xa8\x6f\x40\xdb\xc5\x3c\x3f\x0a\xbe\xde\xba\xf6\xcc\x44\x9b\x4f\xea\x48\xc0\x15\xfe\x4d\x90\x7b\x3e\x55\x05\xcf\xf5\x0a\x12\x18\x19\xa2\xe4\xa8\xa2\x96\xd5\x75\x10\x15\xbb\xcd\x7e\xf6\xfb\x7c\x27\x27\xbb\x00\x0b\xe1\x34\x2a\x7d\x14\xbc\xa9\x79\x04\xed\xfe\x8b\x18\xdd\xb6\x39\x33\x41\x83\x27\xa5\xaf\x81\x7e\x95\xba\xd7\x4e\xb7\x90\x20\x36\x15\xd0\x82\xe7\x14\x93\xea\xd4\x7c\xcc\x09\x01\xa2\xca\x9f\x50\x13\x3c\x44\xef\x85\x08\xd5\x1f\xb7\x3c\x61\x6f\x01\x47\x53\x22\x45\x82\x2d\xd1\x02\xb3\x37\xa1\xb2\xaa\xe2\xef\xc7\x2d\xca\x7a\x94\x19\xd5\x98\xa6\x47\x52\x33\xdc\x1a\x4e\xe0\xec\x6d\x05\xda\x12\xa2\xb2\x87\xcb\x77\xff\xaf\xdd\xe2\xd0\xac\xc2\x81\x99\x93\x3e\x66\x21\xee\xc1\x6a\xb4\x24\x51\x70\xcf\x02\xda\x80\xd4\x92\x26\x31\xa2\x32\x72\x91\x51\x65\xad\x88\x72\x27\x50\x03\x5d\x2a\x09\x77\xbc\x79\x1d\x14\xfb\x3d\x8c\xb0\x2b\xc7\x7f\x7c\x71\xbe\x52\x42\x62\x9a\x4c\x9a\x58\x8d\xfd\xde\x95\x78\x49\x4d\x8b\xaa\x4e\x68\xf5\x19\x4b\x80\x02\xc8\xe3\x78\xa0\xe8\x33\xb7\xc1\xa9\x69\x81\xc4\xfb\x05\xe4\x57\xff\x48\x26\x0b\x72\x49\x3c\xbc\xb8\x2a\xe1\x16\x73\xd1\x4c\xee\x85\x28\x8f\x63\x70\xbd\x4b\xca\x92\x51\xa7\xe2\x14\xc3\xeb\x79\xe7\xbb\x6f\xce\xbb\x16\xc9\xe0\x56\xf2\x9b\x62\x72\x74\x3e\xfa\x6f\xe8\xbf\xd2\x55\x97\xce\x86\x89\x8a\xb3\x05\x9e\xb0\x23\x1c\x73\xb5\x30\x59\x03\xfd\x13\x19\xbd\xf4\x9e\x59\x9d\x8b\xbc\xd7\x4a\x8b\x97\x67\x30\x8b\x61\x56\x3c\xcb\xac\xd3\x8f\xc5\x0c\x83\xab\x44\xca\x75\x9d\xc9\xb6\x5b\x2a\x4b\x54\x7c\x50\x97\xf2\x20\xc1\xc8\x8b\x2b\x0a\x48\xf6\x5f\x91\xfe\x78\xb1\x50\x12\x78\xe1\xe3\x04\xde\x58\xb4\xc8\x2a\x5c\x39\x99\x81\x09\x8a\x17\x84\xeb\x90\x42\x50\x18\x59\xf2\xa9\x3f\x31\x7e\x41\x77\x2f\xd5\x2f\x97\x2e\x51\xb0\x7e\xd9\x4d\x31\x4e\x1d\x1a\xf4\xed\x82\x90\x9a\x0b\xef\x67\x1f\x54\xb5\x5d\xb7\xb7\x0d\xa1\xf7\x18\xc8\xe6\x48\xae\xdd\x6d\xa6\x4b\x05\x77\x05\x26\xf1\x2b\xc4\x3f\x68\xb9\x55\x48\xda\xc5\x08\x09\xa6\x87\xdb\x97\xd7\x3f\x06\xf4\x7e\xd0\x88\x31\xb6\x0a\x28\xe9\x82\x92\x06\x32\x05\x8f\x0e\x6c\x90\xc0\x18\x7f\xf4\x45\x64\xf8\x1e\xfd\x8f\xd9\x3e\x32\x7b\xc6\xd8\x0b\x49\x0e\x08\x8b\x9a\x10\x03\x6c\x80\xdc\xda\xd4\x9d\x2b\xe0\x74\xfb\xba\x31\xe0\x6f\x71\x80\xe5\xad\x1c\x88\x23\xd6\x09\x66\xa9\xce\x15\x50\x3c\xe6\x0d\xd4\x0e\x91\xee\xf2\x35\x9d\x83\xd7\x0d\x98\x40\x1d\xde\x7b\xe3\xc6\xb0\x7e\x57\xd4\xe4\x7d\x04\x21\x76\x33\xd8\xe2\x63\xca\x34\x8f\x81\xfb\xe9\xa4\xa6\x2f\x45\xd7\x7c\x84\x3b\x6b\x1a\xd2\x84\x66\xd9\xda\xfb\x1b\x91\x0b\x34\x8e\xd8\x7c\x68\x6c\xab\x29\x2d\x48\x0c\x19\x1d\x18\x7b\x40\x4a\x9b\x1d\x13\x2b\xa4\xe2\x93\xd3\xad\xa9\x91\x72\xac\xc1\x21\xfe\x66\xb8\x45\xb9\x8b\x16\x0c\x58\x23\xf6\x01\xc7\x75\x8f\xb2\x6c\xae\xe8\x57\x01\x59\x5b\x2d\x52\xca\xa2\xf5\x68\x8a\xa2\xbf\x2f\x6c\x4b\xb6\x37\xf8\xe0\x0f\x49\xab\x6c\x26\xbc\x6a\xd8\x9e\x13\x67\xfd\x28\xe4\x91\x7d\x25\x08\x93\xa7\xb3\x2d\x39\x66\x0b\xde\x8d\xb4\x9f\x08\x6f\xb7\x39\xe5\x60\x12\xc3\x6b\xea\x0b\x26\xcf\x6d\x93\x57\x94\x0b\x00\xd5\xa4\x52\x8f\x90\x59\xaa\xf0\x86\x69\xe5\xf4\x6c\x99\x5e\x60\xf8\x87\xb5\xc4\xab\x88\xac\x74\x42\xed\x01\xa1\x4c\x6a\x42\x00\x6b\xaf\x1f\x34\x3f\xef\xe3\xe4\xac\xa8\x43\xa3\x24\xe1\x76\xb2\xfe\x7e\xc7\x88\x3d\x1c\xbd\x06\x8b\xc2\xfc\x96\x2f\xfa\x60\x24\x4f\x65\x4c\x77\xac\x56\x50\x81\x7d\xc0\x84\x46\x55\x45\xa9\x23\x0a\x74\x82\x6b\x0c\x50\xeb\x85\x25\x2a\x88\x6f\xf2\xb1\xaf\xea\xf8"}, -{{0x88,0x3c,0xc1,0x38,0x17,0x57,0xb0,0xfe,0x04,0x55,0xb7,0x7b,0xc9,0xcd,0x0d,0xd4,0x64,0xd2,0xb4,0xbf,0x0c,0x7a,0x3c,0x0c,0x2d,0xc7,0x75,0xfb,0x78,0xaa,0x37,0x32,},{0x83,0xa8,0xb6,0x69,0xcc,0xd0,0x12,0x45,0xce,0x3b,0x81,0x8d,0xcb,0x1b,0x58,0x8f,0x86,0x53,0x58,0x50,0xe6,0xc7,0x10,0xc7,0x92,0x17,0xfe,0x43,0x98,0x24,0xf3,0xfa,},{0xc7,0xcf,0xd5,0xc9,0xfe,0x93,0x0d,0x15,0xa1,0x1e,0xbb,0x34,0xe3,0x43,0x1f,0x48,0x9d,0xa0,0x10,0xeb,0x19,0x3e,0xdb,0xfa,0x6f,0x23,0xd5,0xd1,0x4d,0xd8,0xfe,0xab,0xd7,0x88,0x0d,0x2d,0x5a,0x56,0x00,0xd3,0x85,0x46,0xce,0x3b,0xc6,0x4a,0x86,0x29,0x1a,0x1c,0xe3,0x1f,0x27,0x2f,0xf0,0x20,0xdf,0x8c,0xb6,0xa0,0xfd,0x4d,0x3a,0x0d,},"\xff\xec\x29\x3d\x12\xea\x63\x6c\xa4\xc4\xa0\xa5\xe2\xdb\x15\x34\x26\x39\xc4\x76\x67\x4d\x2e\xbd\xab\x4a\xef\xd4\x04\x6b\x5d\xdb\x56\xae\xb2\x10\xc1\x19\xaf\xdf\xb8\xa8\x91\x28\xa3\x4f\x6d\x77\xf2\x61\xed\xea\x07\x72\xa2\xf8\xdb\x14\x0a\x26\x40\xfd\x8e\xca\xdb\x0b\x47\x92\x16\x9b\x6b\x28\x10\xae\xe2\xc5\xcd\x83\x52\x88\xbf\xf4\x93\xbc\xeb\xee\xea\x28\xa7\xa2\x48\xc3\x61\x16\x54\x0f\xa7\x17\x36\xd6\x6b\x0a\x47\x5b\x5f\xa9\x2c\x0d\x46\x00\x2f\xca\x7a\x1e\x69\xd1\xb5\x9e\x81\xa3\xa6\xd4\xf3\x39\x76\x9d\xae\xb2\x0b\x5f\x9d\x75\xc4\xc2\x8f\x69\x21\x32\xd2\x8d\x3c\x56\x4c\x09\xfe\x3d\xcc\xa0\x35\x9c\x3c\x63\xec\x37\x7a\x33\xf9\xee\x87\x4d\x8a\x78\x9d\x77\xc9\x6a\xc0\x5f\xdf\x3a\xb3\x8b\x2c\x82\x74\xa9\x02\xef\x8b\xb7\xf4\x67\xfc\x7e\x07\x3c\x77\xb1\xdb\x5f\xc8\xef\x96\x6c\x12\x0c\x4d\xae\x3f\xb7\xf5\xb7\x4a\xbb\x99\x01\x66\xc8\x12\xa5\x25\xd1\x23\xf7\x6e\xd5\x12\x12\x50\x80\xa1\x53\x4f\x3d\x8b\xdc\xcc\x54\x1f\xc9\x75\x90\x28\x75\x46\x09\x6f\xc8\x80\xbf\xcf\xdd\x00\xe6\x5c\x0e\xbf\x4a\x09\xfd\x64\x76\xce\x1b\x7c\x8f\xaa\xa5\xa1\xcc\x27\x86\x71\x9a\x30\xd8\x25\x58\x11\x18\x47\x52\xa8\x8b\x08\xac\x9f\x0f\xf1\xd6\x26\x2f\x25\x86\x94\x0a\xfe\x1f\xe4\x5e\x0b\x56\x34\x48\xa5\x5f\x30\x30\xe4\xc3\x9c\x1f\x3f\x86\xa7\x33\x67\x03\x80\xea\xb0\x88\xe3\x93\xde\x09\xd1\xf5\x08\xd2\xfb\xca\xfc\x64\x9a\xea\xe6\xb8\xc3\x0e\x32\x9e\xc3\xfd\x28\x29\xbe\x6d\xb0\xab\x8e\x63\x7e\xa1\x09\x5b\xdc\x3d\xf3\xac\xc2\x3d\x3c\xf7\x05\xa9\x54\x2c\x19\xe5\x90\x92\xec\x41\x3a\x4e\x2b\xd5\xde\xd2\x8c\xd3\x4d\xdb\x3d\x32\x94\x9a\xa4\x87\xf1\xc3\x37\xd6\x97\x9c\xf5\x12\x62\x2d\xbf\xb7\xda\x1c\xbb\x1c\x7e\x5a\xbe\xea\x70\x09\xe2\x94\x3f\xfb\xa2\x25\x2e\x1d\x86\xec\xa9\xd6\xd5\xc2\x46\xcd\x2e\x13\x4a\x3e\x5d\xad\x37\xef\xef\x71\xce\x39\x7a\xda\xfb\xd9\xe7\x2b\x3f\x9a\x86\xff\x0f\x5d\x81\x2c\x46\x22\x5b\xeb\xd0\x70\x3b\xc5\xcc\xe9\xc6\x45\x82\x00\x8f\x7e\x55\x8c\x40\xa3\xb3\x52\x20\x96\xd1\xaa\x2b\x61\xbc\x90\xcd\x88\xc6\x28\x5d\x94\x20\x87\xd8\xa4\x66\x5a\x0e\x64\xd3\x57\x2f\x74\x68\x9b\x4f\x24\xef\x40\x0d\x74\x1b\x57\x14\x06\x13\x47\x14\x44\xde\xcc\x65\x4a\xf0\xff\xb2\xed\xfd\xf9\xfd\xd0\x75\x09\x81\x90\xb3\x4c\xde\x28\xdd\x16\x68\x72\xc6\x08\x65\x67\xa6\x87\x61\xce\xf2\x5d\xa4\x0b\xd4\xc3\xd3\x4f\xdd\xd7\x2e\xe5\x65\xb0\xb9\x37\x67\x8e\xe8\x43\x49\xd1\x16\x0f\x5f\x07\x05\xf8\x95\xd0\xf1\x41\xce\x8f\x51\xa1\xe4\xfd\x2d\xc4\x70\x4b\x52\x7a\x40\x25\xa9\x39\xcb\x2b\xb7\x88\x57\xeb\x18\xd7\x88\x72\xed\xc9\xee\x70\xe6\x0b\x2a\x42\x70\x0a\x19\x8f\x4f\xff\x6c\x31\x92\x51\x68\xbe\x07\x7d\xc2\x3c\x32\x2a\xbb\xca\x97\x36\x1f\xec\xaa\x3f\xcb\x19\x6e\x65\x6c\x12\x8f\x39\x82\xfe\x11\xe5\x51\xa4\xa0\x88\x5d\xa6\x0d\x39\x7d\x0e\x40\xd0\xd8\x97\x26\x2f\x1b\x4b\x67\x2f\x78\xa2\xd2\xad\xfc\xdd\x6e\x15\x25\xc2\x6e\x71\x95\xfb\x9a\xc6\x06\xbb\x1b\xa4\xa9\x89\x08\x03\xb4\xbd\x84\x34\x6a\xe8\xd8\xc7\x19\x6c\x90\xae\xcc\xb2\x96\xa4\xc3\xeb\x4e\xfa\xcb\xfc\xb6\x2e\x38\x3b\x8a\x49\x4a\xc7\x23\x56\x2d\x0d\x8c\x37\x91\x87\xa9\x2e\x3b\xda\x6b\x15\x69\x47\x6a\xed\x21\xae\xd7\xa0\x56\xb4\xa5\x82\x67\x44\x01\x7c\xc0\x06\x0b\x4d\x55\xfa\x87\x72\xb5\xb1\xc1\x5f\x57\x48\xad\x72\x98\x00\x5a\xec\xbc\xbd\x90\xa3\xe5\xc6\x15\x9a\x86\x74\xab\xbb\xa3\x79\x14\x41\x50\x02\xb5\xa6\xef\x5d\xf3\xc6\x49\x42\x6e\xa1\x27\x5a\x01\xd8\x0a\xdf\x49\x0a\xc5\x46\x06\x2d\x93\x99\x9a\x6d\xcc\xac\xb9\x6a\x09\x04\xad\x33\xd9\x05\x76\xdc\x6a\x21\xb6\x72\xe8\xff\xb0\x66\x13\xfb\x3f\x14\xe6\xcb\xdd\xe8\x8c\x24\x37\xc9"}, -{{0x5e,0x40,0xa7,0xaa,0xbb,0xb0,0x83,0x0a,0x9a,0xb0,0xfd,0x79,0x69,0x0e,0xe0,0x43,0x39,0x01,0xc6,0xcb,0x06,0x76,0xab,0xe4,0xbb,0xa0,0x6f,0x5b,0xbe,0x58,0xfa,0xc2,},{0x4d,0x4f,0x28,0xfe,0x09,0xc4,0xaa,0xbf,0xca,0x01,0xef,0x6e,0xe7,0xfd,0x63,0x72,0xfb,0x62,0xdb,0x61,0xaa,0xee,0x82,0x7c,0x43,0xfd,0x1a,0x6d,0x1c,0x25,0x90,0x32,},{0x59,0x76,0x72,0xab,0x8d,0x3a,0x60,0xde,0x54,0x56,0xfc,0xc9,0xc3,0x82,0x53,0xf5,0xf3,0x7b,0x80,0xe7,0x4a,0x00,0x7c,0x9f,0x6d,0xb9,0x09,0xd2,0x7d,0x0e,0xad,0x16,0x27,0x89,0x24,0x49,0x94,0xf3,0x5b,0x80,0xd6,0x1b,0xe1,0x99,0xc4,0x17,0xc7,0xea,0x90,0x1b,0x98,0xcc,0x63,0xfe,0x3c,0x50,0xfc,0x3c,0x63,0x38,0x49,0x0f,0xa2,0x06,},"\xfd\x4e\xc8\xb3\x4f\xc6\xb7\x43\x81\x3f\x59\xe2\xfd\x1f\xef\xa8\x70\xf5\xa9\x70\xe2\xeb\x75\x16\xef\x7c\x30\x6f\x4b\x82\x3f\xfe\xe9\x2d\x60\x1f\x76\x5d\x79\xca\x14\x6a\xba\x8b\xc6\xe7\x98\x44\x55\x99\x35\xcd\xdc\x24\x26\x49\xc0\x59\xec\xf2\xdb\x84\xfd\xc2\x19\x36\x66\x88\xa8\x8f\xc2\x5b\x85\x1c\x36\x61\xe5\x19\x88\xc2\xbf\x73\xbb\x8e\x3d\xc1\x6d\x22\x41\x5a\xb1\xa7\xb3\x55\x79\xda\xac\x73\x25\xe3\x19\x15\x7d\x7d\xa5\xfe\xe8\x7c\x93\xa4\xdf\xcb\xaf\xc9\x2f\xba\x7e\x17\xcc\x68\xe3\x90\x37\x33\xc6\xc8\x01\x57\x2d\x90\x73\x20\xb2\xfe\xb5\x17\x10\xe8\x56\xa1\xf7\x6f\x85\xa7\xee\x1a\x11\xe6\x2d\x2e\x45\xa3\x52\x93\x8d\xd8\xcf\xc2\xbc\xcb\x90\x2d\xea\x44\x4f\xaa\xae\x6d\x84\xc5\xf3\x91\xe1\x0a\xef\x76\x92\x8a\x45\x15\x3d\xb6\xcd\x25\xa2\xbf\x35\x3d\x80\xd9\x7b\xf4\xb3\x80\x86\x05\xe8\x98\x00\xd2\x98\x40\xea\x60\x97\x8d\x9e\xc9\xb2\xc3\x02\x74\x98\x88\xf9\xde\xbc\x84\xdd\x1e\x2a\x79\xaa\x0b\x6b\xa0\x2a\x03\x91\x93\x08\x1b\xdb\xff\x05\x99\xa1\x4d\x91\x8c\x0c\x8d\xea\xc4\xf6\x0b\x6e\x99\x47\x4a\xb5\x30\x11\x74\x10\x34\xfe\x2a\x20\xcf\xf4\xe0\xf0\x23\x42\x4c\x8e\x57\x97\x76\x8a\xd5\x3d\xf6\xd0\x1a\x24\x01\x1f\xa9\x0f\x0b\xb1\xd5\x06\x9c\xdb\x36\xb4\x50\xf4\x33\x11\x0c\x2c\x56\xf3\x4a\x1d\xe4\x26\x09\x14\xcd\x46\x96\xb1\x4a\x09\xc0\x26\x8b\x2a\xe2\xe9\x8e\x6b\x4e\x99\x2b\x91\x25\xf8\x78\xf1\xac\x09\x82\x31\x70\x62\x83\x88\xf0\xf6\xe2\x56\x25\x9c\xa7\x86\xbb\xe1\x44\x88\x4c\xb2\x98\xcc\x04\x3d\x02\xf5\xc3\xdc\x68\x4f\x78\x7f\xaf\x16\xc1\x0f\xdd\x84\x37\xa8\xc3\x09\x74\x63\xbd\xb9\x9b\x78\x03\x0f\x94\x74\xfc\x5c\x99\x51\xdc\x75\x26\x49\x05\x86\xfe\x1c\x2d\xb0\x54\x11\x34\x14\x60\x23\x9d\x5e\x8b\xc5\x30\x65\x90\x2b\x95\xfb\xa2\x82\xc2\x76\x65\xe8\x69\xa1\x9d\xae\x84\x60\x6d\x17\x26\x67\x51\x55\xd3\x80\x39\xb9\xe5\x5d\xb4\xd5\xce\xec\x95\xcd\x6d\x87\xf8\x5e\x99\xdd\xe5\x4a\x04\x76\x1e\x6e\xad\xa6\x61\x9d\xa8\x95\xb6\x54\xfe\x38\x45\xe8\xa6\x0f\x3a\x3b\x32\x48\x3d\x6d\x27\x97\x8a\xf5\x45\x02\xb2\x20\xe4\x78\xdb\x78\xcf\xf7\x7a\x9c\x97\xfb\x79\xfb\x5a\xcf\x56\x28\x9f\x38\x1a\xcb\x10\xde\x64\xc3\xf2\x38\x42\xb1\x2b\xf5\xf1\xb2\x83\xbd\x25\xd4\x8d\x09\x12\x8f\xb5\x5d\xda\xe2\x55\xbe\xb7\xc6\x6a\x74\xcf\x6f\x06\x95\xa4\xf8\x28\xcb\x29\xe4\xaf\xdb\xb3\xb4\x2a\x23\x5d\x4f\xdb\x66\xb9\x63\xac\x8f\x68\xe8\x2b\x00\xa1\xc4\x50\x08\x63\x29\x62\x47\x17\x8c\xfd\xef\x80\x3b\xb7\xb1\x14\xf0\xc0\x32\x76\xf6\x71\x66\x9a\x08\x7d\x92\x28\xa3\x7a\xe7\xb9\x9b\x06\x15\x49\xc1\xcf\x8e\xc1\x72\x46\xea\x1e\xe0\x3d\xbc\x88\xbf\x42\x64\x16\xd5\x86\x57\x2f\xf1\x0a\x31\x45\x60\x6f\x27\x84\xe4\x35\x7b\xe4\xed\xee\xc6\xc3\xa7\xbf\x11\xbb\x5b\x0e\x90\xcf\x50\xed\xaf\x89\x1e\x51\xd2\x63\x57\xbf\xc8\x53\xce\x23\xb2\x99\x15\x5c\x82\xc1\x03\x1d\xfa\x64\x07\x4d\x72\xa0\x9d\x29\x72\x0e\xad\x6e\xbb\xbf\x75\xd5\x73\x8e\x32\xcd\xa6\xb6\x46\x6a\x8d\xef\x6b\x50\xa1\xed\x9b\x86\x5a\x9a\x88\xa0\x80\x18\xac\xb5\x01\xa4\xde\x9d\xb5\x4d\x05\x22\xce\x9c\xec\x7a\x06\xbd\x9a\x5f\x86\xb0\xb4\x6c\x07\xbf\x3e\x7f\x5a\x42\x6f\xf6\xb4\xbb\xe1\xe0\x03\x13\xa5\xac\x27\x19\xa9\x59\xed\x44\xee\x0a\x44\xbd\x97\xda\x6d\xb2\xcb\x97\x1b\xd6\x83\x34\x90\x89\x49\xed\x85\x0f\xbf\x73\xd0\xe0\x20\x49\xda\x18\x1c\xce\x9c\x2d\x9c\xa1\xb6\x24\xc8\xd8\x7c\xf9\x04\xeb\x82\x1d\xc7\x95\x92\x95\xda\x57\x77\x92\x06\x60\xb4\x3c\xcc\x25\xcd\x38\x9f\x15\x7f\x67\xfa\x03\x90\xfe\xac\x97\xa7\x52\xc1\xac\x20\x4c\x21\xdf\x56\xbb\x0f\x4f\xc0\x16\x41\xb4\x80\xaf\x2b\x89\xb5\xd1\x6d\x4a\x0b\xcb\x0a\x50\xb8\x2b\x0e\x04\x84"}, -{{0x3a,0x34,0x13,0x6a,0x97,0x34,0x80,0xd9,0x70,0x06,0xdc,0x27,0x93,0x58,0xe6,0x60,0x62,0x93,0xd8,0xcb,0xc1,0xa4,0x4e,0xe5,0x52,0x33,0xaf,0x2b,0x52,0x64,0xb9,0x0c,},{0xe5,0xef,0xfd,0x92,0x1b,0xe8,0xee,0xc5,0x30,0x75,0x2f,0xcc,0xc5,0x76,0xef,0x0d,0x9b,0xcd,0xe4,0xb3,0x2c,0xc6,0x49,0xd3,0xf7,0x95,0x47,0x17,0x56,0x28,0x60,0xcc,},{0x42,0x5f,0x27,0x22,0x12,0x83,0x57,0x55,0xad,0xcc,0x05,0x22,0xc6,0xf6,0xe0,0x5f,0x68,0x00,0x8a,0x3b,0xe9,0xba,0x59,0x74,0xe4,0x20,0xc4,0xc5,0xcb,0x56,0xe6,0xc5,0x5d,0xec,0x0d,0xe3,0x47,0xb1,0x6c,0xae,0xf8,0xbd,0x33,0xb7,0x1b,0x44,0xc8,0x35,0x7d,0x05,0xb6,0x32,0x1d,0x7b,0xf4,0x93,0xd2,0x58,0x61,0xdb,0x48,0x7b,0xd6,0x03,},"\x98\x1c\x8e\x10\x90\xe3\x96\x95\x1b\x07\x2e\xf8\x49\x70\x62\x02\x08\x97\xbf\x7d\xd7\xad\x50\x5b\x4d\x6d\xc1\x1b\x3e\x1d\xbc\xb0\xda\x24\x99\x84\xa1\x40\xe1\x64\xfc\x2e\x02\xb3\x1d\xa3\x98\x46\x55\x4a\xa8\x90\x5b\xc8\xb3\xdf\x8a\x76\xbf\x60\xeb\x5f\xfc\xf2\x2c\x97\xb6\x71\x22\x7d\x24\x90\x71\xda\x8f\xf6\xbb\xa7\x5b\x2f\x76\x68\xce\xc1\x9a\x89\xe6\x47\x5a\x12\x46\x3d\xab\xf3\x68\xb3\xca\x24\x45\xbb\x30\x35\xcc\x00\xfa\xe8\x5b\x70\x72\xfb\xcf\x59\x54\x01\x75\x5b\x80\x51\xe6\x09\x70\x65\xae\x42\x9f\x18\xee\xb1\x3f\xfa\x6d\xde\x59\xdf\x6f\x3c\x20\x6b\xfd\x9c\xe1\xf8\xa8\x00\xc8\x59\x0a\x40\x21\xd1\x60\xf6\x6d\x67\x40\xa3\x69\xae\x83\x56\x17\x53\x8b\x58\x90\x23\x1f\x13\xc5\x66\x7b\xaf\x51\x0a\x60\x6b\xda\xa8\x4b\x8d\x10\xee\x60\x15\xe1\x2a\x4c\x1e\xc0\xbd\x04\x21\xa2\x94\xc5\x1c\xf6\x3b\x5d\x1f\x05\x8e\x11\x53\xdc\x42\x5d\x10\xce\xe8\xb1\xb0\x84\xd6\xc2\x93\x47\xe9\x6f\x0f\x31\xb8\x39\x60\x7d\x07\x8b\x79\xa9\x0c\xa3\xd1\xf0\x63\x80\x7a\x46\x3b\x7c\x32\xf4\x5a\x53\x44\x98\xd7\x1d\x47\xed\xc3\xb1\x7a\x4d\xff\x27\xfe\xdc\xff\xab\x30\x1f\x34\xf1\xa6\x4c\x02\x78\xa5\x35\x89\x34\x9a\x23\x3a\xf3\x0b\x1e\xc1\xae\x41\x0f\x7b\x16\x30\xc7\x14\x5c\xa4\x2c\x96\x63\xf5\x12\xe8\xa5\x78\x26\x7d\xc9\x5e\x83\x28\x9c\x17\x03\x2e\x09\x78\x2e\x2f\xe8\xe1\x6e\xfb\x87\xf0\x3c\xa0\x3b\x11\x95\x61\x4f\x89\x96\x1c\xa3\x93\x9d\x3b\xdf\x73\x72\x21\xa2\x2d\x7a\x18\xec\x30\xfc\x12\x6d\x0c\xa6\x63\xe8\x8d\x60\x60\xd0\x4c\x6a\x44\xe5\x61\x6e\x55\x6e\x07\xd6\xd4\xa8\x47\xf1\x71\x1c\xf4\x37\x17\x81\x0c\x70\xaa\x4b\xe7\x30\x27\x8b\x3b\xd6\x55\x5c\x95\x4d\xc6\xed\xb0\x9d\xb0\x8f\x0e\x21\x18\x03\x59\x62\x80\xf3\xc7\x86\x8d\x23\x42\xcc\x23\x08\xea\xae\x4d\xa1\x91\x35\x14\x66\x4b\x1d\xb9\x62\xe9\x9c\x8a\x8c\xff\xe5\x79\x31\xf5\xdf\xcd\xdb\xc1\xcb\xb3\x6c\xe1\xc8\x42\xe2\xdd\xde\xad\xfd\x7e\x7d\x0a\x50\x48\xcd\xcb\x96\x1b\x14\xf3\x5f\x43\x5e\x73\xa6\x83\xc8\xce\x25\xc8\x16\x81\x25\x66\xfd\xf8\x17\xe0\xd3\x36\xae\x0b\xd2\x47\x32\x85\x12\xb2\xa8\x56\x76\x32\xbf\x20\x55\x3d\x9b\xd6\xfe\x15\x7f\x22\x0f\xfb\x0b\x46\xeb\xae\x89\xa7\x04\x59\x72\x8a\x57\xee\xd1\x79\x62\x56\xf1\xbd\x50\xb6\xd5\x47\xea\x3e\x25\xfa\x59\x13\xd3\x89\xa2\x25\x83\xe9\x15\xeb\x49\xde\x35\xa9\x7b\x5a\xcc\x52\x1d\xb0\xd0\x05\xc2\x95\x75\xe1\x66\x11\xa7\x55\xf2\x1a\x3a\x5a\x82\xa2\x0a\xa9\x00\xa7\x07\xce\x36\x82\x54\x92\xc3\xca\x15\x39\x5f\x17\x00\xb4\xaf\xab\x94\xda\xa7\xa0\x2f\x14\x53\xb1\xf9\xa6\xbd\x36\xef\xb2\x04\xd9\x28\xee\x1f\x4d\xcc\x86\x0f\x3a\x85\x9b\xad\xc0\x06\xfb\x30\x5f\xa1\x23\xd4\xc7\x9b\x23\xa2\x0e\x32\x29\x5d\x04\x0a\x7f\x8f\x6c\xac\xa2\x5d\x83\xf7\x1c\x62\xe3\xaf\x78\x36\xef\x76\xb9\x3a\x83\xd3\xc3\xb4\x93\xaf\x14\x17\x53\xda\x19\xe4\xcd\xcb\xa5\x66\x17\x27\x10\x34\xb4\xf4\xf3\x94\xc7\xc6\xb7\xd7\x96\x66\xf3\xaf\xb6\x92\x24\x4f\x06\x1c\x69\xa8\x88\x1d\x1b\x52\xb8\x84\x9f\xb5\x34\x99\x0a\xc2\x39\x19\x09\x47\x1e\xbb\xb7\x28\xe2\x9c\xd2\x0f\x42\x23\x54\xc4\x30\x97\x17\xeb\xff\x3e\xfd\x18\x33\x37\x08\x06\xd5\xbf\xb5\x3c\xa2\xda\x31\x6d\xac\xb5\x0a\xb7\xfb\x73\x96\x73\x23\x5a\x1d\xc5\x3a\xa8\x89\x30\x72\xd5\xb9\x1c\x9f\x6d\xb8\x3f\xc4\xea\x41\xd1\xee\xf4\x9a\xc2\x8a\xfc\x1c\xed\x8f\x36\x18\x90\xab\x9f\x77\x9d\x19\x30\x82\x83\x1c\xb8\xc4\x2f\xb2\x79\x2b\xee\x3b\x26\x29\x6b\x62\x95\xeb\x78\xa8\xd8\x53\x11\x76\x61\x62\x4e\x11\xf7\xf5\x7a\xfd\x60\x85\xa7\xb9\x12\x36\x79\xfd\xac\xa1\xcf\x2a\x78\xd3\x80\xbc\x4c\x36\x0a\xa7\xc3\xcb\xfd\xe0\xc0\x09\x1f\xe5\x3e\x22\x19\xc0\x70\xf2\xf0\x2f\x14\x83"}, -{{0xcf,0x33,0xe7,0x97,0x4d,0x8f,0x0b,0xf8,0x99,0xac,0x5b,0x83,0x4c,0x7c,0xf9,0x64,0x79,0xce,0x1c,0xfd,0x45,0x3a,0xf0,0x7f,0x97,0x05,0x27,0xf3,0x6a,0xa8,0x5c,0x1f,},{0x57,0x8f,0x60,0x33,0x8b,0x1f,0x04,0x1a,0x97,0xd3,0x19,0xfe,0xcf,0xa3,0x0c,0xfa,0xed,0x36,0x93,0x03,0xcc,0x00,0xb3,0xec,0x8c,0x5c,0x99,0x04,0x11,0x58,0xe2,0x0c,},{0x97,0xa5,0xb6,0xd2,0x68,0xa5,0xb4,0x17,0x5f,0xb0,0x6f,0x1f,0x37,0xd0,0xa6,0x33,0x51,0x92,0x96,0xed,0xc3,0x00,0x11,0xc9,0x54,0xd8,0xf0,0xb9,0xbb,0xe2,0x64,0x18,0x00,0x39,0x6c,0x4b,0x35,0xd4,0xb0,0xd7,0xd2,0xa1,0xd1,0x7c,0xbb,0xeb,0xdc,0x55,0xa8,0x09,0x46,0x2d,0x6c,0xc1,0x9a,0x6f,0xad,0xbe,0x1b,0xd1,0xba,0xe8,0x8a,0x01,},"\xe8\x13\x14\x4b\xd1\x16\xf6\xac\x36\x38\x92\x17\xb5\x17\x1a\x90\x2f\x06\xb7\xdd\x7b\x14\x4d\xf4\xf9\x09\x15\x53\xc7\xc7\x83\x57\x53\xa2\x96\xcb\xb0\xd7\xfa\xb9\x9c\xef\x77\xb6\x1f\x34\xa0\x4c\x8a\xf0\x4e\x7d\x5d\x1f\x96\x13\x02\xde\x89\xe2\x00\x5f\x29\x9f\x5a\x4a\xa1\x79\x24\x61\x7d\x00\x66\x93\x93\x77\x45\x53\x9c\x30\x48\xee\x36\xb8\xc2\x3a\xfe\xc0\xaf\x9f\xea\xa0\x06\x6c\x8a\xf8\xe0\xa7\xf0\x90\x93\x49\x82\x10\xf6\xd8\xdc\xc0\xaa\xad\xa5\x66\x87\x86\x91\x0f\xf7\xc5\xb3\x48\xd4\xcc\xd6\xee\xef\xfa\x3a\xcd\x18\x16\xd9\x01\x1a\x4c\x40\x25\xf6\xc2\xfd\x2c\x02\x0a\x10\x59\x36\x27\x52\x0d\x4d\xd9\x9e\x07\xc6\x2d\x2d\xbe\xbe\x84\x13\x9e\x1c\x7d\x86\x7c\x09\x35\x74\xfa\x60\x1e\x4e\xe3\x07\xac\x92\x6e\x5d\x36\xb6\x2d\x7e\xd8\x4a\x26\x15\x88\xb7\xe2\x88\x3c\x79\x26\x61\x2b\x4c\xc6\x7e\x2b\xb7\x25\x44\xa1\x0d\x6b\x49\x29\xc8\x8e\xf6\xc4\x7c\x26\x25\xd2\xf6\x81\x6b\xd7\x3c\x3b\xae\x89\xd2\xe0\xc8\x61\x71\xac\x4b\xd0\x80\xae\x55\x5d\x62\x74\x0d\x1d\x2a\x76\x1c\xed\x86\xdf\xc3\x28\xec\xc2\x7e\xe3\xdb\x6d\x40\x41\x08\xef\x4e\x0b\x64\x90\x62\x53\xb4\xc0\xa7\x71\xad\xef\xed\xc8\xa2\xc5\xb5\x3c\x42\x5a\x70\xcd\x6f\x63\x95\x6f\x7a\x0a\x61\x9f\xdf\xbf\xd0\x0a\xa0\x78\x41\x8e\xb4\x65\x2f\x8b\xc6\xf3\xc2\x53\xbe\xec\x98\x38\xb7\x7f\x9c\xbe\x2e\xf2\xb8\x05\x5c\x57\x73\x53\x9e\x35\x6b\xd8\x19\x26\x06\xec\x10\x1e\x3f\x60\x58\xb1\xdd\x08\xa6\x8f\xdb\xc5\x49\xdf\xe6\xb7\x72\x5d\xc2\x54\x9e\x8e\x3f\x90\xdc\x5b\xe3\xcc\xfb\x0a\x38\xba\xf9\x37\x7c\xb3\xf6\x50\x1d\x2e\x15\xcc\xb3\x55\x6a\x89\x5c\xcb\x23\xf0\xb6\xdf\x9f\xe5\x93\x11\xcf\xf5\x53\x74\xc3\xfb\x3a\x32\x98\x1c\xa2\x6a\xb4\x26\xf3\x66\x3d\x04\xe3\x16\x7e\x53\xa5\x37\xb7\x58\x9a\x9f\xb7\x36\x79\x09\x0a\x20\x55\x32\xc1\x32\x90\x66\x34\x33\x4a\x7e\x87\x49\x79\x3f\x8c\x59\x3f\x3f\xd6\x27\x8c\xe0\x05\x03\x83\x48\x7f\x3b\x24\x50\x67\xaf\x94\x88\x1a\xa1\xae\x96\x8d\x0c\xae\xba\x5f\xa5\xc7\xbe\x5f\x4e\x4b\x72\x57\x51\x86\x95\xd8\x9b\xcc\xde\xc5\x07\xb9\x67\xb4\xfd\x64\xb6\x89\x3b\x3e\xe7\x80\x3c\x1d\x36\xea\x8a\x02\xfc\x42\x6f\x9a\xfc\x8e\x9f\x24\x32\x15\x27\xec\x98\x44\xbc\x3c\x54\xa0\xf7\x66\x7e\x03\x43\x00\xbb\xb4\xfb\x02\x0f\x6d\x5b\xb9\x54\xe7\xb5\xa3\xa7\x06\xa4\x93\x9d\xb3\x3c\x15\x48\x92\x64\x34\x76\xa2\x91\xd4\x7d\xc1\xe6\xf7\x2c\xe9\x1d\x13\x6f\x11\xdb\x26\xb9\xc9\xba\x73\x6e\x40\xdf\x0a\x15\xc1\xa8\x91\x49\x99\x6b\x25\x1d\xd9\x88\xb3\x90\x04\xe6\xef\x41\xbd\xc0\x61\xdb\x58\x0b\x7b\x74\xde\x2a\x65\x18\x10\xbd\x89\x17\x53\xb9\x73\x86\xd7\xf8\xcb\xdb\xb6\xec\x38\x6f\xa2\xc3\x42\xf5\xef\x20\xe6\xe3\xa8\xbb\x4d\x51\x49\xa7\xd4\xde\x12\x24\xdf\xf1\xd1\x72\xc8\x75\x70\xf7\x76\xd5\xef\x45\x95\x9b\xe0\x93\x8a\xd7\x9f\x5d\x33\x95\xcb\x27\x21\x62\x71\x22\x88\x7b\xd7\xa8\x98\x3b\x64\x77\x97\xbd\x41\xd8\x82\x64\x1c\x81\x43\x1c\xe8\xd9\xb3\x06\x7a\xde\xc4\xcd\xe9\x26\xc5\x13\x13\xf0\xcf\x84\xc5\x29\x25\x62\xdd\x49\x08\x64\x2d\xd2\x45\x28\x84\x84\xc5\x56\x8a\x78\x7d\x0c\xed\x36\xa3\x52\xf0\x32\xda\x4f\x7e\x4d\xe0\x6b\x11\x47\x3f\x65\x0e\xec\x65\xdd\xa9\x96\x39\xaf\x2d\x42\xd8\x4e\xe2\x30\xf4\xf8\x36\x23\xd9\xc9\xaa\xa3\xb1\x6b\xda\x10\xdd\xaa\xd2\x5a\xf5\xc1\xc1\x0f\x81\xc8\xc5\x1c\x81\x1a\x3a\xa3\xe3\xdb\x58\xa7\x02\x5e\x43\x80\xe2\x85\xda\x47\x4a\x61\xba\x59\x17\x3f\xf0\x42\xa4\x6a\x79\xab\x18\x4b\x07\x01\x08\x41\x6f\x9d\x61\x58\xcf\x96\xd0\xe6\xdb\x44\x76\x14\xa0\xd9\x08\x9e\xbb\x6a\xee\x4e\xf1\x07\xbe\x45\x93\xd7\x1e\x79\xf6\x79\x86\x68\xa7\x40\xae\x4b\xac\x5a\xc7\x59\x4e\xcb\xd5\xdc\x82\xe7\xd0\xf9\xcb"}, -{{0x51,0xb1,0xad,0x0f,0xfc,0x21,0x49,0x7a,0x33,0xdb,0xdb,0x85,0xea,0x2b,0xc1,0xce,0x3d,0x0c,0x2d,0x95,0xd9,0x46,0x1a,0x39,0x09,0x73,0xfe,0xe3,0x77,0xfc,0x75,0xf4,},{0xba,0xd0,0x41,0x25,0x75,0xd3,0x80,0x13,0x01,0xed,0xee,0x6b,0xc0,0xf2,0x76,0xe7,0x87,0x35,0x7b,0x41,0x22,0xf5,0x2d,0xe9,0x81,0x88,0x58,0x51,0x88,0x42,0x49,0xcb,},{0xcf,0xb6,0x5b,0x6f,0xf0,0x37,0x7c,0xef,0x51,0x1f,0xd9,0x7b,0x90,0xc3,0xec,0xb8,0x08,0x33,0xf1,0x42,0xa7,0xcf,0x50,0x22,0xce,0xd3,0x0b,0x3f,0xb7,0x86,0x20,0x86,0xd0,0x13,0x39,0xb8,0x86,0x6a,0x23,0x8c,0xb0,0x70,0x27,0x6e,0x19,0x44,0xb5,0xfe,0x32,0xcc,0x40,0x99,0x47,0xcb,0x91,0xde,0xb1,0x43,0x2c,0x29,0x1b,0x60,0xfb,0x0d,},"\x78\x82\xe8\x6e\xf3\x40\x2f\x6d\xbc\x65\xcc\xe8\x31\x5b\x39\x76\x5f\xaa\x4b\x1f\xc8\x76\xfa\xd5\xf8\x22\x0c\xb2\x2a\x7d\xf2\xe3\x58\x0e\xab\x3a\x7e\x8f\xa7\xfb\xb6\xb5\x94\x82\xca\x0e\x36\x4a\x13\x13\x96\xdf\x79\x2a\x32\x41\xa0\x60\xe4\x41\x43\xb6\x76\x74\x93\xc6\xbf\x75\xf1\x87\xa9\x64\x3a\xa1\x1e\x11\xeb\xa7\xb0\xa8\x0f\x0a\x68\xb9\xf1\xb7\x9f\x75\xb6\x6c\xc5\x9d\x9d\xa7\x79\x55\xfd\x7e\x87\x99\xf9\x9d\x6e\xb0\x8f\x90\xd3\x18\xf4\xef\xcb\xfe\x71\x15\x9b\x10\xa8\x3a\xa5\xfd\x69\xbb\x75\x33\x6f\x5d\xf2\x96\xea\x06\x0a\x42\x6c\x95\x45\xdf\x94\x0b\xc1\x45\x4e\xfc\x1f\x9d\xc9\x65\xf1\xf2\x2d\x94\x73\x03\xfb\x8e\xc1\x24\x07\xff\xf6\xb1\xdb\xe4\x7e\x34\x21\xc3\x17\x64\xfd\x90\xc8\x3a\xc7\x11\xd1\x99\x26\xe2\x29\xa0\x64\xc6\x1f\xe3\x67\x6a\xf3\x00\xa1\x71\x6f\xab\xe4\xe3\x84\x22\x64\xad\xb3\x2e\x0d\x9c\x9f\x5d\x4a\x65\xd0\xd7\xb5\xc3\x77\x0d\x73\x7e\xe1\x3c\xbe\xd2\x1d\x7a\x1d\xa3\x6a\xaf\x7e\xc0\xf3\x6f\xcc\x47\x6f\x65\x96\x81\xe5\x16\x0a\x5a\x1f\x49\xe7\x59\xb9\xd0\xfc\xd4\xfd\xb8\x54\xec\xcd\x99\x17\x2a\x47\xd2\xc4\xef\xbe\x0b\x37\x57\x63\x1d\xf1\xba\xe1\x75\xf0\xfa\x74\xdd\x04\x8b\xb6\xa5\xfe\xd8\x43\x02\x84\x34\x9d\xa3\xd6\x7d\xf2\xa6\xf7\xe8\x26\x9b\xc7\x9f\xb2\xc5\xd5\xed\x60\x84\xe9\x07\x6f\x45\x5a\xb6\x38\x91\x90\x46\x36\x9a\x44\x6d\x57\xfc\xad\xa7\x01\x1c\xc7\x71\xbf\x6d\x87\x4a\x8e\x5d\x23\xc6\x87\x74\x7d\xe4\x1d\xd0\x4b\xff\xc7\x17\xd6\x12\x81\x83\x84\x6e\xb5\x94\xb3\xcb\x1c\x1a\x8a\xa0\x4f\x0d\x7e\xba\x53\xaf\x39\xcb\x1d\x4e\x6f\xec\xf3\x11\x3b\xd8\x42\x24\x16\xf4\xc4\x40\x37\xae\xee\x9e\x0f\xdc\x51\x7c\x48\x73\x1f\xd0\x4e\xe9\xc9\x9f\x5d\xbc\xa3\xd5\x74\x50\x9d\x7b\xaf\x32\x88\xf2\xc2\x30\xa0\x2d\x17\x03\xbd\xb1\x61\x1c\xde\x2a\x76\x6d\xac\x19\x3d\xe1\x67\x44\x3d\x20\x09\x0d\xc3\x4d\x29\x27\x7a\x86\xb1\xe9\x98\xb2\x45\x64\x51\x17\xe5\x11\x1f\x12\xf1\x46\x06\xc5\x54\x46\xdd\x91\x2d\x34\x75\xc1\x98\x76\xe1\x9a\xc5\x36\xd3\x17\x87\x6c\x4b\x0a\x2e\x0f\x98\x61\x61\x29\xa5\x68\x37\x32\xa4\x23\x17\xc5\xe8\x09\xdc\xa9\x56\xb2\xab\xb4\x84\xad\xa8\x10\xa1\x5c\x81\xcc\x85\x62\xb5\x55\xda\x94\x58\xf9\xb4\x43\x38\x49\x02\x30\xc7\x40\x4f\x3d\x48\x61\x1f\x84\x12\x7e\x73\xe2\x77\xd8\x8c\x62\x21\x2d\x2a\x3a\x35\x1f\xc6\x76\x65\xb1\x8d\x77\x21\x62\x30\x63\x2c\xbc\x78\x12\x88\xe1\x5c\xeb\xf3\xec\x33\xa7\x20\x5e\xb2\x2b\x9a\xbe\x4c\xdb\xc7\xdd\xba\xaa\x53\x64\x08\x75\xeb\x76\x3f\x52\x2c\x36\xcf\xff\x2e\xb2\x3e\xe5\x86\xd7\x75\x28\x62\x59\xfa\x94\xa4\x4f\xa7\xec\x01\x50\x96\xa2\xa4\x46\xb6\x73\x2b\x80\x02\x42\x67\xfe\x3d\x5d\x39\xd1\xc4\x85\x09\xb3\xec\xaa\x2e\x24\xe5\x4d\xe4\xd6\x1c\x09\x7b\x70\xf7\x53\xb5\xaf\x9a\x6d\xb6\xf9\x75\xd2\x5f\x4f\x83\xd0\x6f\x87\x9e\x17\xef\x7c\x50\x9a\x54\x14\x44\xba\x3e\xb6\x86\x78\x38\x09\x0e\x22\xda\xfd\xbb\x0e\xb3\xb0\x56\x5b\xe1\x57\x9c\xee\xcd\xed\x20\xf5\x44\x25\x6c\x7c\x4e\xde\x3b\x62\x84\x3c\x65\xb0\x46\x6b\xe6\xb7\xe2\x73\x05\xb9\x63\xca\x91\x4e\x3b\x7d\x21\x73\x61\x18\xed\xb3\xd6\x58\xd9\xd7\x6f\x50\x9d\xb3\xb9\xca\x2e\xae\x28\x96\x4a\x4b\x3b\x3c\x38\x4a\x81\xa4\x89\x0e\xe9\x6f\xbe\x93\x4a\x6f\x2a\xec\x8e\xeb\x6c\xfe\x59\xac\x9d\x3b\xbc\x16\x46\xba\x32\xa1\x14\x2f\xee\x59\xfe\xd6\xfb\x7b\xbc\x04\x98\xcc\x27\xde\xad\x41\x3b\x7b\x43\x51\xec\x20\x63\x43\xc0\xab\x89\xfc\xf8\x72\x43\xb1\xab\x45\x0e\x58\xff\x11\xa1\x14\x0a\x38\x3f\x19\x6a\xa3\x97\x6c\xe1\x7c\xf3\x45\x30\xf0\x49\xa1\xde\x90\xe3\x17\x53\xcd\x85\xe7\xf1\xfd\x5c\xf2\x04\x26\xc9\x37\x9f\xeb\x8c\x31\xb4\xbf\xec\x35\xea\x5a\x78\x95\x3d\x75\xc5\xcf"}, -{{0xfa,0x2f,0x46,0x1c,0xe8,0xc7,0x12,0x62,0x18,0xc4,0x7c,0x91,0x56,0x9e,0x87,0x99,0x79,0x7c,0x83,0x36,0x8f,0xc8,0x42,0xb6,0xe1,0xc2,0x2f,0xd5,0x2a,0xec,0x70,0xbf,},{0x6b,0x89,0xb2,0x3f,0x1e,0x11,0xa7,0x5a,0x53,0xf9,0x92,0xf6,0xca,0x57,0x75,0x00,0x8c,0x6e,0x9e,0x7e,0x49,0xc0,0xd8,0x51,0x0b,0x0e,0x83,0x69,0xb7,0xa2,0x0b,0xcc,},{0x84,0xf7,0x9d,0x9e,0x8f,0x30,0xe5,0xbb,0x63,0x62,0x23,0x97,0x14,0x55,0x6b,0x04,0x73,0x6f,0xa4,0x44,0x65,0xca,0xba,0xad,0x23,0xbe,0xaf,0x5a,0x99,0xfc,0x45,0x1a,0xd4,0xae,0x5a,0x18,0xc7,0xf6,0xf9,0x64,0xfa,0x41,0x03,0x92,0x16,0x01,0x8e,0xc5,0xa2,0xac,0xca,0xe1,0x07,0x5a,0x6b,0xb3,0xa6,0xec,0xbc,0x1f,0xca,0x02,0xb9,0x04,},"\x79\x9b\x39\x80\x2a\x18\x27\xe4\x5c\x41\x12\xfe\xe0\x26\x03\x4c\x0e\x59\x8a\xff\xce\x2c\x55\x0c\x19\x3f\xee\x73\xf1\xdf\x8c\x30\xc8\xd3\x87\x33\x40\x08\x8c\xe8\x59\xde\x34\x71\xe9\xd0\x57\x68\x6c\x82\x9b\x54\x08\x79\x5e\x08\xb3\xdc\x7a\xa3\xb6\x37\xc7\xde\x9d\x21\x72\xad\x03\x33\xc1\xbe\xa8\x61\xa6\x23\x2f\x47\xf0\x5a\x10\xbf\x5d\xf8\x08\x15\xa2\x71\x25\x6e\x37\xe8\x08\xa0\xe6\x2f\x1f\x07\xd9\xe1\x0e\xbb\x94\x7d\x3e\xfa\xbf\x8a\x28\xfa\x9d\xcc\xd9\xa1\xd5\x99\xf5\xfd\x61\x65\x50\x8e\xfd\x67\x9c\xf3\x56\x01\x50\x58\xbf\x4b\x34\x11\x8f\x83\xaa\x3e\x5b\xc2\xce\x19\xec\xa8\x4f\x71\x83\x98\xad\xbc\x0a\x52\x76\xcf\x9d\x8c\xaf\xfc\x27\xe3\xe6\xab\xbe\x34\x5b\x0e\x9e\xcf\x89\xc6\x77\x1b\x0e\x75\xd4\x08\xba\x2f\xbb\x90\xfc\xfd\x70\xc5\x3f\x2e\x4d\x52\xba\x54\xd9\x78\x4c\xf7\x1c\x34\x9e\xf6\xf1\x4a\xe4\x97\x0d\xef\x6e\xfb\x5f\x30\xe9\x84\xd6\x01\x6a\x19\x6d\xea\xec\x7e\x04\xb4\x76\x19\xc4\x8b\xf4\x9d\xc0\x2f\x7f\xef\x3e\x13\xb7\x56\x17\x4e\x90\xd0\x5f\xcb\xdd\x5e\x13\xf0\xe4\x34\xef\xd5\x42\x1b\x09\x1d\x51\x79\x00\xed\x0d\x57\x85\x96\x88\x62\xb4\xbf\xe5\x09\x3a\xb6\x72\x17\x18\x0d\x97\x55\x4c\xcd\x9c\xc3\x14\x29\x32\x6c\xab\x42\xf3\xf8\x39\x80\x60\xc1\x9d\xb4\x88\xb5\xd1\xc8\x0b\x29\x09\x0a\xfd\x1c\x6b\xac\x36\x42\x26\x48\x00\x21\x1b\xc2\x78\xfc\xb9\x9d\xae\x9d\xbf\x49\xda\xf1\xb2\x4a\xb5\x69\xdc\xbb\x87\xd4\xd3\x54\x73\x35\xe3\x5d\xb9\x84\x00\xcd\xfc\xe6\x79\x06\x82\xe9\x36\x00\x22\x0e\xc4\x99\x24\x5f\xa4\xee\x15\xd8\x43\x83\x1b\x56\xcc\x26\x41\x80\x25\xbf\x87\x00\x16\x05\xc6\x69\x1c\xa6\xbd\x40\xa4\xe2\x48\xc3\x09\x80\x1b\x76\xa7\x95\xed\xe8\xad\x53\x08\xbc\xb6\xd1\x75\x4a\xb3\x37\x1f\x00\x03\xbb\x8c\x4e\x4e\x47\x19\x54\xe2\x8b\x1e\x98\x66\x37\x9f\x82\xe1\xfb\xac\xb7\x9d\x50\xad\xdd\xad\x5b\x97\x78\xb5\x58\xcd\xdb\xb0\x03\x8a\x5f\xf3\xd5\xc9\x55\x7b\x96\x5d\xe3\xa7\x08\x2c\x45\xa8\xec\xf3\xe7\x72\x1e\xb6\x90\xb6\xc7\x1f\x3d\x89\x75\xd5\x30\x0f\x67\xc4\xdc\x4a\x73\x68\x46\xe4\xcc\xd2\x6f\x93\x46\x3d\x5b\xc6\xf4\x6e\xdc\x48\x86\x64\xbe\x96\x96\xbe\x12\xb0\x2d\xd1\x04\xd1\x0c\xc6\xb1\xd8\x2e\x81\x17\x81\x12\x14\xa6\x48\x7d\x17\x36\x7e\x39\x5a\xde\x2e\xf6\xb2\x6a\x17\x83\xa7\xe2\xf2\x45\x21\x3b\xc0\x3a\x75\x5d\xf3\xee\x8e\xf9\xf1\xef\xf9\x72\xc6\x91\x90\x65\xcb\x7b\x75\x66\x78\xd4\xdd\xfd\x19\x3e\xdd\xc0\xb4\x2e\x86\x89\x61\x36\x43\x14\x6d\x74\x28\xca\x37\xbf\x31\xbd\xf1\x4e\x31\x86\x78\x58\xf3\x9d\x23\x23\x70\x9e\xb3\xb7\xd7\xf4\xe3\x97\x02\x23\x78\x42\x4b\xde\xe9\xbc\xb7\x4e\x9d\x5d\xfd\x37\x1f\x47\x34\x99\x8f\xc1\x8d\xf4\xcd\xfb\x4b\x5c\x21\xc2\xe5\x0f\x8d\x6c\x15\xbc\x14\xbf\x4f\xda\x6c\xeb\x9d\x80\x82\xca\xe4\x32\xdf\xc9\x8b\xfb\x3e\xcd\x16\xb8\xd7\x4f\x83\x0b\x64\x2b\x04\x28\x75\xe9\x21\xb0\x54\xbd\x1a\xaa\x58\x1f\x60\xd7\x18\xdf\x66\x9f\x56\xdc\x2f\x10\xd4\x78\x99\x77\x22\x16\x2e\x83\x94\x0e\x61\xa1\xb6\xe4\x2d\xf2\xa4\xa3\xa7\xcb\xcd\xd6\x11\xce\x96\xcb\xcf\xb5\xa9\x5c\xc4\x73\x23\x1c\xa1\x3c\x06\x09\xd0\xce\x1a\xe5\xdd\xb5\x46\x6d\x6d\x65\xee\xfa\xd9\xda\xf2\xa3\x69\x01\xbc\xc9\x45\x84\x7d\xa1\xed\x6e\x2e\x24\x0e\x84\x8b\x23\x1b\x7d\x0e\x1a\xcd\x06\x54\x3e\xc9\x3e\x76\x8e\x59\x98\x5d\x7e\x96\xc8\xc3\x1f\xcd\x12\x10\xf0\x96\x42\x71\xe2\x18\x77\x52\x5c\xb1\x34\xbc\x35\x36\x25\x7d\xbb\x11\xd3\x0a\x3c\x4f\x94\x9f\xb8\x2a\xe0\xc3\x1c\xcd\xfe\x41\x94\x32\x51\xe5\x0a\xa4\x35\x53\x92\xac\x30\x9e\xf6\x0f\xc1\x74\x32\xa2\xbe\x4b\xdb\x2f\xcb\x28\x60\x7c\xc4\x5a\x52\xb6\x00\x16\xbb\x1d\x2e\x23\x97\x2f\xf2\xc2\xa2\x47\xd7\x25\x58\x5b\x1e\xf2\xb1\x5f"}, -{{0x1b,0xe2,0x94,0x9d,0x51,0xe7,0x20,0x81,0x75,0x82,0x62,0x13,0xee,0x6a,0xe3,0xc0,0x91,0x17,0x27,0x42,0xe8,0x8c,0xaa,0x02,0xed,0x0f,0x31,0x3e,0xcb,0xe5,0xd9,0x10,},{0xd7,0xbf,0x47,0x48,0xd6,0xdd,0xed,0x5b,0x57,0xa2,0xab,0xf7,0x97,0xfa,0xcc,0x56,0x0b,0x48,0x56,0x3d,0xfd,0x9d,0xcf,0xf4,0xbe,0x52,0x2c,0x71,0x7a,0x6c,0xfd,0xa9,},{0xf4,0x1f,0x2e,0xf6,0x59,0x5f,0x17,0x66,0x0b,0xb2,0xfe,0x93,0xe5,0x1f,0xc6,0xfa,0x9c,0x31,0xda,0xdc,0x9d,0xb9,0x0c,0x3f,0x46,0x60,0x7a,0x7f,0xb4,0x80,0x0b,0xb7,0x5a,0xd9,0x63,0x25,0xdc,0x7e,0xab,0x78,0x24,0x72,0xb0,0x4d,0xa6,0xd8,0xe6,0xfe,0x64,0x65,0x5d,0xea,0x55,0x1f,0xbd,0x50,0x49,0xe8,0x76,0xce,0x5a,0x40,0x5f,0x02,},"\x04\x5e\x2b\x0e\xc7\xbb\x20\x3a\x49\xbd\xcb\xa9\x41\xe2\xb7\x3c\x23\xc1\xfe\x59\xa1\x7d\x21\xa0\x12\x4e\xa2\x4b\x33\x7f\x92\xab\x9c\x92\x3a\x20\x57\x6b\x62\xd5\xd0\xf6\x24\xe7\x93\x2c\x11\x5b\x54\x74\xe0\xa4\x6a\x4d\xc9\xec\x51\xf6\xa0\xce\x8d\x54\x74\x4d\x1d\x52\x09\x33\x20\xe3\x9b\xe2\x03\xf7\x4a\x0f\x5d\xfa\xc5\x2c\xf0\xf9\x95\xc6\x6d\xf2\x91\x4b\x68\xad\x87\x1f\xbe\x81\x52\x5a\xd2\xd8\x8a\xc6\x99\x33\xa7\x5a\xea\x74\xac\xe4\xe3\x63\x43\xdd\xc0\x6d\x32\x08\xf1\x6d\x80\x5f\x5d\xd7\x86\xb4\xda\xaa\x16\x67\x48\xcf\xee\xc5\x71\x4c\x85\xc1\x04\x78\xb5\x97\xac\x7f\x6a\xe2\xc9\x88\x91\xe3\x8f\xd4\x14\xaa\x81\x1b\x76\x21\xd8\x05\xeb\x8f\xcc\x46\xcf\x4d\x56\x8a\x8a\x92\x58\x7c\xbb\xc1\xae\xcc\x12\xf1\x0d\x90\xac\x1e\x01\xae\x98\x6d\x14\xfe\x82\x95\x1c\x68\x2c\xea\xc8\xc9\x25\xfc\x66\x54\xd8\x38\xac\x93\x53\xae\x2f\x93\xf3\xc8\x8b\xf7\xb8\x2c\xbc\x43\xb1\xe4\x9e\x5c\xeb\xfb\x19\x49\xad\xe4\xb2\x2e\x4b\xcf\x1b\x40\x0c\x0a\x8f\xa8\xa6\xfe\x76\x70\xf6\x9f\xc3\xfa\xec\xd4\x80\x5b\x8c\x95\x4c\x01\xa5\x40\xd1\xa1\xe7\x88\x43\x6e\xae\x07\x3a\xe9\x56\xda\xe3\x17\x69\x05\xa8\xf0\xa3\xc6\x0f\xd9\x80\xda\xb4\x19\xd4\x1e\xc0\x6e\x52\x73\xfb\xb1\x3d\xb9\x38\x1f\x89\xb6\x63\xcc\xc4\xbd\x75\x3f\xd9\x0f\x14\xa7\x7b\x3d\x81\xc4\x5d\xd3\x56\x1c\xd1\xfa\x0e\x94\xd2\x34\xce\xf9\xd7\x85\x9a\x2e\xc9\x42\xbf\xc1\x88\x49\xd7\xf2\xad\xa3\xa5\xd6\x57\xbc\x19\x3d\x2e\x14\x91\x68\x2f\x16\x65\xa5\x34\xb1\xac\x20\x83\xb7\x38\xbe\x8f\x9e\x96\x3f\x59\x41\xed\x48\x3c\x6a\xcc\x82\xe9\x59\xb8\x1b\x8a\xf0\x2f\x47\x1c\x08\xf5\xf8\xb1\x2e\x10\xe0\x08\x19\x28\x98\xa4\x45\x02\x02\xaf\x73\x15\x92\xe7\x4e\xfe\x2a\x94\x8e\x51\xd0\x6e\x44\xde\x9b\x95\x6b\x7b\xc9\xa6\x9b\x6e\x74\x68\x7a\xb2\x06\xde\xc4\xd3\x5b\x31\x73\xfb\xc4\x38\x82\x9d\x50\x64\xbf\xbc\xf7\x43\xc1\xe2\xd4\x6f\x62\x8f\x2e\x51\xc6\x26\xd8\xe4\x16\xd7\xbe\x6e\x55\x5a\x24\x96\x91\xab\xb1\x67\xf1\xd9\x2f\x4f\xa3\x39\x2f\xde\x24\xe9\x93\xce\x7f\xf5\xc1\xb8\xe1\x57\x7a\x7c\x0e\x73\x02\x5c\xc6\xfc\xd7\x27\xa8\x2e\xf0\xc1\x29\xe9\x1e\x55\x33\xe0\x21\xa3\xcd\xbb\x99\xd5\x4b\xf7\xcd\xcd\x3f\xf1\x19\x15\x4f\x3f\xad\x92\x42\xb6\xed\x35\x0d\x10\x37\x2c\x97\x6f\xf3\xa4\x37\xd0\x97\x86\x7d\x9b\xfb\xa9\x1d\x84\xbd\xa5\x5a\x6b\xcd\x6e\x36\x41\xb2\x13\xa2\x18\xb3\x04\x15\x89\xc5\x5a\xfb\xb3\x44\xde\x6e\x97\xd8\xc3\x5b\x5c\x86\xcf\x3b\xe0\x63\xf9\x01\xff\xee\xa8\xcc\x91\x06\x99\x67\xd2\x34\x60\x35\xa9\x1e\xb5\x70\x6a\x3b\x53\xf6\xd1\xc3\x4d\x4d\x21\x16\x70\x6b\x65\xc2\x98\xec\x57\xde\x82\xab\xc4\x00\x3c\xe8\xcc\x5e\x0b\x88\xff\x71\x0d\xda\x1d\xce\xf6\xf1\x54\x27\x71\x06\xb8\x3e\xb4\x6c\x04\x5b\x08\x2d\x11\x3b\x36\x1d\x6a\x62\x58\x08\xc9\x13\x05\x84\xdf\xc9\x67\x07\xef\x89\x55\x90\x7b\xaa\x61\xcf\x88\xc6\x6b\x6d\x1f\x60\x58\x11\x19\xcb\x62\x17\xa8\x52\x15\x73\x36\x17\x8c\x68\x5e\x6e\xd4\x85\x26\xed\x5c\x4e\x3b\x79\x67\xd5\x1f\x99\xdf\x68\x76\xa1\xac\xfb\x84\x5c\x57\x1b\x89\x86\x56\xe5\xe3\xbc\x73\x98\x0b\x9b\xed\x11\x98\x86\x63\x59\xc9\xe9\xb1\xef\xa9\x15\xf8\x10\xd1\xef\x8a\xd6\xcb\x3f\xc2\x1f\xbf\xe6\x54\x30\x6d\xe6\xca\x13\xa3\xa6\xa4\x8e\x7a\x13\xed\x87\x46\xac\xbd\x07\xf4\x8e\xb0\x0c\x36\x37\x4b\x1e\xb4\xf3\xf0\x1c\x19\xe2\xe8\xd3\x7e\x9f\xc0\x64\xb3\x3c\x0d\x66\x9b\xba\x55\x4d\xdc\x68\x21\xa7\x7b\x40\x89\xca\xbd\xca\xfc\x97\xf6\x0e\x60\x50\xbc\xa4\x44\xae\x8c\xfc\x44\xd9\x3c\x40\xef\x53\x18\xbe\xe6\xf8\xcf\x0c\x06\x7b\x85\xcd\xdd\xc4\x59\x74\xa4\xea\xcf\xc3\xef\x51\x31\x5b\xa0\xf3\xf6\x29\x68\xc7\x00\x3a\x7f\xf4\x44\x61\x24\x00\xb1\x59"}, -{{0x3b,0x6b,0xa6,0xd5,0xcc,0x9c,0xd6,0x24,0x1d,0x8b,0x00,0x97,0xa3,0x72,0x2e,0x4d,0x06,0x6f,0xea,0x3d,0x56,0x0a,0xea,0xb4,0x67,0x3e,0x86,0xf1,0xf8,0xec,0x60,0x26,},{0x8c,0xa6,0x52,0x07,0x17,0xcf,0x36,0x3c,0x4c,0xef,0xfa,0x76,0x32,0x8a,0x0a,0x16,0x6f,0xf8,0x3e,0x45,0xca,0x7d,0x19,0x1c,0xc8,0xef,0x6c,0xa6,0xe5,0x24,0x33,0x67,},{0x78,0x8c,0x9f,0x45,0x54,0xdd,0xba,0x5c,0x7d,0x64,0xba,0x75,0x9e,0xc4,0x56,0x94,0xec,0x79,0xfb,0x85,0xe8,0x23,0x68,0xa0,0x74,0xbd,0xd8,0xdf,0x34,0x42,0x13,0xa5,0x6d,0xd0,0x9f,0x33,0x4c,0xd9,0xac,0xb9,0x41,0xbe,0x28,0x3d,0x98,0xc4,0xb1,0x5d,0xcf,0xec,0xd1,0x4e,0x93,0xf6,0xa2,0xe3,0xcb,0x0c,0x1a,0xa2,0xde,0xe7,0xd9,0x0b,},"\x36\xde\x93\x0c\xc8\xe1\x88\x60\x83\x6a\x0c\x82\x9d\x89\xe9\x63\xa5\x8b\xdd\x9c\x6b\x6e\xf5\xbc\x61\xf7\x59\x92\xd2\x07\x52\x42\xdc\xa2\x3e\x28\xde\x20\x5a\x33\xdf\xea\x86\x1f\xc4\x4a\x32\x62\x8e\x8e\x7c\xdd\x3e\xd7\xff\x49\xea\x6a\x70\x97\xe0\x09\x0c\xfd\x9f\xf5\xec\xab\x1d\xe8\x22\xfc\x0a\x4c\x37\x76\xdd\x56\xc1\x91\x92\x04\x51\x6a\x94\xce\xc5\x63\x8d\xa1\xd9\x9e\x52\xb8\x66\xf5\xec\x41\x62\xa9\x12\xed\xb4\x1c\x1e\x92\xed\xfc\x35\x3f\x67\x05\xe1\xc1\x2c\xd4\x1c\xb6\x2d\xed\x4a\xd8\x15\x79\x40\x05\x9b\xfc\xf5\x07\x19\xd3\xf2\xad\x00\x84\x85\x40\xce\x89\xf3\xf9\xaf\xa6\x10\xcc\xba\x5e\xcc\x37\xe3\xe2\xc1\x53\x4f\xcb\x38\xfc\xd3\x9a\x2d\x14\xd5\xb5\xda\x6f\xea\x24\xe0\x06\x65\x4e\x30\x90\x47\xa2\x9c\xad\x0a\xe4\xda\x8e\x70\x8f\x97\xa1\x8c\xad\x5f\xbd\xc9\xac\x84\x40\x0c\x53\x2c\xed\x54\x88\x86\x53\x9e\xdd\x6c\x54\x10\x74\x79\x0a\xe4\x50\x2f\xdf\xe9\xf3\x27\x3a\x87\x6a\x21\x86\x23\xa2\x57\x06\xa1\x52\x5e\x67\xe5\x7a\x16\xd2\x2c\x21\xb6\xa4\x5e\x23\x84\xe2\x87\xac\x44\x52\xae\xc4\xe0\x63\x05\x6b\x4c\x17\x8a\xb0\xe5\xb2\xa5\xba\xd3\xf4\x63\xc4\x72\xc4\xea\x1f\x9c\x1a\x66\xe5\x27\x04\x73\xa8\x35\x09\x4e\x8f\x0e\xef\x68\x0c\xd7\xb2\x0d\x0e\x70\xf4\xd6\xc9\x58\xfe\xe0\x8a\x93\x60\xaa\x60\x66\x88\x8f\x4d\xd7\xce\x5e\xc2\x22\x59\xfa\x0b\x53\xfe\x92\x71\xc0\x83\xc6\xfc\xdb\x72\x83\xb0\x90\x61\x08\x8c\x52\xf7\x1b\xfd\xd2\x77\x7c\xe0\x80\x1f\x41\xa6\xc4\xce\x90\xef\x13\x1d\xe1\xe1\x83\xcb\x89\x49\xce\x32\x3c\x9e\xb1\x3a\x4b\x0c\xac\xf9\x9d\xef\xdf\xdb\x68\xd5\xed\x1f\x68\x91\xb4\x8e\x21\x04\x76\x68\xd6\x9d\xe8\xa8\x0f\x8e\x56\x34\xde\xd0\x87\x36\xa4\xfb\x54\x10\xcd\xea\x9c\x72\x59\x6e\x36\xdf\x68\x41\xf2\xee\xa4\x68\x50\xc8\x74\x73\xc8\x95\x54\x02\x05\xb0\x92\x19\x60\xff\xa5\xd9\xd8\xff\xb8\xe2\x9c\xde\x96\xa3\xed\xe0\x15\xac\xbc\x26\x97\x40\x04\xd3\xe4\x38\xa8\x5b\x2e\x33\x85\xf6\x4d\x18\x14\x00\x39\x41\xff\xd3\x63\x99\x2d\x39\x40\xc6\xe6\xd8\x1f\xf8\xe4\x5f\xce\xd6\xd3\x6c\xe1\x98\xd8\xcc\xbe\xfe\xe4\x32\xa7\x7d\x8f\xca\xdd\x73\xfb\x79\x9f\x6b\xaf\xef\xb5\x1a\x2d\xa7\x98\x72\x1c\x3d\x46\x5b\x16\x3e\xf1\x3e\x6e\xcc\x65\xe6\x03\xb2\x89\x3e\xe4\xcc\x9e\x1c\x6d\x1d\xe7\xa6\x5c\xab\x5c\xbd\xf5\x36\x85\x5e\x28\x8c\x3c\xcd\xa8\xd2\xfa\x3c\xe1\x0c\xf4\x93\x58\xa2\xef\x4e\xf0\x76\xe5\xbf\xa9\x1b\xbc\xf3\xd9\x66\xdf\xa3\xdc\x6e\x71\x2f\x19\x56\xd4\xe5\x8a\xa3\x6e\x71\x2d\xd3\x34\x71\x69\xb1\x9c\x8d\x44\xbe\xc5\xbc\xb7\x30\x77\x8f\xcc\xcc\x58\x9e\xd5\xd3\x50\xd4\x4c\x17\xbd\xe2\xee\xbb\x6f\x5e\xc5\x9f\xb2\x40\xd6\x7d\x81\xae\xa9\x26\x7f\x34\xf1\x5e\xee\x2d\xe3\xf4\xfa\x67\x39\x14\x79\xbd\xbb\x43\x0f\x48\x43\x70\xfb\x0e\x08\x95\xb9\xae\x06\x5b\xbd\xd4\x3e\x23\x0c\x62\xac\x07\x18\x4e\x8b\x06\xb2\x4b\x8b\x97\xec\x02\xdc\x6f\x37\xef\x61\x64\x1e\xd5\x6e\x3f\x5e\xb8\xd2\x08\x0b\x51\x44\xef\x76\x0b\x51\x87\x52\xe1\x97\x54\x79\x2e\x19\x34\x3a\x38\x55\xe1\xe2\xf7\xa7\xdc\x62\x35\x17\xee\xd2\xf5\xd2\x65\x48\xa6\x8e\xb8\xff\xd7\xbf\x70\xf7\x8f\xd1\x86\xdb\x63\x49\x28\xbb\x98\x13\x8f\x2b\x8f\xe8\x44\x81\xcc\x53\xf5\xaa\x35\xe2\x66\x6c\x63\x25\xe1\xd2\xb8\xac\x5e\x2d\xf2\x93\x5b\x7f\x64\x13\x95\x2d\x10\xd6\x07\x6f\xfc\x75\xbb\x6a\xf6\x3b\x29\xb0\xb9\x66\x3b\xec\x37\x24\x7b\x66\xb5\x08\xdd\xe4\x1f\x2f\x11\xb8\x43\x33\x55\x9d\xfa\xc7\x3f\x76\x1b\xcd\xa8\x4a\x48\xd2\x66\x07\x3a\xef\x16\x38\x46\x08\x49\xe7\xa1\x72\x06\xa2\x5f\x68\x00\x77\x0b\x91\x4c\xc0\x26\xba\xf9\xe3\x25\x59\x14\xe1\x32\x58\x44\x1c\xef\x35\xad\x1d\x66\x83\x3e\x98\x7e\xbe\x44\x31\xe6\xa6\xbb\x22\x2c\xbb\x65\xaf"}, -{{0xdd,0x99,0x87,0xb1,0x8f,0x9a,0x92,0x2c,0x0f,0x6f,0xea,0x18,0xeb,0x00,0xb8,0x96,0xc7,0xa2,0xd3,0x09,0x3d,0xb3,0xea,0x31,0xd3,0x84,0x21,0xda,0x0d,0xe5,0x12,0x31,},{0x57,0x39,0x21,0xa9,0x55,0xfe,0xb6,0xdd,0xe4,0x1b,0x05,0x5c,0x8d,0xac,0xac,0xcd,0x1d,0xb7,0xfe,0x9e,0x36,0xb5,0x09,0xd3,0xc9,0xe3,0x6f,0x97,0x35,0x75,0x23,0x24,},{0x3e,0x9f,0x2b,0x00,0x7c,0x0e,0x29,0xec,0x87,0x59,0x95,0xa6,0x30,0x9b,0x97,0x3d,0xeb,0x8b,0xaf,0x11,0x3d,0xed,0x13,0xf1,0xe0,0x00,0x3e,0x9b,0x9b,0xf9,0x39,0x16,0xa4,0xdf,0xe4,0x79,0x37,0xda,0xdf,0xc7,0x8a,0xa6,0x63,0xc5,0x5f,0x67,0x4e,0xc3,0x5c,0x38,0x46,0x25,0x8f,0x18,0xe7,0xbb,0x93,0xfb,0xba,0x3e,0x82,0x6a,0x1f,0x0d,},"\x48\x16\x2f\xdc\x3a\xbf\x73\x19\xc6\xca\xab\x60\xcb\x8d\x05\x20\x87\x5c\xb4\xee\x8a\x07\x09\x27\x83\x16\x7d\x47\x33\xff\xe5\x20\x4e\x5f\xeb\xe7\xd2\x91\xe9\x53\x6b\xde\xa3\xdf\x06\x37\x15\x9a\x65\x3e\x09\xfd\x99\xaf\x66\x1d\x83\x00\xae\x74\x1a\x3e\x91\xa8\xbd\x85\xea\xd0\x5d\xc7\xd9\xe6\xf9\x29\x32\x33\x16\xed\xc4\xca\x62\x4e\xa7\x81\x8b\x25\xbd\xc0\x61\xf7\x14\x92\xfd\x22\xd4\x65\xab\x22\x6f\xd9\xa1\x0d\x8b\xab\xfc\x07\x4c\x68\x6c\x43\x6c\x24\xa3\xa5\x3f\x8f\xf3\x89\xce\x9c\xa1\xdb\xc8\x90\x74\x45\x88\x92\x41\xf8\xfd\xa3\xa7\xa3\xf5\x02\x4f\xa8\xcb\x0d\x04\x4b\xda\xf6\x71\x6d\x98\x3a\x6d\x83\x98\x14\xff\xe7\x0d\xdc\x55\xbb\xba\x11\xac\x97\x88\x7b\xdb\x4d\xad\xa9\x65\x65\xbb\x07\x5d\x5f\xc1\xd3\xc5\x24\x4b\x9f\xff\x77\xde\x58\x72\x9a\x05\x9a\x91\x1f\xb3\xe0\xeb\x16\x4f\xb8\x42\x9e\x26\x56\x85\xd1\x4a\x63\x23\x30\x46\xd2\x0e\xcf\x28\x9c\x55\x72\x31\x69\xa9\xd6\x3d\xda\x0d\x52\x55\x15\x3d\x9e\xf4\xa6\x1b\x92\x12\xf4\xb8\x20\x69\x7a\xe7\xc3\x08\xcf\xab\x40\x3b\x2c\x34\x31\x90\x62\x26\xe4\x5c\xe2\x19\x20\xdf\x52\x01\x60\x9d\xaf\x83\x0f\x28\xad\x79\x60\x05\xa9\xbd\x8e\xba\x62\x0c\xf8\x39\xc3\xba\x22\x7b\x96\x3c\x7b\xd0\x91\x48\x22\xdf\x2c\xa0\x3c\x22\x54\xd0\xcb\x8a\xca\xe0\xd5\x9e\x4c\x3e\x0e\xc2\x15\xc8\x36\x96\x9d\xcd\x1d\x49\xbf\xe1\x97\xe2\xf3\xee\xa3\xfa\x8a\x37\x3b\x55\x8d\x0f\xb9\x06\x3c\xf1\x56\x8e\x73\x9a\xad\x8f\x09\xfb\x43\x7c\xaf\xb5\xa2\x72\x37\x5f\x43\x60\x64\xee\xe1\x1b\xd9\x03\xd3\xaa\xea\xb4\xe3\xfd\xcd\x36\xbd\x20\x76\xee\xa1\x79\xa4\xf0\xd4\xfb\xc8\xdf\x42\xbf\x26\x60\xf0\x8d\xe7\xd5\xc6\x39\x7c\xae\x10\xb7\x27\x74\x58\xaa\x6c\xfa\x01\xe8\xa6\x73\x7e\xb1\x26\x22\x78\x56\x64\x66\x91\x68\x1c\x10\x6a\x15\x7a\x26\xae\xd2\x1b\x1a\xaf\x0e\xd2\x76\x64\x21\xcf\xc3\xd1\xc7\xdd\xfb\x72\xfc\xdf\x4b\x8b\x49\x0f\xc0\x9a\xce\x49\xae\xdd\x77\x12\xb2\x1a\xc5\x6f\x86\x01\xf6\x25\x56\x3c\x78\x43\x06\xf3\xb9\x17\x4a\xdd\xf7\x64\xe0\x51\xaa\xdf\xe1\x28\x31\xaf\x96\x69\xe6\x2c\xab\x12\x1c\x74\xdf\x34\x37\x24\x42\x9d\x6c\x26\x66\x02\x71\xc3\x2f\x40\xcf\x7c\x2d\x08\xbd\x0a\xfc\xc7\x28\xde\xf4\x13\x5d\x4e\xb5\x5b\x6a\x3e\x76\x29\xd8\x06\x86\x4a\x85\xb3\x6a\x32\xb9\xb2\x1a\xc0\xd3\x96\x80\xa2\xae\x4e\xc4\x18\x97\x09\x17\x8e\x34\x94\x97\xf3\x93\x99\xfb\xc7\x8b\x3c\x6c\xfa\xca\x6e\xde\xa7\xc3\x3d\xda\x3c\xc1\x1e\x43\x84\xf1\x58\x3d\x6c\xfc\x6b\x58\xf4\xea\xa2\xbc\x56\xab\xa4\x2f\x73\x8a\x42\x9b\x93\x58\x08\x50\xde\xe3\xfd\x25\x39\x94\xf8\xb0\xfa\x66\xee\x8e\x27\x3d\xec\xab\xd5\x32\x09\x5f\xb0\x4a\x4a\x3c\x34\x0a\xf0\xe5\x5b\x57\xef\xab\x43\x63\x0f\xc0\x2e\xf2\x0b\x42\x5c\xa2\x18\x7e\x3c\x6c\x5e\x10\xf1\x2d\x61\x8f\xd2\x43\xa2\x24\xf6\x50\x1e\xbe\xb9\xd3\x21\xc6\x38\x5b\x81\x27\xef\x9c\xdc\xd0\x97\xce\x7f\xa0\x21\xcf\x40\xd2\x1c\x39\x91\x23\x43\xf6\x7a\xcc\xe1\x82\x5e\x3a\x51\xb8\xa7\x18\xe8\xc3\x40\x62\x2f\xff\x65\xfe\x00\x53\xd2\x4a\xa3\x35\x1b\x6a\x24\x00\x18\x5d\x7a\xeb\x88\xe8\x7a\xc4\xa1\xd3\x94\x90\x9d\x49\x41\x4a\xef\xc2\x2b\xa0\x09\xaf\xf6\x96\x2c\x92\x17\xd7\x55\x69\x4e\x4d\x6a\xa8\xa5\xd6\xa8\x03\xce\xbb\x15\xde\x8f\x54\x16\x34\xb6\xfc\xeb\x0c\xac\x79\xdd\xa8\xa1\x8e\xef\xbb\x53\x7e\x70\xff\xe9\xaa\x5a\x6a\x6a\xaf\x92\x40\xfa\xc2\xea\xcb\xfb\xef\x01\xad\x6b\xdf\x50\x75\x87\x80\xf8\x6a\x4e\x48\x89\x85\x36\x2d\x58\x25\x01\x1f\x5e\x8b\x66\x42\x5a\x61\x6b\x7e\x10\x4e\xb2\x3f\xe8\xf1\x00\xcb\x02\x49\x82\x36\x62\xbd\xa3\xda\x47\xa4\xc3\xc1\xca\x2f\x91\x4b\x25\xb9\x73\x85\x34\x02\x60\x47\xdf\x6d\x7f\xf6\x31\xdf\x2c\x41\x31\xf6\x80\xe1\x37\x43\xc9\xcc\xf2"}, -{{0x38,0xd2,0xef,0x50,0x9f,0x93,0x05,0x1f,0x14,0x51,0x67,0x73,0x7c,0x22,0xe1,0xa5,0xbf,0xe8,0xf4,0xa9,0x1e,0xba,0x0b,0xb8,0x7c,0x39,0xce,0x04,0xa8,0x9b,0xae,0xc6,},{0x01,0x11,0x5f,0x6d,0x89,0xa5,0xda,0xab,0x54,0xf8,0x92,0xbb,0x4a,0x4b,0xda,0x1c,0xe5,0xd8,0xf6,0xc9,0xc8,0x8a,0x50,0xce,0xe8,0x3b,0xd9,0x87,0xa2,0xc0,0xdd,0xf7,},{0xde,0xc4,0x62,0x53,0x50,0x9b,0x11,0xe4,0xb5,0x2a,0x6a,0xe4,0xf3,0x66,0xb6,0x80,0xdf,0xfc,0x28,0x0d,0x0a,0x04,0x4f,0xc0,0xcb,0x79,0x0b,0x6e,0x75,0x13,0x81,0x46,0x1e,0x1e,0x60,0x2a,0x89,0xe3,0xb3,0xd3,0x06,0x4c,0x40,0x7f,0x60,0x2f,0x1c,0x22,0x40,0x4b,0x68,0x23,0xbd,0x24,0x67,0x54,0x93,0x14,0xa0,0x00,0x01,0x66,0x4a,0x08,},"\x42\x7b\x5a\x01\xe8\x59\x7f\x04\xfd\x42\x2f\x0a\x66\x2d\x0b\xe2\xdf\xa8\x53\xed\x5f\x9d\x3f\x60\xff\x90\xf2\xc5\xee\x08\xbb\x59\xfd\x03\xd4\x02\xb7\x54\xca\xf5\x4d\x00\x58\xf5\xa2\xcf\x87\xaf\x4f\xef\x21\x77\xd5\x9e\x18\x22\x62\x93\xfd\x2a\xf3\x76\xbc\x98\x7b\xf7\xb3\x20\xb9\xd1\xe2\x49\xab\x9e\xfb\x75\x07\x8e\x6d\x3d\xf2\x9e\x03\x50\x47\x76\x35\x43\x44\xaa\x69\xe7\x2e\x1e\xbc\x52\xa3\xc3\x8a\x4c\x2a\x16\x73\xb4\xe9\x74\xa2\xe4\xe1\x2a\x2e\x78\xea\x3e\x3f\xe5\x0c\x53\x63\x0d\x09\x6d\xa3\xe2\xfe\x82\x99\xf7\x1a\x1b\x44\x1b\x4c\xf0\xca\xeb\x93\x7a\xfa\x4a\x0e\x39\x15\xcc\xab\x39\x96\xc9\xf6\xa8\xf4\xfd\x37\x54\x3e\x8f\x75\x90\x0c\xfd\x47\x17\x53\x70\xef\xb8\x52\xa5\xf6\x9d\x67\x36\x83\xf9\x98\xfd\xcf\xf8\x5f\xf8\xf3\x2b\xaa\x80\x70\x66\x60\x44\x22\x02\x7d\x51\xa4\x35\xdd\xf9\x88\xed\x2f\xd8\xeb\x19\x1f\x10\xb4\x68\x07\x42\x00\x08\x75\x6e\xb4\xe3\x00\xc4\x09\x9c\x2d\x64\x50\xbc\xc6\xa4\xe7\xd0\x67\x31\x56\xb8\x37\xf0\x50\x63\x38\xf3\xd1\xb5\x73\x4b\x16\x6c\xa5\xcc\x2f\x24\xa4\xef\x02\x6c\xda\x2c\x4a\xe3\x10\x5b\x63\xca\x85\x70\xd1\x85\x46\xcf\xac\xb8\x60\x42\x96\x6a\x00\xef\x52\xc7\x29\x90\x19\xf6\x8a\x2d\xf0\x8c\x8b\x70\x4e\x85\xe7\x13\xc3\x48\xd7\xf1\x67\x76\x60\xe1\x8e\xba\xb5\x9b\xf4\xe1\x2e\x6f\xf2\xd7\x83\xd8\xd5\xd4\x2a\xab\x6e\xf0\x17\xb7\xa1\x96\x6a\xee\x8d\xc1\x4d\xda\xbe\xd4\x9b\x4b\x64\x3d\xf4\xe9\xb0\xb6\x03\x83\xc7\xd8\xb4\xb8\x8c\x65\xa8\x98\xc1\xc7\x7d\x43\xd6\xbd\x68\xb2\xa5\x74\x3f\x1f\xed\xd6\x54\xdc\x84\x49\x6d\xa0\x2c\xeb\x69\xb9\xb4\xd3\xa8\xe0\x0c\xcd\x72\xe7\xc7\x5f\xc5\x0a\x8d\xd0\x87\xe1\x83\xe6\xc1\xf5\x79\xba\xeb\xc5\xc6\x3f\x28\x07\x93\x67\x91\xb5\xfe\x48\x47\xcd\xcf\x15\x17\x74\x23\x52\x05\xcd\x2d\x7b\x8b\xf4\xae\x88\x19\x22\x5e\xa7\x08\xb7\xba\xac\x66\x99\x8f\x0c\xba\xb2\xc7\xdd\xf2\x51\xf3\xb1\xde\x10\x17\xd3\x97\x69\x22\x05\xee\xa6\x39\xf1\x2d\x77\xbe\xef\x6c\x13\xbb\x12\x10\x0f\xf8\x90\x64\x70\xbc\x7b\x21\x29\x80\x53\xbe\x1a\x61\xb7\xb3\xa4\x99\xed\xc3\x10\x99\x6c\x8b\xc0\x87\x19\x07\xca\x46\x8e\x89\xed\x31\x1a\xdc\xa2\xe2\xb8\x29\x30\x97\x5b\x3e\xfb\xbf\xc0\x3c\xdd\xf4\xd9\x48\xc4\x76\x5e\x8c\x10\x59\x08\x82\x16\x9a\xcd\xdb\x8f\x8c\x36\xd8\x4c\x2d\xac\x3b\x79\x8e\x7a\xbf\x84\x47\x12\xfa\x45\x8d\x27\x7c\x24\xe8\x14\x04\x7d\x74\x23\x19\xa8\x34\xdd\x9f\x92\x7a\x2b\x44\x85\xef\x13\x74\x5f\x7a\x60\xdd\x6b\xb3\x37\x93\x63\x04\xc9\x7d\x3f\x9f\x14\x4e\xb2\x9b\xb6\x95\xb8\xdc\x31\xb9\xd8\x49\x10\x61\x1d\x28\xd5\x81\xca\xa9\x36\x5d\x6d\xff\x52\xd4\x10\xa4\xad\x52\xbd\x12\x17\x29\xff\xf5\x28\x88\xf4\xda\xae\x17\x07\xf6\xf5\x6d\xac\x61\xff\xb9\x96\x1c\xda\x71\x76\xaf\x44\x60\xa6\xd5\x54\x2a\x20\x44\x6f\xb5\x14\x7f\xce\x72\x72\x04\xce\xc6\x89\x9b\x9a\x3d\x4f\xf6\x22\x6b\xb8\xa1\xc7\x8e\x36\xfc\xdd\x9e\x50\xc0\x40\xd7\x2d\x0f\x40\x07\xd3\xfa\x9a\xa7\x67\xe4\xab\xd0\xad\xd6\x2f\xdb\xcc\xde\xff\x67\x21\xeb\x25\x9e\x00\xa7\x21\x63\x20\x06\xbe\xde\x0d\x17\x3d\x38\x34\x4d\xea\x44\xf9\x6b\x67\xd9\xa2\xee\xa1\xd2\xaf\x5f\x74\x8e\x8e\xbd\xb4\x41\xbf\xb4\xe5\x8e\x2d\x42\xfe\xc7\x40\x56\x6a\xcf\x73\xa3\x03\x35\x8f\x7d\x89\xc8\x15\x8c\xf2\x1f\xe8\x5b\x0d\x4a\x41\x7e\xbd\xc8\x6d\x04\x69\xf6\xb9\x1c\x24\xad\x61\x0d\x48\x6d\xed\xc2\x18\xb2\xce\x7a\x8b\x96\x75\x47\x23\x15\x1f\x0d\x00\x76\xff\xf9\xf1\x9d\x11\x2d\x9c\x05\x92\xfb\x8d\x92\xc9\x9d\xcb\x8d\xdf\xaa\x46\xfb\xe0\xd9\x2d\xf4\x6b\x8c\x00\xca\x43\x45\xad\xb6\x9a\x5a\xca\x69\x4a\x86\xcf\x30\x64\x64\x51\xbb\x17\xba\x6e\x60\x7a\x91\x2b\xf1\x09\xd5\xfc\x2d\x3e\x27\xd0\x0d\x94\x56\x00\xa8\xa5\x7c"}, -{{0x43,0xbf,0xb3,0xdb,0xe4,0xd9,0xbd,0xaa,0x82,0xb3,0x54,0xdd,0x59,0x63,0x34,0xe6,0x60,0xd7,0x6f,0xc0,0xb2,0xeb,0x69,0x89,0x93,0xae,0xf3,0x76,0x7f,0x1c,0x7c,0x7f,},{0xd0,0x0a,0xec,0xef,0xf0,0xce,0xb8,0x32,0xc2,0x51,0xd1,0xfe,0x6b,0xcb,0xea,0xea,0xcb,0xb4,0x11,0x3f,0x52,0x81,0xba,0xba,0x4e,0x87,0x8f,0x7b,0x95,0xf9,0x3f,0x07,},{0xa9,0x99,0x55,0x23,0x02,0x0a,0x0d,0x22,0x2b,0xc4,0x8f,0x98,0xd0,0x55,0x04,0xe3,0x06,0x8f,0x30,0x4a,0x6d,0x19,0x70,0x06,0xcc,0x9c,0x03,0x5e,0xea,0xde,0x09,0x9e,0x7a,0xa9,0x7e,0x90,0x89,0x4e,0xad,0x17,0xe8,0xc3,0x0b,0x0a,0xa4,0xa9,0x80,0x88,0xf0,0x38,0xb9,0x22,0x44,0xc4,0xb2,0x0f,0xde,0x96,0x4f,0x85,0x34,0xe8,0xfb,0x03,},"\x3f\x3e\xed\xdc\xae\xf4\xe1\x66\x2a\xdb\x66\xbb\x1b\x20\x7d\x79\x3f\xcb\xef\x81\x50\x05\xe8\x26\x43\xed\x70\xc9\x85\x54\x03\xda\xc2\x8b\x52\x07\x27\xa9\x01\xa5\x32\xd2\x8b\x9b\xd1\x34\x8d\xb2\xf8\x96\x7b\xbb\x8c\x90\x98\xb0\x7f\x57\x0a\x2e\xae\x1e\xe4\x82\x64\x0c\x0b\x67\xa5\x2a\x38\x61\x21\x33\xa1\x5e\x25\x8e\xde\x38\xcd\xa8\x78\xff\x36\xed\x32\x1d\xff\x87\xcc\x6a\x01\x38\x3b\xa8\x40\x67\xd6\x0a\xf4\x17\x76\xac\xf8\x0a\x8a\x4e\xac\x77\xf7\xd8\x7c\x37\xa7\x04\xa3\xe2\xac\xa1\xe8\x81\x5e\x49\xfb\xca\xb7\x97\xc8\x56\x52\x95\x38\xbe\x07\xd5\x16\x96\x32\x1f\x69\xb0\x9b\x5d\xc5\xa1\x5e\x5f\x0e\x4c\x22\xd2\x28\x37\xf6\x2e\xe4\xc8\xbc\x7f\x25\xa9\x48\x7b\x96\x2c\xc2\x0f\x13\x3f\xcb\x87\x0e\xd1\x25\xcc\xa5\x85\xd1\x81\xbd\x39\xf9\xdf\xa6\x61\xf1\x9b\xe7\x6d\xa7\xf6\x5f\x22\xfb\xbc\x80\x75\x2a\xeb\x39\xe8\xd5\x9e\xd9\x6e\x14\xf5\x95\xd0\x49\x29\x40\x2b\x50\x29\xc6\x0c\xee\x37\xc0\x21\x7b\xc5\x31\xd8\x0d\xb3\x41\xda\xce\x3c\xce\x76\xe6\x43\xaa\xc5\x38\x87\x47\x3e\xdc\x6e\x19\xcb\x39\xfe\xcf\x6a\xf4\x24\xa2\x06\x63\x93\xd1\xc3\x3f\xc7\xb9\x36\x76\xd7\xe6\x10\x5b\x9b\xfc\x96\x7d\x1e\x29\xaf\xdc\x4c\xf1\x5b\xca\xfa\x09\xc2\x95\xa6\xf9\xde\xee\x33\x1a\xb3\xb0\xd4\x93\x12\x6e\x2b\x2f\xff\xb4\x2a\x6b\x68\xe7\x9e\x13\x8d\xb5\x50\x82\x72\x62\xe4\x87\xa8\x3f\x37\xf0\x1d\xd7\x92\x2b\xe7\x5e\x92\xfc\xf5\xd9\xd4\x80\x3b\x3a\xc2\xf3\x5d\xa2\x10\xfb\x38\xb2\x63\xb0\xff\xb6\xc2\x70\x8d\x4b\x55\xb7\x57\xaf\x52\x07\x7a\x7e\x31\x84\xd0\x1e\x82\xf6\x4d\x32\xcc\xe4\xfd\xee\x0f\x8d\x4e\x36\x4b\xcf\xb9\x58\xeb\xbf\xdb\xb6\x22\xb3\x8b\x51\xe9\x30\x27\x1c\x7b\x1b\x70\xaa\x9d\x4b\xb3\xaa\x4b\x99\x7c\x52\x14\x4d\x3a\xa6\x21\x62\x57\x3a\x3a\x1d\x9c\xe4\x6c\xdb\xee\xb8\x44\x9f\x12\x25\xc4\x49\x63\x1e\x88\x97\x52\x1c\xd0\xf6\x37\xb7\x21\xa1\x25\x2b\x8a\x10\xab\x0b\xe8\x70\xaf\xbc\xd8\x9d\x58\xb2\xeb\xb6\x32\x11\x95\x0c\xad\x7a\xb8\x2c\x81\x95\x02\x6b\x50\xea\x8b\x77\xb9\xe9\x0e\xd5\x59\xaf\x44\x84\x30\x88\x51\xa3\xa1\x56\x71\x68\x53\xa8\xac\x4e\xcb\x8c\x5c\xc7\xd9\x35\xb0\xf4\x66\x12\x41\x43\xb1\x17\x7f\x05\xd0\x8b\x97\xd1\xad\x54\x2e\xd2\xc2\x46\x5a\xf1\x85\xe7\xdb\x42\xb6\x9c\xb8\x02\xa7\x17\x94\xa3\x13\x98\x83\x02\x96\x70\xc9\x56\x74\x2a\xaa\xd7\x90\x7a\x71\xd9\x59\x85\xfc\x1d\x45\xb6\x59\x97\xb4\xec\x6c\xe8\x25\x5d\xe9\x59\x27\x0a\xfa\x7d\xe9\x0f\x29\x29\xde\x63\xf9\xb1\x72\x11\xd7\xf1\xae\x82\x0a\xda\x9c\xe3\xe4\x86\x49\x17\x9d\x60\xb0\x14\x94\x93\x48\x1f\x01\xd4\x59\xdb\x7d\xad\x05\x26\xb5\xbd\x9f\x4b\x33\x80\xd2\x5b\xa2\xc5\x02\xba\x8f\xa3\xc4\xd4\x13\x1b\x46\x62\xad\xde\xfb\x41\x82\x7f\x75\x9f\xa7\x1d\x44\x7d\x5f\x02\x92\x45\xf4\x8c\x62\x2e\xb7\xc6\x8c\x8e\x71\x08\x1f\x7f\x78\x9d\xe7\xa2\x83\xd2\xed\xa8\x3a\x7d\x17\x22\xa0\x5f\xb7\x2e\x17\x60\xc2\x40\x40\xc4\xd8\x34\xde\xf5\xdf\x5f\x74\x2e\x02\xb3\x04\x51\xc8\x93\xbc\xf7\xd7\x71\xdb\x78\x4c\xbb\xda\xec\x87\x6d\x8a\xc8\x67\x43\xb5\x29\xa2\x92\x00\x7a\xc7\x53\xc9\x9a\x57\x99\xcc\x32\x4f\xe5\xeb\xb5\x44\x8a\xb5\x54\xb1\x0d\x41\x36\x97\x4a\x12\x54\x2d\x25\xc6\x14\x7c\x67\xc5\xd2\x33\x6c\x9d\xb7\x5c\xba\x2f\xd6\x08\xcd\x43\xab\x95\xbe\xac\xd0\x43\xa1\x34\x9c\xef\xa8\x28\xe2\x3b\x5f\x0b\x6e\x0e\x29\x51\xf3\x35\x3b\xb9\x2b\xfd\x1f\x0a\x49\xc3\x3f\xb3\xcf\x37\x99\xa0\xb5\x43\x19\x8a\xd5\xd0\x3d\x26\x3c\x1a\x06\xc3\x5a\x26\xad\xe1\x51\x84\x91\xc8\xc1\xd2\x7a\x2d\xb0\x33\x80\x89\x32\xcd\x1c\x47\xb5\xa1\x26\x98\x5a\xcb\x8d\x88\x83\x60\xee\xcc\xfe\xb3\xbf\x51\xb0\xd1\x89\xb4\x19\x04\x40\x40\x4d\x12\xfb\xa6\x5d\x0a\x7a\x14\xc6\x20\xc5\x55\xf8\x22"}, -{{0x51,0x4e,0x07,0x0b,0x01,0x90,0xd1,0x8c,0xbe,0x98,0x1a,0x5a,0x15,0x1e,0x77,0x53,0x39,0x8a,0x27,0x2b,0xcf,0x01,0x48,0x13,0xad,0x37,0x97,0x22,0xc3,0x6e,0x13,0x3d,},{0x6f,0xbd,0xe0,0x47,0x4c,0xc4,0x81,0x0e,0xff,0xa5,0x0a,0x07,0x82,0x0c,0x96,0x5a,0xa0,0x03,0x95,0xff,0x3a,0x5b,0x3e,0x2e,0xdd,0x7d,0x35,0x6b,0x7d,0x6a,0xef,0x2b,},{0xb6,0xc3,0x55,0xc9,0x58,0xb5,0xba,0xa7,0xeb,0xe9,0x77,0xa9,0x3f,0xcf,0x53,0x95,0x89,0xa3,0x66,0xd4,0x01,0x60,0xe4,0xe0,0x31,0xb8,0x8a,0xb9,0x64,0x02,0xc7,0xbd,0x57,0x7f,0xf6,0x35,0xfc,0x07,0x78,0x24,0x23,0x59,0x8d,0xca,0x43,0x66,0x81,0x24,0xa8,0xb2,0x87,0x51,0x0e,0x2c,0xfd,0x07,0xa1,0xe8,0xf6,0x19,0xf6,0xc8,0x54,0x0a,},"\x83\x14\x55\x76\x2a\x5d\x80\x09\x7b\xb2\x84\x50\x42\xf4\xc8\x76\xe7\x10\x85\x35\xbe\xd6\x83\xe8\xc4\x46\x19\xd0\x81\x54\xa2\x29\x44\x4b\x10\x1e\x3e\xd7\xc0\x15\x07\xe8\x70\x94\x14\x46\xaf\x97\x8c\x0f\x53\x41\xd1\xac\x1d\xd1\x5b\x14\xe8\x96\x67\x12\xdf\x19\xf5\x2f\xeb\x51\x03\xcf\x62\xb6\x63\x27\x56\x44\x6c\xc7\x54\xdf\x00\xa3\xf6\xdd\x71\x99\x68\xa2\xce\xf6\x6c\x3a\xdf\xb7\xd1\xfc\x49\x1f\xbb\xf3\xd5\x92\x94\xab\x34\x61\x9e\x17\x6d\xb0\xd4\x46\x15\x1e\x37\xea\xa3\xda\xf1\x72\x40\x6e\x98\x3d\x9d\x23\xa6\xb6\x9e\x92\x97\x60\x30\xf5\xac\x70\x40\xad\x51\x14\x12\x9f\xea\xf9\x7a\xf1\x5b\x22\x96\xfa\xe7\x04\x92\xdb\xbe\xb2\xb4\x82\x76\x87\xfb\x79\x87\x15\xc9\xbb\x2c\x32\x55\x7a\x81\xd8\x91\xb8\x97\x05\x29\x00\x70\x71\x59\x75\x1f\x07\xdb\x07\x4c\x77\xf0\x71\x96\x71\xf1\x76\x66\x89\x02\x9a\x3c\xdd\xf3\x9d\xf3\x48\x3c\xf2\xb0\x4f\x71\xc2\x5d\xe0\x5f\xc2\xd0\x2b\xb4\x8e\x53\x9e\xaf\x1a\x32\x16\x46\xcd\x80\xef\x2f\x0a\xc7\x03\xf4\x5e\x73\x89\x53\x08\x00\xe5\xd4\x17\xcc\xea\x8a\x5c\x08\x66\x82\xf0\x47\x45\xd5\x0b\x5d\xfc\x8f\x6e\xdc\x87\xa9\x5c\x7d\x20\x2a\x9c\xfd\x99\x87\x14\xb7\x46\x92\x0e\xbb\xe2\x33\x5b\xca\x1a\x01\x71\x76\x20\x16\xf5\xe4\xbd\xa8\x9c\x57\xd0\xed\xc6\x91\x0c\x6d\x22\xc8\xf9\x09\xda\x3d\xb1\x35\x2f\x0c\x8b\xd1\x8f\x3b\x5a\xac\x25\xf1\x93\xb8\x94\x70\xf9\x76\xbc\x4f\x1a\xff\xb3\xc6\x6b\xc5\x87\x6c\x6f\xe2\xac\x75\x08\x53\x3d\x97\xbb\xcf\x77\x11\x9d\x9a\xae\x19\x3f\x07\xe0\xb6\x4b\x46\x1c\x9c\x6c\x3b\x9d\x29\x3b\xd3\x7d\xe3\xd8\xe1\xab\x1e\x8d\x87\x2c\xd9\x4e\x6c\xf0\xeb\x68\x43\x9f\xdc\xd3\xb2\x5c\xe8\x48\x34\x60\xbd\x8b\x7c\xce\x88\x9f\xb7\x22\xb4\x36\x1e\x11\x8d\xa9\x83\xef\x4a\x9e\x45\xce\xbc\x0c\x1b\x82\x29\xea\x53\xe6\xf5\x55\x05\xf6\x44\xe0\x9a\xca\xa4\xc4\xb8\xcc\x64\x0b\x2c\xd2\xb3\x12\xe1\xc3\xa2\xc0\x26\x69\xe1\xf9\xc0\x63\x11\xc7\x8d\x36\x00\x09\xdb\x9e\x67\xc3\x9b\x49\xd1\xe5\xd7\x70\xc0\x1d\x28\x4b\x0a\x17\xa4\x1b\x4e\x7c\xa7\x45\xd6\x65\xec\x07\x50\x0e\x4d\x9f\xc8\xeb\xc1\xcc\x6a\xf5\x3a\x3f\xc7\x6b\x0c\x3f\x14\x31\xd4\x98\x43\xf2\x0e\x18\x27\x82\xc8\x2b\x3b\x5a\xae\x36\xfe\x20\xca\x64\x26\x18\x06\x8b\xe2\x33\xd4\xb5\xef\x9e\xae\xff\x40\x15\x36\xdc\x59\x3a\x2b\xc1\x83\x44\xf5\x5a\xc5\xd5\xfc\x7b\x3e\xb5\x06\xd1\x1c\xb3\x75\x33\x00\x63\xc6\x20\xc5\x33\x4d\x72\x3c\x7d\x1f\x04\x28\x16\xbc\x47\x85\xb3\x5a\xc0\xe6\xf1\x74\xf7\x36\x87\x8b\x7b\x49\x16\x58\xca\x67\xd8\xfc\xab\x53\x8f\xc6\xec\xd2\x77\xea\xd9\x0d\x95\x4b\x46\x0d\xa4\x25\x3a\x1c\x3a\x30\xb3\xd8\x92\x8f\x69\xac\x98\x76\xa2\x89\x19\x69\xfc\x2d\x06\xa6\x68\x99\x2b\x8e\x21\x15\xdf\xe5\x35\x8a\x71\x24\xba\x7c\xcf\x42\x1d\x80\x54\xea\x04\x34\x44\xcd\xeb\x40\xb7\x16\xdc\x7a\x36\x59\xa3\xca\x94\x34\x72\x93\x48\x90\x60\xe2\xcf\x67\x12\xa2\xa6\xc7\xb8\xad\x14\x67\x85\xfc\x40\xcc\xb9\xda\x28\x78\x30\xd0\x11\xd0\xd2\x4d\xf3\xe7\xaf\xbe\x97\x2d\x6f\x41\x7d\xe5\xcd\x75\xf2\x59\xea\x07\xca\xfd\xde\x20\x5f\xc0\xa3\x65\x13\x5c\x23\x2c\xbd\x7c\x1b\xc5\x39\xfa\x4b\x7e\x1c\xce\x35\x18\x52\x37\xc2\x3f\x80\xae\x97\xc1\x86\xd0\xd3\xb1\x05\x03\xd5\x98\x4a\x20\xec\x41\xc3\xcd\x04\x2c\x28\xa4\xc3\x1f\x95\x74\xb0\x6a\x87\x2b\xf9\x59\xab\x0a\xdd\x1f\x5d\xee\x14\xa1\xe7\x41\xef\x23\x8d\xfc\xde\xc0\x85\xaa\x08\x8d\xcf\x39\xa3\x6d\xda\x8f\x2a\x85\xed\x0d\x36\x2c\xcb\x00\x5d\x02\xe5\xac\xcc\x09\x2a\x37\x6d\xc1\x1a\x56\x61\x70\xd5\x83\xdb\x35\xf1\xde\x0b\xe3\xf1\x59\x08\x59\x6e\x9b\x78\x1a\xc8\x1b\xe0\x7b\x9b\xd2\xaf\x46\xc5\x6f\xb4\xd9\xd8\x42\x76\x01\x1e\x46\x18\xb7\xf7\x6f\x96\x79\x4c\xd0\xfd\x57\xed\x41\x4b\x63"}, -{{0xbc,0x79,0x0a,0x73,0x85,0xdd,0x1d,0xdd,0xc7,0x62,0xe3,0xb2,0x02,0x21,0xdc,0x07,0x8b,0x6c,0x3d,0xa8,0x98,0x6d,0x41,0x80,0x94,0x07,0x27,0x25,0x7c,0xfd,0xcd,0xf1,},{0xc9,0x26,0x46,0x26,0xf6,0x8f,0xed,0xb5,0xb3,0x9c,0x28,0xf0,0x30,0x45,0x3b,0x54,0xd0,0xd5,0x1a,0x98,0xb1,0x77,0x21,0xf2,0x61,0x1d,0x7f,0x27,0x7e,0xf4,0x8b,0x81,},{0x6d,0x6b,0xd6,0x5f,0x37,0x26,0x79,0xfe,0x9d,0x94,0x5f,0xf5,0x65,0x16,0x33,0x3e,0xce,0x0b,0x7a,0x25,0xb1,0x5a,0xd2,0x48,0x73,0x81,0x67,0x0e,0x53,0x6f,0x52,0x46,0x77,0x5e,0xb3,0x9a,0x11,0x4d,0xb2,0xb9,0xcd,0x50,0xf3,0x12,0xb3,0x60,0xd9,0xd0,0xbe,0xa2,0x95,0xdc,0x37,0xb8,0x17,0xb3,0x32,0x89,0x0a,0xdb,0x65,0xe4,0xc4,0x01,},"\x14\x3d\xd7\xbf\xbf\xf2\xad\xc7\x1f\x5d\x12\x3d\x47\x4e\xa0\x69\xdf\x14\xae\x92\x3e\xd9\xbf\x8f\x98\x91\xe6\x0b\xae\x43\xf0\xc9\xf5\x55\x37\xac\x9d\x1a\xe5\x23\xce\x4e\xcf\xd3\x3b\x20\xae\x44\x5e\x9c\x42\x63\x72\x05\x0f\xa5\x21\x7c\x1e\x4f\xb0\x13\x53\xeb\xf2\xe3\x29\x04\xef\x7e\xef\xcf\x72\xe8\x02\x3b\xae\x06\xbb\xb6\x40\xcf\x77\x7d\x5b\x0e\x11\x52\x7b\xc8\x35\x49\x3a\xd6\x98\x0a\x15\x7b\xb2\xd5\x0b\xe2\x33\x65\xe7\x2c\xbf\x0b\x3f\x20\x9e\xf0\xc4\x4a\x00\xb4\x1a\x62\x26\x24\x88\x09\x6c\xae\x5a\x69\x6b\x4d\x64\xcb\xad\x34\x50\x0d\x41\xfb\x4e\x4b\xc7\x0f\x8b\xf6\x21\x44\xd0\x1c\x22\x75\xd6\xd2\x9f\x5d\xe7\x5b\x17\x21\xd5\x04\x6b\x68\x29\x16\x44\x43\xeb\xfd\x9c\x17\x81\x31\x9d\x88\xf5\x40\x10\xed\xc2\x96\xab\xbe\xd0\x2b\x7d\xad\x9b\xa5\x85\xb5\x52\xe0\x00\x5d\xcc\xa4\x00\xbf\x4f\x45\x9e\xed\x7d\xb8\x6e\xa8\x61\x2b\xe9\xe9\x18\xdf\xd4\xe2\x70\x0c\x47\x10\x08\x32\x83\x62\x6f\xac\x75\x44\x17\xe0\x08\x7d\x26\xba\x14\x5d\xfc\x45\xb1\xc9\xbf\x7b\x4d\xd7\x0e\x6c\x50\x87\x47\xef\x80\x5c\x9a\x02\x42\x5a\xeb\xc6\x42\x1e\x0d\xeb\x6a\x79\xd8\x9a\xce\xee\xe0\x1e\xce\xcc\x9f\x3c\xa3\x65\x38\x38\x26\x58\x4c\x43\x0e\xbd\x39\xec\xf0\xa7\x28\x66\xae\x0a\xce\xca\x5a\xd4\xf0\x40\x5b\x67\x77\x9c\x04\xc5\xde\x03\x30\x61\x4d\xa3\x47\x0b\x80\x5d\x78\x7c\xe7\x9a\xc5\xa6\x96\xdd\x6f\x6b\x55\x39\xb1\xa6\x51\xb4\x24\xce\xfb\x19\x49\x1d\xa6\xe0\x88\x92\x23\xcc\x98\x39\x8b\x42\xc0\x04\x14\xff\x8d\x6c\x06\x27\xeb\x97\xcf\xf2\x0a\x8c\xbe\x7f\xcc\xb4\x1d\x81\x0f\xcf\xe8\x58\xca\x74\x75\x24\x7e\xf6\x28\xe8\x4a\x09\xd0\x12\xfe\x12\x23\x5b\x38\xc1\xcc\x9d\x82\xe2\xb6\x9d\x01\xd6\x21\x8c\xfd\x48\xe8\x5f\x26\xae\xad\xd1\x95\x40\x8c\xdd\x4c\x2f\x80\x6a\x89\x04\x1f\xd0\x31\x7f\xb1\xa7\xb6\x20\x9f\x90\x42\x70\xd3\x4e\x60\x61\x95\x04\x72\x88\xb0\xfb\x11\xa5\x72\x29\x38\xf6\x7c\x22\xb3\x13\xf7\xf7\x4b\x20\x25\xc7\x5b\xcd\x1e\xcc\x5a\x9a\xdd\x4a\x64\x0a\x41\xf2\x99\x6e\xb6\x6e\x5a\xf1\x96\x19\x8d\xb5\x8a\x3f\xb9\x93\x8f\x34\x9f\x92\x2a\x24\xd8\x6f\x4e\xd8\xa9\x6a\x09\xa1\x96\xc2\x4d\x6d\x01\xed\x76\xf3\x81\x6c\x05\xc4\xf2\x6b\xac\xa9\xb9\xd6\xdc\xc7\x9b\x58\x0d\xfb\x75\xd6\xc9\x05\xd4\x80\xda\xd7\x69\x51\x85\x4b\xda\x1c\xaa\x7f\x4a\x81\x95\x43\xae\xd0\x1a\xe9\x56\xbf\x30\x58\xfe\x8b\x3c\x7d\x5d\x72\x49\x62\xf1\xa6\xa8\x31\x43\xdd\xad\x27\x4f\xda\x3a\xd5\x78\xe9\x8a\xa9\x67\xc4\x10\xee\x57\x57\x5e\xf0\x1c\x02\x58\x56\x0f\x0a\x1f\xa4\xb7\x93\x27\x79\x6d\xe9\x94\x20\xcf\xd0\xa4\x15\x50\x63\x60\xf1\x24\x2c\xcc\x58\xa6\x88\x09\x27\x75\x0d\xbb\xff\x13\xd7\xc1\xb4\xed\x51\x9c\xda\x35\x72\x10\xf1\x2f\xb0\xd1\xc4\xd4\x8f\x04\x11\xbd\x7e\x05\x8c\xc4\xcb\x93\xd3\xc7\x75\x97\xe2\x65\x3f\xfa\x28\x2d\x3c\x2f\x12\x8a\xc3\x3a\x23\x7a\xf2\xfc\xbc\x9e\xf9\xc8\x11\xf3\x78\x14\xba\x2b\x0b\x85\x09\x3d\x0f\xd1\x8b\x8c\x6f\xb0\x9a\x43\xce\x52\x25\x4d\x23\xd5\x5f\x32\xe1\xd3\x24\x2a\xed\x1f\x23\xd9\xcf\x20\x4a\xa0\xdf\xd4\x4a\x34\x6f\xe0\x9e\x55\xa4\xa0\x6c\xf1\xbe\xf8\xbb\xf3\x7b\xa1\xf1\x59\x8a\x58\xae\xf8\x95\x01\xec\xba\xc0\x45\x35\x43\xe4\x80\xed\x0a\xdd\xe9\x0c\x84\x1d\x95\xeb\xd6\xeb\x23\xba\xa9\xf7\x0f\x83\xc1\x49\xea\xb3\x2d\x09\x13\xc7\x9b\x09\x93\xd0\xe1\xd3\x57\x4f\x0f\x54\x2e\x56\xa2\x06\x16\xcf\xe4\xa8\xbd\x7a\xae\xeb\xe0\xb0\x83\xdc\x2c\xe0\x14\x61\x78\xc0\x74\x82\xa0\x11\x29\xbc\x6f\xef\xdc\x81\x41\xc1\x38\x48\x94\xb6\x9c\xbe\x2f\x29\xda\x18\x8f\x7f\xd4\xac\x34\x1a\x2d\xf6\xfd\x90\xde\xe6\xa4\x46\xd2\x74\x63\x24\xc7\x5c\x1e\xf5\xb1\xac\xe1\x87\xd3\xbc\x16\xd7\x05\x59\x89\x29\x75\xd7\xe4\x71\x38\xf0\x40\x63\x85\xea"}, -{{0xdb,0x3a,0x44,0xdf,0x40,0xd2,0x55,0xa2,0x5c,0xf2,0x3f,0x53,0xc4,0x52,0x23,0xb7,0xd8,0xf1,0xf1,0xf1,0x11,0xba,0x07,0x40,0x6b,0x71,0xe1,0x84,0xa8,0xcd,0x06,0x12,},{0x6b,0x12,0xbd,0x95,0x80,0xae,0x20,0x7a,0x9b,0x0b,0xaa,0x82,0x87,0xb8,0xbb,0x86,0x66,0x93,0x73,0xee,0x5e,0x5a,0x62,0x5a,0xb4,0xa6,0xef,0x2d,0x08,0x71,0x25,0x97,},{0xcc,0x28,0xb5,0xef,0x4b,0x97,0x73,0x63,0x7f,0xae,0x7e,0x5f,0x08,0x4b,0x69,0x94,0xaa,0x35,0x98,0xf8,0xf4,0xa6,0x5d,0x0b,0xb2,0x01,0xd1,0x72,0xd8,0x61,0xa3,0x01,0x49,0xb3,0x33,0x8d,0x3c,0x3a,0xb7,0x5b,0x32,0xb2,0x55,0x95,0xcd,0x8b,0x28,0x96,0x30,0xc3,0x37,0x6a,0xcd,0x10,0xba,0x2a,0xb2,0x6b,0xc1,0xab,0xa9,0x00,0x84,0x0e,},"\x52\xdd\x8b\xa4\xff\xfa\x34\x4d\x1e\x08\x11\xd9\x67\x5c\x31\x3f\x9c\xc0\xe5\xa1\x38\x47\x86\x91\x98\x9d\x2b\x7f\x73\x89\x02\x50\x68\xfa\x35\xf7\x4f\x9a\xea\xf1\xe9\x56\x65\xec\xf8\xd5\x70\x7f\x75\xf6\x5f\x22\x56\xee\xa9\x33\x98\xbe\x59\xc0\xd5\x38\xf5\xe8\x58\x4b\xfb\xb3\xa2\x40\xf5\x01\x6d\x79\x27\x23\x4c\xb3\xea\xc3\x5b\x39\x1b\x8b\x53\xf2\x0e\xd8\xba\xe0\xba\x11\x08\x96\x94\xbf\xea\xde\x11\x07\x16\x56\xd4\xcf\x18\xef\x2d\x36\x81\x92\xe0\x4e\x08\xe3\x02\x4f\xc1\xd2\xfd\xa6\x31\x2a\xfc\xa6\x8d\x10\xc9\xc3\x36\xa0\xe3\x68\x50\xbe\x1a\x4f\x35\xb0\x33\xa8\x5a\x2a\x95\x49\xf2\x67\x3a\x99\x5f\x2a\x9a\xb4\xbd\x46\xc8\xfd\x2d\x83\x8e\x64\xf7\x61\x71\x34\x27\x32\x9c\x9a\xf5\xe4\x21\x1a\x22\xab\x20\x8a\xaa\xb8\x0e\x19\x4c\xd0\xf6\xa5\x02\xb3\x08\xfe\xd6\xc5\x83\x51\x78\x01\xa4\x8e\xd4\x33\x0e\x2f\xad\xdc\xd4\x18\x09\xc3\x91\x9b\x30\xe8\x4d\xb3\xc6\x87\x31\x03\x1e\x79\x85\x7d\xd9\xf9\x7f\xfd\x12\x54\x7d\xa7\x06\x67\x98\x07\x41\x51\xec\x88\xa5\xfa\x96\x3b\x9d\x9d\x83\xba\x2f\xee\x13\x58\x33\x95\x0e\xf7\xbc\x62\xb3\x40\x1e\xa1\x1b\xb3\x6f\x25\x56\x1b\xc0\x52\x2b\xb0\x2d\x8d\xad\x05\x43\xf6\x3d\x54\x7b\xe7\x7d\x0a\x4c\x9b\xf6\x5d\x42\xf3\xa2\x76\x14\x4d\x2e\x47\x4e\x29\x42\xf3\x79\x02\x21\xe2\x6f\xba\xe7\xca\x91\xef\xd8\x59\x21\x99\x08\x35\xfa\xfb\x6d\xc6\x74\x63\x5c\x96\x01\x82\x10\x38\xb5\x27\x11\x34\x3d\x1a\xa2\x5f\x1c\x46\xba\x4e\x3c\x6e\x71\x2b\xac\x19\xe5\x3e\xae\x30\xe5\x24\x6e\x4f\x04\xdd\xf2\xac\xdb\xb3\x41\x63\xc2\x43\x67\x76\x90\xbe\x0b\xf2\xe3\xfa\x16\x48\x70\xb5\xe6\xf5\x36\xb2\x2f\xb8\x9e\x5e\x8e\x1d\x87\xcd\xb3\x40\x44\x97\x7e\xd2\x83\x6e\x54\x4d\x7b\xa4\x93\xdd\x42\xa2\xb6\x49\xbc\xf3\x13\xc5\xb3\x9a\x1d\xbf\xff\x3e\x7f\x2a\x59\xad\xe8\x7d\x3e\x7b\x25\x8f\x58\xe5\x65\xfd\xba\x3e\x4d\x92\xb1\xed\xb8\xbf\xf5\x4d\xc4\x9d\x86\xc5\x3c\x03\x0c\xf5\x8b\x97\xef\x06\x6d\x24\x1b\x54\x05\x30\x21\x39\x05\x73\x9d\x8e\x1a\xa7\x2e\xd9\x0f\x68\x5d\x39\x58\xea\xa2\x42\xb0\xcb\xf7\xa2\xeb\x97\x6e\xe9\x6a\x63\xe6\x67\x86\x46\x41\x69\xa7\x42\xd4\x57\xe4\xd9\x11\x7c\x7d\x66\x42\x84\x45\xa4\x69\x30\xc2\x8b\xa7\xa2\x65\x82\x41\x80\x5e\xbe\x72\xc7\x8e\x02\x03\x5d\x26\x3a\x21\x1e\x59\x0b\x49\x0c\xdb\x84\x41\x50\x62\xee\xd1\x4f\x13\xb8\xa1\xa9\xe7\x7c\x8d\x7b\x75\x51\x5b\x18\xfb\x85\x38\x6e\x4a\x7e\x05\x39\x80\xd3\x0f\x48\x99\xe8\x38\x63\xbe\xe8\x75\x58\x58\x87\xc5\xf4\x8b\x51\x6c\xcb\x73\x1c\x4b\xca\xa3\xdf\x07\xd0\x47\x95\x81\x40\x96\xc7\x9d\x7c\x5f\xdc\x4d\xab\xf5\xe2\x6a\x4c\xa1\x83\x8e\x0e\x5d\x87\xdb\x71\x30\x9b\x81\xea\x7c\xe4\x61\xe5\xe4\x4c\x7a\xb2\xf1\x05\xad\x75\xc5\x43\xc1\xe9\x17\x9c\x36\xa5\xfa\x55\x5e\xc9\x22\xff\xed\x1b\x76\xd2\x58\x01\xdd\x74\xf8\x0c\xd0\xa6\xba\x7b\xc2\x0d\xb0\xad\x58\x0b\x7b\xbb\x9d\xdc\xfd\x93\xad\x1c\x5f\x20\xf3\xe2\x7c\x3e\xa3\xa1\xe7\x1e\xb7\x4f\xf5\xf9\x44\xcd\x3b\x98\xf6\xd0\x45\x29\x59\x30\x11\xc4\xae\xce\xf6\xdc\xaa\x60\xfb\x18\x36\x8c\xb1\x2b\x6e\x39\x1b\x3f\x5d\xf7\x65\xcb\xab\xff\x15\x89\x8c\x84\x79\x6f\xc2\xb5\x3f\xa4\x90\x0d\xad\x03\x4a\x13\xb0\xce\x14\x45\xad\xda\x4e\xf7\x19\xbe\x74\x14\x19\xe2\x31\xe9\x2f\x1f\x66\x7a\x32\x84\x2a\x42\xdb\x79\xbd\x7a\x01\x4a\x80\x9c\x81\x59\x6e\x82\x62\x73\xd1\x6f\xe5\xd4\x04\x58\x24\x2a\xe1\x0e\x12\xe6\x0b\x34\x89\x53\x0c\x66\x22\xb5\xbb\x44\x45\x4f\x29\x61\x6e\x47\xe9\xa2\x97\xce\x1c\xa0\x74\x13\x7f\xd9\xae\x13\xe3\xee\x8e\xdb\xcf\x78\xaf\x26\x54\x59\xdb\x1a\xf3\x42\xdc\x0b\x2f\xc8\x09\xbd\xa0\x15\xb5\xa8\x2b\x2b\x7c\x54\xef\xe4\xe5\xfc\x25\x2e\xb1\x3d\x66\xe8\x08\x93\x6f\x19\x10\xf4\xc4\x8b\xe0\xef\x7a"}, -{{0x77,0x96,0x4d,0xad,0x52,0xb5,0x79,0xb8,0x96,0x67,0x53,0xda,0x31,0x86,0xd1,0xc5,0xe9,0xd3,0x3d,0x33,0xa4,0xdb,0x38,0xbc,0x0d,0x7a,0x1a,0x6c,0x11,0x2c,0x13,0xc2,},{0xfc,0x25,0x12,0x5e,0x78,0x29,0xf6,0x42,0x34,0x37,0x5e,0x52,0xae,0x9f,0x77,0xae,0x10,0x13,0xf9,0x9d,0xf5,0xf9,0x96,0x5a,0xd2,0xaa,0x16,0x58,0x95,0x96,0xd0,0x91,},{0x3d,0x1b,0x4b,0x4e,0x82,0x0d,0x25,0x0b,0xe2,0xa8,0xfa,0x97,0x1e,0x59,0x9e,0x1e,0x98,0x97,0x75,0x28,0xb2,0xf9,0x30,0x18,0x96,0x81,0xa9,0x3b,0x05,0xe1,0xa7,0x06,0xfc,0x80,0xef,0xfa,0x94,0xe9,0x29,0xbc,0x43,0x92,0x16,0x56,0x89,0x73,0x88,0x28,0x8a,0x9b,0x29,0x27,0x1f,0x37,0xa1,0x4b,0xe0,0x14,0xb8,0x73,0xc6,0x8f,0xc9,0x04,},"\xc3\x39\xe7\x18\xa7\x57\xf3\xf3\xbd\x1b\xab\xdd\x2e\x00\xaa\xa5\xcd\x7f\xc9\x00\x5e\xe3\x4b\x6f\xdc\x09\xd7\x1f\xbd\x9c\x92\x89\xab\x1d\xd1\x4d\xba\x2c\xad\x58\xcb\x80\x51\x16\x77\x7b\xd8\x0c\x85\x96\x64\x33\xad\x46\xf9\xca\x6e\x54\xf1\x3d\xd3\xca\x7e\x56\xe4\x7f\xea\x41\xe5\x48\x8a\x45\xad\x53\xbc\x5d\x65\x74\x27\xe1\xd7\x93\x8f\x55\x19\xf1\xb0\x9f\x5b\xdd\x98\xaa\xe5\xac\x96\x43\xef\x78\xeb\xa4\x93\x49\x25\x33\x9a\x15\x5d\xc6\x68\x28\x57\x10\x02\x09\x7a\x11\xa5\xce\xe7\xb5\x1a\x44\x1b\x75\x6b\x0c\xe6\x5b\x77\x9a\xfe\x19\xda\x6a\x18\xef\xc1\x45\xf6\x09\x0c\xe7\x70\xde\x9e\x0e\x91\xf5\x43\x27\x0a\x09\x85\xea\xb4\x75\x29\x3c\xcf\xdd\x31\x41\xc4\x14\x2e\x47\x22\x23\x3b\x26\x74\x99\x44\x76\x41\x23\x5d\x72\x8b\xd7\x5c\xd1\xad\xc0\xdb\x14\x2f\x73\x31\xad\xdd\xf8\xc5\xee\xa3\xd5\x76\x40\x5d\x86\x99\x15\xb5\x60\xf9\x64\xe3\xe0\x00\x3c\x91\xf5\xe9\x6b\xff\xbe\xee\xc7\x3e\x51\x02\x4e\xf5\x2c\x55\xc6\xdc\xb5\x4d\x58\x20\x3e\x62\xf4\xdd\xb6\xe1\x37\xeb\x08\xe1\xbf\x13\x26\x01\x8a\xfd\x1a\x86\xca\xb6\xc8\x41\xe0\x66\x1c\xe0\xa1\xa7\xae\x96\x7f\x24\xc1\xa7\x7f\xc7\xca\x50\x5f\x72\xe5\xf7\x93\x6e\x39\xc6\xf4\x83\x7e\x25\x95\x19\x5a\x69\xcd\x67\x65\x10\xa7\x16\x1a\x4d\xc5\xe3\x18\xf3\xd4\xf3\xac\x0a\xf0\x3f\x8c\x4a\xe5\xbc\xe3\x93\x24\xe9\x73\x8a\xea\x49\xf0\x02\xd3\x2d\x16\xde\x23\x17\xe9\x5a\x9f\x32\xee\x60\x4e\x13\xdb\x80\x38\xb2\x64\xcf\xc1\x7a\xed\x29\xc9\xde\xbf\x81\x91\xde\x9e\x0e\xfc\x95\x1a\xd6\xd5\x48\x67\x06\x8c\xf5\x0a\x26\x9c\x37\xa2\x41\xf8\x52\x06\x78\x8d\x23\x14\x31\x77\xf6\x59\xcc\xa6\x6c\xfc\xe0\x3b\xc0\x50\x22\x55\x33\x7f\x16\xb3\xda\xd6\xf7\x91\x32\xab\xf8\x0f\xf1\x2b\x6d\x22\x81\xe6\x37\xeb\x6c\x71\xf7\x6e\x26\x33\xa1\x14\x56\x52\x40\xee\xd0\x0f\xab\xea\x9e\xd8\xde\x28\xc8\x32\x21\xf8\xcb\x48\x5f\x51\x2d\x90\x08\xbf\xc7\x4a\x36\x6d\x4c\x2b\x4e\xd1\x72\xd3\x67\xe0\x24\x7c\xb6\x50\x98\xc1\x10\x28\x2e\x83\x1d\xf8\xe9\xbd\x4f\xbd\x5f\x4d\xd2\xb7\xf2\x42\x0c\x23\xb8\x5a\x63\x7a\xa2\x26\x2c\x3c\xb8\x84\x05\xf7\x07\x30\xc9\xab\x4c\x9d\x0f\x22\x7e\xe4\xfa\x4e\xf9\x1e\xfe\x9a\x59\xb3\xe6\xd8\x43\xdb\x87\x9f\x56\x50\x05\x9e\x99\xf0\xe4\xa0\x38\x68\x38\xe6\xf9\x87\x6f\x67\xd5\x0f\x89\x83\x2d\xda\x5f\x30\xa9\xcb\xfd\x71\x01\x34\xf9\xb5\xb5\x46\x27\x49\x6a\xa3\xa4\x32\x12\xb0\x7f\x03\xdb\x11\xd3\xd4\xf8\x75\xd4\x1d\x1f\x4a\xc4\x59\x69\xdd\xef\x69\xf8\x1a\x06\xd2\xb0\xc6\x46\xc9\xcd\x93\x1c\xf2\x50\x2f\xef\x0d\xd3\x2a\xbb\xf0\x95\x1e\xd3\x03\xf5\x28\x48\x25\x93\x43\x97\xfc\x22\xe7\x86\x98\xd3\x5a\xd8\x1d\x82\x25\x6b\xf9\xe1\x54\x00\xa1\x09\x16\x23\xa9\x82\x6f\x1e\x57\x79\x23\x67\x41\x7e\xf0\x25\x86\xd6\x4e\x65\x0d\xa9\xac\xe2\xf1\x8a\xa0\xa1\x26\xd8\x67\xca\xc4\xb5\xd4\xc9\x1b\xf5\x20\x9e\x53\x59\x55\x63\x86\xf8\x27\x08\x3e\xb5\x3e\x8b\x47\x09\xff\xfa\xbe\x92\xc6\x1d\x78\xff\xb5\xda\xf1\x02\x74\xe2\x42\xa7\x00\x91\xf3\xf9\xb9\xd5\x96\xc1\x25\x8c\x9a\x63\x38\x4f\x4b\x05\xb0\x28\x66\x12\x22\x18\x1c\x0f\xca\x96\x5f\x0a\x2c\xb5\x6e\x4b\x55\x6d\x6f\xbf\xf7\x1b\x64\xd9\xb3\x58\xda\x31\xaa\x37\xc7\x4f\xf5\x96\x2f\xb8\xd9\x6a\x38\x3d\x04\x97\x24\xc1\x9e\x24\x9c\x9e\xdb\xb2\xa3\x75\xb2\x3c\xe3\x10\x4d\xa0\xec\x58\xd2\x63\x5b\xa0\x3b\x55\x42\x3f\xa2\xdb\x7e\xb3\x49\xa4\xfc\x58\xa1\xef\x54\x0e\xe9\xa0\x2c\x2e\x70\x3c\x68\xd7\xf8\x47\x5f\x43\x4d\xdd\x32\x00\xdb\x1f\x06\x74\x57\x91\xa3\xac\xc3\x16\x0d\xba\x50\xa3\x93\x44\x7f\xfe\xef\x6d\xc7\xb9\x8f\xb0\x66\x84\xcc\x90\xfd\x85\x20\x3d\x11\x9d\xcd\x81\x99\xe4\xd9\xa8\x9a\xe3\x46\x7a\xe4\xbb\x19\xfb\x71\xcf\x74\x70\x29\xc2\x40\x96\xf9\xa5\x0e"}, -{{0x5c,0xaf,0xd8,0x17,0xa4,0x41,0x0c,0xcb,0x27,0x12,0x17,0x23,0xef,0x32,0x07,0xc1,0x73,0x1a,0x08,0x61,0x94,0x5b,0xe9,0x62,0x71,0x4c,0x0e,0xd9,0x50,0x38,0xa1,0x95,},{0x4e,0xa0,0x86,0xbe,0x43,0xec,0xe1,0xc3,0x2d,0x08,0x05,0x9b,0xba,0xdc,0x9e,0x9a,0x2b,0x2f,0x4f,0x3f,0xe3,0x70,0xf1,0xf5,0xcc,0xd7,0xdb,0xde,0xc0,0xaa,0xf3,0x03,},{0x28,0x85,0x15,0xfa,0x72,0x59,0xf1,0xeb,0x58,0x7f,0xe8,0xa2,0xc4,0x03,0x43,0x4c,0x46,0xf8,0xd7,0xe7,0x5b,0x6d,0x22,0xbb,0x38,0x96,0x56,0x6c,0x01,0x7d,0x09,0xb6,0x98,0xc2,0xc8,0x07,0x79,0x9c,0x2f,0x65,0xf9,0xcd,0xb4,0xeb,0x58,0x15,0x1c,0xcf,0xc4,0x8d,0x10,0x80,0x61,0xa6,0xb3,0x14,0x84,0x32,0xb2,0xbf,0xc1,0xcd,0xab,0x05,},"\x50\xb2\xf0\x53\x42\x41\x80\x46\xd1\x6a\x30\xbe\x4f\xc6\x2b\x67\xda\xf6\xc1\x8d\x2a\x74\x24\x2b\x7c\xb5\x5b\xa9\x0a\xd2\x0b\x6c\xaf\xdd\x60\x15\x57\x37\xc2\x9d\xe4\x8a\xa5\xd7\x99\xfe\x54\x95\xfe\x59\xdf\x5a\x9b\x8c\x0a\x8e\x54\x18\x90\x47\x63\xfb\xad\x83\xea\x69\x86\x65\x1b\xac\x31\x11\x79\x39\xce\xf4\xe0\xc7\x99\x30\xd5\x2d\xfd\x7d\xb4\x3c\x31\xad\xda\xe3\xcf\x93\xe3\xef\xc5\xa9\x16\xef\xd0\xd6\x5f\xdc\x30\x90\x9f\xa3\x56\xcc\xbc\x52\x47\xd7\xaa\xa0\x67\x13\x1b\x6b\x48\x20\xfd\x02\xf8\xe3\x95\xf5\xa9\x70\x4c\x9b\xdd\x75\x60\xa6\x11\xd6\x25\x59\xa8\xdf\xe1\xd2\x85\x9c\x52\x48\x6c\xc1\x1e\xd3\x33\x19\x92\x48\x8f\x41\x75\x20\xd9\x20\xdc\x73\xa3\x2d\x4f\x08\x11\x00\x82\x50\x0f\x5a\x96\x2a\x30\x69\x32\xc6\xa7\x80\x29\x55\xce\xda\xd7\xab\xf5\x3b\x0f\x19\xfe\x47\x94\xa3\x1d\x6b\x85\x53\x80\x28\x43\x06\xcc\xff\x71\xa4\x00\x78\x59\xa2\x32\x8b\xb1\x90\x24\xc4\x3e\x10\xd7\x70\x64\xd8\x66\xd9\x62\x2d\x14\x2c\x27\x35\x4b\x84\xac\x3b\x4f\x82\x32\xf7\xa2\xf8\xaf\x64\x09\xd5\xcc\x75\x7a\x18\xef\x81\x3d\xfa\xf4\xb9\xbc\x04\x0c\xb0\x06\xd7\x7f\x14\x36\x41\xaa\x20\x36\xac\x7b\xc9\x28\xdc\x96\x58\x5d\x9e\x36\xc7\xbc\x9c\x56\x4d\x25\xf1\xc2\xcc\x0b\xea\xb9\xd5\xf2\x07\xe8\x4b\x21\x5f\x1e\x7a\xa6\xfc\x32\x82\x37\xb7\x9c\x39\x92\x3a\x4e\x09\xc7\xc7\x3d\xc6\xb2\x4b\x14\x16\x29\x4d\x79\x8a\x4e\xd5\xf7\x58\x33\x6d\x91\x5a\x87\x0a\x7d\x6b\x75\x92\xb5\xb8\x8a\xac\xe2\xdc\x5f\x26\x7b\xdb\x49\x11\x41\xcb\xba\xe2\xa6\x77\x40\x7c\xc0\x95\x5f\x96\x19\x62\x59\x93\x04\xba\x0b\x83\x96\x71\xa5\xc0\x00\xe9\x20\x10\x8a\x05\x29\x80\x87\xe4\x97\x70\xae\xee\xaa\xb3\x63\x27\x24\xcb\x0f\xc2\x28\x57\x96\xdc\x41\x48\x14\xfd\xa7\x8a\x54\xe6\x7f\x00\xa0\x2f\x77\xd3\xcc\xde\x1e\xd9\xd7\xb1\xde\xf1\x4e\xa1\xf6\x19\x10\xbd\xf3\x0a\x11\x96\xfc\x63\x51\xb6\x22\x54\xd6\x44\x5e\x6c\x90\x44\x5b\x16\xef\xaf\xe2\x89\xa2\x78\x4b\x92\xe4\x2b\x78\xa4\xa9\x00\xc3\x5f\x55\x63\x0b\xbb\x77\x62\xff\x9e\xb7\xfe\xf7\xd0\x4c\x90\xb9\x57\x1c\x4f\xc7\x60\xa4\x10\xdb\xfc\x25\x29\x91\xd0\xba\x27\xf2\xd4\x14\xfe\x64\xee\xfd\xff\x4a\xbc\x18\x81\x7c\x97\x06\xc6\x31\xbf\xa2\x03\x82\x1d\x3b\x92\xcb\x33\x8b\xaa\xf5\xd1\x23\x2b\x46\x26\x47\x95\x4d\x09\x02\x46\x2f\xb1\x69\x6e\x99\x1f\x07\xfa\x9c\x3d\xbc\xf2\x87\x29\x60\x83\x1b\x4d\xed\x92\xa4\x21\xcf\x21\xb7\x53\x16\x5f\xf3\x09\xef\xe2\xef\x54\x38\xc0\x12\x70\xd1\x0c\x6a\x03\xd3\x4f\x71\xeb\xc2\xda\xb1\xda\x90\xda\xa3\x57\x98\x4d\x24\x62\xbc\xb3\x5e\xe3\xde\x55\xc3\xa5\x5f\x8b\x98\xae\xc2\x11\x4f\x74\xc8\x43\x41\xa6\x41\x27\x86\x3c\x12\x0b\x5e\xca\xd9\xe3\x29\xa5\x75\x6a\xe4\xa2\x55\x5d\x84\x92\xcd\xa8\x35\x22\x5a\x8d\xeb\x3f\x9c\x15\x58\xf0\xd4\x25\xbc\x17\x2f\xf7\x64\x0c\xc7\x9d\x97\x80\x04\x16\xfd\x62\x94\xcc\xcc\x70\xcd\x1c\xf5\xb6\xa8\xe2\xaa\x07\x28\x9b\xd5\x22\xbf\x99\xdc\x96\xc3\x6b\xfe\xe8\x0e\x84\x6f\x5d\xd7\x46\xdd\x4c\x50\x03\xe4\xbf\x7d\x29\xef\xee\xa7\x50\x8a\x01\x61\x23\x68\x82\xc9\xa8\x2a\x56\xaa\x2c\x25\x74\x66\x96\x52\xc6\x30\x92\x3a\xb4\x70\xdd\xb9\x5d\x45\x6f\x7b\x8e\x8f\x07\x59\x9b\xa0\xd1\xd3\x8b\xc7\xf8\x17\x6e\x3f\xdf\x02\x09\xbd\x6f\x75\xd4\xcc\x11\x80\x3a\xfb\x18\x56\xcb\xc0\xe9\x1c\x73\x73\x0e\x4f\xb9\x8f\x3c\x94\x8a\x87\xd5\xa7\xed\xcc\x0a\x6a\x8a\xc8\x10\xea\x3e\xaa\x6e\x06\x3c\xec\x5f\x55\x66\xcd\x6d\xed\xc5\x37\xdb\x6d\x68\x6b\x80\x21\xf6\xea\x82\x5a\xd7\x47\x5e\xc7\xf1\xc5\xdb\xde\x45\xd3\xff\x4b\x5e\xe5\x1c\x0d\x04\xf1\xd7\x40\x18\xeb\x91\xe5\x04\x0d\x01\xc8\xb7\x1a\x4a\xab\xbd\xe6\x09\x4d\x4a\xfe\xcc\xb1\x8d\xfc\xde\xd7\x3e\xa7\x5e\x3b\x9f\x8c\xe1\x67\xdf\x62\x09\xae"}, -{{0xd5,0xca,0xc8,0x55,0x21,0xaf,0x78,0x1f,0x3d,0x5f,0x66,0x86,0x2a,0x04,0xb0,0x87,0xd0,0xcc,0xdc,0xac,0x92,0x6c,0xfe,0x9e,0x74,0x7b,0xe8,0xd5,0xc2,0x63,0x3f,0x78,},{0x10,0x0d,0xcc,0x53,0x03,0x9b,0xf0,0x5e,0xa0,0xa9,0xf5,0x88,0x82,0x12,0x69,0x3d,0x4f,0x9e,0x0e,0x75,0x25,0x95,0xbb,0xcd,0x02,0x06,0x10,0xe0,0xae,0x21,0x35,0x96,},{0x5d,0xc0,0x33,0x63,0x41,0x4e,0xea,0xc0,0x08,0x6f,0xb6,0xfe,0xba,0x44,0x21,0x7c,0xef,0x4c,0x52,0x0d,0xb6,0x19,0x26,0xdf,0x68,0x0c,0xa6,0x02,0xdc,0x11,0x00,0x3c,0xe6,0xaf,0xbf,0x3d,0x13,0xc8,0xc5,0xb0,0x52,0x73,0xd2,0x14,0x15,0xe6,0x7c,0x14,0xa2,0xee,0x5d,0x0b,0x1d,0x53,0x52,0x41,0x9a,0xb9,0xb3,0x9c,0x00,0x3a,0x51,0x0c,},"\xd5\xe7\xdd\x59\x49\x09\x37\x5a\x4b\xe0\x8e\x74\x82\x5d\x59\x8d\x53\x5b\xf4\x6e\xc0\x84\xde\x52\xb5\x73\x91\xc1\x27\xef\xf5\x22\x4a\xb2\xd1\x94\xdf\xb2\x66\x33\x47\x8d\x02\xfb\xda\x74\xd1\xdc\x58\x21\xf7\x91\xbf\x96\x2d\x8d\xad\x9e\x4e\xf2\x42\x24\x89\x19\x07\xb0\x18\x9c\xcc\xc8\xb1\x33\xd3\xaa\x20\x78\x92\x6d\xae\xf2\x89\x8c\x19\xc2\xe0\xbf\xe0\x20\x41\xa9\x04\xb9\xf0\x4b\xe7\xcb\x50\xae\xd0\xd9\x62\xd1\xad\xd2\x0b\x40\xa8\x8a\xb7\xab\xad\x62\x6c\xf4\xda\x0a\x78\xf9\xf5\x36\x85\x50\x1f\xdf\xa5\x85\x43\xdd\xf2\xea\x0e\xea\x69\xe7\xba\x16\x0f\x8a\x17\x7a\x25\xfc\x21\xe8\xa2\x9c\x66\x16\x33\xe3\x0e\x52\x3b\x0e\xc0\x1b\x2a\xee\xe2\xd4\x26\xe4\xae\xad\x45\x74\x88\x10\x8f\xe5\xf5\x69\xcf\x6e\x2f\xdb\x68\xc2\x8f\x2b\x30\x52\x82\x35\x77\xcd\x93\x4e\x7b\x06\x2c\x8a\x34\x24\xcd\x43\x67\xfb\x31\x5b\x74\x4c\xa3\x52\x55\xd7\xf1\xaf\x4e\xdc\x9b\xc9\xd8\x83\x71\x23\xd9\x79\x03\xb4\x3d\xf3\x67\xc7\xd4\x18\xc7\x93\x47\xff\xaf\xe7\xc7\xb1\x72\x4b\xba\x34\xed\xe8\xd3\x56\x8d\xb5\x05\x98\x3e\xad\x47\xf6\x2b\x56\xe3\x61\x8c\x11\xdb\x8f\xf0\xbf\x49\x2a\xc6\x75\x97\xd2\xf9\x6a\x6f\x42\x0f\xf9\x85\x34\x1b\x78\x6a\xd6\xce\xae\xdd\x10\x5d\x0d\x15\x63\xb2\xd5\x35\x43\xd7\x8e\x72\x56\x72\x5d\x20\x4e\x82\xed\x3a\x2e\x6a\x6e\x83\xdf\x61\xfc\x28\x2a\x62\xca\x06\xe6\x21\x74\xb5\x5b\xef\x40\xa0\xbd\xf8\xd2\x3d\x1c\x33\x0c\x71\x44\x14\x85\xee\x85\xe7\x0c\xed\x12\x1e\xac\x60\x7f\x58\x06\x78\x16\x3e\x4b\xd7\x5c\x67\x09\xff\x3b\x41\xde\x80\x59\x4b\x9e\x2f\x2a\xa2\x78\xfe\xfc\x21\xd7\x3e\xe3\xf7\x28\x54\xb9\x58\xd9\xa8\xf6\x3e\x3d\x70\xf7\xfe\xad\x8c\x3d\xca\x8e\x71\xbf\x4b\x9c\x2a\x36\xf2\x12\xb3\x2e\xb3\x29\x2e\x63\x55\x80\x38\x65\x59\xee\x1a\x11\xdf\x15\x29\x3a\x0c\x21\xcd\x73\x60\x86\x98\x46\xba\x5b\x7b\xa8\x5c\x99\x4f\x5b\x2f\x9c\xc5\x0e\x5e\xea\x8e\x4b\x36\x91\xd8\x86\x06\x2a\x18\xcf\xb1\x82\xf1\xe8\xb6\x11\xfe\x1b\xc2\x63\x15\x9c\xb8\xa0\x86\x78\x7c\x81\x1b\xea\x48\x12\x53\x00\x08\xc7\x0c\xa0\xc4\x7e\x64\xeb\x2f\xba\xd5\xb0\x27\x27\xa6\x6f\x2c\xdd\x6d\xde\x86\xf5\xd2\xa9\x64\x5a\x1e\x9a\xa6\x6e\xe0\xe1\x5b\x97\xf5\xfd\x22\x95\x96\xee\x02\xe6\x61\xca\xb9\xa5\x4e\xee\x1b\x81\xf9\x8f\xe2\x56\xed\x6c\x54\xfe\xaa\xa0\xba\x04\x7e\xea\x35\x33\x44\xf6\xe5\xc6\x2b\xe1\xe9\xd5\xc0\x9a\x2a\x69\x94\x11\x11\x0c\x56\xd1\x94\x9e\x90\xc0\x7b\x19\x38\xba\x95\x55\xac\x1b\xe8\x51\x1b\x51\x02\x18\xd7\xcd\xe7\xe1\xd7\x4a\x68\xaf\xb6\x42\xf8\x17\x15\xfe\x9e\x6c\x96\xc5\x03\x81\xae\x5a\x9d\xf3\x06\x51\x87\x85\xdc\x4d\xbc\x3a\x64\xf6\x0f\x24\x5c\x56\x4b\x80\x29\x51\x2f\x38\x1b\x56\xee\x78\x77\x03\x42\x68\x03\xc8\x0a\xb1\xc3\x11\xf4\x77\xb8\x91\x70\x8b\x59\xfa\x74\x8f\x32\xde\xbf\x54\xd2\x41\x37\x71\x97\x8c\x26\x5c\x9b\x87\x11\x4a\xdf\x25\xb8\x33\x7a\xa9\x3b\x0e\x63\x2a\x5b\x6e\xda\x47\x4b\xec\x16\x32\x81\x59\xfb\xed\x06\x7b\x00\xb8\x7a\xdd\x61\x96\x54\x92\xec\xcc\x6f\xd3\x46\x1c\x10\x00\xe4\x03\x7a\xb1\xe8\xac\x89\xa8\x52\x4f\x78\xae\x09\xd3\x08\xea\x6c\x94\xff\x88\x37\x32\xb7\x12\xee\xc0\xef\x07\x71\x8d\x33\xc0\x11\xb9\x39\x8f\x8c\xfe\xa7\x33\x07\x5a\xf3\x31\xfb\x3f\x97\xcd\xc1\xe8\xc9\x9f\x6a\x10\x72\x5a\x68\xc5\xc5\x8f\xdd\x8b\x0b\xaa\x50\x22\x7f\x34\xd7\x3d\x23\x90\x52\x03\x69\x8e\xaf\xf6\x26\x65\x4c\xe8\x3d\x86\x51\x08\x49\x9b\xe6\x86\x1f\x61\x41\xbf\xa6\x21\x9d\x7a\xb8\xb5\x84\x51\x91\x99\xf8\x80\xcf\xa1\xb2\x6d\x91\x94\xd3\x01\x71\x1c\x30\xfb\x44\x6d\x6e\xa7\x64\xa4\x31\x0f\x70\xe4\xb8\x59\xcf\x95\xfd\x44\xaa\xf8\xc1\xe2\x40\xe8\x0a\x71\x61\x1d\xbc\xf5\x2d\xa5\x8e\xdc\x32\x03\x11\xde\x38\x8d\x5d\x9d\x76\x9e\xb5\x9b\xe0\x93"}, -{{0x15,0x9a,0x9e,0xdd,0xea,0x5d,0xe6,0x34,0x03,0x98,0x7b,0x56,0x70,0xdb,0x6f,0xac,0x98,0xff,0xe5,0xec,0x3a,0x6c,0xf0,0x15,0x16,0xee,0x2c,0x70,0xce,0x3b,0x3b,0xe0,},{0xf6,0x1f,0x4a,0x04,0xa5,0xa1,0x2c,0xca,0xec,0xfa,0xf4,0x4c,0x1c,0x9c,0x18,0x88,0x47,0x5a,0x2c,0x89,0xfb,0x02,0xf2,0x6b,0xb8,0x1a,0xb5,0xf7,0x8f,0x4c,0xe3,0xa8,},{0x05,0x43,0x71,0x2c,0xef,0xa2,0x9a,0x22,0x0d,0x90,0xf8,0x1b,0xaa,0x4e,0x4c,0xf7,0x7a,0xc6,0x52,0x08,0xb2,0xd5,0xce,0x9f,0xd1,0x7c,0xe2,0x14,0xad,0x4a,0x93,0x7b,0x7f,0xc5,0xc7,0x86,0x41,0x3b,0x58,0x05,0x1c,0xca,0x3b,0xb8,0xb2,0xeb,0x55,0x65,0x7d,0x89,0x57,0x2b,0xc5,0x0e,0xa2,0xe5,0xec,0xdc,0x55,0x50,0x88,0x49,0x16,0x03,},"\xd1\x95\xe5\x90\x0d\xd3\x93\x14\x81\xbc\x01\x2e\x77\xbf\x06\x0a\xaf\x31\xcc\xcb\x0f\xe1\xa6\xc4\x0e\xaf\x28\x6a\x61\x66\xa1\x66\xb1\xea\x37\x05\x34\x26\x28\x4b\x92\x0c\x67\xfe\xe1\xd4\xb9\xd8\x6f\xb8\x61\xcc\x6e\xdd\x34\xe1\x0c\x52\x23\x37\x34\xd9\xcd\x92\xf5\xdb\xf4\x33\x51\x2e\xd2\x55\xac\x6b\x26\xe5\x6f\x5c\x66\x4b\xcc\xb2\x60\x69\x2c\xf4\x9d\x08\x36\x3e\xe9\x4e\x33\x6a\xcc\x48\x96\x00\xa6\xaa\x51\x2a\x04\x0f\x10\xeb\xf1\x8f\x7d\x2c\xbe\xe9\xca\xd1\x4c\x4f\xf8\x73\x77\xa3\x26\x34\x19\xd8\x29\x75\x29\x40\x1f\x15\x33\x7a\x4c\x4d\x23\x25\xed\x7d\xef\x76\x3a\x0d\x47\x9c\xaa\x40\x82\x66\x83\x4d\xa2\x42\xf3\xa1\x6b\x79\xa4\x58\x66\xb9\xd9\xd7\x1a\x48\x29\x31\x76\x74\xcf\xf7\xae\x6c\x8c\x58\x7b\xa4\xd4\x98\x0e\x81\x86\x13\xd3\xad\x82\x50\x7a\x7a\xb0\x32\xbb\xf9\x9c\x5e\x9b\x64\x03\x71\xbb\x41\xb9\x1e\x96\x5d\xc3\x1e\x8c\x7d\x4b\x3b\xaf\xd4\x95\x70\x52\x7f\xaa\xa8\x7a\xbb\xf6\x41\x6c\x47\xb1\xb1\xb0\x9d\x34\x01\x25\x31\x26\xcb\x24\x6a\xe4\x5a\xcf\x5f\x10\x0b\xb1\xf9\x2f\x11\xa5\xc6\xc9\x37\xe0\x58\x8d\x8b\x14\x6b\x3e\x4d\x3c\x7e\x5b\xf5\x74\x84\xe9\x84\xfe\x3a\xfc\x47\x72\xf2\x4e\xbf\x89\x4c\xdb\x39\x83\x7f\xbd\x46\x9a\x92\x1a\x96\xac\x5a\xf5\xe0\x70\xf6\xc9\x62\x4c\x58\x8e\x9d\x4f\xe6\xdd\xfe\xed\x1f\x8f\xe2\x0e\xb9\xc4\x60\xce\x6e\xe3\x8b\xf4\x71\xdd\x56\xdc\xf2\xe3\xee\x99\x8b\x8e\x7f\xdc\xf6\x12\xe7\x8a\x2e\x7c\x71\x73\xc0\x16\x09\x82\xbe\xde\xcc\x2c\x62\x1e\x5f\x66\x11\xb4\xef\x21\x02\xe3\x2e\x7c\x29\x80\x3a\x7e\x25\xfe\xe1\x51\x24\x31\x58\xa7\x6e\xe5\xd8\xc1\xbb\x2e\x7d\x8c\x88\x87\x1b\xa4\x33\xc5\xe5\x41\xc2\x60\x26\x93\xd9\x01\x10\xbe\x79\x5b\x52\x3a\x8f\xad\xb6\x05\xd8\xe3\xd7\xe4\x93\xfe\x24\x5d\x9c\xc5\x32\x0d\x32\xb8\x5d\x61\x35\xa4\x4b\x11\x68\x72\x94\x14\xc2\xca\x21\x56\x0f\xb4\xfe\xec\xde\xef\x0c\xf7\xd8\xe0\x71\x27\x4e\x88\x56\xc0\x04\x03\x3e\x80\x01\x3c\x73\xaf\x71\x77\xc3\x19\x78\x16\xa5\x03\x2d\x90\x59\xb1\xb6\xe4\x15\x2c\x38\x61\x92\xdd\x54\xb9\x0f\x9d\x30\x8b\xe9\x8e\xd7\xd0\xca\x9d\x12\xe8\xaa\xf6\xf9\xd8\x69\x38\x6a\xa9\xdb\xb0\x15\x93\xd3\x7e\x72\xf0\x90\x12\x4d\x34\x55\x29\x8e\x9b\x4c\x9e\xc3\xca\xe7\x3b\xb8\xee\x41\xeb\x63\xe3\x8c\x56\x13\x3e\xfd\xba\xf4\x49\xb8\x4e\x1e\x49\x1e\x49\x6f\x1c\x70\xa4\x4d\x06\x99\x86\xba\x88\x18\x42\x20\x69\x06\x1b\xb6\xeb\xcb\x7b\x20\x54\xe6\x3d\xf3\x81\xba\x03\xc6\xa7\x67\x4a\xbd\x61\x05\x0d\x69\x3d\x41\xbf\xe3\xca\x50\x46\xc6\x5f\xfb\x06\xa0\x74\x98\x09\xe5\x8d\x4c\x93\xa9\xff\x69\xed\x30\x95\x0b\xde\x1f\x99\x21\x6f\xff\x29\x9f\x22\xf1\x6b\x07\xc2\x54\xc2\x65\xae\x0b\x12\xe3\x13\x16\x3c\xcd\xf5\x03\x6d\x49\x05\x5f\x9a\x96\x67\xb0\xb7\x12\x92\xbc\x3b\x62\x60\xcb\x87\x56\x8f\xd2\x67\x17\x0b\xc9\x40\xc3\x33\x29\xd7\x29\xc9\xe3\x2d\x0f\x91\x80\xb1\x34\xbf\xf8\xae\x93\xb1\xbf\xeb\xfa\x38\x42\xfe\xf2\x0b\xc0\x4a\x29\x7b\x00\xa8\x4a\x0f\x42\x8d\x5f\x42\xfa\xb8\x61\x42\x99\x6d\x4a\xd9\xef\xab\xc4\x98\x52\xf8\x81\x2f\x3b\xfb\x5e\x57\x53\x9e\x21\x86\xeb\x8a\xe2\x29\x58\x0b\xc6\x04\x48\xac\xde\xf5\x72\x3c\x88\x15\x88\xb5\x37\x89\xf0\x5b\x91\xe0\x22\x89\x22\x32\x52\xd7\x53\xf7\x98\x13\x77\x9a\xce\x70\x5e\x04\xae\xd1\x52\x65\xd3\xbd\xf2\xa2\xe4\xb1\x56\x54\x77\x0a\x27\x58\x54\xe6\x4c\xf4\x43\x90\x60\x7a\x45\xd7\xbb\xa9\xaf\x3e\x1a\x2e\x28\x30\x67\xfc\xd6\xe6\x33\xaa\x2d\x24\x03\xbd\x81\xf7\xc7\x92\x76\x55\x10\xb5\x98\x41\x2f\x6b\xda\x07\xb2\xa9\x45\xb9\xf6\xd4\x6a\xb2\xf7\xc3\x20\x07\x5b\xc6\xb6\x0a\x80\xda\xa4\x4a\xf3\x91\xf4\xcd\x56\x21\x31\xbb\xdd\x40\x7d\x66\xf8\xdb\x12\x59\xbd\x76\xfa\x7e\x4d\x52\x64\xe1\x45\x54\x6c\x94\x2d\xfe\x90\x07"}, -{{0xed,0xa0,0xfe,0xac,0x0f,0x2a,0xfe,0x01,0x74,0x49,0x15,0x52,0x48,0x7f,0x39,0x62,0x17,0x13,0x32,0xb8,0x22,0xdc,0x3d,0xa4,0x26,0xf9,0xa5,0xf6,0x2b,0xef,0x7b,0x8d,},{0xef,0xf2,0x7c,0xb5,0x1f,0x4d,0x39,0xc2,0x42,0xf3,0x23,0x01,0x9a,0x12,0x34,0x81,0x8e,0xf2,0xe4,0xcd,0x1b,0xda,0xbc,0x0f,0x2d,0x8d,0x21,0x34,0x58,0xdc,0x47,0x1a,},{0x6c,0xbc,0x7e,0x6f,0x5e,0x12,0x14,0x5b,0x01,0x68,0x7a,0xd9,0xca,0x6b,0xf6,0xe4,0x7f,0x94,0x17,0xc2,0xce,0xfa,0xd3,0xfb,0xd6,0x8f,0xd6,0x5d,0xd7,0x4f,0xaa,0x97,0x50,0xcb,0xa9,0x92,0xde,0x4c,0xeb,0xcf,0xcd,0x35,0x80,0x8c,0xbb,0x3f,0xf1,0x2c,0x8d,0x93,0x07,0x99,0xaf,0x36,0xef,0xe7,0x97,0x6b,0xf2,0xfe,0xa7,0x9e,0x3e,0x0e,},"\x90\x11\x19\xda\x4e\xd1\x81\xaa\x9e\x11\x17\x0b\x20\x62\x6e\x00\xab\xf0\xb5\x48\x24\x5e\x3d\xeb\xf9\x4b\xf5\xed\x50\xae\xef\xe9\x42\xb4\x02\xcc\x99\x48\x94\x78\x52\xde\xdf\x2b\x53\x04\x01\x76\x65\x74\x9c\xd4\x7c\x21\xfc\x65\x2e\xe9\x95\x67\x9f\xf9\x31\xe3\x0e\x94\xaf\x98\xb4\xa9\x8f\xd4\x4e\x84\x9e\x98\x47\x0f\xe0\xa7\x6c\xe8\x0c\x61\xf8\x3f\xb4\xe8\x5b\xa5\x23\xee\x3f\xd2\x5d\xb0\x00\x05\x3b\x49\xd0\x93\x0e\x3b\x07\x9e\x86\x6e\x15\x3f\x7d\x86\x36\x7f\x23\xa4\xc4\xab\xc6\x3b\x30\x75\x46\x1e\x90\xe4\xfd\x89\x6d\xa0\x49\x2e\x27\xd7\x14\x94\x1e\x96\x7f\x52\xc9\x3f\xfa\xec\x44\x80\x3f\x57\x87\x7d\x86\x6e\xb5\xf8\xc5\x28\x17\x85\xaa\x48\x26\x79\x2e\x39\x64\xc6\x65\x90\x82\x1e\xea\x66\x75\x20\x74\x26\x40\x18\xa5\x71\xf5\xb0\x13\xb3\x8e\x15\x2c\x95\xc0\x24\x8a\xe6\x03\x68\x22\xa6\x7a\xfc\x9e\x02\x69\x45\x73\x15\x2b\x86\x4c\x56\xc2\xf7\x30\xa0\x82\x10\xf8\x5e\xc4\x6f\x98\x4a\x64\x3d\x51\x6a\x15\xfc\xfa\xa8\x48\x40\xf5\x12\x04\x7d\x11\x0e\x07\x18\xd2\x93\x95\x5f\x01\x58\x25\x7f\xba\x0d\x78\xeb\x7d\xf2\xf0\xb7\x7e\x6e\xeb\x76\xdb\x5e\x71\x70\x73\x10\xe8\x27\x36\x1c\xd4\xe1\x19\x74\x0e\x63\x92\x2d\xb4\x2c\x2c\xeb\x5e\xe1\x75\xd5\x0d\xec\xc7\xb7\x49\xfd\x23\x25\xbc\xe1\xe6\xa8\xf7\x10\xff\xcc\x1e\x1c\x9b\x33\xc3\x80\xe5\x2a\x64\xda\xa9\x58\x5f\xab\xe4\x06\xd9\xcf\x24\x48\x8f\xe2\x6f\x3a\x49\x5f\xb0\xab\x50\xe1\xe2\xba\xd8\x23\x81\xaa\x22\x43\x10\x99\xcc\x8a\x56\x98\x13\xd7\x9c\x9d\x78\x56\x9c\x0d\x95\xda\x9a\xad\x2b\xfb\x57\x75\x8d\x52\xa3\x75\x27\x52\xe0\x23\xd6\x51\xc9\xcb\x66\xa4\x12\xa5\xc8\x0f\x6b\xa5\x47\x93\xf7\xec\x87\xb4\xc5\x98\xfe\xd2\xce\x24\xab\xd7\x60\x87\x08\x89\x5c\x46\x72\x73\x59\xff\xec\xa6\xd6\xc6\x2e\x10\xa6\x78\xca\xa7\x18\xb4\xcd\x26\x32\x92\xcf\xef\x53\x5b\x9f\xbe\x27\x56\xb7\x39\x6d\x69\x7b\x31\x46\xc5\x51\xe6\xaa\xc1\xf5\xf1\xc2\x4b\xe9\xb6\x7a\x1e\x2a\x2a\xff\x74\x53\x01\xba\x6a\x21\x22\x17\xc5\x3d\x68\x16\x81\xbb\xb4\x01\xbf\x4a\x43\x65\x6f\x5d\x15\xcd\xe9\x69\xc1\x78\x00\x99\xa3\x32\x37\xeb\x19\xa3\xb8\x58\x5d\x6b\x5d\xea\x2f\xb5\x77\x84\x5f\x25\xee\x2a\x82\xcc\xf4\xb2\x85\x02\xf9\x0f\xe8\x0b\x8c\xdc\xdf\x2c\xcf\x93\xc4\x34\xc0\xe6\xaa\x5d\x87\x52\xa4\x43\x43\xc2\xb1\x8d\x20\xfe\x40\x04\xc4\x70\x38\x65\x93\x56\xf8\x7a\xbe\xd5\x44\x50\x34\xd8\xe2\xd3\xd1\x47\x68\xf5\xef\x31\x2c\xf1\x02\xa9\x88\x46\x83\xbc\xc0\xcd\x8a\x71\xe3\xec\x36\xfb\xb6\x33\x4a\x1b\xba\xed\x5d\x2b\xf1\x04\x16\xd8\x2b\xd6\x53\x04\x75\x38\x0a\xb6\xe2\x57\x7b\xbc\x69\xce\xbd\xa7\x5f\xaf\x02\xad\x82\x7b\x54\x51\x82\x13\x20\x6f\xd4\xcd\x66\xf2\x52\xb2\x34\xac\xa9\xee\xde\x7e\x3e\xeb\x81\x5d\xdc\xd8\xd5\x19\xc5\xd7\xf5\xd9\xd1\xfb\x9c\xa0\xfa\x44\x67\x99\x00\x95\xfa\x46\x22\x0c\x20\xa2\x07\x1d\xfc\xaa\xd5\xf0\x24\xda\xe3\x41\x6f\x7c\x49\x2d\x75\x74\x88\xc4\x9a\x2e\x4d\xf4\x83\xbc\x9b\x80\x09\x8e\x0d\x5d\x68\x3f\xac\xb8\xc9\x60\x82\x9d\xff\x09\xb3\x03\x36\x9d\x46\xcb\x57\x33\x1f\xf2\x17\x91\xee\x25\xd6\xbe\x7d\xec\x7e\xba\xf1\xb3\x24\x79\xa7\xf5\x14\xdc\x64\x71\x05\xc9\x44\xc3\x6f\x7d\xbf\x0a\x5b\x58\x91\x28\xdb\xaa\xa4\x21\x71\xd6\x42\xf2\x5a\x98\x1c\xe1\xf8\x37\x9f\x91\x69\x0b\x36\xaf\x77\x46\x48\xd5\x62\x4c\x08\xdb\xd0\xa9\x0f\x70\x87\x16\xdf\xab\x20\x24\xda\xe8\x65\xb9\xc4\x9a\xb2\x74\x73\x82\x6c\xd4\xa0\x10\xbf\xdb\x52\x01\x1d\x8c\x7c\xb3\xf4\x21\xca\x8c\xa3\xcd\x04\x86\x88\x91\x88\xe6\x7d\xf0\x0f\xb8\xc2\xa6\x43\xe7\xad\xb2\xf8\x27\x9f\x76\x3e\x5b\x9a\x81\xb6\xdf\xc3\xf7\x21\xfc\x5f\x68\x49\xf6\x67\x36\x78\x8c\xc5\x57\xc4\xeb\xc6\xfc\x68\xd6\xf6\xac\x77\xbe\xdd\xa8\xac\xb3\x62\x24\x3b\xda\x74\xe7\xb2"}, -{{0xec,0x05,0x9f,0xc6,0xbe,0x98,0x3c,0x27,0xec,0xa9,0x3d,0xdc,0xdc,0xb5,0x3a,0xf7,0x28,0x62,0x55,0xda,0x91,0xe2,0xa5,0x6a,0x68,0x4f,0x64,0x1e,0xc2,0xd0,0x9d,0x6e,},{0xff,0xc6,0xcb,0x75,0x1c,0x70,0x07,0x1b,0x65,0xec,0x2a,0xc6,0xb4,0x5f,0xd1,0xd5,0x5f,0xe8,0x36,0x96,0x5f,0x80,0xb3,0xe7,0xc7,0x84,0xfc,0x70,0x4a,0xcb,0xdf,0x69,},{0xa7,0xb8,0x8e,0x5a,0xbf,0x13,0x28,0x24,0xbd,0xde,0x77,0xc5,0xf8,0xdf,0x94,0xab,0x26,0x48,0x1f,0x6b,0xee,0x66,0x0e,0xa1,0x62,0x24,0x70,0x82,0xa2,0x50,0xd3,0x90,0xc7,0x1d,0x32,0x0a,0xd0,0x60,0xd8,0xef,0x34,0x1f,0xb6,0x9a,0x48,0x32,0x94,0xf0,0xd6,0xde,0x72,0x6f,0x0c,0x86,0x2f,0xa3,0x7e,0xa4,0xbc,0x6d,0xab,0x52,0x15,0x09,},"\xd1\xac\x63\x25\xa4\xe6\x90\xfa\x79\x53\x68\x83\xd5\xc2\x0e\xac\xb7\xd9\x64\xc0\x17\x8f\x74\x2c\x2b\x23\x72\x7d\xeb\x62\x64\x5a\xf7\xc8\x19\x22\xa0\xe7\x2e\x5e\x30\xb5\x83\x9a\x2e\xd5\xe5\x67\xec\x31\xce\x22\x41\x15\xb8\x2d\x2b\xf2\x51\xb7\x39\x3f\x01\xb0\xd0\x3a\x60\x2b\xc1\x20\xae\x62\xaf\x7f\xbc\x37\x9d\xfc\xf9\x5b\xbb\xba\x98\x4a\xab\xa3\x4f\xe2\x12\xac\x99\x00\x33\x28\xb8\x32\xc3\x53\x2d\x42\xee\xe1\xe1\x87\x4d\xc2\x2a\xd6\x7d\xb6\xc9\x1d\xbb\xfb\x2b\x45\x78\x5d\xbc\xd3\x99\x17\xd3\x6f\xb4\x8c\x1b\x5d\x6f\x38\xbd\xda\x5d\x28\xfb\xba\x64\x17\x55\x75\xaf\xea\x46\xc8\xed\x67\x57\xff\x30\x16\x4e\x0d\xf2\xe7\x21\x76\xe8\xb6\xc9\xdb\x5b\x5e\xf3\x90\xb7\x2f\x2d\x4d\x94\xe3\xb6\x6f\x0d\x44\xa7\xe0\xf0\x6e\x89\xde\xbc\xdf\x13\x63\xc0\xe7\x5d\x50\xdb\x5b\xb7\x01\x90\xd1\x9f\x66\xa3\x9c\x6f\x7d\xba\x70\xdf\xcd\x4a\x9f\xed\x02\xc2\xf1\xd0\x67\xe7\xc7\x88\xc5\x8f\xdb\x3e\x17\xa2\x37\x7c\xe4\x86\xec\x65\x82\xf3\xba\x99\x7b\xb5\xf7\x0c\xd6\x21\x00\x29\x56\xf5\x13\x1a\xa3\xa1\x61\x7c\x0c\xeb\xcc\xd9\x39\x1d\xe1\x30\x7c\x85\x97\x0a\x8b\xc1\x55\xf5\x19\x87\x26\x68\x45\x0c\x91\x48\x86\x89\xf5\x3c\x2c\x1a\x7e\xd5\x3f\x38\x8c\xb1\x3a\x2c\x38\x96\xfe\x5b\x7d\x3a\x0d\xc1\x68\x3f\x27\x66\x4c\x8b\xea\xea\x68\x0c\x8c\xc5\x4a\x90\xe4\xc6\xf9\x9f\xbf\x05\xf2\xc2\x2d\xf6\x0d\xe9\xae\xc8\x0c\x79\xb7\xd6\x62\x07\x05\x06\x67\xb4\x52\xd7\x85\x7f\x9a\x8c\xa7\x23\x28\x0d\xac\x79\x92\xe2\x07\x92\x67\xec\x3a\xd9\x11\x40\x46\x42\xc4\xe3\x26\xbf\xb9\x6b\x43\xc8\x94\x34\xba\x4b\xc7\x8c\x25\x2f\x4d\x4c\xa8\xd1\x3a\x88\x74\xc6\xfc\x82\x52\xea\x0b\x56\xc6\xbc\x78\x68\x47\xd4\x31\x83\x06\xe1\xc6\x52\xc4\x52\x58\x5e\xef\xd0\xbd\x9d\xd3\xc1\x48\xa7\x3b\xa8\x6e\xed\xea\x94\x5f\x01\x67\x13\xed\x7d\xf0\x85\xd0\x06\x66\x89\xe7\x92\xda\xcb\x2b\xfc\x1e\xb5\xc8\x24\x37\x2a\x26\xc5\xe9\x44\xaa\x74\x44\xac\x97\x73\xd4\xa1\x92\x1e\x49\xbd\xd4\xf8\xf6\xd7\x88\xc2\x63\xfe\xe0\x4c\x7b\x44\x4c\x53\x05\xed\xb6\x33\xe1\xff\xe0\xba\x4e\xa8\xda\x01\x1a\x62\xf2\xbb\xfe\xf4\xb8\x95\xad\x3f\x22\x4c\x3b\xa3\xbf\xf0\xc9\x5d\x75\x75\x0c\x9b\xcc\x66\xff\x8a\x20\xb6\xc2\x4b\xde\x75\x81\xa7\xec\x38\x66\xf8\x71\x6f\x78\x1f\x46\xdc\xad\x45\xa9\xeb\xcb\x6e\xd4\x69\x53\x36\x83\x97\x01\x17\x35\xd4\xb5\x2d\x00\xe8\xdb\x39\x79\x95\xdb\xdb\x3d\x4f\x42\x54\x68\x7f\x04\x68\x8a\x26\x8c\x30\x5b\x2b\x1f\x62\x2c\xf5\x1b\x17\x47\x75\xba\xd7\xf6\x67\x4a\xdc\x2e\x58\xe0\x5c\xce\x86\x5f\x12\xd7\x56\x9c\x8e\x9b\x35\xbc\xdf\x3c\xcc\xe6\x33\x0d\x08\xce\x53\x40\xa7\xc6\x30\xf2\x7a\x6c\x80\x86\xb5\x14\x6b\x29\x2f\xcb\xf5\x0f\xf6\xaa\xae\xf8\x84\x8a\x70\x7b\x25\x43\xc6\x18\xd1\x7b\xd9\x76\xc2\x40\xbc\x79\xd3\x3e\x00\x4e\x49\x53\x48\x29\x15\xe7\xe6\xef\x94\x96\x4b\xde\xa4\xe0\x2d\xd7\xc2\xf4\x75\x23\x5f\x2b\x99\xe4\x32\x29\xc9\xac\x3a\xba\x0d\xb5\x9a\xc2\xda\x03\xa9\xee\x4f\x37\xdb\xf2\x47\xa3\x3e\x6d\xfe\x5b\xe7\xc7\xf8\x25\x84\xf0\x4a\x46\xd4\x9f\x66\x21\xda\x31\xb9\x1a\xc3\xda\xa4\xd6\x8d\x48\xa5\x66\x59\xb4\x48\xc0\xed\x36\x5c\xb4\xaa\x0c\xfd\x90\x88\x53\xdf\x5b\xbf\xa8\x8e\x60\xe1\x0a\x5a\x00\x2c\x32\xab\x33\x33\xf2\xc3\x9b\xbf\x3e\xe0\x1a\x4a\xa6\x0d\x2d\x01\x42\x3e\x60\x97\xdc\x54\x30\x5f\x81\xa2\xd9\x3e\x2f\x6b\x4e\x8b\x35\x19\x71\xcb\xf2\x45\x7d\xc7\x6e\x1f\xb8\x92\x93\x38\x47\x98\xef\x28\x23\x4e\x9b\x1a\x47\xde\xdc\x23\x36\xf8\x6b\x8e\x13\xc4\xae\xf7\x90\xf5\xa1\x12\x39\xc7\x47\xd9\xd8\x65\xc9\xa1\x5a\xde\xb0\x71\x07\x02\x67\xe5\x34\x62\x56\x64\x8a\xdc\x0f\xa4\xdb\xdf\xd7\x87\xca\x14\x65\xfc\x24\x0a\x32\x4c\x3c\xaf\x29\x31\xda\x41\x49\x9e\x27\x5f\xd4\xb3\x5f\x6d\x08\xdb"}, -{{0xf1,0x6a,0xbd,0xbc,0xc0,0xbc,0xc6,0x1a,0x1a,0xee,0x3a,0xbd,0x87,0x67,0xab,0x52,0xe5,0xf7,0x99,0x99,0xbb,0x77,0xa3,0x97,0x6c,0xbc,0x82,0x67,0x0d,0xfd,0x2f,0x73,},{0x10,0xf4,0x51,0x71,0x9d,0xb0,0xfd,0x21,0x37,0x6e,0x22,0x8a,0x41,0xc3,0x03,0x5c,0x8c,0x2b,0xc4,0x2e,0x5a,0xaa,0x92,0x6f,0xe6,0x08,0x87,0x8d,0xbb,0x0d,0xc7,0xab,},{0x33,0xd8,0x05,0x29,0x08,0x69,0xb8,0xe0,0x4f,0xf0,0x89,0xfa,0xa2,0xd1,0xfa,0xb8,0x37,0x43,0xba,0xda,0x68,0xad,0xe5,0xb3,0x8a,0xe5,0xf0,0xcc,0x58,0xc3,0x37,0x4e,0xba,0x43,0x94,0x3c,0x1f,0x51,0x10,0x67,0x8e,0xb3,0x9b,0x46,0x58,0x61,0x18,0x22,0xa2,0x6d,0x35,0xff,0xe1,0x9e,0x9c,0xfc,0xb9,0xba,0x95,0x89,0xe4,0xec,0x31,0x05,},"\xbf\xac\xd7\xdd\x4e\xea\x46\x7d\xcc\xe4\x04\xf4\xa3\x52\x0a\x45\xb9\x4e\xba\xa6\x22\x19\x7d\x02\xd6\x15\x29\xd2\xb3\xbf\x27\x3c\x4e\xe1\xfb\x95\xa1\x80\xc8\xf8\x7d\xe1\x90\xa2\xe5\xea\x70\xb8\x4a\xe1\xeb\x6f\xd4\x44\x7d\x8a\x3a\x8d\xed\x10\xf6\xed\xe2\x4f\x0e\xb9\x2b\xd3\x0b\xc6\x5d\x48\x71\xe8\xf5\xda\x08\xcb\xe8\xcd\x3c\x0a\xc6\x4f\xd5\xa5\x7a\x6b\x06\x4a\x89\xd5\x15\x9b\x42\xf8\xb3\xe5\xa1\x83\x8c\x9c\xb1\x9d\x88\x10\x6c\x07\x73\xa2\x75\xcd\x2a\x1d\x60\x99\x30\xbf\x6b\x30\xae\xca\x62\xb9\x7e\x31\x9b\xbf\xa9\x34\xf4\xd0\xa1\xe6\xac\x80\xba\xeb\xcb\xa2\xd8\xea\x4b\xed\x9c\xa8\x56\x2b\x4a\xcb\x56\x97\x9b\xf8\x85\x32\x4a\xc4\x0a\xb4\xa5\x0b\xfb\x9f\x34\x90\x49\xfc\x75\xa0\xe0\x3d\xe4\xcc\x43\xea\xe3\xc6\xa6\xcf\xfb\x5f\x6a\xe6\xc9\x45\x04\x41\x5e\x6c\x7e\xd3\x04\x5a\x93\x2f\x47\xfd\x20\xb9\xf3\x48\x3a\x77\xb6\xd4\x49\xd8\xdf\xd4\xa6\x38\xdb\xf5\x6f\x03\xf0\xf0\x31\x87\x90\x59\xb2\xfb\x49\x76\x79\x43\xf4\x6b\x38\x72\xe2\xde\x56\x7d\x5f\xef\x80\xb0\x29\x25\xe9\x86\x3e\x0f\x1d\x31\xa8\x0f\x4e\x64\x51\xc3\x25\x69\x4b\x80\xcf\x1f\x19\x18\xc6\xe4\x98\x87\x8e\xdc\x47\xc4\x53\x0c\xac\x46\x6f\x1a\x29\x4d\x55\xdf\x09\xaf\x4f\xdc\x80\x72\xad\xb1\xbf\x26\xca\x8c\x92\xf9\x12\xa2\xb9\xfe\xbc\x8b\x97\xb5\x8c\x1e\x9d\x32\xc7\x80\x32\x30\x52\x97\x2b\x6f\xbd\x53\x30\x4c\x05\x19\x3c\xae\xb6\x7c\x5b\xd3\xe6\x74\x79\x72\x5d\x29\x7d\xff\xb0\x68\x90\xab\xf8\xcd\x9e\x42\x45\x8e\x16\x8a\x61\x18\xf9\x05\xb1\xd5\x34\x86\x01\x6f\x85\xdc\xd9\x8d\xd3\x39\xe3\x46\x05\x33\xd0\xb8\xa4\x9f\xae\x6d\xc1\xa0\x71\x72\x5e\x6a\xe5\xf2\x94\x47\x9e\xe3\xbd\xca\xeb\x74\x06\x18\x41\xfb\x26\x08\xe8\x8a\x49\xfd\x0f\x38\x95\xb1\x8f\x85\xb9\x0f\x72\x41\xdd\x13\x87\x71\x00\x53\xfa\xa6\x2b\xae\x75\xe9\xae\x39\x36\x9c\x1c\x02\xde\x5d\x19\x24\x2e\xfa\x16\xe1\x1d\x44\xa4\xba\x57\x78\xce\x77\x22\xa9\x1c\xec\x0b\xc0\xa0\x8c\x06\x9b\xdf\xa1\x30\xd1\xc6\xc4\xb5\x6c\x6e\x93\x54\x24\x03\xcc\xf2\x76\x84\xde\xf5\x7d\xef\x26\xdf\x86\xce\xd5\x71\x28\x2d\xc9\x60\x97\x46\x18\xf0\xa7\x4a\x0c\xde\x35\xb6\x53\xcc\x6e\x77\x30\x43\x1b\x82\x5f\xfb\x9b\x8a\xaa\xb3\xc7\xa3\x97\xc9\x92\xbc\x2f\xa2\x32\x70\xfb\x11\xee\x43\x1a\xfd\x5f\x9a\x64\x44\x83\x01\x11\x73\x99\x3f\x19\x48\x5d\xd3\xcb\xdd\x18\x7b\xd3\xd9\x95\xeb\xf0\x03\x1b\x1b\x0d\xe4\xa8\xde\x9c\x14\xeb\x6f\x78\x0e\x36\xb8\x92\x57\x56\xb9\x79\x06\xa1\x96\x9d\x85\xe9\x67\xd8\x80\xe6\xe7\xdd\xa4\x2f\xd3\xc3\x00\x19\xf1\x1d\x70\x81\x07\x1e\xee\x66\x26\x42\x28\x36\xbb\xed\x27\xd4\x6d\xd0\xdf\x1f\xeb\x66\x10\xdc\x85\x9f\x51\x3c\x0b\xc6\x53\xd7\x02\x20\xfe\x04\x8d\x2e\x97\xc2\xe0\x6a\xf5\x30\xe1\x1b\xdc\x70\x29\xbc\xcc\x5c\x92\xed\xec\xef\x5e\x4a\x2e\x0b\xe2\xd2\x51\xf4\x41\x5d\xca\x3e\x55\xb3\xa8\x50\xf2\x63\x0b\x87\x9e\x4e\x03\x6c\xe8\x63\x3b\xf2\x09\x20\xb6\x80\x94\x21\x59\x29\xac\xcc\x7b\xe4\x0c\x57\x78\xbc\x55\x4e\x6e\xdd\x7e\x54\xc9\xe1\x45\xb2\xee\x07\xb6\x5d\x06\x1c\x11\xde\x0e\x83\xf3\x81\xce\x4f\x57\xc6\x48\x3f\x51\x06\x93\x63\x51\x10\x74\xc7\xa5\x77\x35\x3b\x45\xc6\xeb\x71\x19\x9d\xce\x50\x59\xfd\x2c\x46\x11\xb0\x54\x23\x8a\xaa\xdf\x2b\x6b\xa5\x34\xbf\xff\xc2\x72\x2a\xe3\xe3\x1f\xf7\x9a\xe2\xeb\xca\x99\xcc\x35\x07\xf8\xa0\x33\xcf\x4f\xea\x70\xc5\x2f\x7d\xb5\xde\x44\x2b\x42\xb8\xd4\x1e\x99\x01\x2e\x42\xca\x0e\x85\xa9\xfb\x6d\x4f\x16\x5b\x33\x0d\xe6\x38\x3c\x57\x26\xef\xca\x2f\xe9\x71\x34\x00\x02\xf5\x62\xdc\x6c\xb8\xf2\xfa\xf0\x66\x57\x25\xe0\x97\x79\x9d\x09\x60\x91\x86\x4d\x66\xa9\x50\xa5\x79\x09\x53\xee\x16\xb9\xea\x58\x20\x09\x21\x87\x08\xc4\xac\xcd\x81\x38\x13\x58\xa2\xc6\x89\xa0\x41\xd0\x2d\x78\x61\x21"}, -{{0xbe,0x79,0xd1,0xae,0xea,0x86,0xe8,0x6f,0x39,0x81,0x37,0xe6,0x2f,0xfd,0x79,0xe5,0x0e,0xff,0x9f,0x31,0x3f,0x25,0x19,0x2f,0x89,0xe5,0x2f,0x0b,0x4b,0xbd,0x5d,0x32,},{0x18,0x7d,0xac,0x85,0x5c,0xa4,0x42,0xfd,0x9a,0x3d,0xdc,0x32,0x89,0xc2,0x4e,0xb2,0xd2,0x6f,0x7a,0x40,0xfb,0x29,0xd8,0xe7,0x44,0x31,0xb2,0x50,0x22,0xc3,0xa0,0xcc,},{0x6d,0xab,0x59,0x3b,0xb1,0xd4,0x48,0xc9,0x74,0xa6,0x5c,0x6a,0x0b,0x6f,0xad,0x22,0xb4,0x73,0x26,0x32,0xd0,0x04,0x89,0x17,0x6e,0xf1,0x26,0xaa,0x59,0x01,0x09,0xe0,0xa7,0x23,0xa1,0x13,0x10,0x7b,0x53,0xe1,0x7d,0x69,0x0a,0x0d,0x40,0xb0,0xfa,0x33,0x6c,0xc8,0x7f,0xd5,0xfc,0xe8,0xf5,0x41,0xac,0xce,0xc6,0x7f,0x7d,0x1e,0xbc,0x06,},"\x6d\x63\x2a\x7d\x3c\x9b\xe5\x36\x49\xd0\xd1\xa5\xee\xdf\x51\x9a\x41\x3b\x13\xac\x64\xe9\xad\x85\x4d\xfa\x04\xf2\xe1\x73\x29\xd8\x22\xbe\x57\x3d\x9e\x35\xac\x06\x6f\x02\x22\x13\xa3\x44\x62\x0b\xba\x28\x9f\x53\x31\x69\x55\x84\xd1\x34\x3e\x81\x54\x05\xae\xab\xe3\x86\x1d\x63\xb3\xa5\xb9\x2b\x8c\xd8\xee\xed\x22\x80\x22\x2a\xbd\xe3\x0a\x1b\xcc\xd3\xf3\xe4\x11\xaa\xb9\x22\xfa\x1b\xaa\x09\x7a\xa5\xc7\x80\xd0\xea\xef\x94\xea\x10\xfe\x21\xf7\xd6\x39\xb7\x6d\x47\x88\xae\xb5\x92\x4a\x9d\x26\x2d\xcb\xc5\x68\x8a\x3e\x43\x54\x4b\xec\x08\x8c\xa2\xe0\xd0\x6d\x77\xa7\x1f\xb6\x41\xd5\x52\x26\x61\x44\x52\xb1\xe0\x80\x7a\x9f\xcd\x3c\xa6\x9b\xf7\xf2\x5d\x80\x41\x47\x0c\xeb\x7b\x21\xea\xd0\x3e\xc0\x37\xa1\x62\x9b\xd5\x00\xaa\x23\x3b\x59\xbe\x44\x97\x82\x10\xb6\xa3\x66\xf2\x23\xac\xfa\x07\x97\x95\x40\x07\xb0\x0e\xfb\x4f\xfa\xdb\x5f\xc9\x2b\xdb\x37\x86\x3e\x50\x2d\x7d\x70\x68\x10\x39\xed\xf3\x37\x70\xdf\x3d\x1d\xe3\x43\xdc\x35\xf2\x26\xd5\xe7\x39\x44\xba\x02\x55\xe2\xa8\x8e\xf6\xc4\x1e\x47\x2b\x21\x45\x67\xc2\x49\x59\x4a\x50\x87\x8b\x67\x31\xc1\xae\xb5\xb1\x0f\xa9\x1f\xa7\x6a\x37\xe1\xf9\xf1\xc0\x0f\xdb\xfe\x34\x85\xde\xd5\x4a\x00\x9a\xb6\x13\x39\x27\x11\x56\x68\xb5\x9f\x51\x15\x50\x8d\xa9\x37\x0f\x6b\xc9\x2a\x11\x85\xc0\xd5\xca\x01\xd2\x91\xe1\x8c\x54\xac\xfa\xca\x73\x8b\xd7\x19\x68\xa3\x42\xa0\xcb\xa6\x2e\x4b\xb1\x04\xa5\xbb\x37\x9f\xc8\x3e\xe1\x82\x0d\x1d\xb9\x80\x25\x3d\x6c\xb3\x83\xe9\x5a\xf1\x5f\x53\xc8\x5d\x17\x58\x90\xdd\xe5\xe4\xed\x03\xd2\xd0\x13\x5e\x3d\x60\xb1\x82\x93\xf5\xb5\x64\x1e\xf8\x3c\x6e\xce\x3d\x52\x59\x8f\xc6\x35\x36\x86\xe6\xf7\xb0\x9f\xde\xc1\xf6\xf1\x53\x67\x2d\x34\xb4\x89\xb4\x8a\x0d\xb9\xe4\x2c\xed\xa7\x17\x55\x48\x1c\x04\x70\x16\xc2\x25\x34\xe9\x0c\x6d\x20\x1e\xd7\x85\x96\x02\x63\x6e\xa7\x7a\xe8\xc6\x73\x4b\x7c\x4c\x5b\xd9\x95\x79\xc5\x08\x73\x1c\x72\x46\xa2\x95\x86\xe4\x06\xe1\xd9\x32\xf6\x71\x30\x71\xd4\xbe\xa6\x3d\xc5\xe2\xa3\x76\x1e\x16\x02\x4d\x2c\x32\x84\xf7\x09\xa1\xf2\xba\x08\x5e\xad\x32\x00\xc7\x04\x62\x75\xcb\x96\xb6\x1a\x60\xb5\xac\x55\x9b\xc4\x88\xbd\x10\x64\x67\xc3\xde\x50\xbf\x5d\x74\x0d\x05\xc9\xcd\x70\x1d\x65\xb7\xda\xea\x29\xe6\x4d\xd5\xa9\x7a\xdb\x6b\x5c\x82\xcf\x7f\x23\x01\x7a\xa7\xca\x1a\xc9\xa3\x9e\x58\x27\xeb\x47\xe2\x0d\x35\x9b\x67\xc7\xd4\xe1\xa8\xe3\xe2\x7c\x52\xd3\x3d\x93\x03\xa5\x92\x62\x34\x84\xd7\x97\xb4\x02\xcb\xb4\x58\xd1\xac\x2e\xa5\x3e\x1c\x4f\x7a\xbb\x70\xcc\x02\x95\x54\xa2\x34\x57\x4d\xef\x9b\xc3\xb0\xd3\x83\x5d\xc3\x14\x90\x2e\x25\xab\xb2\x2d\xfd\xed\xdc\x67\x9a\x3c\xc8\xf0\x73\x40\xb1\x5f\x57\x62\xf4\x40\x7f\x38\x03\x42\x55\x4e\xd0\xc6\x2f\x73\xb6\x18\x16\xea\x8c\x52\x94\x61\xe1\xbf\x0e\x9d\x1c\x2d\x5e\x4c\x57\x46\x33\x6b\xc0\xe1\x32\x87\x3c\xde\x0d\xc2\x15\x8b\x54\xfa\x1b\x67\x8a\x00\x6b\x4d\x95\xed\xa8\xa9\x55\x71\x42\x73\xb7\xcc\x5c\xf2\xad\xd9\x09\x4d\x46\xe4\x9a\xbc\x09\x6a\x45\xf4\x18\xe2\xed\xbe\x99\xdd\x85\x29\x11\x68\x80\x64\xdf\x7c\xf0\x61\xd0\x7a\xee\xf4\x27\x95\x69\x0f\x48\xc9\xba\x19\x56\x54\x75\xd5\x46\x8a\x9e\xf4\x5d\x7b\xf7\x5f\xd7\x11\x82\xdd\x6e\x64\x01\x38\xf1\x82\xa6\xa0\xc6\xcb\xbd\x00\xc4\x95\xc4\x38\x95\x30\xac\x8e\x67\x96\x0e\xb5\xc5\x76\x3f\x54\x84\xea\xb1\xc1\xab\x85\x01\x40\xda\x04\x2b\xa4\x7e\xd8\x52\x88\x00\xd4\x17\x87\xf0\x75\xfe\x0d\x85\x50\x1a\x7a\xb7\x66\x35\xd0\x34\x10\xd2\x86\xc0\xe1\x7d\xb4\x02\x3a\x76\x39\x74\x68\xcc\xb0\x91\xcc\x5a\xc1\xf6\x43\x45\x87\x91\x3e\xab\x92\x2b\x50\xca\x55\x67\x01\x6d\xde\xa3\x2f\xb5\x32\x55\xbe\x67\xf2\xdc\xf9\xff\xa8\x5d\x11\x7f\x1a\x65\x5f\xa7\x0d\xd3\xa5\x4c\xf9\x91\x53\x1f\x19\x13\x0e\xaa"}, -{{0x26,0x99,0x52,0x17,0x2c,0x3f,0xa9,0x76,0xde,0xfb,0xf4,0x0b,0xd6,0xed,0xd8,0xf1,0x5c,0xfd,0x4b,0xe1,0x0c,0x75,0x8e,0x37,0x41,0xd7,0x41,0x62,0xd8,0xea,0x22,0x9a,},{0x4a,0xea,0x57,0xc7,0x21,0xe3,0xdc,0xca,0x82,0x39,0xe9,0xad,0x9b,0x22,0xc1,0x9b,0xab,0x8d,0xf7,0x2c,0x88,0x79,0x3b,0x24,0xd8,0xdc,0x47,0xcf,0x97,0x40,0xfc,0xf8,},{0x3a,0xc8,0x0d,0x1e,0x8f,0x68,0xb4,0x05,0x8c,0x3a,0x04,0xda,0xd7,0x18,0x73,0x73,0x95,0x9f,0x26,0xa2,0x70,0x02,0x49,0x6f,0x8a,0xfa,0xac,0xcd,0x8b,0xea,0x09,0x01,0xc5,0x4c,0xab,0x87,0xb2,0xa2,0x30,0x2e,0x1f,0x36,0x25,0xc2,0xb0,0x6c,0x7e,0xbc,0xf3,0xce,0x96,0xde,0x3a,0xfd,0xf0,0x0f,0x51,0x94,0xa3,0x5e,0x05,0x52,0xc7,0x0e,},"\x7c\xcb\x6a\x05\x70\xc5\x33\x73\x7b\x9a\x53\x4a\x34\x1a\x7a\x96\xdc\x76\x52\x8b\x99\x7a\x9b\x48\xe6\xe0\xfd\xe1\x0f\x47\x4b\x27\xec\x98\x99\x12\xd1\x76\xca\xb7\x42\xd8\x9a\x84\x8b\x36\x66\xe9\x27\x7d\x69\x5b\x02\x2f\xd5\x3a\x9e\xb8\x9e\x88\xc7\x20\x39\x9e\x24\xed\x25\xdb\x9e\xb3\x5d\x6d\xa0\x09\xe9\xf0\x24\xef\x8e\x65\x51\x65\xbd\xef\x1c\x0d\x79\x7c\x74\xf0\x19\xcd\x59\x1a\x04\x42\xa1\x2d\x1c\xa8\x93\x83\x6c\xa2\x62\x8b\x33\xe8\x54\xf3\x42\x8e\xec\x4a\xa5\xed\x84\xf4\xbd\xd2\xee\xf8\xb6\xd2\x25\xca\xf9\x49\x6d\xf9\xed\xff\xd7\x35\xea\x54\xdb\x1b\xde\xa8\x83\xad\x5d\x47\xeb\x0b\xd4\xa6\x65\x3f\x0a\xb0\x37\xf0\x40\xa4\x15\x17\xa7\x74\x1f\x91\xe8\x2f\xdb\x6f\xda\x04\xf0\xdf\xa1\xbc\xf8\xb9\xb3\x7b\xf2\xbf\xbd\x87\x32\x7a\x63\x6f\x90\x7f\xdf\x96\x8d\x01\x89\xd1\xa1\x18\x09\xc4\x23\x0b\xa6\x9d\x5c\xbd\x84\xf5\x61\xbc\xac\x3a\xd0\x02\xe5\x58\xc5\xb9\xb0\x97\xa0\x19\x02\xf2\x9c\xe3\xf1\xec\x26\x41\x53\xd6\x68\xc7\x8b\x84\x51\x05\xb9\xcd\x2e\xf3\xc9\x43\x53\x1b\x75\xaa\x42\x8f\x17\x9e\x4b\x34\x18\xb1\xd5\xa4\xaa\x7a\xb1\x20\x3e\xfa\x49\x5c\x87\x69\x62\x8e\xb1\x06\x3a\x93\x7b\x73\xe4\xb5\xcd\x0c\xda\x33\xda\xb0\x1a\x50\xc6\x4f\xeb\xd9\x75\xc5\x7a\x1e\x84\x15\x08\xe8\x60\x60\x94\xd0\x82\x4f\xdd\x96\xcc\x6c\xfa\x18\xfa\x82\x09\xb3\x0f\x0a\x2a\x78\xea\xc9\xa7\x67\x17\x6f\x57\x3e\x78\xc0\x68\x80\x9b\x19\x9a\x69\xac\x6d\x33\x5d\x7c\x92\x09\x99\xc4\x0c\xba\xd8\x7c\xf4\xcc\x7c\xa5\xc6\x44\x29\x1d\x75\xad\x7a\x74\xbc\x1e\x63\x92\xd1\xce\x31\x1e\xcf\xd2\xeb\xc9\x16\xe3\x9e\xb6\xaa\x3e\x7d\x89\xfb\x80\x5a\x27\xa5\x5f\x17\x89\x12\xb1\x57\xbc\x01\xa0\x55\xf6\x7a\xef\xa7\x8e\x55\xc8\x06\xcb\xd9\xc0\x1b\xaf\x8e\xf9\x2c\xad\x22\x60\xb4\xbb\x14\xcf\xe6\x17\x82\xde\xe5\xc5\x99\x72\x50\x69\x41\xc4\x62\xa4\xda\x7e\xb8\x99\x53\x1c\xf9\x96\xbc\x98\xba\x36\x29\xef\xfe\x6f\xcd\x17\x06\xd1\xb4\xee\x4f\x2a\x14\xe9\x21\xbd\x40\x8f\x30\xe1\x2e\x73\xfb\x7a\xa8\x60\x53\x6b\x03\xe7\x7c\xa9\x37\x82\x32\x81\xa1\x64\x53\xfe\x82\x79\x35\x94\x32\x01\xe6\xec\x14\x3a\x67\xee\xfa\x4f\x94\xe9\xab\xf9\x4f\x7e\x3d\x41\xb7\x0a\x82\xbe\x69\xde\xd8\xa5\x30\x60\xc2\x30\x5f\x42\xf6\x2f\xe6\xa2\xf7\x04\xb6\x7a\x1e\x8f\xdd\xc7\xd9\x8b\xa7\xf3\x45\x71\x19\xb3\x11\xd4\x49\x66\x3e\xd9\xe3\x20\xd6\x18\xdc\x23\x68\xd4\x95\x08\x75\xb9\xc3\x8c\x5d\x8c\x03\x10\x4e\x2e\x32\xc4\x32\x5d\xed\xd2\xbc\x26\x7e\x2a\xcc\xb0\x11\x20\x18\xe9\xc5\xa8\x00\x7c\xca\xb2\xf6\xd7\xc7\x37\x79\x20\x02\xac\xb7\x30\xd7\x2e\x9f\x73\x08\x29\xeb\xc4\x2c\xa5\x64\xc1\xd9\x27\x1b\xf1\x86\x9c\x4d\x35\x83\x55\x89\xb7\x43\x1e\xf7\xa3\x1a\x07\x00\x60\xfe\x4a\x08\x9f\xb1\x1f\x2d\xd3\xdc\xe6\x5a\xe0\xfb\x45\xbc\x3a\x28\x60\x91\x7d\x93\x3b\xa2\xd0\x90\x56\x9e\xf5\xed\x43\xbc\x25\x32\xdb\x87\x9e\x0f\x1f\x22\x5e\xad\xcb\xef\x1c\x03\xd9\xed\x78\x29\x9e\x23\x3e\x4c\xf0\x7b\x06\x4a\x7b\xaa\xc3\x4c\x5a\x0c\x19\xfc\x3a\x55\x42\x08\x9f\x70\x16\x7b\xe2\xf8\x5b\x4a\x10\xe7\x78\x52\x52\x23\xbe\x8f\xfd\x5c\xff\x96\x48\xb1\x00\x5a\x09\x8b\x4b\x39\x24\x39\x8f\xb0\xbc\xab\xcc\x6e\xdf\x30\xc0\x61\xec\xe7\xae\xa3\x5f\xe9\x8a\x92\x03\xf8\x71\x13\x69\x53\x0f\xeb\x5e\x67\xbb\x2d\x4f\x59\xd9\xc8\xbc\x99\x38\x54\xdd\x47\x47\xcd\xe3\x99\xbd\x0e\x63\x74\x0c\x1c\xc8\x39\xad\x0f\x09\x8a\x38\xa8\x0b\xea\xdd\x64\x8e\x14\x36\xde\xee\x60\xe9\x31\xe6\x8f\x52\x97\x9c\xe4\x9f\x30\x1f\xe3\x9a\xfb\xb6\x15\x35\x20\x91\xc8\xb6\x58\x5f\xe8\x84\x47\xed\x6e\x59\xa0\x20\xb2\xbb\xe6\x6a\x94\x23\xae\x52\x28\xc2\x03\xbf\xd4\x84\x7b\x51\x81\xe2\xc3\xb4\xda\xd8\x3a\x6d\x4f\xa7\x69\x85\xee\xf7\x6a\xdd\xe3\xb3\x4e\xdb\xdd\x28\xd6\xa0\xb4\xa4\xee"}, -{{0xcc,0x31,0x38,0xe5,0x02,0xa5,0xff,0x6f,0x80,0xd2,0x46,0x36,0x6e,0x84,0xd6,0x5c,0x59,0xf1,0x2d,0x4f,0x49,0x63,0x97,0xe6,0xeb,0x99,0xb5,0x26,0x7b,0x8c,0xbe,0x2a,},{0x9e,0x2d,0x3e,0x88,0xaf,0x7b,0x52,0xdd,0xcf,0x00,0xe6,0xd0,0xc7,0x75,0x9c,0x12,0x38,0xb8,0xfb,0x3e,0xb1,0x44,0x21,0xfe,0x82,0xc3,0x48,0x33,0x43,0x78,0x35,0xbd,},{0xa2,0x70,0x0e,0x38,0x95,0xed,0x0c,0xc2,0xaa,0xf0,0x12,0xa4,0x0b,0xc7,0xbd,0x0b,0xd2,0x9d,0xd7,0x9c,0x69,0xc0,0xb4,0xa6,0xed,0xd0,0x53,0x0c,0xf3,0xe2,0x67,0xc0,0xf8,0x2d,0xd8,0x4e,0xda,0xf1,0x74,0x4d,0xc4,0x11,0xd6,0x2c,0x00,0x28,0x71,0x52,0x58,0x82,0x2d,0x7b,0x63,0xd3,0x97,0x05,0x61,0x2b,0x3f,0xad,0x4b,0x5e,0xfb,0x04,},"\x58\x5e\xcf\x2f\x09\xeb\x92\x3d\xf2\x0a\x85\x55\x64\x2a\x2b\xc0\xb6\x8c\x6a\x5f\xcf\xd6\xb8\x40\x1c\x4a\x0c\xba\xbb\x4c\x6e\x6a\x20\x67\x62\xb7\xa3\x9f\x2c\x54\x55\xd7\x80\x8e\xbf\xbe\xd5\x6d\x67\x60\xa4\x31\xc7\xd2\x0c\x2d\xc6\xef\x1b\x73\xca\xa3\xc4\x94\x88\xe3\x0b\x1c\xa2\x52\x0a\xd2\x0b\x26\xa1\x97\x00\x78\x0e\x5e\xf3\xce\x01\x44\x38\x8d\x84\x07\xb6\xa7\x0c\x1c\xda\x37\xdb\x7f\x12\x09\x1d\x89\x2f\x2e\x91\xad\x40\x78\xbb\x4d\xb1\x76\x2e\x46\x28\x5a\x7b\x66\x4b\x2a\xd3\xa3\x4d\x26\xd8\xa9\x4d\x64\x58\x7a\x84\x52\x77\x22\xea\x83\xcb\x8a\xa8\x89\x84\xe1\x48\x97\x43\xb4\x21\x4e\xa6\x04\x1a\xa1\x8e\x55\x20\x09\x54\xef\xc7\xed\xb3\x19\xdf\x94\x7e\xfb\xfc\x6c\x8d\x0f\xea\x48\xa1\x31\x61\x34\x65\xd8\xf4\xc4\x94\x98\xf2\x26\x91\x45\xc6\xda\xe5\x04\x78\x05\x25\x98\xe1\xca\x3b\xe0\xe3\x36\x11\x57\x1f\xa3\x84\x77\x1e\xee\x40\x2c\xc2\xb1\xd8\x48\x36\xc8\xf1\xad\x28\xf2\xad\x23\xde\xe9\xff\x1d\x7e\x1f\x25\x21\x63\x58\x74\x11\x5d\xef\x4d\x93\xe8\x9b\xe7\x61\x80\xbc\x55\xf7\x61\x14\x43\x60\xa8\xb2\x22\x89\x2d\x64\xd1\x57\xcc\xb5\xd8\xf4\x85\x5d\xca\x56\x70\x14\x95\xa0\xe1\x00\x2d\x34\x0a\x4a\x46\x15\x6b\x9b\x7f\xe0\x6b\x7c\x07\x59\xe0\xb6\xdf\x55\x9b\x69\x1e\xde\x78\xb5\x5a\xf6\x4e\x7c\x8d\xd9\x08\xb7\x88\xdd\x6b\xa3\x5a\x90\x2c\x81\xdc\xeb\x37\x88\xb6\x15\xde\x22\x5a\xfa\x58\xa8\x11\x81\xab\x24\xa7\x37\x05\xee\x83\x8b\x6e\x86\x3f\xe1\xbc\xc2\x6c\x1b\x94\x32\x39\x23\x0c\x27\xc6\xb3\x97\xb2\x3d\x13\xde\x6a\x02\xc9\x7f\x36\x45\xda\x91\xd4\x13\xf9\x16\x47\x3b\x01\x8a\x61\x59\x4b\x6f\x51\xce\xa4\x44\x57\xda\x1e\x3d\xbb\xba\x6d\xe1\x68\x66\x65\x7e\x92\xef\x02\x02\x71\x8a\x84\xad\x03\x33\xe8\x33\x6b\x05\x2b\x00\x47\x33\xe8\xe9\x5e\xc1\x3e\x5f\x91\xb3\x80\x6a\x98\xd3\xdb\x72\x9f\xb7\x35\xb8\x14\x7c\x4a\x98\x2a\x2d\x5b\x4e\xfa\xe9\xc0\x9d\x0a\x9b\xf8\x91\xcb\xbc\x3c\x8f\x53\x1e\x76\xe4\x04\x4e\xc9\x1f\x4d\x7c\x5c\xf7\x73\x10\xe2\xb2\xcd\xe2\xe0\x7c\xcf\x3e\x0a\x19\xdd\x6a\xe1\xb3\xfc\xb2\xdf\x42\x18\x6e\x9c\x72\x92\x2d\x2d\x4c\xe5\x1b\x30\x6e\x81\xb1\x6c\xfc\xf8\xf0\x0d\x51\x3f\xbd\x2c\x52\x39\xb4\x5a\xfc\x65\x4f\x6f\xe2\x1a\xcb\x7e\x8a\x0c\x9a\xa8\x7b\x0b\x60\x50\x74\xdf\x95\x76\xa6\xdd\xd9\x00\xac\xa5\x67\x61\x7c\xb7\x96\x56\xb3\xb5\xec\xb9\xff\x68\xb2\xf6\x24\x1e\xd0\xd0\x24\xac\x27\xaa\x6e\xb4\x86\xb6\x9f\xdc\x0a\x0d\xb9\x20\x96\xab\xf8\x60\x02\xde\xc7\xaf\xd8\x47\xa0\x06\xa3\xf6\x95\x5b\x49\x56\x90\x53\xbe\x9f\x1d\x0a\x49\xb7\x93\xa5\x41\x1e\x59\x16\xf4\x18\xec\xab\x95\x32\x43\x55\x3b\x66\xe6\xba\xdc\x4e\x90\x9b\xe0\xef\x5c\xc7\xc6\xd2\x71\x99\xec\x3f\x21\x42\x3b\xc4\x57\x73\xfb\x40\xb9\x7b\x61\x18\x5b\x57\x08\x0e\x8f\x0b\x89\xa3\xea\x57\xc8\x44\x4a\xb2\x7e\xcf\x70\x06\xa7\x66\x04\x7e\xef\xf5\x4d\x85\x56\xcf\xed\x23\xde\xf1\xda\x2c\xc8\xae\xbb\x48\xc9\x4e\x77\x9e\x82\x03\xae\x2c\x90\x2b\x51\xde\x0e\xde\x04\x56\xfb\x73\xfb\x4d\x5f\x51\x4a\x4c\xeb\xc4\x7f\xec\x3f\x94\x84\x69\xa5\x45\xc6\xbc\x57\xb4\x13\x8d\xb3\x4e\x7c\xc0\x06\xde\x26\xef\x50\x7b\x54\xd2\x81\x47\x56\x7a\x8c\x29\xac\x1e\xce\xf5\xbb\x84\xfb\x99\xac\xeb\x23\xa2\x02\x94\xd7\x4a\x85\xae\x36\xb3\x34\x50\x66\x8a\x5c\x26\x09\xd3\xa9\x39\x34\x58\x6f\xf9\x0c\x3b\x6d\x27\x32\x9e\xee\xf3\xa7\x54\xe9\xa9\xcb\xd5\x61\x7e\xf3\xb0\x93\x97\xbd\xc9\x71\x37\x07\x66\x58\x9a\x12\xd8\x90\x05\x0d\x16\x51\x45\x8b\x3f\xc5\x33\xc8\x43\xbf\xfd\xf9\x75\x4d\x93\x2c\x4e\xd7\x61\x1d\x4d\x27\xc3\x2a\x08\x75\x55\xb5\xea\xa3\x7a\xe9\x0c\x49\x79\xef\x54\x29\x9c\x42\x0a\xb5\xe2\x9a\xe2\x84\x5d\x4d\xcf\x21\x78\x92\x0a\x86\x51\x75\xfb\x9c\xc0\xe6\xb8\xc5\x24\xb1\xee\x49\x58\x05\xd5\x17\xbf\xe0"}, -{{0x5c,0x69,0x2c,0x68,0x11,0x98,0xb1,0x72,0xdf,0x2f,0xac,0x2a,0xec,0x3f,0xcf,0x70,0x15,0xc2,0xbb,0x68,0x30,0xf2,0xa9,0x8e,0x30,0xa3,0x96,0xb6,0x4a,0xf4,0x28,0x0e,},{0x33,0xb1,0x69,0xd4,0xca,0x27,0x10,0x40,0x92,0x6e,0xa8,0x78,0x35,0xe5,0x06,0x6f,0x9f,0x05,0x78,0x2f,0x08,0x7f,0xca,0x7a,0x55,0x6f,0x7b,0xf4,0xcb,0xa2,0xe8,0x86,},{0xad,0x8f,0x37,0x9c,0xaf,0x41,0xf7,0x2d,0xcc,0xad,0xc3,0xe9,0x15,0x35,0x7a,0xb0,0xcd,0x30,0x4e,0x10,0xf4,0x12,0x0e,0x0d,0xbb,0xfa,0xac,0x01,0xbf,0xfa,0xf2,0xbe,0x89,0x3f,0x70,0x07,0x2d,0xc9,0x64,0x06,0x91,0x81,0xbe,0xc1,0x7f,0xe0,0x25,0x10,0x55,0xb2,0x1e,0x23,0xde,0xe4,0x36,0x3b,0x27,0xef,0x1f,0xff,0x67,0xaa,0xfe,0x06,},"\xb1\x60\xee\x3a\x93\xcf\x6b\xc3\x45\x6e\x5b\xd0\x19\x7c\x09\xaa\x76\xc2\x25\x80\x52\xf9\xa3\x4d\xbc\x2e\xd5\x89\xf8\xdb\xe5\xff\x99\x69\xa6\x1c\xfe\x84\x6b\x2f\x67\x39\xdc\x7d\x4a\x14\x96\xe9\xad\x58\x60\x5b\x5a\x27\x58\xca\x07\x8c\x55\xa9\xfc\x1c\x4e\xeb\x54\x91\xa8\x4b\xfd\x46\x8a\x2c\xeb\x14\x1a\x77\x34\x93\xa9\xb3\xee\x82\x8b\x5d\xde\x9c\x00\xc2\x36\xff\x01\x56\xe4\xe2\xe4\x5f\xa0\x79\x31\xda\x68\xbb\xd2\x03\x0a\x88\x14\x05\xc4\xf7\x87\x28\x81\x3a\x5e\x04\x81\x24\x04\xc2\xa1\x9c\x9b\x87\xb1\xcf\xe9\xaf\x95\xe2\x73\xec\xf9\xc5\x18\xc5\x39\x35\xf8\x42\x56\x3b\x19\x2f\xae\x12\xa7\x3c\xef\x08\x5f\xe1\x9e\x89\x9e\x5b\xa0\x89\x79\xe3\x11\xfb\x28\x6f\xbf\xc7\xb2\x48\xaa\xbd\x40\xdc\x61\x61\x0e\x1d\x4f\xc9\x80\x6d\xd2\x12\x92\x39\x2d\xb2\xdb\x40\x42\x6c\x5d\x19\x6a\x48\x9c\x5d\xb7\x7e\x3e\x9c\xf0\xbd\x04\x1e\x3c\x23\xb5\xba\x1d\xb7\x81\xa1\x07\x90\xbe\x1f\xe0\x7a\x2b\x00\xca\x3a\xf8\x9c\xbd\x46\xef\xce\x88\x0e\x1e\xf2\x8b\x0c\xd7\x9d\x53\xb4\x2c\xd8\x0e\xaa\x13\x7e\xff\x7d\xf9\x0b\xcb\xcf\x95\xc9\x85\x8d\xc0\xcc\xc6\xd8\xca\x8a\xe3\x54\x7b\xdb\xf9\xff\x90\x24\xf3\xcf\x17\x01\x15\xeb\x28\xbf\x12\xb7\xd3\xb7\x01\x46\x0f\x48\xd1\xb4\xb2\x3d\x7f\x6f\xf7\x2f\xfd\xc9\xa6\xc5\x26\x24\xd1\x53\x12\xd7\xf1\x9d\xdb\x60\x26\xa1\x5e\xb5\x42\x95\xd3\x31\xfd\x79\x50\x91\x03\xbc\x59\xa3\xb6\xe1\xba\x7a\xc8\xc1\x12\xe4\xde\x28\x17\xe5\x1c\x1e\x16\x50\x7b\xa6\x6f\x25\x47\xbc\x89\x9f\x69\xc1\x20\x7a\xe5\xe3\x7b\xdb\x0e\x16\x1b\x15\xb6\x12\x30\x5b\xc0\x94\x0f\x9d\x1b\x38\x2a\x37\xec\x2d\xa6\x39\xa6\xec\xba\x1b\xcd\xfc\x51\x21\x4c\x32\x23\xc1\x1b\xba\xb7\x9f\x3f\xae\x3d\x55\xe2\xd4\xbe\x58\x4f\xd7\x60\x1e\x4e\x2e\x55\x8b\x3b\xe5\x70\x71\x15\xa6\x1f\x5a\x81\x5e\xc2\x4a\xac\x18\x09\x34\x57\xbc\x46\xc0\x5c\xfb\x7a\x3f\x25\x33\xea\xda\xdc\x9e\x6c\x1f\xe3\x10\x77\x9e\x69\x7f\x68\x30\x35\xce\x57\x87\x3d\xf5\x5d\x79\x1f\x6d\x2f\xb0\xe2\x10\x7e\x68\x66\xf8\x39\xc3\xa1\x26\xe9\x02\x38\x65\xce\xd1\xbc\xf6\x77\x99\x55\xaf\x54\x7e\x1d\x87\xeb\x32\xa9\xbf\x32\x28\x57\xfd\x12\x6b\x0c\xdc\x5d\x5e\x90\x4e\xb7\x6c\x67\x06\xe3\xc8\x97\xae\xfd\x6e\x47\x56\xfb\x8a\xca\x81\x70\xca\x5b\x39\x66\x90\x89\xaf\x1b\xb1\x41\xa2\x5d\x6b\x8b\x06\x03\x4d\x8b\x11\xab\xf1\xff\x8f\x8d\x43\x37\x58\x46\xfa\x8f\xa8\xa3\x4b\x5f\x26\x48\x20\x74\x4d\x31\x14\x9b\x7d\x57\x32\x6c\x59\xb1\xdb\x74\x13\x16\x78\xf6\x34\xe7\x23\x2c\xa5\xea\x51\x88\x76\x0a\x70\xdc\x35\xdc\x89\xf8\xe4\x53\xb4\xc6\x5b\x77\x2c\x2b\x6b\x62\x76\x8d\x83\x73\x23\x65\x51\xba\xaf\x24\xd3\xc3\x04\xc4\x1b\x62\xc3\x6e\x6a\x33\x83\xb3\xa1\x63\xb7\x3e\x78\xd8\xba\xdb\x75\x74\x1e\x50\x01\xd4\x19\xd3\x0e\x2e\xd7\x7c\x30\x96\xe8\xd8\xdf\x71\x3b\x93\x76\x2c\x97\x07\xbd\xd0\xf3\x65\xa8\x74\xb9\xda\x8a\xb7\x10\x49\x5d\xd5\x6a\xea\x93\xbb\x77\xfb\x22\x26\x35\xc6\x3b\xce\x9f\x63\xaf\x91\xfa\xc8\x9c\x66\x98\x6b\x8e\x21\x76\xdd\x45\x1d\x58\x33\x94\xc1\x90\x7c\xba\x17\x25\xf0\x6d\x25\xd1\xd0\x91\x2b\x3e\x5c\x6c\x7d\xcd\x34\x35\x8f\xad\x59\xdb\xc6\xf6\xb1\xc2\xef\x33\xd3\xca\x82\xf4\x35\x18\xfe\x4f\xf3\x13\x78\x01\x6e\x57\x8a\x7b\xab\x0b\x77\x67\x6e\xba\xe0\xd4\x8d\x08\x89\xd6\x90\x29\xd2\x09\xf2\x83\xce\x8f\xe0\xec\x23\xcd\x83\x2a\xdc\x12\xa9\xc3\xe3\xae\xc2\xd6\x03\x66\x95\x55\x6d\x93\x13\xf1\x2a\x89\x9d\xd5\x9a\x66\xbe\xf2\x8e\xde\x17\x5f\x8a\xae\xee\xb2\x94\x2b\xb9\x08\x92\xa0\x4b\x44\x0d\x04\xb6\x6f\x5e\xef\xf6\x1a\xda\x72\x79\x02\x94\xce\x55\xc8\x6c\x6d\x92\x78\x5d\xdd\x26\xc7\xa7\x31\x60\x3b\x06\x9c\x60\x3c\x92\xe4\xfe\x8f\xf7\x82\x54\x4c\x8e\x89\xb4\x0b\x8b\x55\xf9\x0e\x2a\x5e\x9a\x0f\x33\xc7\xfe\xc7\x7d\xad\x81\x52"}, -{{0x9d,0x5f,0x85,0xd2,0xe7,0xdf,0xd0,0x3b,0xb6,0x89,0xd9,0x00,0x28,0x5f,0xd4,0x46,0x15,0x38,0xa5,0xf2,0x71,0x0a,0x13,0xed,0x21,0xc7,0x75,0xf6,0xef,0xf6,0xb3,0xff,},{0xb8,0x67,0x97,0xe4,0xbe,0x02,0x86,0xae,0x39,0xe4,0x4d,0xf0,0xa0,0x0c,0x01,0x6d,0xb4,0x55,0x5e,0xf8,0x6f,0x2f,0x05,0xd0,0xa3,0xed,0x89,0xd8,0x9a,0x4c,0x3e,0x5e,},{0x17,0x6b,0x95,0x92,0xf8,0xc2,0x51,0x35,0x29,0x2a,0xdd,0x4d,0xaa,0xcc,0x9c,0x4f,0xaa,0x21,0xd4,0xf4,0x9b,0x27,0x84,0x80,0xc4,0xe8,0x88,0x1c,0x01,0x62,0x4d,0xf9,0xa3,0x7e,0x23,0xe1,0x8e,0x84,0xca,0x32,0xd0,0xd8,0xcb,0x85,0x10,0x54,0x22,0x2f,0x10,0xa4,0x95,0x41,0x9f,0x19,0x7e,0x7b,0x3d,0x18,0xdf,0x0a,0xdf,0xb1,0xb3,0x07,},"\xf7\x0b\x5b\x05\x3a\x46\x72\x51\x2c\x24\xb3\x16\x83\x92\xf6\xa1\x7d\xd7\x7d\x86\x89\xc2\x1c\x86\xef\xc2\x58\x29\xa1\xa0\x4f\xab\x4f\x76\xc8\x52\x16\x84\xd3\x20\x10\x45\x59\x07\xa2\x69\x08\x67\x7b\x40\xdc\x69\x47\xd6\x54\xf2\x91\x4c\x30\xec\xee\x72\x4f\xa6\x84\x46\xb5\x9d\x09\x1e\x25\x8f\xc8\x62\x41\x1c\x96\x4d\x66\x8d\xef\x83\x03\x4b\x62\x7e\xd4\x16\xdc\x19\x0b\xb5\xa2\x63\xa6\xff\x8d\x55\x9e\x13\xb8\x93\x62\x25\xfb\x4d\xab\x4f\x7b\xda\x04\x68\xe5\x47\xe7\x08\xcb\x04\xce\xbe\x1e\x5c\xfc\x69\xf7\x6a\x1d\x28\x3f\x28\x16\x82\x86\xf2\x4e\xce\xa5\x53\x5e\x44\x90\xa0\xc5\x55\x67\xa7\x34\x5e\xf9\x53\xce\x42\x6b\x20\x9a\x3d\xe3\xdf\x59\x5e\x80\xee\x61\xe5\x72\xa2\x78\xab\x02\x21\x95\x51\xb7\x3d\xa4\x19\x84\x80\x82\x85\xa8\x35\x98\xa0\x2d\x9b\x28\x67\x12\x10\x00\x4e\x31\xd8\xaf\x92\x42\xc1\x6f\x90\xd5\xea\x8f\x63\xa1\xff\x66\xcf\xe6\x0e\xcb\xe5\x37\x24\x5f\xa1\x2a\x9b\x15\x41\x15\x29\x58\x06\xea\x2d\x11\xf3\x67\x17\x82\xb9\xaf\x4f\xa8\x6a\x12\x88\xe1\x23\xcf\xd2\x40\x9a\x5d\xc9\x8f\x41\xb8\xf6\xdf\x29\x9b\xbc\xc4\xbb\x64\x47\xdc\x03\xa6\xd6\x0e\x9b\x2c\x5b\x8f\xfc\x40\xd9\x83\x95\x6b\xe9\x77\x68\xdd\x06\x12\xd4\x7c\xbf\xa7\x57\x1c\x99\x69\x85\x6c\x15\x2c\xd3\xb4\x73\xac\xe0\xb8\xa1\x44\xaa\xc2\x09\x5c\x0f\x72\xf1\xd3\x14\x71\x52\xb9\x08\xef\x66\x26\xd5\x22\x28\x19\xb2\x0b\xb3\x35\x0a\x46\x45\x2f\x67\x54\x90\xc2\xa8\x21\x50\xee\xc4\x0d\x75\xb6\x6a\x32\x5d\x6e\x92\x9a\x90\x5a\xde\x1e\x31\x60\xab\x95\x01\x81\xef\xc6\x6e\x59\x23\x08\x65\xd5\xe5\x99\x69\x8a\x8a\x3f\xf5\x60\xc4\xc6\x01\xa7\xa9\xa5\xda\x3b\x5d\x89\xbc\xa9\x3f\x7c\xf5\xbc\xf5\xbd\x5e\xcf\xf8\xf1\xa1\x85\xc8\x22\x0e\x4c\x77\x82\x1e\x62\xad\xf9\x5a\x03\x7f\x2d\xf7\xce\xf4\x3a\x4c\x60\xac\x75\x80\x1e\x9f\xcc\xdc\x5b\x08\xee\xd3\x28\xdd\x93\x10\x09\x04\x11\x56\x45\xec\x1e\xe0\x85\xcc\x77\x8b\x0f\x4e\x46\xe1\x72\x98\x98\x4a\x70\x2e\xce\xb3\xe1\x52\x83\xd8\x20\x00\x4f\x74\xa0\x79\x52\x0d\x63\xa7\x5f\xae\x33\xec\x3f\x4b\x83\x64\x69\xe1\xaa\x99\xea\x24\x4a\xf1\xfb\x08\xb0\x0a\x8c\x9d\xfd\x03\x30\x8d\xfc\x20\x23\x5e\xa9\xc8\x28\x3f\x4d\xa4\x7c\xfb\xcd\xbd\x03\x1a\x02\xd1\x64\x16\x0f\x2a\x58\x98\x67\x00\xb1\x95\x26\xd4\x1e\x4d\x7f\xd4\x58\x43\x4d\x72\x64\xbc\x8e\xb6\x42\xe6\xd8\xdd\x27\x59\xce\x2b\x85\xc9\x7b\x37\x02\xe7\x0d\xa7\x1f\x18\xed\xc5\x3e\x91\x40\xa6\x45\x62\x7e\x02\x78\xe8\xe7\x05\x39\x03\x74\x84\xdc\xd1\x8c\x62\xfa\x33\x07\x17\xd6\x14\x8a\x0d\x62\x3f\xf8\xb6\x5e\xa8\x56\x7e\xc7\xfa\x04\xc8\x92\xe3\xa1\xec\xee\x96\xe8\x32\xf4\x15\x50\x74\xc8\x3c\xbc\x93\xe9\x8c\xc6\x7f\x1f\xa1\x12\xaa\x06\xe9\x91\x5f\xa4\xd2\xde\xa9\x31\x55\x1e\x7c\x62\x3a\xa8\xa3\xa7\x61\x9e\xa2\x4f\xf9\x14\xe2\x64\xf3\x1f\xc7\x3d\xfa\x8c\x43\x0a\xc4\x6c\xe1\x6d\xc9\x68\xc5\xa4\x08\x5d\x5c\x38\x0d\x30\xcd\xc6\xf4\x3d\xee\x80\x6f\x38\xd1\xdf\x42\x0a\x06\x55\x74\x14\x47\x37\x05\x6d\xaa\x62\xf0\xc0\x98\xc9\xc5\x2f\xcc\x04\xcc\xa6\x42\xc4\x5d\x68\x73\x45\xa0\x94\x61\x3d\x4a\x3c\x6c\x87\x88\xbf\xa2\x18\x53\x8a\xd7\xec\xe1\xbd\xb6\xc9\x39\x24\xee\xc4\xba\xaa\x3e\xb1\x5d\xc1\x49\x4d\x65\xff\xa1\xa2\x3f\xf8\xe9\x85\x26\x34\x08\xfb\x02\xbf\xe3\x9a\x8c\x55\xb3\x00\xb1\xa0\x2e\xd3\x6c\x67\x14\xdd\x5a\xb7\x50\xd4\x7f\x02\x1f\x65\xe0\x8c\x63\x5f\x1d\x6b\x7b\xaf\x39\x6c\xb4\xf9\x3d\x56\xc1\xca\x46\x1b\xb1\x2e\x94\xde\x7e\x5d\x98\x65\x9a\x8a\xf0\xbf\x01\x9f\xc4\x22\x80\xe1\x11\xe0\x48\x00\xff\x80\xe0\xc1\x57\x15\x0e\x16\x56\x09\x45\x42\x81\xb2\x00\x07\xe3\xed\xfa\xa1\xea\x85\x44\x65\x54\x7a\x00\x6a\x4c\x32\x36\x41\x14\x95\xda\x16\x60\x98\xaf\x28\x23\xa4\x59\xcf\x10\x0a\x1f\x3c\x92\xc6\x39\x0c\x60\x66\xcd\xbf"}, -{{0x4a,0xaf,0x2d,0x13,0x28,0x84,0xf3,0x0d,0x11,0x27,0xcf,0x18,0x7e,0xe0,0x93,0x88,0xb4,0xa5,0xc4,0x4a,0x9a,0x92,0x67,0xe6,0x72,0x83,0x17,0x39,0x89,0x51,0xfb,0x61,},{0x83,0x72,0x7e,0x92,0x57,0x34,0x91,0x28,0x55,0x9e,0xbf,0x75,0x9f,0xdc,0x82,0x12,0x2c,0xce,0x76,0x74,0x66,0x39,0xc0,0xad,0xa9,0x76,0x1f,0x0d,0x60,0xb9,0x40,0xb1,},{0x5f,0x11,0xdf,0x39,0x06,0xa7,0x12,0xa9,0x53,0xf4,0x7c,0x85,0x98,0x06,0xb5,0x23,0x73,0x58,0xd0,0x8b,0xa9,0x5e,0x49,0xf9,0xe5,0x30,0xa3,0x71,0x65,0x83,0x5e,0x93,0x59,0xd9,0x76,0x9d,0xc2,0x1f,0xbb,0x4d,0x44,0x49,0x7b,0x93,0x90,0x5b,0xca,0x8d,0x99,0x17,0xc7,0x28,0x49,0x3f,0xee,0x3a,0xcd,0x5b,0x52,0x1d,0xbd,0x1e,0x24,0x08,},"\xd7\x3e\xaf\x11\x41\x3b\xf4\xd5\xbc\xcf\x6a\x2e\x80\x9c\xd6\x83\x2a\x51\x82\x3a\xa2\x2b\xd1\x6e\x09\xcf\x56\xff\x04\x5e\xef\x2d\x1a\xda\xdd\xa5\x0c\x2e\xbd\x67\xbb\xc4\xd7\x0e\x49\x3c\x96\x8c\xb4\xde\x49\x77\x06\x5d\x44\x63\x30\x06\x94\xc9\xca\xa5\x72\x06\xd6\x66\x46\x93\xd8\x46\x2c\x3c\x57\x6b\x52\x5c\xc7\xac\xf7\x9f\x26\xf9\x05\x5a\x1b\xcf\xa7\xd0\x77\xf4\x5e\xbe\x0b\x2d\x48\x1e\xbd\x63\xf7\x34\x0a\x33\xe4\xab\x68\xf1\x60\x49\x75\xec\x1d\xfe\xc4\x5a\x79\x1a\x2a\xbb\x10\x44\xd7\x5a\x4d\xb5\x5a\xdf\x59\xb8\x39\x4e\xbd\xe6\x82\x4c\x21\x14\x5b\x00\xef\x3b\x1b\x08\xed\x11\xfd\x51\xdd\xa5\x14\xed\x7e\x21\xe5\x4d\xba\xf6\xab\xb6\xd9\xe3\x17\xfc\xf9\xfd\x37\x5b\x18\x76\x4e\x64\xac\x9b\xe5\xb0\x8f\xec\x3b\x78\xab\xba\xb1\xd1\x2a\x2a\xb0\x9d\x55\x9a\xcd\xc7\x13\x3f\xb2\xe0\x00\x8e\x0c\x11\x4b\x7c\xad\xb4\xbf\x76\x30\x78\x67\x4d\x03\xe9\xc8\x07\xbe\xc1\xe2\xca\x71\xad\xcd\xaa\x31\x0d\x58\x7f\xa5\x69\x50\xfc\x0f\xb2\xe9\x79\x04\x3d\x50\xf9\xae\x23\xfa\x8f\x82\x1c\xd9\xd6\x23\x27\x89\xd0\xee\xcc\xfc\x4f\x47\xe3\xad\x80\x4e\x25\xcf\x5a\x42\x5f\x94\x37\x7d\x17\x87\x48\x33\xe6\xae\x36\x38\x17\x8c\x78\xb7\x95\x19\xd6\x4d\x97\x93\xf4\x50\x46\x06\xa0\xea\xb6\x87\x07\xf6\xe1\xf7\xcc\xcb\x51\x5b\xe3\xd1\x20\x1b\xcd\x19\xf2\xf0\xe2\x55\xc7\x22\xea\xb1\x2b\x43\xaf\xf8\xc8\xc5\x56\x11\x25\xfb\xca\x1f\x65\x42\x07\x6a\x06\x15\x2e\xb7\xe4\xb0\x78\x63\x24\xc2\x49\x5e\x79\xd7\x9c\x0a\x8e\x29\x5b\xb2\xe3\xdf\xd0\x5a\x90\x33\x19\x00\x65\xa2\x84\x55\x2a\x6e\x73\x60\x06\xac\xe4\x1f\x97\xcc\x43\x4a\x25\x12\x05\x1b\x72\x7c\xe5\xbc\x9c\x4a\x75\x52\x9e\xc5\x3d\xd7\xd1\xf1\x26\xe7\x93\x85\x77\x47\xb5\xba\x8d\x03\x15\x5d\x45\x55\xf5\x9e\x8b\xaf\x2f\x0c\xdb\xa8\x71\xac\x16\x0e\x75\x19\xa8\x52\xdb\x00\x4f\x70\x16\x41\xa4\x0a\x42\x2d\x4c\x38\xb6\xc0\xc3\xcc\x8f\xbb\xd0\x53\x22\xdd\xc0\x00\x1f\xb8\x67\x28\x6e\x29\x6c\xbd\x69\x86\x2c\xbc\xcc\x74\x47\x03\x8e\xb3\x0f\x8a\x81\x23\xb7\xb3\x13\x73\x98\x47\x02\xc3\xbe\x45\x7a\x4b\x8c\x54\xe6\xe5\x28\x04\x85\xa2\xc4\xff\x84\x52\x1f\x29\x8d\xde\xb3\xb3\xb2\xbc\x91\xf1\x14\xdd\xce\x67\x03\x02\x48\x04\x44\x69\xdc\x06\xf3\x62\xf2\x91\x9a\x3f\xec\xe5\x08\x23\x75\xd0\x40\x80\x37\x6f\xe2\x19\xd9\xb4\x57\x5b\x1c\xf1\xc9\xec\x4d\xca\xc5\x74\x9f\xc7\x78\xf5\x15\xdd\xa1\x3f\xa0\xd5\x86\xc2\x64\xb9\xbb\x61\x50\x33\x10\x76\x2c\x78\x9c\xa1\x16\x08\xd2\xfe\xe6\x74\xc7\x0a\xc4\xfc\x6d\x5e\xbc\xf6\x8c\x4a\xb8\x9b\xd8\x45\x55\xfc\x00\x75\x23\xc2\x8a\x7e\x1d\xd0\x8a\x98\x62\x04\x4d\x52\x45\xb9\x1a\x87\x78\xec\x9e\xe9\x84\xa4\x1a\x9e\x13\xb7\xab\xd6\x57\xae\x2a\x46\xae\x86\x01\x52\xc6\x44\xac\xd9\x53\x67\x67\x8f\xf6\x4c\xc5\x40\x06\xe3\x66\x14\x80\x5e\xd6\x18\xa7\xc6\xd0\xfd\x33\xa9\x08\x52\x30\x90\x84\x1c\x23\x0a\xf0\x98\x46\xd1\x32\xbb\x4c\x6b\x60\xe2\x44\x1f\x9d\x3c\x49\x87\x14\xf4\x70\xf6\xbc\x03\xa8\x0d\x14\xa2\x94\xb5\x65\xd1\xd5\xe7\x81\xcf\xfc\xb1\x30\x4e\xfd\xbb\xc7\xbf\xea\xbd\xed\xc8\x57\xac\xc4\x2e\x27\x62\xbb\xf9\x7a\xf8\x39\xa1\x66\x75\x2d\xa2\x95\x67\x28\x17\xf1\x0d\xbd\x47\x2d\x38\x1f\x53\x16\x55\x55\xac\x82\x22\xa7\x85\x35\xa8\x68\x05\xf1\xbe\xd4\x22\x88\x9f\x20\x61\x09\xaa\x74\x77\x2e\xdc\x0b\xb5\x1e\x8a\x98\x40\xcf\x62\xc9\x2f\xa6\x35\xb9\x0c\xae\x07\x6d\xd5\x0e\x5a\xed\x9d\xea\xc8\x43\xfa\x8a\x6b\x53\x99\x88\x28\x5f\xf1\xad\xab\xe4\xc7\xb8\x3d\x9e\x29\xac\x2d\x94\x09\x2d\xaa\xfe\xc9\xf6\x67\x36\x89\xba\x9e\x92\x52\xd8\x64\xd7\x57\x7a\xa8\x95\x05\xd3\x31\xfe\x78\x09\x86\x12\x77\x00\x2a\x0b\x44\xa9\x6b\xa6\xae\x4a\x52\xb3\x54\x8b\xf2\x68\xe7\x77\x78\x0c\x00\x20\x9b\x24\x5f\x8b\x14\x17\xee\x5e\x70\x1a\x12\x33\x4a\xd5"}, -{{0x4b,0xc7,0xda,0xab,0xc5,0x40,0x7c,0x22,0x6d,0x19,0x20,0xdb,0x4a,0xfd,0x21,0xb2,0xa5,0xb3,0xe5,0x9b,0x8e,0x92,0x46,0x05,0x3f,0x6a,0x1a,0x6a,0xfa,0x54,0xe7,0xe7,},{0xdc,0x53,0x98,0x85,0xfc,0x7b,0xee,0x00,0x2a,0xc5,0xde,0xba,0xe1,0x6b,0xdd,0xbe,0x4b,0x55,0x3f,0xa1,0x5e,0x81,0xee,0x79,0x88,0x76,0x94,0x0f,0x38,0xcf,0xc4,0xc5,},{0xa7,0xa6,0x48,0x88,0x39,0xbb,0xae,0x04,0xde,0xc9,0x2f,0x96,0xd7,0x28,0xc4,0x64,0x68,0x5d,0x7a,0x96,0xdf,0x51,0x2b,0x00,0x51,0x16,0x3d,0x22,0x53,0x8f,0x74,0x54,0x6f,0xa9,0x86,0xb1,0xb6,0x0a,0x6d,0x8c,0xc7,0x66,0xa2,0x6c,0x69,0x84,0xc9,0xcd,0x26,0x88,0x39,0x58,0x98,0xe2,0xb2,0xae,0x72,0xdc,0x6a,0x2d,0x5a,0x9f,0x75,0x0e,},"\x6a\xcc\xe9\x98\x43\xb2\x41\xaf\xe6\xed\xd5\xd0\xab\x78\xd0\xfb\x21\xc8\xc3\x5a\xff\x88\x13\x89\xd5\x05\xf2\xf1\xdd\x91\xaf\x1e\xb2\xad\x22\x92\x54\x92\x7c\x7f\x0e\xcf\xb7\xa8\x14\x16\x90\x57\x3a\x65\x5d\x69\x85\x3d\x74\xd0\x70\x8b\xf8\xb1\xe6\x0a\x03\x96\x30\x28\xa6\x25\xb7\x9f\x3d\xfe\xa2\xb1\x13\xff\xca\xb4\x6f\x3c\xfd\x4a\x62\x1e\x8f\xd8\xff\x0a\x96\x81\x43\xb0\xae\x03\xcc\xb6\xf4\x2e\x25\xe2\xd7\x4d\xbf\x51\x5b\xc3\x58\x69\x9b\x63\x50\x09\xb0\x1d\x61\xfe\x59\x7f\x1d\xc2\xc3\x5a\x7b\xa4\x55\x52\x78\xee\x0e\xa4\x56\xc7\xd3\x5f\xa8\x75\x7a\x41\x79\x24\xb1\xd0\xa8\x35\x1f\x22\x6a\x13\xec\x29\xd0\x25\xb4\x26\x96\xec\x1d\x99\x25\xb7\x69\xcd\x59\xc8\xe2\xf9\xcd\x3c\xe4\xe5\xc0\x20\xe0\x51\xe7\xa3\x6f\x3f\x97\xc1\xe8\xec\x71\x97\x4b\xc1\x6a\xc4\xde\x46\x51\xad\x4d\xf2\xe9\xc0\xee\xd6\x86\x92\x42\x24\xfe\x6d\xe6\xc6\x0d\xd4\xac\xc2\x6e\x0a\xab\xd8\x0c\x21\xd5\x09\xd9\x59\xb8\x0b\x43\x53\x95\x8d\x00\xe4\x4c\x51\x1d\x23\xbc\xf4\x45\x52\x60\x8b\xfa\x56\xa9\xc5\xae\x79\xde\x62\xbb\x23\xf1\x1d\x74\x0f\x48\x24\x0c\x27\xe1\x01\x99\x97\x51\xf2\x53\x47\x42\xc0\xa6\x91\x3f\xf6\x4b\x68\x3a\x18\x99\x5a\xbc\x39\x3f\xeb\x9d\x57\xc7\x1f\x49\xa0\x80\x55\x72\x98\xcc\x40\x5d\x11\xb7\x98\x8d\x71\x16\x84\x0c\x5a\xda\xf5\x3b\xc6\x72\xb4\x69\x23\xcc\x45\x7c\x70\x39\x94\x0a\xd4\xd5\xbf\x07\x3c\x6c\x88\x6b\x13\x39\x52\x59\x26\xd2\x81\xdb\xd1\xa7\x97\x39\xb2\xe3\x64\x14\xcb\xd3\x21\xb1\x85\xfc\x88\xf1\x8d\x2f\x81\xc8\x09\x97\x5b\xe9\xa0\x93\x64\x4c\xc5\x59\xed\x2a\xe5\xcc\x0e\x35\xcb\xdd\x18\x11\xf7\x02\x86\x05\x7a\x3f\x70\x30\x67\xed\xdd\xf5\xeb\x16\x90\xa7\x42\x7b\xb7\x3f\xe3\x02\x4e\xd0\xdb\x82\xa5\xce\x8f\x17\x16\x42\x8a\x76\xfd\x29\x2b\xa9\x9a\x30\x0c\x4b\x2f\x36\x0d\xa2\x12\x46\x17\x59\x0b\x10\xe3\xb1\x62\xa6\xe6\x7d\xd5\xd5\xa5\x9b\xcc\xa1\x0f\x61\x0f\xa0\x64\xaf\xfd\x55\xf8\x48\x3b\x98\xa6\x8d\x07\x6f\x27\x8a\xbf\x88\x8a\x08\xa0\x14\xe0\xea\x49\x91\x80\xfb\xc7\x98\x40\xce\xed\x13\xcc\x6b\x24\x58\xbf\xab\x9b\x0d\xd7\xae\x9d\x86\x46\x1f\xe2\x15\xe7\xc9\xf6\x3f\x76\x8c\xee\x4a\x88\x2d\xf0\xdd\x84\xe3\xeb\x4f\x2d\x7f\x6b\x18\xfa\x57\xd8\xbc\x7d\x9a\xfb\x63\xc2\x1a\xc4\x65\xe7\x90\x3b\x9b\xfb\x86\x38\xa2\x93\x61\xf7\xeb\xfc\x6e\x54\xe5\x46\x5a\x6c\xef\x46\x3a\xe2\x26\x43\xae\x41\x02\x58\x77\x9c\xa7\x4b\x70\x40\x1a\x94\x55\xa4\xd1\x57\xd7\x4a\x70\x29\xef\xe6\xb5\x19\xa8\xc4\xbe\x69\x67\x56\xe0\x45\xae\x40\x81\xb7\x7d\xd6\x03\x1f\x0d\x25\x0f\xa7\x61\xe6\x0f\x85\x9d\x90\x63\xfc\x10\x5a\xa0\xa1\xa7\x45\x0a\xf1\x53\xe7\x05\x47\x77\x77\xc4\x42\x58\x6d\xf4\x07\x40\x2b\xa2\x38\x75\x2f\xae\xf7\x4f\x33\x45\xc2\x6a\x45\x33\xbe\x9a\x61\xf5\xfc\x6b\xde\x48\xe3\xcb\xa7\x5c\x04\xd6\xf7\xb3\x33\xe3\x70\x06\xdd\x0c\x94\xfd\x3b\x6a\x13\x0b\xd6\xfc\xdb\x3c\x6a\xbe\x21\xca\x60\xeb\x43\x1c\xc2\xd8\xa2\xec\xe7\x16\x9d\x2d\xcf\xce\x27\x60\x82\x56\x57\xfd\x4c\x26\xf3\xc3\xb8\x30\xac\xdf\xd5\x08\x01\x1d\x14\x76\x4b\x3b\xe9\x17\x15\x57\x1a\x31\x83\x01\x8e\x0d\x22\x1f\xb9\x53\x2b\xb2\xe1\x71\x1e\x72\x5a\x27\x3a\xe0\xcc\x2f\xac\xcb\xa7\xd5\x50\x49\x29\x45\x9c\x99\x25\x17\xb0\x5c\x1d\xdd\x03\xaa\xcc\xd9\x37\xb8\x6e\xb6\x7b\xc8\x20\x2d\x01\xca\xb3\xd4\x89\x58\x6e\xea\x1a\xcc\xa7\xdc\x20\xcd\x0b\x64\x75\xc2\x58\xff\x67\x36\x61\x49\x6a\x22\xea\x96\xb8\x9d\xb4\xbf\x3f\xca\xae\x3b\xb0\x4f\x67\xdb\x09\x6a\x47\xff\x7e\x1e\xe2\x39\x56\x2d\xc1\x0d\x40\xf0\x53\x94\x4f\x3d\x7b\xcc\x3f\xf4\xc0\xff\x76\x56\x54\xba\x5e\xa6\x4f\x0e\xa6\x3e\x45\xa2\x1d\x9b\x12\x94\x9f\x14\xf7\xea\x70\x74\xe9\xb6\x59\xc5\xc5\xd4\x48\x16\x84\x2d\xe8\x96\x98\xa8\xfc\xca\xce\x43\xeb\x6b\x41\x35\xe0\xb3\x33\xac"}, -{{0xf2,0x6a,0xf2,0x10,0xe3,0xb2,0x01,0x73,0x99,0x0c,0x77,0x45,0x92,0x2c,0xdf,0x94,0x24,0x77,0x3a,0xbb,0x37,0x4d,0x77,0x7a,0x51,0x2c,0xf5,0xb9,0x7b,0x3a,0x00,0x0d,},{0x54,0x58,0x6a,0xbf,0x04,0x11,0x76,0xe0,0x6a,0xec,0x5b,0x60,0x10,0xe1,0x90,0x91,0x6d,0xa5,0x4a,0x8c,0x4b,0xde,0x28,0x8c,0xf2,0x4d,0x8c,0x10,0x7c,0xb3,0xb7,0x30,},{0xce,0x45,0x45,0x30,0xb9,0x22,0xba,0x5e,0xa1,0x62,0xf1,0xa4,0x52,0xe0,0x5c,0x00,0x36,0x3a,0x49,0xa9,0xdb,0x8a,0x56,0x94,0x97,0xc0,0x0c,0xaf,0x1c,0xbe,0xa9,0x91,0x80,0x77,0x05,0x54,0xed,0x4e,0x31,0x40,0xdf,0xca,0x45,0x55,0x15,0x9e,0xbf,0x48,0xef,0x5d,0x2a,0x50,0xf3,0x94,0xae,0xbd,0x78,0x21,0x16,0xed,0x65,0x69,0xa4,0x09,},"\x88\xe2\x6d\xa3\x5c\x54\x88\x4b\x47\x14\x6f\x4e\x3f\x01\x4a\xb6\x5b\x3d\x71\xaa\x7e\x3c\x33\x91\xad\xbe\xb1\x9e\xf2\xe7\xb9\x30\x2e\x28\x19\x91\xb2\x61\xb6\xa0\x99\x2e\x2e\x89\xa4\x9f\x48\x0c\xa2\xd8\xe6\x84\xb1\x2f\x9b\x15\x09\xb3\x8f\x6a\x7a\x98\xa5\xdd\xb4\xc2\xd8\x69\xfd\x03\x18\xe9\x8e\xcd\x8f\xd9\xdf\x49\x1b\xaf\x99\xa9\x29\x4d\xe4\x9e\x1c\xf8\xdd\x41\xee\x85\x73\x0a\xf0\x25\xa7\x01\x14\x3e\x4f\x0c\x8e\x3d\x92\xd5\x5b\x59\xca\x7d\x4a\x6c\x89\xad\x76\x0d\xff\xc0\xc2\x18\x92\x09\x50\x8e\xf6\xc2\x21\x4e\xdf\x99\x67\xb1\x7d\xef\x12\x3d\x86\x92\xc9\xe4\xe2\x0b\x1e\x98\x26\x88\x08\x70\x4f\x5f\x9f\xe1\xa6\xd6\x05\x5e\x32\xc8\x72\x56\x4b\xd1\x7e\xdb\x73\x59\x57\x86\x29\x01\x7f\x0c\x30\xfe\xab\x8b\x50\x4e\x22\x89\x23\xad\xc7\xe8\x1a\xe2\x0a\x85\x2d\xb0\xad\x67\x6a\x78\xe0\x81\x33\x6d\x6b\x04\x02\xf9\xcd\xc5\xd5\xe9\x01\x28\xca\x94\x5d\x10\x51\x5c\xa0\xc5\xef\x03\xf7\x31\xb1\xd4\x0a\x71\x07\x41\xd4\x1c\x1d\xd1\xca\x16\xb1\x06\x0f\xeb\xf2\xa0\x53\x2e\x6f\x5d\x76\x51\xef\x44\x63\x75\xec\x18\x09\x0c\xb8\x41\x8b\x82\x02\xf2\x5a\x03\x89\x03\x1b\x30\x7f\x22\x3c\x5b\x5f\x6a\xfe\x36\xa9\xad\xc1\x06\x8f\x2c\x6e\x0e\xa5\xb2\xb6\xcf\xeb\x8d\xc0\x04\xf7\xb8\x29\xc8\x04\x39\x06\x9b\x81\xa7\xbd\x90\x74\x77\xc6\x13\x5e\xf2\x82\xb7\x71\xf1\x41\xdb\xe7\x5a\x0f\xa0\x56\xe0\x6b\x8a\x1a\x1f\x98\xc2\x5f\xa5\x4d\x14\xc8\xfd\xb4\x2d\x65\x02\x59\x5c\x59\xd2\x5b\xac\xf1\xa1\x9a\xde\xfc\xc1\x31\x70\xf7\xa4\x31\x7b\x6a\xb6\x10\xb6\x09\xd4\x14\xb0\x07\x3e\xa0\x4a\xc2\x9e\xb1\x0e\xe7\x3c\xd7\x1a\x4c\xa6\x04\x09\xf8\xe7\x60\xe6\x0f\x93\x95\x10\x10\x0d\x0c\x8c\xd7\x6f\x26\x4b\xb3\x78\x11\xf9\x7a\xa5\x29\x9a\xc0\xb1\x2d\x41\x68\xff\x38\xec\xdf\xa8\x0b\x1e\x5c\x1b\x3b\xbd\x4d\x40\xd3\x54\x47\x35\xdf\x71\x67\xeb\x15\x8a\x9a\x9a\x23\x4d\x44\x5f\x1d\x66\x3d\xed\x71\x71\xed\xc6\x8d\x17\x2c\x92\x21\x4b\x82\xef\x13\xfe\x6b\x8c\x43\xaa\x89\xb7\x39\xb4\x99\x0a\xe9\x47\xa3\x4f\x02\x0a\x8d\x89\x43\xb0\xf7\xa5\xd6\x1d\xfa\x76\xad\xde\x02\x72\xe9\x8c\x11\x59\xc0\xfd\x8a\x1d\xe3\x3f\x2c\xef\x8e\xdd\x32\x85\x7b\x21\x89\xed\x96\x12\x80\x57\xeb\xde\xa8\x1f\x7a\x3a\x3d\xff\xe1\x89\x3b\x5b\xa8\x77\x55\x6c\x90\x38\x3f\xa2\xc5\xa6\xfd\x68\x0e\x8a\x67\xde\xe4\x80\x2d\x90\xdf\xe9\x71\x62\x3a\x7b\xe2\x2a\xb3\xca\x56\x06\x7b\x1e\x5c\x69\x4a\xa8\x4c\x19\xf1\x6d\x69\xe2\x84\xdd\xfa\x03\x9c\x10\x8d\x04\x35\x81\x38\x12\x39\x0d\x8e\xbc\x1e\x50\x13\x81\x76\xf2\x59\xdc\x0f\x26\xbc\xa1\x3b\xc9\x43\xf5\x0d\x5a\x35\x00\xb1\x8d\x59\x35\x74\xc6\x20\xfc\x09\x7a\xce\x43\x0f\xb8\x07\x28\xd3\xa1\xaa\x64\x4e\x50\x4b\x10\x09\xad\x67\x53\x6c\xeb\x01\x1f\x2a\x35\x7d\xbd\x00\x9e\x4a\x63\xf5\x24\xd5\xb5\x95\x7f\x33\x15\x67\xc5\xb4\xd1\x85\xa6\x1d\xf2\x2d\x70\x71\xd3\x1a\xe9\x21\x41\xe1\x99\xc1\x22\x89\x51\x5a\xed\x80\xc9\x10\x21\x45\x6b\xcd\x45\xcc\xc6\x34\x03\x7d\xcf\x69\xb4\x1d\x6b\x1f\xf5\x34\x71\x01\x0d\x99\xf1\x87\xf0\x46\x54\xf4\x36\x22\x28\x78\x71\xfe\xe6\xdc\xf5\xf3\x02\x3c\xbd\x09\x13\xd9\x9a\xff\x43\xfa\x95\xb3\x2e\xa2\xb1\x33\xb4\xc9\xac\x4b\x01\x7b\x7c\xf8\xf9\xbe\x50\x86\xfe\x92\xb4\x2c\xb8\xdb\xed\x5b\x63\x0b\xf0\x97\xc1\x8e\x2e\x55\xc3\xdd\x93\x27\x1e\x09\xc2\xd1\xcc\x6a\xf8\x7d\x83\xfd\xef\x3c\x3e\x3c\x4c\xba\xfb\xea\x9b\x60\xfd\x5e\x9c\xf0\x01\x1d\xe2\xe9\xe2\x6f\xbf\x09\xaf\xee\xf5\xc6\x98\x02\xa6\xc4\x6b\xdf\x54\xc1\x45\x86\x29\x44\x17\x3e\x01\x7e\x30\x14\x9e\xa5\xc0\x3c\x7a\xef\xa2\x8a\x9c\xac\x77\x67\x00\x2e\xa3\xfe\xfb\xde\xae\x5b\xae\x00\x5c\x37\x0d\xbc\x06\x42\x44\xd5\xb9\xbe\x55\x00\xa3\x57\x26\xa9\x9b\xc9\xe8\xc2\x75\x2d\x51\x0e\x13\x9a\xf2\x25\x58\x00\x98\xc8\x18\x9a\xa9\xc5\x20"}, -{{0x39,0xbf,0xfe,0x00,0x7f,0x8d,0xf7,0xce,0x4e,0x56,0xfd,0x17,0x6b,0x10,0x2b,0x92,0x3b,0xa4,0x8a,0xeb,0x82,0x69,0xfd,0x0c,0xd5,0x20,0xc2,0x3a,0x7b,0x23,0x6e,0x6c,},{0x95,0x32,0x63,0x68,0x00,0x01,0x0b,0x3d,0xd4,0x01,0x2e,0x34,0x1f,0xca,0xd6,0xd2,0x9a,0xfa,0xd4,0x84,0xe6,0xfd,0x73,0x6e,0x89,0xd5,0xbc,0x02,0xba,0x0a,0xc8,0x53,},{0xa2,0x7c,0xca,0x4b,0x9f,0x5b,0x95,0xad,0x0e,0x44,0xe4,0x74,0x0c,0x15,0xde,0xae,0xb9,0x3f,0x22,0xa9,0xb2,0x54,0xeb,0xbd,0x23,0x29,0x36,0x5a,0x00,0x96,0x6c,0x9f,0x4e,0xc1,0xe5,0x5c,0x58,0x94,0xe7,0xbf,0xc2,0x3d,0x39,0x8d,0x39,0x70,0xb9,0x46,0x5e,0x98,0xa8,0xd2,0x3e,0x72,0xda,0xe8,0xe3,0x50,0xda,0x35,0x31,0xae,0x69,0x08,},"\x7a\x8c\x20\xbf\x2e\xff\x69\xaf\x8b\xad\x6b\xdf\xab\xc7\x90\x9c\x58\xce\x74\x6c\xc4\xdf\x78\xb6\x9b\x33\xc1\x05\xba\x3b\xd8\xda\x75\x24\x47\x58\xb5\x17\x2d\x5c\x45\x01\xbc\x39\x97\x01\x85\xee\x3d\x43\x70\x83\xa9\x95\x9f\x81\xe7\x66\x5b\x82\x9a\x69\xa5\xd7\x2e\x03\x4d\x35\x1a\xdd\xdc\xeb\x3d\x3f\xff\x58\x99\x88\xdf\x18\x2b\x46\xfa\x53\xd2\x6e\x7c\x9e\xac\x06\x22\x15\x78\x8f\x23\x37\xbf\x90\xf0\x17\x7d\x8c\xa7\x44\xf9\x5f\x28\xfe\xa8\x54\x59\x3c\x43\x62\xc8\x2e\x9d\xed\x19\xb9\x04\xff\x99\xd2\xbe\xa8\x24\x32\x82\x2e\x52\xc3\xda\x6d\x46\x2d\xa7\x54\xff\x1f\x8b\xd1\x09\x94\x2d\xf5\x1d\xba\x25\xb7\xcd\xe8\x38\xd5\xf5\x24\x23\x9f\x13\x31\xf4\x63\x19\x4e\x10\xff\x56\x79\x5b\x29\x68\x78\xfe\xb1\xf5\x5d\x43\xec\x7d\xaf\x0c\xa5\xab\x3d\x68\x4b\x55\xbb\x0a\xa4\xc7\x20\xd4\xb5\xc2\xe8\x30\xc8\x58\x69\x4d\x3d\x0f\xdb\xaa\xd0\xbf\x67\xd8\x73\x18\x2d\x95\xb2\x41\x2f\xce\x5e\x7b\x00\xfa\x6b\xfc\x38\xb1\x32\xef\xb9\x6f\x87\xbc\x6c\x10\x07\x0a\x57\x16\xec\x9b\x33\xa2\x69\x2c\xdf\x5b\xc4\x1c\x7f\x73\x7e\x28\xc4\x22\x03\x17\xa4\x89\xb7\x32\x3d\x5e\x20\xf6\x5d\x37\x5d\x76\x9f\x9e\x79\x37\x6f\xd0\x2d\x85\x36\x86\x71\xe7\xe0\x81\xeb\x75\x3f\x88\x85\x45\xeb\xe5\xc0\x00\xb2\xf8\x01\x43\xeb\x35\x8d\x43\x18\x5e\x2f\x1c\x29\x4b\x9f\x29\xc8\xbb\x91\x48\x2d\x43\x87\x49\x4a\xad\x17\x6d\xeb\x85\x54\x0f\xd0\x05\xc9\x7d\x13\xe6\x66\x3f\x09\x94\x4e\xb4\x3a\x46\xe6\x23\x67\x94\xbf\x6e\x21\xf8\x1d\x0a\x42\x09\x0f\x9c\xce\xf9\x0a\x6c\x48\x07\xb5\xff\x54\x13\x00\xe5\x93\x48\x81\xa8\xd9\x21\x96\xb4\xce\xe8\x5d\x28\x09\x2a\x82\x8e\xa3\xbf\xc6\xb7\x45\xad\x21\x9b\xe9\xf5\xe9\x57\x41\x17\xd0\x79\xe0\x2f\x4b\x74\x8e\x2c\xc0\x1a\x32\x82\x6a\x37\x08\x23\x19\x14\xd2\x77\x2c\x76\x41\x19\xfd\x99\xd5\x3a\xb5\xb5\xa2\xe9\xd8\x91\xa4\x8a\x9a\xaa\xac\xc2\x63\x38\xb1\x82\x48\xdb\x8a\xb2\xd5\x25\xda\xf1\x5f\xf5\x3a\xcb\xc3\xaa\x98\xd4\xf2\xd4\xa3\x37\xbb\xaf\x6d\x1b\xe2\x19\x85\xa4\xaf\x60\x0e\x29\xbb\xb4\x2c\x8d\x89\xe6\xb3\x89\xc6\x6f\x42\x27\x0c\x3a\x0b\x05\x1b\xdb\x62\x38\x81\xe0\x2f\x2f\x42\x94\xce\xc3\x47\x63\x86\x74\x7a\xba\xe6\xc7\x70\x0b\x8f\x9b\x03\x87\xcd\xdf\xb7\x36\x68\xfb\x57\x69\x3d\x84\x74\x19\x6b\x33\xab\xd1\x2d\xce\x59\xa5\x7c\xf7\x2e\xe6\xcc\x1d\xdb\xaa\xdf\xb1\x9e\x90\xaf\x81\x31\xb3\xa9\x0f\x98\x67\xf4\xc7\xe1\x5b\xdf\x9e\x21\x84\x77\x01\x6b\xd0\xad\x3b\xe8\xdd\x05\x96\x71\xff\x65\x6c\xbd\x4e\xd8\x98\x08\x6d\xe4\xd4\x23\xf3\xdf\xb2\x70\xbb\xf1\x9d\x9f\x53\xf7\xf6\xf2\xd2\x2c\x6a\xc9\x02\x5c\xba\xdb\xa4\x42\xe3\x1d\x98\x11\xe3\x7e\x84\x7d\xbd\x48\x4d\x80\xcf\x74\x30\x39\xff\xa7\x04\x84\x70\xfb\xdc\x60\x80\xf6\xd3\x81\xdc\x7e\x3f\xa2\x71\x22\xdf\x53\xcc\x06\x39\x4e\xa6\xfc\x44\x6e\x1b\xa7\x25\x38\x73\x3e\xd3\xab\xb6\x85\xf1\x6d\xfd\x5c\xcf\x58\x5a\xe8\xfb\xf9\x95\x4b\x50\xf1\x0b\x7e\x54\x32\xa2\x2b\x36\x94\x06\xa9\xb7\x08\x89\x61\xf0\xae\x20\x74\x95\xae\x71\x85\x39\x6d\xcc\xf2\x92\xdc\x46\x3f\x41\xf3\x76\xa1\xca\x89\xee\xfb\xae\x19\x26\x91\x52\x03\x1b\xfd\x81\x52\x88\xe8\xb5\xba\xf3\x48\xc4\xf8\xff\x3d\xff\x4f\xd6\xd1\x08\xf8\x71\xda\xa3\x52\x11\x0f\xa6\x41\x88\xb0\x1b\x85\x26\xa8\x45\xaa\xed\x13\x3e\x45\x6b\x4c\x83\xc4\xfd\x4b\xbb\x16\x5b\x40\x90\x30\x7e\x8e\xb1\x7d\xf1\x76\xc3\x22\x52\x0f\x37\x59\x9c\x21\x05\xaa\x81\x20\x75\x83\x94\xa4\x22\x24\x73\x47\x67\x64\xcf\x0a\xf7\xc5\x51\x83\xeb\xa9\x68\x3d\x72\x70\x63\x14\x43\xf3\xc5\x1f\xb8\xab\x0c\x13\x0a\xc4\x36\xab\x60\x3f\xf4\xf1\xd8\x65\x6c\xdb\xed\x22\x9a\x20\x2b\x40\x00\x8e\xa1\x0b\x17\x15\x42\xf7\x4a\x70\xb7\xbb\xac\xc4\x01\x6b\x7f\x63\x6a\xa8\x96\x33\xb7\x66\x80\x58\xf1\x33\x12\xf5\x7c\x51\x62\xd1\x8e\x39\x9e"}, -{{0x3c,0x40,0x80,0xcd,0xa0,0xfc,0x3c,0x03,0xb6,0x14,0xd9,0x80,0xf2,0xff,0x83,0x1f,0x5b,0xe0,0xe7,0xa9,0x81,0xd5,0x38,0x1a,0x16,0x18,0xe0,0xb8,0xfd,0x00,0x17,0x76,},{0xf1,0xc3,0x26,0x9d,0x87,0x04,0x02,0xca,0xa4,0x38,0x82,0x13,0x5d,0x9d,0xba,0xdb,0xbb,0x16,0x2d,0xfc,0xa0,0xb3,0xda,0xd1,0x97,0xe6,0xb8,0xa7,0xee,0x67,0x9a,0x70,},{0xc9,0xd4,0xa4,0x72,0x8b,0x8f,0xdd,0x24,0x0d,0x9c,0x49,0x8a,0xa3,0x5d,0xe9,0x5a,0x4b,0xbd,0x51,0x78,0x5b,0x73,0xc8,0x40,0x3f,0xdf,0x04,0x0d,0xfa,0xed,0x94,0x47,0xef,0xad,0x00,0x69,0xb6,0x7c,0x78,0x3d,0x4b,0x81,0xd9,0x66,0xbe,0xf6,0xe3,0xd9,0xa8,0x08,0xa0,0x58,0x4b,0x98,0xec,0x2b,0x18,0x32,0x2c,0x4c,0x92,0x0e,0xb0,0x0a,},"\x0c\xee\xbc\x0e\x8a\x47\x72\x0f\x25\x83\x5e\x2b\x9a\xcf\x89\x1b\xcc\xa4\xbd\xa3\x86\x37\xf3\x63\x27\x44\x58\xba\xa9\xe2\xbb\xaf\xed\xd0\x93\x8f\x56\x88\x73\x4e\x22\xac\x50\xfb\x12\x0f\x66\x5f\x6c\x4c\x61\xc6\x53\x17\x39\xb9\x29\xac\x83\xcd\x77\xf8\x96\x3b\x75\x44\x88\xb9\xb8\x59\xc1\x38\x53\x63\x7c\xf0\x25\xc1\x4e\x8f\xdd\x11\x8f\xaa\x14\xcf\x39\x30\xce\xb3\x5f\x10\x4d\x95\x44\x1e\x56\x48\x94\x40\xf6\x20\x41\xef\x1a\xa7\xc4\xb0\x8b\x28\x07\xe3\x2b\xb9\x58\x4b\x90\x04\xd7\x6e\x76\x53\x33\x48\x50\x6d\x64\xf1\x12\xe1\xff\x6f\x93\x8f\x64\x22\x30\xbf\x38\xaf\x01\x0e\x41\x98\x72\x70\x24\x8b\x13\x63\x5a\x35\x67\xb3\x55\xbb\xa5\xb5\x74\x48\xc6\xd1\x3b\x74\xf3\xbe\xbf\x61\x79\x15\x82\x10\x28\xfc\xa5\xde\xfa\x4c\xe5\x42\x4c\xa1\x91\xcd\x54\xa2\x29\x44\xa3\xd9\x40\xe4\xee\x2e\x2b\xa5\xd5\x04\xc8\x5f\x95\x9b\x51\x4c\x4f\xab\x41\xcc\xb5\x74\x3d\x9c\xb2\xf9\xbf\x33\xd1\xd8\xc2\xa5\x86\x9e\x9f\x46\x60\xc3\xfb\x22\x4b\x39\x14\x1e\x31\x10\xc9\xee\x8a\xeb\x87\x1e\x14\xc6\x2c\x6b\xe3\x8f\xb9\xa4\x56\x8d\x73\x68\x10\xbb\x9d\x20\x73\x17\x8b\x6c\x7e\x87\xe3\x58\x2e\xfc\x62\xb5\x3c\x23\xc5\xd4\x65\x20\xba\x33\xff\xb3\xa9\xca\x64\x9e\xf2\x6f\xe7\x4a\x3c\xff\x61\x88\x42\x73\x26\xb8\xc9\x6f\x74\x35\x4c\xb3\xec\xaa\x61\x1b\x12\xcd\xed\x56\x5e\x59\xfe\x1f\x8f\x40\x00\x97\xe9\x3e\xa8\x59\x51\xb5\xb4\xe9\x00\x9e\xea\x7d\xb9\x37\xe4\x34\x9c\x4e\x5e\x00\xc4\x45\x6c\x6c\x5f\x4e\x57\x41\x1b\xaf\x4e\x46\xe7\x00\xac\x40\x02\x57\x76\x5f\x48\xda\xb0\x3e\x43\x9f\x76\xc1\x49\x9b\x51\x08\x04\x7c\x83\x01\x09\xdc\xe7\xf7\x40\xd1\x39\x37\x87\xe2\x9d\x37\x16\xd3\xc4\x7e\x75\x5c\xb8\x28\xe7\xd4\x40\xa9\x71\x97\x51\x97\xeb\xdb\x3f\x9b\x73\x7b\xa1\x1f\x7f\xd0\x38\x6a\x95\x92\x49\x01\x7d\xe7\x23\x4d\x5e\x5a\x9b\x47\x3b\xb9\x58\x3a\x37\x42\xc7\x74\xee\x55\x2a\x12\xa1\xf3\x6e\xb3\xf2\x6c\x88\x5b\xed\x22\xe9\x1c\x74\xcf\x32\xa8\xdd\x3e\xdb\x08\xb6\x74\xbf\x38\x6e\xf4\x27\x72\x79\x12\xd5\x7c\x5f\xaf\xaa\x1c\xfe\xb7\x40\xcd\x52\xb9\xde\xe9\x95\xe3\xd0\x16\x1c\xd9\x21\x3f\x38\xfd\x68\x1d\x53\x8a\xb8\xbf\x97\xb7\x45\xf5\x49\x80\x03\x0e\xf8\xb7\x26\x96\xd4\xe2\x74\x73\xfb\x0f\x1a\xcd\x5d\x0a\xae\x02\x97\x21\x16\x80\xea\x0f\xc5\x9d\x7b\x6d\x51\xc6\x32\x92\x58\x5a\x1d\x55\x3d\x0c\x89\x54\xb4\x2a\x4b\xd6\xfc\xd3\xa4\x95\x75\xbf\x5c\x88\x95\x3f\x1f\x4e\xa7\xfe\x0e\xd7\xa5\x79\xd1\x69\x7e\x64\x5e\x2a\x61\xc6\x9d\x1a\x56\xbc\x60\x5b\xb0\x40\x60\xa2\x77\x8d\x50\x9a\x8a\xad\xbf\x35\xd9\x46\x97\xcc\xee\x9d\x35\x43\xdd\x01\x28\x1a\x03\x1f\x2a\x0e\xb3\xa9\xeb\x13\xae\x56\xff\x44\xfa\x0a\xed\x4f\x34\x88\x74\x7d\x6a\xf8\x20\xf3\x98\x9b\x71\x33\xf4\x49\xea\x56\xd3\xa7\xf7\x31\xe7\x91\xb7\xed\x2a\x5d\xb9\x39\xbb\x75\x35\x2d\xe7\xda\xec\x50\x66\xfd\x57\x55\x71\x65\xad\xff\xa6\x31\xcd\x3f\x96\x7c\x3c\x7c\xfc\x11\xcc\x1f\x14\xfa\x23\xde\xfe\xc3\xeb\x02\x39\xb4\x5e\xd6\x01\xa3\xa8\x07\x8c\xcf\xc7\xf8\x38\x09\x02\xa8\x59\xee\x9c\xe2\xdb\x79\x5e\xfa\xca\x0a\x01\xdc\x08\x79\xd5\x06\xac\x97\xd1\x07\x04\xd7\x75\x7b\x3c\xcf\x3b\x37\xc3\x39\xb4\x2d\xb2\x37\x82\x27\x80\x23\xe4\xc2\xe7\x7d\x74\x24\x6c\x9e\x54\x41\x49\xa5\x5c\x0c\x92\x0e\xbf\x29\x86\xb4\xc5\xb4\xb3\x57\x2f\x74\x8c\x4b\x15\xc7\xf8\x63\x99\x9b\xc5\x13\x2a\xda\xd0\x97\x61\xeb\x76\x50\x50\x19\x76\x9f\xb5\x54\x22\xf6\x03\x18\x4e\x24\xc0\xd4\xf3\x76\x19\x87\xb5\xc5\x0f\xea\xfc\xce\x53\x30\x2a\x3a\x41\x5e\x20\xf5\x6a\x05\x48\x03\xe5\x53\xba\xcd\x24\x2a\x5e\x13\x64\xaa\x3b\x2d\x7c\xb3\xbc\x1e\x1b\x86\xa4\x74\x31\xcb\xd3\x96\x95\xb6\x7f\x55\x4c\x46\x45\xb7\x23\x69\x04\x09\x4c\x11\xaa\x1b\x40\x32\x6b\xa9\x1b\x8b\xf4\x87\x3e\x9a\x4d\xe0\x4e\x2b\xf4\x62\x59\x72"}, -{{0x45,0x43,0x8f,0x91,0x46,0x5d,0x74,0xa2,0x82,0x5b,0x0f,0x66,0xa3,0x5b,0xd7,0xc8,0xd0,0x05,0x86,0x54,0x79,0xb3,0xdc,0x10,0xa9,0xb5,0x6f,0x29,0x7d,0x31,0xb9,0x26,},{0xf0,0x92,0xb5,0x88,0x03,0x30,0x87,0x1e,0x5a,0xaf,0xdd,0x3c,0xeb,0x38,0x50,0xee,0x7e,0x09,0x41,0xa2,0xa1,0xdc,0x89,0xf4,0xfb,0x47,0x71,0xd7,0x5a,0x22,0xf6,0xf2,},{0xd9,0x28,0x7b,0x7f,0xec,0x01,0x7f,0x2e,0xa4,0x0a,0x14,0xa1,0xf6,0x2d,0xca,0x78,0xb0,0x2a,0x3d,0x66,0x32,0xdf,0x7c,0x60,0xeb,0xd9,0x0f,0xc5,0xe4,0x92,0xc5,0xc6,0x2c,0x43,0x16,0x6b,0xf8,0x56,0x58,0xfb,0x30,0xa0,0x8b,0x57,0xa5,0x81,0x31,0x21,0xb8,0x03,0x97,0x57,0x1a,0x31,0x2b,0x6d,0xd1,0x1b,0x65,0x39,0x20,0x54,0x16,0x02,},"\x30\x71\xd4\xb7\x20\xdf\x10\x93\x65\x99\x67\xcd\x4e\xef\xef\x2e\xf9\x67\x84\x75\xf7\xde\xc5\x8f\xec\xec\x1d\x92\x8d\xea\xf8\x02\x45\x7a\x19\x34\xe6\x04\x55\xf4\x96\xcf\x42\x51\x82\x0e\xd6\x0a\x3d\x81\x33\xb6\x24\xd3\x3a\xf2\x6a\x26\x27\x84\xb5\xa2\xfb\xa7\x3c\xca\x2a\xa5\xe5\x19\xe1\xf5\x39\x58\x47\x80\x64\x98\x64\xba\x5f\xbc\x1f\x01\x1d\xdd\xac\x38\x1f\x8d\x48\xd0\xd6\x0c\xe8\x23\x17\x01\x17\x3c\x9d\x2a\x30\x7a\x76\x30\x2e\xbc\x69\xdc\xbc\x93\x0d\x28\x43\x14\x75\xb5\x16\xf9\x8f\x77\x8e\xd2\xe1\xff\xf2\x72\x90\x9a\x27\x2c\xc3\xfb\xb6\xb3\x1c\x80\x41\xa3\x7c\xb7\x77\xe0\x62\xe4\x96\x49\xaf\xad\x12\xc1\xb5\xf7\xfc\xb8\x06\x5a\x99\xe7\x42\x33\x62\xad\x16\x90\x60\x31\x26\x5d\xb7\xe8\xb8\x97\x51\xf8\xa4\xa4\x07\xf2\x50\x26\x50\xfe\xd7\x53\xe4\x2c\x8c\x91\x1e\x50\xb9\x4b\x38\x00\x69\x5b\x0e\xba\x7d\xff\x06\xb7\xa7\x10\x11\x7e\x49\x20\xd4\xb1\xc6\x05\xa3\xeb\xf3\x2e\x06\x96\x67\x16\xed\xa1\x4b\x30\x42\x99\x8a\x3c\x7a\x5e\x9f\x83\x54\x2d\x7d\xde\x65\xe5\x28\xbe\xd6\x10\x1d\xeb\x33\x1d\xeb\x94\xcd\xd4\x60\x44\xbe\xf8\x8c\x09\x7b\xaf\xd4\x0d\x69\x21\xa7\xc4\x84\xc8\xf9\x66\x84\xdc\x37\x16\x71\xd9\x4e\xee\x7c\xbe\x5d\x58\x77\x15\x31\x4c\xff\x0d\x18\x77\x27\x2d\x81\x90\xa9\x0e\x18\xbf\xb3\x21\xd5\x2b\xf7\x47\x05\x13\x7b\x2a\xbf\x91\x65\x73\x17\x67\xa1\x3a\xdc\x9c\x85\xe0\x39\x7b\x47\xae\xf9\x6b\xad\xb2\xca\x7f\xcb\x82\x93\xb0\x1f\xd1\xde\x31\x6e\xe1\xe6\x5f\x35\x6b\x9d\x6e\x8e\xa1\xfd\xd8\x37\xbd\x96\x08\x11\x49\xea\x2d\xcd\x73\xc4\x88\x1f\x32\xb7\xde\xeb\xc3\x71\x5e\x2d\x7c\xdb\x64\x3e\x0d\x98\xf4\xe8\x46\x50\x8b\x04\xb3\x24\x39\xff\x14\xb1\x16\x4f\x46\x84\x6d\xf9\xaf\xae\x44\x46\x4c\xf5\x50\x10\x4c\xd3\xaa\xb3\x81\x75\x40\x47\x0a\xaa\x2a\xb9\x55\x9a\x68\xb7\xff\x6b\x1b\x9c\x0c\xe9\xf5\x86\x9c\xbd\xcd\xd6\x17\x09\x09\x42\xe3\x53\xb4\xc7\x7f\x09\x39\x58\x96\xbe\xcd\xdf\xf1\xab\x7f\x07\x58\x6a\x51\x4d\x81\xfb\x09\x63\x61\x55\x75\x66\x87\x0f\x16\x91\x98\x34\x85\xa8\x0c\x34\x13\xda\x98\xb8\xd1\x9c\x78\xe6\x37\x9f\x94\x3e\x5b\xd5\xa5\x69\x7a\xa3\x3c\x5e\x6b\xfc\xfb\x7b\x8d\xf1\xe1\x57\x4e\xe4\x16\xfa\xb3\xc8\xa7\xd0\x88\xb3\xa0\x57\xcf\x86\x53\x21\xb7\x4e\x61\x03\x52\x6d\xd9\xad\x15\xca\x5a\xd3\xc0\xf6\x97\x18\xe2\x70\x81\xd4\xb3\x4a\x7c\x6d\x1a\xab\x6b\x96\xc0\xa7\x54\xb9\x89\xb4\x94\x06\x38\xc9\xed\xe3\xd1\x7b\xd4\x9f\x65\xbf\x78\x3d\xc8\x5f\x1c\x4b\x14\x48\x76\xcd\xbd\xb2\x28\x2a\x95\x64\xaa\x81\xb5\x70\x92\x08\x0d\x64\x48\xfb\x65\x80\xec\xf0\x9f\x82\xa7\x55\x01\x0d\x55\xd4\xa5\xe4\xf3\x05\xe2\x59\xdb\xe9\x95\x08\xb4\x79\x25\x0d\x80\xec\x17\xc8\x76\x0a\x93\xe0\x5a\x29\x57\x1f\x68\x56\x07\x30\x22\xc8\x70\x69\x13\xc4\x6a\x2e\xfd\x2e\x9c\xaa\xe4\xff\xa1\xb4\x22\x2e\x3d\x70\xe9\x79\xe8\x1a\x71\x95\x1d\x7c\xb8\x30\xbc\xbc\xf9\x01\xaf\x24\x4f\x64\xe4\xad\x9f\x52\xfa\x3b\x62\x03\x1e\x35\x16\xda\x50\xbc\x2b\xce\x78\xeb\x9d\x61\xbf\xed\xd9\xb3\xf5\x7e\x89\x35\x5f\x17\x7d\xb6\x16\x2b\xf6\x1d\xa0\xe4\x54\xc3\x42\x88\xb9\x67\xc3\xfb\x4c\x34\x1b\x32\xd4\xd1\x3a\x31\x98\x69\xb8\xe3\x60\x46\xf9\xe3\x38\xb5\xf3\x6a\x1f\xc1\xa7\xed\xa7\xd7\xb0\xd4\x38\xe0\xa7\x5d\x84\xbb\xe4\xd6\x8c\x87\x9a\xda\x80\xdd\xe2\x3f\x71\x55\xb5\x32\xcc\xcf\x7a\x63\xf1\xbe\xdf\x84\xf8\x2f\x44\x0c\x9e\xc3\xcb\x0e\x45\xf3\x2c\x92\xf7\x64\x38\xf5\xb4\xb9\x10\x44\x1e\x67\x38\xaf\x3f\x5d\x20\x50\xd5\x79\xee\x96\xb8\x8f\x3b\x00\x81\x0a\xb1\x26\xff\x3a\x8f\xef\xd9\x71\x04\x43\x24\xdd\x4e\xb3\x44\x7d\xac\x5b\x77\x80\x9c\xda\x8c\x71\x68\x25\x49\xd7\xcf\x2d\xce\xe3\x40\xed\xcf\x94\x94\xac\xa4\x29\x01\xe2\xc1\x1e\xd9\x77\x90\xaf\x48\xbc\xea\x29\x52\x1e\xf0\xe3\xd0\x3c\xda\xde\xcd\xc8\x94\xdd\x07\x56"}, -{{0x72,0xcf,0xce,0xf4,0xc9,0xd6,0xa1,0x98,0x6d,0x19,0x03,0x11,0x84,0x0e,0x55,0xcb,0xaf,0xac,0xc8,0xa6,0xeb,0x5e,0xcc,0x72,0x93,0x4f,0xda,0x53,0x5b,0xdc,0xff,0xb2,},{0xa9,0x44,0x64,0xd8,0xcc,0x8f,0x3e,0x43,0x39,0x39,0x47,0x64,0x9f,0x91,0xc2,0x75,0x23,0x27,0xe4,0x0d,0xac,0xa1,0x1a,0x99,0x70,0xc5,0x18,0x1e,0xda,0x37,0xd6,0x06,},{0xdb,0x72,0x70,0xac,0xce,0x78,0xd7,0xfb,0x09,0x08,0x0a,0x32,0x79,0x41,0xbc,0xe7,0xeb,0x14,0x5b,0x9e,0x36,0x61,0x86,0x6a,0x86,0x83,0xf9,0xa1,0xa3,0xde,0x97,0xfb,0x02,0xb0,0x25,0xdb,0x9e,0xc7,0x6f,0xf3,0x25,0x60,0xfe,0x63,0x88,0x27,0x74,0x2e,0xa2,0xf4,0xeb,0xef,0x6b,0x7c,0xce,0x44,0xf9,0xaa,0xee,0x43,0x4f,0xd7,0xc1,0x08,},"\x66\xa6\xcb\xe8\x8a\x8a\xb9\xa3\x38\x47\x79\x7f\xc4\x80\xb2\x44\xe8\xa2\xb8\xec\x79\xe8\x0b\xc2\x63\x77\x53\xde\xb3\x6f\xa3\x01\x4f\x84\x3e\x22\xa4\x7d\xb0\xa3\x17\x78\x38\x5e\xc1\xf4\x55\x67\x2e\x0d\xff\x6c\xa2\x1c\xa4\xcf\xd2\xb9\x89\x47\x1b\x7f\xfc\x30\x78\x28\x13\x8b\x0a\xd4\xe6\x47\xc2\xd1\x3c\xef\x72\x44\x69\x05\x4a\xbd\x37\x40\x24\x5a\xea\x4b\x78\x9e\x24\x4e\x95\xcf\x9e\xcf\xd0\x8a\x0d\x13\xc7\xce\xd3\x93\x33\x27\x27\xa7\xf3\xd8\xfb\xda\xbd\x93\x9d\xe2\x8c\xaa\x41\xcc\x96\xc7\x08\x11\x98\xe2\x26\x53\xd9\x4e\x02\x4a\x61\xf5\xf3\xdc\x5a\xa3\x7f\xa9\xad\xdd\xc9\x6c\xf1\x69\xd3\x50\x62\xa0\xa2\x9b\xa4\x5a\x53\x9c\x87\xa6\x8a\x3a\x03\x04\x36\x13\x09\xd2\x13\xe6\x14\xee\x83\x73\xda\xfb\xa2\xa7\xd6\xed\x7d\x2a\xd3\x77\x04\xc0\x94\x6e\x4d\x09\x3e\x2d\x94\xd0\x61\x36\x4c\xc1\x23\x10\x63\x72\x91\x03\xa7\x7c\xcb\x50\x18\x91\xbb\xc3\x18\x54\x57\xbb\xd2\x86\x9e\xb6\x3d\xc6\x0f\x19\x6f\x10\xa3\x8b\x7b\x36\xcb\x3f\x64\x3d\x35\xdd\xbf\x43\x8a\x44\xbf\x0c\x8f\x57\x0f\xad\x41\xbd\xde\x26\x7f\x0f\xfc\xf1\xf2\xf9\x27\xd6\x26\xd1\xb0\xd9\x80\xa0\xce\x22\x3f\x2f\x00\x54\x84\x5a\xfe\x41\xd3\x9d\xe5\xa4\x57\x21\x9f\x27\x6c\x67\xe6\x9b\xe2\xd5\xc9\xe0\x70\x13\x16\x39\x56\x1c\x26\x75\x1f\xb0\x64\x35\xe0\xe4\x2e\x25\x08\xc5\xf4\x9c\xd1\x2b\x51\x7c\x98\x33\xff\x97\xf5\xe5\x1e\x1d\xce\xaf\xa9\x42\x6d\x3d\xc5\x2f\xd1\x37\x9c\x64\xcc\xaa\xbb\x26\xdb\x1a\xf6\xde\xd7\x15\x36\x28\x84\x2f\x0c\xbd\xbb\xbd\x6a\xa0\xcf\xa5\x40\x7f\x40\x94\x96\xc0\x65\x32\xdb\xea\xc9\x4d\xab\x9b\xab\xa0\xb3\xc9\x88\xfa\x03\xd3\x6f\x91\x1d\x80\xe4\x9b\x37\x0b\x68\x37\x03\x7f\xf2\x49\xe7\x6d\x69\x2c\xd1\x77\x37\xe0\xd0\x79\x65\xd3\x3f\x17\x04\x2b\xbc\xd1\xe9\x90\xe0\x40\xf7\x19\x36\xf6\xfc\xa2\x54\x2a\xe3\x37\x48\x36\x77\x87\xc0\x1b\xde\xa7\x5c\x9a\x0e\x66\x15\x02\x81\xc4\x68\xfe\x5c\x73\xaf\x9e\x5b\xec\x37\x2d\x50\x20\xc3\xd3\x7f\xa1\x03\x5a\x67\xe2\x24\xd0\x95\xf0\x66\xa5\x1f\xe1\xf6\x81\xc3\x07\x39\x39\x27\x2f\x6a\xf7\x75\x0e\xd8\xd1\x83\x49\x17\x8a\xb4\xa2\xee\xb4\xe9\xca\x82\xbb\x67\x29\x6e\x98\x90\xf3\x16\xc9\xd9\x49\x59\x53\xd6\x84\x36\xeb\x1c\x1a\x2f\xb6\xa1\xcc\xa4\x5a\x8e\x88\xa0\x9b\xdd\x65\xa5\x55\x80\x25\x61\x8b\x36\xd7\xf3\xcb\x38\x9d\x2e\x2a\xb1\xed\x23\x32\x28\xec\x92\xa3\x27\x97\x8c\x0a\xdc\xed\xdb\x6c\x96\x32\xd3\xab\xd7\x97\x16\x21\x71\x37\x54\x75\x8e\x21\x01\x3a\x0c\x3d\x00\x9b\x6e\x31\x93\xcc\x15\x2c\x57\xef\x73\x10\x7b\xd4\x35\x7d\x52\x8b\xe4\x08\x73\x02\x7b\xf1\x84\x0f\x68\x55\x36\x08\x0f\x12\xc5\xff\xa9\x3c\xa6\x29\x73\x67\x80\xe0\x15\xe8\x6d\x19\x09\xf0\xd8\xf3\x72\x01\x0c\x9c\xb7\x2c\x09\x89\x84\x5f\xc8\x83\x15\xe6\xb9\x37\x0d\xc9\x2d\x36\x83\xef\x44\xd3\xf7\x5f\xc9\x6c\x4b\x0e\x89\xe1\x3d\x68\x2d\x19\x88\xb6\x85\x71\x3e\xad\xa8\x42\xbe\x9d\x2b\xbe\x2a\x76\xbb\xa1\x5d\x38\xcb\xaf\xb6\x5c\x40\xc2\x15\x9b\x0c\xee\xb0\xd7\x69\xb9\xbe\x35\x55\x40\x73\x4f\xf3\x77\x36\xc0\xf0\xfa\xcb\x95\x15\x93\x09\x36\x5b\x96\x46\xbc\x4b\x34\x4f\xb1\x9a\x5c\x16\x39\xa8\x8e\x87\x31\x7b\xfb\x3b\x5e\x7b\x51\x30\xfa\x7d\x56\x43\xed\x4d\xa0\x64\x30\xc8\xa0\xc1\x85\x8c\xcf\x2f\x9a\x6e\x3d\x62\x01\x22\x53\xf0\x12\x2d\xba\xb4\xa3\x54\x75\xa6\xf6\x55\x89\xb2\xb0\x95\x99\x28\x26\xe4\xf1\xb5\x8f\xa0\x50\xb8\xf9\x5c\x4f\xeb\xa3\xfb\xaa\xdd\x2c\x22\x44\xad\x4a\xbd\x41\x01\x39\xad\xf4\xc1\x53\xcb\x5e\x69\x33\x7a\xf1\x76\xa7\x83\x7e\xea\xea\x99\xbd\xcd\x59\x38\x5a\xfd\xed\x34\xff\xba\x80\x63\xa3\x5f\x4f\x55\x8e\x4e\xeb\x48\xf1\x48\x7b\x56\xb1\xf8\xd1\xf7\x30\x67\x62\x1c\xb5\x48\xc8\x08\x75\x3e\x35\x26\xa2\xf2\xaa\xbd\xe1\x26\xbe\xa5\x21\xcf\x67\x3d\xea\xfa\x79\x2c\xa5\xbd\x22\x12\x79\x5b\xd6\x6b\x86"}, -{{0xa6,0x33,0x7e,0x4d,0x3b,0x1a,0x49,0xb1,0x26,0x31,0x67,0x78,0xc6,0x13,0x51,0x6c,0x03,0xac,0x88,0xc9,0x6d,0x92,0xff,0x5c,0xc7,0xe0,0xc8,0x52,0x7c,0xce,0x1a,0x62,},{0xf5,0xea,0xc4,0xfe,0x0e,0xa1,0xa5,0xf2,0x36,0xb4,0x9d,0xa3,0x3a,0x24,0xe2,0xf3,0xa8,0x3d,0x4b,0x26,0x0c,0x54,0xd3,0x41,0x6c,0x64,0x4e,0x05,0xc8,0x38,0xbf,0x51,},{0x78,0x13,0x76,0xc9,0x51,0x2f,0xa3,0x3c,0x45,0x70,0x47,0xa1,0xf4,0xf0,0xda,0x31,0x76,0xe6,0x0e,0xe4,0x77,0x82,0x86,0x9b,0x7e,0x9f,0xa5,0x84,0x1d,0x96,0x4f,0x3c,0x1a,0xd6,0x6b,0x70,0xc1,0x14,0xb1,0x77,0x1c,0x32,0x4c,0x83,0xff,0x6c,0xd9,0x97,0xae,0xfc,0xcd,0xc5,0x9c,0x11,0x4d,0xb9,0xf2,0xf3,0xca,0x7d,0x84,0xa7,0xb6,0x0f,},"\xe3\x34\x30\xc3\x8c\x4a\x40\xb3\xc6\x6e\x20\xcf\x3b\x70\xe9\xfe\xa8\xcc\x50\x76\x1f\x2a\xfe\x24\x9e\xc0\x59\xc0\x7b\xc3\xb3\x7e\x5b\x94\xf4\xa4\x3e\x31\x00\x99\xb1\x9a\x85\xf5\x9d\xff\x73\xa7\xe4\x95\xc4\xdf\x31\xf7\x47\x80\xcd\xef\x7b\xd6\xe4\x7c\x39\x4c\x18\x91\xea\x30\x52\xe3\xcc\xf5\xd8\x4b\xae\x08\x2d\x24\xba\x71\x78\xac\x65\xd2\x29\xad\x18\xa8\x49\x40\xf6\xb4\xdb\xc5\x96\xee\x63\xc1\x81\xb5\x7b\x5b\x49\x69\x89\x79\xc1\x86\x32\xfa\x82\x1c\xa6\x1e\x35\xa0\xd0\x35\x1f\xe1\x3d\x69\xe0\x6d\xdc\xc8\xd6\x66\xdc\xa2\x45\x02\x17\x7f\x34\x4e\x2f\x44\x05\x75\xd3\x9e\xbf\xe5\xe7\xf1\x06\x53\xb6\x5b\xef\x29\x1d\xc8\x13\xa0\x43\x4c\x97\x5d\xe1\x64\xc1\xa7\x6b\xf6\xfc\xef\x98\xf2\x31\x81\xc0\x09\xb9\x18\x30\xb6\x18\xe4\x87\x48\x47\xd2\xe2\x1b\xbd\xb9\x3f\x20\xcd\x8b\x1f\x4b\xaa\xdf\x99\x42\x8a\x22\x67\x43\x86\xa6\x68\x15\x2b\x4b\x90\x39\xff\x06\xab\xcf\xe3\x34\xa0\x62\xf7\x94\x05\x61\x72\xec\xbc\x07\x94\xdf\x98\x27\x1b\x9a\xcf\xe4\xb7\xda\x55\x3a\x87\x63\x42\x37\x63\x00\x09\xa0\x5b\x25\x7c\x18\x4c\xbe\x23\xd9\xcd\x5a\x03\x86\x58\x01\x0f\x57\x48\x99\xf3\xb2\xd1\x54\xd1\x85\xee\x67\x23\x09\x13\x65\x0c\x3a\x05\xb5\x4a\x2e\xdc\x24\x3a\x42\x87\x39\x8e\x37\x69\x28\xea\x9c\x6b\x2c\xba\xf3\x71\x25\x25\x40\xe2\xb8\x04\x3f\xcf\x55\x68\x13\x19\x6a\xe5\x72\xc2\x7c\xfb\x5a\x46\xab\xb9\x72\x9a\xf2\xdc\xfc\x29\xe0\x33\xdd\x11\xf3\x3e\x86\xcc\x6a\xc3\xbc\xe6\xf3\xf9\x57\x7d\x36\x78\x1a\x69\xed\x7e\xaf\x8c\x82\x63\xa0\xf1\x8e\xba\x0f\xe8\xa4\x81\xf3\xe1\x5a\x55\x59\x94\x34\x19\x5f\x7c\xb0\x57\xdd\x36\x4e\xaa\x07\xdd\x0d\xfd\x26\x6b\x80\x7f\x53\xa2\x07\x0f\xd7\x91\xe8\x72\x42\x2f\xd9\x07\x13\x4f\x4a\x8a\x78\xa8\x76\xbd\xcb\x03\x1a\xc8\x60\xdf\xe0\xbb\x57\xe1\x05\xdb\x82\x87\xb3\x1a\x60\x4e\xb7\x12\x69\xbe\x5b\xa2\x29\x98\x5c\xea\xbc\x2b\xdf\x16\x5a\xc7\x41\x65\x0b\x1f\x01\x3a\x66\xc9\xbd\x24\x3d\x03\xa8\xb1\xc5\x08\x13\x81\xcb\x92\xe2\x3f\x90\x57\x77\x1f\xc0\x7c\xa3\x2d\xff\x1d\xb9\x4f\x5a\xdf\xd2\xf4\xff\x9a\xf3\x1d\x25\x0d\xd4\xf8\x6b\x22\x59\x2f\x60\xa7\x45\x75\x15\x62\x13\xf1\x08\x46\xc7\x46\xa9\x20\xfe\x39\x85\x1b\x32\xfe\x4c\x8b\x87\x58\x76\x5b\xc5\xb8\xb9\xd5\xb9\x92\x63\xdf\x36\xf9\x78\x88\x05\x3f\xd1\x0f\x1d\x68\xf5\x77\xae\xd5\x59\xbc\xfd\xe7\x44\xbc\x65\x11\x07\x6c\xaf\xd6\x89\x44\xa0\xed\x10\x55\x2d\x11\x34\x4b\xc7\xe4\xd9\xef\x93\x6d\xac\xce\xd5\x27\x43\x31\x32\x95\x9b\x1c\x73\x24\xad\x1c\x4c\xbc\x3a\x1a\x73\x6b\x1f\x02\xaa\xe8\xe0\x61\x1a\xe2\x3f\xdd\x47\x4f\x5b\x8e\xe7\x05\x6f\xcb\x5a\xf6\x13\x3e\xcc\x08\x4b\xb9\xf1\xf5\x0c\xbd\xac\x66\x24\x44\x37\xb4\x34\x8f\x4e\xdf\xe2\x37\xfc\x3c\x38\x29\xab\x94\xeb\x4f\x14\xca\xb1\xcc\xd6\xca\xee\x36\xfa\xdc\x20\xa3\x10\xcf\x06\x90\x62\x2c\xdc\xa8\x48\xae\xd0\x3f\xf4\x03\xa6\x63\x3f\x4f\x65\x79\x94\xb7\x80\xdd\x60\x48\x14\x9c\x3b\xfb\xc1\x78\x89\xe3\x7d\x90\xb1\xe5\x42\x0e\xb3\xd4\x59\x6b\x91\xba\x11\xbc\x02\x29\xc6\x5d\x05\xb9\x3c\xd7\xe0\x45\x4d\x1f\x3c\x6e\x1e\x80\x71\x98\x37\x92\xc4\xd4\x36\x8d\x07\x78\xae\xf4\xe1\x23\x33\x5f\xd2\x96\x2c\x65\x7b\xd0\x51\x35\x71\xa5\xfc\xe2\x11\xde\x62\x87\x4f\x27\xca\x10\xdc\x15\xba\x2d\x44\x5f\x1c\xf4\xbe\x5f\x83\x3c\xf0\xb5\x64\xc0\x22\x57\x6b\x98\xc0\xa2\x43\x49\xb6\x70\x85\xf9\x22\x02\x67\x5d\x7d\xac\x48\xb9\x5e\x3b\xfd\x65\x55\xa9\xec\xb7\xc7\x2f\x08\xbf\xec\x0d\x22\x02\x22\x49\x2f\xdc\x96\x36\xf0\x36\xec\x45\x08\xa3\x65\xb7\xb7\x09\x79\xf9\xeb\x4a\x72\x63\xa8\xba\xcb\x1c\x1d\x01\x55\x73\x86\x46\xcd\xd4\x6a\xb9\x23\x4a\x17\x03\x11\x50\x0d\x0b\xae\x6e\x55\xa8\x63\xbd\xaa\x56\xf5\x16\x45\xad\x85\x29\x7a\x73\x81\xf8\xd2\x0c\xf9\x6c\x47\x4d\x1b\xb8\x1f\xce\x13\x2b\x14\x55\x5d\x1a"}, -{{0x10,0x7d,0xa9,0x8d,0x0e,0xe8,0xe7,0xc0,0x0f,0x6d,0x41,0xec,0x26,0x59,0x44,0xce,0x67,0xef,0x8c,0x8f,0xfb,0x51,0xf4,0xf1,0x1f,0x4e,0x5f,0x1a,0x27,0xfb,0xe8,0x05,},{0x3b,0xec,0x34,0xb1,0x61,0xb1,0xbc,0xff,0x00,0x9f,0x8c,0xfc,0x50,0xd8,0x4c,0xeb,0x6a,0x2d,0x5b,0x20,0x3b,0x52,0x38,0xa8,0xaa,0xd8,0xa8,0x36,0x18,0xb4,0x42,0xe7,},{0x53,0x25,0x2b,0x92,0x3a,0xd1,0x9c,0xc3,0x97,0x84,0xd3,0xa9,0xae,0x59,0xd6,0x2a,0x63,0x00,0xdc,0xc5,0x0a,0xc8,0xfd,0x07,0x13,0xcb,0x58,0x84,0x45,0x01,0xd8,0xd3,0x80,0x5a,0xfa,0x0f,0xda,0x64,0xc7,0x3e,0xa0,0xf6,0x0e,0x6a,0x8b,0x34,0x45,0xbf,0xff,0xe6,0xca,0x6b,0xfd,0xc8,0x7e,0x12,0x8b,0xaf,0x99,0xbf,0x62,0x68,0xfc,0x09,},"\x1a\x7b\x7f\x3e\x1c\x7c\x41\x49\x2a\x7c\xe7\x99\xef\xdb\x2d\x9d\xc2\xf2\x48\x9c\x84\xae\x28\xbb\x7d\x08\x4f\x32\xec\xa8\xfb\xb0\x66\x88\x5a\xc6\xf2\xef\x74\x49\xe7\x12\x26\xa8\x2e\x9f\x15\x37\x72\xa9\x93\xeb\x6b\x6b\xca\x64\x91\xd2\x6a\xca\x5d\xee\x98\xb7\x7a\x1d\xdc\x59\x92\x2b\x31\x45\xc4\x47\xde\x73\x7f\xaf\xac\xba\x5a\x75\xf2\xa8\x01\x37\xb5\x59\x46\x97\x22\x0d\x19\x61\x76\x74\xa6\x91\x13\xfd\xf7\x7c\x34\x3a\xf2\xb7\xe3\x86\x1b\x5b\x78\x22\xf5\x8d\x60\x08\x9c\x3c\xa5\x4c\x74\x9d\x27\xf8\x83\x79\xc0\x67\x59\x8f\x06\x39\x39\xba\x86\x31\xd1\xf5\x2d\xc9\xab\x45\x50\x45\xfb\x36\x0c\xc2\xa5\xb6\xb0\x12\x7f\xac\xfc\xf5\xb1\xb4\xc3\x3e\x3f\x19\x4f\xc9\x24\xb8\x54\x16\x8c\xb1\x16\x9a\xb1\x09\x97\xb4\x38\xb7\x1c\x80\x87\x83\x47\xbe\x88\x7a\xf4\x48\x10\x13\x4b\x51\x4c\x80\x69\x08\x20\x1a\x3d\x3e\x6d\x0c\x56\x12\x0c\x43\x14\x87\x4d\xc2\x94\x4d\x84\x44\xf0\x1b\xaf\xa3\x4a\xa6\x2e\xce\xf0\x98\x15\x45\xe5\xd0\x2f\x40\x16\xc0\xb1\x64\xfc\x05\xae\x18\xf5\x35\xc3\x1b\xf2\x0b\x86\xf3\x1f\x7a\x79\x4a\xba\x14\x89\x84\xc3\xff\x43\x3d\xc2\x22\xc4\x43\xb5\xd2\x6c\x1f\x66\xe6\xc5\xf1\x9d\x19\xcd\x6e\xad\xd4\xdc\x94\x10\x1b\x2f\x52\xb5\x8c\x9d\x45\x90\xcb\x10\xdb\xc5\xd6\xea\xcd\x11\xd4\x2e\xd0\x9f\x15\xbd\xe4\x4e\xe9\x27\x1d\xef\x29\x2f\x73\x1b\xf3\xb4\xac\x6c\xd1\x27\xe4\x88\x4c\x2c\xb3\x0b\x28\x5f\xc9\x24\x76\x38\xa2\x99\xe4\x16\x52\x06\x24\xd1\xec\x8d\x0d\xf2\x49\x89\x39\xc7\x19\xa9\xe7\xbd\x29\xa3\xc5\xc3\x2a\x3e\x82\x41\x36\x8d\x6e\x4f\x90\xfe\xa2\x9d\xc3\xa3\xf1\x47\xea\x9f\x76\xc5\x78\x0e\x73\x14\x3f\x55\xd3\xde\xc7\xb6\x63\x41\xd3\xf3\xea\xc1\xd9\x8f\x8e\x7d\x4e\x87\x75\x09\xb4\x43\x8c\x3a\x52\x46\x6d\x24\x2a\x10\xb4\xc2\x7c\x4a\x0d\xb9\x23\x2d\xad\x01\x14\x14\xeb\xfb\xd5\x79\x06\xf1\xa4\x10\x20\x7b\x52\x6b\x0d\x1f\x1b\x69\x86\xb3\xeb\xd7\x55\x0a\x2b\x3c\x15\xfc\x24\x09\xc7\x62\x6e\x0d\xd3\x30\xef\x67\x22\xe3\xba\x48\xb1\xd9\x20\x56\x52\xac\x19\x4c\x21\x47\x3c\xe2\x58\x55\x9d\xb5\x11\xef\xad\x3e\x5d\x55\xf2\xa7\x96\xd6\x5a\x6a\xb9\x7d\x86\x31\x06\x2a\x59\x3a\x13\xaa\xa0\x95\xdb\xc9\x3e\x62\x17\xce\xd6\x19\xcb\x16\xa5\x7e\x74\x43\x55\xa1\x6b\x15\xe7\x7d\x49\x79\x11\x92\x99\xbb\x04\x3e\x48\xfa\x3e\x61\x54\x60\xe1\x64\x88\x29\x84\xa2\x23\xd4\x18\xca\x95\x34\x0c\x5b\xfc\xda\x67\x3f\xcd\x13\xb2\x9f\x2c\x47\xd2\xf9\x7e\x3e\x8c\x61\x3b\x6c\x58\xdf\x0e\x62\xcf\x23\x06\x1d\x6f\x54\x5b\x75\x50\x33\xfd\x3d\xc1\x40\x5e\x5f\xef\x35\xa1\x3e\x01\x5f\x98\xb1\xcc\x42\xf7\x1b\x99\x68\x1f\x96\x81\x25\x82\x29\xa4\x47\x3d\x86\xea\xbb\x0c\x17\x92\x79\x41\xe5\x0c\x08\xf3\x4a\x76\xb4\x3b\xcc\x6d\x04\x2e\x56\x32\xef\x9c\xcc\x91\xb6\xe6\x95\x0f\x5d\x30\xf6\x70\xfb\x39\x02\xc3\xd4\x09\x31\x5a\x40\xb0\x82\x1c\xe8\xa9\x9a\x97\xfe\xca\x54\x78\xbf\xd7\x82\xe7\x87\x67\xb3\x11\xf3\x74\x16\x3f\x58\x96\xb0\xbe\xb9\x58\x38\xe6\x45\x87\x8c\x64\x99\x03\x85\x12\x3b\x61\x57\x5d\xd8\x42\xdc\x76\x35\x4b\xac\x9c\x6d\x5a\xcd\x99\x35\xb6\x09\xbc\xcc\xb8\x46\x3d\x39\x22\x5d\xa1\xaf\xb8\x91\x1d\x36\xe6\x09\x89\x2d\xd1\x72\x38\x52\xab\x9f\x82\x75\x8f\x3f\x1e\x4d\x28\xdc\xf0\x2c\xb0\x6e\xed\x26\x84\x4a\xae\x68\x82\xed\x44\xbc\xe4\x4a\xbc\xd1\xdf\xba\x63\x34\x18\xc9\xf1\x55\x87\x9c\x97\xab\x27\xf8\xae\x23\x83\x30\x39\x2b\xe5\x49\x1a\x07\x86\x62\xda\xaa\x02\xa3\xd5\x45\x8b\x77\xc5\x49\xc4\x9b\xe2\x01\x24\x5e\x7a\xae\xc0\xd9\x4e\x54\x37\xbe\xca\x6e\x5a\xb0\x46\xd6\x94\xe9\x6b\xf5\x1e\x04\xfb\x44\x37\x9b\x2b\x9b\x80\x16\x75\xfe\x14\x77\xf3\xe0\x89\x87\x4a\x60\x11\x71\xd8\xb6\x8f\x02\x02\x01\x46\x01\xa5\x3f\x81\x2f\x53\xe5\x81\xc3\xb9\x63\x12\xb3\x6b\x9e\xe0\x4f\xff\x11\xd9\xea\xb4\xe4\x51\x48\xdc\xc8\xf0\xfa\xb1"}, -{{0x8b,0xc2,0x29,0xfc,0x23,0x46,0x53,0xb1,0x3c,0x92,0x47,0x10,0xcb,0x46,0x8b,0x8f,0xa9,0xb2,0x80,0xe2,0xad,0xb4,0x9c,0xb4,0xb3,0x6b,0xf5,0x9d,0x6f,0xa4,0xa6,0x39,},{0x46,0x14,0x69,0x75,0xdf,0x67,0x04,0xcb,0xf4,0x53,0x20,0xa5,0xe6,0xcb,0x6d,0xe8,0x13,0x46,0x9f,0x31,0x31,0xe6,0x1d,0x44,0x7b,0xbc,0xa1,0xa4,0x77,0xa0,0xc5,0x57,},{0xd2,0x43,0xb8,0x7d,0x13,0x97,0xd5,0x94,0x13,0x9d,0x83,0xc3,0x9a,0xcf,0x85,0x01,0xd0,0x73,0xbd,0x4b,0xe7,0x18,0xb4,0xc2,0x06,0x98,0x07,0x29,0xe7,0x20,0xa4,0xc5,0xb0,0xea,0x91,0xa2,0x8e,0xa1,0x26,0x04,0xa9,0x87,0xe6,0x95,0x91,0xc5,0x43,0x04,0x9f,0x29,0x73,0xbb,0x91,0xc1,0x70,0x21,0x3c,0x32,0xa6,0x4a,0x0f,0xac,0x82,0x04,},"\xba\xe2\xdc\x7f\x94\xab\x5c\xcd\xca\xa8\xcf\x49\xed\xbe\xf0\xf6\xd7\xae\xb1\xfa\x89\x07\x80\x05\x33\xaf\x44\x92\x61\x11\x94\xe5\x6c\xef\x37\xb1\xf0\x33\x30\x37\x38\xae\x2c\x3b\xc4\x58\x8f\x5c\xb3\xd5\x5f\x34\x5b\x9a\x40\x7e\x78\x77\x42\xa0\x6a\xf0\xb6\xee\x20\xde\xe3\xdf\xe9\xc9\x1d\x76\x2a\x3e\xbd\x19\xae\xd0\x79\x07\xbb\xb9\x1c\xd7\x76\x32\x65\x40\xde\xd9\xf7\xff\x7d\xda\x76\x61\x5f\x97\x8e\x94\x90\xf4\x06\xed\x2d\x91\x16\xe2\x09\x3f\xa7\x85\xe9\x71\xb5\x06\x2d\x31\xcb\x40\xff\xf9\xe3\xc5\x51\xa7\x3b\x20\x24\x5d\x46\xdf\x4d\x7f\xd1\x30\x3a\x28\x18\x01\x72\xd9\xa2\xbf\x55\x93\xc4\x79\x17\xb5\x86\x90\x91\x7c\x1f\xb0\xe1\xe2\x99\x4d\x1f\xa9\x77\x35\xae\x37\x8d\xe6\xea\xfd\x5c\x1a\x25\xab\xaf\xa3\xcf\xd2\xdf\x7a\xea\xbd\x6e\x68\xfc\x44\xed\xf8\x2f\xc8\x36\x94\xe5\xd8\x41\xa1\x5b\x14\x56\x8b\x61\x10\xbe\x64\x4b\xf2\x2b\x71\xfc\x47\xd7\xf0\x7e\x16\x66\x95\x7d\x0f\x87\xda\x17\xf1\x3f\xcd\x63\xc1\xc2\x96\x6f\x68\x7d\x25\xdc\xbd\x99\x63\xf0\x1e\xff\x13\x2d\x5f\x2b\x86\x67\x78\x16\x58\x8c\x12\x3e\x94\x57\xbe\xfc\xce\xd2\xd3\xcd\x1d\x1b\xeb\xe8\xdd\x8f\xbb\x15\x87\xe5\x53\xcb\xcc\x4c\x87\x62\x06\x4c\xd3\x2e\xf7\xa1\x70\x24\x10\xf7\x7f\x15\x24\x0d\x7e\x2b\xb5\x82\xc6\x78\xc0\xda\x88\xef\x45\x22\x83\x0b\x14\x36\x60\xac\x9c\x43\x4d\x95\x77\x2e\x6e\xee\xed\x60\x14\xae\x16\x82\x4c\xcd\xc4\xdf\x2d\xf6\x4a\xeb\x69\x80\xb5\x1d\x11\x89\x85\xdc\xbb\xd1\x96\x1f\x31\x5e\x6a\x94\x33\xf0\xb9\x6b\x1e\x63\x51\x25\x7e\xad\x83\xe0\x5b\x4c\xc8\x9c\x92\x4b\xf8\x35\x58\xba\x7d\x2e\x7c\xa3\x7c\x03\x17\x9a\x8f\x85\xb8\x31\xe7\x21\x7b\xf4\xc5\x53\x83\x87\x61\xd3\x26\x02\x85\x3b\x81\x59\x3b\x0e\xbf\x8e\x4b\x9f\xfa\xf0\xec\x40\x5b\x2a\x83\xaf\x7d\xe5\x55\x4d\xaa\xd2\x8b\x58\x2e\xe0\x8b\xd8\x4b\x37\x55\x50\xca\xe0\x8a\xe4\xa5\xbd\xa7\x15\x81\xfc\x3b\x7b\x54\x49\x8c\x4e\x1a\xfb\x96\x6b\x4a\xf1\xd9\xc8\x43\xa6\xb2\x5b\x34\xe0\x4c\xfd\x9b\xd2\x37\x42\x44\xf1\xfe\x20\xec\x62\xbe\x3c\xcf\xab\x4e\xde\xf7\x9e\xd6\x4e\x6b\x71\xaa\x92\x28\x12\x7c\x63\x59\xea\x1c\x4a\x80\x87\x89\x08\x96\xff\xa4\x6e\x00\x92\xde\xc7\xef\xbc\x96\x0a\x17\xb7\x70\x91\x6f\x95\x40\x70\x13\x2e\x26\xd9\x8d\x97\x74\xa2\xac\xdf\x80\x9d\x58\x6d\xf0\x25\x2f\x67\xcf\xe8\xd9\x85\xa3\xe2\x48\xdb\x0f\x90\x73\x1a\xce\x7a\xbd\x99\x9c\x74\x6b\x69\x64\x8d\x5c\x3b\x4b\xd6\x11\x37\xe0\x8f\xcc\x8b\x2e\xfc\x56\x76\xbc\xd8\x56\xa1\x3b\x36\x21\x51\x47\x4c\x4a\x1e\xfd\xed\xc5\x92\xcf\x3e\xad\x1a\xba\xbc\xd4\x8e\xe2\x04\xd2\x77\x26\xad\x1b\xda\x4f\xe4\xb0\x9a\xb5\x10\x89\xd0\x16\xde\x6b\xa2\x59\xea\x81\x80\x7f\xaf\x21\x1c\x87\xe4\xc9\xef\xbf\x6a\x4c\x75\x3e\x08\xf7\x80\xed\x55\x33\x8c\x0f\xde\x14\xfb\x99\xb3\x07\x22\xb5\x59\x4b\x3a\xbe\x02\x04\x7f\x46\x62\x42\x42\x1f\xb8\x11\x76\xc9\xc4\xf0\xfd\x2b\x5e\x7c\x5a\x0f\x65\xa0\xc5\x9a\xa8\xc3\xa9\x86\x08\x7d\xe7\xba\x40\xba\xca\x77\xbd\x36\xac\x21\xce\x34\xe9\xfe\x97\xfa\xcc\x4e\x29\x83\x30\xee\xce\x1c\x8e\xc6\x23\xe6\x6a\x4b\x0f\x23\x42\xd2\xc5\xa0\x2c\x5f\x5a\xbd\xdc\x5f\xf1\xf1\xf2\xd0\x3c\x1d\x4e\xe9\xb4\xb3\x42\xed\x3b\x1c\xc2\x65\x61\xf3\x21\x7b\xf8\x50\x0e\x08\xf0\x27\x57\x1c\x53\xc9\x23\x26\x05\xa5\x3f\x2b\xda\x02\x4e\x39\x92\x91\x63\xa8\xe0\x07\x91\xac\x06\x56\xbb\x07\x83\x82\x5e\x71\x05\xff\xa9\xd9\x09\x69\xdc\x09\x4a\xf4\x6f\x70\x2e\x85\xcc\x11\xe4\x42\xb3\xd5\x53\x4c\x1d\x32\x75\x20\x7d\x6d\x29\xa9\x42\xc3\x58\xed\x5f\xa0\x75\x57\xc3\xc0\x14\xcf\x54\x1f\x9a\xae\xea\x60\x25\xb4\x1e\xcd\xd8\x48\x51\x2b\xa2\x5e\x72\x1e\x43\xd3\x29\x18\x5f\x8f\x94\x89\x2e\x9e\x2d\x5e\x7c\xbb\x99\xe7\xad\x25\xf6\x9e\x5b\xef\x73\x2c\xfc\xeb\x07\x86\x11\x55\x3c\xc7\x83\x77\x37\x5e\x74\xe6\x6f\x1b\x9d\x8d\x20"}, -{{0x3e,0xdb,0x50,0xff,0x07,0x4e,0xf9,0x71,0x7f,0x4f,0xb0,0xb6,0xce,0x25,0x2b,0xf4,0xbd,0x04,0x9c,0x90,0x83,0x77,0x5f,0x52,0x9e,0xaf,0x51,0xe9,0x75,0xcb,0x32,0x45,},{0x4b,0xc2,0x1f,0xe0,0x3e,0x67,0x9a,0xbb,0xfc,0xd8,0xc5,0xea,0x2b,0xcc,0x4d,0x83,0x8a,0x78,0x7d,0x48,0x40,0xc3,0xbc,0x39,0xde,0x4b,0x04,0xc4,0x17,0xc7,0x68,0xa5,},{0xde,0xb3,0xd9,0xfc,0x7b,0x2d,0x86,0xab,0x4b,0x92,0x6f,0x99,0x52,0x79,0x70,0xab,0xb5,0x18,0x38,0xbc,0xc2,0x91,0x9e,0x94,0xcd,0xa3,0x37,0x1f,0xd0,0xe7,0x69,0x3f,0xe3,0x7e,0x0c,0x40,0xe1,0x23,0x3b,0x09,0xff,0xa9,0x03,0xa0,0x34,0xdd,0xe2,0x87,0xc0,0x23,0x7d,0xc5,0x94,0xf5,0x3a,0xbc,0x87,0x84,0x48,0x69,0xdc,0xe9,0x20,0x02,},"\x97\x5e\xce\x4e\x81\xf0\x01\x5f\x5a\xc3\x04\x46\x09\xd0\xac\x3a\x8d\xf9\x14\x5b\x50\xc4\x28\x89\xdd\x31\x2f\x56\x3c\xf6\x12\x6e\x36\xff\xfa\xf2\x1e\xb6\xb8\x4f\xbd\xa1\x5a\xa8\x5c\x66\x14\x5f\x75\x41\xe5\xb4\x1a\x8e\x81\x70\x0b\xe3\x56\x22\x4f\xc1\x09\x32\x7a\x69\x19\x66\x56\x73\x53\x4f\x5c\x8a\x4a\x00\x17\x50\xb1\x99\xdb\xfd\x63\x06\x91\xaf\x55\x2d\x4d\x26\xa9\xd9\xaf\xb3\x3a\x16\xaf\x39\x11\x54\x12\x4b\x53\x42\x6c\x9f\x69\x50\x57\xb1\x81\x4f\xd6\xd3\x10\x29\x8a\xf6\xc8\x30\x68\x6a\x4a\x00\x7a\x14\xe0\x05\x7b\x72\xfb\xad\x5b\x80\x3a\xd3\x53\xd1\xc3\xfd\xb8\x90\xa9\xc8\x18\x08\xe8\x9f\x22\x91\x87\xbc\xb4\x4f\xee\x16\xa4\xeb\xca\xd5\xeb\xa4\x59\xb0\x28\x27\x2a\x56\x2c\x05\x07\x9f\xa7\xae\x3e\xca\xe8\x04\xa9\xe8\xc4\xf3\xf3\x15\x81\x3c\x5e\xe0\x84\x1b\xbc\xcf\xe4\xa9\x56\x23\xb5\x17\xa4\xb4\x2b\x2c\x6d\x97\xa3\xbf\x26\xac\xdb\xe2\xe9\x79\x63\x3f\x02\xaa\xc4\x66\x52\x6a\x3e\xbb\x14\xda\x19\xbc\x95\xf2\xc3\xfd\xf6\xbd\xb0\x8b\xe8\xbd\xe9\x7a\x86\x4c\x90\x7e\x91\x8c\x67\x9a\xb7\x26\xf8\x01\x77\x14\x58\x40\x21\x6b\x9d\xc3\xf9\x81\xef\x17\x87\x4f\x08\xb2\xfc\x66\x11\xa6\x34\x6c\x3d\xa6\xa5\x5e\xcf\xa7\x53\xc9\x91\x9f\x4f\x19\xe3\xc7\x90\x93\xbf\xd7\x8f\x86\x15\x98\xe4\x66\x6e\x1c\xab\x68\x8e\x46\x04\xd4\x6c\x9c\x58\x2e\xad\xb9\x2c\x98\x8f\x47\x8d\x16\x0f\x5a\x15\x18\x2b\x33\x40\x20\x17\x97\xd0\xb9\x55\x28\x2e\x4a\x21\x7b\x50\xb1\x4b\x10\xc9\xf4\x90\x67\xea\x3e\x84\xe5\x27\x4d\xca\xec\x74\x47\x4c\x57\x07\xc2\x8b\xba\x0d\xb8\xcd\xe3\xe8\x38\xd7\x31\x3c\x17\x1b\x85\xff\x2b\x9a\x3d\x2b\x16\x7e\x90\x61\xf8\x4d\xf3\xb1\x3b\xdd\x08\xb2\xd5\x01\xe5\x37\x92\xd6\x80\x54\xd0\x48\xab\xfe\x3b\xce\x98\xd9\x78\x25\x6f\x2f\xd2\xc6\xc4\xe7\x6f\x39\x68\x8c\xcc\xf0\xfe\x14\x9a\xf9\xd3\x47\xe7\xb0\x40\xef\x24\x1d\xd5\xa5\x3e\xaa\x5e\xab\x35\xa1\x8c\x68\xc7\x54\xa0\x6b\x03\x39\x9b\xbe\x56\xa2\x52\x68\xc8\x29\xa5\xba\x82\xb2\x81\x92\x04\x1d\x3b\xd2\x44\xeb\x08\xbf\x78\xe7\x6d\xef\x87\xcd\x09\xf3\x2b\xea\xc9\xbb\x63\x98\x23\xb3\x69\x67\xa5\x74\xd8\x96\x0d\x1b\xd0\x34\x35\x67\x9d\x93\xed\xdc\x55\x80\x63\xc5\x40\xb9\xc2\xf6\x09\xfe\xd2\xe2\xe3\x57\x6d\x19\xe6\x20\x9e\xab\x46\x6c\x20\x67\x91\xc3\xaa\x19\x96\x23\xfb\xae\x7d\x34\x97\xe8\x0f\xdd\x3f\xcb\xaf\x5b\x89\x11\x0e\xd7\x22\x44\x23\x4b\xe8\x5c\xca\x4b\x27\xa0\x9b\xb7\x0a\x26\xec\xe4\xeb\x8d\xd9\x70\xa2\x6e\x5b\x04\x36\x1f\xa5\x0e\x90\x38\x0e\xd6\x5f\x41\x4c\x1b\xe9\xf5\x06\x4f\x71\x42\x91\x16\x26\x7e\xdd\x69\x76\x42\x2a\xd9\x2d\xeb\x2b\x80\x4a\x92\xe8\x1c\x9f\x65\x22\xa0\xf3\xb5\xd8\xad\x36\xb4\xf8\x7d\xb5\x16\xa2\x28\x73\xe6\xf2\x72\x84\xf2\xca\x36\x0a\x2f\x40\xff\x3d\x8e\x23\xde\xc8\xef\x8a\x17\xa4\x3a\xcb\xb6\x12\x71\xa7\x27\xcb\x86\x90\xd2\x9b\xb8\x20\x16\x73\x6b\x31\x02\x62\x01\xdd\x3d\x38\x8d\x2c\x64\x3a\x73\xcf\xbd\x0a\x94\xe2\x05\x51\xfb\x5f\x8e\x1f\xfc\x39\x74\x12\x72\xaa\x23\x08\xdc\x8d\x21\x33\xa3\xfa\x9c\xf1\x09\x79\x6d\x69\xd2\xcc\x8a\xdd\xc4\x4a\xe2\x52\x77\x81\xee\x99\x3a\xf2\xa6\x37\xa8\x72\xf0\x2a\xff\x47\x4a\x70\x73\xf2\x9d\x9c\x89\x50\x77\x01\xfe\xcb\xbf\xd5\x10\x13\x53\x53\x7e\xba\x17\xc2\x96\x69\xda\xc0\x42\x7e\x38\xe2\x2d\xfa\xac\x91\xfc\x20\xd9\xe3\xfe\xe7\x91\xf4\x62\xa8\x63\xbb\x19\x08\xfb\x1e\x42\x04\xb6\x88\x80\x31\x4d\xda\xca\xaa\x35\xa1\x7a\xf5\xf5\x7a\x39\x9f\x19\x31\xe7\x8f\x5a\x37\x45\x4f\xd3\x8c\x57\xa6\x8e\x8d\x36\x78\x48\xa9\x73\x45\x18\x9c\x70\x07\x7f\xd1\xaa\x07\x54\xe7\x03\xe3\x52\x61\x80\x63\xb9\xe3\xfa\xf3\xb1\x4b\x5f\x0b\x27\x11\x36\x33\xc5\xd1\x73\x63\x74\x1e\x96\xa6\x7e\x81\x64\x01\xe8\x09\x8c\x17\xbf\xfe\x9c\x6f\x35\x87\x64\x6f\x40\xe9\xfd\xb6\x81\x9f\xd2\x2a\x74\x3a\x7a\x6e\x10\xfe\xba\x11"}, -{{0xcd,0xa4,0xba,0x93,0x94,0x0a,0xa0,0xc0,0xc3,0x15,0x0b,0x39,0x29,0xb9,0x5e,0xe7,0x76,0x9c,0xe4,0x3f,0xd9,0x8e,0xca,0xff,0x9c,0x4a,0x50,0x9e,0x73,0x6d,0x5c,0x8e,},{0xf4,0xc7,0xa2,0x5f,0x1a,0x74,0x3d,0xaf,0x41,0x41,0x7e,0x47,0xe0,0x27,0x53,0x7f,0x24,0xf4,0x81,0xbd,0x1a,0x75,0xe6,0xb1,0xd3,0x3e,0xc4,0xc8,0x2c,0x55,0xa2,0xd3,},{0x31,0x04,0x8d,0x33,0x4a,0xf0,0x5a,0x4f,0x27,0x5f,0xf8,0x27,0x54,0x4e,0xa2,0x96,0xa4,0xa7,0x75,0xfa,0x59,0xef,0xa0,0x00,0xc5,0x76,0x13,0xfa,0x6e,0x5c,0x49,0x3c,0x3a,0x9b,0x79,0xe8,0xce,0x56,0xe7,0x22,0x5b,0x0f,0xa3,0x26,0x20,0x4f,0x03,0x36,0xc2,0x13,0x53,0x5a,0xe5,0x89,0x17,0x7a,0x8e,0xae,0xdb,0x6d,0xf8,0xb2,0x02,0x03,},"\x3a\x1d\x66\x8c\x66\x88\x41\x48\x96\xa7\x69\x7f\x3c\x2e\x43\x10\x98\xed\xfc\x45\x7e\x04\xd2\xda\x86\x95\x68\xad\x5b\x33\x10\xe5\x9e\x4c\x72\x7c\x90\x3c\xbf\x18\x17\x40\x88\x02\x31\x9a\x8c\x23\x1b\x58\x02\x3d\xfa\xe4\x94\xc0\x13\xaf\x0f\xdb\x78\xc9\x1d\x5b\x45\x7f\x8c\x47\xa3\xdc\x31\xd8\xc8\x59\x4a\xa0\x8f\x14\x62\x03\xfa\x2c\x28\xb3\xdd\x79\x6a\x11\xa9\x7a\xde\xde\x6a\x7a\x70\x9b\x5a\x19\x18\xef\x1b\xea\x83\x53\x3c\x78\x34\x73\x70\x33\x56\xf5\xbe\xea\x7f\xd1\x8a\xc4\x4e\xc6\x89\x04\x95\xed\x17\x0d\x03\xf1\x5b\x41\x86\x08\xa7\xd9\xef\xd5\x2f\xa1\x09\x18\x63\x80\x51\xc4\x48\xd9\x8d\x57\x24\xf5\x67\xc8\xc6\x7f\xd5\xb6\xec\x8c\x3d\x63\x60\x08\xb9\xba\xe5\xe8\xb1\xe9\x84\xf8\xff\xb8\xb6\x4b\xee\xbd\x63\x45\xa1\x05\xc1\xc1\x08\x31\x32\xfd\x45\x08\xd6\xac\x0d\x4e\x91\x45\x50\x12\x10\xe5\x17\xd9\xb2\x24\x78\xe2\x15\xb6\x02\x59\x9f\x80\x37\x62\xdc\xd5\xa4\x09\xb3\x46\x0e\x7f\x34\x0f\x47\xef\x77\x28\x1a\xd2\x38\x3d\xe0\x8c\x5b\x80\x95\x38\xaa\xec\x92\x2b\xfc\xa0\xd6\x75\x2f\x14\x79\x72\x64\x6d\x0a\x8d\x83\x40\x77\x2c\x87\x1d\x3b\x34\xab\xc0\x60\x37\xde\x3a\xb4\xe3\x71\x29\x86\x5d\x5b\xa7\x0b\x6f\x3c\xc9\xa0\x59\xef\xb7\xdd\xdc\x38\x82\xf4\xfc\xfe\x13\xf4\x48\xc9\xbc\x66\x48\x88\x58\x96\x03\xba\x98\x68\x3a\x93\xb4\xb3\xb1\x01\x49\x92\xa5\x5c\x8e\x4e\xa1\xba\xf9\xcc\x00\xd1\xba\xdf\xf5\xfd\x7f\x5d\xa5\xe3\x07\xfb\xd1\xb4\xc9\x84\xe0\xfa\x0e\xde\xc5\xd3\x0b\xfe\xf5\xf4\x77\x30\x12\x63\xb5\xd7\x52\x00\x1b\x85\xdd\x52\xdf\x3b\x4a\x7a\xc2\x3b\x93\x0a\x91\xc0\xa4\x57\x65\xa6\x64\x88\xd8\xeb\x59\x01\x85\x70\x60\x06\x7b\x82\x37\x81\x88\x54\x92\x88\xdd\xc6\x18\x31\xe5\xb6\x84\x1b\x34\x4c\xae\x22\x50\x04\x22\x19\xcf\xb4\xac\xe0\x23\xe6\x91\xf9\xe4\x8d\x00\x6e\x9a\x07\xc6\x7d\x24\x68\xf9\x35\x93\xb4\xaf\xc1\x61\xc0\x76\x8b\x6c\xeb\x74\x4c\x24\xc9\x23\xda\x34\xaf\x3d\x5e\xd5\x77\xcc\x7f\x85\xd4\x91\x56\x0f\x4c\x0b\xcb\xcd\x1d\x5e\x34\x21\xbd\x1c\xcf\xaf\xb3\x73\xd6\x51\xbd\x61\xed\x71\xc0\x9e\x99\xf6\x12\x00\x17\x04\xd0\xc6\x30\xd8\x54\x7b\xd9\x70\xb6\x6e\x7f\x5c\xe7\xa0\x14\xe0\xff\x5a\x33\x7d\xc5\xc5\x6a\x99\xf1\x31\xb9\x12\x91\x40\xee\xea\x39\x39\x7c\x48\xca\xa9\xa8\x08\x6f\x9f\xd9\x91\x50\xbe\x7e\xf8\x7b\x6d\x4b\x94\xb1\xbd\x52\x87\x8b\xf3\xbb\xfc\xce\xac\xc2\xcc\x45\xe8\x97\x1c\x3a\x4d\x4a\x3e\xb8\x6a\xf9\x87\x4d\x4f\xa5\xe7\xca\xa7\xf4\x5d\x15\x53\xff\xbb\x41\x64\x5b\xf0\xf5\xe9\xb2\x97\x72\xe3\xdc\x08\x1b\x25\xb5\x2e\x1c\xb7\xe2\x16\x74\x83\xd5\x4f\xba\x69\x0d\xdb\x29\xd5\x46\x2d\x2a\x27\xa3\x5d\x85\xf0\x07\xad\xed\xe2\xa3\xdd\x72\x81\xf6\x54\x33\x6a\xfa\xfb\x73\x70\x78\x2b\x29\xca\xd6\x43\xd9\xd9\xdb\x2f\x05\xf2\x81\xb5\x3e\x13\x3e\xc3\x0e\xec\x09\xfb\x0d\x06\x1b\x74\x58\x1a\x2b\xd2\x79\x0b\x13\x73\x91\xf1\x93\x28\x88\x0f\x64\xc5\x3b\xe7\x00\xd0\xfa\xdd\xb7\x0d\xc1\x65\xd2\xd6\x2e\x67\x1e\xb9\x44\x9a\x2e\x6e\x9d\xf2\xc1\x6d\x8f\x49\xfa\x4b\x5b\x84\x30\x9f\x73\x35\x13\x3d\xbe\x87\x2c\x5a\x8f\xdc\xfb\xc4\x98\x0a\xbf\xb3\xc9\x59\x7d\x5d\x66\x7a\xd2\xf6\x88\xc7\xab\x24\xc9\xe4\x40\x29\x8d\x72\xb2\x8b\x0f\xcd\xe9\xc6\xf0\x71\xbc\xcc\x93\xe8\xdd\xbb\xa7\xb6\x0a\x0b\x54\x4a\x2e\x06\xc3\x9c\x67\x23\xd4\xf7\xdc\x18\x5c\x21\x13\x5f\xd1\x3a\x72\x77\x0b\x97\x61\x19\xe4\x9a\x1f\x81\xed\x47\x6b\xe0\x7c\x44\x3d\xe0\xb0\xee\x76\xfb\xd9\x19\x38\x93\x28\xb3\xeb\x86\x07\xbc\x2f\xe3\x8f\x85\x74\x5e\x28\xad\xb7\x48\x2b\x70\x1c\xcc\x66\x90\xe4\xae\x5a\x93\x32\xea\x44\x61\x31\x79\x38\x7d\xc6\xfc\x47\xc1\xd1\xec\x36\x60\x35\xe9\x91\xe1\x40\x43\x23\xbd\xbb\xf5\x35\xf1\xc3\x3c\xf5\x7b\x67\x23\xf1\x3c\xa6\xca\x32\x9e\x2a\xaa\x4b\x46\xb4\x26\x07\x33\x99\x06\xc7\xef\x49\xb3\x2d\xb8\x2c\xdf\x6a\x87\xad"}, -{{0x21,0x7e,0xcd,0x6a,0x7f,0xcc,0x98,0x71,0x92,0x10,0xc3,0x4c,0xc2,0xe1,0x4f,0x5e,0x2d,0x6b,0x5a,0x22,0xf2,0x68,0xc1,0x4b,0xc4,0xd8,0xa7,0xf2,0x81,0x72,0x00,0xc3,},{0xd5,0x91,0x91,0xce,0x28,0x2d,0x72,0xfe,0x3a,0xc4,0x58,0x78,0xe2,0x4b,0xb2,0xf2,0x8c,0x40,0x9b,0xa0,0x5d,0x76,0xce,0x9b,0xcf,0x22,0xf5,0x0b,0x0c,0x77,0x86,0x75,},{0xa0,0xb1,0x69,0xe8,0xe9,0xce,0x55,0x75,0x55,0xe0,0x33,0x4a,0x0d,0xe7,0x43,0x8e,0x55,0x36,0x75,0x48,0x9e,0xa4,0xba,0x9c,0xc6,0x3a,0x23,0x4d,0x00,0xde,0xd8,0xab,0x69,0x67,0xa3,0xbe,0x90,0xef,0x69,0xe0,0x76,0xdb,0x9e,0xa3,0xd5,0xca,0x23,0xb3,0x24,0x8d,0xd2,0x59,0x91,0xee,0x1f,0x4d,0x80,0x62,0x0b,0xf4,0xdb,0x43,0x8f,0x0e,},"\x9b\x53\x37\xe7\x8f\xb3\x82\xf2\x2e\xa6\x0e\x03\xc0\xbf\x3e\xe4\x70\x0b\x69\x78\xa9\x1e\xe6\xac\xdf\x6a\x40\x9e\x49\x18\xd1\x68\x48\x81\xfa\x1d\x11\x8c\x08\xc9\xf6\xf2\xca\x0c\xab\x56\x74\x02\xc9\x50\x10\xe7\xab\xdf\xe8\x48\xae\x79\xba\x24\x9a\xdc\xb9\x6e\xae\x1d\xfa\x08\x43\x95\x21\x39\xcf\x49\xb5\x88\x64\x78\x95\x69\x1a\x2e\x98\x80\x46\x6b\x7e\x77\xe5\x4f\x6f\x60\x81\x5e\xbf\xd5\xe5\x74\x8f\x41\x3c\x0e\x15\xf9\xd5\x76\x79\x9b\xcf\x31\x28\x47\x10\x63\x6f\x6e\x9d\xc7\x87\x85\x00\x79\x6e\xed\x80\xc8\xaf\x4b\xe2\x96\x19\x52\xea\x80\xbb\xed\x14\x04\xbd\x5d\xae\x9e\x6d\x05\xfd\x4f\x32\x5a\x3b\x83\xcd\x45\x28\xa0\x86\x9c\xef\x84\xb4\xd3\x0e\x02\xf9\x41\xd7\x49\xa8\xda\xc9\x7b\xb3\xfa\x83\x9d\x25\x73\x9b\x97\xec\x37\x45\x36\xbd\xea\x50\x04\x84\xa9\x41\xdb\x9f\x22\x99\x97\x06\x58\xd4\x11\x48\x29\x5c\xa0\x84\x6c\xa2\x36\x62\x38\xb6\x20\x1a\x48\xb3\xe4\x47\xed\xbe\xa7\xa4\xc8\xf7\x10\x20\x14\x27\x69\xe1\x5f\xa7\x2a\xe5\xf2\x87\x14\x0b\xc5\x95\x3b\x8a\x9a\x24\x2d\x20\x5f\xc0\x19\x09\x1f\x2a\xbe\xd0\xfd\xa4\x7f\x52\xd5\x9a\x02\x04\xce\x74\x01\xc1\x82\x9b\x58\x57\xb9\xa0\x91\x6f\xce\xbe\x2e\xef\x99\x1c\x41\x3a\xcd\x71\xb1\x8d\x85\x90\xd6\xb6\xd0\xfb\x39\x94\x30\x26\x78\xc2\x9f\x2b\x6a\x53\x02\x3f\x91\x87\xe4\x6c\x36\x79\x0b\xce\x73\x87\x3c\x54\x5a\x72\xbe\xb5\x53\x29\x4b\x1e\xe5\xd0\xd0\xdf\xf2\x39\xe2\x8e\xc6\x3b\x01\xe4\xd8\xfe\x0d\x6e\x69\xb1\x60\x1e\xfa\x24\x11\xf0\xc0\x60\x1e\x7e\x4f\x65\xc9\x84\xf8\x29\xf0\xdc\x2a\x84\x21\xe7\xf6\x6d\x93\x30\x53\x71\x51\xc7\x24\x3c\xa5\x24\xd7\xa5\x47\x35\xc6\xe3\x44\xf1\xfc\x93\x8e\xae\xea\x27\x79\xc9\x40\x89\x1d\x6d\x01\xaa\x55\xf4\x0c\xc1\xad\xba\x12\xe8\xa6\x7a\xd9\xa2\x7f\xe6\x3f\xb4\xf3\x8d\xc0\xf0\x18\x41\x92\x57\x18\x42\x72\x55\xbd\x66\x5d\x5e\xb3\xbc\x86\x98\x96\xdb\x86\x25\x20\x4a\xd4\xb0\x2f\x5a\x22\xaa\xee\xad\x6e\x30\x04\x71\xfe\xa6\x1d\xbb\x1b\x55\xc0\x71\x36\x5c\x58\xb1\x51\x1f\x38\xb0\x9a\x46\x71\xbd\x66\xb3\xfe\xdd\xa9\xc8\x7e\x43\xd1\xeb\xf3\x01\x76\x4e\x18\xfc\x0c\xf1\x6b\x2d\x2d\x67\xed\x23\x9b\x39\x3a\xc7\x19\x68\xa9\x03\xc0\x24\x77\xfb\x2d\xf9\xef\x01\xdb\xfc\x31\x67\xde\x72\x65\xf8\x91\xe4\xfd\x24\xd0\x2c\x63\x10\x35\x19\xb8\x6a\x70\x85\xb1\xec\x2f\xb4\x19\xdb\x76\x6b\xee\x7a\x64\x1a\x4b\xe4\x29\x61\x4a\xb8\x9f\x20\xf9\x75\x34\x10\x72\xbf\x04\x41\x9f\xb6\x9b\xe7\xa9\xee\x71\xa5\xb4\x9a\xf8\x3e\xd3\x22\xba\xc6\x8a\x42\x9f\xf5\xc5\x20\x67\x73\xbe\x54\x38\xb6\x5e\x53\xf6\x09\x72\x9f\x4f\x6a\x21\xc1\x33\x39\x11\x26\x4d\x63\x92\x70\x17\xe8\x13\x6b\x47\x25\xcd\x1c\xc9\x64\xe0\x8c\xa0\x93\x3a\x56\x1e\x7e\x3f\x59\x87\x76\x83\x30\xe2\xe5\x4f\x8d\x72\x8f\x59\xed\xfe\x2c\x91\xc4\xf9\x9a\xef\x97\xd1\x85\x59\x19\x5a\x3d\x8e\xb3\x15\xdf\xf9\x6f\xe2\x76\xda\x71\x37\xef\xf9\x30\x57\xac\x73\x1e\x06\xa6\x0a\x58\xbd\x8a\x9a\xe8\xc7\xcb\xaf\xf0\xcb\x33\x72\xc6\x8d\xaa\x17\x5c\x42\x8d\x52\xf1\x07\x3a\x38\xbf\x29\x46\x5d\x2a\x71\x28\xbb\x40\x07\x40\x06\xed\xcb\x72\x5a\x83\x1d\x81\x28\x64\xef\x43\xf3\xb8\x66\x7c\x9f\xb7\x10\x93\xa1\x67\x30\x49\xde\xc0\x5e\x09\x16\x9d\x86\xfe\xe9\x2d\xf2\x86\x00\x8a\xd9\x90\x65\xa2\x92\x97\x97\xa9\x13\xd0\x23\x3f\x4d\x1a\x95\xa2\x20\xbd\x91\xc1\x1d\xd9\xc4\x56\x85\xdc\xad\x38\x57\x80\xa0\xc4\x8b\x9c\x4a\xd2\xd6\x63\x03\xe8\xde\x4a\xf1\xdb\x3c\x04\xe4\xa3\xdd\x42\x19\xfe\x77\x3f\x83\xa8\x92\x4b\x0f\xcb\xff\xfc\xf2\x64\xab\xce\x32\x83\x29\x24\x03\x6b\xfa\xbb\xa6\x54\x6b\x1d\xf4\xe3\xf7\x88\xed\x8a\xd5\xc2\xcd\x92\xb2\x64\x1b\x47\x09\x0a\x10\x3c\xf5\xbd\xc4\x6d\x8b\x21\x43\x17\x47\x57\xda\x80\x1c\x36\x0a\x7a\xa1\x07\xfa\xc6\x54\xb3\x4c\x86\x0b\xd5\x4f\x76\xbb\xf4\x3c\x48\x47\x8d\xf4\xfe\x7a\xa5\x9c\xf9\x1d"}, -{{0x08,0xd1,0xd0,0x6f,0x3e,0xc2,0x9e,0xb5,0x22,0x93,0x90,0x7b,0x70,0x5e,0xc5,0x6c,0x5a,0xb3,0x54,0xfb,0x78,0x67,0x37,0x73,0xae,0x61,0x25,0x30,0x94,0xb8,0x9e,0x82,},{0xc1,0xb9,0x9a,0x87,0xad,0x15,0xbd,0x46,0xf6,0xc8,0x48,0x45,0x2a,0xf0,0xfa,0x3c,0xcc,0xcb,0x5c,0xdf,0x6e,0x34,0x8d,0x81,0x6e,0x36,0xc5,0xd0,0xfc,0xa6,0x6e,0x66,},{0x0b,0x8e,0xdc,0xb8,0xb1,0x5a,0x8c,0xd0,0x74,0xc4,0x1d,0xc2,0xa1,0xba,0x29,0xd9,0x64,0x8d,0x6a,0xcb,0xdc,0x33,0x83,0x14,0x70,0x7e,0xca,0x6f,0xb4,0x71,0x4c,0x99,0x54,0x3b,0x49,0x07,0xb9,0xf8,0x5e,0x57,0xee,0xcf,0xfe,0x0f,0x7a,0x6b,0x70,0x73,0xa8,0x09,0x46,0xf8,0x08,0x75,0x53,0xf4,0x68,0x31,0x09,0x27,0x3a,0x60,0x4a,0x08,},"\x12\x0b\x35\x57\x3c\x34\x91\x4b\x37\x30\x51\x88\x0d\xa2\x7e\xd2\x41\x37\x7f\x0e\x78\x97\x2c\x98\xd0\xfa\xeb\xaa\x76\x7e\xb7\xa7\xc7\xe7\xc6\xfc\x34\x05\xa4\x33\x6e\xf9\x5b\xc5\xda\x92\x25\xbb\xd0\x9e\x9e\x11\xf2\xa1\xbf\x14\x2a\xf4\xe8\xa0\xf9\x24\xd3\x23\xdd\x5a\x49\xdf\xe5\x84\xf0\x90\x43\x9c\x08\xe5\x15\x11\x34\x4d\x47\x0c\x62\x00\xac\x7e\x7c\xa1\x50\xd0\x88\xa9\x1e\x47\xc4\xc9\xff\x74\xe3\x8a\x42\xa3\x32\x15\x5d\x81\x52\xae\x4a\xbd\x11\x61\xad\xca\x93\x4c\x23\x4c\xe4\x60\xaf\x87\x89\xe5\x3f\x10\x9d\x7d\x31\xee\xde\x0a\x90\x9b\xd1\x93\xfc\x8d\x3c\x2c\xfe\xc1\x0b\x14\x3c\x31\x47\x67\x11\xbb\xec\x27\xe1\x96\xa5\x49\x85\xbc\x34\x71\x67\xac\xd2\x33\x50\x88\x27\xba\xd3\x6e\x54\x8c\x88\x06\x42\xb8\x6a\x28\xc6\xd3\x40\x4b\x51\x1d\xa2\x4f\x11\xdf\xaf\x6a\x8f\x46\xdd\xcb\xc9\xde\x9e\x39\x15\x97\x66\x9b\xdd\xfc\xa6\x56\x0f\x91\xac\xd3\x45\x9f\x32\x9b\xb0\x71\xdd\x80\xda\xdf\x35\xf0\xe5\x0d\xf5\xb1\x0f\x88\xd2\x67\xac\x9d\x30\x62\x33\x0d\xd9\x9a\x6b\xcf\xa1\x31\x87\xf4\x5c\x0c\x21\x4d\xcd\xe2\xcd\xf9\xc3\xba\x4d\x59\xe6\x33\xa3\x54\xa4\xe2\x77\xc6\x77\xbb\xdf\xa2\x41\x91\x17\x9c\xbc\xaf\x05\xa1\x0d\x40\x78\xd8\xad\xd9\x3b\xc9\xed\x8f\x6c\x6c\x49\x97\x57\x40\x36\x55\x34\x1f\x90\x4e\x37\xd9\x27\x75\x0c\x69\x9c\x26\x9d\xc9\x0d\xc2\x6d\x00\x56\x25\xc3\xf4\x12\x4b\xff\x66\xfe\xca\x59\xd4\xab\xff\x41\x72\xba\x3d\xf4\x5a\x87\x43\x02\x23\x10\x30\xfa\x78\x33\x84\xf5\x09\x99\xe3\xc4\xba\xa5\xea\xdb\x45\x14\x52\xc8\x88\xb5\x19\x27\x2e\x90\xf7\x3c\x68\x72\x76\x8e\x0d\xe2\x0e\xe2\xe5\xf9\x50\x2f\x35\xe4\x9f\xec\xc2\x8b\x75\x20\x18\x87\xfe\xd2\x81\x8e\xff\x54\x53\x98\x39\x2f\x5e\x5b\x68\x76\xbc\x55\x6a\xc1\x3a\x19\x03\xad\xa1\xb9\xd7\x25\xb0\x4a\x14\x20\x4b\x59\x9e\xc3\x3d\x62\xb7\xdc\xae\xea\x8c\x52\x87\x7b\x2c\xfd\xc3\x55\x8a\x91\xd2\xc9\x15\x75\x00\xa3\xbb\x6d\x45\x2e\x5e\x2f\xf0\x93\x29\x4f\xc4\x33\xcb\xd6\x34\x65\xbb\x19\x13\x07\xed\x80\x1a\x15\xb8\x5d\xc2\xff\x0b\xb3\x83\x12\xf8\xb8\x17\xa4\x36\xd4\x22\xcf\x46\x07\xc6\x4e\xe7\x03\x59\x23\xdb\x6b\x96\xa3\x89\x99\x10\x14\x9b\x0d\xa4\xaa\x3e\x96\x68\x5d\x71\x63\xaa\xcf\x9e\x61\x9d\xc6\x08\x13\xce\x4f\x34\x4f\x30\x79\xb4\x3f\x18\x7f\xa3\x1b\xda\xcb\x9a\x1d\x77\x20\xb9\x39\xd5\xbd\x24\x1b\x96\xa1\x77\xd7\xb7\x76\x8f\xfe\xbf\x79\x04\x4c\xd2\x95\x6d\x6f\x88\xdb\x1c\x24\x3a\x10\xfe\xde\x68\x14\x85\x2c\xf4\x04\xb2\xcd\xcf\xa7\x74\x07\x6d\xc1\x25\xc7\x0a\x57\xc6\x90\x7e\x99\xaf\xe3\x96\x22\xae\x11\xf5\x57\xe7\xd3\x4b\x39\xaa\xaf\x45\xf8\x34\x05\x8d\x2f\xe5\xf1\x5b\x5e\xb7\x0a\xc1\x5a\x90\xa3\xde\x58\x50\xab\x1d\xcb\x48\xb0\x6b\x6c\xca\xa4\xb4\x2f\x85\x7e\x71\xec\x00\xb8\xa3\xd8\x97\x4b\x0b\xea\x68\xfa\x0f\x66\x55\x92\x11\x5b\x4f\xa5\x55\x72\xcf\x0b\x07\x38\x64\x1f\xc8\x68\xd4\xa2\xe7\x14\xdb\x3a\xd7\x21\x9a\x82\x3d\x54\xb7\xf7\xc2\x65\x6b\xa5\xc5\xee\xbe\x35\x94\xc7\xdb\x12\x29\x8c\x16\x25\x1d\x98\x45\xbf\x2f\x78\x00\xb4\x19\x0b\x74\x6e\x21\xb0\xc1\xa5\xc4\x7a\x3d\xf9\xa0\x59\xce\x09\x56\x67\x4e\xb7\x03\xde\xcb\x0a\x00\x45\x43\x7d\xa4\xda\x10\xf2\x86\xd7\x20\xd1\xb9\xdf\x05\xfb\x24\x41\x5d\x68\xe0\x65\x57\x0e\x6b\x31\x50\x31\x42\xd0\x33\x35\xa8\x07\xbd\xca\x30\x89\x2e\xdb\x5f\x55\xf8\x98\x9d\x9e\x64\x96\x59\xc0\x74\x4c\x54\x33\xbf\xb4\xde\xeb\x11\xc2\x62\x6a\x86\x50\xe5\x4d\x4d\x39\x8b\xa1\x9b\x64\xf6\x8b\xed\x06\xd7\xfc\x40\x8f\x47\x0a\xc7\x04\xe2\xac\x92\x2a\xc1\x41\x1f\xee\x24\x54\x3e\x56\xf2\xf5\x0b\x6b\x08\x95\x3d\xc5\x6a\x7a\x75\xed\xae\x43\x0a\x6d\xf2\x8a\x22\x7a\xda\xc9\x1b\xa2\x6f\x0e\x19\x85\x95\x32\x77\x39\xcb\xa3\x03\xe9\xaa\x39\x3e\xa6\x61\x8a\x84\xf8\xf5\x03\xd0\x05\x6e\xe8\xd8\x7e\x37\x96\xe0\x36\xcc\x51\xcc\xb7\x91\xde\xb7\x95"}, -{{0xf0,0xc8,0x5c,0x76,0xb1,0x53,0x2e,0x89,0xae,0xa9,0x75,0x15,0x6d,0xdd,0xb1,0xd3,0xd0,0x66,0xf6,0x40,0x9f,0x84,0x1b,0xb4,0x41,0x09,0x22,0x72,0x5f,0x26,0x9d,0x86,},{0xfd,0x75,0xfc,0x75,0xc3,0x6f,0x83,0x49,0x8d,0x8f,0x08,0x27,0xf0,0x1d,0x3b,0x45,0x7f,0x8b,0xc4,0xd9,0xdc,0x55,0xe4,0xa4,0x62,0x74,0xdd,0xf0,0x03,0x4f,0xe1,0x6f,},{0x42,0x18,0xfe,0x4c,0x1d,0xce,0x79,0x5c,0xa9,0x2a,0x49,0xa6,0xf4,0x79,0x8e,0xb5,0x41,0x2d,0xc8,0x25,0x86,0x03,0x14,0xec,0x46,0x9f,0xed,0x45,0xde,0x3a,0x7b,0xf8,0xea,0x55,0xe8,0x53,0xa3,0x49,0x58,0x4b,0xd9,0x5a,0x82,0x6a,0x58,0x5a,0x50,0x3f,0xd5,0x0b,0xfe,0x4c,0x63,0x5e,0xf1,0x83,0xd0,0x73,0x01,0x36,0x7e,0x90,0x10,0x0a,},"\xae\x2e\xb0\x18\xd4\x8d\xbd\x4f\x21\x0b\x16\x77\x8b\x5b\xd2\xfd\x14\xc9\x4e\x6b\xbf\x2b\x3f\xf8\x55\x18\xe5\x60\xab\x8d\x3e\x72\x20\x1f\x43\x34\x20\xf0\x0f\x11\xbc\x78\xe0\xe9\xf3\x72\x08\x75\xb2\xe9\xdc\x11\xe0\x43\x25\xb8\xb3\xf0\xd4\x65\xdd\xab\x21\x51\x1c\x45\x7d\x6a\xca\xd8\xf2\xfd\x5f\xdc\x0d\x28\x23\xfe\x6c\xaa\x66\xa1\x91\xa3\xb6\x32\x6b\x32\xa1\x6b\xef\xd6\x4d\x15\xb3\x61\xa4\x15\x13\x64\x1b\xce\xba\x26\xbf\xe9\x3b\xdf\x85\x4a\x4f\x8f\x8a\x0b\x29\xf7\xe2\x82\x62\xe2\xd6\xe9\x8a\xa2\x4a\xc2\x7f\x6f\x78\x83\xac\x01\xa7\x4c\x40\xcc\xe9\x47\xeb\xac\x70\xe9\xfe\xf2\xa1\x6e\x62\x89\xe4\x68\x95\x0e\x39\x1e\x9e\x24\xef\x58\xe8\x8a\x44\x37\x72\x69\xce\xba\xfe\xd8\x98\x7d\x22\x0d\xca\xe2\xd8\xb1\x26\xb6\xbf\x81\x21\x67\xd0\x23\xd9\xba\xac\x95\x0d\x9d\xb8\xcf\x52\xde\x63\x06\xbd\x48\x99\x96\x10\xc0\xa4\x33\xfa\x9e\x17\x71\xcb\x83\x2d\x41\x97\xaa\x34\x0d\xd0\xcc\xd0\x74\x4f\xc6\xb6\x2f\x90\xbd\x3e\xbb\x53\x08\xca\xb5\xf9\x40\xe2\x91\x64\x23\xcf\x0f\x3b\xf0\x80\xc0\x6a\x94\xf0\x26\x91\x04\x60\xdd\xa8\x09\x37\x4e\x64\x57\xf0\x64\xf1\x78\xe3\x08\xe7\xa1\xb5\xaf\x4d\xef\x31\x90\x07\xd0\x41\x77\x8c\x3d\x6a\x41\x9f\x51\xba\xdf\x87\x66\x38\x79\x30\x2b\x53\xff\x26\x9d\xf4\x42\xd0\xe0\x5c\x95\x8d\x5b\xaa\xcc\xee\xd7\xf5\xf8\xaf\xc8\x11\xc1\x89\x00\xee\x3b\x0f\x61\xe5\xdc\xcf\xd5\xda\xc8\x53\x32\xd3\x2e\xbb\xa3\x71\xaa\x2d\x47\xa6\x06\xf5\x95\x46\xe4\xbb\xb6\x05\xa7\x46\x77\xb1\x9a\x0f\xe8\xe9\x5f\x9f\x77\xc0\xb8\xb7\x1d\x07\xe9\x83\x00\x4d\xc2\xab\x2c\xb3\x79\x3a\x32\x3c\x10\x8d\xfa\x79\x70\xda\x00\xdb\x19\x86\x74\xbd\x34\xbf\x73\x10\x76\x7f\x76\xa2\x24\xe0\x7b\xdb\xc6\x2b\x9d\x07\x8c\xbc\x75\x36\x7e\x2e\xba\xa2\xc5\xd2\x74\xbf\x34\x27\xf2\xa0\xcc\x5d\xbe\xf0\xaf\x4e\x63\xad\x88\x9e\x13\x1b\x12\xbc\x8c\xa3\x2d\x82\x7f\x72\x60\xb0\x44\x9d\x04\x43\xfa\x28\x84\x40\xef\xd1\x36\x4e\x3c\x98\x49\x47\x7e\x73\xee\x0b\xa4\x24\x0d\x49\x2a\xf5\xce\x13\xc3\x45\x61\xb4\x50\x10\xc1\x09\xd8\x42\xc1\xfe\xd1\xbe\x3f\xa9\xe1\x84\xaa\xa1\x40\x64\xf4\x3f\x6d\xea\x0b\x65\x9c\x5b\x97\x89\x3c\xf2\xa4\x33\xbc\xfb\x1d\x2a\x87\xeb\x56\x4b\xd9\x09\x2c\x26\x66\x70\x47\x31\xf8\x3e\x56\x43\x4b\x2a\x42\x99\x65\x0c\x70\x60\xf9\xff\x7e\x8a\xad\xcb\x45\x93\xf6\x09\x18\x8d\x8b\x46\x76\x46\xcf\xe9\x52\x70\x06\x7a\x1d\x35\xcd\x75\x9f\xe5\x81\xaf\x4e\x62\x60\x2c\x02\xef\x14\x74\x41\x43\xeb\x42\x4f\x2d\x9f\x33\xa6\x02\x88\xc1\xb2\x5f\x08\xe4\xb2\xf5\xfe\xae\x06\xcb\xcc\x2b\x20\x52\xbf\x38\x4e\x1a\x6f\xcd\x84\x71\xce\x5e\x56\x58\xd7\x7f\x40\xc3\x5c\x41\x5e\x2a\x9e\x09\xfb\x58\x3b\xb7\x47\x12\x58\xe7\xc8\x06\xf3\xc2\x18\x22\xdd\x10\xf5\x6a\x64\x0c\xdc\x00\x12\x8d\x3b\xa5\x56\xba\x51\xdc\xaa\xb4\x7c\x3b\xaf\x9f\x01\x97\xd3\x66\x3d\xe8\xd0\x93\xe8\x31\x73\x32\x5d\xef\x1e\x83\xa2\xf5\xf5\xac\xf1\x2a\xe0\x9f\x3c\xe9\x6c\xd8\x88\x03\x4d\xcb\xe6\x14\x7d\xc5\x99\x83\x62\xa4\xbc\x40\x6d\x28\x84\x6a\xb1\x50\x3c\x17\xc9\x4f\x9a\xfd\x90\x3c\x9a\x58\xe1\xce\xbb\x4a\xbb\x4f\xf6\xf2\xa4\x10\x24\xe0\x6d\xca\xad\x14\xf5\xb7\x0c\x1b\x26\xe6\x9f\x96\xec\xf1\x4b\x8d\xa3\x1c\x62\x1f\x9a\xd4\xe3\x0a\xeb\x98\x23\x78\x67\x1f\x7d\x1f\x2c\x4b\x57\x2c\x41\xbb\x88\x30\x84\x0a\xc5\xdd\xce\xd8\x81\xf8\xff\xf2\x10\xc3\xc7\xf2\x36\xd8\xc5\xf2\xcf\xda\xcd\xa2\x98\x93\x30\x2f\xde\x15\x28\x2d\xb5\x40\xcb\x54\x37\x37\xdd\x77\x85\x25\x69\x22\x1f\xdd\xcd\xd6\x8d\x87\xe2\x40\x21\x79\xd3\xa5\xa7\x77\x34\xc2\x75\xa1\xd5\x60\xa4\x62\xf4\x03\x18\xbb\x68\x19\x83\x7d\xa3\xd3\x05\xeb\x49\xb3\x86\x50\xef\xdc\x8f\xe4\x09\xd4\x0f\xb9\x4c\xd5\xdc\x3e\xb0\x27\x38\xf3\x88\x52\xf6\x71\xa0\xc4\x14\x14\xb7\x6f\xb4\x36\xf3\x41\x7b\x8e\xf3\x00\x92\x1c\x00\x9e\xbb\xd7\xcf\x8e\x11"}, -{{0x18,0xe2,0x68,0xb1,0x5a,0x25,0x01,0xdd,0x4c,0x97,0x9d,0xc1,0x03,0xca,0x6a,0x84,0x22,0x16,0x13,0x2b,0x3b,0x50,0x81,0xd7,0x75,0xf8,0x86,0x40,0xf8,0x9c,0x80,0x41,},{0xb3,0x4e,0x19,0xc1,0xe2,0x08,0xfb,0x48,0xa8,0x85,0x07,0x9d,0x9f,0xbf,0x37,0xc7,0x4f,0x92,0x71,0x09,0x60,0xf8,0x32,0x15,0x4f,0xab,0x18,0x57,0x0c,0xfb,0x4c,0x1d,},{0xf2,0xdc,0xfc,0x06,0xef,0x1d,0x8e,0xcc,0xd8,0xe4,0x0b,0xdf,0x01,0x30,0x7d,0xd1,0x96,0x83,0xf2,0x14,0xd4,0xf0,0x84,0xe6,0xb6,0x93,0x4f,0x63,0x72,0x78,0x30,0x0d,0xbb,0x18,0x89,0xf2,0xd3,0x7f,0x53,0xb3,0xae,0xf2,0x6f,0xbb,0x3e,0x36,0xbd,0x75,0x98,0x5f,0xa7,0xc8,0xea,0x6d,0xdf,0xfa,0x72,0xc8,0xe4,0x06,0xf2,0x4b,0xb2,0x0e,},"\x42\x4b\xdc\xf0\xb2\x56\x00\x14\x39\xd1\x69\x58\xff\xf6\x48\xcf\x7a\x86\x04\xaf\x22\xcf\xa5\xb4\x43\x31\xb4\xdc\x35\x6d\xff\x25\xcc\x05\x63\xda\x9d\x64\x01\x33\xac\xb7\x0b\x6a\x11\x76\xc4\x82\xdb\xc9\x40\x8c\xd6\x79\x3d\x56\xbc\x29\xcc\x40\x88\x23\xd3\x88\xed\x88\xb2\x4c\xeb\x66\x21\xdb\xac\x00\x23\xee\x69\xf7\x6f\x82\x96\xa7\x39\x52\x11\x68\x5b\x3c\xea\xa9\x95\xf0\x35\x5d\x9a\xad\x3d\x97\x35\x8f\x4a\x37\x9e\x59\x20\xec\x54\x5f\x46\x96\x21\xcf\x76\x8a\xbf\x55\xd2\xa5\x54\xc9\x49\xb0\xed\x70\x18\x7c\x22\x05\xad\x03\x29\x85\xc9\xb5\xb2\xe4\xba\x57\xe0\xb4\xa4\x7d\x34\x45\x12\xb8\x4b\xfe\x9f\x3a\xa5\x60\xfe\x6e\xcf\xc5\xbd\xf8\xc3\xb4\x18\x45\x29\x35\x73\xf8\x1e\xd3\xb7\x0e\xdc\x63\xa3\x0c\x70\xcd\xa3\xf4\x55\x90\x13\x13\xf6\xd2\x3d\xb3\x09\x47\x8f\x03\xe3\x4e\x71\x35\x6d\x83\xfa\x5d\xb9\x28\x0c\xc2\xb4\x36\x9c\x3d\x24\xdd\x90\x38\xf2\x47\x59\x6c\x39\x1e\x48\xb2\xf3\xf8\x90\xa1\x41\xca\x1d\x12\x07\x7c\x69\x34\x47\x35\xa5\x9b\x1d\xd4\x07\x6b\x22\xe1\x61\x89\x99\x1e\x5f\x1b\xe4\xfb\x76\x95\xaf\x90\xeb\xea\x5d\xf2\x86\x13\x5c\xec\x2a\x6e\x99\xaa\x1d\xda\x32\x8e\x62\xc0\xdf\xb6\x37\x42\x20\x2d\x63\x62\x4d\xcc\x0c\x5c\xf1\xa5\xdf\x79\xe2\x87\x8d\xbc\x71\xfa\x96\x57\x66\x01\xaf\x22\x84\x4f\x54\x57\x33\x12\x6a\xf7\xd3\x98\x4c\x3e\xd2\x52\xe6\xa8\x76\x44\x5c\x92\x25\x9f\xbb\x47\x0a\x10\x56\x9b\x49\xe5\x79\x1f\xd0\x18\x2c\xfe\x1c\x3f\x88\x29\x7f\xac\xc8\xc3\x1a\x53\x32\xf1\xf4\xeb\x49\x58\xdb\x13\xb6\xc0\x79\xaa\x9c\x94\x94\x87\x26\x34\x03\x19\x0c\x83\xc1\x1a\x43\x19\x1f\xfe\xc6\x02\x3f\xb3\x4c\xfa\xb2\x52\x5b\xeb\x54\x6c\xf9\x20\x0a\x96\xf5\x85\x4b\x2f\x78\xec\xb2\xd9\xa5\x3a\xa9\xd2\x87\xa9\x0d\x4d\x41\x0a\x63\xad\xa0\xe9\x75\xd3\x04\xd5\x14\x83\x53\x46\x3f\xa8\x05\xb4\x80\x5f\xb4\x68\x7e\xd8\x85\x7d\xfc\xe4\xbc\x6e\x80\x83\x3c\x8f\x9a\x79\xcd\x4f\x02\x9a\x2d\x80\x2b\xfd\xc8\x19\xed\x0c\x0a\xc8\xf2\x10\x23\x28\x7f\x2b\x4b\xaf\xbc\xc8\x99\x93\xfe\x46\xd5\x2a\x9c\x62\x46\xde\xad\x61\x7d\xf7\x97\xd4\x8e\xe9\x85\xf0\xf0\xdf\x9a\xa8\x2e\xa2\x0e\x0d\x0d\xb2\x8a\x25\x4a\x9a\x25\x3f\x39\xf9\xcf\x01\xe3\xdb\x8f\x3e\xbc\xf7\xcb\x97\xce\xc5\x8c\x4e\xfe\x03\x12\x69\xb4\xb3\x7e\x4c\xbb\x36\x1f\x73\xab\x4b\x49\x80\xbd\x90\x08\x49\x53\x88\x44\xc5\x2c\xb3\xac\x75\x83\xb8\xf8\x96\x53\xa0\xde\x65\xa8\xbe\x91\x58\x2c\x55\x23\x9c\xb8\xf5\xd5\x31\x8a\x88\xd1\x60\xe1\xc8\x71\xe5\xea\x7e\x75\xf5\xa6\x9c\xba\x85\x38\x22\x1a\xb4\x2c\xe2\xa2\xc4\xd9\xc3\xb7\xec\x85\x7f\x23\x0d\x57\x37\x31\x13\x36\x86\xae\x8a\x7e\xd6\x40\xf4\x2f\x31\x02\x94\x89\xe4\xe6\xaf\x2b\x3e\xa4\xc7\x94\x8e\xd5\x37\xc0\xc5\x90\x67\x26\xc2\xb6\x25\xfd\x5f\x94\x9e\x3a\x7c\xf3\xb6\xe9\x98\xec\x76\x1d\xd6\xe2\xb5\x17\x1a\x68\x74\x97\x52\xe7\x21\xb7\x88\xc3\x47\x7f\xa1\x90\xcd\x6e\xa8\x1d\x57\x9d\xce\x64\x62\xd9\xc6\x62\xad\x89\x62\xe7\x93\x38\x71\x0c\xc8\xd2\x73\x8a\x5f\xb0\x4a\xdf\xdb\x3f\x14\x32\xcf\xd8\x0e\x2e\x96\x7d\xa0\x00\xd8\x3a\x0f\xa8\x5a\xba\xe2\x95\x2f\x3f\x36\x83\xe2\x54\xd8\x68\xf4\xbf\x80\x9e\xb2\xe3\x00\xe7\xb2\x09\x73\x4a\x3c\x89\x4e\x96\x6b\x16\x08\x8d\x5e\xd3\x54\xbf\xfb\xff\xbb\xf2\xec\x2b\xe9\x3a\x32\xa8\xbe\x5c\xfa\x18\xfa\x56\x53\x01\x2e\xda\xe5\xaf\xd8\x70\x9c\xa5\x5c\x0c\xf2\x3a\x55\x0d\x34\xca\x0f\x32\xd8\xf6\x66\xfb\x47\xa1\x2f\x2b\x73\x53\xa4\x0c\x53\x79\xf7\x53\x66\xc1\x3f\x4a\xb9\xf1\x4c\xf8\x0a\x94\xe1\xf1\x3d\x8b\x09\xb7\x6f\xd8\xd1\x4f\xfa\x53\x8f\x31\xfd\x8a\xeb\x49\xd3\x34\x33\xf4\xdf\x7c\x2c\xa6\x73\x99\x57\x9f\xe9\x90\x78\xaa\x72\x1d\x6b\x6f\xc0\xc5\x0e\x8a\x91\xfc\x71\xca\x25\xea\xc1\x37\x6f\xc6\x71\xbf\x61\x53\xe7\x20\xb2\x5c\x7e\x97\xa3\xd4\xef\x84\x42\xac\x67\xac\xf5\x8b\x50\x4b\x67\x15\x8f\x91\x30\x25"}, -{{0x3c,0x39,0x3f,0x9d,0xf1,0xfb,0x0b,0x1e,0xec,0x09,0xb7,0xf2,0x70,0xb8,0x59,0x82,0xba,0x0f,0xd5,0xe4,0xb1,0x79,0x5e,0x1a,0x7f,0xa9,0x91,0x37,0xfe,0xe2,0x4d,0x7d,},{0x97,0x4f,0xe2,0x37,0x30,0xfc,0x17,0x94,0x56,0x70,0xfb,0xc1,0xf8,0x0b,0x93,0xf9,0x45,0x93,0xc8,0xd4,0x4b,0xc7,0x5d,0x18,0x9a,0x6b,0xbf,0xaa,0xba,0xf5,0xdb,0xd9,},{0x22,0x33,0x3e,0x56,0x41,0x0f,0xdc,0xbf,0x84,0xf6,0xa8,0xde,0x74,0x13,0x37,0x69,0x16,0x84,0x49,0x5b,0xa6,0x9e,0xff,0x59,0x6d,0xb9,0xc0,0x3a,0x28,0x12,0x10,0x88,0x1e,0x6c,0x91,0xef,0xa9,0x1b,0x21,0x83,0xc0,0xea,0xc9,0x16,0x15,0x28,0x17,0xa7,0x8c,0xa7,0x24,0xba,0x7c,0x8b,0x51,0xbb,0x4c,0xaa,0xde,0xa9,0xa3,0x41,0xeb,0x0e,},"\x54\xd8\xb8\xd5\xfa\xc2\x8c\xff\xa7\x7a\x09\x16\xd6\x33\x3c\x16\xed\xbc\x8b\xb7\x4a\xa0\x6e\x56\xdc\x00\xe4\x7e\x39\x29\xe4\x08\x64\xb8\x84\x0d\x91\x20\x79\x59\x7e\xac\xd8\x1d\xae\x43\xe2\x78\x5d\xfc\x68\x9f\x3e\x85\xf8\xc6\x65\x81\xef\xc5\xe8\x53\xd1\xfa\xaa\xc7\x44\x40\x0a\xb0\x8c\xbd\xb5\xd1\x61\x46\xfa\x60\xf9\x99\x05\xed\x84\xfd\x29\x36\xdd\x73\xf4\xbc\xa2\x57\x2b\x7c\xf5\x16\x05\x60\xff\xaa\x68\xda\x7a\x67\xe4\x0e\x08\xa7\xbb\x7a\xef\xc4\x04\x3e\xbe\xd5\xfe\x80\xa4\x14\x81\x7e\xdf\x2c\x63\xf6\x2f\xac\x0d\x47\x44\x6e\xd0\xbb\x58\x40\x58\xf4\x87\x2f\xec\xff\x62\x15\x59\x31\x1a\x27\x0a\xea\x37\xa6\x29\x68\x64\xe8\xd1\x68\xbf\x1e\x2f\x55\xcd\x3b\x27\x6e\xdf\xa6\x12\xb5\xd9\xc3\x36\x2e\x61\x8b\xe6\xe8\x2a\x6e\x5f\x82\x66\x79\x24\xf3\xd1\xd3\xdf\x82\x5f\x9d\x23\xf4\xd6\x14\x2d\x31\x00\xdf\xc7\x0f\x70\x60\x3a\xbf\x3f\xda\xda\xca\x69\xef\x6a\x18\xef\x90\x92\xb3\xc4\x1e\xc6\x58\xab\x27\x21\x6f\xc6\x14\x7a\x08\x0a\xcd\xa6\x0a\x84\x19\x84\xee\x83\xf4\x1a\xc4\x2a\x80\xea\xac\x91\xff\xfc\x82\x28\x39\x1e\xf5\x83\xab\x3e\xdd\xcf\x87\x65\x23\xc2\x02\x81\x35\x53\x00\xd8\x6c\x11\xa4\xe7\xc1\xad\xe8\xe5\x05\x60\xf4\x39\x06\xc9\xbc\x8c\xa5\xfb\xf8\x33\x9f\xbe\xbd\x02\xe3\x3e\x85\x18\xbe\xe5\xe8\x06\xb8\xc1\x0f\x82\x77\xf4\x10\x66\x47\x35\xa2\xbf\x55\x68\x39\x63\x54\x92\x45\x2e\x6c\xa0\x79\xde\xb9\x75\x1c\xfc\x67\x97\xf4\x9b\xca\x96\x13\xff\x2e\x7f\xdd\x36\x46\xf7\xc5\x23\x6a\x36\xbd\xf0\x05\x17\x45\xe5\x95\xdc\x00\x72\xfd\x66\x51\xd5\x76\x27\xa6\x00\x4c\x0f\x0c\xfa\xe8\x56\xbb\xc2\x8a\x12\x31\xcb\x83\x96\x65\xff\x04\x15\x2e\xc3\x1c\x00\x7b\x3e\x2e\xd0\xa9\x73\xb2\x4c\x93\x14\x9c\xe7\x01\xe6\xfd\x65\x39\x20\x6a\xe9\x1b\xec\x4c\xe6\x5a\x89\xdb\x26\xc7\xd3\x8c\xec\xb8\x91\x9f\x96\xfb\x6c\xb8\xf6\xc1\x93\x9d\x90\xfb\x3f\x90\xb8\x87\x78\x9f\x29\x57\x5a\xb2\x0e\x0b\x08\xbc\x35\x81\x53\xd8\xc0\x35\x21\xdc\x89\x18\x70\xb5\xf7\xee\xdc\xc1\xe6\x2b\xee\x7d\xa0\x63\xae\x66\xff\x0a\x4b\x7d\x98\xd1\xcb\x75\x8f\x69\x74\x3c\x3d\xb3\xae\x2a\x2c\x9b\xe1\xbe\x09\x4f\x17\xcd\x28\xf9\x2d\x8c\xcb\xca\x98\x3c\x74\x9c\x75\xc6\x10\xf8\x40\x83\x6e\x2c\x43\x0c\xcd\xef\xf0\xaf\xa5\x44\x44\xf1\x2b\x4a\x4f\x00\x2c\x60\x94\x51\x83\x42\x44\xc0\xc0\x7d\xf8\xe1\x22\x02\xa6\x5f\x94\x44\x7c\xd4\x90\x3a\xcb\x60\x6d\x77\x25\xa8\x6e\x4a\x23\x43\x98\x4e\x67\x9c\x4a\xf1\xb3\x67\x9c\x75\x5e\xa5\x0d\x0a\xbe\x2f\xcc\x0c\x1c\x33\x51\xa9\xee\x19\x6b\x46\x44\xc4\x24\x22\x2b\xe9\x9e\x2f\xb3\x73\xf9\x64\x1e\x3f\xae\xbf\xf4\x31\x70\xeb\x03\xfb\x8e\xc4\x55\x7d\x15\x1a\x55\xfa\xb6\xc4\x99\xd4\x44\xc8\x4b\xe8\x9f\x24\x47\x68\x2d\xe4\xe6\xf6\x35\x34\x75\xef\xcb\x8f\xc5\x32\x56\x76\x3a\x94\x8d\xc7\x5c\x51\x5f\xa3\x53\x54\x5d\x0c\xba\xd2\x9d\xf5\xe9\xdb\x5c\xc4\x57\xed\x30\x86\xcf\xfb\x3d\x75\xe8\x46\xc4\xe8\xd8\x81\x47\xfc\xd0\xd8\xaa\x5a\xba\xb4\x9b\x5e\x05\xc3\xd7\xfe\xef\x63\x79\x43\x34\x7a\xd3\xf4\x92\xee\x35\x6e\xf3\x48\x81\xcf\xd8\x5a\xbc\xe8\xa1\x44\xce\x77\x61\xe2\x84\xe8\xb8\xcb\x08\x96\x60\x49\x04\x7a\x99\x6e\x23\x55\x9f\x77\x6b\x1a\x9f\x41\xcb\xa3\x95\x41\x08\x48\x6e\x29\x27\xbe\xb6\x43\x3a\x36\xff\x8b\x2f\x03\xaa\x74\xb3\xd2\x09\xc4\x88\xe0\x77\xf9\x24\xf2\x31\xe2\x83\x45\x94\x2c\x7d\xcc\x2e\x61\xd7\xc9\xb5\x22\xb6\x59\xfc\xb5\x36\x62\xaf\xf3\x64\x8f\x66\xda\x3e\x83\xe5\x9b\x0d\xaa\x90\xb9\x4c\x51\x5d\xad\xab\x10\xd5\xa8\x39\xcb\x3a\x2f\x1d\x3c\xd0\x92\xde\x55\xd9\x95\x13\x8c\x3a\xc0\xb9\x07\xaf\x15\xac\x63\xec\x18\x74\x11\x43\x27\xe2\x19\x71\x34\x5e\xf1\x70\x31\xd5\x26\x17\xe7\x84\xda\x37\x71\x43\x9b\xe2\xe8\x41\x48\xbc\xfe\xa1\x32\xbd\xe1\x0e\x6f\xda\x54\x7d\xcb\xb1\xc4\xd8\xf7\x4d\xdc\xe1\xfc\xcf\x82\x13\xe0\xda\x6e\x97\xb8\x1f\x75"}, -{{0xf8,0x66,0x9c,0x88,0xf1,0x68,0x5b,0xbf,0x04,0x80,0xcc,0x92,0x21,0xac,0x2e,0xad,0x8f,0x55,0x1b,0xfa,0x87,0xec,0xba,0x2f,0xd4,0xdd,0xf3,0xba,0x34,0x76,0xeb,0xda,},{0x34,0x72,0x3f,0xb8,0xe2,0x53,0xad,0x9c,0x71,0xce,0xfd,0xe0,0x36,0x28,0xd2,0x04,0xe5,0x35,0xde,0x47,0x9e,0x10,0x48,0xe5,0x18,0x87,0x62,0xa1,0xf3,0x37,0xfe,0x5f,},{0x37,0x46,0xda,0x6c,0xd8,0xca,0x10,0x8b,0xee,0xf0,0x64,0x87,0xbe,0xe6,0x35,0x84,0xf8,0x12,0xc8,0xe0,0x69,0x5f,0xc8,0x63,0xb8,0x6e,0x5d,0xb1,0x32,0x38,0x0b,0x62,0xff,0x85,0x44,0xf6,0xf3,0x74,0x82,0x5b,0x0e,0x3e,0xa0,0x62,0x0e,0xf8,0x54,0xc1,0x33,0x11,0x14,0xd6,0x67,0xdf,0x1f,0x9e,0xa7,0x76,0xc3,0x96,0x38,0x70,0x29,0x0d,},"\x5b\x49\x41\xbe\xec\x22\x41\xc9\xfb\x76\xd8\x48\x4f\x4f\x3f\x3a\xb4\xff\xe8\xec\xc8\xe7\xae\xc7\x6d\xe2\xab\x8c\x36\x85\x84\xd7\x51\xb0\xd3\xfe\xb8\xa1\xdc\x81\x68\xcd\xc6\x94\x96\x8f\x66\xb2\xa0\xb0\x52\xaf\xbf\x8b\xe3\xa7\xd9\x51\x63\xe9\xda\x91\x41\xc5\x9c\xa5\x59\x76\xc2\x92\xc5\xc7\x4d\x31\x31\x8d\x6a\x91\xe7\x81\x7c\x5a\x8b\x2f\x81\x21\x18\xcb\xeb\xa3\xa1\x33\x23\xcd\x97\x48\xbf\x86\xed\x1a\x85\xdd\x4e\xbc\x0d\xf4\x95\xcf\xa3\xd4\x62\x74\x34\xbf\x14\xaa\xe8\xab\x67\x81\x46\x7a\x56\xd9\x65\xd1\x0e\x63\x71\x98\x9d\xfa\x0f\x6b\xc0\xf7\x85\x9f\x37\x71\xeb\x90\x04\xb3\x43\x67\xdb\x27\x05\xdb\xd6\x0f\xa8\xf7\x89\x5c\x1e\xad\xf5\x9f\x53\xda\xb1\x68\xb4\xf9\x36\x39\x79\x02\x55\x01\xdd\xd9\x68\x0d\xeb\xc0\x7c\xd1\xca\x4a\x09\x97\x87\x6e\x92\x11\xf3\x07\xd9\xb7\xb9\xd9\x04\xe4\x8d\x28\x61\xa7\x78\xb8\x79\xad\x59\x0a\x9a\x2f\x14\x1b\xd5\x68\xe3\xa1\xbb\x24\x94\x62\x8e\x9e\xc0\xc6\x42\x55\xae\xea\x6f\x0e\xed\xca\x30\xad\x38\xa1\xf3\xff\xec\x3b\x2b\x5e\x94\x2e\x21\x94\x01\x04\xe9\x14\xd1\x1a\x44\xc0\x0f\xdd\x47\xda\x3e\x55\x13\xaa\x85\x30\xae\xe2\x47\xc9\x5c\xa6\x6d\x08\xa2\x60\x8c\x75\xba\x98\x58\xda\x14\xf9\xa8\xa3\x2b\xe7\x13\xd3\x09\xe0\xf5\x84\xc8\x1e\xf5\xbe\x04\x0e\x00\x65\xf0\x7b\x77\x5a\xe1\x75\xdf\xe2\xc8\xb9\x0a\x88\xcc\xda\x17\xfa\x4f\x21\xc7\x7e\xad\xf5\xd2\x5b\x6e\x40\x4b\xf0\x04\x47\x9e\x05\xa0\x1a\xc0\x04\x2b\x89\x93\x7e\xb2\x78\xc1\xc3\x4f\x33\x02\x8d\xb7\x80\xba\x3b\x61\x79\x18\x59\x5a\x39\xc0\xfc\xad\x67\x4b\x85\xc4\x0c\xac\x8d\x34\x5b\x7c\xa0\xbb\x48\xa2\x8e\x66\xc4\x4d\x8b\xb5\xf2\x79\x41\xe4\x0b\x0e\x9c\x70\x97\x97\x6c\x62\xdf\xef\x50\xc9\x8f\x17\x56\x6c\xcb\xac\xc8\x7c\xb0\x3b\x94\xdf\xdf\xaf\x32\xf1\xe5\x6f\xfa\x63\x9d\x63\x61\x1e\x21\x3c\xeb\xf5\x4c\xd0\xa3\xe2\x17\x2d\x81\x1c\x0e\xbd\x75\xb1\xa8\x64\x62\x64\xdd\x8b\x1a\xbd\x46\xe5\x48\x97\x2a\x1b\x26\x2c\xd9\x5d\x51\x15\x36\xdd\xdc\xb4\x97\x29\xfe\x7b\xd0\x0b\x38\x38\xbd\x2f\x20\xa1\x42\x64\x0e\xdb\x1b\x6e\x76\x5b\x65\xda\x72\xe7\x23\x32\x61\xc8\x89\x2e\x2f\x49\x49\xbb\x51\xf3\x2a\x1a\x5a\x3e\xe1\x49\xbe\xa2\x6f\xdc\xed\xb9\x91\xd2\xcd\x12\x66\x37\xe2\x97\x1e\x9b\x6f\x0b\x78\x5d\xf2\x8a\x48\xf3\x01\x70\x73\x49\x42\x3f\x44\xe8\x46\x22\x89\xd7\x25\x49\x82\x30\x48\x9d\xf1\xb5\x1b\xe3\x0f\x08\xd7\xe3\x25\x05\x65\xc6\xef\x82\x4b\xc5\x3a\x1b\xa7\x4a\x57\xa2\x5c\x06\x86\xad\xcb\x6c\x82\x5a\xb1\xca\x70\xc8\xa5\xd4\x6d\xbb\xc6\xfa\x60\x74\x61\xe2\x6d\x16\xfe\x93\xbb\x3d\x3a\x94\x3a\x3d\xc0\x5f\x30\xea\x6d\xc8\xbb\x12\xd7\x08\x21\xd3\x20\xf1\xad\xf1\xce\xba\x4b\xe6\x57\x19\x4f\x7f\xcc\xd2\x19\x90\xf8\x62\x9d\x74\x46\x01\xcf\x52\xea\x6d\x94\x05\xaa\xa2\x87\x8f\x1e\xec\x40\x03\xb4\x5a\x42\x18\xd8\xf8\x0b\xb0\xf5\xaf\x04\x73\x26\x48\x77\x52\xe2\xb7\x6d\x68\x87\x25\x20\xbb\xea\xe7\xb3\x09\xd7\x82\x82\xa0\x73\xfe\x0b\x1a\x1a\x7a\x98\xda\x23\xdf\x68\xca\xf8\xc2\x69\x9b\x1c\x7d\x0f\x47\xbd\x7d\xe2\xc0\xbb\x23\x36\x99\x63\xe6\x8a\x69\x74\xc8\xe2\xb5\x95\xb8\x29\x3a\x9f\x4d\x98\xdf\x7e\x9a\xe3\xad\xd2\xa3\xf6\x4e\x83\x03\x97\x39\x64\x2d\x19\x22\x04\xe8\x5e\x6c\x48\xd5\xd6\x71\xf6\xc7\x5a\x0a\x89\x57\xed\xbb\x74\x18\x76\x20\xf2\xab\xa9\x9c\x1c\x62\x58\x4c\x59\xac\x00\x64\x7e\x3f\xb4\x02\x92\xb9\xdc\x1a\x33\x46\x86\x85\x53\x39\x2f\xd3\xf1\x1d\x6d\xc6\xf5\xf2\xf4\xe8\x5e\xe2\x51\x25\xcd\xd6\x44\x74\x3c\x7d\x45\x28\x1e\xda\xc6\x38\x4c\x77\xcb\x98\xa6\x7d\x9a\xe6\xfc\x9a\x0a\x76\xb9\xf6\xfa\x69\x6f\xdf\x4a\xce\xab\x5f\x79\x4e\xe5\x21\xb1\xe5\xa0\xee\x57\xaf\x53\xbd\xf1\x76\x80\x1b\x4f\x45\xcf\xb3\xca\xe3\x28\x72\x34\x23\x4b\x77\xce\x21\xed\xf8\x68\x0d\x68\xc4\xa8\xee\xcf\x1b\x03\x53\x7e\xa5\x69\x9a\xcb\x56\x27\x77\xe4\x2a\x48\x6f\xe7\xcd"}, -{{0xce,0xcc,0xc6,0x83,0x11,0xfc,0x45,0xb6,0xc2,0xa2,0xf1,0xff,0x9c,0xdd,0xe0,0x07,0xec,0x78,0x7f,0xdf,0x25,0xd0,0x2c,0xcd,0x2a,0x1c,0xad,0x9d,0xe3,0xfb,0x4c,0xff,},{0x6f,0x80,0x47,0x34,0xef,0x92,0x82,0x41,0x80,0xda,0x71,0xe5,0x5c,0xf3,0xbf,0x1a,0xfe,0xf6,0x5b,0xcf,0x56,0x09,0x62,0xe0,0xb0,0xac,0xbb,0x2d,0x8c,0xca,0x59,0x84,},{0x3c,0x44,0x62,0xaa,0x47,0x01,0x01,0x32,0xdb,0xb2,0x63,0x11,0xe4,0x44,0x72,0x72,0x79,0xed,0xad,0xe1,0x5a,0x4d,0x66,0x2c,0xf6,0x47,0xf3,0x27,0x5c,0xf3,0x25,0x3e,0x6d,0xe9,0x33,0x38,0x30,0xe0,0x51,0x7a,0xa5,0xfa,0x7b,0xc2,0xd0,0xe6,0x3e,0xa2,0x59,0x7a,0x94,0xb0,0xfe,0x92,0x70,0x6e,0xcd,0x17,0x2c,0x5e,0xc5,0xc7,0xf0,0x06,},"\xba\xc1\x86\xd9\xfe\x5a\xbd\xa7\x9c\x3a\x35\xa7\xa3\xc2\xea\xe6\xae\x6a\xb2\x82\x47\x91\x27\x70\xc8\x4e\xfd\x04\x8e\xbd\x3a\xba\x57\xc3\x7c\xf4\xc6\xc7\xf3\x0a\x79\xf6\x8a\x3f\x76\xb2\x0c\xd8\xc6\x63\x1f\xcc\x96\x67\x05\x22\x08\x0e\x6b\x62\xe8\x87\xae\x6f\x44\x36\xd4\xca\xf5\x69\x43\x13\x1c\x52\xdd\x28\x2b\x25\x1c\xd0\x75\xf1\xf7\xf8\xe0\xbd\xb6\xbe\xdf\xc9\xa0\x79\x6f\x55\x79\x04\x2b\x56\xe6\x93\x74\x96\x1b\x11\xdf\xd6\x1b\x12\xde\x2b\xb7\xd4\x9b\xfc\x50\x9c\xdb\x31\x38\xf3\x35\x6a\x0d\xde\xd9\x8f\x53\x01\xb7\xc4\xa7\x48\xbf\x89\xb2\x3d\xf4\xf7\x47\x2f\xf8\xb1\xf5\x05\xd7\x65\xc6\xff\x82\xdb\xad\x74\xb9\xd7\xae\xf2\x2f\xbc\xca\x0b\x7f\x35\x04\x2f\x9a\x76\x2b\xd0\x69\x02\xbb\x21\xc7\xf9\xf7\xf6\x6b\xef\x38\x90\x1d\x75\x01\x2d\x61\xd7\x44\xde\xe7\xaf\xd8\x9f\xc7\xe9\x08\xc4\x06\x85\xbd\x44\x0a\xed\xa4\x20\x4d\x00\x6f\x26\x30\x7d\x82\xa4\x96\x96\x31\x15\xf9\x0e\x09\xf7\x66\x88\x29\x1f\x4a\x67\xd6\x41\x1f\x76\xd1\x66\x17\x87\x5b\x2b\x99\x82\xdf\xdc\x5e\xe9\xb8\x3b\x98\x17\x00\x93\x19\x11\x0b\x54\x04\xc6\x31\x16\xfb\x6e\x94\x64\x84\x6f\xa0\x09\x55\x56\x32\xf0\x76\x98\x4c\x15\xe1\xf6\x08\x17\x33\xa0\xd4\x6f\x2d\x6a\x3c\xeb\xf7\x9e\xd9\x02\x0c\x9d\xec\x8d\xf1\x58\xa3\x34\x1f\x39\xea\xa5\xfc\xf1\xcf\x42\xa9\x48\x49\xb2\x35\x2c\x1a\x1e\xcd\x4f\xb8\x14\xc2\x0d\x07\xdf\xda\x31\x2b\xd4\xf2\xf5\x8c\x15\x76\xb4\xaa\x31\x5c\x96\xc8\x78\x6a\x4c\xfb\xb7\x36\xb2\xd2\x3c\x38\xb1\xd8\x1c\x46\x44\xea\x36\xaf\xa0\x76\xe0\x55\xbe\x59\x17\xcd\x7a\x92\x35\x0a\x7e\xd6\x6a\x5a\xb2\x25\x3f\x55\xc4\xfd\x1a\x0d\x0e\x6d\x4e\xda\xb5\xf7\x12\xed\xb4\x40\xc0\x6f\xac\x8f\x07\xe6\xd7\x3c\xc9\x0b\x2b\xa7\x13\xd7\x3c\x73\x80\x23\x61\xce\x46\xa4\xeb\x5e\xd1\x06\x0c\x4c\xf5\x32\x07\xd3\x01\xf0\xfc\xd4\xf0\xc9\xd1\x58\x0d\xb2\xfc\x10\x59\xd3\x72\x07\x64\x38\xa0\x11\x92\xa7\xf9\xfd\x6f\x78\x83\xf5\x64\x22\x86\x6f\xd9\xf0\xaf\xe5\x3f\xdc\x91\x0a\xfa\x5a\x75\x1c\xbf\xa3\x77\x59\x25\x79\x16\x5c\xb5\x6d\xc3\xeb\x4d\xce\x67\xe3\xdb\x33\xa9\x81\xa5\x6b\x7d\x9f\x7b\xde\xa7\x4f\xba\xea\x34\x78\xe6\xab\x2c\x64\x4f\xd7\x77\xb8\xbf\xa7\x2a\xa0\xf0\xa5\x21\x98\xd3\x6e\x5b\x63\x4d\x2c\x9a\x11\xb7\xfe\x0a\xb2\xf9\xa4\x09\x01\xc5\xb1\x48\xa0\x19\x2e\x95\xa1\x70\xba\xf7\xd5\x35\x0f\xe0\x1e\x56\x95\x42\xb9\x34\x85\xa4\x19\x71\x44\x34\x85\xfa\xf5\x7f\x67\xf5\x6d\xfe\x2c\x58\xe5\x39\xc9\xf9\xb4\x49\xc3\xf9\x12\x49\xa1\x0c\x1a\x1b\xe7\xe0\xb3\xea\xbe\x8e\xe0\xba\xb1\xf1\x1f\x89\x61\x4d\xce\xd4\x18\xc6\x2a\x07\xa0\xb5\x9a\x13\x70\xd6\x53\x1b\xa1\x77\x09\x1c\x6a\xd5\x95\xfb\x59\x48\x82\x04\xf6\x33\x44\x73\x6e\xa1\x01\x7a\xff\xbe\xb7\x53\xa9\x97\x86\xb1\xeb\x64\x51\x0e\x2e\x71\x7e\xc9\x0e\x02\x74\x4b\xc3\x52\xd3\xf1\xb2\xab\x7b\xe0\xeb\x65\x62\x3d\x04\xfb\x3a\x04\x6c\xe7\xf4\xda\x69\x7d\x82\x98\x28\xa5\x2c\x7b\x04\x3b\x2a\x82\xec\x97\xfb\x04\x1b\xf5\x19\xb4\xde\x31\x6f\x4e\x2f\x5b\x0d\xb6\x2a\xed\x0e\xed\x95\xca\xd4\x32\x0c\x19\x47\xc3\x5f\xd8\x84\x7a\x58\x67\x87\x28\x83\x56\x11\x19\xc0\x1b\x00\x89\x21\x3d\x84\xdb\x99\xd4\x39\xf0\xf6\x44\x4d\x87\x83\xdd\x4b\x64\xbe\x35\x77\xcd\x46\x1c\xf7\x53\xc8\xe6\x1c\x91\x2d\xe2\xe5\xd7\xa7\xe2\xba\xef\xa2\x58\x97\x5d\x16\xef\x31\x17\xda\x59\xa6\xc8\x93\xf3\x33\x91\x87\xdf\x31\x68\xb8\x9f\x0f\xb0\xb2\x19\x8b\xb6\xf1\x59\x4b\xb8\x8f\x3d\x61\x0f\xce\xc3\xe3\x6d\xe0\x4a\xe1\x03\x28\x11\x2e\x6f\xf7\x4f\x5a\x8c\xe6\x8d\x40\x71\x74\xb4\xc0\x69\x1c\x76\x02\xea\xb1\xbb\x10\xf3\xc4\x9d\xd2\x2b\x84\x50\x78\x2d\xea\xe9\xa7\x31\x5e\x3b\x88\xde\x79\xcd\x15\xe6\xc9\x26\x81\x65\xed\x3a\x0f\xb3\xf8\x9b\x18\x3e\x1a\x21\x21\x52\x00\x3f\x32\xa2\x66\x5d\x37\xcd\xd7\xf6\xb5\x6c\x24\x53\xe5\x58\x0c\x4d\x21\xf9\x98\x3f\x38\x79\x8e\x9b"}, -{{0x7b,0x30,0xb4,0x2d,0xc2,0xc6,0x70,0xa1,0x95,0xfe,0x2a,0xf8,0x79,0xfc,0x5d,0xe3,0x74,0x02,0x45,0x88,0xfe,0x3d,0xe4,0x3e,0x2d,0xd5,0x08,0x44,0xf4,0x8f,0x42,0xbe,},{0x82,0xa2,0xac,0x60,0x79,0xf2,0x12,0xb5,0xee,0xdd,0x0c,0x19,0xe9,0x39,0x4f,0xaf,0xac,0xd7,0x4d,0x71,0x6f,0xde,0xfb,0xfc,0x6c,0xb8,0xa7,0xea,0xf4,0x1c,0x03,0x62,},{0x0a,0x63,0xb8,0x4f,0x46,0x93,0x5f,0xaf,0x3e,0xa1,0x64,0xb0,0x0a,0xf2,0x27,0xb0,0x08,0x68,0xa0,0x3f,0x56,0x12,0x93,0x5e,0x18,0x61,0x9a,0x84,0xa2,0xe5,0x7b,0x88,0x51,0xd7,0x46,0xe6,0x3f,0xd9,0x10,0x07,0x87,0xf5,0x33,0x8d,0x51,0xc1,0x07,0x3c,0x2f,0xc5,0x30,0x30,0x99,0xe1,0x87,0x3e,0x5e,0x3d,0x3e,0x5c,0x03,0x6f,0xbe,0x01,},"\xc6\x68\x7a\xef\xeb\xc5\xc8\x16\xd1\xa3\x34\x53\xbe\xca\x50\x20\xd3\xa9\x7c\xda\x1d\xac\x56\x62\xf0\xaf\x72\xba\xd4\x44\xe2\xfd\x11\x76\xa7\xb0\x4c\x1b\xd0\x9d\x83\x26\x18\x20\x9b\xf3\xe3\x3e\x52\x35\x38\xd6\xda\xa7\x53\x04\x6e\x87\x1d\xd3\xb3\xc7\xac\xad\x33\xe7\x9c\x1b\xb7\x89\x64\x07\x86\x5d\x16\x8d\x4b\xc3\x75\x7b\xde\x4f\x82\x3c\x08\x77\x86\x26\xf8\xc7\x1f\xb7\xcf\xcf\xdf\x03\xa8\x24\x97\xbd\x8b\xe7\xd8\xf8\xef\x64\x90\x30\xb5\xf3\x6a\x33\x94\x59\x96\x8e\x24\x6a\x1e\x42\x08\x53\xda\xce\x41\xca\x85\x0a\x4e\xea\xe8\x34\xae\x11\x96\x10\xca\x4c\xd0\x66\x2a\xac\x39\x62\x15\x86\x99\x80\x27\xef\x2f\x61\x48\x5c\x02\x85\x06\x71\x4a\xe0\x9c\x76\x39\x9d\x87\x3e\x80\x81\x58\x57\x8a\xa5\x9e\x82\x12\xf5\x88\x65\x31\x9f\x9e\x0d\x2b\x8d\xa7\xad\x52\x9e\x0a\xc1\xf1\xeb\x43\x5a\xec\xfd\x35\xf5\xab\xb9\x2b\xea\x50\x73\x49\x6b\xf4\xc0\xbf\x15\xba\xa2\x73\xbf\xc5\xc3\x10\x44\x74\xa2\xdc\xf1\x32\xc3\x33\xeb\x36\xec\x2c\xbf\x04\xfa\x95\x80\xb7\x68\xf5\xce\xa7\xb5\x61\x7e\x58\x80\xaf\xf6\x32\x01\xc2\x74\xd6\x69\x74\x3e\x1b\xc5\x56\xb0\x67\x90\x2e\xee\x29\xd2\x91\x11\x28\x89\x69\xcf\xfa\x87\x9f\xc9\xcb\xf6\x6f\xbf\x93\x26\xd9\xd9\x25\xac\x41\x02\xfa\x9f\x1a\x06\x08\x1a\xde\xc0\x79\xcb\xc9\x67\x46\xd7\x9b\x63\xa0\x12\xed\x77\xd8\x2c\x9f\xfd\x4e\x3f\x16\x1f\x6c\xea\x28\xcc\x23\xfa\xc2\xa5\x43\xf5\xb1\xd0\x64\x4e\xc0\x48\x38\x32\x7b\xcc\x65\x2b\x85\x8f\x93\xff\x46\x3f\x7e\x94\x9e\xec\x8c\x9d\xb6\x56\x9a\x86\x98\x4f\x83\x1d\xf6\xac\x6d\x95\xf3\x8f\x46\xce\xbb\x6e\x65\x83\x65\x7f\xac\xd2\x10\x8d\xbc\xd0\xaf\x23\xab\x01\x01\xa1\x30\x1b\xeb\x48\xa4\x4c\xac\xcb\x91\x09\x44\x73\xd7\xe5\xa5\xc8\x8c\x64\x4f\xd3\x42\x05\x73\xb6\x78\xf1\x7b\x51\x74\xcb\x14\xe9\x0f\xac\x69\x4d\x1d\xbc\x6c\x96\x32\xb5\x97\x4a\xef\x28\xac\x08\xd7\x20\xb2\xea\x30\x44\x0d\x2a\xfb\x04\x93\xb4\x0d\xb2\x4e\xfb\xdb\xf5\x3c\x43\x09\x21\xe5\x2a\x10\xb5\x46\x61\xe1\x49\xd1\x65\x59\x1a\x7c\xf9\x1d\x65\x08\xea\x47\x2f\xb3\xbe\x16\x39\x5e\x30\x31\x2f\x19\xb8\x7c\x47\xe4\x68\x04\xa0\xfa\x29\xb5\x6b\x5a\xc9\x50\x67\x7b\xc6\x02\x38\xb5\xe9\x9e\x03\x0b\x1e\x55\x21\x46\xa0\xe8\x8c\x29\x4c\xfc\xa8\x35\xc1\x01\xc5\x5f\x34\x23\x87\x4c\xc1\x28\x75\x6e\x73\xa5\xde\xbe\x8e\x97\xfe\x21\x66\xb6\x5c\xb4\x46\x42\x77\x0c\x6d\x1d\x23\x90\xaf\x1b\x0f\x31\xb9\x58\xc8\x30\xe9\xac\x4f\xe2\xf5\xad\x59\x05\x82\xfb\xb8\x92\xbf\x94\x95\x84\x47\x7e\xf7\xbd\xe2\x3f\x7d\xd0\x2b\x63\xf7\xc2\x90\x88\xa5\x72\x51\x00\x91\x32\xff\xbb\x78\xed\x14\xde\xfb\xef\xd9\xfd\x31\xfd\xca\xb0\x3b\xa8\x0a\x23\xf3\x33\x98\x37\x60\xab\xad\x4f\x16\xdd\xf9\xdd\x44\x14\xf0\x4d\x00\xdb\x56\xba\x72\xd6\x3a\x3a\x13\xd2\xc4\x42\xf5\x49\xfd\x66\xc9\x88\xd2\xe4\x60\x1d\x13\xb5\x2f\x77\x50\x0d\xd6\x92\xbe\xc9\xd6\xbd\x3b\xaf\xa9\x24\x2f\xdc\xfa\xeb\x69\xb9\x8b\x0b\x57\x89\xb2\x80\x38\x40\xde\xc6\x37\xb4\x9a\xf4\x38\x1a\xe3\xfa\x42\x9f\xb5\x34\x61\xa0\xc6\x74\xeb\x5a\xa1\x8d\xbd\x60\x7a\x2b\x77\xa9\x6d\x3a\xb4\x64\xec\xd9\x74\x92\xf6\xde\x46\x0c\x9f\x11\xb5\xc1\x75\x6c\xb5\x9c\xb1\x34\x8d\xfd\x77\x95\x6b\x71\x90\x7c\x54\x82\x1e\x30\x3c\xb8\xb1\x49\x06\xc0\x03\xe3\x48\x4b\xe4\xea\x05\xa6\x90\x1d\x69\xb0\x74\x85\xe8\x58\xf7\xb4\x71\xc6\x35\xf9\x03\x95\xb9\xa3\xe2\x24\x7f\x1a\xd1\x2b\x11\x8f\xfa\xfc\x72\x21\xa5\x7b\x10\xe3\x19\xb6\x1a\xf1\xc1\x36\x06\xa8\x16\x16\xce\x3f\x1d\x62\xba\x93\x2f\xf4\xe6\x3e\x74\xb8\x42\x55\xe3\xaf\x52\x10\xbb\xd5\x71\xbd\xa4\x4c\xbf\x44\xb7\x14\x42\x2c\xb4\x5c\x2e\xf2\x1f\x98\x13\x1b\xa9\x6b\x7e\xdb\x9b\x03\xe3\x3d\x7d\x18\x8d\x5b\x8d\x90\x4c\xb4\x13\x6f\xe2\x69\xdb\x14\x69\x88\x16\x8e\x7e\xe2\x45\x35\x63\x54\xf0\x02\xa5\xea\x8b\x35\xa3\xa9\x9e\x83\xa1\x32\x72\x27\x41\x44\xb3\x3a\x60\xca"}, -{{0x66,0x56,0xf4,0xd4,0x71,0x81,0x57,0xc4,0xba,0xc3,0x8f,0xf7,0xab,0xe5,0xeb,0x1f,0x81,0x2c,0x0b,0x98,0x6d,0x9c,0x01,0x4a,0xba,0xd5,0xb0,0x9a,0xa6,0xc8,0xee,0x4a,},{0xf3,0x08,0x78,0x98,0xe4,0x52,0xbe,0x9e,0x30,0xae,0xcc,0x4e,0x8f,0xfe,0x0c,0x01,0x16,0x98,0x88,0x68,0x3f,0x62,0xa4,0x5b,0x8d,0xa3,0x82,0x99,0x01,0x4f,0x5b,0x4a,},{0x9c,0x2c,0x39,0x91,0x5a,0xed,0x6a,0xdd,0x00,0x4e,0x7d,0xd6,0x84,0xee,0x3d,0xcd,0xd1,0x0d,0x87,0xa4,0x87,0xf6,0x77,0xe7,0x3c,0x2b,0xce,0x0f,0xca,0x7d,0x50,0x87,0x96,0x46,0x41,0x50,0xa5,0x2a,0x44,0x0f,0x52,0x37,0x85,0x0a,0x00,0x9c,0x72,0x16,0x2d,0x9d,0x29,0x85,0x47,0x0a,0x33,0x49,0x0e,0x66,0xd3,0xc4,0x01,0x70,0x4c,0x05,},"\x94\xd9\xe5\xe5\xa7\xb7\x05\xd9\xd9\x76\xfe\x71\xe9\x4d\x3f\x7f\xa7\x86\x6a\xfb\xf7\xec\xe4\x24\xf1\x36\x32\x77\x99\xb2\xb2\x06\xce\x4e\xf4\xc3\xf3\xe7\x05\x55\x3a\xfc\x8f\xd5\xc1\x95\x2a\x4c\x16\x65\x8d\x4a\x78\xaf\xbb\x9a\x97\xf2\x71\x93\xc6\x5b\x65\xb8\x2e\x8f\x3b\x71\x51\x5f\xac\x82\x64\x0e\x0f\x8a\x5f\xb3\x5a\xe6\xfc\x6a\x3d\xb0\x51\xa2\x2d\x4a\x53\x00\x41\x3e\x6e\x33\xd1\x9c\x20\x13\xc2\x98\x3a\xca\x8a\xd6\xce\xc2\xce\x64\xa8\x14\x16\x4f\x06\x1a\x1a\x3c\x5a\x86\x10\xa7\x65\x0b\xfb\x54\x23\xd4\x36\x2c\xe0\x22\x06\xdb\xe4\xa6\xfa\x82\x6f\x03\xb4\x2a\xc3\xcd\x9e\xa4\xc6\x51\x40\x1b\x3c\xea\x82\xc3\x99\x3f\x6a\xf8\xb2\xc9\xe2\xe6\xff\xe6\x92\x80\xab\x3f\x09\xfb\xe9\x0d\xd5\x47\xcc\xda\x9d\x9e\x8e\x8a\x53\x7b\x3b\x36\x05\x54\x22\x7e\xd0\x70\x9f\x29\x31\x98\x98\x2e\xfb\x5e\xfb\x0e\x73\xe0\x00\x42\xd1\xa0\x63\xb5\x74\x52\x02\x7d\xce\x1a\x39\xe4\xb0\x06\x8f\x58\xb1\x11\xec\x5d\xc1\x42\xbf\x41\x9a\xd8\x93\xd5\x4f\x42\x60\xcb\xde\x76\x28\xf7\x83\xde\x84\x96\x38\x03\x06\xa4\xef\xf6\xd8\x28\x69\x10\x42\x59\xc9\x4c\x54\xad\x5a\xa8\xb0\x67\xc4\x24\x96\xcb\x88\xdd\x31\x15\x0e\xa0\x4d\x49\x9b\xfa\xc9\x1f\x4b\xb3\xe6\x8a\xf5\xaf\x7a\x56\x8a\x3e\x4c\xe7\xf1\x70\xd9\x86\x01\x16\x3f\x49\x52\xf1\xd2\x5e\x12\xe0\x0e\xf0\xa2\xd8\xf1\x11\xaf\xdb\x0f\xaf\xba\xd2\xbf\x8e\x8b\x9d\x49\x36\x3f\xca\x68\x18\x36\x17\xb5\x41\x27\x0d\xda\x46\x09\xb2\x61\x67\x29\xab\x1b\x8c\x42\xdb\xdd\x7b\xf9\x86\xaf\x8f\xba\x52\xe7\x33\xe4\x2b\xa0\x3c\x89\x2e\x1e\x1e\xc0\x6a\x90\xb1\x63\xf5\xa7\x9f\x61\x65\xeb\x73\x16\x97\x2a\xc1\xad\xbf\xcf\x1d\xca\xb0\x78\x47\xef\x82\xc2\xca\xb1\x01\x5d\xbb\x50\xaa\xdc\x79\xfe\x11\xc8\x32\x09\x8c\xac\xc3\x98\x20\xab\x08\x5b\x69\x63\xbd\x42\x16\x0e\xd6\x61\x3b\xae\x5e\x20\x1f\x17\xc0\xfd\x7f\x32\x35\x7a\xe3\x50\xce\x9c\xbb\xe9\x26\xfa\x42\xdc\xbd\x42\x2a\xc1\xbf\x09\xa1\x9a\xd1\xf6\x94\x69\xe4\xd1\xdc\xb1\x24\x11\x8e\xd4\x52\x2d\x35\x3c\x17\x42\x98\x65\x0f\xf8\x83\x82\xfa\x2f\xdb\xb2\x86\xc4\x5b\x18\xa9\xba\xf6\xf6\x76\x3a\xc2\x0c\x9c\xa4\x76\x7d\x34\x8c\x4b\x8d\xed\x63\x00\x76\x65\x7b\x85\xb1\x4c\x11\xae\x27\x37\xea\x29\xa4\x35\x15\xb7\xf0\x56\x74\xa0\xcd\x3e\xd4\xbf\x6a\x3d\x18\x9a\xe9\x72\x21\x8f\x87\x7c\xd8\xaa\x69\x49\x9d\x5a\x08\xc9\x9e\x44\x06\x94\xcc\xac\xcd\xf1\xf6\x42\xe1\x4e\x90\x10\x5b\xee\x6d\x98\xed\xee\xab\x3b\x4f\x33\x9f\x30\x01\x88\xae\xc0\xc1\x6b\xd6\x45\x21\xd9\x28\x73\x98\xe6\x48\xdb\x94\x33\x0e\xd8\xf6\xb9\xab\x6c\x7a\xd9\x3f\xfc\x43\xe8\x79\x2e\x63\x7c\x61\xbf\xf7\xd8\x56\xe5\x4e\xf4\x98\x73\x84\xe3\x12\xcb\x57\x01\x7a\x50\xea\xe5\x95\x2a\xbe\x19\xd8\x99\x9c\x8c\x82\xdf\xc4\x57\x98\xcc\x17\xc8\xd9\x49\x6b\xf5\x20\xec\xc5\xb7\x7f\xe2\x84\x91\x55\x66\xc4\x56\x85\xc3\x04\xa2\xac\xd5\x25\xef\x12\xc8\x6f\x38\xae\xf5\x54\xd8\xa2\x38\x47\x37\xcc\x41\x33\xfb\x7e\x2b\x65\xc1\x3b\xef\x31\x66\x8a\x6c\x2f\x60\xee\xcd\x84\x12\xee\xff\x7f\x6b\x60\x5c\xbe\x95\x08\x3e\x23\x3e\xc1\xa7\xbb\x36\xde\x23\x6c\x8a\x71\xba\x28\x72\xbe\x94\x6c\xd3\xb3\x89\x35\xf5\xda\x64\xc8\xfe\xc8\xe1\x4f\x45\xcc\xf6\x12\x4b\xab\x7f\x70\x56\x7c\x2f\x2b\xfd\xd5\x66\x67\x60\x95\x72\x03\x7c\x76\x14\x6c\x99\x17\x07\x65\x9b\x57\x09\xb0\x74\xe3\x45\x1f\x92\x1a\x2d\xf2\x83\xb9\x6a\xa2\x6a\xb4\x76\x62\x50\x16\xf1\x81\xad\x64\xc9\x91\x9c\xf4\x1d\x71\x4a\x1a\x9a\x5e\x2b\xb2\x6b\xaf\x87\x70\xb2\xeb\xa7\x7b\x77\x8a\x33\x26\x77\xa7\x57\x2e\xe3\xa2\xb1\xdc\x05\xf7\x35\x6b\xdc\xae\x5f\x55\xe3\x53\x29\xe3\x4c\xaa\x79\x43\x0b\x27\x0c\x03\x61\x60\xdc\x9f\xca\xab\x5b\x25\x45\x43\xac\x94\xb2\x46\x81\xf1\x71\x72\xb6\x15\x9d\x16\x62\x1d\x7a\xd0\xee\xbd\x89\x5a\x1e\x1d\x09\xb9\x16\xa8\x6f\xb4\x8e\x4c\x91\x66\x10\x57\xee\xe9\x5c\x08\x70\xed\x54"}, -{{0x14,0x38,0x3e,0x6e,0x56,0x04,0xc9,0x9c,0x24,0x8d,0x39,0xbe,0x51,0xd1,0x64,0xb1,0x34,0x42,0xb0,0x5e,0x51,0xd7,0x8e,0xcd,0x99,0x93,0x64,0x22,0x1a,0x45,0x03,0x6b,},{0x2f,0xc1,0x61,0x38,0x22,0x0a,0xb7,0x4b,0x3b,0xd4,0x46,0xf8,0xa7,0x14,0xb5,0x8d,0x54,0x63,0xd4,0x0d,0x43,0x67,0x92,0x50,0x07,0x47,0x4c,0x5b,0x9e,0x35,0xd4,0x94,},{0x45,0xe8,0xed,0x1a,0x75,0x1d,0xfc,0x3b,0x9b,0x7b,0xd7,0xa1,0x0b,0xf5,0xbd,0xcf,0x8c,0xa4,0x61,0x86,0x5a,0x49,0x0c,0x10,0x5f,0x10,0x45,0x29,0x41,0xcf,0x87,0x72,0x12,0x14,0xbf,0xbf,0x3a,0x35,0x60,0x6b,0x7c,0xe3,0x5d,0x6f,0x70,0xaa,0xf2,0xd5,0xea,0xdc,0xc0,0xde,0x03,0x5e,0x9b,0x2f,0x6d,0x7b,0x86,0x2f,0xc2,0x84,0x90,0x04,},"\xc4\x75\x3b\x7f\x7a\x6f\x6d\xea\x25\x15\xc6\xe3\xd2\x95\x61\x50\x6f\x4f\x36\xe0\xde\x84\x99\x92\x21\xf2\x28\xe2\x0b\xd5\x12\x8e\xd9\x3b\xdb\x8d\x11\x93\x23\x7d\x8e\x29\x41\x69\xa2\xbc\x44\x8a\xf9\xdd\x36\x06\x63\x01\xef\xb7\xfe\x12\x31\x35\x3c\x06\x23\xff\xe1\x11\x5d\xeb\xb6\x90\x5a\xc6\x94\x6e\xe3\x82\xa2\x7c\x3c\x09\xe1\xb1\xf5\xc1\x14\x93\xdb\xa3\x7d\xa0\xff\x6e\xea\x75\xd9\xfa\xb0\xee\x92\x6d\x70\x1d\xac\x2f\xc5\xb7\xef\x57\x88\x80\xa5\xd5\xee\xec\xad\xc1\xf4\xbc\xc4\xcd\x4e\xc6\xf2\xf1\x4f\x52\xa8\xc1\x64\x07\x2e\x6f\xde\x5a\xb2\xee\x9c\xee\x0b\x48\xe5\x1a\xf0\x55\xf9\xfe\xc7\xc6\x37\x50\xfe\xdf\x72\x33\x2b\x23\x86\x3a\x1e\x54\xc5\x2b\x46\x1a\x21\x50\x6d\xfd\xfc\x63\x88\x0e\x22\xd8\x9c\x89\x44\x12\x66\x6c\x92\x98\x21\xc0\xe4\x39\xe7\x45\x41\x5f\x71\x79\x69\xe6\x05\x85\x54\xd6\x4b\x94\x7a\x4f\xc9\xd1\x6a\xca\xe3\xe4\x9a\xec\x08\x80\x1a\x09\xd9\x72\xf7\x9e\xad\x68\xd5\x29\x76\x80\x69\x73\x5c\xaa\x74\x2b\x45\xa5\x83\x05\x81\xb8\x0c\xa0\x61\xa6\xc1\x51\x5e\x3f\x7d\x5a\x93\x37\x87\x8c\x19\xfc\x94\xee\xf2\x26\x98\xea\x6c\x4d\x05\xf9\xed\x41\x1b\x6b\x8f\x05\x2b\x5f\xf1\x5d\xc2\x3a\x64\xbe\xea\xae\x99\xf8\x48\x93\xde\x3d\xf9\x40\xa4\xe0\xb8\xe9\x93\x93\x01\x39\x05\x2d\x99\xbe\x47\xbc\xa8\x77\x5f\x85\x63\xbd\x40\x26\xb7\x13\x43\xd5\x19\x68\xf2\x33\x75\x28\xf4\xc9\xdb\x8b\xbd\x0a\x29\x8a\xf0\x4b\x27\x69\x5d\x86\xb7\xf7\xba\x6c\x4c\xcc\x62\x73\xfe\xbc\xd8\xf7\x5c\xff\x26\x69\x95\x24\x4f\xc1\xfa\x13\xd8\xd8\x43\xf0\xbf\xf4\x9c\xc2\xd5\x08\xf4\xa2\xb3\xaa\xd1\xd9\x5f\xb2\x2a\x2b\xc6\xad\x1b\x96\x6b\x08\x12\xd9\x90\x70\xbb\xa0\x7c\x92\x3e\xe4\xd0\x81\x07\x48\x6d\xc0\x1a\x06\xdb\xa6\xf1\xd5\xf1\x05\xac\xea\xde\x33\xb1\x66\x51\x0e\x42\x7e\xbb\xce\x52\xa3\xe7\x83\x1f\x0f\x78\xa3\xc6\xe0\x72\x60\x83\x34\xd8\x02\x1c\x33\x8a\x73\xcc\x0c\x47\xf1\x9c\x9f\xae\x40\x3b\x97\x16\xd0\xd1\x5f\xbd\xf6\x46\x6b\x08\xf6\xac\xce\x3f\x50\xa7\x03\xb1\xde\xa8\xd8\x26\xdf\x84\x2c\xa1\xba\x20\xd2\x9f\x45\x48\xac\xfc\x75\x4c\xf0\x11\xf5\x70\x68\x1b\x59\xe4\xda\x25\x38\x5e\xbd\x6d\x5c\x3a\xdc\x93\x05\x29\xe1\x66\xce\x67\x05\xf6\x01\x02\x10\xdb\x10\x64\x62\xb3\x33\x32\x04\xe7\xad\xad\xee\x66\x06\xa5\x62\x06\xb4\x7e\xef\x20\x74\xb1\x16\xe2\x2a\x61\x54\x18\xec\x2c\xdc\x33\x1f\x1e\x19\xe0\x7e\x8a\x37\xb9\x2d\x69\xdf\x07\x34\xe0\x85\xda\xee\xb9\x01\xec\x6e\x8c\x35\xf1\x03\xf1\xd8\x6e\xf0\xd2\xa2\x65\x2b\x01\xd1\x83\x59\x7e\x4c\xfd\xee\xdf\xe5\xdf\x9a\x7e\xf6\x6a\x1c\x79\x6a\x37\xa2\x71\x13\xb9\x44\xdd\x7b\xa1\x7c\x46\x00\x15\xab\x8a\xce\x45\x1c\x57\x85\x0e\xc6\xc2\x90\xc5\x4e\x51\x13\xf5\x5e\x99\xa8\xe6\xe4\x71\x1e\x3b\x78\x17\xbf\x91\xa5\xad\xb3\x7f\xb9\x46\x1b\xe6\xb1\xb5\x5d\x58\x60\x46\xe4\x2a\x54\xc5\xde\xf4\x07\x6f\x1f\xf6\xc3\x1b\x80\x6f\xc6\x02\x47\x43\x56\xaa\x28\x99\xea\xe7\x0f\x5e\x5a\xbf\x1f\x75\xa7\xf2\x4c\x13\x4c\xde\x11\x79\x3b\xb1\x62\xe0\x3a\x58\x3d\x5b\xe0\x46\xac\xc7\x34\x56\xd1\x2d\x50\x9d\x92\xf7\x70\x57\x68\x68\x6f\x6c\x71\x4a\x4e\x57\xec\x88\xb7\x13\x98\xe2\x3e\x83\x5d\x6d\x65\x47\x22\x59\x96\xb7\xed\x08\xf3\xb7\x44\x3b\xb1\x7c\x89\x94\x09\x49\x3d\x0e\xfe\x84\x55\xbe\xc8\xe8\xc2\x84\xa3\xb1\x49\xa5\xb4\xca\x63\x1e\xa6\x20\xb1\xbb\x81\x7c\xed\xab\xa5\x0b\x04\x44\x11\x84\x9d\x26\x0a\x6f\x2a\x0d\x3f\x2c\xce\xec\x38\x42\x71\x9a\x5e\xa4\xfe\x18\xdd\xe0\xd4\x2d\xcb\x33\xad\x21\xe6\x45\x33\x25\xaf\x6f\x3c\x00\x9f\x2b\xb9\x78\xd3\x0c\xee\xae\x9a\xa4\x92\x8b\xf7\x37\x67\xcd\xa9\x29\x2a\xb8\x93\xce\x5f\xa3\xaa\x4c\x23\x21\x63\xb4\x5c\x64\xed\x79\x77\x77\x9b\x1c\x0c\xaf\xcf\xc2\xb9\xfa\x08\x4a\x32\x4f\x11\x3a\xde\xec\x21\x8b\x47\x35\xb6\xb4\x64\xdb\x6d\x46\xc2\x79\x1a\xf3\x45\x5f\x1c\xa5\xea\x1e\x9a\x04\x8c\x05\x1a\x54\xdf\xa0"}, -{{0x59,0xb0,0x72,0x63,0xb2,0x2c,0x0a,0x38,0xbb,0xc5,0x91,0x05,0x95,0x94,0xb2,0xbd,0x92,0x7e,0x80,0x59,0x61,0xdd,0x07,0xe1,0xf9,0x42,0x45,0xb2,0x3a,0xa2,0xe0,0x16,},{0x0b,0x1e,0x4c,0xf5,0xaf,0xf2,0x78,0xec,0x65,0xb4,0x05,0xf5,0x10,0x8e,0x1b,0x5b,0x18,0xa9,0x69,0xad,0x1f,0x1e,0x63,0x81,0x91,0x2c,0x82,0xd6,0x98,0x90,0x7c,0xba,},{0x88,0x6d,0xa3,0x3e,0x35,0x53,0x28,0x5e,0xa5,0x9c,0x14,0x31,0xb6,0xe8,0x6e,0xa4,0x9b,0xb6,0x8b,0x2e,0x0e,0xfd,0x2b,0x15,0x7e,0x77,0x91,0xb7,0x4f,0x35,0xa2,0x42,0x1b,0xb3,0x59,0xf3,0xdc,0x1e,0x4c,0xe5,0xf1,0x1f,0x73,0x65,0x2e,0x03,0xbf,0xc0,0xb4,0x29,0xc5,0x8f,0x0f,0x2d,0x74,0x18,0xc7,0xc2,0x0b,0xce,0x2e,0x2d,0x19,0x01,},"\x08\xce\x0d\x4d\xb5\xc2\xaa\x50\x0a\x19\xef\xbc\x8d\xc8\x54\x92\x50\xf7\xdd\x46\xa7\xa9\xa5\x40\x74\x17\xb3\xd5\x18\x20\xe4\xb0\xd6\x12\x75\x58\x3f\x56\xf8\x97\xfd\x94\x2b\xdd\x73\x11\xad\x6b\xaf\x73\x81\x28\x56\x7a\xf6\x55\x8d\x75\x90\x6a\x02\xc4\x34\x3a\x99\x55\xd5\x9b\x11\x08\x8c\x58\x8d\xc7\xdd\x08\xf6\x79\x65\xc5\x60\x2a\x56\x92\x8d\xda\x4a\xe1\x64\x29\x31\x63\xb5\x17\xca\x17\xde\xd0\x4f\xe4\xab\x2f\x97\x89\x13\x0a\xe9\x6a\xb2\x31\xf0\x7e\x09\x01\x5b\x78\xf3\x84\x8c\xef\x43\x5d\xb0\xad\x9f\x35\xe0\xfb\xc9\x85\x1e\x3e\xcf\xc9\xfb\x18\x6d\x14\xd8\xda\x4d\xda\x45\xd0\xb3\xeb\x3e\xe4\x50\x0c\x10\x1e\x31\x94\xb5\x72\x14\x06\x89\xcd\x75\xda\x12\x87\xb2\x54\xf3\x74\xe3\xd9\x33\x26\xae\x5f\xaf\x11\x40\x18\xac\x71\x4b\xd0\x03\x75\xd9\x2a\x8b\xb6\x59\xc3\x29\x12\x83\x1f\x4f\x20\x77\x6e\x9e\x2c\x25\x02\x9f\x0a\xff\x39\xfd\xda\xc7\x24\x15\x43\xa0\x36\x6b\x84\xde\x7b\x1f\xf2\x3e\x8e\x4d\xc0\x93\xdf\x0d\x2d\xd5\xe5\x3e\x68\x47\x94\x8c\xf3\xd0\xff\x3f\x56\x4a\xd9\x4d\x9c\xc0\x0a\x5e\xa5\xb6\x95\xe4\x08\xbf\x50\xf5\xba\xb2\xf6\xea\x87\xba\x8a\xd3\xa1\x94\x01\x95\xcf\x1b\xc2\xb5\xb3\x48\x47\xad\x3a\x5e\xff\xb8\xa7\x82\x3d\xe9\x1e\xf1\x63\x38\x69\xd1\xf0\x46\x43\xaf\x4d\x82\x6a\x59\xe7\x8b\x9d\x18\x63\x12\xb3\xd9\x72\x26\x36\x54\xac\x55\x87\xb8\x0b\x71\x76\x46\xf3\x10\x03\xdb\x81\xac\x70\x86\x0d\x3f\xc8\xcd\x3a\x6a\x0a\x0d\x57\x6d\x25\x73\x1e\xf7\xb8\x96\x62\x63\xd7\xa0\x5b\x55\x00\x9e\x8a\x23\xda\xc0\xf9\xa2\x1a\x24\xb0\x6e\x13\x90\x0e\x44\x44\x46\xfd\xfe\x56\xcb\xc1\xa0\x26\xdf\x41\x06\x6b\x20\x1b\x14\x81\xe5\x61\x58\x92\x6c\x0c\x9e\xa9\x0f\x0c\x64\x5a\xab\x4b\xef\x12\xd4\xe0\x72\xcb\xfd\xc3\xc3\xd5\xe0\xc7\x2c\xf8\x8f\x16\x6d\xe0\x48\x87\x4f\x35\x34\xe0\x40\xc6\x2b\x16\x62\x82\x1b\xdd\x16\xb0\xe8\x58\x28\x17\x46\x1c\xb2\x68\x92\x79\xb4\x46\xd7\x0c\x8a\xc2\x0a\xd0\x3e\x59\x8c\xad\x49\x08\xc5\x2c\x35\x0d\x42\x43\xee\x8a\xed\xb8\x7a\x4a\xf9\x77\xf7\xdb\x57\xcd\x94\x7b\x47\xd6\xbb\x51\x40\x9d\x80\xd8\x1f\x6d\xb0\x3c\xb9\xa6\xa6\xb7\x98\x12\xf4\x70\x69\x0a\xfc\x18\x36\xa5\x31\x33\x80\x94\xcf\x26\xd3\xc1\x23\x2f\xd5\x60\x5d\x8f\x8c\x55\xb6\xf8\xa2\xa7\xef\x1e\x0c\x78\x15\x55\x94\xb2\x37\x95\x6d\x2a\xba\xd6\xa9\xad\xcd\x58\xe1\x1c\xcd\x35\xcc\x99\x5b\x9a\x0a\xec\xbf\x7f\x57\x41\xac\x05\x1b\x04\xef\x6b\x97\x44\xb5\x6f\xcc\xb4\x63\x98\x52\x8b\xb3\x1f\xbe\x84\xe0\x78\x84\x3e\x69\xbf\x33\x88\x98\xcd\xef\x69\xad\x41\x87\x23\x95\xe4\x6b\x59\x39\x04\x82\x55\x47\xe0\x0b\xda\xf2\x21\xf8\xfa\x58\x7e\xa2\x03\x7f\xfb\x9a\xc9\x30\x7d\xd3\xf8\xf3\x5e\xc5\x38\x6b\xa9\x66\x33\x3e\x2a\xc8\x72\x7b\x0e\x1b\x80\x61\x2d\x3c\x7f\x2c\xb8\x8b\xaa\xca\xdf\xe2\x16\x3b\xc3\x8c\x88\x84\x2e\x76\xa3\x94\x57\x1d\x40\x61\x0e\x8a\x29\x76\x02\x79\x37\x63\x29\x6e\x3e\xab\xf7\x20\xe9\x84\xb2\xed\xd2\x8c\xf5\xc4\xe0\xf9\xa0\xf7\x6a\xce\xba\x28\xcc\x1f\x1b\x69\xff\x1d\x35\xb4\xbd\x33\x47\xb7\xf9\xa9\x5a\x4c\x1e\xa1\x07\x34\xe1\xc9\x18\xeb\x96\x24\x9d\x0c\xc7\x0b\x47\x7f\x6f\x23\x80\x9b\xbd\xa9\x01\xd5\x3f\x48\x5a\x71\xf5\x08\x60\x02\xc1\xb7\x1e\xfc\xc4\x1c\xb1\xae\xb5\x12\x2a\x3f\x3b\xfc\x96\xc5\x1a\x55\xd7\x5c\x02\x98\x42\x88\xbe\x65\x78\x87\x85\x4c\xfa\x73\x89\x74\xbc\xd5\x44\x01\x46\xf9\xbb\x14\x04\x0d\xe5\x4f\x54\x44\xad\x43\xb7\x9a\xf9\xbd\xb2\x4e\xd6\xa4\x8e\xb2\xfd\xee\xd7\x1f\x31\xf0\xec\xe1\x02\xe9\x18\xe9\x56\x35\xc7\xa0\x38\x63\x3e\xe3\x48\xd8\xb5\x78\x16\x52\xd5\x05\x9d\x21\x5a\xc9\x7f\x30\xea\x20\xd2\x77\xeb\xbf\x15\x24\x69\x05\x42\x8a\x7b\xec\x02\xb8\xf9\x26\x31\x5b\xad\x67\x23\xfd\x64\xd7\x1f\xc9\x5f\x33\x33\x64\xcb\xe9\x0d\x46\x46\x33\x3c\x40\xdd\xa6\xd1\xd4\x33\xb7\xc1\x95\xa7\x58\xdb\xb4\x03\x8a\xf5\xdc\xc7\x23\x2d\x45\x47\xf5\x40\xe3\x94"}, -{{0x5c,0xc1,0x15,0xd8,0x39,0xe0,0x58,0xcd,0xb6,0x51,0x8e,0xe9,0xc1,0x61,0xc0,0x04,0xd8,0x8b,0xd3,0x90,0x8d,0x3c,0xf6,0xd5,0x2c,0x8f,0x29,0x6a,0x1a,0x07,0x6b,0x9b,},{0x1e,0x8f,0x33,0x05,0xbf,0x2f,0xa1,0x1b,0x17,0xd9,0x24,0x16,0xab,0x0e,0xa7,0x62,0x39,0x6d,0x88,0xf2,0xf9,0x70,0xef,0x0b,0x10,0x0e,0xd3,0xbf,0x5c,0xc1,0x34,0x40,},{0x03,0x71,0xc2,0xd6,0x4c,0x5e,0xc0,0xc8,0x27,0x6c,0xa5,0xff,0xa6,0x15,0xef,0xf4,0x2f,0x9e,0xff,0xfc,0x58,0xdd,0x8e,0xcf,0xcf,0x67,0x62,0x0a,0x9b,0xcb,0x38,0xfa,0xf1,0x18,0x93,0x2b,0xf2,0xcd,0x5b,0x92,0x05,0xfa,0x55,0x13,0x34,0xdf,0x2a,0x75,0x7c,0x59,0x77,0x44,0xf7,0x91,0xf3,0x71,0xfb,0xed,0xd9,0x8b,0x21,0xf7,0x34,0x05,},"\x53\x3e\x49\xc1\xd5\xf3\x3c\x5e\xc4\xbe\x84\xc6\x19\xf4\xec\x64\x9c\x25\xfd\x70\xbd\xcf\xe2\x57\xa6\x3c\x33\x73\xa4\xd0\x89\xc8\x9a\xf6\xee\xb7\x16\x0d\xd7\x7a\xb6\x6b\x1e\xe7\xe1\x08\x50\xab\x4f\xc1\xf3\x51\x32\x33\x2b\x53\x78\x9b\x2b\x01\x40\xc4\xf2\x0f\x97\xf2\x14\x20\x72\xd6\x24\xaf\xf7\xaa\xd3\x24\xaa\xcd\x06\x8c\x03\x5a\xff\x52\xfa\x71\x2f\x4e\x74\x83\x2d\xe0\x31\xb2\x64\x23\x14\xd1\x71\x10\xde\xe6\xfb\x85\x76\x2d\xc3\x0d\x7e\x97\x78\x2f\xd1\xfb\xff\x71\x79\xf0\x09\x17\xf5\x5a\xf7\x50\x3a\x5b\x7e\x23\xc6\xea\xdb\x65\xe1\x04\xf1\x51\x7b\x66\x24\xc9\xe5\x20\x4b\x3f\xd2\x9a\x65\x85\xe9\x2c\xe3\xa3\xee\xe2\xc5\xae\x17\x79\x20\xf7\xb4\xab\x2c\xac\x87\xd6\x72\xab\x6b\xaa\xc1\x18\x6d\x90\x4a\xea\x34\x98\x53\x4e\xb5\xab\x23\xe4\xac\x4c\x0d\xdb\x0d\x82\xa5\xae\x53\x1d\x76\x54\x9d\x36\x76\x28\x57\x7b\xac\x42\x35\xe8\x97\xd9\xfe\x20\x55\x22\x04\x7d\x21\x4f\xf6\xcc\xf3\x11\xc4\xe3\x97\x82\x7d\x97\xf2\x86\x8e\x70\xac\x17\xd2\x8e\x33\x49\x99\x74\x4d\x35\x93\x76\xa4\x82\xfd\xcb\x41\x4b\x02\xb2\x68\x7b\x96\x2e\xe8\x08\x6e\x57\x3f\xe0\x00\xdc\x51\xde\xe0\x68\x79\xc6\x84\xe2\x5f\x94\xce\xe5\xe8\x61\x34\x7e\x7b\xe7\xfc\xa5\x49\xa0\xf7\x65\x13\x6a\x2f\x4b\x88\xfe\xde\x07\x02\x4d\xd2\xfc\xe1\xf6\xd0\xc0\x35\x4d\xa1\xa1\x6e\xf3\x66\xb3\x15\xb3\xf7\x23\x30\x31\xf9\x79\xb7\x0e\xac\x6e\x23\xbf\x3b\x34\x9e\xfb\xd0\xe4\xf5\x3f\x4d\x5c\x41\xfc\x00\x42\x76\xa5\x96\x70\x65\x9f\x69\x05\xef\x03\xd2\xfc\x09\x8d\x58\x9f\xcb\xc1\x32\x82\x82\xfa\x22\xb1\x0d\xb8\x3c\x5d\x70\x86\x59\x94\xfd\x19\xd7\x60\xa3\x9d\x47\x6e\x02\x33\x0d\x2c\x6d\x19\xe7\x42\x26\x7d\xd3\x65\xbb\xe1\xfe\x5c\x71\x1a\x95\xb1\x84\x50\x8c\xe4\x8c\x1c\x96\xd7\xe6\x39\x90\xb4\x08\xd4\x50\x89\xbe\x79\xe3\x2f\x9c\xb0\x16\x2f\xd1\xe7\xd0\xd1\x9d\x97\xd0\xae\x78\xff\x82\x4c\xc6\x98\x94\x86\xc0\xbd\x03\x83\x52\x55\x1f\x37\x49\x9e\x9e\x98\x26\x80\x4e\x9d\x26\x24\xad\x0c\x7b\x75\x34\x56\x0f\x45\xfd\x7d\x32\x4b\x8e\x51\x7e\x01\xc9\xb2\x74\x3c\x14\x97\x9c\xfd\x51\x2b\xc3\xfe\x66\x72\x79\xb3\xa2\x77\xfb\x46\x3e\x9d\x73\x49\xb6\x4f\xfc\x9f\xe6\x08\x84\xc2\x1e\x48\x10\x81\xed\x70\xe6\xda\x5a\x35\x39\xc4\x48\x97\x1f\x0d\x97\x87\x28\x9f\xcb\x00\x80\xf2\x19\xe9\x94\x49\xf8\x29\x8c\x42\x47\x5f\x87\xfd\x10\xae\xb5\x09\xc5\x30\xcf\x6a\x57\x74\x8e\xb8\xf3\x56\x21\x61\xfa\x48\x75\xea\x95\x3f\x09\x65\x9c\x7d\xf7\xa9\x95\x0f\x03\x17\x46\x7c\xb4\xe5\x36\x6e\x19\x6e\x32\xf5\xe2\x69\x67\x33\xa2\x5e\xac\xbd\xe4\x92\x10\x49\x07\x62\x06\x0e\xa2\x31\x37\x0d\x40\x90\x42\x9b\xb0\x6b\xb8\x67\x39\x9e\x8d\x37\xbf\x5d\x21\xa0\xe7\x21\x47\xe4\x96\xcf\x3b\x7d\xd6\xfe\x6e\x5e\xde\xa9\x66\x8d\x80\x21\x90\xa9\x1c\x60\x0e\x29\x52\x3f\x8e\xb9\x04\xe4\x8b\x70\x41\x2b\xc1\x0a\x70\x20\x98\x4c\x5f\xf0\xf5\xf3\x83\xf2\x14\xae\x59\x4d\xc8\x59\x71\xe4\x80\x37\x28\x48\xd0\xd7\xe7\xcc\x5c\x18\xff\x88\xba\x9b\x26\x2d\x78\x84\x69\x8a\x41\xc6\xc7\x81\x9c\x03\x19\xfd\xc6\xbb\x07\xb9\x1d\xc1\x69\x4d\xaf\xe3\xaf\x37\xa5\x38\xbf\x2b\x2d\x8c\xac\xb2\x7d\x24\xcd\xc6\xea\xdb\x8c\x6a\x2e\x6b\x7d\xf8\xa4\x65\x4a\xe9\x37\x85\x0c\x89\x0a\xd9\x30\x98\x0a\xfc\xc1\x49\x2d\xb8\xa0\x16\x8c\xbc\x9f\x10\x65\x7e\xb4\x8d\x2a\xc8\x7f\x51\x75\xd2\x3c\xae\xd4\xb5\xe6\xf1\x0b\xbe\xaa\x5e\x33\xfc\x5f\x64\x18\xd6\x3b\xa3\x74\xab\x1a\x3c\xbd\x36\xb7\x29\xdd\xbd\xab\xa9\x89\xd4\x64\x5e\x3a\x66\x13\x0b\xae\x41\x7c\xad\x08\x6d\xad\xd3\x08\x43\x35\x25\x14\xc3\x75\xf2\x57\x1a\xba\xf9\x3e\x9a\x07\x71\xfa\x10\x3a\xe9\x25\x85\xb0\x4f\x55\xc4\x34\x76\x9b\x43\xd6\xd2\x2f\x75\x3f\x93\x06\x03\x6e\x53\x52\x4f\x6f\x4d\x9c\xcb\xd2\xc3\x03\x17\xa8\xe8\x99\xf3\x16\x14\x90\x35\x89\x4d\xa9\x45\xb7\x6d\x90\x82\xbf\xee\x32\x8e\x7a\x31\xb6\x63\x28\xee\x8b\x94\xe0\x68\xc7"}, -{{0x75,0xa5,0x03,0xf4,0x8f,0xfc,0x22,0x16,0x17,0x67,0x25,0x19,0x11,0x1b,0xf9,0x0d,0xa3,0x9d,0xa9,0xea,0xb2,0xe2,0x91,0x4f,0xd3,0x75,0x5f,0x10,0xf5,0x39,0x36,0x68,},{0xf6,0x80,0xcc,0x0f,0x63,0x58,0xcd,0xcf,0x53,0x7a,0xa7,0x11,0x28,0xcf,0xad,0xfc,0x0f,0x3a,0x89,0xc1,0x00,0xaa,0x34,0xbc,0xd2,0x42,0x7e,0x24,0x8b,0x6e,0xd5,0x0b,},{0xdf,0x28,0xe3,0xe6,0x30,0x36,0x08,0x67,0x86,0x4b,0xc4,0x1e,0x43,0xfd,0x7d,0xde,0xb5,0x28,0x76,0xdc,0xe9,0xb2,0x34,0xa3,0xfc,0xc3,0xd8,0x54,0x9d,0xb0,0x11,0x2e,0x17,0x63,0x90,0xa6,0x85,0xeb,0xd4,0x84,0x93,0x6e,0x25,0xc0,0x8c,0x8a,0x38,0x78,0xa3,0x7b,0x3c,0x4e,0x23,0x9a,0xd0,0xa0,0xe5,0x01,0x99,0x37,0xff,0xbc,0xd4,0x07,},"\x7b\x01\x09\x04\x23\x23\x6c\xb4\xb1\x3c\x41\x77\xfc\xe5\x2a\x7f\xf6\x58\x05\x88\xcc\x2e\xb5\xa3\xf3\x9f\xf5\xd0\xc7\x3e\x01\xe0\x1b\xf7\xbd\x74\xaf\xe4\x15\x12\x50\xc3\x91\x42\x6e\xa5\x07\x27\x1b\xea\x1d\x6d\x85\xf0\xb2\xfe\x35\xc4\x05\x00\xf9\x8d\x06\x56\xc6\x38\x8f\xc9\xef\xba\x18\x37\xdb\x22\xdf\xa2\x9d\x89\x26\x76\xf5\x0e\x57\x5f\xe8\x9f\xd2\x93\x89\xd0\x9d\x08\x0b\xad\x67\xba\x54\x4c\xac\xab\xf5\xa7\x73\x82\x37\xc5\x5e\x28\x75\xed\x49\x16\x30\x2a\x2b\x4d\xc4\x96\xe7\x42\x73\xbf\x05\x19\x11\x37\x81\x0e\x50\xe4\x81\x95\x26\x0b\xab\x6d\x81\xf9\xc8\x05\x62\xee\x73\xcc\xb9\x33\x3c\xd9\xb6\x1d\xaf\x5b\x00\x38\xa4\xe6\xc5\xc9\x58\xa9\x1f\x68\x50\x8c\x1d\x88\x25\x19\xc1\xaa\x4f\xfc\xc5\x35\x62\x46\x3a\x0a\xe3\x01\x63\x69\x6f\x84\xb9\x7c\xcb\xd8\x67\x98\x20\xed\xd3\x61\x7e\x7b\x89\x6e\xef\xfe\x34\x1e\xc6\xb5\xb0\x3f\x73\xb6\x25\xd7\x41\xc6\x55\xfe\x6e\x82\xd1\x1d\x47\x8a\x7d\x54\x3f\xf6\xc0\xfa\x3a\x3a\x8c\x94\xa6\x16\xfb\x84\x70\x70\xd1\xfb\xdd\xe6\x01\x0f\x02\x6b\x08\x9c\xd8\x63\xc3\xbd\x29\xb1\xc4\x26\x9f\x77\x65\x9e\x51\x57\x28\x89\x0c\x97\x3b\xe8\x7f\x0b\x83\x3c\xa5\xaf\x6b\x4c\x31\x33\xad\x4f\xa4\xf9\x16\x55\xc6\xad\xb5\xb7\x23\x5c\x27\xfe\x34\x82\x84\xf3\xf1\x33\x66\xa6\xa0\x3a\xd2\x2b\x87\xc6\xf5\x58\x4b\xde\xae\xa4\x8c\x70\x32\x5d\x6e\x33\xa4\x75\xf5\x05\x11\x06\x38\x75\x19\x2a\x87\xed\xc3\x88\x08\x9b\x84\x39\x53\x90\xc2\xa3\xad\x89\xa2\x25\x95\xdc\x4a\x71\x5a\x42\xa2\xc0\xef\xde\xf6\x7b\x35\x4b\x34\xfc\x75\xca\x98\xdf\x91\x3e\x75\x9e\x51\xc7\xf6\x25\xdd\xd5\x98\xac\x22\xd4\x21\xde\xcb\x57\xbe\xbd\x54\x22\x0e\xc6\xda\xa5\xec\xe7\x69\xd2\xe0\x1b\xe7\xb6\xbe\xe2\xff\x5a\x0b\x06\xb3\x2d\x6d\xa1\xd7\xbc\x05\x7e\x3a\xbf\xaa\xb2\x42\xa3\xf7\xe6\x64\x6a\x15\x9e\x4f\x50\x5e\x46\x62\x98\x2b\x13\xd0\xcc\x1f\xba\x91\xd1\x03\x09\xa4\x2d\xc1\x08\x7c\xf1\x0d\x36\xe3\x1f\x17\x06\x15\xa0\xac\xb5\x08\xbf\x68\x3e\x2d\xe0\x0c\x87\x64\x0d\x30\x4a\x94\x7b\xc4\x97\x1f\xf3\x61\x9c\x72\xab\xd8\x3c\x7b\x2c\xbb\x34\x64\xc4\x04\x0c\x26\x62\xb5\x85\x08\xb7\x46\x80\xcf\xa6\xde\x06\xe8\xd2\x1e\x3b\xec\x85\x11\x19\x93\x12\x68\x00\x09\x07\x1f\x70\x6b\x7b\x13\x3a\x24\x87\xd5\x74\x5f\xfa\xdd\x5d\xc0\xeb\x2b\x55\x3d\xf4\x40\x78\x7f\x01\x1d\xda\x37\x71\x9f\xa7\x13\x15\xe8\xb2\x91\xef\xd7\x7d\xa3\xba\x14\xfb\x99\x5f\x03\x57\x1a\x3d\xb5\x22\xb6\x3c\x60\xbe\x56\x19\x94\x16\x99\xb3\x92\x22\xb5\x9d\x0f\x23\xe5\xeb\x37\xea\xd4\xb7\xf7\x50\xed\x4a\xbf\x4d\xb8\x7c\x70\xda\x66\x5b\xef\x4d\x7a\x29\x21\xb2\xc9\x98\x97\xf2\x32\x1c\x9b\xe6\x07\x5e\x74\x4c\x82\x28\x63\x9a\xb7\x36\xdb\xeb\x2b\xea\xb4\x40\xc1\x56\xa3\x9a\x2e\xfd\x26\x1d\xb5\x08\x55\xe3\x04\xd9\xcf\xeb\x99\x14\x1c\x61\x35\x58\x10\x9f\x21\x47\x4d\x27\x2a\x2d\x90\x6d\x48\x93\x93\x4a\xff\x8e\x08\xa4\xfc\xee\x96\x4a\x5c\xd0\x07\x32\xfd\x33\xaf\x29\x84\x9c\x8d\xfc\xa6\x59\x79\x42\x18\x57\x18\x5c\xf6\x29\xf8\x68\x07\xa8\x59\x73\xd3\x44\x0a\x6b\xf8\x11\xa5\x8d\x04\x13\x87\x24\x98\x11\xec\x04\x7e\x5e\x8b\x34\x3b\x23\x87\xd0\x18\x1e\x0d\x0b\xd4\x61\xef\x10\xe8\x16\x4a\xae\x35\x7d\x9b\x29\xdc\x0a\xce\x3e\xc6\xd7\x43\xae\x34\x54\xab\x9f\x84\x2a\x28\xd5\x71\x02\x17\xdf\xfe\x50\x34\x4e\x8d\x93\x2f\x18\x01\xb0\xe8\xf9\x66\x19\x8e\xf1\xc9\xcc\x69\x69\xf3\x47\x34\xaa\x6a\x63\xae\xaa\xb4\x33\x9f\x75\xd3\x4f\xfa\x8a\xcb\x93\x7e\xd9\xc7\x30\x92\xa3\x09\xa9\xb8\x4a\x25\x01\x1e\x31\x14\xc2\x65\xe4\xf6\x02\x33\x7e\xb6\x99\xb5\xa2\x2d\x57\x2b\x03\xe4\xda\xd0\x3b\x04\x61\xc0\x0d\xb9\x67\x9b\x72\xfc\x5b\x49\x3e\xf4\x48\x6f\x85\x53\x5d\x81\x3a\x58\x08\x03\x85\xaf\xd4\xe8\xd8\x71\x82\x80\x34\x33\x4b\xfe\x44\x1d\x18\x98\x4e\x4d\xfc\xde\x02\x44\x03\xb5\xae\x66\xcc\x50\xa4\x73\x01\xb5\x7f\x9a\x32\xf7\x40\xbd\xc7\xff\x1d"}, -{{0xd8,0xaa,0x2a,0x0a,0xa5,0x14,0xfd,0x84,0x5f,0x7a,0xa6,0x6b,0x83,0xc0,0xea,0xbb,0x9c,0x16,0x02,0x3a,0xbc,0x16,0x95,0x77,0x34,0x50,0xb2,0xbb,0x33,0x25,0x22,0xf2,},{0xe4,0xe8,0xd6,0xb2,0x98,0x24,0x8c,0x15,0xfe,0x08,0xf8,0x7a,0x3b,0xc6,0x08,0x4b,0xf2,0xd6,0x4d,0x7f,0x1e,0x4b,0x2d,0x51,0x59,0x9e,0x9f,0xad,0x9c,0xc9,0x10,0x92,},{0x14,0x6f,0x65,0xd4,0x3e,0x71,0x55,0x42,0x89,0x4b,0x79,0x00,0xa2,0xf8,0xcd,0x4b,0x17,0xd3,0x87,0x0a,0x61,0x00,0xe3,0x7d,0xe0,0x05,0xb0,0xdb,0x5d,0x81,0x51,0x24,0x6d,0xe4,0xee,0x38,0x42,0xd3,0xeb,0xca,0x20,0xa5,0xda,0x22,0xa3,0x63,0xa7,0x57,0x5e,0x7a,0x55,0x12,0x82,0x95,0xf2,0x72,0x11,0x48,0x4a,0xf5,0x7c,0xd5,0x31,0x09,},"\x08\xde\xb3\xb8\x32\xf5\x2d\x65\x56\xf7\x8c\x3f\x0a\xbe\x46\xf1\xef\xe4\x5e\x3d\x5d\x88\xe7\xf8\xed\xf8\x03\x67\x0c\xe4\x61\x29\x21\x74\x9e\x9e\xce\x63\xfd\xc9\xbe\xf2\xba\x48\x38\x12\xbb\x62\x2b\xe7\x44\xd4\x04\x04\xfd\x6e\x09\xc9\xe1\xcb\x7c\xe1\x9d\xe8\x1a\x9d\xad\xf5\x56\x35\x2e\xe8\x98\x10\xc7\x6a\x9b\x10\x47\xac\x62\xb1\x6e\xbb\x7d\xa2\x3d\xdc\x2d\x4a\xb7\x6a\x02\x05\x61\xd0\x2d\x41\xb5\x8b\x94\x95\x3a\x23\xfa\xaf\xdd\xd7\x81\xb7\xdc\xa7\xb7\xfb\xee\x70\x6e\xc1\x0a\x73\x12\x5b\xf7\x44\x36\x05\x6b\xf3\xb4\xf2\xa0\x70\x1c\xfe\xf0\x5b\xeb\xd3\xdd\x8e\xef\x30\x6c\x1a\xc1\xb0\x09\x50\x88\x1f\xf0\x5a\xb5\xc8\x24\x8a\xd1\x09\x6a\xc9\x1d\x52\x6a\xe5\x9b\xa0\x58\x3b\x27\xdb\x7d\x1e\x39\x0f\x57\xa5\x88\x9e\x27\x99\xa4\xa1\x51\x9b\x15\xd9\x3d\xbf\x0b\x21\xd4\x50\x87\x3c\x76\xba\x52\x04\x61\xe8\xbb\x5c\x83\xc9\x01\x2e\xac\xd5\x57\xbe\xa6\x40\x58\x6e\xfc\xb8\x69\x00\x76\x47\xd4\x49\xf9\x1c\xcd\x52\xaf\xe3\xa8\x94\x77\xde\x7c\x2b\x64\x7e\xcc\x9b\xf9\x67\xfb\xf5\x76\x9d\x74\x88\x94\x47\xd9\x52\x2d\x9e\x80\x69\xc3\x49\x9a\xf6\xa8\xa1\x09\x7a\x95\xd3\xbc\xc5\xf8\x34\x33\x93\x44\x84\x31\x4c\xb3\x07\x58\xb5\x25\xfe\x53\xe9\x07\x21\xdf\x5c\xbe\x03\xd9\x6f\x0d\x0f\x98\x52\x1f\x01\xa5\xfb\xe5\x7c\xe8\x80\x4d\xbd\x18\xf8\xf5\xea\xc8\xf7\xdb\xb5\x8c\x41\x78\x9a\x44\x43\x3f\x8a\x8d\x12\x45\xd2\xad\xda\x8c\x78\xd8\x81\xc6\x5e\xa6\x61\xab\x17\x8d\x4f\xc2\x63\x4c\xd6\xcb\x51\x4a\xb6\xf2\x54\x3e\x91\x12\x18\x3f\x3f\xf7\x3a\x3f\x45\x01\x06\xb0\xee\x8a\x34\x7a\x80\xcb\x82\x4a\xc1\xf8\x01\x64\xe3\xbb\x51\x23\x69\x8d\xe0\xe7\x47\x35\x9c\xa3\x5a\xca\xa3\xba\x0c\x94\x3b\xea\xcd\x7a\x9b\xdf\x8f\xf7\x39\x78\xe9\xfb\x00\x20\x45\xe8\xfe\x56\x48\xcc\x0f\x9c\xfa\x88\xb0\xd8\x12\xe8\x1a\xa6\x2e\x0d\x9c\x73\xfe\x61\x3a\xfd\x95\x39\xbc\xb6\x15\x72\x1f\xb4\x97\xd6\x2f\x65\xc8\x3b\x87\xa6\xd2\x14\x3f\x9b\x1c\x88\x0e\xc8\x67\x1b\xd4\x2c\x8d\xe9\x57\xb1\xa6\x8e\xe4\x92\x26\xff\x71\x7c\xcc\x6e\x74\xf2\xee\xe4\x9c\x30\xde\xa5\x3f\xec\x3c\xd4\xd9\x0f\x2c\xcc\xd8\xf9\x7c\x55\xd5\xc7\x52\x45\x4b\xe2\xba\x7b\x6f\xf2\x03\x0b\xe6\x7e\x0d\xf5\x0c\x5e\x88\x38\x43\xe7\x16\x12\xf2\xb9\x53\x59\x54\x3e\x2b\xa1\xbf\x2e\x98\xde\xbc\xf5\x76\x8f\x2b\xe6\xfd\x50\x4d\x97\x83\xce\x92\x1a\x81\xe0\x94\x16\xdb\xcf\x2b\xb6\x55\xa9\x24\xb1\xef\x01\x12\xd6\x71\xf0\x84\xa5\xb6\x90\xb0\xb6\x4a\x8b\x9b\xf5\x03\x33\xc3\x59\xff\x3f\xef\x19\x96\x94\xf9\xb6\x29\x24\x24\xf0\x06\x66\xce\xf6\xd0\x6d\x16\x1a\x79\xe3\xa1\xb9\xb9\x62\x9e\xea\x53\x50\x5f\x5e\x36\xae\xad\xfe\x0d\x75\x96\x72\xb0\xff\xe4\x98\x39\x7d\x90\xa5\x5d\x99\x44\xb3\x05\x41\xa7\xe1\xbd\xac\x53\x02\x06\x40\x13\x7d\xc2\x52\xae\xf6\x22\xf3\x81\x9d\x36\xab\x49\x8d\x76\x3e\x43\x27\xba\x85\x80\xdd\x9f\x7e\x5f\x47\xc2\x4c\xc9\x92\x87\x34\xb7\xe6\x21\x12\xc5\x7e\x3e\x0c\xfe\xde\xcd\xcb\xac\xcb\x0c\x45\xaf\x82\x19\x45\x5e\xe7\x22\x3c\x71\xe7\xe2\x04\x10\xc5\x24\x4e\xb8\x27\xaf\x2f\x39\x35\xce\x47\x55\x44\x47\x47\xaa\x94\x5f\x4c\x26\xdb\x3a\x29\x85\x19\xe7\x5f\xc6\xba\xce\x91\x52\x99\x72\xe8\x69\x1b\x69\x4d\x30\xaa\x8b\x5e\xc4\xc1\xa0\x28\xd3\xbd\x10\xbd\x0c\x8a\x40\x8f\xb7\xd9\xd7\x03\x49\x55\x53\xec\xea\x59\x8d\x06\x22\xdc\xc7\x4d\xe4\x89\xba\x71\x95\xcd\xae\x8d\x5c\xff\x98\x55\x92\x18\x37\xb5\x28\x43\x3e\xe5\x5c\x0b\x70\x90\x85\x7a\x0c\x27\x84\xd9\x31\x0b\x48\x25\xa7\x99\x3a\xd9\xc6\xf1\x8f\x83\xbc\xa5\xcc\x6a\x25\x04\x71\x68\xa8\x37\x6b\x06\x2e\x3a\x48\xea\x90\xca\xd8\x8e\x33\x11\x87\xc2\xb6\xf2\x81\x42\x6f\x81\xf7\x88\x04\xa8\x95\xc4\xec\x06\xc3\x41\xfe\x84\x6a\xf4\x52\x7e\xa2\x60\x69\xdc\xf6\x1d\x81\x3f\xdd\xf0\xfc\x43\xc7\x07\x35\x0b\xfb\x2f\xc1\xcf\xfc\xee\x7d\x7c\xcd\x7d\x75\xf7\xa4\x65\xa3\xd1\x4d\x57\x30\x2c\x14\x6a\xba\x3e"}, -{{0xde,0x8f,0x1c,0x99,0xe7,0xf8,0x55,0x6d,0xf2,0x0b,0x59,0xb8,0x50,0x4c,0xff,0x7c,0x6c,0x52,0x41,0xa8,0xae,0xeb,0x30,0xb9,0x2e,0xab,0x97,0xbf,0x48,0x1d,0x0f,0xe9,},{0xe4,0x63,0x79,0x1d,0x0f,0x56,0x7e,0xe7,0x3a,0xbb,0xf4,0x7d,0xd5,0x71,0x67,0xa5,0x35,0x61,0x3b,0x05,0xcd,0x48,0xd9,0x2e,0xbc,0x7d,0x24,0xe6,0xeb,0xff,0x95,0x73,},{0x30,0xab,0xc4,0xe4,0xe4,0xb3,0x88,0x58,0x1e,0x66,0x8b,0xd4,0x09,0xee,0x18,0xa6,0xed,0xe8,0x1a,0x13,0x6c,0x28,0xa2,0x92,0x4d,0xf5,0xfc,0x00,0xd7,0xc2,0x80,0xd9,0x78,0x62,0xae,0x3a,0x67,0xa9,0x35,0xce,0x49,0x23,0x64,0x13,0x5e,0x65,0x9a,0xdb,0x5f,0xba,0xbe,0x68,0x98,0x16,0x59,0x1f,0x49,0xac,0x50,0x22,0xa3,0x87,0xcc,0x09,},"\x38\xd9\x3e\x5c\x98\x01\xdb\x90\x17\x97\xec\x75\xc6\xdd\xdc\x65\xae\x79\x80\xde\x21\x0b\xed\x43\xb3\x3e\xb4\x4c\xdc\x6d\xc9\x93\x3f\xb6\xbe\xc7\x42\x1d\xb1\x0f\x0a\x59\x32\x0b\x9e\x64\x2a\x21\xf1\xdd\x23\x56\x01\xfc\xd6\xc5\x3b\xe4\xa8\x77\xf4\xfe\xd3\xfa\x4a\x0a\xd4\xdc\x6e\x9b\x39\x1b\xcf\xa4\x34\x90\x69\x25\xba\x45\xec\xc5\xb4\x35\xd9\xab\x8c\xfa\xfc\x39\x4b\xdc\xca\x9b\x07\xd5\x66\x83\x93\x44\x6e\x34\x00\xe9\x03\x94\x35\xa1\xdc\x78\xcb\xc0\x88\x07\xa3\xfb\x24\xca\x8b\x19\xf6\x4e\xa0\x8b\x8b\xf6\xc2\x0a\x19\x5b\x51\xff\x80\x15\xf3\xe7\xc9\x1d\x08\xe4\xbc\x62\x41\x55\x95\xa5\xa8\x82\xfb\xa6\x51\xdc\x3a\x67\x51\x87\xaf\x61\x82\x49\x74\x7b\x46\x80\xd1\xd1\x5a\x20\x2e\xa9\xdf\x48\xb1\xc2\x14\xfd\x40\x34\x66\xfd\x1a\x26\x5f\x2d\xef\xaf\x8e\xd5\xa6\xbf\x0e\xb0\x8d\x18\x64\xf2\xa2\x8e\x94\x72\x14\x3c\x6f\xd1\x03\xb6\xb1\x08\xc0\xd1\xd1\x36\x3b\x99\xf9\x20\x2d\x11\xf0\x20\x56\xc2\x79\xcc\xa3\x15\xdb\x1a\xb6\xd3\x10\x18\x45\x8f\x57\xba\x33\x16\xcd\x27\x38\xe8\x0c\x49\x2d\x85\x7c\xb1\x74\x99\x25\xe3\x31\xc6\x58\x58\xb5\x09\x83\xcd\x98\x38\xcf\xd2\x18\x8a\x5e\x8f\x05\xb4\x71\xfd\x3c\xdd\xcd\x30\xd9\x69\x01\x19\x40\x20\xf1\x15\xfb\x46\x9a\xb5\x84\x90\x06\xdf\xfa\x2d\x54\x3a\x13\xb3\xb5\x06\xed\x65\xcc\x45\x75\x32\xb8\xaa\x3e\xe3\x1d\x9d\x8d\x9e\x52\x98\xd7\xac\x70\x7a\xc1\x5b\x82\x7a\x57\x8c\x81\xd4\x34\xf8\x4c\xb1\xb5\x61\x20\xd6\x67\xb2\xaf\xe6\xd1\x53\x0a\xfd\xdf\xb9\x66\xd9\x53\xbe\x7e\x32\xdf\x07\xde\x38\x9e\x2d\x04\xb2\x32\xd3\x51\x2c\x7d\xb9\x35\x8f\xc9\x44\xd1\xb1\x18\x07\x8e\x69\x99\xe8\x91\xbb\xfa\x4a\x43\x29\xf6\x5d\x80\x71\x88\xb5\x98\x58\xc4\x31\x21\x1b\x29\x57\x6f\x44\x96\x13\x8b\x7c\x0c\x12\x8f\x7b\xef\x5f\x79\xb0\xf4\x46\xfc\x6b\x4a\x0e\x20\xbc\xa4\xc4\x0a\x83\x57\x1a\x36\x64\x4a\xbf\xfa\xbd\x49\xcb\x58\x5f\xd0\x64\xc8\xe5\x09\xd9\xa0\xfc\xff\x46\x26\x76\xf0\xeb\xcb\x61\xce\xc6\x1e\x51\x2b\xe6\xf1\x82\xab\xd5\x9e\x09\xf6\x42\xaa\x61\x96\x34\x85\x34\x82\xec\xe8\xf8\x98\x00\xf9\xc5\xbc\xfb\x84\x14\x31\xca\x06\x91\xed\x8d\x80\xe0\xa2\xfc\xb7\x97\xa0\x36\x89\x7c\xfb\x65\x37\x58\x6b\x31\xc0\x0b\x79\x65\xef\xdd\xfd\xa7\x28\x61\x84\x50\x26\x45\x91\x57\xf7\x9e\xba\x1b\xca\xf6\xcd\x41\xd6\x18\xae\xb1\xbd\x8d\xa1\xbe\x98\xf0\xcd\xc7\xf2\xe0\x9b\x90\x3d\xe4\x9c\x0c\x1b\xe9\x1d\xcc\x17\x7b\x29\x80\x96\x83\x6d\xce\xa4\xf6\x01\xdd\x86\x69\x15\x55\x12\x83\x25\x43\x8b\xd9\xcc\xbf\xc0\xe7\x77\x92\x0a\xe8\xbb\xd5\x76\x34\xc6\x10\x4f\xe6\x9a\x3a\x72\x01\x2a\x23\x60\xb6\xe5\x52\x55\x0c\xff\xb4\xe2\xf0\xb4\x1f\xe1\x55\x37\xee\x0e\x6f\x37\xe7\x88\x0f\xb4\xd1\x2b\xef\x6c\xad\x26\x6c\xe5\x8d\xf9\x81\x6b\x35\x96\x0c\xd0\xbf\x86\x52\x86\x2e\xe7\x89\xcc\xc3\x1a\x7e\xfc\x21\xa8\x1b\xda\x46\x14\x6b\x11\x1f\xcf\xd9\x4f\x04\x85\x6a\xb6\x1a\x55\x7b\x1f\xf7\xc8\xe4\xea\x6d\x9c\x4b\xcd\xd9\x3b\x15\x1a\xa0\x84\x61\xc5\x68\xde\xfb\x2a\xef\xdf\xce\x96\x39\x4d\xc8\x22\xd4\xef\x6c\xc4\xb9\xa3\xe6\xc3\x32\x03\x9f\x65\x38\xaa\x0d\xf8\xde\x81\x26\xd9\x0c\x31\x2f\xf4\x96\x88\x74\x86\x11\x15\x65\x53\x43\x46\xa7\x46\x26\x25\xd6\x3d\xf6\x9f\xcb\x57\x41\x90\x6f\x19\xe0\x0f\xc8\x00\x3f\x08\xb9\x59\x85\xc3\x8b\x86\x74\xaf\x42\x3c\xa5\x6d\xe5\xf8\x81\xb5\x9c\x46\x62\x43\xa7\xad\xba\xdb\xa2\x9c\xaf\x57\xfa\x77\x71\x22\xe6\x18\x23\xb4\xe7\x08\x18\x2a\xaf\x37\x20\x6d\x7d\x5e\xd0\x51\xc1\x2a\x5c\x0f\x6b\x43\x71\x04\x3f\x56\x2c\xdc\x02\x9d\x5e\x1b\xa9\xb2\xbf\x5f\xfb\xf1\xf5\xf5\x23\xdb\x06\xfe\xca\x42\x7d\xb7\xa0\x88\x19\xff\xb2\xd0\x58\x52\x42\xe2\x0d\xa5\x8e\x32\x0b\x16\xb1\x6e\x44\x8d\x8b\xe0\xef\x74\x02\xd2\x4a\x71\x94\x25\x71\x33\xbd\xc9\x82\x31\x4d\x83\xad\xbc\xd1\x2e\x8a\xf3\x13\x03\x42\x6c\x59\xff\xd8\x26\x9c\xe4\xb9\x87\xca\x9b\x6f\x0f\xfd\xbb\x4d\x1d\x12"}, -{{0x07,0x36,0xf8,0x01,0x72,0x0a,0x94,0x7c,0x5c,0x2f,0x32,0x58,0xce,0x0d,0x51,0x1c,0x3e,0x17,0xe9,0x4e,0x37,0xb3,0x0a,0xdf,0xa5,0x20,0x95,0x92,0x11,0x71,0xd4,0x00,},{0x4f,0x69,0x42,0x55,0x92,0x0d,0x0c,0x38,0xde,0x6e,0x72,0xe1,0x65,0xc3,0x3a,0xee,0x76,0xb1,0xcb,0xf6,0xf4,0x83,0x7a,0xa5,0x90,0x14,0x75,0x66,0x7a,0xcd,0x28,0x26,},{0xc0,0x3c,0x03,0x14,0x85,0x12,0x79,0xed,0xcd,0xe9,0x70,0xc2,0x3e,0xfa,0x23,0x6f,0x23,0x5e,0xda,0x96,0x0d,0x2c,0x27,0xd3,0xca,0x94,0x6f,0x65,0x0c,0x20,0x0b,0x4e,0xba,0x04,0xbe,0x66,0x8f,0xf6,0x2e,0xaf,0xfa,0x6c,0xea,0x35,0x1a,0xbd,0xfc,0x54,0x40,0x1d,0xcc,0xce,0x3d,0xba,0x78,0x00,0x4a,0xec,0x95,0x81,0xa2,0xcc,0xf4,0x0f,},"\x7f\x87\xb5\x1f\x6e\xad\x2d\x44\x02\xa3\xbd\x3c\x37\x69\xa2\x67\xac\x8e\x82\xf7\x79\xad\x7b\x98\x6d\xec\x82\xcb\xfc\x1e\xa5\x12\x91\x88\x43\x26\xd9\x22\x69\x67\xcb\x66\xa9\x68\x73\x18\x4f\x0e\x83\xb3\xab\x25\xa5\xab\x2f\xa8\x05\xfe\x3a\x0e\x7b\x19\x0a\x62\x2d\x46\x1b\x78\x30\xa3\xf6\x97\xc8\x31\xc2\x9e\xa7\xc0\xcd\x4b\x68\xd8\xe7\x7a\xa6\x97\x11\xcf\x86\x4d\xc1\xd5\x39\x4f\x48\x45\xe2\xfb\xb5\x07\x64\x04\xe0\x9a\x88\xb7\x9f\x05\x67\x05\x51\xbc\xe2\xef\x54\x68\xb7\x9d\x57\x88\x8b\x98\x52\xa4\xbb\x47\x9a\x4f\xd0\xbe\xb6\x81\xfd\x52\x3f\xc5\xbf\x44\x58\xab\xbc\x38\xec\xe7\x2e\x10\x6e\x00\x22\x20\x15\xa5\x7e\xbe\xc5\x5b\xf4\x75\x13\xe2\x5c\x3c\x45\x54\x84\x3b\xda\xcb\xcf\xe9\xf1\xb8\xd0\xae\x35\x4e\x48\xd0\x3f\xde\xbd\xf2\x0d\x65\x5b\x52\x68\xd8\xbb\xbf\x33\xb1\x28\x89\x10\xf0\x44\x4f\xcd\x56\xc0\xda\x7b\x89\x03\x36\x2b\x7e\x37\xa8\x64\x65\x42\x77\xcf\xfb\xe6\xc6\x08\x57\xf0\xb3\x51\x4d\x22\xa4\x0b\x9d\xd2\xd3\xfe\x5c\xae\xa5\x50\x7a\x0d\xe3\x05\x1b\xb3\xa4\x01\x5f\xa0\xfe\x4c\x46\x2b\x98\xfe\xf2\x35\x7d\xcf\x6b\x97\xdc\x75\xde\xf3\x82\xf9\x01\xf9\x6f\x4a\x04\xa3\xef\xc6\x02\x54\x20\x0a\x2c\x4c\xdc\x8a\x58\xb2\x5d\x94\xe3\x29\x54\xea\xff\x15\x11\xac\x46\xe3\x60\x66\x63\xb6\x87\x5f\x13\x64\x99\xda\x6a\x76\x90\x97\x87\x9a\x6e\x08\x34\xd5\x64\xfa\x7f\xdb\x99\x58\x11\x83\xed\x0c\x9d\x48\xfd\x19\x5d\x7e\xcd\x9f\x4d\xd4\x86\x55\x65\xfd\x17\xa0\x08\x71\x8d\xcd\x76\xf6\x8a\x54\xe5\x16\xa2\xb7\x30\xed\x3d\xba\x5c\x2c\xf4\x06\x30\xbb\xfe\x7f\xa0\x3b\xb7\xcd\xd9\x67\x69\x54\x95\xa7\xc8\x6e\x2e\x84\xcb\x01\x7e\xc6\x96\x01\x92\x46\x31\x59\x5a\xff\xaa\x8c\xfd\x04\x8d\x14\x26\x7c\x73\xe5\x4c\xfa\x53\x90\x47\xe7\x17\x69\x1e\x39\x97\x37\xfa\x50\xcc\x48\x44\x96\x12\x57\xc9\x3d\x72\x53\xd2\x32\x26\xb7\xcd\x0d\x1b\xd3\x1f\x3f\x0d\x2d\x89\x2d\x07\x3d\x8c\x50\x73\xc6\x02\xf6\x1a\x04\xd6\x43\x7c\x39\x03\xeb\x4a\x64\xa0\x1f\xbc\xc0\xc7\xe1\x59\x20\x1c\xdc\x4a\xa4\x2e\xf3\xb1\xff\x9c\x78\xfc\x27\x5c\xfb\x11\xa0\x5f\xfe\xd8\xf9\xf2\x2d\x85\xba\x92\x4d\x8d\x32\x23\x1c\x25\x4d\x89\x8d\xa7\xf0\x67\x9a\x64\xca\xb8\x40\x26\x90\x6e\x9e\x85\xf9\x5e\xfd\x8e\xe2\xa1\x72\x56\x33\xf4\xde\x2b\xa6\x7d\x99\xaa\x7f\x05\x50\xaf\x13\x9e\x9f\x8c\x52\x93\x78\x67\x27\xd8\x26\x30\x29\x6d\x5d\xaa\x9e\x83\x0a\xa1\xb3\xb5\xb3\x02\xb8\xb6\x62\xac\x83\x2e\x92\x13\x01\x6b\xa4\x93\xa0\x3a\x28\xcc\x3e\x95\x40\xd0\xd6\x5a\xcd\xdb\xfe\x12\x52\xb5\xc1\x6a\x84\xa4\x45\xce\x75\x41\x5c\x6c\xd8\xab\x16\xfe\x5e\xef\x11\x70\x97\xd7\x1e\xb5\x67\x6b\x9a\x95\xb3\x58\x82\xa7\xc3\x50\x6b\xc5\xd0\x2f\x03\x91\x0a\x63\xd4\x68\x46\xb2\x13\xc3\xc9\xbb\x2f\xc3\x4e\x6c\x69\x01\x7d\x20\x65\xa1\xad\x3c\xe3\xfd\x14\xab\x00\x14\xf5\x84\xe5\x7e\xa9\xd9\x03\xe4\x0a\xce\xb2\x30\xa8\x69\x3f\xa2\xe6\x36\x41\xc2\x54\x38\xff\x7a\x16\x38\x76\x04\x38\x84\x4c\xdf\x00\x11\x80\xf5\xb1\x77\xbe\x69\xed\xf7\xef\x66\xb3\x93\x12\x80\x52\x14\xcb\x17\x70\x6c\xef\xe5\x45\xbe\x5a\x77\x01\x9a\x5e\xc5\x2b\xbf\x78\x85\x0f\xa3\xd9\x7d\xe2\xd4\xd7\x4a\xa6\x8b\x58\xca\x81\x2a\x1b\x15\x6a\x0c\x40\x01\x12\x9f\x06\x72\x32\xa6\xec\x91\xa5\xed\x42\x70\xf2\xa4\xc6\xef\xee\xe7\x87\x00\x47\x70\xc8\x59\xe4\x50\xe8\x37\xef\xb0\x4d\xc9\x98\xbd\x27\x3c\x27\xa0\x98\x55\xe4\xec\xa1\xa2\x2a\x9b\x88\xc1\x7b\xdb\xf2\x53\xa7\x97\x61\x07\x0a\x76\x81\x7a\x7f\x74\xff\x3f\x07\xfb\x71\x8b\xff\xa0\xb4\xf3\x26\xf2\x84\xe6\x2f\x83\x68\x32\x42\x7b\xe8\x2f\x48\x33\x73\x51\x5b\x9b\xf5\x9a\xf4\xa7\x6a\x57\xe2\xf4\x0b\x91\x03\x4d\xd5\x68\xec\x14\xac\x10\xe2\x30\x9b\x87\xe2\x92\x2f\x9c\xd9\xfc\x1a\x46\xa4\x7e\xd3\xbc\x7e\x1b\x9f\xeb\x9e\xe0\x67\x07\x3f\xa5\xdc\xe2\xa6\x75\x30\x52\x6d\xe6\x7e\xe0\xe5\x09\x66\x3c\x44\x46\x7e\xeb\x59\x42\x01\x03\xeb\xcd\xff\xa7\x09"}, -{{0xfa,0x75,0x65,0x04,0x91,0x04,0x74,0x28,0xd3,0x63,0xb5,0x82,0x22,0x22,0x12,0x2d,0xff,0xb5,0xa9,0xfd,0xdc,0x60,0x3c,0x33,0xc8,0xa6,0x08,0x61,0x83,0x75,0xdc,0xf3,},{0x98,0xc9,0x64,0x1f,0xa9,0xdf,0xa8,0xea,0x13,0xe0,0xd1,0xc7,0x16,0xb8,0x67,0x9e,0x26,0x4b,0xe1,0x5d,0xd2,0xd4,0xc0,0x6a,0xb4,0x3c,0xbe,0xe4,0x79,0x16,0xee,0x01,},{0x1e,0xff,0xbf,0x92,0x99,0xa1,0xb9,0x35,0x4f,0xe1,0xf1,0xde,0xc1,0x76,0x65,0x95,0xea,0x76,0x7a,0xb8,0xe4,0xda,0x9b,0xb5,0x7b,0x4f,0x69,0xbc,0xbd,0x8c,0xb3,0xd8,0x6f,0x76,0x83,0x92,0xf5,0x9b,0x39,0xfa,0xfa,0x8a,0x21,0x0a,0x65,0x09,0xfe,0x0d,0x60,0x08,0xd6,0x35,0x61,0x11,0xad,0xfb,0x37,0x99,0xc1,0xd5,0x59,0xc2,0x63,0x09,},"\xf5\x4e\x41\xb9\x39\xe3\x7d\xf1\x7c\x7d\x60\x43\xfd\xed\x14\xa9\x15\xd9\x34\xe8\x67\xc3\x45\x26\x9f\xdc\x01\x77\xf5\xbd\x10\xc4\x34\x8f\x31\x9e\x0a\xb9\xa6\x4c\xc0\xb7\xd4\xe0\xc9\x1c\xa9\xaa\xda\xab\x2e\xdc\xba\x54\x4f\x14\xed\x2c\xb5\x39\xca\x89\x75\x09\x7d\x87\x92\x70\x95\xb4\xeb\xd4\x90\x34\x43\x40\x06\x1e\xd9\x3c\x38\x16\x7e\xda\xa0\x96\xa2\x30\xdb\x59\x62\x4c\x67\xfb\x9a\x1e\x1d\xda\xc4\x02\x13\x3f\x4d\x47\xcf\xc1\x1e\x2f\xae\x6b\x3f\x3c\x50\x01\xcb\xa9\xa8\xae\xd9\x00\x73\x10\x32\x40\x22\x7e\x71\x6f\xf7\x1b\xf6\x8a\x59\x1b\xa2\xce\xff\x2d\x31\xb8\x6e\xf2\x1a\xb0\x12\xec\xcd\x40\x9a\xd5\xc2\x9d\x65\x9a\x1b\x37\xc4\xd8\x55\x05\x30\x41\x40\xfb\x2c\x34\x37\xa2\x06\x86\x8b\x13\x52\xc1\x02\xbb\xfa\x3b\x9a\x76\x52\x2a\x2b\xfc\x54\x06\xb2\x57\x69\x6d\xe7\x4e\xe7\xd3\x15\xc8\xe9\x9c\xaa\x96\xbd\x83\x80\x06\xc6\xda\x2a\x42\x33\x31\x5a\x85\x6a\xcb\x8e\x80\xc3\x31\x68\xb3\x33\x55\x1d\x91\xd0\x74\x05\x57\x34\x13\x0b\xd7\xd1\x4c\x56\x81\x1e\xba\xbf\x7d\x5a\x25\x0e\x60\x72\x59\x3d\x9f\x2f\x8b\x97\xc1\x2a\x70\x3c\x2c\x47\x9c\xb0\xb1\x5b\x7a\x27\x75\xc9\xdc\xd2\xca\x46\x24\x67\x23\x68\xa2\xe6\x14\x54\x67\xf3\xbe\x66\x15\xf9\x3b\x81\x20\xa0\xa1\x2d\xa1\x56\x06\x63\xa2\x6a\x61\x73\x19\x66\xb4\x4b\x29\x9e\xbf\xad\x2a\x95\xc6\x23\x60\xf3\x9c\xe0\x5d\x95\x58\xe3\x05\xee\x23\xa5\x2f\xa5\xce\x20\xf6\xbe\x5e\x26\x2a\xff\x3a\x86\x4d\x5d\xda\xbe\x23\xff\x94\x3f\x71\xd5\x99\x84\x93\xd9\x9f\xe2\xac\x23\x74\xb4\x64\xa6\x91\x83\xc3\xbc\x4f\x1d\xdb\x88\x36\x11\x14\x9d\x7d\xdb\xf1\xe8\x38\x0b\x54\x43\x35\xe2\xb8\x93\x95\x05\x4c\x9f\x25\x58\xdf\xc5\x6e\xa9\x3f\xf1\x4d\x0f\x15\xd2\xe0\xbd\x89\x37\xa5\x56\x38\x7d\xe9\x6e\x41\x8d\x8b\x3a\x7d\x66\x6f\xb1\x90\x36\x4b\x2c\x21\x90\xd3\xc2\x5f\x17\x52\xd5\x48\x3d\xcb\xb5\x96\x00\x64\xf0\xc8\x7f\xcf\x8f\x31\x3d\x28\x78\x1c\x11\x4a\x16\x9b\x69\x0a\x87\x01\xc5\x0d\x89\xc7\x73\x24\x53\x1c\x0f\x84\x9d\xba\xd1\x63\x3d\x92\x5a\xcd\x06\xc1\x6a\x9c\xea\x19\xa4\x34\xeb\xc4\x2a\xeb\xb1\xfd\xb9\xb0\xba\xcc\x93\xce\xc3\x99\x19\x94\x36\x64\xea\x1a\x95\x84\x06\xff\x9e\x49\x35\xc9\x2c\xa7\xc3\x97\x08\xf9\xca\xb7\x10\xa5\x83\x09\x6b\x4e\xd9\xf4\x8d\x9e\x09\x06\x47\x24\x0d\x76\xec\xcb\xab\xa5\x91\xf5\x5f\xe7\xe3\x6d\x72\xc2\x17\x27\xac\xba\x0f\x80\x30\x95\x4e\x62\xbc\x58\x0b\x8b\x67\x0c\x44\x57\xc3\x40\x3e\x36\x9a\xc2\x0e\x66\x0d\x66\x2f\x7f\x6a\x41\x42\x13\xea\x43\xf7\xc0\x10\x50\x09\xc1\xde\x81\x7a\xdf\x6f\xfd\x9c\xca\x3b\x45\xa6\x3a\x82\x22\x81\xc6\xe2\x77\x2f\xd7\xb7\x80\x96\x03\x18\x4b\x48\x79\xb1\x8c\x88\x79\x03\xf0\xfc\x8d\x8e\x1e\x2d\xbf\x6e\x77\x2f\x0b\x2d\x9b\x8a\x29\x92\x7a\xcc\x81\x71\x4a\x22\x56\xad\x8d\x7b\x73\x30\x52\x7d\x7d\xbf\x8b\xef\xd8\x2f\x8c\x9b\xb4\x01\xcf\x0a\x90\x24\x9a\x64\xca\x6f\x88\x33\xdb\x31\xbd\x03\xb9\xe7\x94\x6d\x06\xdd\x04\x38\x3d\x7c\x08\x2d\x70\xae\xb3\x7f\xf8\x4c\x2b\x05\x7d\x97\x3b\x89\x4b\x4a\x03\xec\x7b\xf0\x31\xae\xa6\x56\xa1\x90\x84\x88\x89\x4a\x4a\xda\x3f\xd7\xfa\xdf\x91\xed\xe9\x55\x0d\x38\x41\x5f\x82\xa0\x94\x55\xc0\xf4\x32\xfb\x55\x98\x71\x32\xf0\x00\x42\xaf\xd6\x0e\xa5\x1d\x1f\x1c\x6c\x1a\xfe\x0c\xf8\x7c\x34\x6e\x31\xe6\x3e\x26\xf4\x9b\x13\x71\x77\xb2\xd4\x7a\xb3\x0f\x07\xce\xa0\x71\x93\x12\x74\xcf\x01\x08\x36\xd6\x83\xff\xf3\xbe\x71\x34\xc7\x8b\x8b\xfd\x8b\x1b\x8f\xc2\x04\x9e\x18\xcc\xb1\xe1\x8a\x0a\x95\x85\xa7\xd8\xa1\xe2\x54\x92\x60\x86\x68\xc9\x6d\x62\xa0\xac\xa8\xef\x90\xe0\x48\xd2\x03\x78\xc1\x08\xd0\x6b\x03\xfe\x3e\xc4\xad\xb2\x75\x28\xae\x08\xf7\xde\xd9\x48\x78\x93\xae\x64\xca\x4b\x93\x92\x02\xaa\x4c\x17\xaf\xe7\x18\xcd\xca\x49\xff\x96\x16\xd0\xcd\xf8\x33\x4b\x6a\xee\x2d\x6d\x20\x94\x7c\xa4\xbd\x7d\xf5\x31\xdd\x1d\xa9\x95\x81\xff\x72\xea\x56\xfe\x62\xca\xa2\xc9\x5e\x35\x87"}, -{{0xe1,0xc1,0x29,0x46,0xd2,0x21,0xa1,0x94,0xf2,0x2f,0x27,0x62,0xc0,0xe5,0x1c,0xbe,0x3f,0x98,0xb9,0x14,0xa4,0x7d,0x3d,0xc4,0x1a,0x1f,0x45,0xc5,0x43,0x70,0x63,0x7c,},{0x10,0x40,0x81,0x36,0xa6,0x8f,0xc5,0x6c,0x7d,0x3b,0x36,0xb7,0xfe,0xf1,0x22,0x09,0x4d,0xe0,0x81,0x03,0x11,0x89,0xcc,0x84,0xa4,0x88,0x06,0xaa,0xf6,0xcb,0x91,0x85,},{0x8f,0xd7,0xfa,0x40,0x0c,0x03,0x2f,0xcf,0xbc,0x40,0x29,0x42,0xfc,0x78,0x63,0x75,0x26,0xbe,0x97,0xab,0x82,0xf2,0x37,0xbb,0x39,0x3e,0xa3,0x9e,0x35,0x73,0x8c,0x67,0xd7,0x54,0x09,0x54,0x3a,0x8b,0x3c,0x05,0x5f,0x08,0xbf,0x69,0x19,0x9a,0xf6,0x3b,0x69,0x11,0xa4,0x82,0xfb,0x4f,0x65,0x80,0x80,0x2e,0xc9,0xd2,0xdc,0x3c,0x11,0x06,},"\x87\x0f\x4c\xd9\x7c\xfc\x0a\xaf\xad\xa4\x00\x72\x31\x2f\xb5\x4b\xcc\xc0\x76\x28\x71\x4e\x49\x62\xd4\xbe\xf4\xee\xb5\xde\x40\xa1\x9a\x24\x6b\x5b\x7d\x52\xd4\x87\xb7\xe5\x2d\x65\x6f\x2c\x64\x03\xb9\x16\xd0\x2e\x02\xa6\xd2\x91\xc1\xe1\x82\x8d\xd9\x45\xa5\x83\xb4\x38\x52\x8d\x1c\x39\x76\x5a\x57\x20\x31\xff\xa9\x16\xb6\x83\x21\xf3\x2e\x66\x46\xf0\xdc\xc1\xc6\x02\x35\xff\xaa\x32\x35\xf4\x84\xa5\xc4\x97\x8f\xa3\xe6\xbf\x14\x30\x1d\x53\xe1\x2f\x4c\xc5\x21\x18\xb1\xf6\xf0\x7f\x53\x36\xf5\xd0\xa9\x37\x89\xbb\x01\xd1\x62\xfb\x31\x26\xdc\xd7\x56\xe0\x64\x2e\x7e\x69\x89\x63\xc0\x34\x59\x11\xa5\xcf\x3c\x99\x53\xf7\x73\x19\x42\x6c\xea\x2c\xde\xda\x3e\xfe\x98\x9e\xcb\x63\xcb\x9e\xb8\xb9\x20\xde\x76\x6c\x4f\xcf\x63\x36\xe5\xbc\x43\x71\xa0\x68\x37\x1f\xed\x95\xc8\xc2\xb6\x1e\xe9\xb7\xc3\xe3\x83\x1c\x20\xbf\xfe\x87\x07\xc0\xc9\x8b\xe9\x61\x53\xc8\xa8\x73\xd7\xf2\x8a\xfc\xa1\xbf\x71\x08\x5c\xe0\xe3\x89\x9e\xef\x55\x91\xbd\xd6\x66\xdc\x2d\x07\x64\x17\x72\xd7\x45\xc5\x16\x44\xa2\x60\x81\x5b\x20\x8c\x4d\xd3\x05\xf0\x5f\xe4\x63\xd0\xd9\xd5\xa9\xee\xff\x97\x79\xf5\xb1\xd4\x4f\x26\x08\x30\x78\x56\x6d\x0e\x5f\xf5\x6b\x3a\xf0\xe6\x4c\xc3\x87\x08\xaf\x5a\x65\xf6\x54\x35\x2d\xf1\x04\x37\xf1\xdd\xf9\x45\xa0\xda\x1f\x4d\xef\x6a\x71\xa0\x60\xe0\xc4\xad\xec\xca\xac\xf8\x5e\x09\x0f\x70\x90\x37\x0a\xe2\x4e\x52\x38\xd7\x68\xa0\x8f\xe6\xb4\xbb\x5e\xc4\x97\xa6\x60\x31\x98\x60\x84\x15\xc7\xc6\x49\x00\x48\xaa\x36\x73\x7c\x08\x50\x30\x08\xae\xce\x0f\x49\x42\x19\xdd\xf8\x9b\x72\xea\x77\x17\x1c\x6d\x31\x17\x08\x9e\xb8\x89\x07\xe8\xc3\x3f\xb9\xe7\x0b\x0d\xc2\x81\xf6\x64\xb5\xf9\x65\xb5\xd2\xad\xb1\x25\x07\x10\xef\x23\x52\x02\x5f\xb2\x93\x39\x5a\xe1\xd2\x3e\xe3\xb5\x92\xb4\xc5\xf2\xd5\x55\x69\xa5\x45\x86\x54\xce\x3f\xc2\x5d\xd0\xe3\xf7\xe6\x75\x7a\xa7\xb3\x47\xc1\xff\xd3\xba\x4d\x4f\x2c\x4b\x6d\x36\xaf\xd5\x98\x63\xa3\x2a\x59\x4e\x74\x53\x7e\xce\x9b\x8b\x1e\xc2\x69\xbb\xc4\xcb\x54\xd7\x62\x38\x21\x1f\x62\xa9\x8a\x46\xa4\xaf\x66\x2f\xa8\x1e\xba\x6f\x30\xf5\x14\xb8\x66\xb7\x94\x2b\xc1\x73\xf7\x21\x1a\x6c\x01\x4d\xa1\x4e\x74\x13\x27\xa5\x68\x62\x3d\x14\xb8\xf8\x35\xef\x1d\x5d\x62\xb2\x52\x3c\xfe\x6a\x85\xbc\x69\xfa\x05\x20\x0d\xea\xc1\x56\x8b\x94\x6a\x81\x6b\x75\xc5\xd7\x60\x31\x74\xfd\x4e\x2f\x91\x01\xa7\x90\x63\x79\x1b\xc3\xd5\x92\x97\xcd\xc1\x0b\xda\xa6\x63\xab\xf3\xc1\xbe\x2f\xda\x17\xe4\xe5\xce\x39\x4e\x90\xbd\x76\xb1\xf9\xe0\x40\x5f\x56\x75\xb9\x9d\x63\x8a\xbc\x2c\x1b\x2d\x8b\x53\xa6\xfd\x3d\xc8\x37\x58\x55\xec\x54\xcc\xbd\xa2\x4e\x67\x25\x27\x72\x3b\x07\xbb\x59\x9d\xb5\x4e\x38\x79\x33\x91\xcf\x09\xef\x3b\x1f\xd7\x61\x49\x90\x06\x5b\xbd\x4a\x19\xe8\xd3\xd1\x04\x82\x53\xba\x4c\x97\x1c\x2f\x98\xd2\xb3\x59\xdf\x50\x90\x87\x32\x3a\xa6\x90\x50\x29\xf5\xcc\x5e\x1a\x0a\xaf\x2f\x7c\x01\x08\xdd\xb1\xa4\x0f\x56\x2b\xe6\x4e\x57\xe6\x95\xed\x21\xdc\x7d\xb1\x7d\x53\x36\x77\xef\x12\xfc\xbb\xe2\x9f\x3b\x23\x7b\xb6\x34\x4b\x11\x09\xb3\x2a\x94\x62\xab\xc3\xad\x3c\x07\x10\xb0\x4f\x38\xc6\xf5\x95\x2d\xb2\x75\xe7\x7e\x2f\x37\xe9\x5d\x55\x09\x6b\xba\xf3\xe3\x05\xd5\xd7\x43\xd3\x65\x95\xbf\x05\x67\x89\x2c\x21\x0a\xc7\xba\xe7\x37\x1d\x16\x45\x84\x78\x5d\xd8\x90\x17\x41\x59\xb3\x93\x0a\x9a\x6c\xe3\xa1\x66\xdd\xa2\x38\x3e\x6e\x2a\xf2\x8c\x1b\xf3\x19\x24\x47\xe9\x05\x11\xdc\xd8\x0e\xbd\xf9\xee\x2c\x9b\xde\xdd\xee\xb6\x10\x55\x86\x41\x53\x2d\x07\xcd\x13\xda\x61\x25\x41\x54\xcc\x0f\xd9\xd4\x81\xe3\xb0\xa2\x37\xaf\x2e\xc2\x62\x56\xd4\xab\x21\x9f\xaf\x15\xad\x2b\x7e\x8e\x57\xab\x72\x6f\xf2\x72\x32\x16\xa5\x74\x58\x5e\x2a\x63\x9d\x94\x8c\x2c\x4f\x69\xee\xaa\xd2\x83\xe3\xa4\x4f\xf2\x68\xea\xef\xd7\xe6\x6b\x73\xed\xe4\x73\xa8\x39\x7c\x76\xb4\x8d\x56\xcb\x3c\xcd\xab\xc9\x1a\x89\x29\xcf\x42\x99\x83\x50\xe0"}, -{{0x76,0x2f,0x06,0xca,0x01,0xe3,0x14,0x71,0x5f,0x92,0xc9,0x0b,0xbe,0x72,0xa2,0x5b,0xf2,0x62,0x12,0xc8,0x1e,0xb1,0xd1,0xa0,0xda,0xe2,0xc3,0x11,0x30,0xf7,0xcd,0xbb,},{0xf9,0x62,0x6f,0xfd,0x69,0x27,0x31,0x92,0x5e,0x5a,0xac,0xfa,0x1b,0xde,0xd0,0x1a,0xa8,0xf7,0x30,0xb7,0x72,0xd5,0xe4,0x6a,0xdb,0xc3,0x15,0x56,0x5b,0x9b,0xf2,0xc9,},{0xe8,0x42,0xb4,0x9e,0x53,0x3d,0xbc,0x92,0x99,0x8d,0xc0,0x78,0xe5,0x97,0x93,0xa2,0xc2,0xfa,0x63,0x6b,0xdf,0xaf,0xdb,0x48,0x93,0x4c,0x93,0xcf,0x34,0x79,0x71,0x02,0x93,0x8d,0x13,0x7a,0xb7,0xea,0xd1,0xa0,0xf7,0x0e,0x94,0xa6,0x7d,0x57,0xef,0x6a,0x02,0xc9,0xec,0x77,0xd7,0x1f,0x70,0xcc,0x57,0xf1,0x53,0x3b,0xec,0x87,0x73,0x0e,},"\x94\x97\x48\x3a\x4f\xba\x78\x43\x3b\x38\xe9\xde\xb8\x91\x5c\x75\x0b\x6d\xa0\xf7\x8a\xf4\xa6\x8b\x62\xf9\xfc\x03\x91\xe3\x38\x87\x3b\x1d\x64\xb1\xb7\xf0\x9f\x12\xf0\x56\xa3\xc9\x16\x53\x49\x8a\xd5\x6e\x06\x9b\x8b\x16\x08\x87\xe8\xe3\x78\xa7\x6d\x8b\x3c\x66\x70\x83\xc0\xa2\xb2\xd2\x31\x7d\x3b\x87\x48\x57\xe5\x78\x62\xef\x0c\xb7\x04\x36\xa9\x02\x8f\x01\x91\xcc\xc6\x16\xe9\xd7\xc9\xbd\x86\x98\x08\xcf\x09\x48\x35\xff\x51\x86\x77\xb3\xfb\x08\x9f\x4c\x9d\x07\x7c\xc7\x74\x24\x05\xb4\x86\x3a\xc7\xa5\x96\x45\xc9\xcf\x54\x0d\x57\x39\x9d\xa6\xae\x9d\x07\xfd\x19\xfc\xa9\x5b\xc8\xa8\x6d\x8b\x8e\x24\xe4\x87\x33\xf3\x21\x58\xfd\x19\xa8\xa1\x11\x1d\x1d\xa1\xf9\xb5\x80\xa3\x9c\x10\x48\x46\x16\xcf\x2b\xc0\xec\x29\xf6\x3f\x77\xc8\x53\x56\x15\x8e\x16\xda\x59\x4b\x5a\x89\x0e\x55\xd0\xb6\x45\x99\xb3\x02\x93\xe9\x00\xed\x92\xad\x26\x19\x69\xe7\xdf\x4c\x4b\x1d\x0b\x60\x24\xbd\xce\xb6\x90\x67\xef\x48\x6c\x20\xfd\xcd\x22\xa1\x0d\x5d\xa4\x5f\xbf\x90\x5b\xa1\xe9\x35\xc9\x6f\x50\xaf\xb6\x35\x71\xbc\xff\x31\x30\x68\x4e\xda\x0b\x56\xe6\x0b\x26\xcf\x4c\x0e\xf9\x93\x8a\x92\x76\x8f\xc8\x63\x1f\xe3\x08\x23\x6b\x01\x2f\x92\xaf\x24\xa8\xf6\xe6\xec\xbe\x76\x62\x9b\xba\xf8\xff\xe5\x4c\xdb\xe8\x67\x1d\xe2\xba\x62\x4a\x7c\x0f\x61\x93\xbb\xa4\x11\x04\x12\x90\x2b\xac\x29\x90\x92\x2a\x9e\x5a\x81\x05\x3c\xf8\x76\xa4\xc8\x05\xa0\x4c\x56\xa8\x13\x9d\x34\x19\xe4\x54\xa6\x22\xd0\x34\x2b\xf4\x26\xe9\x80\x2c\x3d\xc1\xb4\x08\x0c\x75\x49\x2a\xfe\x9d\x7b\x15\x45\xfe\x08\x6d\x96\x35\x41\x32\x4f\xf5\x2a\x48\xc6\xbf\xae\xa2\x66\x68\xb3\xe0\x1e\x52\x36\xfd\x45\xfe\x54\x59\x45\x35\xc0\xb2\x3e\x28\x7e\xbd\x14\x28\xc8\xbe\x0a\xd1\x41\x60\x0e\x91\xcb\x51\xe1\xea\x66\x27\x1a\x64\x21\xfb\x68\x9e\x88\xa0\x79\x0a\x65\x1d\xbd\x21\xee\x20\x89\xb2\x74\x66\x6f\x66\x0c\xa0\x9c\xe2\xd6\x0e\x39\xe2\xee\x5f\x03\xb6\xeb\x82\xd1\x99\x76\x96\x6e\x79\x90\x0a\x81\x0f\x6d\x5b\x5c\x1a\x54\x8e\x50\x64\xf5\xc3\xd8\xa9\xf2\xde\xf0\x17\x9d\xf9\x9d\x14\x3f\xde\x69\xb0\x71\x2c\x09\x1c\x29\xe9\xb2\x5f\x40\xca\xfd\x57\xa0\x24\x65\x8d\x77\x74\x03\x76\x10\x34\x2f\x38\x00\xfd\x51\xf4\x9e\x79\xa5\xb3\xde\xcc\x11\x2f\x58\xd0\x3e\x3d\x29\x58\x75\x85\x88\xbc\x4b\x1c\x6a\x6c\xda\x7b\xc5\xf5\xbe\x18\x3e\x41\x51\x3c\x1f\x23\x0f\x3c\xc3\x64\x30\x4b\xf8\x24\x84\xb7\xcf\x19\xa0\x02\xe1\x50\xf9\x8c\x5e\x97\xc6\x16\x6e\xa1\x5b\x86\x34\x0b\x8c\x5e\xbe\x5c\x1a\x18\x3e\x55\x88\xe6\x6f\x55\x90\x50\x86\x31\x3f\x37\xa4\x09\xe8\x9b\x47\xdb\x31\xae\x97\x45\x3e\xdf\x69\xfe\xd7\xbe\x08\x11\x30\x71\xf3\x74\xb2\x6e\xc6\x04\x3f\x2a\x0e\x9c\xf8\xba\xd8\x02\xab\xad\x69\xe6\x17\xe7\x62\x43\xb3\xcc\x03\x4b\x09\x9d\x87\x29\xee\x40\x7a\x53\xeb\x03\xbd\xc6\x41\x0a\x03\x95\x04\xb3\xb1\x2c\x81\x9b\x64\x54\x5d\x40\x5c\x6a\x4f\x08\x49\x21\x93\x5b\xdf\xf4\x13\x0a\xe6\x29\xd9\x09\x62\x6b\x06\x26\x76\xe5\x38\xea\xfd\xff\xb1\xd6\x22\x9c\x08\x89\xd3\xcd\xdd\x33\x65\xdc\x3d\x65\x36\xf7\x24\x8c\x49\x31\x7c\xb5\x0c\x56\xfb\x57\x85\x55\x41\xd6\xfe\xeb\xac\x81\x6c\x99\x28\xfa\x66\x2d\x0a\xe8\x0a\x0f\x39\xe5\x70\xbb\x7d\x22\x41\x6f\x98\xf3\x71\xb6\x42\x47\x96\x89\x51\xa8\xa2\x46\xf7\x4b\x30\x61\x74\x3c\x9a\xf7\x68\x4b\xbb\x96\x6a\xe0\xbd\x78\xa8\x10\x49\x3e\xa4\xcc\xd7\x11\x74\x87\x1c\x82\xbb\x65\x2b\x27\x48\xe5\xbc\xcb\x0a\xb6\x38\x8a\x50\xf0\x53\xa0\x48\x08\x7f\xd9\x7e\xb1\x5c\x1a\x21\xb1\xee\x18\x25\xe5\x4a\xa1\x30\xd6\x63\x18\xaa\xf6\x61\xbb\xb2\x47\x63\x57\x7e\xb3\x7d\x31\x0e\x21\x9b\x0a\x9b\xba\x03\x75\xeb\x9c\x9b\x4a\xf8\xc4\xb9\x9a\x36\x99\xe0\xd3\x26\x67\x33\xb6\xe4\xe9\xc5\x34\x49\x0a\x13\x41\xcb\x19\x90\xca\x5b\x1c\x84\x7b\xc8\x12\x60\x26\xfe\xa9\x03\xa1\xf5\x49\xd6\x5a\xf8\xfe\x02\xa9\x16\x3f\xf8\xea\x28\x1e\x72\x26\x24\x3e\x2a\x15\x3b\x92\x18\x51\xde\x10\xf7"}, -{{0xc5,0xcc,0x0b,0x95,0x81,0x8c,0x4b,0xf3,0x8d,0xa1,0xd6,0x5f,0x02,0x16,0x27,0xe9,0xe5,0x7d,0x26,0x2b,0x02,0xec,0x6d,0x91,0x7a,0x7d,0x46,0xb1,0x1c,0x7f,0xe4,0x8a,},{0x45,0x7d,0xa4,0xef,0x14,0x51,0x9d,0x54,0x1e,0xdf,0x92,0xca,0xbe,0xd9,0xb0,0x4d,0x8a,0x2f,0x2a,0xfd,0x15,0x10,0xa9,0x2f,0x00,0x9b,0xb4,0xe8,0x75,0x4f,0x1e,0xba,},{0x3b,0xa0,0xaf,0x8a,0xf1,0x27,0xc4,0x58,0x48,0x26,0x09,0x0e,0xcd,0xaf,0x48,0x5e,0xbd,0xf0,0x7b,0x82,0xbc,0x49,0x9c,0x9a,0x2b,0xef,0xca,0x28,0xd4,0x93,0x44,0x97,0x4a,0xdd,0xbc,0x8d,0x80,0xa5,0x25,0x60,0xe0,0xf3,0xd7,0x3f,0xf5,0xcc,0xcc,0x72,0xc7,0x4b,0x5b,0x47,0xad,0x2e,0x6d,0xe9,0x61,0x2d,0x1a,0x00,0xae,0xc9,0x27,0x01,},"\xd6\x60\x8b\xf5\xac\x00\x0e\xca\xf9\x5f\xc0\x9f\x9c\xb7\x49\x8c\x51\x8a\x6e\x02\x55\x58\x6e\x63\x37\x85\x3b\x1d\x7d\x9d\x7d\xe4\xdf\xe1\x24\x5d\x59\x03\x1a\x31\x7d\x4e\x2b\x6a\x73\xc4\xc3\xf9\x5b\x58\x2e\x72\xa6\x42\x02\x21\x58\x7b\xac\x12\x0f\xb8\xed\x73\x48\x07\x0f\x28\x60\xd8\x58\x66\xa0\x9f\xe7\x56\x74\x34\x97\xf2\x11\x9b\xc1\xbf\xdf\x57\x3b\xe3\x5d\x10\x91\xbe\x37\xf1\x8b\xcd\xa6\x74\x1c\x90\xd5\x66\xcc\x92\x4b\x72\x16\x4b\x74\x9a\xf9\xa6\xf4\x0f\x71\xd3\xea\x5d\x87\x64\xcd\xc8\x17\x14\xbd\x73\x95\xe5\xf6\x79\x97\x36\x36\xef\xf1\xdb\x1c\xf0\x01\x29\x83\xf7\x1a\x2f\x2b\x12\xd4\x5a\x29\x4e\x5a\x38\x9f\x4c\xd2\x48\x3e\xb3\x9d\xa0\xdf\x26\xb7\x36\xc7\xaf\x6e\x41\xdd\x35\xa7\x8e\x45\x29\x2c\x39\x4e\x34\x68\x95\x32\x88\x87\x21\xf8\x63\xc5\x6d\xb9\x7d\xa1\xcd\x10\xa6\x6a\x20\xa6\x70\xb2\x7f\xe8\xce\x55\x68\xa4\x2b\x89\x37\x79\x0c\x7b\xe1\xaa\x42\x0d\x20\x3d\x7a\x88\x5c\x17\x29\xcd\x6b\x8e\x19\x71\x89\xe4\x79\xd5\x42\xcb\xcb\x9b\x53\x65\x6f\x2b\x9f\x53\x9c\x32\x5c\x34\xaa\x59\x8f\xd9\x1e\x7d\xf7\x0f\x9a\x74\xab\xec\x46\x76\x54\xb1\xc9\xa3\xd1\x44\x38\xe7\xc0\x83\x60\x40\xb7\x93\x87\x1e\xcb\xe9\xe5\xf6\x68\x0c\xcc\xcd\x5d\x46\x96\xa8\x7e\x37\xe8\x9e\xab\x28\xb6\xbd\x67\x9e\x8f\xe1\x62\x7b\xdc\x9d\x37\x3b\x82\xf5\x2c\xd8\xc4\x9b\xe9\xba\xcd\xc6\x30\xa3\x2f\xd1\x28\x35\x25\x5a\x54\x2f\xb7\xb1\x23\x93\x77\x9d\x44\x98\xaa\x06\xa0\xe7\xe1\xa4\x97\x79\x39\x81\x7e\xb2\x08\x8a\xf1\xe1\x9b\xb0\xe5\xac\xa8\x54\xc1\x25\xdc\x60\x3d\x83\x57\x36\xa0\x3d\x93\x80\x51\x53\x0c\x9a\xb1\xaa\x3b\xc7\x79\xb3\xba\xe7\x45\x0e\xf5\x7d\x1b\x3f\xc0\x93\xa3\x7d\xbe\x9d\x1b\xd6\xd0\x40\xf2\xf8\xee\xba\x77\xf7\xfa\x88\xc1\x49\xf0\x65\xc7\xac\xe3\x32\x77\xaa\x99\x69\xc2\x66\xea\x6d\x85\xca\xd6\x2c\xfa\xf5\x50\x8e\x70\x32\x71\x6b\xe6\x84\xa2\x28\x56\x41\x3e\x0e\x65\xe4\x2b\x6e\x9e\x6d\x86\x5a\x87\x36\x3c\xbb\x62\xd5\xbb\xb6\xa3\x73\x1d\xdd\xa0\xfa\x6a\xd0\x29\x3a\xf9\x89\x3c\x09\xa9\xe7\x43\x09\x0f\x2c\xee\x2f\x44\x37\x73\x6d\xd4\x33\xe2\xac\x74\x28\xbd\xc8\xc7\x7c\xb9\x96\x43\x55\xfa\x44\x15\xcc\x38\x31\xd8\xc7\xca\x5a\xf9\x3d\x51\x75\x2e\x71\x8c\x60\x66\xec\xa1\x42\x6a\x87\xc2\x98\x08\x28\x1a\x85\xac\x7e\x0b\x40\x44\xff\x6e\x28\x0e\x28\x01\x4b\x93\x83\xd1\x9c\x9d\x38\x7d\x29\xdc\x14\xde\x43\x3d\xa2\x60\x78\x4a\x49\x44\xca\x76\xc2\xfe\x8a\x08\x0d\x09\x96\xd9\xa6\xc2\xa3\xd3\xa7\x07\x72\x80\xed\xce\xe0\x38\x9a\xa8\xe5\x36\x5d\x1d\x9b\x34\x6e\xca\x09\x47\xb0\xff\x52\x65\x94\x3c\xcf\x09\x93\x9a\x4b\x4a\x8f\x98\x5f\x6a\x5e\x72\x72\x3c\x79\x5d\xa0\xbc\x36\x0d\xce\x50\x1f\x67\x3a\xb6\xea\x84\x43\xf1\x29\x42\x79\x52\x45\x3e\xb7\x2b\x3a\x8d\x0d\x97\x6c\x27\x8c\x5b\xd1\xa9\x85\x3c\x91\x8e\x0c\x24\x0c\x3c\x73\x49\x32\x95\x3f\xdb\x50\x39\xfb\xb0\x46\x87\x93\x7c\x9f\xf0\xab\x74\xa1\x6e\xae\x21\x2b\xc6\xf2\x0e\x70\x0a\x77\xc0\x92\xd2\x3d\x2e\xfb\x58\x0e\x0c\x19\xd6\x5f\x30\x41\x29\xab\x8e\x6c\xc1\x2e\x58\x05\x22\x57\xba\x09\x44\x9f\x30\xd3\xd9\x74\x39\x1a\xff\xf5\x63\x3d\xef\x2f\x5c\x4e\xbd\x57\x3a\x9e\x44\x4b\xf3\xa3\xdd\xac\xed\xf0\x2c\x05\xf3\xcc\x2e\x75\x06\x64\xa8\x4a\x1d\x24\xc5\xd2\x8b\x49\x67\x0d\xe8\xa2\xf2\x09\x08\x39\x48\x3c\xa3\x89\x59\x99\x1a\x7d\x37\x27\xe2\x1a\x15\xe8\x20\x16\xc1\x5a\x09\xee\x71\xf4\xf4\x3c\x0a\x60\x8b\x48\x48\x5c\x99\x34\xa3\x86\x14\x79\x4d\x62\x91\xda\xa3\x9c\x01\xc4\x5d\x3d\xeb\xe5\x79\xb5\x82\x3b\xf3\x40\x64\x04\xb4\xc8\x0e\xe6\xff\x34\x2b\x46\xb3\x34\xb0\xb8\x83\xb4\x0b\xfd\x2f\x9a\x53\x59\x5a\xb6\x2f\xd1\x35\x1e\xbc\x88\x30\x83\x70\x49\x72\x18\xdf\xc9\x8c\xe0\x81\x40\x7d\xa8\x12\xa4\x6d\x64\x97\xd7\xaf\x9e\xc6\xd8\x3e\x1c\x60\xee\xb7\x12\xd8\x89\xdf\xbe\xd0\xc8\x05\xaa\x11\xcf\x81\x7d\xd8\xf0\x43\x96\xef\x87\x1a\x26\x11\x2d\xcb\x7c\x0e\x1d\x2e\x68"}, -{{0x61,0xfa,0x86,0x77,0xee,0xda,0xde,0xd6,0x9b,0x16,0x5c,0x8d,0x27,0x7c,0x97,0x82,0x49,0x66,0x30,0x28,0x30,0x1d,0xf6,0x16,0x3e,0x39,0xb0,0x6a,0xc2,0xf5,0x62,0x5f,},{0x87,0x33,0x9e,0xb5,0x72,0x38,0xdb,0x2e,0x4e,0x60,0xf3,0xc2,0x8a,0x3f,0xd5,0xfb,0x61,0x1c,0x65,0xfd,0xdc,0x81,0xee,0xd7,0xcf,0x77,0x71,0xdf,0x34,0xd9,0x22,0x67,},{0xc0,0x4e,0xbd,0x11,0xc3,0xeb,0x09,0x39,0x6f,0xe8,0xd6,0x82,0x79,0x51,0x0a,0x9e,0xfe,0xe3,0x91,0xab,0xee,0x40,0x81,0xf0,0xd2,0x75,0x67,0x4a,0x30,0x47,0x94,0x83,0x5a,0xad,0x7f,0x3e,0x34,0x5b,0xcf,0x0a,0xf8,0x02,0x7f,0x97,0x47,0x7e,0x79,0xe6,0x79,0x2b,0x8f,0x29,0x98,0x46,0xae,0x28,0xcb,0x13,0xbd,0x88,0x75,0x37,0x99,0x0d,},"\x02\xc5\x81\xde\xe0\x3f\x2c\x60\x39\x35\xaf\x5e\xce\xec\xfa\x67\x71\x34\xa3\xe0\xae\xa5\x4f\xec\xaf\x42\x71\xfb\x52\x95\x1a\x27\xb7\x68\x77\xcc\xd4\x9a\xb4\x86\xdf\xc2\x27\xcf\x31\xc9\xd9\x57\xcc\x97\x30\x65\x73\xfc\x7f\xe1\xd3\x1b\x6c\x7d\xf3\xd7\x80\xf3\xa0\x5c\xa6\x39\x56\x57\xa9\x42\x43\x42\xc9\xc6\xb7\x03\x12\x7e\x03\x8d\xf0\x79\x21\x54\xe3\x0a\x49\x47\x61\x12\xcb\x92\xd0\xd5\xa2\xd2\x2e\x89\x57\x52\xa8\x6e\xdd\xdd\x91\x2f\xdc\x81\xb1\xe6\x4a\x7b\xb7\x50\xf0\x99\x18\x21\x32\xee\x48\x23\xfd\xe8\x45\x80\x2a\x94\x45\x39\xd4\x12\xb2\xa8\x1a\x15\xb0\x00\x71\xa9\x50\x50\x4c\x5b\x55\xa7\x1b\xdb\x8c\x5a\x58\x26\x39\xe8\x55\xe8\xbe\x24\x1c\xda\x1b\xa6\xb3\xb4\xf6\x45\x54\xd1\x78\x24\x90\x4c\xb3\x0c\xd7\xef\xd9\xac\x04\x9e\x39\x0b\xb7\x9f\x53\x59\x8e\xf1\xe8\xfc\x27\xdd\x7b\xf5\x99\xc9\x02\x8c\x9e\xbf\x92\xfc\x3b\xe1\x1d\xf3\x29\x61\x2a\x22\x8e\x0f\x56\x84\x68\x7b\xf4\x1f\xf2\x03\xe9\x7a\x76\x86\x12\x6a\x39\x36\x6b\xdc\x26\xd5\x0b\xe0\x25\xd5\x18\x7c\x6b\xa0\x66\x6e\x37\x9b\xe4\xa8\x0a\x9e\x62\xef\xfc\xd9\x16\xd7\xf9\x8d\xe6\x51\xe0\x0b\x97\xad\xf5\xd2\xd5\x3d\xaa\x7f\x8d\x69\x5a\x29\x15\x60\x75\x5c\x74\x44\x82\x36\x4c\x4f\x1f\xa4\x7e\xc0\xb1\xda\x16\x1a\xa3\x88\xf9\x59\x79\x89\xa9\x77\x26\xd3\xed\x2c\xec\x82\xf1\xa1\xbb\xc4\xac\x0b\xe0\xa0\x0c\xb4\xa8\xdb\x1f\xb7\xc1\x4b\xa0\x5d\x89\x63\x48\xdc\x05\x59\xd2\xa9\x0b\xea\xc2\x04\x1d\xd7\x7f\x82\xd6\xb1\x2a\xeb\x22\x43\xca\x0f\x41\x9a\x57\xd3\xca\x9c\x7d\x25\xa3\x0f\xf0\xe8\xbb\x0d\x94\x51\x55\xd1\xb3\x6a\xd1\x07\xb5\x5b\xea\xa9\x5b\x7d\x5e\x32\x00\x34\x07\x62\x9f\x15\x15\xf8\xa7\x08\x9e\x24\x88\xd0\xd7\x54\x4c\x2f\x7c\xc7\xc7\xf0\x98\x5d\xa4\x28\x40\xd4\x36\x8f\xf4\xf0\xfa\x4f\xa2\x98\xe3\xb7\x22\x93\x03\xab\xa5\x14\xae\x94\xe7\x02\x65\x35\xa3\xf4\x26\xff\xbb\x4e\x00\x1c\xd5\x0e\xd1\x2f\x21\x4b\x3a\xbe\xf9\x6e\x30\x16\x35\xc9\x87\xb1\x33\xfc\x5e\x61\x84\xe7\xb7\x57\x2b\xc3\xd9\x9a\x45\x23\xcb\xd5\xaf\xe5\x93\xce\xdf\x4c\x9c\xd0\x2f\xf2\xe3\x62\x37\xe4\xee\x12\xef\x1a\x22\xd1\x6d\x7c\xf4\xc0\x72\xdc\xed\x91\xcd\xd2\x6e\xe1\x44\xcc\x2b\xef\x49\x50\x02\x63\x49\xe9\x44\x47\x84\x08\x1f\xe4\xe0\x49\x8b\xc7\x5f\x72\xe6\x81\x8f\x45\x9b\xba\x90\x49\xc5\x61\x31\x6c\x9f\x49\x8e\x7b\x1a\x99\x4b\x0e\x93\x05\x5f\xe7\x3e\x44\x4c\xbd\xf9\x6a\xc3\x5e\x9c\x4e\x92\xe6\xb4\x9e\x3b\xc0\xe9\x9d\xe1\x71\x6d\xf8\xea\xca\xeb\x8d\x2f\xd7\x48\x70\x04\x4c\xb3\x9c\x0e\x36\x7a\x1f\xe3\x2a\x9b\xb2\x97\x44\x16\x36\x4e\x73\x0d\x52\x48\xdf\xb1\xdf\x16\x4a\x8d\x58\xca\xa1\x00\x5f\xdc\x91\xba\xc2\xbc\x01\xcc\x77\xde\xcc\x14\x89\x3e\xf9\x46\xfb\x3c\x81\xbe\x08\x32\xc7\x2f\xba\x37\x20\x62\xf8\x36\x0f\x4d\x8e\x6d\x5b\x74\x1c\xf7\x03\x2d\x8d\x89\xde\x2e\xdf\x4c\x71\x4a\x29\xf7\x5a\xbd\x8f\x5f\xf4\x3e\xcd\xd4\xb7\xa0\x4d\x7d\xb0\x88\x2d\x16\xe7\x44\x73\xa0\xfb\x79\xdb\x44\x4a\x78\xea\x44\xaa\x26\x31\xb8\xc0\xd7\xb0\x30\x0d\x55\xcb\x6a\xc4\x85\xf2\x4c\x0a\xcc\x64\x77\x47\xc4\x3d\xb3\xb2\xa8\x67\x7b\xaf\x65\x6f\xa7\x35\xa5\x75\xf1\x81\x3f\x36\x68\xa2\xac\xa9\x17\x57\x11\xb5\x25\xeb\x49\x6e\x9e\xf9\x71\x1d\x75\xf5\x90\xc7\xd9\xef\x99\xe0\xf5\x9e\x84\x83\xcb\xf9\xf2\x84\xe3\xf5\xa3\x3e\xe7\x78\x1e\x62\xb8\xb0\x55\x51\x77\x7e\xfe\x0f\xbf\xd1\x9e\x54\xb6\xbb\xd1\x42\x94\x4b\xc2\x95\x9a\x82\xeb\xd2\x95\xd2\x3d\x34\x43\xb6\xce\x65\x8c\x2d\x57\x9a\x76\x37\xb5\x49\x52\x04\x91\x90\x8e\x34\x28\x2e\xc2\x71\x69\x72\xe6\xf0\x35\x39\x29\x54\x7e\xf1\x53\x7a\xec\xc9\x6b\x2d\xf6\x16\x14\x85\x99\xb0\x9d\x9b\x81\x39\x4a\x13\xfe\x7d\xb8\x67\x60\xb1\xe2\xa0\x60\xef\xd4\x84\xe8\x18\x99\x39\xeb\xdf\x6f\x21\x64\x0d\x89\xd8\xe7\x36\xde\xe0\x82\xad\x72\xa0\x18\x4a\xde\xdd\x8d\xf2\x14\x74\xc9\xf5\x26\xbc\xfd\xf7\xe8\x56\x58\x19\x4b\xb6\xd9\x42\xe7\xf3\xfe\x96\xc2\x3f"}, -{{0x70,0x48,0xc6,0x52,0x1a,0xef,0xaf,0xa4,0xea,0xc6,0xd6,0xc3,0xa7,0x02,0xb9,0x52,0x54,0x80,0xa6,0x64,0x82,0xe4,0x96,0x98,0x96,0x75,0x7f,0x2c,0xd1,0xac,0x7d,0x5b,},{0xed,0x93,0x11,0x3c,0x16,0x43,0xa5,0x3a,0xa0,0x64,0xca,0xa6,0x31,0xce,0xb6,0xe2,0x0f,0x6d,0x6e,0xc2,0xfc,0x6c,0x07,0x11,0xcb,0x8a,0x1f,0xe7,0x31,0x39,0xaf,0x93,},{0x7c,0x45,0x70,0x3e,0xd3,0x94,0x2e,0x44,0x04,0x1c,0x7f,0xa1,0x85,0x8a,0xa5,0xf1,0xdc,0x38,0x1f,0x49,0x3a,0x45,0x2d,0xfb,0x52,0x70,0x80,0x17,0x89,0x8f,0x71,0x0e,0x31,0x11,0x8e,0x33,0x1f,0x00,0xaa,0x64,0xcb,0x73,0x88,0x36,0x68,0x2b,0x7d,0x17,0x7e,0x97,0x95,0x5c,0x00,0x31,0x9a,0xbd,0x79,0xa4,0x9e,0x0f,0xcd,0x16,0xfe,0x00,},"\x53\xf7\x4c\x72\x4d\xb1\x57\x8a\x1a\x29\x6a\x7c\xca\xc9\x04\xa2\x50\x4d\xd9\x00\x53\x89\xb4\xf8\xd4\xea\x4b\x63\x07\x29\x8f\xc6\xdc\xce\x98\xa6\xbc\x07\x28\x0d\x20\x36\x4e\x40\x5a\x46\x7e\x73\x65\x78\x96\x52\x69\xc8\x14\x61\xd6\x1f\xc6\xb7\xe4\xba\xd6\x8d\x2b\x6d\xd0\x00\x58\x50\x10\x5f\x0a\x67\xbb\xc6\xee\x22\x3e\xc1\x75\x4a\xf4\xe3\xb9\xaf\xa5\x06\x2d\x1c\x18\x61\x04\x8f\x18\x5b\x12\x8f\x1a\x5c\x0f\xb2\x5c\x39\x19\xb4\x83\x3e\x29\xe2\x02\xbc\x94\x1a\x90\x5e\x63\xc2\xc0\x5b\x10\x14\x64\x7b\xd7\xed\xe5\xbe\x9f\x99\x66\x15\x18\x7a\x3d\x3b\xb2\xc7\xdc\x4c\x28\xf7\x05\x3d\xef\x9b\x28\xb2\x9e\x23\x31\xf1\x62\x96\xdc\xe8\xf1\xed\xe4\x84\xca\xec\x99\x67\x02\xbd\x99\x02\xe5\x26\x84\xc8\x12\xc8\x74\x40\xf6\x9b\xd1\x41\xc7\xe0\x0c\x69\x47\xd1\xfc\x7c\x3b\xdc\x0b\xc5\x50\x6b\x6e\xa4\x62\xe6\x5f\x9e\x74\x3b\x72\xc0\x07\xdd\xc7\xa3\x77\x49\x37\x77\xd4\xeb\x12\x62\x0c\xa6\xc0\x19\xc8\xbf\xc4\xc2\x9e\xc8\xaf\x38\x2f\xc3\xea\xc8\x41\x02\x1a\x74\xe4\x67\x4b\xa3\xe4\x3e\x5d\x7b\x41\xe3\xfe\xeb\x17\xda\x00\xa7\xce\x45\x5a\x1c\xec\x70\xb0\xbe\x6e\x56\xf8\x5f\xc3\x7f\x64\xcf\x07\x33\xb7\xe3\x12\x41\xde\x64\x1a\x8a\x8e\x5b\x91\x89\x7b\xc1\x58\xfe\x93\xd1\x02\xc0\x1d\x1f\x5e\x16\x6d\x40\x81\x65\xfe\x3f\xcb\x13\xd5\x30\x45\x90\xab\x8e\xf0\xdc\x8d\x5a\x8c\x1d\x8a\x93\xfc\xeb\x85\x4f\xc1\xfa\x36\xd0\xcc\x48\x0c\xf8\x51\x2d\x80\xbe\xe6\x9b\x06\x50\xa9\x57\xda\xed\x28\x3c\xd7\x63\x81\x55\xed\x77\x30\x86\xe8\x6a\x8f\xfb\x19\x8a\xcc\x74\x23\xb5\xd1\xa6\x09\xa1\x75\xa5\x6b\x94\xc9\x6b\x73\x18\x51\xb9\x3a\x94\x97\x71\x01\xe2\x55\xf1\xce\x92\xe2\x32\xa0\x5e\x2e\x33\x87\xfc\xb4\xdc\x13\xa3\x1b\xee\x6e\xe2\x55\x07\x32\x2c\x73\xc9\x88\x30\x80\xa7\x4c\x00\xf8\x03\xa9\x98\xdd\x53\x0a\x79\x12\x6b\xb1\x44\xed\x55\x74\xc4\xb2\x31\x80\xe3\x4e\x09\x92\x83\xb4\xbb\x1d\x28\x82\x2f\xce\x37\x17\x04\x6f\xf3\x2e\xf9\xe2\xcd\xf9\x67\xe3\x18\xea\x72\x6a\x2a\xee\xc5\x78\x06\x64\x3a\xd4\x80\x1d\x3e\x0d\xa5\x2a\x1d\x77\xbf\x04\x3f\x5a\xe9\xf3\xae\xa9\xe4\xbc\x4f\xa7\x95\xd0\x84\x01\x08\x5c\xa9\x4c\xfc\x4c\xe7\x19\xda\xbc\x7b\x23\x90\xd0\x3d\x29\x4a\x65\xb7\xaf\x9b\xc3\x90\x72\x28\x5b\x77\x7b\x2f\x13\x3d\xc1\x1a\x70\xc0\xa9\xf0\x60\xe1\x04\x41\xf4\x02\x16\xac\xb6\x41\x63\x7a\x2e\xad\xf1\xf7\xb8\xd2\x62\xfe\xc1\xb4\xd0\xf0\xf4\xfa\xa9\x3f\x3f\x73\x2c\xac\x38\x2d\x8a\xc4\x2e\x17\x8e\x22\x44\x99\x9d\x76\x4a\x9d\x0e\x98\x17\x14\x68\x6e\xb4\x92\x44\x97\xe5\x6b\x50\x15\x7e\x99\x39\x03\x2c\x9f\x88\xeb\x65\x7c\xfd\xe4\x4a\xd3\x47\x14\xaf\x4a\x51\x32\x4e\x5e\x77\xd0\xde\xea\x99\xc9\xf2\x44\xd2\xe0\x9e\xa4\x25\x82\x0a\x74\x6d\x88\x3a\x0c\xf4\xb7\x05\xc2\x9d\xf8\xc0\x37\x44\x81\x54\xdc\x08\xa4\xd4\x33\x74\x05\xfb\x87\x65\x82\x31\x14\x37\x0b\x37\xed\x86\x08\x6e\xc5\xf8\xbd\x6c\x72\xab\xf1\x3f\x51\x84\x30\x71\x0f\x59\x7b\x06\x10\x8f\x65\xb3\x0a\x48\x34\x96\xe2\xed\x81\xda\xb1\x0f\xee\x94\x7f\xe0\x4b\x54\x85\xf2\xe3\x07\x40\x49\xd2\x22\x84\x26\x66\x51\xad\x10\xdd\x08\x6a\xaa\x5d\x45\x2e\x0d\x1a\x61\x12\x9d\x1e\x77\xc6\x63\xc2\x6d\x08\x89\x62\xb5\x54\x56\x45\xb7\xa1\xa8\x71\x3d\x51\x32\x7a\x7a\x35\x9b\x12\xda\xad\xb8\x5a\x2c\xd4\xb5\x41\x0d\x5c\x20\x26\x7f\xa7\x66\xb8\xc4\x2a\x84\xdc\x42\x66\x45\x88\x87\x9b\x3e\xae\xfd\x4c\xc8\xdc\x69\x3f\x98\xac\x20\x56\x09\xe5\x70\x66\x5b\x01\xea\x46\x55\xe3\x94\x29\xa7\xa7\xe5\x42\xef\xb4\xf7\x89\x0d\xbf\x4e\x34\xc6\xcf\xf0\x7e\x4d\x35\xbd\x3e\xee\xdf\x5b\x46\x28\x0f\x4a\x0d\xa0\xc2\xe7\x3c\x94\xea\x81\xcf\xea\xe7\xf9\xbd\x04\xfe\x2d\x45\x97\x65\x00\xf7\xdc\xac\xb0\xdf\x2a\x5d\xc7\x36\xa8\x23\x67\x1d\xb6\x79\xbe\x66\xcb\x33\xc1\x62\xfd\x2c\x74\xae\x71\xfb\xf4\xd2\xb0\x5a\xf0\x42\xb3\xa9\x77\xf5\xb9\x44\xb9\xfd\xb6\xc3\x44\x24\x42\x1b\xcf\x4f\x62\x23\x76\x84\x28\xfa\x14\x0f\xd4"}, -{{0x3e,0x63,0x73,0xb2,0x65,0xb9,0x67,0x89,0x00,0x7a,0xd2,0xa1,0x0c,0x30,0x9a,0x56,0x76,0x38,0xf2,0x55,0x87,0xd7,0x7e,0x28,0xb0,0x82,0x3a,0x4f,0x17,0x9a,0xe4,0xfe,},{0xa3,0x23,0x4e,0x5d,0x13,0xb0,0x34,0x72,0x16,0x50,0x36,0x40,0x4f,0x6d,0xe8,0x0e,0x70,0x28,0x39,0x50,0x0f,0x13,0xd9,0xc9,0x85,0xa0,0x77,0xd4,0x5c,0x69,0xff,0x45,},{0xf5,0x1e,0x0f,0x87,0x8a,0x5a,0x70,0x96,0x47,0xe8,0x5f,0xea,0x83,0x9f,0xd5,0x66,0xe6,0xf3,0x5c,0x8a,0x61,0x85,0xd0,0xc9,0xeb,0x13,0xe0,0xd5,0xb9,0xe6,0xe8,0xaa,0x95,0xc3,0x33,0xa8,0xf5,0x06,0x32,0xa4,0xd6,0x65,0x7b,0x51,0x8c,0xe4,0xcf,0xde,0x40,0xb8,0xf5,0xa0,0x5b,0x2d,0x9f,0x84,0x41,0xfc,0xc9,0xd2,0xd6,0x92,0xd5,0x09,},"\xb9\xd0\x68\xbb\xca\xe7\x72\x2f\x82\x8b\x0f\x8c\x98\xa7\x38\xe3\x6a\x7d\xf4\xc9\x97\xc7\x24\xba\x27\x53\x1a\xf3\x4a\x2f\x10\x6c\x75\x13\xa4\x4a\x46\x1a\x9a\xa4\x30\x9b\xc1\x5c\x4e\x0d\x42\x75\x91\x93\xea\x1c\xde\xa9\x56\xbb\x81\x59\x85\xf5\x78\x67\x14\x5e\x9e\x2c\x75\x85\xfc\x8d\x61\x02\x7e\x47\xd2\xd7\x35\xe2\x44\x8a\xf3\x78\x29\x09\x40\x4e\xde\xaa\xc0\xfd\x73\xf6\x04\x5d\xcd\xb0\x4f\x03\x77\x75\x8f\x02\x20\x4a\xae\x3a\x72\x20\x31\x1c\x0f\x47\x23\x58\x27\x10\xcc\x44\x0c\x36\xc9\x58\x7b\x5c\x9e\xbc\x40\x63\xfe\xa8\xca\x3f\x43\x19\x58\x94\xf7\x9a\x36\x50\x87\x13\x72\x82\x30\x2d\xbf\x2e\x7a\x0d\x41\x1a\xb5\x8b\x70\x26\xcc\xde\x19\x88\x69\xaa\x73\x43\x34\xc0\x52\x38\xe2\x75\xe3\xc3\xab\x21\x70\x83\x49\x57\x69\xe2\xfa\xd3\x74\x05\x14\x52\xd7\xf5\xb1\xdb\x0e\x78\x58\x36\xd4\xbd\x5e\x29\x78\xa3\xe9\x91\xaf\x0f\xf7\x16\xf4\x38\x89\xa0\x7f\x5d\xf2\x99\x60\x36\x21\xc3\x9e\x2c\xde\xe0\x89\x98\x5d\x9e\x6b\xf7\xb2\xfb\xd0\x23\x73\xae\x1b\x5e\x9b\x88\xf5\xb5\x4a\x07\x6e\x67\x6d\x77\x90\xbf\xc8\xf5\x7d\xcc\x59\xef\x52\x85\x0c\xe9\x92\xa7\x3b\xa7\xbc\x99\x1d\xeb\x4d\xde\x5e\xb0\xb2\x16\x70\xb1\xb3\xd4\xb6\x4f\x36\xcc\xa8\xe3\x07\x09\x85\x68\x49\x7d\x89\x16\xf6\xb5\xd0\xe9\xe8\x9f\x99\xf8\x60\x06\xf3\x9b\xd3\xa8\x10\x76\x9c\x8f\x78\x01\x77\x3c\x96\x38\xab\xcf\x5e\x27\x11\xb1\x9d\x11\x67\x59\x3a\xcb\xe8\x5e\x41\x61\x42\x89\x97\xa2\x19\x4d\xc5\xe7\xb7\x64\x0f\x0d\x2c\x1e\xb2\x05\x55\x3b\xe9\x16\x7f\xfb\xc2\x2b\x7c\x2e\x76\x98\xf3\xaf\xa1\x07\x54\xcb\x44\xd4\xb1\xd4\x5b\x83\x73\x03\xb1\x66\x90\x73\x41\x5a\x22\x60\x6b\x50\xf2\x1f\x82\x65\xe1\x39\xf2\x30\x5a\xc0\xe0\x12\x7a\xe0\x56\xce\x8a\xbe\xab\xa2\x0e\x1d\x26\x9a\x2b\x2e\x89\x9c\x49\x54\x72\x68\xa0\x69\x6a\xe4\x50\xdc\x02\x67\xf7\xf6\x3a\x8e\xdf\x07\x4c\x47\xd3\xc2\xdb\x1d\xa3\x63\x93\x73\x73\x04\xe6\xdd\x4f\xac\xcd\xb6\xab\x55\xe5\xf8\x52\x0c\x3d\xff\x5f\x6b\xea\xc3\x0b\xa8\x5b\x86\x08\x23\x51\xe3\xde\xd8\x40\x0a\xa5\x7f\x65\x0c\x0c\x33\x03\x6d\x65\xb3\x9b\x7d\x2f\xb6\x11\x28\x63\xd5\x9b\x72\x55\x82\x42\xe8\xb0\x45\xad\xdd\x35\x7d\xe6\xfd\x37\xa8\xf6\x61\x17\x65\xc9\xb5\xff\x19\xcc\x4d\xb7\xe1\x17\xc6\x5a\x00\x45\x89\x08\xb0\x24\x5d\x04\xf7\x90\x8f\xc7\x3b\x16\x5d\xff\x6e\x4b\xe4\xb4\x20\x32\xd8\xcf\xd7\xd6\xf7\x77\x2c\x1b\xfe\x72\x1d\x4b\xcf\xe2\xfc\x52\x79\x98\xf3\x4f\xb4\x41\x8a\x1f\xae\x1e\x6c\x37\x67\xc4\xd0\x78\x06\x21\xf9\x23\xda\x1f\x0a\x0d\x3d\x21\x9c\x03\x6a\xcf\xd3\x70\x9d\xad\x4c\xf2\x4d\x90\xbc\x69\x1d\x70\x0e\x6a\x9c\x80\xcc\xfd\x10\xbd\xe8\xe7\x91\xc0\xfe\xa8\x28\x80\xc0\x7b\xaa\xaa\x31\x1e\xef\x79\x24\x07\x84\xf6\x28\xa7\xd2\xa0\x91\x84\xe0\x16\xf8\x10\x08\xe7\x74\x29\xa8\x65\x8b\x15\x3e\x44\xe7\x9a\x98\xad\x24\x8f\x7f\xda\x23\xb5\x90\xd6\x46\xd7\xc1\xd8\x41\xf4\x92\x7d\x6e\x8b\xc7\x32\x14\xd1\x0a\x7f\x3c\x29\xc8\xf8\x39\xa8\x90\x8d\x20\xa7\x4e\x82\x7a\xf4\x67\xac\x5a\xbf\x0f\x1d\x0e\xd3\x9c\xdd\xd9\x69\xdd\xe9\xee\xb4\xa4\xb7\x52\x7a\xb3\xe2\x47\x5a\x19\x5e\x24\x47\x4a\x4e\x36\xb0\x90\x52\xe2\xda\xd4\xa5\xeb\x46\x91\xe2\x63\xb8\xc6\x1b\xbd\xe8\x77\x72\x20\x7e\x01\x1c\x4c\x1e\x14\x23\x5f\xb2\x4e\x4d\xa4\x38\x87\x5d\x18\x53\x0f\xef\x90\x26\x19\xdd\x48\x5d\x77\xb5\x45\xab\xb5\x6b\x69\xc7\x55\xaf\xe7\x58\x60\x69\x71\xab\x97\xdd\x3a\xce\x1c\x1a\x34\xa3\x37\x94\xc8\x15\x6d\xa7\x99\xe8\x22\x4d\x88\x5e\x18\x68\xf9\xcb\x46\x6d\x80\x2c\x82\x7c\xc3\xe1\xec\xd0\xae\x6e\x0b\x01\xf8\xf7\x91\xb1\x22\x08\xfc\xc0\xfe\xd3\x85\xb7\x96\xeb\x2f\x29\x08\xb5\x8d\x30\xb3\x73\x3f\x14\x70\xf2\xe2\xef\x12\xad\x43\xfe\xb7\x2d\x08\x16\xde\x3c\x13\xa8\xb5\xa5\x23\xe1\x4c\xdf\x5f\xf3\x72\x0b\xf8\x77\x69\xcd\xe7\x49\x5d\x22\x6b\xf3\x82\x38\xa8\x25\xf7\x5a\x09\xf6\xbb\x9a\xfc\xe5\x16\xa7\xbc\x70\x11\x43\x70\xbb\xc4\x0f\x17\xc7\xbc"}, -{{0xf5,0xe8,0x59,0x7e,0xac,0x0e,0xbf,0xa9,0xd3,0x85,0xde,0x85,0xa1,0xfb,0xaa,0x35,0x14,0x63,0x95,0xb1,0x34,0x57,0xb5,0xb1,0x4d,0x36,0x70,0xda,0xca,0x69,0x05,0xe7,},{0xce,0x93,0xe6,0x42,0xc2,0xf1,0x50,0x84,0xbc,0x83,0xba,0xfd,0xaa,0x19,0x67,0x63,0xde,0x2a,0x3c,0x51,0x3b,0x0e,0x44,0xf6,0x8d,0xdb,0xde,0x37,0x85,0x14,0xc4,0x41,},{0x57,0x65,0x43,0xfc,0x21,0xab,0x0a,0x7c,0x5f,0x63,0xb1,0xcf,0xf0,0x1b,0xf8,0x45,0xdf,0x91,0x79,0x2e,0x7a,0x97,0x50,0xc5,0x50,0x8b,0x51,0x66,0x5e,0x7f,0x89,0xf1,0x7c,0x6e,0xc3,0x35,0x5a,0x0a,0xed,0x87,0xdb,0x8c,0x77,0xbd,0xb2,0x71,0xfb,0xed,0xc7,0x14,0xff,0xad,0xb7,0x8b,0x5e,0x0f,0x97,0x81,0x16,0x77,0x1b,0xa7,0xcf,0x0b,},"\x27\x33\x41\xf2\x19\xff\x5c\xf3\x81\xc7\x7b\x2d\xd2\x26\xc5\x8f\x8f\x33\xc4\x52\x70\x48\xcb\x00\x6a\xff\xef\x8c\xee\x15\x1e\x30\x0e\xfe\xf6\x29\xfe\xd2\x1b\x70\x45\x1f\x72\x92\x92\x62\x7d\x1f\x3f\x1b\x52\x57\x35\x9e\xe5\xa6\x71\xcf\x62\xae\x57\x32\x49\x40\xf2\xd0\xb1\x5a\xac\x76\xff\x39\x82\x20\xc0\x80\x24\xe2\x9a\x8c\xf3\x65\x04\xe1\x2a\x4e\x96\x43\x8f\x42\xc3\xda\x0c\x00\x05\x41\xbc\x11\xf0\x91\x38\x1b\x0b\x72\xb5\x8a\x92\x08\x3f\x44\x6e\xca\x19\x91\x99\x68\x78\xde\x35\x08\x1c\xc4\xab\x90\x95\x8c\x96\xcf\x5c\x99\x79\x6c\xba\x79\x51\xee\x18\x6f\x26\x52\x7a\xed\xe6\x9d\xb3\x04\xce\x29\x41\xba\x15\xcc\x00\xba\x2f\x14\x11\xf2\x08\xda\xd4\x5e\x87\xbc\xf6\x38\x79\x2d\xe0\xa6\x86\x24\xb6\x67\x29\x7c\x27\xa3\x43\xdb\x4b\xaf\x34\xa0\x22\x8e\xaf\x0d\x10\x22\x00\x9b\x5d\x06\x8b\x25\x34\xd9\x20\x30\x2e\x71\x31\x0f\xeb\xf0\xdf\x1b\xb0\x2c\x2e\xf0\xad\x1a\xe1\x49\xde\xad\xf8\xc1\x84\x37\x3c\x0f\x7e\xb6\xb2\x56\x95\xbe\x82\xd1\x2c\x71\xb6\xc8\x32\x67\xd9\xa2\x33\x66\x7e\x77\xbc\x20\x59\x83\xf8\xb8\xd8\x77\xd8\x5a\xea\xd3\xf6\x0e\x82\x0f\xfc\xb1\x7a\xdd\xdd\x92\xa7\x71\x2b\xbe\xb3\x4e\xe7\x19\x66\xda\xfd\x99\x07\xd1\x93\xdd\x9d\x72\x5a\x31\xa6\x13\xd2\x9e\x32\xbe\x72\x13\x28\x08\x92\x6d\x94\x37\x47\x7f\xee\x25\xed\xa6\x10\xae\xb1\xdc\xe1\x2e\xa3\x16\xc6\xae\xc6\x68\x9e\x50\x1c\x55\x19\x23\x82\x5a\x34\xb4\x2c\x4f\x06\x75\xb8\x6a\xb2\x6a\xde\xea\x2e\x60\xda\xe6\xc6\xd1\xcd\xd0\xcb\x3c\x34\x7b\x16\x38\x40\x39\xa8\xe3\xfd\x60\x87\x38\x13\x87\xcb\x4b\xc7\x2d\xdb\x5f\x25\xb3\x74\x85\x9b\x02\xe5\xbb\x1b\xa0\x6d\x3c\xc6\x9e\xc4\x4c\xec\x4b\x98\x5c\x84\x76\xe3\x50\x32\xe9\x9a\xbf\x00\x1a\x1d\x44\xdd\xc6\xe2\x88\x9c\x3c\x2c\x3e\xca\xce\xd6\x09\xb2\xb2\x68\x0e\x00\xb1\xef\xa7\xe9\xd2\x6d\x62\xf2\xb3\xab\x36\xf9\x21\x04\x47\x90\xab\xbd\x49\x36\x07\x56\xdc\xff\xcc\xf2\x30\xf6\x6d\xbb\x70\x1a\xa1\x64\xda\xd6\x06\x9a\xa2\xb8\xb3\x30\x9f\x2f\xe4\x4d\x5e\x0b\x25\xbd\x55\x64\x31\xf0\xdf\x4c\x2e\xa9\x7a\xe7\x9e\xd4\xa5\x75\x78\xd6\x6f\xc6\x93\x9c\x57\x62\x8a\x90\xca\xc9\x7a\xdf\xa8\x70\x2a\x4a\x1c\x89\x65\xba\x1a\x90\x26\x25\x67\x28\x66\x64\x00\x30\x03\x53\x3c\xc9\x31\x4c\xaf\x7d\x3b\x98\x2e\x0a\x43\x2f\xf5\xaa\x4e\xd5\x74\x19\x83\xd9\xb5\x43\x23\xac\x7e\x29\x9b\x2b\x49\x56\xc1\xa2\xc1\x91\x55\x7b\x27\xd8\x6b\xe7\x14\xb5\xb6\x8f\xcb\x1d\x41\xf7\x8c\xa5\xdd\xb6\xb5\x3b\x3d\xfc\x8e\x7d\x6b\x3c\x3d\xb0\x59\xaf\x9f\x2d\xd7\x65\xef\x04\xb6\xd1\x6e\x67\x37\xc7\x27\xaa\x11\xf3\xdf\x37\x74\xa3\xfc\x96\x18\x2e\x28\x2a\xcc\x3d\x23\x3e\xea\xbf\x8c\x72\xd3\xf2\x46\xae\x18\x45\x05\x28\x8f\xef\x39\xb3\x67\x66\xb1\x0d\xd1\xbf\xbf\xbf\xa7\x0f\x97\xb3\xc9\x01\x72\x6d\x1e\x0d\x0a\x83\x7d\x11\xf0\x12\x3a\x34\xab\xad\x1a\x79\xaa\xbe\x80\xb1\x25\xb1\x28\xee\x16\x0b\x51\x18\x48\xf7\xf0\x4c\x49\xc8\xd5\xc2\xf2\x04\x1d\xa7\xd9\x59\x9c\x29\xb1\xda\xc8\xc6\x80\x77\xef\xac\x3e\xca\x58\xbb\xc1\x63\x7a\xad\xce\x21\xc7\x74\xfe\xa4\x2d\x2b\xcf\x4a\x0b\x98\x92\x30\x7e\x36\xfa\x25\x0a\xce\xe7\x95\xad\x2b\xfe\xcf\xbf\x60\x31\x9b\x81\x66\x3e\x2a\x26\x57\x19\x46\xf7\x5a\x8d\x96\x9a\xf1\x6b\x3b\x57\xc3\xec\x3e\x66\x15\x8a\xaf\x42\xcc\xf5\xe5\x8b\x93\x7a\xae\xf6\x13\x31\x86\x06\x60\x33\x17\xe5\xaa\x31\x8b\xe7\x0f\x8d\xa3\xc0\xc1\x6b\xe6\xc2\x9e\x3e\xc9\xfe\xf4\xe4\x6e\x8c\xa2\x41\xd9\x41\xd5\x80\x49\xa0\x63\xd9\x0a\xfc\x95\x3c\xa3\x2e\x8a\x50\xa6\x47\x36\x32\x58\x8a\xc4\x1e\xae\x97\xf2\x0c\xe9\xb7\x41\xed\x41\xc9\xa4\xaa\x65\x51\xfd\x82\x3c\xe0\xc8\x11\xa5\xbb\x5a\x17\x1c\x1e\xa4\x23\x8a\x02\x46\x81\x1e\x46\x9c\xf4\x98\xb7\x96\x21\xc3\x23\xeb\xa7\x98\x53\x44\xfe\x11\xe6\x74\x99\xed\xf4\x96\x74\x91\xaa\x74\x9f\x8f\x3f\xe3\x99\x61\xd7\x68\x92\xc9\x3a\xac\x3b\x19\xfa\x4b\x4f\xc1\x74\xd7\xd4\xd4\xd8\xbd\x6e\xe4\x75\x47\x50\x08"}, -{{0xcd,0xad,0xc5,0xb8,0x9c,0xb2,0xb6,0x30,0x8a,0x00,0x6f,0x2f,0x4e,0x95,0x5a,0x91,0xaa,0xf3,0xba,0x70,0x16,0x5f,0x2d,0x44,0x4e,0xf1,0xff,0xeb,0xbd,0xaa,0xa2,0x21,},{0x05,0x41,0x41,0x5f,0xf5,0x46,0x7f,0x28,0xce,0xac,0x83,0x9b,0x13,0xa1,0x76,0x6e,0x72,0xc9,0x9e,0x65,0x45,0x20,0x7d,0x9d,0x5d,0x96,0x97,0x41,0x1e,0xb6,0xbc,0xa7,},{0xff,0xed,0xe7,0x01,0xeb,0x18,0x29,0xce,0x23,0x61,0xcd,0xa2,0xc8,0xbb,0x63,0x33,0x85,0x39,0xd8,0xad,0x2f,0x66,0x77,0x58,0x55,0x31,0xe7,0xbf,0x1d,0x39,0x22,0x38,0x26,0x79,0xa1,0xae,0x84,0xff,0xeb,0x75,0x3f,0xc9,0x75,0x4e,0x50,0xc0,0x18,0x52,0xf9,0x55,0xe3,0xfd,0x60,0x9f,0xf6,0x4b,0xf0,0x5b,0xbe,0x70,0x75,0xcd,0xbe,0x00,},"\x91\x17\x27\x03\x6d\xb3\x09\xd6\xe2\xe3\x36\x9e\x4f\x17\xd9\x8d\x99\xec\x07\x0c\x33\x28\x3b\xb1\x24\x4e\xfd\x62\xe7\x6b\xd7\x0a\x69\xb9\x72\x3b\xd2\xb5\x20\x47\x2b\x98\xaa\x06\x59\x24\x36\x6d\xe7\x80\x90\x0b\xcd\x8b\x77\xb5\x0f\x87\xc3\xc3\x61\x87\x02\x4b\xbc\x59\xcc\xf4\x48\x2c\x7b\x4a\xad\xb5\x6e\x2e\x5e\xcc\x00\x03\xd9\x89\xd6\xaf\xc6\x3e\xc1\x02\x42\xe5\x74\x82\xfe\x39\x21\x52\x61\xd5\xfc\x95\xa0\x18\x5f\x95\xe9\x54\x0c\x55\xf7\x4d\x69\x60\x48\xbc\xa7\xab\x11\x26\x81\xa5\x55\x8e\xa9\x3c\x3b\x1f\x1c\xd3\x64\x65\x9e\x94\x33\xce\xee\xbe\x05\x4e\xe7\x13\xc4\x77\x60\xd7\xad\x13\x2a\x7f\x3f\x8f\xe3\xd5\x04\x1b\x81\x1a\x26\xb6\x5e\xfb\x1f\x34\x0e\x18\x1a\x4e\xc7\x20\xea\x13\x6b\x3a\xf3\xd9\xe5\x46\x1d\xd2\x43\x70\x33\x6f\x10\xe6\x35\x4c\x8c\x17\xac\xf9\x99\x85\x44\xce\xc0\x87\x3e\xfa\x68\x7c\xb1\x32\xae\xcf\x70\xae\xbb\xc5\x67\xba\x03\xc5\x36\x49\x9e\xf9\x6c\xc8\x41\x2e\x7a\xaa\xd5\xbf\x96\x42\x2b\xe4\x7c\xb9\x41\x36\x45\xdf\x2c\x17\x03\x19\x23\x47\xdc\xbb\x12\x31\x27\x45\x59\x71\xae\x15\x7e\x9f\xa2\xdb\xff\x88\x74\x5a\x96\xc6\x58\xb8\x65\xe4\x1f\x55\xae\xbf\x98\x39\x50\x05\xdd\xcb\xd5\x98\x3e\x6a\xe0\x2c\x4f\xbb\x5e\x17\x91\x67\x96\x32\x5f\x76\xed\xf5\xb6\x4a\xfa\x4e\xc5\xa7\x41\x8a\xfe\xd2\x3a\x97\xef\xad\xe6\x8b\x6a\x5b\x31\x45\xf0\x8a\x5d\x3d\xb9\xc2\x98\xa5\x12\xfa\xbd\xac\x68\x56\x2b\x3f\x55\x37\x7f\xf4\x4b\x00\xc1\xc2\xf3\xef\xd1\x81\x32\xda\x71\xf9\x71\xa9\x53\xa9\x31\x8c\x57\x52\x33\x61\xa1\x60\xf9\xb7\xe3\xb5\x1c\x52\x4e\x95\xdd\x5e\xf4\x56\x8e\xf1\x8a\x80\x07\x75\xe9\xd2\x6e\x07\x13\x19\x42\xd2\xbe\x4e\xf2\x2c\x0c\xbc\x13\xdf\x01\xc6\x8b\x1b\xcd\x3b\xce\x9b\xd5\x1c\x4c\xed\x65\x2a\xdc\x40\x07\xbe\x43\xb3\x7c\x67\xa5\xc5\x5e\xd4\x02\x9e\x8a\xd1\x5d\xef\x83\x05\xc9\x68\x62\x1a\xed\x4c\xd4\xbf\xe0\x79\xa6\xf4\x88\x84\xd8\x56\x80\x39\x2c\xa9\x2b\xa6\xe1\x2f\xea\x6f\x4a\x05\x6f\x79\xd6\x7b\x19\xb0\x5f\x90\xd6\x84\xbe\x7d\x45\x72\x5f\x79\x67\xc6\xa4\x67\xaf\x43\xb8\x6a\x6b\x1b\x9d\x9e\xed\x3a\x42\x48\x97\x1c\x76\xa7\xac\x29\xc2\x92\xdf\xba\x4d\x75\xc5\xf7\xba\x70\x9a\x39\x05\x8e\x96\xad\xf6\xdb\xd7\x60\xd3\xce\xf4\x02\x4b\xf3\xed\xc4\x41\xef\xbf\x11\x47\xa2\xc1\x08\xbd\x6f\x9e\xb4\x39\xc1\xc5\xc4\xd3\xa6\xea\x4e\xc3\xd9\x2c\xef\x38\x13\x61\x88\xbe\xc9\xe0\xb6\xc0\x51\x8d\x8b\x79\xba\x59\xc5\xdc\xba\x39\x3a\xed\xfd\xff\xb0\xb7\x0d\x77\x9c\x2b\x97\x65\xce\x44\x52\xe7\xe3\xb0\x8c\x44\x02\xb1\xa6\x08\x32\x08\x40\xfb\xe9\x6d\x1e\xb8\x65\x6e\xb1\xc2\x0d\x95\x51\xdd\xf5\x33\xb9\xf1\x5e\x4e\xb5\x78\x37\x56\xc5\x3d\xdd\x3b\x14\xd8\x07\xf8\x38\xac\x96\x80\xf8\x9f\x1a\xdf\xb7\x8d\x68\xcc\xb0\x67\x31\xa9\x0b\xea\xc5\xf0\xd7\x09\xd5\xb8\x8c\x75\x43\x7a\x66\x3c\xb9\x62\xd3\x7f\x96\xb8\xe8\x92\x84\x77\xb5\x61\x12\x28\x01\x5d\x33\x7f\x04\x9e\x8b\x62\xe4\xdf\xf8\xd0\xbb\x6c\xda\x24\xa5\xdf\x90\x83\xe3\x48\xbe\xf1\x25\x85\xf5\xf4\xc4\xd3\xbb\x3c\x7e\x78\xd5\x50\x19\x4a\x45\x25\x1a\x08\x79\xa1\x62\x4b\xf9\xdd\x35\xeb\x65\x5c\x39\x39\xfe\xa8\x90\x9f\x6d\xf3\x95\xbe\xbd\x02\xb6\x8a\x17\xa8\x97\xc9\xaa\xdd\xd6\xe2\xe2\x04\x61\xe3\x03\xf5\x7c\xde\xb0\x0a\xe0\xf2\x3e\x60\xa9\x4c\x19\xc7\x71\xd8\xaa\x60\x53\x3b\x93\xce\xdc\x1b\x76\xd2\x29\x0a\x01\xbf\x43\xb2\x72\x5f\x12\x5b\xef\xa5\x75\x15\x4e\x98\x6c\x9c\x62\x05\xa1\x59\x6c\xba\xa2\xd1\x34\x70\xc2\x34\x22\xf2\xdf\x7b\xec\xe4\xe6\xeb\xd7\x52\xe9\x38\x9a\xe6\x08\x57\xb5\x29\x69\xd2\xdd\xef\xa9\xc0\x34\xf1\xbf\x35\xae\x33\x16\x30\x4e\x94\x9c\x89\x90\x82\x0e\x26\xe6\xcf\xfa\xe4\xb3\x88\xd1\x50\x5f\x92\x37\x06\x29\x7f\x8d\xb5\x56\x53\x79\x19\xeb\xbe\x30\x86\x02\x3f\x12\xf4\xde\xd3\xb1\x1a\xcf\x2a\x6d\x97\x3d\xdd\x8e\xb2\x7b\x07\xc5\x80\xbf\x44\x8c\xaa\x5a\x2e\xa1\x16\xc5\xea\xf3\x6f\x7a\x6b\x17\xa8\x5b\x39\x55\xdc\x8a\x44\xa6\x20\xd8"}, -{{0x2d,0xdd,0x79,0xe7,0x60,0x64,0xc2,0xe6,0xb3,0x22,0xaf,0xb0,0xc5,0xc6,0x85,0xcd,0xbe,0xc6,0x28,0x21,0xcd,0xfc,0x0c,0xb1,0x4d,0xb7,0xd0,0x1b,0xa3,0xbf,0x21,0xa5,},{0xf5,0x5b,0x4a,0xb6,0x4a,0x25,0x82,0x21,0x2b,0x96,0xcc,0xac,0x06,0x40,0xe2,0x71,0x94,0x4a,0x34,0xa2,0x86,0xd0,0x35,0x83,0x30,0x45,0x81,0x0e,0x34,0x18,0x24,0xbb,},{0xa4,0xc3,0x96,0xe1,0x9d,0xd4,0x2e,0x03,0x91,0x84,0xcd,0x25,0x11,0x88,0xff,0xa2,0x45,0xf0,0x36,0x7c,0x69,0xc0,0x2d,0x12,0x47,0x4e,0x5c,0xa9,0xe5,0xc7,0x68,0xa7,0xee,0x3a,0x3d,0x47,0xeb,0x22,0xd1,0xac,0x9e,0x04,0xb7,0x04,0xa7,0x4f,0x41,0x69,0x47,0xf3,0xf4,0x9a,0x32,0x42,0x59,0x4e,0x7b,0x63,0x90,0xe8,0x2b,0x60,0xd5,0x05,},"\xa5\x66\x74\xa1\xe1\xf0\x97\x95\x25\x1a\xbe\x54\xab\x43\xc2\x98\x20\x8f\xef\xc9\xbb\x91\x76\xfd\xb2\x3e\x1e\x9f\x60\xf0\x32\x64\x79\x15\x56\x7e\xbd\xcc\x2b\x86\x9e\xdb\x70\x55\xf4\xab\xa6\x7e\xcf\xe7\xfa\x19\xed\xa4\x5c\x06\x04\x7c\x7a\x51\x84\x8b\xe9\x97\x32\x51\xf8\x5f\xf7\x6f\x1c\x59\xe3\x65\x43\x82\x85\x8c\x9b\xe1\x23\xdb\x8a\x94\x90\xc6\xc9\xb3\x09\xb8\x2d\x1e\x2c\xa6\xf4\xa0\x7d\x00\x12\x02\x83\xc6\xc2\x95\x64\x49\x95\xa9\x66\x28\x61\x2b\x8d\x67\x91\x57\x35\x18\xe2\x55\x6a\x68\x8a\x09\xf1\x49\xbc\x84\x6a\x68\xbd\x0e\xf7\x92\x79\x03\x57\x10\x03\x1e\xf0\xa8\xfe\xd1\xdd\x0b\xf0\x26\x12\x5d\xc6\x64\x8f\x86\xf6\x43\x09\x94\x2e\x18\xf2\x3b\x12\xd1\xdc\x68\xc6\xf2\x77\x0c\xa8\xb5\x48\x5b\x36\x9b\x0c\x92\x00\x7a\x94\x61\xc1\x39\xfc\xbb\x41\x17\x5f\x31\x6d\x44\x67\x06\x0a\xb4\x3d\x12\x22\xf5\x80\x24\x04\xbf\x63\xc2\xdf\x7e\x00\x4b\xdc\x40\x0c\xa8\x0f\xe0\xd2\xcb\x68\xa2\x10\xfb\xc3\xfc\x0b\x90\x32\x09\xd5\x47\x6e\x7a\x56\xba\xef\xb8\xfa\xd7\xf3\x28\xb7\x2f\x32\x71\x13\xe1\x39\x41\x4b\xa6\xf3\x4e\x99\xc2\xec\xcd\xe0\x44\xe7\xa3\xac\x70\xc5\x80\xcd\x26\xc7\x45\x01\x92\xca\x4c\x82\x3c\x7a\xc5\xea\xe8\x76\xc0\xd1\xc8\xc7\x68\xc1\xcb\x0b\x7e\xa4\x1f\xc9\xb7\xd2\x94\x37\xbb\xad\xab\x18\xe0\xf5\xed\x1d\xef\xe0\xcf\x6c\x0e\xba\xa6\xb6\xd7\x77\xf4\xda\xd9\xab\xdd\xbf\xc0\xfd\x6a\xb5\xee\xea\x80\x3c\xfa\x01\xc0\xbd\x46\xf6\x5f\xef\xa4\x69\x01\xab\xbe\x0d\x89\x10\x4e\x3b\xc4\xae\xe1\xf0\x59\x9c\x69\xb6\x7b\xa5\x45\xab\x9b\x54\xf5\xde\xe3\x40\xac\x69\xd8\x82\x99\xe8\x68\x22\xac\xdd\xdd\xce\x60\x11\x22\x01\x2f\x99\x29\x97\x74\xaa\xf1\x7c\x96\x4e\xde\xcb\x95\xe1\x27\x7d\x46\x2d\xe6\x4e\x91\x15\xa6\x1a\xd9\x8a\xa3\xd2\x2e\x3b\xa6\xf8\xf1\xcd\x69\xb6\xb5\x2b\x83\x38\x28\x23\xf3\x0e\x96\x6b\xda\xd1\xff\x5f\xc1\x98\xae\x32\xe9\xb6\x80\x55\xd4\x39\x2b\xc7\xc3\xdf\x10\x15\xf1\x28\xae\xe1\xe4\xfa\x3d\x49\x99\xe3\x29\xf2\x2f\x0f\xf6\xaa\x77\x8b\xae\x02\x94\xa1\xdf\x74\x36\xcb\x16\xa2\xbf\xcd\x74\xb4\x63\xab\xe7\xcb\x4b\xac\x53\x62\xc8\x9c\x9d\x1a\x37\x8a\x2c\xb8\x85\xcc\x3b\x26\xab\x4b\xe8\x81\xef\x1a\xfc\x14\x43\x0e\x10\xd2\x65\x39\xca\x35\x8c\x36\x76\x28\x6a\xd8\x1c\xe1\xc9\xe7\x85\x92\xaf\x66\xf1\x82\xbb\x1f\x7f\x86\x2f\xe7\x55\xbf\xfb\x5b\xe5\xc5\xf2\xb7\x31\xc1\x32\xe2\x38\x8a\x76\xa1\xa7\xb1\xcd\xdf\x05\xae\xd2\xac\x9e\xc4\x08\x47\x52\x71\x94\x2c\xca\xdd\x32\xe4\x9d\x87\x91\xed\xf8\xb8\xde\x11\x75\x51\xce\x26\x4a\x60\xb8\x41\x05\xea\xe8\x7e\x66\xf6\xa4\x01\xd1\x32\x2b\xb2\x1a\x98\xe8\xac\xd2\x77\x49\x32\x54\xe5\x04\x00\x4f\x72\xc7\x6e\x79\x03\xd2\xfa\x38\xfa\xb7\x17\xe9\x4c\xe6\x27\x94\x7c\x4e\xa3\x26\xbd\x25\x75\xc3\x73\x10\xf3\xb4\xd8\x43\xb9\x0f\xa7\x7d\x32\xd9\x95\x21\x94\x15\x0b\x62\xf8\x50\x18\x7a\x4f\xdf\x38\x46\x6d\xfa\x06\x56\xc0\xa2\xe0\xb3\xf0\x74\x92\xac\x8e\x37\xe5\xd0\xdf\x95\xcc\x89\xdf\x30\x85\xa2\x69\x29\x1d\xc2\x51\x22\x10\xd3\xfe\x44\x24\x8d\x7a\xb9\x96\xbe\x09\x9a\xf6\x4c\x22\x75\x66\x66\xf8\xde\xa5\x6c\x00\xb9\x06\x77\xd1\x18\x25\x00\xdd\x27\x4f\xd0\x76\x92\x53\x82\x6d\x67\x7a\xb1\x6a\x55\x7b\x08\xb3\xc5\x22\x65\x49\x8d\x85\xc4\xcb\x2b\x60\x0e\xe0\x48\x1b\x7c\x1c\x47\x6a\x9d\xaa\x8b\x88\xc7\x1f\xc2\x1b\x6f\x89\xbf\xdf\xec\xe5\x8d\xa9\xe8\xd5\x65\x65\x2e\x43\x95\xbd\xf4\xc8\x11\xb4\xf4\xf2\x2d\x2b\x96\x13\x26\x1f\x88\xc6\x04\xc2\x97\x4d\x3e\x97\x7d\x14\x0d\x04\x6e\x1b\x66\x25\xb7\x07\x16\x40\xd3\x52\xcb\x7e\x7e\x65\xd4\x6c\x61\x34\x47\xbe\x8d\xc5\xa2\x00\xaa\x9a\xca\xb4\x6a\xfc\xcf\xeb\xb6\xb1\xc3\x19\x73\x24\x6c\x34\xfa\xaf\x8d\x26\xea\x5e\x83\xbe\x15\x71\x8f\x8f\xdb\x0c\xfc\x44\x4e\x2e\xb6\x0f\x36\x59\xb0\x20\x16\x1c\x22\x8e\x6b\x92\x40\xb7\xac\x39\x4c\xab\x81\x2d\xe1\x05\x15\x76\x6f\x22\x47\x3e\xcc\xa5\x35\x59\x4c\xe5\x28\xa5\x7c\xf5\xda\xb2\xeb\x32\xab\x84"}, -{{0x3a,0xbb,0xdb,0x0b,0xa1,0x1a,0xa1,0x06,0x3b,0xd2,0x6b,0x02,0xc1,0x16,0x03,0x78,0x62,0x28,0x5b,0xab,0xd2,0x15,0xd2,0x40,0xbc,0x9c,0x09,0x26,0xf4,0xec,0xea,0x81,},{0xb8,0xfc,0x59,0x43,0x8f,0x8c,0xe9,0xe3,0x78,0x5a,0x47,0x3b,0x22,0xc8,0x89,0x2c,0x51,0xea,0xc2,0x56,0x8c,0x68,0x1d,0xcc,0x77,0xb6,0xf0,0xe0,0x79,0x9c,0x4e,0x33,},{0x98,0x1f,0x20,0x05,0x5a,0x45,0x75,0x25,0xae,0xe5,0x61,0x62,0x64,0xe6,0xaf,0x42,0xe8,0xb3,0x87,0xcb,0x08,0xf8,0xb4,0xa7,0x3f,0x9b,0xe0,0xb3,0x66,0xf1,0x03,0x5b,0xb3,0x0a,0x1c,0x87,0x48,0x94,0xcb,0xec,0xe0,0xa8,0x46,0xd8,0x49,0xb7,0xec,0xc5,0x56,0x58,0x5d,0x0d,0x3d,0x39,0x56,0x45,0x80,0x7f,0xf2,0xa3,0xca,0x5a,0x59,0x0c,},"\xdc\xcd\x55\xf9\x22\xcd\x27\x4f\x69\x75\x00\x0a\xdc\x8d\x98\x63\x0c\x6d\x75\x2c\x12\x02\xa9\xdd\x12\x10\x48\xb9\x39\x45\xaf\x2b\x11\x10\x96\x77\x88\xf9\x9e\xc0\x28\xe3\xd3\xb4\xcf\x82\xfb\x07\x17\x3e\xa4\x40\x1e\x3b\xb4\xb0\x7b\x7b\x0b\x24\xb0\x59\xa7\x66\x33\x95\x32\xd9\xdf\x3e\x31\xb7\x2c\x95\x8c\x11\x9d\x8d\xfa\x15\xa5\x07\xaf\x6c\x5f\x7e\x78\xfe\x27\x0f\xa8\x1b\x9d\xf0\xf2\xe4\xaf\x24\xbd\x99\xfb\xeb\x14\xe0\x03\x30\x84\xd7\xfb\xf8\x4d\xde\xdf\xd5\xce\x56\x75\x1d\x15\x90\x84\x75\xdf\x8a\xf0\x13\xd0\x91\x17\x3c\x13\x86\xb9\x13\x94\x26\xcc\x60\x81\xea\x16\x5b\x8c\xe4\x81\x94\xb8\xe1\x8a\x9b\x91\xa4\x63\x13\x44\xfe\x29\xc8\xe7\x28\x18\xb7\x1f\xa1\x5c\x92\x92\xd1\x3f\xdf\x5f\x9d\x18\xe2\x9b\xd0\x29\x1b\x81\x38\xde\x73\x8f\xd3\xa3\x6c\x35\x23\x90\x22\x36\x8b\x45\x6f\x1f\xac\xba\x90\xa0\xd8\x0d\x6e\x31\x1c\x5f\x6c\x6f\x04\x67\x7e\x92\x37\x3a\x5f\xc4\x73\x88\x94\xdb\xed\x20\x6c\x30\xda\x34\x1b\x3b\x19\x6c\x94\x78\x58\xa6\xd2\xad\xc6\x8a\xac\x3f\x20\xcf\xdb\xe0\x49\x79\x61\xda\xe3\x34\x70\x26\x6d\x17\xec\x71\x9a\x59\xf0\x58\x6f\x82\xf9\x9f\x1c\x90\xed\x70\x05\xa2\x07\x21\x9a\x55\xed\xc7\x60\xf4\xeb\x8f\x24\x02\x64\x7f\x6f\x77\x97\x1f\xf7\xb6\x34\x35\x7b\x6b\x29\xbb\xd7\xea\x05\xe2\xe2\x58\x54\xe9\x9c\x62\x0f\x4b\x8b\x64\x73\x90\x22\xff\x0b\x33\x8a\xfe\xf3\x5f\xb6\xf4\x1a\x53\x62\x9a\x51\x8e\xb9\x3d\x66\x02\x0f\xb3\x53\xae\xf8\xdd\x07\x1e\x09\xc9\x16\xd4\x70\x4a\xcd\xf7\x76\xb3\x8c\xa9\xc5\x9f\x21\x1f\xf8\x8c\x43\x0a\x57\xe8\xf1\x71\x39\x23\xb3\xf3\x0c\xa8\x69\x70\xa1\x4a\x52\xdb\x4b\xcb\xe6\x0d\xf4\xbc\x3c\xfd\xf2\x54\xbf\x10\xf8\xaf\xae\x87\xbd\x61\xb3\x58\xf4\x3c\xc2\x96\xc0\x41\x29\x64\xc4\xe0\x0f\x71\x21\x33\x97\x46\x85\x17\xcb\x01\x37\x9c\xb7\x29\xc7\xb9\xe3\x5b\xd5\x0b\xdd\x98\xc3\xd3\xb7\x62\x97\xa1\x38\xb5\x7c\xeb\x6c\x77\x74\x2d\xf0\x88\x1d\x07\x66\x8c\x08\xa6\x30\xa4\x4e\x6e\xd7\xeb\x20\x6d\x6a\x56\x44\x07\x10\x43\x8a\x51\x11\x42\x4b\x61\xaa\xee\xce\x40\xe9\x00\xf5\xe3\xc4\x57\xe9\xd6\xe3\x1a\x79\xec\x5b\x4b\x42\xb6\x8e\x66\xe1\x99\x30\x92\x87\xca\xd6\x53\x36\xfc\x7f\xe4\x3f\x43\xcd\x8c\x77\x3d\x3c\x65\x80\xd7\x21\x7e\x2c\xab\xec\xd3\xea\xbc\x48\x5c\x4a\xcf\x47\x71\x8c\x39\xb0\x2c\x78\x58\xff\x34\x7c\xec\x75\x35\xed\xdc\xd4\xfc\x81\x5d\xf8\x14\x56\x9a\x88\xae\x70\xf2\x73\x3a\x65\x39\xf2\x08\xc7\x9c\xf4\xe7\xc4\xf9\xea\x24\x1a\x92\xe9\x51\x51\x71\x36\x14\x18\xa4\xc2\xe5\x3c\x07\x6a\xaa\xbc\x47\xe4\xc9\x71\xbd\x04\xb1\x00\xc2\x62\x82\x30\x88\x57\xe0\x6e\x7e\x5f\xbc\x43\x42\x56\x4f\xb3\xb1\xea\x4a\x17\xa9\x25\xe9\x1e\xe6\x91\x22\x32\x1d\x39\x2b\x24\x69\x65\xb8\x6b\x54\xfd\x5c\x83\xfa\x5c\x47\x41\x63\xf9\x8a\x9f\x44\x7d\x88\xcb\x59\xfe\x2c\xdf\x9f\x54\x12\xfc\xbe\xb3\xef\xfa\xc8\x97\x67\x91\xc6\xa4\x7b\x66\x9a\x2f\xc5\x5a\xbe\x8e\x09\xe7\x41\x57\xef\xcd\x1c\xa7\x8f\xc1\x0f\xa6\x87\x01\x0c\x68\x26\xc6\xe8\x96\xef\x5c\xd7\x1d\x0f\xe4\xd1\xbd\x07\xc1\x0d\xac\x3b\x03\x48\x5e\xdd\x25\x69\xa7\xee\xcf\xbc\x4e\x5d\x2e\xe2\x37\x98\x59\xe2\x65\x26\x7b\xed\xaa\xd6\x9d\x93\xb7\xc1\xbd\x18\xf2\x7e\xa4\x24\x83\xc7\xe4\x10\x0e\xe0\x5b\x28\x30\x39\xbf\xb9\x89\x1d\x37\xc4\x67\xed\x83\xb8\x8c\x79\x4e\xab\x6b\xab\x9d\xc6\x77\x89\x26\x50\xe2\xd8\x96\xfb\xfe\xc1\xb1\xcd\xb7\x21\xbe\x30\xb0\xb8\xe5\x35\x87\x09\xe1\x65\xcb\xe3\xa1\x82\xc9\x3b\xc0\xa0\xce\xa2\xf8\xcf\x3a\x62\x57\xad\xf7\x64\x53\x40\x41\x20\x22\x41\xa5\x27\x9b\x66\x8e\x40\x12\x5f\xc0\x94\x58\x5a\x3c\x58\x8a\xba\x82\xb6\x7c\xd9\x1d\x48\x3e\x54\x30\x04\x28\x42\x68\x63\xa4\x23\x64\x04\x9d\x7c\x45\xa1\x69\x38\x5a\xa8\x9b\xf3\x77\xf0\xd3\x2b\x07\x80\x9b\x58\x71\x39\x5e\xc0\x53\xa2\x57\xd9\x3e\x48\xbb\xf4\x07\xeb\x60\x91\x40\x1e\x25\x65\x46\xe3\x1f\x9f\xcd\x24\xd2\xc5\xb3\x33\xcf\x65\x78\x50\x02\xf0\x8d\x54\x8d\xb2\x6a\xd1\xf3"}, -{{0x8a,0x44,0xd6,0xaf,0xc6,0xc8,0xee,0xe1,0xbc,0x7d,0x5f,0x69,0xe4,0x95,0xb0,0xb1,0x8c,0xa7,0xae,0xe0,0x07,0xde,0xa7,0xcf,0x0d,0x17,0x14,0xd7,0x85,0xa9,0xf4,0xed,},{0xd4,0xf3,0x66,0xb3,0x37,0x7f,0xa3,0x9b,0x36,0xf9,0xae,0x14,0xda,0x40,0x4e,0x22,0x40,0x49,0x0d,0xbd,0x8d,0x79,0x6b,0x1a,0xb8,0x72,0xdf,0xcb,0x83,0xa5,0x95,0x40,},{0xe0,0x72,0x7e,0xb7,0x2e,0x84,0xd2,0xb8,0x2c,0xdb,0xd0,0xa6,0xbd,0x2f,0x49,0x49,0x63,0x16,0xaa,0xe8,0x35,0x1e,0x49,0x02,0xac,0xd5,0xe3,0xcc,0x57,0x34,0x6e,0x7e,0xba,0xfd,0xd9,0x2a,0x90,0xde,0xd7,0x6f,0xd0,0xc6,0x69,0x0d,0x68,0xbb,0x2f,0xed,0xd6,0x13,0xe4,0x4f,0xa2,0x22,0xbe,0x01,0x26,0xda,0x52,0x0a,0xcc,0x2c,0x41,0x05,},"\xde\x80\x32\x69\x66\x53\x6c\xe9\x49\x96\xaf\x2d\xe7\xa0\x76\x05\xcc\x4f\xcb\x9e\x75\xee\x0a\x67\xa1\xe2\x09\x32\x11\x1d\xe9\xb3\x56\xd5\xbe\xea\xe8\x6c\xc5\xf5\x64\xc1\x0d\x66\xe3\xde\x95\xa5\xb9\x9e\x84\x49\x28\xea\x8e\x77\x58\x6c\xf3\xc1\x0a\xd3\x63\x3d\xde\xeb\x1d\x9d\xcf\x3f\x94\xb7\x0b\xf1\xef\x63\xd2\x38\xdf\x20\x4d\x70\x5c\x0b\x17\x4f\x83\x28\x25\x45\xf5\xe4\x07\x5f\x8d\x69\xa4\x81\x79\xc2\x9e\xab\xf5\xc1\x74\x2e\xf3\x9e\x1a\xd9\x63\xbe\xbb\xb6\x6f\xce\x94\x91\xa9\x84\x65\x12\x15\xc2\xe7\x50\xe6\xee\x83\x65\x76\x64\x40\xa8\x44\x19\xe5\x2d\xcf\x67\x1f\x1c\x52\xea\xa2\xb9\x90\x2b\xcc\xa4\xb3\x7c\xff\xdb\xac\x8e\x7e\x7e\x6b\x0a\x5c\x87\x48\xef\xbf\x45\x2d\xf6\x16\x3f\x4c\xa0\x7b\x61\xf9\xa0\x5e\xc2\x0a\x2b\xd6\x33\x38\x9e\x67\x0b\xb5\x45\x4a\xcd\x6f\x3a\x06\x33\x5b\x5d\xa9\xec\x32\x62\x64\xe9\x62\xc7\xd9\xd0\x6c\xe7\xe9\xff\x04\xa0\xa5\xbb\xdf\xaa\x4c\x41\x08\x66\xa5\x72\x01\x16\x51\x43\x9f\x2d\xbc\xe5\xde\xe6\x67\x92\x4a\xc4\x93\x4d\x20\x54\x96\xbd\x1d\x4d\xf0\x8b\xd0\xcb\x3f\xd2\xde\x73\xa2\xef\x34\x2f\xf0\x09\x1e\x10\xe1\x5b\x3b\x76\x0a\x57\x5d\xf9\x3c\xf1\xc9\x7c\x01\xc5\xab\x11\xc0\x94\xbf\x34\x87\x82\x06\x71\x8f\x6b\x28\x5a\xa5\xcc\x51\x27\xbd\x7f\x98\x8b\x84\xa9\x04\x95\x30\x6f\xd9\xe9\x9d\x89\x55\xe6\x68\xd1\xa3\xff\x10\xf6\x5b\x7c\x47\x9f\xac\x24\x11\x9a\x3c\x10\x12\x2d\x4d\x18\xa8\x05\xb2\x47\xdf\x16\x8c\x0a\x51\x00\x16\x9b\x55\x72\xd1\x70\x12\xd7\x51\xa4\x2e\x83\x37\x61\x15\xe1\x15\x61\xc1\x60\xc1\x5e\xfa\xd7\x6d\x21\xf7\xab\xb4\x30\x36\x64\x75\x23\x86\x31\xf8\x4c\x88\xf8\x38\xb0\xac\x40\x4c\x91\x3d\x2f\xa1\x24\x50\x23\x84\x85\xc3\x02\xfc\x20\x1f\x44\x15\x1c\x19\xbc\xbd\xc1\x19\x0c\x12\xd1\x54\x08\x31\xfb\x19\x58\x1c\xb9\x31\x72\xb0\xd2\xff\x5c\x65\xf3\x1c\xaf\xf2\x0f\x81\x38\x81\xf8\x4e\x5e\xf9\xd5\xc1\x65\xe0\x96\xd2\x54\xca\xdf\x89\x52\x49\xaa\xb8\xd4\x49\x6c\x94\x0a\x40\xf9\x07\xbd\x40\x93\x5a\x94\xf5\xe5\x5b\x6d\xd0\x51\x15\x41\x00\xfe\x33\x17\x70\xef\xf2\xba\xd6\x54\x56\x19\xb8\xa3\x3e\xf6\x46\x2a\x50\xc0\xb2\xc4\xed\x2f\xba\x4e\x4e\x38\x3e\xbf\x29\x32\xe6\x19\x27\x66\xa4\xaa\xd1\xd6\xe2\xb6\x92\xd9\xf2\xbd\xc2\x33\x93\xe8\xaa\xcf\xba\x32\x3b\x53\x4f\x84\xed\xf2\xdc\xed\x7c\x94\xd5\x16\x87\xda\xa2\x71\x98\xa9\x14\x4b\x31\x2b\x71\x6f\xe1\x70\x14\xa7\xbe\xd0\xc1\x4a\x24\x38\x73\x3d\x55\x5c\x65\x64\xc8\xc1\xa3\xd9\x97\xeb\xae\x7b\x3d\xe8\x87\x7a\xf5\x3c\x1d\x1a\x50\x29\x15\x8a\x80\xaa\x0c\x87\x48\x9f\xef\x27\x0c\xdf\xfe\x10\xd3\x4b\x15\xc1\xa9\x69\x3a\xe0\x39\x02\x43\xe3\x14\xcf\xac\x06\xef\x6e\xef\xeb\xcc\xf4\x3d\x42\xea\xc2\x4c\xe9\x87\x94\x29\xd2\xfc\x72\x53\xb3\xed\x17\x58\x25\xbc\x4d\xa0\x76\x2b\x49\x33\xa9\x8a\xfd\xb9\x4b\x06\xf4\xfc\xd2\xad\x36\x11\xaa\x99\x9d\x7c\x1c\x8d\x85\x2d\x01\xdd\x9e\x52\x64\x84\x55\xa0\x4e\xb2\x33\x0a\x76\xfd\x94\x2c\x53\x1e\x51\x4b\x5e\xc0\x72\x8a\x89\xd3\x4c\xa5\x90\xea\x99\xc8\x8f\xaa\x20\xdf\xb7\xbb\xf6\x56\x54\xaa\x6c\x21\x2b\xeb\x8a\xd6\xbf\x7c\x77\x73\x91\xcd\x49\xc3\x9c\xf8\xab\x51\xb9\x5b\x41\x9e\x3d\xfc\x8d\x94\xa9\x3a\x1e\xf0\x22\x3c\x6d\xe9\x0b\xf9\x62\x18\xd8\x04\x5b\xd4\x95\x2a\x0d\x83\x72\xa5\x57\x8c\x6a\xaf\xa7\x4b\xa6\x62\xe3\x18\x8e\x6a\x6e\x56\x7e\x4d\x2f\xe8\x22\x7d\x07\x43\x98\x2a\x41\xeb\xfa\x0d\x31\x0f\xe7\x9f\xed\x27\x04\x17\x90\xef\xd5\xaf\xac\x22\x43\xe1\xd1\x50\xb1\x45\x01\x5d\x9d\xea\xb0\xed\xed\x63\x94\xac\x36\xfc\x5f\xb2\x01\xf5\x20\x4f\xbd\x42\x2a\x36\x04\x23\x30\x15\xbb\x0a\x48\xa9\x20\xe2\xe5\xe0\xd4\xde\xed\x67\x20\x25\xf2\x3c\xfb\xa9\x38\x89\x59\x7e\x50\x4c\x88\x87\xad\xd4\x6c\xfe\xf4\x02\x4a\xfb\x8a\x26\xee\xb7\xdc\xdd\xb2\x39\x7b\x44\xa1\x79\x63\x67\x34\x00\x42\x13\x70\x28\xc3\x30\x76\x26\x81\x6c\x29\x31\xe6\x1e\xbb\x6b\x69\xed\xcb\xcb\x61\x2c\x9b\x18\x1a\x28\x53\x01\xce\x46\xf8\x2f"}, -{{0x8a,0x97,0x2d,0xd0,0xf1,0x19,0x0c,0x2b,0x9d,0x54,0x8f,0x4b,0xa5,0x82,0x64,0xbb,0x04,0x82,0x67,0x75,0x50,0x2a,0x8d,0x5c,0x2b,0x20,0x9e,0xe8,0x8d,0xce,0xa5,0xfb,},{0x6d,0x80,0x37,0x5f,0x3c,0xf1,0xaa,0xb2,0x83,0x55,0x1d,0xf4,0x45,0xd1,0x7e,0x7d,0x3b,0xaf,0x9b,0xcb,0xec,0xbb,0xb2,0x67,0x05,0x2e,0x02,0xfd,0xb6,0x91,0x44,0xd3,},{0xbd,0x45,0xb3,0xc0,0x45,0x85,0x0e,0xbe,0xf7,0xb8,0x0d,0xd1,0xde,0xab,0x48,0x03,0x7b,0x13,0x46,0xc7,0x1d,0xea,0xf1,0xe5,0x8f,0x2a,0x7b,0x16,0x26,0x74,0xf9,0x4d,0x1e,0xf3,0xd4,0x23,0x90,0x37,0x33,0x0b,0xd6,0x33,0x5f,0xe4,0xf0,0x14,0x92,0x50,0x90,0x1f,0x00,0xa8,0xe4,0x6b,0xe5,0xfa,0x0a,0xae,0xc6,0x9d,0xe0,0x6d,0x73,0x04,},"\x30\xb2\x89\x48\x93\x9a\xa2\x63\x43\x7e\x45\xc5\xc0\x25\x4f\xb2\x0e\x61\x7e\xd0\xf3\xfa\x7d\xac\xe5\xa0\xa8\xe0\xfe\x3c\x1f\xc4\xad\xb2\x80\x9b\x61\xc5\xe8\xd9\x2c\xd2\xf3\xde\x93\xb1\x73\xbe\x70\x7b\xad\xa9\x42\x40\xc6\x26\x2c\x16\x0e\x8c\x78\x21\x65\xbe\xef\x99\xd0\xbe\x8e\xcd\xad\x63\x16\xdc\xd7\x34\xbb\xb9\x0a\x66\xcb\xd5\xb1\xcb\x4f\xd8\xf2\x22\x6c\xea\x94\x8e\x4d\xf7\x6b\xbe\x25\x1d\x47\x8f\x5c\x3f\xe0\xd6\xde\x4b\xe5\x4f\x67\xf5\x02\xb2\x80\x4f\x62\x8b\x79\xa5\x50\xfb\x1a\xc4\x83\xad\x2b\xa1\x66\x37\xc4\xbc\x9d\xa6\x7f\xb4\xf9\x86\x59\xc4\xc4\x39\x4d\x16\xb6\xd1\x4b\x3e\x0b\x0c\x1e\x62\x5d\x71\x0d\xcc\x1c\x11\xdf\x5d\x34\x14\x7b\x1e\xc5\xa4\x17\xb9\xe2\x1f\x90\x8c\xfc\x52\x3d\x43\xe3\xf1\x81\xc7\x20\x9c\xc5\x6b\xdb\x5a\x21\x62\x86\x95\xed\x32\x0f\x8d\x4c\x07\xfd\x6d\x84\xaa\x03\x42\x6f\x21\x64\x4a\xae\xfe\xee\xc3\x11\xc7\x4e\x94\x99\x93\x60\x47\x35\x0a\x9b\xf5\xb7\x03\x96\x2e\x77\xce\x55\x13\x36\x83\x5f\xc3\x2c\xcb\xd2\xc9\x0a\xe5\x2e\x24\xd4\x7d\x8d\xcb\x98\x7a\xbd\x12\x1d\x3f\x74\x6b\x5d\xe2\x30\xf2\x64\x69\x60\x3f\xb0\xc4\xa8\xf6\xcd\x79\x73\xd7\xda\x88\x2e\xd1\xd6\xe4\xd9\xc5\xa4\x6e\xc2\xc2\x19\x40\xad\x33\x89\xa1\x86\x01\x4e\xe9\x72\x78\xe5\x35\x09\x88\xb1\x5e\xcd\x9e\xa7\x45\x6b\x3c\xb5\x5e\x4d\x30\x93\xf1\x3a\x87\x5b\x50\xd6\x51\x63\x78\xec\xaf\x58\xd7\x52\xc6\x37\x4e\xd1\x56\x38\x40\x93\x11\xfc\xd3\x79\xd1\x22\xc8\xd8\xc5\x9b\x86\xf4\xe8\xdc\x46\xad\xb7\x30\xa9\x33\x84\x6e\x0b\xd2\x48\xd3\x60\x82\x52\xd9\x70\xb5\x04\xc8\x13\xc6\xde\xa9\xfc\x88\xa3\xde\x64\x19\x56\xdc\xa2\x91\x20\x4d\x39\x0b\x6b\x39\x98\x1f\x8c\x0a\x6b\xcf\xc3\x1c\xa0\x74\x44\x20\x66\x2a\x9b\x35\xeb\x3f\xc2\x11\xf8\x10\xa3\xe8\x06\x25\x00\xb1\xe4\x9b\xdf\x85\x76\x65\xff\x32\xa9\xba\x76\x19\x4b\xbb\x77\xfb\x9c\x15\x41\x29\x64\x24\x4b\x98\x65\xf7\x3d\xed\x9f\x25\xb4\x9b\x42\x5a\xa2\x53\xd8\x07\xd9\x81\x82\x92\x76\x3a\x51\x3e\xc8\x07\x47\x34\x4f\xba\x0a\xcf\xe5\x93\xcc\x26\xb1\x33\x0b\xb9\xad\xe6\x6c\x4e\x88\xcf\x1b\xae\xd6\xd6\xe7\xb7\x50\xe6\xc7\x23\x9d\x7b\xcb\xfa\x3f\xbe\x45\x40\x5a\x63\xb9\x6d\x50\x34\xcc\x0c\x07\xff\xc3\xb5\x08\x58\x08\x1d\x19\x55\xe2\xd2\xfe\x5b\xe5\xfd\xa7\xa8\x99\x69\x43\x76\x8b\x05\x51\x70\xb7\xfd\x52\xf0\xa3\x20\x97\xfe\x1b\x7a\x94\xf1\xbf\x87\x9a\x0c\xba\xbe\x10\xac\x9a\x7c\xc1\xf9\xf5\x50\x68\xc4\x8e\x3c\xcc\x06\x51\x36\x43\x10\x18\xd3\x8d\x20\x10\x9d\xc9\x5d\x99\xcc\x2b\xbe\x7c\x62\x7a\xb1\xa8\xaa\x5f\x43\x16\x13\xb7\x90\xc2\xe6\x52\x6c\xf0\x4f\xdc\x9e\x55\xf5\x1c\x05\x5f\x3c\x20\x45\xa6\x75\xe3\xa1\xe5\x4b\xa4\x09\xf7\xae\xfa\x7e\x4a\xa0\x7a\x2b\xbd\x5e\x4a\xb1\x63\x21\xa9\xf0\x99\x69\x43\x91\xfd\xa6\x8a\x74\x58\x1e\x2f\x1f\x11\xdd\x9a\x6d\x52\x4b\x1b\x83\x26\x0d\xb5\x7b\x72\xef\x29\xc2\x8c\x8d\xb5\xc3\x7f\xd1\x85\xb7\xc2\xd8\x45\x50\x90\x65\x3a\xf3\x32\xdb\xc8\x2b\xfb\x0d\xb5\xdc\xca\xbf\xb6\xb2\x8c\xaa\x35\x05\x25\xcb\x54\xcc\x84\xe5\x53\xe1\xcf\x39\x54\xb6\x12\x39\x3e\x79\x93\xff\x7e\x8b\xf5\xec\xe3\xf1\x45\x09\x4d\xd7\xa2\x7c\xb4\x7f\x22\x74\x76\xf2\x89\x23\x52\x51\xf7\x72\xb3\xba\x77\x6b\xb7\x73\xaf\x0c\xc5\xf7\x86\xa3\xfb\x9e\x93\x1a\x53\x0c\xfb\xd8\x91\xcb\x5a\x5d\xfe\x25\x16\x9e\xf9\x33\xcc\x82\xc9\x08\x0f\x32\x39\x61\xa1\x20\x15\x8e\x4b\xbd\x71\x13\x4e\xf1\xf9\x01\x08\xb8\x15\xc2\x89\xd4\xe9\xa9\x58\x9e\xc6\x4c\x05\xfb\xb4\x2a\x21\xb2\x3d\x16\xe2\xa6\x46\x78\xae\xcf\xab\x65\xcd\x9a\x80\x6c\x59\x81\x03\xd4\x1f\x70\x09\x77\x63\x17\x83\x1f\xed\xdd\x1c\x90\x02\xd4\xa9\x22\x04\xf9\x7b\xa9\x49\x0c\x61\x46\x98\x03\x07\x21\x02\x52\x4b\x9d\xf5\x19\x00\x5f\x98\xaf\x54\xd6\x0c\xa5\xba\x60\xb5\x5b\x09\x6a\x4a\xc2\xb1\x6e\xb9\xcc\x81\x97\x3c\x31\x35\xd3\xfb\x68\x73\xdd\x96\x53\x80\x0a\x22\xbb\x5d\x0d\x61\x17\xca\x5d\x91\x65\x53\xbe\x39\xc9\xa3\xb5\x11\xeb\x3d\xb7\x30"}, -{{0x12,0x38,0x0c,0x45,0xa7,0x9a,0xde,0x0f,0x48,0x3c,0x88,0x1a,0xaa,0x37,0x30,0x43,0x8b,0x08,0x35,0x90,0xf4,0x04,0xdc,0x9e,0x60,0x1f,0x76,0x15,0xf3,0x75,0xa6,0x28,},{0xd6,0x6f,0xc5,0x9a,0xe9,0x17,0xf7,0x6d,0x24,0xce,0x8a,0xb8,0xee,0x03,0xfb,0xcb,0x71,0x5d,0x5e,0xea,0x4b,0x08,0x39,0x2b,0x59,0x1e,0x64,0x85,0x91,0xc7,0x3c,0x89,},{0x02,0xb2,0x51,0x74,0xa3,0xdd,0x52,0x19,0xed,0x48,0xb2,0xc9,0x4c,0xa2,0x12,0xb6,0x3a,0x6a,0x3a,0x25,0x97,0x70,0x3c,0x07,0xb7,0xf0,0xc9,0x65,0xc3,0xc6,0xac,0x2e,0xb4,0x50,0xef,0xe3,0x87,0x16,0xa2,0xa2,0x8b,0x3f,0x89,0x84,0x6b,0x06,0xeb,0xdc,0xa4,0xbd,0x09,0xaa,0x58,0x1f,0x24,0xe8,0x4d,0x80,0xfc,0x10,0xac,0x1a,0x00,0x0a,},"\x68\x45\x23\xc2\xe7\xfa\x8b\x4b\xd7\x54\x8c\x4b\xac\xaa\x86\x78\xa3\x30\xdb\xbb\x96\x06\x32\x94\x01\x66\xb2\xcc\x9a\xfc\x15\x35\xc8\x0c\x11\x2c\x8d\xc4\xad\xa7\x62\x92\x33\xfe\x90\x90\x55\x23\x7d\x51\x3e\x29\x2a\xf1\x5a\xd7\x69\x2f\x11\x5a\xa0\x92\xda\x65\x75\x32\xf5\x18\x99\xc3\xf7\xf5\xd9\xd4\x07\xed\x5c\x16\x3e\xb3\x95\x04\x80\xa4\x12\x2a\x09\x92\x98\x1f\x07\x7b\xc8\x67\xf9\x06\x07\x54\x07\xba\x98\x49\xc4\xea\x04\x73\xce\x54\x0a\x79\x67\x44\xef\xa3\x86\x03\x78\xe1\xb8\x93\x43\xe5\x83\xd0\x80\x7e\x5a\x67\xc4\xd5\xbd\x7c\xe6\x41\x29\xfe\x90\x2b\x8c\xfa\xbd\x2c\x21\xfa\x3d\x2a\x10\xe9\xbf\x9e\xa5\xe5\x47\x3a\xe2\x50\xc9\x16\x05\x09\x97\x26\x78\xf9\xa7\x40\xe6\xca\xdb\x3b\x52\xf5\x02\xfa\x61\x6c\xff\xae\x1d\xef\x89\x3d\x54\xe4\x1e\x54\xd3\x26\x46\x4c\x9f\x43\x5c\x63\x50\x5f\xb1\x5e\x3e\xea\xf5\x02\x1c\x65\xdc\xd0\x10\xf8\x40\xaa\xb3\x17\xc8\x60\x5d\xfb\x1a\x0c\x8a\x3d\x55\x49\x86\x1b\x69\xaf\x2c\x93\xd8\x6c\x98\x1d\xf3\xa5\x1c\x5b\xf5\x78\x5c\x2f\x85\x26\x10\xe4\x4f\xa4\xff\x1c\x71\x61\x15\x2e\x56\x18\x38\x47\x44\xfe\x83\xba\xbf\x0b\xcb\x75\x61\x78\x9a\x02\x31\x25\xf6\x24\x2a\x18\x3c\xac\x95\x49\xc9\x32\x73\x3a\x86\x8a\xa1\x82\x65\x6e\x2b\xa0\xa8\xc0\xbe\x10\x69\x96\xa8\x5c\xeb\xf1\xbd\xad\x12\x3b\x98\x2b\x4e\x05\x55\x10\x87\x94\x82\x02\x1d\xae\xa9\xd8\xf2\x6c\x58\x8e\x6c\xd1\x01\x26\xcb\x31\x96\x88\x03\x56\xbe\xe8\xf2\x98\xbc\xa3\x06\xec\x56\x99\xc7\x57\x6b\x76\x50\x87\xc2\x53\xa6\x02\x14\x01\x0c\x6e\xd7\x0d\x87\x1c\xfc\x87\x38\x01\x8a\x0e\xdb\x57\xf1\x06\xb4\x21\x8d\x85\x5e\xab\x2c\x91\xf3\x9f\x85\x8b\x3f\x25\x90\x56\x31\xa0\xee\xe2\x98\x56\xfd\x34\xf7\xb8\xc9\xba\x51\xc1\xc4\xc6\xa7\x35\xd6\xc7\xa1\x3d\x22\x0d\x7a\x56\x6c\x3f\x50\x6c\x72\xbc\x74\x17\xab\x37\xf0\xd6\xd7\x96\xff\xc7\x1d\xf9\xdc\x7c\x6e\x13\x7d\xa5\x6b\x7a\x3e\x10\xcf\x0b\x1a\xbb\x3f\xfb\x70\xbc\x66\x29\x3b\x5d\x75\xb4\x05\xed\x8b\xec\x0d\x6f\xcd\x06\x92\x5c\x38\x11\x68\xac\x18\x8d\x0b\x8a\x1a\xf0\x83\x9f\x5b\xde\x84\x3b\x69\x91\xe5\xa5\xd6\xcd\x66\xfe\x6b\x0f\xde\x86\x7c\x08\x6e\xd4\x38\x76\x91\x9a\x1b\x72\x33\xd8\xd7\xe1\xd2\x74\x2f\x61\xc7\x7d\x8e\x59\x91\x68\x9c\x83\x28\x67\x66\x55\xb7\x6a\x37\x50\x56\x0e\x75\xd1\xc7\xe8\x5e\x3c\x00\x85\x05\x93\x31\x09\x4b\xba\x57\x10\x03\x2c\xf6\x79\xa5\x25\xc7\x8b\x31\x70\x0e\x6d\x91\xf7\x52\x94\xc4\x22\x48\x92\x97\xe1\x73\x59\x43\xe4\x17\xfc\xd3\x55\x80\x58\x2f\xdd\x02\x39\xb5\x11\x46\x53\x0c\xc0\x9d\x83\xb2\x8f\x0a\x1d\x64\x22\x20\xdf\xb9\x9b\xad\x62\xf3\x95\x41\x03\x50\x81\xd6\x5d\x77\x8d\xdf\x32\x39\xba\x0e\x6f\xa9\x91\x4b\x17\xb3\x97\xa5\x34\xcb\x8f\xd3\xb4\xff\x42\xa8\xd8\xc8\xee\x66\x15\x3f\xbb\x1f\xf0\xfa\x54\xf7\xbd\x03\x27\x85\x16\xe6\x34\x1a\xf8\x0f\xcd\x1f\xce\xe7\x0c\x35\x9d\x20\x53\x68\xac\x49\x0d\x75\xa3\x54\x51\x2d\xa4\x6b\xa7\x63\x4c\x15\xb2\x84\xb2\x44\x77\x80\x8f\x17\x63\x33\x60\xa4\xb4\x9f\xb3\xbc\xaa\x84\x18\x41\xcf\x92\x41\x7e\xb2\x4c\xe4\x82\xd5\xa2\x4b\xfd\x2d\xac\x37\x22\x31\xda\x53\x9a\x05\x42\x00\x02\xff\x7a\x20\xc4\x76\x09\x7d\xa0\x6f\x59\xf0\x33\x14\xe6\x05\x9f\xad\x88\xc5\x0c\x3b\xaa\xc0\x3c\xef\xa7\xcd\x82\x11\xd2\x46\x1b\x16\x60\xea\x6b\xcf\x47\x68\x38\xc9\x1a\x10\x07\x4e\xb4\xb4\x0e\x6e\x97\x4a\x94\x5a\x67\xf6\xee\x69\x04\x23\x1e\xf0\x41\x88\xf1\xea\xd5\xba\xf3\x56\x94\xef\xe3\x01\xed\xc7\xe8\x66\xda\x23\xb5\xa6\xc5\x8f\x01\xb2\xa5\x2c\xf3\xab\x80\x5e\xdc\x5c\x13\x68\x62\x6b\x95\xb9\x4e\xb4\x64\x5b\x69\x3e\xc8\x80\xf2\xb8\x11\x7a\x69\x3a\xfb\xdc\xd2\x48\x24\x31\x89\x0f\x41\x0b\xc5\x80\x53\x0f\xef\x37\x58\x79\xc2\xe4\x60\x49\xca\x89\x1a\x2c\x3e\xcd\x60\x43\xae\x80\xd8\xaf\x34\x66\x34\x67\x4c\x6d\xfe\x90\x59\x97\xde\x5d\x05\xd6\x20\x09\xee\xed\x27\x75\x02\xfb\x5a\x5a\x31\x55\xee\xee\xb6\x73\x48\xb6\x0d\x89\xa3\x4a\x78\x12\x63\x9f\x54\x1f\xfe"}, -{{0xd1,0xb3,0x43,0x0d,0x4e,0x63,0xaa,0xbf,0xa9,0xef,0x96,0xbc,0xba,0xf1,0xfa,0x6a,0x9e,0xb5,0x21,0x9d,0xd4,0x4d,0xf3,0xb1,0xa6,0x15,0x63,0xdf,0xfe,0x1c,0xcb,0x28,},{0xc2,0x8a,0x05,0x19,0x52,0x45,0x29,0x0e,0xcd,0x38,0x53,0x55,0x85,0xce,0x51,0xf3,0xc2,0x35,0xc5,0xd6,0x50,0xc8,0xc5,0x7c,0x2f,0x79,0xbb,0x0a,0xc0,0xe8,0x08,0x34,},{0x4c,0xb6,0xff,0x5d,0xd7,0x06,0xb1,0xae,0x81,0x6c,0xdb,0xaf,0x9e,0x9e,0x1e,0xdc,0x80,0xa6,0x62,0x84,0xf9,0x46,0x52,0xd5,0x0e,0xc1,0x4e,0x28,0x3b,0x2a,0xdc,0x59,0x2f,0xd0,0x84,0x33,0x71,0x44,0xff,0xa7,0x12,0xdc,0x34,0xce,0x8e,0x61,0x06,0x68,0xa6,0x5e,0x96,0x9f,0x05,0xce,0xb5,0x47,0x86,0x30,0x4d,0x0d,0x58,0xd3,0x1a,0x08,},"\x07\x6c\x0c\x87\x62\xe4\xbc\x00\x3c\x36\x0a\x12\xa1\x95\x98\x05\x05\x51\xd1\x6b\x4b\x8d\xa0\xfb\x9c\x4a\xfc\xc8\x1a\xdb\xe6\x19\x95\xf2\x5c\xbc\x28\xdc\xa4\x20\xbf\xa9\x46\x10\x54\xd3\xee\x00\xad\x78\x18\x3e\x7f\x26\xdf\x68\x98\xaf\x9a\x4d\x22\x5f\xca\xb6\x7c\x04\x2e\x9a\x13\x52\x5d\x1f\x75\xff\x0e\x3d\x8d\xa8\x08\x96\xb7\x28\xf3\xe2\xdb\x65\x94\x4a\xe0\x71\x7d\x77\x59\x90\xb5\x9e\x5b\x70\x43\x4b\xd4\xb3\xee\x45\x2f\x10\xac\x06\x10\x57\x0b\x38\x22\x08\x32\x96\x8f\x54\x4d\x3e\x4d\x11\x9b\x1d\x4b\x50\x15\xc6\xcd\xf4\xcf\x22\x0b\x56\xb5\xc0\xcc\xd8\xe3\x98\xd5\xe4\xa5\x8d\xa3\xb0\xe2\xb2\x70\xa5\xd3\x9b\x82\xab\xb7\xf9\xd2\x7a\x41\x90\x18\x55\x0b\x62\x00\xae\x51\xc8\x48\x82\xf0\x86\xae\x7e\xa5\x35\x16\x71\xb6\xdd\x96\x09\x23\xad\x6b\xef\xc1\x34\x09\x87\x9a\x8d\xf6\x19\xbd\xf6\xc8\x8a\x6f\xe1\xec\xc0\xf0\xf3\xaa\x21\x9f\xb6\x19\x02\xbe\x48\xa5\x3d\xf2\xbc\x66\xc5\x6f\x1c\x1d\x17\xf7\xe6\x16\x7d\x25\x51\x65\xf1\x74\xba\xa9\xca\xf5\x3c\x73\xcb\xbb\x7c\xc2\xc7\xc0\x87\xf4\x3a\xbe\x2a\xed\x5a\x21\xfe\x42\x90\xb8\xd6\x79\x60\xa8\xa9\xcb\xc2\xa5\x7a\xbe\x22\x65\x4d\xc1\x84\xcf\xf9\x16\x8b\xb6\x97\x27\x03\x75\xfe\x88\xd5\xc4\x9c\xf9\x5b\x06\xcf\x9d\x0d\xac\x81\xfb\xd9\xc0\xd7\xb8\x2d\x05\xed\x2c\x3f\xd4\x9c\xcc\x29\x40\x44\x41\x71\x25\x45\xf9\xa9\x91\xe4\xf0\xdd\xb6\x21\x90\x83\x82\x96\xf9\x67\x29\x9a\x38\x60\x72\x26\xd8\xa6\x81\xf0\xa8\xf3\xc4\x38\x4f\xd1\x8b\x30\x25\x7c\x46\x3c\x0a\xbd\x0f\x4f\x6f\x12\x25\xa5\x1b\x76\x2d\x6d\x0a\xc7\xd5\x9c\xd2\xef\xd6\x98\xb8\xd1\x3e\x23\xd7\x04\x09\xf6\xb0\x7d\x69\x5c\x16\x71\xcd\x6f\x59\x44\x3b\x1d\xb0\xab\x35\xb9\xdc\x06\x40\xe4\xc6\xd1\xac\x50\x47\x5d\x28\xef\x94\xf8\x17\x90\xe2\xe5\xb2\x54\x55\x14\xb2\xa4\x9c\x5c\x21\x53\x45\x9b\xe5\x40\x89\x0f\x53\xbc\x18\xe4\xa1\x6d\xcb\x5d\xcf\x50\xf3\x7a\x95\xc6\x06\xfd\xf4\x85\x98\xe5\x2a\xf3\x17\x9a\x20\x48\x61\x5d\x93\xd9\x7e\x05\x99\xb7\x08\x8c\x11\x74\xbb\x9f\x15\xe3\x70\x18\xf9\x9a\xcb\xce\x5b\x13\x02\xf8\xd8\xce\x2a\xb8\x54\x37\xfe\xeb\x0c\xaa\x77\x84\xdc\x83\xc9\xe7\xc3\x6f\xe0\x59\x90\x6b\x03\x0a\x86\xa3\xde\xd0\xab\x9d\x8b\x73\x52\x9d\x47\x5e\x66\x1a\x08\x08\xd6\xd3\xf0\x90\x7f\x85\x28\x87\x3f\x08\xd5\x74\x8b\xe1\xd6\x97\x12\xe8\x52\x62\xd7\x7b\xdf\x13\xbf\xd1\x8a\x5c\xde\x6f\x71\x46\x26\x73\xab\x29\xb1\x61\x73\x15\xa9\xa6\xe9\x36\xa8\xe8\x1a\x8e\x43\xbd\x0f\x66\x44\xa5\xc6\x9e\xaa\xac\x89\xbd\xaa\x99\xcc\xa8\x03\x83\x37\x05\xe5\xaf\xa6\x9b\x3b\xd1\xd0\x25\x2b\x85\x46\x50\xf2\x19\x97\x91\xe6\xac\xa7\xc7\x5a\x86\x12\x83\x21\x62\x33\xa2\x63\x3a\x6a\xef\xf9\xd3\x01\xee\x5c\xb4\xdd\x72\xc0\x8a\x45\xcd\xae\x8f\x54\x58\xc0\x95\xb2\x2e\x75\x9c\x43\xb4\x9b\x98\xe9\xf4\xcb\x33\xd5\xde\xa8\x79\x44\x9e\xae\x73\xcb\x87\x4c\x73\x59\x43\x25\xeb\xf6\x8c\x1e\xd4\x06\x4b\x6f\x61\xab\x2f\x01\x4a\x2f\x19\xf3\x2e\x12\xb3\x3c\x5e\xaa\x8a\x29\x20\x4d\x5e\xba\x58\xdc\x07\x50\x72\xfe\x39\x9b\xe7\xd1\xab\x18\x08\x20\x8f\xb4\x08\x12\x3b\xdc\x0b\x4a\xb3\x13\x0f\x9f\x70\x6d\xc3\xeb\x19\x4b\x60\x5e\x73\xa3\x2f\x12\x5a\xe4\x91\x28\x5c\xe6\x03\x9f\xb6\x23\xc3\x8b\x81\xd5\xab\xa0\xf5\x59\x9f\x6c\x86\xe8\x72\x48\x6b\x4e\x96\x49\xda\xff\xe3\xa3\xd0\x6c\xb0\x73\xdd\x3b\xc6\xf4\xe1\x0a\x18\x70\x0e\x45\x72\x2d\x78\xa6\xb0\x97\x2d\xc9\x4d\x5c\x7a\x7b\x66\x41\x75\x7b\x79\x60\x75\x71\x9d\x7b\x8e\xc3\x6a\x1e\x79\x6f\xb5\xf8\xfe\x6f\x1b\x79\xa0\x85\x9c\xb4\xd6\x7c\xec\x05\xed\x91\x4c\xfa\x32\xc1\xdd\xfe\x21\x8e\xf9\x63\x43\x6c\x3a\x11\x48\xac\x2c\xf9\x09\xdf\x73\x59\x89\x06\x57\x46\x3a\x4e\xa2\x5f\xed\x59\x61\x8a\x06\x81\xa1\x21\x7e\x22\xd6\x4e\xf9\xd9\xb4\x55\x9d\x0a\x0f\x6b\x3c\xe8\xd8\x47\x93\x0b\x23\x23\x01\xca\xf4\x4c\xdf\x7a\x3f\x18\xa2\xac\x13\x0b\x92\xcf\xd9\xc0\x33\x60\x55\x7b\x5f\x7c\x47\x75\x46\x2a\x10\x71\xf7\x03\x44\xc7\x18\x37\x4b"}, -{{0x03,0x3e,0x00,0x3d,0x7a,0xab,0x7b,0xc7,0xfc,0x8a,0xc2,0x04,0xc7,0x33,0x79,0x9a,0xe5,0x53,0xc3,0xfe,0xc5,0x3f,0x10,0xdb,0xf7,0x95,0xb5,0xf4,0xb8,0x7f,0x1c,0x95,},{0x68,0x2f,0x46,0xf5,0xc0,0x56,0xdd,0x45,0xba,0x0b,0x5a,0x78,0x20,0x31,0xf9,0x59,0x6a,0x73,0xaa,0x29,0x2c,0xa2,0x32,0x6b,0xed,0xa7,0x4a,0x52,0xfc,0x32,0xb7,0x16,},{0xed,0xb4,0xe0,0x20,0xd6,0x76,0xfa,0xc6,0xa8,0x45,0x53,0x48,0x80,0xbf,0x61,0x36,0x37,0x4a,0x8b,0x7f,0x2c,0x53,0x85,0xbb,0x9e,0xe2,0x25,0x38,0x1f,0x49,0x4e,0xfb,0x74,0xa5,0x5b,0x41,0x3a,0xe0,0xea,0x70,0xad,0xd6,0x1b,0xfd,0xfb,0x87,0xfb,0x42,0xd5,0xbc,0x0c,0x53,0x59,0xdd,0xdd,0x57,0x3d,0x53,0x8a,0xe9,0x3a,0x6b,0x36,0x09,},"\x59\x6a\xa2\xc4\x0b\x33\x18\x87\x89\x38\xeb\xc1\x38\xdb\x27\x4b\xb3\x8a\x52\x01\xeb\x7c\xaf\x87\x5e\x6c\x64\x57\x91\xda\xe0\x12\xbd\xef\xd4\x85\xe6\xbd\x9d\x84\x99\xc4\x2a\x2a\xe8\x6c\xf3\x2b\x18\x00\x2e\x76\xbb\x58\x2c\xca\x0d\xec\x48\x15\xde\xd8\xa1\x21\x1f\x8f\xc8\x85\x7f\xce\x1d\x57\xf6\x15\x1d\x88\x78\x7b\x97\x8f\xab\x56\xbf\x92\x6b\x15\x33\xe1\x94\x99\xe8\xbb\x99\x15\x8c\xdd\x6e\x98\x0f\x6b\xa5\x43\xae\x83\x1f\x9d\xd1\x34\xb0\xfe\x6d\x5c\x24\x88\x7d\xc7\xa8\xd4\x78\x1d\xd9\xb7\xfc\x5d\xc9\x46\x4b\x04\x5c\xbf\x9d\x1e\xf5\x03\x6b\x5b\xf2\x8b\x54\x9a\xc7\xaa\x8f\xaf\xb9\x1a\xdc\x9f\xec\xa7\xa1\x45\x54\xd1\x10\xe3\x10\xc7\x49\xe4\x85\x33\xf3\x59\xc7\x0f\x05\xfb\x7a\xed\xef\x13\x66\x36\xb8\xef\x72\x23\x88\x65\x39\x86\x4e\xe5\x2d\x34\x11\x8b\x4b\x8b\x74\xe0\x8f\xe6\xb6\x58\x96\xe4\xb1\x9b\x6d\x7c\x3f\x25\x28\x26\x55\x85\x48\x17\x10\xd2\xd7\x49\x48\xeb\x4b\x17\x08\xa5\x0f\xa7\x40\x21\xbd\xa4\xb3\x61\xbc\x68\xd2\xa5\xd2\x02\x10\x9f\x8d\x28\xd8\xaa\x67\xd7\x8c\x11\x36\xcd\x2e\x90\x3c\x8d\xfa\x17\x5a\xf7\xbd\x96\x3b\x73\xda\xe4\x95\x87\x3c\xcd\xae\x62\xbf\xef\x88\x56\x36\xdd\x83\x55\x0f\xf9\xc0\x5c\x37\xba\x33\x89\xd1\x54\x36\x85\xd8\x94\x83\xb0\xc1\x04\xe7\xef\xbb\x77\x02\xc5\xa0\x39\x8a\xc7\x20\x48\x4c\x50\x93\x68\x35\xee\x9d\xf2\x53\xf0\xef\x8c\xbe\xf3\xe0\x7d\xe9\x69\x51\x1c\xcb\xf8\x75\x57\x49\x3a\x0b\x97\x2e\xf0\xe8\xe6\x29\xcf\x38\x22\xdb\x21\x28\x6e\xd7\x27\x66\x1b\xd3\x17\x86\xfc\xa1\x42\x11\x06\xda\xcd\xee\x1c\xaa\xf4\x94\x54\xe8\x54\x79\x4f\x70\x4d\x22\xa9\x5a\x4c\x8e\x6b\x1c\x2f\xee\xa5\x7e\x56\x23\x8c\x20\x96\xf1\xcc\x57\x86\x47\xfe\xa5\x44\xd6\x76\x44\x82\xbd\xf5\x14\x88\x79\xa2\x5f\x94\x3d\xb1\x6f\x29\x02\x1b\x9e\xcf\xe3\xe0\x90\xb4\x25\xc8\x1c\x70\x09\x84\x2e\x1c\x7a\x02\xd9\x1c\xa6\x0c\x12\x01\xc3\xbd\xae\x9c\x53\x73\xaf\x03\xf2\xf4\xdb\xef\x40\xde\x8d\x9b\x21\xfe\xd6\x8d\xee\x51\x0d\xe0\x42\x72\x34\xca\xa1\xc2\x0a\x3a\xe5\x49\x95\x48\x34\xc9\x33\x73\xd9\x13\xb8\x75\x0f\x23\xa0\x37\x80\xd7\xa9\x45\x4e\xd6\xfe\x51\xfd\x2d\x27\x6b\x9d\x4a\xa3\x2d\xe0\x5e\x03\x81\x6e\x64\xe9\x46\x6f\x4f\x0e\x22\x46\x51\x42\x8d\x34\x2c\xbc\xc6\x97\x17\x0a\x47\xef\x99\x6b\xda\xcb\xce\x91\x11\x7c\xa1\xf8\x45\x5b\x25\xb2\xb0\x84\x43\xe9\x91\x4e\x3d\x90\xc4\x89\xee\xaa\x77\x31\xdd\xea\x21\x23\xd5\x5d\x67\xb1\x66\x83\xfb\x7c\x82\x36\xaa\xa5\xa1\xb0\xfc\xaf\x8d\x17\x00\x11\xdb\xe9\xaa\x28\x57\xbe\x61\x2c\xbb\x85\xef\x69\xe5\x68\x31\xb4\xda\xcf\xbc\x7a\x59\xb4\x65\xa6\x6d\xc7\x41\x2d\xdb\x3d\x6a\xf4\xeb\xfd\x70\x58\x64\xe7\xd4\xfb\x99\xa6\xcc\xb4\x8b\x11\x83\x68\xfe\xab\x02\xa3\x40\xc4\x32\x76\x8d\xe0\xe0\x67\x87\x1e\x9e\xa8\x08\xd6\xd9\x93\x81\x58\x29\xe7\x1f\x6c\x04\x2b\x66\x49\x95\x09\x8f\xee\x94\xd5\x43\xdf\x15\xe5\xb1\x69\x57\x03\x1b\xd2\x38\xbc\xad\xbb\xdc\xc5\x76\xaf\xfb\x64\x03\x03\xd6\x9c\x5b\x25\x0b\x3a\x53\x9a\xfd\x12\x7f\x7e\xe2\x60\x9e\x52\xe5\x15\x4f\xbd\xff\x3e\x45\xf9\xc4\x40\x66\x65\x6d\x56\x1e\x0f\x64\xdf\xf2\x80\x5d\xf8\x8e\x30\xa3\x80\x53\x08\x22\x41\x3a\x7a\xb7\x6a\x1b\x9a\x86\x53\x78\xd2\x47\x63\x06\x9a\x81\x40\x02\xa9\xa9\xd0\x37\x95\xca\x8d\x2b\x5b\xd1\x09\x03\x93\xe9\xe4\xb1\xff\x7d\x7f\x0e\xb8\x4e\x71\x2a\x01\x8f\x68\xc9\xe3\x84\xf0\xa0\xae\xf3\x96\x78\x79\x28\x4f\x40\x9e\x30\xd2\x36\x50\x86\xe6\x69\x52\x27\x8c\xa9\xb6\xf9\x0e\x8f\x69\xa4\x8d\x9b\x28\xbb\x4c\x4e\xd6\x32\xab\xca\x3a\xf4\x14\x4d\xa7\x42\x2b\xf5\x19\x92\xf7\x34\x73\x14\x53\xc7\xa3\x3e\x15\xe5\x9f\x53\x08\x12\x9d\x6a\x77\x4a\x94\x58\x6f\x72\x33\x11\x17\x91\x76\xc0\x94\x8f\xff\x4e\x30\xc1\xb9\x59\x81\x2c\xac\x97\x7c\xc7\x43\x47\xb0\x07\x94\x0f\x2f\xb9\x62\xa9\x0d\x66\x06\x6a\x6d\xe8\x80\x19\x84\xde\xe4\xa5\x32\xd4\xb0\xac\xd6\xdc\xaf\x06\x72\x7b\xab\x70\xb3\x86\x62\x32\x23\x4c\x91\x00\xbf\xdc\x66\x9f\x77\xca\x49"}, -{{0xee,0x55,0xfc,0xf7,0x0a,0x27,0x5c,0x72,0x6b,0xd4,0x85,0x66,0x83,0xb3,0x47,0xde,0xcf,0xd4,0x22,0xf1,0x82,0x6c,0x07,0xa9,0x32,0xcb,0x85,0xbe,0x9f,0xa4,0xef,0x3c,},{0xdf,0xcf,0xfb,0x5e,0x15,0x53,0x78,0x9d,0x56,0xa9,0xf3,0x91,0x4b,0xce,0x50,0x0d,0x07,0xc5,0xac,0x31,0x1f,0x92,0x78,0x54,0xb2,0xcf,0x1e,0x58,0x33,0xc0,0x32,0x37,},{0x9d,0x8c,0xb2,0xea,0xf3,0xff,0x3e,0x0c,0x2b,0xc6,0x72,0xe1,0xd2,0x55,0xc5,0xb8,0xe8,0x07,0x31,0xbf,0xf6,0xf6,0xab,0xa5,0x17,0xe1,0x33,0x54,0xe8,0x51,0x08,0x0f,0x4a,0x8b,0xb8,0x12,0x1b,0x26,0x24,0x24,0x4c,0x9e,0xe9,0x5c,0x8a,0x09,0x2f,0x10,0x37,0x03,0xfb,0xe6,0x6f,0x9c,0xba,0x10,0x0d,0x2e,0x91,0xed,0x77,0x4a,0xc9,0x07,},"\xb8\xc8\x45\xcf\x7c\x54\x85\xf0\x62\x2d\x1d\xdc\x17\xf7\xa0\xf6\xf0\xfd\x70\x74\xfe\x19\x4b\x0e\x0c\xd4\x26\x50\xcf\xc8\x17\xf5\x7f\x09\x5f\x8c\xdf\xad\x1e\xbe\x0d\xfb\xc1\xbd\x76\x17\xab\x4f\x20\x4e\x9d\x55\xd8\x1a\x7c\x8a\x43\x39\x40\xec\x6f\x17\xc8\xa8\xe3\xd5\x6c\x1a\xfb\x0a\xf3\x74\xbd\x32\xd5\x4e\xf7\x13\x2d\x26\xb8\x9c\x47\x0c\x2a\xb5\xbe\x16\xfa\xbb\x4c\x75\x19\x3d\x6d\xa5\x9b\xa2\xfd\x15\x7e\x9e\xa4\xe0\xc5\xc0\x8a\x52\x02\xf5\xed\xc6\xa6\x17\x01\xf0\x8b\xb3\x44\xca\x64\x55\xd7\x5d\x14\x5a\xdb\x24\x4c\x53\x4c\x8c\xfc\x62\x3f\x4d\x4b\x67\x67\x59\x4b\x39\xa7\x69\x0b\xee\xec\x4d\xf9\x74\x6a\x57\xff\xee\x05\x14\x54\xc4\x27\x8e\xa4\x3c\x81\x0f\xf1\x3c\xd7\x69\x61\x5f\x9d\x05\xd4\xfe\x4a\x51\x58\x3e\x80\xc0\x15\xdc\xfe\xd9\xaf\x05\xf9\x3d\x05\x4d\x34\xff\xd9\x39\xbd\xd8\xf0\x51\x8f\xa3\x03\x0a\x96\x4d\xc9\xd8\x0d\xf0\x0f\x16\x35\x82\x40\x72\xcd\xf2\x9b\xc8\x02\x59\x20\x9d\x50\xf5\x6f\xca\x9f\xbd\x6a\xe1\x51\x4a\x67\x19\x89\xce\xa4\xf6\x84\x6b\xc1\x91\x79\x09\x7c\xca\x40\xc6\x24\xd7\xed\xbf\x91\xfb\x5b\x25\x39\xeb\xbd\x50\x2d\x36\x46\x71\x14\x30\xba\xe4\x23\xfd\x11\x58\x48\x09\x33\x18\xb7\xd0\x87\xef\x1e\x3b\x89\x4b\xc3\xb9\xea\x27\xaf\x85\x3f\xca\x85\x95\xd3\x6f\xb7\x29\x99\x69\x16\x2f\x2e\xd6\xa2\xb5\x50\x75\xb2\xc6\x30\x80\x28\x57\x17\x6d\xec\x4c\xb5\xac\xf2\xb1\x3a\x35\xa9\x94\x9b\x91\x2b\xb5\x7d\x81\xeb\x0c\x8a\x8a\xdf\x3c\xf6\x4c\xb5\x71\xbf\x5f\x3d\x71\xf9\x87\xd6\x4d\x74\xe9\x19\xa0\x03\x36\xe5\x7d\x35\xee\x4e\xec\xfc\x65\x70\x00\xdd\x5b\x12\x99\x5e\xe1\xb1\x16\x59\x1c\xe5\x8e\x56\xde\x25\xb2\x9c\x94\x82\x9d\x1d\x68\x52\x1b\x95\x58\xe4\x72\x5e\xc7\x70\x39\x06\x9c\x0c\xd1\x7b\x2a\x00\x33\x59\xe9\xe1\xe1\x12\xc7\x59\x01\x76\xce\xbc\xe7\xf0\x01\xf1\xd1\x36\xe8\x18\xf4\x81\x8c\xfd\x94\x74\x5a\xfa\xab\x56\xf1\xa4\x06\xf9\x7d\xd9\xe6\x1b\x73\x52\x66\xd6\x82\xad\x7d\xf2\x6d\xd7\x0c\xde\x0b\x57\xfe\xa7\xdb\x2d\xf8\x32\xfa\x88\xa3\x5f\x53\x97\x94\x88\x4d\xdc\x41\x21\x84\x03\x01\x6c\xb6\xd5\x22\x1f\x3f\xeb\x5d\x3a\xee\x4a\x98\x40\xa9\x13\x07\x2d\x29\xf8\xd1\xa9\x36\x7b\xb0\xbb\xf5\x45\xf7\xda\xe7\xc0\x0a\x0d\x0c\x03\x42\x23\x1a\xe4\x62\xbb\x74\x2e\x14\x98\xee\x58\x4a\xe6\xc8\x3f\x2f\x1f\x2d\x04\x52\xbe\xad\x98\x22\x68\xcd\x3c\xfd\xe7\x8f\xf4\x22\xe2\x26\xbf\x7b\x2a\xf1\x13\x77\x57\x79\x7f\xb0\x2e\x52\x75\xc3\x48\x09\xd5\x4c\xa9\xee\x2a\x65\x27\x5e\x6e\x5c\xff\xdd\x20\xad\x1f\xa1\xee\x0b\xd8\xb2\x1e\x04\xce\x82\x9e\x02\xcd\xb6\x3c\x48\xbf\xcd\xd8\x6d\x3a\x08\xc5\x97\x89\xc9\xd7\x8e\x36\x18\x1d\xef\xeb\x72\x27\x10\x72\x75\xed\x6b\x5c\xcb\x12\x7c\xd7\x2b\x37\x4e\x17\xf5\xee\x0b\x5e\x47\xb4\xb3\xe1\x4a\x8e\xc6\xd8\x6b\xb7\x50\x71\x87\xf2\x8d\xb3\x2b\x3f\x3f\xa1\xca\x13\x44\x6f\xe5\x25\x3e\xe7\x83\x64\x5e\x79\x42\x72\x79\x9a\x86\x3b\x4f\xca\x99\xe4\x43\xcb\xaa\x05\xde\x3c\x50\xed\xf3\xd5\xcd\x7c\x10\x52\x9c\x6c\x09\xa0\xc1\x45\x34\x06\xac\x7e\xca\xfa\x9b\x3a\x1f\x36\x9d\x68\xf3\xc6\x18\xf5\x8e\xfc\x35\x9d\xf2\xf3\xfc\xd2\x47\x8b\x55\xa4\x1a\x11\xf2\x48\x7e\x7f\x70\xec\x29\x3b\x3e\xcc\xc7\x00\xef\x44\x4a\x33\xd1\xea\xe9\x84\x9c\x5b\x76\xd2\x9a\xfd\x5a\x23\x86\x1a\xef\x4f\x2a\x7b\xa3\xf6\x66\x30\x1f\xde\xb5\xd3\xd8\xf0\xdc\x9e\xe2\xe0\x14\xb2\x4c\x74\x65\xde\xe3\xc0\x96\x4e\xdd\x49\xed\x49\xed\xab\xb5\xca\x7a\xfb\x99\x57\x4d\x00\x1e\x58\x12\xa0\x85\x23\x1f\x24\x1b\x6b\x08\xc7\x3e\x80\xfb\x44\xbb\x2a\xdf\x55\x4f\x14\xfd\x6d\xce\x94\xa6\xf6\x36\x23\xd9\xc1\xde\xb4\x1a\xd1\x01\x65\x1a\x6b\x67\xae\x52\x34\xda\xae\x81\x97\x9f\xbd\x82\x33\x89\x64\x9a\x3b\x0a\x06\xc6\x8b\x80\x46\x8a\x99\x1d\x30\x07\x74\x87\x51\xfa\x69\x28\x1d\xb1\xb9\x4d\x6c\x16\x0a\x1c\xab\x50\x94\x3c\xdb\xb8\xde\xa5\x75\x09\x06\xb3\xc6\x59\x5b\xb5\x80\xde\xdb\xfa\xe5\x74\x64\xcc\x7a\x65\x1d\x4c\x51\xdb\xb5\xfa\x98\x05\x97\xd1\x76\x69"}, -{{0x49,0xc2,0x98,0xa2,0xdb,0x3d,0x25,0x89,0xc9,0xfe,0x16,0xa4,0xe5,0x71,0xe5,0xaa,0x23,0xcb,0xaa,0x77,0x7b,0x86,0x47,0x02,0x90,0xa3,0xed,0xa7,0xa5,0xd3,0xe9,0x6b,},{0xda,0xc5,0x23,0xd6,0x37,0x4c,0x8f,0xf1,0x5f,0xc4,0xdd,0xc7,0x13,0x71,0x5a,0xc3,0x5c,0xf5,0x54,0x7f,0xc1,0xb1,0xb2,0x64,0x6b,0x63,0xfb,0x41,0xa7,0xf2,0x16,0x21,},{0x2a,0x43,0x9c,0x73,0xc9,0x81,0x17,0xfb,0x29,0x52,0xe2,0xb1,0x61,0xf7,0xf3,0xb9,0x9e,0x7d,0x39,0xbc,0x69,0x7f,0x79,0x40,0x75,0xdb,0x7b,0x63,0x4d,0x29,0xf1,0xff,0x57,0x24,0xf6,0x77,0xf8,0x31,0x2a,0xd5,0x15,0xb0,0x97,0xcc,0xa9,0xdf,0xc3,0x0e,0x79,0xee,0x8a,0x7c,0x9d,0xd7,0x28,0xbd,0xd4,0x5d,0xf8,0x59,0xc7,0xbd,0xe3,0x0a,},"\x35\x82\xee\xb0\xd3\x71\xdf\x38\x5d\xe8\x8b\xaa\xd3\x80\xcb\x0c\xdb\x60\xea\xb2\xba\xeb\xb3\xc7\x98\x37\x75\x3d\x08\xe1\xcb\x78\xc0\xbd\x76\xdd\x11\x04\x45\x49\x56\xd5\x71\xce\xb7\xe6\xb5\x71\xa5\x23\x68\x35\xd7\x84\xb5\x0f\xf6\x60\x57\xb1\x35\x95\xe7\xd0\xc8\xf2\x5d\x08\xae\x8b\x54\xb6\x12\x3b\xa0\x81\x51\xac\x7d\xb0\xc5\x6a\x98\x0f\x7f\x0b\xb3\x9a\x54\xb4\x37\xf5\x48\x51\x97\x99\x86\xab\x13\x67\x83\x5e\x5c\x4f\x3a\x3b\x3d\x76\x0d\x38\x27\xe7\x6c\x56\x8a\xe7\xae\xbb\xb6\x12\xe7\x75\xbd\xde\xcc\xd3\x34\xac\x6b\xcd\x32\x53\xab\xc2\x9d\x4b\x7c\x3f\x10\x36\x26\x66\xf6\xae\x75\x08\x03\x70\xa3\x6c\xba\x55\xdb\x3a\x91\xcb\x57\x89\xe4\xd6\xf9\xef\xea\x4d\xf1\xdd\x77\x30\xa5\xe2\x79\x60\xd5\x3b\x51\x21\x94\x8c\xce\x5a\xf6\x53\xff\xf1\xd5\xb4\xe5\xb0\xa8\x8c\x71\x8c\x49\xb3\x1c\x79\x3d\x88\xc1\xcc\x45\xab\x8d\xa2\x9d\x05\xe9\x06\xcd\x05\x94\xb5\xf6\x63\x8c\x8e\xc3\xf1\x76\x0b\xa4\x23\xb5\xab\x1d\x08\xa5\x87\x70\xaf\xb0\xf1\x39\xab\xd3\x49\xc1\xbf\x16\x0d\x89\x02\x23\x9c\xe2\x4f\x19\xb4\xe1\xbe\x09\x5f\x7e\xd1\x65\xf3\x93\x1e\x3c\xbc\xc3\x07\xe9\xfc\x5c\x65\x80\x31\x22\x8e\x55\xcb\xbe\xec\x0d\x0b\xcf\x8f\x69\x51\x54\xa9\xee\xd1\xbe\xf3\x52\x28\x78\x9b\xfc\x0d\x23\x8b\x83\x72\xd3\x18\x32\x8c\x13\x39\xfe\xa0\x88\x14\xdb\x86\x21\xab\xca\x3a\xeb\x82\x09\x8b\x5a\xa8\x7b\xb9\x8f\x5e\x40\x52\x2a\x08\x88\x53\x2c\x17\x48\x45\x3d\xb2\xd2\xb3\x94\x3e\x4a\xbb\x31\x2d\xe3\x19\xae\xc4\x8c\xc1\xc9\x47\x75\x97\x29\x53\xfb\x64\x96\xb8\x16\x89\x37\x62\x35\x10\xcd\x48\xc8\xb2\x47\x95\x6d\x31\x68\x48\x6c\x17\x6a\xe7\xa4\xcb\x38\x4e\xac\xfd\xab\xfa\xdd\x9f\xba\x30\xa2\x3b\x81\x1b\xd7\x79\xf3\xcb\xa5\x43\x38\xc2\x8b\xb3\x38\x22\x38\xed\x3b\x8d\xd2\x1b\xea\xb2\xf5\xca\xde\x28\xc5\xe0\x9b\x31\xa4\x54\x80\x8a\x53\x48\x12\x2e\x3a\xe3\x81\x22\x96\xf7\x86\x9c\x38\x65\xc3\xc9\xd8\xfe\x18\xbd\x81\x2f\x2e\x60\xe9\x14\x97\x5c\xfe\x1b\xef\x8d\xbb\x80\x97\x00\x6f\x0d\x7c\xf3\xfc\x15\xeb\x95\xc2\x78\x54\xb1\x43\x12\xb8\x8d\x52\x80\x15\xaf\x69\xfb\x75\x05\xb8\xf3\x27\x03\xf6\x4e\xb1\xc9\x58\xf0\x46\xdd\x25\x12\x42\xf8\xbe\xa7\x46\x7f\xc7\x29\x1d\x09\x5e\x96\x96\xe1\x1a\xa4\x5a\xbe\x79\x24\xe8\x56\x35\x15\x35\xaa\x07\x73\xd3\xd9\xe6\x1c\xc9\xa2\xd8\x9b\x5b\x07\x74\xd7\x64\x5e\xe1\xaf\x7e\xb6\xfc\xd4\x40\xbc\x69\xd4\x3e\xde\xaa\xf9\x35\xfd\x2a\x52\x95\xac\x19\xa9\x7d\x70\xaf\x92\x98\x83\x0f\x81\xc0\xa5\x09\xf2\x42\xf4\x73\x37\x24\x78\xfa\x58\x79\xfb\x2c\xb8\x51\x10\x80\xfc\x2e\xcd\x82\x59\xb8\xc3\xce\x9e\x8b\x64\x07\x61\xdc\x79\x27\xc3\x2e\x7f\x5b\xae\x97\xa8\xb8\xac\x93\x56\x62\xe5\xf4\x5d\x14\xca\xd6\xd3\x4a\xff\xc9\xa1\x94\x14\xc4\x56\x6f\x45\xf9\x77\x39\x67\x10\x89\x4c\x53\x99\xed\x44\x80\xf1\x8e\x90\x95\x7f\xaa\x76\xcc\xb5\x12\xa2\xd0\x75\x73\x05\x8a\x95\xb4\x2f\xe1\x81\x02\x49\xd1\xc8\x5e\xc4\x31\xa0\x49\xd1\xae\xcb\x0f\x11\x83\x79\xbd\xc3\xf1\xee\x49\x0b\xc8\xa0\x54\xc3\x2c\x3d\xac\x76\x59\x96\x6c\xdb\x66\xf9\x95\xac\x40\x3d\x5e\x79\xeb\x6b\x25\xb3\xf3\xf6\x5a\x6c\xee\xc2\x20\xd6\x6c\x05\xf8\xa8\xa9\x8b\x80\x79\x9b\xa4\xf2\xc6\xdb\xbb\x4d\xfb\x58\x62\xc9\xa4\x6b\xca\x01\x3e\xbd\xfa\xba\x74\x94\xa3\x0c\xe1\x46\x06\xaf\xc0\xb0\xf9\x93\x14\x3f\xed\xee\x78\x96\xd9\xa6\xbb\x81\x49\x91\x66\xed\x02\xe9\x41\x86\xaa\xf3\x21\x87\xae\xb6\xe2\x82\x50\x1b\xca\x43\xb5\x7b\x7e\xfa\x09\x39\xc9\x34\xbc\x8f\xbb\xd2\x6c\x44\xb6\x18\x33\x5a\x35\xc6\x92\xff\x99\x6a\x5b\x95\xd3\x27\xdf\x9b\x2a\x66\x21\xb3\xb0\xf1\x90\xdb\x1f\x36\xd9\x11\xd1\xa6\x63\xa4\xeb\xf9\xa2\x85\x4b\xb4\xf4\x06\x10\x95\xb6\x98\x12\xc8\x2c\x2f\xfe\x3f\x92\xe9\xb4\x4d\x2e\xa6\x31\x69\x88\x1c\xae\x84\x53\xd6\xee\xf7\xcf\x69\xc2\x5a\x28\xb3\xf8\xdd\xc7\x01\x48\xef\x26\x72\x1a\x3c\x1f\x2e\x62\xd9\xd1\x0c\xea\x42\xfc\xa3\xfa\xcd\x74\x67\x3a\x4e\x7f\x33\x50\x73\x64\xaa\x28\x6c\x0f\x38\xd7"}, -{{0x82,0x3f,0x0c,0x29,0xfb,0xfd,0xd3,0xd1,0x82,0x8f,0x30,0x55,0xe9,0xec,0x01,0xff,0xd1,0xb5,0xa3,0x75,0x11,0x8d,0xdd,0x7e,0x4e,0x0c,0x43,0x71,0x9f,0x57,0x3f,0xf7,},{0x73,0x12,0x5f,0xc8,0x3a,0xbb,0x8b,0x7c,0x65,0x85,0x59,0xfc,0x12,0x73,0x93,0x23,0x1d,0x03,0xca,0x58,0x46,0xe0,0xc8,0x81,0x18,0xd1,0x3d,0x55,0xca,0x44,0x78,0x9d,},{0xfa,0x74,0x7b,0x6f,0xe3,0x38,0x1a,0xd6,0xbc,0x82,0xa9,0x56,0x43,0xc1,0xf4,0xa2,0x0b,0x76,0xba,0x73,0xbf,0xf0,0x0e,0x63,0x5d,0x64,0x20,0x2d,0x8b,0x0d,0xf0,0x3d,0xbc,0x56,0xb0,0x13,0x8b,0x3a,0x6d,0x41,0x98,0xff,0xaf,0x58,0xcc,0xd3,0xd3,0x88,0xed,0x25,0xeb,0xcf,0x77,0x04,0x43,0xe4,0x1e,0x9d,0x21,0x47,0x95,0x0a,0x30,0x0b,},"\x80\x2c\x39\xce\x7f\x2a\x50\xbd\x81\x62\x2a\xdd\x0d\xf4\xe0\xfe\x03\xec\x3d\x2d\x30\x5a\x45\xa6\x16\x52\x71\xed\x79\xad\xd2\x43\xb9\xa0\x0e\x52\x18\x31\x92\xfe\xb2\x4c\x4f\xdb\xd2\x2c\x80\x7a\xe1\x00\xef\xcf\x16\x5b\x9c\x99\x61\x94\xe0\x0f\xa8\x17\x76\x5e\xa9\x4a\x03\x07\x0e\x48\x66\x86\xb4\x45\xfc\xb2\x63\xcc\xfe\x1f\x58\x62\xf3\xb8\x4b\x10\xf3\x90\x08\x0b\xfc\xae\x44\x7a\xe0\x06\x97\x42\xb8\x61\x8f\xa9\x57\x5f\x7e\x63\x7a\xd5\x4e\x83\x4c\xaf\x03\x94\xd7\x45\x03\x2c\xe1\xe2\x55\xc0\x27\x32\x50\xf1\x50\x4b\x37\xa0\xad\xd9\x4a\xa2\x45\xc7\xde\x52\xc8\x0e\x05\xd6\xe0\xa9\x6a\x14\x41\x05\x43\x82\x6a\x49\xe9\xb9\x45\x62\x6d\x4e\x89\xf5\x50\x27\x16\x3d\x4b\xd6\xd0\xe9\xbd\x1a\x24\x77\xf6\x7d\x3d\x56\x68\xa4\x2e\x94\xd8\xb6\x11\x93\xd8\x21\xe0\xd1\xb2\x30\xfc\xad\xc5\x36\x13\xb7\x5b\x02\xcf\xb8\x15\x84\x56\x07\x7e\xbd\xf5\xa5\xf0\x0c\x3b\x5b\x18\x63\x70\xca\xfe\xc4\xa2\x1c\x69\xdc\xe1\xf0\x1e\xfe\xf2\x3c\x37\xab\x90\xf8\x58\x23\x8a\xef\xbe\x21\x2b\x55\x6d\x2f\x07\x34\x06\x55\x9f\x1a\x51\xd8\x4e\xff\xfd\xce\x07\xb0\x0d\x01\xbb\xf3\x37\x71\xcc\x12\xc9\x60\xac\x89\x36\x5a\x9c\x82\xc5\x23\x43\xf7\x60\x33\x81\xb8\x90\x23\xc1\xa6\xe7\x02\xa5\xb1\xe4\xbd\x19\x1e\xa6\x97\x0b\x5e\xa4\x51\xea\x05\xb5\x9b\xf8\x3e\x55\xf2\x9a\x1f\x80\x32\x12\xbb\x2e\x58\xf0\x61\x63\x33\xd9\x11\x47\x08\x52\x9e\x8b\x6c\x60\x81\xde\xeb\x7c\x29\x9a\x5a\x2a\x53\xcc\xd2\x4e\xd5\x8f\xfb\xfe\x50\x3d\x80\x61\x4a\xdb\x05\xca\x11\xcf\x29\xde\xd0\x09\x04\xea\x12\x39\xf8\x2b\xa4\x0c\x79\x3e\xbc\x33\x97\x75\xf8\xb0\xfe\x39\x01\xf5\x48\x2e\x31\x0c\x79\x3c\x6e\x2c\xf0\x1d\xc1\x57\x72\x7a\xf2\x38\xf4\x9c\x98\x62\x80\x4b\x04\x75\x51\xfd\x88\x6f\x4a\x48\x99\xe2\x2a\x6a\x65\x70\x11\x17\xa3\x85\x80\x55\xbb\xfe\x96\x6e\x37\x0e\x73\x3e\x17\xef\xad\xa2\x85\x9f\xd8\xff\xa9\xe0\x1f\xce\x56\x06\xa2\x55\x36\x76\x78\xf4\xbd\x4e\x21\xe5\xda\x0f\xef\x30\x75\x7f\x34\xe3\x89\xf7\x6b\x7d\x57\xc4\xe4\x10\xa0\x02\xe9\x00\xe4\x8f\xb2\x18\xc8\xf2\x77\x8f\x14\x8f\xee\x56\x96\x5f\x5b\x47\x3e\x25\x25\x6c\x23\xa7\xaf\x19\x83\x42\xcf\x3e\xf0\x2b\x84\xdf\x2c\xd5\x80\x0a\x46\x1c\x1b\x07\xbd\xa2\xf4\x26\x28\xa6\x8a\xd2\x9d\xbb\x82\xa4\x70\x96\x7d\x73\x02\xc9\x93\xb2\x34\x13\x6e\x5b\xf2\x55\xe6\x24\x8b\x10\x2c\x2b\xff\xb2\x01\x72\x37\x1f\x1c\xa3\xe1\x0b\x08\x10\xe8\x64\x95\x03\x54\x6d\x9a\x73\x1c\xf1\x9b\x08\x33\x57\xd4\xcf\xec\xc8\x9b\xed\xb5\x35\x06\xfe\x19\x9b\x67\x03\x91\xa6\x20\x06\x9a\x30\x81\xf2\x53\xb4\xd7\x90\x88\x0a\xa2\x3b\x53\xe9\x7c\x75\xdc\x0c\x36\x05\x40\xe5\xb0\xa3\xef\xb1\xac\xcf\xfd\x13\x74\x14\xff\x84\x23\xd5\x46\x46\xfc\x56\xba\x5f\x53\xbd\x84\xc7\x26\x7c\x2f\x7e\xe3\xe3\x76\x07\x54\x41\x54\x36\x5f\x9f\x85\x08\x1d\xd7\xd2\xee\x75\xd3\x02\x27\x5c\x79\x9e\xf2\x42\x7c\xa6\x49\x63\x55\xdc\xda\x1d\x44\xe0\xd9\x77\xbf\x68\xdb\x30\x06\x50\x0a\xe3\xf4\x00\xd6\xa8\xc7\xcf\x47\x05\x7d\x4f\xc8\x7e\xee\xcb\x02\x11\x6b\x73\xee\xd6\xce\x1f\xcc\xef\x6e\x8f\xb8\xae\xa3\x63\xb2\xf6\xf5\x32\x2a\x5f\x07\x53\xf4\x58\x99\x53\x76\x46\xd5\x86\x51\xbe\x90\x37\xbf\x91\x42\x3c\x29\x86\xf5\xcc\x2b\xcb\xce\x4f\xae\xc9\x03\x49\x8b\x40\xfc\x2d\xea\xb6\x60\x3d\x6e\xea\x58\x5d\x27\x20\xd2\x1b\xb2\x72\x2b\xc0\x5b\x35\xae\xd2\xbc\xc0\xe8\x04\xfe\x9d\x23\x9f\xaf\xda\x7d\xda\xfe\x1d\x78\x60\xab\xb0\xfb\x28\xf4\xbf\x2b\x1f\xbb\x62\xa7\x86\xe4\x55\xbe\x02\x4b\x19\x3b\x78\x30\xbe\x0d\x55\x8f\x02\xc9\xf3\xae\x31\xdc\x10\x7e\xe9\x42\x1d\xc5\xf0\xb0\xf8\x94\x02\xb7\x1a\x45\x81\x40\x15\x36\xbc\x47\x30\x85\x06\xd9\x69\x39\xa2\x06\x36\x27\x44\xe2\x7d\xde\x94\x4f\x40\x96\xa1\x2b\x5f\x63\xda\xb6\x4d\x04\x14\x84\xd3\xfd\x91\xa6\x2c\x2f\x0e\xf9\xae\x78\x74\x22\xeb\x27\xfe\xd0\x80\x2e\x25\xf9\xbc\x77\x5c\x49\x15\xa8\x37\xfe\x3e\xb7\xb9\xd5\x84\x3e\x4d\x82\x10\xc6\xb4\x94\xb6\x12\x81\x63\x7a\x6b\xe3\x20\x52"}, -{{0x65,0x67,0x66,0x33,0x37,0x42,0x14,0xc4,0xac,0x4b,0x7b,0xce,0xa9,0xf1,0xcc,0x84,0xb1,0xb7,0xe7,0x94,0x11,0xe3,0x10,0x52,0x5a,0xce,0x38,0x5f,0x45,0x66,0xc1,0xd5,},{0x0e,0x6e,0xc5,0x80,0x1d,0x8b,0xd6,0xb1,0xeb,0x42,0x14,0x21,0xa1,0x40,0x8f,0x13,0x4c,0xf7,0x12,0x33,0x8e,0x0f,0xfc,0x24,0xcd,0xcc,0xdc,0x4f,0x7f,0xa3,0x1d,0xbe,},{0xe0,0xb8,0x67,0xc9,0xdb,0xda,0x35,0x32,0x34,0x33,0xc0,0x46,0xe0,0x83,0x0c,0x25,0x1b,0x43,0x46,0xc5,0x39,0x59,0x72,0x28,0x6b,0x3a,0x72,0x31,0x0e,0xd4,0x52,0x6e,0x54,0x5d,0xc0,0x9d,0x39,0x18,0xf2,0xeb,0x99,0x20,0xbc,0x9b,0x24,0x1e,0x90,0x50,0xd8,0x48,0xd3,0x83,0x02,0x88,0x65,0x15,0x91,0xf9,0x36,0xd3,0xba,0xe4,0x53,0x01,},"\x9d\x62\x2c\x20\x67\x87\x69\x40\x93\xc6\xf2\x9f\x93\x61\x9f\x21\xbb\x64\xc0\x39\x41\x6d\x20\xdc\x70\x8a\x08\x4a\x9d\x2e\x49\x0c\xf5\x65\x8e\x13\xd6\x2c\xb0\xd2\x1e\xab\x00\xe4\x2d\x85\x1b\xc6\xec\x75\xda\xf4\x05\xd2\x37\x32\x46\xee\xa4\x15\xe8\x66\x29\x1b\xab\xf7\x64\x97\x68\x0a\xaf\x04\x42\x5a\x42\x55\x2b\x10\x7d\x58\xcd\x18\x56\x1c\x8c\x94\x83\xf7\x40\x74\x4c\xbf\xa6\x05\x4c\x1b\x12\x6f\x5a\x76\x65\x9a\xc1\x9d\xdd\xad\x4a\xb5\xa0\x91\x55\xd8\xc0\x50\xb5\x35\x4e\x06\xa4\xdd\x3e\xe3\xa6\xf9\xc9\x1e\x8b\x4c\x7a\xf2\x74\x96\x64\xe7\xab\xe9\x70\x61\x58\x9e\x15\x3c\x58\xe2\x7c\xf2\x99\xa2\x5f\x2b\x53\x0c\x06\x07\x31\xec\x0f\x43\x66\xbd\x1d\xeb\xeb\x4d\x4e\x91\x2e\x76\xe5\x08\x53\x4d\x43\x3e\xc4\x8f\x96\xb6\x2e\x15\x0d\xe9\x39\x63\xa1\xb3\xe6\xc8\x09\x1b\x49\x5a\x96\x51\x8c\xe3\xd3\xb9\xa8\xdb\xdc\x2a\x13\xfd\xd0\x77\xf2\x23\x1d\xe8\xd7\x6f\x56\xd9\xab\x1c\x2f\x9e\xfa\xbc\xe4\x63\x83\x64\xf8\xfb\x2a\x2c\x68\x3c\xa8\x19\xb7\x03\xab\x45\x3b\x11\xd3\x7a\x69\xfa\x4b\xcb\x80\x23\x98\x08\x34\xf7\xb9\x02\xad\x18\x19\xfc\x02\x92\x12\xfd\xea\x0a\xbf\x11\xde\xc8\x8c\x55\xd6\x8e\xf8\x7a\x26\xdb\xb1\x5d\xc3\xd3\xdf\xbc\xdd\xdd\x5e\xd7\x1b\xe8\x6f\x32\xc7\x6e\xe2\x22\x1d\x92\x43\x68\x3d\xf9\x51\x65\x64\xb2\x6b\xab\x5c\x84\x5d\x4d\xfe\x0a\xdc\xc7\xcb\x9f\xe1\xee\x2c\x05\x1a\xf5\x90\x8c\xe0\xcc\x3a\x90\x90\x4d\xbc\x0d\x36\x80\xed\x49\x92\xf4\x6c\xe2\x5c\x2e\xe8\x51\xc4\x14\xf0\x18\x7d\x89\x3e\x5c\x3b\x01\x89\xa7\xbb\x68\x93\xd6\x83\xf5\xe3\x39\x4c\xc0\x46\x29\x9a\x16\xa1\xc1\xb5\x69\x59\x33\xa8\x9b\xb1\x30\x30\x85\x5b\x81\xb3\xc7\x46\x85\xf7\x19\xde\x01\x60\x57\x5a\x0f\xf0\xa9\x1f\xd9\x43\x47\xb8\xbc\xbe\x12\x5d\x1d\x3f\x9c\xe7\x72\xa8\x12\x6e\x00\xf5\x63\xb3\x18\x96\x56\xd5\x52\x2c\x18\x7a\xb8\x31\xa7\xad\xe7\xac\x06\xfd\xca\xc7\xf1\xd4\x58\x82\xe5\x1f\x9b\xf5\xb4\x4a\x2d\xab\xa4\xa5\x3d\xbb\x31\x97\x0b\x4a\x0f\x12\x72\xfe\x14\x08\x7e\x0c\x3c\x7e\x45\x42\x31\x2f\xe7\x4d\x76\x7f\x21\xe7\xea\x48\x7d\x52\x84\x28\x4f\x46\xf2\x0f\x32\xc5\xb1\x6e\x1e\x0a\xc8\xd7\x96\xab\x2f\x80\xb3\x44\xe7\xa8\xd8\x4d\x5d\xe8\x23\xa5\x08\x97\x75\x2d\xc5\x49\xa4\x8f\xc1\x0b\xcd\x43\x6a\x7a\x93\xe9\x7c\xd0\x5d\x78\x30\x13\x8f\x32\x38\x79\x68\x0c\x34\x3c\x16\x46\x7d\x26\x4d\x74\x9b\xf4\x5e\x40\xf3\x9f\xbc\x3a\x00\xc4\x3b\x00\x69\x3b\x01\x56\x76\x8f\xf2\xe3\xf8\xad\x9e\xb6\x40\x50\x22\xf5\xca\xda\x66\x94\xe8\xa3\x3c\xdc\x59\xc6\x67\x3c\x44\x11\x72\x44\xeb\x03\xfd\x7f\xd6\x75\x93\x0c\x29\x4e\xdd\x29\x40\xf5\xf1\x80\x95\x3d\x91\x0c\x55\x48\x5b\x20\x57\xae\x0c\x93\x02\xf4\xa8\xe8\x31\xa5\x53\x0e\x3c\xbb\xf6\xf4\x72\x22\x40\x83\xa9\x52\xa8\x39\x0a\xb0\x0d\xc0\xf6\x9d\xfd\x88\x0e\xea\x2d\x73\x9d\x21\x8d\x6a\x66\xf2\x37\xf1\x0d\x44\x01\xaa\x75\x8f\xf8\x12\x0c\x0a\xe2\x76\x61\x27\x84\x90\x24\xf5\xa4\xcc\x57\x4a\x5b\x02\xb9\x35\x96\x68\x12\xcd\x1f\xb6\xd7\x9d\x0c\x4f\x59\xff\x80\xf0\x35\xa0\xb1\x09\xcc\xcb\x22\xfb\x08\x53\x5b\x87\x41\x49\xed\xf2\xa0\x97\x0c\x14\x88\x84\x27\xd0\x7d\x1e\xaf\xa6\x84\xa6\xd3\x45\x4e\x49\xb2\x25\x18\x4c\x6b\x99\x3e\xc8\xdd\xb8\xb5\xa3\x5e\xe4\x5f\x87\xf6\x92\x66\xd4\x90\x96\xa3\x17\xd8\x6a\xde\x27\xf4\x52\x9f\xe7\x23\x64\xd0\xb9\x58\x00\x72\x99\xd9\xde\x87\xd6\xff\x9f\xb0\x4d\x57\x3a\xea\x46\xba\xc8\xeb\x76\x47\x52\xeb\x46\x5c\xaa\xab\xa6\x89\xa6\x46\x0c\x11\x07\x30\xbd\xd0\x8b\x16\x89\xde\x7b\x05\xde\x59\xaf\x9f\xe2\x44\xac\x36\x3e\x95\xc9\x8b\x66\x93\x59\xaf\x90\x31\xa3\xa9\x3b\xa6\x31\xab\xf1\xf6\x1d\x20\xef\x7f\xc6\x88\x3b\x48\x40\xfc\x92\x67\x12\xe1\x3d\x87\x4b\x72\x2f\x6a\x79\xb1\x60\x70\xc0\x31\x13\x25\xe9\xa7\x0f\xcd\x86\x91\x6c\xfa\x1d\xa7\xf9\xd0\x56\x3a\x22\xfe\x9b\xfe\x85\x4b\x0c\x18\x6c\x86\x63\xb0\x61\xb6\x5b\xc0\x71\xe8\x39\x93\x8d\x8f\xdd\x7c\xf8\xf6\x95\x2a\x64\x67\xfa\xd8\xe5\x84\x90\xed\x2b\x26\x81\x33\x01"}, -{{0xd2,0xed,0xed,0xcd,0x85,0x32,0x06,0xcb,0xf5,0x9b,0xd7,0x4a,0x25,0xa3,0x03,0xfa,0x2d,0x6c,0x39,0x36,0xbb,0x48,0xeb,0x42,0xf6,0xd9,0x00,0xcb,0xe8,0x07,0x72,0xbe,},{0x22,0x44,0x11,0x1e,0x2e,0x76,0x9e,0xab,0x81,0x87,0x1e,0x06,0xc5,0x80,0x17,0x8c,0x23,0x5c,0x7b,0xf4,0xa5,0x2d,0x2e,0xcc,0xe1,0x18,0x87,0xa9,0xb4,0x6c,0x45,0xc8,},{0xbe,0x3c,0x2b,0x56,0x7f,0xe8,0xc2,0x08,0xc9,0x8e,0x71,0x97,0x11,0x7e,0xb0,0x1b,0x3c,0x19,0x7b,0xdf,0xc8,0x58,0x56,0x2d,0xc5,0xcd,0x90,0xf8,0xe2,0xc0,0x35,0x70,0x42,0x30,0x39,0x95,0xba,0xba,0x2f,0x40,0xb7,0x34,0x5c,0x56,0xdb,0x0b,0x46,0x25,0x58,0x0a,0xa8,0xdc,0xc4,0x8d,0xf6,0x01,0x9d,0x23,0xa8,0x38,0xea,0x71,0x72,0x02,},"\x80\x70\xbc\x0d\xb0\x89\xa5\x92\x54\x46\x01\x9b\x7e\x40\x3c\x74\xec\x78\x90\x3e\x4b\xd5\x4b\xc1\xd0\x8a\x54\xa6\xf0\xed\x75\xa8\x5b\x76\x3f\xf5\x4d\xc3\x3a\x26\x00\xcc\xb4\x57\xfd\xba\xea\xe5\x48\x47\x7f\x6d\x69\x47\xae\x26\xde\xb7\x1e\xac\xd1\xd2\xd6\x22\x82\xa0\x83\x84\x3b\xe4\xe5\x93\x1d\x91\xc9\x3b\x62\x82\xc5\x88\x07\xce\x8f\x0d\x88\x0b\x14\x38\xda\xd8\xfd\xcb\xa8\x61\x2d\xf7\x3b\x9f\xaf\xf3\xa9\xf7\xdb\x30\x05\x25\x05\x36\xaa\xbd\x98\xae\x02\x7a\x89\x5e\x10\xb5\xcb\x7b\x69\x87\x5c\x0f\x39\x93\xaf\x24\x51\x92\xf4\x39\x3e\x9c\x4d\x34\x05\x74\x6e\x31\x1d\x3a\x91\x44\x7f\xcd\xbd\x73\x06\xb6\x02\x0c\x93\x3b\xba\xb9\xe3\x9d\x13\x49\x16\x25\x03\x5c\x9c\x63\x6e\xfa\x17\x39\xc3\x58\x87\x10\xa8\x79\xd9\xe3\xce\x17\x64\x61\x6f\x10\x82\xe8\xdf\xf5\x75\x59\xc3\xf5\xa5\xd7\x6d\xd3\x01\x12\x4f\xa4\x89\xfb\x94\x9e\x9e\x03\x9d\xd4\x62\x1b\xda\x60\xf0\xb8\x6b\x31\x1e\x78\xed\x0a\xb3\xb5\x28\x96\x50\x44\xb2\x3d\x78\xee\x2f\x81\x06\x1f\x8e\xdb\xd6\x92\x99\x33\xd1\x8c\x02\x07\xde\xc4\xb5\xb6\xb2\xfa\x4a\xca\x27\x47\xcf\x5b\x11\x0d\xf0\x0b\x0c\x98\x27\xbd\xb3\xd9\xdb\x2c\x7b\x03\x28\xd4\x0d\x99\xe1\xf6\xb2\x28\xe4\x0d\xad\xae\x78\xae\xda\x02\x89\xb6\xa2\x3d\x4e\xb5\x83\x70\x88\xe5\xd8\x84\x13\x63\x2c\xcc\x22\xe2\x1a\x73\x76\x8c\x67\x32\x01\xe9\xa8\xd8\xdc\x6e\xb6\xf7\x39\x7f\xed\xbd\x39\x8d\x26\xf9\x69\x2c\xa7\x2f\x6d\x6c\xf0\x56\xaa\xac\x50\xac\x2f\x3b\x26\x6d\xbe\x5e\x7b\xe7\xa0\x24\x77\x45\x78\xea\xd5\x85\x24\x5d\xaa\xa7\x3e\x0a\xaf\x83\x3c\x07\x0b\xa4\xb2\x04\x4c\xcb\x5e\x5c\xd1\x6f\x9c\x0a\xd9\x2e\xa8\x44\x80\x55\xdd\x82\x8c\x79\x93\x5a\xa6\xc0\x74\x1f\x9e\x2b\x81\x03\x24\xfd\xc6\xe6\x1e\x84\x2f\x94\x57\x22\x68\xbf\x7d\x5a\xdf\xa7\xab\x35\xb0\x7f\xb1\x9e\x78\x15\xa8\xaa\x5d\x81\x13\x01\x30\xac\x5c\xda\x8a\x47\x51\xee\x76\x03\x8c\x0a\x6b\xc2\xfa\xba\x4c\x49\x7e\x62\xb9\xf1\xf1\x94\xb8\xa5\x99\xb0\x77\x01\x81\x4b\x6d\xfb\x7d\x84\xbc\xdd\x5b\x7b\x5b\xc2\x24\x9f\x1d\x38\x45\xef\xf9\xef\x8c\xc7\x32\x85\x35\xd7\x0d\x53\xc7\xaa\x0c\x73\x05\x90\x1d\xe7\xc4\xed\x2f\xe1\x83\x82\x65\xd4\xa4\x17\xb8\x76\xad\xbd\x88\xeb\x93\x3f\x27\xc9\xaa\x48\xc8\xc7\xe3\x4e\x48\x14\x7c\xcf\xfb\x2f\xb6\x1a\x34\x8f\xea\x13\xef\x67\xcd\xf2\xe0\x39\xe3\x3f\xd8\x9e\x2c\x1a\xd2\xa4\x25\x4e\x3b\xf7\x48\x45\x2a\xa8\x3e\xfe\xca\x46\xe7\x80\xed\xe1\xd1\x3f\xf4\xcc\x5e\x7d\x01\xed\x45\xeb\x8c\x74\x81\x8d\x48\x60\xaf\x47\x59\xa8\x3e\x14\x88\x96\xab\x68\x73\x43\x95\x76\x0e\x00\x14\x6b\x79\x3c\x3e\x72\x89\x8a\xa0\xb3\xc5\xe0\xc1\xd3\xfd\xf1\x21\x58\xd2\xe8\xff\x11\x23\xa3\xa0\xc6\x4c\xf6\x37\x4a\x7f\x44\xf1\x1a\x57\x5e\x48\xa3\x79\x18\x1b\x30\xa4\x86\x5c\xfd\x02\x2a\xa9\x83\x27\x56\x35\xce\x4f\x2c\xc4\x0b\xfe\x06\x60\x67\xec\x4f\xe2\x41\xfa\x04\x7b\x55\x27\x0a\x1a\xd0\x77\x6c\x5f\x96\x86\x10\x14\xcb\xf4\x0a\x04\x32\xc5\x59\xf2\x2d\x79\x34\x2b\x79\xf8\xe7\x04\x2d\xcc\xfb\x1c\xf5\x0f\x83\x08\x5f\x80\x63\xfb\x18\x87\xed\x2d\xfc\x9d\xb7\xef\xc9\x6d\xaa\x0f\xf2\xbc\x4f\x52\x33\x5b\x02\x11\x2d\x16\x39\x2e\x13\x4c\x02\x23\xde\x45\x8f\xc0\x72\xcc\x22\xbf\x9e\x7e\xab\xc0\x62\x08\x18\x0a\x57\xe7\xce\x48\x05\xee\x4e\x0f\xc0\x15\x84\x09\x98\xfd\x56\x86\x44\xa0\x38\x6b\x3d\x8e\x7d\xda\x52\xab\xf6\x4f\x7d\xd0\x08\x68\xfc\x84\xf0\x36\xca\x8a\x78\xe9\xba\x81\x71\xca\x90\x26\x7c\x74\xe6\x15\x9a\xca\xc7\xaf\x5b\xf2\x37\x59\xab\xc5\x3d\x82\xe7\x93\xdb\x87\xfd\xad\xe1\x36\x33\x54\xff\xdc\xb0\xbd\x4c\xc9\x21\x3f\x5c\x84\x54\x45\xfc\x64\x9b\x2a\x1f\x32\x9f\x9d\x41\xd8\xa0\x31\xab\x46\xb4\x72\x16\x0f\x03\x43\x4b\x4b\x6b\xc5\xa4\x01\x52\x4d\x61\x79\xad\x66\xf9\xe2\x21\xc9\x06\x7f\xc8\x7f\xe4\xa7\x7e\x21\xe8\x02\x3b\x61\x69\xeb\xf1\x09\x0c\xd5\x56\xa9\xbe\x50\xb9\x18\x7f\xe4\x60\x7c\x59\x25\xe6\x0b\x41\x4f\x6a\x5c\xbf\x8a\xfa\x15\xed\x0e\xb3\x4b\x67\xb4\xc9\xc5\xd5\x4a\xdb\xe6\x40"}, -{{0xb5,0x69,0xf7,0xc1,0xaa,0xdf,0x56,0xed,0x1b,0x5f,0xa1,0xb6,0xfa,0xd6,0x48,0xd0,0xdc,0x54,0x4f,0xf8,0xfc,0xd1,0x73,0x78,0x0d,0xe4,0x1a,0x7d,0x4d,0xe6,0x0c,0xb6,},{0x9e,0xff,0xa4,0xae,0xd9,0xc6,0x58,0xe4,0x34,0x60,0x71,0x43,0x44,0x68,0xa0,0xb8,0xa0,0x4e,0xcf,0x78,0x41,0x69,0x9d,0x63,0xe8,0x88,0x7c,0xe2,0x05,0x57,0x0c,0xea,},{0x2e,0x32,0xba,0x05,0x56,0xbd,0xe9,0x74,0xd7,0xa1,0x9b,0x3b,0x9a,0x1e,0x92,0xf1,0x83,0x92,0x4c,0x4b,0x74,0xc5,0xd7,0x51,0xb5,0xab,0x3d,0x00,0x79,0x67,0x01,0x6e,0xc0,0x3a,0xfe,0x91,0xd7,0x42,0xfb,0x22,0xb6,0x3e,0x5e,0x55,0xb2,0xfc,0xb6,0xc6,0x1a,0x46,0xe9,0xdc,0xe7,0xfe,0x9f,0xa3,0x0b,0xbf,0x66,0xae,0xf4,0xb8,0x5f,0x09,},"\x7c\x5a\xa4\xdc\x80\x78\xaa\x77\xe8\xb3\xb7\xfe\xe6\x10\x84\xcf\xad\x76\x47\x62\xf1\xef\x26\xd8\xde\xb7\xf2\xf3\xb1\x86\xdf\xc7\x72\x48\x75\x50\x19\x78\x45\xfb\xa2\xf4\xc2\x3c\x83\x5b\x9b\x58\xdd\x0b\x63\x5c\x64\x91\x35\x13\x7f\x24\x8f\x5e\xf7\x13\x56\x4d\xe3\xc9\x66\xef\xa5\xf6\xdb\x6b\xea\x9e\x30\x97\x07\x49\xf8\xe8\x72\xd8\xd7\xae\x45\x35\xb7\x5e\x17\x6e\xa0\x48\x9b\x91\x5f\x34\x71\xd8\x27\xeb\x5b\x44\x45\x86\x48\x8c\xfc\x3f\xa6\xa4\x50\x82\xda\xcb\x82\x64\x95\xe5\x0a\x3b\x5d\xc6\xbb\x93\x0a\x33\x1f\x30\xc3\x85\xbc\x3b\x24\xce\x70\xb8\x95\x96\xdb\x6b\xfb\x68\x7d\x99\xa5\x81\x98\x7c\xa8\x76\xea\x0e\x75\x76\x96\xb3\xfc\x03\x77\x9a\x65\x81\x30\xc4\x10\xb3\x44\xed\xac\xc4\x27\x7d\x44\x84\x54\x99\xd6\x78\xe1\x41\x4f\x15\xf3\x6e\x16\x63\x35\x18\x95\x69\xce\xf3\x56\x7a\xc2\xe3\xab\x82\x1c\x91\xc9\x32\x74\xf5\xc2\x8a\x5d\x1f\x7c\x1b\xf5\x09\x9b\x10\xf8\x4e\xcb\x13\xa4\xe4\x53\x8f\x66\x49\xbf\x74\xf7\x39\x4b\x70\x3e\xf5\x36\x49\xd8\x15\x16\xcb\x1d\xb5\x21\x41\x60\x65\xcf\x9f\x27\x6a\xb8\x0c\x93\x08\x89\x7a\x27\xdf\xe3\x7e\x5e\x14\x2f\x18\x19\xb8\xd3\x48\xdf\x50\xa0\x46\xa1\x28\x88\xe3\xb7\xf2\xdc\xc7\x0f\x52\x18\xd1\x5e\xbb\x9a\xa7\x29\x1a\x1a\x92\xac\x44\x5c\x51\xd3\xa5\x3d\xd6\x91\xef\xff\xcf\x5a\x01\xe8\x76\xa7\x2a\xa4\x81\xeb\x4f\x12\x1a\x07\x23\x97\xd8\xcc\x93\xbb\xc2\xc9\xa6\xc2\x8c\xc8\x9b\x11\xff\xc0\xe9\x10\xd8\x2d\x9d\x62\x98\xa3\x67\xa0\xe1\xe3\xe8\xc8\x65\xe4\x32\x6a\x31\x9b\x22\x66\x6e\x52\x9f\x19\x98\xf1\xb3\xc8\xef\xb5\xfc\x21\xcc\xe9\x70\x40\xfb\x62\x47\xda\xa0\x00\x0a\xc5\x55\x4d\x89\xe7\xb2\x71\x59\xdd\x0b\x18\x00\xb7\x60\xb7\x9c\x91\xef\x6e\x97\x0b\x1e\x6c\x5f\xf4\x24\x42\xb1\xb3\xae\x4d\x3c\x43\x9e\x08\xec\x2f\x6b\x94\x17\x73\x87\xca\x5c\x01\xdf\x6f\x07\xf8\xe3\x4d\x25\xed\xbd\x49\xd8\xb7\x4e\x31\xa5\xe6\x5d\xec\x1f\x87\x60\xfa\x22\xc0\x0e\x6f\xb1\xcd\x55\x5b\xe6\x8b\x0a\xb4\x35\x99\xf0\xb9\xf4\xa5\x4a\x7c\xcb\x06\x26\x83\x89\x5d\x5e\xf6\x6d\x24\xdf\xb1\x67\x8c\xb0\xd0\xe8\xc8\x01\xd8\xe5\xff\xe7\x9b\x91\x39\xfc\x96\xd1\x18\xeb\x39\xb9\xc8\xd4\x40\x44\x89\x32\x5d\x45\xb4\xa3\x20\x2b\xea\xdc\xa6\x6f\x83\x1c\x68\xef\xb8\x15\x94\x15\x81\x93\x0e\xad\x29\xfd\x5f\x21\x1b\x90\xe7\xa3\x9f\x0d\x4f\xf4\x8c\x62\xa5\x45\xe2\x8a\xc2\xce\x29\xbe\xdc\x35\x6d\x92\xfc\x00\x34\x71\x76\xd7\x76\x23\xe0\xe1\x80\x9e\xff\x3f\xe6\x2b\x75\xa7\xd9\xde\xb7\x27\xd8\x61\x72\xd1\x4e\xdb\xf2\x78\x9a\x57\x14\x3c\x69\x92\x5c\x91\x7d\x43\x3b\x46\x83\xb0\x69\x3b\x3c\xd9\xe7\xe3\x77\x99\x64\x10\x72\x7f\x5e\x6f\xb8\xf5\xcc\xd1\x86\x0a\x20\x29\x4e\xcf\x33\xfa\xf9\x7a\x1e\x0f\x85\xb7\x61\x44\x7d\x47\x61\xb9\x6e\x4d\xf1\xb3\x12\xbd\x41\x4c\xab\xcf\x49\x84\x97\xb0\xea\xd6\x7c\xd1\xe5\x90\x1b\xbf\x3a\x16\xa8\x89\x1c\xcc\xed\x8a\x90\x7d\xf8\x87\x26\x95\x2d\x4a\xb3\x70\xa6\xb7\xdf\x29\x42\xcf\x13\x61\x5a\x5b\xc1\x2b\x4e\x10\x6d\xc3\x01\x3c\x68\xb8\xfb\x90\x63\x99\xdf\x15\xf1\xaa\x90\xd5\x6a\xa9\x74\xb1\xd2\xb2\x8c\x1a\x84\x53\xb9\xbf\x07\x92\xa5\x1c\x97\xce\x8a\x12\xaf\xc9\x34\x1b\xb4\xc0\xc3\x7b\x12\xdc\xb1\x2c\x63\x94\x49\x77\x5d\x9a\xc5\xc2\xec\x49\x67\x3d\xa5\xaa\xf7\x49\x3e\xd5\xf1\xf2\x11\x6e\xae\xf7\x2b\xb7\xfb\x1e\x09\x3e\xde\x2c\x26\x31\x7f\x4f\x4b\x6a\xd5\x85\x34\x62\x05\xdf\x91\xa6\xe9\x6b\xc6\x6d\x30\x64\xbc\xe9\x52\x39\x8f\xfc\xe8\x80\x71\xed\x9f\xf2\x75\x0c\x65\xc0\xc3\x04\x12\x5a\xc2\xca\xdc\x4f\xef\x71\xa8\x18\x73\x24\x96\xa8\x4c\xa5\x74\xd4\x82\xd5\xa3\xbb\xa2\x0e\x16\xdd\x2f\xa2\x4d\x32\x70\xf6\xc6\x09\x92\xf7\xf6\x3e\x88\xf5\x2e\xff\x62\x22\x99\x8e\xb4\x41\x67\x27\x38\x43\x75\xf5\x9f\x00\xe4\x75\x12\xee\x46\x4c\x31\x84\xac\xea\xff\x3c\xcf\xb0\x6b\xd1\x5c\x18\x3c\x5e\x48\x59\x26\x28\x8b\x99\x7b\xfa\xaa\xec\xf6\xec\xbb\xf7\xd2\xab\xf4\x90\x6d\xf7\x6b\x12\x77\xc5\xf5\xa8\x7e\x68\x17\xb1\xc6\x36\xe9\x1e\xfd\x7e\xcc\xf6\x4f"}, -{{0x32,0x34,0x65,0xd0,0x31,0x3d,0x10,0x01,0xa2,0x61,0xab,0xfd,0x44,0xfe,0x65,0xc3,0x8c,0x9a,0x00,0xca,0x0f,0x20,0x33,0x5d,0x65,0x53,0xde,0x49,0x26,0x99,0xfc,0x46,},{0xe2,0x2f,0x16,0xbd,0x4c,0xc7,0xe9,0x4c,0x46,0xba,0x31,0x96,0x1a,0xf8,0xc5,0x83,0xf9,0xd2,0x71,0x8c,0x68,0xf7,0x3d,0x85,0x06,0x9f,0x60,0x8e,0x15,0xba,0x87,0x66,},{0xda,0x3a,0xad,0xb3,0x43,0x60,0xb2,0xda,0x0c,0x26,0x54,0x2e,0xa7,0x1d,0xef,0xa8,0xa0,0xbf,0x7f,0xbd,0xae,0x3e,0xe9,0xe1,0x1c,0x84,0x08,0x4a,0xd0,0x5c,0xce,0x7b,0xa7,0xd9,0x4d,0xe2,0x5d,0x85,0x63,0x98,0x26,0x16,0xbc,0xdb,0x5b,0xb6,0x39,0x5f,0xac,0x4a,0x7e,0x84,0xbc,0x77,0xe2,0x1e,0xd3,0x6d,0xf7,0x5d,0xec,0x99,0x0b,0x06,},"\xbb\x10\x82\xe1\xcf\xdc\xd2\x9b\xfc\xa2\x46\x4d\x5c\xe4\x46\xb5\xba\x65\x4b\xa5\x8c\x22\x53\x8d\xa9\x26\xb8\x30\x3c\xab\xfd\x28\x4a\x7b\xd5\x99\x4a\x78\x6f\xa6\x6a\xed\xf0\xe1\x5f\x20\xc3\x82\xcd\xac\xf3\xd1\x45\x57\xff\x7a\x82\x67\xfa\x04\x67\x2c\xac\xab\x76\x70\x08\x65\x0a\xa9\xb4\xa7\xc9\x07\x1c\x47\x99\xf1\xff\xa4\x5c\xa4\xd5\x86\xe0\x20\x47\x44\x4c\x14\x23\x19\x43\x46\x7a\x3a\xba\xef\xa5\x39\x59\xda\x22\x6e\xb0\xc1\x53\x92\x01\x97\x60\x15\x96\x97\x74\x82\x93\xc0\x25\x56\x87\x83\x58\x8a\x39\x10\xe7\x8e\x5e\xa4\x27\xc4\x40\x7a\x89\x01\x06\x1b\x8b\x99\x2b\x82\xa2\xdf\x58\xc0\x4a\x1b\x2c\x5f\xad\x11\xc6\xb3\x79\x85\x6c\x2e\x0f\xef\x8a\x95\x0d\xe7\xe0\xfc\x22\x31\x03\x09\xe0\x8b\x13\x2b\x0c\xce\x4f\xc1\xec\xbf\x94\x57\x4a\x38\x8d\x4a\xe3\x66\x75\xd3\x29\x9a\x95\x15\x54\xeb\xf1\x80\xeb\x38\x1e\x1b\x5d\xf9\x77\xd9\x38\x43\x38\x91\xbc\x47\x8d\x76\x81\x85\x0b\x9d\xc9\xc5\xc7\x69\xd4\x05\xf5\xd8\x83\x9f\xc9\x73\x61\xd6\xcb\x30\x6c\x20\x30\x26\xcf\x2e\x2b\x3d\x39\x84\x9e\x1f\x4b\x12\x25\xeb\x25\xef\x8a\xcd\x40\xb0\x06\xf2\x0c\x64\x4d\xb6\x50\xc7\x5d\x38\xc0\xfc\xdd\x48\xf5\x98\xc7\xb4\xa6\x01\x06\xe6\x9e\x19\xcd\x71\x25\x89\xce\xdc\xcf\x50\x86\x4e\xa5\xf9\xe9\x5e\x01\xf1\xdd\x85\xc7\x51\x4f\x2c\x94\xb2\x83\x59\xde\x41\x32\xb8\x8c\x3e\xe1\xd1\x0a\x80\xa9\xfa\xdf\xb6\x90\xe3\xd8\x86\x41\xb3\x16\x8f\x0b\x89\x6a\xf8\x99\x0a\xdb\xf0\xe4\xf8\xe9\xd3\xf9\xd4\xcd\x31\x4e\x12\xc3\xbc\xe0\xcc\x87\x38\xe0\xcf\xc1\x90\x5b\xe5\xef\xa0\x71\xf7\x10\xb3\x2f\x8e\x58\x98\xc6\x0e\xb1\xbb\x8f\xee\xb7\x40\x00\x56\x0f\x41\xcb\x2e\xbc\x32\xb2\x60\x0b\x69\x80\xa2\xa4\x06\x4d\xfa\xa3\x79\x7e\xc4\x4c\xfb\x72\xd3\x79\xf8\x09\x73\x79\xca\xd6\x7e\xcd\xc0\xc3\x24\x14\xfa\x41\xc7\x2b\x1b\x9e\x4e\xdf\x55\x18\xcb\x39\xfe\x90\x92\xb4\x39\xaf\x3a\x4e\xbd\x5a\xfe\x79\xbe\xdc\x0e\xa8\xbf\x17\x47\x9a\x28\x21\xf5\xe9\xbd\x91\xd7\xf4\xaa\x5e\x38\x46\x99\x52\x37\x19\xb6\x95\x7f\x82\x36\x7c\xd8\x5f\xea\x9d\xed\x62\x36\xa2\x07\xc9\x4c\xb3\x73\xe3\x39\x3c\xb4\xfe\x11\xf9\x0a\x1b\x87\x79\xe4\xab\x4c\x34\x66\x13\x6b\xf2\x1e\x2a\xab\x78\xf7\xd2\x72\x6d\xb6\x41\x4f\xa5\xc4\xa3\xf7\x31\x3a\xd2\x11\x6a\x6d\x7c\xe4\x0a\xaa\x10\x01\xc2\x70\x4d\x5b\x05\xae\x54\xc7\xcc\x6f\x56\x72\x17\xf1\xa4\x7b\xfd\x0e\xe7\x38\xea\xea\x5e\xad\xb5\x37\x10\x75\xbe\x07\x6c\x87\x50\xae\xce\xfc\x41\x7e\xa7\xbf\xda\xac\x3c\xc3\x8b\xf1\x6c\xc2\x6d\xf7\x60\x0e\x3c\x7e\x8e\x43\x1f\x26\x76\xfc\x2a\x8c\x43\xa6\xa1\x43\x68\xba\x62\xbb\x32\x43\x9a\x06\xbe\xac\x38\xa0\x47\xb3\x74\x5e\x26\xf4\x07\xad\x82\x3d\x6a\xd1\xc0\xb6\xa4\x43\x41\xe1\x5f\xc9\xb3\x31\x21\x4f\xfc\x89\x69\x82\x11\xb0\x51\x33\xd6\xd3\x43\x3b\x5d\x59\xf7\xab\x4d\x10\x9e\x54\xe4\xc5\xd6\xf3\x2f\xcf\x72\x30\xfa\x4e\x25\x28\xc8\x61\xbb\x21\xcc\xc9\xe3\x10\xe9\x49\x7e\x07\x7e\xa6\x75\x51\x0d\xa7\x12\xb1\xa5\xdf\x57\x5c\x5d\x1b\xf7\x36\x2d\x07\x11\x80\x03\x9a\xec\xfa\xa5\xc8\x57\x3c\x24\xc0\xf4\xeb\xe8\x1c\x2f\x88\x9a\xed\x3d\xe5\xa0\x00\xbe\x12\xfe\x3d\x0a\xf2\xdc\x2c\xd4\x24\x0e\x31\x4a\x17\x6c\x55\x3e\xfd\x5c\xba\x79\x8d\x9f\xf1\xe3\xd4\xbd\x9e\x90\xbb\x81\x13\xe3\x84\x9d\x73\x5a\xfa\x4a\xf6\x94\x5c\xc5\x7d\x4c\x37\x8d\xb8\x4f\x20\x6e\xf7\xea\xb1\x1c\x63\x7a\x7f\x72\x60\xf1\x22\xa9\x7d\xff\x67\x47\xe9\xb4\xc1\x74\xed\x0d\x64\xf9\xef\xd7\xfc\xcc\xf9\x81\x51\x9e\xc5\x80\xa8\x18\x25\x47\xd1\x79\x68\xc4\x01\x51\xfd\xf6\xd5\x4b\xc5\x7a\x91\x15\xf0\x40\xfa\xb5\xc1\x00\xde\xb0\x39\x12\x2b\x7d\x2b\xfd\x98\xb6\xad\xf3\x8f\x42\xb2\x96\xea\x3b\x37\x8a\x90\x42\x59\xb7\x5d\x60\x70\x3b\x48\x40\xb3\xf5\xda\x09\x62\x0a\x54\x77\x62\x80\xe9\xca\x9e\x8c\xd9\x24\xae\xd2\xb5\xdd\x2b\x49\x83\x4e\x58\x1c\xae\xd5\x27\x1c\xd7\x8c\xe0\x8e\x4b\xba\x49\xb5\x9c\xd7\x7c\x1b\x62\x76\x64\x91\x48\xab\x72\x47\xf9\x7f\xc0\x13\x16\x35\xde\x47\x4d\x3c\x23\x49\x3c\xa9\x8d"}, -{{0x60,0xff,0xdb,0xae,0x00,0x3f,0xa2,0x79,0x4f,0xca,0xbb,0xf8,0xf5,0xb4,0x16,0x44,0xfe,0x3a,0x7f,0x44,0xed,0x6c,0x83,0x41,0x93,0xda,0x07,0xa9,0xdc,0x5e,0x26,0x65,},{0x35,0xb5,0xeb,0x31,0xab,0x55,0x64,0x92,0x57,0x8b,0x3d,0xbd,0x6c,0xf1,0x68,0x7d,0x1f,0xdb,0x21,0x6a,0x72,0x58,0x18,0x07,0x96,0x63,0x48,0x2f,0x22,0x1c,0xe4,0x21,},{0xb8,0xf3,0xe1,0xf3,0x78,0x5a,0x2a,0x39,0xbb,0x08,0x6c,0xa4,0x65,0xc0,0xab,0xf0,0xa3,0xe8,0x74,0x43,0x22,0x5a,0xc6,0xe9,0x66,0xed,0x9b,0x45,0x31,0xc5,0x4a,0x89,0x4a,0x9a,0xbd,0x01,0xac,0x31,0xb8,0x57,0x57,0xfe,0x75,0x30,0x8c,0x95,0x94,0xff,0x65,0xf9,0x7c,0xdd,0x91,0xe8,0xd8,0xa9,0x3c,0xf1,0x2b,0x9e,0x6d,0xbe,0xe9,0x0b,},"\x3f\x8f\xf2\x0b\xb4\xf0\x08\x34\xc8\x0f\x2e\xe6\x89\x3d\x6f\x73\xbf\x7a\xce\x27\x29\x60\x1b\xb2\x6a\x0f\xb2\x72\xa4\xd0\xee\xa1\xfa\xe1\xd3\x06\xac\x2c\x5f\x32\xad\xd6\x01\x35\x85\x1d\xa2\x7e\x4f\x12\xe6\x4e\xa5\xe9\xe9\x96\x0b\x13\x83\xb0\x4c\xe0\x5a\x98\xb0\x41\x4d\xad\x97\x1e\xa9\x89\x44\x87\x1d\x41\x5c\xc2\xc4\x6d\xa4\x03\x97\x6d\x9f\x21\x93\x89\x58\xd4\xea\x8c\x79\x03\xb1\x4f\x2a\x44\x85\xfd\x69\xaf\xb2\x4a\xbe\x10\x2d\x8f\xec\x26\x6f\xb4\x68\xb4\x11\xeb\x20\xa3\x39\x67\x7d\x88\xeb\x31\xc9\x97\xb4\xdc\x88\x56\x13\xf0\xbe\x7c\x70\xda\xf8\x56\xa3\xdf\x92\xda\x96\x02\xfb\xa2\xe6\x74\x9d\x2f\x42\x6b\xee\xf6\x86\x62\xd5\xb0\xc2\xfd\x31\x32\x1b\x22\xb5\xec\x59\x7d\xa5\xd7\xe6\xa2\x88\xeb\xd9\x44\x3c\x5f\x39\xeb\x87\xdc\xf4\xa5\xad\x9d\x56\xc6\xba\xf6\x08\x09\x96\xa7\x79\x36\xbd\x87\xdc\x3c\xb4\x2e\xd4\xc4\xd4\x26\x88\xa9\xe1\x93\x82\x9b\x76\x1f\xf3\x20\xe2\xa6\x6c\xc6\x76\x48\xe7\x0e\xea\x3a\x1f\x2f\x9b\x9d\x5b\x42\x02\xfb\x5a\x39\xe9\xad\xc6\x09\x08\x6a\x9b\xe2\xa8\x32\x3a\xc6\x69\x31\xbd\xf6\xc5\x04\xd3\x33\x62\x11\xe4\x6f\xde\xfc\x48\x1f\xbf\x17\xf6\x13\xda\xb1\xfc\x5c\x09\x7c\x92\xdb\x06\x09\x90\x6d\x78\xb2\x5a\x45\x5a\x30\x45\x71\x8e\xfd\x3e\x3b\x14\xe2\x52\xb1\xae\x59\xc7\xc3\x89\x3e\x31\x91\x3b\x2c\x26\x4c\x0f\xfc\x3b\x60\x6c\xa1\xb0\x1d\xc4\x7e\xe8\x28\xa0\x8e\x46\xaf\x60\x4e\x59\x0d\xef\x44\xd2\x7a\xab\x93\xa4\x03\x25\x1f\xca\x07\x72\xe9\xdf\x0f\xab\x7a\xf0\xcb\xc5\x18\x1e\xfd\xa4\xda\x91\x3d\x8e\xb6\x45\x2f\x6c\xec\xbd\xa2\x04\xbc\x72\xd7\xc9\x90\xf6\x0c\xe0\xdd\x83\xc6\x34\xe9\x12\x23\x60\x91\xb0\xa6\x67\x3a\x7c\x89\xea\x59\x30\x8d\x55\xbd\x7e\x63\xa8\x52\x67\x74\xcb\xdd\x7a\x13\x39\xfa\xc2\x12\x4c\x90\x22\xab\xd6\xfe\xce\x7f\x2d\xae\xdf\xd8\x7f\xa6\x83\xdc\x0e\x3e\xf4\x08\x06\xa0\xab\x19\x87\x69\xd3\xa9\x9f\xe8\x1a\x99\xb6\x86\x00\x31\x90\x87\xaf\xa4\xea\x79\xd7\xee\x45\xda\x9c\xd4\x08\x09\xf4\xee\x8f\x4e\x25\xa0\x17\x75\x21\xee\x9d\xba\x8b\x56\x21\x2e\x88\x71\x9b\xb7\x36\x73\x36\xf4\xa7\xbc\x71\x22\xb4\x1a\x7d\xfa\xa2\x67\x2f\x92\xf2\x34\x03\xa1\x0c\x4f\xb2\x53\x88\xc6\xb2\x00\x81\x09\x3d\x49\xf3\xbe\x8a\x9e\x1c\x63\x4e\xf7\xba\x96\xb6\xd5\x23\xdd\x6f\xf6\x13\xc0\xa2\x3b\x60\x45\x70\x26\xcd\x48\x5b\xa8\xdb\x61\xd8\x0a\x0d\xc6\x59\xd9\xaf\x42\xa3\x8c\xae\x77\x7f\xec\x68\xe3\x9c\x52\x98\x6f\xf9\xfc\x20\x78\x9c\x10\x58\x51\x07\xc0\x40\x47\xb6\x6b\xa1\x4e\x93\xfb\x90\x4e\xa9\x0d\xf7\xac\x9f\x01\x54\xc9\x6f\x32\x36\xac\xf6\xdc\x8b\x44\xf5\x54\xc0\xcd\x51\x31\x93\xe5\xdf\xd8\x7e\x08\x5a\xd4\xb3\x8a\xa4\xc5\xe3\x6b\x24\x27\x72\x20\x88\x81\x6e\xcd\x2b\xc3\xa3\xdd\xa0\x1e\x4f\xb3\xff\x5e\xec\x7a\x64\x17\x32\x2b\xa6\xa2\x77\x73\xd2\x44\x95\xa8\x39\x19\x4a\x4a\x58\x2f\xe5\xab\xdb\x8b\x5d\x53\x3a\x24\x26\x25\x89\x24\x1f\xc8\x1f\xdf\x5e\x79\xfd\x26\x77\x64\x28\xf8\xe1\xce\x9e\x92\x6c\xf2\x72\x71\x6e\x75\x83\xab\xfc\x67\xa9\x4a\xae\x08\x16\xc1\x00\x0a\x19\x61\x70\xbb\xff\x1f\x45\xe5\xed\x9e\x26\x7a\xce\x1e\x4d\x91\x5d\xce\x72\x16\xc5\xf4\x04\xde\xf6\xfe\x2b\xd8\xb2\x8b\x2e\xcc\xf3\xe2\xae\xa0\xc0\xd6\x62\x63\x90\x27\x4e\x47\xe7\x45\xed\x3a\x23\xbc\xfd\x21\xd2\x84\xc3\x95\x37\x9d\xc0\x20\x80\xf0\x79\x36\xbc\x15\x4e\x7b\x99\xee\x73\xdb\x18\x8b\xd2\xa3\x94\xe0\x3a\x01\xff\xe2\xd1\xb3\x30\xce\xb7\x21\x58\xf9\x58\xc7\x16\xa8\x17\x11\xdb\xf6\x5a\xff\x8c\xd1\x2f\x5d\xfa\x53\xb3\x76\xeb\xb8\xb9\x8f\x86\x28\xf1\x7e\xf8\xb2\xab\x9c\x0b\xb6\x84\x12\xf4\xe3\x47\xa6\x33\xe2\xf8\xda\x1a\x55\x6d\x96\xf4\xaf\x72\x11\xc0\x78\x07\x9c\x10\x54\x1c\x07\xdc\x37\x22\xd1\x8d\xab\x8f\xa8\xbc\x49\x25\xab\xa5\xc9\x66\xf8\x05\x04\x03\x22\xdf\xbb\xbe\x87\xfb\xfe\xb1\x96\x1f\x5c\xcd\x40\xa9\x1b\x99\x7e\x54\x31\x5a\x7e\xef\xc3\xa4\x7b\xb0\xc8\x7d\xc2\x37\x55\xce\x72\x27\x57\x49\x96\xf4\xbe\x7a\xa3\x44\xfe\x0d\x17\xb9\x7b\xc5\x0c\x58\x38\xf9\x92\x92"}, -{{0x17,0x4e,0x99,0x3d,0x9b,0x81,0xf2,0xaf,0x67,0xe9,0xff,0xb8,0xeb,0xd5,0xda,0x41,0x79,0x66,0xa9,0xe7,0x7f,0x66,0xc6,0x5c,0x76,0x77,0x38,0xfe,0x83,0x57,0xd0,0x7c,},{0x3b,0xb7,0x38,0x6f,0x1b,0x1c,0xbf,0xae,0x55,0x37,0x03,0x83,0x3e,0xbc,0xbf,0xe2,0xdf,0xff,0x8c,0x89,0x9a,0x07,0x92,0xd7,0xce,0x23,0x22,0xb5,0xba,0x64,0x5a,0x5f,},{0xe6,0x07,0xbc,0x9a,0x53,0x60,0xb3,0x1d,0xa5,0x6b,0xe1,0xc5,0x44,0xc2,0x00,0x02,0x84,0x95,0x1d,0x86,0x89,0xf4,0xb7,0x22,0xbc,0x46,0x73,0xa0,0xc8,0x48,0x9b,0x84,0x48,0x3e,0xd8,0xe7,0x6e,0x29,0x7e,0xa0,0x46,0xe8,0x5b,0x37,0xba,0x56,0x30,0x58,0x5e,0x53,0x75,0x56,0x6a,0x18,0x7a,0xfb,0x56,0x96,0x66,0x1e,0x5b,0xfd,0xc1,0x0e,},"\xa4\x01\x75\x0a\xfc\x48\x37\xdf\xe3\xaa\xcc\x28\x4a\x59\x71\x45\xdf\xef\x02\x62\x9e\xf8\x7b\xd0\x93\x8d\x44\x39\x79\xdf\x76\xf2\x9f\xcd\x66\xa5\xb7\x1e\xa8\xab\x78\x72\x77\xe3\x05\x6f\x6e\xa1\x1b\x08\xbd\x23\x89\x79\xf9\xd3\xb0\x62\x53\x8c\x4d\x60\x40\xa8\x6b\x6e\x32\x04\x7a\xec\xc5\x9c\x23\x77\xad\x0e\xa4\xc4\x0c\x79\xff\x9f\xe9\x8c\x95\x8b\x2b\xf2\x5f\x2f\xd6\x34\x24\x32\x63\x6f\x5f\x7d\x5b\xb0\xd2\xec\xf1\x81\x83\x42\x6c\x73\x14\x79\x84\xd9\x5b\xbe\x16\x2e\x11\x97\x2d\xdb\x78\xa2\xa7\xc3\x45\xc5\xc0\xbb\xba\xba\x9c\xf3\x8a\x2d\x5d\xd5\x09\xa7\xdf\x8b\x84\x28\x74\xa9\x6e\x64\xb5\xd6\x4f\x5c\x41\xa2\x1d\x20\x8d\x14\xce\xa7\x06\x6c\xf2\x2d\xee\x0c\xa4\x1a\xa4\x6a\xb9\x21\xd4\xce\xec\x89\xec\x87\x3f\x77\x96\x0e\xda\x60\xd9\x67\x6c\xfd\x0d\xbf\xae\xc8\x72\xc2\xad\xe8\xfb\xa4\x28\x5a\xac\xd5\x27\x14\x3a\xe0\x34\x1d\x67\xd0\x07\x81\x19\x65\x3b\x5d\x23\xd4\x6e\x6e\xf7\x02\x64\xb1\xb0\x91\x38\x70\x87\x76\x23\x71\x6d\x0f\x1a\x59\x02\x1b\xe7\x4c\x91\x4b\x43\x24\x71\xa4\x3a\x29\xf2\xb6\xdb\xeb\x6a\x22\x3e\x2d\xba\xab\xb8\x20\xb4\xad\xbe\x33\x78\x29\xe1\xde\x0c\x18\x4d\xd0\xd0\x9f\x9d\x01\xd4\x25\x27\xe5\xd4\x0a\xbb\xda\xcc\x8a\xc0\xf1\xb2\xc5\xc1\xcb\x2f\x23\x87\x6d\x2d\x1b\x6b\x43\xdf\xe4\x82\xf9\xd4\x5a\x18\xf5\xc2\x2b\x15\xf1\xfe\x52\x1e\xf5\x7b\x08\xae\xc6\xa3\x03\x39\x25\xc7\x45\x4c\x93\xe6\x31\x9e\x77\x8a\xc4\x94\xfb\x14\x0a\xe5\xf1\xa3\x1c\xc8\x32\xca\x24\x88\x65\x10\x04\x06\x3b\xcf\xf8\xfd\x9a\xe9\x26\x6a\xf5\x27\xf2\xc3\x1f\x6a\xcb\x8f\x3d\xeb\xd9\x97\x8e\xf9\xdf\x01\x08\xe3\xd5\x0c\x49\x19\x90\xc9\x0d\xd8\xee\x9d\x64\xea\x4e\xbf\xd7\x11\xc9\x9d\x90\x44\xec\x11\x34\x2c\x53\x83\xca\x39\x23\x2e\xd9\x7a\x07\xe4\xdc\x51\xdb\x4c\x1f\xe9\x47\x34\x8d\xff\xe7\x0a\x95\xc9\x9d\xb1\x47\x51\x31\x48\x01\xf1\x3f\xa2\xbf\x42\xd8\x67\x37\x5a\x08\xee\x9b\x3b\x79\x9e\x0b\x15\x27\x8e\x95\xe9\x1a\x89\x68\x06\x4d\x6d\xfd\x8f\x51\x15\x43\x8c\xcb\x8b\x51\x6c\xa0\xc4\x1d\xbb\x19\x87\x3c\x6e\x10\xa2\x36\xec\xc2\xda\xd5\x22\xf8\x0f\x01\xc1\x4e\x2f\xa1\x4a\x0d\x79\x2b\x9f\xc4\x86\xc6\xfb\x0e\xfb\xdf\x21\x30\xf0\x2d\xf1\x49\x7d\xb5\xab\xa8\xbe\x61\xca\x70\xb2\x93\x88\xe4\xee\xc7\xe0\x69\x4a\x38\xc0\xd0\x3c\x59\xbb\x6a\x2d\xc3\xcc\xd6\xdd\xe1\xe2\x9e\xe2\xc1\xb3\x25\xac\x72\xaa\x8e\x6f\xab\x91\x38\xf8\xb6\xf5\xd3\x24\xd4\x6a\xf3\xa3\x54\x2c\x8b\xd8\x7c\xb0\x4f\xaf\xc5\x4b\x5d\xb8\x27\xde\x60\x67\x62\xa0\x97\xb6\x22\x79\x9c\xa8\x27\xbd\xa9\xc1\xc0\xbb\x26\x7e\xba\x82\x54\xa8\x1c\x6b\x85\x8a\x37\x5b\x94\xbd\x09\xf3\x9e\xeb\x88\xcb\x14\xb8\xd4\x6e\x47\x40\xdc\x1a\xb4\x2a\x89\x5f\x86\xd2\xc5\x7f\xc2\x8b\x07\xb7\xf6\x0f\xc4\xf8\x84\x7b\x8b\xc8\xad\x83\xa2\x48\x1a\x28\xf2\x9b\xca\x35\x10\xff\x8b\xf1\xdd\x75\x81\xe3\x35\x71\x64\xf4\xfe\x92\x0f\x9d\xe8\x39\x37\x6d\xe0\x64\x90\x0d\xc7\xf8\xbc\xf5\x11\xdc\x57\x2e\x0f\x0f\x6a\x75\xb9\x29\x79\x7d\xa4\x1c\x52\xea\xe6\xfe\x13\x75\x0c\xe3\x51\xe8\x76\x76\x30\xba\xdf\x6d\x7d\x4e\xab\x90\xcd\x19\x04\xc9\x6c\x04\x8a\x9a\xcb\x21\x3a\x9e\x5b\x86\x46\x15\x73\x8a\x84\xf2\x22\x98\x6a\xc2\x35\x54\xcf\x4c\xe5\x4e\x80\xab\x57\x33\xc0\x65\xb8\x04\x59\x92\x1d\xd3\xd8\x37\x2d\x0e\x85\x94\xd4\x36\x43\x51\xbf\x04\x1c\x14\x6f\xa8\xd2\x3a\x19\x3e\xb8\x07\xec\xe2\x3f\x24\xab\x65\x95\xe9\x32\xc9\xce\x1a\x75\x9b\xf7\x88\x91\x4d\xb0\x08\xe8\x70\x98\xdd\x81\x46\x5e\x26\x10\x64\x7a\xc3\x8e\x08\x86\x66\xf6\x0e\xc5\xd0\xe2\x17\x33\x20\xa4\x0c\xd9\x85\xf0\xe0\x0d\xbc\x2b\x45\x70\x72\x74\x83\xa8\xc2\x5f\x6f\xc1\xe0\x93\xbb\x57\xcc\xaf\xd1\xca\x20\x2f\x29\x86\xc7\xc5\x54\x0a\x7c\x3e\x10\xc4\xa6\xfc\x26\xd1\xd6\x2c\x2c\xa5\xaf\x83\x05\xce\xeb\xe4\x2f\xf9\x6e\x7d\xc5\x48\x21\x43\x75\xe8\xa7\xf9\xf7\x12\xba\x8b\xd8\x75\xe4\x3c\xa1\x0c\xf9\xb1\x83\xf0\xc8\x51\x95\x12\x92\x85\x38\xa4\x78\xcb\x98\x25\x9b\xd8\xb3\xe3\x34\xbc\xc4\x63\x55\x95\xca\xd3"}, -{{0xe5,0x37,0x15,0xfe,0xc9,0xd3,0xb2,0x0e,0x9c,0x29,0x91,0xe5,0x4b,0x5e,0xb0,0xa8,0xcc,0x81,0x87,0x55,0x69,0xc9,0x5e,0x22,0xa2,0x00,0x13,0x60,0x02,0x17,0x60,0x04,},{0x53,0x51,0x89,0x9b,0x69,0xb2,0x11,0x6b,0xc7,0xf8,0xa8,0x81,0x4d,0x1e,0x5b,0x9f,0xc7,0x85,0x69,0x8b,0xeb,0xd9,0xab,0x14,0x27,0x7c,0x3e,0xcc,0x01,0xef,0x8b,0x1d,},{0x3d,0x0a,0xdc,0xe7,0x7a,0x4e,0x04,0x6f,0xcb,0x9b,0x49,0xad,0x5e,0x6c,0x68,0x09,0xc8,0xac,0x33,0x6c,0x73,0x34,0x04,0xe5,0xd3,0xf0,0x15,0xc9,0x22,0x5c,0x3d,0xf4,0x6e,0xf2,0x1e,0xa3,0x4c,0xff,0xb3,0xaf,0x69,0x97,0x4f,0x8b,0x7e,0xab,0x2d,0x23,0xfc,0xd5,0xa1,0xe1,0x75,0x3a,0x40,0x23,0xde,0xb3,0x81,0x86,0x29,0xa9,0x8a,0x0b,},"\x84\x31\xcd\x16\xd5\xc0\x93\x77\x5e\x18\xc0\x82\x52\xc4\x3f\x95\xb1\x01\x7e\xb7\x11\xfc\xaf\x73\xe1\xe0\x0c\x0c\xd6\xf3\x44\x87\x44\xab\x9b\x0e\x64\x33\x55\x18\xc4\x83\xae\x94\xde\xb9\x76\x77\xf8\x18\xf0\xe8\x1a\x74\x90\x61\x5b\x71\x41\xb9\xc3\x5f\x80\x55\x6e\x69\x71\xce\xa2\x8e\x9a\x32\xc3\x28\xcc\x26\x69\xfc\xa5\xb1\x23\xcb\x66\x2d\xeb\xab\x2b\x98\x15\x77\x64\x66\x80\x70\xe1\x8e\xdf\x76\x1a\xe1\x96\xbd\x4b\x24\x4f\xea\x7b\x74\x98\x45\x16\xbe\x2c\x00\x73\x9e\x76\xe6\xc4\xb6\x21\xcb\x39\x83\x76\x5a\x20\xd8\x47\x78\xd5\xa4\x35\x0b\x16\x8f\x6a\x0f\x71\x2a\x98\x20\xa8\x5a\x63\x6f\xaf\x92\xc7\x89\xc4\x28\xcf\xd2\x96\x2e\xd2\x07\xc3\xac\x88\x99\xc2\x58\xca\xc1\xad\xb5\x15\x9f\x76\x4b\xa3\x72\x29\xc5\xcb\xf7\x83\xfc\x9a\xa4\xd1\xea\x46\xec\xc8\x5f\xe0\x96\x14\x85\xd4\xfc\x5c\xb2\x1d\xf0\x01\x2a\xc9\xb9\x55\x37\x3b\x14\x22\xe5\x1a\xfa\x1c\x55\x09\x88\x86\x2c\x86\x13\x3b\x76\x0a\xa6\x30\xfc\x0a\xce\xe8\x98\x91\x17\xd1\xdd\x96\xe3\xe6\x28\x7b\x69\x28\x7c\x59\x0b\xdc\xa9\xcb\xc8\xee\xce\xf2\x81\xee\x6d\x1c\x8d\x88\x82\x2b\xfe\xa5\xfa\x0f\x53\x0f\x23\x27\x80\x93\xc7\xc8\x5a\x0d\x44\xc3\xa7\x74\x04\xee\x79\xf1\xc8\x36\x8c\xd7\x32\x1b\xf1\x48\xfd\xa4\xdc\xf2\xeb\x07\xe4\x63\x0e\xa4\x22\x58\x75\x86\x37\x17\x80\x51\x45\x36\xb8\x94\xc5\x24\xe6\xb8\x3d\x5a\x76\xa1\x5c\x83\xe9\x5a\xb3\x14\xe0\x7b\x34\xb9\x8c\xd9\x9e\x07\x70\xb4\xeb\x9b\x3f\x3f\x50\x5b\xae\x8a\x06\xf7\xf9\x50\x25\x8d\x79\x07\x48\x10\x71\x95\xeb\x4f\x6b\x84\x84\x0f\x8c\x05\x90\x72\x73\x96\xed\x14\xe3\xf5\x32\x39\x47\x6c\x4d\x2a\x72\x69\xb2\xe1\xf9\x72\xfb\xff\x33\xe4\x72\x44\x26\x74\x5e\xc8\x86\xa3\x29\x16\x29\x5e\x70\xd4\x68\xd0\x6c\x7d\xbb\x5f\xf9\xa3\x54\xe1\xac\x90\x3b\xb4\x5c\xa5\x26\xf0\x8b\x49\xa6\x5e\x82\x29\x7d\x8d\xd3\xfb\x25\xaa\x42\x8f\x64\x34\x5b\xca\x97\x40\xd9\x07\x8d\xac\x9e\x11\x38\xc9\x21\xbd\xd7\x48\x81\x67\x3d\x49\xd0\xcd\x20\x06\x81\x17\x23\xde\x28\x7c\x6c\x95\x83\xe4\x56\xa0\x1a\xb1\xa3\x4d\xfa\x1e\xaa\x96\x3b\x71\xe8\xbc\x7f\xa8\xa9\x8c\xad\x4f\x94\x1e\x4b\x37\xb6\x0e\xef\x92\x3b\x32\x94\x88\x23\x50\xb3\x8e\xa4\xea\xc0\xe9\x23\x2e\x93\xc5\x32\xdb\x5d\x7e\xec\x8e\xcf\xae\x65\xe0\x80\x47\x30\x78\x77\x7d\xdf\xdd\x11\x50\x8a\x6e\x59\xf0\xeb\xaa\x3f\x60\x44\x1f\x82\xa7\x1a\x73\xc8\x4b\xca\x06\xa3\x71\xff\x5c\x9f\x77\x21\x3a\x2d\xb7\x95\xd4\xa8\x89\x78\x23\xd8\x8f\xd9\x2a\xe3\xe0\x57\xe8\xbb\xd8\x0c\x99\x0a\xf8\x38\x6b\xdf\x26\xf1\x2d\x97\x3c\x8c\x5f\xf9\xed\x6f\x7b\x2d\x8e\x61\x83\xcf\x6e\x68\xf3\xbb\x89\x8f\x59\xa9\x3e\xc4\xde\x3b\xea\x60\x5a\x5d\x8b\x15\xdf\xab\x71\x3f\x35\x85\xc4\x8d\xc9\xa5\x76\x82\x42\xb3\x31\x01\x43\x80\x30\xe7\x04\x48\x80\xd1\x7c\x2e\xe8\x4f\x89\xd2\x6a\x1f\x7b\x19\x86\x19\x3f\x96\x63\xc5\x87\xd5\x0c\xa9\xdd\xf6\x18\x6a\x51\x76\xaf\xef\x1a\xdb\x24\x81\xb7\x92\x54\xb7\x8d\x3b\x34\xc6\x97\x90\xeb\x28\xb9\x0b\x14\x61\x17\x0c\x3d\x73\x81\x83\x76\xcd\xf3\x71\xaf\x0a\x0f\xea\xf1\x4f\xdf\x70\x16\xed\x6e\x7f\x08\xc0\xc1\x4b\x52\x70\x5c\x86\xd4\xf0\x00\x3b\x5e\x45\xf9\x74\xc0\x64\x16\xcc\xb5\xca\x3e\x9d\x52\x9a\xa9\xd4\x15\xc2\x5a\x44\x6f\xa2\xd6\x9e\x82\xf4\x99\x4e\x57\xe9\x22\xc1\x7c\x1c\x34\x2d\xd7\x28\x1e\x41\x00\x52\xd9\xe4\xaa\x1b\x30\x9b\x7d\x47\x0d\x45\x8c\x66\x3e\x17\xff\x25\x00\xd0\xbb\x8e\x46\xa9\xc4\x36\x7e\x09\x1c\xaf\x87\xdd\xfc\x06\x2a\xae\x08\xa6\x5c\xb9\xe0\xea\xa7\x1c\x99\x45\x9c\x5e\x7c\xb1\x12\xa2\xee\x98\xa5\xe4\xcb\xee\x0d\xc5\x20\xf8\x7c\x30\x22\xda\x65\x49\xbe\x1e\xe7\x0a\x0a\x73\xad\x84\x99\xc9\x7d\xd0\x6a\xa1\x4c\x9f\xd8\x62\x8a\x92\xca\x6d\xb4\x87\x32\x2d\xb9\x59\x8a\xda\x1f\xce\x28\xf4\xb9\xfc\x1d\x3c\xc3\x9d\xcf\x2e\xd1\xdf\x3d\x86\x2d\x87\xf5\x5c\xc1\x01\x6f\xb9\xe7\x3e\x7c\xc8\x97\xb9\x70\xd5\xff\x35\xac\xfe\xb0\x5c\x1c\x89\x19\x28\x08\xae\xeb\xfb\x2c\xd1\x7c\xb1\xc9\x4f\xab\x05\x98\x98\xfe\xdc\x2f\xbd\x44\xcc\xef"}, -{{0xab,0xfd,0x69,0x7b,0xfb,0xc5,0xb6,0xff,0x2b,0xdf,0xf3,0xbc,0xe1,0xd7,0x77,0xe0,0x5f,0xbe,0x3e,0xc8,0xb9,0x5c,0xe6,0x93,0xd6,0x23,0x93,0x12,0x09,0x31,0x3d,0x4f,},{0xa7,0x09,0x32,0x1a,0x02,0x10,0xcb,0x80,0xab,0x58,0xbf,0x95,0x5e,0xcd,0xeb,0x8a,0xaf,0x9e,0xe4,0xc3,0x75,0xf9,0x59,0xc5,0x30,0x89,0xd4,0x37,0x48,0x8c,0x08,0x2d,},{0x8c,0x36,0xb5,0xa1,0x11,0xc5,0xa8,0x11,0x9f,0x2d,0x9d,0xb5,0x7e,0xbb,0x59,0x2d,0xae,0x86,0xad,0x4b,0xf6,0x78,0xc1,0x49,0x2e,0x26,0xf3,0xc1,0x0f,0xbe,0x03,0xf1,0x05,0xca,0xe0,0xdc,0x68,0xb5,0x52,0x59,0xb9,0xb5,0x98,0x92,0x89,0xdb,0x33,0xd9,0x5d,0x2e,0xe6,0xb7,0x56,0xc7,0x60,0xf9,0xd3,0xaa,0x0e,0x68,0xa1,0x89,0xde,0x02,},"\x89\x6b\x7a\xb8\x41\x3f\xfe\x43\x9a\x2f\x44\x87\xec\x49\xd6\x4e\x31\xc7\x4f\x50\xac\x83\xf5\x5d\xa6\x1a\x70\x03\xaa\x71\x6c\x2a\x9d\xf6\xb4\x38\xe6\x2f\x53\xd8\xf0\x19\x2f\x37\x36\x32\x47\x60\xd7\xe8\xc4\x4a\xc0\xba\xca\x3a\xe2\xa6\xfb\x93\xf1\x3d\x96\x88\x67\x99\xfd\x2c\x45\x51\xb0\xab\x36\xf1\x73\x08\x55\x55\x12\x65\xa5\xa3\xc3\xc2\x1d\x95\x16\xa2\x37\xf5\xdb\xc1\xc8\xe7\x29\x99\xb7\x82\xc5\xca\x41\xa4\xf6\xe9\x30\x8e\x64\xaf\xde\xe0\xbf\x47\x9e\x54\x6b\x89\xc5\x1b\xc5\xe4\xf7\x1e\x57\xfb\x24\xce\x43\x7a\x8b\x81\xb9\x1d\xc7\x98\xb5\xab\x36\xf2\x9a\xfd\x5b\x48\xe8\x1c\x17\x6a\xe5\xed\xf9\x53\x71\xba\x32\x46\xfb\x43\x94\x05\xbd\x10\xee\xd3\x67\x8e\x3e\xc6\x23\x07\xa3\xb3\xdc\x1b\xad\xba\x05\x1f\x16\x77\x4b\x85\x08\x81\x88\xc2\xa9\xe3\x20\xa1\x61\x8d\x5f\x26\xce\x94\xee\x2b\x93\x3c\x30\x5f\x6d\x95\x84\x95\x8e\xea\x31\x56\xc3\xd1\xe0\xef\x39\xa1\x86\x27\x5e\xe6\x2c\x40\xf3\xc1\xac\xd1\x5d\x8b\xe6\xe0\x74\x35\x1f\x53\x49\xce\x3d\xf6\x95\x17\x50\x5f\x45\xfa\x06\xa8\x15\xc6\x9c\xa1\x8f\x45\x0f\x42\xb5\xcf\x4e\xbd\x99\x26\x84\x45\xe0\xf6\x81\x04\xa7\xde\xeb\x0a\x11\x5b\x81\x7b\x99\xe1\xa7\x3e\x0f\xa9\xd8\x7d\xb7\x1f\x8e\xc9\x4f\x87\x08\xc9\xbc\x2e\x62\x2b\x96\x33\x65\xeb\xcf\xb9\x7c\xfe\x73\x32\x63\x00\x70\xe9\x65\x4e\xaa\x60\x36\x1a\x45\xd4\x02\xdc\x0a\xb2\x97\x66\x52\x42\x66\x7f\xbd\x99\x40\xf6\xcd\x33\x19\x52\x46\xa8\xc2\x86\x9a\xf7\x59\xa8\x62\xd4\xb6\x41\xdb\x14\x4d\x57\x32\x36\x6b\x20\x63\x6c\x40\x27\x78\x7f\x55\x80\x27\xd7\x6f\xcb\xf8\x43\x2e\xb9\x3e\x6d\x14\x56\x7d\xf8\xdb\xf2\x11\xda\xeb\x56\x55\xdb\x10\xac\xdd\xd0\x5e\xca\x06\xac\xce\xe9\xfd\xa8\xd3\xb7\x0c\xa1\xe6\xdc\x58\x7f\xa4\xb7\x8f\x63\xcd\x66\x3f\xf0\x24\x38\x70\x57\x0f\x4d\xcb\xaa\x3f\xb6\x26\xb4\xe1\x13\xbd\xe4\x7d\x5c\x9d\xb2\xb4\xba\x6e\xc6\xdb\xf9\x18\xac\x05\x69\x49\xef\x3c\xfc\xb1\x15\x56\x16\x15\x77\x1a\x03\x5a\x43\xd3\x3b\xa2\x65\x1d\xbe\xb4\x63\x48\x26\x1c\xe3\xc4\xc9\xf2\x46\xd2\x3f\x94\xdb\xc2\xd0\xc1\x9b\x92\x1e\x24\xc7\x7d\xa5\x99\x2f\x1b\x4b\xdf\x2e\xde\xa4\x99\xf5\x41\x11\x68\xac\x0c\x12\xe9\x6f\x3b\x15\xd2\xe1\x2a\xc8\xd7\xb3\xed\x8d\x1e\x07\xc4\x26\x7a\x25\xd3\xa3\xc3\x53\xa4\x20\x8b\x74\x06\x27\x8a\xab\x9e\x70\x0f\x7b\x20\x6f\x48\xe6\xea\x7c\xc9\x7e\x55\x4f\x15\xc9\xbe\x34\x9d\xd9\x15\x14\xdb\xe8\xd8\x89\xf2\xdc\xbb\xfa\x18\x2c\x9f\xaf\x58\x07\xa6\x9b\x2e\x97\xfa\x77\x1a\x6f\x23\x1a\x4c\x7b\x31\xd1\x17\xb8\xed\x0e\x63\x0c\xdf\x13\xe0\x82\xbb\x4f\x63\xc3\xf9\xac\xb3\x55\x32\x04\xcc\xd7\x6e\x18\x35\xc4\x6e\xec\x3d\x43\xc5\x61\xbb\xf1\x7c\x92\x21\x4a\x6d\xb1\x21\x2b\x60\x03\xcf\x2c\xc2\x6c\x7a\xe6\x75\xfc\xd0\x53\xb9\x47\xe7\x22\xf9\xe8\x57\x62\xce\x8a\x16\xe4\x65\x4e\xc6\x34\x2f\xc6\x46\xe5\xca\xb4\x72\x79\x7e\xab\xf6\x58\xba\x4a\xfd\x14\x2f\xc8\xfc\x4c\x8f\x98\xf2\x3c\x24\xdc\x99\x84\x7a\xe8\xce\xf0\x87\x9e\x1a\xb3\xbb\x80\x97\xe4\xc3\x52\x9a\xdd\x2d\x8e\x8e\x2c\x20\x69\x21\x0f\x50\xac\xe1\xae\x32\xa6\xc8\xe6\x38\x4a\x2b\xf7\xd7\x9c\x66\xc7\x46\x14\x9c\x84\xad\x75\xa3\xa1\x76\xe4\x5e\x13\x6d\x94\x69\x5a\xed\x4b\xfd\x08\xb4\x26\xea\x8c\x4b\x93\x79\xf3\x74\x25\x50\xe1\xcf\x5a\xc8\x4c\x18\x17\x4d\x68\x0e\x92\xaf\x2c\x18\x74\xac\x1c\x13\xd2\x82\x32\xde\x19\x37\x68\xe5\x61\x94\x7c\xbd\x6b\x79\xe9\xb9\x9d\xa6\x5c\xfb\x74\xff\xb3\x2f\x7d\x3d\x20\x25\xc6\x07\x63\xdc\x07\xf5\x55\x39\xb4\xd2\x53\xde\x1e\x6c\x25\x82\x3a\x62\x58\xc7\xa9\xce\xd1\x50\x1d\xce\x27\x86\x89\x8a\x3e\x05\xc9\xbf\xf8\xfc\x5b\x21\x25\xd0\xf4\x71\x08\x8a\x13\x4b\x48\x73\xc8\xd5\x5c\x04\x45\xf6\xca\x39\x6b\x3d\x7b\x4b\xc2\xbf\x5c\x4d\x22\x40\xda\x41\x82\x93\xaf\x6a\x3e\xd8\x53\xde\xdd\x3b\xf6\x68\xd9\x37\xb3\x5a\xa0\xc2\xac\xbf\x23\x76\x6f\x9f\x3e\x96\x82\x84\x75\xab\x08\x64\x96\x61\x7a\x6e\x81\xd6\x53\x58\x9b\x2f\xe5\x0b\x7b\xa8\xf0\xcf\x1e\x5a\x44\xd8\xd6\x2f\x08\x37\x7a\xbf\xc2\x62\x97"}, -{{0xdc,0xfa,0xd5,0x9f,0xc6,0xb6,0x97,0x10,0x9e,0x72,0x7f,0xf6,0x6a,0x5f,0xe9,0x3a,0x6a,0x22,0x6f,0x63,0x1a,0x64,0xe5,0x79,0x7a,0xd8,0xd8,0xc8,0xb6,0x35,0x87,0x34,},{0xe7,0x9f,0x4f,0x51,0x13,0x72,0xe3,0x55,0xe7,0xe9,0xe0,0xe8,0xb5,0x34,0x6f,0xdb,0xcd,0x2d,0xf1,0xfc,0x5c,0x3a,0x18,0x90,0xd2,0x7f,0xa1,0xfa,0x92,0x8d,0x27,0xa6,},{0x05,0x2f,0xf7,0x95,0x40,0x73,0x74,0x56,0xc6,0xa4,0x2c,0x41,0xc9,0x7d,0x6b,0xf5,0x17,0xb8,0xcf,0x28,0x9b,0xc7,0x8b,0x50,0x3d,0xee,0x6a,0x30,0xef,0x51,0x68,0xb3,0x8f,0x75,0xbe,0xac,0xa1,0xe1,0x4d,0x97,0x1f,0x87,0x73,0xe3,0x94,0x1b,0xd6,0xdf,0x5c,0xb9,0x77,0x8d,0xea,0x12,0x5a,0x4c,0x4f,0xe0,0x11,0x6b,0x70,0xee,0x84,0x0b,},"\x7d\x92\xdd\xd8\x13\x3c\x61\xc6\x10\xc1\x30\x8c\x23\xae\xaf\x99\x38\x84\xa4\xe6\x7f\x7b\x94\xbb\x88\x6d\xad\x50\x98\x69\xa9\x32\xec\x4a\x27\xd4\x10\xd2\xc2\x9c\xa7\xae\xae\x6f\x92\x80\xcf\x6c\x4b\x06\x7e\xc7\x51\xe5\xe8\xc3\x9f\xf4\x44\xd4\x22\xce\xab\xae\x14\x5d\x42\xf0\x47\x45\x3d\xd4\x02\xd1\x79\x74\x05\x03\x34\x09\xe7\x2c\xc1\x9f\x79\x3d\x5d\x26\x8f\xb3\xfd\x2c\x11\xea\x2c\xb0\xd7\x04\x36\xe1\x8f\x9e\x88\xa0\x15\x15\xdc\x86\x5f\x6a\x1e\xb2\x36\x90\x32\x8f\xd7\x5d\xe2\x63\x21\xa3\x8f\x12\x19\x7a\x97\x20\x1b\x1d\x84\x52\x94\x4f\xbc\x54\x1c\xb6\x8c\x77\xd4\x95\x15\xdb\x53\x26\xf2\xb1\xd0\x76\x3e\xda\x06\xd2\x50\xce\x2a\x5e\x0b\xbd\x7d\x16\x76\xd7\xd4\x1f\xb3\xab\xe8\x8b\xdb\xe3\x72\xf9\x6b\xf7\xbb\x52\x6d\x6b\x65\xa2\x51\x5e\x83\xa5\x77\x04\x5b\x54\x79\xb3\x8b\x85\x2f\xe4\xab\x01\x1c\xbf\x21\xc0\x85\xef\x5f\x0a\x7c\x1b\xed\x76\x57\x2b\x0f\x86\x02\x28\x06\x7a\x89\x9f\x89\x5a\xe7\xf6\x25\x6e\xb6\x51\x40\x87\xf9\xd6\xf5\xc3\x55\x96\xc1\xf4\x80\xc7\x31\x13\x54\x6c\xb9\xcc\x30\xf5\x6a\xb0\x74\xa9\xff\x28\xac\xab\x7e\x42\x65\x0a\x96\x1d\xa3\x25\xac\x5b\x65\x94\xb8\x1c\x93\x25\x0a\xe7\xd3\x92\x67\xa1\x9c\x97\x62\x54\x07\xed\xda\x04\x04\xcb\xe5\xa3\x6e\x95\x9f\xc8\x20\xb2\x7e\xf5\xca\xd7\x96\xc1\x1e\xaf\xf1\xc0\xe2\xf9\xd4\xb3\xc6\x49\x15\x02\x19\x5d\xe0\x36\x59\xb3\x64\xe4\xe8\x7b\x2b\x2d\x73\x3e\xc2\x5e\x6f\x9b\x63\xd5\xf6\x91\x79\xe0\xd2\x7b\xd4\xae\xcc\x8f\x12\xa5\x07\xa9\x1b\xaa\x48\xd9\x9b\x3a\x42\x6c\xec\xeb\xae\xf3\x7d\x73\x61\x10\x6a\x84\x90\x64\x43\x09\xf6\xeb\x4d\x25\x96\x44\x3b\x6b\x01\x18\xb9\x45\xac\xec\xc6\x44\x3e\xa6\x1f\xcd\x15\x5b\x54\x32\x5b\xc2\xc3\x1b\xe0\x25\x0f\x94\x82\xe1\x3f\xd8\xeb\x44\xe2\xae\xd7\x6b\xe8\x12\xaf\x54\x53\xcb\x7f\x86\x32\x45\x8f\xc8\xa0\x2a\x2f\x45\x48\x0d\x79\xb0\x6c\x7d\xda\x38\xb4\x69\x5d\x08\xb5\xa4\x30\x50\x4f\x1a\xe2\x27\x5b\x05\xc9\x1e\x79\x9d\x44\x70\xf3\x8a\xbe\x77\x73\x6d\xfa\x89\x5c\x19\x7e\xa4\xb6\x3c\x2d\xf1\x8e\xfe\xb1\x41\x84\x83\x7b\x8d\xdf\x48\x90\x95\x20\xd9\x10\x45\xb9\xd9\x65\x5c\x22\x5a\x83\x17\x39\x60\xb4\xd7\xcd\x0d\x8b\xae\x30\x23\x75\x57\xf8\x69\x70\x8b\xe1\x38\xad\x52\x46\xc8\x66\xc6\xc0\x59\xdc\x59\x7a\xbf\xd4\x94\x32\x37\x37\x68\x96\x73\x6b\x97\xb7\xe0\x28\x9e\xf9\xbb\xd2\x94\x77\x74\x5c\xb6\x0f\x46\x20\x2f\x1d\xe9\x84\xf5\x09\xb1\x80\x88\x33\xf5\x80\x18\xcd\xe8\xc2\x6b\xef\x4c\x00\x5b\xdc\xa3\x85\xb0\x57\x35\x11\x0c\xa0\x2e\x56\x2b\x50\xed\xdf\xf6\xfd\xe9\xfb\xb8\xd0\x30\xce\xdf\x70\x31\xbb\xeb\x32\xb1\x2b\x24\x2b\xe4\x9f\xde\x01\x60\xc1\xfb\xde\x99\xb0\x3c\x06\x2a\x1a\x47\x06\x23\x45\xc9\x2e\x0b\x60\x4d\x08\x0f\xac\xce\x92\x43\x48\x15\x29\xc7\x05\x97\xdf\xd6\x43\x82\xcb\x54\x06\x91\xb5\x9b\x71\xb0\x94\x33\x2b\xaf\x0b\xbb\x12\x5b\x63\xa4\x46\xbb\x97\x49\x1c\x04\x64\x32\x8c\xab\xd7\x62\x7c\x46\xf3\x92\xf3\xb1\x24\x82\x2f\x20\x13\xc6\xe1\x6d\x3c\xa8\x7c\xc5\xbe\xcf\x56\xb0\xfc\x6e\xb2\xbf\x99\x23\xb3\x01\x2b\xa2\xb6\x12\x50\xa6\x33\xa4\xd2\xee\x39\x12\x56\xc5\x20\x95\x73\x82\xaf\xf9\x70\xc5\xd2\x23\x85\xc3\x34\x4c\x6d\x4b\x45\x61\x57\x1c\x96\x32\x9b\xf7\x56\x15\x29\x75\x16\xb9\xf2\xce\xb9\xf9\x97\xa3\x95\x23\xaa\x0f\x58\xb4\x88\x77\x2d\x82\xfc\x0d\x78\xc5\xdd\x52\xec\xfa\x6b\xfa\xc6\x3a\x76\xe1\x48\x08\x8b\x36\xf2\x4a\x88\xe6\x83\x85\x49\x6d\xda\xdf\x30\x23\xf7\x2d\x87\xc2\xef\xa2\x6e\x87\x7d\x32\xf1\xda\x97\xcd\xb4\x2c\x8f\x15\x71\x89\x88\xe4\x28\xcd\x02\xf4\xd0\x95\x43\xbd\x0b\xd5\xb2\xf4\x09\x96\x3d\x0f\xa3\x73\x53\x1f\x78\xb5\x92\xbd\x13\x7e\xea\xea\x0b\x4e\x7f\x91\x82\x08\xe1\xd5\x90\x08\xa8\xaf\x50\x58\xf5\xd9\x23\xc4\xf3\x2d\xf1\x99\x90\xf1\x0d\xd3\xf0\xeb\x20\x62\x93\xb2\xb3\x44\x3f\x4a\x5d\x2d\xcc\x5f\x7d\x3b\xba\xf6\xaf\x43\xfe\x45\xf5\xdb\xbe\x53\xec\xf4\xbf\x1b\x4a\x13\xe2\xd4\x6e\xf8\x02\x98\xd4\xf0\x1c\x40\x2e\x21\x0f\xcb\x9f\xf2\x08\x4e\xc0\x3e\x42\x00\x8d"}, -{{0x69,0x6d,0xc4,0x81,0xf6,0x19,0xa9,0x49,0x85,0x63,0xc8,0x3d,0x0d,0x0e,0x55,0x56,0x5c,0x14,0xa0,0x78,0x45,0xfe,0x4a,0x66,0xab,0xa2,0x24,0x7b,0x11,0x3f,0xf8,0xef,},{0xc9,0xd7,0x37,0xab,0xc4,0xa9,0xe7,0x3c,0x14,0x9e,0xad,0xc1,0x95,0xa8,0x37,0x89,0x9f,0x2c,0xd5,0x01,0x93,0x73,0xc3,0x0e,0xca,0xf6,0x2e,0x5f,0x8e,0x14,0xb6,0x45,},{0xde,0xd5,0xd9,0x91,0x93,0x5c,0xd1,0xf9,0x39,0x0f,0x1e,0x85,0x92,0x9c,0xa1,0x6d,0xab,0xfc,0x83,0xe6,0x5e,0x43,0x27,0x2e,0xb1,0x75,0x16,0x71,0xaa,0x31,0x93,0x0c,0x72,0x85,0x55,0x34,0x14,0x30,0xce,0x7c,0x80,0x48,0x5d,0xe5,0x80,0x06,0x42,0x71,0x29,0xa4,0xd3,0x4f,0xd6,0x81,0xd5,0x2d,0x84,0x0a,0x16,0xba,0xfa,0x15,0x30,0x02,},"\x2d\x4b\x3a\xd0\xcc\x99\xf9\x83\xe4\x1f\x9b\x48\xc4\xa8\x18\xef\xf7\x5f\xcf\xb9\x3a\x12\x29\xec\x27\x40\xed\x19\xc1\x07\xd6\x21\xdf\x78\x05\x8d\xe7\xc2\xdd\x72\x51\xf5\xff\x45\x43\x40\x86\x5f\x6c\x86\xda\x65\x83\x1f\x66\x72\xdb\x23\x17\x26\xfd\xfe\x4b\x9e\xe3\x15\xd9\x3c\x72\x44\xa9\x20\xdf\x37\x05\x4c\x82\x44\x9d\x31\x0f\x89\x29\x32\xdd\xba\xd9\x4c\xc9\xbb\x39\xac\x89\x37\xcc\x76\xc9\x65\x21\xd3\xfd\xc0\x28\xba\x23\x41\x0b\x29\x02\x3e\x81\x38\xfd\x3f\x52\x43\x19\x88\x4e\xe5\xda\xd0\xd2\x34\xc8\xdf\x66\x1f\x88\x24\xbe\x47\x7e\x21\x69\x9f\x63\x69\xb1\x5f\xf3\xff\xef\xc1\x51\xaa\x55\x5b\x3c\x3d\x76\xad\xb4\x5f\x25\x67\x2d\x38\x0d\x47\x2b\x31\x48\xda\xbd\xef\x42\x45\xb6\x8e\x82\x85\x62\xf2\x5c\xc5\xb8\x1d\x9b\xbb\x24\x1b\xca\x9d\x19\x34\xea\x35\x3f\x95\xf7\xdb\xf3\x64\x64\x33\xe8\x1a\x35\x4e\x1e\x20\x56\xb8\x1c\x15\xaa\x1f\xa8\xed\x7a\x9d\x1a\xf9\x92\x38\xcd\x5a\x5a\xe9\xe8\x41\xc4\x8d\xc3\x48\xae\x1d\xe7\xc4\x1a\xca\x23\x32\x82\x36\xbc\x38\xb4\x7f\x47\xc7\x36\xb2\x57\xa3\x07\x8d\x57\xd5\x74\xb6\x47\xa7\xfc\x8c\x4d\x01\xbc\x50\x30\x21\x50\xd5\x03\x2b\xfa\xcb\x04\xbb\x0f\xd1\x55\xd9\x4d\x92\x06\x66\x77\x20\xe1\x80\xa6\x45\xaf\x46\x24\x59\xe3\x32\x6d\x46\x0d\xa3\xc4\x8e\x75\x72\x67\x8e\x19\x19\x26\x8d\x3e\x47\x40\xd6\x2a\x26\xf7\xc8\x55\x9c\x1c\x43\x9b\x4b\x0b\x0c\x59\x42\xa6\x20\xcf\xdb\x93\xcc\x68\xaa\x15\x52\x0f\xf2\x86\x42\x69\xd7\xa0\xc1\x55\x78\x0a\xdc\x6c\x18\x8e\x0b\x56\x5f\xb9\x59\x43\x19\xe6\xf5\x1d\x15\xca\xf6\xb2\x80\xe7\x15\x8f\x25\x79\x94\x07\xf3\xba\x0d\xd1\xce\xea\x64\xb9\x32\x6d\x2c\xfd\xef\x01\x7e\x1f\x17\x2f\x4d\xde\x0f\x7e\x46\x13\x50\x1a\xf0\x1e\xe0\xac\x30\x09\x5f\x48\xb5\x95\x90\x90\x2b\x1a\xec\xfe\x09\x34\x13\x91\x8d\x83\x5a\xdf\x96\x2e\xcf\x18\x58\x0d\x16\xf9\xfd\x4f\x6f\xa1\x09\x8a\xf1\xd8\xa2\xbc\x24\xdc\x86\xf7\x1d\x0a\x61\xff\x15\x00\x10\x86\x7d\x08\x69\x87\xb5\x1d\xd0\x30\xf5\x0a\xb6\xe3\x74\xb8\xe0\x11\x84\xb3\xe2\xb2\x14\xab\x1c\x7f\xdf\xae\xdb\xc5\x45\xe3\x8c\x3c\xd2\xf6\x98\x29\x79\x54\x1f\xe0\xff\x88\xbe\xd6\x75\x06\xda\x95\x72\x7a\xf1\xa2\x03\x8f\x32\x40\xae\x5b\xfd\x30\xee\x09\x21\x0e\x00\xfd\xcf\x2a\x06\x4d\x5d\xb4\x61\x49\x46\xbd\xa9\x72\xc6\x70\x08\x1a\x6e\xe6\xa1\x0b\x63\xf6\x73\xc8\x3c\x91\x5c\xa5\x57\x3e\x0e\xd6\x87\xb0\x06\x7c\x40\x07\x92\xa9\xbc\xc3\x34\x4e\x0e\x43\xf5\xdf\x63\xfe\xd5\xef\xa8\x5e\x9a\xaf\x85\xe4\xd7\xa2\xc5\x3a\x6c\x92\x82\x8e\x07\xfe\x63\xe2\xd2\x3f\x1b\xdf\x97\xd8\x4a\xdc\x36\xe9\xfc\x95\xfa\xad\xf0\x3e\x06\xd6\x5a\x19\xc5\xe2\x85\xef\xfd\x0e\xa0\xcf\xa8\x39\xd5\x5a\x0a\x0d\xbf\x6d\xa2\x87\x85\xc7\x7f\x5c\x04\xbf\xd5\x99\x74\xef\x37\x93\xcd\xc3\x98\xdf\x7a\x1b\xbc\x9c\xfc\xfc\x3a\x51\xff\xa9\xa2\x0d\x60\xc4\x7b\x24\x5d\xaf\xa3\xe4\x46\x23\xcd\x71\x1d\x77\x62\xc5\x0a\x67\xd6\x50\xc7\xe8\xc4\xfd\x3b\xeb\xc0\xc4\x98\xd2\x15\x2a\xb9\x82\x7c\x70\x0c\x7b\x28\x61\x56\x57\x49\xb5\x86\x4f\xec\x95\xb7\xf6\xb1\x99\x4e\x78\xd8\xf8\x5d\x06\x9c\xc1\x1f\x85\xbe\xd9\x71\x2f\x7a\x9f\x06\x0b\x0b\xf6\x75\x32\xe8\x8e\xb9\xdf\x3e\xb4\xa8\xd2\xfb\xba\xa8\x5e\xda\x92\x6d\x81\xc4\x9f\xb8\x6e\x73\x73\x1b\x7e\xd2\xa1\x90\x50\x78\x51\x3f\x7c\xa0\xfd\xcc\x3b\x1d\x57\x6e\x6a\x60\x12\x4c\x44\x61\x8d\xf1\x89\x0e\x16\x97\x94\x95\x6c\xb1\xec\x50\x1b\xa2\x04\x99\x70\xc8\xe7\x4c\xc1\x80\x06\x4c\x18\x44\x68\xbe\x4f\x08\x9a\x3a\xe2\x26\x3c\x85\x58\x63\xb6\x2c\x28\x31\x3d\xdf\x9c\xa8\x5b\xf6\x6b\x08\xa2\x64\x15\x5a\xd7\xc3\x28\x23\x8d\xfe\x61\x4a\x07\xed\xe9\x15\x5a\x09\xcc\xaf\xf9\x22\x92\x24\x93\x41\xba\xed\xcb\xe0\xe6\x46\x6e\x2c\x76\x04\x5e\x46\xda\xd2\xfc\x89\x9a\x17\x82\xe0\x09\x98\xe7\x9a\x83\xab\xfa\xe9\xb7\x06\xf7\x07\xf5\x8e\x73\x02\x03\xe1\xd2\xcc\xa0\x28\xc9\x22\xbe\xb6\xd1\x57\xfa\x7a\x98\x13\x2a\x92\x1a\x3d\xa2\x1f\x2f\x76\x9b\xb6\xc1\xf5\xf1\x9e\x9e\x85\xa1\x3b\x78\x1a\xf1\x41\x03\x9d\x51\x4e\xe1\x07"}, -{{0xf3,0xf8,0xd6,0x2f,0xee,0x3a,0xf3,0x75,0x66,0x96,0x30,0xcb,0xf0,0x63,0xbf,0xa9,0x30,0x18,0x9a,0xf1,0x36,0xcd,0x75,0x91,0xe2,0x4d,0x57,0x8d,0x73,0x66,0xbf,0x61,},{0x47,0x14,0xc6,0x04,0xaa,0x95,0xe1,0x82,0x8a,0x28,0x36,0x7b,0xa7,0x87,0x60,0xb5,0x89,0x64,0x31,0x68,0x3e,0xe9,0x96,0xcf,0xf9,0x68,0x71,0x77,0x32,0x91,0x95,0x3c,},{0x8d,0x6f,0x7c,0xee,0xb9,0x30,0x8b,0x4a,0x30,0x38,0x79,0xfc,0x6c,0xfa,0x5c,0xa8,0xe0,0x5d,0xfc,0x3d,0xef,0xc2,0xb2,0xcd,0x29,0x10,0xdd,0x4b,0x17,0xc9,0x4e,0xae,0xe8,0x45,0xab,0xe6,0x5f,0xd7,0x15,0xdf,0x05,0xb0,0x12,0x8e,0x43,0x16,0xe2,0x33,0x47,0x99,0xc6,0xe8,0xfa,0x74,0x7e,0xbc,0x8a,0x04,0x0c,0x74,0xf5,0xa1,0x48,0x0c,},"\xe1\xdd\x1f\xfd\x73\x7a\xc6\xdc\x24\xb3\xb9\xce\x3b\x79\xe8\x35\xbf\x69\x8e\x93\x13\x03\xd8\x09\xce\xa1\x78\x2d\xc3\xaf\x63\xa0\xd5\xe6\x73\x92\x82\x3d\x14\x39\xe7\xb6\xe3\x37\xb0\x1c\x8b\x21\x54\x34\xc2\x78\x2b\x3b\xe7\x44\x3c\xb5\xc8\x81\xe5\xfb\x6c\xf3\xbb\x24\x41\x28\xb4\xda\x6a\x6f\x42\xb2\xbb\x2c\xd7\x51\x29\xd5\x64\x18\x85\x43\x48\xc3\x39\xdc\xd9\x12\xb4\x55\x57\xa9\x15\xe9\xfd\x7f\x37\x91\x62\x36\x51\x0c\xb6\xc3\x31\xc1\x40\xb8\x7d\x22\x53\x11\x60\x0b\x8d\x13\x2a\xc4\x74\x73\x83\x9c\x72\x0f\x9f\xf0\xf9\xc1\xdc\xaa\x85\x81\x5a\x9d\x27\xb9\x75\x8c\xd9\x1d\xc5\xd3\xe5\x33\x26\xfc\xdf\xb2\x73\x0e\x52\xbe\x31\x03\x95\x7a\xc8\x91\x49\xa4\xc3\x00\x4c\xb6\x03\x8c\x0d\x80\xfa\x72\xac\x63\x0d\x33\x3b\xe5\xad\x4a\xdb\x58\x5a\xeb\x71\xae\xf1\xcd\xfd\x57\xb9\x15\xfa\xc4\xf1\xaf\x78\xe7\xa5\x97\xf8\xd1\xba\x06\x67\x2b\x19\xc0\xb6\x58\x08\xa8\xa0\x71\xff\x84\x09\x03\x43\x79\x58\x9f\x3d\x41\x30\x2d\x2d\x39\xb3\x31\x8e\x8c\x00\x90\xfa\x36\xcb\x95\x88\x57\xff\x5b\x21\x1c\x96\x66\xe2\x7b\xc8\x95\xab\x9d\x00\x6a\xba\xf5\x95\x0a\x03\xff\x17\xea\x98\x21\x78\xa4\x46\xdd\xa2\x46\x6f\x5a\x40\xb8\xf8\x95\x50\x9e\x4f\x4d\x4a\x6a\x27\x39\x99\x7f\xbd\x49\x68\xf8\x94\x36\xce\xe3\xd8\xed\xb8\xa6\xda\x9b\xd3\xd5\x5b\x06\x64\x90\xe8\x33\x9c\x78\x93\x5b\x77\x88\x3f\x95\xb9\x32\xfa\x5e\x6b\xb7\xdf\x30\x3b\xe3\x0f\xa5\x67\x24\x9f\xff\xb4\x73\xa1\xe4\x64\x32\x2d\x7c\x10\x3f\xe8\x22\x4c\x7e\xc5\x7b\xd3\x9b\xcd\x03\x0b\x96\x78\x7a\xeb\xcd\x20\xe9\xad\x65\x1c\xfa\x2b\xf0\x4b\xa7\x0a\x1c\xf6\x48\xe0\xa5\x44\x95\x67\x20\x2a\x93\x7a\x45\xbe\xcb\xb6\xfc\xde\xd3\x0c\xf9\xb5\xc7\x48\xf8\x82\xb5\xdc\x2a\x4d\x65\xbe\x69\xfd\x7d\x9c\x38\x1e\x83\xd0\xdc\x2a\x34\xb6\xde\xe9\x12\x20\xba\x90\x6e\x51\x2f\xcd\x63\x36\x8e\x2c\xe7\x33\xe4\x66\xb4\xb8\x2b\x84\xfb\x0c\x71\x7d\xc8\x94\x5c\xaf\x6d\x46\xac\x1c\x2f\x64\x18\xf7\x72\x9e\xf4\xc3\x5e\x40\x24\x22\xd6\x4b\x1c\x3e\xbd\x1b\x32\xa3\x0f\xc4\xc5\xee\xce\x7d\x44\x08\xff\x67\x9f\xf0\x1a\x1c\x7b\x03\xca\x51\x7b\xe5\x2e\x6a\xe7\x65\x0f\x7b\xad\x38\x90\x1e\x34\x8a\x55\x93\xbc\x99\x8f\x7c\xf2\xea\x97\x72\x9c\xb0\x04\xf5\x61\xb3\xb5\x8f\xe5\x98\x09\xa4\x1f\xd4\xb3\xb7\x66\x60\x90\x6a\xd9\xed\xa2\x3b\xf9\x25\x43\x7e\xf4\x52\xb1\x6f\x54\x0b\x3b\x80\xa3\x5a\x70\x93\xc2\x73\x4e\xef\xe6\xfa\x97\xd8\x81\xd7\x9e\xf5\xb7\x67\xd9\x88\x9f\x11\x84\x77\xb7\x3f\x58\xa4\xc0\xcb\x15\xe0\xac\x81\x01\x12\x05\x71\xca\x32\xce\x87\x1f\x30\x8a\xd9\x05\x7a\x80\xc8\x28\x15\x4f\xb1\xbc\x2b\x20\x1d\x0c\xd1\x00\x6e\x02\x2d\x44\x4d\xc9\x3f\x1b\xcf\x22\x4d\xb7\x4a\x5b\x37\x3e\x15\x3e\x85\x18\x54\x94\x8b\x6d\xa1\x47\xb7\x32\x87\xcf\x17\xd1\xfb\x72\xb4\x82\x76\x11\x10\x36\x09\xca\xb2\xa1\x77\x9e\x97\x93\xb9\xa7\x08\x20\xfc\x6f\x38\x28\xa6\x4c\x9e\xac\x35\xef\x7a\xa7\xb1\x76\x09\xd8\xef\xf8\xa9\xe5\x2e\x4e\xbc\xd8\x6b\x1e\x14\xfd\x14\x0b\xea\x47\xc6\xb8\xdd\xc4\x1e\x8c\xd2\x71\xeb\x92\x28\x7c\xbd\x06\x10\x51\x22\x42\xf7\x6a\x1e\xf3\xea\xc1\xe4\xbb\xbc\x1a\xda\xe5\x00\x34\xa7\xa2\x64\x7e\x08\xb2\xfd\x20\xaa\x93\xa9\x3c\xb2\xff\xde\xbf\x2e\x46\x1e\xcc\xef\xbb\xd1\xfe\x89\x4c\xe7\x0a\xdf\x79\x01\x73\xba\xe9\x6f\x5a\x55\xa1\x88\x7e\x9a\xe0\x9f\xce\xd1\xd4\x30\x6c\x29\x1c\x6b\x19\xec\xac\x47\x07\xe9\xef\x71\x3e\xa1\x8a\x75\x62\xc6\x67\x83\x26\x22\x89\x92\x07\x7a\x46\x69\x73\x49\x66\x10\x80\x00\xb4\x14\x4f\x45\xa0\xc3\xa2\x86\x3a\x4c\x6a\x3c\x07\x63\x2c\xb9\x3e\xb1\x97\xd2\x94\x88\x4d\x9c\xa3\xdd\x4b\x21\xf3\x9d\xb7\x07\xf6\x3a\x7f\x9a\x57\x0f\x7f\x0f\xeb\x99\xb2\xca\x7d\xa7\xdf\x92\xa1\x77\xab\xcf\xe8\x6e\xc6\x61\xd3\x0b\xcd\xcf\x15\x22\xbd\xb1\xfe\x11\x67\x32\x58\xdf\x7e\x46\xef\x4d\x32\x66\x65\x09\x31\x56\x55\x3f\x28\xb3\x56\x3f\xe7\x19\x2f\x72\xf5\xf9\xb3\x90\x3d\x79\xfe\xa0\x4e\x2c\x48\x8b\x46\x5b\x49\x78\xd6\x9f\x26\xe0\x5a\x59\xd5\xed\x4e\xf4\xca\xb2\x32\xac\xfd\x56\x4f\xc6"}, -{{0x86,0x5a,0x43,0x2e,0xcc,0xe7,0xe7,0x8c,0x42,0x70,0x9f,0xc1,0xe5,0x31,0xdf,0x5e,0x39,0x59,0x13,0x2b,0x2b,0x6f,0x31,0x8f,0xd1,0xc3,0x45,0x21,0xf9,0xa2,0x6e,0x3b,},{0xc7,0xa8,0xca,0xf8,0x93,0x0b,0x62,0x2a,0x50,0x13,0x37,0xf9,0x28,0x40,0xed,0x96,0x61,0x1a,0x32,0x20,0x80,0xfd,0xe5,0xe4,0x9f,0x0a,0x2f,0x6e,0x33,0xb8,0x82,0x83,},{0x32,0xbb,0x75,0x20,0xe2,0x63,0x9c,0x6c,0xca,0x19,0xa2,0xb9,0x83,0x6b,0x08,0xf8,0xb0,0x83,0xca,0x33,0x36,0x9d,0xdf,0x5f,0x9a,0x87,0x7d,0x4c,0x7a,0x9e,0xb0,0x5f,0x9c,0x3d,0xc3,0x4e,0xd4,0xcf,0xa4,0xb2,0x83,0xe5,0x19,0x22,0xb0,0x94,0x06,0x6c,0xe9,0xff,0xa4,0xd9,0xdf,0x62,0x19,0x10,0xca,0x37,0xb0,0xb3,0x7f,0xba,0xbb,0x0e,},"\xb2\x31\xb6\xd2\xec\xde\x49\xf5\x13\xb0\xdf\x25\xaa\xfc\x3e\x5d\xa4\x5b\x6a\x99\x58\xd6\x0f\x54\x64\xca\x59\x3c\x03\x00\x5e\xcf\x36\x1e\xf1\x69\x6b\xb6\xe5\x5d\x65\x38\xe3\x4b\x38\xf3\x24\xc2\x1c\xea\x5c\xc8\x1a\x00\x73\x27\x8b\xb9\x27\x27\xef\xf8\x1a\xf5\x61\x80\x2d\xce\xf3\x3b\xec\x10\xad\x65\x94\xe2\x2d\x9c\x44\x18\xaf\x39\x88\xa4\x3e\xd0\x87\xb9\x95\x4b\xf8\xd6\x28\x3e\x4b\xea\xe8\xc0\x96\xde\x66\x06\x75\x1c\xbe\xd6\x85\x84\x6c\x66\x30\xb9\x52\x8f\xf3\x64\xa7\xc4\x84\x64\x11\x34\x72\xc9\x86\x0b\x33\x71\x96\x3c\x91\x14\x95\xa9\xc6\x28\xa3\xe3\xe4\x7a\xb0\x99\x1f\x10\xdd\x1d\xd3\x31\x61\x52\x52\x62\xd6\x3b\xab\x64\x88\x19\xd5\x7d\x12\x69\xe1\x14\x82\x5c\x54\x34\xe6\xb2\x84\x5f\x42\x79\x5d\x4f\xb0\x83\xad\x79\x40\x1f\x2a\x07\x61\xc6\x34\xa5\x45\xae\xc7\xcd\xb1\x3b\x5b\xe4\x49\xf1\xd8\x29\x32\x63\x78\xed\x1f\x49\x3f\xe8\xc8\xe9\xb0\x68\xcc\x1d\xbc\xf1\x65\x55\x0b\x81\x32\xc3\x19\xda\xc4\x87\xb8\x7b\xb2\x2a\x54\xcd\xf6\x0a\xac\x71\x51\x61\x82\xa4\xe6\x9b\xa0\x83\xf6\xe8\x6d\x1a\x4f\x05\x08\x3a\x77\x61\x9e\xf2\x39\xf7\x02\x39\x6d\x7e\x46\x96\x8c\xc0\x4a\x3b\x34\xdf\x32\x65\xec\xf1\x61\x57\xab\xe1\x5c\x64\x2c\xd7\x42\x70\x96\xd8\xd4\x0d\xb0\x02\xd1\x96\xca\xb1\xbe\x30\x4b\xcf\x32\x2d\x9d\x1a\x24\x51\xb6\xc1\x1e\xea\xf3\xe8\xe3\xd9\x29\xf4\x80\xb6\xb7\x78\x04\xfe\x84\x49\x6c\xa7\x57\xe0\x43\x37\x91\x4c\xe9\x44\x75\xd7\x99\x0c\x74\x57\xc8\xe6\x06\xf8\xbc\x20\x7d\x2d\x48\x11\x9c\x80\xa6\xb4\xa9\xe0\x7b\x22\x92\x26\x57\x0d\xcd\x99\x49\x89\xfe\xcc\x69\x4c\x6c\x2f\xb5\x97\x5c\x9a\x6a\x9b\x74\xe8\x15\x9c\x27\xdd\x36\x77\xdf\xd5\xcb\x65\x1f\x1e\x32\xad\xfa\xfd\x81\x0b\x6e\x5d\x5e\xfb\xac\xe3\x1a\xe6\xd9\xb1\x21\x91\xe8\x93\x98\xda\x06\x3f\x13\x8b\x75\x84\xc5\x8e\x77\xe7\xf9\xfd\xd7\xfb\x9e\xf5\xd6\x8a\xe4\x9c\x6c\xca\xd2\x8d\x18\xbc\x60\x09\xd4\x18\x7e\xd1\x42\x02\x24\xa5\x65\x8a\xad\xf1\x35\xb5\xa9\x53\xf2\xdc\x3c\x8b\xfc\xaf\x66\x9e\xd5\xda\x38\xd0\x14\x4f\xd9\x66\x5e\x6f\x06\x77\xd3\xfc\x88\x04\xe2\x1c\xc2\x5f\xd5\xe0\x1a\x3f\x3f\xa8\x3e\x57\x1e\xb2\xf8\x82\xa7\x65\x9c\xe5\xd8\x64\xd8\xbb\x54\x07\x2b\x09\x86\xa8\x54\xf1\xa7\xf2\xd2\x72\x0d\xf8\x57\xe6\xd4\x21\x96\x30\x84\x1b\x1c\xcd\xcf\xc6\x72\x6b\x91\xbf\xc1\x7e\x18\xc3\xe3\x48\x0c\x23\xa2\xc0\x5e\x4b\xfe\xdd\xd4\xdb\x9e\xf4\x23\x88\xf2\x34\xfd\x3e\x4f\x3d\xad\x66\x60\x26\xe2\x78\x06\x12\x37\x41\x61\x31\x6a\xfc\x76\x65\xf9\x41\x1b\x6c\x5a\xa7\x89\x33\xb1\x80\x21\xc0\x12\xb0\x84\xf3\x24\x47\x60\xa4\xea\x1b\xcf\x31\xcc\x9f\x5c\x40\x44\xa9\xbc\xc7\x5a\x98\x67\x07\xf3\x8f\x45\xac\x1c\x7f\xa1\x39\xee\x95\xa6\xd8\xf1\x6c\x3c\x1e\x12\x76\x4c\x4b\x0b\x11\x94\xc0\xfc\x5f\x7e\xef\xf9\xa8\x48\xc4\x05\x0b\x0e\x65\x16\x84\x71\x9d\x43\x8a\xad\x56\x01\x91\x64\xfa\xe4\xf4\x88\x82\x20\x5e\xce\x0b\x99\x73\x67\x91\x08\x4a\x75\x3b\xa7\xd5\x6e\x88\xfc\xee\xa5\x33\x56\x6c\x3a\x2c\xa4\x8d\xd6\xef\xc4\x9b\x27\xdb\xf1\x4f\x26\x16\xce\xd6\x52\xe1\x38\x33\xab\x90\x28\xad\xa4\x54\x43\x1c\x89\xb3\xcb\x74\x41\xfd\xb8\xf2\x3e\x12\xb6\x0a\x1a\x10\x4a\x2a\x8c\xf4\xa6\x4e\x87\x8a\xa2\x6f\x54\xe8\x88\x1a\x4b\x15\x1a\x16\xa9\x6d\xe8\xb9\x80\x7e\x72\x93\x96\xeb\xe3\xe3\xd3\x94\xf8\x08\xbd\x74\xb7\x31\x2f\xe6\xb8\x4b\x13\x12\xaf\x8a\x1e\x41\x33\x59\x9d\x07\xbd\xf3\x3d\xb2\x1e\x01\x6b\x5c\x19\x6c\x1b\xa3\x11\x57\x08\xf5\x81\xbb\x82\xf4\xb5\x7a\x6c\xa1\xa5\x29\xe6\x4d\x19\x30\x42\xc1\xdc\x5f\xaa\x0a\x03\xab\xf5\x38\x49\xe1\xbd\xef\xba\xb6\x4b\x1c\xb6\x0f\xe1\x0a\x3f\xc1\x82\x3a\x23\x4c\x45\xf3\xb0\xdc\xe6\x6a\x46\x73\x9c\x01\xae\xad\x12\xde\x6f\x03\x13\xc7\xbe\x71\x40\x5f\x3f\xdc\x4a\x50\x7a\x9d\x84\xe8\x68\x6f\x6f\xc9\x26\x35\xdb\x0f\x78\x56\xc7\x37\x3a\x61\x8a\x72\x52\xc1\x29\xa7\x76\x0e\x20\x29\x54\x3d\x72\x62\x28\xc2\x1d\x00\xad\x4a\xc5\x2e\x5b\x1a\x6e\x31\x20\x09\x17\xf1\x5a\xf5\x15\x85\x9e\x08\xf2\xa7\x9a\xce\x67\x99\x1e\xd6\x90\x44"}, -{{0x2b,0xe1,0xf9,0x8c,0xe6,0x55,0x3c,0x91,0x5b,0x6a,0x09,0x33,0xec,0x0d,0xe3,0x47,0xb3,0x70,0xe2,0x9c,0xa2,0x94,0xe8,0x00,0x55,0x41,0x23,0x9f,0x63,0xb4,0x30,0xd0,},{0x7a,0x6f,0x44,0x69,0xc3,0x0a,0x63,0xf5,0x60,0xf9,0x87,0x34,0xfc,0x19,0x06,0xeb,0xd1,0x37,0x1e,0xd8,0x01,0x25,0xfa,0x3e,0x4c,0x86,0xb4,0x3f,0x26,0x2c,0xab,0xbc,},{0x8e,0x65,0x9a,0x3f,0x53,0x5a,0x58,0x9a,0x5f,0xd2,0xd2,0x17,0xcb,0xcb,0x8b,0x77,0x7e,0x5a,0xf2,0x0b,0x23,0x44,0x32,0xf7,0xda,0xc2,0x9f,0x81,0x0a,0x2b,0x47,0x37,0xc5,0xca,0xb1,0x0b,0x59,0xdf,0xd0,0x14,0x4f,0x30,0x90,0xf5,0xf9,0xe0,0xe6,0x67,0xf0,0xe2,0x1a,0x9f,0x57,0x3f,0xe1,0x3b,0x1c,0x28,0xec,0xcb,0xb5,0x31,0xa2,0x05,},"\x62\x68\x20\x1f\x93\x2a\x7c\xd3\xf8\x79\xae\x6a\xb8\x38\x55\xa2\xf5\x02\x91\xde\x78\x4d\x7d\x9e\x9a\xda\xa1\xb9\xaf\xed\x6f\x5a\xea\x20\x24\x0e\x59\xfe\x93\xe5\xa7\x08\x8c\x95\xec\x8e\x15\x74\x5f\xb8\xfd\xeb\x91\xdf\x01\x51\xc7\xb4\x60\x50\x67\x56\x1e\xa0\x8d\xbf\x00\xc4\xff\xe1\xfd\x0a\xcf\x10\x36\x56\xa7\xb5\x4f\xad\x0f\x25\xab\x16\xb4\xbd\xa3\x47\x17\x9e\xd1\xca\xdb\x7b\x98\xbe\x08\x95\xe0\x50\xdc\xbc\x37\x9d\x1f\xd5\x53\xe9\x97\x95\x92\x8b\x67\xa7\x52\xf8\xd2\xec\x1b\x9d\x66\xbf\x6a\xc9\x97\xe7\x44\xdc\x32\x7f\x24\x22\x30\xf9\x2e\x79\xae\x31\x27\x45\xa5\xab\x6d\xde\xc1\x99\x8f\xb6\x3d\xc4\xf6\xb0\x5f\x14\x72\x22\xd4\xb6\x5a\xce\x90\x17\xdc\x1b\xcd\x67\x5e\x49\x5f\x9e\xab\xb5\xf6\x02\x13\x3f\x6c\x72\xe0\x53\xe9\xf4\xae\x30\xd8\x72\xd7\x8b\xf7\x1f\xeb\xa3\x7a\xcc\x59\x50\x55\xc3\xbe\xa5\x3a\x05\xef\x0c\x7f\x21\x2d\xcf\x4e\x0a\xf8\x38\xea\x29\x28\xf4\xcd\xc9\xfd\xc8\x37\xda\x25\xf2\x69\x66\xb2\x45\x6a\xbe\xa6\x6a\x5d\xfb\x8f\xaa\x8f\xa0\x91\xf7\x33\x1d\x54\x36\xe9\x8a\x8d\x63\x23\xcc\x9e\x9a\x91\xd5\xa0\x2a\x49\x51\x17\x14\x84\x9b\x47\x45\x4b\xaf\x99\xc5\xf8\x50\xa0\x8d\x3d\x98\x41\x0e\x93\x9a\x9e\x89\xb1\x50\x53\x82\x5f\x3e\x9a\xee\x71\x44\x74\x16\x14\x07\x82\xe1\xbf\x3b\x0d\x8b\x4f\xf6\x2e\x77\xa4\xa0\x3f\x71\x0a\x8a\xb7\x6c\xf6\x35\x92\xc0\x5c\x44\x0c\x8f\x06\x47\x70\x09\x91\x63\xc1\x22\x70\xf3\xd5\xec\x9a\x6b\xc9\x71\x5b\xff\xfe\xc7\x69\x61\x1d\x21\xfa\x00\x3c\x3c\xc8\x35\x6c\x97\x5d\x37\xb6\x2b\x88\xaa\xbb\x85\x97\xda\xca\x19\x6c\x96\x48\xa3\x1d\x15\xbb\x0b\x86\xcf\x07\x0e\xe0\x1e\x51\x1e\xf3\x73\xb4\xa4\x4c\x6a\x00\x16\x0a\x79\x7f\x2e\x82\x0b\x71\x6f\x5c\xa6\x44\x64\xe4\x18\x9a\x00\xfe\xe9\x78\xd3\x5b\xf2\x04\xf7\x1d\xb1\xf5\x01\xf9\xb6\xe5\xdf\xc8\x21\xa8\xaf\x5d\xbf\xef\xd3\x53\xad\x36\x81\xf9\xbc\x3c\x22\xc6\x7c\xb2\x11\xb4\x30\xb6\xa5\x5f\x3e\x73\xda\x7c\x3a\x07\xce\xb7\xd2\xfe\x25\x4b\x10\xc2\x70\x3a\xb2\xe2\x29\x4d\xd0\xd3\x15\x2d\xc7\xb2\x1a\xab\x87\xb1\x50\xf7\x37\xa9\x47\x46\x3f\xb2\x04\x17\x5d\xe8\x54\x32\x36\xfb\xb0\xda\x5c\x7d\x48\xc5\x7f\x61\x74\x4d\xe6\xf9\x84\xaa\x8e\x61\xb9\x70\xc6\x2d\x0e\xeb\x84\x9d\xa7\xe8\x9a\x61\x22\x2d\x43\x20\x79\xcb\xcf\x5f\x8a\x2b\xa9\x30\x30\x16\x83\xc0\x78\x5c\x26\xfd\xf8\x5d\xa3\x02\x08\x74\x60\x45\x99\xac\x6c\x84\x7e\xc2\x60\x86\x58\xb5\x78\x8c\x7b\x8d\x3a\x37\x44\xfd\x54\x42\xe2\x4c\x8e\xec\xcd\x42\x07\x56\xbd\xd8\xb8\xa7\x7c\xfd\x80\x58\x96\x05\xdc\xed\x9a\xfd\xa2\xbd\xb6\x30\xa0\xcb\x61\x2f\x73\x9c\xe6\x17\xd5\x4e\xde\x6c\xcf\x36\xaa\x31\xe7\xe3\x73\xd8\xa0\xfb\x1b\x7c\x99\x06\xf7\x6b\x5f\x9d\xe8\xc2\x68\x91\xde\x00\x6e\xb7\x97\xea\xd4\xa8\x6f\x70\x16\xf3\x4b\xcd\xe9\x2f\x94\xac\x3e\x92\x0b\xa5\x8d\x6d\xff\x77\x20\x78\xd8\x02\xa9\x4f\x56\xcb\x26\xbf\x79\x4f\xd9\x0c\xa0\xad\x4f\x2e\x7a\xcd\xc5\x92\x9b\xc7\x36\x49\x97\xde\xd9\x8c\xa6\x9c\x57\x39\x91\xbb\x9a\xb8\x5f\x23\x5b\x63\xe7\x6f\x77\xe0\xab\x45\xe7\x89\x12\x38\x98\x69\xaf\x21\xe7\x4e\x66\xf7\xc4\x56\xb8\x27\xe6\x70\xbe\xb0\xf0\x72\x66\x88\xbb\x1f\x90\x36\xd3\x8d\xa0\x7d\x69\xea\x36\x66\xf7\x6b\xd6\x05\xd8\x2e\x2d\xd6\x38\x7e\xce\x6e\x82\x4a\x56\x97\x00\xf0\x1b\x19\x5d\x1a\x9b\xdc\xb0\xf9\x6a\xb5\xc5\x4e\x06\xc2\x11\x9b\x40\x6b\xc4\x88\x84\x80\x66\x04\x18\xbb\x42\x88\xea\x2f\xda\x96\x63\x1b\x0e\x1f\x60\xac\x86\x1d\x6c\xcc\x4c\x84\x4b\x64\x7a\x7d\x74\x03\xbc\x2d\x15\xba\xfe\x4a\xf6\x77\xe8\x56\xfe\x0d\x2b\x5f\x66\x3b\xe4\xe4\x80\xb3\x8f\x6b\x76\x6a\xdc\xd3\xd0\x52\x98\xef\x13\x98\xd0\x4d\x15\x23\xa6\x8b\x91\xdd\x31\xcf\x5d\xc4\xb7\x3d\xec\xbf\xd7\x21\x3f\x98\x1b\x20\x7e\x1f\x6e\xf2\x25\xd7\x94\x8a\x1a\xa1\x7d\x8d\x57\xa1\x12\xf1\xd4\x46\x8d\x2d\x28\xf7\xec\x2e\x54\xb7\x4a\x69\x2c\x59\x58\x02\x2e\x82\x03\x1a\x41\xb3\x15\x09\x0e\xd4\xd5\xbd\x7b\xd0\xb4\x51\x47\x63\x38\xf7\x39\xa7\xd7\x03\x1a\xf2\xd3\x6c\xaa\x09\xff\xdb\xb7\xc3\x96\x50\x7c\x75"}, -{{0x10,0xbb,0xe6,0xe7,0x61,0xa7,0x5c,0x93,0x5b,0x51,0x7f,0x09,0x36,0xfe,0xcb,0x9e,0xc6,0xfc,0x21,0x5e,0x58,0x13,0x08,0x00,0xea,0x18,0xd1,0xff,0x44,0x2a,0x4f,0x13,},{0x86,0x43,0xdd,0xf8,0xaa,0x8d,0x9c,0x8a,0x78,0xb6,0xeb,0x69,0x9f,0xd2,0x0a,0x57,0xf6,0xf1,0x86,0x36,0xb0,0x6c,0xe6,0x9d,0xac,0xdc,0xa1,0x26,0x7a,0xcb,0x39,0x54,},{0xf0,0xf3,0x57,0x41,0x03,0x73,0x31,0x3b,0x7c,0x62,0x52,0xd6,0xd9,0x66,0x00,0x36,0x0c,0x23,0x75,0x2d,0x43,0x1c,0xa8,0x07,0x5b,0xcf,0xb7,0x72,0xd4,0x9c,0xd6,0x09,0xb6,0x5c,0x9c,0xd8,0x38,0xd6,0x34,0xd8,0xd9,0xb9,0x5d,0x1e,0xe3,0x0e,0xde,0xcc,0x13,0xe3,0xca,0x99,0x7b,0x24,0x37,0x30,0x3f,0x8a,0x33,0xa1,0xff,0xc8,0x33,0x06,},"\xe8\x10\x8c\x6d\xe4\x13\x37\x33\xdc\x19\x9a\x73\x39\x2e\x22\x6f\x71\x2c\x36\xa2\x4f\xa9\x1d\x6f\xb0\x9f\x92\xdf\x21\x8d\xeb\x2d\x28\x30\xa6\x68\xfd\x69\x4b\x48\x09\xd0\x25\x35\x07\x23\x12\x47\xc7\xf2\x58\xb4\xd6\x5c\x56\xbb\x69\x34\x5e\xf6\xaa\x97\xe7\xc5\x9e\x81\x53\x77\x5a\x5a\x3c\xf1\x09\xc4\xbc\xa9\x81\x55\x69\xda\x69\x32\xe8\x21\x83\x42\x5b\x42\xd7\x48\x3c\x9d\xbf\xcb\xd8\xeb\x38\xc8\x47\x29\x57\x1e\x8e\xc9\x39\x82\xc3\x17\x71\x67\x59\x59\x8c\x4f\x6a\x1b\x7f\x8d\xa7\x30\x6a\x78\x15\x72\x1c\xaf\x02\xe7\x02\x46\x71\x23\x14\xf7\x66\xbe\x9c\xb1\x77\xcd\x2f\xa3\xbd\xa2\x2c\xd6\x76\xc5\xd2\xe8\x6e\x8d\x79\x8f\xd3\x4f\x54\x3c\x9b\xe3\x12\x96\x51\xf2\x73\xf4\x84\xf0\xb9\x46\x7b\x14\x09\x55\xcd\x29\x81\xff\x26\x03\xc0\xbd\xbb\x43\x6a\xc0\x95\x5a\x11\x6c\x5e\x5f\xc3\x04\x25\xe1\xfe\x78\xf6\x41\x0f\x6e\xf7\x57\xf6\x04\x66\x88\x54\xba\xe7\x9b\xfe\x22\xe1\xa8\x5c\xe5\xee\x5d\x64\x34\xb4\x61\x01\x20\xea\x7e\x5d\x3d\x13\x7c\xe2\x07\x51\x4f\x85\x34\xad\x9b\xf3\x92\xb7\xdc\x53\x55\x51\x4b\x59\xf8\x35\x46\x6c\x8e\xb5\x6f\x44\xed\xdc\x5b\xad\x20\xcf\x0b\x48\x0b\x2e\x82\x2a\x6f\x46\xfd\x95\xf3\x0f\x18\x3c\x7b\xb3\x14\x3e\x4e\x61\x00\xe2\xdb\xc9\xf2\xbf\x0d\x43\x07\x3e\x0f\xe6\x5f\x01\xbc\xce\x6a\x1a\xe4\x01\xc1\x25\x41\xbe\x3a\xe6\x8c\xde\xac\x2a\x4a\xc7\x1f\x16\x63\xb5\xfd\xfc\x2e\x50\xf0\xe0\x77\xfb\x3a\x0a\x8b\x8e\xee\xad\x62\x7c\x1c\x3e\x79\xdd\x73\x61\x04\x6f\x7e\x57\xc1\x74\x36\xc3\x2d\xc4\x43\x2f\x05\x00\x28\xcc\x7a\xa4\x40\x8c\x2d\x29\xd1\xd7\x99\x8f\xdc\xdd\xa3\x2b\xb3\x2f\x70\x4d\xc2\x63\xdb\x9b\x8e\x06\xc5\x76\x30\x87\x0f\x8b\xb6\xec\x66\x1f\xde\x1b\x7d\xa9\x4d\x53\xb0\x47\x70\x1a\x45\x88\x47\x8c\x1c\x66\x23\x46\x74\x1a\xea\xc4\xc2\x53\x38\x55\x6a\x3d\x84\x8d\xe5\xb2\xa2\x3e\xce\xa6\x1b\x77\x6b\xd0\xe8\x03\x7e\xfb\x85\x01\xef\xf2\x39\xc7\xfa\xcc\xa6\xc8\x36\x7e\xd7\xc8\xad\xce\x91\x9f\xef\x1a\x15\x5a\xe0\xd5\x47\x8a\x98\x00\x2c\x95\xa1\x6f\xbf\x4c\x0e\xd0\x16\xea\x5d\x38\x66\xfe\x1d\xe4\x54\x83\x2a\x4e\x95\x65\x97\x6b\x60\xb3\xdd\x2e\xaf\x7f\xee\x61\x2f\x2b\xc0\x40\xd9\x39\x75\x43\x5e\xeb\xd1\x2f\x06\xeb\x09\xec\xea\x2c\x66\x76\x83\x08\xf5\x8c\x77\xac\x51\xed\x7b\xd2\x16\x36\xfc\x9c\xc3\xfd\x14\x87\x0b\xd0\x6b\xdf\x12\x8a\x81\xb1\x47\x92\xe6\x08\xc4\x7e\xa2\xd5\x35\xca\x7a\xa2\x1e\xb8\xa8\xa5\x6d\x76\x99\x16\x63\xa8\x19\x0a\x95\x05\x7d\x33\x67\x1e\x73\xc7\xcb\xce\x5a\x98\xd3\x1e\xf0\xd7\x3b\xd0\xb1\x63\x78\x7b\x7f\xdc\xd2\xdd\xfc\x72\x96\x0f\x2b\xe3\x20\x84\x6d\x4b\x29\x08\x0d\x7a\xeb\x5b\x7e\xa6\x45\xa2\xad\x5a\x59\xc0\x12\xbf\x7b\x95\x15\xd8\x59\xe1\xc1\x47\x2e\xf8\xa4\xd3\xc9\x5e\x71\x1a\xf9\x7a\xe4\x61\x8e\xfb\xab\x3d\xff\xe8\x8c\x9f\x6a\xf4\xa0\x9b\x0e\x73\x38\x7e\x25\x1b\x77\xd7\xbf\xf5\x21\x4f\x79\x18\x62\xdb\x69\x88\x41\x1e\x2a\xe2\xc7\x5b\xf2\x8d\x28\x60\x2a\x63\x7c\x26\xf4\x9c\x18\xd3\x09\xd2\xfc\x58\xa1\x26\x66\x7a\xd3\xc2\xec\x16\x0c\x99\xba\x40\xfb\xda\xc1\x7e\x7e\x4c\x21\xa5\xd5\x07\x85\x97\x62\xeb\xa0\x9c\x41\x60\xdf\x66\xf5\xfe\xef\xe6\x71\x5a\x28\xc5\x29\x6c\xf4\x3e\x5e\x77\x1f\x31\xfc\xe5\x13\x3b\xe9\x7c\xab\x57\x30\x1b\x4c\x9d\xf9\xcd\x9a\x4a\xcf\x1c\x33\xfa\xc9\x46\xfa\x15\x96\xfa\x65\xc8\xf3\x65\x8b\xe4\x7a\x47\x3a\x62\xc5\x21\x81\xec\xa1\x83\xe4\x24\x6c\xd6\x24\xd8\x78\x3d\xcc\xe5\xfd\xcc\x1f\xea\x17\x3f\x80\x71\xf7\x07\x4f\x55\x89\x7d\xe9\xbf\xe8\x4a\x6c\x4f\xdf\x80\x2d\x50\x26\xb8\x14\x5e\x6c\x8c\x89\x50\xaf\xc5\xb4\x0f\xd0\x35\x6f\xc5\x5e\xe1\x7e\x1f\x85\x3a\x4c\x2f\xcc\x34\xa1\x36\x9b\x87\xd2\x8d\xc2\xfd\x20\x10\xf1\x99\x03\xaf\xf8\xe4\x6d\xe0\x49\x38\xf4\x94\x82\x45\xd5\xb4\x25\xd0\x74\xac\xdf\x2b\xd8\x0b\xfc\x37\x35\xcc\x34\xa2\x25\x90\xf1\x94\xaf\x93\x13\xee\xf4\xab\x5f\xde\x61\xf1\xf9\xb5\x85\x78\x63\x8f\xcb\x4f\x28\x50\xb2\xfc\xe6\xe0\x3d\xb4\xd0\xa8\x34\x84\x81\x63\xc4\xb2\x7e\x12\x9f\x5c\xc7\x4f\x67\xf0\x08\xa2\x71\x2d\x1d"}, -{{0x18,0x6d,0xcc,0x7e,0xfc,0x5e,0xd7,0xe6,0x1a,0xe5,0x3d,0xc4,0x20,0x93,0xba,0xe8,0xf1,0x5d,0xd9,0x9f,0x0f,0x03,0x33,0x26,0xc5,0x76,0xff,0x75,0x69,0x50,0xd0,0x6d,},{0xc8,0xd1,0x41,0xac,0xb6,0x42,0xaa,0x9b,0xfb,0xd5,0x43,0x27,0x7c,0x2d,0xca,0x8a,0xa9,0x88,0x8e,0xef,0xf0,0x45,0x43,0xb3,0x78,0x9b,0x21,0xf2,0x6a,0xeb,0x0f,0x71,},{0x89,0x45,0x06,0x97,0x87,0xc1,0xc6,0x76,0xa8,0x4a,0x70,0x3c,0xae,0x1e,0x0b,0xac,0xae,0xff,0xd3,0x3e,0x91,0xbe,0xc3,0x60,0x3e,0x1f,0x13,0xfb,0x17,0x0e,0x31,0xe6,0xd7,0x04,0x9e,0xda,0x2b,0xf6,0x27,0x18,0x0f,0x45,0x6c,0x3f,0x7a,0xab,0xfc,0xd3,0x6c,0x49,0xa8,0xc0,0x4f,0x8a,0xe6,0x92,0x9e,0xc5,0xad,0xa0,0x7b,0x65,0x72,0x08,},"\x97\x43\x64\xd6\xc8\x38\x84\x2c\xcc\x4e\x74\x9e\x6a\xfd\x53\x71\x70\xdc\xd8\xcc\x50\xd6\x66\x54\xd1\x05\x48\x23\x39\xca\xbd\xf7\x4e\x32\x93\x5e\xe2\x19\x27\x2e\xa1\x68\x4f\xb9\x3c\x1f\xab\x42\xb5\x63\x18\x39\x24\x35\x91\xbd\x07\xd3\xbe\x94\x9b\x0d\xd1\x5e\x31\x96\xdf\x19\x6b\xa7\x52\xad\x11\x21\xac\x71\x12\xd5\x66\x94\x4e\x15\x3a\x4e\x06\x19\xb3\xa2\x32\x24\x1f\x02\x0b\xe0\x71\x9f\x6b\xec\x91\x8b\x26\x82\x8e\xb1\x67\x0e\xcf\xc7\x3c\x66\x84\x4e\xa3\xe4\x04\xc6\xa2\xfc\x01\xbe\xb4\x03\xc9\xd6\xca\x55\x1a\xd8\xa6\xe7\x1f\x46\x64\x7f\xa6\x05\x3f\x03\x14\xf8\x12\x4d\x8d\x2b\xc1\x2c\xc8\xfa\x8d\xb9\x5f\x2b\x73\x53\x75\x20\x1b\x81\x6a\x9c\xf4\x0f\x83\xee\x4b\x86\x71\x61\x80\x32\xde\x22\x9c\xe7\x62\x71\xd0\x3d\x26\x72\xa1\xae\x4a\x28\x8c\x85\xdc\xd2\x7f\xb8\x45\x2a\x81\x32\xe9\xff\x29\xe1\xe8\x9b\xf1\x1b\x1c\x83\x51\x92\xc0\x4b\x13\xbe\x14\xf3\xcd\xe5\xd3\x7c\xe9\x6f\x1d\xc2\xa9\xcc\xda\x0c\x4d\x73\x7b\xca\x1f\xa2\x20\xd2\x1b\xf3\x60\xb9\x05\x15\xbb\xd2\x26\xbb\x2a\x6c\x8d\x5f\x2a\xb0\x18\xd4\x08\x4e\x24\xee\x33\x3c\xe4\xe3\x9b\xcb\x6b\x46\xe7\xae\xb4\xdb\x9b\x6c\x65\xb2\x44\xd9\x82\x82\x3a\x77\x0f\x9c\x62\xa0\xbd\xe2\xcb\xb7\xec\x36\x84\x0d\x45\x51\x87\xfa\xff\x4e\x48\x8a\x5c\x60\x8e\xbd\xb7\xdb\x84\xd8\x7d\xad\x38\x67\xe3\xb0\xd0\x4b\x64\x71\x5e\x16\x56\x0a\x62\xf1\xee\x03\xdf\x61\x83\xfd\x5e\x37\x55\x5d\xa1\x97\x2f\xca\x06\x2d\x12\xbb\x84\x20\xe0\x82\xda\xcb\x8d\xeb\xb9\xc1\x43\x85\x41\xd0\xda\x24\x64\xef\x7e\xc5\x22\x63\xfb\x9b\x9a\x4c\x46\x9c\x83\x32\x3e\x48\x19\xdf\xdf\x4f\xa0\xa7\x70\xc3\xa7\x09\x25\x4e\x05\x31\x48\x30\xe8\x7f\xbb\x67\x36\xc7\x2d\x9d\xab\xe0\x1a\x31\x0e\x91\xeb\xbf\xae\x76\x7a\x1f\xcb\x62\xf6\x4f\xa3\xba\x8d\x53\x40\x0d\x64\x69\xad\x1c\xcb\x81\x1f\xb9\xe1\x15\xf1\x41\x27\xb1\x3e\x83\x64\xaa\x2f\xe8\x0b\xbc\x88\x6a\x10\xdf\x1b\x9c\xc4\xae\x46\x01\xf5\x46\x1a\xf0\x91\xf5\x26\xd2\x72\xda\x9b\x20\x38\x57\xa4\x44\x7e\xab\xde\xf4\x39\x83\x04\x96\xa5\x75\x9c\x21\xde\x65\xba\x3a\x3c\x8b\x8e\x93\x9c\x46\x13\x32\xa9\x24\x85\x2c\x20\x5c\x77\x11\xf3\xa6\x8a\x23\x67\xa9\x45\xde\xf4\xfb\xe5\xf8\x1c\x60\xcb\xb7\xe3\x94\xa2\xa4\x9b\xe9\xec\x2a\xae\xb1\xf3\x30\x57\x59\x79\x44\x6a\xd9\xd0\xd5\x4a\xbd\x43\x6f\x28\x60\xf0\x42\x34\x26\xf4\xbb\xc2\x6b\x3b\x9f\x65\x0d\x69\xb1\x00\x72\xd7\x47\xa3\x9e\x47\x8f\x45\x5e\xaa\x12\xc7\xc6\xe1\x2b\xfc\x45\x36\xa3\x59\x43\x44\xbd\x02\xb6\x20\xe3\xe2\xb4\xe0\xd5\x34\x08\x9d\xd7\xb0\x4f\xa6\x34\x80\x45\x67\x58\x6c\x62\xbe\x03\x91\xc7\xbd\xb0\xa9\xfb\xc1\xef\x3b\x33\x21\x1e\xdb\xf8\xef\x58\xc2\xb7\xa4\x9d\x06\x66\x79\x59\xd7\xe5\xd4\x46\x71\xee\x73\x57\xa1\x0b\xa0\xcb\x1a\x44\x5a\xe5\xd7\x09\xce\x25\x5e\x92\xde\x71\x59\x75\xaf\x94\xb8\x9d\x4a\x29\xc7\x1f\x9d\x88\xc8\x5b\x6c\xd1\x1d\x8b\x33\x5b\xf8\xf2\xc6\x58\xe6\xdd\x7c\x3f\x6c\x80\xad\x4d\x0e\x5a\x6c\x87\xdb\xa7\xb5\xb8\xa8\xa4\x7e\x72\xf4\xd1\xd3\xc7\x43\x63\x1d\xf9\xad\xfc\xfa\x45\xce\xe0\x49\x8d\x5a\x44\xa9\xf7\x5c\x83\xb7\x5b\x2a\x3c\x23\x0f\xf0\x76\x7d\x38\x88\xf9\x41\xee\x1b\x66\x24\xdd\x0e\x12\xd0\x6e\xd1\xab\x8b\xb1\x35\xff\xd3\x79\xe9\xde\x37\x88\xbe\x54\x1a\xad\xb2\xd6\xa7\xcc\x60\x13\x16\xf2\x1e\xb9\xaa\xa9\x22\xf5\x6a\x8e\x35\x26\xc9\xbd\x11\x77\xfe\xfc\x2f\xbe\x3e\x43\x0b\x62\x8e\xeb\xd6\x66\x1e\x3b\xa2\xd6\x31\xc6\xa8\x42\x2c\x24\x1e\xcd\x96\x99\x72\x41\x2f\x74\xda\x6b\x12\x43\xbf\x0f\xbe\xe8\xa8\x4d\x52\xe4\x0a\xee\x3f\x1e\x4f\xc8\x31\x40\x2c\x62\xf3\x57\x6b\x22\xe8\xe3\xc3\xdc\x4e\x16\x0b\xc3\xb6\xb9\xd2\xce\x00\x58\x53\x81\x2e\xaf\xc0\xa4\xe2\x5b\xa7\x12\x27\x9b\x00\xba\x3f\x91\x30\xff\x36\xe3\xef\x19\x71\xdd\xe7\x50\x8b\x27\x92\xfe\x64\xd4\x75\x68\x8f\xc6\xf3\x31\x3a\xad\xb7\x85\x30\x2e\x6b\x7f\x9a\x84\xf2\xdb\xc2\xf3\xcf\x06\x0e\xe0\x8b\x46\x37\x36\xf8\x36\xdb\xb2\x62\xd3\x29\x68\x4c\x20\x84\x92\xd1\x7d\x81\x12\x21\xbe\x02\xb6\x5e\xe2\x8e\x11\xb5\x46\x92"}, -{{0x07,0x05,0xb3,0x36,0xc8,0x9c,0xa3,0x5f,0xfd,0xde,0x0a,0xf0,0xf9,0x06,0xea,0xcf,0x62,0x3c,0x56,0xc3,0xf7,0x67,0x38,0x16,0x8e,0x76,0xfc,0xd5,0x88,0x2d,0xf7,0x9e,},{0xea,0xaa,0xf2,0xa1,0x5f,0x44,0xb6,0x34,0xce,0xf1,0x5a,0x63,0x8b,0x80,0x20,0x7f,0x61,0x09,0x9a,0x07,0x96,0xf5,0xd4,0x3f,0x3e,0x9d,0x04,0x8e,0x6a,0xe7,0x96,0xc1,},{0xd4,0xa9,0xba,0xe8,0xec,0xc4,0x72,0xc3,0x76,0xba,0xb8,0x05,0xc2,0xce,0x0c,0x1c,0x2e,0xd5,0xfc,0x77,0x37,0x15,0x46,0x8c,0xb1,0xa4,0x93,0x45,0x64,0xda,0xce,0xcf,0x43,0x8b,0x1d,0xd2,0xac,0x1b,0x5c,0x5e,0x33,0x6a,0x1e,0x20,0x70,0x1d,0x5d,0xcf,0x3c,0x8e,0xe3,0xad,0x22,0x3b,0x13,0x9f,0xa9,0x0a,0x1b,0x55,0x2e,0x1b,0x77,0x07,},"\x61\x6f\xe1\x5f\xcc\xb3\x31\x0f\x9e\xc7\x45\x64\x47\xda\xda\xf8\xe0\xa5\xfb\x26\x9b\xe1\x69\xb0\xc3\xea\x2c\xfd\xaa\xa5\x5d\x37\x93\x7f\xe7\x5b\x78\x32\x4a\xc2\x78\xa6\x50\x47\xe0\xae\x4f\x32\x7e\x97\xef\xfc\xb7\xbe\xd9\x1d\x09\xda\x72\x0b\x0a\x10\x1b\xe9\xe9\x6d\x0b\xa8\x5b\x1f\xf4\x9d\x8d\x1d\xf3\x62\xd3\x45\x4f\x0d\xb6\x82\x55\x96\x10\x1c\x97\xe5\xda\xca\xd0\x7e\xc4\x92\xd3\x0f\x2d\x0c\xb7\xe7\xde\x4e\x74\x4b\xb6\xa6\x10\x0b\x75\x4d\xa8\x47\x41\x1d\x09\xaa\xce\x8d\x5d\x41\x07\x58\xb8\x30\x87\xdb\x4b\x5e\x62\x97\x97\x9a\x21\xfb\x65\xaf\x39\x09\x52\xc4\xf9\x36\x26\x0e\x72\xd7\xc7\x83\x27\xb9\x4a\xa6\xcd\x61\x72\x78\xb0\xce\x9e\x1b\xd3\xfb\xed\x93\xb6\x9b\xc6\x49\x85\xdd\xe0\xe2\xc4\x35\x7b\x50\x2f\x05\x5e\xe7\xb0\xa0\x38\x84\x74\xda\xe0\x2d\x6c\x1a\x73\x1f\x87\x78\x5d\x75\x3a\xeb\x0d\x9c\xfd\xf8\x50\x02\xdf\x56\x6f\xc2\x50\x7d\xe7\xba\x6f\xd0\x35\xbe\xe1\x7a\x2e\x80\x8b\x4a\x75\x88\xc5\x83\x37\x5c\x82\x40\x7a\x40\xae\x9e\xeb\xdf\x94\xdf\x2f\xb8\xca\xbf\x17\x60\x6c\x43\x9e\xa7\x04\x59\xb2\x12\xaa\xe4\xa3\xf5\x30\xec\xad\xc5\xe8\x8e\x25\x48\xfa\x64\x3c\x7d\xdf\x50\x63\xb2\xe1\x06\x73\xe5\x9d\x07\xfe\x90\x68\x92\xb6\x7e\xb5\x8f\x93\x88\xa5\x6b\x37\x04\x52\xe9\x97\x77\x55\xfc\x04\xdf\xbc\x77\xda\x6c\x05\xbe\xdd\xeb\xf0\x36\x52\x56\xb5\x2c\x9a\xef\x8a\x82\x17\x3b\x8c\x89\xfb\xd9\x8c\xea\x36\xa8\xb8\x96\xfe\x66\xd3\x7c\xa7\x9b\xec\x7f\xbf\xe9\x58\xfe\x89\xf6\x76\x50\x85\xb3\x35\xdc\x77\x03\x43\xe2\x30\xca\xdd\xfa\x28\x33\xda\xa6\x62\xfe\x82\x08\xdd\x88\x5a\x6f\xdf\x72\xe3\x6e\xcf\x22\xbb\xbb\xcb\xe7\x9d\x37\x06\x50\x23\x69\x40\xbc\x2e\x6d\x4a\xc7\x4f\xe4\xd5\x54\xc9\xbc\x23\x2f\x07\xd2\xaf\x62\x20\xd1\x57\xbd\x2d\xa6\xa6\x61\x2a\x08\x1b\x4c\x99\x04\xa2\x86\x9b\x13\x7e\xe3\xa0\x85\x6f\x12\xb2\xeb\x87\x62\xdb\x94\xed\x0b\xa1\x36\xf2\x3e\x7f\xb4\xbd\x1f\xcd\xee\x10\xdd\x84\xe2\xcd\x3b\x0a\x49\x14\x8a\xc7\x4d\xb4\x66\xdb\xee\xf8\x1e\x6a\x8c\xe0\x86\x11\x02\xde\x9b\x1a\x3e\x1d\xcf\x5c\x6b\x03\x08\xa8\x2e\x3a\xc7\xc2\x28\x3c\x7c\xc2\xf3\x4f\xfa\x14\x5b\x9f\x74\xb7\x99\x04\xb3\x2b\x79\xe9\x60\xb8\x14\xaa\xde\x63\xa0\xdf\x01\x67\xdc\xd2\x4e\xd9\x0a\x8d\xa7\xb9\x34\xc7\x72\x93\x2f\x5a\x47\x8f\xe2\xa7\x2f\x94\x5a\x13\x09\x6e\xc3\x7c\xe7\x64\xb5\x81\xeb\x89\xe5\xf6\xb2\xbd\x7e\xb8\x8b\x85\xa8\x95\x87\x77\x4d\x45\x8c\x58\xcd\x87\x94\x57\x97\x3d\x64\x8e\xf7\x71\xc5\xf1\xde\xb2\x7a\x0c\xc5\xb2\x92\x46\xac\x2f\xa1\x2d\x18\xdd\xc6\xb9\xf9\xac\x9c\xf1\x46\xc3\xf2\x2b\x1e\x44\x99\xad\xee\xfb\xcd\x22\x49\x74\x0e\x13\xa2\x24\xe7\xb6\xb3\xef\x15\x60\x5e\x7e\x74\xe6\x8d\x7b\x72\x64\x24\x09\xb9\x0c\x4e\xc1\x61\xeb\x24\xc9\xb4\x0f\xf9\xc7\xe6\xe5\xda\x98\x32\x2a\xca\x52\xc4\x6a\x8d\xdc\x19\x0f\x1c\xab\x15\x7c\x4c\x76\x19\x60\x1a\x6b\x33\xdf\x6a\x50\xda\x66\x1b\xc7\x53\x60\xdf\xf6\x97\x50\xd3\x45\x74\x09\xcc\x02\x41\xc3\xe8\xc4\xb3\xe5\x06\xd4\x26\xaf\x52\xb7\x02\x31\xcd\x6c\x91\x26\x0c\xc4\x31\xe4\xcc\xfd\x49\x6c\xa1\x4c\xea\xae\x1c\xda\x78\x72\x1e\x16\x33\x9d\x52\x68\x2b\x69\x51\xf9\x66\xc7\xda\x5c\x6e\x10\xd9\x19\xae\x66\xa9\xf5\x2d\xec\x10\x86\x75\x38\xd3\xdf\x6d\x59\x3a\x32\xdb\x69\x5a\x8d\x77\x45\x70\x35\x16\xea\x56\xf8\xc1\xc8\xf0\xef\x53\xbd\xeb\x7f\x53\xc2\xd9\x44\xf5\x11\x94\x0c\xcb\x90\x62\x49\x22\xac\x59\x9f\x46\x19\xc3\x04\x62\x07\xd6\x05\xf6\xff\x94\xde\x78\x8d\x25\x34\x22\x29\xdc\x8a\xf9\x2b\x5f\xdf\x0d\xd7\x1d\xf2\xb4\x46\xcd\xf1\xd9\xa2\x05\x24\x33\x9e\xe1\xc3\x18\x26\x28\x7e\xf7\x27\x81\xa7\xa3\x52\x89\xf8\x5a\x15\xba\x57\xc7\xfd\x5d\x88\x5b\xd0\x55\x3a\xb4\x08\x05\xf5\x17\xe8\xf1\xb1\xb3\xc4\xfc\x67\x71\xe6\xf2\x24\xbc\x03\x11\x24\xb9\xc9\xae\xb1\x9c\x5a\x96\xbf\x14\x88\xe1\xe6\x6c\x6e\x88\x80\x92\x30\xc8\x3a\x74\x15\x55\x54\xa2\x19\xec\x37\x9a\xe5\x4a\x9f\xe7\x9d\xbe\xde\x3d\x57\x60\x42\xa6\x35\xd1\x97\xf4\xd8\x18\xc7\x78\x75\x5b\x8b\x45\xe5\x13\xde\xac\x88\xf6\x04\x25"}, -{{0x95,0x17,0x4a,0x09,0x15,0x68,0x4c,0xdb,0xb6,0x19,0xb0,0x55,0x49,0x5b,0x00,0xf1,0x92,0x82,0xcf,0xfc,0x3b,0x05,0x01,0x9e,0x6a,0xb7,0x09,0xa4,0xa1,0x74,0x2b,0xab,},{0xaa,0x8c,0x87,0x2d,0x7e,0x10,0xb6,0x7f,0x7f,0xf2,0x41,0x72,0xc3,0x63,0x7e,0x80,0x82,0x5a,0x0a,0x71,0xee,0x0c,0x48,0x86,0x3a,0x2a,0xcd,0xcb,0xe8,0xda,0x45,0x9a,},{0x78,0x0f,0x40,0xc2,0x0f,0xea,0x3b,0x11,0xc9,0x42,0x2a,0x43,0xb9,0xa6,0xf7,0x96,0x11,0xe7,0xf1,0xf5,0x9d,0x14,0x88,0xc1,0x5a,0x5f,0xd2,0xd3,0x2c,0x07,0xda,0xdc,0x39,0x1c,0x38,0x95,0x3e,0xdf,0x0d,0xe4,0x8b,0xe5,0x2d,0xa2,0xaf,0x33,0x5c,0x47,0xb8,0xd2,0xe4,0x4a,0xb9,0xd3,0xdf,0xb7,0x6b,0xa5,0x38,0xb0,0x66,0x49,0x52,0x08,},"\x5e\x1a\x74\x00\x45\x6c\xad\x4f\x9b\xa8\x66\x43\xbc\x7c\xbf\x3b\x35\x68\xdc\xb5\x22\xb3\x70\x55\xe8\xc3\x9d\x3c\x80\xf2\x28\x42\x38\xe5\x72\x7f\xd7\x51\x3c\xc8\xb3\x1c\x57\xae\x7b\x40\x50\xaa\x81\x9f\xc2\x36\x09\x30\xeb\x0d\xd6\x77\xa5\xb2\xc7\x29\xfe\xb2\xda\x3a\xd7\x9a\xe7\xfc\xcd\xdd\xb6\xc0\x84\x46\x26\x1e\xc9\xbb\xe5\x9c\x64\xe9\x9a\xbb\xc8\x6d\x3c\x48\x35\xf0\x0f\xef\xe5\x27\x43\x3a\x50\x1a\x3b\x6d\x57\x2c\xf5\xe1\x2a\x88\x01\x0b\x46\xa4\x72\xb9\xbd\x86\x91\xa4\x07\xc3\x65\xf9\xf7\x16\x34\xb4\xd9\x7e\xdf\xdf\xf0\x63\x14\xc0\xc1\xb4\xeb\x93\xc7\x60\x7f\x1d\x6f\xa3\x54\x65\x93\x22\xc2\x84\x07\x3f\x42\x60\x25\x18\xc5\x4f\xdf\x26\xea\x2c\x27\xc8\x0a\x6d\xfa\x20\x56\x83\x91\xab\x35\x72\x82\xc0\x6b\x23\xbe\xdc\x1d\xf1\x26\x4b\x61\x1c\x1e\x9c\xf1\x8a\xeb\xe2\x49\xfd\x86\x17\xc6\xe3\xee\x98\xc5\x3c\x0f\x6f\x21\x75\xc5\x7e\xf8\xe2\x06\xbd\x3c\xf1\x05\x62\x7a\x98\x92\xeb\x68\x99\x20\x21\x3a\xae\xb6\x3d\x87\x66\x3d\xbf\xa5\x3f\x0f\xb2\x81\x62\x69\x48\x29\x6b\x2d\xbc\xdd\xe1\xc5\x1a\xf8\x62\xee\xcf\x1c\xfe\x8a\x46\xa2\xc4\xb2\x8c\xfe\x71\x30\x33\x0a\xd1\x73\xf8\x71\x27\xaa\xca\xff\x43\xc0\xbd\xde\xa4\x8b\x00\x38\x97\x6e\x66\x2c\x04\xb6\xb0\x4a\xd0\x3d\xe1\x24\x62\xc2\x76\x5d\xb5\x35\x04\x95\x20\xcc\x11\x4a\xfd\xb6\xc9\x25\x49\xb0\x54\x6a\x90\x27\xd4\x49\x75\x5b\xeb\x8d\x4c\x17\xe6\xa2\xa4\x75\xf9\x67\x6a\x33\x7b\x4e\x86\x6d\x96\x32\x5e\x38\x9a\x52\xc1\x6c\x51\xe1\x8e\x0d\x81\x03\x34\x0c\x84\x17\xb2\xc5\x7a\x55\xd0\x42\xff\x5e\x5f\xc6\x5d\xf4\x23\xe0\x09\x2b\x0e\xa8\x8b\x96\xa9\x07\xc9\x51\x21\xc5\x47\xa6\x80\x61\xf2\x7b\xcf\xb5\x8c\xe6\xc0\x77\x28\xd4\x84\x6b\xdc\xbf\x0c\x62\x54\x10\xed\xf8\xde\xa8\xcb\x4c\x9d\x0b\xbe\xef\xcd\xe1\x92\x73\x36\x5f\x48\xd7\x5a\xec\x07\xd1\xc2\x2c\xcd\x23\x06\x8a\x97\xc3\xfe\x75\x2e\x87\xa3\x01\x18\xfe\x2d\xfd\x52\x18\xb6\xb1\x25\x15\x4e\x0e\xa3\x86\xcf\x23\x9e\x31\x37\xf8\xca\x6d\x8b\x74\x6b\x6a\x67\xd5\x08\xcf\x8c\x1a\xb6\x3e\x57\x15\xe6\x72\x1e\xda\x5c\x2b\xc3\x93\xa4\x93\xdb\xd2\xf9\xa1\xfa\x92\x6b\x9a\x59\xe4\x5a\x18\x0a\xee\xb0\x25\x99\xa8\xcd\xd6\x86\xf8\x89\xb4\x85\x27\x23\xcb\x6d\xbf\xb5\x01\x4c\xab\x5f\x65\x8a\x30\x9a\x47\x22\x39\x36\x0e\xea\xf6\x4f\xc8\x20\x3a\x3c\x70\x89\x70\xe1\x5c\xbc\xf1\x36\x25\x5d\x96\x44\x6c\x39\xa9\x27\x03\x1d\x26\x7d\x69\xec\xd5\x1d\x7a\xf6\xe9\x1f\xb4\xae\xf9\xd7\x8c\x33\x35\xe9\x07\x11\x33\xcf\xb8\xe2\x12\x99\x90\xc6\x46\x37\xc7\xad\xf1\xda\xef\x2d\xc2\x6c\x11\x63\x39\x9f\x3f\xe1\xe7\x92\x33\x80\x92\xef\x6f\x8d\xfa\xf2\x57\x30\xdd\x2f\xe8\xd9\x78\xf6\xf7\x70\xf5\x2b\x68\x23\x81\x76\x56\x4c\xee\x5f\xbb\x98\x50\xb3\xb3\xa0\x4d\x94\x84\x60\x41\x78\x26\xeb\x2e\xb2\x4f\xcc\x5f\xe3\x53\x34\xbb\x95\x21\xe8\x7b\xc4\xdb\xde\x2a\xc9\xe1\xc9\x89\x49\xdc\x2d\x29\xad\x27\x9e\x38\x84\xb9\x05\x26\x8e\xbd\x08\x08\xbf\x41\x82\x57\xe7\x5e\x26\x2b\x4d\x01\xb0\x24\xa6\xe9\xaa\x7b\xd5\x01\xdb\xa9\x4f\xf5\x06\x39\x4b\x4b\x0a\xe6\x08\x1e\xa7\x30\x30\xc4\x3a\x6a\x91\x76\x6e\x80\xf9\xf4\x2c\x0b\x68\xb9\x84\x19\xad\x4e\xee\x4e\x9a\x72\x8a\xde\xfb\xd7\x9e\x83\x1f\x70\xf4\x1e\x62\xb4\x3f\x0b\xf4\x2b\x3b\x2c\xd5\x3b\x55\x89\x11\x76\x64\xbc\xeb\xc4\x09\xa7\x64\x5b\x1e\xed\xda\x48\x2f\x6b\x68\x95\xa6\x57\xba\x78\x9b\x89\xe5\x02\xd6\x99\x87\x51\xd6\x30\x3d\xed\x5f\xa1\x56\xee\x7c\x7e\xaf\xe5\x46\x26\xd1\x03\x2c\x4d\x7d\xff\x97\x7f\x1d\xcc\x86\xaf\x89\xb1\xe6\x46\xa4\xaf\xc2\x42\x7e\xd0\x2c\x0a\xf5\xd3\x28\x90\xf9\x5f\x13\xf9\x8c\x1a\x5b\x1d\x9f\xbb\x78\x1a\x9a\x89\xb2\xd7\x90\xc1\x46\x5c\x2d\x15\x20\x92\x6f\xdf\x28\xc1\x7d\x9b\xa1\x58\x7a\xd7\x61\xf0\x65\xd3\x39\xbd\xbe\x38\xf4\x13\x3f\x45\xbb\x59\x78\x74\x26\x42\xf9\x0c\x06\x5e\xe4\x89\x25\x73\xf6\x05\x9f\x8b\x4c\xe2\xc1\x3e\x73\xb8\x91\xcd\x05\xf2\x37\x31\xed\x9a\x07\xe2\xb8\xff\xdc\x96\x3b\x06\xa5\x10\x20\x9c\x32\x99\x80\x94\x9f\x40\xd8\x07\x3a\x01\x3e\xf8\x43\xdf\xcc\x4a\x33\x94"}, -{{0x5a,0x84,0xaf,0x28,0xa5,0xdf,0xbb,0x32,0x33,0xa1,0x2f,0x08,0x37,0xf6,0xe8,0x65,0x4e,0x7b,0x0d,0xe1,0x6b,0x02,0xab,0x3c,0xd1,0x78,0x64,0x43,0x1e,0x27,0x46,0x67,},{0x80,0xd4,0xba,0x78,0x9f,0x8a,0x4b,0x20,0x47,0xad,0xaf,0xa5,0xed,0x26,0xcd,0x8c,0x54,0x67,0x33,0x29,0x2e,0x8b,0xf6,0x93,0xcf,0xd1,0x7e,0x28,0x4e,0xfc,0x68,0x71,},{0xa0,0xb8,0x4c,0xa5,0xaf,0x76,0x46,0xe6,0xf6,0x2a,0x69,0x35,0x37,0x94,0x73,0xfa,0x6e,0x4c,0x27,0x69,0x58,0x51,0xfc,0xbd,0xae,0x29,0x17,0xb2,0xdc,0x68,0xd7,0x96,0xe2,0x78,0xd7,0x0c,0xd6,0x7f,0xce,0xdf,0x6c,0xa6,0x29,0xb8,0x81,0xf7,0xc4,0xf2,0xaa,0x25,0x59,0xb2,0x0d,0x67,0x06,0x11,0x76,0x6b,0xd6,0x5a,0xa4,0xfe,0xf2,0x04,},"\x8a\xac\xd1\xb8\xa3\x9b\xf0\x8f\xd5\xc9\x18\x44\x6b\xe5\x76\xe6\xa3\xf2\x7f\x36\x11\x16\x07\xf2\x7b\x56\xa9\x12\x14\xe7\x63\xf9\xa8\x7f\xb1\xd1\x84\x48\x98\x96\x17\x97\x64\x44\x60\xbf\xf5\x48\x8c\x10\x3a\xf6\x05\xe8\x74\x0e\x46\x58\x8f\xb9\x3e\x44\x3c\x3b\xb2\x3b\x92\xc0\x98\x70\xa5\x57\x65\x3a\x1f\x22\xc2\x18\xcc\xbc\x2f\x07\x3a\x27\x2d\x17\xa8\x42\x23\xef\x14\x3f\x4c\x7c\xa2\x58\x46\x0b\x79\x81\x69\x67\x3d\xa1\x07\xd7\x1d\x53\x56\xce\x9f\x75\x59\xa9\xb0\x38\x39\x99\x51\xf5\x75\xc7\x7e\x5b\x9d\x05\x29\x57\x8e\xca\xa2\xe2\x08\x92\x66\xfc\x52\x6c\x5d\x40\x9f\xbd\x46\xbb\x86\x84\x1c\xb5\x54\xf5\xbd\x3c\x99\x71\x3b\x04\x3e\x40\x46\x53\xa7\xd0\x13\x44\xd4\xdb\x83\x1a\x21\x72\x82\xc4\xb3\x36\x40\x56\x53\xb8\x5d\x27\xa4\x6b\x25\x9c\x85\x5c\xdd\x85\xad\x6f\x7a\xed\xd8\x35\xff\x55\x00\xcc\x8b\xaf\x0f\xb2\xf0\x18\x09\x10\xc6\x46\x72\xb8\xa8\xd4\x9d\x98\x4a\x78\x29\x3c\xf5\x77\x9c\x91\x0c\x3a\xcb\xbc\xa4\x55\xa8\x54\x66\xe5\x35\x04\x4f\x34\x80\x26\x2c\x09\x0f\xbf\x4e\x0b\x0d\xb4\xd1\xef\x87\x59\xda\xaf\xdd\x8d\x05\x90\x74\x82\x46\x1f\xf9\x10\xc4\x37\x19\x5d\x5c\x7f\xed\x9d\x82\xcb\x94\xe7\xe4\xec\x24\xda\x05\x3e\x47\xf6\x2b\x48\x8e\xb7\xb2\x44\x65\x5c\x7d\xbb\x20\xed\x60\x7e\xed\x45\x31\x44\x9e\x07\x80\xe6\x1c\xfd\x57\x40\x86\xff\xc5\xdc\x52\x42\x83\x77\x5c\x44\xf7\x54\x7c\xda\xb0\x4a\x51\xee\xe4\xe1\xb7\xb6\x5a\x57\x57\x3a\x92\x48\x4a\x35\x90\x0a\x90\x9f\x81\xe4\x15\x02\x9d\x22\xca\x93\x7a\x3a\xcd\x9e\x61\xf8\xc0\xe6\x86\xb2\xd2\xad\x03\x77\xaf\x8e\xe1\x66\xe4\xa2\x0a\x82\xaf\xf4\x51\xe1\x51\x10\x3e\x0a\x17\x67\xb2\x71\xfa\x9c\x2b\x1d\xd1\x20\xf8\x05\x85\x3b\x3b\x8a\x56\x0f\xc8\xb9\x37\x62\x83\xb5\x11\x24\x32\x4a\x28\x4a\x0e\x9a\xc4\x9d\xf6\x9f\x52\x4c\x8e\x04\x2d\xf8\x2e\xfb\xcd\x16\x88\x1e\xc1\x31\xa1\x52\x10\xdf\x73\xde\x02\x94\x34\x47\xf2\x2a\x2e\xa1\xdc\x8b\xf9\x68\x29\x8e\xe9\x7f\x3a\xd5\x46\xd7\x8b\xc6\x60\x89\x7e\x08\xd2\xa2\x8b\x2b\xa6\x8b\x54\xb9\x54\xf1\x47\x64\x51\xc6\x92\x07\xe5\xdd\x24\x8a\xe4\x7e\xf3\x56\x94\x99\x0e\x6f\x05\x8b\xc0\x01\x7b\x74\x95\x10\x5c\xc8\x73\x90\x66\xaf\xb1\x1e\x1f\x26\x60\x19\x42\x54\x6a\xe8\x49\xff\x2f\x56\x73\x0f\x13\x26\xbb\xee\xa6\x40\xee\x17\x8f\xa2\x47\xad\xff\xef\xc0\x46\x49\x4f\xc7\xff\xc0\x77\x7d\x5d\xbe\x8a\x55\xda\xee\x61\x40\x6f\xe3\xc7\x08\x8d\x43\xd9\xe1\x4d\xa2\x1c\xa5\x2f\xd8\xc1\x60\x09\x1c\x8f\x99\xa6\x7d\xad\x65\xc6\x4f\xea\x9d\x18\xb1\x53\x7d\x06\x1f\x5d\xce\x87\x9e\x0b\xc4\x26\x48\xd2\xea\xa0\x2d\x97\x21\x85\x75\x3c\xb2\xf6\x22\x5d\x8d\x03\xbb\x07\xf9\x44\xb1\x0c\xf4\xea\x22\x27\x5c\x3d\x70\x84\x80\x20\xf3\x0c\x82\x3b\x76\x14\x3a\xcf\x54\x59\x99\xa2\xcc\x4b\x58\x98\xd9\x4b\x4a\x25\xef\xbe\x5a\x60\x33\x1c\xc0\x09\xfe\xc0\xa2\x5b\xc9\x89\x47\xb1\xb7\x13\x9e\x22\xd2\x32\x80\xff\x88\x54\xa1\xec\x76\x22\x1b\x1b\xf3\xd1\x08\x32\x8c\x8a\xc4\x63\xc6\x52\x63\xa2\xd7\xca\x74\x33\x48\x29\x31\xa1\xd8\xfc\x14\x4b\xbe\x9b\xef\x67\x8c\x92\xe1\xc2\xd1\x09\x21\xb6\xad\x43\xa7\x5c\x53\xbc\x07\x58\x54\xed\x2d\x99\xd8\x25\xf3\x0a\x5e\x10\xd5\x17\x43\x8e\x4d\x4f\x71\x13\x42\x9f\x1e\xdb\x38\x7d\x6b\xd7\xaa\xd2\x92\x74\xf8\xd2\xdc\x88\x9b\x7e\xfb\xeb\x58\x68\x6f\x8d\x66\x9c\xea\xef\x92\xc7\x5e\xd5\x30\x7f\x0c\x03\xf5\x90\x01\x81\xce\x57\x3c\x8f\xa2\x86\x75\x20\x5f\xb1\x05\x7f\x62\x6a\xa2\x30\xd0\x3e\x2e\xaa\x8c\xff\xcd\xe2\x00\x81\x47\x5d\x80\xb2\x45\xa1\xca\x60\x45\xba\x20\x4a\xb0\x00\x69\x07\x9c\x63\x7f\xc3\xfb\x3e\x80\xca\x04\x62\xe7\xa4\xcd\xd9\x28\x3f\xf9\x00\x85\x30\x36\x48\x16\x79\x2f\xdf\x3b\x9a\x4e\x4d\xc8\x37\x92\x28\xed\xcb\xb1\x54\xbe\xf3\x87\xd3\x77\x60\xd7\x9a\xfb\xb7\x36\x26\x0a\x1d\xb1\x01\x38\x36\x1f\x24\xb8\x26\xdb\xcd\x5f\x0f\xc9\xe7\x83\x0d\x26\xd8\x0c\x52\xa7\x92\x18\x92\x76\xbc\xe3\x47\x60\xfb\x77\xbe\x13\x12\xac\x8c\xf9\x7d\x92\xcb\xf3\xd0\x77\x80\x28\xdb\x5e\x8e\xae\x89\xe0\xb9\xbc\x87\x78\xae\xb1\x27\x8f\x04\x71\xcb"}, -{{0x79,0x3a,0xc8,0x8d,0x7d,0x3b,0x6f,0xa7,0xf4,0x7d,0xee,0xc3,0x1f,0x68,0xdd,0xcc,0xb7,0x01,0x82,0x0f,0x1b,0x13,0xdd,0xc6,0x52,0xf7,0xc6,0xa8,0x5b,0x60,0x52,0xa5,},{0x91,0xb6,0x22,0x7a,0xcd,0xd1,0x83,0xda,0x62,0xc5,0x19,0x65,0xc6,0x35,0x35,0x8b,0x20,0x4d,0x68,0x3e,0xe0,0x64,0x43,0xcb,0xd4,0x0e,0x71,0xc1,0xf7,0x6a,0xd1,0x02,},{0xa8,0x4f,0x55,0x2b,0xf4,0x43,0x22,0xa6,0xdb,0x24,0x5c,0xa0,0x06,0xd1,0xcf,0x78,0x0c,0x61,0x68,0x0f,0xe7,0x42,0x9a,0x89,0x47,0xc3,0x5f,0x21,0xbc,0x4b,0x44,0x22,0x8b,0xa3,0x0a,0xea,0x0c,0x74,0x4b,0x86,0x64,0x59,0xd3,0xb8,0xac,0xad,0x45,0x3b,0x06,0xac,0xe2,0x47,0xba,0x69,0x52,0x8c,0x6b,0x3b,0xc4,0xb2,0x0e,0x75,0x63,0x0e,},"\xec\x50\xaf\xad\x8a\xde\x74\x05\xe2\xc6\xf5\xc6\x24\x7b\xbb\xcc\xfb\x2c\x17\x16\x6f\x78\x84\xfe\xae\x10\xd9\x0f\x5d\x83\xc4\xb6\xf0\xbf\x76\xde\x2f\x78\x97\xba\x11\x94\xd6\xd3\x44\x9d\xdb\x80\xae\x74\xeb\x8e\xd6\x8f\x04\x9b\x35\xc6\xf2\x19\x16\xdb\x4d\xfc\x27\x24\xdc\x3a\xf7\xad\x8d\xd5\xc4\x4f\x60\xd2\xf4\x9f\xad\xd7\x00\x4d\xa1\x59\x30\x93\x94\x2c\xae\x52\x08\xbf\x54\xcf\x90\x3b\xee\x64\x69\x05\xfc\xe2\xeb\x2e\x37\x0d\x0d\xca\x48\xd8\x20\xad\xea\xb1\x6a\x3b\x67\x5e\x5a\x4a\x8e\x26\x7e\x34\xff\x96\xf3\x12\x2b\x18\xde\x0c\xad\x92\x92\xab\x63\xd2\x6e\x5f\x31\x0f\xa2\x16\x8c\x29\x66\xbd\xb6\x3b\x0d\xe0\x86\x26\x76\x7b\x37\x9d\xe4\x63\x3b\x9f\x3e\xda\x79\x17\x28\x1d\xad\x66\x1e\x9f\x77\x2b\x84\x4a\x79\xe8\x00\xfd\x84\x27\x02\x44\x6e\x4a\xa7\x31\x75\x71\x07\xf3\xfd\x65\x47\xbf\x40\x75\x96\x3d\x5f\xd5\xf5\x8e\x80\x85\x3f\xc4\x27\x51\xdc\xa0\x78\xa9\xfa\x8d\x5b\xb3\xd9\xa3\x4a\xbc\xab\x02\x93\xd6\xce\xae\xc4\x89\x67\xa1\xe6\x22\x43\x98\xca\xd0\xf6\x05\xa3\xbe\x8e\x67\x58\xea\x8f\x29\x20\x9d\x8e\x4c\x4c\xa1\x89\x3b\xaa\xd9\x1e\x37\x9b\xa3\xb1\x73\x30\xc1\x2a\x5b\x6f\x21\x9b\x38\x4a\x8a\xb9\x78\xbf\x1b\x37\xc3\x73\x1a\x1b\x47\x4b\x24\xb5\xd6\x7d\x4c\xec\x28\xaa\xc6\x51\x0b\x11\xf2\xcf\x21\xbc\x16\x96\x3d\x51\xf5\x53\x87\x27\x71\x8f\xc4\xe2\xe5\x17\x2e\x3c\x0c\xda\xbc\x27\x7f\x0d\x70\x37\xc3\x4c\xa6\x8f\x73\x28\x88\x48\xb9\x26\xbd\xe0\xcf\x47\xab\xfa\x66\x60\x09\x16\x94\x6f\x07\x65\x1c\x28\x0a\x20\x86\xb1\x4d\x52\x57\x0c\xc8\xa4\xb7\x43\x58\xb5\x9c\x30\x2b\x9d\x00\xe1\xb4\x98\xf3\xbc\x33\xee\x4e\xcf\x2b\xce\x2c\x65\xed\x7e\x8b\xa7\x4d\x35\xb7\x51\xd3\xc9\x9f\x40\x86\x19\x68\xc2\xb7\xf3\xa5\xbe\x34\x8c\x57\xd9\x3b\x40\xff\xd0\x51\xed\xd7\xca\xca\x6e\xe6\xbc\xa7\x21\xdc\xba\x8d\xb8\xd0\x06\x4f\x54\xd3\x6e\xc5\xe8\xd6\x2a\x71\xfd\x1c\x90\xf1\x49\x24\xf4\x1c\x16\x3f\x00\x7a\xfc\x6f\xbb\xfe\x86\x45\xfa\x47\xc3\xc9\x80\x24\x6d\x1b\x92\x27\x43\x85\x95\x3c\x53\x41\xcd\x64\xc3\x4a\xe9\x71\x7c\xc2\xc3\x7f\x58\x35\x9c\x0a\x99\x91\xc2\x3f\xe6\x37\xde\x6c\xdf\x08\x62\xf7\xd0\x32\x9f\xe7\x58\xaa\x89\x2a\xd4\x58\x3b\x9d\xf2\xf3\x33\x7d\x5b\xe5\x70\xba\x65\x49\x98\xed\x29\x2f\x11\xf0\x17\x72\x38\x2a\x04\x34\x2f\xdd\x99\xe6\x9e\x0d\x97\xc4\x3f\x10\xac\x9b\x96\xf1\x40\xa6\xf8\x3c\x47\x29\xe7\xa9\x00\x47\x1f\x2b\x1d\xf2\x40\x1b\xc5\xc6\x80\x42\x2b\x13\xb0\xc8\x00\x7d\x63\x68\x1f\x66\xa0\x59\x5a\x1c\x5d\x3a\xcd\xe5\xb7\x79\x42\x6e\x73\x6b\xc1\x00\xc5\xe6\xf5\x26\x08\xdc\x39\x1e\x3e\xf9\xb1\xbb\x6a\xf1\x3d\x24\x9b\x7d\x32\xce\x06\x80\xc3\x68\xf5\x4d\x5f\xe0\x39\xcf\xe1\x01\x30\x25\x1e\x4d\xb1\x4c\x79\xc8\xd0\x44\x06\x04\x65\x82\x29\x90\xd8\x80\x93\xcd\x73\x65\x32\x85\x2e\x44\x78\x89\xdb\x89\xcc\x60\x05\x29\x96\xa3\x2a\x64\x36\x5c\x07\x26\x05\x1c\x11\x9e\xda\x90\x1d\xe5\x76\xb3\x34\xfc\x70\x49\x48\x23\x92\xe2\x62\x0b\x0a\x3a\x13\xfa\xb1\xd3\x6f\xc0\xa5\xf2\x3d\xb1\x47\xfd\x85\x7b\x26\xa6\x98\x04\x8f\x8b\x81\x1e\x23\xd7\x22\xe2\xe9\x02\x7e\xd4\x12\x4b\x48\xdc\x5e\x57\x8a\x7a\xeb\x19\xa1\xb4\xf9\x48\xee\x5b\x46\xf6\x5b\x97\x96\x46\xe2\xbe\x07\x47\x14\x11\x8b\xaa\x4b\xfc\x15\xb0\x89\xa0\xe0\x66\x27\xda\x46\xe4\xbb\x06\xaa\x3c\x7c\x5d\xd6\x48\xe0\x3c\x9c\x2d\xec\x3f\xac\xd9\x56\x26\x56\x2f\x30\x00\x88\x32\x30\xd2\xb0\xa1\xf8\xa7\x47\x8c\xb7\x7f\x93\x9a\x5f\x18\x8f\x45\x8d\x10\x37\xb9\x01\x76\x66\x4d\x86\xea\x85\x0b\x8a\xf5\x08\x7f\x86\x60\x5a\x77\xe0\x25\xef\x6c\x7e\x6a\x2a\x59\xf0\x06\xcb\xa1\x89\xfa\xd9\x33\xf4\x2c\x53\x27\x08\x10\x9b\xc1\xaf\x81\x48\x19\x59\x5f\xfc\xb9\x5f\xbf\x5b\x7e\x93\xa7\x11\x97\xe4\x77\xee\x7c\x04\xb8\x51\xc1\xc3\x66\x22\xcd\xd8\xe6\xc8\x60\xd9\xab\x2c\xac\x56\xd2\xdc\x98\xfa\x69\x12\x4f\x2b\xb2\xa6\x47\x1e\x1c\x73\xb6\x61\xf0\x71\xf5\xd8\x6d\xe7\xd1\xde\xaf\xa4\xed\xcd\xc7\xbf\x1f\x70\x5c\x56\x30\x0a\xff\xd0\x58\xb9\x69\x77\x91\x41\x9e\x5f\xb2\xa5\xb7\xf7\x8c\xe3\x40\x1f\xf5\x50"}, -{{0x89,0xde,0x74,0x42,0xd7,0x4b,0xa9,0x38,0x59,0x69,0xc9,0x65,0x1a,0x88,0xfe,0x28,0xe0,0x40,0xd5,0x93,0x90,0x7d,0xac,0x1a,0x39,0x87,0x41,0x8b,0xdf,0xdb,0xad,0x89,},{0xfd,0x3b,0xa9,0xfa,0xd3,0x20,0xeb,0xa4,0x5d,0x07,0xb8,0x4a,0x49,0x7b,0xe1,0x7d,0x3f,0xc7,0xdd,0x99,0x99,0xc9,0x68,0x88,0x3c,0xd6,0xac,0x13,0xb0,0x66,0x9b,0x17,},{0xba,0xb5,0x72,0x84,0xd2,0x0e,0xe5,0x4c,0xc7,0xf9,0x70,0x8d,0x71,0x77,0x06,0xd8,0xfa,0xf6,0xe4,0x63,0x32,0xb0,0x69,0x1d,0x6f,0x21,0x3a,0x8d,0xb8,0x01,0x15,0x5b,0x4e,0x33,0x8c,0x13,0x61,0xb5,0x92,0xbe,0x75,0x85,0x01,0xb1,0x82,0x17,0x93,0xae,0x52,0x27,0xcc,0x3b,0xa8,0xdf,0x8a,0xdf,0xc6,0xed,0x9a,0xca,0xb5,0x4c,0xc4,0x01,},"\x9d\x52\x72\xf0\xb7\x84\x88\x2b\x94\xc7\x6d\xfb\x9d\x46\x0c\xa4\x95\x02\x5e\x0a\xec\x5d\x52\xcc\xff\xfe\xce\x9f\x81\x73\xc1\x05\x58\x26\x6c\x49\x85\x25\x89\x1a\x97\xbf\x38\x78\xe3\x3c\x3d\xe2\xfc\x2e\x52\x55\x0b\x43\x15\x62\xcb\xe4\xa3\xd0\x11\xec\xc9\xe7\x7e\xc3\x6a\xd3\x83\x41\x35\x8c\x88\x32\x1c\x03\xd0\x8b\xb4\x26\xa7\xd5\x85\x41\x71\xc0\x27\xec\x48\xd5\x78\x19\xa9\x1a\xfd\x02\xa6\x18\xcc\xbc\x25\xe6\x8e\x53\x09\xd0\x47\xb1\x56\xe3\x57\x05\x37\x3a\xda\x2e\xb8\x31\x32\x1a\x20\x3e\x1b\xd8\xf0\xef\xec\xc0\x96\x18\x64\x7b\x41\xdf\xf2\x2b\x39\xd0\x22\x35\xf8\x71\x53\x2f\x60\x85\xe9\xcc\x52\xec\x00\x9b\x33\xee\xbc\xdc\x26\x7d\x77\x67\xc9\x0c\x92\x7e\x15\x4f\x72\xf3\xf4\x8a\x34\x95\x63\x19\xb2\x93\xc8\xa8\xb3\xe3\x4e\xfc\x5f\x62\xf2\xb4\xe8\x01\x9b\x50\xa0\x8f\x5c\xcf\x95\xbc\x83\x1b\xaf\x40\x81\x1d\x87\xe5\xed\xbd\x2f\xd5\x36\x5b\x26\xa4\x31\xae\x95\x80\x0f\xf3\x81\xcd\x62\xca\x40\xe1\x86\x6d\x95\x0d\xce\x14\xf0\x30\x91\x8a\xba\xc6\x8e\x79\x16\xdd\xb9\x5a\xdc\x19\x71\x28\x78\x74\xd0\x7e\xb0\xed\xef\x64\x29\x66\x52\xc4\x80\x44\xb0\xc5\x52\x1a\x8d\x27\x0d\x53\xd7\x4e\xc6\x3b\x89\x0f\x33\x63\xf9\x20\x7f\x66\x52\xae\x8e\x78\x35\xc3\x82\x0a\xd6\xd9\xe3\x63\x3f\x4b\xfd\x53\x79\xa4\x4f\x29\xd6\x5f\x36\x09\xfe\x35\x58\x17\xdc\xa5\x51\x8d\xfe\x3b\xd7\x69\x32\x0a\x03\x19\x02\xe9\xcf\x66\x69\xc2\x4f\x88\xb0\x1e\xb3\x69\x95\xbd\xb8\xdb\xed\x6e\xe0\xc9\xb7\xf3\x22\x95\xc6\x1b\xa8\x90\x5e\x55\x98\xf3\xc9\xe1\xc8\xbf\x72\x64\xf9\x82\x93\xfa\xea\x17\x74\x7f\x88\x44\x0c\x31\x81\x8c\x43\x3e\xa3\xd2\x3c\x01\xf4\xf7\xe9\xc3\xdd\x3d\x5f\x32\xec\x9e\xac\xd7\x1a\x09\xe3\xa9\x97\x38\x1f\x1c\xbf\xfd\xf4\xb5\xba\x49\x79\xde\xb7\xb0\x98\x41\xaf\xa3\xb0\x3d\x1c\x93\x11\x09\x7b\x86\x2c\xae\x11\x70\x7c\xbd\x3a\x4a\xe6\xc8\xa2\x6a\x30\x6a\x68\x7c\x41\x4a\x4e\xa1\xe8\x12\xf1\x15\xf6\x0f\x70\xbd\xa7\xf8\xfb\xe7\xbc\x2d\x50\xcc\x55\x0b\xba\x29\x1d\x5e\xc5\x23\x22\x9a\x08\xed\x56\x8b\x5c\xee\x18\xfe\x6f\x46\x78\x2c\x17\xcd\x82\x88\x01\x63\x92\x15\xbc\x5e\x9b\xe4\x55\x5c\x9a\x18\x00\x97\x67\xa6\xc5\xc7\x4a\x82\x29\xd2\xff\xaa\x39\x9d\x8e\x64\x32\x4e\x88\x42\x23\xd5\x07\x0f\x73\x5a\x75\xd8\x5f\xf6\xc9\x4a\x9f\xbc\x2b\x36\x51\x38\x6d\xe5\xa2\x3c\xce\x95\xc8\x78\x81\xc7\x93\x99\xae\x71\xf0\x90\x73\x7e\x21\x87\xfe\x90\x4a\xab\x1d\x92\xd6\x18\x67\x95\xc9\xb4\x6c\x62\xa5\x91\x4f\x36\x30\xfd\xcb\xac\x3b\xd4\xb0\xda\x4e\xc3\x13\x6a\x1f\xb2\xba\x40\x32\x2d\x7c\xc4\x08\x5e\x16\x70\x09\xcf\x74\x50\xfc\x6a\x28\x6c\x2f\x79\x51\xd5\x1a\xae\x23\xb8\xf3\x30\x20\xef\xb5\xe3\x24\x5b\xa6\xa3\x54\x3a\x2b\xde\xc4\x47\xd5\x1a\xe0\x0b\x5e\x16\x78\xb7\x60\x93\xcf\x21\x6b\x95\x07\xc9\x63\xeb\xfc\x02\x4c\xcd\x6e\xf6\xc7\x8c\x45\x72\x27\x3b\xea\xaf\x55\x07\x6d\xc4\x4a\x22\x4b\x58\x61\x57\x05\x79\x19\x65\x30\x7c\xef\xd4\x86\x72\xc0\x81\xbc\xcf\xbc\x1d\x15\xb0\x62\xb3\x8b\x4f\xba\x9b\x9b\xec\x95\x6c\xd1\x44\x44\xee\x43\x7e\x79\x60\xcc\x60\x1e\xdd\xc0\x2f\x1a\x76\xb6\x85\x74\xd5\xf8\x84\x31\x50\xc0\xb9\x00\x99\x34\xa2\xbf\xaf\x60\x57\x70\xc1\x36\xba\x29\xf3\xdc\x7e\x29\x59\x7a\x24\x80\xdb\x23\xe2\xb2\x67\x7e\xc6\xc5\x1b\xd3\x01\xf2\xb5\xa3\x9d\xfd\xa7\xb4\x77\xbe\xdd\x1c\xda\xed\x10\xe2\x9d\x29\x54\x62\x9b\x98\x76\xf8\xee\x54\xe4\x04\x73\x69\xd5\x34\xca\xb5\x4a\xea\x44\x1d\xc9\x47\xeb\x3f\x59\x38\x2b\x21\x83\x60\x57\x2f\x26\x59\x58\x31\x53\xc0\xe2\xb9\x12\xcf\x30\xc8\x15\xb2\x6f\x05\x85\x3d\xd3\x05\x51\xee\xcf\x64\xb8\x58\xa4\x41\xbb\x8c\x6d\xb8\xa9\xfd\xe7\x7a\x32\xa7\xb4\x6a\xf6\x6f\x8c\xb9\xf3\x5e\xe0\xfa\xfb\x0b\xd4\x2d\x9e\x65\xb2\xa9\x05\x82\x41\xa3\x1b\x8c\xa1\x11\x54\x34\x23\x76\x70\xaa\xb4\xef\xf3\x60\x10\xed\x03\x71\xf4\x65\x95\xda\x1b\xdd\x57\x9b\xbb\x67\xaa\xdb\x68\xe7\x7a\xd3\xa3\x8c\x8f\x26\xd2\xaf\x5a\x71\x03\xba\x5f\x22\xb4\x2c\xc1\x2a\x8c\x3c\xe5\xc9\x21\xc9\x1c\xfc\x0e\x63\xdf\x90\x27\xd2\x62\x29\xb1\x04\x7c\xbc\x18\xf6\xb0"}, -{{0x26,0x22,0xbd,0x9b,0xbe,0xf7,0xff,0x4a,0x87,0x62,0x9e,0xa0,0x15,0x3d,0xc4,0xd6,0x08,0xc3,0x1f,0xa5,0x84,0x79,0x88,0xff,0x50,0x0d,0x88,0x06,0x81,0xf1,0x13,0x72,},{0x19,0x97,0x58,0xa9,0xc3,0xd0,0xee,0x3e,0xeb,0xcb,0xbd,0xa3,0xe1,0xef,0x54,0x55,0xff,0x46,0xd7,0x36,0xbb,0x4e,0xf0,0xc0,0x6a,0x73,0x9f,0x9a,0xc5,0x84,0x83,0x95,},{0x43,0x78,0x96,0x6b,0x78,0x31,0xde,0xf4,0xae,0xcb,0x49,0x89,0xbc,0xaf,0x9c,0xae,0x99,0x46,0x1c,0xb9,0xb5,0x9d,0x19,0x51,0x8c,0xc1,0xec,0x7b,0x83,0x51,0xbc,0xd1,0xf7,0x23,0xaa,0xc5,0xf0,0x61,0xb3,0x83,0x63,0x57,0x4f,0xf9,0x6b,0xa1,0x0e,0x19,0x6b,0x1b,0x05,0x31,0xe1,0x18,0x30,0x36,0xa4,0x25,0xe6,0x9c,0x45,0x98,0x04,0x0c,},"\x89\x1e\x82\x12\x25\x47\xd6\x1e\x83\xb0\xab\xaf\x27\xc7\x30\x3f\x05\x22\xa2\xec\x4a\xf4\x4e\xf0\xac\x19\x6a\x99\x78\xb1\xc6\x23\xef\x1f\xa7\x2b\xaf\x70\x91\x0a\x5c\x51\xc4\xf7\x8e\x0f\xe9\xfe\x37\xe2\x43\x9c\x47\x95\x91\x6c\xfa\x22\xab\x47\x1a\x25\x57\xcc\x7b\xa6\xb6\x69\x56\x06\x3d\xde\xb3\x9c\x50\xf1\x4f\x06\x34\x8f\xa6\x6b\x60\x64\xdc\xff\xca\x50\x43\x96\x7f\x05\x25\x4d\x57\x7a\xbf\x22\xae\x8c\x90\x00\x0c\xe2\xe6\xa1\xa8\xb2\xe3\xa6\xb3\xab\xc5\x63\xeb\xff\xb2\x04\x45\xf0\x91\x1c\xc4\x2a\x98\x7f\x84\x56\xef\xba\x41\x30\xe6\x8f\x01\xfc\xdf\x7b\xf7\x71\xfc\x1d\x35\x37\x1a\x0d\x75\xdd\x5f\x90\x00\x2c\x90\xb6\xcb\xad\xe4\x0d\x5b\x23\xfd\xb4\x9a\xba\xcb\x72\x19\xae\x27\x56\x1a\xa2\xa8\x79\xda\x88\xdf\x34\xa8\xc5\x81\xf0\xc6\x71\x98\xff\xc6\x08\xfe\x91\x95\xb5\x55\x5c\x8a\xe9\x34\xc8\x30\xaa\xe2\x88\x5b\xea\x87\x48\x74\x48\xe1\x1b\x4f\x2f\x17\x2e\x4d\x5c\xfe\x4f\xd1\x13\xf9\xd2\x01\x6c\x24\xa7\x34\x51\x2b\xb9\x18\xf5\x75\xe7\x54\x13\x97\x18\xe3\xd2\x0e\x79\x0a\xbb\x94\x2c\xba\x3e\xc8\xb2\xdb\x59\x07\x96\xdc\x43\x5f\x13\x9f\xc6\x4d\xdc\x85\xa2\x24\x94\xef\x2b\xfa\x1f\x5c\x0f\x18\x75\xea\x58\xe8\x4e\xb3\x74\xec\xf8\xce\xc6\x46\x8b\x6b\x09\xd1\xe7\x4f\x15\x41\xed\x45\x4a\x28\x07\xd3\xf4\x05\x35\x66\xb0\xe4\xe2\xc6\xae\xce\xd1\x0d\xc0\x07\xe9\xdf\x41\x6f\x26\x7f\xcb\x3f\xe1\x7b\x8b\xac\xe0\x3f\x07\x43\xe0\xe6\xd4\xa4\x8c\xe7\x6e\xdf\xf6\x0c\x0e\x3a\x30\x84\x56\x99\x54\x13\xc1\x07\x6f\xf3\x7e\xcf\x23\x81\xa0\xd4\xe9\xe4\xa9\x13\xa2\x58\xd9\x83\xb9\x69\x6b\x5c\x45\xaf\x37\xc8\x68\x40\x70\xe4\x00\xb8\xf8\x65\xa5\x04\x04\x3f\x45\xd7\x8b\x97\x13\xf3\x35\xaa\x41\x6a\x46\x16\x64\x10\x73\x5f\xb5\xd8\x22\x10\x45\x8d\x5a\x08\xa1\x04\xd4\x00\x2a\xb6\x11\x88\xf9\xdf\x45\x7d\xd7\xed\x59\x37\xca\x50\x77\x60\x6b\x41\x8b\xbc\x86\x84\xa1\xd5\x25\xbf\xa5\x51\x08\x76\x40\xb1\xd1\x77\xca\x6d\x4f\x64\x71\xb3\x9b\x2c\xe4\x3a\xfb\xf8\x28\x5e\xcd\x68\x7e\x43\x8f\x44\x25\xdf\x56\x8a\xb8\x6f\xa2\x31\x63\x49\xa1\x10\x2b\x41\x43\xd7\x1e\xf4\xe2\x4f\x5c\x53\x0c\x77\xaf\xb0\x10\x07\x88\x63\x64\x40\xe7\x40\x67\x5a\x61\x74\xc5\xf0\x57\x10\xb2\x53\xa4\x11\x17\x3f\x9e\x82\xce\x6e\x22\xf4\x09\x5e\x77\x14\xb8\x73\x7e\x14\x7a\xa0\xf2\x31\x91\x57\x8f\xfd\x93\x82\x3c\xe4\xbf\x91\xc1\xd1\x10\x98\x2a\x5d\xa0\xe4\xb8\x1b\xd2\x5b\x9b\x9c\x21\x42\xa7\x67\x1e\xe9\x37\xc9\x0f\xd0\x71\x5e\xc9\xaf\xa4\x4d\x86\x04\x68\x98\xb4\x2f\x75\x35\x89\xd2\x26\x8d\x2a\xaa\xa9\x85\xcc\x90\xe0\xf9\xe8\x27\xa3\x92\x3e\x77\x16\x34\x6f\x4f\x89\x31\xc7\x28\x21\xb3\xeb\x64\x5d\xaa\x74\x52\xc8\xaf\xc8\x98\xd7\x97\x55\x45\xc1\x2d\xa1\xbd\xb2\x09\x04\x5c\xb0\x0f\x4b\xfd\x53\x83\xdf\x01\xf0\x03\x68\x0b\x97\x34\x40\xf1\xa3\x9c\x9d\x82\x09\x59\xef\x6f\x85\xbd\x33\x63\x90\x65\xae\xfd\xc8\xbc\xfe\xcb\xd9\xb9\x55\x40\x49\x73\x8a\xf2\x9f\x12\x94\x63\x9d\x39\x15\xd6\x32\x99\x5e\x8f\xaf\x71\x3e\xf2\xee\x3c\x29\x8b\x55\x96\xfa\x10\xc9\x9f\x94\x6d\xdb\x32\x34\x06\x95\xdf\x1c\x19\x45\x94\xea\xf3\x77\x8d\x73\xc8\xba\x60\x40\xc0\x4e\xb3\xa4\xff\x86\x77\x93\x6b\x88\xe0\xc5\xf0\x44\x14\x80\xd1\x07\xd7\xac\x22\x02\xb3\xb6\x94\xe5\x7c\xcc\xa6\xd8\x25\xe2\xa0\x7e\x81\x2e\xd2\x9b\x2c\x20\xd5\xc6\x05\x47\x15\x79\xe3\xed\xff\xc2\x23\xf2\x42\xc5\x93\x91\xdb\x41\xe9\x8d\x5f\x3d\x6c\x5b\x1e\x32\xac\x82\x37\xfc\xfd\x10\x20\x54\x3a\x40\x41\xe0\x3d\x92\xad\x3e\x2e\xc5\x52\x91\x47\x07\xc7\x7c\xd0\x1f\x3e\x48\x01\x14\x44\x28\x3f\x09\x68\xfa\x4d\xee\xee\x55\xc4\x56\xed\x1f\x87\x7a\xde\x04\xac\x8e\x8d\x2c\xb6\xc8\x58\x20\xb4\x92\x9b\x25\xbf\x31\xe9\x25\x43\x5d\x6b\xcc\x50\xd3\xe2\xe9\xb8\x51\x02\xe9\x70\xd7\x89\x5c\x25\xad\xe5\x21\x61\xa3\xb6\xbf\x50\x1a\xb0\x19\x61\xcb\x63\xed\x99\x0a\xeb\x93\xed\xa3\x82\x8b\xf0\x4c\xa5\x28\x53\xc7\xb6\xb8\xe9\xe4\x9e\x34\x9d\x69\xb5\x3b\xe0\x74\x85\xf5\x42\xb7\xcd\xd0\x6b\x52\x7d\x41\xdd\x11\x9c\x70\xb5\x64\xf1\xa9\x3a\xec\x62\xae\x74\xe6\xe8\xf8\x55"}, -{{0xae,0xb1,0x3c,0xcb,0x90,0xc8,0xcb,0xef,0x90,0xd5,0x53,0xda,0x3f,0x69,0x01,0xb3,0xd7,0x5c,0x13,0x01,0x1f,0x02,0x49,0x74,0xda,0xf7,0x9a,0x17,0x89,0xc8,0xc6,0x32,},{0x5f,0xaa,0xfe,0xb5,0x95,0xf1,0x6d,0x33,0x8f,0x1c,0x72,0xa9,0xf3,0xe4,0x98,0xf3,0x8b,0xab,0x69,0xa8,0x1b,0x37,0xd2,0xd0,0x92,0xb7,0xbf,0x7e,0x50,0x5d,0x82,0x0d,},{0x06,0x11,0xb1,0x9a,0x74,0x72,0xa4,0x43,0xe8,0x7e,0x54,0xd7,0xc6,0x64,0x7f,0xaa,0xb1,0xb7,0x9a,0x83,0xfd,0x43,0x71,0xc9,0x2b,0x97,0x54,0x00,0xfd,0x62,0x8a,0xcf,0xc3,0x25,0x77,0xcc,0xbb,0xaf,0x03,0xd8,0x8f,0x89,0x3c,0x88,0xf2,0xca,0xc7,0x84,0xc7,0x22,0xa0,0x8f,0x38,0x7a,0xbc,0x31,0x9a,0x70,0x2c,0x86,0x84,0x79,0x65,0x0b,},"\x86\x1a\x10\x18\xd6\xbd\xc4\x80\x5a\x5c\x4d\xf8\x7e\xfa\xa4\x62\xc6\x8b\x4b\xf4\x06\x5c\x68\x4c\x2a\xf1\x31\xc6\x37\x73\x88\xba\xee\x58\xc6\xc8\xf8\x84\x23\x62\xec\x6e\x3b\xce\x07\xc8\xaf\x55\x88\x5e\x82\xdb\x87\xa1\x52\x27\x80\x0d\xd3\x3a\xfc\x5e\x5f\xd1\x57\x01\xe9\x5f\x53\x50\x1b\x1a\x6f\xf8\x3c\x64\xe8\x51\x71\x49\xbf\x3f\xf0\x11\xb0\x94\xa0\x9c\x67\x3d\x0f\xc4\xa3\x9e\xe5\x5e\x69\xf0\x71\x17\x7b\x8a\xa3\x64\xe1\xe2\x56\x06\x4c\xf7\x02\x79\xcc\x76\x69\x5a\xe4\x9d\xaf\xcd\x80\xca\x0a\x14\xe1\x69\x1d\xb9\x46\x42\x2e\xc7\x5a\xb4\xf7\x86\x59\x15\xa6\x9b\xd4\x8d\x89\xb1\x2a\xdf\x48\x7d\x4d\xb9\xbe\x87\xcd\xdc\xa2\x11\xaa\x88\xe9\xbb\xe8\x49\xda\x21\x39\x89\xeb\x08\x44\x59\x2a\xd6\x3e\x28\x1b\x2e\x4a\xfe\x6a\x88\x36\x00\x66\x09\x92\x6c\x0f\x78\x7e\x84\xf2\xa9\x5b\x46\xb6\x6f\x0e\x45\x55\xc9\x48\x3c\xe2\x17\x6f\xc6\x3f\x7c\xc9\xf4\xf2\xa2\x2d\xb0\x55\xaa\xe2\xe6\x8b\x30\xa0\xda\x5f\xeb\x80\xc2\xa6\x0e\xa1\x0d\xbf\x67\xfb\xbc\xdb\xe0\xbe\x33\xf2\xe9\xc1\x3c\x46\x9e\x77\x68\xf2\xff\x59\x60\xa5\x5e\xb4\x82\xec\x11\xd4\x7e\x15\x4b\x7c\x42\xa5\xfb\x75\x6c\x8a\xd5\x39\xb3\x3d\x12\x5a\x4a\x65\x19\x2c\x6c\x9b\xd5\x76\x23\x8c\xa7\x2a\x73\xcd\x17\x9e\x8c\xf5\xcd\x04\x8e\xd3\x30\x21\x38\x23\xab\xba\xfc\x36\x82\xb2\xb7\xf6\x8c\x5b\xc4\x6f\xd0\x9a\x8c\xb2\xa3\xfd\x09\x95\x73\xee\x2e\x6f\x28\xc8\x2e\x27\x1b\xb5\xef\x93\x4b\x0b\x0c\x38\x1c\xfa\xae\xc6\x66\xd7\x17\x10\x6a\x87\x4a\xf3\x0a\xa7\x41\x25\xea\xe9\xac\xc2\xf1\xf2\x41\x18\xcb\x4e\x68\x3a\x73\x1e\x37\xe5\xe4\x64\xa1\xea\x3d\x2a\x53\xcc\x0d\xca\xd4\xc1\x7c\xea\x9a\x43\xe2\x36\x5f\x3a\xe3\xdd\x89\xeb\x39\x97\x74\x20\x04\x55\x50\x74\x5f\xc2\x67\xfc\x7d\xcc\x56\x02\xe9\x14\x97\x2a\x4d\xa6\xeb\xeb\x68\x7f\x68\xa0\xcd\x7d\x8b\x4f\xdd\x73\x72\x21\x06\xa8\xe4\x36\xb9\x3e\x5b\x58\xf5\x98\x2a\xce\xcd\xec\xfd\xb3\x82\xfe\x98\x53\x82\x61\x42\x6b\xa6\x40\x52\x55\x76\x43\xce\x9f\xec\x71\xea\x43\xcf\x5b\x6c\xba\xde\xb4\x95\x31\x93\xff\x3e\xd1\xa1\xf9\x22\xa9\xaf\x2e\xc6\xf3\x38\xe7\xfb\x0a\xff\xe3\xd1\x3c\x33\xe3\x95\x87\x3e\x4a\x7a\x7f\xb0\x44\x98\x1e\x05\xa6\x71\x97\xb9\x96\xb1\x99\xb4\x30\x11\x11\x93\x63\xe5\x61\xd5\xb8\xa5\x17\x84\xfd\xff\x58\xab\x80\xed\x4c\x49\xe9\x3f\x0c\xf4\x19\x24\xf9\x83\x5e\xfb\x09\xf6\x44\x63\xb6\x55\x17\xb6\x7b\x15\xdc\x3f\x28\xad\x9a\x9b\x2d\x29\x46\x8d\xe2\xc6\x3e\x62\x00\x4b\x6a\x3f\xd0\xc5\xc2\xe2\xaa\xa6\xcf\xa1\x5e\x4f\xaa\xfa\x1e\x2c\x71\x3e\x98\xd3\xfd\x25\xca\xb9\xe5\x17\x03\x59\xc8\x36\x51\x52\xb4\x74\x27\x6e\xd0\x03\x7c\xdf\x77\x18\x28\xe2\xfb\x7c\xce\xc4\x89\x5f\x21\xad\xcc\x5b\x68\x87\xc8\x6e\x51\xad\x05\xf2\x55\xf6\xe9\xda\xd2\xc4\x1f\x56\xb9\x8b\x7b\xbb\xf9\xfc\xb6\xba\x8c\xad\xfd\x38\xad\x8c\x62\xf9\x2d\xd8\x77\x40\xfa\x1e\x1b\xd1\x70\xc0\x0b\x20\x49\xc5\x13\x0f\xe7\x33\xf1\x6b\x1f\x2c\x7f\x00\xb2\xef\x97\xb3\xa9\x54\x58\xc5\x3f\x19\x9d\x46\x53\x36\xd5\xff\x59\x77\x80\x6e\x1a\xfd\xe3\xea\xa2\x46\xd8\x5c\xab\xf7\xe1\x23\x48\x1e\x23\x92\x99\x76\xed\x19\xc4\x0e\x29\xff\x33\xd8\x0e\x7d\xea\xb1\x92\x71\xde\xcd\x5e\xe0\x61\x72\xb0\xb0\xa1\x39\xbd\x62\xa2\xe7\xc8\x3a\x8a\x65\x60\x1d\x0a\x05\xd6\x1a\xf9\xc6\x03\x2d\xf5\x80\x01\xd4\x73\xe2\x0d\xd6\xc6\xaf\xd7\x8d\xdb\xd7\xcd\x17\x8e\x9c\x27\x1e\x05\x72\xf8\x59\x82\x82\x3c\xe6\xc4\x02\x93\x0c\xf8\x0f\x5e\x0c\x7c\xda\x85\x12\x2a\x76\xd1\xce\x02\x1b\x1e\x3d\xe2\x55\x6d\x1b\x45\xac\x7b\x01\xb5\x9c\xad\xa2\x52\x91\xd6\x38\xa5\x2a\x5e\x7d\xbc\xdd\xf9\x6b\xb1\x77\x4a\xb0\xb0\x77\xe4\xb3\xda\x5a\x95\x8f\xe1\x1d\xee\x4a\x02\xe6\x9b\x91\x8d\xdb\xfa\x1c\x5b\x3b\x7d\xca\x9f\x87\x84\xbb\x6b\x0b\x9d\x5a\x7f\xee\x74\xbb\x03\x74\x7f\x61\xc2\xb2\xf1\xb4\x92\x45\x2d\x3b\x56\x0b\x48\xd3\x9d\x87\x21\xe9\x83\x75\x25\x56\xd4\x4d\xa6\xb0\x28\xd9\xae\xf8\xbf\xf9\xaa\x37\x9c\x8e\x2b\x0a\x63\x6d\x74\x88\x60\xab\xd8\xe6\x4f\xc8\xe9\x65\x20\xa3\x4a\x27\xf7\x67\xaa\x97\xa8\xf7\x7b\x60\x95\x21\x8e\xad"}, -{{0x73,0x87,0x2b,0x14,0x76,0x2f,0x68,0xda,0xe4,0xfc,0x10,0xdf,0xd6,0xf4,0x2d,0x3f,0x96,0x22,0xbf,0x2a,0xfe,0x6b,0x34,0xa9,0x56,0x49,0xaa,0x38,0x74,0x24,0xee,0x6c,},{0xdf,0xab,0x2c,0xe1,0xab,0x99,0x81,0xaa,0x7c,0xbf,0x32,0x07,0x35,0x00,0x07,0xfa,0x6c,0xe6,0xca,0x60,0xa2,0xed,0x7b,0x59,0x0f,0x3c,0x2f,0x62,0x92,0x2d,0x8f,0x61,},{0x85,0x25,0xc3,0x46,0xca,0x3a,0x6a,0x6c,0x5f,0x65,0xc4,0x17,0x78,0x59,0x93,0x77,0x65,0x98,0x70,0xcb,0x6d,0xf9,0xa4,0xa0,0xe5,0x5b,0x40,0xc3,0x5b,0xeb,0xa5,0x5c,0x8e,0x00,0x9e,0x56,0x00,0xb6,0x44,0x7d,0xc7,0x40,0x2b,0xa2,0x77,0x49,0x29,0x7e,0x8f,0x95,0x28,0x69,0x18,0x56,0xf7,0x2d,0x2a,0xd7,0x61,0xed,0x1b,0xc1,0x53,0x09,},"\x43\x3d\x71\x78\x1c\xea\xb2\xb4\x7d\x82\x6e\x67\xd3\x9f\x9b\x80\xd2\xff\xd7\x25\xf8\xc5\xae\xb4\x0c\xbe\x4f\x9b\x5f\x48\xef\x93\x52\x1c\xce\xc6\x04\x36\x0b\x96\x47\x32\x31\x90\xbf\xef\x75\xac\x93\x15\x62\xd2\x7f\x4a\x4e\x31\xf4\x6e\x57\xbc\x99\xfa\x51\x58\xc8\x2e\x12\xb7\x37\xe4\x5c\x5d\xe9\xf7\xdd\x7c\x86\x22\xd4\xa7\xea\xad\xf7\x20\x2f\xb4\x9d\x81\x9c\x9a\xd2\x4f\x88\x07\x31\x3c\x5f\x37\xdc\x20\x45\x3b\xdf\x05\xc9\xbf\x1a\x3c\x21\x17\xc9\x3e\x7f\x3c\xc8\xa2\x54\x20\x98\xe8\xfc\x1c\x64\x2f\xa4\x7b\x05\x54\x36\x57\xb8\x5f\x48\x0b\xc8\x6e\xc4\x28\x00\xbb\x14\x22\x35\x9c\x7c\x3e\x8f\xf4\xbe\x59\x8b\xd5\x4f\x1d\xc5\x86\xac\xae\x45\xa4\x74\x06\x22\xb9\x62\x74\x2b\xc8\x6e\x17\xcf\xa6\x3e\x77\x53\x54\xe7\x70\x7e\x50\x79\x58\x9e\x8d\x10\x8b\x1f\x11\xda\xce\x05\x75\xcb\x9a\x6d\x26\xb5\x9f\xce\x98\x14\x65\xd9\xbc\x34\x4e\xa6\x94\x5a\x95\xb8\x62\x79\x63\x84\xfa\x81\x70\x56\x08\x57\x45\x7b\xef\xf9\x5a\x9b\x5a\xc3\xd6\xad\x28\x2d\x44\x92\x9a\x30\x30\x26\xb4\xbb\xed\xd6\x0e\x2e\xf0\x55\xa3\x1f\x52\xd7\xce\x8d\xf2\xca\x5d\x18\x51\xc5\xb1\x67\xdb\x08\x09\x25\x9b\xb8\x12\x56\x90\x74\x10\x5c\x73\x4c\x85\xd6\x23\x12\x73\x75\x5f\x3a\x8b\x56\xdc\x50\x8d\xb5\xc2\x3d\xac\xb7\xa0\x61\x67\xbd\xa5\x1b\xc0\x13\x50\xf0\x16\xcd\x41\xb2\x1e\x8c\xc5\xbc\x93\x34\x3a\x9b\xb6\xea\x47\x38\xc5\xc8\x4b\x78\xfa\x96\x3c\x41\x0e\x43\x3d\xc5\x98\x19\x6c\x22\xe5\xb7\x91\xe1\x2a\x4b\x34\x3f\x7c\xd4\x7b\xbb\x0e\xb0\x78\x2b\xdb\x1a\x4e\x46\x68\x46\xa0\x30\x52\x8e\xeb\x89\x05\x6f\x73\x25\x71\x93\xad\xaa\xbc\x1b\x22\x98\x62\x03\x48\x78\xc3\x25\x8a\x53\x25\x48\x76\x2e\x29\xec\xc0\x01\xab\xd9\x89\x64\x9d\xa5\xe1\x44\xcf\x35\xd4\x86\x99\xf2\x3b\xc4\x6c\x5b\x34\xe0\x4a\x53\xe7\x27\x24\xb2\xb0\xb8\x78\x98\x25\x75\xd6\x88\xe2\x3c\xbe\x3a\x34\x06\x7f\x49\x71\xe5\x55\x97\x2e\xc2\x90\x8a\xe5\xf0\x3e\x88\x31\xec\x67\x75\x5b\xe9\x56\x87\xce\x63\x72\x93\x9e\x1e\x2f\xb6\x95\x1e\xc9\xec\xf4\xbf\x7d\x15\x35\x43\x1e\x25\x9f\x29\xad\x43\x12\x22\xb5\x4b\x65\xaa\x7d\x07\xcf\xb5\xdf\x16\x2a\x87\xc4\xd0\x34\x81\xeb\x44\x1f\x22\x1d\x7f\x58\x62\x7a\x14\x16\x4e\x7f\x4c\x2e\x3a\x1d\x50\x7e\x89\x9d\x53\x58\xe0\x08\x29\xb0\x8c\xf3\xae\xcb\x8a\x75\xb2\xa3\x1c\x31\x85\xa5\x80\xe1\x2b\x13\xf0\x64\x28\x69\xff\xfb\x05\x67\x23\xe9\x61\xaa\xf6\xfe\xfe\x67\xb4\xa7\xc4\xc9\x3d\xb3\xfe\x1f\x61\xad\xcc\x76\x55\x69\xa9\x9c\x09\xa3\xc8\x24\xed\x4a\x98\xba\xbe\xae\x43\xef\xb1\xf3\x51\xba\x13\x0e\x22\xaa\x97\x81\x19\x86\xbe\x92\x3c\xc4\x18\x0a\x7c\x4b\x78\xbc\xc1\x40\xce\xc1\x55\x74\x65\x4a\xa6\xd6\x5a\x06\xb9\x7e\xcf\xa5\xf3\xa9\x35\x5f\x96\xe4\xee\xaa\x76\x89\x21\x7b\x66\x3f\xba\x4d\xab\x0d\x99\xb1\x9c\x8d\x8d\xbf\x47\xa1\x57\xe5\xd5\x96\x9a\x35\xef\x84\xdf\xf9\x56\x2e\xdd\x43\x4e\x73\xae\xe7\xd0\xd8\x92\xdd\xa7\x2a\x36\x2a\x22\xa7\xe9\xfa\x86\x34\xa5\x7e\xeb\xd1\xa9\x07\x48\x5c\xa8\x92\x1b\xdc\x19\xee\x9e\xe5\x88\xf3\x95\x68\x7d\x3f\xc8\xf8\xc2\x5f\x2e\x95\x76\xca\x60\x31\x3f\xbb\x2c\x26\x5a\x99\xf2\xcd\xd5\x57\x5b\x1d\xd5\x30\x60\x4e\x9a\xd6\x69\x5c\x9f\xb3\x59\x94\xa8\xb8\x7d\x5c\x85\x70\x54\x9a\x4d\x32\x9b\x9f\xe0\x87\x06\x9a\xb7\xeb\x0d\x71\x4a\x94\xe1\x92\x61\xf8\x6e\x44\x8f\x2d\xa9\xb1\xcb\x0c\x0d\xbe\x41\xd4\x4c\x3a\x82\x47\x83\xd1\xbd\xbd\x73\x26\x05\x1a\xeb\x10\xad\xab\x80\x5c\x5c\x59\xd0\xe8\x3b\x1c\x11\xa2\xfd\xd3\x5e\x44\x4a\x49\x9e\xd1\x5d\xaf\xd8\x38\x62\x77\x5f\x6c\xdf\xc6\x75\x95\x81\x84\x07\xbe\x55\xec\xbf\x7b\xf8\x6c\x73\x06\x9a\xac\xe5\x77\x62\x6a\x85\x63\x53\x6f\x60\x50\x42\xcf\x7c\xaa\xf6\xfc\x8e\x3b\x54\x5b\x77\x41\x4d\xf8\xd9\xf6\x49\xb9\x9e\xe4\x25\x41\xda\x38\xc3\xaa\xe6\x27\x20\x78\x45\xb8\xf4\x14\xa8\x07\x4d\x70\x86\x8a\x5c\x0b\x07\xb0\x70\xc3\xc6\x53\xbe\x04\x07\x6b\x83\xca\xd7\xb0\x30\x5d\x95\x00\xaa\x44\x45\x5c\xb8\x60\xdc\xc7\x64\x00\xaf\x93\xc3\xd2\xef\xb4\x2a\xe0\x56\xf1\x42\x8b\x65\xf1\x22\xe1\xc7\xb9\x58\x4d\x81\x4d\x50\xac\x72\xef\xdb"}, -{{0x67,0xcf,0x27,0x15,0x52,0x87,0xbe,0x6b,0xfa,0xb6,0x62,0x15,0xe0,0x17,0xc3,0x46,0x63,0x22,0xf2,0x1e,0x6e,0xb1,0x40,0xbe,0x4f,0x1b,0xde,0xcf,0x55,0xab,0xfd,0xc1,},{0xd0,0x70,0xaa,0xb2,0x95,0xa8,0xaf,0x93,0x57,0x27,0xc3,0xbe,0x44,0x2b,0x25,0x1d,0xb9,0xe7,0x74,0xd2,0xf4,0x4b,0x3c,0x24,0x24,0xc5,0x2f,0xc8,0x96,0x56,0xe1,0x69,},{0xc9,0x34,0xa3,0xa1,0xaa,0xab,0x78,0xd9,0x26,0x9d,0x1e,0x9d,0x13,0x39,0x2f,0x72,0xc6,0x37,0xbc,0x5d,0xe5,0x4f,0x04,0x69,0x1e,0xfc,0x29,0xd4,0x73,0xb4,0x75,0x02,0x5d,0x8d,0x8f,0xe3,0xc5,0x23,0xd2,0xd2,0x9c,0x41,0xc5,0xf3,0xde,0xc6,0xca,0x38,0xce,0x6d,0x68,0xd7,0xff,0x09,0xb6,0x13,0x5b,0xa2,0x4d,0x0d,0x32,0xcc,0x15,0x02,},"\x0f\xf0\x52\x97\x03\x1c\x89\x27\x74\xcb\x2c\x01\xe8\xca\x60\xdd\xd0\xce\xac\xc0\xb8\xd5\x91\xa8\x91\xe3\x3b\x19\xe1\xbe\x9e\x36\x3b\xc6\x42\x0d\x6f\x52\x9f\x04\x84\x0b\x3b\x08\x85\x3c\x83\x5a\x03\xe0\x36\x97\x8b\x04\xa4\xf9\xec\x6b\xe4\xae\xf3\x31\x95\x61\x90\x99\x6d\xea\x27\x26\x19\xf1\x68\x6d\x33\xbe\xf0\x3d\xbc\x08\x5a\x92\x3a\x0f\x11\x5b\x78\xf6\x53\xfe\xeb\x60\xbb\x9e\x45\xf3\x4f\xb8\xbe\x5a\x4c\xbb\x64\x8c\x7d\x29\x95\x6f\x0d\x0e\x96\xbd\xd3\xc8\xd0\x64\x97\x20\x62\x4c\xbc\x20\x79\xe8\x4f\xd6\xd0\x10\x24\x11\x24\x09\x84\x59\xf1\x2a\xf2\x99\x1d\x38\x28\x77\x0f\x50\xb1\x04\xea\x6e\x5f\x51\xfd\xad\x30\xa9\xb8\x07\x9d\x21\x59\xe4\x6d\x64\xaf\x91\xd0\x7c\x10\xed\x19\x81\x4d\xf2\xaf\xe6\x60\xd7\xd8\xf2\x40\x35\x34\xe9\x2c\x62\xe1\xea\x6d\x68\x82\x03\xbc\xa3\xd9\x7c\x2a\xfd\xa8\x3b\x25\x55\x20\xff\xe9\x2a\x33\x62\x57\x72\x51\x3b\x1f\xe3\x4f\xaf\xe3\x2b\x6a\x9b\x8c\xf9\x94\xdf\x7e\x63\x4e\x68\x65\x91\xe5\xf0\x07\x3a\xba\xbc\x64\xa8\x92\x10\xba\x53\xa4\x99\x1c\x11\x55\x7e\x03\x34\xe6\xc6\xa5\x03\x6c\x64\x2a\x31\x8f\x22\x95\x11\x71\x39\x08\x5f\xb3\x40\x75\x64\x70\x06\x75\x8e\x32\xbc\x00\xad\x10\x9f\xe8\x03\xf7\xee\x9f\x5e\xc2\xaf\x4d\x25\xc3\x07\x0a\xbc\x51\xcf\x4d\x78\xe1\x3a\x7c\xe2\x83\xd4\xfb\x4e\xb4\x1d\x3e\x8c\xe9\x02\x38\x50\x0a\xe0\xce\xda\x32\x0e\xc5\x92\x2e\xfa\x10\xb9\x03\x74\x8e\x1e\x85\x3a\x37\x29\xd2\x4c\x10\x54\x39\xdf\x2f\x70\x00\x12\x3d\xb9\xb2\xc0\x15\x33\xbb\xf0\xd0\x28\xeb\xb2\xfc\x00\xdc\xe3\x8a\xd0\x63\x28\xee\x9e\xcd\x84\x9a\x6e\xfc\x3a\xe8\x84\xef\x69\x33\xcf\xeb\xed\x05\x5b\xb2\x96\x8a\x0b\x06\x76\xb5\x72\x92\x16\x17\x8c\x75\x19\xef\x07\x88\x59\x3f\xc0\xdc\xff\x50\xd7\xe0\xb1\xeb\xb3\xcf\x49\xbb\xd1\xbf\xa5\xc3\x0e\xa7\xb8\x8c\x36\xe1\xa1\x59\x3a\xef\x0b\xb3\xf9\xe2\x09\x1c\x85\x89\xf7\x41\x4b\xee\xd8\xdf\x46\x6a\x2e\xd8\x7b\x2c\xb5\xf3\x5f\x1d\x31\x24\x6c\xeb\x96\x86\x09\x25\x36\x15\xd7\x80\x43\x51\x73\x79\xee\x69\x74\xa6\x69\xcb\x48\xda\x6a\xc2\xf9\x6d\x70\x0b\x7e\x44\xa4\x35\xcf\xef\xec\x40\x2a\x1e\x31\x10\xe7\x69\x81\x92\x4f\x26\x01\xc0\x1d\xc0\x35\x46\xfd\x4f\x51\x16\x49\x30\x2f\x06\x33\xdf\xbd\x25\x65\x1c\x5a\x59\x9c\x90\x95\x44\x89\xc7\x6a\x65\xec\x05\xa7\xe4\xcc\x74\x61\x6c\xe2\x56\x01\xcc\x37\xb8\x04\xe1\xf0\xbc\xc8\x65\x10\x23\xb1\x2e\x13\x56\x84\x41\xe8\xb8\xef\x4c\x30\x5f\xcd\xad\x3d\x2b\x13\xfa\x08\x03\x24\xb2\xfd\x6b\x61\x99\x8c\xf8\x64\xb6\x58\xbc\x7f\xef\xcc\x48\xa5\xa7\x68\x1d\x7c\x86\x6c\x34\x2c\x7f\x5d\x6c\xf1\x08\x81\x52\x2c\xc7\x10\x25\x7d\x25\xa4\xc1\xe3\x52\xd2\x70\xe9\x02\x08\x2a\xb9\x54\x1d\x59\x00\xce\xff\xa0\x91\x4b\x16\xb5\x5e\x0d\xd3\x78\x6e\x98\xd4\x17\x20\x87\x5a\x14\x8e\xb4\xab\xdb\x01\x53\x85\x66\x79\xfb\x98\xc0\xec\x48\x5e\x5f\x45\x8d\x63\x5b\x78\x61\xa2\xb3\xa8\xba\x5e\xc2\xc1\x44\x4d\x35\x39\x80\x20\x0e\x5e\x07\x18\x08\x85\x4a\x26\x8c\xc7\x6c\x60\x5c\x94\xf3\x73\x29\xc3\x61\x87\xa4\x1f\xdd\xf9\x2a\xab\xdb\x49\x96\xa0\xe1\x0b\x31\x55\x26\xaf\xea\xc8\x0e\xb2\xfa\x32\xaf\x78\x6a\x34\x31\x6b\x36\x11\x1e\xe9\x35\x21\x08\x14\x4d\x70\xf7\xd1\x72\x3b\x32\xf4\xdb\xaa\x82\x20\x13\x53\x41\x1d\x65\x77\x13\xe5\x5e\x35\xdf\x78\x58\x0b\x1b\xc0\x86\x80\xf0\x15\x9f\xa1\x16\xfa\xf4\x63\x56\x6a\xaf\xe8\xae\xa6\x98\x57\xe7\x2e\x44\xac\x80\x9a\xc4\x3f\x5c\x45\x93\x9d\x85\xa1\xa5\xf4\xa3\x70\xa1\x89\x96\xc8\x51\x4a\x46\xf3\x43\x71\xef\x9e\x5f\xb2\x04\x42\x2c\x93\x4a\x1d\x29\x3d\x10\x1b\x8c\x16\xf9\x9c\xc0\x73\xea\x36\x6a\x13\xa4\x5c\x43\x7d\x62\x0d\x13\x2b\x74\x40\x9c\xbf\x8b\x9c\x07\x5b\x41\x63\xf7\x26\xaa\x67\xe5\x09\xa2\x48\x74\xfc\x1b\x1f\xb6\xfb\x7c\x73\x55\x15\x9c\x02\xaa\x13\xe6\x4b\xad\xf1\x50\x35\x6b\x18\x41\xb3\x21\xf8\x04\x1e\x13\xed\x77\xe8\x46\x1c\xfb\xb8\xe8\x28\x48\x8b\xf5\x17\xa5\xd2\x9f\xf8\x2e\x73\x67\x48\x0a\x8e\xdd\xde\xb5\x35\x0e\x7a\x83\x42\x3b\xd0\xb1\xc5\x5f\x7b\xb4\x24\xca\x04\xc2\x05\x72\x3c\xd5\x40\x56\x71\xe7\x33\xf3\x91\x60\x0a"}, -{{0x18,0xc2,0x1c,0x0d,0x0d,0xe1,0x3d,0x4c,0x64,0x49,0x7e,0xf0,0x26,0x0d,0x66,0xcf,0xd3,0x42,0x16,0x98,0x1a,0x1b,0x49,0x39,0x1a,0xe5,0xcb,0x0e,0x41,0x43,0x6e,0x9f,},{0xf7,0xd4,0xdd,0x1e,0x05,0x9c,0x36,0xf6,0xd1,0x21,0xc0,0xaf,0xfe,0xb2,0x1f,0x0c,0x57,0x2b,0x45,0x99,0x2f,0x84,0x94,0x8b,0x09,0xaa,0xfb,0xcd,0x86,0xbb,0x53,0x5c,},{0xc9,0xc0,0x99,0xe2,0x1d,0x09,0x5a,0xfa,0xdd,0x4e,0x71,0xc9,0xab,0xf6,0xb7,0x08,0x33,0x24,0x77,0x62,0x25,0xb5,0x87,0xb6,0x0a,0x0e,0x60,0x92,0xec,0xb3,0xd3,0x3c,0xff,0x39,0xc6,0x7d,0x34,0x77,0x6a,0xe9,0x9d,0xda,0x75,0x4a,0x3c,0x2b,0x3f,0x78,0x11,0x35,0xa3,0x8c,0x78,0xed,0x64,0x55,0xaa,0xf0,0xae,0x0c,0x31,0x3b,0x62,0x05,},"\x68\xab\xca\x7c\x16\x6a\xfe\x06\x3e\x47\x7b\x80\xe3\x7d\xb2\x24\xe1\xa2\x35\xde\x8f\xcd\xeb\x7f\x42\x7a\xf6\x7e\x00\x12\x47\xcc\x5e\x05\x71\x82\xfd\x9b\x6d\xb8\xba\xba\xa6\x58\xcf\x3b\x3f\xe4\xb0\x76\x3b\xf8\x8d\x67\x31\x1b\x11\x90\xbe\x83\x40\x18\xcf\x57\xa3\x32\x92\x24\x13\x76\x46\x20\xac\xe0\x54\x45\xee\x01\x9a\x06\xdf\xf9\x8b\x23\x89\x79\xad\x6d\x30\x90\x1b\xef\xa3\xc6\x4f\x6b\xd8\xc6\xeb\x09\x2c\x2e\x62\x84\x13\x88\xfd\x8c\x4e\x84\x19\xe2\x77\x89\x84\x89\x67\x37\xed\x90\xa2\xcd\xb2\x19\x96\xae\xf7\xc2\x16\x38\xd6\xcb\xe6\x80\x32\x2d\x08\x99\x65\x97\xa9\xe3\x03\xf6\xf5\xf4\x79\x40\xf8\xc5\xba\x5f\x5f\x76\x38\x3e\x7e\x18\x06\x4a\x3d\x2d\xff\x5f\xdf\x95\xe9\x0c\x5e\xb3\x0f\x4d\x8d\x45\x9e\xe1\xd5\x06\xa8\xcd\x29\xcd\xc6\x9b\x67\x54\x96\x3b\x84\xd6\x74\x94\xb3\x53\x05\xd1\x0d\x12\xb9\x48\x74\x17\xb2\xce\x28\xad\xcb\x10\xb6\x5c\xc9\x31\xfb\x33\x81\xae\x02\xe7\xaf\x79\xa0\x2b\xf9\x9e\x25\x8a\x56\x36\x10\x90\xe0\xb7\x12\x22\xb3\xac\x60\xbf\x2f\xb7\xba\x83\x2d\x03\x4f\x5b\x6b\xc6\xfa\x66\x3a\xe7\x41\xf7\x6d\x97\xc1\xac\x32\xbc\xb7\x41\x15\x07\xd5\x18\xd2\xf6\x05\x4b\x57\x83\x28\xc5\xf6\x7f\x75\x8a\xc0\x1b\xfe\x6f\x4d\x35\x90\x0f\x50\xa5\xdc\xd3\x0d\x2f\x92\x61\xb6\xbb\xec\x4c\x1d\x1f\xc1\x8d\x2a\x7e\x70\xc4\xd3\x6c\x21\xfa\xf8\xcf\x94\xa5\x87\xc3\xa0\xd1\xa9\xcd\xe7\x83\x1a\xe6\x26\x77\x54\x68\xdd\xcd\x40\xa8\xba\x18\xf4\x2b\x34\x18\x8d\xe5\x74\x1e\x1b\xe8\x30\x7b\x10\x84\x58\x65\x15\xec\x01\x5e\x4e\x37\x1d\x29\x44\x3a\x40\xb0\xc0\x69\xc6\x41\xd8\xce\xe5\xe4\x61\x18\x62\x98\x7c\x3e\x35\x6b\x12\x93\xb0\x51\x8b\x4a\x4c\x8e\xa9\x7f\xc5\xa4\xdb\x1f\x01\x29\xab\xee\x72\xfb\x80\x92\xea\x35\xc2\xda\xb6\x75\x73\x85\x02\x07\xb8\xe8\x27\x18\x99\x9a\xd9\x9c\x4c\x83\x9e\xac\x14\x63\x6b\xd5\xe4\xd8\x43\x6a\x27\x0d\xd9\x0b\x8e\x32\x13\x02\xe5\x2a\x92\xd8\x91\xff\x18\x91\x54\x2a\xe2\xca\xa0\xd6\x6e\x0f\x66\x1e\xae\x37\xb2\x5b\x08\xbb\x2e\x0e\xee\xc4\x83\x80\x09\x77\x8c\xd5\x25\x98\x43\x80\x98\x3b\x2b\xaa\xdd\x71\x02\xa1\xe3\x56\x73\x4e\x41\xd7\x61\x83\x82\x9e\xa9\xab\x82\x44\xc3\x36\x59\x7c\xa2\xd6\x79\x88\xf2\x81\x43\x84\x67\xe4\x53\xf5\x62\xc6\x7b\x22\xd0\xa4\xdd\x9f\xcb\x46\xa5\xf8\x0d\x29\x9d\xb5\xf0\x1f\x59\x16\x0a\x19\xd7\x4c\x64\x4f\xa5\xa9\x40\xe3\x2c\x9d\x8d\x98\x3b\xab\x7e\xfb\x0d\x7c\x7d\xa4\xe3\xfd\xa1\xcd\x0d\x18\xa4\x55\x8e\xb9\xfe\x46\x40\x8a\xab\x50\x85\x91\x2b\xf2\xf4\x6a\xb6\x3a\x93\x54\xf9\x02\x7c\x93\x69\x12\x23\xff\xaa\xb8\x46\x3b\xac\x4c\x4b\xc3\xb1\x1a\xbc\x46\xba\x68\x71\x7c\x91\x78\x0d\x3f\x30\x47\x0d\xbd\xd8\x8b\x37\x80\xa1\x94\xc8\xa4\x0a\x2c\x0a\x81\xa4\xd5\x6d\xec\x2d\x89\x62\xc3\x4d\x2a\xb7\x33\x69\x02\x8e\x1b\xfe\xaa\x6b\xb5\x82\x41\xff\x4f\x89\x8f\x80\xad\x3b\xb1\xc6\x91\xb8\x64\x7f\x2c\x69\x83\x95\x4c\x1c\x77\x95\x74\x58\xee\xbf\x1c\x50\x55\xc3\x16\x93\xab\xce\xd0\x53\x84\x73\x5a\x4f\x74\x19\x68\xbd\x6a\xc3\x15\x65\xcf\xee\x71\xc8\x84\xc1\xe2\x9e\x9e\x7a\xe0\xf7\xec\xd0\x4d\x46\x3b\x1d\xc3\x89\xc3\x60\x37\xe8\x14\x58\xdc\xec\x61\xd0\x76\x40\x32\xdd\x58\x9b\x92\xaf\xda\x2f\xc9\x02\x8f\x41\xab\x53\xcc\xa2\xd0\x4e\xc6\xa9\x56\x59\x55\xcb\xcf\x1a\x34\x63\x98\x9c\x71\x39\xbb\x90\x2a\x59\x21\xe8\xb2\xc9\x9c\x48\xe1\x37\x11\xf0\xbc\xc3\x99\x25\x95\x16\xc8\x1a\xe9\x42\xa6\x79\xd4\xba\x33\x97\x9e\xb1\x2f\xcd\x28\x60\x60\x2e\x47\x24\xb1\x33\x0f\x1c\xd2\x57\xb5\xb2\x89\x1d\xae\xe8\xef\x4c\x92\xfc\x3b\xfd\xb3\x4e\x53\x2d\x58\x70\xf3\x80\x59\x86\xac\x97\xb5\x03\xfd\x85\x87\x35\x48\xe3\x09\x50\x00\x0f\x8a\x70\xbe\x51\xfa\x75\x76\x03\x50\x1f\x2d\x30\xe8\x52\xef\xea\xc4\x82\x68\x62\xae\xd7\xf6\xd2\x0c\x9a\x8c\x8d\xbe\x36\x2d\xfe\xe4\x18\x93\xf2\x7e\x6f\xd5\xe9\x1d\x0e\x7e\x3d\x4f\xd8\x15\x5f\x44\xfd\x8e\xf1\x7a\xf1\x4a\x84\x8d\x44\xa8\x76\x31\xae\xee\x75\x14\x62\xb2\xa5\x40\x87\x06\x8d\xae\xab\x3e\xa3\x28\x9e\xce\x62\x12\xb3\xb5\x2c\xe7\xa8\x88\x6d\xf2\xa7\x27\xb7\x2a\x57\x0c\x2f\xb9\xc5\x03\x41"}, -{{0xdb,0x9a,0xae,0xe1,0x98,0xcd,0x26,0xa5,0x2b,0x11,0x81,0xfa,0x3f,0xd9,0x2a,0xbe,0x42,0x5e,0x66,0x6d,0x89,0x0b,0xf9,0x69,0x46,0x7d,0xd2,0xce,0x28,0x0e,0xd4,0xa7,},{0x3c,0x89,0x7c,0xaf,0xe2,0xb4,0x99,0xec,0xb2,0xe1,0xdd,0x01,0xea,0x55,0xf3,0xfc,0x88,0xf6,0x8c,0x25,0xb6,0x4a,0x63,0x6b,0x31,0xa1,0xfd,0x1c,0x78,0xf3,0x7f,0x3f,},{0xb2,0xe3,0xd9,0xc5,0xd0,0xff,0x32,0x99,0x96,0xbc,0x89,0xd2,0x6f,0xb3,0xac,0x12,0x6b,0xde,0xd3,0x13,0xcb,0xf8,0xdf,0x86,0x71,0x86,0x38,0xc1,0x99,0xe0,0x57,0x27,0x3d,0x09,0xeb,0x16,0x3c,0x6c,0x18,0x1f,0xd8,0xbc,0xe5,0x1f,0x72,0xd4,0xd9,0xd2,0xe8,0x4a,0xbb,0xe0,0x83,0x30,0x77,0x3b,0x9f,0xcc,0x21,0x66,0xf1,0x40,0xd6,0x0e,},"\x47\xfb\x62\x15\x61\xf8\xb7\xee\xce\xc6\x03\x3f\x2b\xcb\x6f\x43\xac\x68\xc9\x58\xdf\xd2\x65\x6f\x52\xa0\xc2\x9b\x4a\xcd\x44\xf4\x30\x4c\x6b\xf7\x7e\xea\xa0\xc5\xf6\xd3\xb2\x2d\xb1\x96\x99\xc3\xdc\xde\xde\x69\x8a\xbd\xe6\x23\xec\x4b\x2b\x90\x91\x0c\x80\xac\x3a\xf3\x9c\x55\x0b\x6d\xd4\x09\xe6\x3d\x77\x70\x66\x55\xa9\x19\x9c\xb5\xc0\x25\x8f\x5b\xa3\x82\x85\xff\xdc\x64\xb8\xa8\xf3\x73\xd1\xfb\x29\xba\x87\xf8\x4d\xdf\x5f\x34\xd8\xf1\x40\xbb\xc1\x7b\x39\x61\x68\x2d\xf5\xd0\xa8\xf9\x10\x2e\x37\x9a\x99\x98\x13\x9d\xfe\x40\xab\x8c\xe7\x53\xbf\x56\x26\x10\x82\x37\x77\x1a\x7d\x8e\x10\x9e\x9e\x0a\xfe\x9b\x66\xd0\x42\x09\x42\xe1\x63\xa4\xf3\xc0\x3f\x71\x81\x3e\xe0\x78\xbd\x09\x0a\xc3\xd0\x77\x2e\x26\x22\xc2\x59\xe6\x82\x55\x2c\x75\xb0\x8d\xd0\x55\xa4\xa5\xeb\x5e\x60\x94\x40\xbc\xd3\xf3\xa6\xfe\xb8\x76\xfd\x16\x92\x15\x20\xc6\xcb\x68\x84\x71\x0d\x2e\x15\xcd\xad\x6d\xaa\xee\xd9\x59\x62\xdd\xa2\x1c\x67\x88\xf7\x84\x91\x79\x17\x98\x2e\x1c\xcb\xb5\xfd\xd9\xbd\xc1\x76\x9d\xb6\xb6\xdb\x57\xca\x35\x4e\x01\xa1\x33\x9d\x8e\x77\xe9\xdb\xbb\x58\x12\xfb\xab\x6a\x14\xc5\x40\x85\xc0\x65\x95\x99\xf1\x50\xe2\x24\x72\x47\x0f\x1e\x5e\x67\x2c\x42\x5f\x37\x5f\x9e\x0d\x6e\x8d\x52\xfa\x17\xb7\xa8\xd7\xa4\xd7\xca\x3e\x12\xf4\xdb\x53\x83\x6a\xed\x2b\xeb\xd7\x45\x89\xba\xca\x8c\xe9\x10\x02\x91\xbf\xb7\xe4\x56\xdb\x7f\x2f\x0a\x84\xdc\x0a\x74\x88\x85\x13\x66\xa9\xa5\xfe\xa0\xe3\xef\xc7\x4b\x9c\xdd\x4b\xd9\x7b\x65\xab\xf3\x61\x39\x3c\xe1\x70\x3d\x85\x71\x80\x5e\xe6\x8a\x13\xd3\x65\x4f\x03\xdc\xec\xfb\x77\xa5\x34\x30\xd0\x94\x96\xad\x73\xec\x01\x75\x99\x57\xe5\x10\x46\xaa\x73\x96\xf5\x92\x33\x86\x50\x11\x7a\xc7\xb4\xdd\x35\x73\xeb\x53\xd9\xc9\xf9\xdf\xa6\x2e\x23\x69\xc7\x7a\xf9\xc0\xd4\x2f\x61\xba\xe7\x4b\x28\x7d\xdf\xa2\x7b\x7f\x1c\x1b\xe9\x88\x3a\x04\x46\x91\xd5\x6d\xc1\x37\x34\xad\x4e\xe3\xa3\x2a\x9f\x40\xe3\x28\xc5\x00\xd0\xfe\xd8\xea\x05\x10\xe9\x38\xf2\x75\x80\x04\x02\x2b\xca\xa6\x90\x2b\xda\x10\x14\xb8\xae\x33\x65\x27\x28\x29\xed\x94\xfa\xba\x63\xcb\x14\xa3\x6c\xf8\x13\x90\xec\xa8\x3f\xc1\xc6\x27\x17\x20\x13\x26\x1b\x39\x93\x77\x9a\xa0\x76\xa5\xc5\xd8\x1d\x90\xd2\x70\x62\xe1\xa6\xd9\x0b\x5c\xf1\x00\x5c\x70\x19\x17\xb7\xad\xac\x18\x0c\xb7\x5b\xbc\xe0\xf2\x7f\x2f\x18\x0e\x2c\xb9\x01\x40\xc1\x4c\xc6\x00\x9d\x2d\x41\xaa\xb1\xdb\x94\x18\xf9\x1d\x4c\xf3\x94\x00\x2c\xd7\x0a\xc9\xdc\x11\xce\x86\x53\x47\xfa\x3f\x56\xf8\x7c\x14\x9e\x2b\x17\xd2\xc7\x2b\x66\x3a\x58\xe3\x18\x7b\xb1\x9b\x9b\xac\x2d\x11\x48\x3b\xa1\x2f\x77\x0a\xc0\x4d\xc4\x6d\x38\x85\x18\xfa\x54\xdc\x15\x2e\x9a\x9d\xfb\xff\x14\xf1\x4c\x61\xcb\x37\x58\x97\xe3\x0c\x53\xe6\xde\x42\xd5\xe1\x40\x1d\xae\x1b\x22\xba\xaa\x0e\x8a\x41\xc6\xaf\x9d\x0e\x0b\x13\xa9\x1a\x23\xd9\xb7\xd5\x55\x20\x47\x02\x9a\x35\x21\x94\x6c\x71\x20\xd3\xd2\x58\xb3\xae\xfc\xf7\x54\xd1\x95\x94\x87\xa1\xfe\x77\x43\xac\x7e\x1c\xc8\x9e\x36\x8b\x19\x78\x09\xc3\xa2\x73\x17\xe0\xec\x48\xd5\x46\xdb\x1e\x21\xeb\x62\x9a\x29\xbc\x62\x47\xcd\xd4\xa1\x37\x14\x37\x56\x3e\xdd\x12\xfa\xea\x2c\x5c\xb7\x7e\xed\xed\xbf\xc5\x80\x08\xfa\xd1\xf6\x5a\xf3\x58\x43\xfa\x27\x4c\x73\x4e\x3f\xbb\xaa\x9c\xc5\x0d\x68\x37\x48\xb7\x5a\x48\x5f\x94\xd6\x30\xb0\x32\xa5\xf1\x06\x7d\x1d\xeb\x30\xe9\xd2\x21\x8c\x93\x5c\x98\x1d\x01\xc0\xc5\x47\xfd\x68\x41\x31\x36\xed\xf4\xc0\xc7\x70\x28\x6e\x82\x34\x42\xe1\xc5\x13\x65\x19\x29\x21\x3c\x12\x1c\x1d\xe7\x00\x98\x91\x41\xab\x4a\xf3\xb3\xfe\x74\x04\xb4\xd2\xa3\x8c\x53\x0b\xaf\xb4\x98\xe6\x49\x53\xce\x1c\x0f\xb7\xd3\x40\xe2\x11\x35\xbf\x8a\xfd\xd8\xdd\x65\xb1\xb1\x8c\xf1\xc8\xfb\x9f\x40\x2b\x26\x70\x40\x0b\x86\xdd\xaf\xb1\x84\xcc\x51\xd5\xfd\xa2\x73\xb8\x0c\x26\x52\x1f\x91\x2f\x35\x83\xb4\xae\x30\x1d\xae\x15\x1c\xb5\x5c\x75\x70\x3a\xad\xef\x03\x24\x15\x22\x7d\x53\xe3\x95\xdb\x6c\x15\x0a\x1e\xe8\x39\xad\x26\xba\xe5\x52\xe1\xab\x73\x62\x14\xdc\x04\xb0\xf3\xc4\x1b\x7c\xfb\xd0\x49\x68\x1b\xc8\x4c\x3d\x16\x53\x07\x68"}, -{{0xa8,0x04,0xc3,0x3b,0x4d,0x38,0xcb,0x3c,0xe3,0x1c,0xf3,0xba,0xc1,0x04,0x9e,0x0d,0x4e,0xc6,0x3a,0x1a,0x0b,0x7b,0x59,0xfd,0x8a,0x36,0xee,0x37,0x54,0x16,0x56,0xaa,},{0x60,0x72,0x25,0x6d,0x65,0x74,0xa2,0x93,0xbd,0x7c,0x22,0x1c,0x55,0x1c,0x32,0xcf,0x2f,0x77,0x15,0xe1,0x9e,0x43,0x3a,0x49,0xd9,0xb8,0xb0,0x49,0x0e,0x56,0xef,0x62,},{0xb1,0xb4,0x4a,0x14,0x2a,0x7c,0x4c,0x3d,0x0b,0xf4,0x66,0x1e,0xda,0xc5,0xb7,0x67,0x00,0x57,0x26,0xc1,0x4a,0x27,0x69,0xb7,0xc2,0x14,0xfb,0x58,0x73,0x7e,0xc2,0xe4,0xbc,0x51,0xc3,0xa1,0x95,0xd2,0xba,0x1b,0x74,0xa5,0x4e,0xff,0x4c,0x33,0xa9,0x0f,0x41,0xcc,0xde,0xfa,0x9e,0x93,0x65,0xfd,0xe8,0xdd,0x85,0x9f,0xd3,0x97,0x8c,0x0a,},"\xdb\xfe\x30\x7f\x2a\xae\x9e\x07\xec\x7c\x4b\x68\x21\x06\xd2\xc9\x36\x7b\x0c\x4a\xaa\x58\xae\x80\x4e\x0a\x39\x04\x75\x4e\x6c\xf8\xfe\xe7\x3c\xf9\xe2\xd4\x5d\x02\x89\xe5\x07\x82\x93\xdf\xc4\x69\xd4\x6e\xa6\x70\x26\xc5\xaa\x69\x2d\x2f\x2c\x9f\xb4\xec\x57\xcd\xab\x4c\x04\x3f\xf9\xae\x61\x85\xf2\x7a\x70\x44\x54\xe5\xf5\x39\x50\xaa\xbd\x25\xc9\x91\x04\x74\xd4\x5a\xf8\x83\x68\x62\x72\x3e\x0e\x6a\x27\x82\x3d\x82\xbc\xbb\x68\xa9\x60\x52\x42\x2a\x18\x19\x51\x2e\x3b\x43\x40\x8c\xf4\x89\x57\xad\x6a\xe2\x35\xb7\x23\x3d\xf1\x82\x84\x74\x91\x53\xdf\xa5\x7d\xe3\x50\x74\xa3\x0e\xdf\xab\x8a\x56\xdf\x28\xab\x2e\x29\x40\x30\x6c\x22\x1a\xa5\x54\x90\xcc\x66\x4e\x14\x68\x3f\x30\xee\x61\x5e\x2d\x93\xfd\xf9\x71\xf5\x96\x66\x34\x65\x84\x3b\x3a\xdd\x63\x92\xba\x33\x90\x31\x1e\xf8\xdc\x59\xf2\x51\x44\x5d\x66\x9e\x10\xa0\x06\x19\x91\xe1\x13\x56\x19\x23\xaa\x21\x52\x44\x46\x3d\x82\x64\x19\x9a\xc5\x88\x92\x4e\x23\x1e\x84\x19\xd8\x68\x5f\x33\x8e\x59\x9b\x5f\x40\xbf\x9b\xd1\xae\xce\x77\x25\x35\xbb\xbc\xb8\xf6\x88\x1c\x2e\x80\x04\x91\xab\x3b\x57\xb4\x4b\x8a\xe4\x3a\xeb\x5c\x4a\xe5\xe7\xed\xeb\x22\x8f\xed\xc9\xf6\xb9\xca\xde\xa1\x76\xe1\x34\x93\x6d\xed\x60\xaf\x1c\x22\x87\x34\xfb\x00\x57\x0f\x23\x74\xbb\xbf\xa1\xbb\x17\x07\x85\x80\x5d\x6b\x6c\x70\x1e\x82\x09\x52\xea\xe4\x5b\x8c\x23\x66\x11\x3a\x1d\xfb\x2e\x35\x85\x2a\xf4\x19\xb7\x54\xf9\xcf\x7a\x08\x1c\x3d\xde\x6c\x80\x53\xbf\x1c\xe0\xc8\x53\x39\xd5\x69\x9c\x42\x24\x76\xfc\x21\xf2\x6c\xe7\x5d\x2a\x7f\xed\x09\xfc\x0f\x41\x75\x78\x98\x47\xd8\x76\xc5\x1a\xa4\xe0\xbf\x7c\xe8\x42\xb8\x30\x8d\xc7\xa2\x8c\x82\x39\x52\x07\x14\xdc\x23\x31\x36\xe0\x9f\x55\x7c\x7e\xf3\xe0\xf8\x3b\xad\x63\xcb\x28\xac\x61\x6d\x39\x28\xf3\x83\x7d\xce\x1d\xd5\x8a\xcb\x8d\xdb\xc7\x2e\x82\x2d\xee\xe4\x5f\x00\x77\x6a\xcc\x88\xe0\x0c\xd3\xa9\xdb\x48\x6d\x92\xd5\x35\xa5\x7a\x0f\xdc\x4f\x90\x3b\x62\xe5\x17\x22\x1c\x30\x8c\xba\x2e\x30\xff\xe7\xb9\x19\x37\xa9\x94\x17\x72\x1f\x56\xfe\x6d\xf4\x48\x40\xe9\xe4\x11\x36\x92\x9c\x0c\xa3\xdc\x28\xdd\xf2\x37\x9e\x4d\xcf\xde\x83\x72\x3e\x2d\x4c\x9e\x23\x29\x9c\x05\x6a\xfb\x31\xd3\xe7\x0d\x08\x5d\x0a\x31\x2c\x5c\xd5\x70\xb6\x99\xde\xa8\x71\x74\x58\x53\x13\x48\xc9\x6f\x6e\xb5\x2d\x7e\xe6\x1d\x56\x60\xf6\x5e\x90\x9a\x14\xce\x10\x33\xdc\x85\x3f\x2f\x25\xd0\x9c\xf4\xe4\x0d\x07\xef\xf7\x2e\x15\xa3\x90\x56\x4a\x2b\xe3\xc0\x42\xd8\x9a\x68\x66\x0a\x97\xff\xac\xec\x49\x67\xa4\xb6\x18\x71\x2d\x70\x60\x75\x65\x20\xc2\x9e\xe8\xd9\x22\x0a\xd8\x61\x5c\x4f\xcf\x39\x69\xbd\x3b\x2e\x09\x47\xe1\xf0\xbe\x7e\x2d\x80\xe0\xa6\x14\x80\xc3\x16\x6d\xb5\x58\x22\x18\xbb\x0a\x8b\xe9\x84\x8e\xfd\x41\xb6\xce\x0c\xd7\x95\xc4\x86\xab\xb6\x72\x10\xbe\xb6\x0c\xd0\x78\xb4\x6a\xeb\x7f\x4f\x48\x50\x31\x90\x2b\xcd\x71\x31\xe0\x0b\x70\x35\xaa\x2d\x43\xfe\xe0\x63\xf7\xf3\x0b\xd5\x70\xda\x1d\xbb\x65\xc0\xca\x92\xa4\x81\x26\x32\xe4\x32\x77\x85\x53\xe3\x5e\x85\x6c\xaa\x82\x18\x22\x1f\xd6\x31\x6a\xb0\x86\x91\x73\xb3\x84\x09\xbc\xef\xe6\xd2\xdb\x92\x10\xf9\x02\x41\x73\xb6\x6d\xbb\x92\x67\x7c\xbc\x71\xc8\xa1\xcd\x58\x3f\xa6\xf3\x54\xd3\xc9\x3f\xa8\xb1\x6c\x71\x37\x4f\x25\xa0\x0c\x33\x2f\x85\xa8\xbe\xfd\x54\x03\x88\xfb\x50\xdb\x9f\x5d\x96\xe4\xe4\xe6\x98\x83\x3c\xe3\xd6\x3c\x10\xb8\xee\xc7\x0a\x24\x3b\x90\x15\xdb\x45\x94\x31\xb6\x2f\x56\x68\xbb\xa6\x0f\x07\x04\xf6\xbd\xfe\x95\x46\xea\x47\x5c\xef\x2e\xbc\xcb\xa4\xb7\x68\x08\x48\xe8\x2b\xef\xf5\x85\x4e\x49\xf6\x5b\xb7\x73\xa4\x92\x2e\x90\xf9\xb8\xaf\xc7\xcf\x81\x87\x30\x58\x8e\xd5\xaa\x7b\x39\x98\x26\xaa\xdd\x54\x37\x2f\xcb\x76\x14\x58\xb6\x4d\xe6\x68\x57\xf4\xad\xac\xd4\xc3\x29\x00\xcb\x77\x13\x6a\x53\x5d\x7b\xbb\xb5\x54\x59\x7a\xec\xf3\x9f\xf6\x98\xb4\x5e\x6a\x21\x8d\xf1\xd2\xab\xe6\x15\xeb\x8d\x9e\x18\x24\xc0\xbe\xcc\xe9\x07\x67\x89\x9e\xbf\xd2\xc7\x30\x14\x4b\x32\xc7\x46\x04\xc0\xe5\x3e\x25\x05\xbb\x15\xd2\x80\x07\xa8\x7b\x99\x31\xd6\xee\xc0\xa6\xcb\x5b\x0f\x96\xd3\x19\x4b\x24\x23"}, -{{0xf8,0x20,0xe6,0xf2,0x4a,0x84,0x18,0xb6,0xac,0xda,0x16,0x5f,0x29,0xa3,0x60,0xf7,0x67,0xcd,0xed,0xde,0x8f,0x64,0xd7,0x68,0xb9,0x5f,0xc2,0xa5,0xf3,0xf4,0x04,0xe7,},{0x79,0xc4,0xb2,0x63,0xb2,0xe5,0x8f,0x67,0x86,0x28,0xd4,0xea,0x82,0xb1,0x75,0xac,0xa2,0x30,0xb9,0xa2,0x02,0x85,0xc8,0x28,0xf9,0x4e,0x1f,0xfd,0x63,0xd7,0x5b,0x23,},{0xf9,0xfd,0x72,0xf3,0x21,0xca,0x21,0x33,0xbf,0x85,0x85,0x90,0x8d,0x9c,0xa7,0xb8,0xe3,0x36,0x22,0x7e,0x3f,0xfb,0x37,0x49,0xa1,0xfb,0xe8,0xc9,0xb1,0xe5,0xd5,0x0e,0xf0,0x1f,0x9d,0xb5,0xf0,0xd2,0xa7,0xc7,0xc1,0x39,0x9b,0x97,0xc9,0x04,0x4e,0x1b,0xc1,0xad,0xc3,0x2b,0x8b,0xea,0x46,0xda,0xd7,0xb8,0x10,0x26,0x46,0x96,0x03,0x03,},"\xab\x6b\xd4\x5b\xb0\x6d\xfb\x90\x69\x11\x8f\xf9\x98\xf3\xbd\x39\x3e\xa8\xe9\x44\x97\x9e\x89\xe0\x49\xf2\x50\x5c\xd8\x93\x1b\x93\x08\x6b\x7e\x9d\x8e\xe7\x64\xe9\xb4\x47\xea\x4e\xa1\x21\x38\xbb\x45\x27\x5a\x21\xa1\x98\x43\xf7\x5d\xc5\x42\x1d\x61\xff\xd8\x61\x83\x8e\x58\x33\x82\x5d\x67\x16\x2f\x32\x59\xc2\x64\x47\xbe\x51\xdc\x18\x02\xef\x5a\x04\xba\x73\xb7\x83\x93\x57\x06\xab\xb4\x2c\x51\x3b\x65\xf2\xbb\xc4\x4f\x83\xda\x10\x61\x24\x2f\x2d\x5e\x51\x98\xf3\x8c\x10\x71\x7a\x86\xa3\xa1\x97\xe7\xcd\x90\x34\xf6\x36\x11\x44\x99\x03\x72\x77\xac\xb4\x72\x2c\x06\xa9\x1c\xb2\xf6\x5e\x21\xeb\x8d\x22\xd3\x6a\xd7\x3b\x42\x65\xf7\xa7\x94\x7e\x00\xe7\x22\xbd\xa6\x70\x43\xcd\x12\x81\xbc\xd8\x7e\x76\x3f\xc9\x7b\x54\xc8\xf8\x68\x36\xcd\xbf\x08\xc9\xa1\xf7\x00\xf4\xea\xed\x9e\xa5\x9a\x6f\xc1\xbc\x0d\xf8\xc9\xec\x1f\xc2\x97\x7c\xad\x60\xf9\x78\xab\xc0\xc8\x38\x1a\xa9\xfb\x06\x0e\x3f\x99\x37\x8a\x51\xb2\xd9\xaf\xbe\xf3\x58\xd5\x51\x62\xa3\x89\x22\xeb\xb8\x7d\x2a\x3e\x0f\x0f\x40\x00\xb1\xc3\x9b\x15\x02\xe9\x59\x45\xe8\xac\x9f\x4a\x3e\xa7\xc9\xdd\xb5\x81\xa5\xec\x06\xc0\x0b\xa8\x7a\x73\x70\x84\xb3\x84\xfa\xba\x09\xc8\x48\x71\xdd\xd6\x7d\xc1\xbe\xbb\x2f\x7f\xbd\x94\xa5\x59\x7d\x01\x9f\xe6\x29\xe5\xbf\x12\xbe\xa2\xe3\x3c\xa8\x4c\x68\x0d\xc5\xa3\x98\x9b\xbf\x3a\xf9\xee\xec\xe8\xab\x8f\xc8\x61\xe3\xb8\xbf\xc1\xe6\x7e\x2a\xee\x32\x6b\x37\xfb\x9b\x51\xcf\xa0\xb5\xf5\xfc\x16\x00\x69\xb4\x50\xb7\x04\xe0\xfa\xb7\xfb\x6c\x5a\xb3\xc4\x0b\x8f\x0b\x3d\x09\x30\xb9\x11\x2d\x64\xb9\xda\xca\xb4\xdd\x87\x5f\x29\xd8\xc5\x8c\x5d\x20\x53\xad\x91\x48\xff\xde\x22\xd9\x0b\xc0\xd5\x0f\x5d\xec\xa6\x8d\x3e\xa2\x5c\x5b\x4c\x76\x88\x87\x1c\x0c\x77\xdb\xce\xea\xcb\xd0\xa4\x22\x9f\x49\x70\xec\x87\xb3\x44\x99\xe2\x78\x30\x3c\x06\x69\x4c\x30\xac\x68\x52\x4d\x11\xb1\x72\x79\x4b\x48\x12\x73\xa5\xda\xc4\x61\x22\xd2\x47\x20\x95\xa5\x63\xa4\x35\xd1\x85\xd5\xe9\x1d\xa7\x26\xe7\x45\x92\x99\x9c\xda\xc6\x88\xa3\x3f\x38\xf7\xc0\x35\x58\x8f\x62\x5d\xc6\xac\x73\xd0\x04\x7a\xb3\xd6\xd1\x2f\x1a\xe3\x3d\x8b\x62\xd6\xd6\xc6\xca\xcf\xf0\xbd\xd8\x94\xb5\x7e\x31\x89\x12\xac\x0c\xf4\xa5\x34\x76\x2b\x2f\x6d\x26\x3c\x93\x58\x04\x42\x3e\xd8\x68\xcf\x8c\xfb\xb8\xbe\x8f\x6d\x8a\x71\x4a\x26\x8a\x39\x0e\xdc\x2d\xd5\x09\xd2\xdc\x96\x85\x1d\x1b\xd4\x32\x49\xbd\x0f\x69\xb0\xc4\xcb\x2f\xf4\x08\x0d\x1f\xd5\x62\x2b\xc2\x38\xdd\xa6\xe9\x30\x02\x5d\x8a\x2b\x12\xb9\x72\xf9\xeb\xa1\x74\x21\xd4\xce\xa6\x42\xf4\x0a\xd9\xea\x85\x47\xae\x59\x49\x8c\x3a\xd1\xb9\xa0\xc3\x4e\xd8\xc0\x1a\xae\x3b\xd2\x1a\xc1\x77\x43\xb5\x77\xf9\x51\x5c\xfb\xdd\xe2\x70\x4d\xc5\x7e\x80\xf1\x25\x32\x3d\x55\x10\x0b\x9f\x69\x79\x27\xd4\x31\xdf\xe7\x36\x31\xb5\x8e\x52\xaa\x6a\xeb\x04\x78\xbf\x45\x95\x52\x43\x86\x89\xfb\xeb\x9c\x60\xd8\x7a\xae\x09\x95\x43\x62\xcd\x02\xa2\xb0\xb4\x79\xef\xd3\x8f\x17\x82\x1a\xf3\x9b\x21\x92\x6e\xe0\x2f\x7d\x97\x2a\xd0\xf5\x4e\xa6\x57\x2c\xc3\xeb\xd0\x20\xb1\xee\x26\x88\x25\x33\xbd\x19\x11\x43\x23\x81\x5f\x67\x2e\xc8\xc9\x05\x68\x73\x0a\x58\xe4\xe1\xe3\x5f\x68\x21\x21\x9a\x32\xb8\xa6\xc5\x2c\xed\x6f\x95\x73\xd9\xf3\xbe\xb2\x85\x13\xba\x62\xfb\x20\x1f\x7f\xd4\x1b\xb1\x0c\xa3\x4b\xb1\xc7\x0f\x2f\xd7\xbb\x92\x99\xa7\xc5\xf7\xf2\xe0\xfa\x1d\x1a\xf0\xe9\xae\xf5\xed\xe7\xc1\x69\x50\xe8\x60\xec\xd6\x1f\x18\x42\xa1\xa2\x2c\x98\x31\xc0\xc0\xd4\xed\xa8\x40\xb0\x88\xa5\x45\x20\xc9\xb1\x8c\x76\xeb\xa9\xbe\xbc\xd5\x91\x38\x1c\x18\x0d\x7f\x86\xa0\xe5\x8a\xdd\x92\xb9\xb0\xc8\x07\x6a\x7c\xdc\xab\x60\xde\xa4\xc1\xaf\xb1\x8c\x8b\x94\xb1\xb3\x92\xcc\xfb\x4d\xae\x27\x11\xe7\xd1\x2d\x2b\xc7\xc7\x82\x5f\x63\x99\x2e\xc3\x24\x71\x63\xc2\x83\xb1\x07\x5e\x32\x24\x5f\x69\xcf\x47\x24\x0a\xef\x0d\xb4\x3e\xfa\xe8\x6f\xc1\xfd\x3b\xb9\x9c\xf5\xb7\x89\xf5\xbc\xba\x95\x04\x65\x7d\x9e\x62\x2a\x4a\xa1\x6f\x01\xd4\xd8\x44\x41\x31\x24\x44\x7d\x6d\x1a\x44\x23\xe7\xb5\x5d\xb7\xe6\xa3\x1a\x31\x9f\x4b\xac\xae\x43\x0a\x33\xa9\xbd\xd4\xef\x36\x80"}, -{{0x0a,0x05,0x6b,0xe0,0x39,0xfd,0x55,0xda,0xda,0x44,0x1d,0x03,0x73,0x61,0x27,0x3f,0x20,0x6e,0x00,0x0a,0x74,0xa0,0x5c,0x51,0xc0,0xcb,0xb6,0x27,0x43,0xf1,0xf3,0x40,},{0x73,0x14,0x02,0x17,0xa4,0x93,0xa1,0x78,0x66,0xff,0xf5,0x15,0x48,0x32,0x27,0x3d,0xf7,0x9d,0x58,0x11,0x54,0x3c,0x22,0x2a,0x39,0xd0,0x56,0xb8,0xc9,0x70,0xdb,0xfa,},{0xfa,0xb8,0xe5,0xd9,0x3d,0x7d,0x46,0xc6,0x5e,0xe1,0x17,0xc5,0x37,0x5e,0x73,0xc9,0x70,0x5f,0x87,0x54,0x17,0x7f,0xdd,0x46,0xef,0xed,0x47,0x37,0xc2,0x87,0x68,0xcc,0x4b,0x95,0xa9,0xc8,0x4c,0x52,0x9b,0x4b,0x91,0x6b,0x28,0xda,0xbd,0x87,0x41,0x18,0x31,0x44,0xbc,0xdb,0x48,0x3d,0xf9,0x8a,0xf8,0x9d,0x82,0x40,0xcf,0x09,0x46,0x04,},"\xa5\xab\x14\x76\x84\xe4\xd4\xa7\xbc\xb5\xa9\x6f\xb3\x98\x18\xe2\x3f\x56\xc2\xd8\xa7\x44\xe9\x12\x3d\x62\x08\x39\x30\xab\x1d\x0b\xb5\x32\xe6\x87\x14\xfc\xec\x7e\x6c\x41\x13\x4b\x6b\x19\xdd\xd8\x67\xfe\x63\x5c\x9e\xd6\x53\x93\xee\x39\xc5\xe8\xfa\xb4\x56\xcb\x5b\x32\x79\x78\x83\xf3\xcd\x9a\x09\x02\xb9\x79\x63\x48\xee\x66\xc6\x91\xfb\x4f\x2b\xb1\x47\x64\x41\x06\x57\xc7\x4a\xb3\x64\x56\x78\x79\xb6\xfa\x0a\x6f\x4d\xaf\xd9\x30\xd9\x23\x4c\xd7\x83\x4f\xb9\xd0\xee\xdf\xbb\x5a\x39\x4b\xf0\x84\x6e\xc6\x96\x9c\x2e\xf7\xce\x39\xe3\x85\x38\x95\xff\x5b\x4d\xa3\x1e\x54\x34\x1b\x42\x72\xe4\xa2\x60\x49\x18\x9f\xf2\x82\x41\xce\xef\xfb\x7d\x2e\x1f\xaf\x4f\x77\x9f\xa6\x5c\xac\x0f\x57\x83\xc6\x0a\xe7\x7d\xe3\x0a\xd4\x46\x5f\xdb\x39\x0d\x42\x57\x1e\xff\x4a\x63\x13\x63\x49\x93\x7d\x6c\xae\xef\xcd\xae\x22\x9e\x2f\x28\xce\xa8\xab\xf3\xff\xae\x3c\x3e\xcc\xd9\x06\x70\xa4\x21\x2a\x2b\xee\x1c\xa6\xa5\xb5\x4f\x09\x4f\xc3\x23\x10\x58\xf5\xcb\x9e\xce\xb9\x99\x3b\xe4\x70\x27\xd5\x1c\x18\xde\xca\x41\xcd\xda\xf4\xe8\xbc\x56\xa9\x9f\xd2\x70\x35\x5f\xf4\x59\x71\x95\x0e\x34\x37\xa1\x98\xcc\xc3\x25\x41\x68\xdf\xc1\x57\x40\x80\x80\x2e\xe1\x01\xa6\x17\xfb\x60\x4e\x86\x8f\x8f\xa8\xfb\x30\xda\xeb\x43\x07\x4d\xe1\x1f\x24\x83\xd9\x16\xde\x56\x43\xb7\xca\xc2\x3d\x93\x40\x50\x8a\x3f\xd6\x21\xec\xd2\x50\x04\x35\x6a\x53\x55\x4a\xd3\xad\x7d\x5d\x25\x81\x7a\xd7\xc9\xa6\x10\x00\x8c\x67\xac\x16\xba\x42\x11\xc4\x2f\x5d\xad\xf8\x6c\x2c\x3a\xed\x82\x5c\xf2\xa9\xb5\x23\xbf\xc0\x3d\xd7\xde\x40\x0c\x67\x80\x7e\x13\x9e\xa5\xdb\xce\x4e\xe1\xf7\xd3\x18\x88\x9b\x01\xa9\xf4\x48\x03\xc3\x22\xac\x3b\x61\xe2\x0e\x63\x12\xd0\xa0\x3b\xf9\x92\x7f\xa3\x3f\x04\xed\x7e\x20\x7b\x16\xf2\x65\x02\xc2\x98\x3a\x3a\x96\x1f\x22\x44\x61\xfe\x9b\x64\x92\x3b\x1d\x09\x18\x94\x76\xae\x8d\x00\x1d\x0e\xca\xae\x4d\xf6\x0d\xb3\x5f\x44\x8b\xb6\x12\xf9\x65\x5a\x5f\xb1\x44\xdf\x11\xd8\x3a\xa6\x93\x68\x86\xc3\x04\x94\x9e\x59\xaa\x46\xdf\x65\xc2\x2c\xe7\xbf\x28\x9b\x3c\x77\xc2\x5d\x89\x6b\xe6\xd5\x1d\xee\x10\x74\x82\x61\x68\x8c\x8b\x07\x1c\x85\x6f\x99\x62\xc6\x67\x75\xdd\xf1\x60\x83\xda\xe0\x65\x87\xe3\x2a\x63\x61\x19\x9d\x72\x09\x7e\x38\x3a\xd7\x43\x94\x91\xb5\xa5\x63\xa3\xe6\xd5\x8d\xa3\xd5\xab\xb1\xde\x84\x89\x0a\x36\xb4\x21\xce\x03\xd4\x84\xdf\xd6\x00\x39\x63\x8d\x46\xed\xfb\x60\x65\x9e\x3a\x25\xac\x6e\x9a\x93\x5a\xd6\xda\xd5\x0f\x92\x7b\xcc\x2f\xf9\x9f\x99\x24\xa5\xb7\x99\x5d\xc2\x3c\x8f\x30\x1c\xcc\x77\x69\xf7\x1c\x18\x26\x09\x04\xa3\xdc\xfb\x81\x7d\x2d\x80\x5c\xb1\xf1\x96\xbe\x8b\x6e\xcf\x35\x2b\xc2\x96\xbc\x3f\x76\xea\x91\x35\x3f\x8c\xf3\x5b\xcd\x2b\x57\xeb\x59\x42\x77\x3d\x68\x34\xac\x50\xee\xad\xc7\xe6\x64\x61\xd1\xda\x09\x8c\xce\xc7\x5f\xf7\x20\x52\x15\xf5\x24\x59\xd9\x76\x20\xf9\xf0\x28\x9e\x93\x91\x1d\xb3\x9b\x21\xdf\x81\x8f\xdf\x0b\xed\x45\x50\x92\x44\x63\x3d\xf0\x1c\xdd\xdb\x4b\x75\x97\x2f\xa7\xea\x6f\x73\x28\x1c\xbd\xbb\xd1\xbc\xb0\x0c\x3b\xc1\xb1\x72\x8e\xea\xe0\xbb\xa1\x72\xb1\x31\xf5\xd3\x08\x90\xa3\x41\xe6\xb7\x2f\x7e\x89\xdd\x4b\x6d\xb3\xe7\x9b\x69\x27\x58\x6c\xf2\xc8\xac\x38\xdd\x14\xf3\x74\xd7\xf5\xbb\xa9\xf4\x35\x3d\xef\x10\xdd\xc9\x4d\x3d\x11\x18\xc5\x69\x9e\x38\xb6\xb5\x04\x91\x8e\x58\x9e\xfe\x3f\x7e\x97\x3f\xb4\x0e\x2e\xbd\x05\x7d\xe1\x38\x5e\x39\xd6\x99\xa8\xf6\x83\xb9\x62\xfa\xe4\xf3\x90\x28\x81\xf1\xaf\xbe\xd7\xc7\x83\x82\x35\x58\xc3\x6d\x68\xc6\x87\x5d\x16\x6f\xa2\x43\xeb\x2a\xe1\x4f\x7e\x63\x15\xa6\xd2\xab\x4e\x79\xea\x8e\x16\xe6\x9d\x30\xed\xc7\x08\xf1\xe7\xaf\x7a\xda\xfe\xdc\xd3\x16\x88\x98\xb3\x31\x87\x81\x78\xc4\xba\x88\x33\xd2\x0b\x3c\xac\x9d\x32\xb8\x88\x8c\xc6\x78\x32\x06\x39\x74\x70\xa2\xe7\xcc\x4c\x98\x09\xff\x79\xce\xac\x9d\xc2\x4c\xa1\x43\x8c\x91\x9c\x8a\x41\x5e\x82\xf0\x90\x2b\x4d\x9c\xf4\xcc\xd5\x76\x96\x8d\x5b\xee\x81\xc5\xf1\x9c\x7d\x57\xb9\xba\xda\x8e\xab\x47\x56\xea\x27\x0d\xd2\x61\x29\xe6\x12\x2e\xe2\xd6\x15\x24\x2b\xc7\xfa\xbf\xf4\xf8\x31\x2e\x68\x6c\x8f"}, -{{0x22,0x05,0x24,0x86,0x0c,0xb8,0x9a,0xb2,0x95,0xbd,0x88,0x4f,0x98,0x8a,0x57,0x91,0x18,0x68,0x69,0x3d,0x6b,0x10,0x5a,0x80,0xb2,0x30,0xf2,0x1e,0x57,0x80,0x5a,0x7d,},{0x4a,0xb3,0x2b,0xc1,0x56,0x6a,0x76,0x77,0xe7,0x99,0x73,0x4d,0xc8,0x41,0x81,0xfb,0xb6,0x54,0xb8,0x13,0x37,0x91,0x80,0xf1,0xdd,0x35,0xae,0xf2,0xd3,0x24,0xc1,0x2c,},{0xdb,0x1c,0xc0,0xc5,0xdb,0x77,0x3e,0xc5,0x16,0x89,0xbe,0x28,0x84,0x2f,0xa6,0x79,0x1a,0x7d,0x75,0xe2,0x9c,0x22,0x8a,0xe9,0x59,0x3a,0x58,0x0e,0x08,0x75,0xb1,0x67,0x0f,0x09,0xb0,0x34,0x42,0x92,0x9a,0x18,0xf1,0xe9,0x41,0x4e,0xa3,0x43,0x15,0xff,0x09,0xd9,0x1d,0x92,0x2e,0xe4,0x7f,0x10,0xf7,0x1d,0xa4,0xab,0x13,0xb7,0xd9,0x01,},"\x02\x4a\x54\xac\x5e\x01\x63\xb3\xa4\xfd\xd0\x2f\x59\x36\x88\x8a\xe2\xf9\xb7\x4a\x64\x14\xb5\x3c\x63\x81\x17\x3b\x09\x5a\x4d\xda\xcf\xc3\xa6\x9f\x19\x16\x7d\x0f\x1a\xe0\xc1\x20\xbb\xa7\xe9\xfc\xb7\xcc\xfc\x79\x6d\x89\xea\x46\xef\x80\x58\x86\x6e\xf6\xda\x7d\x01\xa6\xa1\x42\xea\x69\xd7\x20\xc4\xf8\x05\xac\x54\x05\xa8\x01\x2c\x3c\x2a\x82\x63\xb5\x37\x2d\x59\xbf\x7f\x40\x99\x29\x90\x13\xd2\x62\x59\xdf\xd5\x19\x3e\xce\x56\x17\x97\x77\xbe\x51\xb8\x6b\xd1\xce\x5f\x1f\xc9\x15\x6f\x2b\x3a\x32\xc0\x9d\x86\xbc\x61\x32\xde\x57\x61\x02\xe2\xf0\x3c\x71\x6d\xb5\x36\x6c\xcb\xe7\x42\xae\xe3\x55\x2a\xc3\xb3\x9d\x0e\xc7\xd4\xe4\xe9\x62\x6b\xf8\xec\xe0\x31\xd6\x78\xd3\x48\x09\x05\xc0\xe3\x38\xfb\x7c\xc0\x26\xe3\xe7\x9c\xf2\xc2\x78\x1a\xc2\xa5\xa4\x0d\xf4\x28\x4e\x23\x5a\x03\x89\xe9\x28\xfc\x63\x55\x7d\xc6\xf1\x99\xfc\xec\x5f\x36\x1e\xa2\x47\x59\xfa\x7c\x5f\x71\x97\x8c\x0b\xa2\x45\xe4\xb0\x3a\xe4\x35\x94\x1c\x86\xc8\x1a\x51\x43\x0c\x2d\xc9\x92\x7e\x3b\x0f\x4e\xc4\xeb\xa7\xc2\x74\x5b\x49\x39\x87\x15\x4d\x7d\xa8\x5b\x67\xde\x21\xc5\x98\x40\x7f\xb2\xa7\x60\x80\x4a\xd0\x5b\xfd\xfa\x45\xa6\x13\x22\x4b\x22\xa0\x85\x88\xcc\xea\x3c\xbd\xf4\x7a\x19\x8b\xeb\xf8\xcf\xed\x86\x49\xd6\xd5\xf3\xfa\x50\x13\x76\xbd\xfb\xa4\x00\x3d\xac\x22\x37\xdc\xac\xe5\x31\x5b\x7f\xef\xb8\x79\xa8\x9a\x85\xbc\xe6\xda\x52\x6f\xc3\x60\xcb\xb4\xfd\x55\x4e\xf0\x13\xf3\x3b\x73\x84\xcd\x2b\x22\xa8\x85\x77\xf3\xa2\xd3\x66\x42\x2a\xae\x46\x41\x7b\xa9\x16\xe1\x64\x6e\x24\x40\x4a\x88\xb5\xd5\x3f\xf1\xae\xd2\xa4\x7b\xaf\x81\xfc\xb4\x28\x63\x97\x99\x13\x94\xb2\xec\xc3\x96\x67\xac\x46\xc2\xbd\xb6\xd0\x23\xb3\x3d\xb0\x13\x45\x7c\x40\x05\xd8\x39\x01\x5d\x88\x51\xf0\x28\xac\x33\x4f\xb2\x4b\xba\xd2\x90\x2a\x4d\x63\xae\x68\xe0\xec\xa7\xea\xea\x1e\x85\x65\x29\x64\x7b\xaf\x14\x12\x21\x37\x54\xed\x50\xaf\x3f\x43\x6e\x9b\xaf\xc1\x60\x16\x39\xb3\x9d\x3e\x52\xa9\x3a\x89\x8f\xb6\x01\x9f\xd5\xed\x6e\x7d\xfc\x05\x0e\x7c\xe5\xf3\xd3\x5c\xeb\x50\x67\x02\x1c\x0f\xbd\xc7\x08\xd3\xf2\x6b\xd6\x05\x68\xd1\xed\x2b\x61\x2b\x69\x62\x35\xd5\x33\x33\x18\xf9\xa6\xc9\x87\x23\x5a\x7a\x07\xf8\xc6\xa9\x35\x4f\xb8\xe7\x34\x76\x30\x65\xaf\xcd\x4d\x93\x77\x64\xa4\xf0\x37\xcc\x7e\x7e\x2b\x93\x21\x7f\x16\x41\x68\x4f\xa8\x1b\x7f\xf7\x98\x6a\x28\xb3\x8e\x95\xb3\x32\xe7\x46\x49\xe8\x3d\x0d\xed\x79\x5c\x57\xf2\x4c\xf2\x76\xe0\x14\x39\x01\xba\xfe\xf0\xf1\x69\x3f\xe7\xcf\x10\x90\x4f\xb0\xd8\x80\xd7\x2e\x44\x71\x6a\x70\x69\xda\xaa\xe7\x42\xcf\x0f\xf3\xed\x92\xf5\xf7\xd1\xe1\x0e\x04\x9d\x8d\xf0\x43\x63\x1e\xd0\xed\x4c\x4a\xc4\x02\x2d\x84\x03\xcb\x04\x21\xb4\x54\xcb\xfb\x6f\x48\xa3\x0e\x9e\xe1\x60\x9a\xd7\xb6\x82\x11\x97\x7a\xcb\x33\xb9\xc1\xa1\xbe\x73\x58\x14\xc5\x8f\x66\xdb\x5f\x0b\x8a\xc7\x73\xb1\xd5\x8d\x4e\x6b\xc4\x5d\xfd\x48\xa2\x94\xbb\xd2\x5e\x92\x67\x1f\x56\xf3\x02\xf2\x9b\x50\xd8\x04\x31\xc8\xf2\xea\x33\x99\x62\x57\xb2\x08\xe0\x57\xea\x76\x72\xcc\x2d\x1c\xd4\x20\x4b\x85\xb2\xab\x50\x90\x27\x13\x13\x59\xae\xb4\x2e\x3e\xcc\xdb\xae\xcf\xe2\xcd\x3e\x5a\x33\x13\x26\x6e\x76\x11\x94\xff\x69\xca\xe9\xe3\x7e\x51\xcc\x0a\x54\xf0\x86\xdd\xe1\x3c\xb3\x31\x18\xe3\x4f\xe3\x3c\x74\xd7\x35\x58\x27\x52\xd6\x8d\x21\xc7\x9e\x5c\x3a\xae\xa9\x4b\xa1\x07\xcb\x7e\xe8\xa7\x0a\x3f\x9a\x01\xe9\x80\x8c\x0a\xeb\xa6\x66\x53\x15\xb4\x56\x25\x84\x0a\x03\x3a\x6e\x2a\x87\x54\x95\x05\x79\x42\xed\x9b\xb2\xce\x6e\x4e\xe6\x0b\xed\x47\xcd\x9d\x58\x4b\xc2\x45\x24\x39\x7a\x10\x94\x98\xee\x2a\x97\x3a\xad\x6a\x29\xb7\x0a\x1c\xfb\xfe\x9a\xa5\xc7\xcb\x9f\x35\xf0\xfa\x00\x22\x7f\x43\x98\x8d\x07\x61\x9b\x6f\xb2\xf6\xd3\xbe\xe2\x8e\x10\xee\x70\x53\x47\x01\x5a\x92\x2e\x2e\x88\xd3\x4f\xb0\xce\x51\x5b\x08\xdf\x3a\x1b\x63\x4f\xf9\xec\x15\xd0\x59\x41\x82\xc8\x6e\xbb\x0d\xb7\x83\x61\x2a\x7d\x19\xe4\xb2\x2e\x82\x2d\x56\x62\x45\xae\xd7\x2e\x69\x4c\x3d\x10\x1b\xfa\x4c\xa8\x79\x86\x2e\x5f\x99\xc2\x3a\x5d\x66\x08\x3c\xe0\x6d\x87\xf3\x99\xaa\x78\x88\xab\x83\xb8\x66\x44\x72"}, -{{0x4e,0xf6,0x0f,0x06,0x91,0xd7,0x37,0xe6,0x4d,0x43,0x7b,0xfd,0x33,0x98,0x33,0x0e,0x55,0xe3,0xc0,0x94,0xcf,0x41,0xfc,0x55,0x7b,0x0f,0xe0,0xb6,0x43,0x90,0x9a,0xb8,},{0x30,0x6a,0xb1,0x46,0xe5,0xc8,0xcd,0x63,0x0f,0x9b,0x48,0xbf,0x8b,0x68,0x5d,0xb0,0xb6,0xb5,0x53,0xef,0x69,0x68,0x68,0x53,0xb6,0xb5,0x31,0x96,0x01,0x18,0x54,0x8c,},{0xcb,0xf7,0xcf,0x22,0x08,0x1c,0x5f,0x23,0x5d,0xba,0x35,0x63,0x0f,0xb3,0xf0,0x40,0x8f,0xce,0xcc,0xef,0xeb,0x28,0xb9,0x9d,0x74,0xdb,0xd9,0x8c,0x90,0x2c,0x7d,0x99,0xba,0x9c,0xa7,0xfa,0xb3,0x74,0x7c,0x50,0x4c,0xc2,0x19,0xf4,0xdd,0x10,0x10,0x81,0xf5,0x8c,0xe6,0x16,0xe2,0x92,0x80,0xe3,0x62,0x53,0x9f,0xe4,0x9f,0x34,0xd7,0x05,},"\x0a\x18\x8a\xc2\x6f\x3c\x5d\x89\xf3\xd5\x88\x37\x4f\xac\x5e\xcf\x9a\x46\x7e\x21\x65\xb3\x1d\x0b\x0f\x23\x50\x1b\xd2\x2e\x62\xbf\x35\x55\xff\xba\x94\x63\x1d\xe7\x4a\x6a\x3c\x3c\xf6\x3b\x03\xac\x1b\xbb\x37\xd2\x33\xec\xa5\x99\x3b\x09\x70\xa0\x22\x0d\xe8\xd6\xc4\x1a\x97\x03\x07\x30\x9a\x52\xda\x05\x76\xdc\x33\x4d\x80\x64\x47\xaa\x09\xd0\xb2\x45\xea\xcd\x0b\x42\xc4\xe1\x9f\xa3\xd6\xfb\xdc\x22\x94\x30\xeb\x3c\x75\x58\xaf\x53\x31\xc6\xe7\xfc\xc2\xe5\x52\xce\x35\xd5\x79\x07\x3b\x54\x8d\xc1\x15\xbb\xd2\x7e\x5a\x33\xce\x1c\x47\xfc\x84\x61\xe3\x91\xb6\xd7\x67\x95\x34\x87\xcc\x52\xee\x67\x3b\xc4\xbe\x96\x56\x9c\x85\x57\x36\x9e\xbb\x6e\x02\xf7\x92\x38\x10\x8c\x3b\x58\x56\xee\x38\x1a\x79\xff\x46\x4c\x8f\x60\x09\xfd\x47\xe6\x7b\x4c\x80\x20\x1e\x11\xe6\x1a\xb8\xf5\x9b\xa5\xd0\x7b\x15\xac\xe3\xfb\x37\x4c\x64\xb6\xb4\xc3\x45\xe2\xb0\x0e\x91\x51\xab\x8e\x1c\x5c\x98\x56\x8b\xc5\x8d\xd0\x81\x2a\xaa\x3b\xee\xe1\x65\xe7\xea\xe5\x8f\xbd\xe6\x30\x77\x20\x3c\x4f\xd6\xe1\x60\x68\xd7\x6e\x3d\x3a\x13\xf1\xcd\xd7\x32\x88\xbd\x5e\x4d\xa4\x4e\xb1\x19\xa0\x4c\x4d\x32\xef\xa2\xf1\x3e\x74\x26\xa2\xf4\x1c\x56\x23\xc9\xb0\x66\xb1\x30\x36\x39\xb8\xfc\xea\x0d\x87\x74\xcc\x08\x04\x5f\x7e\x34\x63\x65\xff\x31\xd3\xb1\xed\x99\xe9\x7b\xca\x5f\x25\xc9\x2b\x28\x43\xac\x58\x5d\x02\x19\x3a\x2f\xd3\x94\x66\xf7\x3a\xaa\x98\x9b\x1f\xa0\x5b\x9a\x15\x7f\xd0\x27\x7c\x5e\x74\x5d\x25\x8e\x02\x78\x03\xa5\x24\xad\x94\x30\x94\x25\xc3\xf4\xde\xc3\x1c\x0e\xfc\x54\x77\x52\xf4\xc7\x19\x4c\xbb\x27\x2f\x84\x9a\x52\x16\x9c\x6a\x07\x8d\x20\xed\xe1\x43\x20\x16\x52\x84\x77\xb5\x8c\x2b\xdf\x60\x63\xf9\x44\x7e\x33\x83\x7c\xcb\x43\x7d\x8d\x6b\x95\xcf\x4c\x44\xbe\x70\xc8\x19\x3a\xd9\x80\xa1\x05\xf3\xdb\x6f\x99\x30\xba\xb4\x67\x8c\x77\x63\x42\xfa\xf1\x70\xed\xf7\x42\x48\xd3\xb1\xca\x96\xf7\x31\xb9\xd0\x26\xd8\xf0\xf7\xc3\x4e\xd3\x72\xc1\xcd\xe1\x76\xf5\x5f\x55\x86\x75\xcc\x31\x80\xc2\x39\x02\xf4\xba\x95\x08\xd1\xc9\x1c\x3c\x9e\x68\x87\x30\x32\x7f\x3f\x7b\x63\x7a\x8f\xee\x54\x37\x37\x59\xfc\xb1\x7c\x92\x17\xea\x44\xce\x43\x69\x1a\x8f\x64\x63\x64\x0a\x4a\x5e\x15\x1e\x62\x54\xc4\xef\x12\x62\x3b\x49\x39\x4d\xa7\xcc\x79\x45\x26\x93\x81\x7d\x6b\xae\xa9\xa0\xa7\x58\x76\x94\x8b\x1f\x8d\x3b\x71\x7f\x9e\xc3\x67\x53\xf5\x32\x63\x71\x03\x83\xb9\x82\x62\xae\x63\x54\xff\x2a\x22\x83\x22\x0a\xd4\x2c\x5c\xb2\xcb\xbd\xf1\x2c\x87\x95\x13\x71\x0b\x16\xbe\x85\x6f\x3b\x13\x55\xb3\x6f\x4b\x80\xc0\x17\xc2\x1b\xe8\x5e\x96\x05\x3d\xa0\x50\xc4\x03\x12\x10\x0a\xbb\x64\x0b\x87\x3d\x88\xfb\x6e\xe0\xd1\x9e\x9e\x61\xb0\x4c\x97\x0b\xd1\xf0\x60\xdd\x31\x1b\xbb\x9a\x6e\x35\xb9\x85\xfd\xca\x17\xca\xee\x8c\xd5\xdb\x63\x7a\xcd\x90\xcb\x8e\x82\x32\x55\xc0\x56\x01\x8f\xef\x59\x20\xdb\x64\x0d\x22\x01\xc5\xed\xdb\xd8\xa9\xc9\x47\x4d\xa8\xde\xf7\xe1\x32\x5b\x3c\xc4\x36\xc7\x4f\x81\x5d\xb1\xe4\x2b\x42\x1f\xaa\xb6\x26\xa4\x37\x8c\x2d\x84\x26\x1b\xf6\x49\xa5\x3b\x32\x1f\x59\x8c\x44\xbb\xd3\x00\x2b\x06\xcf\x7f\x1f\xde\xf8\x4a\xb3\x5f\x73\xed\x7d\xc6\x50\x96\xcb\x1d\xc0\xcc\x0e\x34\xc5\x61\xc8\xa1\x5c\xf5\x27\x9a\xbb\xed\x9b\x16\xff\x24\xa9\x74\x4e\x3f\x5e\x64\x9c\xc9\xd8\x88\x4f\x89\x1c\x3f\xb7\x89\x02\x03\x1f\xfe\x0e\x01\x21\xc7\x20\x80\xad\x10\xc2\x47\xb7\xc9\x3a\x9e\xbb\x2d\x84\xd4\xf8\x77\x75\x0d\x7b\x34\x16\x39\x3d\x03\x04\x52\x26\xbb\x79\x94\xee\xa5\x8e\x27\x2d\xc1\x8c\x46\xb3\x82\xd1\xf9\x7b\x23\x76\x5f\xda\x7a\x8c\xe2\x1f\xc6\xb9\x8d\x72\x3f\xfc\xcd\x99\xac\x46\x55\xcc\x5d\x10\x10\x5a\x2a\x5b\x7c\x8c\xfb\xfb\x90\xe2\x7a\x9a\x80\x9e\x41\xae\x64\x00\x63\x28\x64\x05\xa9\xbe\x83\xac\x5d\x29\x07\xa4\x5f\x16\x3c\x77\x64\xb0\x9f\x99\xa5\x55\x93\x22\x0d\x69\x01\x29\x2b\x9b\x58\x03\xa0\xfe\x71\xb0\xe4\x44\x1c\xbf\xef\x84\x1c\x33\xce\xbc\x98\x36\x4d\x66\x6e\x5a\x9f\x5e\x7e\x69\xa1\x50\x8e\x43\x80\xed\x36\x13\x45\xb7\x24\x8a\x4c\x1c\x1c\xe0\x87\x69\xbc\x71\x52\xdd\xb3\x32\xfb\xa1\x76\x20\x0f\x5a\xbb\xae\x38\x12\xf4\x06\xda\x72\xdd\xe5\xdb"}, -{{0x19,0x7e,0x15,0xdc,0xe4,0xc4,0x7d,0x73,0x4d,0xbc,0xe4,0x68,0x8a,0x7a,0xd5,0xfe,0x41,0xeb,0xf2,0xaa,0x29,0xa2,0xbd,0xdb,0x2b,0xee,0x62,0x84,0x29,0xc1,0xbc,0x02,},{0x30,0xfa,0xc3,0x23,0x04,0x8b,0x0c,0x78,0x1a,0x9f,0x63,0xc1,0xee,0x69,0xf2,0xb9,0xe7,0x5a,0x27,0x06,0xd2,0x49,0x51,0x2a,0x27,0x39,0x60,0x7f,0x26,0xdb,0x13,0x8f,},{0x2c,0x3c,0x8c,0xd2,0x99,0xc9,0x06,0x0b,0x65,0x99,0x9b,0x03,0xa6,0x57,0x9b,0xc5,0x0e,0xf1,0xfe,0x0d,0x85,0x1f,0x23,0xbe,0x9c,0xb5,0x8f,0x8f,0xb8,0xc6,0x72,0xee,0x08,0x6a,0x53,0x9e,0xad,0x94,0x9e,0x08,0x7d,0xf0,0x91,0x12,0x2d,0x26,0xfa,0xaa,0xd2,0x06,0xa5,0xc5,0x2f,0xcd,0x58,0xb5,0x14,0xd7,0xa9,0x35,0xbe,0x01,0x79,0x08,},"\xfd\x97\x1d\x48\x94\x6b\x51\xff\xed\x7b\x62\xc5\xd0\x99\xc1\xe5\x6b\x13\x58\xb9\x22\x35\xe1\x01\x0e\x3f\x23\x84\x4d\xdb\x73\xbc\xee\x8d\x2e\x1c\x99\x77\x35\x3b\xc9\x6a\x22\x1c\x05\x60\x29\x31\xfa\x16\xcc\xc2\xab\x6d\x0f\x01\xc8\x46\xc2\x92\x0e\x99\xde\x02\x6d\xc2\x89\x7f\x3d\x5f\x3c\xee\x17\x4c\xe7\x51\xd4\xa8\x05\xee\x19\x59\xa3\xc6\x9c\xfd\x42\xd7\xc9\xaf\xd3\x1f\xa9\xb1\xcf\x05\x78\x6d\x8f\x90\x42\xa4\xf9\xf8\x1c\xf7\xac\x9c\x1c\x39\xb3\x6f\x1e\xe9\x5b\x98\xcf\x7e\xe3\xf4\x3e\x2c\x34\x37\x33\xd1\xd8\x2c\xc0\x8b\x2c\xde\xb7\x8d\x98\x20\x34\x08\x5f\xf4\xdc\x65\x36\xcd\x15\x4a\x79\x0c\x85\xc8\x61\x3e\xc4\xe5\xe1\xdc\x37\x7d\x38\xa7\x45\xd9\x38\xcf\xb1\x5c\x8b\x8a\xa8\x61\x21\x83\x5f\x2e\x25\xe9\xe6\xd0\xde\x68\x02\x5d\x81\x0c\x3d\xc9\xdf\x99\x1d\xad\xad\x39\xdc\x69\x81\xfd\xba\xc1\xff\x9b\x7a\x79\x1c\x39\x60\xd8\x56\x43\x66\xe5\xaa\x39\xa9\xe9\xc7\xcb\xf1\xd3\xf0\xf8\x20\xd1\xb9\x01\x08\x75\x1a\xc7\x64\xda\xbe\x05\xc5\x1c\x18\x52\x9d\xa1\xb0\x34\x96\x14\x66\x84\x24\xab\x4e\x93\x64\x40\xc4\xa2\x51\x3b\xe5\x28\x53\x93\x72\xee\xe7\x87\x54\x58\x9d\xbe\x79\x94\xfa\xa1\xf6\x22\x91\x24\xf8\x39\x95\x0e\xd0\x92\x3f\x43\x23\x31\x5a\xc9\x63\xbb\xe4\xc8\xe1\x77\xda\xc5\x16\xe7\x34\x22\x38\xf1\xcd\xf1\x40\xbe\xfc\x8a\xcd\xca\x3d\x00\x2b\x16\xc1\x39\x8d\x86\x86\x00\x30\x4c\x7e\x98\x53\xb2\x3a\x51\xb1\x7d\x9f\xd0\x61\x56\xe1\xd1\xd0\x8a\x28\x46\x09\x09\xfa\x20\x9c\xcc\xcc\x4c\xec\xbd\xb1\xa4\x63\x48\x08\x91\x15\x31\x86\x81\xa9\x5a\xe5\x80\xab\x67\x66\x04\x13\x84\x65\x1c\xc4\xe6\x14\x51\x03\x92\x3b\xdf\x4a\x32\xa9\x3d\x93\xee\xd3\x18\x79\x1f\x20\x80\x5f\x7e\xa8\x4b\x74\x3e\xe1\x1e\xad\x9e\x4c\xa0\x3d\xa7\x6d\xdd\x24\x9f\xd4\x47\x5f\xc1\xa3\x53\xc7\x0a\x83\x38\x9b\xfa\xc5\x20\x98\xdb\x06\x6d\x10\x29\xc4\xef\xfb\xed\x86\x4e\xbe\x7f\x10\x7e\x01\x03\xb3\xa8\xf3\xfd\x1d\x6a\xb4\x36\x0b\x99\xe8\xb1\x40\xc5\xea\x13\x3e\x92\x3c\x39\x2b\x8e\x40\x63\xaa\x6e\x52\x26\x38\xf6\x1d\x7a\x71\xc9\x22\x58\x97\xd9\xf8\xa1\xe1\x6c\xfc\xc8\x01\xe7\xd5\x41\x04\xeb\x10\xe6\x1a\x5a\xe6\x3c\x5c\x85\xa5\xb2\x93\x92\xab\x3a\xb8\xe5\xc0\x39\xf1\x00\xd0\xf4\x60\x0c\x61\x0e\x02\x09\x43\x6e\xf2\xec\xe4\xd0\xbd\xb0\xba\xb4\x37\xb2\xdb\x5f\x37\x08\xfd\xdf\x96\x66\x0f\x6f\xb1\xa9\x0d\x60\x48\xd3\x95\xaf\xaf\xa7\x60\xcc\xaf\x15\xde\xaa\x0e\xff\xeb\x26\xec\x17\x68\x1d\x17\x2c\x13\x30\xf7\x8e\x78\xa8\x73\x6b\x28\x5f\x61\x5f\x15\xd4\xf2\xc3\x13\xd2\x5f\x30\xae\xe9\xd1\xdb\x39\xf5\x35\xfc\xdd\x0e\xbc\x8e\x71\xb8\x9c\xe6\xb3\xfc\xb5\x67\xcd\x0f\xa2\x88\xf4\x8e\xd3\xa7\x59\xbb\x2e\xd2\x00\xfd\xc2\x30\x91\x50\x2f\xd9\xca\x65\x1c\xe5\xe3\x42\x2a\x98\x33\x5a\x81\xd7\x4a\x65\xcc\x15\x00\xe9\x07\x0a\xbb\x60\x9c\x1c\x1f\x68\xfc\x2c\xa9\x4c\xdd\x55\x0f\x99\xbc\xb2\xd0\x92\x41\x6b\x9b\xd3\x88\x41\x0b\x8f\xe7\x48\xfb\x8c\x9a\x5a\xb8\x61\x5f\x2e\xd9\x68\xf8\x5d\xcb\x27\x27\x72\x69\x84\xbe\xad\xa7\xa1\x8a\xfd\xb0\xc7\x2a\xa6\x5d\xe7\xab\xb7\xa8\x6f\x11\x16\x9a\x6e\xad\xf1\xc2\x1d\x61\x4e\x52\xc0\xc8\xf0\x19\x74\x7d\x34\x1a\x05\xd8\x5e\x37\xbf\x58\xd8\x32\x7e\x99\x39\xc2\x38\x7c\x27\x44\xed\xf8\x38\x56\x3c\xb3\x7f\x0b\x16\xe8\xa0\x6f\xc6\x28\xa9\x72\x30\x50\x6f\xa4\x18\x39\x54\xdc\x74\x81\x5f\x3b\xe2\xeb\x2a\xff\x4a\x13\xc0\x65\xf7\x43\xb7\xd8\x5d\xe8\x04\xeb\x28\xef\xe5\x70\xed\x5e\xcc\x71\xab\xa9\x7f\x97\x63\xb4\x36\x17\x32\x47\xf3\x8e\x0c\xf6\x29\x72\x09\xb6\x51\x28\x46\x5a\x38\x26\x64\xce\xd8\x01\x1f\xcc\x3d\x0e\x56\x3f\x15\x5b\xc6\x3c\x94\xdd\xe7\x3c\x7b\x17\x24\x7b\x8c\x3a\x4e\x80\x34\xeb\xd4\x36\x46\x35\x18\x5c\xe9\xc7\x08\x1d\xbd\xbe\x85\x45\xf7\x9d\x01\xaa\x53\x2a\x0d\xc5\x2c\xb7\x90\xa3\x1f\xc2\xff\x41\xac\xeb\xad\x27\xcc\xe9\x24\x45\x54\xdb\x65\x2f\xa2\x87\xba\xe7\xde\xcb\xcc\x8c\xe9\xe0\x1d\x1a\x88\xab\x41\x2b\x6c\x65\x78\x20\x3b\x42\xde\xc9\x82\xb7\xf3\xb8\x23\x14\xdb\x2c\xc7\xc5\xc3\xdc\x1d\x3d\x8b\x17\x14\x4d\xa7\xfe\x60\xe7\xa8\x72\x5f\xd0\xa9\x7c\x61\x06\x07\xcf\x41\x3c\x72"}, -{{0x08,0xb5,0xfd,0x4e,0x41,0x9d,0x23,0x70,0xc0,0xfc,0xd6,0xc3,0xb9,0x2f,0x8d,0xb3,0xaf,0xd4,0x22,0x68,0xf5,0x33,0x08,0x5d,0x9f,0xce,0x32,0xb5,0x22,0x82,0x4e,0x34,},{0xcd,0x0d,0xa6,0x99,0x37,0x9e,0x4f,0x94,0x25,0xe8,0x4b,0x97,0x57,0x30,0x0a,0x51,0xa1,0x63,0xf3,0x58,0x73,0x4c,0xc3,0x7a,0x91,0xff,0x0e,0xa4,0x88,0xd2,0x97,0x79,},{0x42,0xa1,0x37,0x56,0xb7,0x5c,0x67,0x22,0x48,0x5f,0xa3,0xf6,0x94,0x04,0x1b,0x39,0xb7,0xd7,0xc5,0xfd,0x40,0xeb,0xc0,0x6a,0x52,0xe0,0xff,0x34,0xce,0x14,0xd8,0xd4,0x0f,0xa8,0x2a,0x95,0x08,0xb5,0x68,0x53,0x7d,0x26,0xd0,0xdd,0x7c,0x0a,0x31,0xbe,0x71,0x0d,0xa8,0x0a,0xab,0x35,0x19,0x6a,0x03,0x9b,0x60,0x64,0x1d,0xb1,0xe1,0x01,},"\x3c\xee\xee\xa3\x0f\xa4\x01\x56\x3d\xf3\x6b\x19\x8b\x9b\x59\x69\x8c\x10\xe1\x00\xa2\xf3\x0e\x6f\x78\xfe\x62\xb9\x2e\xca\xc9\x89\xe8\xaa\x09\xec\x76\x0e\x89\xca\xc0\xa1\x6b\xde\x3c\xac\x73\x62\x2a\x86\x27\xef\xed\xfa\x4e\xc0\x9b\x87\x3f\x7e\x10\x00\xe7\x69\x82\x91\x0c\xa0\xaa\x4a\xfb\x1f\xf5\xa8\x44\x8b\x76\xf7\xb0\xd2\xa2\xd5\x2a\x7f\x40\xde\xde\xfc\x68\xd6\x0c\xe6\x62\x2c\xa0\x80\xd6\x69\x8e\xa6\xc3\xbd\x72\x10\xb3\xb6\x48\xf5\x32\x52\x29\x14\x94\xb3\x5a\x55\xff\x40\xfa\x1a\x63\x1a\x57\xc5\x10\x01\x1a\x46\xbf\xb9\xe2\x71\xba\xe1\xe7\x8c\xe6\xc6\xea\x60\xc5\x5b\xa0\xcc\xe3\x60\x59\xbf\xb0\x1e\x39\x45\x56\x98\x7f\x74\x4b\x72\xae\xbb\xdb\x4b\x1b\xdb\xb3\xbb\xaa\xee\x1b\x8b\x2f\x31\x74\x50\x6a\x79\x3f\x0a\x51\x1b\x2b\x56\x90\x49\xb3\x0a\x2e\x08\x41\x42\x41\x84\xa4\x8e\xca\x9e\x2d\x83\x78\x3a\xc5\xb6\x1e\xb9\x47\xcb\xd8\xba\xb7\xad\x38\xb0\xc6\x84\x27\xd8\xf9\x4a\xe2\x85\x19\x0d\xbb\x6e\x0c\x6d\x58\x0a\x25\x14\x23\x94\xbe\x94\x81\x58\xd8\xda\x83\xb4\xf3\x4a\x8d\x25\x8b\x97\x07\x56\x32\xb3\xc2\x8b\xfa\xe3\x10\x5e\xd1\x87\x2e\x35\x6e\x43\xae\xd5\x93\x97\xb9\x11\x0b\xbf\x9d\x8c\xa2\xa0\x44\xd5\x27\x1e\x6c\xc3\x61\xe1\x4e\x69\xa9\x32\x51\x76\x83\xec\x81\x81\x8f\x02\xcf\xa0\x29\x5e\x56\x61\xce\xa3\xe5\x86\xaf\xc0\xdb\x41\xba\x95\x55\x3e\xe7\x5b\x20\x0b\x0f\x97\x90\x11\x1d\x37\x57\xa7\x39\xe5\x63\x55\x7a\xff\x9b\x70\xca\x14\xe8\x7b\x79\x54\x37\xba\x91\xa9\x5d\xd0\x7e\xa6\x9a\x11\x35\x9f\x36\xca\x03\x29\x8e\x0b\xfa\x4f\x91\x2f\x64\xa2\x92\x4a\xd9\x01\x97\x5a\x2a\x96\x0b\xa1\xbe\x89\x92\x1b\x1f\x54\x85\x49\x6b\x7e\xa5\xda\x6d\x8a\x69\x37\xac\x10\x5b\xf3\x76\x0e\x48\x76\x99\x0a\x0f\x5c\x5a\x63\x4f\x74\xcb\x57\xdf\x7c\x17\x2c\x8a\x41\x53\x72\xe6\xd9\x03\x29\x87\x17\x49\x96\x16\xf8\x97\x1c\x68\xbb\xec\xe9\x2e\xa8\x78\xa1\x8e\x23\xf3\x27\xc3\x64\x9b\x6a\x85\x2e\xf2\x3b\x7b\x3e\x60\x3c\xdf\x80\x45\x2d\xbf\x1b\xe2\xfb\x77\xe8\x14\xd2\x52\x54\x96\xbb\x31\xfb\x6e\x4e\xd2\x53\x32\x48\xb3\x9d\x5f\xbe\x23\x90\xa9\xb6\xfc\xca\xba\x99\x7e\x8b\x49\xb5\x98\x36\xe3\xe0\x95\x29\xea\x5e\x41\x13\xee\xe4\x51\xc9\xc6\xbb\x26\x74\x1d\x0e\x4c\x58\x6f\x53\xd6\x04\xc6\xea\x0c\x0e\x60\xdb\x02\xe5\x10\x9f\x37\x34\xf5\x1c\xdd\x89\x85\xaf\xeb\x3e\xca\xff\x65\xe0\x59\xe3\x12\xcd\x50\xfa\x34\x9f\xf2\x8b\xdc\x9b\x70\xb7\xf5\x32\xdb\xab\x1d\xf4\x3b\x03\x16\x7c\x1d\x2e\x3f\xa6\xee\x8c\x9b\x17\x4a\x0b\x2c\xf8\xaa\x9f\xfa\x40\x6b\xf5\xbd\x72\x88\x78\x0c\x9c\x4a\x6b\x69\x79\x49\xb4\x86\x38\xd4\x20\x79\xc8\xc6\x6e\x14\xd9\xb5\x72\xa2\x10\xa0\x93\xea\xf1\xd2\xf7\xa7\x03\xb5\xcd\x20\xad\xc4\xf9\x92\x7a\x6e\xa8\xea\x78\xfa\xa6\x1b\xc6\x2b\x3c\x5c\xbd\x3a\x53\x25\x25\x66\xd0\x43\xba\x55\x65\x90\xd9\xa7\x63\xbe\x7f\xea\x4b\x20\xe1\xe9\xcf\xbe\xbf\xae\x15\x43\x9b\x33\x4d\xc5\x39\xb1\x7d\xad\xa2\xe4\x34\xe9\xc8\x32\x25\xb1\xe8\xf6\xbe\xb7\xd5\x56\xb4\x7d\x7f\x69\xf7\xeb\x7d\xf5\xed\xe2\xee\xbd\x84\xe2\x50\xb7\xc9\x46\x8c\x21\xfd\xc0\x17\x0e\xa8\xdf\x66\x2d\x61\x80\x58\x1f\x65\x7f\xe7\x6c\xef\x18\x58\xb6\xb0\x2f\x73\x25\xc7\x21\x96\x43\xfb\xa2\xf7\xe9\x96\x3a\x33\x32\x2d\x65\x04\xab\x91\xbf\x10\xa9\x78\xfa\x07\xb4\x7d\x5d\xb0\xbe\x00\x0d\xcd\x00\x2b\xdd\xaf\x67\x6b\x77\x25\x9c\x9f\x60\xad\x0b\x11\x67\x1c\xd5\x77\x7c\x1e\x80\xb1\x3f\x82\xeb\x0f\xb6\xa1\x80\xb5\x66\x62\x93\xa4\x32\x40\x86\x2f\xbf\xa3\x97\x8d\x95\x31\x19\x71\xaf\xab\x9e\x1c\xc8\xab\x14\xa8\x76\xb6\x57\x2a\xc8\xa4\xb7\xe0\xb4\x0a\xaf\x6b\x52\xa1\xcf\x4c\x1e\xbc\x6c\x1c\x48\x7d\xf5\xa3\xcb\xc4\x00\x5a\x0e\xe3\x29\xca\xbc\x28\x6d\xb1\x0f\x17\xd0\xf1\x78\x2e\x07\xd3\x32\x4f\x0c\x73\xef\xbd\x3c\x2f\xb5\x2b\x71\xf9\x8a\xd9\x5d\xb9\x50\x62\xd9\x14\x25\xe7\x34\x67\xbc\x1e\x4e\x9b\xf5\x52\xe8\xa2\x44\x29\xd9\x7d\xb1\xd6\x6d\xd4\xd9\x95\xe5\xf8\xd2\x4e\x9c\x91\x0b\x2e\xb1\x75\x8e\xf7\x55\x25\xc3\xd6\x5a\x3f\x43\x0a\x02\x73\x48\x82\x0c\xe3\x05\x3b\x6f\x3a\xf4\xec\x96\xd0\x49\x37\x31\xc8\x18\xc6\xb1\xa7\x0c\x25\x0a\xc6\x86\xa4\xfc"}, -{{0x1e,0x85,0xc9,0xe4,0x51,0xb7,0xac,0xf8,0x01,0xd1,0x6b,0xc8,0x26,0x8e,0xb4,0x2a,0xe8,0x5c,0x72,0xc6,0x8e,0x9f,0x90,0x92,0x7a,0xa0,0xf3,0xb5,0x0b,0xef,0xd2,0x29,},{0xa6,0x9d,0x05,0x7f,0x4b,0x74,0x38,0x11,0xe0,0x7a,0xc7,0x45,0x61,0xc2,0x25,0xbe,0x03,0x81,0xc7,0xd5,0x84,0x9e,0x60,0x18,0x79,0x37,0x01,0xa8,0xcb,0x6c,0x99,0xb5,},{0x6c,0x36,0xda,0x9a,0xd6,0xc4,0x56,0x34,0x3c,0xe6,0x42,0xac,0xa4,0x54,0x92,0x3a,0x52,0xa2,0x84,0x4c,0xe5,0xee,0x58,0x94,0x7c,0x8d,0xf7,0xba,0xb2,0xeb,0xe4,0x67,0x82,0x3c,0x56,0x33,0xe5,0x30,0xb1,0x67,0xd7,0x1c,0x47,0xad,0x95,0x49,0xdf,0x05,0x94,0x3f,0x99,0x42,0x1e,0x17,0x47,0x5c,0x4d,0x4f,0x08,0xde,0xdf,0x6f,0x32,0x05,},"\x18\x9e\xa9\xc8\xd9\xed\x14\xb0\xde\x82\xb4\x4c\xbd\xd5\x87\x57\xa2\x7c\x68\x38\x3f\xba\x59\x77\x61\xf9\xe8\x62\xe0\x8d\xe1\x5b\x1e\x44\xc3\xdb\x1b\xad\xbd\xe7\x69\x80\xee\x39\xe6\x99\x62\x9f\x6f\xcf\xef\x32\xd3\x6b\x33\x93\xda\x2c\xa5\xa8\x1f\x95\x9c\x8b\x0f\x1b\x80\x1b\x5f\xa4\xc4\x7c\xa3\x95\x91\xe6\x12\xa2\x43\x5c\x5b\xaf\xd7\x7a\x5c\x7a\xb7\x43\x59\x21\x09\x06\xf4\x75\x33\xb1\x87\x9e\x2a\x5a\xf5\x86\x4d\x96\x1c\x81\x46\xe2\x5d\xac\x77\x25\x55\xe0\x42\xa8\x87\x26\x14\x19\xab\x8c\x9f\x6f\x62\x56\x25\x48\x1d\xa5\xb9\x35\x26\xa1\x31\xf3\x7b\x53\x4a\x00\x50\xa8\xa4\x62\xb3\x3f\x20\xa7\xe9\x4b\x89\x15\x30\xb1\x9b\xf6\x54\xee\x95\x34\xc9\xa8\x36\x1d\x03\x63\x5d\x8d\x27\xd4\x6b\xe7\xbf\x84\x78\x1a\xd0\xd4\x2d\x1e\x7c\x48\x54\xa4\x9b\xa1\xba\x45\x82\x62\xfe\x5e\xa1\x90\x21\xb9\x35\xa6\x94\x94\x92\xd7\x0b\x60\x5e\x15\x19\x89\xef\x26\x41\xb2\xbf\x81\xec\x4b\x92\x02\x0f\xc7\x07\x4c\x2a\x63\x22\x9d\x51\xa9\x44\x18\x6a\x28\x89\x5e\x8e\xa9\x52\x92\xc2\xf8\x72\xbb\x21\xa3\x14\x93\x99\xe2\x3c\xcd\x8e\x2f\xc4\xf1\x7a\x46\xb5\x9c\x28\x2c\x51\xb5\x8d\x00\x26\x6a\x5c\x16\xb1\xce\x35\x0d\x54\x85\xe8\xd8\x01\x6d\xd0\xa5\x0a\x59\x84\xcc\x94\x81\x54\xcd\x5c\xe7\xcd\xa0\xee\x0a\xb1\xd7\x25\x1b\xdc\x70\xa1\x78\x5b\x8e\x91\x03\x91\x7f\x4b\x91\x7a\xb2\xb4\x94\xf3\x48\x33\x89\xa2\xf9\x23\x75\x41\x84\x9e\xd3\xbd\x56\x5c\xff\xac\x9e\x75\x6d\xb5\x6e\xf5\xe2\x34\x95\xbc\x77\x1e\x88\xbf\xfa\x87\x07\xce\xea\x5c\x09\xbe\xca\xdd\x05\x9a\xb8\x89\xd1\xdf\x7e\x88\x7b\x71\xa9\xe6\xc2\x38\x37\x8f\xbe\x0c\x36\x30\x38\x66\x16\x36\x3f\x20\x7b\x16\xc3\x27\x0d\x39\xac\xde\xd5\x11\x52\x99\x92\xf4\xe5\x98\x78\x91\x21\xd3\x16\x13\x58\x10\x63\x6b\xaa\xde\x8a\x28\xed\xc6\x6b\xbf\x5e\xde\x3f\x40\x4a\x70\xb4\x7d\x35\x98\x8b\xe7\x06\xb4\xea\xa0\x30\x23\xa3\x90\x93\xd5\x83\xcd\x4c\xd8\xbf\x4c\x74\x34\x1a\x02\x8c\x19\xd6\x0d\xa3\x1b\x6a\x7a\x03\x4c\x08\x1a\x2b\x03\x0f\xeb\x3c\xd2\xf0\x3d\x0f\xaa\xbf\xfb\x58\xe3\xfc\x36\xc0\x06\xcf\xb9\x29\x47\xa7\xde\x5b\xa8\x74\x76\xc1\xb0\x51\xe1\x82\x83\xc0\x3e\x9c\x6e\x5a\x5c\x3c\x27\x77\xd9\xa0\x75\x73\x72\x37\x96\x64\xe8\x2f\x84\x85\x82\x4f\xed\xb7\x0a\x4b\xc4\xe3\x56\xed\xd1\xb5\xce\x0f\xb6\xe4\x1d\xe0\x17\x16\x21\xb8\x4f\xaf\xa0\x01\x89\xaf\xa8\xa6\xa9\x00\xb1\x4c\x70\x75\x8f\x7a\xa4\xfb\x82\x40\x0e\x0d\x18\xab\x3c\xd7\xe4\x8a\xcf\xd4\x89\xca\xb0\xe7\x2e\x71\x9f\x79\xa0\x7d\x06\x6c\x53\x1a\x89\x1c\x55\x29\x1f\x22\x45\xdb\xbe\xe4\x4e\x52\xb1\xdf\xc8\x72\x7a\xae\x38\x7a\xb9\xe7\x19\x94\xa3\x85\x4e\x1a\xdd\x73\xd9\xa7\x96\x5c\x77\x55\x21\xc2\xf5\x40\x84\x22\x76\xdd\x30\x9e\x2f\x6a\x34\x1e\x7f\x0f\x37\xf2\x2b\xb6\x62\x7b\x6e\x9c\xb2\x5b\xa2\x4c\x6c\x4f\x4e\xb9\xf5\xe7\x62\x2d\x88\xda\x19\x84\xe2\x9c\x5d\xa0\x01\x03\x9c\x44\x04\x2b\x59\x35\x14\x06\xa4\x13\x36\xdd\x77\x2d\x49\x7d\x3f\xc8\xaa\xc4\x11\x72\xeb\x5a\xa6\x41\x7f\xe4\x22\xec\x7c\x15\x0b\x96\xb0\x45\x4e\xe3\x31\x24\x7c\xb1\x53\x8a\xef\xf3\xec\xa2\xd5\x0e\x53\xd6\xd1\x31\x70\xa7\x6a\x00\x49\xea\x0c\x05\x90\x4a\x63\x90\xed\x14\xce\x74\x91\xe9\x7f\x75\x4c\x52\x22\xda\xc4\xb6\x11\x8b\xa3\x81\xf5\x52\xe7\x3e\xa8\x49\x1e\x3b\x7a\xc9\x49\x56\x9b\x56\x9c\xf2\xd2\x9a\x80\x41\x0e\x06\x5b\x5c\xc4\xa4\x66\xbb\x04\xeb\x7a\x15\xf5\x96\x79\x2e\x84\x90\xba\x70\x02\xec\x36\x15\x71\xaf\x5d\x8f\x57\x67\x5c\x95\x64\x49\x47\x0a\x2f\x99\x55\x40\x73\x67\xe4\x09\xa2\x32\x89\x95\x53\x12\x0a\x27\x7d\xb8\x63\xe9\xa8\x2d\xda\xba\xe8\x7b\x78\x91\x45\xba\x89\x8d\xf3\xc2\x8b\x96\xfb\xe3\x01\x4c\xd0\x85\xc6\xe6\x0e\xe8\x83\x17\x01\x03\x6d\x99\xc5\x42\x5d\x58\xe8\xbc\xc9\xfd\x92\x71\xd4\x6a\xec\x1e\xb9\x55\x13\x01\x02\xea\xaa\xb4\x4e\x07\x70\xc3\x0b\x2b\x12\x7e\xfb\x0e\x5f\x8a\x3f\x7a\x0c\xa3\x4e\xc9\x98\x4a\x46\x01\x1b\xc2\x6b\xfd\xe0\xc0\x81\x9b\xb5\x47\x06\xb5\x65\x63\x8b\x75\x42\xdc\x4b\x8b\xf8\x09\x8d\xc0\x1f\x16\x1b\x3b\x12\x96\x18\xb5\x9a\xde\xd3\x3c\xb5\x9c\xe9\x18\x9a\x67\x62\xdb\xae\x5b\x0d\x34\xb7\x1c\x8d\xbf"}, -{{0x51,0xcf,0x86,0x8f,0x82,0x0e,0xed,0xa0,0xdb,0xd1,0x01,0x80,0xf7,0x77,0xe6,0x06,0x5c,0x93,0xa4,0x83,0xc5,0x8a,0x77,0x8b,0x67,0xe7,0xd8,0x42,0x30,0x2f,0xb7,0x67,},{0xab,0x08,0x8f,0x50,0x2f,0xbc,0xf2,0x15,0x0e,0x48,0x46,0xb3,0x4d,0x2c,0x80,0x97,0xff,0x01,0x3c,0x02,0xa8,0xb9,0x7c,0xfc,0xf2,0xb9,0x5a,0x1c,0x72,0xdf,0x3e,0x24,},{0xe1,0x53,0x42,0xa1,0x1c,0xaf,0x89,0x28,0x95,0xe4,0x66,0x22,0x88,0x63,0xd0,0x83,0xb0,0x69,0x2f,0x01,0x06,0x10,0x74,0x8c,0x23,0xdf,0x2f,0x11,0xd2,0x94,0x75,0xba,0xfc,0xe9,0x27,0xca,0xfe,0x7f,0x07,0xef,0xb8,0xc3,0x47,0xed,0x56,0x63,0xe7,0x3b,0xea,0x89,0x53,0x1c,0xed,0xc0,0xc3,0x48,0xe7,0x9b,0x6e,0x58,0xa7,0x57,0x49,0x07,},"\x7c\x2d\x8e\xe8\x2d\x9a\xbf\x8a\xa9\xc7\x24\xc7\x5b\x90\x99\x04\x73\xf1\x31\x76\x3f\xe9\x3b\x30\xcb\x04\x72\x35\x88\x62\x1d\xa2\xa3\x27\x92\x8b\x22\x64\x9f\xa0\x62\xcd\xea\xbd\x77\x76\x15\x38\xb2\x70\x9b\x8f\xb7\xa2\x00\x6e\x50\x35\x09\x13\x4c\x92\x9c\x30\x11\xe1\xd7\x28\xa5\x7a\x4e\x17\x51\x98\x07\x5e\x21\x42\x53\xf3\xf3\x0e\x01\xb6\xe0\x4e\xab\xd4\xde\x06\x78\x95\x58\xe6\x98\xb1\x86\xef\xe3\x4b\x32\x12\x95\x68\xb3\xe8\xd0\xd7\xea\x3f\xf0\x0b\x3f\x25\xa4\x22\x36\x89\x3a\xa8\xa4\x1b\x67\x4a\x0a\xb5\xf4\x1e\x7b\x28\xcf\x5a\x7c\xb7\x65\xe1\x8e\xad\x6d\xe6\xa3\x53\xa7\x82\x4a\x3c\x49\x78\x60\x38\xd6\xf4\x93\x7f\x32\x64\xd6\xcc\xf0\xc0\xa2\x46\x5b\xb6\x93\xe5\x2b\x3d\x1e\x6e\xb9\xae\x4c\xb6\x5d\x09\xcf\xf5\x48\x42\xe8\x53\x62\x85\x7a\x59\xf7\x19\x8a\x68\x8a\x3d\xf3\x85\x13\xcd\xd6\x1e\x21\xdf\xd8\x59\x14\x2c\x83\x44\xa3\xb8\xb2\xa7\xc7\xdb\x17\x0f\x39\xf8\x7c\xa3\xff\x8e\xd4\x27\x96\x2b\x2b\x1a\x14\xd1\x22\xfa\x2d\x5a\xea\x2a\x66\x40\x11\x7d\xd2\x58\xfa\x0f\xc5\x4a\xc6\xe9\x40\xbc\x16\xd2\x11\xec\x9a\xdf\x91\x4a\xb1\x65\x78\xf5\x21\xf6\x55\xd2\x12\x7e\x79\xe8\x71\xbf\x7f\xa7\x54\x47\x19\xd5\x8e\xd8\x47\x85\x0c\xb2\x7b\x99\xeb\x8f\x29\xb1\x6c\xdc\xc2\x8b\x15\xc1\x25\x9a\xb4\xd5\x89\x70\x5a\x40\x66\x88\xf6\x05\xa2\xeb\xf5\x80\x51\xc4\x3a\x77\xc4\xe0\x1f\xd6\xf7\x49\xd3\x2d\xb4\xe8\x9f\x26\x3c\x2c\x16\xde\x18\x1f\x0e\x6b\xdd\x0a\x6a\x64\xff\xe6\xf1\x82\x94\x44\x09\x6d\x9f\x3e\x2b\x67\xe4\xbb\x00\x66\x50\xb5\x92\x9d\x1f\x82\xeb\x11\xbb\xed\x24\xe8\xf1\x01\x8a\x73\x84\x60\x5a\x3c\xf2\x9a\xb5\x98\x33\x79\x39\xc7\x6a\x3b\xe8\x61\xe4\x83\xc5\x80\x5e\xc3\xce\xe4\x5e\x34\x24\x84\x7a\x08\x55\x8d\xcc\x99\x49\x9f\xb9\x38\x2a\xca\xe5\x6c\xdc\x87\xfb\xd5\xb2\x6f\xf9\x4c\x86\xf2\xe1\x08\x79\x43\x83\x50\x1c\x8b\x33\x36\x68\x50\xa7\x6a\x0d\xfc\x0a\x7c\xd7\x89\xa0\x3f\x01\xa3\xe9\xd9\xe9\xae\x39\xfd\x72\x45\xdc\x29\x29\x9d\x24\xf3\xb4\xb1\x67\xca\xcc\xd2\x23\xa9\x9b\x6b\x20\xa3\xb6\x73\xdc\x5f\x74\x66\xd0\xb2\xf8\x15\x09\x8a\x49\x7c\xca\xf8\x04\x20\x16\x8e\xdd\xbf\x4d\xa5\x7b\x86\x66\xe9\xd3\x3c\x48\xeb\x30\x4b\x4c\xfc\xf4\x57\xcd\x76\x59\x54\x3f\x6d\x1e\x66\x18\x90\xf5\x62\xb4\x3b\x8b\x6d\x1c\x4d\xcc\x07\x7b\x60\xbf\xa5\x33\xff\xab\x92\x8d\xbf\xd9\x55\xdc\x51\x16\xd7\x70\x95\x0b\x69\x0e\x21\x06\xad\x52\xd4\x2c\x31\xc2\x2b\x88\x48\x89\x43\x32\xb5\xc6\x99\xe5\xc3\x31\xfb\x38\x1e\x58\x12\xe7\x52\x6f\xdf\x4b\x8a\xa2\xda\xaa\x2c\xa2\xcf\xb9\xc9\x21\x11\xb6\x1c\xbc\x3d\x1e\xef\x6c\x8c\x67\x37\xf0\x55\x88\xf0\x44\x67\xdb\x83\x30\x84\x3a\xcc\x98\xdc\x1a\x16\xfb\xd9\xd9\xd9\x4b\xd8\xbf\xde\x26\xc3\xf7\x1d\xee\x72\xb5\x09\x10\xc3\x6b\x24\x0f\x80\x2a\x61\xca\x16\x37\x2f\x6f\xfa\xad\xb2\xbe\x4e\x85\x3c\x5e\xd6\x9a\x3d\x1f\x6c\x7b\x2d\xe5\x13\xc5\x3a\x3f\xdd\x0a\x67\x6f\x83\xd0\x9d\x5c\x51\x17\x60\x47\xd9\x20\x07\x16\xbf\x22\xba\xe4\x5f\xe0\x1b\x3e\x0c\x2c\x51\xc1\x6e\x46\xad\x06\x37\xf7\x9f\x9b\x4d\x83\x86\x77\x04\xfe\xda\x9f\x22\x78\x31\xde\xa2\x63\x39\x9c\xa2\x77\x1a\x4e\x78\xb4\xdf\x8a\xc0\xde\x6a\x94\x1e\xab\x37\x0b\x1f\xdb\x47\xda\xf6\x64\x2a\xae\xaa\x63\x17\x0f\xa9\xb3\xd1\xe1\x62\x8f\x7c\x4e\x7c\xf0\xea\x8b\x8a\x8e\x51\x8c\xba\xce\xf9\xad\xe8\x4d\xf0\x32\x48\x48\x47\xff\xb6\x1b\xbd\x07\xe8\x72\x7c\xc4\xc2\x5d\xa5\x77\xb2\x64\x51\x9b\x49\x99\xfa\x7c\x0b\xc3\x23\xd4\xf3\xf9\x73\x9f\x78\x0b\x9b\x2c\x23\xc7\x78\x55\xee\x5f\x6d\xcc\x40\x15\x44\xd6\xb6\x4b\x27\x70\x15\x8f\xdc\x6c\x12\xf4\xd8\x9b\xeb\x04\x4e\x0e\x85\xac\x7a\x68\xd4\x29\x17\xb1\x34\x51\x14\xb9\xa6\x72\xd1\x23\x1b\x2c\x6c\x0f\x96\x9f\x20\x35\x31\xe7\x1b\xbb\x40\x05\xb1\x03\xa7\xdc\x3a\x58\xb5\xb8\x24\xa7\xe0\x1b\x6e\xb9\xf4\x96\xdf\xa6\x4d\x64\xd8\xc6\x77\x7f\x53\xaa\x58\xd5\xda\x04\x6d\x72\x6f\x55\x45\x4c\x88\xb6\xd7\xd4\xab\x0d\x21\x98\xa8\x97\x09\xf1\x18\xa6\xb3\x24\x60\xb9\xeb\xce\xff\x3f\xdd\xc6\x05\xda\x77\xef\x3d\x1b\xa3\x0f\xec\xf0\x7b\xe2\xf5\x31\x3f\x4e\xe6\x35\xaf\x5e\x95\x61\xd8\x77\xe9\x9c"}, -{{0x54,0x3d,0x5f,0x1d,0x4a,0x6e,0x10,0x29,0xb1,0x91,0x41,0x38,0xfb,0x1f,0x46,0x59,0xe6,0x94,0x56,0x55,0x72,0x07,0x40,0x66,0x88,0xa2,0x03,0x5c,0xbb,0xb2,0xa6,0x8a,},{0x3c,0x83,0x79,0x0c,0x3b,0x45,0x53,0xde,0xae,0x4f,0x84,0x3b,0x50,0x1d,0x26,0xf6,0x16,0x70,0x93,0xee,0x54,0xe2,0x79,0x75,0x9f,0xfa,0xd8,0xcb,0xc0,0x61,0xe7,0x20,},{0x55,0x20,0x11,0x94,0x02,0x6f,0xd6,0x44,0x8b,0x1d,0x52,0xf8,0x3e,0xd2,0x0a,0xc2,0x84,0xe7,0xe7,0x7f,0xa9,0x2d,0x52,0x95,0xd3,0x38,0x25,0xce,0xa3,0xac,0xa4,0x7e,0xc7,0xaa,0xca,0x2f,0xc0,0x86,0x79,0xf9,0xac,0xfc,0xed,0xb3,0x76,0xfd,0xa4,0x61,0x9b,0xe3,0x27,0x2c,0x74,0x45,0xe8,0x70,0x5c,0x30,0x61,0x41,0xcd,0xe1,0x6c,0x0f,},"\xfe\x00\x57\xf0\x62\xfc\x87\x13\x24\xb8\xbd\x5d\x42\x7e\x9a\x52\x76\x23\x1b\xd3\x09\x90\x7e\x58\x81\xd7\xae\x53\xb1\xf3\x70\xc2\xa4\x33\x02\xa1\x65\x10\xb4\x60\x64\xa3\x07\x36\xba\xc9\x09\x51\xf1\xd9\x88\x1a\xf6\x2c\x70\x14\x83\xeb\xb9\x27\x2a\xd7\x72\x12\xee\xb5\xfc\xbc\x7e\xc2\x28\xd9\x69\xf8\x90\x27\x32\x11\x3b\x98\xe3\xbf\x82\xdf\xea\xdd\x0d\xe5\xe7\x65\xd2\x87\x0b\x12\xd1\xf9\xb5\xa2\x82\x97\xc9\xfd\xd1\x49\x5c\xf8\x77\x89\x19\x6a\x7d\x64\x4e\xec\xd9\x35\x87\xdb\xf2\x0c\x28\xeb\x09\xda\x28\x66\x03\xc5\x82\xd2\x12\x9a\x65\x7d\xb2\xd1\x7a\xdd\x35\x58\xdd\xe0\x29\xce\x27\xb8\x83\x52\xde\x3f\x95\xab\xa1\x7e\x1e\xd1\x91\x37\x22\xdb\x08\xa7\x95\xdf\xbb\x70\xd6\x2a\x88\x02\x72\x4c\xb0\xf5\x35\xf8\x48\xd0\x52\xaa\x3d\xde\x91\x66\x96\x3a\x80\x41\xfc\xcc\x4e\x60\xbf\xb1\x1d\xe2\xbf\x28\x6e\xb6\x02\xa4\xaf\x84\x2f\x4d\x1a\x34\x0d\x78\xbb\xbc\xb2\x85\x7f\x0c\x30\x8f\x44\xbb\x10\x1e\x7b\xc8\xb7\x41\xd5\x06\x09\x4e\x27\xbb\xaf\xa7\x24\x28\xef\x66\x6e\xa6\xea\x16\xf7\x99\xb4\xee\x58\x27\x8f\x04\x59\x74\xd8\x6d\xc7\x2c\xf5\x26\x0d\x96\xf9\xc0\x9b\x2f\x11\x81\xe1\xa4\x50\x0f\x92\x83\xdc\x67\x7f\x38\x4f\xf6\x4e\x51\xe8\x9f\x76\x58\x20\x20\x32\x6c\x38\x8c\x08\xa0\xfd\x00\xde\x73\xd5\xd4\x9c\x06\xc0\xc6\x84\x19\x1a\x26\x4f\xff\x72\x6d\x87\x2d\xc3\xae\x49\x6c\x7b\x47\x8c\xfc\x61\xb5\x17\x14\x19\x2f\x76\x46\x3e\x3d\x0a\xab\x41\x0e\xa1\x15\xe8\xbe\xfe\xdb\x99\x7d\xdd\x16\x99\x21\xb3\x20\x7e\xa6\x6c\x1f\x59\x45\x0b\x76\x23\x12\x9f\xd1\xe2\xdd\x3d\xa8\xf5\x20\x63\x91\x17\x13\x38\xea\x0e\xc8\xef\x3c\x59\xed\x8a\xfc\x69\xf3\x86\x5c\x29\xa0\x72\x3a\x9b\xbe\x95\xa7\x42\x68\x1e\xf9\x85\x7e\x81\xab\xc8\x0c\x92\xd2\xa7\x18\xa8\x04\xf5\x30\x4f\xef\x3c\x63\xd7\x99\xa6\xef\x87\x82\xa7\xdb\x46\x68\x1d\x0d\xe3\x50\x64\x46\x98\x22\x67\xb2\x15\x2b\x0c\x32\x18\x69\xe2\x3c\xce\x8c\x4e\xbe\xbe\xaf\x4a\xa1\xeb\xe9\x28\x3b\x69\x26\x05\x26\x0f\xf6\x21\xb0\x3c\x10\x82\x2a\xa5\xf6\xd0\x3b\xde\xf4\x9c\x46\x2a\x68\xd4\x71\xe8\x49\xe1\x64\xe3\x87\x4f\x6e\x9f\x6c\xb3\xb5\xf2\x93\xeb\x38\xae\x52\x45\xa1\x59\xec\x42\x61\xa9\xbf\x6b\x5f\x7b\x76\x15\xfd\x33\x9e\xa1\x27\x33\x11\x3c\xe7\x67\xf8\x83\xae\x66\x75\x41\x7f\xc7\x70\xb5\x0b\xd6\x0e\x6f\x20\xad\xdb\x29\xc1\xf7\x50\x62\x33\xe3\x2a\x7e\xbf\xad\xab\xff\x98\xcf\xd0\x9b\x2b\x3b\xbd\x3e\xae\x00\x69\x54\x8b\x9d\x89\x87\xaf\x46\xca\x98\xeb\x09\x5b\xac\xbd\x87\x47\x24\xba\x10\xf3\x63\x3a\xa0\x8a\xb6\xec\x26\x49\x4d\xdf\x68\x54\x30\x9b\x55\xd4\x3b\xdb\xd2\x9a\x75\x56\xf1\x2d\xfb\x23\xcd\x0d\xb4\xeb\x39\x37\xa6\x5c\x4a\xed\x96\xe8\x7b\x34\x65\x55\xf9\xfc\x68\x97\x94\x3a\x0f\xae\xe6\x5c\xcf\x39\x4b\xd8\x9b\x38\x1b\xee\xce\x25\xd1\xba\x68\xf8\xfe\x32\xc2\x3b\x33\x54\xf5\xbe\x7e\x3e\xa3\xc0\xde\xc0\xf7\xec\x2d\xd8\x3f\x92\xb7\x30\x58\x89\x2b\x63\x8d\x4c\x3b\x72\x42\xbb\x8f\x55\xbf\x08\x7b\xa4\x5a\x19\x0a\x69\x8b\xae\x67\x5e\x0c\xd5\xe8\x44\x6f\x2b\x21\xae\xb6\x3d\x2c\xae\xa0\xf6\x79\xa8\x37\xe7\x93\x57\x30\x8d\x9f\x0b\x8a\xf3\x1f\x9d\x08\x00\x8c\x39\xee\x8d\x34\x75\x28\x71\x3c\x88\x50\x01\x7a\x7f\x4a\xb9\x8a\x35\xc7\x53\x19\x40\xfa\x76\x21\xe6\x72\x03\xee\x78\x2d\xb3\xa2\xfa\xa3\x0f\x3a\xa8\x50\xa5\xff\x7a\xae\xd8\x4c\x00\xff\xd2\x14\xf2\xc9\x26\x17\x35\xfa\xc3\x25\x9d\x50\xe0\x3c\x26\x52\x50\x52\x79\xd9\x12\x51\x92\x7d\xe5\xe5\x6a\x8b\x90\x64\xcc\xf9\xf4\x5d\xcb\xef\x46\xe1\x18\x9c\xed\x2b\xc7\x9e\x6f\xf6\x52\xe6\x90\x97\xac\xe5\x56\x8b\xb2\xd5\xbe\xf3\xce\x21\xa2\x5b\x3f\x79\xee\x27\x5e\xa3\x4e\x62\x13\x80\x56\x6d\x70\x4c\xd9\x3f\x24\xdd\x90\x20\x93\x2c\xc0\x52\x18\xc2\x3b\x5b\x22\xff\xfa\x7e\x99\xee\x7f\xe4\x57\x87\x6a\x5e\x33\x64\xc9\xa8\xe8\xb0\x49\xcf\xa2\x09\x69\x77\x4f\x50\x6d\x19\x96\xcb\xe6\xef\x5a\x37\x79\x3e\xcd\xb0\x4c\xfd\xea\xed\x7d\xcf\x79\xab\x27\x84\x74\xdd\x77\x08\x22\xd4\xb3\x6f\xc6\x8e\x4b\x2d\xd6\x61\xef\x99\xde\x01\xde\x6e\xec\x57\xfa\x57\x3e\xde\x10\xfb\xbd\x5a\xc6\xfd\x6c\xd8\xbb\x4e\xee\x50\x9d\xbb\x46\x10\x37\x44\x01"}, -{{0xf8,0xd2,0x57,0xfd,0xfc,0xf9,0x97,0x96,0xf8,0xce,0x4d,0x8a,0xad,0xe3,0xb2,0x25,0xa5,0x3c,0x26,0xfe,0xec,0xef,0x39,0x5b,0x95,0x61,0xd9,0xd5,0x87,0xf5,0xa3,0x3c,},{0xf6,0x6b,0xd4,0x87,0x7d,0xf7,0x8a,0xec,0x04,0xca,0x7e,0x77,0x73,0x28,0x99,0xde,0x06,0x77,0x7e,0x69,0x86,0x29,0xf2,0x99,0x69,0xf8,0xfa,0x9c,0x2f,0x47,0xab,0x9e,},{0x92,0x35,0xd4,0x48,0x07,0x86,0x98,0x16,0xe2,0x8e,0x42,0xc8,0x1c,0x80,0x1f,0xfb,0x12,0x1d,0xe8,0x26,0xc0,0xd3,0x3d,0xcc,0x4a,0x4e,0x1c,0x93,0x2d,0x52,0x28,0xb6,0x39,0xbb,0x29,0x4e,0x16,0x09,0x0a,0x93,0xd1,0xf6,0x90,0x4a,0x70,0x04,0x22,0x2f,0xda,0x0a,0x55,0x44,0x6d,0x99,0x01,0xc7,0x23,0x40,0x00,0x7b,0xb4,0x5a,0xe1,0x03,},"\x23\x3e\x1e\xf9\x01\xab\xcb\x69\xfb\x48\x60\x85\xd8\xdb\x02\x33\xff\x78\xf3\x7b\x13\x6f\x0a\xfe\x24\xf7\xda\xc1\x94\x4c\x36\x78\xe7\x4f\xed\x58\xa1\xad\x54\x83\x5b\x7d\xbc\xb4\x6f\xff\x6c\x35\x24\x31\x22\x73\x30\x0b\x6d\x87\x8a\x93\xe0\x60\x8a\x4a\xba\xca\x4e\x31\x94\x72\x2b\xb9\xe2\x3d\x17\x19\x4d\x86\x67\xb8\x4f\x2d\xb0\x38\xc2\x4e\xfb\x8f\x53\x40\x9c\xf5\x59\x4f\xdd\xb8\xbc\xd6\x1f\x74\xcf\x07\x26\xb5\x1c\x65\x1c\xe0\x1e\xb6\x6a\x59\xb4\x55\xf7\xd8\xa7\xd6\x0d\x39\x27\xe0\xc6\xc5\x4b\x13\x8e\x01\x92\x53\x71\xd2\xd9\xd9\x62\xaa\x98\x2f\x5e\x60\x85\x28\x0c\xc0\x5f\x35\x69\x93\x91\x1f\xd2\x03\x9d\xfc\x34\x21\x17\x97\x02\x91\x38\x1d\x82\x02\x7d\xb3\x6c\x79\x91\x00\x05\x7d\x93\x52\xb2\xcd\x87\x9d\x9c\x82\xaf\x73\x4b\x7f\xa2\x97\xd2\x11\x49\xc9\x78\xaa\x5e\x12\x5b\x20\x37\x2a\x9b\x2e\x0e\xd3\x57\x33\x7e\xfa\xea\x13\x91\xf3\xb9\xef\x11\xe3\xe5\x13\x5b\xb7\x0b\xdb\xe3\x2a\x9b\xdb\x7c\x3c\x42\xd5\xd5\x7c\xc8\xda\xb6\x81\x16\x28\xa0\x10\x89\x49\x5c\xb8\xa4\xa7\x6a\x48\x29\x6c\xd8\xdf\xaf\xc0\x05\xad\x49\xd7\x0b\xb1\x9f\xac\xa2\x08\x4a\x1b\x6f\x5e\x48\xd2\x3c\x03\xfb\xcf\x6f\x10\x6d\xb7\x70\xf0\x7c\x33\xe8\xe7\xf4\x75\x7d\xa9\x04\xa4\x4d\xd0\xe7\x38\xf3\xd5\x73\x3a\x32\x93\x75\xce\xd7\x4f\x3c\x42\xbf\xcd\xbb\x91\x01\x00\x45\x5d\x6a\xa7\xd2\xe3\xe3\xaa\xa5\x8a\x82\x96\x30\xd3\x76\xb0\xb4\x66\xdc\x85\xaa\xc4\x8f\xe2\x69\x94\x6a\x7b\xc7\x2d\x91\xeb\x37\xde\xd2\xf4\xa7\x7c\x68\x4b\xe0\x10\x93\xfd\x12\xde\x9d\x9d\x83\x19\x9c\xcc\x50\x95\x9a\x48\xd6\xe9\xa4\x14\x27\x56\x60\x92\xf0\x4a\x0f\x95\xca\x52\x37\x2e\x07\x62\xb9\x66\xce\x62\x32\x05\x5a\x4f\xd7\x57\xc6\x1b\x8b\xad\x83\xba\xef\x91\xa3\xc2\x77\x2f\xb3\x2e\xad\x8f\x59\x1a\xc1\xe0\x2b\xbf\x90\xa7\xf6\xc3\x90\x79\xb8\x6f\xb8\x14\xcc\x24\x2e\x98\x0f\x0b\x8b\x1a\x2c\xec\xb8\xe6\xd4\xe8\xa5\x21\x1b\xf8\xba\xbf\x38\xe8\x29\xab\x98\x83\x60\x8b\xd6\xd5\x9e\xa5\xe8\x36\xa9\xb4\xa4\xfb\xed\xed\x1b\xea\x2f\xfe\x97\x7e\x8c\xf3\x61\x5c\xa4\xa5\x0f\xea\x1f\x05\xf1\xfe\x53\xc8\xea\xc5\x00\x32\x3e\x1f\x52\xa8\x06\x83\x15\x39\x95\x79\x88\xd7\x9a\xcc\x7b\x54\xf7\xd0\x2b\x48\x0c\x46\x9f\xd6\x95\x40\xfe\xa4\xbd\xd6\x8c\xbd\xc6\x8c\xf9\xc7\x87\x2f\xd7\x92\x59\x1b\x01\xe9\xd9\x90\x2d\x8a\x61\x4f\x4c\x21\x82\x3f\x23\x50\x8f\xfd\x49\xff\x21\x8b\xea\x92\x2e\xc1\x41\xef\xf6\x0d\xa1\x77\xcc\xad\x7d\x7b\x9d\x44\x4f\x3b\x03\x45\x81\x15\xf1\x16\xcc\x6e\x37\x62\x5c\x39\xcb\xad\xf0\x93\x62\xf3\x1d\x33\xf4\xc1\x3c\x33\xb6\x29\x20\x07\xf2\xca\xfd\x19\x4f\x62\xc6\x43\xe7\xa2\x55\x71\x56\x4f\xeb\xad\x7d\x33\xe3\x64\xb6\x33\xd0\x08\xb0\x90\xd7\xa0\x91\x35\x8b\xc6\x9c\x56\x7b\x95\x22\xb5\xc1\xcd\x01\x21\x8d\x38\x52\x9a\xeb\xb0\x3d\x9c\x2a\x5e\xb2\x28\x5a\x71\x76\xf9\x8c\x28\x03\x6f\x21\xe1\x9e\x92\xb4\x06\xe9\x48\x95\xfa\x28\x1b\x35\x22\x8f\xbf\x76\xe7\x3e\x17\x58\xaf\x1b\x43\x4a\x4d\xf9\x8e\x8c\xc5\x56\xb9\xd8\x3f\x6b\x0b\x7f\xf5\x2c\x68\x0f\x65\xef\xe4\xe0\x0c\x59\xb4\x6c\xe5\x93\xbf\x98\x89\x98\x05\xd0\x2b\x91\x65\xb7\x42\x98\x49\xe7\x39\x53\x77\x0a\xe3\x93\xe4\xf1\xf9\x7c\xb9\x0c\xd6\x15\x9c\xc9\x39\x52\xae\x8a\x4d\x3d\x56\xa9\xa9\x5d\xf7\xcf\xab\xac\xd4\xd0\x30\xd7\x36\xea\x45\x4d\xfa\x4b\x4a\xed\x1b\xcd\x88\x5d\x2f\xbe\xa5\xff\xa2\xcf\x29\x27\xc1\x37\xc8\x6b\xe4\xfe\x01\x64\x12\x62\x8f\xe7\xa0\xa0\xf0\x2b\x6b\x6a\x9a\x21\x68\x93\x2b\x94\x3f\xf8\xb2\x8d\xd5\x87\xe7\x72\x87\x79\x0a\xaa\xa6\x9a\x98\x50\x6c\x76\x4e\x6f\x5b\xa6\x33\x8c\x09\xf3\x82\xe1\xb9\x87\xd9\x9f\x14\xa3\xe1\x95\x8c\xb6\x2a\xe6\x70\x5a\x57\x7f\x9f\xfc\x67\x30\x64\x01\x12\x87\x41\xa8\xd0\xaf\x03\xc0\xaa\xaf\x6a\xf0\x6b\xd8\x8e\xe4\xb0\xaf\x67\x03\xe0\xea\x60\xb0\x40\x9a\xce\x24\x57\x2f\xb3\x86\xe0\x7e\x9c\x22\xc9\x68\x6b\xdc\x66\xd4\xfc\xf3\xc7\x46\x1d\x38\x33\xa4\xc3\x01\x32\x43\x60\x7d\x4d\x15\x82\x17\x18\x73\x26\xdf\x51\x72\x5a\x6b\xc5\x11\x6e\x99\x0b\xef\x8a\x5a\x95\x79\x60\x02\x07\x20\x6b\xfc\x3a\x6d\xcf\x07\x46\xef\x75\x6f\xd9\x39\xe1\x87\xf6\x68\x75\x07\x16\xc0"}, -{{0x8d,0xa9,0xf5,0x4d,0xa0,0xb6,0xa5,0xa3,0x89,0x85,0xb8,0x8b,0x71,0x33,0x9d,0xc7,0x38,0x4c,0xfd,0x5a,0x60,0xbe,0xe1,0x59,0xc3,0x94,0xc2,0x23,0x63,0xbc,0x7e,0xdd,},{0x1a,0xc1,0xa8,0xed,0xeb,0x21,0x7a,0xe9,0xb3,0xa3,0xde,0x53,0x0d,0x24,0xd8,0x3e,0x11,0xfb,0x65,0x38,0xcc,0x70,0x9b,0x52,0x99,0x4f,0xa9,0xc3,0xf1,0xfa,0xdd,0xc8,},{0xf6,0xdc,0xc2,0xd2,0x7b,0xaf,0x16,0xc4,0xf4,0x81,0x7f,0x87,0x49,0x91,0x57,0xd3,0xac,0x1f,0x84,0xed,0x39,0x8a,0x5e,0x8b,0x0d,0x50,0xf4,0x2e,0xdd,0x73,0x85,0xcf,0x06,0x33,0x7a,0x02,0x36,0x10,0x99,0x70,0xb7,0x9c,0xa0,0x9d,0x7c,0x98,0x31,0xc8,0x76,0xa8,0x02,0x79,0x94,0x21,0xc2,0xab,0xd0,0x75,0x87,0xf5,0xeb,0x66,0x16,0x0f,},"\xbd\x53\xba\xba\x66\x57\xd8\xdb\x8b\xec\xae\x6e\xab\xff\xa5\x2b\x01\x5a\x5a\x05\xfd\xd2\xe0\x70\x64\x7d\xe9\x6f\x9c\xa4\xdd\x21\x9f\xe0\xda\x60\x8f\xa0\x44\x7f\x46\xd1\x7c\x9a\x35\x82\x44\xcd\x54\x08\x59\x65\x82\xcc\xd3\xcd\xd0\x15\x1d\x6f\x09\x23\xe6\x3d\x16\x68\x37\x84\x5f\x27\x3f\xca\x7a\xf6\xc8\x9d\x8d\x52\x46\x17\x5c\x21\x67\xfb\xb9\xc2\xeb\xf6\xa7\x59\x54\x91\xf9\x7a\x97\x13\xb0\x2b\xdf\x41\x3e\x20\x9a\xb2\x2d\xb7\xdd\x2b\x37\xfc\x49\x43\x69\x18\xcc\xeb\xe5\x74\x6b\xc6\x4d\xdd\x6d\xce\x19\xec\x45\x58\xc4\x0e\x08\x96\xe2\x19\x09\x28\x0c\xba\x06\xd1\x6b\x72\xf3\x1d\x98\x76\x85\xd0\x71\xdb\x81\x55\xe9\x9e\xbc\xc6\xc8\x21\xd9\x26\x83\xfd\xce\xe0\x86\x68\xa5\xed\x58\xf8\x39\xd9\xed\xaf\xb9\xf1\x45\x9d\x48\xde\x8e\x1b\xb6\xf7\xce\x84\xda\x0b\xe4\x11\xc8\xf7\xbe\x1b\x9a\x24\xbc\x5d\x0f\xe3\xa9\x6b\x02\x35\x07\x50\xa5\xcb\x25\x0b\x49\x55\x5a\x48\x76\x72\xbd\xff\x3c\x3f\x78\x4e\x3f\xb6\x3c\x1c\x97\xba\x6a\xe4\x3a\x10\xe1\x96\xf1\x88\xdc\xc6\x35\xe2\x14\xe2\x9d\xf5\x09\xe5\x60\x8a\x53\x67\xaa\x28\x00\xc1\xa9\x6a\xd9\x36\xa9\xe2\xa5\x79\xb8\x59\x2e\xc1\x3a\x35\x93\x36\xa6\x27\x88\xc3\xec\x55\xc0\xff\xd6\xa7\xd4\x9e\xcb\x7c\x68\x2e\xfa\x30\x81\x99\xf7\x08\xd7\x9d\x0e\x88\x56\x36\x6d\x26\x9f\xab\x24\xeb\x1a\x07\x5c\x96\xc8\x81\xca\xb8\x97\x08\xce\xd2\x79\x23\x0d\x3f\x1f\x3e\xe1\x73\x67\x22\x83\xeb\x8d\x8a\x82\x40\x38\xf6\x48\xac\x43\x72\x75\xd7\x5a\x0e\x15\xf7\x1c\xe5\x6a\x8a\xeb\x77\x1f\x07\xa7\xf3\x2a\xfc\x9d\x61\x2a\x13\xbd\x83\xb7\xf9\x39\x90\xd3\x8f\xc3\xf4\xf4\xab\x8a\xa9\x43\x0c\x65\x73\x6e\xb6\x4b\x16\x80\x6e\x99\x5c\x1c\xe9\xdc\xf4\xc5\x54\x4e\x7b\x3d\x01\x54\x1c\x57\x21\xbb\x4b\xe4\xcf\x0a\xe3\x82\xa0\xc1\xb1\x69\xd8\xe4\x18\xde\xfd\x55\x94\x42\xac\xea\x14\xb0\x0d\x70\x5b\xcf\xa7\x8b\xe0\x75\x6a\x8f\x37\x7c\xbf\x18\x3b\xf2\x59\x06\x87\x41\x15\xd8\xce\x4c\x3b\xa8\x74\x10\x29\x38\xa4\xea\x16\x03\x6d\x91\xa4\x2c\x5f\x8f\x18\x86\x55\xca\xcb\x00\xc8\x8e\x3a\x68\x50\x88\x16\xe5\xe1\xc3\x1d\x27\x18\x0b\xbb\xa9\x51\x8a\x96\x30\x72\x6d\x7d\x04\x7d\xd8\xd2\xc0\x40\x12\x19\xe1\x4e\x6b\xad\xfc\x9b\x95\xb7\x7a\x6a\xce\x9b\xea\x71\xd1\xb4\x7c\x21\x89\x03\xa1\x15\xad\x02\x9e\x7f\x20\x39\xea\x23\xcf\xd1\xfa\x6a\x44\xd0\x89\xfc\xac\xb6\x78\x15\x3d\x67\x4c\x0e\x08\x17\x64\x99\x55\x95\xcb\x68\x94\x89\x5f\x08\xe2\x5b\x98\x4e\x3a\x69\x4c\x92\xfc\x7c\xbe\x0f\xfc\x46\x97\x23\x0b\xcb\x0c\xa4\x08\xc2\xd7\x08\x5c\x11\xba\xde\xb3\xe6\xc0\xe7\x5e\x6c\x49\x8d\xb1\xbe\xc1\xed\x2a\x3e\x24\x45\xc3\x2b\x19\x13\xa8\x95\x00\xf6\x9e\x7f\x23\xf4\x1d\x62\xe5\xc1\x89\xf3\x9a\x05\x6c\xb9\xfc\x68\xa4\x52\x02\x3a\x33\x3f\x75\x22\x0c\xb9\xb9\x44\x84\xac\xac\x6b\xbc\x67\x1f\x59\xff\xa0\x72\xb7\x1a\x18\x96\xa1\xb3\x06\xe9\xdc\x55\x8d\xa0\xec\x20\xf3\x73\xe4\xc3\x55\xe0\xc5\xec\xcb\xbf\x13\x50\xc8\xc0\x79\x14\x89\x2c\x45\x4d\xef\xce\xfb\x71\x7b\xe3\x4d\x08\x7a\xeb\x24\x4a\x86\xff\x49\xa6\xc4\x70\xaf\xb3\x6b\x40\xfe\x8b\x71\xc5\x05\xa4\xff\x7a\xf2\x98\x4c\x65\x28\x49\x38\xec\x0e\x40\x52\x31\x52\x1f\x48\x10\x14\x7d\xc4\xe3\x73\xfd\xab\x66\x47\xb8\x6f\x79\x82\x75\x02\xfd\x08\x7e\x27\xf3\x10\xd6\xb3\x12\x36\x31\x13\x84\x21\x55\xc5\x7a\x32\xba\x03\xb6\xcf\xf9\x65\x53\x0b\xd7\x95\xfc\x29\x2e\x24\x1c\x9b\x6c\xa0\x85\x14\x00\x32\xef\xe7\x46\xf3\x7d\x57\xe9\x58\x42\x11\x84\xb8\xa4\xc1\xa6\xa1\xe3\x7d\x45\xe0\x77\x31\x98\x33\x06\x8d\xdc\xb8\x9d\x38\xc7\x5b\xeb\xa1\xa6\xe8\xe4\x05\x28\x88\xec\x18\x16\x2d\xd6\xff\x0c\x59\xa2\xfd\x0b\x47\xf3\x11\x91\x95\x68\x0f\xfc\xcd\xdf\x5f\x76\xb3\x5f\x02\x2a\xa6\x6b\xd1\xac\x56\xf1\xae\x33\x3e\x9b\x9d\x04\x6f\x0b\x79\xa8\x92\xec\xc4\xf8\xd2\xf3\x1e\x17\x53\x6c\x4c\x62\xa9\xb5\xe0\x63\xdd\x2d\xce\x37\xd3\xd0\xac\xb4\x20\x23\xeb\x2f\x2e\xa3\x29\xd3\x87\x6c\x23\x86\xa0\x22\x76\xff\xf9\xd3\x08\xab\xba\xdb\x72\x74\x30\x1a\x69\x62\xec\xae\xeb\x20\xbe\xf5\xe3\x6a\xff\xfc\x38\x7c\xa8\xe1\x85\xe5\x62\xb8\x65\xb4\x92\x04\xc1\x7b\x2a\x70\x11\x9b\x06\x1c\x29\xc0\xfe\x90\x04"}, -{{0x7a,0x2e,0xfd,0x39,0x01,0x24,0xd3,0xfb,0xef,0xc5,0x4a,0x57,0x71,0x06,0xe7,0x4b,0x2d,0x1f,0x5d,0xd5,0x04,0xc0,0x50,0xd0,0xd3,0x59,0xe5,0x3c,0x0f,0x5c,0x87,0x2b,},{0xef,0xc3,0x03,0xd9,0x22,0xe8,0x8f,0x70,0xf3,0x8c,0x1a,0x2b,0x92,0x06,0x84,0xef,0x66,0x30,0x34,0xa1,0xb2,0x3a,0xb9,0xd6,0x9b,0x6c,0xe8,0xed,0x87,0x06,0xf7,0xf7,},{0xc2,0x8b,0x34,0x80,0x48,0x05,0xd8,0x1f,0x7a,0xef,0x78,0x49,0x70,0x67,0x0e,0xda,0xa4,0x17,0x23,0x2b,0xcc,0x67,0xda,0x9b,0x51,0xe9,0xc3,0xd7,0x4f,0xc4,0x99,0x1b,0xde,0x97,0xa0,0x6b,0xd5,0x3f,0xa0,0x0b,0xb4,0x40,0xfd,0x56,0x16,0xcd,0x0d,0xe6,0xe9,0xb0,0xd1,0x9f,0x2f,0x68,0xbf,0xaf,0x9d,0x4c,0x51,0x72,0xc4,0xe5,0x20,0x0a,},"\x23\x8f\xbe\x9f\xb3\x5c\x72\x5c\x6c\x1f\x32\x92\x48\x09\x4b\xc7\xda\x1b\x27\x3e\xdc\x76\x99\xa7\xe3\x45\x2b\x57\x88\xd8\x78\x67\xde\xfc\x40\xa0\x05\x90\xe8\x75\x80\xd2\xc0\x27\x5d\xf5\xab\xcc\xe0\xe1\xaa\xa1\x82\x90\xbf\x93\xb4\x4e\x5a\xd9\xd7\x60\xdd\x21\xf1\xaa\xca\x38\x31\x78\xf9\xff\xf9\x13\x0f\x73\x18\x7b\xa9\xd3\x1e\xa3\x60\x4a\x1c\xdf\x39\x11\xe1\x43\x77\xa0\xce\x8b\x44\x18\x9a\xda\xa7\xaa\xc2\x3b\x6c\xdc\x7a\x42\x5b\x7e\xa7\x45\x50\x84\x55\x70\x4f\x9a\xd7\xa8\x95\x27\x18\xc3\x98\xb4\x21\xb6\xe0\x9c\xb7\x8c\xb5\x2a\x18\x14\xee\x2e\x96\x39\xec\x68\xd3\x61\xf0\xa3\x20\x41\xd6\xe7\x42\x5b\x4b\xb3\x3c\x70\x19\x6e\x24\x00\xeb\x81\x2d\xb8\x50\x6c\x9f\x32\x45\xbd\x98\x8f\xbc\x89\x1b\xe2\x0c\xb0\x69\x15\x59\xfc\x91\x6b\x57\xff\x96\xc9\xb1\x44\x89\xe0\x99\x3c\xb7\x39\xa3\x9d\xa2\x46\xd0\x1a\x6e\xbd\x07\x58\x35\x81\xf2\x50\xbf\x48\x0b\xc4\x4b\x2c\x33\x91\x54\x2d\x59\x5e\x4d\x39\x94\x90\x19\x5f\x84\x45\xdf\x63\x8f\x34\x69\x8f\x1a\x96\xed\x27\xb3\x53\x3e\x3e\xb6\x7e\x8f\x86\x58\x65\xfa\x95\x55\xed\x34\xdf\x11\x15\x76\x41\xa0\x0e\x6d\x60\xcf\x62\x3f\xec\x1a\x92\xb8\x7a\x15\xd7\x65\x18\x5f\xd9\x05\x5a\xcb\x38\xd7\x5c\x99\xdb\x4f\xce\x7b\x0e\x39\xfd\xc3\xf8\x51\xda\xf6\x5c\x7a\x33\xf4\x64\x81\x69\x31\x83\x9f\xef\xe8\xe5\x8d\x9a\xb7\x42\xb8\x61\x87\x3f\xd2\x29\x18\x9e\x59\xcd\x4c\xe8\x23\x9f\xc9\x54\x3f\x53\x9d\x2d\x29\x61\x14\x26\x6e\xa8\xc6\xfd\x15\x2a\xc6\xb3\x42\xe5\xd1\xa5\x57\xab\x35\xca\xc5\x1e\x2d\x12\x12\xee\x31\x7c\x4d\x26\x71\x68\x29\xe2\x57\x46\xdf\x17\xd2\xa6\x22\xc2\x43\xf3\xec\xbb\x65\xf5\x7a\xb0\xf4\x27\x0e\x3d\x06\x68\xa9\x62\x50\x22\x45\xb9\x4c\x06\xdf\x0c\x5e\x39\xe3\x53\xaa\x84\x2e\xa0\x80\xcf\x50\x27\x08\xb1\xdd\xa2\xd0\x01\x82\x4d\xe4\x58\xd3\x77\x62\xaf\x2c\xdf\xd5\xa6\xd3\xf3\x5e\x08\xa1\x8e\x14\xaa\x7a\x64\x2c\x51\xe4\x04\x7e\x63\x75\x17\x84\x6d\xf6\x46\xd0\x73\x36\xfb\x17\x24\x34\xe0\x88\x3e\x2b\x77\xd8\xed\x1c\x52\xc9\xcc\x63\x6a\x56\xa1\x9e\x57\xa5\xf1\x61\xb9\x2d\x1d\xcb\xfa\x49\x6f\x34\x4a\xe6\xd4\xdf\xdc\x95\x69\xad\xe4\x57\xa4\x90\x91\x36\x2e\x5a\x0c\xdd\x81\xb3\x75\x32\x43\xfd\xac\x30\xa2\xd2\x7e\xa0\x26\xa5\xe6\x01\x44\x1e\xcd\x55\x37\xa7\x20\x1b\xdc\xb7\xfd\x58\xb2\x40\xd0\x22\x9f\xdd\x9b\xab\xf1\x12\xb5\x69\x48\x12\x25\x0e\x76\x8d\x7c\x0c\xe6\xca\x56\x5a\xd0\x6a\xb8\xf7\x8a\x5c\x99\x50\xee\xf5\x38\x72\x6f\x57\x6c\x4b\xd2\xe0\x75\x5c\x7f\x98\x39\x29\x37\x2a\x5f\xe1\x1c\x73\xf9\xe1\xfa\x45\x3a\xb5\x4b\x58\x17\xaa\xd3\x59\x67\x56\x12\x7d\x84\xe3\x11\x94\x53\xe8\x82\x5b\xb8\x46\x0d\x85\x1f\x1f\x7e\x4a\x28\x38\xa2\xbe\x78\x6b\x23\x35\x04\xa6\x91\xdb\x0f\xa2\x2a\x5f\x41\xfe\x3f\xd3\xc9\xb5\x38\xb0\x4f\x40\x9e\x09\x18\x09\x48\x6b\x28\xad\x0d\xed\xa7\xb3\x8a\x42\xce\xfc\x48\xde\x7d\x86\x79\xc0\x3b\xf8\x77\x23\x85\x11\x82\x0d\x07\x70\xcc\x8d\x7b\x41\x72\x37\x78\x23\xa0\xb9\x91\x49\xab\xb8\x91\x8b\xfb\x66\xd5\xab\xfc\xd1\x00\x60\xb0\x5c\xb4\xf2\x39\xdd\x42\x81\xd9\x34\x83\x50\x4b\x73\x1e\xaf\x5a\xdd\x51\x5f\x1f\x3c\x3b\x52\xb4\xe3\xbd\xaf\x97\x6a\x17\xb3\xc9\xec\x61\xbf\xc8\xe7\x71\x16\x71\x58\x04\x53\x2c\xf2\xdb\xf2\x0b\x7b\xa5\xea\xd8\x5a\xfb\x95\x2b\xee\xc2\xfc\xcf\xf8\x5f\xf5\x07\x2b\xa4\xed\x6b\x54\x38\xab\x15\x20\xc6\xef\x4b\x0b\x26\xf1\x2e\x84\xae\xdd\x65\xce\x5c\x7b\xbe\x6a\xcb\x67\x72\xf5\x93\xa6\xb4\xf8\x1d\xdd\x9d\x50\x27\x46\x50\x50\x47\xc8\x12\xa0\x06\x7a\xfc\xeb\x8d\xc9\xbf\xf3\x0d\x40\x87\xf8\xd5\xa3\x75\xec\xa6\x05\xa0\x62\x27\x84\xd8\xfe\xa2\x78\xcd\x1a\x52\x41\xad\x4b\x3f\x1b\x91\x4f\x74\xf7\x3b\xc3\x6e\xe7\xcc\x82\xd9\x6e\xfd\xa6\x3a\x3b\x67\x99\x73\x0f\x20\x65\x6c\x12\x35\x6c\x79\x06\x9b\x2b\xe6\xf9\xb7\x7b\xe1\x01\x98\x31\x18\x82\x3e\xa6\x6e\x7c\x20\x98\xfb\xc7\x2f\xc9\xc0\x39\xdf\xe3\x0f\x2d\xab\xa1\x3c\x3b\xde\xfb\x8a\x78\x0b\xeb\x5c\xb1\xb6\xc2\x86\xa6\xb3\xef\x48\xfd\x15\xc6\x6c\x04\x5b\xa2\x9f\x09\x70\x41\x3b\x98\x8d\x0e\xa0\x04\xab\x84\xc9\x39\x19\xf0\x4f\x9b\xf8\xca\xf5\x8c\x4e\xb4\x78\xf3\x58\xef\x8b\x68"}, -{{0xef,0x36,0x48,0xcb,0xe7,0x34,0x02,0xab,0x45,0x0c,0xd6,0xec,0x37,0xe5,0x45,0xd0,0xcd,0x2c,0x99,0x9e,0xcc,0x1f,0xa3,0x81,0xa4,0x5c,0x66,0x0e,0x18,0x53,0x30,0x32,},{0x52,0xa1,0xa4,0x52,0x73,0x87,0x26,0x76,0x58,0x2c,0xc7,0x67,0x33,0x99,0x26,0x41,0x4c,0xd5,0xd0,0x3d,0x98,0x0c,0xf6,0x29,0xdd,0xa2,0xd1,0xa2,0x05,0xe9,0x83,0x0a,},{0xf6,0x70,0x79,0x29,0x42,0xec,0x41,0x44,0x28,0x47,0x56,0x38,0x85,0x3c,0x42,0x72,0x8e,0x86,0xba,0x12,0xbb,0xe8,0x59,0x48,0xb3,0x91,0x34,0xcf,0x6e,0x2b,0xd1,0x28,0x13,0xe0,0xd8,0x3e,0x51,0xe6,0x57,0xc9,0x01,0x07,0xad,0x93,0xa4,0x78,0x8a,0xa3,0x83,0x13,0xfa,0x96,0x2f,0x67,0x67,0xa8,0xf7,0x80,0x5b,0xde,0x65,0xca,0x42,0x0d,},"\x6a\x93\x37\x8f\x88\x0c\xf0\xff\xdb\x8e\x07\xd6\x83\xcc\x35\x2e\x2a\x10\x33\xc4\x50\xba\xa0\xe8\xc4\xe1\x62\x05\xfd\x0c\x02\x74\x3b\x0e\xa0\x64\x97\x1d\x91\x1e\x49\x47\x13\xe6\xd9\x4a\x02\x17\x2e\xd0\x14\xd5\x06\x59\x2e\xc6\xc7\x0a\x9c\x97\x85\x52\x46\xbf\x3d\x26\xf3\xcf\x74\xf4\x93\xc1\xb6\x97\xa0\xc4\x14\x16\x0c\x34\x14\x12\x83\x09\x85\x43\x08\x06\xa0\xcb\x3c\x84\x75\xe7\xe5\xa9\x73\x68\x6c\x24\xd5\xef\x1b\xe7\xd0\x06\x50\x96\xfe\xb5\x2e\xab\x26\x0b\x5c\x48\x8a\xf0\x92\x70\xde\x6d\xec\xd3\x3f\xea\x85\x89\xdd\x10\x21\xba\xf4\x1e\x3f\x25\x5f\xb8\xfa\x19\x16\xeb\xd8\x53\x1e\xeb\x2f\x88\x6b\xb3\xb3\xb0\x4f\x9a\xf6\xb2\x76\xc3\x59\x23\xf1\x0d\x3a\x0a\xf1\xe3\xf5\x8b\x0d\x15\xae\xd1\x65\x04\x5f\x20\x6f\x3f\x43\x0a\xbd\xff\x09\x44\x90\x97\xe4\xb2\x6d\x00\xa8\xf9\xf1\xe8\xf7\xa1\x9f\x38\x58\x81\x24\xc3\x28\xec\x43\xa9\xcf\xb4\x3d\x3b\x2c\x6b\xdf\x6a\x3c\x1a\x10\x2e\x0e\x33\x3d\xe1\xac\x21\x4a\x6d\xf7\x6d\xab\x44\xba\x76\xbf\x03\x52\x73\xb7\xff\x62\x38\xec\x82\x48\x3b\x2d\x2d\x9d\x54\x29\x1a\x72\x27\x0f\x88\x93\x3b\x78\x6c\xac\x05\x1d\x99\x0b\x3c\xf7\x40\x84\x5f\xed\x3a\x67\x86\x7d\x7c\x7c\x05\x67\x4e\x7c\xb0\x2c\xa5\xb7\xac\xdf\xba\x38\x52\x80\x3a\x3d\x56\xc4\xd5\xc1\x3b\xb1\xd7\x72\x34\x67\x74\x1e\xac\x1f\x2a\x7a\xcd\x3a\x95\xf3\xa5\x16\x10\xa4\x86\xfc\x53\xa9\x85\x16\x28\xc5\x57\xd3\x6d\x8a\x4c\xd3\x7a\xae\x9c\x41\x74\xdb\xbd\xb6\xbd\x88\x5c\xf4\x0b\x38\x2b\x8d\xed\x24\xa4\x52\x2a\x27\x8f\xef\x76\xc4\x53\x19\x06\x7e\x55\x28\x6e\x7b\x08\xc6\x03\x48\x6e\x38\xa0\xac\xf4\x7e\xde\xf8\x48\xec\xbe\x94\x2e\xce\xad\xb8\x63\x6c\x83\x3f\xeb\x88\x2a\x51\xa4\x59\x5e\x24\xf6\x07\xca\x3c\x9d\xa1\xb2\x40\x4c\xe5\xc7\x47\xe0\x62\x64\x17\x4d\x64\x50\x43\x31\x70\x9b\xef\x30\x05\x5a\x5d\x69\x5e\x09\x53\x7c\x8f\x8c\x1e\x5a\x3a\x5d\xb0\x65\x99\xe3\x19\xdf\xdb\x28\x72\x96\x65\x27\x3b\xf8\x68\x95\x5e\xa5\x64\x27\xf0\x8b\xac\xd7\x77\xf1\x79\xb3\x02\xf3\xf6\x8d\x04\xf3\xf3\x88\x3d\x34\x49\x55\xb6\x55\xdd\xc6\xd5\x28\x2b\x6d\x4d\xf1\xd8\x36\x30\x21\x0e\x69\x91\x78\xe1\x1f\x72\x2e\x9e\x5c\xda\x67\x28\x92\xae\x9b\x23\xe8\x16\x9c\xbb\x54\x80\x93\xb8\x3e\x64\x3e\xb4\x99\xd9\x37\xd2\x8f\x38\x11\x59\x7b\x64\x84\x10\x2f\x0c\x8e\xb8\xc8\x88\x8c\xda\xc2\x29\xae\xbf\x89\x08\x6a\x64\x95\xac\x55\x1f\x3b\xbd\xf2\xd1\xc9\xa9\x3e\xd1\xd3\xa8\x61\xee\xcd\x9e\xb8\x39\x94\x9b\xfb\xe6\xa4\xf6\xe6\x48\x6e\xde\xda\xb5\x22\x9d\x53\x2b\x58\x97\x6d\x67\x51\x2f\x9f\x71\xae\x79\xb4\x14\x5c\xa2\xfa\x49\x7a\x16\x5f\x11\x07\x17\x66\x6c\xa3\x34\x0b\xbd\xa8\xdf\x1f\x82\xb8\xc0\x54\xcf\x76\x54\xc3\x56\x90\x16\x8f\x96\x27\x7d\x41\xc1\xc2\x36\xb6\x81\x98\x17\x3c\x6e\x2b\x0a\x20\x8e\xf8\x3c\x02\xa4\x3e\x47\x3d\x90\x68\x6a\xce\x75\xb5\xbd\x32\x1b\x3f\x54\x28\x13\x27\xa6\x73\xca\xd4\xd4\xad\x30\x40\xd4\x8c\xf4\x93\xea\x23\x1b\x3f\xec\x06\xf3\x99\x32\xd7\xf7\x0a\x38\x42\x8d\xf8\xfe\xe4\x37\x05\x32\xae\x5f\xb1\x12\x05\x9f\x0a\x1d\x4f\xbe\x11\xb5\xa2\x3b\xb8\x76\x35\x42\x9e\xd3\x3a\xd1\xf6\x14\x80\x14\xcb\xc1\x60\xd9\x3c\xa2\x59\x20\x53\xa6\xe9\x53\x78\xd6\xcd\x3f\x50\xdb\x52\xbe\x92\x8e\x40\x92\xfe\x5d\x2b\x70\x95\xa9\x56\x68\x64\xad\xfd\xa5\x9f\xd5\xf2\xfb\x62\x54\xbd\x59\x17\xb7\x0f\xa1\x46\x99\x66\x5a\x37\x29\x7c\x98\x3c\x1b\xb9\xef\xe1\xc6\x7b\x41\x3d\xd1\xa8\x53\x0c\xbf\x22\x72\x97\xa8\xbb\xf9\x3a\x8a\x02\x45\x4e\x8e\x46\x1a\xc2\x12\xb8\x46\xa7\x0d\x5d\x56\xd6\xc3\xa6\xe6\x5a\x03\xbe\x05\x80\x21\x9b\xdd\xec\x88\xd4\x03\x89\x11\xfd\x95\x74\x56\x3f\x33\xe0\xf9\xe6\x04\x46\x88\xd3\xdd\x48\xfa\xc7\x03\x86\x9a\xa0\x9d\x96\xef\xee\x7d\x6c\x68\x07\x1d\x99\x22\xd5\xe8\xed\x8d\xc4\x0f\x1b\x79\x8f\x1c\x58\x0f\x78\x59\xcb\x84\xf1\xe1\x4b\x5e\x74\xdd\xea\x16\xad\x5c\xbe\xea\x4c\x48\xfb\xcf\xfd\x29\x53\x1a\xcc\xc0\x63\x39\x38\xe3\xbc\xb2\x21\x26\x76\xb6\x1e\xf9\x01\xe9\xc8\x31\xa4\x17\x74\xd8\x31\x7e\xf3\x5a\xf7\x69\x90\xbd\x24\x93\x1f\xde\x6d\x40\x7e\x22\xe7\x63\xcf\x6a\x57\x90\xb2\x37\x61\x90\x8e\xee\x60\x96\x37\xa2\xc1\x10\x59"}, -{{0x2c,0x8e,0xe7,0xfa,0x9b,0xa2,0x8c,0xe7,0x04,0x96,0x76,0x08,0x7b,0x11,0x63,0xb2,0x41,0x11,0x8d,0x34,0xcd,0xf5,0x34,0xae,0xbe,0x8b,0xa5,0x92,0x82,0xa6,0x2a,0xc2,},{0x24,0x4c,0x24,0xf5,0xec,0xb2,0xdd,0x1d,0x14,0x63,0x51,0x22,0x21,0x32,0x5d,0x73,0xc8,0x1e,0xe4,0xd8,0xad,0xb8,0xe0,0x1e,0x23,0x34,0x5c,0xaf,0x9c,0xa5,0x35,0x3b,},{0xca,0x0b,0xb6,0xc1,0x23,0x56,0x55,0x5f,0x6e,0x1d,0x8f,0x5c,0x8a,0xa7,0xb5,0xe8,0x0c,0xd2,0x80,0xe8,0xb1,0xb9,0xba,0x2e,0xc9,0x55,0x0f,0x62,0x2f,0x48,0x2c,0x3a,0x9a,0xd3,0xbe,0x03,0xa4,0xc9,0xdf,0xc1,0x0d,0x01,0x12,0xb0,0x18,0x9d,0xe9,0x4b,0xff,0xaf,0xd7,0x03,0x41,0x14,0xe0,0xe0,0xd4,0x2c,0x23,0xf3,0x2d,0xc8,0x18,0x07,},"\x07\x66\x9a\x89\x64\xf0\x63\x80\xd2\xd4\x98\x2c\xb6\x34\x9d\xe5\x50\xb3\x8c\xbc\x35\xdb\x2c\xe5\x72\xde\x88\x7f\x66\x30\x55\x73\x6f\xaa\xc7\xec\x07\xc3\x2d\xf6\x0e\xe2\x59\x84\x22\xbf\x37\xe7\xcf\x31\x9a\xb3\xc9\x05\x56\x08\xca\x0c\x49\x75\x7d\x76\x88\xe2\x01\x3b\x82\x44\xf3\x54\x04\xf4\x5a\xc2\x19\x49\x7f\xe9\x24\xde\x93\xa5\x8d\x0f\x72\x1a\xed\x78\x25\xf6\x3b\x26\x67\x07\x7c\x16\x1e\xb4\xdd\x8b\xf7\xdd\xbd\xbb\xc1\x9a\x9e\xae\x59\x78\x97\x8d\x5a\xeb\x33\xa0\x6d\xde\x18\xe6\x12\xe0\x5b\xdb\xca\xe0\x16\x1a\xa2\x38\x90\x38\x02\x64\x29\x96\x0d\xda\x3a\xa1\x7e\x96\x7d\x10\x77\x3c\xa4\x97\x35\xd8\xec\xd7\x40\x9b\xe1\x65\xc0\x9b\xb0\xb5\x09\x69\x1d\x59\x1c\x18\x5c\x93\xcd\xee\xae\x95\x35\x23\x16\x54\x46\x80\x52\x38\x21\x45\x8c\xac\xcf\x52\x8a\xc0\x45\x4e\x4c\xdd\xc6\xdf\x0d\x1e\xa5\xf1\xf5\xcc\x1e\xee\xe0\x5e\x19\xa2\xad\x0b\x6a\x49\x73\x6e\xd8\x55\x23\x36\xfc\xfc\xad\xbd\x93\x1b\x0b\x8e\x96\x3b\xe0\x5c\x8e\x70\x37\x38\x85\x52\x51\x2b\x68\x23\x58\x3e\x4a\x14\x38\x4c\xef\x50\x29\x23\x2d\x3e\x0b\xaf\xe4\x66\x35\x1b\x4b\xb3\xf5\x67\x54\x5a\xb4\x1f\xa4\x6b\xff\xaf\xa8\x77\xa1\x2b\x38\xa2\x7a\xbd\x64\xf7\x7f\xbb\x4d\xb4\x66\xff\x7f\x70\x65\x04\x14\x1d\x3a\xdd\x0d\x73\x72\xf1\x6f\xe3\xd8\xc6\x9f\x62\x99\xd9\x39\x66\xd6\x24\xa3\x07\x0e\xad\xb8\xb4\x9f\x29\xfa\xb4\x84\x4c\x75\x28\xa2\xa4\x0b\x66\x98\x70\x60\x69\x5c\xaa\x66\xb8\x67\x18\xc5\x10\x49\xac\xf4\xcf\xad\x38\x53\xed\xb4\x92\xe3\x68\xcb\xd0\x73\x96\x8e\xca\xa4\xa1\xee\x60\x46\xb5\xe8\x26\xe9\x01\xf4\xa8\x08\xc0\x42\x7c\x02\x6f\xe2\xf7\xb2\xe1\x96\x86\x67\xb5\x3a\x7d\x36\xd7\x02\xf2\xff\x82\xc6\x42\xd3\x49\x19\xf8\xe9\xaa\xaf\xe4\x62\xa3\xd4\xf9\x26\x92\xde\xac\x75\x2b\xe3\x48\xf5\x4c\xf0\x89\xdd\x9c\xd0\x51\x84\x6b\x04\xb7\x19\x31\xe1\x9e\x89\xd1\x25\x86\x4b\xfa\x89\x48\xac\xe0\xef\xf3\x3c\x45\x11\x05\x69\xa0\xdf\x37\x53\xf4\xc5\x8d\x80\x02\xb5\xbc\x38\x10\x2e\xc2\xec\xf6\x95\xfa\xfa\x89\x16\xda\x90\x02\x38\x7e\x44\xf9\x6d\xab\xf8\xa9\x82\xc5\x3c\x9b\xad\xbc\x37\xbd\xe4\x37\xf1\x46\xf7\x7d\x8f\x7b\xaf\x12\x87\x31\x96\xb0\xc3\x61\x93\xaf\x55\xf5\x42\xd9\x96\x8a\xed\x80\x69\xab\x9f\xbc\xd6\x81\x4e\xc4\x72\x79\x9a\xd0\x9c\x73\x0d\x41\xed\xde\xca\x3b\x62\x69\xd3\x1a\xb5\x23\xb5\x95\x47\x07\x73\x76\x34\x5b\x05\xf2\xae\x69\xb4\xee\x72\x8c\x86\x3d\x1b\xc0\x4e\x9b\x7d\x3d\x0f\xcc\xeb\x35\x9c\xbd\x08\x58\x59\x7a\xf2\xd6\x06\x3e\x25\x3f\xae\x2c\x3f\x25\x03\x4c\x33\xed\x59\xed\xd2\x78\x28\x68\x29\x86\x81\xca\xf5\x64\xdb\x8d\x19\x36\x6f\x34\xea\xe8\x5b\xa7\x3c\x1e\x23\x89\xb0\xdd\x78\xa9\xd2\xca\xa0\xf2\x3c\x9a\xd5\xf6\xcd\x9f\x2c\x4a\xd5\xd5\x89\x46\xad\xb7\x18\xcb\x83\xda\x58\xe2\xfc\xbb\x60\x25\xbe\xf4\x66\x0a\x83\xe0\xaf\x55\xe2\x03\x08\x02\x93\x2f\x2a\x89\x6a\x09\x60\x79\xb7\x54\xc9\x9f\x7b\x64\x23\xb4\x5a\x86\x47\x2e\x67\x23\xef\x88\x96\xc4\x32\x4c\x73\xd3\x4a\xd5\x8a\x4c\x01\xb3\x8a\x97\xc7\x3b\xe5\xaa\x7f\x74\xa2\xfa\x4d\x07\x95\xaf\x6d\xbf\xcd\x6d\x4e\xb4\x42\xa7\xe2\x04\xdb\x4e\xcb\x1f\x8a\x22\x6b\xdf\xa2\x1b\x6e\xb1\x71\xc9\xe5\x9f\x1a\x19\x2e\x23\xa7\x6c\x35\x2b\x04\xd8\xa8\x02\x33\x98\x5b\x77\xa2\x9c\x02\x01\x19\xce\x65\x1c\x7f\x41\x83\xd0\xe9\xc1\x9f\xe1\x8a\xa1\x02\x0c\x25\xe4\x58\x9d\xee\x34\xb9\x01\xbd\xaf\x9f\xf9\x45\x0c\x91\xaf\x3c\x1d\xb6\x70\xb4\x77\xe0\xac\x21\x07\x69\x6c\x9e\xc0\xd3\x1d\x82\x64\x7b\x68\xea\x19\x49\x9f\xe3\x4a\x8e\x2e\x7b\x37\x8d\xc7\xe7\x54\x24\xe8\xc4\x56\x45\xb0\xc2\x81\x8e\x9f\x88\x5a\x1c\x58\x41\x5b\xba\x1c\x3f\x2a\x77\x54\x9b\xdc\x46\x80\xdb\xcd\x16\x50\xc7\x5d\x0f\x45\x2a\x6b\x20\x85\x91\xdf\x0f\xa6\xe1\x81\xda\x2a\xbf\xab\x44\x46\x21\xd5\xf7\x7c\x2c\xd7\x95\x56\x46\x72\x46\x44\x7a\x89\xf0\xaa\xac\xad\x66\x0c\x9a\x92\x5e\xba\xfb\xad\x43\xc4\x78\xa3\xc8\x50\xa2\x7e\x01\x01\x9d\x88\xa5\xb1\xdc\x81\xb5\xd2\xe9\xf7\x40\xa0\x28\xcc\xb7\x2c\x1a\xcf\x89\x7e\xa5\xad\x89\xe0\xf9\x44\x88\x88\xd5\xb1\x5c\xe6\xe4\x29\x77\xf7\xa7\x29\x15\x5a\x28\x4d\x11\x87\x58\xac\x65\xf3\xfb\xb9\x8d\xeb\x65"}, -{{0xdd,0xd8,0xe9,0xff,0x85,0x56,0x79,0x89,0x6a,0x13,0x97,0xb4,0x27,0xdb,0x85,0x43,0xab,0xe8,0xbb,0x5d,0xd1,0x22,0xe3,0xe3,0x02,0xcc,0xfc,0xe5,0xfd,0xc6,0x3e,0x12,},{0x5a,0x9a,0x31,0x2e,0x89,0x2a,0x10,0xb9,0x8d,0x0d,0xcd,0xd2,0x8d,0xb3,0x48,0x1c,0x3c,0x28,0xad,0xd5,0xad,0x0b,0x19,0x46,0x16,0xda,0x4a,0x3d,0xf7,0x66,0x01,0x09,},{0xdf,0x84,0x9b,0x7b,0xd2,0x97,0x45,0xf8,0xbe,0xcd,0xdd,0xf6,0xc9,0xba,0xf0,0x94,0xd7,0xa9,0x8c,0xc9,0x33,0x8c,0x34,0x4e,0xca,0x17,0xfd,0xe0,0x75,0xfd,0xa8,0xd1,0x54,0x32,0x99,0xf6,0x25,0x98,0x23,0x17,0xdb,0x7b,0x3c,0x77,0x3b,0x64,0xf7,0xd1,0xf2,0x86,0x92,0xac,0x45,0x3b,0x81,0xd7,0xec,0x7b,0x7e,0xc3,0x41,0x7a,0xce,0x04,},"\x5e\x8f\xee\xc5\x09\x35\x0d\x2e\xe7\x95\x5b\x6f\x3e\x27\x82\x78\xa4\xcb\x48\xae\x72\xb4\x65\x89\xe4\x78\xbe\x59\x74\x7d\xf5\x39\x4a\x16\x9f\x19\xe1\x0d\xb5\x32\x02\xa6\xa5\x23\x20\xb6\x3a\x9a\x2b\x72\x3f\xd3\x1a\xa2\xdb\x6d\x58\xc5\x73\x32\xda\x31\x78\xbc\xf9\x66\xc5\x3a\xbd\xa3\x5f\x12\xda\xef\x9e\xdc\xf3\x99\xe4\xa8\xc5\xf8\x3d\x36\xf4\x4a\x17\xd7\x98\x46\xbf\xc9\x6c\xe6\x90\x19\x4c\x21\x9a\x29\x89\x2f\x03\x67\xa7\xab\x38\x44\x83\x78\x79\xe3\x81\x8d\xb8\xd7\x0c\x4e\x3f\xba\x4d\x28\x07\x34\x64\xdf\x20\x85\x95\x10\x38\xfe\xa4\x32\x81\xb6\xb6\x06\xdc\x88\x46\xb3\x0b\x07\x63\xf2\xca\x82\xbd\x50\x21\xf9\x11\x70\x35\xa7\x7b\xcd\x10\x75\x47\x7c\x5f\x43\x21\x43\x34\xd4\xd4\xce\xdd\x18\xf7\x38\xd6\x76\xc7\xb5\x1a\x18\x5f\xfa\x8d\x04\x10\x11\x86\xa4\x95\x2b\xbd\x87\x22\xf5\x39\x90\xb6\x06\x37\x04\x1e\x11\x4a\xeb\x8c\xe7\x11\x11\x31\xd4\xdb\x3f\xb4\xd3\x5d\x99\x5a\xd8\xd6\x65\x0c\x0c\x4c\xcd\xce\x9d\xcc\x39\xdb\x18\x8a\x68\x78\x55\x62\x74\x06\x26\xb3\xae\x3e\x02\x3f\x40\x77\x2d\xed\x87\x6a\x45\xcb\xef\x74\xa0\x58\xfd\x78\xc1\xa1\xff\x2c\x24\x51\xe1\x11\xac\x1b\x4b\x7e\xe4\xc8\x1c\xd7\x63\x10\xd4\xd2\x98\xfb\x3c\x49\xf5\xe6\x40\x19\x08\xa6\x30\xfa\x85\xdb\x74\x71\x80\x4f\xe9\x90\x84\x7f\x0f\x75\x94\x72\xf5\x93\xdc\xf0\x2e\x11\x3e\x15\xe5\x64\xd3\x0d\x59\x84\x69\x2d\xa5\x5b\x0b\x7f\x22\x19\xc4\xac\x16\x26\x51\x1a\xcf\x19\x4d\xc7\x02\x6e\xb9\xd3\x67\xa4\xa2\xf1\xdf\xb5\x15\xcb\x2c\x08\xda\x4f\xe5\x95\xc8\x58\x11\x12\x0c\xba\x2a\xe7\xb6\x6e\x67\xc9\x1f\xb8\xfb\xcb\x9d\x99\xf1\x3e\x50\xfd\x67\x46\x4d\x90\xc8\xdc\xf6\x93\x55\x23\xcf\x6d\x13\xfd\xd1\x06\x35\xb9\x23\x2b\x7a\x61\xdc\xec\x9a\x2b\x92\x10\x61\x41\x0d\xf1\xde\x6a\x45\x16\x7f\xb9\xf6\xf1\x09\xdc\xc0\x88\x91\xf2\x03\xb2\x74\xa3\xb6\x82\x71\xb3\xf3\x5e\x74\xf9\x4b\xdc\xed\x0c\x5f\xf8\x63\x71\x73\xa1\x76\xe7\xda\xcc\x81\xf2\xcd\xc4\xfb\x0d\x52\xd1\xdf\xa7\xf2\x7b\x55\x2f\xd8\xd8\x7a\x1c\x55\xd6\x94\x7f\xd9\x2e\xd3\x25\x3f\x95\x94\xdb\x7d\xf1\x7a\x7f\xc6\xa7\x5e\xcf\x4f\xaa\x4d\x1e\x21\xb6\x76\xb3\x72\x7d\x77\xfb\xd4\x3f\xa7\xbe\x76\xbf\xb5\x8f\xc3\x09\xe5\x67\x5f\x0a\x85\x9c\xc4\x7f\x37\xb1\xbf\x45\x59\x32\xd8\x24\xe8\x63\x78\xde\x7a\x7e\x8c\x40\xce\xd2\x20\x90\x04\x4d\xbb\xf9\x1c\x70\xe5\x28\xea\xcd\xef\x37\x85\xba\x3c\x69\xa3\x73\x5a\xf6\x70\x9c\xd7\x6a\xab\x28\xa6\xac\xa6\xe8\x44\x97\x4b\x10\xb3\xfb\x7b\x09\x86\x00\x7a\x72\x7c\x2c\x8f\xc9\x5b\x25\xf3\x1f\x14\x6b\x36\xac\xd4\xc5\x37\x07\x49\x20\xaf\xf2\x47\xde\x0f\x17\x9c\x13\xca\x57\x79\x0a\x6a\x71\xd6\x2e\x23\x32\x1c\xcc\x75\xb7\xf3\xb0\xaf\xa0\xd0\x35\x27\xc9\x11\x4a\x7d\x4e\x30\xc1\xac\xe6\xd7\x71\x20\x13\xde\xe6\x66\x99\xaf\x9c\x56\x1c\x44\xae\x61\x98\xed\x39\x10\x4e\x60\x61\xae\x2c\x45\xa9\xa3\xc7\x4b\x5d\x0f\xbc\x4a\x33\xe8\xdf\xe2\xa8\xac\xc9\x51\x1e\xf7\xe6\x56\x71\x33\xf9\xfe\x35\x54\x28\x4a\x75\xa0\x59\xa6\x49\xdd\x24\xec\x04\xa5\x77\x30\xc6\xd2\xe9\xbf\x11\x4e\xa5\x8a\x89\x94\xab\xdb\x0c\x19\x43\x24\x15\x72\xc7\x9e\xad\x04\x3a\xd1\xc8\xca\xaf\x5c\x9d\xa5\x3d\xd0\x55\x22\xfe\xbc\x40\x33\x54\xd6\x2f\xe3\xff\x93\x88\x2d\xf7\x5f\xb2\x94\x58\xd2\x2e\x69\x96\xc3\x5b\x69\xfa\xae\xf2\xe0\xc4\x16\x38\x86\xcb\x3c\x3d\x0f\x60\xe1\x50\xd3\x63\xd6\xdb\x59\xfe\xfc\x62\x6b\x1b\xbb\x1e\x05\x2a\x62\x41\x4c\x4b\x78\x56\xd7\x20\x93\x43\x2b\x08\xf8\x21\xbc\x78\x4a\x5a\x6b\x0b\xc2\x64\x9c\x2d\xaa\x50\x86\x58\x98\x0d\x80\x22\x91\xe7\x34\xab\xaf\xf0\x6a\xfb\xf2\x79\x5e\x4e\x35\x4d\x52\x21\xdc\x4f\x52\xcc\x96\xd6\xb8\xcf\x18\x08\xb1\xa8\x20\x8d\xb7\xda\xa8\x0a\xb7\x10\xc5\x6a\x8b\x0e\x9c\xb8\x08\x1d\xee\x93\xf5\xf0\x15\xf0\x76\x64\x46\x3a\x3d\xcc\xff\x7c\x8a\xd1\x99\x23\xa9\x7e\x39\x04\x5b\xcc\x4d\xce\x0a\x73\xd4\x9c\x56\xd5\xe9\x37\xbd\x11\xe6\x18\x23\x40\x1c\x06\x62\x06\xe3\x13\xe6\x0b\x47\x53\x7e\x34\x70\x4d\x7d\x35\x15\x55\x9b\xb9\xd0\x53\x2d\x02\x8e\x28\xa5\x7a\x87\x9f\xd6\x17\xcc\x61\xf7\xf7\x76\xbd\x6a\x00\x8c\xd4\xf8\x12\x37\x8e\xd3\x7f\x39\x4b\xb9\x7e\x6e\x75\x6d\xa8\x19"}, -{{0xa8,0x86,0xf4,0xd3,0xf3,0x4e,0x32,0x0e,0xc6,0xd5,0xf4,0xca,0xa8,0x63,0xf8,0x14,0x77,0xdf,0x77,0x2e,0xff,0x97,0xe6,0x4a,0x37,0xa0,0x5f,0x42,0x11,0xd1,0x90,0xa8,},{0xe9,0xbc,0x96,0xc8,0x1e,0x87,0x81,0x10,0x26,0x8b,0x55,0xde,0xf7,0xea,0x40,0x07,0xa4,0xef,0x9f,0x54,0xd3,0x83,0xd5,0xfb,0x0f,0x6d,0x43,0x43,0xe1,0x01,0x0f,0x38,},{0xab,0xf2,0x83,0xdb,0x1f,0x80,0xc5,0x4c,0x58,0x3b,0x49,0x9d,0xbe,0x20,0xaa,0x04,0x24,0x8c,0x1d,0xce,0x12,0x1f,0x39,0x11,0x67,0x78,0x13,0xac,0x3e,0x01,0x1f,0xd1,0x59,0xad,0x0b,0xf7,0x6b,0x1a,0xa7,0xcc,0x7b,0x14,0xd7,0xb5,0x50,0x84,0x86,0x88,0x25,0x2a,0xcc,0x7f,0xec,0xe9,0x04,0x87,0x24,0x0c,0x3d,0x39,0x9d,0xd3,0x43,0x08,},"\x8b\x83\x1b\x87\x7b\xc3\xa9\x9f\x61\x3c\x89\xcd\xa6\x98\xb3\x75\x9d\x64\x38\x22\xb5\xa8\x8f\xaf\x38\x22\xec\xb2\xce\x98\xf6\x71\xd7\x55\x43\x21\xb2\x4b\x74\xb4\xe3\x0a\x66\x3f\x7a\x55\x70\xae\x91\x7f\x47\x9b\xda\x29\x89\x4b\x1a\x8c\x02\x8c\x9d\x19\x3e\x4e\x7a\xc1\x19\x16\xdd\x8e\x9c\x3f\x0e\xc0\xef\x80\xbd\x27\xfd\xfe\xee\x80\xc1\x70\xc7\x81\x40\xb2\x4c\x15\x27\x14\x15\xac\xf7\x5c\x26\x95\x6a\x4d\x4b\xf9\x9d\x40\xe8\x61\xe9\x07\x83\x20\xd0\x97\xe1\x25\x9e\x5e\xc1\x7b\x58\x3a\x95\xe5\x24\x30\xdd\x8c\x00\x8e\xd8\xc7\xdd\x1d\xe1\xbe\xcd\xd1\xe6\xbf\xec\x4b\xf3\x34\x7a\x22\xdd\x24\x9f\x3a\xc3\x07\xa2\x94\x5e\x91\x37\xfa\x4a\x8c\x26\xc8\x02\x10\x77\x23\x9c\xb3\x24\x81\x6a\x8d\xad\x32\xb0\x1e\xe3\x4a\x08\x90\x30\x98\xcb\x9c\x42\x45\x29\x1b\x90\x3c\x96\x27\x07\x40\x95\x24\x9e\x78\x28\x13\x47\x70\x32\xba\x32\xef\x04\x1a\x07\x48\x6e\xb4\x47\x8c\x57\xb9\xd5\x32\x26\x9a\x4a\x47\xcb\x5e\x97\x4d\xf7\xe0\x10\x96\xfb\xe4\xf1\xcc\xd4\xe6\x63\x66\x34\x87\x97\x4c\x62\xcd\xd9\x4d\x77\x71\x6c\x84\x79\xd7\x9f\x6b\x6a\x7d\x9c\x15\x59\x88\xcf\x39\x02\xfb\x69\x74\x24\x96\x3e\xc4\xec\x34\xff\x2a\x35\xd7\x42\xc4\x45\x5a\x59\x3b\xac\xff\xc4\xd9\x69\x9b\xa7\x62\x6c\x76\xcb\x1a\x61\x62\x53\x75\x18\x87\xf6\xff\xe2\xbe\x20\x8c\x71\x3d\xf1\xab\x63\x6d\x72\x2e\xa0\x6c\x1c\x03\xa5\x7f\x2c\xec\x08\x03\x86\x6c\xca\x33\x35\xc2\x8b\xf4\x1c\x7d\xef\x81\xac\xb3\x88\x58\xdc\x10\xe5\x94\x67\x20\x86\x24\x96\x7e\x2e\x22\xd9\xe5\x66\x1b\xb9\x45\xf9\xe0\x51\x76\x87\xdc\x80\xf9\xb8\xfd\xec\xc8\xa9\x76\x00\xb6\xc2\x19\xa3\xb2\x3a\x90\xb6\xd1\x8a\xaa\xce\x2c\x78\x40\x0f\xf3\x8c\x8c\x05\x96\x7f\x54\x4b\x6a\x60\x6c\x71\xac\x19\x9e\xaf\xd0\x7e\xb5\x84\x8d\xf1\x65\x7e\xfb\x23\x3f\xba\xba\xe6\x3a\x05\x63\x81\x91\xa0\xaf\x74\x84\xa1\xba\xe1\x58\x13\x75\x67\x2c\x57\x1e\x26\x4f\x60\x42\x25\x17\x3a\x54\xa3\x8d\xd6\x2a\xe7\x13\x0d\x05\xdd\x29\x1a\xd1\x23\x54\xde\x86\xa6\xe1\x13\xe8\x3f\x6d\x66\x85\x16\x15\x7b\x79\x67\x02\x0d\xc6\x51\x7d\x8c\xf4\x2d\xd7\xb1\xa8\x97\xfe\x1b\x4e\x04\x55\x3c\xe2\x6e\x29\x99\x80\xaa\x5f\x7c\xe0\x17\x9b\xf4\x95\x4f\x01\xc2\xa2\x36\x54\xe5\xe9\x73\x1e\x14\x47\x34\x7f\xa4\x3a\xa8\xb2\xcb\xd6\xd4\xb2\xdf\x93\xfa\x54\xaf\x71\xe5\x02\x8a\x6d\xa8\xc7\x1e\xf3\xc5\x0c\x0d\xe2\x4d\xca\xee\x78\x56\x78\xe9\x2a\xaf\xab\xeb\x23\x3b\x01\x1f\x45\xc1\x06\x49\x65\x08\x5d\x25\x47\x05\x0f\x21\xc6\x52\xaa\x53\x3a\xfe\x91\x8a\xa0\xf9\xbd\xaa\x26\x07\xb8\x73\xcc\xd3\xdb\xd1\xd3\xa8\xcc\x62\x17\x2c\xeb\x43\xb9\x21\xef\x6b\x25\xc0\x6b\x09\x92\xe4\xdf\x2b\x91\xe3\x71\xb0\xef\x2b\x39\x47\x38\x8d\xae\xc8\xec\x6f\x7e\x38\x67\xd1\xf6\x10\x72\xaf\x59\x01\x54\xfa\x61\x9a\x07\xf8\x7e\x02\xbd\xdc\x74\x06\x31\x42\x70\xaf\x1c\x15\xe8\xee\x88\xb3\x9c\x01\xbe\x60\x2e\x4f\x0b\x52\xd9\xa0\x72\x4e\x71\xed\xdd\x7f\xa9\x13\x41\x69\xc5\xfa\xab\x91\x59\x79\xee\xa9\x36\x2d\x0f\x1f\x91\x60\x26\x81\x62\xdd\x38\xdb\x02\xfc\xfb\x41\x35\x0a\xa0\x8e\x1e\x14\x09\xb2\x28\x8d\xb1\xfe\x4a\x0e\x58\x6b\x59\x10\xf4\xde\x89\x4b\xf9\x97\x4f\x6a\x49\x83\x01\x3a\x19\x0e\x7a\x73\x6d\x14\xec\x54\xc3\x64\x4a\x3e\xe9\x58\xa5\xbd\xfb\xcb\x62\x97\xab\xa4\x3a\xf6\xc7\x27\x46\xbb\x13\x54\x10\x50\x7d\x8f\xdd\xe7\x3a\x2a\x48\xb7\x46\xf9\x18\xbe\xf9\xed\x92\xc5\xbe\x62\xdd\x55\x23\xfe\x14\xb1\x6d\x63\x84\xca\x46\xef\x59\xb2\x18\x5f\xe9\x33\x38\x3a\x2c\x7a\x9b\xf0\x2d\xa9\xd0\xfd\x8b\x0c\x7d\x7b\xde\x6b\x43\x9f\x99\x60\x15\x5e\x34\x5d\x68\x5d\x4d\xc3\xc7\x14\x04\xd6\x56\x81\x19\x23\xaa\x3c\x47\xd4\xb0\x9a\x0b\xae\xf0\xa1\x2e\x75\xb6\x43\x9b\xa8\x13\x5d\xb1\x58\x65\x87\x42\x22\xcd\x7a\xa4\x28\xf5\xca\x5c\xe5\x14\x0e\x22\xff\x92\x69\x7f\x37\xfc\x70\xb5\xb4\xc9\x4d\x33\x14\xe6\xaa\x16\xb2\x14\x6b\xca\x4f\xc9\x41\x57\x95\x1f\xc4\x92\x45\xda\x53\xf6\xc4\x3d\x1b\xeb\xd8\x94\xe3\x1a\x13\x49\x88\x4d\x71\x1b\x55\xdb\xe7\x78\xff\xa7\x27\x16\x5c\xf7\xcb\x67\x64\x35\x86\x6c\x2d\x2c\xb8\x39\x74\x5c\xa4\x01\x66\xa2\xf7\xcf\xc7\x7a\x84\x24\x68\xb5\x1a\x8e\x76\x57\x5f\xc9\xdd\xfb\x5f"}, -{{0x49,0x7e,0x3e,0xbd,0x9e,0x4c,0xaa,0x81,0xc5,0xa8,0x97,0x3d,0x52,0xf1,0xd2,0x3f,0x60,0xc1,0x34,0xca,0x53,0xf6,0x2a,0x85,0x3a,0x0a,0xc0,0x43,0xe5,0x1c,0xb5,0x17,},{0x71,0xc0,0xca,0x7c,0xfa,0x05,0xca,0xfa,0xbb,0x14,0x3d,0x84,0xae,0x41,0xde,0x83,0x84,0x6f,0x42,0xc7,0x7c,0xaa,0x7a,0x91,0xa2,0xe3,0x48,0x39,0x7d,0x07,0xd5,0x2f,},{0x12,0x74,0x08,0x39,0xb3,0xc9,0xf1,0xba,0x87,0x98,0x96,0xdf,0xf6,0xd7,0x25,0xe8,0x4e,0x04,0x43,0xef,0x96,0xc3,0x49,0xef,0xf9,0x4d,0xc4,0x83,0x31,0x43,0xe5,0xb4,0x19,0x80,0x4d,0xa9,0xdb,0x11,0x8a,0x95,0x92,0xb1,0xb1,0xca,0x48,0xaf,0x18,0xf7,0x5b,0xef,0x1c,0xa4,0x68,0xa1,0xa5,0xc7,0x4c,0x7a,0xc8,0x13,0xbb,0x2c,0xf3,0x06,},"\xe1\x32\xf9\xd6\x7b\x17\x29\x38\x9b\x82\x8a\x9f\xae\x05\xa6\x7a\xa5\x7f\x0e\xf7\xe7\xd4\xd1\xba\x24\x4d\xec\x87\x04\xdb\x96\x95\x65\xd1\xca\xb8\x09\xe4\x8f\xc0\xab\xf9\x50\xbc\xd4\xa3\x7d\x97\xae\xac\xe6\xda\x54\x6d\x49\x14\xcb\x5b\x86\xd6\xab\x18\x1d\x83\x18\x70\xc3\x09\xbc\xa6\x16\x46\x8f\x2a\x34\xd3\xdf\xaf\xcd\xbb\x75\x80\xb0\xc5\xd9\xff\x98\xe2\xc5\x4e\xc8\x03\xbe\x0d\x3f\xda\x1d\x4b\x8c\x0d\x77\x09\xc8\x9e\x68\x0b\x00\x8b\xf9\xb8\xd9\x03\xb5\xe9\x34\xb0\x19\x70\x5f\xe0\xb0\xc8\xcf\xbc\x3c\x09\x67\x84\x3b\x0a\x1f\xa1\xb3\xf1\x62\x77\x6e\xbe\x96\xb7\x40\xed\xd6\x4a\xd7\xc3\x5b\x3f\xd1\xa0\x85\xc9\x9d\x16\xf5\x41\x67\x82\xde\x17\x35\x85\x87\x47\x0d\xd1\x3b\x51\x94\xf2\x0f\x23\x23\x2b\x2f\x70\x2f\x10\xaa\xfc\xaa\x59\xc7\x06\x6f\x24\xc4\xc4\x71\xe4\x2f\xa8\x6c\x6b\x9c\x5c\x3e\x1e\x8f\x83\x65\xf4\xdd\x75\xac\xb3\x2f\xff\xc0\x53\xc9\xaf\x41\xc6\xfd\x2e\xfa\xc3\x0e\xcf\x6a\x2d\xd0\x08\x5d\xe9\xb1\xd8\xcd\xc5\x0b\x16\x60\xa8\x66\xdf\x77\x67\x19\x8b\xd9\xc8\x73\x70\x61\x5d\x2b\xca\x99\xf7\x7b\x84\xd9\x8d\x7b\x24\xc9\xc2\x0f\xd7\x76\x8f\xd0\x38\x0d\x6b\x37\x36\x03\x40\xd1\x35\x98\x04\x78\x20\xdc\xed\x88\xa8\xd4\x2d\x57\x29\x37\xb6\xef\xa1\x69\x21\xa1\xb2\xb2\xd0\xeb\x93\x16\x73\x07\x08\x38\xe6\x11\xe6\xc0\x23\x29\x0d\x86\xfe\x90\x2f\x14\xac\x3a\xcd\x02\x9e\x33\x97\xfe\xb9\x7b\x17\x16\x62\x45\xab\x40\x7a\x76\x6d\x2e\x09\x04\x42\x4d\x33\xcd\x3d\x6e\x2e\x62\xa5\x2c\x65\xdf\x7c\xf0\x04\xd1\x41\x5c\x0b\x43\x0c\x11\x27\x62\x3d\xab\x27\x2a\x2c\x2e\x2b\x43\xe0\x2b\x48\x1b\xe9\x28\xe8\x99\x54\x27\x28\x32\xbe\x09\x8b\x50\x2b\x8b\x56\x43\xc6\x74\x82\xf5\xde\x44\x03\x03\x25\x81\xf0\x8a\xfb\x0a\xea\x48\x86\x85\x82\x60\x7b\xb3\x91\x98\xc1\xbf\x13\xa8\x69\xb6\x32\x58\xa7\x58\x90\xb6\x94\x45\xff\xd3\x45\x64\x02\x3e\x47\xf8\xb1\x88\x4a\x5e\x49\xb7\xd9\x42\x5f\x28\xd5\x15\x30\x13\xfe\x37\x55\xc6\xcb\x11\x4d\xb1\x80\xe6\x0b\x3d\xc4\xad\xb3\x6a\x21\x42\x81\x28\x00\x5a\x77\x2f\xb5\x71\x89\x34\x55\x65\xbb\xd1\x75\x98\x13\x52\x3b\xad\x62\x85\x5e\x79\x28\xee\xf5\x88\x0d\x3b\xff\xf1\xd0\xec\x65\xc2\x45\x92\x33\x5c\xda\x47\xcf\xcc\x5b\x5f\xa6\x52\xb4\x72\x63\x22\x52\x24\x84\x6a\x20\x9a\x3d\xd7\x76\x66\x61\xfc\xa4\xcc\xca\x59\xc4\x56\xfc\x9c\xc3\xe1\xcf\x80\x42\x55\xaa\x5f\x39\x7b\xab\x19\x98\x04\x33\x6b\xde\x29\xe5\x5c\x6c\x37\x7d\x58\x3f\x08\x2c\xe6\x47\x23\x73\x9e\x4f\x02\x46\x06\xf9\x06\xc1\x10\xd0\xa5\xb6\x10\xe5\xfe\xd9\x6d\xab\x5f\x08\xf4\xcb\x3c\xfc\x40\xa3\x55\x57\xe1\xa7\x40\xb8\xc7\xc0\x1f\x7d\x32\x79\xdd\x9c\x4e\x87\x64\xc9\x0b\xc1\x4f\x41\x61\xdb\x5a\x37\xf0\x98\x9b\x7b\xd8\x03\x5f\x8b\xea\x39\x4e\xa1\xd6\x00\x2c\xe9\xc3\x4f\x1e\x9c\x52\xc6\xa1\x5d\x15\xbc\x5b\x25\xc6\xc1\x5a\xb0\x0d\xfd\x6a\x5b\x1b\xc9\x17\xaf\x0b\x1b\x05\xfd\x10\xd0\x61\xb3\x68\x3d\x75\xb5\xf9\xef\xfb\x22\xae\x72\x08\x5b\xe4\xf6\x79\x7b\x58\xcb\x0c\xab\x56\x18\x44\x12\x1f\x98\xbf\xd9\x58\x3e\x0b\xcc\xb7\x0f\xad\x76\x98\x0a\x7a\x73\xb2\x3c\x70\xb3\xfd\x02\xf7\x75\x7c\x11\xa3\xc2\x1d\x19\xe0\x56\x50\xff\xb8\x2b\x9e\x0d\xf8\xa6\x73\x5d\x48\x01\x56\xf4\x79\x49\xd4\x45\x85\x1b\xae\xaa\x5e\xe2\x38\x14\xa4\x1b\x25\x23\x4f\xb9\x2c\xc0\xdf\x19\x80\xd0\x23\xd5\x1b\x5c\xf4\xc3\x11\x85\xc1\x18\xe3\xee\x3c\x0c\x0a\x46\xe0\xa2\xbe\x6f\x1d\x3a\xe4\x52\xcb\xb6\x6f\x0f\xd9\x19\x71\x34\x2d\xa7\xb1\xb9\x96\x58\x9d\x94\x09\x67\x81\x55\x21\x95\xc4\x33\xca\xf1\x9c\x37\xf9\xf1\x4f\xa0\xae\x15\xae\x0b\x02\xb9\x39\xe4\x02\x03\x4f\xf8\x18\x85\x93\x9d\x94\x4e\x60\x4f\x47\x4f\x21\x52\x43\x89\x39\x0f\xda\xda\x06\xe3\x0d\x69\x06\x8c\x88\x48\xcf\x0a\x95\x1e\xab\x25\xc4\x91\x25\x62\x94\x4f\x40\x24\x68\x18\x7a\x23\x23\x9d\x33\x63\x2f\x29\x12\x3d\x49\xb7\xde\x13\x08\x33\x98\xdb\xa9\x7d\xed\xe1\x2f\x79\x59\xb9\x52\x47\xa0\x8f\xc8\xe4\xb5\x39\x9d\x1c\x03\x5c\x08\x94\xcc\x75\xae\x98\x1c\x2d\xd4\x93\x54\x13\xbb\xeb\x68\x53\xfe\x04\x65\x5c\x77\xd1\x58\xc1\x23\x7b\x3e\x0d\xec\xa5\x63\x6d\x69\xe0\xdb\xc5\xac\xaf\x72\xb6\x0c\x10\xbb\x98\xcc\xdd\x60\x09\x8a\x03"}, -{{0x85,0xb4,0xd7,0x64,0x16,0x91,0x28,0x62,0x6f,0xd9,0xc7,0x82,0xad,0x61,0x16,0x22,0x9e,0xdd,0x77,0x63,0x1c,0x2b,0xc9,0xb8,0xee,0x54,0xb3,0x65,0x42,0xc1,0x49,0xeb,},{0x6a,0x09,0x89,0x7e,0x62,0x9b,0xb4,0x37,0x04,0xde,0xbb,0x67,0x15,0xc9,0xde,0xa5,0xd8,0x92,0xb6,0x34,0x30,0x64,0x40,0x99,0x7c,0x3c,0x9e,0x94,0xbe,0x8a,0xb5,0x47,},{0x4a,0x79,0xc4,0x42,0xa4,0xc3,0x9c,0x62,0x89,0x26,0x17,0xef,0x8e,0x80,0xb4,0x09,0x11,0xc4,0xb9,0xd3,0xff,0x0a,0x56,0x73,0xb5,0x7b,0xdb,0x84,0x54,0xad,0x73,0x67,0x69,0xdf,0x27,0xc7,0x8a,0x4b,0xf7,0xad,0x56,0x60,0x40,0xe7,0x47,0x27,0x8b,0x11,0xeb,0x65,0xcf,0x9e,0xc7,0xeb,0xa8,0x66,0x12,0x0a,0x36,0x54,0xf4,0x71,0x6e,0x00,},"\xb2\xa0\x49\x3d\x47\x1c\x33\x91\xf7\xad\xd1\xe2\xcf\x0b\xfb\x32\xab\x05\xdb\xcb\x14\xf6\xe4\xf5\xf3\x46\x3a\xa8\xd9\x95\x52\xf4\x33\x02\x20\x46\xd2\xf8\xeb\x76\x3c\x01\x71\xfc\xb1\xe7\x4a\x04\x9f\xfe\xb4\xb8\xf0\x10\x0b\x82\x10\xfc\xe8\x56\xb2\xe1\xa8\xe7\x39\xd2\xf9\x36\x73\xef\x8f\x8f\x40\x49\x8b\x30\x81\xfa\x1f\xd7\x85\x19\x8c\x6d\x37\x0e\x16\x2d\x41\xab\xe8\x31\x86\xf2\x32\x97\x83\x40\x8b\x9b\x88\x0d\x00\xf8\x1d\x53\x10\x0b\x42\xd2\x7a\x26\x1f\x20\xcd\xee\xd1\x9c\xc5\x8c\xb8\x63\x12\x81\xd8\x0d\xb1\x92\x53\x10\xe2\x35\xe4\x49\x66\x30\x9b\x87\x9b\xdf\xc2\x32\x22\x14\x33\xba\xe5\xca\xe4\x66\x90\xcb\x52\x7b\x67\x79\xe1\x1f\x1b\xd2\xa5\x6b\x59\xc5\x6e\xd4\xd9\x4f\xdf\x7a\xa8\x9d\xfa\x9b\xf2\x0d\xbf\xa6\xa4\x39\x8b\x98\x38\x45\x17\xe1\xdd\x5d\x2c\xd9\xce\x52\x4a\x47\x36\x2e\xf3\x2a\xc7\x92\x74\x2a\x12\x9c\x9e\x06\x13\x08\x76\xab\x5a\xd5\x51\x8e\xab\xc5\xe8\x0b\x02\x2d\x8f\xa1\x3e\x50\xd5\x5d\xed\x58\x95\x33\xe6\xea\x32\x24\x2c\x1b\x3f\xd7\xe6\x5f\x80\xde\xe7\x20\xb6\xd8\x7d\xcf\xf3\xe3\xdf\x04\xc8\x02\xd2\xe9\x14\xa8\x7a\x36\x29\xc9\x0b\xb6\x9e\x0a\x6f\x8b\xbb\x5e\xe5\x05\xf1\x43\xc9\x97\x73\x75\xad\xb0\x65\xc3\xe3\xd3\x91\xf9\x05\xfa\x3c\x33\x6c\x9d\xa4\x1e\x4a\x23\x20\xbc\xf4\x60\x97\x6f\xc7\xeb\x1f\xb6\xc6\xa3\xc3\x95\xdb\xd1\xd2\x8a\x1b\x09\xcd\xb9\xae\x9f\x9a\xae\xe4\xd9\xc5\x66\xa2\xac\x40\xad\xd8\x70\x47\x9f\xaf\x54\xad\x1b\x76\x97\x71\x0b\x4e\xb6\xf7\x32\x02\x44\xb5\x97\x57\xd1\xea\xc3\xd9\x22\xb7\xa7\x30\xb1\xac\xf0\xde\x9a\x45\xd4\xac\x87\x9d\x21\xfc\x61\x6e\xf3\x96\x5d\x74\x34\x5e\xd7\x07\x79\xeb\x68\x32\x80\xce\xe2\x5b\xf3\x73\x9b\xeb\x6b\x4c\xdf\xa2\x5d\x20\x2d\xa1\x3a\x4a\x67\x30\x40\xd9\x70\x48\x65\x8b\x92\x05\x47\x95\x05\xd0\xbe\xe4\x88\x0a\x73\x99\x7c\x70\x82\x5a\x6e\xc5\xfd\x9f\x95\x2e\x65\xfa\x02\x22\x54\x45\xfc\x3b\xdf\x4a\xde\xa3\xd4\xd2\x25\x51\xcb\xac\xeb\x38\x74\x79\x8d\x6a\x33\xa6\x66\x3f\xe3\x75\x70\x81\xd6\x24\x3d\xfd\x7c\xd2\xee\xbf\x60\xa3\x89\x9f\xa1\xf8\xf6\xc9\x56\xa3\xb1\x83\xf8\x9b\x9e\x7d\x2c\xa3\x64\x48\x58\x4d\x53\xaa\x8b\x44\xe6\x5a\xd3\xe5\x27\xf7\x87\x23\xfa\x6f\x59\x22\x42\x98\xdf\x31\xd5\xe8\xad\xa5\x67\xc8\xd1\xb1\x1f\x3b\x13\x14\x75\x53\x31\xc1\x73\x2d\xc5\x4a\x12\xa4\x35\x6e\xdd\xa4\x7e\x3c\x13\x0b\x32\x52\x82\xa3\x54\xbf\xe1\x5c\x30\x00\xd2\x07\x82\x29\x31\x79\x41\x87\xe0\x97\x3a\xb8\xef\x87\xbf\x89\xc3\x54\xa0\x35\xa8\x1f\x45\x91\x12\x23\x56\x3b\xfd\x99\xf9\x0a\x75\xe5\x3d\x01\x0d\x89\x29\xf4\xf8\x5a\x5a\x5a\x4f\x9f\xcc\x1c\x78\xf0\xa2\xfc\x46\x6f\x5f\x1c\x65\x22\xcf\x62\xa7\xbe\x37\x88\x07\x96\xe9\xb3\xca\x09\x11\xec\xca\x3f\x22\xc3\xb2\x4d\x5d\x9d\xaa\x68\x88\xf8\x9a\x8f\x71\xa1\x58\x59\x35\x9c\xea\x46\x8e\xf2\x38\xec\xf6\x46\x19\x27\x83\xa2\x57\xad\xda\xde\x90\x47\xe1\x3e\xdd\x8b\xcc\x1f\xd4\x17\x7c\xb2\x0f\x88\xd1\x19\x98\xd9\xc7\x26\x2d\x64\x8c\x2b\xf6\x6f\xb2\x27\xb9\xb3\xa9\xed\x46\x96\x2d\x22\x57\xa4\x20\xf6\x4b\xea\xd9\xe2\x86\x57\xb5\x21\xdb\x2e\x22\x16\x52\x87\x79\x1f\x3a\x1b\xec\x4c\x78\x22\xa6\xca\xbd\xe5\xec\x77\x01\x88\xcb\x74\x49\x8a\x4f\x08\xe5\xa3\xa7\x63\x9d\x24\x0a\xe3\xf4\xfd\x03\x53\xc0\xdd\xa8\xae\x41\x0b\x9f\xa7\xf4\x3f\xee\xd1\x3e\x9f\x13\xe6\xc9\x41\x0a\x1d\x24\xcd\xfc\x2c\x8e\x64\xa1\x5a\x12\xf7\x55\x45\xb0\xa5\x75\x71\x35\x23\xd4\xdf\xa1\xa4\x74\x27\xa8\x85\x1b\xa9\xac\xcc\xad\x78\xb4\xef\x6a\x18\x5f\x5c\x3b\x00\x11\x90\xdd\x8f\x37\x08\x8a\x00\x0a\xcc\xf4\x48\xbe\x8d\x49\x37\x1d\x9d\xa2\xe1\xcb\x5f\xfe\x07\xd4\x1a\x5c\x22\xe9\x46\x60\xac\x37\x13\x5a\xc8\x58\xcb\x17\x69\xcb\x66\xe8\x26\x9f\xd5\x33\x58\xec\xac\xf5\xdd\x92\xc7\xeb\x61\x86\xb4\xd4\xd6\x13\x0a\x73\x2d\xc1\x0b\xbb\x2b\xe3\x2f\x9b\x1d\x69\x51\x01\x4a\x63\x5c\x12\xd2\x2f\x0d\xc5\xbd\x5c\x2a\x3f\x96\xae\xc6\x2e\x77\x77\x94\x7e\xaa\x02\x28\x12\xca\xce\xd3\x3a\x5b\xef\x9f\xf8\x83\x5f\x88\x03\x67\xa3\x7b\x0b\x76\xd2\xdd\xe3\x96\xc6\x14\xe1\xa4\x72\x1e\x00\x0c\x00\xf1\x61\x93\x5b\x14\xa7\x38\xa1\xb7\x0f\x6e\xa5\x42\x55\xb7\x95\x18\x69\x64\x62\x12"}, -{{0x33,0xd4,0x77,0x60,0x2f,0x29,0x63,0x05,0xa6,0x71,0x9e,0xa6,0x94,0xc0,0x44,0xe9,0x0d,0x23,0x3c,0x2d,0xea,0x85,0xc4,0x6a,0xbe,0x19,0x20,0xe8,0x8c,0x31,0x78,0x49,},{0xff,0x6f,0xee,0xa0,0x28,0xec,0x34,0x6d,0xd4,0x91,0x07,0xbb,0x71,0x3f,0xdd,0xbb,0x28,0x2e,0xbc,0xd0,0x34,0xe2,0xea,0xfc,0x7c,0xdb,0x1c,0x5a,0xdf,0x92,0x63,0x90,},{0xca,0xa2,0x87,0x98,0x95,0xd4,0xf6,0x20,0xb9,0xeb,0x5f,0xed,0x22,0xb4,0x56,0x2e,0xeb,0x1a,0xd6,0x38,0x22,0x96,0x8f,0x76,0xad,0x91,0x07,0x6b,0x16,0x6c,0x05,0xee,0x20,0x86,0x4d,0x98,0xbb,0xbc,0x6e,0x79,0xdd,0x03,0x62,0xca,0xcf,0x7a,0x21,0xb4,0xcf,0xc2,0x30,0xd6,0x35,0x5d,0x43,0x12,0x0c,0xff,0xfb,0x94,0x8b,0x8f,0x6c,0x0e,},"\xcf\xea\x07\xa7\x79\xf1\x53\x7e\x49\x81\x23\xc6\x76\x29\x05\x73\xef\xcc\x5d\xb7\x02\x45\xd9\x3d\xea\x5c\x05\x72\x6f\x87\x13\xd0\x02\xae\x66\xc1\xc9\x69\x07\x47\xca\x92\x30\xb1\x62\x9d\x36\x62\xab\x73\xd6\x6b\x94\x98\x79\x16\x4b\x21\xa3\x5f\x40\xcf\x37\x99\x04\x19\x08\xed\x6f\x92\x29\xec\xb3\x90\xc5\xf2\x22\x34\xe1\xc5\xf2\x6b\x3a\xb5\xba\x59\xe7\x8c\x64\x96\x98\x71\xb4\x28\xb7\x85\x16\x77\x75\x55\xaf\x4e\x89\xc6\xfb\xc1\x93\xa9\x46\x95\x22\x6c\x6d\x32\x99\x91\xa1\x1b\xd5\x80\xd1\x89\x56\x08\x9b\x58\xa0\xe4\x2c\xa3\x5f\x6c\x6d\x26\x09\xad\xe0\xd0\xb6\x19\xd4\x89\x25\xc6\x8c\xd9\xd2\x25\x0d\xff\x27\xcf\x2f\x0d\x44\x44\x87\x09\xb6\x79\xf3\x5b\xbd\xce\x0f\x49\x6b\x0a\x16\xca\x67\xea\xce\xec\x25\x8b\x1a\xec\x91\x77\x5a\x3a\x2e\xe8\x01\xb1\xc9\xa2\x26\xa6\xb0\x01\x92\x6a\x05\x7a\x06\x30\x67\x27\xee\xda\xe8\xc5\x77\x53\x1d\xf0\x4a\xc0\x9b\x5b\x49\xbc\xde\xab\xde\xb8\xac\x4e\x8e\x82\xcf\x1e\x7a\xf8\x35\xfc\x61\x1c\xa7\xa6\x84\xb8\x35\x26\x04\x24\x15\xb1\xd6\x65\x2e\x86\x34\x31\x1e\x19\x46\x27\xea\xe7\x8d\x01\x1e\x6f\x40\xf6\x45\x79\x4e\x36\x89\x5a\x23\xe1\xbd\x84\x88\x3a\x39\x3e\xcf\xe5\xa2\x48\x02\x6a\xea\x86\x44\x70\x59\xf7\xa4\x29\x36\x8f\x21\xc8\x9e\x01\x45\x20\x79\x78\xb9\x13\xc8\x0a\x22\xd7\xca\xf2\x67\x3f\x7c\x76\xf6\xc2\x6c\xf8\x84\x41\x2e\x17\xd0\xc2\x55\x43\x0f\x50\x2b\xce\x74\xe3\xa3\x10\xd1\x7f\x6f\x4d\x48\x5d\xa2\x80\xed\x5b\x5e\xea\x6c\x49\xba\x74\x8d\x76\x48\x14\xb9\xe3\xda\xf6\xfc\xc2\x18\xc2\x74\x0c\xa7\x70\x18\xf7\x13\x44\x51\x9d\xa8\x2a\xda\x31\xe0\x01\x92\x4f\xc7\x76\x79\xe3\xe9\xff\x9f\xab\x67\xdd\x09\xa6\x19\x24\xc8\x21\xa1\xfd\x99\x9f\x74\xdf\xa3\xf8\x19\xad\xb3\x1d\x15\xe5\xed\x8a\xaa\x52\xc1\xbd\x7c\xca\x26\x67\x11\xa7\x4d\xd6\x21\x04\xef\x3c\x2b\xf7\x37\xfc\xe6\x94\x2b\x34\x8a\x33\xc3\xdf\xd6\xd9\x2a\x72\x4b\x6d\x58\x78\x42\x1a\xeb\x23\x0a\x53\x3f\xe2\x1c\x8b\x2f\xd3\xda\x59\x6a\x61\x80\xa4\x5c\x98\x6d\x7e\xce\x4c\xdc\x8a\xd6\x81\xea\xd6\x90\x64\xbb\xdd\xfc\x20\xf3\xc5\x21\x25\xf8\x33\x95\xbe\xd1\x55\x7f\x67\x18\x2b\x9f\xe9\x91\x38\xaf\x3c\x35\x6c\x5e\x65\x29\x78\xdd\x23\x8b\x76\x1c\x74\x2f\x81\x58\xe2\x31\x4b\x96\x42\x08\x33\x09\x78\xb0\x62\x0a\x13\xa1\x6d\x76\x1d\x52\xf0\x6e\x46\x6a\x40\x94\xb6\x5c\xd6\xf2\x68\x54\xae\xd6\xf9\xa8\xc2\xa8\x84\xa0\xd0\xbf\x4e\xe5\x87\xee\xb8\xb6\x02\x48\x72\x39\xa7\xe5\x81\x72\xc8\x09\x98\x3a\x8d\xb1\xc1\xfc\x7c\xe8\xc4\x8b\xc8\xa6\xfb\x81\x2d\x6a\xa9\xe8\x3a\x3a\xb4\xdd\xf7\xa8\xd4\x0d\x3f\xe0\x0e\xa1\x6e\x04\x06\x2b\x8a\xce\xb9\xc9\x9e\xef\xa4\x1f\x4f\x87\x44\x78\x28\x12\x6d\x0d\x9c\x9f\x86\x05\xe8\x46\x7c\x5e\x4d\x67\x1d\x5c\x6d\x9f\xa7\x0d\x74\x70\x98\xd9\x41\x21\x12\x23\xb9\xbc\xf2\x61\x93\x8d\x67\x04\xa3\x2d\x22\xc6\x1e\x30\xf3\x57\x0a\x1f\x5d\x09\x98\xb4\x79\x10\x80\x88\x2a\xa5\x62\x31\x67\xb6\x3a\x23\xf3\x40\xf0\xe7\xc6\xf9\xa8\x30\xa7\x5b\x74\x63\x1f\xa5\xb5\x7a\xfd\xb1\xe6\xbc\x22\x69\x9b\xb0\x31\x56\x67\x5d\x59\x83\x53\xa5\xd1\xb5\x58\x97\xe4\xc1\x10\x61\xdd\x14\x5f\x23\xe8\x53\x7c\x63\x2f\x75\xc1\x0d\xf0\x5b\x25\x54\x72\x38\x57\x40\x17\xfe\x7b\x64\xb8\xe9\x98\x69\x15\x7f\xee\x35\xf7\xad\x7e\x63\xe9\x95\x93\x30\x29\x29\x50\x3a\x96\x76\x80\x23\xb4\x12\x5a\xd7\x49\xdf\xf4\xb9\x92\xee\x5c\x2b\x4f\x3a\xda\x48\x89\xe4\xae\x62\xec\x15\xd2\xdb\x59\x69\xd7\x30\xdb\x30\x75\x47\xf6\x38\xc3\x18\x50\x32\xb1\x2f\x75\xfb\xb3\x17\xe4\x7d\xf7\xb9\x29\x2a\xe9\xe7\x6a\x2c\x0a\x06\xfc\xad\x10\x8c\xdd\x23\x5f\x6e\x38\xd9\x67\xb6\x37\x95\x11\xff\x69\x65\xc2\x2f\x2c\x66\x80\xa1\x2b\x03\x04\xeb\x2b\x29\x6c\x99\xa7\x6c\x27\x29\xd9\x8e\x0a\x78\x24\xb6\x7f\x3f\xe8\x42\xd6\xf6\xab\x27\x3e\x89\x48\x45\xb3\x2d\xc6\xdd\xfc\x7a\x22\x0f\x76\xbd\x96\x5c\x69\x85\x81\x83\xc8\xf3\x57\x39\x5f\xc5\x7d\xc8\x29\xde\xfa\xac\xb5\x60\x3a\x75\x78\x68\xd5\xe5\x62\xf9\x78\x1e\xe3\x9e\x0e\x94\x68\x8a\xd3\x54\x5b\x32\xdd\x73\x66\xb6\xb0\x47\xe8\xd1\xd3\xd5\x65\x99\x7b\x23\x6e\x7f\x75\x96\xc5\xf8\xd7\xc1\xc1\x1b\xcf\x4a\x24\x46\x20\xcb\xd2\x1d\x55\x9a\x7c\x9b\x3f"}, -{{0x70,0x74,0x56,0x86,0x11,0xa6,0x6d,0xfc,0xa8,0x30,0x7c,0xae,0x60,0x8b,0xb2,0x69,0x95,0x84,0x4d,0xf4,0x35,0xe5,0x30,0x0e,0x5b,0x4d,0x72,0x91,0xcc,0x22,0x90,0x7f,},{0xdd,0xab,0xdd,0xd1,0x5e,0xaf,0x83,0x11,0x5d,0xdd,0x06,0x5d,0x7e,0x22,0x0b,0x1e,0xfc,0x26,0x2a,0x61,0xc5,0x2e,0x91,0x43,0x47,0x44,0x2b,0xde,0x6d,0x00,0x25,0x06,},{0x7f,0x65,0x31,0x34,0xc0,0xb9,0x0f,0x44,0xa4,0x89,0xf0,0xb0,0x5f,0xc4,0x07,0x07,0xad,0x9f,0x13,0x98,0xf3,0x40,0xb4,0x47,0xa3,0xc9,0x86,0x1f,0x51,0x1c,0x9f,0x15,0x68,0x80,0x3b,0x76,0x84,0xa0,0x4a,0x89,0x8c,0x45,0x15,0x4d,0xd4,0x86,0xbd,0x50,0x75,0x89,0x98,0xe1,0x26,0x43,0x93,0x78,0xb3,0xf5,0x9f,0xf3,0x67,0x49,0x2a,0x0a,},"\x6c\x13\x74\x23\xea\xc7\x90\xb8\xe8\xe4\x18\xb2\x90\xe0\x57\x9c\x7b\x86\xb1\x4a\xed\x81\x8d\xe8\xce\x53\xce\xa3\xf3\x40\xa1\xa9\x53\x91\xf9\x84\x96\x8f\x2b\x42\x29\x28\x2a\x81\x61\xc0\x9a\xb1\x49\xcd\xac\xd6\x69\x70\xb4\x01\x3f\x52\xe5\xe6\x8e\xa8\xc9\xdb\x68\x5b\x2c\x53\x07\x35\x00\xe5\xb3\x5e\x29\xea\x0b\xa1\xf4\xd1\x59\xa5\x58\xd3\x61\xb0\x65\x16\x83\x6c\xf7\xb9\xea\x50\x1f\xa0\x50\x6b\x98\x5f\x03\x6a\x82\xd9\xe0\x84\x48\x9d\x3b\xfe\xd3\x40\x93\xe2\xd6\xd9\xed\xf5\x57\x85\xed\x35\xa9\x0c\xe5\x6c\x76\x16\x86\xcc\x3e\xa1\xa2\xc7\x6a\xda\x5e\xc8\xc1\x45\xd8\x18\xb0\x47\xcc\x51\x6e\xec\x5d\x2d\x6a\x93\xa5\x55\x92\xd8\x92\xe3\xd5\xcd\x10\xc2\x50\xc0\x4b\x04\x9b\x38\xfc\x7e\xc0\xf3\x9a\xba\x15\x82\x40\x07\x33\x6c\x2b\x0f\x7f\x81\xd6\x4d\x5c\xa3\xe2\x9d\x6f\xda\x4c\x23\xd9\xba\x65\xd9\xfe\x3c\xb4\xe0\x39\x13\x69\x72\x87\xb4\x6a\x0b\x1f\xcc\xd2\x62\x4e\x39\x7a\xe9\x5c\x52\x54\xbc\xd8\x8d\x2c\x7c\x8f\x70\xfd\xc8\x17\x3f\x64\xc1\xde\x32\x28\x1a\xb4\x18\x46\x93\xb4\x8a\x34\x9e\x67\x82\xbc\x89\x92\xb4\x3c\x7d\xe7\xcb\x9d\x33\x92\x9b\xf9\x53\x06\xc2\xaf\x7e\x93\x8d\x84\x86\xb3\x86\xf9\xfd\x3f\x0f\x71\x61\xe0\xe6\x86\x2d\x4f\x92\x81\x44\x68\x65\xa1\xc9\xbe\x24\x60\xef\xbc\x20\x15\x1b\x06\xe7\x9d\x01\x46\x17\xd0\x30\x0e\x67\x1d\x48\x76\x74\x58\x59\x66\x25\xb7\x6d\xff\xc5\x58\xaa\x9b\x40\x61\x21\x96\xec\x82\x7e\x1c\x6f\xff\x51\x8f\xb7\xad\x4b\xf8\xc4\x6f\xcb\x27\x88\x85\xaa\x49\x1b\x77\xa2\x89\x95\xcf\xb9\xd7\x96\x40\xaa\xd1\x74\xc6\xdf\x43\x93\x8e\x3f\x13\x85\x20\x5c\x54\x59\x5b\x33\xde\xde\x50\x14\x37\x46\xa1\x70\x5e\x7e\x0b\x69\xaf\x4a\x26\xc3\xb7\x65\x15\x05\x18\x92\xb1\x5c\xa6\xe4\x8c\x3d\x91\xfb\xc7\x5e\x8f\xe4\xa0\xfe\x8e\xd2\xc2\x6c\x10\x73\xbe\xb7\x0e\xa3\x8d\x09\x27\x02\x92\x78\x40\x67\x55\xae\x6e\x11\xda\x37\x86\x53\x64\x95\x15\xe0\x08\x5b\x5e\xa7\xdb\x32\x49\x20\x8e\x33\xa6\xc8\xb6\xae\x8c\xd8\x0c\x9b\xd6\xb9\x83\xe7\x3e\x9b\x91\xdb\xec\x09\x1f\xae\x99\x5f\x80\x32\x42\x7e\xde\xc0\x2c\xad\x90\x55\xeb\x8b\x7d\xbc\xfa\x80\xd4\xf6\x4f\x57\x27\xa1\x52\xf1\x1c\x47\xe5\x2d\x75\x3a\x57\xb6\xe5\xfd\xdf\x77\x4c\xea\x4d\xa9\x10\x02\x68\x19\xc4\x1e\x32\xb4\xf1\x99\x72\x7e\x23\xc5\x4a\xb5\xd7\x01\x42\xb8\x54\xa2\x7b\x04\xe6\x4c\xf4\x4a\xf2\xa8\x99\x5e\x12\x00\xbd\x11\x7c\x7a\x16\x74\xed\xef\x59\xbc\x53\xf7\x3a\xda\xf6\x38\xe0\x77\x3b\x85\xb5\x63\x34\xaf\xf6\xe1\x17\x43\xe3\xa3\xd3\x61\x4a\xa8\xa3\x75\xb3\x78\x1e\xc8\x14\xcc\x08\xe7\x1e\xfa\x78\x18\x51\x9c\xb2\x4a\xf8\x2c\x33\x1d\xfd\x6a\xc7\x8e\xc1\x7f\xd7\x17\x4b\x61\x02\x1e\x8c\xf9\x01\xa2\xaa\xa6\xad\xbc\x90\x2a\x91\x6b\x2a\x2f\x4f\x79\xe5\x51\x50\x1f\xbf\x01\xdf\x6b\x85\x18\x50\x4c\x1e\x94\x64\x69\x38\xbe\xd1\xa8\x50\x9c\x2a\x38\xfb\x6a\x79\x8a\x78\x58\xf4\x09\xb0\xf2\xfb\x9b\x3f\x48\x17\xe5\x68\xc5\x2d\x9a\xbf\xe2\x16\x8c\xc3\x65\x0f\xc4\x3e\x0f\x99\x75\xfe\x29\xe3\x3a\xed\x1a\x7b\xf3\x0d\x86\x31\x15\x07\x90\x65\x0a\x3c\xb7\x8c\x36\x8f\x1a\xea\x9a\xc6\x0c\x5e\xeb\x96\x9a\x45\xf8\x4a\xa3\x73\x66\xa8\x39\x77\x19\x0f\x41\xae\x42\x1e\x0c\x46\xfd\xa3\xfa\x01\xb9\x26\xfc\xef\x82\x24\xfd\xa3\x6d\xf4\xf8\xa8\x77\x01\xfe\x79\xfe\x06\x28\xef\x0c\xc0\x2d\xf2\xbd\x78\x32\x07\xc7\xdb\x87\x11\x9a\x03\x69\xfe\x16\xee\xb3\x8f\xdc\x9f\xb3\x5d\x9e\x19\x5f\xe1\x4f\x8c\x10\x38\x20\x8a\xb9\x77\x00\xaf\x79\xf2\xe2\xe0\x54\x96\x83\x02\x07\xc7\xda\x8d\xbe\x8e\x9b\xb7\x3b\xc4\x71\xa4\x3f\x1b\xe6\x50\xfa\x92\x81\x9a\xeb\x5d\xc7\xee\xd7\xee\xd8\x17\x12\x70\xd2\x19\x25\x7d\x19\x61\x0b\x89\xd2\xd6\x2d\x3f\x5b\x64\x8e\x13\x9e\xed\xf1\xff\x74\xbe\x01\xa5\xef\x1d\x95\xf8\x12\x92\x26\x01\xee\x92\x51\x51\x57\xc4\xec\xad\xfa\x3e\xef\x9f\x2a\x67\x7c\x00\x3c\xa4\xab\x9b\x2c\x45\x47\x2c\xe5\x5e\x18\xf4\x0a\x21\xfe\x1b\x0d\x45\xb5\x0b\x50\xc5\x2a\x0b\x1a\x5d\x7c\x37\xd8\xeb\xc1\x5e\x02\x05\x84\xd9\xed\xd7\xb5\x65\x05\xf8\x20\x78\xe0\xf8\x99\x38\x91\x35\x01\x4c\x86\xd1\xe2\xed\x49\xf9\xcd\x31\x90\x76\x94\x35\x53\xa3\x12\xae\x05\xab\x33\x35\x26\xe1\x36\x71\x4f\x09\xa4\x02\xb3\xc8"}, -{{0x7d,0x7c,0xa8,0xe8,0xd3,0xb8,0x43,0x44,0xa5,0xe4,0xde,0xa0,0x8b,0x33,0x8d,0x8f,0xaa,0x5f,0xfc,0x11,0x9c,0xe5,0x66,0xef,0x65,0x6f,0x0f,0x45,0x84,0x77,0x5b,0x21,},{0x0b,0xde,0x34,0xb7,0x46,0xd2,0xc5,0x49,0x08,0x53,0x06,0x4d,0x48,0xc6,0xb4,0xc1,0xcb,0xbc,0x3e,0xe7,0xbe,0xff,0x5e,0x8f,0x68,0x4c,0x12,0x0f,0x31,0x5d,0x7e,0x4e,},{0xd0,0xc3,0xe2,0x48,0xa8,0xcb,0x2d,0xdc,0x7e,0x9f,0x21,0xc9,0xc5,0xb0,0x09,0xf7,0x0e,0xa2,0x9d,0xa6,0x89,0x7c,0xd9,0x2c,0x26,0x0f,0x04,0x7e,0xd6,0x8a,0xa1,0xc8,0xb9,0x65,0x7f,0x9d,0x82,0x6e,0x88,0xf4,0xa5,0x12,0xc5,0x00,0x3b,0xe6,0x40,0x68,0x80,0x74,0x12,0x63,0xae,0x7c,0xe6,0x86,0x0e,0xfe,0x73,0xad,0x54,0xd4,0x82,0x04,},"\x0b\x72\x70\x75\x34\x5d\x61\x9f\x5c\xdc\x7f\xc4\xc4\x3c\xdc\x19\x10\x58\x11\xd9\x5d\x06\x9f\x81\xc0\xa6\x2f\xe1\xe1\x17\x8c\xf1\xc3\x5d\xb0\x5e\x2d\xe8\x7d\x11\xae\x1a\x6f\x53\xef\x38\xb3\x9b\xf4\xed\x8f\xbf\x56\xef\x01\x7a\x1d\x3c\x15\xb6\x4f\xe4\xb2\x61\x0b\xf6\x9b\xd1\x9a\xc7\xaf\xd4\x6a\x2b\x87\xb4\x88\xb6\xc7\x8a\xd4\x56\x81\x1c\x1d\xd6\xbd\x4a\x6b\x5d\xa6\x98\x73\x9f\xd1\xa1\x4c\xeb\x9f\x27\xf1\x24\xb6\x9f\x6b\xd1\x6d\xe5\x53\x7a\xad\x80\x68\x1c\x56\x33\x58\x03\x94\xda\x3b\x84\xe9\xb7\xa5\x5e\xba\xb8\x52\x2d\x2d\x6b\xf1\xaa\x4e\x7b\x15\x9c\xbf\x4e\x20\xb5\x0b\xfe\x9c\x71\x1a\xa0\x47\x11\x9f\x1d\xad\x87\x49\x26\x0b\x87\x63\x9e\x9c\x14\x1d\xef\x62\x02\x6a\x99\x03\x73\xdc\xfd\x99\xf7\x7b\x0f\x5e\xa6\xad\xfd\x8f\x59\x4b\x9c\xe4\x10\x64\xa5\xed\x30\x7b\xf2\xd8\xd1\x73\x70\x49\x8a\xd7\xf4\x5f\x9c\x4d\xd2\x6c\x42\x0f\x45\x0f\x53\x62\x3b\xb6\xd7\xf3\xf4\x6a\x14\x9d\x8f\x13\x5b\xc2\x91\x33\x10\xfb\x8f\x90\x43\xd0\x99\x27\x8b\xbe\xba\x39\x17\x9f\xa3\x67\xb0\x16\x73\xe1\xc9\x53\xef\xfd\x2c\xae\xa7\x31\x1c\x47\xc0\x37\x27\x44\x09\x5b\x1c\x8f\x90\xee\xf5\xf1\x92\x9d\xb1\x99\x6c\xd5\x84\xf6\x15\xd5\x6f\xae\x3a\xec\xac\x3e\xe8\x8b\xd0\xb2\x96\xf4\x49\xcc\x27\x13\xc5\x2d\xa6\x95\x24\x8f\xaa\x8e\x38\x9b\x05\xa0\xbc\xac\x69\xdc\xe9\x71\x97\x23\x19\x4f\x43\x3b\x02\x97\xeb\x08\x59\x01\x9f\x14\x1a\x20\x7c\xe8\xcc\xb5\x98\x82\xca\xa6\xe1\x8f\x0b\x43\xbd\xdd\xb9\x0a\x0a\x85\xff\xd5\x77\xd6\x39\x4a\x1d\x80\x48\x94\x10\xf9\x2a\xfb\x85\xba\x50\x6a\xa9\xf3\xf4\x27\x44\x5d\x21\x22\x4b\x9c\xb0\x46\xc0\x5f\x1b\xac\xd7\xb7\x49\xfb\x7b\x10\x24\xd0\x92\xe4\xee\x4b\x30\xa4\x6e\xdf\x71\x84\x70\xc9\x94\x91\xc6\x8f\x48\x79\xd6\x2b\xfc\xe7\x04\x6d\x81\x38\xcb\xb9\xe7\x21\x29\x99\xa4\x49\x8b\x45\x5f\xc9\x0a\xc2\x83\xe9\x35\xde\x04\xdf\x6f\xc9\x99\xe4\x43\x4b\xe1\x10\x63\xd6\xe4\xee\x9e\x09\x6a\x87\xbc\x71\x6d\x2c\x81\x99\x16\xc3\x7a\x4e\x62\x98\xc4\x99\x45\x36\x6e\xc3\xf5\x00\x72\x0b\x06\xdc\x99\xd3\xd8\xac\x30\x3e\x6c\x26\x4e\x28\xa7\xc2\xd4\x19\xec\x62\x2a\x97\xa7\x11\x54\x4f\xb1\xf4\x73\x5b\x11\xf8\xbb\x1d\x7e\x2c\x81\x6a\x15\x62\x87\xb4\xcc\x0c\x65\xaa\xa2\x80\xb8\x37\x73\x7f\x0a\x84\xe3\x6d\xe2\xdf\x2f\xc3\xa5\x0d\xf9\x80\x91\x8f\xb9\xe5\x83\x4b\x42\xac\x0e\x0c\x72\x78\xd7\xfe\x8d\xb4\xdb\xde\xca\x01\x41\xd5\xfe\xf5\xdc\x61\x51\xf8\x7b\x86\x34\xc2\x41\xa8\xfa\x0a\x82\x71\x78\x99\x77\x3a\xe8\x9f\x53\x78\x90\xb9\x15\x5a\x7a\x05\xbc\xe4\x78\x66\xec\x20\x28\xa4\x78\x98\xd4\x85\x82\x3a\x2e\x99\x23\x19\x68\x0e\xb6\x99\xb0\xdd\x53\x58\xf5\x46\xfc\x53\x7c\x73\xd3\xa4\xb2\x23\xa0\x94\x15\x18\xb6\xd1\xe6\x6b\x27\x67\x6c\x1b\x1f\xc7\x6a\x08\x32\x05\x24\xa7\x2e\x29\x7f\xce\x17\xaa\x80\xd8\xea\x7b\x38\x8a\x55\x16\x8e\x7d\xad\xb8\x36\xe9\xde\xe7\x07\xed\x25\xc0\xee\x4d\xb2\x5b\xee\x3c\x48\x5b\x39\x64\x92\x04\xef\xaf\x28\x20\xb2\x73\x63\x68\xfc\x77\x3c\xe0\x90\xc3\x85\x37\x80\x02\xc4\x71\xb0\x94\x79\x5c\xb2\x66\xd3\x9e\xb7\x58\x0d\x70\x1b\xe4\xc8\x91\x6f\x6b\x38\xbf\xe2\x5f\xdf\x36\xd6\xc4\xad\xaf\xa9\xae\x98\x64\xc5\x7b\xb7\x37\xb4\x95\x06\xed\x38\xd6\x2d\xe6\x0c\xc0\x59\x9e\xc6\xbb\x1a\xcf\x24\xb1\xd3\x7d\x60\xef\xde\xb7\xd9\x42\xc5\x36\x03\xa2\xf0\x47\x6e\x95\x12\xc9\x38\xb2\x8d\x49\x5a\x6f\x26\xa9\x07\xc3\x96\xb8\x41\xae\xdd\x8e\x14\xac\x44\x7b\x49\x5d\xf1\xf6\x76\xda\xcc\xd5\xa7\x40\xc0\x42\xf5\x77\x2b\x7d\xb1\x7f\x4f\x1a\x3a\x1c\x8e\x7c\x48\x83\x70\xe7\x36\xb5\x1e\x69\x0f\xd2\xdd\xcb\x5a\xa6\x19\x57\xa7\xc7\x97\x5a\xcb\x2d\xcb\x91\x5d\x07\x4d\x74\x42\x79\xea\x1c\x41\x69\xf8\x68\x87\x3a\xc5\xc2\x08\x90\x16\x2c\x1d\xf9\x65\x64\x19\x97\x5a\x43\xd3\x19\x8e\x18\xc3\x09\xa1\xeb\x7c\x1d\x87\x87\x3f\xb1\x5c\x6d\xa4\x7f\x54\x8a\x01\xf6\x9b\xda\xb9\xc3\x9e\xf0\x0d\x41\x8a\x6f\x61\x9d\xd7\x3d\x7d\xb4\x5c\xbb\x6a\xd2\x25\xa2\xde\x78\x7b\xa7\x77\xbc\x73\xd2\x8f\xc3\x04\xf1\x00\x09\xf4\x02\x2c\x2c\xf8\x4d\xe0\x08\xd7\x0f\xcd\xc8\xba\x7f\x10\x7c\x36\x98\x59\xe9\xc9\x0c\xa8\xa3\x93\xb5\x53\xf2\x66\x05\xff\xd7\x23\x0c\x92\x14\x90\x70\x0f"}, -{{0xd2,0x1f,0xdd,0x7b,0x10,0xe5,0x4a,0x8b,0x6b,0xe9,0x5a,0x02,0x24,0xad,0x70,0x66,0x4d,0xd9,0x21,0x12,0xe2,0x68,0x3a,0x4f,0xd2,0x79,0xc4,0x07,0xdb,0x38,0x71,0xbb,},{0xf8,0x9c,0x27,0x2e,0x7d,0x1c,0xc9,0x3d,0x69,0xf6,0x94,0xde,0xc9,0xcc,0xe0,0x5a,0xc2,0x47,0x73,0x45,0x04,0x82,0x9c,0x56,0x99,0x74,0x13,0xc8,0x95,0x8b,0x93,0x30,},{0x6d,0x69,0xe8,0x3b,0x3e,0x7e,0xd5,0x5a,0x85,0xf9,0xfc,0x9d,0x25,0x19,0xda,0x0b,0x0a,0x1e,0xb4,0xda,0xae,0xe9,0x91,0xa6,0x65,0x1f,0x5c,0x89,0x19,0x0c,0x0d,0xe7,0x23,0x73,0xcd,0x98,0x9d,0x46,0xbe,0x13,0x67,0xf9,0xda,0xf1,0xb9,0x2f,0xed,0x3b,0x52,0xbb,0xa5,0x4a,0x1e,0x4c,0xca,0x5b,0xc8,0x72,0x6e,0xd0,0x7f,0x30,0x25,0x01,},"\xb8\x64\x4a\xdb\xef\x9c\x7c\xab\x91\x20\xac\xed\xc8\xe7\x5c\x43\x3d\x03\x6f\xfa\xe0\xf9\x55\xbe\x6a\x48\x8f\x1f\x42\x7a\x68\xa8\x90\x2d\x02\x6e\x63\xdd\x6c\x9b\xf9\xd9\x7d\xe7\x86\xb3\x1d\xd4\xf4\xc9\xa4\xf8\xa6\x22\xf1\xff\xc8\x4d\xa6\x96\x7c\xa7\x74\x33\xc3\x98\xf4\xd3\xf1\xc4\x43\x49\x89\xb7\xac\x9d\x0f\x3b\x1b\xe0\xc8\xb3\x52\x82\x4f\x4e\x7a\x08\x3f\x34\x2e\xc1\xbe\x1d\xa8\xfb\x75\x52\x42\xa6\x54\x88\x0e\xf2\x98\xf0\x59\x79\xff\x02\x6d\xdc\xc0\x44\x86\x0e\x67\x57\xa2\x9c\xfa\xa2\x22\xa3\x59\x7e\x38\xf1\x77\x99\x62\xa4\x1a\x4c\x8c\xe6\xa6\x5b\x87\x81\x99\xb4\xd8\x0f\x4a\x03\x90\xca\xc1\x9c\x22\x6e\xea\x4b\x60\x36\xe5\x7a\xd8\x30\xec\xfc\x00\x69\x3e\x26\x13\xd3\xed\xf4\x65\xfc\x8c\x4f\xa2\x93\xfd\x8c\xfc\x36\xdc\x8e\x37\xbc\xeb\xab\xec\x03\x49\xeb\xd8\x84\xe1\xb2\x8b\xce\x82\x4e\x0d\x55\xb6\xd0\x15\x38\x38\x01\x66\x8b\x34\xf5\xba\x72\x3d\x2a\xc0\xa2\x64\xfa\xb2\xc7\x28\x60\x8f\x16\x2d\xe0\x11\x79\x25\x9b\xe2\xcc\xb0\x81\x50\x02\xfd\xed\x8e\x0d\x78\xb0\x28\x07\x31\x3e\x91\x0e\xb3\xa7\x33\x7c\x53\x4e\x84\x6f\x9e\xe1\x55\x42\x6e\x4a\xef\x64\x36\x61\xb0\xed\xb4\x45\x96\xfd\xdc\xd0\xb3\xe8\x14\xc1\x37\x81\x7a\x42\x2b\xaa\x40\xc9\x05\x3d\x03\x86\xc6\xec\xdb\x58\x90\x52\x59\x47\x42\x67\x7c\x48\xdc\xfc\x8c\xd4\xa9\x36\x67\xed\x4d\x87\x64\x60\x01\xed\xa0\x79\xe8\xb9\x9d\x52\xba\x21\xc5\xec\x56\x69\xfe\xdf\x6f\x40\x44\x7a\x7f\xf8\x90\x1d\xb0\xef\x18\x47\xd3\xca\xcf\x01\x98\xa2\xf3\xbd\x7b\xcf\x2d\xd8\x11\xa0\x97\xfc\x5e\x51\x88\xb0\x3f\xdf\x54\xe5\x17\x63\x7a\x14\x50\x10\x00\xd0\xd3\x55\x16\xca\xf0\x69\x94\x02\xb4\x8f\x8d\x8c\xc3\xaf\xb1\x7a\x56\x13\x2d\x08\x23\x70\x35\xa0\xc9\x54\x90\xbf\xe5\xd7\xb7\xfb\x40\x17\x8f\x28\x1e\x4d\x87\x2e\x47\xa0\xe9\x55\xce\x97\x36\xf3\xc3\x33\xa6\xad\xf5\x0a\xd3\x19\x94\xeb\x9f\x45\x32\x7f\xac\xc8\xc5\xd1\x13\xfa\xd4\x71\x3f\xe7\xf1\x98\x01\x0d\x42\x04\x6b\xbf\xe6\x8b\x0d\xaa\x79\xdc\xb8\x75\x59\x29\xbe\x92\xf9\xca\xa1\x50\xdf\xbd\xe3\xfc\x9e\x39\x2b\x2b\x70\x1c\x30\x21\xc2\x40\xe4\x67\x9d\xe4\x11\x24\xb1\x88\x8e\x5d\xb5\xa8\x3d\x05\xce\xaf\x49\xeb\x44\x0d\xc4\x50\x26\xd4\x50\xbc\x98\x4b\x8d\x6f\x02\x85\x0e\xcb\x57\x0e\xee\x0a\x38\x19\xb1\x2b\xc2\x63\x67\xb5\xb9\x8e\x1b\x14\x1c\x9b\x0a\x96\x90\xea\x4a\x37\x00\xda\xd1\x23\x95\xf9\x75\xd1\x1c\xd7\x7f\x96\x36\x88\x31\xf2\x1f\x4e\x96\x8c\xc5\xba\x9e\xf8\x24\x74\x03\x8b\xc7\xaa\x26\x12\x2d\x21\x8b\x74\x30\x41\x50\x6a\xeb\xbd\x1f\x98\x79\x59\xfd\x16\x0d\x6e\xb7\xd5\x8d\x4f\x57\x6f\x8c\x0c\xa8\xaf\x86\x8e\x39\xb5\xea\x87\x20\x39\x37\xe0\x30\x8a\xcb\xea\xe9\x1e\x10\x60\x7e\x44\xe8\xab\x49\x5b\xc0\x1d\xd5\x73\xfb\xad\xc9\x44\x79\xff\x92\x08\x2c\x7b\xb7\x51\x34\x79\xc7\x0f\x04\x07\x76\x90\x25\xd3\x4d\x72\x14\x0c\x25\xd8\x21\xf0\x34\xa3\x98\x51\xa9\x3c\x62\x3b\x71\xc9\x40\x0e\x94\x26\x39\xf2\x8b\xbd\x03\x2e\x1d\x8d\x3c\x05\x9f\x7c\x2c\xd3\x1d\x74\x76\x46\x2d\x27\x76\x03\x5d\x07\x88\x02\x02\xdb\xfe\x9e\x07\xd1\x54\x62\x2d\x7a\xc6\x17\x5a\x5a\xfa\x79\xfe\xd4\xdc\xc1\x37\x12\x62\x0c\x41\x99\x4e\x11\xd9\x24\x30\x8f\xb2\xff\x3a\x1e\xda\x44\xc7\x61\xbc\x73\x6f\x34\x51\x22\xf0\x2a\x40\xae\x6f\x7d\xbd\x03\xd9\xfe\x96\xee\x3d\x7a\x3b\x4a\x5e\xef\xbf\xcc\x56\xdc\x42\xef\x27\xbd\x80\x85\x17\x60\x38\xb9\xeb\xae\x63\xaa\x75\x03\x52\x75\xec\x34\xe4\x18\x57\x39\xd6\x36\x24\x67\x70\xac\xcc\xc6\xdc\x62\x0e\x2f\xc9\x15\x6f\xa9\x48\x3e\x0d\x9c\xae\x0e\x8c\x46\x39\x48\xa3\xd9\x7a\xe8\xdd\xa5\x96\x6c\x88\xf0\x70\x93\x29\x2c\xce\x22\xbb\xda\x06\x2b\xaa\xfa\x7f\xe8\x4d\x0b\xa2\xd2\xdd\x29\x5b\x23\x45\x8b\xca\xeb\x2e\xf7\x42\xa2\xed\x1c\x83\x44\x83\xcd\x70\x93\x85\xaf\xea\xdc\xbc\x0a\x9c\x6a\x4f\x38\x7b\xab\xf7\xe3\xdc\x36\xc8\x10\xdb\x20\x9b\xeb\x66\xc8\x66\x64\x04\xc6\x61\xdf\xe9\xd3\x2c\x4c\x08\xaf\xc6\xf3\xb1\x25\x7d\x64\x84\xa7\x55\xf5\xac\x70\x1e\xb1\x3f\x87\x76\x3f\xee\x33\x0f\xfa\x04\x22\xcd\x80\xa9\x20\x38\xc6\xf4\x52\x92\xbd\xee\x5f\x89\xe9\x4c\x7a\x65\x21\x97\xfc\x19\x06\xb4\x82\x58\x37\x24\x49\xb1\x08\x1c\x6b\x97\x13\x4c\x43\xc8\x9e\xe2"}, -{{0xd3,0x36,0xfd,0x84,0x08,0x19,0x6d,0x22,0xfb,0x69,0x8e,0xb2,0x5b,0x76,0x54,0xfd,0xa4,0x6f,0x5d,0xe4,0xc9,0xb4,0xd0,0x49,0x50,0xc3,0x98,0xb5,0x9a,0x44,0x29,0x0a,},{0xf3,0xcd,0x96,0x34,0x7c,0xea,0x63,0xe5,0x00,0xa4,0xc9,0x2c,0x3b,0xf2,0x15,0x66,0x2d,0xd0,0x40,0x07,0x84,0xdb,0xf8,0xb5,0x95,0xdd,0x3d,0x39,0x5f,0x90,0xcc,0x12,},{0xaf,0x7e,0x2d,0xf7,0x52,0x9f,0xd1,0x8d,0x1b,0x21,0xb8,0xfd,0x4c,0x06,0x81,0x50,0x59,0x18,0xe2,0x51,0x14,0x34,0xfe,0x4e,0x49,0x54,0xe7,0x43,0xc1,0xcf,0xa4,0x5e,0x41,0x09,0xd3,0x6c,0x3e,0xec,0xf2,0xe2,0x5d,0x20,0x9b,0x9b,0x5d,0x25,0xf7,0xcb,0xc3,0x80,0x29,0x6d,0x64,0x77,0x52,0xe3,0x0d,0x3b,0xea,0x3b,0x92,0x9b,0x09,0x03,},"\xfb\x49\xc1\x9b\xc4\x44\x4c\x28\xeb\x26\x25\xf3\x1d\x99\x6d\x5e\x36\xc5\x7f\xa6\xfd\xd7\x72\xe6\x7b\x71\x99\xce\xc6\x7e\xda\x54\x51\x71\x2d\xf7\xa6\x9d\xbb\xd5\x6e\x7c\x39\x87\x96\xb2\x00\x1d\xef\x65\x1c\x4b\x9c\x05\xee\x31\xd9\x56\x79\x53\x5c\x81\x2a\x37\xd3\x1d\xdb\x30\x73\x19\x9c\xd7\x04\xff\x7c\xa2\x98\x1f\x7b\x9c\x92\x7a\x7f\x7d\x77\x6f\xb6\xf6\x09\xf7\x27\xe6\xea\x70\x9c\xe7\xf4\x3a\x60\x79\x35\x04\x16\x9a\x89\x05\xd9\xb2\x31\x09\xf0\xd8\x67\x96\x6a\xa3\xe3\x00\xc7\xe1\x1d\xde\xdb\x9c\xc1\x17\xb9\x04\xf6\x29\x27\xe4\x8e\x4d\x73\xfe\x1a\x6c\xec\xcc\x4c\xeb\x08\xe6\x4a\xb5\x5f\x25\xc9\x82\x16\xce\xc9\x37\x60\x8a\xd7\x93\x14\x69\x98\xf1\x4c\x29\x85\xe6\xc2\x91\x0d\xf7\xb1\x38\x8f\x9d\xd8\x63\xf1\xe4\xd7\xd1\x62\x14\x79\xb8\x51\x2c\xdb\x34\xe6\x73\xeb\x02\xa4\x89\x34\xe3\x9c\x2d\x18\xd7\x0f\x96\x6d\x67\x6a\x2b\xd7\x5d\xb5\x43\xd2\x5c\x5d\xcd\xc3\xef\x3b\x8b\xc8\x20\x18\x48\xc3\x09\x61\xe9\x15\xd9\x68\xbd\xc3\x19\x46\xb0\xd1\x8e\xde\x7c\xb0\x16\x6d\xbe\x1f\xfe\xff\x94\x39\xc9\xc3\x40\x4a\xf6\x01\x6c\x73\xed\xeb\x25\x3d\x93\xf5\x62\xa1\xa6\xcd\xd5\x78\x98\xa9\xb3\x42\x25\x87\xd5\xf5\x6a\xf3\xd0\x6b\x3f\x6c\x25\x75\x1f\x44\x46\x0f\xb3\x29\x96\x56\xdc\x11\x22\x7e\xf4\x83\x7a\xab\xdd\xee\x40\x0f\xa5\x3f\x69\xe5\xce\xd0\x53\xc7\x6d\xce\xcd\xf0\xad\xc9\xef\x80\xf4\xb3\x30\x54\x2f\xf1\xfa\x2d\xf0\xb8\xd4\x3c\xd1\xc3\x11\xb1\xb9\x95\x5c\x63\x2c\x8e\x5f\x04\x91\x93\x1c\x04\xde\x43\x4d\xf8\xf7\xa3\x94\xe5\xfe\xf0\x16\xdb\x2e\xb7\xc8\x7b\x2a\xc7\xa4\xa7\x30\x43\xbd\x7f\x98\xad\x0a\x4d\x45\x3a\xbf\xb0\xbe\x8b\xe4\xcb\x14\x57\x42\xaa\x56\xaa\x5e\xf2\xdf\xf1\x22\x30\xa5\x10\xe3\xb7\xf8\x2f\x78\x47\x70\x0e\xee\xa5\x90\x5b\x02\x89\x69\x6c\x4c\x14\x2b\xf3\x4b\xcf\x81\xa9\x62\xd7\x5b\x8d\x09\x10\x55\x73\x37\x79\x33\x5b\x7f\xd4\x7a\x20\xd1\x7c\x94\x8a\xb7\x32\x94\x78\x32\x67\x43\x71\xe2\x2e\x71\x11\x34\xf5\xc9\x19\x79\x23\x57\xf7\x9b\xf7\x0c\x44\x70\x78\x75\x28\x43\x4f\xc0\xb4\xca\x09\x3e\xe9\x25\x43\x42\x0d\x1c\xa8\x11\x24\xf5\x58\x53\x17\xe2\x50\x82\x1a\x4f\x3d\x8c\xe0\xf9\x19\xde\x9f\xbf\x01\x27\x08\x7e\x67\x69\x03\xf6\xcb\x39\x02\x5b\xcc\x73\xa0\x76\x29\x54\xb7\x2e\x66\xa6\xbe\x9b\x96\xc9\x7b\x6f\x60\x30\xbf\x5c\xa0\xbc\x27\x27\xa9\xa1\x79\xcf\x9d\x94\x05\xf3\xfe\x18\xf3\x49\x23\x89\x07\x9a\x5b\x65\xbc\xb1\x3a\x0d\x5e\xf4\x1c\x2c\xd9\x7e\x70\x2c\xee\x4a\x2f\xeb\x1e\x67\x02\xbd\x4c\x63\xfe\x0a\x4a\xe9\x94\xc4\x28\x7a\x83\x7b\xc3\xf6\x4c\x2d\x89\x88\x57\xcd\xb3\x2a\xcd\x4b\xd1\x33\x67\x6e\x51\xf7\x7b\xc7\x11\x0e\x3c\xe5\x2d\x92\x04\xfd\x26\x91\xa6\xd3\x70\x78\xf6\x8e\x7b\xce\xf3\x0f\xc9\xc4\x83\x98\x58\x22\xb6\x61\x11\x92\x38\xe4\x0f\x9c\xfd\xca\xbe\xf2\xd7\xb1\x6b\x05\x9a\xb2\x4a\xdc\x05\x00\x37\x12\xbb\xb1\x28\x09\x6e\x37\xf9\x1b\xc4\xc5\xc8\x15\x08\xbe\x27\xfa\x0b\x84\x94\x0b\xe3\x6b\xce\xd2\xe6\x5c\xd3\x6b\x39\xfb\xdc\x5e\xa6\x86\x14\x15\x92\x28\xca\x65\xc5\xd8\x40\x7b\xaf\x66\x3b\x52\x8e\x7d\x87\x73\x4c\x7b\xc7\x7d\xc8\x43\x1a\x1d\xd6\x87\x3c\xfd\xdf\xc3\xe7\x57\xd9\xad\x1f\xed\xd3\xc7\x98\xf1\xfe\x60\xe7\x15\xee\x48\xa6\xbc\xbb\x13\xb6\x16\xa8\x9a\x38\xe3\x36\x48\x9d\x3d\x6c\xcb\x72\x69\x14\x11\x2a\x1b\xc5\xd9\x77\xc9\xb2\xa3\xfa\xc1\x07\xad\x09\x4b\x03\x8a\xb7\x54\x68\x26\x3c\x34\xbd\xa8\x17\xc0\x56\xe0\x7a\x6c\x56\x69\x7c\xb6\x4a\x0b\x1f\x96\x6f\x6d\xe0\xbb\x1c\x0a\x71\xc8\xa5\xfe\x13\x3b\xa2\x03\x6d\x24\xda\xcc\xad\x3f\xa0\x3b\x39\xcd\x27\xf8\x32\x75\x27\x51\x05\x5a\x81\x55\x91\x3d\x04\x0f\x51\xda\xe7\x8d\x71\x94\x6c\xa0\x4d\x83\xc7\xc8\x94\xc2\x80\xaa\xec\x28\x55\x43\xe5\xfd\x5e\x32\x7a\xcc\xca\x9a\xbe\xf1\x56\xa1\x3b\x95\x71\x44\x6b\xd8\x00\x7f\xf9\x2d\xbc\x0f\xba\xf2\x3a\x94\x41\xb5\x3c\x1c\xd7\x40\xc3\x4c\x28\x29\x29\x10\x1a\xd2\xea\x8b\x85\xd7\x00\x52\x99\x1b\x77\x4e\x92\xff\x75\xcc\x85\x11\x3e\x09\x00\xb5\x1b\x86\x3e\x1f\x2a\xda\xab\x2d\xbc\xf4\x6a\xf4\x79\xea\x24\x8e\xc2\x88\x9a\xfb\xfe\x73\x74\x08\x39\x3a\x2b\x1b\x33\x01\xf6\x5c\x1f\xac\x8b\x67\x67\x95\xab\x5b\xf4\x47\xf0\x5e\x0d\xaf\x67\x76"}, -{{0x65,0x73,0x22,0x78,0x41,0xf6,0xf9,0x28,0x31,0x14,0x6c,0x44,0xc0,0xe4,0x80,0xcd,0xf5,0x44,0xbb,0x87,0x65,0x52,0xcc,0x5f,0x9d,0x42,0xf1,0x5b,0xdc,0xc0,0x44,0xb8,},{0x19,0x22,0x57,0xa5,0x4c,0xe5,0xd0,0x4c,0x19,0x43,0x9f,0xdc,0x9e,0xde,0x18,0xec,0x85,0x6e,0x29,0x87,0x0e,0x24,0xd3,0x73,0x1f,0xe2,0x22,0x47,0x99,0x94,0x9b,0x7e,},{0x53,0x8e,0xac,0xe4,0x93,0xde,0x53,0x38,0x4b,0x1e,0x98,0x5b,0xb9,0x07,0xc0,0x94,0xf8,0x16,0x84,0x30,0xda,0xb1,0x4d,0x37,0x79,0x1b,0xe6,0xe7,0x8f,0xf3,0xf5,0xa3,0x06,0xec,0x70,0xdc,0xac,0x86,0xd9,0x93,0xa4,0xc1,0xf7,0x58,0x50,0x78,0x6d,0x79,0x5f,0x02,0x2b,0x79,0xbe,0x6a,0x54,0x77,0x69,0xe4,0x15,0x69,0xc5,0xa9,0xa3,0x0a,},"\x6e\x7c\x6b\x12\x2a\xb3\x6b\xd1\x35\xf6\x9e\x2b\x85\xe7\xfc\xce\xfb\x07\x2c\x12\xcf\x08\x8a\x32\x29\xd8\x76\xef\xf5\x32\x38\x9f\x05\x77\x11\x6f\x7a\xf2\x9f\x11\x95\xe3\x82\x88\x39\x38\x13\x80\x46\x71\x78\xb2\x29\xc5\xa1\x8d\x7c\x49\x43\xec\x97\x0d\xd1\x8b\xce\x72\x3b\xd0\xca\x91\xff\xa9\x55\x63\x54\x6a\x32\x4f\xe0\xb9\xbf\x6c\x04\x55\xd4\x27\x60\x39\xe8\xd2\x91\xfc\x72\x76\xaa\x55\xa1\xcd\x3e\xa0\x52\x82\x65\x4a\x7f\x97\x00\xad\xcb\xc7\x80\x77\xc5\xdd\x0f\xc8\x6e\xce\xd4\x8f\x4a\x60\xcc\xb7\x6b\xfb\x8b\x45\x62\xba\xc2\x2a\x02\xd1\x9e\x44\x89\x39\x4a\xb9\x71\x9f\xc1\x44\xf5\xdb\x2e\xf0\x39\xb3\x7f\x3b\x51\xd1\xd6\x57\xa0\xcf\x83\x5d\x71\xf1\xa4\xaf\x01\xeb\x9f\xd8\x85\xc6\x04\xa6\x24\xcb\xe9\x10\xbf\xde\x09\x3a\xd3\xf0\xcb\xfd\x9a\x48\x30\x73\x29\xd4\x42\x34\xbd\x01\x19\x1d\x56\xe5\x22\xd7\x2b\x54\xe1\xfe\x47\x33\xda\x3a\xec\x68\x27\xea\xb3\x55\x48\x98\xe0\x3e\x57\x7b\x4e\x7b\x9d\xd3\xf3\x08\xe6\x16\x80\x8d\x02\x94\x49\x9f\x28\x86\x29\x5e\x54\xc3\x60\x19\x9c\xa8\x3a\x83\xff\x46\x19\x5e\xa3\xc4\x84\xa6\x68\x38\xd5\x1a\xcb\xe9\x61\x1e\xee\x03\x6a\xe2\x81\xc6\x79\x3c\xbd\x45\x1f\x92\x71\xfb\x5d\x25\xea\x7c\x18\x99\xab\x5d\x43\xed\x8b\x9d\x06\x7b\xc5\x6d\x8d\x4a\x15\xf1\xda\xb8\xd8\xd9\x5d\x1b\x17\xaf\x64\xcb\x18\xc1\x14\x75\x51\x14\x7a\xdd\xcb\xdd\x53\xfb\xcc\xd9\x02\x6f\x85\x55\x47\x13\x1b\xee\x95\x07\x16\x39\xf6\x49\xf2\xd0\x35\xa2\x5a\x3e\x42\xe3\x8e\x22\xbb\xf0\x38\x10\x6c\xe8\xbc\x4a\xd6\x76\x8a\xb9\x2c\xd5\x7a\xfa\xcd\x04\xee\x55\xcf\x07\x14\xb7\x68\x95\x2d\xac\x24\x0b\x1e\x9b\x28\x35\xec\xf7\xb0\xd6\xc4\x07\xc8\x25\x24\xa9\x23\xb9\xf5\x4d\x1b\x8f\x12\x56\x4a\x87\x21\x44\xef\xad\x3f\x3a\x7d\x23\x97\xcd\x12\x17\xdc\x5a\x9c\x96\xe4\x3b\x29\x60\xa8\x42\x5e\x97\xe0\x7a\x02\xb0\xda\xc9\x0f\x34\x6b\x91\xa3\x46\xa2\x3e\xd2\xbb\x7f\xe6\x91\x9c\x22\xdf\xf0\x3f\x62\xda\x7d\xba\x17\x6e\x8d\xdb\x22\xf3\xf3\xa6\x68\x89\x1d\x3f\x4e\x69\x54\x8d\x0a\xc4\xe7\x1e\x6d\x28\xed\x5a\x67\xab\x5a\xc6\x11\xd4\x60\xb6\x7a\x20\x1f\x4f\x56\xa5\x00\x3c\xa7\xa7\xd1\xcd\x1d\xb6\xc1\x00\x75\xb0\x92\x27\xcb\x8c\x5d\xc1\x66\x6f\x8b\xe7\x10\xb4\xb7\xbc\x2b\x95\xae\x60\xda\x4f\x64\x17\x9a\x50\xd2\xf8\x87\x44\x36\x15\x91\x67\x1d\x36\xb7\x29\x63\x15\xf6\x99\x64\x39\xad\x79\x82\x1d\xa8\xe7\x72\xdf\xbf\x55\xa9\x0d\x5d\x52\xef\x7d\x76\xb3\x5f\xfe\xbd\x42\xe3\x52\x5f\x45\x30\xc5\x4a\x0f\x23\xb4\xd0\x7c\x5f\x59\x74\x47\x0e\x89\x40\x4d\x17\x6e\xef\xf9\xef\x23\x33\x61\x96\x91\xc5\x9b\x7a\xad\xd4\x2c\x29\x6b\x1d\x0d\x32\x8d\x9a\x3b\xd5\x9a\x54\xbb\xa9\x3a\x0c\x1f\x1d\x62\x41\x8c\x21\x90\xc3\x81\x74\xb6\xab\xea\x02\xdb\x66\xe8\x18\x32\x0e\xc4\xb8\xba\xc1\xc1\x2f\x18\xf3\x0d\xad\xe2\x7e\x63\xc5\x8f\x9e\x7c\xaf\x4b\xf6\x9b\x26\x5a\x2f\x9d\x91\x80\x08\x61\xac\xf4\x79\xe6\x5e\xc1\x7e\x68\x05\x77\xe0\x58\xcb\x16\xc1\x09\xbc\xf9\xb2\x90\x9f\xce\x33\x61\xa2\xc2\x68\x5c\x10\xbe\x85\x40\xa1\x22\x2d\xb5\xec\xf0\xcc\x4d\x53\xa4\x21\x4b\x7b\xf6\x24\x8a\xdc\x3a\x86\x1e\x34\x84\x1a\x37\x79\xc4\x60\x46\xc5\x36\x4f\x1e\xa9\x1a\x78\xc9\x70\x0d\x46\x2e\xcf\xaa\xe3\x6b\xa7\x60\xc1\xbd\x6a\x23\x7c\x96\x1e\xdf\x40\x22\xce\xde\xfe\x5e\x93\x7b\xbe\xd7\x05\x1a\xe6\x1b\x96\xd0\x8b\x04\x87\xce\x05\x68\xff\x0d\x32\x74\x0b\xbd\x49\xad\x0d\xb8\x6e\x09\x10\x2a\xb2\x1a\x91\x56\x16\xe9\xdf\xdd\xc8\x1e\xbf\xb3\x6c\x90\x3e\x07\xa4\x0c\xd2\xdd\x11\x9f\xf4\xa5\x0b\x93\xfc\x6f\xdf\xc0\xf3\x6e\x59\xe0\x14\x8f\xcf\xf3\xfe\x8e\x2c\xd6\xd3\x0a\x9e\x4b\x8f\x01\x55\x67\xd1\x18\xb6\x27\x4e\x1e\xd7\x5b\x22\xe4\x4c\xa9\xd9\xdb\xfc\x16\x07\x42\xcf\xac\x58\x1e\x1a\x0b\xf5\xff\x33\x26\xbc\x5f\x78\x96\xb9\xca\x05\xa8\x11\xd5\x5e\x97\xc8\x34\xd3\x7a\x64\x95\xcc\x26\xcf\x44\x2b\xd2\xd9\x01\x29\x89\x5e\x9c\xc0\xed\x01\xe2\x15\x52\x93\xf4\x7a\x07\xab\x58\x80\xc6\xca\x29\xed\x44\xd9\xcc\xbc\xaa\xda\x7f\x3e\xb6\x04\x02\x18\x14\x88\x65\x4e\x04\x91\x15\x78\xb1\xaa\x9c\xdd\x4b\x86\xb0\xdd\x24\x50\xdf\x3a\x43\x08\x1e\x41\x10\xab\x58\xde\x76\x39\x24\xd3\xc8\x91\x52\xe9\x92\x93\xe6\x38\xf9\xac\xd8\xd7"}, -{{0xa6,0x3c,0x1f,0x54,0xb2,0xca,0x05,0x8f,0xed,0x2e,0xe2,0x50,0x4b,0x98,0x3f,0xf3,0x3d,0x57,0x0a,0x9b,0xab,0xa5,0x83,0xc0,0x86,0xce,0xfe,0x19,0xf4,0x3e,0xc4,0x9d,},{0x32,0x9b,0x86,0x6b,0xca,0x41,0x94,0x29,0x7f,0xc1,0xad,0x5a,0x0e,0xba,0x0d,0xf9,0x56,0x69,0x9c,0x74,0xab,0x7d,0xa5,0xfa,0x54,0x62,0xbd,0x06,0x61,0x47,0x10,0x20,},{0x28,0x33,0x59,0xbe,0x41,0x29,0x0a,0x51,0xe6,0xa7,0xc5,0xd5,0x72,0x5c,0xa4,0xea,0x0a,0x68,0xf1,0x4a,0xca,0x14,0xb0,0xf0,0x25,0x66,0xde,0xe2,0x1f,0x49,0x0d,0xa3,0xc7,0xe9,0x5f,0x7a,0xb7,0x39,0xbc,0x35,0xa7,0xf4,0xf2,0x32,0xe9,0x71,0xaa,0x15,0x76,0x57,0xa6,0x33,0xeb,0xa0,0xe7,0x2d,0xc9,0x7a,0xf3,0x2c,0xdb,0x92,0x87,0x02,},"\x79\x1b\x86\xfd\x58\x77\x13\x47\x8f\x92\x34\xff\x30\xce\xfc\x12\x3c\xd7\xc3\xeb\x12\x5f\xa7\x4e\x4c\x6d\xb6\x4e\x78\x44\xf7\xc8\x5b\x16\x86\xe7\x1e\xd0\x8d\x1a\x6a\x04\xe0\xeb\xbd\xff\x4a\xb1\x60\xc9\x76\xc8\xab\x9b\x50\x5f\x6a\x7e\xb0\xa1\x84\x27\xe9\x99\xa8\x82\x8d\xf1\x06\x84\xf8\xc7\x5b\x6a\x6b\x0a\x64\xc0\xaf\xa4\xbb\x22\xbe\xd1\xcb\x93\x25\x35\x9c\xac\x3b\x8c\x50\x8d\x98\xbc\xb0\xeb\xcd\x74\x8d\xc1\x32\xf1\xd6\xa3\x60\xa4\x45\x0d\x12\x92\xa1\xfe\xfc\x4e\x57\xe4\x10\x7a\x22\x3f\x42\x1e\x7d\x14\xa3\x84\xb8\x5c\x18\x84\x4d\x0b\x9e\xed\x2e\xcb\x81\xbb\x74\xe8\xa1\x26\x52\xd9\x85\x05\x79\x5a\x01\x31\x16\xa7\x07\x6c\xcb\x54\x93\xd6\xa7\x11\xf7\x63\x7e\x97\xa7\x80\xe7\x4d\xa1\xb3\x9b\x15\xcc\x7b\xbd\xe2\xe6\xc4\xd0\xd3\xe8\x30\x05\x97\xc8\x36\xe8\x0b\xcb\x8d\x80\x81\xd9\x74\xe0\x24\x32\xea\xc8\x83\x68\x21\x1d\x3a\xaa\xe8\x9a\x14\x41\x71\x08\xe1\xff\x67\x37\x08\x38\x49\xc6\x25\xb4\x0d\x63\x1f\x6c\x83\x57\x22\x0c\x7f\x37\x38\x0b\x3b\x2c\xc5\xd0\xe2\xdf\x6b\x4d\x11\x96\x57\x9d\xbc\x57\xb6\xc9\xea\x0d\x41\xf4\xfa\x0e\x55\x6f\x94\x3c\x94\x48\xef\x42\xfc\x78\xdf\x59\x96\x64\x8c\xe2\xf3\xde\x04\xd8\xa6\x63\xf9\x67\xf3\xd9\x33\xd4\xf6\x53\x57\xab\x29\xba\x5b\x64\x05\xfb\x16\x29\x72\x57\x8d\xdb\xb2\x36\x7b\xed\x14\x3c\x85\x4c\x10\x88\xde\x92\x1d\x79\xf5\xa9\x2a\x85\x48\x37\xeb\x77\x02\xe1\xba\x92\x5c\x6e\xac\x23\xd1\x34\xba\x1b\xaf\xc5\xd4\x6d\xe2\xa1\x94\x2c\x7f\x36\x6f\x70\x1b\x0a\xfa\xbb\x75\xcb\x1d\x80\x8e\x1a\x1e\x4e\x3a\xe5\xde\x88\xe8\xe9\x98\x97\x57\x45\x8b\xdd\xd8\xa8\x06\xc1\x10\xcc\x3a\x73\x3d\x1d\x4a\xc5\x8a\x40\x5c\x4d\x81\x13\x4f\xbc\x24\xcc\xde\x7d\x5a\xfe\x42\x0f\x9f\x17\x85\xf0\xa5\x02\x0f\xaf\xbb\x22\x61\x22\x25\x08\xaa\x05\x28\xb7\xb4\x8b\x56\x72\x00\x95\x84\x25\xef\xcb\x42\x93\x4a\x88\x0b\x13\x34\x44\xbb\x10\x9f\x2a\x95\x4c\xfa\x35\xa2\xd1\x7c\xb0\x5e\xe3\xf1\x6d\x06\xb3\x21\xa1\x5f\x91\x33\x9a\xbe\xda\x24\x3a\xd6\xc0\x91\x9f\xac\x51\xe9\x07\xe0\x53\xfd\xee\xd1\xcf\x03\x00\x37\x34\x13\x77\x93\x94\x1b\x8a\xdf\x9a\xb6\xaf\x81\x9c\x24\x5d\x6d\x56\xf1\x69\x64\xc8\xa7\x5b\x07\x56\xa8\xcb\x0c\xa8\xc1\x2a\xc6\xe6\xb3\x94\x2e\xeb\xec\x2f\x86\x88\x35\xf8\x1b\x10\x9d\xb4\x98\xa4\xca\x2e\x02\x1f\xa7\x65\x60\x8d\x23\xd8\x03\xde\xdc\x9e\x51\x45\x3f\xc1\xd2\xa6\xa3\x8a\x4a\xab\x25\x7c\x0f\xe7\xd6\x7d\x32\xa5\x41\xe0\x14\xb6\x0e\x10\x13\xa9\x2c\x1b\x3a\xd9\xe6\xf1\x1b\xe2\x93\xb2\x46\xf9\xa0\xc6\x44\x0b\x0b\x54\xfe\xe7\x5f\xed\x2f\xb7\x5c\xc9\x1e\xcb\x32\x73\x8c\x49\x58\x31\x58\x6a\x11\x24\x2d\x87\xdc\xb4\x88\x3e\xdf\x67\x57\xa5\x0b\x18\x84\x37\x59\xb9\x8d\xd0\xce\xf4\xa3\xfe\x10\xd7\x63\x70\xec\xda\x8c\x83\xfa\xb8\x7e\xee\x26\x56\xc5\xf2\x61\xc3\x40\xea\x91\xa5\x60\xd0\xe2\xc6\x42\x89\x26\x7f\x00\x36\xba\x35\x94\x48\x00\xa5\xa0\xae\xf3\xf1\xdf\x83\x9a\x72\x4e\x18\x1d\x79\xb8\xa3\xc1\x6f\x65\xae\x27\x95\x3c\x4a\xae\x8c\xcd\x30\xff\x5a\xcc\x4b\x31\xe4\x76\x5c\x68\xfb\x38\x31\x9f\x10\xac\xf8\x92\x47\xb5\xa3\x9b\x3b\x08\xa1\x91\x75\x4a\x24\xac\xa9\x59\x6a\x1f\x8a\x70\xb6\xe4\xf0\x3a\x20\x04\xa9\x08\x6f\xf6\xed\x07\x65\x2a\x92\x6e\x1e\x2d\xf7\xbd\xcc\xd5\xbe\xc1\x6e\x5c\x4e\x96\x83\x64\xa0\x9a\xbf\x9d\xed\x93\xdf\x5f\xca\x0b\xcc\xa5\xc8\x12\x97\x6e\x5c\xfb\x3c\x34\x93\xfc\x17\x5d\x1d\x92\xee\x8d\x1c\x98\xfb\x33\x82\xb3\xab\x90\xc5\xc0\xe4\xbd\xf6\xa3\xac\x94\x76\x7b\x68\xd4\x7e\x6b\x9c\x24\x42\x65\xe3\xb1\xab\x06\x23\xa8\xf0\x10\x02\x73\xf2\xc6\x07\xde\x89\x61\x2c\x72\xd3\x9b\xe4\xc0\xb4\xd7\x7a\x3c\x61\x36\x8d\xf4\x0b\x36\x08\x65\x29\x89\xd1\xe1\x9c\x0a\xaf\x0e\x3c\x25\x3e\x56\x2c\x64\x09\xfe\x64\x48\x92\x9b\x33\x75\x3d\xe1\x62\xe6\xde\x5b\xd4\x66\xa5\x11\x4f\xc0\xe5\xf5\x71\x02\x75\x5e\x29\x54\x4f\x03\xb2\x8d\x4f\x78\xde\x9a\x02\x4d\xd4\xc4\xe8\xc3\xc2\xd4\x41\x15\xa7\xae\x15\xed\xb4\xf5\x58\xaa\x7d\xba\x64\x26\xe7\xe3\x72\xc5\x4f\x79\x40\xbd\x77\x14\x46\x7f\x8c\x3a\x1a\xdd\x3c\x64\x01\x89\xc3\x16\x60\xd8\xcc\x01\xd3\xc5\x38\x2e\x42\xab\xc1\x04\xc7\x23\xf9\x48\xa8\x04\xca\x85\x30\x47\xb6\xb8\x7b\x5b\x6e\xf4"}, -{{0x5b,0x67,0xa6,0xd7,0xc6,0x50,0xdd,0x92,0xdd,0xd0,0x36,0xce,0x7a,0x30,0x5b,0xc9,0x59,0xa4,0x97,0xc5,0xe5,0x15,0xa6,0x84,0x93,0x03,0x5c,0xb3,0x85,0x0e,0xe0,0x3d,},{0x4c,0x6f,0xc1,0x64,0x05,0x05,0xfb,0x46,0x66,0x9f,0x93,0x04,0x8f,0x8e,0xf5,0x57,0x09,0x9f,0x3f,0xd9,0x2a,0x53,0x06,0x4b,0x16,0x33,0x63,0xa3,0x1b,0x7f,0x00,0xaa,},{0x0f,0x07,0x3c,0x9a,0x58,0x6f,0x6f,0x5e,0x08,0x38,0x9a,0x2a,0x5e,0x18,0x08,0xe2,0x70,0xf0,0xed,0xb6,0xaf,0x10,0x44,0x96,0xf9,0x37,0x57,0x62,0x3f,0xea,0x53,0x13,0x3a,0x73,0x1c,0x44,0x5a,0xc2,0x35,0x78,0xcd,0x56,0xa3,0x88,0x3c,0x08,0x95,0x86,0x68,0x63,0x1f,0xed,0xf1,0x44,0x6c,0xe3,0x4f,0x85,0x7f,0x90,0x82,0x2b,0xa8,0x0a,},"\x62\xcc\xde\x31\x77\x2c\x57\xe4\x85\x3a\xaf\x2a\x81\x81\xfd\xb5\x3f\xb8\x27\x90\xea\x65\x01\xbf\xc8\xf5\xd4\xae\x8d\xbd\x52\xde\x42\xce\x2e\x89\x61\xac\x17\x31\xf4\xbc\x08\x5f\xb5\x61\xef\x09\xa2\x44\x29\x70\xb6\x29\x79\x01\xae\xaa\x2e\xe5\x55\xb7\xd5\xe3\x95\x1c\x7c\x35\x12\x39\xdd\xee\x95\xff\x54\xf9\x24\xda\x95\xca\xe7\xb1\x5b\xa6\xa9\xa1\x33\x7b\x8c\xe4\x92\x1e\xd9\x13\xcd\x79\x1c\x1c\x69\x41\x08\x0e\x54\x8f\x3c\x36\xe8\x45\xac\xbf\xd8\xd8\xce\x35\xe2\xfd\xc2\xa2\xad\x6c\x7e\x24\x61\xbf\xcb\xf1\xaa\xbc\x55\xcf\x0f\xae\x42\x88\x85\xbe\x5e\x86\x53\x33\x08\xc9\x75\x68\x05\x21\x9a\xbd\x7f\xfc\x16\x57\xb6\xf4\x63\x29\x20\xa0\xc1\x0e\x0e\x36\x33\x19\xd9\x00\xfc\xd6\x1e\x7d\xdb\xcd\x6e\x76\x2a\x7d\xb9\x24\x80\xc3\x63\xb2\xc0\x64\x0c\x6b\xf3\x2d\x69\x0d\xd8\x29\xd8\x40\x5f\xa6\x6e\x47\x83\xeb\xe1\xcb\xde\x95\x47\x95\x4a\x90\xba\xad\x9f\x77\x4e\x94\x54\x9a\xbb\xff\x2c\x1f\x5c\xae\xc2\xbf\xd2\x8e\x41\x5d\x36\x42\x9d\x58\x51\x8c\x3e\x17\xe8\x69\x9e\x19\x89\xd4\x7b\x8d\x62\x7e\xf9\xab\x4d\x1e\x7d\x12\x0b\x37\x2c\x21\x41\x30\x4f\x7f\xab\xd0\x26\x5b\x8b\xe4\x1f\x54\x67\xf4\xde\x9e\x65\xc1\x25\xee\x1f\x27\xa2\x89\xc4\xf7\xc9\xa1\xfb\xf2\x5b\xfc\x2f\x8d\x30\x8e\x7f\xf5\x21\x91\xcb\x76\x44\xc6\xaf\x20\x45\x22\xf2\xac\x87\xb5\xf4\x05\x25\xfd\x43\xd3\x08\xc8\xdb\xc6\xa8\x61\xd2\x5d\xb2\x3e\xe2\x76\x67\x8a\x1b\x6e\x8e\x91\x28\x3b\xe0\x24\x70\x48\x2e\xd6\xcc\x9f\x6e\x39\x63\x51\xd1\x1b\x1c\x7e\x22\x32\x9c\x09\x1f\xe7\xd3\x68\xf6\x06\x53\xf9\x3b\x0f\x6a\x3f\x71\x2c\x20\xf9\xd2\xd8\xa9\xa0\x81\x98\x72\xf0\xc7\x1d\x7b\x1c\x0b\xc1\x68\x3a\x15\x2b\x48\x4b\xc2\x1c\xf5\x56\x09\x3a\xb4\xc0\xac\x16\xd3\x22\xff\x0b\xf4\x52\xe5\x58\x1e\x1e\x72\x41\x67\x38\x84\x02\x3c\x7d\x6e\x17\xe2\xde\x80\x59\xf6\x0e\x4c\x18\xe1\x3b\xd5\x5f\xcf\xee\x62\x3f\xd0\x46\x9c\x0d\x09\x11\x61\x1d\x09\x9a\x25\x70\x20\xf2\xf3\x1b\xf5\x07\x8e\x6e\x65\xa1\x35\xd5\xbf\x40\x76\x20\x23\x6d\x6c\xc7\x59\x31\x0f\xa7\x28\xff\x8b\xb5\xec\x56\xab\xbe\x1a\x3c\xd1\x51\x53\xf8\x92\xd9\x58\xd3\x0d\x16\x2d\x01\xee\x66\x5f\x5b\x56\x27\x81\xd8\xdc\xf8\x42\x80\x59\xe5\xfd\x22\x5a\xd7\x8a\x99\xea\x76\x0f\xe5\xd9\xee\x82\x19\xc9\x5a\xcb\x18\xd0\x56\x22\xe1\x0a\x9b\x6c\x67\xf6\xd4\xf6\xed\x11\x63\x5c\x5e\x2e\x0f\x85\xdd\x5d\x3c\xbd\xa6\x5a\xa4\x23\xd5\x94\xa8\x0b\x40\x42\x7b\xc3\x21\xe0\xee\xf9\xaf\xd2\xbc\x87\x46\xab\x73\x99\xff\x6d\x0e\x12\x87\xb6\x61\xdd\xc4\x06\x2d\x07\x20\x18\xf4\xc1\x0e\x86\xcf\xae\xd7\x2d\x9e\x68\x6e\xd0\x9d\x52\x55\xd3\x60\xe3\xee\xa2\xc2\x9b\x9e\xae\xa0\x5f\xc7\x8c\x8c\xdb\x8c\x9d\x4a\xfc\x7a\xdc\x6d\x4a\xa0\x67\xb7\xab\xfb\x0a\x4e\x94\x0a\x77\x58\x0e\xc2\x06\x45\x6c\xb9\xe9\xf9\x5f\x6d\x56\x5d\x53\x6e\x53\x5a\x16\x7e\xde\x8e\x20\xec\x36\x08\x1e\x2f\xc5\x5a\xef\xaf\x24\xd2\x27\xff\xfe\x5e\x6c\xb0\x30\x93\xf4\x43\xb4\xc5\x16\x55\xd9\x1c\xa6\xf2\x75\x95\x9d\x1a\x80\x2a\xde\xab\x44\x70\x1b\x31\xe8\xb0\xfd\x02\x22\xc4\x99\x96\x6c\x72\xd1\x02\x0a\xd9\x37\x0e\x28\x02\xbe\x04\xc9\x93\x3f\x6b\x77\x4f\x6e\x8c\x69\xfc\x0b\xfd\x31\x59\x39\xa1\x27\xb4\xe0\x6d\x0f\x6f\x5e\xde\x67\x1c\xe1\x16\x12\x12\x6b\x51\x87\xb5\x33\x29\xb0\xa9\xcb\x7d\xa3\xb1\xcc\xd6\x7b\x8c\x07\xba\xb9\x9a\x66\x2d\xf8\xce\x85\x1f\x50\x2f\xc4\xe1\xed\x16\x32\xb6\xba\x55\x55\x44\x01\x8f\x75\x27\xe3\x62\xef\xc7\xe3\xb2\xba\x6f\x75\xa1\x25\x4f\x42\x8b\x3b\x7e\x0b\xea\x69\x54\x9e\x7f\x9c\x73\x62\x75\x55\x00\x80\xae\xe3\xaf\x59\x14\xe3\xa3\x4b\xe6\x56\xc7\x7f\x6b\x29\x42\x0e\x54\x33\xf3\xdf\xf3\x81\x1f\x35\x28\x20\x8e\x9d\x85\x0a\xa3\xc2\x9b\x0f\x77\x8a\x24\x27\xd5\xfd\xe3\x07\x32\xdf\xe5\x04\x43\xa9\xc1\xad\x55\xc7\x2a\x08\xab\x26\xff\xaf\x8e\xfb\x90\xbc\xaf\xd3\x72\x6b\x00\xc0\x05\xc8\xc0\xf0\xdb\xf2\xa1\x35\x30\x86\x72\x1e\x44\x65\x45\xb8\x13\x44\x11\x94\xa7\x55\xfd\x26\xb9\x63\xaf\xd9\x77\x27\x8d\x1b\x10\xf0\x90\x01\xc7\xed\x97\x54\x03\xc1\x5c\xbe\x7f\x99\x2a\xb0\x7b\x84\x70\xc9\x39\xf8\x66\xf4\x20\xf7\x7d\xb7\x79\xaf\x83\x97\x00\x32\x9e\x07\x77\xa6\x11\x63\x65\xd7\x6c\x36\xd0\x9d\x86\x04\x72\xa5"}, -{{0x26,0x31,0xc8,0xc3,0x4d,0x29,0x48,0xdd,0xd5,0x99,0x6b,0x41,0x49,0xce,0xfd,0x23,0x8e,0xa7,0x45,0x2e,0xc2,0x2e,0x24,0x61,0x24,0xdf,0xa2,0x79,0xcc,0xc2,0x7d,0xb8,},{0xc3,0x90,0x67,0x86,0xff,0xb8,0xa7,0xc2,0x7c,0x44,0xc2,0x44,0x7f,0x9d,0xde,0x7d,0x66,0x6d,0xfe,0x58,0x8c,0xfc,0x54,0xf2,0xd2,0x50,0x40,0x51,0x2a,0x37,0x1b,0xc1,},{0x0a,0xdc,0x6f,0xa4,0x0f,0xfb,0x81,0xf6,0xef,0x4e,0x41,0x87,0x55,0x49,0x17,0x77,0x5c,0xf4,0x65,0xe7,0xb5,0xe8,0x57,0xf2,0xe1,0xe7,0xf4,0x00,0x97,0x71,0x06,0xd2,0x37,0x7e,0xbc,0x76,0xab,0xb1,0xdb,0x92,0x4c,0x64,0x86,0x7e,0x3c,0x6f,0xe3,0x8c,0x0b,0x4f,0xcb,0x1d,0x0f,0x94,0x68,0xe8,0xfb,0x23,0x50,0x29,0xa8,0x1c,0xe6,0x04,},"\x6f\x9b\xdc\xe1\x44\x3f\x28\x56\xd4\xa2\xf2\x27\x82\x83\x50\x12\xb7\x81\x8a\x0e\x02\x0d\xbc\xc2\x2a\x82\x16\x58\x30\x5f\x13\x42\x34\xd1\x4c\xea\x63\x61\x00\xed\x89\x6c\x2a\x8f\xb0\xe8\x70\x48\xec\x6f\x8b\x31\x48\x4f\x78\xeb\x17\x10\x45\xad\xd7\x2c\x85\x71\x0e\xc9\xf9\xb5\xd4\x36\x23\x41\x7b\x56\x53\xbe\x86\xe7\xfb\xf8\xb4\xff\x91\x11\x0a\x80\x8c\xb4\x1a\xcf\x66\xd4\x36\xe8\x9a\x73\x7f\xae\xa4\xef\xf3\x54\x49\x60\xf1\x14\xb8\x33\xb0\xb4\xeb\xc2\xc1\x40\x70\xb0\xbf\xb7\xb0\x05\x7e\xeb\xb8\x42\xbd\x1c\x1e\xd4\x58\xad\x34\x28\xf8\xf7\x2a\x1d\x1d\xb3\xc4\xcb\x47\x97\xa3\x99\xd4\x7a\x1e\x6d\xb7\x4d\xcb\x2e\xe2\x4a\xe8\x15\x85\xcf\x66\xef\x6d\x9b\xd2\x23\xf0\xf5\x4b\xc8\xc1\xce\xc1\xbb\x44\x60\xbe\xf4\xff\xd3\x2e\xe8\x05\xc3\xca\x5e\xe9\x76\xff\x9c\x14\x55\x9f\x8d\x75\x66\x62\xa2\xbc\x19\xe4\xc5\x98\x54\x06\xa0\x73\x05\xc9\x95\x0d\x86\x6c\x9a\x79\xa3\xe5\xf6\xc5\x96\x97\x53\xa1\x70\xe0\xfc\x4c\xc0\x9c\x6d\x87\xa1\x2b\x44\xcd\xf3\xbe\x16\x23\x15\x9e\x90\xca\xb7\xa8\xa3\xe6\xf0\x1f\x26\x85\x95\xb0\x21\xb1\xef\x7d\x00\x76\x94\x77\x27\x0d\x55\x84\xc9\x12\xe2\x2a\x36\x74\x38\x27\x7f\x59\xdf\x20\xc5\x62\x0d\xd5\xbe\xaa\x9b\xb6\x0b\xee\x47\xf4\xaf\x52\x7d\x89\x29\x57\xb2\xd1\x2b\x67\x8b\x52\x79\xa3\xf8\x32\x64\x65\x4c\x0a\x0f\x8d\x21\xe7\x09\x66\x8f\x30\xfb\x6e\x68\xf0\x47\xd0\xd9\xa7\xc2\xae\x9a\x28\xf7\xcb\x9d\xbf\x18\xf6\x3f\xc1\x66\x1f\x07\xd3\x10\xe5\x40\xc7\x76\x31\xf5\xbd\xac\x58\x24\x68\x5d\x7c\x9a\xba\x0f\xe1\xd0\x94\x07\xa9\x66\x2e\xf1\x8e\xb3\xe2\x8f\xd1\xe8\xbc\x89\x26\x57\xbc\x38\x24\x3a\x2e\x64\x53\xbd\xae\xab\xb2\x79\x1f\xc5\x48\x95\x21\x29\x54\x57\xad\x04\x18\x0c\xa8\x71\xf6\x31\x87\x92\xbd\x15\xfd\x18\x00\xce\x59\xdd\x3e\xcc\x7e\x0b\x72\x97\x92\x67\xd8\x18\x3e\x80\x4f\xdd\x45\xda\xad\x84\xfc\x4c\xaf\xeb\x56\x1e\xa8\xd6\xa7\x4a\x7c\xde\x72\x2d\x96\x25\x3a\xb3\xe7\x5f\x0a\xdd\xe0\x2a\x61\xfd\x5e\x1f\x59\xcb\x1f\x5f\x1b\x2e\x05\x26\x43\x58\x9a\x9e\x4b\xe4\xdd\x6e\xe6\x45\x38\xcb\x0b\x10\x9a\x11\x3f\x30\xa5\x8b\x35\x65\x62\x40\x43\x66\x2a\xbe\x17\xf6\x0e\x31\xe8\x9c\x36\xc9\x95\xe0\x0a\xe0\x7f\x56\xa9\x11\x8a\x31\xae\xc2\x4a\xd5\x44\xbc\x96\x58\x11\x21\x8d\xf8\x27\xc1\x73\x0b\xb9\x04\xbb\x79\xb6\x86\x13\xf6\xc9\x94\x67\x9b\x69\x90\xd7\x75\xb5\xcb\x32\xdb\x97\x19\x4b\xd8\x10\x19\xbe\xa4\x1f\x3a\x7e\xef\x50\x1b\xf8\x49\x1b\x0e\xa8\x59\x38\x84\x52\xe3\xec\xbe\x16\xaa\x7d\x56\x91\x51\x0a\x66\x06\xc4\x93\xe4\xc2\x93\x96\x1b\xf4\x0b\x4c\xd3\x00\xd9\xd2\x2e\xa1\xa7\x72\x4c\x07\x8b\x8b\xab\x1f\xd1\x65\x04\xe9\x89\xb1\x36\xd9\x25\x1a\xc9\xf1\xed\x94\xa5\xe9\xac\xbd\x9c\x04\xf8\x05\x8a\xfe\x03\x04\x9a\xed\x8b\xa2\x9f\xa2\xe8\xfb\x44\xf8\xe8\xc0\x4e\x87\x27\xf3\x99\xe7\x35\xe6\xc1\x49\x6a\x91\xa9\xb2\xcd\x2a\xb0\x2d\x43\xb2\x85\xe9\xd7\x61\x02\x93\xb6\x74\x9d\xf1\x04\x4b\x30\xe2\xda\x99\xa5\x64\x42\x9a\x23\xe6\x8c\x96\xfc\xe9\x2b\x08\xa0\x0b\x7b\x74\x2b\xa9\x7a\x62\xee\x58\x77\x6d\x7d\xd5\x65\xa4\x90\x07\x1d\x4b\x19\xdc\x64\x8e\x03\x32\x9c\xc5\xc8\x25\xd3\x87\xeb\xa4\x9e\x2e\xff\x6c\x43\x41\x86\x5c\x46\x4f\x13\xf1\xbe\xb1\x82\x7a\x7f\x26\x8c\xc1\x5a\x98\x24\x80\xbf\x08\x4f\xe3\x65\x2c\x1b\x0e\x0b\x4a\xd2\x62\x55\x85\x9a\xbf\x1c\x8a\x7f\x9b\x3b\xef\x09\x8a\x94\x07\xfd\xea\x0a\x53\x9e\xb0\x08\xfd\xd7\x49\xfa\x01\x86\xcc\x01\x69\xd9\xd9\xe6\x8f\xe5\xe5\x4c\xac\x32\xce\x57\xb5\xc8\x4c\x2d\x80\x5e\xca\x39\xc2\xdb\xbd\xd2\xe0\x2f\x7d\x22\x88\x26\x71\x2f\xf4\xa6\x14\x11\xca\x0a\xeb\x6f\x01\xa1\xf8\x0e\xf2\x9e\xeb\x07\x1a\x43\x22\x2d\x94\x97\x18\x4b\xd8\x5d\x9e\x44\xb1\x66\xbe\x97\xcf\xd2\xa7\x32\xaf\x4a\x23\x34\x63\xd3\xab\x54\x3a\x7a\x3c\x7a\xec\x55\x56\x56\x56\x88\x40\xf4\xdf\xea\x21\x7f\x65\x53\xaa\x98\xaf\x32\x4c\x12\xb2\xc3\x21\x4e\xe7\x6e\xec\x70\x06\x70\xaf\x68\xc8\xc1\xf3\x69\x46\xef\xd7\xff\x09\x33\xe5\x45\x3f\x12\x8e\x97\x15\xfd\xb3\x34\x4a\xc1\x0c\x4b\xb7\xec\x8f\x10\xdd\xf5\xdb\x71\xf1\xcf\x0e\xfe\x40\xf7\x5e\x5b\x63\x34\xef\x8c\xf8\x42\x9b\x32\x91\xe6\xe4\xce\x37\x9c\x17\x8a\xff\xcb\xc6\x10\x30\xeb\x89\x6d\x74\x4d"}, -{{0x39,0x76,0x9a,0x66,0xf0,0xca,0x12,0x90,0xfd,0xa1,0x43,0x75,0xb3,0x5c,0x66,0x3f,0x6a,0x4b,0x2a,0xb3,0x60,0x71,0x79,0xab,0xd9,0x90,0x63,0xe2,0xef,0xa2,0xc6,0xa8,},{0xf9,0xfd,0x4c,0x19,0x1f,0x38,0xf1,0x21,0x90,0xd3,0x28,0x5e,0x20,0xc6,0xce,0xe5,0x4c,0xfd,0x6f,0xf3,0x15,0x30,0x0a,0x4e,0xfd,0xc8,0xa9,0x0e,0x80,0xaf,0x40,0x83,},{0x14,0x42,0xde,0xa2,0x80,0x7e,0x03,0x11,0x59,0xec,0x6a,0x41,0x2d,0x8e,0x07,0xbb,0x3e,0x29,0x93,0x08,0x09,0x0f,0x21,0x8f,0xa7,0xc1,0x0a,0x9c,0x50,0x68,0xef,0x9b,0x64,0xef,0x11,0xca,0x9f,0xb9,0x2b,0xe1,0xd0,0x21,0x6b,0x99,0x31,0x8f,0xf0,0xf0,0x3c,0xb8,0x71,0xcd,0x7d,0xd6,0x3a,0x38,0xae,0x17,0x02,0x31,0x3e,0x5b,0x25,0x0c,},"\xff\x4d\x89\x87\xe3\xfa\x36\x01\x2b\x75\x86\x73\x6b\x79\x3d\x65\x97\x54\x69\x8c\xd1\x2b\x65\xe5\xba\x9d\x75\x8c\xac\x16\x49\x28\x8d\x20\x22\x43\x77\x28\x3e\xa5\x42\x5d\xec\x10\xab\x99\x17\xd1\x8c\xd1\x3d\x1b\xdf\x4a\x76\x9f\x37\x04\x4c\x84\xfa\xa2\xa4\x49\xc6\x89\xe0\x04\xc1\x4e\x00\x5c\x49\xda\x41\x06\xff\x75\xce\x13\x03\x36\x1c\x6e\x3e\x34\xcc\xfe\xe7\x5e\xe9\xc3\x1c\xbd\x06\xa4\xbc\xdb\xb4\x2f\xd6\x49\xbe\x4d\xfc\xd6\x64\x00\x6d\x6a\x5f\x61\x07\x7c\x04\xa6\xa8\x1d\xb3\x6b\xe8\x6b\xa4\x2c\x29\x51\xf0\x51\xae\xda\x64\xac\xea\x49\x6c\xb9\x24\x98\x2b\x9f\x7d\x23\x4a\xc9\x72\x3f\xef\x98\xa8\xe1\x27\x55\xe3\x26\xa5\x2f\xbe\x35\x85\x1f\x41\x1e\xeb\x86\x76\x06\xd4\x5b\x51\x3f\x54\x52\x63\x91\xc5\x54\x63\x5c\x18\x0b\x8f\xd0\xee\x45\x1a\xfc\x96\xe4\xef\xd3\x60\xb6\x1e\x6b\xaf\x03\xdd\x6d\x19\xba\x51\x5c\x31\xec\x1c\xdd\x3a\xff\xff\xdb\x27\x35\x4e\x3e\x6b\x56\xe9\xe1\xa1\xa1\xb7\xd4\xb5\x7d\x9d\x76\x89\xbb\x2f\xea\x6c\x8d\x3f\x9c\xe0\xdf\x2d\x9e\xe9\x19\xc4\x23\x0a\x1f\x20\xb8\x5d\xfe\xfe\x1e\xa3\xd7\xf7\x7d\xb4\x70\xe4\x02\x24\x29\xef\x60\x9b\x0f\xf4\x49\x46\x44\x0a\xcb\x44\xcd\x13\x44\x5b\xcf\xa3\xf2\x05\x03\xc2\x6c\x2f\xb6\x63\xc8\x90\x65\xfb\x93\x34\xa6\x03\xeb\x9a\xb7\x15\x2e\x62\x62\x92\x33\xc4\x4c\xb0\x0e\x77\x71\x6d\x9b\x72\xc8\x4f\xd1\xb3\x40\x63\x4f\xf1\xce\xa3\x47\x50\x15\x76\x10\x0e\xcb\x0f\xd1\xbb\x76\xae\x0d\xff\x1c\x2b\x09\x48\xeb\x71\xee\x2c\xc3\x1e\x79\xd3\x01\x5d\x72\xdb\xee\x22\x4a\x98\x0e\x0f\x95\xa6\x9f\x79\x3d\xa8\x3a\x2d\xaa\x56\xef\xe5\x7b\x2f\x8c\xea\xac\x9e\x55\xf4\x43\xca\x9e\x73\x2b\x48\xc7\x5f\xac\x21\xc3\x6f\xa7\x72\x73\xc3\xf3\x48\x35\xff\xd8\x3c\x96\xf0\x0a\xc6\xe8\x6c\xff\xed\x08\x15\x36\x46\xc1\xce\xa2\x23\xda\x9c\xa3\x60\xca\xb9\x7e\x03\xb2\xb6\xc8\xfb\xa7\xc1\x95\xa3\x9a\xe5\x2e\xb2\xee\x86\x43\x00\xae\x56\xa1\x0f\x54\x7f\x99\xa3\x16\x98\x72\x24\x9f\x97\x77\x4b\x17\x98\x93\x55\x36\xf2\xf5\xf0\x11\xce\x57\x61\x3a\x94\xfc\xb7\xe7\x28\x6a\x6d\x49\xc1\x0f\xd9\x29\xd7\x67\x1c\xbb\x8c\xf1\x7d\xfc\xad\x4b\x24\x85\xc3\xd8\xfd\x79\x12\x87\x21\xe5\x5d\x84\x80\x87\x63\xc2\xaf\xa9\xc5\x5e\x3b\x0c\xd7\xbf\x2f\x0a\x66\xb5\xe4\x67\xbe\xc5\xee\x89\xad\x57\x0b\x60\xf1\x88\xb3\xf7\xb4\xa5\x11\xff\x85\x93\x12\xde\xd0\x78\xd8\xd0\x09\x11\x34\xfd\x49\xbc\x79\x2d\x2d\x7d\x60\xb3\x04\x94\x1c\x7f\x23\x20\x6f\x99\xe8\x63\xb1\xe2\xd8\xc9\xec\xff\xd2\xff\x0a\x3a\x3c\x75\x49\x85\x61\x5a\x9a\x92\xed\xce\xad\x00\xfe\x0e\x05\x49\x3b\x19\x8d\x1f\x7c\x90\x08\x84\x46\xbb\xa4\x60\x38\xa7\x1f\x32\x65\x3b\x59\x12\xb2\x4f\x43\x13\x77\x48\xb7\x5a\xec\x2c\x15\xfe\x4b\xf5\xa6\xf8\x6b\x8a\x6c\xdd\x9c\x74\x47\xf2\xeb\xb0\xf4\x3b\x01\xca\x15\x23\xe0\xd4\x96\x24\x00\x06\xad\x7f\xff\xfa\xfe\x0d\xf5\x75\x4b\x34\x2c\xaf\xf3\x55\x5d\x72\xa2\x7d\x0b\x92\xca\x16\x67\x66\x5c\xec\x43\xbf\xb5\x83\x07\x7a\x9c\x17\x41\xfa\x49\x2c\xe3\xdc\x2c\x75\x29\xcd\xed\x81\xb8\x28\x1a\x3f\x37\x59\x48\xb8\xa7\xce\xd0\x96\xb2\xfa\xcc\x25\xe3\x90\x29\xe2\x21\xb6\x6a\x53\xd3\x97\x9e\x1f\x40\x5f\xd8\x8a\xfc\x06\xec\x6e\x43\x09\xdc\x85\xe6\x9d\x6e\xf2\xb4\xb4\x92\x66\x16\x4a\x9d\x9d\x1c\x31\xee\x39\x21\x12\x7b\x13\x38\x1b\xfb\x74\x0d\xd3\x8d\xc1\xc7\x31\x59\x21\xf9\xc2\xfe\x58\xb6\x1b\x63\x1a\x7d\x9f\xde\x2d\xd8\xa4\xbe\x3d\xed\x04\x90\xae\x3b\x83\x76\x79\x19\x55\xc1\xc4\xb4\xfe\xd0\x0b\x9f\x4c\x38\xab\x73\x50\xfc\x2e\x37\xa3\x15\x0c\x18\x16\x2b\x1f\xaf\x03\x37\x89\x4b\xc2\x3e\x74\xf5\x95\xe4\xbe\x33\x46\x6d\xea\xb3\x54\x58\xbe\x97\xb4\xf7\x56\x58\x97\xf0\x68\x52\xf7\x1c\x60\xfe\xf9\x10\x1d\x72\x6b\x72\xe0\x10\x2a\x97\xb2\xca\x52\x11\xe3\x80\x68\x34\xb0\xac\x1a\x7d\xf8\x7c\x2a\x07\x8d\xf2\x63\xef\x8b\xa4\x57\xdc\x89\x1b\x7f\x2e\x62\x78\x11\xab\x62\x2b\x99\x46\xf8\xc6\xb7\x31\xf2\x40\x78\xd1\x7b\x06\xb2\x00\xc3\x44\x7f\x80\x32\xaa\x3e\x7a\x24\x3e\xe4\x22\xdd\xa2\xe6\x52\xfd\x75\x71\x3a\xfb\xce\x8a\x59\xef\x85\x36\x65\x3a\x48\xdc\xf4\x2a\x70\xe7\x62\x1f\x9b\x28\x02\x40\x9b\xe1\xc1\xa6\x1f\x32\xe3\x67\x89\xa5\xc5\x05\x5e\x1a\x82\x68\xe9\xdc\x43\x8c\x2e\x15\x27"}, -{{0x0c,0x80,0x8b,0x06,0x6f,0x0c,0x8e,0x8d,0xbb,0x1c,0x23,0xd6,0xc2,0xce,0xdd,0x0b,0xe8,0x66,0xd8,0x42,0x5f,0x24,0x1a,0x92,0x85,0x70,0x0e,0xa5,0x45,0x36,0xcf,0x6d,},{0x44,0xee,0x72,0x90,0x04,0x50,0xc5,0x6a,0xb2,0x1f,0x26,0x86,0xd2,0x95,0x25,0xd0,0x66,0x3e,0x0b,0xdd,0x87,0x72,0x5b,0xea,0xc5,0xd6,0x8b,0xac,0xeb,0x69,0xf1,0xd2,},{0x38,0xc6,0x82,0xce,0xde,0xfb,0x13,0xe4,0x6b,0x11,0xf7,0xb5,0xf8,0x00,0xcc,0x81,0x20,0xd4,0x5a,0x83,0xcd,0x8d,0x8d,0xec,0x10,0xc5,0x77,0xbb,0x01,0x53,0xd5,0x09,0xba,0x4f,0xdf,0x40,0x09,0x98,0x78,0x8b,0x70,0x60,0x07,0xce,0x16,0x2b,0x96,0x94,0x5c,0x71,0x40,0xbe,0xee,0x74,0xe1,0x9d,0x07,0x43,0xaf,0xa4,0xec,0xfd,0x25,0x0a,},"\xc9\x45\x71\x41\x00\x58\x1f\x4e\x24\xda\x11\xfc\x0f\x6c\x6d\x02\x10\x43\x3f\x97\x77\x52\x51\x24\xc5\x5e\xe0\x72\xd8\x5d\x79\x8b\x70\x5f\x9d\x31\xc8\xf9\x77\xdb\x6e\xdf\xb7\xa6\x5c\x78\xad\x2d\x7d\x31\xd6\xb7\xb5\xbe\x40\xff\x11\x78\xd3\x03\xb6\x83\x9b\xb0\xc6\x32\x10\xc1\xd3\x38\xc1\x03\xaf\xa0\xd4\x53\xec\xa1\xbc\xa2\x77\xd9\x30\x77\x8a\xd5\x08\x02\x27\x2f\x03\xdb\xe2\x18\x4f\xc3\x1e\xf8\xea\x6a\xbe\x21\x69\x97\x19\x9f\x7c\x1b\x33\x77\x37\x96\x89\x07\x27\x2a\xa5\x1b\xd4\x9c\x07\x38\x9c\x95\x46\x8c\xef\x4f\xd9\x9a\xe7\x8c\xa4\x54\x2a\x2b\xbc\x0e\x8a\xa9\x52\x14\xad\x1c\xff\xf9\xd5\x08\x5a\x43\x43\x94\x47\x3b\x84\xb7\x4b\xe9\xbf\x2f\x02\x02\xad\x1e\xe4\x61\x66\x04\xca\x1d\xd7\x5f\x4a\x19\x53\x42\xeb\xbf\x8f\xc5\x9f\x3f\x79\x61\x65\x54\xdc\x7b\xfd\xd5\x56\xbe\x43\x72\x21\xc1\x0b\xfa\xd3\x9e\x11\x9e\x06\x04\x5b\xe5\xfe\xd6\x83\xd3\x53\x4f\xb6\xcf\xed\x33\x89\x1c\x96\xf9\xc3\x30\xf2\x8b\x68\x4f\x8f\xba\xd4\x7c\x01\x41\x8e\xab\x6c\xee\xcc\x2e\xd7\x77\xf4\xc2\x18\xa2\x7a\xc2\x25\x82\x39\x23\x15\xc5\x3a\xa7\x30\x9e\xc5\x4c\x61\x75\x23\x6e\x44\x24\xdc\x97\x84\x65\xab\x62\x8d\x95\x44\xb0\xbe\x84\x10\x3e\xb5\x6f\x1b\xaf\xe5\xe5\xea\xed\x04\xc9\x8b\xfe\x2e\x8a\x24\x18\xc6\xc5\x2a\x61\xea\xce\x85\x23\x6b\x66\xc7\xb3\xb8\x70\x7e\xd5\x56\x41\xdd\x9d\x5d\xa9\x7c\x99\xc1\x1c\xbe\xb9\xaa\x2d\xb1\x47\x82\x0d\xc7\x24\x80\x0a\x9d\x80\xf5\x05\xfa\x5a\xf2\x09\x21\xca\xd2\x43\x56\x83\xbb\x4f\xc6\x0b\xdd\xd4\x75\xf8\x63\xe2\xf5\x95\x0d\x23\x63\x99\xd8\xd7\x5b\x40\x4b\x39\x4a\x54\x67\x37\xf9\x3a\x62\x40\x87\x00\xb3\xab\x3c\x1e\x92\x2b\x1a\x85\x9a\x29\x15\xc2\xd3\x53\x68\x81\x5c\xd4\x5b\x85\xb2\xac\x08\x31\x21\xff\x00\x0f\x05\x0d\xcd\xf4\x15\xe5\x27\x5a\x5c\x42\xda\xe3\xb1\x54\x00\xf3\xdd\xaf\x93\x39\xf2\x0a\x12\x61\xa8\x8c\xd9\x02\x05\x63\x97\x63\x21\x11\x52\xdf\x41\x4a\x9a\x6a\x62\x18\xf5\x6b\x35\xa2\xde\x9e\x84\x82\x44\x9f\x6d\xa7\x7c\x9e\x3d\x4a\xf0\x49\x30\x15\xa7\x26\x21\x7f\x82\xac\x58\x95\x4f\xe3\xe2\xe3\x44\x40\x35\x6b\x11\x2e\x06\xa6\xf6\x71\xfb\x5a\x6e\xf4\x61\x9a\x6e\xa7\xb4\xe0\x4d\xb3\x75\x7f\xb6\x64\xc3\x96\xb3\x41\xca\x89\x00\x1d\xc1\x60\x4b\x51\xfa\x91\x53\xf9\x13\x0c\x10\x20\xff\x88\x90\x92\x87\x82\x3a\xb3\x91\x5c\xcc\x85\xc4\xe3\x5d\xf6\xc2\xf8\xe6\xf9\x02\xbe\x82\xba\x21\x29\x7f\xd3\x83\x5a\xff\x5c\xe0\x2f\x3c\x07\xdc\x09\x3f\xcb\x1a\xba\x26\xe0\x6d\xfe\x6f\x02\xdf\x79\x29\x1a\xac\xa0\x69\xec\xab\x93\x81\x40\x4c\x9c\x3e\xa1\xad\x40\x9a\xdf\x29\x2a\x91\xe3\xa5\x82\xd5\xa7\xb6\x8f\xfb\xe1\x0a\x03\x05\x24\x8e\x09\x67\xe6\xdf\x37\x2f\x28\x1b\xd1\x92\xe1\x39\x97\x9c\x98\x66\xca\x8f\xe1\xe1\x0e\x06\x16\xdc\x2d\x4f\x85\xe1\x19\xe0\xcb\x4b\xfe\x8c\xc3\x1d\x9f\x5c\x01\x8b\x65\x40\x85\x24\x00\x0a\x30\x16\xa2\x3d\x99\x14\xd5\x7e\x95\x55\x76\xe2\x66\x0b\x0e\x0d\x96\xc8\x49\x5a\x12\xc3\xd7\x31\x22\xd2\x00\xb0\xf0\xe5\xeb\xd4\x46\x56\x2b\x08\xf4\x79\x34\xab\x49\x9a\x96\x99\x1d\xcf\x99\xc9\x6a\x62\x88\x07\x39\x84\x5d\x29\x82\x01\x50\x55\x3e\xae\x9b\xe0\xbb\x41\xd5\x3d\x3a\xf0\x1d\x98\x67\xbb\x47\x32\xc9\x0b\xf6\xe1\x37\x31\x6e\x3b\x1e\xdc\xc2\x09\xa8\xa0\x9f\xb0\x62\xa6\xef\x05\xf3\x7e\x57\xf2\xc5\xd1\xd0\xca\xba\xf0\x7a\x8e\xd7\xd4\x14\x55\x40\x7b\x09\x67\x54\x18\x0a\xa9\x6d\x3d\x96\x59\x19\x45\xdd\x7a\x10\x40\xa2\xde\x60\xd8\xe1\xc0\x54\xf7\x85\x46\x52\xb7\x32\xe7\xa8\xf5\xb6\x47\x4c\x3b\xaa\x18\x40\xfb\xe8\x1b\x1e\x6b\x54\xe2\x01\xef\x0b\xc8\xd0\xf2\x13\xd7\xce\xc1\xd8\x24\xd2\x22\x09\xac\x72\x52\x5a\x64\xb9\x03\xe7\x73\xb8\x3f\x1b\x68\xf6\x40\x27\x9f\x15\x05\x3d\x21\xec\x15\xce\x2f\xf7\x59\x22\x17\x6b\x75\x84\xa1\x6b\xf1\xa1\xf0\xd6\x36\xb7\x94\x2a\x3d\x61\x86\x2f\x6f\xd1\x30\x99\x72\xd3\x14\x1e\xb7\x69\x31\x4c\xa9\x75\xd0\x20\xbf\x02\xbf\xdd\xf1\x7d\x14\xb6\x0e\xb7\x86\xbf\x9f\x55\x98\x9f\xe4\x73\x32\x0d\x44\x29\x67\x7e\x30\x1c\x68\x26\x33\xf8\x13\xff\x26\xc0\xa3\xda\x92\xf6\xd0\x68\x06\x16\x10\x5b\x04\x25\xaf\x33\x8c\x2e\xa6\x15\x3b\xdd\x52\x16\xfa\xe2\xaf\xe4\x61\xe9\x24\x9c\x05\xe3\x2f\x76\xad\x7c\x42\x9d\x92\x53\x4b\x68\x6d\xd1"}, -{{0x04,0x9d,0xac,0x3c,0x97,0x7d,0x9d,0xf5,0x03,0x49,0x6b,0x43,0xd7,0x6e,0x55,0x40,0xe3,0x15,0x00,0x1a,0xd5,0x7f,0x15,0xea,0x9f,0x08,0x70,0xca,0xd2,0xd4,0xf9,0xe9,},{0xfc,0x6f,0x4b,0x7e,0xb3,0x9a,0x71,0x16,0x80,0xf9,0x66,0xd4,0x68,0xa6,0x1a,0xbb,0x13,0xa9,0xb6,0x44,0x9b,0xb9,0x9f,0xda,0x3d,0x12,0xce,0x1b,0x50,0x6d,0x1b,0x4b,},{0x75,0x32,0xd1,0xa6,0x1a,0x98,0x1f,0x30,0x3d,0x7c,0x24,0x54,0x35,0x4f,0x99,0x54,0x0c,0xd4,0x84,0xcd,0xe9,0xab,0x33,0x7d,0x6f,0x7b,0x51,0xf1,0x79,0x22,0x0f,0x7f,0xa2,0x07,0x34,0x76,0xb4,0x1c,0x71,0x52,0x9f,0x98,0x36,0xdb,0x6b,0x1d,0x0f,0x5a,0x48,0x2b,0xbb,0x4c,0x68,0x36,0x61,0x76,0xed,0x14,0xd4,0xd8,0xee,0xfa,0xde,0x0d,},"\x7f\x31\xe3\x46\xf6\x8d\xa7\x37\x16\xaa\xcb\x16\xee\xa1\x9b\xb2\x41\x42\xdc\x28\x3e\x72\x63\xff\xc3\xf7\x04\xa2\x2a\xe5\x27\x5a\x0e\xf9\x5f\x06\x69\xba\xe5\xa5\x4c\x7f\xeb\x84\xbc\x74\x87\x3c\xca\x0f\x33\x5d\x6c\xff\x3d\x8b\x4a\x20\x05\x6c\x64\xf5\xe8\x82\xcb\xbb\xd2\xac\x74\x20\x76\x76\x46\x7e\x54\x66\xdd\xd5\x6a\xed\xf5\x6e\x09\x7c\x7f\x59\xd9\x45\x91\x5e\xb0\xeb\xd0\xc3\xc8\x3d\x48\x88\x8d\x3e\x9e\xde\x51\xad\x2d\xd8\xa0\xee\x1e\xab\x4c\xf8\x7f\xfa\x78\x63\x5a\xfc\x4d\x6e\xf3\xe8\x7d\xda\x3b\x65\x56\x5c\x29\x85\xa4\xad\x0a\xcf\xdf\xb8\x1c\xb0\xe6\x1c\x67\x82\x6a\x6e\xa0\xbe\xd4\xc0\x8a\xa1\xa5\x41\xde\x60\x45\x87\x04\xac\x21\xca\x12\xf1\xc8\x11\x8b\xb3\x09\x2c\x35\xa4\x0c\x92\x1e\x68\x45\x64\x56\x2c\x2c\x10\x49\xdc\xdc\x2b\x8d\x6a\x97\xe3\x56\x7d\x35\x6b\xff\xb5\x69\x2a\x41\xd8\x9d\xdd\xa0\xec\x35\x52\x15\x2a\x27\x57\x7f\x1c\xce\x57\xd0\x09\x86\xdc\xa7\x7e\xdf\x5e\x25\x18\x15\x82\x00\xad\xf6\x90\xaf\xfb\x31\xaa\xf2\xb5\x74\x83\x68\x39\x44\x09\x99\xf1\x57\x91\xce\xa8\x53\x42\xac\x94\xa9\x6c\x7a\xf7\xa1\x9e\x49\x43\x10\xae\x26\x67\x5f\x43\xc3\x52\x58\xe8\x5b\x68\x40\xb9\x9c\x6b\x09\xcf\xa5\x8d\x19\xf1\xe4\x3a\x77\xe3\x97\xb0\x8c\x0d\xb1\x83\x0b\xca\x67\xb3\x9e\xcd\x87\x52\xda\x61\x1e\x08\x32\xc6\xca\xe7\xbb\x8c\xe7\x4a\x82\xe7\xe7\x33\x0b\xe5\x06\x2e\xd0\x5a\xa5\xc8\x44\x57\xb0\x07\xfb\x5c\xcd\xc2\x0a\x55\xd5\x4d\x8e\x04\x09\xc8\xbd\x83\x88\x3d\x2e\x02\x9d\xff\x26\xea\x5d\xb2\x75\xdc\xe0\x99\xe4\x18\x65\x9a\x04\x00\xf1\x3b\xe9\xff\xdc\x14\xe7\xd6\x45\xa9\x46\x77\xca\x84\x69\x70\xb7\xe6\xac\x52\x7f\xa0\x09\xa3\x59\x45\x4b\x3c\x49\x36\x49\x05\x18\x9f\xb4\x9c\x9b\xac\xb6\x50\xc0\x3c\xd8\x28\x75\x89\x4e\x35\x46\xba\x03\xc3\x2e\x33\x6f\xc6\x51\x6a\x87\x67\x6c\x50\xd5\xb8\x0b\x30\x54\x27\x3b\x15\x7c\x5d\x76\x75\x14\xe5\x45\x74\xb8\xa1\x01\x98\x5a\x8e\x96\x7e\x95\xda\x8f\x92\x98\x00\x26\x0e\x08\x14\x8b\xee\xe2\xd7\x78\x1e\x9e\x85\xd4\x63\xa9\x4f\xfe\xfd\xbb\x75\xc2\x8f\xa8\x89\x80\x15\x68\x09\x99\x42\x9c\xee\x79\x8b\x3f\xd2\xd9\x67\x37\x86\x8a\x26\x3f\xba\x9f\xb6\xf4\xaa\xd5\x6a\x15\xc6\x41\x2f\xf8\x5e\x7d\x37\x52\x10\x2d\xaa\xf2\x5e\x74\x5f\xa5\xf6\xf1\x74\xa2\x31\xfc\xce\x86\x24\xdd\x70\x85\x6f\x9b\xab\xcc\x20\x91\x44\xff\x68\x64\x64\x8d\xea\x0d\x68\x84\x56\x6a\x4c\x39\x14\x78\x05\xbe\x08\x4e\x47\x40\xbc\x50\x93\x09\xbc\xb1\x42\x96\x4b\xb0\xcf\xcf\x67\x26\xa0\xe0\x4b\xbf\x32\xae\x68\x34\x73\x2b\xda\x03\x84\xce\xa8\xf4\xa4\x84\x9b\xba\x0d\x18\x64\x6c\x1c\x34\x47\x18\x96\xb5\xbe\xf1\x49\xf8\xca\xb9\xec\x83\x72\x2b\x0f\xb2\x09\xef\xe8\xa0\x4c\x4a\x23\x5d\xc8\xdd\xb2\x0a\xcd\x92\x76\x5a\xfb\xf3\x05\x87\x40\xea\x70\xb9\xc1\x0d\x9c\x5a\xef\x86\x06\x29\x8f\xe4\x15\x15\x93\xb2\x1f\x79\x7d\x92\xae\x9f\x1e\x08\x81\xb0\xd2\x71\xb0\xd5\xb1\x0c\x6e\xd8\x3c\x34\x9e\xc2\x47\x3f\xbf\x2f\xf7\x80\xdc\xd0\x76\xd8\xcf\x0a\xea\xfa\x71\xfe\x2b\x8c\x51\x28\x01\x5f\x8f\xbb\xcf\xec\xd5\x28\x1c\xd5\xea\xcb\x6f\xe9\xac\x6e\xaa\x6e\x47\xd6\x67\xb9\xad\x4b\x7e\x41\x1e\x6c\xb7\x46\x3d\x56\x76\x07\xaf\xbf\xd0\x41\x8c\x4e\xb0\x6a\xfe\x84\x7f\x5e\x40\xb4\x99\x44\x38\x28\xd5\xa2\x73\xa4\xa8\x7e\x46\xde\xf2\x1a\x91\x9d\x73\x86\x3a\xf0\x05\x4a\x09\x9e\x3a\xdc\x54\x50\xb8\xe3\x2f\x51\xea\x52\xc5\x99\xa4\xa2\xa3\x53\x51\x78\x8a\xf7\xcb\x71\xe5\xc4\x4b\xcb\x8d\xf5\x4a\x60\x1e\x6e\xc2\xc1\x82\x8b\x48\xc4\xb1\xae\x44\x63\x10\x6f\x10\xef\xa5\xca\xf3\x09\x1a\xbf\x99\xaa\xba\x52\x52\xf4\x84\xd3\xbb\xc6\x2b\xfa\x6b\x2a\x80\x6d\x23\xc6\x33\x1a\x62\xfc\x46\xbc\x62\x76\x79\xe7\x3e\xc8\x2d\xcc\x08\xf7\x91\x43\xf4\xb7\x1e\xcf\x35\x7e\xa2\xf0\xd7\x4e\x6d\x30\x58\xe6\x06\x04\x3f\x6e\x8f\xed\x70\x42\x82\xc1\x6b\x1f\x98\x8f\xfa\x36\x5c\xfa\xe9\xa3\xcf\x79\x2e\x0c\x5b\xaa\xd7\x0c\xa7\xe2\x57\x76\x01\x8b\x5e\x7f\x0e\x95\x44\xe1\xd7\x3f\x3e\x5d\x1e\x41\x6a\x5e\x50\xfb\xed\x29\x6d\xc1\xbf\x4b\x29\xa3\xfb\xe3\x2e\xfb\xd7\xe9\x9c\x83\x01\x5d\x27\xf5\x35\xad\xec\xf1\x75\xfc\x36\xc1\xea\x4f\x44\x23\xb3\x6d\xcd\xc0\x54\xba\x99\x32\x78\xe8\x5a\xc3\x62\x2d\x43\x5f\x52\x37\xba\x61\xb4\x9a"}, -{{0xf0,0x7d,0x61,0xb5,0xca,0x1c,0x27,0x00,0xcb,0x50,0xf9,0x00,0xc2,0x6b,0x7c,0x28,0xf6,0xc6,0x94,0x08,0x08,0xc7,0xba,0xff,0xf7,0x4f,0xca,0x4b,0x11,0xf4,0x25,0xd4,},{0xeb,0x24,0x3d,0xfa,0xcc,0x2d,0xc6,0x43,0x57,0x76,0xd5,0x54,0xec,0xed,0x8b,0xf9,0x23,0x90,0x60,0x4b,0x35,0x55,0x7c,0xda,0x51,0xfd,0x20,0x3e,0xdd,0xb4,0x93,0xfa,},{0xc1,0x9b,0x53,0x2b,0x82,0x48,0x56,0x39,0x32,0x63,0x97,0x01,0xbf,0x15,0xbc,0x01,0x5f,0xae,0xbb,0x17,0xbb,0x98,0xd8,0x71,0x61,0x6e,0x10,0x48,0xd6,0x4c,0xa5,0xf9,0x55,0xf5,0x58,0xf6,0x3b,0x53,0x53,0xa1,0x57,0x6f,0xa1,0xac,0xae,0xf3,0x9b,0xcb,0xc9,0x02,0x17,0x56,0xdf,0x5d,0x1a,0xb3,0xbc,0x74,0x1a,0xcc,0xf9,0x05,0x9b,0x04,},"\xc1\xc6\x78\x43\xd6\x9a\x0e\x62\xe7\xbf\x71\xf9\x02\x06\xa3\xd5\x59\x5c\xa3\xc4\x82\xaa\xa7\x67\xe9\x31\xb0\xd6\xc2\xf4\x75\x2a\xb8\x69\x91\xf0\x35\x83\xbb\x13\x8e\x9f\x72\xfa\xb5\x8f\xd6\x02\xa4\xb6\xb2\x96\x02\xcf\x89\x14\x08\xaf\x5a\x1b\xfd\x33\x98\xc0\x17\x8c\x44\x14\x61\xe3\xf4\x9b\xc8\x1d\x64\xc0\xd9\x7f\x5d\xed\x69\x2c\x75\xd4\xd6\x4d\xac\x5d\x80\xd6\x3b\xd4\xdc\x52\x10\xc1\xd9\x35\x0b\x14\x2b\xa6\xe7\x68\xf1\x50\x80\x7a\xb8\xa8\x6c\xac\xdb\x59\xd8\x4d\xdf\x66\x0b\xe5\x62\x03\xc0\x14\xfb\xa1\xe0\xdc\x16\xfa\x6d\x32\x69\x4e\x14\xb1\x28\xed\xd1\xf6\xc6\xab\x44\x5a\x3a\xd3\x41\x74\xfa\x9e\x4b\x01\xf2\x5b\x1d\x5e\x6e\xb7\x69\x83\xb4\x29\x5c\xe4\x91\x4d\x3a\xe4\x8c\x70\x4a\x30\xe5\x54\xfc\x1f\x86\x8b\x62\x72\xef\xf0\x6d\xa2\x4b\xfe\x17\xe4\xe0\xf0\xfa\x46\xbb\x08\xff\xb9\x07\xcb\x61\xbe\xbe\x52\xdf\x31\x1a\x64\xcb\x57\x8b\x30\xfd\x62\x7d\xf1\x12\x21\xae\x40\x03\xa0\xb0\xc6\x8e\x3c\x6f\x95\xa2\x1c\x85\x00\xd4\x1b\x2c\x58\x9c\xc4\x6a\x13\x9c\xac\xff\x57\xdc\xf0\x07\x59\xf5\x2e\x9c\xa3\xda\xbd\xb1\x78\x8a\xb6\xb3\x8a\x50\x48\xf5\x8e\x08\xe0\x5c\x39\x4f\x9d\x3c\x72\x11\x3d\x45\x2b\x70\x84\xc5\x19\xf8\x6c\x16\x89\xff\xdb\xae\x50\x6e\xd8\x45\x05\x22\xcb\xe4\x3d\xe2\x7a\xa3\xbf\xdd\x92\xa9\x1b\x71\xe5\x2a\x3c\xbf\x77\xc1\xbd\x28\x93\xea\xbd\x40\x7a\x57\xfe\x5e\x14\x68\x73\xbf\xb2\x04\x3f\x4a\x61\x47\xdf\x08\x3e\x54\xa2\x20\x8d\x19\x25\x81\x3f\xa4\x04\xe4\xc4\x74\x06\xe7\x72\x86\x43\xeb\xfb\x0b\x10\x14\x2f\x90\x9e\xf8\x56\xfd\x3a\x91\x6b\xc0\x85\x15\x43\xb8\x2a\x55\xf8\xcd\x52\x9b\xd2\x1d\x9e\x29\x09\xd6\xd7\xe7\x7b\xdc\xea\x46\x73\xe5\x45\xff\x4a\x67\xfa\x37\xd6\x5f\x1f\x63\xf1\x1d\x5d\x0d\x55\x97\x4a\x30\xab\xe1\x88\x33\x5d\xb5\xdc\xbd\x35\x66\x58\xf9\xb7\x76\x82\xd9\x6d\xab\xb2\x58\xea\x95\x95\x1a\x05\x59\xae\xa4\x06\x4d\x5e\xa1\x68\x05\x01\xdc\xb4\x22\x8f\x2c\x95\x6f\x81\xd2\x10\x11\x44\xaf\x74\xc7\x16\xbc\x8b\xf4\x29\x6d\xc3\xb8\x31\x72\x5c\xc1\x7d\x3b\xfd\x90\x66\xa2\x99\x53\xb2\xec\xd7\x50\x59\x43\x5b\x49\xa2\x5a\xc5\x25\xb4\xfb\xab\x17\x79\x02\x2d\xfb\x6d\xe5\x25\x14\x9d\xcd\x90\x2a\xc8\xa7\xe2\x1f\x34\x4f\x5f\x01\x01\x48\x06\x92\xd6\x16\x08\x95\x2c\x71\x41\x3e\x30\x03\x79\x45\xe2\x06\xc5\xee\xad\xfc\x3e\xdc\x4b\xae\x0d\x79\x6c\xa0\xc5\xf5\x6d\x6f\xfb\x3f\x09\x69\xdf\x9d\xf8\xa7\x94\xf5\xdc\x83\xa3\xb2\xf5\xc3\xab\x36\xbb\x90\x1b\xcc\x31\x55\x1c\x55\x0c\x63\xfa\x41\xd6\xa8\xd5\x7b\xdb\x9b\x5c\x65\xbc\x61\x0c\x3a\x98\x97\x52\xab\x28\xa0\x15\xe7\xc2\xf6\xb2\xfb\xf1\x99\xa7\x6b\x97\x50\xc0\xd3\xd5\x92\x11\x9c\x8b\x40\x22\xfa\x45\xba\xde\x2f\xbb\x41\x43\x26\x79\xb5\x2a\xcb\x46\x08\xa9\x5c\x34\xaa\x40\xbf\xfe\xc1\x0b\xc9\x8f\x47\x29\xdf\xcc\xb6\x50\xb2\xa0\x52\xdf\xb0\x68\x95\x9e\x64\x8a\x92\xd5\xaa\x4d\xd2\xd1\x7d\xde\x67\xcd\xf2\xe6\x37\x7a\xf0\xd4\xae\x37\x96\x07\x38\x9d\x7e\x35\x96\x44\x1b\x9f\x42\x22\xcf\xf6\xaf\x73\xb3\x30\x02\x70\xce\x54\x80\x0b\xd9\x34\xa9\x10\x9a\x02\x56\x3a\xdc\x56\xae\x46\x58\x44\x51\xcd\xaf\x4a\x77\x53\x81\x57\xe5\x87\x0f\x4a\xe1\x2d\xbc\x81\x87\x0f\x5d\xb4\x1a\x2c\xb5\x5e\x00\xdb\x3d\x22\x31\x62\x8f\x17\x27\xc3\xac\xb9\x9e\xd3\xac\xd8\xb6\x71\x56\xa8\x00\x5a\x4c\xc8\xf3\xd3\x55\x5b\x79\xa0\x37\x73\xa9\x31\xf1\x4e\xeb\xce\x40\xb9\xfe\x46\xed\xe5\xda\x08\x81\xfb\x22\x07\x17\xe4\x18\xe8\xb5\xa0\xfe\x5e\x47\x7e\x72\x85\xc5\x54\xe8\x59\xe1\x64\x41\x67\x2b\x48\x99\x34\xa3\xa9\xee\xb8\x8d\x78\xfc\xc5\xc1\xdb\x2d\x1f\xbd\xde\x39\x27\x73\xf6\xc9\x39\x97\x2e\xe8\xfa\x31\x89\xf4\xe9\x87\x2b\x4a\xbd\xc8\x3b\x37\x9c\x0c\x10\xe8\x18\xdc\xff\x75\xc8\x3d\x68\x70\x72\x92\x84\xce\xd4\x1f\x2f\xf5\x5a\x87\xc9\x60\xe6\x3d\x12\x11\xf0\x80\x71\x29\x3f\x6a\xc6\x3f\x9b\xde\xf3\x8f\xd5\x91\x9c\xa9\x0b\x3f\x5e\x25\xa6\xc0\xc6\x64\xc4\xec\xf8\x31\xc6\x4e\x2d\x4c\x6e\x79\x8a\x98\xa3\xa0\xf7\xbe\x7a\x24\x63\xea\xda\xa6\xa2\xa3\x48\xf9\xa4\x94\x71\x71\x23\xcc\x0a\x28\xc0\xa5\xea\xe3\xf5\xb5\x85\xf2\xcb\x8c\xb2\x60\xc2\xc5\x03\xe4\x15\x78\x57\x3c\xd9\xb7\xcb\xa1\x40\x8d\xca\x9d\x86\x0a\xe4\xf8\xc3\xd3\xf3\x22\xa4\x5b\x58\xa2\xc4"}, -{{0x50,0x86,0x4a,0x75,0xaa,0x0c,0x69,0xb5,0x93,0x50,0x07,0x7c,0x20,0x4b,0x20,0x75,0x7f,0x2b,0x8b,0x68,0x55,0xc3,0x7e,0xd7,0x21,0xb4,0x9f,0x2a,0xc9,0x17,0xd6,0xb2,},{0xcf,0xf3,0xeb,0xd5,0xea,0x0c,0x8b,0x55,0x31,0xd9,0x21,0x1e,0x22,0x19,0xe4,0xcf,0xe5,0xde,0xd9,0x91,0xd8,0xec,0x42,0x4d,0xf5,0x4c,0xf5,0x3c,0x83,0x76,0xf9,0xbd,},{0x17,0x74,0x55,0xa7,0x16,0x94,0xf1,0x2b,0x76,0x2f,0xd1,0x7e,0x08,0xbd,0xf0,0x10,0xa7,0xfc,0x91,0xd1,0x91,0x41,0xd7,0xae,0x23,0x99,0xbd,0x24,0x1a,0x99,0x8a,0x6a,0x50,0xa9,0x72,0x2a,0xc1,0x23,0x2c,0x59,0xe4,0xe2,0xaa,0xa8,0x28,0x07,0x8b,0x2b,0x92,0xf4,0xa5,0x4c,0xdf,0x0e,0xfe,0xbb,0xa2,0xc1,0x6d,0xbe,0xaf,0x07,0x22,0x03,},"\xb3\x65\xf4\x76\xac\x92\xe7\x60\x12\xa7\xff\xd8\x78\x2a\xf1\x5a\x3f\x5e\xe1\x47\xf6\x03\xa3\x67\xad\xf2\xf9\x72\x46\x13\xe8\x76\x5b\x03\x7a\xc0\xeb\x1f\x67\x37\x36\xe1\x13\x63\xe3\x52\xed\x5a\xe9\xeb\x5a\x67\x12\x5e\xd8\x18\x90\x03\x42\xae\x93\x37\x1c\x43\x3b\x91\xf6\x02\x1d\x4b\xe2\xa0\x52\xb0\xda\x43\xb3\x68\x2e\x7f\x74\x0a\xe8\x01\xd0\x54\x10\x57\x85\x8e\xb0\xc9\xc2\x8d\x98\xf0\x3b\x45\xe1\x28\xaa\xa3\x42\xc6\xb6\x02\x77\x67\x92\xaa\x81\x24\x1c\xad\x06\xf1\x33\x8f\xa0\xc7\x17\x57\x18\x0f\x58\x8c\x83\x01\xd9\x1c\x27\x67\x9b\x50\x21\xcd\x75\xd7\xf6\x17\x1e\xe9\xf8\xd5\x6e\x43\x77\x67\x98\x12\xf6\xec\x5e\xd4\x65\x38\xca\xed\x50\x0c\x1d\x15\xf5\xfc\x86\xea\xf9\xed\x9c\xf9\xa0\x60\x6b\x22\x61\x4f\xaf\x67\x64\x62\x13\x4e\x3d\xb3\x58\x23\x32\xb4\x83\xdf\xa5\x4c\xa2\x9a\x5e\xb0\xd6\xba\xe3\x38\x0e\x19\xd0\x60\x11\x34\x53\xf3\x2b\xba\xb7\xe1\x18\x62\x7b\x40\xbc\xab\xf1\x71\x1b\xcf\xea\xb8\x95\x7d\xe3\x39\x43\x6c\x70\x88\xbb\x88\x31\x01\x53\x9a\x09\xd3\xbe\xf0\x88\xfc\x1f\x84\x07\x64\x03\x6f\xfb\xb3\x3d\xec\xd1\x2a\xac\x57\xfd\x26\xf8\x48\x23\xe1\x95\x53\xd4\xd6\x7e\x00\x0e\x94\x36\xca\x32\x3d\xe0\x99\xbc\x1c\xe7\x5e\xbf\x5d\xdc\xcb\x44\x8c\xd7\xa2\xe4\xbb\xd6\xb3\x2e\x3f\x20\x24\xf9\x6c\xc5\xc7\x15\x2b\x8b\xe8\xed\x0b\xd8\xe4\x36\xd3\x24\xd1\xce\x1d\xd3\xcf\xcc\x45\x2a\x28\xc7\x3a\x95\xaf\x84\x82\xaa\x77\x2a\xe5\x3d\x5b\xe1\x29\x2e\x39\xd1\x71\x6b\x43\x75\x8f\xe5\x63\xc8\xaa\x3b\x74\xbb\xa5\xc0\x2d\x04\x77\x8d\x91\xe3\xd4\x3d\xcc\x72\xbb\x7c\x7b\x04\x3c\x05\xc8\x74\x5b\x70\x5e\xe7\x5b\x5a\x4e\xc7\xb9\x5b\x65\x43\x59\xfb\x5e\x85\x33\x38\x21\x98\x51\xd4\x0a\x8a\xfb\xb4\xf9\x1e\xcb\xb4\x1e\xb8\x15\x34\x19\x6c\xc0\xcc\x9d\x3e\xb7\x14\x39\x6c\xaf\x04\x5b\x23\x17\x22\xd4\x48\x65\x03\x64\x04\x19\x98\x84\x80\xa7\x81\x58\x08\xbe\x97\x42\x87\x37\x2c\xfc\x48\x99\x65\xaa\xc5\xb8\x09\x5c\x63\x75\x81\xeb\x91\x0f\x90\x55\xcd\x1c\x0a\x0a\x3b\x0b\x33\xac\xa9\x0f\x7c\x5b\x8e\x6e\xf6\x83\xab\xf0\xce\x53\xae\xba\x51\xbe\xc4\xfc\x7b\x42\x7a\x23\x47\x36\x0f\xca\x86\x36\xd3\xf1\x46\x92\x84\xf2\x69\xa9\xab\xf0\xcb\x1a\x24\x4a\x15\xd6\xb4\x04\x65\xe7\x5c\xf8\x90\x92\x47\x4a\x8b\xed\xa0\x33\x39\x1d\xd3\x11\xc4\x99\x51\x9a\x08\xc4\xf0\x34\xe7\x19\x18\xd7\xca\xd4\x18\x45\x32\x7c\x89\xe7\xb1\xe9\x4a\xfb\x07\x23\x78\x2c\xe5\xc5\x53\xef\x36\x79\x1b\xba\x63\xde\x17\xd7\x46\x49\x18\x94\x01\x2c\xeb\xd8\x7b\x18\x37\xa8\x21\xef\x5c\x62\x4b\xbc\x84\xcc\x50\x35\xf5\xe7\x0c\xd9\xf2\x1b\x42\x21\x9a\x2d\xce\x30\xe0\xe6\x5c\x25\x0d\x0d\x19\x4d\x2b\x52\x48\x6b\x03\xee\x66\x33\x29\x81\xa5\x22\x51\x74\xdb\x17\xe5\xa8\xbb\x4a\x10\xed\x9c\x8a\x44\x5c\x41\x44\x2f\x3b\xcd\xb6\xb4\xf4\x9e\x4e\x1d\xc8\x76\x61\xa7\xb6\xe4\x1f\x35\xf5\x5d\xd6\x7b\xd4\xcb\xc6\xff\x58\xbf\xbf\xfa\xff\xd2\xc3\x82\xfc\xad\x0c\xae\x8f\x0d\xf9\xaf\x6a\xcf\x09\x40\x00\x76\x18\xa5\x4a\xee\x31\xd9\x32\xcb\xd8\xe8\xb4\x1c\xa0\x38\x21\xc4\x28\xa0\xef\x8e\x58\xd2\x43\x5e\xec\xd5\x03\xc5\x4d\xa9\xc1\x62\x8f\x3c\x74\x9b\x77\x05\x19\xf5\x3b\xf2\xd5\x7e\xd7\x12\xd0\x75\xd3\x73\x37\xb7\x7a\x2b\x10\xa7\x2d\x2d\x59\x0c\x20\xd5\xce\xc2\xca\xcc\x6c\x3a\x8d\xc1\x13\xe2\xd1\x6e\xf2\xd1\xb3\x90\xed\x96\xe4\x03\x6a\xcd\x30\x4e\x0c\x7c\xef\x9d\x43\x1f\x88\x21\x8a\xa1\xf8\x38\x28\xdd\xa6\x36\xb9\x4a\xa7\x61\xc7\x31\x7e\xcf\x11\x6c\xbf\xc6\x11\xe5\xba\x6d\x94\xc5\x0e\x99\x46\x93\x02\x3b\xdf\x2d\x24\x8e\xd6\x03\xf8\x5b\xe7\x3a\x00\x08\xb7\x5a\xde\xf9\x51\xdc\xcf\xa3\x0e\x42\xe9\xf5\xbb\x05\x02\x3a\xde\x79\x75\x06\xcb\xf9\x0b\xb6\xdc\xe4\x3c\xf3\xa1\xc3\x14\x1a\x5c\xc5\xfd\x9a\x4f\x3c\xc5\x57\xb9\x0e\x18\x04\x9b\x3c\x13\x0f\x46\x1e\x4f\x32\x29\x9f\xa1\xd1\xcf\x9c\x7f\x2e\xa2\x05\x35\x65\xe8\x16\x0a\x34\x1c\xdd\xf9\x9a\xcd\xdd\x49\x16\x97\xfa\x70\x51\x24\xab\xda\xb4\x2a\x5e\x8f\xcf\x04\x8d\xd9\xf1\x79\x38\x4e\xc9\x2a\x46\x9a\xeb\x11\xe8\xbc\x62\xb6\x9d\xbc\xfc\xec\x66\x81\x75\x47\x57\xe4\xc5\xd0\xfd\xd9\xb9\xcf\xda\x49\xaf\x09\xb8\x3a\x5a\x4a\x10\xae\xd9\xa4\xcf\x7d\xdf\xa2\x89\x20\x9d\x47\x5a\xb3\x31\x8c\xd4\xb9\x65\xe0\x07\xdc\xe1"}, -{{0xe5,0x5f,0x22,0x0f,0xff,0x80,0x79,0x14,0x8b,0x25,0x41,0x89,0xbb,0x29,0x41,0x74,0xf8,0xe2,0xc5,0x75,0xe5,0x7f,0x39,0xd4,0xba,0xc8,0x16,0x5c,0x5e,0x56,0xe7,0x69,},{0x7f,0xd5,0x07,0xd0,0x3f,0xe1,0xd6,0xe3,0xf9,0x11,0xf0,0x59,0x59,0x7b,0x0e,0x29,0x2e,0xa0,0x96,0xf5,0xbc,0x85,0x18,0x52,0x91,0x6b,0xf1,0x21,0x7c,0xaf,0xdc,0x6c,},{0xc1,0x02,0x3a,0x70,0x68,0x74,0x3e,0xc4,0x66,0x8f,0x49,0x5e,0xb7,0xbd,0x4d,0xb5,0x81,0x29,0xc1,0x1e,0x58,0x29,0x9e,0xa8,0x7d,0x6f,0xac,0xd3,0x02,0xbf,0x29,0x6a,0x98,0xe2,0x98,0xfd,0xb4,0x8e,0xdd,0xf9,0xc4,0x4e,0x79,0xae,0x86,0x41,0xf7,0x34,0x50,0x3b,0xb8,0x3d,0xc0,0xb3,0x1f,0x61,0x0d,0xf1,0xd1,0xe9,0xd6,0x19,0xa7,0x05,},"\x1e\x2c\xe8\xbf\x0e\xa7\x87\x5d\xf2\x85\xb1\xdb\xd3\x4b\xbe\x67\x30\x7f\x2e\x8a\xc8\xbc\x14\x2c\x3b\xa3\x14\xc1\x64\x2c\x65\xa2\xd6\x2e\xb2\xc7\x83\xf9\x16\x28\x3c\xa4\xec\x3e\x53\x6d\x3e\xeb\x65\xcf\xdc\xc0\x54\x9a\xc4\xf6\xa4\x5f\x53\x9a\xc5\xdf\x79\xa6\xd5\x76\x82\x19\x73\x9d\x0c\x9a\x0c\xdb\xb3\x12\x42\x29\x6c\x33\x12\xb7\xed\x56\x00\x43\xf5\x36\xcd\x1d\xe9\xa9\xc2\xb2\x89\x64\x1a\x1c\x2d\x84\xf9\xa6\x8b\x7c\x03\xb8\xb8\x56\x7e\x5d\xc7\x13\x8c\x2c\xb9\x67\xc6\x28\xaa\x25\xb2\xea\xb4\x34\xd4\x49\x0b\x23\x50\x74\x09\x71\x7c\xde\x94\xda\x59\xdc\x1d\xc2\x5c\x7b\xe4\x2a\x8a\xa0\x2e\xdc\xf4\xd9\x95\x36\x8e\x6b\xa0\xee\x1f\x95\x36\x00\xdb\x98\xd2\x2d\xe0\xf8\xd2\x57\x02\x0e\x0a\x40\x6e\xe1\x66\x9b\xd5\x27\xb9\xfe\x1c\x61\x1f\x9b\xe5\xa3\xd7\x52\x8e\x8b\x61\x51\x67\x0a\x86\x63\xd2\xed\x1a\x58\xd3\xe3\x69\xbb\x72\x2a\x63\x02\xd7\xc1\x72\xa1\x9b\xda\xf3\x57\xee\xdb\x02\x27\x91\x56\xe3\xb9\x03\x44\x31\xa7\xd6\x8a\x39\x52\x8e\xb4\x02\x35\x87\x57\x3e\xb8\x8f\x30\xf9\x4e\x83\x3e\x8a\x23\xb9\xd0\xac\x7b\x5c\xa8\x78\x24\x59\x6b\xbb\x0a\x3d\x0c\xa1\xb1\x6a\x68\x78\xfd\xf7\xe2\xce\xa3\x4a\x6f\xfb\x95\xa9\xff\x4e\x88\x8a\x97\x59\x37\x35\xb8\x68\xda\x75\xd8\x70\x7b\xbf\xdb\x1d\x93\xeb\x86\xa5\x1e\x2d\x21\x5f\x1d\xd9\xdc\xf7\x83\x88\x72\x9a\x3e\xb0\xf0\x66\xdd\xc9\x41\xe9\x50\xc9\x21\x27\x19\x8b\xce\x63\xa5\x48\x68\xd9\x97\x02\x95\x72\xff\xa6\xf6\xfe\xa1\xd3\xa6\x91\x64\xc9\x99\x69\x53\xdc\x8b\x6f\x9d\xad\x06\x35\xc9\xb0\x81\xf5\x5f\x98\x33\x40\xf0\x81\x4b\xf5\x47\x08\x03\x09\x0e\x79\x97\xf7\xab\x79\x6c\x2b\x15\xad\xaf\x40\x21\xd6\x7c\xff\xaf\x6e\x1e\xf6\x28\x67\x50\x39\x45\xc2\x1a\x32\x96\x64\xe0\x8a\x95\xa4\x15\x82\x30\x0d\xa9\xbe\xd2\x08\x44\x4c\xe6\xaa\x12\xb3\xf8\x67\x79\x5c\x6e\xe4\xc4\xc9\x25\x70\x18\x62\x73\x61\x29\x3b\xd5\x27\x82\x1a\x29\xa3\x39\xb4\x04\xa2\xda\x4b\xd9\x94\x4f\x87\x70\x40\x79\x8b\xb5\x4a\xbd\x2d\x76\xcb\xb1\x8d\xf4\x29\x7f\x4c\xe3\x33\x7f\x64\xd2\x05\x80\xaa\x64\xbd\xec\xac\x37\x6a\x6a\x4f\xf7\x4d\x01\x44\xb2\xfe\x74\xce\xf8\x2d\x50\xa5\xe6\xbd\xd7\x99\xe5\x5f\xf6\x96\x62\xba\xc5\x37\xad\xcb\x68\x81\x22\x8c\xb6\x37\x04\x50\x0c\x14\x3a\x4f\x4d\x1d\xb2\x8d\x45\x56\xbe\xe6\x04\xa3\x99\xff\xd2\x06\x54\x65\x97\xde\xe9\x22\x52\x54\x7f\x6c\x65\x7f\x36\x84\x1a\x87\xd5\x65\xf6\x55\x27\x16\xc2\x5a\x21\x15\x14\x77\xbe\xe9\xef\x96\x18\x55\xfb\x1a\xf2\xda\x80\x68\xf2\x8c\xe9\xff\x70\xd5\x25\x2c\x7a\x63\xa2\xe1\x4d\xed\x6b\x89\x77\xb1\xd7\x69\x1a\x77\xed\x2e\x57\xd2\x2f\xf2\xe1\xfc\x4c\xdb\xce\xb5\xe8\x05\x85\x8d\x90\x38\x96\xea\x67\x07\xe4\x8b\x34\x5f\x60\xe2\x81\x8b\x2f\xce\xc4\xdb\xa4\x8c\xae\xa9\xef\xa3\x82\x79\xfb\x83\xd5\xb0\xf4\x6a\x45\xe4\x2c\x41\x76\x5d\x01\x71\xba\xac\xd8\xd6\xdd\xa7\x99\x13\x14\xb3\x4e\x15\xfd\x36\x12\x7c\x46\x7d\x1d\xe0\x1c\x01\xa3\xa7\x8a\x8c\x1b\x10\x3b\xee\x17\xa7\xa0\xb7\xac\x55\x76\xfd\xc2\x26\xdd\x24\x59\x77\x31\x46\xcf\x38\x26\x14\x17\xca\x19\x13\x5d\xbd\xa9\xbd\xbe\x54\xcd\x17\xaa\x7d\xdd\x38\xfd\xca\xc2\xab\xa3\x96\xb3\x65\xce\xae\x98\x91\x9f\x6c\x51\x77\xfc\x58\x3f\x5b\xee\x3f\x48\x70\x49\x14\x30\x6a\xa1\x9e\xe9\x0e\x3f\xd0\xde\x55\x91\xc6\x69\xff\x35\xab\x16\xfe\xf3\x8d\xee\x18\x7b\xae\x1e\x5a\xaa\x56\x6d\xf1\x05\x44\xb7\xd6\xd4\xeb\x00\xda\x7e\xbe\xb4\xec\xdc\xc4\xd8\xe3\x2b\x49\xcb\xbd\xc6\xe6\x66\x40\xbd\xb0\xf7\x2e\x05\x91\x8a\x05\xc3\x5d\x9b\xff\x7e\x0e\x88\xf2\x41\xd7\xc6\xc8\xcb\x2f\xed\xcc\xdf\x65\x56\x0a\xf0\xe7\x83\x3e\xfe\x34\xaf\x79\x0d\xb6\x31\x89\x02\x2c\xfd\x71\xfc\x8a\xcf\x88\x86\x01\x27\xbd\x4f\xbf\x02\x6b\xcb\xe3\x60\xe3\x3a\x89\x95\xe6\x36\xd0\x3b\xb8\x6d\xfd\x01\x98\xad\xa9\x59\x34\x2d\x8e\x9c\x9e\xd9\x3e\x23\x29\x7d\xa9\x8d\x66\xa0\xd4\xfc\x96\x51\x62\x73\x3b\xc8\x65\x41\xb9\x5a\x6c\x90\x97\xcb\x55\xa9\x73\xc6\xfa\xc1\x94\xe8\xf8\xa1\x64\x27\x4c\x47\x9c\x51\x0e\x62\xd8\xa0\x35\xeb\x75\x11\x81\xb5\x02\xaf\xb6\x14\xd8\xc4\x46\x7b\x54\x45\xc2\x68\xdc\x3d\xd0\xab\xbd\x57\x70\x04\xc0\xbc\x47\xb1\x5f\xcb\x80\x1b\x79\x35\x97\x57\xb5\xea\x89\xcf\x8c\xf7\x7f\xc6\xd1\x60\xe6\xcd\x73\xc4"}, -{{0xd5,0xe3,0xa4,0x06,0x71,0xbd,0x45,0xf0,0x88,0x42,0xdd,0xc7,0x8a,0xbe,0x57,0xde,0x3b,0x9c,0xe5,0x64,0x6b,0x73,0x0d,0x2e,0x59,0xfe,0xcf,0x5a,0x7d,0xf8,0x0f,0x40,},{0x41,0x6c,0x37,0xae,0x1a,0xd1,0x5b,0x63,0x2b,0x0e,0xa4,0x39,0x32,0xc1,0x76,0x37,0x28,0x2c,0xd9,0x1d,0x59,0x79,0x55,0x2e,0x5e,0xeb,0xb9,0x9a,0x41,0x9d,0x5c,0x97,},{0x63,0xde,0x6a,0x98,0x11,0x42,0x36,0x5a,0x3e,0x59,0x26,0x31,0xc8,0x27,0x72,0x37,0x80,0x97,0x39,0xd1,0xc9,0x8f,0x5a,0x1c,0xb2,0xcc,0xcd,0x34,0x06,0x7d,0x1c,0xa5,0xdc,0x8f,0x2f,0xc6,0x3b,0x8a,0xe1,0xa6,0x89,0xdc,0xaa,0x29,0x1b,0xa6,0xb6,0x9b,0x1a,0x67,0x95,0xc5,0x79,0xa5,0xdb,0x6d,0xcc,0xee,0x73,0xf6,0xa4,0x20,0xac,0x0a,},"\x09\xfe\x6f\xfa\x8b\xf0\x94\x2a\x64\x92\x13\x57\x65\x9d\xbc\x6e\x4f\x8b\x63\xca\x3b\x9e\xa4\x75\xea\x39\xd7\x92\x52\x90\xa1\x48\xd8\x7b\xb1\x55\x74\x1d\xfa\x28\xae\x1b\xea\xdc\x1f\x3e\x1a\xb7\x67\x37\xeb\x5d\x5d\xda\xde\xd0\xbb\x38\x2d\x7e\x11\xea\x81\xa5\xe7\x80\x16\x12\x69\x62\x60\xba\x3b\xd0\x9c\x80\xb6\x23\xf6\x36\x38\x0a\xa0\x20\x8f\xee\x0a\xff\x70\x81\x2d\x53\x07\xb2\x71\x83\x83\x23\x43\xde\xba\xa3\x60\x5d\xda\xd1\x7d\xdd\x70\xd6\x11\x40\x0d\xdd\x10\xd6\x38\xaa\x3d\x6c\x68\xa2\x8c\xf0\xe9\x7c\x1d\xed\xf6\xcc\xd9\xc7\x31\xa8\x4f\xf0\x40\x5a\x3a\x22\xdc\xba\x00\xab\x44\xd5\xb2\x18\x44\xf1\x4d\x13\x74\xac\x0c\xb1\xe5\x8d\xf4\xa9\x0c\x41\x25\x63\xcf\xe6\x9d\x88\x2d\x35\x0f\x6a\xaf\xbf\xa6\x4f\xa2\xf9\xff\x82\x60\x32\x32\x67\x80\xae\xcf\x93\x05\xd8\x21\x7c\x17\x9d\xbb\x63\xc1\x51\x54\x12\x32\xeb\x65\x97\x92\x65\xd8\x76\xc4\xbc\x43\x05\xc0\x2f\x40\xbc\x1d\x05\xdb\xaf\x7d\xcf\x4f\x7d\xd9\x23\x2c\x17\xee\x0f\x7a\x05\x55\xf5\x04\xba\x37\x74\x54\x84\x88\x93\x3e\x75\x71\xeb\x3f\x71\xc4\xcb\xb2\x0c\xc4\xe4\xa7\x32\x2f\x35\xac\x0e\x79\xa5\x91\x55\x79\x8d\xd0\xf5\xb3\xc1\x13\x19\xb7\xd8\xf3\xea\x79\xee\x3a\xcc\x68\xbd\xb9\xf3\x7c\x7d\x4c\x8f\x9c\xab\xa1\xeb\xf8\xeb\x7f\x43\xb4\x62\xae\xfd\x38\xe8\xc0\xd4\xc6\x39\x79\xcf\x66\x31\xde\xc3\x1a\xb5\xce\xd3\x93\x7e\xf5\xb2\x36\x2c\xb0\x9c\x71\xdd\x09\x66\x57\x70\x0f\xd9\x6b\xda\x55\x5e\x22\x71\x2f\x71\xae\xc1\x1a\xe5\xe9\x1b\x24\xbd\x16\x49\x49\x8b\x8d\x9f\x86\x7f\xb6\xc4\x1e\x07\x60\x80\xf7\x40\xd0\x74\xc2\xa2\x55\x72\xd3\x4e\x66\x6b\x63\x67\xbf\x7c\xbb\x3d\xd4\x2a\x23\x82\xdc\x19\x73\x96\x12\x68\x60\x53\x96\x81\x0a\x45\x6a\xc0\x81\xbb\xfd\x3a\x54\xb4\x48\x81\xfc\xfc\x45\xb4\x24\x5e\xe7\x24\x65\xb4\x87\xd0\x7f\x2e\xf3\xf7\x4a\xdd\x71\xcd\xfd\xd1\x6e\x92\xfe\x25\x7d\x33\x46\x45\xb0\xa9\xbc\x7d\x07\x26\x13\xfb\x9c\x0c\xde\xa9\xdb\x4c\x72\xbc\x87\x10\x9e\x10\x2d\x7c\xba\xf3\x66\xec\xd6\x7f\xbe\x3d\xed\x32\x74\x73\x07\xa7\xae\xef\x61\x73\x5a\xd3\xaa\x5c\xe9\x5d\xee\xcc\x16\xa1\x6e\xb2\xa0\xbc\xc7\xad\xc0\xa1\x1d\x88\x80\x32\x26\x0e\x7c\x7e\xc9\xe5\x4f\x5a\x25\x31\x70\x2a\x7e\x5d\xfb\x87\xc3\x6c\xe3\x13\xa3\x14\x75\x88\xae\xf9\x62\xc7\x2f\xa9\x66\xd2\x41\x63\x7c\x38\x8b\x83\xdd\xec\x93\x43\xbb\x86\x34\x3e\x92\x0b\x12\xce\x1c\xc9\x15\xc8\x3b\x31\xe9\x98\x62\x69\x06\x74\xea\x49\x35\xa4\x88\x09\xd4\xd2\x79\x05\x41\x37\x54\x63\x92\xad\x9f\x08\xe7\xb8\xde\x61\xae\x73\xe8\x1e\x48\x3d\x3c\x63\xb5\xae\x73\x4e\x18\xe7\xa2\x2f\xee\xd1\x23\x3d\x0c\xa6\x33\x55\xf3\xa4\x8a\x33\x06\x7e\x1a\x0e\x19\x71\xf3\x6a\xa9\x29\xfe\x06\x13\xc2\x1c\x4a\xef\xf9\x41\x84\x29\xc3\xb0\x72\xa5\x98\x49\x59\x28\x7a\x5e\x5c\x40\xbe\x02\xbd\x22\xb9\xa7\x9c\x7f\x3f\x53\x59\xd2\xbb\xe4\x93\xf5\x56\xda\xcb\xb0\xcb\x4c\x29\x3c\x7d\x94\x12\x65\xe7\x77\x39\x2d\x14\x8d\x68\xc0\x7a\x13\xc8\xde\xc8\xe5\xd1\xe1\xc7\xf0\x41\xe8\x98\x3e\xdd\xda\xa4\x64\x9d\xac\x15\x72\xa3\x9a\xe4\xc6\x48\x0c\xa5\x50\xe2\xe4\x46\x2d\xcc\x84\x9c\x1b\xab\x78\x1d\x28\xa3\x55\x2b\x2d\x98\xe0\x2e\x15\x18\xe6\x55\x53\x40\xfb\x76\xd6\x8d\xb5\x89\x16\xd5\x56\xa7\xb8\x15\x63\xab\xa8\x1d\x9a\x57\xae\x50\xf0\x4c\xf5\x68\x60\x21\x84\x7d\x79\xb6\xbb\x3d\xa8\x01\x7a\x60\xb1\xc3\xbe\xef\xd4\x8d\x2b\x3c\xd3\x9c\x6f\x53\xc0\x8b\xcc\x96\x7d\x93\x06\x9f\x56\x2b\xb3\x6e\x0c\x4f\x4c\xa6\xbc\xcc\x5e\x57\xd3\x59\x03\xcd\x80\x0a\x61\x78\x5a\x93\x77\x0e\x37\x7f\x4f\xe8\xe9\xf4\xb6\x66\x80\x98\x49\x68\xf9\x64\x9e\x10\x5e\x7a\x11\x9d\x97\x63\x6f\x3a\x05\xca\xea\xb1\xd7\xea\x0b\xc8\x13\x34\xb4\x2d\x5c\xc0\x80\x83\x0e\xc2\x4d\x36\x9c\xf8\x67\x3a\x49\x0d\x59\xeb\x4c\xb0\x81\x81\xda\x39\xa4\x6d\x96\x6e\x23\xfe\xd8\xd3\x8a\x5f\xab\xc7\xe8\x43\xbc\xfb\x01\x5a\x44\x74\xbf\xd4\x6d\x4a\x43\xff\x4a\x51\xa9\x56\x76\x61\xe2\x69\x6d\xb8\x7c\x37\x58\xd3\xb5\x4c\xe7\x84\x6d\x13\x91\xd7\xf4\x65\x26\xef\x30\x84\x4d\x49\x32\x00\x18\xd7\x49\xb5\xd4\xdf\xd3\x0d\x38\x0c\x6e\x57\x3f\xc4\x14\xd8\xfe\xfc\x5d\x71\x04\x70\x75\x6b\xec\x00\xd8\x8a\xc4\xaf\xc9\x25\xd1\xed\xe3\x7e\xae\xe6\x00\x4a\x23\xea\x0e\xf8\xb6\x0e\x48"}, -{{0x4e,0xd7,0x04,0x8a,0xa1,0x28,0x4d,0xbb,0xcc,0x24,0x89,0x38,0xb4,0x0c,0x35,0x74,0x21,0x93,0x59,0x7a,0xdd,0xaf,0xdd,0xe0,0x64,0x13,0xb8,0xd4,0xcc,0xfb,0xe1,0x37,},{0xbf,0x84,0x1f,0xe4,0x44,0xad,0xd1,0xf7,0xc3,0xea,0xcd,0xfd,0x07,0x84,0xb4,0xe8,0x55,0xd2,0x40,0x5f,0x40,0x21,0xcd,0x9d,0x82,0x66,0x07,0x1c,0x32,0xc8,0xa2,0x73,},{0x10,0x6a,0x9d,0xeb,0x23,0x27,0xf3,0x38,0xcc,0xb7,0x1b,0xcc,0x94,0xe2,0xfe,0x3d,0x2e,0x97,0x3c,0xe6,0xdd,0x8f,0xa7,0xba,0xca,0x80,0x8b,0x41,0x11,0x81,0x3e,0x3b,0xc3,0xb4,0xd8,0x8e,0xfa,0x6a,0x00,0xc4,0x71,0x0b,0xbf,0xe5,0x31,0x96,0xf9,0xab,0x3a,0x15,0x0b,0x16,0x54,0xb9,0x08,0xfe,0xac,0xf9,0xc1,0x3d,0xf2,0xd6,0x38,0x02,},"\xdc\xff\x95\x87\xd6\x04\x6c\x11\x32\xbe\x07\xdf\x26\xdf\x63\x82\xff\x92\xcf\xc8\xeb\x53\x45\xc5\x1d\xd5\x0d\xd1\x88\xee\x76\x9f\x10\xa4\xde\x5e\x88\x83\xd1\x16\x96\x7b\xea\x97\xd3\xb3\x2b\xc8\xae\xbb\x9f\x01\x3d\x6d\xf9\x52\xf2\x51\xc1\xa3\x12\x34\x6e\x72\xce\xe1\x35\xa1\xbf\xd7\x6b\xf3\x08\x0a\x35\xc8\x38\xb4\x4d\x75\x5f\x26\x3d\x21\x03\x10\xfa\x8d\x28\xc4\xca\x52\xf0\x8c\xac\x5b\x83\xa8\xa3\xb1\xdf\xc4\x6d\x9b\x75\x2d\x9f\xc7\x36\x49\xd0\x0b\xb9\xee\x99\x26\x50\x63\x9c\x22\x5d\xea\xc1\xf3\x9b\x9e\x80\x36\x89\xd1\x9e\x6d\x9f\x8e\xf4\xf5\x1f\x1d\x11\x60\x1f\xac\xf4\x10\xdb\x64\x8b\xcc\x82\xbf\x64\x87\x69\xa7\xdd\x59\xc6\xe8\xa2\x37\xdb\x23\x9d\x3f\x66\x1d\x78\x52\xc4\x26\xd3\x94\xa9\x05\x09\x52\x6a\x85\x9b\x47\x64\x59\xde\xdb\xe6\xd8\x99\x36\xc0\xf3\x98\x99\x95\x51\x1d\x4a\x57\x6e\x54\x2c\xce\x5e\x0d\xd7\xee\xef\xeb\x03\x26\xd3\x3f\x25\xc2\x2a\xb6\xe7\x69\x06\x33\xf4\xc9\xed\x2a\xad\xf1\xd2\x4f\x94\x86\x21\x23\xa4\x64\x04\x2c\xea\x19\x3a\x2f\x04\x79\xd3\x9b\xcd\x1b\xbd\x1c\x7a\x0c\xa7\xe6\x25\x8e\xd3\x73\x23\x72\xf5\x4e\x0e\xd5\xe3\xf1\xe2\xe4\xd4\xa0\x4c\x51\x0b\xee\x08\xd1\xc6\xd5\x70\xcf\xd6\x3a\xbf\x14\xb4\xee\xf0\xb9\x6f\x39\xca\x29\xe4\x3c\x52\xf2\xca\x3d\xfd\x46\x0f\x66\xe3\x02\x35\xb1\x59\xaa\xef\x2c\xc1\x56\x01\x29\x69\xfd\x3d\x15\x99\x78\xd6\xca\xa0\xa9\x45\x22\x29\x1f\x79\x89\xd8\xaf\x10\x83\x19\x96\x13\x7b\x68\xd9\x7f\xc1\x7f\x6a\x9b\xc2\x84\x5e\xf3\xdd\x47\xcb\xc3\x86\xe8\x97\x7a\x86\x54\x36\x34\x12\xda\xc3\xac\x51\xc6\x38\x17\xb7\xc0\x51\x87\x8d\xcf\x45\x8a\xb3\x63\x0d\xd7\xae\xf6\x8d\x27\x0f\x8d\xa7\x88\x0a\x46\x7b\x33\x04\xf5\xba\xed\xfb\xa9\x17\x3e\x7e\xfd\x00\x7c\x41\x2d\x17\x20\x9c\x56\xd2\x39\x68\xe3\x40\xb8\xa0\xed\xb4\x1b\x7e\x2a\x40\x88\xbe\xc0\x1b\x53\x2d\xf8\x9b\x52\x15\x81\x31\x31\x10\x7b\x7b\x47\x4f\x03\xc2\xe4\x7d\x43\x17\xf1\x1c\x4f\x51\x60\x90\x43\x04\x99\x7e\x76\xa1\x21\xa9\x56\x02\x35\x20\x8d\x79\xb2\xda\xb4\xf7\xe1\x96\x79\x32\x02\xc0\x90\x2c\xe9\xc4\xbf\xc1\x0b\x8f\xe3\x97\xe3\x5c\xa0\x25\x64\x54\x66\x2a\xe8\x78\xef\xb0\xa0\xa6\x06\xfa\xc0\xa9\x52\xc9\xf6\xba\xae\xb2\xd4\x5b\x25\x8c\x61\x75\x59\xc0\xed\x25\x28\xa8\x8b\x49\xaa\x44\xee\x43\x03\x5b\x0d\x79\x3a\xad\x39\x53\xc1\xa5\xa3\x46\x38\x66\xbc\x81\x5b\x1f\xfc\xe2\xff\x2b\x65\xe0\xfd\x47\xdb\xc1\x5f\x4e\x7a\x06\xbf\xab\xc2\x90\xfc\x62\x09\x0b\xf7\xd9\x48\x53\xf7\x7c\x04\x44\xa9\xb9\x0e\xfe\x77\xd1\xce\xb4\xbd\x39\xe2\x03\xbc\x88\x40\x11\x62\x4e\x68\x46\xe2\xa3\x71\x05\x8d\xab\xa6\x3c\x23\xf8\x6c\x42\xc3\xe3\x1e\xaa\x4b\xd7\xd7\xa4\x2a\xf2\xd5\x24\x89\x6e\x31\xba\xa3\xe2\x07\x63\xf8\x5d\xcf\xd5\x27\x75\xf2\x80\x72\xd8\x9f\x0b\xd4\xfa\xe3\x0d\x0b\x13\x7e\xe3\x7a\xb0\x63\xba\x06\xfe\x9d\x4e\xc6\x2a\xbb\x2f\xea\x0f\x81\xb8\xcb\xee\xfc\x03\x00\x80\xb8\x02\x6a\x58\xfd\x18\x67\xf6\x6b\xe1\x15\x4e\x65\xbf\xea\x7d\xce\xc5\x5f\xe3\x2d\x51\xfb\x0b\x4a\x8a\x5a\x8a\x04\x42\x63\x94\x3d\x6a\xc8\x01\x1c\x6e\x67\x01\xbe\xec\x3a\x88\x65\x58\x40\xc4\x89\x2d\x45\x0d\x31\x2b\x76\x52\xd2\x51\x47\x69\xf2\x3b\xfd\x6e\x70\x46\x46\x7d\xf2\x9a\x28\x7f\xf3\xc4\xc9\xd0\xe6\x4e\x6d\x9e\x4e\xde\xe1\xb9\x35\xd0\x76\x81\xd4\x70\x04\x35\x28\x86\xe8\x47\xb0\xc6\xd5\x76\x2f\xd4\x5a\x81\xa5\x3c\xce\x94\x76\xc8\x87\x22\x1a\xea\x6c\x0c\x82\xbb\xf3\xb2\x97\x93\x2e\x5b\x11\xe5\x38\xa3\x24\x5d\x63\xd7\xb7\xb0\x91\xdf\xa1\xd7\xb9\xa0\xe2\xdb\x66\x98\xa4\xc5\xe9\xfe\x93\x16\x62\xd7\xc6\xec\x6d\x9d\x5b\x92\xbc\x7e\x04\x15\x55\xdf\x4d\xf0\xca\x11\xca\xbc\x48\x5f\x9c\x55\x61\x38\xa7\x17\x45\xf0\x3b\x97\x83\xbb\x20\x0b\x72\xd2\x33\x69\x7e\x8b\xcf\x6b\x41\x17\xee\x67\x63\xd7\x92\xd7\x42\x22\x64\x85\x2f\x4f\x30\xf8\xd1\x89\x0e\x2e\xa0\x80\x98\x04\x0f\x7f\x28\x8e\x4a\xbe\x90\xb6\x3c\xab\x2c\x14\x37\x30\x60\x84\x0e\xf8\x27\xec\xc8\x46\xcd\x56\x0e\x90\xa2\x0b\x83\x05\xf4\x63\xc3\x6e\xa0\x38\x84\xa5\xdf\x4c\x25\xf1\xba\x9e\xa1\x25\x95\x2d\xc0\x91\xb9\x75\x16\xde\x1d\x28\x7c\x0e\x2b\xf5\x29\x77\x5b\xa6\xd2\xf8\xed\xe0\x3c\xb4\x2c\x1e\x40\x0e\xc8\x04\xa9\xdf\x08\xe4\x6f\x44\xb5\x06\x63\x46\xe3\xf7\xc7\xa1\xa8"}, -{{0xc7,0xec,0xa8,0x3e,0x94,0x85,0x76,0xbd,0x9f,0x27,0x8f,0xd7,0xb8,0x28,0x00,0xa4,0x1d,0x92,0xda,0x9b,0x72,0xd5,0xa1,0xcc,0xdb,0xbc,0x65,0x58,0x10,0x52,0x56,0x8b,},{0x07,0x6b,0x83,0x52,0xdc,0xa8,0x03,0x1e,0x85,0x3c,0x8d,0x90,0x99,0xc2,0xef,0x57,0x93,0x37,0xcc,0x7b,0x2b,0x4c,0x75,0xd1,0xa0,0x63,0xea,0x3e,0xc7,0x25,0xb7,0xfd,},{0x86,0x99,0x6a,0x1b,0x8e,0x49,0x5d,0x42,0x52,0x77,0xe9,0x7c,0xc0,0x83,0x05,0x49,0x34,0x9b,0xc2,0xb6,0xf3,0xdc,0xda,0x60,0xf3,0xb7,0xd3,0x50,0x1b,0x8b,0x50,0xb5,0xb4,0x58,0xcd,0xa5,0x8b,0x43,0x6e,0x23,0xc0,0x2c,0xd4,0xa2,0x2b,0x23,0x48,0x13,0xaa,0x9b,0xcc,0x3c,0x61,0xf9,0x83,0xc0,0xb7,0xef,0xec,0xa0,0xf1,0xbe,0xc2,0x0d,},"\x8d\x8c\xef\xd6\x73\x85\x5c\xcd\x8e\xb8\x53\x4c\x31\x2d\x33\x80\x05\xbb\x05\xf5\xb9\x50\x7d\x58\x85\x9e\x1e\x95\x3b\x0a\x4d\x91\x3b\xe7\x59\xd8\xed\xfa\x92\x89\x8c\x6e\x70\xa5\x3f\x81\x95\x4f\xc3\x44\xb4\xad\x62\x46\xb0\x10\x94\x81\xba\x6f\x73\xae\x63\x31\xab\xf2\xdf\x10\x8e\xb2\xe8\x5c\xeb\x08\x7c\x1f\x6f\xcf\xc9\xde\x2c\x1f\x13\x9b\xa1\x77\x1b\x72\x68\x03\x02\xd8\x11\xcc\xd0\xcc\xd4\xe0\xc7\xfe\xb0\x13\x2e\xb2\x0b\x33\x4e\x5a\xab\xe5\xf6\x11\x9f\xd8\x94\x7d\x9e\x88\x52\xe1\xeb\x1b\x74\x10\x7e\x17\x41\x00\xe3\xe6\xdf\x0c\x3a\x68\x13\x0c\xa6\x30\x94\x02\x59\x4b\xb5\x0c\x1c\x8e\x27\x74\xf1\x32\x14\x49\x6a\x7b\x1f\x34\x83\x85\xea\xbf\xbc\xcb\xac\x16\x5a\x5a\x2e\x7d\x9d\xea\x5f\xfd\x58\xb0\xbd\x88\xb4\x9c\xb3\x31\xec\xb7\xf4\xe9\xd6\xba\xe9\x79\x1a\xd7\x88\xe6\xab\x89\x26\xc1\xcc\x16\x15\xde\xaf\x4c\xc4\x00\xc7\x7a\x31\x61\x97\xbc\xa1\x90\x49\x95\xe1\x36\x5d\x1b\x97\x02\x64\x83\x76\x11\x69\x30\xf6\xf9\x11\x66\xe6\x14\x86\x29\xe7\x5b\xe2\xd0\x68\x95\xf6\xa8\xd1\x5d\x5a\x94\xca\x69\xb7\x12\xf3\x3b\xcf\x95\xbe\x0c\x1b\xe6\x90\x2b\xb7\x8b\x8a\x23\x0d\x7a\x85\x60\xc4\xd8\x4e\x23\x89\x55\x2a\x81\x57\x1a\xa6\x65\xc1\x9c\x2e\x93\xb0\xd4\x3e\x8c\x2c\xbd\x9e\x88\x5d\x70\x52\x51\x8b\x77\xc4\x7e\x84\x1d\x11\x9d\xc2\x8b\x65\xa7\x50\x4f\x66\x42\x71\xf0\x6c\x7f\xf3\x93\xf8\x25\xb1\xe5\x93\x0d\x02\xb9\xc7\x00\x35\xe2\x92\x41\x1c\x4a\xed\xf6\x60\x47\x00\x69\x70\xe3\x49\xdf\xca\x7f\xb4\x1c\x10\xfd\x53\x7e\x35\x25\x2e\x10\x9e\x33\x36\xd7\xa8\x2a\x14\xde\x5d\x55\x40\xc6\xfc\x65\x71\xd5\x77\x4f\x39\xb7\xc4\x03\xe7\xb8\x87\x5e\xc2\x15\x87\x7e\xfc\x6c\xc8\xea\x48\xb1\x86\xb4\x68\x21\xea\x5e\xf2\xba\x8b\xac\xd4\x0d\x79\x7e\x6a\xdd\x06\x41\x32\x83\x14\x5b\x60\x46\x2b\x35\x03\xc5\xb8\x81\xd7\x9a\x59\x29\x55\xd1\x8a\xfa\x08\x96\x9e\x31\x45\x7f\x5b\x27\xda\xec\x01\x03\x38\xed\x86\x7f\x30\x08\x78\xfd\x87\xce\x32\x18\x80\xb8\x60\xa0\xc6\x42\x84\xca\x2d\xc1\x5f\x5e\x53\x10\xe1\x0e\x6a\x73\xa7\xea\x65\x0e\xa9\xd3\x73\x69\x4d\xa4\xdd\x42\x9a\xe7\x41\x2e\xf9\xb2\x9c\x83\xb3\xb0\x68\xc7\x47\x69\xf4\x31\xce\x06\x15\xf9\xff\x4f\x82\xba\xac\x47\xb4\xbc\xe9\x04\x49\xec\x41\xc2\xa2\xd5\x73\xd9\x2b\x92\xe0\x56\x31\x48\x61\x65\xbc\x71\x0e\xf5\x84\x0f\x80\xda\xe9\xf9\xdd\x5c\xff\xd4\xeb\xf5\xd1\x07\x46\x51\x0c\x5f\xcb\xfe\x62\xcb\x97\x03\xc0\xb1\x54\xc8\x6f\x10\x81\x66\x72\x49\x76\x70\xa3\xb0\x15\x0b\xb4\xe1\xb0\x3b\x3b\xd5\x44\xc1\x2a\x90\xc3\xed\xcc\xd7\x90\x0e\xbb\x5b\x31\xc9\x11\x17\xcc\x82\x81\xa3\xc4\xed\x04\x99\x8e\x99\xae\xd4\x1b\xb4\x1f\xce\x99\x90\xa4\x06\x48\x5b\x14\xdb\xe3\xbc\x1a\x5f\xcf\x77\x19\x50\x79\x90\xda\x3b\x0b\x3c\x68\xad\x40\xd8\x95\x0c\x0d\x49\xce\xd1\x01\x93\x19\xa3\xf3\x6a\xff\x6c\xaf\x75\xd7\xf9\xa0\x93\x3d\xd3\xab\xdd\x76\x92\xa1\x56\x2f\x06\x13\xfe\x4a\x27\x8d\x5c\xe4\xc8\xda\xfb\xb5\x5b\x2e\xc2\xaf\x2b\x24\xe8\x39\x6f\x58\x7b\x17\x0c\x9c\xa6\x54\x75\x08\xfa\xcd\xe7\x34\x90\xdf\xb0\x1e\xb6\x65\x7e\x3f\x4f\x27\x23\x04\xb7\x0b\xf0\x47\xa4\x3a\x2b\x58\xe5\x56\x8b\xc5\x2b\x2c\x8d\x4c\x03\x21\x9a\x5a\x8b\xd3\xdc\x06\x43\x18\x59\x13\xc0\xaf\x74\x11\xf8\x1b\x77\xbe\x2a\x9b\xfd\x5c\xb2\x69\x77\x11\x3d\x26\x58\xa9\x71\x92\xb4\x1c\xf6\xc7\x01\x1b\x0f\xf6\xa1\x1c\xbf\xf3\x50\x55\x46\x32\x2f\x0b\xef\x60\x97\xe4\x6b\x36\x49\x2b\x01\x6a\x45\x62\xe0\x92\xb6\x7c\x3f\xcc\xc7\x78\x0e\xa2\x74\xd9\x6d\x59\x58\x49\xf7\xe2\xa5\x6d\x79\xed\xcb\x32\xd7\x84\x04\x9f\xc1\x32\x4a\x5b\xee\xfc\x24\x19\x3a\x66\xe1\xca\xc4\xa1\x3a\x81\x1b\x90\x95\x83\xcc\x91\x0c\xf0\x8d\x4b\x10\x4d\xbd\xb8\xa6\xf2\xb2\x1f\xbc\x1d\xb1\x17\x5a\x1a\x23\x56\xa6\x3d\x3e\xea\x9d\xbb\x85\x37\xd2\xc6\x86\x27\x54\x3d\xf0\xd1\xf8\xfd\x8d\x57\xa1\x8b\x0d\xbd\x69\xb9\x20\xcb\x9b\x28\x6e\x3c\x07\xae\x44\xae\x2e\x1b\xee\xc0\x1c\xee\x6b\xa9\x88\xb5\xd1\xaf\xb9\x97\x90\xb1\xdd\x91\x06\x55\xc4\x3d\x7f\x2a\x3e\xd3\x75\x4b\xa4\x65\x16\xd2\x78\x70\x55\x59\xf5\x74\x16\x22\xa9\xab\xb5\xc8\xf2\x3f\xa9\x76\xa9\xd1\x46\x94\x8a\xde\x6b\xa6\x60\x8a\x35\xe4\xe0\xd3\x30\xe8\x2e\x96\xa2\xbe\x6c\x78\xad\x0c\xd4\xd8\x70\x4e\x57\xce\xa1\x46"}, -{{0x7b,0x46,0x9d,0xf9,0xc8,0xf7,0x84,0x89,0xab,0x47,0xcc,0x70,0xa8,0x85,0x03,0xf1,0xb8,0xf3,0xd9,0x29,0xc3,0x3f,0xea,0xb1,0xc5,0x03,0xf0,0x96,0x9a,0x3a,0xc3,0x7b,},{0xa8,0x14,0xc7,0xe3,0x73,0xd0,0x11,0x3b,0x90,0x62,0x4a,0x8a,0xb2,0xbc,0xa5,0xcf,0x53,0xbf,0x52,0x8e,0x39,0xfc,0x3d,0x36,0x7d,0xe1,0x54,0xb9,0x4b,0xb2,0x2f,0x1d,},{0x18,0xfa,0xf8,0x2d,0x08,0xe1,0x06,0x8e,0x9f,0x98,0x3d,0x81,0x2f,0x05,0xfd,0xb6,0x92,0x9d,0x27,0x23,0xdb,0x1f,0x77,0xc4,0x5a,0x74,0xbb,0x09,0xcf,0xf2,0x77,0x73,0xb5,0x4c,0xe8,0xf4,0x3b,0x30,0x15,0x41,0x91,0x12,0xe7,0x25,0xea,0x7a,0xcd,0xa4,0xb2,0x3b,0x81,0x20,0xe7,0xb0,0xcf,0x42,0x01,0x53,0xe5,0xb0,0x3d,0xd0,0x61,0x09,},"\x1c\x0f\xd7\x45\x0e\x29\x67\x5c\x93\x09\x16\x38\xc2\xac\x93\x3c\xa9\x97\x76\x6e\x38\x0e\xc3\x3a\x92\xb8\xa7\xe1\xa1\xed\x98\x21\xc7\x5f\xcc\xb5\xc5\xf3\x76\x0e\x76\xd0\xe8\x81\x03\x11\xdd\xc6\x24\xea\x87\x42\x13\x1c\x1c\x43\x08\xf4\x17\x8e\x04\xd0\x49\x60\x69\x3d\x84\x6c\x1f\x51\xd8\x77\x3b\x6d\xeb\x34\x43\xd8\x74\xb9\xe2\xde\x3b\x77\x78\x51\x85\x51\x8b\x2e\x9e\xe7\x36\xc6\x3a\x39\xc8\x21\x2c\xa8\x66\x9e\x16\x1d\x13\x1b\x1a\xb2\x26\x4f\xdd\x72\xdc\x56\x28\xb1\x1c\x06\xf2\xaf\x9f\x07\x89\x04\x7b\xdd\x4e\xbb\x5d\x55\x89\x9f\x74\xdc\x4e\x12\xe7\x97\x53\x63\xf6\x3a\x8d\xa7\x6b\x55\x85\xc1\x6b\xb6\xd5\x5b\x05\xfa\xde\x87\x13\xd1\x9c\xad\x1a\x21\x16\x40\x26\x26\x91\xaa\xc9\xb4\x37\xa9\xec\xf8\x9a\x92\x46\xec\xdb\xa1\xff\x0b\xea\x78\x49\x4c\xee\x15\x29\x62\x16\xea\x6b\xb8\x82\x47\x9d\x24\x37\xc9\x49\x4a\xc7\xfa\x4f\x30\x15\xd1\xd3\x14\x9d\x55\x64\xd7\xc1\x1a\x7e\x7b\x61\x4f\x7d\x3e\x9d\x45\x4f\x0a\x05\xb0\x40\xa1\xe0\x6f\xe7\x83\x7c\x2a\x9d\xa2\x79\x4d\x91\x8b\xff\xa9\xe6\x1a\x0c\x3f\x08\x9f\x6c\x9f\x7e\xea\xc5\x86\xe3\x4b\xf9\x44\x70\xd9\x13\xda\x41\x37\x1c\xac\xdf\xc7\xee\x8b\xd1\x13\x56\x55\x56\x69\x24\xea\xdf\x09\x6a\xc0\x30\xa6\x59\x02\xc1\x03\xb1\x72\xd1\x2e\x88\xf0\x53\xfc\x56\xee\x73\xf3\x18\x70\x81\x70\x83\xaf\xa8\x02\xf7\x66\x8b\x81\x5e\xe7\x90\xf7\xd4\x0b\x43\x7a\x2e\x6d\xb2\xf0\xfb\x26\x83\x6b\x4b\x23\x31\xeb\xa5\x55\x39\x61\x4c\x0f\xe1\x72\x40\x24\x2d\xd3\xaf\x73\x83\xbc\xff\x7d\x3f\x47\xd6\x54\x4b\x08\x72\x0c\x0a\x52\x44\x1f\x74\x11\x93\x5d\xd4\xa9\x52\xd3\x86\x51\xa8\x00\x05\xfa\x3e\xb0\xea\xec\xc7\x35\xd2\x90\xe8\xbd\x5e\x31\xb7\x40\x14\x0e\x13\x6b\x2c\x00\x25\x23\xd8\xeb\x2a\x0a\xb5\xbd\x68\x70\x02\xb3\xb9\x26\xf7\x5e\xb6\x90\xd1\xda\x73\xad\x23\x58\x92\xf3\xb2\x3a\x75\x6b\x60\x5a\x43\x7c\x00\xe0\x62\x13\x04\xe8\x10\xf9\x9e\x31\x4c\x4d\x63\xe3\x22\xd9\xb6\x98\x15\xf3\x82\xff\xa1\xec\x62\x80\xfc\x0e\x64\x1c\x8a\x6f\x6f\x7f\x61\x98\x5b\xd3\x56\x7e\x0f\x44\x0d\xe9\xf7\x62\x17\x15\xda\xcd\x07\x42\x8c\x00\x90\x15\x4d\x59\xce\x6d\xb4\x01\x69\xc6\x58\xac\x5b\xf4\x4b\x67\x67\x1f\xe1\x9e\x4b\x5b\x38\xaa\xd2\xd3\xd4\xe1\x90\xa5\x50\xaa\xd4\x18\x83\x52\xf7\x98\x1a\x6d\x88\x06\x25\x02\xdf\x86\x79\x13\x50\x39\x2d\x41\xce\xfa\xcb\x24\xe3\x7b\xc7\x00\xcb\x02\x91\x90\xc3\xb1\x82\x14\x77\xe1\x17\xd5\xa4\x62\xfb\x3e\x79\x13\x3b\x10\x73\x59\x89\x66\xf5\x2b\x63\x25\x6d\xbf\x32\x6a\xce\x14\xdb\x0c\x80\x05\x8c\xf0\x0d\x68\x9a\x0a\x58\x11\x1a\xf1\x69\x27\x44\xbf\x79\x1b\xcb\xb4\x27\xa3\x72\x24\x6e\x95\x01\xa8\x5c\xd5\x20\xc6\x1a\x1e\x59\xee\x18\x0e\x8c\x97\x19\x2f\x60\xfa\x5d\x3a\xb0\x5d\xf8\xd8\x55\x1c\x1a\xc6\xca\x0a\x9a\x01\x2f\xfe\xce\xb3\xc1\xf5\x21\x41\x1e\xdb\x65\x09\xbc\x27\x8a\x65\x1e\x12\x9e\x96\xb0\xad\xc7\xae\xd7\x07\x22\x1c\xae\xac\x22\x98\x84\x41\x3d\xaa\x10\x59\x5d\x22\xd1\xdb\x70\x82\x12\x5f\x4f\x96\x95\x00\xa1\xd4\x8d\xac\xda\xe8\x0f\x40\x29\xc1\x63\xdc\xd7\x9d\xdc\x64\x68\xfc\xda\x16\x37\xb8\x7d\xdc\xf2\xa3\xd9\xb4\xd2\x99\xa0\xe5\x39\x4d\xf9\x0e\xd0\x3b\x62\x13\x7b\xa6\x7b\x9f\xea\x8a\xe1\xf0\xd2\x2f\x91\xc6\x3a\x24\xb5\x93\x4f\x74\xc2\x65\xc4\x3f\x1b\x92\x3d\xb9\x80\xad\xfc\xee\x83\x13\xda\x52\x01\x76\x73\x0e\xf9\x73\x6b\x27\xe6\xba\x32\xd1\x7e\xa6\x9d\xca\xc6\xf4\xa0\x16\xed\xfe\x2d\xb5\xa5\xbb\x3b\x64\x93\x2f\x70\x11\xf1\xc4\x53\xbb\xe8\x8b\xba\xc8\xc7\x03\x5f\x93\xfe\x39\xb5\x81\xfc\xaa\x7a\xaf\x08\x2f\xbe\xd0\x04\xfd\x1f\xd5\xa4\xe2\xd9\xc1\x97\x16\x60\x4b\x19\xce\x19\x9e\x21\x69\xa7\xbe\x51\x8d\x5f\xad\xd2\xac\x31\xb9\x54\x78\x08\x2a\xc9\x13\x06\x00\x8d\xe4\xec\x0e\xf4\xc9\xf9\xd6\xf9\x6d\x2f\x66\xd6\x2f\xaf\xc2\x19\x40\x82\x80\x8a\xf0\xd6\x7b\x9f\xba\x0d\x18\x9b\x05\x5f\x06\x1c\xca\xc2\x4b\x27\x61\x0b\xfb\xd5\xa2\x23\x2d\xd6\xf3\xc8\x90\xa9\xb1\x26\x64\x71\xb3\x22\xe9\xe1\xbf\x97\x75\x7b\xef\x72\xab\xce\xe9\x3b\x05\x1f\xc9\x23\xcf\xd4\xe7\x23\xbe\x3e\x17\x14\x3f\x38\xee\xbb\x90\x0b\x5b\xbc\xf7\x30\x47\x32\xb9\xc0\xa1\xc5\xfc\x95\x09\xa6\x93\x58\x0a\xe7\x3a\x4c\xdf\xc5\xfb\xf2\x0c\xe8\x1e\xbc\x83\x5c\x6c\x90\x9d\x83\x11\x41\xb1\x94\xf6"}, -{{0xdf,0xec,0xde,0x7a,0x56,0xa1,0x8c,0x1f,0x19,0xd8,0x0a,0x19,0xa4,0xf1,0xda,0xdd,0xd0,0xbc,0xec,0xb0,0x1e,0xec,0xad,0x6d,0xfc,0xa0,0xf9,0x57,0xa9,0x14,0xed,0x7a,},{0xaf,0xba,0xa6,0xe7,0x3e,0x85,0xb0,0x2b,0x25,0xa4,0xb5,0x87,0xec,0xb8,0xc4,0xdf,0xb7,0x9a,0xa9,0x20,0x27,0x61,0xef,0xa8,0xd1,0xdf,0x2c,0xd0,0xaa,0x63,0x16,0xc4,},{0xb4,0xfd,0xe5,0x5b,0x91,0x6c,0xf6,0x00,0x68,0xf1,0x9b,0x25,0x35,0x1c,0x14,0x10,0xdc,0xf6,0x6b,0xfc,0x40,0xf9,0x6d,0x1b,0xa2,0x36,0x8b,0xc2,0xb9,0x11,0x5a,0xaa,0x5b,0x2d,0x1c,0xf0,0xe3,0xdf,0xca,0x02,0xac,0x90,0x2a,0x94,0x3e,0x24,0x89,0xa5,0x68,0x1b,0xba,0xfe,0xd3,0x9c,0x6e,0x33,0x21,0x1a,0x9c,0xb2,0xff,0x6e,0x54,0x09,},"\xae\x6e\x8f\xf6\x5c\xcd\xe6\xf2\x64\x84\x95\x08\x26\xb4\x36\x23\x05\x8a\x5e\xfe\x02\x0b\xb1\x9b\x7d\x8b\x4e\x25\x76\x8b\x69\x27\x34\xfe\x07\xc9\x13\xb9\xe8\x81\x26\xbe\xcb\xf1\x4a\x0f\xd0\x20\x5b\x39\xfc\xc2\xae\xc3\x73\xf8\xc1\x84\xc6\xa9\xbb\xbb\x84\x44\x9a\x7c\xa3\xb9\x20\xad\xa0\x88\x01\xdf\xc6\x6f\xf1\x9a\xeb\x92\xf2\x55\x53\x99\xa4\x30\x27\x7a\xe2\x2d\x23\x75\x4e\xaa\xce\x3c\x73\x84\x67\x97\x53\x6d\xd7\x1a\x56\xf4\xb5\x84\x2c\x0f\x41\x0d\x19\x89\xac\xac\x5d\x80\x5d\x26\x57\x2c\x0f\x3a\x64\xdd\x20\x71\x66\x22\x12\xd5\x2f\xe9\x9e\x59\xd9\x66\x04\x77\x77\xf9\x03\x0f\xa4\xfd\x2e\xe7\x4b\x7a\x7c\x9f\x7c\x34\xa6\xdc\x7e\x03\x59\x3a\x13\xd6\x4c\xe6\x24\x53\xee\x3c\xa3\x0d\x84\x67\x28\x39\xf1\x9f\x1c\x15\xd0\xc4\x5d\x27\x55\xbb\x39\x4a\xcf\x4d\xcb\x7f\x7f\x07\x11\xac\x40\xea\x46\x61\x2e\xa3\x7a\x76\x07\xad\x32\xe8\x18\x26\x5f\xab\x19\x33\xf5\x09\x4e\x2d\x03\xbc\xfa\xa5\xf6\x16\x67\xf3\xb3\x7f\x00\xc4\xc5\x8d\x9b\x41\xb9\xaf\x39\x00\x48\x2b\x0f\xfb\x4f\xa4\x37\x6a\xa0\x40\x00\x9d\xec\x2f\x45\x25\x79\x9c\xb0\x05\xf3\x9d\x74\xcb\x2d\x8d\xce\x8c\x20\xc2\xc3\xf5\x40\x97\x03\xaf\x15\x6c\xfb\xa2\x8a\x9d\x91\x64\x39\xcb\x29\xf8\x3d\x24\x29\xce\x62\x23\x51\x9e\x75\xe1\x5c\x7c\x7f\xa2\x15\x11\x9e\x07\x3f\xa7\x97\x4d\xb1\x4f\x7a\x01\x09\x3f\xaa\x94\xad\x52\xab\x1e\xad\xce\x1a\x89\x36\x6c\xa1\x3a\xdb\x89\x06\x64\x38\xa2\xbe\xb7\x30\x34\x17\x0a\xa4\x2d\x9c\x2d\xdb\x97\xc1\x4a\x17\xc3\x09\x43\x76\xd2\xa3\xff\xd8\x09\x5f\xc4\x05\x3d\x91\xd1\x6e\x06\xd2\x76\x93\xa1\x31\x0f\x01\xa7\x51\x11\xcf\xed\xa8\x92\xc3\x97\x2a\x13\x3a\x09\xad\xda\xa8\xf7\x41\x45\xf8\x86\x81\xb6\xd2\x77\x96\x4b\xfe\x38\x55\x1a\x2c\x61\x9f\xa3\xca\xe3\x94\xac\xb2\x9c\x94\x10\xb4\x5e\x10\x1b\x17\x40\xe8\xb2\xaa\x6f\xeb\xc3\xa4\x5d\xad\xb9\xd9\x58\x9d\x59\x7e\x57\xcd\x94\x7b\x68\x4c\xc3\x55\x24\x6c\xe6\xc3\x26\xdd\x98\xcf\x92\xb6\xee\xa3\xba\x5a\xb0\x37\x00\x62\x26\x36\x32\x4d\xc1\x22\x2c\xd7\x48\xfa\x07\xbf\xd3\x9a\x1e\x06\x98\x09\xe5\x67\x14\x1a\x61\x3e\x2e\x8b\xe9\xdd\x39\x8a\xb6\xbe\xaa\xfd\x85\xff\x36\x28\xee\x2a\xa3\x2d\x0a\x57\xbb\xac\xf9\x56\x19\x0b\x5c\x42\x42\xeb\x5b\x85\x87\xd2\xfd\xcb\x07\x41\xb9\x41\x6a\x05\xf5\xfe\xcb\x1f\xb2\xd6\x47\x88\xdc\xe7\x83\xc1\xf6\x3e\x60\x64\x1f\xce\x5e\x1d\x2b\x18\xa9\x50\x0c\xd6\xa1\xfd\x33\x5c\xc1\xdb\x46\xef\x04\x75\x2b\x2d\x22\x07\x2e\x6d\xfc\xfc\xfa\x56\x9b\xb2\x5e\x45\x7a\xfe\xb6\x3a\x4f\xbe\xdc\x29\x3a\xd9\xd1\xab\xa4\xe3\x94\xaa\x10\x97\xe1\x2b\x0f\xc9\x0c\x89\xf7\x6d\xf0\xd6\x44\x1f\xa9\x98\x08\xb6\x0b\xe0\x7d\xfc\xc7\xf9\x01\x0b\xbf\x90\x33\x55\x6d\x5e\xe2\xd4\x48\x93\x7b\x78\x34\x93\x92\x0f\x68\x1e\x4d\xa7\x08\x67\x10\x97\xe1\x99\x48\x1b\x8e\xf0\xe0\x15\x0d\x7c\x28\x51\xdf\x44\xc5\x45\x12\x2f\x9b\x0e\x5b\xa2\xee\xff\x2d\x98\x8d\x56\xd9\xbb\xb5\x5d\x98\x96\x11\x11\x51\xa4\x36\xaf\x06\x5e\x0c\xad\x17\x8a\x2c\x9f\xa8\xf6\x97\x4e\xcd\xf0\x9a\xdf\x01\x33\x00\xcf\xfe\xda\xf4\xb8\x79\x1b\x46\x7b\xa7\x93\x3a\xda\x5d\x63\x2d\xb4\x4e\xd6\xdc\xf2\xaa\x64\x89\x17\xbe\x63\x37\xd2\xe2\xd2\x06\x85\x6d\x08\xf9\xee\x7b\x5e\x2f\x14\xdd\xc6\xd3\xac\x42\x92\x15\xa8\x79\x23\xad\x32\xd5\xdc\xfe\xe3\x68\x63\x16\xdd\xd1\xb2\x7b\xb1\x93\xa5\xfc\x05\xc8\x93\xa9\x39\xa5\xb9\x89\x87\x36\x6c\x82\x9e\x39\x2f\x48\x5e\xa1\x5e\x22\xcd\x8f\x85\x7a\x13\x4a\xfa\x98\xf3\x72\x15\x57\x6d\xdc\x5a\xab\x4f\x2d\x10\xca\xaf\x05\x00\x59\xa3\x35\xf2\x4b\xcd\xcb\xac\x81\x9f\x66\xdb\x07\xaa\xbd\xfb\x76\x27\x1d\x17\xbc\xe2\x2c\xba\x46\x3a\x80\xaa\x89\x2d\x0d\x8e\x05\x5f\x94\x8d\xf7\xf6\xe6\xc3\x00\xda\xef\xfd\x3a\x23\x6d\xdd\xcf\x23\x8f\xe1\x06\x66\xa5\x7c\x6e\x3a\xe7\xe3\x67\x3d\x35\x57\x8f\x8b\x8e\xa6\x9d\x3c\x08\xe0\x14\x0a\xfd\x3e\xe0\x30\xb2\x2a\x37\x21\x60\xf9\x08\xa3\x78\xf8\x10\x1b\x5f\x59\x69\xfe\xa3\x10\xee\xd3\x7a\x00\xd9\x73\x02\xd5\xc2\xdb\xe8\xcc\x60\x00\x75\xdc\xcd\x33\xad\x63\xd2\x65\xaa\xf6\x0e\x24\x1c\xe3\x11\xbe\xd7\xdd\x5e\x27\x45\x24\x1a\xe0\x2a\xe5\x32\xd1\x5c\x18\x88\x6e\x81\x81\x38\x75\x1a\xfc\x51\x85\x0e\x50\x6c\x6d\x31\xa8\xee\xf4\x51\xad\xfd\x4b\x3d\x26\x6b\x41\x5a\x7e"}, -{{0x07,0x82,0x8c,0x58,0x0e,0xbf,0x9e,0x1d,0x82,0x5a,0x59,0xc3,0xbf,0x35,0xf0,0x72,0xae,0x12,0x33,0x55,0xbd,0xcc,0x24,0x9e,0xec,0x7f,0x2f,0xc5,0x75,0x5e,0x29,0xb5,},{0x58,0xe5,0xed,0x85,0x10,0x0b,0xbd,0x9b,0x22,0x21,0xaf,0xc9,0xc9,0x31,0x84,0x33,0x0a,0xd5,0x9e,0x13,0x85,0x60,0x62,0x44,0xbf,0x00,0x3b,0x8d,0x20,0x18,0x50,0x1b,},{0xbb,0x09,0x36,0x04,0x39,0xa8,0x2d,0xee,0x5c,0x7d,0x85,0x77,0x9e,0x54,0xc1,0x3f,0x88,0xe0,0x6d,0x38,0xf4,0xb9,0x49,0x60,0xfe,0x17,0xa1,0xeb,0xca,0xa3,0xee,0x2f,0x33,0x0c,0x64,0x91,0x54,0xbb,0xc8,0x75,0xa4,0x07,0x6c,0xf0,0xbb,0xf7,0xee,0xbf,0x7b,0x8d,0x08,0xd5,0xaa,0x4b,0xe7,0x41,0x38,0x81,0x24,0x5f,0xc2,0xd2,0xb6,0x01,},"\x0e\xda\xd5\xca\xe6\xed\x98\x43\xe9\x1c\x50\xd9\x34\xcf\x55\xdd\x65\x8f\x3d\x25\x20\x39\xcd\x6c\x75\xbe\x4f\x6b\x86\x6f\xb7\x5f\x35\xc8\xf9\x8f\x17\x21\xd7\xe6\xd9\xd9\x8a\x22\xe0\xb4\x93\x4d\xcc\x12\x92\x61\xbf\x67\x23\xb2\xfa\x7a\x99\x5e\x35\xc4\xbd\x79\xc5\x81\x6a\x32\x16\x07\xd9\xdc\xce\x39\xfe\xfa\x1d\x55\xde\x4e\x76\x17\x54\x8e\xc3\x85\xc3\xde\x01\xe3\x66\xbf\x50\xc4\x57\xa5\x55\xe9\x32\x07\x0e\x2a\x5a\x01\x97\xb7\x9e\xfb\xe7\x00\x6f\x0c\xec\x78\xb6\x0e\xbb\x8f\xa8\x78\x1d\x8e\xb7\x32\x6e\xdc\x30\xe6\x2d\x32\x97\xa1\xe0\xa1\x11\x71\x08\xc4\x6e\xe5\xdb\xef\xc6\x59\x42\x89\x33\x5e\x78\x0d\x55\xa0\x84\xf5\x52\xda\x3f\x36\xd3\xc4\xc6\x17\x8b\xa7\x4d\x4d\xec\xef\xc5\xa3\xb8\xc4\x7c\x16\xf5\x34\xbd\xb6\x08\x95\xd3\xd5\x4c\xd2\xbb\x26\x6b\x39\x9e\x4d\x4f\xb4\x8d\x7a\x8c\xde\x17\xf4\x24\x12\x56\x07\x37\xd3\xc0\x6e\x29\xdf\x52\x4d\x0c\xbd\x30\x93\xef\xca\x1c\x8f\xed\xca\xa1\x24\xab\xb2\x7a\xbd\xac\x6a\x29\xe0\xe8\x24\x6a\xbd\x6f\x5f\x53\x19\x50\x03\x7f\x76\x32\x3a\xa5\x6c\xc3\xfe\xfa\x60\x30\x41\xd5\x5f\x19\x29\xe2\x77\xe7\x2c\xda\x1f\x96\x54\x1d\x2a\xf3\xe9\x0c\x0f\x0e\x28\xbe\x19\x6d\x8f\x69\x21\xf3\xcd\x57\xa7\x92\x6b\x86\x0a\xa1\xbc\x40\x35\x76\x89\x2a\x96\xb9\x31\x90\xae\x38\x3f\x63\x1b\x72\x80\x26\x58\xb2\xe8\x45\x1d\x52\xa2\xf4\x5d\xb4\xf8\xbc\x3b\x0e\x4e\x50\xb6\xd6\x03\xa5\xbd\xd3\x0c\x23\x42\x00\xad\x7d\xeb\xb9\x63\xf5\x8a\x4f\xa2\x03\x30\xb3\x69\x64\x49\x44\x5a\xa3\x71\x82\x48\x42\xfb\xf3\x26\xd9\x01\xdf\xe3\xbe\x04\x54\x52\xa3\x74\x0d\xd1\x60\xe7\x27\x33\xf6\xe2\x73\x35\x25\xa2\x9a\x86\x5f\x6f\x50\xd5\x3b\xf7\x19\x1c\x59\x9c\x87\x6f\x5c\x9c\xa1\xe3\xfa\xd7\x96\x06\x48\xe0\xd4\x71\xf7\xd5\xc0\x1c\x67\x3f\x42\xd6\x59\xbc\x3d\x98\xdb\xf0\x7d\x8f\xeb\xfb\x99\x5d\x17\xf9\xa0\x2c\xd6\xc3\x9f\x2d\xdc\xd0\xf1\xd2\x22\xb9\xe1\x1f\x2d\xd7\xd3\xc7\x51\x82\x24\xbb\x6b\xfb\x8b\x7c\x58\xfe\x8a\xc1\x05\x40\x59\x03\xa1\xb9\xda\x75\x16\x71\x5b\x7a\xfc\x38\xa5\x55\xe6\xbb\xcd\xba\xd4\x6e\x34\xe5\x76\xfe\xa3\x4c\xe3\x57\x34\xed\x20\xaf\x5d\x88\xee\xb1\x04\x7a\x26\x60\x64\x8b\xbb\x11\x3a\xd9\xdb\x8c\x53\xed\xb6\xed\x98\x71\xa1\xe4\x4c\x9e\xd2\xdf\x56\x56\xfb\x2b\x28\x06\xec\xf0\x3b\x1e\xca\x9e\xab\x50\xa6\xea\xab\x55\xb9\x33\xb2\xdd\x1f\x21\xd4\x50\xde\x9d\x5c\xb2\x23\x2f\x07\xa3\x92\x08\x1b\x0b\x4b\x88\x5d\x54\x78\x9e\x2f\x75\xbf\x2c\x4c\xda\xd8\x78\x98\x9b\x1d\x6d\xab\xd9\xed\x23\xc7\xc5\xb0\x35\x6a\x7d\x9e\x73\x35\x29\x0d\x7c\x85\xb9\x66\xe8\x01\x84\xbd\x07\x99\x86\x02\x88\x6d\x70\x76\x19\x35\x65\xc8\x1c\xcc\xda\x4c\xc7\xd3\x3c\x85\xd9\x05\xb1\xbe\xb6\xe8\xe7\x41\x8e\x8a\xca\xed\xf0\xd9\xa3\x2a\x7d\x29\xd0\x7c\xf4\x4d\x31\x19\xd4\xe7\x89\x68\x20\xb7\x7d\xe6\x4b\x65\x5e\x4f\x14\x88\x00\x43\x4a\xf7\xbd\xb2\xa5\x6b\x25\xeb\x94\xea\x39\xf2\x16\x95\x96\xbb\x2b\x11\x76\x1f\x08\x2b\xae\xc0\x88\x85\xf4\xa0\xeb\x6c\x95\x76\x71\x35\xa7\xf7\xcd\x72\xe7\x43\xd2\xdf\xf1\x44\xdd\x8b\xaf\xb1\xb3\x18\x00\x6e\x58\x76\xf8\xe2\xcb\x44\xaa\x58\x8f\x90\x62\x66\xac\x67\x11\x9c\x17\xf5\xde\x11\x4e\x72\xe4\x2a\x1f\xb3\x99\x44\x32\x1a\x11\x1f\xa7\x95\xff\x70\x17\xf2\xfb\x8c\xaf\x48\x2f\x55\xd7\x7a\x80\x85\x54\x28\xde\xd7\xec\x20\xac\xec\xca\x83\xf8\xd1\xeb\x13\x7b\x58\x8c\xcb\x74\x5c\x10\x5f\x2b\x2c\xa4\x1c\x3a\x9f\x49\xd3\xc6\xe9\xd7\xc6\x48\xb0\x03\xb9\x70\x7c\x90\x64\x62\xed\xad\x61\x7a\x8c\xfb\xf9\xbc\xc6\xc5\xfb\x6f\xa9\x84\x32\x5d\x65\x82\xe2\x8f\x62\x00\x53\x83\xf3\x38\xdf\x5b\x38\xfa\x9d\x19\xc2\x2a\x2a\x7e\xa1\xd6\x8a\x92\xd1\xd9\x3b\x7f\xb0\xb8\xf3\x3b\xc8\x76\x0f\x28\xae\xb1\x43\x9a\x8b\x07\xf3\xda\x58\xdd\xb1\x55\xb4\x98\xcb\x09\xc7\x5a\x55\x96\x83\x8a\x65\x01\x3e\x24\xd5\x64\x0d\x08\x42\xa7\x69\x93\x22\xcf\x3f\xfc\xb5\x70\x3f\x41\x4f\xfd\x16\x88\x60\xba\xd3\xe3\x08\xb2\xb5\xbf\x3c\xdf\x7f\x36\x3b\xf9\xaa\xf4\xb3\xbc\x42\x4c\x14\x6c\x6f\x54\x21\x43\x0f\x9f\x47\x6a\xa3\x4a\x0c\x6e\xe8\x01\x31\xfc\x4d\x4d\x97\x07\x23\xa2\x18\x6a\xe3\x62\x5e\x28\x6d\x17\xdd\xdc\x43\x5c\xcb\x00\x83\x16\x78\xab\xa5\x84\xa6\x2d\xbf\xf0\x02\xbe\xad\x6e\x11\xe2\x3c\x54\xd3\x3c\xf3\xa4\xb2\x31\xa9\x08"}, -{{0xf0,0x8e,0xe8,0xda,0xa7,0x3e,0x1f,0xeb,0x61,0xa8,0x8e,0x06,0x2d,0xfb,0x10,0x03,0xc8,0x57,0x8a,0x0d,0x53,0xbd,0x3b,0xc9,0xe5,0x89,0xef,0xb9,0x2f,0x68,0xbe,0x14,},{0x76,0x69,0x2c,0xe8,0xd1,0x16,0xec,0xcb,0x89,0x70,0x77,0xed,0xca,0xaf,0xdd,0x3e,0xb4,0x4e,0xa1,0xa4,0x86,0xb9,0x0e,0x49,0xe9,0x7f,0x96,0x69,0x01,0x01,0x55,0x02,},{0x66,0xdf,0xa4,0xc1,0x57,0x5b,0xef,0xf2,0xf5,0xa2,0x30,0xb2,0x8c,0x58,0xc3,0xee,0xa0,0x73,0x6d,0xf3,0x79,0xd7,0x55,0x59,0xbc,0x9d,0x37,0xa9,0x57,0x9d,0x12,0x1c,0x05,0xc3,0x73,0xe8,0x48,0x4c,0x97,0x47,0xef,0x44,0x77,0xe8,0x0c,0x4b,0x2c,0xb4,0xdd,0xf1,0x6a,0xe9,0xfd,0xfa,0x08,0xa0,0x75,0x47,0xd1,0x07,0xdc,0xea,0x12,0x03,},"\x64\xde\x90\x04\x4d\x0e\x76\xbc\x02\xfc\xff\xcb\x75\x26\x36\x67\xb3\xbd\x73\x3b\x40\xbf\xb2\x6c\x6c\x52\xfd\xb4\xb0\x78\x22\x78\xca\xba\xe4\x1e\x21\x29\xea\x40\x17\xe9\x4d\xe8\x60\x87\x96\x4f\x66\xd8\x62\x07\x98\x74\x67\xa1\x68\x8f\x9f\xab\x3f\xfb\x2f\x1d\x00\x63\xbf\x62\x6c\x94\x13\x67\xc1\x2e\x31\x9a\xb7\xca\x30\x20\xc9\xb3\xa7\x21\x5a\x19\x30\x3e\x2d\x0e\x89\x88\x79\x1d\xe0\xd8\xe1\x63\x2d\xaa\x38\xc7\xf3\xe7\xf6\xe4\x8c\xe1\x22\x14\x3d\x1e\x2c\xb6\x61\xba\x77\xc6\x9e\x6a\x71\x09\x11\x64\x4b\xc1\x10\xff\x58\xbb\x00\xb5\x29\x08\x20\xce\x30\x97\x0e\x7f\xde\x18\x9e\x14\x0e\x5c\x70\xc7\x83\xee\xd5\x3f\x0e\x2a\xc7\xec\xae\x4f\x27\xdb\x81\xd1\x5b\x86\x46\xfa\xa9\xc5\xa3\xae\x2b\x7f\x47\xcd\x58\x0d\x77\x07\xb0\x02\x49\x9b\x4c\xfe\xb8\xc5\x91\xaf\xdf\x1c\xc6\x2a\xf2\x59\x5c\x18\x4a\xbc\xf0\xb2\x62\x3a\x1b\xae\x60\xaf\x70\x26\xb2\x8d\x05\x40\xb4\x15\x26\xe3\x02\x0f\x81\xb8\x94\xeb\x3f\xe3\x1b\x72\xb2\x1a\x32\x60\xda\xe3\x21\x0c\x4c\xe4\xfd\x69\xe2\xe5\xea\x0c\x86\x32\xa5\x83\x26\x2a\x12\xb3\xa8\xb1\x6c\x9c\x12\x06\xad\x73\x02\x30\x37\xcf\x30\x65\x3c\xb8\x0a\xa7\xdf\x83\x14\xb0\xf5\xbc\x6e\x9d\x5f\xa0\x0b\x00\x9d\x55\x52\xd8\x3b\x79\x70\xb5\xbc\x4b\x99\x84\xf6\x9d\x1c\xca\x9c\xe4\xcb\x74\xdd\xd2\xd8\x79\xd3\x73\x12\xa0\xe1\x59\xd7\xa6\xaf\xb7\x7a\xc5\x85\xe6\xb4\x59\xc5\x51\x30\x4e\x1e\xeb\xfb\xca\xb4\x3a\x10\xb5\x05\x92\x4e\x03\xea\x33\x2f\x5d\x02\x0a\x55\xc7\xaa\x68\x3c\x54\x1d\xcf\x77\x90\xa2\x40\xaf\x07\x9b\xab\xa9\x40\x96\xb4\x60\x60\xfd\x7a\xfe\x90\x56\xca\x99\xe6\x88\xdf\x28\x0a\x9b\xe8\xc8\xc7\x3e\x6e\x6f\xb0\x52\xa3\x3e\xb3\x32\x8a\x7f\x60\x25\x42\xfe\x28\x0c\x89\x0e\x3c\xca\xf2\x2c\x7f\x34\xf8\x7b\x5e\x5b\xa7\x84\xb4\x72\xb1\xe1\xa9\x93\x47\xa9\xe0\xd2\x40\x85\x8d\x12\x77\xa5\xc6\xb3\x49\x38\x3f\xe4\xfd\x55\xcf\x92\xe6\x9f\xaa\xd3\x26\xb8\xd6\xdb\x46\x23\x30\x26\x22\x1e\xe6\xd0\xa1\xc4\x24\x65\x33\xc4\xa0\xe5\xbd\x17\x2e\xb8\x93\x6a\x9c\x0d\x30\x06\x65\x38\xe3\xeb\x4a\xd5\xcb\x98\x77\xfd\x86\x1b\x48\x2b\x30\x15\x0a\x06\x10\x41\x61\x64\x7e\x01\xd0\x04\xd9\x97\x40\x3e\xe0\x67\x26\xcb\x97\xe2\xe2\x5f\x18\xc6\x68\xee\xe4\xc5\xbf\x72\x52\x98\x03\x18\x9e\xe6\xa7\xae\xc2\x38\xd5\x90\x6e\xa5\xae\x10\x72\x2c\x9a\x61\xa7\x8a\xea\x52\xaf\x33\xea\xac\x75\x40\x6b\x1a\x60\xbe\xfb\xaa\xd4\x84\x76\xd9\xff\x88\x7f\xd2\x83\xeb\x16\x55\xbc\xc0\x7c\xf7\x53\x33\x14\x36\xdb\x5b\x3b\x13\x03\x2f\xf9\xc3\xd6\x96\x38\x0e\x9f\x5a\xbf\x50\xd3\x55\x6f\xda\x0d\xf0\xb5\x38\x97\xa7\x37\xac\x7a\x3b\x87\xc2\xa8\x32\xb0\xc7\x27\x3e\xa9\xfc\x54\xa7\x67\xf1\xa8\x12\xbf\x01\x64\xbf\x75\x21\x63\x0b\x81\xb9\xdd\x93\x0d\x92\xee\x2c\xa2\x8e\x32\x03\xb7\x7b\xc0\x82\xce\xb3\x7d\x55\xed\xbc\xb7\x1d\xf0\xb7\x92\x36\x78\x9a\x25\xd4\x18\xcb\xb9\x55\x44\xe2\xce\xf3\x3b\xbd\xeb\x27\xa3\xf7\x90\x9c\x1f\x49\x8f\x47\x13\x5a\xe9\x03\x3a\xdf\x25\x0a\xd4\xf6\x57\x53\x61\xe4\xcf\xcc\x9b\xcf\x4b\x90\xc3\xad\x47\xa3\x44\x22\x97\xa2\x23\xcc\xa8\x43\xd7\x20\x5e\xd0\x8a\x9b\x87\x16\x0a\x6d\x01\xb4\x6a\x7d\x1c\x84\x4e\x8d\x1f\x18\xf6\x18\x68\x2b\xfb\x22\x95\x5f\x39\x5b\x2a\x57\x90\xa5\x1a\x69\x64\x99\xd9\xe7\x1a\x50\x1f\x3f\xa5\x46\xde\x9b\x10\xae\x47\xbc\xee\x42\xba\x7f\x86\x9f\xb9\xce\x4e\xd7\xc6\x45\x33\x26\xc0\x34\xcf\x05\xd9\xf1\xe3\xc2\x00\x70\x1b\xa7\x52\xda\xbb\xd8\x68\x52\x1c\x3d\x8f\x80\x67\x2d\x42\xf6\xcf\x45\x64\xf0\x8c\xd7\xb3\x90\xe6\xd4\x9d\xd9\x00\x90\xaf\xdb\x84\x48\x6f\xfc\xaa\x4e\x84\xd8\x86\x82\x74\x4d\xc0\xa8\x78\xfa\xa7\xcd\x44\x0a\x8b\x27\x67\x10\x90\x20\x81\xf4\xdc\x84\x17\x46\x19\xa6\x6e\xa3\xa3\x71\xf9\x55\x05\x40\x0d\x99\xfa\x99\x90\x17\x71\x0c\x8e\x27\x14\xbe\x60\x94\x9d\x46\x13\x10\xf7\xd4\x3a\x0d\xc1\x23\x51\x6d\x77\xd3\x62\x21\x3f\x9f\x75\xa5\xa1\xc3\x93\xaf\xfc\x49\xea\x15\x1d\x46\xa8\x1f\xfa\xd2\x39\xf2\x8c\x07\xf6\x5f\x59\xea\x07\x7d\x9a\x4d\x9c\x75\x2d\xe4\x9b\x9e\xf3\x6b\xe6\x0d\x11\x2d\x79\x5f\x58\x8b\x00\xef\x6e\x77\x30\xde\xa6\x5e\x10\x16\xda\x0d\xd4\x62\x37\x0e\x0b\xa5\xc6\x60\x00\x1e\x45\x7c\x08\xb4\x36\xda\x29\x03\xb6\x29\x06\x93\x20\x84\x72\x8c\x81\x67\x1c\xbf\xb0\x79\xbb\x29"}, -{{0x27,0x2d,0x64,0xde,0x50,0xb1,0x31,0x2b,0xee,0x23,0xd7,0xf4,0xce,0xa5,0x08,0xa8,0xfc,0xcf,0x3e,0x9b,0x32,0x4e,0x97,0xb1,0xc8,0xe7,0x25,0x02,0xf6,0x1f,0xbf,0x45,},{0x33,0x49,0x8c,0x3b,0x71,0x2a,0xb9,0xc0,0x1e,0xc7,0x6b,0x2e,0xfe,0x2b,0x83,0xad,0xd1,0xe1,0xf2,0xb5,0xeb,0x78,0xf2,0x16,0x92,0x32,0x34,0x51,0x82,0x0c,0xbe,0x10,},{0x33,0x81,0x4c,0x6e,0xf3,0x75,0xab,0x96,0x37,0x69,0xb2,0xde,0x4a,0x25,0xe7,0x02,0x0f,0xcd,0x97,0xf7,0x8f,0x8f,0xc9,0x34,0x55,0xc4,0xb1,0xc2,0xbd,0x45,0xd4,0xb0,0x1e,0x19,0x29,0x00,0xe3,0x12,0x22,0x65,0xfc,0x55,0x2c,0xd5,0xc5,0xf0,0x0e,0x93,0x1e,0x3a,0x18,0x3c,0xca,0x5b,0xa0,0x80,0x2d,0xaf,0xde,0xbb,0x79,0xeb,0xeb,0x03,},"\xd6\x26\x0d\x7e\xec\x5d\x43\x62\x08\xe7\xe7\x37\x65\x5e\x09\x71\x81\x42\x70\x19\x44\x05\xe3\x6e\x39\xf8\xf1\x7b\x64\x9f\xbc\x16\xc0\xf3\xd7\xf2\xbe\xf5\xeb\xc0\x2b\xb1\xc4\xdf\x48\xe8\x47\x0a\x3e\xae\x8a\x3c\xca\xf6\x40\xab\xcc\x09\x4a\xa9\x11\x50\xff\x1a\x8c\xf1\x16\x96\x93\xeb\xf5\xac\x00\x34\xb9\xb9\x19\xec\xf1\x7d\xb7\x91\xdf\xe5\xfe\xdc\x90\x91\x8b\x23\xe5\x4e\x90\x04\xa1\xae\x77\x1c\x21\x3e\xd7\xed\x73\x34\x43\x4e\x5b\xc0\x2c\x0d\xda\x2b\xd1\xa8\x76\xfb\x82\x4a\x19\x7b\xc9\x96\x13\xb1\x40\x9e\x70\x52\x31\x0b\x08\x20\xda\x71\x44\x69\x29\xae\x7c\xfd\x3a\xfb\xa0\x42\xde\x54\x57\x8a\x5b\xfd\x94\xc1\x54\x43\x91\xa3\xd9\xac\xbd\x56\x63\xef\x65\xc6\x92\x0d\x78\x51\x6d\xec\x1c\xd5\x5f\x6e\xb7\x29\x0b\xa0\xaa\xf9\xa1\x71\x65\x82\x00\xb2\x4a\x47\xa0\x71\xb9\x6f\xea\x03\xc6\xca\x7e\xd0\xd6\xfe\x67\x5d\xd6\x37\x61\x83\x3d\x75\xbc\x5e\x58\xa9\x58\x58\x2d\xb0\x2a\x60\xc6\xce\x0a\x63\xf4\x2b\xa8\x37\xae\x77\xc1\x7a\x32\x70\x5f\xd9\xca\xfa\x58\x7b\x55\x5d\xd4\x61\x98\x51\x07\x97\x94\xe2\x4e\xb4\x46\x08\x83\x5a\x6f\x48\x24\x92\x0d\x57\x7a\x27\x03\x96\xc9\x57\x3b\xc7\xd8\x2f\xe2\xaa\x04\x65\x95\x66\x13\xa2\xc5\x08\xcf\x24\x32\x33\x7a\x36\x5e\x6c\x98\x4c\xba\x91\x7f\x0c\xf8\x42\xaf\x12\x2d\xc8\x9d\xea\x95\x8d\x41\x8c\xae\x44\xa6\xe4\xed\x26\x3a\x41\x5f\xf9\x94\xa5\xff\xb2\xff\x13\x91\x3d\xf2\x14\xbb\xfe\x90\xa3\x4b\x24\x7e\x71\xab\x73\xf7\xff\x00\x4c\x23\xac\xfd\x90\xc7\x67\x61\x1a\xa5\x58\x14\xc6\x69\x64\x16\x8e\x56\x8b\xa7\x5b\xf3\x49\x03\x59\x7c\xdc\xac\x78\xc2\x4b\xb9\xf1\x4f\x5c\x86\xa5\x1f\x36\x4f\x9a\xb4\x1e\x46\x4a\xee\x64\xfa\x50\xa1\xc1\x59\xcb\xd8\x50\x83\x2c\x50\x4a\xb4\x2a\x58\x4a\x96\xd5\xae\xe0\x82\xd8\x2c\x1e\xdd\xa1\x93\x38\x16\x0b\x8d\xcf\xa3\x41\x9b\x3a\xf6\x4d\x9c\xfb\x10\x4f\x98\xf9\xd3\x5e\x53\x94\xe2\x32\x28\xe2\x75\xc8\x7d\xb5\x0c\xa8\x67\x54\x0b\x88\x0c\x7a\xf2\x9f\xbf\x53\x42\x94\x58\x1c\x22\x24\x0b\xcd\x4d\x7d\x2c\x20\xff\xc3\x67\x33\xad\xa2\x76\x53\xd3\xae\x1a\x8c\x22\x03\xea\xc6\x26\xe2\xe9\xbb\x4b\x52\xce\x52\x3e\x5a\xdb\x3b\x2c\x10\xdc\xf7\x8c\x2a\x1e\x62\x6a\x16\xeb\xfa\x1b\xdb\x8c\x16\x14\x93\xa5\xaa\xa2\xd8\x4b\xfa\xa0\xf2\x02\x7f\xfe\x4e\x9e\xae\xb3\x32\xeb\xda\x7c\xbb\xb6\x77\x76\x9d\x78\x51\x7a\xdf\x72\xf8\x23\xa7\xf8\x44\x16\x5a\x07\x98\x78\xd2\x58\xfd\x95\x22\x5c\x21\x17\x78\x37\xe6\x9c\x19\x68\x5a\x05\x1c\xa9\x2b\x12\x0b\x7d\x86\xd7\x85\x95\x47\x1f\xfc\x42\xa5\xe6\xe6\x43\x1b\xe7\xb6\x4f\x80\x76\x45\x8b\xac\xd6\xc7\x29\x03\xcc\x34\xfc\x63\xa4\x0c\xf3\xdf\x00\xef\xf9\xd6\xee\x9a\x8f\x39\xd2\x5e\xad\x81\xa8\x12\x88\x88\xb0\xa1\xac\x0e\x5e\x3a\xd9\x27\x71\x2c\x14\x14\x6a\xdf\x82\x87\x70\xff\x95\x87\x09\xeb\x19\x28\x8e\x77\xbb\x70\x73\x48\x81\xe9\xe0\x16\xcd\x29\xe7\xd0\x89\x93\x41\xff\x6b\x29\x7a\xc7\x96\xbb\xde\x48\x6e\xc3\x59\x49\xf6\xa3\x2b\x2c\xa6\x47\x38\x59\x15\xec\xba\x3b\x9f\x02\x25\x08\x71\x45\xc1\x8d\x65\x59\xd3\xa3\x1d\x6f\x22\xfc\x49\xf8\xa6\x31\x5f\x1d\x32\xab\xee\xb7\xcf\x2c\x2c\x77\x6e\xa7\x35\x0f\xd5\xeb\xc0\xe0\xf2\x65\xba\xcc\xc2\x69\x7a\x7c\x8c\xa4\x0c\x13\x5f\x6c\xfc\xb0\xb5\x8a\x61\x43\x19\x60\xff\xa9\x06\x57\x09\xa9\x61\xa6\x33\xd5\x70\xb7\x3f\xb4\x49\x1d\xe5\x2a\xd0\xd7\xb2\x04\xb6\xe9\x97\xb0\x37\xed\xe3\xf7\xec\xa8\x20\xa7\xcd\xb2\xc6\x9a\xc2\x91\x48\xbe\x35\x23\x50\x8a\xe7\xe4\xc3\xd1\xa7\x17\xf5\x5a\x82\x1d\x14\xc3\xb6\x4f\x08\xca\x9a\xe4\x96\x13\xb1\x15\x77\x3e\xf6\x18\xd3\x21\xc9\x08\xbd\x21\x56\x71\x7a\x43\x4e\x50\x89\xa5\x94\x8c\x04\x5c\x8d\xa8\xa4\xbd\x86\xed\x5f\xab\xc6\xb1\x34\x66\xe6\xde\xda\x58\x32\x07\xd2\xad\xa2\xb2\xab\x9c\xb1\x54\x3d\xf7\xa3\x73\x4d\xfb\xc6\xfc\x42\x81\x06\xd4\x84\x47\x24\xa1\x3d\xf4\x2f\xaa\xb1\x8c\xa8\x9d\xb2\x0a\xc9\xbc\x27\xb8\x53\x94\x66\x7c\x5a\x27\x79\xca\x63\xed\x7a\xc2\xb7\xc0\xd4\x12\x23\x91\xee\x46\x02\xd6\x1e\xa0\x38\x17\x64\xfb\x72\xdc\xc2\x24\xe6\x5e\xae\x2b\xc4\x50\x6b\x0f\x09\xe2\x32\x05\xd0\xbb\x21\xc7\x7d\x82\x87\xc1\x65\xe0\xb4\x2c\x55\x15\x79\x77\x8a\xcb\x72\x58\xa2\x47\x9d\x7c\xf2\x5b\x90\x2e\x8d\x0d\xa4\x29\xbd\xe3\x6b\x45\x90\xda\xe9\x6f\x52\x54\x81\xac\x83\x78"}, -{{0x0c,0x9f,0xe5,0x59,0xad,0x1e,0xd3,0xba,0x16,0x4d,0xac,0xea,0xcb,0x02,0x35,0x67,0xb2,0x43,0x03,0x20,0xb6,0x71,0x5d,0xe7,0x32,0xa0,0x3c,0x59,0xc7,0x30,0x31,0x30,},{0xe7,0x0f,0xc4,0x66,0xfb,0x2a,0xcd,0x74,0xe0,0x99,0xc3,0x6e,0x2c,0x22,0xfa,0x51,0x29,0x0b,0xdd,0xe9,0x6d,0xf9,0xc3,0x1b,0x6d,0xfb,0xfd,0xc2,0xe2,0xc1,0x4a,0x40,},{0x6c,0xd8,0xae,0xd9,0x7d,0x9c,0x62,0xd5,0xfd,0xae,0x59,0x7d,0x06,0x1c,0x0c,0x2b,0xc3,0x7e,0x42,0xdf,0x06,0xb8,0x32,0x7a,0x46,0x8f,0x92,0xb3,0xf4,0x38,0xa1,0xe6,0xb6,0xb1,0xef,0x2b,0xe7,0x85,0x49,0xa2,0x89,0xfd,0x3f,0xc1,0xa6,0x29,0x9e,0x5a,0x33,0xd5,0x39,0x6c,0xb4,0xfa,0xc1,0xe8,0xe9,0x98,0x2f,0x0c,0xb3,0xd2,0x0d,0x07,},"\x26\xeb\xc6\x48\xcf\x8c\x79\x65\xec\x6e\xbe\x96\x5d\x9c\x79\x2b\xed\x90\x65\x5a\xd4\x40\x18\x3c\x6d\x70\xea\x64\x67\xbb\x8e\x6f\x04\xec\x84\x3f\x33\x31\x56\x91\x7b\xf4\xc5\x1d\x0e\xd0\xf2\x8b\x7c\xd3\x1b\xc1\x2c\xf8\x40\x68\x6b\x82\xb0\xc2\xc3\x50\xbb\xda\xc8\x05\x33\x37\x25\xd6\xb6\x9c\x2a\xb7\xf3\x4e\xe5\x93\xfa\x1c\xcc\xed\xf3\xf0\x64\x2a\x68\x8f\xcc\x1c\xd9\x8b\x09\x87\xd0\x1f\x71\x3a\x2f\xa6\x41\x6c\x96\x19\x21\xde\x0c\xc2\xc9\xec\x7a\x55\x58\x55\xe7\xfc\xd4\xc7\xdd\xaa\x14\xfd\x91\xec\xb0\x42\x24\xe1\x76\x1b\x7d\x6b\x35\xf4\xaa\x56\x18\xa5\x00\xca\x00\xd1\xca\x24\x51\xb5\xd3\x68\xaf\xde\x3a\x40\x7e\x78\x31\x35\xf3\x90\x19\xa5\xb9\x84\xe8\x2a\xc2\x79\xc0\x5e\x48\xc2\x95\xeb\xd1\x56\x38\x21\xa0\x74\x3c\x52\x24\x6b\x5d\x2b\x20\x34\xe3\xae\xb6\xce\x7c\x5c\xf9\x19\xe7\x4a\x9c\x7b\xbc\x9e\x25\xda\x30\x43\x0e\xb1\x6e\xcf\x38\x37\xeb\x38\xa0\xf5\x59\x79\x2a\x72\x98\x90\xba\x83\x10\x26\x0f\x8a\xeb\x9b\x5a\xf0\x0e\xb6\x33\xc1\x2d\xee\x02\x26\x28\xba\x41\x8d\x75\xcf\x18\xde\x2f\x2e\x65\xe4\x9b\x1a\x69\x68\x4d\x61\x27\xef\x48\x1c\xa8\x61\xec\xbc\xe3\xbe\x86\x49\x7e\x65\xdf\x4c\x5f\xcd\x08\x17\xc9\x71\x6b\x59\xf2\xa2\x63\xd5\xe9\xeb\x60\x68\x39\xf8\x5c\x5a\x36\x58\x37\xb0\xfb\xe2\xc4\x27\x4d\x66\xcb\x2c\x65\xed\x36\x5f\xab\xf5\x8f\x15\xbe\x52\xb5\x1c\xb6\x01\x18\xca\x4f\x73\x0d\x44\x73\x59\xf7\xef\x34\x6b\x75\x02\x17\xd4\x7b\x2e\x79\xc8\x6c\x0c\x62\x81\x6a\x0c\x7c\x18\xa2\xce\x2b\x68\x8e\x0c\xce\x0d\x75\x23\x21\xe7\x9b\x42\x38\x57\xda\xc5\x9f\x8f\xbe\xb0\x94\x11\xe7\x16\x69\xef\x9a\x26\x43\xf2\xe9\x9f\x38\x7a\xc1\x83\xe0\xb0\xac\x72\xc5\x9a\x0c\x3c\x18\xc0\xde\x8b\x01\x08\x78\x07\x4a\xcc\x1a\x2b\x39\xf9\xdf\x99\xd9\xf8\xf8\xb5\x2f\xef\xe4\x94\x3c\x52\x5f\xd4\xd0\x6a\xd8\x78\xe4\x66\x08\xab\xf2\x7a\x54\xbc\x50\x06\xf6\x47\xdb\x72\x48\x51\xdb\x7c\x45\x78\xae\x66\x58\x3d\xc4\xbb\x51\x8e\xf0\x28\x89\x03\x47\xe8\xfc\xe0\x92\x7d\x7d\x9a\xf3\xab\x5d\x0d\x2d\x20\x2a\x40\x26\xaa\x2e\xa7\x48\x79\x62\x67\x6a\x60\x32\x98\xe7\xd2\xe7\xb9\x09\x21\xee\x1b\x52\x80\x6d\x71\xa7\x64\xe0\x3e\x25\xdd\xd6\x84\x8f\x61\xd4\x6f\xad\x3d\x00\x8e\x10\xee\x5c\xd5\xa3\x39\x0f\x9d\x15\x8a\x44\x37\xef\x61\x5f\xc9\x0a\xc5\xbf\x3a\x9d\x68\x2e\x12\xc3\x39\x8a\xc7\x76\x80\xd2\x2c\xd1\xa6\xa5\x6e\xc3\xb2\x5c\xed\xe8\x67\xed\xd3\x83\x15\x9c\x61\x64\xd6\x3e\x9c\xd1\xc9\x56\xac\x72\x35\xff\xfa\xe9\x36\x16\x6c\xcd\x35\x89\x8e\x29\xc9\xb4\xca\x4e\x29\x25\xda\x32\x3b\x6f\xbf\x67\xcf\xd5\x96\xc8\x8a\x1a\x35\xa8\x35\x98\x51\xdd\xcb\xa8\xf6\x13\x4a\x9f\xaa\x24\x4d\xcb\x47\xe6\x91\x27\x6e\xe6\x25\xcc\x20\xad\xce\xc2\x1c\xbe\x77\xa3\xac\xb9\xba\x72\xf0\xc9\xd3\xda\x7e\x9c\xd5\xbe\x3b\x95\x99\x0b\xa5\x4a\x9f\x31\xaf\x17\x1f\x95\xae\xea\xd3\x33\x1c\xb1\x88\xa5\xb2\xc6\xf5\x39\xac\xb4\x8b\x98\xb3\xf7\x34\x1f\x60\x25\x1c\xb6\x04\x29\xcc\xd9\xcf\x32\xf0\x09\x20\x5f\x27\x53\xfb\xbb\x26\xaa\x53\x17\x43\x42\xad\x18\x4d\xab\x68\x70\xc0\xfb\x52\x93\x01\x19\xd9\xf9\x7d\x84\x89\xa6\x00\x76\xaa\xdb\x2e\x96\x05\x4a\xc7\xcb\x7f\x84\xe1\x3c\x75\xbb\xf9\xe4\xd9\x24\xd2\x27\x2a\xfe\xf0\x87\x19\x15\xe2\x43\xce\x66\xfc\x2a\x88\x88\x51\x35\x35\xb1\x0b\xb4\x07\x9c\x80\x6b\xd9\x49\x28\x1e\x28\x28\x35\x23\xd0\xd2\x10\xb3\x1e\xf6\x2a\x95\xdc\xae\x0c\xd2\x52\x90\xc7\xed\xf2\xc2\x4b\x43\x28\x22\xde\xbe\x34\x7f\x1c\xae\x94\x5f\x57\x28\xc7\x1b\x54\x03\xef\x14\xe7\x2c\x3d\x83\x42\xe1\x98\xb3\x62\xee\x20\xf8\x09\xe4\x6a\xca\x01\x5f\x35\x47\x7f\xf8\x9a\xc4\xb3\x7e\x66\x15\x85\x6f\x7e\xa2\x51\xfb\xfe\x13\xf9\x06\x52\x59\xb0\x94\x6a\xae\xf2\x49\x43\x27\x0a\x85\x4d\xe8\x89\x78\x00\x33\xd6\x3d\xda\x54\x47\x99\x8a\x3e\xd7\xe5\x06\xae\xb5\x1e\xa3\x7b\x68\x1a\xc3\x07\x67\x97\xac\xdb\xfc\xc2\x78\x83\x63\x0a\xdb\x72\x26\x0a\x46\xaf\x0a\x60\xd5\x3f\x66\x54\x56\x6e\x20\xd6\x08\x8c\xd4\x8e\x23\xb2\x8d\x81\xf0\xee\xd2\x05\xb9\x2a\xaf\xd9\x61\x64\xd6\xd3\xca\x3f\xc8\xb1\x71\x80\x4e\xe9\xfc\xe7\xab\xae\xd2\xea\x4d\xdf\x9c\xb2\xb3\xae\x73\xa7\x0e\xd6\x3d\xe4\x5e\x14\x10\x14\x28\xd0\xa7\xa2\x26\xdb\x39\xab\x6c\xd0\x43\x74\x08\x0e\x69\x83\xf0\x18\xce\x93\xda\x4c\x89\xac"}, -{{0x15,0xd7,0x5a,0xd8,0xe4,0xaf,0xb1,0x26,0x34,0xcc,0x8e,0x60,0x0f,0x1a,0x42,0x67,0xef,0x95,0x84,0xf4,0xc4,0xac,0x44,0xff,0xfe,0x4b,0x9f,0xcb,0x88,0x5c,0x9d,0x2a,},{0x09,0xd1,0x26,0xf0,0x17,0xe0,0x16,0x97,0x74,0xe8,0xc3,0x7a,0xb3,0x79,0x26,0x3a,0x80,0x75,0x74,0x61,0x27,0xc2,0xd1,0x1e,0xcb,0x0e,0x4c,0xb4,0x54,0x70,0x9f,0xf1,},{0xa8,0xf2,0xf4,0xb9,0xe2,0x07,0x2c,0xa9,0xfa,0xde,0x37,0xfd,0xd6,0x2d,0x8d,0x02,0x42,0xfd,0x4d,0xaa,0x09,0xfd,0x85,0x6e,0x75,0xf4,0xe3,0x43,0xc7,0x26,0x0e,0xa6,0x77,0xf7,0x53,0xa6,0x27,0xae,0xd0,0x8c,0xb9,0x6c,0x44,0x4e,0x29,0xbd,0xb5,0xb5,0x38,0x5d,0x43,0x84,0x3b,0xbe,0x79,0xa3,0xdd,0xa3,0x6e,0x1e,0x11,0x01,0xc5,0x0f,},"\xd1\xce\xa2\xb7\xe9\xaf\xc1\xf0\xfa\xb8\x90\xd2\x70\x0a\x5a\xe4\x1e\x15\xe7\xd3\x4d\x3b\xf1\x9d\x0f\x34\xd9\xf9\xf0\xab\x98\x12\xdc\x7c\x2a\x8d\xc4\x4c\x8e\xe7\xf3\x78\x87\x61\xec\xd9\x88\xee\x72\xc7\x36\xb6\x2a\x7c\xac\x3c\xc9\xb7\x38\xe9\x38\xdf\x77\x87\x37\x7e\xb9\xff\xd1\x20\xd4\xff\x58\xcf\x1c\x06\x75\x63\x3f\x7e\x83\xc4\xb1\x15\x54\x8f\x14\xd2\xf7\x0c\x6d\x48\x22\x11\x44\x3a\x84\x99\x59\x95\x58\xc1\x42\x77\x98\x0f\xa4\x2a\x78\x42\x79\x07\xf7\x3a\x41\xf5\xf6\x69\x3b\x2f\x75\xfe\x5e\x7a\x6f\xf0\xa6\xc3\xa4\xe2\xed\x1d\x0d\x96\x8d\x5c\xc9\xd6\xf1\x3d\x41\xc3\xd2\x91\x39\x6a\xe7\xe4\x34\xe6\x64\xb2\xff\x24\x3e\x7f\x6d\x88\x01\x02\x10\x07\x8c\x39\xb5\xa5\x76\xca\xf4\x09\xbb\x47\x11\xb3\xee\xfc\x48\x6b\x67\xb7\xff\xea\xe0\xcb\xac\x6a\x0f\xbd\xf5\x34\x3f\xb2\xae\x4e\x05\x7e\xdc\x8c\x9d\x2e\xd3\x1e\xae\x9e\xc8\x3d\x2b\xed\xd2\x19\xeb\x98\x9b\x2d\x44\x19\x61\x8c\x2d\x3c\xe4\x49\x0e\x35\xfb\xca\xd4\x32\xb0\x12\x47\x95\xf9\xc5\xcb\xdc\x1e\xb0\xc3\x07\x2b\x4a\xa8\x01\xd2\x6f\xbc\xc7\xb0\x7b\x82\x57\xf5\xfe\x47\xac\xd9\xbc\x58\x7b\x56\x57\xcf\x07\xca\x54\x5b\xb5\x68\xc9\xe4\xe7\x3c\xdd\xf6\x25\x4e\x22\xf7\x8a\xb2\xf8\x06\x45\x19\xf8\xab\xfd\x16\xfc\xfa\x90\xf8\x76\x87\xdb\x0c\x42\x09\xbe\x2c\x6c\x79\xa5\x52\x1f\x44\x18\x96\x78\xd9\x32\xc5\x45\x85\x70\x0a\x24\x37\x70\x2e\x56\xaa\xb5\x88\xa1\x7c\xb2\xcc\x94\xc0\x0e\x87\x57\x0e\xf3\xac\x51\x33\xd7\x53\x03\x8a\xa4\x65\x10\xa2\x60\xc1\xfe\x80\x47\x9b\xc0\x2e\xed\x9a\x8d\x1d\xe9\x93\x54\xac\x26\x48\xb4\x8b\x96\xab\x1b\x80\xcc\xa6\xca\xe1\x87\x7f\x37\xd7\x04\x28\xbb\x50\x85\x0e\x03\x08\xdb\x0b\x42\x30\x87\xbf\x7d\xde\x27\x9e\x09\x67\x66\xf2\xab\x3a\xb2\x38\x5b\x04\x64\xa5\xbe\xd7\xbb\xd8\xd4\x57\xe9\x35\xe2\x00\xaa\xaa\x8d\x95\x15\x70\xe0\x53\x07\x6d\xb1\x8a\x6a\x62\xf7\x2b\x31\x95\x79\x88\x4a\x08\x26\xba\x2b\x43\x63\x71\xdd\x21\x8b\x01\xa0\xc5\xe5\x8d\x0c\xd5\xff\x98\x25\xe4\x46\x6f\xe9\x66\xdf\x05\xcc\x31\xc8\x03\xe5\x21\x21\x83\xdd\xf2\x9c\xef\x7f\xb9\x16\x48\xa4\xf8\xee\x19\xfd\x5f\x8d\xbd\x8a\x56\xbe\x7a\xbf\x33\x65\x9a\x92\x24\xa1\xe2\x7a\x10\x24\xef\xfd\xfb\x88\xe8\x80\x61\x48\xd0\xd1\x78\x09\x06\xaf\x1e\xbe\x3e\x5f\x14\x36\x31\x90\xd8\x8c\xc6\xe5\x08\x94\x44\xf1\x25\xd0\x63\x15\x5d\xcf\x86\xca\x92\x63\xf2\xf5\xf1\x83\xc2\x69\x74\xfe\x00\x0b\x93\x42\xd2\x4c\x78\x1e\x20\x58\x28\x7c\xb6\xf3\xf1\xe3\x27\x0c\x22\xb7\x70\x7b\x83\x23\xa5\xcc\x8d\xb8\x1a\xa9\x06\xbb\x59\xd6\x96\xcb\x97\xcc\x74\xe3\x59\x59\x5f\xfb\x83\x73\xca\xd3\x71\x0e\xa0\x9e\xa9\x74\x4c\x20\xe9\xa1\x2e\x05\xbe\x5a\x95\xf0\x85\xac\x56\x16\x78\xd7\xda\x43\x2e\x4c\x7c\xb5\x3e\x12\x71\xdf\x5c\xd5\xa3\x39\xd2\xd7\x52\x0f\x1c\x18\x48\xd1\x50\x71\xd8\xc6\x98\x46\xb2\x3c\x5d\x24\x32\xc7\x38\x90\xf2\xed\xed\x37\xc3\xd2\x96\x4a\x4b\x5b\x55\x22\x58\x88\xe8\x92\xf5\x26\xd1\xca\xc3\x1e\xac\x35\x6f\x36\x1c\x2b\xf3\x36\xc4\x62\xd6\x0c\x82\xe8\x2b\x61\x6f\x2a\x51\x9c\x2f\x67\xbf\x01\x29\x03\x69\xbe\x9b\x55\xe9\xf5\xc8\xce\xc4\xf2\xe1\xb2\xab\x30\x25\x06\xc9\x03\xdc\x3e\x7b\x9c\x97\x81\x41\xdc\x90\x4b\x01\xb1\xc2\x3d\x25\x00\x43\x99\xbf\x8b\x73\xd6\x9c\xd5\x39\xc7\x9a\xf5\xe9\xa0\xa5\x11\xec\xa2\x21\x07\x8a\x1f\xf7\xb0\xf6\x04\xae\xa8\x42\x46\xc3\xcb\x32\xdb\x93\x81\xbe\x12\x17\x67\xe0\x97\xbe\xa5\x17\xbf\xcd\x82\xdf\xe9\x21\x37\x98\x40\xef\xb4\xb6\xf0\x2a\x48\xec\xda\xf1\x2d\x2c\xd3\x89\x30\xd4\x47\x3a\xdf\x97\xcd\x71\xdc\x4e\xa1\x03\x82\xf4\xf5\xd1\xdd\x75\x62\xcd\x4b\xf5\x11\x59\x32\xf6\xc4\x70\x0a\xa8\xfe\x8d\xec\xa9\xd5\xe7\x27\x79\x02\xb8\xf8\x86\x52\x97\x65\xdb\x24\x86\x07\x4b\x23\xa1\x9f\xd4\xb0\x43\x56\xbf\xa6\x22\x6c\x82\xba\xf6\x9a\x08\x7d\x9c\xa1\x88\x23\xf8\xe3\xe6\x83\x08\xe1\x6b\x80\x4c\x36\x3d\xf5\xb6\x30\x7e\x76\x24\x0d\xb1\xed\x84\x1b\x61\x2d\x65\x54\x8d\xdf\xbe\x83\x67\xda\x60\x77\x2c\x6a\xff\x55\x4d\xc8\x5d\x04\x19\x48\x34\x5e\x56\x7d\xa9\x33\x31\x51\x85\x8f\xdf\x69\x93\x27\x39\x25\xbf\xdc\x71\x81\xb5\xf6\x46\xd0\x63\xa8\xc8\xf3\x10\x56\x9b\x0e\xd0\x93\xbd\x9d\xff\x04\xfe\xbf\x0b\x41\xc6\xdc\x55\x16\x9a\x14\xa3\xc8\x62\xe5\x41\x6f\x1e\x58\x2f\xde\xe8\xfe\x87\xdc"}, -{{0xbf,0x3c,0x0c,0xbb,0xbe,0x20,0xbe,0x2a,0xcf,0xaf,0xb2,0x7a,0x36,0x11,0xb4,0x89,0x21,0xa7,0x28,0xab,0x17,0x33,0x4b,0x8a,0xfd,0xee,0x83,0x05,0x17,0x8f,0x61,0x3b,},{0x45,0x00,0xa0,0x3c,0x3a,0x3f,0xc7,0x8a,0xc7,0x9d,0x0c,0x6e,0x03,0xdf,0xc2,0x7c,0xfc,0x36,0x16,0xa4,0x2e,0xd2,0xc8,0xc1,0x87,0x88,0x6d,0x4e,0x6e,0x0c,0x27,0xfd,},{0x8f,0x87,0x03,0xbc,0xf4,0xc0,0x32,0x94,0x17,0x33,0x9e,0xb0,0x26,0xf2,0xb7,0x2d,0x31,0x4d,0x92,0x2e,0x9a,0xcc,0xb5,0xd8,0xbb,0x7e,0xec,0x87,0xe0,0x7e,0x61,0x38,0x55,0x16,0x72,0xa6,0x13,0x2c,0xb4,0xf8,0x75,0x50,0x8e,0xd3,0x29,0x95,0x67,0xb4,0xa7,0x41,0x34,0xd2,0xbd,0xf0,0xd8,0x57,0xf9,0x80,0x86,0x1d,0x18,0xbe,0x7e,0x01,},"\x8f\x30\xba\x2f\x79\x2e\x9a\x97\xf6\xea\xfe\x29\xf9\x76\xa4\x80\x28\xcb\x88\x57\xb5\xc7\x98\xbc\x2b\x61\x68\xc4\x64\x44\xc0\xce\x69\x60\x70\x37\x4c\x5e\x6a\x40\xc3\xd1\x8a\x5d\xc7\x66\x9f\xc4\x1d\xb9\xa8\x1c\xff\x75\x9b\x8c\xa0\x15\x98\x71\xc3\x44\x2e\x8c\x75\x12\x69\x8f\xa4\x47\xb5\x78\x3e\xe0\x1d\x1b\x61\x14\x49\xab\xad\x23\x71\x62\x92\x2b\x02\xd1\xae\xc5\xde\x1d\x66\x6f\x17\xda\x16\x13\x10\x63\x01\xd3\x05\x86\xd1\x16\xe2\xac\x09\x00\x7d\xd7\x1e\x81\x23\xed\xe4\xc5\xa6\xa9\xac\x07\x7f\xe3\xd9\x39\x09\xda\x62\x8e\x86\x58\x70\xa4\xe2\x5c\xb3\x55\x91\x67\x5a\x06\x90\xbe\xc4\xaf\x02\x81\x71\x4f\xe6\x66\x1b\xd5\xc0\x0a\x27\xd7\x9f\x95\x9f\xb4\xd4\xfb\x16\x36\xa6\xa3\x57\x5f\x4f\x01\x47\x06\x63\x89\x9d\x73\x74\x72\xb0\x96\xbe\x4d\xb7\x23\x71\x53\x67\xa4\x1a\x3a\x4c\x13\xf7\x42\xd9\x08\xf4\xd9\x21\xcf\xdd\x15\x6e\x75\x86\x82\x61\xba\x9c\x10\xd8\x58\x74\xca\x2d\x6c\x0c\x9e\x72\x95\xe5\x66\x2b\xd9\x16\xa3\x63\xc7\xa7\x96\xea\xd6\x17\xc4\x25\x1e\x67\x94\xda\x06\xc3\xd0\x8f\x2f\xdc\x38\x86\x94\x4a\x75\x09\xe6\x40\x9c\x90\x6b\x59\x31\x13\xb4\xb1\xf9\x85\x01\x32\x96\x0d\x9f\x3a\x4e\xeb\x73\x86\xfa\x59\x2f\x61\x93\xbe\xab\x8e\x0f\xf0\xf2\x89\x08\xa0\xd5\x48\xdb\x87\xba\xe9\x78\xb0\x5a\xbb\xca\x9b\x3e\x96\xd8\x79\x5b\x88\x07\x7f\x62\x0f\x21\x24\xe3\x15\x90\xeb\x09\x9e\x94\xe0\xe6\xe3\xcd\x62\x0a\xe6\x29\x0f\x3e\x2d\x01\x46\x7e\x5b\xef\x4f\xab\xde\xf7\x9d\x9a\xb9\x23\x9e\x75\x3e\xc4\xfa\x0b\xb1\x10\xff\x1d\x39\x3f\xca\x02\x24\x35\x02\xd7\xe9\x87\x99\x1e\xb7\x6d\x08\xf8\xbe\x7e\xb2\xb1\xee\x00\xc3\xb6\x8b\xbf\x72\xa6\x23\xba\xa1\x5b\xe8\x96\xb3\x21\x5e\xbe\x8a\x82\x31\x31\x09\xfc\x62\x9b\x0c\xce\x64\x91\xf8\x13\xc2\x49\x70\xe4\xff\xe6\x86\x9e\x40\xb4\x6b\x4e\xd2\x29\x86\xd0\x04\x21\x55\x27\x6c\x23\x0d\xe4\xc0\x5d\x67\x85\x52\xf2\xe8\x51\xca\xcf\x5a\x47\x21\x57\xdb\xb1\xa9\x9a\x2b\x42\xff\x40\x37\xf0\xdc\x63\x80\x67\x29\x21\xc9\x09\x20\x6e\x80\x05\x0e\x61\xa6\xb3\x05\x6b\x17\xe3\xae\x83\x50\x09\xb2\x04\x19\xa3\xb9\x84\x6d\x37\x48\x92\xe7\x19\xf1\xb3\x5b\xc1\x25\x7d\xa9\x3c\xcc\x6d\x8f\x8f\xca\xa8\xe6\x09\xa8\xd2\x04\xdf\x10\x8b\xe7\x19\x34\x67\xe7\xf1\x05\x93\x52\x82\xc3\xfe\x66\x70\xa5\x32\x94\x42\xea\x3e\xdd\xa2\x37\x6a\x03\xa1\xcf\xe8\x72\x3a\x90\x9c\x06\x4d\x30\xfe\x9b\xb0\x21\x2c\x33\xaf\xe2\xbe\xa3\x0c\x91\x43\xc0\x01\xda\x01\xc7\xed\x50\x45\x59\xb9\x7f\xe2\xce\xa0\x9b\xeb\x9d\xb5\x19\x00\xdc\x13\x67\x05\x92\x1e\x20\x29\x78\x45\xba\x72\xa9\x7a\xa7\xc9\x53\x81\x45\x71\xbe\x3f\x08\xce\xf9\x68\x04\x5a\x5a\xc3\x40\x04\xf6\x7f\xbf\xa5\x4e\x99\x6b\x31\x1b\xd8\xdc\x52\x7d\x89\xe1\xd4\xf5\x34\x53\xa6\x71\x37\x20\x10\x1c\x45\xa6\x0e\xe3\xa0\x5c\x2e\xe6\x6f\x13\x4b\x5a\xf4\x0e\x4b\x70\xef\x37\xba\x3f\x0a\xfd\xef\xc0\x39\xf3\x42\xc2\x8a\xf9\x19\x82\x51\x38\x1a\x10\x79\xa5\xdd\x03\x5a\x8c\x28\x97\x6c\x6b\x7f\x4d\xb0\x9e\xa3\x83\xa3\xa8\x7f\x0f\x85\x1f\xd3\x31\xae\xa7\xfa\x4b\xfc\xd9\x56\x31\xd6\x52\xfa\x2f\x50\xf1\xc2\x3f\xf2\xbc\x13\x7a\x06\x04\xe3\xd9\xf3\x9c\xcb\x96\x51\x45\xbc\xa4\x8b\x06\xdc\x8a\x81\x75\x47\xb6\x25\xef\xfa\x79\x6d\x00\x0c\x37\x74\xba\xd1\x98\xdb\x12\x41\xbe\x7a\x2c\x0d\xc4\xa4\x64\x1b\x9a\x8c\xb9\xcb\x8c\x8c\x38\x87\x57\x6f\x52\x72\xc3\x3a\xaf\xfe\x45\x61\x5f\x51\xa9\x6f\xae\x76\xcf\x51\x25\xbc\x69\xad\x0a\x40\x38\x79\x07\x99\xb5\xc2\x62\x44\x21\xa6\x43\x3d\xba\xb3\x9c\xcc\xb0\xb1\x78\x7b\x5b\xce\x28\x95\x94\x48\x9d\x17\xed\xb5\xf9\x31\x03\x74\x80\x7d\x36\xc6\xe6\x73\x47\x26\xbb\x33\x00\x4e\xca\xe8\xbb\x69\x1d\xcd\x38\x76\x01\xf4\xea\x91\x1b\x4b\x90\xeb\xff\x75\x6d\x7d\x8d\x9e\xb4\x22\xcb\xb9\xaa\xf7\xf4\x77\x2e\x0a\x54\x36\x43\x06\x85\xe5\x7b\x69\x74\x54\xe8\x2e\xea\xdc\xe4\xab\xa0\x62\xb7\x76\x82\xcf\x21\x9b\xe1\xfd\x9b\x00\xf1\xcb\x11\x35\xa1\x02\x13\x49\x53\x9a\x4b\x93\xae\x21\x3f\x19\x3d\x29\x32\x73\x8e\xf7\x29\x20\x49\x9b\x7b\xe2\xa8\x1c\x9b\xaa\xed\x17\xc5\x46\x41\xa5\x97\x4d\x27\x22\x32\x41\xe3\xc6\xa0\x95\x22\x6b\xd2\x37\xe0\x59\x1e\x00\x2b\x3a\xf0\x56\x5d\xf3\xe9\x76\x42\x0f\x97\x64\xa0\x9a\xe8\xbf\xa2\x79\x5f\x8f\xad\x7f\xc6\x87\xbd\x2d\xe2\x3d\x14\x88\xf4\x49\xd8"}, -{{0x28,0x7f,0xaf,0xd2,0x13,0x74,0x57,0x2f,0x57,0x81,0x00,0x47,0xd0,0xd9,0x8c,0xb1,0xff,0x3d,0x01,0x20,0xfa,0xa4,0x88,0x61,0x32,0x24,0x57,0x32,0xc1,0xa6,0xab,0x78,},{0xe8,0x25,0x20,0x63,0xf5,0xad,0x7e,0x95,0xbd,0x05,0xc5,0x02,0xa8,0xbc,0x4a,0x17,0x55,0x63,0x60,0x86,0x9b,0x9d,0xe0,0xa3,0xb8,0x58,0x93,0x8e,0x11,0x11,0x76,0x19,},{0x62,0x01,0xe3,0x05,0x91,0xd3,0x6b,0x7b,0x22,0x6e,0x36,0xfd,0xf5,0x64,0x34,0xc4,0x7c,0xd3,0x05,0x18,0x37,0xaf,0x31,0x31,0x3a,0x99,0x17,0xfd,0x02,0xdd,0xed,0x2b,0x5b,0xbb,0x4b,0xbc,0x36,0x8b,0x3b,0xd1,0x5d,0x06,0x20,0x45,0xf1,0x05,0xb6,0xe7,0x34,0x1b,0x15,0x15,0x0d,0x36,0xf9,0x00,0x87,0x59,0x1d,0x83,0x99,0x01,0xb8,0x01,},"\xb3\xc4\x43\xe4\xe5\x89\x9c\x16\xd3\x9e\x81\xb4\xf8\x07\x40\x42\xa9\x04\xa7\x35\x07\x4b\x27\x95\xd9\xac\x06\xb1\x37\x9e\xf7\x61\x8d\x2a\x53\x4b\x6b\xef\x81\x56\x9e\x60\x71\x92\x67\xbf\x29\xcd\x9d\x16\xac\xc9\xa1\x74\xd8\x02\x6b\x14\xb1\x27\xd0\xd2\xd8\xb4\x58\x39\x98\x89\x5a\xd7\xef\x72\xfe\xdc\x53\xb8\xf0\x8a\x22\x50\x10\x0e\x1f\x1f\x0a\xab\x48\xbc\x70\x74\x64\x34\x88\xe6\xb6\x70\xe1\xb0\x72\x7c\x38\x5a\x34\xff\x65\xa0\xd7\xe8\x3b\xa8\x60\x83\xb8\x73\xdf\xf0\x55\x92\x09\xb1\x4b\x2a\xc4\x2b\xf7\xc5\x72\xd0\xc5\x91\x7a\xc4\x2e\x4a\xe4\xda\xe1\xdd\x42\x35\x79\x52\x76\xa0\x76\x13\x2c\xfe\x3e\x0c\x35\x0b\x26\x58\x0f\xbb\x3a\xf8\x17\x77\xb9\x3a\xd9\x5c\xb7\xff\x17\xc2\xd9\x80\xce\x0d\x49\x2f\x6d\x40\xfa\x90\xba\x3f\xca\xa2\x1b\xb6\x87\x35\xee\x1e\xf2\x08\x49\x5e\xbf\x7b\x02\x27\x6f\xfa\x1e\xfc\x08\x16\x58\xbb\x44\xcd\x27\x61\xef\x5e\x3e\x1c\xa6\x0e\xc8\xb5\xd8\x16\xd4\xab\xac\xd0\xbc\xc8\x02\x68\xd8\xf4\xdf\x8b\x3a\x52\x04\x9d\xb0\x15\x7e\x2b\x6e\x81\xac\xd6\xf3\xf2\x89\x47\xc0\x76\x27\x95\x5c\xda\xc9\xea\xa1\xde\x17\xd4\xb9\xda\xa3\x61\xfb\x49\x78\x26\x64\xd7\xd6\xd2\xca\x5c\xec\x6d\x14\x89\x3c\x3e\x80\xb6\xd1\x6d\xaa\xcf\xfc\xc0\xb7\x59\x37\xe8\xbe\xf6\xf9\xe1\x12\xa8\x7f\x4b\x03\x5f\x90\x36\x07\x0a\x2c\xcc\x55\xc2\xaa\xd9\x39\xdf\x67\x4f\x7e\x4e\x12\x68\x5e\x01\x6e\xa0\xe4\x90\x2a\xaa\xaf\xaf\xfe\x38\xdd\xb2\xf9\x0d\x9c\xf7\x85\x37\xf6\x13\x91\x69\x6f\xf0\x33\x0a\xe8\xf7\x9a\x1c\x1e\xd5\xd5\x2b\x4e\xe2\xa6\x2d\x90\xfb\x82\xd9\xa4\x83\x93\xfa\x33\x81\x0b\x40\xd0\x45\x59\x02\xd5\x74\xff\x05\x20\x03\xe0\x16\x0c\x0f\x47\xb5\xe5\x80\xa0\x78\xbc\xee\xf0\x60\x73\xdd\xa8\xb2\xd1\xf1\x04\xa5\x95\xe9\x0b\xb6\xa4\x8e\xdd\xd8\x65\xf1\xca\xe4\xf1\x78\xfe\x22\xe7\x5f\x2f\x61\x24\xa9\xda\x06\x82\x44\x71\x12\xb3\xdb\x5b\xe8\xc4\x24\x72\xb2\x41\xe9\x44\xfd\x23\x70\xc2\xdc\x27\x15\xc0\x5a\x41\xbd\xbc\x89\x0c\x41\xc6\x5f\xb0\x8c\x2f\x59\x31\x74\x39\x1a\xc8\x80\xf3\xcb\x67\xd1\xb7\x4f\xf8\x02\xef\x96\x2a\xfe\xf7\xb9\xf3\xea\x32\x6f\x95\x27\xe7\xfb\xa6\x98\x18\x79\x24\xb6\x4c\xcd\xd0\x86\x62\x48\xc7\x6e\xe6\x4c\x79\x06\x9b\xe0\xa0\x57\xb1\x0a\xe1\x90\xf3\x8f\xf5\xab\xa8\x44\xe3\x93\x31\xcf\x1d\xb1\x3c\x90\x09\x06\xbe\xe0\xd7\xe7\x54\x6e\xf5\x23\x24\xe3\x7c\x59\x06\x75\xf1\x39\xf5\x8f\x57\x3a\x49\x4f\x4a\xe8\x2c\x4e\xc8\x10\x66\xa6\x8e\x2d\x92\x90\x01\x91\xc4\x7d\x30\x62\xf0\xf9\xaa\xed\x19\x11\x37\xcd\xa9\xb8\x3c\xd1\x30\xe8\x26\x29\x60\xe6\x24\x4f\x8f\x6e\xf3\x9f\x15\xa4\xfe\xd1\x3c\xb6\x69\xed\xc1\x9f\x5c\xe1\x62\xce\xb8\xd2\x42\xb9\xad\xdb\xfb\xa8\x77\x2c\xe7\x49\x85\xa5\xf3\x72\x0d\x59\x0a\x92\x0e\x1d\xca\x75\xa8\x79\xb1\xaa\x45\x9f\x74\x62\xff\xf2\xe9\x50\x72\x76\x1b\x20\x92\x54\xfe\x38\xc5\x4d\x83\x3a\x8e\x2c\xb8\xfc\x40\xc5\x98\xf3\xc7\xf7\xd6\xc5\x70\x57\x15\xd0\x30\x8d\xc3\x0e\xaa\x84\x67\x6d\x20\x9d\x7b\x7b\x31\x34\x47\x56\xe6\x9a\x9a\x4c\xb4\xe4\xa2\x51\x81\x7a\x37\x86\xfe\xa6\x72\x8d\xd6\x08\x22\x33\x6b\x45\xae\x5d\x47\xc7\x04\xb4\x5c\x4c\xad\x38\xc1\xe0\x1a\xb9\x3d\x14\x16\x92\xd5\x5d\x12\xfd\xb9\x74\x0f\x1d\x18\x15\x82\xf1\xc4\x8c\xe5\x43\x48\x60\xd9\x30\xf0\xe7\xe7\x0e\xdc\xff\xb8\x55\x60\xa5\x3d\xba\x95\xd5\x7b\x31\xe8\x92\x41\x37\xbc\x2c\x19\xe3\x4b\xb9\xc9\x86\x68\x77\x17\x42\x80\xe8\x0c\x23\x97\x8d\x57\x79\x58\x64\xa7\x37\x4a\xef\x38\x3f\x3b\xf6\x37\x53\x59\xbf\x63\x56\x47\x40\x09\x84\x61\xa6\xc7\x6e\x8f\x23\x89\x13\x28\x87\x69\xa1\xcb\x1c\x95\xb2\x2c\x32\xa9\xeb\xb3\xec\xeb\x04\x8e\xe3\x24\xcf\x0d\x7e\x85\xa3\x89\xb0\x4d\xed\xbb\xcb\xee\xf2\x98\xd0\x52\x78\x16\x08\x5c\x0c\x83\xef\xaa\x29\x85\x46\xe8\x39\x0b\xd1\xbf\xe4\x65\xec\x1b\xaf\xae\x69\xee\x52\x18\xe7\x2c\xae\xdb\x9b\x64\x9c\xf7\x3e\xec\x45\x4a\x2b\x48\x49\x65\x17\x96\x72\xde\xbc\xf9\x44\x13\x63\x99\x5a\x8a\x90\x7d\xe1\x7d\xc0\x68\x4f\x2a\xea\x57\x9a\x2f\xb4\x48\x41\x95\xdb\x41\x15\xca\x32\xe9\x70\x52\x6d\xc0\x0a\x5c\xac\xaf\x58\x87\x11\xdb\xd4\x69\xce\x80\xbd\x29\x7c\x4f\x41\xd6\xfa\x28\xa5\x97\xc6\x37\x2c\x0d\x21\x49\x60\xb5\x45\x98\xcd\x8b\xc8\x49\xeb\xdc\xa3\x6d\x62\x25\xb2\x0d\xec\x0d\x03\x11\x69\xce\xbb\x36\xea\xdc\x3a"}, -{{0x9a,0xd0,0x49,0x10,0x08,0x51,0xd0,0xf7,0x9b,0x71,0x12,0x25,0xc9,0x88,0x47,0x79,0x5a,0xcf,0xc3,0x60,0x1c,0x14,0xb8,0xa9,0x77,0x8d,0x62,0x70,0xcd,0x4c,0x05,0xed,},{0xe7,0xca,0xcf,0x4f,0x37,0x14,0x54,0x3c,0x27,0xa3,0xe9,0xed,0x83,0x3b,0xaf,0x3b,0xde,0x4c,0x09,0x56,0x3b,0xef,0x59,0xe7,0x63,0xfa,0xb7,0x1f,0xb5,0xe4,0xff,0x56,},{0xfe,0xc0,0xaf,0x34,0xcb,0xc5,0xcf,0xfc,0x56,0xe9,0x6d,0xd5,0xed,0x59,0x68,0xe5,0x2c,0xbd,0x42,0x69,0x84,0x4f,0xc3,0x0e,0x3a,0xb0,0xd3,0x47,0x2b,0x5d,0x18,0x0c,0x8d,0x1b,0x76,0x90,0x51,0x8f,0x41,0xf1,0x44,0x38,0xe7,0xf3,0xa8,0x3d,0x5e,0x89,0x76,0xcb,0x9a,0x26,0x15,0x1f,0xc4,0x14,0x9a,0x32,0x98,0xd7,0xe4,0x2c,0x05,0x03,},"\xc2\x84\xbd\xd8\xf8\x27\x5b\x49\xac\x80\x8c\x39\x04\x5e\x50\xe1\xed\x50\xc8\xa1\xaf\xd0\x11\xaf\xe5\xdb\x3d\xda\x62\x0b\xe8\xae\xc3\x7f\x45\x60\x57\x62\xe2\x25\xd0\x41\x11\xf2\x1b\x49\xfc\xef\xca\x3f\x3d\x5f\x81\x3b\x20\x20\xa5\x2c\x49\xf9\x5c\x4a\xd6\x1c\xa2\x14\x61\x8a\xde\x7e\xed\x6c\xd8\xd3\x14\xdc\x4c\x63\x55\x95\x52\x77\xd4\x57\x46\x2f\x03\xb9\xfb\xa2\xe2\x25\xb1\xb5\x37\xcd\x4b\x52\x37\x50\x5c\x90\xd4\x32\x05\xe1\x71\x5c\x39\x63\xcc\xfb\xec\x37\x9e\x6c\x17\x05\xe0\x80\x34\xa3\x1a\xfc\xe6\x46\x72\x7e\x78\xa2\x0e\xed\x88\xae\xb0\xdc\xda\xbc\x5c\x86\xe8\x69\x79\xe6\x3a\x5c\x26\xc3\xe2\x17\x79\x73\xb6\x98\x3c\xeb\xfe\xda\x9f\x31\x47\x93\x61\xb6\x61\x76\x3a\xa7\x26\x1c\x09\x39\xca\xd4\x8b\x71\x90\x8e\xa9\x07\x68\xbb\x6c\x95\x83\xd8\xea\xeb\x9e\x03\x38\x51\x5a\xca\x12\x42\x62\x6d\xc6\xbe\x04\xec\xc4\x42\x9e\x4c\xbb\x4f\xf3\x36\x09\x61\x92\xf7\x50\x1e\xc4\x71\xb5\x96\xa9\x9d\x4c\x02\x75\x82\xcc\x69\xe2\x04\xb6\xfb\xcd\xdf\x59\xf5\xbf\x74\x62\xdd\xcd\x59\x89\x12\x1f\xd1\x0f\x11\xa0\x67\x5b\x6c\x4e\x4f\x65\x20\xd2\x7d\x7c\x61\x43\x1b\xa7\xd1\x74\xf5\x73\x95\xa0\xbf\x72\xd3\x8c\x11\x42\x73\x6d\xed\x6b\x91\xe4\x81\x1c\x0e\x85\x41\xa6\xc0\xd9\x96\xc5\xa1\x7d\xc9\x7d\xb3\x88\xf7\x21\xd2\x35\x7d\x3c\x6a\xf5\xc8\x6b\x1d\x5e\x47\x6e\xa0\xac\x0b\x1c\x11\xd4\x38\x7f\x76\x90\x39\xbd\xf5\x38\xa0\x21\x6e\xdd\x00\x45\xee\x6d\xd8\x9e\xef\x82\xa4\x25\xa8\x3f\xaa\x1b\x12\x80\x70\x38\xca\x19\xeb\xec\x00\x2e\x8b\x3c\x15\x34\x4c\x61\xcf\xd1\xe5\xf0\xe3\xb0\x27\x3d\xeb\x37\x27\x8c\xf1\x97\xd8\xa8\x3b\x13\xd9\x92\x30\x8a\x51\x37\x3e\xb3\x81\x14\xc9\xe4\x5b\x43\x87\x80\x27\x7d\x1e\x32\xf3\x97\x29\x62\xa3\xe1\x4a\x8d\x08\xdb\x9f\x09\xae\xc3\xdd\x32\xa5\xb9\x94\x23\xe6\x1f\x5e\x79\x94\x4a\xb5\x7a\x36\xf6\xec\x07\xcc\x32\x04\xf9\x16\x5e\xe0\x21\xad\xa9\x3e\x6f\xec\xb7\xec\x45\x6a\xa0\x28\x8c\x37\x8a\x75\xaf\xd6\xe9\xda\xd6\xc6\xf8\x8e\x95\x9a\x2c\xf2\x8b\xfe\x56\xd2\xe6\x1b\x2a\xda\xec\xf0\xd8\x6d\xd8\x92\x8b\xce\xda\x26\xb0\x54\x02\x46\xb7\x33\x7f\x5c\xdc\xec\x11\xfb\x0c\x1a\x59\xd6\x31\xfc\xca\x19\x40\x8f\x95\x22\xb6\x8a\x39\xf8\x6e\xf9\x70\xb8\x83\xa0\xf0\xbd\x6b\x7b\x14\x15\xec\x9a\xa0\x43\xb5\x2e\x19\xba\xc1\x76\xd6\x7b\x79\xe2\xa5\xdc\xa8\xbf\xd2\x91\x02\xac\x60\x8e\x47\x3e\x9f\x98\x2c\x3e\xc8\x93\x2d\x8a\xa8\xcd\x56\x52\x84\x49\x1d\xe5\x2f\x51\x6b\x9e\xbf\xb7\xdb\xe1\x29\x95\x11\xae\x73\x2c\x2a\xd1\xee\x49\x92\xb0\x77\xfa\xff\xc6\x5f\x48\x8f\x1b\xa2\x15\xda\x69\x79\x60\x09\x71\x19\x6d\x0f\xf3\xa0\x8a\xd9\xf0\x0e\x82\x9c\x1d\xe1\xaf\xca\x10\xca\x47\x6b\xe6\x64\xaa\xd2\x61\x88\x9b\x0e\xb7\xae\xb6\xed\x86\x37\x61\x89\x00\xac\xf4\x81\xe2\xd2\x24\xec\x64\xa6\xe6\xcf\x4f\xa4\xdf\x73\x1b\x7a\x4f\xee\xff\x25\x80\xc9\x9b\x6d\x75\xb4\xdc\xd0\x97\x69\x65\xcb\x2b\x0b\x56\x35\x22\x78\x42\xd0\x8a\x7d\x90\x7a\xae\xbc\x2f\xde\xd8\x00\x98\x11\xdc\xdd\x73\x35\x49\x21\x75\x3b\xc5\xde\xc0\x17\x68\x93\x35\xf5\x6d\x0f\xb7\xae\x21\x3b\x41\x79\x2b\x1f\x4e\xb1\x4a\x24\x53\x59\x77\xa3\x05\xb1\x9e\xb9\x83\x8d\xc6\xb5\x15\x28\xb9\x8a\x39\xbd\xa0\x60\x10\x71\x7a\x20\x8c\x34\x7a\xa1\x58\xee\xcd\xfd\x9a\x04\x72\xd3\xb8\xd9\x20\xf9\x69\xe1\x2b\x65\x91\x9b\xda\x38\xb4\x61\x94\x98\x50\xcc\x9c\xc1\x8d\x8e\x3b\xaa\x8c\x88\x6d\x93\xcd\x09\x6a\x20\x9d\x54\x3c\xa3\x37\x5f\xc4\xe7\xd6\x51\x03\xcb\x64\x24\xbe\xab\x44\xe8\xbc\x4a\x5b\x62\xc2\x9a\x01\xbc\xf4\x4d\xcc\x61\xe7\x67\x5c\x02\x5d\xec\x07\x24\x20\x01\x94\xbd\xe7\x4d\x72\xc0\x2e\x94\xa9\x46\xa7\x52\xf3\x60\x84\x57\xfd\x91\xf2\x92\x71\x57\x71\x48\x7d\x26\xca\xd4\xe5\xcf\x6e\xf7\xc6\xf7\x16\x27\xa4\xda\xf8\xa4\xc9\xb8\x91\xc1\xee\x8f\x04\xae\xaa\x99\xfe\x0c\x8b\x4e\x83\x3b\x76\x09\x06\x6b\x61\x32\xa9\x68\x89\x0e\x26\x95\xda\x22\xb2\xd8\x57\xc8\xc0\xad\x91\x87\xc9\x60\x69\xe4\x76\xe2\x7e\x46\x32\xc4\x47\xee\x76\x71\x4a\x31\xd1\xe5\x14\x9e\xcb\x33\x7e\xe1\x32\xf3\x55\x2d\xa3\x3a\xb2\xd6\xfa\x9d\x7e\x93\xf6\x8a\x77\xcb\xf1\x91\xcb\x06\xbc\x22\xf3\x47\x0a\xf6\xd7\x58\x1e\x3a\xcc\xbe\xca\x0b\x6f\xeb\x08\xa1\x4b\x9a\x80\xc1\xef\x59\x37\x4c\xcd\xc0\x52\x3c\x36\x84\x50\x4c\x01\x04\xbb\xa2\x2c\x10"}, -{{0xde,0x54,0xe1,0x3f,0x9e,0x2c,0xc7,0x54,0x54,0x6c,0x99,0xb3,0x3b,0x3d,0x72,0xf4,0xd1,0xf7,0x71,0x50,0x38,0xa9,0x65,0x9f,0x33,0x63,0x65,0x77,0xbb,0x52,0x6a,0xdb,},{0x36,0x33,0x8d,0xb3,0x32,0x6b,0x00,0x5e,0x5c,0x61,0xff,0x78,0x2b,0xe2,0xea,0xb1,0x66,0xd4,0xeb,0x72,0x34,0xa9,0x8e,0xa1,0xcd,0x85,0x5e,0x1a,0xd5,0x35,0xe9,0x4c,},{0x37,0xac,0xa8,0xf2,0x48,0x39,0x4a,0x9e,0x04,0xd0,0x6a,0x7d,0xa8,0x4a,0x7d,0xef,0xa3,0x9d,0xe4,0xda,0x2b,0xcb,0x18,0xd5,0xf6,0x4c,0xc3,0x4d,0xb0,0x86,0x51,0xaf,0x4a,0xbb,0x19,0xfa,0x2a,0x92,0xa7,0xdd,0xa5,0x6e,0xc9,0x93,0x0b,0x81,0xae,0xbd,0x23,0x99,0x05,0x11,0xf6,0x84,0xc6,0xd1,0x5b,0xa5,0x95,0xf7,0xd4,0xa2,0x74,0x0e,},"\xdc\x40\x41\xad\x61\x42\x3a\x12\xa0\x41\x13\x18\xa6\xe6\x2a\x5e\xf6\x4a\x19\xab\xe2\xd9\x85\x22\x97\xbe\x2d\x4a\x35\xeb\x86\x70\xca\x36\xc5\x21\x53\x1b\x30\x38\xac\xda\xee\xa2\xea\x01\xa0\xb6\x18\x78\x62\xa4\xe1\xa8\x9d\x4b\x81\xc5\x31\x8e\xd4\xd6\x71\x31\xbc\x38\xf8\x41\xa1\x42\xa2\xf6\xf3\x16\xdf\xf0\x76\x93\x9d\xc0\xeb\x81\xb2\x30\xfe\xa9\x88\x1f\x8f\x0f\xf7\xed\x0b\x29\x3f\x69\xb2\x89\xfe\x77\x08\x81\xfb\x37\x10\x80\x8e\x8e\x59\xe6\x4e\x19\x0c\x1e\x37\x9b\x9d\xd3\x48\xb0\x2c\x23\x47\xd7\xe2\x06\x96\x79\x0b\x62\x77\x6a\x2e\x82\x5b\xed\x69\x17\x03\x7c\xb6\x35\xc9\x2f\xbc\x76\xb4\xc5\x85\x10\x27\xe7\xf1\x38\x52\xee\x7e\x7c\x52\x57\x3a\x90\x30\xb7\x9f\x22\xb6\x0d\x58\x69\xef\xe6\x80\xc0\x16\x64\x92\x9f\xe9\xa0\x6f\xa3\x33\x05\x2b\xe1\xd6\xaf\x3a\x0b\x48\x2c\x33\x2e\x18\x05\x1e\x78\xb3\x33\x83\x9d\x6c\xb9\x3d\x93\xeb\xfb\x27\x7e\x42\x68\xfb\xee\xee\xba\x1e\x8f\x96\xa5\xc9\xe3\x28\xc4\x26\x72\x12\xca\xc2\x51\x21\x5b\xfa\xa7\x8f\xd8\x8a\x87\x41\x7a\x80\x60\x2d\xcd\x88\x28\xe8\x04\x00\xda\x30\x4e\x98\x98\x62\xd1\x32\x01\x08\x2d\xe3\x53\x09\x25\xe0\xed\xc2\xc1\x30\xa9\xa4\x19\x07\x1b\x31\x08\x8d\xa6\xf6\xff\x40\x56\x30\x1c\x12\x9f\xc2\x13\x52\x33\x62\x8d\x16\xd8\xbf\x16\x0f\x6c\xe8\x6d\x83\xcd\x4e\x29\xae\x0c\x73\x84\x3d\x70\xb5\x30\x56\xc5\xaf\x3f\x3d\xc5\x61\x27\x1c\xb5\xaf\xf3\x93\xf0\x80\x3a\xde\x07\x2d\x9c\xeb\x74\x5b\x61\x87\xb2\x8d\x24\x69\x67\x67\xd5\xc2\x1f\x4d\x4a\xc5\x8d\x5b\xb6\x6c\x5c\xad\xfe\xfb\x16\x26\xef\x93\xf7\x14\xc7\x82\xb6\xef\x3c\xcf\x4b\x44\xee\x75\xf0\xbb\x75\x7a\x25\xd9\xb4\x6a\x9d\x93\x1a\x03\x72\x7d\x49\x6a\x22\x81\x0c\x63\x4f\x5c\x1a\xe6\x0c\xbd\xf2\xf1\xea\x29\xb5\x46\x07\xcf\xf5\x0d\x9f\x8e\x03\xa0\xa4\x51\x3c\xf6\x8d\xfb\x61\x97\x73\x41\x1b\x61\x80\x95\x9a\x8a\xac\x30\xb2\xee\xe4\xad\x32\x79\x15\xf6\x0a\xe5\x2b\x90\xe0\x4a\x9b\xce\xf8\xdc\x67\xe7\x1e\xa1\x0a\xca\x55\x3d\xb9\x89\x5c\xd8\x00\x84\x57\xd7\x6f\x02\xce\xb5\x35\x00\x21\x11\x09\xe8\x96\x03\xf3\x04\xd8\x80\xaa\xf0\x28\x61\xfe\x37\xc9\x53\x4a\x9d\x67\x2d\x83\x71\x3c\xd3\x26\xc9\xab\x81\xc3\x53\x76\x4c\xa5\xad\x5a\xc0\xe7\xf1\xff\x88\x0f\xb4\x8a\xcd\x9c\xbb\x94\x90\x64\xe2\x11\x83\xbc\x38\xfb\x1d\x90\xcf\xe6\x19\xa8\xb8\xfb\xf5\x32\x18\x89\xbb\x15\xc0\x2a\x53\xe4\xd3\x67\xfc\x66\x88\x77\xb6\x62\x28\x1c\x4a\x2a\xf6\x78\xf8\x6e\x69\x1d\xaa\x8a\xfd\xca\xc1\xb8\x20\x18\x9f\xe5\xc2\x50\x8c\xe3\x6e\xdd\x9c\x6f\x8f\x51\x57\x50\x71\x83\x94\x39\xa0\x03\x35\x2c\x15\x73\xe1\x27\x68\xdd\x6d\xeb\xdf\x1e\xd4\xf9\x4a\xc7\x9d\xf1\xab\x6a\x0b\xc2\x50\x79\xc0\x93\x54\x77\xd9\x14\x99\x88\xec\x3b\x87\x93\xef\xcd\xa8\x59\xac\xc3\x92\xab\x3f\xa9\x94\x93\xd7\xae\x0a\x65\x75\xb6\x95\xa1\xce\x07\x65\x32\x86\x02\x87\xdd\x49\x89\x67\xc4\x6f\x7a\xdd\x49\x49\x4c\x02\xe7\x44\xc4\x02\x80\x19\x57\x82\xe2\x42\x44\x76\x16\x5e\x72\xce\xe2\x36\x42\xe5\x1c\xec\x43\x21\x91\x11\x6a\xec\x59\xb5\x9f\xcf\x0a\x36\x83\xb9\x5f\x76\x07\x60\xa2\x0b\xd6\x74\x54\xd8\xde\x64\x7c\x0f\x9f\xfc\x4f\x90\xf6\xe4\x5a\xc9\x3d\x80\x2f\x33\x82\x99\xef\x28\x0d\x3b\xb7\xa4\xa8\x9d\xb8\xc5\x9a\x12\x52\x6f\x27\x83\x02\x4c\x8a\xde\x90\x02\xf0\x0e\x3d\x52\x9b\x78\xdc\xdd\x49\x03\xda\xf5\x76\x7a\x2b\xed\x75\x14\x53\x96\xef\xb6\x97\x90\x71\x2d\xe6\xa5\x90\x1e\x6d\x8c\x15\x28\x01\x82\x38\x82\x85\x02\x1d\x0e\x70\x92\x92\x15\xd9\xf2\xb7\x99\xbb\x92\xf2\xca\x56\xf4\x8e\x8c\xbb\xa2\xf1\x9b\x08\x58\x45\x12\x65\x67\xcf\xaf\xa6\x03\xc2\x94\x6e\xa1\xe7\xd2\x74\x55\x4a\x38\xbf\x7d\x86\x51\x1f\x3e\x47\x4f\x9f\xa5\xcb\x11\x10\x5f\xb5\x2f\xc6\x81\x77\xf3\x38\x5f\xe1\x39\x7b\xe5\x84\xa7\x00\x89\xdc\x74\x1b\x4b\x00\x95\xbf\x7e\xb2\x99\x3b\x41\x8d\xf8\x7b\x14\xa1\xf9\x79\x26\xe8\x68\xdf\x6e\x56\x8b\xec\xa2\x21\x5f\x2d\xd7\xce\x8a\x3c\x9e\xe8\x49\xcb\x41\x34\x6c\x68\x4f\x7f\xfe\xf0\xa7\x92\xed\xf4\x33\xca\x99\xef\x34\xc7\x3f\x92\x72\xa7\xeb\x97\x58\x7c\x8f\xce\x4a\x51\x36\x44\x47\x37\x13\x8d\x53\xea\xdf\x3a\x84\xf5\x01\xbb\x10\x45\x6e\x8e\x4a\x40\x47\x08\x2c\x9e\x14\x35\xf5\x76\x52\x6c\x21\x64\x71\x4d\x70\xb3\xd0\xa6\xe9\xc0\x8a\x53\xe3\x23\x84\x0f\x4d\xcf\xe8\xf2\xd1\x9f\x0b\xe2\xc8\x8e"}, -{{0x85,0x04,0xfb,0xca,0xab,0xa6,0x76,0x83,0xf8,0x15,0x49,0x92,0x82,0xb6,0xeb,0xd4,0x97,0xa8,0x1a,0x91,0x56,0xf5,0x3e,0x02,0x5c,0x2d,0x3e,0xce,0xe0,0xdb,0x65,0x59,},{0xe6,0x2d,0xa8,0x64,0x93,0xa0,0xca,0xf5,0x29,0x21,0xd5,0x60,0x2f,0xbd,0xc3,0xdd,0x3a,0x84,0x36,0x94,0x1f,0x6b,0xe2,0x40,0xb3,0x15,0x09,0x68,0x12,0x38,0x74,0x6d,},{0xc0,0xea,0x07,0x4b,0xf9,0xad,0xde,0xe2,0xe3,0x35,0x0a,0x96,0x9e,0x7c,0x56,0x9e,0x3a,0xea,0x1a,0x41,0x88,0xee,0x5a,0xf3,0x4c,0xb7,0x3f,0x38,0x82,0x98,0x65,0x3d,0x29,0x9b,0x5d,0xbd,0x94,0x16,0x3f,0xba,0x20,0x9e,0x8f,0x7d,0xc2,0xe2,0x63,0x4d,0x3a,0x52,0xa0,0x28,0x10,0xa8,0x8c,0x61,0x52,0x94,0x5b,0xc1,0x6b,0xbd,0xfb,0x0c,},"\x6c\x63\xed\xbd\x40\xa0\x38\x74\xec\xae\xf8\x16\x02\xcd\x68\x50\xc0\x9f\x49\x15\xb7\xaa\xf4\x18\x25\x8c\x56\x83\x64\x53\x8e\x83\x92\xa8\xc3\x79\x83\x8b\x0c\x95\x34\x5b\xf6\x4c\x3d\xbc\x17\x58\x53\xfb\x64\x1f\x35\x0f\x0b\x53\xa0\x5a\x8e\xc2\x90\x28\x8c\x03\x26\xd4\x35\xff\x77\x6f\x86\x83\xa2\x73\x33\x3f\x9b\xb2\x80\x21\x84\xec\xc5\x3b\x06\xb2\x8c\x2c\x40\x2a\x54\xbf\x13\x4c\x1a\x23\x29\x97\x49\xa6\xce\x2b\x51\xa7\xba\x22\x23\x21\x48\x79\x7e\x99\x3f\xf2\x58\x28\x6e\x94\x77\x78\xa8\x74\x2d\x3f\x36\xcc\x78\x42\x97\x60\x43\xfc\x23\xda\x8a\x97\xec\xb9\x71\x5f\xc0\x5f\xb0\xf2\x3f\xa7\x32\x1d\xdc\x19\x32\x86\x16\x31\x60\x4e\xba\x2e\xf2\x5d\x8b\x75\x6c\xe4\x73\x36\x56\xbf\xd1\xe1\x47\x08\x92\x3a\xc7\xc6\x0a\x79\x84\x61\x36\xd7\x41\x97\x3b\xa5\x51\x41\x89\x72\x0b\xc0\xf7\x77\x4b\x7b\xd3\x57\x45\x95\xbd\xe2\x51\x50\x31\xb2\x5b\x62\x65\x4b\x16\x10\x35\x77\x80\x70\xac\xe1\x49\x71\xdf\x1f\xe0\xbe\x4e\xa1\xef\x55\xcf\x87\x47\xd3\x71\x6c\x1c\xe7\x07\xb1\xa7\xc8\x52\x0e\x6d\xeb\x33\x4e\xb1\x86\x33\x8f\xc9\x30\x00\x76\x8e\xb2\xbe\x40\xc6\xe0\xdc\x3f\x5d\xf8\x31\xb3\x2c\x3a\x2c\x33\xe2\x88\x98\xd6\x76\x2a\x15\x22\xd3\xd4\x8d\xae\xe5\x6a\x02\x69\xbd\xdf\x6c\xfc\x9d\x73\xf8\xd1\x78\xae\xcc\xbf\xfe\xf7\xce\x16\x4f\x98\xaf\xea\x22\x4a\x9b\x60\xed\xe4\x6a\x95\xfa\xdc\x9f\xc5\xd9\x4d\x20\x9c\x16\x6d\x9b\x8d\xe2\x53\x38\x1e\xa2\x24\x88\x62\x94\x6b\x9c\xf5\x34\x94\x74\x55\xc2\x44\x58\xcf\x56\x68\x3a\x0e\xc4\x7a\x2c\x65\x07\x5c\x69\x4c\x7c\x3d\x6a\xdf\x9a\xe5\xe8\xad\x31\xac\x76\x9f\x83\xaa\x26\xe3\x12\xc5\xb0\x1a\x9a\x09\x40\x4b\x15\xb8\x14\xba\xa7\x66\x6b\x3e\x03\xf0\x6a\x8d\x63\x48\xab\x8c\xcb\x9b\x60\xa4\xa4\xfa\xf8\x6f\x71\x35\xdf\x03\x9d\x95\x5c\x07\xbd\x92\xe7\xb8\xe3\x27\xee\x6c\x1b\x40\x19\x6a\x28\xb4\x44\x6a\xa5\xa9\xb2\xb9\x77\x3a\xb7\x6e\x3c\xe2\x11\x80\xf0\x9d\x6c\x08\xd2\x77\xc6\x77\x1d\x67\xe2\x2d\x84\x54\x0f\xa4\x3b\x38\xf6\x34\xcf\xc4\x6e\x5b\x8c\x33\xf1\x5a\x56\x8a\x77\xe4\x91\x4a\xad\x9a\xb8\xc9\xf7\xfe\xa4\x7f\x76\x77\xc0\x18\x80\xb3\xe8\x5d\x2d\x0e\x3f\xbd\x6d\xc6\xe9\x9e\x43\x7d\xdc\x73\x6f\x92\xb5\xa2\xff\x29\x27\xe0\xb4\x42\x14\x2f\x08\x97\xd0\xb8\xa1\x9a\xc2\x03\x63\x3d\xf4\x13\xfe\xaf\x8e\xf5\x0a\x5f\x76\x7b\xed\xaf\x20\xf1\xc1\x3f\x3b\x89\xd1\xe8\xb7\xbd\x18\xd5\x91\xf9\xde\x11\x6e\xe3\x4f\x98\x24\xe4\xea\xd1\xae\x9d\xa2\xe8\xca\xae\xf8\x8b\x29\x51\x6a\xa9\x42\xde\x77\xa7\x46\x7b\x6f\xb2\x6a\x66\x6f\x30\x64\x8c\x71\x5a\x2e\xe9\xf9\x46\x74\x3b\x54\x3a\x44\x28\xe0\xdf\xd0\x61\x78\xe7\xe9\x3e\xc6\xf2\x6e\x00\x3e\x05\x8b\xec\x14\xa4\xaa\x2e\x3b\x8d\xe1\x12\x95\xa7\x64\xca\xb3\x0b\x31\x3f\xcc\x57\x43\xb2\xfb\x89\x96\x2d\xdc\x5c\xdc\x6a\xa0\xd2\xe4\xa3\x06\xe7\x7a\xf7\x6a\x05\xa5\x98\x92\x3f\x62\x8a\x85\xdf\x1c\xc7\x3a\xd3\xbc\x01\xc4\xb9\x79\xbd\x7c\xb2\x96\x59\x0a\x88\xb0\xa4\x1b\x44\x5d\x50\xa0\x84\x23\xe4\xed\x80\xf1\x76\x3c\x71\x6b\x6c\x45\x7d\x84\x5d\xfa\xa6\x8d\x12\xb0\xd0\x3c\x55\xfd\xe8\xae\x6b\x2b\x92\xbc\x63\x22\x94\x3d\xbe\x54\xc7\x06\xbc\x8e\x5f\xce\xe7\x06\x54\xb2\x6f\x3b\xfd\x87\x7f\x5f\x53\x39\xac\x18\x2d\x54\x17\xbd\x4c\x07\x35\xd8\x25\xbf\x70\xe8\x5e\xab\x82\x16\xed\xda\x63\x2a\xe7\xe2\x2b\x3e\x53\xd0\x78\xa8\xb2\x0b\x5a\x7e\x23\x85\x33\x7c\xf9\x2b\x3c\x16\xb0\x23\x56\x3e\x11\xcb\x50\x43\xb7\x04\xd3\x7e\xb5\xed\x9e\x85\xfc\xdc\x95\xcf\x7a\x6e\xad\xe4\x08\x03\x17\x5a\x00\x8e\xf6\x53\xac\x61\x36\xf1\x61\x29\xab\xae\x11\x37\xc5\x82\x34\x00\x74\x8a\x81\x25\x62\x54\xd3\x17\xcf\xc9\x39\xe2\x6e\xa0\xce\xf9\xf6\x54\x8d\xb4\x28\x90\xc4\x8b\xeb\x04\x79\x10\x3b\xa0\x89\xe5\x14\x11\x80\x38\xb1\xb9\x09\x43\xd7\x16\xf7\xa8\xd4\xcd\xa5\x98\x3a\x67\x4b\x83\xa0\x02\xd8\xac\x9c\x65\x73\x4a\x28\xb7\x7b\x76\x0c\x8e\x38\x03\xf8\x78\x1e\xa9\x19\x9f\x79\x7c\xe7\x29\xe0\x6b\xff\xfe\x8c\x29\xb2\x0b\xc8\x52\x27\xc0\x9c\xc0\x52\x19\xff\x2b\xa3\x8e\x18\x05\x10\x83\x73\x2f\x83\xcb\xfc\xcc\x31\x07\x56\x45\x0b\x26\x1d\x5b\xe1\x83\xd9\xfb\x44\xec\x18\x52\x9f\x2c\xc9\x84\x8c\x40\x11\x9c\x60\x76\x76\xbc\x4d\x90\x15\xfd\x4b\xd2\xfc\x91\x8d\xc8\x03\x1e\xc1\x9a\x05\xff\x36\x2c\x18\x40\x43\xbe\x7f\xe0\x66\x01\x9a\xc5"}, -{{0xea,0xc0,0xf0,0x6c,0x2c,0x14,0xf3,0x7d,0x43,0x4b,0xc9,0x98,0x97,0x22,0x5d,0xd2,0xe3,0xf1,0xed,0x74,0xaa,0x74,0x42,0xc5,0x50,0x33,0x9d,0xf7,0x7d,0x0b,0x7b,0x32,},{0x43,0xe6,0x20,0x55,0xdb,0x6e,0x13,0x49,0xc9,0x4d,0x89,0x02,0x91,0x87,0x88,0x20,0x20,0xcb,0xcf,0x9d,0x75,0xe0,0x3e,0xb6,0x56,0xfa,0x0a,0x15,0xb1,0x90,0x02,0xd7,},{0x45,0xf2,0x80,0x3a,0xfe,0xb0,0xfc,0x44,0xd3,0xaa,0x96,0x5b,0x12,0x65,0x9b,0xf5,0x02,0xe4,0x72,0x95,0x70,0x61,0x84,0xb2,0xa1,0xc6,0xf1,0x6d,0x05,0x06,0x13,0xf5,0x96,0xa2,0x00,0x13,0x94,0xe0,0x0e,0x2a,0x44,0xc4,0x6c,0xf6,0x50,0x5d,0x5c,0xf5,0xb8,0xab,0x84,0x12,0xf0,0x7e,0xda,0x95,0x1a,0x15,0x00,0x5e,0x33,0x8f,0x3c,0x0e,},"\x27\xb7\xfd\x0e\x71\xad\xf1\x94\xcf\x54\x07\xb6\x77\x17\x93\x06\x0d\xe0\xfc\xa7\xca\x0a\xe6\x48\x35\xc4\x31\x87\x40\x8a\x70\x4f\x53\x3d\x5e\xa0\xc8\x3a\x65\x43\x87\xba\x7d\xb1\x6e\xd5\x8e\xc8\x37\x22\x6d\xf5\x7c\x1f\xe6\x38\x2c\x59\x19\xe9\x22\x13\xf6\xf1\x8c\xbb\x57\x35\xd1\x78\xa4\x76\xaf\x35\xd3\x90\xb7\xcd\x25\x56\x21\x7c\x53\x0f\x3a\x1f\x8a\xb2\x33\x9c\x1a\x5e\x8d\x96\x93\x87\xef\xd3\x94\x14\xb5\x6b\xb7\x84\xdf\xd5\xeb\x89\xb8\x59\xe1\xf4\x03\xa2\x38\xec\xa2\xa9\x41\xe6\xdb\x56\xac\x45\x6b\x73\x45\x06\x98\xd1\x45\x5e\xc1\xe9\xb3\x9a\x1e\x90\x7d\x6b\xc7\xe6\xcf\xf4\x24\xa2\x8e\xed\x57\x9a\xf1\x63\x10\x11\x5b\x67\xf5\xfc\xf7\xf8\x34\x6b\x3f\xa0\x26\x0c\x6d\xa2\xe2\x77\x55\xac\xa5\x70\xba\xbb\x3d\x30\x3c\xc8\x32\x46\x0c\x96\x3b\xfd\xd5\xc1\xff\xb2\xfc\x19\x92\x19\x29\xdd\xa2\xa7\x17\xfb\xcb\xeb\x2b\x85\x25\x76\x1b\xd6\x60\xce\x4a\x0f\x76\x85\x28\x5d\x7f\xad\x61\x15\xab\x09\xf8\xe6\x3f\x5f\x77\x39\x14\x49\x4e\x20\xbe\x1b\x51\x2d\x11\x14\xcc\xe3\xf0\xf6\x8c\x7d\x94\xf5\x48\x57\x69\x4f\x22\xaf\x4c\x69\x8d\x78\x2c\xe8\x37\xb0\xc1\x72\x2b\xb7\x31\x3b\xb2\xc4\x1f\x6d\x3d\xd1\xa0\x28\x77\xfb\x42\x96\xd8\x66\x2a\x9e\x86\x25\x98\x4d\xc1\xfd\x1a\x95\x10\xeb\xa9\xd6\x43\xac\x58\xa8\x86\xa0\x45\xcd\x0e\x53\xc0\x56\xa8\x33\xf9\x68\xb3\x5d\x01\x32\x0e\x9c\xc0\xb4\x35\xd3\xf6\xbf\xad\x26\xf9\xeb\x57\x54\xd3\x8d\xdf\x6d\x5c\x4b\xf6\x15\xa7\x64\x4a\x23\xf9\x82\x6b\xcc\x97\x60\x92\xd8\x2d\x81\xd5\x47\x00\x0d\xe0\x08\x1b\x7a\x40\xa9\x3f\xbd\xda\xc1\x3f\x7d\x99\x70\x8c\xcd\xee\xb9\x40\x5c\xd6\x34\xca\x07\x48\xca\xd2\xc1\xd8\xf1\x64\xf5\xd7\x7a\x4f\x36\x4a\xe4\x88\xbe\xdc\xf1\xf2\x0e\xb9\x54\xbc\x8a\x27\x8a\xf8\x14\x32\x41\x78\x56\xa9\x00\xf8\xf1\x52\x92\x1a\xfb\xe1\x79\x14\x22\x9a\x51\x3b\xd7\x1a\xb7\xe6\x61\xcd\xe1\x29\xaf\x93\xe2\x50\x94\xc5\x61\x18\xed\x1f\x22\xdb\x64\x44\x28\xb4\x74\x65\x1f\xe3\x6b\xe8\x2f\xa3\x69\x5c\x41\xfc\x86\x99\x66\x7e\x05\x37\x43\xb0\xa4\x11\x55\xc3\x1f\x1e\x26\x79\xc6\xe8\xcb\x9c\x9d\x1f\x5f\x4b\x40\xa3\x20\xa9\xfd\x9f\x47\xda\x9b\x94\x21\x1b\xa6\x01\xb2\x2a\x11\x52\x10\xd9\xf5\x59\xc4\x49\x6f\x01\x73\x24\x58\xf4\x9a\xc3\x4e\xb3\x86\x63\x6c\x8b\x6c\x68\xc7\xbb\xc0\x07\x8a\xb6\xf3\x98\xa6\x24\xb8\xba\xfb\x1c\x62\x29\x58\x56\x2d\x23\x1d\xff\xd4\xdb\x09\x61\x96\xbb\x87\x47\x9e\x42\xea\x22\xac\xbd\xcd\xe8\xde\xb1\x0e\x31\x16\x32\xf0\x2f\xca\x14\x78\x7f\xd3\x14\x05\x69\xb9\x42\x89\x91\x54\x3e\xc6\xe8\x34\xe1\x0b\x14\x9f\x23\xc7\x4b\xb9\x9a\xc7\xb3\x79\x9a\x20\x96\xd2\x2e\x38\x7a\x71\x2b\x6f\x90\x11\xea\x34\xc5\xbe\x4c\x46\x85\x81\xac\x62\xce\x66\x20\x63\x25\x2e\x06\x6a\x9a\x3b\x15\xc9\x57\x0d\x06\x5d\xc1\x61\x99\x29\xf0\x6b\xc7\x5a\x31\x79\x46\x8b\xc8\xa1\x6e\x3d\xdc\x4f\xe1\x85\xce\xba\x0a\x92\xa5\x46\xb8\x67\x5f\xc1\xad\xe5\x63\x07\x15\x0c\x7e\x4c\x84\x4f\x6a\xa5\xf1\xed\xbf\xb5\x4a\xc6\x32\xca\x2b\x25\x9c\x32\xa3\x3e\xe2\x86\x78\x56\xc3\x39\x0a\x67\x40\x36\x4c\xb0\xdf\xb9\x76\xe5\x3d\x0c\xc6\xc4\x2a\x10\x6a\x1c\x26\x91\x8c\x8a\x6a\x03\x3b\x2a\xa3\xc7\xf2\xe4\x39\x2e\x79\xf8\xec\xa5\xb3\x36\xba\xc5\x06\x1d\x76\x98\xa3\xbf\xe7\xc2\xc2\x92\x89\x25\x54\x03\x0d\xe6\xce\x7c\x0d\x06\xee\xfc\x54\x90\x6f\x81\xe0\x09\x7f\xcf\xf2\x7d\x14\xb9\xb7\x99\x4a\x79\x70\xe1\xa5\xf5\xc6\xb6\x40\x5d\xca\x22\x03\x3d\xff\x0e\xae\x13\x8a\xd8\x99\xf6\xee\x68\x12\x0b\x8f\x22\x74\x4b\x02\x69\xa9\xa8\x98\x9b\x6f\x7e\x08\xaf\xfa\xe7\x7b\xca\x21\x68\xad\xe2\x40\x58\xae\x68\xa7\xf8\x00\xe0\x2e\x7c\x38\x39\x1b\xaf\x56\x5d\xd4\x0b\x55\xfa\x3a\xb3\xc2\x47\xb9\xce\xb4\xd9\x67\x47\x17\x75\xe6\x63\xd6\xa1\xc6\xc7\xe1\x73\x50\xbb\xd6\xb9\xa3\xeb\x1e\x48\x4a\xc2\xe7\xa7\xa5\xc8\x4f\x50\x83\xe5\xac\xe8\x73\x0d\xe8\x9c\x47\xe8\xdc\xf8\x34\x1e\x40\xba\x34\x5d\xbd\x66\xba\xe0\xf7\xf0\x76\xa7\x05\xb1\xbb\x7f\x47\x0e\x3e\xdf\xb2\xb7\x8e\x4d\x63\x59\x41\x3d\x18\xd3\x32\x80\xb4\x54\xa0\xdb\xb8\x81\xd8\x60\x67\x26\xfa\x9b\xea\x27\x24\x75\xe7\x9f\xea\x6a\x54\xcb\x4c\x06\x19\x54\x1b\x4e\x77\xc1\x70\xc8\x61\x68\x74\xb9\x54\xbe\xb8\xd1\x05\xb8\x6b\xd1\x91\x7e\x25\xcf\xba\x92\x67\x18\x7e\xe2\x03\x8b\x3f\x00\x78\xf4\xc3\x18\xb5\x87\xcf\x44"}, -{{0xe6,0x08,0xd5,0xde,0x97,0x97,0x90,0x7d,0xb6,0xd9,0x8e,0x03,0x45,0xd5,0xca,0xf2,0xad,0x33,0xe0,0xed,0xde,0xbf,0x18,0xb8,0x1d,0x61,0xe8,0x37,0x3e,0xcf,0xb4,0x99,},{0x60,0xe0,0xc1,0x6a,0xda,0x58,0x6e,0x36,0x46,0x91,0x2a,0x5f,0x2b,0xb3,0x18,0xfb,0xc3,0xd5,0x0b,0x57,0xd3,0x6f,0xab,0xb6,0x37,0x69,0x6f,0x9d,0x8d,0x4d,0xc7,0x61,},{0x0d,0x8f,0x09,0x5e,0x42,0xa2,0x73,0x0a,0x3c,0x7b,0xed,0xf4,0x2d,0x5c,0x83,0x39,0x8b,0x5c,0x0e,0xe9,0xc7,0x7c,0x5a,0x61,0xd9,0x82,0x29,0x13,0x96,0xa9,0x18,0x2a,0x08,0x02,0xa3,0x7f,0x32,0x4b,0xc4,0xfb,0x5d,0x4a,0xa4,0xed,0x60,0x44,0x4b,0x66,0x14,0x4b,0xac,0xbc,0x86,0x51,0x05,0xd7,0x69,0x0f,0x14,0x06,0x50,0x69,0x1d,0x03,},"\xe6\x10\xfa\x7d\x83\x85\xc0\x9c\x78\x98\x9e\xd5\xef\x7a\x23\x05\x47\xf0\x13\xcb\x7e\x8d\xdf\x31\x74\x9f\xfc\x31\xce\xe1\x0a\xb3\xef\xac\xa3\xf1\x4e\xa1\x94\x51\x0f\x09\x85\xa8\x18\xef\x8b\x04\x0e\x10\xc3\xa5\x11\x4d\xe1\xac\x08\x0f\x14\xc3\xd6\x5d\x3c\x24\x4f\x92\x42\xf7\x54\x92\xca\xba\xe8\x00\xfc\xfc\x9b\xc2\x75\xea\x1f\x27\x72\x8c\x92\x0c\x25\x8f\xe7\xaa\x73\x94\x80\x60\x29\x9c\xb8\x78\x35\x79\x2e\xdc\xc0\x72\x15\x0b\x73\xce\xfe\xb0\xd5\x15\x62\xe5\x3b\x46\x81\x0e\x27\xa4\xd7\xf6\xab\xd3\x2e\x95\x9f\x7d\x73\x1d\xde\x01\xd9\x4b\xc4\x1e\xd8\x35\xef\xcd\x42\xc9\x22\x43\x70\x37\xa8\x7d\xd3\x66\xff\xad\x2e\xec\xab\x6a\xba\xeb\x4f\xcf\x07\x39\x2b\x3a\xb4\x0c\xfa\xef\xea\xa4\x26\x6b\xc5\x37\x67\x16\x93\xc9\x09\x3d\xab\xe8\xa0\x53\x8c\xaf\xd1\x2c\x63\x9a\x04\xbd\x2b\xa8\x0c\xe0\xf2\x9a\xdb\xfc\x66\xbd\x46\x37\xca\x05\x43\xa5\x3b\x0e\x37\x1d\x0e\x2e\x47\x0d\x31\xba\x36\x06\x42\xa4\x5a\xb4\xcf\xe3\xe7\x90\xf5\x87\xf6\xc5\xa5\x58\x3f\xd1\x5b\x18\x99\x78\x38\xa2\x00\x92\x1c\x1c\x39\x9c\x0b\x16\x27\x8b\x7d\xd6\xd3\xaa\xab\x6f\x32\x5b\x16\xaf\xdf\x76\x1a\x1b\xbf\x86\x7d\xe2\xbd\xd4\x86\x15\xf1\x5b\x52\x67\x70\xed\x20\xd7\x9f\x0f\x30\x71\x4b\xee\xed\xa5\x8f\x52\xa3\xcc\x0c\x5a\x61\x83\x15\xe5\x22\xb9\xeb\xe7\xcd\x99\xb6\x5e\xd5\x32\xa6\x2e\x0f\x0d\xf7\x27\x64\xd6\xec\x6d\x6d\x1b\xa4\x0e\xf4\x0e\x05\x42\x63\x60\x79\x5d\x6d\xd8\x5b\xb3\x9f\x73\x21\xd3\xfb\x06\x27\x5d\xe0\x96\xaa\xe4\xa2\xfa\x22\x93\xf3\x1b\x33\xf4\xad\x4d\x7c\x25\x1a\xc1\x3e\x8e\x15\xc2\xbf\xb1\xf9\x8f\x49\x62\xc5\x4b\x6c\xe0\x33\xb0\x8a\xa6\x26\xf2\x90\x5d\x46\x3f\x55\xb7\x1c\xbd\xad\xec\xdb\x3e\x0b\x36\x5d\xae\x07\xb1\x70\x30\x19\x83\xae\xb8\x3b\x1e\x9f\x2f\x28\xcf\x65\x41\x9f\xd6\xb0\xa1\xa9\xc2\x6c\xb5\x4b\x59\x49\xf4\xbc\x01\xa9\x86\x81\x84\x4b\x43\x03\x4c\x37\x2a\x45\x3d\x38\xf0\x47\x3d\x0d\xdc\x70\x9d\x9f\x49\xc8\x75\x3a\x75\xb8\x56\xc7\xe9\x77\x55\x17\xdf\x57\x4a\x09\xa3\x95\x3b\xde\x5d\xae\xdf\x8e\x4a\x8d\xa9\xd7\x73\xa2\x15\x12\x0e\x26\x9f\xa1\x86\x11\x33\xcd\x4c\xea\xeb\x91\xd5\xcc\xa2\x60\x63\x25\x45\x8e\x50\xcb\x96\x6d\x14\x05\x5b\x22\x44\x7e\xb6\x5d\xc1\x01\x18\xda\x08\x31\xdf\x28\xc3\xb4\xee\x8b\x11\xf0\x73\x2f\x15\x21\xbb\x94\x82\xb1\x1f\x5a\x86\xb2\x2f\x18\xe8\x3d\xd1\xd9\x67\xd3\x94\x42\x85\xe5\xd6\x3a\x5a\x98\x98\x17\xab\x24\x18\xbc\x7e\xd8\x91\xa3\x73\x84\x67\x47\xa1\x2b\x52\x7c\x2f\x44\xee\x01\x97\xb9\x46\xc6\x7e\x67\xfa\x4a\xa1\xc2\x9f\x33\x79\xd4\x6f\xe0\x7d\x3a\xab\x83\xda\x17\xf9\xd7\x6b\xed\xd3\x84\x36\xa0\x55\xe3\x4c\xa1\xd3\xaf\x5a\x87\x54\xd3\x8c\x17\xb9\xba\x4e\x64\x19\xcb\xab\x51\x5f\x43\x1a\x25\x95\x95\x4e\x42\x8c\x26\x70\xfa\xe3\xbe\xd6\x2b\x45\x96\x17\x9c\xb5\x9e\x21\x10\x87\x08\xd0\x71\xbc\xf9\xc6\x21\xc6\xdf\xf0\x3d\x3c\xdc\x92\x02\x02\x94\x54\x01\x3b\x9d\x13\x38\x47\xf2\x65\x44\x81\x1c\x01\x69\x77\x0f\xdc\x6f\xe5\x63\x8b\xfd\x7a\x72\x0d\x8b\x38\xf7\xe3\x0a\x7e\x68\x79\x06\x0b\x5f\x28\xc8\xab\x17\xb0\x02\x00\x71\x32\x07\xe8\x63\x7b\xff\x48\x44\xd8\x42\xd9\xca\x78\x83\x91\x34\x01\x98\xa3\xfe\x01\x72\xdf\xa7\x4d\xe1\xe5\x5a\xde\xfb\xc2\xe9\xbc\x7e\x88\x54\x76\xd1\xb9\xc0\x55\x81\x34\x08\xa4\x75\x28\x43\x43\x55\xbf\x03\xfd\xd4\xe2\x7d\x8b\x34\x61\xb0\xfb\x66\xab\x3e\x15\xa8\x79\xa1\x84\x45\x7e\x9e\xd9\xea\x6c\x51\xb6\x63\xb3\x1e\xdc\x8c\x4a\x3c\xd4\x54\xf6\x9d\x9c\xe5\x18\xd1\xb8\x78\x88\xee\x3d\x9d\xd5\x41\x6e\x43\xe1\x14\xac\x05\x72\x13\x52\xdf\xfc\x2c\xa8\x85\x97\x37\x7b\xbc\x41\x40\x09\xb0\xc2\xfd\x36\x9b\xe5\xba\x35\xa6\xdc\xe3\x47\x8b\x6c\x11\xb3\x3c\x0a\x33\x91\x8b\x6e\xe5\xac\x4c\xd4\xc2\xf1\xca\x6b\xd1\x90\xa0\x00\xa8\x38\xda\x38\xf5\x30\x77\x56\x03\x35\x59\x6d\x13\x58\x93\x77\x93\x96\x38\x10\xa7\x9a\x21\xb8\xd4\x61\x40\xe7\x68\x89\x8d\xcd\xa8\x8a\x0f\xaf\x8d\xdd\x0d\x63\x38\x47\xaa\xea\x0e\x03\x0b\xe6\x45\x5b\x41\xe3\xed\xe1\xe2\x87\x37\x30\xeb\x84\x81\xac\xaa\x7a\x51\x9c\xf9\x19\x58\x47\xa8\x6a\xfa\x57\xf9\x07\x1d\x44\xf4\xaf\x4c\xa0\xd3\x43\xc9\x0c\x0d\x22\xd9\x46\x14\x65\x85\xf0\x0e\xf3\xae\xf5\x7f\x0f\x9e\x55\xe8\x18\xc0\x12\x8a\xe2\x55\xdb\xc3\x11\x6c\xf0\xfe\x02\x16\x6d\x54\x85\x9d\xec\xbf\xdc\xcc"}, -{{0x0e,0x86,0x87,0x2c,0x78,0x62,0x0f,0x10,0xcb,0x6d,0xfc,0x46,0x3d,0x2c,0x28,0x72,0xc4,0xda,0x66,0x07,0x48,0xc9,0xcd,0xa0,0x1a,0xb1,0x45,0x69,0x58,0xaf,0xba,0x7f,},{0xde,0x49,0x89,0x98,0x92,0x69,0xca,0xbd,0x8f,0x4f,0x40,0x9c,0xf1,0xa4,0xd9,0x74,0x03,0x8b,0x27,0x55,0x02,0x27,0x35,0x57,0xf3,0x12,0xd5,0x55,0x3f,0xab,0x93,0xc3,},{0x20,0x37,0xe9,0x77,0x41,0xc3,0xe6,0x40,0x9c,0x66,0xfc,0x67,0x82,0xaa,0xb3,0x89,0xc5,0xd7,0x78,0x09,0x7a,0xc7,0x78,0x99,0x9e,0x85,0x76,0xe4,0x9e,0xf4,0xf6,0xa0,0xc7,0x73,0x0b,0xd9,0xe0,0x93,0xdd,0x3c,0x0a,0xe7,0xec,0x76,0x20,0x33,0x80,0xda,0x65,0x71,0x47,0xd3,0x3a,0x8d,0x9d,0xd6,0x5e,0xd0,0x0c,0xf7,0x62,0x24,0xd6,0x01,},"\xa9\x00\xf3\xe9\xc6\x43\xa5\x64\x9b\x07\x6f\xb6\x9c\x3b\x2a\xc0\x84\xd5\x2c\xcb\xaf\xcd\xca\x5a\x9d\xb1\xda\xa7\x05\x00\xde\x99\x33\xd2\x3d\x15\x3f\x74\x95\x4e\x1b\xd5\xf5\x7b\x89\x9f\xe8\xa4\xb1\x34\xc1\x95\x41\x2b\x49\x83\x3b\x6e\x50\x95\xa6\x55\x4e\xaa\x6d\x84\x4b\x11\xf1\x58\x4c\x85\x05\x5b\x87\xf4\x1c\x99\x96\x69\x04\x6c\x71\xae\xb5\xc0\x45\x3f\xd6\xa3\xc4\x37\xf8\x15\xf0\x68\x98\x7c\x38\x68\xcc\x07\xaa\x2a\xf6\x58\x19\x04\x6c\x30\x7b\xaf\xb7\x53\x0d\xe8\x4f\x71\x30\xae\xa7\x8e\xf0\x05\xd5\xff\xf5\x2f\x8d\xea\xf1\xd5\xe9\xc3\x26\xd3\x21\x7f\xc5\x5b\x94\xf6\x28\xaa\x10\x4f\x6a\x24\xa3\x95\xe6\x2d\x1b\x62\xbd\x9c\x0d\x82\x43\x63\x19\xc5\xd7\x3e\x57\x65\x43\x5f\x3b\xa8\x56\xa4\x73\x4f\xd6\x0a\xe6\x17\xf7\xf0\xc3\xba\x57\x22\xa7\x33\x66\xc8\x8a\x6d\xfe\xca\x85\xc4\x44\x63\x9f\x44\x1f\x2c\x55\xfd\xc4\x64\xec\xb2\x99\xee\xe3\x6d\x8e\xae\x06\x3b\xb9\x4b\xb2\x43\x9d\xa0\x4f\xa5\xeb\xc5\x09\x23\x38\xa5\x03\x5e\x48\x0f\x08\x34\xae\xee\x8d\x71\x1f\x28\xc4\x6d\xc9\x60\xde\x1b\xe9\xdf\x30\x7c\x18\xc5\xc1\x78\xb2\x62\x96\xdc\x56\x7f\x15\xbf\x60\x86\x3a\x36\x71\x08\x67\xe9\x2f\xd5\x10\x48\x86\x56\x74\xc2\xaf\x0c\x53\xb2\xe7\xa2\x48\xae\x5b\xd0\x9a\x49\xaa\x03\x06\x18\x49\x5f\x82\x48\x0c\x42\x0a\xe1\x06\x88\x9b\xec\x00\x62\x78\xb9\x22\x72\x07\x57\x09\xfe\xc9\x54\x87\xcf\xb1\x00\x61\xe6\x72\x2b\x93\xee\xbf\xc0\xbc\x58\x7b\xf7\xba\x5f\x66\x92\xb0\x74\xf5\x5a\x98\xd5\xc3\x02\x76\x0b\x1b\xf1\xd0\x9f\x7e\x86\x68\x47\x9c\xa6\xf0\x1e\xed\xa2\xfd\xaf\x58\x4a\xc2\x05\x8f\xbf\x7c\xf3\x10\x0d\x06\xb8\x09\x1b\xfe\xab\x51\xc0\xc0\xb1\xd4\xee\x3a\x82\x57\xf6\x9b\x16\x17\x60\x4f\xce\x95\x3b\xb5\xf7\xf2\x71\xc6\xa1\x88\x0e\xa1\xb3\xf6\x62\x67\xe2\x43\x9f\x34\x58\x06\x28\x91\x78\x77\xc6\x6e\xc0\xfe\xd7\x6e\x44\xe8\xbb\x2b\x91\xa8\x80\x6d\xf4\xba\xca\x6c\xc9\x28\x89\xb8\x80\x50\x70\xc9\xa6\x17\xf8\x07\x15\x75\x30\x75\x1c\xc1\x7c\x47\xb0\x9e\xeb\xa9\x4d\x22\xb4\xe5\x47\xc3\x70\xce\x7a\x49\x6f\xca\xa3\x41\x2a\xff\xff\xb8\xc9\xb4\xde\x89\xb9\xf1\x21\xaa\xec\x5f\x54\x4b\x0c\x72\x5e\xc5\xee\x9d\x4b\x34\x76\xad\xc9\xd0\x50\xed\xb0\xfd\xba\xf0\x2c\xa9\xe3\x8a\xf1\x5f\x51\x50\x15\xa2\x67\x29\x2e\xc9\xaa\x54\x44\xed\x1d\xec\xd9\xcd\x9e\x1e\xad\x64\x87\xa0\xcc\xef\x99\x5b\x1c\x60\x0a\x03\x69\x35\x83\x86\x60\xac\xab\x27\x6d\x8b\x0e\x5b\x07\xd9\xf3\x63\x53\x21\x4b\xf8\x0f\x94\x1a\xc8\x8c\xf4\x0a\x08\xaf\x91\x79\x26\x23\x41\x12\xec\xcd\xaa\x16\x2d\xc9\x9d\xe3\xe2\x5b\xaf\xf6\x5b\xb0\x1e\x49\x89\x89\x86\x33\x2b\xdc\x2d\x70\x5d\x5a\xea\x40\xf9\xbc\x4f\xbb\x28\x06\x89\x44\x96\x03\x8d\xa2\x36\xe9\xdc\x29\x60\x0c\x9c\xed\xea\xc3\xb6\x16\xcc\x56\xd8\x9e\xc2\xfa\x67\x38\x96\x66\xc6\xc4\xfe\x23\x3b\x63\x91\x05\x02\x3e\x10\x1b\x87\x4a\x63\x30\xfe\x57\x3f\x80\xac\xe5\x5d\x03\x7c\xc6\x12\xe6\xdf\xd5\xa6\xe6\x86\xf9\xa8\x30\x54\xfc\x46\xe1\x5b\xb6\xda\x45\x3d\x81\x0c\xf1\x38\xa1\x78\xbf\x03\x9d\x1e\x18\x16\x14\xff\x40\xcb\xe6\xbb\x3b\x47\x36\x63\x75\x2e\xa8\x02\x5f\xf7\xf7\x39\xee\x4b\x67\x11\x0f\x96\x80\x89\xb2\x47\x3c\xd0\x44\xd4\x8b\x00\x9d\x06\x77\xf7\x91\xf5\x4e\x2d\xf6\xaf\xdc\x3a\xcb\x9e\x99\xdd\x69\x58\xa4\x50\xc0\xe1\xb6\xdd\x5e\x97\xa2\xcc\x46\x29\x8b\x4f\x48\xac\x6a\xda\xf0\x13\xd7\x5b\x2c\x42\x07\x2d\x2e\xe1\x3f\x73\x36\x87\xee\x83\xc3\xf7\x0c\x4f\xdd\x97\x20\xfd\x17\x98\xc6\x62\xfe\xf3\xba\x01\x2b\xed\xd4\x45\xc4\x72\x9f\x21\x30\x48\x4f\xe7\x7a\xc1\xb4\xc4\xdd\xeb\x81\xfa\xf6\x0f\x76\xe3\xbd\x7d\x21\xa9\xa6\xc5\x7a\x69\xa9\xcd\x9c\xc2\x03\xfc\x63\xb5\x9e\xe8\x4b\x89\x15\xb3\xc1\x8a\x59\x54\xe2\x27\xc8\x6e\xbb\xb7\xd4\xc4\xc1\xa0\x8d\x0c\x5e\x46\x7c\x68\xa0\x69\x70\x75\x1e\xf5\x84\xbd\xd6\x11\xe1\xdd\x1b\x48\x90\x0a\xb3\x54\xb9\x9c\xec\x6e\x1d\xf3\xbd\x41\x46\xea\x07\x55\x35\x0d\xc1\x1c\x3a\x3f\x60\x0d\x47\x0a\x74\xf4\x75\xe4\xfe\xed\xaf\x08\x65\x27\x6f\xa8\xa9\x77\x13\x47\x1d\x0c\xa9\x95\x5c\x71\x35\x88\x33\x9d\xee\x79\x65\x6e\x56\x7e\x6a\xb1\xdb\xf9\x83\x07\x03\x81\x7a\xe6\x20\x92\x9a\x06\x84\xa5\xca\xf2\x0f\xef\x81\xa8\xee\x89\x7b\xe7\xe5\x05\xad\xe6\x49\x6b\x9a\xef\x02\x72\xbd\x8f\x35\x08\x60\x23\x3b\x33\x8c\x2e\x36\xd3\x13\x8d\xb6\x95\x38"}, -{{0x52,0x03,0x54,0xd8,0x5a,0x87,0xd7,0xc2,0x2c,0xa6,0xf7,0x84,0x71,0x44,0x10,0xec,0x98,0xbf,0x6a,0x65,0xf8,0x03,0xef,0x93,0x79,0xbd,0xc8,0x04,0x35,0x9b,0x23,0x49,},{0xd8,0x51,0x1c,0xea,0xc2,0xfd,0x66,0x1a,0xcb,0xff,0xb0,0x1b,0xa2,0x74,0x1c,0xad,0x88,0x99,0x34,0xde,0x63,0x92,0x96,0x1b,0xde,0xc6,0xfa,0x46,0x12,0x3b,0x7f,0x0f,},{0x75,0x4e,0x60,0xd3,0xf6,0xf4,0xab,0x4f,0x5d,0x0d,0xdb,0xb0,0x01,0x53,0x20,0x09,0x16,0x63,0x88,0x48,0x7f,0x78,0x0b,0x76,0xf6,0x0b,0xd0,0xbc,0x9f,0xef,0xab,0xfa,0xab,0x6b,0xe2,0xae,0x78,0x69,0x57,0x3a,0x64,0x79,0x6e,0xf2,0x84,0x6e,0x85,0xe5,0xcd,0xae,0x52,0xdb,0x10,0x44,0xfe,0xfa,0x79,0x6b,0xac,0xf4,0x8b,0x96,0x8b,0x0d,},"\xa1\xd4\xad\x48\x6e\xbb\x7c\x1a\x0a\xcb\x8f\x11\x70\x13\xe8\xe4\x74\x67\x89\xc6\x24\x4a\x56\xc9\xed\xfb\xf1\xef\x37\xac\x13\x09\xaa\xf5\x1c\x93\x75\xfc\x12\xca\xcd\x68\x97\xa4\x47\x95\x45\xf2\xbf\x39\x0a\xb7\xc0\xc0\xe5\xc5\x92\xf5\x50\x6e\x99\x38\x37\x8a\x11\xb6\x36\xbf\x85\x70\x29\xb9\x68\x54\x7a\xa5\x06\xc4\xa0\x82\x9a\x15\xfd\x39\x95\xfe\xad\x4f\x86\x0f\xd7\xc6\x23\xc6\x3e\x86\x95\x43\x6e\xae\x55\x81\x64\x14\x77\x83\x47\x09\x2f\x5f\x4d\x42\x2b\xb1\xb5\xe5\xa0\x69\x66\x24\x1e\xfe\xc1\x4f\x1e\x4f\xca\x06\x63\x91\x14\x71\x8c\x30\xeb\xca\xdd\x4c\x6d\x8a\xbe\x7f\xe9\x3b\x25\xd1\x71\x73\x53\x39\x54\x18\x8b\x1a\xb0\x3f\xcb\x77\x92\xcb\x63\x5c\xe3\x6e\x9b\xdb\xdd\xe7\xa5\x61\xc5\xf6\x69\x20\xd9\x10\xcb\x26\x9c\x8c\x1c\x3f\x59\x32\x65\x09\x00\x72\xc4\x89\x32\xe6\x92\xa9\xc7\x38\xc7\x04\x89\x74\x89\xa7\x15\xc2\xb3\x94\xd5\xa8\x6f\x70\x36\xa4\xca\xc5\xdc\xb5\xb8\x5c\xfa\x16\x21\x56\xe0\xbc\x6b\xfe\x02\xfb\x4c\x38\x60\x8c\xfb\x23\xc9\x2b\x8b\x6a\x3c\xb4\x6e\x48\x7d\x60\xe0\xdc\x97\xaa\x2e\x33\xe3\xda\xda\x92\x5e\x4e\x66\x12\xcc\x5a\xf1\x25\xe5\xac\xa4\x58\x17\xa2\xfd\x6c\x3f\xf1\x0b\x18\x93\x8b\x44\xbd\x4d\xd2\x0d\x7f\xcc\xf7\xf2\x6b\x40\xa6\x6f\x48\xaa\xff\xc9\xa5\x41\xe6\xd3\x71\x38\xfc\x55\x46\x98\x68\xe2\xd1\x03\x65\xef\xf3\x7f\xac\x36\x0f\xab\x3d\xc5\x54\x37\xac\x2d\x8f\xea\x74\x74\x40\x5f\xb3\x63\x0f\x79\x63\xd2\xd4\x59\x58\xf9\x09\xd1\x48\x30\x28\x6f\xf1\x52\xaa\x75\x2f\x51\x0c\xe9\x80\xbd\x57\x54\xe3\xfa\x32\xc6\x99\x24\xdd\x95\xd5\xc1\x52\xa7\x37\xa8\xfa\xdc\xfd\x0a\x45\x60\xe0\xb1\x14\xf8\xe8\xaa\xa6\x18\xd4\x38\xb9\x87\x71\x11\xda\x17\x40\xef\x81\x7c\x44\x19\x39\xec\xec\x79\x9b\xa1\x6b\x1b\x17\x1c\xa9\xb6\x49\xb7\xd7\x8f\xa0\x52\xd1\x49\x7a\x50\x76\x88\xbe\xde\x49\x00\xab\xc5\x3a\x96\x48\xda\x59\x17\x03\x5c\xef\xfe\x0d\xa2\x1c\x25\xc0\x9b\x06\xd6\x18\x5b\xdd\xa2\xd7\x78\xf7\xed\xe6\x15\x3e\x3e\xaf\xf4\x95\xc9\x79\x6d\x4d\x16\x6d\x2d\x2e\xa4\x18\xe4\xa4\xaa\x6e\x67\x8f\xaf\x06\x96\xe7\x52\xa0\x9e\x02\xea\xad\xe7\x63\x07\x0e\x08\x8e\x99\x64\x91\x9f\xf4\xaa\x4c\x82\xf8\x62\x9a\x3d\x5c\x79\x7c\x2a\x64\x59\x4d\x20\x68\x35\xda\x0b\xfa\x43\xcc\xd9\xdd\xfc\xdb\x6a\xac\x4d\x48\x6e\x03\xc8\x41\x22\x37\x59\x39\xa5\x27\x0b\xc1\x51\x9e\x07\x07\xe5\x1c\x3f\x46\xf1\xe5\xc5\x66\xb3\x3a\x24\x5f\xa0\xc2\x02\x83\x84\x72\x36\x3d\xe9\xf0\xed\xde\x2e\x79\x1d\x82\x29\x30\x95\xf7\x50\xbf\xf5\x45\xe6\xc3\x47\x39\xdc\xc5\x4d\xb0\xa3\x6a\xe2\xe2\xaa\x39\xb0\x7c\xb4\xf6\xa9\x64\x62\x40\xd2\xd3\x14\x88\xf6\x78\x15\xb2\x95\x45\xd2\x20\xbe\x92\x9e\x33\x39\xf8\x28\x1a\x93\x7e\x05\xa8\xc5\xc3\x88\x7e\x06\x04\x8e\xa7\xb1\x8a\x48\xf8\xd9\x1b\x1e\x3a\xf5\xca\xb5\xce\xda\x0e\xbd\x71\xbf\x54\xed\xec\x20\x3d\x37\x16\x5e\x4c\x9f\x9f\x80\x46\x1c\xd2\x9f\xcd\x99\xdd\xea\x43\x96\x93\x94\x1b\x5d\x53\xff\x94\x37\x9c\xf6\x42\x57\x1d\xd5\x59\xa1\x1f\x8f\x38\x3d\x94\x3f\x22\x55\xcf\x71\x58\x00\xaf\x77\x6b\x10\x45\xbf\x19\xa9\xc9\xbb\x09\x51\x55\xdf\xb6\x46\xb6\x5f\x4a\x28\x0f\x2a\x97\xef\x92\x7d\xda\xbe\x24\xa2\xf9\x71\xa8\x17\x0d\xd4\x2a\x08\x92\x76\x82\x5c\xb9\x14\x8c\x01\x5a\xae\x1e\x9d\xad\xf2\x2c\x10\xe7\x54\x8c\x59\xbf\x6b\x86\x8b\x20\xe8\x6c\x83\xa9\xe7\x34\x3a\xec\x27\x54\xee\x62\x25\xf9\xfd\xce\xaf\x8e\x51\xc4\x0e\x95\x5b\xda\x49\xc3\x5d\xed\x38\xfa\x8b\xcc\x1e\x6c\x8f\xc9\xc2\x41\x2e\x91\x04\xc5\xc2\x36\x8b\x1f\x99\x23\xe0\x10\xfa\x2e\xde\x91\x1d\x42\xb1\x39\xf4\x00\x7e\x34\x26\x92\x2f\xfb\x61\x58\xec\xa9\x7b\x47\xcf\xc9\x97\x85\x35\x12\xbb\x9d\x4c\xa2\xf0\x17\xc2\xc2\x63\xdc\x19\x9f\x3b\xf1\xeb\x4f\x15\x08\xef\x82\x8b\x0e\x00\xdb\x21\x00\x27\x36\xa7\xf2\x2e\xc9\x12\x98\x19\x45\x83\x13\x9a\xd7\x5f\x58\xe2\x1b\x51\x8d\xaa\x49\xa4\x07\x6c\x63\x75\xfa\xa6\x08\x91\xa6\x9e\x52\xa6\x56\x69\x9d\x80\x34\xa7\xab\x7f\xcb\xe4\x21\x75\x49\x14\x41\xfe\x61\xb1\x78\x3e\x83\x78\x57\x52\x22\x15\xa5\xfa\xc5\x59\x0b\xed\x2e\x9d\x20\x66\x06\x09\x6d\x3b\xe8\xee\x92\x87\x3b\xfc\x30\xca\xb1\x5c\xe9\xf9\x91\x0d\x01\xa1\x17\xf8\x99\x26\xcc\x3a\xfa\x8d\x10\x4f\x79\x9f\xf3\x80\x98\xde\x28\xb8\xff\x0f\x03\x87\x25\xc2\x90\x3b\x24\xc1\x42\x9c\xea\x49\x25\x24\x9d\x87\x81"}, -{{0x06,0x1b,0xcf,0x1a,0xa6,0xfd,0x98,0x98,0x97,0xb3,0x22,0xe5,0x91,0xcc,0xef,0x54,0x54,0xef,0x4a,0x5a,0xdb,0x1a,0x48,0x00,0xf3,0x26,0x11,0xcf,0xf2,0xb5,0xbc,0x78,},{0x73,0xc8,0x0b,0x73,0x4b,0xfc,0x94,0x17,0xd5,0x76,0x89,0x0c,0x20,0x16,0x6d,0xa5,0xc7,0xfa,0xbd,0x61,0x3f,0x75,0x47,0x4f,0x76,0x49,0x73,0x2e,0x00,0x29,0x5b,0xe2,},{0x5a,0xda,0xa9,0x43,0x30,0xa0,0x35,0x37,0x12,0xa3,0x4d,0xbe,0x97,0x3b,0x75,0x18,0xf9,0xa2,0xc7,0x13,0xf8,0xaa,0xd1,0x00,0x25,0x1b,0x08,0x6a,0xe8,0xde,0x26,0xf6,0xd2,0xb6,0xcc,0xf0,0x52,0x8c,0xc5,0xde,0xdc,0xa3,0x18,0xdf,0x19,0xcc,0x7e,0x45,0xde,0xae,0x28,0x1e,0x13,0x24,0xb9,0x6e,0x32,0xfe,0xf4,0x5a,0xaf,0x60,0xb1,0x0c,},"\xd6\x3b\xb9\x20\x8c\x1f\x4c\x7d\x43\x32\x6c\xf3\x5f\xa5\xd8\x39\x33\x15\x18\x04\xab\x89\x1d\x49\xb0\xbd\xaf\x42\x9e\x4c\x39\xa3\x21\x42\x8e\x0d\x90\xaa\x00\x31\x8b\x97\xe0\x8c\x70\x24\xc9\x12\xcf\x38\x88\x79\xf3\xcf\x97\x4b\xb2\x53\xa1\xe7\xa4\xc8\xee\xc1\x93\xbf\x4c\x14\xaf\x6f\xb9\x79\x4d\xf0\xd4\x97\x85\x0e\xdb\x04\xd5\x74\xc9\x7e\xd7\x6c\x70\x21\x39\x96\x84\x01\xb4\x0e\xb5\x43\x94\xef\x4c\xfa\xa7\xe5\xd3\xcd\x94\x3a\xf1\x21\x92\x53\x8d\xde\xe5\x93\xc2\xa2\x4a\x26\x7a\xfa\x13\x71\xfd\x77\xfe\xee\x20\x71\xf4\x36\x9f\xbe\xf8\x79\x76\xe7\xeb\xd8\x1d\x1e\x5b\x31\xd6\xe0\x9e\x02\xd8\x30\x35\x7d\x36\xbf\xf8\x59\x67\x03\xe4\x14\x6d\x08\x27\xbe\xc9\xc0\xf8\x7b\x26\xf3\x11\x95\xc9\x6c\x93\xb6\xd8\xc4\x67\x67\xec\x1b\xc6\xde\x39\xf0\x00\x8a\x41\xff\x87\x5d\xa0\x50\xa3\xf8\x65\xab\x92\xcb\xf2\x9c\x38\xa2\x80\xf3\xbf\x69\xf6\x8e\x92\xb5\xf4\x30\xcd\xee\x35\x01\x98\x1d\x0b\x3d\x18\x90\x96\xe0\xae\xac\xd6\x4c\x33\x10\x24\x21\x34\x88\x12\x15\x8b\xb6\x1e\x51\xae\x93\x65\x92\xb2\xf8\xf1\xb9\x10\x94\x9e\xf3\x72\x32\x58\xa9\xb4\x4e\x4e\x1b\xda\xdf\x1a\xe2\xcf\xc1\x8e\x37\xd2\xed\x0d\xd1\x73\x44\x04\xb8\xba\xa5\xf3\x93\xcd\x56\x06\x9e\xce\xbf\x7e\xdd\x7c\x06\xcf\x6c\x8a\xa3\xe8\xe1\x2f\xbf\x94\x6d\x7b\x32\xd8\x45\x3b\x6f\xbb\x65\x35\x52\x6c\x8f\xb8\xfc\x1d\x58\x15\x56\x0b\xb3\x1b\x99\x5d\xf2\xad\xbd\x83\x6a\xdd\x92\x9a\x56\xfd\xd9\x3a\x17\x47\xd9\x3a\x40\xc0\x5e\x12\x9e\xb6\xf8\x58\x3c\x29\x21\xcc\x9d\xbd\xda\x42\x25\xe1\x76\xdb\x38\x6a\x02\xec\x40\xaf\x10\x32\xc9\xb6\x2e\x95\x14\x70\x25\xf4\xac\x8d\xd5\x84\x33\xb6\x4a\xc0\x73\x15\x0c\x69\xb9\xc4\x15\x4d\xcb\xb0\x03\x44\xf3\x08\x11\x3c\xd9\x19\x9c\xcf\xb5\x07\x58\x01\xc7\x05\xb8\xfc\x43\xb7\xc8\xbc\x16\x73\x65\xe4\x62\x93\xd0\x6c\x4f\x48\x35\xc6\x4e\xe5\xd5\x38\x3f\x68\x90\xca\x35\xa8\x0a\xf9\x17\x74\x81\x62\xdf\x25\x18\xab\x14\x68\xf1\x53\x62\x98\x99\x40\x6c\xde\x66\xce\x07\xfa\x7d\x29\x93\xda\xbe\x0c\x60\x08\x9c\x91\x89\x24\x88\xf3\xbc\xaa\xec\x40\x8a\x0c\xd0\x8c\x9a\xa9\x8e\x09\x37\xe0\x2c\x41\xad\x52\xd2\x41\xa9\x98\x33\xe3\xb8\x3f\x7d\x3f\x1b\x07\x8c\x31\xd4\x5c\x34\xfa\x01\x75\xab\xbd\x0f\x32\x2b\x8f\xd2\xdc\x83\x49\x1d\xa2\x92\xad\x00\x76\x2e\x3e\x57\x7b\x9e\xee\x0a\xae\x08\x72\x90\x70\xac\x25\xe3\x3b\xc9\x45\x25\xbc\x0d\x2a\xb5\x97\x04\xef\xec\x5c\x01\x48\x42\x1a\x47\x92\x8d\x34\xb1\xe4\x5c\xe7\x21\xee\x64\x47\xfb\x08\x2a\xc4\x00\xb3\xe6\x84\x6d\x20\x4f\x7f\x9d\xb6\xf0\xa3\x2b\x2a\x69\x73\x8b\x3e\xe9\xdd\xbb\x0d\xbd\x7e\x0f\x04\x1d\x7e\xa5\x3a\x5d\x64\x7f\xb5\x0b\x39\xae\x24\xd7\x8c\x8b\x07\xcf\xc4\xe0\x52\x71\x1f\x0d\x46\x39\xe7\x21\xd5\xc3\x6f\x31\xb5\x88\x86\x67\x12\xb7\x57\x10\x8a\x40\xcc\x7a\xbb\xb9\x91\x30\x83\x30\x3a\xae\x05\xa0\xf1\xaf\x0e\xc6\x87\x84\x41\xa2\x5c\xf8\x72\x9a\xba\x42\xa3\xa9\x4c\xe9\xb7\x38\x88\xa0\xf5\xc9\xe4\x0c\x9f\xc4\x54\x10\xf0\x68\x1f\xa7\xf9\x08\x98\x56\x2c\xcb\x4b\xbc\x55\xf0\xab\x1f\xe9\xc7\x0e\xa6\x60\x26\xdd\xa8\xd7\x09\x0f\x7b\x38\xed\xb5\xae\xc1\x55\x7b\x11\x66\x98\x7c\xd4\x1a\x70\x59\xcd\xee\x60\x9b\x74\xd8\xfe\x06\xb7\x05\x9b\x77\x24\xbf\xf5\x30\x07\xf7\xe1\x10\x46\x2f\x06\xad\x14\xd0\x7e\xe1\xb4\xd6\x9a\xc8\x23\xbc\xf5\x76\xd2\xfa\x9e\x2e\x8e\xd7\xf3\x19\x80\x40\xd4\x71\x29\x60\x63\x13\x7c\x98\x1a\xdb\xf3\x64\xcb\x20\xf0\xa1\xad\x20\x54\x47\x2f\x7c\xee\x25\x27\xf9\x98\x09\x61\x5d\x2e\x4b\x73\x4b\x06\xf3\x5d\xee\xcb\xd6\x26\x19\x66\x3d\xde\x81\xd6\xe2\x35\x28\xb0\xc9\x71\x32\xaf\x0a\x23\xba\xd6\x3d\x9c\x08\x14\x2a\x26\xe2\x74\x3f\x86\x18\xec\xfe\x72\x3b\x19\xff\xdd\x0b\x19\xab\xd9\xa3\xf4\xfe\x21\x0b\x1e\x71\xac\xdf\xe3\x8a\xbe\xbe\x23\xf7\xfd\xef\x66\x38\x1c\xbc\x75\xf3\x07\xe5\x57\x72\x35\xb0\x2e\x4c\xd9\xcf\xaa\x15\x03\x08\x68\xed\x14\x53\xda\x58\xf7\x83\xb7\x35\x2b\x04\x65\x68\x44\xc0\x42\x44\x1e\xfe\x6a\x3b\x4f\x8f\xec\x8f\x7d\xe8\x07\x44\x54\x0c\x4f\xc7\xa1\x07\xf4\xe1\xbf\xcb\xd9\x9d\xa2\x5b\x97\x46\x09\x5d\xdf\x01\x25\xd5\x6d\xa7\xe7\xf8\x60\x3f\x04\xd3\x59\xa0\x88\xb4\xc0\x44\xf9\x36\xcc\xb7\xd8\xf8\x9e\xd5\x3c\xc9\x91\xa3\x49\x7c\xa9\x52\x09\x4f\xf3\xc3\x30\x46\xf2\x60\x9d\x07\xb2\x9b\x63\x39\x81\x36\x9c\xb2\xf0\xee\xcd"}, -{{0x2e,0x19,0xcd,0x44,0x2f,0x22,0xa4,0xa9,0x9d,0xff,0xc5,0x5e,0x7b,0xf6,0x25,0xf8,0x9d,0x13,0x44,0xb5,0x63,0xf6,0x78,0x53,0x13,0xa7,0xee,0xe9,0x73,0xb4,0xaa,0x36,},{0xee,0x3d,0xa7,0x6a,0x8f,0xcf,0x40,0x3a,0x29,0x58,0xd4,0x55,0x1d,0xa0,0xa7,0x2b,0x2e,0x73,0x85,0x22,0xb2,0xe6,0xb2,0x0f,0xba,0x6a,0xa2,0x6b,0x32,0x30,0x73,0x57,},{0x28,0x32,0x6b,0x5b,0x97,0x8e,0x0d,0xbd,0xab,0x5d,0xde,0x70,0x37,0x85,0xa6,0x67,0xa7,0xef,0x43,0x9d,0x81,0xea,0x47,0xe0,0x66,0xb0,0x89,0xd1,0x16,0xc2,0x5a,0x34,0xbb,0x63,0x3f,0x26,0x0d,0x55,0xf4,0x5b,0xdf,0x6b,0xcd,0xa7,0x48,0x03,0xd7,0x62,0x4b,0x19,0x27,0xce,0xc1,0x8e,0xb1,0x99,0x22,0x60,0xbe,0xef,0xc3,0x99,0xd9,0x0e,},"\x1b\xfc\x5c\x6a\xa6\xa5\x35\x4f\xbb\x86\x14\x69\x79\x63\x48\xac\x63\x19\x12\x4d\xa3\xf1\x0d\x20\xd5\x0b\xbd\xc7\x15\x9d\x41\xb5\xab\xb1\x36\xc7\x99\x6a\x77\x37\x97\x12\x2b\x52\x5e\x8e\x2d\xca\x19\x54\xf6\x39\x17\x07\x30\x1d\x90\xf2\x10\x1b\x46\xc7\xb0\x86\xef\xa1\x58\x77\xca\xdc\xd0\x58\x12\xdb\x34\xb9\x96\xcb\x4f\x53\x1a\xbc\xd1\xe9\x8d\xb0\x8a\x5c\xf1\x36\x8e\x8f\x4b\x11\x09\x14\x2e\x95\x62\xbd\x00\x85\xff\xae\x5e\x66\x0f\x59\xc9\x30\x79\x3e\xbd\xb6\xe8\x0b\x0a\x2f\x4f\x3f\x59\xbf\x9d\x39\x5c\x48\xd2\x6e\x0a\x72\xa6\x0f\x9d\x1f\xf8\x7f\xd2\xd7\xa3\xf5\x38\x3a\xa9\x02\xad\xed\xed\xeb\xc6\xcd\x1b\xef\xd0\x38\x33\x61\x62\x74\x9d\x91\xa9\x57\xca\x2e\x3d\xd4\x70\x91\xc5\x59\x31\x13\xda\x87\xc3\xd6\x6a\x02\xc8\x0a\x6e\xdd\xb5\x35\xc4\x8c\xa1\xf3\x4a\x97\xfd\x1c\x95\xeb\xc2\xe5\x70\xfc\x8f\xaf\xe6\xe5\xd6\x54\x6d\x1f\x3a\x9b\xa8\xda\xac\x33\x4c\xf4\x7b\xf1\x17\xe1\x28\x0d\x0e\xbd\xf1\x4b\x0f\xcd\xbb\x43\xb8\xd2\x48\xcc\x6b\x61\x32\x0f\xdb\x04\x49\xed\x5f\x5d\xe8\xba\xb1\x21\xaf\x0d\x85\x54\x95\x6e\x6a\x12\x01\x6b\x42\x67\x7b\x44\x36\x78\x92\xc3\xb2\x0a\xfc\xc2\xcb\x9c\xfb\x5b\x10\x0a\x95\xb5\x1e\x8b\x07\xda\x9f\x51\x41\x5f\x4c\xd7\x78\x1a\x31\x37\x65\xe2\x0d\xb2\x7f\x23\x43\xe0\xf7\x19\xec\xea\x9a\xf0\x26\x95\x6f\x33\x87\xe9\xea\x7e\xd0\xa2\x93\x75\x9b\x4a\x26\x22\x02\x80\x7b\x41\x30\x9f\xb8\x0f\x50\x18\x5d\xb6\xa5\xf8\xbd\xca\x17\x88\x41\xbe\xc0\x6a\xdd\xc7\x61\x0d\xf7\x60\x17\xb5\x14\xbc\x41\x42\xf2\x6a\x36\xbf\x5b\xac\xec\xb0\x12\xfa\x41\x71\x0d\xd8\x49\xbe\xf7\xa7\xe4\x51\x43\x28\x36\xfe\x9b\x32\x65\xfd\x5b\x59\xee\x40\xb0\x4d\xad\x85\xcf\x48\xf8\x91\x46\x5a\x84\x2c\xd4\x50\x0a\x10\x24\xee\xfd\xf0\xf5\x54\xf0\xca\x17\xec\x9f\x7b\x71\x52\x56\xa9\xb9\xdb\xe2\x79\x66\x38\x6d\x8a\xc3\x7d\x3c\x51\x58\x96\xde\x0f\x7c\xdf\x7c\xf5\xb3\x20\xff\x7a\x8e\xf6\xb3\x4b\xa8\x20\xab\xa9\x06\x6d\xd2\x53\xc5\xb7\x76\x37\x77\xf9\x4b\x2d\x6a\xd8\xc7\x10\x22\x1e\x11\x37\x53\x5d\xff\x8a\x1b\x75\x65\xec\x81\xbd\x8d\xde\xb5\x02\xe3\xd5\x8f\xf8\xf1\xfe\x6e\x86\xb8\xdc\x15\xa3\xaa\xec\x68\x8b\xbb\xec\xd4\x68\x82\x81\xdb\x0f\x81\x8d\xe0\xf7\x26\x1b\xa9\xcc\x58\xc8\xbc\x0d\x02\xe0\x66\x32\xef\xe7\x28\x7a\xd7\xa8\x43\x31\xa8\x24\xd9\x28\x73\x44\xef\xaa\xa7\x4f\x1f\xc5\x76\xd0\x26\x94\x30\xf8\x56\xa8\x56\x52\x65\xb9\xd6\xef\x71\xfe\x13\x4d\x25\x10\xab\x06\xb6\x0b\xf3\xc1\x53\xb5\x7e\xcf\xd2\xe6\x34\x24\x03\xfe\x67\x8b\x58\x86\xb6\xb7\x34\xb7\xd3\x69\x06\x62\xb6\xc8\xc6\xf6\xe2\x50\xe5\xaf\x6a\x81\x83\x16\x6d\xdc\xd0\xa1\x7f\x0c\xdd\xc8\x63\x6e\xf1\xa6\x84\x98\xbe\x50\xb6\x59\x95\x39\xd4\x6b\x4c\xea\x97\x13\x0e\x08\xf9\x4c\xa5\x3e\x88\x46\x44\xed\xa7\x5d\x23\xcd\x2c\x03\x8a\x5f\x17\xb5\x91\xe2\x13\x69\x37\x8c\xd3\xfb\x57\x62\xd1\xa7\xc3\xe6\x6a\x11\xae\x6e\x91\xcb\xae\x61\x6a\xd0\x55\xe3\x9d\xc4\x1e\x15\x4f\x4f\xce\xd7\xb2\x69\x6d\x9d\xc6\x73\x80\xbb\x8e\xef\x47\x4e\x9a\xa8\x3c\xec\x47\xfa\xfa\xfb\x94\x1d\x62\x65\x64\xb2\x07\x5b\xcc\x08\x56\xda\x8d\x6e\x1b\x0b\x8f\x18\xba\xf7\x51\x3b\xbd\x14\xe4\x91\xed\x51\x79\x68\xc4\xf7\x24\x1a\xf2\x50\x98\xee\x8d\xf1\x30\xb7\xa3\x4d\x59\x73\x6d\x78\x36\xd3\x23\xfe\x3f\x43\xf5\x08\xcd\xcb\x75\x58\x95\xf5\x9a\x00\xc8\x04\xed\x16\x4c\xc3\x39\x92\xf3\xae\xe9\x62\xae\x9e\x99\x0b\x74\x27\x2e\xb9\x87\xb1\x2d\x90\xb2\x73\x14\xd5\x74\x00\xe7\x37\xd1\x34\x3e\x97\x09\x85\xc4\x27\x10\x60\x87\x6a\xbc\xd7\x04\x9e\x7c\x9f\xe2\x44\xff\x3e\xf9\x85\x60\x99\x5b\x74\x82\xd3\x1b\xc7\xc0\x9d\x99\x69\xf7\xcd\x41\xf4\xe4\xe2\x52\x75\x0d\xc1\x6c\xcd\xb2\x9b\x98\x53\x14\xa0\xb6\xe7\x49\xc9\x5f\x9b\xd2\x83\x8d\x5a\xc4\x9e\xe0\x31\xfd\x07\x9b\xec\x30\x28\xdd\x9d\xd0\x7d\xb6\xfa\x62\x2a\xd6\x21\xb3\xb1\xe1\x27\xe8\xfc\xa3\x7b\xd1\x46\xe3\xcf\x70\x3e\x91\x17\x01\xb7\xa1\x6c\x2d\x30\x36\x9c\x94\x64\x8e\xcc\x03\xdf\x10\xd7\xdd\x5c\x05\x58\xfa\x95\x93\x42\x5d\x94\x87\x27\xd6\x86\x0c\x3a\x14\xf8\x11\x24\x51\x06\x61\x6d\x2a\x5f\xa9\x81\xc6\xb7\xf4\x7e\xc9\xde\xf6\x54\x12\xd1\x32\xac\xc6\x91\x9d\xa4\xe8\x85\x97\xaa\x91\x90\xca\x61\x4b\x21\x80\x66\xa0\xf7\xb1\x69\x97\xee\x74\x7c\x5a\x09\x78\x5e\x50\xd0\xa8\x91\xd9\x59\x37\x86\x3d\x61\x3c\xef\xf7"}, -{{0x82,0x10,0x90,0x99,0xd1,0xea,0xfe,0xed,0x5a,0x85,0x20,0x60,0x46,0x49,0x1b,0x34,0xd0,0x6d,0xcd,0xe3,0x3f,0x08,0x09,0x60,0x28,0x7b,0x10,0xfb,0x23,0xff,0x9f,0x78,},{0x08,0x1c,0xfd,0xf2,0xd7,0x58,0x65,0x4c,0x41,0xc4,0x47,0xe1,0xe6,0x27,0x38,0x10,0xf8,0xa7,0x38,0xa7,0x33,0xaf,0xc4,0x22,0x94,0xa2,0xb1,0xbb,0xb7,0x69,0xef,0xce,},{0xb3,0x98,0x7f,0x32,0x4b,0xc7,0xe7,0x76,0xc0,0xf2,0x87,0xfa,0x13,0xad,0x28,0x74,0x16,0x95,0xe2,0xe7,0xbc,0xe8,0xd1,0x43,0xe2,0x9f,0xad,0x5d,0x00,0x99,0x47,0x58,0xe2,0x25,0xfb,0x80,0x21,0x00,0xd2,0x3f,0xd6,0xcc,0xaf,0xee,0x8e,0x0a,0x95,0xbc,0x47,0x9b,0xe8,0xc2,0x3a,0x11,0x31,0x97,0x45,0x76,0x5b,0x7c,0xd4,0x7e,0x70,0x06,},"\x84\xf4\x7d\xd7\x94\x97\x7a\x6c\x15\x05\xac\x8c\x05\x68\x0c\x56\x15\xa2\xd5\xb0\x57\xe3\x9b\x04\xf8\x5e\x3f\x9f\xf0\x49\x60\xe0\xe0\x16\x68\x5a\x86\xee\xbc\xec\xf6\xfb\xce\x5f\xdd\xcd\xac\x1a\x47\x4c\x8a\x0d\x50\x2c\x40\xe1\x0f\x94\x86\x46\xfd\xac\x6c\x81\xf1\xff\xbb\x17\x7a\x2a\x49\x63\xb6\x78\x25\x90\x3c\xde\x65\xb5\xdb\xe0\xd8\x94\x1d\x54\x6c\xff\xa2\xbf\x8a\x8c\xa8\xd6\xc6\x40\x85\x30\xa6\x29\x0f\x5d\x08\x82\xf1\xa1\x67\x2d\xbf\x97\x8e\x10\xc5\xc8\xaf\x5e\x0a\x62\x39\xf0\x65\x5e\xe7\xfd\x9e\x66\x96\x30\x77\xa0\xe8\x47\x13\x73\x97\xd1\xf0\x69\x99\xdc\x6f\x8a\x94\x5c\x60\x03\xea\x4e\xa7\xfd\x58\x37\x8a\xcb\x44\xed\x57\x80\xea\xa3\x67\x79\x6b\xee\xa3\x7d\xdc\x23\x69\x99\xd0\x12\xd6\xa7\x16\xd7\x91\x56\x49\xcc\x28\xe5\x88\x75\x64\x7e\x9f\x5a\xc0\x55\x3c\x0f\x54\x4d\xf5\x64\x69\xc6\x70\x81\xd5\xe3\x03\x95\xf3\xe9\x60\xe6\xa5\x2f\x08\x33\x19\x2c\x54\x8c\xd5\x7c\x92\x6b\x82\xdb\x48\xc3\x61\xbd\xe7\x03\x33\xa3\x70\x08\x3e\xaa\xa0\x68\xdc\x2a\xe4\x52\xd2\x1e\xf1\x33\x1a\xed\x19\x0b\xd3\xe1\x28\x9a\x10\x4c\xf6\x67\x83\x43\x77\xcf\x7b\x5a\x29\x77\x48\x07\xc3\xf1\xea\x9e\x7b\x28\x83\x1d\x0f\x6c\x42\x94\x78\x58\x67\xb1\x37\xb6\x50\x28\xc1\x4f\x93\x2a\x1b\xa8\xe6\xf9\xf5\x96\x24\xfe\x0c\x39\x68\x43\xea\x19\xe4\x6f\xba\x09\x14\x2c\xf9\xd4\x24\x97\x31\x2f\x36\x02\x44\x03\x2f\x1e\x00\xf3\x8d\xd0\xde\x29\xf9\x63\xb5\xcc\xc1\xef\x12\xb2\xcc\x62\x04\xb9\x94\xaf\x1f\x3b\xaf\x19\x6d\x9e\x21\xe8\xfa\x4f\x09\x73\x20\xc6\x44\x04\xd0\xb7\xd5\xab\x38\x56\x0c\xa0\x65\x53\x64\xb0\xb0\x9c\xd6\xdc\x0f\x0e\x05\xb8\xc9\x11\x03\x64\xf1\x42\x4a\x96\x72\xb7\xef\xdf\x7e\x1f\x37\x8e\x23\x45\x50\x56\x6d\xbe\x13\xb0\x15\x78\xb0\x41\x53\xe9\xc3\x7b\x55\x3e\x32\xa4\x44\x1b\xc9\x7e\x29\x53\xbe\xc2\xe4\x14\x55\x51\x0f\x98\x02\xef\x94\x8d\xcb\xf1\x3f\xad\xdd\x72\x2e\xde\x57\x36\x27\xb2\x58\xd5\x5e\x83\xc0\x89\x5b\x22\x91\x9e\x4b\xe5\xce\x8d\x81\x9c\xe6\xad\x84\x3b\x2d\xd0\x9d\xf6\x40\x04\xc8\x26\xc1\xdd\xe7\xce\x64\x80\xa2\x71\xa8\x58\xa1\xdb\x16\x9e\x14\x94\xd4\x46\x90\x32\xbc\xc1\xcc\xd8\x96\x53\x19\x8b\x7c\x07\x3f\x76\xa2\x6a\x29\x99\xb5\x64\x8c\xba\xdc\x15\x74\xc7\x8e\xad\x8e\xec\xe8\x3b\x91\xe1\x29\xc4\x37\xf9\xee\xec\x04\xc8\x07\x45\x90\x02\xe6\x6d\xcc\xa9\xbf\xc2\xca\xed\x9e\x6c\x0b\xa2\x3d\x23\x55\xde\xf7\x56\x65\x74\x94\x30\xee\x92\xc5\x32\xa6\x95\x47\x9f\xec\x92\x91\x74\xf4\x40\xec\xb6\x1a\x5a\xe8\xb2\xb7\xe9\x58\x92\x05\x58\x26\x89\x78\xf7\xfb\x4d\xa1\xb3\x8b\x12\x01\x4f\x5d\x61\xb0\xfd\xd7\xf6\x13\x6b\xa4\x28\x1b\x41\xa3\xa3\xcd\x18\x80\x52\xb6\x98\x76\x5b\x6f\x05\xe4\x1e\x78\x37\x3e\xa8\x30\x46\x97\x87\xa3\x75\x10\x99\x3d\x12\xf9\x3e\x96\xc7\x2d\x72\xf4\x46\x19\x84\xf6\x91\xa4\x1c\x7d\x33\x97\xdd\xd5\xa1\xb3\x92\x37\xd1\x30\x88\x64\xd4\x15\xfc\x6c\x22\xb6\x3f\x37\x6c\xed\xde\x37\xf5\x25\x2b\x51\xec\x72\xe5\x15\x5f\x3b\xdb\x4f\xcd\x54\x12\x49\x8b\xd2\xe0\xc1\xf9\x85\x0b\x3a\x85\xd1\xdf\xd2\x51\x67\xa3\xcd\x77\x1e\x8e\x4c\x9d\x86\x8c\x95\xa7\x17\x5e\x37\x75\xf6\xce\xf1\x7e\x4e\x36\x49\x7c\xe9\xe4\x55\x32\xbd\x7f\x44\xb2\x77\x6e\x40\xf9\x1a\x07\xca\x4f\xa1\xb9\x5d\xbe\x81\xcf\x8f\x49\xe4\x6b\x6c\x82\xa6\xee\x43\x47\x91\x8a\x76\x43\xb0\xd9\xa3\x88\x57\x21\x2c\x69\x3e\xad\xac\xfd\x37\xa5\xf1\xd9\x15\x58\xf5\x45\x4d\xcd\xd0\x59\x35\xf2\x90\xe6\x2d\x7e\x65\x00\x6c\xd5\x49\xf6\x55\x3c\xe7\x41\xdf\x44\xd3\x96\x44\x00\x1e\xb4\x79\xca\x69\x56\x8a\xd1\xf2\x3b\xba\x09\x9a\x41\xa4\x72\x94\xdb\x93\x87\x31\xc5\x30\xaf\x1c\xeb\x92\x17\xd2\x9b\xc2\x70\x56\x13\xc1\xa1\xfe\x9c\x20\x8d\x0b\x01\xba\x6f\x4d\x9b\x4c\x7b\xa8\xf0\x21\xdf\x91\xea\x2d\x57\x8c\xe0\x83\x12\x3e\x83\xba\x4b\x9c\x50\x40\x7f\x66\x66\xfb\xe6\x11\x58\xb0\xd1\xb9\x57\x77\x72\xe3\xea\xff\x8f\xb4\x29\xd0\xf6\xd2\xe3\x84\x12\x61\x30\xf2\x1b\x44\x9f\xb1\xdc\x17\x0d\xb4\x5a\xf5\x05\xbd\x31\x82\x67\x8a\x9b\x5f\x9f\xdf\xf6\x5f\x04\x13\xb6\x72\xc4\x78\x63\x40\xfc\xf2\x52\x2e\xa7\xf3\xd8\xad\xe8\xa0\x59\x52\x96\x49\xdb\xda\x9c\xe5\x1f\xf0\x5a\x2a\x2a\x3d\x66\xd2\x16\x6b\xf2\xc9\xc6\x77\x2b\xa0\xef\x41\x05\xe6\x8c\x05\x5e\x02\x13\xd4\x2c\x1e\xe1\x23\xb3\xc1\x21\x78\x43\xe6\xec\x57\x5d\x75\x4d\xf3\xc9\x0a\x75"}, -{{0x65,0xfc,0xbd,0x62,0x6d,0x00,0x21,0x11,0x33,0x4b,0xaa,0xd4,0xe6,0xa8,0x00,0x6e,0x47,0xa1,0xf9,0x13,0x97,0xbe,0xe6,0xdd,0x6c,0xd7,0xda,0x5a,0x0e,0x02,0x48,0xa4,},{0x20,0x40,0x9a,0x14,0x6b,0x42,0xc9,0x6b,0xea,0xb0,0xb4,0x2e,0xa7,0xf2,0xc2,0x51,0x93,0x11,0x9d,0x0d,0xf4,0x4d,0xc2,0xbf,0x14,0xd1,0x1a,0x32,0xfd,0x73,0x36,0x15,},{0xbc,0x78,0xe1,0x6b,0xa6,0x74,0xe0,0xa7,0xdb,0xa5,0x7a,0x19,0x09,0x4f,0x97,0x33,0xc5,0x5d,0x74,0xb9,0xd1,0x5f,0x8a,0x44,0xd1,0xbb,0xc0,0xa0,0x23,0xf7,0x01,0x55,0xde,0x29,0x77,0x11,0x1a,0x41,0x7e,0xef,0xa8,0xcb,0x30,0xec,0x12,0xab,0xc8,0x38,0x42,0x28,0x16,0x7c,0x70,0x98,0x2a,0x82,0x06,0xb1,0xff,0xb7,0x21,0x74,0xaf,0x01,},"\xe4\xc0\x94\x7f\xc8\xca\x78\xfa\x88\x63\xf4\xd0\x44\x49\x9d\x03\x6e\x2e\x7e\xf8\xc1\x7e\x83\x8f\x2f\xac\x02\x67\x5b\x7b\x53\x81\xe5\xf9\xab\xce\xaf\xd0\xd8\x88\x6a\x92\x9d\x9d\x9b\x49\xfc\xb7\x38\x61\xb2\x9d\x15\x18\xac\x5f\x83\xf7\xf8\xfc\x26\xbd\x1c\xeb\xc2\x2d\x87\x3a\x9a\x08\x23\x14\x06\xfb\x03\x2e\x48\x66\xe5\xf5\x5c\x7c\x04\x41\xc5\x19\x04\x1b\xb2\xcc\x73\xf9\x22\x6d\xd5\xd0\x7e\xce\xb6\x60\xd6\xc9\x67\xdb\x23\x36\x55\x74\xbe\xe8\xfc\x10\x22\x29\x28\x76\x77\x13\x57\x1a\x71\xc9\x3a\x85\x27\x8d\x42\x29\x9a\x70\x59\x9c\xa9\x93\x26\xcc\x86\xf6\xd9\x8d\xaa\xc0\x00\xfd\xfa\x71\x05\x62\xf4\x81\xfa\xa0\x20\xc7\x2a\x76\xe2\x06\x7d\x15\x4c\x23\x5a\x7a\x4f\x29\x70\x8c\xc5\x44\x53\x3b\xd7\x99\xed\x63\x63\xeb\x3b\x56\xaa\x4a\x6d\x0e\x37\x9b\xbf\x07\x60\x05\x95\xc2\x3a\xb1\xf3\xf9\xf1\x70\x8e\x00\x70\x26\x1b\xbb\xf4\xbf\xea\xf6\xd6\xce\xd4\xd7\xff\x72\x2c\x9c\xc5\x2d\x91\x33\xea\x68\xd4\x95\xdc\x94\x89\xc3\xed\xf6\x83\x02\x31\x35\x1f\x65\xcb\x52\x72\xf5\x39\x6e\x2c\x4a\x1a\x5c\x88\x66\x1a\x10\x18\x92\x24\x9e\x23\xd6\xce\x9f\xdb\x6a\x9a\xbf\x74\x27\x2c\x2f\x59\xc3\xd8\xfd\x87\x43\xcc\xe4\x61\x12\x6c\xa0\xa8\xb8\x32\xb4\xb2\x18\x33\x6b\x1a\xe1\x4d\xa6\x77\xba\x7f\x1b\x2c\xc5\xca\x3c\x71\x58\xf7\x27\xa9\xe1\xb8\xfd\xd9\xed\xf5\xc2\x18\x7f\xcb\x83\xdb\x86\x2a\xd0\xc6\xb3\x92\x16\xde\x31\x16\x91\x95\x56\x46\x51\x00\xad\xe0\xa4\x2b\xd6\xba\x10\xd9\x54\x18\xb6\x9a\x3e\x00\x5e\x9f\x10\x45\x89\xea\x59\x48\xb2\xb5\x1b\xc7\xb1\xa9\xa0\x74\x9d\xa8\xf0\x13\x78\x1b\xc0\x5c\x80\x5b\xb5\x1e\x18\x77\x61\xac\x24\xc7\x64\x14\xf6\x68\xeb\x45\xfb\x0a\x50\x24\xdf\xe5\xa5\xca\x06\xf0\x40\x3a\x02\xe3\xb2\xfe\xf7\xa2\xc4\xbc\xfb\x1d\x07\x5d\x31\x0d\x51\x97\xe6\x59\xcd\x14\x02\x3f\xae\xc2\x0e\x04\x5c\xab\xcb\x86\xb2\x21\xa1\xd4\x82\x71\x13\xff\x32\x67\xa6\x4d\xeb\xe9\x93\x90\x04\xca\xba\xc8\x5e\x5c\x74\x61\xe7\xe8\x2a\x97\x5a\xcf\xae\x0b\x6c\x51\x6a\x1c\x60\x53\x74\xcf\xea\x7d\x81\x90\x44\xef\xd6\xd7\x46\x54\x42\x4f\xd5\xc9\x0f\xf2\x57\x4f\xcd\x8e\x00\x77\x40\xd9\x75\x86\x1d\x0d\xf5\x25\x9f\xe4\x3e\x43\x63\x9e\x36\xe5\x28\x95\x43\x9b\xa2\xc2\x7c\x1e\x88\x9c\x93\x09\x41\x04\xfe\x91\x49\x21\xbd\x6f\x25\xd3\x98\x5a\xb1\xf2\x2c\xa5\x57\xb0\xe4\x9a\xfc\x73\x75\x24\x3c\x52\x1c\x6d\x5f\xaf\xe0\x38\x1c\xce\xa8\x28\xe8\x8e\x64\x7f\xd9\x09\x76\xb3\xfb\xec\x19\xfe\x9a\xdb\x11\x3c\x64\x04\xbd\x35\x2b\xfc\x00\x04\x46\xd2\x10\x05\xb5\xf9\x50\xae\x07\xe5\x1c\x76\x8c\xa3\xff\x61\x77\xb2\xea\xc5\x0f\x10\xdd\x2e\x64\x61\x0f\xa8\xab\x57\x88\xfa\xee\xe2\x9d\x12\x90\x09\xd7\xfe\x46\xaa\x3d\xa6\xb9\xd8\x6c\x73\x06\x5e\xb5\x16\x1f\xbd\xbd\xfa\xc5\x77\x7c\x4e\x75\x45\x2e\x6e\x16\xae\x9f\xd6\x6b\xb7\xd9\xaa\xa4\x26\xbc\xb7\xa6\x91\x5f\x0f\xf4\x4a\x1f\x8e\xc7\x13\x94\xe9\x35\x2f\xdf\x20\xe0\x2f\xaf\xe1\xe0\xce\xfe\x50\x74\x4c\x31\x94\x95\x6f\x92\x8f\x82\x53\x37\x55\x37\x38\x38\xdc\xc1\x29\x6a\x89\x1a\xdf\x64\x1c\x73\x82\xd6\x9b\x4f\x5a\x43\xd4\xaf\x77\x72\xa4\xa1\xee\x87\x92\x92\xd7\xa4\xf3\x2a\xc3\x5e\xe1\x21\xc6\xc3\x4c\xa5\xf9\x84\x87\xa9\x41\xfc\xb1\xe6\x5b\x44\xd4\x45\x61\x27\xee\xdb\x2f\xcc\x1c\x3f\x48\xef\xf9\x30\x09\x81\xe5\x2a\xc3\x8b\x49\x6a\xb8\xbb\xce\x14\x4a\x85\xeb\x9c\x07\x63\x8b\x31\xfd\xaa\x78\x17\x44\xbc\xe1\x7e\x8d\x93\xdc\xdc\x60\xaf\xed\xa4\x88\x80\x76\x17\xf8\x8d\x6a\xa5\x44\x22\xfd\x34\x7d\xda\xdd\xef\xf3\x7a\x56\x3d\xbf\x19\x97\x4b\x2a\x23\xbe\x30\x0f\xbf\xa6\xc7\xfc\x41\xf8\x4c\x69\x05\x41\x52\x69\xf1\x95\x99\x0b\x5b\x4d\xe1\x26\x68\xc7\x1c\x87\xb5\x04\xf4\x11\x24\xbf\x94\x43\x6f\x33\x30\x45\x63\x15\x18\x15\x2c\x51\x62\xa2\x47\x5c\x40\xef\xb6\xcb\xda\xaf\x9a\xf4\x28\xfe\xd3\x25\xb3\xa7\xd9\x4c\x17\x52\x0f\xd8\x9e\x00\xdd\xf0\x8b\x22\xad\xf6\x61\xf0\xac\xd7\x23\xb3\x96\x9d\xc6\x43\x4e\xa6\xf9\x2e\xf5\x8e\x8d\xfa\xe5\xb0\xcc\x28\x85\xba\x98\x7e\xa1\xd1\x6c\x39\xb3\x4e\xf6\x50\x23\x00\x9d\x63\x45\xe4\x8e\x36\x91\xa4\x1f\x02\xa7\x7b\x7f\xe1\x33\xea\x9d\xe7\x56\x5f\x15\x7a\x20\x78\xae\x98\x8b\xbb\x26\x6d\x22\xd5\xfa\x91\xa7\xb2\x63\xe9\x8a\xd2\xdc\x07\x31\xfe\x5a\x29\x02\x5a\x0c\xb4\x36\x86\x4a\x5a\x60\xdb\x25\x7f\x1e\x76\xb5\xc6\x08\xf2\x5c\xde\xcc\x87\xea\xe6"}, -{{0xb5,0x00,0x76,0x8a,0x28,0x23,0x91,0x5c,0x4a,0x68,0x48,0xd3,0x5f,0x64,0x87,0xd4,0x3b,0xd7,0x66,0xd2,0xce,0x09,0x45,0xf8,0xa3,0xcc,0xdb,0x8d,0x82,0xa3,0x89,0x2b,},{0xb8,0xce,0xa2,0x15,0xa0,0x12,0x4e,0xed,0x27,0x00,0x57,0x25,0xd8,0x97,0x78,0x1e,0xa0,0x64,0xdc,0xef,0xb2,0x14,0x22,0xc8,0xbd,0x24,0x02,0xc5,0x6a,0x10,0x57,0x1c,},{0xe3,0xdb,0x47,0xa1,0x1e,0x10,0xe7,0x88,0x92,0x5d,0x14,0xb1,0xe2,0x8b,0x54,0xc9,0xfc,0xf9,0xb6,0xac,0xc1,0xdf,0x8c,0x14,0xf6,0x83,0xa5,0x67,0x2f,0xd5,0x04,0xdd,0x4a,0x47,0x5a,0x33,0x93,0xb3,0xef,0x8b,0xce,0xac,0x23,0x61,0xdb,0xba,0x35,0x30,0xaf,0x25,0xc2,0x46,0xc3,0xec,0x4c,0x05,0x89,0x9b,0x51,0x7f,0x6c,0xd3,0x4f,0x0a,},"\x0a\x9f\xda\x8b\x8c\xfc\xa7\xa5\xb0\x5d\x78\x11\x6f\xce\xe1\x9a\xb8\x03\xc1\xc6\x01\x0c\xe1\x1d\xaa\x8e\x93\xa6\x6d\x12\xc1\x2e\x47\x4e\xb9\x1c\x26\x40\xd9\x7a\x81\x3d\x9a\x83\x0d\x26\x88\x68\xeb\x2e\x37\x70\x42\x5f\x10\xc7\x58\x40\x46\x8e\x66\x9d\xc7\xf6\x1d\x3b\xe2\xde\x88\xae\x0e\x54\x2b\xc8\x09\x67\x91\x13\x95\x7a\x14\xda\x4e\xaf\xf5\x49\xbf\xde\x63\x7d\x7c\xaf\xdc\x6a\xa8\x39\x94\x83\x73\x97\xf8\x6e\x4f\xde\x86\xd4\x02\xfa\x9a\xef\x7f\x65\x54\x9a\x21\x43\x73\xe5\x60\xe6\xd7\xa1\xc2\x76\x9e\x0c\x7d\x5a\x01\x71\xe7\xcc\x00\xdf\xf3\x6e\x04\x29\x79\x8b\x53\xaa\x62\x16\x24\xbd\xa7\x4d\x6d\xf0\xbf\xff\xfb\xd8\xfd\x7b\xef\x1a\x64\xf3\x6c\x00\x07\x82\xf6\xed\x03\x1a\xf5\xc2\xa7\x4a\x18\x96\x35\x98\xc9\xba\x06\x23\x92\xde\x96\x02\x03\x67\x94\xb7\xb5\xe6\x8c\x25\xc9\x3f\xe7\xcf\xad\x47\xa7\xc5\xb9\x79\xd4\x76\xcd\x51\x3a\x12\xbf\x03\x07\xcb\x16\x31\x74\x00\x42\xa9\xfb\xf3\xeb\x0b\xe5\x17\x06\x20\xda\xfd\x5f\x16\xed\x89\x34\x2c\x26\x25\xd7\x83\xe7\x4e\xe0\xd7\x84\xbf\x05\x19\x43\x74\x0c\x88\xb0\xbe\xf7\xbc\x85\xe1\xa6\xa4\xa5\x17\xd4\x92\xfb\x73\x7e\x77\x66\x99\x59\x0c\x93\x22\x4c\xd4\xd9\x24\x5d\x4e\x93\x71\xa3\x67\xc0\x71\x2f\x87\x49\x0f\x92\x47\xc4\x9a\xdd\x93\x13\xf2\x77\xa4\xd9\xf2\x6b\x75\xaa\xe4\xde\xd6\xa3\xde\xf8\x5f\x83\xfc\x99\x59\x10\x40\x55\x48\xaf\x67\x0e\xd8\xaa\xa3\x05\x24\xab\x82\x9c\xcb\x56\xa5\x00\x5b\x58\xbc\xe8\x68\xc9\xe8\x07\x4f\x07\xdd\x7f\x38\x18\xf2\x99\xe4\xe0\x86\xbe\xd9\xea\xb9\x02\xcf\x11\xb3\x98\xd5\x31\xb8\x63\x2e\x7d\x52\x3a\x8f\x87\x76\x95\xf4\x6c\xcf\x9c\xe2\x4e\x62\xca\xb2\xc7\xcd\x0a\xae\xe1\x7d\xb5\x26\x76\xa4\xb5\x05\x8e\x9c\x1d\x7c\x47\xbf\xfc\xb6\x41\xb0\xea\x2b\x09\x44\xf3\x9a\x75\x66\x5a\x7e\xf2\x9b\x7f\x02\xa8\x78\xdb\x82\x38\x83\xbd\xac\xfb\x0f\xbe\x5d\xfe\x5a\x9b\xed\x9f\xda\xc7\xe4\x14\x2e\x3e\xb5\x0d\x5e\x84\x0b\xd0\xac\x0b\xec\xf4\xfa\x97\xe1\xfc\x48\x27\xc3\x97\xa5\x24\x65\xd9\x16\x88\x99\x54\xb3\x70\x1b\x0f\xac\x61\x15\x9b\x23\x09\x2f\x46\x85\xf4\x78\x8b\xad\x35\xd0\x0d\xa2\x67\x9e\xcc\x54\x92\x1f\x1a\x86\x47\x10\x16\x57\xab\x49\x47\x74\x20\x56\x7a\xed\x67\xc8\x60\x59\x30\x44\x4b\x5d\x07\x92\x7c\x17\xef\xf1\xf8\x57\x0c\xf2\xaf\x29\xe7\x19\xf8\x5c\xa7\x84\x9b\x89\x55\x49\xf1\x3d\xfe\xca\x68\xbb\xef\x71\xe3\xce\x8b\x6c\xed\xd2\xff\x68\xd3\x2b\x02\xca\xf5\x95\x1a\x0b\x3e\x6b\x0b\xae\x6a\x96\xc0\x20\x58\x19\x1f\x30\x5e\x09\x07\x11\xc4\x6d\xad\xdc\xd5\xae\xee\x76\x9c\x3a\x10\x5e\x9a\x82\x7b\xbd\x19\x5d\x32\x92\x31\xc2\x62\x38\x47\x9a\x9b\xb0\x07\x1a\xfb\x16\x0e\xf9\x55\xe8\x74\xd7\xa4\x20\xc5\x67\x85\xf4\x4a\xe0\xa1\x8c\x52\xd8\x28\x0c\x59\x98\xcf\x38\x88\xfe\xaf\x89\x89\x81\x34\xbc\x8d\x41\x1f\xc9\xf6\xc5\x76\x8e\xa7\xa2\x49\x72\x94\x13\x73\x9e\x53\x2b\x64\x39\x37\x15\x2c\xdf\xb8\xd2\xff\x87\xfd\x48\x08\x4d\xd8\xae\xeb\xea\xf0\xf7\xb1\x0d\x87\xb6\xe4\x42\x32\x28\xc9\xfc\x8d\xc5\xe3\x85\x2a\xa8\xb8\xac\xc5\x45\xd1\x8f\x25\xc5\x5d\x73\xda\x1b\xb8\x2e\x3e\xb3\x76\xf9\xef\x05\xb2\x74\xd7\xec\xb1\x84\x5d\x65\xca\x0c\xd2\x62\x9f\x03\x8a\x2d\x66\x4d\x7a\x69\x78\x1c\x84\xe9\x8d\xe2\xc2\x09\xc4\x6e\xfc\x51\x16\x21\x72\x85\x66\x49\x46\x9e\x67\x33\x08\xdc\xc1\x45\xea\xf7\x83\xf5\xcb\x5b\x4b\xe7\xd9\xfd\x58\xee\x09\x74\xc9\x81\xa3\x8f\xea\x8e\x31\x26\x7a\xbf\xa4\x10\xe6\x9e\x46\x48\x2f\x51\x34\xf3\xda\x1f\xfe\x38\x1b\xd6\x9d\x8d\x0b\x78\xea\x90\x9b\x4a\xf9\x39\x6d\xca\xff\x89\x96\x0a\x04\x9e\xda\x69\x46\x61\x6f\xc2\x7c\xcf\x9a\x9e\x5b\xa1\xa0\x13\x57\x64\xf3\x77\x19\xda\x4d\x28\x07\x81\x85\xd0\x4d\x72\x41\x9c\x2c\x70\xf2\x90\xd9\x7e\x1f\x82\xb8\x79\xf7\x1b\x9e\x19\xd5\x04\xd3\x64\xcd\x3b\xa2\x2c\xf9\x05\x25\x0f\xd3\x7d\x58\xe5\xfe\x40\x20\x9f\x60\x72\xa0\x6d\x8b\x5b\xa7\x01\x96\x23\x05\x77\x87\x7e\xc4\x61\x53\x16\x7a\x7c\x7a\xea\x27\x0f\xa1\x09\x8a\xba\x9e\x3a\x74\xac\xb3\x6a\x11\xb0\x9b\xd0\x7a\x3b\x88\xea\x65\x4e\x26\x83\x65\x62\x5b\x58\x9b\x22\x06\xc7\x10\xd9\x60\xf4\x2e\xa4\x19\xb7\xe4\xe3\xda\x47\x59\xfc\xbc\xa5\x0e\x4b\xf4\xcc\x55\xcf\x88\xf7\x0b\x31\x80\xc8\x05\xa7\x04\x50\x86\xaf\xa0\x4c\x6b\xe2\x32\x23\xec\xae\x5f\x82\xc1\x46\xd5\x43\x11\xd1\x80\x7c\x2e\x4a\x53\xf9\xe0\xa4\x48\x2b\x4e\x1e"}, -{{0x9e,0xb5,0xc9,0xef,0x13,0x53,0x5f,0x80,0x81,0x09,0xf4,0xa4,0x3c,0xfa,0xd5,0x68,0x4f,0x80,0xda,0xf0,0x2e,0xed,0x54,0x10,0xac,0x0b,0x0a,0x09,0xa6,0x08,0x2d,0x69,},{0x36,0x7e,0xea,0x1e,0xcb,0x4e,0x5e,0xec,0xdf,0x7e,0x47,0x1b,0x90,0xbb,0x34,0xf9,0xb7,0x98,0x2c,0x8c,0xd6,0x6d,0x42,0x55,0x5c,0x24,0x0b,0x41,0xcd,0x87,0x39,0xdb,},{0x42,0x9c,0xe1,0xfe,0x84,0x6d,0x25,0x08,0x49,0xec,0xa7,0xd4,0x56,0xf8,0xc5,0x9f,0x86,0x75,0xb1,0xf4,0xc1,0x3f,0x2b,0xe4,0x16,0x88,0xdf,0xb8,0xca,0x2a,0x3b,0x24,0xae,0x29,0xd5,0xb6,0xbf,0x47,0x11,0x57,0xbc,0xb6,0xe2,0xec,0x9d,0x4a,0x26,0xb0,0x38,0xe6,0xec,0x28,0x58,0x4c,0xc2,0x3f,0x2a,0x03,0x55,0x6d,0xbb,0x37,0xe9,0x00,},"\x2d\x7c\xb0\x5e\x61\xdb\xae\x26\x25\x8e\x38\x61\xc6\x39\xef\x0e\x1d\x17\xfc\x71\x1a\x00\xf3\x35\xba\x3c\x02\x71\x37\xe0\x07\x08\xd7\x08\xc1\xff\x45\x7f\xf2\xc6\x51\x12\xf7\xdc\xd7\xd0\x2f\x24\xd5\x6f\x07\x21\x58\xea\x1c\x71\x83\x25\x50\xa5\x83\x66\xfd\x91\x97\x29\x6b\xbe\x61\xaa\x4d\x00\xde\x18\xa4\x53\xef\x91\x74\xfa\x81\x96\x83\x05\xc4\x1c\x34\x55\xf4\x2d\x44\x7a\x92\x34\xf0\x6e\x13\xbf\x8b\xca\xa1\xba\xbb\x11\x69\x5f\xaf\xdc\x08\xf7\xa5\x84\xb2\xea\x1f\x61\xe9\x38\x92\x60\xce\x73\x35\xa0\x7d\xe7\x2c\x89\x11\xa5\x8a\x31\x3f\x10\x88\xdc\xdf\x5c\x8d\x4c\x45\x6c\xba\x2d\xcb\x4f\x2d\x15\x6b\x49\x43\xb9\x5b\xd4\x93\xea\x4f\xe1\xa8\x2d\x4e\x3e\xa0\x2a\xa0\x29\x72\x40\x0b\x5e\xe1\x78\x42\x83\x2d\x59\x97\x9f\xc1\x79\xf8\x43\xc4\x4b\x03\xeb\x3c\x30\x24\x16\xd0\xcd\xaf\x11\xc4\xca\x8a\x66\xcc\xbb\x69\x97\x39\x5e\xdf\x6f\xca\x2e\xa0\x04\xcf\x34\x86\x97\x10\x04\xa4\x20\x42\xaf\x8e\xce\x00\x5b\x94\x46\x1d\x86\xdc\xde\x21\x2a\x2e\xb1\xbe\x3b\x91\x4c\x78\x3e\x48\xac\x1a\xd4\x6c\xac\xd7\x3e\x1e\xb4\x48\x36\x83\x22\xd2\x67\x8e\xfc\xb2\xab\xff\x52\x09\x3d\xb0\xf2\x59\xdc\xe5\xc1\xe1\x9a\x51\x28\x20\xf2\x35\xd6\xae\xaf\x0e\x1a\x72\x3c\x2c\x65\x0c\xff\x1e\xe3\xb6\xb4\xf4\xcc\x98\x9c\x0b\x7d\x6d\xe3\xcd\x7e\x6d\xaa\x39\xbb\x69\x07\x10\xdf\x00\xa7\x19\x4c\x17\x20\x1f\x0e\x81\xbe\x64\xb6\x73\x9e\x1c\x1e\x81\x76\xb7\xe1\x2a\x35\x34\x27\xc0\x67\xc1\x93\x14\xdb\x64\x2e\x5c\x76\x26\x6b\x64\x0e\xb1\xcc\x0c\x73\xf8\x4f\xc0\x22\x7e\x5a\x96\x06\x0d\x81\x40\x71\xcd\xe2\xfe\xd9\x44\x76\x7b\x74\x66\xf9\x00\x1d\xfc\x22\x36\x85\x42\x9b\xc4\xe5\xe4\x8f\x5c\x13\xa6\x3a\x4e\x0d\x82\x61\x33\xad\x92\x0d\x11\x77\x21\x45\xad\x6e\x13\xc9\x38\x97\x39\x8a\x8a\x40\x1f\x93\xdb\xd1\x03\x00\x5c\x7d\xae\x44\x38\x7f\x3e\x80\xb7\x93\x60\x7d\x05\xd2\xd8\xbc\x0d\x03\x51\xa3\xa4\x52\xb8\xce\x75\x9c\x1a\xd4\x8d\xf7\xb9\xba\x9e\x4a\x17\xdf\x61\xfd\xab\xb9\xb5\x77\xb5\xce\xc3\xe9\x46\x1f\xbb\x5e\x12\x81\x55\xa3\xc9\xc8\x9f\x8f\x6b\xeb\xb7\x32\x2a\x16\x67\x8e\x8e\xcb\x98\x95\x3d\x95\x83\x10\xdb\x1b\x06\x34\x48\xc3\x49\xf3\x6e\x16\x8f\xac\x48\x4c\xb3\xc0\xd4\xcb\x2c\x25\x1b\xd9\x2e\xf8\xe9\x26\x2b\x44\x09\x3d\x7e\x65\x0a\x7d\x3b\xed\x37\x91\xfa\x88\x10\x0f\xee\x6e\xf0\xd5\xe2\x3d\x1e\x9a\x80\x99\xcc\x03\x35\x20\x2a\x4f\x10\x6c\x24\x77\x7e\x98\xf8\x1d\x26\xef\xba\x15\xc9\xad\x15\x41\xe0\xad\xbf\x1d\x1d\x76\x07\x6b\x0d\xfd\x7b\x7d\x6c\x8b\x82\xf9\xc0\x93\x46\x8c\xd1\x96\x67\x2d\xc5\x47\x8e\x91\xce\x70\x1c\xdd\x7b\x68\xb3\x53\xc9\x71\x11\xf0\x42\x97\x60\x63\x57\x62\xf8\x68\x3a\xe9\x70\x56\x4b\xce\xba\x91\x20\x51\x76\x42\xe8\xb3\xa2\xba\xaa\x85\xc2\x5b\x54\xa9\x43\x76\x61\x84\x90\x4c\x72\xd9\x29\x63\x4e\xc5\xf0\xc2\x84\x73\x41\x5f\x12\x53\x89\x06\xc6\x78\xfc\xa4\xe6\x82\xdb\x48\x79\x75\x84\x92\x53\x7e\x78\x50\xb9\xbf\xef\x3e\xb9\x05\x3b\x43\x92\x0d\x81\x0e\x55\xbe\x96\x6a\xec\x68\xc9\xdd\x3b\x62\xcc\xf5\x7e\x81\x78\xcb\x5e\xf6\xd1\x6d\x17\x2a\x56\xdd\x92\x4f\x00\xf2\xd3\xb5\xe9\x3a\xaa\x92\xb2\x9f\xb8\x33\x6d\x73\xe2\x9e\x59\xd1\xc4\x7e\xa6\x23\x0c\xda\x1d\x5b\x03\xbb\xa5\xdf\xdb\x33\x1f\xeb\x19\x44\x3f\x12\x3d\x2a\x03\xff\x4f\x10\xec\xa1\x66\xc2\x99\x85\x88\xf1\xe5\x84\xed\x19\x4d\xd6\xf7\x3c\x8a\xca\x84\x66\x31\x90\x4d\x9f\xe4\xa9\x8b\x36\x78\x23\xe4\x6e\xdb\xa2\x88\x51\x29\x87\x9e\x92\x77\xe1\x50\xf0\x29\xb8\xfa\x7b\xd1\x1e\xab\x9c\xe1\x33\x67\x77\xc8\x0b\x56\xb3\xa1\xf0\x81\x1a\xdb\xca\x0f\x5b\x40\x25\xa5\x50\x3c\x81\x96\x66\x1a\xee\x90\x00\x6e\x9c\x85\xbb\xfa\x4c\x5a\x0e\x90\x28\x85\xc8\xce\x51\x21\x2e\xe6\x7f\x0f\xe0\xb6\xaf\xbc\x8b\xad\x45\x37\x27\x54\x3b\x3c\x68\xb8\x90\xdd\xab\xa2\x69\xd2\x5f\xc1\x64\x3f\x54\x83\x51\x36\xa1\xa2\x5b\xa1\x8d\x91\x6c\xed\xd6\xa4\x7f\xc0\x7a\xdf\x6f\xc6\x9f\xa5\x08\x94\x9d\xc1\x0d\x9d\xc5\xe0\x26\x1b\x52\xf3\x65\x71\x70\x38\x4e\xcc\xd9\xc8\x05\x41\x35\x4b\x1c\xe0\xf6\xfb\x5e\xd3\xe8\xd5\x4a\xf0\xb5\xbf\x0a\x92\x83\x51\x25\xc7\xd9\xbc\x4f\x09\x2f\xf3\x80\xe5\xe8\x96\xfb\xf3\x02\x55\x2b\x14\xd5\xb6\x1a\x22\x4d\x86\xe3\x01\xc7\xa6\x6a\x66\xe4\xe4\x32\x9a\xac\x0a\x66\xb1\x56\x77\x23\x74\xdc\x1c\x71\x68\xd5\xb5\x61\x65\x2f\x8f\x43\x87\xe4\xf2\x89\xb6\x36\x6a"}, -{{0xef,0x09,0x48,0xe1,0x32,0x81,0xf3,0xcf,0x35,0x2c,0xbf,0xaf,0x8d,0x89,0xd1,0x17,0x76,0x85,0x52,0xd5,0xa1,0x54,0x8e,0xcb,0xaf,0x37,0x41,0x2e,0x97,0x67,0x0f,0xac,},{0x58,0xc2,0x45,0x7f,0x5a,0x5e,0x3c,0xfb,0xf4,0x71,0x19,0xa8,0x7f,0x2a,0xff,0x19,0x18,0xf1,0xe6,0x7a,0xe6,0xfa,0x91,0x71,0xd3,0xf4,0x1e,0xee,0x07,0xa8,0x68,0x72,},{0xcc,0x12,0xf6,0x9d,0xb6,0x3a,0x67,0x8e,0xc4,0x77,0xa6,0x05,0xa5,0x05,0xc5,0x7d,0xc2,0xb8,0x10,0xef,0x85,0xe3,0xe3,0x45,0x19,0xcb,0x25,0xc5,0x10,0x63,0xaa,0x66,0x35,0x5d,0x3f,0x1e,0x29,0x74,0x69,0x58,0x66,0xed,0xf6,0xf1,0x71,0x71,0xce,0x37,0x84,0x2f,0xba,0xb5,0x07,0x5f,0xc8,0x95,0xd1,0x8e,0xd7,0x43,0xc5,0x46,0x08,0x0c,},"\x7e\xc4\x7f\x2f\x1f\xe3\xb7\x0a\x6d\x1d\x82\xc7\xcd\x92\x4b\x4b\xf9\xb2\x02\x9f\xc1\x2c\x52\xa6\xe1\xcc\x06\xcf\x5a\xbf\xc0\xa4\x42\xe7\xcf\x14\x5c\x15\x42\xb9\xb1\x35\x04\x96\x65\x71\x10\x35\xe3\xc2\x9a\x91\xd4\xfd\xae\xd6\x12\x70\x57\xa8\x12\xc2\x2c\xd7\x5a\xd1\x87\x9b\xe1\xd2\xc6\x11\x0e\x79\xe9\x87\x52\x4e\x4e\x8f\x27\xf1\x6e\xda\x90\xcb\xd4\x73\x3f\x11\x18\x25\xb5\x16\xd1\x06\x7f\x81\xec\xa5\xe6\x94\x85\x76\xd5\xbf\xed\xb3\x27\x7c\x1a\xbc\x1e\x60\xf3\x74\xd0\x70\x1b\x32\xcc\xfd\x6a\x5e\x9c\x8d\x16\x59\xaa\xf3\xd0\x81\x86\x13\x61\x3b\x7e\x28\x8d\x84\x5e\x9a\xaa\xba\x2e\x3e\x9b\x41\x1d\x50\x1d\xff\xe8\x56\xfd\x31\x3e\x9f\xcc\x9e\x74\x30\xb9\x98\x3f\x20\xab\x4e\xbf\x4e\xb6\x16\xbd\x63\xe2\xc5\x77\x43\x65\x89\x95\xed\x0a\x14\x9a\xe6\x20\xa3\x95\x61\x37\x19\xb3\xed\x7c\xed\x45\x88\xd5\x91\x5d\x70\xa2\xf0\xc6\x87\x68\x0e\xc3\x4f\xe3\xe9\xf7\x23\x92\xe1\x89\xe1\x3a\x47\x49\xd5\xca\x9f\xac\x65\x1b\x92\xc0\x84\xc4\x06\x6f\xdf\x98\xa8\x69\x22\x3e\x4e\x0c\x9b\xec\x58\x12\xb5\xc1\x90\x0e\x6e\x60\xd3\xa1\x88\xd4\x8a\x74\xdf\xd4\x15\xb5\xca\xd2\xe9\x1f\xf7\x6d\xf7\x50\x89\xd2\x0a\x75\x5f\x26\x07\x56\xc8\xf1\x38\x2a\x29\xf7\xb9\x37\x26\xe7\x31\x07\x1c\xd4\x77\x45\x8c\x6f\x20\x22\xdf\xad\x7d\x4f\xc7\xab\x23\x80\x54\x18\x64\xf6\xb5\x87\x74\xf9\xae\x8e\x5f\x07\x7c\x1a\x8d\xa0\x73\xc3\x98\x53\xeb\x2f\xd4\x77\x22\x0b\x45\xa3\xd9\x22\x63\xdc\x7e\x14\xd3\xbb\x2b\x36\xfc\xa4\x66\xc7\xef\x8a\x24\x75\x38\x72\x5f\x2f\xce\x5c\x72\x21\xbc\x75\x1c\xde\x13\x94\x60\x4f\x59\x31\xd7\x33\x36\x0c\xcd\x47\xce\x08\x77\x12\x95\x81\x80\xad\x84\xfa\xe7\x13\xb5\x43\xf0\x5e\xef\x6a\xbc\x06\x61\x43\x31\x21\xed\x3b\x45\x06\xa1\x46\x50\x25\x31\x6f\xb8\xf9\xd6\x45\x35\xcc\x45\x38\xac\xd4\x06\x4d\xd5\x76\xb0\x74\x0e\x1b\xeb\x13\xbc\xea\xf1\x55\x54\x3d\xc8\x90\x97\xca\x5c\xa1\xcf\xfa\x0a\xd6\x5a\x10\xbc\xb7\x59\x35\x4e\xab\x8a\x42\xde\x73\x4a\xf9\x09\xc2\xfe\xba\x38\x0d\x66\x40\x9f\x32\x5d\x5f\x17\xaf\x9c\xa7\xf8\xcb\x41\x34\xfd\x6a\x2b\x6a\x52\x8d\x9e\x60\xd9\x61\x2b\x8e\x8b\x40\x62\xf8\xe0\xfa\xd1\xe7\xee\xb9\xcb\xfe\xf6\xe9\x73\x8e\xc7\x97\x3e\x1c\xb2\xba\x23\x27\xde\xca\x4e\xa4\x65\x68\xf3\x1e\x12\xf7\x30\xe2\x47\xc1\xd0\x70\x29\xfd\x44\x22\xb2\x98\xff\x23\x98\x02\x3b\x41\x20\xa3\xa4\x25\xff\xb6\x52\x88\x0c\x19\xea\x69\xf3\x63\x9e\x0f\x6d\xf4\xf0\x08\x76\xcc\x45\x28\xe2\x67\xe8\x1d\x59\x43\x19\x9d\x0f\xeb\x6c\xb4\xe1\xba\xf4\x04\xbb\x6f\x8b\x39\xb1\x2d\xbc\xe9\xfd\xc3\x5d\xc1\x58\x06\x6e\x99\x75\xae\x5b\xd3\xb5\x5f\x2a\x41\xa7\x91\xba\xf3\xe8\x35\x1e\xc6\x04\x94\x47\x90\xa2\x2c\x93\x3c\x80\xb1\x59\x0b\xa1\x97\xa4\x70\x6f\x7f\x51\x28\x68\x2e\xdc\xd7\x4d\xd7\x8d\x43\x5e\x78\x7c\x2b\x76\xa5\x7b\x3f\x4e\x7d\x7b\xe2\xef\xd2\x6d\xa5\xf9\xa8\x29\x11\x9b\x01\x50\x8b\x70\x72\xc7\x69\x9c\xe5\x2b\xb5\x78\xcc\x5b\x1b\x93\x66\x1b\x51\x72\xfb\x84\xda\xf1\xba\x36\x4d\x2c\xbd\x80\xe2\xc9\x9b\xca\x9c\xae\xa8\x73\xcc\x0a\x16\x29\xea\xc3\x84\xe9\xb2\x06\x84\x2a\x6e\x61\x83\x38\x75\x91\xb4\xaa\x34\xa9\x5f\xd8\x9b\x49\xd8\xd1\x5d\x91\xe2\x19\x40\xe1\x7d\xca\xf1\xef\xf8\xa0\xa4\x7a\x0d\x7a\x95\xda\xea\xd8\x2a\xa3\xdf\x82\x04\xa0\xcd\x20\x69\x24\xae\x51\x0f\xec\x8a\x9c\x4e\x8d\x85\xd4\x66\xfd\xb4\xdd\x36\x5d\xc9\x93\x36\xb2\x2c\xe0\xb9\x56\xb5\xee\x00\x17\xf2\x9d\x25\xee\x66\xfb\xdc\xec\xb0\xd9\x96\xff\xb9\x7c\x8d\xef\xde\x40\xa9\xff\x99\x93\x19\x3c\xa8\xf1\x68\x50\x67\xc1\x9c\x52\x6e\x0e\xfe\xd2\x36\xf8\xed\xb8\xde\xf6\xc2\xa0\x3e\x21\x95\x2c\x86\x12\xd6\x24\xe6\x88\x6a\x31\x1f\xfb\x9e\x2f\x15\xda\x44\xab\xe1\x80\xd2\x6a\x14\xb1\x5f\x63\x56\x1e\x09\x7a\x73\x0e\xca\xbb\x79\x2c\x7c\x23\x5f\xdd\x36\x0f\x57\x1f\x27\xef\x68\x67\x7a\x7d\x63\xbe\xb4\x97\x59\x82\xcb\x19\x9a\x56\x0f\x81\x6e\xe1\x29\x89\x44\x5f\x7f\x75\xb8\x3e\xb2\x78\xd6\x28\x25\x94\x7d\x84\x09\x9a\xf2\xa6\xff\x2e\xad\xbb\xf5\x89\xb5\xeb\x2f\x72\xed\x11\x4c\x73\x15\x11\x53\xae\x00\x22\xbc\x95\x64\xd1\x5c\x2d\x5c\xdb\xba\xab\xbe\xf6\x38\xf0\x30\x95\xf5\x3e\xeb\xac\x96\x83\x40\x9a\xd3\x06\x0c\xfb\x7c\x70\x37\xb9\xb0\xbe\xfe\x06\x9c\x92\xa0\x2b\xe9\x53\x38\x8e\x9e\xa4\x5d\x36\xdd\xf4\xf5\xa8\x38\x94\x32\xcc\xf5\x04\xc5\x08\x08\xb0\x7f\x69"}, -{{0x90,0x3f,0x3b,0x53,0x99,0x89,0x2e,0x29,0xcc,0xfa,0xfb,0xaf,0xbd,0x7c,0xc4,0x53,0x3c,0x15,0x4a,0x62,0x56,0x82,0x40,0x6c,0x89,0xbf,0x89,0x4c,0x88,0x9e,0x43,0xf4,},{0x8f,0xa5,0xff,0x5b,0x6b,0x26,0xbd,0x67,0xdf,0x86,0x40,0x46,0x42,0x9d,0xf1,0x24,0xb5,0x23,0x00,0x5d,0xd8,0x94,0x44,0x27,0x5c,0x8a,0xb7,0xeb,0xdd,0xb6,0xf4,0xdb,},{0x49,0x5a,0x8f,0x99,0x19,0x41,0xc6,0x29,0xbd,0x64,0x1a,0x67,0x47,0x1a,0xb8,0x60,0xbf,0xd3,0x9b,0x72,0xf2,0x33,0x55,0xf7,0x27,0x09,0x09,0xd5,0x30,0x7c,0x77,0xb1,0xb9,0x4b,0xae,0x3e,0xd1,0x94,0x50,0x78,0x0e,0x90,0x85,0x30,0x5f,0x31,0xb1,0xe1,0x68,0x3f,0xac,0xf0,0xd1,0xfc,0x88,0x40,0xae,0xc7,0x7d,0xf6,0x7a,0xea,0xb3,0x02,},"\xa2\xc1\x1b\x5f\xb8\x84\xa8\x22\xfa\xe6\x4d\xa8\xdc\xb4\x45\x2c\xfd\x7a\x04\xca\x6d\x7a\x5a\xbc\x8d\x82\x71\xe9\x3f\x93\x44\x9e\x1f\xeb\x8e\x02\x97\x5f\x49\x6b\x90\x34\x40\x0d\x35\x99\xab\x97\xaa\x39\x97\xda\xd1\xc9\xff\xab\x5b\x9f\x8d\xf4\xaa\xa5\xb8\x40\xd9\x0d\x86\x2f\xff\x7f\xf0\xcf\x73\xa6\x0c\x66\x15\x00\x09\xe0\x1c\x93\x7b\xd1\xaf\x68\x07\xb5\xba\x2e\xf6\x12\xee\x13\xd6\xde\xf4\x0b\xb0\x9c\x46\x81\x1a\x2d\x4e\x46\x8e\x03\x8b\x32\x30\x55\xf9\xdf\xbd\x01\x82\x9a\xe2\xf1\xa5\x35\xef\x02\x95\xca\x1e\xd1\x76\xe4\x6d\xe9\x96\xcc\x87\xba\xce\x45\x35\x62\x33\x21\x18\x35\xb6\xf4\x75\x7c\x99\xbd\x52\x7e\x76\x6a\x5f\x0b\x12\x7c\x8c\xff\x8e\x6d\x66\xf8\xba\xb8\x6d\x00\x00\x45\x2c\xd7\xf6\x7b\xe5\x57\x78\x85\x13\xec\x07\x09\xb5\x37\xb0\x07\xb4\x20\x16\xe7\xa8\x96\x83\x46\x9b\xd8\xff\x8d\x21\xeb\x10\xc1\x49\x17\xd4\x7f\x2d\xc4\xf8\x26\x32\x4f\x7c\x01\xb2\x4f\x8d\xcf\xf0\x4a\xa6\xd8\x50\x95\xd9\xab\x15\x4b\xa5\xc3\xbd\x91\x9c\x9d\x72\x8d\xbd\xc9\x90\xd1\x9c\xeb\x23\x7b\x45\x29\x07\xbd\xbe\x21\xf9\xf0\x8c\xdd\xae\x5b\xe4\x79\x27\x67\x09\xb8\xae\x73\xf8\x97\x4c\x4b\x11\x38\x41\xad\x53\x5d\x6f\xf6\x22\x3e\xea\x47\xd1\x85\xc8\xe8\xa6\x5f\xde\xe2\xc2\xd4\x58\x00\xc1\x7c\xb5\x56\xea\xfd\x67\x66\x47\xd9\x96\x8e\x55\xca\x9c\x59\x23\x2b\x97\x70\xad\x10\xf9\x55\xfc\xb5\x85\x8e\xdf\x0b\x74\x83\xad\xc1\x81\x7c\x0f\x8d\x02\x24\x04\x82\xca\xa7\x6f\x43\xc6\xd2\xe9\x6a\x4f\xf9\x59\x1c\xd7\xb8\x78\xea\x61\x9e\xa5\x6d\x1b\x58\x86\x31\xe7\x63\x3c\x5e\xcb\x2b\xa6\x99\x83\x98\xcb\x06\xe3\xcf\x75\xae\xb3\xe0\x8d\xab\x19\x63\x2d\x45\x4f\xf7\xdc\x0e\x2a\x41\xf0\x97\x37\xe8\xee\x82\x3d\x1b\x9e\x24\xdd\xa8\x4a\x2c\xe0\x31\x3c\xb9\xfc\xe3\x1c\xb6\x63\xc5\x5c\x05\x64\x5e\x63\x40\x17\x56\xe8\xad\x38\xf5\x17\x4c\x02\xa6\x63\xd8\x15\xad\x64\x42\x2f\xf7\x72\x7d\x4f\xda\x16\xe4\x8d\x4b\xf8\xf6\x60\x2e\x72\x60\xda\x62\x33\x0e\x68\x78\xc3\x47\x64\xe1\x29\xaf\xbd\x55\x22\x08\xf6\xbe\xd4\xf7\xce\xe9\xb6\x71\xf4\x88\x38\x88\x15\xd7\x4b\x49\x51\xb8\x68\x2c\xe7\x6c\xfe\x31\xe9\x38\xc4\x70\xb8\xf7\xa4\x5f\xd6\x3a\x96\x91\xf4\x26\xa7\x5c\x58\xed\x3d\xbc\xe3\xae\x8f\xd9\xd1\x0a\x83\x52\xe4\x7c\xc1\xb1\x2c\x91\x92\xac\x86\x26\xd1\xb3\x84\xb7\x7a\x18\xb9\x86\xe7\x1a\x99\x86\x46\xc1\x37\x99\x2b\x67\xc4\x81\x7e\x34\x63\x45\xfa\xf5\x0a\x26\x59\xfd\xc5\xca\xd5\xc7\x19\x64\x8e\xfe\xe3\x84\x7c\x0f\xf6\xbd\x70\x95\xc2\x8b\x4c\x51\x95\x96\x7c\x90\xcf\x84\xe1\xef\x68\xa1\xad\xa0\x1f\x62\x74\xed\xe3\x63\xfb\x82\xe0\xb5\x49\xa8\x70\x24\x5d\x60\x8c\xae\x82\x34\xf6\xd8\x4a\xbe\xb6\x1b\x71\x84\x66\x09\x36\x20\xd8\x5c\x58\x4a\xb0\x1e\xed\xa0\x91\xee\x8a\xff\x1c\xf6\x7a\x46\x75\x67\x9a\x1f\x40\x03\xe6\x6a\xaf\x43\x87\x1b\x88\xec\xda\x6a\x16\xdc\x5a\xcb\x05\x39\x5f\x2d\xa9\xdf\x70\xd3\xbd\xb6\x14\x38\xe1\xc3\xd4\x09\x81\xe0\x34\x62\x7d\x02\x6e\xe1\xd2\xe7\x9f\x65\xcb\xb8\x18\x9f\xcb\xb3\xcc\x8b\x5c\x2e\x7e\x79\x6b\x5d\x28\x89\x41\x1d\x56\x41\xfb\x86\x9c\x7b\x0a\x58\x9c\x43\x25\x4f\x8c\x54\x38\xaa\xf5\xac\x42\x38\x32\xf0\x18\xd7\x9a\x51\xb9\x6f\x24\x2e\x2d\xe0\xc8\x51\xcc\x5f\xc2\xb2\x06\xbc\xa4\xb5\xbe\x83\x61\x25\xac\xa1\x44\xbb\xc3\x8c\x8c\x63\x8b\xe0\xd3\xbb\xe0\x25\xa1\xbe\x8b\x3d\x03\xd5\x92\x9b\xaa\x64\x9c\x35\x44\xa3\x2a\x91\x5e\x92\x6a\x38\x79\x1b\x13\x4a\x97\x1b\xc5\x2d\x1b\x6c\xa6\x25\xef\xb7\xc2\xf3\xbb\x47\xab\x51\xd4\x3c\x8e\x37\x4d\x16\xcd\xa8\x82\x20\x4b\x71\xca\xfe\x90\x93\xcb\x60\x78\xef\x2b\xdf\xad\x59\xed\xea\xf3\x6d\x0c\x1a\x4d\xc4\x25\xb9\xe7\x18\xc4\x51\x85\x22\x5a\x9c\x30\x84\xb7\x82\xbf\xe1\x63\x49\x2f\x8e\x84\x82\xec\x9a\xa0\x73\xf6\x90\x1f\xf3\xd1\x11\x7c\xe9\x17\xe1\x91\x22\xfa\x67\x65\x0d\x85\x8f\x8f\x82\xb3\x76\x69\x72\x3c\x22\x6d\x72\x16\x97\xe7\xae\x33\x59\xf5\xa6\xb0\x24\x24\xee\x87\x94\xcb\xea\xa6\x41\xed\xbb\xf7\x53\xb1\x03\xa5\xfe\x15\x8b\xe0\xba\x60\xd8\xa2\x12\xd4\x2f\x8c\x5c\x2a\xf2\x54\xbf\x1b\x9c\x80\xdf\x6f\x1c\xf0\x9d\x70\x79\x3c\xae\x1a\xbb\x46\x27\xb1\x78\x0f\x1b\xce\x7f\x61\x7e\xe5\x0f\x6b\xd4\xb0\x83\xb2\xfc\x7c\xd8\x44\xaf\xb7\x23\x80\xd5\xcb\x6b\x25\x5b\xf4\x7e\xa7\x1c\xad\x6c\x6c\x4d\xf0\x21\xf8\x1b\x54\x8f\x43\x2c\x18\xac\x36\x6c\x6a\xec\xd0\x3b\x6c\x8c\xe2"}, -{{0xee,0x81,0xe0,0xfb,0x05,0x2e,0x23,0xad,0x75,0x9d,0xe6,0xaa,0x98,0x38,0xde,0x98,0xe3,0x6d,0x48,0x20,0xdc,0x0e,0x1b,0x7b,0x3e,0xf1,0x14,0x1a,0xb9,0xde,0x33,0x40,},{0x98,0xf3,0xc9,0x88,0x07,0x94,0xde,0x64,0xfa,0x26,0x9b,0xdf,0x33,0x60,0x95,0xe0,0xe0,0x1b,0x1a,0x3b,0x37,0x5f,0x96,0x5b,0x93,0x70,0x0b,0xbd,0xf4,0xb9,0x68,0x69,},{0xf0,0xd8,0x73,0xbe,0x15,0xcf,0x45,0x4c,0x74,0x34,0xde,0xab,0x71,0xde,0x25,0xcf,0xe9,0x9e,0x81,0xa4,0x8d,0x2d,0xce,0x6a,0x35,0xd1,0x63,0x37,0x14,0xdf,0x0f,0x8b,0x40,0x29,0xe0,0x58,0x25,0x11,0xef,0xc4,0xd0,0x68,0x92,0xf6,0x72,0x85,0x02,0x46,0xbc,0xf0,0x70,0xc4,0x6f,0xad,0xc2,0xfa,0xab,0x44,0xdc,0x43,0x50,0x45,0xde,0x00,},"\x28\xd9\x9e\x95\x18\xb8\x82\x83\xc2\x20\xe7\x6d\xe2\x05\xd7\xb6\x16\x23\x59\xb1\xdf\xec\x1f\xba\xab\x98\xec\x0e\xf1\xdf\x8d\xa4\x0b\x6b\x7a\x77\x5e\x97\x28\x45\x0a\xeb\x23\x51\xfe\x5c\x16\xaf\xda\x3a\xec\x0d\x71\x04\x9d\xa4\xcb\x7d\x4c\x63\x71\x3a\x24\x10\xab\xb0\x22\xf8\x16\x11\xcc\x06\x45\x87\xc8\x04\x7d\x43\x83\xc0\x0c\x3c\x56\x2e\x9c\xee\xa3\x57\x75\x09\x53\x91\xb5\xf3\xdd\xa0\xe3\x73\xc4\xa7\x7f\xf6\x18\xa2\x8e\xf6\x87\x87\xeb\xfc\x3e\xbc\xcc\xc5\xd1\xce\x32\xdd\xf4\x3b\xfc\xe5\x72\x03\xda\x76\xa8\x66\x4b\x3c\x61\x6a\x88\x69\x28\x2d\xb0\xb7\x28\x11\xb5\xfd\x5a\x2a\x03\xa4\xff\x66\x72\x4b\x04\x89\xea\x2e\x10\x73\xd7\x81\xc3\xf1\x89\x11\x5d\x79\xba\x20\xa4\x6d\x1d\xfa\xf5\xb1\xa5\x84\x7b\x2a\x2e\x31\xb2\x80\x87\x37\x56\x9e\x60\xb5\x72\x31\xe6\xa9\x9a\xf2\x6f\x58\xaf\xeb\x15\x77\x08\x10\x47\x48\x12\xfe\x4a\xfa\xcf\x88\x45\x06\xb8\xc3\x14\xbc\x67\x51\xbb\x42\xb4\xbd\x6e\x87\xd2\xe5\xde\x70\xfe\xc5\xf0\x01\x4c\x42\x57\xb1\x34\x72\xa3\xb0\x11\x1a\x7a\x8c\xf8\x3b\x1d\xc0\xcf\x96\x20\x22\xcd\x44\x46\x8a\x3a\xb1\xf0\x01\x6b\x70\xca\xfb\x1d\x02\x46\xac\xd7\x05\x39\x37\xc9\xac\x40\x20\x7c\xf1\x3b\x50\xdd\x15\xe2\xa2\xe1\x5f\x50\xa0\x5b\xca\x2f\x28\xe7\x70\x26\x23\x71\xda\xce\xe0\x2e\x25\xb2\xa5\x96\x58\xed\x90\xc0\x60\x0f\xa2\x65\xb7\xde\x3d\x44\xf8\xef\x07\x21\xbf\x39\xec\x4d\x4e\xca\x58\x88\x52\x7b\x77\x80\x67\xb1\xd6\x59\xc0\x05\x14\xc8\xd7\x05\x62\x73\xa2\x94\xcb\xaf\xe4\x50\x90\xd0\x69\xbb\xd0\x9f\x92\xf4\x61\xe6\x48\xf3\xe6\x82\x88\x2c\x71\x57\x6e\x97\x4d\xeb\xb0\xcb\x7e\x0e\x83\x16\x40\x66\x60\x15\x0d\xab\xb5\x8e\x76\x24\x66\x14\xa2\x91\xc1\x2c\xe9\xe0\x34\x6c\x02\x77\x4d\x4d\x09\xce\xcc\x23\x69\x67\x12\xfe\xe2\x50\xc0\xbb\x5d\xf7\xa2\xa4\xc4\x3a\x55\x63\x33\x1b\xcb\xbf\x84\xbe\x3f\x2e\xeb\x06\x54\x53\x2e\x85\xec\x59\x7b\x53\xb3\x2f\x39\x54\xcc\xaf\x0c\xd4\x26\xde\xf9\x1e\xc4\xb2\x08\x41\x69\x48\xaf\x27\xde\x04\xd8\x32\x70\x58\x97\xa0\x4c\x5e\x24\xa2\xe8\x8b\x20\x04\x0f\xd4\xec\xa3\x08\x9f\xdb\x91\x8a\x92\xe3\x5c\x4d\x31\xda\x26\x85\x0b\x9d\xd3\x41\x18\xc7\x44\x49\xa8\x55\xff\x4b\xc9\xff\xf0\xd1\x44\x78\x39\x65\x4b\x00\x41\x79\x99\xfa\x4e\xb8\x91\x02\x13\x3c\xd3\x20\x40\x91\x53\x58\x49\x57\xc1\x04\x89\xdb\x4b\x72\x44\xc9\x59\x07\x98\x8e\x83\xdc\x82\x12\x71\xdc\x1a\xb6\x43\xd6\x99\x2d\x0f\xd8\x20\x49\x2a\xe6\x42\xe2\x4d\x19\xa1\x79\xfa\x75\xd9\x36\x3b\x32\x16\x62\x60\x6f\xd9\x4a\x47\xfd\xb2\xe6\x8d\x3f\x30\xc0\x46\x73\xf8\x09\xde\x01\x44\x94\x5e\xa4\xd4\x18\x3d\x48\xf1\x75\x07\x9e\xed\x50\x32\x3c\x6b\x19\x2e\x02\x0e\x16\x2a\x35\x03\xaa\x58\x2f\xb0\x8b\x40\x36\x24\xa2\x3e\x35\x7e\xed\xa0\x8d\x90\x43\x86\xf3\x58\xc3\x6c\x64\xd3\x14\xc7\x7c\xd9\xd4\xd2\x3d\x58\x1e\xe5\x3d\x81\xff\x97\xad\xa0\x19\xcf\xcf\x04\xeb\x9d\xcc\x1d\xe9\xb7\x4c\x3d\xb6\xb8\x11\x57\x8b\xd4\xf2\x19\xc5\xca\x48\xef\x4c\x82\x6b\x09\xe6\xc9\x6d\x03\x1f\x65\xdd\x48\xb6\xe7\x3d\x0c\x10\x05\x86\xb2\x1d\xf0\x29\x3a\x03\xd2\xed\x7e\x50\x09\xad\x02\x53\x40\xc2\x1d\x09\x06\x06\x91\xf5\xcd\x8a\xf2\xab\x12\xf9\xb8\x60\xee\x87\x81\x5e\x1a\x9f\x40\x0c\x2a\x6f\x63\x4e\xa8\xf9\xb3\x42\x5a\x08\xd1\x0b\x3c\x81\x53\x67\x38\x8f\x4d\x1b\xe3\x56\x31\x8e\xcf\x90\x35\xd0\xee\x97\x5a\xff\xa8\x59\xca\xac\x28\xeb\xcc\xd0\x59\x9b\xb2\xf6\xf3\x52\x36\x61\xbd\x17\x8f\xc9\xe4\xca\xc3\x78\xbb\x9d\xd4\x71\x6b\xb0\x69\x23\xfd\x2b\xbd\x56\xc9\x59\xc4\x2b\x95\xd5\x01\x93\xf8\xbf\x29\x9f\xcc\xa3\xb2\xee\xa9\x4e\xc5\xf9\x85\x83\x92\x4c\x08\x04\x16\xe2\x8b\x54\xfe\x57\x65\x84\x58\xb0\x55\xce\x4d\xe8\xa7\x5f\xc8\x27\x15\xca\xe9\x1d\x37\x5c\xf6\x92\x81\x37\x80\x51\xbb\x61\xfd\xd7\xbb\x00\x68\xf6\x3e\xfa\x6d\x6e\x83\xd8\xfd\x42\x57\xaf\x80\x97\x0f\x4a\x9e\x69\x24\xb2\xde\x0a\xd9\x66\xdf\xfe\x6f\xa4\xa1\x13\xb0\xe7\x72\xf1\x76\x87\x85\xb3\xb4\x20\x49\xf7\x6c\x48\xad\x80\xf2\xc6\x7f\xb0\xf9\x1a\x5f\xc4\x10\x79\x12\x52\x0d\x8d\x68\x3c\x06\x2c\x3a\x22\x2b\xcd\xa7\xe7\x10\xba\xcd\x47\x8e\xe8\x83\x67\xb6\xa0\x59\xa4\x52\xfd\x26\xf1\x14\xa5\xac\xbd\x69\x79\xba\x01\x9f\x7d\xa6\x8a\xc0\x4a\x19\x30\x26\xbc\x1c\x27\xe4\x83\x7b\x1d\xe2\x9c\xce\x09\x0e\x33\x80\xd5\x05\x1a\x58\x64\x09\xe6\x28\xe3\x14\x56\x65\xbb\x1d\x84\xec\xd8"}, -{{0x69,0xd0,0x1d,0x82,0x91,0x13,0x08,0x1c,0xbf,0x5d,0x0c,0x6e,0xf7,0x7b,0x21,0x77,0x5c,0x8d,0x9b,0x68,0x00,0x00,0x05,0x6f,0x03,0xc7,0x5a,0x7d,0x0a,0x05,0x87,0xd2,},{0xee,0x84,0x69,0xdd,0x61,0xcf,0x5d,0xe4,0x00,0xda,0x7d,0x7a,0x47,0x9a,0x44,0x18,0xe6,0x77,0x2e,0x69,0xff,0x53,0x30,0xce,0x5c,0xa7,0x78,0x59,0xfe,0x27,0x17,0x55,},{0x40,0x8c,0xef,0xcf,0x01,0x41,0x7e,0x2d,0xc6,0xa8,0xa1,0x82,0x84,0xe4,0x11,0x65,0x7f,0x03,0x92,0x50,0xc3,0x12,0x78,0xdb,0x28,0x19,0xf9,0xea,0xea,0x42,0x93,0xfb,0xf6,0x83,0x1a,0x28,0x01,0xfc,0x1e,0xa6,0x87,0x16,0x57,0xb8,0x41,0xe1,0x73,0xf4,0x51,0xb0,0xd5,0x75,0xa9,0x37,0x9e,0x35,0x85,0x7e,0x8c,0x72,0x97,0xfa,0x14,0x04,},"\x0b\x9e\x11\x0f\x29\xd1\x98\x16\xa1\x7b\x2c\x75\x47\x8f\x13\xce\xe9\x53\x81\x1a\x19\x83\x01\x4c\xb7\xeb\x0f\x75\x52\x69\x12\x04\x4c\x3e\xa6\x82\x97\x80\xe6\x57\xf8\x17\xc5\x59\x7d\x46\x61\x08\x0d\x90\x34\xc9\x77\x87\x22\x41\x8f\x2c\x3a\xee\xca\xef\x6b\x69\x0c\x5b\xd3\xb5\x93\x70\x10\x86\x98\x8e\x43\x40\xae\xc3\x4e\x01\x72\x75\x8e\xb2\x40\x87\xd0\x3a\x8f\x76\xe7\xcb\xca\x53\xaa\xaf\xc4\xd2\x15\x5c\x75\x32\xab\x54\xbe\x48\x87\x26\x53\x06\x6f\xa1\xfd\xd5\x4a\xcf\xe9\xda\xae\xca\x35\x6c\x29\x0e\x6b\xe6\x33\x55\xb6\xd9\xfc\x52\xeb\x5e\x4f\xcc\xbb\xc6\x08\x35\x07\x13\x2d\xe4\x85\xbf\xae\x9f\x42\xe1\x97\x12\x23\x2b\x71\x64\x02\xc2\x3f\xea\x74\xef\xa6\x9d\x73\xc8\xc2\xe3\xa8\x66\x2b\x8b\x65\xb0\xfd\x00\x77\x41\x01\x3e\x1f\x6e\x3c\xfe\x43\x45\xd5\xc8\x30\x68\x2f\xe6\x00\x21\xd7\x08\xe1\x0a\x9e\x9f\x40\x52\xff\x7a\x6a\xbf\x28\xac\xb1\xd6\xb5\xfb\x03\x8e\xed\x3f\x72\x51\x3c\x35\x5b\xbf\xd5\xc2\x27\x4f\xa8\x5f\xc4\xf4\x46\x97\x4b\x2d\x1b\xc0\x36\x50\x7a\x1e\xb5\xfc\xf5\x5d\xbd\x44\x21\x0e\x53\x82\x74\xde\x80\x8b\x90\x0b\xf1\xc0\xfc\xc0\x24\x12\x70\xdb\x8d\xbd\xcd\x88\x34\x9d\x67\x22\x4f\x08\x7e\x5f\x07\xf6\x99\xb0\xba\xe6\x8b\x2e\xbc\x9a\x4e\x27\xc7\x0d\x3a\xc7\xd9\x96\xfa\x7d\x4d\xab\xd5\x68\x37\x8e\x3f\x93\x90\x5b\x1c\x89\xc6\x52\xd3\x84\xc1\x6c\x2b\xcb\x1c\x98\x44\xc3\x8f\x71\xbb\x13\xe0\xc6\xa2\xea\x95\xb6\x12\xe3\x90\xc5\xf8\x6d\x24\x8e\xa5\x31\xf2\xec\x6f\x63\x9a\x40\x2d\xfa\xcc\xf3\x72\x17\x00\x53\x44\x03\x07\x45\xd1\xf1\xe5\x20\xcc\x19\x5d\xaf\xdd\x7f\x29\x5f\x37\x7b\x8d\x61\x47\x16\x70\x38\x36\x21\x9b\xb7\xb0\x9f\xea\x7a\xae\x9a\xc3\x3e\x42\xdc\xab\x65\xcc\x61\x42\xfc\xd8\xce\x15\xe9\x77\x17\xfd\xb3\x3e\x95\x38\xc4\x4f\x6c\xd9\xc1\xc6\x5d\xb6\x27\x51\xf5\x52\xf8\x70\xf1\x01\x42\xc9\x6f\x9d\xf1\x85\x5a\xbb\x39\xe4\x27\x06\xa5\x63\xab\x15\x45\x11\xfd\xce\x68\x7c\x95\x76\xf9\xed\xc3\xb4\xba\x55\x34\x6c\xe6\x68\x02\xff\xfe\xf4\xb1\xb5\xe1\x20\x15\xce\x8b\x57\xde\x54\x58\xca\xa0\xda\xf3\x41\x96\x81\x28\x58\x42\x88\xc2\xf2\x7c\xbf\xb7\x6e\xab\x28\x6b\xac\x5f\x66\xaa\xd0\x04\x9e\x0c\xa6\x0a\x90\x14\xe1\x79\x01\xc4\x13\x0e\x83\xce\xae\xb4\xc2\x71\x3e\x97\x1a\x23\x5e\xff\x99\x5a\x81\x3a\xe4\xea\x64\xa5\x83\xff\xde\xfd\xac\x82\xac\x76\xea\xf4\xd4\x7c\x4a\xc8\x25\x0f\xcb\xaf\xd6\xb8\x8f\xae\xb4\x80\x15\xf5\xb4\x2b\x53\x34\xa5\x0b\x31\xd4\x50\x2e\xa4\x91\xda\x90\xdc\xe9\x3c\x08\xfd\x56\xf5\xc5\x8e\xed\xb3\x79\x16\x6a\x23\x76\x2b\xe5\xe4\xad\xea\xa6\xf4\xae\x1c\x24\xe0\xca\xc4\xdd\xca\x03\x83\x45\x85\x60\xcd\xc4\x8b\x8c\xd1\xf4\x2a\x3b\xa2\xf6\xff\xb6\x07\x79\x09\xfc\xb2\x94\xad\x1e\xf4\xa4\x4c\x22\xec\x4b\x39\x87\xdd\xbe\xef\x32\x5b\x98\xce\xd5\x68\x15\xea\x7d\x5f\xcc\xf5\xaf\xdf\xe9\x8e\x0e\x6d\x92\x0f\x7a\xda\x2e\xb5\xc9\x16\x24\xc7\x6c\xbb\xa2\x99\x3a\x9c\x7a\x55\x02\x1d\x12\x7a\x66\x7b\x39\xe2\x35\xdf\x4f\x81\xde\xe7\xdd\x14\x28\x98\x77\x8d\xbd\x92\x13\x5b\x70\xb3\xac\xf5\x9f\x6c\x29\xa2\xc9\xd4\xa7\x00\x6e\xf1\x1a\x91\x8b\x3a\x29\x06\x26\x4a\x15\xd6\xb5\x29\x30\x8c\xbc\x89\xf8\x56\x01\xfc\x1e\xa1\x31\x4d\x67\xf7\x56\x6c\xf1\x09\x16\x5c\x7f\x92\xde\x1a\x18\xd7\x0d\xeb\xe0\x24\x34\x9d\xb3\x56\x0a\x6e\x52\x7e\x2a\xc3\xe0\x67\x89\x46\x87\x04\xe6\xb8\xf1\x87\x1f\x16\xba\xe9\x82\x73\x92\xb4\x18\xf1\x08\x6c\xc4\x97\x08\x6c\xed\x14\xb1\x24\x9d\x6d\x87\x94\xf2\x3b\xb8\x77\x9d\x41\x86\x48\xf2\x15\x56\x56\xa6\xfd\xa7\x44\x0c\x56\x28\x4d\x9b\x21\x88\xfa\x7d\x17\x36\xbc\xcc\x9c\xff\x0b\xe5\xb1\xe1\xf5\x51\xff\x81\x37\xff\x59\x66\xed\x9d\x0f\x7f\x01\xc3\xdf\xf2\x98\xe9\x10\x2f\xfb\xd3\x24\xbf\xca\x5f\xfe\x09\x68\xe6\x6f\x9d\x82\xf4\x87\xd3\x03\x93\x4f\x27\xf7\x8b\x28\x37\x8e\xb7\x2c\x38\x27\x29\x62\xa5\xf7\x35\xd7\x39\x2e\x5d\x33\x3f\xd8\x6d\xe1\x67\x26\x9c\x17\xa1\x65\xb9\x2d\x31\xa4\x88\x0a\x41\xe1\x36\xf7\x18\x96\x0a\x91\x9b\x3d\x7c\x4e\x74\xcb\xd7\x3c\x73\xf9\x21\xbe\x51\x3f\x73\x9a\xff\xb2\xe4\x1f\x80\x42\x6b\xb8\xcf\xb4\x56\x4b\x98\xfc\x4d\xe5\x32\x55\xce\x3f\x98\xb4\xd2\x2a\xe6\xfc\xe9\x19\x0b\x55\xbf\x2c\x93\x86\x1c\x1d\xca\xc1\x01\xb5\xe1\x6c\xf0\x99\x91\xc5\xde\xfa\x33\xf8\xd5\x10\x56\xd9\x34\xbb\x4b\x47\x7b\x65\x20\xd4\xc7\xae\x22\xea\x7f\xb3\x10\x9d\xe7\xf4"}, -{{0x4b,0x8e,0xd2,0x97,0x31,0xf1,0x04,0x79,0x5e,0x97,0xde,0xe7,0xc8,0xb4,0x01,0xa0,0x2a,0xfa,0xa9,0xa7,0x95,0xe6,0x13,0x35,0x3d,0x2b,0x95,0x00,0x17,0x65,0x02,0x7a,},{0xf2,0x22,0x98,0x21,0x0b,0x09,0xfd,0x61,0x7f,0xc8,0xb3,0x50,0x74,0xca,0x18,0x01,0xe6,0x07,0x5d,0xc9,0x2a,0x8f,0x50,0x34,0x4b,0x80,0xe8,0x54,0x05,0xa0,0x38,0xf5,},{0x23,0x45,0x88,0x66,0x86,0xeb,0x39,0xb5,0x19,0x9c,0xaa,0xa9,0x61,0x5b,0xc6,0xb4,0x89,0x6f,0x07,0x6e,0x8b,0xd7,0x36,0xc0,0x03,0x8a,0x65,0x17,0xf9,0xc2,0xb1,0x67,0xe7,0x59,0xf3,0x73,0x72,0x26,0x8a,0x69,0x7e,0x9b,0x78,0x60,0x5f,0x2e,0xd9,0x47,0x25,0xf6,0x90,0x5a,0x79,0x00,0x15,0x3f,0xc9,0xe8,0xbe,0xed,0x31,0xff,0xae,0x05,},"\xcb\xb5\xf1\x3a\x0e\xf2\x83\x7b\x80\x5d\x3b\x78\x51\x09\xf9\xf2\xe0\xd0\xa0\x17\xbf\xe7\x69\x2d\x91\xec\x23\xdd\xab\x78\x17\x33\x0b\xef\x24\x7f\xd9\x1a\xb2\xc7\x7d\xd4\x41\x25\x19\xcb\xd3\x84\x75\xce\x0c\xb3\x9b\x14\x80\x09\x2b\xc7\x38\xd4\x15\x2b\x8a\x6d\x55\x24\x8e\x3b\x9f\x32\xcd\xcd\x15\xec\x5d\x05\x9e\xc3\xc8\x84\x75\x54\xee\x47\x00\x53\x94\x97\x4d\x8e\xb2\x35\x92\xd1\x7f\x5a\x39\x6e\x3c\x19\xf8\xe8\x98\x37\x06\x79\xfe\xf5\x31\x8c\x4d\xd2\x99\xc6\x21\x7d\x6a\xbc\xc9\xb6\x1a\x5b\x2d\x0c\xfe\xf6\x95\xd1\x70\xca\x20\xa8\x3d\x6f\xd3\xc6\x66\xc8\xfd\x1c\x10\xad\x97\x0e\x2f\xa6\xaf\x10\xff\x0e\xd0\xcb\xfe\x75\x22\x46\xd0\x3f\x3a\x3c\x60\x32\xdb\xb3\x19\xbc\xfd\xac\x4d\xaf\xc5\x0b\xc3\xe6\xbf\x59\x5f\x49\x1d\xec\x38\x8b\x34\x41\xb8\xce\xe0\xdf\x91\xf5\x5c\xc7\x80\x7d\x07\xf8\xf5\x41\xed\x73\x22\xff\xc3\x9d\x18\xf8\x95\x60\xe4\x12\x3a\xec\x1d\x77\x96\x9c\xf1\x87\x77\x86\xf4\xcf\x94\xb1\x77\x0b\x10\x90\x65\x5e\x8c\x72\xee\xce\xa4\x57\x2e\x46\xf5\x80\xf9\x63\x96\x6d\xb2\xa1\x08\x5e\xea\xbc\x57\xbf\x4a\x84\x72\x4b\x9c\x85\x99\xa4\x33\xab\xf5\x8b\xca\x80\x40\x91\xd3\xd5\xe6\xe5\x04\x8e\xc2\x7b\xf8\x12\x9b\x67\x0c\xc2\xc8\x8d\x9c\xac\x47\x18\x59\xf4\x69\xb9\x18\xf3\xf6\xd7\x0f\x7d\x66\x63\x50\x1f\xfb\xef\xef\x02\x6d\x79\xea\x70\x92\x7c\xcf\x60\x75\xee\x51\x05\x42\x33\x21\xe1\x1a\xee\x9a\xd1\x6f\x98\x7e\xfb\xdd\x00\xb6\x2a\xff\x69\x8e\x52\x1a\xdf\x92\x03\xb1\x5e\x9f\x0f\x3a\xd0\x7d\xca\xd9\xdd\xcc\xaa\xe9\xb4\x90\x24\x7f\x12\xc3\x11\xde\xe6\xb7\x3b\x8f\x91\x24\xfd\xce\x12\x99\xb4\x7f\xb1\x91\x4c\xee\x7e\x3a\x07\x81\x4e\x31\x2c\x3c\xe5\x69\x27\x67\x2c\x51\xb3\x18\x59\x80\xcd\xe5\x7f\x3a\x75\x9b\x50\xbc\xfc\x4c\xb0\x75\x3b\x95\x4d\x97\x13\x5d\xeb\x2a\x05\x32\xe9\x8b\x66\xf3\x9a\x7c\x08\xcf\x4d\x54\x85\x39\xe2\xeb\x9f\x42\x2f\x66\x49\x65\x88\x93\xa7\xc3\xc2\x5a\x4f\xc9\x01\xf8\xc3\x98\xb8\xc7\x27\x33\x91\x1a\x00\x72\xed\x6b\xd2\xf4\x18\x93\x89\xae\x10\xa8\x14\xf6\x48\xd7\x1f\x69\xc3\x7e\x82\x95\x78\x44\x28\x18\x3b\x93\xc8\x01\x3b\x96\x4a\x9f\xef\x86\xb4\x8f\x48\x93\x16\xbc\x22\x2e\x96\xb3\xbd\x15\xff\x14\x9b\x96\x82\x03\x29\x55\x1c\x15\xe0\xd0\x95\xd1\x56\x9b\x1e\x21\x31\xc7\x87\x51\x56\x5c\x30\x41\xf2\x97\x85\x39\x5b\x97\x15\x13\x17\xf6\x2e\x35\x82\xe4\x07\xb1\x64\x9e\x60\xd0\x3a\x85\x99\x12\x0a\x30\x2a\x46\x95\xfa\x86\x2b\x41\x20\xf9\x4d\x22\xec\xae\x72\x39\x8d\x20\x94\xd1\x08\xad\x2d\xbc\x1b\x95\x97\x35\x90\x21\x42\xaa\x5f\xe6\xe7\x99\x65\x59\xf6\xf6\x01\x44\x8a\xea\x02\xf3\x56\xf8\xdc\xdd\x14\x43\x40\xeb\x36\x19\xf9\x86\x5b\xf7\x67\x2a\xea\x32\x6c\x4e\x93\xc9\x9f\x0e\xd1\xf9\xed\x86\x6b\xe1\x5d\x3a\xf2\x67\x5f\x6d\xd6\xe2\x96\x60\x2c\xa3\x73\xa8\x15\xb0\xbe\x46\xbc\x2a\x3f\xbb\xa0\x6b\x88\x05\xc7\x31\xfe\x08\x00\x7d\xaa\x06\x05\x09\x61\xb2\x4d\x14\x69\x3a\x72\x89\x8c\xcf\xb8\xb8\xfe\xdc\x60\xa4\xee\xf8\xff\x79\xb6\xdd\x75\x92\x59\x18\x33\xb5\x76\xef\x48\x29\x4e\x5e\x04\x85\x94\x2e\x57\xc1\x19\x60\x2e\xdd\xf8\x8b\x1f\xae\xa5\x17\xf2\xfc\x2e\x3d\x14\xd2\x46\xa5\x2c\xbd\x71\xa1\x08\xc6\x6b\x6c\xc4\xf2\xd4\x58\x04\xa2\x82\xec\xed\xb1\xb0\xad\x3d\xc3\xb4\x88\x0a\xb2\xff\x78\xb8\xdd\xde\x48\xf7\x46\x6c\x14\xfe\xd3\x49\xe9\x5b\x50\x53\xab\xf1\xbf\x09\x91\x12\x60\x31\xd9\x75\x47\xd1\x43\xc2\xae\x16\x49\x28\xb6\x1c\x07\x08\xaf\x8c\xa3\xe4\xf5\x51\x54\xd1\x3d\x75\xe9\x7d\xb4\xba\x3e\x69\xd3\x6e\x9b\x37\x08\x23\x68\xc2\xf7\x21\xbd\x3f\x95\x12\x6a\x1e\x00\x4e\xb2\xa1\xbf\x26\x83\x43\xae\x21\xd2\x99\x50\x44\xa2\xca\xdd\x67\xff\xac\x9e\x15\x38\x17\x5b\x3c\xc4\x4d\xb5\xd2\x6f\x1d\x5c\xc8\x9c\xa0\xe1\xc1\xee\x85\x37\xa8\xa9\x1d\x32\x4c\x2e\x02\xe1\x8b\x9f\xb9\x73\x0d\x6d\xda\x55\xf7\x2d\x84\x33\x89\x69\x3e\xbf\xcb\xa7\xfb\xe1\xa0\xbc\xff\xb9\xaa\x28\x4f\x4a\xe6\x6f\x44\xa8\xb8\x93\x02\x98\x3b\x22\x73\x6d\x0c\x72\xd6\xa0\x44\xe4\x29\x16\x24\x24\x3a\x4e\x0c\xe6\x5d\x5e\x53\x46\xd6\x7f\xed\x37\x60\xdd\xb0\xc5\x10\xb5\x0f\xf3\xee\xf0\xa1\x8a\x26\x7d\xe7\x30\x47\x6d\xd8\x2d\xff\x70\x72\xcb\xa0\x98\x48\x25\xa0\x04\xdd\x4b\xcd\x8c\x37\xfd\xaf\x1f\x68\x3d\x1d\x93\x80\xe1\x35\xa9\x5d\x24\xb8\x9f\xad\x0b\xe9\x41\xc5\x48\x25\x1b\xec\x90\xcc\xae\x01\x5b\xc0\x56\x7d\xa8\x4b\x37\x1e\x50"}, -{{0x08,0x0d,0x7f,0x76,0x18,0x2e,0xe6,0xbc,0xea,0x89,0x4b,0x1e,0x00,0x60,0x55,0x8b,0x3b,0x12,0x5a,0x34,0x99,0xdf,0x39,0x73,0xb8,0xdd,0x66,0x93,0x40,0x8e,0xe4,0x69,},{0x41,0x24,0x71,0x3d,0x7c,0x2d,0xf5,0x0f,0x93,0x05,0x57,0x30,0xd1,0xb2,0x81,0xda,0xec,0x30,0x28,0xcf,0x2c,0x1e,0x48,0x58,0xd1,0x28,0x70,0x7a,0x23,0xd6,0xde,0xb0,},{0x18,0x5f,0xb1,0xb6,0xd8,0x6d,0xc4,0x44,0x48,0x10,0xcf,0x5e,0xc6,0xfe,0xf0,0xab,0xda,0xfa,0x2a,0x6f,0xcc,0xb4,0x5d,0x11,0xcf,0xb5,0x4b,0xa1,0x6a,0x68,0x43,0xf2,0x80,0xd3,0x80,0x47,0x10,0x02,0xae,0x0d,0x71,0x50,0x85,0x56,0xc7,0x8e,0xd5,0x41,0x5e,0x42,0x33,0x8c,0x16,0x1f,0x2b,0x62,0x1e,0x74,0xcb,0xa4,0xf6,0xa1,0xd4,0x02,},"\xab\x0a\x6d\xe2\x35\x1b\x9a\x84\x98\xf6\x82\x72\xd9\xa0\xa7\xa0\x57\x36\x5d\x34\xef\xa0\xfd\x34\xcc\x3b\xf8\x62\xe4\x9c\xdc\x30\x2b\x2b\xd5\xa3\x0d\x60\x1a\x13\x0e\xc4\x03\x2f\x54\x1a\xe6\xcb\x7b\xa9\x7f\x84\x18\x3d\x2d\x25\x81\x28\x7c\xa7\x01\xd7\xd7\xa9\xab\xa1\x10\xce\x58\xb9\x46\xac\x08\x24\x30\x5d\xf7\x92\x9f\x3d\xd7\xfc\x9c\x87\x32\x23\x86\x37\xe2\xb1\x81\xd6\xe1\x16\xc7\xf6\x6e\x32\x26\xaa\xe3\xce\xd1\x61\x02\x62\xda\x1a\x0a\x4a\xa5\x0a\x1b\x94\x43\xec\x82\x83\x29\xe4\x73\x4d\x28\xfc\x25\xab\x9c\x1d\xe9\xb8\x98\x7e\x5d\xc0\xc8\x13\x19\x16\xc5\xf1\x89\x28\x70\x4a\x71\xe8\x06\x22\xb1\x49\x2b\xf2\xfe\xc5\xd4\xb6\xdb\xe4\x15\xc8\xaf\x2c\xe3\xef\x10\x9b\x34\xdd\x5e\x64\xd5\x68\x46\xf0\x85\x93\x5a\x4a\x5d\x10\x73\x49\x7f\xb3\xfb\x8f\xb7\x7e\x8f\x5d\x5e\x3f\xd0\x0c\x30\x65\x2e\x3c\x5c\xde\x40\xa3\x35\xd1\x4e\x54\x25\xff\xba\x94\x28\x85\xed\x17\xbd\x36\xdf\x50\x69\x24\x23\x7e\x75\xbe\x84\xda\x82\x19\x50\xb9\x14\x24\xfd\x9f\x16\xc1\xb2\xc7\x83\xe9\x0f\x8c\xc2\xcc\xc7\x98\x0c\xe9\x15\xc7\x69\x6b\x06\xa5\x86\x73\x02\x59\xe6\xd1\x45\x88\x58\x2b\xab\x9d\x2a\x39\xf6\x9e\x98\xe7\xf2\xae\x9b\xc0\xc2\x61\x0d\x7e\x04\x57\xf2\x6a\x5d\x66\x54\x3b\xe1\xd6\x5b\x79\xc4\xb7\xc0\xd8\xee\x73\xd0\xc2\xb6\x7b\xf5\x0d\x80\x82\xf0\x06\xf9\x6d\x11\x95\x05\x87\x31\x93\xdf\xdb\xd4\x32\xbb\x1c\x9e\xe0\xd0\x3e\xe5\x4c\xf9\x5d\x20\xe9\x1f\x7f\x3a\x06\x9b\x62\x56\xf4\x21\x59\xcd\xc1\xe6\x00\xa9\xa1\xc2\xf5\xa8\xe4\x67\xd5\xc2\xa9\xdf\xf8\x73\x0e\x6b\xe8\x26\xfb\x2a\x1e\x64\x48\xbf\xc4\xfc\xaa\xaa\xcd\xaa\x76\x62\x35\x1f\xaa\xdc\x91\xf7\xca\xa7\x73\x7d\xc8\x2e\xc3\xd4\xb2\x19\x36\xbc\xa1\xbd\x7c\xe3\x73\xad\x66\x26\x4a\xf1\x32\x41\x16\x75\x49\x31\x8c\xdd\x78\xe5\x63\x82\x7f\x85\xea\xb2\x0e\x0b\x42\xbc\x55\x4a\x71\x2c\x00\x51\xa5\x01\x0d\xc2\xf2\xc7\xdb\x85\xac\xf6\x54\x9f\x9d\x10\x2c\x90\x3c\x1b\xe5\xa0\x52\x92\xc3\x0f\x21\xab\x1b\x2b\x8a\xbc\xbb\xf1\x04\x72\x3c\x63\xf0\xeb\xc5\x54\xfb\xee\x42\x02\x0c\xcb\x14\xf4\x43\x47\x8d\xf7\x7c\x6a\xa4\x4d\xb9\xa5\x7f\x8f\xd4\x4d\x97\xea\x09\x9e\x47\x74\x82\x3e\xbe\x12\x3f\xcf\x50\x16\xa6\x6e\x83\x7b\x2f\x65\xc1\x84\x5e\x68\x1e\xe2\xa7\x05\x9f\xb1\x29\x0c\xd0\xa9\x33\x12\x98\x55\xcc\x83\xc8\x7e\x0b\x3b\xb6\x1e\x44\x13\x4a\xdd\xd3\x63\x78\x50\x24\x6c\xdc\xda\xa2\x9f\x15\xc4\x1a\x3d\x4d\xd2\xc1\xd7\x60\x06\x21\x24\x33\x31\x24\xcf\x09\x14\x35\xfd\xce\x71\x1f\x52\x31\x63\x68\x99\x9b\xef\xa4\xc8\x0a\x39\xb3\x75\x0e\x4e\x38\x62\x89\xe4\xe2\x85\x5e\x97\xb6\x19\xb0\xa2\x57\x99\x91\x24\x08\xb7\xd5\x8a\x4d\xd9\x81\x95\x71\xe9\x01\x43\x0f\x6d\x55\x55\x29\xdd\x63\x0a\x18\x67\x45\x9b\x80\x22\xd0\xe0\xad\xd6\xab\x4f\x12\xf6\x0b\xaa\xc7\x59\x79\xbb\xff\x7f\x62\x58\xd2\x8d\x67\x60\xb1\xff\x24\x3c\x39\xe4\xbb\xd6\xcf\x9b\xea\x57\x2a\x9c\x08\x2d\x05\xad\xcf\xd4\xcc\xf9\xfa\x02\x6f\x2c\x90\x4b\x6e\x78\x2e\xd7\x09\xdf\x77\x48\xa3\x07\xcd\x2d\xc3\xa0\xfc\x41\x23\xdf\x58\x0c\xbf\x49\xe0\x5c\xee\xab\xc9\xf3\x9e\x57\xb7\xf3\x00\x90\x5d\x8b\x31\x00\x91\xfb\x95\x3f\x3d\xef\x36\xde\xb3\xe8\xbf\x37\x2f\x59\x16\xb5\x15\x97\xdf\x02\x4c\xe8\x5c\xc4\xc3\x6e\xab\xdc\x58\x0b\x5c\xf1\x52\x99\x46\x48\xf1\xd7\xf3\x5f\xed\x5c\xd1\x0f\x6e\x29\x49\x16\x1a\x33\x59\xb3\x03\x4d\x45\x0e\xa6\xf6\x1c\xdf\x1d\x5a\xf7\x6d\x40\x10\x2b\x60\x29\x4f\x4e\x49\x07\x82\x49\x02\x6d\x62\xfe\x35\xfd\xf2\x24\x92\x8b\x0c\x49\xba\x2b\x53\x39\xeb\xb1\x92\xc5\xab\x7f\x05\xcd\xb9\x46\xe3\x7d\x67\x1a\x4a\x5e\xf2\xa5\x82\x72\x20\xb4\x43\x8c\xbd\xa0\x57\x36\x29\x28\x06\x64\x8f\x5b\xdd\x52\x42\x0f\xa7\x6b\x84\xa6\xad\xdb\x12\x63\xeb\x0c\x50\x0e\x81\x56\x6d\x71\x8d\x50\x66\x02\x6d\xa0\x97\x05\x4a\x86\x63\x10\x16\xdd\xfb\x70\x6a\x56\x77\xd5\x02\xef\x84\xaa\x73\xb5\x86\x3b\xc4\x0f\xdc\x42\xcb\x73\x21\xac\x5f\x00\xe2\x92\x8f\xed\x7b\x04\x18\x59\x6d\xb4\xb6\x15\x1d\xd6\xbc\x6e\x81\x8f\x02\x53\x55\x2b\xf1\x37\x41\xe6\x96\x80\xe9\x66\xc9\x2c\x29\x3e\x13\xc9\x0f\x7c\x99\x99\xbd\x1e\xc6\xaf\xe3\xb4\xaf\xfb\x47\x34\x0c\x89\x85\x98\x29\xfe\xb5\x99\xdb\x3a\x8c\x3d\x33\xfc\x8d\x45\xfa\x53\x81\x07\x8a\xe9\xf7\x5d\x85\xc1\x49\x6f\x5f\xb5\xad\xdf\x4e\x40\x09\xb7\x64\xbc\xc9\x11\x8e\x92\x75\xdc\x72\x19\xf2\x81\xd0\xd1\xef\x71\x58"}, -{{0x49,0x84,0x6a,0xda,0x7a,0xe6,0x84,0x97,0x1d,0xd9,0x17,0x10,0x79,0x90,0x90,0xb3,0x7f,0xe5,0xad,0x56,0x1d,0x72,0xa3,0x5f,0x2e,0xfb,0x40,0x5f,0x19,0x6a,0xb0,0xec,},{0x4d,0x37,0x0a,0x81,0x94,0xa3,0x04,0x5b,0x09,0xb3,0xbd,0xaf,0xa2,0x7f,0xb9,0xac,0xd5,0x99,0x43,0xa5,0x4a,0xe1,0x4c,0xba,0xaa,0x22,0x00,0xeb,0x0f,0x3d,0xa7,0x1b,},{0xa5,0xc8,0x09,0xd1,0xca,0x4c,0xfb,0xb3,0xdc,0x70,0xa2,0xa3,0xa1,0xf2,0x67,0xc2,0x73,0x30,0x42,0x07,0x19,0xe3,0x60,0x62,0x18,0xa1,0x47,0x1c,0xac,0x57,0xcb,0x67,0x4b,0x9b,0x42,0x82,0x7c,0x5e,0x9a,0x7b,0x25,0xc8,0x13,0x9c,0x13,0xdf,0xf6,0x0b,0xde,0x6c,0x2d,0xba,0xd3,0xa8,0x36,0x11,0x97,0xc1,0xfb,0x19,0xd2,0xcd,0x52,0x0b,},"\xab\x39\x8d\x94\xf9\x28\xb1\xd4\x21\x02\xa3\xe5\x13\xcc\xd1\xcb\x10\x89\x90\x11\x03\x94\x10\xa8\x88\x8b\xba\x26\xdf\x1a\x03\x72\xbd\xba\x0c\xe8\xd8\x54\xaf\x51\xe9\x33\x0a\x8d\xaa\x93\xc1\x05\x80\x90\x6a\x8a\xc7\x2d\x29\x4a\xeb\x95\x66\xfe\x1c\x78\xba\x84\x71\xc0\x6c\x4a\x8a\x75\x11\x3b\x34\x89\x3f\x62\x76\xed\x81\x32\x92\x05\x3b\x95\x6a\x46\x5d\x84\x7d\x2e\xce\x86\xe2\xda\x8a\x9f\x0f\xe3\xdb\x52\xa5\xaa\xc7\x46\xef\x96\x48\x5e\xf8\x1f\x13\x62\xb5\xa4\x2e\xaa\xee\x1f\xbb\x06\x46\x70\x44\x71\xa2\x1b\xf7\x63\x67\xbe\xaa\x07\x81\x2b\x3d\x32\xad\xcd\xed\xde\xd7\x53\x9e\x3a\x50\x1b\x83\xc0\x5b\x19\xa4\x9b\x52\x0e\xde\xdc\x9a\x78\xa5\xfc\x2d\x50\x12\xf1\xd4\xe3\x81\x84\x4e\x79\x2e\xd9\x0b\x0f\x57\xbc\xe3\x75\xc7\x5a\x65\x8b\x2c\x78\xc6\xff\x7d\x9e\xfc\xd4\xbf\xa3\x5c\x47\x68\xcb\xb1\x95\xe4\x82\x3d\x9b\xbd\x83\x5a\x37\x4f\xa0\x4c\xa1\xea\xae\x9c\x56\x6d\x8f\xd5\xaa\x7c\xa5\xef\xe0\xdf\xc3\x17\xff\xfa\x40\x9e\xf1\x02\x2f\x1c\x3b\x37\x6a\x93\x5a\xf5\x57\x08\x3e\x95\x28\x7b\x07\xa9\x8a\xc6\xc1\xb7\xbd\x8b\xb2\x6b\x60\xfa\x7c\x4b\xc9\x19\x73\xb2\x01\xb2\x99\x22\xb4\xb9\xd0\x3d\xd6\x88\x2a\x0b\xd3\xb7\xd9\xe5\xb8\x1e\xe7\x4c\x36\xbe\xc6\x65\xe4\x34\x3c\x8c\x9a\xd3\x36\xda\x38\x50\xc9\xb2\x69\x7f\xe1\xcc\xe2\x9c\x37\x86\x22\xa3\x3c\x24\x8f\x44\x8c\x88\xf4\x8d\xf0\x26\x01\x43\xb2\xa3\x42\xf1\xdd\xee\x74\xd3\xb9\x7c\xa3\xe1\x16\x6b\x15\x69\x93\xda\xd3\x0c\x49\xd8\x10\xd7\x40\x48\xbc\x6d\x46\x76\x52\x00\x4d\x7e\xdb\x65\xc6\xda\xc3\xa2\xc5\xd3\x00\xb9\x7e\xe3\xa1\x0a\x9e\x14\xb6\x9f\x3c\xad\x67\x59\x72\x96\x2e\x1f\x8e\xd9\x75\x47\xad\xed\xc4\x7d\x1c\xf3\x47\x1e\xf3\xb2\x2f\xdb\xf7\x8e\x34\xf3\x1a\x3b\xb7\x66\x9c\x41\xbd\x92\x92\xc3\x80\xbc\xe9\xa4\x2d\x84\xbc\x27\xac\x92\x8b\x8b\xfc\x3c\x63\xd2\x0c\xcd\xb4\x78\xdf\x7d\xdf\x42\x1f\xb1\xcd\x90\x5f\xfc\x4c\x04\x78\x6f\xd9\xae\xf0\x6b\x89\x38\xab\x8e\xf5\x22\x21\x7b\x2c\x04\x51\x5f\x61\xa1\xc3\x12\xea\x83\x25\x3f\x84\x58\xc0\x91\x8f\xcf\xe8\x74\xe6\xe7\xfb\x11\x27\x5d\xb2\xa2\xec\x79\xa2\xd8\x68\x30\x32\x33\xc1\xb6\x97\x95\x2a\x3b\xfd\x3a\xd0\xa6\xf6\xcd\xd5\xe7\x2c\xc9\x40\x9f\x74\x10\xa4\x0d\x5b\x45\x36\xdd\x46\xeb\x16\x11\xae\x86\x70\x36\x71\xb3\xa0\x51\x5a\x03\x77\xbe\xa1\x56\x54\xba\x0a\x0d\x1e\x4e\x96\x02\x63\x28\x42\xf2\xac\xd4\xef\x99\x32\x36\xe9\x93\xf2\x65\x0d\x59\x92\x3f\x24\xe2\xcd\x30\x93\x2d\x8b\xf8\xae\xec\x64\x44\x72\xba\x46\xa0\x78\x81\x49\x6c\x92\xa0\x13\x5c\x67\x5a\xeb\x0c\xe6\x18\x10\x88\xdb\x8f\x15\x6c\xfe\x74\x35\xca\xc6\xc9\x7d\xa6\x37\xdb\x4a\x89\xf5\x13\x31\xda\x13\x73\x1e\x74\x1f\xcc\xc0\x35\x55\x42\xce\x11\xef\xa6\x9d\x05\x38\xd3\xef\x12\x7a\xa6\x87\x45\xed\x30\x85\xd2\x9d\xa9\x0d\xc5\x83\x70\x1b\x6b\x3a\x70\xa3\xef\x3e\x16\xa9\x24\xb3\x32\x03\xb9\x23\x96\xc4\xb9\x45\xf1\x27\xa7\x88\x8f\xa0\x50\x15\xc0\x60\x30\x07\x56\x67\x29\x23\x7c\xc0\x78\x2b\x30\xc0\x20\xd9\x95\x95\x47\xfe\xec\x9f\x4d\x67\x64\x60\xbf\xe0\xc5\xc1\x9c\xea\xba\xee\x06\x82\xdb\x8b\xe6\x91\x35\x18\x1e\xc0\xfd\xd9\xf7\xa6\x6d\x50\xbd\xc3\x79\xe4\xa2\xc5\x98\x17\x8f\x95\x93\x94\x6a\xca\x64\x05\xb1\x77\xfc\xad\xe0\xf8\x64\x21\x58\x3e\xd6\x7e\xba\x18\x72\x22\xa1\xe4\x44\x95\xb3\xae\x54\x4f\xdc\xa2\x8e\x2c\x14\x48\x5e\xab\x04\x71\xaa\xa8\x03\xc2\x9a\x9d\x8a\x48\x92\x67\x64\xfc\xa1\xdf\x51\x40\x7a\xd3\x3e\xc1\x7e\x94\x1e\x6e\x26\x17\x23\x7a\x84\x30\x98\x73\xdc\x71\x36\x55\x87\xbd\xe4\x27\x4b\x5d\xc3\x27\xcc\xb1\xe1\xe9\xc8\x57\xe0\x42\xcc\xca\x8d\x85\x52\xba\x28\x8c\x97\x8c\xfa\x0a\xf9\x9d\x67\xcd\x03\x40\x60\x62\x8e\x23\x52\x5d\xbc\xa2\x07\x67\x9c\xe2\x96\x90\x87\x84\x48\x55\x3c\xd3\x86\x75\xbc\xe0\x7b\xf9\x7b\x93\x17\xdc\x44\x46\x8b\x76\x8b\x15\x8b\x0c\x11\x1d\x63\xa5\x72\x23\x56\x55\xc4\x0e\x16\x59\x7c\xa0\x59\xf4\x0c\x3d\x8a\xc5\xbd\x61\xa4\x87\xc1\x53\x13\x84\x6a\x70\x4a\x78\x11\xb8\xbc\x0c\xee\x61\xe3\x47\x62\xb6\xc1\xb7\xce\xa1\xc4\x6e\x60\x87\xe9\xa3\x6f\x89\x91\x8a\x25\x8b\x3f\xa7\x76\x20\xbe\x10\xc1\x84\xc3\xfc\x39\x73\x90\x24\xe9\x82\x78\xfd\x65\xb8\x2c\xad\x83\x69\x9f\x3a\xd8\xc6\xec\xcb\xec\x8b\x7b\x1b\xd7\x91\x4d\x3f\x6c\x3d\x02\xbf\x40\x28\x3b\x1c\x1f\x1e\x98\xe3\x08\xbe\xae\xbb\xf8\x94\xb8\xf5\xe9\x1b\xbb\xc6\x25\x35\xf9\x23"}, -{{0x83,0x34,0x3e,0x37,0xad,0x09,0x1a,0x85,0xee,0xc3,0x70,0x70,0x1b,0x81,0xa5,0x8f,0x93,0x70,0xa4,0xb0,0x42,0x3a,0x07,0x0d,0x60,0xf9,0x2d,0x8d,0x18,0x09,0x84,0x4e,},{0x50,0xb6,0x8b,0xf7,0x26,0xea,0xbc,0xa5,0x3a,0xc6,0xc9,0x0d,0x4e,0xac,0x55,0x47,0x03,0x71,0x2d,0x22,0x10,0x55,0x54,0xf0,0x5b,0xf7,0x9f,0x9d,0x08,0xfc,0xc4,0x93,},{0x9c,0x69,0x89,0xcb,0xe1,0x7e,0x16,0xca,0xa2,0x53,0xff,0xb1,0xa6,0x4a,0x10,0x6f,0xb0,0x17,0x82,0xc9,0x9b,0x17,0x22,0xba,0xf1,0xac,0xaa,0x42,0xae,0x5b,0x36,0xb7,0x9b,0x2a,0x2c,0xd8,0xfc,0x91,0xf5,0xad,0x89,0x23,0x81,0x70,0x25,0xa7,0x78,0x25,0xa0,0x5d,0xf8,0xc4,0x17,0xec,0x53,0xc4,0xa3,0xaa,0x1c,0x0e,0xfd,0x5b,0xbe,0x0f,},"\xc7\xda\xdc\xac\x5d\x87\x95\xe1\x74\xb6\x91\x38\x91\x2e\x70\xff\x41\xe7\xa7\x25\xfa\xf3\x85\xb7\x73\xed\x15\x09\x89\x72\xb3\x0d\x9b\x73\x93\x72\xd9\x75\xb4\x80\xcc\xfd\xfc\x58\x0e\x2e\x2d\xdf\x5e\x3c\x27\xee\x79\x12\x79\xab\x95\xe4\x38\x2b\x14\x59\xdd\x8d\x41\xae\x36\x0d\x4a\x87\x88\x46\x69\x29\x24\xfe\xef\x39\x0c\x0d\xbb\xfa\x35\xe4\xb8\x2d\x7c\xbc\x33\xee\x15\x81\xc5\x2b\xd9\x49\x38\x5b\x2e\xe4\x02\x63\xa5\x7d\xa1\x17\x4b\xb4\xac\xad\x37\xcd\x8a\xe2\xa6\xb4\x5f\x7a\x6d\x6b\xbe\xf5\xa7\x98\xce\x85\xb9\xe0\x5e\x76\x47\xe3\x34\xec\xfc\x77\x63\x78\xde\x17\x4c\x49\x7c\x0f\x40\x75\xe6\x25\xaf\x7a\xed\x50\x2c\xd1\xcf\x7f\x58\x8d\x0d\x80\x7f\x02\xe3\x2f\x43\x00\xf2\x28\xa5\x0a\x66\x7b\x5a\xd1\xfb\xbc\x17\xe0\xb3\xc5\x70\x51\xdd\xc6\x02\xf5\x76\x07\x9f\x6f\xc5\x88\x9b\x7f\x29\x00\x71\x13\x34\x42\x0f\xc6\x66\xf6\x6d\xba\xff\x41\x26\x33\x6c\x35\x3f\x1e\x5b\x56\x4a\x66\x45\x37\xf8\x37\x86\xda\x5c\x56\x27\x74\x54\x06\xd7\xb2\xfe\x32\x33\xbf\xd5\x8e\xf4\x64\xa0\x6c\x95\xcf\xd0\xb9\x88\xa7\x6d\x05\x3a\x64\x4b\xcc\x15\x9c\xad\x53\xa7\xc5\xdb\xb4\x0e\xef\x5c\xd0\x47\x05\x6a\x3f\x09\x26\x5b\x13\x25\x69\x9c\x7d\x15\x9d\x5c\x90\x24\x40\x17\x33\x57\xff\xab\x8f\x7a\x5e\x38\x9f\x46\x8c\x33\x3b\x78\x2f\x80\x17\x0a\xe9\x09\x83\xaf\x15\x3f\x2e\x73\xbd\x2b\xef\x12\x5e\x3d\x38\x68\xc2\xab\x9e\xcf\x03\xaf\xf7\x6e\xcb\xeb\x18\x16\x7c\xa2\xf7\x11\xcd\x56\x58\x51\xd7\xf0\x4e\xe9\xd9\xb0\x1b\x6d\x83\xa7\x60\x57\x22\x62\x0d\x28\xc8\x4d\x6c\x1a\xf4\x2f\x6a\x76\x92\x58\xf5\x3c\x1f\x66\xda\x36\x66\x6d\xa5\xca\xa9\xbd\x9e\x8f\xbc\x16\x92\x11\xb1\xae\xd9\xc2\x55\x8f\x6a\xaf\x5b\x14\x5a\xbc\x72\x1a\xbb\x00\x72\x01\x94\xe0\x27\x03\x54\x68\xbd\xe3\xfe\x0b\x88\x88\x4f\x4e\x9b\x26\xe7\x71\xe6\xc7\xa0\xa5\x5e\xa3\x6f\xc5\x0d\xec\x8c\xef\x16\x2f\x9b\xba\x5b\x4b\x16\x10\x5a\xfd\x6e\x37\x4e\x03\x8d\x5c\x85\x87\xcf\xd7\xdd\x88\x29\x0b\x2c\x9c\xab\x45\xa2\x64\xd6\x54\x0e\xa1\x41\x6e\x6e\x4e\x74\xa1\x2f\x45\xa2\xef\x13\xcc\x8a\x36\xe7\xb0\xa2\x6b\x90\x2c\x3d\x96\xe2\xe2\x22\x92\x02\xe2\x57\x65\x69\x4b\x94\x33\x73\xd1\x6e\x60\x0b\xd7\x86\xd9\x55\xa4\xb3\xf1\x02\x16\x40\xc3\x9a\x0b\x6c\x69\x15\x00\x28\x1a\xe0\xd0\x98\xcc\x7f\x38\x5e\x18\xa0\x7e\x62\xfa\x4a\x10\x1e\xf5\xb7\x85\x51\xfa\x29\xbd\x15\xee\x03\x53\xa1\xa5\xef\x9b\x21\x6e\x8b\x0f\xa5\x07\x50\xa3\x41\x62\xb6\x35\xa0\xbc\x5e\x5d\x72\x30\xaa\x19\xaf\xa1\x28\xab\xa6\x42\x2d\x38\xeb\x77\xa3\xf0\xbb\x9d\xd8\xe4\x65\x2f\x12\x07\x0a\x37\x36\x1c\x37\x25\x50\x3c\x9d\x22\xe2\xfa\xce\x2e\xa7\x4a\x70\x02\x40\x62\x47\xdd\x86\x97\x5f\x07\x57\x5c\x9e\x7c\x6f\x41\xb5\x3b\x26\xd5\xcf\x52\xc5\xac\xc2\xc5\xd9\x82\x71\x43\x4e\x9f\xa5\x09\xc6\xdf\xbd\x72\x43\x72\xaa\x5c\x13\x45\x1a\xae\x39\x3d\xe0\xa1\x86\x46\x4f\x5d\x33\x7e\x9f\x62\x7b\x4f\x1c\x29\x09\x46\x70\x65\xe8\x9a\x42\x2e\xc4\x0e\xe1\xd8\x0a\x13\x39\x00\xa6\x2f\x4e\x4f\x7e\x94\xeb\x72\x61\x5e\x7e\xc2\x99\x6c\x6c\x24\x30\xc3\xe9\x57\xce\xae\x21\x05\xa1\xe9\x0e\xae\xac\x0d\x31\xaf\xfa\x9f\x57\x92\x6d\x71\xd9\x72\xa9\xa2\xde\x11\x25\x8c\xc1\xe7\x28\x59\x9c\x9f\xb3\x87\x24\x91\x84\x7e\x10\xc6\x7e\xfa\xef\x6b\x69\x6a\x03\x0f\xf0\x53\x3a\x58\x3b\xea\x1d\x04\xdf\x25\xf7\xee\xf3\xa1\x3b\x8e\x31\xaa\xd1\x33\x85\x7d\xf1\xb4\xe5\xff\xbd\xee\x37\xf4\x0f\x38\xd2\x24\xc7\x0a\xe0\x4e\xf3\x3b\x41\xb0\x2e\x71\x91\xa8\x66\x56\xb0\xd7\x2b\x2c\xbb\x53\xc4\x90\x8c\xa2\x06\xf7\x57\x34\xb2\x77\x08\x15\x4f\xcd\x8a\x97\x42\x9c\xfd\x1f\x2d\xa2\x42\x97\x78\x43\x80\x03\xf5\xb5\xb9\xc2\x1d\x9e\xd2\x3b\x8a\xd8\xa2\x28\xeb\x4f\x65\xc2\x4c\x1c\x59\x69\x9a\x5c\x90\xaf\xf7\x73\xe5\xc6\x76\xdb\x36\x2a\x19\x30\xba\x16\xab\xa7\x6e\xf8\xda\xa4\x2b\x3e\xb2\xcc\xc4\x5c\x93\x4d\x23\xd4\x92\x9a\x7a\xd9\xe3\xef\x46\x8b\x06\xa4\x99\x5c\x80\xdd\x23\x6a\x7b\xcf\x38\x79\xd8\xb7\x94\x67\xf7\x2b\x33\x84\xc1\x60\xcc\x18\x17\x14\xe9\x2f\x20\x35\xe7\xb9\x72\xa2\xcc\x52\x42\xd9\x32\x52\x5e\xae\x7c\x50\xbd\x26\x3b\x0f\xa0\x9c\xbd\x9d\x6f\x98\x4b\x9c\xf6\x15\x2d\x9a\x13\x3c\x27\x84\x32\x02\xd1\xe8\x7f\xa5\xa6\xe1\x23\x5d\x9c\x75\x6b\xb8\xe6\x8b\x05\xb9\x8d\xa5\x41\x95\x22\x3f\xdf\x02\x10\x25\x32\x50\x63\x3c\x11\xc5\xf6\x0b\x5e\x67\xd7\xee\xfc\xaa\x6c\x2d\xaa\x52\x31\x37"}, -{{0xda,0x01,0x32,0x21,0xb2,0xf5,0x88,0xaf,0x40,0xe2,0x11,0xa0,0xf9,0x75,0xd4,0x4f,0x9d,0x65,0x02,0x81,0x60,0x51,0x4c,0x39,0x61,0x89,0xf2,0x7c,0x7b,0x06,0x66,0xea,},{0x07,0x11,0x7c,0x6b,0x0d,0xb5,0xb6,0xfd,0xa1,0xed,0xc4,0x39,0x6c,0x47,0xc2,0x2b,0x54,0xee,0x0c,0xe5,0x37,0x5c,0x3e,0xc6,0x33,0xc8,0x3a,0xfc,0x53,0xad,0x6c,0xe4,},{0x10,0xcb,0x52,0xd6,0x10,0xe4,0xa8,0x1d,0x32,0x86,0x9b,0xff,0xce,0x38,0x07,0xe6,0x39,0x1f,0x78,0x2f,0xcd,0x53,0x8b,0x55,0x4d,0x09,0x03,0x7f,0xda,0x72,0x28,0x5b,0x96,0x62,0xb1,0xb1,0x10,0x7c,0x40,0x81,0x78,0xac,0x00,0x9f,0x05,0x25,0x96,0x73,0x88,0xa7,0xd8,0x5f,0xa1,0x23,0x59,0xd3,0xce,0x38,0x75,0x03,0x7d,0xcf,0x6a,0x04,},"\xbc\x93\xee\x1e\xc4\x72\x8a\xc6\x36\xa6\x24\x8f\xcc\x45\x51\xc9\xd1\x59\x80\xdb\x8e\x5f\x54\xb0\xef\x07\x5a\x71\x97\x0e\x17\x6a\x3c\xb9\x18\x2e\x32\xda\x7a\x8c\x2a\xc0\xcd\x7e\x59\x57\x74\x57\x5f\x9c\x83\x50\x6a\x60\x6f\xac\xe8\x95\x12\x13\x5d\x03\x2a\xb0\x5e\x39\xff\xf9\xc8\xca\x6c\x25\xcd\x5d\x78\xec\xc3\xac\x32\x32\x90\xc9\xc8\x16\x26\x73\x5e\x19\x0e\xb5\xae\x34\x5c\xa7\xa9\x58\x40\x9f\x77\x43\xb0\xb1\x61\x49\x16\x83\x22\x17\xc5\x7e\xee\x1b\x4f\x8e\x62\x2a\xc0\x52\xa9\x3d\xd5\xb3\x9d\x07\x61\xe4\x0e\x9f\xbd\x83\x96\xf6\x0a\x3b\xf6\x66\x0c\x5f\xa9\x9c\xd8\x13\x9f\x68\xcb\xe0\x89\x4e\x5c\x67\xe1\x68\xcc\x74\xb2\x72\x4e\x9d\x91\xd6\x00\x0a\x0c\xec\x58\x7a\x11\x46\x3f\x72\xee\x6e\xd2\x55\xbd\x87\xeb\x30\xfd\x45\x75\x96\xf6\x88\xca\x0e\xa7\x3f\x30\x49\x72\x38\xde\x21\xc9\x3f\xbb\x12\x94\xdb\x61\xe4\xa5\x60\x89\x10\x6d\x1c\xf7\xce\x5a\x65\xec\x3d\x12\x17\x0c\xe7\x84\x0f\x08\x8a\x8d\x0e\x3a\xef\x17\xe5\x31\xde\x47\x80\x03\x57\x02\x58\xe9\x27\xf1\x56\xe7\x96\x10\x65\xaf\xa6\x66\xaf\x38\x58\x2b\x35\x3c\xc4\x77\xba\x77\x5c\xae\x45\x94\x6d\x08\xdb\x75\x21\x59\x14\xda\x32\x61\xb6\x22\x94\xe9\x2a\xfb\x38\x14\x59\xc2\x1d\xda\x4e\xa6\xed\x79\x5f\x79\x25\x7c\x09\x4d\xd6\x08\xdc\x8e\x1b\x7c\x40\xcd\x29\xfe\xa2\x22\x08\x8f\x65\x69\x7e\xa8\x88\x95\xd1\x0a\xce\xa8\x79\x73\x60\xdc\xba\xce\xe2\x69\xc6\x06\x60\x0a\xdf\xfd\xcf\x9c\x7c\x38\x1d\x0a\xd6\x69\x69\x67\xd9\xff\x03\xe6\x1a\x24\x90\x65\x02\xb2\x95\xe7\x6f\x4d\x08\x75\x65\x5b\x01\xe6\xff\xca\xcc\x8e\xf0\x11\x29\xc7\x2a\x58\x46\xb6\x0e\xc8\x00\x17\x37\x4e\x75\xd3\x06\x40\x3d\x9e\xcc\xf2\x64\x95\xd2\x98\x12\x0a\x06\x33\x83\x5c\x5d\x1e\xff\x17\xc9\xc6\x24\x76\xf7\x52\xc8\x97\x10\xad\xfa\x4d\x51\x61\x7b\x59\x18\x17\x3c\xba\x72\x25\x40\xe3\x88\xff\xbf\xfb\x96\x68\x74\xdb\x00\x40\x4d\x06\xb0\xce\x11\x39\xba\x74\x14\x3c\x76\xb8\xf4\xd3\x3b\x21\x16\xe1\xcc\xe1\x75\x17\x3a\x96\xfc\x15\x1e\xa2\x39\xbf\xc2\x0d\x66\xfb\xb6\xf5\x2a\x66\x6c\x0e\x81\xcc\x2b\x80\x20\x91\x06\xe2\x48\x0e\x41\x11\xc7\x0e\x7b\xe4\xaa\xbb\x68\x42\x2f\x0b\x8c\x6b\xa1\x5c\x14\x2f\x82\xe6\xc7\xf3\x78\xd7\x80\x0a\x09\xea\xa4\xda\x25\x3c\x2f\xd9\x1e\x12\x63\xc6\xb6\x55\xbf\x70\x25\x5d\x7e\x3b\xb4\x77\x55\x23\xa0\xa9\xe7\xff\x03\x79\x7e\xe3\xff\xca\x8a\x50\xd1\x0f\x20\xd5\xe5\xa8\x89\xec\x5e\x33\x4e\xf2\x6c\xf7\x99\x8b\x08\x36\xf6\x56\x45\x68\x88\xe1\x37\xf3\x9d\x3e\x43\xe2\xce\x3c\x6e\xf5\x40\xd9\x5d\x9a\x20\xc4\x2c\xb8\xae\x2d\x9d\x0f\x25\xa8\x91\xc3\x63\xea\xd9\xcc\x42\x3f\x9a\x32\x3f\xe2\x32\x28\x1f\xb6\x7f\x5b\xe1\xc0\x78\x43\x61\x46\x04\x68\xa8\x7e\x95\xdf\xa3\x5d\x7f\x0f\xfa\x22\x11\xbe\x6b\x5f\xb3\x2d\x42\xba\x65\x18\xab\x6e\xa9\x37\x80\xf4\x31\xd3\x00\x67\x31\xbe\x44\x40\xe7\x12\x97\x4f\x74\xba\xea\x41\x9f\x40\x22\xfa\x25\x02\xe1\xb2\x39\x8e\x93\x86\x16\x7d\x93\xec\xa9\x2c\xa6\x0d\xd7\xd9\x1f\xe8\x23\x24\xf6\x82\xd9\x4a\xa7\xa8\x6a\xb0\x34\xf8\xa9\xe9\x52\xe8\xfc\x95\xbf\xf4\xdf\xed\x6a\x43\x31\x3a\xbb\x92\x40\x1b\x30\xc3\x3c\x79\xa7\xba\x3e\xfd\xbe\x16\x28\x04\x0f\xba\xf4\x43\xf3\xf9\x80\x84\x6f\xdb\x28\x3d\xcc\xd9\x3f\xab\x09\x70\x8b\x7d\x54\x86\x1d\x74\xb1\xfe\x8f\x10\x70\x1f\x21\x1b\xa3\xd3\x90\xe8\xa6\xae\x40\x77\x39\x64\x6a\x79\xa5\x83\x37\xa7\x17\xa8\x72\x00\x9c\x2d\xf6\x76\x1c\x24\x25\xa3\x2a\x00\x18\xaa\xf9\x64\x64\x70\xcb\xc8\x7c\x3a\x65\xc0\xe0\xef\xfb\xaa\x52\x8f\xe4\x78\x3c\x77\x2a\xb2\x66\xb8\xf2\x82\x68\xcf\x14\xaf\x23\x4b\x15\x81\x6d\x1a\x3a\x49\x1a\xf5\xf2\x97\xe3\x3d\x57\x29\x71\x5d\x51\x2c\x37\x3f\xef\x5e\xcc\x3f\x39\x54\xa6\x0a\x2a\x0f\x64\xd8\x29\x47\x41\x19\xca\x1a\x18\xf1\x05\x78\xd0\x4d\x63\x8d\x5e\xea\xfc\x37\x1a\x94\x6f\x6c\xe7\xef\xbd\x2a\xcc\xe3\x4e\x20\x44\x1c\xde\x9a\x37\xd5\xa8\x7d\xc6\x19\xb0\xa7\x27\x59\x6c\xd1\x2e\x15\xcd\x97\x84\xbb\x91\xf1\x39\x9a\x59\xfc\x0a\x7a\x4a\xf6\x8b\x0d\x57\x5d\x93\x38\x71\x72\x97\x33\x75\xc4\x65\xdf\x5d\x2d\x5e\x06\x1a\x2a\x9b\x23\xb4\x91\x5a\x0a\x8b\x8c\x1f\x09\x42\x09\x4a\xf7\x28\xc8\xc3\x11\x45\xfa\x7a\xaf\x74\xa2\x1a\x3b\x03\x2b\xb0\x9c\x39\x22\x05\xbf\x09\x5b\xda\x98\x6e\x5d\xd6\x62\x7c\x1e\x41\x7f\x65\x03\x26\xdf\xe3\xa9\xc9\x99\x4c\x6e\x0e\x01\x27\x6f\x91\xf2\x98\x7d\x2b\x85\xde\xda\x96\x54\x91"}, -{{0x5a,0x86,0x8f,0xb7,0x5e,0xa0,0x72,0x1f,0x7e,0x86,0xc7,0xbc,0x10,0x6d,0x74,0x13,0xc8,0xcf,0x4d,0x03,0x3c,0xe1,0x40,0x05,0xdf,0x23,0xce,0x4c,0x15,0x5b,0xbd,0x27,},{0x6d,0x1e,0x29,0xf3,0x9d,0xed,0xa2,0xbb,0xfb,0xb5,0x7c,0xb0,0x1c,0xb3,0x9e,0x58,0x80,0x82,0x78,0xe5,0x19,0x6a,0xda,0x1c,0x02,0x76,0x46,0xf2,0x04,0x87,0xd2,0x52,},{0x38,0xc4,0x8d,0xba,0x99,0xa6,0x52,0x4a,0x18,0x8d,0x5c,0xd7,0x8a,0x98,0xe6,0x77,0xdd,0x26,0x3e,0xf6,0xb4,0xdf,0x44,0x6b,0x31,0x0b,0x3d,0xd8,0x9c,0xaf,0xdd,0xb9,0xb1,0x7a,0x65,0xbb,0xa8,0xe1,0x39,0x68,0xbd,0xc2,0x5b,0x1d,0x84,0xb6,0xe2,0x43,0x6e,0xdf,0x31,0xaa,0x75,0x6e,0x3a,0x48,0x72,0x6d,0x6f,0x91,0xc8,0x08,0xee,0x0e,},"\xd5\xaa\x11\x82\x5b\x99\x44\x8c\x80\x63\x06\x23\xd8\xc7\x46\x01\x7c\xfe\x3d\xe6\xfa\x8a\x0c\x6e\xd6\x62\x71\x27\xcf\xc1\xf8\x4d\x4e\x0a\x54\xe6\xa7\xd9\x08\xd3\x71\x9f\x14\x21\xd1\xd4\xc7\x8b\x3c\xdd\x94\x76\x9a\xb6\x03\x3b\xce\x97\x9d\xd9\x0e\x10\x68\x02\xeb\xa9\xa0\x32\x95\xd4\x8f\x9b\x9a\x95\xd5\x7e\xe7\x74\x54\x02\xa4\x80\x23\xbf\x3b\xdd\xd5\xc6\xb9\x1c\x77\x3e\x49\x19\x13\xa3\x8a\xc3\x46\x26\x05\xcf\x28\x2d\xea\xc7\x57\x42\xfb\xd2\x75\x29\x27\x6e\x81\xdc\xce\x8d\xff\x96\x05\x03\x5e\x8c\xf0\x5d\xf6\xa4\x3d\xb1\x51\xf0\x41\x57\x65\xbc\xbd\x1f\x1b\xb6\x68\xad\x62\x73\xb8\x91\xc0\xdc\x4f\x3d\xba\x59\x0e\xa8\x2f\x83\x63\x76\x9b\x9c\x77\x51\x19\x47\x11\x73\x75\xdc\x49\x04\xd4\x8b\x88\xb6\x8a\x25\x5b\x28\x01\x1b\x11\x04\x81\x94\x09\x3e\x98\x20\x7a\xb1\xcf\x75\x6a\xb8\x33\x1f\x8d\x6f\x9d\x5b\xe2\xe1\x19\x05\x73\xe9\x5e\x71\x0f\x2a\x35\x01\xb5\x3a\xa0\x82\x5d\x6c\x12\xdc\xfb\x94\xac\x80\xdc\x10\x82\xcb\x4a\xd2\x62\xe6\xd4\x93\xad\xce\xb6\xbc\x19\x14\x5f\xbf\x73\x8d\xf7\x6f\x21\x34\xfa\x04\xcb\xbe\x44\xff\xc5\x5f\xfe\x5f\x9d\x3e\x9b\xeb\xd1\x59\xa0\x01\xaa\x9b\xf7\x88\x92\xa1\x65\x38\xa5\x20\x82\x3c\xde\x5d\x61\xe2\x9a\x56\xa7\x7a\xb9\x6e\x49\xe3\x00\xd9\x86\x59\x62\xc7\xe7\xfb\x8b\xcf\x5d\xe0\xb9\x38\x29\x7c\x3f\x4d\x6f\x60\x21\xe2\x4d\xfd\xad\x98\x61\x65\x2f\x34\x0f\x42\x1e\x7a\xf2\xc7\x1e\xd9\xa7\x15\x87\xfc\x75\x3b\x11\x55\x49\xb2\xf7\xf7\xcb\x29\x69\x0e\xa2\xb1\x58\xa9\x4c\xd2\xbc\x42\xe7\x06\x3d\x61\x9b\x93\x9d\x52\x3e\x3c\x23\x7e\xb1\xf4\x08\x10\xde\x0b\x44\xaa\x69\x37\x86\x3d\x62\x9e\xdd\x55\x75\xe6\xc0\x47\x52\x61\xb6\x27\x47\x30\x92\x77\x5c\x84\x36\x00\x11\xd5\x7c\x57\x20\x9c\x2e\x87\x5a\x3f\x89\x63\xe8\xb2\x41\xa7\xaa\x75\xef\x30\xc4\xa7\x18\xac\x4d\xd4\x66\xdc\x7a\x3e\x40\xe5\x87\x4f\x15\x7a\x84\x9e\xd3\xa3\xa9\xd4\xae\xb7\xd9\x4d\xf0\x9b\xb5\x5a\x0b\x2b\xc9\xf8\xb6\x95\xc3\x71\x79\x30\x23\x67\x60\x63\x67\xc5\xf3\x24\x82\x8c\xe7\x5a\x94\x4f\x50\x70\x3a\x47\x90\x6a\x80\x88\xf3\xa1\x1c\xfe\x4a\x85\x4e\x01\xf1\x74\x12\x52\xc4\x86\x33\x7d\x06\xb1\xcc\x6c\x6b\x9b\x12\x95\x43\x1e\xe0\x73\x59\x35\x7b\x3a\x78\xef\x50\x75\xb6\x5d\x7f\xed\x5e\xb7\x42\xe5\x10\x15\x98\x44\x4b\x46\x62\x3f\x89\xa3\x03\xac\xc1\x0c\x73\x24\x49\x51\x3b\x70\xdc\x45\x6a\x79\xd3\x7c\x48\xe5\xe7\x26\xc2\xf5\x58\xda\x0a\x1c\x46\xef\xbd\x2d\x92\x03\x26\xa6\x78\xb8\xa2\x2f\x09\x44\xbe\x4a\xf5\x5b\x6c\x71\xf4\x53\xfb\xae\x40\x0e\x6a\xcc\x04\xe0\xe9\x5c\xa2\x00\x16\x7e\x96\xee\x98\xea\x83\x93\x16\xda\x93\xa1\x2c\x2d\x76\xf1\x1a\xee\xbe\xb7\x8e\x65\xea\x48\xf7\xfe\xeb\xbb\x13\x7b\x2a\xc6\x7e\xae\xf0\x2a\x2d\x9e\x64\x71\xdd\x63\x4a\x03\x7d\x4f\x5d\x35\xa2\xf7\x8a\xf4\x1a\x8e\xa5\xaf\x5b\xc8\x15\x0a\x99\xed\x68\xa6\xa0\xcc\xff\x2b\x1d\x79\x65\xd8\xbc\x3e\xf9\x28\x5b\xa6\x42\x1d\x87\xc3\x3a\xad\x81\x03\xa5\x87\xbe\x01\x92\x68\x45\xbf\xbd\xdb\xaf\xc6\x9c\x4b\x92\x52\x88\x67\x20\xd4\x18\x50\x9f\x40\xf3\xdc\xf5\x57\x65\xdc\xcc\x3d\xee\xd8\x27\x72\x15\xe6\x9f\x05\x6b\xa3\x1b\x8a\x30\xb5\x00\x94\xea\x8f\x14\x47\x20\x76\x0c\x8f\x8c\x05\x5c\xf1\xa8\x69\x64\xff\xcb\xb8\xee\x1b\xb2\x18\x12\x76\xea\x99\xa7\xb8\xe7\x10\x67\xfa\x31\x0b\xa4\x47\x1e\x84\x27\x90\x37\xbc\x49\x2a\x55\xde\x20\x55\x48\xe7\x7b\x01\x45\x04\xee\x66\x64\xc4\x98\x8c\xbb\x9e\xd9\x1f\xf3\x2e\x22\x59\xed\x4c\xfd\x61\xa1\x97\xd0\xdb\xc3\x2c\x68\xf6\x54\x9c\x0d\x29\xfc\x45\xf3\x6a\xcb\x26\xb1\x64\xde\x97\xcc\xdc\x37\x90\x0d\x93\xcd\xbc\xf9\x68\x7e\xf5\x3f\x1f\x4d\xa1\xb1\xae\x42\x25\xb8\x84\x20\x9e\x81\xba\x43\x11\x52\x04\x77\xed\x42\x11\xb0\x92\x40\xbd\x7b\x82\x5e\x54\x73\x9f\xe2\x5d\x86\x24\xaf\x04\xb8\x6f\x6d\x11\x06\xd1\x81\x70\xe5\x06\x4d\x1a\x73\xc1\xfb\x1a\x27\xb2\x89\xa9\x48\xd7\x71\xa2\xf6\xb8\xb0\x9a\x63\x5d\xb9\x6c\x62\x51\xc3\x5a\x18\x76\xd3\x69\x62\x66\x99\x41\x6c\x0e\x40\x29\x8a\x68\x1f\xda\xf5\x25\x5f\x58\xc2\x55\x77\x59\xd8\xf5\xdf\x14\x8d\xec\x9d\xbe\x1c\xe6\xdf\x04\x1c\x36\xf8\x3e\x69\xcc\xfb\x4a\xac\xa5\xcb\x48\xfa\x6a\x85\xc8\xff\x66\x06\x15\x24\xd8\xb1\x1b\xd7\xff\xae\xd9\x9d\x0c\xd4\x5c\x42\x01\x0f\x21\xd3\x6c\xc3\x16\xca\x86\x09\x55\x63\x5b\xff\xaa\x7d\x9a\xac\x57\x2d\xcc\xf3\x15\x3d\x42\xee\x8a\x2b\x12\xba\xa5\x7c\x16\x0b\xd0\xad"}, -{{0xc5,0x4b,0xd3,0x43,0x1f,0x26,0x59,0x28,0x1d,0x31,0xe9,0x3b,0x30,0x78,0x76,0x68,0xbc,0xba,0x6e,0x5e,0xe4,0x7d,0xb4,0x6e,0x50,0xde,0xab,0xe3,0xf4,0x8c,0x9e,0xd8,},{0x1e,0xba,0x6e,0xb3,0xf7,0xf2,0x4c,0xdf,0x80,0xab,0xf8,0xa1,0x9d,0x30,0x8c,0x24,0xf1,0xe2,0x5b,0xa1,0x59,0x70,0xed,0xa7,0x11,0x67,0x07,0xb0,0xf1,0x2c,0xf9,0x32,},{0xdf,0x45,0x41,0xdf,0xf1,0xa9,0x79,0x7f,0xeb,0x61,0x7f,0x98,0xe4,0xb5,0x7a,0xa7,0x71,0x41,0x31,0xee,0x8f,0xf5,0x45,0xed,0x50,0x82,0xe3,0x56,0x8e,0xfd,0x1c,0x39,0x9c,0xdc,0x56,0xf5,0x58,0x29,0x91,0xeb,0x87,0x85,0xfb,0x33,0x86,0x4e,0xef,0x7f,0x55,0x3f,0x3e,0x24,0x82,0x62,0xed,0x54,0x8a,0x1a,0x68,0x88,0xf9,0x2e,0x92,0x0e,},"\x6f\x8c\xdd\x75\xe1\xb8\x56\xbb\xbe\x9c\xdc\x25\x53\x7f\xdf\x7e\x82\x36\xcb\x02\x9a\xcd\x39\x84\x49\x21\x10\xd0\xc3\x04\x41\xd4\x21\x84\xb5\xfb\x18\x3d\xa9\xf3\x14\x03\x78\xdf\xa7\xd7\x4c\xcc\x9e\xf5\x00\x19\x3c\xc9\x57\x9f\xff\xa6\x0b\xd2\xa8\xab\x9e\x09\x58\x15\x00\xcf\x06\xcd\x35\xab\xc1\x71\xd9\xd1\x2c\x65\x80\xd9\x68\x2f\x9f\x49\xfe\x36\xd0\xa3\x17\x72\x38\xfa\x50\xe7\xeb\x4c\x27\xe4\x60\xf5\xe4\x58\x0a\x56\x56\x8a\x19\xe0\x3d\x95\xb0\xff\x4f\x4a\x23\x18\x24\xcd\x2f\x34\x42\xe0\xba\x40\x0b\xc1\x1b\x7a\x98\x9d\x50\x1f\x5d\xf3\x5e\x43\x01\x50\x8f\x72\xa8\x52\x01\x4b\xfb\xf4\x00\x1e\x28\x09\x54\x73\xd9\x65\x9e\xed\x60\x67\xba\xf6\x8f\x92\xbe\xf3\x12\xc0\x9b\x19\xaa\xf7\xc4\xfb\xa3\xd9\x02\xb9\xf6\xcf\x95\x2e\xb9\xb9\xa5\x3c\xa8\xbc\xbd\x04\x2d\x84\x2e\x98\x53\xb6\x72\xa1\xd0\x09\xd8\x23\x83\x8b\xeb\xe5\x63\x7c\x4c\x07\xed\x1b\x19\x48\x55\x4b\x23\xb3\x2d\xe1\xd6\xc1\x16\xf9\x33\xb3\x54\xf2\x8b\xbb\x77\x9f\xa6\x54\x8c\x48\x29\x2b\x61\x2c\x7f\x55\x1a\x75\xfb\xc4\x6c\x02\x73\x6b\xf9\x9e\x9c\x8e\xad\x56\xf0\x5a\xb0\x42\x7a\x6e\xc6\x16\xe3\xdc\xc7\x75\x7e\xfd\xb7\x62\x8d\x4e\x96\x32\x5f\xe0\xae\x25\x4c\xef\x5c\xb7\xa7\x04\xb3\x5a\x92\x0c\xb3\xfa\x2a\x03\xe9\x61\xda\xf3\x71\x82\x1b\xe0\xb3\x0f\x19\xae\x49\x52\x44\x1e\x08\xa7\xd2\x2f\x54\x31\x39\x0a\x5b\xe8\x09\x7f\xd5\x79\x7a\x1a\x62\x97\x66\x4d\xa4\x2c\x20\x08\xd0\x32\x10\x60\xeb\xe3\x18\x1e\xb7\x95\xa7\x28\x92\x58\x08\xda\x78\x67\x29\x3b\x72\x08\xf3\x77\xd3\xa7\x71\x18\x5e\x6d\x2c\x1c\x8c\xe1\x83\x76\xfe\x3c\x0c\x14\x58\xc7\xf5\xbe\x34\xf4\x28\xa0\xd5\x75\x93\x10\x74\xc9\x7c\xbf\xce\x8a\xd8\x13\x13\xec\xca\x73\xa9\xf3\xdb\x43\x4f\xba\xd4\xbb\xbf\xf5\x02\xbf\x72\x97\xe1\x7a\x97\xa8\x86\x42\x11\xe6\x78\x9b\xa1\x92\x03\x6e\xa5\x9a\x34\xd8\x4f\xf2\xa1\x11\x07\x4c\x3f\x23\x73\xb1\x01\x11\xb5\xda\xa7\x89\x56\x0c\xb3\x54\x90\x95\x4c\x88\xea\x00\xc4\x10\xdf\x85\x0a\xd0\x0c\xae\x2f\x28\xe7\x19\xfb\x06\x71\x69\x88\xa9\xbb\x0b\xfc\x6c\x98\x9d\x58\x7e\x56\x85\xae\x88\x3c\x2c\x2e\x74\xdd\xbf\x91\x5c\x98\x56\xaa\xe8\xf3\x28\x8f\xc6\x25\xbf\xb2\xfe\x26\x8d\x74\xf5\x9f\x8b\x7d\x83\x63\x74\x97\x69\x16\x90\x07\xd5\xe6\x7b\x7d\x0b\x8c\x8f\x5a\x9d\x9f\x9c\x7b\x74\x5c\x0a\x42\x94\x76\x2c\xbe\xca\x42\xd5\x38\x49\x61\xe9\x21\xa7\xef\xb6\x5d\xa8\xd1\xe0\x3b\x67\x45\xcd\xf3\x08\x09\x7f\xb1\x3d\x64\xfd\x2f\x8c\x10\xfa\x95\x09\xeb\x2d\x91\x38\x7f\x00\x64\x5c\xa7\xd0\x48\x3b\x2c\xd1\x4c\x20\x6b\x8d\x7a\xe0\xa3\xfb\x7c\x09\xbc\x68\x43\xd1\x02\xad\xcd\xa1\x9f\x8b\xbd\x85\x1e\xb6\x83\xc4\x43\x5c\xeb\x4b\x3d\x23\xd3\x8f\x56\xd4\xd1\x11\x4e\xef\x0f\xc6\xf2\x4d\xf5\x27\x70\xd8\xf1\xf3\xf8\x2f\x47\x20\xe8\x92\xb3\x15\x24\x4e\xf5\x6c\x36\xb2\x3f\xcd\x40\x79\x78\x52\x41\x40\x38\x2e\x11\x74\x0f\xd4\x6f\xe4\x29\x99\x23\xf5\x2b\x88\xb4\xa9\xcf\xf4\xb2\xb4\xb2\x3a\x2e\x76\x0a\xd8\x1c\x78\xba\x87\x69\x31\xd9\xaa\xa4\xbe\xed\x40\xfb\x10\xa7\x99\xeb\x30\xd3\x7f\x75\x47\x78\xba\xc8\x5b\xf0\x63\x1d\x85\x2b\xe7\xd7\x4a\x64\x31\xf3\x84\xa4\x02\x5c\x10\x91\x42\x1d\x67\xa4\xe9\xc9\x4c\x1b\xe3\x69\x0c\x6b\xf8\x1d\x06\xbd\xaf\x32\xfe\xab\xba\xf1\xdc\x26\x3f\x27\x3a\x0b\x9e\xd6\x54\x60\xba\xef\xce\xfc\xf6\xac\xcc\xda\x0e\xdd\x23\xdf\x9e\x05\x12\x8e\x29\xd6\x61\xc4\xb4\x4b\xd9\x2d\x64\x0f\xaa\x85\x3a\xfd\x83\x70\xe5\x63\xb4\x0a\xe0\x14\x9a\x14\x28\xe0\x6e\x3d\xd8\xe6\x6b\x79\xda\x21\xcc\x75\x3d\xdc\x47\x6e\x3d\x76\xe2\xf3\x6f\x2b\x6c\x6b\xc1\xb6\x50\x87\xd5\xf8\x6c\x8a\xc3\x54\x71\x1a\x8c\x08\xf3\x48\x6e\x47\x9d\x6a\xe9\x43\xf8\x84\x63\x32\xd4\xe5\xb4\xbb\x2e\x82\x57\xe3\x08\x3d\xf4\xf8\x1d\xd4\xf0\xc1\xee\x1d\x97\x18\x21\x66\x16\x1a\x18\x59\x7e\xe0\xb9\x59\xde\x1c\x45\x59\x1a\xbf\x7c\x51\x03\x3d\x7c\x66\x35\x2d\xee\xb6\x82\xe7\x77\xae\xae\x2f\xa8\xd3\xa7\x7f\x47\x0d\xb7\x8d\xdc\x1b\x1f\xc8\x28\x40\xc4\x06\x57\x76\xd9\xbf\xca\x9d\x39\x2d\x92\x88\xee\x91\x32\xaa\x3e\x4f\x2d\x19\xd0\xd9\x3e\x01\xb6\x66\xf3\x64\x7a\xba\xf2\x25\xc2\x92\x41\x9c\x8a\x82\xeb\xa3\xe1\x1a\xb1\x03\x84\x6f\xcd\x49\x35\xf4\x12\x41\x47\x7c\x0f\x15\x2b\x79\x65\xad\x54\xbb\x72\xbc\x3d\xe2\xe0\xb7\x9d\x62\x25\xe8\xfa\x7a\x62\x86\xb5\xfc\xcb\xb3\x58\x22\xe8\x0c\x8b\xfe\xa7\x4c\xb4\x8a\x22\xd2\x41\x38\x53\x95\xc2"}, -{{0xea,0x60,0xda,0x01,0x79,0xbc,0xaf,0x6b,0x21,0x81,0x42,0xb1,0x11,0x90,0x46,0xff,0xe6,0xd8,0x5a,0x74,0x1b,0x0d,0x16,0x62,0x30,0xbc,0x6d,0xe3,0x30,0x4f,0x67,0x73,},{0x50,0x6b,0x2e,0xbb,0x49,0xbd,0x9b,0x9f,0xf6,0x6e,0x6b,0x7b,0x1f,0xab,0x96,0x68,0xcb,0x18,0x1b,0x4f,0xb5,0xe4,0x34,0x3d,0xdd,0xd3,0xf8,0xa9,0xd7,0x02,0x03,0x1c,},{0x27,0xfb,0x6b,0x5f,0x06,0x52,0x8a,0x64,0x19,0x8a,0x3e,0x7d,0x67,0xc7,0x38,0x84,0x0a,0x8c,0xff,0x4b,0x48,0x2b,0x4d,0x52,0x4b,0x12,0x2d,0x17,0xd2,0xae,0xbc,0xc0,0x38,0x9b,0xe2,0xc6,0xe2,0x8e,0x2c,0xdf,0xc4,0x84,0xc1,0x8d,0xe4,0x25,0xdb,0x56,0xcd,0xfa,0x56,0x1c,0x50,0x7c,0xd9,0x70,0x60,0x2d,0x3a,0x38,0x5d,0x3a,0xea,0x0f,},"\x61\x2d\x6e\xf6\xe4\x34\x9f\xfa\xe5\x16\xe9\x83\xe8\xfa\x7b\x52\xd9\xfd\x13\x42\x82\x24\x0d\x95\x14\x38\x24\xbd\x4a\xae\x03\x23\x4b\x76\xa8\xcd\x6d\x40\x68\xcf\x00\x9e\x48\x1c\x26\x85\x36\x1c\x75\x50\x42\xc4\xe6\xab\x87\x03\xec\xbf\x8f\x02\x0c\xf5\x73\x9a\x4c\x2a\x03\xc3\x73\x1e\x9c\xf7\x5a\xee\x25\x96\x61\x53\xb9\x71\x15\x15\xc6\xc3\x9a\xfa\x95\xf2\x21\xac\x33\x95\xb0\x89\xc9\x7a\xc9\xb5\x14\xe1\x7d\x55\xf7\x96\xa3\xec\xc1\x35\xfa\xaa\xee\x90\x7a\xab\x10\x29\x64\x7b\x48\xac\x81\x74\x9b\xab\x26\x62\x7c\xf7\x09\x5d\x74\xc2\xfc\xee\x35\x67\x1c\x8b\xb4\x60\x53\xf5\x15\x1b\x0c\x2e\x5d\xab\xe0\xf2\xd6\xaa\x20\x41\x33\x05\x02\x0b\x2a\xfd\x9e\xe3\x38\x7b\x2c\x9e\xd0\xbc\x3f\xe2\x90\x2a\xf4\x10\x0c\xec\x23\x32\x7b\x0f\x1e\x4c\xa3\x9e\xf6\xea\xf6\xfd\xf5\xd5\xac\xf9\x3f\xc8\x68\x53\x6d\x8c\xba\x40\x17\x69\x32\x9f\xbe\x93\xef\xfc\x7e\xe6\xbf\x93\xa6\xe5\x88\xbd\x55\x1e\xaa\x51\x28\x53\x95\x2c\x81\xb2\x45\xe5\xd2\x29\xd2\x94\xe4\x13\x70\xb8\x67\x80\x86\x67\x88\x7a\x6f\x9e\xba\x2a\x8d\x56\xa7\xa7\x04\xe6\x6b\x1c\x02\xf9\x6e\x73\x89\x5f\x48\x3e\x44\xa5\xc5\x66\xcb\x1a\xf2\x65\x73\xbf\xe2\xaf\xce\x06\xb1\xfb\x58\x77\xe5\x1e\xf3\x12\x6a\x3f\x21\x0f\xbf\x21\x3e\xd6\x5d\x5c\xa4\x6c\x46\xce\x4a\xa9\x45\xbd\x8c\xa6\x11\xe3\x83\x62\x50\xf5\x64\xf7\xea\x35\x42\x39\x82\xf9\x70\x5f\xcd\x6b\xef\x46\xae\x16\xcb\x0f\x6b\xc9\x12\xc3\xf2\x86\x42\xb8\xd8\x77\x75\xb8\x18\xe4\xe4\xe8\x06\x11\x67\x89\x9b\xd2\x7a\x7e\x2f\xb8\x18\x7e\xe9\x91\x7d\x2d\x58\x6b\xf9\xd4\x99\xe8\xfa\xbc\xa8\x3d\xdf\x58\xc7\x43\x7e\xaa\xce\xc4\xf4\x44\xfb\x2b\xf7\x45\xdc\xcd\x8c\xae\x38\x94\x45\x71\xde\xde\x20\x37\xdc\x41\xf0\x81\x8a\x3d\x91\xe3\x02\x0a\x72\x74\xc6\x67\x42\x47\x87\x60\x83\xd0\xe3\x97\x46\xc9\x68\x40\x61\xbf\x74\xad\x58\x84\x36\xce\x1b\x76\x3d\xbf\x4b\xfc\xf8\xde\x6e\x35\xc5\xa7\x62\x66\x75\xc1\x27\x29\x2b\x21\xdf\x3c\x16\xf8\x10\x63\x32\x2a\x75\xf3\x43\x88\x86\xf1\xf0\xce\xbf\xc1\xa9\x6f\x41\x38\x4c\xbd\xd8\x61\xb0\x4f\x51\x9f\xf6\xa9\x34\x4d\x94\xf3\xd3\xa0\xab\xa8\x40\x9d\xfc\xf1\x8d\x01\xf2\xb5\xb4\x55\x17\x16\x39\xee\xa7\x7d\xee\x70\x6e\xa8\x3d\xcd\x2b\x8b\x1f\xc5\xec\x0d\x74\x07\x61\xa5\xf0\x5f\x7e\xc8\xd8\x7a\xd1\xf2\x92\xa5\x0c\x8b\xae\x0a\xd3\x2b\x03\x41\x9a\x95\x0d\x9f\xe3\xb3\xec\xc4\xd8\xd3\xaa\x95\xe0\x2b\x51\xb1\x83\x1d\x83\xea\xde\xaa\x44\x23\x86\x35\xf9\xc6\x5e\xfe\x2f\x67\x44\xa7\x0b\x9a\xe4\x1e\xf1\x5d\x97\x90\x8c\x05\x33\x93\x44\x12\xf7\x95\x83\xd0\xe9\xb3\xd7\x06\xa1\x28\xe8\x8f\xb5\x1e\xed\xb6\x5e\x46\xd8\xa2\xb3\x8b\xbd\xd6\x45\x55\x54\x96\x7a\x8d\xc0\xc6\x8b\xdd\xfe\xae\x0f\x8f\x72\xf0\xb8\x86\xc3\xc7\x41\xfa\xc4\xf9\x1e\x5c\x49\x1d\xba\xe9\xda\x45\x94\x83\x6c\xf1\xd9\xfb\x6e\xe1\x30\x02\x50\x89\xae\xd3\x50\xef\x24\x7b\xc9\x88\x7a\x20\x50\x15\x9d\xde\xd1\x42\x8f\xfd\x9b\x07\xb9\xec\x2e\x3d\x4b\xbd\xc2\xdd\xb5\x4e\x87\x3b\x63\xf2\x47\x52\x33\xe1\x91\x33\xa1\x4b\x66\x58\x50\x94\x57\x00\x81\x86\xd6\x22\x59\x95\xa9\x67\x26\xb5\x29\xf4\x42\x81\xaa\x24\xfe\xfd\x1c\xff\x8f\x81\x5d\x93\xa5\x98\x69\x31\x66\x22\x90\xb3\xee\x16\x83\x3c\x60\xf0\xaf\xce\xf2\xcb\xc0\x00\x62\x3f\x39\x31\x90\x9c\xa9\x76\xa0\x94\xe2\xb0\xfd\xb7\xdc\xf7\xc4\x85\xe1\x49\x88\xa3\x6f\x19\xb6\x64\x25\x38\x5f\x56\x32\xce\xf6\x5d\x1d\x34\x14\x62\x3a\xe3\xee\x81\x6e\x76\x3a\x5f\x60\x64\x66\x62\x2b\xe6\x60\x21\x14\x50\x29\x51\xcf\x0c\x09\x7c\x16\x48\xa7\x2e\x2c\x43\xd9\xaf\xa9\x68\x9f\x2c\x3c\xfe\x02\x6c\xdc\xe3\xbd\x1b\xf9\xeb\xf7\x77\x56\x2e\xcd\x8f\xf1\xb0\xd7\x75\x30\x6d\x90\x04\x43\xf3\x0a\x84\x33\x10\xb8\xde\x6a\x38\xff\x10\x8b\x72\x39\x13\xd7\x89\x9b\x9f\xbe\x7c\x3d\x76\x6e\xf8\xbd\xfb\x6d\x8b\x0b\x52\x95\x6c\xb1\xce\xc9\x93\x6d\x70\xb4\x87\xc0\x14\x40\xa8\x42\xb2\xfa\xbe\x38\xe7\xb8\x85\x1a\x38\x7d\x35\x8b\xe7\xef\x12\xa7\xe4\xf2\xb5\x27\xe8\x30\x90\xd6\x7e\xb0\x13\xc9\xc2\xcf\xd3\xde\x5a\x1a\x3f\x99\x74\x8a\x41\xf4\x81\x9d\x90\x36\xe5\x00\xc5\x04\xc9\x88\xbf\xd2\x4f\x61\x7d\x6e\xbd\xca\xb2\xdd\xea\xa6\x15\x79\x41\x4f\x36\x0b\x46\x9a\x33\xa6\xde\xd9\x6b\xa1\xd8\xc1\x40\xc4\xff\xc9\x49\x90\xd8\xad\xf7\x8c\xd3\x87\x80\xbd\x68\x66\x3d\x1a\x0e\xe3\x3f\x53\x7c\xdf\x89\x2d\x56\x2e\x82\xdc\xd1\xd9\x12\xca\xd3\x8d\x65\x56\x7d\x29\x14\x06"}, -{{0xb6,0x2c,0x24,0x18,0x78,0x27,0x35,0x13,0xe0,0xbf,0x6f,0x33,0xd2,0x10,0x43,0x65,0xb2,0xce,0x9c,0x5a,0x1b,0x78,0x60,0x58,0xe9,0xc5,0xb4,0xd1,0xd1,0x92,0xf8,0x7f,},{0xbb,0xf6,0xfc,0x51,0x98,0xf3,0xfb,0xa5,0xab,0x00,0x7f,0x8a,0x63,0x2d,0x28,0xd1,0xaf,0x86,0x5d,0x29,0x0f,0xa0,0xa9,0x0f,0xaa,0x9a,0x9b,0x5b,0x9c,0x13,0xf3,0xfb,},{0xc5,0x90,0x39,0x58,0x7b,0x38,0xdc,0x14,0x1e,0x05,0x5a,0x93,0x85,0x01,0x04,0xd6,0x29,0xe3,0x80,0x70,0x5b,0x8f,0xc9,0x18,0x84,0x7c,0x5e,0x2a,0x35,0x2d,0xa3,0xa0,0x2f,0xce,0x7f,0x71,0x99,0xf4,0xae,0x2b,0x1e,0x2a,0x59,0x48,0x34,0x18,0x93,0x2e,0x18,0x5f,0x7e,0x45,0xb5,0x05,0x0c,0x64,0x2c,0xec,0xc7,0xe7,0x81,0x99,0x85,0x07,},"\x26\xa3\xc2\x6a\x5a\x18\x9c\xad\x40\x7c\xba\xa3\xa6\x86\x7a\xc0\xa2\x60\x88\xc7\x5f\x9d\x0f\xa1\x9b\xd5\x02\x74\xce\xc5\x75\x5a\x49\x71\x09\xa4\x73\x28\x4d\x6f\xc8\x1a\xd4\xb9\xec\x29\xfa\x7e\xc9\x76\x4f\xd3\x09\x9f\x06\x0e\x36\x83\x65\x52\xff\x24\x13\xe3\xd5\x09\x5f\xe0\xb1\xa8\xbf\xcf\x67\xee\x06\xaa\x90\x32\xe7\xbb\x32\x49\x69\x80\x47\x71\x4d\x28\x14\x15\x27\x3c\x98\x34\xad\x9e\xb6\x65\xa7\xd9\x72\x20\xe7\x2d\x9c\xa7\x3f\x31\xaf\xa7\x73\x86\x75\xba\x31\x62\xef\xef\xe7\x47\x9a\x5b\xc4\xbc\xe2\xe8\xb7\xaf\x47\x41\xd7\x03\xdc\x9b\xbd\x60\xb4\xcf\x4b\x90\x87\xf6\xcf\x86\xcf\x53\xae\xd0\x2b\xf4\xca\x6a\x18\xf6\x07\xcb\x52\xa3\x03\xd7\x8e\x85\xad\x88\xfd\xfc\x86\xdc\xb7\x18\x77\x27\xb0\x3b\xe2\x27\x74\x5b\xea\x74\x4f\xd0\x06\x52\x5b\xc5\x9a\x4d\xdd\xab\x91\x5c\xef\x40\xa8\xf3\x08\x02\x91\x3b\x79\x13\xea\xf9\x74\x33\x65\x52\xe2\xf1\x45\x6a\xd8\x03\xdc\x58\xc9\xb4\xb1\x8e\xfa\xf7\xf7\xe3\x57\xe2\xcd\x77\xd1\x38\xd9\x00\x80\xe2\x96\xd1\x36\x4a\x2f\x32\x4d\x3e\x0d\x6e\xdc\x20\xb8\xbd\xaa\x9d\x2e\x87\x1f\x5e\x7b\x05\x1f\xb6\xfc\xdb\x55\x95\xf2\x1d\x3f\x8d\xe2\x9f\xb7\x86\x78\xfa\x47\x9e\xaa\x32\x57\x9c\x78\x4d\x51\x3a\xc5\xf8\x36\xd9\x54\xd0\xd3\xfc\x0e\x5f\xc8\xa6\xee\xab\x90\x20\x2b\x4c\x4a\x2b\xec\x24\xcf\x63\xea\x67\xc4\x70\x09\x62\x18\xcd\x43\x1e\x88\x31\x05\xfc\x9c\x27\xf9\xea\x77\xc1\x8e\xda\x69\xbc\x00\xa2\x24\x2b\xd4\x20\xf0\x95\xc9\xb9\xa9\x2d\x95\x6c\xcc\x5a\x85\x72\xb0\x57\xa7\xfe\x17\x3e\xeb\x2a\x31\x66\xcb\x20\x89\xd1\x13\xa8\x16\x46\x2b\x25\x80\x5b\x8a\xba\xff\x5b\x0b\x22\x87\xc5\x08\xec\x2b\x8c\x34\xb2\x19\x5c\x33\x28\x70\xd3\xcc\x39\x60\x17\xa1\x6b\x9e\x0d\xa6\x18\x2d\x07\x1d\x3b\xf3\x63\xd3\xf1\xe7\xb7\xda\x11\xd7\x11\x25\x0a\x58\xaf\xd7\x4e\xd3\xe3\x15\x8d\x47\x18\xba\xd4\xd2\x74\xbb\x34\x44\xcf\xc3\x18\x07\x4b\x53\xbe\xba\x44\xa2\xa3\x4f\xf8\xeb\x72\x6e\x4a\x1d\xaa\x91\x10\x51\x62\x16\x51\x89\x8b\x88\x71\x69\xf6\x2b\x9c\x0f\x40\x20\x48\x3e\xf5\x44\xf8\xf5\x72\xfa\x6a\x66\x40\xa4\xcf\xfc\xe9\x76\xcb\x70\x24\xf8\x47\xbd\xc9\x5d\x1d\x7c\xe6\x53\x50\x5d\xeb\xfc\x69\x88\xed\x28\x9d\xd4\x7a\x9e\xb2\x61\x25\x9e\x3e\x65\xe4\x5f\xc9\xd7\x14\x94\x69\x35\xcd\x8e\xa1\x3b\xc6\xdb\x5e\xaa\xb9\xe8\xb1\x0d\xae\x0f\xdd\x69\x79\xc2\x03\x5c\xfb\x80\x98\x25\x2f\x22\x05\x44\x3b\x80\x88\x16\xbf\x77\x87\xb7\xf1\xe7\x8b\xc9\x8a\x72\x85\xe7\x33\xd4\x5f\xc4\x61\x0c\x20\x97\x7c\xa3\x22\x98\x89\xbb\x8c\xd2\xb6\x94\xce\x9e\x3f\xe7\x83\x03\xaf\x83\xe1\x06\x42\x25\x42\xfb\x79\x61\xd3\x2e\xb1\xd2\xc5\xfb\xe6\x07\x51\x67\x4b\x07\x47\x73\xee\x06\x16\xe0\x29\x73\xf6\xa7\x4a\x3a\xe4\x66\x4a\x26\x50\x91\x5a\x3e\x10\x49\x3b\x9e\x66\xa3\x9f\xa5\xc8\x9c\x61\xd4\x47\x35\xf1\x07\xd3\x37\x57\xae\x67\x9b\x43\xa8\xd4\x3a\x01\x75\x7a\xe1\xf3\x27\x9e\x86\x24\x42\xe1\x50\x71\x55\x50\xee\x82\xe4\x9c\x0d\x49\x43\xfa\xf1\x3f\x22\x79\x1f\x0e\x66\xf2\x4a\xc5\x0a\xb3\xc0\x03\x85\x2b\x21\xe1\x5b\x2f\x00\x6e\xdc\x2c\xd6\xa8\x79\xc4\x76\xab\x5b\x35\x2e\xb1\x09\x9d\xad\x4c\x50\x37\x24\x00\xfa\xa5\x49\x8d\x78\xc6\xb8\x57\x03\x4c\x25\xca\xf7\xb9\x33\xfa\xf6\xbd\x7c\x59\xfa\x3d\xa5\x73\x97\xb6\x03\xde\x9c\xb9\xd8\x0e\x51\xf7\x99\x7b\xaa\x46\x2a\xcd\x53\x7e\x2c\x41\x94\xc7\x6c\x7e\x0b\xe6\x51\x2b\xce\x4d\x63\x66\x0b\x36\xc7\xcc\x46\x63\x1f\xb9\x67\x1a\xd8\xc5\xd2\x8e\x2f\x2e\xe2\xed\xce\x81\x95\x44\x21\xb8\xa3\xd9\xff\x6f\x66\x69\x9f\x4b\xce\x88\xbc\xb8\xef\x19\x2c\x26\x2a\x74\xab\x7e\x19\x1e\xee\x91\x01\xa2\x8d\x4b\x66\x28\x2b\x51\x22\x09\x3d\x14\x1c\x64\x96\xc7\xab\xa4\xd3\x52\xe4\x72\xee\x74\x40\xe0\x5a\xf6\x0d\xa0\xcf\xc9\x3e\x30\x36\x42\xba\x8f\xb8\xe5\xc5\x68\x68\x7a\xbd\x63\xaf\xb3\xed\x6a\x32\xb6\xda\xe5\x6a\x7e\x5d\x73\xde\xba\xf4\x1d\x35\xca\x36\xad\xb9\x7a\x22\xc0\xad\xbe\x71\x8b\xec\x1f\xa5\x19\x98\xde\x9b\x4b\x96\xa7\x9c\x5b\x96\x55\xb0\x16\x5d\x5e\x1b\x9a\x8c\xc5\x52\xe8\xc9\x32\x9e\xde\x58\xdf\x74\xc6\x7b\x2b\xa1\xa8\x42\xfd\x3e\x81\x58\xc1\xfe\xa3\xa9\x9b\x56\xa2\xc2\xa9\x62\x07\x85\x3d\x26\x02\x2c\xec\x17\x0d\x7e\x79\x94\x4d\x2f\x56\xaa\xb1\xf1\x91\xbf\xd4\x8d\x72\x54\x90\xca\x82\xb8\xd9\x06\xf0\x68\x0e\x69\xee\xb9\x57\x57\x74\xfb\x9d\x60\x45\x13\xfb\xc2\x6f\x5d\x30\x3b\x68\x85\xca\xc0\xbf\x8e\xfe\xe0\x53\x8f\x92"}, -{{0x0f,0x77,0xf7,0x7a,0x1c,0x7e,0x04,0xbd,0xa8,0xe5,0x34,0xf4,0xe3,0xef,0xf9,0xa2,0x38,0xcc,0x14,0x87,0x6b,0x7e,0x3e,0xca,0x8b,0xed,0xe1,0x92,0x3a,0x33,0x64,0x06,},{0x10,0x45,0xea,0x9f,0xe2,0x14,0x58,0x3a,0x0c,0xdb,0xc4,0x94,0x93,0x2b,0xc4,0x4a,0xfe,0xeb,0x08,0x0b,0xec,0x48,0x5c,0xc2,0x34,0xfd,0xdc,0xff,0x13,0x9c,0xce,0x00,},{0xb2,0x0b,0x9c,0x42,0x46,0xf0,0xd2,0x97,0x01,0x38,0xaf,0x7d,0xc9,0xaf,0x62,0x9b,0x68,0xfb,0xc3,0x7d,0xf8,0x7a,0xfd,0xca,0xdc,0xb5,0x45,0xc1,0x76,0x83,0x76,0xa0,0x9c,0x3b,0xab,0xc3,0xeb,0x1a,0xf3,0xb7,0x51,0x98,0x52,0xf7,0x5f,0xab,0x1c,0x9c,0x11,0x9c,0x66,0x2c,0x58,0x77,0xfb,0x2f,0x72,0x99,0xca,0xb5,0x7f,0xad,0x3d,0x0e,},"\x0e\xcb\x74\x6d\xbd\xb0\x16\x14\x21\xaf\xeb\x7a\xde\xa7\xa3\x7c\x2e\xa4\x40\x8a\x59\x2c\x9d\x78\x1e\xd6\xac\x6f\x4e\xe5\xcc\x65\xd5\x27\x0e\x4c\xf2\x76\x32\xf7\xc5\xc1\x33\xd4\x39\xb7\x8d\x1f\x71\xaa\x6d\xd8\x07\x13\xd9\x0b\x15\x1e\x19\x12\x1b\xfa\x87\x71\x0e\x84\xa4\x85\x0a\x3b\x5b\x02\x65\xba\x26\x03\xd0\x71\x6e\x9b\x7e\x11\x22\x10\x9c\x39\xc6\xf1\x02\x7f\xce\x18\x79\x8c\xbb\x4f\x6b\xc5\xe4\xd7\xac\xa4\x70\x46\x90\xf5\xc9\x81\x51\x08\x71\xc3\x13\x59\x57\x98\x33\x86\x81\x10\x7f\x2b\x57\x94\xd4\x6f\x6e\x0b\xde\x2c\xd0\x64\xb3\xb1\xfc\x00\xca\x47\x18\x8b\xbb\xc1\xf4\xa0\xce\x30\x5c\xc6\xd8\xa8\x96\x92\x0e\xb9\xeb\xae\x57\x9f\xd3\x38\x5f\x8f\x1f\x35\x97\x62\x88\xf4\xc5\x8f\xfc\x47\x60\xf3\x59\xb0\x03\xc8\x72\xe9\xa2\x40\x55\x35\x5e\xa9\x58\x5e\x95\x10\x69\xdc\xa2\x5f\xd0\xcc\x0b\x9d\xb5\x2a\xae\xaf\x19\xd4\x3f\x2e\xab\x4f\x83\x56\x03\xad\x12\xd2\xdc\x49\xb3\x10\x25\x6b\x94\xbe\xd5\x48\x96\xa1\x6b\x69\xb0\x9c\xb4\xc8\xff\x5c\x23\xcc\xe5\x59\x3d\x87\xad\xe2\xa8\x2a\xda\x50\x85\x9e\x15\x44\xc1\x86\x18\xa6\x5c\x00\x7e\xf4\x24\xc9\x85\x4a\x17\x5b\x6e\x6c\x0e\x64\xb2\xc8\xeb\x8a\xd4\xd2\x8b\x97\x7d\x68\xe7\x81\x69\x91\x51\x98\x97\x53\x94\xd3\xb9\xb2\x69\xca\xb0\xd3\x26\x1b\x2b\x56\xcd\x2c\xc4\xbd\xdb\xd4\xf1\x43\x9e\x0d\xbe\x2c\x9b\x3f\x3f\x75\x14\xed\xac\x5e\xbb\x46\x22\xb9\x2a\x69\xa8\x40\xa9\x02\x85\x50\xb2\x21\xdb\x59\xdd\xfb\x00\x13\x96\xf8\x63\x92\xa1\x7f\x08\xcc\xb1\x94\xcd\x9e\x1a\x00\x81\xd7\xdd\x9c\xca\x23\x57\xfe\xb8\xb7\x95\xe5\x17\x02\x9f\x79\xc8\x2a\x3b\xe6\xf9\xa0\x31\xdd\x1a\xf1\xe7\x9e\x49\x82\xbf\x8e\x76\xb3\x10\xf9\xd3\x55\xef\xcd\x5b\x1e\xfa\x9f\x35\x9c\x17\xcf\x3b\x51\x0d\x51\x3e\x8c\xd5\x78\x6a\x0d\x34\x45\xdc\x59\xa8\x43\x3a\x46\x48\x86\x87\xb0\xf5\x8b\x1b\xd6\x56\x7c\x2a\xf4\x87\x3b\x51\xfc\x84\x5e\x76\x7e\x24\x30\x05\x19\x2f\x8f\x06\x74\xf2\x81\x26\x5a\x55\xd7\x6c\xea\x32\x22\x60\xc9\x32\xce\xa6\x71\x7a\xdb\x98\xa2\xdd\xa8\xc6\x98\xe2\xe8\x92\x55\xfe\xb7\x7d\xa7\x64\x81\x67\xbc\x1e\x58\x87\x7f\xeb\x72\xd1\xd1\x4b\x0c\x30\x4f\x07\x37\x2d\x95\x56\x75\x23\x7c\x49\xf7\xa6\xdb\xc9\x15\xe6\x81\x4a\xba\xe6\xcc\xe4\xca\xf9\xf4\x80\x87\xe9\xdf\xb2\x82\xd8\xf3\x40\x37\x7c\x1e\x29\xc6\x73\x1c\xcc\x26\x67\xda\x66\x95\xb7\x12\xbe\x03\x12\xd8\x65\x11\x19\x34\xf1\x68\xd5\x54\x43\x65\xdd\xae\x27\xab\xc6\x4a\xef\xbc\xb3\x22\xdb\x7d\x97\xd9\x0d\x95\x7a\x63\x7b\xd8\x26\xc2\x27\xe9\xeb\x18\x0b\x45\xa4\x31\x62\x6a\x6f\xd8\x90\xc0\xe5\xf4\xed\x7e\x85\x64\x74\x75\x2f\x80\xb5\xae\xf6\xe7\x3e\xfd\xaa\x6c\x2c\x45\x1b\xd7\x4c\x1e\xf4\x66\xca\x3a\xaa\x25\x73\xbb\x52\xcb\x2b\x1c\xa9\x6a\x1b\x57\x44\x03\xce\xae\x1c\xf0\x5f\xfc\x53\x43\x0e\x1e\x4c\xd5\x59\x3b\xd1\xef\x84\xbc\xbf\xe2\x19\xf0\x81\x60\xd1\x66\xf2\x73\x1d\x99\xb8\xd7\xa3\x2b\x12\x99\x1f\x77\x77\x5a\x26\x7e\xc0\x82\x97\xec\x51\x2d\x7b\x72\x43\x56\x32\x52\x5c\x04\x00\x0f\xb0\x0a\x79\x3f\x8b\x5f\x8f\x37\x47\xb5\x53\x59\xdf\x21\xb7\xe2\xc4\x9f\x2b\x0b\x9a\xe0\x82\xaf\xc7\x0a\x14\x68\x71\x37\x0b\x8d\x50\x08\x6d\xe0\x0f\x94\x48\xbe\x89\x02\x17\x4b\xa2\xcc\x85\x1f\xa3\x79\xdd\x70\x31\xca\x45\x7a\x88\x69\xaf\x4b\x6c\x27\x29\xda\xc5\x19\x55\x6b\x8b\xb4\xab\x51\x9e\xf1\xbb\x02\x4e\xa8\xb7\xf0\x17\x71\xc9\xaa\xb7\x48\xe5\x73\x81\xa0\x19\x2a\x6e\x39\x8c\xbe\x6d\xd9\xf3\x67\xcc\x7b\x33\x54\xf8\x3b\x79\xbc\xda\x46\xb7\x93\xa4\xad\xa8\x55\x49\xc8\xd6\xbd\xd6\x16\x81\x24\x36\x2f\xf9\x08\xaa\x1a\x0c\xb7\x8a\xa3\x30\xc4\x2d\x5a\x5d\x48\x12\x35\xac\xac\x3a\x91\x9b\x96\x9c\x50\x98\x72\x66\xd4\x04\xd1\x5d\x0e\x70\x6f\xd9\x00\x76\x34\xf6\x9e\x13\xc5\x6e\xc4\x71\x33\x88\x4f\xca\xdd\xc1\x6b\xee\xee\xd1\x9e\x0c\xd9\x17\xaa\x49\x63\x67\x86\x7d\xfc\xea\x27\x4e\x1a\x47\xda\x77\x4f\x3c\x93\x63\x02\x1e\x7c\x8d\x6b\xf8\xf0\x00\x53\xfa\xcc\x11\xcb\x68\xa9\xd6\xe1\xfc\x2d\x6d\x19\x17\x5d\x63\x24\xff\x7c\xa6\xc2\x30\x58\xb8\xb6\x93\xd8\xfd\x4e\x0b\x51\xdc\xbb\x11\x35\x43\xf2\xfc\xc0\x45\x2e\xb9\xd9\x67\xac\x0f\xa9\xb2\x3e\x9e\x0b\x1d\xa8\xd8\x3a\x3c\x1f\xc9\xe9\xec\x97\x1f\x0f\x67\xfc\x74\x5b\xb1\x73\x76\xbc\x46\x24\x5f\x52\x8c\xb6\xe5\xfe\xe1\x1b\xcd\xda\x86\x7b\x7f\x79\x01\x9c\xf9\xdb\x59\x18\x58\x23\x0a\xec\xb4\xd1\xe9\x3d\x16\x7c\xd8\x6b\x42\xdd\x87\x9a\x13\xfa\x0e"}, -{{0xc5,0xa5,0x05,0x34,0x77,0xae,0x31,0x15,0x8e,0x74,0x69,0xdd,0x15,0x04,0x86,0x76,0x50,0xd4,0x6f,0x15,0x89,0x06,0x7f,0x5c,0xd8,0x81,0xca,0xf2,0x5c,0x26,0xcb,0x21,},{0x70,0xf8,0x5d,0xb9,0x80,0x7b,0x26,0xfc,0xf3,0xe6,0x69,0x0b,0x91,0x72,0x4f,0x7a,0xe3,0xd2,0x0e,0xc3,0x60,0x4a,0xb7,0xd6,0x30,0x8d,0x90,0x94,0x30,0x8b,0x2d,0x59,},{0xf5,0x19,0x1b,0x44,0xbd,0x6c,0xc3,0xea,0x28,0x17,0x71,0xdf,0x12,0x54,0x9b,0xa2,0xbe,0x22,0x8b,0x51,0xeb,0x79,0x1b,0x9e,0x5e,0xd2,0x81,0x5f,0x86,0x2a,0xa6,0x30,0xb5,0x69,0x67,0xcd,0xef,0x8b,0x6a,0xf0,0xb9,0xd2,0x1a,0xb8,0xc9,0x7a,0x6d,0xff,0x68,0x1c,0xce,0xd9,0xf5,0x01,0x97,0x13,0xd4,0x35,0x7c,0xb3,0xe5,0x4c,0x0d,0x08,},"\x85\x71\xff\x39\x03\x48\x6a\x43\xa6\x12\x6c\x32\x3e\x7b\x3a\x74\x14\x1d\x13\x85\xd4\xbd\x70\x3f\x19\xe2\xd1\xb6\x4b\x50\x28\x1d\x27\x16\x8a\xe3\xe7\x69\xc6\xdd\x9d\xf7\xd9\x78\x64\xfb\x37\x82\x2f\x00\x21\x85\x2e\x31\x68\xab\x7d\x84\x5a\x65\x45\xed\x0c\x37\x7d\x9f\x7c\x04\x8a\x2b\x96\xe8\xdc\xf4\x45\x77\x96\x84\xa0\x58\xc2\xb9\xc2\x1a\xc6\x8a\x0c\x34\x1d\x1d\x6c\x09\x81\x45\x64\x57\x45\x8e\xb7\xce\xbf\x66\x67\x87\x40\x77\x7e\xca\x26\xe0\x1e\x1c\x8f\x53\xb5\xd4\x75\x6c\xc5\xf0\xb9\x0f\x0c\x5d\xb0\x53\x93\xcd\x4b\x8e\x44\xf6\x81\x0c\xaa\x5a\x11\x6a\x33\x57\x77\x24\x39\x5d\x41\x3a\xf6\x19\x63\x2a\x6f\xed\x14\xe2\x15\xc2\xf1\x9d\x10\x5c\xe2\xbf\x14\x98\xe6\xd2\xab\x4f\x65\x0f\x61\xba\x5c\xf6\xd0\xc7\x3b\xbb\xde\x98\xe3\x04\x29\x91\x0a\x4e\x67\xdf\xbc\x71\x7c\xb0\x91\x18\x2d\x59\x70\x58\xb5\xd7\x65\xd0\x97\xe6\x87\x58\x31\xb5\x88\xaa\xeb\x3e\x73\x27\xe8\x56\xb4\x2f\xa9\x83\xfd\x25\x4e\xf1\xf9\x18\xb0\x43\xd1\xdd\x3d\x7b\x7e\x30\xb3\x15\x38\x6e\xec\x91\xe7\xf9\x4d\x59\x8f\x4b\xeb\x3b\x27\xb4\x2f\x4e\xe1\xfb\xf7\xaf\xb4\x86\xbd\xcc\x60\x81\xcc\xb8\x67\xf0\x41\x11\x04\x4f\x4b\xbb\xe3\xc8\x12\x2e\xde\xad\xef\xa9\xd6\x93\x90\x6e\x0d\x6e\x13\x3b\xf6\xf2\xda\x61\x58\xfe\xed\xbd\xa0\x24\x41\x0f\x12\x08\x6e\x7a\xcc\xf1\xc6\x8e\x15\x57\xf0\x0c\x14\xe9\xc7\xea\x76\xa5\xed\x13\x37\xa0\x54\xac\x2c\x94\x9c\x05\x97\x7e\x03\x02\x74\xf6\xa4\xf2\xa6\xb3\x0a\x15\xc5\x70\xec\x94\x33\xf7\x4f\x47\x52\x80\x87\xc9\xce\x9a\x62\x92\x95\x1c\x54\x35\x49\x96\xfb\x28\x3c\x0d\xc4\xcf\x33\xc0\x01\xbc\x96\x87\x5e\xa6\xe1\xf4\x6f\x83\x7f\xf1\x8d\xd9\x54\x5f\xb9\x93\x46\x55\x34\x2b\x12\xc2\x99\x0b\x9f\x1c\x6f\xf4\xd6\x64\x89\xd6\xae\xdc\xe7\x5c\x7c\xb0\x3a\xc1\x34\xbf\xd3\x9b\x18\x1d\xfb\x7f\x9a\x97\xce\x73\x7f\xe5\x70\xad\x5f\x81\x34\x59\x39\xa6\xde\x5a\x40\xa3\x3a\x0e\x44\xbf\x95\x75\x03\xd5\xca\x02\x83\x51\x2e\x57\xfb\xa8\xa3\xa6\xf2\xc3\x90\x68\x7b\x1b\x77\x08\x67\x6e\x0f\xd0\x3b\x7c\x18\x8d\x45\x61\xc1\x87\x91\x63\xea\xf2\xb5\x96\xdd\xd5\xf3\xc1\xf4\xda\xdb\xc1\x39\xc2\x16\x48\x92\x82\x0b\x2f\xe0\x9c\xbc\x3d\x19\x08\x80\x76\x36\x45\x10\x25\x4f\x2b\x6d\x41\x03\x29\xe7\x0f\x2e\x5a\x94\x5b\xba\xcd\x2c\xa8\x9b\xd4\xb6\xe1\xf5\xe2\xe1\xd4\xf4\xed\x2f\xe0\x11\x3b\xcf\x32\x96\x2f\x00\xd5\xc3\x3b\x1d\xf9\x88\x40\x2b\xa0\xdc\x88\x04\xc1\xaf\x66\xcc\xae\x26\x70\xef\xa3\x13\x4c\x67\xfc\x90\xfe\xed\x8d\x8d\xee\xdc\xcf\x6a\x46\xf2\x29\x40\x45\x4a\xf2\xbb\x67\x54\xcf\x23\x5d\xdb\xb0\x00\x1c\x6c\x74\x1b\xf8\x74\xbc\xd8\xd4\x1d\x9d\xba\x81\x62\x58\x1c\x37\x46\xd7\xf3\x0e\x73\xde\xf6\x94\x15\xaf\x51\x81\xc1\x49\x91\x42\x95\x12\x2d\x45\x98\x2f\x94\x94\x3e\x20\xb0\xff\xc7\xfe\x6d\xdf\x19\xa0\x22\xe8\x7a\x52\x13\x33\x57\xa1\xe8\x0f\x37\xf2\x8a\x4c\x4a\x8a\x61\xc1\x48\xdd\x87\x5c\x1e\x8e\xcd\xcd\x84\x0d\xd8\x63\xe4\x4d\x9b\xcb\x16\xb6\xe5\xaf\x01\x47\xb3\x4a\x7a\x90\x52\xc8\xd3\xf4\x52\x01\x3d\x2d\x35\x4f\x68\x03\xf9\xea\xf6\x05\x6f\x3b\x01\x3c\x61\x6e\x47\xf3\x98\x81\x91\x46\x32\x0a\x5e\x3d\xbd\xf1\x68\x43\xea\x29\xde\xf2\x62\xcc\x9a\x34\x36\x72\xcf\x96\xbc\xcc\x6e\x87\xe6\xa6\xba\xf0\x71\x2e\x6e\xe8\x9a\xa6\x04\x89\xf1\x7c\xb7\x2d\xdc\x44\xba\xd1\x61\x58\x7d\x87\xf5\x4d\x67\xcc\x0a\x27\x78\x49\x7d\x83\x10\x88\x31\x5f\xfe\xee\x3d\x26\x8c\x59\xbe\xfe\x88\x4c\x3a\xa0\xe0\xae\x22\x96\xbb\xb6\x0e\xac\x90\x97\xcd\xf8\xdc\x09\x87\xce\xb1\x74\x2b\x05\x86\xdf\xce\x79\xec\x10\x42\x5b\x28\xf4\xe6\x45\x20\xd7\x12\xe3\xf4\x6e\xa8\x3b\xe2\xde\x6a\x15\x74\x07\x3b\xc5\xc7\x55\x7b\x8e\x25\xb6\x41\x11\x84\xea\x28\x3d\x88\x00\x23\x2c\x79\x06\x94\x21\x81\x1f\x88\x3c\x29\x94\xe7\xb7\xe2\xad\x9f\x8d\xc4\x89\xc9\x34\x77\x24\x39\x46\x09\xc9\x89\x09\xa6\xc2\x60\x17\xb5\x0f\x20\xd5\x0c\xca\xcb\xde\x36\xb7\x6b\xa6\x46\xa7\x6d\xc6\xa5\xb0\xf5\x06\x49\xc5\x65\x8b\xbd\xfd\xd3\xb5\xca\xfc\x54\x79\xa2\xf4\x8e\xe5\x15\x42\xf2\x3e\x9f\xc9\x21\x32\x06\x0f\xd6\x35\xef\xf4\x52\x11\x1c\xda\xf3\xef\xbd\xb7\xdb\x9e\x7d\x47\x16\xd0\xd6\x01\x1c\x29\x11\x8a\x55\xd4\xc1\xa4\x36\xab\xe2\x4e\x3c\xbf\x40\x23\x5b\x76\xdd\x19\x23\x50\x3c\x5f\x35\x98\x12\x4e\x2d\xf5\x5a\x2d\x1f\x24\x6e\x90\xde\x4b\x71\x64\x5d\x51\x75\xb6\x1b\x01\x74\xe7\xe5\x7d\xf1\x28\x5c\xcf\x8c\x86\xb8\x38\x2c\x25\x80\x79"}, -{{0x05,0xc7,0x19,0xca,0xe0,0x6e,0x2b,0xb7,0xd8,0x78,0x63,0xab,0x31,0x50,0x27,0x2c,0xb2,0xf8,0xc3,0xaa,0x24,0x21,0x91,0x2d,0x87,0xf9,0x8e,0x75,0x89,0x63,0x8c,0xe9,},{0x90,0x21,0x17,0x96,0xfe,0xd3,0xd5,0x3b,0x81,0xf8,0xfe,0xeb,0x1b,0xad,0x1f,0xfc,0x93,0x3e,0x5f,0x10,0xd3,0xbc,0x1b,0x36,0xdd,0xf2,0x10,0xa4,0x79,0x23,0xdf,0x03,},{0xba,0x6e,0xb7,0x51,0x37,0x1d,0xf7,0x21,0xb7,0x70,0x7a,0x5b,0x33,0x39,0xed,0xb5,0x5f,0x13,0x86,0x40,0xb9,0x7b,0xe6,0x33,0x4d,0x6c,0xda,0x51,0x91,0xa3,0xff,0x63,0x67,0x91,0x17,0x61,0x88,0x2a,0x4a,0x00,0x7f,0x16,0x1b,0x74,0x8c,0xec,0x95,0xb1,0x9e,0x99,0x5f,0x28,0x58,0xc2,0x57,0xcd,0x61,0x69,0x25,0x66,0x62,0x30,0x11,0x02,},"\xec\x24\x19\x18\x41\x8e\x60\x52\x20\x42\xe6\x73\x39\xe6\x64\x94\x99\xf3\x1a\x6c\x7c\xf8\x92\x5f\x1f\x61\xdd\xe8\x94\x60\x36\x02\xae\x8b\xb5\xf5\x88\x09\x82\x1f\x83\x34\x4f\x23\xcd\x31\xe6\x4e\xc9\xff\xe7\x9a\x98\x6b\x7e\x29\xe4\x31\x9a\x63\x41\x43\x16\xbd\x6e\xe2\x0e\x02\xa5\x0d\xa4\x40\x12\xbd\x2d\x6f\x9f\x67\x9e\x88\xed\x0c\x8b\xb1\xe2\xca\xd5\x5e\x56\x57\x89\x88\x33\x45\xb7\x54\x6f\x3d\x54\xb1\xb3\x62\xb1\xc6\x50\x50\x2c\x01\x9d\x73\x13\xaf\xbc\x82\x68\x9b\x23\xa3\xa5\x2d\x8f\x1a\xf9\xf8\x1e\x18\x8d\xbd\xf2\x03\xfb\x53\x00\xb4\x22\x5b\xfb\x67\x73\x33\x7b\xe6\x75\x0b\x3d\xb8\x8c\xe0\x97\x34\x3f\x62\xee\x2c\x11\x85\x74\xef\x15\x0c\xbd\x4c\x62\x76\x0c\x3e\x43\xdc\xbc\x39\x21\x8b\xd6\xd9\x85\x65\xfa\x38\x98\x11\xb1\xa6\x74\xf6\x17\xfd\x75\x67\x33\xdc\xb5\x67\xa9\x2d\xbf\x38\x55\xb5\x7b\x1f\x4a\x46\xd5\xb8\x97\x4b\x39\xac\x0d\x0e\x24\xd9\x9d\x20\x37\xc0\x4f\x60\xd9\x14\x0f\x64\xb0\x7a\x77\xd7\xea\xa1\xce\x8a\x78\xe8\x44\xb1\xdc\xf0\xe3\x74\x24\xf3\xf9\xd2\x53\xa5\x48\x56\x1a\x03\x75\xa8\xd4\x34\x12\x97\xbf\xed\xb7\x04\x8c\x79\x35\xe1\x48\x14\x18\xf9\xbb\xa9\x27\x1f\x9f\xd6\x02\x62\x24\xe7\x8e\x05\x5d\x8a\x09\x39\xfa\x2f\xe1\xdb\xc0\xfc\x7b\x58\x3e\x4c\xff\x34\x90\xe1\xd0\xf6\x10\xb2\x52\xe3\x0d\x84\x97\xd0\x0e\x4a\xac\xb3\x75\xf1\x9a\x47\x19\xf7\x9c\xa1\xea\x58\x3a\x2f\x8b\x14\x06\xa4\xaa\x5c\xb5\x5c\x08\xb6\x59\x3b\x67\x6e\xb5\xc3\x4a\xbe\x89\x39\x2d\x62\xd2\x33\x08\xa3\x34\x8b\x57\xaf\xfb\xba\x77\x39\xcd\xe8\xe1\x90\x9d\x34\x25\xee\xb2\x09\x26\xa9\x77\xd3\xa9\x4a\x86\xe0\xba\x10\xb3\x86\x92\x66\x98\x82\x7e\x86\xb4\xfd\x6c\x61\x80\x04\x7c\x87\xec\x3b\x31\x61\x9d\x05\xa9\xdf\x34\xef\xd3\xd7\x6a\x83\x69\x62\xb2\xef\x60\x4d\x07\xaf\x09\x75\xeb\x8f\x3d\xd2\x25\x94\x32\x38\x02\x56\x4c\x92\x9b\x3f\x65\xda\xcb\x57\x2b\x32\x55\x3d\x69\xb3\x1a\x19\x76\x90\xa9\xbb\x86\x0b\x08\x0a\x77\xcf\xbb\x3c\x17\x5a\xaf\xce\x01\x46\xa8\x2a\x4d\x06\xe8\xc7\x50\x52\x1b\x72\x6e\xf1\xcb\x29\xd0\x21\xe5\x91\x5e\x5e\x84\x62\xed\xe5\x39\x54\x45\x24\x5c\x9a\xe8\x82\xee\xc4\xb1\x74\x5e\x11\x79\x1f\x76\x21\xd3\xfe\x70\x2c\xac\x15\x25\xe1\xf7\xb4\x6e\x11\x05\xcd\xd0\x6d\xa2\xaf\xde\x26\x47\x5d\xc1\xf7\x8d\xf8\xe2\xd7\x2b\x0e\xc3\xef\x7d\xd9\x56\x19\x3c\x99\x68\x42\xa4\x32\x69\x65\x38\xcf\x12\x3d\x76\x87\x21\x1f\xfc\xd0\x90\xb9\x38\x1e\xab\xec\x87\x9f\x76\x9a\xac\x0d\x35\x64\xe1\x6d\xf7\x94\xfa\x24\x72\x8d\x71\x72\xfd\x07\x73\x2e\xab\x07\x7e\xd8\x1c\x22\x08\x4f\x6f\x78\x1b\x62\x6d\xac\x67\x42\x8a\x9d\xdf\x3b\x0d\xb0\x46\x52\x51\x22\x0d\x18\xb8\xbf\x62\x04\x64\xc5\x1a\x57\x8d\xec\xcc\xbb\xab\xa5\x45\xed\x44\x2c\xf1\x2c\x4c\x66\xf6\xcb\x6e\x69\x01\xea\x54\xae\xda\x23\x6e\xc4\x5e\xef\x88\x6a\x7d\xdd\x2c\x04\x1c\xab\xa3\xa6\xce\xe3\x39\x71\x5b\x6c\xe9\x7e\x76\x5e\xc3\x47\x9f\x3d\x52\x82\x4a\x81\x94\xbe\xc2\xa8\x96\x47\xe8\xc6\x3f\xf7\x64\x5f\xf6\xd0\x53\x67\xc7\x67\xbc\x48\xcc\x96\xba\xf0\x5d\x6a\x41\x5b\x2a\x5a\xff\x9b\xfb\x21\x79\x48\xfa\xd3\x57\xb9\x8f\x47\xdf\xed\x62\xff\x12\x85\xeb\x9f\x46\x8f\x0f\x29\xed\xd7\x5a\xdc\x0c\x8c\x2f\xf6\xa5\x65\xed\xb8\xed\xfb\x48\xbe\xa0\x3b\x70\xc4\x47\x36\x9c\x52\xd8\x81\xee\xa0\xee\xdb\x08\xc3\x15\xcd\xf0\xbf\xeb\x97\x9c\x1c\x02\x50\x94\x6b\xb1\x00\xc2\x86\x6b\x41\x69\xb8\xcb\xd4\x4d\x65\x8f\x02\x36\xe1\xe9\xf3\xaa\x13\xbb\x8e\x80\x22\xa3\x8c\xe9\x97\xc9\x4b\x5b\xaf\x97\xe0\xba\x62\x1f\x7e\x09\x67\x1c\xe6\x38\xc2\xa3\x9e\xe6\xc6\xe2\x5a\x68\x80\x19\xdd\x16\x76\x75\xce\xae\xc2\x1c\x6b\x42\xa7\xc8\xc4\x76\xd1\x29\xdc\xc6\x93\xc3\x92\xa0\x2b\xe9\x1b\x87\x43\x7a\x08\xa0\xeb\xf1\xa7\xbd\x97\x6b\xa2\x37\x74\x76\x68\x38\xb8\xd6\x02\x4f\x5b\xb9\xb0\x7f\x3c\x6b\x71\x9b\x4d\xe1\x5b\x72\x44\x80\x48\xab\x70\xdb\x3d\x4b\xea\x77\xba\x35\x9b\x51\xb1\xec\x17\xdb\xe8\x01\x0a\xef\x02\x44\xa8\x07\x9c\xa8\xb9\xa2\xa7\x97\xf3\xb1\xfe\x04\x7c\x8d\xd5\xca\xb7\xfb\x48\x68\x29\x23\x9c\x4e\xf6\xd9\xa3\x83\x70\xd4\x88\xc4\x7b\x7c\x03\x0e\x49\xa5\x50\x0c\x9a\xbb\x39\xa9\xa5\xab\xfe\x72\xe9\x18\xb7\x63\x84\xec\xaa\xfe\x16\x27\x26\x6c\xd1\x4e\x69\x6c\x09\xd2\x51\x2e\x31\x25\x82\xa8\xa9\x11\xe7\xb7\xbf\xa0\x4c\x21\x81\x9a\xf6\x87\xf0\x4c\x5e\x0c\xbe\x9a\x2c\xe2\x4d\x4d\x3f\xd1\x21\x90\xb2\x53\xda\xbc\x12\xc6\x3c\xab\xfa\x94"}, -{{0x53,0x11,0xf3,0xc9,0x61,0x01,0xcb,0x8b,0x7a,0xbc,0x62,0x2b,0xb9,0x32,0x6b,0x8f,0x51,0x3c,0x2b,0x16,0xd2,0x94,0xdf,0x79,0x7f,0x56,0xdf,0xd8,0x20,0x3d,0xda,0x27,},{0x23,0x0b,0x70,0x02,0xf5,0x7c,0x79,0xae,0x2e,0x6b,0xfd,0xb8,0xdf,0x30,0xdb,0x3e,0x90,0x07,0x56,0xb5,0x4a,0xf3,0x96,0x8c,0x67,0x0e,0xe2,0xf3,0x2b,0xb1,0x1e,0x0a,},{0x3c,0xbb,0xb2,0x60,0x88,0x70,0xde,0xa1,0xef,0xee,0xbb,0x3f,0xbf,0x68,0x1e,0x27,0x70,0x5c,0x35,0xe4,0xdd,0xee,0xa8,0x6c,0x1b,0x34,0x2a,0x77,0xdc,0x29,0x6b,0x49,0x84,0x19,0x80,0x8e,0xac,0xbc,0x78,0x85,0x56,0x11,0xff,0xbc,0x92,0x65,0xa7,0x47,0x98,0xe5,0x18,0x27,0xe6,0xe5,0xd8,0x11,0x81,0x6d,0x3c,0xa2,0x1e,0x8b,0x9c,0x06,},"\x61\xb1\x5b\xe3\x7c\x4e\xb3\x97\xd9\xe7\x7e\x00\x15\x1a\x28\xed\x3e\x86\xd5\x0a\x95\x52\xbb\x48\x50\xb6\x21\x76\x3f\x01\x2e\x7e\x77\xbb\x5d\xb8\xf3\xdf\x7d\xcf\x76\x9f\x2d\x1d\x46\xd8\xd6\x0b\xae\x40\xc8\xca\x6e\x25\xc6\x41\x0b\x60\x07\x8a\x93\xfd\x05\x90\x21\x14\xbd\x91\x04\x5c\x06\x19\x2c\x70\xc4\x2c\x9f\x41\xf8\x16\x1c\xa4\x65\x64\xeb\xc2\x1a\x4b\xdd\x81\x90\xeb\xa2\xae\xb3\x09\x82\x30\x72\xec\x2c\x02\x00\xce\x64\x98\xf9\xd7\x2b\x37\xb3\xfb\x46\x67\x74\x32\x6d\xf3\x7a\xd8\x80\xd8\xed\xdb\x32\xaf\x67\x3e\x45\xd8\x8e\xec\x49\xb1\x57\x7b\x43\xb8\x63\x91\x11\xc2\xe0\xb9\x41\x87\xd2\xd4\xe0\x17\x3c\x00\x0f\x4c\x37\xbe\x84\x5d\x68\x81\x0b\x78\x89\xff\x2a\x04\x9f\x3f\x9f\x24\x5e\xc7\x0f\x21\xde\xf9\x77\x80\xb6\x11\x40\x0a\x83\xc3\x1a\x79\xd9\x3a\x8e\x98\xb6\x08\xfd\xcf\x24\x88\xb0\x68\xfe\x1a\xe4\x21\x72\x93\xa9\x36\x7b\xb7\x34\xb5\xbc\x7b\xd8\x81\x9b\x37\x7f\x09\x0b\x4f\x8f\xdb\xff\x50\x79\x9c\x76\x88\x0d\x19\x13\x35\x80\xe1\xdd\xfc\x2b\x9b\xaa\xdd\xba\xb3\x4f\xc6\xfd\xc0\x78\x01\x4b\xd1\xff\x73\x9d\xaa\xfe\x54\x76\xf3\xf7\x9d\x4d\xbe\xc2\x16\xfa\x76\x80\xee\x8e\x84\x00\x2d\xcb\x9d\xdb\xc7\xfc\x1e\x1c\x8e\xf4\xf1\xb2\xa2\x08\x1b\x92\x82\x24\x3d\xa6\x15\x3c\x1f\xce\x09\x05\xcf\x35\xf8\x3a\x68\x4c\x01\xb0\x45\x57\xec\x84\xf7\xe9\xa9\x4f\xc2\x88\x2e\x2f\xf1\x9f\xea\x21\xd2\xce\x61\x67\x86\x1c\xe0\x1d\xf8\xb8\xd3\xc3\xe8\xd2\x55\x61\x0b\x7a\xf2\x59\x6c\xd5\xcf\x00\x16\x73\x49\x42\xcc\x71\x4c\x27\x2c\x05\xfd\xa9\xd3\x47\x23\x62\x66\x46\xa4\x61\x30\x18\x2c\xeb\xcf\x17\x9e\xc0\x0a\x6a\x17\x3b\xd8\x57\x7f\xa8\x45\xc4\x4d\x19\xc6\x99\x79\x44\x75\x5f\x2b\x4e\x46\x85\x63\xa7\x5e\x90\x16\x52\x3b\x87\xdd\xac\x3e\xee\x21\xbc\xbc\xa0\x8f\xcc\x29\x54\x6a\x43\xcb\xe0\xd8\xd1\x0a\x0e\x8d\xdc\xba\x17\x2d\x1d\xed\x15\x03\x78\xe1\x8b\x36\x8c\x77\x63\x91\x3e\x4b\x40\x70\x12\xfd\x76\xa8\x72\xd2\xcb\x04\x93\x0b\x8e\x22\xb3\x08\x24\x3d\x4c\xc2\x78\xfd\xf2\xe1\xf9\x40\xae\x89\xac\x89\x1b\x9e\x06\x61\xae\xe5\x53\x93\x7b\xf3\x50\xb4\x07\x07\x0a\x1b\xdf\xc4\xf7\xa3\x78\x7e\xf3\x99\xd2\xca\xf4\xec\x74\x43\x9c\x58\x73\x76\xc7\x7b\xe0\xc3\xde\x53\x9d\x3a\xc2\x60\x89\x76\x5b\x9b\xe1\x0b\x90\x38\x69\x46\x36\xe2\x62\xd7\xba\xa0\xb3\xa8\x94\x1a\x20\x15\x96\x76\x39\xf6\x04\x4c\x67\xe5\x9b\xc8\x1c\xf2\xfb\xa7\x04\xac\x0d\xf4\x8d\xa6\x03\x74\x05\xa8\xe8\xb8\xa7\xce\x3c\x58\xef\x38\xa8\x83\x53\x8b\x24\x7f\xfe\x18\x09\x7a\xf0\x95\x24\x2b\x05\x8b\xdd\x1e\x3e\x24\x5e\xec\xe0\xa7\x1b\x75\xb9\x7d\x52\xf2\x0d\x6d\x51\xbb\x97\x66\xb0\xda\x0f\xc0\x9c\x8a\xc2\xa3\x0f\xb6\xe7\xb3\x2e\xe0\x6d\xad\xf4\x6d\x73\x59\xcc\x06\x6a\xa9\x47\x85\xd8\xa8\x82\xff\x09\x7d\x78\xa8\x6b\xe2\xd4\x56\x00\xdd\x3d\x30\x60\x12\x5f\x01\xc0\x63\xe4\x88\xd5\xc3\xef\xee\x1b\xca\x1e\x58\x51\x64\x55\xff\xca\xec\x1b\x81\xef\x43\x38\x76\xbf\x09\xff\xa5\x1d\x6f\x50\x18\x58\x52\x24\x57\x9c\xb6\x7b\x56\xce\x1c\x21\x6e\xc0\xa8\x83\xe0\x6c\x8e\x15\x63\x42\x1e\xa7\x2b\x0c\x10\xd4\xbb\x31\xe4\x91\xc2\xae\x2f\xe8\x13\x9f\x24\x9e\xc9\x27\xd8\x06\xba\x08\xdb\x52\xb1\xb5\x06\x66\x90\x47\xf0\xc1\x16\xff\x37\xac\x5b\xa6\xcd\xb1\xea\xaf\x33\xfd\xad\xb0\x70\x5c\x79\x9d\x35\xac\x6d\x9c\x80\xda\x90\xc1\x43\x8b\x58\x5f\xfd\x59\x35\x0a\x26\x86\xb1\xec\x35\x16\x6c\xb9\xb6\x9a\xd0\xf5\x65\x86\xaa\x03\x27\x4d\x78\x2e\x3f\x85\x8d\xb6\x4a\xdf\xbf\x04\xd5\x22\x8a\x7b\x1c\x4a\x20\x48\xbb\xcd\xb9\x41\x15\x3a\x43\x6d\x74\x2c\x38\xb5\x8b\x4d\x7d\x13\xc9\xf1\xd6\x0e\x15\x2a\xa2\x79\x23\x49\xa3\xd9\x4e\x7e\x6b\x11\x04\xaa\x1b\x87\x09\x98\xc1\x8d\xd7\x06\x56\x54\xa8\x52\x81\xbb\x6f\x02\x7f\xaa\xd5\x56\xb1\xf5\x32\xe7\xa1\xe2\x2d\x56\x40\x69\x28\x95\x87\xa0\xef\xc9\xc1\x58\x5d\x13\x5f\x31\x23\x3c\x41\xf4\x40\x46\x6e\x71\xfe\x90\x12\xe5\xf9\xa0\xd7\x4a\x72\x82\xee\x39\x2f\xb0\x16\x5d\xb7\x9f\xf1\xd3\x17\x6e\xd0\x8a\xfe\x1d\xaa\x66\xcf\xbf\x43\x05\xae\x16\xac\x17\x92\x33\x43\x99\xf7\x1b\x19\x17\xdd\xec\x27\x0a\xcf\xf6\x65\xea\x05\xd1\x84\xc2\xc5\xcd\x2c\xcd\x90\x2b\x22\xf9\xb7\x19\x5e\x66\xa6\x55\x56\xca\x88\x4b\xa6\xf5\xda\x04\xdc\xd4\x61\x7f\x33\xdc\x2b\x44\xa0\xea\x74\x2a\xeb\x2b\x93\xf3\xa4\x1d\xf7\x95\x7a\x02\x67\x97\xa5\x85\xce\xee\x81\x4b\x19\x75\xf5\x23\xd2\xdb\x5d\xbb\x9b\xe0\xca\x64\x9d\x1d\x45\xdc\xfd"}, -{{0xd2,0x90,0xff,0xd9,0x33,0x95,0xbd,0x5f,0xc5,0x87,0xd1,0xab,0x51,0x18,0x66,0xe7,0x2b,0x37,0x1a,0x17,0x35,0x73,0x2d,0x9d,0x5c,0x6a,0x18,0xdd,0x46,0x5e,0x93,0x63,},{0xfd,0x4a,0xad,0x73,0xb0,0x32,0x46,0x1c,0xa0,0xaa,0xe8,0x71,0xca,0x70,0x16,0x38,0x3b,0x2b,0xe0,0x16,0x90,0x53,0xfd,0xbf,0x6c,0x59,0x14,0xfd,0xd6,0xdd,0x6f,0x92,},{0x21,0x70,0x4d,0x5e,0x62,0x6d,0xcf,0x6a,0x9d,0xcd,0xef,0x93,0x54,0x29,0xeb,0x7f,0xb5,0xb2,0x57,0xee,0xcd,0x7b,0xf7,0x4a,0xcb,0x0c,0xd3,0x0e,0xcf,0xcf,0x60,0x8d,0x0c,0x5b,0x63,0x3a,0x4a,0x8a,0x9b,0xa2,0xcc,0x82,0xa2,0x1e,0x03,0x35,0x5e,0x01,0xd8,0x5d,0xae,0x7e,0xca,0xc8,0x89,0x6d,0xc1,0x5d,0xae,0x04,0x85,0x70,0x71,0x04,},"\xeb\xd9\x00\xbc\x91\x0c\x5e\xcc\x4d\x97\xda\xf7\xcb\x5e\xbb\x54\x91\x50\x0b\x7a\xd1\x16\xe3\x06\x60\x95\x07\x09\xd8\x08\x4b\xb6\x43\x4c\x5b\xea\x4a\x8c\xcc\x1e\xd5\xa8\x01\xbe\xbb\x1a\x11\x78\x78\xc0\x37\x47\x00\x3e\x14\x8e\xd9\x14\x34\x83\x2e\x89\x66\x24\x1a\x7f\xff\x22\xfe\x1d\x6d\x8c\x3c\x3d\xdd\x72\x15\xa1\xef\xaf\x4b\x07\xaf\xee\x1b\x25\x67\x3a\x14\x39\xea\xac\x32\x4e\x89\x5d\x4b\xe8\x39\xe9\x76\xc0\x3a\xc0\x01\x25\x48\x76\x88\x8c\xca\xaf\x39\x12\x72\x7a\x60\x10\x6a\x87\xbe\x69\x24\x7c\x9e\x43\x8c\x31\xfc\xa8\xd9\xc6\x1b\xae\x36\x8c\x83\xe4\x09\x01\xa9\x97\x00\xdf\xf8\x39\xb5\x13\xba\x8d\xc4\x2d\x93\xce\x09\x87\xa2\x33\x34\x70\xa9\xf9\x83\x31\x3f\x91\x98\x86\x59\xda\x54\x03\x9e\x49\x9c\xd1\xaf\x2b\x8f\xa0\xeb\xe7\x50\xe2\x4d\x55\xc2\xa5\xbd\x1a\xde\x3f\x68\x00\x92\x54\x2b\xd1\xbe\x0b\x97\x35\xba\x39\x3a\xd5\x69\x7d\x24\x1e\x8e\x8b\x28\x64\x6d\xb2\x7d\x2f\xb5\xa9\x40\xe8\xfa\xea\xf0\xb6\xc9\xef\xda\x88\x61\x5d\xec\x89\x1c\xe7\x32\x93\x08\x13\xbf\xbb\xd0\xbc\x5f\x82\x10\xab\xe8\x43\xbe\xb5\xe4\xf0\x28\xf4\x9b\xea\x34\xf1\xe5\xb0\x9e\xac\x4c\x66\x62\xc7\x4f\xba\x39\xde\x4a\x96\x02\xa9\x69\x4a\x85\xc7\xc1\x37\x5f\xda\xdf\xda\x6a\x19\x57\xfc\x5b\x59\x87\xa6\x87\xb0\x39\x95\xe5\x16\x97\xa1\xab\x5b\xb6\xcb\x11\xb6\x63\xc1\x37\x2f\xad\xe4\xc0\xac\xa8\xfb\xeb\xb4\xeb\x54\xce\x7c\xe3\x6c\x69\x04\xea\xf6\xea\xb2\xf3\x4f\xac\xd8\xc7\x68\xc8\xd3\x6d\xa2\x39\x7b\x1a\x02\x73\x5a\xea\x72\xcf\xaa\xd0\x39\x34\x10\xdb\x52\x7a\x8a\xb2\x36\xd4\xcd\xab\xdc\x88\x8f\xac\x6f\x18\x21\x48\xb1\x32\x61\x44\x25\xd3\x90\xff\x03\x6e\x54\x85\x5e\x42\x03\xc5\x12\x03\xc1\xf4\x3e\x37\xbb\xf6\xb9\xbf\x27\xf5\xb7\xe7\xc6\x65\x15\x14\x65\x40\x1a\xc3\x2c\xbe\x9e\x33\x50\x53\x5e\xdf\x48\xa7\xbc\x36\x03\xe2\x23\x2e\x93\x8f\x9a\x81\x5a\xc4\xd1\xde\xec\x99\x1e\xf9\x62\x09\x48\x44\x1f\x7a\x2f\x4a\x46\xe2\xc4\x00\xab\x91\x4c\x4b\xe5\x1d\xca\xad\x8e\xd8\x23\x9c\xbb\xe9\x77\xa9\xf0\x9c\x02\x69\x83\x19\xd9\xfe\x2a\x8c\x6e\xb6\x0b\x79\x9f\x29\xae\x76\x59\x97\x0d\x2e\xbd\xff\x3c\x6c\xf7\x09\xbb\xf6\xf4\xbb\x55\xb9\xdf\x4f\x61\xa2\x41\xde\xc1\x44\xb5\x99\x3f\x08\x7e\x78\x4b\x97\xbe\x1e\x53\x60\x8c\x2e\x81\x7c\xe3\xd9\xaa\xf9\x14\xe6\xb7\x23\xf5\xb4\xaf\xff\xd2\xa6\xb9\xfe\x9d\x2d\x73\x91\x5c\x7a\xd1\xff\xb1\x3e\xfc\xb7\x3c\x56\x23\x81\x95\x64\x52\x03\x98\x4c\x99\xaa\xfd\x02\x35\xf7\x3b\x3f\x88\x2e\x07\x39\x39\xbf\x78\x66\x57\x28\x01\x38\xdb\x05\xb8\x6f\xcc\x94\x60\xb3\x85\xef\x45\x59\x20\x4e\xcd\x81\xe2\xf1\x2f\x5f\x06\x2a\xa4\x48\xdc\xcc\x82\xea\x8d\x89\x46\x6d\xd1\xbe\x46\xf8\x2c\x4f\x87\xbf\x0d\xb2\xb8\x78\xac\xbb\x0d\x91\x12\xc8\xdb\x6f\x51\xd3\x5f\x6d\x42\xf7\x49\x85\x6b\x99\xe5\x50\xb6\xc4\x54\xe9\xe8\xbe\x4d\xa1\x75\xf0\xb5\xe8\x6b\xe6\x6c\x97\x9f\xd8\x78\x23\x7e\x57\xf6\x91\xf0\xd2\xac\xd0\x28\xfb\xff\xa5\xb0\x66\x87\x75\x03\x4d\xb1\xf2\x1d\xdb\xe7\x11\x4e\xe3\xdc\x0b\x44\xda\xca\x64\xc5\xa0\x3a\x2f\xee\xae\xab\xeb\x70\x63\xbf\xcc\xcc\x55\x9b\xaf\x27\xf1\xcc\xb2\x20\x2f\xa4\xd1\xb2\xbf\x44\xc0\x4b\x2c\x2f\x81\xf9\x4e\x28\x1b\x1a\x5a\xdc\x85\x0d\xa1\xb9\x47\x9f\xca\xbd\xda\xde\xa5\x6a\x11\x5b\xb5\xf0\x6c\xc0\x16\xf1\x41\xc0\xfc\xb5\xe8\x3a\xb2\x48\xea\xec\x90\x15\x8d\x8b\xe6\x47\xaf\xf1\x2e\x7e\xeb\x5e\x57\xdb\xcc\x29\x3c\xb3\xb6\xaa\xcb\x55\x23\x6d\x4a\x83\x9a\x06\x20\xf4\x76\x23\x87\xdd\x17\x14\xdf\x5c\x13\x5e\x3d\x9d\x68\x24\xf9\x3b\x7c\x90\xd3\xae\x38\xc5\x18\xd6\x07\x12\x0c\x83\x95\x70\x41\x3b\x46\xb8\xcc\xd7\x37\x04\x92\xd8\xae\x5c\x60\x9e\x00\xcf\x82\x51\xe2\xe7\xdf\x81\xe5\xb4\xf9\xc1\x6a\x5a\x53\x9f\x0a\xfc\xce\x41\xbb\x43\x62\xe5\xea\xa5\xf9\x40\xa1\x70\x6f\x4a\xfb\x6b\x14\x43\x2c\x81\xd4\xba\x1a\x33\xd3\x22\xdb\xf1\x06\x45\xab\x63\x73\x7e\xad\xc8\x6f\xe6\xe0\x97\x6f\x76\x33\x97\xfb\x89\x86\x37\x59\x5d\xfd\x36\x93\x47\x92\xd7\x79\xe2\x4c\x2a\x3f\x0b\xac\xf5\x3e\x04\x73\xc5\xfd\xa9\xc6\x12\x84\xe4\x41\x9b\xdc\x0e\xef\x5d\x22\xf4\xd9\xbf\x42\xe8\xc0\x49\x33\xbb\x93\xb5\x3c\x29\x5d\x7a\xc9\x39\x5a\xbb\x6d\xcb\xd7\x42\xb1\xe1\xbc\x3b\x0e\xa4\x43\x4e\xa2\x1b\x8e\xca\x9a\xe6\x82\xd3\x31\x5a\x41\xe9\xc3\xc3\x37\x18\x40\x76\x1d\xc5\x9c\xac\x45\xda\x7e\x38\x13\xe2\x87\x88\xdc\x89\xde\x35\x5b\x5a\xee\x08\x80\x90\xa3\x8d\xd3\x9d\x83\xe5\xe4"}, -{{0xd7,0xfd,0x73,0xd1,0xd2,0x29,0xa6,0x58,0x94,0x42,0x0e,0x4b,0xa7,0x34,0x27,0x0d,0x5a,0x20,0x75,0x83,0x64,0xde,0x89,0x7d,0x85,0x55,0xe2,0x41,0x97,0x45,0x3c,0x19,},{0x3c,0x22,0x77,0x2a,0xec,0x0a,0x0c,0x15,0x59,0x07,0x7f,0x2c,0xfd,0x1f,0x24,0x65,0xd4,0xb4,0x84,0x95,0xc5,0xd0,0x5f,0x1f,0x83,0x7c,0x31,0x84,0x5f,0x34,0xca,0xd1,},{0x40,0x0c,0x35,0x05,0xf1,0xdf,0xa8,0x0d,0xf4,0xb2,0x6d,0xb2,0x4c,0x02,0x7e,0xb8,0x19,0x77,0xf0,0xfb,0x9b,0x5a,0xca,0x52,0x4a,0xd5,0x12,0x00,0xf4,0xbf,0xb1,0x33,0xdb,0x83,0x48,0x23,0x31,0x41,0x95,0xf4,0xed,0xc2,0x92,0xd5,0xf5,0x30,0xd0,0x85,0x56,0xe7,0x80,0x9c,0xaf,0x23,0x39,0x76,0x8a,0xa3,0x80,0x29,0xfd,0xbc,0x28,0x0f,},"\xc9\x22\x58\x59\xd5\x55\xbc\x42\x01\x1a\xf1\xb4\xf1\x49\x98\xe6\xe9\xb0\xa6\x5e\x21\x72\x71\x3e\x96\x83\x80\xfb\x6c\xee\xdd\xa2\x2e\x02\x2c\x51\x30\x30\x31\xd9\x93\x1c\xce\xf2\xf7\xbc\x70\x5c\x9e\x21\x5c\x1d\x08\x9d\x48\x8d\xad\xda\xee\x15\x5c\x93\x9b\x62\x02\xca\x53\xbf\xc7\xf6\xe8\x8e\x15\x29\xd8\x2f\xb4\x5e\x02\xb5\xd0\x5a\x82\xbb\xb9\xdb\x5f\x41\x5c\x58\xba\x8b\xd5\x6c\xff\xd9\x22\x70\xb2\x47\x49\xe5\x6d\x12\xc9\x9a\xe9\x0c\x78\x00\xf5\x4f\x55\x25\x4e\xa4\x2d\xa5\xdc\xfb\xe0\xe1\xd9\x89\xcd\x2f\x68\x97\xe2\x32\xdf\x04\x70\x7b\x34\xaf\x75\xfa\x7f\xec\x33\xe5\x5e\xd5\x6a\xee\x39\xc2\x2b\x04\x5b\xed\xd1\x61\x08\x3b\xc5\x51\x4c\x1f\x81\xca\x90\x7b\x7c\x76\x03\x17\xa7\xfd\x5a\x5a\x02\xa5\xd4\x0e\x2e\x82\x3e\x24\xad\x96\xae\xf6\xda\x8e\xa9\x82\xb5\x16\x1c\xc3\x9d\x84\xaa\x2f\xfd\x95\x44\xc1\x1b\x63\x40\x37\xab\x0a\x1c\x8e\x36\xac\x63\x01\x9d\xa1\xb2\xd9\x95\xcb\x7b\xd3\xd6\x2f\xe5\x74\xde\xab\xcc\xbd\x0d\x3a\xe7\xa5\x6e\x5b\xec\x91\xe4\xba\x3f\x3d\xb8\xbf\xea\x88\xe6\x7d\xa6\x2e\x88\x27\x8a\x6e\x3b\x41\x8d\xce\xea\x05\x89\xf2\x5f\x7d\xd8\xad\x19\xdd\x84\x50\x89\x41\x9b\x47\x2e\xfc\xcc\x87\x9c\x17\x2b\x32\xee\x4a\x4d\xbc\x2e\x6c\x2e\x86\x5b\xb3\xb8\xca\x0a\xdc\xb7\x1f\xdf\x89\xe1\x97\x39\x10\xef\x24\x29\x15\xf3\x3e\x23\x6d\x2f\x7c\x8e\x9f\x1e\xe5\xb0\x7c\x6e\x3c\x25\x36\x0f\x8c\xb1\x46\x0b\xe8\x7d\xb3\x1a\x29\x1d\x4d\xee\x34\x95\x3e\x75\xc6\x75\xbf\x18\x1b\xb7\xa0\xb7\xb5\xc1\xbe\xfd\xc8\x6a\xda\x07\x2a\x48\xf6\xac\x75\x5d\x49\x9b\xd6\x8d\x62\x5d\x85\x14\x52\x5c\xc3\xab\x8f\x54\xce\x15\xa8\x71\x29\x17\x78\xde\x13\x05\xd2\x21\x93\x61\xaa\x30\xe3\x32\xa2\xe0\x69\x07\x7c\x5c\x53\x45\x75\x20\x37\x9d\x8b\x90\xd2\x4b\xd8\xa3\xa7\x70\x0f\xf7\x66\x23\x1c\xb5\x69\x7f\x9a\xce\x52\x1a\x99\xe8\x96\xda\x54\xc4\x07\x93\xbc\x7c\x1f\xb1\x58\x4b\xb1\xc8\x61\x94\xd2\xfb\x7a\x4b\x80\x2f\x30\x88\x5e\x0e\xe8\xaf\x88\xd6\x88\x6e\x3a\x3a\x4d\x4c\x85\x46\x49\xcc\x01\xab\xdf\x35\x31\x9a\x08\x56\xcc\x65\xd0\x92\xa3\x86\xf8\x86\x96\x25\xcd\x0a\xca\xc0\x87\xe9\x35\x17\x90\xcc\xb4\xa8\x65\xf6\x51\xa8\x81\xc3\xeb\xf1\x09\x07\x27\x74\xf9\x40\xf5\xaa\x98\xa2\xa2\xaa\x3d\xd3\x66\x47\xd0\xde\x83\x00\x1a\xa7\xcd\xc0\x31\xcc\x4a\x4d\x75\xdc\x11\xce\x55\x16\x76\xa2\xad\x43\xa3\xf6\xa1\x6a\x4b\xc5\xae\xe8\x0e\x53\x64\x20\x60\x87\x36\x4e\xb8\xb2\xb1\x5f\xb7\x05\x38\x0a\x07\x2d\x7c\x8b\x51\x99\x59\x43\xaa\x76\x2e\x8d\xeb\x4c\x56\x8c\xda\xa1\x41\x1a\xb6\x8f\x28\x48\x9e\x13\x23\xbb\x61\x56\xce\x25\x00\xb0\x6e\x77\x93\xc5\x10\xa3\xde\x29\x15\x08\x40\xbf\xdb\x0b\x2b\x7b\x21\xc2\xbb\x8a\x77\x46\x16\x7c\x92\x9d\xd0\xad\xad\x44\xfe\xd8\xf3\x6e\x83\x81\xb3\x42\x08\x0b\x2a\x7d\x82\xa3\xf8\x1f\xf7\x26\x30\xcb\x78\xdf\x91\xf7\xb6\x5a\x44\xef\xf6\xed\x64\xd4\x8a\xfe\xd1\x09\xdd\x7a\x69\x3a\x1b\xa8\xc3\x7e\x00\x8f\xcb\x15\x7e\x37\x29\x7d\x32\xeb\xa7\x65\xa6\xc7\x19\x3e\x73\xbd\x97\x64\x79\x85\xb1\x60\x38\xc7\x4a\x08\x4a\x8f\x25\x65\x4c\xd8\xcd\x2c\xdd\x27\xff\x17\x33\x4e\x06\xad\xaa\x05\x82\x64\x01\x7a\x3b\x2d\xa7\x8e\x57\x38\xa2\x7e\x35\x0d\x88\x2f\x5f\xae\x19\x92\x78\xd4\xe5\x0b\x8b\xad\xf5\x7c\x21\x41\xdf\xdc\x3c\xff\x99\xdf\x5d\xe8\x6f\xec\x29\x3c\x76\xcb\x94\xb6\xb1\x9b\xa3\x03\x4e\x46\x0f\x84\xc2\x80\xa2\xe6\x41\x2f\xab\x56\x98\xce\x89\x02\x07\xca\xba\xbc\xa0\xa9\x5b\x5a\xd5\x33\xce\x11\x4b\xf7\x1a\x40\x4a\x87\x59\x0d\x35\xfa\x7c\xed\xba\x43\x13\x1c\x4e\xe9\x23\x44\x83\x9f\x25\xcb\xfa\xeb\x12\xae\xeb\xc8\x04\x08\x93\x95\x1a\x34\x6b\xd2\x8f\xdd\x16\x7b\xd2\x0f\x71\xa1\xe5\x9f\xb6\x0d\x55\xe1\xc5\x67\xf4\x78\xf0\x27\xcf\x67\x9a\x37\xd1\xd9\xdb\x86\x7e\x17\xbf\xdd\x60\xb3\x47\xd8\x9d\x32\x26\x39\xd3\x15\xbb\x7a\x2c\x91\x34\xf0\x0e\xa0\x3a\x36\x7f\x30\x5e\xa4\xd6\x0d\xc9\xd5\x67\xcf\x92\x48\x51\xe4\x69\xea\x95\x4e\xd3\xea\x63\xea\x86\x06\xf7\x9f\x07\x73\x39\xbf\xa2\xb5\x1a\xe4\x9b\xaa\x0f\xb2\x53\x77\x82\x1d\x7c\x11\xef\x9a\xd4\xbb\x4c\x0f\xe4\x89\xac\xba\xb0\xef\x00\x0d\x61\x8c\x7a\xf5\xef\xd2\x05\xd6\x85\x99\xfc\xbd\xd9\x5e\x28\xf8\x36\xe0\x91\x6f\x9f\xf5\x48\xd0\xba\x17\xda\x62\x53\x6e\x74\x64\x68\x01\xee\xb6\x12\x2b\xa3\x2c\x41\x07\x3a\xe0\x4e\x42\xc6\xc1\xd5\xd8\xd2\x29\x76\xa5\x62\x26\xdd\xf4\xb6\xac\x95\x45\x5f\xb5\x30\x99\xf2\x02\x15\xb2\xeb\xc9\x07"}, -{{0xfd,0xa7,0xcb,0x08,0x40,0x16,0xba,0x51,0x3c,0x7c,0x4f,0x8f,0x71,0x80,0x48,0x0b,0xb1,0x81,0xe9,0x56,0x95,0xea,0x68,0x73,0x7f,0xa3,0x4a,0x40,0xec,0xbd,0xf3,0xef,},{0xa2,0xde,0x3a,0x0e,0xf9,0x72,0x98,0xfd,0x71,0x61,0x06,0xe2,0xf3,0xf5,0x45,0x13,0x05,0x7a,0x40,0x07,0x2d,0x23,0x4c,0x35,0x18,0x15,0x4c,0x1b,0xd1,0x2d,0xe0,0x37,},{0x33,0x61,0x4b,0x7a,0x94,0xf7,0x5e,0x03,0x65,0x34,0xd7,0x6e,0x30,0x14,0x7e,0xcc,0xdd,0x2a,0x04,0xe0,0x0c,0xd4,0x70,0x4a,0xb6,0xe8,0x07,0xd6,0xa2,0xac,0xc1,0xe1,0xd9,0x63,0xb8,0xee,0xe0,0x81,0x0d,0x41,0x2d,0x9d,0x56,0xe5,0x45,0x56,0x30,0x2b,0x10,0x73,0x0c,0x15,0xab,0xf8,0x9c,0x29,0xa0,0x27,0x30,0x3e,0xa8,0x8a,0xe7,0x01,},"\xc2\x1b\xb3\xf8\xe3\x7b\xef\xa3\x67\xc9\x13\x67\x31\x01\xba\x30\xd3\xb5\xc7\x4b\xd8\xbd\xb0\x9c\xd2\x86\x40\x01\x2d\xb4\x11\x20\xc2\xbc\xc4\x08\x5d\xe2\xa0\xf9\x5c\x92\x15\xdd\xef\x8c\xb5\xfc\x8d\x8b\x12\x51\xb4\x15\x27\xc6\x7d\xfa\xa3\xf9\x5b\xa3\x57\x83\x91\xea\x5a\x66\x29\xa7\x33\x09\x5f\xd0\xa4\x3f\xdb\xa4\x0f\xfe\x26\x0f\xff\x82\xac\xee\x2e\xbe\x98\x0e\x9e\xce\xcc\xfe\x7e\x10\xb2\xed\x8c\x2e\x6b\x41\x0d\x54\x7a\x12\x86\x57\x1d\xf3\xd7\x01\x17\x4e\x57\x9f\xcf\x19\xd3\xbd\x80\x86\xc0\x42\x3f\x37\x11\x77\x89\xf3\x05\xd9\x67\x0a\xd2\x8c\x99\x67\x4f\x52\xcf\x64\x21\x1a\x08\x1d\x0c\x6c\x30\x96\xda\x2c\x71\xbf\x5f\x57\x99\xa7\x91\x0e\x6f\x38\x10\x4a\x37\xa6\x55\x7c\x2d\xae\xf3\x40\x81\x4a\x1f\x83\x0d\x59\x37\x73\xc6\xcf\x48\xd8\x3e\xa0\x72\x94\xb9\x4e\xb0\x80\xb8\x5d\x69\x70\xe2\x8f\x40\x51\xd5\x06\x6d\xb1\x0e\x96\x19\x73\xa6\x26\xa8\x26\xae\xaf\x8a\x06\xec\x0d\x56\x6b\x7e\x0c\x4e\xf6\x0f\x0c\x56\x78\xfc\xbb\x5b\x2a\xc6\x3f\x7b\xed\x06\x44\x8a\x24\x7b\x3d\x42\x7b\x87\x08\x6d\x33\x57\x3f\xb2\xd7\x22\x8c\x5c\x34\xea\x66\x40\xee\xfa\x95\x64\x48\x5a\x79\x63\x8e\x9c\x97\xc0\xaf\x84\xcf\xee\x7c\xe4\xa7\x39\x22\x0c\x84\x29\xe0\x67\x14\x39\x53\xd5\x50\x66\x8d\xad\xc8\x4e\x7b\xed\x9a\xb0\x70\xa5\x94\x33\x90\xc6\x11\xd7\x5b\x1c\xb1\x28\x73\xa3\x7d\x98\x50\x66\x1a\x00\x77\xbf\xa9\xca\x9b\x8b\x26\x37\x66\xc1\x49\xff\x0e\xe4\xb4\xad\xba\x25\xea\xf7\xd7\xf5\x01\xf3\x62\x45\x42\x56\xbc\x12\x69\x37\x8e\xf3\x35\x9a\x8e\xd6\xb9\x60\xb8\x66\x21\xfa\x3b\x61\x3e\xb1\x32\x12\x2f\x49\xf2\xeb\x2c\xeb\x68\x32\xa3\x99\x1e\x96\x1c\xb0\xe7\x8b\x74\x2e\xf4\xd6\x5e\x8d\xe3\x46\x96\x66\xfe\xc7\xc5\xb8\x74\x78\x95\x71\xc5\xc9\x9a\x2c\x02\xa0\x53\xff\x7d\x2f\xc9\x00\x76\xba\xfe\x1f\x26\x7f\xa8\x1a\x39\x90\xf2\x7f\xf1\x4f\x03\x00\x0a\xf0\x0c\x59\x28\x6c\xb9\xbb\x98\xe2\x04\xe9\x01\x90\xae\x2a\x50\xed\xef\x04\x9e\xa9\x2a\x1f\x78\x50\x88\xf9\x4a\xdf\x65\x88\xfb\x43\xbb\x40\xfb\xe2\x32\x42\x35\xcc\x7e\x16\x8b\x80\x26\x4b\x06\x9f\x94\x4f\x50\x36\x92\xc9\x49\x23\x4d\x5b\x76\xbc\xff\xab\xe2\x9f\xf9\x06\x4b\xd7\xcb\xed\x9e\x00\xe5\xb7\xfd\xda\x43\x12\xeb\x80\x14\x65\xf1\x27\xd0\xca\x68\x83\x2a\x7f\x4e\xd0\xea\xed\x8f\x55\x9c\x16\x31\xcd\x4d\x34\xf0\xdc\x41\x4d\x9f\xcf\xe8\x49\xa9\x1e\x25\xf3\xe0\xff\x01\x3a\x8c\xff\xa8\x06\xed\x8e\x93\xd0\x8a\x1e\x5a\x75\x76\x82\xca\x3d\x26\xab\xc8\x69\xc7\x6f\x1c\x79\x00\x7d\x55\x9d\xfe\x67\xe7\x8d\x8a\xf0\x19\x58\x08\xb0\xe7\x71\xc7\x1e\x64\xb5\x71\x6f\xb3\x63\x09\xc2\x50\x25\xfa\xe6\x41\x4c\x28\xbb\xdb\xd4\xde\x59\x7a\x74\x99\x6c\x9d\xa9\x74\x92\x0d\x59\xe6\xf4\xc2\xed\xfe\x11\x0f\xf8\x17\xfd\x48\x0a\x50\x80\x97\x80\x48\x86\x57\x12\x05\x8c\x5f\xe7\xb5\x60\xb1\x2b\x67\xf7\x37\xea\x6e\x2a\xf9\x24\x2c\xf0\x7a\xd0\xa8\xa6\x79\xf2\x64\x30\x04\x6a\xdc\x3e\x70\x66\x4c\xc9\xc0\xee\x5a\xbc\xef\x6d\x72\x6b\x4e\x04\x17\x60\x48\xb7\x95\xbe\x12\x85\x1b\xdb\x74\x00\x3a\x13\x20\x41\x19\xb8\x68\x64\xd6\x53\x5b\xa0\x95\x04\x0a\x85\xd9\x78\x1c\xf4\xf3\x48\x0a\x30\x4e\x22\x7f\x78\x7a\xd5\x38\xe6\x8f\x4b\xab\x01\x41\x79\xe3\x0d\x3f\xde\xf9\xef\xf1\x1b\xcf\x47\x1f\xa3\xa0\xbc\x74\xb5\x57\x6f\x30\x2d\x3a\x6b\x49\x9f\x11\xf2\xef\x32\x6a\xc0\x26\xc9\x8d\xb1\x0e\x27\x41\x41\x3f\x32\x22\x28\xb3\xcf\xf0\xf3\x37\xba\x2f\x29\x4c\x78\xef\x73\xf0\xe8\x77\x87\x8f\x8f\xc7\xff\x6d\x10\xbc\xe6\x6a\xd6\x28\x43\x79\xb8\x0c\xa8\x93\x27\xd4\xdb\x0b\xf1\x4e\x6d\x8f\x01\xb2\x2a\xb2\x02\xb7\x16\xcc\x07\xe3\xc8\x86\x6d\x16\x8a\x50\x94\xba\xc5\xa4\x95\xe7\x38\x68\xee\xdc\x27\x22\x2e\x64\x44\xf8\x3b\xcf\x65\xac\xdc\x3e\xc8\x91\x20\xbb\x50\xe8\xab\xfc\x28\xb7\x8e\x6d\x98\x0c\x77\x5f\x48\x49\xa0\xe8\xca\xda\x80\x24\x0b\xca\x24\x5e\x39\x96\x6e\x89\xa0\x34\x4d\xf8\x36\x3a\x7d\xcc\x81\xb2\x01\xce\x9c\x75\x3a\xd5\x44\xe1\x12\x4e\x21\x02\x0d\x4c\x62\xde\xda\x9e\xd9\xb9\xd1\xf2\xfb\x7c\x54\xca\x7a\xb0\x9f\x38\x3b\xef\x48\xcf\xc6\x84\x8c\x27\x13\x02\xa1\x0f\xa6\x87\xf5\x6e\x00\xe0\xa7\xd0\x93\xc9\x27\xb4\xfd\xd8\xf1\xbe\xdf\x62\x88\xa0\xe3\x02\x84\x8a\x80\x12\xf1\x27\xa7\x9d\x2d\x30\xa0\x6c\xe1\x7d\x94\xaa\x6f\x7f\x8a\x1e\x6e\xb9\xd0\x68\x1c\x37\x74\xf6\x14\xcc\x6d\xbc\xb2\xa8\x13\xf9\x25\xc6\x30\x6a\x63\x05\x72\xa8\x3e\xc1\x09\xd5\xf5\x33\xc0\x58\x4c\xb4\x21\xd9\x19"}, -{{0xa1,0xac,0x48,0xaa,0x5f,0xfa,0x3d,0x80,0x08,0x19,0xd0,0x3b,0x7f,0x62,0xba,0xbf,0x29,0x1f,0x20,0x90,0x4c,0x11,0xa6,0x40,0x0e,0x4f,0x45,0x20,0x5f,0x10,0x3e,0x38,},{0x08,0x54,0xe0,0x34,0x0f,0x81,0x49,0x85,0xfb,0x12,0x2b,0x78,0x72,0x94,0x79,0xe3,0xfd,0xe8,0x55,0xc2,0x11,0xca,0xde,0xae,0x56,0xf0,0xd4,0xdc,0x08,0x28,0xd5,0xfa,},{0xc5,0x7e,0x3c,0x09,0x1e,0xd2,0x4e,0x5e,0x84,0x66,0x5b,0xd9,0xbb,0x10,0x2d,0xb4,0x97,0x97,0xdf,0x90,0x08,0xf0,0x55,0x57,0xfa,0x0d,0x5a,0xd7,0xa2,0x95,0xe5,0xe4,0xd2,0xa4,0x71,0x6b,0x17,0xf8,0xc9,0x1c,0xb1,0x2f,0x5a,0xbf,0xb1,0xaf,0x02,0x7f,0xb0,0x41,0x11,0x99,0xac,0xc5,0xd2,0x85,0xd8,0x42,0xa4,0xb6,0x5b,0xde,0x49,0x02,},"\xd6\xf1\x24\xed\x75\x20\x21\xc1\x09\x26\x97\x2a\x0c\x26\xf3\xb1\x83\x8b\x3c\x7a\xf2\x47\xc1\x80\x09\xa2\x31\xec\xce\x96\x4b\xf6\x69\x86\x37\x83\x3f\x60\x7d\xca\x83\x6f\x8a\x60\x6c\x72\xae\x3c\xb1\x70\x17\x44\x47\xa2\xcc\xe5\x83\xf6\xe2\x44\xdb\xc1\x63\xe2\x15\xb9\x82\x0d\xe7\x49\x6f\xfc\x5b\x70\x50\xc4\x8f\x28\x30\x24\x66\x78\xcb\xa4\xdc\x5c\xaa\x07\xc1\x45\x85\x63\xaa\x2d\x10\xdc\xb7\x77\x0e\xf8\xfe\xde\x02\x7d\xd7\xf2\x0d\xdc\x8c\xc7\x8c\x3a\x2e\x2e\x95\x8b\xd1\x8c\x00\x06\xcf\x8f\xb8\x2d\x44\xe5\x3e\x1d\xa7\xaa\x80\xfd\x10\x06\xf3\xb2\x30\x0c\x9b\x07\x9d\x8a\x66\xf1\xe4\xa3\xf4\x70\x61\xf9\xe2\xf4\x5d\xae\x35\xdc\x29\x52\x04\xb1\x94\x60\xca\x57\x07\xab\x57\xce\x21\x5a\x24\xc1\x0f\xaa\xb3\xfa\x20\xbc\xcd\x10\x1e\x7a\x7d\x70\x07\x75\x99\xf3\xd6\x72\x57\x07\x55\x21\x29\xca\xd7\x57\xd6\x51\x4c\x1b\x28\x99\x7e\x47\x1f\x94\xb0\xfd\xed\x8f\xbb\xd0\x65\xde\xad\x19\x6d\x2c\x07\xd3\xdf\xa7\xb9\xfb\x3b\xae\x76\x80\xf7\x66\x21\x20\x0d\x09\x9e\xeb\xeb\xbe\xa0\xe8\x95\x7d\xf5\xb5\xe2\x04\xca\x3e\x9e\x29\x52\xb8\xa3\x0f\x0a\x13\x1a\x68\x67\xb1\x38\x1e\x39\x4b\x1b\x44\x43\x10\xf0\x76\x32\x66\x56\xcf\x93\x41\x67\x80\x08\xe9\x52\x51\x47\xd8\xd6\x1c\xe9\x3d\x3b\xf5\x39\x00\xca\xb9\x12\x66\x37\x17\xe0\x98\x72\x93\x83\x3d\x19\x02\xd7\xfb\x04\x7b\x99\x7b\x86\x02\x6c\x46\x7d\x7b\xb1\x7c\xf4\x57\x96\x73\x8f\x7a\x77\x4a\xc1\x26\x76\x4e\xd4\xeb\x45\x12\x43\x09\xf4\x58\x62\x60\x17\x6b\xa4\x65\x91\x8d\x48\x33\x0a\x9c\xc1\x8c\x4e\xce\xa0\xdd\xaf\x38\x94\x6a\xcc\x0e\x36\x1d\xd4\x0a\x7e\x91\x33\xce\xb5\x0e\x1c\x31\x7e\xa4\x2b\xd0\x98\x0a\x72\xb8\xba\x3d\x8a\x6c\x76\x93\xdd\x56\x02\xf3\x74\xf2\x66\x4d\xf4\xba\x56\xdf\x01\xe8\x82\xfc\xa4\x2c\xb4\xdb\x62\x1f\x47\x6c\x76\xe1\xea\x9f\xd1\x05\x91\x1a\x74\xb7\x79\x52\xd9\x91\x4a\x5a\xc0\xf9\x8a\x90\x0c\x1b\x2e\x1a\x56\xc4\xea\x85\x18\xa9\xee\x47\xc4\xed\x14\xd0\xbd\x35\xec\xa5\x60\x31\x9c\x8e\xa2\x47\x55\xd7\x1a\x4e\x03\x08\x50\xbc\x4d\xc6\x03\x89\xf3\x25\x80\x40\x21\x20\x4c\xce\xbc\x25\xfe\xdb\xd3\x2e\xdd\x8d\x84\x46\xaa\x23\xce\x56\xa8\x5f\x77\x9e\x85\x8d\x36\xaf\x7c\x07\x3c\x11\x5e\x34\x1f\x41\x2c\x66\x0f\xab\x80\x0f\xe7\x4c\x50\xe7\x14\xee\x08\x6e\x2f\xbc\x8d\x7a\xbb\xf3\xe9\x8f\xb4\x0c\xa2\x7f\x1f\x01\xa9\xaa\xdd\x8c\xc2\x27\x5c\x2d\xd3\xf7\x6e\x4c\x1d\x81\xc4\xb7\x92\xda\xec\xc9\xfe\x66\x04\x49\x41\xb8\xb2\x91\x84\x86\xdd\x4a\xcb\x56\x2a\x7b\x58\xad\x8c\x60\xc2\x1b\x83\xcf\x48\xae\xfa\x72\x56\xa1\xed\x80\x9e\x66\x98\x11\xf4\x84\x36\x49\x70\xbc\x56\x95\x08\x99\x19\xbc\x32\xd2\x8e\xa7\x52\xe8\xe3\x18\xce\xff\x46\x7f\x77\xae\x19\x77\xc5\xff\xd7\x9c\x17\xc2\xda\x8b\xc7\xf8\x23\xdd\x94\x39\x86\x83\x18\x99\x45\xf8\xb7\x92\x38\xa4\xe8\x15\xb1\x42\xb8\x66\xac\xbd\xbc\xb7\xae\xa7\xf1\x43\xff\xfb\x7c\xc2\xb4\xb5\x4b\xbf\x36\x1a\xfd\xa9\x13\xad\x6d\xf1\xe4\x9d\xfd\x6b\x53\x26\x42\xe6\x3f\x55\xd8\x93\xa4\x70\xd4\x03\x70\x66\x5c\xfb\x74\xef\xd3\xf5\x9c\xb0\xff\x60\x06\x17\x4c\xa3\x5f\x53\xb9\x7c\x54\x3e\x08\xaf\x4b\xf5\xbb\x75\xff\x90\x31\x61\x06\x52\xa3\xf6\xf2\xa0\xcf\xe9\x7e\x7a\x52\x1f\x3d\x2a\x28\x91\x14\xde\xd3\x47\x72\xb0\xe4\x98\x17\xbd\xe1\xcb\x92\x4f\xf5\x14\xe2\x86\x6a\x09\xe3\xed\xe0\x78\x2d\x2c\x0c\x98\xe6\x81\x4b\x8c\x1e\x77\x8c\xf8\x30\x63\x48\xc9\x33\xad\xb2\xe4\x72\xdb\xa0\x9d\xb9\x54\xff\x49\x64\x83\x73\x39\x5a\x2f\x01\x81\x95\x8f\xeb\x1e\xa2\x83\x4c\x99\x53\x28\x73\xdb\x5c\x88\xeb\x52\x89\xc7\x7e\x90\x01\x52\x03\xef\x50\x2a\xc8\xe1\xc4\x8f\xa1\xa0\x6d\xaf\xa6\x51\x9d\x52\xda\xe3\xc5\x56\x75\x70\xdd\x24\x34\xe6\x71\x92\x7c\x66\x36\x3f\x78\x31\x56\x89\x3f\x13\x8a\x84\xc7\x56\x64\xb3\x0a\xe4\x27\x51\x12\x73\x6d\x53\xd4\xf3\x99\xdd\xda\x3d\x23\x06\x7c\x07\x3f\x52\x1a\xfb\xa1\xf7\xbe\x58\x55\x13\xc2\xce\xc9\xc8\xf0\x8d\x2a\x22\xc3\xc8\x53\x92\xcd\x2a\xe5\x0f\x39\x28\x25\x1f\x86\xb3\x10\xc6\x9a\x0f\x8c\x4e\x85\x3a\xb3\xf3\xe8\x12\x9b\x05\x66\xef\x4b\xbb\xe8\x0b\x8c\x02\xc8\x92\x8a\x4d\xe5\x6c\x0d\x11\x9a\x45\xbb\xf5\xaf\x18\x08\xd4\x88\x85\x2d\x8a\x45\xbe\xb0\xd6\x83\x24\x8a\x4d\x65\xde\x15\x26\xb3\xd1\xd2\xff\xc1\xf2\x22\x15\xb6\x08\x46\x8c\xbc\x3b\xd3\x95\x14\xb3\x97\xfc\x0d\xb0\xf1\x13\xdb\xe6\xfc\xe4\x65\x2e\x82\xff\x89\x5b\x2b\x43\x87\xe0\x41\xd7\xe4\xe7\xbd\xe4\x69\x47\x69\x66\x5e\x81"}, -{{0xf5,0xe5,0x76,0x7c,0xf1,0x53,0x31,0x95,0x17,0x63,0x0f,0x22,0x68,0x76,0xb8,0x6c,0x81,0x60,0xcc,0x58,0x3b,0xc0,0x13,0x74,0x4c,0x6b,0xf2,0x55,0xf5,0xcc,0x0e,0xe5,},{0x27,0x81,0x17,0xfc,0x14,0x4c,0x72,0x34,0x0f,0x67,0xd0,0xf2,0x31,0x6e,0x83,0x86,0xce,0xff,0xbf,0x2b,0x24,0x28,0xc9,0xc5,0x1f,0xef,0x7c,0x59,0x7f,0x1d,0x42,0x6e,},{0x0a,0xab,0x4c,0x90,0x05,0x01,0xb3,0xe2,0x4d,0x7c,0xdf,0x46,0x63,0x32,0x6a,0x3a,0x87,0xdf,0x5e,0x48,0x43,0xb2,0xcb,0xdb,0x67,0xcb,0xf6,0xe4,0x60,0xfe,0xc3,0x50,0xaa,0x53,0x71,0xb1,0x50,0x8f,0x9f,0x45,0x28,0xec,0xea,0x23,0xc4,0x36,0xd9,0x4b,0x5e,0x8f,0xcd,0x4f,0x68,0x1e,0x30,0xa6,0xac,0x00,0xa9,0x70,0x4a,0x18,0x8a,0x03,},"\x08\xb8\xb2\xb7\x33\x42\x42\x43\x76\x0f\xe4\x26\xa4\xb5\x49\x08\x63\x21\x10\xa6\x6c\x2f\x65\x91\xea\xbd\x33\x45\xe3\xe4\xeb\x98\xfa\x6e\x26\x4b\xf0\x9e\xfe\x12\xee\x50\xf8\xf5\x4e\x9f\x77\xb1\xe3\x55\xf6\xc5\x05\x44\xe2\x3f\xb1\x43\x3d\xdf\x73\xbe\x84\xd8\x79\xde\x7c\x00\x46\xdc\x49\x96\xd9\xe7\x73\xf4\xbc\x9e\xfe\x57\x38\x82\x9a\xdb\x26\xc8\x1b\x37\xc9\x3a\x1b\x27\x0b\x20\x32\x9d\x65\x86\x75\xfc\x6e\xa5\x34\xe0\x81\x0a\x44\x32\x82\x6b\xf5\x8c\x94\x1e\xfb\x65\xd5\x7a\x33\x8b\xbd\x2e\x26\x64\x0f\x89\xff\xbc\x1a\x85\x8e\xfc\xb8\x55\x0e\xe3\xa5\xe1\x99\x8b\xd1\x77\xe9\x3a\x73\x63\xc3\x44\xfe\x6b\x19\x9e\xe5\xd0\x2e\x82\xd5\x22\xc4\xfe\xba\x15\x45\x2f\x80\x28\x8a\x82\x1a\x57\x91\x16\xec\x6d\xad\x2b\x3b\x31\x0d\xa9\x03\x40\x1a\xa6\x21\x00\xab\x5d\x1a\x36\x55\x3e\x06\x20\x3b\x33\x89\x0c\xc9\xb8\x32\xf7\x9e\xf8\x05\x60\xcc\xb9\xa3\x9c\xe7\x67\x96\x7e\xd6\x28\xc6\xad\x57\x3c\xb1\x16\xdb\xef\xef\xd7\x54\x99\xda\x96\xbd\x68\xa8\xa9\x7b\x92\x8a\x8b\xbc\x10\x3b\x66\x21\xfc\xde\x2b\xec\xa1\x23\x1d\x20\x6b\xe6\xcd\x9e\xc7\xaf\xf6\xf6\xc9\x4f\xcd\x72\x04\xed\x34\x55\xc6\x8c\x83\xf4\xa4\x1d\xa4\xaf\x2b\x74\xef\x5c\x53\xf1\xd8\xac\x70\xbd\xcb\x7e\xd1\x85\xce\x81\xbd\x84\x35\x9d\x44\x25\x4d\x95\x62\x9e\x98\x55\xa9\x4a\x7c\x19\x58\xd1\xf8\xad\xa5\xd0\x53\x2e\xd8\xa5\xaa\x3f\xb2\xd1\x7b\xa7\x0e\xb6\x24\x8e\x59\x4e\x1a\x22\x97\xac\xbb\xb3\x9d\x50\x2f\x1a\x8c\x6e\xb6\xf1\xce\x22\xb3\xde\x1a\x1f\x40\xcc\x24\x55\x41\x19\xa8\x31\xa9\xaa\xd6\x07\x9c\xad\x88\x42\x5d\xe6\xbd\xe1\xa9\x18\x7e\xbb\x60\x92\xcf\x67\xbf\x2b\x13\xfd\x65\xf2\x70\x88\xd7\x8b\x7e\x88\x3c\x87\x59\xd2\xc4\xf5\xc6\x5a\xdb\x75\x53\x87\x8a\xd5\x75\xf9\xfa\xd8\x78\xe8\x0a\x0c\x9b\xa6\x3b\xcb\xcc\x27\x32\xe6\x94\x85\xbb\xc9\xc9\x0b\xfb\xd6\x24\x81\xd9\x08\x9b\xec\xcf\x80\xcf\xe2\xdf\x16\xa2\xcf\x65\xbd\x92\xdd\x59\x7b\x07\x07\xe0\x91\x7a\xf4\x8b\xbb\x75\xfe\xd4\x13\xd2\x38\xf5\x55\x5a\x7a\x56\x9d\x80\xc3\x41\x4a\x8d\x08\x59\xdc\x65\xa4\x61\x28\xba\xb2\x7a\xf8\x7a\x71\x31\x4f\x31\x8c\x78\x2b\x23\xeb\xfe\x80\x8b\x82\xb0\xce\x26\x40\x1d\x2e\x22\xf0\x4d\x83\xd1\x25\x5d\xc5\x1a\xdd\xd3\xb7\x5a\x2b\x1a\xe0\x78\x45\x04\xdf\x54\x3a\xf8\x96\x9b\xe3\xea\x70\x82\xff\x7f\xc9\x88\x8c\x14\x4d\xa2\xaf\x58\x42\x9e\xc9\x60\x31\xdb\xca\xd3\xda\xd9\xaf\x0d\xcb\xaa\xaf\x26\x8c\xb8\xfc\xff\xea\xd9\x4f\x3c\x7c\xa4\x95\xe0\x56\xa9\xb4\x7a\xcd\xb7\x51\xfb\x73\xe6\x66\xc6\xc6\x55\xad\xe8\x29\x72\x97\xd0\x7a\xd1\xba\x5e\x43\xf1\xbc\xa3\x23\x01\x65\x13\x39\xe2\x29\x04\xcc\x8c\x42\xf5\x8c\x30\xc0\x4a\xaf\xdb\x03\x8d\xda\x08\x47\xdd\x98\x8d\xcd\xa6\xf3\xbf\xd1\x5c\x4b\x4c\x45\x25\x00\x4a\xa0\x6e\xef\xf8\xca\x61\x78\x3a\xac\xec\x57\xfb\x3d\x1f\x92\xb0\xfe\x2f\xd1\xa8\x5f\x67\x24\x51\x7b\x65\xe6\x14\xad\x68\x08\xd6\xf6\xee\x34\xdf\xf7\x31\x0f\xdc\x82\xae\xbf\xd9\x04\xb0\x1e\x1d\xc5\x4b\x29\x27\x09\x4b\x2d\xb6\x8d\x6f\x90\x3b\x68\x40\x1a\xde\xbf\x5a\x7e\x08\xd7\x8f\xf4\xef\x5d\x63\x65\x3a\x65\x04\x0c\xf9\xbf\xd4\xac\xa7\x98\x4a\x74\xd3\x71\x45\x98\x67\x80\xfc\x0b\x16\xac\x45\x16\x49\xde\x61\x88\xa7\xdb\xdf\x19\x1f\x64\xb5\xfc\x5e\x2a\xb4\x7b\x57\xf7\xf7\x27\x6c\xd4\x19\xc1\x7a\x3c\xa8\xe1\xb9\x39\xae\x49\xe4\x88\xac\xba\x6b\x96\x56\x10\xb5\x48\x01\x09\xc8\xb1\x7b\x80\xe1\xb7\xb7\x50\xdf\xc7\x59\x8d\x5d\x50\x11\xfd\x2d\xcc\x56\x00\xa3\x2e\xf5\xb5\x2a\x1e\xcc\x82\x0e\x30\x8a\xa3\x42\x72\x1a\xac\x09\x43\xbf\x66\x86\xb6\x4b\x25\x79\x37\x65\x04\xcc\xc4\x93\xd9\x7e\x6a\xed\x3f\xb0\xf9\xcd\x71\xa4\x3d\xd4\x97\xf0\x1f\x17\xc0\xe2\xcb\x37\x97\xaa\x2a\x2f\x25\x66\x56\x16\x8e\x6c\x49\x6a\xfc\x5f\xb9\x32\x46\xf6\xb1\x11\x63\x98\xa3\x46\xf1\xa6\x41\xf3\xb0\x41\xe9\x89\xf7\x91\x4f\x90\xcc\x2c\x7f\xff\x35\x78\x76\xe5\x06\xb5\x0d\x33\x4b\xa7\x7c\x22\x5b\xc3\x07\xba\x53\x71\x52\xf3\xf1\x61\x0e\x4e\xaf\xe5\x95\xf6\xd9\xd9\x0d\x11\xfa\xa9\x33\xa1\x5e\xf1\x36\x95\x46\x86\x8a\x7f\x3a\x45\xa9\x67\x68\xd4\x0f\xd9\xd0\x34\x12\xc0\x91\xc6\x31\x5c\xf4\xfd\xe7\xcb\x68\x60\x69\x37\x38\x0d\xb2\xea\xaa\x70\x7b\x4c\x41\x85\xc3\x2e\xdd\xcd\xd3\x06\x70\x5e\x4d\xc1\xff\xc8\x72\xee\xee\x47\x5a\x64\xdf\xac\x86\xab\xa4\x1c\x06\x18\x98\x3f\x87\x41\xc5\xef\x68\xd3\xa1\x01\xe8\xa3\xb8\xca\xc6\x0c\x90\x5c\x15\xfc\x91\x08\x40\xb9\x4c\x00\xa0\xb9\xd0"}, diff --git a/src/tor/src/ext/ed25519/donna/test-internals.c b/src/tor/src/ext/ed25519/donna/test-internals.c deleted file mode 100644 index fe9db9d66..000000000 --- a/src/tor/src/ext/ed25519/donna/test-internals.c +++ /dev/null @@ -1,190 +0,0 @@ -/* Tor: Removed, file is inclued in ed25519.c instead. */ -/* #include */ -/* #include "ed25519-donna.h" */ - -static int -test_adds(void) { -#if defined(HAVE_UINT128) && !defined(ED25519_SSE2) - /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ - static const bignum25519 max_bignum = { - 0x7ffffffffffff,0x8000000001230,0x7ffffffffffff,0x7ffffffffffff,0x7ffffffffffff - }; - -#if 0 - /* what max_bignum should fully reduce to */ - static const unsigned char max_bignum_raw[32] = { - 0x12,0x00,0x00,0x00,0x00,0x00,0x88,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 - }; -#endif - - /* (max_bignum + max_bignum)^2 */ - static const unsigned char max_bignum2_squared_raw[32] = { - 0x10,0x05,0x00,0x00,0x00,0x00,0x80,0xdc,0x51,0x00,0x00,0x00,0x00,0x61,0xed,0x4a, - 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; - - /* ((max_bignum + max_bignum) + max_bignum)^2 */ - static const unsigned char max_bignum3_squared_raw[32] = { - 0x64,0x0b,0x00,0x00,0x00,0x00,0x20,0x30,0xb8,0x00,0x00,0x00,0x40,0x1a,0x96,0xe8, - 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; -#else - /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ - static const bignum25519 ALIGN(16) max_bignum = { - 0x3ffffff,0x2000300,0x3ffffff,0x1ffffff,0x3ffffff, - 0x1ffffff,0x3ffffff,0x1ffffff,0x3ffffff,0x1ffffff - }; - - /* what max_bignum should fully reduce to */ - static const unsigned char max_bignum2_squared_raw[32] = { - 0x10,0x05,0x00,0x40,0xc2,0x06,0x40,0x80,0x41,0x02,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; - - /* (max_bignum * max_bignum) */ - static const unsigned char max_bignum3_squared_raw[32] = { - 0x64,0x0b,0x00,0x10,0x35,0x0f,0x90,0x60,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; -#endif - unsigned char result[32]; - /* static const bignum25519 ALIGN(16) zero = {0}; */ - bignum25519 ALIGN(16) a, b /* , c */; - /* size_t i; */ - - /* a = (max_bignum + max_bignum) */ - curve25519_add(a, max_bignum, max_bignum); - - /* b = ((max_bignum + max_bignum) * (max_bignum + max_bignum)) */ - curve25519_mul(b, a, a); - curve25519_contract(result, b); - if (memcmp(result, max_bignum2_squared_raw, 32) != 0) - return -1; - curve25519_square(b, a); - curve25519_contract(result, b); - if (memcmp(result, max_bignum2_squared_raw, 32) != 0) - return -1; - - /* b = (max_bignum + max_bignum + max_bignum) */ - curve25519_add_after_basic(b, a, max_bignum); - - /* a = ((max_bignum + max_bignum + max_bignum) * (max_bignum + max_bignum + max_bignum)) */ - curve25519_mul(a, b, b); - curve25519_contract(result, a); - if (memcmp(result, max_bignum3_squared_raw, 32) != 0) - return -1; - curve25519_square(a, b); - curve25519_contract(result, a); - if (memcmp(result, max_bignum3_squared_raw, 32) != 0) - return -1; - - return 0; -} - -static int -test_subs(void) { -#if defined(HAVE_UINT128) && !defined(ED25519_SSE2) - /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ - static const bignum25519 max_bignum = { - 0x7ffffffffffff,0x8000000001230,0x7ffffffffffff,0x7ffffffffffff,0x7ffffffffffff - }; - - /* what max_bignum should fully reduce to */ - static const unsigned char max_bignum_raw[32] = { - 0x12,0x00,0x00,0x00,0x00,0x00,0x88,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 - }; - - /* (max_bignum * max_bignum) */ - static const unsigned char max_bignum_squared_raw[32] = { - 0x44,0x01,0x00,0x00,0x00,0x00,0x20,0x77,0x14,0x00,0x00,0x00,0x40,0x58,0xbb,0x52, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 - }; -#else - /* largest result for each limb from a mult or square: all elements except r1 reduced, r1 overflowed as far as possible */ - static const bignum25519 ALIGN(16) max_bignum = { - 0x3ffffff,0x2000300,0x3ffffff,0x1ffffff,0x3ffffff, - 0x1ffffff,0x3ffffff,0x1ffffff,0x3ffffff,0x1ffffff - }; - - /* what max_bignum should fully reduce to */ - static const unsigned char max_bignum_raw[32] = { - 0x12,0x00,0x00,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; - - /* (max_bignum * max_bignum) */ - static const unsigned char max_bignum_squared_raw[32] = { - 0x44,0x01,0x00,0x90,0xb0,0x01,0x10,0x60,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - }; -#endif - unsigned char result[32]; - static const bignum25519 ALIGN(16) zero = {0}; - bignum25519 ALIGN(16) a, b /* , c */; - /* size_t i; */ - - /* a = max_bignum - 0, which expands to 2p + max_bignum - 0 */ - curve25519_sub(a, max_bignum, zero); - curve25519_contract(result, a); - if (memcmp(result, max_bignum_raw, 32) != 0) - return -1; - - /* b = (max_bignum * max_bignum) */ - curve25519_mul(b, a, a); - curve25519_contract(result, b); - if (memcmp(result, max_bignum_squared_raw, 32) != 0) - return -1; - curve25519_square(b, a); - curve25519_contract(result, b); - if (memcmp(result, max_bignum_squared_raw, 32) != 0) - return -1; - - /* b = ((a - 0) - 0) */ - curve25519_sub_after_basic(b, a, zero); - curve25519_contract(result, b); - if (memcmp(result, max_bignum_raw, 32) != 0) - return -1; - - /* a = (max_bignum * max_bignum) */ - curve25519_mul(a, b, b); - curve25519_contract(result, a); - if (memcmp(result, max_bignum_squared_raw, 32) != 0) - return -1; - curve25519_square(a, b); - curve25519_contract(result, a); - if (memcmp(result, max_bignum_squared_raw, 32) != 0) - return -1; - - - return 0; -} - -/* Tor: Removed, tests are invoked as a function instead. */ -#if 0 -int -main() { - int ret = 0; - int single; - single = test_adds(); - if (single) printf("test_adds: FAILED\n"); - ret |= single; - single = test_subs(); - if (single) printf("test_subs: FAILED\n"); - ret |= single; - if (!ret) printf("success\n"); - return ret; -} -#endif - -/* Tor: Added for initialization self-testing. */ -int -ed25519_donna_selftest(void) -{ - int ret = 0; - ret |= test_adds(); - ret |= test_subs(); - return (ret == 0) ? 0 : -1; -} - diff --git a/src/tor/src/ext/ed25519/donna/test-ticks.h b/src/tor/src/ext/ed25519/donna/test-ticks.h deleted file mode 100644 index 0103e03dd..000000000 --- a/src/tor/src/ext/ed25519/donna/test-ticks.h +++ /dev/null @@ -1,50 +0,0 @@ -#include "ed25519-donna-portable-identify.h" - -/* ticks - not tested on anything other than x86 */ -static uint64_t -get_ticks(void) { -#if defined(CPU_X86) || defined(CPU_X86_64) - #if defined(COMPILER_INTEL) - return _rdtsc(); - #elif defined(COMPILER_MSVC) - return __rdtsc(); - #elif defined(COMPILER_GCC) - uint32_t lo, hi; - __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); - return ((uint64_t)lo | ((uint64_t)hi << 32)); - #else - need rdtsc for this compiler - #endif -#elif defined(OS_SOLARIS) - return (uint64_t)gethrtime(); -#elif defined(CPU_SPARC) && !defined(OS_OPENBSD) - uint64_t t; - __asm__ __volatile__("rd %%tick, %0" : "=r" (t)); - return t; -#elif defined(CPU_PPC) - uint32_t lo = 0, hi = 0; - __asm__ __volatile__("mftbu %0; mftb %1" : "=r" (hi), "=r" (lo)); - return ((uint64_t)lo | ((uint64_t)hi << 32)); -#elif defined(CPU_IA64) - uint64_t t; - __asm__ __volatile__("mov %0=ar.itc" : "=r" (t)); - return t; -#elif defined(OS_NIX) - timeval t2; - gettimeofday(&t2, NULL); - t = ((uint64_t)t2.tv_usec << 32) | (uint64_t)t2.tv_sec; - return t; -#else - need ticks for this platform -#endif -} - -#define timeit(x,minvar) \ - ticks = get_ticks(); \ - x; \ - ticks = get_ticks() - ticks; \ - if (ticks < minvar) \ - minvar = ticks; - -#define maxticks 0xffffffffffffffffull - diff --git a/src/tor/src/ext/ed25519/donna/test.c b/src/tor/src/ext/ed25519/donna/test.c deleted file mode 100644 index 615449250..000000000 --- a/src/tor/src/ext/ed25519/donna/test.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - Validate ed25519 implementation against the official test vectors from - http://ed25519.cr.yp.to/software.html -*/ - -#include -#include -#include "ed25519.h" - -#include "test-ticks.h" - -static void -edassert(int check, int round, const char *failreason) { - if (check) - return; - printf("round %d, %s\n", round, failreason); - exit(1); -} - -static void -edassert_die(const unsigned char *a, const unsigned char *b, size_t len, int round, const char *failreason) { - size_t i; - if (round > 0) - printf("round %d, %s\n", round, failreason); - else - printf("%s\n", failreason); - printf("want: "); for (i = 0; i < len; i++) printf("%02x,", a[i]); printf("\n"); - printf("got : "); for (i = 0; i < len; i++) printf("%02x,", b[i]); printf("\n"); - printf("diff: "); for (i = 0; i < len; i++) if (a[i] ^ b[i]) printf("%02x,", a[i] ^ b[i]); else printf(" ,"); printf("\n\n"); - exit(1); -} - -static void -edassert_equal(const unsigned char *a, const unsigned char *b, size_t len, const char *failreason) { - if (memcmp(a, b, len) == 0) - return; - edassert_die(a, b, len, -1, failreason); -} - -static void -edassert_equal_round(const unsigned char *a, const unsigned char *b, size_t len, int round, const char *failreason) { - if (memcmp(a, b, len) == 0) - return; - edassert_die(a, b, len, round, failreason); -} - - -/* test data */ -typedef struct test_data_t { - unsigned char sk[32], pk[32], sig[64]; - const char *m; -} test_data; - - -test_data dataset[] = { -#include "regression.h" -}; - -/* result of the curve25519 scalarmult ((|255| * basepoint) * basepoint)... 1024 times */ -const curved25519_key curved25519_expected = { - 0xac,0xce,0x24,0xb1,0xd4,0xa2,0x36,0x21, - 0x15,0xe2,0x3e,0x84,0x3c,0x23,0x2b,0x5f, - 0x95,0x6c,0xc0,0x7b,0x95,0x82,0xd7,0x93, - 0xd5,0x19,0xb6,0xf1,0xfb,0x96,0xd6,0x04 -}; - - -/* from ed25519-donna-batchverify.h */ -extern unsigned char batch_point_buffer[3][32]; - -/* y coordinate of the final point from 'amd64-51-30k' with the same random generator */ -static const unsigned char batch_verify_y[32] = { - 0x51,0xe7,0x68,0xe0,0xf7,0xa1,0x88,0x45, - 0xde,0xa1,0xcb,0xd9,0x37,0xd4,0x78,0x53, - 0x1b,0x95,0xdb,0xbe,0x66,0x59,0x29,0x3b, - 0x94,0x51,0x2f,0xbc,0x0d,0x66,0xba,0x3f -}; - -/* -static const unsigned char batch_verify_y[32] = { - 0x5c,0x63,0x96,0x26,0xca,0xfe,0xfd,0xc4, - 0x2d,0x11,0xa8,0xe4,0xc4,0x46,0x42,0x97, - 0x97,0x92,0xbe,0xe0,0x3c,0xef,0x96,0x01, - 0x50,0xa1,0xcc,0x8f,0x50,0x85,0x76,0x7d -}; - -Introducing the 128 bit r scalars to the heap _before_ the largest scalar -fits in to 128 bits alters the heap shape and produces a different, -yet still neutral/valid y/z value. - -This was the value of introducing the r scalars when the largest scalar fit -in to 135-256 bits. You can produce it with amd64-64-24k / amd64-51-32k -with the random sequence used in the first pass by changing - - unsigned long long hlen=((npoints+1)/2)|1; - -to - - unsigned long long hlen=npoints; - -in ge25519_multi_scalarmult.c - -ed25519-donna-batchverify.h has been modified to match the -default amd64-64-24k / amd64-51-32k behaviour -*/ - - - -/* batch test */ -#define test_batch_count 64 -#define test_batch_rounds 96 - -typedef enum batch_test_t { - batch_no_errors = 0, - batch_wrong_message = 1, - batch_wrong_pk = 2, - batch_wrong_sig = 3 -} batch_test; - -static int -test_batch_instance(batch_test type, uint64_t *ticks) { - ed25519_secret_key sks[test_batch_count]; - ed25519_public_key pks[test_batch_count]; - ed25519_signature sigs[test_batch_count]; - unsigned char messages[test_batch_count][128]; - size_t message_lengths[test_batch_count]; - const unsigned char *message_pointers[test_batch_count]; - const unsigned char *pk_pointers[test_batch_count]; - const unsigned char *sig_pointers[test_batch_count]; - int valid[test_batch_count], ret, validret; - size_t i; - uint64_t t; - - /* generate keys */ - for (i = 0; i < test_batch_count; i++) { - ed25519_randombytes_unsafe(sks[i], sizeof(sks[i])); - ed25519_publickey(sks[i], pks[i]); - pk_pointers[i] = pks[i]; - } - - /* generate messages */ - ed25519_randombytes_unsafe(messages, sizeof(messages)); - for (i = 0; i < test_batch_count; i++) { - message_pointers[i] = messages[i]; - message_lengths[i] = (i & 127) + 1; - } - - /* sign messages */ - for (i = 0; i < test_batch_count; i++) { - ed25519_sign(message_pointers[i], message_lengths[i], sks[i], pks[i], sigs[i]); - sig_pointers[i] = sigs[i]; - } - - validret = 0; - if (type == batch_wrong_message) { - message_pointers[0] = message_pointers[1]; - validret = 1|2; - } else if (type == batch_wrong_pk) { - pk_pointers[0] = pk_pointers[1]; - validret = 1|2; - } else if (type == batch_wrong_sig) { - sig_pointers[0] = sig_pointers[1]; - validret = 1|2; - } - - /* batch verify */ - t = get_ticks(); - ret = ed25519_sign_open_batch(message_pointers, message_lengths, pk_pointers, sig_pointers, test_batch_count, valid); - *ticks = get_ticks() - t; - edassert_equal((unsigned char *)&validret, (unsigned char *)&ret, sizeof(int), "batch return code"); - for (i = 0; i < test_batch_count; i++) { - validret = ((type == batch_no_errors) || (i != 0)) ? 1 : 0; - edassert_equal((unsigned char *)&validret, (unsigned char *)&valid[i], sizeof(int), "individual batch return code"); - } - return ret; -} - -static void -test_batch(void) { - uint64_t dummy_ticks, ticks[test_batch_rounds], best = maxticks, sum; - size_t i, count; - - /* check the first pass for the expected result */ - test_batch_instance(batch_no_errors, &dummy_ticks); - edassert_equal(batch_verify_y, batch_point_buffer[1], 32, "failed to generate expected result"); - - /* make sure ge25519_multi_scalarmult_vartime throws an error on the entire batch with wrong data */ - for (i = 0; i < 4; i++) { - test_batch_instance(batch_wrong_message, &dummy_ticks); - test_batch_instance(batch_wrong_pk, &dummy_ticks); - test_batch_instance(batch_wrong_sig, &dummy_ticks); - } - - /* speed test */ - for (i = 0; i < test_batch_rounds; i++) { - test_batch_instance(batch_no_errors, &ticks[i]); - if (ticks[i] < best) - best = ticks[i]; - } - - /* take anything within 1% of the best time */ - for (i = 0, sum = 0, count = 0; i < test_batch_rounds; i++) { - if (ticks[i] < (best * 1.01)) { - sum += ticks[i]; - count++; - } - } - printf("%.0f ticks/verification\n", (double)sum / (count * test_batch_count)); -} - -static void -test_main(void) { - int i, res; - ed25519_public_key pk; - ed25519_signature sig; - unsigned char forge[1024] = {'x'}; - curved25519_key csk[2] = {{255}}; - uint64_t ticks, pkticks = maxticks, signticks = maxticks, openticks = maxticks, curvedticks = maxticks; - - for (i = 0; i < 1024; i++) { - ed25519_publickey(dataset[i].sk, pk); - edassert_equal_round(dataset[i].pk, pk, sizeof(pk), i, "public key didn't match"); - ed25519_sign((unsigned char *)dataset[i].m, i, dataset[i].sk, pk, sig); - edassert_equal_round(dataset[i].sig, sig, sizeof(sig), i, "signature didn't match"); - edassert(!ed25519_sign_open((unsigned char *)dataset[i].m, i, pk, sig), i, "failed to open message"); - - memcpy(forge, dataset[i].m, i); - if (i) - forge[i - 1] += 1; - - edassert(ed25519_sign_open(forge, (i) ? i : 1, pk, sig), i, "opened forged message"); - } - - for (i = 0; i < 1024; i++) - curved25519_scalarmult_basepoint(csk[(i & 1) ^ 1], csk[i & 1]); - edassert_equal(curved25519_expected, csk[0], sizeof(curved25519_key), "curve25519 failed to generate correct value"); - - for (i = 0; i < 2048; i++) { - timeit(ed25519_publickey(dataset[0].sk, pk), pkticks) - edassert_equal_round(dataset[0].pk, pk, sizeof(pk), i, "public key didn't match"); - timeit(ed25519_sign((unsigned char *)dataset[0].m, 0, dataset[0].sk, pk, sig), signticks) - edassert_equal_round(dataset[0].sig, sig, sizeof(sig), i, "signature didn't match"); - timeit(res = ed25519_sign_open((unsigned char *)dataset[0].m, 0, pk, sig), openticks) - edassert(!res, 0, "failed to open message"); - timeit(curved25519_scalarmult_basepoint(csk[1], csk[0]), curvedticks); - } - - printf("%.0f ticks/public key generation\n", (double)pkticks); - printf("%.0f ticks/signature\n", (double)signticks); - printf("%.0f ticks/signature verification\n", (double)openticks); - printf("%.0f ticks/curve25519 basepoint scalarmult\n", (double)curvedticks); -} - -int -main(void) { - test_main(); - test_batch(); - return 0; -} - diff --git a/src/tor/src/ext/ed25519/ref10/README.tor b/src/tor/src/ext/ed25519/ref10/README.tor deleted file mode 100644 index 38ed97ba0..000000000 --- a/src/tor/src/ext/ed25519/ref10/README.tor +++ /dev/null @@ -1,23 +0,0 @@ - -We've made the following changes to the stock ed25519_ref10 from -supercop-20140622: - - * We added the necessary glue to provide integers of fixed bit - sizes, SHA512, and to compile without warnings everywhere we need - to build. - - * Secret keys are stored in expanded format. There are functions - to expand them from the 32-byte seed. - - * Signatures are made and processed detached from the messages that - they sign. (In other words, we support "make signature" and - "check signature", not "create signed message" and "check and - unpack signed message".) - - * There's an implementation of 'convert a curve25519 key to an - ed25519 key' so we can do cross-certification with curve25519 keys. - (keyconv.c) - - * There's an implementation of multiplicative key blinding so we - can use it for next-gen hidden srevice descriptors. (blinding.c) - diff --git a/src/tor/src/ext/ed25519/ref10/api.h b/src/tor/src/ext/ed25519/ref10/api.h deleted file mode 100644 index d88dae0c3..000000000 --- a/src/tor/src/ext/ed25519/ref10/api.h +++ /dev/null @@ -1,4 +0,0 @@ -#define CRYPTO_SECRETKEYBYTES 64 -#define CRYPTO_PUBLICKEYBYTES 32 -#define CRYPTO_BYTES 64 -#define CRYPTO_DETERMINISTIC 1 diff --git a/src/tor/src/ext/ed25519/ref10/base.h b/src/tor/src/ext/ed25519/ref10/base.h deleted file mode 100644 index 573bd8a05..000000000 --- a/src/tor/src/ext/ed25519/ref10/base.h +++ /dev/null @@ -1,1344 +0,0 @@ -{ - { - { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 }, - { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 }, - { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 }, - }, - { - { -12815894,-12976347,-21581243,11784320,-25355658,-2750717,-11717903,-3814571,-358445,-10211303 }, - { -21703237,6903825,27185491,6451973,-29577724,-9554005,-15616551,11189268,-26829678,-5319081 }, - { 26966642,11152617,32442495,15396054,14353839,-12752335,-3128826,-9541118,-15472047,-4166697 }, - }, - { - { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 }, - { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 }, - { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 }, - }, - { - { -17036878,13921892,10945806,-6033431,27105052,-16084379,-28926210,15006023,3284568,-6276540 }, - { 23599295,-8306047,-11193664,-7687416,13236774,10506355,7464579,9656445,13059162,10374397 }, - { 7798556,16710257,3033922,2874086,28997861,2835604,32406664,-3839045,-641708,-101325 }, - }, - { - { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 }, - { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 }, - { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 }, - }, - { - { -15371964,-12862754,32573250,4720197,-26436522,5875511,-19188627,-15224819,-9818940,-12085777 }, - { -8549212,109983,15149363,2178705,22900618,4543417,3044240,-15689887,1762328,14866737 }, - { -18199695,-15951423,-10473290,1707278,-17185920,3916101,-28236412,3959421,27914454,4383652 }, - }, - { - { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 }, - { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 }, - { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 }, - }, - { - { 14499471,-2729599,-33191113,-4254652,28494862,14271267,30290735,10876454,-33154098,2381726 }, - { -7195431,-2655363,-14730155,462251,-27724326,3941372,-6236617,3696005,-32300832,15351955 }, - { 27431194,8222322,16448760,-3907995,-18707002,11938355,-32961401,-2970515,29551813,10109425 }, - }, -}, -{ - { - { -13657040,-13155431,-31283750,11777098,21447386,6519384,-2378284,-1627556,10092783,-4764171 }, - { 27939166,14210322,4677035,16277044,-22964462,-12398139,-32508754,12005538,-17810127,12803510 }, - { 17228999,-15661624,-1233527,300140,-1224870,-11714777,30364213,-9038194,18016357,4397660 }, - }, - { - { -10958843,-7690207,4776341,-14954238,27850028,-15602212,-26619106,14544525,-17477504,982639 }, - { 29253598,15796703,-2863982,-9908884,10057023,3163536,7332899,-4120128,-21047696,9934963 }, - { 5793303,16271923,-24131614,-10116404,29188560,1206517,-14747930,4559895,-30123922,-10897950 }, - }, - { - { -27643952,-11493006,16282657,-11036493,28414021,-15012264,24191034,4541697,-13338309,5500568 }, - { 12650548,-1497113,9052871,11355358,-17680037,-8400164,-17430592,12264343,10874051,13524335 }, - { 25556948,-3045990,714651,2510400,23394682,-10415330,33119038,5080568,-22528059,5376628 }, - }, - { - { -26088264,-4011052,-17013699,-3537628,-6726793,1920897,-22321305,-9447443,4535768,1569007 }, - { -2255422,14606630,-21692440,-8039818,28430649,8775819,-30494562,3044290,31848280,12543772 }, - { -22028579,2943893,-31857513,6777306,13784462,-4292203,-27377195,-2062731,7718482,14474653 }, - }, - { - { 2385315,2454213,-22631320,46603,-4437935,-15680415,656965,-7236665,24316168,-5253567 }, - { 13741529,10911568,-33233417,-8603737,-20177830,-1033297,33040651,-13424532,-20729456,8321686 }, - { 21060490,-2212744,15712757,-4336099,1639040,10656336,23845965,-11874838,-9984458,608372 }, - }, - { - { -13672732,-15087586,-10889693,-7557059,-6036909,11305547,1123968,-6780577,27229399,23887 }, - { -23244140,-294205,-11744728,14712571,-29465699,-2029617,12797024,-6440308,-1633405,16678954 }, - { -29500620,4770662,-16054387,14001338,7830047,9564805,-1508144,-4795045,-17169265,4904953 }, - }, - { - { 24059557,14617003,19037157,-15039908,19766093,-14906429,5169211,16191880,2128236,-4326833 }, - { -16981152,4124966,-8540610,-10653797,30336522,-14105247,-29806336,916033,-6882542,-2986532 }, - { -22630907,12419372,-7134229,-7473371,-16478904,16739175,285431,2763829,15736322,4143876 }, - }, - { - { 2379352,11839345,-4110402,-5988665,11274298,794957,212801,-14594663,23527084,-16458268 }, - { 33431127,-11130478,-17838966,-15626900,8909499,8376530,-32625340,4087881,-15188911,-14416214 }, - { 1767683,7197987,-13205226,-2022635,-13091350,448826,5799055,4357868,-4774191,-16323038 }, - }, -}, -{ - { - { 6721966,13833823,-23523388,-1551314,26354293,-11863321,23365147,-3949732,7390890,2759800 }, - { 4409041,2052381,23373853,10530217,7676779,-12885954,21302353,-4264057,1244380,-12919645 }, - { -4421239,7169619,4982368,-2957590,30256825,-2777540,14086413,9208236,15886429,16489664 }, - }, - { - { 1996075,10375649,14346367,13311202,-6874135,-16438411,-13693198,398369,-30606455,-712933 }, - { -25307465,9795880,-2777414,14878809,-33531835,14780363,13348553,12076947,-30836462,5113182 }, - { -17770784,11797796,31950843,13929123,-25888302,12288344,-30341101,-7336386,13847711,5387222 }, - }, - { - { -18582163,-3416217,17824843,-2340966,22744343,-10442611,8763061,3617786,-19600662,10370991 }, - { 20246567,-14369378,22358229,-543712,18507283,-10413996,14554437,-8746092,32232924,16763880 }, - { 9648505,10094563,26416693,14745928,-30374318,-6472621,11094161,15689506,3140038,-16510092 }, - }, - { - { -16160072,5472695,31895588,4744994,8823515,10365685,-27224800,9448613,-28774454,366295 }, - { 19153450,11523972,-11096490,-6503142,-24647631,5420647,28344573,8041113,719605,11671788 }, - { 8678025,2694440,-6808014,2517372,4964326,11152271,-15432916,-15266516,27000813,-10195553 }, - }, - { - { -15157904,7134312,8639287,-2814877,-7235688,10421742,564065,5336097,6750977,-14521026 }, - { 11836410,-3979488,26297894,16080799,23455045,15735944,1695823,-8819122,8169720,16220347 }, - { -18115838,8653647,17578566,-6092619,-8025777,-16012763,-11144307,-2627664,-5990708,-14166033 }, - }, - { - { -23308498,-10968312,15213228,-10081214,-30853605,-11050004,27884329,2847284,2655861,1738395 }, - { -27537433,-14253021,-25336301,-8002780,-9370762,8129821,21651608,-3239336,-19087449,-11005278 }, - { 1533110,3437855,23735889,459276,29970501,11335377,26030092,5821408,10478196,8544890 }, - }, - { - { 32173121,-16129311,24896207,3921497,22579056,-3410854,19270449,12217473,17789017,-3395995 }, - { -30552961,-2228401,-15578829,-10147201,13243889,517024,15479401,-3853233,30460520,1052596 }, - { -11614875,13323618,32618793,8175907,-15230173,12596687,27491595,-4612359,3179268,-9478891 }, - }, - { - { 31947069,-14366651,-4640583,-15339921,-15125977,-6039709,-14756777,-16411740,19072640,-9511060 }, - { 11685058,11822410,3158003,-13952594,33402194,-4165066,5977896,-5215017,473099,5040608 }, - { -20290863,8198642,-27410132,11602123,1290375,-2799760,28326862,1721092,-19558642,-3131606 }, - }, -}, -{ - { - { 7881532,10687937,7578723,7738378,-18951012,-2553952,21820786,8076149,-27868496,11538389 }, - { -19935666,3899861,18283497,-6801568,-15728660,-11249211,8754525,7446702,-5676054,5797016 }, - { -11295600,-3793569,-15782110,-7964573,12708869,-8456199,2014099,-9050574,-2369172,-5877341 }, - }, - { - { -22472376,-11568741,-27682020,1146375,18956691,16640559,1192730,-3714199,15123619,10811505 }, - { 14352098,-3419715,-18942044,10822655,32750596,4699007,-70363,15776356,-28886779,-11974553 }, - { -28241164,-8072475,-4978962,-5315317,29416931,1847569,-20654173,-16484855,4714547,-9600655 }, - }, - { - { 15200332,8368572,19679101,15970074,-31872674,1959451,24611599,-4543832,-11745876,12340220 }, - { 12876937,-10480056,33134381,6590940,-6307776,14872440,9613953,8241152,15370987,9608631 }, - { -4143277,-12014408,8446281,-391603,4407738,13629032,-7724868,15866074,-28210621,-8814099 }, - }, - { - { 26660628,-15677655,8393734,358047,-7401291,992988,-23904233,858697,20571223,8420556 }, - { 14620715,13067227,-15447274,8264467,14106269,15080814,33531827,12516406,-21574435,-12476749 }, - { 236881,10476226,57258,-14677024,6472998,2466984,17258519,7256740,8791136,15069930 }, - }, - { - { 1276410,-9371918,22949635,-16322807,-23493039,-5702186,14711875,4874229,-30663140,-2331391 }, - { 5855666,4990204,-13711848,7294284,-7804282,1924647,-1423175,-7912378,-33069337,9234253 }, - { 20590503,-9018988,31529744,-7352666,-2706834,10650548,31559055,-11609587,18979186,13396066 }, - }, - { - { 24474287,4968103,22267082,4407354,24063882,-8325180,-18816887,13594782,33514650,7021958 }, - { -11566906,-6565505,-21365085,15928892,-26158305,4315421,-25948728,-3916677,-21480480,12868082 }, - { -28635013,13504661,19988037,-2132761,21078225,6443208,-21446107,2244500,-12455797,-8089383 }, - }, - { - { -30595528,13793479,-5852820,319136,-25723172,-6263899,33086546,8957937,-15233648,5540521 }, - { -11630176,-11503902,-8119500,-7643073,2620056,1022908,-23710744,-1568984,-16128528,-14962807 }, - { 23152971,775386,27395463,14006635,-9701118,4649512,1689819,892185,-11513277,-15205948 }, - }, - { - { 9770129,9586738,26496094,4324120,1556511,-3550024,27453819,4763127,-19179614,5867134 }, - { -32765025,1927590,31726409,-4753295,23962434,-16019500,27846559,5931263,-29749703,-16108455 }, - { 27461885,-2977536,22380810,1815854,-23033753,-3031938,7283490,-15148073,-19526700,7734629 }, - }, -}, -{ - { - { -8010264,-9590817,-11120403,6196038,29344158,-13430885,7585295,-3176626,18549497,15302069 }, - { -32658337,-6171222,-7672793,-11051681,6258878,13504381,10458790,-6418461,-8872242,8424746 }, - { 24687205,8613276,-30667046,-3233545,1863892,-1830544,19206234,7134917,-11284482,-828919 }, - }, - { - { 11334899,-9218022,8025293,12707519,17523892,-10476071,10243738,-14685461,-5066034,16498837 }, - { 8911542,6887158,-9584260,-6958590,11145641,-9543680,17303925,-14124238,6536641,10543906 }, - { -28946384,15479763,-17466835,568876,-1497683,11223454,-2669190,-16625574,-27235709,8876771 }, - }, - { - { -25742899,-12566864,-15649966,-846607,-33026686,-796288,-33481822,15824474,-604426,-9039817 }, - { 10330056,70051,7957388,-9002667,9764902,15609756,27698697,-4890037,1657394,3084098 }, - { 10477963,-7470260,12119566,-13250805,29016247,-5365589,31280319,14396151,-30233575,15272409 }, - }, - { - { -12288309,3169463,28813183,16658753,25116432,-5630466,-25173957,-12636138,-25014757,1950504 }, - { -26180358,9489187,11053416,-14746161,-31053720,5825630,-8384306,-8767532,15341279,8373727 }, - { 28685821,7759505,-14378516,-12002860,-31971820,4079242,298136,-10232602,-2878207,15190420 }, - }, - { - { -32932876,13806336,-14337485,-15794431,-24004620,10940928,8669718,2742393,-26033313,-6875003 }, - { -1580388,-11729417,-25979658,-11445023,-17411874,-10912854,9291594,-16247779,-12154742,6048605 }, - { -30305315,14843444,1539301,11864366,20201677,1900163,13934231,5128323,11213262,9168384 }, - }, - { - { -26280513,11007847,19408960,-940758,-18592965,-4328580,-5088060,-11105150,20470157,-16398701 }, - { -23136053,9282192,14855179,-15390078,-7362815,-14408560,-22783952,14461608,14042978,5230683 }, - { 29969567,-2741594,-16711867,-8552442,9175486,-2468974,21556951,3506042,-5933891,-12449708 }, - }, - { - { -3144746,8744661,19704003,4581278,-20430686,6830683,-21284170,8971513,-28539189,15326563 }, - { -19464629,10110288,-17262528,-3503892,-23500387,1355669,-15523050,15300988,-20514118,9168260 }, - { -5353335,4488613,-23803248,16314347,7780487,-15638939,-28948358,9601605,33087103,-9011387 }, - }, - { - { -19443170,-15512900,-20797467,-12445323,-29824447,10229461,-27444329,-15000531,-5996870,15664672 }, - { 23294591,-16632613,-22650781,-8470978,27844204,11461195,13099750,-2460356,18151676,13417686 }, - { -24722913,-4176517,-31150679,5988919,-26858785,6685065,1661597,-12551441,15271676,-15452665 }, - }, -}, -{ - { - { 11433042,-13228665,8239631,-5279517,-1985436,-725718,-18698764,2167544,-6921301,-13440182 }, - { -31436171,15575146,30436815,12192228,-22463353,9395379,-9917708,-8638997,12215110,12028277 }, - { 14098400,6555944,23007258,5757252,-15427832,-12950502,30123440,4617780,-16900089,-655628 }, - }, - { - { -4026201,-15240835,11893168,13718664,-14809462,1847385,-15819999,10154009,23973261,-12684474 }, - { -26531820,-3695990,-1908898,2534301,-31870557,-16550355,18341390,-11419951,32013174,-10103539 }, - { -25479301,10876443,-11771086,-14625140,-12369567,1838104,21911214,6354752,4425632,-837822 }, - }, - { - { -10433389,-14612966,22229858,-3091047,-13191166,776729,-17415375,-12020462,4725005,14044970 }, - { 19268650,-7304421,1555349,8692754,-21474059,-9910664,6347390,-1411784,-19522291,-16109756 }, - { -24864089,12986008,-10898878,-5558584,-11312371,-148526,19541418,8180106,9282262,10282508 }, - }, - { - { -26205082,4428547,-8661196,-13194263,4098402,-14165257,15522535,8372215,5542595,-10702683 }, - { -10562541,14895633,26814552,-16673850,-17480754,-2489360,-2781891,6993761,-18093885,10114655 }, - { -20107055,-929418,31422704,10427861,-7110749,6150669,-29091755,-11529146,25953725,-106158 }, - }, - { - { -4234397,-8039292,-9119125,3046000,2101609,-12607294,19390020,6094296,-3315279,12831125 }, - { -15998678,7578152,5310217,14408357,-33548620,-224739,31575954,6326196,7381791,-2421839 }, - { -20902779,3296811,24736065,-16328389,18374254,7318640,6295303,8082724,-15362489,12339664 }, - }, - { - { 27724736,2291157,6088201,-14184798,1792727,5857634,13848414,15768922,25091167,14856294 }, - { -18866652,8331043,24373479,8541013,-701998,-9269457,12927300,-12695493,-22182473,-9012899 }, - { -11423429,-5421590,11632845,3405020,30536730,-11674039,-27260765,13866390,30146206,9142070 }, - }, - { - { 3924129,-15307516,-13817122,-10054960,12291820,-668366,-27702774,9326384,-8237858,4171294 }, - { -15921940,16037937,6713787,16606682,-21612135,2790944,26396185,3731949,345228,-5462949 }, - { -21327538,13448259,25284571,1143661,20614966,-8849387,2031539,-12391231,-16253183,-13582083 }, - }, - { - { 31016211,-16722429,26371392,-14451233,-5027349,14854137,17477601,3842657,28012650,-16405420 }, - { -5075835,9368966,-8562079,-4600902,-15249953,6970560,-9189873,16292057,-8867157,3507940 }, - { 29439664,3537914,23333589,6997794,-17555561,-11018068,-15209202,-15051267,-9164929,6580396 }, - }, -}, -{ - { - { -12185861,-7679788,16438269,10826160,-8696817,-6235611,17860444,-9273846,-2095802,9304567 }, - { 20714564,-4336911,29088195,7406487,11426967,-5095705,14792667,-14608617,5289421,-477127 }, - { -16665533,-10650790,-6160345,-13305760,9192020,-1802462,17271490,12349094,26939669,-3752294 }, - }, - { - { -12889898,9373458,31595848,16374215,21471720,13221525,-27283495,-12348559,-3698806,117887 }, - { 22263325,-6560050,3984570,-11174646,-15114008,-566785,28311253,5358056,-23319780,541964 }, - { 16259219,3261970,2309254,-15534474,-16885711,-4581916,24134070,-16705829,-13337066,-13552195 }, - }, - { - { 9378160,-13140186,-22845982,-12745264,28198281,-7244098,-2399684,-717351,690426,14876244 }, - { 24977353,-314384,-8223969,-13465086,28432343,-1176353,-13068804,-12297348,-22380984,6618999 }, - { -1538174,11685646,12944378,13682314,-24389511,-14413193,8044829,-13817328,32239829,-5652762 }, - }, - { - { -18603066,4762990,-926250,8885304,-28412480,-3187315,9781647,-10350059,32779359,5095274 }, - { -33008130,-5214506,-32264887,-3685216,9460461,-9327423,-24601656,14506724,21639561,-2630236 }, - { -16400943,-13112215,25239338,15531969,3987758,-4499318,-1289502,-6863535,17874574,558605 }, - }, - { - { -13600129,10240081,9171883,16131053,-20869254,9599700,33499487,5080151,2085892,5119761 }, - { -22205145,-2519528,-16381601,414691,-25019550,2170430,30634760,-8363614,-31999993,-5759884 }, - { -6845704,15791202,8550074,-1312654,29928809,-12092256,27534430,-7192145,-22351378,12961482 }, - }, - { - { -24492060,-9570771,10368194,11582341,-23397293,-2245287,16533930,8206996,-30194652,-5159638 }, - { -11121496,-3382234,2307366,6362031,-135455,8868177,-16835630,7031275,7589640,8945490 }, - { -32152748,8917967,6661220,-11677616,-1192060,-15793393,7251489,-11182180,24099109,-14456170 }, - }, - { - { 5019558,-7907470,4244127,-14714356,-26933272,6453165,-19118182,-13289025,-6231896,-10280736 }, - { 10853594,10721687,26480089,5861829,-22995819,1972175,-1866647,-10557898,-3363451,-6441124 }, - { -17002408,5906790,221599,-6563147,7828208,-13248918,24362661,-2008168,-13866408,7421392 }, - }, - { - { 8139927,-6546497,32257646,-5890546,30375719,1886181,-21175108,15441252,28826358,-4123029 }, - { 6267086,9695052,7709135,-16603597,-32869068,-1886135,14795160,-7840124,13746021,-1742048 }, - { 28584902,7787108,-6732942,-15050729,22846041,-7571236,-3181936,-363524,4771362,-8419958 }, - }, -}, -{ - { - { 24949256,6376279,-27466481,-8174608,-18646154,-9930606,33543569,-12141695,3569627,11342593 }, - { 26514989,4740088,27912651,3697550,19331575,-11472339,6809886,4608608,7325975,-14801071 }, - { -11618399,-14554430,-24321212,7655128,-1369274,5214312,-27400540,10258390,-17646694,-8186692 }, - }, - { - { 11431204,15823007,26570245,14329124,18029990,4796082,-31446179,15580664,9280358,-3973687 }, - { -160783,-10326257,-22855316,-4304997,-20861367,-13621002,-32810901,-11181622,-15545091,4387441 }, - { -20799378,12194512,3937617,-5805892,-27154820,9340370,-24513992,8548137,20617071,-7482001 }, - }, - { - { -938825,-3930586,-8714311,16124718,24603125,-6225393,-13775352,-11875822,24345683,10325460 }, - { -19855277,-1568885,-22202708,8714034,14007766,6928528,16318175,-1010689,4766743,3552007 }, - { -21751364,-16730916,1351763,-803421,-4009670,3950935,3217514,14481909,10988822,-3994762 }, - }, - { - { 15564307,-14311570,3101243,5684148,30446780,-8051356,12677127,-6505343,-8295852,13296005 }, - { -9442290,6624296,-30298964,-11913677,-4670981,-2057379,31521204,9614054,-30000824,12074674 }, - { 4771191,-135239,14290749,-13089852,27992298,14998318,-1413936,-1556716,29832613,-16391035 }, - }, - { - { 7064884,-7541174,-19161962,-5067537,-18891269,-2912736,25825242,5293297,-27122660,13101590 }, - { -2298563,2439670,-7466610,1719965,-27267541,-16328445,32512469,-5317593,-30356070,-4190957 }, - { -30006540,10162316,-33180176,3981723,-16482138,-13070044,14413974,9515896,19568978,9628812 }, - }, - { - { 33053803,199357,15894591,1583059,27380243,-4580435,-17838894,-6106839,-6291786,3437740 }, - { -18978877,3884493,19469877,12726490,15913552,13614290,-22961733,70104,7463304,4176122 }, - { -27124001,10659917,11482427,-16070381,12771467,-6635117,-32719404,-5322751,24216882,5944158 }, - }, - { - { 8894125,7450974,-2664149,-9765752,-28080517,-12389115,19345746,14680796,11632993,5847885 }, - { 26942781,-2315317,9129564,-4906607,26024105,11769399,-11518837,6367194,-9727230,4782140 }, - { 19916461,-4828410,-22910704,-11414391,25606324,-5972441,33253853,8220911,6358847,-1873857 }, - }, - { - { 801428,-2081702,16569428,11065167,29875704,96627,7908388,-4480480,-13538503,1387155 }, - { 19646058,5720633,-11416706,12814209,11607948,12749789,14147075,15156355,-21866831,11835260 }, - { 19299512,1155910,28703737,14890794,2925026,7269399,26121523,15467869,-26560550,5052483 }, - }, -}, -{ - { - { -3017432,10058206,1980837,3964243,22160966,12322533,-6431123,-12618185,12228557,-7003677 }, - { 32944382,14922211,-22844894,5188528,21913450,-8719943,4001465,13238564,-6114803,8653815 }, - { 22865569,-4652735,27603668,-12545395,14348958,8234005,24808405,5719875,28483275,2841751 }, - }, - { - { -16420968,-1113305,-327719,-12107856,21886282,-15552774,-1887966,-315658,19932058,-12739203 }, - { -11656086,10087521,-8864888,-5536143,-19278573,-3055912,3999228,13239134,-4777469,-13910208 }, - { 1382174,-11694719,17266790,9194690,-13324356,9720081,20403944,11284705,-14013818,3093230 }, - }, - { - { 16650921,-11037932,-1064178,1570629,-8329746,7352753,-302424,16271225,-24049421,-6691850 }, - { -21911077,-5927941,-4611316,-5560156,-31744103,-10785293,24123614,15193618,-21652117,-16739389 }, - { -9935934,-4289447,-25279823,4372842,2087473,10399484,31870908,14690798,17361620,11864968 }, - }, - { - { -11307610,6210372,13206574,5806320,-29017692,-13967200,-12331205,-7486601,-25578460,-16240689 }, - { 14668462,-12270235,26039039,15305210,25515617,4542480,10453892,6577524,9145645,-6443880 }, - { 5974874,3053895,-9433049,-10385191,-31865124,3225009,-7972642,3936128,-5652273,-3050304 }, - }, - { - { 30625386,-4729400,-25555961,-12792866,-20484575,7695099,17097188,-16303496,-27999779,1803632 }, - { -3553091,9865099,-5228566,4272701,-5673832,-16689700,14911344,12196514,-21405489,7047412 }, - { 20093277,9920966,-11138194,-5343857,13161587,12044805,-32856851,4124601,-32343828,-10257566 }, - }, - { - { -20788824,14084654,-13531713,7842147,19119038,-13822605,4752377,-8714640,-21679658,2288038 }, - { -26819236,-3283715,29965059,3039786,-14473765,2540457,29457502,14625692,-24819617,12570232 }, - { -1063558,-11551823,16920318,12494842,1278292,-5869109,-21159943,-3498680,-11974704,4724943 }, - }, - { - { 17960970,-11775534,-4140968,-9702530,-8876562,-1410617,-12907383,-8659932,-29576300,1903856 }, - { 23134274,-14279132,-10681997,-1611936,20684485,15770816,-12989750,3190296,26955097,14109738 }, - { 15308788,5320727,-30113809,-14318877,22902008,7767164,29425325,-11277562,31960942,11934971 }, - }, - { - { -27395711,8435796,4109644,12222639,-24627868,14818669,20638173,4875028,10491392,1379718 }, - { -13159415,9197841,3875503,-8936108,-1383712,-5879801,33518459,16176658,21432314,12180697 }, - { -11787308,11500838,13787581,-13832590,-22430679,10140205,1465425,12689540,-10301319,-13872883 }, - }, -}, -{ - { - { 5414091,-15386041,-21007664,9643570,12834970,1186149,-2622916,-1342231,26128231,6032912 }, - { -26337395,-13766162,32496025,-13653919,17847801,-12669156,3604025,8316894,-25875034,-10437358 }, - { 3296484,6223048,24680646,-12246460,-23052020,5903205,-8862297,-4639164,12376617,3188849 }, - }, - { - { 29190488,-14659046,27549113,-1183516,3520066,-10697301,32049515,-7309113,-16109234,-9852307 }, - { -14744486,-9309156,735818,-598978,-20407687,-5057904,25246078,-15795669,18640741,-960977 }, - { -6928835,-16430795,10361374,5642961,4910474,12345252,-31638386,-494430,10530747,1053335 }, - }, - { - { -29265967,-14186805,-13538216,-12117373,-19457059,-10655384,-31462369,-2948985,24018831,15026644 }, - { -22592535,-3145277,-2289276,5953843,-13440189,9425631,25310643,13003497,-2314791,-15145616 }, - { -27419985,-603321,-8043984,-1669117,-26092265,13987819,-27297622,187899,-23166419,-2531735 }, - }, - { - { -21744398,-13810475,1844840,5021428,-10434399,-15911473,9716667,16266922,-5070217,726099 }, - { 29370922,-6053998,7334071,-15342259,9385287,2247707,-13661962,-4839461,30007388,-15823341 }, - { -936379,16086691,23751945,-543318,-1167538,-5189036,9137109,730663,9835848,4555336 }, - }, - { - { -23376435,1410446,-22253753,-12899614,30867635,15826977,17693930,544696,-11985298,12422646 }, - { 31117226,-12215734,-13502838,6561947,-9876867,-12757670,-5118685,-4096706,29120153,13924425 }, - { -17400879,-14233209,19675799,-2734756,-11006962,-5858820,-9383939,-11317700,7240931,-237388 }, - }, - { - { -31361739,-11346780,-15007447,-5856218,-22453340,-12152771,1222336,4389483,3293637,-15551743 }, - { -16684801,-14444245,11038544,11054958,-13801175,-3338533,-24319580,7733547,12796905,-6335822 }, - { -8759414,-10817836,-25418864,10783769,-30615557,-9746811,-28253339,3647836,3222231,-11160462 }, - }, - { - { 18606113,1693100,-25448386,-15170272,4112353,10045021,23603893,-2048234,-7550776,2484985 }, - { 9255317,-3131197,-12156162,-1004256,13098013,-9214866,16377220,-2102812,-19802075,-3034702 }, - { -22729289,7496160,-5742199,11329249,19991973,-3347502,-31718148,9936966,-30097688,-10618797 }, - }, - { - { 21878590,-5001297,4338336,13643897,-3036865,13160960,19708896,5415497,-7360503,-4109293 }, - { 27736861,10103576,12500508,8502413,-3413016,-9633558,10436918,-1550276,-23659143,-8132100 }, - { 19492550,-12104365,-29681976,-852630,-3208171,12403437,30066266,8367329,13243957,8709688 }, - }, -}, -{ - { - { 12015105,2801261,28198131,10151021,24818120,-4743133,-11194191,-5645734,5150968,7274186 }, - { 2831366,-12492146,1478975,6122054,23825128,-12733586,31097299,6083058,31021603,-9793610 }, - { -2529932,-2229646,445613,10720828,-13849527,-11505937,-23507731,16354465,15067285,-14147707 }, - }, - { - { 7840942,14037873,-33364863,15934016,-728213,-3642706,21403988,1057586,-19379462,-12403220 }, - { 915865,-16469274,15608285,-8789130,-24357026,6060030,-17371319,8410997,-7220461,16527025 }, - { 32922597,-556987,20336074,-16184568,10903705,-5384487,16957574,52992,23834301,6588044 }, - }, - { - { 32752030,11232950,3381995,-8714866,22652988,-10744103,17159699,16689107,-20314580,-1305992 }, - { -4689649,9166776,-25710296,-10847306,11576752,12733943,7924251,-2752281,1976123,-7249027 }, - { 21251222,16309901,-2983015,-6783122,30810597,12967303,156041,-3371252,12331345,-8237197 }, - }, - { - { 8651614,-4477032,-16085636,-4996994,13002507,2950805,29054427,-5106970,10008136,-4667901 }, - { 31486080,15114593,-14261250,12951354,14369431,-7387845,16347321,-13662089,8684155,-10532952 }, - { 19443825,11385320,24468943,-9659068,-23919258,2187569,-26263207,-6086921,31316348,14219878 }, - }, - { - { -28594490,1193785,32245219,11392485,31092169,15722801,27146014,6992409,29126555,9207390 }, - { 32382935,1110093,18477781,11028262,-27411763,-7548111,-4980517,10843782,-7957600,-14435730 }, - { 2814918,7836403,27519878,-7868156,-20894015,-11553689,-21494559,8550130,28346258,1994730 }, - }, - { - { -19578299,8085545,-14000519,-3948622,2785838,-16231307,-19516951,7174894,22628102,8115180 }, - { -30405132,955511,-11133838,-15078069,-32447087,-13278079,-25651578,3317160,-9943017,930272 }, - { -15303681,-6833769,28856490,1357446,23421993,1057177,24091212,-1388970,-22765376,-10650715 }, - }, - { - { -22751231,-5303997,-12907607,-12768866,-15811511,-7797053,-14839018,-16554220,-1867018,8398970 }, - { -31969310,2106403,-4736360,1362501,12813763,16200670,22981545,-6291273,18009408,-15772772 }, - { -17220923,-9545221,-27784654,14166835,29815394,7444469,29551787,-3727419,19288549,1325865 }, - }, - { - { 15100157,-15835752,-23923978,-1005098,-26450192,15509408,12376730,-3479146,33166107,-8042750 }, - { 20909231,13023121,-9209752,16251778,-5778415,-8094914,12412151,10018715,2213263,-13878373 }, - { 32529814,-11074689,30361439,-16689753,-9135940,1513226,22922121,6382134,-5766928,8371348 }, - }, -}, -{ - { - { 9923462,11271500,12616794,3544722,-29998368,-1721626,12891687,-8193132,-26442943,10486144 }, - { -22597207,-7012665,8587003,-8257861,4084309,-12970062,361726,2610596,-23921530,-11455195 }, - { 5408411,-1136691,-4969122,10561668,24145918,14240566,31319731,-4235541,19985175,-3436086 }, - }, - { - { -13994457,16616821,14549246,3341099,32155958,13648976,-17577068,8849297,65030,8370684 }, - { -8320926,-12049626,31204563,5839400,-20627288,-1057277,-19442942,6922164,12743482,-9800518 }, - { -2361371,12678785,28815050,4759974,-23893047,4884717,23783145,11038569,18800704,255233 }, - }, - { - { -5269658,-1773886,13957886,7990715,23132995,728773,13393847,9066957,19258688,-14753793 }, - { -2936654,-10827535,-10432089,14516793,-3640786,4372541,-31934921,2209390,-1524053,2055794 }, - { 580882,16705327,5468415,-2683018,-30926419,-14696000,-7203346,-8994389,-30021019,7394435 }, - }, - { - { 23838809,1822728,-15738443,15242727,8318092,-3733104,-21672180,-3492205,-4821741,14799921 }, - { 13345610,9759151,3371034,-16137791,16353039,8577942,31129804,13496856,-9056018,7402518 }, - { 2286874,-4435931,-20042458,-2008336,-13696227,5038122,11006906,-15760352,8205061,1607563 }, - }, - { - { 14414086,-8002132,3331830,-3208217,22249151,-5594188,18364661,-2906958,30019587,-9029278 }, - { -27688051,1585953,-10775053,931069,-29120221,-11002319,-14410829,12029093,9944378,8024 }, - { 4368715,-3709630,29874200,-15022983,-20230386,-11410704,-16114594,-999085,-8142388,5640030 }, - }, - { - { 10299610,13746483,11661824,16234854,7630238,5998374,9809887,-16694564,15219798,-14327783 }, - { 27425505,-5719081,3055006,10660664,23458024,595578,-15398605,-1173195,-18342183,9742717 }, - { 6744077,2427284,26042789,2720740,-847906,1118974,32324614,7406442,12420155,1994844 }, - }, - { - { 14012521,-5024720,-18384453,-9578469,-26485342,-3936439,-13033478,-10909803,24319929,-6446333 }, - { 16412690,-4507367,10772641,15929391,-17068788,-4658621,10555945,-10484049,-30102368,-4739048 }, - { 22397382,-7767684,-9293161,-12792868,17166287,-9755136,-27333065,6199366,21880021,-12250760 }, - }, - { - { -4283307,5368523,-31117018,8163389,-30323063,3209128,16557151,8890729,8840445,4957760 }, - { -15447727,709327,-6919446,-10870178,-29777922,6522332,-21720181,12130072,-14796503,5005757 }, - { -2114751,-14308128,23019042,15765735,-25269683,6002752,10183197,-13239326,-16395286,-2176112 }, - }, -}, -{ - { - { -19025756,1632005,13466291,-7995100,-23640451,16573537,-32013908,-3057104,22208662,2000468 }, - { 3065073,-1412761,-25598674,-361432,-17683065,-5703415,-8164212,11248527,-3691214,-7414184 }, - { 10379208,-6045554,8877319,1473647,-29291284,-12507580,16690915,2553332,-3132688,16400289 }, - }, - { - { 15716668,1254266,-18472690,7446274,-8448918,6344164,-22097271,-7285580,26894937,9132066 }, - { 24158887,12938817,11085297,-8177598,-28063478,-4457083,-30576463,64452,-6817084,-2692882 }, - { 13488534,7794716,22236231,5989356,25426474,-12578208,2350710,-3418511,-4688006,2364226 }, - }, - { - { 16335052,9132434,25640582,6678888,1725628,8517937,-11807024,-11697457,15445875,-7798101 }, - { 29004207,-7867081,28661402,-640412,-12794003,-7943086,31863255,-4135540,-278050,-15759279 }, - { -6122061,-14866665,-28614905,14569919,-10857999,-3591829,10343412,-6976290,-29828287,-10815811 }, - }, - { - { 27081650,3463984,14099042,-4517604,1616303,-6205604,29542636,15372179,17293797,960709 }, - { 20263915,11434237,-5765435,11236810,13505955,-10857102,-16111345,6493122,-19384511,7639714 }, - { -2830798,-14839232,25403038,-8215196,-8317012,-16173699,18006287,-16043750,29994677,-15808121 }, - }, - { - { 9769828,5202651,-24157398,-13631392,-28051003,-11561624,-24613141,-13860782,-31184575,709464 }, - { 12286395,13076066,-21775189,-1176622,-25003198,4057652,-32018128,-8890874,16102007,13205847 }, - { 13733362,5599946,10557076,3195751,-5557991,8536970,-25540170,8525972,10151379,10394400 }, - }, - { - { 4024660,-16137551,22436262,12276534,-9099015,-2686099,19698229,11743039,-33302334,8934414 }, - { -15879800,-4525240,-8580747,-2934061,14634845,-698278,-9449077,3137094,-11536886,11721158 }, - { 17555939,-5013938,8268606,2331751,-22738815,9761013,9319229,8835153,-9205489,-1280045 }, - }, - { - { -461409,-7830014,20614118,16688288,-7514766,-4807119,22300304,505429,6108462,-6183415 }, - { -5070281,12367917,-30663534,3234473,32617080,-8422642,29880583,-13483331,-26898490,-7867459 }, - { -31975283,5726539,26934134,10237677,-3173717,-605053,24199304,3795095,7592688,-14992079 }, - }, - { - { 21594432,-14964228,17466408,-4077222,32537084,2739898,6407723,12018833,-28256052,4298412 }, - { -20650503,-11961496,-27236275,570498,3767144,-1717540,13891942,-1569194,13717174,10805743 }, - { -14676630,-15644296,15287174,11927123,24177847,-8175568,-796431,14860609,-26938930,-5863836 }, - }, -}, -{ - { - { 12962541,5311799,-10060768,11658280,18855286,-7954201,13286263,-12808704,-4381056,9882022 }, - { 18512079,11319350,-20123124,15090309,18818594,5271736,-22727904,3666879,-23967430,-3299429 }, - { -6789020,-3146043,16192429,13241070,15898607,-14206114,-10084880,-6661110,-2403099,5276065 }, - }, - { - { 30169808,-5317648,26306206,-11750859,27814964,7069267,7152851,3684982,1449224,13082861 }, - { 10342826,3098505,2119311,193222,25702612,12233820,23697382,15056736,-21016438,-8202000 }, - { -33150110,3261608,22745853,7948688,19370557,-15177665,-26171976,6482814,-10300080,-11060101 }, - }, - { - { 32869458,-5408545,25609743,15678670,-10687769,-15471071,26112421,2521008,-22664288,6904815 }, - { 29506923,4457497,3377935,-9796444,-30510046,12935080,1561737,3841096,-29003639,-6657642 }, - { 10340844,-6630377,-18656632,-2278430,12621151,-13339055,30878497,-11824370,-25584551,5181966 }, - }, - { - { 25940115,-12658025,17324188,-10307374,-8671468,15029094,24396252,-16450922,-2322852,-12388574 }, - { -21765684,9916823,-1300409,4079498,-1028346,11909559,1782390,12641087,20603771,-6561742 }, - { -18882287,-11673380,24849422,11501709,13161720,-4768874,1925523,11914390,4662781,7820689 }, - }, - { - { 12241050,-425982,8132691,9393934,32846760,-1599620,29749456,12172924,16136752,15264020 }, - { -10349955,-14680563,-8211979,2330220,-17662549,-14545780,10658213,6671822,19012087,3772772 }, - { 3753511,-3421066,10617074,2028709,14841030,-6721664,28718732,-15762884,20527771,12988982 }, - }, - { - { -14822485,-5797269,-3707987,12689773,-898983,-10914866,-24183046,-10564943,3299665,-12424953 }, - { -16777703,-15253301,-9642417,4978983,3308785,8755439,6943197,6461331,-25583147,8991218 }, - { -17226263,1816362,-1673288,-6086439,31783888,-8175991,-32948145,7417950,-30242287,1507265 }, - }, - { - { 29692663,6829891,-10498800,4334896,20945975,-11906496,-28887608,8209391,14606362,-10647073 }, - { -3481570,8707081,32188102,5672294,22096700,1711240,-33020695,9761487,4170404,-2085325 }, - { -11587470,14855945,-4127778,-1531857,-26649089,15084046,22186522,16002000,-14276837,-8400798 }, - }, - { - { -4811456,13761029,-31703877,-2483919,-3312471,7869047,-7113572,-9620092,13240845,10965870 }, - { -7742563,-8256762,-14768334,-13656260,-23232383,12387166,4498947,14147411,29514390,4302863 }, - { -13413405,-12407859,20757302,-13801832,14785143,8976368,-5061276,-2144373,17846988,-13971927 }, - }, -}, -{ - { - { -2244452,-754728,-4597030,-1066309,-6247172,1455299,-21647728,-9214789,-5222701,12650267 }, - { -9906797,-16070310,21134160,12198166,-27064575,708126,387813,13770293,-19134326,10958663 }, - { 22470984,12369526,23446014,-5441109,-21520802,-9698723,-11772496,-11574455,-25083830,4271862 }, - }, - { - { -25169565,-10053642,-19909332,15361595,-5984358,2159192,75375,-4278529,-32526221,8469673 }, - { 15854970,4148314,-8893890,7259002,11666551,13824734,-30531198,2697372,24154791,-9460943 }, - { 15446137,-15806644,29759747,14019369,30811221,-9610191,-31582008,12840104,24913809,9815020 }, - }, - { - { -4709286,-5614269,-31841498,-12288893,-14443537,10799414,-9103676,13438769,18735128,9466238 }, - { 11933045,9281483,5081055,-5183824,-2628162,-4905629,-7727821,-10896103,-22728655,16199064 }, - { 14576810,379472,-26786533,-8317236,-29426508,-10812974,-102766,1876699,30801119,2164795 }, - }, - { - { 15995086,3199873,13672555,13712240,-19378835,-4647646,-13081610,-15496269,-13492807,1268052 }, - { -10290614,-3659039,-3286592,10948818,23037027,3794475,-3470338,-12600221,-17055369,3565904 }, - { 29210088,-9419337,-5919792,-4952785,10834811,-13327726,-16512102,-10820713,-27162222,-14030531 }, - }, - { - { -13161890,15508588,16663704,-8156150,-28349942,9019123,-29183421,-3769423,2244111,-14001979 }, - { -5152875,-3800936,-9306475,-6071583,16243069,14684434,-25673088,-16180800,13491506,4641841 }, - { 10813417,643330,-19188515,-728916,30292062,-16600078,27548447,-7721242,14476989,-12767431 }, - }, - { - { 10292079,9984945,6481436,8279905,-7251514,7032743,27282937,-1644259,-27912810,12651324 }, - { -31185513,-813383,22271204,11835308,10201545,15351028,17099662,3988035,21721536,-3148940 }, - { 10202177,-6545839,-31373232,-9574638,-32150642,-8119683,-12906320,3852694,13216206,14842320 }, - }, - { - { -15815640,-10601066,-6538952,-7258995,-6984659,-6581778,-31500847,13765824,-27434397,9900184 }, - { 14465505,-13833331,-32133984,-14738873,-27443187,12990492,33046193,15796406,-7051866,-8040114 }, - { 30924417,-8279620,6359016,-12816335,16508377,9071735,-25488601,15413635,9524356,-7018878 }, - }, - { - { 12274201,-13175547,32627641,-1785326,6736625,13267305,5237659,-5109483,15663516,4035784 }, - { -2951309,8903985,17349946,601635,-16432815,-4612556,-13732739,-15889334,-22258478,4659091 }, - { -16916263,-4952973,-30393711,-15158821,20774812,15897498,5736189,15026997,-2178256,-13455585 }, - }, -}, -{ - { - { -8858980,-2219056,28571666,-10155518,-474467,-10105698,-3801496,278095,23440562,-290208 }, - { 10226241,-5928702,15139956,120818,-14867693,5218603,32937275,11551483,-16571960,-7442864 }, - { 17932739,-12437276,-24039557,10749060,11316803,7535897,22503767,5561594,-3646624,3898661 }, - }, - { - { 7749907,-969567,-16339731,-16464,-25018111,15122143,-1573531,7152530,21831162,1245233 }, - { 26958459,-14658026,4314586,8346991,-5677764,11960072,-32589295,-620035,-30402091,-16716212 }, - { -12165896,9166947,33491384,13673479,29787085,13096535,6280834,14587357,-22338025,13987525 }, - }, - { - { -24349909,7778775,21116000,15572597,-4833266,-5357778,-4300898,-5124639,-7469781,-2858068 }, - { 9681908,-6737123,-31951644,13591838,-6883821,386950,31622781,6439245,-14581012,4091397 }, - { -8426427,1470727,-28109679,-1596990,3978627,-5123623,-19622683,12092163,29077877,-14741988 }, - }, - { - { 5269168,-6859726,-13230211,-8020715,25932563,1763552,-5606110,-5505881,-20017847,2357889 }, - { 32264008,-15407652,-5387735,-1160093,-2091322,-3946900,23104804,-12869908,5727338,189038 }, - { 14609123,-8954470,-6000566,-16622781,-14577387,-7743898,-26745169,10942115,-25888931,-14884697 }, - }, - { - { 20513500,5557931,-15604613,7829531,26413943,-2019404,-21378968,7471781,13913677,-5137875 }, - { -25574376,11967826,29233242,12948236,-6754465,4713227,-8940970,14059180,12878652,8511905 }, - { -25656801,3393631,-2955415,-7075526,-2250709,9366908,-30223418,6812974,5568676,-3127656 }, - }, - { - { 11630004,12144454,2116339,13606037,27378885,15676917,-17408753,-13504373,-14395196,8070818 }, - { 27117696,-10007378,-31282771,-5570088,1127282,12772488,-29845906,10483306,-11552749,-1028714 }, - { 10637467,-5688064,5674781,1072708,-26343588,-6982302,-1683975,9177853,-27493162,15431203 }, - }, - { - { 20525145,10892566,-12742472,12779443,-29493034,16150075,-28240519,14943142,-15056790,-7935931 }, - { -30024462,5626926,-551567,-9981087,753598,11981191,25244767,-3239766,-3356550,9594024 }, - { -23752644,2636870,-5163910,-10103818,585134,7877383,11345683,-6492290,13352335,-10977084 }, - }, - { - { -1931799,-5407458,3304649,-12884869,17015806,-4877091,-29783850,-7752482,-13215537,-319204 }, - { 20239939,6607058,6203985,3483793,-18386976,-779229,-20723742,15077870,-22750759,14523817 }, - { 27406042,-6041657,27423596,-4497394,4996214,10002360,-28842031,-4545494,-30172742,-4805667 }, - }, -}, -{ - { - { 11374242,12660715,17861383,-12540833,10935568,1099227,-13886076,-9091740,-27727044,11358504 }, - { -12730809,10311867,1510375,10778093,-2119455,-9145702,32676003,11149336,-26123651,4985768 }, - { -19096303,341147,-6197485,-239033,15756973,-8796662,-983043,13794114,-19414307,-15621255 }, - }, - { - { 6490081,11940286,25495923,-7726360,8668373,-8751316,3367603,6970005,-1691065,-9004790 }, - { 1656497,13457317,15370807,6364910,13605745,8362338,-19174622,-5475723,-16796596,-5031438 }, - { -22273315,-13524424,-64685,-4334223,-18605636,-10921968,-20571065,-7007978,-99853,-10237333 }, - }, - { - { 17747465,10039260,19368299,-4050591,-20630635,-16041286,31992683,-15857976,-29260363,-5511971 }, - { 31932027,-4986141,-19612382,16366580,22023614,88450,11371999,-3744247,4882242,-10626905 }, - { 29796507,37186,19818052,10115756,-11829032,3352736,18551198,3272828,-5190932,-4162409 }, - }, - { - { 12501286,4044383,-8612957,-13392385,-32430052,5136599,-19230378,-3529697,330070,-3659409 }, - { 6384877,2899513,17807477,7663917,-2358888,12363165,25366522,-8573892,-271295,12071499 }, - { -8365515,-4042521,25133448,-4517355,-6211027,2265927,-32769618,1936675,-5159697,3829363 }, - }, - { - { 28425966,-5835433,-577090,-4697198,-14217555,6870930,7921550,-6567787,26333140,14267664 }, - { -11067219,11871231,27385719,-10559544,-4585914,-11189312,10004786,-8709488,-21761224,8930324 }, - { -21197785,-16396035,25654216,-1725397,12282012,11008919,1541940,4757911,-26491501,-16408940 }, - }, - { - { 13537262,-7759490,-20604840,10961927,-5922820,-13218065,-13156584,6217254,-15943699,13814990 }, - { -17422573,15157790,18705543,29619,24409717,-260476,27361681,9257833,-1956526,-1776914 }, - { -25045300,-10191966,15366585,15166509,-13105086,8423556,-29171540,12361135,-18685978,4578290 }, - }, - { - { 24579768,3711570,1342322,-11180126,-27005135,14124956,-22544529,14074919,21964432,8235257 }, - { -6528613,-2411497,9442966,-5925588,12025640,-1487420,-2981514,-1669206,13006806,2355433 }, - { -16304899,-13605259,-6632427,-5142349,16974359,-10911083,27202044,1719366,1141648,-12796236 }, - }, - { - { -12863944,-13219986,-8318266,-11018091,-6810145,-4843894,13475066,-3133972,32674895,13715045 }, - { 11423335,-5468059,32344216,8962751,24989809,9241752,-13265253,16086212,-28740881,-15642093 }, - { -1409668,12530728,-6368726,10847387,19531186,-14132160,-11709148,7791794,-27245943,4383347 }, - }, -}, -{ - { - { -28970898,5271447,-1266009,-9736989,-12455236,16732599,-4862407,-4906449,27193557,6245191 }, - { -15193956,5362278,-1783893,2695834,4960227,12840725,23061898,3260492,22510453,8577507 }, - { -12632451,11257346,-32692994,13548177,-721004,10879011,31168030,13952092,-29571492,-3635906 }, - }, - { - { 3877321,-9572739,32416692,5405324,-11004407,-13656635,3759769,11935320,5611860,8164018 }, - { -16275802,14667797,15906460,12155291,-22111149,-9039718,32003002,-8832289,5773085,-8422109 }, - { -23788118,-8254300,1950875,8937633,18686727,16459170,-905725,12376320,31632953,190926 }, - }, - { - { -24593607,-16138885,-8423991,13378746,14162407,6901328,-8288749,4508564,-25341555,-3627528 }, - { 8884438,-5884009,6023974,10104341,-6881569,-4941533,18722941,-14786005,-1672488,827625 }, - { -32720583,-16289296,-32503547,7101210,13354605,2659080,-1800575,-14108036,-24878478,1541286 }, - }, - { - { 2901347,-1117687,3880376,-10059388,-17620940,-3612781,-21802117,-3567481,20456845,-1885033 }, - { 27019610,12299467,-13658288,-1603234,-12861660,-4861471,-19540150,-5016058,29439641,15138866 }, - { 21536104,-6626420,-32447818,-10690208,-22408077,5175814,-5420040,-16361163,7779328,109896 }, - }, - { - { 30279744,14648750,-8044871,6425558,13639621,-743509,28698390,12180118,23177719,-554075 }, - { 26572847,3405927,-31701700,12890905,-19265668,5335866,-6493768,2378492,4439158,-13279347 }, - { -22716706,3489070,-9225266,-332753,18875722,-1140095,14819434,-12731527,-17717757,-5461437 }, - }, - { - { -5056483,16566551,15953661,3767752,-10436499,15627060,-820954,2177225,8550082,-15114165 }, - { -18473302,16596775,-381660,15663611,22860960,15585581,-27844109,-3582739,-23260460,-8428588 }, - { -32480551,15707275,-8205912,-5652081,29464558,2713815,-22725137,15860482,-21902570,1494193 }, - }, - { - { -19562091,-14087393,-25583872,-9299552,13127842,759709,21923482,16529112,8742704,12967017 }, - { -28464899,1553205,32536856,-10473729,-24691605,-406174,-8914625,-2933896,-29903758,15553883 }, - { 21877909,3230008,9881174,10539357,-4797115,2841332,11543572,14513274,19375923,-12647961 }, - }, - { - { 8832269,-14495485,13253511,5137575,5037871,4078777,24880818,-6222716,2862653,9455043 }, - { 29306751,5123106,20245049,-14149889,9592566,8447059,-2077124,-2990080,15511449,4789663 }, - { -20679756,7004547,8824831,-9434977,-4045704,-3750736,-5754762,108893,23513200,16652362 }, - }, -}, -{ - { - { -33256173,4144782,-4476029,-6579123,10770039,-7155542,-6650416,-12936300,-18319198,10212860 }, - { 2756081,8598110,7383731,-6859892,22312759,-1105012,21179801,2600940,-9988298,-12506466 }, - { -24645692,13317462,-30449259,-15653928,21365574,-10869657,11344424,864440,-2499677,-16710063 }, - }, - { - { -26432803,6148329,-17184412,-14474154,18782929,-275997,-22561534,211300,2719757,4940997 }, - { -1323882,3911313,-6948744,14759765,-30027150,7851207,21690126,8518463,26699843,5276295 }, - { -13149873,-6429067,9396249,365013,24703301,-10488939,1321586,149635,-15452774,7159369 }, - }, - { - { 9987780,-3404759,17507962,9505530,9731535,-2165514,22356009,8312176,22477218,-8403385 }, - { 18155857,-16504990,19744716,9006923,15154154,-10538976,24256460,-4864995,-22548173,9334109 }, - { 2986088,-4911893,10776628,-3473844,10620590,-7083203,-21413845,14253545,-22587149,536906 }, - }, - { - { 4377756,8115836,24567078,15495314,11625074,13064599,7390551,10589625,10838060,-15420424 }, - { -19342404,867880,9277171,-3218459,-14431572,-1986443,19295826,-15796950,6378260,699185 }, - { 7895026,4057113,-7081772,-13077756,-17886831,-323126,-716039,15693155,-5045064,-13373962 }, - }, - { - { -7737563,-5869402,-14566319,-7406919,11385654,13201616,31730678,-10962840,-3918636,-9669325 }, - { 10188286,-15770834,-7336361,13427543,22223443,14896287,30743455,7116568,-21786507,5427593 }, - { 696102,13206899,27047647,-10632082,15285305,-9853179,10798490,-4578720,19236243,12477404 }, - }, - { - { -11229439,11243796,-17054270,-8040865,-788228,-8167967,-3897669,11180504,-23169516,7733644 }, - { 17800790,-14036179,-27000429,-11766671,23887827,3149671,23466177,-10538171,10322027,15313801 }, - { 26246234,11968874,32263343,-5468728,6830755,-13323031,-15794704,-101982,-24449242,10890804 }, - }, - { - { -31365647,10271363,-12660625,-6267268,16690207,-13062544,-14982212,16484931,25180797,-5334884 }, - { -586574,10376444,-32586414,-11286356,19801893,10997610,2276632,9482883,316878,13820577 }, - { -9882808,-4510367,-2115506,16457136,-11100081,11674996,30756178,-7515054,30696930,-3712849 }, - }, - { - { 32988917,-9603412,12499366,7910787,-10617257,-11931514,-7342816,-9985397,-32349517,7392473 }, - { -8855661,15927861,9866406,-3649411,-2396914,-16655781,-30409476,-9134995,25112947,-2926644 }, - { -2504044,-436966,25621774,-5678772,15085042,-5479877,-24884878,-13526194,5537438,-13914319 }, - }, -}, -{ - { - { -11225584,2320285,-9584280,10149187,-33444663,5808648,-14876251,-1729667,31234590,6090599 }, - { -9633316,116426,26083934,2897444,-6364437,-2688086,609721,15878753,-6970405,-9034768 }, - { -27757857,247744,-15194774,-9002551,23288161,-10011936,-23869595,6503646,20650474,1804084 }, - }, - { - { -27589786,15456424,8972517,8469608,15640622,4439847,3121995,-10329713,27842616,-202328 }, - { -15306973,2839644,22530074,10026331,4602058,5048462,28248656,5031932,-11375082,12714369 }, - { 20807691,-7270825,29286141,11421711,-27876523,-13868230,-21227475,1035546,-19733229,12796920 }, - }, - { - { 12076899,-14301286,-8785001,-11848922,-25012791,16400684,-17591495,-12899438,3480665,-15182815 }, - { -32361549,5457597,28548107,7833186,7303070,-11953545,-24363064,-15921875,-33374054,2771025 }, - { -21389266,421932,26597266,6860826,22486084,-6737172,-17137485,-4210226,-24552282,15673397 }, - }, - { - { -20184622,2338216,19788685,-9620956,-4001265,-8740893,-20271184,4733254,3727144,-12934448 }, - { 6120119,814863,-11794402,-622716,6812205,-15747771,2019594,7975683,31123697,-10958981 }, - { 30069250,-11435332,30434654,2958439,18399564,-976289,12296869,9204260,-16432438,9648165 }, - }, - { - { 32705432,-1550977,30705658,7451065,-11805606,9631813,3305266,5248604,-26008332,-11377501 }, - { 17219865,2375039,-31570947,-5575615,-19459679,9219903,294711,15298639,2662509,-16297073 }, - { -1172927,-7558695,-4366770,-4287744,-21346413,-8434326,32087529,-1222777,32247248,-14389861 }, - }, - { - { 14312628,1221556,17395390,-8700143,-4945741,-8684635,-28197744,-9637817,-16027623,-13378845 }, - { -1428825,-9678990,-9235681,6549687,-7383069,-468664,23046502,9803137,17597934,2346211 }, - { 18510800,15337574,26171504,981392,-22241552,7827556,-23491134,-11323352,3059833,-11782870 }, - }, - { - { 10141598,6082907,17829293,-1947643,9830092,13613136,-25556636,-5544586,-33502212,3592096 }, - { 33114168,-15889352,-26525686,-13343397,33076705,8716171,1151462,1521897,-982665,-6837803 }, - { -32939165,-4255815,23947181,-324178,-33072974,-12305637,-16637686,3891704,26353178,693168 }, - }, - { - { 30374239,1595580,-16884039,13186931,4600344,406904,9585294,-400668,31375464,14369965 }, - { -14370654,-7772529,1510301,6434173,-18784789,-6262728,32732230,-13108839,17901441,16011505 }, - { 18171223,-11934626,-12500402,15197122,-11038147,-15230035,-19172240,-16046376,8764035,12309598 }, - }, -}, -{ - { - { 5975908,-5243188,-19459362,-9681747,-11541277,14015782,-23665757,1228319,17544096,-10593782 }, - { 5811932,-1715293,3442887,-2269310,-18367348,-8359541,-18044043,-15410127,-5565381,12348900 }, - { -31399660,11407555,25755363,6891399,-3256938,14872274,-24849353,8141295,-10632534,-585479 }, - }, - { - { -12675304,694026,-5076145,13300344,14015258,-14451394,-9698672,-11329050,30944593,1130208 }, - { 8247766,-6710942,-26562381,-7709309,-14401939,-14648910,4652152,2488540,23550156,-271232 }, - { 17294316,-3788438,7026748,15626851,22990044,113481,2267737,-5908146,-408818,-137719 }, - }, - { - { 16091085,-16253926,18599252,7340678,2137637,-1221657,-3364161,14550936,3260525,-7166271 }, - { -4910104,-13332887,18550887,10864893,-16459325,-7291596,-23028869,-13204905,-12748722,2701326 }, - { -8574695,16099415,4629974,-16340524,-20786213,-6005432,-10018363,9276971,11329923,1862132 }, - }, - { - { 14763076,-15903608,-30918270,3689867,3511892,10313526,-21951088,12219231,-9037963,-940300 }, - { 8894987,-3446094,6150753,3013931,301220,15693451,-31981216,-2909717,-15438168,11595570 }, - { 15214962,3537601,-26238722,-14058872,4418657,-15230761,13947276,10730794,-13489462,-4363670 }, - }, - { - { -2538306,7682793,32759013,263109,-29984731,-7955452,-22332124,-10188635,977108,699994 }, - { -12466472,4195084,-9211532,550904,-15565337,12917920,19118110,-439841,-30534533,-14337913 }, - { 31788461,-14507657,4799989,7372237,8808585,-14747943,9408237,-10051775,12493932,-5409317 }, - }, - { - { -25680606,5260744,-19235809,-6284470,-3695942,16566087,27218280,2607121,29375955,6024730 }, - { 842132,-2794693,-4763381,-8722815,26332018,-12405641,11831880,6985184,-9940361,2854096 }, - { -4847262,-7969331,2516242,-5847713,9695691,-7221186,16512645,960770,12121869,16648078 }, - }, - { - { -15218652,14667096,-13336229,2013717,30598287,-464137,-31504922,-7882064,20237806,2838411 }, - { -19288047,4453152,15298546,-16178388,22115043,-15972604,12544294,-13470457,1068881,-12499905 }, - { -9558883,-16518835,33238498,13506958,30505848,-1114596,-8486907,-2630053,12521378,4845654 }, - }, - { - { -28198521,10744108,-2958380,10199664,7759311,-13088600,3409348,-873400,-6482306,-12885870 }, - { -23561822,6230156,-20382013,10655314,-24040585,-11621172,10477734,-1240216,-3113227,13974498 }, - { 12966261,15550616,-32038948,-1615346,21025980,-629444,5642325,7188737,18895762,12629579 }, - }, -}, -{ - { - { 14741879,-14946887,22177208,-11721237,1279741,8058600,11758140,789443,32195181,3895677 }, - { 10758205,15755439,-4509950,9243698,-4879422,6879879,-2204575,-3566119,-8982069,4429647 }, - { -2453894,15725973,-20436342,-10410672,-5803908,-11040220,-7135870,-11642895,18047436,-15281743 }, - }, - { - { -25173001,-11307165,29759956,11776784,-22262383,-15820455,10993114,-12850837,-17620701,-9408468 }, - { 21987233,700364,-24505048,14972008,-7774265,-5718395,32155026,2581431,-29958985,8773375 }, - { -25568350,454463,-13211935,16126715,25240068,8594567,20656846,12017935,-7874389,-13920155 }, - }, - { - { 6028182,6263078,-31011806,-11301710,-818919,2461772,-31841174,-5468042,-1721788,-2776725 }, - { -12278994,16624277,987579,-5922598,32908203,1248608,7719845,-4166698,28408820,6816612 }, - { -10358094,-8237829,19549651,-12169222,22082623,16147817,20613181,13982702,-10339570,5067943 }, - }, - { - { -30505967,-3821767,12074681,13582412,-19877972,2443951,-19719286,12746132,5331210,-10105944 }, - { 30528811,3601899,-1957090,4619785,-27361822,-15436388,24180793,-12570394,27679908,-1648928 }, - { 9402404,-13957065,32834043,10838634,-26580150,-13237195,26653274,-8685565,22611444,-12715406 }, - }, - { - { 22190590,1118029,22736441,15130463,-30460692,-5991321,19189625,-4648942,4854859,6622139 }, - { -8310738,-2953450,-8262579,-3388049,-10401731,-271929,13424426,-3567227,26404409,13001963 }, - { -31241838,-15415700,-2994250,8939346,11562230,-12840670,-26064365,-11621720,-15405155,11020693 }, - }, - { - { 1866042,-7949489,-7898649,-10301010,12483315,13477547,3175636,-12424163,28761762,1406734 }, - { -448555,-1777666,13018551,3194501,-9580420,-11161737,24760585,-4347088,25577411,-13378680 }, - { -24290378,4759345,-690653,-1852816,2066747,10693769,-29595790,9884936,-9368926,4745410 }, - }, - { - { -9141284,6049714,-19531061,-4341411,-31260798,9944276,-15462008,-11311852,10931924,-11931931 }, - { -16561513,14112680,-8012645,4817318,-8040464,-11414606,-22853429,10856641,-20470770,13434654 }, - { 22759489,-10073434,-16766264,-1871422,13637442,-10168091,1765144,-12654326,28445307,-5364710 }, - }, - { - { 29875063,12493613,2795536,-3786330,1710620,15181182,-10195717,-8788675,9074234,1167180 }, - { -26205683,11014233,-9842651,-2635485,-26908120,7532294,-18716888,-9535498,3843903,9367684 }, - { -10969595,-6403711,9591134,9582310,11349256,108879,16235123,8601684,-139197,4242895 }, - }, -}, -{ - { - { 22092954,-13191123,-2042793,-11968512,32186753,-11517388,-6574341,2470660,-27417366,16625501 }, - { -11057722,3042016,13770083,-9257922,584236,-544855,-7770857,2602725,-27351616,14247413 }, - { 6314175,-10264892,-32772502,15957557,-10157730,168750,-8618807,14290061,27108877,-1180880 }, - }, - { - { -8586597,-7170966,13241782,10960156,-32991015,-13794596,33547976,-11058889,-27148451,981874 }, - { 22833440,9293594,-32649448,-13618667,-9136966,14756819,-22928859,-13970780,-10479804,-16197962 }, - { -7768587,3326786,-28111797,10783824,19178761,14905060,22680049,13906969,-15933690,3797899 }, - }, - { - { 21721356,-4212746,-12206123,9310182,-3882239,-13653110,23740224,-2709232,20491983,-8042152 }, - { 9209270,-15135055,-13256557,-6167798,-731016,15289673,25947805,15286587,30997318,-6703063 }, - { 7392032,16618386,23946583,-8039892,-13265164,-1533858,-14197445,-2321576,17649998,-250080 }, - }, - { - { -9301088,-14193827,30609526,-3049543,-25175069,-1283752,-15241566,-9525724,-2233253,7662146 }, - { -17558673,1763594,-33114336,15908610,-30040870,-12174295,7335080,-8472199,-3174674,3440183 }, - { -19889700,-5977008,-24111293,-9688870,10799743,-16571957,40450,-4431835,4862400,1133 }, - }, - { - { -32856209,-7873957,-5422389,14860950,-16319031,7956142,7258061,311861,-30594991,-7379421 }, - { -3773428,-1565936,28985340,7499440,24445838,9325937,29727763,16527196,18278453,15405622 }, - { -4381906,8508652,-19898366,-3674424,-5984453,15149970,-13313598,843523,-21875062,13626197 }, - }, - { - { 2281448,-13487055,-10915418,-2609910,1879358,16164207,-10783882,3953792,13340839,15928663 }, - { 31727126,-7179855,-18437503,-8283652,2875793,-16390330,-25269894,-7014826,-23452306,5964753 }, - { 4100420,-5959452,-17179337,6017714,-18705837,12227141,-26684835,11344144,2538215,-7570755 }, - }, - { - { -9433605,6123113,11159803,-2156608,30016280,14966241,-20474983,1485421,-629256,-15958862 }, - { -26804558,4260919,11851389,9658551,-32017107,16367492,-20205425,-13191288,11659922,-11115118 }, - { 26180396,10015009,-30844224,-8581293,5418197,9480663,2231568,-10170080,33100372,-1306171 }, - }, - { - { 15121113,-5201871,-10389905,15427821,-27509937,-15992507,21670947,4486675,-5931810,-14466380 }, - { 16166486,-9483733,-11104130,6023908,-31926798,-1364923,2340060,-16254968,-10735770,-10039824 }, - { 28042865,-3557089,-12126526,12259706,-3717498,-6945899,6766453,-8689599,18036436,5803270 }, - }, -}, -{ - { - { -817581,6763912,11803561,1585585,10958447,-2671165,23855391,4598332,-6159431,-14117438 }, - { -31031306,-14256194,17332029,-2383520,31312682,-5967183,696309,50292,-20095739,11763584 }, - { -594563,-2514283,-32234153,12643980,12650761,14811489,665117,-12613632,-19773211,-10713562 }, - }, - { - { 30464590,-11262872,-4127476,-12734478,19835327,-7105613,-24396175,2075773,-17020157,992471 }, - { 18357185,-6994433,7766382,16342475,-29324918,411174,14578841,8080033,-11574335,-10601610 }, - { 19598397,10334610,12555054,2555664,18821899,-10339780,21873263,16014234,26224780,16452269 }, - }, - { - { -30223925,5145196,5944548,16385966,3976735,2009897,-11377804,-7618186,-20533829,3698650 }, - { 14187449,3448569,-10636236,-10810935,-22663880,-3433596,7268410,-10890444,27394301,12015369 }, - { 19695761,16087646,28032085,12999827,6817792,11427614,20244189,-1312777,-13259127,-3402461 }, - }, - { - { 30860103,12735208,-1888245,-4699734,-16974906,2256940,-8166013,12298312,-8550524,-10393462 }, - { -5719826,-11245325,-1910649,15569035,26642876,-7587760,-5789354,-15118654,-4976164,12651793 }, - { -2848395,9953421,11531313,-5282879,26895123,-12697089,-13118820,-16517902,9768698,-2533218 }, - }, - { - { -24719459,1894651,-287698,-4704085,15348719,-8156530,32767513,12765450,4940095,10678226 }, - { 18860224,15980149,-18987240,-1562570,-26233012,-11071856,-7843882,13944024,-24372348,16582019 }, - { -15504260,4970268,-29893044,4175593,-20993212,-2199756,-11704054,15444560,-11003761,7989037 }, - }, - { - { 31490452,5568061,-2412803,2182383,-32336847,4531686,-32078269,6200206,-19686113,-14800171 }, - { -17308668,-15879940,-31522777,-2831,-32887382,16375549,8680158,-16371713,28550068,-6857132 }, - { -28126887,-5688091,16837845,-1820458,-6850681,12700016,-30039981,4364038,1155602,5988841 }, - }, - { - { 21890435,-13272907,-12624011,12154349,-7831873,15300496,23148983,-4470481,24618407,8283181 }, - { -33136107,-10512751,9975416,6841041,-31559793,16356536,3070187,-7025928,1466169,10740210 }, - { -1509399,-15488185,-13503385,-10655916,32799044,909394,-13938903,-5779719,-32164649,-15327040 }, - }, - { - { 3960823,-14267803,-28026090,-15918051,-19404858,13146868,15567327,951507,-3260321,-573935 }, - { 24740841,5052253,-30094131,8961361,25877428,6165135,-24368180,14397372,-7380369,-6144105 }, - { -28888365,3510803,-28103278,-1158478,-11238128,-10631454,-15441463,-14453128,-1625486,-6494814 }, - }, -}, -{ - { - { 793299,-9230478,8836302,-6235707,-27360908,-2369593,33152843,-4885251,-9906200,-621852 }, - { 5666233,525582,20782575,-8038419,-24538499,14657740,16099374,1468826,-6171428,-15186581 }, - { -4859255,-3779343,-2917758,-6748019,7778750,11688288,-30404353,-9871238,-1558923,-9863646 }, - }, - { - { 10896332,-7719704,824275,472601,-19460308,3009587,25248958,14783338,-30581476,-15757844 }, - { 10566929,12612572,-31944212,11118703,-12633376,12362879,21752402,8822496,24003793,14264025 }, - { 27713862,-7355973,-11008240,9227530,27050101,2504721,23886875,-13117525,13958495,-5732453 }, - }, - { - { -23481610,4867226,-27247128,3900521,29838369,-8212291,-31889399,-10041781,7340521,-15410068 }, - { 4646514,-8011124,-22766023,-11532654,23184553,8566613,31366726,-1381061,-15066784,-10375192 }, - { -17270517,12723032,-16993061,14878794,21619651,-6197576,27584817,3093888,-8843694,3849921 }, - }, - { - { -9064912,2103172,25561640,-15125738,-5239824,9582958,32477045,-9017955,5002294,-15550259 }, - { -12057553,-11177906,21115585,-13365155,8808712,-12030708,16489530,13378448,-25845716,12741426 }, - { -5946367,10645103,-30911586,15390284,-3286982,-7118677,24306472,15852464,28834118,-7646072 }, - }, - { - { -17335748,-9107057,-24531279,9434953,-8472084,-583362,-13090771,455841,20461858,5491305 }, - { 13669248,-16095482,-12481974,-10203039,-14569770,-11893198,-24995986,11293807,-28588204,-9421832 }, - { 28497928,6272777,-33022994,14470570,8906179,-1225630,18504674,-14165166,29867745,-8795943 }, - }, - { - { -16207023,13517196,-27799630,-13697798,24009064,-6373891,-6367600,-13175392,22853429,-4012011 }, - { 24191378,16712145,-13931797,15217831,14542237,1646131,18603514,-11037887,12876623,-2112447 }, - { 17902668,4518229,-411702,-2829247,26878217,5258055,-12860753,608397,16031844,3723494 }, - }, - { - { -28632773,12763728,-20446446,7577504,33001348,-13017745,17558842,-7872890,23896954,-4314245 }, - { -20005381,-12011952,31520464,605201,2543521,5991821,-2945064,7229064,-9919646,-8826859 }, - { 28816045,298879,-28165016,-15920938,19000928,-1665890,-12680833,-2949325,-18051778,-2082915 }, - }, - { - { 16000882,-344896,3493092,-11447198,-29504595,-13159789,12577740,16041268,-19715240,7847707 }, - { 10151868,10572098,27312476,7922682,14825339,4723128,-32855931,-6519018,-10020567,3852848 }, - { -11430470,15697596,-21121557,-4420647,5386314,15063598,16514493,-15932110,29330899,-15076224 }, - }, -}, -{ - { - { -25499735,-4378794,-15222908,-6901211,16615731,2051784,3303702,15490,-27548796,12314391 }, - { 15683520,-6003043,18109120,-9980648,15337968,-5997823,-16717435,15921866,16103996,-3731215 }, - { -23169824,-10781249,13588192,-1628807,-3798557,-1074929,-19273607,5402699,-29815713,-9841101 }, - }, - { - { 23190676,2384583,-32714340,3462154,-29903655,-1529132,-11266856,8911517,-25205859,2739713 }, - { 21374101,-3554250,-33524649,9874411,15377179,11831242,-33529904,6134907,4931255,11987849 }, - { -7732,-2978858,-16223486,7277597,105524,-322051,-31480539,13861388,-30076310,10117930 }, - }, - { - { -29501170,-10744872,-26163768,13051539,-25625564,5089643,-6325503,6704079,12890019,15728940 }, - { -21972360,-11771379,-951059,-4418840,14704840,2695116,903376,-10428139,12885167,8311031 }, - { -17516482,5352194,10384213,-13811658,7506451,13453191,26423267,4384730,1888765,-5435404 }, - }, - { - { -25817338,-3107312,-13494599,-3182506,30896459,-13921729,-32251644,-12707869,-19464434,-3340243 }, - { -23607977,-2665774,-526091,4651136,5765089,4618330,6092245,14845197,17151279,-9854116 }, - { -24830458,-12733720,-15165978,10367250,-29530908,-265356,22825805,-7087279,-16866484,16176525 }, - }, - { - { -23583256,6564961,20063689,3798228,-4740178,7359225,2006182,-10363426,-28746253,-10197509 }, - { -10626600,-4486402,-13320562,-5125317,3432136,-6393229,23632037,-1940610,32808310,1099883 }, - { 15030977,5768825,-27451236,-2887299,-6427378,-15361371,-15277896,-6809350,2051441,-15225865 }, - }, - { - { -3362323,-7239372,7517890,9824992,23555850,295369,5148398,-14154188,-22686354,16633660 }, - { 4577086,-16752288,13249841,-15304328,19958763,-14537274,18559670,-10759549,8402478,-9864273 }, - { -28406330,-1051581,-26790155,-907698,-17212414,-11030789,9453451,-14980072,17983010,9967138 }, - }, - { - { -25762494,6524722,26585488,9969270,24709298,1220360,-1677990,7806337,17507396,3651560 }, - { -10420457,-4118111,14584639,15971087,-15768321,8861010,26556809,-5574557,-18553322,-11357135 }, - { 2839101,14284142,4029895,3472686,14402957,12689363,-26642121,8459447,-5605463,-7621941 }, - }, - { - { -4839289,-3535444,9744961,2871048,25113978,3187018,-25110813,-849066,17258084,-7977739 }, - { 18164541,-10595176,-17154882,-1542417,19237078,-9745295,23357533,-15217008,26908270,12150756 }, - { -30264870,-7647865,5112249,-7036672,-1499807,-6974257,43168,-5537701,-32302074,16215819 }, - }, -}, -{ - { - { -6898905,9824394,-12304779,-4401089,-31397141,-6276835,32574489,12532905,-7503072,-8675347 }, - { -27343522,-16515468,-27151524,-10722951,946346,16291093,254968,7168080,21676107,-1943028 }, - { 21260961,-8424752,-16831886,-11920822,-23677961,3968121,-3651949,-6215466,-3556191,-7913075 }, - }, - { - { 16544754,13250366,-16804428,15546242,-4583003,12757258,-2462308,-8680336,-18907032,-9662799 }, - { -2415239,-15577728,18312303,4964443,-15272530,-12653564,26820651,16690659,25459437,-4564609 }, - { -25144690,11425020,28423002,-11020557,-6144921,-15826224,9142795,-2391602,-6432418,-1644817 }, - }, - { - { -23104652,6253476,16964147,-3768872,-25113972,-12296437,-27457225,-16344658,6335692,7249989 }, - { -30333227,13979675,7503222,-12368314,-11956721,-4621693,-30272269,2682242,25993170,-12478523 }, - { 4364628,5930691,32304656,-10044554,-8054781,15091131,22857016,-10598955,31820368,15075278 }, - }, - { - { 31879134,-8918693,17258761,90626,-8041836,-4917709,24162788,-9650886,-17970238,12833045 }, - { 19073683,14851414,-24403169,-11860168,7625278,11091125,-19619190,2074449,-9413939,14905377 }, - { 24483667,-11935567,-2518866,-11547418,-1553130,15355506,-25282080,9253129,27628530,-7555480 }, - }, - { - { 17597607,8340603,19355617,552187,26198470,-3176583,4593324,-9157582,-14110875,15297016 }, - { 510886,14337390,-31785257,16638632,6328095,2713355,-20217417,-11864220,8683221,2921426 }, - { 18606791,11874196,27155355,-5281482,-24031742,6265446,-25178240,-1278924,4674690,13890525 }, - }, - { - { 13609624,13069022,-27372361,-13055908,24360586,9592974,14977157,9835105,4389687,288396 }, - { 9922506,-519394,13613107,5883594,-18758345,-434263,-12304062,8317628,23388070,16052080 }, - { 12720016,11937594,-31970060,-5028689,26900120,8561328,-20155687,-11632979,-14754271,-10812892 }, - }, - { - { 15961858,14150409,26716931,-665832,-22794328,13603569,11829573,7467844,-28822128,929275 }, - { 11038231,-11582396,-27310482,-7316562,-10498527,-16307831,-23479533,-9371869,-21393143,2465074 }, - { 20017163,-4323226,27915242,1529148,12396362,15675764,13817261,-9658066,2463391,-4622140 }, - }, - { - { -16358878,-12663911,-12065183,4996454,-1256422,1073572,9583558,12851107,4003896,12673717 }, - { -1731589,-15155870,-3262930,16143082,19294135,13385325,14741514,-9103726,7903886,2348101 }, - { 24536016,-16515207,12715592,-3862155,1511293,10047386,-3842346,-7129159,-28377538,10048127 }, - }, -}, -{ - { - { -12622226,-6204820,30718825,2591312,-10617028,12192840,18873298,-7297090,-32297756,15221632 }, - { -26478122,-11103864,11546244,-1852483,9180880,7656409,-21343950,2095755,29769758,6593415 }, - { -31994208,-2907461,4176912,3264766,12538965,-868111,26312345,-6118678,30958054,8292160 }, - }, - { - { 31429822,-13959116,29173532,15632448,12174511,-2760094,32808831,3977186,26143136,-3148876 }, - { 22648901,1402143,-22799984,13746059,7936347,365344,-8668633,-1674433,-3758243,-2304625 }, - { -15491917,8012313,-2514730,-12702462,-23965846,-10254029,-1612713,-1535569,-16664475,8194478 }, - }, - { - { 27338066,-7507420,-7414224,10140405,-19026427,-6589889,27277191,8855376,28572286,3005164 }, - { 26287124,4821776,25476601,-4145903,-3764513,-15788984,-18008582,1182479,-26094821,-13079595 }, - { -7171154,3178080,23970071,6201893,-17195577,-4489192,-21876275,-13982627,32208683,-1198248 }, - }, - { - { -16657702,2817643,-10286362,14811298,6024667,13349505,-27315504,-10497842,-27672585,-11539858 }, - { 15941029,-9405932,-21367050,8062055,31876073,-238629,-15278393,-1444429,15397331,-4130193 }, - { 8934485,-13485467,-23286397,-13423241,-32446090,14047986,31170398,-1441021,-27505566,15087184 }, - }, - { - { -18357243,-2156491,24524913,-16677868,15520427,-6360776,-15502406,11461896,16788528,-5868942 }, - { -1947386,16013773,21750665,3714552,-17401782,-16055433,-3770287,-10323320,31322514,-11615635 }, - { 21426655,-5650218,-13648287,-5347537,-28812189,-4920970,-18275391,-14621414,13040862,-12112948 }, - }, - { - { 11293895,12478086,-27136401,15083750,-29307421,14748872,14555558,-13417103,1613711,4896935 }, - { -25894883,15323294,-8489791,-8057900,25967126,-13425460,2825960,-4897045,-23971776,-11267415 }, - { -15924766,-5229880,-17443532,6410664,3622847,10243618,20615400,12405433,-23753030,-8436416 }, - }, - { - { -7091295,12556208,-20191352,9025187,-17072479,4333801,4378436,2432030,23097949,-566018 }, - { 4565804,-16025654,20084412,-7842817,1724999,189254,24767264,10103221,-18512313,2424778 }, - { 366633,-11976806,8173090,-6890119,30788634,5745705,-7168678,1344109,-3642553,12412659 }, - }, - { - { -24001791,7690286,14929416,-168257,-32210835,-13412986,24162697,-15326504,-3141501,11179385 }, - { 18289522,-14724954,8056945,16430056,-21729724,7842514,-6001441,-1486897,-18684645,-11443503 }, - { 476239,6601091,-6152790,-9723375,17503545,-4863900,27672959,13403813,11052904,5219329 }, - }, -}, -{ - { - { 20678546,-8375738,-32671898,8849123,-5009758,14574752,31186971,-3973730,9014762,-8579056 }, - { -13644050,-10350239,-15962508,5075808,-1514661,-11534600,-33102500,9160280,8473550,-3256838 }, - { 24900749,14435722,17209120,-15292541,-22592275,9878983,-7689309,-16335821,-24568481,11788948 }, - }, - { - { -3118155,-11395194,-13802089,14797441,9652448,-6845904,-20037437,10410733,-24568470,-1458691 }, - { -15659161,16736706,-22467150,10215878,-9097177,7563911,11871841,-12505194,-18513325,8464118 }, - { -23400612,8348507,-14585951,-861714,-3950205,-6373419,14325289,8628612,33313881,-8370517 }, - }, - { - { -20186973,-4967935,22367356,5271547,-1097117,-4788838,-24805667,-10236854,-8940735,-5818269 }, - { -6948785,-1795212,-32625683,-16021179,32635414,-7374245,15989197,-12838188,28358192,-4253904 }, - { -23561781,-2799059,-32351682,-1661963,-9147719,10429267,-16637684,4072016,-5351664,5596589 }, - }, - { - { -28236598,-3390048,12312896,6213178,3117142,16078565,29266239,2557221,1768301,15373193 }, - { -7243358,-3246960,-4593467,-7553353,-127927,-912245,-1090902,-4504991,-24660491,3442910 }, - { -30210571,5124043,14181784,8197961,18964734,-11939093,22597931,7176455,-18585478,13365930 }, - }, - { - { -7877390,-1499958,8324673,4690079,6261860,890446,24538107,-8570186,-9689599,-3031667 }, - { 25008904,-10771599,-4305031,-9638010,16265036,15721635,683793,-11823784,15723479,-15163481 }, - { -9660625,12374379,-27006999,-7026148,-7724114,-12314514,11879682,5400171,519526,-1235876 }, - }, - { - { 22258397,-16332233,-7869817,14613016,-22520255,-2950923,-20353881,7315967,16648397,7605640 }, - { -8081308,-8464597,-8223311,9719710,19259459,-15348212,23994942,-5281555,-9468848,4763278 }, - { -21699244,9220969,-15730624,1084137,-25476107,-2852390,31088447,-7764523,-11356529,728112 }, - }, - { - { 26047220,-11751471,-6900323,-16521798,24092068,9158119,-4273545,-12555558,-29365436,-5498272 }, - { 17510331,-322857,5854289,8403524,17133918,-3112612,-28111007,12327945,10750447,10014012 }, - { -10312768,3936952,9156313,-8897683,16498692,-994647,-27481051,-666732,3424691,7540221 }, - }, - { - { 30322361,-6964110,11361005,-4143317,7433304,4989748,-7071422,-16317219,-9244265,15258046 }, - { 13054562,-2779497,19155474,469045,-12482797,4566042,5631406,2711395,1062915,-5136345 }, - { -19240248,-11254599,-29509029,-7499965,-5835763,13005411,-6066489,12194497,32960380,1459310 }, - }, -}, -{ - { - { 19852034,7027924,23669353,10020366,8586503,-6657907,394197,-6101885,18638003,-11174937 }, - { 31395534,15098109,26581030,8030562,-16527914,-5007134,9012486,-7584354,-6643087,-5442636 }, - { -9192165,-2347377,-1997099,4529534,25766844,607986,-13222,9677543,-32294889,-6456008 }, - }, - { - { -2444496,-149937,29348902,8186665,1873760,12489863,-30934579,-7839692,-7852844,-8138429 }, - { -15236356,-15433509,7766470,746860,26346930,-10221762,-27333451,10754588,-9431476,5203576 }, - { 31834314,14135496,-770007,5159118,20917671,-16768096,-7467973,-7337524,31809243,7347066 }, - }, - { - { -9606723,-11874240,20414459,13033986,13716524,-11691881,19797970,-12211255,15192876,-2087490 }, - { -12663563,-2181719,1168162,-3804809,26747877,-14138091,10609330,12694420,33473243,-13382104 }, - { 33184999,11180355,15832085,-11385430,-1633671,225884,15089336,-11023903,-6135662,14480053 }, - }, - { - { 31308717,-5619998,31030840,-1897099,15674547,-6582883,5496208,13685227,27595050,8737275 }, - { -20318852,-15150239,10933843,-16178022,8335352,-7546022,-31008351,-12610604,26498114,66511 }, - { 22644454,-8761729,-16671776,4884562,-3105614,-13559366,30540766,-4286747,-13327787,-7515095 }, - }, - { - { -28017847,9834845,18617207,-2681312,-3401956,-13307506,8205540,13585437,-17127465,15115439 }, - { 23711543,-672915,31206561,-8362711,6164647,-9709987,-33535882,-1426096,8236921,16492939 }, - { -23910559,-13515526,-26299483,-4503841,25005590,-7687270,19574902,10071562,6708380,-6222424 }, - }, - { - { 2101391,-4930054,19702731,2367575,-15427167,1047675,5301017,9328700,29955601,-11678310 }, - { 3096359,9271816,-21620864,-15521844,-14847996,-7592937,-25892142,-12635595,-9917575,6216608 }, - { -32615849,338663,-25195611,2510422,-29213566,-13820213,24822830,-6146567,-26767480,7525079 }, - }, - { - { -23066649,-13985623,16133487,-7896178,-3389565,778788,-910336,-2782495,-19386633,11994101 }, - { 21691500,-13624626,-641331,-14367021,3285881,-3483596,-25064666,9718258,-7477437,13381418 }, - { 18445390,-4202236,14979846,11622458,-1727110,-3582980,23111648,-6375247,28535282,15779576 }, - }, - { - { 30098053,3089662,-9234387,16662135,-21306940,11308411,-14068454,12021730,9955285,-16303356 }, - { 9734894,-14576830,-7473633,-9138735,2060392,11313496,-18426029,9924399,20194861,13380996 }, - { -26378102,-7965207,-22167821,15789297,-18055342,-6168792,-1984914,15707771,26342023,10146099 }, - }, -}, -{ - { - { -26016874,-219943,21339191,-41388,19745256,-2878700,-29637280,2227040,21612326,-545728 }, - { -13077387,1184228,23562814,-5970442,-20351244,-6348714,25764461,12243797,-20856566,11649658 }, - { -10031494,11262626,27384172,2271902,26947504,-15997771,39944,6114064,33514190,2333242 }, - }, - { - { -21433588,-12421821,8119782,7219913,-21830522,-9016134,-6679750,-12670638,24350578,-13450001 }, - { -4116307,-11271533,-23886186,4843615,-30088339,690623,-31536088,-10406836,8317860,12352766 }, - { 18200138,-14475911,-33087759,-2696619,-23702521,-9102511,-23552096,-2287550,20712163,6719373 }, - }, - { - { 26656208,6075253,-7858556,1886072,-28344043,4262326,11117530,-3763210,26224235,-3297458 }, - { -17168938,-14854097,-3395676,-16369877,-19954045,14050420,21728352,9493610,18620611,-16428628 }, - { -13323321,13325349,11432106,5964811,18609221,6062965,-5269471,-9725556,-30701573,-16479657 }, - }, - { - { -23860538,-11233159,26961357,1640861,-32413112,-16737940,12248509,-5240639,13735342,1934062 }, - { 25089769,6742589,17081145,-13406266,21909293,-16067981,-15136294,-3765346,-21277997,5473616 }, - { 31883677,-7961101,1083432,-11572403,22828471,13290673,-7125085,12469656,29111212,-5451014 }, - }, - { - { 24244947,-15050407,-26262976,2791540,-14997599,16666678,24367466,6388839,-10295587,452383 }, - { -25640782,-3417841,5217916,16224624,19987036,-4082269,-24236251,-5915248,15766062,8407814 }, - { -20406999,13990231,15495425,16395525,5377168,15166495,-8917023,-4388953,-8067909,2276718 }, - }, - { - { 30157918,12924066,-17712050,9245753,19895028,3368142,-23827587,5096219,22740376,-7303417 }, - { 2041139,-14256350,7783687,13876377,-25946985,-13352459,24051124,13742383,-15637599,13295222 }, - { 33338237,-8505733,12532113,7977527,9106186,-1715251,-17720195,-4612972,-4451357,-14669444 }, - }, - { - { -20045281,5454097,-14346548,6447146,28862071,1883651,-2469266,-4141880,7770569,9620597 }, - { 23208068,7979712,33071466,8149229,1758231,-10834995,30945528,-1694323,-33502340,-14767970 }, - { 1439958,-16270480,-1079989,-793782,4625402,10647766,-5043801,1220118,30494170,-11440799 }, - }, - { - { -5037580,-13028295,-2970559,-3061767,15640974,-6701666,-26739026,926050,-1684339,-13333647 }, - { 13908495,-3549272,30919928,-6273825,-21521863,7989039,9021034,9078865,3353509,4033511 }, - { -29663431,-15113610,32259991,-344482,24295849,-12912123,23161163,8839127,27485041,7356032 }, - }, -}, -{ - { - { 9661027,705443,11980065,-5370154,-1628543,14661173,-6346142,2625015,28431036,-16771834 }, - { -23839233,-8311415,-25945511,7480958,-17681669,-8354183,-22545972,14150565,15970762,4099461 }, - { 29262576,16756590,26350592,-8793563,8529671,-11208050,13617293,-9937143,11465739,8317062 }, - }, - { - { -25493081,-6962928,32500200,-9419051,-23038724,-2302222,14898637,3848455,20969334,-5157516 }, - { -20384450,-14347713,-18336405,13884722,-33039454,2842114,-21610826,-3649888,11177095,14989547 }, - { -24496721,-11716016,16959896,2278463,12066309,10137771,13515641,2581286,-28487508,9930240 }, - }, - { - { -17751622,-2097826,16544300,-13009300,-15914807,-14949081,18345767,-13403753,16291481,-5314038 }, - { -33229194,2553288,32678213,9875984,8534129,6889387,-9676774,6957617,4368891,9788741 }, - { 16660756,7281060,-10830758,12911820,20108584,-8101676,-21722536,-8613148,16250552,-11111103 }, - }, - { - { -19765507,2390526,-16551031,14161980,1905286,6414907,4689584,10604807,-30190403,4782747 }, - { -1354539,14736941,-7367442,-13292886,7710542,-14155590,-9981571,4383045,22546403,437323 }, - { 31665577,-12180464,-16186830,1491339,-18368625,3294682,27343084,2786261,-30633590,-14097016 }, - }, - { - { -14467279,-683715,-33374107,7448552,19294360,14334329,-19690631,2355319,-19284671,-6114373 }, - { 15121312,-15796162,6377020,-6031361,-10798111,-12957845,18952177,15496498,-29380133,11754228 }, - { -2637277,-13483075,8488727,-14303896,12728761,-1622493,7141596,11724556,22761615,-10134141 }, - }, - { - { 16918416,11729663,-18083579,3022987,-31015732,-13339659,-28741185,-12227393,32851222,11717399 }, - { 11166634,7338049,-6722523,4531520,-29468672,-7302055,31474879,3483633,-1193175,-4030831 }, - { -185635,9921305,31456609,-13536438,-12013818,13348923,33142652,6546660,-19985279,-3948376 }, - }, - { - { -32460596,11266712,-11197107,-7899103,31703694,3855903,-8537131,-12833048,-30772034,-15486313 }, - { -18006477,12709068,3991746,-6479188,-21491523,-10550425,-31135347,-16049879,10928917,3011958 }, - { -6957757,-15594337,31696059,334240,29576716,14796075,-30831056,-12805180,18008031,10258577 }, - }, - { - { -22448644,15655569,7018479,-4410003,-30314266,-1201591,-1853465,1367120,25127874,6671743 }, - { 29701166,-14373934,-10878120,9279288,-17568,13127210,21382910,11042292,25838796,4642684 }, - { -20430234,14955537,-24126347,8124619,-5369288,-5990470,30468147,-13900640,18423289,4177476 }, - }, -}, diff --git a/src/tor/src/ext/ed25519/ref10/base.py b/src/tor/src/ext/ed25519/ref10/base.py deleted file mode 100644 index 84accc858..000000000 --- a/src/tor/src/ext/ed25519/ref10/base.py +++ /dev/null @@ -1,65 +0,0 @@ -b = 256 -q = 2**255 - 19 -l = 2**252 + 27742317777372353535851937790883648493 - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -d = -121665 * inv(121666) -I = expmod(2,(q-1)/4,q) - -def xrecover(y): - xx = (y*y-1) * inv(d*y*y+1) - x = expmod(xx,(q+3)/8,q) - if (x*x - xx) % q != 0: x = (x*I) % q - if x % 2 != 0: x = q-x - return x - -By = 4 * inv(5) -Bx = xrecover(By) -B = [Bx % q,By % q] - -def edwards(P,Q): - x1 = P[0] - y1 = P[1] - x2 = Q[0] - y2 = Q[1] - x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) - y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) - return [x3 % q,y3 % q] - -def radix255(x): - x = x % q - if x + x > q: x -= q - x = [x,0,0,0,0,0,0,0,0,0] - bits = [26,25,26,25,26,25,26,25,26,25] - for i in range(9): - carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] - x[i] -= carry * 2**bits[i] - x[i + 1] += carry - result = "" - for i in range(9): - result = result+str(x[i])+"," - result = result+str(x[9]) - return result - -Bi = B -for i in range(32): - print "{" - Bij = Bi - for j in range(8): - print " {" - print " {",radix255(Bij[1]+Bij[0]),"}," - print " {",radix255(Bij[1]-Bij[0]),"}," - print " {",radix255(2*d*Bij[0]*Bij[1]),"}," - Bij = edwards(Bij,Bi) - print " }," - print "}," - for k in range(8): - Bi = edwards(Bi,Bi) diff --git a/src/tor/src/ext/ed25519/ref10/base2.h b/src/tor/src/ext/ed25519/ref10/base2.h deleted file mode 100644 index 8c538440f..000000000 --- a/src/tor/src/ext/ed25519/ref10/base2.h +++ /dev/null @@ -1,40 +0,0 @@ - { - { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 }, - { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 }, - { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 }, - }, - { - { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 }, - { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 }, - { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 }, - }, - { - { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 }, - { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 }, - { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 }, - }, - { - { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 }, - { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 }, - { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 }, - }, - { - { -22518993,-6692182,14201702,-8745502,-23510406,8844726,18474211,-1361450,-13062696,13821877 }, - { -6455177,-7839871,3374702,-4740862,-27098617,-10571707,31655028,-7212327,18853322,-14220951 }, - { 4566830,-12963868,-28974889,-12240689,-7602672,-2830569,-8514358,-10431137,2207753,-3209784 }, - }, - { - { -25154831,-4185821,29681144,7868801,-6854661,-9423865,-12437364,-663000,-31111463,-16132436 }, - { 25576264,-2703214,7349804,-11814844,16472782,9300885,3844789,15725684,171356,6466918 }, - { 23103977,13316479,9739013,-16149481,817875,-15038942,8965339,-14088058,-30714912,16193877 }, - }, - { - { -33521811,3180713,-2394130,14003687,-16903474,-16270840,17238398,4729455,-18074513,9256800 }, - { -25182317,-4174131,32336398,5036987,-21236817,11360617,22616405,9761698,-19827198,630305 }, - { -13720693,2639453,-24237460,-7406481,9494427,-5774029,-6554551,-15960994,-2449256,-14291300 }, - }, - { - { -3151181,-5046075,9282714,6866145,-31907062,-863023,-18940575,15033784,25105118,-7894876 }, - { -24326370,15950226,-31801215,-14592823,-11662737,-5090925,1573892,-2625887,2198790,-15804619 }, - { -3099351,10324967,-2241613,7453183,-5446979,-2735503,-13812022,-16236442,-32461234,-12290683 }, - }, diff --git a/src/tor/src/ext/ed25519/ref10/base2.py b/src/tor/src/ext/ed25519/ref10/base2.py deleted file mode 100644 index 5e4e8739d..000000000 --- a/src/tor/src/ext/ed25519/ref10/base2.py +++ /dev/null @@ -1,60 +0,0 @@ -b = 256 -q = 2**255 - 19 -l = 2**252 + 27742317777372353535851937790883648493 - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -d = -121665 * inv(121666) -I = expmod(2,(q-1)/4,q) - -def xrecover(y): - xx = (y*y-1) * inv(d*y*y+1) - x = expmod(xx,(q+3)/8,q) - if (x*x - xx) % q != 0: x = (x*I) % q - if x % 2 != 0: x = q-x - return x - -By = 4 * inv(5) -Bx = xrecover(By) -B = [Bx % q,By % q] - -def edwards(P,Q): - x1 = P[0] - y1 = P[1] - x2 = Q[0] - y2 = Q[1] - x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) - y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) - return [x3 % q,y3 % q] - -def radix255(x): - x = x % q - if x + x > q: x -= q - x = [x,0,0,0,0,0,0,0,0,0] - bits = [26,25,26,25,26,25,26,25,26,25] - for i in range(9): - carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] - x[i] -= carry * 2**bits[i] - x[i + 1] += carry - result = "" - for i in range(9): - result = result+str(x[i])+"," - result = result+str(x[9]) - return result - -Bi = B - -for i in range(8): - print " {" - print " {",radix255(Bi[1]+Bi[0]),"}," - print " {",radix255(Bi[1]-Bi[0]),"}," - print " {",radix255(2*d*Bi[0]*Bi[1]),"}," - print " }," - Bi = edwards(B,edwards(B,Bi)) diff --git a/src/tor/src/ext/ed25519/ref10/blinding.c b/src/tor/src/ext/ed25519/ref10/blinding.c deleted file mode 100644 index a3b32fa80..000000000 --- a/src/tor/src/ext/ed25519/ref10/blinding.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Added to ref10 for Tor. We place this in the public domain. Alternatively, - * you may have it under the Creative Commons 0 "CC0" license. */ -//#include "fe.h" -#include "ge.h" -#include "sc.h" -#include "crypto_hash_sha512.h" -#include "ed25519_ref10.h" - -#include -#include "crypto.h" - -static void -ed25519_ref10_gettweak(unsigned char *out, const unsigned char *param) -{ - memcpy(out, param, 32); - - out[0] &= 248; /* Is this necessary necessary ? */ - out[31] &= 63; - out[31] |= 64; -} - -int ed25519_ref10_blind_secret_key(unsigned char *out, - const unsigned char *inp, - const unsigned char *param) -{ - const char str[] = "Derive temporary signing key hash input"; - unsigned char tweak[64]; - unsigned char zero[32]; - ed25519_ref10_gettweak(tweak, param); - - memset(zero, 0, 32); - sc_muladd(out, inp, tweak, zero); - - crypto_hash_sha512_2(tweak, (const unsigned char *)str, strlen(str), - inp+32, 32); - memcpy(out+32, tweak, 32); - - memwipe(tweak, 0, sizeof(tweak)); - - return 0; -} - -int ed25519_ref10_blind_public_key(unsigned char *out, - const unsigned char *inp, - const unsigned char *param) -{ - unsigned char tweak[64]; - unsigned char zero[32]; - unsigned char pkcopy[32]; - ge_p3 A; - ge_p2 Aprime; - int retval = -1; - - ed25519_ref10_gettweak(tweak, param); - - memset(zero, 0, sizeof(zero)); - /* Not the greatest implementation of all of this. I wish I had - * better-suited primitives to work with here... (but I don't wish that so - * strongly that I'm about to code my own ge_scalarmult_vartime). */ - - /* We negate the public key first, so that we can pass it to - * frombytes_negate_vartime, which negates it again. If there were a - * "ge_frombytes", we'd use that, but there isn't. */ - memcpy(pkcopy, inp, 32); - pkcopy[31] ^= (1<<7); - if (ge_frombytes_negate_vartime(&A, pkcopy) != 0) { - goto done; - } - /* There isn't a regular ge_scalarmult -- we have to do tweak*A + zero*B. */ - ge_double_scalarmult_vartime(&Aprime, tweak, &A, zero); - ge_tobytes(out, &Aprime); - - retval = 0; - - done: - memwipe(tweak, 0, sizeof(tweak)); - memwipe(&A, 0, sizeof(A)); - memwipe(&Aprime, 0, sizeof(Aprime)); - memwipe(pkcopy, 0, sizeof(pkcopy)); - - return retval; -} - -/* This is the group order encoded in a format that - * ge_double_scalarmult_vartime() understands. The group order m is: - * m = 2^252 + 27742317777372353535851937790883648493 = - * 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed - */ -static const uint8_t modm_m[32] = {0xed,0xd3,0xf5,0x5c,0x1a,0x63,0x12,0x58, - 0xd6,0x9c,0xf7,0xa2,0xde,0xf9,0xde,0x14, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}; - -/* Do the scalar multiplication of pubkey with the group order - * modm_m. Place the result in out which must be at least 32 - * bytes long. */ -int -ed25519_ref10_scalarmult_with_group_order(unsigned char *out, - const unsigned char *pubkey) -{ - unsigned char pkcopy[32]; - unsigned char zero[32] = {0}; - ge_p3 Point; - ge_p2 Result; - - /* All this is done to fit 'pubkey' in 'Point' so that it can be used by - * ed25519 ref code. Same thing as in blinding function */ - memcpy(pkcopy, pubkey, 32); - pkcopy[31] ^= (1<<7); - if (ge_frombytes_negate_vartime(&Point, pkcopy) != 0) { - return -1; /* error: bail out */ - } - - /* There isn't a regular scalarmult -- we have to do r = l*P + 0*B */ - ge_double_scalarmult_vartime(&Result, modm_m, &Point, zero); - ge_tobytes(out, &Result); - - return 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/crypto_hash_sha512.h b/src/tor/src/ext/ed25519/ref10/crypto_hash_sha512.h deleted file mode 100644 index 5dad935c7..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_hash_sha512.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Added for Tor. */ -#include "crypto.h" - -/* Set 'out' to the 512-bit SHA512 hash of the 'len'-byte string in 'inp' */ -#define crypto_hash_sha512(out, inp, len) \ - crypto_digest512((char *)(out), (const char *)(inp), (len), DIGEST_SHA512) - -/* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', - * concatenated with the 'len2'-byte string in 'inp2'. */ -#define crypto_hash_sha512_2(out, inp1, len1, inp2, len2) \ - do { \ - crypto_digest_t *sha_ctx_; \ - sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ - crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ - crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ - crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ - crypto_digest_free(sha_ctx_); \ - } while (0) - -/* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', - * concatenated with the 'len2'-byte string in 'inp2', concatenated with - * the 'len3'-byte string in 'len3'. */ -#define crypto_hash_sha512_3(out, inp1, len1, inp2, len2, inp3, len3) \ - do { \ - crypto_digest_t *sha_ctx_; \ - sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ - crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ - crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ - crypto_digest_add_bytes(sha_ctx_, (const char *)(inp3), (len3)); \ - crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ - crypto_digest_free(sha_ctx_); \ - } while(0) diff --git a/src/tor/src/ext/ed25519/ref10/crypto_int32.h b/src/tor/src/ext/ed25519/ref10/crypto_int32.h deleted file mode 100644 index dd13c91bd..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_int32.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Added for Tor. */ - -#ifndef CRYPTO_INT32_H -#define CRYPTO_INT32_H - -#include "torint.h" -#define crypto_int32 int32_t -#define crypto_uint32 uint32_t - -/* - Stop signed left shifts overflowing - by using unsigned types for bitwise operations - */ - -#ifndef OVERFLOW_SAFE_SIGNED_LSHIFT -#define OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, utype, stype) \ - ((stype)((utype)(s) << (utype)(lshift))) -#endif - -#define SHL32(s, lshift) \ - OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, crypto_uint32, crypto_int32) -#define SHL8(s, lshift) \ - OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, unsigned char, signed char) - -#endif /* CRYPTO_INT32_H */ diff --git a/src/tor/src/ext/ed25519/ref10/crypto_int64.h b/src/tor/src/ext/ed25519/ref10/crypto_int64.h deleted file mode 100644 index 46e8852ed..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_int64.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Added for Tor. */ - -#ifndef CRYPTO_INT64_H -#define CRYPTO_INT64_H - -#include "torint.h" -#define crypto_int64 int64_t -#define crypto_uint64 uint64_t - -/* - Stop signed left shifts overflowing - by using unsigned types for bitwise operations - */ - -#ifndef OVERFLOW_SAFE_SIGNED_LSHIFT -#define OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, utype, stype) \ - ((stype)((utype)(s) << (utype)(lshift))) -#endif - -#define SHL64(s, lshift) \ - OVERFLOW_SAFE_SIGNED_LSHIFT(s, lshift, crypto_uint64, crypto_int64) - -#endif /* CRYPTO_INT64_H */ diff --git a/src/tor/src/ext/ed25519/ref10/crypto_sign.h b/src/tor/src/ext/ed25519/ref10/crypto_sign.h deleted file mode 100644 index 549626793..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_sign.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Added for Tor */ -#define crypto_sign ed25519_ref10_sign -#define crypto_sign_keypair ed25519_ref10_keygen -#define crypto_sign_seckey ed25519_ref10_seckey -#define crypto_sign_seckey_expand ed25519_ref10_seckey_expand -#define crypto_sign_pubkey ed25519_ref10_pubkey -#define crypto_sign_open ed25519_ref10_open - -#include "ed25519_ref10.h" diff --git a/src/tor/src/ext/ed25519/ref10/crypto_uint32.h b/src/tor/src/ext/ed25519/ref10/crypto_uint32.h deleted file mode 100644 index 62655a5b6..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_uint32.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Added for Tor. */ -#include "torint.h" -#define crypto_uint32 uint32_t diff --git a/src/tor/src/ext/ed25519/ref10/crypto_uint64.h b/src/tor/src/ext/ed25519/ref10/crypto_uint64.h deleted file mode 100644 index cbda882a6..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_uint64.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Added for Tor. */ -#include "torint.h" -#define crypto_uint64 uint64_t diff --git a/src/tor/src/ext/ed25519/ref10/crypto_verify_32.h b/src/tor/src/ext/ed25519/ref10/crypto_verify_32.h deleted file mode 100644 index 0f63efc7a..000000000 --- a/src/tor/src/ext/ed25519/ref10/crypto_verify_32.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Added for Tor. */ -#include "di_ops.h" -#define crypto_verify_32(a,b) \ - (! tor_memeq((a), (b), 32)) - diff --git a/src/tor/src/ext/ed25519/ref10/d.h b/src/tor/src/ext/ed25519/ref10/d.h deleted file mode 100644 index e25f57835..000000000 --- a/src/tor/src/ext/ed25519/ref10/d.h +++ /dev/null @@ -1 +0,0 @@ --10913610,13857413,-15372611,6949391,114729,-8787816,-6275908,-3247719,-18696448,-12055116 diff --git a/src/tor/src/ext/ed25519/ref10/d.py b/src/tor/src/ext/ed25519/ref10/d.py deleted file mode 100644 index 8995bb86a..000000000 --- a/src/tor/src/ext/ed25519/ref10/d.py +++ /dev/null @@ -1,28 +0,0 @@ -q = 2**255 - 19 - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -def radix255(x): - x = x % q - if x + x > q: x -= q - x = [x,0,0,0,0,0,0,0,0,0] - bits = [26,25,26,25,26,25,26,25,26,25] - for i in range(9): - carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] - x[i] -= carry * 2**bits[i] - x[i + 1] += carry - result = "" - for i in range(9): - result = result+str(x[i])+"," - result = result+str(x[9]) - return result - -d = -121665 * inv(121666) -print radix255(d) diff --git a/src/tor/src/ext/ed25519/ref10/d2.h b/src/tor/src/ext/ed25519/ref10/d2.h deleted file mode 100644 index 01aaec751..000000000 --- a/src/tor/src/ext/ed25519/ref10/d2.h +++ /dev/null @@ -1 +0,0 @@ --21827239,-5839606,-30745221,13898782,229458,15978800,-12551817,-6495438,29715968,9444199 diff --git a/src/tor/src/ext/ed25519/ref10/d2.py b/src/tor/src/ext/ed25519/ref10/d2.py deleted file mode 100644 index 79841758b..000000000 --- a/src/tor/src/ext/ed25519/ref10/d2.py +++ /dev/null @@ -1,28 +0,0 @@ -q = 2**255 - 19 - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -def radix255(x): - x = x % q - if x + x > q: x -= q - x = [x,0,0,0,0,0,0,0,0,0] - bits = [26,25,26,25,26,25,26,25,26,25] - for i in range(9): - carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] - x[i] -= carry * 2**bits[i] - x[i + 1] += carry - result = "" - for i in range(9): - result = result+str(x[i])+"," - result = result+str(x[9]) - return result - -d = -121665 * inv(121666) -print radix255(d*2) diff --git a/src/tor/src/ext/ed25519/ref10/ed25519_ref10.h b/src/tor/src/ext/ed25519/ref10/ed25519_ref10.h deleted file mode 100644 index 596569497..000000000 --- a/src/tor/src/ext/ed25519/ref10/ed25519_ref10.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Added for Tor */ -#ifndef SRC_EXT_ED25519_REF10_H_INCLUDED_ -#define SRC_EXT_ED25519_REF10_H_INCLUDED_ -#include - -int ed25519_ref10_seckey(unsigned char *sk); -int ed25519_ref10_seckey_expand(unsigned char *sk, const unsigned char *sk_seed); -int ed25519_ref10_pubkey(unsigned char *pk,const unsigned char *sk); -int ed25519_ref10_keygen(unsigned char *pk,unsigned char *sk); -int ed25519_ref10_open( - const unsigned char *signature, - const unsigned char *m, size_t mlen, - const unsigned char *pk); -int ed25519_ref10_sign( - unsigned char *sig, - const unsigned char *m, size_t mlen, - const unsigned char *sk, const unsigned char *pk); - -/* Added in Tor */ -int ed25519_ref10_pubkey_from_curve25519_pubkey(unsigned char *out, - const unsigned char *inp, - int signbit); -int ed25519_ref10_blind_secret_key(unsigned char *out, - const unsigned char *inp, - const unsigned char *param); -int ed25519_ref10_blind_public_key(unsigned char *out, - const unsigned char *inp, - const unsigned char *param); - -int -ed25519_ref10_scalarmult_with_group_order(unsigned char *out, - const unsigned char *pubkey); - -#endif diff --git a/src/tor/src/ext/ed25519/ref10/fe.h b/src/tor/src/ext/ed25519/ref10/fe.h deleted file mode 100644 index 60c308ba4..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef FE_H -#define FE_H - -#include "crypto_int32.h" - -typedef crypto_int32 fe[10]; - -/* -fe means field element. -Here the field is \Z/(2^255-19). -An element t, entries t[0]...t[9], represents the integer -t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. -Bounds on each t[i] vary depending on context. -*/ - -#define fe_frombytes crypto_sign_ed25519_ref10_fe_frombytes -#define fe_tobytes crypto_sign_ed25519_ref10_fe_tobytes -#define fe_copy crypto_sign_ed25519_ref10_fe_copy -#define fe_isnonzero crypto_sign_ed25519_ref10_fe_isnonzero -#define fe_isnegative crypto_sign_ed25519_ref10_fe_isnegative -#define fe_0 crypto_sign_ed25519_ref10_fe_0 -#define fe_1 crypto_sign_ed25519_ref10_fe_1 -#define fe_cswap crypto_sign_ed25519_ref10_fe_cswap -#define fe_cmov crypto_sign_ed25519_ref10_fe_cmov -#define fe_add crypto_sign_ed25519_ref10_fe_add -#define fe_sub crypto_sign_ed25519_ref10_fe_sub -#define fe_neg crypto_sign_ed25519_ref10_fe_neg -#define fe_mul crypto_sign_ed25519_ref10_fe_mul -#define fe_sq crypto_sign_ed25519_ref10_fe_sq -#define fe_sq2 crypto_sign_ed25519_ref10_fe_sq2 -#define fe_mul121666 crypto_sign_ed25519_ref10_fe_mul121666 -#define fe_invert crypto_sign_ed25519_ref10_fe_invert -#define fe_pow22523 crypto_sign_ed25519_ref10_fe_pow22523 - -extern void fe_frombytes(fe,const unsigned char *); -extern void fe_tobytes(unsigned char *,const fe); - -extern void fe_copy(fe,const fe); -extern int fe_isnonzero(const fe); -extern int fe_isnegative(const fe); -extern void fe_0(fe); -extern void fe_1(fe); -extern void fe_cswap(fe,fe,unsigned int); -extern void fe_cmov(fe,const fe,unsigned int); - -extern void fe_add(fe,const fe,const fe); -extern void fe_sub(fe,const fe,const fe); -extern void fe_neg(fe,const fe); -extern void fe_mul(fe,const fe,const fe); -extern void fe_sq(fe,const fe); -extern void fe_sq2(fe,const fe); -extern void fe_mul121666(fe,const fe); -extern void fe_invert(fe,const fe); -extern void fe_pow22523(fe,const fe); - -#endif diff --git a/src/tor/src/ext/ed25519/ref10/fe_0.c b/src/tor/src/ext/ed25519/ref10/fe_0.c deleted file mode 100644 index ec879d733..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_0.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "fe.h" - -/* -h = 0 -*/ - -void fe_0(fe h) -{ - h[0] = 0; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_1.c b/src/tor/src/ext/ed25519/ref10/fe_1.c deleted file mode 100644 index 8cf778484..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_1.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "fe.h" - -/* -h = 1 -*/ - -void fe_1(fe h) -{ - h[0] = 1; - h[1] = 0; - h[2] = 0; - h[3] = 0; - h[4] = 0; - h[5] = 0; - h[6] = 0; - h[7] = 0; - h[8] = 0; - h[9] = 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_add.c b/src/tor/src/ext/ed25519/ref10/fe_add.c deleted file mode 100644 index e6a81da20..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_add.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "fe.h" - -/* -h = f + g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -void fe_add(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 + g0; - crypto_int32 h1 = f1 + g1; - crypto_int32 h2 = f2 + g2; - crypto_int32 h3 = f3 + g3; - crypto_int32 h4 = f4 + g4; - crypto_int32 h5 = f5 + g5; - crypto_int32 h6 = f6 + g6; - crypto_int32 h7 = f7 + g7; - crypto_int32 h8 = f8 + g8; - crypto_int32 h9 = f9 + g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_cmov.c b/src/tor/src/ext/ed25519/ref10/fe_cmov.c deleted file mode 100644 index 8ca584fb1..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_cmov.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "fe.h" - -/* -Replace (f,g) with (g,g) if b == 1; -replace (f,g) with (f,g) if b == 0. - -Preconditions: b in {0,1}. -*/ - -void fe_cmov(fe f,const fe g,unsigned int b) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 x0 = f0 ^ g0; - crypto_int32 x1 = f1 ^ g1; - crypto_int32 x2 = f2 ^ g2; - crypto_int32 x3 = f3 ^ g3; - crypto_int32 x4 = f4 ^ g4; - crypto_int32 x5 = f5 ^ g5; - crypto_int32 x6 = f6 ^ g6; - crypto_int32 x7 = f7 ^ g7; - crypto_int32 x8 = f8 ^ g8; - crypto_int32 x9 = f9 ^ g9; - b = -b; - x0 &= b; - x1 &= b; - x2 &= b; - x3 &= b; - x4 &= b; - x5 &= b; - x6 &= b; - x7 &= b; - x8 &= b; - x9 &= b; - f[0] = f0 ^ x0; - f[1] = f1 ^ x1; - f[2] = f2 ^ x2; - f[3] = f3 ^ x3; - f[4] = f4 ^ x4; - f[5] = f5 ^ x5; - f[6] = f6 ^ x6; - f[7] = f7 ^ x7; - f[8] = f8 ^ x8; - f[9] = f9 ^ x9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_copy.c b/src/tor/src/ext/ed25519/ref10/fe_copy.c deleted file mode 100644 index 9c5bf865a..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_copy.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "fe.h" - -/* -h = f -*/ - -void fe_copy(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - h[0] = f0; - h[1] = f1; - h[2] = f2; - h[3] = f3; - h[4] = f4; - h[5] = f5; - h[6] = f6; - h[7] = f7; - h[8] = f8; - h[9] = f9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_frombytes.c b/src/tor/src/ext/ed25519/ref10/fe_frombytes.c deleted file mode 100644 index 98b8e5f7c..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_frombytes.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "fe.h" -#include "crypto_int64.h" -#include "crypto_uint64.h" - -static crypto_uint64 load_3(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - return result; -} - -static crypto_uint64 load_4(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - result |= ((crypto_uint64) in[3]) << 24; - return result; -} - -/* -Ignores top bit of h. -*/ - -void fe_frombytes(fe h,const unsigned char *s) -{ - crypto_int64 h0 = load_4(s); - crypto_int64 h1 = load_3(s + 4) << 6; - crypto_int64 h2 = load_3(s + 7) << 5; - crypto_int64 h3 = load_3(s + 10) << 3; - crypto_int64 h4 = load_3(s + 13) << 2; - crypto_int64 h5 = load_4(s + 16); - crypto_int64 h6 = load_3(s + 20) << 7; - crypto_int64 h7 = load_3(s + 23) << 5; - crypto_int64 h8 = load_3(s + 26) << 4; - crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); - - h[0] = (crypto_int32) h0; - h[1] = (crypto_int32) h1; - h[2] = (crypto_int32) h2; - h[3] = (crypto_int32) h3; - h[4] = (crypto_int32) h4; - h[5] = (crypto_int32) h5; - h[6] = (crypto_int32) h6; - h[7] = (crypto_int32) h7; - h[8] = (crypto_int32) h8; - h[9] = (crypto_int32) h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_invert.c b/src/tor/src/ext/ed25519/ref10/fe_invert.c deleted file mode 100644 index bcfdb8ff8..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_invert.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "fe.h" - -void fe_invert(fe out,const fe z) -{ - fe t0; - fe t1; - fe t2; - fe t3; - int i; - -#include "pow225521.h" - - return; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_isnegative.c b/src/tor/src/ext/ed25519/ref10/fe_isnegative.c deleted file mode 100644 index 3b2c8b8d5..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_isnegative.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "fe.h" - -/* -return 1 if f is in {1,3,5,...,q-2} -return 0 if f is in {0,2,4,...,q-1} - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -int fe_isnegative(const fe f) -{ - unsigned char s[32]; - fe_tobytes(s,f); - return s[0] & 1; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_isnonzero.c b/src/tor/src/ext/ed25519/ref10/fe_isnonzero.c deleted file mode 100644 index 47568001c..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_isnonzero.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "fe.h" -#include "crypto_verify_32.h" - -/* -return 1 if f == 0 -return 0 if f != 0 - -Preconditions: - |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -static const unsigned char zero[32]; - -int fe_isnonzero(const fe f) -{ - unsigned char s[32]; - fe_tobytes(s,f); - return crypto_verify_32(s,zero); -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_mul.c b/src/tor/src/ext/ed25519/ref10/fe_mul.c deleted file mode 100644 index ace63e64c..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_mul.c +++ /dev/null @@ -1,253 +0,0 @@ -#include "fe.h" -#include "crypto_int64.h" - -/* -h = f * g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -Notes on implementation strategy: - -Using schoolbook multiplication. -Karatsuba would save a little in some cost models. - -Most multiplications by 2 and 19 are 32-bit precomputations; -cheaper than 64-bit postcomputations. - -There is one remaining multiplication by 19 in the carry chain; -one *19 precomputation can be merged into this, -but the resulting data flow is considerably less clean. - -There are 12 carries below. -10 of them are 2-way parallelizable and vectorizable. -Can get away with 11 carries, but then data flow is much deeper. - -With tighter constraints on inputs can squeeze carries into int32. -*/ - -void fe_mul(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 g1_19 = 19 * g1; /* 1.959375*2^29 */ - crypto_int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ - crypto_int32 g3_19 = 19 * g3; - crypto_int32 g4_19 = 19 * g4; - crypto_int32 g5_19 = 19 * g5; - crypto_int32 g6_19 = 19 * g6; - crypto_int32 g7_19 = 19 * g7; - crypto_int32 g8_19 = 19 * g8; - crypto_int32 g9_19 = 19 * g9; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f9_2 = 2 * f9; - crypto_int64 f0g0 = f0 * (crypto_int64) g0; - crypto_int64 f0g1 = f0 * (crypto_int64) g1; - crypto_int64 f0g2 = f0 * (crypto_int64) g2; - crypto_int64 f0g3 = f0 * (crypto_int64) g3; - crypto_int64 f0g4 = f0 * (crypto_int64) g4; - crypto_int64 f0g5 = f0 * (crypto_int64) g5; - crypto_int64 f0g6 = f0 * (crypto_int64) g6; - crypto_int64 f0g7 = f0 * (crypto_int64) g7; - crypto_int64 f0g8 = f0 * (crypto_int64) g8; - crypto_int64 f0g9 = f0 * (crypto_int64) g9; - crypto_int64 f1g0 = f1 * (crypto_int64) g0; - crypto_int64 f1g1_2 = f1_2 * (crypto_int64) g1; - crypto_int64 f1g2 = f1 * (crypto_int64) g2; - crypto_int64 f1g3_2 = f1_2 * (crypto_int64) g3; - crypto_int64 f1g4 = f1 * (crypto_int64) g4; - crypto_int64 f1g5_2 = f1_2 * (crypto_int64) g5; - crypto_int64 f1g6 = f1 * (crypto_int64) g6; - crypto_int64 f1g7_2 = f1_2 * (crypto_int64) g7; - crypto_int64 f1g8 = f1 * (crypto_int64) g8; - crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19; - crypto_int64 f2g0 = f2 * (crypto_int64) g0; - crypto_int64 f2g1 = f2 * (crypto_int64) g1; - crypto_int64 f2g2 = f2 * (crypto_int64) g2; - crypto_int64 f2g3 = f2 * (crypto_int64) g3; - crypto_int64 f2g4 = f2 * (crypto_int64) g4; - crypto_int64 f2g5 = f2 * (crypto_int64) g5; - crypto_int64 f2g6 = f2 * (crypto_int64) g6; - crypto_int64 f2g7 = f2 * (crypto_int64) g7; - crypto_int64 f2g8_19 = f2 * (crypto_int64) g8_19; - crypto_int64 f2g9_19 = f2 * (crypto_int64) g9_19; - crypto_int64 f3g0 = f3 * (crypto_int64) g0; - crypto_int64 f3g1_2 = f3_2 * (crypto_int64) g1; - crypto_int64 f3g2 = f3 * (crypto_int64) g2; - crypto_int64 f3g3_2 = f3_2 * (crypto_int64) g3; - crypto_int64 f3g4 = f3 * (crypto_int64) g4; - crypto_int64 f3g5_2 = f3_2 * (crypto_int64) g5; - crypto_int64 f3g6 = f3 * (crypto_int64) g6; - crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19; - crypto_int64 f3g8_19 = f3 * (crypto_int64) g8_19; - crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19; - crypto_int64 f4g0 = f4 * (crypto_int64) g0; - crypto_int64 f4g1 = f4 * (crypto_int64) g1; - crypto_int64 f4g2 = f4 * (crypto_int64) g2; - crypto_int64 f4g3 = f4 * (crypto_int64) g3; - crypto_int64 f4g4 = f4 * (crypto_int64) g4; - crypto_int64 f4g5 = f4 * (crypto_int64) g5; - crypto_int64 f4g6_19 = f4 * (crypto_int64) g6_19; - crypto_int64 f4g7_19 = f4 * (crypto_int64) g7_19; - crypto_int64 f4g8_19 = f4 * (crypto_int64) g8_19; - crypto_int64 f4g9_19 = f4 * (crypto_int64) g9_19; - crypto_int64 f5g0 = f5 * (crypto_int64) g0; - crypto_int64 f5g1_2 = f5_2 * (crypto_int64) g1; - crypto_int64 f5g2 = f5 * (crypto_int64) g2; - crypto_int64 f5g3_2 = f5_2 * (crypto_int64) g3; - crypto_int64 f5g4 = f5 * (crypto_int64) g4; - crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19; - crypto_int64 f5g6_19 = f5 * (crypto_int64) g6_19; - crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19; - crypto_int64 f5g8_19 = f5 * (crypto_int64) g8_19; - crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19; - crypto_int64 f6g0 = f6 * (crypto_int64) g0; - crypto_int64 f6g1 = f6 * (crypto_int64) g1; - crypto_int64 f6g2 = f6 * (crypto_int64) g2; - crypto_int64 f6g3 = f6 * (crypto_int64) g3; - crypto_int64 f6g4_19 = f6 * (crypto_int64) g4_19; - crypto_int64 f6g5_19 = f6 * (crypto_int64) g5_19; - crypto_int64 f6g6_19 = f6 * (crypto_int64) g6_19; - crypto_int64 f6g7_19 = f6 * (crypto_int64) g7_19; - crypto_int64 f6g8_19 = f6 * (crypto_int64) g8_19; - crypto_int64 f6g9_19 = f6 * (crypto_int64) g9_19; - crypto_int64 f7g0 = f7 * (crypto_int64) g0; - crypto_int64 f7g1_2 = f7_2 * (crypto_int64) g1; - crypto_int64 f7g2 = f7 * (crypto_int64) g2; - crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19; - crypto_int64 f7g4_19 = f7 * (crypto_int64) g4_19; - crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19; - crypto_int64 f7g6_19 = f7 * (crypto_int64) g6_19; - crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19; - crypto_int64 f7g8_19 = f7 * (crypto_int64) g8_19; - crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19; - crypto_int64 f8g0 = f8 * (crypto_int64) g0; - crypto_int64 f8g1 = f8 * (crypto_int64) g1; - crypto_int64 f8g2_19 = f8 * (crypto_int64) g2_19; - crypto_int64 f8g3_19 = f8 * (crypto_int64) g3_19; - crypto_int64 f8g4_19 = f8 * (crypto_int64) g4_19; - crypto_int64 f8g5_19 = f8 * (crypto_int64) g5_19; - crypto_int64 f8g6_19 = f8 * (crypto_int64) g6_19; - crypto_int64 f8g7_19 = f8 * (crypto_int64) g7_19; - crypto_int64 f8g8_19 = f8 * (crypto_int64) g8_19; - crypto_int64 f8g9_19 = f8 * (crypto_int64) g9_19; - crypto_int64 f9g0 = f9 * (crypto_int64) g0; - crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19; - crypto_int64 f9g2_19 = f9 * (crypto_int64) g2_19; - crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19; - crypto_int64 f9g4_19 = f9 * (crypto_int64) g4_19; - crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19; - crypto_int64 f9g6_19 = f9 * (crypto_int64) g6_19; - crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19; - crypto_int64 f9g8_19 = f9 * (crypto_int64) g8_19; - crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19; - crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; - crypto_int64 h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; - crypto_int64 h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; - crypto_int64 h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; - crypto_int64 h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; - crypto_int64 h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; - crypto_int64 h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; - crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; - crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; - crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - /* - |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 - */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.71*2^59 */ - /* |h5| <= 1.71*2^59 */ - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.41*2^60 */ - /* |h6| <= 1.41*2^60 */ - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.71*2^59 */ - /* |h7| <= 1.71*2^59 */ - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.72*2^34 */ - /* |h8| <= 1.41*2^60 */ - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.71*2^59 */ - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.1*2^39 */ - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = (crypto_int32) h0; - h[1] = (crypto_int32) h1; - h[2] = (crypto_int32) h2; - h[3] = (crypto_int32) h3; - h[4] = (crypto_int32) h4; - h[5] = (crypto_int32) h5; - h[6] = (crypto_int32) h6; - h[7] = (crypto_int32) h7; - h[8] = (crypto_int32) h8; - h[9] = (crypto_int32) h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_neg.c b/src/tor/src/ext/ed25519/ref10/fe_neg.c deleted file mode 100644 index 2078ce528..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_neg.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "fe.h" - -/* -h = -f - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -*/ - -void fe_neg(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 h0 = -f0; - crypto_int32 h1 = -f1; - crypto_int32 h2 = -f2; - crypto_int32 h3 = -f3; - crypto_int32 h4 = -f4; - crypto_int32 h5 = -f5; - crypto_int32 h6 = -f6; - crypto_int32 h7 = -f7; - crypto_int32 h8 = -f8; - crypto_int32 h9 = -f9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_pow22523.c b/src/tor/src/ext/ed25519/ref10/fe_pow22523.c deleted file mode 100644 index 56675a590..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_pow22523.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "fe.h" - -void fe_pow22523(fe out,const fe z) -{ - fe t0; - fe t1; - fe t2; - int i; - -#include "pow22523.h" - - return; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_sq.c b/src/tor/src/ext/ed25519/ref10/fe_sq.c deleted file mode 100644 index 0022a1751..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_sq.c +++ /dev/null @@ -1,149 +0,0 @@ -#include "fe.h" -#include "crypto_int64.h" - -/* -h = f * f -Can overlap h with f. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -See fe_mul.c for discussion of implementation strategy. -*/ - -void fe_sq(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 f0_2 = 2 * f0; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f2_2 = 2 * f2; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f4_2 = 2 * f4; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f6_2 = 2 * f6; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ - crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ - crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ - crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ - crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ - crypto_int64 f0f0 = f0 * (crypto_int64) f0; - crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; - crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; - crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; - crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; - crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; - crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; - crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; - crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; - crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; - crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; - crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; - crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; - crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; - crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; - crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; - crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; - crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; - crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; - crypto_int64 f2f2 = f2 * (crypto_int64) f2; - crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; - crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; - crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; - crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; - crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; - crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; - crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; - crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; - crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; - crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; - crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; - crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; - crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; - crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; - crypto_int64 f4f4 = f4 * (crypto_int64) f4; - crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; - crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; - crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; - crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; - crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; - crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; - crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; - crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; - crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; - crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; - crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; - crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; - crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; - crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; - crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; - crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; - crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; - crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; - crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; - crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; - crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; - crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; - crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; - crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; - crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; - crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; - crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; - crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; - crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; - crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - - h[0] = (crypto_int32) h0; - h[1] = (crypto_int32) h1; - h[2] = (crypto_int32) h2; - h[3] = (crypto_int32) h3; - h[4] = (crypto_int32) h4; - h[5] = (crypto_int32) h5; - h[6] = (crypto_int32) h6; - h[7] = (crypto_int32) h7; - h[8] = (crypto_int32) h8; - h[9] = (crypto_int32) h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_sq2.c b/src/tor/src/ext/ed25519/ref10/fe_sq2.c deleted file mode 100644 index e8faa69ec..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_sq2.c +++ /dev/null @@ -1,160 +0,0 @@ -#include "fe.h" -#include "crypto_int64.h" - -/* -h = 2 * f * f -Can overlap h with f. - -Preconditions: - |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. - -Postconditions: - |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -*/ - -/* -See fe_mul.c for discussion of implementation strategy. -*/ - -void fe_sq2(fe h,const fe f) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 f0_2 = 2 * f0; - crypto_int32 f1_2 = 2 * f1; - crypto_int32 f2_2 = 2 * f2; - crypto_int32 f3_2 = 2 * f3; - crypto_int32 f4_2 = 2 * f4; - crypto_int32 f5_2 = 2 * f5; - crypto_int32 f6_2 = 2 * f6; - crypto_int32 f7_2 = 2 * f7; - crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */ - crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */ - crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */ - crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */ - crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */ - crypto_int64 f0f0 = f0 * (crypto_int64) f0; - crypto_int64 f0f1_2 = f0_2 * (crypto_int64) f1; - crypto_int64 f0f2_2 = f0_2 * (crypto_int64) f2; - crypto_int64 f0f3_2 = f0_2 * (crypto_int64) f3; - crypto_int64 f0f4_2 = f0_2 * (crypto_int64) f4; - crypto_int64 f0f5_2 = f0_2 * (crypto_int64) f5; - crypto_int64 f0f6_2 = f0_2 * (crypto_int64) f6; - crypto_int64 f0f7_2 = f0_2 * (crypto_int64) f7; - crypto_int64 f0f8_2 = f0_2 * (crypto_int64) f8; - crypto_int64 f0f9_2 = f0_2 * (crypto_int64) f9; - crypto_int64 f1f1_2 = f1_2 * (crypto_int64) f1; - crypto_int64 f1f2_2 = f1_2 * (crypto_int64) f2; - crypto_int64 f1f3_4 = f1_2 * (crypto_int64) f3_2; - crypto_int64 f1f4_2 = f1_2 * (crypto_int64) f4; - crypto_int64 f1f5_4 = f1_2 * (crypto_int64) f5_2; - crypto_int64 f1f6_2 = f1_2 * (crypto_int64) f6; - crypto_int64 f1f7_4 = f1_2 * (crypto_int64) f7_2; - crypto_int64 f1f8_2 = f1_2 * (crypto_int64) f8; - crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38; - crypto_int64 f2f2 = f2 * (crypto_int64) f2; - crypto_int64 f2f3_2 = f2_2 * (crypto_int64) f3; - crypto_int64 f2f4_2 = f2_2 * (crypto_int64) f4; - crypto_int64 f2f5_2 = f2_2 * (crypto_int64) f5; - crypto_int64 f2f6_2 = f2_2 * (crypto_int64) f6; - crypto_int64 f2f7_2 = f2_2 * (crypto_int64) f7; - crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19; - crypto_int64 f2f9_38 = f2 * (crypto_int64) f9_38; - crypto_int64 f3f3_2 = f3_2 * (crypto_int64) f3; - crypto_int64 f3f4_2 = f3_2 * (crypto_int64) f4; - crypto_int64 f3f5_4 = f3_2 * (crypto_int64) f5_2; - crypto_int64 f3f6_2 = f3_2 * (crypto_int64) f6; - crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38; - crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19; - crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38; - crypto_int64 f4f4 = f4 * (crypto_int64) f4; - crypto_int64 f4f5_2 = f4_2 * (crypto_int64) f5; - crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19; - crypto_int64 f4f7_38 = f4 * (crypto_int64) f7_38; - crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19; - crypto_int64 f4f9_38 = f4 * (crypto_int64) f9_38; - crypto_int64 f5f5_38 = f5 * (crypto_int64) f5_38; - crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19; - crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38; - crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19; - crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38; - crypto_int64 f6f6_19 = f6 * (crypto_int64) f6_19; - crypto_int64 f6f7_38 = f6 * (crypto_int64) f7_38; - crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19; - crypto_int64 f6f9_38 = f6 * (crypto_int64) f9_38; - crypto_int64 f7f7_38 = f7 * (crypto_int64) f7_38; - crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19; - crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38; - crypto_int64 f8f8_19 = f8 * (crypto_int64) f8_19; - crypto_int64 f8f9_38 = f8 * (crypto_int64) f9_38; - crypto_int64 f9f9_38 = f9 * (crypto_int64) f9_38; - crypto_int64 h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; - crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; - crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; - crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; - crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; - crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; - crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; - crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; - crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; - crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - - h0 += h0; - h1 += h1; - h2 += h2; - h3 += h3; - h4 += h4; - h5 += h5; - h6 += h6; - h7 += h7; - h8 += h8; - h9 += h9; - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - - carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= SHL64(carry1,25); - carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= SHL64(carry5,25); - - carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= SHL64(carry2,26); - carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= SHL64(carry6,26); - - carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= SHL64(carry3,25); - carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= SHL64(carry7,25); - - carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= SHL64(carry4,26); - carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= SHL64(carry8,26); - - carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= SHL64(carry9,25); - - carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= SHL64(carry0,26); - - h[0] = (crypto_int32) h0; - h[1] = (crypto_int32) h1; - h[2] = (crypto_int32) h2; - h[3] = (crypto_int32) h3; - h[4] = (crypto_int32) h4; - h[5] = (crypto_int32) h5; - h[6] = (crypto_int32) h6; - h[7] = (crypto_int32) h7; - h[8] = (crypto_int32) h8; - h[9] = (crypto_int32) h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_sub.c b/src/tor/src/ext/ed25519/ref10/fe_sub.c deleted file mode 100644 index 6e26b7df8..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_sub.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "fe.h" - -/* -h = f - g -Can overlap h with f or g. - -Preconditions: - |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. - -Postconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -*/ - -void fe_sub(fe h,const fe f,const fe g) -{ - crypto_int32 f0 = f[0]; - crypto_int32 f1 = f[1]; - crypto_int32 f2 = f[2]; - crypto_int32 f3 = f[3]; - crypto_int32 f4 = f[4]; - crypto_int32 f5 = f[5]; - crypto_int32 f6 = f[6]; - crypto_int32 f7 = f[7]; - crypto_int32 f8 = f[8]; - crypto_int32 f9 = f[9]; - crypto_int32 g0 = g[0]; - crypto_int32 g1 = g[1]; - crypto_int32 g2 = g[2]; - crypto_int32 g3 = g[3]; - crypto_int32 g4 = g[4]; - crypto_int32 g5 = g[5]; - crypto_int32 g6 = g[6]; - crypto_int32 g7 = g[7]; - crypto_int32 g8 = g[8]; - crypto_int32 g9 = g[9]; - crypto_int32 h0 = f0 - g0; - crypto_int32 h1 = f1 - g1; - crypto_int32 h2 = f2 - g2; - crypto_int32 h3 = f3 - g3; - crypto_int32 h4 = f4 - g4; - crypto_int32 h5 = f5 - g5; - crypto_int32 h6 = f6 - g6; - crypto_int32 h7 = f7 - g7; - crypto_int32 h8 = f8 - g8; - crypto_int32 h9 = f9 - g9; - h[0] = h0; - h[1] = h1; - h[2] = h2; - h[3] = h3; - h[4] = h4; - h[5] = h5; - h[6] = h6; - h[7] = h7; - h[8] = h8; - h[9] = h9; -} diff --git a/src/tor/src/ext/ed25519/ref10/fe_tobytes.c b/src/tor/src/ext/ed25519/ref10/fe_tobytes.c deleted file mode 100644 index 3c7f38962..000000000 --- a/src/tor/src/ext/ed25519/ref10/fe_tobytes.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "fe.h" - -/* -Preconditions: - |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. - -Write p=2^255-19; q=floor(h/p). -Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). - -Proof: - Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. - Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. - - Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). - Then 0> 25; - q = (h0 + q) >> 26; - q = (h1 + q) >> 25; - q = (h2 + q) >> 26; - q = (h3 + q) >> 25; - q = (h4 + q) >> 26; - q = (h5 + q) >> 25; - q = (h6 + q) >> 26; - q = (h7 + q) >> 25; - q = (h8 + q) >> 26; - q = (h9 + q) >> 25; - - /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ - h0 += 19 * q; - /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ - - carry0 = h0 >> 26; h1 += carry0; h0 -= SHL32(carry0,26); - carry1 = h1 >> 25; h2 += carry1; h1 -= SHL32(carry1,25); - carry2 = h2 >> 26; h3 += carry2; h2 -= SHL32(carry2,26); - carry3 = h3 >> 25; h4 += carry3; h3 -= SHL32(carry3,25); - carry4 = h4 >> 26; h5 += carry4; h4 -= SHL32(carry4,26); - carry5 = h5 >> 25; h6 += carry5; h5 -= SHL32(carry5,25); - carry6 = h6 >> 26; h7 += carry6; h6 -= SHL32(carry6,26); - carry7 = h7 >> 25; h8 += carry7; h7 -= SHL32(carry7,25); - carry8 = h8 >> 26; h9 += carry8; h8 -= SHL32(carry8,26); - carry9 = h9 >> 25; h9 -= SHL32(carry9,25); - /* h10 = carry9 */ - - /* - Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - Have h0+...+2^230 h9 between 0 and 2^255-1; - evidently 2^255 h10-2^255 q = 0. - Goal: Output h0+...+2^230 h9. - */ - - s[0] = h0 >> 0; - s[1] = h0 >> 8; - s[2] = h0 >> 16; - s[3] = (h0 >> 24) | SHL32(h1,2); - s[4] = h1 >> 6; - s[5] = h1 >> 14; - s[6] = (h1 >> 22) | SHL32(h2,3); - s[7] = h2 >> 5; - s[8] = h2 >> 13; - s[9] = (h2 >> 21) | SHL32(h3,5); - s[10] = h3 >> 3; - s[11] = h3 >> 11; - s[12] = (h3 >> 19) | SHL32(h4,6); - s[13] = h4 >> 2; - s[14] = h4 >> 10; - s[15] = h4 >> 18; - s[16] = h5 >> 0; - s[17] = h5 >> 8; - s[18] = h5 >> 16; - s[19] = (h5 >> 24) | SHL32(h6,1); - s[20] = h6 >> 7; - s[21] = h6 >> 15; - s[22] = (h6 >> 23) | SHL32(h7,3); - s[23] = h7 >> 5; - s[24] = h7 >> 13; - s[25] = (h7 >> 21) | SHL32(h8,4); - s[26] = h8 >> 4; - s[27] = h8 >> 12; - s[28] = (h8 >> 20) | SHL32(h9,6); - s[29] = h9 >> 2; - s[30] = h9 >> 10; - s[31] = h9 >> 18; -} diff --git a/src/tor/src/ext/ed25519/ref10/ge.h b/src/tor/src/ext/ed25519/ref10/ge.h deleted file mode 100644 index 55e95f95b..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef GE_H -#define GE_H - -/* -ge means group element. - -Here the group is the set of pairs (x,y) of field elements (see fe.h) -satisfying -x^2 + y^2 = 1 + d x^2y^2 -where d = -121665/121666. - -Representations: - ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z - ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT - ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T - ge_precomp (Duif): (y+x,y-x,2dxy) -*/ - -#include "fe.h" - -typedef struct { - fe X; - fe Y; - fe Z; -} ge_p2; - -typedef struct { - fe X; - fe Y; - fe Z; - fe T; -} ge_p3; - -typedef struct { - fe X; - fe Y; - fe Z; - fe T; -} ge_p1p1; - -typedef struct { - fe yplusx; - fe yminusx; - fe xy2d; -} ge_precomp; - -typedef struct { - fe YplusX; - fe YminusX; - fe Z; - fe T2d; -} ge_cached; - -#define ge_frombytes_negate_vartime crypto_sign_ed25519_ref10_ge_frombytes_negate_vartime -#define ge_tobytes crypto_sign_ed25519_ref10_ge_tobytes -#define ge_p3_tobytes crypto_sign_ed25519_ref10_ge_p3_tobytes - -#define ge_p2_0 crypto_sign_ed25519_ref10_ge_p2_0 -#define ge_p3_0 crypto_sign_ed25519_ref10_ge_p3_0 -#define ge_precomp_0 crypto_sign_ed25519_ref10_ge_precomp_0 -#define ge_p3_to_p2 crypto_sign_ed25519_ref10_ge_p3_to_p2 -#define ge_p3_to_cached crypto_sign_ed25519_ref10_ge_p3_to_cached -#define ge_p1p1_to_p2 crypto_sign_ed25519_ref10_ge_p1p1_to_p2 -#define ge_p1p1_to_p3 crypto_sign_ed25519_ref10_ge_p1p1_to_p3 -#define ge_p2_dbl crypto_sign_ed25519_ref10_ge_p2_dbl -#define ge_p3_dbl crypto_sign_ed25519_ref10_ge_p3_dbl - -#define ge_madd crypto_sign_ed25519_ref10_ge_madd -#define ge_msub crypto_sign_ed25519_ref10_ge_msub -#define ge_add crypto_sign_ed25519_ref10_ge_add -#define ge_sub crypto_sign_ed25519_ref10_ge_sub -#define ge_scalarmult_base crypto_sign_ed25519_ref10_ge_scalarmult_base -#define ge_double_scalarmult_vartime crypto_sign_ed25519_ref10_ge_double_scalarmult_vartime - -extern void ge_tobytes(unsigned char *,const ge_p2 *); -extern void ge_p3_tobytes(unsigned char *,const ge_p3 *); -extern int ge_frombytes_negate_vartime(ge_p3 *,const unsigned char *); - -extern void ge_p2_0(ge_p2 *); -extern void ge_p3_0(ge_p3 *); -extern void ge_precomp_0(ge_precomp *); -extern void ge_p3_to_p2(ge_p2 *,const ge_p3 *); -extern void ge_p3_to_cached(ge_cached *,const ge_p3 *); -extern void ge_p1p1_to_p2(ge_p2 *,const ge_p1p1 *); -extern void ge_p1p1_to_p3(ge_p3 *,const ge_p1p1 *); -extern void ge_p2_dbl(ge_p1p1 *,const ge_p2 *); -extern void ge_p3_dbl(ge_p1p1 *,const ge_p3 *); - -extern void ge_madd(ge_p1p1 *,const ge_p3 *,const ge_precomp *); -extern void ge_msub(ge_p1p1 *,const ge_p3 *,const ge_precomp *); -extern void ge_add(ge_p1p1 *,const ge_p3 *,const ge_cached *); -extern void ge_sub(ge_p1p1 *,const ge_p3 *,const ge_cached *); -extern void ge_scalarmult_base(ge_p3 *,const unsigned char *); -extern void ge_double_scalarmult_vartime(ge_p2 *,const unsigned char *,const ge_p3 *,const unsigned char *); - -#endif diff --git a/src/tor/src/ext/ed25519/ref10/ge_add.c b/src/tor/src/ext/ed25519/ref10/ge_add.c deleted file mode 100644 index da7ff5d2e..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_add.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "ge.h" - -/* -r = p + q -*/ - -void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) -{ - fe t0; -#include "ge_add.h" -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_add.h b/src/tor/src/ext/ed25519/ref10/ge_add.h deleted file mode 100644 index 7481f8ffb..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_add.h +++ /dev/null @@ -1,97 +0,0 @@ - -/* qhasm: enter ge_add */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe Z2 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ZZ */ - -/* qhasm: fe YpX2 */ - -/* qhasm: fe YmX2 */ - -/* qhasm: fe T2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*YpX2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YplusX); */ -fe_mul(r->Z,r->X,q->YplusX); - -/* qhasm: B = YmX1*YmX2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YminusX); */ -fe_mul(r->Y,r->Y,q->YminusX); - -/* qhasm: C = T2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ -fe_mul(r->T,q->T2d,p->T); - -/* qhasm: ZZ = Z1*Z2 */ -/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ -fe_mul(r->X,p->Z,q->Z); - -/* qhasm: D = 2*ZZ */ -/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ -fe_add(t0,r->X,r->X); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D+C */ -/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ -fe_add(r->Z,t0,r->T); - -/* qhasm: T3 = D-C */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ -fe_sub(r->T,t0,r->T); - -/* qhasm: return */ diff --git a/src/tor/src/ext/ed25519/ref10/ge_add.q b/src/tor/src/ext/ed25519/ref10/ge_add.q deleted file mode 100644 index a6572ab0f..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_add.q +++ /dev/null @@ -1,49 +0,0 @@ -:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->YplusX:q->YminusX:q->Z:q->T2d: -fe r:var/r=fe: - -enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>YpX2=fe#15:>YmX2=fe#16:>Z2=fe#17:>T2d2=fe#18: -return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,> 3] >> (i & 7)); - - for (i = 0;i < 256;++i) - if (r[i]) { - for (b = 1;b <= 6 && i + b < 256;++b) { - if (r[i + b]) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (k = i + b;k < 256;++k) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else - break; - } - } - } - -} - -static ge_precomp Bi[8] = { -#include "base2.h" -} ; - -/* -r = a * A + b * B -where a = a[0]+256*a[1]+...+256^31 a[31]. -and b = b[0]+256*b[1]+...+256^31 b[31]. -B is the Ed25519 base point (x,4/5) with x positive. -*/ - -void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b) -{ - signed char aslide[256]; - signed char bslide[256]; - ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ - ge_p1p1 t; - ge_p3 u; - ge_p3 A2; - int i; - - slide(aslide,a); - slide(bslide,b); - - ge_p3_to_cached(&Ai[0],A); - ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); - ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); - ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); - ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); - ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); - ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); - ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); - ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); - - ge_p2_0(r); - - for (i = 255;i >= 0;--i) { - if (aslide[i] || bslide[i]) break; - } - - for (;i >= 0;--i) { - ge_p2_dbl(&t,r); - - if (aslide[i] > 0) { - ge_p1p1_to_p3(&u,&t); - ge_add(&t,&u,&Ai[aslide[i]/2]); - } else if (aslide[i] < 0) { - ge_p1p1_to_p3(&u,&t); - ge_sub(&t,&u,&Ai[(-aslide[i])/2]); - } - - if (bslide[i] > 0) { - ge_p1p1_to_p3(&u,&t); - ge_madd(&t,&u,&Bi[bslide[i]/2]); - } else if (bslide[i] < 0) { - ge_p1p1_to_p3(&u,&t); - ge_msub(&t,&u,&Bi[(-bslide[i])/2]); - } - - ge_p1p1_to_p2(r,&t); - } -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_frombytes.c b/src/tor/src/ext/ed25519/ref10/ge_frombytes.c deleted file mode 100644 index 1a059ee93..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_frombytes.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "ge.h" - -static const fe d = { -#include "d.h" -} ; - -static const fe sqrtm1 = { -#include "sqrtm1.h" -} ; - -int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s) -{ - fe u; - fe v; - fe v3; - fe vxx; - fe check; - - fe_frombytes(h->Y,s); - fe_1(h->Z); - fe_sq(u,h->Y); - fe_mul(v,u,d); - fe_sub(u,u,h->Z); /* u = y^2-1 */ - fe_add(v,v,h->Z); /* v = dy^2+1 */ - - fe_sq(v3,v); - fe_mul(v3,v3,v); /* v3 = v^3 */ - fe_sq(h->X,v3); - fe_mul(h->X,h->X,v); - fe_mul(h->X,h->X,u); /* x = uv^7 */ - - fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ - fe_mul(h->X,h->X,v3); - fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ - - fe_sq(vxx,h->X); - fe_mul(vxx,vxx,v); - fe_sub(check,vxx,u); /* vx^2-u */ - if (fe_isnonzero(check)) { - fe_add(check,vxx,u); /* vx^2+u */ - if (fe_isnonzero(check)) return -1; - fe_mul(h->X,h->X,sqrtm1); - } - - if (fe_isnegative(h->X) == (s[31] >> 7)) - fe_neg(h->X,h->X); - - fe_mul(h->T,h->X,h->Y); - return 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_madd.c b/src/tor/src/ext/ed25519/ref10/ge_madd.c deleted file mode 100644 index 622571774..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_madd.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "ge.h" - -/* -r = p + q -*/ - -void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) -{ - fe t0; -#include "ge_madd.h" -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_madd.h b/src/tor/src/ext/ed25519/ref10/ge_madd.h deleted file mode 100644 index ecae84952..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_madd.h +++ /dev/null @@ -1,88 +0,0 @@ - -/* qhasm: enter ge_madd */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ypx2 */ - -/* qhasm: fe ymx2 */ - -/* qhasm: fe xy2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*ypx2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yplusx); */ -fe_mul(r->Z,r->X,q->yplusx); - -/* qhasm: B = YmX1*ymx2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yminusx); */ -fe_mul(r->Y,r->Y,q->yminusx); - -/* qhasm: C = xy2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ -fe_mul(r->T,q->xy2d,p->T); - -/* qhasm: D = 2*Z1 */ -/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ -fe_add(t0,p->Z,p->Z); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D+C */ -/* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ -fe_add(r->Z,t0,r->T); - -/* qhasm: T3 = D-C */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ -fe_sub(r->T,t0,r->T); - -/* qhasm: return */ diff --git a/src/tor/src/ext/ed25519/ref10/ge_madd.q b/src/tor/src/ext/ed25519/ref10/ge_madd.q deleted file mode 100644 index aa3db454e..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_madd.q +++ /dev/null @@ -1,46 +0,0 @@ -:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->yplusx:q->yminusx:q->xy2d: -fe r:var/r=fe: - -enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>ypx2=fe#15:>ymx2=fe#16:>xy2d2=fe#17: -return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*ymx2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yminusx); */ -fe_mul(r->Z,r->X,q->yminusx); - -/* qhasm: B = YmX1*ypx2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yplusx); */ -fe_mul(r->Y,r->Y,q->yplusx); - -/* qhasm: C = xy2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ -fe_mul(r->T,q->xy2d,p->T); - -/* qhasm: D = 2*Z1 */ -/* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ -fe_add(t0,p->Z,p->Z); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D-C */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ -fe_sub(r->Z,t0,r->T); - -/* qhasm: T3 = D+C */ -/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ -fe_add(r->T,t0,r->T); - -/* qhasm: return */ diff --git a/src/tor/src/ext/ed25519/ref10/ge_msub.q b/src/tor/src/ext/ed25519/ref10/ge_msub.q deleted file mode 100644 index e3cadd882..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_msub.q +++ /dev/null @@ -1,46 +0,0 @@ -:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->yplusx:q->yminusx:q->xy2d: -fe r:var/r=fe: - -enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>ypx2=fe#15:>ymx2=fe#16:>xy2d2=fe#17: -return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,X,p->X,p->T); - fe_mul(r->Y,p->Y,p->Z); - fe_mul(r->Z,p->Z,p->T); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p3.c b/src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p3.c deleted file mode 100644 index 2f57b1096..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p1p1_to_p3.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "ge.h" - -/* -r = p -*/ - -extern void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p) -{ - fe_mul(r->X,p->X,p->T); - fe_mul(r->Y,p->Y,p->Z); - fe_mul(r->Z,p->Z,p->T); - fe_mul(r->T,p->X,p->Y); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p2_0.c b/src/tor/src/ext/ed25519/ref10/ge_p2_0.c deleted file mode 100644 index 6191d1e6e..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p2_0.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "ge.h" - -void ge_p2_0(ge_p2 *h) -{ - fe_0(h->X); - fe_1(h->Y); - fe_1(h->Z); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.c b/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.c deleted file mode 100644 index 2e332b5ce..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "ge.h" - -/* -r = 2 * p -*/ - -void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p) -{ - fe t0; -#include "ge_p2_dbl.h" -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.h b/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.h deleted file mode 100644 index 128efed90..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.h +++ /dev/null @@ -1,73 +0,0 @@ - -/* qhasm: enter ge_p2_dbl */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe A */ - -/* qhasm: fe AA */ - -/* qhasm: fe XX */ - -/* qhasm: fe YY */ - -/* qhasm: fe B */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: XX=X1^2 */ -/* asm 1: fe_sq(>XX=fe#1,XX=r->X,X); */ -fe_sq(r->X,p->X); - -/* qhasm: YY=Y1^2 */ -/* asm 1: fe_sq(>YY=fe#3,YY=r->Z,Y); */ -fe_sq(r->Z,p->Y); - -/* qhasm: B=2*Z1^2 */ -/* asm 1: fe_sq2(>B=fe#4,B=r->T,Z); */ -fe_sq2(r->T,p->Z); - -/* qhasm: A=X1+Y1 */ -/* asm 1: fe_add(>A=fe#2,A=r->Y,X,Y); */ -fe_add(r->Y,p->X,p->Y); - -/* qhasm: AA=A^2 */ -/* asm 1: fe_sq(>AA=fe#5,AA=t0,Y); */ -fe_sq(t0,r->Y); - -/* qhasm: Y3=YY+XX */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,X); */ -fe_add(r->Y,r->Z,r->X); - -/* qhasm: Z3=YY-XX */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,Z,X); */ -fe_sub(r->Z,r->Z,r->X); - -/* qhasm: X3=AA-Y3 */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Y); */ -fe_sub(r->X,t0,r->Y); - -/* qhasm: T3=B-Z3 */ -/* asm 1: fe_sub(>T3=fe#4,T3=r->T,T,Z); */ -fe_sub(r->T,r->T,r->Z); - -/* qhasm: return */ diff --git a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.q b/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.q deleted file mode 100644 index 170d42f9a..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p2_dbl.q +++ /dev/null @@ -1,41 +0,0 @@ -:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z: -fe r:var/r=fe: - -enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13: -return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_sq2(>h,h=fe:asm/fe_add(>h,X); - fe_1(h->Y); - fe_1(h->Z); - fe_0(h->T); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p3_dbl.c b/src/tor/src/ext/ed25519/ref10/ge_p3_dbl.c deleted file mode 100644 index 0d8a05915..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p3_dbl.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "ge.h" - -/* -r = 2 * p -*/ - -void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p) -{ - ge_p2 q; - ge_p3_to_p2(&q,p); - ge_p2_dbl(r,&q); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p3_to_cached.c b/src/tor/src/ext/ed25519/ref10/ge_p3_to_cached.c deleted file mode 100644 index bde64228c..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p3_to_cached.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "ge.h" - -/* -r = p -*/ - -static const fe d2 = { -#include "d2.h" -} ; - -extern void ge_p3_to_cached(ge_cached *r,const ge_p3 *p) -{ - fe_add(r->YplusX,p->Y,p->X); - fe_sub(r->YminusX,p->Y,p->X); - fe_copy(r->Z,p->Z); - fe_mul(r->T2d,p->T,d2); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p3_to_p2.c b/src/tor/src/ext/ed25519/ref10/ge_p3_to_p2.c deleted file mode 100644 index e532a9e4c..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p3_to_p2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "ge.h" - -/* -r = p -*/ - -extern void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p) -{ - fe_copy(r->X,p->X); - fe_copy(r->Y,p->Y); - fe_copy(r->Z,p->Z); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_p3_tobytes.c b/src/tor/src/ext/ed25519/ref10/ge_p3_tobytes.c deleted file mode 100644 index 21cb2fc65..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_p3_tobytes.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "ge.h" - -void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) -{ - fe recip; - fe x; - fe y; - - fe_invert(recip,h->Z); - fe_mul(x,h->X,recip); - fe_mul(y,h->Y,recip); - fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_precomp_0.c b/src/tor/src/ext/ed25519/ref10/ge_precomp_0.c deleted file mode 100644 index 2e218861d..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_precomp_0.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "ge.h" - -void ge_precomp_0(ge_precomp *h) -{ - fe_1(h->yplusx); - fe_1(h->yminusx); - fe_0(h->xy2d); -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_scalarmult_base.c b/src/tor/src/ext/ed25519/ref10/ge_scalarmult_base.c deleted file mode 100644 index 5292f8322..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_scalarmult_base.c +++ /dev/null @@ -1,109 +0,0 @@ -#include "ge.h" -#include "crypto_uint32.h" - -/* Rename this so as not to interfere with select() which torint.h apparently - * grabs. :p */ -#define select ed25519_ref10_select - -static unsigned char equal(signed char b,signed char c) -{ - unsigned char ub = b; - unsigned char uc = c; - unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ - crypto_uint32 y = x; /* 0: yes; 1..255: no */ - y -= 1; /* 4294967295: yes; 0..254: no */ - y >>= 31; /* 1: yes; 0: no */ - return y; -} - -static unsigned char negative(signed char b) -{ - uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ - x >>= 63; /* 1: yes; 0: no */ - return x; -} - -static void cmov(ge_precomp *t,ge_precomp *u,unsigned char b) -{ - fe_cmov(t->yplusx,u->yplusx,b); - fe_cmov(t->yminusx,u->yminusx,b); - fe_cmov(t->xy2d,u->xy2d,b); -} - -/* base[i][j] = (j+1)*256^i*B */ -static ge_precomp base[32][8] = { -#include "base.h" -} ; - -static void select(ge_precomp *t,int pos,signed char b) -{ - ge_precomp minust; - unsigned char bnegative = negative(b); - unsigned char babs = b - SHL8( (-bnegative) & (unsigned char)b, 1); - - ge_precomp_0(t); - cmov(t,&base[pos][0],equal(babs,1)); - cmov(t,&base[pos][1],equal(babs,2)); - cmov(t,&base[pos][2],equal(babs,3)); - cmov(t,&base[pos][3],equal(babs,4)); - cmov(t,&base[pos][4],equal(babs,5)); - cmov(t,&base[pos][5],equal(babs,6)); - cmov(t,&base[pos][6],equal(babs,7)); - cmov(t,&base[pos][7],equal(babs,8)); - fe_copy(minust.yplusx,t->yminusx); - fe_copy(minust.yminusx,t->yplusx); - fe_neg(minust.xy2d,t->xy2d); - cmov(t,&minust,bnegative); -} - -/* -h = a * B -where a = a[0]+256*a[1]+...+256^31 a[31] -B is the Ed25519 base point (x,4/5) with x positive. - -Preconditions: - a[31] <= 127 -*/ - -void ge_scalarmult_base(ge_p3 *h,const unsigned char *a) -{ - signed char e[64]; - signed char carry; - ge_p1p1 r; - ge_p2 s; - ge_precomp t; - int i; - - for (i = 0;i < 32;++i) { - e[2 * i + 0] = (a[i] >> 0) & 15; - e[2 * i + 1] = (a[i] >> 4) & 15; - } - /* each e[i] is between 0 and 15 */ - /* e[63] is between 0 and 7 */ - - carry = 0; - for (i = 0;i < 63;++i) { - e[i] += carry; - carry = e[i] + 8; - carry >>= 4; - e[i] -= SHL8(carry,4); - } - e[63] += carry; - /* each e[i] is between -8 and 8 */ - - ge_p3_0(h); - for (i = 1;i < 64;i += 2) { - select(&t,i / 2,e[i]); - ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); - } - - ge_p3_dbl(&r,h); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r); - ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r); - - for (i = 0;i < 64;i += 2) { - select(&t,i / 2,e[i]); - ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r); - } -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_sub.c b/src/tor/src/ext/ed25519/ref10/ge_sub.c deleted file mode 100644 index 69f3d5406..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_sub.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "ge.h" - -/* -r = p - q -*/ - -void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) -{ - fe t0; -#include "ge_sub.h" -} diff --git a/src/tor/src/ext/ed25519/ref10/ge_sub.h b/src/tor/src/ext/ed25519/ref10/ge_sub.h deleted file mode 100644 index b4ef1f5dd..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_sub.h +++ /dev/null @@ -1,97 +0,0 @@ - -/* qhasm: enter ge_sub */ - -/* qhasm: fe X1 */ - -/* qhasm: fe Y1 */ - -/* qhasm: fe Z1 */ - -/* qhasm: fe Z2 */ - -/* qhasm: fe T1 */ - -/* qhasm: fe ZZ */ - -/* qhasm: fe YpX2 */ - -/* qhasm: fe YmX2 */ - -/* qhasm: fe T2d2 */ - -/* qhasm: fe X3 */ - -/* qhasm: fe Y3 */ - -/* qhasm: fe Z3 */ - -/* qhasm: fe T3 */ - -/* qhasm: fe YpX1 */ - -/* qhasm: fe YmX1 */ - -/* qhasm: fe A */ - -/* qhasm: fe B */ - -/* qhasm: fe C */ - -/* qhasm: fe D */ - -/* qhasm: YpX1 = Y1+X1 */ -/* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ -fe_add(r->X,p->Y,p->X); - -/* qhasm: YmX1 = Y1-X1 */ -/* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ -fe_sub(r->Y,p->Y,p->X); - -/* qhasm: A = YpX1*YmX2 */ -/* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YminusX); */ -fe_mul(r->Z,r->X,q->YminusX); - -/* qhasm: B = YmX1*YpX2 */ -/* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YplusX); */ -fe_mul(r->Y,r->Y,q->YplusX); - -/* qhasm: C = T2d2*T1 */ -/* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ -fe_mul(r->T,q->T2d,p->T); - -/* qhasm: ZZ = Z1*Z2 */ -/* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ -fe_mul(r->X,p->Z,q->Z); - -/* qhasm: D = 2*ZZ */ -/* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ -fe_add(t0,r->X,r->X); - -/* qhasm: X3 = A-B */ -/* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ -fe_sub(r->X,r->Z,r->Y); - -/* qhasm: Y3 = A+B */ -/* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ -fe_add(r->Y,r->Z,r->Y); - -/* qhasm: Z3 = D-C */ -/* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ -fe_sub(r->Z,t0,r->T); - -/* qhasm: T3 = D+C */ -/* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ -fe_add(r->T,t0,r->T); - -/* qhasm: return */ diff --git a/src/tor/src/ext/ed25519/ref10/ge_sub.q b/src/tor/src/ext/ed25519/ref10/ge_sub.q deleted file mode 100644 index 2779a4a20..000000000 --- a/src/tor/src/ext/ed25519/ref10/ge_sub.q +++ /dev/null @@ -1,49 +0,0 @@ -:name:fe:r->X:r->Y:r->Z:r->T:t0:t1:t2:t3:t4:t5:p->X:p->Y:p->Z:p->T:q->YplusX:q->YminusX:q->Z:q->T2d: -fe r:var/r=fe: - -enter f:enter/f:>X1=fe#11:>Y1=fe#12:>Z1=fe#13:>T1=fe#14:>YpX2=fe#15:>YmX2=fe#16:>Z2=fe#17:>T2d2=fe#18: -return:nofallthrough:h=fe:asm/fe_add(>h,h=fe:asm/fe_sub(>h,h=fe:asm/fe_mul(>h,h=fe:asm/fe_sq(>h,h=fe:asm/fe_add(>h,Z); - fe_mul(x,h->X,recip); - fe_mul(y,h->Y,recip); - fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; -} diff --git a/src/tor/src/ext/ed25519/ref10/keyconv.c b/src/tor/src/ext/ed25519/ref10/keyconv.c deleted file mode 100644 index 854b150d6..000000000 --- a/src/tor/src/ext/ed25519/ref10/keyconv.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Added to ref10 for Tor. We place this in the public domain. Alternatively, - * you may have it under the Creative Commons 0 "CC0" license. */ -#include "fe.h" -#include "ed25519_ref10.h" - -int ed25519_ref10_pubkey_from_curve25519_pubkey(unsigned char *out, - const unsigned char *inp, - int signbit) -{ - fe u; - fe one; - fe y; - fe uplus1; - fe uminus1; - fe inv_uplus1; - - /* From prop228: - - Given a curve25519 x-coordinate (u), we can get the y coordinate - of the ed25519 key using - - y = (u-1)/(u+1) - */ - fe_frombytes(u, inp); - fe_1(one); - fe_sub(uminus1, u, one); - fe_add(uplus1, u, one); - fe_invert(inv_uplus1, uplus1); - fe_mul(y, uminus1, inv_uplus1); - - fe_tobytes(out, y); - - /* propagate sign. */ - out[31] |= (!!signbit) << 7; - - return 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/keypair.c b/src/tor/src/ext/ed25519/ref10/keypair.c deleted file mode 100644 index 68a88f9ad..000000000 --- a/src/tor/src/ext/ed25519/ref10/keypair.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Modified for Tor: new API, 64-byte secret keys. */ - -#include "randombytes.h" -#include -#include "crypto_sign.h" -#include "crypto_hash_sha512.h" -#include "ge.h" - -int -crypto_sign_seckey(unsigned char *sk) -{ - unsigned char seed[32]; - - if (randombytes(seed,32) < 0) - return -1; - - crypto_sign_seckey_expand(sk, seed); - - memwipe(seed, 0, 32); - - return 0; -} - -int crypto_sign_seckey_expand(unsigned char *sk, const unsigned char *skseed) -{ - crypto_hash_sha512(sk,skseed,32); - sk[0] &= 248; - sk[31] &= 63; - sk[31] |= 64; - - return 0; -} - -int crypto_sign_pubkey(unsigned char *pk,const unsigned char *sk) -{ - ge_p3 A; - - ge_scalarmult_base(&A,sk); - ge_p3_tobytes(pk,&A); - - return 0; -} - - -int crypto_sign_keypair(unsigned char *pk,unsigned char *sk) -{ - crypto_sign_seckey(sk); - crypto_sign_pubkey(pk, sk); - - return 0; -} - diff --git a/src/tor/src/ext/ed25519/ref10/open.c b/src/tor/src/ext/ed25519/ref10/open.c deleted file mode 100644 index 3ab7b7d6e..000000000 --- a/src/tor/src/ext/ed25519/ref10/open.c +++ /dev/null @@ -1,43 +0,0 @@ -/* (Modified by Tor to verify signature separately from message) */ - -#include "crypto_sign.h" -#include -#include "crypto_hash_sha512.h" -#include "crypto_verify_32.h" -#include "ge.h" -#include "sc.h" - -/* 'signature' must be 64-bytes long. */ -int crypto_sign_open( - const unsigned char *signature, - const unsigned char *m, size_t mlen, - const unsigned char *pk -) -{ - unsigned char pkcopy[32]; - unsigned char rcopy[32]; - unsigned char scopy[32]; - unsigned char h[64]; - unsigned char rcheck[32]; - ge_p3 A; - ge_p2 R; - - if (signature[63] & 224) goto badsig; - if (ge_frombytes_negate_vartime(&A,pk) != 0) goto badsig; - - memmove(pkcopy,pk,32); - memmove(rcopy,signature,32); - memmove(scopy,signature + 32,32); - - crypto_hash_sha512_3(h, rcopy, 32, pkcopy, 32, m, mlen); - sc_reduce(h); - - ge_double_scalarmult_vartime(&R,h,&A,scopy); - ge_tobytes(rcheck,&R); - if (crypto_verify_32(rcheck,rcopy) == 0) { - return 0; - } - -badsig: - return -1; -} diff --git a/src/tor/src/ext/ed25519/ref10/pow22523.h b/src/tor/src/ext/ed25519/ref10/pow22523.h deleted file mode 100644 index 9204ff838..000000000 --- a/src/tor/src/ext/ed25519/ref10/pow22523.h +++ /dev/null @@ -1,161 +0,0 @@ -/* Modified by Tor: pointless loops removed to appease analysis tools */ - -/* qhasm: fe z1 */ - -/* qhasm: fe z2 */ - -/* qhasm: fe z8 */ - -/* qhasm: fe z9 */ - -/* qhasm: fe z11 */ - -/* qhasm: fe z22 */ - -/* qhasm: fe z_5_0 */ - -/* qhasm: fe z_10_5 */ - -/* qhasm: fe z_10_0 */ - -/* qhasm: fe z_20_10 */ - -/* qhasm: fe z_20_0 */ - -/* qhasm: fe z_40_20 */ - -/* qhasm: fe z_40_0 */ - -/* qhasm: fe z_50_10 */ - -/* qhasm: fe z_50_0 */ - -/* qhasm: fe z_100_50 */ - -/* qhasm: fe z_100_0 */ - -/* qhasm: fe z_200_100 */ - -/* qhasm: fe z_200_0 */ - -/* qhasm: fe z_250_50 */ - -/* qhasm: fe z_250_0 */ - -/* qhasm: fe z_252_2 */ - -/* qhasm: fe z_252_3 */ - -/* qhasm: enter pow22523 */ - -/* qhasm: z2 = z1^2^1 */ -/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ -/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ -fe_sq(t0,z); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ - -/* qhasm: z8 = z2^2^2 */ -/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ -/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ -fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); - -/* qhasm: z9 = z1*z8 */ -/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#1,z22=fe#1,>z22=fe#1); */ -/* asm 2: fe_sq(>z22=t0,z22=t0,>z22=t0); */ -fe_sq(t0,t0); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ - -/* qhasm: z_5_0 = z9*z22 */ -/* asm 1: fe_mul(>z_5_0=fe#1,z_5_0=t0,z_10_5=fe#2,z_10_5=fe#2,>z_10_5=fe#2); */ -/* asm 2: fe_sq(>z_10_5=t1,z_10_5=t1,>z_10_5=t1); */ -fe_sq(t1,t0); for (i = 1;i < 5;++i) fe_sq(t1,t1); - -/* qhasm: z_10_0 = z_10_5*z_5_0 */ -/* asm 1: fe_mul(>z_10_0=fe#1,z_10_0=t0,z_20_10=fe#2,z_20_10=fe#2,>z_20_10=fe#2); */ -/* asm 2: fe_sq(>z_20_10=t1,z_20_10=t1,>z_20_10=t1); */ -fe_sq(t1,t0); for (i = 1;i < 10;++i) fe_sq(t1,t1); - -/* qhasm: z_20_0 = z_20_10*z_10_0 */ -/* asm 1: fe_mul(>z_20_0=fe#2,z_20_0=t1,z_40_20=fe#3,z_40_20=fe#3,>z_40_20=fe#3); */ -/* asm 2: fe_sq(>z_40_20=t2,z_40_20=t2,>z_40_20=t2); */ -fe_sq(t2,t1); for (i = 1;i < 20;++i) fe_sq(t2,t2); - -/* qhasm: z_40_0 = z_40_20*z_20_0 */ -/* asm 1: fe_mul(>z_40_0=fe#2,z_40_0=t1,z_50_10=fe#2,z_50_10=fe#2,>z_50_10=fe#2); */ -/* asm 2: fe_sq(>z_50_10=t1,z_50_10=t1,>z_50_10=t1); */ -fe_sq(t1,t1); for (i = 1;i < 10;++i) fe_sq(t1,t1); - -/* qhasm: z_50_0 = z_50_10*z_10_0 */ -/* asm 1: fe_mul(>z_50_0=fe#1,z_50_0=t0,z_100_50=fe#2,z_100_50=fe#2,>z_100_50=fe#2); */ -/* asm 2: fe_sq(>z_100_50=t1,z_100_50=t1,>z_100_50=t1); */ -fe_sq(t1,t0); for (i = 1;i < 50;++i) fe_sq(t1,t1); - -/* qhasm: z_100_0 = z_100_50*z_50_0 */ -/* asm 1: fe_mul(>z_100_0=fe#2,z_100_0=t1,z_200_100=fe#3,z_200_100=fe#3,>z_200_100=fe#3); */ -/* asm 2: fe_sq(>z_200_100=t2,z_200_100=t2,>z_200_100=t2); */ -fe_sq(t2,t1); for (i = 1;i < 100;++i) fe_sq(t2,t2); - -/* qhasm: z_200_0 = z_200_100*z_100_0 */ -/* asm 1: fe_mul(>z_200_0=fe#2,z_200_0=t1,z_250_50=fe#2,z_250_50=fe#2,>z_250_50=fe#2); */ -/* asm 2: fe_sq(>z_250_50=t1,z_250_50=t1,>z_250_50=t1); */ -fe_sq(t1,t1); for (i = 1;i < 50;++i) fe_sq(t1,t1); - -/* qhasm: z_250_0 = z_250_50*z_50_0 */ -/* asm 1: fe_mul(>z_250_0=fe#1,z_250_0=t0,z_252_2=fe#1,z_252_2=fe#1,>z_252_2=fe#1); */ -/* asm 2: fe_sq(>z_252_2=t0,z_252_2=t0,>z_252_2=t0); */ -fe_sq(t0,t0); for (i = 1;i < 2;++i) fe_sq(t0,t0); - -/* qhasm: z_252_3 = z_252_2*z1 */ -/* asm 1: fe_mul(>z_252_3=fe#12,z_252_3=out,z1=fe#11: -return:nofallthrough:h=fe:asm/fe_mul(>h,h=fe:#k:asm/fe_sq(>h,h,>h);: - -: - -fe z1 -fe z2 -fe z8 -fe z9 -fe z11 -fe z22 -fe z_5_0 -fe z_10_5 -fe z_10_0 -fe z_20_10 -fe z_20_0 -fe z_40_20 -fe z_40_0 -fe z_50_10 -fe z_50_0 -fe z_100_50 -fe z_100_0 -fe z_200_100 -fe z_200_0 -fe z_250_50 -fe z_250_0 -fe z_252_2 -fe z_252_3 - -enter pow22523 - -z2 = z1^2^1 -z8 = z2^2^2 -z9 = z1*z8 -z11 = z2*z9 -z22 = z11^2^1 -z_5_0 = z9*z22 -z_10_5 = z_5_0^2^5 -z_10_0 = z_10_5*z_5_0 -z_20_10 = z_10_0^2^10 -z_20_0 = z_20_10*z_10_0 -z_40_20 = z_20_0^2^20 -z_40_0 = z_40_20*z_20_0 -z_50_10 = z_40_0^2^10 -z_50_0 = z_50_10*z_10_0 -z_100_50 = z_50_0^2^50 -z_100_0 = z_100_50*z_50_0 -z_200_100 = z_100_0^2^100 -z_200_0 = z_200_100*z_100_0 -z_250_50 = z_200_0^2^50 -z_250_0 = z_250_50*z_50_0 -z_252_2 = z_250_0^2^2 -z_252_3 = z_252_2*z1 - -return diff --git a/src/tor/src/ext/ed25519/ref10/pow225521.h b/src/tor/src/ext/ed25519/ref10/pow225521.h deleted file mode 100644 index fe2af94c0..000000000 --- a/src/tor/src/ext/ed25519/ref10/pow225521.h +++ /dev/null @@ -1,161 +0,0 @@ -/* Modified by Tor: pointless loops removed to appease analysis tools */ - -/* qhasm: fe z1 */ - -/* qhasm: fe z2 */ - -/* qhasm: fe z8 */ - -/* qhasm: fe z9 */ - -/* qhasm: fe z11 */ - -/* qhasm: fe z22 */ - -/* qhasm: fe z_5_0 */ - -/* qhasm: fe z_10_5 */ - -/* qhasm: fe z_10_0 */ - -/* qhasm: fe z_20_10 */ - -/* qhasm: fe z_20_0 */ - -/* qhasm: fe z_40_20 */ - -/* qhasm: fe z_40_0 */ - -/* qhasm: fe z_50_10 */ - -/* qhasm: fe z_50_0 */ - -/* qhasm: fe z_100_50 */ - -/* qhasm: fe z_100_0 */ - -/* qhasm: fe z_200_100 */ - -/* qhasm: fe z_200_0 */ - -/* qhasm: fe z_250_50 */ - -/* qhasm: fe z_250_0 */ - -/* qhasm: fe z_255_5 */ - -/* qhasm: fe z_255_21 */ - -/* qhasm: enter pow225521 */ - -/* qhasm: z2 = z1^2^1 */ -/* asm 1: fe_sq(>z2=fe#1,z2=fe#1,>z2=fe#1); */ -/* asm 2: fe_sq(>z2=t0,z2=t0,>z2=t0); */ -fe_sq(t0,z); /* DEADCODE This loop has no effect: for (i = 1;i < 1;++i) fe_sq(t0,t0); */ - -/* qhasm: z8 = z2^2^2 */ -/* asm 1: fe_sq(>z8=fe#2,z8=fe#2,>z8=fe#2); */ -/* asm 2: fe_sq(>z8=t1,z8=t1,>z8=t1); */ -fe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1); - -/* qhasm: z9 = z1*z8 */ -/* asm 1: fe_mul(>z9=fe#2,z9=t1,z11=fe#1,z11=t0,z22=fe#3,z22=fe#3,>z22=fe#3); */ -/* asm 2: fe_sq(>z22=t2,z22=t2,>z22=t2); */ -fe_sq(t2,t0); /* DEADCODE This loop has no effect for (i = 1;i < 1;++i) fe_sq(t2,t2); */ - -/* qhasm: z_5_0 = z9*z22 */ -/* asm 1: fe_mul(>z_5_0=fe#2,z_5_0=t1,z_10_5=fe#3,z_10_5=fe#3,>z_10_5=fe#3); */ -/* asm 2: fe_sq(>z_10_5=t2,z_10_5=t2,>z_10_5=t2); */ -fe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2); - -/* qhasm: z_10_0 = z_10_5*z_5_0 */ -/* asm 1: fe_mul(>z_10_0=fe#2,z_10_0=t1,z_20_10=fe#3,z_20_10=fe#3,>z_20_10=fe#3); */ -/* asm 2: fe_sq(>z_20_10=t2,z_20_10=t2,>z_20_10=t2); */ -fe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_20_0 = z_20_10*z_10_0 */ -/* asm 1: fe_mul(>z_20_0=fe#3,z_20_0=t2,z_40_20=fe#4,z_40_20=fe#4,>z_40_20=fe#4); */ -/* asm 2: fe_sq(>z_40_20=t3,z_40_20=t3,>z_40_20=t3); */ -fe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3); - -/* qhasm: z_40_0 = z_40_20*z_20_0 */ -/* asm 1: fe_mul(>z_40_0=fe#3,z_40_0=t2,z_50_10=fe#3,z_50_10=fe#3,>z_50_10=fe#3); */ -/* asm 2: fe_sq(>z_50_10=t2,z_50_10=t2,>z_50_10=t2); */ -fe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2); - -/* qhasm: z_50_0 = z_50_10*z_10_0 */ -/* asm 1: fe_mul(>z_50_0=fe#2,z_50_0=t1,z_100_50=fe#3,z_100_50=fe#3,>z_100_50=fe#3); */ -/* asm 2: fe_sq(>z_100_50=t2,z_100_50=t2,>z_100_50=t2); */ -fe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_100_0 = z_100_50*z_50_0 */ -/* asm 1: fe_mul(>z_100_0=fe#3,z_100_0=t2,z_200_100=fe#4,z_200_100=fe#4,>z_200_100=fe#4); */ -/* asm 2: fe_sq(>z_200_100=t3,z_200_100=t3,>z_200_100=t3); */ -fe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3); - -/* qhasm: z_200_0 = z_200_100*z_100_0 */ -/* asm 1: fe_mul(>z_200_0=fe#3,z_200_0=t2,z_250_50=fe#3,z_250_50=fe#3,>z_250_50=fe#3); */ -/* asm 2: fe_sq(>z_250_50=t2,z_250_50=t2,>z_250_50=t2); */ -fe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2); - -/* qhasm: z_250_0 = z_250_50*z_50_0 */ -/* asm 1: fe_mul(>z_250_0=fe#2,z_250_0=t1,z_255_5=fe#2,z_255_5=fe#2,>z_255_5=fe#2); */ -/* asm 2: fe_sq(>z_255_5=t1,z_255_5=t1,>z_255_5=t1); */ -fe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1); - -/* qhasm: z_255_21 = z_255_5*z11 */ -/* asm 1: fe_mul(>z_255_21=fe#12,z_255_21=out,z1=fe#11: -return:nofallthrough:h=fe:asm/fe_mul(>h,h=fe:#k:asm/fe_sq(>h,h,>h);: - -: - -fe z1 -fe z2 -fe z8 -fe z9 -fe z11 -fe z22 -fe z_5_0 -fe z_10_5 -fe z_10_0 -fe z_20_10 -fe z_20_0 -fe z_40_20 -fe z_40_0 -fe z_50_10 -fe z_50_0 -fe z_100_50 -fe z_100_0 -fe z_200_100 -fe z_200_0 -fe z_250_50 -fe z_250_0 -fe z_255_5 -fe z_255_21 - -enter pow225521 - -z2 = z1^2^1 -z8 = z2^2^2 -z9 = z1*z8 -z11 = z2*z9 -z22 = z11^2^1 -z_5_0 = z9*z22 -z_10_5 = z_5_0^2^5 -z_10_0 = z_10_5*z_5_0 -z_20_10 = z_10_0^2^10 -z_20_0 = z_20_10*z_10_0 -z_40_20 = z_20_0^2^20 -z_40_0 = z_40_20*z_20_0 -z_50_10 = z_40_0^2^10 -z_50_0 = z_50_10*z_10_0 -z_100_50 = z_50_0^2^50 -z_100_0 = z_100_50*z_50_0 -z_200_100 = z_100_0^2^100 -z_200_0 = z_200_100*z_100_0 -z_250_50 = z_200_0^2^50 -z_250_0 = z_250_50*z_50_0 -z_255_5 = z_250_0^2^5 -z_255_21 = z_255_5*z11 - -return diff --git a/src/tor/src/ext/ed25519/ref10/q2h.sh b/src/tor/src/ext/ed25519/ref10/q2h.sh deleted file mode 100644 index 47ec5110e..000000000 --- a/src/tor/src/ext/ed25519/ref10/q2h.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -sed 's/^#.*//' \ -| qhasm-generic \ -| sed 's_//\(.*\)$_/*\1 */_' diff --git a/src/tor/src/ext/ed25519/ref10/randombytes.h b/src/tor/src/ext/ed25519/ref10/randombytes.h deleted file mode 100644 index 8bf31631f..000000000 --- a/src/tor/src/ext/ed25519/ref10/randombytes.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Added for Tor. */ -#include "crypto.h" -#define randombytes(b, n) \ - (crypto_strongest_rand((b), (n)), 0) diff --git a/src/tor/src/ext/ed25519/ref10/sc.h b/src/tor/src/ext/ed25519/ref10/sc.h deleted file mode 100644 index d32ed2e8c..000000000 --- a/src/tor/src/ext/ed25519/ref10/sc.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SC_H -#define SC_H - -/* -The set of scalars is \Z/l -where l = 2^252 + 27742317777372353535851937790883648493. -*/ - -#define sc_reduce crypto_sign_ed25519_ref10_sc_reduce -#define sc_muladd crypto_sign_ed25519_ref10_sc_muladd - -extern void sc_reduce(unsigned char *); -extern void sc_muladd(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); - -#endif diff --git a/src/tor/src/ext/ed25519/ref10/sc_muladd.c b/src/tor/src/ext/ed25519/ref10/sc_muladd.c deleted file mode 100644 index 20b94c104..000000000 --- a/src/tor/src/ext/ed25519/ref10/sc_muladd.c +++ /dev/null @@ -1,368 +0,0 @@ -#include "sc.h" -#include "crypto_int64.h" -#include "crypto_uint32.h" -#include "crypto_uint64.h" - -static crypto_uint64 load_3(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - return result; -} - -static crypto_uint64 load_4(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - result |= ((crypto_uint64) in[3]) << 24; - return result; -} - -/* -Input: - a[0]+256*a[1]+...+256^31*a[31] = a - b[0]+256*b[1]+...+256^31*b[31] = b - c[0]+256*c[1]+...+256^31*c[31] = c - -Output: - s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l - where l = 2^252 + 27742317777372353535851937790883648493. -*/ - -void sc_muladd(unsigned char *s,const unsigned char *a,const unsigned char *b,const unsigned char *c) -{ - crypto_int64 a0 = 2097151 & load_3(a); - crypto_int64 a1 = 2097151 & (load_4(a + 2) >> 5); - crypto_int64 a2 = 2097151 & (load_3(a + 5) >> 2); - crypto_int64 a3 = 2097151 & (load_4(a + 7) >> 7); - crypto_int64 a4 = 2097151 & (load_4(a + 10) >> 4); - crypto_int64 a5 = 2097151 & (load_3(a + 13) >> 1); - crypto_int64 a6 = 2097151 & (load_4(a + 15) >> 6); - crypto_int64 a7 = 2097151 & (load_3(a + 18) >> 3); - crypto_int64 a8 = 2097151 & load_3(a + 21); - crypto_int64 a9 = 2097151 & (load_4(a + 23) >> 5); - crypto_int64 a10 = 2097151 & (load_3(a + 26) >> 2); - crypto_int64 a11 = (load_4(a + 28) >> 7); - crypto_int64 b0 = 2097151 & load_3(b); - crypto_int64 b1 = 2097151 & (load_4(b + 2) >> 5); - crypto_int64 b2 = 2097151 & (load_3(b + 5) >> 2); - crypto_int64 b3 = 2097151 & (load_4(b + 7) >> 7); - crypto_int64 b4 = 2097151 & (load_4(b + 10) >> 4); - crypto_int64 b5 = 2097151 & (load_3(b + 13) >> 1); - crypto_int64 b6 = 2097151 & (load_4(b + 15) >> 6); - crypto_int64 b7 = 2097151 & (load_3(b + 18) >> 3); - crypto_int64 b8 = 2097151 & load_3(b + 21); - crypto_int64 b9 = 2097151 & (load_4(b + 23) >> 5); - crypto_int64 b10 = 2097151 & (load_3(b + 26) >> 2); - crypto_int64 b11 = (load_4(b + 28) >> 7); - crypto_int64 c0 = 2097151 & load_3(c); - crypto_int64 c1 = 2097151 & (load_4(c + 2) >> 5); - crypto_int64 c2 = 2097151 & (load_3(c + 5) >> 2); - crypto_int64 c3 = 2097151 & (load_4(c + 7) >> 7); - crypto_int64 c4 = 2097151 & (load_4(c + 10) >> 4); - crypto_int64 c5 = 2097151 & (load_3(c + 13) >> 1); - crypto_int64 c6 = 2097151 & (load_4(c + 15) >> 6); - crypto_int64 c7 = 2097151 & (load_3(c + 18) >> 3); - crypto_int64 c8 = 2097151 & load_3(c + 21); - crypto_int64 c9 = 2097151 & (load_4(c + 23) >> 5); - crypto_int64 c10 = 2097151 & (load_3(c + 26) >> 2); - crypto_int64 c11 = (load_4(c + 28) >> 7); - crypto_int64 s0; - crypto_int64 s1; - crypto_int64 s2; - crypto_int64 s3; - crypto_int64 s4; - crypto_int64 s5; - crypto_int64 s6; - crypto_int64 s7; - crypto_int64 s8; - crypto_int64 s9; - crypto_int64 s10; - crypto_int64 s11; - crypto_int64 s12; - crypto_int64 s13; - crypto_int64 s14; - crypto_int64 s15; - crypto_int64 s16; - crypto_int64 s17; - crypto_int64 s18; - crypto_int64 s19; - crypto_int64 s20; - crypto_int64 s21; - crypto_int64 s22; - crypto_int64 s23; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; - crypto_int64 carry17; - crypto_int64 carry18; - crypto_int64 carry19; - crypto_int64 carry20; - crypto_int64 carry21; - crypto_int64 carry22; - - s0 = c0 + a0*b0; - s1 = c1 + a0*b1 + a1*b0; - s2 = c2 + a0*b2 + a1*b1 + a2*b0; - s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0; - s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0; - s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0; - s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0; - s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0; - s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0; - s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0; - s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0; - s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0; - s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1; - s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2; - s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3; - s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4; - s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5; - s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6; - s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7; - s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8; - s20 = a9*b11 + a10*b10 + a11*b9; - s21 = a10*b11 + a11*b10; - s22 = a11*b11; - s23 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); - carry18 = (s18 + (1<<20)) >> 21; s19 += carry18; s18 -= SHL64(carry18,21); - carry20 = (s20 + (1<<20)) >> 21; s21 += carry20; s20 -= SHL64(carry20,21); - carry22 = (s22 + (1<<20)) >> 21; s23 += carry22; s22 -= SHL64(carry22,21); - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); - carry17 = (s17 + (1<<20)) >> 21; s18 += carry17; s17 -= SHL64(carry17,21); - carry19 = (s19 + (1<<20)) >> 21; s20 += carry19; s19 -= SHL64(carry19,21); - carry21 = (s21 + (1<<20)) >> 21; s22 += carry21; s21 -= SHL64(carry21,21); - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); - - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - carry11 = s11 >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | SHL64(s1,5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | SHL64(s2,2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | SHL64(s3,7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | SHL64(s4,4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | SHL64(s5,1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | SHL64(s6,6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | SHL64(s7,3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | SHL64(s9,5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | SHL64(s10,2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | SHL64(s11,7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} diff --git a/src/tor/src/ext/ed25519/ref10/sc_reduce.c b/src/tor/src/ext/ed25519/ref10/sc_reduce.c deleted file mode 100644 index c5afa5374..000000000 --- a/src/tor/src/ext/ed25519/ref10/sc_reduce.c +++ /dev/null @@ -1,275 +0,0 @@ -#include "sc.h" -#include "crypto_int64.h" -#include "crypto_uint32.h" -#include "crypto_uint64.h" - -static crypto_uint64 load_3(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - return result; -} - -static crypto_uint64 load_4(const unsigned char *in) -{ - crypto_uint64 result; - result = (crypto_uint64) in[0]; - result |= ((crypto_uint64) in[1]) << 8; - result |= ((crypto_uint64) in[2]) << 16; - result |= ((crypto_uint64) in[3]) << 24; - return result; -} - -/* -Input: - s[0]+256*s[1]+...+256^63*s[63] = s - -Output: - s[0]+256*s[1]+...+256^31*s[31] = s mod l - where l = 2^252 + 27742317777372353535851937790883648493. - Overwrites s in place. -*/ - -void sc_reduce(unsigned char *s) -{ - crypto_int64 s0 = 2097151 & load_3(s); - crypto_int64 s1 = 2097151 & (load_4(s + 2) >> 5); - crypto_int64 s2 = 2097151 & (load_3(s + 5) >> 2); - crypto_int64 s3 = 2097151 & (load_4(s + 7) >> 7); - crypto_int64 s4 = 2097151 & (load_4(s + 10) >> 4); - crypto_int64 s5 = 2097151 & (load_3(s + 13) >> 1); - crypto_int64 s6 = 2097151 & (load_4(s + 15) >> 6); - crypto_int64 s7 = 2097151 & (load_3(s + 18) >> 3); - crypto_int64 s8 = 2097151 & load_3(s + 21); - crypto_int64 s9 = 2097151 & (load_4(s + 23) >> 5); - crypto_int64 s10 = 2097151 & (load_3(s + 26) >> 2); - crypto_int64 s11 = 2097151 & (load_4(s + 28) >> 7); - crypto_int64 s12 = 2097151 & (load_4(s + 31) >> 4); - crypto_int64 s13 = 2097151 & (load_3(s + 34) >> 1); - crypto_int64 s14 = 2097151 & (load_4(s + 36) >> 6); - crypto_int64 s15 = 2097151 & (load_3(s + 39) >> 3); - crypto_int64 s16 = 2097151 & load_3(s + 42); - crypto_int64 s17 = 2097151 & (load_4(s + 44) >> 5); - crypto_int64 s18 = 2097151 & (load_3(s + 47) >> 2); - crypto_int64 s19 = 2097151 & (load_4(s + 49) >> 7); - crypto_int64 s20 = 2097151 & (load_4(s + 52) >> 4); - crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1); - crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6); - crypto_int64 s23 = (load_4(s + 60) >> 3); - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= SHL64(carry12,21); - carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= SHL64(carry14,21); - carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= SHL64(carry16,21); - - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= SHL64(carry13,21); - carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= SHL64(carry15,21); - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - - carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - carry11 = s11 >> 21; s12 += carry11; s11 -= SHL64(carry11,21); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; s1 += carry0; s0 -= SHL64(carry0,21); - carry1 = s1 >> 21; s2 += carry1; s1 -= SHL64(carry1,21); - carry2 = s2 >> 21; s3 += carry2; s2 -= SHL64(carry2,21); - carry3 = s3 >> 21; s4 += carry3; s3 -= SHL64(carry3,21); - carry4 = s4 >> 21; s5 += carry4; s4 -= SHL64(carry4,21); - carry5 = s5 >> 21; s6 += carry5; s5 -= SHL64(carry5,21); - carry6 = s6 >> 21; s7 += carry6; s6 -= SHL64(carry6,21); - carry7 = s7 >> 21; s8 += carry7; s7 -= SHL64(carry7,21); - carry8 = s8 >> 21; s9 += carry8; s8 -= SHL64(carry8,21); - carry9 = s9 >> 21; s10 += carry9; s9 -= SHL64(carry9,21); - carry10 = s10 >> 21; s11 += carry10; s10 -= SHL64(carry10,21); - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | SHL64(s1,5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | SHL64(s2,2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | SHL64(s3,7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | SHL64(s4,4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | SHL64(s5,1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | SHL64(s6,6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | SHL64(s7,3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | SHL64(s9,5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | SHL64(s10,2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | SHL64(s11,7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} diff --git a/src/tor/src/ext/ed25519/ref10/sign.c b/src/tor/src/ext/ed25519/ref10/sign.c deleted file mode 100644 index 1190a0fc9..000000000 --- a/src/tor/src/ext/ed25519/ref10/sign.c +++ /dev/null @@ -1,29 +0,0 @@ -/* (Modified by Tor to generate detached signatures.) */ -#include -#include "crypto_sign.h" -#include "crypto_hash_sha512.h" -#include "ge.h" -#include "sc.h" - -int crypto_sign( - unsigned char *sig, - const unsigned char *m, size_t mlen, - const unsigned char *sk,const unsigned char *pk -) -{ - unsigned char nonce[64]; - unsigned char hram[64]; - ge_p3 R; - - crypto_hash_sha512_2(nonce, sk+32, 32, m, mlen); - - sc_reduce(nonce); - ge_scalarmult_base(&R,nonce); - ge_p3_tobytes(sig,&R); - - crypto_hash_sha512_3(hram, sig, 32, pk, 32, m, mlen); - sc_reduce(hram); - sc_muladd(sig + 32,hram,sk,nonce); - - return 0; -} diff --git a/src/tor/src/ext/ed25519/ref10/sqrtm1.h b/src/tor/src/ext/ed25519/ref10/sqrtm1.h deleted file mode 100644 index d8caa23b6..000000000 --- a/src/tor/src/ext/ed25519/ref10/sqrtm1.h +++ /dev/null @@ -1 +0,0 @@ --32595792,-7943725,9377950,3500415,12389472,-272473,-25146209,-2005654,326686,11406482 diff --git a/src/tor/src/ext/ed25519/ref10/sqrtm1.py b/src/tor/src/ext/ed25519/ref10/sqrtm1.py deleted file mode 100644 index 9a47fbc12..000000000 --- a/src/tor/src/ext/ed25519/ref10/sqrtm1.py +++ /dev/null @@ -1,28 +0,0 @@ -q = 2**255 - 19 - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -def radix255(x): - x = x % q - if x + x > q: x -= q - x = [x,0,0,0,0,0,0,0,0,0] - bits = [26,25,26,25,26,25,26,25,26,25] - for i in range(9): - carry = (x[i] + 2**(bits[i]-1)) / 2**bits[i] - x[i] -= carry * 2**bits[i] - x[i + 1] += carry - result = "" - for i in range(9): - result = result+str(x[i])+"," - result = result+str(x[9]) - return result - -I = expmod(2,(q-1)/4,q) -print radix255(I) diff --git a/src/tor/src/ext/include.am b/src/tor/src/ext/include.am deleted file mode 100644 index 7ec2e4331..000000000 --- a/src/tor/src/ext/include.am +++ /dev/null @@ -1,176 +0,0 @@ - -AM_CPPFLAGS += -I$(srcdir)/src/ext -Isrc/ext - -EXTRA_DIST += src/ext/README - -EXTHEADERS = \ - src/ext/ht.h \ - src/ext/byteorder.h \ - src/ext/tinytest.h \ - src/ext/tor_readpassphrase.h \ - src/ext/strlcat.c \ - src/ext/strlcpy.c \ - src/ext/tinytest_macros.h \ - src/ext/tor_queue.h \ - src/ext/siphash.h \ - src/ext/timeouts/timeout.h \ - src/ext/timeouts/timeout-debug.h \ - src/ext/timeouts/timeout-bitops.c \ - src/ext/timeouts/timeout.c - -noinst_HEADERS+= $(EXTHEADERS) - -src_ext_ed25519_ref10_libed25519_ref10_a_CFLAGS=\ - @CFLAGS_CONSTTIME@ - -src_ext_ed25519_ref10_libed25519_ref10_a_SOURCES= \ - src/ext/ed25519/ref10/fe_0.c \ - src/ext/ed25519/ref10/fe_1.c \ - src/ext/ed25519/ref10/fe_add.c \ - src/ext/ed25519/ref10/fe_cmov.c \ - src/ext/ed25519/ref10/fe_copy.c \ - src/ext/ed25519/ref10/fe_frombytes.c \ - src/ext/ed25519/ref10/fe_invert.c \ - src/ext/ed25519/ref10/fe_isnegative.c \ - src/ext/ed25519/ref10/fe_isnonzero.c \ - src/ext/ed25519/ref10/fe_mul.c \ - src/ext/ed25519/ref10/fe_neg.c \ - src/ext/ed25519/ref10/fe_pow22523.c \ - src/ext/ed25519/ref10/fe_sq.c \ - src/ext/ed25519/ref10/fe_sq2.c \ - src/ext/ed25519/ref10/fe_sub.c \ - src/ext/ed25519/ref10/fe_tobytes.c \ - src/ext/ed25519/ref10/ge_add.c \ - src/ext/ed25519/ref10/ge_double_scalarmult.c \ - src/ext/ed25519/ref10/ge_frombytes.c \ - src/ext/ed25519/ref10/ge_madd.c \ - src/ext/ed25519/ref10/ge_msub.c \ - src/ext/ed25519/ref10/ge_p1p1_to_p2.c \ - src/ext/ed25519/ref10/ge_p1p1_to_p3.c \ - src/ext/ed25519/ref10/ge_p2_0.c \ - src/ext/ed25519/ref10/ge_p2_dbl.c \ - src/ext/ed25519/ref10/ge_p3_0.c \ - src/ext/ed25519/ref10/ge_p3_dbl.c \ - src/ext/ed25519/ref10/ge_p3_to_cached.c \ - src/ext/ed25519/ref10/ge_p3_to_p2.c \ - src/ext/ed25519/ref10/ge_p3_tobytes.c \ - src/ext/ed25519/ref10/ge_precomp_0.c \ - src/ext/ed25519/ref10/ge_scalarmult_base.c \ - src/ext/ed25519/ref10/ge_sub.c \ - src/ext/ed25519/ref10/ge_tobytes.c \ - src/ext/ed25519/ref10/keypair.c \ - src/ext/ed25519/ref10/open.c \ - src/ext/ed25519/ref10/sc_muladd.c \ - src/ext/ed25519/ref10/sc_reduce.c \ - src/ext/ed25519/ref10/sign.c \ - src/ext/ed25519/ref10/keyconv.c \ - src/ext/ed25519/ref10/blinding.c - -ED25519_REF10_HDRS = \ - src/ext/ed25519/ref10/api.h \ - src/ext/ed25519/ref10/base.h \ - src/ext/ed25519/ref10/base2.h \ - src/ext/ed25519/ref10/crypto_hash_sha512.h \ - src/ext/ed25519/ref10/crypto_int32.h \ - src/ext/ed25519/ref10/crypto_int64.h \ - src/ext/ed25519/ref10/crypto_sign.h \ - src/ext/ed25519/ref10/crypto_uint32.h \ - src/ext/ed25519/ref10/crypto_uint64.h \ - src/ext/ed25519/ref10/crypto_verify_32.h \ - src/ext/ed25519/ref10/d.h \ - src/ext/ed25519/ref10/d2.h \ - src/ext/ed25519/ref10/ed25519_ref10.h \ - src/ext/ed25519/ref10/fe.h \ - src/ext/ed25519/ref10/ge.h \ - src/ext/ed25519/ref10/ge_add.h \ - src/ext/ed25519/ref10/ge_madd.h \ - src/ext/ed25519/ref10/ge_msub.h \ - src/ext/ed25519/ref10/ge_p2_dbl.h \ - src/ext/ed25519/ref10/ge_sub.h \ - src/ext/ed25519/ref10/pow22523.h \ - src/ext/ed25519/ref10/pow225521.h \ - src/ext/ed25519/ref10/randombytes.h \ - src/ext/ed25519/ref10/sc.h \ - src/ext/ed25519/ref10/sqrtm1.h - -noinst_HEADERS += $(ED25519_REF10_HDRS) - -LIBED25519_REF10=src/ext/ed25519/ref10/libed25519_ref10.a -noinst_LIBRARIES += $(LIBED25519_REF10) - -src_ext_ed25519_donna_libed25519_donna_a_CFLAGS=\ - @CFLAGS_CONSTTIME@ \ - -DED25519_CUSTOMRANDOM \ - -DED25519_CUSTOMHASH \ - -DED25519_SUFFIX=_donna - -src_ext_ed25519_donna_libed25519_donna_a_SOURCES= \ - src/ext/ed25519/donna/ed25519_tor.c - -ED25519_DONNA_HDRS = \ - src/ext/ed25519/donna/curve25519-donna-32bit.h \ - src/ext/ed25519/donna/curve25519-donna-64bit.h \ - src/ext/ed25519/donna/curve25519-donna-helpers.h \ - src/ext/ed25519/donna/curve25519-donna-sse2.h \ - src/ext/ed25519/donna/ed25519-donna-32bit-sse2.h \ - src/ext/ed25519/donna/ed25519-donna-32bit-tables.h \ - src/ext/ed25519/donna/ed25519-donna-64bit-sse2.h \ - src/ext/ed25519/donna/ed25519-donna-64bit-tables.h \ - src/ext/ed25519/donna/ed25519-donna-64bit-x86-32bit.h \ - src/ext/ed25519/donna/ed25519-donna-64bit-x86.h \ - src/ext/ed25519/donna/ed25519-donna-basepoint-table.h \ - src/ext/ed25519/donna/ed25519-donna-batchverify.h \ - src/ext/ed25519/donna/ed25519-donna.h \ - src/ext/ed25519/donna/ed25519-donna-impl-base.h \ - src/ext/ed25519/donna/ed25519-donna-impl-sse2.h \ - src/ext/ed25519/donna/ed25519-donna-portable.h \ - src/ext/ed25519/donna/ed25519-donna-portable-identify.h \ - src/ext/ed25519/donna/ed25519_donna_tor.h \ - src/ext/ed25519/donna/ed25519.h \ - src/ext/ed25519/donna/ed25519-hash-custom.h \ - src/ext/ed25519/donna/ed25519-hash.h \ - src/ext/ed25519/donna/ed25519-randombytes-custom.h \ - src/ext/ed25519/donna/ed25519-randombytes.h \ - src/ext/ed25519/donna/modm-donna-32bit.h \ - src/ext/ed25519/donna/modm-donna-64bit.h \ - src/ext/ed25519/donna/regression.h \ - src/ext/ed25519/donna/test-ticks.h \ - src/ext/ed25519/donna/test-internals.c - -noinst_HEADERS += $(ED25519_DONNA_HDRS) - -LIBED25519_DONNA=src/ext/ed25519/donna/libed25519_donna.a -noinst_LIBRARIES += $(LIBED25519_DONNA) - -src_ext_keccak_tiny_libkeccak_tiny_a_CFLAGS=\ - @CFLAGS_CONSTTIME@ - -src_ext_keccak_tiny_libkeccak_tiny_a_SOURCES= \ - src/ext/keccak-tiny/keccak-tiny-unrolled.c - -LIBKECCAK_TINY_HDRS = \ - src/ext/keccak-tiny/keccak-tiny.h - -noinst_HEADERS += $(LIBKECCAK_TINY_HDRS) - -LIBKECCAK_TINY=src/ext/keccak-tiny/libkeccak-tiny.a -noinst_LIBRARIES += $(LIBKECCAK_TINY) - -EXTRA_DIST += \ - src/ext/timeouts/bench/bench-add.lua \ - src/ext/timeouts/bench/bench-aux.lua \ - src/ext/timeouts/bench/bench.c \ - src/ext/timeouts/bench/bench-del.lua \ - src/ext/timeouts/bench/bench-expire.lua \ - src/ext/timeouts/bench/bench.h \ - src/ext/timeouts/bench/bench-heap.c \ - src/ext/timeouts/bench/bench-llrb.c \ - src/ext/timeouts/bench/bench.plt \ - src/ext/timeouts/bench/bench-wheel.c \ - src/ext/timeouts/bench/Rules.mk \ - src/ext/timeouts/lua/Rules.mk \ - src/ext/timeouts/lua/timeout-lua.c \ - src/ext/timeouts/Makefile \ - src/ext/timeouts/Rules.shrc \ - src/ext/timeouts/test-timeout.c - diff --git a/src/tor/src/ext/keccak-tiny/README.markdown b/src/tor/src/ext/keccak-tiny/README.markdown deleted file mode 100644 index 784d6f6bd..000000000 --- a/src/tor/src/ext/keccak-tiny/README.markdown +++ /dev/null @@ -1,82 +0,0 @@ -# libkeccak-tiny - -An implementation of the FIPS-202-defined SHA-3 and SHAKE functions -in 120 cloc (156 lines). One C file, one header. - -The `Keccak-f[1600]` permutation is fully unrolled; it's nearly as fast -as the Keccak team's optimized permutation. - -## Building - - > clang -O3 -march=native -std=c11 -Wextra -dynamic -shared keccak-tiny.c -o libkeccak-tiny.dylib - -If you don't have a modern libc that includes the `memset_s` function, -you can just add `-D"memset_s(W,WL,V,OL)=memset(W,V,OL)` to the command -line. - -## Using - -Build the library, include the header, and do, e.g., - - shake256(out, 256, in, inlen); - -That's it. - -(Note: You can request less output from the fixed-output-length -functions, but not more.) - -## TweetShake - -The relevant tweets: - -```C -// @hashbreaker Inspired by TweetNaCl! -// Keccak and SHA-3 are supposedly hard to implement. So, how many tweets does it take to get to the center of a sponge...? -#define decshake(bits) int shake##bits(unsigned char* o, unsigned long, unsigned char*, unsigned long); /*begin keccak.h*/ -#define decsha3(bits) int sha3_##bits(unsigned char*,unsigned long,unsigned char*,unsigned long); -decshake(128) decshake(256) decsha3(224) decsha3(256) decsha3(384) decsha3(512) /*end keccak.h*/ -#define K static const /* Keccak constants: rho rotations, pi lanes, and iota RCs */ /*begin keccak.c*/ -typedef unsigned char byte;typedef byte*bytes;typedef unsigned long z;typedef unsigned long long u8;K u8 V=1ULL<<63;K u8 W=1ULL<<31;/*!gcc*/ -#define V (1ULL<<63) -#define W (1ULL<31) -K byte rho[24]={1,3,6,10,15,21,28,36,45,55,2,14,27,41,56,8,25,43,62,18,39,61,20,44};K u8 RC[24]={1,0x8082,V|0x808a,V|W|0x8000,0x808b,W|1,V|W -|0x8081,V|0x8009,138,136,W|0x8009,W|10,W|0x808b,V|0x8b,V|0x8089,V|0x8003,V|0x8002,V|0x80,0x800a,V|W|0xa,V|W|0x8081,V|0x8080,W|1,V|W|0x8008}; -K byte pi[25]={10,7,11,17,18,3,5,16,8,21,24,4,15,23,19,13,12,2,20,14,22,9,6,1}; /**helpers:*/static inline z min(z a,z b){return (a> (64-s))) /**macros to fully unroll the Keccak-f[1600] permutation:*/ -#define R24(e) /* repeat 24 times */ e e e e e e e e e e e e e e e e e e e e e e e e -#define L5(v,s,e) /* 5-unroll a loop */ v=0; e; v+=s; e; v+=s; e; v+=s; e; v+=s; e; v+=s; /**the permutation:*/ -static inline void keccakf(u8* a){u8 b[5]={0};u8 t=0;byte x,y,i=0; /*24 rounds:*/R24( L5(x,1,b[x]=0;L5(y,5, /*parity*/ b[x] ^= a[x+y])) -L5(x,1,L5(y,5,/*theta*/a[y+x] ^= b[(x+4)%5] ^ ROL(b[(x+1)%5],1))) t=a[1];x=0;R24(b[0]=a[pi[x]];/*rho*/a[pi[x]]=ROL(t, rho[x]);t=b[0];x++;) -L5(y,5,L5(x,1, /*chi*/ b[x] = a[y+x]) L5(x,1, a[y+x] = b[x] ^ ~b[(x+1)%5] & b[(x+2)%5])) /*iota*/ a[0] ^= RC[i]; i++; )} /**keccak-f!**/ -#define FOR(i, ST, L, S) /*obvious*/ do { for (z i = 0; i < L; i += ST) { S; } } while (0) /**now, the sponge construction in hash mode**/ -#define appl(NAME, S) /*macro to define array comprehensions*/ static inline void NAME(bytes dst, bytes src, z len) { FOR(i, 1, len, S); } -/*helpers:*/ static inline void clear(bytes a) { FOR(i,1,200,a[i]=0); } appl(xorin, dst[i] ^= src[i]) appl(set, src[i] = dst[i]) -#define foldP(I, L, F) /* macro to fold app P F */ while (L >= r) { /*apply F*/ F(a, I, r); /*permute*/ keccakf(A); I += r; L -= r; } -static inline int hash(bytes o,z olen,bytes in,z ilen,z r,byte D){ if((o == (void*)0)||((in == (void*)0)&&ilen != 0)||(r >= 200))return -1; -/*absorb*/u8 A[25]={0};bytes a=(bytes)A;/*full blocks*/foldP(in,ilen,xorin);/*last block*/xorin(a,in,ilen);/**ds+padstart*/a[ilen]^=D; -/*padend:*/a[r-1]^=0x80; /**permute**/keccakf(A); /**squeeze:**/foldP(o,olen,set);/*last bytes*/set(a,o,olen);/*done!*/clear(a);return 0;} -#define defshake(bits) int shake##bits(bytes o, z olen, bytes in, z ilen) {return hash(o,olen,in,ilen,200-(bits/4),0x1f);} -#define defsha3(bits) int sha3_##bits(bytes o,z olen,bytes in,z ilen) {return hash(o,min(olen,200-(bits/4)),in,ilen,200-(bits/4),0x06);} -/*define the SHA3 and SHAKE instances:*/defshake(128) defshake(256) defsha3(224) defsha3(256) defsha3(384) defsha3(512)/*end keccak.c*/ -// ...chomp. 24 kinda legible tweets (3232 bytes). And a simple interface: shake256(digest, digestlen, in, inlen) -// Clang recommended. GCC users will need to insert "#define V (1ULL<<63)" and "#define W (1ULL<31)" at the point marked "/*!gcc*/" -// If you're using as a prefix MAC, you MUST replace the body of "clear" with "memset_s(a, 200, 0, 200)" to avoid misoptimization. -// @everyone_who_is_still_using_sha1 Please stop using SHA-1. -// Oh, one more thing: a C11-threaded, memmapped shake256sum in 10 tweets. (Your libc may need a shim for C11 thread support.) -// echo -n string stdio stdint fcntl sys/mman sys/stat sys/types unistd threads|tr ' ' \\n|xargs -n1 -I_ echo '#include <_.h>' -#include "kcksum_tweet.h" -#define E(LABEL, MSG) if (err != 0) { strerror_r(err, serr, 1024); fprintf(stderr, "%s: '%s' %s\n", serr, fn, MSG); goto LABEL;} -static mtx_t iomtx;void h(void* v);void h(void* v){char* fn=(char*)v;int err=0;char serr[1024]={0};/*open file*/int fd=open(fn, O_RDONLY); -err=!fd;E(ret,"couldn't be opened.");/*stat it*/struct stat stat;err=fstat(fd,&stat);E(close,"doesn't exist.");err=!!(stat.st_mode&S_IFDIR); -E(close,"not a regular file.");z length=(size_t)stat.st_size;/*mmap the file*/bytes in=length?mmap(0,length,PROT_READ,MAP_SHARED,fd,0):NULL; -if(length&&(in==MAP_FAILED)){E(close,"mmap-ing failed.");}byte out[64]={0};/*hash it*/shake256(out,64,in,length);length&&munmap(in,length); -/*lock io*/mtx_lock(&iomtx);printf("SHAKE256('%s') = ", fn);FOR(i,1,64,printf("%02x",out[i]));printf("\n");mtx_unlock(&iomtx);/*unlock io*/ -close:close(fd);ret:thrd_exit(err);}int main(int argc,char** argv){int err=0; mtx_init(&iomtx, mtx_plain); thrd_t t[4]; int res[4],i,j,k; -for(i=1;i -#include "crypto.h" -#include "byteorder.h" - -/******** Endianness conversion helpers ********/ - -static inline uint64_t -loadu64le(const unsigned char *x) { - uint64_t r; - memcpy(&r, x, sizeof(r)); - return _le64toh(r); -} - -static inline void -storeu64le(uint8_t *x, uint64_t u) { - uint64_t val = _le64toh(u); - memcpy(x, &val, sizeof(u)); -} - -/******** The Keccak-f[1600] permutation ********/ - -/*** Constants. ***/ -static const uint8_t rho[24] = \ - { 1, 3, 6, 10, 15, 21, - 28, 36, 45, 55, 2, 14, - 27, 41, 56, 8, 25, 43, - 62, 18, 39, 61, 20, 44}; -static const uint8_t pi[24] = \ - {10, 7, 11, 17, 18, 3, - 5, 16, 8, 21, 24, 4, - 15, 23, 19, 13, 12, 2, - 20, 14, 22, 9, 6, 1}; -static const uint64_t RC[24] = \ - {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, - 0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, - 0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, - 0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, - 0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, - 0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; - -/*** Helper macros to unroll the permutation. ***/ -#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) -#define REPEAT6(e) e e e e e e -#define REPEAT24(e) REPEAT6(e e e e) -#define REPEAT5(e) e e e e e -#define FOR5(v, s, e) \ - v = 0; \ - REPEAT5(e; v += s;) - -/*** Keccak-f[1600] ***/ -static inline void keccakf(void* state) { - uint64_t* a = (uint64_t*)state; - uint64_t b[5] = {0}; - uint64_t t = 0; - uint8_t x, y, i = 0; - - REPEAT24( - // Theta - FOR5(x, 1, - b[x] = 0; - FOR5(y, 5, - b[x] ^= a[x + y]; )) - FOR5(x, 1, - FOR5(y, 5, - a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) - // Rho and pi - t = a[1]; - x = 0; - REPEAT24(b[0] = a[pi[x]]; - a[pi[x]] = rol(t, rho[x]); - t = b[0]; - x++; ) - // Chi - FOR5(y, - 5, - FOR5(x, 1, - b[x] = a[y + x];) - FOR5(x, 1, - a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) - // Iota - a[0] ^= RC[i]; - i++; ) -} - -/******** The FIPS202-defined functions. ********/ - -/*** Some helper macros. ***/ - -// `xorin` modified to handle Big Endian systems, `buf` being unaligned on -// systems that care about such things. Assumes that len is a multiple of 8, -// which is always true for the rates we use, and the modified finalize. -static inline void -xorin8(uint8_t *dst, const uint8_t *src, size_t len) { - uint64_t* a = (uint64_t*)dst; // Always aligned. - for (size_t i = 0; i < len; i += 8) { - a[i/8] ^= loadu64le(src + i); - } -} - -// `setout` likewise modified to handle Big Endian systems. Assumes that len -// is a multiple of 8, which is true for every rate we use. -static inline void -setout8(const uint8_t *src, uint8_t *dst, size_t len) { - const uint64_t *si = (const uint64_t*)src; // Always aligned. - for (size_t i = 0; i < len; i+= 8) { - storeu64le(dst+i, si[i/8]); - } -} - -#define P keccakf -#define Plen KECCAK_MAX_RATE - -#define KECCAK_DELIM_DIGEST 0x06 -#define KECCAK_DELIM_XOF 0x1f - -// Fold P*F over the full blocks of an input. -#define foldP(I, L, F) \ - while (L >= s->rate) { \ - F(s->a, I, s->rate); \ - P(s->a); \ - I += s->rate; \ - L -= s->rate; \ - } - -static inline void -keccak_absorb_blocks(keccak_state *s, const uint8_t *buf, size_t nr_blocks) -{ - size_t blen = nr_blocks * s->rate; - foldP(buf, blen, xorin8); -} - -static int -keccak_update(keccak_state *s, const uint8_t *buf, size_t len) -{ - if (s->finalized) - return -1; - if ((buf == NULL) && len != 0) - return -1; - - size_t remaining = len; - while (remaining > 0) { - if (s->offset == 0) { - const size_t blocks = remaining / s->rate; - size_t direct_bytes = blocks * s->rate; - if (direct_bytes > 0) { - keccak_absorb_blocks(s, buf, blocks); - remaining -= direct_bytes; - buf += direct_bytes; - } - } - - const size_t buf_avail = s->rate - s->offset; - const size_t buf_bytes = (buf_avail > remaining) ? remaining : buf_avail; - if (buf_bytes > 0) { - memcpy(&s->block[s->offset], buf, buf_bytes); - s->offset += buf_bytes; - remaining -= buf_bytes; - buf += buf_bytes; - } - if (s->offset == s->rate) { - keccak_absorb_blocks(s, s->block, 1); - s->offset = 0; - } - } - return 0; -} - -static void -keccak_finalize(keccak_state *s) -{ - // Xor in the DS and pad frame. - s->block[s->offset++] = s->delim; // DS. - for (size_t i = s->offset; i < s->rate; i++) { - s->block[i] = 0; - } - s->block[s->rate - 1] |= 0x80; // Pad frame. - - // Xor in the last block. - xorin8(s->a, s->block, s->rate); - - memwipe(s->block, 0, sizeof(s->block)); - s->finalized = 1; - s->offset = s->rate; -} - -static inline void -keccak_squeeze_blocks(keccak_state *s, uint8_t *out, size_t nr_blocks) -{ - for (size_t n = 0; n < nr_blocks; n++) { - keccakf(s->a); - setout8(s->a, out, s->rate); - out += s->rate; - } -} - -static int -keccak_squeeze(keccak_state *s, uint8_t *out, size_t outlen) -{ - if (!s->finalized) - return -1; - - size_t remaining = outlen; - while (remaining > 0) { - if (s->offset == s->rate) { - const size_t blocks = remaining / s->rate; - const size_t direct_bytes = blocks * s->rate; - if (blocks > 0) { - keccak_squeeze_blocks(s, out, blocks); - out += direct_bytes; - remaining -= direct_bytes; - } - - if (remaining > 0) { - keccak_squeeze_blocks(s, s->block, 1); - s->offset = 0; - } - } - - const size_t buf_bytes = s->rate - s->offset; - const size_t indirect_bytes = (buf_bytes > remaining) ? remaining : buf_bytes; - if (indirect_bytes > 0) { - memcpy(out, &s->block[s->offset], indirect_bytes); - out += indirect_bytes; - s->offset += indirect_bytes; - remaining -= indirect_bytes; - } - } - return 0; -} - -int -keccak_digest_init(keccak_state *s, size_t bits) -{ - if (s == NULL) - return -1; - if (bits != 224 && bits != 256 && bits != 384 && bits != 512) - return -1; - - keccak_cleanse(s); - s->rate = KECCAK_RATE(bits); - s->delim = KECCAK_DELIM_DIGEST; - return 0; -} - -int -keccak_digest_update(keccak_state *s, const uint8_t *buf, size_t len) -{ - if (s == NULL) - return -1; - if (s->delim != KECCAK_DELIM_DIGEST) - return -1; - - return keccak_update(s, buf, len); -} - -int -keccak_digest_sum(const keccak_state *s, uint8_t *out, size_t outlen) -{ - if (s == NULL) - return -1; - if (s->delim != KECCAK_DELIM_DIGEST) - return -1; - if (out == NULL || outlen > 4 * (KECCAK_MAX_RATE - s->rate) / 8) - return -1; - - // Work in a copy so that incremental/rolling hashes are easy. - keccak_state s_tmp; - keccak_clone(&s_tmp, s); - keccak_finalize(&s_tmp); - int ret = keccak_squeeze(&s_tmp, out, outlen); - keccak_cleanse(&s_tmp); - return ret; -} - -int -keccak_xof_init(keccak_state *s, size_t bits) -{ - if (s == NULL) - return -1; - if (bits != 128 && bits != 256) - return -1; - - keccak_cleanse(s); - s->rate = KECCAK_RATE(bits); - s->delim = KECCAK_DELIM_XOF; - return 0; -} - -int -keccak_xof_absorb(keccak_state *s, const uint8_t *buf, size_t len) -{ - if (s == NULL) - return -1; - if (s->delim != KECCAK_DELIM_XOF) - return -1; - - return keccak_update(s, buf, len); -} - -int -keccak_xof_squeeze(keccak_state *s, uint8_t *out, size_t outlen) -{ - if (s == NULL) - return -1; - if (s->delim != KECCAK_DELIM_XOF) - return -1; - - if (!s->finalized) - keccak_finalize(s); - - return keccak_squeeze(s, out, outlen); -} - -void -keccak_clone(keccak_state *out, const keccak_state *in) -{ - memcpy(out, in, sizeof(keccak_state)); -} - -void -keccak_cleanse(keccak_state *s) -{ - memwipe(s, 0, sizeof(keccak_state)); -} - -/** The sponge-based hash construction. **/ -static inline int hash(uint8_t* out, size_t outlen, - const uint8_t* in, size_t inlen, - size_t bits, uint8_t delim) { - if ((out == NULL) || ((in == NULL) && inlen != 0)) { - return -1; - } - - int ret = 0; - keccak_state s; - keccak_cleanse(&s); - - switch (delim) { - case KECCAK_DELIM_DIGEST: - ret |= keccak_digest_init(&s, bits); - ret |= keccak_digest_update(&s, in, inlen); - // Use the internal API instead of sum to avoid the memcpy. - keccak_finalize(&s); - ret |= keccak_squeeze(&s, out, outlen); - break; - case KECCAK_DELIM_XOF: - ret |= keccak_xof_init(&s, bits); - ret |= keccak_xof_absorb(&s, in, inlen); - ret |= keccak_xof_squeeze(&s, out, outlen); - break; - default: - return -1; - } - keccak_cleanse(&s); - return ret; -} - -/*** Helper macros to define SHA3 and SHAKE instances. ***/ -#define defshake(bits) \ - int shake##bits(uint8_t* out, size_t outlen, \ - const uint8_t* in, size_t inlen) { \ - return hash(out, outlen, in, inlen, bits, KECCAK_DELIM_XOF); \ - } -#define defsha3(bits) \ - int sha3_##bits(uint8_t* out, size_t outlen, \ - const uint8_t* in, size_t inlen) { \ - if (outlen > (bits/8)) { \ - return -1; \ - } \ - return hash(out, outlen, in, inlen, bits, KECCAK_DELIM_DIGEST); \ - } - -/*** FIPS202 SHAKE VOFs ***/ -defshake(128) -defshake(256) - -/*** FIPS202 SHA3 FOFs ***/ -defsha3(224) -defsha3(256) -defsha3(384) -defsha3(512) diff --git a/src/tor/src/ext/keccak-tiny/keccak-tiny.c b/src/tor/src/ext/keccak-tiny/keccak-tiny.c deleted file mode 100644 index 76d89fa78..000000000 --- a/src/tor/src/ext/keccak-tiny/keccak-tiny.c +++ /dev/null @@ -1,163 +0,0 @@ -/** libkeccak-tiny - * - * A single-file implementation of SHA-3 and SHAKE. - * - * Implementor: David Leon Gil - * License: CC0, attribution kindly requested. Blame taken too, - * but not liability. - */ -#include "keccak-tiny.h" - -#include -#include -#include -#include - -/******** The Keccak-f[1600] permutation ********/ - -/*** Constants. ***/ -static const uint8_t rho[24] = \ - { 1, 3, 6, 10, 15, 21, - 28, 36, 45, 55, 2, 14, - 27, 41, 56, 8, 25, 43, - 62, 18, 39, 61, 20, 44}; -static const uint8_t pi[24] = \ - {10, 7, 11, 17, 18, 3, - 5, 16, 8, 21, 24, 4, - 15, 23, 19, 13, 12, 2, - 20, 14, 22, 9, 6, 1}; -static const uint64_t RC[24] = \ - {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, - 0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, - 0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, - 0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, - 0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, - 0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; - -/*** Helper macros to unroll the permutation. ***/ -#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) -#define REPEAT6(e) e e e e e e -#define REPEAT24(e) REPEAT6(e e e e) -#define REPEAT5(e) e e e e e -#define FOR5(v, s, e) \ - v = 0; \ - REPEAT5(e; v += s;) - -/*** Keccak-f[1600] ***/ -static inline void keccakf(void* state) { - uint64_t* a = (uint64_t*)state; - uint64_t b[5] = {0}; - uint64_t t = 0; - uint8_t x, y; - - for (int i = 0; i < 24; i++) { - // Theta - FOR5(x, 1, - b[x] = 0; - FOR5(y, 5, - b[x] ^= a[x + y]; )) - FOR5(x, 1, - FOR5(y, 5, - a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) - // Rho and pi - t = a[1]; - x = 0; - REPEAT24(b[0] = a[pi[x]]; - a[pi[x]] = rol(t, rho[x]); - t = b[0]; - x++; ) - // Chi - FOR5(y, - 5, - FOR5(x, 1, - b[x] = a[y + x];) - FOR5(x, 1, - a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) - // Iota - a[0] ^= RC[i]; - } -} - -/******** The FIPS202-defined functions. ********/ - -/*** Some helper macros. ***/ - -#define _(S) do { S } while (0) -#define FOR(i, ST, L, S) \ - _(for (size_t i = 0; i < L; i += ST) { S; }) -#define mkapply_ds(NAME, S) \ - static inline void NAME(uint8_t* dst, \ - const uint8_t* src, \ - size_t len) { \ - FOR(i, 1, len, S); \ - } -#define mkapply_sd(NAME, S) \ - static inline void NAME(const uint8_t* src, \ - uint8_t* dst, \ - size_t len) { \ - FOR(i, 1, len, S); \ - } - -mkapply_ds(xorin, dst[i] ^= src[i]) // xorin -mkapply_sd(setout, dst[i] = src[i]) // setout - -#define P keccakf -#define Plen 200 - -// Fold P*F over the full blocks of an input. -#define foldP(I, L, F) \ - while (L >= rate) { \ - F(a, I, rate); \ - P(a); \ - I += rate; \ - L -= rate; \ - } - -/** The sponge-based hash construction. **/ -static inline int hash(uint8_t* out, size_t outlen, - const uint8_t* in, size_t inlen, - size_t rate, uint8_t delim) { - if ((out == NULL) || ((in == NULL) && inlen != 0) || (rate >= Plen)) { - return -1; - } - uint8_t a[Plen] = {0}; - // Absorb input. - foldP(in, inlen, xorin); - // Xor in the DS and pad frame. - a[inlen] ^= delim; - a[rate - 1] ^= 0x80; - // Xor in the last block. - xorin(a, in, inlen); - // Apply P - P(a); - // Squeeze output. - foldP(out, outlen, setout); - setout(a, out, outlen); - memset_s(a, 200, 0, 200); - return 0; -} - -/*** Helper macros to define SHA3 and SHAKE instances. ***/ -#define defshake(bits) \ - int shake##bits(uint8_t* out, size_t outlen, \ - const uint8_t* in, size_t inlen) { \ - return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x1f); \ - } -#define defsha3(bits) \ - int sha3_##bits(uint8_t* out, size_t outlen, \ - const uint8_t* in, size_t inlen) { \ - if (outlen > (bits/8)) { \ - return -1; \ - } \ - return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x06); \ - } - -/*** FIPS202 SHAKE VOFs ***/ -defshake(128) -defshake(256) - -/*** FIPS202 SHA3 FOFs ***/ -defsha3(224) -defsha3(256) -defsha3(384) -defsha3(512) diff --git a/src/tor/src/ext/keccak-tiny/keccak-tiny.h b/src/tor/src/ext/keccak-tiny/keccak-tiny.h deleted file mode 100644 index 7efea2319..000000000 --- a/src/tor/src/ext/keccak-tiny/keccak-tiny.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef KECCAK_FIPS202_H -#define KECCAK_FIPS202_H - -#include -#include "torint.h" - -#define KECCAK_MAX_RATE 200 - -/* Calculate the rate (block size) from the security target. */ -#define KECCAK_RATE(bits) (KECCAK_MAX_RATE - (bits / 4)) - -/* The internal structure of a FIPS202 hash/xof instance. Most callers - * should treat this as an opaque structure. - */ -typedef struct keccak_state { - uint8_t a[KECCAK_MAX_RATE]; - size_t rate; - uint8_t delim; - - uint8_t block[KECCAK_MAX_RATE]; - size_t offset; - - uint8_t finalized : 1; -} keccak_state; - -/* Initialize a Keccak instance suitable for SHA-3 hash functions. */ -int keccak_digest_init(keccak_state *s, size_t bits); - -/* Feed more data into the SHA-3 hash instance. */ -int keccak_digest_update(keccak_state *s, const uint8_t *buf, size_t len); - -/* Calculate the SHA-3 hash digest. The state is unmodified to support - * calculating multiple/rolling digests. - */ -int keccak_digest_sum(const keccak_state *s, uint8_t *out, size_t outlen); - -/* Initialize a Keccak instance suitable for XOFs (SHAKE-128/256). */ -int keccak_xof_init(keccak_state *s, size_t bits); - -/* Absorb more data into the XOF. Must not be called after a squeeze call. */ -int keccak_xof_absorb(keccak_state *s, const uint8_t *buf, size_t len); - -/* Squeeze data out of the XOF. Must not attempt to absorb additional data, - * after a squeeze has been called. - */ -int keccak_xof_squeeze(keccak_state *s, uint8_t *out, size_t outlen); - -/* Clone an existing hash/XOF instance. */ -void keccak_clone(keccak_state *out, const keccak_state *in); - -/* Cleanse sensitive data from a given hash instance. */ -void keccak_cleanse(keccak_state *s); - -#define decshake(bits) \ - int shake##bits(uint8_t*, size_t, const uint8_t*, size_t); - -#define decsha3(bits) \ - int sha3_##bits(uint8_t*, size_t, const uint8_t*, size_t); - -decshake(128) -decshake(256) -decsha3(224) -decsha3(256) -decsha3(384) -decsha3(512) -#endif diff --git a/src/tor/src/ext/mulodi/LICENSE.TXT b/src/tor/src/ext/mulodi/LICENSE.TXT deleted file mode 100644 index a17dc12b2..000000000 --- a/src/tor/src/ext/mulodi/LICENSE.TXT +++ /dev/null @@ -1,91 +0,0 @@ -============================================================================== -compiler_rt License -============================================================================== - -The compiler_rt library is dual licensed under both the University of Illinois -"BSD-Like" license and the MIT license. As a user of this code you may choose -to use it under either license. As a contributor, you agree to allow your code -to be used under both. - -Full text of the relevant licenses is included below. - -============================================================================== - -University of Illinois/NCSA -Open Source License - -Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT - -All rights reserved. - -Developed by: - - LLVM Team - - University of Illinois at Urbana-Champaign - - http://llvm.org - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -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: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -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 -CONTRIBUTORS 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 WITH THE -SOFTWARE. - -============================================================================== - -Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT - -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. - -============================================================================== -Copyrights and Licenses for Third Party Software Distributed with LLVM: -============================================================================== -The LLVM software contains code written by third parties. Such software will -have its own individual LICENSE.TXT file in the directory in which it appears. -This file will describe the copyrights, license, and restrictions which apply -to that code. - -The disclaimer of warranty in the University of Illinois Open Source License -applies to all code in the LLVM Distribution, and nothing in any of the -other licenses gives permission to use the names of the LLVM Team or the -University of Illinois to endorse or promote products derived from this -Software. - diff --git a/src/tor/src/ext/mulodi/mulodi4.c b/src/tor/src/ext/mulodi/mulodi4.c deleted file mode 100644 index 9891bbf1a..000000000 --- a/src/tor/src/ext/mulodi/mulodi4.c +++ /dev/null @@ -1,67 +0,0 @@ -/*===-- mulodi4.c - Implement __mulodi4 -----------------------------------=== - * - * The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements __mulodi4 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ - -#if 0 -#include "int_lib.h" -#else -#define COMPILER_RT_ABI -#define di_int int64_t -#define di_uint uint64_t -#include "torint.h" - -di_int __mulodi4(di_int a, di_int b, int* overflow); -#endif - -/* Returns: a * b */ - -/* Effects: sets *overflow to 1 if a * b overflows */ - -COMPILER_RT_ABI di_int -__mulodi4(di_int a, di_int b, int* overflow) -{ - const int N = (int)(sizeof(di_int) * CHAR_BIT); - const di_int MIN = (di_int) ((di_uint)1 << (N-1)); - const di_int MAX = ~MIN; - *overflow = 0; - di_int result = a * b; - if (a == MIN) - { - if (b != 0 && b != 1) - *overflow = 1; - return result; - } - if (b == MIN) - { - if (a != 0 && a != 1) - *overflow = 1; - return result; - } - di_int sa = a >> (N - 1); - di_int abs_a = (a ^ sa) - sa; - di_int sb = b >> (N - 1); - di_int abs_b = (b ^ sb) - sb; - if (abs_a < 2 || abs_b < 2) - return result; - if (sa == sb) - { - if (abs_a > MAX / abs_b) - *overflow = 1; - } - else - { - if (abs_a > MIN / -abs_b) - *overflow = 1; - } - return result; -} diff --git a/src/tor/src/ext/readpassphrase.c b/src/tor/src/ext/readpassphrase.c deleted file mode 100644 index e0df05d7b..000000000 --- a/src/tor/src/ext/readpassphrase.c +++ /dev/null @@ -1,222 +0,0 @@ -/* $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $ */ - -/* - * Copyright (c) 2000-2002, 2007 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ - -/* OPENBSD ORIGINAL: lib/libc/gen/readpassphrase.c */ - -#include "orconfig.h" - -#ifndef HAVE_READPASSPHRASE - -#include -#include -#include -#include -#include "tor_readpassphrase.h" -#include -#include -#include - -#ifndef _PATH_TTY -# define _PATH_TTY "/dev/tty" -#endif - -#ifdef TCSASOFT -# define _T_FLUSH (TCSAFLUSH|TCSASOFT) -#else -# define _T_FLUSH (TCSAFLUSH) -#endif - -/* SunOS 4.x which lacks _POSIX_VDISABLE, but has VDISABLE */ -#if !defined(_POSIX_VDISABLE) && defined(VDISABLE) -# define _POSIX_VDISABLE VDISABLE -#endif - -#ifndef _NSIG -# ifdef NSIG -# define _NSIG NSIG -# else -# define _NSIG 128 -# endif -#endif - -static volatile sig_atomic_t signo[_NSIG]; - -static void handler(int); - -char * -readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) -{ - ssize_t bytes_written = 0; - ssize_t nr; - int input, output, save_errno, i, need_restart; - char ch, *p, *end; - struct termios term, oterm; - struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm; - struct sigaction savetstp, savettin, savettou, savepipe; - - /* I suppose we could alloc on demand in this case (XXX). */ - if (bufsiz == 0) { - errno = EINVAL; - return(NULL); - } - -restart: - for (i = 0; i < _NSIG; i++) - signo[i] = 0; - nr = -1; - save_errno = 0; - need_restart = 0; - /* - * Read and write to /dev/tty if available. If not, read from - * stdin and write to stderr unless a tty is required. - */ - if ((flags & RPP_STDIN) || - (input = output = open(_PATH_TTY, O_RDWR)) == -1) { - if (flags & RPP_REQUIRE_TTY) { - errno = ENOTTY; - return(NULL); - } - input = STDIN_FILENO; - output = STDERR_FILENO; - } - - /* - * Catch signals that would otherwise cause the user to end - * up with echo turned off in the shell. Don't worry about - * things like SIGXCPU and SIGVTALRM for now. - */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; /* don't restart system calls */ - sa.sa_handler = handler; - (void)sigaction(SIGALRM, &sa, &savealrm); - (void)sigaction(SIGHUP, &sa, &savehup); - (void)sigaction(SIGINT, &sa, &saveint); - (void)sigaction(SIGPIPE, &sa, &savepipe); - (void)sigaction(SIGQUIT, &sa, &savequit); - (void)sigaction(SIGTERM, &sa, &saveterm); - (void)sigaction(SIGTSTP, &sa, &savetstp); - (void)sigaction(SIGTTIN, &sa, &savettin); - (void)sigaction(SIGTTOU, &sa, &savettou); - - /* Turn off echo if possible. */ - if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) { - memcpy(&term, &oterm, sizeof(term)); - if (!(flags & RPP_ECHO_ON)) - term.c_lflag &= ~(ECHO | ECHONL); -#ifdef VSTATUS - if (term.c_cc[VSTATUS] != _POSIX_VDISABLE) - term.c_cc[VSTATUS] = _POSIX_VDISABLE; -#endif - (void)tcsetattr(input, _T_FLUSH, &term); - } else { - memset(&term, 0, sizeof(term)); - term.c_lflag |= ECHO; - memset(&oterm, 0, sizeof(oterm)); - oterm.c_lflag |= ECHO; - } - - /* No I/O if we are already backgrounded. */ - if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) { - if (!(flags & RPP_STDIN)) - bytes_written = write(output, prompt, strlen(prompt)); - end = buf + bufsiz - 1; - p = buf; - while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') { - if (p < end) { -#if 0 - if ((flags & RPP_SEVENBIT)) - ch &= 0x7f; - if (isalpha(ch)) { - if ((flags & RPP_FORCELOWER)) - ch = (char)tolower(ch); - if ((flags & RPP_FORCEUPPER)) - ch = (char)toupper(ch); - } -#endif - *p++ = ch; - } - } - *p = '\0'; - save_errno = errno; - if (!(term.c_lflag & ECHO)) - bytes_written = write(output, "\n", 1); - } - - (void) bytes_written; - - /* Restore old terminal settings and signals. */ - if (memcmp(&term, &oterm, sizeof(term)) != 0) { - while (tcsetattr(input, _T_FLUSH, &oterm) == -1 && - errno == EINTR) - continue; - } - (void)sigaction(SIGALRM, &savealrm, NULL); - (void)sigaction(SIGHUP, &savehup, NULL); - (void)sigaction(SIGINT, &saveint, NULL); - (void)sigaction(SIGQUIT, &savequit, NULL); - (void)sigaction(SIGPIPE, &savepipe, NULL); - (void)sigaction(SIGTERM, &saveterm, NULL); - (void)sigaction(SIGTSTP, &savetstp, NULL); - (void)sigaction(SIGTTIN, &savettin, NULL); - (void)sigaction(SIGTTOU, &savettou, NULL); - if (input != STDIN_FILENO) - (void)close(input); - - /* - * If we were interrupted by a signal, resend it to ourselves - * now that we have restored the signal handlers. - */ - for (i = 0; i < _NSIG; i++) { - if (signo[i]) { - kill(getpid(), i); - switch (i) { - case SIGTSTP: - case SIGTTIN: - case SIGTTOU: - need_restart = 1; - } - } - } - if (need_restart) - goto restart; - - if (save_errno) - errno = save_errno; - return(nr == -1 ? NULL : buf); -} - -#if 0 -char * -getpass(const char *prompt) -{ - static char buf[_PASSWORD_LEN + 1]; - - return(readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF)); -} -#endif - -static void handler(int s) -{ - - signo[s] = 1; -} -#endif /* HAVE_READPASSPHRASE */ diff --git a/src/tor/src/ext/rust/README b/src/tor/src/ext/rust/README deleted file mode 100644 index f7b7f0ded..000000000 --- a/src/tor/src/ext/rust/README +++ /dev/null @@ -1,5 +0,0 @@ -The crates directory is a local mirror for the crates.io repository. Use - - cargo vendor -x -v /crates - -to update when adding a new dependency or when updating an older version. diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json b/src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json deleted file mode 100644 index e0a2dd3fd..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7150ee9391a955b2ef7e0762fc61c0c1aab167620ca36d88d78062d93b8334ba",".travis.yml":"41a754a0d21cff3671a09503cae51bac20357bb0c9640ee5edba2208e573429c","Cargo.toml":"fc8266c859a18b4d550dd9c48a22700a5e002df0a85ad7d3caf58659d9cf9684","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"a2ffaf2a812cec7c243fd753891c7e2eada5b61d9846dd5318d7c99d4514c988","appveyor.yml":"483ae27670e061eb91f055699a9ad88255050b7b300f183b8580340407751bb4","ci/README.md":"be804f15e2128e5fd4b160cb0b13cff5f19e7d77b55ec5254aa6fd8731c84f0d","ci/android-accept-licenses.sh":"84ad00815f628005ed22c5d6cd14990ebc97812a7163bd275b2877904eddab53","ci/android-install-ndk.sh":"73c5f21438c024ce1b8c793184447ff9aecd83c87cbde8de580b782842b3563f","ci/android-install-sdk.sh":"891900fe4e4ceb04717b91a253753858270defc6d6401936d08c09801c1de178","ci/docker/aarch64-linux-android/Dockerfile":"68f375c6e0b3716f8c0b6ed217bc6c3631fa2b86c578b983a0bf60d0344efd74","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"62ca7317439f9c303990e897450a91cd467be05eb75dfc01456d417932ac8672","ci/docker/arm-linux-androideabi/Dockerfile":"1193bf048efbeb9be3c9fac0836dcf6ae07e12cdf09b36b386dd4cbd62abbffa","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"e349f7caa463adbde8d6ec4d2b9f7720ed81c77f48d75bbfb78c89751f55c2dc","ci/docker/i686-linux-android/Dockerfile":"7c353aecdf0b21d8584392cc6ea31d455adad769034c3ea09191a1b26a2521e1","ci/docker/i686-unknown-linux-gnu/Dockerfile":"07e9df6ba91025cbec7ae81ade63f8cfb8a54c5e1e5a8f8def0617e17bd59db0","ci/docker/i686-unknown-linux-musl/Dockerfile":"fcaedc90fbb90375186b36b4324bff0a042aae70695be0f2b632e3cf7479eae6","ci/docker/mips-unknown-linux-gnu/Dockerfile":"860299d96ee50ebdbd788e65eb6ba1f561ef66107647bddffcb2567ac350896b","ci/docker/mips-unknown-linux-musl/Dockerfile":"711c43122fa34cee83a69944493213924b0ff1fccd78c7a141cb2b2127526484","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"163776e0fd38f66df7415421202ac29efc7d345a628947434e573c3885594ab5","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"aef213df08da03ab6a723c3e6e5594a0586251950d81482cf53179d8e64e95c7","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"08b846a338c2ee70100f4e80db812668dc58bfb536c44a95cd1cf004d965186b","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"4da285ffd035d16f5da9e3701841eb86049c8cfa417fa81e53da4ef74152eac0","ci/docker/x86_64-linux-android/Dockerfile":"aecf2b18b70cebe04738f04eaafa7054fece5bc4dc6123786c130ad5446404cd","ci/docker/x86_64-rumprun-netbsd/Dockerfile":"44c3107fb30380785aaed6ff73fa334017a5bb4e3b5c7d4876154f09023a2b99","ci/docker/x86_64-unknown-freebsd/Dockerfile":"ef0f9f63065218728d2daafaa5ba71b17e4ccc23d72e859e0a7133fc64c0815e","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"67fabbc8c6ac02376cf9344251ad49ecdac396b71accb572fd1ae65225325bc0","ci/docker/x86_64-unknown-linux-musl/Dockerfile":"f71019fed5204b950843ef5e56144161fda7e27fad68ed0e8bc4353c388c7bcf","ci/docker/x86_64-unknown-openbsd/Dockerfile":"dfa5c23a6cff8c7a9a846668118c71a8406a360801fd3632fb12e8fbda6b7338","ci/dox.sh":"9ea240a4a607036235fd68c01b5d2a59f365768d103d3be774dcf34aa3ff563e","ci/ios/deploy_and_run_on_ios_simulator.rs":"3175066fd7f82390f6226d881e1a1dda9767ea2705656870e0d7774e2731800e","ci/landing-page-footer.html":"b70b3112c2147f5c967e7481061ef38bc2d79a28dd55a16fb916d9c9426da2c4","ci/landing-page-head.html":"ad69663fac7924f27d0209bc519d55838e86edfc4133713a6fd08caadac1b142","ci/run-docker.sh":"655712ba6127eb2efe2c641cf4cf1246f3e485096d72ec57b423e9d2bff6fb73","ci/run-qemu.sh":"bb859421170871ef23a8940c5e150efec0c01b95e32d2ce2d37b79a45d9d346c","ci/run.sh":"d2bac724d7541379577545d3b4be000acb6a4eea7c101bc8615b36a319217335","ci/style.rs":"60564abc1d5197ed1598426dd0d6ee9939a16d2875b03373538f58843bb616c4","src/dox.rs":"f732d3c0dcd6ace854ee32d8f898b96ac42204a799c6e386c4ba88f6e58673dc","src/lib.rs":"651696755aed40230cde8a505a2dfef61bea52d6349c9b9343497a5c7158ec92","src/macros.rs":"bd9802772b0e5c8b3c550d1c24307f06c0d1e4ce656b4ae1cf092142bbe5412c","src/redox.rs":"3dd158ba9fbbabe96ce2607e91dbf07b93b37c0427734118702dcb4901fe8964","src/unix/bsd/apple/b32.rs":"110ecff78da0e8d405d861447904da403d8b3f6da1f0f9dc9987633f3f04fe46","src/unix/bsd/apple/b64.rs":"2c51c1c063bfb5076ecf08fbc9371ce9473878d2e046c186eb9433955f6f8ba6","src/unix/bsd/apple/mod.rs":"4bc8b16112609cc0a72be6916c89bdca531fa02fc823bf34ad4ec2c4af9c576e","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"54b3b30c4cac35ced9197e7267f209b0f168de8a6899ab0cba290c5ae399f0e7","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/freebsd/mod.rs":"ba1bd1487b41be91115a21e3968d15e4d877043ba4946cd11ed2be2ee66afc19","src/unix/bsd/freebsdlike/freebsd/x86.rs":"54311d3ebf2bb091ab22361e377e6ef9224aec2ecfe459fbfcedde4932db9c58","src/unix/bsd/freebsdlike/freebsd/x86_64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/mod.rs":"321c6b9157152e07045ad3d662e5a3a96c3ab0b0d50dc3585a32106147ee4a91","src/unix/bsd/mod.rs":"6c8511618608536d5026222c8e8f1c93af576a4bad7452bc1cd954d72c47615b","src/unix/bsd/netbsdlike/mod.rs":"50ca4e29f06669a0ebff72f2f24b2b08ff55478f580b1684e16a0cf6938a6a50","src/unix/bsd/netbsdlike/netbsd/mod.rs":"5b5c8d295a462ffca8dd65b826ead5d2d210e6a7a71a2909db600fa9aae36151","src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/netbsd/other/mod.rs":"4d9f7091af8e166943ac6f42ce85558909e5b6e61325039bff7adfbcf4b90212","src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs":"f8cd05dacd3a3136c58da5a2fbe26f703767823b28e74fe8a2b57a7bd98d6d5c","src/unix/bsd/netbsdlike/openbsdlike/mod.rs":"2d4a17eb74ae5ced13fcd9bb1df283e5623a52754ec75b23cf7b76cb03d5f2a7","src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs":"31686679c2df5f11437a338b9281fa0dd4f8d061dcd895d67619992171e115c9","src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs":"f5d8db6f54efd05520b31b764a6bacbf612e1aebce097d2d5bfaaef3b91f37b5","src/unix/haiku/b32.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/haiku/b64.rs":"b422430c550c0ba833c9206d1350861e344e3a2eb33d7d58693efb35044be1cc","src/unix/haiku/mod.rs":"fe24d9863133ee2663b07ff872f4982ea36821c432fb569a9676436506c9a98a","src/unix/mod.rs":"63e28708e4791ae7f5d47d899b4060f141231c34a50d81e701c4ea987d1412c1","src/unix/notbsd/android/b32/arm.rs":"d63a234f3a2399bdef1fa13c6a209386cb5ddac04c90f2c6d42badc8235dc49d","src/unix/notbsd/android/b32/mod.rs":"c09b53e42b286a7ec56fb28d0a3e71ec42fecaec39b2015d1d4a3338b172c570","src/unix/notbsd/android/b32/x86.rs":"10e6879dcbf136f0e907337987a0609b357e27e0f24ccb907525fcad881c24c3","src/unix/notbsd/android/b64/aarch64.rs":"d0a25e73f8d02f8412fa9237e41d3f4993b45603a2a8f8d1690bc6624a190d42","src/unix/notbsd/android/b64/mod.rs":"567710245750e8d1e4c99e145b7079b59c1f67514616cbea14734202a8c79c0c","src/unix/notbsd/android/b64/x86_64.rs":"a2b048dad18c60ede035645bbfea2ba3dd75197c1ee0d54fb5fcab14d6c35194","src/unix/notbsd/android/mod.rs":"fd065159dd2a9cbb705d2013b407eb24714bc85c454fb60673e88a839b5427ad","src/unix/notbsd/linux/mips/mips32.rs":"b268f603f71d854614c20cea00431812def9b683d43e6254ae62a8f88a14f7c3","src/unix/notbsd/linux/mips/mips64.rs":"8bce84a47a6ad7fc95234fdd3513ddb8c78634f4ac18209c0276ab705c092ebe","src/unix/notbsd/linux/mips/mod.rs":"9c263551896f5a4403282a20f39f2113f02cb34d968dc65bd80dc73c65fbeb25","src/unix/notbsd/linux/mod.rs":"98b9e87bf4d4396c2195d19f95fa1f6129a92f2aa3783d328438cd35e90d6758","src/unix/notbsd/linux/musl/b32/arm.rs":"d43ba5c528926261b1ccd529ab55636254360a084ab84a7ec22a4eb5afddb8f8","src/unix/notbsd/linux/musl/b32/asmjs.rs":"085e410f990312de76f74cb9bbf9fcc27d686e94334143b34511f565d1b8bb91","src/unix/notbsd/linux/musl/b32/mips.rs":"941c88bc413ba2b87eb6a6cfe03355ee148b865f39598456965b3d04b3adbbe6","src/unix/notbsd/linux/musl/b32/mod.rs":"fc7e055edbe6fa170c2bda6b3415066c1871b3e60ebb70a6329d008f77100f0b","src/unix/notbsd/linux/musl/b32/x86.rs":"ffa5781b52a7d2774a34b1e3e2034a498b919fd96eb85e88098dba2e674a3797","src/unix/notbsd/linux/musl/b64/aarch64.rs":"4009c7eaf703472daef2a70bdac910d9fc395a33689ef2e8cf1c4e692445d3f0","src/unix/notbsd/linux/musl/b64/mod.rs":"d9b03a59a54a568b07ffa4380103a926cbb45dbfd87745edef79cd971ef31283","src/unix/notbsd/linux/musl/b64/powerpc64.rs":"dc28f5b7284235d6cf5519053cac59a1c16dc39223b71cca0871e4880755f852","src/unix/notbsd/linux/musl/b64/x86_64.rs":"43291acc0dfc92c2fec8ba6ce77ee9ca3c20bcdccec18e149f95ba911cee704b","src/unix/notbsd/linux/musl/mod.rs":"52391104b2e6e4f75be7c7625fb44b421514be19ad1fa3b04141b7d59bf93034","src/unix/notbsd/linux/other/b32/arm.rs":"d373022fd152341ec8f5d106937c7898dd68fb4c0346bd94a37526542a605e9a","src/unix/notbsd/linux/other/b32/mod.rs":"6122be151c5d85b9df6a3aaefc5cafd0657b371cafa9cb31ed9b1a394976af45","src/unix/notbsd/linux/other/b32/powerpc.rs":"cc85e75675abc37414fc7701dda7c3f6396e7b2d3c52eea7febdc41f7b033ea9","src/unix/notbsd/linux/other/b32/x86.rs":"1ec7dbfa52d59d3f79c46d5b6854e2dd3bd44dd0f020d4e32183eed4c00bbd52","src/unix/notbsd/linux/other/b64/aarch64.rs":"ce342b37a4a60c216625c8e177a50b3f328bdfd5c527e32e06c73f4aa5926829","src/unix/notbsd/linux/other/b64/mod.rs":"bee90e8d9217ee344d0e99fd483766a1b28e8b1ded930d44a0400a5e5224bb6a","src/unix/notbsd/linux/other/b64/powerpc64.rs":"fc7131f39a75a9e35d474d70b0bc829c52590dadf472ae5785972a94ffb95f12","src/unix/notbsd/linux/other/b64/sparc64.rs":"0ba7f399349bc586ebb73d0caef5c67f195c9e3a942eabfb2efd133b4cea9872","src/unix/notbsd/linux/other/b64/x86_64.rs":"a5e62a7e12891fb545d4b9a40c139c254ba392fd3b285a7f317668f8533c3e4f","src/unix/notbsd/linux/other/mod.rs":"808ea561c7e2a0f58bb1f7a6ecf00c5a3287925e1f6cdb634b44b754df193e55","src/unix/notbsd/linux/s390x.rs":"463f942d676a31d82913fc8ac23912770c2c683db3eb459c0c837cbbdb13610e","src/unix/notbsd/mod.rs":"5a4a2a7799c7b244c439a9599d8885c17dad0cf6179e8f31fb1de4e72f153b53","src/unix/solaris/mod.rs":"ba70c4ebd371f2580c1fb8f3f6cd32a391ec017e1eed9812137caa94e5149a03","src/windows.rs":"acccbd341e81206cb1dc66af41762c193ac0dd719d700b64f7e26c967ee7d670"},"package":"babb8281da88cba992fa1f4ddec7d63ed96280a1a53ec9b919fd37b53d71e502"} \ No newline at end of file diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-ok b/src/tor/src/ext/rust/crates/libc-0.2.22/.cargo-ok deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/.gitignore b/src/tor/src/ext/rust/crates/libc-0.2.22/.gitignore deleted file mode 100644 index f0ff2599d..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -target -Cargo.lock -*~ diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/.travis.yml b/src/tor/src/ext/rust/crates/libc-0.2.22/.travis.yml deleted file mode 100644 index 22d86e033..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/.travis.yml +++ /dev/null @@ -1,132 +0,0 @@ -language: rust -sudo: required -dist: trusty -services: - - docker -install: - - if [ -z "$NO_ADD" ]; then rustup target add $TARGET; fi -script: - - cargo build - - cargo build --no-default-features - - cargo generate-lockfile --manifest-path libc-test/Cargo.toml - - if [[ $TRAVIS_OS_NAME = "linux" ]]; then - sh ci/run-docker.sh $TARGET; - else - export CARGO_TARGET_DIR=`pwd`/target; - sh ci/run.sh $TARGET; - fi - - rustc ci/style.rs && ./style src -env: - global: - secure: "e2/3QjgRN9atOuSHp22TrYG7QVKcYUWY48Hi9b60w+r1+BhPkTseIJLte7WefRhdXtqpjjUJTooKDhnurFOeHaCT+nmBgiv+FPU893sBl4bhesY4m0vgUJVbNZcs6lTImYekWVb+aqjGdgV/XAgCw7c3kPmrZV0MzGDWL64Xaps=" -matrix: - include: - # 1.0.0 compat - - os: linux - env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 - rust: 1.0.0 - script: cargo build - install: - - # build documentation - - os: linux - env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 - rust: nightly - script: sh ci/dox.sh - - # stable compat - - os: linux - env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 - rust: stable - - os: linux - env: TARGET=i686-unknown-linux-gnu - rust: stable - - os: osx - env: TARGET=x86_64-apple-darwin NO_ADD=1 - rust: stable - - os: osx - env: TARGET=i686-apple-darwin - rust: stable - - os: linux - env: TARGET=arm-linux-androideabi - rust: stable - - os: linux - env: TARGET=aarch64-linux-android - rust: stable - - os: linux - env: TARGET=i686-linux-android - rust: stable - - os: linux - env: TARGET=x86_64-unknown-linux-musl - rust: stable - - os: linux - env: TARGET=i686-unknown-linux-musl - rust: stable - - os: linux - env: TARGET=arm-unknown-linux-gnueabihf - rust: stable - - os: linux - env: TARGET=aarch64-unknown-linux-gnu - rust: stable - - os: osx - osx_image: xcode8.2 - env: TARGET=i386-apple-ios - rust: stable - - os: osx - osx_image: xcode8.2 - env: TARGET=x86_64-apple-ios - rust: stable - - os: linux - env: TARGET=x86_64-rumprun-netbsd - rust: stable - - os: linux - env: TARGET=powerpc-unknown-linux-gnu - rust: stable - - os: linux - env: TARGET=powerpc64-unknown-linux-gnu - rust: beta - - os: linux - env: TARGET=mips-unknown-linux-musl - rust: stable - - os: linux - env: TARGET=mipsel-unknown-linux-musl - rust: stable - - os: linux - env: TARGET=mips64-unknown-linux-gnuabi64 - rust: beta - - os: linux - env: TARGET=mips-unknown-linux-gnu - rust: beta - - # beta - - os: linux - env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 - rust: beta - - os: osx - env: TARGET=x86_64-apple-darwin NO_ADD=1 - rust: beta - - # nightly - - os: linux - env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1 - rust: nightly - - os: osx - env: TARGET=x86_64-apple-darwin NO_ADD=1 - rust: nightly - - # QEMU based targets that compile in an emulator - - os: linux - env: TARGET=x86_64-unknown-freebsd - rust: stable - - os: linux - env: TARGET=x86_64-unknown-openbsd QEMU=openbsd.qcow2 - rust: stable - script: sh ci/run-docker.sh $TARGET - install: - -cache: cargo - -notifications: - email: - on_success: never - webhooks: https://buildbot.rust-lang.org/homu/travis diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/Cargo.toml b/src/tor/src/ext/rust/crates/libc-0.2.22/Cargo.toml deleted file mode 100644 index 2362eec9e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] - -name = "libc" -version = "0.2.22" -authors = ["The Rust Project Developers"] -license = "MIT/Apache-2.0" -readme = "README.md" -repository = "https://github.com/rust-lang/libc" -homepage = "https://github.com/rust-lang/libc" -documentation = "http://doc.rust-lang.org/libc" -description = """ -A library for types and bindings to native C functions often found in libc or -other common platform libraries. -""" - -[features] -default = ["use_std"] -use_std = [] - -[workspace] -members = ["libc-test", "libc-test/generate-files"] diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE b/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE deleted file mode 100644 index 16fe87b06..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-APACHE +++ /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/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT b/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT deleted file mode 100644 index 39d4bdb5a..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2014 The Rust Project Developers - -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/src/tor/src/ext/rust/crates/libc-0.2.22/README.md b/src/tor/src/ext/rust/crates/libc-0.2.22/README.md deleted file mode 100644 index 83ae7b935..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/README.md +++ /dev/null @@ -1,137 +0,0 @@ -libc -==== - -A Rust library with native bindings to the types and functions commonly found on -various systems, including libc. - -[![Build Status](https://travis-ci.org/rust-lang/libc.svg?branch=master)](https://travis-ci.org/rust-lang/libc) -[![Build status](https://ci.appveyor.com/api/projects/status/github/rust-lang/libc?svg=true)](https://ci.appveyor.com/project/rust-lang-libs/libc) - -[Documentation](#platforms-and-documentation) - -## Usage - -First, add the following to your `Cargo.toml`: - -```toml -[dependencies] -libc = "0.2" -``` - -Next, add this to your crate root: - -```rust -extern crate libc; -``` - -Currently libc by default links to the standard library, but if you would -instead like to use libc in a `#![no_std]` situation or crate you can request -this via: - -```toml -[dependencies] -libc = { version = "0.2", default-features = false } -``` - -## What is libc? - -The primary purpose of this crate is to provide all of the definitions necessary -to easily interoperate with C code (or "C-like" code) on each of the platforms -that Rust supports. This includes type definitions (e.g. `c_int`), constants -(e.g. `EINVAL`) as well as function headers (e.g. `malloc`). - -This crate does not strive to have any form of compatibility across platforms, -but rather it is simply a straight binding to the system libraries on the -platform in question. - -## Public API - -This crate exports all underlying platform types, functions, and constants under -the crate root, so all items are accessible as `libc::foo`. The types and values -of all the exported APIs match the platform that libc is compiled for. - -More detailed information about the design of this library can be found in its -[associated RFC][rfc]. - -[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1291-promote-libc.md - -## Adding an API - -Want to use an API which currently isn't bound in `libc`? It's quite easy to add -one! - -The internal structure of this crate is designed to minimize the number of -`#[cfg]` attributes in order to easily be able to add new items which apply -to all platforms in the future. As a result, the crate is organized -hierarchically based on platform. Each module has a number of `#[cfg]`'d -children, but only one is ever actually compiled. Each module then reexports all -the contents of its children. - -This means that for each platform that libc supports, the path from a -leaf module to the root will contain all bindings for the platform in question. -Consequently, this indicates where an API should be added! Adding an API at a -particular level in the hierarchy means that it is supported on all the child -platforms of that level. For example, when adding a Unix API it should be added -to `src/unix/mod.rs`, but when adding a Linux-only API it should be added to -`src/unix/notbsd/linux/mod.rs`. - -If you're not 100% sure at what level of the hierarchy an API should be added -at, fear not! This crate has CI support which tests any binding against all -platforms supported, so you'll see failures if an API is added at the wrong -level or has different signatures across platforms. - -With that in mind, the steps for adding a new API are: - -1. Determine where in the module hierarchy your API should be added. -2. Add the API. -3. Send a PR to this repo. -4. Wait for CI to pass, fixing errors. -5. Wait for a merge! - -### Test before you commit - -We have two automated tests running on [Travis](https://travis-ci.org/rust-lang/libc): - -1. [`libc-test`](https://github.com/alexcrichton/ctest) - - `cd libc-test && cargo run` - - Use the `skip_*()` functions in `build.rs` if you really need a workaround. -2. Style checker - - `rustc ci/style.rs && ./style src` - -## Platforms and Documentation - -The following platforms are currently tested and have documentation available: - -Tested: - * [`i686-pc-windows-msvc`](https://doc.rust-lang.org/libc/i686-pc-windows-msvc/libc/) - * [`x86_64-pc-windows-msvc`](https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc/libc/) - (Windows) - * [`i686-pc-windows-gnu`](https://doc.rust-lang.org/libc/i686-pc-windows-gnu/libc/) - * [`x86_64-pc-windows-gnu`](https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu/libc/) - * [`i686-apple-darwin`](https://doc.rust-lang.org/libc/i686-apple-darwin/libc/) - * [`x86_64-apple-darwin`](https://doc.rust-lang.org/libc/x86_64-apple-darwin/libc/) - (OSX) - * `i386-apple-ios` - * `x86_64-apple-ios` - * [`i686-unknown-linux-gnu`](https://doc.rust-lang.org/libc/i686-unknown-linux-gnu/libc/) - * [`x86_64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu/libc/) - (Linux) - * [`x86_64-unknown-linux-musl`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl/libc/) - (Linux MUSL) - * [`aarch64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu/libc/) - * [`mips-unknown-linux-gnu`](https://doc.rust-lang.org/libc/mips-unknown-linux-gnu/libc/) - * [`arm-unknown-linux-gnueabihf`](https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf/libc/) - * [`arm-linux-androideabi`](https://doc.rust-lang.org/libc/arm-linux-androideabi/libc/) - (Android) - * [`x86_64-unknown-freebsd`](https://doc.rust-lang.org/libc/x86_64-unknown-freebsd/libc/) - * [`x86_64-unknown-openbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-openbsd/libc/) - * [`x86_64-rumprun-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/) - -The following may be supported, but are not guaranteed to always work: - - * `i686-unknown-freebsd` - * [`x86_64-unknown-bitrig`](https://doc.rust-lang.org/libc/x86_64-unknown-bitrig/libc/) - * [`x86_64-unknown-dragonfly`](https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly/libc/) - * `i686-unknown-haiku` - * `x86_64-unknown-haiku` - * [`x86_64-unknown-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/) diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/appveyor.yml b/src/tor/src/ext/rust/crates/libc-0.2.22/appveyor.yml deleted file mode 100644 index b6c666c8b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/appveyor.yml +++ /dev/null @@ -1,25 +0,0 @@ -environment: - matrix: - - TARGET: x86_64-pc-windows-gnu - MSYS2_BITS: 64 - - TARGET: i686-pc-windows-gnu - MSYS2_BITS: 32 - - TARGET: x86_64-pc-windows-msvc - - TARGET: i686-pc-windows-msvc -install: - - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe - - rustup-init.exe -y --default-host %TARGET% - - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - - if defined MSYS2_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS2_BITS%\bin - - rustc -V - - cargo -V - -build: false - -test_script: - - cargo test --target %TARGET% - - cargo run --manifest-path libc-test/Cargo.toml --target %TARGET% - -cache: - - target - - C:\Users\appveyor\.cargo\registry diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/README.md b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/README.md deleted file mode 100644 index 13c7c8da5..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/README.md +++ /dev/null @@ -1,203 +0,0 @@ -The goal of the libc crate is to have CI running everywhere to have the -strongest guarantees about the definitions that this library contains, and as a -result the CI is pretty complicated and also pretty large! Hopefully this can -serve as a guide through the sea of scripts in this directory and elsewhere in -this project. - -# Files - -First up, let's talk about the files in this directory: - -* `run-travis.sh` - a shell script run by all Travis builders, this is - responsible for setting up the rest of the environment such as installing new - packages, downloading Rust target libraries, etc. - -* `run.sh` - the actual script which runs tests for a particular architecture. - Called from the `run-travis.sh` script this will run all tests for the target - specified. - -* `cargo-config` - Cargo configuration of linkers to use copied into place by - the `run-travis.sh` script before builds are run. - -* `dox.sh` - script called from `run-travis.sh` on only the linux 64-bit nightly - Travis bots to build documentation for this crate. - -* `landing-page-*.html` - used by `dox.sh` to generate a landing page for all - architectures' documentation. - -* `run-qemu.sh` - see discussion about QEMU below - -* `mips`, `rumprun` - instructions to build the docker image for each respective - CI target - -# CI Systems - -Currently this repository leverages a combination of Travis CI and AppVeyor for -running tests. The triples tested are: - -* AppVeyor - * `{i686,x86_64}-pc-windows-{msvc,gnu}` -* Travis - * `{i686,x86_64,mips,aarch64}-unknown-linux-gnu` - * `x86_64-unknown-linux-musl` - * `arm-unknown-linux-gnueabihf` - * `arm-linux-androideabi` - * `{i686,x86_64}-apple-{darwin,ios}` - * `x86_64-rumprun-netbsd` - * `x86_64-unknown-freebsd` - * `x86_64-unknown-openbsd` - -The Windows triples are all pretty standard, they just set up their environment -then run tests, no need for downloading any extra target libs (we just download -the right installer). The Intel Linux/OSX builds are similar in that we just -download the right target libs and run tests. Note that the Intel Linux/OSX -builds are run on stable/beta/nightly, but are the only ones that do so. - -The remaining architectures look like: - -* Android runs in a [docker image][android-docker] with an emulator, the NDK, - and the SDK already set up. The entire build happens within the docker image. -* The MIPS, ARM, and AArch64 builds all use the QEMU userspace emulator to run - the generated binary to actually verify the tests pass. -* The MUSL build just has to download a MUSL compiler and target libraries and - then otherwise runs tests normally. -* iOS builds need an extra linker flag currently, but beyond that they're built - as standard as everything else. -* The rumprun target builds an entire kernel from the test suite and then runs - it inside QEMU using the serial console to test whether it succeeded or - failed. -* The BSD builds, currently OpenBSD and FreeBSD, use QEMU to boot up a system - and compile/run tests. More information on that below. - -[android-docker]: https://github.com/rust-lang/rust-buildbot/blob/master/slaves/android/Dockerfile - -## QEMU - -Lots of the architectures tested here use QEMU in the tests, so it's worth going -over all the crazy capabilities QEMU has and the various flavors in which we use -it! - -First up, QEMU has userspace emulation where it doesn't boot a full kernel, it -just runs a binary from another architecture (using the `qemu-` wrappers). -We provide it the runtime path for the dynamically loaded system libraries, -however. This strategy is used for all Linux architectures that aren't intel. -Note that one downside of this QEMU system is that threads are barely -implemented, so we're careful to not spawn many threads. - -For the rumprun target the only output is a kernel image, so we just use that -plus the `rumpbake` command to create a full kernel image which is then run from -within QEMU. - -Finally, the fun part, the BSDs. Quite a few hoops are jumped through to get CI -working for these platforms, but the gist of it looks like: - -* Cross compiling from Linux to any of the BSDs seems to be quite non-standard. - We may be able to get it working but it might be difficult at that point to - ensure that the libc definitions align with what you'd get on the BSD itself. - As a result, we try to do compiles within the BSD distro. -* On Travis we can't run a VM-in-a-VM, so we resort to userspace emulation - (QEMU). -* Unfortunately on Travis we also can't use KVM, so the emulation is super slow. - -With all that in mind, the way BSD is tested looks like: - -1. Download a pre-prepared image for the OS being tested. -2. Generate the tests for the OS being tested. This involves running the `ctest` - library over libc to generate a Rust file and a C file which will then be - compiled into the final test. -3. Generate a disk image which will later be mounted by the OS being tested. - This image is mostly just the libc directory, but some modifications are made - to compile the generated files from step 2. -4. The kernel is booted in QEMU, and it is configured to detect the libc-test - image being available, run the test script, and then shut down afterwards. -5. Look for whether the tests passed in the serial console output of the kernel. - -There's some pretty specific instructions for setting up each image (detailed -below), but the main gist of this is that we must avoid a vanilla `cargo run` -inside of the `libc-test` directory (which is what it's intended for) because -that would compile `syntex_syntax`, a large library, with userspace emulation. -This invariably times out on Travis, so we can't do that. - -Once all those hoops are jumped through, however, we can be happy that we're -testing almost everything! - -Below are some details of how to set up the initial OS images which are -downloaded. Each image must be enabled have input/output over the serial -console, log in automatically at the serial console, detect if a second drive in -QEMU is available, and if so mount it, run a script (it'll specifically be -`run-qemu.sh` in this folder which is copied into the generated image talked -about above), and then shut down. - -### QEMU setup - FreeBSD - -1. Download CD installer (most minimal is fine) -2. `qemu-img create -f qcow2 foo.qcow2 2G` -3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user` -4. run installer -5. `echo 'console="comconsole"' >> /boot/loader.conf` -6. `echo 'autoboot_delay="0"' >> /boot/loader.conf` -7. look at /etc/ttys, see what getty argument is for ttyu0 -8. edit /etc/gettytab, look for ttyu0 argument, prepend `:al=root` to line - beneath - -(note that the current image has a `freebsd` user, but this isn't really -necessary) - -Once that's done, arrange for this script to run at login: - -``` -#!/bin/sh - -sudo kldload ext2fs -[ -e /dev/vtbd1 ] || exit 0 -sudo mount -t ext2fs /dev/vtbd1 /mnt -sh /mnt/run.sh /mnt -sudo poweroff -``` - -Helpful links - -* https://en.wikibooks.org/wiki/QEMU/Images -* https://blog.nekoconeko.nl/blog/2015/06/04/creating-an-openstack-freebsd-image.html -* https://www.freebsd.org/doc/handbook/serialconsole-setup.html - - -### QEMU setup - OpenBSD - -1. Download CD installer -2. `qemu-img create -f qcow2 foo.qcow2 2G` -3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user` -4. run installer -5. `echo 'set tty com0' >> /etc/boot.conf` -6. `echo 'boot' >> /etc/boot.conf` -7. Modify /etc/ttys, change the `tty00` at the end from 'unknown off' to - 'vt220 on secure' -8. Modify same line in /etc/ttys to have `"/root/foo.sh"` as the shell -9. Add this script to `/root/foo.sh` - -``` -#!/bin/sh -exec 1>/dev/tty00 -exec 2>&1 - -if mount -t ext2fs /dev/sd1c /mnt; then - sh /mnt/run.sh /mnt - shutdown -ph now -fi - -# limited shell... -exec /bin/sh < /dev/tty00 -``` - -10. `chmod +x /root/foo.sh` - -Helpful links: - -* https://en.wikibooks.org/wiki/QEMU/Images -* http://www.openbsd.org/faq/faq7.html#SerCon - -# Questions? - -Hopefully that's at least somewhat of an introduction to everything going on -here, and feel free to ping @alexcrichton with questions! - diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh deleted file mode 100644 index 8d8f60a5e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-accept-licenses.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/expect -f -# ignore-license - -set timeout 1800 -set cmd [lindex $argv 0] -set licenses [lindex $argv 1] - -spawn {*}$cmd -expect { - "Do you accept the license '*'*" { - exp_send "y\r" - exp_continue - } - eof -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh deleted file mode 100644 index 75bcd20f2..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-ndk.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# Copyright 2016 The Rust Project Developers. See the COPYRIGHT -# file at the top-level directory of this distribution and at -# http://rust-lang.org/COPYRIGHT. -# -# Licensed under the Apache License, Version 2.0 or the MIT license -# , at your -# option. This file may not be copied, modified, or distributed -# except according to those terms. - -set -ex - -curl -O https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip -unzip -q android-ndk-r13b-linux-x86_64.zip - -case "$1" in - aarch64) - arch=arm64 - ;; - - i686) - arch=x86 - ;; - - *) - arch=$1 - ;; -esac; - -android-ndk-r13b/build/tools/make_standalone_toolchain.py \ - --install-dir /android/ndk-$1 \ - --arch $arch \ - --api 24 - -rm -rf ./android-ndk-r13b-linux-x86_64.zip ./android-ndk-r13b diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh deleted file mode 100644 index d03b7623b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/android-install-sdk.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -# Copyright 2016 The Rust Project Developers. See the COPYRIGHT -# file at the top-level directory of this distribution and at -# http://rust-lang.org/COPYRIGHT. -# -# Licensed under the Apache License, Version 2.0 or the MIT license -# , at your -# option. This file may not be copied, modified, or distributed -# except according to those terms. - -set -ex - -# Prep the SDK and emulator -# -# Note that the update process requires that we accept a bunch of licenses, and -# we can't just pipe `yes` into it for some reason, so we take the same strategy -# located in https://github.com/appunite/docker by just wrapping it in a script -# which apparently magically accepts the licenses. - -mkdir sdk -curl https://dl.google.com/android/repository/tools_r25.2.5-linux.zip -O -unzip -d sdk tools_r25.2.5-linux.zip - -filter="platform-tools,android-24" - -case "$1" in - arm | armv7) - abi=armeabi-v7a - ;; - - aarch64) - abi=arm64-v8a - ;; - - i686) - abi=x86 - ;; - - x86_64) - abi=x86_64 - ;; - - *) - echo "invalid arch: $1" - exit 1 - ;; -esac; - -filter="$filter,sys-img-$abi-android-24" - -./android-accept-licenses.sh "android - update sdk -a --no-ui --filter $filter" - -echo "no" | android create avd \ - --name $1 \ - --target android-24 \ - --abi $abi diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile deleted file mode 100644 index 7ad84926b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-linux-android/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM ubuntu:16.04 - -RUN dpkg --add-architecture i386 && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - file \ - curl \ - ca-certificates \ - python \ - unzip \ - expect \ - openjdk-9-jre \ - libstdc++6:i386 \ - libpulse0 \ - gcc \ - libc6-dev - -WORKDIR /android/ -COPY android* /android/ - -ENV ANDROID_ARCH=aarch64 -ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools - -RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -RUN mv /root/.android /tmp -RUN chmod 777 -R /tmp/.android -RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* - -ENV PATH=$PATH:/rust/bin \ - CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \ - HOME=/tmp diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile deleted file mode 100644 index 2ba69e154..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/aarch64-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ubuntu:16.10 -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev ca-certificates \ - gcc-aarch64-linux-gnu libc6-dev-arm64-cross qemu-user -ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile deleted file mode 100644 index 054941416..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-linux-androideabi/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM ubuntu:16.04 - -RUN dpkg --add-architecture i386 && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - file \ - curl \ - ca-certificates \ - python \ - unzip \ - expect \ - openjdk-9-jre \ - libstdc++6:i386 \ - libpulse0 \ - gcc \ - libc6-dev - -WORKDIR /android/ -COPY android* /android/ - -ENV ANDROID_ARCH=arm -ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools - -RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -RUN mv /root/.android /tmp -RUN chmod 777 -R /tmp/.android -RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* - -ENV PATH=$PATH:/rust/bin \ - CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \ - HOME=/tmp diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile deleted file mode 100644 index 3824c0466..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ubuntu:16.10 -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev ca-certificates \ - gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user -ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile deleted file mode 100644 index bee904379..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-linux-android/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM ubuntu:16.04 - -RUN dpkg --add-architecture i386 && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - file \ - curl \ - ca-certificates \ - python \ - unzip \ - expect \ - openjdk-9-jre \ - libstdc++6:i386 \ - libpulse0 \ - gcc \ - libc6-dev - -WORKDIR /android/ -COPY android* /android/ - -ENV ANDROID_ARCH=i686 -ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools - -RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -RUN mv /root/.android /tmp -RUN chmod 777 -R /tmp/.android -RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* - -ENV PATH=$PATH:/rust/bin \ - CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \ - HOME=/tmp diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile deleted file mode 100644 index c149d8407..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ubuntu:16.10 -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc-multilib libc6-dev ca-certificates -ENV PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile deleted file mode 100644 index bdc2272a3..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/i686-unknown-linux-musl/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:16.10 - -RUN dpkg --add-architecture i386 -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc-multilib make libc6-dev git curl ca-certificates libc6:i386 -# Below we're cross-compiling musl for i686 using the system compiler on an -# x86_64 system. This is an awkward thing to be doing and so we have to jump -# through a couple hoops to get musl to be happy. In particular: -# -# * We specifically pass -m32 in CFLAGS and override CC when running ./configure, -# since otherwise the script will fail to find a compiler. -# * We manually unset CROSS_COMPILE when running make; otherwise the makefile -# will call the non-existent binary 'i686-ar'. -RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \ - tar xzf - && \ - cd musl-1.1.15 && \ - CC=gcc CFLAGS=-m32 ./configure --prefix=/musl-i686 --disable-shared --target=i686 && \ - make CROSS_COMPILE= install -j4 && \ - cd .. && \ - rm -rf musl-1.1.15 -ENV PATH=$PATH:/musl-i686/bin:/rust/bin \ - CC_i686_unknown_linux_musl=musl-gcc diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile deleted file mode 100644 index eea1f652c..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ - gcc-mips-linux-gnu libc6-dev-mips-cross \ - qemu-system-mips - -ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile deleted file mode 100644 index cbc41c24d..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips-unknown-linux-musl/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \ - bzip2 - -RUN mkdir /toolchain - -# Note that this originally came from: -# https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 -RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ - tar xjf - -C /toolchain --strip-components=1 - -ENV PATH=$PATH:/rust/bin:/toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15/bin \ - CC_mips_unknown_linux_musl=mips-openwrt-linux-gcc \ - CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=mips-openwrt-linux-gcc diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile deleted file mode 100644 index 2eb5de245..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ - gcc-mips64-linux-gnuabi64 libc6-dev-mips64-cross \ - qemu-system-mips64 - -ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_LINKER=mips64-linux-gnuabi64-gcc \ - CC_mips64_unknown_linux_gnuabi64=mips64-linux-gnuabi64-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile deleted file mode 100644 index 4c7ee8bcf..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/mipsel-unknown-linux-musl/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \ - bzip2 - -RUN mkdir /toolchain - -# Note that this originally came from: -# https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 -RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \ - tar xjf - -C /toolchain --strip-components=2 - -ENV PATH=$PATH:/rust/bin:/toolchain/bin \ - CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ - CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile deleted file mode 100644 index d9d7db0f4..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ - gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \ - qemu-system-ppc - -ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile deleted file mode 100644 index df0e6057b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ - gcc-powerpc64-linux-gnu libc6-dev-ppc64-cross \ - qemu-system-ppc - -ENV CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_LINKER=powerpc64-linux-gnu-gcc \ - CC=powerpc64-linux-gnu-gcc \ - PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile deleted file mode 100644 index bf4793e06..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-linux-android/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM ubuntu:16.04 - -RUN dpkg --add-architecture i386 && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - file \ - curl \ - ca-certificates \ - python \ - unzip \ - expect \ - openjdk-9-jre \ - libstdc++6:i386 \ - libpulse0 \ - gcc \ - libc6-dev - -WORKDIR /android/ -COPY android* /android/ - -ENV ANDROID_ARCH=x86_64 -ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools - -RUN sh /android/android-install-ndk.sh $ANDROID_ARCH -RUN sh /android/android-install-sdk.sh $ANDROID_ARCH -RUN mv /root/.android /tmp -RUN chmod 777 -R /tmp/.android -RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/* - -ENV PATH=$PATH:/rust/bin \ - CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android-gcc \ - HOME=/tmp diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile deleted file mode 100644 index 129771e76..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-rumprun-netbsd/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM mato/rumprun-toolchain-hw-x86_64 -USER root -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - qemu -ENV PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile deleted file mode 100644 index 12b0bdffc..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-freebsd/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM alexcrichton/rust-slave-linux-cross:2016-04-15 -USER root - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - qemu genext2fs - -ENTRYPOINT ["sh"] - -ENV PATH=$PATH:/rust/bin \ - QEMU=2016-11-06/freebsd.qcow2.gz \ - CAN_CROSS=1 \ - CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_LINKER=x86_64-unknown-freebsd10-gcc diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile deleted file mode 100644 index 4af3f834c..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-gnu/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ubuntu:16.10 -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev ca-certificates -ENV PATH=$PATH:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile deleted file mode 100644 index 9c2499948..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-linux-musl/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc make libc6-dev git curl ca-certificates -RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \ - tar xzf - && \ - cd musl-1.1.15 && \ - ./configure --prefix=/musl-x86_64 && \ - make install -j4 && \ - cd .. && \ - rm -rf musl-1.1.15 -ENV PATH=$PATH:/musl-x86_64/bin:/rust/bin diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile deleted file mode 100644 index 518baf870..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/docker/x86_64-unknown-openbsd/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ubuntu:16.10 - -RUN apt-get update -RUN apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu curl ca-certificates \ - genext2fs -ENV PATH=$PATH:/rust/bin \ - QEMU=2016-11-06/openbsd-6.0-without-pkgs.qcow2 diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/dox.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/dox.sh deleted file mode 100644 index 85e924394..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/dox.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -# Builds documentation for all target triples that we have a registered URL for -# in liblibc. This scrapes the list of triples to document from `src/lib.rs` -# which has a bunch of `html_root_url` directives we pick up. - -set -e - -TARGETS=`grep html_root_url src/lib.rs | sed 's/.*".*\/\(.*\)"/\1/'` - -rm -rf target/doc -mkdir -p target/doc - -cp ci/landing-page-head.html target/doc/index.html - -for target in $TARGETS; do - echo documenting $target - - rustdoc -o target/doc/$target --target $target src/lib.rs --cfg dox \ - --crate-name libc - - echo "
    • $target
    • " \ - >> target/doc/index.html -done - -cat ci/landing-page-footer.html >> target/doc/index.html - -# If we're on travis, not a PR, and on the right branch, publish! -if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then - pip install ghp_import --install-option="--prefix=$HOME/.local" - $HOME/.local/bin/ghp-import -n target/doc - git push -qf https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages -fi diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs deleted file mode 100644 index b14615036..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/ios/deploy_and_run_on_ios_simulator.rs +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// This is a script to deploy and execute a binary on an iOS simulator. -// The primary use of this is to be able to run unit tests on the simulator and -// retrieve the results. -// -// To do this through Cargo instead, use Dinghy -// (https://github.com/snipsco/dinghy): cargo dinghy install, then cargo dinghy -// test. - -use std::env; -use std::fs::{self, File}; -use std::io::Write; -use std::path::Path; -use std::process; -use std::process::Command; - -macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with: {}", stringify!($e), e), - }) -} - -// Step one: Wrap as an app -fn package_as_simulator_app(crate_name: &str, test_binary_path: &Path) { - println!("Packaging simulator app"); - drop(fs::remove_dir_all("ios_simulator_app")); - t!(fs::create_dir("ios_simulator_app")); - t!(fs::copy(test_binary_path, - Path::new("ios_simulator_app").join(crate_name))); - - let mut f = t!(File::create("ios_simulator_app/Info.plist")); - t!(f.write_all(format!(r#" - - - - - CFBundleExecutable - {} - CFBundleIdentifier - com.rust.unittests - - - "#, crate_name).as_bytes())); -} - -// Step two: Start the iOS simulator -fn start_simulator() { - println!("Looking for iOS simulator"); - let output = t!(Command::new("xcrun").arg("simctl").arg("list").output()); - assert!(output.status.success()); - let mut simulator_exists = false; - let mut simulator_booted = false; - let mut found_rust_sim = false; - let stdout = t!(String::from_utf8(output.stdout)); - for line in stdout.lines() { - if line.contains("rust_ios") { - if found_rust_sim { - panic!("Duplicate rust_ios simulators found. Please \ - double-check xcrun simctl list."); - } - simulator_exists = true; - simulator_booted = line.contains("(Booted)"); - found_rust_sim = true; - } - } - - if simulator_exists == false { - println!("Creating iOS simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("create") - .arg("rust_ios") - .arg("com.apple.CoreSimulator.SimDeviceType.iPhone-SE") - .arg("com.apple.CoreSimulator.SimRuntime.iOS-10-2") - .check_status(); - } else if simulator_booted == true { - println!("Shutting down already-booted simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("shutdown") - .arg("rust_ios") - .check_status(); - } - - println!("Starting iOS simulator"); - // We can't uninstall the app (if present) as that will hang if the - // simulator isn't completely booted; just erase the simulator instead. - Command::new("xcrun").arg("simctl").arg("erase").arg("rust_ios").check_status(); - Command::new("xcrun").arg("simctl").arg("boot").arg("rust_ios").check_status(); -} - -// Step three: Install the app -fn install_app_to_simulator() { - println!("Installing app to simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("install") - .arg("booted") - .arg("ios_simulator_app/") - .check_status(); -} - -// Step four: Run the app -fn run_app_on_simulator() { - println!("Running app"); - let output = t!(Command::new("xcrun") - .arg("simctl") - .arg("launch") - .arg("--console") - .arg("booted") - .arg("com.rust.unittests") - .output()); - - println!("stdout --\n{}\n", String::from_utf8_lossy(&output.stdout)); - println!("stderr --\n{}\n", String::from_utf8_lossy(&output.stderr)); - - let stdout = String::from_utf8_lossy(&output.stdout); - let passed = stdout.lines() - .find(|l| l.contains("PASSED")) - .map(|l| l.contains("tests")) - .unwrap_or(false); - - println!("Shutting down simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("shutdown") - .arg("rust_ios") - .check_status(); - if !passed { - panic!("tests didn't pass"); - } -} - -trait CheckStatus { - fn check_status(&mut self); -} - -impl CheckStatus for Command { - fn check_status(&mut self) { - println!("\trunning: {:?}", self); - assert!(t!(self.status()).success()); - } -} - -fn main() { - let args: Vec = env::args().collect(); - if args.len() != 2 { - println!("Usage: {} ", args[0]); - process::exit(-1); - } - - let test_binary_path = Path::new(&args[1]); - let crate_name = test_binary_path.file_name().unwrap(); - - package_as_simulator_app(crate_name.to_str().unwrap(), test_binary_path); - start_simulator(); - install_app_to_simulator(); - run_app_on_simulator(); -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html deleted file mode 100644 index 941cc8d2b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-footer.html +++ /dev/null @@ -1,3 +0,0 @@ -
    - - diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html deleted file mode 100644 index fc69fa88e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/landing-page-head.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - -
      diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh deleted file mode 100644 index e963078af..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-docker.sh +++ /dev/null @@ -1,36 +0,0 @@ -# Small script to run tests for a target (or all targets) inside all the -# respective docker images. - -set -ex - -run() { - echo $1 - # use -f so we can use ci/ as build context - docker build -t libc -f ci/docker/$1/Dockerfile ci/ - mkdir -p target - if [ -w /dev/kvm ]; then - kvm="--volume /dev/kvm:/dev/kvm" - fi - docker run \ - --user `id -u`:`id -g` \ - --rm \ - --volume $HOME/.cargo:/cargo \ - $kvm \ - --env CARGO_HOME=/cargo \ - --volume `rustc --print sysroot`:/rust:ro \ - --volume `pwd`:/checkout:ro \ - --volume `pwd`/target:/checkout/target \ - --env CARGO_TARGET_DIR=/checkout/target \ - --workdir /checkout \ - --privileged \ - libc \ - ci/run.sh $1 -} - -if [ -z "$1" ]; then - for d in `ls ci/docker/`; do - run $d - done -else - run $1 -fi diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh deleted file mode 100644 index b2f457df9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run-qemu.sh +++ /dev/null @@ -1,32 +0,0 @@ -# Initial script which is run inside of all qemu images. The first argument to -# this script (as arranged by the qemu image itself) is the path to where the -# libc crate is mounted. -# -# For qemu images we currently need to install Rust manually as this wasn't done -# by the initial run-travis.sh script -# -# FIXME: feels like run-travis.sh should be responsible for downloading the -# compiler. - -set -ex - -ROOT=$1 -cp -r $ROOT/libc /tmp/libc -cd /tmp/libc - -TARGET=$(cat $ROOT/TARGET) -export CARGO_TARGET_DIR=/tmp - -case $TARGET in - *-openbsd) - pkg_add cargo gcc%4.9 rust - export CC=egcc - ;; - - *) - echo "Unknown target: $TARGET" - exit 1 - ;; -esac - -exec sh ci/run.sh $TARGET diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run.sh b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run.sh deleted file mode 100644 index 4b8825f8d..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/run.sh +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/sh - -# Builds and runs tests for a particular target passed as an argument to this -# script. - -set -ex - -TARGET=$1 - -# If we're going to run tests inside of a qemu image, then we don't need any of -# the scripts below. Instead, download the image, prepare a filesystem which has -# the current state of this repository, and then run the image. -# -# It's assume that all images, when run with two disks, will run the `run.sh` -# script from the second which we place inside. -if [ "$QEMU" != "" ]; then - tmpdir=/tmp/qemu-img-creation - mkdir -p $tmpdir - - if [ -z "${QEMU#*.gz}" ]; then - # image is .gz : download and uncompress it - qemufile=$(echo ${QEMU%.gz} | sed 's/\//__/g') - if [ ! -f $tmpdir/$qemufile ]; then - curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU | \ - gunzip -d > $tmpdir/$qemufile - fi - else - # plain qcow2 image: just download it - qemufile=$(echo ${QEMU} | sed 's/\//__/g') - if [ ! -f $tmpdir/$qemufile ]; then - curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU \ - > $tmpdir/$qemufile - fi - fi - - # Create a mount a fresh new filesystem image that we'll later pass to QEMU. - # This will have a `run.sh` script will which use the artifacts inside to run - # on the host. - rm -f $tmpdir/libc-test.img - mkdir $tmpdir/mount - - # If we have a cross compiler, then we just do the standard rigamarole of - # cross-compiling an executable and then the script to run just executes the - # binary. - # - # If we don't have a cross-compiler, however, then we need to do some crazy - # acrobatics to get this to work. Generate all.{c,rs} on the host which will - # be compiled inside QEMU. Do this here because compiling syntex_syntax in - # QEMU would time out basically everywhere. - if [ "$CAN_CROSS" = "1" ]; then - cargo build --manifest-path libc-test/Cargo.toml --target $TARGET - cp $CARGO_TARGET_DIR/$TARGET/debug/libc-test $tmpdir/mount/ - echo 'exec $1/libc-test' > $tmpdir/mount/run.sh - else - rm -rf $tmpdir/generated - mkdir -p $tmpdir/generated - cargo build --manifest-path libc-test/generate-files/Cargo.toml - (cd libc-test && TARGET=$TARGET OUT_DIR=$tmpdir/generated SKIP_COMPILE=1 \ - $CARGO_TARGET_DIR/debug/generate-files) - - # Copy this folder into the mounted image, the `run.sh` entry point, and - # overwrite the standard libc-test Cargo.toml with the overlay one which will - # assume the all.{c,rs} test files have already been generated - mkdir $tmpdir/mount/libc - cp -r Cargo.* libc-test src ci $tmpdir/mount/libc/ - ln -s libc-test/target $tmpdir/mount/libc/target - cp ci/run-qemu.sh $tmpdir/mount/run.sh - echo $TARGET | tee -a $tmpdir/mount/TARGET - cp $tmpdir/generated/* $tmpdir/mount/libc/libc-test - cp libc-test/run-generated-Cargo.toml $tmpdir/mount/libc/libc-test/Cargo.toml - fi - - du -sh $tmpdir/mount - genext2fs \ - --root $tmpdir/mount \ - --size-in-blocks 100000 \ - $tmpdir/libc-test.img - - # Pass -snapshot to prevent tampering with the disk images, this helps when - # running this script in development. The two drives are then passed next, - # first is the OS and second is the one we just made. Next the network is - # configured to work (I'm not entirely sure how), and then finally we turn off - # graphics and redirect the serial console output to out.log. - qemu-system-x86_64 \ - -m 1024 \ - -snapshot \ - -drive if=virtio,file=$tmpdir/$qemufile \ - -drive if=virtio,file=$tmpdir/libc-test.img \ - -net nic,model=virtio \ - -net user \ - -nographic \ - -vga none 2>&1 | tee $CARGO_TARGET_DIR/out.log - exec grep "^PASSED .* tests" $CARGO_TARGET_DIR/out.log -fi - -case "$TARGET" in - *-apple-ios) - cargo rustc --manifest-path libc-test/Cargo.toml --target $TARGET -- \ - -C link-args=-mios-simulator-version-min=7.0 - ;; - - *) - cargo build --manifest-path libc-test/Cargo.toml --target $TARGET - ;; -esac - -case "$TARGET" in - arm-linux-androideabi | aarch64-linux-android | i686-linux-android | x86_64-linux-android) - # set SHELL so android can detect a 64bits system, see - # http://stackoverflow.com/a/41789144 - # https://issues.jenkins-ci.org/browse/JENKINS-26930?focusedCommentId=230791&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-230791 - export SHELL=/bin/dash - arch=$(echo $TARGET | cut -d- -f1) - accel="-no-accel" - if emulator -accel-check; then - accel="" - fi - emulator @$arch -no-window $accel & - adb wait-for-device - adb push $CARGO_TARGET_DIR/$TARGET/debug/libc-test /data/local/tmp/libc-test - adb shell /data/local/tmp/libc-test 2>&1 | tee /tmp/out - grep "^PASSED .* tests" /tmp/out - ;; - - i386-apple-ios) - rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs - ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - x86_64-apple-ios) - rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs - ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - arm-unknown-linux-gnueabihf) - qemu-arm -L /usr/arm-linux-gnueabihf $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - mips-unknown-linux-gnu) - qemu-mips -L /usr/mips-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - mips64-unknown-linux-gnuabi64) - qemu-mips64 -L /usr/mips64-linux-gnuabi64 $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - mips-unknown-linux-musl) - qemu-mips -L /toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15 \ - $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - mipsel-unknown-linux-musl) - qemu-mipsel -L /toolchain $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - powerpc-unknown-linux-gnu) - qemu-ppc -L /usr/powerpc-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - powerpc64-unknown-linux-gnu) - qemu-ppc64 -L /usr/powerpc64-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - aarch64-unknown-linux-gnu) - qemu-aarch64 -L /usr/aarch64-linux-gnu/ $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; - - *-rumprun-netbsd) - rumprun-bake hw_virtio /tmp/libc-test.img $CARGO_TARGET_DIR/$TARGET/debug/libc-test - qemu-system-x86_64 -nographic -vga none -m 64 \ - -kernel /tmp/libc-test.img 2>&1 | tee /tmp/out & - sleep 5 - grep "^PASSED .* tests" /tmp/out - ;; - - *) - $CARGO_TARGET_DIR/$TARGET/debug/libc-test - ;; -esac diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/style.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/ci/style.rs deleted file mode 100644 index 32e4ba772..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/ci/style.rs +++ /dev/null @@ -1,204 +0,0 @@ -//! Simple script to verify the coding style of this library -//! -//! ## How to run -//! -//! The first argument to this script is the directory to run on, so running -//! this script should be as simple as: -//! -//! ```notrust -//! rustc ci/style.rs -//! ./style src -//! ``` -//! -//! ## Guidelines -//! -//! The current style is: -//! -//! * No trailing whitespace -//! * No tabs -//! * 80-character lines -//! * `extern` instead of `extern "C"` -//! * Specific module layout: -//! 1. use directives -//! 2. typedefs -//! 3. structs -//! 4. constants -//! 5. f! { ... } functions -//! 6. extern functions -//! 7. modules + pub use -//! -//! Things not verified: -//! -//! * alignment -//! * 4-space tabs -//! * leading colons on paths - -use std::env; -use std::fs; -use std::io::prelude::*; -use std::path::Path; - -macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) -} - -fn main() { - let arg = env::args().skip(1).next().unwrap_or(".".to_string()); - - let mut errors = Errors { errs: false }; - walk(Path::new(&arg), &mut errors); - - if errors.errs { - panic!("found some lint errors"); - } else { - println!("good style!"); - } -} - -fn walk(path: &Path, err: &mut Errors) { - for entry in t!(path.read_dir()).map(|e| t!(e)) { - let path = entry.path(); - if t!(entry.file_type()).is_dir() { - walk(&path, err); - continue - } - - let name = entry.file_name().into_string().unwrap(); - match &name[..] { - n if !n.ends_with(".rs") => continue, - - "dox.rs" | - "lib.rs" | - "macros.rs" => continue, - - _ => {} - } - - let mut contents = String::new(); - t!(t!(fs::File::open(&path)).read_to_string(&mut contents)); - - check_style(&contents, &path, err); - } -} - -struct Errors { - errs: bool, -} - -#[derive(Clone, Copy, PartialEq)] -enum State { - Start, - Imports, - Typedefs, - Structs, - Constants, - FunctionDefinitions, - Functions, - Modules, -} - -fn check_style(file: &str, path: &Path, err: &mut Errors) { - let mut state = State::Start; - let mut s_macros = 0; - let mut f_macros = 0; - let mut prev_blank = false; - - for (i, line) in file.lines().enumerate() { - if line == "" { - if prev_blank { - err.error(path, i, "double blank line"); - } - prev_blank = true; - } else { - prev_blank = false; - } - if line != line.trim_right() { - err.error(path, i, "trailing whitespace"); - } - if line.contains("\t") { - err.error(path, i, "tab character"); - } - if line.len() > 80 { - err.error(path, i, "line longer than 80 chars"); - } - if line.contains("extern \"C\"") { - err.error(path, i, "use `extern` instead of `extern \"C\""); - } - if line.contains("#[cfg(") && !line.contains(" if ") { - if state != State::Structs { - err.error(path, i, "use cfg_if! and submodules \ - instead of #[cfg]"); - } - } - - let line = line.trim_left(); - let is_pub = line.starts_with("pub "); - let line = if is_pub {&line[4..]} else {line}; - - let line_state = if line.starts_with("use ") { - if is_pub { - State::Modules - } else { - State::Imports - } - } else if line.starts_with("const ") { - State::Constants - } else if line.starts_with("type ") { - State::Typedefs - } else if line.starts_with("s! {") { - s_macros += 1; - State::Structs - } else if line.starts_with("f! {") { - f_macros += 1; - State::FunctionDefinitions - } else if line.starts_with("extern ") { - State::Functions - } else if line.starts_with("mod ") { - State::Modules - } else { - continue - }; - - if state as usize > line_state as usize { - err.error(path, i, &format!("{} found after {} when \ - it belongs before", - line_state.desc(), state.desc())); - } - - if f_macros == 2 { - f_macros += 1; - err.error(path, i, "multiple f! macros in one module"); - } - if s_macros == 2 { - s_macros += 1; - err.error(path, i, "multiple s! macros in one module"); - } - - state = line_state; - } -} - -impl State { - fn desc(&self) -> &str { - match *self { - State::Start => "start", - State::Imports => "import", - State::Typedefs => "typedef", - State::Structs => "struct", - State::Constants => "constant", - State::FunctionDefinitions => "function definition", - State::Functions => "extern function", - State::Modules => "module", - } - } -} - -impl Errors { - fn error(&mut self, path: &Path, line: usize, msg: &str) { - self.errs = true; - println!("{}:{} - {}", path.display(), line + 1, msg); - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/dox.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/dox.rs deleted file mode 100644 index fbec3f2d4..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/dox.rs +++ /dev/null @@ -1,172 +0,0 @@ -pub use self::imp::*; - -#[cfg(not(dox))] -mod imp { - pub use core::option::Option; - pub use core::clone::Clone; - pub use core::marker::Copy; - pub use core::mem; -} - -#[cfg(dox)] -mod imp { - pub enum Option { - Some(T), - None, - } - impl Copy for Option {} - impl Clone for Option { - fn clone(&self) -> Option { loop {} } - } - - pub trait Clone { - fn clone(&self) -> Self; - } - - #[lang = "copy"] - pub trait Copy {} - - #[lang = "sync"] - pub trait Sync {} - impl Sync for T {} - - #[lang = "sized"] - pub trait Sized {} - - macro_rules! each_int { - ($mac:ident) => ( - $mac!(u8); - $mac!(u16); - $mac!(u32); - $mac!(u64); - $mac!(usize); - each_signed_int!($mac); - ) - } - - macro_rules! each_signed_int { - ($mac:ident) => ( - $mac!(i8); - $mac!(i16); - $mac!(i32); - $mac!(i64); - $mac!(isize); - ) - } - - #[lang = "div"] - pub trait Div { - type Output; - fn div(self, rhs: RHS) -> Self::Output; - } - - macro_rules! impl_div { - ($($i:ident)*) => ($( - impl Div<$i> for $i { - type Output = $i; - fn div(self, rhs: $i) -> $i { self / rhs } - } - )*) - } - each_int!(impl_div); - - #[lang = "shl"] - pub trait Shl { - type Output; - fn shl(self, rhs: RHS) -> Self::Output; - } - - macro_rules! impl_shl { - ($($i:ident)*) => ($( - impl Shl<$i> for $i { - type Output = $i; - fn shl(self, rhs: $i) -> $i { self << rhs } - } - )*) - } - each_int!(impl_shl); - - #[lang = "mul"] - pub trait Mul { - type Output; - fn mul(self, rhs: RHS) -> Self::Output; - } - - macro_rules! impl_mul { - ($($i:ident)*) => ($( - impl Mul for $i { - type Output = $i; - fn mul(self, rhs: $i) -> $i { self * rhs } - } - )*) - } - each_int!(impl_mul); - - #[lang = "sub"] - pub trait Sub { - type Output; - fn sub(self, rhs: RHS) -> Self::Output; - } - - macro_rules! impl_sub { - ($($i:ident)*) => ($( - impl Sub for $i { - type Output = $i; - fn sub(self, rhs: $i) -> $i { self - rhs } - } - )*) - } - each_int!(impl_sub); - - #[lang = "bitor"] - pub trait Bitor { - type Output; - fn bitor(self, rhs: RHS) -> Self::Output; - } - - macro_rules! impl_bitor { - ($($i:ident)*) => ($( - impl Bitor for $i { - type Output = $i; - fn bitor(self, rhs: $i) -> $i { self | rhs } - } - )*) - } - each_int!(impl_bitor); - - #[lang = "neg"] - pub trait Neg { - type Output; - fn neg(self) -> Self::Output; - } - - macro_rules! impl_neg { - ($($i:ident)*) => ($( - impl Neg for $i { - type Output = $i; - fn neg(self) -> $i { -self } - } - )*) - } - each_signed_int!(impl_neg); - - #[lang = "not"] - pub trait Not { - type Output; - fn not(self) -> Self::Output; - } - - macro_rules! impl_not { - ($($i:ident)*) => ($( - impl Not for $i { - type Output = $i; - fn not(self) -> $i { !self } - } - )*) - } - each_int!(impl_not); - - pub mod mem { - pub fn size_of_val(_: &T) -> usize { 4 } - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/lib.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/lib.rs deleted file mode 100644 index c17a50478..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/lib.rs +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Crate docs - -#![allow(bad_style, overflowing_literals, improper_ctypes)] -#![crate_type = "rlib"] -#![crate_name = "libc"] -#![cfg_attr(dox, feature(no_core, lang_items))] -#![cfg_attr(dox, no_core)] -#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", - html_favicon_url = "https://doc.rust-lang.org/favicon.ico")] - -#![cfg_attr(all(target_os = "linux", target_arch = "x86_64"), doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu" -))] -#![cfg_attr(all(target_os = "linux", target_arch = "x86"), doc( - html_root_url = "https://doc.rust-lang.org/libc/i686-unknown-linux-gnu" -))] -#![cfg_attr(all(target_os = "linux", target_arch = "arm"), doc( - html_root_url = "https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf" -))] -#![cfg_attr(all(target_os = "linux", target_arch = "mips"), doc( - html_root_url = "https://doc.rust-lang.org/libc/mips-unknown-linux-gnu" -))] -#![cfg_attr(all(target_os = "linux", target_arch = "aarch64"), doc( - html_root_url = "https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu" -))] -#![cfg_attr(all(target_os = "linux", target_env = "musl"), doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl" -))] -#![cfg_attr(all(target_os = "macos", target_arch = "x86_64"), doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-apple-darwin" -))] -#![cfg_attr(all(target_os = "macos", target_arch = "x86"), doc( - html_root_url = "https://doc.rust-lang.org/libc/i686-apple-darwin" -))] -#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "gnu"), doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu" -))] -#![cfg_attr(all(windows, target_arch = "x86", target_env = "gnu"), doc( - html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-gnu" -))] -#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "msvc"), doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc" -))] -#![cfg_attr(all(windows, target_arch = "x86", target_env = "msvc"), doc( - html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-msvc" -))] -#![cfg_attr(target_os = "android", doc( - html_root_url = "https://doc.rust-lang.org/libc/arm-linux-androideabi" -))] -#![cfg_attr(target_os = "freebsd", doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-freebsd" -))] -#![cfg_attr(target_os = "openbsd", doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-openbsd" -))] -#![cfg_attr(target_os = "bitrig", doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-bitrig" -))] -#![cfg_attr(target_os = "netbsd", doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-netbsd" -))] -#![cfg_attr(target_os = "dragonfly", doc( - html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly" -))] - -// Attributes needed when building as part of the standard library -#![cfg_attr(stdbuild, feature(no_std, core, core_slice_ext, staged_api, custom_attribute, cfg_target_vendor))] -#![cfg_attr(stdbuild, feature(link_cfg))] -#![cfg_attr(stdbuild, no_std)] -#![cfg_attr(stdbuild, staged_api)] -#![cfg_attr(stdbuild, allow(warnings))] -#![cfg_attr(stdbuild, unstable(feature = "libc", - reason = "use `libc` from crates.io", - issue = "27783"))] - -#![cfg_attr(not(feature = "use_std"), no_std)] - -#[cfg(all(not(stdbuild), not(dox), feature = "use_std"))] -extern crate std as core; - -#[macro_use] mod macros; -mod dox; - -// Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable -// more optimization opportunities around it recognizing things like -// malloc/free. -#[repr(u8)] -pub enum c_void { - // Two dummy variants so the #[repr] attribute can be used. - #[doc(hidden)] - __variant1, - #[doc(hidden)] - __variant2, -} - -pub type int8_t = i8; -pub type int16_t = i16; -pub type int32_t = i32; -pub type int64_t = i64; -pub type uint8_t = u8; -pub type uint16_t = u16; -pub type uint32_t = u32; -pub type uint64_t = u64; - -pub type c_schar = i8; -pub type c_uchar = u8; -pub type c_short = i16; -pub type c_ushort = u16; -pub type c_int = i32; -pub type c_uint = u32; -pub type c_float = f32; -pub type c_double = f64; -pub type c_longlong = i64; -pub type c_ulonglong = u64; -pub type intmax_t = i64; -pub type uintmax_t = u64; - -pub type size_t = usize; -pub type ptrdiff_t = isize; -pub type intptr_t = isize; -pub type uintptr_t = usize; -pub type ssize_t = isize; - -pub enum FILE {} -pub enum fpos_t {} // TODO: fill this out with a struct - -extern { - pub fn isalnum(c: c_int) -> c_int; - pub fn isalpha(c: c_int) -> c_int; - pub fn iscntrl(c: c_int) -> c_int; - pub fn isdigit(c: c_int) -> c_int; - pub fn isgraph(c: c_int) -> c_int; - pub fn islower(c: c_int) -> c_int; - pub fn isprint(c: c_int) -> c_int; - pub fn ispunct(c: c_int) -> c_int; - pub fn isspace(c: c_int) -> c_int; - pub fn isupper(c: c_int) -> c_int; - pub fn isxdigit(c: c_int) -> c_int; - pub fn tolower(c: c_int) -> c_int; - pub fn toupper(c: c_int) -> c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fopen$UNIX2003")] - pub fn fopen(filename: *const c_char, - mode: *const c_char) -> *mut FILE; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "freopen$UNIX2003")] - pub fn freopen(filename: *const c_char, mode: *const c_char, - file: *mut FILE) -> *mut FILE; - pub fn fflush(file: *mut FILE) -> c_int; - pub fn fclose(file: *mut FILE) -> c_int; - pub fn remove(filename: *const c_char) -> c_int; - pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; - pub fn tmpfile() -> *mut FILE; - pub fn setvbuf(stream: *mut FILE, - buffer: *mut c_char, - mode: c_int, - size: size_t) -> c_int; - pub fn setbuf(stream: *mut FILE, buf: *mut c_char); - pub fn getchar() -> c_int; - pub fn putchar(c: c_int) -> c_int; - pub fn fgetc(stream: *mut FILE) -> c_int; - pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; - pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fputs$UNIX2003")] - pub fn fputs(s: *const c_char, stream: *mut FILE)-> c_int; - pub fn puts(s: *const c_char) -> c_int; - pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; - pub fn fread(ptr: *mut c_void, - size: size_t, - nobj: size_t, - stream: *mut FILE) - -> size_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fwrite$UNIX2003")] - pub fn fwrite(ptr: *const c_void, - size: size_t, - nobj: size_t, - stream: *mut FILE) - -> size_t; - pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; - pub fn ftell(stream: *mut FILE) -> c_long; - pub fn rewind(stream: *mut FILE); - #[cfg_attr(target_os = "netbsd", link_name = "__fgetpos50")] - pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__fsetpos50")] - pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; - pub fn feof(stream: *mut FILE) -> c_int; - pub fn ferror(stream: *mut FILE) -> c_int; - pub fn perror(s: *const c_char); - pub fn atoi(s: *const c_char) -> c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "strtod$UNIX2003")] - pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; - pub fn strtol(s: *const c_char, - endp: *mut *mut c_char, base: c_int) -> c_long; - pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, - base: c_int) -> c_ulong; - pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; - pub fn malloc(size: size_t) -> *mut c_void; - pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; - pub fn free(p: *mut c_void); - pub fn abort() -> !; - pub fn exit(status: c_int) -> !; - pub fn _exit(status: c_int) -> !; - pub fn atexit(cb: extern fn()) -> c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "system$UNIX2003")] - pub fn system(s: *const c_char) -> c_int; - pub fn getenv(s: *const c_char) -> *mut c_char; - - pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; - pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) - -> *mut c_char; - pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; - pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; - pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; - pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; - pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; - pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; - pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; - pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; - pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; - pub fn strdup(cs: *const c_char) -> *mut c_char; - pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; - pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; - pub fn strlen(cs: *const c_char) -> size_t; - pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "strerror$UNIX2003")] - pub fn strerror(n: c_int) -> *mut c_char; - pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; - pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; - pub fn wcslen(buf: *const wchar_t) -> size_t; - pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; - - pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; - pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; - pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; - pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; - pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; -} - -// These are all inline functions on android, so they end up just being entirely -// missing on that platform. -#[cfg(not(target_os = "android"))] -extern { - pub fn abs(i: c_int) -> c_int; - pub fn atof(s: *const c_char) -> c_double; - pub fn labs(i: c_long) -> c_long; - pub fn rand() -> c_int; - pub fn srand(seed: c_uint); -} - -cfg_if! { - if #[cfg(windows)] { - mod windows; - pub use windows::*; - } else if #[cfg(target_os = "redox")] { - mod redox; - pub use redox::*; - } else if #[cfg(unix)] { - mod unix; - pub use unix::*; - } else { - // Unknown target_family - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/macros.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/macros.rs deleted file mode 100644 index 5811c84c3..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/macros.rs +++ /dev/null @@ -1,108 +0,0 @@ -/// A macro for defining #[cfg] if-else statements. -/// -/// This is similar to the `if/elif` C preprocessor macro by allowing definition -/// of a cascade of `#[cfg]` cases, emitting the implementation which matches -/// first. -/// -/// This allows you to conveniently provide a long list #[cfg]'d blocks of code -/// without having to rewrite each clause multiple times. -macro_rules! cfg_if { - ($( - if #[cfg($($meta:meta),*)] { $($it:item)* } - ) else * else { - $($it2:item)* - }) => { - __cfg_if_items! { - () ; - $( ( ($($meta),*) ($($it)*) ), )* - ( () ($($it2)*) ), - } - } -} - -macro_rules! __cfg_if_items { - (($($not:meta,)*) ; ) => {}; - (($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { - __cfg_if_apply! { cfg(all(not(any($($not),*)), $($m,)*)), $($it)* } - __cfg_if_items! { ($($not,)* $($m,)*) ; $($rest)* } - } -} - -macro_rules! __cfg_if_apply { - ($m:meta, $($it:item)*) => { - $(#[$m] $it)* - } -} - -macro_rules! s { - ($($(#[$attr:meta])* pub struct $i:ident { $($field:tt)* })*) => ($( - __item! { - #[repr(C)] - $(#[$attr])* - pub struct $i { $($field)* } - } - impl ::dox::Copy for $i {} - impl ::dox::Clone for $i { - fn clone(&self) -> $i { *self } - } - )*) -} - -macro_rules! f { - ($(pub fn $i:ident($($arg:ident: $argty:ty),*) -> $ret:ty { - $($body:stmt);* - })*) => ($( - #[inline] - #[cfg(not(dox))] - pub unsafe extern fn $i($($arg: $argty),*) -> $ret { - $($body);* - } - - #[cfg(dox)] - #[allow(dead_code)] - pub unsafe extern fn $i($($arg: $argty),*) -> $ret { - loop {} - } - )*) -} - -macro_rules! __item { - ($i:item) => ($i) -} - -#[cfg(test)] -mod tests { - cfg_if! { - if #[cfg(test)] { - use std::option::Option as Option2; - fn works1() -> Option2 { Some(1) } - } else { - fn works1() -> Option { None } - } - } - - cfg_if! { - if #[cfg(foo)] { - fn works2() -> bool { false } - } else if #[cfg(test)] { - fn works2() -> bool { true } - } else { - fn works2() -> bool { false } - } - } - - cfg_if! { - if #[cfg(foo)] { - fn works3() -> bool { false } - } else { - fn works3() -> bool { true } - } - } - - #[test] - fn it_works() { - assert!(works1().is_some()); - assert!(works2()); - assert!(works3()); - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/redox.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/redox.rs deleted file mode 100644 index 3f2ed9c1a..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/redox.rs +++ /dev/null @@ -1,57 +0,0 @@ -pub type c_char = i8; -pub type c_long = i64; -pub type c_ulong = u64; - -pub type wchar_t = i16; - -pub type off_t = usize; -pub type mode_t = u16; -pub type time_t = i64; -pub type pid_t = usize; -pub type gid_t = usize; -pub type uid_t = usize; - -pub type in_addr_t = u32; -pub type in_port_t = u16; - -pub type socklen_t = u32; -pub type sa_family_t = u16; - -s! { - pub struct in_addr { - pub s_addr: in_addr_t, - } - - pub struct in6_addr { - pub s6_addr: [u8; 16], - __align: [u32; 0], - } - - pub struct sockaddr { - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14], - } - - pub struct sockaddr_in { - pub sin_family: sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [u8; 8], - } - - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, - pub sin6_port: in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } -} - -extern { - pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; -} - -#[link(name = "c")] -#[link(name = "m")] -extern {} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs deleted file mode 100644 index 8ca025449..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b32.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! 32-bit specific Apple (ios/darwin) definitions - -pub type c_long = i32; -pub type c_ulong = u32; - -s! { - pub struct pthread_attr_t { - __sig: c_long, - __opaque: [::c_char; 36] - } -} - -pub const __PTHREAD_MUTEX_SIZE__: usize = 40; -pub const __PTHREAD_COND_SIZE__: usize = 24; -pub const __PTHREAD_CONDATTR_SIZE__: usize = 4; -pub const __PTHREAD_RWLOCK_SIZE__: usize = 124; - -pub const TIOCTIMESTAMP: ::c_ulong = 0x40087459; -pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40087458; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs deleted file mode 100644 index 3f8323080..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/b64.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! 64-bit specific Apple (ios/darwin) definitions - -pub type c_long = i64; -pub type c_ulong = u64; - -s! { - pub struct pthread_attr_t { - __sig: c_long, - __opaque: [::c_char; 56] - } -} - -pub const __PTHREAD_MUTEX_SIZE__: usize = 56; -pub const __PTHREAD_COND_SIZE__: usize = 40; -pub const __PTHREAD_CONDATTR_SIZE__: usize = 8; -pub const __PTHREAD_RWLOCK_SIZE__: usize = 192; - -pub const TIOCTIMESTAMP: ::c_ulong = 0x40107459; -pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40107458; - -pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs deleted file mode 100644 index 6652bb8c0..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/apple/mod.rs +++ /dev/null @@ -1,1687 +0,0 @@ -//! Apple (ios/darwin)-specific definitions -//! -//! This covers *-apple-* triples currently - -pub type clock_t = c_ulong; -pub type time_t = c_long; -pub type suseconds_t = i32; -pub type dev_t = i32; -pub type ino_t = u64; -pub type mode_t = u16; -pub type nlink_t = u16; -pub type blksize_t = i32; -pub type rlim_t = u64; -pub type mach_timebase_info_data_t = mach_timebase_info; -pub type pthread_key_t = c_ulong; -pub type sigset_t = u32; -pub type fsblkcnt_t = ::c_uint; -pub type fsfilcnt_t = ::c_uint; -pub type speed_t = ::c_ulong; -pub type tcflag_t = ::c_ulong; -pub type nl_item = ::c_int; -pub type id_t = ::c_uint; -pub type sem_t = ::c_int; -pub type idtype_t = ::c_uint; - -pub enum timezone {} - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_offset: ::off_t, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_reqprio: ::c_int, - pub aio_sigevent: sigevent, - pub aio_lio_opcode: ::c_int - } - - pub struct utmpx { - pub ut_user: [::c_char; _UTX_USERSIZE], - pub ut_id: [::c_char; _UTX_IDSIZE], - pub ut_line: [::c_char; _UTX_LINESIZE], - pub ut_pid: ::pid_t, - pub ut_type: ::c_short, - pub ut_tv: ::timeval, - pub ut_host: [::c_char; _UTX_HOSTSIZE], - ut_pad: [::uint32_t; 16], - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - __unused1: ::c_int, - pub gl_offs: ::size_t, - __unused2: ::c_int, - pub gl_pathv: *mut *mut ::c_char, - - __unused3: *mut ::c_void, - - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - __unused8: *mut ::c_void, - } - - pub struct sockaddr_storage { - pub ss_len: u8, - pub ss_family: ::sa_family_t, - __ss_pad1: [u8; 6], - __ss_align: i64, - __ss_pad2: [u8; 112], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_canonname: *mut ::c_char, - pub ai_addr: *mut ::sockaddr, - pub ai_next: *mut addrinfo, - } - - pub struct mach_timebase_info { - pub numer: u32, - pub denom: u32, - } - - pub struct stat { - pub st_dev: dev_t, - pub st_mode: mode_t, - pub st_nlink: nlink_t, - pub st_ino: ino_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: dev_t, - pub st_atime: time_t, - pub st_atime_nsec: c_long, - pub st_mtime: time_t, - pub st_mtime_nsec: c_long, - pub st_ctime: time_t, - pub st_ctime_nsec: c_long, - pub st_birthtime: time_t, - pub st_birthtime_nsec: c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: blksize_t, - pub st_flags: ::uint32_t, - pub st_gen: ::uint32_t, - pub st_lspare: ::int32_t, - pub st_qspare: [::int64_t; 2], - } - - pub struct dirent { - pub d_ino: u64, - pub d_seekoff: u64, - pub d_reclen: u16, - pub d_namlen: u16, - pub d_type: u8, - pub d_name: [::c_char; 1024], - } - - pub struct pthread_mutex_t { - __sig: ::c_long, - __opaque: [u8; __PTHREAD_MUTEX_SIZE__], - } - - pub struct pthread_mutexattr_t { - __sig: ::c_long, - __opaque: [u8; 8], - } - - pub struct pthread_cond_t { - __sig: ::c_long, - __opaque: [u8; __PTHREAD_COND_SIZE__], - } - - pub struct pthread_condattr_t { - __sig: ::c_long, - __opaque: [u8; __PTHREAD_CONDATTR_SIZE__], - } - - pub struct pthread_rwlock_t { - __sig: ::c_long, - __opaque: [u8; __PTHREAD_RWLOCK_SIZE__], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub si_pid: ::pid_t, - pub si_uid: ::uid_t, - pub si_status: ::c_int, - pub si_addr: *mut ::c_void, - _pad: [usize; 9], - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: sigset_t, - pub sa_flags: ::c_int, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct fstore_t { - pub fst_flags: ::c_uint, - pub fst_posmode: ::c_int, - pub fst_offset: ::off_t, - pub fst_length: ::off_t, - pub fst_bytesalloc: ::off_t, - } - - pub struct radvisory { - pub ra_offset: ::off_t, - pub ra_count: ::c_int, - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct sockaddr_in { - pub sin_len: u8, - pub sin_family: ::sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [::c_char; 8], - } - - pub struct statfs { - pub f_bsize: ::uint32_t, - pub f_iosize: ::int32_t, - pub f_blocks: ::uint64_t, - pub f_bfree: ::uint64_t, - pub f_bavail: ::uint64_t, - pub f_files: ::uint64_t, - pub f_ffree: ::uint64_t, - pub f_fsid: ::fsid_t, - pub f_owner: ::uid_t, - pub f_type: ::uint32_t, - pub f_flags: ::uint32_t, - pub f_fssubtype: ::uint32_t, - pub f_fstypename: [::c_char; 16], - pub f_mntonname: [::c_char; 1024], - pub f_mntfromname: [::c_char; 1024], - pub f_reserved: [::uint32_t; 8], - } - - // FIXME: this should have align 4 but it's got align 8 on 64-bit - pub struct kevent { - pub ident: ::uintptr_t, - pub filter: ::int16_t, - pub flags: ::uint16_t, - pub fflags: ::uint32_t, - pub data: ::intptr_t, - pub udata: *mut ::c_void, - } - - pub struct kevent64_s { - pub ident: ::uint64_t, - pub filter: ::int16_t, - pub flags: ::uint16_t, - pub fflags: ::uint32_t, - pub data: ::int64_t, - pub udata: ::uint64_t, - pub ext: [::uint64_t; 2], - } - - pub struct dqblk { - pub dqb_bhardlimit: ::uint64_t, - pub dqb_bsoftlimit: ::uint64_t, - pub dqb_curbytes: ::uint64_t, - pub dqb_ihardlimit: ::uint32_t, - pub dqb_isoftlimit: ::uint32_t, - pub dqb_curinodes: ::uint32_t, - pub dqb_btime: ::uint32_t, - pub dqb_itime: ::uint32_t, - pub dqb_id: ::uint32_t, - pub dqb_spare: [::uint32_t; 4], - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_cc: [::cc_t; ::NCCS], - pub c_ispeed: ::speed_t, - pub c_ospeed: ::speed_t, - } - - pub struct flock { - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - pub l_type: ::c_short, - pub l_whence: ::c_short, - } - - pub struct sf_hdtr { - pub headers: *mut ::iovec, - pub hdr_cnt: ::c_int, - pub trailers: *mut ::iovec, - pub trl_cnt: ::c_int, - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct sigevent { - pub sigev_notify: ::c_int, - pub sigev_signo: ::c_int, - pub sigev_value: ::sigval, - __unused1: *mut ::c_void, //actually a function pointer - pub sigev_notify_attributes: *mut ::pthread_attr_t - } -} - -pub const _UTX_USERSIZE: usize = 256; -pub const _UTX_LINESIZE: usize = 32; -pub const _UTX_IDSIZE: usize = 4; -pub const _UTX_HOSTSIZE: usize = 256; - -pub const EMPTY: ::c_short = 0; -pub const RUN_LVL: ::c_short = 1; -pub const BOOT_TIME: ::c_short = 2; -pub const OLD_TIME: ::c_short = 3; -pub const NEW_TIME: ::c_short = 4; -pub const INIT_PROCESS: ::c_short = 5; -pub const LOGIN_PROCESS: ::c_short = 6; -pub const USER_PROCESS: ::c_short = 7; -pub const DEAD_PROCESS: ::c_short = 8; -pub const ACCOUNTING: ::c_short = 9; -pub const SIGNATURE: ::c_short = 10; -pub const SHUTDOWN_TIME: ::c_short = 11; - -pub const LC_COLLATE_MASK: ::c_int = (1 << 0); -pub const LC_CTYPE_MASK: ::c_int = (1 << 1); -pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); -pub const LC_MONETARY_MASK: ::c_int = (1 << 3); -pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); -pub const LC_TIME_MASK: ::c_int = (1 << 5); -pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK - | LC_CTYPE_MASK - | LC_MESSAGES_MASK - | LC_MONETARY_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK; - -pub const CODESET: ::nl_item = 0; -pub const D_T_FMT: ::nl_item = 1; -pub const D_FMT: ::nl_item = 2; -pub const T_FMT: ::nl_item = 3; -pub const T_FMT_AMPM: ::nl_item = 4; -pub const AM_STR: ::nl_item = 5; -pub const PM_STR: ::nl_item = 6; - -pub const DAY_1: ::nl_item = 7; -pub const DAY_2: ::nl_item = 8; -pub const DAY_3: ::nl_item = 9; -pub const DAY_4: ::nl_item = 10; -pub const DAY_5: ::nl_item = 11; -pub const DAY_6: ::nl_item = 12; -pub const DAY_7: ::nl_item = 13; - -pub const ABDAY_1: ::nl_item = 14; -pub const ABDAY_2: ::nl_item = 15; -pub const ABDAY_3: ::nl_item = 16; -pub const ABDAY_4: ::nl_item = 17; -pub const ABDAY_5: ::nl_item = 18; -pub const ABDAY_6: ::nl_item = 19; -pub const ABDAY_7: ::nl_item = 20; - -pub const MON_1: ::nl_item = 21; -pub const MON_2: ::nl_item = 22; -pub const MON_3: ::nl_item = 23; -pub const MON_4: ::nl_item = 24; -pub const MON_5: ::nl_item = 25; -pub const MON_6: ::nl_item = 26; -pub const MON_7: ::nl_item = 27; -pub const MON_8: ::nl_item = 28; -pub const MON_9: ::nl_item = 29; -pub const MON_10: ::nl_item = 30; -pub const MON_11: ::nl_item = 31; -pub const MON_12: ::nl_item = 32; - -pub const ABMON_1: ::nl_item = 33; -pub const ABMON_2: ::nl_item = 34; -pub const ABMON_3: ::nl_item = 35; -pub const ABMON_4: ::nl_item = 36; -pub const ABMON_5: ::nl_item = 37; -pub const ABMON_6: ::nl_item = 38; -pub const ABMON_7: ::nl_item = 39; -pub const ABMON_8: ::nl_item = 40; -pub const ABMON_9: ::nl_item = 41; -pub const ABMON_10: ::nl_item = 42; -pub const ABMON_11: ::nl_item = 43; -pub const ABMON_12: ::nl_item = 44; - -pub const ERA: ::nl_item = 45; -pub const ERA_D_FMT: ::nl_item = 46; -pub const ERA_D_T_FMT: ::nl_item = 47; -pub const ERA_T_FMT: ::nl_item = 48; -pub const ALT_DIGITS: ::nl_item = 49; - -pub const RADIXCHAR: ::nl_item = 50; -pub const THOUSEP: ::nl_item = 51; - -pub const YESEXPR: ::nl_item = 52; -pub const NOEXPR: ::nl_item = 53; - -pub const YESSTR: ::nl_item = 54; -pub const NOSTR: ::nl_item = 55; - -pub const CRNCYSTR: ::nl_item = 56; - -pub const D_MD_ORDER: ::nl_item = 57; - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 2147483647; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 2; -pub const _IOLBF: ::c_int = 1; -pub const BUFSIZ: ::c_uint = 1024; -pub const FOPEN_MAX: ::c_uint = 20; -pub const FILENAME_MAX: ::c_uint = 1024; -pub const L_tmpnam: ::c_uint = 1024; -pub const TMP_MAX: ::c_uint = 308915776; -pub const _PC_LINK_MAX: ::c_int = 1; -pub const _PC_MAX_CANON: ::c_int = 2; -pub const _PC_MAX_INPUT: ::c_int = 3; -pub const _PC_NAME_MAX: ::c_int = 4; -pub const _PC_PATH_MAX: ::c_int = 5; -pub const _PC_PIPE_BUF: ::c_int = 6; -pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; -pub const _PC_NO_TRUNC: ::c_int = 8; -pub const _PC_VDISABLE: ::c_int = 9; -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; -pub const O_APPEND: ::c_int = 8; -pub const O_CREAT: ::c_int = 512; -pub const O_EXCL: ::c_int = 2048; -pub const O_NOCTTY: ::c_int = 131072; -pub const O_TRUNC: ::c_int = 1024; -pub const O_CLOEXEC: ::c_int = 0x1000000; -pub const O_DIRECTORY: ::c_int = 0x100000; -pub const S_IFIFO: mode_t = 4096; -pub const S_IFCHR: mode_t = 8192; -pub const S_IFBLK: mode_t = 24576; -pub const S_IFDIR: mode_t = 16384; -pub const S_IFREG: mode_t = 32768; -pub const S_IFLNK: mode_t = 40960; -pub const S_IFSOCK: mode_t = 49152; -pub const S_IFMT: mode_t = 61440; -pub const S_IEXEC: mode_t = 64; -pub const S_IWRITE: mode_t = 128; -pub const S_IREAD: mode_t = 256; -pub const S_IRWXU: mode_t = 448; -pub const S_IXUSR: mode_t = 64; -pub const S_IWUSR: mode_t = 128; -pub const S_IRUSR: mode_t = 256; -pub const S_IRWXG: mode_t = 56; -pub const S_IXGRP: mode_t = 8; -pub const S_IWGRP: mode_t = 16; -pub const S_IRGRP: mode_t = 32; -pub const S_IRWXO: mode_t = 7; -pub const S_IXOTH: mode_t = 1; -pub const S_IWOTH: mode_t = 2; -pub const S_IROTH: mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const F_LOCK: ::c_int = 1; -pub const F_TEST: ::c_int = 3; -pub const F_TLOCK: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; -pub const F_GETLK: ::c_int = 7; -pub const F_SETLK: ::c_int = 8; -pub const F_SETLKW: ::c_int = 9; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGEMT: ::c_int = 7; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const MAP_FILE: ::c_int = 0x0000; -pub const MAP_SHARED: ::c_int = 0x0001; -pub const MAP_PRIVATE: ::c_int = 0x0002; -pub const MAP_FIXED: ::c_int = 0x0010; -pub const MAP_ANON: ::c_int = 0x1000; - -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const MS_ASYNC: ::c_int = 0x0001; -pub const MS_INVALIDATE: ::c_int = 0x0002; -pub const MS_SYNC: ::c_int = 0x0010; - -pub const MS_KILLPAGES: ::c_int = 0x0004; -pub const MS_DEACTIVATE: ::c_int = 0x0008; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EDEADLK: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const ENOTBLK: ::c_int = 15; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -pub const ENODEV: ::c_int = 19; -pub const ENOTDIR: ::c_int = 20; -pub const EISDIR: ::c_int = 21; -pub const EINVAL: ::c_int = 22; -pub const ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const ETXTBSY: ::c_int = 26; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const EAGAIN: ::c_int = 35; -pub const EWOULDBLOCK: ::c_int = EAGAIN; -pub const EINPROGRESS: ::c_int = 36; -pub const EALREADY: ::c_int = 37; -pub const ENOTSOCK: ::c_int = 38; -pub const EDESTADDRREQ: ::c_int = 39; -pub const EMSGSIZE: ::c_int = 40; -pub const EPROTOTYPE: ::c_int = 41; -pub const ENOPROTOOPT: ::c_int = 42; -pub const EPROTONOSUPPORT: ::c_int = 43; -pub const ESOCKTNOSUPPORT: ::c_int = 44; -pub const ENOTSUP: ::c_int = 45; -pub const EPFNOSUPPORT: ::c_int = 46; -pub const EAFNOSUPPORT: ::c_int = 47; -pub const EADDRINUSE: ::c_int = 48; -pub const EADDRNOTAVAIL: ::c_int = 49; -pub const ENETDOWN: ::c_int = 50; -pub const ENETUNREACH: ::c_int = 51; -pub const ENETRESET: ::c_int = 52; -pub const ECONNABORTED: ::c_int = 53; -pub const ECONNRESET: ::c_int = 54; -pub const ENOBUFS: ::c_int = 55; -pub const EISCONN: ::c_int = 56; -pub const ENOTCONN: ::c_int = 57; -pub const ESHUTDOWN: ::c_int = 58; -pub const ETOOMANYREFS: ::c_int = 59; -pub const ETIMEDOUT: ::c_int = 60; -pub const ECONNREFUSED: ::c_int = 61; -pub const ELOOP: ::c_int = 62; -pub const ENAMETOOLONG: ::c_int = 63; -pub const EHOSTDOWN: ::c_int = 64; -pub const EHOSTUNREACH: ::c_int = 65; -pub const ENOTEMPTY: ::c_int = 66; -pub const EPROCLIM: ::c_int = 67; -pub const EUSERS: ::c_int = 68; -pub const EDQUOT: ::c_int = 69; -pub const ESTALE: ::c_int = 70; -pub const EREMOTE: ::c_int = 71; -pub const EBADRPC: ::c_int = 72; -pub const ERPCMISMATCH: ::c_int = 73; -pub const EPROGUNAVAIL: ::c_int = 74; -pub const EPROGMISMATCH: ::c_int = 75; -pub const EPROCUNAVAIL: ::c_int = 76; -pub const ENOLCK: ::c_int = 77; -pub const ENOSYS: ::c_int = 78; -pub const EFTYPE: ::c_int = 79; -pub const EAUTH: ::c_int = 80; -pub const ENEEDAUTH: ::c_int = 81; -pub const EPWROFF: ::c_int = 82; -pub const EDEVERR: ::c_int = 83; -pub const EOVERFLOW: ::c_int = 84; -pub const EBADEXEC: ::c_int = 85; -pub const EBADARCH: ::c_int = 86; -pub const ESHLIBVERS: ::c_int = 87; -pub const EBADMACHO: ::c_int = 88; -pub const ECANCELED: ::c_int = 89; -pub const EIDRM: ::c_int = 90; -pub const ENOMSG: ::c_int = 91; -pub const EILSEQ: ::c_int = 92; -pub const ENOATTR: ::c_int = 93; -pub const EBADMSG: ::c_int = 94; -pub const EMULTIHOP: ::c_int = 95; -pub const ENODATA: ::c_int = 96; -pub const ENOLINK: ::c_int = 97; -pub const ENOSR: ::c_int = 98; -pub const ENOSTR: ::c_int = 99; -pub const EPROTO: ::c_int = 100; -pub const ETIME: ::c_int = 101; -pub const EOPNOTSUPP: ::c_int = 102; -pub const ENOPOLICY: ::c_int = 103; -pub const ENOTRECOVERABLE: ::c_int = 104; -pub const EOWNERDEAD: ::c_int = 105; -pub const EQFULL: ::c_int = 106; -pub const ELAST: ::c_int = 106; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const F_DUPFD: ::c_int = 0; -pub const F_DUPFD_CLOEXEC: ::c_int = 67; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; -pub const F_PREALLOCATE: ::c_int = 42; -pub const F_RDADVISE: ::c_int = 44; -pub const F_RDAHEAD: ::c_int = 45; -pub const F_NOCACHE: ::c_int = 48; -pub const F_GETPATH: ::c_int = 50; -pub const F_FULLFSYNC: ::c_int = 51; -pub const F_FREEZE_FS: ::c_int = 53; -pub const F_THAW_FS: ::c_int = 54; -pub const F_GLOBAL_NOCACHE: ::c_int = 55; -pub const F_NODIRECT: ::c_int = 62; - -pub const F_ALLOCATECONTIG: ::c_uint = 0x02; -pub const F_ALLOCATEALL: ::c_uint = 0x04; - -pub const F_PEOFPOSMODE: ::c_int = 3; -pub const F_VOLPOSMODE: ::c_int = 4; - -pub const AT_FDCWD: ::c_int = -2; -pub const AT_EACCESS: ::c_int = 0x0010; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x0020; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x0040; -pub const AT_REMOVEDIR: ::c_int = 0x0080; - -pub const O_ACCMODE: ::c_int = 3; - -pub const TIOCMODG: ::c_ulong = 0x40047403; -pub const TIOCMODS: ::c_ulong = 0x80047404; -pub const TIOCM_LE: ::c_int = 0x1; -pub const TIOCM_DTR: ::c_int = 0x2; -pub const TIOCM_RTS: ::c_int = 0x4; -pub const TIOCM_ST: ::c_int = 0x8; -pub const TIOCM_SR: ::c_int = 0x10; -pub const TIOCM_CTS: ::c_int = 0x20; -pub const TIOCM_CAR: ::c_int = 0x40; -pub const TIOCM_CD: ::c_int = 0x40; -pub const TIOCM_RNG: ::c_int = 0x80; -pub const TIOCM_RI: ::c_int = 0x80; -pub const TIOCM_DSR: ::c_int = 0x100; -pub const TIOCEXCL: ::c_int = 0x2000740d; -pub const TIOCNXCL: ::c_int = 0x2000740e; -pub const TIOCFLUSH: ::c_ulong = 0x80047410; -pub const TIOCGETD: ::c_ulong = 0x4004741a; -pub const TIOCSETD: ::c_ulong = 0x8004741b; -pub const TIOCIXON: ::c_uint = 0x20007481; -pub const TIOCIXOFF: ::c_uint = 0x20007480; -pub const TIOCSBRK: ::c_uint = 0x2000747b; -pub const TIOCCBRK: ::c_uint = 0x2000747a; -pub const TIOCSDTR: ::c_uint = 0x20007479; -pub const TIOCCDTR: ::c_uint = 0x20007478; -pub const TIOCGPGRP: ::c_ulong = 0x40047477; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCOUTQ: ::c_ulong = 0x40047473; -pub const TIOCSTI: ::c_ulong = 0x80017472; -pub const TIOCNOTTY: ::c_uint = 0x20007471; -pub const TIOCPKT: ::c_ulong = 0x80047470; -pub const TIOCPKT_DATA: ::c_int = 0x0; -pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; -pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; -pub const TIOCPKT_STOP: ::c_int = 0x4; -pub const TIOCPKT_START: ::c_int = 0x8; -pub const TIOCPKT_NOSTOP: ::c_int = 0x10; -pub const TIOCPKT_DOSTOP: ::c_int = 0x20; -pub const TIOCPKT_IOCTL: ::c_int = 0x40; -pub const TIOCSTOP: ::c_uint = 0x2000746f; -pub const TIOCSTART: ::c_uint = 0x2000746e; -pub const TIOCMSET: ::c_ulong = 0x8004746d; -pub const TIOCMBIS: ::c_ulong = 0x8004746c; -pub const TIOCMBIC: ::c_ulong = 0x8004746b; -pub const TIOCMGET: ::c_ulong = 0x4004746a; -pub const TIOCREMOTE: ::c_ulong = 0x80047469; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const TIOCUCNTL: ::c_ulong = 0x80047466; -pub const TIOCSTAT: ::c_uint = 0x20007465; -pub const TIOCSCONS: ::c_uint = 0x20007463; -pub const TIOCCONS: ::c_ulong = 0x80047462; -pub const TIOCSCTTY: ::c_uint = 0x20007461; -pub const TIOCEXT: ::c_ulong = 0x80047460; -pub const TIOCSIG: ::c_uint = 0x2000745f; -pub const TIOCDRAIN: ::c_uint = 0x2000745e; -pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; -pub const TIOCMGDTRWAIT: ::c_ulong = 0x4004745a; -pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; -pub const TIOCGDRAINWAIT: ::c_ulong = 0x40047456; -pub const TIOCDSIMICROCODE: ::c_uint = 0x20007455; -pub const TIOCPTYGRANT: ::c_uint = 0x20007454; -pub const TIOCPTYGNAME: ::c_uint = 0x40807453; -pub const TIOCPTYUNLK: ::c_uint = 0x20007452; - -pub const B0: speed_t = 0; -pub const B50: speed_t = 50; -pub const B75: speed_t = 75; -pub const B110: speed_t = 110; -pub const B134: speed_t = 134; -pub const B150: speed_t = 150; -pub const B200: speed_t = 200; -pub const B300: speed_t = 300; -pub const B600: speed_t = 600; -pub const B1200: speed_t = 1200; -pub const B1800: speed_t = 1800; -pub const B2400: speed_t = 2400; -pub const B4800: speed_t = 4800; -pub const B9600: speed_t = 9600; -pub const B19200: speed_t = 19200; -pub const B38400: speed_t = 38400; -pub const B7200: speed_t = 7200; -pub const B14400: speed_t = 14400; -pub const B28800: speed_t = 28800; -pub const B57600: speed_t = 57600; -pub const B76800: speed_t = 76800; -pub const B115200: speed_t = 115200; -pub const B230400: speed_t = 230400; -pub const EXTA: speed_t = 19200; -pub const EXTB: speed_t = 38400; - -pub const SIGTRAP: ::c_int = 5; - -pub const GLOB_APPEND : ::c_int = 0x0001; -pub const GLOB_DOOFFS : ::c_int = 0x0002; -pub const GLOB_ERR : ::c_int = 0x0004; -pub const GLOB_MARK : ::c_int = 0x0008; -pub const GLOB_NOCHECK : ::c_int = 0x0010; -pub const GLOB_NOSORT : ::c_int = 0x0020; -pub const GLOB_NOESCAPE: ::c_int = 0x2000; - -pub const GLOB_NOSPACE : ::c_int = -1; -pub const GLOB_ABORTED : ::c_int = -2; -pub const GLOB_NOMATCH : ::c_int = -3; - -pub const POSIX_MADV_NORMAL: ::c_int = 0; -pub const POSIX_MADV_RANDOM: ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_MADV_WILLNEED: ::c_int = 3; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; - -pub const _SC_IOV_MAX: ::c_int = 56; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; -pub const _SC_MQ_PRIO_MAX: ::c_int = 75; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; -pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; -pub const _SC_THREAD_STACK_MIN: ::c_int = 93; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; -pub const _SC_THREADS: ::c_int = 96; -pub const _SC_TTY_NAME_MAX: ::c_int = 101; -pub const _SC_ATEXIT_MAX: ::c_int = 107; -pub const _SC_XOPEN_CRYPT: ::c_int = 108; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; -pub const _SC_XOPEN_LEGACY: ::c_int = 110; -pub const _SC_XOPEN_REALTIME: ::c_int = 111; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; -pub const _SC_XOPEN_SHM: ::c_int = 113; -pub const _SC_XOPEN_UNIX: ::c_int = 115; -pub const _SC_XOPEN_VERSION: ::c_int = 116; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 121; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 1; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 2; -pub const PTHREAD_STACK_MIN: ::size_t = 8192; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_AS: ::c_int = 5; -pub const RLIMIT_RSS: ::c_int = RLIMIT_AS; -pub const RLIMIT_MEMLOCK: ::c_int = 6; -pub const RLIMIT_NPROC: ::c_int = 7; -pub const RLIMIT_NOFILE: ::c_int = 8; -pub const RLIM_NLIMITS: ::c_int = 9; -pub const _RLIMIT_POSIX_FLAG: ::c_int = 0x1000; - -pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; - -pub const RUSAGE_SELF: ::c_int = 0; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; -pub const MADV_FREE: ::c_int = 5; -pub const MADV_ZERO_WIRED_PAGES: ::c_int = 6; -pub const MADV_FREE_REUSABLE: ::c_int = 7; -pub const MADV_FREE_REUSE: ::c_int = 8; -pub const MADV_CAN_REUSE: ::c_int = 9; - -pub const MINCORE_INCORE: ::c_int = 0x1; -pub const MINCORE_REFERENCED: ::c_int = 0x2; -pub const MINCORE_MODIFIED: ::c_int = 0x4; -pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; -pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; - -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_UNIX: ::c_int = AF_LOCAL; -pub const AF_INET: ::c_int = 2; -pub const AF_IMPLINK: ::c_int = 3; -pub const AF_PUP: ::c_int = 4; -pub const AF_CHAOS: ::c_int = 5; -pub const AF_NS: ::c_int = 6; -pub const AF_ISO: ::c_int = 7; -pub const AF_OSI: ::c_int = AF_ISO; -pub const AF_ECMA: ::c_int = 8; -pub const AF_DATAKIT: ::c_int = 9; -pub const AF_CCITT: ::c_int = 10; -pub const AF_SNA: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_DLI: ::c_int = 13; -pub const AF_LAT: ::c_int = 14; -pub const AF_HYLINK: ::c_int = 15; -pub const AF_APPLETALK: ::c_int = 16; -pub const AF_ROUTE: ::c_int = 17; -pub const AF_LINK: ::c_int = 18; -pub const pseudo_AF_XTP: ::c_int = 19; -pub const AF_COIP: ::c_int = 20; -pub const AF_CNT: ::c_int = 21; -pub const pseudo_AF_RTIP: ::c_int = 22; -pub const AF_IPX: ::c_int = 23; -pub const AF_SIP: ::c_int = 24; -pub const pseudo_AF_PIP: ::c_int = 25; -pub const AF_ISDN: ::c_int = 28; -pub const AF_E164: ::c_int = AF_ISDN; -pub const pseudo_AF_KEY: ::c_int = 29; -pub const AF_INET6: ::c_int = 30; -pub const AF_NATM: ::c_int = 31; -pub const AF_SYSTEM: ::c_int = 32; -pub const AF_NETBIOS: ::c_int = 33; -pub const AF_PPP: ::c_int = 34; -pub const pseudo_AF_HDRCMPLT: ::c_int = 35; -#[doc(hidden)] -pub const AF_MAX: ::c_int = 40; - -pub const PF_UNSPEC: ::c_int = AF_UNSPEC; -pub const PF_LOCAL: ::c_int = AF_LOCAL; -pub const PF_UNIX: ::c_int = PF_LOCAL; -pub const PF_INET: ::c_int = AF_INET; -pub const PF_IMPLINK: ::c_int = AF_IMPLINK; -pub const PF_PUP: ::c_int = AF_PUP; -pub const PF_CHAOS: ::c_int = AF_CHAOS; -pub const PF_NS: ::c_int = AF_NS; -pub const PF_ISO: ::c_int = AF_ISO; -pub const PF_OSI: ::c_int = AF_ISO; -pub const PF_ECMA: ::c_int = AF_ECMA; -pub const PF_DATAKIT: ::c_int = AF_DATAKIT; -pub const PF_CCITT: ::c_int = AF_CCITT; -pub const PF_SNA: ::c_int = AF_SNA; -pub const PF_DECnet: ::c_int = AF_DECnet; -pub const PF_DLI: ::c_int = AF_DLI; -pub const PF_LAT: ::c_int = AF_LAT; -pub const PF_HYLINK: ::c_int = AF_HYLINK; -pub const PF_APPLETALK: ::c_int = AF_APPLETALK; -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_LINK: ::c_int = AF_LINK; -pub const PF_XTP: ::c_int = pseudo_AF_XTP; -pub const PF_COIP: ::c_int = AF_COIP; -pub const PF_CNT: ::c_int = AF_CNT; -pub const PF_SIP: ::c_int = AF_SIP; -pub const PF_IPX: ::c_int = AF_IPX; -pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; -pub const PF_PIP: ::c_int = pseudo_AF_PIP; -pub const PF_ISDN: ::c_int = AF_ISDN; -pub const PF_KEY: ::c_int = pseudo_AF_KEY; -pub const PF_INET6: ::c_int = AF_INET6; -pub const PF_NATM: ::c_int = AF_NATM; -pub const PF_SYSTEM: ::c_int = AF_SYSTEM; -pub const PF_NETBIOS: ::c_int = AF_NETBIOS; -pub const PF_PPP: ::c_int = AF_PPP; -#[doc(hidden)] -pub const PF_MAX: ::c_int = AF_MAX; - -#[doc(hidden)] -pub const NET_MAXID: ::c_int = AF_MAX; - -pub const NET_RT_DUMP: ::c_int = 1; -pub const NET_RT_FLAGS: ::c_int = 2; -pub const NET_RT_IFLIST: ::c_int = 3; -#[doc(hidden)] -pub const NET_RT_MAXID: ::c_int = 10; - -pub const SOMAXCONN: ::c_int = 128; - -pub const SOCK_MAXADDRLEN: ::c_int = 255; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_RDM: ::c_int = 4; -pub const SOCK_SEQPACKET: ::c_int = 5; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 10; -pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_TTL: ::c_int = 4; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_ADD_MEMBERSHIP: ::c_int = 12; -pub const IP_DROP_MEMBERSHIP: ::c_int = 13; -pub const IPV6_JOIN_GROUP: ::c_int = 12; -pub const IPV6_LEAVE_GROUP: ::c_int = 13; - -pub const TCP_NODELAY: ::c_int = 0x01; -pub const TCP_KEEPALIVE: ::c_int = 0x10; -pub const SOL_SOCKET: ::c_int = 0xffff; - -pub const SO_DEBUG: ::c_int = 0x01; -pub const SO_ACCEPTCONN: ::c_int = 0x0002; -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_USELOOPBACK: ::c_int = 0x0040; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_REUSEPORT: ::c_int = 0x0200; -pub const SO_TIMESTAMP: ::c_int = 0x0400; -pub const SO_DONTTRUNC: ::c_int = 0x2000; -pub const SO_WANTMORE: ::c_int = 0x4000; -pub const SO_WANTOOBFLAG: ::c_int = 0x8000; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_TYPE: ::c_int = 0x1008; -pub const SO_NREAD: ::c_int = 0x1020; -pub const SO_NKE: ::c_int = 0x1021; -pub const SO_NOSIGPIPE: ::c_int = 0x1022; -pub const SO_NOADDRERR: ::c_int = 0x1023; -pub const SO_NWRITE: ::c_int = 0x1024; - -pub const MSG_OOB: ::c_int = 0x1; -pub const MSG_PEEK: ::c_int = 0x2; -pub const MSG_DONTROUTE: ::c_int = 0x4; -pub const MSG_EOR: ::c_int = 0x8; -pub const MSG_TRUNC: ::c_int = 0x10; -pub const MSG_CTRUNC: ::c_int = 0x20; -pub const MSG_WAITALL: ::c_int = 0x40; -pub const MSG_DONTWAIT: ::c_int = 0x80; -pub const MSG_EOF: ::c_int = 0x100; -pub const MSG_FLUSH: ::c_int = 0x400; -pub const MSG_HOLD: ::c_int = 0x800; -pub const MSG_SEND: ::c_int = 0x1000; -pub const MSG_HAVEMORE: ::c_int = 0x2000; -pub const MSG_RCVMORE: ::c_int = 0x4000; -// pub const MSG_COMPAT: ::c_int = 0x8000; - -pub const SCM_RIGHTS: ::c_int = 0x01; -pub const SCM_TIMESTAMP: ::c_int = 0x02; -pub const SCM_CREDS: ::c_int = 0x03; - -pub const IFF_LOOPBACK: ::c_int = 0x8; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const O_DSYNC: ::c_int = 4194304; -pub const O_SYNC: ::c_int = 128; -pub const O_NONBLOCK: ::c_int = 4; - -pub const MAP_COPY: ::c_int = 0x0002; -pub const MAP_RENAME: ::c_int = 0x0020; -pub const MAP_NORESERVE: ::c_int = 0x0040; -pub const MAP_NOEXTEND: ::c_int = 0x0100; -pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; -pub const MAP_NOCACHE: ::c_int = 0x0400; -pub const MAP_JIT: ::c_int = 0x0800; - -pub const IPPROTO_RAW: ::c_int = 255; - -pub const _SC_ARG_MAX: ::c_int = 1; -pub const _SC_CHILD_MAX: ::c_int = 2; -pub const _SC_CLK_TCK: ::c_int = 3; -pub const _SC_NGROUPS_MAX: ::c_int = 4; -pub const _SC_OPEN_MAX: ::c_int = 5; -pub const _SC_JOB_CONTROL: ::c_int = 6; -pub const _SC_SAVED_IDS: ::c_int = 7; -pub const _SC_VERSION: ::c_int = 8; -pub const _SC_BC_BASE_MAX: ::c_int = 9; -pub const _SC_BC_DIM_MAX: ::c_int = 10; -pub const _SC_BC_SCALE_MAX: ::c_int = 11; -pub const _SC_BC_STRING_MAX: ::c_int = 12; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; -pub const _SC_EXPR_NEST_MAX: ::c_int = 14; -pub const _SC_LINE_MAX: ::c_int = 15; -pub const _SC_RE_DUP_MAX: ::c_int = 16; -pub const _SC_2_VERSION: ::c_int = 17; -pub const _SC_2_C_BIND: ::c_int = 18; -pub const _SC_2_C_DEV: ::c_int = 19; -pub const _SC_2_CHAR_TERM: ::c_int = 20; -pub const _SC_2_FORT_DEV: ::c_int = 21; -pub const _SC_2_FORT_RUN: ::c_int = 22; -pub const _SC_2_LOCALEDEF: ::c_int = 23; -pub const _SC_2_SW_DEV: ::c_int = 24; -pub const _SC_2_UPE: ::c_int = 25; -pub const _SC_STREAM_MAX: ::c_int = 26; -pub const _SC_TZNAME_MAX: ::c_int = 27; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; -pub const _SC_PAGESIZE: ::c_int = 29; -pub const _SC_MEMLOCK: ::c_int = 30; -pub const _SC_MEMLOCK_RANGE: ::c_int = 31; -pub const _SC_MEMORY_PROTECTION: ::c_int = 32; -pub const _SC_MESSAGE_PASSING: ::c_int = 33; -pub const _SC_PRIORITIZED_IO: ::c_int = 34; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; -pub const _SC_REALTIME_SIGNALS: ::c_int = 36; -pub const _SC_SEMAPHORES: ::c_int = 37; -pub const _SC_FSYNC: ::c_int = 38; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; -pub const _SC_TIMERS: ::c_int = 41; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; -pub const _SC_AIO_MAX: ::c_int = 43; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; -pub const _SC_DELAYTIMER_MAX: ::c_int = 45; -pub const _SC_MQ_OPEN_MAX: ::c_int = 46; -pub const _SC_MAPPED_FILES: ::c_int = 47; -pub const _SC_RTSIG_MAX: ::c_int = 48; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; -pub const _SC_SEM_VALUE_MAX: ::c_int = 50; -pub const _SC_SIGQUEUE_MAX: ::c_int = 51; -pub const _SC_TIMER_MAX: ::c_int = 52; -pub const _SC_NPROCESSORS_CONF: ::c_int = 57; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; -pub const _SC_2_PBS: ::c_int = 59; -pub const _SC_2_PBS_ACCOUNTING: ::c_int = 60; -pub const _SC_2_PBS_CHECKPOINT: ::c_int = 61; -pub const _SC_2_PBS_LOCATE: ::c_int = 62; -pub const _SC_2_PBS_MESSAGE: ::c_int = 63; -pub const _SC_2_PBS_TRACK: ::c_int = 64; -pub const _SC_ADVISORY_INFO: ::c_int = 65; -pub const _SC_BARRIERS: ::c_int = 66; -pub const _SC_CLOCK_SELECTION: ::c_int = 67; -pub const _SC_CPUTIME: ::c_int = 68; -pub const _SC_FILE_LOCKING: ::c_int = 69; -pub const _SC_HOST_NAME_MAX: ::c_int = 72; -pub const _SC_MONOTONIC_CLOCK: ::c_int = 74; -pub const _SC_READER_WRITER_LOCKS: ::c_int = 76; -pub const _SC_REGEXP: ::c_int = 77; -pub const _SC_SHELL: ::c_int = 78; -pub const _SC_SPAWN: ::c_int = 79; -pub const _SC_SPIN_LOCKS: ::c_int = 80; -pub const _SC_SPORADIC_SERVER: ::c_int = 81; -pub const _SC_THREAD_CPUTIME: ::c_int = 84; -pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 92; -pub const _SC_TIMEOUTS: ::c_int = 95; -pub const _SC_TRACE: ::c_int = 97; -pub const _SC_TRACE_EVENT_FILTER: ::c_int = 98; -pub const _SC_TRACE_INHERIT: ::c_int = 99; -pub const _SC_TRACE_LOG: ::c_int = 100; -pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 102; -pub const _SC_V6_ILP32_OFF32: ::c_int = 103; -pub const _SC_V6_ILP32_OFFBIG: ::c_int = 104; -pub const _SC_V6_LP64_OFF64: ::c_int = 105; -pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 106; -pub const _SC_IPV6: ::c_int = 118; -pub const _SC_RAW_SOCKETS: ::c_int = 119; -pub const _SC_SYMLOOP_MAX: ::c_int = 120; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_XOPEN_STREAMS: ::c_int = 114; -pub const _SC_XBS5_ILP32_OFF32: ::c_int = 122; -pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 123; -pub const _SC_XBS5_LP64_OFF64: ::c_int = 124; -pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 125; -pub const _SC_SS_REPL_MAX: ::c_int = 126; -pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 127; -pub const _SC_TRACE_NAME_MAX: ::c_int = 128; -pub const _SC_TRACE_SYS_MAX: ::c_int = 129; -pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 130; -pub const _SC_PASS_MAX: ::c_int = 131; - -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; -pub const _PTHREAD_MUTEX_SIG_init: ::c_long = 0x32AAABA7; -pub const _PTHREAD_COND_SIG_init: ::c_long = 0x3CB0B1BB; -pub const _PTHREAD_RWLOCK_SIG_init: ::c_long = 0x2DA8B3B4; -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - __sig: _PTHREAD_MUTEX_SIG_init, - __opaque: [0; __PTHREAD_MUTEX_SIZE__], -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - __sig: _PTHREAD_COND_SIG_init, - __opaque: [0; __PTHREAD_COND_SIZE__], -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - __sig: _PTHREAD_RWLOCK_SIG_init, - __opaque: [0; __PTHREAD_RWLOCK_SIZE__], -}; - -pub const SIGSTKSZ: ::size_t = 131072; - -pub const FD_SETSIZE: usize = 1024; - -pub const ST_NOSUID: ::c_ulong = 2; - -pub const EVFILT_READ: ::int16_t = -1; -pub const EVFILT_WRITE: ::int16_t = -2; -pub const EVFILT_AIO: ::int16_t = -3; -pub const EVFILT_VNODE: ::int16_t = -4; -pub const EVFILT_PROC: ::int16_t = -5; -pub const EVFILT_SIGNAL: ::int16_t = -6; -pub const EVFILT_TIMER: ::int16_t = -7; -pub const EVFILT_MACHPORT: ::int16_t = -8; -pub const EVFILT_FS: ::int16_t = -9; -pub const EVFILT_USER: ::int16_t = -10; -pub const EVFILT_VM: ::int16_t = -12; - -pub const EV_ADD: ::uint16_t = 0x1; -pub const EV_DELETE: ::uint16_t = 0x2; -pub const EV_ENABLE: ::uint16_t = 0x4; -pub const EV_DISABLE: ::uint16_t = 0x8; -pub const EV_ONESHOT: ::uint16_t = 0x10; -pub const EV_CLEAR: ::uint16_t = 0x20; -pub const EV_RECEIPT: ::uint16_t = 0x40; -pub const EV_DISPATCH: ::uint16_t = 0x80; -pub const EV_FLAG0: ::uint16_t = 0x1000; -pub const EV_POLL: ::uint16_t = 0x1000; -pub const EV_FLAG1: ::uint16_t = 0x2000; -pub const EV_OOBAND: ::uint16_t = 0x2000; -pub const EV_ERROR: ::uint16_t = 0x4000; -pub const EV_EOF: ::uint16_t = 0x8000; -pub const EV_SYSFLAGS: ::uint16_t = 0xf000; - -pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; -pub const NOTE_FFNOP: ::uint32_t = 0x00000000; -pub const NOTE_FFAND: ::uint32_t = 0x40000000; -pub const NOTE_FFOR: ::uint32_t = 0x80000000; -pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; -pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; -pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; -pub const NOTE_LOWAT: ::uint32_t = 0x00000001; -pub const NOTE_DELETE: ::uint32_t = 0x00000001; -pub const NOTE_WRITE: ::uint32_t = 0x00000002; -pub const NOTE_EXTEND: ::uint32_t = 0x00000004; -pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; -pub const NOTE_LINK: ::uint32_t = 0x00000010; -pub const NOTE_RENAME: ::uint32_t = 0x00000020; -pub const NOTE_REVOKE: ::uint32_t = 0x00000040; -pub const NOTE_NONE: ::uint32_t = 0x00000080; -pub const NOTE_EXIT: ::uint32_t = 0x80000000; -pub const NOTE_FORK: ::uint32_t = 0x40000000; -pub const NOTE_EXEC: ::uint32_t = 0x20000000; -pub const NOTE_REAP: ::uint32_t = 0x10000000; -pub const NOTE_SIGNAL: ::uint32_t = 0x08000000; -pub const NOTE_EXITSTATUS: ::uint32_t = 0x04000000; -pub const NOTE_EXIT_DETAIL: ::uint32_t = 0x02000000; -pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; -pub const NOTE_PCTRLMASK: ::uint32_t = 0xfff00000; -pub const NOTE_EXIT_REPARENTED: ::uint32_t = 0x00080000; -pub const NOTE_EXIT_DETAIL_MASK: ::uint32_t = 0x00070000; -pub const NOTE_EXIT_DECRYPTFAIL: ::uint32_t = 0x00010000; -pub const NOTE_EXIT_MEMORY: ::uint32_t = 0x00020000; -pub const NOTE_EXIT_CSERROR: ::uint32_t = 0x00040000; -pub const NOTE_VM_PRESSURE: ::uint32_t = 0x80000000; -pub const NOTE_VM_PRESSURE_TERMINATE: ::uint32_t = 0x40000000; -pub const NOTE_VM_PRESSURE_SUDDEN_TERMINATE: ::uint32_t = 0x20000000; -pub const NOTE_VM_ERROR: ::uint32_t = 0x10000000; -pub const NOTE_SECONDS: ::uint32_t = 0x00000001; -pub const NOTE_USECONDS: ::uint32_t = 0x00000002; -pub const NOTE_NSECONDS: ::uint32_t = 0x00000004; -pub const NOTE_ABSOLUTE: ::uint32_t = 0x00000008; -pub const NOTE_LEEWAY: ::uint32_t = 0x00000010; -pub const NOTE_CRITICAL: ::uint32_t = 0x00000020; -pub const NOTE_BACKGROUND: ::uint32_t = 0x00000040; -pub const NOTE_TRACK: ::uint32_t = 0x00000001; -pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; -pub const NOTE_CHILD: ::uint32_t = 0x00000004; - -pub const NL0: ::c_int = 0x00000000; -pub const NL1: ::c_int = 0x00000100; -pub const TAB0: ::c_int = 0x00000000; -pub const TAB1: ::c_int = 0x00000400; -pub const TAB2: ::c_int = 0x00000800; -pub const CR0: ::c_int = 0x00000000; -pub const CR1: ::c_int = 0x00001000; -pub const CR2: ::c_int = 0x00002000; -pub const CR3: ::c_int = 0x00003000; -pub const FF0: ::c_int = 0x00000000; -pub const FF1: ::c_int = 0x00004000; -pub const BS0: ::c_int = 0x00000000; -pub const BS1: ::c_int = 0x00008000; -pub const TAB3: ::c_int = 0x00000004; -pub const VT0: ::c_int = 0x00000000; -pub const VT1: ::c_int = 0x00010000; -pub const IUTF8: ::tcflag_t = 0x00004000; -pub const CRTSCTS: ::tcflag_t = 0x00030000; - -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const Q_GETQUOTA: ::c_int = 0x300; -pub const Q_SETQUOTA: ::c_int = 0x400; - -pub const RTLD_LOCAL: ::c_int = 0x4; -pub const RTLD_FIRST: ::c_int = 0x100; -pub const RTLD_NODELETE: ::c_int = 0x80; -pub const RTLD_NOLOAD: ::c_int = 0x10; -pub const RTLD_GLOBAL: ::c_int = 0x8; - -pub const _WSTOPPED: ::c_int = 0o177; - -pub const LOG_NETINFO: ::c_int = 12 << 3; -pub const LOG_REMOTEAUTH: ::c_int = 13 << 3; -pub const LOG_INSTALL: ::c_int = 14 << 3; -pub const LOG_RAS: ::c_int = 15 << 3; -pub const LOG_LAUNCHD: ::c_int = 24 << 3; -pub const LOG_NFACILITIES: ::c_int = 25; - -pub const CTLTYPE: ::c_int = 0xf; -pub const CTLTYPE_NODE: ::c_int = 1; -pub const CTLTYPE_INT: ::c_int = 2; -pub const CTLTYPE_STRING: ::c_int = 3; -pub const CTLTYPE_QUAD: ::c_int = 4; -pub const CTLTYPE_OPAQUE: ::c_int = 5; -pub const CTLTYPE_STRUCT: ::c_int = CTLTYPE_OPAQUE; -pub const CTLFLAG_RD: ::c_int = 0x80000000; -pub const CTLFLAG_WR: ::c_int = 0x40000000; -pub const CTLFLAG_RW: ::c_int = CTLFLAG_RD | CTLFLAG_WR; -pub const CTLFLAG_NOLOCK: ::c_int = 0x20000000; -pub const CTLFLAG_ANYBODY: ::c_int = 0x10000000; -pub const CTLFLAG_SECURE: ::c_int = 0x08000000; -pub const CTLFLAG_MASKED: ::c_int = 0x04000000; -pub const CTLFLAG_NOAUTO: ::c_int = 0x02000000; -pub const CTLFLAG_KERN: ::c_int = 0x01000000; -pub const CTLFLAG_LOCKED: ::c_int = 0x00800000; -pub const CTLFLAG_OID2: ::c_int = 0x00400000; -pub const CTL_UNSPEC: ::c_int = 0; -pub const CTL_KERN: ::c_int = 1; -pub const CTL_VM: ::c_int = 2; -pub const CTL_VFS: ::c_int = 3; -pub const CTL_NET: ::c_int = 4; -pub const CTL_DEBUG: ::c_int = 5; -pub const CTL_HW: ::c_int = 6; -pub const CTL_MACHDEP: ::c_int = 7; -pub const CTL_USER: ::c_int = 8; -pub const CTL_MAXID: ::c_int = 9; -pub const KERN_OSTYPE: ::c_int = 1; -pub const KERN_OSRELEASE: ::c_int = 2; -pub const KERN_OSREV: ::c_int = 3; -pub const KERN_VERSION: ::c_int = 4; -pub const KERN_MAXVNODES: ::c_int = 5; -pub const KERN_MAXPROC: ::c_int = 6; -pub const KERN_MAXFILES: ::c_int = 7; -pub const KERN_ARGMAX: ::c_int = 8; -pub const KERN_SECURELVL: ::c_int = 9; -pub const KERN_HOSTNAME: ::c_int = 10; -pub const KERN_HOSTID: ::c_int = 11; -pub const KERN_CLOCKRATE: ::c_int = 12; -pub const KERN_VNODE: ::c_int = 13; -pub const KERN_PROC: ::c_int = 14; -pub const KERN_FILE: ::c_int = 15; -pub const KERN_PROF: ::c_int = 16; -pub const KERN_POSIX1: ::c_int = 17; -pub const KERN_NGROUPS: ::c_int = 18; -pub const KERN_JOB_CONTROL: ::c_int = 19; -pub const KERN_SAVED_IDS: ::c_int = 20; -pub const KERN_BOOTTIME: ::c_int = 21; -pub const KERN_NISDOMAINNAME: ::c_int = 22; -pub const KERN_DOMAINNAME: ::c_int = KERN_NISDOMAINNAME; -pub const KERN_MAXPARTITIONS: ::c_int = 23; -pub const KERN_KDEBUG: ::c_int = 24; -pub const KERN_UPDATEINTERVAL: ::c_int = 25; -pub const KERN_OSRELDATE: ::c_int = 26; -pub const KERN_NTP_PLL: ::c_int = 27; -pub const KERN_BOOTFILE: ::c_int = 28; -pub const KERN_MAXFILESPERPROC: ::c_int = 29; -pub const KERN_MAXPROCPERUID: ::c_int = 30; -pub const KERN_DUMPDEV: ::c_int = 31; -pub const KERN_IPC: ::c_int = 32; -pub const KERN_DUMMY: ::c_int = 33; -pub const KERN_PS_STRINGS: ::c_int = 34; -pub const KERN_USRSTACK32: ::c_int = 35; -pub const KERN_LOGSIGEXIT: ::c_int = 36; -pub const KERN_SYMFILE: ::c_int = 37; -pub const KERN_PROCARGS: ::c_int = 38; -pub const KERN_NETBOOT: ::c_int = 40; -pub const KERN_SYSV: ::c_int = 42; -pub const KERN_AFFINITY: ::c_int = 43; -pub const KERN_TRANSLATE: ::c_int = 44; -pub const KERN_CLASSIC: ::c_int = KERN_TRANSLATE; -pub const KERN_EXEC: ::c_int = 45; -pub const KERN_CLASSICHANDLER: ::c_int = KERN_EXEC; -pub const KERN_AIOMAX: ::c_int = 46; -pub const KERN_AIOPROCMAX: ::c_int = 47; -pub const KERN_AIOTHREADS: ::c_int = 48; -pub const KERN_COREFILE: ::c_int = 50; -pub const KERN_COREDUMP: ::c_int = 51; -pub const KERN_SUGID_COREDUMP: ::c_int = 52; -pub const KERN_PROCDELAYTERM: ::c_int = 53; -pub const KERN_SHREG_PRIVATIZABLE: ::c_int = 54; -pub const KERN_LOW_PRI_WINDOW: ::c_int = 56; -pub const KERN_LOW_PRI_DELAY: ::c_int = 57; -pub const KERN_POSIX: ::c_int = 58; -pub const KERN_USRSTACK64: ::c_int = 59; -pub const KERN_NX_PROTECTION: ::c_int = 60; -pub const KERN_TFP: ::c_int = 61; -pub const KERN_PROCNAME: ::c_int = 62; -pub const KERN_THALTSTACK: ::c_int = 63; -pub const KERN_SPECULATIVE_READS: ::c_int = 64; -pub const KERN_OSVERSION: ::c_int = 65; -pub const KERN_SAFEBOOT: ::c_int = 66; -pub const KERN_RAGEVNODE: ::c_int = 68; -pub const KERN_TTY: ::c_int = 69; -pub const KERN_CHECKOPENEVT: ::c_int = 70; -pub const KERN_THREADNAME: ::c_int = 71; -pub const KERN_MAXID: ::c_int = 72; -pub const KERN_RAGE_PROC: ::c_int = 1; -pub const KERN_RAGE_THREAD: ::c_int = 2; -pub const KERN_UNRAGE_PROC: ::c_int = 3; -pub const KERN_UNRAGE_THREAD: ::c_int = 4; -pub const KERN_OPENEVT_PROC: ::c_int = 1; -pub const KERN_UNOPENEVT_PROC: ::c_int = 2; -pub const KERN_TFP_POLICY: ::c_int = 1; -pub const KERN_TFP_POLICY_DENY: ::c_int = 0; -pub const KERN_TFP_POLICY_DEFAULT: ::c_int = 2; -pub const KERN_KDEFLAGS: ::c_int = 1; -pub const KERN_KDDFLAGS: ::c_int = 2; -pub const KERN_KDENABLE: ::c_int = 3; -pub const KERN_KDSETBUF: ::c_int = 4; -pub const KERN_KDGETBUF: ::c_int = 5; -pub const KERN_KDSETUP: ::c_int = 6; -pub const KERN_KDREMOVE: ::c_int = 7; -pub const KERN_KDSETREG: ::c_int = 8; -pub const KERN_KDGETREG: ::c_int = 9; -pub const KERN_KDREADTR: ::c_int = 10; -pub const KERN_KDPIDTR: ::c_int = 11; -pub const KERN_KDTHRMAP: ::c_int = 12; -pub const KERN_KDPIDEX: ::c_int = 14; -pub const KERN_KDSETRTCDEC: ::c_int = 15; -pub const KERN_KDGETENTROPY: ::c_int = 16; -pub const KERN_KDWRITETR: ::c_int = 17; -pub const KERN_KDWRITEMAP: ::c_int = 18; -pub const KERN_KDENABLE_BG_TRACE: ::c_int = 19; -pub const KERN_KDDISABLE_BG_TRACE: ::c_int = 20; -pub const KERN_KDREADCURTHRMAP: ::c_int = 21; -pub const KERN_KDSET_TYPEFILTER: ::c_int = 22; -pub const KERN_KDBUFWAIT: ::c_int = 23; -pub const KERN_KDCPUMAP: ::c_int = 24; -pub const KERN_PROC_ALL: ::c_int = 0; -pub const KERN_PROC_PID: ::c_int = 1; -pub const KERN_PROC_PGRP: ::c_int = 2; -pub const KERN_PROC_SESSION: ::c_int = 3; -pub const KERN_PROC_TTY: ::c_int = 4; -pub const KERN_PROC_UID: ::c_int = 5; -pub const KERN_PROC_RUID: ::c_int = 6; -pub const KERN_PROC_LCID: ::c_int = 7; -pub const KIPC_MAXSOCKBUF: ::c_int = 1; -pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; -pub const KIPC_SOMAXCONN: ::c_int = 3; -pub const KIPC_MAX_LINKHDR: ::c_int = 4; -pub const KIPC_MAX_PROTOHDR: ::c_int = 5; -pub const KIPC_MAX_HDR: ::c_int = 6; -pub const KIPC_MAX_DATALEN: ::c_int = 7; -pub const KIPC_MBSTAT: ::c_int = 8; -pub const KIPC_NMBCLUSTERS: ::c_int = 9; -pub const KIPC_SOQLIMITCOMPAT: ::c_int = 10; -pub const VM_METER: ::c_int = 1; -pub const VM_LOADAVG: ::c_int = 2; -pub const VM_MACHFACTOR: ::c_int = 4; -pub const VM_SWAPUSAGE: ::c_int = 5; -pub const VM_MAXID: ::c_int = 6; -pub const HW_MACHINE: ::c_int = 1; -pub const HW_MODEL: ::c_int = 2; -pub const HW_NCPU: ::c_int = 3; -pub const HW_BYTEORDER: ::c_int = 4; -pub const HW_PHYSMEM: ::c_int = 5; -pub const HW_USERMEM: ::c_int = 6; -pub const HW_PAGESIZE: ::c_int = 7; -pub const HW_DISKNAMES: ::c_int = 8; -pub const HW_DISKSTATS: ::c_int = 9; -pub const HW_EPOCH: ::c_int = 10; -pub const HW_FLOATINGPT: ::c_int = 11; -pub const HW_MACHINE_ARCH: ::c_int = 12; -pub const HW_VECTORUNIT: ::c_int = 13; -pub const HW_BUS_FREQ: ::c_int = 14; -pub const HW_CPU_FREQ: ::c_int = 15; -pub const HW_CACHELINE: ::c_int = 16; -pub const HW_L1ICACHESIZE: ::c_int = 17; -pub const HW_L1DCACHESIZE: ::c_int = 18; -pub const HW_L2SETTINGS: ::c_int = 19; -pub const HW_L2CACHESIZE: ::c_int = 20; -pub const HW_L3SETTINGS: ::c_int = 21; -pub const HW_L3CACHESIZE: ::c_int = 22; -pub const HW_TB_FREQ: ::c_int = 23; -pub const HW_MEMSIZE: ::c_int = 24; -pub const HW_AVAILCPU: ::c_int = 25; -pub const HW_MAXID: ::c_int = 26; -pub const USER_CS_PATH: ::c_int = 1; -pub const USER_BC_BASE_MAX: ::c_int = 2; -pub const USER_BC_DIM_MAX: ::c_int = 3; -pub const USER_BC_SCALE_MAX: ::c_int = 4; -pub const USER_BC_STRING_MAX: ::c_int = 5; -pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; -pub const USER_EXPR_NEST_MAX: ::c_int = 7; -pub const USER_LINE_MAX: ::c_int = 8; -pub const USER_RE_DUP_MAX: ::c_int = 9; -pub const USER_POSIX2_VERSION: ::c_int = 10; -pub const USER_POSIX2_C_BIND: ::c_int = 11; -pub const USER_POSIX2_C_DEV: ::c_int = 12; -pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; -pub const USER_POSIX2_FORT_DEV: ::c_int = 14; -pub const USER_POSIX2_FORT_RUN: ::c_int = 15; -pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; -pub const USER_POSIX2_SW_DEV: ::c_int = 17; -pub const USER_POSIX2_UPE: ::c_int = 18; -pub const USER_STREAM_MAX: ::c_int = 19; -pub const USER_TZNAME_MAX: ::c_int = 20; -pub const USER_MAXID: ::c_int = 21; -pub const CTL_DEBUG_NAME: ::c_int = 0; -pub const CTL_DEBUG_VALUE: ::c_int = 1; -pub const CTL_DEBUG_MAXID: ::c_int = 20; - -pub const POLLRDNORM: ::c_short = 0x040; -pub const POLLWRNORM: ::c_short = 0x004; -pub const POLLRDBAND: ::c_short = 0x080; -pub const POLLWRBAND: ::c_short = 0x100; - -pub const PRIO_DARWIN_THREAD: ::c_int = 3; -pub const PRIO_DARWIN_PROCESS: ::c_int = 4; -pub const PRIO_DARWIN_BG: ::c_int = 0x1000; -pub const PRIO_DARWIN_NONUI: ::c_int = 0x1001; - -pub const SEM_FAILED: *mut sem_t = -1isize as *mut ::sem_t; - -pub const SIGEV_NONE: ::c_int = 0; -pub const SIGEV_SIGNAL: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 3; - -pub const AIO_CANCELED: ::c_int = 2; -pub const AIO_NOTCANCELED: ::c_int = 4; -pub const AIO_ALLDONE: ::c_int = 1; -pub const AIO_LISTIO_MAX: ::c_int = 16; -pub const LIO_NOP: ::c_int = 0; -pub const LIO_WRITE: ::c_int = 2; -pub const LIO_READ: ::c_int = 1; -pub const LIO_WAIT: ::c_int = 2; -pub const LIO_NOWAIT: ::c_int = 1; - -pub const WEXITED: ::c_int = 0x00000004; -pub const WSTOPPED: ::c_int = 0x00000008; -pub const WCONTINUED: ::c_int = 0x00000010; -pub const WNOWAIT: ::c_int = 0x00000020; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 2; - -f! { - pub fn WSTOPSIG(status: ::c_int) -> ::c_int { - status >> 8 - } - - pub fn _WSTATUS(status: ::c_int) -> ::c_int { - status & 0x7f - } - - pub fn WIFCONTINUED(status: ::c_int) -> bool { - _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) == 0x13 - } - - pub fn WIFSIGNALED(status: ::c_int) -> bool { - _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0 - } - - pub fn WIFSTOPPED(status: ::c_int) -> bool { - _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) != 0x13 - } -} - -extern { - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "aio_suspend$UNIX2003")] - pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, - nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; - - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - - pub fn getutxent() -> *mut utmpx; - pub fn getutxid(ut: *const utmpx) -> *mut utmpx; - pub fn getutxline(ut: *const utmpx) -> *mut utmpx; - pub fn pututxline(ut: *const utmpx) -> *mut utmpx; - pub fn setutxent(); - pub fn endutxent(); - pub fn utmpxname(file: *const ::c_char) -> ::c_int; - - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int) -> ::c_int; - pub fn mincore(addr: *const ::c_void, len: ::size_t, - vec: *mut ::c_char) -> ::c_int; - pub fn sysctlnametomib(name: *const ::c_char, - mibp: *mut ::c_int, - sizep: *mut ::size_t) - -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "mprotect$UNIX2003")] - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn shm_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::c_int; - pub fn sysctl(name: *mut ::c_int, - namelen: ::c_uint, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn sysctlbyname(name: *const ::c_char, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn mach_absolute_time() -> u64; - pub fn mach_timebase_info(info: *mut ::mach_timebase_info) -> ::c_int; - pub fn pthread_setname_np(name: *const ::c_char) -> ::c_int; - pub fn pthread_get_stackaddr_np(thread: ::pthread_t) -> *mut ::c_void; - pub fn pthread_get_stacksize_np(thread: ::pthread_t) -> ::size_t; - pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn __error() -> *mut ::c_int; - pub fn backtrace(buf: *mut *mut ::c_void, - sz: ::c_int) -> ::c_int; - #[cfg_attr(target_os = "macos", link_name = "statfs$INODE64")] - pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; - #[cfg_attr(target_os = "macos", link_name = "fstatfs$INODE64")] - pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; - pub fn kevent(kq: ::c_int, - changelist: *const ::kevent, - nchanges: ::c_int, - eventlist: *mut ::kevent, - nevents: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn kevent64(kq: ::c_int, - changelist: *const ::kevent64_s, - nchanges: ::c_int, - eventlist: *mut ::kevent64_s, - nevents: ::c_int, - flags: ::c_uint, - timeout: *const ::timespec) -> ::c_int; - pub fn mount(src: *const ::c_char, - target: *const ::c_char, - flags: ::c_int, - data: *mut ::c_void) -> ::c_int; - pub fn ptrace(requeset: ::c_int, - pid: ::pid_t, - addr: *mut ::c_char, - data: ::c_int) -> ::c_int; - pub fn quotactl(special: *const ::c_char, - cmd: ::c_int, - id: ::c_int, - data: *mut ::c_char) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; - pub fn sendfile(fd: ::c_int, - s: ::c_int, - offset: ::off_t, - len: *mut ::off_t, - hdtr: *mut ::sf_hdtr, - flags: ::c_int) -> ::c_int; - pub fn openpty(amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::c_int; - pub fn forkpty(amaster: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::pid_t; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t) -> ::c_int; - pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; - pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; - - pub fn initgroups(user: *const ::c_char, basegroup: ::c_int) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "waitid$UNIX2003")] - pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, - options: ::c_int) -> ::c_int; - -} - -cfg_if! { - if #[cfg(any(target_arch = "arm", target_arch = "x86"))] { - mod b32; - pub use self::b32::*; - } else if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] { - mod b64; - pub use self::b64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs deleted file mode 100644 index e60825a52..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/dragonfly/mod.rs +++ /dev/null @@ -1,420 +0,0 @@ -pub type clock_t = u64; -pub type ino_t = u64; -pub type nlink_t = u32; -pub type blksize_t = i64; -pub type clockid_t = ::c_ulong; - -pub type c_long = i64; -pub type c_ulong = u64; -pub type time_t = i64; -pub type suseconds_t = i64; - -pub type uuid_t = ::uuid; - -pub type fsblkcnt_t = u64; -pub type fsfilcnt_t = u64; - -pub type sem_t = *mut sem; - -pub enum sem {} - -s! { - - pub struct exit_status { - pub e_termination: u16, - pub e_exit: u16 - } - - pub struct utmpx { - pub ut_name: [::c_char; 32], - pub ut_id: [::c_char; 4], - - pub ut_line: [::c_char; 32], - pub ut_host: [::c_char; 256], - - pub ut_unused: [u8; 16], - pub ut_session: u16, - pub ut_type: u16, - pub ut_pid: ::pid_t, - ut_exit: exit_status, - ut_ss: ::sockaddr_storage, - pub ut_tv: ::timeval, - pub ut_unused2: [u8; 16], - } - - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_offset: ::off_t, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: sigevent, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - _aio_val: ::c_int, - _aio_err: ::c_int - } - - pub struct dirent { - pub d_fileno: ::ino_t, - pub d_namlen: u16, - pub d_type: u8, - __unused1: u8, - __unused2: u32, - pub d_name: [::c_char; 256], - } - - pub struct uuid { - pub time_low: u32, - pub time_mid: u16, - pub time_hi_and_version: u16, - pub clock_seq_hi_and_reserved: u8, - pub clock_seq_low: u8, - pub node: [u8; 6], - } - - pub struct sigevent { - pub sigev_notify: ::c_int, - // The union is 8-byte in size, so it is aligned at a 8-byte offset. - #[cfg(target_pointer_width = "64")] - __unused1: ::c_int, - pub sigev_signo: ::c_int, //actually a union - // pad the union - #[cfg(target_pointer_width = "64")] - __unused2: ::c_int, - pub sigev_value: ::sigval, - __unused3: *mut ::c_void //actually a function pointer - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - pub f_owner: ::uid_t, - pub f_type: ::c_uint, - pub f_syncreads: u64, - pub f_syncwrites: u64, - pub f_asyncreads: u64, - pub f_asyncwrites: u64, - pub f_fsid_uuid: ::uuid_t, - pub f_uid_uuid: ::uuid_t, - } - - pub struct stat { - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_dev: ::dev_t, - pub st_mode: ::mode_t, - pub st_padding1: ::uint16_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::int64_t, - pub st_blksize: ::uint32_t, - pub st_flags: ::uint32_t, - pub st_gen: ::uint32_t, - pub st_lspare: ::int32_t, - pub st_qspare1: ::int64_t, - pub st_qspare2: ::int64_t, - } -} - -pub const RAND_MAX: ::c_int = 0x7fff_ffff; -pub const PTHREAD_STACK_MIN: ::size_t = 1024; -pub const SIGSTKSZ: ::size_t = 40960; -pub const MADV_INVAL: ::c_int = 10; -pub const O_CLOEXEC: ::c_int = 0x00020000; -pub const F_GETLK: ::c_int = 7; -pub const F_SETLK: ::c_int = 8; -pub const F_SETLKW: ::c_int = 9; -pub const ELAST: ::c_int = 99; -pub const RLIMIT_POSIXLOCKS: ::c_int = 11; -pub const RLIM_NLIMITS: ::rlim_t = 12; - -pub const Q_GETQUOTA: ::c_int = 0x300; -pub const Q_SETQUOTA: ::c_int = 0x400; - -pub const CLOCK_REALTIME: clockid_t = 0; -pub const CLOCK_VIRTUAL: clockid_t = 1; -pub const CLOCK_PROF: clockid_t = 2; -pub const CLOCK_MONOTONIC: clockid_t = 4; -pub const CLOCK_UPTIME: clockid_t = 5; -pub const CLOCK_UPTIME_PRECISE: clockid_t = 7; -pub const CLOCK_UPTIME_FAST: clockid_t = 8; -pub const CLOCK_REALTIME_PRECISE: clockid_t = 9; -pub const CLOCK_REALTIME_FAST: clockid_t = 10; -pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11; -pub const CLOCK_MONOTONIC_FAST: clockid_t = 12; -pub const CLOCK_SECOND: clockid_t = 13; -pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14; -pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15; - -pub const CTL_UNSPEC: ::c_int = 0; -pub const CTL_KERN: ::c_int = 1; -pub const CTL_VM: ::c_int = 2; -pub const CTL_VFS: ::c_int = 3; -pub const CTL_NET: ::c_int = 4; -pub const CTL_DEBUG: ::c_int = 5; -pub const CTL_HW: ::c_int = 6; -pub const CTL_MACHDEP: ::c_int = 7; -pub const CTL_USER: ::c_int = 8; -pub const CTL_P1003_1B: ::c_int = 9; -pub const CTL_LWKT: ::c_int = 10; -pub const CTL_MAXID: ::c_int = 11; -pub const KERN_OSTYPE: ::c_int = 1; -pub const KERN_OSRELEASE: ::c_int = 2; -pub const KERN_OSREV: ::c_int = 3; -pub const KERN_VERSION: ::c_int = 4; -pub const KERN_MAXVNODES: ::c_int = 5; -pub const KERN_MAXPROC: ::c_int = 6; -pub const KERN_MAXFILES: ::c_int = 7; -pub const KERN_ARGMAX: ::c_int = 8; -pub const KERN_SECURELVL: ::c_int = 9; -pub const KERN_HOSTNAME: ::c_int = 10; -pub const KERN_HOSTID: ::c_int = 11; -pub const KERN_CLOCKRATE: ::c_int = 12; -pub const KERN_VNODE: ::c_int = 13; -pub const KERN_PROC: ::c_int = 14; -pub const KERN_FILE: ::c_int = 15; -pub const KERN_PROF: ::c_int = 16; -pub const KERN_POSIX1: ::c_int = 17; -pub const KERN_NGROUPS: ::c_int = 18; -pub const KERN_JOB_CONTROL: ::c_int = 19; -pub const KERN_SAVED_IDS: ::c_int = 20; -pub const KERN_BOOTTIME: ::c_int = 21; -pub const KERN_NISDOMAINNAME: ::c_int = 22; -pub const KERN_UPDATEINTERVAL: ::c_int = 23; -pub const KERN_OSRELDATE: ::c_int = 24; -pub const KERN_NTP_PLL: ::c_int = 25; -pub const KERN_BOOTFILE: ::c_int = 26; -pub const KERN_MAXFILESPERPROC: ::c_int = 27; -pub const KERN_MAXPROCPERUID: ::c_int = 28; -pub const KERN_DUMPDEV: ::c_int = 29; -pub const KERN_IPC: ::c_int = 30; -pub const KERN_DUMMY: ::c_int = 31; -pub const KERN_PS_STRINGS: ::c_int = 32; -pub const KERN_USRSTACK: ::c_int = 33; -pub const KERN_LOGSIGEXIT: ::c_int = 34; -pub const KERN_IOV_MAX: ::c_int = 35; -pub const KERN_MAXPOSIXLOCKSPERUID: ::c_int = 36; -pub const KERN_MAXID: ::c_int = 37; -pub const KERN_PROC_ALL: ::c_int = 0; -pub const KERN_PROC_PID: ::c_int = 1; -pub const KERN_PROC_PGRP: ::c_int = 2; -pub const KERN_PROC_SESSION: ::c_int = 3; -pub const KERN_PROC_TTY: ::c_int = 4; -pub const KERN_PROC_UID: ::c_int = 5; -pub const KERN_PROC_RUID: ::c_int = 6; -pub const KERN_PROC_ARGS: ::c_int = 7; -pub const KERN_PROC_CWD: ::c_int = 8; -pub const KERN_PROC_PATHNAME: ::c_int = 9; -pub const KERN_PROC_FLAGMASK: ::c_int = 0x10; -pub const KERN_PROC_FLAG_LWP: ::c_int = 0x10; -pub const KIPC_MAXSOCKBUF: ::c_int = 1; -pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; -pub const KIPC_SOMAXCONN: ::c_int = 3; -pub const KIPC_MAX_LINKHDR: ::c_int = 4; -pub const KIPC_MAX_PROTOHDR: ::c_int = 5; -pub const KIPC_MAX_HDR: ::c_int = 6; -pub const KIPC_MAX_DATALEN: ::c_int = 7; -pub const KIPC_MBSTAT: ::c_int = 8; -pub const KIPC_NMBCLUSTERS: ::c_int = 9; -pub const HW_MACHINE: ::c_int = 1; -pub const HW_MODEL: ::c_int = 2; -pub const HW_NCPU: ::c_int = 3; -pub const HW_BYTEORDER: ::c_int = 4; -pub const HW_PHYSMEM: ::c_int = 5; -pub const HW_USERMEM: ::c_int = 6; -pub const HW_PAGESIZE: ::c_int = 7; -pub const HW_DISKNAMES: ::c_int = 8; -pub const HW_DISKSTATS: ::c_int = 9; -pub const HW_FLOATINGPT: ::c_int = 10; -pub const HW_MACHINE_ARCH: ::c_int = 11; -pub const HW_MACHINE_PLATFORM: ::c_int = 12; -pub const HW_SENSORS: ::c_int = 13; -pub const HW_MAXID: ::c_int = 14; -pub const USER_CS_PATH: ::c_int = 1; -pub const USER_BC_BASE_MAX: ::c_int = 2; -pub const USER_BC_DIM_MAX: ::c_int = 3; -pub const USER_BC_SCALE_MAX: ::c_int = 4; -pub const USER_BC_STRING_MAX: ::c_int = 5; -pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; -pub const USER_EXPR_NEST_MAX: ::c_int = 7; -pub const USER_LINE_MAX: ::c_int = 8; -pub const USER_RE_DUP_MAX: ::c_int = 9; -pub const USER_POSIX2_VERSION: ::c_int = 10; -pub const USER_POSIX2_C_BIND: ::c_int = 11; -pub const USER_POSIX2_C_DEV: ::c_int = 12; -pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; -pub const USER_POSIX2_FORT_DEV: ::c_int = 14; -pub const USER_POSIX2_FORT_RUN: ::c_int = 15; -pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; -pub const USER_POSIX2_SW_DEV: ::c_int = 17; -pub const USER_POSIX2_UPE: ::c_int = 18; -pub const USER_STREAM_MAX: ::c_int = 19; -pub const USER_TZNAME_MAX: ::c_int = 20; -pub const USER_MAXID: ::c_int = 21; -pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; -pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; -pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; -pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; -pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; -pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; -pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; -pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; -pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; -pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; -pub const CTL_P1003_1B_FSYNC: ::c_int = 11; -pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; -pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; -pub const CTL_P1003_1B_TIMERS: ::c_int = 14; -pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; -pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; -pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; -pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; -pub const CTL_P1003_1B_UNUSED1: ::c_int = 19; -pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; -pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; -pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; -pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; -pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; -pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; -pub const CTL_P1003_1B_MAXID: ::c_int = 26; - -pub const EVFILT_READ: ::int16_t = -1; -pub const EVFILT_WRITE: ::int16_t = -2; -pub const EVFILT_AIO: ::int16_t = -3; -pub const EVFILT_VNODE: ::int16_t = -4; -pub const EVFILT_PROC: ::int16_t = -5; -pub const EVFILT_SIGNAL: ::int16_t = -6; -pub const EVFILT_TIMER: ::int16_t = -7; -pub const EVFILT_USER: ::int16_t = -9; -pub const EVFILT_FS: ::int16_t = -10; - -pub const EV_ADD: ::uint16_t = 0x1; -pub const EV_DELETE: ::uint16_t = 0x2; -pub const EV_ENABLE: ::uint16_t = 0x4; -pub const EV_DISABLE: ::uint16_t = 0x8; -pub const EV_ONESHOT: ::uint16_t = 0x10; -pub const EV_CLEAR: ::uint16_t = 0x20; -pub const EV_RECEIPT: ::uint16_t = 0x40; -pub const EV_DISPATCH: ::uint16_t = 0x80; -pub const EV_NODATA: ::uint16_t = 0x1000; -pub const EV_FLAG1: ::uint16_t = 0x2000; -pub const EV_ERROR: ::uint16_t = 0x4000; -pub const EV_EOF: ::uint16_t = 0x8000; -pub const EV_SYSFLAGS: ::uint16_t = 0xf000; - -pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; -pub const NOTE_FFNOP: ::uint32_t = 0x00000000; -pub const NOTE_FFAND: ::uint32_t = 0x40000000; -pub const NOTE_FFOR: ::uint32_t = 0x80000000; -pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; -pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; -pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; -pub const NOTE_LOWAT: ::uint32_t = 0x00000001; -pub const NOTE_OOB: ::uint32_t = 0x00000002; -pub const NOTE_DELETE: ::uint32_t = 0x00000001; -pub const NOTE_WRITE: ::uint32_t = 0x00000002; -pub const NOTE_EXTEND: ::uint32_t = 0x00000004; -pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; -pub const NOTE_LINK: ::uint32_t = 0x00000010; -pub const NOTE_RENAME: ::uint32_t = 0x00000020; -pub const NOTE_REVOKE: ::uint32_t = 0x00000040; -pub const NOTE_EXIT: ::uint32_t = 0x80000000; -pub const NOTE_FORK: ::uint32_t = 0x40000000; -pub const NOTE_EXEC: ::uint32_t = 0x20000000; -pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; -pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; -pub const NOTE_TRACK: ::uint32_t = 0x00000001; -pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; -pub const NOTE_CHILD: ::uint32_t = 0x00000004; - -pub const SO_SNDSPACE: ::c_int = 0x100a; -pub const SO_CPUHINT: ::c_int = 0x1030; - -pub const AF_BLUETOOTH: ::c_int = 33; -pub const AF_MPLS: ::c_int = 34; -pub const AF_IEEE80211: ::c_int = 35; -pub const AF_MAX: ::c_int = 36; - -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_MAX: ::c_int = AF_MAX; - -pub const NET_RT_DUMP: ::c_int = 1; -pub const NET_RT_FLAGS: ::c_int = 2; -pub const NET_RT_IFLIST: ::c_int = 3; -pub const NET_RT_MAXID: ::c_int = 4; - -pub const SOMAXOPT_SIZE: ::c_int = 65536; - -#[doc(hidden)] -pub const NET_MAXID: ::c_int = AF_MAX; - -pub const MSG_UNUSED09: ::c_int = 0x00000200; -pub const MSG_NOSIGNAL: ::c_int = 0x00000400; -pub const MSG_SYNC: ::c_int = 0x00000800; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00001000; -pub const MSG_FBLOCKING: ::c_int = 0x00010000; -pub const MSG_FNONBLOCKING: ::c_int = 0x00020000; -pub const MSG_FMASK: ::c_int = 0xFFFF0000; - -pub const EMPTY: ::c_short = 0; -pub const RUN_LVL: ::c_short = 1; -pub const BOOT_TIME: ::c_short = 2; -pub const OLD_TIME: ::c_short = 3; -pub const NEW_TIME: ::c_short = 4; -pub const INIT_PROCESS: ::c_short = 5; -pub const LOGIN_PROCESS: ::c_short = 6; -pub const USER_PROCESS: ::c_short = 7; -pub const DEAD_PROCESS: ::c_short = 8; - -pub const LC_COLLATE_MASK: ::c_int = (1 << 0); -pub const LC_CTYPE_MASK: ::c_int = (1 << 1); -pub const LC_MONETARY_MASK: ::c_int = (1 << 2); -pub const LC_NUMERIC_MASK: ::c_int = (1 << 3); -pub const LC_TIME_MASK: ::c_int = (1 << 4); -pub const LC_MESSAGES_MASK: ::c_int = (1 << 5); -pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK - | LC_CTYPE_MASK - | LC_MESSAGES_MASK - | LC_MONETARY_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK; - -pub const TIOCSIG: ::c_uint = 0x2000745f; -pub const BTUARTDISC: ::c_int = 0x7; -pub const TIOCDCDTIMESTAMP: ::c_uint = 0x40107458; -pub const TIOCISPTMASTER: ::c_uint = 0x20007455; -pub const TIOCMODG: ::c_uint = 0x40047403; -pub const TIOCMODS: ::c_ulong = 0x80047404; -pub const TIOCREMOTE: ::c_ulong = 0x80047469; - -extern { - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - - pub fn setutxdb(_type: ::c_uint, file: *mut ::c_char) -> ::c_int; - - pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, - timeout: *mut ::timespec) -> ::c_int; - - pub fn freelocale(loc: ::locale_t); -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs deleted file mode 100644 index a2da8452c..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/aarch64.rs +++ /dev/null @@ -1,30 +0,0 @@ -pub type c_long = i64; -pub type c_ulong = u64; -pub type time_t = i64; -pub type suseconds_t = i64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: ::blksize_t, - pub st_flags: ::fflags_t, - pub st_gen: ::uint32_t, - pub st_lspare: ::int32_t, - pub st_birthtime: ::time_t, - pub st_birthtime_nsec: ::c_long, - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs deleted file mode 100644 index fb113ded3..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/mod.rs +++ /dev/null @@ -1,577 +0,0 @@ -pub type fflags_t = u32; -pub type clock_t = i32; -pub type ino_t = u32; -pub type lwpid_t = i32; -pub type nlink_t = u16; -pub type blksize_t = u32; -pub type clockid_t = ::c_int; -pub type sem_t = _sem; - -pub type fsblkcnt_t = ::uint64_t; -pub type fsfilcnt_t = ::uint64_t; -pub type idtype_t = ::c_uint; - -pub type key_t = ::c_long; -pub type msglen_t = ::c_ulong; -pub type msgqnum_t = ::c_ulong; - -s! { - pub struct utmpx { - pub ut_type: ::c_short, - pub ut_tv: ::timeval, - pub ut_id: [::c_char; 8], - pub ut_pid: ::pid_t, - pub ut_user: [::c_char; 32], - pub ut_line: [::c_char; 16], - pub ut_host: [::c_char; 128], - pub __ut_spare: [::c_char; 64], - } - - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_offset: ::off_t, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - __unused1: [::c_int; 2], - __unused2: *mut ::c_void, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - // unused 3 through 5 are the __aiocb_private structure - __unused3: ::c_long, - __unused4: ::c_long, - __unused5: *mut ::c_void, - pub aio_sigevent: sigevent - } - - pub struct dirent { - pub d_fileno: u32, - pub d_reclen: u16, - pub d_type: u8, - pub d_namlen: u8, - pub d_name: [::c_char; 256], - } - - pub struct jail { - pub version: u32, - pub path: *mut ::c_char, - pub hostname: *mut ::c_char, - pub jailname: *mut ::c_char, - pub ip4s: ::c_uint, - pub ip6s: ::c_uint, - pub ip4: *mut ::in_addr, - pub ip6: *mut ::in6_addr, - } - - pub struct sigevent { - pub sigev_notify: ::c_int, - pub sigev_signo: ::c_int, - pub sigev_value: ::sigval, - //The rest of the structure is actually a union. We expose only - //sigev_notify_thread_id because it's the most useful union member. - pub sigev_notify_thread_id: ::lwpid_t, - #[cfg(target_pointer_width = "64")] - __unused1: ::c_int, - __unused2: [::c_long; 7] - } - - pub struct statvfs { - pub f_bavail: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_blocks: ::fsblkcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_bsize: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_fsid: ::c_ulong, - pub f_namemax: ::c_ulong, - } - - // internal structure has changed over time - pub struct _sem { - data: [u32; 4], - } - - pub struct ipc_perm { - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub mode: ::mode_t, - pub seq: ::c_ushort, - pub key: ::key_t, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - pub msg_cbytes: ::msglen_t, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - pub msg_stime: ::time_t, - pub msg_rtime: ::time_t, - pub msg_ctime: ::time_t, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_lpid: ::pid_t, - pub shm_cpid: ::pid_t, - pub shm_nattch: ::c_int, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - } -} - -pub const SIGEV_THREAD_ID: ::c_int = 4; - -pub const RAND_MAX: ::c_int = 0x7fff_fffd; -pub const PTHREAD_STACK_MIN: ::size_t = 2048; -pub const PTHREAD_MUTEX_ADAPTIVE_NP: ::c_int = 4; -pub const SIGSTKSZ: ::size_t = 34816; -pub const SF_NODISKIO: ::c_int = 0x00000001; -pub const SF_MNOWAIT: ::c_int = 0x00000002; -pub const SF_SYNC: ::c_int = 0x00000004; -pub const O_CLOEXEC: ::c_int = 0x00100000; -pub const F_GETLK: ::c_int = 11; -pub const F_SETLK: ::c_int = 12; -pub const F_SETLKW: ::c_int = 13; -pub const ELAST: ::c_int = 96; -pub const RLIMIT_NPTS: ::c_int = 11; -pub const RLIMIT_SWAP: ::c_int = 12; -pub const RLIM_NLIMITS: ::rlim_t = 13; - -pub const Q_GETQUOTA: ::c_int = 0x700; -pub const Q_SETQUOTA: ::c_int = 0x800; - -pub const POSIX_FADV_NORMAL: ::c_int = 0; -pub const POSIX_FADV_RANDOM: ::c_int = 1; -pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_FADV_WILLNEED: ::c_int = 3; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; - -pub const EVFILT_READ: ::int16_t = -1; -pub const EVFILT_WRITE: ::int16_t = -2; -pub const EVFILT_AIO: ::int16_t = -3; -pub const EVFILT_VNODE: ::int16_t = -4; -pub const EVFILT_PROC: ::int16_t = -5; -pub const EVFILT_SIGNAL: ::int16_t = -6; -pub const EVFILT_TIMER: ::int16_t = -7; -pub const EVFILT_FS: ::int16_t = -9; -pub const EVFILT_LIO: ::int16_t = -10; -pub const EVFILT_USER: ::int16_t = -11; - -pub const EV_ADD: ::uint16_t = 0x1; -pub const EV_DELETE: ::uint16_t = 0x2; -pub const EV_ENABLE: ::uint16_t = 0x4; -pub const EV_DISABLE: ::uint16_t = 0x8; -pub const EV_ONESHOT: ::uint16_t = 0x10; -pub const EV_CLEAR: ::uint16_t = 0x20; -pub const EV_RECEIPT: ::uint16_t = 0x40; -pub const EV_DISPATCH: ::uint16_t = 0x80; -pub const EV_DROP: ::uint16_t = 0x1000; -pub const EV_FLAG1: ::uint16_t = 0x2000; -pub const EV_ERROR: ::uint16_t = 0x4000; -pub const EV_EOF: ::uint16_t = 0x8000; -pub const EV_SYSFLAGS: ::uint16_t = 0xf000; - -pub const NOTE_TRIGGER: ::uint32_t = 0x01000000; -pub const NOTE_FFNOP: ::uint32_t = 0x00000000; -pub const NOTE_FFAND: ::uint32_t = 0x40000000; -pub const NOTE_FFOR: ::uint32_t = 0x80000000; -pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000; -pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000; -pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff; -pub const NOTE_LOWAT: ::uint32_t = 0x00000001; -pub const NOTE_DELETE: ::uint32_t = 0x00000001; -pub const NOTE_WRITE: ::uint32_t = 0x00000002; -pub const NOTE_EXTEND: ::uint32_t = 0x00000004; -pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; -pub const NOTE_LINK: ::uint32_t = 0x00000010; -pub const NOTE_RENAME: ::uint32_t = 0x00000020; -pub const NOTE_REVOKE: ::uint32_t = 0x00000040; -pub const NOTE_EXIT: ::uint32_t = 0x80000000; -pub const NOTE_FORK: ::uint32_t = 0x40000000; -pub const NOTE_EXEC: ::uint32_t = 0x20000000; -pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; -pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; -pub const NOTE_TRACK: ::uint32_t = 0x00000001; -pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; -pub const NOTE_CHILD: ::uint32_t = 0x00000004; -pub const NOTE_SECONDS: ::uint32_t = 0x00000001; -pub const NOTE_MSECONDS: ::uint32_t = 0x00000002; -pub const NOTE_USECONDS: ::uint32_t = 0x00000004; -pub const NOTE_NSECONDS: ::uint32_t = 0x00000008; - -pub const MADV_PROTECT: ::c_int = 10; -pub const RUSAGE_THREAD: ::c_int = 1; - -pub const CLOCK_REALTIME: clockid_t = 0; -pub const CLOCK_VIRTUAL: clockid_t = 1; -pub const CLOCK_PROF: clockid_t = 2; -pub const CLOCK_MONOTONIC: clockid_t = 4; -pub const CLOCK_UPTIME: clockid_t = 5; -pub const CLOCK_UPTIME_PRECISE: clockid_t = 7; -pub const CLOCK_UPTIME_FAST: clockid_t = 8; -pub const CLOCK_REALTIME_PRECISE: clockid_t = 9; -pub const CLOCK_REALTIME_FAST: clockid_t = 10; -pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11; -pub const CLOCK_MONOTONIC_FAST: clockid_t = 12; -pub const CLOCK_SECOND: clockid_t = 13; -pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14; -pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15; - -pub const CTL_UNSPEC: ::c_int = 0; -pub const CTL_KERN: ::c_int = 1; -pub const CTL_VM: ::c_int = 2; -pub const CTL_VFS: ::c_int = 3; -pub const CTL_NET: ::c_int = 4; -pub const CTL_DEBUG: ::c_int = 5; -pub const CTL_HW: ::c_int = 6; -pub const CTL_MACHDEP: ::c_int = 7; -pub const CTL_USER: ::c_int = 8; -pub const CTL_P1003_1B: ::c_int = 9; -pub const KERN_OSTYPE: ::c_int = 1; -pub const KERN_OSRELEASE: ::c_int = 2; -pub const KERN_OSREV: ::c_int = 3; -pub const KERN_VERSION: ::c_int = 4; -pub const KERN_MAXVNODES: ::c_int = 5; -pub const KERN_MAXPROC: ::c_int = 6; -pub const KERN_MAXFILES: ::c_int = 7; -pub const KERN_ARGMAX: ::c_int = 8; -pub const KERN_SECURELVL: ::c_int = 9; -pub const KERN_HOSTNAME: ::c_int = 10; -pub const KERN_HOSTID: ::c_int = 11; -pub const KERN_CLOCKRATE: ::c_int = 12; -pub const KERN_VNODE: ::c_int = 13; -pub const KERN_PROC: ::c_int = 14; -pub const KERN_FILE: ::c_int = 15; -pub const KERN_PROF: ::c_int = 16; -pub const KERN_POSIX1: ::c_int = 17; -pub const KERN_NGROUPS: ::c_int = 18; -pub const KERN_JOB_CONTROL: ::c_int = 19; -pub const KERN_SAVED_IDS: ::c_int = 20; -pub const KERN_BOOTTIME: ::c_int = 21; -pub const KERN_NISDOMAINNAME: ::c_int = 22; -pub const KERN_UPDATEINTERVAL: ::c_int = 23; -pub const KERN_OSRELDATE: ::c_int = 24; -pub const KERN_NTP_PLL: ::c_int = 25; -pub const KERN_BOOTFILE: ::c_int = 26; -pub const KERN_MAXFILESPERPROC: ::c_int = 27; -pub const KERN_MAXPROCPERUID: ::c_int = 28; -pub const KERN_DUMPDEV: ::c_int = 29; -pub const KERN_IPC: ::c_int = 30; -pub const KERN_DUMMY: ::c_int = 31; -pub const KERN_PS_STRINGS: ::c_int = 32; -pub const KERN_USRSTACK: ::c_int = 33; -pub const KERN_LOGSIGEXIT: ::c_int = 34; -pub const KERN_IOV_MAX: ::c_int = 35; -pub const KERN_HOSTUUID: ::c_int = 36; -pub const KERN_ARND: ::c_int = 37; -pub const KERN_PROC_ALL: ::c_int = 0; -pub const KERN_PROC_PID: ::c_int = 1; -pub const KERN_PROC_PGRP: ::c_int = 2; -pub const KERN_PROC_SESSION: ::c_int = 3; -pub const KERN_PROC_TTY: ::c_int = 4; -pub const KERN_PROC_UID: ::c_int = 5; -pub const KERN_PROC_RUID: ::c_int = 6; -pub const KERN_PROC_ARGS: ::c_int = 7; -pub const KERN_PROC_PROC: ::c_int = 8; -pub const KERN_PROC_SV_NAME: ::c_int = 9; -pub const KERN_PROC_RGID: ::c_int = 10; -pub const KERN_PROC_GID: ::c_int = 11; -pub const KERN_PROC_PATHNAME: ::c_int = 12; -pub const KERN_PROC_OVMMAP: ::c_int = 13; -pub const KERN_PROC_OFILEDESC: ::c_int = 14; -pub const KERN_PROC_KSTACK: ::c_int = 15; -pub const KERN_PROC_INC_THREAD: ::c_int = 0x10; -pub const KERN_PROC_VMMAP: ::c_int = 32; -pub const KERN_PROC_FILEDESC: ::c_int = 33; -pub const KERN_PROC_GROUPS: ::c_int = 34; -pub const KERN_PROC_ENV: ::c_int = 35; -pub const KERN_PROC_AUXV: ::c_int = 36; -pub const KERN_PROC_RLIMIT: ::c_int = 37; -pub const KERN_PROC_PS_STRINGS: ::c_int = 38; -pub const KERN_PROC_UMASK: ::c_int = 39; -pub const KERN_PROC_OSREL: ::c_int = 40; -pub const KERN_PROC_SIGTRAMP: ::c_int = 41; -pub const KIPC_MAXSOCKBUF: ::c_int = 1; -pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; -pub const KIPC_SOMAXCONN: ::c_int = 3; -pub const KIPC_MAX_LINKHDR: ::c_int = 4; -pub const KIPC_MAX_PROTOHDR: ::c_int = 5; -pub const KIPC_MAX_HDR: ::c_int = 6; -pub const KIPC_MAX_DATALEN: ::c_int = 7; -pub const HW_MACHINE: ::c_int = 1; -pub const HW_MODEL: ::c_int = 2; -pub const HW_NCPU: ::c_int = 3; -pub const HW_BYTEORDER: ::c_int = 4; -pub const HW_PHYSMEM: ::c_int = 5; -pub const HW_USERMEM: ::c_int = 6; -pub const HW_PAGESIZE: ::c_int = 7; -pub const HW_DISKNAMES: ::c_int = 8; -pub const HW_DISKSTATS: ::c_int = 9; -pub const HW_FLOATINGPT: ::c_int = 10; -pub const HW_MACHINE_ARCH: ::c_int = 11; -pub const HW_REALMEM: ::c_int = 12; -pub const USER_CS_PATH: ::c_int = 1; -pub const USER_BC_BASE_MAX: ::c_int = 2; -pub const USER_BC_DIM_MAX: ::c_int = 3; -pub const USER_BC_SCALE_MAX: ::c_int = 4; -pub const USER_BC_STRING_MAX: ::c_int = 5; -pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; -pub const USER_EXPR_NEST_MAX: ::c_int = 7; -pub const USER_LINE_MAX: ::c_int = 8; -pub const USER_RE_DUP_MAX: ::c_int = 9; -pub const USER_POSIX2_VERSION: ::c_int = 10; -pub const USER_POSIX2_C_BIND: ::c_int = 11; -pub const USER_POSIX2_C_DEV: ::c_int = 12; -pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; -pub const USER_POSIX2_FORT_DEV: ::c_int = 14; -pub const USER_POSIX2_FORT_RUN: ::c_int = 15; -pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; -pub const USER_POSIX2_SW_DEV: ::c_int = 17; -pub const USER_POSIX2_UPE: ::c_int = 18; -pub const USER_STREAM_MAX: ::c_int = 19; -pub const USER_TZNAME_MAX: ::c_int = 20; -pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; -pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; -pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; -pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; -pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; -pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; -pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; -pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; -pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; -pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; -pub const CTL_P1003_1B_FSYNC: ::c_int = 11; -pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; -pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; -pub const CTL_P1003_1B_TIMERS: ::c_int = 14; -pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; -pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; -pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; -pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; -pub const CTL_P1003_1B_MQ_OPEN_MAX: ::c_int = 19; -pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; -pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; -pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; -pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; -pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; -pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; -pub const TIOCGPTN: ::c_uint = 0x4004740f; -pub const TIOCPTMASTER: ::c_uint = 0x2000741c; -pub const TIOCSIG: ::c_uint = 0x2004745f; -pub const TIOCM_DCD: ::c_int = 0x40; -pub const H4DISC: ::c_int = 0x7; - -pub const JAIL_API_VERSION: u32 = 2; -pub const JAIL_CREATE: ::c_int = 0x01; -pub const JAIL_UPDATE: ::c_int = 0x02; -pub const JAIL_ATTACH: ::c_int = 0x04; -pub const JAIL_DYING: ::c_int = 0x08; -pub const JAIL_SET_MASK: ::c_int = 0x0f; -pub const JAIL_GET_MASK: ::c_int = 0x08; -pub const JAIL_SYS_DISABLE: ::c_int = 0; -pub const JAIL_SYS_NEW: ::c_int = 1; -pub const JAIL_SYS_INHERIT: ::c_int = 2; - -pub const SO_BINTIME: ::c_int = 0x2000; -pub const SO_NO_OFFLOAD: ::c_int = 0x4000; -pub const SO_NO_DDP: ::c_int = 0x8000; -pub const SO_LABEL: ::c_int = 0x1009; -pub const SO_PEERLABEL: ::c_int = 0x1010; -pub const SO_LISTENQLIMIT: ::c_int = 0x1011; -pub const SO_LISTENQLEN: ::c_int = 0x1012; -pub const SO_LISTENINCQLEN: ::c_int = 0x1013; -pub const SO_SETFIB: ::c_int = 0x1014; -pub const SO_USER_COOKIE: ::c_int = 0x1015; -pub const SO_PROTOCOL: ::c_int = 0x1016; -pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL; -pub const SO_VENDOR: ::c_int = 0x80000000; - -pub const AF_SLOW: ::c_int = 33; -pub const AF_SCLUSTER: ::c_int = 34; -pub const AF_ARP: ::c_int = 35; -pub const AF_BLUETOOTH: ::c_int = 36; -pub const AF_IEEE80211: ::c_int = 37; -pub const AF_INET_SDP: ::c_int = 40; -pub const AF_INET6_SDP: ::c_int = 42; -#[doc(hidden)] -pub const AF_MAX: ::c_int = 42; - -pub const IPPROTO_DIVERT: ::c_int = 258; - -pub const PF_SLOW: ::c_int = AF_SLOW; -pub const PF_SCLUSTER: ::c_int = AF_SCLUSTER; -pub const PF_ARP: ::c_int = AF_ARP; -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_IEEE80211: ::c_int = AF_IEEE80211; -pub const PF_INET_SDP: ::c_int = AF_INET_SDP; -pub const PF_INET6_SDP: ::c_int = AF_INET6_SDP; -#[doc(hidden)] -pub const PF_MAX: ::c_int = AF_MAX; - -pub const NET_RT_DUMP: ::c_int = 1; -pub const NET_RT_FLAGS: ::c_int = 2; -pub const NET_RT_IFLIST: ::c_int = 3; -pub const NET_RT_IFMALIST: ::c_int = 4; -pub const NET_RT_IFLISTL: ::c_int = 5; - -// System V IPC -pub const IPC_PRIVATE: ::key_t = 0; -pub const IPC_CREAT: ::c_int = 0o1000; -pub const IPC_EXCL: ::c_int = 0o2000; -pub const IPC_NOWAIT: ::c_int = 0o4000; -pub const IPC_RMID: ::c_int = 0; -pub const IPC_SET: ::c_int = 1; -pub const IPC_STAT: ::c_int = 2; -pub const IPC_INFO: ::c_int = 3; -pub const IPC_R : ::c_int = 0o400; -pub const IPC_W : ::c_int = 0o200; -pub const IPC_M : ::c_int = 0o10000; -pub const MSG_NOERROR: ::c_int = 0o10000; -pub const SHM_RDONLY: ::c_int = 0o10000; -pub const SHM_RND: ::c_int = 0o20000; -pub const SHM_R: ::c_int = 0o400; -pub const SHM_W: ::c_int = 0o200; -pub const SHM_LOCK: ::c_int = 11; -pub const SHM_UNLOCK: ::c_int = 12; -pub const SHM_STAT: ::c_int = 13; -pub const SHM_INFO: ::c_int = 14; - -// The *_MAXID constants never should've been used outside of the -// FreeBSD base system. And with the exception of CTL_P1003_1B_MAXID, -// they were all removed in svn r262489. They remain here for backwards -// compatibility only, and are scheduled to be removed in libc 1.0.0. -#[doc(hidden)] -pub const NET_MAXID: ::c_int = AF_MAX; -#[doc(hidden)] -pub const CTL_MAXID: ::c_int = 10; -#[doc(hidden)] -pub const KERN_MAXID: ::c_int = 38; -#[doc(hidden)] -pub const HW_MAXID: ::c_int = 13; -#[doc(hidden)] -pub const USER_MAXID: ::c_int = 21; -#[doc(hidden)] -pub const CTL_P1003_1B_MAXID: ::c_int = 26; - -pub const MSG_NOTIFICATION: ::c_int = 0x00002000; -pub const MSG_NBIO: ::c_int = 0x00004000; -pub const MSG_COMPAT: ::c_int = 0x00008000; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00040000; -pub const MSG_NOSIGNAL: ::c_int = 0x20000; - -pub const EMPTY: ::c_short = 0; -pub const BOOT_TIME: ::c_short = 1; -pub const OLD_TIME: ::c_short = 2; -pub const NEW_TIME: ::c_short = 3; -pub const USER_PROCESS: ::c_short = 4; -pub const INIT_PROCESS: ::c_short = 5; -pub const LOGIN_PROCESS: ::c_short = 6; -pub const DEAD_PROCESS: ::c_short = 7; -pub const SHUTDOWN_TIME: ::c_short = 8; - -pub const LC_COLLATE_MASK: ::c_int = (1 << 0); -pub const LC_CTYPE_MASK: ::c_int = (1 << 1); -pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); -pub const LC_MONETARY_MASK: ::c_int = (1 << 3); -pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); -pub const LC_TIME_MASK: ::c_int = (1 << 5); -pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK - | LC_CTYPE_MASK - | LC_MESSAGES_MASK - | LC_MONETARY_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK; - -pub const WSTOPPED: ::c_int = 2; // same as WUNTRACED -pub const WCONTINUED: ::c_int = 4; -pub const WNOWAIT: ::c_int = 8; -pub const WEXITED: ::c_int = 16; -pub const WTRAPPED: ::c_int = 32; - -// FreeBSD defines a great many more of these, we only expose the -// standardized ones. -pub const P_PID: idtype_t = 0; -pub const P_PGID: idtype_t = 2; -pub const P_ALL: idtype_t = 7; - -pub const B460800: ::speed_t = 460800; -pub const B921600: ::speed_t = 921600; - -extern { - pub fn __error() -> *mut ::c_int; - - pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - - pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - - pub fn jail(jail: *mut ::jail) -> ::c_int; - pub fn jail_attach(jid: ::c_int) -> ::c_int; - pub fn jail_remove(jid: ::c_int) -> ::c_int; - pub fn jail_get(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) - -> ::c_int; - pub fn jail_set(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) - -> ::c_int; - - pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, - len: ::off_t) -> ::c_int; - pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, - advise: ::c_int) -> ::c_int; - pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; - pub fn mkostemps(template: *mut ::c_char, - suffixlen: ::c_int, - flags: ::c_int) -> ::c_int; - - pub fn getutxuser(user: *const ::c_char) -> *mut utmpx; - pub fn setutxdb(_type: ::c_int, file: *const ::c_char) -> ::c_int; - - pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, - timeout: *mut ::timespec) -> ::ssize_t; - - pub fn freelocale(loc: ::locale_t) -> ::c_int; - pub fn waitid(idtype: idtype_t, id: ::id_t, infop: *mut ::siginfo_t, - options: ::c_int) -> ::c_int; - - pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; - pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; - pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, - shmflg: ::c_int) -> *mut ::c_void; - pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; - pub fn shmctl(shmid: ::c_int, cmd: ::c_int, - buf: *mut ::shmid_ds) -> ::c_int; - pub fn msgctl(msqid: ::c_int, cmd: ::c_int, - buf: *mut ::msqid_ds) -> ::c_int; - pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; - pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, - msgtyp: ::c_long, msgflg: ::c_int) -> ::c_int; - pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t, - msgflg: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_arch = "x86")] { - mod x86; - pub use self::x86::*; - } else if #[cfg(target_arch = "x86_64")] { - mod x86_64; - pub use self::x86_64::*; - } else if #[cfg(target_arch = "aarch64")] { - mod aarch64; - pub use self::aarch64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs deleted file mode 100644 index 8a5e5f9fb..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86.rs +++ /dev/null @@ -1,31 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; -pub type time_t = i32; -pub type suseconds_t = i32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: ::blksize_t, - pub st_flags: ::fflags_t, - pub st_gen: ::uint32_t, - pub st_lspare: ::int32_t, - pub st_birthtime: ::time_t, - pub st_birthtime_nsec: ::c_long, - __unused: [u8; 8], - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs deleted file mode 100644 index a2da8452c..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/freebsd/x86_64.rs +++ /dev/null @@ -1,30 +0,0 @@ -pub type c_long = i64; -pub type c_ulong = u64; -pub type time_t = i64; -pub type suseconds_t = i64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: ::blksize_t, - pub st_flags: ::fflags_t, - pub st_gen: ::uint32_t, - pub st_lspare: ::int32_t, - pub st_birthtime: ::time_t, - pub st_birthtime_nsec: ::c_long, - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs deleted file mode 100644 index 5cfa3b114..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/freebsdlike/mod.rs +++ /dev/null @@ -1,1041 +0,0 @@ -pub type dev_t = u32; -pub type mode_t = u16; -pub type pthread_attr_t = *mut ::c_void; -pub type rlim_t = i64; -pub type pthread_mutex_t = *mut ::c_void; -pub type pthread_mutexattr_t = *mut ::c_void; -pub type pthread_cond_t = *mut ::c_void; -pub type pthread_condattr_t = *mut ::c_void; -pub type pthread_rwlock_t = *mut ::c_void; -pub type pthread_key_t = ::c_int; -pub type tcflag_t = ::c_uint; -pub type speed_t = ::c_uint; -pub type nl_item = ::c_int; -pub type id_t = i64; - -pub enum timezone {} - -s! { - pub struct glob_t { - pub gl_pathc: ::size_t, - pub gl_matchc: ::size_t, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - pub gl_pathv: *mut *mut ::c_char, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - __unused8: *mut ::c_void, - } - - pub struct kevent { - pub ident: ::uintptr_t, - pub filter: ::c_short, - pub flags: ::c_ushort, - pub fflags: ::c_uint, - pub data: ::intptr_t, - pub udata: *mut ::c_void, - } - - pub struct sockaddr_storage { - pub ss_len: u8, - pub ss_family: ::sa_family_t, - __ss_pad1: [u8; 6], - __ss_align: i64, - __ss_pad2: [u8; 112], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_canonname: *mut ::c_char, - pub ai_addr: *mut ::sockaddr, - pub ai_next: *mut addrinfo, - } - - pub struct sigset_t { - bits: [u32; 4], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub si_pid: ::pid_t, - pub si_uid: ::uid_t, - pub si_status: ::c_int, - pub si_addr: *mut ::c_void, - _pad: [::c_int; 12], - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_flags: ::c_int, - pub sa_mask: sigset_t, - } - - pub struct stack_t { - // In FreeBSD 11 and later, ss_sp is actually a void* - pub ss_sp: *mut ::c_char, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct sched_param { - pub sched_priority: ::c_int, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct sockaddr_in { - pub sin_len: u8, - pub sin_family: ::sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [::c_char; 8], - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_cc: [::cc_t; ::NCCS], - pub c_ispeed: ::speed_t, - pub c_ospeed: ::speed_t, - } - - pub struct flock { - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - pub l_type: ::c_short, - pub l_whence: ::c_short, - #[cfg(not(target_os = "dragonfly"))] - pub l_sysid: ::c_int, - } - - pub struct sf_hdtr { - pub headers: *mut ::iovec, - pub hdr_cnt: ::c_int, - pub trailers: *mut ::iovec, - pub trl_cnt: ::c_int, - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } -} - -pub const AIO_LISTIO_MAX: ::c_int = 16; -pub const AIO_CANCELED: ::c_int = 1; -pub const AIO_NOTCANCELED: ::c_int = 2; -pub const AIO_ALLDONE: ::c_int = 3; -pub const LIO_NOP: ::c_int = 0; -pub const LIO_WRITE: ::c_int = 1; -pub const LIO_READ: ::c_int = 2; -pub const LIO_WAIT: ::c_int = 1; -pub const LIO_NOWAIT: ::c_int = 0; - -pub const SIGEV_NONE: ::c_int = 0; -pub const SIGEV_SIGNAL: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 2; -pub const SIGEV_KEVENT: ::c_int = 3; - -pub const CODESET: ::nl_item = 0; -pub const D_T_FMT: ::nl_item = 1; -pub const D_FMT: ::nl_item = 2; -pub const T_FMT: ::nl_item = 3; -pub const T_FMT_AMPM: ::nl_item = 4; -pub const AM_STR: ::nl_item = 5; -pub const PM_STR: ::nl_item = 6; - -pub const DAY_1: ::nl_item = 7; -pub const DAY_2: ::nl_item = 8; -pub const DAY_3: ::nl_item = 9; -pub const DAY_4: ::nl_item = 10; -pub const DAY_5: ::nl_item = 11; -pub const DAY_6: ::nl_item = 12; -pub const DAY_7: ::nl_item = 13; - -pub const ABDAY_1: ::nl_item = 14; -pub const ABDAY_2: ::nl_item = 15; -pub const ABDAY_3: ::nl_item = 16; -pub const ABDAY_4: ::nl_item = 17; -pub const ABDAY_5: ::nl_item = 18; -pub const ABDAY_6: ::nl_item = 19; -pub const ABDAY_7: ::nl_item = 20; - -pub const MON_1: ::nl_item = 21; -pub const MON_2: ::nl_item = 22; -pub const MON_3: ::nl_item = 23; -pub const MON_4: ::nl_item = 24; -pub const MON_5: ::nl_item = 25; -pub const MON_6: ::nl_item = 26; -pub const MON_7: ::nl_item = 27; -pub const MON_8: ::nl_item = 28; -pub const MON_9: ::nl_item = 29; -pub const MON_10: ::nl_item = 30; -pub const MON_11: ::nl_item = 31; -pub const MON_12: ::nl_item = 32; - -pub const ABMON_1: ::nl_item = 33; -pub const ABMON_2: ::nl_item = 34; -pub const ABMON_3: ::nl_item = 35; -pub const ABMON_4: ::nl_item = 36; -pub const ABMON_5: ::nl_item = 37; -pub const ABMON_6: ::nl_item = 38; -pub const ABMON_7: ::nl_item = 39; -pub const ABMON_8: ::nl_item = 40; -pub const ABMON_9: ::nl_item = 41; -pub const ABMON_10: ::nl_item = 42; -pub const ABMON_11: ::nl_item = 43; -pub const ABMON_12: ::nl_item = 44; - -pub const ERA: ::nl_item = 45; -pub const ERA_D_FMT: ::nl_item = 46; -pub const ERA_D_T_FMT: ::nl_item = 47; -pub const ERA_T_FMT: ::nl_item = 48; -pub const ALT_DIGITS: ::nl_item = 49; - -pub const RADIXCHAR: ::nl_item = 50; -pub const THOUSEP: ::nl_item = 51; - -pub const YESEXPR: ::nl_item = 52; -pub const NOEXPR: ::nl_item = 53; - -pub const YESSTR: ::nl_item = 54; -pub const NOSTR: ::nl_item = 55; - -pub const CRNCYSTR: ::nl_item = 56; - -pub const D_MD_ORDER: ::nl_item = 57; - -pub const ALTMON_1: ::nl_item = 58; -pub const ALTMON_2: ::nl_item = 59; -pub const ALTMON_3: ::nl_item = 60; -pub const ALTMON_4: ::nl_item = 61; -pub const ALTMON_5: ::nl_item = 62; -pub const ALTMON_6: ::nl_item = 63; -pub const ALTMON_7: ::nl_item = 64; -pub const ALTMON_8: ::nl_item = 65; -pub const ALTMON_9: ::nl_item = 66; -pub const ALTMON_10: ::nl_item = 67; -pub const ALTMON_11: ::nl_item = 68; -pub const ALTMON_12: ::nl_item = 69; - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 2; -pub const _IOLBF: ::c_int = 1; -pub const BUFSIZ: ::c_uint = 1024; -pub const FOPEN_MAX: ::c_uint = 20; -pub const FILENAME_MAX: ::c_uint = 1024; -pub const L_tmpnam: ::c_uint = 1024; -pub const TMP_MAX: ::c_uint = 308915776; - -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; -pub const O_ACCMODE: ::c_int = 3; -pub const O_APPEND: ::c_int = 8; -pub const O_CREAT: ::c_int = 512; -pub const O_EXCL: ::c_int = 2048; -pub const O_NOCTTY: ::c_int = 32768; -pub const O_TRUNC: ::c_int = 1024; -pub const S_IFIFO: mode_t = 4096; -pub const S_IFCHR: mode_t = 8192; -pub const S_IFBLK: mode_t = 24576; -pub const S_IFDIR: mode_t = 16384; -pub const S_IFREG: mode_t = 32768; -pub const S_IFLNK: mode_t = 40960; -pub const S_IFSOCK: mode_t = 49152; -pub const S_IFMT: mode_t = 61440; -pub const S_IEXEC: mode_t = 64; -pub const S_IWRITE: mode_t = 128; -pub const S_IREAD: mode_t = 256; -pub const S_IRWXU: mode_t = 448; -pub const S_IXUSR: mode_t = 64; -pub const S_IWUSR: mode_t = 128; -pub const S_IRUSR: mode_t = 256; -pub const S_IRWXG: mode_t = 56; -pub const S_IXGRP: mode_t = 8; -pub const S_IWGRP: mode_t = 16; -pub const S_IRGRP: mode_t = 32; -pub const S_IRWXO: mode_t = 7; -pub const S_IXOTH: mode_t = 1; -pub const S_IWOTH: mode_t = 2; -pub const S_IROTH: mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const F_LOCK: ::c_int = 1; -pub const F_TEST: ::c_int = 3; -pub const F_TLOCK: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; -pub const F_DUPFD_CLOEXEC: ::c_int = 17; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGEMT: ::c_int = 7; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const MAP_FILE: ::c_int = 0x0000; -pub const MAP_SHARED: ::c_int = 0x0001; -pub const MAP_PRIVATE: ::c_int = 0x0002; -pub const MAP_FIXED: ::c_int = 0x0010; -pub const MAP_ANON: ::c_int = 0x1000; - -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const MS_SYNC: ::c_int = 0x0000; -pub const MS_ASYNC: ::c_int = 0x0001; -pub const MS_INVALIDATE: ::c_int = 0x0002; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EDEADLK: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const ENOTBLK: ::c_int = 15; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -pub const ENODEV: ::c_int = 19; -pub const ENOTDIR: ::c_int = 20; -pub const EISDIR: ::c_int = 21; -pub const EINVAL: ::c_int = 22; -pub const ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const ETXTBSY: ::c_int = 26; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const EAGAIN: ::c_int = 35; -pub const EWOULDBLOCK: ::c_int = 35; -pub const EINPROGRESS: ::c_int = 36; -pub const EALREADY: ::c_int = 37; -pub const ENOTSOCK: ::c_int = 38; -pub const EDESTADDRREQ: ::c_int = 39; -pub const EMSGSIZE: ::c_int = 40; -pub const EPROTOTYPE: ::c_int = 41; -pub const ENOPROTOOPT: ::c_int = 42; -pub const EPROTONOSUPPORT: ::c_int = 43; -pub const ESOCKTNOSUPPORT: ::c_int = 44; -pub const EOPNOTSUPP: ::c_int = 45; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 46; -pub const EAFNOSUPPORT: ::c_int = 47; -pub const EADDRINUSE: ::c_int = 48; -pub const EADDRNOTAVAIL: ::c_int = 49; -pub const ENETDOWN: ::c_int = 50; -pub const ENETUNREACH: ::c_int = 51; -pub const ENETRESET: ::c_int = 52; -pub const ECONNABORTED: ::c_int = 53; -pub const ECONNRESET: ::c_int = 54; -pub const ENOBUFS: ::c_int = 55; -pub const EISCONN: ::c_int = 56; -pub const ENOTCONN: ::c_int = 57; -pub const ESHUTDOWN: ::c_int = 58; -pub const ETOOMANYREFS: ::c_int = 59; -pub const ETIMEDOUT: ::c_int = 60; -pub const ECONNREFUSED: ::c_int = 61; -pub const ELOOP: ::c_int = 62; -pub const ENAMETOOLONG: ::c_int = 63; -pub const EHOSTDOWN: ::c_int = 64; -pub const EHOSTUNREACH: ::c_int = 65; -pub const ENOTEMPTY: ::c_int = 66; -pub const EPROCLIM: ::c_int = 67; -pub const EUSERS: ::c_int = 68; -pub const EDQUOT: ::c_int = 69; -pub const ESTALE: ::c_int = 70; -pub const EREMOTE: ::c_int = 71; -pub const EBADRPC: ::c_int = 72; -pub const ERPCMISMATCH: ::c_int = 73; -pub const EPROGUNAVAIL: ::c_int = 74; -pub const EPROGMISMATCH: ::c_int = 75; -pub const EPROCUNAVAIL: ::c_int = 76; -pub const ENOLCK: ::c_int = 77; -pub const ENOSYS: ::c_int = 78; -pub const EFTYPE: ::c_int = 79; -pub const EAUTH: ::c_int = 80; -pub const ENEEDAUTH: ::c_int = 81; -pub const EIDRM: ::c_int = 82; -pub const ENOMSG: ::c_int = 83; -pub const EOVERFLOW: ::c_int = 84; -pub const ECANCELED: ::c_int = 85; -pub const EILSEQ: ::c_int = 86; -pub const ENOATTR: ::c_int = 87; -pub const EDOOFUS: ::c_int = 88; -pub const EBADMSG: ::c_int = 89; -pub const EMULTIHOP: ::c_int = 90; -pub const ENOLINK: ::c_int = 91; -pub const EPROTO: ::c_int = 92; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const F_DUPFD: ::c_int = 0; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; - -pub const AT_EACCESS: ::c_int = 0x100; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; -pub const AT_REMOVEDIR: ::c_int = 0x800; - -pub const SIGTRAP: ::c_int = 5; - -pub const GLOB_APPEND : ::c_int = 0x0001; -pub const GLOB_DOOFFS : ::c_int = 0x0002; -pub const GLOB_ERR : ::c_int = 0x0004; -pub const GLOB_MARK : ::c_int = 0x0008; -pub const GLOB_NOCHECK : ::c_int = 0x0010; -pub const GLOB_NOSORT : ::c_int = 0x0020; -pub const GLOB_NOESCAPE: ::c_int = 0x2000; - -pub const GLOB_NOSPACE : ::c_int = -1; -pub const GLOB_ABORTED : ::c_int = -2; -pub const GLOB_NOMATCH : ::c_int = -3; - -pub const POSIX_MADV_NORMAL: ::c_int = 0; -pub const POSIX_MADV_RANDOM: ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_MADV_WILLNEED: ::c_int = 3; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; - -pub const _SC_IOV_MAX: ::c_int = 56; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; -pub const _SC_MQ_PRIO_MAX: ::c_int = 75; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; -pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; -pub const _SC_THREAD_STACK_MIN: ::c_int = 93; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; -pub const _SC_THREADS: ::c_int = 96; -pub const _SC_TTY_NAME_MAX: ::c_int = 101; -pub const _SC_ATEXIT_MAX: ::c_int = 107; -pub const _SC_XOPEN_CRYPT: ::c_int = 108; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; -pub const _SC_XOPEN_LEGACY: ::c_int = 110; -pub const _SC_XOPEN_REALTIME: ::c_int = 111; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; -pub const _SC_XOPEN_SHM: ::c_int = 113; -pub const _SC_XOPEN_UNIX: ::c_int = 115; -pub const _SC_XOPEN_VERSION: ::c_int = 116; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 117; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_MEMLOCK: ::c_int = 6; -pub const RLIMIT_NPROC: ::c_int = 7; -pub const RLIMIT_NOFILE: ::c_int = 8; -pub const RLIMIT_SBSIZE: ::c_int = 9; -pub const RLIMIT_VMEM: ::c_int = 10; -pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; -pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; - -pub const RUSAGE_SELF: ::c_int = 0; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; -pub const MADV_FREE: ::c_int = 5; -pub const MADV_NOSYNC: ::c_int = 6; -pub const MADV_AUTOSYNC: ::c_int = 7; -pub const MADV_NOCORE: ::c_int = 8; -pub const MADV_CORE: ::c_int = 9; - -pub const MINCORE_INCORE: ::c_int = 0x1; -pub const MINCORE_REFERENCED: ::c_int = 0x2; -pub const MINCORE_MODIFIED: ::c_int = 0x4; -pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; -pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; -pub const MINCORE_SUPER: ::c_int = 0x20; - -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_UNIX: ::c_int = AF_LOCAL; -pub const AF_INET: ::c_int = 2; -pub const AF_IMPLINK: ::c_int = 3; -pub const AF_PUP: ::c_int = 4; -pub const AF_CHAOS: ::c_int = 5; -pub const AF_NETBIOS: ::c_int = 6; -pub const AF_ISO: ::c_int = 7; -pub const AF_OSI: ::c_int = AF_ISO; -pub const AF_ECMA: ::c_int = 8; -pub const AF_DATAKIT: ::c_int = 9; -pub const AF_CCITT: ::c_int = 10; -pub const AF_SNA: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_DLI: ::c_int = 13; -pub const AF_LAT: ::c_int = 14; -pub const AF_HYLINK: ::c_int = 15; -pub const AF_APPLETALK: ::c_int = 16; -pub const AF_ROUTE: ::c_int = 17; -pub const AF_LINK: ::c_int = 18; -pub const pseudo_AF_XTP: ::c_int = 19; -pub const AF_COIP: ::c_int = 20; -pub const AF_CNT: ::c_int = 21; -pub const pseudo_AF_RTIP: ::c_int = 22; -pub const AF_IPX: ::c_int = 23; -pub const AF_SIP: ::c_int = 24; -pub const pseudo_AF_PIP: ::c_int = 25; -pub const AF_ISDN: ::c_int = 26; -pub const AF_E164: ::c_int = AF_ISDN; -pub const pseudo_AF_KEY: ::c_int = 27; -pub const AF_INET6: ::c_int = 28; -pub const AF_NATM: ::c_int = 29; -pub const AF_ATM: ::c_int = 30; -pub const pseudo_AF_HDRCMPLT: ::c_int = 31; -pub const AF_NETGRAPH: ::c_int = 32; - -pub const PF_UNSPEC: ::c_int = AF_UNSPEC; -pub const PF_LOCAL: ::c_int = AF_LOCAL; -pub const PF_UNIX: ::c_int = PF_LOCAL; -pub const PF_INET: ::c_int = AF_INET; -pub const PF_IMPLINK: ::c_int = AF_IMPLINK; -pub const PF_PUP: ::c_int = AF_PUP; -pub const PF_CHAOS: ::c_int = AF_CHAOS; -pub const PF_NETBIOS: ::c_int = AF_NETBIOS; -pub const PF_ISO: ::c_int = AF_ISO; -pub const PF_OSI: ::c_int = AF_ISO; -pub const PF_ECMA: ::c_int = AF_ECMA; -pub const PF_DATAKIT: ::c_int = AF_DATAKIT; -pub const PF_CCITT: ::c_int = AF_CCITT; -pub const PF_SNA: ::c_int = AF_SNA; -pub const PF_DECnet: ::c_int = AF_DECnet; -pub const PF_DLI: ::c_int = AF_DLI; -pub const PF_LAT: ::c_int = AF_LAT; -pub const PF_HYLINK: ::c_int = AF_HYLINK; -pub const PF_APPLETALK: ::c_int = AF_APPLETALK; -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_LINK: ::c_int = AF_LINK; -pub const PF_XTP: ::c_int = pseudo_AF_XTP; -pub const PF_COIP: ::c_int = AF_COIP; -pub const PF_CNT: ::c_int = AF_CNT; -pub const PF_SIP: ::c_int = AF_SIP; -pub const PF_IPX: ::c_int = AF_IPX; -pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; -pub const PF_PIP: ::c_int = pseudo_AF_PIP; -pub const PF_ISDN: ::c_int = AF_ISDN; -pub const PF_KEY: ::c_int = pseudo_AF_KEY; -pub const PF_INET6: ::c_int = AF_INET6; -pub const PF_NATM: ::c_int = AF_NATM; -pub const PF_ATM: ::c_int = AF_ATM; -pub const PF_NETGRAPH: ::c_int = AF_NETGRAPH; - -pub const SOMAXCONN: ::c_int = 128; - -pub const MSG_OOB: ::c_int = 0x00000001; -pub const MSG_PEEK: ::c_int = 0x00000002; -pub const MSG_DONTROUTE: ::c_int = 0x00000004; -pub const MSG_EOR: ::c_int = 0x00000008; -pub const MSG_TRUNC: ::c_int = 0x00000010; -pub const MSG_CTRUNC: ::c_int = 0x00000020; -pub const MSG_WAITALL: ::c_int = 0x00000040; -pub const MSG_DONTWAIT: ::c_int = 0x00000080; -pub const MSG_EOF: ::c_int = 0x00000100; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_RDM: ::c_int = 4; -pub const SOCK_SEQPACKET: ::c_int = 5; -pub const SOCK_CLOEXEC: ::c_int = 0x10000000; -pub const SOCK_NONBLOCK: ::c_int = 0x20000000; -pub const SOCK_MAXADDRLEN: ::c_int = 255; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 10; -pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_TTL: ::c_int = 4; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_ADD_MEMBERSHIP: ::c_int = 12; -pub const IP_DROP_MEMBERSHIP: ::c_int = 13; -pub const IPV6_JOIN_GROUP: ::c_int = 12; -pub const IPV6_LEAVE_GROUP: ::c_int = 13; - -pub const TCP_NODELAY: ::c_int = 1; -pub const TCP_KEEPIDLE: ::c_int = 256; -pub const SOL_SOCKET: ::c_int = 0xffff; -pub const SO_DEBUG: ::c_int = 0x01; -pub const SO_ACCEPTCONN: ::c_int = 0x0002; -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_USELOOPBACK: ::c_int = 0x0040; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_REUSEPORT: ::c_int = 0x0200; -pub const SO_TIMESTAMP: ::c_int = 0x0400; -pub const SO_NOSIGPIPE: ::c_int = 0x0800; -pub const SO_ACCEPTFILTER: ::c_int = 0x1000; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_TYPE: ::c_int = 0x1008; - -pub const IFF_LOOPBACK: ::c_int = 0x8; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const O_SYNC: ::c_int = 128; -pub const O_NONBLOCK: ::c_int = 4; - -pub const MAP_COPY: ::c_int = 0x0002; -pub const MAP_RENAME: ::c_int = 0x0020; -pub const MAP_NORESERVE: ::c_int = 0x0040; -pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; -pub const MAP_STACK: ::c_int = 0x0400; -pub const MAP_NOSYNC: ::c_int = 0x0800; -pub const MAP_NOCORE: ::c_int = 0x020000; - -pub const IPPROTO_RAW: ::c_int = 255; - -pub const _SC_ARG_MAX: ::c_int = 1; -pub const _SC_CHILD_MAX: ::c_int = 2; -pub const _SC_CLK_TCK: ::c_int = 3; -pub const _SC_NGROUPS_MAX: ::c_int = 4; -pub const _SC_OPEN_MAX: ::c_int = 5; -pub const _SC_JOB_CONTROL: ::c_int = 6; -pub const _SC_SAVED_IDS: ::c_int = 7; -pub const _SC_VERSION: ::c_int = 8; -pub const _SC_BC_BASE_MAX: ::c_int = 9; -pub const _SC_BC_DIM_MAX: ::c_int = 10; -pub const _SC_BC_SCALE_MAX: ::c_int = 11; -pub const _SC_BC_STRING_MAX: ::c_int = 12; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; -pub const _SC_EXPR_NEST_MAX: ::c_int = 14; -pub const _SC_LINE_MAX: ::c_int = 15; -pub const _SC_RE_DUP_MAX: ::c_int = 16; -pub const _SC_2_VERSION: ::c_int = 17; -pub const _SC_2_C_BIND: ::c_int = 18; -pub const _SC_2_C_DEV: ::c_int = 19; -pub const _SC_2_CHAR_TERM: ::c_int = 20; -pub const _SC_2_FORT_DEV: ::c_int = 21; -pub const _SC_2_FORT_RUN: ::c_int = 22; -pub const _SC_2_LOCALEDEF: ::c_int = 23; -pub const _SC_2_SW_DEV: ::c_int = 24; -pub const _SC_2_UPE: ::c_int = 25; -pub const _SC_STREAM_MAX: ::c_int = 26; -pub const _SC_TZNAME_MAX: ::c_int = 27; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; -pub const _SC_MAPPED_FILES: ::c_int = 29; -pub const _SC_MEMLOCK: ::c_int = 30; -pub const _SC_MEMLOCK_RANGE: ::c_int = 31; -pub const _SC_MEMORY_PROTECTION: ::c_int = 32; -pub const _SC_MESSAGE_PASSING: ::c_int = 33; -pub const _SC_PRIORITIZED_IO: ::c_int = 34; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; -pub const _SC_REALTIME_SIGNALS: ::c_int = 36; -pub const _SC_SEMAPHORES: ::c_int = 37; -pub const _SC_FSYNC: ::c_int = 38; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; -pub const _SC_TIMERS: ::c_int = 41; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; -pub const _SC_AIO_MAX: ::c_int = 43; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; -pub const _SC_DELAYTIMER_MAX: ::c_int = 45; -pub const _SC_MQ_OPEN_MAX: ::c_int = 46; -pub const _SC_PAGESIZE: ::c_int = 47; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_RTSIG_MAX: ::c_int = 48; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; -pub const _SC_SEM_VALUE_MAX: ::c_int = 50; -pub const _SC_SIGQUEUE_MAX: ::c_int = 51; -pub const _SC_TIMER_MAX: ::c_int = 52; -pub const _SC_HOST_NAME_MAX: ::c_int = 72; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_ERRORCHECK; - -pub const SCHED_FIFO: ::c_int = 1; -pub const SCHED_OTHER: ::c_int = 2; -pub const SCHED_RR: ::c_int = 3; - -pub const FD_SETSIZE: usize = 1024; - -pub const ST_NOSUID: ::c_ulong = 2; - -pub const NI_MAXHOST: ::size_t = 1025; - -pub const RTLD_LOCAL: ::c_int = 0; -pub const RTLD_NODELETE: ::c_int = 0x1000; -pub const RTLD_NOLOAD: ::c_int = 0x2000; -pub const RTLD_GLOBAL: ::c_int = 0x100; - -pub const LOG_NTP: ::c_int = 12 << 3; -pub const LOG_SECURITY: ::c_int = 13 << 3; -pub const LOG_CONSOLE: ::c_int = 14 << 3; -pub const LOG_NFACILITIES: ::c_int = 24; - -pub const TIOCEXCL: ::c_uint = 0x2000740d; -pub const TIOCNXCL: ::c_uint = 0x2000740e; -pub const TIOCFLUSH: ::c_ulong = 0x80047410; -pub const TIOCGETA: ::c_uint = 0x402c7413; -pub const TIOCSETA: ::c_ulong = 0x802c7414; -pub const TIOCSETAW: ::c_ulong = 0x802c7415; -pub const TIOCSETAF: ::c_ulong = 0x802c7416; -pub const TIOCGETD: ::c_uint = 0x4004741a; -pub const TIOCSETD: ::c_ulong = 0x8004741b; -pub const TIOCGDRAINWAIT: ::c_uint = 0x40047456; -pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; -pub const TIOCTIMESTAMP: ::c_uint = 0x40107459; -pub const TIOCMGDTRWAIT: ::c_uint = 0x4004745a; -pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; -pub const TIOCDRAIN: ::c_uint = 0x2000745e; -pub const TIOCEXT: ::c_ulong = 0x80047460; -pub const TIOCSCTTY: ::c_uint = 0x20007461; -pub const TIOCCONS: ::c_ulong = 0x80047462; -pub const TIOCGSID: ::c_uint = 0x40047463; -pub const TIOCSTAT: ::c_uint = 0x20007465; -pub const TIOCUCNTL: ::c_ulong = 0x80047466; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const TIOCGWINSZ: ::c_uint = 0x40087468; -pub const TIOCMGET: ::c_uint = 0x4004746a; -pub const TIOCM_LE: ::c_int = 0x1; -pub const TIOCM_DTR: ::c_int = 0x2; -pub const TIOCM_RTS: ::c_int = 0x4; -pub const TIOCM_ST: ::c_int = 0x8; -pub const TIOCM_SR: ::c_int = 0x10; -pub const TIOCM_CTS: ::c_int = 0x20; -pub const TIOCM_RI: ::c_int = 0x80; -pub const TIOCM_DSR: ::c_int = 0x100; -pub const TIOCM_CD: ::c_int = 0x40; -pub const TIOCM_CAR: ::c_int = 0x40; -pub const TIOCM_RNG: ::c_int = 0x80; -pub const TIOCMBIC: ::c_ulong = 0x8004746b; -pub const TIOCMBIS: ::c_ulong = 0x8004746c; -pub const TIOCMSET: ::c_ulong = 0x8004746d; -pub const TIOCSTART: ::c_uint = 0x2000746e; -pub const TIOCSTOP: ::c_uint = 0x2000746f; -pub const TIOCPKT: ::c_ulong = 0x80047470; -pub const TIOCPKT_DATA: ::c_int = 0x0; -pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; -pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; -pub const TIOCPKT_STOP: ::c_int = 0x4; -pub const TIOCPKT_START: ::c_int = 0x8; -pub const TIOCPKT_NOSTOP: ::c_int = 0x10; -pub const TIOCPKT_DOSTOP: ::c_int = 0x20; -pub const TIOCPKT_IOCTL: ::c_int = 0x40; -pub const TIOCNOTTY: ::c_uint = 0x20007471; -pub const TIOCSTI: ::c_ulong = 0x80017472; -pub const TIOCOUTQ: ::c_uint = 0x40047473; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCGPGRP: ::c_uint = 0x40047477; -pub const TIOCCDTR: ::c_uint = 0x20007478; -pub const TIOCSDTR: ::c_uint = 0x20007479; -pub const TIOCCBRK: ::c_uint = 0x2000747a; -pub const TIOCSBRK: ::c_uint = 0x2000747b; -pub const TTYDISC: ::c_int = 0x0; -pub const SLIPDISC: ::c_int = 0x4; -pub const PPPDISC: ::c_int = 0x5; -pub const NETGRAPHDISC: ::c_int = 0x6; - -pub const B0: speed_t = 0; -pub const B50: speed_t = 50; -pub const B75: speed_t = 75; -pub const B110: speed_t = 110; -pub const B134: speed_t = 134; -pub const B150: speed_t = 150; -pub const B200: speed_t = 200; -pub const B300: speed_t = 300; -pub const B600: speed_t = 600; -pub const B1200: speed_t = 1200; -pub const B1800: speed_t = 1800; -pub const B2400: speed_t = 2400; -pub const B4800: speed_t = 4800; -pub const B9600: speed_t = 9600; -pub const B19200: speed_t = 19200; -pub const B38400: speed_t = 38400; -pub const B7200: speed_t = 7200; -pub const B14400: speed_t = 14400; -pub const B28800: speed_t = 28800; -pub const B57600: speed_t = 57600; -pub const B76800: speed_t = 76800; -pub const B115200: speed_t = 115200; -pub const B230400: speed_t = 230400; -pub const EXTA: speed_t = 19200; -pub const EXTB: speed_t = 38400; - -pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; - -pub const CRTSCTS: ::tcflag_t = 0x00030000; - -f! { - pub fn WIFCONTINUED(status: ::c_int) -> bool { - status == 0x13 - } - - pub fn WSTOPSIG(status: ::c_int) -> ::c_int { - status >> 8 - } - - pub fn WIFSIGNALED(status: ::c_int) -> bool { - (status & 0o177) != 0o177 && (status & 0o177) != 0 - } - - pub fn WIFSTOPPED(status: ::c_int) -> bool { - (status & 0o177) == 0o177 - } -} - -extern { - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - pub fn endutxent(); - pub fn getutxent() -> *mut utmpx; - pub fn getutxid(ut: *const utmpx) -> *mut utmpx; - pub fn getutxline(ut: *const utmpx) -> *mut utmpx; - pub fn pututxline(ut: *const utmpx) -> *mut utmpx; - pub fn setutxent(); -} - -#[link(name = "util")] -extern { - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, - nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::size_t, - serv: *mut ::c_char, - servlen: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn kevent(kq: ::c_int, - changelist: *const ::kevent, - nchanges: ::c_int, - eventlist: *mut ::kevent, - nevents: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn mincore(addr: *const ::c_void, len: ::size_t, - vec: *mut ::c_char) -> ::c_int; - pub fn sysctlnametomib(name: *const ::c_char, - mibp: *mut ::c_int, - sizep: *mut ::size_t) - -> ::c_int; - pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) - -> ::c_int; - pub fn sysctl(name: *const ::c_int, - namelen: ::c_uint, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *const ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn sysctlbyname(name: *const ::c_char, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *const ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn sched_setscheduler(pid: ::pid_t, - policy: ::c_int, - param: *const sched_param) -> ::c_int; - pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; - pub fn memrchr(cx: *const ::c_void, - c: ::c_int, - n: ::size_t) -> *mut ::c_void; - pub fn sendfile(fd: ::c_int, - s: ::c_int, - offset: ::off_t, - nbytes: ::size_t, - hdtr: *mut ::sf_hdtr, - sbytes: *mut ::off_t, - flags: ::c_int) -> ::c_int; - pub fn sigtimedwait(set: *const sigset_t, - info: *mut siginfo_t, - timeout: *const ::timespec) -> ::c_int; - pub fn sigwaitinfo(set: *const sigset_t, - info: *mut siginfo_t) -> ::c_int; - pub fn openpty(amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::c_int; - pub fn forkpty(amaster: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::pid_t; - pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; - pub fn accept4(s: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int; - pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); - pub fn pthread_attr_get_np(tid: ::pthread_t, - attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, - guardsize: *mut ::size_t) -> ::c_int; - pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, - stackaddr: *mut *mut ::c_void, - stacksize: *mut ::size_t) -> ::c_int; - pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; - - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; - - pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, dev: dev_t) -> ::c_int; - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, - clock_id: *mut clockid_t) -> ::c_int; - pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, - clock_id: clockid_t) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; - pub fn sem_timedwait(sem: *mut sem_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; - pub fn ppoll(fds: *mut ::pollfd, - nfds: ::nfds_t, - timeout: *const ::timespec, - sigmask: *const sigset_t) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_os = "freebsd")] { - mod freebsd; - pub use self::freebsd::*; - } else if #[cfg(target_os = "dragonfly")] { - mod dragonfly; - pub use self::dragonfly::*; - } else { - // ... - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs deleted file mode 100644 index 69c71389a..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/mod.rs +++ /dev/null @@ -1,449 +0,0 @@ -use dox::{mem, Option}; - -pub type c_char = i8; -pub type wchar_t = i32; -pub type off_t = i64; -pub type useconds_t = u32; -pub type blkcnt_t = i64; -pub type socklen_t = u32; -pub type sa_family_t = u8; -pub type pthread_t = ::uintptr_t; -pub type nfds_t = ::c_uint; - -s! { - pub struct sockaddr { - pub sa_len: u8, - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14], - } - - pub struct sockaddr_in6 { - pub sin6_len: u8, - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct sockaddr_un { - pub sun_len: u8, - pub sun_family: sa_family_t, - pub sun_path: [c_char; 104] - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_change: ::time_t, - pub pw_class: *mut ::c_char, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - pub pw_expire: ::time_t, - - #[cfg(not(any(target_os = "macos", - target_os = "ios", - target_os = "netbsd", - target_os = "openbsd")))] - pub pw_fields: ::c_int, - } - - pub struct ifaddrs { - pub ifa_next: *mut ifaddrs, - pub ifa_name: *mut ::c_char, - pub ifa_flags: ::c_uint, - pub ifa_addr: *mut ::sockaddr, - pub ifa_netmask: *mut ::sockaddr, - pub ifa_dstaddr: *mut ::sockaddr, - pub ifa_data: *mut ::c_void - } - - pub struct fd_set { - #[cfg(all(target_pointer_width = "64", - any(target_os = "freebsd", target_os = "dragonfly")))] - fds_bits: [i64; FD_SETSIZE / 64], - #[cfg(not(all(target_pointer_width = "64", - any(target_os = "freebsd", target_os = "dragonfly"))))] - fds_bits: [i32; FD_SETSIZE / 32], - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *mut ::c_char, - } - - pub struct utsname { - #[cfg(not(target_os = "dragonfly"))] - pub sysname: [::c_char; 256], - #[cfg(target_os = "dragonfly")] - pub sysname: [::c_char; 32], - #[cfg(not(target_os = "dragonfly"))] - pub nodename: [::c_char; 256], - #[cfg(target_os = "dragonfly")] - pub nodename: [::c_char; 32], - #[cfg(not(target_os = "dragonfly"))] - pub release: [::c_char; 256], - #[cfg(target_os = "dragonfly")] - pub release: [::c_char; 32], - #[cfg(not(target_os = "dragonfly"))] - pub version: [::c_char; 256], - #[cfg(target_os = "dragonfly")] - pub version: [::c_char; 32], - #[cfg(not(target_os = "dragonfly"))] - pub machine: [::c_char; 256], - #[cfg(target_os = "dragonfly")] - pub machine: [::c_char; 32], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::socklen_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct fsid_t { - __fsid_val: [::int32_t; 2], - } - - pub struct if_nameindex { - pub if_index: ::c_uint, - pub if_name: *mut ::c_char, - } -} - -pub const LC_ALL: ::c_int = 0; -pub const LC_COLLATE: ::c_int = 1; -pub const LC_CTYPE: ::c_int = 2; -pub const LC_MONETARY: ::c_int = 3; -pub const LC_NUMERIC: ::c_int = 4; -pub const LC_TIME: ::c_int = 5; -pub const LC_MESSAGES: ::c_int = 6; - -pub const FIOCLEX: ::c_ulong = 0x20006601; -pub const FIONBIO: ::c_ulong = 0x8004667e; - -pub const PATH_MAX: ::c_int = 1024; - -pub const SA_ONSTACK: ::c_int = 0x0001; -pub const SA_SIGINFO: ::c_int = 0x0040; -pub const SA_RESTART: ::c_int = 0x0002; -pub const SA_RESETHAND: ::c_int = 0x0004; -pub const SA_NOCLDSTOP: ::c_int = 0x0008; -pub const SA_NODEFER: ::c_int = 0x0010; -pub const SA_NOCLDWAIT: ::c_int = 0x0020; - -pub const SS_ONSTACK: ::c_int = 1; -pub const SS_DISABLE: ::c_int = 4; - -pub const SIGCHLD: ::c_int = 20; -pub const SIGBUS: ::c_int = 10; -pub const SIGUSR1: ::c_int = 30; -pub const SIGUSR2: ::c_int = 31; -pub const SIGCONT: ::c_int = 19; -pub const SIGSTOP: ::c_int = 17; -pub const SIGTSTP: ::c_int = 18; -pub const SIGURG: ::c_int = 16; -pub const SIGIO: ::c_int = 23; -pub const SIGSYS: ::c_int = 12; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGINFO: ::c_int = 29; - -pub const SIG_SETMASK: ::c_int = 3; -pub const SIG_BLOCK: ::c_int = 0x1; -pub const SIG_UNBLOCK: ::c_int = 0x2; - -pub const IPV6_MULTICAST_LOOP: ::c_int = 11; -pub const IPV6_V6ONLY: ::c_int = 27; - -pub const ST_RDONLY: ::c_ulong = 1; - -pub const NCCS: usize = 20; - -pub const O_ASYNC: ::c_int = 0x40; -pub const O_FSYNC: ::c_int = 0x80; -pub const O_NDELAY: ::c_int = 0x4; -pub const O_NOFOLLOW: ::c_int = 0x100; - -pub const F_GETOWN: ::c_int = 5; -pub const F_SETOWN: ::c_int = 6; - -pub const MNT_FORCE: ::c_int = 0x80000; - -pub const Q_SYNC: ::c_int = 0x600; -pub const Q_QUOTAON: ::c_int = 0x100; -pub const Q_QUOTAOFF: ::c_int = 0x200; - -pub const TCIOFF: ::c_int = 3; -pub const TCION: ::c_int = 4; -pub const TCOOFF: ::c_int = 1; -pub const TCOON: ::c_int = 2; -pub const TCIFLUSH: ::c_int = 1; -pub const TCOFLUSH: ::c_int = 2; -pub const TCIOFLUSH: ::c_int = 3; -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; -pub const VEOF: usize = 0; -pub const VEOL: usize = 1; -pub const VEOL2: usize = 2; -pub const VERASE: usize = 3; -pub const VWERASE: usize = 4; -pub const VKILL: usize = 5; -pub const VREPRINT: usize = 6; -pub const VINTR: usize = 8; -pub const VQUIT: usize = 9; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 12; -pub const VSTOP: usize = 13; -pub const VLNEXT: usize = 14; -pub const VDISCARD: usize = 15; -pub const VMIN: usize = 16; -pub const VTIME: usize = 17; -pub const IGNBRK: ::tcflag_t = 0x00000001; -pub const BRKINT: ::tcflag_t = 0x00000002; -pub const IGNPAR: ::tcflag_t = 0x00000004; -pub const PARMRK: ::tcflag_t = 0x00000008; -pub const INPCK: ::tcflag_t = 0x00000010; -pub const ISTRIP: ::tcflag_t = 0x00000020; -pub const INLCR: ::tcflag_t = 0x00000040; -pub const IGNCR: ::tcflag_t = 0x00000080; -pub const ICRNL: ::tcflag_t = 0x00000100; -pub const IXON: ::tcflag_t = 0x00000200; -pub const IXOFF: ::tcflag_t = 0x00000400; -pub const IXANY: ::tcflag_t = 0x00000800; -pub const IMAXBEL: ::tcflag_t = 0x00002000; -pub const OPOST: ::tcflag_t = 0x1; -pub const ONLCR: ::tcflag_t = 0x2; -pub const OXTABS: ::tcflag_t = 0x4; -pub const ONOEOT: ::tcflag_t = 0x8; -pub const CSIZE: ::tcflag_t = 0x00000300; -pub const CS5: ::tcflag_t = 0x00000000; -pub const CS6: ::tcflag_t = 0x00000100; -pub const CS7: ::tcflag_t = 0x00000200; -pub const CS8: ::tcflag_t = 0x00000300; -pub const CSTOPB: ::tcflag_t = 0x00000400; -pub const CREAD: ::tcflag_t = 0x00000800; -pub const PARENB: ::tcflag_t = 0x00001000; -pub const PARODD: ::tcflag_t = 0x00002000; -pub const HUPCL: ::tcflag_t = 0x00004000; -pub const CLOCAL: ::tcflag_t = 0x00008000; -pub const ECHOKE: ::tcflag_t = 0x00000001; -pub const ECHOE: ::tcflag_t = 0x00000002; -pub const ECHOK: ::tcflag_t = 0x00000004; -pub const ECHO: ::tcflag_t = 0x00000008; -pub const ECHONL: ::tcflag_t = 0x00000010; -pub const ECHOPRT: ::tcflag_t = 0x00000020; -pub const ECHOCTL: ::tcflag_t = 0x00000040; -pub const ISIG: ::tcflag_t = 0x00000080; -pub const ICANON: ::tcflag_t = 0x00000100; -pub const IEXTEN: ::tcflag_t = 0x00000400; -pub const EXTPROC: ::tcflag_t = 0x00000800; -pub const TOSTOP: ::tcflag_t = 0x00400000; -pub const FLUSHO: ::tcflag_t = 0x00800000; -pub const PENDIN: ::tcflag_t = 0x20000000; -pub const NOFLSH: ::tcflag_t = 0x80000000; - -pub const WNOHANG: ::c_int = 0x00000001; -pub const WUNTRACED: ::c_int = 0x00000002; - -pub const RTLD_NOW: ::c_int = 0x2; -pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; - -pub const LOG_CRON: ::c_int = 9 << 3; -pub const LOG_AUTHPRIV: ::c_int = 10 << 3; -pub const LOG_FTP: ::c_int = 11 << 3; -pub const LOG_PERROR: ::c_int = 0x20; - -pub const PIPE_BUF: usize = 512; - -f! { - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - (*set).fds_bits[fd / bits] |= 1 << (fd % bits); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } - - pub fn WTERMSIG(status: ::c_int) -> ::c_int { - status & 0o177 - } - - pub fn WIFEXITED(status: ::c_int) -> bool { - (status & 0o177) == 0 - } - - pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { - status >> 8 - } - - pub fn WCOREDUMP(status: ::c_int) -> bool { - (status & 0o200) != 0 - } -} - -extern { - pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; - pub fn freeifaddrs(ifa: *mut ::ifaddrs); - pub fn setgroups(ngroups: ::c_int, - ptr: *const ::gid_t) -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn kqueue() -> ::c_int; - pub fn unmount(target: *const ::c_char, arg: ::c_int) -> ::c_int; - pub fn syscall(num: ::c_int, ...) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam_r50")] - pub fn getpwnam_r(name: *const ::c_char, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid_r50")] - pub fn getpwuid_r(uid: ::uid_t, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__getpwent50")] - pub fn getpwent() -> *mut passwd; - pub fn setpwent(); - pub fn getprogname() -> *const ::c_char; - pub fn setprogname(name: *const ::c_char); - pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; - pub fn if_nameindex() -> *mut if_nameindex; - pub fn if_freenameindex(ptr: *mut if_nameindex); - - pub fn getpeereid(socket: ::c_int, - euid: *mut ::uid_t, - egid: *mut ::gid_t) -> ::c_int; - - #[cfg_attr(target_os = "macos", link_name = "glob$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__glob30")] - pub fn glob(pattern: *const ::c_char, - flags: ::c_int, - errfunc: Option ::c_int>, - pglob: *mut ::glob_t) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__globfree30")] - pub fn globfree(pglob: *mut ::glob_t); - - pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn shm_unlink(name: *const ::c_char) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "seekdir$INODE64")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "seekdir$INODE64$UNIX2003")] - pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); - - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "telldir$INODE64")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "telldir$INODE64$UNIX2003")] - pub fn telldir(dirp: *mut ::DIR) -> ::c_long; - pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "msync$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__msync13")] - pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "recvfrom$UNIX2003")] - pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t) -> ::ssize_t; - pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; - pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "bind$UNIX2003")] - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: ::socklen_t) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "writev$UNIX2003")] - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "readv$UNIX2003")] - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "sendmsg$UNIX2003")] - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "recvmsg$UNIX2003")] - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) - -> ::ssize_t; -} - -cfg_if! { - if #[cfg(any(target_os = "macos", target_os = "ios"))] { - mod apple; - pub use self::apple::*; - } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd", - target_os = "bitrig"))] { - mod netbsdlike; - pub use self::netbsdlike::*; - } else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] { - mod freebsdlike; - pub use self::freebsdlike::*; - } else { - // Unknown target_os - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs deleted file mode 100644 index 1471e6f38..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/mod.rs +++ /dev/null @@ -1,626 +0,0 @@ -pub type time_t = i64; -pub type mode_t = u32; -pub type nlink_t = ::uint32_t; -pub type ino_t = ::uint64_t; -pub type pthread_key_t = ::c_int; -pub type rlim_t = u64; -pub type speed_t = ::c_uint; -pub type tcflag_t = ::c_uint; -pub type nl_item = c_long; -pub type clockid_t = ::c_int; -pub type id_t = ::uint32_t; -pub type sem_t = *mut sem; - -pub enum timezone {} -pub enum sem {} - -s! { - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - pub sa_flags: ::c_int, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct sockaddr_in { - pub sin_len: u8, - pub sin_family: ::sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [::int8_t; 8], - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_cc: [::cc_t; ::NCCS], - pub c_ispeed: ::c_int, - pub c_ospeed: ::c_int, - } - - pub struct flock { - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - pub l_type: ::c_short, - pub l_whence: ::c_short, - } -} - -pub const D_T_FMT: ::nl_item = 0; -pub const D_FMT: ::nl_item = 1; -pub const T_FMT: ::nl_item = 2; -pub const T_FMT_AMPM: ::nl_item = 3; -pub const AM_STR: ::nl_item = 4; -pub const PM_STR: ::nl_item = 5; - -pub const DAY_1: ::nl_item = 6; -pub const DAY_2: ::nl_item = 7; -pub const DAY_3: ::nl_item = 8; -pub const DAY_4: ::nl_item = 9; -pub const DAY_5: ::nl_item = 10; -pub const DAY_6: ::nl_item = 11; -pub const DAY_7: ::nl_item = 12; - -pub const ABDAY_1: ::nl_item = 13; -pub const ABDAY_2: ::nl_item = 14; -pub const ABDAY_3: ::nl_item = 15; -pub const ABDAY_4: ::nl_item = 16; -pub const ABDAY_5: ::nl_item = 17; -pub const ABDAY_6: ::nl_item = 18; -pub const ABDAY_7: ::nl_item = 19; - -pub const MON_1: ::nl_item = 20; -pub const MON_2: ::nl_item = 21; -pub const MON_3: ::nl_item = 22; -pub const MON_4: ::nl_item = 23; -pub const MON_5: ::nl_item = 24; -pub const MON_6: ::nl_item = 25; -pub const MON_7: ::nl_item = 26; -pub const MON_8: ::nl_item = 27; -pub const MON_9: ::nl_item = 28; -pub const MON_10: ::nl_item = 29; -pub const MON_11: ::nl_item = 30; -pub const MON_12: ::nl_item = 31; - -pub const ABMON_1: ::nl_item = 32; -pub const ABMON_2: ::nl_item = 33; -pub const ABMON_3: ::nl_item = 34; -pub const ABMON_4: ::nl_item = 35; -pub const ABMON_5: ::nl_item = 36; -pub const ABMON_6: ::nl_item = 37; -pub const ABMON_7: ::nl_item = 38; -pub const ABMON_8: ::nl_item = 39; -pub const ABMON_9: ::nl_item = 40; -pub const ABMON_10: ::nl_item = 41; -pub const ABMON_11: ::nl_item = 42; -pub const ABMON_12: ::nl_item = 43; - -pub const RADIXCHAR: ::nl_item = 44; -pub const THOUSEP: ::nl_item = 45; -pub const YESSTR: ::nl_item = 46; -pub const YESEXPR: ::nl_item = 47; -pub const NOSTR: ::nl_item = 48; -pub const NOEXPR: ::nl_item = 49; -pub const CRNCYSTR: ::nl_item = 50; - -pub const CODESET: ::nl_item = 51; - -pub const EXIT_FAILURE : ::c_int = 1; -pub const EXIT_SUCCESS : ::c_int = 0; -pub const RAND_MAX : ::c_int = 2147483647; -pub const EOF : ::c_int = -1; -pub const SEEK_SET : ::c_int = 0; -pub const SEEK_CUR : ::c_int = 1; -pub const SEEK_END : ::c_int = 2; -pub const _IOFBF : ::c_int = 0; -pub const _IONBF : ::c_int = 2; -pub const _IOLBF : ::c_int = 1; -pub const BUFSIZ : ::c_uint = 1024; -pub const FOPEN_MAX : ::c_uint = 20; -pub const FILENAME_MAX : ::c_uint = 1024; -pub const L_tmpnam : ::c_uint = 1024; -pub const O_RDONLY : ::c_int = 0; -pub const O_WRONLY : ::c_int = 1; -pub const O_RDWR : ::c_int = 2; -pub const O_ACCMODE : ::c_int = 3; -pub const O_APPEND : ::c_int = 8; -pub const O_CREAT : ::c_int = 512; -pub const O_EXCL : ::c_int = 2048; -pub const O_NOCTTY : ::c_int = 32768; -pub const O_TRUNC : ::c_int = 1024; -pub const O_SYNC : ::c_int = 128; -pub const S_IFIFO : mode_t = 4096; -pub const S_IFCHR : mode_t = 8192; -pub const S_IFBLK : mode_t = 24576; -pub const S_IFDIR : mode_t = 16384; -pub const S_IFREG : mode_t = 32768; -pub const S_IFLNK : mode_t = 40960; -pub const S_IFSOCK : mode_t = 49152; -pub const S_IFMT : mode_t = 61440; -pub const S_IEXEC : mode_t = 64; -pub const S_IWRITE : mode_t = 128; -pub const S_IREAD : mode_t = 256; -pub const S_IRWXU : mode_t = 448; -pub const S_IXUSR : mode_t = 64; -pub const S_IWUSR : mode_t = 128; -pub const S_IRUSR : mode_t = 256; -pub const S_IRWXG : mode_t = 56; -pub const S_IXGRP : mode_t = 8; -pub const S_IWGRP : mode_t = 16; -pub const S_IRGRP : mode_t = 32; -pub const S_IRWXO : mode_t = 7; -pub const S_IXOTH : mode_t = 1; -pub const S_IWOTH : mode_t = 2; -pub const S_IROTH : mode_t = 4; -pub const F_OK : ::c_int = 0; -pub const R_OK : ::c_int = 4; -pub const W_OK : ::c_int = 2; -pub const X_OK : ::c_int = 1; -pub const STDIN_FILENO : ::c_int = 0; -pub const STDOUT_FILENO : ::c_int = 1; -pub const STDERR_FILENO : ::c_int = 2; -pub const F_LOCK : ::c_int = 1; -pub const F_TEST : ::c_int = 3; -pub const F_TLOCK : ::c_int = 2; -pub const F_ULOCK : ::c_int = 0; -pub const F_GETLK: ::c_int = 7; -pub const F_SETLK: ::c_int = 8; -pub const F_SETLKW: ::c_int = 9; -pub const SIGHUP : ::c_int = 1; -pub const SIGINT : ::c_int = 2; -pub const SIGQUIT : ::c_int = 3; -pub const SIGILL : ::c_int = 4; -pub const SIGABRT : ::c_int = 6; -pub const SIGEMT: ::c_int = 7; -pub const SIGFPE : ::c_int = 8; -pub const SIGKILL : ::c_int = 9; -pub const SIGSEGV : ::c_int = 11; -pub const SIGPIPE : ::c_int = 13; -pub const SIGALRM : ::c_int = 14; -pub const SIGTERM : ::c_int = 15; -pub const SIGSTKSZ : ::size_t = 40960; - -pub const PROT_NONE : ::c_int = 0; -pub const PROT_READ : ::c_int = 1; -pub const PROT_WRITE : ::c_int = 2; -pub const PROT_EXEC : ::c_int = 4; - -pub const MAP_FILE : ::c_int = 0x0000; -pub const MAP_SHARED : ::c_int = 0x0001; -pub const MAP_PRIVATE : ::c_int = 0x0002; -pub const MAP_FIXED : ::c_int = 0x0010; -pub const MAP_ANON : ::c_int = 0x1000; - -pub const MAP_FAILED : *mut ::c_void = !0 as *mut ::c_void; - -pub const MCL_CURRENT : ::c_int = 0x0001; -pub const MCL_FUTURE : ::c_int = 0x0002; - -pub const MS_ASYNC : ::c_int = 0x0001; - -pub const EPERM : ::c_int = 1; -pub const ENOENT : ::c_int = 2; -pub const ESRCH : ::c_int = 3; -pub const EINTR : ::c_int = 4; -pub const EIO : ::c_int = 5; -pub const ENXIO : ::c_int = 6; -pub const E2BIG : ::c_int = 7; -pub const ENOEXEC : ::c_int = 8; -pub const EBADF : ::c_int = 9; -pub const ECHILD : ::c_int = 10; -pub const EDEADLK : ::c_int = 11; -pub const ENOMEM : ::c_int = 12; -pub const EACCES : ::c_int = 13; -pub const EFAULT : ::c_int = 14; -pub const ENOTBLK : ::c_int = 15; -pub const EBUSY : ::c_int = 16; -pub const EEXIST : ::c_int = 17; -pub const EXDEV : ::c_int = 18; -pub const ENODEV : ::c_int = 19; -pub const ENOTDIR : ::c_int = 20; -pub const EISDIR : ::c_int = 21; -pub const EINVAL : ::c_int = 22; -pub const ENFILE : ::c_int = 23; -pub const EMFILE : ::c_int = 24; -pub const ENOTTY : ::c_int = 25; -pub const ETXTBSY : ::c_int = 26; -pub const EFBIG : ::c_int = 27; -pub const ENOSPC : ::c_int = 28; -pub const ESPIPE : ::c_int = 29; -pub const EROFS : ::c_int = 30; -pub const EMLINK : ::c_int = 31; -pub const EPIPE : ::c_int = 32; -pub const EDOM : ::c_int = 33; -pub const ERANGE : ::c_int = 34; -pub const EAGAIN : ::c_int = 35; -pub const EWOULDBLOCK : ::c_int = 35; -pub const EINPROGRESS : ::c_int = 36; -pub const EALREADY : ::c_int = 37; -pub const ENOTSOCK : ::c_int = 38; -pub const EDESTADDRREQ : ::c_int = 39; -pub const EMSGSIZE : ::c_int = 40; -pub const EPROTOTYPE : ::c_int = 41; -pub const ENOPROTOOPT : ::c_int = 42; -pub const EPROTONOSUPPORT : ::c_int = 43; -pub const ESOCKTNOSUPPORT : ::c_int = 44; -pub const EOPNOTSUPP : ::c_int = 45; -pub const EPFNOSUPPORT : ::c_int = 46; -pub const EAFNOSUPPORT : ::c_int = 47; -pub const EADDRINUSE : ::c_int = 48; -pub const EADDRNOTAVAIL : ::c_int = 49; -pub const ENETDOWN : ::c_int = 50; -pub const ENETUNREACH : ::c_int = 51; -pub const ENETRESET : ::c_int = 52; -pub const ECONNABORTED : ::c_int = 53; -pub const ECONNRESET : ::c_int = 54; -pub const ENOBUFS : ::c_int = 55; -pub const EISCONN : ::c_int = 56; -pub const ENOTCONN : ::c_int = 57; -pub const ESHUTDOWN : ::c_int = 58; -pub const ETOOMANYREFS : ::c_int = 59; -pub const ETIMEDOUT : ::c_int = 60; -pub const ECONNREFUSED : ::c_int = 61; -pub const ELOOP : ::c_int = 62; -pub const ENAMETOOLONG : ::c_int = 63; -pub const EHOSTDOWN : ::c_int = 64; -pub const EHOSTUNREACH : ::c_int = 65; -pub const ENOTEMPTY : ::c_int = 66; -pub const EPROCLIM : ::c_int = 67; -pub const EUSERS : ::c_int = 68; -pub const EDQUOT : ::c_int = 69; -pub const ESTALE : ::c_int = 70; -pub const EREMOTE : ::c_int = 71; -pub const EBADRPC : ::c_int = 72; -pub const ERPCMISMATCH : ::c_int = 73; -pub const EPROGUNAVAIL : ::c_int = 74; -pub const EPROGMISMATCH : ::c_int = 75; -pub const EPROCUNAVAIL : ::c_int = 76; -pub const ENOLCK : ::c_int = 77; -pub const ENOSYS : ::c_int = 78; -pub const EFTYPE : ::c_int = 79; -pub const EAUTH : ::c_int = 80; -pub const ENEEDAUTH : ::c_int = 81; - -pub const F_DUPFD : ::c_int = 0; -pub const F_GETFD : ::c_int = 1; -pub const F_SETFD : ::c_int = 2; -pub const F_GETFL : ::c_int = 3; -pub const F_SETFL : ::c_int = 4; - -pub const SIGTRAP : ::c_int = 5; - -pub const GLOB_APPEND : ::c_int = 0x0001; -pub const GLOB_DOOFFS : ::c_int = 0x0002; -pub const GLOB_ERR : ::c_int = 0x0004; -pub const GLOB_MARK : ::c_int = 0x0008; -pub const GLOB_NOCHECK : ::c_int = 0x0010; -pub const GLOB_NOSORT : ::c_int = 0x0020; -pub const GLOB_NOESCAPE : ::c_int = 0x1000; - -pub const GLOB_NOSPACE : ::c_int = -1; -pub const GLOB_ABORTED : ::c_int = -2; -pub const GLOB_NOMATCH : ::c_int = -3; -pub const GLOB_NOSYS : ::c_int = -4; - -pub const POSIX_MADV_NORMAL : ::c_int = 0; -pub const POSIX_MADV_RANDOM : ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL : ::c_int = 2; -pub const POSIX_MADV_WILLNEED : ::c_int = 3; -pub const POSIX_MADV_DONTNEED : ::c_int = 4; - -pub const _SC_XOPEN_SHM : ::c_int = 30; - -pub const PTHREAD_CREATE_JOINABLE : ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED : ::c_int = 1; - -// http://man.openbsd.org/OpenBSD-current/man2/clock_getres.2 -// The man page says clock_gettime(3) can accept various values as clockid_t but -// http://fxr.watson.org/fxr/source/kern/kern_time.c?v=OPENBSD;im=excerpts#L161 -// the implementation rejects anything other than the below two -// -// http://netbsd.gw.com/cgi-bin/man-cgi?clock_gettime -// https://github.com/jsonn/src/blob/HEAD/sys/kern/subr_time.c#L222 -// Basically the same goes for NetBSD -pub const CLOCK_REALTIME: clockid_t = 0; -pub const CLOCK_MONOTONIC: clockid_t = 3; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_MEMLOCK: ::c_int = 6; -pub const RLIMIT_NPROC: ::c_int = 7; -pub const RLIMIT_NOFILE: ::c_int = 8; - -pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; -pub const RLIM_SAVED_MAX: rlim_t = RLIM_INFINITY; -pub const RLIM_SAVED_CUR: rlim_t = RLIM_INFINITY; - -pub const RUSAGE_SELF: ::c_int = 0; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const MADV_NORMAL : ::c_int = 0; -pub const MADV_RANDOM : ::c_int = 1; -pub const MADV_SEQUENTIAL : ::c_int = 2; -pub const MADV_WILLNEED : ::c_int = 3; -pub const MADV_DONTNEED : ::c_int = 4; -pub const MADV_FREE : ::c_int = 6; - -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_UNIX: ::c_int = AF_LOCAL; -pub const AF_INET: ::c_int = 2; -pub const AF_IMPLINK: ::c_int = 3; -pub const AF_PUP: ::c_int = 4; -pub const AF_CHAOS: ::c_int = 5; -pub const AF_NS: ::c_int = 6; -pub const AF_ISO: ::c_int = 7; -pub const AF_OSI: ::c_int = AF_ISO; -pub const AF_DATAKIT: ::c_int = 9; -pub const AF_CCITT: ::c_int = 10; -pub const AF_SNA: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_DLI: ::c_int = 13; -pub const AF_LAT: ::c_int = 14; -pub const AF_HYLINK: ::c_int = 15; -pub const AF_APPLETALK: ::c_int = 16; -pub const AF_LINK: ::c_int = 18; -pub const pseudo_AF_XTP: ::c_int = 19; -pub const AF_COIP: ::c_int = 20; -pub const AF_CNT: ::c_int = 21; -pub const pseudo_AF_RTIP: ::c_int = 22; -pub const AF_IPX: ::c_int = 23; -pub const AF_INET6: ::c_int = 24; -pub const pseudo_AF_PIP: ::c_int = 25; -pub const AF_ISDN: ::c_int = 26; -pub const AF_E164: ::c_int = AF_ISDN; -pub const AF_NATM: ::c_int = 27; - -pub const PF_UNSPEC: ::c_int = AF_UNSPEC; -pub const PF_LOCAL: ::c_int = AF_LOCAL; -pub const PF_UNIX: ::c_int = PF_LOCAL; -pub const PF_INET: ::c_int = AF_INET; -pub const PF_IMPLINK: ::c_int = AF_IMPLINK; -pub const PF_PUP: ::c_int = AF_PUP; -pub const PF_CHAOS: ::c_int = AF_CHAOS; -pub const PF_NS: ::c_int = AF_NS; -pub const PF_ISO: ::c_int = AF_ISO; -pub const PF_OSI: ::c_int = AF_ISO; -pub const PF_DATAKIT: ::c_int = AF_DATAKIT; -pub const PF_CCITT: ::c_int = AF_CCITT; -pub const PF_SNA: ::c_int = AF_SNA; -pub const PF_DECnet: ::c_int = AF_DECnet; -pub const PF_DLI: ::c_int = AF_DLI; -pub const PF_LAT: ::c_int = AF_LAT; -pub const PF_HYLINK: ::c_int = AF_HYLINK; -pub const PF_APPLETALK: ::c_int = AF_APPLETALK; -pub const PF_LINK: ::c_int = AF_LINK; -pub const PF_XTP: ::c_int = pseudo_AF_XTP; -pub const PF_COIP: ::c_int = AF_COIP; -pub const PF_CNT: ::c_int = AF_CNT; -pub const PF_IPX: ::c_int = AF_IPX; -pub const PF_INET6: ::c_int = AF_INET6; -pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; -pub const PF_PIP: ::c_int = pseudo_AF_PIP; -pub const PF_ISDN: ::c_int = AF_ISDN; -pub const PF_NATM: ::c_int = AF_NATM; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_SEQPACKET: ::c_int = 5; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 10; -pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_TTL: ::c_int = 4; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_ADD_MEMBERSHIP: ::c_int = 12; -pub const IP_DROP_MEMBERSHIP: ::c_int = 13; - -pub const TCP_NODELAY: ::c_int = 0x01; -pub const SOL_SOCKET: ::c_int = 0xffff; -pub const SO_DEBUG: ::c_int = 0x01; -pub const SO_ACCEPTCONN: ::c_int = 0x0002; -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_USELOOPBACK: ::c_int = 0x0040; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_REUSEPORT: ::c_int = 0x0200; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_TYPE: ::c_int = 0x1008; - -pub const SOMAXCONN: ::c_int = 128; - -pub const MSG_OOB: ::c_int = 0x1; -pub const MSG_PEEK: ::c_int = 0x2; -pub const MSG_DONTROUTE: ::c_int = 0x4; -pub const MSG_EOR: ::c_int = 0x8; -pub const MSG_TRUNC: ::c_int = 0x10; -pub const MSG_CTRUNC: ::c_int = 0x20; -pub const MSG_WAITALL: ::c_int = 0x40; -pub const MSG_DONTWAIT: ::c_int = 0x80; -pub const MSG_BCAST: ::c_int = 0x100; -pub const MSG_MCAST: ::c_int = 0x200; -pub const MSG_NOSIGNAL: ::c_int = 0x400; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x800; - -pub const SCM_RIGHTS: ::c_int = 0x01; - -pub const IFF_LOOPBACK: ::c_int = 0x8; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const O_NONBLOCK : ::c_int = 4; - -pub const IPPROTO_RAW : ::c_int = 255; - -pub const _SC_ARG_MAX : ::c_int = 1; -pub const _SC_CHILD_MAX : ::c_int = 2; -pub const _SC_NGROUPS_MAX : ::c_int = 4; -pub const _SC_OPEN_MAX : ::c_int = 5; -pub const _SC_JOB_CONTROL : ::c_int = 6; -pub const _SC_SAVED_IDS : ::c_int = 7; -pub const _SC_VERSION : ::c_int = 8; -pub const _SC_BC_BASE_MAX : ::c_int = 9; -pub const _SC_BC_DIM_MAX : ::c_int = 10; -pub const _SC_BC_SCALE_MAX : ::c_int = 11; -pub const _SC_BC_STRING_MAX : ::c_int = 12; -pub const _SC_COLL_WEIGHTS_MAX : ::c_int = 13; -pub const _SC_EXPR_NEST_MAX : ::c_int = 14; -pub const _SC_LINE_MAX : ::c_int = 15; -pub const _SC_RE_DUP_MAX : ::c_int = 16; -pub const _SC_2_VERSION : ::c_int = 17; -pub const _SC_2_C_BIND : ::c_int = 18; -pub const _SC_2_C_DEV : ::c_int = 19; -pub const _SC_2_CHAR_TERM : ::c_int = 20; -pub const _SC_2_FORT_DEV : ::c_int = 21; -pub const _SC_2_FORT_RUN : ::c_int = 22; -pub const _SC_2_LOCALEDEF : ::c_int = 23; -pub const _SC_2_SW_DEV : ::c_int = 24; -pub const _SC_2_UPE : ::c_int = 25; -pub const _SC_STREAM_MAX : ::c_int = 26; -pub const _SC_TZNAME_MAX : ::c_int = 27; -pub const _SC_PAGESIZE : ::c_int = 28; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_FSYNC : ::c_int = 29; - -pub const Q_GETQUOTA: ::c_int = 0x300; -pub const Q_SETQUOTA: ::c_int = 0x400; - -pub const RTLD_GLOBAL: ::c_int = 0x100; - -pub const LOG_NFACILITIES: ::c_int = 24; - -pub const HW_NCPU: ::c_int = 3; - -pub const B0: speed_t = 0; -pub const B50: speed_t = 50; -pub const B75: speed_t = 75; -pub const B110: speed_t = 110; -pub const B134: speed_t = 134; -pub const B150: speed_t = 150; -pub const B200: speed_t = 200; -pub const B300: speed_t = 300; -pub const B600: speed_t = 600; -pub const B1200: speed_t = 1200; -pub const B1800: speed_t = 1800; -pub const B2400: speed_t = 2400; -pub const B4800: speed_t = 4800; -pub const B9600: speed_t = 9600; -pub const B19200: speed_t = 19200; -pub const B38400: speed_t = 38400; -pub const B7200: speed_t = 7200; -pub const B14400: speed_t = 14400; -pub const B28800: speed_t = 28800; -pub const B57600: speed_t = 57600; -pub const B76800: speed_t = 76800; -pub const B115200: speed_t = 115200; -pub const B230400: speed_t = 230400; -pub const EXTA: speed_t = 19200; -pub const EXTB: speed_t = 38400; - -pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; - -f! { - pub fn WSTOPSIG(status: ::c_int) -> ::c_int { - status >> 8 - } - - pub fn WIFSIGNALED(status: ::c_int) -> bool { - (status & 0o177) != 0o177 && (status & 0o177) != 0 - } - - pub fn WIFSTOPPED(status: ::c_int) -> bool { - (status & 0o177) == 0o177 - } -} - -#[link(name = "util")] -extern { - pub fn mincore(addr: *mut ::c_void, len: ::size_t, - vec: *mut ::c_char) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__clock_getres50")] - pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__clock_gettime50")] - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")] - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - pub fn __errno() -> *mut ::c_int; - pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) - -> ::c_int; - pub fn memrchr(cx: *const ::c_void, - c: ::c_int, - n: ::size_t) -> *mut ::c_void; - pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; - pub fn mkostemps(template: *mut ::c_char, - suffixlen: ::c_int, - flags: ::c_int) -> ::c_int; - pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; - pub fn fdatasync(fd: ::c_int) -> ::c_int; - pub fn openpty(amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::c_int; - pub fn forkpty(amaster: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize) -> ::pid_t; - pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; - - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; - - pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, dev: dev_t) -> ::c_int; - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn sem_timedwait(sem: *mut sem_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, - clock_id: clockid_t) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; - pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_os = "netbsd")] { - mod netbsd; - pub use self::netbsd::*; - } else if #[cfg(any(target_os = "openbsd", target_os = "bitrig"))] { - mod openbsdlike; - pub use self::openbsdlike::*; - } else { - // Unknown target_os - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs deleted file mode 100644 index ffe8d75cb..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ /dev/null @@ -1,725 +0,0 @@ -pub type clock_t = ::c_uint; -pub type suseconds_t = ::c_int; -pub type dev_t = u64; -pub type blksize_t = ::int32_t; -pub type fsblkcnt_t = ::uint64_t; -pub type fsfilcnt_t = ::uint64_t; -pub type idtype_t = ::c_int; - -s! { - pub struct aiocb { - pub aio_offset: ::off_t, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_sigevent: ::sigevent, - _state: ::c_int, - _errno: ::c_int, - _retval: ::ssize_t - } - - pub struct dirent { - pub d_fileno: ::ino_t, - pub d_reclen: u16, - pub d_namlen: u16, - pub d_type: u8, - pub d_name: [::c_char; 512], - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - pub gl_matchc: ::size_t, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - pub gl_pathv: *mut *mut ::c_char, - - __unused3: *mut ::c_void, - - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - __unused8: *mut ::c_void, - } - - pub struct sigevent { - pub sigev_notify: ::c_int, - pub sigev_signo: ::c_int, - pub sigev_value: ::sigval, - __unused1: *mut ::c_void, //actually a function pointer - pub sigev_notify_attributes: *mut ::c_void - } - - pub struct sigset_t { - __bits: [u32; 4], - } - - pub struct stat { - pub st_dev: ::dev_t, - pub st_mode: ::mode_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atimensec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtimensec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctimensec: ::c_long, - pub st_birthtime: ::time_t, - pub st_birthtimensec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: ::blksize_t, - pub st_flags: ::uint32_t, - pub st_gen: ::uint32_t, - pub st_spare: [::uint32_t; 2], - } - - pub struct statvfs { - pub f_flag: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_iosize: ::c_ulong, - - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_bresvd: ::fsblkcnt_t, - - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fresvd: ::fsfilcnt_t, - - pub f_syncreads: ::uint64_t, - pub f_syncwrites: ::uint64_t, - - pub f_asyncreads: ::uint64_t, - pub f_asyncwrites: ::uint64_t, - - pub f_fsidx: ::fsid_t, - pub f_fsid: ::c_ulong, - pub f_namemax: ::c_ulong, - pub f_owner: ::uid_t, - - pub f_spare: [::uint32_t; 4], - - pub f_fstypename: [::c_char; 32], - pub f_mntonname: [::c_char; 1024], - pub f_mntfromname: [::c_char; 1024], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_canonname: *mut ::c_char, - pub ai_addr: *mut ::sockaddr, - pub ai_next: *mut ::addrinfo, - } - - pub struct sockaddr_storage { - pub ss_len: u8, - pub ss_family: ::sa_family_t, - __ss_pad1: [u8; 6], - __ss_pad2: i64, - __ss_pad3: [u8; 112], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - __pad1: ::c_int, - pub si_addr: *mut ::c_void, - __pad2: [u64; 13], - } - - pub struct pthread_attr_t { - pta_magic: ::c_uint, - pta_flags: ::c_int, - pta_private: *mut ::c_void, - } - - pub struct pthread_mutex_t { - ptm_magic: ::c_uint, - ptm_errorcheck: ::c_uchar, - ptm_pad1: [u8; 3], - ptm_interlock: ::c_uchar, - ptm_pad2: [u8; 3], - ptm_owner: ::pthread_t, - ptm_waiters: *mut u8, - ptm_recursed: ::c_uint, - ptm_spare2: *mut ::c_void, - } - - pub struct pthread_mutexattr_t { - ptma_magic: ::c_uint, - ptma_private: *mut ::c_void, - } - - pub struct pthread_cond_t { - ptc_magic: ::c_uint, - ptc_lock: ::c_uchar, - ptc_waiters_first: *mut u8, - ptc_waiters_last: *mut u8, - ptc_mutex: *mut ::pthread_mutex_t, - ptc_private: *mut ::c_void, - } - - pub struct pthread_condattr_t { - ptca_magic: ::c_uint, - ptca_private: *mut ::c_void, - } - - pub struct pthread_rwlock_t { - ptr_magic: ::c_uint, - ptr_interlock: ::c_uchar, - ptr_rblocked_first: *mut u8, - ptr_rblocked_last: *mut u8, - ptr_wblocked_first: *mut u8, - ptr_wblocked_last: *mut u8, - ptr_nreaders: ::c_uint, - ptr_owner: ::pthread_t, - ptr_private: *mut ::c_void, - } - - pub struct kevent { - pub ident: ::uintptr_t, - pub filter: ::uint32_t, - pub flags: ::uint32_t, - pub fflags: ::uint32_t, - pub data: ::int64_t, - pub udata: ::intptr_t, - } - - pub struct dqblk { - pub dqb_bhardlimit: ::uint32_t, - pub dqb_bsoftlimit: ::uint32_t, - pub dqb_curblocks: ::uint32_t, - pub dqb_ihardlimit: ::uint32_t, - pub dqb_isoftlimit: ::uint32_t, - pub dqb_curinodes: ::uint32_t, - pub dqb_btime: ::int32_t, - pub dqb_itime: ::int32_t, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *const ::c_void, - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } -} - -pub const AT_FDCWD: ::c_int = -100; -pub const AT_EACCESS: ::c_int = 0x100; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; -pub const AT_REMOVEDIR: ::c_int = 0x800; - -pub const LC_COLLATE_MASK: ::c_int = (1 << ::LC_COLLATE); -pub const LC_CTYPE_MASK: ::c_int = (1 << ::LC_CTYPE); -pub const LC_MONETARY_MASK: ::c_int = (1 << ::LC_MONETARY); -pub const LC_NUMERIC_MASK: ::c_int = (1 << ::LC_NUMERIC); -pub const LC_TIME_MASK: ::c_int = (1 << ::LC_TIME); -pub const LC_MESSAGES_MASK: ::c_int = (1 << ::LC_MESSAGES); -pub const LC_ALL_MASK: ::c_int = !0; - -pub const ERA: ::nl_item = 52; -pub const ERA_D_FMT: ::nl_item = 53; -pub const ERA_D_T_FMT: ::nl_item = 54; -pub const ERA_T_FMT: ::nl_item = 55; -pub const ALT_DIGITS: ::nl_item = 56; - -pub const O_CLOEXEC: ::c_int = 0x400000; -pub const O_ALT_IO: ::c_int = 0x40000; -pub const O_NOSIGPIPE: ::c_int = 0x1000000; -pub const O_SEARCH: ::c_int = 0x800000; -pub const O_EXLOCK: ::c_int = 0x20; -pub const O_SHLOCK: ::c_int = 0x10; -pub const O_DIRECTORY: ::c_int = 0x200000; - -pub const MS_SYNC : ::c_int = 0x4; -pub const MS_INVALIDATE : ::c_int = 0x2; - -pub const RLIM_NLIMITS: ::c_int = 12; - -pub const ENOATTR : ::c_int = 93; -pub const EILSEQ : ::c_int = 85; -pub const EOVERFLOW : ::c_int = 84; -pub const ECANCELED : ::c_int = 87; -pub const EIDRM : ::c_int = 82; -pub const ENOMSG : ::c_int = 83; -pub const ENOTSUP : ::c_int = 86; -pub const ELAST : ::c_int = 96; - -pub const F_DUPFD_CLOEXEC : ::c_int = 12; -pub const F_CLOSEM: ::c_int = 10; -pub const F_GETNOSIGPIPE: ::c_int = 13; -pub const F_SETNOSIGPIPE: ::c_int = 14; -pub const F_MAXFD: ::c_int = 11; - -pub const IPV6_JOIN_GROUP: ::c_int = 12; -pub const IPV6_LEAVE_GROUP: ::c_int = 13; - -pub const SOCK_CONN_DGRAM: ::c_int = 6; -pub const SOCK_DCCP: ::c_int = SOCK_CONN_DGRAM; -pub const SOCK_NOSIGPIPE: ::c_int = 0x40000000; -pub const SOCK_FLAGS_MASK: ::c_int = 0xf0000000; - -pub const SO_SNDTIMEO: ::c_int = 0x100b; -pub const SO_RCVTIMEO: ::c_int = 0x100c; -pub const SO_ACCEPTFILTER: ::c_int = 0x1000; -pub const SO_TIMESTAMP: ::c_int = 0x2000; -pub const SO_OVERFLOWED: ::c_int = 0x1009; -pub const SO_NOHEADER: ::c_int = 0x100a; - -pub const AF_OROUTE: ::c_int = 17; -pub const AF_ARP: ::c_int = 28; -pub const pseudo_AF_KEY: ::c_int = 29; -pub const pseudo_AF_HDRCMPLT: ::c_int = 30; -pub const AF_BLUETOOTH: ::c_int = 31; -pub const AF_IEEE80211: ::c_int = 32; -pub const AF_MPLS: ::c_int = 33; -pub const AF_ROUTE: ::c_int = 34; -pub const AF_MAX: ::c_int = 35; - -pub const NET_MAXID: ::c_int = AF_MAX; -pub const NET_RT_DUMP: ::c_int = 1; -pub const NET_RT_FLAGS: ::c_int = 2; -pub const NET_RT_OOIFLIST: ::c_int = 3; -pub const NET_RT_OIFLIST: ::c_int = 4; -pub const NET_RT_IFLIST: ::c_int = 5; -pub const NET_RT_MAXID: ::c_int = 6; - -pub const PF_OROUTE: ::c_int = AF_OROUTE; -pub const PF_ARP: ::c_int = AF_ARP; -pub const PF_KEY: ::c_int = pseudo_AF_KEY; -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_MPLS: ::c_int = AF_MPLS; -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_MAX: ::c_int = AF_MAX; - -pub const MSG_NBIO: ::c_int = 0x1000; -pub const MSG_WAITFORONE: ::c_int = 0x2000; -pub const MSG_NOTIFICATION: ::c_int = 0x4000; - -pub const SCM_TIMESTAMP: ::c_int = 0x08; -pub const SCM_CREDS: ::c_int = 0x10; - -pub const O_DSYNC : ::c_int = 0x10000; - -pub const MAP_RENAME : ::c_int = 0x20; -pub const MAP_NORESERVE : ::c_int = 0x40; -pub const MAP_HASSEMAPHORE : ::c_int = 0x200; -pub const MAP_WIRED: ::c_int = 0x800; - -pub const _SC_IOV_MAX : ::c_int = 32; -pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 47; -pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 48; -pub const _SC_LOGIN_NAME_MAX : ::c_int = 37; -pub const _SC_MQ_PRIO_MAX : ::c_int = 55; -pub const _SC_NPROCESSORS_ONLN : ::c_int = 1002; -pub const _SC_THREADS : ::c_int = 41; -pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 61; -pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 62; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 57; -pub const _SC_THREAD_KEYS_MAX : ::c_int = 58; -pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 64; -pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 65; -pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 63; -pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 66; -pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 67; -pub const _SC_THREAD_STACK_MIN : ::c_int = 59; -pub const _SC_THREAD_THREADS_MAX : ::c_int = 60; -pub const _SC_TTY_NAME_MAX : ::c_int = 68; -pub const _SC_ATEXIT_MAX : ::c_int = 40; -pub const _SC_CLK_TCK : ::c_int = 39; -pub const _SC_AIO_LISTIO_MAX : ::c_int = 51; -pub const _SC_AIO_MAX : ::c_int = 52; -pub const _SC_ASYNCHRONOUS_IO : ::c_int = 50; -pub const _SC_MAPPED_FILES : ::c_int = 33; -pub const _SC_MEMLOCK : ::c_int = 34; -pub const _SC_MEMLOCK_RANGE : ::c_int = 35; -pub const _SC_MEMORY_PROTECTION : ::c_int = 36; -pub const _SC_MESSAGE_PASSING : ::c_int = 53; -pub const _SC_MQ_OPEN_MAX : ::c_int = 54; -pub const _SC_PRIORITY_SCHEDULING : ::c_int = 56; -pub const _SC_SEMAPHORES : ::c_int = 42; -pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 87; -pub const _SC_SYNCHRONIZED_IO : ::c_int = 31; -pub const _SC_TIMERS : ::c_int = 44; -pub const _SC_HOST_NAME_MAX : ::c_int = 69; - -pub const FD_SETSIZE: usize = 0x100; - -pub const ST_NOSUID: ::c_ulong = 8; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - ptm_magic: 0x33330003, - ptm_errorcheck: 0, - ptm_interlock: 0, - ptm_waiters: 0 as *mut _, - ptm_owner: 0, - ptm_pad1: [0; 3], - ptm_pad2: [0; 3], - ptm_recursed: 0, - ptm_spare2: 0 as *mut _, -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - ptc_magic: 0x55550005, - ptc_lock: 0, - ptc_waiters_first: 0 as *mut _, - ptc_waiters_last: 0 as *mut _, - ptc_mutex: 0 as *mut _, - ptc_private: 0 as *mut _, -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - ptr_magic: 0x99990009, - ptr_interlock: 0, - ptr_rblocked_first: 0 as *mut _, - ptr_rblocked_last: 0 as *mut _, - ptr_wblocked_first: 0 as *mut _, - ptr_wblocked_last: 0 as *mut _, - ptr_nreaders: 0, - ptr_owner: 0, - ptr_private: 0 as *mut _, -}; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; - -pub const EVFILT_AIO: ::int32_t = 2; -pub const EVFILT_PROC: ::int32_t = 4; -pub const EVFILT_READ: ::int32_t = 0; -pub const EVFILT_SIGNAL: ::int32_t = 5; -pub const EVFILT_TIMER: ::int32_t = 6; -pub const EVFILT_VNODE: ::int32_t = 3; -pub const EVFILT_WRITE: ::int32_t = 1; - -pub const EV_ADD: ::uint32_t = 0x1; -pub const EV_DELETE: ::uint32_t = 0x2; -pub const EV_ENABLE: ::uint32_t = 0x4; -pub const EV_DISABLE: ::uint32_t = 0x8; -pub const EV_ONESHOT: ::uint32_t = 0x10; -pub const EV_CLEAR: ::uint32_t = 0x20; -pub const EV_RECEIPT: ::uint32_t = 0x40; -pub const EV_DISPATCH: ::uint32_t = 0x80; -pub const EV_FLAG1: ::uint32_t = 0x2000; -pub const EV_ERROR: ::uint32_t = 0x4000; -pub const EV_EOF: ::uint32_t = 0x8000; -pub const EV_SYSFLAGS: ::uint32_t = 0xf000; - -pub const NOTE_LOWAT: ::uint32_t = 0x00000001; -pub const NOTE_DELETE: ::uint32_t = 0x00000001; -pub const NOTE_WRITE: ::uint32_t = 0x00000002; -pub const NOTE_EXTEND: ::uint32_t = 0x00000004; -pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; -pub const NOTE_LINK: ::uint32_t = 0x00000010; -pub const NOTE_RENAME: ::uint32_t = 0x00000020; -pub const NOTE_REVOKE: ::uint32_t = 0x00000040; -pub const NOTE_EXIT: ::uint32_t = 0x80000000; -pub const NOTE_FORK: ::uint32_t = 0x40000000; -pub const NOTE_EXEC: ::uint32_t = 0x20000000; -pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; -pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; -pub const NOTE_TRACK: ::uint32_t = 0x00000001; -pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; -pub const NOTE_CHILD: ::uint32_t = 0x00000004; - -pub const CRTSCTS: ::tcflag_t = 0x00010000; - -pub const TMP_MAX : ::c_uint = 308915776; - -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const RTLD_NOLOAD: ::c_int = 0x2000; -pub const RTLD_LOCAL: ::c_int = 0x200; - -pub const CTL_MAXNAME: ::c_int = 12; -pub const SYSCTL_NAMELEN: ::c_int = 32; -pub const SYSCTL_DEFSIZE: ::c_int = 8; -pub const CTLTYPE_NODE: ::c_int = 1; -pub const CTLTYPE_INT: ::c_int = 2; -pub const CTLTYPE_STRING: ::c_int = 3; -pub const CTLTYPE_QUAD: ::c_int = 4; -pub const CTLTYPE_STRUCT: ::c_int = 5; -pub const CTLTYPE_BOOL: ::c_int = 6; -pub const CTLFLAG_READONLY: ::c_int = 0x00000000; -pub const CTLFLAG_READWRITE: ::c_int = 0x00000070; -pub const CTLFLAG_ANYWRITE: ::c_int = 0x00000080; -pub const CTLFLAG_PRIVATE: ::c_int = 0x00000100; -pub const CTLFLAG_PERMANENT: ::c_int = 0x00000200; -pub const CTLFLAG_OWNDATA: ::c_int = 0x00000400; -pub const CTLFLAG_IMMEDIATE: ::c_int = 0x00000800; -pub const CTLFLAG_HEX: ::c_int = 0x00001000; -pub const CTLFLAG_ROOT: ::c_int = 0x00002000; -pub const CTLFLAG_ANYNUMBER: ::c_int = 0x00004000; -pub const CTLFLAG_HIDDEN: ::c_int = 0x00008000; -pub const CTLFLAG_ALIAS: ::c_int = 0x00010000; -pub const CTLFLAG_MMAP: ::c_int = 0x00020000; -pub const CTLFLAG_OWNDESC: ::c_int = 0x00040000; -pub const CTLFLAG_UNSIGNED: ::c_int = 0x00080000; -pub const SYSCTL_VERS_MASK: ::c_int = 0xff000000; -pub const SYSCTL_VERS_0: ::c_int = 0x00000000; -pub const SYSCTL_VERS_1: ::c_int = 0x01000000; -pub const SYSCTL_VERSION: ::c_int = SYSCTL_VERS_1; -pub const CTL_EOL: ::c_int = -1; -pub const CTL_QUERY: ::c_int = -2; -pub const CTL_CREATE: ::c_int = -3; -pub const CTL_CREATESYM: ::c_int = -4; -pub const CTL_DESTROY: ::c_int = -5; -pub const CTL_MMAP: ::c_int = -6; -pub const CTL_DESCRIBE: ::c_int = -7; -pub const CTL_UNSPEC: ::c_int = 0; -pub const CTL_KERN: ::c_int = 1; -pub const CTL_VM: ::c_int = 2; -pub const CTL_VFS: ::c_int = 3; -pub const CTL_NET: ::c_int = 4; -pub const CTL_DEBUG: ::c_int = 5; -pub const CTL_HW: ::c_int = 6; -pub const CTL_MACHDEP: ::c_int = 7; -pub const CTL_USER: ::c_int = 8; -pub const CTL_DDB: ::c_int = 9; -pub const CTL_PROC: ::c_int = 10; -pub const CTL_VENDOR: ::c_int = 11; -pub const CTL_EMUL: ::c_int = 12; -pub const CTL_SECURITY: ::c_int = 13; -pub const CTL_MAXID: ::c_int = 14; -pub const KERN_OSTYPE: ::c_int = 1; -pub const KERN_OSRELEASE: ::c_int = 2; -pub const KERN_OSREV: ::c_int = 3; -pub const KERN_VERSION: ::c_int = 4; -pub const KERN_MAXVNODES: ::c_int = 5; -pub const KERN_MAXPROC: ::c_int = 6; -pub const KERN_MAXFILES: ::c_int = 7; -pub const KERN_ARGMAX: ::c_int = 8; -pub const KERN_SECURELVL: ::c_int = 9; -pub const KERN_HOSTNAME: ::c_int = 10; -pub const KERN_HOSTID: ::c_int = 11; -pub const KERN_CLOCKRATE: ::c_int = 12; -pub const KERN_VNODE: ::c_int = 13; -pub const KERN_PROC: ::c_int = 14; -pub const KERN_FILE: ::c_int = 15; -pub const KERN_PROF: ::c_int = 16; -pub const KERN_POSIX1: ::c_int = 17; -pub const KERN_NGROUPS: ::c_int = 18; -pub const KERN_JOB_CONTROL: ::c_int = 19; -pub const KERN_SAVED_IDS: ::c_int = 20; -pub const KERN_OBOOTTIME: ::c_int = 21; -pub const KERN_DOMAINNAME: ::c_int = 22; -pub const KERN_MAXPARTITIONS: ::c_int = 23; -pub const KERN_RAWPARTITION: ::c_int = 24; -pub const KERN_NTPTIME: ::c_int = 25; -pub const KERN_TIMEX: ::c_int = 26; -pub const KERN_AUTONICETIME: ::c_int = 27; -pub const KERN_AUTONICEVAL: ::c_int = 28; -pub const KERN_RTC_OFFSET: ::c_int = 29; -pub const KERN_ROOT_DEVICE: ::c_int = 30; -pub const KERN_MSGBUFSIZE: ::c_int = 31; -pub const KERN_FSYNC: ::c_int = 32; -pub const KERN_OLDSYSVMSG: ::c_int = 33; -pub const KERN_OLDSYSVSEM: ::c_int = 34; -pub const KERN_OLDSYSVSHM: ::c_int = 35; -pub const KERN_OLDSHORTCORENAME: ::c_int = 36; -pub const KERN_SYNCHRONIZED_IO: ::c_int = 37; -pub const KERN_IOV_MAX: ::c_int = 38; -pub const KERN_MBUF: ::c_int = 39; -pub const KERN_MAPPED_FILES: ::c_int = 40; -pub const KERN_MEMLOCK: ::c_int = 41; -pub const KERN_MEMLOCK_RANGE: ::c_int = 42; -pub const KERN_MEMORY_PROTECTION: ::c_int = 43; -pub const KERN_LOGIN_NAME_MAX: ::c_int = 44; -pub const KERN_DEFCORENAME: ::c_int = 45; -pub const KERN_LOGSIGEXIT: ::c_int = 46; -pub const KERN_PROC2: ::c_int = 47; -pub const KERN_PROC_ARGS: ::c_int = 48; -pub const KERN_FSCALE: ::c_int = 49; -pub const KERN_CCPU: ::c_int = 50; -pub const KERN_CP_TIME: ::c_int = 51; -pub const KERN_OLDSYSVIPC_INFO: ::c_int = 52; -pub const KERN_MSGBUF: ::c_int = 53; -pub const KERN_CONSDEV: ::c_int = 54; -pub const KERN_MAXPTYS: ::c_int = 55; -pub const KERN_PIPE: ::c_int = 56; -pub const KERN_MAXPHYS: ::c_int = 57; -pub const KERN_SBMAX: ::c_int = 58; -pub const KERN_TKSTAT: ::c_int = 59; -pub const KERN_MONOTONIC_CLOCK: ::c_int = 60; -pub const KERN_URND: ::c_int = 61; -pub const KERN_LABELSECTOR: ::c_int = 62; -pub const KERN_LABELOFFSET: ::c_int = 63; -pub const KERN_LWP: ::c_int = 64; -pub const KERN_FORKFSLEEP: ::c_int = 65; -pub const KERN_POSIX_THREADS: ::c_int = 66; -pub const KERN_POSIX_SEMAPHORES: ::c_int = 67; -pub const KERN_POSIX_BARRIERS: ::c_int = 68; -pub const KERN_POSIX_TIMERS: ::c_int = 69; -pub const KERN_POSIX_SPIN_LOCKS: ::c_int = 70; -pub const KERN_POSIX_READER_WRITER_LOCKS: ::c_int = 71; -pub const KERN_DUMP_ON_PANIC: ::c_int = 72; -pub const KERN_SOMAXKVA: ::c_int = 73; -pub const KERN_ROOT_PARTITION: ::c_int = 74; -pub const KERN_DRIVERS: ::c_int = 75; -pub const KERN_BUF: ::c_int = 76; -pub const KERN_FILE2: ::c_int = 77; -pub const KERN_VERIEXEC: ::c_int = 78; -pub const KERN_CP_ID: ::c_int = 79; -pub const KERN_HARDCLOCK_TICKS: ::c_int = 80; -pub const KERN_ARND: ::c_int = 81; -pub const KERN_SYSVIPC: ::c_int = 82; -pub const KERN_BOOTTIME: ::c_int = 83; -pub const KERN_EVCNT: ::c_int = 84; -pub const KERN_MAXID: ::c_int = 85; -pub const KERN_PROC_ALL: ::c_int = 0; -pub const KERN_PROC_PID: ::c_int = 1; -pub const KERN_PROC_PGRP: ::c_int = 2; -pub const KERN_PROC_SESSION: ::c_int = 3; -pub const KERN_PROC_TTY: ::c_int = 4; -pub const KERN_PROC_UID: ::c_int = 5; -pub const KERN_PROC_RUID: ::c_int = 6; -pub const KERN_PROC_GID: ::c_int = 7; -pub const KERN_PROC_RGID: ::c_int = 8; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const AIO_CANCELED: ::c_int = 1; -pub const AIO_NOTCANCELED: ::c_int = 2; -pub const AIO_ALLDONE: ::c_int = 3; -pub const LIO_NOP: ::c_int = 0; -pub const LIO_WRITE: ::c_int = 1; -pub const LIO_READ: ::c_int = 2; -pub const LIO_WAIT: ::c_int = 1; -pub const LIO_NOWAIT: ::c_int = 0; - -pub const SIGEV_NONE: ::c_int = 0; -pub const SIGEV_SIGNAL: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 2; - -pub const WSTOPPED: ::c_int = 0x00000002; // same as WUNTRACED -pub const WCONTINUED: ::c_int = 0x00000010; -pub const WEXITED: ::c_int = 0x000000020; -pub const WNOWAIT: ::c_int = 0x00010000; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 4; - -pub const B460800: ::speed_t = 460800; -pub const B921600: ::speed_t = 921600; - -extern { - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - #[link_name = "__aio_suspend50"] - pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, - nitems: ::c_int, sevp: *mut sigevent) -> ::c_int; - - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int) -> ::c_int; - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn sysctl(name: *const ::c_int, - namelen: ::c_uint, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *const ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn sysctlbyname(name: *const ::c_char, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *const ::c_void, - newlen: ::size_t) - -> ::c_int; - #[link_name = "__kevent50"] - pub fn kevent(kq: ::c_int, - changelist: *const ::kevent, - nchanges: ::size_t, - eventlist: *mut ::kevent, - nevents: ::size_t, - timeout: *const ::timespec) -> ::c_int; - #[link_name = "__mount50"] - pub fn mount(src: *const ::c_char, - target: *const ::c_char, - flags: ::c_int, - data: *mut ::c_void, - size: ::size_t) -> ::c_int; - pub fn ptrace(requeset: ::c_int, - pid: ::pid_t, - addr: *mut ::c_void, - data: ::c_int) -> ::c_int; - pub fn pthread_setname_np(t: ::pthread_t, - name: *const ::c_char, - arg: *mut ::c_void) -> ::c_int; - pub fn pthread_getattr_np(native: ::pthread_t, - attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, - guardsize: *mut ::size_t) -> ::c_int; - pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, - stackaddr: *mut *mut ::c_void, - stacksize: *mut ::size_t) -> ::c_int; - #[link_name = "__sigtimedwait50"] - pub fn sigtimedwait(set: *const sigset_t, - info: *mut siginfo_t, - timeout: *const ::timespec) -> ::c_int; - pub fn sigwaitinfo(set: *const sigset_t, - info: *mut siginfo_t) -> ::c_int; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t); - pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; -} - -mod other; -pub use self::other::*; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs deleted file mode 100644 index 9b0b338b9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs deleted file mode 100644 index b07c476aa..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_long = i64; -pub type c_ulong = u64; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs deleted file mode 100644 index 3a9bf0866..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/netbsd/other/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -cfg_if! { - if #[cfg(any(target_arch = "sparc64", - target_arch = "x86_64"))] { - mod b64; - pub use self::b64::*; - } else if #[cfg(any(target_arch = "arm", - target_arch = "powerpc", - target_arch = "x86"))] { - mod b32; - pub use self::b32::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs deleted file mode 100644 index 695cf68dc..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs +++ /dev/null @@ -1,75 +0,0 @@ -s! { - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } -} - -pub const LC_COLLATE_MASK: ::c_int = (1 << 0); -pub const LC_CTYPE_MASK: ::c_int = (1 << 1); -pub const LC_MESSAGES_MASK: ::c_int = (1 << 2); -pub const LC_MONETARY_MASK: ::c_int = (1 << 3); -pub const LC_NUMERIC_MASK: ::c_int = (1 << 4); -pub const LC_TIME_MASK: ::c_int = (1 << 5); -pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK - | LC_CTYPE_MASK - | LC_MESSAGES_MASK - | LC_MONETARY_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK; - -pub const ERA: ::nl_item = 52; -pub const ERA_D_FMT: ::nl_item = 53; -pub const ERA_D_T_FMT: ::nl_item = 54; -pub const ERA_T_FMT: ::nl_item = 55; -pub const ALT_DIGITS: ::nl_item = 56; - -pub const D_MD_ORDER: ::nl_item = 57; - -pub const ALTMON_1: ::nl_item = 58; -pub const ALTMON_2: ::nl_item = 59; -pub const ALTMON_3: ::nl_item = 60; -pub const ALTMON_4: ::nl_item = 61; -pub const ALTMON_5: ::nl_item = 62; -pub const ALTMON_6: ::nl_item = 63; -pub const ALTMON_7: ::nl_item = 64; -pub const ALTMON_8: ::nl_item = 65; -pub const ALTMON_9: ::nl_item = 66; -pub const ALTMON_10: ::nl_item = 67; -pub const ALTMON_11: ::nl_item = 68; -pub const ALTMON_12: ::nl_item = 69; - -pub const KERN_RND: ::c_int = 31; - -extern { - pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t) -> ::c_int; - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs deleted file mode 100644 index b0d8128c0..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/mod.rs +++ /dev/null @@ -1,504 +0,0 @@ -pub type clock_t = i64; -pub type suseconds_t = ::c_long; -pub type dev_t = i32; -pub type sigset_t = ::c_uint; -pub type blksize_t = ::int32_t; -pub type fsblkcnt_t = ::uint64_t; -pub type fsfilcnt_t = ::uint64_t; -pub type pthread_attr_t = *mut ::c_void; -pub type pthread_mutex_t = *mut ::c_void; -pub type pthread_mutexattr_t = *mut ::c_void; -pub type pthread_cond_t = *mut ::c_void; -pub type pthread_condattr_t = *mut ::c_void; -pub type pthread_rwlock_t = *mut ::c_void; - -s! { - pub struct dirent { - pub d_fileno: ::ino_t, - pub d_off: ::off_t, - pub d_reclen: u16, - pub d_type: u8, - pub d_namlen: u8, - __d_padding: [u8; 4], - pub d_name: [::c_char; 256], - } - - pub struct glob_t { - pub gl_pathc: ::c_int, - pub gl_matchc: ::c_int, - pub gl_offs: ::c_int, - pub gl_flags: ::c_int, - pub gl_pathv: *mut *mut ::c_char, - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - } - - pub struct kevent { - pub ident: ::uintptr_t, - pub filter: ::c_short, - pub flags: ::c_ushort, - pub fflags: ::c_uint, - pub data: ::int64_t, - pub udata: *mut ::c_void, - } - - pub struct stat { - pub st_mode: ::mode_t, - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_size: ::off_t, - pub st_blocks: ::blkcnt_t, - pub st_blksize: ::blksize_t, - pub st_flags: ::uint32_t, - pub st_gen: ::uint32_t, - pub st_birthtime: ::time_t, - pub st_birthtime_nsec: ::c_long, - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_addr: *mut ::sockaddr, - pub ai_canonname: *mut ::c_char, - pub ai_next: *mut ::addrinfo, - } - - pub struct sockaddr_storage { - pub ss_len: u8, - pub ss_family: ::sa_family_t, - __ss_pad1: [u8; 6], - __ss_pad2: i64, - __ss_pad3: [u8; 240], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - pub si_addr: *mut ::c_char, - #[cfg(target_pointer_width = "32")] - __pad: [u8; 112], - #[cfg(target_pointer_width = "64")] - __pad: [u8; 108], - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct lastlog { - ll_time: ::time_t, - ll_line: [::c_char; UT_LINESIZE], - ll_host: [::c_char; UT_HOSTSIZE], - } - - pub struct utmp { - pub ut_line: [::c_char; UT_LINESIZE], - pub ut_name: [::c_char; UT_NAMESIZE], - pub ut_host: [::c_char; UT_HOSTSIZE], - pub ut_time: ::time_t, - } -} - -pub const UT_NAMESIZE: usize = 32; -pub const UT_LINESIZE: usize = 8; -pub const UT_HOSTSIZE: usize = 256; - -pub const O_CLOEXEC: ::c_int = 0x10000; - -pub const MS_SYNC : ::c_int = 0x0002; -pub const MS_INVALIDATE : ::c_int = 0x0004; - -pub const PTHREAD_STACK_MIN : ::size_t = 2048; - -pub const ENOATTR : ::c_int = 83; -pub const EILSEQ : ::c_int = 84; -pub const EOVERFLOW : ::c_int = 87; -pub const ECANCELED : ::c_int = 88; -pub const EIDRM : ::c_int = 89; -pub const ENOMSG : ::c_int = 90; -pub const ENOTSUP : ::c_int = 91; -pub const ELAST : ::c_int = 91; - -pub const F_DUPFD_CLOEXEC : ::c_int = 10; - -pub const AT_FDCWD: ::c_int = -100; -pub const AT_EACCESS: ::c_int = 0x01; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x02; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x04; -pub const AT_REMOVEDIR: ::c_int = 0x08; - -pub const RLIM_NLIMITS: ::c_int = 9; - -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_BINDANY: ::c_int = 0x1000; -pub const SO_NETPROC: ::c_int = 0x1020; -pub const SO_RTABLE: ::c_int = 0x1021; -pub const SO_PEERCRED: ::c_int = 0x1022; -pub const SO_SPLICE: ::c_int = 0x1023; - -pub const AF_ECMA: ::c_int = 8; -pub const AF_ROUTE: ::c_int = 17; -pub const AF_ENCAP: ::c_int = 28; -pub const AF_SIP: ::c_int = 29; -pub const AF_KEY: ::c_int = 30; -pub const pseudo_AF_HDRCMPLT: ::c_int = 31; -pub const AF_BLUETOOTH: ::c_int = 32; -pub const AF_MPLS: ::c_int = 33; -pub const pseudo_AF_PFLOW: ::c_int = 34; -pub const pseudo_AF_PIPEX: ::c_int = 35; -#[doc(hidden)] -pub const AF_MAX: ::c_int = 36; - -#[doc(hidden)] -pub const NET_MAXID: ::c_int = AF_MAX; -pub const NET_RT_DUMP: ::c_int = 1; -pub const NET_RT_FLAGS: ::c_int = 2; -pub const NET_RT_IFLIST: ::c_int = 3; -pub const NET_RT_STATS: ::c_int = 4; -pub const NET_RT_TABLE: ::c_int = 5; -pub const NET_RT_IFNAMES: ::c_int = 6; -#[doc(hidden)] -pub const NET_RT_MAXID: ::c_int = 7; - -pub const IPV6_JOIN_GROUP: ::c_int = 12; -pub const IPV6_LEAVE_GROUP: ::c_int = 13; - -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_ECMA: ::c_int = AF_ECMA; -pub const PF_ENCAP: ::c_int = AF_ENCAP; -pub const PF_SIP: ::c_int = AF_SIP; -pub const PF_KEY: ::c_int = AF_KEY; -pub const PF_BPF: ::c_int = pseudo_AF_HDRCMPLT; -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_MPLS: ::c_int = AF_MPLS; -pub const PF_PFLOW: ::c_int = pseudo_AF_PFLOW; -pub const PF_PIPEX: ::c_int = pseudo_AF_PIPEX; -#[doc(hidden)] -pub const PF_MAX: ::c_int = AF_MAX; - -pub const SCM_TIMESTAMP: ::c_int = 0x04; - -pub const O_DSYNC : ::c_int = 128; - -pub const MAP_RENAME : ::c_int = 0x0000; -pub const MAP_NORESERVE : ::c_int = 0x0000; -pub const MAP_HASSEMAPHORE : ::c_int = 0x0000; - -pub const EIPSEC : ::c_int = 82; -pub const ENOMEDIUM : ::c_int = 85; -pub const EMEDIUMTYPE : ::c_int = 86; - -pub const EAI_SYSTEM: ::c_int = -11; - -pub const RUSAGE_THREAD: ::c_int = 1; - -pub const MAP_COPY : ::c_int = 0x0002; -pub const MAP_NOEXTEND : ::c_int = 0x0000; - -pub const _SC_CLK_TCK : ::c_int = 3; -pub const _SC_IOV_MAX : ::c_int = 51; -pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 100; -pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 101; -pub const _SC_LOGIN_NAME_MAX : ::c_int = 102; -pub const _SC_MQ_PRIO_MAX : ::c_int = 59; -pub const _SC_NPROCESSORS_ONLN : ::c_int = 503; -pub const _SC_THREADS : ::c_int = 91; -pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 77; -pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 78; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 80; -pub const _SC_THREAD_KEYS_MAX : ::c_int = 81; -pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 82; -pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 83; -pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 84; -pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 85; -pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 103; -pub const _SC_THREAD_STACK_MIN : ::c_int = 89; -pub const _SC_THREAD_THREADS_MAX : ::c_int = 90; -pub const _SC_TTY_NAME_MAX : ::c_int = 107; -pub const _SC_ATEXIT_MAX : ::c_int = 46; -pub const _SC_AIO_LISTIO_MAX : ::c_int = 42; -pub const _SC_AIO_MAX : ::c_int = 43; -pub const _SC_ASYNCHRONOUS_IO : ::c_int = 45; -pub const _SC_MAPPED_FILES : ::c_int = 53; -pub const _SC_MEMLOCK : ::c_int = 54; -pub const _SC_MEMLOCK_RANGE : ::c_int = 55; -pub const _SC_MEMORY_PROTECTION : ::c_int = 56; -pub const _SC_MESSAGE_PASSING : ::c_int = 57; -pub const _SC_MQ_OPEN_MAX : ::c_int = 58; -pub const _SC_PRIORITY_SCHEDULING : ::c_int = 61; -pub const _SC_SEMAPHORES : ::c_int = 67; -pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 68; -pub const _SC_SYNCHRONIZED_IO : ::c_int = 75; -pub const _SC_TIMERS : ::c_int = 94; -pub const _SC_XOPEN_CRYPT : ::c_int = 117; -pub const _SC_XOPEN_ENH_I18N : ::c_int = 118; -pub const _SC_XOPEN_LEGACY : ::c_int = 119; -pub const _SC_XOPEN_REALTIME : ::c_int = 120; -pub const _SC_XOPEN_REALTIME_THREADS : ::c_int = 121; -pub const _SC_XOPEN_UNIX : ::c_int = 123; -pub const _SC_XOPEN_VERSION : ::c_int = 125; -pub const _SC_SEM_NSEMS_MAX : ::c_int = 31; -pub const _SC_SEM_VALUE_MAX : ::c_int = 32; -pub const _SC_AIO_PRIO_DELTA_MAX : ::c_int = 44; -pub const _SC_DELAYTIMER_MAX : ::c_int = 50; -pub const _SC_PRIORITIZED_IO : ::c_int = 60; -pub const _SC_REALTIME_SIGNALS : ::c_int = 64; -pub const _SC_RTSIG_MAX : ::c_int = 66; -pub const _SC_SIGQUEUE_MAX : ::c_int = 70; -pub const _SC_TIMER_MAX : ::c_int = 93; -pub const _SC_HOST_NAME_MAX : ::c_int = 33; - -pub const FD_SETSIZE: usize = 1024; - -pub const ST_NOSUID: ::c_ulong = 2; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; - -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; -pub const PTHREAD_MUTEX_STRICT_NP: ::c_int = 4; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_STRICT_NP; - -pub const EVFILT_AIO: ::int16_t = -3; -pub const EVFILT_PROC: ::int16_t = -5; -pub const EVFILT_READ: ::int16_t = -1; -pub const EVFILT_SIGNAL: ::int16_t = -6; -pub const EVFILT_TIMER: ::int16_t = -7; -pub const EVFILT_VNODE: ::int16_t = -4; -pub const EVFILT_WRITE: ::int16_t = -2; - -pub const EV_ADD: ::uint16_t = 0x1; -pub const EV_DELETE: ::uint16_t = 0x2; -pub const EV_ENABLE: ::uint16_t = 0x4; -pub const EV_DISABLE: ::uint16_t = 0x8; -pub const EV_ONESHOT: ::uint16_t = 0x10; -pub const EV_CLEAR: ::uint16_t = 0x20; -pub const EV_FLAG1: ::uint16_t = 0x2000; -pub const EV_ERROR: ::uint16_t = 0x4000; -pub const EV_EOF: ::uint16_t = 0x8000; -pub const EV_SYSFLAGS: ::uint16_t = 0xf000; - -pub const NOTE_LOWAT: ::uint32_t = 0x00000001; -pub const NOTE_EOF: ::uint32_t = 0x00000002; -pub const NOTE_DELETE: ::uint32_t = 0x00000001; -pub const NOTE_WRITE: ::uint32_t = 0x00000002; -pub const NOTE_EXTEND: ::uint32_t = 0x00000004; -pub const NOTE_ATTRIB: ::uint32_t = 0x00000008; -pub const NOTE_LINK: ::uint32_t = 0x00000010; -pub const NOTE_RENAME: ::uint32_t = 0x00000020; -pub const NOTE_REVOKE: ::uint32_t = 0x00000040; -pub const NOTE_TRUNCATE: ::uint32_t = 0x00000080; -pub const NOTE_EXIT: ::uint32_t = 0x80000000; -pub const NOTE_FORK: ::uint32_t = 0x40000000; -pub const NOTE_EXEC: ::uint32_t = 0x20000000; -pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff; -pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000; -pub const NOTE_TRACK: ::uint32_t = 0x00000001; -pub const NOTE_TRACKERR: ::uint32_t = 0x00000002; -pub const NOTE_CHILD: ::uint32_t = 0x00000004; - -pub const TMP_MAX : ::c_uint = 0x7fffffff; - -pub const NI_MAXHOST: ::size_t = 256; - -pub const RTLD_LOCAL: ::c_int = 0; -pub const CTL_MAXNAME: ::c_int = 12; -pub const CTLTYPE_NODE: ::c_int = 1; -pub const CTLTYPE_INT: ::c_int = 2; -pub const CTLTYPE_STRING: ::c_int = 3; -pub const CTLTYPE_QUAD: ::c_int = 4; -pub const CTLTYPE_STRUCT: ::c_int = 5; -pub const CTL_UNSPEC: ::c_int = 0; -pub const CTL_KERN: ::c_int = 1; -pub const CTL_VM: ::c_int = 2; -pub const CTL_FS: ::c_int = 3; -pub const CTL_NET: ::c_int = 4; -pub const CTL_DEBUG: ::c_int = 5; -pub const CTL_HW: ::c_int = 6; -pub const CTL_MACHDEP: ::c_int = 7; -pub const CTL_DDB: ::c_int = 9; -pub const CTL_VFS: ::c_int = 10; -pub const CTL_MAXID: ::c_int = 11; -pub const KERN_OSTYPE: ::c_int = 1; -pub const KERN_OSRELEASE: ::c_int = 2; -pub const KERN_OSREV: ::c_int = 3; -pub const KERN_VERSION: ::c_int = 4; -pub const KERN_MAXVNODES: ::c_int = 5; -pub const KERN_MAXPROC: ::c_int = 6; -pub const KERN_MAXFILES: ::c_int = 7; -pub const KERN_ARGMAX: ::c_int = 8; -pub const KERN_SECURELVL: ::c_int = 9; -pub const KERN_HOSTNAME: ::c_int = 10; -pub const KERN_HOSTID: ::c_int = 11; -pub const KERN_CLOCKRATE: ::c_int = 12; -pub const KERN_PROF: ::c_int = 16; -pub const KERN_POSIX1: ::c_int = 17; -pub const KERN_NGROUPS: ::c_int = 18; -pub const KERN_JOB_CONTROL: ::c_int = 19; -pub const KERN_SAVED_IDS: ::c_int = 20; -pub const KERN_BOOTTIME: ::c_int = 21; -pub const KERN_DOMAINNAME: ::c_int = 22; -pub const KERN_MAXPARTITIONS: ::c_int = 23; -pub const KERN_RAWPARTITION: ::c_int = 24; -pub const KERN_MAXTHREAD: ::c_int = 25; -pub const KERN_NTHREADS: ::c_int = 26; -pub const KERN_OSVERSION: ::c_int = 27; -pub const KERN_SOMAXCONN: ::c_int = 28; -pub const KERN_SOMINCONN: ::c_int = 29; -pub const KERN_USERMOUNT: ::c_int = 30; -pub const KERN_NOSUIDCOREDUMP: ::c_int = 32; -pub const KERN_FSYNC: ::c_int = 33; -pub const KERN_SYSVMSG: ::c_int = 34; -pub const KERN_SYSVSEM: ::c_int = 35; -pub const KERN_SYSVSHM: ::c_int = 36; -pub const KERN_ARND: ::c_int = 37; -pub const KERN_MSGBUFSIZE: ::c_int = 38; -pub const KERN_MALLOCSTATS: ::c_int = 39; -pub const KERN_CPTIME: ::c_int = 40; -pub const KERN_NCHSTATS: ::c_int = 41; -pub const KERN_FORKSTAT: ::c_int = 42; -pub const KERN_NSELCOLL: ::c_int = 43; -pub const KERN_TTY: ::c_int = 44; -pub const KERN_CCPU: ::c_int = 45; -pub const KERN_FSCALE: ::c_int = 46; -pub const KERN_NPROCS: ::c_int = 47; -pub const KERN_MSGBUF: ::c_int = 48; -pub const KERN_POOL: ::c_int = 49; -pub const KERN_STACKGAPRANDOM: ::c_int = 50; -pub const KERN_SYSVIPC_INFO: ::c_int = 51; -pub const KERN_SPLASSERT: ::c_int = 54; -pub const KERN_PROC_ARGS: ::c_int = 55; -pub const KERN_NFILES: ::c_int = 56; -pub const KERN_TTYCOUNT: ::c_int = 57; -pub const KERN_NUMVNODES: ::c_int = 58; -pub const KERN_MBSTAT: ::c_int = 59; -pub const KERN_SEMINFO: ::c_int = 61; -pub const KERN_SHMINFO: ::c_int = 62; -pub const KERN_INTRCNT: ::c_int = 63; -pub const KERN_WATCHDOG: ::c_int = 64; -pub const KERN_PROC: ::c_int = 66; -pub const KERN_MAXCLUSTERS: ::c_int = 67; -pub const KERN_EVCOUNT: ::c_int = 68; -pub const KERN_TIMECOUNTER: ::c_int = 69; -pub const KERN_MAXLOCKSPERUID: ::c_int = 70; -pub const KERN_CPTIME2: ::c_int = 71; -pub const KERN_CACHEPCT: ::c_int = 72; -pub const KERN_FILE: ::c_int = 73; -pub const KERN_CONSDEV: ::c_int = 75; -pub const KERN_NETLIVELOCKS: ::c_int = 76; -pub const KERN_POOL_DEBUG: ::c_int = 77; -pub const KERN_PROC_CWD: ::c_int = 78; -pub const KERN_PROC_NOBROADCASTKILL: ::c_int = 79; -pub const KERN_PROC_VMMAP: ::c_int = 80; -pub const KERN_GLOBAL_PTRACE: ::c_int = 81; -pub const KERN_CONSBUFSIZE: ::c_int = 82; -pub const KERN_CONSBUF: ::c_int = 83; -pub const KERN_MAXID: ::c_int = 84; -pub const KERN_PROC_ALL: ::c_int = 0; -pub const KERN_PROC_PID: ::c_int = 1; -pub const KERN_PROC_PGRP: ::c_int = 2; -pub const KERN_PROC_SESSION: ::c_int = 3; -pub const KERN_PROC_TTY: ::c_int = 4; -pub const KERN_PROC_UID: ::c_int = 5; -pub const KERN_PROC_RUID: ::c_int = 6; -pub const KERN_PROC_KTHREAD: ::c_int = 7; -pub const KERN_PROC_SHOW_THREADS: ::c_int = 0x40000000; -pub const KERN_SYSVIPC_MSG_INFO: ::c_int = 1; -pub const KERN_SYSVIPC_SEM_INFO: ::c_int = 2; -pub const KERN_SYSVIPC_SHM_INFO: ::c_int = 3; -pub const KERN_PROC_ARGV: ::c_int = 1; -pub const KERN_PROC_NARGV: ::c_int = 2; -pub const KERN_PROC_ENV: ::c_int = 3; -pub const KERN_PROC_NENV: ::c_int = 4; -pub const KI_NGROUPS: ::c_int = 16; -pub const KI_MAXCOMLEN: ::c_int = 24; -pub const KI_WMESGLEN: ::c_int = 8; -pub const KI_MAXLOGNAME: ::c_int = 32; -pub const KI_EMULNAMELEN: ::c_int = 8; - -extern { - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::size_t, - serv: *mut ::c_char, - servlen: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn kevent(kq: ::c_int, - changelist: *const ::kevent, - nchanges: ::c_int, - eventlist: *mut ::kevent, - nevents: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn pthread_main_np() -> ::c_int; - pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); - pub fn pthread_stackseg_np(thread: ::pthread_t, - sinfo: *mut ::stack_t) -> ::c_int; - pub fn sysctl(name: *const ::c_int, - namelen: ::c_uint, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; - pub fn pledge(promises: *const ::c_char, - paths: *mut *const ::c_char) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_os = "openbsd")] { - mod openbsd; - pub use self::openbsd::*; - } else if #[cfg(target_os = "bitrig")] { - mod bitrig; - pub use self::bitrig::*; - } else { - // Unknown target_os - } -} - -mod other; -pub use self::other::*; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs deleted file mode 100644 index 8b36ee5ce..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs +++ /dev/null @@ -1,33 +0,0 @@ -s! { - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } -} - -extern { - pub fn accept4(s: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs deleted file mode 100644 index 9b0b338b9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs deleted file mode 100644 index b07c476aa..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_long = i64; -pub type c_ulong = u64; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs deleted file mode 100644 index e4087da7b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -cfg_if! { - if #[cfg(target_arch = "x86_64")] { - mod b64; - pub use self::b64::*; - } else if #[cfg(target_arch = "x86")] { - mod b32; - pub use self::b32::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs deleted file mode 100644 index 9b0b338b9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b32.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs deleted file mode 100644 index 5d63ce9ce..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/b64.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub type c_ulong = u64; -pub type c_long = i64; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs deleted file mode 100644 index 829c2258b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/haiku/mod.rs +++ /dev/null @@ -1,817 +0,0 @@ -use dox::{mem, Option}; - -pub type rlim_t = ::uintptr_t; -pub type sa_family_t = u8; -pub type pthread_key_t = ::c_int; -pub type nfds_t = ::c_long; -pub type tcflag_t = ::c_uint; -pub type speed_t = ::c_uint; -pub type c_char = i8; -pub type clock_t = i32; -pub type clockid_t = i32; -pub type time_t = i32; -pub type suseconds_t = i32; -pub type wchar_t = i32; -pub type off_t = i64; -pub type ino_t = i64; -pub type blkcnt_t = i64; -pub type blksize_t = i32; -pub type dev_t = i32; -pub type mode_t = u32; -pub type nlink_t = i32; -pub type useconds_t = u32; -pub type socklen_t = u32; -pub type pthread_t = ::uintptr_t; -pub type pthread_mutexattr_t = ::uintptr_t; -pub type sigset_t = u64; -pub type fsblkcnt_t = i64; -pub type fsfilcnt_t = i64; -pub type pthread_attr_t = *mut ::c_void; -pub type nl_item = ::c_int; -pub type id_t = i32; -pub type idtype_t = ::c_uint; - -pub enum timezone {} - -s! { - pub struct sockaddr { - pub sa_len: u8, - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 30], - } - - pub struct sockaddr_in { - pub sin_len: u8, - pub sin_family: sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [u8; 24], - } - - pub struct sockaddr_in6 { - pub sin6_len: u8, - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct sockaddr_un { - pub sun_len: u8, - pub sun_family: sa_family_t, - pub sun_path: [::c_char; 126] - } - - pub struct sockaddr_storage { - pub ss_len: u8, - pub ss_family: sa_family_t, - __ss_pad1: [u8; 6], - __ss_pad2: u64, - __ss_pad3: [u8; 112], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: socklen_t, - pub ai_canonname: *mut c_char, - pub ai_addr: *mut ::sockaddr, - pub ai_next: *mut addrinfo, - } - - pub struct fd_set { - fds_bits: [c_ulong; FD_SETSIZE / ULONG_SIZE], - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *const ::c_char, - } - - pub struct utsname { - pub sysname: [::c_char; 32], - pub nodename: [::c_char; 32], - pub release: [::c_char; 32], - pub version: [::c_char; 32], - pub machine: [::c_char; 32], - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::c_char, - pub c_ispeed: ::speed_t, - pub c_ospeed: ::speed_t, - pub c_cc: [::cc_t; ::NCCS], - } - - pub struct stat { - pub st_dev: dev_t, - pub st_ino: ino_t, - pub st_mode: mode_t, - pub st_nlink: nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_size: off_t, - pub st_rdev: dev_t, - pub st_blksize: blksize_t, - pub st_atime: time_t, - pub st_atime_nsec: c_long, - pub st_mtime: time_t, - pub st_mtime_nsec: c_long, - pub st_ctime: time_t, - pub st_ctime_nsec: c_long, - pub st_crtime: time_t, - pub st_crtime_nsec: c_long, - pub st_type: u32, - pub st_blocks: blkcnt_t, - } - - pub struct dirent { - pub d_dev: dev_t, - pub d_pdev: dev_t, - pub d_ino: ino_t, - pub d_pino: i64, - pub d_reclen: ::c_ushort, - pub d_name: [::c_char; 1024], // Max length is _POSIX_PATH_MAX - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - __unused1: ::size_t, - pub gl_offs: ::size_t, - __unused2: ::size_t, - pub gl_pathv: *mut *mut c_char, - - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - __unused8: *mut ::c_void, - } - - pub struct pthread_mutex_t { - flags: u32, - lock: i32, - unused: i32, - owner: i32, - owner_count: i32, - } - - pub struct pthread_cond_t { - flags: u32, - unused: i32, - mutex: *mut ::c_void, - waiter_count: i32, - lock: i32, - } - - pub struct pthread_rwlock_t { - flags: u32, - owner: i32, - lock_sem: i32, // this is actually a union - lock_count: i32, - reader_count: i32, - writer_count: i32, - waiters: [*mut ::c_void; 2], - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - pub pw_gecos: *mut ::c_char, - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - pub si_pid: ::pid_t, - pub si_uid: ::uid_t, - pub si_addr: *mut ::c_void, - pub si_status: ::c_int, - pub si_band: c_long, - pub sigval: *mut ::c_void, - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - pub sa_flags: ::c_int, - sa_userdata: *mut ::c_void, - } - - pub struct sem_t { - pub se_type: i32, - pub se_named_id: i32, // this is actually a union - pub se_unnamed: i32, - pub se_padding: [i32; 4], - } - - pub struct pthread_condattr_t { - pub process_shared: bool, - pub clock_id: i32, - } -} - -// intentionally not public, only used for fd_set -cfg_if! { - if #[cfg(target_pointer_width = "32")] { - const ULONG_SIZE: usize = 32; - } else if #[cfg(target_pointer_width = "64")] { - const ULONG_SIZE: usize = 64; - } else { - // Unknown target_pointer_width - } -} - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 2147483647; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 2; -pub const _IOLBF: ::c_int = 1; - -pub const F_DUPFD: ::c_int = 0x0001; -pub const F_GETFD: ::c_int = 0x0002; -pub const F_SETFD: ::c_int = 0x0004; -pub const F_GETFL: ::c_int = 0x0008; -pub const F_SETFL: ::c_int = 0x0010; - -pub const SIGTRAP: ::c_int = 22; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; - -pub const CLOCK_REALTIME: ::c_int = -1; -pub const CLOCK_MONOTONIC: ::c_int = 0; - -pub const RLIMIT_CORE: ::c_int = 0; -pub const RLIMIT_CPU: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_FSIZE: ::c_int = 3; -pub const RLIMIT_NOFILE: ::c_int = 4; -pub const RLIMIT_AS: ::c_int = 6; -// Haiku specific -pub const RLIMIT_NOVMON: ::c_int = 7; -pub const RLIMIT_NLIMITS: ::c_int = 8; - -pub const RUSAGE_SELF: ::c_int = 0; - -pub const NCCS: usize = 11; - -pub const O_RDONLY: ::c_int = 0x0000; -pub const O_WRONLY: ::c_int = 0x0001; -pub const O_RDWR: ::c_int = 0x0002; -pub const O_ACCMODE: ::c_int = 0x0003; - -pub const O_EXCL: ::c_int = 0x0100; -pub const O_CREAT: ::c_int = 0x0200; -pub const O_TRUNC: ::c_int = 0x0400; -pub const O_NOCTTY: ::c_int = 0x1000; -pub const O_NOTRAVERSE: ::c_int = 0x2000; - -pub const O_CLOEXEC: ::c_int = 0x00000040; -pub const O_NONBLOCK: ::c_int = 0x00000080; -pub const O_APPEND: ::c_int = 0x00000800; -pub const O_SYNC: ::c_int = 0x00010000; -pub const O_RSYNC: ::c_int = 0x00020000; -pub const O_DSYNC: ::c_int = 0x00040000; -pub const O_NOFOLLOW: ::c_int = 0x00080000; -pub const O_NOCACHE: ::c_int = 0x00100000; -pub const O_DIRECTORY: ::c_int = 0x00200000; - -pub const S_IFIFO: ::mode_t = 61440; -pub const S_IFCHR: ::mode_t = 49152; -pub const S_IFBLK: ::mode_t = 24576; -pub const S_IFDIR: ::mode_t = 16384; -pub const S_IFREG: ::mode_t = 32768; -pub const S_IFLNK: ::mode_t = 40960; -pub const S_IFSOCK: ::mode_t = 49152; -pub const S_IFMT: ::mode_t = 61440; -pub const S_IRWXU: ::mode_t = 448; -pub const S_IXUSR: ::mode_t = 64; -pub const S_IWUSR: ::mode_t = 128; -pub const S_IRUSR: ::mode_t = 256; -pub const S_IRWXG: ::mode_t = 70; -pub const S_IXGRP: ::mode_t = 10; -pub const S_IWGRP: ::mode_t = 20; -pub const S_IRGRP: ::mode_t = 40; -pub const S_IRWXO: ::mode_t = 7; -pub const S_IXOTH: ::mode_t = 1; -pub const S_IWOTH: ::mode_t = 2; -pub const S_IROTH: ::mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGPIPE: ::c_int = 7; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const LC_ALL: ::c_int = 0; -pub const LC_COLLATE: ::c_int = 1; -pub const LC_CTYPE: ::c_int = 2; -pub const LC_MONETARY: ::c_int = 3; -pub const LC_NUMERIC: ::c_int = 4; -pub const LC_TIME: ::c_int = 5; -pub const LC_MESSAGES: ::c_int = 6; - -// TODO: Haiku does not have MAP_FILE, but libstd/os.rs requires it -pub const MAP_FILE: ::c_int = 0x00; -pub const MAP_SHARED: ::c_int = 0x01; -pub const MAP_PRIVATE: ::c_int = 0x02; -pub const MAP_FIXED: ::c_int = 0x004; - -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -pub const MS_ASYNC: ::c_int = 0x01; -pub const MS_INVALIDATE: ::c_int = 0x04; -pub const MS_SYNC: ::c_int = 0x02; - -pub const EPERM : ::c_int = -2147483633; -pub const ENOENT : ::c_int = -2147459069; -pub const ESRCH : ::c_int = -2147454963; -pub const EINTR : ::c_int = -2147483638; -pub const EIO : ::c_int = -2147483647; -pub const ENXIO : ::c_int = -2147454965; -pub const E2BIG : ::c_int = -2147454975; -pub const ENOEXEC : ::c_int = -2147478782; -pub const EBADF : ::c_int = -2147459072; -pub const ECHILD : ::c_int = -2147454974; -pub const EDEADLK : ::c_int = -2147454973; -pub const ENOMEM : ::c_int = -2147454976; -pub const EACCES : ::c_int = -2147483646; -pub const EFAULT : ::c_int = -2147478783; -// pub const ENOTBLK : ::c_int = 15; -pub const EBUSY : ::c_int = -2147483634; -pub const EEXIST : ::c_int = -2147459070; -pub const EXDEV : ::c_int = -2147459061; -pub const ENODEV : ::c_int = -2147454969; -pub const ENOTDIR : ::c_int = -2147459067; -pub const EISDIR : ::c_int = -2147459063; -pub const EINVAL : ::c_int = -2147483643; -pub const ENFILE : ::c_int = -2147454970; -pub const EMFILE : ::c_int = -2147459062; -pub const ENOTTY : ::c_int = -2147454966; -pub const ETXTBSY : ::c_int = -2147454917; -pub const EFBIG : ::c_int = -2147454972; -pub const ENOSPC : ::c_int = -2147459065; -pub const ESPIPE : ::c_int = -2147454964; -pub const EROFS : ::c_int = -2147459064; -pub const EMLINK : ::c_int = -2147454971; -pub const EPIPE : ::c_int = -2147459059; -pub const EDOM : ::c_int = -2147454960; -pub const ERANGE : ::c_int = -2147454959; -pub const EAGAIN : ::c_int = -2147483637; -pub const EWOULDBLOCK : ::c_int = -2147483637; - -pub const EINPROGRESS : ::c_int = -2147454940; -pub const EALREADY : ::c_int = -2147454939; -pub const ENOTSOCK : ::c_int = -2147454932; -pub const EDESTADDRREQ : ::c_int = -2147454928; -pub const EMSGSIZE : ::c_int = -2147454934; -pub const EPROTOTYPE : ::c_int = -2147454958; -pub const ENOPROTOOPT : ::c_int = -2147454942; -pub const EPROTONOSUPPORT : ::c_int = -2147454957; -pub const EOPNOTSUPP : ::c_int = -2147454933; -pub const EPFNOSUPPORT : ::c_int = -2147454956; -pub const EAFNOSUPPORT : ::c_int = -2147454955; -pub const EADDRINUSE : ::c_int = -2147454954; -pub const EADDRNOTAVAIL : ::c_int = -2147454953; -pub const ENETDOWN : ::c_int = -2147454953; -pub const ENETUNREACH : ::c_int = -2147454951; -pub const ENETRESET : ::c_int = -2147454950; -pub const ECONNABORTED : ::c_int = -2147454949; -pub const ECONNRESET : ::c_int = -2147454948; -pub const ENOBUFS : ::c_int = -2147454941; -pub const EISCONN : ::c_int = -2147454947; -pub const ENOTCONN : ::c_int = -2147454946; -pub const ESHUTDOWN : ::c_int = -2147454945; -pub const ETIMEDOUT : ::c_int = -2147483639; -pub const ECONNREFUSED : ::c_int = -2147454944; -pub const ELOOP : ::c_int = -2147459060; -pub const ENAMETOOLONG : ::c_int = -2147459068; -pub const EHOSTDOWN : ::c_int = -2147454931; -pub const EHOSTUNREACH : ::c_int = -2147454943; -pub const ENOTEMPTY : ::c_int = -2147459066; -pub const EDQUOT : ::c_int = -2147454927; -pub const ESTALE : ::c_int = -2147454936; -pub const ENOLCK : ::c_int = -2147454968; -pub const ENOSYS : ::c_int = -2147454967; -pub const EIDRM : ::c_int = -2147454926; -pub const ENOMSG : ::c_int = -2147454937; -pub const EOVERFLOW : ::c_int = -2147454935; -pub const ECANCELED : ::c_int = -2147454929; -pub const EILSEQ : ::c_int = -2147454938; -pub const ENOATTR : ::c_int = -2147454916; -pub const EBADMSG : ::c_int = -2147454930; -pub const EMULTIHOP : ::c_int = -2147454925; -pub const ENOLINK : ::c_int = -2147454923; -pub const EPROTO : ::c_int = -2147454919; - -pub const IPPROTO_RAW: ::c_int = 255; - -// These are prefixed with POSIX_ on Haiku -pub const MADV_NORMAL: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_RANDOM: ::c_int = 3; -pub const MADV_WILLNEED: ::c_int = 4; -pub const MADV_DONTNEED: ::c_int = 5; - -pub const IFF_LOOPBACK: ::c_int = 0x0008; - -pub const AF_UNIX: ::c_int = 9; -pub const AF_INET: ::c_int = 1; -pub const AF_INET6: ::c_int = 6; -pub const SOCK_RAW: ::c_int = 3; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 10; -pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_TTL: ::c_int = 4; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_ADD_MEMBERSHIP: ::c_int = 12; -pub const IP_DROP_MEMBERSHIP: ::c_int = 13; - -pub const TCP_NODELAY: ::c_int = 0x01; -pub const TCP_MAXSEG: ::c_int = 0x02; -pub const TCP_NOPUSH: ::c_int = 0x04; -pub const TCP_NOOPT: ::c_int = 0x08; - -pub const IPV6_MULTICAST_LOOP: ::c_int = 26; -pub const IPV6_JOIN_GROUP: ::c_int = 28; -pub const IPV6_LEAVE_GROUP: ::c_int = 29; -pub const IPV6_V6ONLY: ::c_int = 30; - -pub const SO_DEBUG: ::c_int = 0x00000004; - -pub const MSG_PEEK: ::c_int = 0x2; -pub const MSG_NOSIGNAL: ::c_int = 0x0800; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 0x01; -pub const LOCK_EX: ::c_int = 0x02; -pub const LOCK_NB: ::c_int = 0x04; -pub const LOCK_UN: ::c_int = 0x08; - -pub const SIGSTKSZ: ::size_t = 16384; - -pub const SA_NODEFER: ::c_int = 0x08; -pub const SA_RESETHAND: ::c_int = 0x04; -pub const SA_RESTART: ::c_int = 0x10; -pub const SA_NOCLDSTOP: ::c_int = 0x01; - -pub const FD_SETSIZE: usize = 1024; - -pub const RTLD_NOW: ::c_int = 0x1; -pub const RTLD_DEFAULT: *mut ::c_void = 0isize as *mut ::c_void; - -pub const BUFSIZ: ::c_uint = 8192; -pub const FILENAME_MAX: ::c_uint = 256; -pub const FOPEN_MAX: ::c_uint = 128; -pub const L_tmpnam: ::c_uint = 512; -pub const TMP_MAX: ::c_uint = 32768; -pub const _PC_NAME_MAX: ::c_int = 4; - -pub const FIONBIO: ::c_int = 0xbe000000; - -pub const _SC_IOV_MAX : ::c_int = 32; -pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 25; -pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 26; -pub const _SC_PAGESIZE : ::c_int = 27; -pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 48; -pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 49; -pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 50; -pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 46; -pub const _SC_THREAD_STACK_MIN : ::c_int = 47; -pub const _SC_THREADS : ::c_int = 31; -pub const _SC_ATEXIT_MAX : ::c_int = 37; - -pub const PTHREAD_STACK_MIN: ::size_t = 8192; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - flags: 0, - lock: 0, - unused: -42, - owner: -1, - owner_count: 0, -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - flags: 0, - unused: -42, - mutex: 0 as *mut _, - waiter_count: 0, - lock: 0, -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - flags: 0, - owner: 0, - lock_sem: 0, - lock_count: 0, - reader_count: 0, - writer_count: 0, - waiters: [0 as *mut _; 2], -}; - -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = 0; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 1; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 3; - -pub const FIOCLEX: c_ulong = 0; // TODO: does not exist on Haiku! - -pub const SA_ONSTACK: c_ulong = 0x20; -pub const SA_SIGINFO: c_ulong = 0x40; -pub const SA_NOCLDWAIT: c_ulong = 0x02; - -pub const SIGCHLD: ::c_int = 5; -pub const SIGBUS: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 3; - -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; - -pub const SOL_SOCKET: ::c_int = -1; -pub const SO_ACCEPTCONN: ::c_int = 0x00000001; -pub const SO_BROADCAST: ::c_int = 0x00000002; -pub const SO_DONTROUTE: ::c_int = 0x00000008; -pub const SO_KEEPALIVE: ::c_int = 0x00000010; -pub const SO_OOBINLINE: ::c_int = 0x00000020; -pub const SO_REUSEADDR: ::c_int = 0x00000040; -pub const SO_REUSEPORT: ::c_int = 0x00000080; -pub const SO_USELOOPBACK: ::c_int = 0x00000100; -pub const SO_LINGER: ::c_int = 0x00000200; -pub const SO_SNDBUF: ::c_int = 0x40000001; -pub const SO_SNDLOWAT: ::c_int = 0x40000002; -pub const SO_SNDTIMEO: ::c_int = 0x40000003; -pub const SO_RCVBUF: ::c_int = 0x40000004; -pub const SO_RCVLOWAT: ::c_int = 0x40000005; -pub const SO_RCVTIMEO: ::c_int = 0x40000006; -pub const SO_ERROR: ::c_int = 0x40000007; -pub const SO_TYPE: ::c_int = 0x40000008; -pub const SO_NONBLOCK: ::c_int = 0x40000009; -pub const SO_BINDTODEVICE: ::c_int = 0x4000000a; -pub const SO_PEERCRED: ::c_int = 0x4000000b; - -pub const NI_MAXHOST: ::size_t = 1025; - -pub const WNOHANG: ::c_int = 0x01; -pub const WUNTRACED: ::c_int = 0x02; -pub const WCONTINUED: ::c_int = 0x04; -pub const WEXITED: ::c_int = 0x08; -pub const WSTOPPED: ::c_int = 0x10; -pub const WNOWAIT: ::c_int = 0x20; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 2; - -f! { - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] &= !(1 << (fd % size)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] |= 1 << (fd % size); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } - - pub fn WIFEXITED(status: ::c_int) -> bool { - (status >> 8) == 0 - } - - pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { - (status & 0xff) - } - - pub fn WTERMSIG(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } -} - -extern { - pub fn clock_gettime(clk_id: ::c_int, tp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: ::c_int, tp: *const ::timespec) -> ::c_int; - pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, - guardsize: *mut ::size_t) -> ::c_int; - pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, - stackaddr: *mut *mut ::c_void, - stacksize: *mut ::size_t) -> ::c_int; - pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, - clock_id: *mut clockid_t) -> ::c_int; - pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, - clock_id: clockid_t) -> ::c_int; - pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; - pub fn setgroups(ngroups: ::size_t, - ptr: *const ::gid_t) -> ::c_int; - pub fn getpwuid_r(uid: ::uid_t, - pwd: *mut passwd, - buffer: *mut ::c_char, - bufferSize: ::size_t, - result: *mut *mut passwd) -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; - pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::size_t, - serv: *mut ::c_char, - sevlen: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, - options: ::c_int) -> ::c_int; - - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; - pub fn glob(pattern: *const ::c_char, - flags: ::c_int, - errfunc: Option ::c_int>, - pglob: *mut ::glob_t) -> ::c_int; - pub fn globfree(pglob: *mut ::glob_t); - - pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn shm_unlink(name: *const ::c_char) -> ::c_int; - - pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); - - pub fn telldir(dirp: *mut ::DIR) -> ::c_long; - pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; - - pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t) -> ::ssize_t; - pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; - pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; - - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: ::socklen_t) -> ::c_int; - - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::ssize_t; - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) - -> ::ssize_t; -} - -cfg_if! { - if #[cfg(target_pointer_width = "64")] { - mod b64; - pub use self::b64::*; - } else { - mod b32; - pub use self::b32::*; - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs deleted file mode 100644 index 7ebf0d9e0..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/mod.rs +++ /dev/null @@ -1,873 +0,0 @@ -//! Definitions found commonly among almost all Unix derivatives -//! -//! More functions and definitions can be found in the more specific modules -//! according to the platform in question. - -use dox::Option; - -pub type pid_t = i32; -pub type uid_t = u32; -pub type gid_t = u32; -pub type in_addr_t = u32; -pub type in_port_t = u16; -pub type sighandler_t = ::size_t; -pub type cc_t = ::c_uchar; - -pub enum DIR {} -pub enum locale_t {} - -s! { - pub struct group { - pub gr_name: *mut ::c_char, - pub gr_passwd: *mut ::c_char, - pub gr_gid: ::gid_t, - pub gr_mem: *mut *mut ::c_char, - } - - pub struct utimbuf { - pub actime: time_t, - pub modtime: time_t, - } - - pub struct timeval { - pub tv_sec: time_t, - pub tv_usec: suseconds_t, - } - - pub struct timespec { - pub tv_sec: time_t, - pub tv_nsec: c_long, - } - - pub struct rlimit { - pub rlim_cur: rlim_t, - pub rlim_max: rlim_t, - } - - pub struct rusage { - pub ru_utime: timeval, - pub ru_stime: timeval, - pub ru_maxrss: c_long, - pub ru_ixrss: c_long, - pub ru_idrss: c_long, - pub ru_isrss: c_long, - pub ru_minflt: c_long, - pub ru_majflt: c_long, - pub ru_nswap: c_long, - pub ru_inblock: c_long, - pub ru_oublock: c_long, - pub ru_msgsnd: c_long, - pub ru_msgrcv: c_long, - pub ru_nsignals: c_long, - pub ru_nvcsw: c_long, - pub ru_nivcsw: c_long, - - #[cfg(any(target_env = "musl"))] - __reserved: [c_long; 16], - } - - #[cfg_attr(target_os = "netbsd", repr(packed))] - pub struct in_addr { - pub s_addr: in_addr_t, - } - - pub struct in6_addr { - pub s6_addr: [u8; 16], - __align: [u32; 0], - } - - pub struct ip_mreq { - pub imr_multiaddr: in_addr, - pub imr_interface: in_addr, - } - - pub struct ipv6_mreq { - pub ipv6mr_multiaddr: in6_addr, - #[cfg(target_os = "android")] - pub ipv6mr_interface: ::c_int, - #[cfg(not(target_os = "android"))] - pub ipv6mr_interface: ::c_uint, - } - - pub struct hostent { - pub h_name: *mut ::c_char, - pub h_aliases: *mut *mut ::c_char, - pub h_addrtype: ::c_int, - pub h_length: ::c_int, - pub h_addr_list: *mut *mut ::c_char, - } - - pub struct iovec { - pub iov_base: *mut ::c_void, - pub iov_len: ::size_t, - } - - pub struct pollfd { - pub fd: ::c_int, - pub events: ::c_short, - pub revents: ::c_short, - } - - pub struct winsize { - pub ws_row: ::c_ushort, - pub ws_col: ::c_ushort, - pub ws_xpixel: ::c_ushort, - pub ws_ypixel: ::c_ushort, - } - - pub struct linger { - pub l_onoff: ::c_int, - pub l_linger: ::c_int, - } - - pub struct sigval { - // Actually a union of an int and a void* - pub sival_ptr: *mut ::c_void - } -} - -pub const SIG_DFL: sighandler_t = 0 as sighandler_t; -pub const SIG_IGN: sighandler_t = 1 as sighandler_t; -pub const SIG_ERR: sighandler_t = !0 as sighandler_t; - -pub const DT_FIFO: u8 = 1; -pub const DT_CHR: u8 = 2; -pub const DT_DIR: u8 = 4; -pub const DT_BLK: u8 = 6; -pub const DT_REG: u8 = 8; -pub const DT_LNK: u8 = 10; -pub const DT_SOCK: u8 = 12; - -pub const FD_CLOEXEC: ::c_int = 0x1; - -pub const USRQUOTA: ::c_int = 0; -pub const GRPQUOTA: ::c_int = 1; - -pub const SIGIOT: ::c_int = 6; - -pub const S_ISUID: ::c_int = 0x800; -pub const S_ISGID: ::c_int = 0x400; -pub const S_ISVTX: ::c_int = 0x200; - -pub const POLLIN: ::c_short = 0x1; -pub const POLLPRI: ::c_short = 0x2; -pub const POLLOUT: ::c_short = 0x4; -pub const POLLERR: ::c_short = 0x8; -pub const POLLHUP: ::c_short = 0x10; -pub const POLLNVAL: ::c_short = 0x20; - -pub const IF_NAMESIZE: ::size_t = 16; - -pub const RTLD_LAZY: ::c_int = 0x1; - -pub const LOG_EMERG: ::c_int = 0; -pub const LOG_ALERT: ::c_int = 1; -pub const LOG_CRIT: ::c_int = 2; -pub const LOG_ERR: ::c_int = 3; -pub const LOG_WARNING: ::c_int = 4; -pub const LOG_NOTICE: ::c_int = 5; -pub const LOG_INFO: ::c_int = 6; -pub const LOG_DEBUG: ::c_int = 7; - -pub const LOG_KERN: ::c_int = 0; -pub const LOG_USER: ::c_int = 1 << 3; -pub const LOG_MAIL: ::c_int = 2 << 3; -pub const LOG_DAEMON: ::c_int = 3 << 3; -pub const LOG_AUTH: ::c_int = 4 << 3; -pub const LOG_SYSLOG: ::c_int = 5 << 3; -pub const LOG_LPR: ::c_int = 6 << 3; -pub const LOG_NEWS: ::c_int = 7 << 3; -pub const LOG_UUCP: ::c_int = 8 << 3; -pub const LOG_LOCAL0: ::c_int = 16 << 3; -pub const LOG_LOCAL1: ::c_int = 17 << 3; -pub const LOG_LOCAL2: ::c_int = 18 << 3; -pub const LOG_LOCAL3: ::c_int = 19 << 3; -pub const LOG_LOCAL4: ::c_int = 20 << 3; -pub const LOG_LOCAL5: ::c_int = 21 << 3; -pub const LOG_LOCAL6: ::c_int = 22 << 3; -pub const LOG_LOCAL7: ::c_int = 23 << 3; - -pub const LOG_PID: ::c_int = 0x01; -pub const LOG_CONS: ::c_int = 0x02; -pub const LOG_ODELAY: ::c_int = 0x04; -pub const LOG_NDELAY: ::c_int = 0x08; -pub const LOG_NOWAIT: ::c_int = 0x10; - -pub const LOG_PRIMASK: ::c_int = 7; -pub const LOG_FACMASK: ::c_int = 0x3f8; - -pub const PRIO_PROCESS: ::c_int = 0; -pub const PRIO_PGRP: ::c_int = 1; -pub const PRIO_USER: ::c_int = 2; - -pub const PRIO_MIN: ::c_int = -20; -pub const PRIO_MAX: ::c_int = 20; - -cfg_if! { - if #[cfg(dox)] { - // on dox builds don't pull in anything - } else if #[cfg(all(not(stdbuild), feature = "use_std"))] { - // cargo build, don't pull in anything extra as the libstd dep - // already pulls in all libs. - } else if #[cfg(any(all(target_env = "musl", not(target_arch = "mips"))))] { - #[link(name = "c", kind = "static", cfg(target_feature = "crt-static"))] - #[link(name = "c", cfg(not(target_feature = "crt-static")))] - extern {} - } else if #[cfg(target_os = "emscripten")] { - #[link(name = "c")] - extern {} - } else if #[cfg(all(target_os = "netbsd", target_vendor = "rumprun"))] { - // Since we don't use -nodefaultlibs on Rumprun, libc is always pulled - // in automatically by the linker. We avoid passing it explicitly, as it - // causes some versions of binutils to crash with an assertion failure. - #[link(name = "m")] - extern {} - } else if #[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "android", - target_os = "openbsd", - target_os = "bitrig"))] { - #[link(name = "c")] - #[link(name = "m")] - extern {} - } else if #[cfg(target_os = "haiku")] { - #[link(name = "root")] - #[link(name = "network")] - extern {} - } else if #[cfg(target_os = "fuchsia")] { - #[link(name = "c")] - #[link(name = "mxio")] - extern {} - } else { - #[link(name = "c")] - #[link(name = "m")] - #[link(name = "rt")] - #[link(name = "pthread")] - extern {} - } -} - -extern { - pub fn getgrnam(name: *const ::c_char) -> *mut group; - pub fn getgrgid(gid: ::gid_t) -> *mut group; - - pub fn endpwent(); - #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam50")] - pub fn getpwnam(name: *const ::c_char) -> *mut passwd; - #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid50")] - pub fn getpwuid(uid: ::uid_t) -> *mut passwd; - - pub fn fprintf(stream: *mut ::FILE, - format: *const ::c_char, ...) -> ::c_int; - pub fn printf(format: *const ::c_char, ...) -> ::c_int; - pub fn snprintf(s: *mut ::c_char, n: ::size_t, - format: *const ::c_char, ...) -> ::c_int; - pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; - pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; - pub fn scanf(format: *const ::c_char, ...) -> ::c_int; - pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; - pub fn getchar_unlocked() -> ::c_int; - pub fn putchar_unlocked(c: ::c_int) -> ::c_int; - - #[cfg_attr(target_os = "netbsd", link_name = "__socket30")] - pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "connect$UNIX2003")] - pub fn connect(socket: ::c_int, address: *const sockaddr, - len: socklen_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "listen$UNIX2003")] - pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "accept$UNIX2003")] - pub fn accept(socket: ::c_int, address: *mut sockaddr, - address_len: *mut socklen_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "getpeername$UNIX2003")] - pub fn getpeername(socket: ::c_int, address: *mut sockaddr, - address_len: *mut socklen_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "getsockname$UNIX2003")] - pub fn getsockname(socket: ::c_int, address: *mut sockaddr, - address_len: *mut socklen_t) -> ::c_int; - pub fn setsockopt(socket: ::c_int, level: ::c_int, name: ::c_int, - value: *const ::c_void, - option_len: socklen_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "socketpair$UNIX2003")] - pub fn socketpair(domain: ::c_int, type_: ::c_int, protocol: ::c_int, - socket_vector: *mut ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "sendto$UNIX2003")] - pub fn sendto(socket: ::c_int, buf: *const ::c_void, len: ::size_t, - flags: ::c_int, addr: *const sockaddr, - addrlen: socklen_t) -> ::ssize_t; - pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "chmod$UNIX2003")] - pub fn chmod(path: *const c_char, mode: mode_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fchmod$UNIX2003")] - pub fn fchmod(fd: ::c_int, mode: mode_t) -> ::c_int; - - #[cfg_attr(target_os = "macos", link_name = "fstat$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__fstat50")] - pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; - - pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int; - - #[cfg_attr(target_os = "macos", link_name = "stat$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__stat50")] - pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "popen$UNIX2003")] - pub fn popen(command: *const c_char, - mode: *const c_char) -> *mut ::FILE; - pub fn pclose(stream: *mut ::FILE) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fdopen$UNIX2003")] - pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; - pub fn fileno(stream: *mut ::FILE) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "open$UNIX2003")] - pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "creat$UNIX2003")] - pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fcntl$UNIX2003")] - pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "opendir$INODE64")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "opendir$INODE64$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__opendir30")] - pub fn opendir(dirname: *const c_char) -> *mut ::DIR; - #[cfg_attr(target_os = "macos", link_name = "readdir$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__readdir30")] - pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; - #[cfg_attr(target_os = "macos", link_name = "readdir_r$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")] - #[cfg_attr(target_os = "solaris", link_name = "__posix_readdir_r")] - pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, - result: *mut *mut ::dirent) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "closedir$UNIX2003")] - pub fn closedir(dirp: *mut ::DIR) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "rewinddir$INODE64")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "rewinddir$INODE64$UNIX2003")] - pub fn rewinddir(dirp: *mut ::DIR); - - pub fn openat(dirfd: ::c_int, pathname: *const ::c_char, - flags: ::c_int, ...) -> ::c_int; - pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::c_int, flags: ::c_int) -> ::c_int; - pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, flags: ::c_int) -> ::c_int; - pub fn fchown(fd: ::c_int, - owner: ::uid_t, - group: ::gid_t) -> ::c_int; - pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char, - owner: ::uid_t, group: ::gid_t, - flags: ::c_int) -> ::c_int; - #[cfg_attr(target_os = "macos", link_name = "fstatat$INODE64")] - pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char, - buf: *mut stat, flags: ::c_int) -> ::c_int; - pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char, - newdirfd: ::c_int, newpath: *const ::c_char, - flags: ::c_int) -> ::c_int; - pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char, - buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t; - pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char, - newdirfd: ::c_int, newpath: *const ::c_char) - -> ::c_int; - pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int, - linkpath: *const ::c_char) -> ::c_int; - pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, - flags: ::c_int) -> ::c_int; - - pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; - pub fn alarm(seconds: ::c_uint) -> ::c_uint; - pub fn chdir(dir: *const c_char) -> ::c_int; - pub fn fchdir(dirfd: ::c_int) -> ::c_int; - pub fn chown(path: *const c_char, uid: uid_t, - gid: gid_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "lchown$UNIX2003")] - pub fn lchown(path: *const c_char, uid: uid_t, - gid: gid_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "close$UNIX2003")] - pub fn close(fd: ::c_int) -> ::c_int; - pub fn dup(fd: ::c_int) -> ::c_int; - pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; - pub fn execl(path: *const c_char, - arg0: *const c_char, ...) -> ::c_int; - pub fn execle(path: *const ::c_char, - arg0: *const ::c_char, ...) -> ::c_int; - pub fn execlp(file: *const ::c_char, - arg0: *const ::c_char, ...) -> ::c_int; - pub fn execv(prog: *const c_char, - argv: *const *const c_char) -> ::c_int; - pub fn execve(prog: *const c_char, argv: *const *const c_char, - envp: *const *const c_char) - -> ::c_int; - pub fn execvp(c: *const c_char, - argv: *const *const c_char) -> ::c_int; - pub fn fork() -> pid_t; - pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; - pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char; - pub fn getegid() -> gid_t; - pub fn geteuid() -> uid_t; - pub fn getgid() -> gid_t; - pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t) - -> ::c_int; - pub fn getlogin() -> *mut c_char; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "getopt$UNIX2003")] - pub fn getopt(argc: ::c_int, argv: *const *mut c_char, - optstr: *const c_char) -> ::c_int; - pub fn getpgid(pid: pid_t) -> pid_t; - pub fn getpgrp() -> pid_t; - pub fn getpid() -> pid_t; - pub fn getppid() -> pid_t; - pub fn getuid() -> uid_t; - pub fn isatty(fd: ::c_int) -> ::c_int; - pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int; - pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; - pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pause$UNIX2003")] - pub fn pause() -> ::c_int; - pub fn pipe(fds: *mut ::c_int) -> ::c_int; - pub fn posix_memalign(memptr: *mut *mut ::c_void, - align: ::size_t, - size: ::size_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "read$UNIX2003")] - pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) - -> ::ssize_t; - pub fn rmdir(path: *const c_char) -> ::c_int; - pub fn setgid(gid: gid_t) -> ::c_int; - pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int; - pub fn setsid() -> pid_t; - pub fn setuid(uid: uid_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "sleep$UNIX2003")] - pub fn sleep(secs: ::c_uint) -> ::c_uint; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "nanosleep$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")] - pub fn nanosleep(rqtp: *const timespec, - rmtp: *mut timespec) -> ::c_int; - pub fn tcgetpgrp(fd: ::c_int) -> pid_t; - pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int; - pub fn ttyname(fd: ::c_int) -> *mut c_char; - pub fn unlink(c: *const c_char) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "wait$UNIX2003")] - pub fn wait(status: *mut ::c_int) -> pid_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "waitpid$UNIX2003")] - pub fn waitpid(pid: pid_t, status: *mut ::c_int, options: ::c_int) - -> pid_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "write$UNIX2003")] - pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t) - -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pread$UNIX2003")] - pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, - offset: off_t) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pwrite$UNIX2003")] - pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t, - offset: off_t) -> ::ssize_t; - pub fn umask(mask: mode_t) -> mode_t; - - #[cfg_attr(target_os = "netbsd", link_name = "__utime50")] - pub fn utime(file: *const c_char, buf: *const utimbuf) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "kill$UNIX2003")] - pub fn kill(pid: pid_t, sig: ::c_int) -> ::c_int; - - pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; - pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; - pub fn mlockall(flags: ::c_int) -> ::c_int; - pub fn munlockall() -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "mmap$UNIX2003")] - pub fn mmap(addr: *mut ::c_void, - len: ::size_t, - prot: ::c_int, - flags: ::c_int, - fd: ::c_int, - offset: off_t) - -> *mut ::c_void; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "munmap$UNIX2003")] - pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; - - pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; - pub fn if_indextoname(ifindex: ::c_uint, - ifname: *mut ::c_char) -> *mut ::c_char; - - #[cfg_attr(target_os = "macos", link_name = "lstat$INODE64")] - #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")] - pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "fsync$UNIX2003")] - pub fn fsync(fd: ::c_int) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "setenv$UNIX2003")] - pub fn setenv(name: *const c_char, val: *const c_char, - overwrite: ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "unsetenv$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__unsetenv13")] - pub fn unsetenv(name: *const c_char) -> ::c_int; - - pub fn symlink(path1: *const c_char, - path2: *const c_char) -> ::c_int; - - pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; - - pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "getrlimit$UNIX2003")] - pub fn getrlimit(resource: ::c_int, rlim: *mut rlimit) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "setrlimit$UNIX2003")] - pub fn setrlimit(resource: ::c_int, rlim: *const rlimit) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")] - pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int; - - pub fn getdtablesize() -> ::c_int; - #[cfg_attr(any(target_os = "macos", target_os = "ios"), - link_name = "realpath$DARWIN_EXTSN")] - pub fn realpath(pathname: *const ::c_char, resolved: *mut ::c_char) - -> *mut ::c_char; - - pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int; - - #[cfg_attr(target_os = "netbsd", link_name = "__gettimeofday50")] - pub fn gettimeofday(tp: *mut ::timeval, - tz: *mut ::c_void) -> ::c_int; - - pub fn pthread_self() -> ::pthread_t; - pub fn pthread_create(native: *mut ::pthread_t, - attr: *const ::pthread_attr_t, - f: extern fn(*mut ::c_void) -> *mut ::c_void, - value: *mut ::c_void) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_join$UNIX2003")] - pub fn pthread_join(native: ::pthread_t, - value: *mut *mut ::c_void) -> ::c_int; - pub fn pthread_atfork(prepare: Option, - parent: Option, - child: Option) -> ::c_int; - pub fn pthread_exit(value: *mut ::c_void); - pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, - stack_size: ::size_t) -> ::c_int; - pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, - state: ::c_int) -> ::c_int; - pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__libc_thr_yield")] - pub fn sched_yield() -> ::c_int; - pub fn pthread_key_create(key: *mut pthread_key_t, - dtor: Option) - -> ::c_int; - pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; - pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; - pub fn pthread_setspecific(key: pthread_key_t, value: *const ::c_void) - -> ::c_int; - pub fn pthread_mutex_init(lock: *mut pthread_mutex_t, - attr: *const pthread_mutexattr_t) -> ::c_int; - pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> ::c_int; - pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> ::c_int; - pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> ::c_int; - pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> ::c_int; - - pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_mutexattr_destroy$UNIX2003")] - pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int; - pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, - _type: ::c_int) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_cond_init$UNIX2003")] - pub fn pthread_cond_init(cond: *mut pthread_cond_t, - attr: *const pthread_condattr_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_cond_wait$UNIX2003")] - pub fn pthread_cond_wait(cond: *mut pthread_cond_t, - lock: *mut pthread_mutex_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_cond_timedwait$UNIX2003")] - pub fn pthread_cond_timedwait(cond: *mut pthread_cond_t, - lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> ::c_int; - pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> ::c_int; - pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int; - pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> ::c_int; - pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_destroy$UNIX2003")] - pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_rdlock$UNIX2003")] - pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_tryrdlock$UNIX2003")] - pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_wrlock$UNIX2003")] - pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_trywrlock$UNIX2003")] - pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_rwlock_unlock$UNIX2003")] - pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pthread_sigmask$UNIX2003")] - pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, - oldset: *mut sigset_t) -> ::c_int; - pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "linux", not(target_env = "musl")), - link_name = "__xpg_strerror_r")] - pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, - buflen: ::size_t) -> ::c_int; - - pub fn getsockopt(sockfd: ::c_int, - level: ::c_int, - optname: ::c_int, - optval: *mut ::c_void, - optlen: *mut ::socklen_t) -> ::c_int; - pub fn raise(signum: ::c_int) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__sigaction14")] - pub fn sigaction(signum: ::c_int, - act: *const sigaction, - oldact: *mut sigaction) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "sigaltstack$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__sigaltstack14")] - pub fn sigaltstack(ss: *const stack_t, - oss: *mut stack_t) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch ="x86"), - link_name = "sigwait$UNIX2003")] - #[cfg_attr(target_os = "solaris", link_name = "__posix_sigwait")] - pub fn sigwait(set: *const sigset_t, - sig: *mut ::c_int) -> ::c_int; - - #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")] - pub fn utimes(filename: *const ::c_char, - times: *const ::timeval) -> ::c_int; - pub fn dlopen(filename: *const ::c_char, - flag: ::c_int) -> *mut ::c_void; - pub fn dlerror() -> *mut ::c_char; - pub fn dlsym(handle: *mut ::c_void, - symbol: *const ::c_char) -> *mut ::c_void; - pub fn dlclose(handle: *mut ::c_void) -> ::c_int; - pub fn dladdr(addr: *const ::c_void, info: *mut Dl_info) -> ::c_int; - - pub fn getaddrinfo(node: *const c_char, - service: *const c_char, - hints: *const addrinfo, - res: *mut *mut addrinfo) -> ::c_int; - pub fn freeaddrinfo(res: *mut addrinfo); - pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; - - #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")] - pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; - #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")] - pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "mktime$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")] - pub fn mktime(tm: *mut tm) -> time_t; - #[cfg_attr(target_os = "netbsd", link_name = "__time50")] - pub fn time(time: *mut time_t) -> time_t; - #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")] - pub fn localtime(time: *const time_t) -> *mut tm; - - #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")] - pub fn mknod(pathname: *const ::c_char, mode: ::mode_t, - dev: ::dev_t) -> ::c_int; - pub fn uname(buf: *mut ::utsname) -> ::c_int; - pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; - pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; - pub fn chroot(name: *const ::c_char) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "usleep$UNIX2003")] - pub fn usleep(secs: ::c_uint) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "send$UNIX2003")] - pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, - flags: ::c_int) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "recv$UNIX2003")] - pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int) -> ::ssize_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "putenv$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__putenv50")] - pub fn putenv(string: *mut c_char) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "poll$UNIX2003")] - pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "select$1050")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "select$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__select50")] - pub fn select(nfds: ::c_int, - readfs: *mut fd_set, - writefds: *mut fd_set, - errorfds: *mut fd_set, - timeout: *mut timeval) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__setlocale50")] - pub fn setlocale(category: ::c_int, - locale: *const ::c_char) -> *mut ::c_char; - pub fn localeconv() -> *mut lconv; - - pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; - pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; - pub fn sem_close(sem: *mut sem_t) -> ::c_int; - pub fn sem_unlink(name: *const ::c_char) -> ::c_int; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "sem_wait$UNIX2003")] - pub fn sem_wait(sem: *mut sem_t) -> ::c_int; - pub fn sem_trywait(sem: *mut sem_t) -> ::c_int; - pub fn sem_post(sem: *mut sem_t) -> ::c_int; - pub fn sem_init(sem: *mut sem_t, - pshared: ::c_int, - value: ::c_uint) - -> ::c_int; - pub fn statvfs(path: *const c_char, buf: *mut statvfs) -> ::c_int; - pub fn fstatvfs(fd: ::c_int, buf: *mut statvfs) -> ::c_int; - - pub fn readlink(path: *const c_char, - buf: *mut c_char, - bufsz: ::size_t) - -> ::ssize_t; - - #[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")] - pub fn sigemptyset(set: *mut sigset_t) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")] - pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__sigfillset14")] - pub fn sigfillset(set: *mut sigset_t) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__sigdelset14")] - pub fn sigdelset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; - #[cfg_attr(target_os = "netbsd", link_name = "__sigismember14")] - pub fn sigismember(set: *const sigset_t, signum: ::c_int) -> ::c_int; - - #[cfg_attr(target_os = "netbsd", link_name = "__sigprocmask14")] - pub fn sigprocmask(how: ::c_int, - set: *const sigset_t, - oldset: *mut sigset_t) - -> ::c_int; - - #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")] - pub fn timegm(tm: *mut ::tm) -> time_t; - - pub fn getsid(pid: pid_t) -> pid_t; - - pub fn sysconf(name: ::c_int) -> ::c_long; - - pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; - - #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), - link_name = "pselect$1050")] - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "pselect$UNIX2003")] - #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")] - pub fn pselect(nfds: ::c_int, - readfs: *mut fd_set, - writefds: *mut fd_set, - errorfds: *mut fd_set, - timeout: *const timespec, - sigmask: *const sigset_t) -> ::c_int; - pub fn fseeko(stream: *mut ::FILE, - offset: ::off_t, - whence: ::c_int) -> ::c_int; - pub fn ftello(stream: *mut ::FILE) -> ::off_t; - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "tcdrain$UNIX2003")] - pub fn tcdrain(fd: ::c_int) -> ::c_int; - pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t; - pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t; - pub fn cfmakeraw(termios: *mut ::termios); - pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; - pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; - pub fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; - pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int; - pub fn tcsetattr(fd: ::c_int, - optional_actions: ::c_int, - termios: *const ::termios) -> ::c_int; - pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int; - pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int; - pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int; - pub fn mkstemp(template: *mut ::c_char) -> ::c_int; - pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char; - - pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; - - pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int); - pub fn closelog(); - pub fn setlogmask(maskpri: ::c_int) -> ::c_int; - pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); - #[cfg_attr(all(target_os = "macos", target_arch = "x86"), - link_name = "nice$UNIX2003")] - pub fn nice(incr: ::c_int) -> ::c_int; - - pub fn grantpt(fd: ::c_int) -> ::c_int; - pub fn posix_openpt(flags: ::c_int) -> ::c_int; - pub fn ptsname(fd: ::c_int) -> *mut ::c_char; - pub fn unlockpt(fd: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(any(target_os = "linux", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia"))] { - mod notbsd; - pub use self::notbsd::*; - } else if #[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "freebsd", - target_os = "dragonfly", - target_os = "openbsd", - target_os = "netbsd", - target_os = "bitrig"))] { - mod bsd; - pub use self::bsd::*; - } else if #[cfg(target_os = "solaris")] { - mod solaris; - pub use self::solaris::*; - } else if #[cfg(target_os = "haiku")] { - mod haiku; - pub use self::haiku::*; - } else { - // Unknown target_os - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs deleted file mode 100644 index 1c9d033d1..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/arm.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -pub const O_DIRECT: ::c_int = 0x10000; -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs deleted file mode 100644 index 32f88e498..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/mod.rs +++ /dev/null @@ -1,199 +0,0 @@ -// The following definitions are correct for arm and i686, -// but may be wrong for mips - -pub type c_long = i32; -pub type c_ulong = u32; -pub type mode_t = u16; -pub type off64_t = ::c_longlong; -pub type sigset_t = ::c_ulong; -pub type socklen_t = i32; -pub type time64_t = i64; - -s! { - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - pub sa_flags: ::c_ulong, - pub sa_restorer: ::dox::Option, - } - - pub struct rlimit64 { - pub rlim_cur: u64, - pub rlim_max: u64, - } - - pub struct stat { - pub st_dev: ::c_ulonglong, - __pad0: [::c_uchar; 4], - __st_ino: ::ino_t, - pub st_mode: ::c_uint, - pub st_nlink: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulonglong, - __pad3: [::c_uchar; 4], - pub st_size: ::c_longlong, - pub st_blksize: ::blksize_t, - pub st_blocks: ::c_ulonglong, - pub st_atime: ::c_ulong, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::c_ulong, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::c_ulong, - pub st_ctime_nsec: ::c_ulong, - pub st_ino: ::c_ulonglong, - } - - pub struct stat64 { - pub st_dev: ::c_ulonglong, - __pad0: [::c_uchar; 4], - __st_ino: ::ino_t, - pub st_mode: ::c_uint, - pub st_nlink: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulonglong, - __pad3: [::c_uchar; 4], - pub st_size: ::c_longlong, - pub st_blksize: ::blksize_t, - pub st_blocks: ::c_ulonglong, - pub st_atime: ::c_ulong, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::c_ulong, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::c_ulong, - pub st_ctime_nsec: ::c_ulong, - pub st_ino: ::c_ulonglong, - } - - pub struct pthread_attr_t { - pub flags: ::uint32_t, - pub stack_base: *mut ::c_void, - pub stack_size: ::size_t, - pub guard_size: ::size_t, - pub sched_policy: ::int32_t, - pub sched_priority: ::int32_t, - } - - pub struct pthread_mutex_t { value: ::c_int } - - pub struct pthread_cond_t { value: ::c_int } - - pub struct pthread_rwlock_t { - lock: pthread_mutex_t, - cond: pthread_cond_t, - numLocks: ::c_int, - writerThreadId: ::c_int, - pendingReaders: ::c_int, - pendingWriters: ::c_int, - attr: i32, - __reserved: [::c_char; 12], - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - } - - pub struct statfs { - pub f_type: ::uint32_t, - pub f_bsize: ::uint32_t, - pub f_blocks: ::uint64_t, - pub f_bfree: ::uint64_t, - pub f_bavail: ::uint64_t, - pub f_files: ::uint64_t, - pub f_ffree: ::uint64_t, - pub f_fsid: ::__fsid_t, - pub f_namelen: ::uint32_t, - pub f_frsize: ::uint32_t, - pub f_flags: ::uint32_t, - pub f_spare: [::uint32_t; 4], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 8], - } -} - -pub const RTLD_GLOBAL: ::c_int = 2; -pub const RTLD_NOW: ::c_int = 0; -pub const RTLD_DEFAULT: *mut ::c_void = -1isize as *mut ::c_void; - -pub const PTRACE_GETFPREGS: ::c_int = 14; -pub const PTRACE_SETFPREGS: ::c_int = 15; -pub const PTRACE_GETREGS: ::c_int = 12; -pub const PTRACE_SETREGS: ::c_int = 13; - -pub const SYS_gettid: ::c_long = 224; -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - value: 0, -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - value: 0, -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - lock: PTHREAD_MUTEX_INITIALIZER, - cond: PTHREAD_COND_INITIALIZER, - numLocks: 0, - writerThreadId: 0, - pendingReaders: 0, - pendingWriters: 0, - attr: 0, - __reserved: [0; 12], -}; -pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 2; -pub const CPU_SETSIZE: ::size_t = 32; -pub const __CPU_BITS: ::size_t = 32; - -pub const UT_LINESIZE: usize = 8; -pub const UT_NAMESIZE: usize = 8; -pub const UT_HOSTSIZE: usize = 16; - -extern { - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: socklen_t) -> ::c_int; - - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::ssize_t; - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) - -> ::ssize_t; - - pub fn timegm64(tm: *const ::tm) -> ::time64_t; -} - -cfg_if! { - if #[cfg(target_arch = "x86")] { - mod x86; - pub use self::x86::*; - } else if #[cfg(target_arch = "arm")] { - mod arm; - pub use self::arm::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs deleted file mode 100644 index c4b8197de..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b32/x86.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub type c_char = i8; -pub type wchar_t = i32; - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs deleted file mode 100644 index 89c505d06..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/aarch64.rs +++ /dev/null @@ -1,56 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::c_uint, - pub st_nlink: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad1: ::c_ulong, - pub st_size: ::off64_t, - pub st_blksize: ::c_int, - __pad2: ::c_int, - pub st_blocks: ::c_long, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_ulong, - __unused4: ::c_uint, - __unused5: ::c_uint, - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::c_uint, - pub st_nlink: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad1: ::c_ulong, - pub st_size: ::off64_t, - pub st_blksize: ::c_int, - __pad2: ::c_int, - pub st_blocks: ::c_long, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_ulong, - __unused4: ::c_uint, - __unused5: ::c_uint, - } -} - -pub const O_DIRECT: ::c_int = 0x10000; -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; - -pub const SYS_gettid: ::c_long = 178; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs deleted file mode 100644 index 57982a222..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/mod.rs +++ /dev/null @@ -1,162 +0,0 @@ -// The following definitions are correct for aarch64 and x86_64, -// but may be wrong for mips64 - -pub type c_long = i64; -pub type c_ulong = u64; -pub type mode_t = u32; -pub type off64_t = i64; -pub type socklen_t = u32; - -s! { - pub struct sigset_t { - __val: [::c_ulong; 1], - } - - pub struct sigaction { - pub sa_flags: ::c_uint, - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - _restorer: *mut ::c_void, - } - - pub struct rlimit64 { - pub rlim_cur: ::c_ulonglong, - pub rlim_max: ::c_ulonglong, - } - - pub struct pthread_attr_t { - pub flags: ::uint32_t, - pub stack_base: *mut ::c_void, - pub stack_size: ::size_t, - pub guard_size: ::size_t, - pub sched_policy: ::int32_t, - pub sched_priority: ::int32_t, - __reserved: [::c_char; 16], - } - - pub struct pthread_mutex_t { - value: ::c_int, - __reserved: [::c_char; 36], - } - - pub struct pthread_cond_t { - value: ::c_int, - __reserved: [::c_char; 44], - } - - pub struct pthread_rwlock_t { - numLocks: ::c_int, - writerThreadId: ::c_int, - pendingReaders: ::c_int, - pendingWriters: ::c_int, - attr: i32, - __reserved: [::c_char; 36], - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - } - - pub struct statfs { - pub f_type: ::uint64_t, - pub f_bsize: ::uint64_t, - pub f_blocks: ::uint64_t, - pub f_bfree: ::uint64_t, - pub f_bavail: ::uint64_t, - pub f_files: ::uint64_t, - pub f_ffree: ::uint64_t, - pub f_fsid: ::__fsid_t, - pub f_namelen: ::uint64_t, - pub f_frsize: ::uint64_t, - pub f_flags: ::uint64_t, - pub f_spare: [::uint64_t; 4], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 0], - } -} - -pub const RTLD_GLOBAL: ::c_int = 0x00100; -pub const RTLD_NOW: ::c_int = 2; -pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - value: 0, - __reserved: [0; 36], -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - value: 0, - __reserved: [0; 44], -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - numLocks: 0, - writerThreadId: 0, - pendingReaders: 0, - pendingWriters: 0, - attr: 0, - __reserved: [0; 36], -}; -pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 4; -pub const CPU_SETSIZE: ::size_t = 1024; -pub const __CPU_BITS: ::size_t = 64; - -pub const UT_LINESIZE: usize = 32; -pub const UT_NAMESIZE: usize = 32; -pub const UT_HOSTSIZE: usize = 256; - -// Some weirdness in Android -extern { - // address_len should be socklen_t, but it is c_int! - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: ::c_int) -> ::c_int; - - // the return type should be ::ssize_t, but it is c_int! - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::c_int; - - // the return type should be ::ssize_t, but it is c_int! - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::c_int; - - // the return type should be ::ssize_t, but it is c_int! - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::c_int; - - // the return type should be ::ssize_t, but it is c_int! - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_arch = "x86_64")] { - mod x86_64; - pub use self::x86_64::*; - } else if #[cfg(target_arch = "aarch64")] { - mod aarch64; - pub use self::aarch64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs deleted file mode 100644 index 58d07e104..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/b64/x86_64.rs +++ /dev/null @@ -1,50 +0,0 @@ -pub type c_char = i8; -pub type wchar_t = i32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::c_ulong, - pub st_mode: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_size: ::off64_t, - pub st_blksize: ::c_long, - pub st_blocks: ::c_long, - pub st_atime: ::c_ulong, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::c_ulong, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::c_ulong, - pub st_ctime_nsec: ::c_ulong, - __unused: [::c_long; 3], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::c_ulong, - pub st_mode: ::c_uint, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_size: ::off64_t, - pub st_blksize: ::c_long, - pub st_blocks: ::c_long, - pub st_atime: ::c_ulong, - pub st_atime_nsec: ::c_ulong, - pub st_mtime: ::c_ulong, - pub st_mtime_nsec: ::c_ulong, - pub st_ctime: ::c_ulong, - pub st_ctime_nsec: ::c_ulong, - __unused: [::c_long; 3], - } -} - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; - -pub const SYS_gettid: ::c_long = 186; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs deleted file mode 100644 index 3eace010a..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/android/mod.rs +++ /dev/null @@ -1,806 +0,0 @@ -//! Android-specific definitions for linux-like values - -use dox::mem; - -pub type clock_t = ::c_long; -pub type time_t = ::c_long; -pub type suseconds_t = ::c_long; -pub type off_t = ::c_long; -pub type blkcnt_t = ::c_ulong; -pub type blksize_t = ::c_ulong; -pub type nlink_t = u32; -pub type useconds_t = u32; -pub type pthread_t = ::c_long; -pub type pthread_mutexattr_t = ::c_long; -pub type pthread_condattr_t = ::c_long; -pub type fsfilcnt_t = ::c_ulong; -pub type fsblkcnt_t = ::c_ulong; -pub type nfds_t = ::c_uint; -pub type rlim_t = ::c_ulong; -pub type dev_t = ::c_ulong; -pub type ino_t = ::c_ulong; -pub type __CPU_BITTYPE = ::c_ulong; -pub type idtype_t = ::c_int; - -s! { - pub struct dirent { - pub d_ino: u64, - pub d_off: i64, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - pub struct dirent64 { - pub d_ino: u64, - pub d_off: i64, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } - - pub struct __fsid_t { - __val: [::c_int; 2], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::size_t, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::size_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - } - - pub struct cpu_set_t { - #[cfg(target_pointer_width = "64")] - __bits: [__CPU_BITTYPE; 16], - #[cfg(target_pointer_width = "32")] - __bits: [__CPU_BITTYPE; 1], - } - - pub struct sem_t { - count: ::c_uint, - #[cfg(target_pointer_width = "64")] - __reserved: [::c_int; 3], - } - - pub struct lastlog { - ll_time: ::time_t, - ll_line: [::c_char; UT_LINESIZE], - ll_host: [::c_char; UT_HOSTSIZE], - } - - pub struct exit_status { - pub e_termination: ::c_short, - pub e_exit: ::c_short, - } - - pub struct utmp { - pub ut_type: ::c_short, - pub ut_pid: ::pid_t, - pub ut_line: [::c_char; UT_LINESIZE], - pub ut_id: [::c_char; 4], - - pub ut_user: [::c_char; UT_NAMESIZE], - pub ut_host: [::c_char; UT_HOSTSIZE], - pub ut_exit: exit_status, - pub ut_session: ::c_long, - pub ut_tv: ::timeval, - - pub ut_addr_v6: [::int32_t; 4], - unused: [::c_char; 20], - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - #[cfg(target_pointer_width = "64")] - __f_reserved: [u32; 6], - } -} - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const USER_PROCESS: ::c_short = 7; - -pub const BUFSIZ: ::c_uint = 1024; -pub const FILENAME_MAX: ::c_uint = 1024; -pub const FOPEN_MAX: ::c_uint = 20; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; -pub const L_tmpnam: ::c_uint = 1024; -pub const TMP_MAX: ::c_uint = 308915776; -pub const _PC_LINK_MAX: ::c_int = 1; -pub const _PC_MAX_CANON: ::c_int = 2; -pub const _PC_MAX_INPUT: ::c_int = 3; -pub const _PC_NAME_MAX: ::c_int = 4; -pub const _PC_PATH_MAX: ::c_int = 5; -pub const _PC_PIPE_BUF: ::c_int = 6; -pub const _PC_CHOWN_RESTRICTED: ::c_int = 14; -pub const _PC_NO_TRUNC: ::c_int = 15; -pub const _PC_VDISABLE: ::c_int = 16; - -pub const FIONBIO: ::c_int = 0x5421; - -pub const _SC_ARG_MAX: ::c_int = 0; -pub const _SC_BC_BASE_MAX: ::c_int = 1; -pub const _SC_BC_DIM_MAX: ::c_int = 2; -pub const _SC_BC_SCALE_MAX: ::c_int = 3; -pub const _SC_BC_STRING_MAX: ::c_int = 4; -pub const _SC_CHILD_MAX: ::c_int = 5; -pub const _SC_CLK_TCK: ::c_int = 6; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 7; -pub const _SC_EXPR_NEST_MAX: ::c_int = 8; -pub const _SC_LINE_MAX: ::c_int = 9; -pub const _SC_NGROUPS_MAX: ::c_int = 10; -pub const _SC_OPEN_MAX: ::c_int = 11; -pub const _SC_2_C_BIND: ::c_int = 13; -pub const _SC_2_C_DEV: ::c_int = 14; -pub const _SC_2_C_VERSION: ::c_int = 15; -pub const _SC_2_CHAR_TERM: ::c_int = 16; -pub const _SC_2_FORT_DEV: ::c_int = 17; -pub const _SC_2_FORT_RUN: ::c_int = 18; -pub const _SC_2_LOCALEDEF: ::c_int = 19; -pub const _SC_2_SW_DEV: ::c_int = 20; -pub const _SC_2_UPE: ::c_int = 21; -pub const _SC_2_VERSION: ::c_int = 22; -pub const _SC_JOB_CONTROL: ::c_int = 23; -pub const _SC_SAVED_IDS: ::c_int = 24; -pub const _SC_VERSION: ::c_int = 25; -pub const _SC_RE_DUP_MAX: ::c_int = 26; -pub const _SC_STREAM_MAX: ::c_int = 27; -pub const _SC_TZNAME_MAX: ::c_int = 28; -pub const _SC_XOPEN_CRYPT: ::c_int = 29; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 30; -pub const _SC_XOPEN_SHM: ::c_int = 31; -pub const _SC_XOPEN_VERSION: ::c_int = 32; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 33; -pub const _SC_XOPEN_REALTIME: ::c_int = 34; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 35; -pub const _SC_XOPEN_LEGACY: ::c_int = 36; -pub const _SC_ATEXIT_MAX: ::c_int = 37; -pub const _SC_IOV_MAX: ::c_int = 38; -pub const _SC_PAGESIZE: ::c_int = 39; -pub const _SC_PAGE_SIZE: ::c_int = 40; -pub const _SC_XOPEN_UNIX: ::c_int = 41; -pub const _SC_MQ_PRIO_MAX: ::c_int = 51; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 71; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 72; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 74; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 75; -pub const _SC_THREAD_STACK_MIN: ::c_int = 76; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 77; -pub const _SC_TTY_NAME_MAX: ::c_int = 78; -pub const _SC_THREADS: ::c_int = 79; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 80; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 81; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 82; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 83; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 84; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 85; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 97; - -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; - -pub const FIOCLEX: ::c_int = 0x5451; - -pub const SA_ONSTACK: ::c_ulong = 0x08000000; -pub const SA_SIGINFO: ::c_ulong = 0x00000004; -pub const SA_NOCLDWAIT: ::c_ulong = 0x00000002; -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const LC_PAPER: ::c_int = 7; -pub const LC_NAME: ::c_int = 8; -pub const LC_ADDRESS: ::c_int = 9; -pub const LC_TELEPHONE: ::c_int = 10; -pub const LC_MEASUREMENT: ::c_int = 11; -pub const LC_IDENTIFICATION: ::c_int = 12; -pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); -pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); -pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); -pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); -pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); -pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); -pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK - | ::LC_NUMERIC_MASK - | ::LC_TIME_MASK - | ::LC_COLLATE_MASK - | ::LC_MONETARY_MASK - | ::LC_MESSAGES_MASK - | LC_PAPER_MASK - | LC_NAME_MASK - | LC_ADDRESS_MASK - | LC_TELEPHONE_MASK - | LC_MEASUREMENT_MASK - | LC_IDENTIFICATION_MASK; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_ANONYMOUS: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; - -pub const EMULTIHOP: ::c_int = 72; -pub const EBADMSG: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 1; -pub const SOL_UDP: ::c_int = 17; -pub const SOL_SCTP: ::c_int = 132; -pub const SOL_IPX: ::c_int = 256; -pub const SOL_AX25: ::c_int = 257; -pub const SOL_ATALK: ::c_int = 258; -pub const SOL_NETROM: ::c_int = 259; -pub const SOL_ROSE: ::c_int = 260; - -#[doc(hidden)] -pub const AF_MAX: ::c_int = 39; -#[doc(hidden)] -pub const PF_MAX: ::c_int = AF_MAX; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_LINGER: ::c_int = 13; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_ACCEPTCONN: ::c_int = 30; - -pub const O_ACCMODE: ::c_int = 3; -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 0x101000; -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const NI_MAXHOST: ::size_t = 1025; - -pub const NCCS: usize = 19; -pub const TCSBRKP: ::c_int = 0x5425; -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 0x1; -pub const TCSAFLUSH: ::c_int = 0x2; -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; -pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; -pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; -pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; -pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; -pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; -pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; -pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; -pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; -pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; -pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; -pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; -pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; -pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; -pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; -pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; -pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; -pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; -pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; -pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; -pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; -pub const TMPFS_MAGIC: ::c_long = 0x01021994; -pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; - -pub const MADV_HUGEPAGE: ::c_int = 14; -pub const MADV_NOHUGEPAGE: ::c_int = 15; -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const PTRACE_TRACEME: ::c_int = 0; -pub const PTRACE_PEEKTEXT: ::c_int = 1; -pub const PTRACE_PEEKDATA: ::c_int = 2; -pub const PTRACE_PEEKUSER: ::c_int = 3; -pub const PTRACE_POKETEXT: ::c_int = 4; -pub const PTRACE_POKEDATA: ::c_int = 5; -pub const PTRACE_POKEUSER: ::c_int = 6; -pub const PTRACE_CONT: ::c_int = 7; -pub const PTRACE_KILL: ::c_int = 8; -pub const PTRACE_SINGLESTEP: ::c_int = 9; -pub const PTRACE_ATTACH: ::c_int = 16; -pub const PTRACE_DETACH: ::c_int = 17; -pub const PTRACE_SYSCALL: ::c_int = 24; -pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const TCGETS: ::c_int = 0x5401; -pub const TCSETS: ::c_int = 0x5402; -pub const TCSETSW: ::c_int = 0x5403; -pub const TCSETSF: ::c_int = 0x5404; -pub const TCGETA: ::c_int = 0x5405; -pub const TCSETA: ::c_int = 0x5406; -pub const TCSETAW: ::c_int = 0x5407; -pub const TCSETAF: ::c_int = 0x5408; -pub const TCSBRK: ::c_int = 0x5409; -pub const TCXONC: ::c_int = 0x540A; -pub const TCFLSH: ::c_int = 0x540B; -pub const TIOCGSOFTCAR: ::c_int = 0x5419; -pub const TIOCSSOFTCAR: ::c_int = 0x541A; -pub const TIOCINQ: ::c_int = 0x541B; -pub const TIOCLINUX: ::c_int = 0x541C; -pub const TIOCGSERIAL: ::c_int = 0x541E; -pub const TIOCEXCL: ::c_int = 0x540C; -pub const TIOCNXCL: ::c_int = 0x540D; -pub const TIOCSCTTY: ::c_int = 0x540E; -pub const TIOCGPGRP: ::c_int = 0x540F; -pub const TIOCSPGRP: ::c_int = 0x5410; -pub const TIOCOUTQ: ::c_int = 0x5411; -pub const TIOCSTI: ::c_int = 0x5412; -pub const TIOCGWINSZ: ::c_int = 0x5413; -pub const TIOCSWINSZ: ::c_int = 0x5414; -pub const TIOCMGET: ::c_int = 0x5415; -pub const TIOCMBIS: ::c_int = 0x5416; -pub const TIOCMBIC: ::c_int = 0x5417; -pub const TIOCMSET: ::c_int = 0x5418; -pub const FIONREAD: ::c_int = 0x541B; -pub const TIOCCONS: ::c_int = 0x541D; - -pub const RTLD_NOLOAD: ::c_int = 0x4; - -pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; - -pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; -pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; -pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; -pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; -pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; - -pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; -pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; -pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; -pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; -pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; -pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; -pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const NETLINK_ROUTE: ::c_int = 0; -pub const NETLINK_UNUSED: ::c_int = 1; -pub const NETLINK_USERSOCK: ::c_int = 2; -pub const NETLINK_FIREWALL: ::c_int = 3; -pub const NETLINK_SOCK_DIAG: ::c_int = 4; -pub const NETLINK_NFLOG: ::c_int = 5; -pub const NETLINK_XFRM: ::c_int = 6; -pub const NETLINK_SELINUX: ::c_int = 7; -pub const NETLINK_ISCSI: ::c_int = 8; -pub const NETLINK_AUDIT: ::c_int = 9; -pub const NETLINK_FIB_LOOKUP: ::c_int = 10; -pub const NETLINK_CONNECTOR: ::c_int = 11; -pub const NETLINK_NETFILTER: ::c_int = 12; -pub const NETLINK_IP6_FW: ::c_int = 13; -pub const NETLINK_DNRTMSG: ::c_int = 14; -pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; -pub const NETLINK_GENERIC: ::c_int = 16; -pub const NETLINK_SCSITRANSPORT: ::c_int = 18; -pub const NETLINK_ECRYPTFS: ::c_int = 19; -pub const NETLINK_RDMA: ::c_int = 20; -pub const NETLINK_CRYPTO: ::c_int = 21; -pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; - -pub const MAX_LINKS: ::c_int = 32; - -pub const NLM_F_REQUEST: ::c_int = 1; -pub const NLM_F_MULTI: ::c_int = 2; -pub const NLM_F_ACK: ::c_int = 4; -pub const NLM_F_ECHO: ::c_int = 8; -pub const NLM_F_DUMP_INTR: ::c_int = 16; - -pub const NLM_F_ROOT: ::c_int = 0x100; -pub const NLM_F_MATCH: ::c_int = 0x200; -pub const NLM_F_ATOMIC: ::c_int = 0x400; -pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; - -pub const NLM_F_REPLACE: ::c_int = 0x100; -pub const NLM_F_EXCL: ::c_int = 0x200; -pub const NLM_F_CREATE: ::c_int = 0x400; -pub const NLM_F_APPEND: ::c_int = 0x800; - -pub const NLMSG_NOOP: ::c_int = 0x1; -pub const NLMSG_ERROR: ::c_int = 0x2; -pub const NLMSG_DONE: ::c_int = 0x3; -pub const NLMSG_OVERRUN: ::c_int = 0x4; -pub const NLMSG_MIN_TYPE: ::c_int = 0x10; - -pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; -pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; -pub const NETLINK_PKTINFO: ::c_int = 3; -pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; -pub const NETLINK_NO_ENOBUFS: ::c_int = 5; -pub const NETLINK_RX_RING: ::c_int = 6; -pub const NETLINK_TX_RING: ::c_int = 7; - -pub const NLA_F_NESTED: ::c_int = 1 << 15; -pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; -pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); - -pub const SIGEV_THREAD_ID: ::c_int = 4; - -f! { - pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { - for slot in cpuset.__bits.iter_mut() { - *slot = 0; - } - } - - pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); - let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); - cpuset.__bits[idx] |= 1 << offset; - () - } - - pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); - let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); - cpuset.__bits[idx] &= !(1 << offset); - () - } - - pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { - let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]); - let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits); - 0 != (cpuset.__bits[idx] & (1 << offset)) - } - - pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { - set1.__bits == set2.__bits - } -} - -extern { - static mut __progname: *mut ::c_char; -} - -extern { - pub fn madvise(addr: *const ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; - pub fn msync(addr: *const ::c_void, len: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int, addr: *const ::sockaddr, - addrlen: *mut ::socklen_t) -> ::ssize_t; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::size_t, - serv: *mut ::c_char, - sevlen: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn ptrace(request: ::c_int, ...) -> ::c_long; - pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; - pub fn __sched_cpualloc(count: ::size_t) -> *mut ::cpu_set_t; - pub fn __sched_cpufree(set: *mut ::cpu_set_t); - pub fn __sched_cpucount(setsize: ::size_t, set: *mut cpu_set_t) -> ::c_int; - pub fn sched_getcpu() -> ::c_int; - - pub fn utmpname(name: *const ::c_char) -> ::c_int; - pub fn setutent(); - pub fn getutent() -> *mut utmp; - - pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, - len: ::off_t) -> ::c_int; -} - -cfg_if! { - if #[cfg(target_pointer_width = "32")] { - mod b32; - pub use self::b32::*; - } else if #[cfg(target_pointer_width = "64")] { - mod b64; - pub use self::b64::*; - } else { - // Unknown target_pointer_width - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs deleted file mode 100644 index 22bb33b72..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips32.rs +++ /dev/null @@ -1,287 +0,0 @@ -pub type c_char = i8; -pub type c_long = i32; -pub type c_ulong = u32; -pub type clock_t = i32; -pub type time_t = i32; -pub type suseconds_t = i32; -pub type wchar_t = i32; -pub type off_t = i32; -pub type ino_t = u32; -pub type blkcnt_t = i32; -pub type blksize_t = i32; -pub type nlink_t = u32; -pub type fsblkcnt_t = ::c_ulong; -pub type fsfilcnt_t = ::c_ulong; -pub type rlim_t = c_ulong; - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: ::sigevent, - __next_prio: *mut aiocb, - __abs_prio: ::c_int, - __policy: ::c_int, - __error_code: ::c_int, - __return_value: ::ssize_t, - pub aio_offset: off_t, - __unused1: [::c_char; 4], - __glibc_reserved: [::c_char; 32] - } - - pub struct stat { - pub st_dev: ::c_ulong, - st_pad1: [::c_long; 3], - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulong, - pub st_pad2: [::c_long; 2], - pub st_size: ::off_t, - st_pad3: ::c_long, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - st_pad5: [::c_long; 14], - } - - pub struct stat64 { - pub st_dev: ::c_ulong, - st_pad1: [::c_long; 3], - pub st_ino: ::ino64_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulong, - st_pad2: [::c_long; 2], - pub st_size: ::off64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - st_pad3: ::c_long, - pub st_blocks: ::blkcnt64_t, - st_pad5: [::c_long; 14], - } - - pub struct pthread_attr_t { - __size: [u32; 9] - } - - pub struct sigaction { - pub sa_flags: ::c_int, - pub sa_sigaction: ::sighandler_t, - pub sa_mask: sigset_t, - _restorer: *mut ::c_void, - _resv: [::c_int; 1], - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct sigset_t { - __val: [::c_ulong; 32], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - pub _pad: [::c_int; 29], - } - - pub struct glob64_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut ::c_char, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_uint, - pub __seq: ::c_ushort, - __pad1: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - #[cfg(target_endian = "big")] - __glibc_reserved1: ::c_ulong, - pub msg_stime: ::time_t, - #[cfg(target_endian = "little")] - __glibc_reserved1: ::c_ulong, - #[cfg(target_endian = "big")] - __glibc_reserved2: ::c_ulong, - pub msg_rtime: ::time_t, - #[cfg(target_endian = "little")] - __glibc_reserved2: ::c_ulong, - #[cfg(target_endian = "big")] - __glibc_reserved3: ::c_ulong, - pub msg_ctime: ::time_t, - #[cfg(target_endian = "little")] - __glibc_reserved3: ::c_ulong, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_long, - pub f_bsize: ::c_long, - pub f_frsize: ::c_long, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_files: ::fsblkcnt_t, - pub f_ffree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_fsid: ::fsid_t, - - pub f_namelen: ::c_long, - f_spare: [::c_long; 6], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::size_t, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::size_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_sysid: ::c_long, - pub l_pid: ::pid_t, - pad: [::c_long; 4], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 8], - } - - // FIXME this is actually a union - pub struct sem_t { - #[cfg(target_pointer_width = "32")] - __size: [::c_char; 16], - #[cfg(target_pointer_width = "64")] - __size: [::c_char; 32], - __align: [::c_long; 0], - } -} - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; - -pub const SYS_gettid: ::c_long = 4222; // Valid for O32 - -#[link(name = "util")] -extern { - pub fn sysctl(name: *mut ::c_int, - namelen: ::c_int, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn backtrace(buf: *mut *mut ::c_void, - sz: ::c_int) -> ::c_int; - pub fn glob64(pattern: *const ::c_char, - flags: ::c_int, - errfunc: ::dox::Option ::c_int>, - pglob: *mut glob64_t) -> ::c_int; - pub fn globfree64(pglob: *mut glob64_t); - pub fn ptrace(request: ::c_uint, ...) -> ::c_long; - pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *mut ::cpu_set_t) -> ::c_int; - pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *const ::cpu_set_t) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs deleted file mode 100644 index 947859998..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mips64.rs +++ /dev/null @@ -1,225 +0,0 @@ -pub type blkcnt_t = i64; -pub type blksize_t = i64; -pub type c_char = i8; -pub type c_long = i64; -pub type c_ulong = u64; -pub type fsblkcnt_t = ::c_ulong; -pub type fsfilcnt_t = ::c_ulong; -pub type ino_t = u64; -pub type nlink_t = u64; -pub type off_t = i64; -pub type rlim_t = ::c_ulong; -pub type suseconds_t = i64; -pub type time_t = i64; -pub type wchar_t = i32; - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: ::sigevent, - __next_prio: *mut aiocb, - __abs_prio: ::c_int, - __policy: ::c_int, - __error_code: ::c_int, - __return_value: ::ssize_t, - pub aio_offset: off_t, - __glibc_reserved: [::c_char; 32] - } - - pub struct stat { - pub st_dev: ::c_ulong, - st_pad1: [::c_long; 2], - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulong, - st_pad2: [::c_ulong; 1], - pub st_size: ::off_t, - st_pad3: ::c_long, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - st_pad4: ::c_long, - pub st_blocks: ::blkcnt_t, - st_pad5: [::c_long; 7], - } - - pub struct stat64 { - pub st_dev: ::c_ulong, - st_pad1: [::c_long; 2], - pub st_ino: ::ino64_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::c_ulong, - st_pad2: [::c_long; 2], - pub st_size: ::off64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - st_pad3: ::c_long, - pub st_blocks: ::blkcnt64_t, - st_pad5: [::c_long; 7], - } - - pub struct pthread_attr_t { - __size: [::c_ulong; 7] - } - - pub struct sigaction { - pub sa_flags: ::c_int, - pub sa_sigaction: ::sighandler_t, - pub sa_mask: sigset_t, - _restorer: *mut ::c_void, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct sigset_t { - __size: [::c_ulong; 16], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - _pad: ::c_int, - _pad2: [::c_long; 14], - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_uint, - pub __seq: ::c_ushort, - __pad1: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - pub msg_rtime: ::time_t, - pub msg_ctime: ::time_t, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_long, - pub f_bsize: ::c_long, - pub f_frsize: ::c_long, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_files: ::fsblkcnt_t, - pub f_ffree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_fsid: ::fsid_t, - - pub f_namelen: ::c_long, - f_spare: [::c_long; 6], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::size_t, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::size_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 0], - } - - // FIXME this is actually a union - pub struct sem_t { - __size: [::c_char; 32], - __align: [::c_long; 0], - } -} - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; - -pub const RLIM_INFINITY: ::rlim_t = 0xffff_ffff_ffff_ffff; - -pub const SYS_gettid: ::c_long = 5178; // Valid for n64 - -#[link(name = "util")] -extern { - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs deleted file mode 100644 index 7b1c15e2f..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mips/mod.rs +++ /dev/null @@ -1,509 +0,0 @@ -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const BUFSIZ: ::c_uint = 8192; -pub const TMP_MAX: ::c_uint = 238328; -pub const FOPEN_MAX: ::c_uint = 16; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; -pub const _SC_2_C_VERSION: ::c_int = 96; -pub const O_ACCMODE: ::c_int = 3; -pub const O_DIRECT: ::c_int = 0x8000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const ST_RELATIME: ::c_ulong = 4096; -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const RLIMIT_NOFILE: ::c_int = 5; -pub const RLIMIT_AS: ::c_int = 6; -pub const RLIMIT_RSS: ::c_int = 7; -pub const RLIMIT_NPROC: ::c_int = 8; -pub const RLIMIT_MEMLOCK: ::c_int = 9; -pub const RLIMIT_NLIMITS: ::c_int = 16; - -pub const O_APPEND: ::c_int = 8; -pub const O_CREAT: ::c_int = 256; -pub const O_EXCL: ::c_int = 1024; -pub const O_NOCTTY: ::c_int = 2048; -pub const O_NONBLOCK: ::c_int = 128; -pub const O_SYNC: ::c_int = 0x4010; -pub const O_RSYNC: ::c_int = 0x4010; -pub const O_DSYNC: ::c_int = 0x10; -pub const O_FSYNC: ::c_int = 0x4010; -pub const O_ASYNC: ::c_int = 0x1000; -pub const O_NDELAY: ::c_int = 0x80; - -pub const SOCK_NONBLOCK: ::c_int = 128; - -pub const EDEADLK: ::c_int = 45; -pub const ENAMETOOLONG: ::c_int = 78; -pub const ENOLCK: ::c_int = 46; -pub const ENOSYS: ::c_int = 89; -pub const ENOTEMPTY: ::c_int = 93; -pub const ELOOP: ::c_int = 90; -pub const ENOMSG: ::c_int = 35; -pub const EIDRM: ::c_int = 36; -pub const ECHRNG: ::c_int = 37; -pub const EL2NSYNC: ::c_int = 38; -pub const EL3HLT: ::c_int = 39; -pub const EL3RST: ::c_int = 40; -pub const ELNRNG: ::c_int = 41; -pub const EUNATCH: ::c_int = 42; -pub const ENOCSI: ::c_int = 43; -pub const EL2HLT: ::c_int = 44; -pub const EBADE: ::c_int = 50; -pub const EBADR: ::c_int = 51; -pub const EXFULL: ::c_int = 52; -pub const ENOANO: ::c_int = 53; -pub const EBADRQC: ::c_int = 54; -pub const EBADSLT: ::c_int = 55; -pub const EDEADLOCK: ::c_int = 56; -pub const EMULTIHOP: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 79; -pub const ENOTUNIQ: ::c_int = 80; -pub const EBADFD: ::c_int = 81; -pub const EBADMSG: ::c_int = 77; -pub const EREMCHG: ::c_int = 82; -pub const ELIBACC: ::c_int = 83; -pub const ELIBBAD: ::c_int = 84; -pub const ELIBSCN: ::c_int = 85; -pub const ELIBMAX: ::c_int = 86; -pub const ELIBEXEC: ::c_int = 87; -pub const EILSEQ: ::c_int = 88; -pub const ERESTART: ::c_int = 91; -pub const ESTRPIPE: ::c_int = 92; -pub const EUSERS: ::c_int = 94; -pub const ENOTSOCK: ::c_int = 95; -pub const EDESTADDRREQ: ::c_int = 96; -pub const EMSGSIZE: ::c_int = 97; -pub const EPROTOTYPE: ::c_int = 98; -pub const ENOPROTOOPT: ::c_int = 99; -pub const EPROTONOSUPPORT: ::c_int = 120; -pub const ESOCKTNOSUPPORT: ::c_int = 121; -pub const EOPNOTSUPP: ::c_int = 122; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 123; -pub const EAFNOSUPPORT: ::c_int = 124; -pub const EADDRINUSE: ::c_int = 125; -pub const EADDRNOTAVAIL: ::c_int = 126; -pub const ENETDOWN: ::c_int = 127; -pub const ENETUNREACH: ::c_int = 128; -pub const ENETRESET: ::c_int = 129; -pub const ECONNABORTED: ::c_int = 130; -pub const ECONNRESET: ::c_int = 131; -pub const ENOBUFS: ::c_int = 132; -pub const EISCONN: ::c_int = 133; -pub const ENOTCONN: ::c_int = 134; -pub const ESHUTDOWN: ::c_int = 143; -pub const ETOOMANYREFS: ::c_int = 144; -pub const ETIMEDOUT: ::c_int = 145; -pub const ECONNREFUSED: ::c_int = 146; -pub const EHOSTDOWN: ::c_int = 147; -pub const EHOSTUNREACH: ::c_int = 148; -pub const EALREADY: ::c_int = 149; -pub const EINPROGRESS: ::c_int = 150; -pub const ESTALE: ::c_int = 151; -pub const EUCLEAN: ::c_int = 135; -pub const ENOTNAM: ::c_int = 137; -pub const ENAVAIL: ::c_int = 138; -pub const EISNAM: ::c_int = 139; -pub const EREMOTEIO: ::c_int = 140; -pub const EDQUOT: ::c_int = 1133; -pub const ENOMEDIUM: ::c_int = 159; -pub const EMEDIUMTYPE: ::c_int = 160; -pub const ECANCELED: ::c_int = 158; -pub const ENOKEY: ::c_int = 161; -pub const EKEYEXPIRED: ::c_int = 162; -pub const EKEYREVOKED: ::c_int = 163; -pub const EKEYREJECTED: ::c_int = 164; -pub const EOWNERDEAD: ::c_int = 165; -pub const ENOTRECOVERABLE: ::c_int = 166; -pub const ERFKILL: ::c_int = 167; - -pub const LC_PAPER: ::c_int = 7; -pub const LC_NAME: ::c_int = 8; -pub const LC_ADDRESS: ::c_int = 9; -pub const LC_TELEPHONE: ::c_int = 10; -pub const LC_MEASUREMENT: ::c_int = 11; -pub const LC_IDENTIFICATION: ::c_int = 12; -pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); -pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); -pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); -pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); -pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); -pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); -pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK - | ::LC_NUMERIC_MASK - | ::LC_TIME_MASK - | ::LC_COLLATE_MASK - | ::LC_MONETARY_MASK - | ::LC_MESSAGES_MASK - | LC_PAPER_MASK - | LC_NAME_MASK - | LC_ADDRESS_MASK - | LC_TELEPHONE_MASK - | LC_MEASUREMENT_MASK - | LC_IDENTIFICATION_MASK; - -pub const MAP_NORESERVE: ::c_int = 0x400; -pub const MAP_ANON: ::c_int = 0x800; -pub const MAP_ANONYMOUS: ::c_int = 0x800; -pub const MAP_GROWSDOWN: ::c_int = 0x1000; -pub const MAP_DENYWRITE: ::c_int = 0x2000; -pub const MAP_EXECUTABLE: ::c_int = 0x4000; -pub const MAP_LOCKED: ::c_int = 0x8000; -pub const MAP_POPULATE: ::c_int = 0x10000; -pub const MAP_NONBLOCK: ::c_int = 0x20000; -pub const MAP_STACK: ::c_int = 0x40000; - -pub const SOCK_STREAM: ::c_int = 2; -pub const SOCK_DGRAM: ::c_int = 1; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 0xffff; - -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_REUSEPORT: ::c_int = 0x0200; -pub const SO_TYPE: ::c_int = 0x1008; -pub const SO_STYLE: ::c_int = SO_TYPE; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_ACCEPTCONN: ::c_int = 0x1009; -pub const SO_PROTOCOL: ::c_int = 0x1028; -pub const SO_DOMAIN: ::c_int = 0x1029; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_PASSCRED: ::c_int = 17; -pub const SO_PEERCRED: ::c_int = 18; -pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; -pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; -pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; -pub const SO_BINDTODEVICE: ::c_int = 25; -pub const SO_ATTACH_FILTER: ::c_int = 26; -pub const SO_DETACH_FILTER: ::c_int = 27; -pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; -pub const SO_PEERNAME: ::c_int = 28; -pub const SO_TIMESTAMP: ::c_int = 29; -pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; -pub const SO_PEERSEC: ::c_int = 30; -pub const SO_SNDBUFFORCE: ::c_int = 31; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_PASSSEC: ::c_int = 34; -pub const SO_TIMESTAMPNS: ::c_int = 35; -pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; -pub const SO_MARK: ::c_int = 36; -pub const SO_TIMESTAMPING: ::c_int = 37; -pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; -pub const SO_RXQ_OVFL: ::c_int = 40; -pub const SO_WIFI_STATUS: ::c_int = 41; -pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; -pub const SO_PEEK_OFF: ::c_int = 42; -pub const SO_NOFCS: ::c_int = 43; -pub const SO_LOCK_FILTER: ::c_int = 44; -pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; -pub const SO_BUSY_POLL: ::c_int = 46; -pub const SO_MAX_PACING_RATE: ::c_int = 47; -pub const SO_BPF_EXTENSIONS: ::c_int = 48; -pub const SO_INCOMING_CPU: ::c_int = 49; -pub const SO_ATTACH_BPF: ::c_int = 50; -pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; - -pub const FIOCLEX: ::c_ulong = 0x6601; -pub const FIONBIO: ::c_ulong = 0x667e; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000008; -pub const SA_NOCLDWAIT: ::c_int = 0x00010000; - -pub const SIGCHLD: ::c_int = 18; -pub const SIGBUS: ::c_int = 10; -pub const SIGTTIN: ::c_int = 26; -pub const SIGTTOU: ::c_int = 27; -pub const SIGXCPU: ::c_int = 30; -pub const SIGXFSZ: ::c_int = 31; -pub const SIGVTALRM: ::c_int = 28; -pub const SIGPROF: ::c_int = 29; -pub const SIGWINCH: ::c_int = 20; -pub const SIGUSR1: ::c_int = 16; -pub const SIGUSR2: ::c_int = 17; -pub const SIGCONT: ::c_int = 25; -pub const SIGSTOP: ::c_int = 23; -pub const SIGTSTP: ::c_int = 24; -pub const SIGURG: ::c_int = 21; -pub const SIGIO: ::c_int = 22; -pub const SIGSYS: ::c_int = 12; -pub const SIGPOLL: ::c_int = 22; -pub const SIGPWR: ::c_int = 19; -pub const SIG_SETMASK: ::c_int = 3; -pub const SIG_BLOCK: ::c_int = 0x1; -pub const SIG_UNBLOCK: ::c_int = 0x2; - -pub const POLLRDNORM: ::c_short = 0x040; -pub const POLLWRNORM: ::c_short = 0x004; -pub const POLLRDBAND: ::c_short = 0x080; -pub const POLLWRBAND: ::c_short = 0x100; - -pub const PTHREAD_STACK_MIN: ::size_t = 131072; - -pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; -pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; -pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; -pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; -pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; -pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; -pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; -pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; -pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; -pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; -pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; -pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; -pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; -pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; -pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; -pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; -pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; -pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; -pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; -pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; -pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; -pub const TMPFS_MAGIC: ::c_long = 0x01021994; -pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; - -pub const VEOF: usize = 16; -pub const VEOL: usize = 17; -pub const VEOL2: usize = 6; -pub const VMIN: usize = 4; -pub const IEXTEN: ::tcflag_t = 0x00000100; -pub const TOSTOP: ::tcflag_t = 0x00008000; -pub const FLUSHO: ::tcflag_t = 0x00002000; -pub const EXTPROC: ::tcflag_t = 0o200000; -pub const TCSANOW: ::c_int = 0x540e; -pub const TCSADRAIN: ::c_int = 0x540f; -pub const TCSAFLUSH: ::c_int = 0x5410; - -pub const CPU_SETSIZE: ::c_int = 0x400; - -pub const PTRACE_TRACEME: ::c_uint = 0; -pub const PTRACE_PEEKTEXT: ::c_uint = 1; -pub const PTRACE_PEEKDATA: ::c_uint = 2; -pub const PTRACE_PEEKUSER: ::c_uint = 3; -pub const PTRACE_POKETEXT: ::c_uint = 4; -pub const PTRACE_POKEDATA: ::c_uint = 5; -pub const PTRACE_POKEUSER: ::c_uint = 6; -pub const PTRACE_CONT: ::c_uint = 7; -pub const PTRACE_KILL: ::c_uint = 8; -pub const PTRACE_SINGLESTEP: ::c_uint = 9; -pub const PTRACE_ATTACH: ::c_uint = 16; -pub const PTRACE_DETACH: ::c_uint = 17; -pub const PTRACE_SYSCALL: ::c_uint = 24; -pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; - -pub const MAP_HUGETLB: ::c_int = 0x080000; - -pub const EFD_NONBLOCK: ::c_int = 0x80; - -pub const F_GETLK: ::c_int = 14; -pub const F_GETOWN: ::c_int = 23; -pub const F_SETOWN: ::c_int = 24; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SFD_NONBLOCK: ::c_int = 0x80; - -pub const TCGETS: ::c_ulong = 0x540d; -pub const TCSETS: ::c_ulong = 0x540e; -pub const TCSETSW: ::c_ulong = 0x540f; -pub const TCSETSF: ::c_ulong = 0x5410; -pub const TCGETA: ::c_ulong = 0x5401; -pub const TCSETA: ::c_ulong = 0x5402; -pub const TCSETAW: ::c_ulong = 0x5403; -pub const TCSETAF: ::c_ulong = 0x5404; -pub const TCSBRK: ::c_ulong = 0x5405; -pub const TCXONC: ::c_ulong = 0x5406; -pub const TCFLSH: ::c_ulong = 0x5407; -pub const TIOCGSOFTCAR: ::c_ulong = 0x5481; -pub const TIOCSSOFTCAR: ::c_ulong = 0x5482; -pub const TIOCINQ: ::c_ulong = 0x467f; -pub const TIOCLINUX: ::c_ulong = 0x5483; -pub const TIOCGSERIAL: ::c_ulong = 0x5484; -pub const TIOCEXCL: ::c_ulong = 0x740d; -pub const TIOCNXCL: ::c_ulong = 0x740e; -pub const TIOCSCTTY: ::c_ulong = 0x5480; -pub const TIOCGPGRP: ::c_ulong = 0x40047477; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCOUTQ: ::c_ulong = 0x7472; -pub const TIOCSTI: ::c_ulong = 0x5472; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const TIOCMGET: ::c_ulong = 0x741d; -pub const TIOCMBIS: ::c_ulong = 0x741b; -pub const TIOCMBIC: ::c_ulong = 0x741c; -pub const TIOCMSET: ::c_ulong = 0x741a; -pub const FIONREAD: ::c_ulong = 0x467f; -pub const TIOCCONS: ::c_ulong = 0x80047478; - -pub const RTLD_DEEPBIND: ::c_int = 0x10; -pub const RTLD_GLOBAL: ::c_int = 0x4; -pub const RTLD_NOLOAD: ::c_int = 0x8; - -pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; -pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; -pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; -pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; -pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; - -pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; -pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; -pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; -pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; -pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; -pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; -pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -cfg_if! { - if #[cfg(target_arch = "mips")] { - mod mips32; - pub use self::mips32::*; - } else if #[cfg(target_arch = "mips64")] { - mod mips64; - pub use self::mips64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs deleted file mode 100644 index 9774f93f6..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/mod.rs +++ /dev/null @@ -1,978 +0,0 @@ -//! Linux-specific definitions for linux-like values - -use dox::{mem, Option}; - -pub type useconds_t = u32; -pub type dev_t = u64; -pub type socklen_t = u32; -pub type pthread_t = c_ulong; -pub type mode_t = u32; -pub type ino64_t = u64; -pub type off64_t = i64; -pub type blkcnt64_t = i64; -pub type rlim64_t = u64; -pub type shmatt_t = ::c_ulong; -pub type mqd_t = ::c_int; -pub type msgqnum_t = ::c_ulong; -pub type msglen_t = ::c_ulong; -pub type nfds_t = ::c_ulong; -pub type nl_item = ::c_int; -pub type idtype_t = ::c_uint; - -pub enum fpos64_t {} // TODO: fill this out with a struct - -s! { - pub struct dirent { - pub d_ino: ::ino_t, - pub d_off: ::off_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - pub struct dirent64 { - pub d_ino: ::ino64_t, - pub d_off: ::off64_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - pub struct rlimit64 { - pub rlim_cur: rlim64_t, - pub rlim_max: rlim64_t, - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut c_char, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - } - - pub struct ifaddrs { - pub ifa_next: *mut ifaddrs, - pub ifa_name: *mut c_char, - pub ifa_flags: ::c_uint, - pub ifa_addr: *mut ::sockaddr, - pub ifa_netmask: *mut ::sockaddr, - pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union - pub ifa_data: *mut ::c_void - } - - pub struct pthread_mutex_t { - #[cfg(any(target_arch = "mips", target_arch = "arm", - target_arch = "powerpc"))] - __align: [::c_long; 0], - #[cfg(not(any(target_arch = "mips", target_arch = "arm", - target_arch = "powerpc")))] - __align: [::c_longlong; 0], - size: [u8; __SIZEOF_PTHREAD_MUTEX_T], - } - - pub struct pthread_rwlock_t { - #[cfg(any(target_arch = "mips", target_arch = "arm", - target_arch = "powerpc"))] - __align: [::c_long; 0], - #[cfg(not(any(target_arch = "mips", target_arch = "arm", - target_arch = "powerpc")))] - __align: [::c_longlong; 0], - size: [u8; __SIZEOF_PTHREAD_RWLOCK_T], - } - - pub struct pthread_mutexattr_t { - #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", - target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64"))] - __align: [::c_int; 0], - #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", - target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64")))] - __align: [::c_long; 0], - size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T], - } - - pub struct pthread_cond_t { - #[cfg(any(target_env = "musl"))] - __align: [*const ::c_void; 0], - #[cfg(not(any(target_env = "musl")))] - __align: [::c_longlong; 0], - size: [u8; __SIZEOF_PTHREAD_COND_T], - } - - pub struct pthread_condattr_t { - __align: [::c_int; 0], - size: [u8; __SIZEOF_PTHREAD_CONDATTR_T], - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - } - - pub struct spwd { - pub sp_namp: *mut ::c_char, - pub sp_pwdp: *mut ::c_char, - pub sp_lstchg: ::c_long, - pub sp_min: ::c_long, - pub sp_max: ::c_long, - pub sp_warn: ::c_long, - pub sp_inact: ::c_long, - pub sp_expire: ::c_long, - pub sp_flag: ::c_ulong, - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - #[cfg(target_endian = "little")] - pub f_fsid: ::c_ulong, - #[cfg(target_pointer_width = "32")] - __f_unused: ::c_int, - #[cfg(target_endian = "big")] - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - __f_spare: [::c_int; 6], - } - - pub struct dqblk { - pub dqb_bhardlimit: ::uint64_t, - pub dqb_bsoftlimit: ::uint64_t, - pub dqb_curspace: ::uint64_t, - pub dqb_ihardlimit: ::uint64_t, - pub dqb_isoftlimit: ::uint64_t, - pub dqb_curinodes: ::uint64_t, - pub dqb_btime: ::uint64_t, - pub dqb_itime: ::uint64_t, - pub dqb_valid: ::uint32_t, - } - - pub struct signalfd_siginfo { - pub ssi_signo: ::uint32_t, - pub ssi_errno: ::int32_t, - pub ssi_code: ::int32_t, - pub ssi_pid: ::uint32_t, - pub ssi_uid: ::uint32_t, - pub ssi_fd: ::int32_t, - pub ssi_tid: ::uint32_t, - pub ssi_band: ::uint32_t, - pub ssi_overrun: ::uint32_t, - pub ssi_trapno: ::uint32_t, - pub ssi_status: ::int32_t, - pub ssi_int: ::int32_t, - pub ssi_ptr: ::uint64_t, - pub ssi_utime: ::uint64_t, - pub ssi_stime: ::uint64_t, - pub ssi_addr: ::uint64_t, - _pad: [::uint8_t; 48], - } - - pub struct fsid_t { - __val: [::c_int; 2], - } - - pub struct mq_attr { - pub mq_flags: ::c_long, - pub mq_maxmsg: ::c_long, - pub mq_msgsize: ::c_long, - pub mq_curmsgs: ::c_long, - pad: [::c_long; 4] - } - - pub struct cpu_set_t { - #[cfg(target_pointer_width = "32")] - bits: [u32; 32], - #[cfg(target_pointer_width = "64")] - bits: [u64; 16], - } - - pub struct if_nameindex { - pub if_index: ::c_uint, - pub if_name: *mut ::c_char, - } - - // System V IPC - pub struct msginfo { - pub msgpool: ::c_int, - pub msgmap: ::c_int, - pub msgmax: ::c_int, - pub msgmnb: ::c_int, - pub msgmni: ::c_int, - pub msgssz: ::c_int, - pub msgtql: ::c_int, - pub msgseg: ::c_ushort, - } -} - -pub const ABDAY_1: ::nl_item = 0x20000; -pub const ABDAY_2: ::nl_item = 0x20001; -pub const ABDAY_3: ::nl_item = 0x20002; -pub const ABDAY_4: ::nl_item = 0x20003; -pub const ABDAY_5: ::nl_item = 0x20004; -pub const ABDAY_6: ::nl_item = 0x20005; -pub const ABDAY_7: ::nl_item = 0x20006; - -pub const DAY_1: ::nl_item = 0x20007; -pub const DAY_2: ::nl_item = 0x20008; -pub const DAY_3: ::nl_item = 0x20009; -pub const DAY_4: ::nl_item = 0x2000A; -pub const DAY_5: ::nl_item = 0x2000B; -pub const DAY_6: ::nl_item = 0x2000C; -pub const DAY_7: ::nl_item = 0x2000D; - -pub const ABMON_1: ::nl_item = 0x2000E; -pub const ABMON_2: ::nl_item = 0x2000F; -pub const ABMON_3: ::nl_item = 0x20010; -pub const ABMON_4: ::nl_item = 0x20011; -pub const ABMON_5: ::nl_item = 0x20012; -pub const ABMON_6: ::nl_item = 0x20013; -pub const ABMON_7: ::nl_item = 0x20014; -pub const ABMON_8: ::nl_item = 0x20015; -pub const ABMON_9: ::nl_item = 0x20016; -pub const ABMON_10: ::nl_item = 0x20017; -pub const ABMON_11: ::nl_item = 0x20018; -pub const ABMON_12: ::nl_item = 0x20019; - -pub const MON_1: ::nl_item = 0x2001A; -pub const MON_2: ::nl_item = 0x2001B; -pub const MON_3: ::nl_item = 0x2001C; -pub const MON_4: ::nl_item = 0x2001D; -pub const MON_5: ::nl_item = 0x2001E; -pub const MON_6: ::nl_item = 0x2001F; -pub const MON_7: ::nl_item = 0x20020; -pub const MON_8: ::nl_item = 0x20021; -pub const MON_9: ::nl_item = 0x20022; -pub const MON_10: ::nl_item = 0x20023; -pub const MON_11: ::nl_item = 0x20024; -pub const MON_12: ::nl_item = 0x20025; - -pub const AM_STR: ::nl_item = 0x20026; -pub const PM_STR: ::nl_item = 0x20027; - -pub const D_T_FMT: ::nl_item = 0x20028; -pub const D_FMT: ::nl_item = 0x20029; -pub const T_FMT: ::nl_item = 0x2002A; -pub const T_FMT_AMPM: ::nl_item = 0x2002B; - -pub const ERA: ::nl_item = 0x2002C; -pub const ERA_D_FMT: ::nl_item = 0x2002E; -pub const ALT_DIGITS: ::nl_item = 0x2002F; -pub const ERA_D_T_FMT: ::nl_item = 0x20030; -pub const ERA_T_FMT: ::nl_item = 0x20031; - -pub const CODESET: ::nl_item = 14; - -pub const CRNCYSTR: ::nl_item = 0x4000F; - -pub const RUSAGE_THREAD: ::c_int = 1; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const RADIXCHAR: ::nl_item = 0x10000; -pub const THOUSEP: ::nl_item = 0x10001; - -pub const YESEXPR: ::nl_item = 0x50000; -pub const NOEXPR: ::nl_item = 0x50001; -pub const YESSTR: ::nl_item = 0x50002; -pub const NOSTR: ::nl_item = 0x50003; - -pub const FILENAME_MAX: ::c_uint = 4096; -pub const L_tmpnam: ::c_uint = 20; -pub const _PC_LINK_MAX: ::c_int = 0; -pub const _PC_MAX_CANON: ::c_int = 1; -pub const _PC_MAX_INPUT: ::c_int = 2; -pub const _PC_NAME_MAX: ::c_int = 3; -pub const _PC_PATH_MAX: ::c_int = 4; -pub const _PC_PIPE_BUF: ::c_int = 5; -pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; -pub const _PC_NO_TRUNC: ::c_int = 7; -pub const _PC_VDISABLE: ::c_int = 8; - -pub const _SC_ARG_MAX: ::c_int = 0; -pub const _SC_CHILD_MAX: ::c_int = 1; -pub const _SC_CLK_TCK: ::c_int = 2; -pub const _SC_NGROUPS_MAX: ::c_int = 3; -pub const _SC_OPEN_MAX: ::c_int = 4; -pub const _SC_STREAM_MAX: ::c_int = 5; -pub const _SC_TZNAME_MAX: ::c_int = 6; -pub const _SC_JOB_CONTROL: ::c_int = 7; -pub const _SC_SAVED_IDS: ::c_int = 8; -pub const _SC_REALTIME_SIGNALS: ::c_int = 9; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; -pub const _SC_TIMERS: ::c_int = 11; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; -pub const _SC_PRIORITIZED_IO: ::c_int = 13; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; -pub const _SC_FSYNC: ::c_int = 15; -pub const _SC_MAPPED_FILES: ::c_int = 16; -pub const _SC_MEMLOCK: ::c_int = 17; -pub const _SC_MEMLOCK_RANGE: ::c_int = 18; -pub const _SC_MEMORY_PROTECTION: ::c_int = 19; -pub const _SC_MESSAGE_PASSING: ::c_int = 20; -pub const _SC_SEMAPHORES: ::c_int = 21; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; -pub const _SC_AIO_MAX: ::c_int = 24; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; -pub const _SC_DELAYTIMER_MAX: ::c_int = 26; -pub const _SC_MQ_OPEN_MAX: ::c_int = 27; -pub const _SC_MQ_PRIO_MAX: ::c_int = 28; -pub const _SC_VERSION: ::c_int = 29; -pub const _SC_PAGESIZE: ::c_int = 30; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_RTSIG_MAX: ::c_int = 31; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; -pub const _SC_SEM_VALUE_MAX: ::c_int = 33; -pub const _SC_SIGQUEUE_MAX: ::c_int = 34; -pub const _SC_TIMER_MAX: ::c_int = 35; -pub const _SC_BC_BASE_MAX: ::c_int = 36; -pub const _SC_BC_DIM_MAX: ::c_int = 37; -pub const _SC_BC_SCALE_MAX: ::c_int = 38; -pub const _SC_BC_STRING_MAX: ::c_int = 39; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; -pub const _SC_EXPR_NEST_MAX: ::c_int = 42; -pub const _SC_LINE_MAX: ::c_int = 43; -pub const _SC_RE_DUP_MAX: ::c_int = 44; -pub const _SC_2_VERSION: ::c_int = 46; -pub const _SC_2_C_BIND: ::c_int = 47; -pub const _SC_2_C_DEV: ::c_int = 48; -pub const _SC_2_FORT_DEV: ::c_int = 49; -pub const _SC_2_FORT_RUN: ::c_int = 50; -pub const _SC_2_SW_DEV: ::c_int = 51; -pub const _SC_2_LOCALEDEF: ::c_int = 52; -pub const _SC_IOV_MAX: ::c_int = 60; -pub const _SC_THREADS: ::c_int = 67; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; -pub const _SC_TTY_NAME_MAX: ::c_int = 72; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; -pub const _SC_THREAD_STACK_MIN: ::c_int = 75; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; -pub const _SC_ATEXIT_MAX: ::c_int = 87; -pub const _SC_XOPEN_VERSION: ::c_int = 89; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; -pub const _SC_XOPEN_UNIX: ::c_int = 91; -pub const _SC_XOPEN_CRYPT: ::c_int = 92; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; -pub const _SC_XOPEN_SHM: ::c_int = 94; -pub const _SC_2_CHAR_TERM: ::c_int = 95; -pub const _SC_2_UPE: ::c_int = 97; -pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; -pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; -pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; -pub const _SC_XOPEN_LEGACY: ::c_int = 129; -pub const _SC_XOPEN_REALTIME: ::c_int = 130; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; -pub const _SC_HOST_NAME_MAX: ::c_int = 180; - -pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; -pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; - -pub const GLOB_ERR: ::c_int = 1 << 0; -pub const GLOB_MARK: ::c_int = 1 << 1; -pub const GLOB_NOSORT: ::c_int = 1 << 2; -pub const GLOB_DOOFFS: ::c_int = 1 << 3; -pub const GLOB_NOCHECK: ::c_int = 1 << 4; -pub const GLOB_APPEND: ::c_int = 1 << 5; -pub const GLOB_NOESCAPE: ::c_int = 1 << 6; - -pub const GLOB_NOSPACE: ::c_int = 1; -pub const GLOB_ABORTED: ::c_int = 2; -pub const GLOB_NOMATCH: ::c_int = 3; - -pub const POSIX_MADV_NORMAL: ::c_int = 0; -pub const POSIX_MADV_RANDOM: ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_MADV_WILLNEED: ::c_int = 3; - -pub const S_IEXEC: mode_t = 64; -pub const S_IWRITE: mode_t = 128; -pub const S_IREAD: mode_t = 256; - -pub const F_LOCK: ::c_int = 1; -pub const F_TEST: ::c_int = 3; -pub const F_TLOCK: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; - -pub const ST_RDONLY: ::c_ulong = 1; -pub const ST_NOSUID: ::c_ulong = 2; -pub const ST_NODEV: ::c_ulong = 4; -pub const ST_NOEXEC: ::c_ulong = 8; -pub const ST_SYNCHRONOUS: ::c_ulong = 16; -pub const ST_MANDLOCK: ::c_ulong = 64; -pub const ST_WRITE: ::c_ulong = 128; -pub const ST_APPEND: ::c_ulong = 256; -pub const ST_IMMUTABLE: ::c_ulong = 512; -pub const ST_NOATIME: ::c_ulong = 1024; -pub const ST_NODIRATIME: ::c_ulong = 2048; - -pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; -pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; -pub const RTLD_NODELETE: ::c_int = 0x1000; -pub const RTLD_NOW: ::c_int = 0x2; - -pub const TCP_MD5SIG: ::c_int = 14; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - __align: [], - size: [0; __SIZEOF_PTHREAD_MUTEX_T], -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - __align: [], - size: [0; __SIZEOF_PTHREAD_COND_T], -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - __align: [], - size: [0; __SIZEOF_PTHREAD_RWLOCK_T], -}; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; -pub const __SIZEOF_PTHREAD_COND_T: usize = 48; - -pub const SCHED_OTHER: ::c_int = 0; -pub const SCHED_FIFO: ::c_int = 1; -pub const SCHED_RR: ::c_int = 2; -pub const SCHED_BATCH: ::c_int = 3; -pub const SCHED_IDLE: ::c_int = 5; - -pub const AF_IB: ::c_int = 27; -pub const AF_MPLS: ::c_int = 28; -pub const AF_NFC: ::c_int = 39; -pub const AF_VSOCK: ::c_int = 40; -#[doc(hidden)] -pub const AF_MAX: ::c_int = 42; -pub const PF_IB: ::c_int = AF_IB; -pub const PF_MPLS: ::c_int = AF_MPLS; -pub const PF_NFC: ::c_int = AF_NFC; -pub const PF_VSOCK: ::c_int = AF_VSOCK; -#[doc(hidden)] -pub const PF_MAX: ::c_int = AF_MAX; - -// System V IPC -pub const IPC_PRIVATE: ::key_t = 0; - -pub const IPC_CREAT: ::c_int = 0o1000; -pub const IPC_EXCL: ::c_int = 0o2000; -pub const IPC_NOWAIT: ::c_int = 0o4000; - -pub const IPC_RMID: ::c_int = 0; -pub const IPC_SET: ::c_int = 1; -pub const IPC_STAT: ::c_int = 2; -pub const IPC_INFO: ::c_int = 3; -pub const MSG_STAT: ::c_int = 11; -pub const MSG_INFO: ::c_int = 12; - -pub const MSG_NOERROR: ::c_int = 0o10000; -pub const MSG_EXCEPT: ::c_int = 0o20000; -pub const MSG_COPY: ::c_int = 0o40000; - -pub const SHM_R: ::c_int = 0o400; -pub const SHM_W: ::c_int = 0o200; - -pub const SHM_RDONLY: ::c_int = 0o10000; -pub const SHM_RND: ::c_int = 0o20000; -pub const SHM_REMAP: ::c_int = 0o40000; -pub const SHM_EXEC: ::c_int = 0o100000; - -pub const SHM_LOCK: ::c_int = 11; -pub const SHM_UNLOCK: ::c_int = 12; - -pub const SHM_HUGETLB: ::c_int = 0o4000; -pub const SHM_NORESERVE: ::c_int = 0o10000; - -pub const EPOLLRDHUP: ::c_int = 0x2000; -pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; -pub const EPOLLONESHOT: ::c_int = 0x40000000; - -pub const QFMT_VFS_OLD: ::c_int = 1; -pub const QFMT_VFS_V0: ::c_int = 2; - -pub const EFD_SEMAPHORE: ::c_int = 0x1; - -pub const LOG_NFACILITIES: ::c_int = 24; - -pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; - -pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; -pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; -pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; -pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; -pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; -pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; -pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; - -pub const AI_PASSIVE: ::c_int = 0x0001; -pub const AI_CANONNAME: ::c_int = 0x0002; -pub const AI_NUMERICHOST: ::c_int = 0x0004; -pub const AI_V4MAPPED: ::c_int = 0x0008; -pub const AI_ALL: ::c_int = 0x0010; -pub const AI_ADDRCONFIG: ::c_int = 0x0020; - -pub const AI_NUMERICSERV: ::c_int = 0x0400; - -pub const EAI_BADFLAGS: ::c_int = -1; -pub const EAI_NONAME: ::c_int = -2; -pub const EAI_AGAIN: ::c_int = -3; -pub const EAI_FAIL: ::c_int = -4; -pub const EAI_FAMILY: ::c_int = -6; -pub const EAI_SOCKTYPE: ::c_int = -7; -pub const EAI_SERVICE: ::c_int = -8; -pub const EAI_MEMORY: ::c_int = -10; -pub const EAI_OVERFLOW: ::c_int = -12; - -pub const NI_NUMERICHOST: ::c_int = 1; -pub const NI_NUMERICSERV: ::c_int = 2; -pub const NI_NOFQDN: ::c_int = 4; -pub const NI_NAMEREQD: ::c_int = 8; -pub const NI_DGRAM: ::c_int = 16; - -pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; -pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; -pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; - -pub const EAI_SYSTEM: ::c_int = -11; - -pub const AIO_CANCELED: ::c_int = 0; -pub const AIO_NOTCANCELED: ::c_int = 1; -pub const AIO_ALLDONE: ::c_int = 2; -pub const LIO_READ: ::c_int = 0; -pub const LIO_WRITE: ::c_int = 1; -pub const LIO_NOP: ::c_int = 2; -pub const LIO_WAIT: ::c_int = 0; -pub const LIO_NOWAIT: ::c_int = 1; - -pub const MREMAP_MAYMOVE: ::c_int = 1; -pub const MREMAP_FIXED: ::c_int = 2; - -pub const PR_SET_PDEATHSIG: ::c_int = 1; -pub const PR_GET_PDEATHSIG: ::c_int = 2; - -pub const PR_GET_DUMPABLE: ::c_int = 3; -pub const PR_SET_DUMPABLE: ::c_int = 4; - -pub const PR_GET_UNALIGN: ::c_int = 5; -pub const PR_SET_UNALIGN: ::c_int = 6; -pub const PR_UNALIGN_NOPRINT: ::c_int = 1; -pub const PR_UNALIGN_SIGBUS: ::c_int = 2; - -pub const PR_GET_KEEPCAPS: ::c_int = 7; -pub const PR_SET_KEEPCAPS: ::c_int = 8; - -pub const PR_GET_FPEMU: ::c_int = 9; -pub const PR_SET_FPEMU: ::c_int = 10; -pub const PR_FPEMU_NOPRINT: ::c_int = 1; -pub const PR_FPEMU_SIGFPE: ::c_int = 2; - -pub const PR_GET_FPEXC: ::c_int = 11; -pub const PR_SET_FPEXC: ::c_int = 12; -pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; -pub const PR_FP_EXC_DIV: ::c_int = 0x010000; -pub const PR_FP_EXC_OVF: ::c_int = 0x020000; -pub const PR_FP_EXC_UND: ::c_int = 0x040000; -pub const PR_FP_EXC_RES: ::c_int = 0x080000; -pub const PR_FP_EXC_INV: ::c_int = 0x100000; -pub const PR_FP_EXC_DISABLED: ::c_int = 0; -pub const PR_FP_EXC_NONRECOV: ::c_int = 1; -pub const PR_FP_EXC_ASYNC: ::c_int = 2; -pub const PR_FP_EXC_PRECISE: ::c_int = 3; - -pub const PR_GET_TIMING: ::c_int = 13; -pub const PR_SET_TIMING: ::c_int = 14; -pub const PR_TIMING_STATISTICAL: ::c_int = 0; -pub const PR_TIMING_TIMESTAMP: ::c_int = 1; - -pub const PR_SET_NAME: ::c_int = 15; -pub const PR_GET_NAME: ::c_int = 16; - -pub const PR_GET_ENDIAN: ::c_int = 19; -pub const PR_SET_ENDIAN: ::c_int = 20; -pub const PR_ENDIAN_BIG: ::c_int = 0; -pub const PR_ENDIAN_LITTLE: ::c_int = 1; -pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; - -pub const PR_GET_SECCOMP: ::c_int = 21; -pub const PR_SET_SECCOMP: ::c_int = 22; - -pub const PR_CAPBSET_READ: ::c_int = 23; -pub const PR_CAPBSET_DROP: ::c_int = 24; - -pub const PR_GET_TSC: ::c_int = 25; -pub const PR_SET_TSC: ::c_int = 26; -pub const PR_TSC_ENABLE: ::c_int = 1; -pub const PR_TSC_SIGSEGV: ::c_int = 2; - -pub const PR_GET_SECUREBITS: ::c_int = 27; -pub const PR_SET_SECUREBITS: ::c_int = 28; - -pub const PR_SET_TIMERSLACK: ::c_int = 29; -pub const PR_GET_TIMERSLACK: ::c_int = 30; - -pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; -pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; - -pub const PR_MCE_KILL: ::c_int = 33; -pub const PR_MCE_KILL_CLEAR: ::c_int = 0; -pub const PR_MCE_KILL_SET: ::c_int = 1; - -pub const PR_MCE_KILL_LATE: ::c_int = 0; -pub const PR_MCE_KILL_EARLY: ::c_int = 1; -pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; - -pub const PR_MCE_KILL_GET: ::c_int = 34; - -pub const PR_SET_MM: ::c_int = 35; -pub const PR_SET_MM_START_CODE: ::c_int = 1; -pub const PR_SET_MM_END_CODE: ::c_int = 2; -pub const PR_SET_MM_START_DATA: ::c_int = 3; -pub const PR_SET_MM_END_DATA: ::c_int = 4; -pub const PR_SET_MM_START_STACK: ::c_int = 5; -pub const PR_SET_MM_START_BRK: ::c_int = 6; -pub const PR_SET_MM_BRK: ::c_int = 7; -pub const PR_SET_MM_ARG_START: ::c_int = 8; -pub const PR_SET_MM_ARG_END: ::c_int = 9; -pub const PR_SET_MM_ENV_START: ::c_int = 10; -pub const PR_SET_MM_ENV_END: ::c_int = 11; -pub const PR_SET_MM_AUXV: ::c_int = 12; -pub const PR_SET_MM_EXE_FILE: ::c_int = 13; -pub const PR_SET_MM_MAP: ::c_int = 14; -pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; - -pub const PR_SET_PTRACER: ::c_int = 0x59616d61; - -pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; -pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; - -pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; -pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; - -pub const PR_GET_TID_ADDRESS: ::c_int = 40; - -pub const PR_SET_THP_DISABLE: ::c_int = 41; -pub const PR_GET_THP_DISABLE: ::c_int = 42; - -pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43; -pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44; - -pub const PR_SET_FP_MODE: ::c_int = 45; -pub const PR_GET_FP_MODE: ::c_int = 46; -pub const PR_FP_MODE_FR: ::c_int = 1 << 0; -pub const PR_FP_MODE_FRE: ::c_int = 1 << 1; - -pub const PR_CAP_AMBIENT: ::c_int = 47; -pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1; -pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2; -pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3; -pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4; - -f! { - pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { - for slot in cpuset.bits.iter_mut() { - *slot = 0; - } - } - - pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] |= 1 << offset; - () - } - - pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] &= !(1 << offset); - () - } - - pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { - let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - 0 != (cpuset.bits[idx] & (1 << offset)) - } - - pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { - set1.bits == set2.bits - } -} - -extern { - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int, - timeout: *const ::timespec) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb, - nitems: ::c_int, sevp: *mut ::sigevent) -> ::c_int; - - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - - pub fn setpwent(); - pub fn getpwent() -> *mut passwd; - pub fn setspent(); - pub fn endspent(); - pub fn getspent() -> *mut spwd; - pub fn getspnam(__name: *const ::c_char) -> *mut spwd; - - pub fn shm_open(name: *const c_char, oflag: ::c_int, - mode: mode_t) -> ::c_int; - - // System V IPC - pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; - pub fn shmat(shmid: ::c_int, - shmaddr: *const ::c_void, - shmflg: ::c_int) -> *mut ::c_void; - pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; - pub fn shmctl(shmid: ::c_int, - cmd: ::c_int, - buf: *mut ::shmid_ds) -> ::c_int; - pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; - pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; - pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; - pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t, - msgtyp: ::c_long, msgflg: ::c_int) -> ::ssize_t; - pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t, - msgflg: ::c_int) -> ::c_int; - - pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn __errno_location() -> *mut ::c_int; - - pub fn fopen64(filename: *const c_char, - mode: *const c_char) -> *mut ::FILE; - pub fn freopen64(filename: *const c_char, mode: *const c_char, - file: *mut ::FILE) -> *mut ::FILE; - pub fn tmpfile64() -> *mut ::FILE; - pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; - pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; - pub fn fseeko64(stream: *mut ::FILE, - offset: ::off64_t, - whence: ::c_int) -> ::c_int; - pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; - pub fn fallocate(fd: ::c_int, mode: ::c_int, - offset: ::off_t, len: ::off_t) -> ::c_int; - pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, - len: ::off_t) -> ::c_int; - pub fn readahead(fd: ::c_int, offset: ::off64_t, - count: ::size_t) -> ::ssize_t; - pub fn getxattr(path: *const c_char, name: *const c_char, - value: *mut ::c_void, size: ::size_t) -> ::ssize_t; - pub fn lgetxattr(path: *const c_char, name: *const c_char, - value: *mut ::c_void, size: ::size_t) -> ::ssize_t; - pub fn fgetxattr(filedes: ::c_int, name: *const c_char, - value: *mut ::c_void, size: ::size_t) -> ::ssize_t; - pub fn setxattr(path: *const c_char, name: *const c_char, - value: *const ::c_void, size: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn lsetxattr(path: *const c_char, name: *const c_char, - value: *const ::c_void, size: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn fsetxattr(filedes: ::c_int, name: *const c_char, - value: *const ::c_void, size: ::size_t, - flags: ::c_int) -> ::c_int; - pub fn listxattr(path: *const c_char, list: *mut c_char, - size: ::size_t) -> ::ssize_t; - pub fn llistxattr(path: *const c_char, list: *mut c_char, - size: ::size_t) -> ::ssize_t; - pub fn flistxattr(filedes: ::c_int, list: *mut c_char, - size: ::size_t) -> ::ssize_t; - pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; - pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; - pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; - pub fn signalfd(fd: ::c_int, - mask: *const ::sigset_t, - flags: ::c_int) -> ::c_int; - pub fn pwritev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t) -> ::ssize_t; - pub fn preadv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t) -> ::ssize_t; - pub fn quotactl(cmd: ::c_int, - special: *const ::c_char, - id: ::c_int, - data: *mut ::c_char) -> ::c_int; - pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; - pub fn mq_close(mqd: ::mqd_t) -> ::c_int; - pub fn mq_unlink(name: *const ::c_char) -> ::c_int; - pub fn mq_receive(mqd: ::mqd_t, - msg_ptr: *mut ::c_char, - msg_len: ::size_t, - msq_prio: *mut ::c_uint) -> ::ssize_t; - pub fn mq_send(mqd: ::mqd_t, - msg_ptr: *const ::c_char, - msg_len: ::size_t, - msq_prio: ::c_uint) -> ::c_int; - pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; - pub fn mq_setattr(mqd: ::mqd_t, - newattr: *const ::mq_attr, - oldattr: *mut ::mq_attr) -> ::c_int; - pub fn epoll_pwait(epfd: ::c_int, - events: *mut ::epoll_event, - maxevents: ::c_int, - timeout: ::c_int, - sigmask: *const ::sigset_t) -> ::c_int; - pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; - pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; - pub fn mkostemps(template: *mut ::c_char, - suffixlen: ::c_int, - flags: ::c_int) -> ::c_int; - pub fn sigtimedwait(set: *const sigset_t, - info: *mut siginfo_t, - timeout: *const ::timespec) -> ::c_int; - pub fn sigwaitinfo(set: *const sigset_t, - info: *mut siginfo_t) -> ::c_int; - pub fn openpty(amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *const termios, - winp: *const ::winsize) -> ::c_int; - pub fn forkpty(amaster: *mut ::c_int, - name: *mut ::c_char, - termp: *const termios, - winp: *const ::winsize) -> ::pid_t; - pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int) -> ::c_int; - pub fn prlimit(pid: ::pid_t, resource: ::c_int, new_limit: *const ::rlimit, - old_limit: *mut ::rlimit) -> ::c_int; - pub fn prlimit64(pid: ::pid_t, - resource: ::c_int, - new_limit: *const ::rlimit64, - old_limit: *mut ::rlimit64) -> ::c_int; - pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; - pub fn process_vm_readv(pid: ::pid_t, - local_iov: *const ::iovec, - liovcnt: ::c_ulong, - remote_iov: *const ::iovec, - riovcnt: ::c_ulong, - flags: ::c_ulong) -> isize; - pub fn process_vm_writev(pid: ::pid_t, - local_iov: *const ::iovec, - liovcnt: ::c_ulong, - remote_iov: *const ::iovec, - riovcnt: ::c_ulong, - flags: ::c_ulong) -> isize; - pub fn reboot(how_to: ::c_int) -> ::c_int; - pub fn setfsgid(gid: ::gid_t) -> ::c_int; - pub fn setfsuid(uid: ::uid_t) -> ::c_int; - pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; - pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; - - // Not available now on Android - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn if_nameindex() -> *mut if_nameindex; - pub fn if_freenameindex(ptr: *mut if_nameindex); - pub fn sync_file_range(fd: ::c_int, offset: ::off64_t, - nbytes: ::off64_t, flags: ::c_uint) -> ::c_int; - pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; - pub fn freeifaddrs(ifa: *mut ::ifaddrs); - - pub fn mremap(addr: *mut ::c_void, - len: ::size_t, - new_len: ::size_t, - flags: ::c_int, - ...) -> *mut ::c_void; - - pub fn glob(pattern: *const c_char, - flags: ::c_int, - errfunc: Option ::c_int>, - pglob: *mut ::glob_t) -> ::c_int; - pub fn globfree(pglob: *mut ::glob_t); - - pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn shm_unlink(name: *const ::c_char) -> ::c_int; - - pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); - - pub fn telldir(dirp: *mut ::DIR) -> ::c_long; - pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; - - pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t) -> ::ssize_t; - pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; - pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; - - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: ::socklen_t) -> ::c_int; - - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::ssize_t; - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) - -> ::ssize_t; -} - -cfg_if! { - if #[cfg(any(target_env = "musl", - target_os = "fuchsia", - target_os = "emscripten"))] { - mod musl; - pub use self::musl::*; - } else if #[cfg(any(target_arch = "mips", - target_arch = "mips64"))] { - mod mips; - pub use self::mips::*; - } else if #[cfg(any(target_arch = "s390x"))] { - mod s390x; - pub use self::s390x::*; - } else { - mod other; - pub use self::other::*; - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs deleted file mode 100644 index ce198aca9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/arm.rs +++ /dev/null @@ -1,346 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_int, - pub shm_dtime: ::time_t, - __unused2: ::c_int, - pub shm_ctime: ::time_t, - __unused3: ::c_int, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::c_ulong, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __unused1: ::c_int, - pub msg_rtime: ::time_t, - __unused2: ::c_int, - pub msg_ctime: ::time_t, - __unused3: ::c_int, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_flags: ::c_ulong, - pub f_spare: [::c_ulong; 4], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } -} - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const O_ASYNC: ::c_int = 0x2000; - -pub const FIOCLEX: ::c_int = 0x5451; -pub const FIONBIO: ::c_int = 0x5421; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_NPROC: ::c_int = 6; -pub const RLIMIT_MEMLOCK: ::c_int = 8; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; - -pub const SOCK_NONBLOCK: ::c_int = 2048; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EDEADLOCK: ::c_int = EDEADLK; -pub const EMULTIHOP: ::c_int = 72; -pub const EBADMSG: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const ERFKILL: ::c_int = 132; -pub const EHWPOISON: ::c_int = 133; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const F_GETLK: ::c_int = 12; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETLK: ::c_int = 13; -pub const F_SETLKW: ::c_int = 14; -pub const F_SETOWN: ::c_int = 8; - -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const TCGETS: ::c_int = 0x5401; -pub const TCSETS: ::c_int = 0x5402; -pub const TCSETSW: ::c_int = 0x5403; -pub const TCSETSF: ::c_int = 0x5404; -pub const TCGETA: ::c_int = 0x5405; -pub const TCSETA: ::c_int = 0x5406; -pub const TCSETAW: ::c_int = 0x5407; -pub const TCSETAF: ::c_int = 0x5408; -pub const TCSBRK: ::c_int = 0x5409; -pub const TCXONC: ::c_int = 0x540A; -pub const TCFLSH: ::c_int = 0x540B; -pub const TIOCGSOFTCAR: ::c_int = 0x5419; -pub const TIOCSSOFTCAR: ::c_int = 0x541A; -pub const TIOCLINUX: ::c_int = 0x541C; -pub const TIOCGSERIAL: ::c_int = 0x541E; -pub const TIOCEXCL: ::c_int = 0x540C; -pub const TIOCNXCL: ::c_int = 0x540D; -pub const TIOCSCTTY: ::c_int = 0x540E; -pub const TIOCGPGRP: ::c_int = 0x540F; -pub const TIOCSPGRP: ::c_int = 0x5410; -pub const TIOCOUTQ: ::c_int = 0x5411; -pub const TIOCSTI: ::c_int = 0x5412; -pub const TIOCGWINSZ: ::c_int = 0x5413; -pub const TIOCSWINSZ: ::c_int = 0x5414; -pub const TIOCMGET: ::c_int = 0x5415; -pub const TIOCMBIS: ::c_int = 0x5416; -pub const TIOCMBIC: ::c_int = 0x5417; -pub const TIOCMSET: ::c_int = 0x5418; -pub const FIONREAD: ::c_int = 0x541B; -pub const TIOCCONS: ::c_int = 0x541D; - -pub const SYS_gettid: ::c_long = 224; -pub const SYS_perf_event_open: ::c_long = 364; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs deleted file mode 100644 index e890a3458..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/asmjs.rs +++ /dev/null @@ -1,336 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_int, - pub shm_dtime: ::time_t, - __unused2: ::c_int, - pub shm_ctime: ::time_t, - __unused3: ::c_int, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::c_ulong, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __unused1: ::c_int, - pub msg_rtime: ::time_t, - __unused2: ::c_int, - pub msg_ctime: ::time_t, - __unused3: ::c_int, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_flags: ::c_ulong, - pub f_spare: [::c_ulong; 4], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } -} - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const O_ASYNC: ::c_int = 0x2000; - -pub const FIOCLEX: ::c_int = 0x5451; -pub const FIONBIO: ::c_int = 0x5421; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_NPROC: ::c_int = 6; -pub const RLIMIT_MEMLOCK: ::c_int = 8; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; - -pub const SOCK_NONBLOCK: ::c_int = 2048; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EDEADLOCK: ::c_int = EDEADLK; -pub const EMULTIHOP: ::c_int = 72; -pub const EBADMSG: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const ERFKILL: ::c_int = 132; -pub const EHWPOISON: ::c_int = 133; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_LINGER: ::c_int = 13; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_ACCEPTCONN: ::c_int = 30; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const F_GETLK: ::c_int = 12; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETLK: ::c_int = 13; -pub const F_SETLKW: ::c_int = 14; -pub const F_SETOWN: ::c_int = 8; - -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const TCGETS: ::c_int = 0x5401; -pub const TCSETS: ::c_int = 0x5402; -pub const TCSETSW: ::c_int = 0x5403; -pub const TCSETSF: ::c_int = 0x5404; -pub const TCGETA: ::c_int = 0x5405; -pub const TCSETA: ::c_int = 0x5406; -pub const TCSETAW: ::c_int = 0x5407; -pub const TCSETAF: ::c_int = 0x5408; -pub const TCSBRK: ::c_int = 0x5409; -pub const TCXONC: ::c_int = 0x540A; -pub const TCFLSH: ::c_int = 0x540B; -pub const TIOCGSOFTCAR: ::c_int = 0x5419; -pub const TIOCSSOFTCAR: ::c_int = 0x541A; -pub const TIOCLINUX: ::c_int = 0x541C; -pub const TIOCGSERIAL: ::c_int = 0x541E; -pub const TIOCEXCL: ::c_int = 0x540C; -pub const TIOCNXCL: ::c_int = 0x540D; -pub const TIOCSCTTY: ::c_int = 0x540E; -pub const TIOCGPGRP: ::c_int = 0x540F; -pub const TIOCSPGRP: ::c_int = 0x5410; -pub const TIOCOUTQ: ::c_int = 0x5411; -pub const TIOCSTI: ::c_int = 0x5412; -pub const TIOCGWINSZ: ::c_int = 0x5413; -pub const TIOCSWINSZ: ::c_int = 0x5414; -pub const TIOCMGET: ::c_int = 0x5415; -pub const TIOCMBIS: ::c_int = 0x5416; -pub const TIOCMBIC: ::c_int = 0x5417; -pub const TIOCMSET: ::c_int = 0x5418; -pub const FIONREAD: ::c_int = 0x541B; -pub const TIOCCONS: ::c_int = 0x541D; - -pub const SYS_gettid: ::c_long = 224; // Valid for arm (32-bit) and x86 (32-bit) - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs deleted file mode 100644 index 23c1a267e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mips.rs +++ /dev/null @@ -1,354 +0,0 @@ -pub type c_char = i8; -pub type wchar_t = ::c_int; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __st_padding1: [::c_long; 2], - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_padding2: [::c_long; 2], - pub st_size: ::off_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - __st_padding3: ::c_long, - pub st_blocks: ::blkcnt_t, - __st_padding4: [::c_long; 14], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __st_padding1: [::c_long; 2], - pub st_ino: ::ino64_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_padding2: [::c_long; 2], - pub st_size: ::off_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - __st_padding3: ::c_long, - pub st_blocks: ::blkcnt64_t, - __st_padding4: [::c_long; 14], - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::c_ulong, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - #[cfg(target_endian = "big")] - __unused1: ::c_int, - pub msg_stime: ::time_t, - #[cfg(target_endian = "little")] - __unused1: ::c_int, - #[cfg(target_endian = "big")] - __unused2: ::c_int, - pub msg_rtime: ::time_t, - #[cfg(target_endian = "little")] - __unused2: ::c_int, - #[cfg(target_endian = "big")] - __unused3: ::c_int, - pub msg_ctime: ::time_t, - #[cfg(target_endian = "little")] - __unused3: ::c_int, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_ulong, - pub f_flags: ::c_ulong, - pub f_spare: [::c_ulong; 5], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } -} - -pub const O_DIRECT: ::c_int = 0o100000; -pub const O_DIRECTORY: ::c_int = 0o200000; -pub const O_NOFOLLOW: ::c_int = 0o400000; -pub const O_ASYNC: ::c_int = 0o10000; - -pub const FIOCLEX: ::c_int = 0x6601; -pub const FIONBIO: ::c_int = 0x667E; - -pub const RLIMIT_RSS: ::c_int = 7; -pub const RLIMIT_NOFILE: ::c_int = 5; -pub const RLIMIT_AS: ::c_int = 6; -pub const RLIMIT_NPROC: ::c_int = 8; -pub const RLIMIT_MEMLOCK: ::c_int = 9; - -pub const O_APPEND: ::c_int = 0o010; -pub const O_CREAT: ::c_int = 0o400; -pub const O_EXCL: ::c_int = 0o2000; -pub const O_NOCTTY: ::c_int = 0o4000; -pub const O_NONBLOCK: ::c_int = 0o200; -pub const O_SYNC: ::c_int = 0o40020; -pub const O_RSYNC: ::c_int = 0o40020; -pub const O_DSYNC: ::c_int = 0o020; - -pub const SOCK_NONBLOCK: ::c_int = 0o200; - -pub const MAP_ANON: ::c_int = 0x800; -pub const MAP_GROWSDOWN: ::c_int = 0x1000; -pub const MAP_DENYWRITE: ::c_int = 0x2000; -pub const MAP_EXECUTABLE: ::c_int = 0x4000; -pub const MAP_LOCKED: ::c_int = 0x8000; -pub const MAP_NORESERVE: ::c_int = 0x0400; -pub const MAP_POPULATE: ::c_int = 0x10000; -pub const MAP_NONBLOCK: ::c_int = 0x20000; -pub const MAP_STACK: ::c_int = 0x40000; - -pub const EDEADLK: ::c_int = 45; -pub const ENAMETOOLONG: ::c_int = 78; -pub const ENOLCK: ::c_int = 46; -pub const ENOSYS: ::c_int = 89; -pub const ENOTEMPTY: ::c_int = 93; -pub const ELOOP: ::c_int = 90; -pub const ENOMSG: ::c_int = 35; -pub const EIDRM: ::c_int = 36; -pub const ECHRNG: ::c_int = 37; -pub const EL2NSYNC: ::c_int = 38; -pub const EL3HLT: ::c_int = 39; -pub const EL3RST: ::c_int = 40; -pub const ELNRNG: ::c_int = 41; -pub const EUNATCH: ::c_int = 42; -pub const ENOCSI: ::c_int = 43; -pub const EL2HLT: ::c_int = 44; -pub const EBADE: ::c_int = 50; -pub const EBADR: ::c_int = 51; -pub const EXFULL: ::c_int = 52; -pub const ENOANO: ::c_int = 53; -pub const EBADRQC: ::c_int = 54; -pub const EBADSLT: ::c_int = 55; -pub const EDEADLOCK: ::c_int = 56; -pub const EMULTIHOP: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 79; -pub const ENOTUNIQ: ::c_int = 80; -pub const EBADFD: ::c_int = 81; -pub const EBADMSG: ::c_int = 77; -pub const EREMCHG: ::c_int = 82; -pub const ELIBACC: ::c_int = 83; -pub const ELIBBAD: ::c_int = 84; -pub const ELIBSCN: ::c_int = 85; -pub const ELIBMAX: ::c_int = 86; -pub const ELIBEXEC: ::c_int = 87; -pub const EILSEQ: ::c_int = 88; -pub const ERESTART: ::c_int = 91; -pub const ESTRPIPE: ::c_int = 92; -pub const EUSERS: ::c_int = 94; -pub const ENOTSOCK: ::c_int = 95; -pub const EDESTADDRREQ: ::c_int = 96; -pub const EMSGSIZE: ::c_int = 97; -pub const EPROTOTYPE: ::c_int = 98; -pub const ENOPROTOOPT: ::c_int = 99; -pub const EPROTONOSUPPORT: ::c_int = 120; -pub const ESOCKTNOSUPPORT: ::c_int = 121; -pub const EOPNOTSUPP: ::c_int = 122; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 123; -pub const EAFNOSUPPORT: ::c_int = 124; -pub const EADDRINUSE: ::c_int = 125; -pub const EADDRNOTAVAIL: ::c_int = 126; -pub const ENETDOWN: ::c_int = 127; -pub const ENETUNREACH: ::c_int = 128; -pub const ENETRESET: ::c_int = 129; -pub const ECONNABORTED: ::c_int = 130; -pub const ECONNRESET: ::c_int = 131; -pub const ENOBUFS: ::c_int = 132; -pub const EISCONN: ::c_int = 133; -pub const ENOTCONN: ::c_int = 134; -pub const ESHUTDOWN: ::c_int = 143; -pub const ETOOMANYREFS: ::c_int = 144; -pub const ETIMEDOUT: ::c_int = 145; -pub const ECONNREFUSED: ::c_int = 146; -pub const EHOSTDOWN: ::c_int = 147; -pub const EHOSTUNREACH: ::c_int = 148; -pub const EALREADY: ::c_int = 149; -pub const EINPROGRESS: ::c_int = 150; -pub const ESTALE: ::c_int = 151; -pub const EUCLEAN: ::c_int = 135; -pub const ENOTNAM: ::c_int = 137; -pub const ENAVAIL: ::c_int = 138; -pub const EISNAM: ::c_int = 139; -pub const EREMOTEIO: ::c_int = 140; -pub const EDQUOT: ::c_int = 1133; -pub const ENOMEDIUM: ::c_int = 159; -pub const EMEDIUMTYPE: ::c_int = 160; -pub const ECANCELED: ::c_int = 158; -pub const ENOKEY: ::c_int = 161; -pub const EKEYEXPIRED: ::c_int = 162; -pub const EKEYREVOKED: ::c_int = 163; -pub const EKEYREJECTED: ::c_int = 164; -pub const EOWNERDEAD: ::c_int = 165; -pub const ENOTRECOVERABLE: ::c_int = 166; -pub const EHWPOISON: ::c_int = 168; -pub const ERFKILL: ::c_int = 167; - -pub const SOCK_STREAM: ::c_int = 2; -pub const SOCK_DGRAM: ::c_int = 1; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 65535; - -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_REUSEPORT: ::c_int = 0x0200; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_TYPE: ::c_int = 0x1008; -pub const SO_ACCEPTCONN: ::c_int = 0x1009; -pub const SO_PROTOCOL: ::c_int = 0x1028; -pub const SO_DOMAIN: ::c_int = 0x1029; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_PASSCRED: ::c_int = 17; -pub const SO_PEERCRED: ::c_int = 18; -pub const SO_SNDBUFFORCE: ::c_int = 31; -pub const SO_RCVBUFFORCE: ::c_int = 33; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 8; -pub const SA_NOCLDWAIT: ::c_int = 0x10000; - -pub const SIGCHLD: ::c_int = 18; -pub const SIGBUS: ::c_int = 10; -pub const SIGTTIN: ::c_int = 26; -pub const SIGTTOU: ::c_int = 27; -pub const SIGXCPU: ::c_int = 30; -pub const SIGXFSZ: ::c_int = 31; -pub const SIGVTALRM: ::c_int = 28; -pub const SIGPROF: ::c_int = 29; -pub const SIGWINCH: ::c_int = 20; -pub const SIGUSR1: ::c_int = 16; -pub const SIGUSR2: ::c_int = 17; -pub const SIGCONT: ::c_int = 25; -pub const SIGSTOP: ::c_int = 23; -pub const SIGTSTP: ::c_int = 24; -pub const SIGURG: ::c_int = 21; -pub const SIGIO: ::c_int = 22; -pub const SIGSYS: ::c_int = 12; -pub const SIGSTKFLT: ::c_int = 7; -pub const SIGPOLL: ::c_int = ::SIGIO; -pub const SIGPWR: ::c_int = 19; -pub const SIG_SETMASK: ::c_int = 3; -pub const SIG_BLOCK: ::c_int = 1; -pub const SIG_UNBLOCK: ::c_int = 2; - -pub const EXTPROC: ::tcflag_t = 0o200000; - -pub const MAP_HUGETLB: ::c_int = 0x80000; - -pub const F_GETLK: ::c_int = 33; -pub const F_GETOWN: ::c_int = 23; -pub const F_SETLK: ::c_int = 34; -pub const F_SETLKW: ::c_int = 35; -pub const F_SETOWN: ::c_int = 24; - -pub const VEOF: usize = 16; -pub const VEOL: usize = 17; -pub const VEOL2: usize = 6; -pub const VMIN: usize = 4; -pub const IEXTEN: ::tcflag_t = 0o000400; -pub const TOSTOP: ::tcflag_t = 0o100000; -pub const FLUSHO: ::tcflag_t = 0o020000; - -pub const TCGETS: ::c_int = 0x540D; -pub const TCSETS: ::c_int = 0x540E; -pub const TCSETSW: ::c_int = 0x540F; -pub const TCSETSF: ::c_int = 0x5410; -pub const TCGETA: ::c_int = 0x5401; -pub const TCSETA: ::c_int = 0x5402; -pub const TCSETAW: ::c_int = 0x5403; -pub const TCSETAF: ::c_int = 0x5404; -pub const TCSBRK: ::c_int = 0x5405; -pub const TCXONC: ::c_int = 0x5406; -pub const TCFLSH: ::c_int = 0x5407; -pub const TIOCGSOFTCAR: ::c_int = 0x5481; -pub const TIOCSSOFTCAR: ::c_int = 0x5482; -pub const TIOCLINUX: ::c_int = 0x5483; -pub const TIOCGSERIAL: ::c_int = 0x5484; -pub const TIOCEXCL: ::c_int = 0x740D; -pub const TIOCNXCL: ::c_int = 0x740E; -pub const TIOCSCTTY: ::c_int = 0x5480; -pub const TIOCGPGRP: ::c_int = 0x40047477; -pub const TIOCSPGRP: ::c_int = 0x80047476; -pub const TIOCOUTQ: ::c_int = 0x7472; -pub const TIOCSTI: ::c_int = 0x5472; -pub const TIOCGWINSZ: ::c_int = 0x40087468; -pub const TIOCSWINSZ: ::c_int = 0x80087467; -pub const TIOCMGET: ::c_int = 0x741D; -pub const TIOCMBIS: ::c_int = 0x741B; -pub const TIOCMBIC: ::c_int = 0x741C; -pub const TIOCMSET: ::c_int = 0x741A; -pub const FIONREAD: ::c_int = 0x467F; -pub const TIOCCONS: ::c_int = 0x80047478; - -pub const SYS_gettid: ::c_long = 4222; // Valid for O32 -pub const SYS_perf_event_open: ::c_long = 4333; // Valid for O32 - -pub const POLLWRNORM: ::c_short = 0x4; -pub const POLLWRBAND: ::c_short = 0x100; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs deleted file mode 100644 index 61eb6dba1..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/mod.rs +++ /dev/null @@ -1,56 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; -pub type nlink_t = u32; - -s! { - pub struct pthread_attr_t { - __size: [u32; 9] - } - - pub struct sigset_t { - __val: [::c_ulong; 32], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::socklen_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct sem_t { - __val: [::c_int; 4], - } -} - -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; - -cfg_if! { - if #[cfg(any(target_arch = "x86"))] { - mod x86; - pub use self::x86::*; - } else if #[cfg(any(target_arch = "mips"))] { - mod mips; - pub use self::mips::*; - } else if #[cfg(any(target_arch = "arm"))] { - mod arm; - pub use self::arm::*; - } else if #[cfg(any(target_arch = "asmjs", target_arch = "wasm32"))] { - // For the time being asmjs and wasm32 are the same, and both - // backed by identical emscripten runtimes - mod asmjs; - pub use self::asmjs::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs deleted file mode 100644 index 9daeb58b9..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b32/x86.rs +++ /dev/null @@ -1,360 +0,0 @@ -pub type c_char = i8; -pub type wchar_t = i32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __st_dev_padding: ::c_int, - __st_ino_truncated: ::c_long, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __st_rdev_padding: ::c_int, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino_t, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_int, - pub shm_dtime: ::time_t, - __unused2: ::c_int, - pub shm_ctime: ::time_t, - __unused3: ::c_int, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::c_ulong, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __unused1: ::c_int, - pub msg_rtime: ::time_t, - __unused2: ::c_int, - pub msg_ctime: ::time_t, - __unused3: ::c_int, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_flags: ::c_ulong, - pub f_spare: [::c_ulong; 4], - } - - pub struct mcontext_t { - __private: [u32; 22] - } - - pub struct ucontext_t { - pub uc_flags: ::c_ulong, - pub uc_link: *mut ucontext_t, - pub uc_stack: ::stack_t, - pub uc_mcontext: mcontext_t, - pub uc_sigmask: ::sigset_t, - __private: [u8; 112], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } -} - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const O_ASYNC: ::c_int = 0x2000; - -pub const FIOCLEX: ::c_int = 0x5451; -pub const FIONBIO: ::c_int = 0x5421; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_NPROC: ::c_int = 6; -pub const RLIMIT_MEMLOCK: ::c_int = 8; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; - -pub const SOCK_NONBLOCK: ::c_int = 2048; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EDEADLOCK: ::c_int = EDEADLK; -pub const EMULTIHOP: ::c_int = 72; -pub const EBADMSG: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const ERFKILL: ::c_int = 132; -pub const EHWPOISON: ::c_int = 133; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const MAP_HUGETLB: ::c_int = 0x040000; -pub const MAP_32BIT: ::c_int = 0x0040; - -pub const F_GETLK: ::c_int = 12; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETLK: ::c_int = 13; -pub const F_SETLKW: ::c_int = 14; -pub const F_SETOWN: ::c_int = 8; - -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const TCGETS: ::c_int = 0x5401; -pub const TCSETS: ::c_int = 0x5402; -pub const TCSETSW: ::c_int = 0x5403; -pub const TCSETSF: ::c_int = 0x5404; -pub const TCGETA: ::c_int = 0x5405; -pub const TCSETA: ::c_int = 0x5406; -pub const TCSETAW: ::c_int = 0x5407; -pub const TCSETAF: ::c_int = 0x5408; -pub const TCSBRK: ::c_int = 0x5409; -pub const TCXONC: ::c_int = 0x540A; -pub const TCFLSH: ::c_int = 0x540B; -pub const TIOCGSOFTCAR: ::c_int = 0x5419; -pub const TIOCSSOFTCAR: ::c_int = 0x541A; -pub const TIOCLINUX: ::c_int = 0x541C; -pub const TIOCGSERIAL: ::c_int = 0x541E; -pub const TIOCEXCL: ::c_int = 0x540C; -pub const TIOCNXCL: ::c_int = 0x540D; -pub const TIOCSCTTY: ::c_int = 0x540E; -pub const TIOCGPGRP: ::c_int = 0x540F; -pub const TIOCSPGRP: ::c_int = 0x5410; -pub const TIOCOUTQ: ::c_int = 0x5411; -pub const TIOCSTI: ::c_int = 0x5412; -pub const TIOCGWINSZ: ::c_int = 0x5413; -pub const TIOCSWINSZ: ::c_int = 0x5414; -pub const TIOCMGET: ::c_int = 0x5415; -pub const TIOCMBIS: ::c_int = 0x5416; -pub const TIOCMBIC: ::c_int = 0x5417; -pub const TIOCMSET: ::c_int = 0x5418; -pub const FIONREAD: ::c_int = 0x541B; -pub const TIOCCONS: ::c_int = 0x541D; - -pub const SYS_gettid: ::c_long = 224; -pub const SYS_perf_event_open: ::c_long = 336; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs deleted file mode 100644 index 23f7dd35e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/aarch64.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub type c_char = u8; - -pub const SYS_perf_event_open: ::c_long = 241; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs deleted file mode 100644 index fab0b58fe..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/mod.rs +++ /dev/null @@ -1,387 +0,0 @@ -pub type wchar_t = i32; -pub type c_long = i64; -pub type c_ulong = u64; -pub type nlink_t = u64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_long; 3], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino64_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __reserved: [::c_long; 3], - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct pthread_attr_t { - __size: [u64; 7] - } - - pub struct sigset_t { - __val: [::c_ulong; 16], - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::c_ulong, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - pub msg_rtime: ::time_t, - pub msg_ctime: ::time_t, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __pad1: ::c_ulong, - __pad2: ::c_ulong, - } - - pub struct statfs { - pub f_type: ::c_ulong, - pub f_bsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_flags: ::c_ulong, - pub f_spare: [::c_ulong; 4], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - __pad1: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - __pad2: ::socklen_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::socklen_t, - pub __pad1: ::c_int, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct sem_t { - __val: [::c_int; 8], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } -} - -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const O_ASYNC: ::c_int = 0x2000; - -pub const FIOCLEX: ::c_int = 0x5451; -pub const FIONBIO: ::c_int = 0x5421; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_NPROC: ::c_int = 6; -pub const RLIMIT_MEMLOCK: ::c_int = 8; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; - -pub const SOCK_NONBLOCK: ::c_int = 2048; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; -pub const MAP_32BIT: ::c_int = 0x0040; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EDEADLOCK: ::c_int = EDEADLK; -pub const EMULTIHOP: ::c_int = 72; -pub const EBADMSG: ::c_int = 74; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const ERFKILL: ::c_int = 132; -pub const EHWPOISON: ::c_int = 133; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; -pub const F_SETOWN: ::c_int = 8; - -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const TCGETS: ::c_int = 0x5401; -pub const TCSETS: ::c_int = 0x5402; -pub const TCSETSW: ::c_int = 0x5403; -pub const TCSETSF: ::c_int = 0x5404; -pub const TCGETA: ::c_int = 0x5405; -pub const TCSETA: ::c_int = 0x5406; -pub const TCSETAW: ::c_int = 0x5407; -pub const TCSETAF: ::c_int = 0x5408; -pub const TCSBRK: ::c_int = 0x5409; -pub const TCXONC: ::c_int = 0x540A; -pub const TCFLSH: ::c_int = 0x540B; -pub const TIOCGSOFTCAR: ::c_int = 0x5419; -pub const TIOCSSOFTCAR: ::c_int = 0x541A; -pub const TIOCLINUX: ::c_int = 0x541C; -pub const TIOCGSERIAL: ::c_int = 0x541E; -pub const TIOCEXCL: ::c_int = 0x540C; -pub const TIOCNXCL: ::c_int = 0x540D; -pub const TIOCSCTTY: ::c_int = 0x540E; -pub const TIOCGPGRP: ::c_int = 0x540F; -pub const TIOCSPGRP: ::c_int = 0x5410; -pub const TIOCOUTQ: ::c_int = 0x5411; -pub const TIOCSTI: ::c_int = 0x5412; -pub const TIOCGWINSZ: ::c_int = 0x5413; -pub const TIOCSWINSZ: ::c_int = 0x5414; -pub const TIOCMGET: ::c_int = 0x5415; -pub const TIOCMBIS: ::c_int = 0x5416; -pub const TIOCMBIC: ::c_int = 0x5417; -pub const TIOCMSET: ::c_int = 0x5418; -pub const FIONREAD: ::c_int = 0x541B; -pub const TIOCCONS: ::c_int = 0x541D; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -cfg_if! { - if #[cfg(target_arch = "aarch64")] { - mod aarch64; - pub use self::aarch64::*; - } else if #[cfg(any(target_arch = "powerpc64"))] { - mod powerpc64; - pub use self::powerpc64::*; - } else if #[cfg(any(target_arch = "x86_64"))] { - mod x86_64; - pub use self::x86_64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs deleted file mode 100644 index 4b8ca10aa..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/powerpc64.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub type c_char = u8; - -pub const SYS_perf_event_open: ::c_long = 319; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs deleted file mode 100644 index 2cfd903ca..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/b64/x86_64.rs +++ /dev/null @@ -1,20 +0,0 @@ -pub type c_char = i8; - -s! { - pub struct mcontext_t { - __private: [u64; 32], - } - - pub struct ucontext_t { - pub uc_flags: ::c_ulong, - pub uc_link: *mut ucontext_t, - pub uc_stack: ::stack_t, - pub uc_mcontext: mcontext_t, - pub uc_sigmask: ::sigset_t, - __private: [u8; 512], - } -} - -pub const SYS_gettid: ::c_long = 186; - -pub const SYS_perf_event_open: ::c_long = 298; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs deleted file mode 100644 index a0d947bc4..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/musl/mod.rs +++ /dev/null @@ -1,337 +0,0 @@ -pub type clock_t = c_long; -pub type time_t = c_long; -pub type suseconds_t = c_long; -pub type ino_t = u64; -pub type off_t = i64; -pub type blkcnt_t = i64; - -pub type blksize_t = c_long; -pub type fsblkcnt_t = ::c_ulonglong; -pub type fsfilcnt_t = ::c_ulonglong; -pub type rlim_t = ::c_ulonglong; - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: ::sigevent, - __td: *mut ::c_void, - __lock: [::c_int; 2], - __err: ::c_int, - __ret: ::ssize_t, - pub aio_offset: off_t, - __next: *mut ::c_void, - __prev: *mut ::c_void, - #[cfg(target_pointer_width = "32")] - __dummy4: [::c_char; 24], - #[cfg(target_pointer_width = "64")] - __dummy4: [::c_char; 16], - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - pub sa_flags: ::c_int, - _restorer: *mut ::c_void, - } - - pub struct ipc_perm { - pub __ipc_perm_key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::mode_t, - pub __seq: ::c_int, - __unused1: ::c_long, - __unused2: ::c_long - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - pub __c_ispeed: ::speed_t, - pub __c_ospeed: ::speed_t, - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - } - - pub struct sysinfo { - pub uptime: ::c_ulong, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub __reserved: [::c_char; 256], - } -} - -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const BUFSIZ: ::c_uint = 1024; -pub const TMP_MAX: ::c_uint = 10000; -pub const FOPEN_MAX: ::c_uint = 1000; -pub const O_PATH: ::c_int = 0o10000000; -pub const O_EXEC: ::c_int = 0o10000000; -pub const O_SEARCH: ::c_int = 0o10000000; -pub const O_ACCMODE: ::c_int = 0o10000003; -pub const O_NDELAY: ::c_int = O_NONBLOCK; -pub const NI_MAXHOST: ::socklen_t = 255; -pub const PTHREAD_STACK_MIN: ::size_t = 2048; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; - -pub const POSIX_MADV_DONTNEED: ::c_int = 4; - -pub const RLIM_INFINITY: ::rlim_t = !0; -pub const RLIMIT_RTTIME: ::c_int = 15; -pub const RLIMIT_NLIMITS: ::c_int = 16; - -pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; - -pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; -pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; -pub const TCP_THIN_DUPACK: ::c_int = 17; -pub const TCP_USER_TIMEOUT: ::c_int = 18; -pub const TCP_REPAIR: ::c_int = 19; -pub const TCP_REPAIR_QUEUE: ::c_int = 20; -pub const TCP_QUEUE_SEQ: ::c_int = 21; -pub const TCP_REPAIR_OPTIONS: ::c_int = 22; -pub const TCP_FASTOPEN: ::c_int = 23; -pub const TCP_TIMESTAMP: ::c_int = 24; - -pub const SIGUNUSED: ::c_int = ::SIGSYS; - -pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; -pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const CPU_SETSIZE: ::c_int = 128; - -pub const QFMT_VFS_V1: ::c_int = 4; - -pub const PTRACE_TRACEME: ::c_int = 0; -pub const PTRACE_PEEKTEXT: ::c_int = 1; -pub const PTRACE_PEEKDATA: ::c_int = 2; -pub const PTRACE_PEEKUSER: ::c_int = 3; -pub const PTRACE_POKETEXT: ::c_int = 4; -pub const PTRACE_POKEDATA: ::c_int = 5; -pub const PTRACE_POKEUSER: ::c_int = 6; -pub const PTRACE_CONT: ::c_int = 7; -pub const PTRACE_KILL: ::c_int = 8; -pub const PTRACE_SINGLESTEP: ::c_int = 9; -pub const PTRACE_ATTACH: ::c_int = 16; -pub const PTRACE_DETACH: ::c_int = 17; -pub const PTRACE_SYSCALL: ::c_int = 24; -pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; -pub const PTRACE_GETREGSET: ::c_int = 0x4204; -pub const PTRACE_SETREGSET: ::c_int = 0x4205; -pub const PTRACE_SEIZE: ::c_int = 0x4206; -pub const PTRACE_INTERRUPT: ::c_int = 0x4207; -pub const PTRACE_LISTEN: ::c_int = 0x4208; -pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; - -pub const PTRACE_O_EXITKILL: ::c_int = 1048576; -pub const PTRACE_O_TRACECLONE: ::c_int = 8; -pub const PTRACE_O_TRACEEXEC: ::c_int = 16; -pub const PTRACE_O_TRACEEXIT: ::c_int = 64; -pub const PTRACE_O_TRACEFORK: ::c_int = 2; -pub const PTRACE_O_TRACESYSGOOD: ::c_int = 1; -pub const PTRACE_O_TRACEVFORK: ::c_int = 4; -pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 32; -pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 2097152; - -pub const MADV_DODUMP: ::c_int = 17; -pub const MADV_DONTDUMP: ::c_int = 16; - -pub const EPOLLWAKEUP: ::c_int = 0x20000000; - -pub const POLLRDNORM: ::c_short = 0x040; -pub const POLLRDBAND: ::c_short = 0x080; - -pub const MADV_HUGEPAGE: ::c_int = 14; -pub const MADV_NOHUGEPAGE: ::c_int = 15; - -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; - -pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; - -pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK; - -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; - -pub const TIOCINQ: ::c_int = ::FIONREAD; - -pub const RTLD_GLOBAL: ::c_int = 0x100; -pub const RTLD_NOLOAD: ::c_int = 0x4; - -// TODO(#247) Temporarily musl-specific (available since musl 0.9.12 / Linux -// kernel 3.10). See also notbsd/mod.rs -pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; -pub const CLOCK_TAI: ::clockid_t = 11; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -extern { - pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; - pub fn ptrace(request: ::c_int, ...) -> ::c_long; - pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] { - mod b64; - pub use self::b64::*; - } else if #[cfg(any(target_arch = "x86", - target_arch = "mips", - target_arch = "arm", - target_arch = "asmjs", - target_arch = "wasm32"))] { - mod b32; - pub use self::b32::*; - } else { } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs deleted file mode 100644 index ee6d67403..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/arm.rs +++ /dev/null @@ -1,203 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -s! { - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_ushort, - __pad1: ::c_ushort, - pub __seq: ::c_ushort, - __pad2: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __pad1: ::c_uint, - __st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_uint, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino64_t, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_ulong, - pub shm_dtime: ::time_t, - __unused2: ::c_ulong, - pub shm_ctime: ::time_t, - __unused3: ::c_ulong, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __glibc_reserved1: ::c_ulong, - pub msg_rtime: ::time_t, - __glibc_reserved2: ::c_ulong, - pub msg_ctime: ::time_t, - __glibc_reserved3: ::c_ulong, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } -} - -pub const O_DIRECT: ::c_int = 0x10000; -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; - -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; - -pub const EDEADLOCK: ::c_int = 35; - -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; - -pub const FIOCLEX: ::c_ulong = 0x5451; -pub const FIONBIO: ::c_ulong = 0x5421; - -pub const SYS_gettid: ::c_long = 224; -pub const SYS_perf_event_open: ::c_long = 364; - -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; -pub const EXTPROC: ::tcflag_t = 0x00010000; -pub const TCGETS: ::c_ulong = 0x5401; -pub const TCSETS: ::c_ulong = 0x5402; -pub const TCSETSW: ::c_ulong = 0x5403; -pub const TCSETSF: ::c_ulong = 0x5404; -pub const TCGETA: ::c_ulong = 0x5405; -pub const TCSETA: ::c_ulong = 0x5406; -pub const TCSETAW: ::c_ulong = 0x5407; -pub const TCSETAF: ::c_ulong = 0x5408; -pub const TCSBRK: ::c_ulong = 0x5409; -pub const TCXONC: ::c_ulong = 0x540A; -pub const TCFLSH: ::c_ulong = 0x540B; -pub const TIOCINQ: ::c_ulong = 0x541B; -pub const TIOCGPGRP: ::c_ulong = 0x540F; -pub const TIOCSPGRP: ::c_ulong = 0x5410; -pub const TIOCOUTQ: ::c_ulong = 0x5411; -pub const TIOCGWINSZ: ::c_ulong = 0x5413; -pub const TIOCSWINSZ: ::c_ulong = 0x5414; -pub const FIONREAD: ::c_ulong = 0x541B; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs deleted file mode 100644 index 0f936c7e2..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/mod.rs +++ /dev/null @@ -1,284 +0,0 @@ -//! 32-bit specific definitions for linux-like values - -pub type c_long = i32; -pub type c_ulong = u32; -pub type clock_t = i32; -pub type time_t = i32; -pub type suseconds_t = i32; -pub type ino_t = u32; -pub type off_t = i32; -pub type blkcnt_t = i32; -pub type __fsword_t = i32; - -pub type blksize_t = i32; -pub type nlink_t = u32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __pad1: ::c_short, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_short, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused4: ::c_long, - __unused5: ::c_long, - } - - pub struct pthread_attr_t { - __size: [u32; 9] - } - - pub struct sigset_t { - __val: [::c_ulong; 32], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 8], - } -} - -pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; -pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; - -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_NPROC: ::c_int = 6; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; - -pub const MAP_GROWSDOWN: ::c_int = 0x0100; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_LINGER: ::c_int = 13; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_ACCEPTCONN: ::c_int = 30; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const PTRACE_DETACH: ::c_uint = 17; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const TIOCEXCL: ::c_ulong = 0x540C; -pub const TIOCNXCL: ::c_ulong = 0x540D; -pub const TIOCSCTTY: ::c_ulong = 0x540E; -pub const TIOCSTI: ::c_ulong = 0x5412; -pub const TIOCMGET: ::c_ulong = 0x5415; -pub const TIOCMBIS: ::c_ulong = 0x5416; -pub const TIOCMBIC: ::c_ulong = 0x5417; -pub const TIOCMSET: ::c_ulong = 0x5418; -pub const TIOCCONS: ::c_ulong = 0x541D; -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; - -cfg_if! { - if #[cfg(target_arch = "x86")] { - mod x86; - pub use self::x86::*; - } else if #[cfg(target_arch = "arm")] { - mod arm; - pub use self::arm::*; - } else if #[cfg(target_arch = "powerpc")] { - mod powerpc; - pub use self::powerpc::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs deleted file mode 100644 index 035bfe19c..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/powerpc.rs +++ /dev/null @@ -1,207 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = i32; - -s! { - pub struct ipc_perm { - __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::mode_t, - __seq: ::uint32_t, - __pad1: ::uint32_t, - __glibc_reserved1: ::uint64_t, - __glibc_reserved2: ::uint64_t, - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino64_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_ushort, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - __glibc_reserved1: ::c_uint, - pub shm_atime: ::time_t, - __glibc_reserved2: ::c_uint, - pub shm_dtime: ::time_t, - __glibc_reserved3: ::c_uint, - pub shm_ctime: ::time_t, - __glibc_reserved4: ::c_uint, - pub shm_segsz: ::size_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __glibc_reserved5: ::c_ulong, - __glibc_reserved6: ::c_ulong, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - __glibc_reserved1: ::c_uint, - pub msg_stime: ::time_t, - __glibc_reserved2: ::c_uint, - pub msg_rtime: ::time_t, - __glibc_reserved3: ::c_uint, - pub msg_ctime: ::time_t, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } -} - -pub const O_DIRECT: ::c_int = 0x20000; -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; - -pub const MAP_LOCKED: ::c_int = 0x00080; -pub const MAP_NORESERVE: ::c_int = 0x00040; - -pub const EDEADLOCK: ::c_int = 58; - -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_RCVLOWAT: ::c_int = 16; -pub const SO_SNDLOWAT: ::c_int = 17; -pub const SO_RCVTIMEO: ::c_int = 18; -pub const SO_SNDTIMEO: ::c_int = 19; -pub const SO_PASSCRED: ::c_int = 20; -pub const SO_PEERCRED: ::c_int = 21; - -pub const FIOCLEX: ::c_ulong = 0x20006601; -pub const FIONBIO: ::c_ulong = 0x8004667e; - -pub const SYS_gettid: ::c_long = 207; -pub const SYS_perf_event_open: ::c_long = 319; - -pub const MCL_CURRENT: ::c_int = 0x2000; -pub const MCL_FUTURE: ::c_int = 0x4000; - -pub const SIGSTKSZ: ::size_t = 0x4000; -pub const MINSIGSTKSZ: ::size_t = 4096; -pub const CBAUD: ::tcflag_t = 0xff; -pub const TAB1: ::c_int = 0x400; -pub const TAB2: ::c_int = 0x800; -pub const TAB3: ::c_int = 0xc00; -pub const CR1: ::c_int = 0x1000; -pub const CR2: ::c_int = 0x2000; -pub const CR3: ::c_int = 0x3000; -pub const FF1: ::c_int = 0x4000; -pub const BS1: ::c_int = 0x8000; -pub const VT1: ::c_int = 0x10000; -pub const VWERASE: usize = 0xa; -pub const VREPRINT: usize = 0xb; -pub const VSUSP: usize = 0xc; -pub const VSTART: usize = 0xd; -pub const VSTOP: usize = 0xe; -pub const VDISCARD: usize = 0x10; -pub const VTIME: usize = 0x7; -pub const IXON: ::tcflag_t = 0x200; -pub const IXOFF: ::tcflag_t = 0x400; -pub const ONLCR: ::tcflag_t = 0x2; -pub const CSIZE: ::tcflag_t = 0x300; -pub const CS6: ::tcflag_t = 0x100; -pub const CS7: ::tcflag_t = 0x200; -pub const CS8: ::tcflag_t = 0x300; -pub const CSTOPB: ::tcflag_t = 0x400; -pub const CREAD: ::tcflag_t = 0x800; -pub const PARENB: ::tcflag_t = 0x1000; -pub const PARODD: ::tcflag_t = 0x2000; -pub const HUPCL: ::tcflag_t = 0x4000; -pub const CLOCAL: ::tcflag_t = 0x8000; -pub const ECHOKE: ::tcflag_t = 0x1; -pub const ECHOE: ::tcflag_t = 0x2; -pub const ECHOK: ::tcflag_t = 0x4; -pub const ECHONL: ::tcflag_t = 0x10; -pub const ECHOPRT: ::tcflag_t = 0x20; -pub const ECHOCTL: ::tcflag_t = 0x40; -pub const ISIG: ::tcflag_t = 0x80; -pub const ICANON: ::tcflag_t = 0x100; -pub const PENDIN: ::tcflag_t = 0x20000000; -pub const NOFLSH: ::tcflag_t = 0x80000000; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const CBAUDEX: ::speed_t = 0o000020; -pub const B57600: ::speed_t = 0o0020; -pub const B115200: ::speed_t = 0o0021; -pub const B230400: ::speed_t = 0o0022; -pub const B460800: ::speed_t = 0o0023; -pub const B500000: ::speed_t = 0o0024; -pub const B576000: ::speed_t = 0o0025; -pub const B921600: ::speed_t = 0o0026; -pub const B1000000: ::speed_t = 0o0027; -pub const B1152000: ::speed_t = 0o0030; -pub const B1500000: ::speed_t = 0o0031; -pub const B2000000: ::speed_t = 0o0032; -pub const B2500000: ::speed_t = 0o0033; -pub const B3000000: ::speed_t = 0o0034; -pub const B3500000: ::speed_t = 0o0035; -pub const B4000000: ::speed_t = 0o0036; - -pub const VEOL: usize = 6; -pub const VEOL2: usize = 8; -pub const VMIN: usize = 5; -pub const IEXTEN: ::tcflag_t = 0x400; -pub const TOSTOP: ::tcflag_t = 0x400000; -pub const FLUSHO: ::tcflag_t = 0x800000; -pub const EXTPROC: ::tcflag_t = 0x10000000; -pub const TCGETS: ::c_ulong = 0x403c7413; -pub const TCSETS: ::c_ulong = 0x803c7414; -pub const TCSETSW: ::c_ulong = 0x803c7415; -pub const TCSETSF: ::c_ulong = 0x803c7416; -pub const TCGETA: ::c_ulong = 0x40147417; -pub const TCSETA: ::c_ulong = 0x80147418; -pub const TCSETAW: ::c_ulong = 0x80147419; -pub const TCSETAF: ::c_ulong = 0x8014741c; -pub const TCSBRK: ::c_ulong = 0x2000741d; -pub const TCXONC: ::c_ulong = 0x2000741e; -pub const TCFLSH: ::c_ulong = 0x2000741f; -pub const TIOCINQ: ::c_ulong = 0x4004667f; -pub const TIOCGPGRP: ::c_ulong = 0x40047477; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCOUTQ: ::c_ulong = 0x40047473; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs deleted file mode 100644 index 263e1406b..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b32/x86.rs +++ /dev/null @@ -1,254 +0,0 @@ -pub type c_char = i8; -pub type wchar_t = i32; -pub type greg_t = i32; - -s! { - pub struct _libc_fpreg { - pub significand: [u16; 4], - pub exponent: u16, - } - - pub struct _libc_fpstate { - pub cw: ::c_ulong, - pub sw: ::c_ulong, - pub tag: ::c_ulong, - pub ipoff: ::c_ulong, - pub cssel: ::c_ulong, - pub dataoff: ::c_ulong, - pub datasel: ::c_ulong, - pub _st: [_libc_fpreg; 8], - pub status: ::c_ulong, - } - - pub struct mcontext_t { - pub gregs: [greg_t; 19], - pub fpregs: *mut _libc_fpstate, - pub oldmask: ::c_ulong, - pub cr2: ::c_ulong, - } - - pub struct ucontext_t { - pub uc_flags: ::c_ulong, - pub uc_link: *mut ucontext_t, - pub uc_stack: ::stack_t, - pub uc_mcontext: mcontext_t, - pub uc_sigmask: ::sigset_t, - __private: [u8; 112], - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_ushort, - __pad1: ::c_ushort, - pub __seq: ::c_ushort, - __pad2: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __pad1: ::c_uint, - __st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_uint, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino64_t, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_ulong, - pub shm_dtime: ::time_t, - __unused2: ::c_ulong, - pub shm_ctime: ::time_t, - __unused3: ::c_ulong, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __glibc_reserved1: ::c_ulong, - pub msg_rtime: ::time_t, - __glibc_reserved2: ::c_ulong, - pub msg_ctime: ::time_t, - __glibc_reserved3: ::c_ulong, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } -} - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; - -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_32BIT: ::c_int = 0x0040; - -pub const EDEADLOCK: ::c_int = 35; - -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; - -pub const FIOCLEX: ::c_ulong = 0x5451; -pub const FIONBIO: ::c_ulong = 0x5421; - -pub const SYS_gettid: ::c_long = 224; -pub const SYS_perf_event_open: ::c_long = 336; - -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; -pub const EXTPROC: ::tcflag_t = 0x00010000; -pub const TCGETS: ::c_ulong = 0x5401; -pub const TCSETS: ::c_ulong = 0x5402; -pub const TCSETSW: ::c_ulong = 0x5403; -pub const TCSETSF: ::c_ulong = 0x5404; -pub const TCGETA: ::c_ulong = 0x5405; -pub const TCSETA: ::c_ulong = 0x5406; -pub const TCSETAW: ::c_ulong = 0x5407; -pub const TCSETAF: ::c_ulong = 0x5408; -pub const TCSBRK: ::c_ulong = 0x5409; -pub const TCXONC: ::c_ulong = 0x540A; -pub const TCFLSH: ::c_ulong = 0x540B; -pub const TIOCINQ: ::c_ulong = 0x541B; -pub const TIOCGPGRP: ::c_ulong = 0x540F; -pub const TIOCSPGRP: ::c_ulong = 0x5410; -pub const TIOCOUTQ: ::c_ulong = 0x5411; -pub const TIOCGWINSZ: ::c_ulong = 0x5413; -pub const TIOCSWINSZ: ::c_ulong = 0x5414; -pub const FIONREAD: ::c_ulong = 0x541B; - -extern { - pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; - pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; - pub fn makecontext(ucp: *mut ucontext_t, - func: extern fn (), - argc: ::c_int, ...); - pub fn swapcontext(uocp: *mut ucontext_t, - ucp: *const ucontext_t) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs deleted file mode 100644 index 77cee3d21..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/aarch64.rs +++ /dev/null @@ -1,447 +0,0 @@ -//! AArch64-specific definitions for 64-bit linux-like values - -pub type c_char = u8; -pub type wchar_t = u32; -pub type nlink_t = u32; -pub type blksize_t = i32; -pub type suseconds_t = i64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad1: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - __pad2: ::c_int, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_int; 2], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad1: ::dev_t, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - __pad2: ::c_int, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_int; 2], - } - - pub struct pthread_attr_t { - __size: [u64; 8] - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_uint, - pub __seq: ::c_ushort, - __pad1: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } -} - -pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; -pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; - -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_NPROC: ::c_int = 6; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; - -pub const MAP_GROWSDOWN: ::c_int = 0x0100; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; -pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; -pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; -pub const SO_BINDTODEVICE: ::c_int = 25; -pub const SO_ATTACH_FILTER: ::c_int = 26; -pub const SO_DETACH_FILTER: ::c_int = 27; -pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; -pub const SO_PEERNAME: ::c_int = 28; -pub const SO_TIMESTAMP: ::c_int = 29; -pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_PEERSEC: ::c_int = 31; -pub const SO_PASSSEC: ::c_int = 34; -pub const SO_TIMESTAMPNS: ::c_int = 35; -pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; -pub const SO_MARK: ::c_int = 36; -pub const SO_TIMESTAMPING: ::c_int = 37; -pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; -pub const SO_RXQ_OVFL: ::c_int = 40; -pub const SO_WIFI_STATUS: ::c_int = 41; -pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; -pub const SO_PEEK_OFF: ::c_int = 42; -pub const SO_NOFCS: ::c_int = 43; -pub const SO_LOCK_FILTER: ::c_int = 44; -pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; -pub const SO_BUSY_POLL: ::c_int = 46; -pub const SO_MAX_PACING_RATE: ::c_int = 47; -pub const SO_BPF_EXTENSIONS: ::c_int = 48; -pub const SO_INCOMING_CPU: ::c_int = 49; -pub const SO_ATTACH_BPF: ::c_int = 50; -pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const PTRACE_DETACH: ::c_uint = 17; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const TIOCEXCL: ::c_ulong = 0x540C; -pub const TIOCNXCL: ::c_ulong = 0x540D; -pub const TIOCSCTTY: ::c_ulong = 0x540E; -pub const TIOCSTI: ::c_ulong = 0x5412; -pub const TIOCMGET: ::c_ulong = 0x5415; -pub const TIOCMBIS: ::c_ulong = 0x5416; -pub const TIOCMBIC: ::c_ulong = 0x5417; -pub const TIOCMSET: ::c_ulong = 0x5418; -pub const TIOCCONS: ::c_ulong = 0x541D; - -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 48; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 8; - -pub const O_DIRECT: ::c_int = 0x10000; -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; - -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; - -pub const EDEADLOCK: ::c_int = 35; - -pub const FIOCLEX: ::c_ulong = 0x5451; -pub const FIONBIO: ::c_ulong = 0x5421; - -pub const SYS_gettid: ::c_long = 178; -pub const SYS_perf_event_open: ::c_long = 241; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 16384; -pub const MINSIGSTKSZ: ::size_t = 5120; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; -pub const EXTPROC: ::tcflag_t = 0x00010000; -pub const TCGETS: ::c_ulong = 0x5401; -pub const TCSETS: ::c_ulong = 0x5402; -pub const TCSETSW: ::c_ulong = 0x5403; -pub const TCSETSF: ::c_ulong = 0x5404; -pub const TCGETA: ::c_ulong = 0x5405; -pub const TCSETA: ::c_ulong = 0x5406; -pub const TCSETAW: ::c_ulong = 0x5407; -pub const TCSETAF: ::c_ulong = 0x5408; -pub const TCSBRK: ::c_ulong = 0x5409; -pub const TCXONC: ::c_ulong = 0x540A; -pub const TCFLSH: ::c_ulong = 0x540B; -pub const TIOCINQ: ::c_ulong = 0x541B; -pub const TIOCGPGRP: ::c_ulong = 0x540F; -pub const TIOCSPGRP: ::c_ulong = 0x5410; -pub const TIOCOUTQ: ::c_ulong = 0x5411; -pub const TIOCGWINSZ: ::c_ulong = 0x5413; -pub const TIOCSWINSZ: ::c_ulong = 0x5414; -pub const FIONREAD: ::c_ulong = 0x541B; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs deleted file mode 100644 index 2fcec73a8..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/mod.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! 64-bit specific definitions for linux-like values - -pub type c_long = i64; -pub type c_ulong = u64; -pub type clock_t = i64; -pub type time_t = i64; -pub type ino_t = u64; -pub type off_t = i64; -pub type blkcnt_t = i64; -pub type __fsword_t = ::c_long; - -s! { - pub struct sigset_t { - __val: [::c_ulong; 16], - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 0], - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - pub msg_rtime: ::time_t, - pub msg_ctime: ::time_t, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } -} - -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; - -cfg_if! { - if #[cfg(target_arch = "aarch64")] { - mod aarch64; - pub use self::aarch64::*; - } else if #[cfg(any(target_arch = "powerpc64"))] { - mod powerpc64; - pub use self::powerpc64::*; - } else if #[cfg(any(target_arch = "sparc64"))] { - mod sparc64; - pub use self::sparc64::*; - } else if #[cfg(any(target_arch = "x86_64"))] { - mod x86_64; - pub use self::x86_64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs deleted file mode 100644 index 8c19b0713..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/powerpc64.rs +++ /dev/null @@ -1,446 +0,0 @@ -//! PowerPC64-specific definitions for 64-bit linux-like values - -pub type c_char = u8; -pub type wchar_t = i32; -pub type nlink_t = u64; -pub type blksize_t = i64; -pub type suseconds_t = i64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_long; 3], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino64_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __reserved: [::c_long; 3], - } - - pub struct pthread_attr_t { - __size: [u64; 7] - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::mode_t, - pub __seq: ::uint32_t, - __pad1: ::uint32_t, - __unused1: ::uint64_t, - __unused2: ::c_ulong, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_segsz: ::size_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } -} - -pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; -pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; - -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_NPROC: ::c_int = 6; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; - -pub const MAP_GROWSDOWN: ::c_int = 0x0100; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 20; -pub const SO_PEERCRED: ::c_int = 21; -pub const SO_RCVLOWAT: ::c_int = 16; -pub const SO_SNDLOWAT: ::c_int = 17; -pub const SO_RCVTIMEO: ::c_int = 18; -pub const SO_SNDTIMEO: ::c_int = 19; -pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; -pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; -pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; -pub const SO_BINDTODEVICE: ::c_int = 25; -pub const SO_ATTACH_FILTER: ::c_int = 26; -pub const SO_DETACH_FILTER: ::c_int = 27; -pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; -pub const SO_PEERNAME: ::c_int = 28; -pub const SO_TIMESTAMP: ::c_int = 29; -pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_PEERSEC: ::c_int = 31; -pub const SO_PASSSEC: ::c_int = 34; -pub const SO_TIMESTAMPNS: ::c_int = 35; -pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; -pub const SO_MARK: ::c_int = 36; -pub const SO_TIMESTAMPING: ::c_int = 37; -pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; -pub const SO_RXQ_OVFL: ::c_int = 40; -pub const SO_WIFI_STATUS: ::c_int = 41; -pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; -pub const SO_PEEK_OFF: ::c_int = 42; -pub const SO_NOFCS: ::c_int = 43; -pub const SO_LOCK_FILTER: ::c_int = 44; -pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; -pub const SO_BUSY_POLL: ::c_int = 46; -pub const SO_MAX_PACING_RATE: ::c_int = 47; -pub const SO_BPF_EXTENSIONS: ::c_int = 48; -pub const SO_INCOMING_CPU: ::c_int = 49; -pub const SO_ATTACH_BPF: ::c_int = 50; -pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const PTRACE_DETACH: ::c_uint = 17; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const TIOCEXCL: ::c_ulong = 0x540C; -pub const TIOCNXCL: ::c_ulong = 0x540D; -pub const TIOCSCTTY: ::c_ulong = 0x540E; -pub const TIOCSTI: ::c_ulong = 0x5412; -pub const TIOCMGET: ::c_ulong = 0x5415; -pub const TIOCMBIS: ::c_ulong = 0x5416; -pub const TIOCMBIC: ::c_ulong = 0x5417; -pub const TIOCMSET: ::c_ulong = 0x5418; -pub const TIOCCONS: ::c_ulong = 0x541D; - -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_NOFOLLOW: ::c_int = 0x8000; -pub const O_DIRECT: ::c_int = 0x20000; - -pub const MAP_LOCKED: ::c_int = 0x00080; -pub const MAP_NORESERVE: ::c_int = 0x00040; - -pub const EDEADLOCK: ::c_int = 58; - -pub const FIOCLEX: ::c_ulong = 0x20006601; -pub const FIONBIO: ::c_ulong = 0x8004667e; - -pub const SYS_gettid: ::c_long = 207; -pub const SYS_perf_event_open: ::c_long = 319; - -pub const MCL_CURRENT: ::c_int = 0x2000; -pub const MCL_FUTURE: ::c_int = 0x4000; - -pub const SIGSTKSZ: ::size_t = 0x4000; -pub const MINSIGSTKSZ: ::size_t = 4096; -pub const CBAUD: ::tcflag_t = 0xff; -pub const TAB1: ::c_int = 0x400; -pub const TAB2: ::c_int = 0x800; -pub const TAB3: ::c_int = 0xc00; -pub const CR1: ::c_int = 0x1000; -pub const CR2: ::c_int = 0x2000; -pub const CR3: ::c_int = 0x3000; -pub const FF1: ::c_int = 0x4000; -pub const BS1: ::c_int = 0x8000; -pub const VT1: ::c_int = 0x10000; -pub const VWERASE: usize = 0xa; -pub const VREPRINT: usize = 0xb; -pub const VSUSP: usize = 0xc; -pub const VSTART: usize = 0xd; -pub const VSTOP: usize = 0xe; -pub const VDISCARD: usize = 0x10; -pub const VTIME: usize = 0x7; -pub const IXON: ::tcflag_t = 0x200; -pub const IXOFF: ::tcflag_t = 0x400; -pub const ONLCR: ::tcflag_t = 0x2; -pub const CSIZE: ::tcflag_t = 0x300; -pub const CS6: ::tcflag_t = 0x100; -pub const CS7: ::tcflag_t = 0x200; -pub const CS8: ::tcflag_t = 0x300; -pub const CSTOPB: ::tcflag_t = 0x400; -pub const CREAD: ::tcflag_t = 0x800; -pub const PARENB: ::tcflag_t = 0x1000; -pub const PARODD: ::tcflag_t = 0x2000; -pub const HUPCL: ::tcflag_t = 0x4000; -pub const CLOCAL: ::tcflag_t = 0x8000; -pub const ECHOKE: ::tcflag_t = 0x1; -pub const ECHOE: ::tcflag_t = 0x2; -pub const ECHOK: ::tcflag_t = 0x4; -pub const ECHONL: ::tcflag_t = 0x10; -pub const ECHOPRT: ::tcflag_t = 0x20; -pub const ECHOCTL: ::tcflag_t = 0x40; -pub const ISIG: ::tcflag_t = 0x80; -pub const ICANON: ::tcflag_t = 0x100; -pub const PENDIN: ::tcflag_t = 0x20000000; -pub const NOFLSH: ::tcflag_t = 0x80000000; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const CBAUDEX: ::speed_t = 0o000020; -pub const B57600: ::speed_t = 0o0020; -pub const B115200: ::speed_t = 0o0021; -pub const B230400: ::speed_t = 0o0022; -pub const B460800: ::speed_t = 0o0023; -pub const B500000: ::speed_t = 0o0024; -pub const B576000: ::speed_t = 0o0025; -pub const B921600: ::speed_t = 0o0026; -pub const B1000000: ::speed_t = 0o0027; -pub const B1152000: ::speed_t = 0o0030; -pub const B1500000: ::speed_t = 0o0031; -pub const B2000000: ::speed_t = 0o0032; -pub const B2500000: ::speed_t = 0o0033; -pub const B3000000: ::speed_t = 0o0034; -pub const B3500000: ::speed_t = 0o0035; -pub const B4000000: ::speed_t = 0o0036; - -pub const VEOL: usize = 6; -pub const VEOL2: usize = 8; -pub const VMIN: usize = 5; -pub const IEXTEN: ::tcflag_t = 0x400; -pub const TOSTOP: ::tcflag_t = 0x400000; -pub const FLUSHO: ::tcflag_t = 0x800000; -pub const EXTPROC: ::tcflag_t = 0x10000000; -pub const TCGETS: ::c_ulong = 0x403c7413; -pub const TCSETS: ::c_ulong = 0x803c7414; -pub const TCSETSW: ::c_ulong = 0x803c7415; -pub const TCSETSF: ::c_ulong = 0x803c7416; -pub const TCGETA: ::c_ulong = 0x40147417; -pub const TCSETA: ::c_ulong = 0x80147418; -pub const TCSETAW: ::c_ulong = 0x80147419; -pub const TCSETAF: ::c_ulong = 0x8014741c; -pub const TCSBRK: ::c_ulong = 0x2000741d; -pub const TCXONC: ::c_ulong = 0x2000741e; -pub const TCFLSH: ::c_ulong = 0x2000741f; -pub const TIOCINQ: ::c_ulong = 0x4004667f; -pub const TIOCGPGRP: ::c_ulong = 0x40047477; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCOUTQ: ::c_ulong = 0x40047473; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs deleted file mode 100644 index 12598e052..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/sparc64.rs +++ /dev/null @@ -1,370 +0,0 @@ -//! SPARC64-specific definitions for 64-bit linux-like values - -pub type c_char = i8; -pub type wchar_t = i32; -pub type nlink_t = u32; -pub type blksize_t = i64; -pub type suseconds_t = i32; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - __pad0: u64, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad1: u64, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_long; 2], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __pad0: u64, - pub st_ino: ::ino64_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_int, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __reserved: [::c_long; 2], - } - - pub struct pthread_attr_t { - __size: [u64; 7] - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::mode_t, - __pad0: u16, - pub __seq: ::c_ushort, - __unused1: ::c_ulonglong, - __unused2: ::c_ulonglong, - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_segsz: ::size_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __reserved1: ::c_ulong, - __reserved2: ::c_ulong - } -} - -pub const TIOCGSOFTCAR: ::c_ulong = 0x40047464; -pub const TIOCSSOFTCAR: ::c_ulong = 0x80047465; - -pub const RLIMIT_NOFILE: ::c_int = 6; -pub const RLIMIT_NPROC: ::c_int = 7; - -pub const O_APPEND: ::c_int = 0x8; -pub const O_CREAT: ::c_int = 0x200; -pub const O_EXCL: ::c_int = 0x800; -pub const O_NOCTTY: ::c_int = 0x8000; -pub const O_NONBLOCK: ::c_int = 0x4000; -pub const O_SYNC: ::c_int = 0x802000; -pub const O_RSYNC: ::c_int = 0x802000; -pub const O_DSYNC: ::c_int = 0x2000; -pub const O_FSYNC: ::c_int = 0x802000; - -pub const MAP_GROWSDOWN: ::c_int = 0x0200; - -pub const EDEADLK: ::c_int = 78; -pub const ENAMETOOLONG: ::c_int = 63; -pub const ENOLCK: ::c_int = 79; -pub const ENOSYS: ::c_int = 90; -pub const ENOTEMPTY: ::c_int = 66; -pub const ELOOP: ::c_int = 62; -pub const ENOMSG: ::c_int = 75; -pub const EIDRM: ::c_int = 77; -pub const ECHRNG: ::c_int = 94; -pub const EL2NSYNC: ::c_int = 95; -pub const EL3HLT: ::c_int = 96; -pub const EL3RST: ::c_int = 97; -pub const ELNRNG: ::c_int = 98; -pub const EUNATCH: ::c_int = 99; -pub const ENOCSI: ::c_int = 100; -pub const EL2HLT: ::c_int = 101; -pub const EBADE: ::c_int = 102; -pub const EBADR: ::c_int = 103; -pub const EXFULL: ::c_int = 104; -pub const ENOANO: ::c_int = 105; -pub const EBADRQC: ::c_int = 106; -pub const EBADSLT: ::c_int = 107; -pub const EMULTIHOP: ::c_int = 87; -pub const EOVERFLOW: ::c_int = 92; -pub const ENOTUNIQ: ::c_int = 115; -pub const EBADFD: ::c_int = 93; -pub const EBADMSG: ::c_int = 76; -pub const EREMCHG: ::c_int = 89; -pub const ELIBACC: ::c_int = 114; -pub const ELIBBAD: ::c_int = 112; -pub const ELIBSCN: ::c_int = 124; -pub const ELIBMAX: ::c_int = 123; -pub const ELIBEXEC: ::c_int = 110; -pub const EILSEQ: ::c_int = 122; -pub const ERESTART: ::c_int = 116; -pub const ESTRPIPE: ::c_int = 91; -pub const EUSERS: ::c_int = 68; -pub const ENOTSOCK: ::c_int = 38; -pub const EDESTADDRREQ: ::c_int = 39; -pub const EMSGSIZE: ::c_int = 40; -pub const EPROTOTYPE: ::c_int = 41; -pub const ENOPROTOOPT: ::c_int = 42; -pub const EPROTONOSUPPORT: ::c_int = 43; -pub const ESOCKTNOSUPPORT: ::c_int = 44; -pub const EOPNOTSUPP: ::c_int = 45; -pub const EPFNOSUPPORT: ::c_int = 46; -pub const EAFNOSUPPORT: ::c_int = 47; -pub const EADDRINUSE: ::c_int = 48; -pub const EADDRNOTAVAIL: ::c_int = 49; -pub const ENETDOWN: ::c_int = 50; -pub const ENETUNREACH: ::c_int = 51; -pub const ENETRESET: ::c_int = 52; -pub const ECONNABORTED: ::c_int = 53; -pub const ECONNRESET: ::c_int = 54; -pub const ENOBUFS: ::c_int = 55; -pub const EISCONN: ::c_int = 56; -pub const ENOTCONN: ::c_int = 57; -pub const ESHUTDOWN: ::c_int = 58; -pub const ETOOMANYREFS: ::c_int = 59; -pub const ETIMEDOUT: ::c_int = 60; -pub const ECONNREFUSED: ::c_int = 61; -pub const EHOSTDOWN: ::c_int = 64; -pub const EHOSTUNREACH: ::c_int = 65; -pub const EALREADY: ::c_int = 37; -pub const EINPROGRESS: ::c_int = 36; -pub const ESTALE: ::c_int = 70; -pub const EDQUOT: ::c_int = 69; -pub const ENOMEDIUM: ::c_int = 125; -pub const EMEDIUMTYPE: ::c_int = 126; -pub const ECANCELED: ::c_int = 127; -pub const ENOKEY: ::c_int = 128; -pub const EKEYEXPIRED: ::c_int = 129; -pub const EKEYREVOKED: ::c_int = 130; -pub const EKEYREJECTED: ::c_int = 131; -pub const EOWNERDEAD: ::c_int = 132; -pub const ENOTRECOVERABLE: ::c_int = 133; -pub const EHWPOISON: ::c_int = 135; -pub const ERFKILL: ::c_int = 134; - -pub const SOL_SOCKET: ::c_int = 0xffff; - -pub const SO_REUSEADDR: ::c_int = 4; -pub const SO_TYPE: ::c_int = 0x1008; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_DONTROUTE: ::c_int = 16; -pub const SO_BROADCAST: ::c_int = 32; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_KEEPALIVE: ::c_int = 8; -pub const SO_OOBINLINE: ::c_int = 0x100; -pub const SO_LINGER: ::c_int = 128; -pub const SO_REUSEPORT: ::c_int = 0x200; -pub const SO_ACCEPTCONN: ::c_int = 0x8000; - -pub const SA_ONSTACK: ::c_int = 1; -pub const SA_SIGINFO: ::c_int = 0x200; -pub const SA_NOCLDWAIT: ::c_int = 0x100; - -pub const SIGCHLD: ::c_int = 20; -pub const SIGBUS: ::c_int = 10; -pub const SIGUSR1: ::c_int = 30; -pub const SIGUSR2: ::c_int = 31; -pub const SIGCONT: ::c_int = 19; -pub const SIGSTOP: ::c_int = 17; -pub const SIGTSTP: ::c_int = 18; -pub const SIGURG: ::c_int = 16; -pub const SIGIO: ::c_int = 23; -pub const SIGSYS: ::c_int = 12; -pub const SIGPOLL: ::c_int = 23; -pub const SIGPWR: ::c_int = 29; -pub const SIG_SETMASK: ::c_int = 4; -pub const SIG_BLOCK: ::c_int = 1; -pub const SIG_UNBLOCK: ::c_int = 2; - -pub const POLLWRNORM: ::c_short = 4; -pub const POLLWRBAND: ::c_short = 0x100; - -pub const O_ASYNC: ::c_int = 0x40; -pub const O_NDELAY: ::c_int = 0x4004; - -pub const PTRACE_DETACH: ::c_uint = 11; - -pub const EFD_NONBLOCK: ::c_int = 0x4000; - -pub const F_GETLK: ::c_int = 7; -pub const F_GETOWN: ::c_int = 5; -pub const F_SETOWN: ::c_int = 6; -pub const F_SETLK: ::c_int = 8; -pub const F_SETLKW: ::c_int = 9; - -pub const SFD_NONBLOCK: ::c_int = 0x4000; - -pub const TIOCEXCL: ::c_ulong = 0x2000740d; -pub const TIOCNXCL: ::c_ulong = 0x2000740e; -pub const TIOCSCTTY: ::c_ulong = 0x20007484; -pub const TIOCSTI: ::c_ulong = 0x80017472; -pub const TIOCMGET: ::c_ulong = 0x4004746a; -pub const TIOCMBIS: ::c_ulong = 0x8004746c; -pub const TIOCMBIC: ::c_ulong = 0x8004746b; -pub const TIOCMSET: ::c_ulong = 0x8004746d; -pub const TIOCCONS: ::c_ulong = 0x20007424; - -pub const SFD_CLOEXEC: ::c_int = 0x400000; - -pub const NCCS: usize = 17; -pub const O_TRUNC: ::c_int = 0x400; - -pub const O_CLOEXEC: ::c_int = 0x400000; - -pub const EBFONT: ::c_int = 109; -pub const ENOSTR: ::c_int = 72; -pub const ENODATA: ::c_int = 111; -pub const ETIME: ::c_int = 73; -pub const ENOSR: ::c_int = 74; -pub const ENONET: ::c_int = 80; -pub const ENOPKG: ::c_int = 113; -pub const EREMOTE: ::c_int = 71; -pub const ENOLINK: ::c_int = 82; -pub const EADV: ::c_int = 83; -pub const ESRMNT: ::c_int = 84; -pub const ECOMM: ::c_int = 85; -pub const EPROTO: ::c_int = 86; -pub const EDOTDOT: ::c_int = 88; - -pub const SA_NODEFER: ::c_int = 0x20; -pub const SA_RESETHAND: ::c_int = 0x4; -pub const SA_RESTART: ::c_int = 0x2; -pub const SA_NOCLDSTOP: ::c_int = 0x00000008; - -pub const EPOLL_CLOEXEC: ::c_int = 0x400000; - -pub const EFD_CLOEXEC: ::c_int = 0x400000; -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const O_DIRECTORY: ::c_int = 0o200000; -pub const O_NOFOLLOW: ::c_int = 0o400000; -pub const O_DIRECT: ::c_int = 0x100000; - -pub const MAP_LOCKED: ::c_int = 0x0100; -pub const MAP_NORESERVE: ::c_int = 0x00040; - -pub const EDEADLOCK: ::c_int = 108; - -pub const SO_PEERCRED: ::c_int = 0x40; -pub const SO_RCVLOWAT: ::c_int = 0x800; -pub const SO_SNDLOWAT: ::c_int = 0x1000; -pub const SO_RCVTIMEO: ::c_int = 0x2000; -pub const SO_SNDTIMEO: ::c_int = 0x4000; - -pub const FIOCLEX: ::c_ulong = 0x20006601; -pub const FIONBIO: ::c_ulong = 0x8004667e; - -pub const SYS_gettid: ::c_long = 143; -pub const SYS_perf_event_open: ::c_long = 327; - -pub const MCL_CURRENT: ::c_int = 0x2000; -pub const MCL_FUTURE: ::c_int = 0x4000; - -pub const SIGSTKSZ: ::size_t = 16384; -pub const MINSIGSTKSZ: ::size_t = 4096; -pub const CBAUD: ::tcflag_t = 0x0000100f; -pub const TAB1: ::c_int = 0x800; -pub const TAB2: ::c_int = 0x1000; -pub const TAB3: ::c_int = 0x1800; -pub const CR1: ::c_int = 0x200; -pub const CR2: ::c_int = 0x400; -pub const CR3: ::c_int = 0x600; -pub const FF1: ::c_int = 0x8000; -pub const BS1: ::c_int = 0x2000; -pub const VT1: ::c_int = 0x4000; -pub const VWERASE: usize = 0xe; -pub const VREPRINT: usize = 0xc; -pub const VSUSP: usize = 0xa; -pub const VSTART: usize = 0x8; -pub const VSTOP: usize = 0x9; -pub const VDISCARD: usize = 0xd; -pub const VTIME: usize = 0x5; -pub const IXON: ::tcflag_t = 0x400; -pub const IXOFF: ::tcflag_t = 0x1000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x30; -pub const CS6: ::tcflag_t = 0x10; -pub const CS7: ::tcflag_t = 0x20; -pub const CS8: ::tcflag_t = 0x30; -pub const CSTOPB: ::tcflag_t = 0x40; -pub const CREAD: ::tcflag_t = 0x80; -pub const PARENB: ::tcflag_t = 0x100; -pub const PARODD: ::tcflag_t = 0x200; -pub const HUPCL: ::tcflag_t = 0x400; -pub const CLOCAL: ::tcflag_t = 0x800; -pub const ECHOKE: ::tcflag_t = 0x800; -pub const ECHOE: ::tcflag_t = 0x10; -pub const ECHOK: ::tcflag_t = 0x20; -pub const ECHONL: ::tcflag_t = 0x40; -pub const ECHOPRT: ::tcflag_t = 0x400; -pub const ECHOCTL: ::tcflag_t = 0x200; -pub const ISIG: ::tcflag_t = 0x1; -pub const ICANON: ::tcflag_t = 0x2; -pub const PENDIN: ::tcflag_t = 0x4000; -pub const NOFLSH: ::tcflag_t = 0x80; - -pub const VEOL: usize = 5; -pub const VEOL2: usize = 6; -pub const VMIN: usize = 4; -pub const IEXTEN: ::tcflag_t = 0x8000; -pub const TOSTOP: ::tcflag_t = 0x100; -pub const FLUSHO: ::tcflag_t = 0x2000; -pub const EXTPROC: ::tcflag_t = 0x10000; -pub const TCGETS: ::c_ulong = 0x40245408; -pub const TCSETS: ::c_ulong = 0x80245409; -pub const TCSETSW: ::c_ulong = 0x8024540a; -pub const TCSETSF: ::c_ulong = 0x8024540b; -pub const TCGETA: ::c_ulong = 0x40125401; -pub const TCSETA: ::c_ulong = 0x80125402; -pub const TCSETAW: ::c_ulong = 0x80125403; -pub const TCSETAF: ::c_ulong = 0x80125404; -pub const TCSBRK: ::c_ulong = 0x20005405; -pub const TCXONC: ::c_ulong = 0x20005406; -pub const TCFLSH: ::c_ulong = 0x20005407; -pub const TIOCINQ: ::c_ulong = 0x4004667f; -pub const TIOCGPGRP: ::c_ulong = 0x40047483; -pub const TIOCSPGRP: ::c_ulong = 0x80047482; -pub const TIOCOUTQ: ::c_ulong = 0x40047473; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const FIONREAD: ::c_ulong = 0x4004667f; diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs deleted file mode 100644 index b39ccb391..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/b64/x86_64.rs +++ /dev/null @@ -1,515 +0,0 @@ -//! x86_64-specific definitions for 64-bit linux-like values - -pub type c_char = i8; -pub type wchar_t = i32; -pub type nlink_t = u64; -pub type blksize_t = i64; -pub type greg_t = i64; -pub type suseconds_t = i64; - -s! { - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __unused: [::c_long; 3], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino64_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - __pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - __reserved: [::c_long; 3], - } - - pub struct pthread_attr_t { - __size: [u64; 7] - } - - pub struct _libc_fpxreg { - pub significand: [u16; 4], - pub exponent: u16, - __private: [u16; 3], - } - - pub struct _libc_xmmreg { - pub element: [u32; 4], - } - - pub struct _libc_fpstate { - pub cwd: u16, - pub swd: u16, - pub ftw: u16, - pub fop: u16, - pub rip: u64, - pub rdp: u64, - pub mxcsr: u32, - pub mxcr_mask: u32, - pub _st: [_libc_fpxreg; 8], - pub _xmm: [_libc_xmmreg; 16], - __private: [u64; 12], - } - - pub struct mcontext_t { - pub gregs: [greg_t; 23], - pub fpregs: *mut _libc_fpstate, - __private: [u64; 8], - } - - pub struct ucontext_t { - pub uc_flags: ::c_ulong, - pub uc_link: *mut ucontext_t, - pub uc_stack: ::stack_t, - pub uc_mcontext: mcontext_t, - pub uc_sigmask: ::sigset_t, - __private: [u8; 512], - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_ushort, - __pad1: ::c_ushort, - pub __seq: ::c_ushort, - __pad2: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } -} - -pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; -pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; - -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_NPROC: ::c_int = 6; - -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; - -pub const MAP_GROWSDOWN: ::c_int = 0x0100; - -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SOL_SOCKET: ::c_int = 1; - -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_TYPE: ::c_int = 3; -pub const SO_ERROR: ::c_int = 4; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_SNDBUFFORCE: ::c_int = 32; -pub const SO_RCVBUFFORCE: ::c_int = 33; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_NO_CHECK: ::c_int = 11; -pub const SO_PRIORITY: ::c_int = 12; -pub const SO_LINGER: ::c_int = 13; -pub const SO_BSDCOMPAT: ::c_int = 14; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PASSCRED: ::c_int = 16; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_SNDTIMEO: ::c_int = 21; -pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; -pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; -pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; -pub const SO_BINDTODEVICE: ::c_int = 25; -pub const SO_ATTACH_FILTER: ::c_int = 26; -pub const SO_DETACH_FILTER: ::c_int = 27; -pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; -pub const SO_PEERNAME: ::c_int = 28; -pub const SO_TIMESTAMP: ::c_int = 29; -pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; -pub const SO_ACCEPTCONN: ::c_int = 30; -pub const SO_PEERSEC: ::c_int = 31; -pub const SO_PASSSEC: ::c_int = 34; -pub const SO_TIMESTAMPNS: ::c_int = 35; -pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; -pub const SO_MARK: ::c_int = 36; -pub const SO_TIMESTAMPING: ::c_int = 37; -pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; -pub const SO_PROTOCOL: ::c_int = 38; -pub const SO_DOMAIN: ::c_int = 39; -pub const SO_RXQ_OVFL: ::c_int = 40; -pub const SO_WIFI_STATUS: ::c_int = 41; -pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; -pub const SO_PEEK_OFF: ::c_int = 42; -pub const SO_NOFCS: ::c_int = 43; -pub const SO_LOCK_FILTER: ::c_int = 44; -pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; -pub const SO_BUSY_POLL: ::c_int = 46; -pub const SO_MAX_PACING_RATE: ::c_int = 47; -pub const SO_BPF_EXTENSIONS: ::c_int = 48; -pub const SO_INCOMING_CPU: ::c_int = 49; -pub const SO_ATTACH_BPF: ::c_int = 50; -pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; - -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const PTRACE_DETACH: ::c_uint = 17; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const TIOCEXCL: ::c_ulong = 0x540C; -pub const TIOCNXCL: ::c_ulong = 0x540D; -pub const TIOCSCTTY: ::c_ulong = 0x540E; -pub const TIOCSTI: ::c_ulong = 0x5412; -pub const TIOCMGET: ::c_ulong = 0x5415; -pub const TIOCMBIS: ::c_ulong = 0x5416; -pub const TIOCMBIC: ::c_ulong = 0x5417; -pub const TIOCMSET: ::c_ulong = 0x5418; -pub const TIOCCONS: ::c_ulong = 0x541D; - -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; - -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_32BIT: ::c_int = 0x0040; - -pub const EDEADLOCK: ::c_int = 35; - -pub const FIOCLEX: ::c_ulong = 0x5451; -pub const FIONBIO: ::c_ulong = 0x5421; - -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; -pub const PTRACE_O_EXITKILL: ::c_uint = 1048576; -pub const PTRACE_O_TRACECLONE: ::c_uint = 8; -pub const PTRACE_O_TRACEEXEC: ::c_uint = 16; -pub const PTRACE_O_TRACEEXIT: ::c_uint = 64; -pub const PTRACE_O_TRACEFORK: ::c_uint = 2; -pub const PTRACE_O_TRACESYSGOOD: ::c_uint = 1; -pub const PTRACE_O_TRACEVFORK: ::c_uint = 4; -pub const PTRACE_O_TRACEVFORKDONE: ::c_uint = 32; -pub const PTRACE_O_TRACESECCOMP: ::c_uint = 128; -pub const PTRACE_O_SUSPEND_SECCOMP: ::c_uint = 2097152; -pub const PTRACE_PEEKSIGINFO_SHARED: ::c_uint = 1; - -pub const SYS_gettid: ::c_long = 186; -pub const SYS_perf_event_open: ::c_long = 298; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::c_int = 0x00000800; -pub const TAB2: ::c_int = 0x00001000; -pub const TAB3: ::c_int = 0x00001800; -pub const CR1: ::c_int = 0x00000200; -pub const CR2: ::c_int = 0x00000400; -pub const CR3: ::c_int = 0x00000600; -pub const FF1: ::c_int = 0x00008000; -pub const BS1: ::c_int = 0x00002000; -pub const VT1: ::c_int = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; -pub const EXTPROC: ::tcflag_t = 0x00010000; -pub const TCGETS: ::c_ulong = 0x5401; -pub const TCSETS: ::c_ulong = 0x5402; -pub const TCSETSW: ::c_ulong = 0x5403; -pub const TCSETSF: ::c_ulong = 0x5404; -pub const TCGETA: ::c_ulong = 0x5405; -pub const TCSETA: ::c_ulong = 0x5406; -pub const TCSETAW: ::c_ulong = 0x5407; -pub const TCSETAF: ::c_ulong = 0x5408; -pub const TCSBRK: ::c_ulong = 0x5409; -pub const TCXONC: ::c_ulong = 0x540A; -pub const TCFLSH: ::c_ulong = 0x540B; -pub const TIOCINQ: ::c_ulong = 0x541B; -pub const TIOCGPGRP: ::c_ulong = 0x540F; -pub const TIOCSPGRP: ::c_ulong = 0x5410; -pub const TIOCOUTQ: ::c_ulong = 0x5411; -pub const TIOCGWINSZ: ::c_ulong = 0x5413; -pub const TIOCSWINSZ: ::c_ulong = 0x5414; -pub const FIONREAD: ::c_ulong = 0x541B; - -extern { - pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; - pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; - pub fn makecontext(ucp: *mut ucontext_t, - func: extern fn (), - argc: ::c_int, ...); - pub fn swapcontext(uocp: *mut ucontext_t, - ucp: *const ucontext_t) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs deleted file mode 100644 index 13a5c68d6..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/other/mod.rs +++ /dev/null @@ -1,521 +0,0 @@ -pub type fsblkcnt_t = ::c_ulong; -pub type fsfilcnt_t = ::c_ulong; -pub type rlim_t = c_ulong; -pub type __priority_which_t = ::c_uint; - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: ::sigevent, - __next_prio: *mut aiocb, - __abs_prio: ::c_int, - __policy: ::c_int, - __error_code: ::c_int, - __return_value: ::ssize_t, - pub aio_offset: off_t, - #[cfg(target_pointer_width = "32")] - __unused1: [::c_char; 4], - __glibc_reserved: [::c_char; 32] - } - - pub struct __exit_status { - pub e_termination: ::c_short, - pub e_exit: ::c_short, - } - - pub struct __timeval { - pub tv_sec: ::int32_t, - pub tv_usec: ::int32_t, - } - - pub struct utmpx { - pub ut_type: ::c_short, - pub ut_pid: ::pid_t, - pub ut_line: [::c_char; __UT_LINESIZE], - pub ut_id: [::c_char; 4], - - pub ut_user: [::c_char; __UT_NAMESIZE], - pub ut_host: [::c_char; __UT_HOSTSIZE], - pub ut_exit: __exit_status, - - #[cfg(any(target_arch = "aarch64", - target_arch = "sparc64", - target_pointer_width = "32"))] - pub ut_session: ::c_long, - #[cfg(any(target_arch = "aarch64", - target_arch = "sparc64", - target_pointer_width = "32"))] - pub ut_tv: ::timeval, - - #[cfg(not(any(target_arch = "aarch64", - target_arch = "sparc64", - target_pointer_width = "32")))] - pub ut_session: ::int32_t, - #[cfg(not(any(target_arch = "aarch64", - target_arch = "sparc64", - target_pointer_width = "32")))] - pub ut_tv: __timeval, - - pub ut_addr_v6: [::int32_t; 4], - __glibc_reserved: [::c_char; 20], - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - #[cfg(target_arch = "sparc64")] - __reserved0: ::c_int, - pub sa_flags: ::c_int, - _restorer: *mut ::c_void, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub _pad: [::c_int; 29], - _align: [usize; 0], - } - - pub struct glob64_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut ::c_char, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - } - - pub struct ucred { - pub pid: ::pid_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - } - - pub struct statfs { - pub f_type: __fsword_t, - pub f_bsize: __fsword_t, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - - pub f_namelen: __fsword_t, - pub f_frsize: __fsword_t, - f_spare: [__fsword_t; 5], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::size_t, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::size_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - #[cfg(not(target_arch = "sparc64"))] - pub c_ispeed: ::speed_t, - #[cfg(not(target_arch = "sparc64"))] - pub c_ospeed: ::speed_t, - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - } - - // FIXME this is actually a union - pub struct sem_t { - #[cfg(target_pointer_width = "32")] - __size: [::c_char; 16], - #[cfg(target_pointer_width = "64")] - __size: [::c_char; 32], - __align: [::c_long; 0], - } -} - -pub const __UT_LINESIZE: usize = 32; -pub const __UT_NAMESIZE: usize = 32; -pub const __UT_HOSTSIZE: usize = 256; -pub const EMPTY: ::c_short = 0; -pub const RUN_LVL: ::c_short = 1; -pub const BOOT_TIME: ::c_short = 2; -pub const NEW_TIME: ::c_short = 3; -pub const OLD_TIME: ::c_short = 4; -pub const INIT_PROCESS: ::c_short = 5; -pub const LOGIN_PROCESS: ::c_short = 6; -pub const USER_PROCESS: ::c_short = 7; -pub const DEAD_PROCESS: ::c_short = 8; -pub const ACCOUNTING: ::c_short = 9; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_MEMLOCK: ::c_int = 8; -pub const RLIM_INFINITY: ::rlim_t = !0; -pub const RLIMIT_RTTIME: ::c_int = 15; -pub const RLIMIT_NLIMITS: ::c_int = 16; - -pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; - -pub const SOL_RXRPC: ::c_int = 272; -pub const SOL_PPPOL2TP: ::c_int = 273; -pub const SOL_BLUETOOTH: ::c_int = 274; -pub const SOL_PNPIPE: ::c_int = 275; -pub const SOL_RDS: ::c_int = 276; -pub const SOL_IUCV: ::c_int = 277; -pub const SOL_CAIF: ::c_int = 278; -pub const SOL_ALG: ::c_int = 279; -pub const SOL_NFC: ::c_int = 280; - -pub const MSG_TRYHARD: ::c_int = 4; - -pub const LC_PAPER: ::c_int = 7; -pub const LC_NAME: ::c_int = 8; -pub const LC_ADDRESS: ::c_int = 9; -pub const LC_TELEPHONE: ::c_int = 10; -pub const LC_MEASUREMENT: ::c_int = 11; -pub const LC_IDENTIFICATION: ::c_int = 12; -pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); -pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); -pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); -pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); -pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); -pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); -pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK - | ::LC_NUMERIC_MASK - | ::LC_TIME_MASK - | ::LC_COLLATE_MASK - | ::LC_MONETARY_MASK - | ::LC_MESSAGES_MASK - | LC_PAPER_MASK - | LC_NAME_MASK - | LC_ADDRESS_MASK - | LC_TELEPHONE_MASK - | LC_MEASUREMENT_MASK - | LC_IDENTIFICATION_MASK; - -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_ANONYMOUS: ::c_int = 0x0020; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; -pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; -pub const TCP_THIN_DUPACK: ::c_int = 17; -pub const TCP_USER_TIMEOUT: ::c_int = 18; -pub const TCP_REPAIR: ::c_int = 19; -pub const TCP_REPAIR_QUEUE: ::c_int = 20; -pub const TCP_QUEUE_SEQ: ::c_int = 21; -pub const TCP_REPAIR_OPTIONS: ::c_int = 22; -pub const TCP_FASTOPEN: ::c_int = 23; -pub const TCP_TIMESTAMP: ::c_int = 24; - -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; - -pub const SIGEV_THREAD_ID: ::c_int = 4; - -pub const POLLRDNORM: ::c_short = 0x040; -pub const POLLRDBAND: ::c_short = 0x080; - -pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; -pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; - -pub const BUFSIZ: ::c_uint = 8192; -pub const TMP_MAX: ::c_uint = 238328; -pub const FOPEN_MAX: ::c_uint = 16; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; -pub const _SC_2_C_VERSION: ::c_int = 96; -pub const O_ACCMODE: ::c_int = 3; -pub const ST_RELATIME: ::c_ulong = 4096; -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; -pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; -pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; -pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; -pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; -pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; -pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; -pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; -pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; -pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; -pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; -pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; -pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; -pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; -pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; -pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; -pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; -pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; -pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; -pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; -pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; -pub const TMPFS_MAGIC: ::c_long = 0x01021994; -pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; - -pub const VEOF: usize = 4; - -pub const CPU_SETSIZE: ::c_int = 0x400; - -pub const QFMT_VFS_V1: ::c_int = 4; - -pub const PTRACE_TRACEME: ::c_uint = 0; -pub const PTRACE_PEEKTEXT: ::c_uint = 1; -pub const PTRACE_PEEKDATA: ::c_uint = 2; -pub const PTRACE_PEEKUSER: ::c_uint = 3; -pub const PTRACE_POKETEXT: ::c_uint = 4; -pub const PTRACE_POKEDATA: ::c_uint = 5; -pub const PTRACE_POKEUSER: ::c_uint = 6; -pub const PTRACE_CONT: ::c_uint = 7; -pub const PTRACE_KILL: ::c_uint = 8; -pub const PTRACE_SINGLESTEP: ::c_uint = 9; -pub const PTRACE_ATTACH: ::c_uint = 16; -pub const PTRACE_SYSCALL: ::c_uint = 24; -pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; -pub const PTRACE_GETREGSET: ::c_uint = 0x4204; -pub const PTRACE_SETREGSET: ::c_uint = 0x4205; -pub const PTRACE_SEIZE: ::c_uint = 0x4206; -pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; -pub const PTRACE_LISTEN: ::c_uint = 0x4208; -pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; - -pub const MADV_DODUMP: ::c_int = 17; -pub const MADV_DONTDUMP: ::c_int = 16; - -pub const EPOLLWAKEUP: ::c_int = 0x20000000; - -pub const MADV_HUGEPAGE: ::c_int = 14; -pub const MADV_NOHUGEPAGE: ::c_int = 15; -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const SEEK_DATA: ::c_int = 3; -pub const SEEK_HOLE: ::c_int = 4; - -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; - -pub const TIOCLINUX: ::c_ulong = 0x541C; -pub const TIOCGSERIAL: ::c_ulong = 0x541E; - -pub const RTLD_DEEPBIND: ::c_int = 0x8; -pub const RTLD_GLOBAL: ::c_int = 0x100; -pub const RTLD_NOLOAD: ::c_int = 0x4; - -pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; -pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; -pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; -pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; -pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; - -pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; -pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; -pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; -pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; -pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; -pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; -pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; - -pub const NETLINK_ROUTE: ::c_int = 0; -pub const NETLINK_UNUSED: ::c_int = 1; -pub const NETLINK_USERSOCK: ::c_int = 2; -pub const NETLINK_FIREWALL: ::c_int = 3; -pub const NETLINK_SOCK_DIAG: ::c_int = 4; -pub const NETLINK_NFLOG: ::c_int = 5; -pub const NETLINK_XFRM: ::c_int = 6; -pub const NETLINK_SELINUX: ::c_int = 7; -pub const NETLINK_ISCSI: ::c_int = 8; -pub const NETLINK_AUDIT: ::c_int = 9; -pub const NETLINK_FIB_LOOKUP: ::c_int = 10; -pub const NETLINK_CONNECTOR: ::c_int = 11; -pub const NETLINK_NETFILTER: ::c_int = 12; -pub const NETLINK_IP6_FW: ::c_int = 13; -pub const NETLINK_DNRTMSG: ::c_int = 14; -pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; -pub const NETLINK_GENERIC: ::c_int = 16; -pub const NETLINK_SCSITRANSPORT: ::c_int = 18; -pub const NETLINK_ECRYPTFS: ::c_int = 19; -pub const NETLINK_RDMA: ::c_int = 20; -pub const NETLINK_CRYPTO: ::c_int = 21; -pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; - -pub const MAX_LINKS: ::c_int = 32; - -pub const NLM_F_REQUEST: ::c_int = 1; -pub const NLM_F_MULTI: ::c_int = 2; -pub const NLM_F_ACK: ::c_int = 4; -pub const NLM_F_ECHO: ::c_int = 8; -pub const NLM_F_DUMP_INTR: ::c_int = 16; -pub const NLM_F_DUMP_FILTERED: ::c_int = 32; - -pub const NLM_F_ROOT: ::c_int = 0x100; -pub const NLM_F_MATCH: ::c_int = 0x200; -pub const NLM_F_ATOMIC: ::c_int = 0x400; -pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; - -pub const NLM_F_REPLACE: ::c_int = 0x100; -pub const NLM_F_EXCL: ::c_int = 0x200; -pub const NLM_F_CREATE: ::c_int = 0x400; -pub const NLM_F_APPEND: ::c_int = 0x800; - -pub const NLMSG_NOOP: ::c_int = 0x1; -pub const NLMSG_ERROR: ::c_int = 0x2; -pub const NLMSG_DONE: ::c_int = 0x3; -pub const NLMSG_OVERRUN: ::c_int = 0x4; -pub const NLMSG_MIN_TYPE: ::c_int = 0x10; - -pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; -pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; -pub const NETLINK_PKTINFO: ::c_int = 3; -pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; -pub const NETLINK_NO_ENOBUFS: ::c_int = 5; -pub const NETLINK_RX_RING: ::c_int = 6; -pub const NETLINK_TX_RING: ::c_int = 7; -pub const NETLINK_LISTEN_ALL_NSID: ::c_int = 8; -pub const NETLINK_LIST_MEMBERSHIPS: ::c_int = 9; -pub const NETLINK_CAP_ACK: ::c_int = 10; - -pub const NLA_F_NESTED: ::c_int = 1 << 15; -pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; -pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); - -cfg_if! { - if #[cfg(any(target_arch = "arm", target_arch = "x86", - target_arch = "x86_64"))] { - pub const PTHREAD_STACK_MIN: ::size_t = 16384; - } else if #[cfg(target_arch = "sparc64")] { - pub const PTHREAD_STACK_MIN: ::size_t = 0x6000; - } else { - pub const PTHREAD_STACK_MIN: ::size_t = 131072; - } -} - -extern { - pub fn utmpxname(file: *const ::c_char) -> ::c_int; - pub fn getutxent() -> *mut utmpx; - pub fn getutxid(ut: *const utmpx) -> *mut utmpx; - pub fn getutxline(ut: *const utmpx) -> *mut utmpx; - pub fn pututxline(ut: *const utmpx) -> *mut utmpx; - pub fn setutxent(); - pub fn endutxent(); - pub fn getpt() -> ::c_int; -} - -#[link(name = "util")] -extern { - pub fn sysctl(name: *mut ::c_int, - namelen: ::c_int, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn backtrace(buf: *mut *mut ::c_void, - sz: ::c_int) -> ::c_int; - pub fn glob64(pattern: *const ::c_char, - flags: ::c_int, - errfunc: ::dox::Option ::c_int>, - pglob: *mut glob64_t) -> ::c_int; - pub fn globfree64(pglob: *mut glob64_t); - pub fn ptrace(request: ::c_uint, ...) -> ::c_long; - pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *mut ::cpu_set_t) -> ::c_int; - pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *const ::cpu_set_t) -> ::c_int; - pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::__priority_which_t, who: ::id_t, - prio: ::c_int) -> ::c_int; - pub fn pthread_getaffinity_np(thread: ::pthread_t, - cpusetsize: ::size_t, - cpuset: *mut ::cpu_set_t) -> ::c_int; - pub fn pthread_setaffinity_np(thread: ::pthread_t, - cpusetsize: ::size_t, - cpuset: *const ::cpu_set_t) -> ::c_int; - pub fn sched_getcpu() -> ::c_int; -} - -cfg_if! { - if #[cfg(any(target_arch = "x86", - target_arch = "arm", - target_arch = "powerpc"))] { - mod b32; - pub use self::b32::*; - } else if #[cfg(any(target_arch = "x86_64", - target_arch = "aarch64", - target_arch = "powerpc64", - target_arch = "sparc64"))] { - mod b64; - pub use self::b64::*; - } else { - // Unknown target_arch - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs deleted file mode 100644 index f9f741679..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/linux/s390x.rs +++ /dev/null @@ -1,738 +0,0 @@ -pub type blkcnt_t = i64; -pub type blksize_t = i64; -pub type c_char = u8; -pub type c_long = i64; -pub type c_ulong = u64; -pub type fsblkcnt_t = u64; -pub type fsfilcnt_t = u64; -pub type ino_t = u64; -pub type nlink_t = u64; -pub type off_t = i64; -pub type rlim_t = u64; -pub type suseconds_t = i64; -pub type time_t = i64; -pub type wchar_t = i32; -pub type greg_t = u64; -pub type clock_t = i64; -pub type __fsword_t = ::c_long; -pub type __priority_which_t = ::c_uint; - -s! { - pub struct aiocb { - pub aio_fildes: ::c_int, - pub aio_lio_opcode: ::c_int, - pub aio_reqprio: ::c_int, - pub aio_buf: *mut ::c_void, - pub aio_nbytes: ::size_t, - pub aio_sigevent: ::sigevent, - __next_prio: *mut aiocb, - __abs_prio: ::c_int, - __policy: ::c_int, - __error_code: ::c_int, - __return_value: ::ssize_t, - pub aio_offset: off_t, - #[cfg(target_pointer_width = "32")] - __unused1: [::c_char; 4], - __glibc_reserved: [::c_char; 32] - } - - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - st_pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - __glibc_reserved: [::c_long; 3], - } - - pub struct stat64 { - pub st_dev: ::dev_t, - pub st_ino: ::ino64_t, - pub st_nlink: ::nlink_t, - pub st_mode: ::mode_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - st_pad0: ::c_int, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - __glibc_reserved: [::c_long; 3], - } - - pub struct pthread_attr_t { - __size: [::c_ulong; 7] - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - __glibc_reserved0: ::c_int, - pub sa_flags: ::c_int, - _restorer: *mut ::c_void, - pub sa_mask: sigset_t, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t, - } - - pub struct sigset_t { - __size: [::c_ulong; 16], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - _pad: ::c_int, - _pad2: [::c_long; 14], - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::mode_t, - pub __seq: ::c_ushort, - __pad1: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - pub shm_dtime: ::time_t, - pub shm_ctime: ::time_t, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct statfs { - pub f_type: ::c_uint, - pub f_bsize: ::c_uint, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - pub f_namelen: ::c_uint, - pub f_frsize: ::c_uint, - pub f_flags: ::c_uint, - f_spare: [::c_uint; 4], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::size_t, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::size_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_line: ::cc_t, - pub c_cc: [::cc_t; ::NCCS], - pub c_ispeed: ::speed_t, - pub c_ospeed: ::speed_t, - } - - pub struct sysinfo { - pub uptime: ::c_long, - pub loads: [::c_ulong; 3], - pub totalram: ::c_ulong, - pub freeram: ::c_ulong, - pub sharedram: ::c_ulong, - pub bufferram: ::c_ulong, - pub totalswap: ::c_ulong, - pub freeswap: ::c_ulong, - pub procs: ::c_ushort, - pub pad: ::c_ushort, - pub totalhigh: ::c_ulong, - pub freehigh: ::c_ulong, - pub mem_unit: ::c_uint, - pub _f: [::c_char; 0], - } - - pub struct glob64_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut ::c_char, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - } - - pub struct ucred { - pub pid: ::pid_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - } - - // FIXME this is actually a union - pub struct sem_t { - __size: [::c_char; 32], - __align: [::c_long; 0], - } - - pub struct __psw_t { - pub mask: u64, - pub addr: u64, - } - - // FIXME: This is actually a union. - pub struct fpreg_t { - pub d: ::c_double, - // f: ::c_float, - } - - pub struct fpregset_t { - pub fpc: u32, - __pad: u32, - pub fprs: [fpreg_t; 16], - } - - pub struct mcontext_t { - pub psw: __psw_t, - pub gregs: [u64; 16], - pub aregs: [u32; 16], - pub fpregs: fpregset_t, - } - - pub struct ucontext_t { - pub uc_flags: ::c_ulong, - pub uc_link: *mut ucontext_t, - pub uc_stack: ::stack_t, - pub uc_mcontext: mcontext_t, - pub uc_sigmask: ::sigset_t, - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - pub msg_rtime: ::time_t, - pub msg_ctime: ::time_t, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } -} - -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; - -pub const SFD_CLOEXEC: ::c_int = 0x080000; - -pub const NCCS: usize = 32; - -pub const O_TRUNC: ::c_int = 512; - -pub const O_CLOEXEC: ::c_int = 0x80000; - -pub const EBFONT: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const EDOTDOT: ::c_int = 73; - -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_NOCLDSTOP: ::c_int = 0x00000001; - -pub const EPOLL_CLOEXEC: ::c_int = 0x80000; - -pub const EFD_CLOEXEC: ::c_int = 0x80000; - -pub const POSIX_FADV_DONTNEED: ::c_int = 6; -pub const POSIX_FADV_NOREUSE: ::c_int = 7; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; - -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNREFUSED: ::c_int = 111; -pub const ECONNRESET: ::c_int = 104; -pub const EDEADLK: ::c_int = 35; -pub const ENOSYS: ::c_int = 38; -pub const ENOTCONN: ::c_int = 107; -pub const ETIMEDOUT: ::c_int = 110; -pub const FIOCLEX: ::c_ulong = 0x5451; -pub const FIONBIO: ::c_ulong = 0x5421; -pub const MAP_ANON: ::c_int = 0x20; -pub const O_ACCMODE: ::c_int = 3; -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NONBLOCK: ::c_int = 2048; -pub const PTHREAD_STACK_MIN: ::size_t = 16384; -pub const RLIM_INFINITY: ::rlim_t = 0xffffffffffffffff; -pub const SA_NOCLDWAIT: ::c_int = 2; -pub const SA_ONSTACK: ::c_int = 0x08000000; -pub const SA_SIGINFO: ::c_int = 4; -pub const SIGBUS: ::c_int = 7; -pub const SIGSTKSZ: ::size_t = 0x2000; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const SIG_SETMASK: ::c_int = 2; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_STREAM: ::c_int = 1; -pub const SOL_SOCKET: ::c_int = 1; -pub const SO_BROADCAST: ::c_int = 6; -pub const SO_ERROR: ::c_int = 4; -pub const SO_RCVTIMEO: ::c_int = 20; -pub const SO_REUSEADDR: ::c_int = 2; -pub const SO_SNDTIMEO: ::c_int = 21; - -pub const RLIMIT_RSS: ::c_int = 5; -pub const RLIMIT_NOFILE: ::c_int = 7; -pub const RLIMIT_AS: ::c_int = 9; -pub const RLIMIT_NPROC: ::c_int = 6; -pub const RLIMIT_MEMLOCK: ::c_int = 8; -pub const RLIMIT_RTTIME: ::c_int = 15; -pub const RLIMIT_NLIMITS: ::c_int = 16; - -pub const O_NOCTTY: ::c_int = 256; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; - -pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; - -pub const LC_PAPER: ::c_int = 7; -pub const LC_NAME: ::c_int = 8; -pub const LC_ADDRESS: ::c_int = 9; -pub const LC_TELEPHONE: ::c_int = 10; -pub const LC_MEASUREMENT: ::c_int = 11; -pub const LC_IDENTIFICATION: ::c_int = 12; -pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER); -pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME); -pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS); -pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE); -pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT); -pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION); -pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK - | ::LC_NUMERIC_MASK - | ::LC_TIME_MASK - | ::LC_COLLATE_MASK - | ::LC_MONETARY_MASK - | ::LC_MESSAGES_MASK - | LC_PAPER_MASK - | LC_NAME_MASK - | LC_ADDRESS_MASK - | LC_TELEPHONE_MASK - | LC_MEASUREMENT_MASK - | LC_IDENTIFICATION_MASK; - -pub const MAP_ANONYMOUS: ::c_int = 0x0020; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; - -pub const EDEADLOCK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SOCK_SEQPACKET: ::c_int = 5; - -pub const SO_TYPE: ::c_int = 3; -pub const SO_DONTROUTE: ::c_int = 5; -pub const SO_SNDBUF: ::c_int = 7; -pub const SO_RCVBUF: ::c_int = 8; -pub const SO_KEEPALIVE: ::c_int = 9; -pub const SO_OOBINLINE: ::c_int = 10; -pub const SO_LINGER: ::c_int = 13; -pub const SO_REUSEPORT: ::c_int = 15; -pub const SO_PEERCRED: ::c_int = 17; -pub const SO_RCVLOWAT: ::c_int = 18; -pub const SO_SNDLOWAT: ::c_int = 19; -pub const SO_ACCEPTCONN: ::c_int = 30; - -pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; -pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; -pub const TCP_THIN_DUPACK: ::c_int = 17; -pub const TCP_USER_TIMEOUT: ::c_int = 18; -pub const TCP_REPAIR: ::c_int = 19; -pub const TCP_REPAIR_QUEUE: ::c_int = 20; -pub const TCP_QUEUE_SEQ: ::c_int = 21; -pub const TCP_REPAIR_OPTIONS: ::c_int = 22; -pub const TCP_FASTOPEN: ::c_int = 23; -pub const TCP_TIMESTAMP: ::c_int = 24; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -pub const SIGUNUSED: ::c_int = 31; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; - -pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; -pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; - -pub const BUFSIZ: ::c_uint = 8192; -pub const TMP_MAX: ::c_uint = 238328; -pub const FOPEN_MAX: ::c_uint = 16; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; -pub const _SC_2_C_VERSION: ::c_int = 96; -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; -pub const ST_RELATIME: ::c_ulong = 4096; -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const ADFS_SUPER_MAGIC: ::c_int = 0x0000adf5; -pub const AFFS_SUPER_MAGIC: ::c_int = 0x0000adff; -pub const CODA_SUPER_MAGIC: ::c_int = 0x73757245; -pub const CRAMFS_MAGIC: ::c_int = 0x28cd3d45; -pub const EFS_SUPER_MAGIC: ::c_int = 0x00414a53; -pub const EXT2_SUPER_MAGIC: ::c_int = 0x0000ef53; -pub const EXT3_SUPER_MAGIC: ::c_int = 0x0000ef53; -pub const EXT4_SUPER_MAGIC: ::c_int = 0x0000ef53; -pub const HPFS_SUPER_MAGIC: ::c_int = 0xf995e849; -pub const HUGETLBFS_MAGIC: ::c_int = 0x958458f6; -pub const ISOFS_SUPER_MAGIC: ::c_int = 0x00009660; -pub const JFFS2_SUPER_MAGIC: ::c_int = 0x000072b6; -pub const MINIX_SUPER_MAGIC: ::c_int = 0x0000137f; -pub const MINIX_SUPER_MAGIC2: ::c_int = 0x0000138f; -pub const MINIX2_SUPER_MAGIC: ::c_int = 0x00002468; -pub const MINIX2_SUPER_MAGIC2: ::c_int = 0x00002478; -pub const MSDOS_SUPER_MAGIC: ::c_int = 0x00004d44; -pub const NCP_SUPER_MAGIC: ::c_int = 0x0000564c; -pub const NFS_SUPER_MAGIC: ::c_int = 0x00006969; -pub const OPENPROM_SUPER_MAGIC: ::c_int = 0x00009fa1; -pub const PROC_SUPER_MAGIC: ::c_int = 0x00009fa0; -pub const QNX4_SUPER_MAGIC: ::c_int = 0x0000002f; -pub const REISERFS_SUPER_MAGIC: ::c_int = 0x52654973; -pub const SMB_SUPER_MAGIC: ::c_int = 0x0000517b; -pub const TMPFS_MAGIC: ::c_int = 0x01021994; -pub const USBDEVICE_SUPER_MAGIC: ::c_int = 0x00009fa2; - -pub const VEOF: usize = 4; -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; - -pub const CPU_SETSIZE: ::c_int = 0x400; - -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const QFMT_VFS_V1: ::c_int = 4; - -pub const PTRACE_TRACEME: ::c_uint = 0; -pub const PTRACE_PEEKTEXT: ::c_uint = 1; -pub const PTRACE_PEEKDATA: ::c_uint = 2; -pub const PTRACE_PEEKUSER: ::c_uint = 3; -pub const PTRACE_POKETEXT: ::c_uint = 4; -pub const PTRACE_POKEDATA: ::c_uint = 5; -pub const PTRACE_POKEUSER: ::c_uint = 6; -pub const PTRACE_CONT: ::c_uint = 7; -pub const PTRACE_KILL: ::c_uint = 8; -pub const PTRACE_SINGLESTEP: ::c_uint = 9; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_ATTACH: ::c_uint = 16; -pub const PTRACE_DETACH: ::c_uint = 17; -pub const PTRACE_SYSCALL: ::c_uint = 24; -pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; -pub const PTRACE_GETREGSET: ::c_uint = 0x4204; -pub const PTRACE_SETREGSET: ::c_uint = 0x4205; -pub const PTRACE_SEIZE: ::c_uint = 0x4206; -pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; -pub const PTRACE_LISTEN: ::c_uint = 0x4208; -pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; - -pub const MADV_DODUMP: ::c_int = 17; -pub const MADV_DONTDUMP: ::c_int = 16; - -pub const EPOLLWAKEUP: ::c_int = 0x20000000; - -pub const MADV_HUGEPAGE: ::c_int = 14; -pub const MADV_NOHUGEPAGE: ::c_int = 15; -pub const MAP_HUGETLB: ::c_int = 0x040000; - -pub const EFD_NONBLOCK: ::c_int = 0x800; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; - -pub const SEEK_DATA: ::c_int = 3; -pub const SEEK_HOLE: ::c_int = 4; - -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; - -pub const TCGETS: ::c_ulong = 0x5401; -pub const TCSETS: ::c_ulong = 0x5402; -pub const TCSETSW: ::c_ulong = 0x5403; -pub const TCSETSF: ::c_ulong = 0x5404; -pub const TCGETA: ::c_ulong = 0x5405; -pub const TCSETA: ::c_ulong = 0x5406; -pub const TCSETAW: ::c_ulong = 0x5407; -pub const TCSETAF: ::c_ulong = 0x5408; -pub const TCSBRK: ::c_ulong = 0x5409; -pub const TCXONC: ::c_ulong = 0x540A; -pub const TCFLSH: ::c_ulong = 0x540B; -pub const TIOCGSOFTCAR: ::c_ulong = 0x5419; -pub const TIOCSSOFTCAR: ::c_ulong = 0x541A; -pub const TIOCINQ: ::c_ulong = 0x541B; -pub const TIOCLINUX: ::c_ulong = 0x541C; -pub const TIOCGSERIAL: ::c_ulong = 0x541E; -pub const TIOCEXCL: ::c_ulong = 0x540C; -pub const TIOCNXCL: ::c_ulong = 0x540D; -pub const TIOCSCTTY: ::c_ulong = 0x540E; -pub const TIOCGPGRP: ::c_ulong = 0x540F; -pub const TIOCSPGRP: ::c_ulong = 0x5410; -pub const TIOCOUTQ: ::c_ulong = 0x5411; -pub const TIOCSTI: ::c_ulong = 0x5412; -pub const TIOCGWINSZ: ::c_ulong = 0x5413; -pub const TIOCSWINSZ: ::c_ulong = 0x5414; -pub const TIOCMGET: ::c_ulong = 0x5415; -pub const TIOCMBIS: ::c_ulong = 0x5416; -pub const TIOCMBIC: ::c_ulong = 0x5417; -pub const TIOCMSET: ::c_ulong = 0x5418; -pub const FIONREAD: ::c_ulong = 0x541B; -pub const TIOCCONS: ::c_ulong = 0x541D; - -pub const RTLD_DEEPBIND: ::c_int = 0x8; -pub const RTLD_GLOBAL: ::c_int = 0x100; -pub const RTLD_NOLOAD: ::c_int = 0x4; - -pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; -pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; -pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; -pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; -pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; - -pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; -pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; -pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; -pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; -pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; -pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; -pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; - -pub const SYS_gettid: ::c_long = 236; -pub const SYS_perf_event_open: ::c_long = 331; - -#[link(name = "util")] -extern { - pub fn sysctl(name: *mut ::c_int, - namelen: ::c_int, - oldp: *mut ::c_void, - oldlenp: *mut ::size_t, - newp: *mut ::c_void, - newlen: ::size_t) - -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn backtrace(buf: *mut *mut ::c_void, - sz: ::c_int) -> ::c_int; - pub fn glob64(pattern: *const ::c_char, - flags: ::c_int, - errfunc: ::dox::Option ::c_int>, - pglob: *mut glob64_t) -> ::c_int; - pub fn globfree64(pglob: *mut glob64_t); - pub fn ptrace(request: ::c_uint, ...) -> ::c_long; - pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *mut ::cpu_set_t) -> ::c_int; - pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t, - cpusetsize: ::size_t, - cpuset: *const ::cpu_set_t) -> ::c_int; - pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::__priority_which_t, who: ::id_t, - prio: ::c_int) -> ::c_int; - pub fn pthread_getaffinity_np(thread: ::pthread_t, - cpusetsize: ::size_t, - cpuset: *mut ::cpu_set_t) -> ::c_int; - pub fn pthread_setaffinity_np(thread: ::pthread_t, - cpusetsize: ::size_t, - cpuset: *const ::cpu_set_t) -> ::c_int; - pub fn sched_getcpu() -> ::c_int; - pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; - pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; - pub fn makecontext(ucp: *mut ucontext_t, - func: extern fn (), - argc: ::c_int, ...); - pub fn swapcontext(uocp: *mut ucontext_t, - ucp: *const ucontext_t) -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs deleted file mode 100644 index b20d043d7..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/notbsd/mod.rs +++ /dev/null @@ -1,998 +0,0 @@ -use dox::mem; - -pub type sa_family_t = u16; -pub type pthread_key_t = ::c_uint; -pub type speed_t = ::c_uint; -pub type tcflag_t = ::c_uint; -pub type loff_t = ::c_longlong; -pub type clockid_t = ::c_int; -pub type key_t = ::c_int; -pub type id_t = ::c_uint; - -pub enum timezone {} - -s! { - pub struct sockaddr { - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14], - } - - pub struct sockaddr_in { - pub sin_family: sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [u8; 8], - } - - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct sockaddr_un { - pub sun_family: sa_family_t, - pub sun_path: [::c_char; 108] - } - - pub struct sockaddr_storage { - pub ss_family: sa_family_t, - __ss_align: ::size_t, - #[cfg(target_pointer_width = "32")] - __ss_pad2: [u8; 128 - 2 * 4], - #[cfg(target_pointer_width = "64")] - __ss_pad2: [u8; 128 - 2 * 8], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: socklen_t, - - #[cfg(any(target_os = "linux", - target_os = "emscripten", - target_os = "fuchsia"))] - pub ai_addr: *mut ::sockaddr, - - pub ai_canonname: *mut c_char, - - #[cfg(target_os = "android")] - pub ai_addr: *mut ::sockaddr, - - pub ai_next: *mut addrinfo, - } - - pub struct sockaddr_nl { - pub nl_family: ::sa_family_t, - nl_pad: ::c_ushort, - pub nl_pid: u32, - pub nl_groups: u32 - } - - pub struct sockaddr_ll { - pub sll_family: ::c_ushort, - pub sll_protocol: ::c_ushort, - pub sll_ifindex: ::c_int, - pub sll_hatype: ::c_ushort, - pub sll_pkttype: ::c_uchar, - pub sll_halen: ::c_uchar, - pub sll_addr: [::c_uchar; 8] - } - - pub struct fd_set { - fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *const ::c_char, - } - - pub struct sched_param { - pub sched_priority: ::c_int, - #[cfg(any(target_env = "musl"))] - pub sched_ss_low_priority: ::c_int, - #[cfg(any(target_env = "musl"))] - pub sched_ss_repl_period: ::timespec, - #[cfg(any(target_env = "musl"))] - pub sched_ss_init_budget: ::timespec, - #[cfg(any(target_env = "musl"))] - pub sched_ss_max_repl: ::c_int, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - #[cfg_attr(any(all(target_arch = "x86", - not(target_env = "musl"), - not(target_os = "android")), - target_arch = "x86_64"), - repr(packed))] - pub struct epoll_event { - pub events: ::uint32_t, - pub u64: ::uint64_t, - } - - pub struct utsname { - pub sysname: [::c_char; 65], - pub nodename: [::c_char; 65], - pub release: [::c_char; 65], - pub version: [::c_char; 65], - pub machine: [::c_char; 65], - pub domainname: [::c_char; 65] - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct sigevent { - pub sigev_value: ::sigval, - pub sigev_signo: ::c_int, - pub sigev_notify: ::c_int, - // Actually a union. We only expose sigev_notify_thread_id because it's - // the most useful member - pub sigev_notify_thread_id: ::c_int, - #[cfg(target_pointer_width = "64")] - __unused1: [::c_int; 11], - #[cfg(target_pointer_width = "32")] - __unused1: [::c_int; 12] - } -} - -// intentionally not public, only used for fd_set -cfg_if! { - if #[cfg(target_pointer_width = "32")] { - const ULONG_SIZE: usize = 32; - } else if #[cfg(target_pointer_width = "64")] { - const ULONG_SIZE: usize = 64; - } else { - // Unknown target_pointer_width - } -} - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 2147483647; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 2; -pub const _IOLBF: ::c_int = 1; - -pub const F_DUPFD: ::c_int = 0; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; - -// Linux-specific fcntls -pub const F_SETLEASE: ::c_int = 1024; -pub const F_GETLEASE: ::c_int = 1025; -pub const F_NOTIFY: ::c_int = 1026; -pub const F_DUPFD_CLOEXEC: ::c_int = 1030; -pub const F_SETPIPE_SZ: ::c_int = 1031; -pub const F_GETPIPE_SZ: ::c_int = 1032; - -// TODO(#235): Include file sealing fcntls once we have a way to verify them. - -pub const SIGTRAP: ::c_int = 5; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; - -pub const CLOCK_REALTIME: clockid_t = 0; -pub const CLOCK_MONOTONIC: clockid_t = 1; -pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; -pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; -pub const CLOCK_MONOTONIC_RAW: clockid_t = 4; -pub const CLOCK_REALTIME_COARSE: clockid_t = 5; -pub const CLOCK_MONOTONIC_COARSE: clockid_t = 6; -pub const CLOCK_BOOTTIME: clockid_t = 7; -pub const CLOCK_REALTIME_ALARM: clockid_t = 8; -pub const CLOCK_BOOTTIME_ALARM: clockid_t = 9; -// TODO(#247) Someday our Travis shall have glibc 2.21 (released in Sep -// 2014.) See also musl/mod.rs -// pub const CLOCK_SGI_CYCLE: clockid_t = 10; -// pub const CLOCK_TAI: clockid_t = 11; -pub const TIMER_ABSTIME: ::c_int = 1; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_LOCKS: ::c_int = 10; -pub const RLIMIT_SIGPENDING: ::c_int = 11; -pub const RLIMIT_MSGQUEUE: ::c_int = 12; -pub const RLIMIT_NICE: ::c_int = 13; -pub const RLIMIT_RTPRIO: ::c_int = 14; - -pub const RUSAGE_SELF: ::c_int = 0; - -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; -pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; - -pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC; - -pub const S_IFIFO: ::mode_t = 4096; -pub const S_IFCHR: ::mode_t = 8192; -pub const S_IFBLK: ::mode_t = 24576; -pub const S_IFDIR: ::mode_t = 16384; -pub const S_IFREG: ::mode_t = 32768; -pub const S_IFLNK: ::mode_t = 40960; -pub const S_IFSOCK: ::mode_t = 49152; -pub const S_IFMT: ::mode_t = 61440; -pub const S_IRWXU: ::mode_t = 448; -pub const S_IXUSR: ::mode_t = 64; -pub const S_IWUSR: ::mode_t = 128; -pub const S_IRUSR: ::mode_t = 256; -pub const S_IRWXG: ::mode_t = 56; -pub const S_IXGRP: ::mode_t = 8; -pub const S_IWGRP: ::mode_t = 16; -pub const S_IRGRP: ::mode_t = 32; -pub const S_IRWXO: ::mode_t = 7; -pub const S_IXOTH: ::mode_t = 1; -pub const S_IWOTH: ::mode_t = 2; -pub const S_IROTH: ::mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const LC_CTYPE: ::c_int = 0; -pub const LC_NUMERIC: ::c_int = 1; -pub const LC_TIME: ::c_int = 2; -pub const LC_COLLATE: ::c_int = 3; -pub const LC_MONETARY: ::c_int = 4; -pub const LC_MESSAGES: ::c_int = 5; -pub const LC_ALL: ::c_int = 6; -pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE); -pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC); -pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME); -pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE); -pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY); -pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES); -// LC_ALL_MASK defined per platform - -pub const MAP_FILE: ::c_int = 0x0000; -pub const MAP_SHARED: ::c_int = 0x0001; -pub const MAP_PRIVATE: ::c_int = 0x0002; -pub const MAP_FIXED: ::c_int = 0x0010; - -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -// MS_ flags for msync(2) -pub const MS_ASYNC: ::c_int = 0x0001; -pub const MS_INVALIDATE: ::c_int = 0x0002; -pub const MS_SYNC: ::c_int = 0x0004; - -// MS_ flags for mount(2) -pub const MS_RDONLY: ::c_ulong = 0x01; -pub const MS_NOSUID: ::c_ulong = 0x02; -pub const MS_NODEV: ::c_ulong = 0x04; -pub const MS_NOEXEC: ::c_ulong = 0x08; -pub const MS_SYNCHRONOUS: ::c_ulong = 0x10; -pub const MS_REMOUNT: ::c_ulong = 0x20; -pub const MS_MANDLOCK: ::c_ulong = 0x40; -pub const MS_DIRSYNC: ::c_ulong = 0x80; -pub const MS_NOATIME: ::c_ulong = 0x0400; -pub const MS_NODIRATIME: ::c_ulong = 0x0800; -pub const MS_BIND: ::c_ulong = 0x1000; -pub const MS_MOVE: ::c_ulong = 0x2000; -pub const MS_REC: ::c_ulong = 0x4000; -pub const MS_SILENT: ::c_ulong = 0x8000; -pub const MS_POSIXACL: ::c_ulong = 0x010000; -pub const MS_UNBINDABLE: ::c_ulong = 0x020000; -pub const MS_PRIVATE: ::c_ulong = 0x040000; -pub const MS_SLAVE: ::c_ulong = 0x080000; -pub const MS_SHARED: ::c_ulong = 0x100000; -pub const MS_RELATIME: ::c_ulong = 0x200000; -pub const MS_KERNMOUNT: ::c_ulong = 0x400000; -pub const MS_I_VERSION: ::c_ulong = 0x800000; -pub const MS_STRICTATIME: ::c_ulong = 0x1000000; -pub const MS_ACTIVE: ::c_ulong = 0x40000000; -pub const MS_NOUSER: ::c_ulong = 0x80000000; -pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000; -pub const MS_MGC_MSK: ::c_ulong = 0xffff0000; -pub const MS_RMT_MASK: ::c_ulong = 0x800051; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EAGAIN: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const ENOTBLK: ::c_int = 15; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -pub const ENODEV: ::c_int = 19; -pub const ENOTDIR: ::c_int = 20; -pub const EISDIR: ::c_int = 21; -pub const EINVAL: ::c_int = 22; -pub const ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const ETXTBSY: ::c_int = 26; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const EWOULDBLOCK: ::c_int = EAGAIN; - -pub const SCM_RIGHTS: ::c_int = 0x01; -pub const SCM_CREDENTIALS: ::c_int = 0x02; - -pub const IPPROTO_RAW: ::c_int = 255; - -pub const PROT_GROWSDOWN: ::c_int = 0x1000000; -pub const PROT_GROWSUP: ::c_int = 0x2000000; - -pub const MAP_TYPE: ::c_int = 0x000f; - -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; -pub const MADV_REMOVE: ::c_int = 9; -pub const MADV_DONTFORK: ::c_int = 10; -pub const MADV_DOFORK: ::c_int = 11; -pub const MADV_MERGEABLE: ::c_int = 12; -pub const MADV_UNMERGEABLE: ::c_int = 13; -pub const MADV_HWPOISON: ::c_int = 100; - -pub const IFF_UP: ::c_int = 0x1; -pub const IFF_BROADCAST: ::c_int = 0x2; -pub const IFF_DEBUG: ::c_int = 0x4; -pub const IFF_LOOPBACK: ::c_int = 0x8; -pub const IFF_POINTOPOINT: ::c_int = 0x10; -pub const IFF_NOTRAILERS: ::c_int = 0x20; -pub const IFF_RUNNING: ::c_int = 0x40; -pub const IFF_NOARP: ::c_int = 0x80; -pub const IFF_PROMISC: ::c_int = 0x100; -pub const IFF_ALLMULTI: ::c_int = 0x200; -pub const IFF_MASTER: ::c_int = 0x400; -pub const IFF_SLAVE: ::c_int = 0x800; -pub const IFF_MULTICAST: ::c_int = 0x1000; -pub const IFF_PORTSEL: ::c_int = 0x2000; -pub const IFF_AUTOMEDIA: ::c_int = 0x4000; -pub const IFF_DYNAMIC: ::c_int = 0x8000; - -pub const SOL_IP: ::c_int = 0; -pub const SOL_TCP: ::c_int = 6; -pub const SOL_IPV6: ::c_int = 41; -pub const SOL_ICMPV6: ::c_int = 58; -pub const SOL_RAW: ::c_int = 255; -pub const SOL_DECNET: ::c_int = 261; -pub const SOL_X25: ::c_int = 262; -pub const SOL_PACKET: ::c_int = 263; -pub const SOL_ATM: ::c_int = 264; -pub const SOL_AAL: ::c_int = 265; -pub const SOL_IRDA: ::c_int = 266; -pub const SOL_NETBEUI: ::c_int = 267; -pub const SOL_LLC: ::c_int = 268; -pub const SOL_DCCP: ::c_int = 269; -pub const SOL_NETLINK: ::c_int = 270; -pub const SOL_TIPC: ::c_int = 271; - -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_UNIX: ::c_int = 1; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_INET: ::c_int = 2; -pub const AF_AX25: ::c_int = 3; -pub const AF_IPX: ::c_int = 4; -pub const AF_APPLETALK: ::c_int = 5; -pub const AF_NETROM: ::c_int = 6; -pub const AF_BRIDGE: ::c_int = 7; -pub const AF_ATMPVC: ::c_int = 8; -pub const AF_X25: ::c_int = 9; -pub const AF_INET6: ::c_int = 10; -pub const AF_ROSE: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_NETBEUI: ::c_int = 13; -pub const AF_SECURITY: ::c_int = 14; -pub const AF_KEY: ::c_int = 15; -pub const AF_NETLINK: ::c_int = 16; -pub const AF_ROUTE: ::c_int = AF_NETLINK; -pub const AF_PACKET: ::c_int = 17; -pub const AF_ASH: ::c_int = 18; -pub const AF_ECONET: ::c_int = 19; -pub const AF_ATMSVC: ::c_int = 20; -pub const AF_RDS: ::c_int = 21; -pub const AF_SNA: ::c_int = 22; -pub const AF_IRDA: ::c_int = 23; -pub const AF_PPPOX: ::c_int = 24; -pub const AF_WANPIPE: ::c_int = 25; -pub const AF_LLC: ::c_int = 26; -pub const AF_CAN: ::c_int = 29; -pub const AF_TIPC: ::c_int = 30; -pub const AF_BLUETOOTH: ::c_int = 31; -pub const AF_IUCV: ::c_int = 32; -pub const AF_RXRPC: ::c_int = 33; -pub const AF_ISDN: ::c_int = 34; -pub const AF_PHONET: ::c_int = 35; -pub const AF_IEEE802154: ::c_int = 36; -pub const AF_CAIF: ::c_int = 37; -pub const AF_ALG: ::c_int = 38; - -pub const PF_UNSPEC: ::c_int = AF_UNSPEC; -pub const PF_UNIX: ::c_int = AF_UNIX; -pub const PF_LOCAL: ::c_int = AF_LOCAL; -pub const PF_INET: ::c_int = AF_INET; -pub const PF_AX25: ::c_int = AF_AX25; -pub const PF_IPX: ::c_int = AF_IPX; -pub const PF_APPLETALK: ::c_int = AF_APPLETALK; -pub const PF_NETROM: ::c_int = AF_NETROM; -pub const PF_BRIDGE: ::c_int = AF_BRIDGE; -pub const PF_ATMPVC: ::c_int = AF_ATMPVC; -pub const PF_X25: ::c_int = AF_X25; -pub const PF_INET6: ::c_int = AF_INET6; -pub const PF_ROSE: ::c_int = AF_ROSE; -pub const PF_DECnet: ::c_int = AF_DECnet; -pub const PF_NETBEUI: ::c_int = AF_NETBEUI; -pub const PF_SECURITY: ::c_int = AF_SECURITY; -pub const PF_KEY: ::c_int = AF_KEY; -pub const PF_NETLINK: ::c_int = AF_NETLINK; -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_PACKET: ::c_int = AF_PACKET; -pub const PF_ASH: ::c_int = AF_ASH; -pub const PF_ECONET: ::c_int = AF_ECONET; -pub const PF_ATMSVC: ::c_int = AF_ATMSVC; -pub const PF_RDS: ::c_int = AF_RDS; -pub const PF_SNA: ::c_int = AF_SNA; -pub const PF_IRDA: ::c_int = AF_IRDA; -pub const PF_PPPOX: ::c_int = AF_PPPOX; -pub const PF_WANPIPE: ::c_int = AF_WANPIPE; -pub const PF_LLC: ::c_int = AF_LLC; -pub const PF_CAN: ::c_int = AF_CAN; -pub const PF_TIPC: ::c_int = AF_TIPC; -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_IUCV: ::c_int = AF_IUCV; -pub const PF_RXRPC: ::c_int = AF_RXRPC; -pub const PF_ISDN: ::c_int = AF_ISDN; -pub const PF_PHONET: ::c_int = AF_PHONET; -pub const PF_IEEE802154: ::c_int = AF_IEEE802154; -pub const PF_CAIF: ::c_int = AF_CAIF; -pub const PF_ALG: ::c_int = AF_ALG; - -pub const SOMAXCONN: ::c_int = 128; - -pub const MSG_OOB: ::c_int = 1; -pub const MSG_PEEK: ::c_int = 2; -pub const MSG_DONTROUTE: ::c_int = 4; -pub const MSG_CTRUNC: ::c_int = 8; -pub const MSG_TRUNC: ::c_int = 0x20; -pub const MSG_DONTWAIT: ::c_int = 0x40; -pub const MSG_EOR: ::c_int = 0x80; -pub const MSG_WAITALL: ::c_int = 0x100; -pub const MSG_FIN: ::c_int = 0x200; -pub const MSG_SYN: ::c_int = 0x400; -pub const MSG_CONFIRM: ::c_int = 0x800; -pub const MSG_RST: ::c_int = 0x1000; -pub const MSG_ERRQUEUE: ::c_int = 0x2000; -pub const MSG_NOSIGNAL: ::c_int = 0x4000; -pub const MSG_MORE: ::c_int = 0x8000; -pub const MSG_WAITFORONE: ::c_int = 0x10000; -pub const MSG_FASTOPEN: ::c_int = 0x20000000; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; - -pub const SOCK_RAW: ::c_int = 3; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 33; -pub const IP_MULTICAST_LOOP: ::c_int = 34; -pub const IP_TTL: ::c_int = 2; -pub const IP_HDRINCL: ::c_int = 3; -pub const IP_ADD_MEMBERSHIP: ::c_int = 35; -pub const IP_DROP_MEMBERSHIP: ::c_int = 36; -pub const IP_TRANSPARENT: ::c_int = 19; -pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; -pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; - -pub const TCP_NODELAY: ::c_int = 1; -pub const TCP_MAXSEG: ::c_int = 2; -pub const TCP_CORK: ::c_int = 3; -pub const TCP_KEEPIDLE: ::c_int = 4; -pub const TCP_KEEPINTVL: ::c_int = 5; -pub const TCP_KEEPCNT: ::c_int = 6; -pub const TCP_SYNCNT: ::c_int = 7; -pub const TCP_LINGER2: ::c_int = 8; -pub const TCP_DEFER_ACCEPT: ::c_int = 9; -pub const TCP_WINDOW_CLAMP: ::c_int = 10; -pub const TCP_INFO: ::c_int = 11; -pub const TCP_QUICKACK: ::c_int = 12; -pub const TCP_CONGESTION: ::c_int = 13; - -pub const IPV6_MULTICAST_LOOP: ::c_int = 19; -pub const IPV6_V6ONLY: ::c_int = 26; - -pub const SO_DEBUG: ::c_int = 1; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const SS_ONSTACK: ::c_int = 1; -pub const SS_DISABLE: ::c_int = 2; - -pub const PATH_MAX: ::c_int = 4096; - -pub const FD_SETSIZE: usize = 1024; - -pub const EPOLLIN: ::c_int = 0x1; -pub const EPOLLPRI: ::c_int = 0x2; -pub const EPOLLOUT: ::c_int = 0x4; -pub const EPOLLRDNORM: ::c_int = 0x40; -pub const EPOLLRDBAND: ::c_int = 0x80; -pub const EPOLLWRNORM: ::c_int = 0x100; -pub const EPOLLWRBAND: ::c_int = 0x200; -pub const EPOLLMSG: ::c_int = 0x400; -pub const EPOLLERR: ::c_int = 0x8; -pub const EPOLLHUP: ::c_int = 0x10; -pub const EPOLLET: ::c_int = 0x80000000; - -pub const EPOLL_CTL_ADD: ::c_int = 1; -pub const EPOLL_CTL_MOD: ::c_int = 3; -pub const EPOLL_CTL_DEL: ::c_int = 2; - -pub const MNT_DETACH: ::c_int = 0x2; -pub const MNT_EXPIRE: ::c_int = 0x4; - -pub const Q_GETFMT: ::c_int = 0x800004; -pub const Q_GETINFO: ::c_int = 0x800005; -pub const Q_SETINFO: ::c_int = 0x800006; -pub const QIF_BLIMITS: ::uint32_t = 1; -pub const QIF_SPACE: ::uint32_t = 2; -pub const QIF_ILIMITS: ::uint32_t = 4; -pub const QIF_INODES: ::uint32_t = 8; -pub const QIF_BTIME: ::uint32_t = 16; -pub const QIF_ITIME: ::uint32_t = 32; -pub const QIF_LIMITS: ::uint32_t = 5; -pub const QIF_USAGE: ::uint32_t = 10; -pub const QIF_TIMES: ::uint32_t = 48; -pub const QIF_ALL: ::uint32_t = 63; - -pub const MNT_FORCE: ::c_int = 0x1; - -pub const Q_SYNC: ::c_int = 0x800001; -pub const Q_QUOTAON: ::c_int = 0x800002; -pub const Q_QUOTAOFF: ::c_int = 0x800003; -pub const Q_GETQUOTA: ::c_int = 0x800007; -pub const Q_SETQUOTA: ::c_int = 0x800008; - -pub const TCIOFF: ::c_int = 2; -pub const TCION: ::c_int = 3; -pub const TCOOFF: ::c_int = 0; -pub const TCOON: ::c_int = 1; -pub const TCIFLUSH: ::c_int = 0; -pub const TCOFLUSH: ::c_int = 1; -pub const TCIOFLUSH: ::c_int = 2; -pub const NL0: ::c_int = 0x00000000; -pub const NL1: ::c_int = 0x00000100; -pub const TAB0: ::c_int = 0x00000000; -pub const CR0: ::c_int = 0x00000000; -pub const FF0: ::c_int = 0x00000000; -pub const BS0: ::c_int = 0x00000000; -pub const VT0: ::c_int = 0x00000000; -pub const VERASE: usize = 2; -pub const VKILL: usize = 3; -pub const VINTR: usize = 0; -pub const VQUIT: usize = 1; -pub const VLNEXT: usize = 15; -pub const IGNBRK: ::tcflag_t = 0x00000001; -pub const BRKINT: ::tcflag_t = 0x00000002; -pub const IGNPAR: ::tcflag_t = 0x00000004; -pub const PARMRK: ::tcflag_t = 0x00000008; -pub const INPCK: ::tcflag_t = 0x00000010; -pub const ISTRIP: ::tcflag_t = 0x00000020; -pub const INLCR: ::tcflag_t = 0x00000040; -pub const IGNCR: ::tcflag_t = 0x00000080; -pub const ICRNL: ::tcflag_t = 0x00000100; -pub const IXANY: ::tcflag_t = 0x00000800; -pub const IMAXBEL: ::tcflag_t = 0x00002000; -pub const IUTF8: ::tcflag_t = 0x00004000; -pub const OPOST: ::tcflag_t = 0x1; -pub const CS5: ::tcflag_t = 0x00000000; -pub const CRTSCTS: ::tcflag_t = 0x80000000; -pub const ECHO: ::tcflag_t = 0x00000008; - -pub const CLONE_VM: ::c_int = 0x100; -pub const CLONE_FS: ::c_int = 0x200; -pub const CLONE_FILES: ::c_int = 0x400; -pub const CLONE_SIGHAND: ::c_int = 0x800; -pub const CLONE_PTRACE: ::c_int = 0x2000; -pub const CLONE_VFORK: ::c_int = 0x4000; -pub const CLONE_PARENT: ::c_int = 0x8000; -pub const CLONE_THREAD: ::c_int = 0x10000; -pub const CLONE_NEWNS: ::c_int = 0x20000; -pub const CLONE_SYSVSEM: ::c_int = 0x40000; -pub const CLONE_SETTLS: ::c_int = 0x80000; -pub const CLONE_PARENT_SETTID: ::c_int = 0x100000; -pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000; -pub const CLONE_DETACHED: ::c_int = 0x400000; -pub const CLONE_UNTRACED: ::c_int = 0x800000; -pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000; -pub const CLONE_NEWUTS: ::c_int = 0x04000000; -pub const CLONE_NEWIPC: ::c_int = 0x08000000; -pub const CLONE_NEWUSER: ::c_int = 0x10000000; -pub const CLONE_NEWPID: ::c_int = 0x20000000; -pub const CLONE_NEWNET: ::c_int = 0x40000000; -pub const CLONE_IO: ::c_int = 0x80000000; - -pub const WNOHANG: ::c_int = 0x00000001; -pub const WUNTRACED: ::c_int = 0x00000002; -pub const WSTOPPED: ::c_int = WUNTRACED; -pub const WEXITED: ::c_int = 0x00000004; -pub const WCONTINUED: ::c_int = 0x00000008; -pub const WNOWAIT: ::c_int = 0x01000000; - -pub const __WNOTHREAD: ::c_int = 0x20000000; -pub const __WALL: ::c_int = 0x40000000; -pub const __WCLONE: ::c_int = 0x80000000; - -pub const SPLICE_F_MOVE: ::c_uint = 0x01; -pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02; -pub const SPLICE_F_MORE: ::c_uint = 0x04; -pub const SPLICE_F_GIFT: ::c_uint = 0x08; - -pub const RTLD_LOCAL: ::c_int = 0; - -pub const POSIX_FADV_NORMAL: ::c_int = 0; -pub const POSIX_FADV_RANDOM: ::c_int = 1; -pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_FADV_WILLNEED: ::c_int = 3; - -pub const AT_FDCWD: ::c_int = -100; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100; -pub const AT_REMOVEDIR: ::c_int = 0x200; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; -pub const AT_NO_AUTOMOUNT: ::c_int = 0x800; -pub const AT_EMPTY_PATH: ::c_int = 0x1000; - -pub const LOG_CRON: ::c_int = 9 << 3; -pub const LOG_AUTHPRIV: ::c_int = 10 << 3; -pub const LOG_FTP: ::c_int = 11 << 3; -pub const LOG_PERROR: ::c_int = 0x20; - -pub const PIPE_BUF: usize = 4096; - -pub const SI_LOAD_SHIFT: ::c_uint = 16; - -pub const SIGEV_SIGNAL: ::c_int = 0; -pub const SIGEV_NONE: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 2; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 2; - -pub const UTIME_OMIT: c_long = 1073741822; -pub const UTIME_NOW: c_long = 1073741823; - -f! { - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] &= !(1 << (fd % size)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] |= 1 << (fd % size); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } - - pub fn WIFSTOPPED(status: ::c_int) -> bool { - (status & 0xff) == 0x7f - } - - pub fn WSTOPSIG(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub fn WIFCONTINUED(status: ::c_int) -> bool { - status == 0xffff - } - - pub fn WIFSIGNALED(status: ::c_int) -> bool { - ((status & 0x7f) + 1) as i8 >= 2 - } - - pub fn WTERMSIG(status: ::c_int) -> ::c_int { - status & 0x7f - } - - pub fn WIFEXITED(status: ::c_int) -> bool { - (status & 0x7f) == 0 - } - - pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub fn WCOREDUMP(status: ::c_int) -> bool { - (status & 0x80) != 0 - } -} - -extern { - pub fn getpwnam_r(name: *const ::c_char, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - pub fn getpwuid_r(uid: ::uid_t, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - pub fn fdatasync(fd: ::c_int) -> ::c_int; - pub fn mincore(addr: *mut ::c_void, len: ::size_t, - vec: *mut ::c_uchar) -> ::c_int; - pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_nanosleep(clk_id: clockid_t, - flags: ::c_int, - rqtp: *const ::timespec, - rmtp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - pub fn prctl(option: ::c_int, ...) -> ::c_int; - pub fn pthread_getattr_np(native: ::pthread_t, - attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t, - guardsize: *mut ::size_t) -> ::c_int; - pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t, - stackaddr: *mut *mut ::c_void, - stacksize: *mut ::size_t) -> ::c_int; - pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; - pub fn setgroups(ngroups: ::size_t, - ptr: *const ::gid_t) -> ::c_int; - pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; - pub fn sched_setscheduler(pid: ::pid_t, - policy: ::c_int, - param: *const sched_param) -> ::c_int; - pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; - pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; - pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; - pub fn epoll_create(size: ::c_int) -> ::c_int; - pub fn epoll_create1(flags: ::c_int) -> ::c_int; - pub fn epoll_ctl(epfd: ::c_int, - op: ::c_int, - fd: ::c_int, - event: *mut epoll_event) -> ::c_int; - pub fn epoll_wait(epfd: ::c_int, - events: *mut epoll_event, - maxevents: ::c_int, - timeout: ::c_int) -> ::c_int; - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; - pub fn mount(src: *const ::c_char, - target: *const ::c_char, - fstype: *const ::c_char, - flags: ::c_ulong, - data: *const ::c_void) -> ::c_int; - pub fn umount(target: *const ::c_char) -> ::c_int; - pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; - pub fn clone(cb: extern fn(*mut ::c_void) -> ::c_int, - child_stack: *mut ::c_void, - flags: ::c_int, - arg: *mut ::c_void, ...) -> ::c_int; - pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; - pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; - pub fn memrchr(cx: *const ::c_void, - c: ::c_int, - n: ::size_t) -> *mut ::c_void; - pub fn syscall(num: ::c_long, ...) -> ::c_long; - pub fn sendfile(out_fd: ::c_int, - in_fd: ::c_int, - offset: *mut off_t, - count: ::size_t) -> ::ssize_t; - pub fn splice(fd_in: ::c_int, - off_in: *mut ::loff_t, - fd_out: ::c_int, - off_out: *mut ::loff_t, - len: ::size_t, - flags: ::c_uint) -> ::ssize_t; - pub fn tee(fd_in: ::c_int, - fd_out: ::c_int, - len: ::size_t, - flags: ::c_uint) -> ::ssize_t; - pub fn vmsplice(fd: ::c_int, - iov: *const ::iovec, - nr_segs: ::size_t, - flags: ::c_uint) -> ::ssize_t; - - pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, - advise: ::c_int) -> ::c_int; - pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; - pub fn utimensat(dirfd: ::c_int, path: *const ::c_char, - times: *const ::timespec, flag: ::c_int) -> ::c_int; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t); - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; - pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int; - pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int; - pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; - pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t; - pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int; - pub fn mmap64(addr: *mut ::c_void, - len: ::size_t, - prot: ::c_int, - flags: ::c_int, - fd: ::c_int, - offset: off64_t) - -> *mut ::c_void; - pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; - pub fn openat64(fd: ::c_int, - path: *const c_char, - oflag: ::c_int, ...) -> ::c_int; - pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, - offset: off64_t) -> ::ssize_t; - pub fn pwrite64(fd: ::c_int, buf: *const ::c_void, count: ::size_t, - offset: off64_t) -> ::ssize_t; - pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; - pub fn readdir64_r(dirp: *mut ::DIR, entry: *mut ::dirent64, - result: *mut *mut ::dirent64) -> ::c_int; - pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; - pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int; - pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int; - pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; - pub fn sysinfo (info: *mut ::sysinfo) -> ::c_int; - - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; - - pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, dev: dev_t) -> ::c_int; - pub fn ppoll(fds: *mut ::pollfd, - nfds: nfds_t, - timeout: *const ::timespec, - sigmask: *const sigset_t) -> ::c_int; - pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, - clock_id: *mut clockid_t) -> ::c_int; - pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, - clock_id: clockid_t) -> ::c_int; - pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn sched_getaffinity(pid: ::pid_t, - cpusetsize: ::size_t, - cpuset: *mut cpu_set_t) -> ::c_int; - pub fn sched_setaffinity(pid: ::pid_t, - cpusetsize: ::size_t, - cpuset: *const cpu_set_t) -> ::c_int; - pub fn unshare(flags: ::c_int) -> ::c_int; - pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int; - pub fn sem_timedwait(sem: *mut sem_t, - abstime: *const ::timespec) -> ::c_int; - pub fn accept4(fd: ::c_int, addr: *mut ::sockaddr, len: *mut ::socklen_t, - flg: ::c_int) -> ::c_int; - pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, - pshared: ::c_int) -> ::c_int; - pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t, - pshared: *mut ::c_int) -> ::c_int; - pub fn ptsname_r(fd: ::c_int, - buf: *mut ::c_char, - buflen: ::size_t) -> ::c_int; - pub fn clearenv() -> ::c_int; - pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, - options: ::c_int) -> ::c_int; -} - -cfg_if! { - if #[cfg(any(target_os = "linux", - target_os = "emscripten", - target_os = "fuchsia"))] { - mod linux; - pub use self::linux::*; - } else if #[cfg(target_os = "android")] { - mod android; - pub use self::android::*; - } else { - // Unknown target_os - } -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs deleted file mode 100644 index 757d5817e..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/unix/solaris/mod.rs +++ /dev/null @@ -1,1194 +0,0 @@ -use dox::{mem, Option}; - -pub type c_char = i8; -pub type c_long = i64; -pub type c_ulong = u64; - -pub type clockid_t = ::c_int; -pub type blkcnt_t = ::c_long; -pub type clock_t = ::c_long; -pub type daddr_t = ::c_long; -pub type dev_t = ::c_ulong; -pub type fsblkcnt_t = ::c_ulong; -pub type fsfilcnt_t = ::c_ulong; -pub type ino_t = ::c_ulong; -pub type key_t = ::c_int; -pub type major_t = ::c_uint; -pub type minor_t = ::c_uint; -pub type mode_t = ::c_uint; -pub type nlink_t = ::c_uint; -pub type rlim_t = ::c_ulong; -pub type speed_t = ::c_uint; -pub type tcflag_t = ::c_uint; -pub type time_t = ::c_long; -pub type wchar_t = ::c_int; -pub type nfds_t = ::c_ulong; - -pub type suseconds_t = ::c_long; -pub type off_t = ::c_long; -pub type useconds_t = ::c_uint; -pub type socklen_t = ::c_uint; -pub type sa_family_t = u16; -pub type pthread_t = ::c_uint; -pub type pthread_key_t = ::c_uint; -pub type blksize_t = ::c_int; -pub type fflags_t = ::c_int; -pub type nl_item = ::c_int; -pub type id_t = ::c_int; -pub type idtype_t = ::c_uint; - -pub enum timezone {} - -s! { - pub struct sockaddr { - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14], - } - - pub struct sockaddr_in { - pub sin_family: sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [::c_char; 8] - } - - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - pub __sin6_src_id: u32 - } - - pub struct sockaddr_un { - pub sun_family: sa_family_t, - pub sun_path: [c_char; 108] - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_age: *mut ::c_char, - pub pw_comment: *mut ::c_char, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char - } - - pub struct ifaddrs { - pub ifa_next: *mut ifaddrs, - pub ifa_name: *mut ::c_char, - pub ifa_flags: ::c_ulong, - pub ifa_addr: *mut ::sockaddr, - pub ifa_netmask: *mut ::sockaddr, - pub ifa_dstaddr: *mut ::sockaddr, - pub ifa_data: *mut ::c_void - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int - } - - pub struct utsname { - pub sysname: [::c_char; 257], - pub nodename: [::c_char; 257], - pub release: [::c_char; 257], - pub version: [::c_char; 257], - pub machine: [::c_char; 257], - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - pub msg_flags: ::c_int, - } - - pub struct cmsghdr { - pub cmsg_len: ::size_t, - pub cmsg_level: ::c_int, - pub cmsg_type: ::c_int, - } - - pub struct fd_set { - #[cfg(target_pointer_width = "64")] - fds_bits: [i64; FD_SETSIZE / 64], - #[cfg(target_pointer_width = "32")] - fds_bits: [i32; FD_SETSIZE / 32], - } - - pub struct pthread_attr_t { - __pthread_attrp: *mut ::c_void - } - - pub struct pthread_mutex_t { - __pthread_mutex_flag1: u16, - __pthread_mutex_flag2: u8, - __pthread_mutex_ceiling: u8, - __pthread_mutex_type: u16, - __pthread_mutex_magic: u16, - __pthread_mutex_lock: u64, - __pthread_mutex_data: u64 - } - - pub struct pthread_mutexattr_t { - __pthread_mutexattrp: *mut ::c_void - } - - pub struct pthread_cond_t { - __pthread_cond_flag: [u8; 4], - __pthread_cond_type: u16, - __pthread_cond_magic: u16, - __pthread_cond_data: u64 - } - - pub struct pthread_condattr_t { - __pthread_condattrp: *mut ::c_void, - } - - pub struct pthread_rwlock_t { - __pthread_rwlock_readers: i32, - __pthread_rwlock_type: u16, - __pthread_rwlock_magic: u16, - __pthread_rwlock_mutex: ::pthread_mutex_t, - __pthread_rwlock_readercv: ::pthread_cond_t, - __pthread_rwlock_writercv: ::pthread_cond_t - } - - pub struct dirent { - pub d_ino: ::ino_t, - pub d_off: ::off_t, - pub d_reclen: u16, - pub d_name: [::c_char; 1] - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut ::c_char, - pub gl_offs: ::size_t, - __unused1: *mut ::c_void, - __unused2: ::c_int, - __unused3: ::c_int, - __unused4: ::c_int, - __unused5: *mut ::c_void, - __unused6: *mut ::c_void, - __unused7: *mut ::c_void, - __unused8: *mut ::c_void, - __unused9: *mut ::c_void, - __unused10: *mut ::c_void, - } - - pub struct sockaddr_storage { - pub ss_family: ::sa_family_t, - __ss_pad1: [u8; 6], - __ss_align: i64, - __ss_pad2: [u8; 240], - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_canonname: *mut ::c_char, - pub ai_addr: *mut ::sockaddr, - pub ai_next: *mut addrinfo, - } - - pub struct sigset_t { - bits: [u32; 4], - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_code: ::c_int, - pub si_errno: ::c_int, - pub si_pad: ::c_int, - pub si_addr: *mut ::c_void, - __pad: [u8; 232], - } - - pub struct sigaction { - pub sa_flags: ::c_int, - pub sa_sigaction: ::sighandler_t, - pub sa_mask: sigset_t, - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct statvfs { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_favail: ::fsfilcnt_t, - pub f_fsid: ::c_ulong, - pub f_basetype: [::c_char; 16], - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - pub f_fstr: [::c_char; 32] - } - - pub struct sched_param { - pub sched_priority: ::c_int, - sched_pad: [::c_int; 8] - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct stat { - pub st_dev: ::dev_t, - pub st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - pub st_size: ::off_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt_t, - __unused: [::c_char; 16] - } - - pub struct termios { - pub c_iflag: ::tcflag_t, - pub c_oflag: ::tcflag_t, - pub c_cflag: ::tcflag_t, - pub c_lflag: ::tcflag_t, - pub c_cc: [::cc_t; ::NCCS] - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct sem_t { - pub sem_count: u32, - pub sem_type: u16, - pub sem_magic: u16, - pub sem_pad1: [u64; 3], - pub sem_pad2: [u64; 2] - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_sysid: ::c_int, - pub l_pid: ::pid_t, - pub l_pad: [::c_long; 4] - } - - pub struct if_nameindex { - pub if_index: ::c_uint, - pub if_name: *mut ::c_char, - } - - pub struct port_event { - pub portev_events: ::c_int, - pub portev_source: ::c_ushort, - pub portev_pad: ::c_ushort, - pub portev_object: ::uintptr_t, - pub portev_user: ::uintptr_t, - } -} - -pub const LC_CTYPE: ::c_int = 0; -pub const LC_NUMERIC: ::c_int = 1; -pub const LC_TIME: ::c_int = 2; -pub const LC_COLLATE: ::c_int = 3; -pub const LC_MONETARY: ::c_int = 4; -pub const LC_MESSAGES: ::c_int = 5; -pub const LC_ALL: ::c_int = 6; -pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE); -pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC); -pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME); -pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE); -pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY); -pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES); -pub const LC_ALL_MASK: ::c_int = LC_CTYPE_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK - | LC_COLLATE_MASK - | LC_MONETARY_MASK - | LC_MESSAGES_MASK; - -pub const DAY_1: ::nl_item = 1; -pub const DAY_2: ::nl_item = 2; -pub const DAY_3: ::nl_item = 3; -pub const DAY_4: ::nl_item = 4; -pub const DAY_5: ::nl_item = 5; -pub const DAY_6: ::nl_item = 6; -pub const DAY_7: ::nl_item = 7; - -pub const ABDAY_1: ::nl_item = 8; -pub const ABDAY_2: ::nl_item = 9; -pub const ABDAY_3: ::nl_item = 10; -pub const ABDAY_4: ::nl_item = 11; -pub const ABDAY_5: ::nl_item = 12; -pub const ABDAY_6: ::nl_item = 13; -pub const ABDAY_7: ::nl_item = 14; - -pub const MON_1: ::nl_item = 15; -pub const MON_2: ::nl_item = 16; -pub const MON_3: ::nl_item = 17; -pub const MON_4: ::nl_item = 18; -pub const MON_5: ::nl_item = 19; -pub const MON_6: ::nl_item = 20; -pub const MON_7: ::nl_item = 21; -pub const MON_8: ::nl_item = 22; -pub const MON_9: ::nl_item = 23; -pub const MON_10: ::nl_item = 24; -pub const MON_11: ::nl_item = 25; -pub const MON_12: ::nl_item = 26; - -pub const ABMON_1: ::nl_item = 27; -pub const ABMON_2: ::nl_item = 28; -pub const ABMON_3: ::nl_item = 29; -pub const ABMON_4: ::nl_item = 30; -pub const ABMON_5: ::nl_item = 31; -pub const ABMON_6: ::nl_item = 32; -pub const ABMON_7: ::nl_item = 33; -pub const ABMON_8: ::nl_item = 34; -pub const ABMON_9: ::nl_item = 35; -pub const ABMON_10: ::nl_item = 36; -pub const ABMON_11: ::nl_item = 37; -pub const ABMON_12: ::nl_item = 38; - -pub const RADIXCHAR: ::nl_item = 39; -pub const THOUSEP: ::nl_item = 40; -pub const YESSTR: ::nl_item = 41; -pub const NOSTR: ::nl_item = 42; -pub const CRNCYSTR: ::nl_item = 43; - -pub const D_T_FMT: ::nl_item = 44; -pub const D_FMT: ::nl_item = 45; -pub const T_FMT: ::nl_item = 46; -pub const AM_STR: ::nl_item = 47; -pub const PM_STR: ::nl_item = 48; - -pub const CODESET: ::nl_item = 49; -pub const T_FMT_AMPM: ::nl_item = 50; -pub const ERA: ::nl_item = 51; -pub const ERA_D_FMT: ::nl_item = 52; -pub const ERA_D_T_FMT: ::nl_item = 53; -pub const ERA_T_FMT: ::nl_item = 54; -pub const ALT_DIGITS: ::nl_item = 55; -pub const YESEXPR: ::nl_item = 56; -pub const NOEXPR: ::nl_item = 57; -pub const _DATE_FMT: ::nl_item = 58; -pub const MAXSTRMSG: ::nl_item = 58; - -pub const PATH_MAX: ::c_int = 1024; - -pub const SA_ONSTACK: ::c_int = 0x00000001; -pub const SA_RESETHAND: ::c_int = 0x00000002; -pub const SA_RESTART: ::c_int = 0x00000004; -pub const SA_SIGINFO: ::c_int = 0x00000008; -pub const SA_NODEFER: ::c_int = 0x00000010; -pub const SA_NOCLDWAIT: ::c_int = 0x00010000; -pub const SA_NOCLDSTOP: ::c_int = 0x00020000; - -pub const SS_ONSTACK: ::c_int = 1; -pub const SS_DISABLE: ::c_int = 2; - -pub const FIOCLEX: ::c_int = 0x20006601; -pub const FIONCLEX: ::c_int = 0x20006602; -pub const FIONREAD: ::c_int = 0x4004667f; -pub const FIONBIO: ::c_int = 0x8004667e; -pub const FIOASYNC: ::c_int = 0x8004667d; -pub const FIOSETOWN: ::c_int = 0x8004667c; -pub const FIOGETOWN: ::c_int = 0x4004667b; - -pub const SIGCHLD: ::c_int = 18; -pub const SIGBUS: ::c_int = 10; -pub const SIGINFO: ::c_int = 41; -pub const SIG_BLOCK: ::c_int = 1; -pub const SIG_UNBLOCK: ::c_int = 2; -pub const SIG_SETMASK: ::c_int = 3; - -pub const IPV6_MULTICAST_LOOP: ::c_int = 0x8; -pub const IPV6_V6ONLY: ::c_int = 0x27; - -cfg_if! { - if #[cfg(target_pointer_width = "64")] { - pub const FD_SETSIZE: usize = 65536; - } else { - pub const FD_SETSIZE: usize = 1024; - } -} - -pub const ST_RDONLY: ::c_ulong = 1; -pub const ST_NOSUID: ::c_ulong = 2; - -pub const NI_MAXHOST: ::socklen_t = 1025; - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 32767; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 4; -pub const _IOLBF: ::c_int = 64; -pub const BUFSIZ: ::c_uint = 1024; -pub const FOPEN_MAX: ::c_uint = 20; -pub const FILENAME_MAX: ::c_uint = 1024; -pub const L_tmpnam: ::c_uint = 25; -pub const TMP_MAX: ::c_uint = 17576; - -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; -pub const O_SEARCH: ::c_int = 0x200000; -pub const O_EXEC: ::c_int = 0x400000; -pub const O_APPEND: ::c_int = 8; -pub const O_CREAT: ::c_int = 256; -pub const O_EXCL: ::c_int = 1024; -pub const O_NOCTTY: ::c_int = 2048; -pub const O_TRUNC: ::c_int = 512; -pub const O_CLOEXEC: ::c_int = 0x800000; -pub const O_ACCMODE: ::c_int = 0x600003; -pub const S_IFIFO: mode_t = 4096; -pub const S_IFCHR: mode_t = 8192; -pub const S_IFBLK: mode_t = 24576; -pub const S_IFDIR: mode_t = 16384; -pub const S_IFREG: mode_t = 32768; -pub const S_IFLNK: mode_t = 40960; -pub const S_IFSOCK: mode_t = 49152; -pub const S_IFMT: mode_t = 61440; -pub const S_IEXEC: mode_t = 64; -pub const S_IWRITE: mode_t = 128; -pub const S_IREAD: mode_t = 256; -pub const S_IRWXU: mode_t = 448; -pub const S_IXUSR: mode_t = 64; -pub const S_IWUSR: mode_t = 128; -pub const S_IRUSR: mode_t = 256; -pub const S_IRWXG: mode_t = 56; -pub const S_IXGRP: mode_t = 8; -pub const S_IWGRP: mode_t = 16; -pub const S_IRGRP: mode_t = 32; -pub const S_IRWXO: mode_t = 7; -pub const S_IXOTH: mode_t = 1; -pub const S_IWOTH: mode_t = 2; -pub const S_IROTH: mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const F_LOCK: ::c_int = 1; -pub const F_TEST: ::c_int = 3; -pub const F_TLOCK: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; -pub const F_DUPFD_CLOEXEC: ::c_int = 37; -pub const F_SETLK: ::c_int = 6; -pub const F_SETLKW: ::c_int = 7; -pub const F_GETLK: ::c_int = 14; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGEMT: ::c_int = 7; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGSYS: ::c_int = 12; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; -pub const SIGUSR1: ::c_int = 16; -pub const SIGUSR2: ::c_int = 17; -pub const SIGPWR: ::c_int = 19; -pub const SIGWINCH: ::c_int = 20; -pub const SIGURG: ::c_int = 21; -pub const SIGPOLL: ::c_int = 22; -pub const SIGIO: ::c_int = SIGPOLL; -pub const SIGSTOP: ::c_int = 23; -pub const SIGTSTP: ::c_int = 24; -pub const SIGCONT: ::c_int = 25; -pub const SIGTTIN: ::c_int = 26; -pub const SIGTTOU: ::c_int = 27; -pub const SIGVTALRM: ::c_int = 28; -pub const SIGPROF: ::c_int = 29; -pub const SIGXCPU: ::c_int = 30; -pub const SIGXFSZ: ::c_int = 31; - -pub const WNOHANG: ::c_int = 0x40; -pub const WUNTRACED: ::c_int = 0x04; - -pub const WEXITED: ::c_int = 0x01; -pub const WTRAPPED: ::c_int = 0x02; -pub const WSTOPPED: ::c_int = WUNTRACED; -pub const WCONTINUED: ::c_int = 0x08; -pub const WNOWAIT: ::c_int = 0x80; - -// Solaris defines a great many more of these; we only expose the -// standardized ones. -pub const P_PID: idtype_t = 0; -pub const P_PGID: idtype_t = 2; -pub const P_ALL: idtype_t = 7; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const MAP_SHARED: ::c_int = 0x0001; -pub const MAP_PRIVATE: ::c_int = 0x0002; -pub const MAP_FIXED: ::c_int = 0x0010; -pub const MAP_NORESERVE: ::c_int = 0x40; -pub const MAP_ANON: ::c_int = 0x0100; -pub const MAP_RENAME: ::c_int = 0x20; -pub const MAP_ALIGN: ::c_int = 0x200; -pub const MAP_TEXT: ::c_int = 0x400; -pub const MAP_INITDATA: ::c_int = 0x800; -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const MS_SYNC: ::c_int = 0x0004; -pub const MS_ASYNC: ::c_int = 0x0001; -pub const MS_INVALIDATE: ::c_int = 0x0002; -pub const MS_INVALCURPROC: ::c_int = 0x0008; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EAGAIN: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const ENOTBLK: ::c_int = 15; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -pub const ENODEV: ::c_int = 19; -pub const ENOTDIR: ::c_int = 20; -pub const EISDIR: ::c_int = 21; -pub const EINVAL: ::c_int = 22; -pub const ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const ETXTBSY: ::c_int = 26; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const ENOMSG: ::c_int = 35; -pub const EIDRM: ::c_int = 36; -pub const ECHRNG: ::c_int = 37; -pub const EL2NSYNC: ::c_int = 38; -pub const EL3HLT: ::c_int = 39; -pub const EL3RST: ::c_int = 40; -pub const ELNRNG: ::c_int = 41; -pub const EUNATCH: ::c_int = 42; -pub const ENOCSI: ::c_int = 43; -pub const EL2HLT: ::c_int = 44; -pub const EDEADLK: ::c_int = 45; -pub const ENOLCK: ::c_int = 46; -pub const ECANCELED: ::c_int = 47; -pub const ENOTSUP: ::c_int = 48; -pub const EDQUOT: ::c_int = 49; -pub const EBADE: ::c_int = 50; -pub const EBADR: ::c_int = 51; -pub const EXFULL: ::c_int = 52; -pub const ENOANO: ::c_int = 53; -pub const EBADRQC: ::c_int = 54; -pub const EBADSLT: ::c_int = 55; -pub const EDEADLOCK: ::c_int = 56; -pub const EBFONT: ::c_int = 57; -pub const EOWNERDEAD: ::c_int = 58; -pub const ENOTRECOVERABLE: ::c_int = 59; -pub const ENOSTR: ::c_int = 60; -pub const ENODATA: ::c_int = 61; -pub const ETIME: ::c_int = 62; -pub const ENOSR: ::c_int = 63; -pub const ENONET: ::c_int = 64; -pub const ENOPKG: ::c_int = 65; -pub const EREMOTE: ::c_int = 66; -pub const ENOLINK: ::c_int = 67; -pub const EADV: ::c_int = 68; -pub const ESRMNT: ::c_int = 69; -pub const ECOMM: ::c_int = 70; -pub const EPROTO: ::c_int = 71; -pub const ELOCKUNMAPPED: ::c_int = 72; -pub const ENOTACTIVE: ::c_int = 73; -pub const EMULTIHOP: ::c_int = 74; -pub const EADI: ::c_int = 75; -pub const EBADMSG: ::c_int = 77; -pub const ENAMETOOLONG: ::c_int = 78; -pub const EOVERFLOW: ::c_int = 79; -pub const ENOTUNIQ: ::c_int = 80; -pub const EBADFD: ::c_int = 81; -pub const EREMCHG: ::c_int = 82; -pub const ELIBACC: ::c_int = 83; -pub const ELIBBAD: ::c_int = 84; -pub const ELIBSCN: ::c_int = 85; -pub const ELIBMAX: ::c_int = 86; -pub const ELIBEXEC: ::c_int = 87; -pub const EILSEQ: ::c_int = 88; -pub const ENOSYS: ::c_int = 89; -pub const ELOOP: ::c_int = 90; -pub const ERESTART: ::c_int = 91; -pub const ESTRPIPE: ::c_int = 92; -pub const ENOTEMPTY: ::c_int = 93; -pub const EUSERS: ::c_int = 94; -pub const ENOTSOCK: ::c_int = 95; -pub const EDESTADDRREQ: ::c_int = 96; -pub const EMSGSIZE: ::c_int = 97; -pub const EPROTOTYPE: ::c_int = 98; -pub const ENOPROTOOPT: ::c_int = 99; -pub const EPROTONOSUPPORT: ::c_int = 120; -pub const ESOCKTNOSUPPORT: ::c_int = 121; -pub const EOPNOTSUPP: ::c_int = 122; -pub const EPFNOSUPPORT: ::c_int = 123; -pub const EAFNOSUPPORT: ::c_int = 124; -pub const EADDRINUSE: ::c_int = 125; -pub const EADDRNOTAVAIL: ::c_int = 126; -pub const ENETDOWN: ::c_int = 127; -pub const ENETUNREACH: ::c_int = 128; -pub const ENETRESET: ::c_int = 129; -pub const ECONNABORTED: ::c_int = 130; -pub const ECONNRESET: ::c_int = 131; -pub const ENOBUFS: ::c_int = 132; -pub const EISCONN: ::c_int = 133; -pub const ENOTCONN: ::c_int = 134; -pub const ESHUTDOWN: ::c_int = 143; -pub const ETOOMANYREFS: ::c_int = 144; -pub const ETIMEDOUT: ::c_int = 145; -pub const ECONNREFUSED: ::c_int = 146; -pub const EHOSTDOWN: ::c_int = 147; -pub const EHOSTUNREACH: ::c_int = 148; -pub const EWOULDBLOCK: ::c_int = EAGAIN; -pub const EALREADY: ::c_int = 149; -pub const EINPROGRESS: ::c_int = 150; - -pub const EAI_SYSTEM: ::c_int = 11; - -pub const F_DUPFD: ::c_int = 0; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; - -pub const SIGTRAP: ::c_int = 5; - -pub const GLOB_APPEND : ::c_int = 32; -pub const GLOB_DOOFFS : ::c_int = 16; -pub const GLOB_ERR : ::c_int = 1; -pub const GLOB_MARK : ::c_int = 2; -pub const GLOB_NOCHECK : ::c_int = 8; -pub const GLOB_NOSORT : ::c_int = 4; -pub const GLOB_NOESCAPE: ::c_int = 64; - -pub const GLOB_NOSPACE : ::c_int = -2; -pub const GLOB_ABORTED : ::c_int = -1; -pub const GLOB_NOMATCH : ::c_int = -3; - -pub const POSIX_MADV_NORMAL: ::c_int = 0; -pub const POSIX_MADV_RANDOM: ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_MADV_WILLNEED: ::c_int = 3; -pub const POSIX_MADV_DONTNEED: ::c_int = 4; - -pub const _SC_IOV_MAX: ::c_int = 77; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 569; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 570; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 571; -pub const _SC_MQ_PRIO_MAX: ::c_int = 30; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 577; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 578; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 568; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 572; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 580; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 581; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 579; -pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 582; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 583; -pub const _SC_THREAD_STACK_MIN: ::c_int = 573; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 574; -pub const _SC_THREADS: ::c_int = 576; -pub const _SC_TTY_NAME_MAX: ::c_int = 575; -pub const _SC_ATEXIT_MAX: ::c_int = 76; -pub const _SC_XOPEN_CRYPT: ::c_int = 62; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 63; -pub const _SC_XOPEN_LEGACY: ::c_int = 717; -pub const _SC_XOPEN_REALTIME: ::c_int = 718; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 719; -pub const _SC_XOPEN_SHM: ::c_int = 64; -pub const _SC_XOPEN_UNIX: ::c_int = 78; -pub const _SC_XOPEN_VERSION: ::c_int = 12; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 67; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 0x40; -pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; -pub const PTHREAD_PROCESS_PRIVATE: u16 = 0; -pub const PTHREAD_STACK_MIN: ::size_t = 4096; - -pub const SIGSTKSZ: ::size_t = 8192; - -// https://illumos.org/man/3c/clock_gettime -// https://github.com/illumos/illumos-gate/ -// blob/HEAD/usr/src/lib/libc/amd64/sys/__clock_gettime.s -// clock_gettime(3c) doesn't seem to accept anything other than CLOCK_REALTIME -// or __CLOCK_REALTIME0 -// -// https://github.com/illumos/illumos-gate/ -// blob/HEAD/usr/src/uts/common/sys/time_impl.h -// Confusing! CLOCK_HIGHRES==CLOCK_MONOTONIC==4 -// __CLOCK_REALTIME0==0 is an obsoleted version of CLOCK_REALTIME==3 -pub const CLOCK_REALTIME: clockid_t = 3; -pub const CLOCK_MONOTONIC: clockid_t = 4; -pub const TIMER_RELTIME: ::c_int = 0; -pub const TIMER_ABSTIME: ::c_int = 1; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_NOFILE: ::c_int = 5; -pub const RLIMIT_VMEM: ::c_int = 6; -pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; - -pub const RLIM_NLIMITS: rlim_t = 7; -pub const RLIM_INFINITY: rlim_t = 0x7fffffff; - -pub const RUSAGE_SELF: ::c_int = 0; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; -pub const MADV_FREE: ::c_int = 5; - -pub const AF_INET: ::c_int = 2; -pub const AF_INET6: ::c_int = 26; -pub const AF_UNIX: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 1; -pub const SOCK_STREAM: ::c_int = 2; -pub const SOCK_RAW: ::c_int = 4; -pub const SOCK_RDM: ::c_int = 5; -pub const SOCK_SEQPACKET: ::c_int = 6; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IP_MULTICAST_TTL: ::c_int = 17; -pub const IP_MULTICAST_LOOP: ::c_int = 18; -pub const IP_TTL: ::c_int = 4; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_ADD_MEMBERSHIP: ::c_int = 19; -pub const IP_DROP_MEMBERSHIP: ::c_int = 20; -pub const IPV6_JOIN_GROUP: ::c_int = 9; -pub const IPV6_LEAVE_GROUP: ::c_int = 10; - -pub const TCP_NODELAY: ::c_int = 1; -pub const TCP_KEEPIDLE: ::c_int = 34; -pub const SOL_SOCKET: ::c_int = 0xffff; -pub const SO_DEBUG: ::c_int = 0x01; -pub const SO_ACCEPTCONN: ::c_int = 0x0002; -pub const SO_REUSEADDR: ::c_int = 0x0004; -pub const SO_KEEPALIVE: ::c_int = 0x0008; -pub const SO_DONTROUTE: ::c_int = 0x0010; -pub const SO_BROADCAST: ::c_int = 0x0020; -pub const SO_USELOOPBACK: ::c_int = 0x0040; -pub const SO_LINGER: ::c_int = 0x0080; -pub const SO_OOBINLINE: ::c_int = 0x0100; -pub const SO_SNDBUF: ::c_int = 0x1001; -pub const SO_RCVBUF: ::c_int = 0x1002; -pub const SO_SNDLOWAT: ::c_int = 0x1003; -pub const SO_RCVLOWAT: ::c_int = 0x1004; -pub const SO_SNDTIMEO: ::c_int = 0x1005; -pub const SO_RCVTIMEO: ::c_int = 0x1006; -pub const SO_ERROR: ::c_int = 0x1007; -pub const SO_TYPE: ::c_int = 0x1008; - -pub const MSG_PEEK: ::c_int = 0x2; - -pub const IFF_LOOPBACK: ::c_int = 0x8; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const F_RDLCK: ::c_short = 1; -pub const F_WRLCK: ::c_short = 2; -pub const F_UNLCK: ::c_short = 3; - -pub const O_SYNC: ::c_int = 16; -pub const O_NONBLOCK: ::c_int = 128; - -pub const IPPROTO_RAW: ::c_int = 255; - -pub const _SC_ARG_MAX: ::c_int = 1; -pub const _SC_CHILD_MAX: ::c_int = 2; -pub const _SC_CLK_TCK: ::c_int = 3; -pub const _SC_NGROUPS_MAX: ::c_int = 4; -pub const _SC_OPEN_MAX: ::c_int = 5; -pub const _SC_JOB_CONTROL: ::c_int = 6; -pub const _SC_SAVED_IDS: ::c_int = 7; -pub const _SC_VERSION: ::c_int = 8; -pub const _SC_PAGESIZE: ::c_int = 11; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 15; -pub const _SC_STREAM_MAX: ::c_int = 16; -pub const _SC_TZNAME_MAX: ::c_int = 17; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 18; -pub const _SC_AIO_MAX: ::c_int = 19; -pub const _SC_BC_BASE_MAX: ::c_int = 54; -pub const _SC_BC_DIM_MAX: ::c_int = 55; -pub const _SC_BC_SCALE_MAX: ::c_int = 56; -pub const _SC_BC_STRING_MAX: ::c_int = 57; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 58; -pub const _SC_EXPR_NEST_MAX: ::c_int = 59; -pub const _SC_LINE_MAX: ::c_int = 60; -pub const _SC_RE_DUP_MAX: ::c_int = 61; -pub const _SC_2_VERSION: ::c_int = 53; -pub const _SC_2_C_BIND: ::c_int = 45; -pub const _SC_2_C_DEV: ::c_int = 46; -pub const _SC_2_CHAR_TERM: ::c_int = 66; -pub const _SC_2_FORT_DEV: ::c_int = 48; -pub const _SC_2_FORT_RUN: ::c_int = 49; -pub const _SC_2_LOCALEDEF: ::c_int = 50; -pub const _SC_2_SW_DEV: ::c_int = 51; -pub const _SC_2_UPE: ::c_int = 52; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21; -pub const _SC_MAPPED_FILES: ::c_int = 24; -pub const _SC_MEMLOCK: ::c_int = 25; -pub const _SC_MEMLOCK_RANGE: ::c_int = 26; -pub const _SC_MEMORY_PROTECTION: ::c_int = 27; -pub const _SC_MESSAGE_PASSING: ::c_int = 28; -pub const _SC_PRIORITIZED_IO: ::c_int = 31; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 32; -pub const _SC_REALTIME_SIGNALS: ::c_int = 33; -pub const _SC_SEMAPHORES: ::c_int = 35; -pub const _SC_FSYNC: ::c_int = 23; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 38; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 42; -pub const _SC_TIMERS: ::c_int = 43; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 20; -pub const _SC_DELAYTIMER_MAX: ::c_int = 22; -pub const _SC_MQ_OPEN_MAX: ::c_int = 29; -pub const _SC_RTSIG_MAX: ::c_int = 34; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 36; -pub const _SC_SEM_VALUE_MAX: ::c_int = 37; -pub const _SC_SIGQUEUE_MAX: ::c_int = 39; -pub const _SC_TIMER_MAX: ::c_int = 44; - -pub const _MUTEX_MAGIC: u16 = 0x4d58; // MX -pub const _COND_MAGIC: u16 = 0x4356; // CV -pub const _RWL_MAGIC: u16 = 0x5257; // RW - -pub const NCCS: usize = 19; - -pub const LOG_CRON: ::c_int = 15 << 3; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - __pthread_mutex_flag1: 0, - __pthread_mutex_flag2: 0, - __pthread_mutex_ceiling: 0, - __pthread_mutex_type: PTHREAD_PROCESS_PRIVATE, - __pthread_mutex_magic: _MUTEX_MAGIC, - __pthread_mutex_lock: 0, - __pthread_mutex_data: 0 -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - __pthread_cond_flag: [0; 4], - __pthread_cond_type: PTHREAD_PROCESS_PRIVATE, - __pthread_cond_magic: _COND_MAGIC, - __pthread_cond_data: 0 -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - __pthread_rwlock_readers: 0, - __pthread_rwlock_type: PTHREAD_PROCESS_PRIVATE, - __pthread_rwlock_magic: _RWL_MAGIC, - __pthread_rwlock_mutex: PTHREAD_MUTEX_INITIALIZER, - __pthread_rwlock_readercv: PTHREAD_COND_INITIALIZER, - __pthread_rwlock_writercv: PTHREAD_COND_INITIALIZER -}; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 4; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; - -pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void; -pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; -pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void; -pub const RTLD_PROBE: *mut ::c_void = -4isize as *mut ::c_void; - -pub const RTLD_NOW: ::c_int = 0x2; -pub const RTLD_NOLOAD: ::c_int = 0x4; -pub const RTLD_GLOBAL: ::c_int = 0x100; -pub const RTLD_LOCAL: ::c_int = 0x0; -pub const RTLD_PARENT: ::c_int = 0x200; -pub const RTLD_GROUP: ::c_int = 0x400; -pub const RTLD_WORLD: ::c_int = 0x800; -pub const RTLD_NODELETE: ::c_int = 0x1000; -pub const RTLD_FIRST: ::c_int = 0x2000; -pub const RTLD_CONFGEN: ::c_int = 0x10000; - -pub const PORT_SOURCE_AIO: ::c_int = 1; -pub const PORT_SOURCE_TIMER: ::c_int = 2; -pub const PORT_SOURCE_USER: ::c_int = 3; -pub const PORT_SOURCE_FD: ::c_int = 4; -pub const PORT_SOURCE_ALERT: ::c_int = 5; -pub const PORT_SOURCE_MQ: ::c_int = 6; -pub const PORT_SOURCE_FILE: ::c_int = 7; -pub const PORT_SOURCE_POSTWAIT: ::c_int = 8; -pub const PORT_SOURCE_SIGNAL: ::c_int = 9; - -f! { - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8; - let fd = fd as usize; - (*set).fds_bits[fd / bits] |= 1 << (fd % bits); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } - - pub fn WIFEXITED(status: ::c_int) -> bool { - (status & 0xFF) == 0 - } - - pub fn WEXITSTATUS(status: ::c_int) -> ::c_int { - (status >> 8) & 0xFF - } - - pub fn WTERMSIG(status: ::c_int) -> ::c_int { - status & 0x7F - } -} - -extern { - pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; - pub fn freeifaddrs(ifa: *mut ::ifaddrs); - - pub fn stack_getbounds(sp: *mut ::stack_t) -> ::c_int; - pub fn mincore(addr: *const ::c_void, len: ::size_t, - vec: *mut c_char) -> ::c_int; - pub fn setgroups(ngroups: ::c_int, - ptr: *const ::gid_t) -> ::c_int; - pub fn ioctl(fildes: ::c_int, request: ::c_int, ...) -> ::c_int; - pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) - -> ::c_int; - pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_nanosleep(clk_id: clockid_t, - flags: ::c_int, - rqtp: *const ::timespec, - rmtp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int; - pub fn getnameinfo(sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int) -> ::c_int; - #[link_name = "__posix_getpwnam_r"] - pub fn getpwnam_r(name: *const ::c_char, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - - #[link_name = "__posix_getpwuid_r"] - pub fn getpwuid_r(uid: ::uid_t, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd) -> ::c_int; - pub fn setpwent(); - pub fn getpwent() -> *mut passwd; - pub fn fdatasync(fd: ::c_int) -> ::c_int; - pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t); - pub fn newlocale(mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn getprogname() -> *const ::c_char; - pub fn setprogname(name: *const ::c_char); - pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; - pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; - pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; - - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; - - pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t, dev: dev_t) -> ::c_int; - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, - mode: ::mode_t) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; - pub fn if_nameindex() -> *mut if_nameindex; - pub fn if_freenameindex(ptr: *mut if_nameindex); - pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t, - clock_id: *mut clockid_t) -> ::c_int; - pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t, - clock_id: clockid_t) -> ::c_int; - pub fn sem_timedwait(sem: *mut sem_t, - abstime: *const ::timespec) -> ::c_int; - pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t, - abstime: *const ::timespec) -> ::c_int; - pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, - options: ::c_int) -> ::c_int; - - pub fn glob(pattern: *const ::c_char, - flags: ::c_int, - errfunc: Option ::c_int>, - pglob: *mut ::glob_t) -> ::c_int; - - pub fn globfree(pglob: *mut ::glob_t); - - pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn shm_unlink(name: *const ::c_char) -> ::c_int; - - pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); - - pub fn telldir(dirp: *mut ::DIR) -> ::c_long; - pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) - -> ::c_int; - - pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; - - pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, - flags: ::c_int, addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t) -> ::ssize_t; - pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; - pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; - - pub fn bind(socket: ::c_int, address: *const ::sockaddr, - address_len: ::socklen_t) -> ::c_int; - - pub fn writev(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - pub fn readv(fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int) -> ::ssize_t; - - pub fn sendmsg(fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int) -> ::ssize_t; - pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) - -> ::ssize_t; - - pub fn port_create() -> ::c_int; - pub fn port_associate(port: ::c_int, source: ::c_int, object: ::uintptr_t, - events: ::c_int, user: ::uintptr_t) -> ::c_int; - pub fn port_dissociate(port: ::c_int, source: ::c_int, object: ::uintptr_t) - -> ::c_int; - pub fn port_get(port: ::c_int, pe: *mut port_event, - timeout: *const ::timespec) -> ::c_int; - pub fn port_getn(port: ::c_int, pe_list: *mut port_event, max: ::c_uint, - nget: *mut ::c_uint, timeout: *const ::timespec) - -> ::c_int; -} diff --git a/src/tor/src/ext/rust/crates/libc-0.2.22/src/windows.rs b/src/tor/src/ext/rust/crates/libc-0.2.22/src/windows.rs deleted file mode 100644 index 6c8332a62..000000000 --- a/src/tor/src/ext/rust/crates/libc-0.2.22/src/windows.rs +++ /dev/null @@ -1,235 +0,0 @@ -//! Windows CRT definitions - -pub type c_char = i8; -pub type c_long = i32; -pub type c_ulong = u32; -pub type wchar_t = u16; - -pub type clock_t = i32; - -cfg_if! { - if #[cfg(all(target_arch = "x86", target_env = "gnu"))] { - pub type time_t = i32; - } else { - pub type time_t = i64; - } -} - -pub type off_t = i32; -pub type dev_t = u32; -pub type ino_t = u16; -pub enum timezone {} -pub type time64_t = i64; - -s! { - // note this is the struct called stat64 in Windows. Not stat, nor stati64. - pub struct stat { - pub st_dev: dev_t, - pub st_ino: ino_t, - pub st_mode: u16, - pub st_nlink: ::c_short, - pub st_uid: ::c_short, - pub st_gid: ::c_short, - pub st_rdev: dev_t, - pub st_size: i64, - pub st_atime: time64_t, - pub st_mtime: time64_t, - pub st_ctime: time64_t, - } - - // note that this is called utimbuf64 in Windows - pub struct utimbuf { - pub actime: time64_t, - pub modtime: time64_t, - } - - pub struct timeval { - pub tv_sec: c_long, - pub tv_usec: c_long, - } - - pub struct timespec { - pub tv_sec: time_t, - pub tv_nsec: c_long, - } -} - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 32767; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 4; -pub const _IOLBF: ::c_int = 64; -pub const BUFSIZ: ::c_uint = 512; -pub const FOPEN_MAX: ::c_uint = 20; -pub const FILENAME_MAX: ::c_uint = 260; - -cfg_if! { - if #[cfg(all(target_env = "gnu"))] { - pub const L_tmpnam: ::c_uint = 14; - pub const TMP_MAX: ::c_uint = 0x7fff; - } else if #[cfg(all(target_env = "msvc"))] { - pub const L_tmpnam: ::c_uint = 260; - pub const TMP_MAX: ::c_uint = 0x7fff_ffff; - } else { - // Unknown target_env - } -} - -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; -pub const O_APPEND: ::c_int = 8; -pub const O_CREAT: ::c_int = 256; -pub const O_EXCL: ::c_int = 1024; -pub const O_TEXT: ::c_int = 16384; -pub const O_BINARY: ::c_int = 32768; -pub const O_NOINHERIT: ::c_int = 128; -pub const O_TRUNC: ::c_int = 512; -pub const S_IFCHR: ::c_int = 8192; -pub const S_IFDIR: ::c_int = 16384; -pub const S_IFREG: ::c_int = 32768; -pub const S_IFMT: ::c_int = 61440; -pub const S_IEXEC: ::c_int = 64; -pub const S_IWRITE: ::c_int = 128; -pub const S_IREAD: ::c_int = 256; - -pub const LC_ALL: ::c_int = 0; -pub const LC_COLLATE: ::c_int = 1; -pub const LC_CTYPE: ::c_int = 2; -pub const LC_MONETARY: ::c_int = 3; -pub const LC_NUMERIC: ::c_int = 4; -pub const LC_TIME: ::c_int = 5; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EAGAIN: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -pub const ENODEV: ::c_int = 19; -pub const ENOTDIR: ::c_int = 20; -pub const EISDIR: ::c_int = 21; -pub const EINVAL: ::c_int = 22; -pub const ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const EDEADLK: ::c_int = 36; -pub const EDEADLOCK: ::c_int = 36; -pub const ENAMETOOLONG: ::c_int = 38; -pub const ENOLCK: ::c_int = 39; -pub const ENOSYS: ::c_int = 40; -pub const ENOTEMPTY: ::c_int = 41; -pub const EILSEQ: ::c_int = 42; -pub const STRUNCATE: ::c_int = 80; - -#[cfg(all(target_env = "msvc", stdbuild))] // " if " -- appease style checker -#[link(name = "msvcrt", cfg(not(target_feature = "crt-static")))] -#[link(name = "libcmt", cfg(target_feature = "crt-static"))] -extern {} - -extern { - #[link_name = "_chmod"] - pub fn chmod(path: *const c_char, mode: ::c_int) -> ::c_int; - #[link_name = "_wchmod"] - pub fn wchmod(path: *const wchar_t, mode: ::c_int) -> ::c_int; - #[link_name = "_mkdir"] - pub fn mkdir(path: *const c_char) -> ::c_int; - #[link_name = "_wrmdir"] - pub fn wrmdir(path: *const wchar_t) -> ::c_int; - #[link_name = "_fstat64"] - pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; - #[link_name = "_stat64"] - pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; - #[link_name = "_wstat64"] - pub fn wstat(path: *const wchar_t, buf: *mut stat) -> ::c_int; - #[link_name = "_wutime64"] - pub fn wutime(file: *const wchar_t, buf: *mut utimbuf) -> ::c_int; - #[link_name = "_popen"] - pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; - #[link_name = "_pclose"] - pub fn pclose(stream: *mut ::FILE) -> ::c_int; - #[link_name = "_fdopen"] - pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; - #[link_name = "_fileno"] - pub fn fileno(stream: *mut ::FILE) -> ::c_int; - #[link_name = "_open"] - pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; - #[link_name = "_wopen"] - pub fn wopen(path: *const wchar_t, oflag: ::c_int, ...) -> ::c_int; - #[link_name = "_creat"] - pub fn creat(path: *const c_char, mode: ::c_int) -> ::c_int; - #[link_name = "_access"] - pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; - #[link_name = "_chdir"] - pub fn chdir(dir: *const c_char) -> ::c_int; - #[link_name = "_close"] - pub fn close(fd: ::c_int) -> ::c_int; - #[link_name = "_dup"] - pub fn dup(fd: ::c_int) -> ::c_int; - #[link_name = "_dup2"] - pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; - #[link_name = "_execv"] - pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::intptr_t; - #[link_name = "_execve"] - pub fn execve(prog: *const c_char, argv: *const *const c_char, - envp: *const *const c_char) -> ::c_int; - #[link_name = "_execvp"] - pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int; - #[link_name = "_execvpe"] - pub fn execvpe(c: *const c_char, argv: *const *const c_char, - envp: *const *const c_char) -> ::c_int; - #[link_name = "_getcwd"] - pub fn getcwd(buf: *mut c_char, size: ::c_int) -> *mut c_char; - #[link_name = "_getpid"] - pub fn getpid() -> ::c_int; - #[link_name = "_isatty"] - pub fn isatty(fd: ::c_int) -> ::c_int; - #[link_name = "_lseek"] - pub fn lseek(fd: ::c_int, offset: c_long, origin: ::c_int) -> c_long; - #[link_name = "_pipe"] - pub fn pipe(fds: *mut ::c_int, - psize: ::c_uint, - textmode: ::c_int) -> ::c_int; - #[link_name = "_read"] - pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::c_uint) -> ::c_int; - #[link_name = "_rmdir"] - pub fn rmdir(path: *const c_char) -> ::c_int; - #[link_name = "_unlink"] - pub fn unlink(c: *const c_char) -> ::c_int; - #[link_name = "_write"] - pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::c_uint) -> ::c_int; - #[link_name = "_commit"] - pub fn commit(fd: ::c_int) -> ::c_int; - #[link_name = "_get_osfhandle"] - pub fn get_osfhandle(fd: ::c_int) -> ::intptr_t; - #[link_name = "_open_osfhandle"] - pub fn open_osfhandle(osfhandle: ::intptr_t, flags: ::c_int) -> ::c_int; - pub fn setlocale(category: ::c_int, locale: *const c_char) -> *mut c_char; - #[link_name = "_wsetlocale"] - pub fn wsetlocale(category: ::c_int, - locale: *const wchar_t) -> *mut wchar_t; -} diff --git a/src/tor/src/ext/siphash.h b/src/tor/src/ext/siphash.h deleted file mode 100644 index d9b34b898..000000000 --- a/src/tor/src/ext/siphash.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef SIPHASH_H -#define SIPHASH_H - -struct sipkey { - uint64_t k0; - uint64_t k1; -}; -uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *key); - -void siphash_set_global_key(const struct sipkey *key); -uint64_t siphash24g(const void *src, unsigned long src_sz); - -#endif diff --git a/src/tor/src/ext/timeouts/Rules.shrc b/src/tor/src/ext/timeouts/Rules.shrc deleted file mode 100644 index ece75d42d..000000000 --- a/src/tor/src/ext/timeouts/Rules.shrc +++ /dev/null @@ -1,40 +0,0 @@ -# convert to absolute paths -top_srcdir="$(cd "${top_srcdir}" && pwd -L)" -top_builddir="$(cd "${top_builddir}" && pwd -L)" - -# Paths for Lua modules (benchmarks and installed modules) -export LUA_CPATH="${top_builddir}/lua/5.1/?.so;${top_builddir}/bench/?.so;;" -export LUA_PATH="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" -export LUA_CPATH_5_2="${top_builddir}/lua/5.2/?.so;${top_builddir}/bench/?.so;;" -export LUA_PATH_5_2="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" -export LUA_CPATH_5_3="${top_builddir}/lua/5.3/?.so;${top_builddir}/bench/?.so;;" -export LUA_PATH_5_3="${top_srcdir}/lua/?.lua;${top_srcdir}/bench/?.lua;;" - -# preserve stdout so we can print commands to terminal -exec 9>&1; -echo_cmd() { - printf "%s\n" "$*" >&9; - "$@"; -} - -auto_soflags() { - case "$(uname -s)" in - Darwin) - printf -- "-bundle -undefined dynamic_lookup" - ;; - *) - printf -- "-fPIC -shared" - ;; - esac -} - -auto_libs() { - case "$(uname -s)" in - Linux) - printf -- "-lrt" - ;; - *) - ;; - esac -} - diff --git a/src/tor/src/ext/timeouts/bench/Rules.mk b/src/tor/src/ext/timeouts/bench/Rules.mk deleted file mode 100644 index 3ee72f3ef..000000000 --- a/src/tor/src/ext/timeouts/bench/Rules.mk +++ /dev/null @@ -1,49 +0,0 @@ -BENCH_MODS = bench.so $(BENCH_ALGOS:%=bench-%.so) -BENCH_ALGOS = wheel heap llrb -BENCH_OPS = add del expire - -$(top_builddir)/bench/bench.so: $(top_srcdir)/bench/bench.c -$(top_builddir)/bench/bench-wheel.so: $(top_srcdir)/bench/bench-wheel.c -$(top_builddir)/bench/bench-heap.so: $(top_srcdir)/bench/bench-heap.c -$(top_builddir)/bench/bench-llrb.so: $(top_srcdir)/bench/bench-llrb.c - -$(BENCH_MODS:%=$(top_builddir)/bench/%): $(top_srcdir)/timeout.h $(top_srcdir)/timeout.c $(top_srcdir)/bench/bench.h - mkdir -p $(@D) - @$(SHRC); echo_cmd $(CC) -o $@ $(top_srcdir)/bench/$(@F:%.so=%.c) $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(ALL_SOFLAGS) $(ALL_LDFLAGS) $(ALL_LIBS) - -$(BENCH_OPS:%=$(top_builddir)/bench/wheel-%.dat): $(top_builddir)/bench/bench-wheel.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua -$(BENCH_OPS:%=$(top_builddir)/bench/heap-%.dat): $(top_builddir)/bench/bench-heap.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua -$(BENCH_OPS:%=$(top_builddir)/bench/llrb-%.dat): $(top_builddir)/bench/bench-llrb.so $(top_builddir)/bench/bench.so $(top_srcdir)/bench/bench-aux.lua - -$(BENCH_ALGOS:%=$(top_builddir)/bench/%-add.dat): $(top_srcdir)/bench/bench-add.lua - @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-add.lua $${top_builddir}/bench/bench-$(@F:%-add.dat=%).so > $(@F).tmp - mv $@.tmp $@ - -$(BENCH_ALGOS:%=$(top_builddir)/bench/%-del.dat): $(top_srcdir)/bench/bench-del.lua - @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-del.lua $${top_builddir}/bench/bench-$(@F:%-del.dat=%).so > $(@F).tmp - mv $@.tmp $@ - -$(BENCH_ALGOS:%=$(top_builddir)/bench/%-expire.dat): $(top_srcdir)/bench/bench-expire.lua - @$(SHRC); echo_cmd cd $(@D) && echo_cmd $(LUA) $${top_srcdir}/bench/bench-expire.lua $${top_builddir}/bench/bench-$(@F:%-expire.dat=%).so > $(@F).tmp - mv $@.tmp $@ - -$(top_builddir)/bench/bench.eps: \ - $(BENCH_OPS:%=$(top_builddir)/bench/wheel-%.dat) \ - $(BENCH_OPS:%=$(top_builddir)/bench/heap-%.dat) -# $(BENCH_OPS:%=$(top_builddir)/bench/llrb-%.dat) - -$(top_builddir)/bench/bench.eps: $(top_srcdir)/bench/bench.plt - @$(SHRC); echo_cmd cd $(@D) && echo_cmd gnuplot $${top_srcdir}/bench/bench.plt > $(@F).tmp - mv $@.tmp $@ - -$(top_builddir)/bench/bench.pdf: $(top_builddir)/bench/bench.eps - @$(SHRC); echo_cmd ps2pdf $${top_builddir}/bench/bench.eps $@ - -bench-mods: $(BENCH_MODS:%=$(top_builddir)/bench/%) - -bench-all: $(top_builddir)/bench/bench.pdf - -bench-clean: - $(RM) -r $(top_builddir)/bench/*.so $(top_builddir)/bench/*.dSYM - $(RM) $(top_builddir)/bench/*.dat $(top_builddir)/bench/*.tmp - $(RM) $(top_builddir)/bench/bench.{eps,pdf} diff --git a/src/tor/src/ext/timeouts/bench/bench-add.lua b/src/tor/src/ext/timeouts/bench/bench-add.lua deleted file mode 100644 index 64a921d3d..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-add.lua +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env lua - -local bench = require"bench" -local aux = require"bench-aux" - -local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") -local limit = tonumber(aux.optenv("BENCH_N", 1000000)) -local step = tonumber(aux.optenv("BENCH_S", limit / 100)) -local exp_step = tonumber(aux.optenv("BENCH_E", 1.0)) -local verbose = aux.toboolean(os.getenv("BENCH_V", false)) - -local B = bench.new(lib, count, nil, verbose) -local fill_count, fill_last = B:fill(limit) - -for i=0,limit,step do - local exp_elapsed, fill_elapsed, fill_rate - - -- expire all timeouts - --exp_elapsed = aux.time(B.expire, B, fill_count, fill_last * exp_step) - exp_elapsed = aux.time(B.del, B, 0, fill_count) - assert(B:empty()) - - -- add i timeouts - fill_elapsed, fill_count, fill_last = aux.time(B.fill, B, i) - assert(fill_count == i) - fill_rate = fill_elapsed > 0 and (fill_count / fill_elapsed) or 0 - - local fmt = verbose and "%d\t%f\t(%d/s)\t(exp:%f)" or "%d\t%f" - aux.say(fmt, i, fill_elapsed, fill_rate, exp_elapsed) -end diff --git a/src/tor/src/ext/timeouts/bench/bench-aux.lua b/src/tor/src/ext/timeouts/bench/bench-aux.lua deleted file mode 100644 index 632124742..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-aux.lua +++ /dev/null @@ -1,30 +0,0 @@ -local bench = require"bench" -local clock = bench.clock - -local aux = {} - -local function time_return(begun, ...) - local duration = clock() - begun - return duration, ... -end - -function aux.time(f, ...) - local begun = clock() - return time_return(begun, f(...)) -end - -function aux.say(...) - print(string.format(...)) -end - -function aux.toboolean(s) - return tostring(s):match("^[1TtYy]") and true or false -end - -function aux.optenv(k, def) - local s = os.getenv(k) - - return (s and #s > 0 and s) or def -end - -return aux diff --git a/src/tor/src/ext/timeouts/bench/bench-del.lua b/src/tor/src/ext/timeouts/bench/bench-del.lua deleted file mode 100644 index 4306745f2..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-del.lua +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env lua - -local bench = require"bench" -local aux = require"bench-aux" - -local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") -local limit = tonumber(aux.optenv("BENCH_N", 1000000)) -local step = tonumber(aux.optenv("BENCH_S", limit / 100)) -local verbose = aux.toboolean(os.getenv("BENCH_V", false)) - -local B = bench.new(lib, count) - -for i=0,limit,step do - -- add i timeouts - local fill_elapsed, fill_count = aux.time(B.fill, B, i, 60 * 1000000) - assert(i == fill_count) - - --- delete i timeouts - local del_elapsed = aux.time(B.del, B, 0, fill_count) - assert(B:empty()) - local del_rate = i > 0 and i / del_elapsed or 0 - - local fmt = verbose and "%d\t%f\t(%d/s)\t(fill:%f)" or "%d\t%f" - aux.say(fmt, i, del_elapsed, del_rate, fill_elapsed) -end diff --git a/src/tor/src/ext/timeouts/bench/bench-expire.lua b/src/tor/src/ext/timeouts/bench/bench-expire.lua deleted file mode 100644 index 3e6374ed5..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-expire.lua +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env lua - -local bench = require"bench" -local aux = require"bench-aux" - -local lib = ... or aux.optenv("BENCH_L", "bench-wheel.so") -local limit = tonumber(aux.optenv("BENCH_N", 1000000)) -local step = tonumber(aux.optenv("BENCH_S", limit / 100)) --- expire 1/1000 * #timeouts per clock update -local exp_step = tonumber(aux.optenv("BENCH_E", 0.0001)) -local verbose = aux.toboolean(os.getenv("BENCH_V", false)) - -local B = require"bench".new(lib, count) - -for i=0,limit,step do - -- add i timeouts - local fill_elapsed, fill_count, fill_last = aux.time(B.fill, B, i) - - -- expire timeouts by iteratively updating clock. exp_step is the - -- approximate number of timeouts (as a fraction of the total number - -- of timeouts) that will expire per update. - local exp_elapsed, exp_count = aux.time(B.expire, B, fill_count, math.floor(fill_last * exp_step)) - assert(exp_count == i) - assert(B:empty()) - local exp_rate = i > 0 and i / exp_elapsed or 0 - - local fmt = verbose and "%d\t%f\t(%d/s)\t(fill:%f)" or "%d\t%f" - aux.say(fmt, i, exp_elapsed, exp_rate, fill_elapsed) -end diff --git a/src/tor/src/ext/timeouts/bench/bench-heap.c b/src/tor/src/ext/timeouts/bench/bench-heap.c deleted file mode 100644 index f1166a4d7..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-heap.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) 2006 Maxim Yegorushkin - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ -#ifndef _MIN_HEAP_H_ -#define _MIN_HEAP_H_ - -#include -#include -#include "timeout.h" -#include "bench.h" - -#define min_heap_idx interval - -typedef timeout_t min_heap_idx_t; - -typedef struct min_heap -{ - struct timeout** p; - unsigned n, a; - timeout_t curtime; -} min_heap_t; - -static inline void min_heap_ctor(min_heap_t* s); -static inline void min_heap_dtor(min_heap_t* s); -static inline void min_heap_elem_init(struct timeout* e); -static inline int min_heap_elem_greater(struct timeout *a, struct timeout *b); -static inline int min_heap_empty(min_heap_t* s); -static inline unsigned min_heap_size(min_heap_t* s); -static inline struct timeout* min_heap_top(min_heap_t* s); -static inline int min_heap_reserve(min_heap_t* s, unsigned n); -static inline int min_heap_push(min_heap_t* s, struct timeout* e); -static inline struct timeout* min_heap_pop(min_heap_t* s); -static inline int min_heap_erase(min_heap_t* s, struct timeout* e); -static inline void min_heap_shift_up_(min_heap_t* s, unsigned hole_index, struct timeout* e); -static inline void min_heap_shift_down_(min_heap_t* s, unsigned hole_index, struct timeout* e); - -int min_heap_elem_greater(struct timeout *a, struct timeout *b) -{ - return a->expires > b->expires; -} - -void min_heap_ctor(min_heap_t* s) { s->p = 0; s->n = 0; s->a = 0; } -void min_heap_dtor(min_heap_t* s) { if(s->p) free(s->p); } -void min_heap_elem_init(struct timeout* e) { e->min_heap_idx = -1; } -int min_heap_empty(min_heap_t* s) { return 0u == s->n; } -unsigned min_heap_size(min_heap_t* s) { return s->n; } -struct timeout* min_heap_top(min_heap_t* s) { return s->n ? *s->p : 0; } - -int min_heap_push(min_heap_t* s, struct timeout* e) -{ - if(min_heap_reserve(s, s->n + 1)) - return -1; - min_heap_shift_up_(s, s->n++, e); - return 0; -} - -struct timeout* min_heap_pop(min_heap_t* s) -{ - if(s->n) - { - struct timeout* e = *s->p; - min_heap_shift_down_(s, 0u, s->p[--s->n]); - e->min_heap_idx = -1; - return e; - } - return 0; -} - -int min_heap_erase(min_heap_t* s, struct timeout* e) -{ - if(((min_heap_idx_t)-1) != e->min_heap_idx) - { - struct timeout *last = s->p[--s->n]; - unsigned parent = (e->min_heap_idx - 1) / 2; - /* we replace e with the last element in the heap. We might need to - shift it upward if it is less than its parent, or downward if it is - greater than one or both its children. Since the children are known - to be less than the parent, it can't need to shift both up and - down. */ - if (e->min_heap_idx > 0 && min_heap_elem_greater(s->p[parent], last)) - min_heap_shift_up_(s, e->min_heap_idx, last); - else - min_heap_shift_down_(s, e->min_heap_idx, last); - e->min_heap_idx = -1; - return 0; - } - return -1; -} - -int min_heap_reserve(min_heap_t* s, unsigned n) -{ - if(s->a < n) - { - struct timeout** p; - unsigned a = s->a ? s->a * 2 : 8; - if(a < n) - a = n; - if(!(p = (struct timeout**)realloc(s->p, a * sizeof *p))) - return -1; - s->p = p; - s->a = a; - } - return 0; -} - -void min_heap_shift_up_(min_heap_t* s, unsigned hole_index, struct timeout* e) -{ - unsigned parent = (hole_index - 1) / 2; - while(hole_index && min_heap_elem_greater(s->p[parent], e)) - { - (s->p[hole_index] = s->p[parent])->min_heap_idx = hole_index; - hole_index = parent; - parent = (hole_index - 1) / 2; - } - (s->p[hole_index] = e)->min_heap_idx = hole_index; -} - -void min_heap_shift_down_(min_heap_t* s, unsigned hole_index, struct timeout* e) -{ - unsigned min_child = 2 * (hole_index + 1); - while(min_child <= s->n) - { - min_child -= min_child == s->n || min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]); - if(!(min_heap_elem_greater(e, s->p[min_child]))) - break; - (s->p[hole_index] = s->p[min_child])->min_heap_idx = hole_index; - hole_index = min_child; - min_child = 2 * (hole_index + 1); - } - min_heap_shift_up_(s, hole_index, e); -} - -#endif /* _MIN_HEAP_H_ */ - - -static void *init(struct timeout *timeout, size_t count, int verbose) { - min_heap_t *H; - size_t i; - - H = calloc(1, sizeof *H); - - min_heap_ctor(H); - if (0 != min_heap_reserve(H, count)) - err(1, "realloc"); - - for (i = 0; i < count; i++) { - min_heap_elem_init(&timeout[i]); - } - - return H; -} /* init() */ - - -static void add(void *ctx, struct timeout *to, timeout_t expires) { - min_heap_t *H = ctx; - min_heap_erase(H, to); - to->expires = H->curtime + expires; - if (0 != min_heap_push(H, to)) - err(1, "realloc"); -} /* add() */ - - -static void del(void *ctx, struct timeout *to) { - min_heap_erase(ctx, to); -} /* del() */ - - -static struct timeout *get(void *ctx) { - min_heap_t *H = ctx; - struct timeout *to; - - if ((to = min_heap_top(H)) && to->expires <= H->curtime) - return min_heap_pop(H); - - return NULL; -} /* get() */ - - -static void update(void *ctx, timeout_t ts) { - min_heap_t *H = ctx; - H->curtime = ts; -} /* update() */ - - -static void check(void *ctx) { - return; -} /* check() */ - - -static int empty(void *ctx) { - min_heap_t *H = ctx; - - return (NULL == min_heap_top(H)); -} /* empty() */ - - -static void destroy(void *H) { - free(H); - return; -} /* destroy() */ - - -const struct benchops benchops = { - .init = &init, - .add = &add, - .del = &del, - .get = &get, - .update = &update, - .check = &check, - .empty = &empty, - .destroy = &destroy, -}; - diff --git a/src/tor/src/ext/timeouts/bench/bench-llrb.c b/src/tor/src/ext/timeouts/bench/bench-llrb.c deleted file mode 100644 index bdb02f070..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-llrb.c +++ /dev/null @@ -1,425 +0,0 @@ -/* ========================================================================== - * llrb.h - Iterative Left-leaning Red-Black Tree. - * -------------------------------------------------------------------------- - * Copyright (c) 2011, 2013 William Ahern - * - * 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. - * -------------------------------------------------------------------------- - * CREDITS: - * o Algorithm courtesy of Robert Sedgewick, "Left-leaning Red-Black - * Trees" (September 2008); and Robert Sedgewick and Kevin Wayne, - * Algorithms (4th ed. 2011). - * - * Sedgewick touts the simplicity of the recursive implementation, - * but at least for the 2-3 tree variant the iterative approach is - * almost line-for-line identical. The magic of C pointers helps; - * it'd be uglier with Java. - * - * A couple of missing NULL checks were added to Sedgewick's deletion - * example, and insert was optimized to short-circuit rotations when - * walking up the tree. - * - * o Code implemented in the fashion of Niels Provos' excellent *BSD - * sys/tree.h pre-processor library. - * - * Regarding relative performance, I've refrained from sharing my own - * benchmarks. Differences in run-time speed were too correlated to - * compiler options and other external factors. - * - * Provos' delete implementation doesn't need to start at the root of - * the tree. However, RB_REMOVE must be passed the actual node to be - * removed. LLRB_REMOVE merely requires a key, much like - * RB_FIND/LLRB_FIND. - * ========================================================================== - */ -#ifndef LLRB_H -#define LLRB_H - -#define LLRB_VENDOR "william@25thandClement.com" -#define LLRB_VERSION 0x20130925 - -#ifndef LLRB_STATIC -#ifdef __GNUC__ -#define LLRB_STATIC __attribute__((__unused__)) static -#else -#define LLRB_STATIC static -#endif -#endif - -#define LLRB_HEAD(name, type) \ -struct name { struct type *rbh_root; } - -#define LLRB_INITIALIZER(root) { 0 } - -#define LLRB_INIT(root) do { (root)->rbh_root = 0; } while (0) - -#define LLRB_BLACK 0 -#define LLRB_RED 1 - -#define LLRB_ENTRY(type) \ -struct { struct type *rbe_left, *rbe_right, *rbe_parent; _Bool rbe_color; } - -#define LLRB_LEFT(elm, field) (elm)->field.rbe_left -#define LLRB_RIGHT(elm, field) (elm)->field.rbe_right -#define LLRB_PARENT(elm, field) (elm)->field.rbe_parent -#define LLRB_EDGE(head, elm, field) (((elm) == LLRB_ROOT(head))? &LLRB_ROOT(head) : ((elm) == LLRB_LEFT(LLRB_PARENT((elm), field), field))? &LLRB_LEFT(LLRB_PARENT((elm), field), field) : &LLRB_RIGHT(LLRB_PARENT((elm), field), field)) -#define LLRB_COLOR(elm, field) (elm)->field.rbe_color -#define LLRB_ROOT(head) (head)->rbh_root -#define LLRB_EMPTY(head) ((head)->rbh_root == 0) -#define LLRB_ISRED(elm, field) ((elm) && LLRB_COLOR((elm), field) == LLRB_RED) - -#define LLRB_PROTOTYPE(name, type, field, cmp) \ - LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp,) -#define LLRB_PROTOTYPE_STATIC(name, type, field, cmp) \ - LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp, LLRB_STATIC) -#define LLRB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ -attr struct type *name##_LLRB_INSERT(struct name *, struct type *); \ -attr struct type *name##_LLRB_DELETE(struct name *, struct type *); \ -attr struct type *name##_LLRB_FIND(struct name *, struct type *); \ -attr struct type *name##_LLRB_MIN(struct type *); \ -attr struct type *name##_LLRB_MAX(struct type *); \ -attr struct type *name##_LLRB_NEXT(struct type *); - -#define LLRB_GENERATE(name, type, field, cmp) \ - LLRB_GENERATE_INTERNAL(name, type, field, cmp,) -#define LLRB_GENERATE_STATIC(name, type, field, cmp) \ - LLRB_GENERATE_INTERNAL(name, type, field, cmp, LLRB_STATIC) -#define LLRB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ -static inline void name##_LLRB_ROTL(struct type **pivot) { \ - struct type *a = *pivot; \ - struct type *b = LLRB_RIGHT(a, field); \ - if ((LLRB_RIGHT(a, field) = LLRB_LEFT(b, field))) \ - LLRB_PARENT(LLRB_RIGHT(a, field), field) = a; \ - LLRB_LEFT(b, field) = a; \ - LLRB_COLOR(b, field) = LLRB_COLOR(a, field); \ - LLRB_COLOR(a, field) = LLRB_RED; \ - LLRB_PARENT(b, field) = LLRB_PARENT(a, field); \ - LLRB_PARENT(a, field) = b; \ - *pivot = b; \ -} \ -static inline void name##_LLRB_ROTR(struct type **pivot) { \ - struct type *b = *pivot; \ - struct type *a = LLRB_LEFT(b, field); \ - if ((LLRB_LEFT(b, field) = LLRB_RIGHT(a, field))) \ - LLRB_PARENT(LLRB_LEFT(b, field), field) = b; \ - LLRB_RIGHT(a, field) = b; \ - LLRB_COLOR(a, field) = LLRB_COLOR(b, field); \ - LLRB_COLOR(b, field) = LLRB_RED; \ - LLRB_PARENT(a, field) = LLRB_PARENT(b, field); \ - LLRB_PARENT(b, field) = a; \ - *pivot = a; \ -} \ -static inline void name##_LLRB_FLIP(struct type *root) { \ - LLRB_COLOR(root, field) = !LLRB_COLOR(root, field); \ - LLRB_COLOR(LLRB_LEFT(root, field), field) = !LLRB_COLOR(LLRB_LEFT(root, field), field); \ - LLRB_COLOR(LLRB_RIGHT(root, field), field) = !LLRB_COLOR(LLRB_RIGHT(root, field), field); \ -} \ -static inline void name##_LLRB_FIXUP(struct type **root) { \ - if (LLRB_ISRED(LLRB_RIGHT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(*root, field), field)) \ - name##_LLRB_ROTL(root); \ - if (LLRB_ISRED(LLRB_LEFT(*root, field), field) && LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*root, field), field), field)) \ - name##_LLRB_ROTR(root); \ - if (LLRB_ISRED(LLRB_LEFT(*root, field), field) && LLRB_ISRED(LLRB_RIGHT(*root, field), field)) \ - name##_LLRB_FLIP(*root); \ -} \ -attr struct type *name##_LLRB_INSERT(struct name *head, struct type *elm) { \ - struct type **root = &LLRB_ROOT(head); \ - struct type *parent = 0; \ - while (*root) { \ - int comp = (cmp)((elm), (*root)); \ - parent = *root; \ - if (comp < 0) \ - root = &LLRB_LEFT(*root, field); \ - else if (comp > 0) \ - root = &LLRB_RIGHT(*root, field); \ - else \ - return *root; \ - } \ - LLRB_LEFT((elm), field) = 0; \ - LLRB_RIGHT((elm), field) = 0; \ - LLRB_COLOR((elm), field) = LLRB_RED; \ - LLRB_PARENT((elm), field) = parent; \ - *root = (elm); \ - while (parent && (LLRB_ISRED(LLRB_LEFT(parent, field), field) || LLRB_ISRED(LLRB_RIGHT(parent, field), field))) { \ - root = LLRB_EDGE(head, parent, field); \ - parent = LLRB_PARENT(parent, field); \ - name##_LLRB_FIXUP(root); \ - } \ - LLRB_COLOR(LLRB_ROOT(head), field) = LLRB_BLACK; \ - return 0; \ -} \ -static inline void name##_LLRB_MOVL(struct type **pivot) { \ - name##_LLRB_FLIP(*pivot); \ - if (LLRB_ISRED(LLRB_LEFT(LLRB_RIGHT(*pivot, field), field), field)) { \ - name##_LLRB_ROTR(&LLRB_RIGHT(*pivot, field)); \ - name##_LLRB_ROTL(pivot); \ - name##_LLRB_FLIP(*pivot); \ - } \ -} \ -static inline void name##_LLRB_MOVR(struct type **pivot) { \ - name##_LLRB_FLIP(*pivot); \ - if (LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*pivot, field), field), field)) { \ - name##_LLRB_ROTR(pivot); \ - name##_LLRB_FLIP(*pivot); \ - } \ -} \ -static inline struct type *name##_DELETEMIN(struct name *head, struct type **root) { \ - struct type **pivot = root, *deleted, *parent; \ - while (LLRB_LEFT(*pivot, field)) { \ - if (!LLRB_ISRED(LLRB_LEFT(*pivot, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*pivot, field), field), field)) \ - name##_LLRB_MOVL(pivot); \ - pivot = &LLRB_LEFT(*pivot, field); \ - } \ - deleted = *pivot; \ - parent = LLRB_PARENT(*pivot, field); \ - *pivot = 0; \ - while (root != pivot) { \ - pivot = LLRB_EDGE(head, parent, field); \ - parent = LLRB_PARENT(parent, field); \ - name##_LLRB_FIXUP(pivot); \ - } \ - return deleted; \ -} \ -attr struct type *name##_LLRB_DELETE(struct name *head, struct type *elm) { \ - struct type **root = &LLRB_ROOT(head), *parent = 0, *deleted = 0; \ - int comp; \ - while (*root) { \ - parent = LLRB_PARENT(*root, field); \ - comp = (cmp)(elm, *root); \ - if (comp < 0) { \ - if (LLRB_LEFT(*root, field) && !LLRB_ISRED(LLRB_LEFT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_LEFT(*root, field), field), field)) \ - name##_LLRB_MOVL(root); \ - root = &LLRB_LEFT(*root, field); \ - } else { \ - if (LLRB_ISRED(LLRB_LEFT(*root, field), field)) { \ - name##_LLRB_ROTR(root); \ - comp = (cmp)(elm, *root); \ - } \ - if (!comp && !LLRB_RIGHT(*root, field)) { \ - deleted = *root; \ - *root = 0; \ - break; \ - } \ - if (LLRB_RIGHT(*root, field) && !LLRB_ISRED(LLRB_RIGHT(*root, field), field) && !LLRB_ISRED(LLRB_LEFT(LLRB_RIGHT(*root, field), field), field)) { \ - name##_LLRB_MOVR(root); \ - comp = (cmp)(elm, *root); \ - } \ - if (!comp) { \ - struct type *orphan = name##_DELETEMIN(head, &LLRB_RIGHT(*root, field)); \ - LLRB_COLOR(orphan, field) = LLRB_COLOR(*root, field); \ - LLRB_PARENT(orphan, field) = LLRB_PARENT(*root, field); \ - if ((LLRB_RIGHT(orphan, field) = LLRB_RIGHT(*root, field))) \ - LLRB_PARENT(LLRB_RIGHT(orphan, field), field) = orphan; \ - if ((LLRB_LEFT(orphan, field) = LLRB_LEFT(*root, field))) \ - LLRB_PARENT(LLRB_LEFT(orphan, field), field) = orphan; \ - deleted = *root; \ - *root = orphan; \ - parent = *root; \ - break; \ - } else \ - root = &LLRB_RIGHT(*root, field); \ - } \ - } \ - while (parent) { \ - root = LLRB_EDGE(head, parent, field); \ - parent = LLRB_PARENT(parent, field); \ - name##_LLRB_FIXUP(root); \ - } \ - if (LLRB_ROOT(head)) \ - LLRB_COLOR(LLRB_ROOT(head), field) = LLRB_BLACK; \ - return deleted; \ -} \ -attr struct type *name##_LLRB_FIND(struct name *head, struct type *key) { \ - struct type *elm = LLRB_ROOT(head); \ - while (elm) { \ - int comp = (cmp)(key, elm); \ - if (comp < 0) \ - elm = LLRB_LEFT(elm, field); \ - else if (comp > 0) \ - elm = LLRB_RIGHT(elm, field); \ - else \ - return elm; \ - } \ - return 0; \ -} \ -attr struct type *name##_LLRB_MIN(struct type *elm) { \ - while (elm && LLRB_LEFT(elm, field)) \ - elm = LLRB_LEFT(elm, field); \ - return elm; \ -} \ -attr struct type *name##_LLRB_MAX(struct type *elm) { \ - while (elm && LLRB_RIGHT(elm, field)) \ - elm = LLRB_RIGHT(elm, field); \ - return elm; \ -} \ -attr struct type *name##_LLRB_NEXT(struct type *elm) { \ - if (LLRB_RIGHT(elm, field)) { \ - return name##_LLRB_MIN(LLRB_RIGHT(elm, field)); \ - } else if (LLRB_PARENT(elm, field)) { \ - if (elm == LLRB_LEFT(LLRB_PARENT(elm, field), field)) \ - return LLRB_PARENT(elm, field); \ - while (LLRB_PARENT(elm, field) && elm == LLRB_RIGHT(LLRB_PARENT(elm, field), field)) \ - elm = LLRB_PARENT(elm, field); \ - return LLRB_PARENT(elm, field); \ - } else return 0; \ -} - -#define LLRB_INSERT(name, head, elm) name##_LLRB_INSERT((head), (elm)) -#define LLRB_DELETE(name, head, elm) name##_LLRB_DELETE((head), (elm)) -#define LLRB_REMOVE(name, head, elm) name##_LLRB_DELETE((head), (elm)) -#define LLRB_FIND(name, head, elm) name##_LLRB_FIND((head), (elm)) -#define LLRB_MIN(name, head) name##_LLRB_MIN(LLRB_ROOT((head))) -#define LLRB_MAX(name, head) name##_LLRB_MAX(LLRB_ROOT((head))) -#define LLRB_NEXT(name, head, elm) name##_LLRB_NEXT((elm)) - -#define LLRB_FOREACH(elm, name, head) \ -for ((elm) = LLRB_MIN(name, head); (elm); (elm) = name##_LLRB_NEXT((elm))) - -#endif /* LLRB_H */ - - -#include - -#include "timeout.h" -#include "bench.h" - - -struct rbtimeout { - timeout_t expires; - - int pending; - - LLRB_ENTRY(rbtimeout) rbe; -}; - -struct rbtimeouts { - timeout_t curtime; - LLRB_HEAD(tree, rbtimeout) tree; -}; - - -static int timeoutcmp(struct rbtimeout *a, struct rbtimeout *b) { - if (a->expires < b->expires) { - return -1; - } else if (a->expires > b->expires) { - return 1; - } else if (a < b) { - return -1; - } else if (a > b) { - return 1; - } else { - return 0; - } -} /* timeoutcmp() */ - -LLRB_GENERATE_STATIC(tree, rbtimeout, rbe, timeoutcmp) - -static void *init(struct timeout *timeout, size_t count, int verbose) { - struct rbtimeouts *T; - size_t i; - - T = malloc(sizeof *T); - T->curtime = 0; - LLRB_INIT(&T->tree); - - for (i = 0; i < count; i++) { - struct rbtimeout *to = (void *)&timeout[i]; - to->expires = 0; - to->pending = 0; - } - - return T; -} /* init() */ - - -static void add(void *ctx, struct timeout *_to, timeout_t expires) { - struct rbtimeouts *T = ctx; - struct rbtimeout *to = (void *)_to; - - if (to->pending) - LLRB_REMOVE(tree, &T->tree, to); - - to->expires = T->curtime + expires; - LLRB_INSERT(tree, &T->tree, to); - to->pending = 1; -} /* add() */ - - -static void del(void *ctx, struct timeout *_to) { - struct rbtimeouts *T = ctx; - struct rbtimeout *to = (void *)_to; - - LLRB_REMOVE(tree, &T->tree, to); - to->pending = 0; - to->expires = 0; -} /* del() */ - - -static struct timeout *get(void *ctx) { - struct rbtimeouts *T = ctx; - struct rbtimeout *to; - - if ((to = LLRB_MIN(tree, &T->tree)) && to->expires <= T->curtime) { - LLRB_REMOVE(tree, &T->tree, to); - to->pending = 0; - to->expires = 0; - - return (void *)to; - } - - return NULL; -} /* get() */ - - -static void update(void *ctx, timeout_t ts) { - struct rbtimeouts *T = ctx; - T->curtime = ts; -} /* update() */ - - -static void check(void *ctx) { - return; -} /* check() */ - - -static int empty(void *ctx) { - struct rbtimeouts *T = ctx; - - return LLRB_EMPTY(&T->tree); -} /* empty() */ - - -static void destroy(void *ctx) { - free(ctx); - return; -} /* destroy() */ - - -const struct benchops benchops = { - .init = &init, - .add = &add, - .del = &del, - .get = &get, - .update = &update, - .check = &check, - .empty = &empty, - .destroy = &destroy, -}; - diff --git a/src/tor/src/ext/timeouts/bench/bench-wheel.c b/src/tor/src/ext/timeouts/bench/bench-wheel.c deleted file mode 100644 index 0cba1af83..000000000 --- a/src/tor/src/ext/timeouts/bench/bench-wheel.c +++ /dev/null @@ -1,81 +0,0 @@ -#include - -#define TIMEOUT_PUBLIC static - -#include "timeout.h" -#include "timeout.c" -#include "bench.h" - - -static void *init(struct timeout *timeout, size_t count, int verbose) { - struct timeouts *T; - size_t i; - int error; - - T = timeouts_open(TIMEOUT_mHZ, &error); - - for (i = 0; i < count; i++) { - timeout_init(&timeout[i], 0); - } - -#if TIMEOUT_DEBUG - 0 - timeout_debug = verbose; -#endif - - return T; -} /* init() */ - - -static void add(void *T, struct timeout *to, timeout_t expires) { - timeouts_add(T, to, expires); -} /* add() */ - - -static void del(void *T, struct timeout *to) { - timeouts_del(T, to); -} /* del() */ - - -static struct timeout *get(void *T) { - return timeouts_get(T); -} /* get() */ - - -static void update(void *T, timeout_t ts) { - timeouts_update(T, ts); -} /* update() */ - - -static void (check)(void *T) { - if (!timeouts_check(T, stderr)) - _Exit(1); -} /* check() */ - - -static int empty(void *T) { - return !(timeouts_pending(T) || timeouts_expired(T)); -} /* empty() */ - - -static struct timeout *next(void *T, struct timeouts_it *it) { - return timeouts_next(T, it); -} /* next() */ - - -static void destroy(void *T) { - timeouts_close(T); -} /* destroy() */ - - -const struct benchops benchops = { - .init = &init, - .add = &add, - .del = &del, - .get = &get, - .update = &update, - .check = &check, - .empty = &empty, - .next = &next, - .destroy = &destroy -}; - diff --git a/src/tor/src/ext/timeouts/bench/bench.c b/src/tor/src/ext/timeouts/bench/bench.c deleted file mode 100644 index 0d4cee44a..000000000 --- a/src/tor/src/ext/timeouts/bench/bench.c +++ /dev/null @@ -1,293 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#if __APPLE__ -#include -#endif - -#include -#include -#include - -#include "timeout.h" -#include "bench.h" - -#if LUA_VERSION_NUM < 502 -static int lua_absindex(lua_State *L, int idx) { - return (idx > 0 || idx <= LUA_REGISTRYINDEX)? idx : lua_gettop(L) + idx + 1; -} /* lua_absindex() */ - -static void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup) { - int i, t = lua_absindex(L, -1 - nup); - - for (; l->name; l++) { - for (i = 0; i < nup; i++) - lua_pushvalue(L, -nup); - lua_pushcclosure(L, l->func, nup); - lua_setfield(L, t, l->name); - } - - lua_pop(L, nup); -} /* luaL_setfuncs() */ - -#define luaL_newlibtable(L, l) \ - lua_createtable(L, 0, (sizeof (l) / sizeof *(l)) - 1) - -#define luaL_newlib(L, l) \ - (luaL_newlibtable((L), (l)), luaL_setfuncs((L), (l), 0)) -#endif - -#ifndef MAX -#define MAX(a, b) (((a) > (b))? (a) : (b)) -#endif - - -struct bench { - const char *path; - void *solib; - size_t count; - timeout_t timeout_max; - int verbose; - - void *state; - struct timeout *timeout; - struct benchops ops; - timeout_t curtime; -}; /* struct bench */ - - -#if __APPLE__ -static mach_timebase_info_data_t timebase; -#endif - - -static int long long monotime(void) { -#if __APPLE__ - unsigned long long abt; - - abt = mach_absolute_time(); - abt = abt * timebase.numer / timebase.denom; - - return abt / 1000LL; -#else - struct timespec ts; - - clock_gettime(CLOCK_MONOTONIC, &ts); - - return (ts.tv_sec * 1000000L) + (ts.tv_nsec / 1000L); -#endif -} /* monotime() */ - - -static int bench_clock(lua_State *L) { - lua_pushnumber(L, (double)monotime() / 1000000L); - - return 1; -} /* bench_clock() */ - - -static int bench_new(lua_State *L) { - const char *path = luaL_checkstring(L, 1); - size_t count = luaL_optinteger(L, 2, 1000000); - timeout_t timeout_max = luaL_optinteger(L, 3, 300 * 1000000L); - int verbose = (lua_isnone(L, 4))? 0 : lua_toboolean(L, 4); - struct bench *B; - struct benchops *ops; - - B = lua_newuserdata(L, sizeof *B); - memset(B, 0, sizeof *B); - - luaL_getmetatable(L, "BENCH*"); - lua_setmetatable(L, -2); - - B->count = count; - B->timeout_max = timeout_max; - B->verbose = verbose; - - if (!(B->timeout = calloc(count, sizeof *B->timeout))) - return luaL_error(L, "%s", strerror(errno)); - - if (!(B->solib = dlopen(path, RTLD_NOW|RTLD_LOCAL))) - return luaL_error(L, "%s: %s", path, dlerror()); - - if (!(ops = dlsym(B->solib, "benchops"))) - return luaL_error(L, "%s: %s", path, dlerror()); - - B->ops = *ops; - B->state = B->ops.init(B->timeout, B->count, B->verbose); - - return 1; -} /* bench_new() */ - - -static int bench_add(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - unsigned i; - timeout_t t; - - i = (lua_isnoneornil(L, 2))? random() % B->count : (unsigned)luaL_checkinteger(L, 2); - t = (lua_isnoneornil(L, 3))? random() % B->timeout_max : (unsigned)luaL_checkinteger(L, 3); - - B->ops.add(B->state, &B->timeout[i], t); - - return 0; -} /* bench_add() */ - - -static int bench_del(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - size_t i = luaL_optinteger(L, 2, random() % B->count); - size_t j = luaL_optinteger(L, 3, i); - - while (i <= j && i < B->count) { - B->ops.del(B->state, &B->timeout[i]); - ++i; - } - - return 0; -} /* bench_del() */ - - -static int bench_fill(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - size_t count = luaL_optinteger(L, 2, B->count); - long timeout_inc = luaL_optinteger(L, 3, -1), timeout_max = 0, timeout; - size_t i; - - if (timeout_inc < 0) { - for (i = 0; i < count; i++) { - timeout = random() % B->timeout_max; - B->ops.add(B->state, &B->timeout[i], timeout); - timeout_max = MAX(timeout, timeout_max); - } - } else { - for (i = 0; i < count; i++) { - timeout = timeout_inc + i; - B->ops.add(B->state, &B->timeout[i], timeout_inc + i); - timeout_max = MAX(timeout, timeout_max); - } - } - - lua_pushinteger(L, (lua_Integer)count); - lua_pushinteger(L, (lua_Integer)timeout_max); - - return 2; -} /* bench_fill() */ - - -static int bench_expire(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - unsigned count = luaL_optinteger(L, 2, B->count); - unsigned step = luaL_optinteger(L, 3, 300000); - size_t i = 0; - - while (i < count && !B->ops.empty(B->state)) { - B->curtime += step; - B->ops.update(B->state, B->curtime); - - while (B->ops.get(B->state)) - i++; - } - - lua_pushinteger(L, (lua_Integer)i); - - return 1; -} /* bench_expire() */ - - -static int bench_empty(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - - lua_pushboolean(L, B->ops.empty(B->state)); - - return 1; -} /* bench_empty() */ - - -static int bench__next(lua_State *L) { - struct bench *B = lua_touserdata(L, lua_upvalueindex(1)); - struct timeouts_it *it = lua_touserdata(L, lua_upvalueindex(2)); - struct timeout *to; - - if (!B->ops.next || !(to = B->ops.next(B->state, it))) - return 0; - - lua_pushinteger(L, luaL_optinteger(L, 2, 0) + 1); - - lua_newtable(L); - lua_pushinteger(L, to->expires); - lua_setfield(L, -2, "expires"); - - return 2; -} /* bench__next() */ - -static int bench__pairs(lua_State *L) { - struct timeouts_it *it; - - lua_settop(L, 1); - - it = lua_newuserdata(L, sizeof *it); - TIMEOUTS_IT_INIT(it, TIMEOUTS_ALL); - - lua_pushcclosure(L, &bench__next, 2); - lua_pushvalue(L, 1); - lua_pushinteger(L, 0); - - return 3; -} /* bench__pairs() */ - - -static int bench__gc(lua_State *L) { - struct bench *B = lua_touserdata(L, 1); - - if (B->state) { - B->ops.destroy(B->state); - B->state = NULL; - } - - return 0; -} /* bench__gc() */ - - -static const luaL_Reg bench_methods[] = { - { "add", &bench_add }, - { "del", &bench_del }, - { "fill", &bench_fill }, - { "expire", &bench_expire }, - { "empty", &bench_empty }, - { "close", &bench__gc }, - { NULL, NULL } -}; - -static const luaL_Reg bench_metatable[] = { - { "__pairs", &bench__pairs }, - { "__gc", &bench__gc }, - { NULL, NULL } -}; - -static const luaL_Reg bench_globals[] = { - { "new", &bench_new }, - { "clock", &bench_clock }, - { NULL, NULL } -}; - -int luaopen_bench(lua_State *L) { -#if __APPLE__ - mach_timebase_info(&timebase); -#endif - - if (luaL_newmetatable(L, "BENCH*")) { - luaL_setfuncs(L, bench_metatable, 0); - luaL_newlib(L, bench_methods); - lua_setfield(L, -2, "__index"); - } - - luaL_newlib(L, bench_globals); - - return 1; -} /* luaopen_bench() */ - diff --git a/src/tor/src/ext/timeouts/bench/bench.h b/src/tor/src/ext/timeouts/bench/bench.h deleted file mode 100644 index bc1f7cf17..000000000 --- a/src/tor/src/ext/timeouts/bench/bench.h +++ /dev/null @@ -1,11 +0,0 @@ -struct benchops { - void *(*init)(struct timeout *, size_t, int); - void (*add)(void *, struct timeout *, timeout_t); - void (*del)(void *, struct timeout *); - struct timeout *(*get)(void *); - void (*update)(void *, timeout_t); - void (*check)(void *); - int (*empty)(void *); - struct timeout *(*next)(void *, struct timeouts_it *); - void (*destroy)(void *); -}; /* struct benchops() */ diff --git a/src/tor/src/ext/timeouts/bench/bench.plt b/src/tor/src/ext/timeouts/bench/bench.plt deleted file mode 100644 index 6e143c65e..000000000 --- a/src/tor/src/ext/timeouts/bench/bench.plt +++ /dev/null @@ -1,19 +0,0 @@ -set terminal postscript color - -set key top left -set xlabel "Number of timeouts" -set ylabel "Time\n(microseconds)" -#set logscale x - -set title "Time spent installing timeouts" font ",20" -plot 'heap-add.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ - 'wheel-add.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" - -set title "Time spent deleting timeouts" font ",20" -plot 'heap-del.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ - 'wheel-del.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" - -set title "Time spent expiring timeouts\n(by iteratively updating clock ~1000 times)" font ",20" -plot 'heap-expire.dat' using 1:($2*1000000) title "min-heap" with lines ls 1 lw 3 lc "red", \ - 'wheel-expire.dat' using 1:($2*1000000) title "hierarchical wheel" with lines ls 1 lw 3 lc "forest-green" - diff --git a/src/tor/src/ext/timeouts/lua/Rules.mk b/src/tor/src/ext/timeouts/lua/Rules.mk deleted file mode 100644 index 0f06fce30..000000000 --- a/src/tor/src/ext/timeouts/lua/Rules.mk +++ /dev/null @@ -1,20 +0,0 @@ -$(LUA_APIS:%=$(top_builddir)/lua/%/timeout.so): $(top_srcdir)/lua/timeout-lua.c $(top_srcdir)/timeout.h $(top_srcdir)/timeout.c - mkdir -p $(@D) - @$(SHRC); echo_cmd $(CC) -o $@ $(top_srcdir)/lua/timeout-lua.c -I$(top_srcdir) -DWHEEL_BIT=$(WHEEL_BIT) -DWHEEL_NUM=$(WHEEL_NUM) $(LUA53_CPPFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(ALL_SOFLAGS) $(ALL_LDFLAGS) $(ALL_LIBS) - -$(top_builddir)/lua/5.1/timeouts.so: $(top_builddir)/lua/5.1/timeout.so -$(top_builddir)/lua/5.2/timeouts.so: $(top_builddir)/lua/5.2/timeout.so -$(top_builddir)/lua/5.3/timeouts.so: $(top_builddir)/lua/5.3/timeout.so - -$(LUA_APIS:%=$(top_builddir)/lua/%/timeouts.so): - cd $(@D) && ln -fs timeout.so timeouts.so - -lua-5.1: $(top_builddir)/lua/5.1/timeout.so $(top_builddir)/lua/5.1/timeouts.so -lua-5.2: $(top_builddir)/lua/5.2/timeout.so $(top_builddir)/lua/5.2/timeouts.so -lua-5.3: $(top_builddir)/lua/5.3/timeout.so $(top_builddir)/lua/5.3/timeouts.so - -lua-clean: - $(RM) -r $(top_builddir)/lua/5.? - -clean: lua-clean - diff --git a/src/tor/src/ext/timeouts/lua/timeout-lua.c b/src/tor/src/ext/timeouts/lua/timeout-lua.c deleted file mode 100644 index 4d4e54cba..000000000 --- a/src/tor/src/ext/timeouts/lua/timeout-lua.c +++ /dev/null @@ -1,396 +0,0 @@ -#include -#include - -#include -#include -#include - -#if LUA_VERSION_NUM != 503 -#error only Lua 5.3 supported -#endif - -#define TIMEOUT_PUBLIC static -#include "timeout.h" -#include "timeout.c" - -#define TIMEOUT_METANAME "struct timeout" -#define TIMEOUTS_METANAME "struct timeouts*" - -static struct timeout * -to_checkudata(lua_State *L, int index) -{ - return luaL_checkudata(L, index, TIMEOUT_METANAME); -} - -static struct timeouts * -tos_checkudata(lua_State *L, int index) -{ - return *(struct timeouts **)luaL_checkudata(L, index, TIMEOUTS_METANAME); -} - -static void -tos_bind(lua_State *L, int tos_index, int to_index) -{ - lua_getuservalue(L, tos_index); - lua_pushlightuserdata(L, to_checkudata(L, to_index)); - lua_pushvalue(L, to_index); - lua_rawset(L, -3); - lua_pop(L, 1); -} - -static void -tos_unbind(lua_State *L, int tos_index, int to_index) -{ - lua_getuservalue(L, tos_index); - lua_pushlightuserdata(L, to_checkudata(L, to_index)); - lua_pushnil(L); - lua_rawset(L, -3); - lua_pop(L, 1); -} - -static int -to__index(lua_State *L) -{ - struct timeout *to = to_checkudata(L, 1); - - if (lua_type(L, 2 == LUA_TSTRING)) { - const char *key = lua_tostring(L, 2); - - if (!strcmp(key, "flags")) { - lua_pushinteger(L, to->flags); - - return 1; - } else if (!strcmp(key, "expires")) { - lua_pushinteger(L, to->expires); - - return 1; - } - } - - if (LUA_TNIL != lua_getuservalue(L, 1)) { - lua_pushvalue(L, 2); - if (LUA_TNIL != lua_rawget(L, -2)) - return 1; - } - - lua_pushvalue(L, 2); - if (LUA_TNIL != lua_rawget(L, lua_upvalueindex(1))) - return 1; - - return 0; -} - -static int -to__newindex(lua_State *L) -{ - if (LUA_TNIL == lua_getuservalue(L, 1)) { - lua_newtable(L); - lua_pushvalue(L, -1); - lua_setuservalue(L, 1); - } - - lua_pushvalue(L, 2); - lua_pushvalue(L, 3); - lua_rawset(L, -3); - - return 0; -} - -static int -to__gc(lua_State *L) -{ - struct timeout *to = to_checkudata(L, 1); - - /* - * NB: On script exit it's possible for a timeout to still be - * associated with a timeouts object, particularly when the timeouts - * object was created first. - */ - timeout_del(to); - - return 0; -} - -static int -to_new(lua_State *L) -{ - int flags = luaL_optinteger(L, 1, 0); - struct timeout *to; - - to = lua_newuserdata(L, sizeof *to); - timeout_init(to, flags); - luaL_setmetatable(L, TIMEOUT_METANAME); - - return 1; -} - -static const luaL_Reg to_methods[] = { - { NULL, NULL }, -}; - -static const luaL_Reg to_metatable[] = { - { "__index", &to__index }, - { "__newindex", &to__newindex }, - { "__gc", &to__gc }, - { NULL, NULL }, -}; - -static const luaL_Reg to_globals[] = { - { "new", &to_new }, - { NULL, NULL }, -}; - -static void -to_newmetatable(lua_State *L) -{ - if (luaL_newmetatable(L, TIMEOUT_METANAME)) { - /* - * fill metamethod table, capturing the methods table as an - * upvalue for use by __index metamethod - */ - luaL_newlib(L, to_methods); - luaL_setfuncs(L, to_metatable, 1); - } -} - -int -luaopen_timeout(lua_State *L) -{ - to_newmetatable(L); - - luaL_newlib(L, to_globals); - lua_pushinteger(L, TIMEOUT_INT); - lua_setfield(L, -2, "INT"); - lua_pushinteger(L, TIMEOUT_ABS); - lua_setfield(L, -2, "ABS"); - - return 1; -} - -static int -tos_update(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - lua_Number n = luaL_checknumber(L, 2); - - timeouts_update(T, timeouts_f2i(T, n)); - - lua_pushvalue(L, 1); - - return 1; -} - -static int -tos_step(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - lua_Number n = luaL_checknumber(L, 2); - - timeouts_step(T, timeouts_f2i(T, n)); - - lua_pushvalue(L, 1); - - return 1; -} - -static int -tos_timeout(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - - lua_pushnumber(L, timeouts_i2f(T, timeouts_timeout(T))); - - return 1; -} - -static int -tos_add(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - struct timeout *to = to_checkudata(L, 2); - lua_Number timeout = luaL_checknumber(L, 3); - - tos_bind(L, 1, 2); - timeouts_addf(T, to, timeout); - - return lua_pushvalue(L, 1), 1; -} - -static int -tos_del(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - struct timeout *to = to_checkudata(L, 2); - - timeouts_del(T, to); - tos_unbind(L, 1, 2); - - return lua_pushvalue(L, 1), 1; -} - -static int -tos_get(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - struct timeout *to; - - if (!(to = timeouts_get(T))) - return 0; - - lua_getuservalue(L, 1); - lua_rawgetp(L, -1, to); - - if (!timeout_pending(to)) - tos_unbind(L, 1, lua_absindex(L, -1)); - - return 1; -} - -static int -tos_pending(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - - lua_pushboolean(L, timeouts_pending(T)); - - return 1; -} - -static int -tos_expired(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - - lua_pushboolean(L, timeouts_expired(T)); - - return 1; -} - -static int -tos_check(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, 1); - - lua_pushboolean(L, timeouts_check(T, NULL)); - - return 1; -} - -static int -tos__next(lua_State *L) -{ - struct timeouts *T = tos_checkudata(L, lua_upvalueindex(1)); - struct timeouts_it *it = lua_touserdata(L, lua_upvalueindex(2)); - struct timeout *to; - - if (!(to = timeouts_next(T, it))) - return 0; - - lua_getuservalue(L, lua_upvalueindex(1)); - lua_rawgetp(L, -1, to); - - return 1; -} - -static int -tos_timeouts(lua_State *L) -{ - int flags = luaL_checkinteger(L, 2); - struct timeouts_it *it; - - tos_checkudata(L, 1); - lua_pushvalue(L, 1); - it = lua_newuserdata(L, sizeof *it); - TIMEOUTS_IT_INIT(it, flags); - lua_pushcclosure(L, &tos__next, 2); - - return 1; -} - -static int -tos__gc(lua_State *L) -{ - struct timeouts **tos = luaL_checkudata(L, 1, TIMEOUTS_METANAME); - struct timeout *to; - - TIMEOUTS_FOREACH(to, *tos, TIMEOUTS_ALL) { - timeouts_del(*tos, to); - } - - timeouts_close(*tos); - *tos = NULL; - - return 0; -} - -static int -tos_new(lua_State *L) -{ - timeout_t hz = luaL_optinteger(L, 1, 0); - struct timeouts **T; - int error; - - T = lua_newuserdata(L, sizeof *T); - luaL_setmetatable(L, TIMEOUTS_METANAME); - - lua_newtable(L); - lua_setuservalue(L, -2); - - if (!(*T = timeouts_open(hz, &error))) - return luaL_error(L, "%s", strerror(error)); - - return 1; -} - -static const luaL_Reg tos_methods[] = { - { "update", &tos_update }, - { "step", &tos_step }, - { "timeout", &tos_timeout }, - { "add", &tos_add }, - { "del", &tos_del }, - { "get", &tos_get }, - { "pending", &tos_pending }, - { "expired", &tos_expired }, - { "check", &tos_check }, - { "timeouts", &tos_timeouts }, - { NULL, NULL }, -}; - -static const luaL_Reg tos_metatable[] = { - { "__gc", &tos__gc }, - { NULL, NULL }, -}; - -static const luaL_Reg tos_globals[] = { - { "new", &tos_new }, - { NULL, NULL }, -}; - -static void -tos_newmetatable(lua_State *L) -{ - if (luaL_newmetatable(L, TIMEOUTS_METANAME)) { - luaL_setfuncs(L, tos_metatable, 0); - luaL_newlib(L, tos_methods); - lua_setfield(L, -2, "__index"); - } -} - -int -luaopen_timeouts(lua_State *L) -{ - to_newmetatable(L); - tos_newmetatable(L); - - luaL_newlib(L, tos_globals); - lua_pushinteger(L, TIMEOUTS_PENDING); - lua_setfield(L, -2, "PENDING"); - lua_pushinteger(L, TIMEOUTS_EXPIRED); - lua_setfield(L, -2, "EXPIRED"); - lua_pushinteger(L, TIMEOUTS_ALL); - lua_setfield(L, -2, "ALL"); - lua_pushinteger(L, TIMEOUTS_CLEAR); - lua_setfield(L, -2, "CLEAR"); - - return 1; -} diff --git a/src/tor/src/ext/timeouts/test-timeout.c b/src/tor/src/ext/timeouts/test-timeout.c deleted file mode 100644 index 807712937..000000000 --- a/src/tor/src/ext/timeouts/test-timeout.c +++ /dev/null @@ -1,530 +0,0 @@ -#include -#include -#include -#include -#include - -#include "timeout.h" - -#define THE_END_OF_TIME ((timeout_t)-1) - -static int check_misc(void) { - if (TIMEOUT_VERSION != timeout_version()) - return 1; - if (TIMEOUT_V_REL != timeout_v_rel()) - return 1; - if (TIMEOUT_V_API != timeout_v_api()) - return 1; - if (TIMEOUT_V_ABI != timeout_v_abi()) - return 1; - if (strcmp(timeout_vendor(), TIMEOUT_VENDOR)) - return 1; - return 0; -} - -static int check_open_close(timeout_t hz_set, timeout_t hz_expect) { - int err=0; - struct timeouts *tos = timeouts_open(hz_set, &err); - if (!tos) - return 1; - if (err) - return 1; - if (hz_expect != timeouts_hz(tos)) - return 1; - timeouts_close(tos); - return 0; -} - -/* Not very random */ -static timeout_t random_to(timeout_t min, timeout_t max) -{ - if (max <= min) - return min; - /* Not actually all that random, but should exercise the code. */ - timeout_t rand64 = random() * (timeout_t)INT_MAX + random(); - return min + (rand64 % (max-min)); -} - -/* configuration for check_randomized */ -struct rand_cfg { - /* When creating timeouts, smallest possible delay */ - timeout_t min_timeout; - /* When creating timeouts, largest possible delay */ - timeout_t max_timeout; - /* First time to start the clock at. */ - timeout_t start_at; - /* Do not advance the clock past this time. */ - timeout_t end_at; - /* Number of timeouts to create and monitor. */ - int n_timeouts; - /* Advance the clock by no more than this each step. */ - timeout_t max_step; - /* Use relative timers and stepping */ - int relative; - /* Every time the clock ticks, try removing this many timeouts at - * random. */ - int try_removing; - /* When we're done, advance the clock to the end of time. */ - int finalize; -}; - -static int check_randomized(const struct rand_cfg *cfg) -{ -#define FAIL() do { \ - printf("Failure on line %d\n", __LINE__); \ - goto done; \ - } while (0) - - int i, err; - int rv = 1; - struct timeout *t = calloc(cfg->n_timeouts, sizeof(struct timeout)); - timeout_t *timeouts = calloc(cfg->n_timeouts, sizeof(timeout_t)); - uint8_t *fired = calloc(cfg->n_timeouts, sizeof(uint8_t)); - uint8_t *found = calloc(cfg->n_timeouts, sizeof(uint8_t)); - uint8_t *deleted = calloc(cfg->n_timeouts, sizeof(uint8_t)); - struct timeouts *tos = timeouts_open(0, &err); - timeout_t now = cfg->start_at; - int n_added_pending = 0, cnt_added_pending = 0; - int n_added_expired = 0, cnt_added_expired = 0; - struct timeouts_it it_p, it_e, it_all; - int p_done = 0, e_done = 0, all_done = 0; - struct timeout *to = NULL; - const int rel = cfg->relative; - - if (!t || !timeouts || !tos || !fired || !found || !deleted) - FAIL(); - timeouts_update(tos, cfg->start_at); - - for (i = 0; i < cfg->n_timeouts; ++i) { - if (&t[i] != timeout_init(&t[i], rel ? 0 : TIMEOUT_ABS)) - FAIL(); - if (timeout_pending(&t[i])) - FAIL(); - if (timeout_expired(&t[i])) - FAIL(); - - timeouts[i] = random_to(cfg->min_timeout, cfg->max_timeout); - - timeouts_add(tos, &t[i], timeouts[i] - (rel ? now : 0)); - if (timeouts[i] <= cfg->start_at) { - if (timeout_pending(&t[i])) - FAIL(); - if (! timeout_expired(&t[i])) - FAIL(); - ++n_added_expired; - } else { - if (! timeout_pending(&t[i])) - FAIL(); - if (timeout_expired(&t[i])) - FAIL(); - ++n_added_pending; - } - } - - if (!!n_added_pending != timeouts_pending(tos)) - FAIL(); - if (!!n_added_expired != timeouts_expired(tos)) - FAIL(); - - /* Test foreach, interleaving a few iterators. */ - TIMEOUTS_IT_INIT(&it_p, TIMEOUTS_PENDING); - TIMEOUTS_IT_INIT(&it_e, TIMEOUTS_EXPIRED); - TIMEOUTS_IT_INIT(&it_all, TIMEOUTS_ALL); - while (! (p_done && e_done && all_done)) { - if (!p_done) { - to = timeouts_next(tos, &it_p); - if (to) { - i = to - &t[0]; - ++found[i]; - ++cnt_added_pending; - } else { - p_done = 1; - } - } - if (!e_done) { - to = timeouts_next(tos, &it_e); - if (to) { - i = to - &t[0]; - ++found[i]; - ++cnt_added_expired; - } else { - e_done = 1; - } - } - if (!all_done) { - to = timeouts_next(tos, &it_all); - if (to) { - i = to - &t[0]; - ++found[i]; - } else { - all_done = 1; - } - } - } - - for (i = 0; i < cfg->n_timeouts; ++i) { - if (found[i] != 2) - FAIL(); - } - if (cnt_added_expired != n_added_expired) - FAIL(); - if (cnt_added_pending != n_added_pending) - FAIL(); - - while (NULL != (to = timeouts_get(tos))) { - i = to - &t[0]; - assert(&t[i] == to); - if (timeouts[i] > cfg->start_at) - FAIL(); /* shouldn't have happened yet */ - - --n_added_expired; /* drop expired timeouts. */ - ++fired[i]; - } - - if (n_added_expired != 0) - FAIL(); - - while (now < cfg->end_at) { - int n_fired_this_time = 0; - timeout_t first_at = timeouts_timeout(tos) + now; - - timeout_t oldtime = now; - timeout_t step = random_to(1, cfg->max_step); - int another; - now += step; - if (rel) - timeouts_step(tos, step); - else - timeouts_update(tos, now); - - for (i = 0; i < cfg->try_removing; ++i) { - int idx = random() % cfg->n_timeouts; - if (! fired[idx]) { - timeout_del(&t[idx]); - ++deleted[idx]; - } - } - - another = (timeouts_timeout(tos) == 0); - - while (NULL != (to = timeouts_get(tos))) { - if (! another) - FAIL(); /* Thought we saw the last one! */ - i = to - &t[0]; - assert(&t[i] == to); - if (timeouts[i] > now) - FAIL(); /* shouldn't have happened yet */ - if (timeouts[i] <= oldtime) - FAIL(); /* should have happened already */ - if (timeouts[i] < first_at) - FAIL(); /* first_at should've been earlier */ - fired[i]++; - n_fired_this_time++; - another = (timeouts_timeout(tos) == 0); - } - if (n_fired_this_time && first_at > now) - FAIL(); /* first_at should've been earlier */ - if (another) - FAIL(); /* Huh? We think there are more? */ - if (!timeouts_check(tos, stderr)) - FAIL(); - } - - for (i = 0; i < cfg->n_timeouts; ++i) { - if (fired[i] > 1) - FAIL(); /* Nothing fired twice. */ - if (timeouts[i] <= now) { - if (!(fired[i] || deleted[i])) - FAIL(); - } else { - if (fired[i]) - FAIL(); - } - if (fired[i] && deleted[i]) - FAIL(); - if (cfg->finalize > 1) { - if (!fired[i]) - timeout_del(&t[i]); - } - } - - /* Now nothing more should fire between now and the end of time. */ - if (cfg->finalize) { - timeouts_update(tos, THE_END_OF_TIME); - if (cfg->finalize > 1) { - if (timeouts_get(tos)) - FAIL(); - TIMEOUTS_FOREACH(to, tos, TIMEOUTS_ALL) - FAIL(); - } - } - rv = 0; - - done: - if (tos) timeouts_close(tos); - if (t) free(t); - if (timeouts) free(timeouts); - if (fired) free(fired); - if (found) free(found); - if (deleted) free(deleted); - return rv; -} - -struct intervals_cfg { - const timeout_t *timeouts; - int n_timeouts; - timeout_t start_at; - timeout_t end_at; - timeout_t skip; -}; - -int -check_intervals(struct intervals_cfg *cfg) -{ - int i, err; - int rv = 1; - struct timeout *to; - struct timeout *t = calloc(cfg->n_timeouts, sizeof(struct timeout)); - unsigned *fired = calloc(cfg->n_timeouts, sizeof(unsigned)); - struct timeouts *tos = timeouts_open(0, &err); - - timeout_t now = cfg->start_at; - if (!t || !tos || !fired) - FAIL(); - - timeouts_update(tos, now); - - for (i = 0; i < cfg->n_timeouts; ++i) { - if (&t[i] != timeout_init(&t[i], TIMEOUT_INT)) - FAIL(); - if (timeout_pending(&t[i])) - FAIL(); - if (timeout_expired(&t[i])) - FAIL(); - - timeouts_add(tos, &t[i], cfg->timeouts[i]); - if (! timeout_pending(&t[i])) - FAIL(); - if (timeout_expired(&t[i])) - FAIL(); - } - - while (now < cfg->end_at) { - timeout_t delay = timeouts_timeout(tos); - if (cfg->skip && delay < cfg->skip) - delay = cfg->skip; - timeouts_step(tos, delay); - now += delay; - - while (NULL != (to = timeouts_get(tos))) { - i = to - &t[0]; - assert(&t[i] == to); - fired[i]++; - if (0 != (to->expires - cfg->start_at) % cfg->timeouts[i]) - FAIL(); - if (to->expires <= now) - FAIL(); - if (to->expires > now + cfg->timeouts[i]) - FAIL(); - } - if (!timeouts_check(tos, stderr)) - FAIL(); - } - - timeout_t duration = now - cfg->start_at; - for (i = 0; i < cfg->n_timeouts; ++i) { - if (cfg->skip) { - if (fired[i] > duration / cfg->timeouts[i]) - FAIL(); - } else { - if (fired[i] != duration / cfg->timeouts[i]) - FAIL(); - } - if (!timeout_pending(&t[i])) - FAIL(); - } - - rv = 0; - done: - if (t) free(t); - if (fired) free(fired); - if (tos) free(tos); - return rv; -} - -int -main(int argc, char **argv) -{ - int j; - int n_failed = 0; -#define DO(fn) do { \ - printf("."); fflush(stdout); \ - if (fn) { \ - ++n_failed; \ - printf("%s failed\n", #fn); \ - } \ - } while (0) - -#define DO_N(n, fn) do { \ - for (j = 0; j < (n); ++j) { \ - DO(fn); \ - } \ - } while (0) - - DO(check_misc()); - DO(check_open_close(1000, 1000)); - DO(check_open_close(0, TIMEOUT_mHZ)); - - struct rand_cfg cfg1 = { - .min_timeout = 1, - .max_timeout = 100, - .start_at = 5, - .end_at = 1000, - .n_timeouts = 1000, - .max_step = 10, - .relative = 0, - .try_removing = 0, - .finalize = 2, - }; - DO_N(300,check_randomized(&cfg1)); - - struct rand_cfg cfg2 = { - .min_timeout = 20, - .max_timeout = 1000, - .start_at = 10, - .end_at = 100, - .n_timeouts = 1000, - .max_step = 5, - .relative = 1, - .try_removing = 0, - .finalize = 2, - }; - DO_N(300,check_randomized(&cfg2)); - - struct rand_cfg cfg2b = { - .min_timeout = 20, - .max_timeout = 1000, - .start_at = 10, - .end_at = 100, - .n_timeouts = 1000, - .max_step = 5, - .relative = 1, - .try_removing = 0, - .finalize = 1, - }; - DO_N(300,check_randomized(&cfg2b)); - - struct rand_cfg cfg2c = { - .min_timeout = 20, - .max_timeout = 1000, - .start_at = 10, - .end_at = 100, - .n_timeouts = 1000, - .max_step = 5, - .relative = 1, - .try_removing = 0, - .finalize = 0, - }; - DO_N(300,check_randomized(&cfg2c)); - - struct rand_cfg cfg3 = { - .min_timeout = 2000, - .max_timeout = ((uint64_t)1) << 50, - .start_at = 100, - .end_at = ((uint64_t)1) << 49, - .n_timeouts = 1000, - .max_step = 1<<31, - .relative = 0, - .try_removing = 0, - .finalize = 2, - }; - DO_N(10,check_randomized(&cfg3)); - - struct rand_cfg cfg3b = { - .min_timeout = ((uint64_t)1) << 50, - .max_timeout = ((uint64_t)1) << 52, - .start_at = 100, - .end_at = ((uint64_t)1) << 53, - .n_timeouts = 1000, - .max_step = ((uint64_t)1)<<48, - .relative = 0, - .try_removing = 0, - .finalize = 2, - }; - DO_N(10,check_randomized(&cfg3b)); - - struct rand_cfg cfg4 = { - .min_timeout = 2000, - .max_timeout = ((uint64_t)1) << 30, - .start_at = 100, - .end_at = ((uint64_t)1) << 26, - .n_timeouts = 10000, - .max_step = 1<<16, - .relative = 0, - .try_removing = 3, - .finalize = 2, - }; - DO_N(10,check_randomized(&cfg4)); - - const timeout_t primes[] = { - 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53, - 59,61,67,71,73,79,83,89,97 - }; - const timeout_t factors_of_1337[] = { - 1, 7, 191, 1337 - }; - const timeout_t multiples_of_five[] = { - 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 - }; - - struct intervals_cfg icfg1 = { - .timeouts = primes, - .n_timeouts = sizeof(primes)/sizeof(timeout_t), - .start_at = 50, - .end_at = 5322, - .skip = 0, - }; - DO(check_intervals(&icfg1)); - - struct intervals_cfg icfg2 = { - .timeouts = factors_of_1337, - .n_timeouts = sizeof(factors_of_1337)/sizeof(timeout_t), - .start_at = 50, - .end_at = 50000, - .skip = 0, - }; - DO(check_intervals(&icfg2)); - - struct intervals_cfg icfg3 = { - .timeouts = multiples_of_five, - .n_timeouts = sizeof(multiples_of_five)/sizeof(timeout_t), - .start_at = 49, - .end_at = 5333, - .skip = 0, - }; - DO(check_intervals(&icfg3)); - - struct intervals_cfg icfg4 = { - .timeouts = primes, - .n_timeouts = sizeof(primes)/sizeof(timeout_t), - .start_at = 50, - .end_at = 5322, - .skip = 16, - }; - DO(check_intervals(&icfg4)); - - if (n_failed) { - puts("\nFAIL"); - } else { - puts("\nOK"); - } - return !!n_failed; -} - -/* TODO: - - * Solve PR#3. - - * Investigate whether any untaken branches are possible. - - */ diff --git a/src/tor/src/ext/timeouts/timeout-bitops.c b/src/tor/src/ext/timeouts/timeout-bitops.c deleted file mode 100644 index e99af8f9c..000000000 --- a/src/tor/src/ext/timeouts/timeout-bitops.c +++ /dev/null @@ -1,255 +0,0 @@ -#include -#include -#ifdef _MSC_VER -#include /* _BitScanForward, _BitScanReverse */ -#endif - -/* First define ctz and clz functions; these are compiler-dependent if - * you want them to be fast. */ -#if defined(__GNUC__) && !defined(TIMEOUT_DISABLE_GNUC_BITOPS) - -#ifndef LONG_BIT -#define LONG_BIT (SIZEOF_LONG*CHAR_BIT) -#endif - -/* On GCC and clang and some others, we can use __builtin functions. They - * are not defined for n==0, but timeout.s never calls them with n==0. */ - -#define ctz64(n) __builtin_ctzll(n) -#define clz64(n) __builtin_clzll(n) -#if LONG_BIT == 32 -#define ctz32(n) __builtin_ctzl(n) -#define clz32(n) __builtin_clzl(n) -#else -#define ctz32(n) __builtin_ctz(n) -#define clz32(n) __builtin_clz(n) -#endif - -#elif defined(_MSC_VER) && !defined(TIMEOUT_DISABLE_MSVC_BITOPS) - -/* On MSVC, we have these handy functions. We can ignore their return - * values, since we will never supply val == 0. */ - -static __inline int ctz32(unsigned long val) -{ - DWORD zeros = 0; - _BitScanForward(&zeros, val); - return zeros; -} -static __inline int clz32(unsigned long val) -{ - DWORD zeros = 0; - _BitScanReverse(&zeros, val); - return zeros; -} -#ifdef _WIN64 -/* According to the documentation, these only exist on Win64. */ -static __inline int ctz64(uint64_t val) -{ - DWORD zeros = 0; - _BitScanForward64(&zeros, val); - return zeros; -} -static __inline int clz64(uint64_t val) -{ - DWORD zeros = 0; - _BitScanReverse64(&zeros, val); - return zeros; -} -#else -static __inline int ctz64(uint64_t val) -{ - uint32_t lo = (uint32_t) val; - uint32_t hi = (uint32_t) (val >> 32); - return lo ? ctz32(lo) : 32 + ctz32(hi); -} -static __inline int clz64(uint64_t val) -{ - uint32_t lo = (uint32_t) val; - uint32_t hi = (uint32_t) (val >> 32); - return hi ? clz32(hi) : 32 + clz32(lo); -} -#endif - -/* End of MSVC case. */ - -#else - -/* TODO: There are more clever ways to do this in the generic case. */ - - -#define process_(one, cz_bits, bits) \ - if (x < ( one << (cz_bits - bits))) { rv += bits; x <<= bits; } - -#define process64(bits) process_((UINT64_C(1)), 64, (bits)) -static inline int clz64(uint64_t x) -{ - int rv = 0; - - process64(32); - process64(16); - process64(8); - process64(4); - process64(2); - process64(1); - return rv; -} -#define process32(bits) process_((UINT32_C(1)), 32, (bits)) -static inline int clz32(uint32_t x) -{ - int rv = 0; - - process32(16); - process32(8); - process32(4); - process32(2); - process32(1); - return rv; -} - -#undef process_ -#undef process32 -#undef process64 -#define process_(one, bits) \ - if ((x & ((one << (bits))-1)) == 0) { rv += bits; x >>= bits; } - -#define process64(bits) process_((UINT64_C(1)), bits) -static inline int ctz64(uint64_t x) -{ - int rv = 0; - - process64(32); - process64(16); - process64(8); - process64(4); - process64(2); - process64(1); - return rv; -} - -#define process32(bits) process_((UINT32_C(1)), bits) -static inline int ctz32(uint32_t x) -{ - int rv = 0; - - process32(16); - process32(8); - process32(4); - process32(2); - process32(1); - return rv; -} - -#undef process32 -#undef process64 -#undef process_ - -/* End of generic case */ - -#endif /* End of defining ctz */ - -#ifdef TEST_BITOPS -#include -#include - -static uint64_t testcases[] = { - 13371337 * 10, - 100, - 385789752, - 82574, - (((uint64_t)1)<<63) + (((uint64_t)1)<<31) + 10101 -}; - -static int -naive_clz(int bits, uint64_t v) -{ - int r = 0; - uint64_t bit = ((uint64_t)1) << (bits-1); - while (bit && 0 == (v & bit)) { - r++; - bit >>= 1; - } - /* printf("clz(%d,%lx) -> %d\n", bits, v, r); */ - return r; -} - -static int -naive_ctz(int bits, uint64_t v) -{ - int r = 0; - uint64_t bit = 1; - while (bit && 0 == (v & bit)) { - r++; - bit <<= 1; - if (r == bits) - break; - } - /* printf("ctz(%d,%lx) -> %d\n", bits, v, r); */ - return r; -} - -static int -check(uint64_t vv) -{ - uint32_t v32 = (uint32_t) vv; - - if (vv == 0) - return 1; /* c[tl]z64(0) is undefined. */ - - if (ctz64(vv) != naive_ctz(64, vv)) { - printf("mismatch with ctz64: %d\n", ctz64(vv)); - exit(1); - return 0; - } - if (clz64(vv) != naive_clz(64, vv)) { - printf("mismatch with clz64: %d\n", clz64(vv)); - exit(1); - return 0; - } - - if (v32 == 0) - return 1; /* c[lt]z(0) is undefined. */ - - if (ctz32(v32) != naive_ctz(32, v32)) { - printf("mismatch with ctz32: %d\n", ctz32(v32)); - exit(1); - return 0; - } - if (clz32(v32) != naive_clz(32, v32)) { - printf("mismatch with clz32: %d\n", clz32(v32)); - exit(1); - return 0; - } - return 1; -} - -int -main(int c, char **v) -{ - unsigned int i; - const unsigned int n = sizeof(testcases)/sizeof(testcases[0]); - int result = 0; - - for (i = 0; i <= 63; ++i) { - uint64_t x = 1; - x <<= i; - if (!check(x)) - result = 1; - --x; - if (!check(x)) - result = 1; - } - - for (i = 0; i < n; ++i) { - if (! check(testcases[i])) - result = 1; - } - if (result) { - puts("FAIL"); - } else { - puts("OK"); - } - return result; -} -#endif - diff --git a/src/tor/src/ext/timeouts/timeout-debug.h b/src/tor/src/ext/timeouts/timeout-debug.h deleted file mode 100644 index fc727a6b4..000000000 --- a/src/tor/src/ext/timeouts/timeout-debug.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * D E B U G R O U T I N E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#if TIMEOUT_DEBUG - 0 -#include -#include - -#undef TIMEOUT_DEBUG -#define TIMEOUT_DEBUG 1 -#define DEBUG_LEVEL timeout_debug - -static int timeout_debug; - -#define SAYit_(lvl, fmt, ...) do { \ - if (DEBUG_LEVEL >= (lvl)) \ - fprintf(stderr, fmt "%s", __FILE__, __LINE__, __func__, __VA_ARGS__); \ -} while (0) - -#define SAYit(lvl, ...) SAYit_((lvl), "%s:%d:%s: " __VA_ARGS__, "\n") - -#define PANIC(...) do { \ - SAYit(0, __VA_ARGS__); \ - _Exit(EXIT_FAILURE); \ -} while (0) -#else -#undef TIMEOUT_DEBUG -#define TIMEOUT_DEBUG 0 -#define DEBUG_LEVEL 0 - -#define SAYit(...) (void)0 -#endif - -#define SAY(...) SAYit(1, __VA_ARGS__) -#define HAI SAY("HAI") - - -static inline char *fmt_(char *buf, uint64_t ts, int wheel_bit, int wheel_num) { - char *p = buf; - int wheel, n, i; - - for (wheel = wheel_num - 2; wheel >= 0; wheel--) { - n = ((1 << wheel_bit) - 1) & (ts >> (wheel * WHEEL_BIT)); - - for (i = wheel_bit - 1; i >= 0; i--) { - *p++ = '0' + !!(n & (1 << i)); - } - - if (wheel != 0) - *p++ = ':'; - } - - *p = 0; - - return buf; -} /* fmt_() */ - -#define fmt(ts) fmt_(((char[((1 << WHEEL_BIT) * WHEEL_NUM) + WHEEL_NUM + 1]){ 0 }), (ts), WHEEL_BIT, WHEEL_NUM) - - -static inline char *bin64_(char *buf, uint64_t n, int wheel_bit) { - char *p = buf; - int i; - - for (i = 0; i < (1 << wheel_bit); i++) { - *p++ = "01"[0x1 & (n >> (((1 << wheel_bit) - 1) - i))]; - } - - *p = 0; - - return buf; -} /* bin64_() */ - -#define bin64(ts) bin64_(((char[((1 << WHEEL_BIT) * WHEEL_NUM) + 1]){ 0 }), (ts), WHEEL_BIT) - - diff --git a/src/tor/src/ext/timeouts/timeout.c b/src/tor/src/ext/timeouts/timeout.c deleted file mode 100644 index 713ec219c..000000000 --- a/src/tor/src/ext/timeouts/timeout.c +++ /dev/null @@ -1,754 +0,0 @@ -/* ========================================================================== - * timeout.c - Tickless hierarchical timing wheel. - * -------------------------------------------------------------------------- - * Copyright (c) 2013, 2014 William Ahern - * - * 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. - * ========================================================================== - */ -#ifdef HAVE_CONFIG_H -#include "orconfig.h" -#endif -#include /* CHAR_BIT */ - -#include /* NULL */ -#include /* malloc(3) free(3) */ -#include /* FILE fprintf(3) */ - -#include /* UINT64_C uint64_t */ - -#include /* memset(3) */ - -#include /* errno */ - -#include "tor_queue.h" /* TAILQ(3) */ - -#include "timeout.h" - -#ifndef TIMEOUT_DEBUG -#define TIMEOUT_DEBUG 0 -#endif - -#if TIMEOUT_DEBUG - 0 -#include "timeout-debug.h" -#endif - -#ifdef TIMEOUT_DISABLE_RELATIVE_ACCESS -#define TO_SET_TIMEOUTS(to, T) ((void)0) -#else -#define TO_SET_TIMEOUTS(to, T) ((to)->timeouts = (T)) -#endif - -/* - * A N C I L L A R Y R O U T I N E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#define abstime_t timeout_t /* for documentation purposes */ -#define reltime_t timeout_t /* "" */ - -#if !defined countof -#define countof(a) (sizeof (a) / sizeof *(a)) -#endif - -#if !defined endof -#define endof(a) (&(a)[countof(a)]) -#endif - -#if !defined MIN -#define MIN(a, b) (((a) < (b))? (a) : (b)) -#endif - -#if !defined MAX -#define MAX(a, b) (((a) > (b))? (a) : (b)) -#endif - -#if !defined TOR_TAILQ_CONCAT -#define TOR_TAILQ_CONCAT(head1, head2, field) do { \ - if (!TOR_TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TOR_TAILQ_INIT((head2)); \ - } \ -} while (0) -#endif - -#if !defined TOR_TAILQ_FOREACH_SAFE -#define TOR_TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TOR_TAILQ_FIRST(head); \ - (var) && ((tvar) = TOR_TAILQ_NEXT(var, field), 1); \ - (var) = (tvar)) -#endif - - -/* - * B I T M A N I P U L A T I O N R O U T I N E S - * - * The macros and routines below implement wheel parameterization. The - * inputs are: - * - * WHEEL_BIT - The number of value bits mapped in each wheel. The - * lowest-order WHEEL_BIT bits index the lowest-order (highest - * resolution) wheel, the next group of WHEEL_BIT bits the - * higher wheel, etc. - * - * WHEEL_NUM - The number of wheels. WHEEL_BIT * WHEEL_NUM = the number of - * value bits used by all the wheels. For the default of 6 and - * 4, only the low 24 bits are processed. Any timeout value - * larger than this will cycle through again. - * - * The implementation uses bit fields to remember which slot in each wheel - * is populated, and to generate masks of expiring slots according to the - * current update interval (i.e. the "tickless" aspect). The slots to - * process in a wheel are (populated-set & interval-mask). - * - * WHEEL_BIT cannot be larger than 6 bits because 2^6 -> 64 is the largest - * number of slots which can be tracked in a uint64_t integer bit field. - * WHEEL_BIT cannot be smaller than 3 bits because of our rotr and rotl - * routines, which only operate on all the value bits in an integer, and - * there's no integer smaller than uint8_t. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#if !defined WHEEL_BIT -#define WHEEL_BIT 6 -#endif - -#if !defined WHEEL_NUM -#define WHEEL_NUM 4 -#endif - -#define WHEEL_LEN (1U << WHEEL_BIT) -#define WHEEL_MAX (WHEEL_LEN - 1) -#define WHEEL_MASK (WHEEL_LEN - 1) -#define TIMEOUT_MAX ((TIMEOUT_C(1) << (WHEEL_BIT * WHEEL_NUM)) - 1) - -#include "timeout-bitops.c" - -#if WHEEL_BIT == 6 -#define ctz(n) ctz64(n) -#define clz(n) clz64(n) -#define fls(n) ((int)(64 - clz64(n))) -#else -#define ctz(n) ctz32(n) -#define clz(n) clz32(n) -#define fls(n) ((int)(32 - clz32(n))) -#endif - -#if WHEEL_BIT == 6 -#define WHEEL_C(n) UINT64_C(n) -#define WHEEL_PRIu PRIu64 -#define WHEEL_PRIx PRIx64 - -typedef uint64_t wheel_t; - -#elif WHEEL_BIT == 5 - -#define WHEEL_C(n) UINT32_C(n) -#define WHEEL_PRIu PRIu32 -#define WHEEL_PRIx PRIx32 - -typedef uint32_t wheel_t; - -#elif WHEEL_BIT == 4 - -#define WHEEL_C(n) UINT16_C(n) -#define WHEEL_PRIu PRIu16 -#define WHEEL_PRIx PRIx16 - -typedef uint16_t wheel_t; - -#elif WHEEL_BIT == 3 - -#define WHEEL_C(n) UINT8_C(n) -#define WHEEL_PRIu PRIu8 -#define WHEEL_PRIx PRIx8 - -typedef uint8_t wheel_t; - -#else -#error invalid WHEEL_BIT value -#endif - - -static inline wheel_t rotl(const wheel_t v, int c) { - if (!(c &= (sizeof v * CHAR_BIT - 1))) - return v; - - return (v << c) | (v >> (sizeof v * CHAR_BIT - c)); -} /* rotl() */ - - -static inline wheel_t rotr(const wheel_t v, int c) { - if (!(c &= (sizeof v * CHAR_BIT - 1))) - return v; - - return (v >> c) | (v << (sizeof v * CHAR_BIT - c)); -} /* rotr() */ - - -/* - * T I M E R R O U T I N E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -TOR_TAILQ_HEAD(timeout_list, timeout); - -struct timeouts { - struct timeout_list wheel[WHEEL_NUM][WHEEL_LEN], expired; - - wheel_t pending[WHEEL_NUM]; - - timeout_t curtime; - timeout_t hertz; -}; /* struct timeouts */ - - -static struct timeouts *timeouts_init(struct timeouts *T, timeout_t hz) { - unsigned i, j; - - for (i = 0; i < countof(T->wheel); i++) { - for (j = 0; j < countof(T->wheel[i]); j++) { - TOR_TAILQ_INIT(&T->wheel[i][j]); - } - } - - TOR_TAILQ_INIT(&T->expired); - - for (i = 0; i < countof(T->pending); i++) { - T->pending[i] = 0; - } - - T->curtime = 0; - T->hertz = (hz)? hz : TIMEOUT_mHZ; - - return T; -} /* timeouts_init() */ - - -TIMEOUT_PUBLIC struct timeouts *timeouts_open(timeout_t hz, int *error) { - struct timeouts *T; - - if ((T = malloc(sizeof *T))) - return timeouts_init(T, hz); - - *error = errno; - - return NULL; -} /* timeouts_open() */ - - -static void timeouts_reset(struct timeouts *T) { - struct timeout_list reset; - struct timeout *to; - unsigned i, j; - - TOR_TAILQ_INIT(&reset); - - for (i = 0; i < countof(T->wheel); i++) { - for (j = 0; j < countof(T->wheel[i]); j++) { - TOR_TAILQ_CONCAT(&reset, &T->wheel[i][j], tqe); - } - } - - TOR_TAILQ_CONCAT(&reset, &T->expired, tqe); - - TOR_TAILQ_FOREACH(to, &reset, tqe) { - to->pending = NULL; - TO_SET_TIMEOUTS(to, NULL); - } -} /* timeouts_reset() */ - - -TIMEOUT_PUBLIC void timeouts_close(struct timeouts *T) { - /* - * NOTE: Delete installed timeouts so timeout_pending() and - * timeout_expired() worked as expected. - */ - timeouts_reset(T); - - free(T); -} /* timeouts_close() */ - - -TIMEOUT_PUBLIC timeout_t timeouts_hz(struct timeouts *T) { - return T->hertz; -} /* timeouts_hz() */ - - -TIMEOUT_PUBLIC void timeouts_del(struct timeouts *T, struct timeout *to) { - if (to->pending) { - TOR_TAILQ_REMOVE(to->pending, to, tqe); - - if (to->pending != &T->expired && TOR_TAILQ_EMPTY(to->pending)) { - ptrdiff_t index_ = to->pending - &T->wheel[0][0]; - int wheel = (int) (index_ / WHEEL_LEN); - int slot = index_ % WHEEL_LEN; - - T->pending[wheel] &= ~(WHEEL_C(1) << slot); - } - - to->pending = NULL; - TO_SET_TIMEOUTS(to, NULL); - } -} /* timeouts_del() */ - - -static inline reltime_t timeout_rem(struct timeouts *T, struct timeout *to) { - return to->expires - T->curtime; -} /* timeout_rem() */ - - -static inline int timeout_wheel(timeout_t timeout) { - /* must be called with timeout != 0, so fls input is nonzero */ - return (fls(MIN(timeout, TIMEOUT_MAX)) - 1) / WHEEL_BIT; -} /* timeout_wheel() */ - - -static inline int timeout_slot(int wheel, timeout_t expires) { - return WHEEL_MASK & ((expires >> (wheel * WHEEL_BIT)) - !!wheel); -} /* timeout_slot() */ - - -static void timeouts_sched(struct timeouts *T, struct timeout *to, timeout_t expires) { - timeout_t rem; - int wheel, slot; - - timeouts_del(T, to); - - to->expires = expires; - - TO_SET_TIMEOUTS(to, T); - - if (expires > T->curtime) { - rem = timeout_rem(T, to); - - /* rem is nonzero since: - * rem == timeout_rem(T,to), - * == to->expires - T->curtime - * and above we have expires > T->curtime. - */ - wheel = timeout_wheel(rem); - slot = timeout_slot(wheel, to->expires); - - to->pending = &T->wheel[wheel][slot]; - TOR_TAILQ_INSERT_TAIL(to->pending, to, tqe); - - T->pending[wheel] |= WHEEL_C(1) << slot; - } else { - to->pending = &T->expired; - TOR_TAILQ_INSERT_TAIL(to->pending, to, tqe); - } -} /* timeouts_sched() */ - - -#ifndef TIMEOUT_DISABLE_INTERVALS -static void timeouts_readd(struct timeouts *T, struct timeout *to) { - to->expires += to->interval; - - if (to->expires <= T->curtime) { - /* If we've missed the next firing of this timeout, reschedule - * it to occur at the next multiple of its interval after - * the last time that it fired. - */ - timeout_t n = T->curtime - to->expires; - timeout_t r = n % to->interval; - to->expires = T->curtime + (to->interval - r); - } - - timeouts_sched(T, to, to->expires); -} /* timeouts_readd() */ -#endif - - -TIMEOUT_PUBLIC void timeouts_add(struct timeouts *T, struct timeout *to, timeout_t timeout) { -#ifndef TIMEOUT_DISABLE_INTERVALS - if (to->flags & TIMEOUT_INT) - to->interval = MAX(1, timeout); -#endif - - if (to->flags & TIMEOUT_ABS) - timeouts_sched(T, to, timeout); - else - timeouts_sched(T, to, T->curtime + timeout); -} /* timeouts_add() */ - - -TIMEOUT_PUBLIC void timeouts_update(struct timeouts *T, abstime_t curtime) { - timeout_t elapsed = curtime - T->curtime; - struct timeout_list todo; - int wheel; - - TOR_TAILQ_INIT(&todo); - - /* - * There's no avoiding looping over every wheel. It's best to keep - * WHEEL_NUM smallish. - */ - for (wheel = 0; wheel < WHEEL_NUM; wheel++) { - wheel_t pending; - - /* - * Calculate the slots expiring in this wheel - * - * If the elapsed time is greater than the maximum period of - * the wheel, mark every position as expiring. - * - * Otherwise, to determine the expired slots fill in all the - * bits between the last slot processed and the current - * slot, inclusive of the last slot. We'll bitwise-AND this - * with our pending set below. - * - * If a wheel rolls over, force a tick of the next higher - * wheel. - */ - if ((elapsed >> (wheel * WHEEL_BIT)) > WHEEL_MAX) { - pending = (wheel_t)~WHEEL_C(0); - } else { - wheel_t _elapsed = WHEEL_MASK & (elapsed >> (wheel * WHEEL_BIT)); - int oslot, nslot; - - /* - * TODO: It's likely that at least one of the - * following three bit fill operations is redundant - * or can be replaced with a simpler operation. - */ - oslot = WHEEL_MASK & (T->curtime >> (wheel * WHEEL_BIT)); - pending = rotl(((UINT64_C(1) << _elapsed) - 1), oslot); - - nslot = WHEEL_MASK & (curtime >> (wheel * WHEEL_BIT)); - pending |= rotr(rotl(((WHEEL_C(1) << _elapsed) - 1), nslot), (int)_elapsed); - pending |= WHEEL_C(1) << nslot; - } - - while (pending & T->pending[wheel]) { - /* ctz input cannot be zero: loop condition. */ - int slot = ctz(pending & T->pending[wheel]); - TOR_TAILQ_CONCAT(&todo, &T->wheel[wheel][slot], tqe); - T->pending[wheel] &= ~(UINT64_C(1) << slot); - } - - if (!(0x1 & pending)) - break; /* break if we didn't wrap around end of wheel */ - - /* if we're continuing, the next wheel must tick at least once */ - elapsed = MAX(elapsed, (WHEEL_LEN << (wheel * WHEEL_BIT))); - } - - T->curtime = curtime; - - while (!TOR_TAILQ_EMPTY(&todo)) { - struct timeout *to = TOR_TAILQ_FIRST(&todo); - - TOR_TAILQ_REMOVE(&todo, to, tqe); - to->pending = NULL; - - timeouts_sched(T, to, to->expires); - } - - return; -} /* timeouts_update() */ - -TIMEOUT_PUBLIC timeout_t timeouts_get_curtime(struct timeouts *T) { - return T->curtime; -} /* timeouts_get_curtime() */ - -TIMEOUT_PUBLIC void timeouts_step(struct timeouts *T, reltime_t elapsed) { - timeouts_update(T, T->curtime + elapsed); -} /* timeouts_step() */ - - -TIMEOUT_PUBLIC bool timeouts_pending(struct timeouts *T) { - wheel_t pending = 0; - int wheel; - - for (wheel = 0; wheel < WHEEL_NUM; wheel++) { - pending |= T->pending[wheel]; - } - - return !!pending; -} /* timeouts_pending() */ - - -TIMEOUT_PUBLIC bool timeouts_expired(struct timeouts *T) { - return !TOR_TAILQ_EMPTY(&T->expired); -} /* timeouts_expired() */ - - -/* - * Calculate the interval before needing to process any timeouts pending on - * any wheel. - * - * (This is separated from the public API routine so we can evaluate our - * wheel invariant assertions irrespective of the expired queue.) - * - * This might return a timeout value sooner than any installed timeout if - * only higher-order wheels have timeouts pending. We can only know when to - * process a wheel, not precisely when a timeout is scheduled. Our timeout - * accuracy could be off by 2^(N*M)-1 units where N is the wheel number and - * M is WHEEL_BIT. Only timeouts which have fallen through to wheel 0 can be - * known exactly. - * - * We should never return a timeout larger than the lowest actual timeout. - */ -static timeout_t timeouts_int(struct timeouts *T) { - timeout_t timeout = ~TIMEOUT_C(0), _timeout; - timeout_t relmask; - int wheel, slot; - - relmask = 0; - - for (wheel = 0; wheel < WHEEL_NUM; wheel++) { - if (T->pending[wheel]) { - slot = WHEEL_MASK & (T->curtime >> (wheel * WHEEL_BIT)); - - /* ctz input cannot be zero: T->pending[wheel] is - * nonzero, so rotr() is nonzero. */ - _timeout = (ctz(rotr(T->pending[wheel], slot)) + !!wheel) << (wheel * WHEEL_BIT); - /* +1 to higher order wheels as those timeouts are one rotation in the future (otherwise they'd be on a lower wheel or expired) */ - - _timeout -= relmask & T->curtime; - /* reduce by how much lower wheels have progressed */ - - timeout = MIN(_timeout, timeout); - } - - relmask <<= WHEEL_BIT; - relmask |= WHEEL_MASK; - } - - return timeout; -} /* timeouts_int() */ - - -/* - * Calculate the interval our caller can wait before needing to process - * events. - */ -TIMEOUT_PUBLIC timeout_t timeouts_timeout(struct timeouts *T) { - if (!TOR_TAILQ_EMPTY(&T->expired)) - return 0; - - return timeouts_int(T); -} /* timeouts_timeout() */ - - -TIMEOUT_PUBLIC struct timeout *timeouts_get(struct timeouts *T) { - if (!TOR_TAILQ_EMPTY(&T->expired)) { - struct timeout *to = TOR_TAILQ_FIRST(&T->expired); - - TOR_TAILQ_REMOVE(&T->expired, to, tqe); - to->pending = NULL; - TO_SET_TIMEOUTS(to, NULL); - -#ifndef TIMEOUT_DISABLE_INTERVALS - if ((to->flags & TIMEOUT_INT) && to->interval > 0) - timeouts_readd(T, to); -#endif - - return to; - } else { - return 0; - } -} /* timeouts_get() */ - - -/* - * Use dumb looping to locate the earliest timeout pending on the wheel so - * our invariant assertions can check the result of our optimized code. - */ -static struct timeout *timeouts_min(struct timeouts *T) { - struct timeout *to, *min = NULL; - unsigned i, j; - - for (i = 0; i < countof(T->wheel); i++) { - for (j = 0; j < countof(T->wheel[i]); j++) { - TOR_TAILQ_FOREACH(to, &T->wheel[i][j], tqe) { - if (!min || to->expires < min->expires) - min = to; - } - } - } - - return min; -} /* timeouts_min() */ - - -/* - * Check some basic algorithm invariants. If these invariants fail then - * something is definitely broken. - */ -#define report(...) do { \ - if ((fp)) \ - fprintf(fp, __VA_ARGS__); \ -} while (0) - -#define check(expr, ...) do { \ - if (!(expr)) { \ - report(__VA_ARGS__); \ - return 0; \ - } \ -} while (0) - -TIMEOUT_PUBLIC bool timeouts_check(struct timeouts *T, FILE *fp) { - timeout_t timeout; - struct timeout *to; - - if ((to = timeouts_min(T))) { - check(to->expires > T->curtime, "missed timeout (expires:%" TIMEOUT_PRIu " <= curtime:%" TIMEOUT_PRIu ")\n", to->expires, T->curtime); - - timeout = timeouts_int(T); - check(timeout <= to->expires - T->curtime, "wrong soft timeout (soft:%" TIMEOUT_PRIu " > hard:%" TIMEOUT_PRIu ") (expires:%" TIMEOUT_PRIu "; curtime:%" TIMEOUT_PRIu ")\n", timeout, (to->expires - T->curtime), to->expires, T->curtime); - - timeout = timeouts_timeout(T); - check(timeout <= to->expires - T->curtime, "wrong soft timeout (soft:%" TIMEOUT_PRIu " > hard:%" TIMEOUT_PRIu ") (expires:%" TIMEOUT_PRIu "; curtime:%" TIMEOUT_PRIu ")\n", timeout, (to->expires - T->curtime), to->expires, T->curtime); - } else { - timeout = timeouts_timeout(T); - - if (!TOR_TAILQ_EMPTY(&T->expired)) - check(timeout == 0, "wrong soft timeout (soft:%" TIMEOUT_PRIu " != hard:%" TIMEOUT_PRIu ")\n", timeout, TIMEOUT_C(0)); - else - check(timeout == ~TIMEOUT_C(0), "wrong soft timeout (soft:%" TIMEOUT_PRIu " != hard:%" TIMEOUT_PRIu ")\n", timeout, ~TIMEOUT_C(0)); - } - - return 1; -} /* timeouts_check() */ - - -#define ENTER \ - do { \ - static const int pc0 = __LINE__; \ - switch (pc0 + it->pc) { \ - case __LINE__: (void)0 - -#define SAVE_AND_DO(do_statement) \ - do { \ - it->pc = __LINE__ - pc0; \ - do_statement; \ - case __LINE__: (void)0; \ - } while (0) - -#define YIELD(rv) \ - SAVE_AND_DO(return (rv)) - -#define LEAVE \ - SAVE_AND_DO(break); \ - } \ - } while (0) - -TIMEOUT_PUBLIC struct timeout *timeouts_next(struct timeouts *T, struct timeouts_it *it) { - struct timeout *to; - - ENTER; - - if (it->flags & TIMEOUTS_EXPIRED) { - if (it->flags & TIMEOUTS_CLEAR) { - while ((to = timeouts_get(T))) { - YIELD(to); - } - } else { - TOR_TAILQ_FOREACH_SAFE(to, &T->expired, tqe, it->to) { - YIELD(to); - } - } - } - - if (it->flags & TIMEOUTS_PENDING) { - for (it->i = 0; it->i < countof(T->wheel); it->i++) { - for (it->j = 0; it->j < countof(T->wheel[it->i]); it->j++) { - TOR_TAILQ_FOREACH_SAFE(to, &T->wheel[it->i][it->j], tqe, it->to) { - YIELD(to); - } - } - } - } - - LEAVE; - - return NULL; -} /* timeouts_next */ - -#undef LEAVE -#undef YIELD -#undef SAVE_AND_DO -#undef ENTER - - -/* - * T I M E O U T R O U T I N E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -TIMEOUT_PUBLIC struct timeout *timeout_init(struct timeout *to, int flags) { - memset(to, 0, sizeof *to); - - to->flags = flags; - - return to; -} /* timeout_init() */ - - -#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS -TIMEOUT_PUBLIC bool timeout_pending(struct timeout *to) { - return to->pending && to->pending != &to->timeouts->expired; -} /* timeout_pending() */ - - -TIMEOUT_PUBLIC bool timeout_expired(struct timeout *to) { - return to->pending && to->pending == &to->timeouts->expired; -} /* timeout_expired() */ - - -TIMEOUT_PUBLIC void timeout_del(struct timeout *to) { - timeouts_del(to->timeouts, to); -} /* timeout_del() */ -#endif - - -/* - * V E R S I O N I N T E R F A C E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -TIMEOUT_PUBLIC int timeout_version(void) { - return TIMEOUT_VERSION; -} /* timeout_version() */ - - -TIMEOUT_PUBLIC const char *timeout_vendor(void) { - return TIMEOUT_VENDOR; -} /* timeout_version() */ - - -TIMEOUT_PUBLIC int timeout_v_rel(void) { - return TIMEOUT_V_REL; -} /* timeout_version() */ - - -TIMEOUT_PUBLIC int timeout_v_abi(void) { - return TIMEOUT_V_ABI; -} /* timeout_version() */ - - -TIMEOUT_PUBLIC int timeout_v_api(void) { - return TIMEOUT_V_API; -} /* timeout_version() */ - diff --git a/src/tor/src/ext/timeouts/timeout.h b/src/tor/src/ext/timeouts/timeout.h deleted file mode 100644 index b35874e15..000000000 --- a/src/tor/src/ext/timeouts/timeout.h +++ /dev/null @@ -1,256 +0,0 @@ -/* ========================================================================== - * timeout.h - Tickless hierarchical timing wheel. - * -------------------------------------------------------------------------- - * Copyright (c) 2013, 2014 William Ahern - * - * 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. - * ========================================================================== - */ -#ifndef TIMEOUT_H -#define TIMEOUT_H - -#include /* bool */ -#include /* FILE */ - -#include /* PRIu64 PRIx64 PRIX64 uint64_t */ - -#include "tor_queue.h" /* TAILQ(3) */ - - -/* - * V E R S I O N I N T E R F A C E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#if !defined TIMEOUT_PUBLIC -#define TIMEOUT_PUBLIC -#endif - -#define TIMEOUT_VERSION TIMEOUT_V_REL -#define TIMEOUT_VENDOR "william@25thandClement.com" - -#define TIMEOUT_V_REL 0x20160226 -#define TIMEOUT_V_ABI 0x20160224 -#define TIMEOUT_V_API 0x20160226 - -TIMEOUT_PUBLIC int timeout_version(void); - -TIMEOUT_PUBLIC const char *timeout_vendor(void); - -TIMEOUT_PUBLIC int timeout_v_rel(void); - -TIMEOUT_PUBLIC int timeout_v_abi(void); - -TIMEOUT_PUBLIC int timeout_v_api(void); - - -/* - * I N T E G E R T Y P E I N T E R F A C E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#define TIMEOUT_C(n) UINT64_C(n) -#define TIMEOUT_PRIu PRIu64 -#define TIMEOUT_PRIx PRIx64 -#define TIMEOUT_PRIX PRIX64 - -#define TIMEOUT_mHZ TIMEOUT_C(1000) -#define TIMEOUT_uHZ TIMEOUT_C(1000000) -#define TIMEOUT_nHZ TIMEOUT_C(1000000000) - -typedef uint64_t timeout_t; - -#define timeout_error_t int /* for documentation purposes */ - - -/* - * C A L L B A C K I N T E R F A C E - * - * Callback function parameters unspecified to make embedding into existing - * applications easier. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef TIMEOUT_CB_OVERRIDE -struct timeout_cb { - void (*fn)(void); - void *arg; -}; /* struct timeout_cb */ -#endif - -/* - * T I M E O U T I N T E R F A C E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef TIMEOUT_DISABLE_INTERVALS -#define TIMEOUT_INT 0x01 /* interval (repeating) timeout */ -#endif -#define TIMEOUT_ABS 0x02 /* treat timeout values as absolute */ - -#define TIMEOUT_INITIALIZER(flags) { (flags) } - -#define timeout_setcb(to, fn, arg) do { \ - (to)->callback.fn = (fn); \ - (to)->callback.arg = (arg); \ -} while (0) - -struct timeout { - int flags; - - timeout_t expires; - /* absolute expiration time */ - - struct timeout_list *pending; - /* timeout list if pending on wheel or expiry queue */ - - TOR_TAILQ_ENTRY(timeout) tqe; - /* entry member for struct timeout_list lists */ - -#ifndef TIMEOUT_DISABLE_CALLBACKS - struct timeout_cb callback; - /* optional callback information */ -#endif - -#ifndef TIMEOUT_DISABLE_INTERVALS - timeout_t interval; - /* timeout interval if periodic */ -#endif - -#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS - struct timeouts *timeouts; - /* timeouts collection if member of */ -#endif -}; /* struct timeout */ - - -TIMEOUT_PUBLIC struct timeout *timeout_init(struct timeout *, int); -/* initialize timeout structure (same as TIMEOUT_INITIALIZER) */ - -#ifndef TIMEOUT_DISABLE_RELATIVE_ACCESS -TIMEOUT_PUBLIC bool timeout_pending(struct timeout *); -/* true if on timing wheel, false otherwise */ - -TIMEOUT_PUBLIC bool timeout_expired(struct timeout *); -/* true if on expired queue, false otherwise */ - -TIMEOUT_PUBLIC void timeout_del(struct timeout *); -/* remove timeout from any timing wheel (okay if not member of any) */ -#endif - -/* - * T I M I N G W H E E L I N T E R F A C E S - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -struct timeouts; - -TIMEOUT_PUBLIC struct timeouts *timeouts_open(timeout_t, timeout_error_t *); -/* open a new timing wheel, setting optional HZ (for float conversions) */ - -TIMEOUT_PUBLIC void timeouts_close(struct timeouts *); -/* destroy timing wheel */ - -TIMEOUT_PUBLIC timeout_t timeouts_hz(struct timeouts *); -/* return HZ setting (for float conversions) */ - -TIMEOUT_PUBLIC void timeouts_update(struct timeouts *, timeout_t); -/* update timing wheel with current absolute time */ - -TIMEOUT_PUBLIC void timeouts_step(struct timeouts *, timeout_t); -/* step timing wheel by relative time */ - -TIMEOUT_PUBLIC timeout_t timeouts_get_curtime(struct timeouts *); -/* Return the current tick. */ - -TIMEOUT_PUBLIC timeout_t timeouts_timeout(struct timeouts *); -/* return interval to next required update */ - -TIMEOUT_PUBLIC void timeouts_add(struct timeouts *, struct timeout *, timeout_t); -/* add timeout to timing wheel */ - -TIMEOUT_PUBLIC void timeouts_del(struct timeouts *, struct timeout *); -/* remove timeout from any timing wheel or expired queue (okay if on neither) */ - -TIMEOUT_PUBLIC struct timeout *timeouts_get(struct timeouts *); -/* return any expired timeout (caller should loop until NULL-return) */ - -TIMEOUT_PUBLIC bool timeouts_pending(struct timeouts *); -/* return true if any timeouts pending on timing wheel */ - -TIMEOUT_PUBLIC bool timeouts_expired(struct timeouts *); -/* return true if any timeouts on expired queue */ - -TIMEOUT_PUBLIC bool timeouts_check(struct timeouts *, FILE *); -/* return true if invariants hold. describes failures to optional file handle. */ - -#define TIMEOUTS_PENDING 0x10 -#define TIMEOUTS_EXPIRED 0x20 -#define TIMEOUTS_ALL (TIMEOUTS_PENDING|TIMEOUTS_EXPIRED) -#define TIMEOUTS_CLEAR 0x40 - -#define TIMEOUTS_IT_INITIALIZER(flags) { (flags), 0, 0, 0, 0 } - -#define TIMEOUTS_IT_INIT(cur, _flags) do { \ - (cur)->flags = (_flags); \ - (cur)->pc = 0; \ -} while (0) - -struct timeouts_it { - int flags; - unsigned pc, i, j; - struct timeout *to; -}; /* struct timeouts_it */ - -TIMEOUT_PUBLIC struct timeout *timeouts_next(struct timeouts *, struct timeouts_it *); -/* return next timeout in pending wheel or expired queue. caller can delete - * the returned timeout, but should not otherwise manipulate the timing - * wheel. in particular, caller SHOULD NOT delete any other timeout as that - * could invalidate cursor state and trigger a use-after-free. - */ - -#define TIMEOUTS_FOREACH(var, T, flags) \ - struct timeouts_it _it = TIMEOUTS_IT_INITIALIZER((flags)); \ - while (((var) = timeouts_next((T), &_it))) - - -/* - * B O N U S W H E E L I N T E R F A C E S - * - * I usually use floating point timeouts in all my code, but it's cleaner to - * separate it to keep the core algorithmic code simple. - * - * Using macros instead of static inline routines where routines - * might be used to keep -lm linking optional. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include /* ceil(3) */ - -#define timeouts_f2i(T, f) \ - ((timeout_t)ceil((f) * timeouts_hz((T)))) /* prefer late expiration over early */ - -#define timeouts_i2f(T, i) \ - ((double)(i) / timeouts_hz((T))) - -#define timeouts_addf(T, to, timeout) \ - timeouts_add((T), (to), timeouts_f2i((T), (timeout))) - -#endif /* TIMEOUT_H */ diff --git a/src/tor/src/ext/tinytest.c b/src/tor/src/ext/tinytest.c deleted file mode 100644 index 3fb1b39c7..000000000 --- a/src/tor/src/ext/tinytest.c +++ /dev/null @@ -1,501 +0,0 @@ -/* tinytest.c -- Copyright 2009-2012 Nick Mathewson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ -#ifdef TINYTEST_LOCAL -#include "tinytest_local.h" -#endif - -#include -#include -#include -#include - -#ifndef NO_FORKING - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - -#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) -#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \ - __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) -/* Workaround for a stupid bug in OSX 10.6 */ -#define FORK_BREAKS_GCOV -#include -#endif -#endif - -#endif /* !NO_FORKING */ - -#ifndef __GNUC__ -#define __attribute__(x) -#endif - -#include "tinytest.h" -#include "tinytest_macros.h" - -#define LONGEST_TEST_NAME 16384 - -static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/ -static int n_ok = 0; /**< Number of tests that have passed */ -static int n_bad = 0; /**< Number of tests that have failed. */ -static int n_skipped = 0; /**< Number of tests that have been skipped. */ - -static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/ -static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */ -static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */ -static const char *verbosity_flag = ""; - -static const struct testlist_alias_t *cfg_aliases=NULL; - -enum outcome { SKIP=2, OK=1, FAIL=0 }; -static enum outcome cur_test_outcome = 0; -/** prefix of the current test group */ -static const char *cur_test_prefix = NULL; -/** Name of the current test, if we haven't logged is yet. Used for --quiet */ -static const char *cur_test_name = NULL; - -#ifdef _WIN32 -/* Copy of argv[0] for win32. */ -static char commandname[MAX_PATH+1]; -#endif - -static void usage(struct testgroup_t *groups, int list_groups) - __attribute__((noreturn)); -static int process_test_option(struct testgroup_t *groups, const char *test); - -static enum outcome -testcase_run_bare_(const struct testcase_t *testcase) -{ - void *env = NULL; - int outcome; - if (testcase->setup) { - env = testcase->setup->setup_fn(testcase); - if (!env) - return FAIL; - else if (env == (void*)TT_SKIP) - return SKIP; - } - - cur_test_outcome = OK; - testcase->fn(env); - outcome = cur_test_outcome; - - if (testcase->setup) { - if (testcase->setup->cleanup_fn(testcase, env) == 0) - outcome = FAIL; - } - - return outcome; -} - -#define MAGIC_EXITCODE 42 - -#ifndef NO_FORKING - -static enum outcome -testcase_run_forked_(const struct testgroup_t *group, - const struct testcase_t *testcase) -{ -#ifdef _WIN32 - /* Fork? On Win32? How primitive! We'll do what the smart kids do: - we'll invoke our own exe (whose name we recall from the command - line) with a command line that tells it to run just the test we - want, and this time without forking. - - (No, threads aren't an option. The whole point of forking is to - share no state between tests.) - */ - int ok; - char buffer[LONGEST_TEST_NAME+256]; - STARTUPINFOA si; - PROCESS_INFORMATION info; - DWORD exitcode; - - if (!in_tinytest_main) { - printf("\nERROR. On Windows, testcase_run_forked_ must be" - " called from within tinytest_main.\n"); - abort(); - } - if (opt_verbosity>0) - printf("[forking] "); - - snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s", - commandname, verbosity_flag, group->prefix, testcase->name); - - memset(&si, 0, sizeof(si)); - memset(&info, 0, sizeof(info)); - si.cb = sizeof(si); - - ok = CreateProcessA(commandname, buffer, NULL, NULL, 0, - 0, NULL, NULL, &si, &info); - if (!ok) { - printf("CreateProcess failed!\n"); - return 0; - } - WaitForSingleObject(info.hProcess, INFINITE); - GetExitCodeProcess(info.hProcess, &exitcode); - CloseHandle(info.hProcess); - CloseHandle(info.hThread); - if (exitcode == 0) - return OK; - else if (exitcode == MAGIC_EXITCODE) - return SKIP; - else - return FAIL; -#else - int outcome_pipe[2]; - pid_t pid; - (void)group; - - if (pipe(outcome_pipe)) - perror("opening pipe"); - - if (opt_verbosity>0) - printf("[forking] "); - pid = fork(); -#ifdef FORK_BREAKS_GCOV - vproc_transaction_begin(0); -#endif - if (!pid) { - /* child. */ - int test_r, write_r; - char b[1]; - close(outcome_pipe[0]); - test_r = testcase_run_bare_(testcase); - assert(0<=(int)test_r && (int)test_r<=2); - b[0] = "NYS"[test_r]; - write_r = (int)write(outcome_pipe[1], b, 1); - if (write_r != 1) { - perror("write outcome to pipe"); - exit(1); - } - exit(0); - return FAIL; /* unreachable */ - } else { - /* parent */ - int status, r; - char b[1]; - /* Close this now, so that if the other side closes it, - * our read fails. */ - close(outcome_pipe[1]); - r = (int)read(outcome_pipe[0], b, 1); - if (r == 0) { - printf("[Lost connection!] "); - return 0; - } else if (r != 1) { - perror("read outcome from pipe"); - } - waitpid(pid, &status, 0); - close(outcome_pipe[0]); - return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL); - } -#endif -} - -#endif /* !NO_FORKING */ - -int -testcase_run_one(const struct testgroup_t *group, - const struct testcase_t *testcase) -{ - enum outcome outcome; - - if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) { - if (opt_verbosity>0) - printf("%s%s: %s\n", - group->prefix, testcase->name, - (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED"); - ++n_skipped; - return SKIP; - } - - if (opt_verbosity>0 && !opt_forked) { - printf("%s%s: ", group->prefix, testcase->name); - } else { - if (opt_verbosity==0) printf("."); - cur_test_prefix = group->prefix; - cur_test_name = testcase->name; - } - -#ifndef NO_FORKING - if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) { - outcome = testcase_run_forked_(group, testcase); - } else { -#else - { -#endif - outcome = testcase_run_bare_(testcase); - } - - if (outcome == OK) { - ++n_ok; - if (opt_verbosity>0 && !opt_forked) - puts(opt_verbosity==1?"OK":""); - } else if (outcome == SKIP) { - ++n_skipped; - if (opt_verbosity>0 && !opt_forked) - puts("SKIPPED"); - } else { - ++n_bad; - if (!opt_forked) - printf("\n [%s FAILED]\n", testcase->name); - } - - if (opt_forked) { - exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1)); - return 1; /* unreachable */ - } else { - return (int)outcome; - } -} - -int -tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag) -{ - int i, j; - size_t length = LONGEST_TEST_NAME; - char fullname[LONGEST_TEST_NAME]; - int found=0; - if (strstr(arg, "..")) - length = strstr(arg,"..")-arg; - for (i=0; groups[i].prefix; ++i) { - for (j=0; groups[i].cases[j].name; ++j) { - struct testcase_t *testcase = &groups[i].cases[j]; - snprintf(fullname, sizeof(fullname), "%s%s", - groups[i].prefix, testcase->name); - if (!flag) { /* Hack! */ - printf(" %s", fullname); - if (testcase->flags & TT_OFF_BY_DEFAULT) - puts(" (Off by default)"); - else if (testcase->flags & TT_SKIP) - puts(" (DISABLED)"); - else - puts(""); - } - if (!strncmp(fullname, arg, length)) { - if (set) - testcase->flags |= flag; - else - testcase->flags &= ~flag; - ++found; - } - } - } - return found; -} - -static void -usage(struct testgroup_t *groups, int list_groups) -{ - puts("Options are: [--verbose|--quiet|--terse] [--no-fork]"); - puts(" Specify tests by name, or using a prefix ending with '..'"); - puts(" To skip a test, prefix its name with a colon."); - puts(" To enable a disabled test, prefix its name with a plus."); - puts(" Use --list-tests for a list of tests."); - if (list_groups) { - puts("Known tests are:"); - tinytest_set_flag_(groups, "..", 1, 0); - } - exit(0); -} - -static int -process_test_alias(struct testgroup_t *groups, const char *test) -{ - int i, j, n, r; - for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) { - if (!strcmp(cfg_aliases[i].name, test)) { - n = 0; - for (j = 0; cfg_aliases[i].tests[j]; ++j) { - r = process_test_option(groups, cfg_aliases[i].tests[j]); - if (r<0) - return -1; - n += r; - } - return n; - } - } - printf("No such test alias as @%s!",test); - return -1; -} - -static int -process_test_option(struct testgroup_t *groups, const char *test) -{ - int flag = TT_ENABLED_; - int n = 0; - if (test[0] == '@') { - return process_test_alias(groups, test + 1); - } else if (test[0] == ':') { - ++test; - flag = TT_SKIP; - } else if (test[0] == '+') { - ++test; - ++n; - if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) { - printf("No such test as %s!\n", test); - return -1; - } - } else { - ++n; - } - if (!tinytest_set_flag_(groups, test, 1, flag)) { - printf("No such test as %s!\n", test); - return -1; - } - return n; -} - -void -tinytest_set_aliases(const struct testlist_alias_t *aliases) -{ - cfg_aliases = aliases; -} - -int -tinytest_main(int c, const char **v, struct testgroup_t *groups) -{ - int i, j, n=0; - -#ifdef _WIN32 - const char *sp = strrchr(v[0], '.'); - const char *extension = ""; - if (!sp || stricmp(sp, ".exe")) - extension = ".exe"; /* Add an exe so CreateProcess will work */ - snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension); - commandname[MAX_PATH]='\0'; -#endif - for (i=1; i= 1) - printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped); - - return (n_bad == 0) ? 0 : 1; -} - -int -tinytest_get_verbosity_(void) -{ - return opt_verbosity; -} - -void -tinytest_set_test_failed_(void) -{ - if (opt_verbosity <= 0 && cur_test_name) { - if (opt_verbosity==0) puts(""); - printf("%s%s: ", cur_test_prefix, cur_test_name); - cur_test_name = NULL; - } - cur_test_outcome = 0; -} - -void -tinytest_set_test_skipped_(void) -{ - if (cur_test_outcome==OK) - cur_test_outcome = SKIP; -} - -char * -tinytest_format_hex_(const void *val_, unsigned long len) -{ - const unsigned char *val = val_; - char *result, *cp; - size_t i; - int ellipses = 0; - - if (!val) - return strdup("null"); - if (len > 1024) { - ellipses = 3; - len = 1024; - } - if (!(result = malloc(len*2+4))) - return strdup(""); - cp = result; - for (i=0;i> 4)&0x0f]; - *cp++ = "0123456789ABCDEF"[val[i] & 0x0f]; - } - while (ellipses--) - *cp++ = '.'; - *cp = 0; - return result; -} diff --git a/src/tor/src/ext/tinytest_demo.c b/src/tor/src/ext/tinytest_demo.c deleted file mode 100644 index c07f09979..000000000 --- a/src/tor/src/ext/tinytest_demo.c +++ /dev/null @@ -1,264 +0,0 @@ -/* tinytest_demo.c -- Copyright 2009-2012 Nick Mathewson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ - - -/* Welcome to the example file for tinytest! I'll show you how to set up - * some simple and not-so-simple testcases. */ - -/* Make sure you include these headers. */ -#include "tinytest.h" -#include "tinytest_macros.h" - -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#else -#include -#endif - -/* ============================================================ */ - -/* First, let's see if strcmp is working. (All your test cases should be - * functions declared to take a single void * as an argument.) */ -void -test_strcmp(void *data) -{ - (void)data; /* This testcase takes no data. */ - - /* Let's make sure the empty string is equal to itself */ - if (strcmp("","")) { - /* This macro tells tinytest to stop the current test - * and go straight to the "end" label. */ - tt_abort_msg("The empty string was not equal to itself"); - } - - /* Pretty often, calling tt_abort_msg to indicate failure is more - heavy-weight than you want. Instead, just say: */ - tt_assert(strcmp("testcase", "testcase") == 0); - - /* Occasionally, you don't want to stop the current testcase just - because a single assertion has failed. In that case, use - tt_want: */ - tt_want(strcmp("tinytest", "testcase") > 0); - - /* You can use the tt_*_op family of macros to compare values and to - fail unless they have the relationship you want. They produce - more useful output than tt_assert, since they display the actual - values of the failing things. - - Fail unless strcmp("abc, "abc") == 0 */ - tt_int_op(strcmp("abc", "abc"), OP_EQ, 0); - - /* Fail unless strcmp("abc, "abcd") is less than 0 */ - tt_int_op(strcmp("abc", "abcd"), OP_LT, 0); - - /* Incidentally, there's a test_str_op that uses strcmp internally. */ - tt_str_op("abc", OP_LT, "abcd"); - - - /* Every test-case function needs to finish with an "end:" - label and (optionally) code to clean up local variables. */ - end: - ; -} - -/* ============================================================ */ - -/* Now let's mess with setup and teardown functions! These are handy if - you have a bunch of tests that all need a similar environment, and you - want to reconstruct that environment freshly for each one. */ - -/* First you declare a type to hold the environment info, and functions to - set it up and tear it down. */ -struct data_buffer { - /* We're just going to have couple of character buffer. Using - setup/teardown functions is probably overkill for this case. - - You could also do file descriptors, complicated handles, temporary - files, etc. */ - char buffer1[512]; - char buffer2[512]; -}; -/* The setup function needs to take a const struct testcase_t and return - void* */ -void * -setup_data_buffer(const struct testcase_t *testcase) -{ - struct data_buffer *db = malloc(sizeof(struct data_buffer)); - - /* If you had a complicated set of setup rules, you might behave - differently here depending on testcase->flags or - testcase->setup_data or even or testcase->name. */ - - /* Returning a NULL here would mean that we couldn't set up for this - test, so we don't need to test db for null. */ - return db; -} -/* The clean function deallocates storage carefully and returns true on - success. */ -int -clean_data_buffer(const struct testcase_t *testcase, void *ptr) -{ - struct data_buffer *db = ptr; - - if (db) { - free(db); - return 1; - } - return 0; -} -/* Finally, declare a testcase_setup_t with these functions. */ -struct testcase_setup_t data_buffer_setup = { - setup_data_buffer, clean_data_buffer -}; - - -/* Now let's write our test. */ -void -test_memcpy(void *ptr) -{ - /* This time, we use the argument. */ - struct data_buffer *db = ptr; - - /* We'll also introduce a local variable that might need cleaning up. */ - char *mem = NULL; - - /* Let's make sure that memcpy does what we'd like. */ - strcpy(db->buffer1, "String 0"); - memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1)); - tt_str_op(db->buffer1, OP_EQ, db->buffer2); - - /* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() */ - db->buffer2[100] = 3; /* Make the buffers unequal */ - tt_mem_op(db->buffer1, OP_LT, db->buffer2, sizeof(db->buffer1)); - - /* Now we've allocated memory that's referenced by a local variable. - The end block of the function will clean it up. */ - mem = strdup("Hello world."); - tt_assert(mem); - - /* Another rather trivial test. */ - tt_str_op(db->buffer1, OP_NE, mem); - - end: - /* This time our end block has something to do. */ - if (mem) - free(mem); -} - -void -test_timeout(void *ptr) -{ - time_t t1, t2; - (void)ptr; - t1 = time(NULL); -#ifdef _WIN32 - Sleep(5000); -#else - sleep(5); -#endif - t2 = time(NULL); - - tt_int_op(t2-t1, OP_GE, 4); - - tt_int_op(t2-t1, OP_LE, 6); - - end: - ; -} - -/* ============================================================ */ - -/* Now we need to make sure that our tests get invoked. First, you take - a bunch of related tests and put them into an array of struct testcase_t. -*/ - -struct testcase_t demo_tests[] = { - /* Here's a really simple test: it has a name you can refer to it - with, and a function to invoke it. */ - { "strcmp", test_strcmp, }, - - /* The second test has a flag, "TT_FORK", to make it run in a - subprocess, and a pointer to the testcase_setup_t that configures - its environment. */ - { "memcpy", test_memcpy, TT_FORK, &data_buffer_setup }, - - /* This flag is off-by-default, since it takes a while to run. You - * can enable it manually by passing +demo/timeout at the command line.*/ - { "timeout", test_timeout, TT_OFF_BY_DEFAULT }, - - /* The array has to end with END_OF_TESTCASES. */ - END_OF_TESTCASES -}; - -/* Next, we make an array of testgroups. This is mandatory. Unlike more - heavy-duty testing frameworks, groups can't nest. */ -struct testgroup_t groups[] = { - - /* Every group has a 'prefix', and an array of tests. That's it. */ - { "demo/", demo_tests }, - - END_OF_GROUPS -}; - -/* We can also define test aliases. These can be used for types of tests that - * cut across groups. */ -const char *alltests[] = { "+..", NULL }; -const char *slowtests[] = { "+demo/timeout", NULL }; -struct testlist_alias_t aliases[] = { - - { "ALL", alltests }, - { "SLOW", slowtests }, - - END_OF_ALIASES -}; - - -int -main(int c, const char **v) -{ - /* Finally, just call tinytest_main(). It lets you specify verbose - or quiet output with --verbose and --quiet. You can list - specific tests: - - tinytest-demo demo/memcpy - - or use a ..-wildcard to select multiple tests with a common - prefix: - - tinytest-demo demo/.. - - If you list no tests, you get them all by default, so that - "tinytest-demo" and "tinytest-demo .." mean the same thing. - - */ - tinytest_set_aliases(aliases); - return tinytest_main(c, v, groups); -} diff --git a/src/tor/src/ext/tor_queue.txt b/src/tor/src/ext/tor_queue.txt deleted file mode 100644 index f284e7192..000000000 --- a/src/tor/src/ext/tor_queue.txt +++ /dev/null @@ -1,883 +0,0 @@ -Below follows the manpage for tor_queue.h, as included with OpenBSD's -sys/queue.h. License follows at the end of the file. - -====================================================================== -QUEUE(3) OpenBSD Programmer's Manual QUEUE(3) - -NAME - SLIST_ENTRY, SLIST_HEAD, SLIST_HEAD_INITIALIZER, SLIST_FIRST, SLIST_NEXT, - SLIST_END, SLIST_EMPTY, SLIST_FOREACH, SLIST_FOREACH_SAFE, SLIST_INIT, - SLIST_INSERT_AFTER, SLIST_INSERT_HEAD, SLIST_REMOVE_AFTER, - SLIST_REMOVE_HEAD, SLIST_REMOVE, LIST_ENTRY, LIST_HEAD, - LIST_HEAD_INITIALIZER, LIST_FIRST, LIST_NEXT, LIST_END, LIST_EMPTY, - LIST_FOREACH, LIST_FOREACH_SAFE, LIST_INIT, LIST_INSERT_AFTER, - LIST_INSERT_BEFORE, LIST_INSERT_HEAD, LIST_REMOVE, LIST_REPLACE, - SIMPLEQ_ENTRY, SIMPLEQ_HEAD, SIMPLEQ_HEAD_INITIALIZER, SIMPLEQ_FIRST, - SIMPLEQ_NEXT, SIMPLEQ_END, SIMPLEQ_EMPTY, SIMPLEQ_FOREACH, - SIMPLEQ_FOREACH_SAFE, SIMPLEQ_INIT, SIMPLEQ_INSERT_AFTER, - SIMPLEQ_INSERT_HEAD, SIMPLEQ_INSERT_TAIL, SIMPLEQ_REMOVE_AFTER, - SIMPLEQ_REMOVE_HEAD, TAILQ_ENTRY, TAILQ_HEAD, TAILQ_HEAD_INITIALIZER, - TAILQ_FIRST, TAILQ_NEXT, TAILQ_END, TAILQ_LAST, TAILQ_PREV, TAILQ_EMPTY, - TAILQ_FOREACH, TAILQ_FOREACH_SAFE, TAILQ_FOREACH_REVERSE, - TAILQ_FOREACH_REVERSE_SAFE, TAILQ_INIT, TAILQ_INSERT_AFTER, - TAILQ_INSERT_BEFORE, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, TAILQ_REMOVE, - TAILQ_REPLACE, CIRCLEQ_ENTRY, CIRCLEQ_HEAD, CIRCLEQ_HEAD_INITIALIZER, - CIRCLEQ_FIRST, CIRCLEQ_LAST, CIRCLEQ_END, CIRCLEQ_NEXT, CIRCLEQ_PREV, - CIRCLEQ_EMPTY, CIRCLEQ_FOREACH, CIRCLEQ_FOREACH_SAFE, - CIRCLEQ_FOREACH_REVERSE_SAFE, CIRCLEQ_INIT, CIRCLEQ_INSERT_AFTER, - CIRCLEQ_INSERT_BEFORE, CIRCLEQ_INSERT_HEAD, CIRCLEQ_INSERT_TAIL, - CIRCLEQ_REMOVE, CIRCLEQ_REPLACE - implementations of singly-linked lists, - doubly-linked lists, simple queues, tail queues, and circular queues - -SYNOPSIS - #include - - SLIST_ENTRY(TYPE); - - SLIST_HEAD(HEADNAME, TYPE); - - SLIST_HEAD_INITIALIZER(SLIST_HEAD head); - - struct TYPE * - SLIST_FIRST(SLIST_HEAD *head); - - struct TYPE * - SLIST_NEXT(struct TYPE *listelm, SLIST_ENTRY NAME); - - struct TYPE * - SLIST_END(SLIST_HEAD *head); - - int - SLIST_EMPTY(SLIST_HEAD *head); - - SLIST_FOREACH(VARNAME, SLIST_HEAD *head, SLIST_ENTRY NAME); - - SLIST_FOREACH_SAFE(VARNAME, SLIST_HEAD *head, SLIST_ENTRY - NAME, TEMP_VARNAME); - - void - SLIST_INIT(SLIST_HEAD *head); - - void - SLIST_INSERT_AFTER(struct TYPE *listelm, struct TYPE *elm, SLIST_ENTRY - NAME); - - void - SLIST_INSERT_HEAD(SLIST_HEAD *head, struct TYPE *elm, SLIST_ENTRY NAME); - - void - SLIST_REMOVE_AFTER(struct TYPE *elm, SLIST_ENTRY NAME); - - void - SLIST_REMOVE_HEAD(SLIST_HEAD *head, SLIST_ENTRY NAME); - - void - SLIST_REMOVE(SLIST_HEAD *head, struct TYPE *elm, TYPE, SLIST_ENTRY NAME); - - LIST_ENTRY(TYPE); - - LIST_HEAD(HEADNAME, TYPE); - - LIST_HEAD_INITIALIZER(LIST_HEAD head); - - struct TYPE * - LIST_FIRST(LIST_HEAD *head); - - struct TYPE * - LIST_NEXT(struct TYPE *listelm, LIST_ENTRY NAME); - - struct TYPE * - LIST_END(LIST_HEAD *head); - - int - LIST_EMPTY(LIST_HEAD *head); - - LIST_FOREACH(VARNAME, LIST_HEAD *head, LIST_ENTRY NAME); - - LIST_FOREACH_SAFE(VARNAME, LIST_HEAD *head, LIST_ENTRY - NAME, TEMP_VARNAME); - - void - LIST_INIT(LIST_HEAD *head); - - void - LIST_INSERT_AFTER(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY - NAME); - - void - LIST_INSERT_BEFORE(struct TYPE *listelm, struct TYPE *elm, LIST_ENTRY - NAME); - - void - LIST_INSERT_HEAD(LIST_HEAD *head, struct TYPE *elm, LIST_ENTRY NAME); - - void - LIST_REMOVE(struct TYPE *elm, LIST_ENTRY NAME); - - void - LIST_REPLACE(struct TYPE *elm, struct TYPE *elm2, LIST_ENTRY NAME); - - SIMPLEQ_ENTRY(TYPE); - - SIMPLEQ_HEAD(HEADNAME, TYPE); - - SIMPLEQ_HEAD_INITIALIZER(SIMPLEQ_HEAD head); - - struct TYPE * - SIMPLEQ_FIRST(SIMPLEQ_HEAD *head); - - struct TYPE * - SIMPLEQ_NEXT(struct TYPE *listelm, SIMPLEQ_ENTRY NAME); - - struct TYPE * - SIMPLEQ_END(SIMPLEQ_HEAD *head); - - int - SIMPLEQ_EMPTY(SIMPLEQ_HEAD *head); - - SIMPLEQ_FOREACH(VARNAME, SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY NAME); - - SIMPLEQ_FOREACH_SAFE(VARNAME, SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY - NAME, TEMP_VARNAME); - - void - SIMPLEQ_INIT(SIMPLEQ_HEAD *head); - - void - SIMPLEQ_INSERT_AFTER(SIMPLEQ_HEAD *head, struct TYPE *listelm, struct - TYPE *elm, SIMPLEQ_ENTRY NAME); - - void - SIMPLEQ_INSERT_HEAD(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY - NAME); - - void - SIMPLEQ_INSERT_TAIL(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY - NAME); - - void - SIMPLEQ_REMOVE_AFTER(SIMPLEQ_HEAD *head, struct TYPE *elm, SIMPLEQ_ENTRY - NAME); - - void - SIMPLEQ_REMOVE_HEAD(SIMPLEQ_HEAD *head, SIMPLEQ_ENTRY NAME); - - TAILQ_ENTRY(TYPE); - - TAILQ_HEAD(HEADNAME, TYPE); - - TAILQ_HEAD_INITIALIZER(TAILQ_HEAD head); - - struct TYPE * - TAILQ_FIRST(TAILQ_HEAD *head); - - struct TYPE * - TAILQ_NEXT(struct TYPE *listelm, TAILQ_ENTRY NAME); - - struct TYPE * - TAILQ_END(TAILQ_HEAD *head); - - struct TYPE * - TAILQ_LAST(TAILQ_HEAD *head, HEADNAME NAME); - - struct TYPE * - TAILQ_PREV(struct TYPE *listelm, HEADNAME NAME, TAILQ_ENTRY NAME); - - int - TAILQ_EMPTY(TAILQ_HEAD *head); - - TAILQ_FOREACH(VARNAME, TAILQ_HEAD *head, TAILQ_ENTRY NAME); - - TAILQ_FOREACH_SAFE(VARNAME, TAILQ_HEAD *head, TAILQ_ENTRY - NAME, TEMP_VARNAME); - - TAILQ_FOREACH_REVERSE(VARNAME, TAILQ_HEAD *head, HEADNAME, TAILQ_ENTRY - NAME); - - TAILQ_FOREACH_REVERSE_SAFE(VARNAME, TAILQ_HEAD - *head, HEADNAME, TAILQ_ENTRY NAME, TEMP_VARNAME); - - void - TAILQ_INIT(TAILQ_HEAD *head); - - void - TAILQ_INSERT_AFTER(TAILQ_HEAD *head, struct TYPE *listelm, struct TYPE - *elm, TAILQ_ENTRY NAME); - - void - TAILQ_INSERT_BEFORE(struct TYPE *listelm, struct TYPE *elm, TAILQ_ENTRY - NAME); - - void - TAILQ_INSERT_HEAD(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); - - void - TAILQ_INSERT_TAIL(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); - - void - TAILQ_REMOVE(TAILQ_HEAD *head, struct TYPE *elm, TAILQ_ENTRY NAME); - - void - TAILQ_REPLACE(TAILQ_HEAD *head, struct TYPE *elm, struct TYPE - *elm2, TAILQ_ENTRY NAME); - - CIRCLEQ_ENTRY(TYPE); - - CIRCLEQ_HEAD(HEADNAME, TYPE); - - CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD head); - - struct TYPE * - CIRCLEQ_FIRST(CIRCLEQ_HEAD *head); - - struct TYPE * - CIRCLEQ_LAST(CIRCLEQ_HEAD *head); - - struct TYPE * - CIRCLEQ_END(CIRCLEQ_HEAD *head); - - struct TYPE * - CIRCLEQ_NEXT(struct TYPE *listelm, CIRCLEQ_ENTRY NAME); - - struct TYPE * - CIRCLEQ_PREV(struct TYPE *listelm, CIRCLEQ_ENTRY NAME); - - int - CIRCLEQ_EMPTY(CIRCLEQ_HEAD *head); - - CIRCLEQ_FOREACH(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); - - CIRCLEQ_FOREACH_SAFE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY - NAME, TEMP_VARNAME); - - CIRCLEQ_FOREACH_REVERSE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY NAME); - - CIRCLEQ_FOREACH_REVERSE_SAFE(VARNAME, CIRCLEQ_HEAD *head, CIRCLEQ_ENTRY - NAME, TEMP_VARNAME); - - void - CIRCLEQ_INIT(CIRCLEQ_HEAD *head); - - void - CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct - TYPE *elm, CIRCLEQ_ENTRY NAME); - - void - CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *head, struct TYPE *listelm, struct - TYPE *elm, CIRCLEQ_ENTRY NAME); - - void - CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY - NAME); - - void - CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY - NAME); - - void - CIRCLEQ_REMOVE(CIRCLEQ_HEAD *head, struct TYPE *elm, CIRCLEQ_ENTRY NAME); - - void - CIRCLEQ_REPLACE(CIRCLEQ_HEAD *head, struct TYPE *elm, struct TYPE - *elm2, CIRCLEQ_ENTRY NAME); - -DESCRIPTION - These macros define and operate on five types of data structures: singly- - linked lists, simple queues, lists, tail queues, and circular queues. - All five structures support the following functionality: - - 1. Insertion of a new entry at the head of the list. - 2. Insertion of a new entry after any element in the list. - 3. Removal of an entry from the head of the list. - 4. Forward traversal through the list. - - Singly-linked lists are the simplest of the five data structures and - support only the above functionality. Singly-linked lists are ideal for - applications with large datasets and few or no removals, or for - implementing a LIFO queue. - - Simple queues add the following functionality: - - 1. Entries can be added at the end of a list. - - However: - - 1. All list insertions must specify the head of the list. - 2. Each head entry requires two pointers rather than one. - 3. Code size is about 15% greater and operations run about 20% - slower than singly-linked lists. - - Simple queues are ideal for applications with large datasets and few or - no removals, or for implementing a FIFO queue. - - All doubly linked types of data structures (lists, tail queues, and - circle queues) additionally allow: - - 1. Insertion of a new entry before any element in the list. - 2. Removal of any entry in the list. - - However: - - 1. Each element requires two pointers rather than one. - 2. Code size and execution time of operations (except for - removal) is about twice that of the singly-linked data- - structures. - - Lists are the simplest of the doubly linked data structures and support - only the above functionality over singly-linked lists. - - Tail queues add the following functionality: - - 1. Entries can be added at the end of a list. - 2. They may be traversed backwards, at a cost. - - However: - - 1. All list insertions and removals must specify the head of the - list. - 2. Each head entry requires two pointers rather than one. - 3. Code size is about 15% greater and operations run about 20% - slower than singly-linked lists. - - Circular queues add the following functionality: - - 1. Entries can be added at the end of a list. - 2. They may be traversed backwards, from tail to head. - - However: - - 1. All list insertions and removals must specify the head of the - list. - 2. Each head entry requires two pointers rather than one. - 3. The termination condition for traversal is more complex. - 4. Code size is about 40% greater and operations run about 45% - slower than lists. - - In the macro definitions, TYPE is the name tag of a user defined - structure that must contain a field of type SLIST_ENTRY, LIST_ENTRY, - SIMPLEQ_ENTRY, TAILQ_ENTRY, or CIRCLEQ_ENTRY, named NAME. The argument - HEADNAME is the name tag of a user defined structure that must be - declared using the macros SLIST_HEAD(), LIST_HEAD(), SIMPLEQ_HEAD(), - TAILQ_HEAD(), or CIRCLEQ_HEAD(). See the examples below for further - explanation of how these macros are used. - -SINGLY-LINKED LISTS - A singly-linked list is headed by a structure defined by the SLIST_HEAD() - macro. This structure contains a single pointer to the first element on - the list. The elements are singly linked for minimum space and pointer - manipulation overhead at the expense of O(n) removal for arbitrary - elements. New elements can be added to the list after an existing - element or at the head of the list. A SLIST_HEAD structure is declared - as follows: - - SLIST_HEAD(HEADNAME, TYPE) head; - - where HEADNAME is the name of the structure to be defined, and struct - TYPE is the type of the elements to be linked into the list. A pointer - to the head of the list can later be declared as: - - struct HEADNAME *headp; - - (The names head and headp are user selectable.) - - The HEADNAME facility is often not used, leading to the following bizarre - code: - - SLIST_HEAD(, TYPE) head, *headp; - - The SLIST_ENTRY() macro declares a structure that connects the elements - in the list. - - The SLIST_INIT() macro initializes the list referenced by head. - - The list can also be initialized statically by using the - SLIST_HEAD_INITIALIZER() macro like this: - - SLIST_HEAD(HEADNAME, TYPE) head = SLIST_HEAD_INITIALIZER(head); - - The SLIST_INSERT_HEAD() macro inserts the new element elm at the head of - the list. - - The SLIST_INSERT_AFTER() macro inserts the new element elm after the - element listelm. - - The SLIST_REMOVE_HEAD() macro removes the first element of the list - pointed by head. - - The SLIST_REMOVE_AFTER() macro removes the list element immediately - following elm. - - The SLIST_REMOVE() macro removes the element elm of the list pointed by - head. - - The SLIST_FIRST() and SLIST_NEXT() macros can be used to traverse the - list: - - for (np = SLIST_FIRST(&head); np != NULL; np = SLIST_NEXT(np, NAME)) - - Or, for simplicity, one can use the SLIST_FOREACH() macro: - - SLIST_FOREACH(np, head, NAME) - - The macro SLIST_FOREACH_SAFE() traverses the list referenced by head in a - forward direction, assigning each element in turn to var. However, - unlike SLIST_FOREACH() it is permitted to remove var as well as free it - from within the loop safely without interfering with the traversal. - - The SLIST_EMPTY() macro should be used to check whether a simple list is - empty. - -SINGLY-LINKED LIST EXAMPLE - SLIST_HEAD(listhead, entry) head; - struct entry { - ... - SLIST_ENTRY(entry) entries; /* Simple list. */ - ... - } *n1, *n2, *np; - - SLIST_INIT(&head); /* Initialize simple list. */ - - n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ - SLIST_INSERT_HEAD(&head, n1, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert after. */ - SLIST_INSERT_AFTER(n1, n2, entries); - - SLIST_FOREACH(np, &head, entries) /* Forward traversal. */ - np-> ... - - while (!SLIST_EMPTY(&head)) { /* Delete. */ - n1 = SLIST_FIRST(&head); - SLIST_REMOVE_HEAD(&head, entries); - free(n1); - } - - -LISTS - A list is headed by a structure defined by the LIST_HEAD() macro. This - structure contains a single pointer to the first element on the list. - The elements are doubly linked so that an arbitrary element can be - removed without traversing the list. New elements can be added to the - list after an existing element, before an existing element, or at the - head of the list. A LIST_HEAD structure is declared as follows: - - LIST_HEAD(HEADNAME, TYPE) head; - - where HEADNAME is the name of the structure to be defined, and struct - TYPE is the type of the elements to be linked into the list. A pointer - to the head of the list can later be declared as: - - struct HEADNAME *headp; - - (The names head and headp are user selectable.) - - The HEADNAME facility is often not used, leading to the following bizarre - code: - - LIST_HEAD(, TYPE) head, *headp; - - The LIST_ENTRY() macro declares a structure that connects the elements in - the list. - - The LIST_INIT() macro initializes the list referenced by head. - - The list can also be initialized statically by using the - LIST_HEAD_INITIALIZER() macro like this: - - LIST_HEAD(HEADNAME, TYPE) head = LIST_HEAD_INITIALIZER(head); - - The LIST_INSERT_HEAD() macro inserts the new element elm at the head of - the list. - - The LIST_INSERT_AFTER() macro inserts the new element elm after the - element listelm. - - The LIST_INSERT_BEFORE() macro inserts the new element elm before the - element listelm. - - The LIST_REMOVE() macro removes the element elm from the list. - - The LIST_REPLACE() macro replaces the list element elm with the new - element elm2. - - The LIST_FIRST() and LIST_NEXT() macros can be used to traverse the list: - - for (np = LIST_FIRST(&head); np != NULL; np = LIST_NEXT(np, NAME)) - - Or, for simplicity, one can use the LIST_FOREACH() macro: - - LIST_FOREACH(np, head, NAME) - - The macro LIST_FOREACH_SAFE() traverses the list referenced by head in a - forward direction, assigning each element in turn to var. However, - unlike LIST_FOREACH() it is permitted to remove var as well as free it - from within the loop safely without interfering with the traversal. - - The LIST_EMPTY() macro should be used to check whether a list is empty. - -LIST EXAMPLE - LIST_HEAD(listhead, entry) head; - struct entry { - ... - LIST_ENTRY(entry) entries; /* List. */ - ... - } *n1, *n2, *np; - - LIST_INIT(&head); /* Initialize list. */ - - n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ - LIST_INSERT_HEAD(&head, n1, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert after. */ - LIST_INSERT_AFTER(n1, n2, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert before. */ - LIST_INSERT_BEFORE(n1, n2, entries); - /* Forward traversal. */ - LIST_FOREACH(np, &head, entries) - np-> ... - - while (!LIST_EMPTY(&head)) /* Delete. */ - n1 = LIST_FIRST(&head); - LIST_REMOVE(n1, entries); - free(n1); - } - -SIMPLE QUEUES - A simple queue is headed by a structure defined by the SIMPLEQ_HEAD() - macro. This structure contains a pair of pointers, one to the first - element in the simple queue and the other to the last element in the - simple queue. The elements are singly linked. New elements can be added - to the queue after an existing element, at the head of the queue or at - the tail of the queue. A SIMPLEQ_HEAD structure is declared as follows: - - SIMPLEQ_HEAD(HEADNAME, TYPE) head; - - where HEADNAME is the name of the structure to be defined, and struct - TYPE is the type of the elements to be linked into the queue. A pointer - to the head of the queue can later be declared as: - - struct HEADNAME *headp; - - (The names head and headp are user selectable.) - - The SIMPLEQ_ENTRY() macro declares a structure that connects the elements - in the queue. - - The SIMPLEQ_INIT() macro initializes the queue referenced by head. - - The queue can also be initialized statically by using the - SIMPLEQ_HEAD_INITIALIZER() macro like this: - - SIMPLEQ_HEAD(HEADNAME, TYPE) head = SIMPLEQ_HEAD_INITIALIZER(head); - - The SIMPLEQ_INSERT_AFTER() macro inserts the new element elm after the - element listelm. - - The SIMPLEQ_INSERT_HEAD() macro inserts the new element elm at the head - of the queue. - - The SIMPLEQ_INSERT_TAIL() macro inserts the new element elm at the end of - the queue. - - The SIMPLEQ_REMOVE_AFTER() macro removes the queue element immediately - following elm. - - The SIMPLEQ_REMOVE_HEAD() macro removes the first element from the queue. - - The SIMPLEQ_FIRST() and SIMPLEQ_NEXT() macros can be used to traverse the - queue. The SIMPLEQ_FOREACH() is used for queue traversal: - - SIMPLEQ_FOREACH(np, head, NAME) - - The macro SIMPLEQ_FOREACH_SAFE() traverses the queue referenced by head - in a forward direction, assigning each element in turn to var. However, - unlike SIMPLEQ_FOREACH() it is permitted to remove var as well as free it - from within the loop safely without interfering with the traversal. - - The SIMPLEQ_EMPTY() macro should be used to check whether a list is - empty. - -SIMPLE QUEUE EXAMPLE - SIMPLEQ_HEAD(listhead, entry) head = SIMPLEQ_HEAD_INITIALIZER(head); - struct entry { - ... - SIMPLEQ_ENTRY(entry) entries; /* Simple queue. */ - ... - } *n1, *n2, *np; - - n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ - SIMPLEQ_INSERT_HEAD(&head, n1, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert after. */ - SIMPLEQ_INSERT_AFTER(&head, n1, n2, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert at the tail. */ - SIMPLEQ_INSERT_TAIL(&head, n2, entries); - /* Forward traversal. */ - SIMPLEQ_FOREACH(np, &head, entries) - np-> ... - /* Delete. */ - while (!SIMPLEQ_EMPTY(&head)) { - n1 = SIMPLEQ_FIRST(&head); - SIMPLEQ_REMOVE_HEAD(&head, entries); - free(n1); - } - -TAIL QUEUES - A tail queue is headed by a structure defined by the TAILQ_HEAD() macro. - This structure contains a pair of pointers, one to the first element in - the tail queue and the other to the last element in the tail queue. The - elements are doubly linked so that an arbitrary element can be removed - without traversing the tail queue. New elements can be added to the - queue after an existing element, before an existing element, at the head - of the queue, or at the end of the queue. A TAILQ_HEAD structure is - declared as follows: - - TAILQ_HEAD(HEADNAME, TYPE) head; - - where HEADNAME is the name of the structure to be defined, and struct - TYPE is the type of the elements to be linked into the tail queue. A - pointer to the head of the tail queue can later be declared as: - - struct HEADNAME *headp; - - (The names head and headp are user selectable.) - - The TAILQ_ENTRY() macro declares a structure that connects the elements - in the tail queue. - - The TAILQ_INIT() macro initializes the tail queue referenced by head. - - The tail queue can also be initialized statically by using the - TAILQ_HEAD_INITIALIZER() macro. - - The TAILQ_INSERT_HEAD() macro inserts the new element elm at the head of - the tail queue. - - The TAILQ_INSERT_TAIL() macro inserts the new element elm at the end of - the tail queue. - - The TAILQ_INSERT_AFTER() macro inserts the new element elm after the - element listelm. - - The TAILQ_INSERT_BEFORE() macro inserts the new element elm before the - element listelm. - - The TAILQ_REMOVE() macro removes the element elm from the tail queue. - - The TAILQ_REPLACE() macro replaces the list element elm with the new - element elm2. - - TAILQ_FOREACH() and TAILQ_FOREACH_REVERSE() are used for traversing a - tail queue. TAILQ_FOREACH() starts at the first element and proceeds - towards the last. TAILQ_FOREACH_REVERSE() starts at the last element and - proceeds towards the first. - - TAILQ_FOREACH(np, &head, NAME) - TAILQ_FOREACH_REVERSE(np, &head, HEADNAME, NAME) - - The macros TAILQ_FOREACH_SAFE() and TAILQ_FOREACH_REVERSE_SAFE() traverse - the list referenced by head in a forward or reverse direction - respectively, assigning each element in turn to var. However, unlike - their unsafe counterparts, they permit both the removal of var as well as - freeing it from within the loop safely without interfering with the - traversal. - - The TAILQ_FIRST(), TAILQ_NEXT(), TAILQ_LAST() and TAILQ_PREV() macros can - be used to manually traverse a tail queue or an arbitrary part of one. - - The TAILQ_EMPTY() macro should be used to check whether a tail queue is - empty. - -TAIL QUEUE EXAMPLE - TAILQ_HEAD(tailhead, entry) head; - struct entry { - ... - TAILQ_ENTRY(entry) entries; /* Tail queue. */ - ... - } *n1, *n2, *np; - - TAILQ_INIT(&head); /* Initialize queue. */ - - n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ - TAILQ_INSERT_HEAD(&head, n1, entries); - - n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */ - TAILQ_INSERT_TAIL(&head, n1, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert after. */ - TAILQ_INSERT_AFTER(&head, n1, n2, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert before. */ - TAILQ_INSERT_BEFORE(n1, n2, entries); - /* Forward traversal. */ - TAILQ_FOREACH(np, &head, entries) - np-> ... - /* Manual forward traversal. */ - for (np = n2; np != NULL; np = TAILQ_NEXT(np, entries)) - np-> ... - /* Delete. */ - while ((np = TAILQ_FIRST(&head))) { - TAILQ_REMOVE(&head, np, entries); - free(np); - } - - -CIRCULAR QUEUES - A circular queue is headed by a structure defined by the CIRCLEQ_HEAD() - macro. This structure contains a pair of pointers, one to the first - element in the circular queue and the other to the last element in the - circular queue. The elements are doubly linked so that an arbitrary - element can be removed without traversing the queue. New elements can be - added to the queue after an existing element, before an existing element, - at the head of the queue, or at the end of the queue. A CIRCLEQ_HEAD - structure is declared as follows: - - CIRCLEQ_HEAD(HEADNAME, TYPE) head; - - where HEADNAME is the name of the structure to be defined, and struct - TYPE is the type of the elements to be linked into the circular queue. A - pointer to the head of the circular queue can later be declared as: - - struct HEADNAME *headp; - - (The names head and headp are user selectable.) - - The CIRCLEQ_ENTRY() macro declares a structure that connects the elements - in the circular queue. - - The CIRCLEQ_INIT() macro initializes the circular queue referenced by - head. - - The circular queue can also be initialized statically by using the - CIRCLEQ_HEAD_INITIALIZER() macro. - - The CIRCLEQ_INSERT_HEAD() macro inserts the new element elm at the head - of the circular queue. - - The CIRCLEQ_INSERT_TAIL() macro inserts the new element elm at the end of - the circular queue. - - The CIRCLEQ_INSERT_AFTER() macro inserts the new element elm after the - element listelm. - - The CIRCLEQ_INSERT_BEFORE() macro inserts the new element elm before the - element listelm. - - The CIRCLEQ_REMOVE() macro removes the element elm from the circular - queue. - - The CIRCLEQ_REPLACE() macro replaces the list element elm with the new - element elm2. - - The CIRCLEQ_FIRST(), CIRCLEQ_LAST(), CIRCLEQ_END(), CIRCLEQ_NEXT() and - CIRCLEQ_PREV() macros can be used to traverse a circular queue. The - CIRCLEQ_FOREACH() is used for circular queue forward traversal: - - CIRCLEQ_FOREACH(np, head, NAME) - - The CIRCLEQ_FOREACH_REVERSE() macro acts like CIRCLEQ_FOREACH() but - traverses the circular queue backwards. - - The macros CIRCLEQ_FOREACH_SAFE() and CIRCLEQ_FOREACH_REVERSE_SAFE() - traverse the list referenced by head in a forward or reverse direction - respectively, assigning each element in turn to var. However, unlike - their unsafe counterparts, they permit both the removal of var as well as - freeing it from within the loop safely without interfering with the - traversal. - - The CIRCLEQ_EMPTY() macro should be used to check whether a circular - queue is empty. - -CIRCULAR QUEUE EXAMPLE - CIRCLEQ_HEAD(circleq, entry) head; - struct entry { - ... - CIRCLEQ_ENTRY(entry) entries; /* Circular queue. */ - ... - } *n1, *n2, *np; - - CIRCLEQ_INIT(&head); /* Initialize circular queue. */ - - n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ - CIRCLEQ_INSERT_HEAD(&head, n1, entries); - - n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */ - CIRCLEQ_INSERT_TAIL(&head, n1, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert after. */ - CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); - - n2 = malloc(sizeof(struct entry)); /* Insert before. */ - CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries); - /* Forward traversal. */ - CIRCLEQ_FOREACH(np, &head, entries) - np-> ... - /* Reverse traversal. */ - CIRCLEQ_FOREACH_REVERSE(np, &head, entries) - np-> ... - /* Delete. */ - while (!CIRCLEQ_EMPTY(&head)) { - n1 = CIRCLEQ_FIRST(&head); - CIRCLEQ_REMOVE(&head, n1, entries); - free(n1); - } - -NOTES - It is an error to assume the next and previous fields are preserved after - an element has been removed from a list or queue. Using any macro - (except the various forms of insertion) on an element removed from a list - or queue is incorrect. An example of erroneous usage is removing the - same element twice. - - The SLIST_END(), LIST_END(), SIMPLEQ_END() and TAILQ_END() macros are - provided for symmetry with CIRCLEQ_END(). They expand to NULL and don't - serve any useful purpose. - - Trying to free a list in the following way is a common error: - - LIST_FOREACH(var, head, entry) - free(var); - free(head); - - Since var is free'd, the FOREACH macros refer to a pointer that may have - been reallocated already. A similar situation occurs when the current - element is deleted from the list. In cases like these the data - structure's FOREACH_SAFE macros should be used instead. - -HISTORY - The queue functions first appeared in 4.4BSD. - -OpenBSD 5.0 April 11, 2012 OpenBSD 5.0 -====================================================================== -.\" $OpenBSD: queue.3,v 1.56 2012/04/11 13:29:14 naddy Exp $ -.\" $NetBSD: queue.3,v 1.4 1995/07/03 00:25:36 mycroft Exp $ -.\" -.\" Copyright (c) 1993 The Regents of the University of California. -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. - diff --git a/src/tor/src/ext/tor_readpassphrase.h b/src/tor/src/ext/tor_readpassphrase.h deleted file mode 100644 index 64f5668ca..000000000 --- a/src/tor/src/ext/tor_readpassphrase.h +++ /dev/null @@ -1,48 +0,0 @@ -/* $OpenBSD: readpassphrase.h,v 1.5 2003/06/17 21:56:23 millert Exp $ */ - -/* - * Copyright (c) 2000, 2002 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ - -/* OPENBSD ORIGINAL: include/readpassphrase.h */ - -#ifndef _READPASSPHRASE_H_ -#define _READPASSPHRASE_H_ - -#include "orconfig.h" - -#ifndef HAVE_READPASSPHRASE - -#define RPP_ECHO_OFF 0x00 /* Turn off echo (default). */ -#define RPP_ECHO_ON 0x01 /* Leave echo on. */ -#define RPP_REQUIRE_TTY 0x02 /* Fail if there is no tty. */ -#if 0 -#define RPP_FORCELOWER 0x04 /* Force input to lower case. */ -#define RPP_FORCEUPPER 0x08 /* Force input to upper case. */ -#define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */ -#endif -#define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */ - -char * readpassphrase(const char *, char *, size_t, int); - -#define HAVE_READPASSPHRASE - -#endif /* HAVE_READPASSPHRASE */ - -#endif /* !_READPASSPHRASE_H_ */ diff --git a/src/tor/src/ext/trunnel/trunnel-impl.h b/src/tor/src/ext/trunnel/trunnel-impl.h deleted file mode 100644 index b233cf763..000000000 --- a/src/tor/src/ext/trunnel/trunnel-impl.h +++ /dev/null @@ -1,311 +0,0 @@ -/* trunnel-impl.h -- copied from Trunnel v1.5.2 - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -/* trunnel-impl.h -- Implementation helpers for trunnel, included by - * generated trunnel files - * - * Copyright 2014-2017, The Tor Project, Inc. - * See license at the end of this file for copying information. - */ - -#ifndef TRUNNEL_IMPL_H_INCLUDED_ -#define TRUNNEL_IMPL_H_INCLUDED_ -#ifdef TRUNNEL_LOCAL_H -#include "trunnel-local.h" -#endif -#include "trunnel.h" -#include -#include -#include - -#if defined(_MSC_VER) && (_MSC_VER < 1600) -#define uint8_t unsigned char -#define uint16_t unsigned short -#define uint32_t unsigned int -#define uint64_t unsigned __int64 -#define inline __inline -#else -#include -#endif - -#ifdef _WIN32 -uint32_t trunnel_htonl(uint32_t a); -uint32_t trunnel_ntohl(uint32_t a); -uint16_t trunnel_htons(uint16_t a); -uint16_t trunnel_ntohs(uint16_t a); -#else -#include -#define trunnel_htonl(x) htonl(x) -#define trunnel_htons(x) htons(x) -#define trunnel_ntohl(x) ntohl(x) -#define trunnel_ntohs(x) ntohs(x) -#endif -uint64_t trunnel_htonll(uint64_t a); -uint64_t trunnel_ntohll(uint64_t a); - -#ifndef trunnel_assert -#define trunnel_assert(x) assert(x) -#endif - -static inline void -trunnel_set_uint64(void *p, uint64_t v) { - memcpy(p, &v, 8); -} -static inline void -trunnel_set_uint32(void *p, uint32_t v) { - memcpy(p, &v, 4); -} -static inline void -trunnel_set_uint16(void *p, uint16_t v) { - memcpy(p, &v, 2); -} -static inline void -trunnel_set_uint8(void *p, uint8_t v) { - memcpy(p, &v, 1); -} - -static inline uint64_t -trunnel_get_uint64(const void *p) { - uint64_t x; - memcpy(&x, p, 8); - return x; -} -static inline uint32_t -trunnel_get_uint32(const void *p) { - uint32_t x; - memcpy(&x, p, 4); - return x; -} -static inline uint16_t -trunnel_get_uint16(const void *p) { - uint16_t x; - memcpy(&x, p, 2); - return x; -} -static inline uint8_t -trunnel_get_uint8(const void *p) { - return *(const uint8_t*)p; -} - - -#ifdef TRUNNEL_DEBUG_FAILING_ALLOC -extern int trunnel_provoke_alloc_failure; - -static inline void * -trunnel_malloc(size_t n) -{ - if (trunnel_provoke_alloc_failure) { - if (--trunnel_provoke_alloc_failure == 0) - return NULL; - } - return malloc(n); -} -static inline void * -trunnel_calloc(size_t a, size_t b) -{ - if (trunnel_provoke_alloc_failure) { - if (--trunnel_provoke_alloc_failure == 0) - return NULL; - } - return calloc(a,b); -} -static inline char * -trunnel_strdup(const char *s) -{ - if (trunnel_provoke_alloc_failure) { - if (--trunnel_provoke_alloc_failure == 0) - return NULL; - } - return strdup(s); -} -#else -#ifndef trunnel_malloc -#define trunnel_malloc(x) (malloc((x))) -#endif -#ifndef trunnel_calloc -#define trunnel_calloc(a,b) (calloc((a),(b))) -#endif -#ifndef trunnel_strdup -#define trunnel_strdup(s) (strdup((s))) -#endif -#endif - -#ifndef trunnel_realloc -#define trunnel_realloc(a,b) realloc((a),(b)) -#endif - -#ifndef trunnel_free_ -#define trunnel_free_(x) (free(x)) -#endif -#define trunnel_free(x) ((x) ? (trunnel_free_(x),0) : (0)) - -#ifndef trunnel_abort -#define trunnel_abort() abort() -#endif - -#ifndef trunnel_memwipe -#define trunnel_memwipe(mem, len) ((void)0) -#define trunnel_wipestr(s) ((void)0) -#else -#define trunnel_wipestr(s) do { \ - if (s) \ - trunnel_memwipe(s, strlen(s)); \ - } while (0) -#endif - -/* ====== dynamic arrays ======== */ - -#ifdef NDEBUG -#define TRUNNEL_DYNARRAY_GET(da, n) \ - ((da)->elts_[(n)]) -#else -/** Return the 'n'th element of 'da'. */ -#define TRUNNEL_DYNARRAY_GET(da, n) \ - (((n) >= (da)->n_ ? (trunnel_abort(),0) : 0), (da)->elts_[(n)]) -#endif - -/** Change the 'n'th element of 'da' to 'v'. */ -#define TRUNNEL_DYNARRAY_SET(da, n, v) do { \ - trunnel_assert((n) < (da)->n_); \ - (da)->elts_[(n)] = (v); \ - } while (0) - -/** Expand the dynamic array 'da' of 'elttype' so that it can hold at least - * 'howmanymore' elements than its current capacity. Always tries to increase - * the length of the array. On failure, run the code in 'on_fail' and goto - * trunnel_alloc_failed. */ -#define TRUNNEL_DYNARRAY_EXPAND(elttype, da, howmanymore, on_fail) do { \ - elttype *newarray; \ - newarray = trunnel_dynarray_expand(&(da)->allocated_, \ - (da)->elts_, (howmanymore), \ - sizeof(elttype)); \ - if (newarray == NULL) { \ - on_fail; \ - goto trunnel_alloc_failed; \ - } \ - (da)->elts_ = newarray; \ - } while (0) - -/** Add 'v' to the end of the dynamic array 'da' of 'elttype', expanding it if - * necessary. code in 'on_fail' and goto trunnel_alloc_failed. */ -#define TRUNNEL_DYNARRAY_ADD(elttype, da, v, on_fail) do { \ - if ((da)->n_ == (da)->allocated_) { \ - TRUNNEL_DYNARRAY_EXPAND(elttype, da, 1, on_fail); \ - } \ - (da)->elts_[(da)->n_++] = (v); \ - } while (0) - -/** Return the number of elements in 'da'. */ -#define TRUNNEL_DYNARRAY_LEN(da) ((da)->n_) - -/** Remove all storage held by 'da' and set it to be empty. Does not free - * storage held by the elements themselves. */ -#define TRUNNEL_DYNARRAY_CLEAR(da) do { \ - trunnel_free((da)->elts_); \ - (da)->elts_ = NULL; \ - (da)->n_ = (da)->allocated_ = 0; \ - } while (0) - -/** Remove all storage held by 'da' and set it to be empty. Does not free - * storage held by the elements themselves. */ -#define TRUNNEL_DYNARRAY_WIPE(da) do { \ - trunnel_memwipe((da)->elts_, (da)->allocated_ * sizeof((da)->elts_[0])); \ - } while (0) - -/** Helper: wraps or implements an OpenBSD-style reallocarray. Behaves - * as realloc(a, x*y), but verifies that no overflow will occur in the - * multiplication. Returns NULL on failure. */ -#ifndef trunnel_reallocarray -void *trunnel_reallocarray(void *a, size_t x, size_t y); -#endif - -/** Helper to expand a dynamic array. Behaves as TRUNNEL_DYNARRAY_EXPAND(), - * taking the array of elements in 'ptr', a pointer to thethe current number - * of allocated elements in allocated_p, the minimum numbeer of elements to - * add in 'howmanymore', and the size of a single element in 'eltsize'. - * - * On success, adjust *allocated_p, and return the new value for the array of - * elements. On failure, adjust nothing and return NULL. - */ -void *trunnel_dynarray_expand(size_t *allocated_p, void *ptr, - size_t howmanymore, size_t eltsize); - -/** Type for a function to free members of a dynarray of pointers. */ -typedef void (*trunnel_free_fn_t)(void *); - -/** - * Helper to change the length of a dynamic array. Takes pointers to the - * current allocated and n fields of the array in 'allocated_p' and 'len_p', - * and the current array of elements in 'ptr'; takes the length of a single - * element in 'eltsize'. Changes the length to 'newlen'. If 'newlen' is - * greater than the current length, pads the new elements with 0. If newlen - * is less than the current length, and free_fn is non-NULL, treat the - * array as an array of void *, and invoke free_fn() on each removed element. - * - * On success, adjust *allocated_p and *len_p, and return the new value for - * the array of elements. On failure, adjust nothing, set *errcode_ptr to 1, - * and return NULL. - */ -void *trunnel_dynarray_setlen(size_t *allocated_p, size_t *len_p, - void *ptr, size_t newlen, - size_t eltsize, trunnel_free_fn_t free_fn, - uint8_t *errcode_ptr); - -/** - * Helper: return a pointer to the value of 'str' as a NUL-terminated string. - * Might have to reallocate the storage for 'str' in order to fit in the final - * NUL character. On allocation failure, return NULL. - */ -const char *trunnel_string_getstr(trunnel_string_t *str); - -/** - * Helper: change the contents of 'str' to hold the 'len'-byte string in - * 'inp'. Adjusts the storage to have a terminating NUL that doesn't count - * towards the length of the string. On success, return 0. On failure, set - * *errcode_ptr to 1 and return -1. - */ -int trunnel_string_setstr0(trunnel_string_t *str, const char *inp, size_t len, - uint8_t *errcode_ptr); - -/** - * As trunnel_dynarray_setlen, but adjusts a string rather than a dynamic - * array, and ensures that the new string is NUL-terminated. - */ -int trunnel_string_setlen(trunnel_string_t *str, size_t newlen, - uint8_t *errcode_ptr); - -#endif - - -/* -Copyright 2014 The Tor Project, Inc. - -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 names of the copyright owners 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/src/tor/src/ext/trunnel/trunnel.c b/src/tor/src/ext/trunnel/trunnel.c deleted file mode 100644 index b749d8136..000000000 --- a/src/tor/src/ext/trunnel/trunnel.c +++ /dev/null @@ -1,247 +0,0 @@ -/* trunnel.c -- copied from Trunnel v1.5.2 - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -/* trunnel.c -- Helper functions to implement trunnel. - * - * Copyright 2014-2017, The Tor Project, Inc. - * See license at the end of this file for copying information. - * - * See trunnel-impl.h for documentation of these functions. - */ - -#include "trunnel-impl.h" -#include -#include - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define IS_LITTLE_ENDIAN 1 -#elif defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ - BYTE_ORDER == __ORDER_LITTLE_ENDIAN -# define IS_LITTLE_ENDIAN 1 -#elif defined(_WIN32) -# define IS_LITTLE_ENDIAN 1 -#elif defined(__APPLE__) -# include -# define BSWAP64(x) OSSwapLittleToHostInt64(x) -#elif defined(sun) || defined(__sun) -# include -# ifndef _BIG_ENDIAN -# define IS_LITTLE_ENDIAN -# endif -#else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) -# include -# else -# include -# endif -# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ - __BYTE_ORDER == __LITTLE_ENDIAN -# define IS_LITTLE_ENDIAN -# endif -#endif - -#ifdef _WIN32 -uint16_t -trunnel_htons(uint16_t s) -{ - return (s << 8) | (s >> 8); -} -uint16_t -trunnel_ntohs(uint16_t s) -{ - return (s << 8) | (s >> 8); -} -uint32_t -trunnel_htonl(uint32_t s) -{ - return (s << 24) | - ((s << 8)&0xff0000) | - ((s >> 8)&0xff00) | - (s >> 24); -} -uint32_t -trunnel_ntohl(uint32_t s) -{ - return (s << 24) | - ((s << 8)&0xff0000) | - ((s >> 8)&0xff00) | - (s >> 24); -} -#endif - -uint64_t -trunnel_htonll(uint64_t a) -{ -#ifdef IS_LITTLE_ENDIAN - return trunnel_htonl((uint32_t)(a>>32)) - | (((uint64_t)trunnel_htonl((uint32_t)a))<<32); -#else - return a; -#endif -} - -uint64_t -trunnel_ntohll(uint64_t a) -{ - return trunnel_htonll(a); -} - -#ifdef TRUNNEL_DEBUG_FAILING_ALLOC -/** Used for debugging and running tricky test cases: Makes the nth - * memoryation allocation call from now fail. - */ -int trunnel_provoke_alloc_failure = 0; -#endif - -void * -trunnel_dynarray_expand(size_t *allocated_p, void *ptr, - size_t howmanymore, size_t eltsize) -{ - size_t newsize = howmanymore + *allocated_p; - void *newarray = NULL; - if (newsize < 8) - newsize = 8; - if (newsize < *allocated_p * 2) - newsize = *allocated_p * 2; - if (newsize <= *allocated_p || newsize < howmanymore) - return NULL; - newarray = trunnel_reallocarray(ptr, newsize, eltsize); - if (newarray == NULL) - return NULL; - - *allocated_p = newsize; - return newarray; -} - -#ifndef trunnel_reallocarray -void * -trunnel_reallocarray(void *a, size_t x, size_t y) -{ -#ifdef TRUNNEL_DEBUG_FAILING_ALLOC - if (trunnel_provoke_alloc_failure) { - if (--trunnel_provoke_alloc_failure == 0) - return NULL; - } -#endif - if (x > SIZE_MAX / y) - return NULL; - return trunnel_realloc(a, x * y); -} -#endif - -const char * -trunnel_string_getstr(trunnel_string_t *str) -{ - trunnel_assert(str->allocated_ >= str->n_); - if (str->allocated_ == str->n_) { - TRUNNEL_DYNARRAY_EXPAND(char, str, 1, {}); - } - str->elts_[str->n_] = 0; - return str->elts_; -trunnel_alloc_failed: - return NULL; -} - -int -trunnel_string_setstr0(trunnel_string_t *str, const char *val, size_t len, - uint8_t *errcode_ptr) -{ - if (len == SIZE_MAX) - goto trunnel_alloc_failed; - if (str->allocated_ <= len) { - TRUNNEL_DYNARRAY_EXPAND(char, str, len + 1 - str->allocated_, {}); - } - memcpy(str->elts_, val, len); - str->n_ = len; - str->elts_[len] = 0; - return 0; -trunnel_alloc_failed: - *errcode_ptr = 1; - return -1; -} - -int -trunnel_string_setlen(trunnel_string_t *str, size_t newlen, - uint8_t *errcode_ptr) -{ - if (newlen == SIZE_MAX) - goto trunnel_alloc_failed; - if (str->allocated_ < newlen + 1) { - TRUNNEL_DYNARRAY_EXPAND(char, str, newlen + 1 - str->allocated_, {}); - } - if (str->n_ < newlen) { - memset(& (str->elts_[str->n_]), 0, (newlen - str->n_)); - } - str->n_ = newlen; - str->elts_[newlen] = 0; - return 0; - - trunnel_alloc_failed: - *errcode_ptr = 1; - return -1; -} - -void * -trunnel_dynarray_setlen(size_t *allocated_p, size_t *len_p, - void *ptr, size_t newlen, - size_t eltsize, trunnel_free_fn_t free_fn, - uint8_t *errcode_ptr) -{ - if (*allocated_p < newlen) { - void *newptr = trunnel_dynarray_expand(allocated_p, ptr, - newlen - *allocated_p, eltsize); - if (newptr == NULL) - goto trunnel_alloc_failed; - ptr = newptr; - } - if (free_fn && *len_p > newlen) { - size_t i; - void **elts = (void **) ptr; - for (i = newlen; i < *len_p; ++i) { - free_fn(elts[i]); - elts[i] = NULL; - } - } - if (*len_p < newlen) { - memset( ((char*)ptr) + (eltsize * *len_p), 0, (newlen - *len_p) * eltsize); - } - *len_p = newlen; - return ptr; - trunnel_alloc_failed: - *errcode_ptr = 1; - return NULL; -} - -/* -Copyright 2014 The Tor Project, Inc. - -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 names of the copyright owners 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/src/tor/src/ext/trunnel/trunnel.h b/src/tor/src/ext/trunnel/trunnel.h deleted file mode 100644 index 32c80bac2..000000000 --- a/src/tor/src/ext/trunnel/trunnel.h +++ /dev/null @@ -1,64 +0,0 @@ -/* trunnel.h -- copied from Trunnel v1.5.2 - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -/* trunnel.h -- Public declarations for trunnel, to be included - * in trunnel header files. - - * Copyright 2014-2017, The Tor Project, Inc. - * See license at the end of this file for copying information. - */ - -#ifndef TRUNNEL_H_INCLUDED_ -#define TRUNNEL_H_INCLUDED_ - -#include - -/** Macro to declare a variable-length dynamically allocated array. Trunnel - * uses these to store all variable-length arrays. */ -#define TRUNNEL_DYNARRAY_HEAD(name, elttype) \ - struct name { \ - size_t n_; \ - size_t allocated_; \ - elttype *elts_; \ - } - -/** Initializer for a dynamic array of a given element type. */ -#define TRUNNEL_DYNARRAY_INIT(elttype) { 0, 0, (elttype*)NULL } - -/** Typedef used for storing variable-length arrays of char. */ -typedef TRUNNEL_DYNARRAY_HEAD(trunnel_string_st, char) trunnel_string_t; - -#endif - -/* -Copyright 2014 The Tor Project, Inc. - -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 names of the copyright owners 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/src/tor/src/include.am b/src/tor/src/include.am deleted file mode 100644 index 90ecf90d4..000000000 --- a/src/tor/src/include.am +++ /dev/null @@ -1,11 +0,0 @@ -include src/ext/include.am -include src/trunnel/include.am -include src/common/include.am -include src/or/include.am -include src/rust/include.am -include src/test/include.am -include src/tools/include.am -include src/win32/include.am -include src/config/include.am -include src/test/fuzz/include.am -include src/trace/include.am diff --git a/src/tor/src/or/Makefile.nmake b/src/tor/src/or/Makefile.nmake deleted file mode 100644 index 429ae6785..000000000 --- a/src/tor/src/or/Makefile.nmake +++ /dev/null @@ -1,79 +0,0 @@ -all: tor.exe - -CFLAGS = /O2 /MT /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common \ - /I ..\ext - -LIBS = ..\..\..\build-alpha\lib\libevent.lib \ - ..\..\..\build-alpha\lib\libcrypto.lib \ - ..\..\..\build-alpha\lib\libssl.lib \ - ..\..\..\build-alpha\lib\libz.lib \ - ws2_32.lib advapi32.lib shell32.lib \ - crypt32.lib gdi32.lib user32.lib - -LIBTOR_OBJECTS = \ - addressmap.obj \ - buffers.obj \ - channel.obj \ - channelpadding.obj \ - channeltls.obj \ - circpathbias.obj \ - circuitbuild.obj \ - circuitlist.obj \ - circuitmux.obj \ - circuitmux_ewma.obj \ - circuitstats.obj \ - circuituse.obj \ - command.obj \ - config.obj \ - config_codedigest.obj \ - confparse.obj \ - connection.obj \ - connection_edge.obj \ - connection_or.obj \ - control.obj \ - cpuworker.obj \ - directory.obj \ - dirserv.obj \ - dirvote.obj \ - dns.obj \ - dnsserv.obj \ - ext_orport.obj \ - fp_pair.obj \ - entrynodes.obj \ - geoip.obj \ - hibernate.obj \ - main.obj \ - microdesc.obj \ - networkstatus.obj \ - nodelist.obj \ - ntmain.obj \ - onion.obj \ - onion_fast.obj \ - onion_ntor.obj \ - onion_tap.obj \ - policies.obj \ - reasons.obj \ - relay.obj \ - rendclient.obj \ - rendcommon.obj \ - rendmid.obj \ - rendservice.obj \ - rephist.obj \ - replaycache.obj \ - router.obj \ - routerlist.obj \ - routerparse.obj \ - routerset.obj \ - scheduler.obj \ - statefile.obj \ - status.obj \ - transports.obj - -libtor.lib: $(LIBTOR_OBJECTS) - lib $(LIBTOR_OBJECTS) /out:$@ - -tor.exe: libtor.lib tor_main.obj - $(CC) $(CFLAGS) $(LIBS) libtor.lib ..\common\*.lib ..\ext\*.lib tor_main.obj /Fe$@ - -clean: - del $(LIBTOR_OBJECTS) tor_main.obj *.lib tor.exe diff --git a/src/tor/src/or/bridges.c b/src/tor/src/or/bridges.c deleted file mode 100644 index 19a23ea86..000000000 --- a/src/tor/src/or/bridges.c +++ /dev/null @@ -1,891 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file bridges.c - * \brief Code to manage bridges and bridge selection. - * - * Bridges are fixed entry nodes, used for censorship circumvention. - **/ - -#include "or.h" -#include "bridges.h" -#include "circuitbuild.h" -#include "config.h" -#include "connection.h" -#include "directory.h" -#include "entrynodes.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerlist.h" -#include "routerset.h" -#include "transports.h" - -/** Information about a configured bridge. Currently this just matches the - * ones in the torrc file, but one day we may be able to learn about new - * bridges on our own, and remember them in the state file. */ -struct bridge_info_t { - /** Address and port of the bridge, as configured by the user.*/ - tor_addr_port_t addrport_configured; - /** Address of the bridge. */ - tor_addr_t addr; - /** TLS port for the bridge. */ - uint16_t port; - /** Boolean: We are re-parsing our bridge list, and we are going to remove - * this one if we don't find it in the list of configured bridges. */ - unsigned marked_for_removal : 1; - /** Expected identity digest, or all zero bytes if we don't know what the - * digest should be. */ - char identity[DIGEST_LEN]; - - /** Name of pluggable transport protocol taken from its config line. */ - char *transport_name; - - /** When should we next try to fetch a descriptor for this bridge? */ - download_status_t fetch_status; - - /** A smartlist of k=v values to be passed to the SOCKS proxy, if - transports are used for this bridge. */ - smartlist_t *socks_args; -}; - -#define bridge_free(bridge) \ - FREE_AND_NULL(bridge_info_t, bridge_free_, (bridge)) - -static void bridge_free_(bridge_info_t *bridge); -static void rewrite_node_address_for_bridge(const bridge_info_t *bridge, - node_t *node); - -/** A list of configured bridges. Whenever we actually get a descriptor - * for one, we add it as an entry guard. Note that the order of bridges - * in this list does not necessarily correspond to the order of bridges - * in the torrc. */ -static smartlist_t *bridge_list = NULL; - -/** Mark every entry of the bridge list to be removed on our next call to - * sweep_bridge_list unless it has first been un-marked. */ -void -mark_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, - b->marked_for_removal = 1); -} - -/** Remove every entry of the bridge list that was marked with - * mark_bridge_list if it has not subsequently been un-marked. */ -void -sweep_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) { - if (b->marked_for_removal) { - SMARTLIST_DEL_CURRENT(bridge_list, b); - bridge_free(b); - } - } SMARTLIST_FOREACH_END(b); -} - -/** Initialize the bridge list to empty, creating it if needed. */ -static void -clear_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, bridge_free(b)); - smartlist_clear(bridge_list); -} - -/** Free the bridge bridge. */ -static void -bridge_free_(bridge_info_t *bridge) -{ - if (!bridge) - return; - - tor_free(bridge->transport_name); - if (bridge->socks_args) { - SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s)); - smartlist_free(bridge->socks_args); - } - - tor_free(bridge); -} - -/** Return a list of all the configured bridges, as bridge_info_t pointers. */ -const smartlist_t * -bridge_list_get(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - return bridge_list; -} - -/** - * Given a bridge, return a pointer to its RSA identity digest, or - * NULL if we don't know one for it. - */ -const uint8_t * -bridge_get_rsa_id_digest(const bridge_info_t *bridge) -{ - tor_assert(bridge); - if (tor_digest_is_zero(bridge->identity)) - return NULL; - else - return (const uint8_t *) bridge->identity; -} - -/** - * Given a bridge, return a pointer to its configured addr:port - * combination. - */ -const tor_addr_port_t * -bridge_get_addr_port(const bridge_info_t *bridge) -{ - tor_assert(bridge); - return &bridge->addrport_configured; -} - -/** If we have a bridge configured whose digest matches digest, or a - * bridge with no known digest whose address matches any of the - * tor_addr_port_t's in orports, return that bridge. Else return - * NULL. */ -static bridge_info_t * -get_configured_bridge_by_orports_digest(const char *digest, - const smartlist_t *orports) -{ - if (!bridge_list) - return NULL; - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - if (tor_digest_is_zero(bridge->identity)) { - SMARTLIST_FOREACH_BEGIN(orports, tor_addr_port_t *, ap) - { - if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 && - bridge->port == ap->port) - return bridge; - } - SMARTLIST_FOREACH_END(ap); - } - if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - } - SMARTLIST_FOREACH_END(bridge); - return NULL; -} - -/** If we have a bridge configured whose digest matches digest, or a - * bridge with no known digest whose address matches addr:port, - * return that bridge. Else return NULL. If digest is NULL, check for - * address/port matches only. */ -bridge_info_t * -get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, - uint16_t port, - const char *digest) -{ - if (!bridge_list) - return NULL; - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - if ((tor_digest_is_zero(bridge->identity) || digest == NULL) && - !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && - bridge->port == port) - return bridge; - if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - } - SMARTLIST_FOREACH_END(bridge); - return NULL; -} - -/** - * As get_configured_bridge_by_addr_port, but require that the - * address match addr:port, and that the ID digest match - * digest. (The other function will ignore the address if the - * digest matches.) - */ -bridge_info_t * -get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr, - uint16_t port, - const char *digest) -{ - if (!bridge_list) - return NULL; - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { - if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && - bridge->port == port) { - - if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - else if (!digest || tor_digest_is_zero(bridge->identity)) - return bridge; - } - - } SMARTLIST_FOREACH_END(bridge); - return NULL; -} - -/** If we have a bridge configured whose digest matches digest, or a - * bridge with no known digest whose address matches addr:port, - * return 1. Else return 0. If digest is NULL, check for - * address/port matches only. */ -int -addr_is_a_configured_bridge(const tor_addr_t *addr, - uint16_t port, - const char *digest) -{ - tor_assert(addr); - return get_configured_bridge_by_addr_port_digest(addr, port, digest) ? 1 : 0; -} - -/** If we have a bridge configured whose digest matches - * ei->identity_digest, or a bridge with no known digest whose address - * matches ei->addr:ei->port, return 1. Else return 0. - * If ei->onion_key is NULL, check for address/port matches only. */ -int -extend_info_is_a_configured_bridge(const extend_info_t *ei) -{ - const char *digest = ei->onion_key ? ei->identity_digest : NULL; - return addr_is_a_configured_bridge(&ei->addr, ei->port, digest); -} - -/** Wrapper around get_configured_bridge_by_addr_port_digest() to look - * it up via router descriptor ri. */ -static bridge_info_t * -get_configured_bridge_by_routerinfo(const routerinfo_t *ri) -{ - bridge_info_t *bi = NULL; - smartlist_t *orports = router_get_all_orports(ri); - bi = get_configured_bridge_by_orports_digest(ri->cache_info.identity_digest, - orports); - SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); - smartlist_free(orports); - return bi; -} - -/** Return 1 if ri is one of our known bridges, else 0. */ -int -routerinfo_is_a_configured_bridge(const routerinfo_t *ri) -{ - return get_configured_bridge_by_routerinfo(ri) ? 1 : 0; -} - -/** Return 1 if node is one of our configured bridges, else 0. */ -int -node_is_a_configured_bridge(const node_t *node) -{ - int retval = 0; - smartlist_t *orports = node_get_all_orports(node); - retval = get_configured_bridge_by_orports_digest(node->identity, - orports) != NULL; - SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); - smartlist_free(orports); - return retval; -} - -/** We made a connection to a router at addr:port - * without knowing its digest. Its digest turned out to be digest. - * If it was a bridge, and we still don't know its digest, record it. - */ -void -learned_router_identity(const tor_addr_t *addr, uint16_t port, - const char *digest, - const ed25519_public_key_t *ed_id) -{ - // XXXX prop220 use ed_id here, once there is some way to specify - (void)ed_id; - int learned = 0; - bridge_info_t *bridge = - get_configured_bridge_by_exact_addr_port_digest(addr, port, digest); - if (bridge && tor_digest_is_zero(bridge->identity)) { - memcpy(bridge->identity, digest, DIGEST_LEN); - learned = 1; - } - /* XXXX prop220 remember bridge ed25519 identities -- add a field */ -#if 0 - if (bridge && ed_id && - ed25519_public_key_is_zero(&bridge->ed25519_identity) && - !ed25519_public_key_is_zero(ed_id)) { - memcpy(&bridge->ed25519_identity, ed_id, sizeof(*ed_id)); - learned = 1; - } -#endif /* 0 */ - if (learned) { - char *transport_info = NULL; - const char *transport_name = - find_transport_name_by_bridge_addrport(addr, port); - if (transport_name) - tor_asprintf(&transport_info, " (with transport '%s')", transport_name); - - // XXXX prop220 log both fingerprints. - log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.", - hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port), - transport_info ? transport_info : ""); - tor_free(transport_info); - entry_guard_learned_bridge_identity(&bridge->addrport_configured, - (const uint8_t *)digest); - } -} - -/** Return true if bridge has the same identity digest as - * digest. If digest is NULL, it matches - * bridges with unspecified identity digests. */ -static int -bridge_has_digest(const bridge_info_t *bridge, const char *digest) -{ - if (digest) - return tor_memeq(digest, bridge->identity, DIGEST_LEN); - else - return tor_digest_is_zero(bridge->identity); -} - -/** We are about to add a new bridge at addr:port, with optional - * digest and transport_name. Mark for removal any previously - * existing bridge with the same address and port, and warn the user as - * appropriate. - */ -static void -bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port, - const char *digest, const char *transport_name) -{ - /* Iterate the already-registered bridge list: - - If you find a bridge with the same adress and port, mark it for - removal. It doesn't make sense to have two active bridges with - the same IP:PORT. If the bridge in question has a different - digest or transport than digest/transport_name, - it's probably a misconfiguration and we should warn the user. - */ - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { - if (bridge->marked_for_removal) - continue; - - if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) { - - bridge->marked_for_removal = 1; - - if (!bridge_has_digest(bridge, digest) || - strcmp_opt(bridge->transport_name, transport_name)) { - /* warn the user */ - char *bridge_description_new, *bridge_description_old; - tor_asprintf(&bridge_description_new, "%s:%s:%s", - fmt_addrport(addr, port), - digest ? hex_str(digest, DIGEST_LEN) : "", - transport_name ? transport_name : ""); - tor_asprintf(&bridge_description_old, "%s:%s:%s", - fmt_addrport(&bridge->addr, bridge->port), - tor_digest_is_zero(bridge->identity) ? - "" : hex_str(bridge->identity,DIGEST_LEN), - bridge->transport_name ? bridge->transport_name : ""); - - log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict" - " with the already registered bridge '%s'. We will discard" - " the old bridge and keep '%s'. If this is not what you" - " wanted, please change your configuration file accordingly.", - bridge_description_new, bridge_description_old, - bridge_description_new); - - tor_free(bridge_description_new); - tor_free(bridge_description_old); - } - } - } SMARTLIST_FOREACH_END(bridge); -} - -/** Return True if we have a bridge that uses a transport with name - * transport_name. */ -MOCK_IMPL(int, -transport_is_needed, (const char *transport_name)) -{ - if (!bridge_list) - return 0; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (bridge->transport_name && - !strcmp(bridge->transport_name, transport_name)) - return 1; - } SMARTLIST_FOREACH_END(bridge); - - return 0; -} - -/** Register the bridge information in bridge_line to the - * bridge subsystem. Steals reference of bridge_line. */ -void -bridge_add_from_config(bridge_line_t *bridge_line) -{ - bridge_info_t *b; - - // XXXX prop220 add a way to specify ed25519 ID to bridge_line_t. - - { /* Log the bridge we are about to register: */ - log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)", - fmt_addrport(&bridge_line->addr, bridge_line->port), - bridge_line->transport_name ? - bridge_line->transport_name : "no transport", - tor_digest_is_zero(bridge_line->digest) ? - "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN)); - - if (bridge_line->socks_args) { /* print socks arguments */ - int i = 0; - - tor_assert(smartlist_len(bridge_line->socks_args) > 0); - - log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:", - smartlist_len(bridge_line->socks_args)); - SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg, - log_debug(LD_CONFIG, "%d: %s", ++i, arg)); - } - } - - bridge_resolve_conflicts(&bridge_line->addr, - bridge_line->port, - bridge_line->digest, - bridge_line->transport_name); - - b = tor_malloc_zero(sizeof(bridge_info_t)); - tor_addr_copy(&b->addrport_configured.addr, &bridge_line->addr); - b->addrport_configured.port = bridge_line->port; - tor_addr_copy(&b->addr, &bridge_line->addr); - b->port = bridge_line->port; - memcpy(b->identity, bridge_line->digest, DIGEST_LEN); - if (bridge_line->transport_name) - b->transport_name = bridge_line->transport_name; - b->fetch_status.schedule = DL_SCHED_BRIDGE; - b->fetch_status.backoff = DL_SCHED_RANDOM_EXPONENTIAL; - b->fetch_status.increment_on = DL_SCHED_INCREMENT_ATTEMPT; - /* We can't reset the bridge's download status here, because UseBridges - * might be 0 now, and it might be changed to 1 much later. */ - b->socks_args = bridge_line->socks_args; - if (!bridge_list) - bridge_list = smartlist_new(); - - tor_free(bridge_line); /* Deallocate bridge_line now. */ - - smartlist_add(bridge_list, b); -} - -/** If digest is one of our known bridges, return it. */ -bridge_info_t * -find_bridge_by_digest(const char *digest) -{ - if (! bridge_list) - return NULL; - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, - { - if (tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - }); - return NULL; -} - -/** Given the addr and port of a bridge, if that bridge - * supports a pluggable transport, return its name. Otherwise, return - * NULL. */ -const char * -find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) -{ - if (!bridge_list) - return NULL; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (tor_addr_eq(&bridge->addr, addr) && - (bridge->port == port)) - return bridge->transport_name; - } SMARTLIST_FOREACH_END(bridge); - - return NULL; -} - -/** If addr and port match the address and port of a - * bridge of ours that uses pluggable transports, place its transport - * in transport. - * - * Return 0 on success (found a transport, or found a bridge with no - * transport, or found no bridge); return -1 if we should be using a - * transport, but the transport could not be found. - */ -int -get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, - const transport_t **transport) -{ - *transport = NULL; - if (!bridge_list) - return 0; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (tor_addr_eq(&bridge->addr, addr) && - (bridge->port == port)) { /* bridge matched */ - if (bridge->transport_name) { /* it also uses pluggable transports */ - *transport = transport_get_by_name(bridge->transport_name); - if (*transport == NULL) { /* it uses pluggable transports, but - the transport could not be found! */ - return -1; - } - return 0; - } else { /* bridge matched, but it doesn't use transports. */ - break; - } - } - } SMARTLIST_FOREACH_END(bridge); - - *transport = NULL; - return 0; -} - -/** Return a smartlist containing all the SOCKS arguments that we - * should pass to the SOCKS proxy. */ -const smartlist_t * -get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) -{ - bridge_info_t *bridge = get_configured_bridge_by_addr_port_digest(addr, - port, - NULL); - return bridge ? bridge->socks_args : NULL; -} - -/** We need to ask bridge for its server descriptor. */ -static void -launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) -{ - const or_options_t *options = get_options(); - circuit_guard_state_t *guard_state = NULL; - - if (connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, &bridge->addr, bridge->port, - DIR_PURPOSE_FETCH_SERVERDESC)) - return; /* it's already on the way */ - - if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { - download_status_mark_impossible(&bridge->fetch_status); - log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", - safe_str_client(fmt_and_decorate_addr(&bridge->addr))); - return; - } - - /* Until we get a descriptor for the bridge, we only know one address for - * it. */ - if (!fascist_firewall_allows_address_addr(&bridge->addr, bridge->port, - FIREWALL_OR_CONNECTION, 0, 0)) { - log_notice(LD_CONFIG, "Tried to fetch a descriptor directly from a " - "bridge, but that bridge is not reachable through our " - "firewall."); - return; - } - - /* If we already have a node_t for this bridge, rewrite its address now. */ - node_t *node = node_get_mutable_by_id(bridge->identity); - if (node) { - rewrite_node_address_for_bridge(bridge, node); - } - - tor_addr_port_t bridge_addrport; - memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t)); - bridge_addrport.port = bridge->port; - - guard_state = get_guard_state_for_bridge_desc_fetch(bridge->identity); - - directory_request_t *req = - directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); - directory_request_set_or_addr_port(req, &bridge_addrport); - directory_request_set_directory_id_digest(req, bridge->identity); - directory_request_set_router_purpose(req, ROUTER_PURPOSE_BRIDGE); - directory_request_set_resource(req, "authority.z"); - if (guard_state) { - directory_request_set_guard_state(req, guard_state); - } - directory_initiate_request(req); - directory_request_free(req); -} - -/** Fetching the bridge descriptor from the bridge authority returned a - * "not found". Fall back to trying a direct fetch. */ -void -retry_bridge_descriptor_fetch_directly(const char *digest) -{ - bridge_info_t *bridge = find_bridge_by_digest(digest); - if (!bridge) - return; /* not found? oh well. */ - - launch_direct_bridge_descriptor_fetch(bridge); -} - -/** For each bridge in our list for which we don't currently have a - * descriptor, fetch a new copy of its descriptor -- either directly - * from the bridge or via a bridge authority. */ -void -fetch_bridge_descriptors(const or_options_t *options, time_t now) -{ - int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO); - int ask_bridge_directly; - int can_use_bridge_authority; - - if (!bridge_list) - return; - - /* If we still have unconfigured managed proxies, don't go and - connect to a bridge. */ - if (pt_proxies_configuration_pending()) - return; - - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - /* This resets the download status on first use */ - if (!download_status_is_ready(&bridge->fetch_status, now, - IMPOSSIBLE_TO_DOWNLOAD)) - continue; /* don't bother, no need to retry yet */ - if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { - download_status_mark_impossible(&bridge->fetch_status); - log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", - safe_str_client(fmt_and_decorate_addr(&bridge->addr))); - continue; - } - - /* schedule the next attempt - * we can't increment after a failure, because sometimes we use the - * bridge authority, and sometimes we use the bridge direct */ - download_status_increment_attempt( - &bridge->fetch_status, - safe_str_client(fmt_and_decorate_addr(&bridge->addr)), - now); - - can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) && - num_bridge_auths; - ask_bridge_directly = !can_use_bridge_authority || - !options->UpdateBridgesFromAuthority; - log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)", - ask_bridge_directly, tor_digest_is_zero(bridge->identity), - !options->UpdateBridgesFromAuthority, !num_bridge_auths); - - if (ask_bridge_directly && - !fascist_firewall_allows_address_addr(&bridge->addr, bridge->port, - FIREWALL_OR_CONNECTION, 0, - 0)) { - log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our " - "firewall policy. %s.", - fmt_addrport(&bridge->addr, bridge->port), - can_use_bridge_authority ? - "Asking bridge authority instead" : "Skipping"); - if (can_use_bridge_authority) - ask_bridge_directly = 0; - else - continue; - } - - if (ask_bridge_directly) { - /* we need to ask the bridge itself for its descriptor. */ - launch_direct_bridge_descriptor_fetch(bridge); - } else { - /* We have a digest and we want to ask an authority. We could - * combine all the requests into one, but that may give more - * hints to the bridge authority than we want to give. */ - char resource[10 + HEX_DIGEST_LEN]; - memcpy(resource, "fp/", 3); - base16_encode(resource+3, HEX_DIGEST_LEN+1, - bridge->identity, DIGEST_LEN); - memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3); - log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.", - resource); - directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, resource, 0, DL_WANT_AUTHORITY); - } - } - SMARTLIST_FOREACH_END(bridge); -} - -/** If our bridge is configured to be a different address than - * the bridge gives in node, rewrite the routerinfo - * we received to use the address we meant to use. Now we handle - * multihomed bridges better. - */ -static void -rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node) -{ - /* XXXX move this function. */ - /* XXXX overridden addresses should really live in the node_t, so that the - * routerinfo_t and the microdesc_t can be immutable. But we can only - * do that safely if we know that no function that connects to an OR - * does so through an address from any source other than node_get_addr(). - */ - tor_addr_t addr; - const or_options_t *options = get_options(); - - if (node->ri) { - routerinfo_t *ri = node->ri; - tor_addr_from_ipv4h(&addr, ri->addr); - - if ((!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && - bridge->port == ri->or_port) || - (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) && - bridge->port == ri->ipv6_orport)) { - /* they match, so no need to do anything */ - } else { - if (tor_addr_family(&bridge->addr) == AF_INET) { - ri->addr = tor_addr_to_ipv4h(&bridge->addr); - ri->or_port = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerinfo for '%s' to match configured " - "address %s:%d.", - ri->nickname, fmt_addr32(ri->addr), ri->or_port); - } else if (tor_addr_family(&bridge->addr) == AF_INET6) { - tor_addr_copy(&ri->ipv6_addr, &bridge->addr); - ri->ipv6_orport = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerinfo for '%s' to match configured " - "address %s.", - ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport)); - } else { - log_err(LD_BUG, "Address family not supported: %d.", - tor_addr_family(&bridge->addr)); - return; - } - } - - if (options->ClientPreferIPv6ORPort == -1) { - /* Mark which address to use based on which bridge_t we got. */ - node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 && - !tor_addr_is_null(&node->ri->ipv6_addr)); - } else { - /* Mark which address to use based on user preference */ - node->ipv6_preferred = (fascist_firewall_prefer_ipv6_orport(options) && - !tor_addr_is_null(&node->ri->ipv6_addr)); - } - - /* XXXipv6 we lack support for falling back to another address for - the same relay, warn the user */ - if (!tor_addr_is_null(&ri->ipv6_addr)) { - tor_addr_port_t ap; - node_get_pref_orport(node, &ap); - log_notice(LD_CONFIG, - "Bridge '%s' has both an IPv4 and an IPv6 address. " - "Will prefer using its %s address (%s) based on %s.", - ri->nickname, - node->ipv6_preferred ? "IPv6" : "IPv4", - fmt_addrport(&ap.addr, ap.port), - options->ClientPreferIPv6ORPort == -1 ? - "the configured Bridge address" : - "ClientPreferIPv6ORPort"); - } - } - if (node->rs) { - routerstatus_t *rs = node->rs; - tor_addr_from_ipv4h(&addr, rs->addr); - - if (!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && - bridge->port == rs->or_port) { - /* they match, so no need to do anything */ - } else { - rs->addr = tor_addr_to_ipv4h(&bridge->addr); - rs->or_port = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerstatus for '%s' to match " - "configured address %s.", - rs->nickname, fmt_addrport(&bridge->addr, rs->or_port)); - } - } -} - -/** We just learned a descriptor for a bridge. See if that - * digest is in our entry guard list, and add it if not. */ -void -learned_bridge_descriptor(routerinfo_t *ri, int from_cache) -{ - tor_assert(ri); - tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); - if (get_options()->UseBridges) { - /* Retry directory downloads whenever we get a bridge descriptor: - * - when bootstrapping, and - * - when we aren't sure if any of our bridges are reachable. - * Keep on retrying until we have at least one reachable bridge. */ - int first = num_bridges_usable(0) < 1; - bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri); - time_t now = time(NULL); - router_set_status(ri->cache_info.identity_digest, 1); - - if (bridge) { /* if we actually want to use this one */ - node_t *node; - /* it's here; schedule its re-fetch for a long time from now. */ - if (!from_cache) { - /* This schedules the re-fetch at a constant interval, which produces - * a pattern of bridge traffic. But it's better than trying all - * configured briges several times in the first few minutes. */ - download_status_reset(&bridge->fetch_status); - } - - node = node_get_mutable_by_id(ri->cache_info.identity_digest); - tor_assert(node); - rewrite_node_address_for_bridge(bridge, node); - if (tor_digest_is_zero(bridge->identity)) { - memcpy(bridge->identity,ri->cache_info.identity_digest, DIGEST_LEN); - log_notice(LD_DIR, "Learned identity %s for bridge at %s:%d", - hex_str(bridge->identity, DIGEST_LEN), - fmt_and_decorate_addr(&bridge->addr), - (int) bridge->port); - } - entry_guard_learned_bridge_identity(&bridge->addrport_configured, - (const uint8_t*)ri->cache_info.identity_digest); - - log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname, - from_cache ? "cached" : "fresh", router_describe(ri)); - /* If we didn't have a reachable bridge before this one, try directory - * documents again. */ - if (first) { - routerlist_retry_directory_downloads(now); - } - } - } -} - -/** Return a smartlist containing all bridge identity digests */ -MOCK_IMPL(smartlist_t *, -list_bridge_identities, (void)) -{ - smartlist_t *result = NULL; - char *digest_tmp; - - if (get_options()->UseBridges && bridge_list) { - result = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) { - digest_tmp = tor_malloc(DIGEST_LEN); - memcpy(digest_tmp, b->identity, DIGEST_LEN); - smartlist_add(result, digest_tmp); - } SMARTLIST_FOREACH_END(b); - } - - return result; -} - -/** Get the download status for a bridge descriptor given its identity */ -MOCK_IMPL(download_status_t *, -get_bridge_dl_status_by_id, (const char *digest)) -{ - download_status_t *dl = NULL; - - if (digest && get_options()->UseBridges && bridge_list) { - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) { - if (tor_memeq(digest, b->identity, DIGEST_LEN)) { - dl = &(b->fetch_status); - break; - } - } SMARTLIST_FOREACH_END(b); - } - - return dl; -} - -/** Release all storage held in bridges.c */ -void -bridges_free_all(void) -{ - clear_bridge_list(); - smartlist_free(bridge_list); - bridge_list = NULL; -} - diff --git a/src/tor/src/or/bridges.h b/src/tor/src/or/bridges.h deleted file mode 100644 index 54a625025..000000000 --- a/src/tor/src/or/bridges.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file bridges.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_BRIDGES_H -#define TOR_BRIDGES_H - -struct bridge_line_t; - -/* Opaque handle to a configured bridge */ -typedef struct bridge_info_t bridge_info_t; - -void mark_bridge_list(void); -void sweep_bridge_list(void); -const smartlist_t *bridge_list_get(void); -bridge_info_t *find_bridge_by_digest(const char *digest); -const uint8_t *bridge_get_rsa_id_digest(const bridge_info_t *bridge); -const tor_addr_port_t * bridge_get_addr_port(const bridge_info_t *bridge); -bridge_info_t *get_configured_bridge_by_addr_port_digest( - const tor_addr_t *addr, - uint16_t port, - const char *digest); -bridge_info_t *get_configured_bridge_by_exact_addr_port_digest( - const tor_addr_t *addr, - uint16_t port, - const char *digest); - -int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, - const char *digest); -int extend_info_is_a_configured_bridge(const extend_info_t *ei); -int routerinfo_is_a_configured_bridge(const routerinfo_t *ri); -int node_is_a_configured_bridge(const node_t *node); -void learned_router_identity(const tor_addr_t *addr, uint16_t port, - const char *digest, - const ed25519_public_key_t *ed_id); - -void bridge_add_from_config(struct bridge_line_t *bridge_line); -void retry_bridge_descriptor_fetch_directly(const char *digest); -void fetch_bridge_descriptors(const or_options_t *options, time_t now); -void learned_bridge_descriptor(routerinfo_t *ri, int from_cache); -const smartlist_t *get_socks_args_by_bridge_addrport(const tor_addr_t *addr, - uint16_t port); - -int any_bridges_dont_support_microdescriptors(void); - -const char *find_transport_name_by_bridge_addrport(const tor_addr_t *addr, - uint16_t port); -struct transport_t; -int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, - const struct transport_t **transport); - -MOCK_DECL(int, transport_is_needed, (const char *transport_name)); -int validate_pluggable_transports_config(void); - -MOCK_DECL(smartlist_t *, list_bridge_identities, (void)); -MOCK_DECL(download_status_t *, get_bridge_dl_status_by_id, - (const char *digest)); - -void bridges_free_all(void); - -#endif /* !defined(TOR_BRIDGES_H) */ - diff --git a/src/tor/src/or/channelpadding.c b/src/tor/src/or/channelpadding.c deleted file mode 100644 index 70a906d23..000000000 --- a/src/tor/src/or/channelpadding.c +++ /dev/null @@ -1,797 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2015, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* TOR_CHANNEL_INTERNAL_ define needed for an O(1) implementation of - * channelpadding_channel_to_channelinfo() */ -#define TOR_CHANNEL_INTERNAL_ - -#include "or.h" -#include "channel.h" -#include "channelpadding.h" -#include "channeltls.h" -#include "config.h" -#include "networkstatus.h" -#include "connection.h" -#include "connection_or.h" -#include "main.h" -#include "rephist.h" -#include "router.h" -#include "compat_time.h" -#include -#include "rendservice.h" - -STATIC int32_t channelpadding_get_netflow_inactive_timeout_ms( - const channel_t *); -STATIC int channelpadding_send_disable_command(channel_t *); -STATIC int64_t channelpadding_compute_time_until_pad_for_netflow(channel_t *); - -/** The total number of pending channelpadding timers */ -static uint64_t total_timers_pending; - -/** These are cached consensus parameters for netflow */ -/** The timeout lower bound that is allowed before sending padding */ -static int consensus_nf_ito_low; -/** The timeout upper bound that is allowed before sending padding */ -static int consensus_nf_ito_high; -/** The timeout lower bound that is allowed before sending reduced padding */ -static int consensus_nf_ito_low_reduced; -/** The timeout upper bound that is allowed before sending reduced padding */ -static int consensus_nf_ito_high_reduced; -/** The connection timeout between relays */ -static int consensus_nf_conntimeout_relays; -/** The connection timeout for client connections */ -static int consensus_nf_conntimeout_clients; -/** Should we pad before circuits are actually used for client data? */ -static int consensus_nf_pad_before_usage; -/** Should we pad relay-to-relay connections? */ -static int consensus_nf_pad_relays; -/** Should we pad tor2web connections? */ -static int consensus_nf_pad_tor2web; -/** Should we pad rosos connections? */ -static int consensus_nf_pad_single_onion; - -#define TOR_MSEC_PER_SEC 1000 -#define TOR_USEC_PER_MSEC 1000 - -/** - * How often do we get called by the connection housekeeping (ie: once - * per second) */ -#define TOR_HOUSEKEEPING_CALLBACK_MSEC 1000 -/** - * Additional extra time buffer on the housekeeping callback, since - * it can be delayed. This extra slack is used to decide if we should - * schedule a timer or wait for the next callback. */ -#define TOR_HOUSEKEEPING_CALLBACK_SLACK_MSEC 100 - -/** - * This macro tells us if either end of the channel is connected to a client. - * (If we're not a server, we're definitely a client. If the channel thinks - * its a client, use that. Then finally verify in the consensus). - */ -#define CHANNEL_IS_CLIENT(chan, options) \ - (!public_server_mode((options)) || channel_is_client(chan) || \ - !connection_or_digest_is_known_relay((chan)->identity_digest)) - -/** - * This function is called to update cached consensus parameters every time - * there is a consensus update. This allows us to move the consensus param - * search off of the critical path, so it does not need to be evaluated - * for every single connection, every second. - */ -void -channelpadding_new_consensus_params(networkstatus_t *ns) -{ -#define DFLT_NETFLOW_INACTIVE_KEEPALIVE_LOW 1500 -#define DFLT_NETFLOW_INACTIVE_KEEPALIVE_HIGH 9500 -#define DFLT_NETFLOW_INACTIVE_KEEPALIVE_MIN 0 -#define DFLT_NETFLOW_INACTIVE_KEEPALIVE_MAX 60000 - consensus_nf_ito_low = networkstatus_get_param(ns, "nf_ito_low", - DFLT_NETFLOW_INACTIVE_KEEPALIVE_LOW, - DFLT_NETFLOW_INACTIVE_KEEPALIVE_MIN, - DFLT_NETFLOW_INACTIVE_KEEPALIVE_MAX); - consensus_nf_ito_high = networkstatus_get_param(ns, "nf_ito_high", - DFLT_NETFLOW_INACTIVE_KEEPALIVE_HIGH, - consensus_nf_ito_low, - DFLT_NETFLOW_INACTIVE_KEEPALIVE_MAX); - -#define DFLT_NETFLOW_REDUCED_KEEPALIVE_LOW 9000 -#define DFLT_NETFLOW_REDUCED_KEEPALIVE_HIGH 14000 -#define DFLT_NETFLOW_REDUCED_KEEPALIVE_MIN 0 -#define DFLT_NETFLOW_REDUCED_KEEPALIVE_MAX 60000 - consensus_nf_ito_low_reduced = - networkstatus_get_param(ns, "nf_ito_low_reduced", - DFLT_NETFLOW_REDUCED_KEEPALIVE_LOW, - DFLT_NETFLOW_REDUCED_KEEPALIVE_MIN, - DFLT_NETFLOW_REDUCED_KEEPALIVE_MAX); - - consensus_nf_ito_high_reduced = - networkstatus_get_param(ns, "nf_ito_high_reduced", - DFLT_NETFLOW_REDUCED_KEEPALIVE_HIGH, - consensus_nf_ito_low_reduced, - DFLT_NETFLOW_REDUCED_KEEPALIVE_MAX); - -#define CONNTIMEOUT_RELAYS_DFLT (60*60) // 1 hour -#define CONNTIMEOUT_RELAYS_MIN 60 -#define CONNTIMEOUT_RELAYS_MAX (7*24*60*60) // 1 week - consensus_nf_conntimeout_relays = - networkstatus_get_param(ns, "nf_conntimeout_relays", - CONNTIMEOUT_RELAYS_DFLT, - CONNTIMEOUT_RELAYS_MIN, - CONNTIMEOUT_RELAYS_MAX); - -#define CIRCTIMEOUT_CLIENTS_DFLT (30*60) // 30 minutes -#define CIRCTIMEOUT_CLIENTS_MIN 60 -#define CIRCTIMEOUT_CLIENTS_MAX (24*60*60) // 24 hours - consensus_nf_conntimeout_clients = - networkstatus_get_param(ns, "nf_conntimeout_clients", - CIRCTIMEOUT_CLIENTS_DFLT, - CIRCTIMEOUT_CLIENTS_MIN, - CIRCTIMEOUT_CLIENTS_MAX); - - consensus_nf_pad_before_usage = - networkstatus_get_param(ns, "nf_pad_before_usage", 1, 0, 1); - - consensus_nf_pad_relays = - networkstatus_get_param(ns, "nf_pad_relays", 0, 0, 1); - - consensus_nf_pad_tor2web = - networkstatus_get_param(ns, - CHANNELPADDING_TOR2WEB_PARAM, - CHANNELPADDING_TOR2WEB_DEFAULT, 0, 1); - - consensus_nf_pad_single_onion = - networkstatus_get_param(ns, - CHANNELPADDING_SOS_PARAM, - CHANNELPADDING_SOS_DEFAULT, 0, 1); -} - -/** - * Get a random netflow inactive timeout keepalive period in milliseconds, - * the range for which is determined by consensus parameters, negotiation, - * configuration, or default values. The consensus parameters enforce the - * minimum possible value, to avoid excessively frequent padding. - * - * The ranges for this value were chosen to be low enough to ensure that - * routers do not emit a new netflow record for a connection due to it - * being idle. - * - * Specific timeout values for major routers are listed in Proposal 251. - * No major router appeared capable of setting an inactive timeout below 10 - * seconds, so we set the defaults below that value, since we can always - * scale back if it ends up being too much padding. - * - * Returns the next timeout period (in milliseconds) after which we should - * send a padding packet, or 0 if padding is disabled. - */ -STATIC int32_t -channelpadding_get_netflow_inactive_timeout_ms(const channel_t *chan) -{ - int low_timeout = consensus_nf_ito_low; - int high_timeout = consensus_nf_ito_high; - int X1, X2; - - if (low_timeout == 0 && low_timeout == high_timeout) - return 0; // No padding - - /* If we have negotiated different timeout values, use those, but - * don't allow them to be lower than the consensus ones */ - if (chan->padding_timeout_low_ms && chan->padding_timeout_high_ms) { - low_timeout = MAX(low_timeout, chan->padding_timeout_low_ms); - high_timeout = MAX(high_timeout, chan->padding_timeout_high_ms); - } - - if (low_timeout == high_timeout) - return low_timeout; // No randomization - - /* - * This MAX() hack is here because we apply the timeout on both the client - * and the server. This creates the situation where the total time before - * sending a packet in either direction is actually - * min(client_timeout,server_timeout). - * - * If X is a random variable uniform from 0..R-1 (where R=high-low), - * then Y=max(X,X) has Prob(Y == i) = (2.0*i + 1)/(R*R). - * - * If we create a third random variable Z=min(Y,Y), then it turns out that - * Exp[Z] ~= Exp[X]. Here's a table: - * - * R Exp[X] Exp[Z] Exp[min(X,X)] Exp[max(X,X)] - * 2000 999.5 1066 666.2 1332.8 - * 3000 1499.5 1599.5 999.5 1999.5 - * 5000 2499.5 2666 1666.2 3332.8 - * 6000 2999.5 3199.5 1999.5 3999.5 - * 7000 3499.5 3732.8 2332.8 4666.2 - * 8000 3999.5 4266.2 2666.2 5332.8 - * 10000 4999.5 5328 3332.8 6666.2 - * 15000 7499.5 7995 4999.5 9999.5 - * 20000 9900.5 10661 6666.2 13332.8 - * - * In other words, this hack makes it so that when both the client and - * the guard are sending this padding, then the averages work out closer - * to the midpoint of the range, making the overhead easier to tune. - * If only one endpoint is padding (for example: if the relay does not - * support padding, but the client has set ConnectionPadding 1; or - * if the relay does support padding, but the client has set - * ReducedConnectionPadding 1), then the defense will still prevent - * record splitting, but with less overhead than the midpoint - * (as seen by the Exp[max(X,X)] column). - * - * To calculate average padding packet frequency (and thus overhead), - * index into the table by picking a row based on R = high-low. Then, - * use the appropriate column (Exp[Z] for two-sided padding, and - * Exp[max(X,X)] for one-sided padding). Finally, take this value - * and add it to the low timeout value. This value is the average - * frequency which padding packets will be sent. - */ - - X1 = crypto_rand_int(high_timeout - low_timeout); - X2 = crypto_rand_int(high_timeout - low_timeout); - return low_timeout + MAX(X1, X2); -} - -/** - * Update this channel's padding settings based on the PADDING_NEGOTIATE - * contents. - * - * Returns -1 on error; 1 on success. - */ -int -channelpadding_update_padding_for_channel(channel_t *chan, - const channelpadding_negotiate_t *pad_vars) -{ - if (pad_vars->version != 0) { - static ratelim_t version_limit = RATELIM_INIT(600); - - log_fn_ratelim(&version_limit,LOG_PROTOCOL_WARN,LD_PROTOCOL, - "Got a PADDING_NEGOTIATE cell with an unknown version. Ignoring."); - return -1; - } - - // We should not allow malicious relays to disable or reduce padding for - // us as clients. In fact, we should only accept this cell at all if we're - // operating as a relay. Bridges should not accept it from relays, either - // (only from their clients). - if ((get_options()->BridgeRelay && - connection_or_digest_is_known_relay(chan->identity_digest)) || - !get_options()->ORPort_set) { - static ratelim_t relay_limit = RATELIM_INIT(600); - - log_fn_ratelim(&relay_limit,LOG_PROTOCOL_WARN,LD_PROTOCOL, - "Got a PADDING_NEGOTIATE from relay at %s (%s). " - "This should not happen.", - chan->get_remote_descr(chan, 0), - hex_str(chan->identity_digest, DIGEST_LEN)); - return -1; - } - - chan->padding_enabled = (pad_vars->command == CHANNELPADDING_COMMAND_START); - - /* Min must not be lower than the current consensus parameter - nf_ito_low. */ - chan->padding_timeout_low_ms = MAX(consensus_nf_ito_low, - pad_vars->ito_low_ms); - - /* Max must not be lower than ito_low_ms */ - chan->padding_timeout_high_ms = MAX(chan->padding_timeout_low_ms, - pad_vars->ito_high_ms); - - log_fn(LOG_INFO,LD_OR, - "Negotiated padding=%d, lo=%d, hi=%d on "U64_FORMAT, - chan->padding_enabled, chan->padding_timeout_low_ms, - chan->padding_timeout_high_ms, - U64_PRINTF_ARG(chan->global_identifier)); - - return 1; -} - -/** - * Sends a CELL_PADDING_NEGOTIATE on the channel to tell the other side not - * to send padding. - * - * Returns -1 on error, 0 on success. - */ -STATIC int -channelpadding_send_disable_command(channel_t *chan) -{ - channelpadding_negotiate_t disable; - cell_t cell; - - tor_assert(BASE_CHAN_TO_TLS(chan)->conn->link_proto >= - MIN_LINK_PROTO_FOR_CHANNEL_PADDING); - - memset(&cell, 0, sizeof(cell_t)); - memset(&disable, 0, sizeof(channelpadding_negotiate_t)); - cell.command = CELL_PADDING_NEGOTIATE; - - channelpadding_negotiate_set_command(&disable, CHANNELPADDING_COMMAND_STOP); - - if (channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, - &disable) < 0) - return -1; - - if (chan->write_cell(chan, &cell) == 1) - return 0; - else - return -1; -} - -/** - * Sends a CELL_PADDING_NEGOTIATE on the channel to tell the other side to - * resume sending padding at some rate. - * - * Returns -1 on error, 0 on success. - */ -int -channelpadding_send_enable_command(channel_t *chan, uint16_t low_timeout, - uint16_t high_timeout) -{ - channelpadding_negotiate_t enable; - cell_t cell; - - tor_assert(BASE_CHAN_TO_TLS(chan)->conn->link_proto >= - MIN_LINK_PROTO_FOR_CHANNEL_PADDING); - - memset(&cell, 0, sizeof(cell_t)); - memset(&enable, 0, sizeof(channelpadding_negotiate_t)); - cell.command = CELL_PADDING_NEGOTIATE; - - channelpadding_negotiate_set_command(&enable, CHANNELPADDING_COMMAND_START); - channelpadding_negotiate_set_ito_low_ms(&enable, low_timeout); - channelpadding_negotiate_set_ito_high_ms(&enable, high_timeout); - - if (channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, - &enable) < 0) - return -1; - - if (chan->write_cell(chan, &cell) == 1) - return 0; - else - return -1; -} - -/** - * Sends a CELL_PADDING cell on a channel if it has been idle since - * our callback was scheduled. - * - * This function also clears the pending padding timer and the callback - * flags. - */ -static void -channelpadding_send_padding_cell_for_callback(channel_t *chan) -{ - cell_t cell; - - /* Check that the channel is still valid and open */ - if (!chan || chan->state != CHANNEL_STATE_OPEN) { - if (chan) chan->pending_padding_callback = 0; - log_fn(LOG_INFO,LD_OR, - "Scheduled a netflow padding cell, but connection already closed."); - return; - } - - /* We should have a pending callback flag set. */ - if (BUG(chan->pending_padding_callback == 0)) - return; - - chan->pending_padding_callback = 0; - - if (monotime_coarse_is_zero(&chan->next_padding_time) || - chan->has_queued_writes(chan)) { - /* We must have been active before the timer fired */ - monotime_coarse_zero(&chan->next_padding_time); - return; - } - - { - monotime_coarse_t now; - monotime_coarse_get(&now); - - log_fn(LOG_INFO,LD_OR, - "Sending netflow keepalive on "U64_FORMAT" to %s (%s) after " - I64_FORMAT" ms. Delta "I64_FORMAT"ms", - U64_PRINTF_ARG(chan->global_identifier), - safe_str_client(chan->get_remote_descr(chan, 0)), - safe_str_client(hex_str(chan->identity_digest, DIGEST_LEN)), - I64_PRINTF_ARG(monotime_coarse_diff_msec(&chan->timestamp_xfer,&now)), - I64_PRINTF_ARG( - monotime_coarse_diff_msec(&chan->next_padding_time,&now))); - } - - /* Clear the timer */ - monotime_coarse_zero(&chan->next_padding_time); - - /* Send the padding cell. This will cause the channel to get a - * fresh timestamp_active */ - memset(&cell, 0, sizeof(cell)); - cell.command = CELL_PADDING; - chan->write_cell(chan, &cell); -} - -/** - * tor_timer callback function for us to send padding on an idle channel. - * - * This function just obtains the channel from the callback handle, ensures - * it is still valid, and then hands it off to - * channelpadding_send_padding_cell_for_callback(), which checks if - * the channel is still idle before sending padding. - */ -static void -channelpadding_send_padding_callback(tor_timer_t *timer, void *args, - const struct monotime_t *when) -{ - channel_t *chan = channel_handle_get((struct channel_handle_t*)args); - (void)timer; (void)when; - - if (chan && CHANNEL_CAN_HANDLE_CELLS(chan)) { - /* Hrmm.. It might be nice to have an equivalent to assert_connection_ok - * for channels. Then we could get rid of the channeltls dependency */ - tor_assert(TO_CONN(BASE_CHAN_TO_TLS(chan)->conn)->magic == - OR_CONNECTION_MAGIC); - assert_connection_ok(TO_CONN(BASE_CHAN_TO_TLS(chan)->conn), approx_time()); - - channelpadding_send_padding_cell_for_callback(chan); - } else { - log_fn(LOG_INFO,LD_OR, - "Channel closed while waiting for timer."); - } - - total_timers_pending--; -} - -/** - * Schedules a callback to send padding on a channel in_ms milliseconds from - * now. - * - * Returns CHANNELPADDING_WONTPAD on error, CHANNELPADDING_PADDING_SENT if we - * sent the packet immediately without a timer, and - * CHANNELPADDING_PADDING_SCHEDULED if we decided to schedule a timer. - */ -static channelpadding_decision_t -channelpadding_schedule_padding(channel_t *chan, int in_ms) -{ - struct timeval timeout; - tor_assert(!chan->pending_padding_callback); - - if (in_ms <= 0) { - chan->pending_padding_callback = 1; - channelpadding_send_padding_cell_for_callback(chan); - return CHANNELPADDING_PADDING_SENT; - } - - timeout.tv_sec = in_ms/TOR_MSEC_PER_SEC; - timeout.tv_usec = (in_ms%TOR_USEC_PER_MSEC)*TOR_USEC_PER_MSEC; - - if (!chan->timer_handle) { - chan->timer_handle = channel_handle_new(chan); - } - - if (chan->padding_timer) { - timer_set_cb(chan->padding_timer, - channelpadding_send_padding_callback, - chan->timer_handle); - } else { - chan->padding_timer = timer_new(channelpadding_send_padding_callback, - chan->timer_handle); - } - timer_schedule(chan->padding_timer, &timeout); - - rep_hist_padding_count_timers(++total_timers_pending); - - chan->pending_padding_callback = 1; - return CHANNELPADDING_PADDING_SCHEDULED; -} - -/** - * Calculates the number of milliseconds from now to schedule a padding cell. - * - * Returns the number of milliseconds from now (relative) to schedule the - * padding callback. If the padding timer is more than 1.1 seconds in the - * future, we return -1, to avoid scheduling excessive callbacks. If padding - * is disabled in the consensus, we return -2. - * - * Side-effects: Updates chan->next_padding_time_ms, storing an (absolute, not - * relative) millisecond representation of when we should send padding, unless - * other activity happens first. This side-effect allows us to avoid - * scheduling a libevent callback until we're within 1.1 seconds of the padding - * time. - */ -#define CHANNELPADDING_TIME_LATER -1 -#define CHANNELPADDING_TIME_DISABLED -2 -STATIC int64_t -channelpadding_compute_time_until_pad_for_netflow(channel_t *chan) -{ - monotime_coarse_t now; - monotime_coarse_get(&now); - - if (monotime_coarse_is_zero(&chan->next_padding_time)) { - /* If the below line or crypto_rand_int() shows up on a profile, - * we can avoid getting a timeout until we're at least nf_ito_lo - * from a timeout window. That will prevent us from setting timers - * on connections that were active up to 1.5 seconds ago. - * Idle connections should only call this once every 5.5s on average - * though, so that might be a micro-optimization for little gain. */ - int32_t padding_timeout = - channelpadding_get_netflow_inactive_timeout_ms(chan); - - if (!padding_timeout) - return CHANNELPADDING_TIME_DISABLED; - - monotime_coarse_add_msec(&chan->next_padding_time, - &chan->timestamp_xfer, - padding_timeout); - } - - const int64_t ms_till_pad = - monotime_coarse_diff_msec(&now, &chan->next_padding_time); - - /* If the next padding time is beyond the maximum possible consensus value, - * then this indicates a clock jump, so just send padding now. This is - * better than using monotonic time because we want to avoid the situation - * where we wait around forever for monotonic time to move forward after - * a clock jump far into the past. - */ - if (ms_till_pad > DFLT_NETFLOW_INACTIVE_KEEPALIVE_MAX) { - tor_fragile_assert(); - log_warn(LD_BUG, - "Channel padding timeout scheduled "I64_FORMAT"ms in the future. " - "Did the monotonic clock just jump?", - I64_PRINTF_ARG(ms_till_pad)); - return 0; /* Clock jumped: Send padding now */ - } - - /* If the timeout will expire before the next time we're called (1000ms - from now, plus some slack), then calculate the number of milliseconds - from now which we should send padding, so we can schedule a callback - then. - */ - if (ms_till_pad < (TOR_HOUSEKEEPING_CALLBACK_MSEC + - TOR_HOUSEKEEPING_CALLBACK_SLACK_MSEC)) { - /* If the padding time is in the past, that means that libevent delayed - * calling the once-per-second callback due to other work taking too long. - * See https://bugs.torproject.org/22212 and - * https://bugs.torproject.org/16585. This is a systemic problem - * with being single-threaded, but let's emit a notice if this - * is long enough in the past that we might have missed a netflow window, - * and allowed a router to emit a netflow frame, just so we don't forget - * about it entirely.. */ -#define NETFLOW_MISSED_WINDOW (150000 - DFLT_NETFLOW_INACTIVE_KEEPALIVE_HIGH) - if (ms_till_pad < 0) { - int severity = (ms_till_pad < -NETFLOW_MISSED_WINDOW) - ? LOG_NOTICE : LOG_INFO; - log_fn(severity, LD_OR, - "Channel padding timeout scheduled "I64_FORMAT"ms in the past. ", - I64_PRINTF_ARG(-ms_till_pad)); - return 0; /* Clock jumped: Send padding now */ - } - - return ms_till_pad; - } - return CHANNELPADDING_TIME_LATER; -} - -/** - * Returns a randomized value for channel idle timeout in seconds. - * The channel idle timeout governs how quickly we close a channel - * after its last circuit has disappeared. - * - * There are three classes of channels: - * 1. Client+non-canonical. These live for 3-4.5 minutes - * 2. relay to relay. These live for 45-75 min by default - * 3. Reduced padding clients. These live for 1.5-2.25 minutes. - * - * Also allows the default relay-to-relay value to be controlled by the - * consensus. - */ -unsigned int -channelpadding_get_channel_idle_timeout(const channel_t *chan, - int is_canonical) -{ - const or_options_t *options = get_options(); - unsigned int timeout; - - /* Non-canonical and client channels only last for 3-4.5 min when idle */ - if (!is_canonical || CHANNEL_IS_CLIENT(chan, options)) { -#define CONNTIMEOUT_CLIENTS_BASE 180 // 3 to 4.5 min - timeout = CONNTIMEOUT_CLIENTS_BASE - + crypto_rand_int(CONNTIMEOUT_CLIENTS_BASE/2); - } else { // Canonical relay-to-relay channels - // 45..75min or consensus +/- 25% - timeout = consensus_nf_conntimeout_relays; - timeout = 3*timeout/4 + crypto_rand_int(timeout/2); - } - - /* If ReducedConnectionPadding is set, we want to halve the duration of - * the channel idle timeout, since reducing the additional time that - * a channel stays open will reduce the total overhead for making - * new channels. This reduction in overhead/channel expense - * is important for mobile users. The option cannot be set by relays. - * - * We also don't reduce any values for timeout that the user explicitly - * set. - */ - if (options->ReducedConnectionPadding - && !options->CircuitsAvailableTimeout) { - timeout /= 2; - } - - return timeout; -} - -/** - * This function controls how long we keep idle circuits open, - * and how long we build predicted circuits. This behavior is under - * the control of channelpadding because circuit availability is the - * dominant factor in channel lifespan, which influences total padding - * overhead. - * - * Returns a randomized number of seconds in a range from - * CircuitsAvailableTimeout to 2*CircuitsAvailableTimeout. This value is halved - * if ReducedConnectionPadding is set. The default value of - * CircuitsAvailableTimeout can be controlled by the consensus. - */ -int -channelpadding_get_circuits_available_timeout(void) -{ - const or_options_t *options = get_options(); - int timeout = options->CircuitsAvailableTimeout; - - if (!timeout) { - timeout = consensus_nf_conntimeout_clients; - - /* If ReducedConnectionPadding is set, we want to halve the duration of - * the channel idle timeout, since reducing the additional time that - * a channel stays open will reduce the total overhead for making - * new connections. This reduction in overhead/connection expense - * is important for mobile users. The option cannot be set by relays. - * - * We also don't reduce any values for timeout that the user explicitly - * set. - */ - if (options->ReducedConnectionPadding) { - // half the value to 15..30min by default - timeout /= 2; - } - } - - // 30..60min by default - timeout = timeout + crypto_rand_int(timeout); - - return timeout; -} - -/** - * Calling this function on a channel causes it to tell the other side - * not to send padding, and disables sending padding from this side as well. - */ -void -channelpadding_disable_padding_on_channel(channel_t *chan) -{ - chan->padding_enabled = 0; - - // Send cell to disable padding on the other end - channelpadding_send_disable_command(chan); -} - -/** - * Calling this function on a channel causes it to tell the other side - * not to send padding, and reduces the rate that padding is sent from - * this side. - */ -void -channelpadding_reduce_padding_on_channel(channel_t *chan) -{ - /* Padding can be forced and reduced by clients, regardless of if - * the channel supports it. So we check for support here before - * sending any commands. */ - if (chan->padding_enabled) { - channelpadding_send_disable_command(chan); - } - - chan->padding_timeout_low_ms = consensus_nf_ito_low_reduced; - chan->padding_timeout_high_ms = consensus_nf_ito_high_reduced; - - log_fn(LOG_INFO,LD_OR, - "Reduced padding on channel "U64_FORMAT": lo=%d, hi=%d", - U64_PRINTF_ARG(chan->global_identifier), - chan->padding_timeout_low_ms, chan->padding_timeout_high_ms); -} - -/** - * This function is called once per second by run_connection_housekeeping(), - * but only if the channel is still open, valid, and non-wedged. - * - * It decides if and when we should send a padding cell, and if needed, - * schedules a callback to send that cell at the appropriate time. - * - * Returns an enum that represents the current padding decision state. - * Return value is currently used only by unit tests. - */ -channelpadding_decision_t -channelpadding_decide_to_pad_channel(channel_t *chan) -{ - const or_options_t *options = get_options(); - - /* Only pad open channels */ - if (chan->state != CHANNEL_STATE_OPEN) - return CHANNELPADDING_WONTPAD; - - if (chan->channel_usage == CHANNEL_USED_FOR_FULL_CIRCS) { - if (!consensus_nf_pad_before_usage) - return CHANNELPADDING_WONTPAD; - } else if (chan->channel_usage != CHANNEL_USED_FOR_USER_TRAFFIC) { - return CHANNELPADDING_WONTPAD; - } - - if (chan->pending_padding_callback) - return CHANNELPADDING_PADDING_ALREADY_SCHEDULED; - - /* Don't pad the channel if we didn't negotiate it, but still - * allow clients to force padding if options->ChannelPadding is - * explicitly set to 1. - */ - if (!chan->padding_enabled && options->ConnectionPadding != 1) { - return CHANNELPADDING_WONTPAD; - } - - if (options->Tor2webMode && !consensus_nf_pad_tor2web) { - /* If the consensus just changed values, this channel may still - * think padding is enabled. Negotiate it off. */ - if (chan->padding_enabled) - channelpadding_disable_padding_on_channel(chan); - - return CHANNELPADDING_WONTPAD; - } - - if (rend_service_allow_non_anonymous_connection(options) && - !consensus_nf_pad_single_onion) { - /* If the consensus just changed values, this channel may still - * think padding is enabled. Negotiate it off. */ - if (chan->padding_enabled) - channelpadding_disable_padding_on_channel(chan); - - return CHANNELPADDING_WONTPAD; - } - - if (!chan->has_queued_writes(chan)) { - int is_client_channel = 0; - - if (CHANNEL_IS_CLIENT(chan, options)) { - is_client_channel = 1; - } - - /* If nf_pad_relays=1 is set in the consensus, we pad - * on *all* idle connections, relay-relay or relay-client. - * Otherwise pad only for client+bridge cons */ - if (is_client_channel || consensus_nf_pad_relays) { - int64_t pad_time_ms = - channelpadding_compute_time_until_pad_for_netflow(chan); - - if (pad_time_ms == CHANNELPADDING_TIME_DISABLED) { - return CHANNELPADDING_WONTPAD; - } else if (pad_time_ms == CHANNELPADDING_TIME_LATER) { - chan->currently_padding = 1; - return CHANNELPADDING_PADLATER; - } else { - if (BUG(pad_time_ms > INT_MAX)) { - pad_time_ms = INT_MAX; - } - /* We have to schedule a callback because we're called exactly once per - * second, but we don't want padding packets to go out exactly on an - * integer multiple of seconds. This callback will only be scheduled - * if we're within 1.1 seconds of the padding time. - */ - chan->currently_padding = 1; - return channelpadding_schedule_padding(chan, (int)pad_time_ms); - } - } else { - chan->currently_padding = 0; - return CHANNELPADDING_WONTPAD; - } - } else { - return CHANNELPADDING_PADLATER; - } -} - diff --git a/src/tor/src/or/channelpadding.h b/src/tor/src/or/channelpadding.h deleted file mode 100644 index 58bf741d5..000000000 --- a/src/tor/src/or/channelpadding.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2015, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitbuild.h - * \brief Header file for circuitbuild.c. - **/ -#ifndef TOR_CHANNELPADDING_H -#define TOR_CHANNELPADDING_H - -#include "channelpadding_negotiation.h" - -#define CHANNELPADDING_TOR2WEB_PARAM "nf_pad_tor2web" -#define CHANNELPADDING_TOR2WEB_DEFAULT 1 -#define CHANNELPADDING_SOS_PARAM "nf_pad_single_onion" -#define CHANNELPADDING_SOS_DEFAULT 1 - -typedef enum { - CHANNELPADDING_WONTPAD, - CHANNELPADDING_PADLATER, - CHANNELPADDING_PADDING_SCHEDULED, - CHANNELPADDING_PADDING_ALREADY_SCHEDULED, - CHANNELPADDING_PADDING_SENT, -} channelpadding_decision_t; - -channelpadding_decision_t channelpadding_decide_to_pad_channel(channel_t - *chan); -int channelpadding_update_padding_for_channel(channel_t *, - const channelpadding_negotiate_t - *chan); - -void channelpadding_disable_padding_on_channel(channel_t *chan); -void channelpadding_reduce_padding_on_channel(channel_t *chan); -int channelpadding_send_enable_command(channel_t *chan, uint16_t low_timeout, - uint16_t high_timeout); - -int channelpadding_get_circuits_available_timeout(void); -unsigned int channelpadding_get_channel_idle_timeout(const channel_t *, int); -void channelpadding_new_consensus_params(networkstatus_t *ns); - -#endif /* !defined(TOR_CHANNELPADDING_H) */ - diff --git a/src/tor/src/or/circuitbuild.h b/src/tor/src/or/circuitbuild.h deleted file mode 100644 index a85ef672f..000000000 --- a/src/tor/src/or/circuitbuild.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitbuild.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_CIRCUITBUILD_H -#define TOR_CIRCUITBUILD_H - -char *circuit_list_path(origin_circuit_t *circ, int verbose); -char *circuit_list_path_for_controller(origin_circuit_t *circ); -void circuit_log_path(int severity, unsigned int domain, - origin_circuit_t *circ); -void circuit_rep_hist_note_result(origin_circuit_t *circ); -origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags); -origin_circuit_t *circuit_establish_circuit(uint8_t purpose, - extend_info_t *exit, - int flags); -struct circuit_guard_state_t *origin_circuit_get_guard_state( - origin_circuit_t *circ); -int circuit_handle_first_hop(origin_circuit_t *circ); -void circuit_n_chan_done(channel_t *chan, int status, - int close_origin_circuits); -int inform_testing_reachability(void); -int circuit_timeout_want_to_count_circ(const origin_circuit_t *circ); -int circuit_send_next_onion_skin(origin_circuit_t *circ); -void circuit_note_clock_jumped(int seconds_elapsed); -int circuit_extend(cell_t *cell, circuit_t *circ); -int circuit_init_cpath_crypto(crypt_path_t *cpath, - const char *key_data, size_t key_data_len, - int reverse, int is_hs_v3); -struct created_cell_t; -int circuit_finish_handshake(origin_circuit_t *circ, - const struct created_cell_t *created_cell); -int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, - int reason); -int onionskin_answer(or_circuit_t *circ, - const struct created_cell_t *created_cell, - const char *keys, size_t keys_len, - const uint8_t *rend_circ_nonce); -MOCK_DECL(int, circuit_all_predicted_ports_handled, (time_t now, - int *need_uptime, - int *need_capacity)); - -int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info); -int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info); -void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); -extend_info_t *extend_info_new(const char *nickname, - const char *rsa_id_digest, - const ed25519_public_key_t *ed_id, - crypto_pk_t *onion_key, - const curve25519_public_key_t *ntor_key, - const tor_addr_t *addr, uint16_t port); -extend_info_t *extend_info_from_node(const node_t *r, int for_direct_connect); -extend_info_t *extend_info_dup(extend_info_t *info); -void extend_info_free_(extend_info_t *info); -#define extend_info_free(info) \ - FREE_AND_NULL(extend_info_t, extend_info_free_, (info)) -int extend_info_addr_is_allowed(const tor_addr_t *addr); -int extend_info_supports_tap(const extend_info_t* ei); -int extend_info_supports_ntor(const extend_info_t* ei); -int circuit_can_use_tap(const origin_circuit_t *circ); -int circuit_has_usable_onion_key(const origin_circuit_t *circ); -int extend_info_has_preferred_onion_key(const extend_info_t* ei); -const uint8_t *build_state_get_exit_rsa_id(cpath_build_state_t *state); -const node_t *build_state_get_exit_node(cpath_build_state_t *state); -const char *build_state_get_exit_nickname(cpath_build_state_t *state); - -struct circuit_guard_state_t; - -const node_t *choose_good_entry_server(uint8_t purpose, - cpath_build_state_t *state, - struct circuit_guard_state_t **guard_state_out); -void circuit_upgrade_circuits_from_guard_wait(void); - -#ifdef CIRCUITBUILD_PRIVATE -STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan); -STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei, - smartlist_t *nodes); -MOCK_DECL(STATIC int, count_acceptable_nodes, (smartlist_t *nodes)); -#if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) -STATIC const node_t *pick_tor2web_rendezvous_node(router_crn_flags_t flags, - const or_options_t *options); -unsigned int cpath_get_n_hops(crypt_path_t **head_ptr); - -#endif /* defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) */ - -#endif /* defined(CIRCUITBUILD_PRIVATE) */ - -#endif /* !defined(TOR_CIRCUITBUILD_H) */ - diff --git a/src/tor/src/or/config.h b/src/tor/src/or/config.h deleted file mode 100644 index 7c7ef1825..000000000 --- a/src/tor/src/or/config.h +++ /dev/null @@ -1,263 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file config.h - * \brief Header file for config.c. - **/ - -#ifndef TOR_CONFIG_H -#define TOR_CONFIG_H - -#include "testsupport.h" - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(DARWIN) -#define KERNEL_MAY_SUPPORT_IPFW -#endif - -/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might - * expose more information than we're comfortable with. */ -#define MIN_HEARTBEAT_PERIOD (30*60) - -MOCK_DECL(const char*, get_dirportfrontpage, (void)); -MOCK_DECL(const or_options_t *, get_options, (void)); -MOCK_DECL(or_options_t *, get_options_mutable, (void)); -int set_options(or_options_t *new_val, char **msg); -void config_free_all(void); -const char *safe_str_client(const char *address); -const char *safe_str(const char *address); -const char *escaped_safe_str_client(const char *address); -const char *escaped_safe_str(const char *address); -int get_protocol_warning_severity_level(void); -const char *get_version(void); -const char *get_short_version(void); -setopt_err_t options_trial_assign(config_line_t *list, unsigned flags, - char **msg); - -uint32_t get_last_resolved_addr(void); -void reset_last_resolved_addr(void); -int resolve_my_address(int warn_severity, const or_options_t *options, - uint32_t *addr_out, - const char **method_out, char **hostname_out); -MOCK_DECL(int, is_local_addr, (const tor_addr_t *addr)); -void options_init(or_options_t *options); - -#define OPTIONS_DUMP_MINIMAL 1 -#define OPTIONS_DUMP_DEFAULTS 2 -#define OPTIONS_DUMP_ALL 3 -char *options_dump(const or_options_t *options, int how_to_dump); -int options_init_from_torrc(int argc, char **argv); -setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf, - int command, const char *command_arg, char **msg); -int option_is_recognized(const char *key); -const char *option_get_canonical_name(const char *key); -config_line_t *option_get_assignment(const or_options_t *options, - const char *key); -int options_save_current(void); -const char *get_torrc_fname(int defaults_fname); -typedef enum { - DIRROOT_DATADIR, - DIRROOT_CACHEDIR, - DIRROOT_KEYDIR -} directory_root_t; - -MOCK_DECL(char *, - options_get_dir_fname2_suffix, - (const or_options_t *options, - directory_root_t roottype, - const char *sub1, const char *sub2, - const char *suffix)); - -/* These macros wrap options_get_dir_fname2_suffix to provide a more - * convenient API for finding filenames that Tor uses inside its storage - * They are named according to a pattern: - * (options_)?get_(cache|key|data)dir_fname(2)?(_suffix)? - * - * Macros that begin with options_ take an options argument; the others - * work with respect to the global options. - * - * Each macro works relative to the data directory, the key directory, - * or the cache directory, as determined by which one is mentioned. - * - * Macro variants with "2" in their name take two path components; others - * take one. - * - * Macro variants with "_suffix" at the end take an additional suffix - * that gets appended to the end of the file - */ -#define options_get_datadir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_DATADIR, \ - (sub1), (sub2), (suffix)) -#define options_get_cachedir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_CACHEDIR, \ - (sub1), (sub2), (suffix)) -#define options_get_keydir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_KEYDIR, \ - (sub1), (sub2), (suffix)) - -#define options_get_datadir_fname(opts,sub1) \ - options_get_datadir_fname2_suffix((opts),(sub1), NULL, NULL) -#define options_get_datadir_fname2(opts,sub1,sub2) \ - options_get_datadir_fname2_suffix((opts),(sub1), (sub2), NULL) - -#define get_datadir_fname2_suffix(sub1, sub2, suffix) \ - options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix)) -#define get_datadir_fname(sub1) \ - get_datadir_fname2_suffix((sub1), NULL, NULL) -#define get_datadir_fname2(sub1,sub2) \ - get_datadir_fname2_suffix((sub1), (sub2), NULL) -#define get_datadir_fname_suffix(sub1, suffix) \ - get_datadir_fname2_suffix((sub1), NULL, (suffix)) - -/** DOCDOC */ -#define options_get_keydir_fname(options, sub1) \ - options_get_keydir_fname2_suffix((options), (sub1), NULL, NULL) -#define get_keydir_fname_suffix(sub1, suffix) \ - options_get_keydir_fname2_suffix(get_options(), (sub1), NULL, suffix) -#define get_keydir_fname(sub1) \ - options_get_keydir_fname2_suffix(get_options(), (sub1), NULL, NULL) - -#define get_cachedir_fname(sub1) \ - options_get_cachedir_fname2_suffix(get_options(), (sub1), NULL, NULL) -#define get_cachedir_fname_suffix(sub1, suffix) \ - options_get_cachedir_fname2_suffix(get_options(), (sub1), NULL, (suffix)) - -int using_default_dir_authorities(const or_options_t *options); - -int create_keys_directory(const or_options_t *options); - -int check_or_create_data_subdir(const char *subdir); -int write_to_data_subdir(const char* subdir, const char* fname, - const char* str, const char* descr); - -int get_num_cpus(const or_options_t *options); - -MOCK_DECL(const smartlist_t *,get_configured_ports,(void)); -int get_first_advertised_port_by_type_af(int listener_type, - int address_family); -#define get_primary_or_port() \ - (get_first_advertised_port_by_type_af(CONN_TYPE_OR_LISTENER, AF_INET)) -#define get_primary_dir_port() \ - (get_first_advertised_port_by_type_af(CONN_TYPE_DIR_LISTENER, AF_INET)) -const tor_addr_t *get_first_advertised_addr_by_type_af(int listener_type, - int address_family); -int port_exists_by_type_addr_port(int listener_type, const tor_addr_t *addr, - int port, int check_wildcard); -int port_exists_by_type_addr32h_port(int listener_type, uint32_t addr_ipv4h, - int port, int check_wildcard); - -char *get_first_listener_addrport_string(int listener_type); - -int options_need_geoip_info(const or_options_t *options, - const char **reason_out); - -smartlist_t *get_list_of_ports_to_forward(void); - -int getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -uint32_t get_effective_bwrate(const or_options_t *options); -uint32_t get_effective_bwburst(const or_options_t *options); - -char *get_transport_bindaddr_from_config(const char *transport); - -int init_cookie_authentication(const char *fname, const char *header, - int cookie_len, int group_readable, - uint8_t **cookie_out, int *cookie_is_set_out); - -or_options_t *options_new(void); - -int config_parse_commandline(int argc, char **argv, int ignore_errors, - config_line_t **result, - config_line_t **cmdline_result); - -void config_register_addressmaps(const or_options_t *options); -/* XXXX move to connection_edge.h */ -int addressmap_register_auto(const char *from, const char *to, - time_t expires, - addressmap_entry_source_t addrmap_source, - const char **msg); - -int port_cfg_line_extract_addrport(const char *line, - char **addrport_out, - int *is_unix_out, - const char **rest_out); - -/** Represents the information stored in a torrc Bridge line. */ -typedef struct bridge_line_t { - tor_addr_t addr; /* The IP address of the bridge. */ - uint16_t port; /* The TCP port of the bridge. */ - char *transport_name; /* The name of the pluggable transport that - should be used to connect to the bridge. */ - char digest[DIGEST_LEN]; /* The bridge's identity key digest. */ - smartlist_t *socks_args; /* SOCKS arguments for the pluggable - transport proxy. */ -} bridge_line_t; - -void bridge_line_free_(bridge_line_t *bridge_line); -#define bridge_line_free(line) \ - FREE_AND_NULL(bridge_line_t, bridge_line_free_, (line)) -bridge_line_t *parse_bridge_line(const char *line); -smartlist_t *get_options_from_transport_options_line(const char *line, - const char *transport); -smartlist_t *get_options_for_server_transport(const char *transport); - -#ifdef CONFIG_PRIVATE - -#define CL_PORT_NO_STREAM_OPTIONS (1u<<0) -#define CL_PORT_WARN_NONLOCAL (1u<<1) -/* Was CL_PORT_ALLOW_EXTRA_LISTENADDR (1u<<2) */ -#define CL_PORT_SERVER_OPTIONS (1u<<3) -#define CL_PORT_FORBID_NONLOCAL (1u<<4) -#define CL_PORT_TAKES_HOSTNAMES (1u<<5) -#define CL_PORT_IS_UNIXSOCKET (1u<<6) -#define CL_PORT_DFLT_GROUP_WRITABLE (1u<<7) - -STATIC int options_act(const or_options_t *old_options); -#ifdef TOR_UNIT_TESTS -extern struct config_format_t options_format; -#endif - -STATIC port_cfg_t *port_cfg_new(size_t namelen); -#define port_cfg_free(port) \ - FREE_AND_NULL(port_cfg_t, port_cfg_free_, (port)) -STATIC void port_cfg_free_(port_cfg_t *port); -#define or_options_free(opt) \ - FREE_AND_NULL(or_options_t, or_options_free_, (opt)) -STATIC void or_options_free_(or_options_t *options); -STATIC int options_validate_single_onion(or_options_t *options, - char **msg); -STATIC int options_validate(or_options_t *old_options, - or_options_t *options, - or_options_t *default_options, - int from_setconf, char **msg); -STATIC int parse_transport_line(const or_options_t *options, - const char *line, int validate_only, - int server); -STATIC int consider_adding_dir_servers(const or_options_t *options, - const or_options_t *old_options); -STATIC void add_default_trusted_dir_authorities(dirinfo_type_t type); -MOCK_DECL(STATIC void, add_default_fallback_dir_servers, (void)); -STATIC int parse_dir_authority_line(const char *line, - dirinfo_type_t required_type, - int validate_only); -STATIC int parse_dir_fallback_line(const char *line, int validate_only); -STATIC int have_enough_mem_for_dircache(const or_options_t *options, - size_t total_mem, char **msg); -STATIC int parse_port_config(smartlist_t *out, - const config_line_t *ports, - const char *portname, - int listener_type, - const char *defaultaddr, - int defaultport, - const unsigned flags); - -STATIC int check_bridge_distribution_setting(const char *bd); -#endif /* defined(CONFIG_PRIVATE) */ - -#endif /* !defined(TOR_CONFIG_H) */ - diff --git a/src/tor/src/or/conscache.c b/src/tor/src/or/conscache.c deleted file mode 100644 index e25ac5f40..000000000 --- a/src/tor/src/or/conscache.c +++ /dev/null @@ -1,626 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" - -#include "config.h" -#include "conscache.h" -#include "storagedir.h" - -#define CCE_MAGIC 0x17162253 - -#ifdef _WIN32 -/* On Windows, unlink won't work on a file if the file is actively mmap()ed. - * That forces us to be less aggressive about unlinking files, and causes other - * changes throughout our logic. - */ -#define MUST_UNMAP_TO_UNLINK -#endif /* defined(_WIN32) */ - -/** - * A consensus_cache_entry_t is a reference-counted handle to an - * item in a consensus_cache_t. It can be mmapped into RAM, or not, - * depending whether it's currently in use. - */ -struct consensus_cache_entry_t { - uint32_t magic; /**< Must be set to CCE_MAGIC */ - HANDLE_ENTRY(consensus_cache_entry, consensus_cache_entry_t); - int32_t refcnt; /**< Reference count. */ - unsigned can_remove : 1; /**< If true, we want to delete this file. */ - /** If true, we intend to unmap this file as soon as we're done with it. */ - unsigned release_aggressively : 1; - - /** Filename for this object within the storage_dir_t */ - char *fname; - /** Labels associated with this object. Immutable once the object - * is created. */ - config_line_t *labels; - /** Pointer to the cache that includes this entry (if any). */ - consensus_cache_t *in_cache; - - /** Since what time has this object been mapped into RAM, but with the cache - * being the only having a reference to it? */ - time_t unused_since; - /** mmaped contents of the underlying file. May be NULL */ - tor_mmap_t *map; - /** Length of the body within map. */ - size_t bodylen; - /** Pointer to the body within map. */ - const uint8_t *body; -}; - -/** - * A consensus_cache_t holds a directory full of labeled items. - */ -struct consensus_cache_t { - /** Underling storage_dir_t to handle persistence */ - storage_dir_t *dir; - /** List of all the entries in the directory. */ - smartlist_t *entries; - - /** The maximum number of entries that we'd like to allow in this cache. - * This is the same as the storagedir limit when MUST_UNMAP_TO_UNLINK is - * not defined. */ - unsigned max_entries; -}; - -static void consensus_cache_clear(consensus_cache_t *cache); -static void consensus_cache_rescan(consensus_cache_t *); -static void consensus_cache_entry_map(consensus_cache_t *, - consensus_cache_entry_t *); -static void consensus_cache_entry_unmap(consensus_cache_entry_t *ent); - -/** - * Helper: Open a consensus cache in subdirectory subdir of the - * data directory, to hold up to max_entries of data. - */ -consensus_cache_t * -consensus_cache_open(const char *subdir, int max_entries) -{ - int storagedir_max_entries; - consensus_cache_t *cache = tor_malloc_zero(sizeof(consensus_cache_t)); - char *directory = get_cachedir_fname(subdir); - cache->max_entries = max_entries; - -#ifdef MUST_UNMAP_TO_UNLINK - /* If we can't unlink the files that we're still using, then we need to - * tell the storagedir backend to allow far more files than this consensus - * cache actually wants, so that it can hold files which, from this cache's - * perspective, have become useless. - */ -#define VERY_LARGE_STORAGEDIR_LIMIT (1000*1000) - storagedir_max_entries = VERY_LARGE_STORAGEDIR_LIMIT; -#else /* !(defined(MUST_UNMAP_TO_UNLINK)) */ - /* Otherwise, we can just tell the storagedir to use the same limits - * as this cache. */ - storagedir_max_entries = max_entries; -#endif /* defined(MUST_UNMAP_TO_UNLINK) */ - - cache->dir = storage_dir_new(directory, storagedir_max_entries); - tor_free(directory); - if (!cache->dir) { - tor_free(cache); - return NULL; - } - - consensus_cache_rescan(cache); - return cache; -} - -/** Return true if it's okay to put more entries in this cache than - * its official file limit. - * - * (We need this method on Windows, where we can't unlink files that are still - * in use, and therefore might need to temporarily exceed the file limit until - * the no-longer-wanted files are deletable.) - */ -int -consensus_cache_may_overallocate(consensus_cache_t *cache) -{ - (void) cache; -#ifdef MUST_UNMAP_TO_UNLINK - return 1; -#else - return 0; -#endif -} - -/** - * Tell the sandbox (if any) configured by cfg to allow the - * operations that cache will need. - */ -int -consensus_cache_register_with_sandbox(consensus_cache_t *cache, - struct sandbox_cfg_elem **cfg) -{ -#ifdef MUST_UNMAP_TO_UNLINK - /* Our Linux sandbox doesn't support huge file lists like the one that would - * be generated by using VERY_LARGE_STORAGEDIR_LIMIT above in - * consensus_cache_open(). Since the Linux sandbox is the only one we have - * right now, we just assert that we never reach this point when we've had - * to use VERY_LARGE_STORAGEDIR_LIMIT. - * - * If at some point in the future we have a different sandbox mechanism that - * can handle huge file lists, we can remove this assertion or make it - * conditional. - */ - tor_assert_nonfatal_unreached(); -#endif /* defined(MUST_UNMAP_TO_UNLINK) */ - return storage_dir_register_with_sandbox(cache->dir, cfg); -} - -/** - * Helper: clear all entries from cache (but do not delete - * any that aren't marked for removal - */ -static void -consensus_cache_clear(consensus_cache_t *cache) -{ - consensus_cache_delete_pending(cache, 0); - - SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { - ent->in_cache = NULL; - consensus_cache_entry_decref(ent); - } SMARTLIST_FOREACH_END(ent); - smartlist_free(cache->entries); - cache->entries = NULL; -} - -/** - * Drop all storage held by cache. - */ -void -consensus_cache_free_(consensus_cache_t *cache) -{ - if (! cache) - return; - - if (cache->entries) { - consensus_cache_clear(cache); - } - storage_dir_free(cache->dir); - tor_free(cache); -} - -/** - * Write datalen bytes of data at data into the cache, - * labeling that data with labels. On failure, return NULL. On - * success, return a newly created consensus_cache_entry_t. - * - * The returned value will be owned by the cache, and you will have a - * reference to it. Call consensus_cache_entry_decref() when you are - * done with it. - * - * The provided labels MUST have distinct keys: if they don't, - * this API does not specify which values (if any) for the duplicate keys - * will be considered. - */ -consensus_cache_entry_t * -consensus_cache_add(consensus_cache_t *cache, - const config_line_t *labels, - const uint8_t *data, - size_t datalen) -{ - char *fname = NULL; - int r = storage_dir_save_labeled_to_file(cache->dir, - labels, data, datalen, &fname); - if (r < 0 || fname == NULL) { - return NULL; - } - consensus_cache_entry_t *ent = - tor_malloc_zero(sizeof(consensus_cache_entry_t)); - ent->magic = CCE_MAGIC; - ent->fname = fname; - ent->labels = config_lines_dup(labels); - ent->in_cache = cache; - ent->unused_since = TIME_MAX; - smartlist_add(cache->entries, ent); - /* Start the reference count at 2: the caller owns one copy, and the - * cache owns another. - */ - ent->refcnt = 2; - - return ent; -} - -/** - * Given a cache, return some entry for which key=value. - * Return NULL if no such entry exists. - * - * Does not adjust reference counts. - */ -consensus_cache_entry_t * -consensus_cache_find_first(consensus_cache_t *cache, - const char *key, - const char *value) -{ - smartlist_t *tmp = smartlist_new(); - consensus_cache_find_all(tmp, cache, key, value); - consensus_cache_entry_t *ent = NULL; - if (smartlist_len(tmp)) - ent = smartlist_get(tmp, 0); - smartlist_free(tmp); - return ent; -} - -/** - * Given a cache, add every entry to out for which - * key=value. If key is NULL, add every entry. - * - * Do not add any entry that has been marked for removal. - * - * Does not adjust reference counts. - */ -void -consensus_cache_find_all(smartlist_t *out, - consensus_cache_t *cache, - const char *key, - const char *value) -{ - SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { - if (ent->can_remove == 1) { - /* We want to delete this; pretend it isn't there. */ - continue; - } - if (! key) { - smartlist_add(out, ent); - continue; - } - const char *found_val = consensus_cache_entry_get_value(ent, key); - if (found_val && !strcmp(value, found_val)) { - smartlist_add(out, ent); - } - } SMARTLIST_FOREACH_END(ent); -} - -/** - * Given a list of consensus_cache_entry_t, remove all those entries - * that do not have key=value in their labels. - * - * Does not adjust reference counts. - */ -void -consensus_cache_filter_list(smartlist_t *lst, - const char *key, - const char *value) -{ - if (BUG(lst == NULL)) - return; // LCOV_EXCL_LINE - if (key == NULL) - return; - SMARTLIST_FOREACH_BEGIN(lst, consensus_cache_entry_t *, ent) { - const char *found_val = consensus_cache_entry_get_value(ent, key); - if (! found_val || strcmp(value, found_val)) { - SMARTLIST_DEL_CURRENT(lst, ent); - } - } SMARTLIST_FOREACH_END(ent); -} - -/** - * If ent has a label with the given key, return its - * value. Otherwise return NULL. - * - * The return value is only guaranteed to be valid for as long as you - * hold a reference to ent. - */ -const char * -consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, - const char *key) -{ - const config_line_t *match = config_line_find(ent->labels, key); - if (match) - return match->value; - else - return NULL; -} - -/** - * Return a pointer to the labels in ent. - * - * This pointer is only guaranteed to be valid for as long as you - * hold a reference to ent. - */ -const config_line_t * -consensus_cache_entry_get_labels(const consensus_cache_entry_t *ent) -{ - return ent->labels; -} - -/** - * Increase the reference count of ent. - */ -void -consensus_cache_entry_incref(consensus_cache_entry_t *ent) -{ - if (BUG(ent->magic != CCE_MAGIC)) - return; // LCOV_EXCL_LINE - ++ent->refcnt; - ent->unused_since = TIME_MAX; -} - -/** - * Release a reference held to ent. - * - * If it was the last reference, ent will be freed. Therefore, you must not - * use ent after calling this function. - */ -void -consensus_cache_entry_decref(consensus_cache_entry_t *ent) -{ - if (! ent) - return; - if (BUG(ent->refcnt <= 0)) - return; // LCOV_EXCL_LINE - if (BUG(ent->magic != CCE_MAGIC)) - return; // LCOV_EXCL_LINE - - --ent->refcnt; - - if (ent->refcnt == 1 && ent->in_cache) { - /* Only the cache has a reference: we don't need to keep the file - * mapped */ - if (ent->map) { - if (ent->release_aggressively) { - consensus_cache_entry_unmap(ent); - } else { - ent->unused_since = approx_time(); - } - } - return; - } - - if (ent->refcnt > 0) - return; - - /* Refcount is zero; we can free it. */ - if (ent->map) { - consensus_cache_entry_unmap(ent); - } - tor_free(ent->fname); - config_free_lines(ent->labels); - consensus_cache_entry_handles_clear(ent); - memwipe(ent, 0, sizeof(consensus_cache_entry_t)); - tor_free(ent); -} - -/** - * Mark ent for deletion from the cache. Deletion will not occur - * until the cache is the only place that holds a reference to ent. - */ -void -consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent) -{ - ent->can_remove = 1; -} - -/** - * Mark ent as the kind of entry that we don't need to keep mmap'd for - * any longer than we're actually using it. - */ -void -consensus_cache_entry_mark_for_aggressive_release(consensus_cache_entry_t *ent) -{ - ent->release_aggressively = 1; -} - -/** - * Try to read the body of ent into memory if it isn't already - * loaded. On success, set *body_out to the body, *sz_out - * to its size, and return 0. On failure return -1. - * - * The resulting body pointer will only be valid for as long as you - * hold a reference to ent. - */ -int -consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, - const uint8_t **body_out, - size_t *sz_out) -{ - if (BUG(ent->magic != CCE_MAGIC)) - return -1; // LCOV_EXCL_LINE - - if (! ent->map) { - if (! ent->in_cache) - return -1; - - consensus_cache_entry_map((consensus_cache_t *)ent->in_cache, - (consensus_cache_entry_t *)ent); - if (! ent->map) { - return -1; - } - } - - *body_out = ent->body; - *sz_out = ent->bodylen; - return 0; -} - -/** - * Unmap every mmap'd element of cache that has been unused - * since cutoff. - */ -void -consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff) -{ - SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { - tor_assert_nonfatal(ent->in_cache == cache); - if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { - /* Somebody is using this entry right now */ - continue; - } - if (ent->unused_since > cutoff) { - /* Has been unused only for a little while */ - continue; - } - if (ent->map == NULL) { - /* Not actually mapped. */ - continue; - } - consensus_cache_entry_unmap(ent); - } SMARTLIST_FOREACH_END(ent); -} - -/** - * Return the number of currently unused filenames available in this cache. - */ -int -consensus_cache_get_n_filenames_available(consensus_cache_t *cache) -{ - tor_assert(cache); - int max = cache->max_entries; - int used = smartlist_len(storage_dir_list(cache->dir)); -#ifdef MUST_UNMAP_TO_UNLINK - if (used > max) - return 0; -#else - tor_assert_nonfatal(max >= used); -#endif /* defined(MUST_UNMAP_TO_UNLINK) */ - return max - used; -} - -/** - * Delete every element of cache has been marked with - * consensus_cache_entry_mark_for_removal. If force is false, - * retain those entries which are in use by something other than the cache. - */ -void -consensus_cache_delete_pending(consensus_cache_t *cache, int force) -{ - SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { - tor_assert_nonfatal(ent->in_cache == cache); - int force_ent = force; -#ifdef MUST_UNMAP_TO_UNLINK - /* We cannot delete anything with an active mmap on win32, so no - * force-deletion. */ - if (ent->map) { - force_ent = 0; - } -#endif /* defined(MUST_UNMAP_TO_UNLINK) */ - if (! force_ent) { - if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { - /* Somebody is using this entry right now */ - continue; - } - } - if (ent->can_remove == 0) { - /* Don't want to delete this. */ - continue; - } - if (BUG(ent->refcnt <= 0)) { - continue; // LCOV_EXCL_LINE - } - - SMARTLIST_DEL_CURRENT(cache->entries, ent); - ent->in_cache = NULL; - char *fname = tor_strdup(ent->fname); /* save a copy */ - consensus_cache_entry_decref(ent); - storage_dir_remove_file(cache->dir, fname); - tor_free(fname); - } SMARTLIST_FOREACH_END(ent); -} - -/** - * Internal helper: rescan cache and rebuild its list of entries. - */ -static void -consensus_cache_rescan(consensus_cache_t *cache) -{ - if (cache->entries) { - consensus_cache_clear(cache); - } - - cache->entries = smartlist_new(); - const smartlist_t *fnames = storage_dir_list(cache->dir); - SMARTLIST_FOREACH_BEGIN(fnames, const char *, fname) { - tor_mmap_t *map = NULL; - config_line_t *labels = NULL; - const uint8_t *body; - size_t bodylen; - map = storage_dir_map_labeled(cache->dir, fname, - &labels, &body, &bodylen); - if (! map) { - /* The ERANGE error might come from tor_mmap_file() -- it means the file - * was empty. EINVAL might come from ..map_labeled() -- it means the - * file was misformatted. In both cases, we should just delete it. - */ - if (errno == ERANGE || errno == EINVAL) { - log_warn(LD_FS, "Found %s file %s in consensus cache; removing it.", - errno == ERANGE ? "empty" : "misformatted", - escaped(fname)); - storage_dir_remove_file(cache->dir, fname); - } else { - /* Can't load this; continue */ - log_warn(LD_FS, "Unable to map file %s from consensus cache: %s", - escaped(fname), strerror(errno)); - } - continue; - } - consensus_cache_entry_t *ent = - tor_malloc_zero(sizeof(consensus_cache_entry_t)); - ent->magic = CCE_MAGIC; - ent->fname = tor_strdup(fname); - ent->labels = labels; - ent->refcnt = 1; - ent->in_cache = cache; - ent->unused_since = TIME_MAX; - smartlist_add(cache->entries, ent); - tor_munmap_file(map); /* don't actually need to keep this around */ - } SMARTLIST_FOREACH_END(fname); -} - -/** - * Make sure that ent is mapped into RAM. - */ -static void -consensus_cache_entry_map(consensus_cache_t *cache, - consensus_cache_entry_t *ent) -{ - if (ent->map) - return; - - ent->map = storage_dir_map_labeled(cache->dir, ent->fname, - NULL, &ent->body, &ent->bodylen); - ent->unused_since = TIME_MAX; -} - -/** - * Unmap ent from RAM. - * - * Do not call this if something other than the cache is holding a reference - * to ent - */ -static void -consensus_cache_entry_unmap(consensus_cache_entry_t *ent) -{ - ent->unused_since = TIME_MAX; - if (!ent->map) - return; - - tor_munmap_file(ent->map); - ent->map = NULL; - ent->body = NULL; - ent->bodylen = 0; - ent->unused_since = TIME_MAX; -} - -HANDLE_IMPL(consensus_cache_entry, consensus_cache_entry_t, ) - -#ifdef TOR_UNIT_TESTS -/** - * Testing only: Return true iff ent is mapped into memory. - * - * (In normal operation, this information is not exposed.) - */ -int -consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent) -{ - if (ent->map) { - tor_assert(ent->body); - return 1; - } else { - tor_assert(!ent->body); - return 0; - } -} -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/conscache.h b/src/tor/src/or/conscache.h deleted file mode 100644 index 08a5c5a37..000000000 --- a/src/tor/src/or/conscache.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONSCACHE_H -#define TOR_CONSCACHE_H - -#include "handles.h" - -typedef struct consensus_cache_entry_t consensus_cache_entry_t; -typedef struct consensus_cache_t consensus_cache_t; - -HANDLE_DECL(consensus_cache_entry, consensus_cache_entry_t, ) -#define consensus_cache_entry_handle_free(h) \ - FREE_AND_NULL(consensus_cache_entry_handle_t, \ - consensus_cache_entry_handle_free_, (h)) - -consensus_cache_t *consensus_cache_open(const char *subdir, int max_entries); -void consensus_cache_free_(consensus_cache_t *cache); -#define consensus_cache_free(cache) \ - FREE_AND_NULL(consensus_cache_t, consensus_cache_free_, (cache)) -struct sandbox_cfg_elem; -int consensus_cache_may_overallocate(consensus_cache_t *cache); -int consensus_cache_register_with_sandbox(consensus_cache_t *cache, - struct sandbox_cfg_elem **cfg); -void consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff); -void consensus_cache_delete_pending(consensus_cache_t *cache, - int force); -int consensus_cache_get_n_filenames_available(consensus_cache_t *cache); -consensus_cache_entry_t *consensus_cache_add(consensus_cache_t *cache, - const config_line_t *labels, - const uint8_t *data, - size_t datalen); - -consensus_cache_entry_t *consensus_cache_find_first( - consensus_cache_t *cache, - const char *key, - const char *value); - -void consensus_cache_find_all(smartlist_t *out, - consensus_cache_t *cache, - const char *key, - const char *value); -void consensus_cache_filter_list(smartlist_t *lst, - const char *key, - const char *value); - -const char *consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, - const char *key); -const config_line_t *consensus_cache_entry_get_labels( - const consensus_cache_entry_t *ent); - -void consensus_cache_entry_incref(consensus_cache_entry_t *ent); -void consensus_cache_entry_decref(consensus_cache_entry_t *ent); - -void consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent); -void consensus_cache_entry_mark_for_aggressive_release( - consensus_cache_entry_t *ent); -int consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, - const uint8_t **body_out, - size_t *sz_out); - -#ifdef TOR_UNIT_TESTS -int consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent); -#endif - -#endif /* !defined(TOR_CONSCACHE_H) */ - diff --git a/src/tor/src/or/consdiff.c b/src/tor/src/or/consdiff.c deleted file mode 100644 index 1baa11897..000000000 --- a/src/tor/src/or/consdiff.c +++ /dev/null @@ -1,1412 +0,0 @@ -/* Copyright (c) 2014, Daniel Martí - * Copyright (c) 2014, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file consdiff.c - * \brief Consensus diff implementation, including both the generation and the - * application of diffs in a minimal ed format. - * - * The consensus diff application is done in consdiff_apply_diff, which relies - * on apply_ed_diff for the main ed diff part and on some digest helper - * functions to check the digest hashes found in the consensus diff header. - * - * The consensus diff generation is more complex. consdiff_gen_diff generates - * it, relying on gen_ed_diff to generate the ed diff and some digest helper - * functions to generate the digest hashes. - * - * gen_ed_diff is the tricky bit. In it simplest form, it will take quadratic - * time and linear space to generate an ed diff given two smartlists. As shown - * in its comment section, calling calc_changes on the entire two consensuses - * will calculate what is to be added and what is to be deleted in the diff. - * Its comment section briefly explains how it works. - * - * In our case specific to consensuses, we take advantage of the fact that - * consensuses list routers sorted by their identities. We use that - * information to avoid running calc_changes on the whole smartlists. - * gen_ed_diff will navigate through the two consensuses identity by identity - * and will send small couples of slices to calc_changes, keeping the running - * time near-linear. This is explained in more detail in the gen_ed_diff - * comments. - * - * The allocation strategy tries to save time and memory by avoiding needless - * copies. Instead of actually splitting the inputs into separate strings, we - * allocate cdline_t objects, each of which represents a line in the original - * object or in the output. We use memarea_t allocators to manage the - * temporary memory we use when generating or applying diffs. - **/ - -#define CONSDIFF_PRIVATE - -#include "or.h" -#include "consdiff.h" -#include "memarea.h" -#include "routerparse.h" - -static const char* ns_diff_version = "network-status-diff-version 1"; -static const char* hash_token = "hash"; - -static char *consensus_join_lines(const smartlist_t *inp); - -/** Return true iff a and b have the same contents. */ -STATIC int -lines_eq(const cdline_t *a, const cdline_t *b) -{ - return a->len == b->len && fast_memeq(a->s, b->s, a->len); -} - -/** Return true iff a has the same contents as the nul-terminated string b. */ -STATIC int -line_str_eq(const cdline_t *a, const char *b) -{ - const size_t len = strlen(b); - tor_assert(len <= UINT32_MAX); - cdline_t bline = { b, (uint32_t)len }; - return lines_eq(a, &bline); -} - -/** Return true iff a begins with the same contents as the nul-terminated - * string b. */ -static int -line_starts_with_str(const cdline_t *a, const char *b) -{ - const size_t len = strlen(b); - tor_assert(len <= UINT32_MAX); - return a->len >= len && fast_memeq(a->s, b, len); -} - -/** Return a new cdline_t holding as its contents the nul-terminated - * string s. Use the provided memory area for storage. */ -static cdline_t * -cdline_linecpy(memarea_t *area, const char *s) -{ - size_t len = strlen(s); - const char *ss = memarea_memdup(area, s, len); - cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); - line->s = ss; - line->len = (uint32_t)len; - return line; -} - -/** Add a cdline_t to lst holding as its contents the nul-terminated - * string s. Use the provided memory area for storage. */ -STATIC void -smartlist_add_linecpy(smartlist_t *lst, memarea_t *area, const char *s) -{ - smartlist_add(lst, cdline_linecpy(area, s)); -} - -/** Compute the digest of cons, and store the result in - * digest_out. Return 0 on success, -1 on failure. */ -/* This is a separate, mockable function so that we can override it when - * fuzzing. */ -MOCK_IMPL(STATIC int, -consensus_compute_digest,(const char *cons, - consensus_digest_t *digest_out)) -{ - int r = crypto_digest256((char*)digest_out->sha3_256, - cons, strlen(cons), DIGEST_SHA3_256); - return r; -} - -/** Compute the digest-as-signed of cons, and store the result in - * digest_out. Return 0 on success, -1 on failure. */ -/* This is a separate, mockable function so that we can override it when - * fuzzing. */ -MOCK_IMPL(STATIC int, -consensus_compute_digest_as_signed,(const char *cons, - consensus_digest_t *digest_out)) -{ - return router_get_networkstatus_v3_sha3_as_signed(digest_out->sha3_256, - cons); -} - -/** Return true iff d1 and d2 contain the same digest */ -/* This is a separate, mockable function so that we can override it when - * fuzzing. */ -MOCK_IMPL(STATIC int, -consensus_digest_eq,(const uint8_t *d1, - const uint8_t *d2)) -{ - return fast_memeq(d1, d2, DIGEST256_LEN); -} - -/** Create (allocate) a new slice from a smartlist. Assumes that the start - * and the end indexes are within the bounds of the initial smartlist. The end - * element is not part of the resulting slice. If end is -1, the slice is to - * reach the end of the smartlist. - */ -STATIC smartlist_slice_t * -smartlist_slice(const smartlist_t *list, int start, int end) -{ - int list_len = smartlist_len(list); - tor_assert(start >= 0); - tor_assert(start <= list_len); - if (end == -1) { - end = list_len; - } - tor_assert(start <= end); - - smartlist_slice_t *slice = tor_malloc(sizeof(smartlist_slice_t)); - slice->list = list; - slice->offset = start; - slice->len = end - start; - return slice; -} - -/** Helper: Compute the longest common subsequence lengths for the two slices. - * Used as part of the diff generation to find the column at which to split - * slice2 while still having the optimal solution. - * If direction is -1, the navigation is reversed. Otherwise it must be 1. - * The length of the resulting integer array is that of the second slice plus - * one. - */ -STATIC int * -lcs_lengths(const smartlist_slice_t *slice1, const smartlist_slice_t *slice2, - int direction) -{ - size_t a_size = sizeof(int) * (slice2->len+1); - - /* Resulting lcs lengths. */ - int *result = tor_malloc_zero(a_size); - /* Copy of the lcs lengths from the last iteration. */ - int *prev = tor_malloc(a_size); - - tor_assert(direction == 1 || direction == -1); - - int si = slice1->offset; - if (direction == -1) { - si += (slice1->len-1); - } - - for (int i = 0; i < slice1->len; ++i, si+=direction) { - - const cdline_t *line1 = smartlist_get(slice1->list, si); - /* Store the last results. */ - memcpy(prev, result, a_size); - - int sj = slice2->offset; - if (direction == -1) { - sj += (slice2->len-1); - } - - for (int j = 0; j < slice2->len; ++j, sj+=direction) { - - const cdline_t *line2 = smartlist_get(slice2->list, sj); - if (lines_eq(line1, line2)) { - /* If the lines are equal, the lcs is one line longer. */ - result[j + 1] = prev[j] + 1; - } else { - /* If not, see what lcs parent path is longer. */ - result[j + 1] = MAX(result[j], prev[j + 1]); - } - } - } - tor_free(prev); - return result; -} - -/** Helper: Trim any number of lines that are equally at the start or the end - * of both slices. - */ -STATIC void -trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2) -{ - while (slice1->len>0 && slice2->len>0) { - const cdline_t *line1 = smartlist_get(slice1->list, slice1->offset); - const cdline_t *line2 = smartlist_get(slice2->list, slice2->offset); - if (!lines_eq(line1, line2)) { - break; - } - slice1->offset++; slice1->len--; - slice2->offset++; slice2->len--; - } - - int i1 = (slice1->offset+slice1->len)-1; - int i2 = (slice2->offset+slice2->len)-1; - - while (slice1->len>0 && slice2->len>0) { - const cdline_t *line1 = smartlist_get(slice1->list, i1); - const cdline_t *line2 = smartlist_get(slice2->list, i2); - if (!lines_eq(line1, line2)) { - break; - } - i1--; - slice1->len--; - i2--; - slice2->len--; - } -} - -/** Like smartlist_string_pos, but uses a cdline_t, and is restricted to the - * bounds of the slice. - */ -STATIC int -smartlist_slice_string_pos(const smartlist_slice_t *slice, - const cdline_t *string) -{ - int end = slice->offset + slice->len; - for (int i = slice->offset; i < end; ++i) { - const cdline_t *el = smartlist_get(slice->list, i); - if (lines_eq(el, string)) { - return i; - } - } - return -1; -} - -/** Helper: Set all the appropriate changed booleans to true. The first slice - * must be of length 0 or 1. All the lines of slice1 and slice2 which are not - * present in the other slice will be set to changed in their bool array. - * The two changed bool arrays are passed in the same order as the slices. - */ -STATIC void -set_changed(bitarray_t *changed1, bitarray_t *changed2, - const smartlist_slice_t *slice1, const smartlist_slice_t *slice2) -{ - int toskip = -1; - tor_assert(slice1->len == 0 || slice1->len == 1); - - if (slice1->len == 1) { - const cdline_t *line_common = smartlist_get(slice1->list, slice1->offset); - toskip = smartlist_slice_string_pos(slice2, line_common); - if (toskip == -1) { - bitarray_set(changed1, slice1->offset); - } - } - int end = slice2->offset + slice2->len; - for (int i = slice2->offset; i < end; ++i) { - if (i != toskip) { - bitarray_set(changed2, i); - } - } -} - -/* - * Helper: Given that slice1 has been split by half into top and bot, we want - * to fetch the column at which to split slice2 so that we are still on track - * to the optimal diff solution, i.e. the shortest one. We use lcs_lengths - * since the shortest diff is just another way to say the longest common - * subsequence. - */ -static int -optimal_column_to_split(const smartlist_slice_t *top, - const smartlist_slice_t *bot, - const smartlist_slice_t *slice2) -{ - int *lens_top = lcs_lengths(top, slice2, 1); - int *lens_bot = lcs_lengths(bot, slice2, -1); - int column=0, max_sum=-1; - - for (int i = 0; i < slice2->len+1; ++i) { - int sum = lens_top[i] + lens_bot[slice2->len-i]; - if (sum > max_sum) { - column = i; - max_sum = sum; - } - } - tor_free(lens_top); - tor_free(lens_bot); - - return column; -} - -/** - * Helper: Figure out what elements are new or gone on the second smartlist - * relative to the first smartlist, and store the booleans in the bitarrays. - * True on the first bitarray means the element is gone, true on the second - * bitarray means it's new. - * - * In its base case, either of the smartlists is of length <= 1 and we can - * quickly see what elements are new or are gone. In the other case, we will - * split one smartlist by half and we'll use optimal_column_to_split to find - * the optimal column at which to split the second smartlist so that we are - * finding the smallest diff possible. - */ -STATIC void -calc_changes(smartlist_slice_t *slice1, - smartlist_slice_t *slice2, - bitarray_t *changed1, bitarray_t *changed2) -{ - trim_slices(slice1, slice2); - - if (slice1->len <= 1) { - set_changed(changed1, changed2, slice1, slice2); - - } else if (slice2->len <= 1) { - set_changed(changed2, changed1, slice2, slice1); - - /* Keep on splitting the slices in two. */ - } else { - smartlist_slice_t *top, *bot, *left, *right; - - /* Split the first slice in half. */ - int mid = slice1->len/2; - top = smartlist_slice(slice1->list, slice1->offset, slice1->offset+mid); - bot = smartlist_slice(slice1->list, slice1->offset+mid, - slice1->offset+slice1->len); - - /* Split the second slice by the optimal column. */ - int mid2 = optimal_column_to_split(top, bot, slice2); - left = smartlist_slice(slice2->list, slice2->offset, slice2->offset+mid2); - right = smartlist_slice(slice2->list, slice2->offset+mid2, - slice2->offset+slice2->len); - - calc_changes(top, left, changed1, changed2); - calc_changes(bot, right, changed1, changed2); - tor_free(top); - tor_free(bot); - tor_free(left); - tor_free(right); - } -} - -/* This table is from crypto.c. The SP and PAD defines are different. */ -#define NOT_VALID_BASE64 255 -#define X NOT_VALID_BASE64 -#define SP NOT_VALID_BASE64 -#define PAD NOT_VALID_BASE64 -static const uint8_t base64_compare_table[256] = { - X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, - X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, - X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, -}; - -/** Helper: Get the identity hash from a router line, assuming that the line - * at least appears to be a router line and thus starts with "r ". - * - * If an identity hash is found, store it (without decoding it) in - * hash_out, and return 0. On failure, return -1. - */ -STATIC int -get_id_hash(const cdline_t *line, cdline_t *hash_out) -{ - if (line->len < 2) - return -1; - - /* Skip the router name. */ - const char *hash = memchr(line->s + 2, ' ', line->len - 2); - if (!hash) { - return -1; - } - - hash++; - const char *hash_end = hash; - /* Stop when the first non-base64 character is found. Use unsigned chars to - * avoid negative indexes causing crashes. - */ - while (base64_compare_table[*((unsigned char*)hash_end)] - != NOT_VALID_BASE64 && - hash_end < line->s + line->len) { - hash_end++; - } - - /* Empty hash. */ - if (hash_end == hash) { - return -1; - } - - hash_out->s = hash; - /* Always true because lines are limited to this length */ - tor_assert(hash_end >= hash); - tor_assert((size_t)(hash_end - hash) <= UINT32_MAX); - hash_out->len = (uint32_t)(hash_end - hash); - - return 0; -} - -/** Helper: Check that a line is a valid router entry. We must at least be - * able to fetch a proper identity hash from it for it to be valid. - */ -STATIC int -is_valid_router_entry(const cdline_t *line) -{ - if (line->len < 2 || fast_memneq(line->s, "r ", 2)) - return 0; - cdline_t tmp; - return (get_id_hash(line, &tmp) == 0); -} - -/** Helper: Find the next router line starting at the current position. - * Assumes that cur is lower than the length of the smartlist, i.e. it is a - * line within the bounds of the consensus. The only exception is when we - * don't want to skip the first line, in which case cur will be -1. - */ -STATIC int -next_router(const smartlist_t *cons, int cur) -{ - int len = smartlist_len(cons); - tor_assert(cur >= -1 && cur < len); - - if (++cur >= len) { - return len; - } - - const cdline_t *line = smartlist_get(cons, cur); - while (!is_valid_router_entry(line)) { - if (++cur >= len) { - return len; - } - line = smartlist_get(cons, cur); - } - return cur; -} - -/** Helper: compare two base64-encoded identity hashes, which may be of - * different lengths. Comparison ends when the first non-base64 char is found. - */ -STATIC int -base64cmp(const cdline_t *hash1, const cdline_t *hash2) -{ - /* NULL is always lower, useful for last_hash which starts at NULL. */ - if (!hash1->s && !hash2->s) { - return 0; - } - if (!hash1->s) { - return -1; - } - if (!hash2->s) { - return 1; - } - - /* Don't index with a char; char may be signed. */ - const unsigned char *a = (unsigned char*)hash1->s; - const unsigned char *b = (unsigned char*)hash2->s; - const unsigned char *a_end = a + hash1->len; - const unsigned char *b_end = b + hash2->len; - while (1) { - uint8_t av = base64_compare_table[*a]; - uint8_t bv = base64_compare_table[*b]; - if (av == NOT_VALID_BASE64) { - if (bv == NOT_VALID_BASE64) { - /* Both ended with exactly the same characters. */ - return 0; - } else { - /* hash2 goes on longer than hash1 and thus hash1 is lower. */ - return -1; - } - } else if (bv == NOT_VALID_BASE64) { - /* hash1 goes on longer than hash2 and thus hash1 is greater. */ - return 1; - } else if (av < bv) { - /* The first difference shows that hash1 is lower. */ - return -1; - } else if (av > bv) { - /* The first difference shows that hash1 is greater. */ - return 1; - } else { - a++; - b++; - if (a == a_end) { - if (b == b_end) { - return 0; - } else { - return -1; - } - } else if (b == b_end) { - return 1; - } - } - } -} - -/** Structure used to remember the previous and current identity hash of - * the "r " lines in a consensus, to enforce well-ordering. */ -typedef struct router_id_iterator_t { - cdline_t last_hash; - cdline_t hash; -} router_id_iterator_t; - -/** - * Initializer for a router_id_iterator_t. - */ -#define ROUTER_ID_ITERATOR_INIT { { NULL, 0 }, { NULL, 0 } } - -/** Given an index *idxp into the consensus at cons, advance - * the index to the next router line ("r ...") in the consensus, or to - * an index one after the end of the list if there is no such line. - * - * Use iter to record the hash of the found router line, if any, - * and to enforce ordering on the hashes. If the hashes are mis-ordered, - * return -1. Else, return 0. - **/ -static int -find_next_router_line(const smartlist_t *cons, - const char *consname, - int *idxp, - router_id_iterator_t *iter) -{ - *idxp = next_router(cons, *idxp); - if (*idxp < smartlist_len(cons)) { - memcpy(&iter->last_hash, &iter->hash, sizeof(cdline_t)); - if (get_id_hash(smartlist_get(cons, *idxp), &iter->hash) < 0 || - base64cmp(&iter->hash, &iter->last_hash) <= 0) { - log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " - "the %s consensus doesn't have its router entries sorted " - "properly.", consname); - return -1; - } - } - return 0; -} - -/** Line-prefix indicating the beginning of the signatures section that we - * intend to delete. */ -#define START_OF_SIGNATURES_SECTION "directory-signature " - -/** Pre-process a consensus in cons (represented as a list of cdline_t) - * to remove the signatures from it. If the footer is removed, return a - * cdline_t containing a delete command to delete the footer, allocated in - * area. If no footer is removed, return NULL. - * - * We remove the signatures here because they are not themselves signed, and - * as such there might be different encodings for them. - */ -static cdline_t * -preprocess_consensus(memarea_t *area, - smartlist_t *cons) -{ - int idx; - int dirsig_idx = -1; - for (idx = 0; idx < smartlist_len(cons); ++idx) { - cdline_t *line = smartlist_get(cons, idx); - if (line_starts_with_str(line, START_OF_SIGNATURES_SECTION)) { - dirsig_idx = idx; - break; - } - } - if (dirsig_idx >= 0) { - char buf[64]; - while (smartlist_len(cons) > dirsig_idx) - smartlist_del(cons, dirsig_idx); - tor_snprintf(buf, sizeof(buf), "%d,$d", dirsig_idx+1); - return cdline_linecpy(area, buf); - } else { - return NULL; - } -} - -/** Generate an ed diff as a smartlist from two consensuses, also given as - * smartlists. Will return NULL if the diff could not be generated, which can - * happen if any lines the script had to add matched "." or if the routers - * were not properly ordered. - * - * All cdline_t objects in the resulting object are either references to lines - * in one of the inputs, or are newly allocated lines in the provided memarea. - * - * This implementation is consensus-specific. To generate an ed diff for any - * given input in quadratic time, you can replace all the code until the - * navigation in reverse order with the following: - * - * int len1 = smartlist_len(cons1); - * int len2 = smartlist_len(cons2); - * bitarray_t *changed1 = bitarray_init_zero(len1); - * bitarray_t *changed2 = bitarray_init_zero(len2); - * cons1_sl = smartlist_slice(cons1, 0, -1); - * cons2_sl = smartlist_slice(cons2, 0, -1); - * calc_changes(cons1_sl, cons2_sl, changed1, changed2); - */ -STATIC smartlist_t * -gen_ed_diff(const smartlist_t *cons1_orig, const smartlist_t *cons2, - memarea_t *area) -{ - smartlist_t *cons1 = smartlist_new(); - smartlist_add_all(cons1, cons1_orig); - cdline_t *remove_trailer = preprocess_consensus(area, cons1); - - int len1 = smartlist_len(cons1); - int len2 = smartlist_len(cons2); - smartlist_t *result = smartlist_new(); - - if (remove_trailer) { - /* There's a delete-the-trailer line at the end, so add it here. */ - smartlist_add(result, remove_trailer); - } - - /* Initialize the changed bitarrays to zero, so that calc_changes only needs - * to set the ones that matter and leave the rest untouched. - */ - bitarray_t *changed1 = bitarray_init_zero(len1); - bitarray_t *changed2 = bitarray_init_zero(len2); - int i1=-1, i2=-1; - int start1=0, start2=0; - - /* To check that hashes are ordered properly */ - router_id_iterator_t iter1 = ROUTER_ID_ITERATOR_INIT; - router_id_iterator_t iter2 = ROUTER_ID_ITERATOR_INIT; - - /* i1 and i2 are initialized at the first line of each consensus. They never - * reach past len1 and len2 respectively, since next_router doesn't let that - * happen. i1 and i2 are advanced by at least one line at each iteration as - * long as they have not yet reached len1 and len2, so the loop is - * guaranteed to end, and each pair of (i1,i2) will be inspected at most - * once. - */ - while (i1 < len1 || i2 < len2) { - - /* Advance each of the two navigation positions by one router entry if not - * yet at the end. - */ - if (i1 < len1) { - if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { - goto error_cleanup; - } - } - - if (i2 < len2) { - if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { - goto error_cleanup; - } - } - - /* If we have reached the end of both consensuses, there is no need to - * compare hashes anymore, since this is the last iteration. - */ - if (i1 < len1 || i2 < len2) { - - /* Keep on advancing the lower (by identity hash sorting) position until - * we have two matching positions. The only other possible outcome is - * that a lower position reaches the end of the consensus before it can - * reach a hash that is no longer the lower one. Since there will always - * be a lower hash for as long as the loop runs, one of the two indexes - * will always be incremented, thus assuring that the loop must end - * after a finite number of iterations. If that cannot be because said - * consensus has already reached the end, both are extended to their - * respecting ends since we are done. - */ - int cmp = base64cmp(&iter1.hash, &iter2.hash); - while (cmp != 0) { - if (i1 < len1 && cmp < 0) { - if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { - goto error_cleanup; - } - if (i1 == len1) { - /* We finished the first consensus, so grab all the remaining - * lines of the second consensus and finish up. - */ - i2 = len2; - break; - } - } else if (i2 < len2 && cmp > 0) { - if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { - goto error_cleanup; - } - if (i2 == len2) { - /* We finished the second consensus, so grab all the remaining - * lines of the first consensus and finish up. - */ - i1 = len1; - break; - } - } else { - i1 = len1; - i2 = len2; - break; - } - cmp = base64cmp(&iter1.hash, &iter2.hash); - } - } - - /* Make slices out of these chunks (up to the common router entry) and - * calculate the changes for them. - * Error if any of the two slices are longer than 10K lines. That should - * never happen with any pair of real consensuses. Feeding more than 10K - * lines to calc_changes would be very slow anyway. - */ -#define MAX_LINE_COUNT (10000) - if (i1-start1 > MAX_LINE_COUNT || i2-start2 > MAX_LINE_COUNT) { - log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " - "we found too few common router ids."); - goto error_cleanup; - } - - smartlist_slice_t *cons1_sl = smartlist_slice(cons1, start1, i1); - smartlist_slice_t *cons2_sl = smartlist_slice(cons2, start2, i2); - calc_changes(cons1_sl, cons2_sl, changed1, changed2); - tor_free(cons1_sl); - tor_free(cons2_sl); - start1 = i1, start2 = i2; - } - - /* Navigate the changes in reverse order and generate one ed command for - * each chunk of changes. - */ - i1=len1-1, i2=len2-1; - char buf[128]; - while (i1 >= 0 || i2 >= 0) { - - int start1x, start2x, end1, end2, added, deleted; - - /* We are at a point were no changed bools are true, so just keep going. */ - if (!(i1 >= 0 && bitarray_is_set(changed1, i1)) && - !(i2 >= 0 && bitarray_is_set(changed2, i2))) { - if (i1 >= 0) { - i1--; - } - if (i2 >= 0) { - i2--; - } - continue; - } - - end1 = i1, end2 = i2; - - /* Grab all contiguous changed lines */ - while (i1 >= 0 && bitarray_is_set(changed1, i1)) { - i1--; - } - while (i2 >= 0 && bitarray_is_set(changed2, i2)) { - i2--; - } - - start1x = i1+1, start2x = i2+1; - added = end2-i2, deleted = end1-i1; - - if (added == 0) { - if (deleted == 1) { - tor_snprintf(buf, sizeof(buf), "%id", start1x+1); - smartlist_add_linecpy(result, area, buf); - } else { - tor_snprintf(buf, sizeof(buf), "%i,%id", start1x+1, start1x+deleted); - smartlist_add_linecpy(result, area, buf); - } - } else { - int i; - if (deleted == 0) { - tor_snprintf(buf, sizeof(buf), "%ia", start1x); - smartlist_add_linecpy(result, area, buf); - } else if (deleted == 1) { - tor_snprintf(buf, sizeof(buf), "%ic", start1x+1); - smartlist_add_linecpy(result, area, buf); - } else { - tor_snprintf(buf, sizeof(buf), "%i,%ic", start1x+1, start1x+deleted); - smartlist_add_linecpy(result, area, buf); - } - - for (i = start2x; i <= end2; ++i) { - cdline_t *line = smartlist_get(cons2, i); - if (line_str_eq(line, ".")) { - log_warn(LD_CONSDIFF, "Cannot generate consensus diff because " - "one of the lines to be added is \".\"."); - goto error_cleanup; - } - smartlist_add(result, line); - } - smartlist_add_linecpy(result, area, "."); - } - } - - smartlist_free(cons1); - bitarray_free(changed1); - bitarray_free(changed2); - - return result; - - error_cleanup: - - smartlist_free(cons1); - bitarray_free(changed1); - bitarray_free(changed2); - - smartlist_free(result); - - return NULL; -} - -/* Helper: Read a base-10 number between 0 and INT32_MAX from s and - * store it in num_out. Advance s to the characer immediately - * after the number. Return 0 on success, -1 on failure. */ -static int -get_linenum(const char **s, int *num_out) -{ - int ok; - char *next; - if (!TOR_ISDIGIT(**s)) { - return -1; - } - *num_out = (int) tor_parse_long(*s, 10, 0, INT32_MAX, &ok, &next); - if (ok && next) { - *s = next; - return 0; - } else { - return -1; - } -} - -/** Apply the ed diff, starting at diff_starting_line, to the consensus - * and return a new consensus, also as a line-based smartlist. Will return - * NULL if the ed diff is not properly formatted. - * - * All cdline_t objects in the resulting object are references to lines - * in one of the inputs; nothing is copied. - */ -STATIC smartlist_t * -apply_ed_diff(const smartlist_t *cons1, const smartlist_t *diff, - int diff_starting_line) -{ - int diff_len = smartlist_len(diff); - int j = smartlist_len(cons1); - smartlist_t *cons2 = smartlist_new(); - - for (int i=diff_starting_line; ilen > sizeof(diff_line) - 1) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an ed command was far too long"); - goto error_cleanup; - } - /* Copy the line to make it nul-terminated. */ - memcpy(diff_line, diff_cdline->s, diff_cdline->len); - diff_line[diff_cdline->len] = 0; - const char *ptr = diff_line; - int start = 0, end = 0; - int had_range = 0; - int end_was_eof = 0; - if (get_linenum(&ptr, &start) < 0) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an ed command was missing a line number."); - goto error_cleanup; - } - if (*ptr == ',') { - /* Two-item range */ - had_range = 1; - ++ptr; - if (*ptr == '$') { - end_was_eof = 1; - end = smartlist_len(cons1); - ++ptr; - } else if (get_linenum(&ptr, &end) < 0) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an ed command was missing a range end line number."); - goto error_cleanup; - } - /* Incoherent range. */ - if (end <= start) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an invalid range was found in an ed command."); - goto error_cleanup; - } - } else { - /* We'll take as , for simplicity. */ - end = start; - } - - if (end > j) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "its commands are not properly sorted in reverse order."); - goto error_cleanup; - } - - if (*ptr == '\0') { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "a line with no ed command was found"); - goto error_cleanup; - } - - if (*(ptr+1) != '\0') { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an ed command longer than one char was found."); - goto error_cleanup; - } - - char action = *ptr; - - switch (action) { - case 'a': - case 'c': - case 'd': - break; - default: - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "an unrecognised ed command was found."); - goto error_cleanup; - } - - /** $ is not allowed with non-d actions. */ - if (end_was_eof && action != 'd') { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "it wanted to use $ with a command other than delete"); - goto error_cleanup; - } - - /* 'a' commands are not allowed to have ranges. */ - if (had_range && action == 'a') { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "it wanted to add lines after a range."); - goto error_cleanup; - } - - /* Add unchanged lines. */ - for (; j && j > end; --j) { - cdline_t *cons_line = smartlist_get(cons1, j-1); - smartlist_add(cons2, cons_line); - } - - /* Ignore removed lines. */ - if (action == 'c' || action == 'd') { - while (--j >= start) { - /* Skip line */ - } - } - - /* Add new lines in reverse order, since it will all be reversed at the - * end. - */ - if (action == 'a' || action == 'c') { - int added_end = i; - - i++; /* Skip the line with the range and command. */ - while (i < diff_len) { - if (line_str_eq(smartlist_get(diff, i), ".")) { - break; - } - if (++i == diff_len) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "it has lines to be inserted that don't end with a \".\"."); - goto error_cleanup; - } - } - - int added_i = i-1; - - /* It would make no sense to add zero new lines. */ - if (added_i == added_end) { - log_warn(LD_CONSDIFF, "Could not apply consensus diff because " - "it has an ed command that tries to insert zero lines."); - goto error_cleanup; - } - - while (added_i > added_end) { - cdline_t *added_line = smartlist_get(diff, added_i--); - smartlist_add(cons2, added_line); - } - } - } - - /* Add remaining unchanged lines. */ - for (; j > 0; --j) { - cdline_t *cons_line = smartlist_get(cons1, j-1); - smartlist_add(cons2, cons_line); - } - - /* Reverse the whole thing since we did it from the end. */ - smartlist_reverse(cons2); - return cons2; - - error_cleanup: - - smartlist_free(cons2); - - return NULL; -} - -/** Generate a consensus diff as a smartlist from two given consensuses, also - * as smartlists. Will return NULL if the consensus diff could not be - * generated. Neither of the two consensuses are modified in any way, so it's - * up to the caller to free their resources. - */ -smartlist_t * -consdiff_gen_diff(const smartlist_t *cons1, - const smartlist_t *cons2, - const consensus_digest_t *digests1, - const consensus_digest_t *digests2, - memarea_t *area) -{ - smartlist_t *ed_diff = gen_ed_diff(cons1, cons2, area); - /* ed diff could not be generated - reason already logged by gen_ed_diff. */ - if (!ed_diff) { - goto error_cleanup; - } - - /* See that the script actually produces what we want. */ - smartlist_t *ed_cons2 = apply_ed_diff(cons1, ed_diff, 0); - if (!ed_cons2) { - /* LCOV_EXCL_START -- impossible if diff generation is correct */ - log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " - "the generated ed diff could not be tested to successfully generate " - "the target consensus."); - goto error_cleanup; - /* LCOV_EXCL_STOP */ - } - - int cons2_eq = 1; - if (smartlist_len(cons2) == smartlist_len(ed_cons2)) { - SMARTLIST_FOREACH_BEGIN(cons2, const cdline_t *, line1) { - const cdline_t *line2 = smartlist_get(ed_cons2, line1_sl_idx); - if (! lines_eq(line1, line2) ) { - cons2_eq = 0; - break; - } - } SMARTLIST_FOREACH_END(line1); - } else { - cons2_eq = 0; - } - smartlist_free(ed_cons2); - if (!cons2_eq) { - /* LCOV_EXCL_START -- impossible if diff generation is correct. */ - log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " - "the generated ed diff did not generate the target consensus " - "successfully when tested."); - goto error_cleanup; - /* LCOV_EXCL_STOP */ - } - - char cons1_hash_hex[HEX_DIGEST256_LEN+1]; - char cons2_hash_hex[HEX_DIGEST256_LEN+1]; - base16_encode(cons1_hash_hex, HEX_DIGEST256_LEN+1, - (const char*)digests1->sha3_256, DIGEST256_LEN); - base16_encode(cons2_hash_hex, HEX_DIGEST256_LEN+1, - (const char*)digests2->sha3_256, DIGEST256_LEN); - - /* Create the resulting consensus diff. */ - char buf[160]; - smartlist_t *result = smartlist_new(); - tor_snprintf(buf, sizeof(buf), "%s", ns_diff_version); - smartlist_add_linecpy(result, area, buf); - tor_snprintf(buf, sizeof(buf), "%s %s %s", hash_token, - cons1_hash_hex, cons2_hash_hex); - smartlist_add_linecpy(result, area, buf); - smartlist_add_all(result, ed_diff); - smartlist_free(ed_diff); - return result; - - error_cleanup: - - if (ed_diff) { - /* LCOV_EXCL_START -- ed_diff is NULL except in unreachable cases above */ - smartlist_free(ed_diff); - /* LCOV_EXCL_STOP */ - } - - return NULL; -} - -/** Fetch the digest of the base consensus in the consensus diff, encoded in - * base16 as found in the diff itself. digest1_out and digest2_out must be of - * length DIGEST256_LEN or larger if not NULL. - */ -int -consdiff_get_digests(const smartlist_t *diff, - char *digest1_out, - char *digest2_out) -{ - smartlist_t *hash_words = NULL; - const cdline_t *format; - char cons1_hash[DIGEST256_LEN], cons2_hash[DIGEST256_LEN]; - char *cons1_hash_hex, *cons2_hash_hex; - if (smartlist_len(diff) < 2) { - log_info(LD_CONSDIFF, "The provided consensus diff is too short."); - goto error_cleanup; - } - - /* Check that it's the format and version we know. */ - format = smartlist_get(diff, 0); - if (!line_str_eq(format, ns_diff_version)) { - log_warn(LD_CONSDIFF, "The provided consensus diff format is not known."); - goto error_cleanup; - } - - /* Grab the base16 digests. */ - hash_words = smartlist_new(); - { - const cdline_t *line2 = smartlist_get(diff, 1); - char *h = tor_memdup_nulterm(line2->s, line2->len); - smartlist_split_string(hash_words, h, " ", 0, 0); - tor_free(h); - } - - /* There have to be three words, the first of which must be hash_token. */ - if (smartlist_len(hash_words) != 3 || - strcmp(smartlist_get(hash_words, 0), hash_token)) { - log_info(LD_CONSDIFF, "The provided consensus diff does not include " - "the necessary digests."); - goto error_cleanup; - } - - /* Expected hashes as found in the consensus diff header. They must be of - * length HEX_DIGEST256_LEN, normally 64 hexadecimal characters. - * If any of the decodings fail, error to make sure that the hashes are - * proper base16-encoded digests. - */ - cons1_hash_hex = smartlist_get(hash_words, 1); - cons2_hash_hex = smartlist_get(hash_words, 2); - if (strlen(cons1_hash_hex) != HEX_DIGEST256_LEN || - strlen(cons2_hash_hex) != HEX_DIGEST256_LEN) { - log_info(LD_CONSDIFF, "The provided consensus diff includes " - "base16-encoded digests of incorrect size."); - goto error_cleanup; - } - - if (base16_decode(cons1_hash, DIGEST256_LEN, - cons1_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN || - base16_decode(cons2_hash, DIGEST256_LEN, - cons2_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN) { - log_info(LD_CONSDIFF, "The provided consensus diff includes " - "malformed digests."); - goto error_cleanup; - } - - if (digest1_out) { - memcpy(digest1_out, cons1_hash, DIGEST256_LEN); - } - if (digest2_out) { - memcpy(digest2_out, cons2_hash, DIGEST256_LEN); - } - - SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); - smartlist_free(hash_words); - return 0; - - error_cleanup: - - if (hash_words) { - SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); - smartlist_free(hash_words); - } - return 1; -} - -/** Apply the consensus diff to the given consensus and return a new - * consensus, also as a line-based smartlist. Will return NULL if the diff - * could not be applied. Neither the consensus nor the diff are modified in - * any way, so it's up to the caller to free their resources. - */ -char * -consdiff_apply_diff(const smartlist_t *cons1, - const smartlist_t *diff, - const consensus_digest_t *digests1) -{ - smartlist_t *cons2 = NULL; - char *cons2_str = NULL; - char e_cons1_hash[DIGEST256_LEN]; - char e_cons2_hash[DIGEST256_LEN]; - - if (consdiff_get_digests(diff, e_cons1_hash, e_cons2_hash) != 0) { - goto error_cleanup; - } - - /* See that the consensus that was given to us matches its hash. */ - if (!consensus_digest_eq(digests1->sha3_256, - (const uint8_t*)e_cons1_hash)) { - char hex_digest1[HEX_DIGEST256_LEN+1]; - char e_hex_digest1[HEX_DIGEST256_LEN+1]; - log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " - "the base consensus doesn't match the digest as found in " - "the consensus diff header."); - base16_encode(hex_digest1, HEX_DIGEST256_LEN+1, - (const char *)digests1->sha3_256, DIGEST256_LEN); - base16_encode(e_hex_digest1, HEX_DIGEST256_LEN+1, - e_cons1_hash, DIGEST256_LEN); - log_warn(LD_CONSDIFF, "Expected: %s; found: %s", - hex_digest1, e_hex_digest1); - goto error_cleanup; - } - - /* Grab the ed diff and calculate the resulting consensus. */ - /* Skip the first two lines. */ - cons2 = apply_ed_diff(cons1, diff, 2); - - /* ed diff could not be applied - reason already logged by apply_ed_diff. */ - if (!cons2) { - goto error_cleanup; - } - - cons2_str = consensus_join_lines(cons2); - - consensus_digest_t cons2_digests; - if (consensus_compute_digest(cons2_str, &cons2_digests) < 0) { - /* LCOV_EXCL_START -- digest can't fail */ - log_warn(LD_CONSDIFF, "Could not compute digests of the consensus " - "resulting from applying a consensus diff."); - goto error_cleanup; - /* LCOV_EXCL_STOP */ - } - - /* See that the resulting consensus matches its hash. */ - if (!consensus_digest_eq(cons2_digests.sha3_256, - (const uint8_t*)e_cons2_hash)) { - log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " - "the resulting consensus doesn't match the digest as found in " - "the consensus diff header."); - char hex_digest2[HEX_DIGEST256_LEN+1]; - char e_hex_digest2[HEX_DIGEST256_LEN+1]; - base16_encode(hex_digest2, HEX_DIGEST256_LEN+1, - (const char *)cons2_digests.sha3_256, DIGEST256_LEN); - base16_encode(e_hex_digest2, HEX_DIGEST256_LEN+1, - e_cons2_hash, DIGEST256_LEN); - log_warn(LD_CONSDIFF, "Expected: %s; found: %s", - hex_digest2, e_hex_digest2); - goto error_cleanup; - } - - goto done; - - error_cleanup: - tor_free(cons2_str); /* Sets it to NULL */ - - done: - if (cons2) { - smartlist_free(cons2); - } - - return cons2_str; -} - -/** Any consensus line longer than this means that the input is invalid. */ -#define CONSENSUS_LINE_MAX_LEN (1<<20) - -/** - * Helper: For every NL-terminated line in s, add a cdline referring to - * that line (without trailing newline) to out. Return -1 if there are - * any non-NL terminated lines; 0 otherwise. - * - * Unlike tor_split_lines, this function avoids ambiguity on its - * handling of a final line that isn't NL-terminated. - * - * All cdline_t objects are allocated in the provided memarea. Strings - * are not copied: if s changes or becomes invalid, then all - * generated cdlines will become invalid. - */ -STATIC int -consensus_split_lines(smartlist_t *out, const char *s, memarea_t *area) -{ - while (*s) { - const char *eol = strchr(s, '\n'); - if (!eol) { - /* File doesn't end with newline. */ - return -1; - } - if (eol - s > CONSENSUS_LINE_MAX_LEN) { - /* Line is far too long. */ - return -1; - } - cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); - line->s = s; - line->len = (uint32_t)(eol - s); - smartlist_add(out, line); - s = eol+1; - } - return 0; -} - -/** Given a list of cdline_t, return a newly allocated string containing - * all of the lines, terminated with NL, concatenated. - * - * Unlike smartlist_join_strings(), avoids lossy operations on empty - * lists. */ -static char * -consensus_join_lines(const smartlist_t *inp) -{ - size_t n = 0; - SMARTLIST_FOREACH(inp, const cdline_t *, cdline, n += cdline->len + 1); - n += 1; - char *result = tor_malloc(n); - char *out = result; - SMARTLIST_FOREACH_BEGIN(inp, const cdline_t *, cdline) { - memcpy(out, cdline->s, cdline->len); - out += cdline->len; - *out++ = '\n'; - } SMARTLIST_FOREACH_END(cdline); - *out++ = '\0'; - tor_assert(out == result+n); - return result; -} - -/** Given two consensus documents, try to compute a diff between them. On - * success, retun a newly allocated string containing that diff. On failure, - * return NULL. */ -char * -consensus_diff_generate(const char *cons1, - const char *cons2) -{ - consensus_digest_t d1, d2; - smartlist_t *lines1 = NULL, *lines2 = NULL, *result_lines = NULL; - int r1, r2; - char *result = NULL; - - r1 = consensus_compute_digest_as_signed(cons1, &d1); - r2 = consensus_compute_digest(cons2, &d2); - if (BUG(r1 < 0 || r2 < 0)) - return NULL; // LCOV_EXCL_LINE - - memarea_t *area = memarea_new(); - lines1 = smartlist_new(); - lines2 = smartlist_new(); - if (consensus_split_lines(lines1, cons1, area) < 0) - goto done; - if (consensus_split_lines(lines2, cons2, area) < 0) - goto done; - - result_lines = consdiff_gen_diff(lines1, lines2, &d1, &d2, area); - - done: - if (result_lines) { - result = consensus_join_lines(result_lines); - smartlist_free(result_lines); - } - - memarea_drop_all(area); - smartlist_free(lines1); - smartlist_free(lines2); - - return result; -} - -/** Given a consensus document and a diff, try to apply the diff to the - * consensus. On success return a newly allocated string containing the new - * consensus. On failure, return NULL. */ -char * -consensus_diff_apply(const char *consensus, - const char *diff) -{ - consensus_digest_t d1; - smartlist_t *lines1 = NULL, *lines2 = NULL; - int r1; - char *result = NULL; - memarea_t *area = memarea_new(); - - r1 = consensus_compute_digest_as_signed(consensus, &d1); - if (BUG(r1 < 0)) - return NULL; // LCOV_EXCL_LINE - - lines1 = smartlist_new(); - lines2 = smartlist_new(); - if (consensus_split_lines(lines1, consensus, area) < 0) - goto done; - if (consensus_split_lines(lines2, diff, area) < 0) - goto done; - - result = consdiff_apply_diff(lines1, lines2, &d1); - - done: - smartlist_free(lines1); - smartlist_free(lines2); - memarea_drop_all(area); - - return result; -} - -/** Return true iff, based on its header, document is likely - * to be a consensus diff. */ -int -looks_like_a_consensus_diff(const char *document, size_t len) -{ - return (len >= strlen(ns_diff_version) && - fast_memeq(document, ns_diff_version, strlen(ns_diff_version))); -} - diff --git a/src/tor/src/or/consdiff.h b/src/tor/src/or/consdiff.h deleted file mode 100644 index eb772c0b2..000000000 --- a/src/tor/src/or/consdiff.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2014, Daniel Martí - * Copyright (c) 2014, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONSDIFF_H -#define TOR_CONSDIFF_H - -#include "or.h" - -char *consensus_diff_generate(const char *cons1, - const char *cons2); -char *consensus_diff_apply(const char *consensus, - const char *diff); - -int looks_like_a_consensus_diff(const char *document, size_t len); - -#ifdef CONSDIFF_PRIVATE -struct memarea_t; - -/** Line type used for constructing consensus diffs. Each of these lines - * refers to a chunk of memory allocated elsewhere, and is not necessarily - * NUL-terminated: this helps us avoid copies and save memory. */ -typedef struct cdline_t { - const char *s; - uint32_t len; -} cdline_t; - -typedef struct consensus_digest_t { - uint8_t sha3_256[DIGEST256_LEN]; -} consensus_digest_t; - -STATIC smartlist_t *consdiff_gen_diff(const smartlist_t *cons1, - const smartlist_t *cons2, - const consensus_digest_t *digests1, - const consensus_digest_t *digests2, - struct memarea_t *area); -STATIC char *consdiff_apply_diff(const smartlist_t *cons1, - const smartlist_t *diff, - const consensus_digest_t *digests1); -STATIC int consdiff_get_digests(const smartlist_t *diff, - char *digest1_out, - char *digest2_out); - -/** Data structure to define a slice of a smarltist. */ -typedef struct smartlist_slice_t { - /** - * Smartlist that this slice is made from. - * References the whole original smartlist that the slice was made out of. - * */ - const smartlist_t *list; - /** Starting position of the slice in the smartlist. */ - int offset; - /** Length of the slice, i.e. the number of elements it holds. */ - int len; -} smartlist_slice_t; -STATIC smartlist_t *gen_ed_diff(const smartlist_t *cons1, - const smartlist_t *cons2, - struct memarea_t *area); -STATIC smartlist_t *apply_ed_diff(const smartlist_t *cons1, - const smartlist_t *diff, - int start_line); -STATIC void calc_changes(smartlist_slice_t *slice1, smartlist_slice_t *slice2, - bitarray_t *changed1, bitarray_t *changed2); -STATIC smartlist_slice_t *smartlist_slice(const smartlist_t *list, - int start, int end); -STATIC int next_router(const smartlist_t *cons, int cur); -STATIC int *lcs_lengths(const smartlist_slice_t *slice1, - const smartlist_slice_t *slice2, - int direction); -STATIC void trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2); -STATIC int base64cmp(const cdline_t *hash1, const cdline_t *hash2); -STATIC int get_id_hash(const cdline_t *line, cdline_t *hash_out); -STATIC int is_valid_router_entry(const cdline_t *line); -STATIC int smartlist_slice_string_pos(const smartlist_slice_t *slice, - const cdline_t *string); -STATIC void set_changed(bitarray_t *changed1, bitarray_t *changed2, - const smartlist_slice_t *slice1, - const smartlist_slice_t *slice2); -STATIC int consensus_split_lines(smartlist_t *out, const char *s, - struct memarea_t *area); -STATIC void smartlist_add_linecpy(smartlist_t *lst, struct memarea_t *area, - const char *s); -STATIC int lines_eq(const cdline_t *a, const cdline_t *b); -STATIC int line_str_eq(const cdline_t *a, const char *b); - -MOCK_DECL(STATIC int, - consensus_compute_digest,(const char *cons, - consensus_digest_t *digest_out)); -MOCK_DECL(STATIC int, - consensus_compute_digest_as_signed,(const char *cons, - consensus_digest_t *digest_out)); -MOCK_DECL(STATIC int, - consensus_digest_eq,(const uint8_t *d1, - const uint8_t *d2)); -#endif /* defined(CONSDIFF_PRIVATE) */ - -#endif /* !defined(TOR_CONSDIFF_H) */ - diff --git a/src/tor/src/or/consdiffmgr.c b/src/tor/src/or/consdiffmgr.c deleted file mode 100644 index 38d901a3a..000000000 --- a/src/tor/src/or/consdiffmgr.c +++ /dev/null @@ -1,1906 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file consdiffmsr.c - * - * \brief consensus diff manager functions - * - * This module is run by directory authorities and caches in order - * to remember a number of past consensus documents, and to generate - * and serve the diffs from those documents to the latest consensus. - */ - -#define CONSDIFFMGR_PRIVATE - -#include "or.h" -#include "config.h" -#include "conscache.h" -#include "consdiff.h" -#include "consdiffmgr.h" -#include "cpuworker.h" -#include "networkstatus.h" -#include "routerparse.h" -#include "workqueue.h" - -/** - * Labels to apply to items in the conscache object. - * - * @{ - */ -/* One of DOCTYPE_CONSENSUS or DOCTYPE_CONSENSUS_DIFF */ -#define LABEL_DOCTYPE "document-type" -/* The valid-after time for a consensus (or for the target consensus of a - * diff), encoded as ISO UTC. */ -#define LABEL_VALID_AFTER "consensus-valid-after" -/* The fresh-until time for a consensus (or for the target consensus of a - * diff), encoded as ISO UTC. */ -#define LABEL_FRESH_UNTIL "consensus-fresh-until" -/* The valid-until time for a consensus (or for the target consensus of a - * diff), encoded as ISO UTC. */ -#define LABEL_VALID_UNTIL "consensus-valid-until" -/* Comma-separated list of hex-encoded identity digests for the voting - * authorities. */ -#define LABEL_SIGNATORIES "consensus-signatories" -/* A hex encoded SHA3 digest of the object, as compressed (if any) */ -#define LABEL_SHA3_DIGEST "sha3-digest" -/* A hex encoded SHA3 digest of the object before compression. */ -#define LABEL_SHA3_DIGEST_UNCOMPRESSED "sha3-digest-uncompressed" -/* A hex encoded SHA3 digest-as-signed of a consensus */ -#define LABEL_SHA3_DIGEST_AS_SIGNED "sha3-digest-as-signed" -/* The flavor of the consensus or consensuses diff */ -#define LABEL_FLAVOR "consensus-flavor" -/* Diff only: the SHA3 digest-as-signed of the source consensus. */ -#define LABEL_FROM_SHA3_DIGEST "from-sha3-digest" -/* Diff only: the SHA3 digest-in-full of the target consensus. */ -#define LABEL_TARGET_SHA3_DIGEST "target-sha3-digest" -/* Diff only: the valid-after date of the source consensus. */ -#define LABEL_FROM_VALID_AFTER "from-valid-after" -/* What kind of compression was used? */ -#define LABEL_COMPRESSION_TYPE "compression" -/** @} */ - -#define DOCTYPE_CONSENSUS "consensus" -#define DOCTYPE_CONSENSUS_DIFF "consensus-diff" - -/** - * Underlying directory that stores consensuses and consensus diffs. Don't - * use this directly: use cdm_cache_get() instead. - */ -static consensus_cache_t *cons_diff_cache = NULL; -/** - * If true, we have learned at least one new consensus since the - * consensus cache was last up-to-date. - */ -static int cdm_cache_dirty = 0; -/** - * If true, we have scanned the cache to update our hashtable of diffs. - */ -static int cdm_cache_loaded = 0; - -/** - * Possible status values for cdm_diff_t.cdm_diff_status - **/ -typedef enum cdm_diff_status_t { - CDM_DIFF_PRESENT=1, - CDM_DIFF_IN_PROGRESS=2, - CDM_DIFF_ERROR=3, -} cdm_diff_status_t; - -/** Which methods do we use for precompressing diffs? */ -static const compress_method_t compress_diffs_with[] = { - NO_METHOD, - GZIP_METHOD, -#ifdef HAVE_LZMA - LZMA_METHOD, -#endif -#ifdef HAVE_ZSTD - ZSTD_METHOD, -#endif -}; - -/** How many different methods will we try to use for diff compression? */ -STATIC unsigned -n_diff_compression_methods(void) -{ - return ARRAY_LENGTH(compress_diffs_with); -} - -/** Which methods do we use for precompressing consensuses? */ -static const compress_method_t compress_consensus_with[] = { - ZLIB_METHOD, -#ifdef HAVE_LZMA - LZMA_METHOD, -#endif -#ifdef HAVE_ZSTD - ZSTD_METHOD, -#endif -}; - -/** How many different methods will we try to use for diff compression? */ -STATIC unsigned -n_consensus_compression_methods(void) -{ - return ARRAY_LENGTH(compress_consensus_with); -} - -/** For which compression method do we retain old consensuses? There's no - * need to keep all of them, since we won't be serving them. We'll - * go with ZLIB_METHOD because it's pretty fast and everyone has it. - */ -#define RETAIN_CONSENSUS_COMPRESSED_WITH_METHOD ZLIB_METHOD - -/** Handles pointing to the latest consensus entries as compressed and - * stored. */ -static consensus_cache_entry_handle_t * - latest_consensus[N_CONSENSUS_FLAVORS] - [ARRAY_LENGTH(compress_consensus_with)]; - -/** Hashtable node used to remember the current status of the diff - * from a given sha3 digest to the current consensus. */ -typedef struct cdm_diff_t { - HT_ENTRY(cdm_diff_t) node; - - /** Consensus flavor for this diff (part of ht key) */ - consensus_flavor_t flavor; - /** SHA3-256 digest of the consensus that this diff is _from_. (part of the - * ht key) */ - uint8_t from_sha3[DIGEST256_LEN]; - /** Method by which the diff is compressed. (part of the ht key */ - compress_method_t compress_method; - - /** One of the CDM_DIFF_* values, depending on whether this diff - * is available, in progress, or impossible to compute. */ - cdm_diff_status_t cdm_diff_status; - /** SHA3-256 digest of the consensus that this diff is _to. */ - uint8_t target_sha3[DIGEST256_LEN]; - - /** Handle to the cache entry for this diff, if any. We use a handle here - * to avoid thinking too hard about cache entry lifetime issues. */ - consensus_cache_entry_handle_t *entry; -} cdm_diff_t; - -/** Hashtable mapping flavor and source consensus digest to status. */ -static HT_HEAD(cdm_diff_ht, cdm_diff_t) cdm_diff_ht = HT_INITIALIZER(); - -/** - * Configuration for this module - */ -static consdiff_cfg_t consdiff_cfg = { - // XXXX I'd like to make this number bigger, but it interferes with the - // XXXX seccomp2 syscall filter, which tops out at BPF_MAXINS (4096) - // XXXX rules. - /* .cache_max_num = */ 128 -}; - -static int consdiffmgr_ensure_space_for_files(int n); -static int consensus_queue_compression_work(const char *consensus, - const networkstatus_t *as_parsed); -static int consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, - consensus_cache_entry_t *diff_to); -static void consdiffmgr_set_cache_flags(void); - -/* ===== - * Hashtable setup - * ===== */ - -/** Helper: hash the key of a cdm_diff_t. */ -static unsigned -cdm_diff_hash(const cdm_diff_t *diff) -{ - uint8_t tmp[DIGEST256_LEN + 2]; - memcpy(tmp, diff->from_sha3, DIGEST256_LEN); - tmp[DIGEST256_LEN] = (uint8_t) diff->flavor; - tmp[DIGEST256_LEN+1] = (uint8_t) diff->compress_method; - return (unsigned) siphash24g(tmp, sizeof(tmp)); -} -/** Helper: compare two cdm_diff_t objects for key equality */ -static int -cdm_diff_eq(const cdm_diff_t *diff1, const cdm_diff_t *diff2) -{ - return fast_memeq(diff1->from_sha3, diff2->from_sha3, DIGEST256_LEN) && - diff1->flavor == diff2->flavor && - diff1->compress_method == diff2->compress_method; -} - -HT_PROTOTYPE(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq) -HT_GENERATE2(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq, - 0.6, tor_reallocarray, tor_free_) - -#define cdm_diff_free(diff) \ - FREE_AND_NULL(cdm_diff_t, cdm_diff_free_, (diff)) - -/** Release all storage held in diff. */ -static void -cdm_diff_free_(cdm_diff_t *diff) -{ - if (!diff) - return; - consensus_cache_entry_handle_free(diff->entry); - tor_free(diff); -} - -/** Create and return a new cdm_diff_t with the given values. Does not - * add it to the hashtable. */ -static cdm_diff_t * -cdm_diff_new(consensus_flavor_t flav, - const uint8_t *from_sha3, - const uint8_t *target_sha3, - compress_method_t method) -{ - cdm_diff_t *ent; - ent = tor_malloc_zero(sizeof(cdm_diff_t)); - ent->flavor = flav; - memcpy(ent->from_sha3, from_sha3, DIGEST256_LEN); - memcpy(ent->target_sha3, target_sha3, DIGEST256_LEN); - ent->compress_method = method; - return ent; -} - -/** - * Examine the diff hashtable to see whether we know anything about computing - * a diff of type flav between consensuses with the two provided - * SHA3-256 digests. If a computation is in progress, or if the computation - * has already been tried and failed, return 1. Otherwise, note the - * computation as "in progress" so that we don't reattempt it later, and - * return 0. - */ -static int -cdm_diff_ht_check_and_note_pending(consensus_flavor_t flav, - const uint8_t *from_sha3, - const uint8_t *target_sha3) -{ - struct cdm_diff_t search, *ent; - unsigned u; - int result = 0; - for (u = 0; u < n_diff_compression_methods(); ++u) { - compress_method_t method = compress_diffs_with[u]; - memset(&search, 0, sizeof(cdm_diff_t)); - search.flavor = flav; - search.compress_method = method; - memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); - ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); - if (ent) { - tor_assert_nonfatal(ent->cdm_diff_status != CDM_DIFF_PRESENT); - result = 1; - continue; - } - ent = cdm_diff_new(flav, from_sha3, target_sha3, method); - ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; - HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); - } - return result; -} - -/** - * Update the status of the diff of type flav between consensuses with - * the two provided SHA3-256 digests, so that its status becomes - * status, and its value becomes the handle. If handle - * is NULL, then the old handle (if any) is freed, and replaced with NULL. - */ -static void -cdm_diff_ht_set_status(consensus_flavor_t flav, - const uint8_t *from_sha3, - const uint8_t *to_sha3, - compress_method_t method, - int status, - consensus_cache_entry_handle_t *handle) -{ - if (handle == NULL) { - tor_assert_nonfatal(status != CDM_DIFF_PRESENT); - } - - struct cdm_diff_t search, *ent; - memset(&search, 0, sizeof(cdm_diff_t)); - search.flavor = flav; - search.compress_method = method, - memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); - ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); - if (!ent) { - ent = cdm_diff_new(flav, from_sha3, to_sha3, method); - ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; - HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); - } else if (fast_memneq(ent->target_sha3, to_sha3, DIGEST256_LEN)) { - // This can happen under certain really pathological conditions - // if we decide we don't care about a diff before it is actually - // done computing. - return; - } - - tor_assert_nonfatal(ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS); - - ent->cdm_diff_status = status; - consensus_cache_entry_handle_free(ent->entry); - ent->entry = handle; -} - -/** - * Helper: Remove from the hash table every present (actually computed) diff - * of type flav whose target digest does not match - * unless_target_sha3_matches. - * - * This function is used for the hash table to throw away references to diffs - * that do not lead to the most given consensus of a given flavor. - */ -static void -cdm_diff_ht_purge(consensus_flavor_t flav, - const uint8_t *unless_target_sha3_matches) -{ - cdm_diff_t **diff, **next; - for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { - cdm_diff_t *this = *diff; - - if ((*diff)->cdm_diff_status == CDM_DIFF_PRESENT && - flav == (*diff)->flavor) { - - if (BUG((*diff)->entry == NULL) || - consensus_cache_entry_handle_get((*diff)->entry) == NULL) { - /* the underlying entry has gone away; drop this. */ - next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); - cdm_diff_free(this); - continue; - } - - if (unless_target_sha3_matches && - fast_memneq(unless_target_sha3_matches, (*diff)->target_sha3, - DIGEST256_LEN)) { - /* target hash doesn't match; drop this. */ - next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); - cdm_diff_free(this); - continue; - } - } - next = HT_NEXT(cdm_diff_ht, &cdm_diff_ht, diff); - } -} - -/** - * Helper: initialize cons_diff_cache. - */ -static void -cdm_cache_init(void) -{ - unsigned n_entries = consdiff_cfg.cache_max_num * 2; - - tor_assert(cons_diff_cache == NULL); - cons_diff_cache = consensus_cache_open("diff-cache", n_entries); - if (cons_diff_cache == NULL) { - // LCOV_EXCL_START - log_err(LD_FS, "Error: Couldn't open storage for consensus diffs."); - tor_assert_unreached(); - // LCOV_EXCL_STOP - } else { - consdiffmgr_set_cache_flags(); - } - cdm_cache_dirty = 1; - cdm_cache_loaded = 0; -} - -/** - * Helper: return the consensus_cache_t * that backs this manager, - * initializing it if needed. - */ -STATIC consensus_cache_t * -cdm_cache_get(void) -{ - if (PREDICT_UNLIKELY(cons_diff_cache == NULL)) { - cdm_cache_init(); - } - return cons_diff_cache; -} - -/** - * Helper: given a list of labels, prepend the hex-encoded SHA3 digest - * of the bodylen-byte object at body to those labels, - * with label as its label. - */ -static void -cdm_labels_prepend_sha3(config_line_t **labels, - const char *label, - const uint8_t *body, - size_t bodylen) -{ - uint8_t sha3_digest[DIGEST256_LEN]; - char hexdigest[HEX_DIGEST256_LEN+1]; - crypto_digest256((char *)sha3_digest, - (const char *)body, bodylen, DIGEST_SHA3_256); - base16_encode(hexdigest, sizeof(hexdigest), - (const char *)sha3_digest, sizeof(sha3_digest)); - - config_line_prepend(labels, label, hexdigest); -} - -/** Helper: if there is a sha3-256 hex-encoded digest in ent with the - * given label, set digest_out to that value (decoded), and return 0. - * - * Return -1 if there is no such label, and -2 if it is badly formatted. */ -STATIC int -cdm_entry_get_sha3_value(uint8_t *digest_out, - consensus_cache_entry_t *ent, - const char *label) -{ - if (ent == NULL) - return -1; - - const char *hex = consensus_cache_entry_get_value(ent, label); - if (hex == NULL) - return -1; - - int n = base16_decode((char*)digest_out, DIGEST256_LEN, hex, strlen(hex)); - if (n != DIGEST256_LEN) - return -2; - else - return 0; -} - -/** - * Helper: look for a consensus with the given flavor and - * valid_after time in the cache. Return that consensus if it's - * present, or NULL if it's missing. - */ -STATIC consensus_cache_entry_t * -cdm_cache_lookup_consensus(consensus_flavor_t flavor, time_t valid_after) -{ - char formatted_time[ISO_TIME_LEN+1]; - format_iso_time_nospace(formatted_time, valid_after); - const char *flavname = networkstatus_get_flavor_name(flavor); - - /* We'll filter by valid-after time first, since that should - * match the fewest documents. */ - /* We could add an extra hashtable here, but since we only do this scan - * when adding a new consensus, it probably doesn't matter much. */ - smartlist_t *matches = smartlist_new(); - consensus_cache_find_all(matches, cdm_cache_get(), - LABEL_VALID_AFTER, formatted_time); - consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); - consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - - consensus_cache_entry_t *result = NULL; - if (smartlist_len(matches)) { - result = smartlist_get(matches, 0); - } - smartlist_free(matches); - - return result; -} - -/** Return the maximum age (in seconds) of consensuses that we should consider - * storing. The available space in the directory may impose additional limits - * on how much we store. */ -static int32_t -get_max_age_to_cache(void) -{ - const int32_t DEFAULT_MAX_AGE_TO_CACHE = 8192; - const int32_t MIN_MAX_AGE_TO_CACHE = 0; - const int32_t MAX_MAX_AGE_TO_CACHE = 8192; - const char MAX_AGE_TO_CACHE_NAME[] = "max-consensus-age-to-cache-for-diff"; - - const or_options_t *options = get_options(); - - if (options->MaxConsensusAgeForDiffs) { - const int v = options->MaxConsensusAgeForDiffs; - if (v >= MAX_MAX_AGE_TO_CACHE * 3600) - return MAX_MAX_AGE_TO_CACHE; - else - return v; - } - - /* The parameter is in hours, so we multiply */ - return 3600 * networkstatus_get_param(NULL, - MAX_AGE_TO_CACHE_NAME, - DEFAULT_MAX_AGE_TO_CACHE, - MIN_MAX_AGE_TO_CACHE, - MAX_MAX_AGE_TO_CACHE); -} - -/** - * Given a string containing a networkstatus consensus, and the results of - * having parsed that consensus, add that consensus to the cache if it is not - * already present and not too old. Create new consensus diffs from or to - * that consensus as appropriate. - * - * Return 0 on success and -1 on failure. - */ -int -consdiffmgr_add_consensus(const char *consensus, - const networkstatus_t *as_parsed) -{ - if (BUG(consensus == NULL) || BUG(as_parsed == NULL)) - return -1; // LCOV_EXCL_LINE - if (BUG(as_parsed->type != NS_TYPE_CONSENSUS)) - return -1; // LCOV_EXCL_LINE - - const consensus_flavor_t flavor = as_parsed->flavor; - const time_t valid_after = as_parsed->valid_after; - - if (valid_after < approx_time() - get_max_age_to_cache()) { - log_info(LD_DIRSERV, "We don't care about this consensus document; it's " - "too old."); - return -1; - } - - /* Do we already have this one? */ - consensus_cache_entry_t *entry = - cdm_cache_lookup_consensus(flavor, valid_after); - if (entry) { - log_info(LD_DIRSERV, "We already have a copy of that consensus"); - return -1; - } - - /* We don't have it. Add it to the cache. */ - return consensus_queue_compression_work(consensus, as_parsed); -} - -/** - * Helper: used to sort two smartlists of consensus_cache_entry_t by their - * LABEL_VALID_AFTER labels. - */ -static int -compare_by_valid_after_(const void **a, const void **b) -{ - const consensus_cache_entry_t *e1 = *a; - const consensus_cache_entry_t *e2 = *b; - /* We're in luck here: sorting UTC iso-encoded values lexically will work - * fine (until 9999). */ - return strcmp_opt(consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER), - consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER)); -} - -/** - * Helper: Sort lst by LABEL_VALID_AFTER and return the most recent - * entry. - */ -static consensus_cache_entry_t * -sort_and_find_most_recent(smartlist_t *lst) -{ - smartlist_sort(lst, compare_by_valid_after_); - if (smartlist_len(lst)) { - return smartlist_get(lst, smartlist_len(lst) - 1); - } else { - return NULL; - } -} - -/** Return i such that compress_consensus_with[i] == method. Return - * -1 if no such i exists. */ -static int -consensus_compression_method_pos(compress_method_t method) -{ - unsigned i; - for (i = 0; i < n_consensus_compression_methods(); ++i) { - if (compress_consensus_with[i] == method) { - return i; - } - } - return -1; -} - -/** - * If we know a consensus with the flavor flavor compressed with - * method, set *entry_out to that value. Return values are as - * for consdiffmgr_find_diff_from(). - */ -consdiff_status_t -consdiffmgr_find_consensus(struct consensus_cache_entry_t **entry_out, - consensus_flavor_t flavor, - compress_method_t method) -{ - tor_assert(entry_out); - tor_assert((int)flavor < N_CONSENSUS_FLAVORS); - - int pos = consensus_compression_method_pos(method); - if (pos < 0) { - // We don't compress consensuses with this method. - return CONSDIFF_NOT_FOUND; - } - consensus_cache_entry_handle_t *handle = latest_consensus[flavor][pos]; - if (!handle) - return CONSDIFF_NOT_FOUND; - *entry_out = consensus_cache_entry_handle_get(handle); - if (*entry_out) - return CONSDIFF_AVAILABLE; - else - return CONSDIFF_NOT_FOUND; -} - -/** - * Look up consensus_cache_entry_t for the consensus of type flavor, - * from the source consensus with the specified digest (which must be SHA3). - * - * If the diff is present, store it into *entry_out and return - * CONSDIFF_AVAILABLE. Otherwise return CONSDIFF_NOT_FOUND or - * CONSDIFF_IN_PROGRESS. - */ -consdiff_status_t -consdiffmgr_find_diff_from(consensus_cache_entry_t **entry_out, - consensus_flavor_t flavor, - int digest_type, - const uint8_t *digest, - size_t digestlen, - compress_method_t method) -{ - if (BUG(digest_type != DIGEST_SHA3_256) || - BUG(digestlen != DIGEST256_LEN)) { - return CONSDIFF_NOT_FOUND; // LCOV_EXCL_LINE - } - - // Try to look up the entry in the hashtable. - cdm_diff_t search, *ent; - memset(&search, 0, sizeof(search)); - search.flavor = flavor; - search.compress_method = method; - memcpy(search.from_sha3, digest, DIGEST256_LEN); - ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); - - if (ent == NULL || - ent->cdm_diff_status == CDM_DIFF_ERROR) { - return CONSDIFF_NOT_FOUND; - } else if (ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS) { - return CONSDIFF_IN_PROGRESS; - } else if (BUG(ent->cdm_diff_status != CDM_DIFF_PRESENT)) { - return CONSDIFF_IN_PROGRESS; - } - - if (BUG(ent->entry == NULL)) { - return CONSDIFF_NOT_FOUND; - } - *entry_out = consensus_cache_entry_handle_get(ent->entry); - return (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; - -#if 0 - // XXXX Remove this. I'm keeping it around for now in case we need to - // XXXX debug issues in the hashtable. - char hex[HEX_DIGEST256_LEN+1]; - base16_encode(hex, sizeof(hex), (const char *)digest, digestlen); - const char *flavname = networkstatus_get_flavor_name(flavor); - - smartlist_t *matches = smartlist_new(); - consensus_cache_find_all(matches, cdm_cache_get(), - LABEL_FROM_SHA3_DIGEST, hex); - consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); - consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); - - *entry_out = sort_and_find_most_recent(matches); - consdiff_status_t result = - (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; - smartlist_free(matches); - - return result; -#endif /* 0 */ -} - -/** - * Perform periodic cleanup tasks on the consensus diff cache. Return - * the number of objects marked for deletion. - */ -int -consdiffmgr_cleanup(void) -{ - smartlist_t *objects = smartlist_new(); - smartlist_t *consensuses = smartlist_new(); - smartlist_t *diffs = smartlist_new(); - int n_to_delete = 0; - - log_debug(LD_DIRSERV, "Looking for consdiffmgr entries to remove"); - - // 1. Delete any consensus or diff or anything whose valid_after is too old. - const time_t valid_after_cutoff = approx_time() - get_max_age_to_cache(); - - consensus_cache_find_all(objects, cdm_cache_get(), - NULL, NULL); - SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { - const char *lv_valid_after = - consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); - if (! lv_valid_after) { - log_debug(LD_DIRSERV, "Ignoring entry because it had no %s label", - LABEL_VALID_AFTER); - continue; - } - time_t valid_after = 0; - if (parse_iso_time_nospace(lv_valid_after, &valid_after) < 0) { - log_debug(LD_DIRSERV, "Ignoring entry because its %s value (%s) was " - "unparseable", LABEL_VALID_AFTER, escaped(lv_valid_after)); - continue; - } - if (valid_after < valid_after_cutoff) { - log_debug(LD_DIRSERV, "Deleting entry because its %s value (%s) was " - "too old", LABEL_VALID_AFTER, lv_valid_after); - consensus_cache_entry_mark_for_removal(ent); - ++n_to_delete; - } - } SMARTLIST_FOREACH_END(ent); - - // 2. Delete all diffs that lead to a consensus whose valid-after is not the - // latest. - for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - const char *flavname = networkstatus_get_flavor_name(flav); - /* Determine the most recent consensus of this flavor */ - consensus_cache_find_all(consensuses, cdm_cache_get(), - LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - consensus_cache_filter_list(consensuses, LABEL_FLAVOR, flavname); - consensus_cache_entry_t *most_recent = - sort_and_find_most_recent(consensuses); - if (most_recent == NULL) - continue; - const char *most_recent_sha3 = - consensus_cache_entry_get_value(most_recent, - LABEL_SHA3_DIGEST_UNCOMPRESSED); - if (BUG(most_recent_sha3 == NULL)) - continue; // LCOV_EXCL_LINE - - /* consider all such-flavored diffs, and look to see if they match. */ - consensus_cache_find_all(diffs, cdm_cache_get(), - LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); - consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); - SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { - const char *this_diff_target_sha3 = - consensus_cache_entry_get_value(diff, LABEL_TARGET_SHA3_DIGEST); - if (!this_diff_target_sha3) - continue; - if (strcmp(this_diff_target_sha3, most_recent_sha3)) { - consensus_cache_entry_mark_for_removal(diff); - ++n_to_delete; - } - } SMARTLIST_FOREACH_END(diff); - smartlist_clear(consensuses); - smartlist_clear(diffs); - } - - // 3. Delete all consensuses except the most recent that are compressed with - // an un-preferred method. - for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - const char *flavname = networkstatus_get_flavor_name(flav); - /* Determine the most recent consensus of this flavor */ - consensus_cache_find_all(consensuses, cdm_cache_get(), - LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - consensus_cache_filter_list(consensuses, LABEL_FLAVOR, flavname); - consensus_cache_entry_t *most_recent = - sort_and_find_most_recent(consensuses); - if (most_recent == NULL) - continue; - const char *most_recent_sha3_uncompressed = - consensus_cache_entry_get_value(most_recent, - LABEL_SHA3_DIGEST_UNCOMPRESSED); - const char *retain_methodname = compression_method_get_name( - RETAIN_CONSENSUS_COMPRESSED_WITH_METHOD); - - if (BUG(most_recent_sha3_uncompressed == NULL)) - continue; - SMARTLIST_FOREACH_BEGIN(consensuses, consensus_cache_entry_t *, ent) { - const char *lv_sha3_uncompressed = - consensus_cache_entry_get_value(ent, LABEL_SHA3_DIGEST_UNCOMPRESSED); - if (BUG(! lv_sha3_uncompressed)) - continue; - if (!strcmp(lv_sha3_uncompressed, most_recent_sha3_uncompressed)) - continue; // This _is_ the most recent. - const char *lv_methodname = - consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE); - if (! lv_methodname || strcmp(lv_methodname, retain_methodname)) { - consensus_cache_entry_mark_for_removal(ent); - ++n_to_delete; - } - } SMARTLIST_FOREACH_END(ent); - } - - smartlist_free(objects); - smartlist_free(consensuses); - smartlist_free(diffs); - - // Actually remove files, if they're not used. - consensus_cache_delete_pending(cdm_cache_get(), 0); - return n_to_delete; -} - -/** - * Initialize the consensus diff manager and its cache, and configure - * its parameters based on the latest torrc and networkstatus parameters. - */ -void -consdiffmgr_configure(const consdiff_cfg_t *cfg) -{ - if (cfg) - memcpy(&consdiff_cfg, cfg, sizeof(consdiff_cfg)); - - (void) cdm_cache_get(); -} - -/** - * Tell the sandbox (if any) configured by cfg to allow the - * operations that the consensus diff manager will need. - */ -int -consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg) -{ - return consensus_cache_register_with_sandbox(cdm_cache_get(), cfg); -} - -/** - * Scan the consensus diff manager's cache for any grossly malformed entries, - * and mark them as deletable. Return 0 if no problems were found; 1 - * if problems were found and fixed. - */ -int -consdiffmgr_validate(void) -{ - /* Right now, we only check for entries that have bad sha3 values */ - int problems = 0; - - smartlist_t *objects = smartlist_new(); - consensus_cache_find_all(objects, cdm_cache_get(), - NULL, NULL); - SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, obj) { - uint8_t sha3_expected[DIGEST256_LEN]; - uint8_t sha3_received[DIGEST256_LEN]; - int r = cdm_entry_get_sha3_value(sha3_expected, obj, LABEL_SHA3_DIGEST); - if (r == -1) { - /* digest isn't there; that's allowed */ - continue; - } else if (r == -2) { - /* digest is malformed; that's not allowed */ - problems = 1; - consensus_cache_entry_mark_for_removal(obj); - continue; - } - const uint8_t *body; - size_t bodylen; - consensus_cache_entry_incref(obj); - r = consensus_cache_entry_get_body(obj, &body, &bodylen); - if (r == 0) { - crypto_digest256((char *)sha3_received, (const char *)body, bodylen, - DIGEST_SHA3_256); - } - consensus_cache_entry_decref(obj); - if (r < 0) - continue; - - // Deconfuse coverity about the possibility of sha3_received being - // uninitialized - tor_assert(r <= 0); - - if (fast_memneq(sha3_received, sha3_expected, DIGEST256_LEN)) { - problems = 1; - consensus_cache_entry_mark_for_removal(obj); - continue; - } - - } SMARTLIST_FOREACH_END(obj); - smartlist_free(objects); - return problems; -} - -/** - * Helper: build new diffs of flavor as needed - */ -static void -consdiffmgr_rescan_flavor_(consensus_flavor_t flavor) -{ - smartlist_t *matches = NULL; - smartlist_t *diffs = NULL; - smartlist_t *compute_diffs_from = NULL; - strmap_t *have_diff_from = NULL; - - // look for the most recent consensus, and for all previous in-range - // consensuses. Do they all have diffs to it? - const char *flavname = networkstatus_get_flavor_name(flavor); - - // 1. find the most recent consensus, and the ones that we might want - // to diff to it. - const char *methodname = compression_method_get_name( - RETAIN_CONSENSUS_COMPRESSED_WITH_METHOD); - - matches = smartlist_new(); - consensus_cache_find_all(matches, cdm_cache_get(), - LABEL_FLAVOR, flavname); - consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - consensus_cache_filter_list(matches, LABEL_COMPRESSION_TYPE, methodname); - consensus_cache_entry_t *most_recent = sort_and_find_most_recent(matches); - if (!most_recent) { - log_info(LD_DIRSERV, "No 'most recent' %s consensus found; " - "not making diffs", flavname); - goto done; - } - tor_assert(smartlist_len(matches)); - smartlist_del(matches, smartlist_len(matches) - 1); - - const char *most_recent_valid_after = - consensus_cache_entry_get_value(most_recent, LABEL_VALID_AFTER); - if (BUG(most_recent_valid_after == NULL)) - goto done; //LCOV_EXCL_LINE - uint8_t most_recent_sha3[DIGEST256_LEN]; - if (BUG(cdm_entry_get_sha3_value(most_recent_sha3, most_recent, - LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) - goto done; //LCOV_EXCL_LINE - - // 2. Find all the relevant diffs _to_ this consensus. These are ones - // that we don't need to compute. - diffs = smartlist_new(); - consensus_cache_find_all(diffs, cdm_cache_get(), - LABEL_VALID_AFTER, most_recent_valid_after); - consensus_cache_filter_list(diffs, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); - consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); - have_diff_from = strmap_new(); - SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { - const char *va = consensus_cache_entry_get_value(diff, - LABEL_FROM_VALID_AFTER); - if (BUG(va == NULL)) - continue; // LCOV_EXCL_LINE - strmap_set(have_diff_from, va, diff); - } SMARTLIST_FOREACH_END(diff); - - // 3. See which consensuses in 'matches' don't have diffs yet. - smartlist_reverse(matches); // from newest to oldest. - compute_diffs_from = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(matches, consensus_cache_entry_t *, ent) { - const char *va = consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); - if (BUG(va == NULL)) - continue; // LCOV_EXCL_LINE - if (strmap_get(have_diff_from, va) != NULL) - continue; /* we already have this one. */ - smartlist_add(compute_diffs_from, ent); - /* Since we are not going to serve this as the most recent consensus - * any more, we should stop keeping it mmap'd when it's not in use. - */ - consensus_cache_entry_mark_for_aggressive_release(ent); - } SMARTLIST_FOREACH_END(ent); - - log_info(LD_DIRSERV, - "The most recent %s consensus is valid-after %s. We have diffs to " - "this consensus for %d/%d older %s consensuses. Generating diffs " - "for the other %d.", - flavname, - most_recent_valid_after, - smartlist_len(matches) - smartlist_len(compute_diffs_from), - smartlist_len(matches), - flavname, - smartlist_len(compute_diffs_from)); - - // 4. Update the hashtable; remove entries in this flavor to other - // target consensuses. - cdm_diff_ht_purge(flavor, most_recent_sha3); - - // 5. Actually launch the requests. - SMARTLIST_FOREACH_BEGIN(compute_diffs_from, consensus_cache_entry_t *, c) { - if (BUG(c == most_recent)) - continue; // LCOV_EXCL_LINE - - uint8_t this_sha3[DIGEST256_LEN]; - if (cdm_entry_get_sha3_value(this_sha3, c, - LABEL_SHA3_DIGEST_AS_SIGNED)<0) { - // Not actually a bug, since we might be running with a directory - // with stale files from before the #22143 fixes. - continue; - } - if (cdm_diff_ht_check_and_note_pending(flavor, - this_sha3, most_recent_sha3)) { - // This is already pending, or we encountered an error. - continue; - } - consensus_diff_queue_diff_work(c, most_recent); - } SMARTLIST_FOREACH_END(c); - - done: - smartlist_free(matches); - smartlist_free(diffs); - smartlist_free(compute_diffs_from); - strmap_free(have_diff_from, NULL); -} - -/** - * Scan the cache for the latest consensuses and add their handles to - * latest_consensus - */ -static void -consdiffmgr_consensus_load(void) -{ - smartlist_t *matches = smartlist_new(); - for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - const char *flavname = networkstatus_get_flavor_name(flav); - smartlist_clear(matches); - consensus_cache_find_all(matches, cdm_cache_get(), - LABEL_FLAVOR, flavname); - consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - consensus_cache_entry_t *most_recent = sort_and_find_most_recent(matches); - if (! most_recent) - continue; // no consensuses. - const char *most_recent_sha3 = - consensus_cache_entry_get_value(most_recent, - LABEL_SHA3_DIGEST_UNCOMPRESSED); - if (BUG(most_recent_sha3 == NULL)) - continue; // LCOV_EXCL_LINE - consensus_cache_filter_list(matches, LABEL_SHA3_DIGEST_UNCOMPRESSED, - most_recent_sha3); - - // Everything that remains matches the most recent consensus of this - // flavor. - SMARTLIST_FOREACH_BEGIN(matches, consensus_cache_entry_t *, ent) { - const char *lv_compression = - consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE); - compress_method_t method = - compression_method_get_by_name(lv_compression); - int pos = consensus_compression_method_pos(method); - if (pos < 0) - continue; - consensus_cache_entry_handle_free(latest_consensus[flav][pos]); - latest_consensus[flav][pos] = consensus_cache_entry_handle_new(ent); - } SMARTLIST_FOREACH_END(ent); - } - smartlist_free(matches); -} - -/** - * Scan the cache for diffs, and add them to the hashtable. - */ -static void -consdiffmgr_diffs_load(void) -{ - smartlist_t *diffs = smartlist_new(); - consensus_cache_find_all(diffs, cdm_cache_get(), - LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); - SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { - const char *lv_flavor = - consensus_cache_entry_get_value(diff, LABEL_FLAVOR); - if (!lv_flavor) - continue; - int flavor = networkstatus_parse_flavor_name(lv_flavor); - if (flavor < 0) - continue; - const char *lv_compression = - consensus_cache_entry_get_value(diff, LABEL_COMPRESSION_TYPE); - compress_method_t method = NO_METHOD; - if (lv_compression) { - method = compression_method_get_by_name(lv_compression); - if (method == UNKNOWN_METHOD) { - continue; - } - } - - uint8_t from_sha3[DIGEST256_LEN]; - uint8_t to_sha3[DIGEST256_LEN]; - if (cdm_entry_get_sha3_value(from_sha3, diff, LABEL_FROM_SHA3_DIGEST)<0) - continue; - if (cdm_entry_get_sha3_value(to_sha3, diff, LABEL_TARGET_SHA3_DIGEST)<0) - continue; - - cdm_diff_ht_set_status(flavor, from_sha3, to_sha3, - method, - CDM_DIFF_PRESENT, - consensus_cache_entry_handle_new(diff)); - } SMARTLIST_FOREACH_END(diff); - smartlist_free(diffs); -} - -/** - * Build new diffs as needed. - */ -void -consdiffmgr_rescan(void) -{ - if (cdm_cache_dirty == 0) - return; - - // Clean up here to make room for new diffs, and to ensure that older - // consensuses do not have any entries. - consdiffmgr_cleanup(); - - if (cdm_cache_loaded == 0) { - consdiffmgr_diffs_load(); - consdiffmgr_consensus_load(); - cdm_cache_loaded = 1; - } - - for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - consdiffmgr_rescan_flavor_((consensus_flavor_t) flav); - } - - cdm_cache_dirty = 0; -} - -/** - * Helper: compare two files by their from-valid-after and valid-after labels, - * trying to sort in ascending order by from-valid-after (when present) and - * valid-after (when not). Place everything that has neither label first in - * the list. - */ -static int -compare_by_staleness_(const void **a, const void **b) -{ - const consensus_cache_entry_t *e1 = *a; - const consensus_cache_entry_t *e2 = *b; - const char *va1, *fva1, *va2, *fva2; - va1 = consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER); - va2 = consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER); - fva1 = consensus_cache_entry_get_value(e1, LABEL_FROM_VALID_AFTER); - fva2 = consensus_cache_entry_get_value(e2, LABEL_FROM_VALID_AFTER); - - if (fva1) - va1 = fva1; - if (fva2) - va2 = fva2; - - /* See note about iso-encoded values in compare_by_valid_after_. Also note - * that missing dates will get placed first. */ - return strcmp_opt(va1, va2); -} - -/** If there are not enough unused filenames to store n files, then - * delete old consensuses until there are. (We have to keep track of the - * number of filenames because of the way that the seccomp2 cache works.) - * - * Return 0 on success, -1 on failure. - **/ -static int -consdiffmgr_ensure_space_for_files(int n) -{ - consensus_cache_t *cache = cdm_cache_get(); - if (consensus_cache_get_n_filenames_available(cache) >= n) { - // there are already enough unused filenames. - return 0; - } - // Try a cheap deletion of stuff that's waiting to get deleted. - consensus_cache_delete_pending(cache, 0); - if (consensus_cache_get_n_filenames_available(cache) >= n) { - // okay, _that_ made enough filenames available. - return 0; - } - // Let's get more assertive: clean out unused stuff, and force-remove - // the files that we can. - consdiffmgr_cleanup(); - consensus_cache_delete_pending(cache, 1); - const int n_to_remove = n - consensus_cache_get_n_filenames_available(cache); - if (n_to_remove <= 0) { - // okay, finally! - return 0; - } - - // At this point, we're going to have to throw out objects that will be - // missed. Too bad! - smartlist_t *objects = smartlist_new(); - consensus_cache_find_all(objects, cache, NULL, NULL); - smartlist_sort(objects, compare_by_staleness_); - int n_marked = 0; - SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { - consensus_cache_entry_mark_for_removal(ent); - if (++n_marked >= n_to_remove) - break; - } SMARTLIST_FOREACH_END(ent); - smartlist_free(objects); - - consensus_cache_delete_pending(cache, 1); - - if (consensus_cache_may_overallocate(cache)) { - /* If we're allowed to throw extra files into the cache, let's do so - * rather getting upset. - */ - return 0; - } - - if (BUG(n_marked < n_to_remove)) - return -1; - else - return 0; -} - -/** - * Set consensus cache flags on the objects in this consdiffmgr. - */ -static void -consdiffmgr_set_cache_flags(void) -{ - /* Right now, we just mark the consensus objects for aggressive release, - * so that they get mmapped for as little time as possible. */ - smartlist_t *objects = smartlist_new(); - consensus_cache_find_all(objects, cdm_cache_get(), LABEL_DOCTYPE, - DOCTYPE_CONSENSUS); - SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { - consensus_cache_entry_mark_for_aggressive_release(ent); - } SMARTLIST_FOREACH_END(ent); - smartlist_free(objects); -} - -/** - * Called before shutdown: drop all storage held by the consdiffmgr.c module. - */ -void -consdiffmgr_free_all(void) -{ - cdm_diff_t **diff, **next; - for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { - cdm_diff_t *this = *diff; - next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); - cdm_diff_free(this); - } - int i; - unsigned j; - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - for (j = 0; j < n_consensus_compression_methods(); ++j) { - consensus_cache_entry_handle_free(latest_consensus[i][j]); - } - } - memset(latest_consensus, 0, sizeof(latest_consensus)); - consensus_cache_free(cons_diff_cache); - cons_diff_cache = NULL; -} - -/* ===== - Thread workers - =====*/ - -typedef struct compressed_result_t { - config_line_t *labels; - /** - * Output: Body of the diff, as compressed. - */ - uint8_t *body; - /** - * Output: length of body_out - */ - size_t bodylen; -} compressed_result_t; - -/** - * Compress the bytestring input of length len using the - * n_methods compression methods listed in the array methods. - * - * For each successful compression, set the fields in the results_out - * array in the position corresponding to the compression method. Use - * labels_in as a basis for the labels of the result. - * - * Return 0 if all compression succeeded; -1 if any failed. - */ -static int -compress_multiple(compressed_result_t *results_out, int n_methods, - const compress_method_t *methods, - const uint8_t *input, size_t len, - const config_line_t *labels_in) -{ - int rv = 0; - int i; - for (i = 0; i < n_methods; ++i) { - compress_method_t method = methods[i]; - const char *methodname = compression_method_get_name(method); - char *result; - size_t sz; - if (0 == tor_compress(&result, &sz, (const char*)input, len, method)) { - results_out[i].body = (uint8_t*)result; - results_out[i].bodylen = sz; - results_out[i].labels = config_lines_dup(labels_in); - cdm_labels_prepend_sha3(&results_out[i].labels, LABEL_SHA3_DIGEST, - results_out[i].body, - results_out[i].bodylen); - config_line_prepend(&results_out[i].labels, - LABEL_COMPRESSION_TYPE, - methodname); - } else { - rv = -1; - } - } - return rv; -} - -/** - * Given an array of n compressed_result_t in results, - * as produced by compress_multiple, store them all into the - * consdiffmgr, and store handles to them in the handles_out - * array. - * - * Return CDM_DIFF_PRESENT if any was stored, and CDM_DIFF_ERROR if none - * was stored. - */ -static cdm_diff_status_t -store_multiple(consensus_cache_entry_handle_t **handles_out, - int n, - const compress_method_t *methods, - const compressed_result_t *results, - const char *description) -{ - cdm_diff_status_t status = CDM_DIFF_ERROR; - consdiffmgr_ensure_space_for_files(n); - - int i; - for (i = 0; i < n; ++i) { - compress_method_t method = methods[i]; - uint8_t *body_out = results[i].body; - size_t bodylen_out = results[i].bodylen; - config_line_t *labels = results[i].labels; - const char *methodname = compression_method_get_name(method); - if (body_out && bodylen_out && labels) { - /* Success! Store the results */ - log_info(LD_DIRSERV, "Adding %s, compressed with %s", - description, methodname); - - consensus_cache_entry_t *ent = - consensus_cache_add(cdm_cache_get(), - labels, - body_out, - bodylen_out); - if (BUG(ent == NULL)) - continue; - - status = CDM_DIFF_PRESENT; - handles_out[i] = consensus_cache_entry_handle_new(ent); - consensus_cache_entry_decref(ent); - } - } - return status; -} - -/** - * An object passed to a worker thread that will try to produce a consensus - * diff. - */ -typedef struct consensus_diff_worker_job_t { - /** - * Input: The consensus to compute the diff from. Holds a reference to the - * cache entry, which must not be released until the job is passed back to - * the main thread. The body must be mapped into memory in the main thread. - */ - consensus_cache_entry_t *diff_from; - /** - * Input: The consensus to compute the diff to. Holds a reference to the - * cache entry, which must not be released until the job is passed back to - * the main thread. The body must be mapped into memory in the main thread. - */ - consensus_cache_entry_t *diff_to; - - /** Output: labels and bodies */ - compressed_result_t out[ARRAY_LENGTH(compress_diffs_with)]; -} consensus_diff_worker_job_t; - -/** Given a consensus_cache_entry_t, check whether it has a label claiming - * that it was compressed. If so, uncompress its contents into out and - * set outlen to hold their size. If not, just copy the body into - * out and set outlen to its length. Return 0 on success, - * -1 on failure. - * - * In all cases, the output is nul-terminated. */ -STATIC int -uncompress_or_copy(char **out, size_t *outlen, - consensus_cache_entry_t *ent) -{ - const uint8_t *body; - size_t bodylen; - - if (consensus_cache_entry_get_body(ent, &body, &bodylen) < 0) - return -1; - - const char *lv_compression = - consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE); - compress_method_t method = NO_METHOD; - - if (lv_compression) - method = compression_method_get_by_name(lv_compression); - - return tor_uncompress(out, outlen, (const char *)body, bodylen, - method, 1, LOG_WARN); -} - -/** - * Worker function. This function runs inside a worker thread and receives - * a consensus_diff_worker_job_t as its input. - */ -static workqueue_reply_t -consensus_diff_worker_threadfn(void *state_, void *work_) -{ - (void)state_; - consensus_diff_worker_job_t *job = work_; - const uint8_t *diff_from, *diff_to; - size_t len_from, len_to; - int r; - /* We need to have the body already mapped into RAM here. - */ - r = consensus_cache_entry_get_body(job->diff_from, &diff_from, &len_from); - if (BUG(r < 0)) - return WQ_RPL_REPLY; // LCOV_EXCL_LINE - r = consensus_cache_entry_get_body(job->diff_to, &diff_to, &len_to); - if (BUG(r < 0)) - return WQ_RPL_REPLY; // LCOV_EXCL_LINE - - const char *lv_to_valid_after = - consensus_cache_entry_get_value(job->diff_to, LABEL_VALID_AFTER); - const char *lv_to_fresh_until = - consensus_cache_entry_get_value(job->diff_to, LABEL_FRESH_UNTIL); - const char *lv_to_valid_until = - consensus_cache_entry_get_value(job->diff_to, LABEL_VALID_UNTIL); - const char *lv_to_signatories = - consensus_cache_entry_get_value(job->diff_to, LABEL_SIGNATORIES); - const char *lv_from_valid_after = - consensus_cache_entry_get_value(job->diff_from, LABEL_VALID_AFTER); - const char *lv_from_digest = - consensus_cache_entry_get_value(job->diff_from, - LABEL_SHA3_DIGEST_AS_SIGNED); - const char *lv_from_flavor = - consensus_cache_entry_get_value(job->diff_from, LABEL_FLAVOR); - const char *lv_to_flavor = - consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); - const char *lv_to_digest = - consensus_cache_entry_get_value(job->diff_to, - LABEL_SHA3_DIGEST_UNCOMPRESSED); - - if (! lv_from_digest) { - /* This isn't a bug right now, since it can happen if you're migrating - * from an older version of master to a newer one. The older ones didn't - * annotate their stored consensus objects with sha3-digest-as-signed. - */ - return WQ_RPL_REPLY; // LCOV_EXCL_LINE - } - - /* All these values are mandatory on the input */ - if (BUG(!lv_to_valid_after) || - BUG(!lv_from_valid_after) || - BUG(!lv_from_flavor) || - BUG(!lv_to_flavor)) { - return WQ_RPL_REPLY; // LCOV_EXCL_LINE - } - /* The flavors need to match */ - if (BUG(strcmp(lv_from_flavor, lv_to_flavor))) { - return WQ_RPL_REPLY; // LCOV_EXCL_LINE - } - - char *consensus_diff; - { - char *diff_from_nt = NULL, *diff_to_nt = NULL; - size_t diff_from_nt_len, diff_to_nt_len; - - if (uncompress_or_copy(&diff_from_nt, &diff_from_nt_len, - job->diff_from) < 0) { - return WQ_RPL_REPLY; - } - if (uncompress_or_copy(&diff_to_nt, &diff_to_nt_len, - job->diff_to) < 0) { - tor_free(diff_from_nt); - return WQ_RPL_REPLY; - } - tor_assert(diff_from_nt); - tor_assert(diff_to_nt); - - // XXXX ugh; this is going to calculate the SHA3 of both its - // XXXX inputs again, even though we already have that. Maybe it's time - // XXXX to change the API here? - consensus_diff = consensus_diff_generate(diff_from_nt, diff_to_nt); - tor_free(diff_from_nt); - tor_free(diff_to_nt); - } - if (!consensus_diff) { - /* Couldn't generate consensus; we'll leave the reply blank. */ - return WQ_RPL_REPLY; - } - - /* Compress the results and send the reply */ - tor_assert(compress_diffs_with[0] == NO_METHOD); - size_t difflen = strlen(consensus_diff); - job->out[0].body = (uint8_t *) consensus_diff; - job->out[0].bodylen = difflen; - - config_line_t *common_labels = NULL; - if (lv_to_valid_until) - config_line_prepend(&common_labels, LABEL_VALID_UNTIL, lv_to_valid_until); - if (lv_to_fresh_until) - config_line_prepend(&common_labels, LABEL_FRESH_UNTIL, lv_to_fresh_until); - if (lv_to_signatories) - config_line_prepend(&common_labels, LABEL_SIGNATORIES, lv_to_signatories); - cdm_labels_prepend_sha3(&common_labels, - LABEL_SHA3_DIGEST_UNCOMPRESSED, - job->out[0].body, - job->out[0].bodylen); - config_line_prepend(&common_labels, LABEL_FROM_VALID_AFTER, - lv_from_valid_after); - config_line_prepend(&common_labels, LABEL_VALID_AFTER, - lv_to_valid_after); - config_line_prepend(&common_labels, LABEL_FLAVOR, lv_from_flavor); - config_line_prepend(&common_labels, LABEL_FROM_SHA3_DIGEST, - lv_from_digest); - config_line_prepend(&common_labels, LABEL_TARGET_SHA3_DIGEST, - lv_to_digest); - config_line_prepend(&common_labels, LABEL_DOCTYPE, - DOCTYPE_CONSENSUS_DIFF); - - job->out[0].labels = config_lines_dup(common_labels); - cdm_labels_prepend_sha3(&job->out[0].labels, - LABEL_SHA3_DIGEST, - job->out[0].body, - job->out[0].bodylen); - - compress_multiple(job->out+1, - n_diff_compression_methods()-1, - compress_diffs_with+1, - (const uint8_t*)consensus_diff, difflen, common_labels); - - config_free_lines(common_labels); - return WQ_RPL_REPLY; -} - -#define consensus_diff_worker_job_free(job) \ - FREE_AND_NULL(consensus_diff_worker_job_t, \ - consensus_diff_worker_job_free_, (job)) - -/** - * Helper: release all storage held in job. - */ -static void -consensus_diff_worker_job_free_(consensus_diff_worker_job_t *job) -{ - if (!job) - return; - unsigned u; - for (u = 0; u < n_diff_compression_methods(); ++u) { - config_free_lines(job->out[u].labels); - tor_free(job->out[u].body); - } - consensus_cache_entry_decref(job->diff_from); - consensus_cache_entry_decref(job->diff_to); - tor_free(job); -} - -/** - * Worker function: This function runs in the main thread, and receives - * a consensus_diff_worker_job_t that the worker thread has already - * processed. - */ -static void -consensus_diff_worker_replyfn(void *work_) -{ - tor_assert(in_main_thread()); - tor_assert(work_); - - consensus_diff_worker_job_t *job = work_; - - const char *lv_from_digest = - consensus_cache_entry_get_value(job->diff_from, - LABEL_SHA3_DIGEST_AS_SIGNED); - const char *lv_to_digest = - consensus_cache_entry_get_value(job->diff_to, - LABEL_SHA3_DIGEST_UNCOMPRESSED); - const char *lv_flavor = - consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); - if (BUG(lv_from_digest == NULL)) - lv_from_digest = "???"; // LCOV_EXCL_LINE - if (BUG(lv_to_digest == NULL)) - lv_to_digest = "???"; // LCOV_EXCL_LINE - - uint8_t from_sha3[DIGEST256_LEN]; - uint8_t to_sha3[DIGEST256_LEN]; - int flav = -1; - int cache = 1; - if (BUG(cdm_entry_get_sha3_value(from_sha3, job->diff_from, - LABEL_SHA3_DIGEST_AS_SIGNED) < 0)) - cache = 0; - if (BUG(cdm_entry_get_sha3_value(to_sha3, job->diff_to, - LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) - cache = 0; - if (BUG(lv_flavor == NULL)) { - cache = 0; - } else if ((flav = networkstatus_parse_flavor_name(lv_flavor)) < 0) { - cache = 0; - } - - consensus_cache_entry_handle_t *handles[ARRAY_LENGTH(compress_diffs_with)]; - memset(handles, 0, sizeof(handles)); - - char description[128]; - tor_snprintf(description, sizeof(description), - "consensus diff from %s to %s", - lv_from_digest, lv_to_digest); - - int status = store_multiple(handles, - n_diff_compression_methods(), - compress_diffs_with, - job->out, - description); - - if (status != CDM_DIFF_PRESENT) { - /* Failure! Nothing to do but complain */ - log_warn(LD_DIRSERV, - "Worker was unable to compute consensus diff " - "from %s to %s", lv_from_digest, lv_to_digest); - /* Cache this error so we don't try to compute this one again. */ - status = CDM_DIFF_ERROR; - } - - unsigned u; - for (u = 0; u < ARRAY_LENGTH(handles); ++u) { - compress_method_t method = compress_diffs_with[u]; - if (cache) { - consensus_cache_entry_handle_t *h = handles[u]; - int this_status = status; - if (h == NULL) { - this_status = CDM_DIFF_ERROR; - } - tor_assert_nonfatal(h != NULL || this_status == CDM_DIFF_ERROR); - cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, this_status, h); - } else { - consensus_cache_entry_handle_free(handles[u]); - } - } - - consensus_diff_worker_job_free(job); -} - -/** - * Queue the job of computing the diff from diff_from to diff_to - * in a worker thread. - */ -static int -consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, - consensus_cache_entry_t *diff_to) -{ - tor_assert(in_main_thread()); - - consensus_cache_entry_incref(diff_from); - consensus_cache_entry_incref(diff_to); - - consensus_diff_worker_job_t *job = tor_malloc_zero(sizeof(*job)); - job->diff_from = diff_from; - job->diff_to = diff_to; - - /* Make sure body is mapped. */ - const uint8_t *body; - size_t bodylen; - int r1 = consensus_cache_entry_get_body(diff_from, &body, &bodylen); - int r2 = consensus_cache_entry_get_body(diff_to, &body, &bodylen); - if (r1 < 0 || r2 < 0) - goto err; - - workqueue_entry_t *work; - work = cpuworker_queue_work(WQ_PRI_LOW, - consensus_diff_worker_threadfn, - consensus_diff_worker_replyfn, - job); - if (!work) - goto err; - - return 0; - err: - consensus_diff_worker_job_free(job); // includes decrefs. - return -1; -} - -/** - * Holds requests and replies for consensus_compress_workers. - */ -typedef struct consensus_compress_worker_job_t { - char *consensus; - size_t consensus_len; - consensus_flavor_t flavor; - config_line_t *labels_in; - compressed_result_t out[ARRAY_LENGTH(compress_consensus_with)]; -} consensus_compress_worker_job_t; - -#define consensus_compress_worker_job_free(job) \ - FREE_AND_NULL(consensus_compress_worker_job_t, \ - consensus_compress_worker_job_free_, (job)) - -/** - * Free all resources held in job - */ -static void -consensus_compress_worker_job_free_(consensus_compress_worker_job_t *job) -{ - if (!job) - return; - tor_free(job->consensus); - config_free_lines(job->labels_in); - unsigned u; - for (u = 0; u < n_consensus_compression_methods(); ++u) { - config_free_lines(job->out[u].labels); - tor_free(job->out[u].body); - } - tor_free(job); -} -/** - * Worker function. This function runs inside a worker thread and receives - * a consensus_compress_worker_job_t as its input. - */ -static workqueue_reply_t -consensus_compress_worker_threadfn(void *state_, void *work_) -{ - (void)state_; - consensus_compress_worker_job_t *job = work_; - consensus_flavor_t flavor = job->flavor; - const char *consensus = job->consensus; - size_t bodylen = job->consensus_len; - - config_line_t *labels = config_lines_dup(job->labels_in); - const char *flavname = networkstatus_get_flavor_name(flavor); - - cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_UNCOMPRESSED, - (const uint8_t *)consensus, bodylen); - { - const char *start, *end; - if (router_get_networkstatus_v3_signed_boundaries(consensus, - &start, &end) < 0) { - start = consensus; - end = consensus+bodylen; - } - cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_AS_SIGNED, - (const uint8_t *)start, - end - start); - } - config_line_prepend(&labels, LABEL_FLAVOR, flavname); - config_line_prepend(&labels, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); - - compress_multiple(job->out, - n_consensus_compression_methods(), - compress_consensus_with, - (const uint8_t*)consensus, bodylen, labels); - config_free_lines(labels); - return WQ_RPL_REPLY; -} - -/** - * Worker function: This function runs in the main thread, and receives - * a consensus_diff_compress_job_t that the worker thread has already - * processed. - */ -static void -consensus_compress_worker_replyfn(void *work_) -{ - consensus_compress_worker_job_t *job = work_; - - consensus_cache_entry_handle_t *handles[ - ARRAY_LENGTH(compress_consensus_with)]; - memset(handles, 0, sizeof(handles)); - - store_multiple(handles, - n_consensus_compression_methods(), - compress_consensus_with, - job->out, - "consensus"); - cdm_cache_dirty = 1; - - unsigned u; - consensus_flavor_t f = job->flavor; - tor_assert((int)f < N_CONSENSUS_FLAVORS); - for (u = 0; u < ARRAY_LENGTH(handles); ++u) { - if (handles[u] == NULL) - continue; - consensus_cache_entry_handle_free(latest_consensus[f][u]); - latest_consensus[f][u] = handles[u]; - } - - consensus_compress_worker_job_free(job); -} - -/** - * If true, we compress in worker threads. - */ -static int background_compression = 0; - -/** - * Queue a job to compress consensus and store its compressed - * text in the cache. - */ -static int -consensus_queue_compression_work(const char *consensus, - const networkstatus_t *as_parsed) -{ - tor_assert(consensus); - tor_assert(as_parsed); - - consensus_compress_worker_job_t *job = tor_malloc_zero(sizeof(*job)); - job->consensus = tor_strdup(consensus); - job->consensus_len = strlen(consensus); - job->flavor = as_parsed->flavor; - - char va_str[ISO_TIME_LEN+1]; - char vu_str[ISO_TIME_LEN+1]; - char fu_str[ISO_TIME_LEN+1]; - format_iso_time_nospace(va_str, as_parsed->valid_after); - format_iso_time_nospace(fu_str, as_parsed->fresh_until); - format_iso_time_nospace(vu_str, as_parsed->valid_until); - config_line_append(&job->labels_in, LABEL_VALID_AFTER, va_str); - config_line_append(&job->labels_in, LABEL_FRESH_UNTIL, fu_str); - config_line_append(&job->labels_in, LABEL_VALID_UNTIL, vu_str); - if (as_parsed->voters) { - smartlist_t *hexvoters = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(as_parsed->voters, - networkstatus_voter_info_t *, vi) { - if (smartlist_len(vi->sigs) == 0) - continue; // didn't sign. - char d[HEX_DIGEST_LEN+1]; - base16_encode(d, sizeof(d), vi->identity_digest, DIGEST_LEN); - smartlist_add_strdup(hexvoters, d); - } SMARTLIST_FOREACH_END(vi); - char *signers = smartlist_join_strings(hexvoters, ",", 0, NULL); - config_line_prepend(&job->labels_in, LABEL_SIGNATORIES, signers); - tor_free(signers); - SMARTLIST_FOREACH(hexvoters, char *, cp, tor_free(cp)); - smartlist_free(hexvoters); - } - - if (background_compression) { - workqueue_entry_t *work; - work = cpuworker_queue_work(WQ_PRI_LOW, - consensus_compress_worker_threadfn, - consensus_compress_worker_replyfn, - job); - if (!work) { - consensus_compress_worker_job_free(job); - return -1; - } - - return 0; - } else { - consensus_compress_worker_threadfn(NULL, job); - consensus_compress_worker_replyfn(job); - return 0; - } -} - -/** - * Tell the consdiffmgr backend to compress consensuses in worker threads. - */ -void -consdiffmgr_enable_background_compression(void) -{ - // This isn't the default behavior because it would break unit tests. - background_compression = 1; -} - -/** Read the set of voters from the cached object ent into - * out, as a list of hex-encoded digests. Return 0 on success, - * -1 if no signatories were recorded. */ -int -consensus_cache_entry_get_voter_id_digests(const consensus_cache_entry_t *ent, - smartlist_t *out) -{ - tor_assert(ent); - tor_assert(out); - const char *s; - s = consensus_cache_entry_get_value(ent, LABEL_SIGNATORIES); - if (s == NULL) - return -1; - smartlist_split_string(out, s, ",", SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE, 0); - return 0; -} - -/** Read the fresh-until time of cached object ent into *out - * and return 0, or return -1 if no such time was recorded. */ -int -consensus_cache_entry_get_fresh_until(const consensus_cache_entry_t *ent, - time_t *out) -{ - tor_assert(ent); - tor_assert(out); - const char *s; - s = consensus_cache_entry_get_value(ent, LABEL_FRESH_UNTIL); - if (s == NULL || parse_iso_time_nospace(s, out) < 0) - return -1; - else - return 0; -} - -/** Read the valid until timestamp from the cached object ent into - * *out and return 0, or return -1 if no such time was recorded. */ -int -consensus_cache_entry_get_valid_until(const consensus_cache_entry_t *ent, - time_t *out) -{ - tor_assert(ent); - tor_assert(out); - - const char *s; - s = consensus_cache_entry_get_value(ent, LABEL_VALID_UNTIL); - if (s == NULL || parse_iso_time_nospace(s, out) < 0) - return -1; - else - return 0; -} - -/** Read the valid after timestamp from the cached object ent into - * *out and return 0, or return -1 if no such time was recorded. */ -int -consensus_cache_entry_get_valid_after(const consensus_cache_entry_t *ent, - time_t *out) -{ - tor_assert(ent); - tor_assert(out); - - const char *s; - s = consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); - - if (s == NULL || parse_iso_time_nospace(s, out) < 0) - return -1; - else - return 0; -} - diff --git a/src/tor/src/or/consdiffmgr.h b/src/tor/src/or/consdiffmgr.h deleted file mode 100644 index df569c8e2..000000000 --- a/src/tor/src/or/consdiffmgr.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONSDIFFMGR_H -#define TOR_CONSDIFFMGR_H - -/** - * Possible outcomes from trying to look up a given consensus diff. - */ -typedef enum consdiff_status_t { - CONSDIFF_AVAILABLE, - CONSDIFF_NOT_FOUND, - CONSDIFF_IN_PROGRESS, -} consdiff_status_t; - -typedef struct consdiff_cfg_t { - int32_t cache_max_num; -} consdiff_cfg_t; - -struct consensus_cache_entry_t; // from conscache.h - -int consdiffmgr_add_consensus(const char *consensus, - const networkstatus_t *as_parsed); - -consdiff_status_t consdiffmgr_find_consensus( - struct consensus_cache_entry_t **entry_out, - consensus_flavor_t flavor, - compress_method_t method); - -consdiff_status_t consdiffmgr_find_diff_from( - struct consensus_cache_entry_t **entry_out, - consensus_flavor_t flavor, - int digest_type, - const uint8_t *digest, - size_t digestlen, - compress_method_t method); - -int consensus_cache_entry_get_voter_id_digests( - const struct consensus_cache_entry_t *ent, - smartlist_t *out); -int consensus_cache_entry_get_fresh_until( - const struct consensus_cache_entry_t *ent, - time_t *out); -int consensus_cache_entry_get_valid_until( - const struct consensus_cache_entry_t *ent, - time_t *out); -int consensus_cache_entry_get_valid_after( - const struct consensus_cache_entry_t *ent, - time_t *out); - -void consdiffmgr_rescan(void); -int consdiffmgr_cleanup(void); -void consdiffmgr_enable_background_compression(void); -void consdiffmgr_configure(const consdiff_cfg_t *cfg); -struct sandbox_cfg_elem; -int consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg); -void consdiffmgr_free_all(void); -int consdiffmgr_validate(void); - -#ifdef CONSDIFFMGR_PRIVATE -STATIC unsigned n_diff_compression_methods(void); -STATIC unsigned n_consensus_compression_methods(void); -STATIC consensus_cache_t *cdm_cache_get(void); -STATIC consensus_cache_entry_t *cdm_cache_lookup_consensus( - consensus_flavor_t flavor, time_t valid_after); -STATIC int cdm_entry_get_sha3_value(uint8_t *digest_out, - consensus_cache_entry_t *ent, - const char *label); -STATIC int uncompress_or_copy(char **out, size_t *outlen, - consensus_cache_entry_t *ent); -#endif /* defined(CONSDIFFMGR_PRIVATE) */ - -#endif /* !defined(TOR_CONSDIFFMGR_H) */ - diff --git a/src/tor/src/or/cpuworker.c b/src/tor/src/or/cpuworker.c deleted file mode 100644 index 9bec04d79..000000000 --- a/src/tor/src/or/cpuworker.c +++ /dev/null @@ -1,610 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file cpuworker.c - * \brief Uses the workqueue/threadpool code to farm CPU-intensive activities - * out to subprocesses. - * - * The multithreading backend for this module is in workqueue.c; this module - * specializes workqueue.c. - * - * Right now, we use this infrastructure - *
      • for processing onionskins in onion.c - *
      • for compressing consensuses in consdiffmgr.c, - *
      • and for calculating diffs and compressing them in consdiffmgr.c. - *
      - **/ -#include "or.h" -#include "channel.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "connection_or.h" -#include "config.h" -#include "cpuworker.h" -#include "main.h" -#include "onion.h" -#include "rephist.h" -#include "router.h" -#include "workqueue.h" - -#include - -static void queue_pending_tasks(void); - -typedef struct worker_state_s { - int generation; - server_onion_keys_t *onion_keys; -} worker_state_t; - -static void * -worker_state_new(void *arg) -{ - worker_state_t *ws; - (void)arg; - ws = tor_malloc_zero(sizeof(worker_state_t)); - ws->onion_keys = server_onion_keys_new(); - return ws; -} - -#define worker_state_free(ws) \ - FREE_AND_NULL(worker_state_t, worker_state_free_, (ws)) - -static void -worker_state_free_(worker_state_t *ws) -{ - if (!ws) - return; - server_onion_keys_free(ws->onion_keys); - tor_free(ws); -} - -static void -worker_state_free_void(void *arg) -{ - worker_state_free_(arg); -} - -static replyqueue_t *replyqueue = NULL; -static threadpool_t *threadpool = NULL; -static struct event *reply_event = NULL; - -static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT; - -static int total_pending_tasks = 0; -static int max_pending_tasks = 128; - -static void -replyqueue_process_cb(evutil_socket_t sock, short events, void *arg) -{ - replyqueue_t *rq = arg; - (void) sock; - (void) events; - replyqueue_process(rq); -} - -/** Initialize the cpuworker subsystem. It is OK to call this more than once - * during Tor's lifetime. - */ -void -cpu_init(void) -{ - if (!replyqueue) { - replyqueue = replyqueue_new(0); - } - if (!reply_event) { - reply_event = tor_event_new(tor_libevent_get_base(), - replyqueue_get_socket(replyqueue), - EV_READ|EV_PERSIST, - replyqueue_process_cb, - replyqueue); - event_add(reply_event, NULL); - } - if (!threadpool) { - /* - In our threadpool implementation, half the threads are permissive and - half are strict (when it comes to running lower-priority tasks). So we - always make sure we have at least two threads, so that there will be at - least one thread of each kind. - */ - const int n_threads = get_num_cpus(get_options()) + 1; - threadpool = threadpool_new(n_threads, - replyqueue, - worker_state_new, - worker_state_free_void, - NULL); - } - /* Total voodoo. Can we make this more sensible? */ - max_pending_tasks = get_num_cpus(get_options()) * 64; - crypto_seed_weak_rng(&request_sample_rng); -} - -/** Magic numbers to make sure our cpuworker_requests don't grow any - * mis-framing bugs. */ -#define CPUWORKER_REQUEST_MAGIC 0xda4afeed -#define CPUWORKER_REPLY_MAGIC 0x5eedf00d - -/** A request sent to a cpuworker. */ -typedef struct cpuworker_request_t { - /** Magic number; must be CPUWORKER_REQUEST_MAGIC. */ - uint32_t magic; - - /** Flag: Are we timing this request? */ - unsigned timed : 1; - /** If we're timing this request, when was it sent to the cpuworker? */ - struct timeval started_at; - - /** A create cell for the cpuworker to process. */ - create_cell_t create_cell; - - /* Turn the above into a tagged union if needed. */ -} cpuworker_request_t; - -/** A reply sent by a cpuworker. */ -typedef struct cpuworker_reply_t { - /** Magic number; must be CPUWORKER_REPLY_MAGIC. */ - uint32_t magic; - - /** True iff we got a successful request. */ - uint8_t success; - - /** Are we timing this request? */ - unsigned int timed : 1; - /** What handshake type was the request? (Used for timing) */ - uint16_t handshake_type; - /** When did we send the request to the cpuworker? */ - struct timeval started_at; - /** Once the cpuworker received the request, how many microseconds did it - * take? (This shouldn't overflow; 4 billion micoseconds is over an hour, - * and we'll never have an onion handshake that takes so long.) */ - uint32_t n_usec; - - /** Output of processing a create cell - * - * @{ - */ - /** The created cell to send back. */ - created_cell_t created_cell; - /** The keys to use on this circuit. */ - uint8_t keys[CPATH_KEY_MATERIAL_LEN]; - /** Input to use for authenticating introduce1 cells. */ - uint8_t rend_auth_material[DIGEST_LEN]; -} cpuworker_reply_t; - -typedef struct cpuworker_job_u { - or_circuit_t *circ; - union { - cpuworker_request_t request; - cpuworker_reply_t reply; - } u; -} cpuworker_job_t; - -static workqueue_reply_t -update_state_threadfn(void *state_, void *work_) -{ - worker_state_t *state = state_; - worker_state_t *update = work_; - server_onion_keys_free(state->onion_keys); - state->onion_keys = update->onion_keys; - update->onion_keys = NULL; - worker_state_free(update); - ++state->generation; - return WQ_RPL_REPLY; -} - -/** Called when the onion key has changed so update all CPU worker(s) with - * new function pointers with which a new state will be generated. - */ -void -cpuworkers_rotate_keyinfo(void) -{ - if (!threadpool) { - /* If we're a client, then we won't have cpuworkers, and we won't need - * to tell them to rotate their state. - */ - return; - } - if (threadpool_queue_update(threadpool, - worker_state_new, - update_state_threadfn, - worker_state_free_void, - NULL)) { - log_warn(LD_OR, "Failed to queue key update for worker threads."); - } -} - -/** Indexed by handshake type: how many onionskins have we processed and - * counted of that type? */ -static uint64_t onionskins_n_processed[MAX_ONION_HANDSHAKE_TYPE+1]; -/** Indexed by handshake type, corresponding to the onionskins counted in - * onionskins_n_processed: how many microseconds have we spent in cpuworkers - * processing that kind of onionskin? */ -static uint64_t onionskins_usec_internal[MAX_ONION_HANDSHAKE_TYPE+1]; -/** Indexed by handshake type, corresponding to onionskins counted in - * onionskins_n_processed: how many microseconds have we spent waiting for - * cpuworkers to give us answers for that kind of onionskin? - */ -static uint64_t onionskins_usec_roundtrip[MAX_ONION_HANDSHAKE_TYPE+1]; - -/** If any onionskin takes longer than this, we clip them to this - * time. (microseconds) */ -#define MAX_BELIEVABLE_ONIONSKIN_DELAY (2*1000*1000) - -/** Return true iff we'd like to measure a handshake of type - * onionskin_type. Call only from the main thread. */ -static int -should_time_request(uint16_t onionskin_type) -{ - /* If we've never heard of this type, we shouldn't even be here. */ - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) - return 0; - /* Measure the first N handshakes of each type, to ensure we have a - * sample */ - if (onionskins_n_processed[onionskin_type] < 4096) - return 1; - /** Otherwise, measure with P=1/128. We avoid doing this for every - * handshake, since the measurement itself can take a little time. */ - return tor_weak_random_one_in_n(&request_sample_rng, 128); -} - -/** Return an estimate of how many microseconds we will need for a single - * cpuworker to to process n_requests onionskins of type - * onionskin_type. */ -uint64_t -estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type) -{ - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ - return 1000 * (uint64_t)n_requests; - if (PREDICT_UNLIKELY(onionskins_n_processed[onionskin_type] < 100)) { - /* Until we have 100 data points, just asssume everything takes 1 msec. */ - return 1000 * (uint64_t)n_requests; - } else { - /* This can't overflow: we'll never have more than 500000 onionskins - * measured in onionskin_usec_internal, and they won't take anything near - * 1 sec each, and we won't have anything like 1 million queued - * onionskins. But that's 5e5 * 1e6 * 1e6, which is still less than - * UINT64_MAX. */ - return (onionskins_usec_internal[onionskin_type] * n_requests) / - onionskins_n_processed[onionskin_type]; - } -} - -/** Compute the absolute and relative overhead of using the cpuworker - * framework for onionskins of type onionskin_type.*/ -static int -get_overhead_for_onionskins(uint32_t *usec_out, double *frac_out, - uint16_t onionskin_type) -{ - uint64_t overhead; - - *usec_out = 0; - *frac_out = 0.0; - - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ - return -1; - if (onionskins_n_processed[onionskin_type] == 0 || - onionskins_usec_internal[onionskin_type] == 0 || - onionskins_usec_roundtrip[onionskin_type] == 0) - return -1; - - overhead = onionskins_usec_roundtrip[onionskin_type] - - onionskins_usec_internal[onionskin_type]; - - *usec_out = (uint32_t)(overhead / onionskins_n_processed[onionskin_type]); - *frac_out = U64_TO_DBL(overhead) / onionskins_usec_internal[onionskin_type]; - - return 0; -} - -/** If we've measured overhead for onionskins of type onionskin_type, - * log it. */ -void -cpuworker_log_onionskin_overhead(int severity, int onionskin_type, - const char *onionskin_type_name) -{ - uint32_t overhead; - double relative_overhead; - int r; - - r = get_overhead_for_onionskins(&overhead, &relative_overhead, - onionskin_type); - if (!overhead || r<0) - return; - - log_fn(severity, LD_OR, - "%s onionskins have averaged %u usec overhead (%.2f%%) in " - "cpuworker code ", - onionskin_type_name, (unsigned)overhead, relative_overhead*100); -} - -/** Handle a reply from the worker threads. */ -static void -cpuworker_onion_handshake_replyfn(void *work_) -{ - cpuworker_job_t *job = work_; - cpuworker_reply_t rpl; - or_circuit_t *circ = NULL; - - tor_assert(total_pending_tasks > 0); - --total_pending_tasks; - - /* Could avoid this, but doesn't matter. */ - memcpy(&rpl, &job->u.reply, sizeof(rpl)); - - tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC); - - if (rpl.timed && rpl.success && - rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) { - /* Time how long this request took. The handshake_type check should be - needless, but let's leave it in to be safe. */ - struct timeval tv_end, tv_diff; - int64_t usec_roundtrip; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &rpl.started_at, &tv_diff); - usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec_roundtrip >= 0 && - usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) { - ++onionskins_n_processed[rpl.handshake_type]; - onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec; - onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip; - if (onionskins_n_processed[rpl.handshake_type] >= 500000) { - /* Scale down every 500000 handshakes. On a busy server, that's - * less impressive than it sounds. */ - onionskins_n_processed[rpl.handshake_type] /= 2; - onionskins_usec_internal[rpl.handshake_type] /= 2; - onionskins_usec_roundtrip[rpl.handshake_type] /= 2; - } - } - } - - circ = job->circ; - - log_debug(LD_OR, - "Unpacking cpuworker reply %p, circ=%p, success=%d", - job, circ, rpl.success); - - if (circ->base_.magic == DEAD_CIRCUIT_MAGIC) { - /* The circuit was supposed to get freed while the reply was - * pending. Instead, it got left for us to free so that we wouldn't freak - * out when the job->circ field wound up pointing to nothing. */ - log_debug(LD_OR, "Circuit died while reply was pending. Freeing memory."); - circ->base_.magic = 0; - tor_free(circ); - goto done_processing; - } - - circ->workqueue_entry = NULL; - - if (TO_CIRCUIT(circ)->marked_for_close) { - /* We already marked this circuit; we can't call it open. */ - log_debug(LD_OR,"circuit is already marked."); - goto done_processing; - } - - if (rpl.success == 0) { - log_debug(LD_OR, - "decoding onionskin failed. " - "(Old key or bad software.) Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - goto done_processing; - } - - if (onionskin_answer(circ, - &rpl.created_cell, - (const char*)rpl.keys, sizeof(rpl.keys), - rpl.rend_auth_material) < 0) { - log_warn(LD_OR,"onionskin_answer failed. Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - goto done_processing; - } - log_debug(LD_OR,"onionskin_answer succeeded. Yay."); - - done_processing: - memwipe(&rpl, 0, sizeof(rpl)); - memwipe(job, 0, sizeof(*job)); - tor_free(job); - queue_pending_tasks(); -} - -/** Implementation function for onion handshake requests. */ -static workqueue_reply_t -cpuworker_onion_handshake_threadfn(void *state_, void *work_) -{ - worker_state_t *state = state_; - cpuworker_job_t *job = work_; - - /* variables for onion processing */ - server_onion_keys_t *onion_keys = state->onion_keys; - cpuworker_request_t req; - cpuworker_reply_t rpl; - - memcpy(&req, &job->u.request, sizeof(req)); - - tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC); - memset(&rpl, 0, sizeof(rpl)); - - const create_cell_t *cc = &req.create_cell; - created_cell_t *cell_out = &rpl.created_cell; - struct timeval tv_start = {0,0}, tv_end; - int n; - rpl.timed = req.timed; - rpl.started_at = req.started_at; - rpl.handshake_type = cc->handshake_type; - if (req.timed) - tor_gettimeofday(&tv_start); - n = onion_skin_server_handshake(cc->handshake_type, - cc->onionskin, cc->handshake_len, - onion_keys, - cell_out->reply, - rpl.keys, CPATH_KEY_MATERIAL_LEN, - rpl.rend_auth_material); - if (n < 0) { - /* failure */ - log_debug(LD_OR,"onion_skin_server_handshake failed."); - memset(&rpl, 0, sizeof(rpl)); - rpl.success = 0; - } else { - /* success */ - log_debug(LD_OR,"onion_skin_server_handshake succeeded."); - cell_out->handshake_len = n; - switch (cc->cell_type) { - case CELL_CREATE: - cell_out->cell_type = CELL_CREATED; break; - case CELL_CREATE2: - cell_out->cell_type = CELL_CREATED2; break; - case CELL_CREATE_FAST: - cell_out->cell_type = CELL_CREATED_FAST; break; - default: - tor_assert(0); - return WQ_RPL_SHUTDOWN; - } - rpl.success = 1; - } - rpl.magic = CPUWORKER_REPLY_MAGIC; - if (req.timed) { - struct timeval tv_diff; - int64_t usec; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &tv_start, &tv_diff); - usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY) - rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY; - else - rpl.n_usec = (uint32_t) usec; - } - - memcpy(&job->u.reply, &rpl, sizeof(rpl)); - - memwipe(&req, 0, sizeof(req)); - memwipe(&rpl, 0, sizeof(req)); - return WQ_RPL_REPLY; -} - -/** Take pending tasks from the queue and assign them to cpuworkers. */ -static void -queue_pending_tasks(void) -{ - or_circuit_t *circ; - create_cell_t *onionskin = NULL; - - while (total_pending_tasks < max_pending_tasks) { - circ = onion_next_task(&onionskin); - - if (!circ) - return; - - if (assign_onionskin_to_cpuworker(circ, onionskin) < 0) - log_info(LD_OR,"assign_to_cpuworker failed. Ignoring."); - } -} - -/** DOCDOC */ -MOCK_IMPL(workqueue_entry_t *, -cpuworker_queue_work,(workqueue_priority_t priority, - workqueue_reply_t (*fn)(void *, void *), - void (*reply_fn)(void *), - void *arg)) -{ - tor_assert(threadpool); - - return threadpool_queue_work_priority(threadpool, - priority, - fn, - reply_fn, - arg); -} - -/** Try to tell a cpuworker to perform the public key operations necessary to - * respond to onionskin for the circuit circ. - * - * Return 0 if we successfully assign the task, or -1 on failure. - */ -int -assign_onionskin_to_cpuworker(or_circuit_t *circ, - create_cell_t *onionskin) -{ - workqueue_entry_t *queue_entry; - cpuworker_job_t *job; - cpuworker_request_t req; - int should_time; - - tor_assert(threadpool); - - if (!circ->p_chan) { - log_info(LD_OR,"circ->p_chan gone. Failing circ."); - tor_free(onionskin); - return -1; - } - - if (total_pending_tasks >= max_pending_tasks) { - log_debug(LD_OR,"No idle cpuworkers. Queuing."); - if (onion_pending_add(circ, onionskin) < 0) { - tor_free(onionskin); - return -1; - } - return 0; - } - - if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest)) - rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type); - - should_time = should_time_request(onionskin->handshake_type); - memset(&req, 0, sizeof(req)); - req.magic = CPUWORKER_REQUEST_MAGIC; - req.timed = should_time; - - memcpy(&req.create_cell, onionskin, sizeof(create_cell_t)); - - tor_free(onionskin); - - if (should_time) - tor_gettimeofday(&req.started_at); - - job = tor_malloc_zero(sizeof(cpuworker_job_t)); - job->circ = circ; - memcpy(&job->u.request, &req, sizeof(req)); - memwipe(&req, 0, sizeof(req)); - - ++total_pending_tasks; - queue_entry = threadpool_queue_work_priority(threadpool, - WQ_PRI_HIGH, - cpuworker_onion_handshake_threadfn, - cpuworker_onion_handshake_replyfn, - job); - if (!queue_entry) { - log_warn(LD_BUG, "Couldn't queue work on threadpool"); - tor_free(job); - return -1; - } - - log_debug(LD_OR, "Queued task %p (qe=%p, circ=%p)", - job, queue_entry, job->circ); - - circ->workqueue_entry = queue_entry; - - return 0; -} - -/** If circ has a pending handshake that hasn't been processed yet, - * remove it from the worker queue. */ -void -cpuworker_cancel_circ_handshake(or_circuit_t *circ) -{ - cpuworker_job_t *job; - if (circ->workqueue_entry == NULL) - return; - - job = workqueue_entry_cancel(circ->workqueue_entry); - if (job) { - /* It successfully cancelled. */ - memwipe(job, 0xe0, sizeof(*job)); - tor_free(job); - tor_assert(total_pending_tasks > 0); - --total_pending_tasks; - /* if (!job), this is done in cpuworker_onion_handshake_replyfn. */ - circ->workqueue_entry = NULL; - } -} - diff --git a/src/tor/src/or/dircollate.c b/src/tor/src/or/dircollate.c deleted file mode 100644 index ce4534ff6..000000000 --- a/src/tor/src/or/dircollate.c +++ /dev/null @@ -1,356 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dircollate.c - * - * \brief Collation code for figuring out which identities to vote for in - * the directory voting process. - * - * During the consensus calculation, when an authority is looking at the vote - * documents from all the authorities, it needs to compute the consensus for - * each relay listed by at least one authority. But the notion of "each - * relay" can be tricky: some relays have Ed25519 keys, and others don't. - * - * Moreover, older consensus methods did RSA-based ID collation alone, and - * ignored Ed25519 keys. We need to support those too until we're completely - * sure that authorities will never downgrade. - * - * This module is invoked exclusively from dirvote.c. - */ - -#define DIRCOLLATE_PRIVATE -#include "dircollate.h" -#include "dirvote.h" - -static void dircollator_collate_by_rsa(dircollator_t *dc); -static void dircollator_collate_by_ed25519(dircollator_t *dc); - -/** Hashtable entry mapping a pair of digests (actually an ed25519 key and an - * RSA SHA1 digest) to an array of vote_routerstatus_t. */ -typedef struct ddmap_entry_s { - HT_ENTRY(ddmap_entry_s) node; - /** A SHA1-RSA1024 identity digest and Ed25519 identity key, - * concatenated. (If there is no ed25519 identity key, there is no - * entry in this table.) */ - uint8_t d[DIGEST_LEN + DIGEST256_LEN]; - /* The nth member of this array corresponds to the vote_routerstatus_t (if - * any) received for this digest pair from the nth voter. */ - vote_routerstatus_t *vrs_lst[FLEXIBLE_ARRAY_MEMBER]; -} ddmap_entry_t; - -#define ddmap_entry_free(e) \ - FREE_AND_NULL(ddmap_entry_t, ddmap_entry_free_, (e)) - -/** Release all storage held by e. */ -static void -ddmap_entry_free_(ddmap_entry_t *e) -{ - tor_free(e); -} - -/** Return a new empty ddmap_entry, with n_votes elements in - * vrs_list. */ -static ddmap_entry_t * -ddmap_entry_new(int n_votes) -{ - return tor_malloc_zero(offsetof(ddmap_entry_t, vrs_lst) + - sizeof(vote_routerstatus_t *) * n_votes); -} - -/** Helper: compute a hash of a single ddmap_entry_t's identity (or - * identities) */ -static unsigned -ddmap_entry_hash(const ddmap_entry_t *ent) -{ - return (unsigned) siphash24g(ent->d, sizeof(ent->d)); -} - -/** Helper: return true if a and b have the same - * identity/identities. */ -static unsigned -ddmap_entry_eq(const ddmap_entry_t *a, const ddmap_entry_t *b) -{ - return fast_memeq(a->d, b->d, sizeof(a->d)); -} - -/** Record the RSA identity of ent as rsa_sha1, and the - * ed25519 identity as ed25519. Both must be provided. */ -static void -ddmap_entry_set_digests(ddmap_entry_t *ent, - const uint8_t *rsa_sha1, - const uint8_t *ed25519) -{ - memcpy(ent->d, rsa_sha1, DIGEST_LEN); - memcpy(ent->d + DIGEST_LEN, ed25519, DIGEST256_LEN); -} - -HT_PROTOTYPE(double_digest_map, ddmap_entry_s, node, ddmap_entry_hash, - ddmap_entry_eq) -HT_GENERATE2(double_digest_map, ddmap_entry_s, node, ddmap_entry_hash, - ddmap_entry_eq, 0.6, tor_reallocarray, tor_free_) - -/** Helper: add a single vote_routerstatus_t vrs to the collator - * dc, indexing it by its RSA key digest, and by the 2-tuple of its RSA - * key digest and Ed25519 key. It must come from the vote_numth - * vote. - * - * Requires that the vote is well-formed -- that is, that it has no duplicate - * routerstatus entries. We already checked for that when parsing the vote. */ -static void -dircollator_add_routerstatus(dircollator_t *dc, - int vote_num, - networkstatus_t *vote, - vote_routerstatus_t *vrs) -{ - const char *id = vrs->status.identity_digest; - - /* Clear this flag; we might set it later during the voting process */ - vrs->ed25519_reflects_consensus = 0; - - (void) vote; // We don't currently need this. - - /* First, add this item to the appropriate RSA-SHA-Id array. */ - vote_routerstatus_t **vrs_lst = digestmap_get(dc->by_rsa_sha1, id); - if (NULL == vrs_lst) { - vrs_lst = tor_calloc(dc->n_votes, sizeof(vote_routerstatus_t *)); - digestmap_set(dc->by_rsa_sha1, id, vrs_lst); - } - tor_assert(vrs_lst[vote_num] == NULL); - vrs_lst[vote_num] = vrs; - - const uint8_t *ed = vrs->ed25519_id; - - if (! vrs->has_ed25519_listing) - return; - - /* Now add it to the appropriate array. */ - ddmap_entry_t search, *found; - memset(&search, 0, sizeof(search)); - ddmap_entry_set_digests(&search, (const uint8_t *)id, ed); - found = HT_FIND(double_digest_map, &dc->by_both_ids, &search); - if (NULL == found) { - found = ddmap_entry_new(dc->n_votes); - ddmap_entry_set_digests(found, (const uint8_t *)id, ed); - HT_INSERT(double_digest_map, &dc->by_both_ids, found); - } - vrs_lst = found->vrs_lst; - tor_assert(vrs_lst[vote_num] == NULL); - vrs_lst[vote_num] = vrs; -} - -/** Create and return a new dircollator object to use when collating - * n_votes out of a total of n_authorities. */ -dircollator_t * -dircollator_new(int n_votes, int n_authorities) -{ - dircollator_t *dc = tor_malloc_zero(sizeof(dircollator_t)); - - tor_assert(n_votes <= n_authorities); - - dc->n_votes = n_votes; - dc->n_authorities = n_authorities; - - dc->by_rsa_sha1 = digestmap_new(); - HT_INIT(double_digest_map, &dc->by_both_ids); - - return dc; -} - -/** Release all storage held by dc. */ -void -dircollator_free_(dircollator_t *dc) -{ - if (!dc) - return; - - if (dc->by_collated_rsa_sha1 != dc->by_rsa_sha1) - digestmap_free(dc->by_collated_rsa_sha1, NULL); - - digestmap_free(dc->by_rsa_sha1, tor_free_); - smartlist_free(dc->all_rsa_sha1_lst); - - ddmap_entry_t **e, **next, *this; - for (e = HT_START(double_digest_map, &dc->by_both_ids); - e != NULL; e = next) { - this = *e; - next = HT_NEXT_RMV(double_digest_map, &dc->by_both_ids, e); - ddmap_entry_free(this); - } - HT_CLEAR(double_digest_map, &dc->by_both_ids); - - tor_free(dc); -} - -/** Add a single vote v to a dircollator dc. This function must - * be called exactly once for each vote to be used in the consensus. It may - * only be called before dircollator_collate(). - */ -void -dircollator_add_vote(dircollator_t *dc, networkstatus_t *v) -{ - tor_assert(v->type == NS_TYPE_VOTE); - tor_assert(dc->next_vote_num < dc->n_votes); - tor_assert(!dc->is_collated); - - const int votenum = dc->next_vote_num++; - - SMARTLIST_FOREACH_BEGIN(v->routerstatus_list, vote_routerstatus_t *, vrs) { - dircollator_add_routerstatus(dc, votenum, v, vrs); - } SMARTLIST_FOREACH_END(vrs); -} - -/** Sort the entries in dc according to consensus_method, so - * that the consensus process can iterate over them with - * dircollator_n_routers() and dircollator_get_votes_for_router(). */ -void -dircollator_collate(dircollator_t *dc, int consensus_method) -{ - tor_assert(!dc->is_collated); - dc->all_rsa_sha1_lst = smartlist_new(); - - if (consensus_method < MIN_METHOD_FOR_ED25519_ID_VOTING) - dircollator_collate_by_rsa(dc); - else - dircollator_collate_by_ed25519(dc); - - smartlist_sort_digests(dc->all_rsa_sha1_lst); - dc->is_collated = 1; -} - -/** - * Collation function for RSA-only consensuses: collate the votes for each - * entry in dc by their RSA keys. - * - * The rule is: - * If an RSA identity key is listed by more than half of the authorities, - * include that identity, and treat all descriptors with that RSA identity - * as describing the same router. - */ -static void -dircollator_collate_by_rsa(dircollator_t *dc) -{ - const int total_authorities = dc->n_authorities; - - DIGESTMAP_FOREACH(dc->by_rsa_sha1, k, vote_routerstatus_t **, vrs_lst) { - int n = 0, i; - for (i = 0; i < dc->n_votes; ++i) { - if (vrs_lst[i] != NULL) - ++n; - } - - if (n <= total_authorities / 2) - continue; - - smartlist_add(dc->all_rsa_sha1_lst, (char *)k); - } DIGESTMAP_FOREACH_END; - - dc->by_collated_rsa_sha1 = dc->by_rsa_sha1; -} - -/** - * Collation function for ed25519 consensuses: collate the votes for each - * entry in dc by ed25519 key and by RSA key. - * - * The rule is, approximately: - * If a (ed,rsa) identity is listed by more than half of authorities, - * include it. And include all (rsa)-only votes about that node as - * matching. - * - * Otherwise, if an (*,rsa) or (rsa) identity is listed by more than - * half of the authorities, and no (ed,rsa) pair for the same RSA key - * has been already been included based on the rule above, include - * that RSA identity. - */ -static void -dircollator_collate_by_ed25519(dircollator_t *dc) -{ - const int total_authorities = dc->n_authorities; - digestmap_t *rsa_digests = digestmap_new(); - - ddmap_entry_t **iter; - - /* Go over all pairs */ - HT_FOREACH(iter, double_digest_map, &dc->by_both_ids) { - ddmap_entry_t *ent = *iter; - int n = 0, i; - for (i = 0; i < dc->n_votes; ++i) { - if (ent->vrs_lst[i] != NULL) - ++n; - } - - /* If not enough authorties listed this exact pair, - * don't include it. */ - if (n <= total_authorities / 2) - continue; - - /* Now consider whether there are any other entries with the same - * RSA key (but with possibly different or missing ed value). */ - vote_routerstatus_t **vrs_lst2 = digestmap_get(dc->by_rsa_sha1, - (char*)ent->d); - tor_assert(vrs_lst2); - - for (i = 0; i < dc->n_votes; ++i) { - if (ent->vrs_lst[i] != NULL) { - ent->vrs_lst[i]->ed25519_reflects_consensus = 1; - } else if (vrs_lst2[i] && ! vrs_lst2[i]->has_ed25519_listing) { - ent->vrs_lst[i] = vrs_lst2[i]; - } - } - - /* Record that we have seen this RSA digest. */ - digestmap_set(rsa_digests, (char*)ent->d, ent->vrs_lst); - smartlist_add(dc->all_rsa_sha1_lst, ent->d); - } - - /* Now look over all entries with an RSA digest, looking for RSA digests - * we didn't put in yet. - */ - DIGESTMAP_FOREACH(dc->by_rsa_sha1, k, vote_routerstatus_t **, vrs_lst) { - if (digestmap_get(rsa_digests, k) != NULL) - continue; /* We already included this RSA digest */ - - int n = 0, i; - for (i = 0; i < dc->n_votes; ++i) { - if (vrs_lst[i] != NULL) - ++n; - } - - if (n <= total_authorities / 2) - continue; /* Not enough votes */ - - digestmap_set(rsa_digests, k, vrs_lst); - smartlist_add(dc->all_rsa_sha1_lst, (char *)k); - } DIGESTMAP_FOREACH_END; - - dc->by_collated_rsa_sha1 = rsa_digests; -} - -/** Return the total number of collated router entries. This function may - * only be called after dircollator_collate. */ -int -dircollator_n_routers(dircollator_t *dc) -{ - tor_assert(dc->is_collated); - return smartlist_len(dc->all_rsa_sha1_lst); -} - -/** Return an array of vote_routerstatus_t entries for the idxth router - * in the collation order. Each array contains n_votes elements, where the - * nth element of the array is the vote_routerstatus_t from the nth voter for - * this identity (or NULL if there is no such entry). - * - * The maximum value for idx is dircollator_n_routers(). - * - * This function may only be called after dircollator_collate. */ -vote_routerstatus_t ** -dircollator_get_votes_for_router(dircollator_t *dc, int idx) -{ - tor_assert(dc->is_collated); - tor_assert(idx < smartlist_len(dc->all_rsa_sha1_lst)); - return digestmap_get(dc->by_collated_rsa_sha1, - smartlist_get(dc->all_rsa_sha1_lst, idx)); -} - diff --git a/src/tor/src/or/dircollate.h b/src/tor/src/or/dircollate.h deleted file mode 100644 index 0584b2fe0..000000000 --- a/src/tor/src/or/dircollate.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dircollate.h - * \brief Header file for dircollate.c. - **/ - -#ifndef TOR_DIRCOLLATE_H -#define TOR_DIRCOLLATE_H - -#include "testsupport.h" -#include "or.h" - -typedef struct dircollator_s dircollator_t; - -dircollator_t *dircollator_new(int n_votes, int n_authorities); -void dircollator_free_(dircollator_t *obj); -#define dircollator_free(c) \ - FREE_AND_NULL(dircollator_t, dircollator_free_, (c)) -void dircollator_add_vote(dircollator_t *dc, networkstatus_t *v); - -void dircollator_collate(dircollator_t *dc, int consensus_method); - -int dircollator_n_routers(dircollator_t *dc); -vote_routerstatus_t **dircollator_get_votes_for_router(dircollator_t *dc, - int idx); - -#ifdef DIRCOLLATE_PRIVATE -struct ddmap_entry_s; -typedef HT_HEAD(double_digest_map, ddmap_entry_s) double_digest_map_t; -/** A dircollator keeps track of all the routerstatus entries in a - * set of networkstatus votes, and matches them by an appropriate rule. */ -struct dircollator_s { - /** True iff we have run the collation algorithm. */ - int is_collated; - /** The total number of votes that we received. */ - int n_votes; - /** The total number of authorities we acknowledge. */ - int n_authorities; - - /** The index which the next vote to be added to this collator should - * receive. */ - int next_vote_num; - /** Map from RSA-SHA1 identity digest to an array of n_votes - * vote_routerstatus_t* pointers, such that the i'th member of the - * array is the i'th vote's entry for that RSA-SHA1 ID.*/ - digestmap_t *by_rsa_sha1; - /** Map from pair to an array similar to that used in - * by_rsa_sha1 above. We include entries for votes that - * say that there is no Ed key. */ - struct double_digest_map by_both_ids; - - /** One of two outputs created by collation: a map from RSA-SHA1 - * identity digest to an array of the vote_routerstatus_t objects. Entries - * only exist in this map for identities that we should include in the - * consensus. */ - digestmap_t *by_collated_rsa_sha1; - - /** One of two outputs created by collation: a sorted array of RSA-SHA1 - * identity digests .*/ - smartlist_t *all_rsa_sha1_lst; -}; -#endif /* defined(DIRCOLLATE_PRIVATE) */ - -#endif /* !defined(TOR_DIRCOLLATE_H) */ - diff --git a/src/tor/src/or/directory.c b/src/tor/src/or/directory.c deleted file mode 100644 index c55f81bc6..000000000 --- a/src/tor/src/or/directory.c +++ /dev/null @@ -1,6011 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define DIRECTORY_PRIVATE - -#include "or.h" -#include "backtrace.h" -#include "bridges.h" -#include "buffers.h" -#include "circuitbuild.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "conscache.h" -#include "consdiff.h" -#include "consdiffmgr.h" -#include "control.h" -#include "compat.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "entrynodes.h" -#include "geoip.h" -#include "hs_cache.h" -#include "hs_common.h" -#include "hs_control.h" -#include "hs_client.h" -#include "main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "shared_random.h" - -#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) -#if !defined(OpenBSD) -#include -#endif -#endif - -/** - * \file directory.c - * \brief Code to send and fetch information from directory authorities and - * caches via HTTP. - * - * Directory caches and authorities use dirserv.c to generate the results of a - * query and stream them to the connection; clients use routerparse.c to parse - * them. - * - * Every directory request has a dir_connection_t on the client side and on - * the server side. In most cases, the dir_connection_t object is a linked - * connection, tunneled through an edge_connection_t so that it can be a - * stream on the Tor network. The only non-tunneled connections are those - * that are used to upload material (descriptors and votes) to authorities. - * Among tunneled connections, some use one-hop circuits, and others use - * multi-hop circuits for anonymity. - * - * Directory requests are launched by calling - * directory_initiate_request(). This - * launch the connection, will construct an HTTP request with - * directory_send_command(), send the and wait for a response. The client - * later handles the response with connection_dir_client_reached_eof(), - * which passes the information received to another part of Tor. - * - * On the server side, requests are read in directory_handle_command(), - * which dispatches first on the request type (GET or POST), and then on - * the URL requested. GET requests are processed with a table-based - * dispatcher in url_table[]. The process of handling larger GET requests - * is complicated because we need to avoid allocating a copy of all the - * data to be sent to the client in one huge buffer. Instead, we spool the - * data into the buffer using logic in connection_dirserv_flushed_some() in - * dirserv.c. (TODO: If we extended buf.c to have a zero-copy - * reference-based buffer type, we could remove most of that code, at the - * cost of a bit more reference counting.) - **/ - -/* In-points to directory.c: - * - * - directory_post_to_dirservers(), called from - * router_upload_dir_desc_to_dirservers() in router.c - * upload_service_descriptor() in rendservice.c - * - directory_get_from_dirserver(), called from - * rend_client_refetch_renddesc() in rendclient.c - * run_scheduled_events() in main.c - * do_hup() in main.c - * - connection_dir_process_inbuf(), called from - * connection_process_inbuf() in connection.c - * - connection_dir_finished_flushing(), called from - * connection_finished_flushing() in connection.c - * - connection_dir_finished_connecting(), called from - * connection_finished_connecting() in connection.c - */ -static void directory_send_command(dir_connection_t *conn, - int direct, - const directory_request_t *request); -static int body_is_plausible(const char *body, size_t body_len, int purpose); -static void http_set_address_origin(const char *headers, connection_t *conn); -static void connection_dir_download_routerdesc_failed(dir_connection_t *conn); -static void connection_dir_bridge_routerdesc_failed(dir_connection_t *conn); -static void connection_dir_download_cert_failed( - dir_connection_t *conn, int status_code); -static void connection_dir_retry_bridges(smartlist_t *descs); -static void dir_routerdesc_download_failed(smartlist_t *failed, - int status_code, - int router_purpose, - int was_extrainfo, - int was_descriptor_digests); -static void dir_microdesc_download_failed(smartlist_t *failed, - int status_code, - const char *dir_id); -static int client_likes_consensus(const struct consensus_cache_entry_t *ent, - const char *want_url); - -static void connection_dir_close_consensus_fetches( - dir_connection_t *except_this_one, const char *resource); - -/********* START VARIABLES **********/ - -/** How far in the future do we allow a directory server to tell us it is - * before deciding that one of us has the wrong time? */ -#define ALLOW_DIRECTORY_TIME_SKEW (30*60) - -#define X_ADDRESS_HEADER "X-Your-Address-Is: " -#define X_OR_DIFF_FROM_CONSENSUS_HEADER "X-Or-Diff-From-Consensus: " - -/** HTTP cache control: how long do we tell proxies they can cache each - * kind of document we serve? */ -#define FULL_DIR_CACHE_LIFETIME (60*60) -#define RUNNINGROUTERS_CACHE_LIFETIME (20*60) -#define DIRPORTFRONTPAGE_CACHE_LIFETIME (20*60) -#define NETWORKSTATUS_CACHE_LIFETIME (5*60) -#define ROUTERDESC_CACHE_LIFETIME (30*60) -#define ROUTERDESC_BY_DIGEST_CACHE_LIFETIME (48*60*60) -#define ROBOTS_CACHE_LIFETIME (24*60*60) -#define MICRODESC_CACHE_LIFETIME (48*60*60) - -/********* END VARIABLES ************/ - -/** Return false if the directory purpose dir_purpose - * does not require an anonymous (three-hop) connection. - * - * Return true 1) by default, 2) if all directory actions have - * specifically been configured to be over an anonymous connection, - * or 3) if the router is a bridge */ -int -purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource) -{ - if (get_options()->AllDirActionsPrivate) - return 1; - - if (router_purpose == ROUTER_PURPOSE_BRIDGE) { - if (dir_purpose == DIR_PURPOSE_FETCH_SERVERDESC - && resource && !strcmp(resource, "authority.z")) { - /* We are asking a bridge for its own descriptor. That doesn't need - anonymity. */ - return 0; - } - /* Assume all other bridge stuff needs anonymity. */ - return 1; /* if no circuits yet, this might break bootstrapping, but it's - * needed to be safe. */ - } - - switch (dir_purpose) - { - case DIR_PURPOSE_UPLOAD_DIR: - case DIR_PURPOSE_UPLOAD_VOTE: - case DIR_PURPOSE_UPLOAD_SIGNATURES: - case DIR_PURPOSE_FETCH_STATUS_VOTE: - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - case DIR_PURPOSE_FETCH_CONSENSUS: - case DIR_PURPOSE_FETCH_CERTIFICATE: - case DIR_PURPOSE_FETCH_SERVERDESC: - case DIR_PURPOSE_FETCH_EXTRAINFO: - case DIR_PURPOSE_FETCH_MICRODESC: - return 0; - case DIR_PURPOSE_HAS_FETCHED_HSDESC: - case DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2: - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - case DIR_PURPOSE_FETCH_RENDDESC_V2: - case DIR_PURPOSE_FETCH_HSDESC: - case DIR_PURPOSE_UPLOAD_HSDESC: - return 1; - case DIR_PURPOSE_SERVER: - default: - log_warn(LD_BUG, "Called with dir_purpose=%d, router_purpose=%d", - dir_purpose, router_purpose); - tor_assert_nonfatal_unreached(); - return 1; /* Assume it needs anonymity; better safe than sorry. */ - } -} - -/** Return a newly allocated string describing auth. Only describes - * authority features. */ -STATIC char * -authdir_type_to_string(dirinfo_type_t auth) -{ - char *result; - smartlist_t *lst = smartlist_new(); - if (auth & V3_DIRINFO) - smartlist_add(lst, (void*)"V3"); - if (auth & BRIDGE_DIRINFO) - smartlist_add(lst, (void*)"Bridge"); - if (smartlist_len(lst)) { - result = smartlist_join_strings(lst, ", ", 0, NULL); - } else { - result = tor_strdup("[Not an authority]"); - } - smartlist_free(lst); - return result; -} - -/** Return a string describing a given directory connection purpose. */ -STATIC const char * -dir_conn_purpose_to_string(int purpose) -{ - switch (purpose) - { - case DIR_PURPOSE_UPLOAD_DIR: - return "server descriptor upload"; - case DIR_PURPOSE_UPLOAD_VOTE: - return "server vote upload"; - case DIR_PURPOSE_UPLOAD_SIGNATURES: - return "consensus signature upload"; - case DIR_PURPOSE_FETCH_SERVERDESC: - return "server descriptor fetch"; - case DIR_PURPOSE_FETCH_EXTRAINFO: - return "extra-info fetch"; - case DIR_PURPOSE_FETCH_CONSENSUS: - return "consensus network-status fetch"; - case DIR_PURPOSE_FETCH_CERTIFICATE: - return "authority cert fetch"; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - return "status vote fetch"; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - return "consensus signature fetch"; - case DIR_PURPOSE_FETCH_RENDDESC_V2: - return "hidden-service v2 descriptor fetch"; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - return "hidden-service v2 descriptor upload"; - case DIR_PURPOSE_FETCH_HSDESC: - return "hidden-service descriptor fetch"; - case DIR_PURPOSE_UPLOAD_HSDESC: - return "hidden-service descriptor upload"; - case DIR_PURPOSE_FETCH_MICRODESC: - return "microdescriptor fetch"; - } - - log_warn(LD_BUG, "Called with unknown purpose %d", purpose); - return "(unknown)"; -} - -/** Return the requisite directory information types. */ -STATIC dirinfo_type_t -dir_fetch_type(int dir_purpose, int router_purpose, const char *resource) -{ - dirinfo_type_t type; - switch (dir_purpose) { - case DIR_PURPOSE_FETCH_EXTRAINFO: - type = EXTRAINFO_DIRINFO; - if (router_purpose == ROUTER_PURPOSE_BRIDGE) - type |= BRIDGE_DIRINFO; - else - type |= V3_DIRINFO; - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - if (router_purpose == ROUTER_PURPOSE_BRIDGE) - type = BRIDGE_DIRINFO; - else - type = V3_DIRINFO; - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - case DIR_PURPOSE_FETCH_CERTIFICATE: - type = V3_DIRINFO; - break; - case DIR_PURPOSE_FETCH_CONSENSUS: - type = V3_DIRINFO; - if (resource && !strcmp(resource, "microdesc")) - type |= MICRODESC_DIRINFO; - break; - case DIR_PURPOSE_FETCH_MICRODESC: - type = MICRODESC_DIRINFO; - break; - default: - log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose); - type = NO_DIRINFO; - break; - } - return type; -} - -/** Return true iff identity_digest is the digest of a router which - * says that it caches extrainfos. (If is_authority we always - * believe that to be true.) */ -int -router_supports_extrainfo(const char *identity_digest, int is_authority) -{ - const node_t *node = node_get_by_id(identity_digest); - - if (node && node->ri) { - if (node->ri->caches_extra_info) - return 1; - } - if (is_authority) { - return 1; - } - return 0; -} - -/** Return true iff any trusted directory authority has accepted our - * server descriptor. - * - * We consider any authority sufficient because waiting for all of - * them means it never happens while any authority is down; we don't - * go for something more complex in the middle (like \>1/3 or \>1/2 or - * \>=1/2) because that doesn't seem necessary yet. - */ -int -directories_have_accepted_server_descriptor(void) -{ - const smartlist_t *servers = router_get_trusted_dir_servers(); - const or_options_t *options = get_options(); - SMARTLIST_FOREACH(servers, dir_server_t *, d, { - if ((d->type & options->PublishServerDescriptor_) && - d->has_accepted_serverdesc) { - return 1; - } - }); - return 0; -} - -/** Start a connection to every suitable directory authority, using - * connection purpose dir_purpose and uploading payload - * (of length payload_len). The dir_purpose should be one of - * 'DIR_PURPOSE_UPLOAD_{DIR|VOTE|SIGNATURES}'. - * - * router_purpose describes the type of descriptor we're - * publishing, if we're publishing a descriptor -- e.g. general or bridge. - * - * type specifies what sort of dir authorities (V3, - * BRIDGE, etc) we should upload to. - * - * If extrainfo_len is nonzero, the first payload_len bytes of - * payload hold a router descriptor, and the next extrainfo_len - * bytes of payload hold an extra-info document. Upload the descriptor - * to all authorities, and the extra-info document to all authorities that - * support it. - */ -void -directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, - dirinfo_type_t type, - const char *payload, - size_t payload_len, size_t extrainfo_len) -{ - const or_options_t *options = get_options(); - dir_indirection_t indirection; - const smartlist_t *dirservers = router_get_trusted_dir_servers(); - int found = 0; - const int exclude_self = (dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || - dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES); - tor_assert(dirservers); - /* This tries dirservers which we believe to be down, but ultimately, that's - * harmless, and we may as well err on the side of getting things uploaded. - */ - SMARTLIST_FOREACH_BEGIN(dirservers, dir_server_t *, ds) { - routerstatus_t *rs = &(ds->fake_status); - size_t upload_len = payload_len; - - if ((type & ds->type) == 0) - continue; - - if (exclude_self && router_digest_is_me(ds->digest)) { - /* we don't upload to ourselves, but at least there's now at least - * one authority of this type that has what we wanted to upload. */ - found = 1; - continue; - } - - if (options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, rs, -1)) { - log_warn(LD_DIR, "Wanted to contact authority '%s' for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping.", - ds->nickname, - dir_conn_purpose_to_string(dir_purpose)); - continue; - } - - found = 1; /* at least one authority of this type was listed */ - if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR) - ds->has_accepted_serverdesc = 0; - - if (extrainfo_len && router_supports_extrainfo(ds->digest, 1)) { - upload_len += extrainfo_len; - log_info(LD_DIR, "Uploading an extrainfo too (length %d)", - (int) extrainfo_len); - } - if (purpose_needs_anonymity(dir_purpose, router_purpose, NULL)) { - indirection = DIRIND_ANONYMOUS; - } else if (!fascist_firewall_allows_dir_server(ds, - FIREWALL_DIR_CONNECTION, - 0)) { - if (fascist_firewall_allows_dir_server(ds, FIREWALL_OR_CONNECTION, 0)) - indirection = DIRIND_ONEHOP; - else - indirection = DIRIND_ANONYMOUS; - } else { - indirection = DIRIND_DIRECT_CONN; - } - - directory_request_t *req = directory_request_new(dir_purpose); - directory_request_set_routerstatus(req, rs); - directory_request_set_router_purpose(req, router_purpose); - directory_request_set_indirection(req, indirection); - directory_request_set_payload(req, payload, upload_len); - directory_initiate_request(req); - directory_request_free(req); - } SMARTLIST_FOREACH_END(ds); - if (!found) { - char *s = authdir_type_to_string(type); - log_warn(LD_DIR, "Publishing server descriptor to directory authorities " - "of type '%s', but no authorities of that type listed!", s); - tor_free(s); - } -} - -/** Return true iff, according to the values in options, we should be - * using directory guards for direct downloads of directory information. */ -STATIC int -should_use_directory_guards(const or_options_t *options) -{ - /* Public (non-bridge) servers never use directory guards. */ - if (public_server_mode(options)) - return 0; - /* If guards are disabled, we can't use directory guards. - */ - if (!options->UseEntryGuards) - return 0; - /* If we're configured to fetch directory info aggressively or of a - * nonstandard type, don't use directory guards. */ - if (options->DownloadExtraInfo || options->FetchDirInfoEarly || - options->FetchDirInfoExtraEarly || options->FetchUselessDescriptors) - return 0; - return 1; -} - -/** Pick an unconstrained directory server from among our guards, the latest - * networkstatus, or the fallback dirservers, for use in downloading - * information of type type, and return its routerstatus. */ -static const routerstatus_t * -directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, - uint8_t dir_purpose, - circuit_guard_state_t **guard_state_out) -{ - const routerstatus_t *rs = NULL; - const or_options_t *options = get_options(); - - if (options->UseBridges) - log_warn(LD_BUG, "Called when we have UseBridges set."); - - if (should_use_directory_guards(options)) { - const node_t *node = guards_choose_dirguard(dir_purpose, guard_state_out); - if (node) - rs = node->rs; - } else { - /* anybody with a non-zero dirport will do */ - rs = router_pick_directory_server(type, pds_flags); - } - if (!rs) { - log_info(LD_DIR, "No router found for %s; falling back to " - "dirserver list.", dir_conn_purpose_to_string(dir_purpose)); - rs = router_pick_fallback_dirserver(type, pds_flags); - } - - return rs; -} - -/** - * Set the extra fields in req that are used when requesting a - * consensus of type resource. - * - * Right now, these fields are if-modified-since and x-or-diff-from-consensus. - */ -static void -dir_consensus_request_set_additional_headers(directory_request_t *req, - const char *resource) -{ - time_t if_modified_since = 0; - uint8_t or_diff_from[DIGEST256_LEN]; - int or_diff_from_is_set = 0; - - /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus - * period of 1 hour. - */ - const int DEFAULT_IF_MODIFIED_SINCE_DELAY = 180; - const int32_t DEFAULT_TRY_DIFF_FOR_CONSENSUS_NEWER = 72; - const int32_t MIN_TRY_DIFF_FOR_CONSENSUS_NEWER = 0; - const int32_t MAX_TRY_DIFF_FOR_CONSENSUS_NEWER = 8192; - const char TRY_DIFF_FOR_CONSENSUS_NEWER_NAME[] = - "try-diff-for-consensus-newer-than"; - - int flav = FLAV_NS; - if (resource) - flav = networkstatus_parse_flavor_name(resource); - - int32_t max_age_for_diff = 3600 * - networkstatus_get_param(NULL, - TRY_DIFF_FOR_CONSENSUS_NEWER_NAME, - DEFAULT_TRY_DIFF_FOR_CONSENSUS_NEWER, - MIN_TRY_DIFF_FOR_CONSENSUS_NEWER, - MAX_TRY_DIFF_FOR_CONSENSUS_NEWER); - - if (flav != -1) { - /* IF we have a parsed consensus of this type, we can do an - * if-modified-time based on it. */ - networkstatus_t *v; - v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v) { - /* In networks with particularly short V3AuthVotingIntervals, - * ask for the consensus if it's been modified since half the - * V3AuthVotingInterval of the most recent consensus. */ - time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY; - if (v->fresh_until > v->valid_after - && ims_delay > (v->fresh_until - v->valid_after)/2) { - ims_delay = (v->fresh_until - v->valid_after)/2; - } - if_modified_since = v->valid_after + ims_delay; - if (v->valid_after >= approx_time() - max_age_for_diff) { - memcpy(or_diff_from, v->digest_sha3_as_signed, DIGEST256_LEN); - or_diff_from_is_set = 1; - } - } - } else { - /* Otherwise it might be a consensus we don't parse, but which we - * do cache. Look at the cached copy, perhaps. */ - cached_dir_t *cd = dirserv_get_consensus(resource); - /* We have no method of determining the voting interval from an - * unparsed consensus, so we use the default. */ - if (cd) { - if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY; - if (cd->published >= approx_time() - max_age_for_diff) { - memcpy(or_diff_from, cd->digest_sha3_as_signed, DIGEST256_LEN); - or_diff_from_is_set = 1; - } - } - } - - if (if_modified_since > 0) - directory_request_set_if_modified_since(req, if_modified_since); - if (or_diff_from_is_set) { - char hex[HEX_DIGEST256_LEN + 1]; - base16_encode(hex, sizeof(hex), - (const char*)or_diff_from, sizeof(or_diff_from)); - directory_request_add_header(req, X_OR_DIFF_FROM_CONSENSUS_HEADER, hex); - } -} - -/** Start a connection to a random running directory server, using - * connection purpose dir_purpose, intending to fetch descriptors - * of purpose router_purpose, and requesting resource. - * Use pds_flags as arguments to router_pick_directory_server() - * or router_pick_trusteddirserver(). - */ -MOCK_IMPL(void, -directory_get_from_dirserver,( - uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource, - int pds_flags, - download_want_authority_t want_authority)) -{ - const routerstatus_t *rs = NULL; - const or_options_t *options = get_options(); - int prefer_authority = (directory_fetches_from_authorities(options) - || want_authority == DL_WANT_AUTHORITY); - int require_authority = 0; - int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose, - resource); - dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource); - - if (type == NO_DIRINFO) - return; - - if (!options->FetchServerDescriptors) - return; - - circuit_guard_state_t *guard_state = NULL; - if (!get_via_tor) { - if (options->UseBridges && !(type & BRIDGE_DIRINFO)) { - /* We want to ask a running bridge for which we have a descriptor. - * - * When we ask choose_random_entry() for a bridge, we specify what - * sort of dir fetch we'll be doing, so it won't return a bridge - * that can't answer our question. - */ - const node_t *node = guards_choose_dirguard(dir_purpose, &guard_state); - if (node && node->ri) { - /* every bridge has a routerinfo. */ - routerinfo_t *ri = node->ri; - /* clients always make OR connections to bridges */ - tor_addr_port_t or_ap; - directory_request_t *req = directory_request_new(dir_purpose); - /* we are willing to use a non-preferred address if we need to */ - fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, - &or_ap); - directory_request_set_or_addr_port(req, &or_ap); - directory_request_set_directory_id_digest(req, - ri->cache_info.identity_digest); - directory_request_set_router_purpose(req, router_purpose); - directory_request_set_resource(req, resource); - if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) - dir_consensus_request_set_additional_headers(req, resource); - directory_request_set_guard_state(req, guard_state); - directory_initiate_request(req); - directory_request_free(req); - } else { - if (guard_state) { - entry_guard_cancel(&guard_state); - } - log_notice(LD_DIR, "Ignoring directory request, since no bridge " - "nodes are available yet."); - } - - return; - } else { - if (prefer_authority || (type & BRIDGE_DIRINFO)) { - /* only ask authdirservers, and don't ask myself */ - rs = router_pick_trusteddirserver(type, pds_flags); - if (rs == NULL && (pds_flags & (PDS_NO_EXISTING_SERVERDESC_FETCH| - PDS_NO_EXISTING_MICRODESC_FETCH))) { - /* We don't want to fetch from any authorities that we're currently - * fetching server descriptors from, and we got no match. Did we - * get no match because all the authorities have connections - * fetching server descriptors (in which case we should just - * return,) or because all the authorities are down or on fire or - * unreachable or something (in which case we should go on with - * our fallback code)? */ - pds_flags &= ~(PDS_NO_EXISTING_SERVERDESC_FETCH| - PDS_NO_EXISTING_MICRODESC_FETCH); - rs = router_pick_trusteddirserver(type, pds_flags); - if (rs) { - log_debug(LD_DIR, "Deferring serverdesc fetch: all authorities " - "are in use."); - return; - } - } - if (rs == NULL && require_authority) { - log_info(LD_DIR, "No authorities were available for %s: will try " - "later.", dir_conn_purpose_to_string(dir_purpose)); - return; - } - } - if (!rs && !(type & BRIDGE_DIRINFO)) { - rs = directory_pick_generic_dirserver(type, pds_flags, - dir_purpose, - &guard_state); - if (!rs) - get_via_tor = 1; /* last resort: try routing it via Tor */ - } - } - } - - if (get_via_tor) { - /* Never use fascistfirewall; we're going via Tor. */ - pds_flags |= PDS_IGNORE_FASCISTFIREWALL; - rs = router_pick_directory_server(type, pds_flags); - } - - /* If we have any hope of building an indirect conn, we know some router - * descriptors. If (rs==NULL), we can't build circuits anyway, so - * there's no point in falling back to the authorities in this case. */ - if (rs) { - const dir_indirection_t indirection = - get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; - directory_request_t *req = directory_request_new(dir_purpose); - directory_request_set_routerstatus(req, rs); - directory_request_set_router_purpose(req, router_purpose); - directory_request_set_indirection(req, indirection); - directory_request_set_resource(req, resource); - if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) - dir_consensus_request_set_additional_headers(req, resource); - if (guard_state) - directory_request_set_guard_state(req, guard_state); - directory_initiate_request(req); - directory_request_free(req); - } else { - log_notice(LD_DIR, - "While fetching directory info, " - "no running dirservers known. Will try again later. " - "(purpose %d)", dir_purpose); - if (!purpose_needs_anonymity(dir_purpose, router_purpose, resource)) { - /* remember we tried them all and failed. */ - directory_all_unreachable(time(NULL)); - } - } -} - -/** As directory_get_from_dirserver, but initiates a request to every - * directory authority other than ourself. Only for use by authorities when - * searching for missing information while voting. */ -void -directory_get_from_all_authorities(uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource) -{ - tor_assert(dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || - dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES); - - SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), - dir_server_t *, ds) { - if (router_digest_is_me(ds->digest)) - continue; - if (!(ds->type & V3_DIRINFO)) - continue; - const routerstatus_t *rs = &ds->fake_status; - directory_request_t *req = directory_request_new(dir_purpose); - directory_request_set_routerstatus(req, rs); - directory_request_set_router_purpose(req, router_purpose); - directory_request_set_resource(req, resource); - directory_initiate_request(req); - directory_request_free(req); - } SMARTLIST_FOREACH_END(ds); -} - -/** Return true iff ind requires a multihop circuit. */ -static int -dirind_is_anon(dir_indirection_t ind) -{ - return ind == DIRIND_ANON_DIRPORT || ind == DIRIND_ANONYMOUS; -} - -/* Choose reachable OR and Dir addresses and ports from status, copying them - * into use_or_ap and use_dir_ap. If indirection is anonymous, then we're - * connecting via another relay, so choose the primary IPv4 address and ports. - * - * status should have at least one reachable address, if we can't choose a - * reachable address, warn and return -1. Otherwise, return 0. - */ -static int -directory_choose_address_routerstatus(const routerstatus_t *status, - dir_indirection_t indirection, - tor_addr_port_t *use_or_ap, - tor_addr_port_t *use_dir_ap) -{ - tor_assert(status != NULL); - tor_assert(use_or_ap != NULL); - tor_assert(use_dir_ap != NULL); - - const or_options_t *options = get_options(); - int have_or = 0, have_dir = 0; - - /* We expect status to have at least one reachable address if we're - * connecting to it directly. - * - * Therefore, we can simply use the other address if the one we want isn't - * allowed by the firewall. - * - * (When Tor uploads and downloads a hidden service descriptor, it uses - * DIRIND_ANONYMOUS, except for Tor2Web, which uses DIRIND_ONEHOP. - * So this code will only modify the address for Tor2Web's HS descriptor - * fetches. Even Single Onion Servers (NYI) use DIRIND_ANONYMOUS, to avoid - * HSDirs denying service by rejecting descriptors.) - */ - - /* Initialise the OR / Dir addresses */ - tor_addr_make_null(&use_or_ap->addr, AF_UNSPEC); - use_or_ap->port = 0; - tor_addr_make_null(&use_dir_ap->addr, AF_UNSPEC); - use_dir_ap->port = 0; - - /* ORPort connections */ - if (indirection == DIRIND_ANONYMOUS) { - if (status->addr) { - /* Since we're going to build a 3-hop circuit and ask the 2nd relay - * to extend to this address, always use the primary (IPv4) OR address */ - tor_addr_from_ipv4h(&use_or_ap->addr, status->addr); - use_or_ap->port = status->or_port; - have_or = 1; - } - } else if (indirection == DIRIND_ONEHOP) { - /* We use an IPv6 address if we have one and we prefer it. - * Use the preferred address and port if they are reachable, otherwise, - * use the alternate address and port (if any). - */ - have_or = fascist_firewall_choose_address_rs(status, - FIREWALL_OR_CONNECTION, 0, - use_or_ap); - } - - /* DirPort connections - * DIRIND_ONEHOP uses ORPort, but may fall back to the DirPort on relays */ - if (indirection == DIRIND_DIRECT_CONN || - indirection == DIRIND_ANON_DIRPORT || - (indirection == DIRIND_ONEHOP - && !directory_must_use_begindir(options))) { - have_dir = fascist_firewall_choose_address_rs(status, - FIREWALL_DIR_CONNECTION, 0, - use_dir_ap); - } - - /* We rejected all addresses in the relay's status. This means we can't - * connect to it. */ - if (!have_or && !have_dir) { - static int logged_backtrace = 0; - log_info(LD_BUG, "Rejected all OR and Dir addresses from %s when " - "launching an outgoing directory connection to: IPv4 %s OR %d " - "Dir %d IPv6 %s OR %d Dir %d", routerstatus_describe(status), - fmt_addr32(status->addr), status->or_port, - status->dir_port, fmt_addr(&status->ipv6_addr), - status->ipv6_orport, status->dir_port); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Addresses came from"); - logged_backtrace = 1; - } - return -1; - } - - return 0; -} - -/** Return true iff conn is the client side of a directory connection - * we launched to ourself in order to determine the reachability of our - * dir_port. */ -static int -directory_conn_is_self_reachability_test(dir_connection_t *conn) -{ - if (conn->requested_resource && - !strcmpstart(conn->requested_resource,"authority")) { - const routerinfo_t *me = router_get_my_routerinfo(); - if (me && - router_digest_is_me(conn->identity_digest) && - tor_addr_eq_ipv4h(&conn->base_.addr, me->addr) && /*XXXX prop 118*/ - me->dir_port == conn->base_.port) - return 1; - } - return 0; -} - -/** Called when we are unable to complete the client's request to a directory - * server due to a network error: Mark the router as down and try again if - * possible. - */ -static void -connection_dir_request_failed(dir_connection_t *conn) -{ - if (conn->guard_state) { - /* We haven't seen a success on this guard state, so consider it to have - * failed. */ - entry_guard_failed(&conn->guard_state); - } - if (directory_conn_is_self_reachability_test(conn)) { - return; /* this was a test fetch. don't retry. */ - } - if (!entry_list_is_constrained(get_options())) - router_set_status(conn->identity_digest, 0); /* don't try this one again */ - if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { - log_info(LD_DIR, "Giving up on serverdesc/extrainfo fetch from " - "directory server at '%s'; retrying", - conn->base_.address); - if (conn->router_purpose == ROUTER_PURPOSE_BRIDGE) - connection_dir_bridge_routerdesc_failed(conn); - connection_dir_download_routerdesc_failed(conn); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - if (conn->requested_resource) - networkstatus_consensus_download_failed(0, conn->requested_resource); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { - log_info(LD_DIR, "Giving up on certificate fetch from directory server " - "at '%s'; retrying", - conn->base_.address); - connection_dir_download_cert_failed(conn, 0); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { - log_info(LD_DIR, "Giving up downloading detached signatures from '%s'", - conn->base_.address); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { - log_info(LD_DIR, "Giving up downloading votes from '%s'", - conn->base_.address); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { - log_info(LD_DIR, "Giving up on downloading microdescriptors from " - "directory server at '%s'; will retry", conn->base_.address); - connection_dir_download_routerdesc_failed(conn); - } -} - -/** Helper: Attempt to fetch directly the descriptors of each bridge - * listed in failed. - */ -static void -connection_dir_retry_bridges(smartlist_t *descs) -{ - char digest[DIGEST_LEN]; - SMARTLIST_FOREACH(descs, const char *, cp, - { - if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp)) != DIGEST_LEN) { - log_warn(LD_BUG, "Malformed fingerprint in list: %s", - escaped(cp)); - continue; - } - retry_bridge_descriptor_fetch_directly(digest); - }); -} - -/** Called when an attempt to download one or more router descriptors - * or extra-info documents on connection conn failed. - */ -static void -connection_dir_download_routerdesc_failed(dir_connection_t *conn) -{ - /* No need to increment the failure count for routerdescs, since - * it's not their fault. */ - - /* No need to relaunch descriptor downloads here: we already do it - * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in main.c. */ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - - (void) conn; -} - -/** Called when an attempt to download a bridge's routerdesc from - * one of the authorities failed due to a network error. If - * possible attempt to download descriptors from the bridge directly. - */ -static void -connection_dir_bridge_routerdesc_failed(dir_connection_t *conn) -{ - smartlist_t *which = NULL; - - /* Requests for bridge descriptors are in the form 'fp/', so ignore - anything else. */ - if (!conn->requested_resource || strcmpstart(conn->requested_resource,"fp/")) - return; - - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource - + strlen("fp/"), - which, NULL, 0); - - tor_assert(conn->base_.purpose != DIR_PURPOSE_FETCH_EXTRAINFO); - if (smartlist_len(which)) { - connection_dir_retry_bridges(which); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - } - smartlist_free(which); -} - -/** Called when an attempt to fetch a certificate fails. */ -static void -connection_dir_download_cert_failed(dir_connection_t *conn, int status) -{ - const char *fp_pfx = "fp/"; - const char *fpsk_pfx = "fp-sk/"; - smartlist_t *failed; - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE); - - if (!conn->requested_resource) - return; - failed = smartlist_new(); - /* - * We have two cases download by fingerprint (resource starts - * with "fp/") or download by fingerprint/signing key pair - * (resource starts with "fp-sk/"). - */ - if (!strcmpstart(conn->requested_resource, fp_pfx)) { - /* Download by fingerprint case */ - dir_split_resource_into_fingerprints(conn->requested_resource + - strlen(fp_pfx), - failed, NULL, DSR_HEX); - SMARTLIST_FOREACH_BEGIN(failed, char *, cp) { - /* Null signing key digest indicates download by fp only */ - authority_cert_dl_failed(cp, NULL, status); - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - } else if (!strcmpstart(conn->requested_resource, fpsk_pfx)) { - /* Download by (fp,sk) pairs */ - dir_split_resource_into_fingerprint_pairs(conn->requested_resource + - strlen(fpsk_pfx), failed); - SMARTLIST_FOREACH_BEGIN(failed, fp_pair_t *, cp) { - authority_cert_dl_failed(cp->first, cp->second, status); - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - } else { - log_warn(LD_DIR, - "Don't know what to do with failure for cert fetch %s", - conn->requested_resource); - } - - smartlist_free(failed); - - update_certificate_downloads(time(NULL)); -} - -/* Should this tor instance only use begindir for all its directory requests? - */ -int -directory_must_use_begindir(const or_options_t *options) -{ - /* Clients, onion services, and bridges must use begindir, - * relays and authorities do not have to */ - return !public_server_mode(options); -} - -/** Evaluate the situation and decide if we should use an encrypted - * "begindir-style" connection for this directory request. - * 0) If there is no DirPort, yes. - * 1) If or_port is 0, or it's a direct conn and or_port is firewalled - * or we're a dir mirror, no. - * 2) If we prefer to avoid begindir conns, and we're not fetching or - * publishing a bridge relay descriptor, no. - * 3) Else yes. - * If returning 0, return in *reason why we can't use begindir. - * reason must not be NULL. - */ -static int -directory_command_should_use_begindir(const or_options_t *options, - const directory_request_t *req, - const char **reason) -{ - const tor_addr_t *or_addr = &req->or_addr_port.addr; - //const tor_addr_t *dir_addr = &req->dir_addr_port.addr; - const int or_port = req->or_addr_port.port; - const int dir_port = req->dir_addr_port.port; - - const dir_indirection_t indirection = req->indirection; - - tor_assert(reason); - *reason = NULL; - - /* Reasons why we must use begindir */ - if (!dir_port) { - *reason = "(using begindir - directory with no DirPort)"; - return 1; /* We don't know a DirPort -- must begindir. */ - } - /* Reasons why we can't possibly use begindir */ - if (!or_port) { - *reason = "directory with unknown ORPort"; - return 0; /* We don't know an ORPort -- no chance. */ - } - if (indirection == DIRIND_DIRECT_CONN || - indirection == DIRIND_ANON_DIRPORT) { - *reason = "DirPort connection"; - return 0; - } - if (indirection == DIRIND_ONEHOP) { - /* We're firewalled and want a direct OR connection */ - if (!fascist_firewall_allows_address_addr(or_addr, or_port, - FIREWALL_OR_CONNECTION, 0, 0)) { - *reason = "ORPort not reachable"; - return 0; - } - } - /* Reasons why we want to avoid using begindir */ - if (indirection == DIRIND_ONEHOP) { - if (!directory_must_use_begindir(options)) { - *reason = "in relay mode"; - return 0; - } - } - /* DIRIND_ONEHOP on a client, or DIRIND_ANONYMOUS - */ - *reason = "(using begindir)"; - return 1; -} - -/** - * Create and return a new directory_request_t with purpose - * dir_purpose. - */ -directory_request_t * -directory_request_new(uint8_t dir_purpose) -{ - tor_assert(dir_purpose >= DIR_PURPOSE_MIN_); - tor_assert(dir_purpose <= DIR_PURPOSE_MAX_); - tor_assert(dir_purpose != DIR_PURPOSE_SERVER); - tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2); - tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_HSDESC); - - directory_request_t *result = tor_malloc_zero(sizeof(*result)); - tor_addr_make_null(&result->or_addr_port.addr, AF_INET); - result->or_addr_port.port = 0; - tor_addr_make_null(&result->dir_addr_port.addr, AF_INET); - result->dir_addr_port.port = 0; - result->dir_purpose = dir_purpose; - result->router_purpose = ROUTER_PURPOSE_GENERAL; - result->indirection = DIRIND_ONEHOP; - return result; -} -/** - * Release all resources held by req. - */ -void -directory_request_free_(directory_request_t *req) -{ - if (req == NULL) - return; - config_free_lines(req->additional_headers); - tor_free(req); -} -/** - * Set the address and OR port to use for this directory request. If there is - * no OR port, we'll have to connect over the dirport. (If there are both, - * the indirection setting determins which to use.) - */ -void -directory_request_set_or_addr_port(directory_request_t *req, - const tor_addr_port_t *p) -{ - memcpy(&req->or_addr_port, p, sizeof(*p)); -} -/** - * Set the address and dirport to use for this directory request. If there - * is no dirport, we'll have to connect over the OR port. (If there are both, - * the indirection setting determins which to use.) - */ -void -directory_request_set_dir_addr_port(directory_request_t *req, - const tor_addr_port_t *p) -{ - memcpy(&req->dir_addr_port, p, sizeof(*p)); -} -/** - * Set the RSA identity digest of the directory to use for this directory - * request. - */ -void -directory_request_set_directory_id_digest(directory_request_t *req, - const char *digest) -{ - memcpy(req->digest, digest, DIGEST_LEN); -} -/** - * Set the router purpose associated with uploaded and downloaded router - * descriptors and extrainfo documents in this directory request. The purpose - * must be one of ROUTER_PURPOSE_GENERAL (the default) or - * ROUTER_PURPOSE_BRIDGE. - */ -void -directory_request_set_router_purpose(directory_request_t *req, - uint8_t router_purpose) -{ - tor_assert(router_purpose == ROUTER_PURPOSE_GENERAL || - router_purpose == ROUTER_PURPOSE_BRIDGE); - // assert that it actually makes sense to set this purpose, given - // the dir_purpose. - req->router_purpose = router_purpose; -} -/** - * Set the indirection to be used for the directory request. The indirection - * parameter configures whether to connect to a DirPort or ORPort, and whether - * to anonymize the connection. DIRIND_ONEHOP (use ORPort, don't anonymize) - * is the default. See dir_indirection_t for more information. - */ -void -directory_request_set_indirection(directory_request_t *req, - dir_indirection_t indirection) -{ - req->indirection = indirection; -} - -/** - * Set a pointer to the resource to request from a directory. Different - * request types use resources to indicate different components of their URL. - * Note that only an alias to resource is stored, so the - * resource must outlive the request. - */ -void -directory_request_set_resource(directory_request_t *req, - const char *resource) -{ - req->resource = resource; -} -/** - * Set a pointer to the payload to include with this directory request, along - * with its length. Note that only an alias to payload is stored, so - * the payload must outlive the request. - */ -void -directory_request_set_payload(directory_request_t *req, - const char *payload, - size_t payload_len) -{ - tor_assert(DIR_PURPOSE_IS_UPLOAD(req->dir_purpose)); - - req->payload = payload; - req->payload_len = payload_len; -} -/** - * Set an if-modified-since date to send along with the request. The - * default is 0 (meaning, send no if-modified-since header). - */ -void -directory_request_set_if_modified_since(directory_request_t *req, - time_t if_modified_since) -{ - req->if_modified_since = if_modified_since; -} - -/** Include a header of name key with content val in the - * request. Neither may include newlines or other odd characters. Their - * ordering is not currently guaranteed. - * - * Note that, as elsewhere in this module, header keys include a trailing - * colon and space. - */ -void -directory_request_add_header(directory_request_t *req, - const char *key, - const char *val) -{ - config_line_prepend(&req->additional_headers, key, val); -} -/** - * Set an object containing HS data to be associated with this request. Note - * that only an alias to query is stored, so the query object - * must outlive the request. - */ -void -directory_request_set_rend_query(directory_request_t *req, - const rend_data_t *query) -{ - if (query) { - tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 || - req->dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); - } - req->rend_query = query; -} -/** - * Set an object containing HS connection identifier to be associated with - * this request. Note that only an alias to ident is stored, so the - * ident object must outlive the request. - */ -void -directory_request_upload_set_hs_ident(directory_request_t *req, - const hs_ident_dir_conn_t *ident) -{ - if (ident) { - tor_assert(req->dir_purpose == DIR_PURPOSE_UPLOAD_HSDESC); - } - req->hs_ident = ident; -} -/** - * Set an object containing HS connection identifier to be associated with - * this fetch request. Note that only an alias to ident is stored, so - * the ident object must outlive the request. - */ -void -directory_request_fetch_set_hs_ident(directory_request_t *req, - const hs_ident_dir_conn_t *ident) -{ - if (ident) { - tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_HSDESC); - } - req->hs_ident = ident; -} -/** Set a static circuit_guard_state_t object to affliate with the request in - * req. This object will receive notification when the attempt to - * connect to the guard either succeeds or fails. */ -void -directory_request_set_guard_state(directory_request_t *req, - circuit_guard_state_t *state) -{ - req->guard_state = state; -} - -/** - * Internal: Return true if any information for contacting the directory in - * req has been set, other than by the routerstatus. */ -static int -directory_request_dir_contact_info_specified(const directory_request_t *req) -{ - /* We only check for ports here, since we don't use an addr unless the port - * is set */ - return (req->or_addr_port.port || - req->dir_addr_port.port || - ! tor_digest_is_zero(req->digest)); -} - -/** - * Set the routerstatus to use for the directory associated with this - * request. If this option is set, then no other function to set the - * directory's address or identity should be called. - */ -void -directory_request_set_routerstatus(directory_request_t *req, - const routerstatus_t *status) -{ - req->routerstatus = status; -} -/** - * Helper: update the addresses, ports, and identities in req - * from the routerstatus object in req. Return 0 on success. - * On failure, warn and return -1. - */ -static int -directory_request_set_dir_from_routerstatus(directory_request_t *req) - -{ - const routerstatus_t *status = req->routerstatus; - if (BUG(status == NULL)) - return -1; - const or_options_t *options = get_options(); - const node_t *node; - tor_addr_port_t use_or_ap, use_dir_ap; - const int anonymized_connection = dirind_is_anon(req->indirection); - - tor_assert(status != NULL); - - node = node_get_by_id(status->identity_digest); - - /* XXX The below check is wrong: !node means it's not in the consensus, - * but we haven't checked if we have a descriptor for it -- and also, - * we only care about the descriptor if it's a begindir-style anonymized - * connection. */ - if (!node && anonymized_connection) { - log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " - "don't have its router descriptor.", - routerstatus_describe(status)); - return -1; - } - - if (options->ExcludeNodes && options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { - log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping. This choice might make your Tor not work.", - routerstatus_describe(status), - dir_conn_purpose_to_string(req->dir_purpose)); - return -1; - } - - /* At this point, if we are a client making a direct connection to a - * directory server, we have selected a server that has at least one address - * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This - * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if - * possible. (If UseBridges is set, clients always use IPv6, and prefer it - * by default.) - * - * Now choose an address that we can use to connect to the directory server. - */ - if (directory_choose_address_routerstatus(status, - req->indirection, &use_or_ap, - &use_dir_ap) < 0) { - return -1; - } - - directory_request_set_or_addr_port(req, &use_or_ap); - directory_request_set_dir_addr_port(req, &use_dir_ap); - directory_request_set_directory_id_digest(req, status->identity_digest); - return 0; -} - -/** - * Launch the provided directory request, configured in request. - * After this function is called, you can free request. - */ -MOCK_IMPL(void, -directory_initiate_request,(directory_request_t *request)) -{ - tor_assert(request); - if (request->routerstatus) { - tor_assert_nonfatal( - ! directory_request_dir_contact_info_specified(request)); - if (directory_request_set_dir_from_routerstatus(request) < 0) { - return; - } - } - - const tor_addr_port_t *or_addr_port = &request->or_addr_port; - const tor_addr_port_t *dir_addr_port = &request->dir_addr_port; - const char *digest = request->digest; - const uint8_t dir_purpose = request->dir_purpose; - const uint8_t router_purpose = request->router_purpose; - const dir_indirection_t indirection = request->indirection; - const char *resource = request->resource; - const rend_data_t *rend_query = request->rend_query; - const hs_ident_dir_conn_t *hs_ident = request->hs_ident; - circuit_guard_state_t *guard_state = request->guard_state; - - tor_assert(or_addr_port->port || dir_addr_port->port); - tor_assert(digest); - - dir_connection_t *conn; - const or_options_t *options = get_options(); - int socket_error = 0; - const char *begindir_reason = NULL; - /* Should the connection be to a relay's OR port (and inside that we will - * send our directory request)? */ - const int use_begindir = - directory_command_should_use_begindir(options, request, &begindir_reason); - - /* Will the connection go via a three-hop Tor circuit? Note that this - * is separate from whether it will use_begindir. */ - const int anonymized_connection = dirind_is_anon(indirection); - - /* What is the address we want to make the directory request to? If - * we're making a begindir request this is the ORPort of the relay - * we're contacting; if not a begindir request, this is its DirPort. - * Note that if anonymized_connection is true, we won't be initiating - * a connection directly to this address. */ - tor_addr_t addr; - tor_addr_copy(&addr, &(use_begindir ? or_addr_port : dir_addr_port)->addr); - uint16_t port = (use_begindir ? or_addr_port : dir_addr_port)->port; - - log_debug(LD_DIR, "anonymized %d, use_begindir %d.", - anonymized_connection, use_begindir); - - log_debug(LD_DIR, "Initiating %s", dir_conn_purpose_to_string(dir_purpose)); - - if (purpose_needs_anonymity(dir_purpose, router_purpose, resource)) { - tor_assert(anonymized_connection || - rend_non_anonymous_mode_enabled(options)); - } - - /* use encrypted begindir connections for everything except relays - * this provides better protection for directory fetches */ - if (!use_begindir && directory_must_use_begindir(options)) { - log_warn(LD_BUG, "Client could not use begindir connection: %s", - begindir_reason ? begindir_reason : "(NULL)"); - return; - } - - /* ensure that we don't make direct connections when a SOCKS server is - * configured. */ - if (!anonymized_connection && !use_begindir && !options->HTTPProxy && - (options->Socks4Proxy || options->Socks5Proxy)) { - log_warn(LD_DIR, "Cannot connect to a directory server through a " - "SOCKS proxy!"); - return; - } - - /* Make sure that the destination addr and port we picked is viable. */ - if (!port || tor_addr_is_null(&addr)) { - static int logged_backtrace = 0; - log_warn(LD_DIR, - "Cannot make an outgoing %sconnection without a remote %sPort.", - use_begindir ? "begindir " : "", - use_begindir ? "OR" : "Dir"); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Address came from"); - logged_backtrace = 1; - } - return; - } - - conn = dir_connection_new(tor_addr_family(&addr)); - - /* set up conn so it's got all the data we need to remember */ - tor_addr_copy(&conn->base_.addr, &addr); - conn->base_.port = port; - conn->base_.address = tor_addr_to_str_dup(&addr); - memcpy(conn->identity_digest, digest, DIGEST_LEN); - - conn->base_.purpose = dir_purpose; - conn->router_purpose = router_purpose; - - /* give it an initial state */ - conn->base_.state = DIR_CONN_STATE_CONNECTING; - - /* decide whether we can learn our IP address from this conn */ - /* XXXX This is a bad name for this field now. */ - conn->dirconn_direct = !anonymized_connection; - - /* copy rendezvous data, if any */ - if (rend_query) { - /* We can't have both v2 and v3+ identifier. */ - tor_assert_nonfatal(!hs_ident); - conn->rend_data = rend_data_dup(rend_query); - } - if (hs_ident) { - /* We can't have both v2 and v3+ identifier. */ - tor_assert_nonfatal(!rend_query); - conn->hs_ident = hs_ident_dir_conn_dup(hs_ident); - } - - if (!anonymized_connection && !use_begindir) { - /* then we want to connect to dirport directly */ - - if (options->HTTPProxy) { - tor_addr_copy(&addr, &options->HTTPProxyAddr); - port = options->HTTPProxyPort; - } - - // In this case we should not have picked a directory guard. - if (BUG(guard_state)) { - entry_guard_cancel(&guard_state); - } - - switch (connection_connect(TO_CONN(conn), conn->base_.address, &addr, - port, &socket_error)) { - case -1: - connection_mark_for_close(TO_CONN(conn)); - return; - case 1: - /* start flushing conn */ - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; - /* fall through */ - case 0: - /* queue the command on the outbuf */ - directory_send_command(conn, 1, request); - connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); - /* writable indicates finish, readable indicates broken link, - error indicates broken link in windowsland. */ - } - } else { - /* We will use a Tor circuit (maybe 1-hop, maybe 3-hop, maybe with - * begindir, maybe not with begindir) */ - - entry_connection_t *linked_conn; - - /* Anonymized tunneled connections can never share a circuit. - * One-hop directory connections can share circuits with each other - * but nothing else. */ - int iso_flags = anonymized_connection ? ISO_STREAM : ISO_SESSIONGRP; - - /* If it's an anonymized connection, remember the fact that we - * wanted it for later: maybe we'll want it again soon. */ - if (anonymized_connection && use_begindir) - rep_hist_note_used_internal(time(NULL), 0, 1); - else if (anonymized_connection && !use_begindir) - rep_hist_note_used_port(time(NULL), conn->base_.port); - - // In this case we should not have a directory guard; we'll - // get a regular guard later when we build the circuit. - if (BUG(anonymized_connection && guard_state)) { - entry_guard_cancel(&guard_state); - } - - conn->guard_state = guard_state; - - /* make an AP connection - * populate it and add it at the right state - * hook up both sides - */ - linked_conn = - connection_ap_make_link(TO_CONN(conn), - conn->base_.address, conn->base_.port, - digest, - SESSION_GROUP_DIRCONN, iso_flags, - use_begindir, !anonymized_connection); - if (!linked_conn) { - log_warn(LD_NET,"Making tunnel to dirserver failed."); - connection_mark_for_close(TO_CONN(conn)); - return; - } - - if (connection_add(TO_CONN(conn)) < 0) { - log_warn(LD_NET,"Unable to add connection for link to dirserver."); - connection_mark_for_close(TO_CONN(conn)); - return; - } - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; - /* queue the command on the outbuf */ - directory_send_command(conn, 0, request); - - connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); - connection_start_reading(ENTRY_TO_CONN(linked_conn)); - } -} - -/** Return true iff anything we say on conn is being encrypted before - * we send it to the client/server. */ -int -connection_dir_is_encrypted(const dir_connection_t *conn) -{ - /* Right now it's sufficient to see if conn is or has been linked, since - * the only thing it could be linked to is an edge connection on a - * circuit, and the only way it could have been unlinked is at the edge - * connection getting closed. - */ - return TO_CONN(conn)->linked; -} - -/** Helper for sorting - * - * sort strings alphabetically - */ -static int -compare_strs_(const void **a, const void **b) -{ - const char *s1 = *a, *s2 = *b; - return strcmp(s1, s2); -} - -#define CONDITIONAL_CONSENSUS_FPR_LEN 3 -#if (CONDITIONAL_CONSENSUS_FPR_LEN > DIGEST_LEN) -#error "conditional consensus fingerprint length is larger than digest length" -#endif - -/** Return the URL we should use for a consensus download. - * - * Use the "conditional consensus downloading" feature described in - * dir-spec.txt, i.e. - * GET .../consensus/fpr+fpr+fpr - * - * If 'resource' is provided, it is the name of a consensus flavor to request. - */ -static char * -directory_get_consensus_url(const char *resource) -{ - char *url = NULL; - const char *hyphen, *flavor; - if (resource==NULL || strcmp(resource, "ns")==0) { - flavor = ""; /* Request ns consensuses as "", so older servers will work*/ - hyphen = ""; - } else { - flavor = resource; - hyphen = "-"; - } - - { - char *authority_id_list; - smartlist_t *authority_digests = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), - dir_server_t *, ds) { - char *hex; - if (!(ds->type & V3_DIRINFO)) - continue; - - hex = tor_malloc(2*CONDITIONAL_CONSENSUS_FPR_LEN+1); - base16_encode(hex, 2*CONDITIONAL_CONSENSUS_FPR_LEN+1, - ds->v3_identity_digest, CONDITIONAL_CONSENSUS_FPR_LEN); - smartlist_add(authority_digests, hex); - } SMARTLIST_FOREACH_END(ds); - smartlist_sort(authority_digests, compare_strs_); - authority_id_list = smartlist_join_strings(authority_digests, - "+", 0, NULL); - - tor_asprintf(&url, "/tor/status-vote/current/consensus%s%s/%s.z", - hyphen, flavor, authority_id_list); - - SMARTLIST_FOREACH(authority_digests, char *, cp, tor_free(cp)); - smartlist_free(authority_digests); - tor_free(authority_id_list); - } - return url; -} - -/** - * Copies the ipv6 from source to destination, subject to buffer size limit - * size. If decorate is true, makes sure the copied address is decorated. - */ -static void -copy_ipv6_address(char* destination, const char* source, size_t len, - int decorate) { - tor_assert(destination); - tor_assert(source); - - if (decorate && source[0] != '[') { - tor_snprintf(destination, len, "[%s]", source); - } else { - strlcpy(destination, source, len); - } -} - -/** Queue an appropriate HTTP command for request on - * conn-\>outbuf. If direct is true, we're making a - * non-anonymized connection to the dirport. - */ -static void -directory_send_command(dir_connection_t *conn, - const int direct, - const directory_request_t *req) -{ - tor_assert(req); - const int purpose = req->dir_purpose; - const char *resource = req->resource; - const char *payload = req->payload; - const size_t payload_len = req->payload_len; - const time_t if_modified_since = req->if_modified_since; - const int anonymized_connection = dirind_is_anon(req->indirection); - - char proxystring[256]; - char hoststring[128]; - /* NEEDS to be the same size hoststring. - Will be decorated with brackets around it if it is ipv6. */ - char decorated_address[128]; - smartlist_t *headers = smartlist_new(); - char *url; - char *accept_encoding; - size_t url_len; - char request[8192]; - size_t request_len, total_request_len = 0; - const char *httpcommand = NULL; - - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - tor_free(conn->requested_resource); - if (resource) - conn->requested_resource = tor_strdup(resource); - - /* decorate the ip address if it is ipv6 */ - if (strchr(conn->base_.address, ':')) { - copy_ipv6_address(decorated_address, conn->base_.address, - sizeof(decorated_address), 1); - } else { - strlcpy(decorated_address, conn->base_.address, sizeof(decorated_address)); - } - - /* come up with a string for which Host: we want */ - if (conn->base_.port == 80) { - strlcpy(hoststring, decorated_address, sizeof(hoststring)); - } else { - tor_snprintf(hoststring, sizeof(hoststring), "%s:%d", - decorated_address, conn->base_.port); - } - - /* Format if-modified-since */ - if (if_modified_since) { - char b[RFC1123_TIME_LEN+1]; - format_rfc1123_time(b, if_modified_since); - smartlist_add_asprintf(headers, "If-Modified-Since: %s\r\n", b); - } - - /* come up with some proxy lines, if we're using one. */ - if (direct && get_options()->HTTPProxy) { - char *base64_authenticator=NULL; - const char *authenticator = get_options()->HTTPProxyAuthenticator; - - tor_snprintf(proxystring, sizeof(proxystring),"http://%s", hoststring); - if (authenticator) { - base64_authenticator = alloc_http_authenticator(authenticator); - if (!base64_authenticator) - log_warn(LD_BUG, "Encoding http authenticator failed"); - } - if (base64_authenticator) { - smartlist_add_asprintf(headers, - "Proxy-Authorization: Basic %s\r\n", - base64_authenticator); - tor_free(base64_authenticator); - } - } else { - proxystring[0] = 0; - } - - if (! anonymized_connection) { - /* Add Accept-Encoding. */ - accept_encoding = accept_encoding_header(); - smartlist_add_asprintf(headers, "Accept-Encoding: %s\r\n", - accept_encoding); - tor_free(accept_encoding); - } - - /* Add additional headers, if any */ - { - config_line_t *h; - for (h = req->additional_headers; h; h = h->next) { - smartlist_add_asprintf(headers, "%s%s\r\n", h->key, h->value); - } - } - - switch (purpose) { - case DIR_PURPOSE_FETCH_CONSENSUS: - /* resource is optional. If present, it's a flavor name */ - tor_assert(!payload); - httpcommand = "GET"; - url = directory_get_consensus_url(resource); - log_info(LD_DIR, "Downloading consensus from %s using %s", - hoststring, url); - break; - case DIR_PURPOSE_FETCH_CERTIFICATE: - tor_assert(resource); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/keys/%s", resource); - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - tor_assert(resource); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/status-vote/next/%s.z", resource); - break; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - tor_assert(!resource); - tor_assert(!payload); - httpcommand = "GET"; - url = tor_strdup("/tor/status-vote/next/consensus-signatures.z"); - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/server/%s", resource); - break; - case DIR_PURPOSE_FETCH_EXTRAINFO: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/extra/%s", resource); - break; - case DIR_PURPOSE_FETCH_MICRODESC: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/micro/%s", resource); - break; - case DIR_PURPOSE_UPLOAD_DIR: { - const char *why = router_get_descriptor_gen_reason(); - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/"); - if (why) { - smartlist_add_asprintf(headers, "X-Desc-Gen-Reason: %s\r\n", why); - } - break; - } - case DIR_PURPOSE_UPLOAD_VOTE: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/post/vote"); - break; - case DIR_PURPOSE_UPLOAD_SIGNATURES: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/post/consensus-signature"); - break; - case DIR_PURPOSE_FETCH_RENDDESC_V2: - tor_assert(resource); - tor_assert(strlen(resource) <= REND_DESC_ID_V2_LEN_BASE32); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/rendezvous2/%s", resource); - break; - case DIR_PURPOSE_FETCH_HSDESC: - tor_assert(resource); - tor_assert(strlen(resource) <= ED25519_BASE64_LEN); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/hs/3/%s", resource); - break; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/rendezvous2/publish"); - break; - case DIR_PURPOSE_UPLOAD_HSDESC: - tor_assert(resource); - tor_assert(payload); - httpcommand = "POST"; - tor_asprintf(&url, "/tor/hs/%s/publish", resource); - break; - default: - tor_assert(0); - return; - } - - /* warn in the non-tunneled case */ - if (direct && (strlen(proxystring) + strlen(url) >= 4096)) { - log_warn(LD_BUG, - "Squid does not like URLs longer than 4095 bytes, and this " - "one is %d bytes long: %s%s", - (int)(strlen(proxystring) + strlen(url)), proxystring, url); - } - - tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring); - - request_len = strlen(request); - total_request_len += request_len; - connection_buf_add(request, request_len, TO_CONN(conn)); - - url_len = strlen(url); - total_request_len += url_len; - connection_buf_add(url, url_len, TO_CONN(conn)); - tor_free(url); - - if (!strcmp(httpcommand, "POST") || payload) { - smartlist_add_asprintf(headers, "Content-Length: %lu\r\n", - payload ? (unsigned long)payload_len : 0); - } - - { - char *header = smartlist_join_strings(headers, "", 0, NULL); - tor_snprintf(request, sizeof(request), " HTTP/1.0\r\nHost: %s\r\n%s\r\n", - hoststring, header); - tor_free(header); - } - - request_len = strlen(request); - total_request_len += request_len; - connection_buf_add(request, request_len, TO_CONN(conn)); - - if (payload) { - /* then send the payload afterwards too */ - connection_buf_add(payload, payload_len, TO_CONN(conn)); - total_request_len += payload_len; - } - - SMARTLIST_FOREACH(headers, char *, h, tor_free(h)); - smartlist_free(headers); - - log_debug(LD_DIR, - "Sent request to directory server '%s:%d': " - "(purpose: %d, request size: " U64_FORMAT ", " - "payload size: " U64_FORMAT ")", - conn->base_.address, conn->base_.port, - conn->base_.purpose, - U64_PRINTF_ARG(total_request_len), - U64_PRINTF_ARG(payload ? payload_len : 0)); -} - -/** Parse an HTTP request string headers of the form - * \verbatim - * "\%s [http[s]://]\%s HTTP/1..." - * \endverbatim - * If it's well-formed, strdup the second \%s into *url, and - * nul-terminate it. If the url doesn't start with "/tor/", rewrite it - * so it does. Return 0. - * Otherwise, return -1. - */ -STATIC int -parse_http_url(const char *headers, char **url) -{ - char *command = NULL; - if (parse_http_command(headers, &command, url) < 0) { - return -1; - } - if (strcmpstart(*url, "/tor/")) { - char *new_url = NULL; - tor_asprintf(&new_url, "/tor%s%s", - *url[0] == '/' ? "" : "/", - *url); - tor_free(*url); - *url = new_url; - } - tor_free(command); - return 0; -} - -/** Parse an HTTP request line at the start of a headers string. On failure, - * return -1. On success, set *command_out to a copy of the HTTP - * command ("get", "post", etc), set *url_out to a copy of the URL, and - * return 0. */ -int -parse_http_command(const char *headers, char **command_out, char **url_out) -{ - const char *command, *end_of_command; - char *s, *start, *tmp; - - s = (char *)eat_whitespace_no_nl(headers); - if (!*s) return -1; - command = s; - s = (char *)find_whitespace(s); /* get past GET/POST */ - if (!*s) return -1; - end_of_command = s; - s = (char *)eat_whitespace_no_nl(s); - if (!*s) return -1; - start = s; /* this is the URL, assuming it's valid */ - s = (char *)find_whitespace(start); - if (!*s) return -1; - - /* tolerate the http[s] proxy style of putting the hostname in the url */ - if (s-start >= 4 && !strcmpstart(start,"http")) { - tmp = start + 4; - if (*tmp == 's') - tmp++; - if (s-tmp >= 3 && !strcmpstart(tmp,"://")) { - tmp = strchr(tmp+3, '/'); - if (tmp && tmp < s) { - log_debug(LD_DIR,"Skipping over 'http[s]://hostname/' string"); - start = tmp; - } - } - } - - /* Check if the header is well formed (next sequence - * should be HTTP/1.X\r\n). Assumes we're supporting 1.0? */ - { - unsigned minor_ver; - char ch; - char *e = (char *)eat_whitespace_no_nl(s); - if (2 != tor_sscanf(e, "HTTP/1.%u%c", &minor_ver, &ch)) { - return -1; - } - if (ch != '\r') - return -1; - } - - *url_out = tor_memdup_nulterm(start, s-start); - *command_out = tor_memdup_nulterm(command, end_of_command - command); - return 0; -} - -/** Return a copy of the first HTTP header in headers whose key is - * which. The key should be given with a terminating colon and space; - * this function copies everything after, up to but not including the - * following \\r\\n. */ -char * -http_get_header(const char *headers, const char *which) -{ - const char *cp = headers; - while (cp) { - if (!strcasecmpstart(cp, which)) { - char *eos; - cp += strlen(which); - if ((eos = strchr(cp,'\r'))) - return tor_strndup(cp, eos-cp); - else - return tor_strdup(cp); - } - cp = strchr(cp, '\n'); - if (cp) - ++cp; - } - return NULL; -} - -/** If headers indicates that a proxy was involved, then rewrite - * conn-\>address to describe our best guess of the address that - * originated this HTTP request. */ -static void -http_set_address_origin(const char *headers, connection_t *conn) -{ - char *fwd; - - fwd = http_get_header(headers, "Forwarded-For: "); - if (!fwd) - fwd = http_get_header(headers, "X-Forwarded-For: "); - if (fwd) { - tor_addr_t toraddr; - if (tor_addr_parse(&toraddr,fwd) == -1 || - tor_addr_is_internal(&toraddr,0)) { - log_debug(LD_DIR, "Ignoring local/internal IP %s", escaped(fwd)); - tor_free(fwd); - return; - } - - tor_free(conn->address); - conn->address = tor_strdup(fwd); - tor_free(fwd); - } -} - -/** Parse an HTTP response string headers of the form - * \verbatim - * "HTTP/1.\%d \%d\%s\r\n...". - * \endverbatim - * - * If it's well-formed, assign the status code to *code and - * return 0. Otherwise, return -1. - * - * On success: If date is provided, set *date to the Date - * header in the http headers, or 0 if no such header is found. If - * compression is provided, set *compression to the - * compression method given in the Content-Encoding header, or 0 if no - * such header is found, or -1 if the value of the header is not - * recognized. If reason is provided, strdup the reason string - * into it. - */ -int -parse_http_response(const char *headers, int *code, time_t *date, - compress_method_t *compression, char **reason) -{ - unsigned n1, n2; - char datestr[RFC1123_TIME_LEN+1]; - smartlist_t *parsed_headers; - tor_assert(headers); - tor_assert(code); - - while (TOR_ISSPACE(*headers)) headers++; /* tolerate leading whitespace */ - - if (tor_sscanf(headers, "HTTP/1.%u %u", &n1, &n2) < 2 || - (n1 != 0 && n1 != 1) || - (n2 < 100 || n2 >= 600)) { - log_warn(LD_HTTP,"Failed to parse header %s",escaped(headers)); - return -1; - } - *code = n2; - - parsed_headers = smartlist_new(); - smartlist_split_string(parsed_headers, headers, "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (reason) { - smartlist_t *status_line_elements = smartlist_new(); - tor_assert(smartlist_len(parsed_headers)); - smartlist_split_string(status_line_elements, - smartlist_get(parsed_headers, 0), - " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); - tor_assert(smartlist_len(status_line_elements) <= 3); - if (smartlist_len(status_line_elements) == 3) { - *reason = smartlist_get(status_line_elements, 2); - smartlist_set(status_line_elements, 2, NULL); /* Prevent free */ - } - SMARTLIST_FOREACH(status_line_elements, char *, cp, tor_free(cp)); - smartlist_free(status_line_elements); - } - if (date) { - *date = 0; - SMARTLIST_FOREACH(parsed_headers, const char *, s, - if (!strcmpstart(s, "Date: ")) { - strlcpy(datestr, s+6, sizeof(datestr)); - /* This will do nothing on failure, so we don't need to check - the result. We shouldn't warn, since there are many other valid - date formats besides the one we use. */ - parse_rfc1123_time(datestr, date); - break; - }); - } - if (compression) { - const char *enc = NULL; - SMARTLIST_FOREACH(parsed_headers, const char *, s, - if (!strcmpstart(s, "Content-Encoding: ")) { - enc = s+18; break; - }); - - if (enc == NULL) - *compression = NO_METHOD; - else { - *compression = compression_method_get_by_name(enc); - - if (*compression == UNKNOWN_METHOD) - log_info(LD_HTTP, "Unrecognized content encoding: %s. Trying to deal.", - escaped(enc)); - } - } - SMARTLIST_FOREACH(parsed_headers, char *, s, tor_free(s)); - smartlist_free(parsed_headers); - - return 0; -} - -/** Return true iff body doesn't start with a plausible router or - * network-status or microdescriptor opening. This is a sign of possible - * compression. */ -static int -body_is_plausible(const char *body, size_t len, int purpose) -{ - int i; - if (len == 0) - return 1; /* empty bodies don't need decompression */ - if (len < 32) - return 0; - if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { - return (!strcmpstart(body,"onion-key")); - } - - if (!strcmpstart(body,"router") || - !strcmpstart(body,"network-status")) - return 1; - for (i=0;i<32;++i) { - if (!TOR_ISPRINT(body[i]) && !TOR_ISSPACE(body[i])) - return 0; - } - - return 1; -} - -/** Called when we've just fetched a bunch of router descriptors in - * body. The list which, if present, holds digests for - * descriptors we requested: descriptor digests if descriptor_digests - * is true, or identity digests otherwise. Parse the descriptors, validate - * them, and annotate them as having purpose purpose and as having been - * downloaded from source. - * - * Return the number of routers actually added. */ -static int -load_downloaded_routers(const char *body, smartlist_t *which, - int descriptor_digests, - int router_purpose, - const char *source) -{ - char buf[256]; - char time_buf[ISO_TIME_LEN+1]; - int added = 0; - int general = router_purpose == ROUTER_PURPOSE_GENERAL; - format_iso_time(time_buf, time(NULL)); - tor_assert(source); - - if (tor_snprintf(buf, sizeof(buf), - "@downloaded-at %s\n" - "@source %s\n" - "%s%s%s", time_buf, escaped(source), - !general ? "@purpose " : "", - !general ? router_purpose_to_string(router_purpose) : "", - !general ? "\n" : "")<0) - return added; - - added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, - descriptor_digests, buf); - if (added && general) - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - return added; -} - -static int handle_response_fetch_certificate(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_fetch_status_vote(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_fetch_detached_signatures(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_fetch_desc(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_upload_dir(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_upload_vote(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_upload_signatures(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_fetch_renddesc_v2(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_upload_renddesc_v2(dir_connection_t *, - const response_handler_args_t *); -static int handle_response_upload_hsdesc(dir_connection_t *, - const response_handler_args_t *); - -static int -dir_client_decompress_response_body(char **bodyp, size_t *bodylenp, - dir_connection_t *conn, - compress_method_t compression, - int anonymized_connection) -{ - int rv = 0; - const char *body = *bodyp; - size_t body_len = *bodylenp; - int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - - int plausible = body_is_plausible(body, body_len, conn->base_.purpose); - - if (plausible && compression == NO_METHOD) { - return 0; - } - - int severity = LOG_DEBUG; - char *new_body = NULL; - size_t new_len = 0; - const char *description1, *description2; - int want_to_try_both = 0; - int tried_both = 0; - compress_method_t guessed = detect_compression_method(body, body_len); - - description1 = compression_method_get_human_name(compression); - - if (BUG(description1 == NULL)) - description1 = compression_method_get_human_name(UNKNOWN_METHOD); - - if (guessed == UNKNOWN_METHOD && !plausible) - description2 = "confusing binary junk"; - else - description2 = compression_method_get_human_name(guessed); - - /* Tell the user if we don't believe what we're told about compression.*/ - want_to_try_both = (compression == UNKNOWN_METHOD || - guessed != compression); - if (want_to_try_both) { - severity = LOG_PROTOCOL_WARN; - } - - tor_log(severity, LD_HTTP, - "HTTP body from server '%s:%d' was labeled as %s, " - "%s it seems to be %s.%s", - conn->base_.address, conn->base_.port, description1, - guessed != compression?"but":"and", - description2, - (compression>0 && guessed>0 && want_to_try_both)? - " Trying both.":""); - - /* Try declared compression first if we can. - * tor_compress_supports_method() also returns true for NO_METHOD. - * Ensure that the server is not sending us data compressed using a - * compression method that is not allowed for anonymous connections. */ - if (anonymized_connection && - ! allowed_anonymous_connection_compression_method(compression)) { - warn_disallowed_anonymous_compression_method(compression); - rv = -1; - goto done; - } - - if (tor_compress_supports_method(compression)) { - tor_uncompress(&new_body, &new_len, body, body_len, compression, - !allow_partial, LOG_PROTOCOL_WARN); - if (new_body) { - /* We succeeded with the declared compression method. Great! */ - rv = 0; - goto done; - } - } - - /* Okay, if that didn't work, and we think that it was compressed - * differently, try that. */ - if (anonymized_connection && - ! allowed_anonymous_connection_compression_method(guessed)) { - warn_disallowed_anonymous_compression_method(guessed); - rv = -1; - goto done; - } - - if (tor_compress_supports_method(guessed) && - compression != guessed) { - tor_uncompress(&new_body, &new_len, body, body_len, guessed, - !allow_partial, LOG_INFO); - tried_both = 1; - } - /* If we're pretty sure that we have a compressed directory, and - * we didn't manage to uncompress it, then warn and bail. */ - if (!plausible && !new_body) { - log_fn(LOG_PROTOCOL_WARN, LD_HTTP, - "Unable to decompress HTTP body (tried %s%s%s, server '%s:%d').", - description1, - tried_both?" and ":"", - tried_both?description2:"", - conn->base_.address, conn->base_.port); - rv = -1; - goto done; - } - - done: - if (new_body) { - if (rv == 0) { - /* success! */ - tor_free(*bodyp); - *bodyp = new_body; - *bodylenp = new_len; - } else { - tor_free(new_body); - } - } - - return rv; -} - -/** We are a client, and we've finished reading the server's - * response. Parse it and act appropriately. - * - * If we're still happy with using this directory server in the future, return - * 0. Otherwise return -1; and the caller should consider trying the request - * again. - * - * The caller will take care of marking the connection for close. - */ -static int -connection_dir_client_reached_eof(dir_connection_t *conn) -{ - char *body = NULL; - char *headers = NULL; - char *reason = NULL; - size_t body_len = 0; - int status_code; - time_t date_header = 0; - long apparent_skew; - compress_method_t compression; - int skewed = 0; - int rv; - int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - size_t received_bytes; - const int anonymized_connection = - purpose_needs_anonymity(conn->base_.purpose, - conn->router_purpose, - conn->requested_resource); - - received_bytes = connection_get_inbuf_len(TO_CONN(conn)); - - switch (connection_fetch_from_buf_http(TO_CONN(conn), - &headers, MAX_HEADERS_SIZE, - &body, &body_len, MAX_DIR_DL_SIZE, - allow_partial)) { - case -1: /* overflow */ - log_warn(LD_PROTOCOL, - "'fetch' response too large (server '%s:%d'). Closing.", - conn->base_.address, conn->base_.port); - return -1; - case 0: - log_info(LD_HTTP, - "'fetch' response not all here, but we're at eof. Closing."); - return -1; - /* case 1, fall through */ - } - - if (parse_http_response(headers, &status_code, &date_header, - &compression, &reason) < 0) { - log_warn(LD_HTTP,"Unparseable headers (server '%s:%d'). Closing.", - conn->base_.address, conn->base_.port); - - rv = -1; - goto done; - } - if (!reason) reason = tor_strdup("[no reason given]"); - - tor_log(LOG_DEBUG, LD_DIR, - "Received response from directory server '%s:%d': %d %s " - "(purpose: %d, response size: " U64_FORMAT -#ifdef MEASUREMENTS_21206 - ", data cells received: %d, data cells sent: %d" -#endif - ", compression: %d)", - conn->base_.address, conn->base_.port, status_code, - escaped(reason), conn->base_.purpose, - U64_PRINTF_ARG(received_bytes), -#ifdef MEASUREMENTS_21206 - conn->data_cells_received, conn->data_cells_sent, -#endif - compression); - - if (conn->guard_state) { - /* we count the connection as successful once we can read from it. We do - * not, however, delay use of the circuit here, since it's just for a - * one-hop directory request. */ - /* XXXXprop271 note that this will not do the right thing for other - * waiting circuits that would be triggered by this circuit becoming - * complete/usable. But that's ok, I think. - */ - entry_guard_succeeded(&conn->guard_state); - circuit_guard_state_free(conn->guard_state); - conn->guard_state = NULL; - } - - /* now check if it's got any hints for us about our IP address. */ - if (conn->dirconn_direct) { - char *guess = http_get_header(headers, X_ADDRESS_HEADER); - if (guess) { - router_new_address_suggestion(guess, conn); - tor_free(guess); - } - } - - if (date_header > 0) { - /* The date header was written very soon after we sent our request, - * so compute the skew as the difference between sending the request - * and the date header. (We used to check now-date_header, but that's - * inaccurate if we spend a lot of time downloading.) - */ - apparent_skew = conn->base_.timestamp_lastwritten - date_header; - if (labs(apparent_skew)>ALLOW_DIRECTORY_TIME_SKEW) { - int trusted = router_digest_is_trusted_dir(conn->identity_digest); - clock_skew_warning(TO_CONN(conn), apparent_skew, trusted, LD_HTTP, - "directory", "DIRSERV"); - skewed = 1; /* don't check the recommended-versions line */ - } else { - log_debug(LD_HTTP, "Time on received directory is within tolerance; " - "we are %ld seconds skewed. (That's okay.)", apparent_skew); - } - } - (void) skewed; /* skewed isn't used yet. */ - - if (status_code == 503) { - routerstatus_t *rs; - dir_server_t *ds; - const char *id_digest = conn->identity_digest; - log_info(LD_DIR,"Received http status code %d (%s) from server " - "'%s:%d'. I'll try again soon.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - time_t now = approx_time(); - if ((rs = router_get_mutable_consensus_status_by_id(id_digest))) - rs->last_dir_503_at = now; - if ((ds = router_get_fallback_dirserver_by_digest(id_digest))) - ds->fake_status.last_dir_503_at = now; - - rv = -1; - goto done; - } - - if (dir_client_decompress_response_body(&body, &body_len, - conn, compression, anonymized_connection) < 0) { - rv = -1; - goto done; - } - - response_handler_args_t args; - memset(&args, 0, sizeof(args)); - args.status_code = status_code; - args.reason = reason; - args.body = body; - args.body_len = body_len; - args.headers = headers; - - switch (conn->base_.purpose) { - case DIR_PURPOSE_FETCH_CONSENSUS: - rv = handle_response_fetch_consensus(conn, &args); - break; - case DIR_PURPOSE_FETCH_CERTIFICATE: - rv = handle_response_fetch_certificate(conn, &args); - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - rv = handle_response_fetch_status_vote(conn, &args); - break; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - rv = handle_response_fetch_detached_signatures(conn, &args); - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - case DIR_PURPOSE_FETCH_EXTRAINFO: - rv = handle_response_fetch_desc(conn, &args); - break; - case DIR_PURPOSE_FETCH_MICRODESC: - rv = handle_response_fetch_microdesc(conn, &args); - break; - case DIR_PURPOSE_FETCH_RENDDESC_V2: - rv = handle_response_fetch_renddesc_v2(conn, &args); - break; - case DIR_PURPOSE_UPLOAD_DIR: - rv = handle_response_upload_dir(conn, &args); - break; - case DIR_PURPOSE_UPLOAD_SIGNATURES: - rv = handle_response_upload_signatures(conn, &args); - break; - case DIR_PURPOSE_UPLOAD_VOTE: - rv = handle_response_upload_vote(conn, &args); - break; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - rv = handle_response_upload_renddesc_v2(conn, &args); - break; - case DIR_PURPOSE_UPLOAD_HSDESC: - rv = handle_response_upload_hsdesc(conn, &args); - break; - case DIR_PURPOSE_FETCH_HSDESC: - rv = handle_response_fetch_hsdesc_v3(conn, &args); - break; - default: - tor_assert_nonfatal_unreached(); - rv = -1; - break; - } - - done: - tor_free(body); - tor_free(headers); - tor_free(reason); - return rv; -} - -/** - * Handler function: processes a response to a request for a networkstatus - * consensus document by checking the consensus, storing it, and marking - * router requests as reachable. - **/ -STATIC int -handle_response_fetch_consensus(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS); - const int status_code = args->status_code; - const char *body = args->body; - const size_t body_len = args->body_len; - const char *reason = args->reason; - const time_t now = approx_time(); - - const char *consensus; - char *new_consensus = NULL; - const char *sourcename; - - int r; - const char *flavname = conn->requested_resource; - if (status_code != 200) { - int severity = (status_code == 304) ? LOG_INFO : LOG_WARN; - tor_log(severity, LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching consensus directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - networkstatus_consensus_download_failed(status_code, flavname); - return -1; - } - - if (looks_like_a_consensus_diff(body, body_len)) { - /* First find our previous consensus. Maybe it's in ram, maybe not. */ - cached_dir_t *cd = dirserv_get_consensus(flavname); - const char *consensus_body; - char *owned_consensus = NULL; - if (cd) { - consensus_body = cd->dir; - } else { - owned_consensus = networkstatus_read_cached_consensus(flavname); - consensus_body = owned_consensus; - } - if (!consensus_body) { - log_warn(LD_DIR, "Received a consensus diff, but we can't find " - "any %s-flavored consensus in our current cache.",flavname); - networkstatus_consensus_download_failed(0, flavname); - // XXXX if this happens too much, see below - return -1; - } - - new_consensus = consensus_diff_apply(consensus_body, body); - tor_free(owned_consensus); - if (new_consensus == NULL) { - log_warn(LD_DIR, "Could not apply consensus diff received from server " - "'%s:%d'", conn->base_.address, conn->base_.port); - // XXXX If this happens too many times, we should maybe not use - // XXXX this directory for diffs any more? - networkstatus_consensus_download_failed(0, flavname); - return -1; - } - log_info(LD_DIR, "Applied consensus diff (size %d) from server " - "'%s:%d', resulting in a new consensus document (size %d).", - (int)body_len, conn->base_.address, conn->base_.port, - (int)strlen(new_consensus)); - consensus = new_consensus; - sourcename = "generated based on a diff"; - } else { - log_info(LD_DIR,"Received consensus directory (body size %d) from server " - "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); - consensus = body; - sourcename = "downloaded"; - } - - if ((r=networkstatus_set_current_consensus(consensus, flavname, 0, - conn->identity_digest))<0) { - log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, - "Unable to load %s consensus directory %s from " - "server '%s:%d'. I'll try again soon.", - flavname, sourcename, conn->base_.address, conn->base_.port); - networkstatus_consensus_download_failed(0, flavname); - tor_free(new_consensus); - return -1; - } - - /* If we launched other fetches for this consensus, cancel them. */ - connection_dir_close_consensus_fetches(conn, flavname); - - /* update the list of routers and directory guards */ - routers_update_all_from_networkstatus(now, 3); - update_microdescs_from_networkstatus(now); - directory_info_has_arrived(now, 0, 0); - - if (authdir_mode_v3(get_options())) { - sr_act_post_consensus( - networkstatus_get_latest_consensus_by_flavor(FLAV_NS)); - } - log_info(LD_DIR, "Successfully loaded consensus."); - - tor_free(new_consensus); - return 0; -} - -/** - * Handler function: processes a response to a request for one or more - * authority certificates - **/ -static int -handle_response_fetch_certificate(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/keys/%s\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - connection_dir_download_cert_failed(conn, status_code); - return -1; - } - log_info(LD_DIR,"Received authority certificates (body size %d) from " - "server '%s:%d'", - (int)body_len, conn->base_.address, conn->base_.port); - - /* - * Tell trusted_dirs_load_certs_from_string() whether it was by fp - * or fp-sk pair. - */ - int src_code = -1; - if (!strcmpstart(conn->requested_resource, "fp/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST; - } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST; - } - - if (src_code != -1) { - if (trusted_dirs_load_certs_from_string(body, src_code, 1, - conn->identity_digest)<0) { - log_warn(LD_DIR, "Unable to parse fetched certificates"); - /* if we fetched more than one and only some failed, the successful - * ones got flushed to disk so it's safe to call this on them */ - connection_dir_download_cert_failed(conn, status_code); - } else { - time_t now = approx_time(); - directory_info_has_arrived(now, 0, 0); - log_info(LD_DIR, "Successfully loaded certificates from fetch."); - } - } else { - log_warn(LD_DIR, - "Couldn't figure out what to do with fetched certificates for " - "unknown resource %s", - conn->requested_resource); - connection_dir_download_cert_failed(conn, status_code); - } - return 0; -} - -/** - * Handler function: processes a response to a request for an authority's - * current networkstatus vote. - **/ -static int -handle_response_fetch_status_vote(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - const char *msg; - int st; - log_info(LD_DIR,"Got votes (body size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/status-vote/next/%s.z\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - return -1; - } - dirvote_add_vote(body, &msg, &st); - if (st > 299) { - log_warn(LD_DIR, "Error adding retrieved vote: %s", msg); - } else { - log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg); - } - - return 0; -} - -/** - * Handler function: processes a response to a request for the signatures - * that an authority knows about on a given consensus. - **/ -static int -handle_response_fetch_detached_signatures(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - const char *msg = NULL; - log_info(LD_DIR,"Got detached signatures (body size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server '%s:%d' while fetching " - "\"/tor/status-vote/next/consensus-signatures.z\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - return -1; - } - if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) { - log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s", - conn->base_.address, conn->base_.port, msg?msg:"???"); - } - - return 0; -} - -/** - * Handler function: processes a response to a request for a group of server - * descriptors or an extrainfo documents. - **/ -static int -handle_response_fetch_desc(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO; - smartlist_t *which = NULL; - int n_asked_for = 0; - int descriptor_digests = conn->requested_resource && - !strcmpstart(conn->requested_resource,"d/"); - log_info(LD_DIR,"Received %s (body size %d) from server '%s:%d'", - was_ei ? "extra server info" : "server info", - (int)body_len, conn->base_.address, conn->base_.port); - if (conn->requested_resource && - (!strcmpstart(conn->requested_resource,"d/") || - !strcmpstart(conn->requested_resource,"fp/"))) { - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource + - (descriptor_digests ? 2 : 3), - which, NULL, 0); - n_asked_for = smartlist_len(which); - } - if (status_code != 200) { - int dir_okay = status_code == 404 || - (status_code == 400 && !strcmp(reason, "Servers unavailable.")); - /* 404 means that it didn't have them; no big deal. - * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */ - log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR, - "Received http status code %d (%s) from server '%s:%d' " - "while fetching \"/tor/server/%s\". I'll try again soon.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - if (!which) { - connection_dir_download_routerdesc_failed(conn); - } else { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - return dir_okay ? 0 : -1; - } - /* Learn the routers, assuming we requested by fingerprint or "all" - * or "authority". - * - * We use "authority" to fetch our own descriptor for - * testing, and to fetch bridge descriptors for bootstrapping. Ignore - * the output of "authority" requests unless we are using bridges, - * since otherwise they'll be the response from reachability tests, - * and we don't really want to add that to our routerlist. */ - if (which || (conn->requested_resource && - (!strcmpstart(conn->requested_resource, "all") || - (!strcmpstart(conn->requested_resource, "authority") && - get_options()->UseBridges)))) { - /* as we learn from them, we remove them from 'which' */ - if (was_ei) { - router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which, - descriptor_digests); - } else { - //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, - // descriptor_digests, conn->router_purpose); - if (load_downloaded_routers(body, which, descriptor_digests, - conn->router_purpose, - conn->base_.address)) { - time_t now = approx_time(); - directory_info_has_arrived(now, 0, 1); - } - } - } - if (which) { /* mark remaining ones as failed */ - log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", - n_asked_for-smartlist_len(which), n_asked_for, - was_ei ? "extra-info documents" : "router descriptors", - conn->base_.address, (int)conn->base_.port); - if (smartlist_len(which)) { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - } - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - if (directory_conn_is_self_reachability_test(conn)) - router_dirport_found_reachable(); - - return 0; -} - -/** - * Handler function: processes a response to a request for a group of - * microdescriptors - **/ -STATIC int -handle_response_fetch_microdesc(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - smartlist_t *which = NULL; - log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " - "body size %d) from server '%s:%d'", - status_code, (int)body_len, conn->base_.address, - conn->base_.port); - tor_assert(conn->requested_resource && - !strcmpstart(conn->requested_resource, "d/")); - tor_assert_nonfatal(!tor_mem_is_zero(conn->identity_digest, DIGEST_LEN)); - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource+2, - which, NULL, - DSR_DIGEST256|DSR_BASE64); - if (status_code != 200) { - log_info(LD_DIR, "Received status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again " - "soon.", - status_code, escaped(reason), conn->base_.address, - (int)conn->base_.port, conn->requested_resource); - dir_microdesc_download_failed(which, status_code, conn->identity_digest); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - return 0; - } else { - smartlist_t *mds; - time_t now = approx_time(); - mds = microdescs_add_to_cache(get_microdesc_cache(), - body, body+body_len, SAVED_NOWHERE, 0, - now, which); - if (smartlist_len(which)) { - /* Mark remaining ones as failed. */ - dir_microdesc_download_failed(which, status_code, conn->identity_digest); - } - if (mds && smartlist_len(mds)) { - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - directory_info_has_arrived(now, 0, 1); - } - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - smartlist_free(mds); - } - - return 0; -} - -/** - * Handler function: processes a response to a POST request to upload our - * router descriptor. - **/ -static int -handle_response_upload_dir(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *headers = args->headers; - - switch (status_code) { - case 200: { - dir_server_t *ds = - router_get_trusteddirserver_by_digest(conn->identity_digest); - char *rejected_hdr = http_get_header(headers, - "X-Descriptor-Not-New: "); - if (rejected_hdr) { - if (!strcmp(rejected_hdr, "Yes")) { - log_info(LD_GENERAL, - "Authority '%s' declined our descriptor (not new)", - ds->nickname); - /* XXXX use this information; be sure to upload next one - * sooner. -NM */ - /* XXXX++ On further thought, the task above implies that we're - * basing our regenerate-descriptor time on when we uploaded the - * last descriptor, not on the published time of the last - * descriptor. If those are different, that's a bad thing to - * do. -NM */ - } - tor_free(rejected_hdr); - } - log_info(LD_GENERAL,"eof (status 200) after uploading server " - "descriptor: finished."); - control_event_server_status( - LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d", - conn->base_.address, conn->base_.port); - - ds->has_accepted_serverdesc = 1; - if (directories_have_accepted_server_descriptor()) - control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR"); - } - break; - case 400: - log_warn(LD_GENERAL,"http status 400 (%s) response from " - "dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - control_event_server_status(LOG_WARN, - "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"", - conn->base_.address, conn->base_.port, escaped(reason)); - break; - default: - log_warn(LD_GENERAL, - "HTTP status %d (%s) was unexpected while uploading " - "descriptor to server '%s:%d'. Possibly the server is " - "misconfigured?", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - - return 0; -} - -/** - * Handler function: processes a response to POST request to upload our - * own networkstatus vote. - **/ -static int -handle_response_upload_vote(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE); - const int status_code = args->status_code; - const char *reason = args->reason; - - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "vote to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, - "HTTP status %d (%s) was unexpected while uploading " - "vote to server '%s:%d'.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - return 0; -} - -/** - * Handler function: processes a response to POST request to upload our - * view of the signatures on the current consensus. - **/ -static int -handle_response_upload_signatures(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES); - const int status_code = args->status_code; - const char *reason = args->reason; - - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "signatures to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, - "HTTP status %d (%s) was unexpected while uploading " - "signatures to server '%s:%d'.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - - return 0; -} - -/** - * Handler function: processes a response to a request for a v3 hidden service - * descriptor. - **/ -STATIC int -handle_response_fetch_hsdesc_v3(dir_connection_t *conn, - const response_handler_args_t *args) -{ - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - - tor_assert(conn->hs_ident); - - log_info(LD_REND,"Received v3 hsdesc (body size %d, status %d (%s))", - (int)body_len, status_code, escaped(reason)); - - switch (status_code) { - case 200: - /* We got something: Try storing it in the cache. */ - if (hs_cache_store_as_client(body, &conn->hs_ident->identity_pk) < 0) { - log_warn(LD_REND, "Failed to store hidden service descriptor"); - /* Fire control port FAILED event. */ - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "BAD_DESC"); - hs_control_desc_event_content(conn->hs_ident, conn->identity_digest, - NULL); - } else { - log_info(LD_REND, "Stored hidden service descriptor successfully."); - TO_CONN(conn)->purpose = DIR_PURPOSE_HAS_FETCHED_HSDESC; - hs_client_desc_has_arrived(conn->hs_ident); - /* Fire control port RECEIVED event. */ - hs_control_desc_event_received(conn->hs_ident, conn->identity_digest); - hs_control_desc_event_content(conn->hs_ident, conn->identity_digest, - body); - } - break; - case 404: - /* Not there. We'll retry when connection_about_to_close_connection() - * tries to clean this conn up. */ - log_info(LD_REND, "Fetching hidden service v3 descriptor not found: " - "Retrying at another directory."); - /* Fire control port FAILED event. */ - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "NOT_FOUND"); - hs_control_desc_event_content(conn->hs_ident, conn->identity_digest, - NULL); - break; - case 400: - log_warn(LD_REND, "Fetching v3 hidden service descriptor failed: " - "http status 400 (%s). Dirserver didn't like our " - "query? Retrying at another directory.", - escaped(reason)); - /* Fire control port FAILED event. */ - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "QUERY_REJECTED"); - hs_control_desc_event_content(conn->hs_ident, conn->identity_digest, - NULL); - break; - default: - log_warn(LD_REND, "Fetching v3 hidden service descriptor failed: " - "http status %d (%s) response unexpected from HSDir server " - "'%s:%d'. Retrying at another directory.", - status_code, escaped(reason), TO_CONN(conn)->address, - TO_CONN(conn)->port); - /* Fire control port FAILED event. */ - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "UNEXPECTED"); - hs_control_desc_event_content(conn->hs_ident, conn->identity_digest, - NULL); - break; - } - - return 0; -} - -/** - * Handler function: processes a response to a request for a v2 hidden service - * descriptor. - **/ -static int -handle_response_fetch_renddesc_v2(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2); - const int status_code = args->status_code; - const char *reason = args->reason; - const char *body = args->body; - const size_t body_len = args->body_len; - -#define SEND_HS_DESC_FAILED_EVENT(reason) \ - (control_event_hsv2_descriptor_failed(conn->rend_data, \ - conn->identity_digest, \ - reason)) -#define SEND_HS_DESC_FAILED_CONTENT() \ - (control_event_hs_descriptor_content( \ - rend_data_get_address(conn->rend_data), \ - conn->requested_resource, \ - conn->identity_digest, \ - NULL)) - - tor_assert(conn->rend_data); - log_info(LD_REND,"Received rendezvous descriptor (body size %d, status %d " - "(%s))", - (int)body_len, status_code, escaped(reason)); - switch (status_code) { - case 200: - { - rend_cache_entry_t *entry = NULL; - - if (rend_cache_store_v2_desc_as_client(body, - conn->requested_resource, - conn->rend_data, &entry) < 0) { - log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " - "Retrying at another directory."); - /* We'll retry when connection_about_to_close_connection() - * cleans this dir conn up. */ - SEND_HS_DESC_FAILED_EVENT("BAD_DESC"); - SEND_HS_DESC_FAILED_CONTENT(); - } else { - char service_id[REND_SERVICE_ID_LEN_BASE32 + 1]; - /* Should never be NULL here if we found the descriptor. */ - tor_assert(entry); - rend_get_service_id(entry->parsed->pk, service_id); - - /* success. notify pending connections about this. */ - log_info(LD_REND, "Successfully fetched v2 rendezvous " - "descriptor."); - control_event_hsv2_descriptor_received(service_id, - conn->rend_data, - conn->identity_digest); - control_event_hs_descriptor_content(service_id, - conn->requested_resource, - conn->identity_digest, - body); - conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2; - rend_client_desc_trynow(service_id); - memwipe(service_id, 0, sizeof(service_id)); - } - break; - } - case 404: - /* Not there. We'll retry when - * connection_about_to_close_connection() cleans this conn up. */ - log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " - "Retrying at another directory."); - SEND_HS_DESC_FAILED_EVENT("NOT_FOUND"); - SEND_HS_DESC_FAILED_CONTENT(); - break; - case 400: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status 400 (%s). Dirserver didn't like our " - "v2 rendezvous query? Retrying at another directory.", - escaped(reason)); - SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED"); - SEND_HS_DESC_FAILED_CONTENT(); - break; - default: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status %d (%s) response unexpected while " - "fetching v2 hidden service descriptor (server '%s:%d'). " - "Retrying at another directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - SEND_HS_DESC_FAILED_EVENT("UNEXPECTED"); - SEND_HS_DESC_FAILED_CONTENT(); - break; - } - - return 0; -} - -/** - * Handler function: processes a response to a POST request to upload a v2 - * hidden service descriptor. - **/ -static int -handle_response_upload_renddesc_v2(dir_connection_t *conn, - const response_handler_args_t *args) -{ - tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); - const int status_code = args->status_code; - const char *reason = args->reason; - -#define SEND_HS_DESC_UPLOAD_FAILED_EVENT(reason) \ - (control_event_hs_descriptor_upload_failed( \ - conn->identity_digest, \ - rend_data_get_address(conn->rend_data), \ - reason)) - - log_info(LD_REND,"Uploaded rendezvous descriptor (status %d " - "(%s))", - status_code, escaped(reason)); - /* Without the rend data, we'll have a problem identifying what has been - * uploaded for which service. */ - tor_assert(conn->rend_data); - switch (status_code) { - case 200: - log_info(LD_REND, - "Uploading rendezvous descriptor: finished with status " - "200 (%s)", escaped(reason)); - control_event_hs_descriptor_uploaded(conn->identity_digest, - rend_data_get_address(conn->rend_data)); - rend_service_desc_has_uploaded(conn->rend_data); - break; - case 400: - log_warn(LD_REND,"http status 400 (%s) response from dirserver " - "'%s:%d'. Malformed rendezvous descriptor?", - escaped(reason), conn->base_.address, conn->base_.port); - SEND_HS_DESC_UPLOAD_FAILED_EVENT("UPLOAD_REJECTED"); - break; - default: - log_warn(LD_REND,"http status %d (%s) response unexpected (server " - "'%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - SEND_HS_DESC_UPLOAD_FAILED_EVENT("UNEXPECTED"); - break; - } - - return 0; -} - -/** - * Handler function: processes a response to a POST request to upload an - * hidden service descriptor. - **/ -static int -handle_response_upload_hsdesc(dir_connection_t *conn, - const response_handler_args_t *args) -{ - const int status_code = args->status_code; - const char *reason = args->reason; - - tor_assert(conn); - tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_HSDESC); - - log_info(LD_REND, "Uploaded hidden service descriptor (status %d " - "(%s))", - status_code, escaped(reason)); - /* For this directory response, it MUST have an hidden service identifier on - * this connection. */ - tor_assert(conn->hs_ident); - switch (status_code) { - case 200: - log_info(LD_REND, "Uploading hidden service descriptor: " - "finished with status 200 (%s)", escaped(reason)); - hs_control_desc_event_uploaded(conn->hs_ident, conn->identity_digest); - break; - case 400: - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Uploading hidden service descriptor: http " - "status 400 (%s) response from dirserver " - "'%s:%d'. Malformed hidden service descriptor?", - escaped(reason), conn->base_.address, conn->base_.port); - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "UPLOAD_REJECTED"); - break; - default: - log_warn(LD_REND, "Uploading hidden service descriptor: http " - "status %d (%s) response unexpected (server " - "'%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - hs_control_desc_event_failed(conn->hs_ident, conn->identity_digest, - "UNEXPECTED"); - break; - } - - return 0; -} - -/** Called when a directory connection reaches EOF. */ -int -connection_dir_reached_eof(dir_connection_t *conn) -{ - int retval; - if (conn->base_.state != DIR_CONN_STATE_CLIENT_READING) { - log_info(LD_HTTP,"conn reached eof, not reading. [state=%d] Closing.", - conn->base_.state); - connection_close_immediate(TO_CONN(conn)); /* error: give up on flushing */ - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - retval = connection_dir_client_reached_eof(conn); - if (retval == 0) /* success */ - conn->base_.state = DIR_CONN_STATE_CLIENT_FINISHED; - connection_mark_for_close(TO_CONN(conn)); - return retval; -} - -/** If any directory object is arriving, and it's over 10MB large, we're - * getting DoS'd. (As of 0.1.2.x, raw directories are about 1MB, and we never - * ask for more than 96 router descriptors at a time.) - */ -#define MAX_DIRECTORY_OBJECT_SIZE (10*(1<<20)) - -#define MAX_VOTE_DL_SIZE (MAX_DIRECTORY_OBJECT_SIZE * 5) - -/** Read handler for directory connections. (That's connections to - * directory servers and connections at directory servers.) - */ -int -connection_dir_process_inbuf(dir_connection_t *conn) -{ - size_t max_size; - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - /* Directory clients write, then read data until they receive EOF; - * directory servers read data until they get an HTTP command, then - * write their response (when it's finished flushing, they mark for - * close). - */ - - /* If we're on the dirserver side, look for a command. */ - if (conn->base_.state == DIR_CONN_STATE_SERVER_COMMAND_WAIT) { - if (directory_handle_command(conn) < 0) { - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - return 0; - } - - max_size = - (TO_CONN(conn)->purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) ? - MAX_VOTE_DL_SIZE : MAX_DIRECTORY_OBJECT_SIZE; - - if (connection_get_inbuf_len(TO_CONN(conn)) > max_size) { - log_warn(LD_HTTP, - "Too much data received from directory connection (%s): " - "denial of service attempt, or you need to upgrade?", - conn->base_.address); - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - if (!conn->base_.inbuf_reached_eof) - log_debug(LD_HTTP,"Got data, not eof. Leaving on inbuf."); - return 0; -} - -/** We are closing a dir connection: If dir_conn is a dir connection - * that tried to fetch an HS descriptor, check if it successfuly fetched it, - * or if we need to try again. */ -static void -refetch_hsdesc_if_needed(dir_connection_t *dir_conn) -{ - connection_t *conn = TO_CONN(dir_conn); - - /* If we were trying to fetch a v2 rend desc and did not succeed, retry as - * needed. (If a fetch is successful, the connection state is changed to - * DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 or DIR_PURPOSE_HAS_FETCHED_HSDESC to - * mark that refetching is unnecessary.) */ - if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 && - dir_conn->rend_data && - rend_valid_v2_service_id( - rend_data_get_address(dir_conn->rend_data))) { - rend_client_refetch_v2_renddesc(dir_conn->rend_data); - } - - /* Check for v3 rend desc fetch */ - if (conn->purpose == DIR_PURPOSE_FETCH_HSDESC && - dir_conn->hs_ident && - !ed25519_public_key_is_zero(&dir_conn->hs_ident->identity_pk)) { - hs_client_refetch_hsdesc(&dir_conn->hs_ident->identity_pk); - } -} - -/** Called when we're about to finally unlink and free a directory connection: - * perform necessary accounting and cleanup */ -void -connection_dir_about_to_close(dir_connection_t *dir_conn) -{ - connection_t *conn = TO_CONN(dir_conn); - - if (conn->state < DIR_CONN_STATE_CLIENT_FINISHED) { - /* It's a directory connection and connecting or fetching - * failed: forget about this router, and maybe try again. */ - connection_dir_request_failed(dir_conn); - } - - refetch_hsdesc_if_needed(dir_conn); -} - -/** Create an http response for the client conn out of - * status and reason_phrase. Write it to conn. - */ -static void -write_short_http_response(dir_connection_t *conn, int status, - const char *reason_phrase) -{ - char *buf = NULL; - char *datestring = NULL; - - IF_BUG_ONCE(!reason_phrase) { /* bullet-proofing */ - reason_phrase = "unspecified"; - } - - if (server_mode(get_options())) { - /* include the Date: header, but only if we're a relay or bridge */ - char datebuf[RFC1123_TIME_LEN+1]; - format_rfc1123_time(datebuf, time(NULL)); - tor_asprintf(&datestring, "Date: %s\r\n", datebuf); - } - - tor_asprintf(&buf, "HTTP/1.0 %d %s\r\n%s\r\n", - status, reason_phrase, datestring?datestring:""); - - log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase); - connection_buf_add(buf, strlen(buf), TO_CONN(conn)); - - tor_free(datestring); - tor_free(buf); -} - -/** Write the header for an HTTP/1.0 response onto conn-\>outbuf, - * with type as the Content-Type. - * - * If length is nonnegative, it is the Content-Length. - * If encoding is provided, it is the Content-Encoding. - * If cache_lifetime is greater than 0, the content may be cached for - * up to cache_lifetime seconds. Otherwise, the content may not be cached. */ -static void -write_http_response_header_impl(dir_connection_t *conn, ssize_t length, - const char *type, const char *encoding, - const char *extra_headers, - long cache_lifetime) -{ - char date[RFC1123_TIME_LEN+1]; - time_t now = time(NULL); - buf_t *buf = buf_new_with_capacity(1024); - - tor_assert(conn); - - format_rfc1123_time(date, now); - - buf_add_printf(buf, "HTTP/1.0 200 OK\r\nDate: %s\r\n", date); - if (type) { - buf_add_printf(buf, "Content-Type: %s\r\n", type); - } - if (!is_local_addr(&conn->base_.addr)) { - /* Don't report the source address for a nearby/private connection. - * Otherwise we tend to mis-report in cases where incoming ports are - * being forwarded to a Tor server running behind the firewall. */ - buf_add_printf(buf, X_ADDRESS_HEADER "%s\r\n", conn->base_.address); - } - if (encoding) { - buf_add_printf(buf, "Content-Encoding: %s\r\n", encoding); - } - if (length >= 0) { - buf_add_printf(buf, "Content-Length: %ld\r\n", (long)length); - } - if (cache_lifetime > 0) { - char expbuf[RFC1123_TIME_LEN+1]; - format_rfc1123_time(expbuf, (time_t)(now + cache_lifetime)); - /* We could say 'Cache-control: max-age=%d' here if we start doing - * http/1.1 */ - buf_add_printf(buf, "Expires: %s\r\n", expbuf); - } else if (cache_lifetime == 0) { - /* We could say 'Cache-control: no-cache' here if we start doing - * http/1.1 */ - buf_add_string(buf, "Pragma: no-cache\r\n"); - } - if (extra_headers) { - buf_add_string(buf, extra_headers); - } - buf_add_string(buf, "\r\n"); - - connection_buf_add_buf(TO_CONN(conn), buf); - buf_free(buf); -} - -/** As write_http_response_header_impl, but sets encoding and content-typed - * based on whether the response will be compressed or not. */ -static void -write_http_response_headers(dir_connection_t *conn, ssize_t length, - compress_method_t method, - const char *extra_headers, long cache_lifetime) -{ - const char *methodname = compression_method_get_name(method); - const char *doctype; - if (method == NO_METHOD) - doctype = "text/plain"; - else - doctype = "application/octet-stream"; - write_http_response_header_impl(conn, length, - doctype, - methodname, - extra_headers, - cache_lifetime); -} - -/** As write_http_response_headers, but assumes extra_headers is NULL */ -static void -write_http_response_header(dir_connection_t *conn, ssize_t length, - compress_method_t method, - long cache_lifetime) -{ - write_http_response_headers(conn, length, method, NULL, cache_lifetime); -} - -/** Array of compression methods to use (if supported) for serving - * precompressed data, ordered from best to worst. */ -static compress_method_t srv_meth_pref_precompressed[] = { - LZMA_METHOD, - ZSTD_METHOD, - ZLIB_METHOD, - GZIP_METHOD, - NO_METHOD -}; - -/** Array of compression methods to use (if supported) for serving - * streamed data, ordered from best to worst. */ -static compress_method_t srv_meth_pref_streaming_compression[] = { - ZSTD_METHOD, - ZLIB_METHOD, - GZIP_METHOD, - NO_METHOD -}; - -/** Array of allowed compression methods to use (if supported) when receiving a - * response from a request that was required to be anonymous. */ -static compress_method_t client_meth_allowed_anonymous_compression[] = { - ZLIB_METHOD, - GZIP_METHOD, - NO_METHOD -}; - -/** Parse the compression methods listed in an Accept-Encoding header h, - * and convert them to a bitfield where compression method x is supported if - * and only if 1 << x is set in the bitfield. */ -STATIC unsigned -parse_accept_encoding_header(const char *h) -{ - unsigned result = (1u << NO_METHOD); - smartlist_t *methods = smartlist_new(); - smartlist_split_string(methods, h, ",", - SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE|SPLIT_IGNORE_BLANK, 0); - - SMARTLIST_FOREACH_BEGIN(methods, const char *, m) { - compress_method_t method = compression_method_get_by_name(m); - if (method != UNKNOWN_METHOD) { - tor_assert(((unsigned)method) < 8*sizeof(unsigned)); - result |= (1u << method); - } - } SMARTLIST_FOREACH_END(m); - SMARTLIST_FOREACH_BEGIN(methods, char *, m) { - tor_free(m); - } SMARTLIST_FOREACH_END(m); - smartlist_free(methods); - return result; -} - -/** Array of compression methods to use (if supported) for requesting - * compressed data, ordered from best to worst. */ -static compress_method_t client_meth_pref[] = { - LZMA_METHOD, - ZSTD_METHOD, - ZLIB_METHOD, - GZIP_METHOD, - NO_METHOD -}; - -/** Return a newly allocated string containing a comma separated list of - * supported encodings. */ -STATIC char * -accept_encoding_header(void) -{ - smartlist_t *methods = smartlist_new(); - char *header = NULL; - compress_method_t method; - unsigned i; - - for (i = 0; i < ARRAY_LENGTH(client_meth_pref); ++i) { - method = client_meth_pref[i]; - if (tor_compress_supports_method(method)) - smartlist_add(methods, (char *)compression_method_get_name(method)); - } - - header = smartlist_join_strings(methods, ", ", 0, NULL); - smartlist_free(methods); - - return header; -} - -/** Decide whether a client would accept the consensus we have. - * - * Clients can say they only want a consensus if it's signed by more - * than half the authorities in a list. They pass this list in - * the url as "...consensus/fpr+fpr+fpr". - * - * fpr may be an abbreviated fingerprint, i.e. only a left substring - * of the full authority identity digest. (Only strings of even length, - * i.e. encodings of full bytes, are handled correctly. In the case - * of an odd number of hex digits the last one is silently ignored.) - * - * Returns 1 if more than half of the requested authorities signed the - * consensus, 0 otherwise. - */ -int -client_likes_consensus(const struct consensus_cache_entry_t *ent, - const char *want_url) -{ - smartlist_t *voters = smartlist_new(); - int need_at_least; - int have = 0; - - if (consensus_cache_entry_get_voter_id_digests(ent, voters) != 0) { - return 1; // We don't know the voters; assume the client won't mind. */ - } - - smartlist_t *want_authorities = smartlist_new(); - dir_split_resource_into_fingerprints(want_url, want_authorities, NULL, 0); - need_at_least = smartlist_len(want_authorities)/2+1; - - SMARTLIST_FOREACH_BEGIN(want_authorities, const char *, want_digest) { - - SMARTLIST_FOREACH_BEGIN(voters, const char *, digest) { - if (!strcasecmpstart(digest, want_digest)) { - have++; - break; - }; - } SMARTLIST_FOREACH_END(digest); - - /* early exit, if we already have enough */ - if (have >= need_at_least) - break; - } SMARTLIST_FOREACH_END(want_digest); - - SMARTLIST_FOREACH(want_authorities, char *, d, tor_free(d)); - smartlist_free(want_authorities); - SMARTLIST_FOREACH(voters, char *, cp, tor_free(cp)); - smartlist_free(voters); - return (have >= need_at_least); -} - -/** Return the compression level we should use for sending a compressed - * response of size n_bytes. */ -STATIC compression_level_t -choose_compression_level(ssize_t n_bytes) -{ - if (! have_been_under_memory_pressure()) { - return HIGH_COMPRESSION; /* we have plenty of RAM. */ - } else if (n_bytes < 0) { - return HIGH_COMPRESSION; /* unknown; might be big. */ - } else if (n_bytes < 1024) { - return LOW_COMPRESSION; - } else if (n_bytes < 2048) { - return MEDIUM_COMPRESSION; - } else { - return HIGH_COMPRESSION; - } -} - -/** Information passed to handle a GET request. */ -typedef struct get_handler_args_t { - /** Bitmask of compression methods that the client said (or implied) it - * supported. */ - unsigned compression_supported; - /** If nonzero, the time included an if-modified-since header with this - * value. */ - time_t if_modified_since; - /** String containing the requested URL or resource. */ - const char *url; - /** String containing the HTTP headers */ - const char *headers; -} get_handler_args_t; - -/** Entry for handling an HTTP GET request. - * - * This entry matches a request if "string" is equal to the requested - * resource, or if "is_prefix" is true and "string" is a prefix of the - * requested resource. - * - * The 'handler' function is called to handle the request. It receives - * an arguments structure, and must return 0 on success or -1 if we should - * close the connection. - **/ -typedef struct url_table_ent_s { - const char *string; - int is_prefix; - int (*handler)(dir_connection_t *conn, const get_handler_args_t *args); -} url_table_ent_t; - -static int handle_get_frontpage(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_current_consensus(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_status_vote(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_microdesc(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_descriptor(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_keys(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_hs_descriptor_v2(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_robots(dir_connection_t *conn, - const get_handler_args_t *args); -static int handle_get_networkstatus_bridges(dir_connection_t *conn, - const get_handler_args_t *args); - -/** Table for handling GET requests. */ -static const url_table_ent_t url_table[] = { - { "/tor/", 0, handle_get_frontpage }, - { "/tor/status-vote/current/consensus", 1, handle_get_current_consensus }, - { "/tor/status-vote/current/", 1, handle_get_status_vote }, - { "/tor/status-vote/next/", 1, handle_get_status_vote }, - { "/tor/micro/d/", 1, handle_get_microdesc }, - { "/tor/server/", 1, handle_get_descriptor }, - { "/tor/extra/", 1, handle_get_descriptor }, - { "/tor/keys/", 1, handle_get_keys }, - { "/tor/rendezvous2/", 1, handle_get_hs_descriptor_v2 }, - { "/tor/hs/3/", 1, handle_get_hs_descriptor_v3 }, - { "/tor/robots.txt", 0, handle_get_robots }, - { "/tor/networkstatus-bridges", 0, handle_get_networkstatus_bridges }, - { NULL, 0, NULL }, -}; - -/** Helper function: called when a dirserver gets a complete HTTP GET - * request. Look for a request for a directory or for a rendezvous - * service descriptor. On finding one, write a response into - * conn-\>outbuf. If the request is unrecognized, send a 404. - * Return 0 if we handled this successfully, or -1 if we need to close - * the connection. */ -MOCK_IMPL(STATIC int, -directory_handle_command_get,(dir_connection_t *conn, const char *headers, - const char *req_body, size_t req_body_len)) -{ - char *url, *url_mem, *header; - time_t if_modified_since = 0; - int zlib_compressed_in_url; - unsigned compression_methods_supported; - - /* We ignore the body of a GET request. */ - (void)req_body; - (void)req_body_len; - - log_debug(LD_DIRSERV,"Received GET command."); - - conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; - - if (parse_http_url(headers, &url) < 0) { - write_short_http_response(conn, 400, "Bad request"); - return 0; - } - if ((header = http_get_header(headers, "If-Modified-Since: "))) { - struct tm tm; - if (parse_http_time(header, &tm) == 0) { - if (tor_timegm(&tm, &if_modified_since)<0) { - if_modified_since = 0; - } else { - log_debug(LD_DIRSERV, "If-Modified-Since is '%s'.", escaped(header)); - } - } - /* The correct behavior on a malformed If-Modified-Since header is to - * act as if no If-Modified-Since header had been given. */ - tor_free(header); - } - log_debug(LD_DIRSERV,"rewritten url as '%s'.", escaped(url)); - - url_mem = url; - { - size_t url_len = strlen(url); - - zlib_compressed_in_url = url_len > 2 && !strcmp(url+url_len-2, ".z"); - if (zlib_compressed_in_url) { - url[url_len-2] = '\0'; - } - } - - if ((header = http_get_header(headers, "Accept-Encoding: "))) { - compression_methods_supported = parse_accept_encoding_header(header); - tor_free(header); - } else { - compression_methods_supported = (1u << NO_METHOD); - } - if (zlib_compressed_in_url) { - compression_methods_supported |= (1u << ZLIB_METHOD); - } - - /* Remove all methods that we don't both support. */ - compression_methods_supported &= tor_compress_get_supported_method_bitmask(); - - get_handler_args_t args; - args.url = url; - args.headers = headers; - args.if_modified_since = if_modified_since; - args.compression_supported = compression_methods_supported; - - int i, result = -1; - for (i = 0; url_table[i].string; ++i) { - int match; - if (url_table[i].is_prefix) { - match = !strcmpstart(url, url_table[i].string); - } else { - match = !strcmp(url, url_table[i].string); - } - if (match) { - result = url_table[i].handler(conn, &args); - goto done; - } - } - - /* we didn't recognize the url */ - write_short_http_response(conn, 404, "Not found"); - result = 0; - - done: - tor_free(url_mem); - return result; -} - -/** Helper function for GET / or GET /tor/ - */ -static int -handle_get_frontpage(dir_connection_t *conn, const get_handler_args_t *args) -{ - (void) args; /* unused */ - const char *frontpage = get_dirportfrontpage(); - - if (frontpage) { - size_t dlen; - dlen = strlen(frontpage); - /* Let's return a disclaimer page (users shouldn't use V1 anymore, - and caches don't fetch '/', so this is safe). */ - - /* [We don't check for write_bucket_low here, since we want to serve - * this page no matter what.] */ - write_http_response_header_impl(conn, dlen, "text/html", "identity", - NULL, DIRPORTFRONTPAGE_CACHE_LIFETIME); - connection_buf_add(frontpage, dlen, TO_CONN(conn)); - } else { - write_short_http_response(conn, 404, "Not found"); - } - return 0; -} - -/** Warn that the cached consensus consensus of type - * flavor is too old and will not be served to clients. Rate-limit the - * warning to avoid logging an entry on every request. - */ -static void -warn_consensus_is_too_old(const struct consensus_cache_entry_t *consensus, - const char *flavor, time_t now) -{ -#define TOO_OLD_WARNING_INTERVAL (60*60) - static ratelim_t warned = RATELIM_INIT(TOO_OLD_WARNING_INTERVAL); - char timestamp[ISO_TIME_LEN+1]; - time_t valid_until; - char *dupes; - - if (consensus_cache_entry_get_valid_until(consensus, &valid_until)) - return; - - if ((dupes = rate_limit_log(&warned, now))) { - format_local_iso_time(timestamp, valid_until); - log_warn(LD_DIRSERV, "Our %s%sconsensus is too old, so we will not " - "serve it to clients. It was valid until %s local time and we " - "continued to serve it for up to 24 hours after it expired.%s", - flavor ? flavor : "", flavor ? " " : "", timestamp, dupes); - tor_free(dupes); - } -} - -/** - * Parse a single hex-encoded sha3-256 digest from hex into - * digest. Return 0 on success. On failure, report that the hash came - * from location, report that we are taking action with it, and - * return -1. - */ -static int -parse_one_diff_hash(uint8_t *digest, const char *hex, const char *location, - const char *action) -{ - if (base16_decode((char*)digest, DIGEST256_LEN, hex, strlen(hex)) == - DIGEST256_LEN) { - return 0; - } else { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "%s contained bogus digest %s; %s.", - location, escaped(hex), action); - return -1; - } -} - -/** If there is an X-Or-Diff-From-Consensus header included in headers, - * set digest_out to a new smartlist containing every 256-bit - * hex-encoded digest listed in that header and return 0. Otherwise return - * -1. */ -static int -parse_or_diff_from_header(smartlist_t **digests_out, const char *headers) -{ - char *hdr = http_get_header(headers, X_OR_DIFF_FROM_CONSENSUS_HEADER); - if (hdr == NULL) { - return -1; - } - smartlist_t *hex_digests = smartlist_new(); - *digests_out = smartlist_new(); - smartlist_split_string(hex_digests, hdr, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - SMARTLIST_FOREACH_BEGIN(hex_digests, const char *, hex) { - uint8_t digest[DIGEST256_LEN]; - if (!parse_one_diff_hash(digest, hex, "X-Or-Diff-From-Consensus header", - "ignoring")) { - smartlist_add(*digests_out, tor_memdup(digest, sizeof(digest))); - } - } SMARTLIST_FOREACH_END(hex); - SMARTLIST_FOREACH(hex_digests, char *, cp, tor_free(cp)); - smartlist_free(hex_digests); - tor_free(hdr); - return 0; -} - -/** Fallback compression method. The fallback compression method is used in - * case a client requests a non-compressed document. We only store compressed - * documents, so we use this compression method to fetch the document and let - * the spooling system do the streaming decompression. - */ -#define FALLBACK_COMPRESS_METHOD ZLIB_METHOD - -/** - * Try to find the best consensus diff possible in order to serve a client - * request for a diff from one of the consensuses in digests to the - * current consensus of flavor flav. The client supports the - * compression methods listed in the compression_methods bitfield: - * place the method chosen (if any) into compression_used_out. - */ -static struct consensus_cache_entry_t * -find_best_diff(const smartlist_t *digests, int flav, - unsigned compression_methods, - compress_method_t *compression_used_out) -{ - struct consensus_cache_entry_t *result = NULL; - - SMARTLIST_FOREACH_BEGIN(digests, const uint8_t *, diff_from) { - unsigned u; - for (u = 0; u < ARRAY_LENGTH(srv_meth_pref_precompressed); ++u) { - compress_method_t method = srv_meth_pref_precompressed[u]; - if (0 == (compression_methods & (1u<flav. - * The prefered set of compression methods should be listed in the - * compression_methods bitfield. The compression method chosen (if any) - * is stored in compression_used_out. */ -static struct consensus_cache_entry_t * -find_best_consensus(int flav, - unsigned compression_methods, - compress_method_t *compression_used_out) -{ - struct consensus_cache_entry_t *result = NULL; - unsigned u; - - for (u = 0; u < ARRAY_LENGTH(srv_meth_pref_precompressed); ++u) { - compress_method_t method = srv_meth_pref_precompressed[u]; - - if (0 == (compression_methods & (1u<compression_methods. Return NO_METHOD if no mutually supported - * compression method could be found. */ -static compress_method_t -find_best_compression_method(unsigned compression_methods, int stream) -{ - unsigned u; - compress_method_t *methods; - size_t length; - - if (stream) { - methods = srv_meth_pref_streaming_compression; - length = ARRAY_LENGTH(srv_meth_pref_streaming_compression); - } else { - methods = srv_meth_pref_precompressed; - length = ARRAY_LENGTH(srv_meth_pref_precompressed); - } - - for (u = 0; u < length; ++u) { - compress_method_t method = methods[u]; - if (compression_methods & (1u<digests matches the latest consensus - * flavor (given in flavor) that we have available. */ -static int -digest_list_contains_best_consensus(consensus_flavor_t flavor, - const smartlist_t *digests) -{ - const networkstatus_t *ns = NULL; - - if (digests == NULL) - return 0; - - ns = networkstatus_get_latest_consensus_by_flavor(flavor); - - if (ns == NULL) - return 0; - - SMARTLIST_FOREACH_BEGIN(digests, const uint8_t *, digest) { - if (tor_memeq(ns->digest_sha3_as_signed, digest, DIGEST256_LEN)) - return 1; - } SMARTLIST_FOREACH_END(digest); - - return 0; -} - -/** Check if the given compression method is allowed for a connection that is - * supposed to be anonymous. Returns 1 if the compression method is allowed, - * otherwise 0. */ -STATIC int -allowed_anonymous_connection_compression_method(compress_method_t method) -{ - unsigned u; - - for (u = 0; u < ARRAY_LENGTH(client_meth_allowed_anonymous_compression); - ++u) { - compress_method_t allowed_method = - client_meth_allowed_anonymous_compression[u]; - - if (! tor_compress_supports_method(allowed_method)) - continue; - - if (method == allowed_method) - return 1; - } - - return 0; -} - -/** Log a warning when a remote server has sent us a document using a - * compression method that is not allowed for anonymous directory requests. */ -STATIC void -warn_disallowed_anonymous_compression_method(compress_method_t method) -{ - log_fn(LOG_PROTOCOL_WARN, LD_HTTP, - "Received a %s HTTP response, which is not " - "allowed for anonymous directory requests.", - compression_method_get_human_name(method)); -} - -/** Encodes the results of parsing a consensus request to figure out what - * consensus, and possibly what diffs, the user asked for. */ -typedef struct { - /** name of the flavor to retrieve. */ - char *flavor; - /** flavor to retrive, as enum. */ - consensus_flavor_t flav; - /** plus-separated list of authority fingerprints; see - * client_likes_consensus(). Aliases the URL in the request passed to - * parse_consensus_request(). */ - const char *want_fps; - /** Optionally, a smartlist of sha3 digests-as-signed of the consensuses - * to return a diff from. */ - smartlist_t *diff_from_digests; - /** If true, never send a full consensus. If there is no diff, send - * a 404 instead. */ - int diff_only; -} parsed_consensus_request_t; - -/** Remove all data held in req. Do not free req itself, since - * it is stack-allocated. */ -static void -parsed_consensus_request_clear(parsed_consensus_request_t *req) -{ - if (!req) - return; - tor_free(req->flavor); - if (req->diff_from_digests) { - SMARTLIST_FOREACH(req->diff_from_digests, uint8_t *, d, tor_free(d)); - smartlist_free(req->diff_from_digests); - } - memset(req, 0, sizeof(parsed_consensus_request_t)); -} - -/** - * Parse the URL and relevant headers of args for a current-consensus - * request to learn what flavor of consensus we want, what keys it must be - * signed with, and what diffs we would accept (or demand) instead. Return 0 - * on success and -1 on failure. - */ -static int -parse_consensus_request(parsed_consensus_request_t *out, - const get_handler_args_t *args) -{ - const char *url = args->url; - memset(out, 0, sizeof(parsed_consensus_request_t)); - out->flav = FLAV_NS; - - const char CONSENSUS_URL_PREFIX[] = "/tor/status-vote/current/consensus/"; - const char CONSENSUS_FLAVORED_PREFIX[] = - "/tor/status-vote/current/consensus-"; - - /* figure out the flavor if any, and who we wanted to sign the thing */ - const char *after_flavor = NULL; - - if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { - const char *f, *cp; - f = url + strlen(CONSENSUS_FLAVORED_PREFIX); - cp = strchr(f, '/'); - if (cp) { - after_flavor = cp+1; - out->flavor = tor_strndup(f, cp-f); - } else { - out->flavor = tor_strdup(f); - } - int flav = networkstatus_parse_flavor_name(out->flavor); - if (flav < 0) - flav = FLAV_NS; - out->flav = flav; - } else { - if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) - after_flavor = url+strlen(CONSENSUS_URL_PREFIX); - } - - /* see whether we've been asked explicitly for a diff from an older - * consensus. (The user might also have said that a diff would be okay, - * via X-Or-Diff-From-Consensus */ - const char DIFF_COMPONENT[] = "diff/"; - char *diff_hash_in_url = NULL; - if (after_flavor && !strcmpstart(after_flavor, DIFF_COMPONENT)) { - after_flavor += strlen(DIFF_COMPONENT); - const char *cp = strchr(after_flavor, '/'); - if (cp) { - diff_hash_in_url = tor_strndup(after_flavor, cp-after_flavor); - out->want_fps = cp+1; - } else { - diff_hash_in_url = tor_strdup(after_flavor); - out->want_fps = NULL; - } - } else { - out->want_fps = after_flavor; - } - - if (diff_hash_in_url) { - uint8_t diff_from[DIGEST256_LEN]; - out->diff_from_digests = smartlist_new(); - out->diff_only = 1; - int ok = !parse_one_diff_hash(diff_from, diff_hash_in_url, "URL", - "rejecting"); - tor_free(diff_hash_in_url); - if (ok) { - smartlist_add(out->diff_from_digests, - tor_memdup(diff_from, DIGEST256_LEN)); - } else { - return -1; - } - } else { - parse_or_diff_from_header(&out->diff_from_digests, args->headers); - } - - return 0; -} - -/** Helper function for GET /tor/status-vote/current/consensus - */ -static int -handle_get_current_consensus(dir_connection_t *conn, - const get_handler_args_t *args) -{ - const compress_method_t compress_method = - find_best_compression_method(args->compression_supported, 0); - const time_t if_modified_since = args->if_modified_since; - int clear_spool = 0; - - /* v3 network status fetch. */ - long lifetime = NETWORKSTATUS_CACHE_LIFETIME; - - time_t now = time(NULL); - parsed_consensus_request_t req; - - if (parse_consensus_request(&req, args) < 0) { - write_short_http_response(conn, 404, "Couldn't parse request"); - goto done; - } - - if (digest_list_contains_best_consensus(req.flav, - req.diff_from_digests)) { - write_short_http_response(conn, 304, "Not modified"); - geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); - goto done; - } - - struct consensus_cache_entry_t *cached_consensus = NULL; - - compress_method_t compression_used = NO_METHOD; - if (req.diff_from_digests) { - cached_consensus = find_best_diff(req.diff_from_digests, req.flav, - args->compression_supported, - &compression_used); - } - - if (req.diff_only && !cached_consensus) { - write_short_http_response(conn, 404, "No such diff available"); - // XXXX warn_consensus_is_too_old(v, req.flavor, now); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - goto done; - } - - if (! cached_consensus) { - cached_consensus = find_best_consensus(req.flav, - args->compression_supported, - &compression_used); - } - - time_t fresh_until, valid_until; - int have_fresh_until = 0, have_valid_until = 0; - if (cached_consensus) { - have_fresh_until = - !consensus_cache_entry_get_fresh_until(cached_consensus, &fresh_until); - have_valid_until = - !consensus_cache_entry_get_valid_until(cached_consensus, &valid_until); - } - - if (cached_consensus && have_valid_until && - !networkstatus_valid_until_is_reasonably_live(valid_until, now)) { - write_short_http_response(conn, 404, "Consensus is too old"); - warn_consensus_is_too_old(cached_consensus, req.flavor, now); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - goto done; - } - - if (cached_consensus && req.want_fps && - !client_likes_consensus(cached_consensus, req.want_fps)) { - write_short_http_response(conn, 404, "Consensus not signed by sufficient " - "number of requested authorities"); - geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); - goto done; - } - - conn->spool = smartlist_new(); - clear_spool = 1; - { - spooled_resource_t *spooled; - if (cached_consensus) { - spooled = spooled_resource_new_from_cache_entry(cached_consensus); - smartlist_add(conn->spool, spooled); - } - } - - lifetime = (have_fresh_until && fresh_until > now) ? fresh_until - now : 0; - - size_t size_guess = 0; - int n_expired = 0; - dirserv_spool_remove_missing_and_guess_size(conn, if_modified_since, - compress_method != NO_METHOD, - &size_guess, - &n_expired); - - if (!smartlist_len(conn->spool) && !n_expired) { - write_short_http_response(conn, 404, "Not found"); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - goto done; - } else if (!smartlist_len(conn->spool)) { - write_short_http_response(conn, 304, "Not modified"); - geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); - goto done; - } - - if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { - log_debug(LD_DIRSERV, - "Client asked for network status lists, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_short_http_response(conn, 503, "Directory busy, try again later"); - geoip_note_ns_response(GEOIP_REJECT_BUSY); - goto done; - } - - tor_addr_t addr; - if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) { - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, - &addr, NULL, - time(NULL)); - geoip_note_ns_response(GEOIP_SUCCESS); - /* Note that a request for a network status has started, so that we - * can measure the download time later on. */ - if (conn->dirreq_id) - geoip_start_dirreq(conn->dirreq_id, size_guess, DIRREQ_TUNNELED); - else - geoip_start_dirreq(TO_CONN(conn)->global_identifier, size_guess, - DIRREQ_DIRECT); - } - - /* Use this header to tell caches that the response depends on the - * X-Or-Diff-From-Consensus header (or lack thereof). */ - const char vary_header[] = "Vary: X-Or-Diff-From-Consensus\r\n"; - - clear_spool = 0; - - // The compress_method might have been NO_METHOD, but we store the data - // compressed. Decompress them using `compression_used`. See fallback code in - // find_best_consensus() and find_best_diff(). - write_http_response_headers(conn, -1, - compress_method == NO_METHOD ? - NO_METHOD : compression_used, - vary_header, - smartlist_len(conn->spool) == 1 ? lifetime : 0); - - if (compress_method == NO_METHOD && smartlist_len(conn->spool)) - conn->compress_state = tor_compress_new(0, compression_used, - HIGH_COMPRESSION); - - /* Prime the connection with some data. */ - const int initial_flush_result = connection_dirserv_flushed_some(conn); - tor_assert_nonfatal(initial_flush_result == 0); - goto done; - - done: - parsed_consensus_request_clear(&req); - if (clear_spool) { - dir_conn_clear_spool(conn); - } - return 0; -} - -/** Helper function for GET /tor/status-vote/{current,next}/... - */ -static int -handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args) -{ - const char *url = args->url; - { - int current; - ssize_t body_len = 0; - ssize_t estimated_len = 0; - /* This smartlist holds strings that we can compress on the fly. */ - smartlist_t *items = smartlist_new(); - /* This smartlist holds cached_dir_t objects that have a precompressed - * deflated version. */ - smartlist_t *dir_items = smartlist_new(); - int lifetime = 60; /* XXXX?? should actually use vote intervals. */ - url += strlen("/tor/status-vote/"); - current = !strcmpstart(url, "current/"); - url = strchr(url, '/'); - tor_assert(url); - ++url; - if (!strcmp(url, "consensus")) { - const char *item; - tor_assert(!current); /* we handle current consensus specially above, - * since it wants to be spooled. */ - if ((item = dirvote_get_pending_consensus(FLAV_NS))) - smartlist_add(items, (char*)item); - } else if (!current && !strcmp(url, "consensus-signatures")) { - /* XXXX the spec says that we should implement - * current/consensus-signatures too. It doesn't seem to be needed, - * though. */ - const char *item; - if ((item=dirvote_get_pending_detached_signatures())) - smartlist_add(items, (char*)item); - } else if (!strcmp(url, "authority")) { - const cached_dir_t *d; - int flags = DGV_BY_ID | - (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); - if ((d=dirvote_get_vote(NULL, flags))) - smartlist_add(dir_items, (cached_dir_t*)d); - } else { - const cached_dir_t *d; - smartlist_t *fps = smartlist_new(); - int flags; - if (!strcmpstart(url, "d/")) { - url += 2; - flags = DGV_INCLUDE_PENDING | DGV_INCLUDE_PREVIOUS; - } else { - flags = DGV_BY_ID | - (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); - } - dir_split_resource_into_fingerprints(url, fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, fp, { - if ((d = dirvote_get_vote(fp, flags))) - smartlist_add(dir_items, (cached_dir_t*)d); - tor_free(fp); - }); - smartlist_free(fps); - } - if (!smartlist_len(dir_items) && !smartlist_len(items)) { - write_short_http_response(conn, 404, "Not found"); - goto vote_done; - } - - /* We're sending items from at most one kind of source */ - tor_assert_nonfatal(smartlist_len(items) == 0 || - smartlist_len(dir_items) == 0); - - int streaming; - unsigned mask; - if (smartlist_len(items)) { - /* We're taking strings and compressing them on the fly. */ - streaming = 1; - mask = ~0u; - } else { - /* We're taking cached_dir_t objects. We only have them uncompressed - * or deflated. */ - streaming = 0; - mask = (1u<compression_supported&mask, streaming); - - SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, - body_len += compress_method != NO_METHOD ? - d->dir_compressed_len : d->dir_len); - estimated_len += body_len; - SMARTLIST_FOREACH(items, const char *, item, { - size_t ln = strlen(item); - if (compress_method != NO_METHOD) { - estimated_len += ln/2; - } else { - body_len += ln; estimated_len += ln; - } - }); - - if (global_write_bucket_low(TO_CONN(conn), estimated_len, 2)) { - write_short_http_response(conn, 503, "Directory busy, try again later"); - goto vote_done; - } - write_http_response_header(conn, body_len ? body_len : -1, - compress_method, - lifetime); - - if (smartlist_len(items)) { - if (compress_method != NO_METHOD) { - conn->compress_state = tor_compress_new(1, compress_method, - choose_compression_level(estimated_len)); - SMARTLIST_FOREACH(items, const char *, c, - connection_buf_add_compress(c, strlen(c), conn, 0)); - connection_buf_add_compress("", 0, conn, 1); - } else { - SMARTLIST_FOREACH(items, const char *, c, - connection_buf_add(c, strlen(c), TO_CONN(conn))); - } - } else { - SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, - connection_buf_add(compress_method != NO_METHOD ? - d->dir_compressed : d->dir, - compress_method != NO_METHOD ? - d->dir_compressed_len : d->dir_len, - TO_CONN(conn))); - } - vote_done: - smartlist_free(items); - smartlist_free(dir_items); - goto done; - } - done: - return 0; -} - -/** Helper function for GET /tor/micro/d/... - */ -static int -handle_get_microdesc(dir_connection_t *conn, const get_handler_args_t *args) -{ - const char *url = args->url; - const compress_method_t compress_method = - find_best_compression_method(args->compression_supported, 1); - int clear_spool = 1; - { - conn->spool = smartlist_new(); - - dir_split_resource_into_spoolable(url+strlen("/tor/micro/d/"), - DIR_SPOOL_MICRODESC, - conn->spool, NULL, - DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); - - size_t size_guess = 0; - dirserv_spool_remove_missing_and_guess_size(conn, 0, - compress_method != NO_METHOD, - &size_guess, NULL); - if (smartlist_len(conn->spool) == 0) { - write_short_http_response(conn, 404, "Not found"); - goto done; - } - if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { - log_info(LD_DIRSERV, - "Client asked for server descriptors, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_short_http_response(conn, 503, "Directory busy, try again later"); - goto done; - } - - clear_spool = 0; - write_http_response_header(conn, -1, - compress_method, - MICRODESC_CACHE_LIFETIME); - - if (compress_method != NO_METHOD) - conn->compress_state = tor_compress_new(1, compress_method, - choose_compression_level(size_guess)); - - const int initial_flush_result = connection_dirserv_flushed_some(conn); - tor_assert_nonfatal(initial_flush_result == 0); - goto done; - } - - done: - if (clear_spool) { - dir_conn_clear_spool(conn); - } - return 0; -} - -/** Helper function for GET /tor/{server,extra}/... - */ -static int -handle_get_descriptor(dir_connection_t *conn, const get_handler_args_t *args) -{ - const char *url = args->url; - const compress_method_t compress_method = - find_best_compression_method(args->compression_supported, 1); - const or_options_t *options = get_options(); - int clear_spool = 1; - if (!strcmpstart(url,"/tor/server/") || - (!options->BridgeAuthoritativeDir && - !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { - int res; - const char *msg = NULL; - int cache_lifetime = 0; - int is_extra = !strcmpstart(url,"/tor/extra/"); - url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/"); - dir_spool_source_t source; - time_t publish_cutoff = 0; - if (!strcmpstart(url, "d/")) { - source = - is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST; - } else { - source = - is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP; - /* We only want to apply a publish cutoff when we're requesting - * resources by fingerprint. */ - publish_cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH; - } - - conn->spool = smartlist_new(); - res = dirserv_get_routerdesc_spool(conn->spool, url, - source, - connection_dir_is_encrypted(conn), - &msg); - - if (!strcmpstart(url, "all")) { - cache_lifetime = FULL_DIR_CACHE_LIFETIME; - } else if (smartlist_len(conn->spool) == 1) { - cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; - } - - size_t size_guess = 0; - int n_expired = 0; - dirserv_spool_remove_missing_and_guess_size(conn, publish_cutoff, - compress_method != NO_METHOD, - &size_guess, &n_expired); - - /* If we are the bridge authority and the descriptor is a bridge - * descriptor, remember that we served this descriptor for desc stats. */ - /* XXXX it's a bit of a kludge to have this here. */ - if (get_options()->BridgeAuthoritativeDir && - source == DIR_SPOOL_SERVER_BY_FP) { - SMARTLIST_FOREACH_BEGIN(conn->spool, spooled_resource_t *, spooled) { - const routerinfo_t *router = - router_get_by_id_digest((const char *)spooled->digest); - /* router can be NULL here when the bridge auth is asked for its own - * descriptor. */ - if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) - rep_hist_note_desc_served(router->cache_info.identity_digest); - } SMARTLIST_FOREACH_END(spooled); - } - - if (res < 0 || size_guess == 0 || smartlist_len(conn->spool) == 0) { - if (msg == NULL) - msg = "Not found"; - write_short_http_response(conn, 404, msg); - } else { - if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { - log_info(LD_DIRSERV, - "Client asked for server descriptors, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_short_http_response(conn, 503, - "Directory busy, try again later"); - dir_conn_clear_spool(conn); - goto done; - } - write_http_response_header(conn, -1, compress_method, cache_lifetime); - if (compress_method != NO_METHOD) - conn->compress_state = tor_compress_new(1, compress_method, - choose_compression_level(size_guess)); - clear_spool = 0; - /* Prime the connection with some data. */ - int initial_flush_result = connection_dirserv_flushed_some(conn); - tor_assert_nonfatal(initial_flush_result == 0); - } - goto done; - } - done: - if (clear_spool) - dir_conn_clear_spool(conn); - return 0; -} - -/** Helper function for GET /tor/keys/... - */ -static int -handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args) -{ - const char *url = args->url; - const compress_method_t compress_method = - find_best_compression_method(args->compression_supported, 1); - const time_t if_modified_since = args->if_modified_since; - { - smartlist_t *certs = smartlist_new(); - ssize_t len = -1; - if (!strcmp(url, "/tor/keys/all")) { - authority_cert_get_all(certs); - } else if (!strcmp(url, "/tor/keys/authority")) { - authority_cert_t *cert = get_my_v3_authority_cert(); - if (cert) - smartlist_add(certs, cert); - } else if (!strcmpstart(url, "/tor/keys/fp/")) { - smartlist_t *fps = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/keys/fp/"), - fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, d, { - authority_cert_t *c = authority_cert_get_newest_by_id(d); - if (c) smartlist_add(certs, c); - tor_free(d); - }); - smartlist_free(fps); - } else if (!strcmpstart(url, "/tor/keys/sk/")) { - smartlist_t *fps = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/keys/sk/"), - fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, d, { - authority_cert_t *c = authority_cert_get_by_sk_digest(d); - if (c) smartlist_add(certs, c); - tor_free(d); - }); - smartlist_free(fps); - } else if (!strcmpstart(url, "/tor/keys/fp-sk/")) { - smartlist_t *fp_sks = smartlist_new(); - dir_split_resource_into_fingerprint_pairs(url+strlen("/tor/keys/fp-sk/"), - fp_sks); - SMARTLIST_FOREACH(fp_sks, fp_pair_t *, pair, { - authority_cert_t *c = authority_cert_get_by_digests(pair->first, - pair->second); - if (c) smartlist_add(certs, c); - tor_free(pair); - }); - smartlist_free(fp_sks); - } else { - write_short_http_response(conn, 400, "Bad request"); - goto keys_done; - } - if (!smartlist_len(certs)) { - write_short_http_response(conn, 404, "Not found"); - goto keys_done; - } - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - if (c->cache_info.published_on < if_modified_since) - SMARTLIST_DEL_CURRENT(certs, c)); - if (!smartlist_len(certs)) { - write_short_http_response(conn, 304, "Not modified"); - goto keys_done; - } - len = 0; - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - len += c->cache_info.signed_descriptor_len); - - if (global_write_bucket_low(TO_CONN(conn), - compress_method != NO_METHOD ? len/2 : len, - 2)) { - write_short_http_response(conn, 503, "Directory busy, try again later"); - goto keys_done; - } - - write_http_response_header(conn, - compress_method != NO_METHOD ? -1 : len, - compress_method, - 60*60); - if (compress_method != NO_METHOD) { - conn->compress_state = tor_compress_new(1, compress_method, - choose_compression_level(len)); - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_buf_add_compress( - c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - conn, 0)); - connection_buf_add_compress("", 0, conn, 1); - } else { - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_buf_add(c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - TO_CONN(conn))); - } - keys_done: - smartlist_free(certs); - goto done; - } - done: - return 0; -} - -/** Helper function for GET /tor/rendezvous2/ - */ -static int -handle_get_hs_descriptor_v2(dir_connection_t *conn, - const get_handler_args_t *args) -{ - const char *url = args->url; - if (connection_dir_is_encrypted(conn)) { - /* Handle v2 rendezvous descriptor fetch request. */ - const char *descp; - const char *query = url + strlen("/tor/rendezvous2/"); - if (rend_valid_descriptor_id(query)) { - log_info(LD_REND, "Got a v2 rendezvous descriptor request for ID '%s'", - safe_str(escaped(query))); - switch (rend_cache_lookup_v2_desc_as_dir(query, &descp)) { - case 1: /* valid */ - write_http_response_header(conn, strlen(descp), NO_METHOD, 0); - connection_buf_add(descp, strlen(descp), TO_CONN(conn)); - break; - case 0: /* well-formed but not present */ - write_short_http_response(conn, 404, "Not found"); - break; - case -1: /* not well-formed */ - write_short_http_response(conn, 400, "Bad request"); - break; - } - } else { /* not well-formed */ - write_short_http_response(conn, 400, "Bad request"); - } - goto done; - } else { - /* Not encrypted! */ - write_short_http_response(conn, 404, "Not found"); - } - done: - return 0; -} - -/** Helper function for GET /tor/hs/3/. Only for version 3. - */ -STATIC int -handle_get_hs_descriptor_v3(dir_connection_t *conn, - const get_handler_args_t *args) -{ - int retval; - const char *desc_str = NULL; - const char *pubkey_str = NULL; - const char *url = args->url; - - /* Reject unencrypted dir connections */ - if (!connection_dir_is_encrypted(conn)) { - write_short_http_response(conn, 404, "Not found"); - goto done; - } - - /* After the path prefix follows the base64 encoded blinded pubkey which we - * use to get the descriptor from the cache. Skip the prefix and get the - * pubkey. */ - tor_assert(!strcmpstart(url, "/tor/hs/3/")); - pubkey_str = url + strlen("/tor/hs/3/"); - retval = hs_cache_lookup_as_dir(HS_VERSION_THREE, - pubkey_str, &desc_str); - if (retval <= 0 || desc_str == NULL) { - write_short_http_response(conn, 404, "Not found"); - goto done; - } - - /* Found requested descriptor! Pass it to this nice client. */ - write_http_response_header(conn, strlen(desc_str), NO_METHOD, 0); - connection_buf_add(desc_str, strlen(desc_str), TO_CONN(conn)); - - done: - return 0; -} - -/** Helper function for GET /tor/networkstatus-bridges - */ -static int -handle_get_networkstatus_bridges(dir_connection_t *conn, - const get_handler_args_t *args) -{ - const char *headers = args->headers; - - const or_options_t *options = get_options(); - if (options->BridgeAuthoritativeDir && - options->BridgePassword_AuthDigest_ && - connection_dir_is_encrypted(conn)) { - char *status; - char digest[DIGEST256_LEN]; - - char *header = http_get_header(headers, "Authorization: Basic "); - if (header) - crypto_digest256(digest, header, strlen(header), DIGEST_SHA256); - - /* now make sure the password is there and right */ - if (!header || - tor_memneq(digest, - options->BridgePassword_AuthDigest_, DIGEST256_LEN)) { - write_short_http_response(conn, 404, "Not found"); - tor_free(header); - goto done; - } - tor_free(header); - - /* all happy now. send an answer. */ - status = networkstatus_getinfo_by_purpose("bridge", time(NULL)); - size_t dlen = strlen(status); - write_http_response_header(conn, dlen, NO_METHOD, 0); - connection_buf_add(status, dlen, TO_CONN(conn)); - tor_free(status); - goto done; - } - done: - return 0; -} - -/** Helper function for GET robots.txt or /tor/robots.txt */ -static int -handle_get_robots(dir_connection_t *conn, const get_handler_args_t *args) -{ - (void)args; - { - const char robots[] = "User-agent: *\r\nDisallow: /\r\n"; - size_t len = strlen(robots); - write_http_response_header(conn, len, NO_METHOD, ROBOTS_CACHE_LIFETIME); - connection_buf_add(robots, len, TO_CONN(conn)); - } - return 0; -} - -/* Given the url from a POST request, try to extract the version number - * using the provided prefix. The version should be after the prefix and - * ending with the seperator "/". For instance: - * /tor/hs/3/publish - * - * On success, end_pos points to the position right after the version - * was found. On error, it is set to NULL. - * - * Return version on success else negative value. */ -STATIC int -parse_hs_version_from_post(const char *url, const char *prefix, - const char **end_pos) -{ - int ok; - unsigned long version; - const char *start; - char *end = NULL; - - tor_assert(url); - tor_assert(prefix); - tor_assert(end_pos); - - /* Check if the prefix does start the url. */ - if (strcmpstart(url, prefix)) { - goto err; - } - /* Move pointer to the end of the prefix string. */ - start = url + strlen(prefix); - /* Try this to be the HS version and if we are still at the separator, next - * will be move to the right value. */ - version = tor_parse_long(start, 10, 0, INT_MAX, &ok, &end); - if (!ok) { - goto err; - } - - *end_pos = end; - return (int) version; - err: - *end_pos = NULL; - return -1; -} - -/* Handle the POST request for a hidden service descripror. The request is in - * url, the body of the request is in body. Return 200 on success - * else return 400 indicating a bad request. */ -STATIC int -handle_post_hs_descriptor(const char *url, const char *body) -{ - int version; - const char *end_pos; - - tor_assert(url); - tor_assert(body); - - version = parse_hs_version_from_post(url, "/tor/hs/", &end_pos); - if (version < 0) { - goto err; - } - - /* We have a valid version number, now make sure it's a publish request. Use - * the end position just after the version and check for the command. */ - if (strcmpstart(end_pos, "/publish")) { - goto err; - } - - switch (version) { - case HS_VERSION_THREE: - if (hs_cache_store_as_dir(body) < 0) { - goto err; - } - log_info(LD_REND, "Publish request for HS descriptor handled " - "successfully."); - break; - default: - /* Unsupported version, return a bad request. */ - goto err; - } - - return 200; - err: - /* Bad request. */ - return 400; -} - -/** Helper function: called when a dirserver gets a complete HTTP POST - * request. Look for an uploaded server descriptor or rendezvous - * service descriptor. On finding one, process it and write a - * response into conn-\>outbuf. If the request is unrecognized, send a - * 400. Always return 0. */ -MOCK_IMPL(STATIC int, -directory_handle_command_post,(dir_connection_t *conn, const char *headers, - const char *body, size_t body_len)) -{ - char *url = NULL; - const or_options_t *options = get_options(); - - log_debug(LD_DIRSERV,"Received POST command."); - - conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; - - if (!public_server_mode(options)) { - log_info(LD_DIR, "Rejected dir post request from %s " - "since we're not a public relay.", conn->base_.address); - write_short_http_response(conn, 503, "Not acting as a public relay"); - goto done; - } - - if (parse_http_url(headers, &url) < 0) { - write_short_http_response(conn, 400, "Bad request"); - return 0; - } - log_debug(LD_DIRSERV,"rewritten url as '%s'.", escaped(url)); - - /* Handle v2 rendezvous service publish request. */ - if (connection_dir_is_encrypted(conn) && - !strcmpstart(url,"/tor/rendezvous2/publish")) { - if (rend_cache_store_v2_desc_as_dir(body) < 0) { - log_warn(LD_REND, "Rejected v2 rend descriptor (body size %d) from %s.", - (int)body_len, conn->base_.address); - write_short_http_response(conn, 400, - "Invalid v2 service descriptor rejected"); - } else { - write_short_http_response(conn, 200, "Service descriptor (v2) stored"); - log_info(LD_REND, "Handled v2 rendezvous descriptor post: accepted"); - } - goto done; - } - - /* Handle HS descriptor publish request. */ - /* XXX: This should be disabled with a consensus param until we want to - * the prop224 be deployed and thus use. */ - if (connection_dir_is_encrypted(conn) && !strcmpstart(url, "/tor/hs/")) { - const char *msg = "HS descriptor stored successfully."; - - /* We most probably have a publish request for an HS descriptor. */ - int code = handle_post_hs_descriptor(url, body); - if (code != 200) { - msg = "Invalid HS descriptor. Rejected."; - } - write_short_http_response(conn, code, msg); - goto done; - } - - if (!authdir_mode(options)) { - /* we just provide cached directories; we don't want to - * receive anything. */ - write_short_http_response(conn, 400, "Nonauthoritative directory does not " - "accept posted server descriptors"); - goto done; - } - - if (authdir_mode(options) && - !strcmp(url,"/tor/")) { /* server descriptor post */ - const char *msg = "[None]"; - uint8_t purpose = authdir_mode_bridge(options) ? - ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; - was_router_added_t r = dirserv_add_multiple_descriptors(body, purpose, - conn->base_.address, &msg); - tor_assert(msg); - - if (r == ROUTER_ADDED_SUCCESSFULLY) { - write_short_http_response(conn, 200, msg); - } else if (WRA_WAS_OUTDATED(r)) { - write_http_response_header_impl(conn, -1, NULL, NULL, - "X-Descriptor-Not-New: Yes\r\n", -1); - } else { - log_info(LD_DIRSERV, - "Rejected router descriptor or extra-info from %s " - "(\"%s\").", - conn->base_.address, msg); - write_short_http_response(conn, 400, msg); - } - goto done; - } - - if (authdir_mode_v3(options) && - !strcmp(url,"/tor/post/vote")) { /* v3 networkstatus vote */ - const char *msg = "OK"; - int status; - if (dirvote_add_vote(body, &msg, &status)) { - write_short_http_response(conn, status, "Vote stored"); - } else { - tor_assert(msg); - log_warn(LD_DIRSERV, "Rejected vote from %s (\"%s\").", - conn->base_.address, msg); - write_short_http_response(conn, status, msg); - } - goto done; - } - - if (authdir_mode_v3(options) && - !strcmp(url,"/tor/post/consensus-signature")) { /* sigs on consensus. */ - const char *msg = NULL; - if (dirvote_add_signatures(body, conn->base_.address, &msg)>=0) { - write_short_http_response(conn, 200, msg?msg:"Signatures stored"); - } else { - log_warn(LD_DIR, "Unable to store signatures posted by %s: %s", - conn->base_.address, msg?msg:"???"); - write_short_http_response(conn, 400, - msg?msg:"Unable to store signatures"); - } - goto done; - } - - /* we didn't recognize the url */ - write_short_http_response(conn, 404, "Not found"); - - done: - tor_free(url); - return 0; -} - -/** Called when a dirserver receives data on a directory connection; - * looks for an HTTP request. If the request is complete, remove it - * from the inbuf, try to process it; otherwise, leave it on the - * buffer. Return a 0 on success, or -1 on error. - */ -STATIC int -directory_handle_command(dir_connection_t *conn) -{ - char *headers=NULL, *body=NULL; - size_t body_len=0; - int r; - - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - switch (connection_fetch_from_buf_http(TO_CONN(conn), - &headers, MAX_HEADERS_SIZE, - &body, &body_len, MAX_DIR_UL_SIZE, 0)) { - case -1: /* overflow */ - log_warn(LD_DIRSERV, - "Request too large from address '%s' to DirPort. Closing.", - safe_str(conn->base_.address)); - return -1; - case 0: - log_debug(LD_DIRSERV,"command not all here yet."); - return 0; - /* case 1, fall through */ - } - - http_set_address_origin(headers, TO_CONN(conn)); - // we should escape headers here as well, - // but we can't call escaped() twice, as it uses the same buffer - //log_debug(LD_DIRSERV,"headers %s, body %s.", headers, escaped(body)); - - if (!strncasecmp(headers,"GET",3)) - r = directory_handle_command_get(conn, headers, body, body_len); - else if (!strncasecmp(headers,"POST",4)) - r = directory_handle_command_post(conn, headers, body, body_len); - else { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Got headers %s with unknown command. Closing.", - escaped(headers)); - r = -1; - } - - tor_free(headers); tor_free(body); - return r; -} - -/** Write handler for directory connections; called when all data has - * been flushed. Close the connection or wait for a response as - * appropriate. - */ -int -connection_dir_finished_flushing(dir_connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - /* Note that we have finished writing the directory response. For direct - * connections this means we're done; for tunneled connections it's only - * an intermediate step. */ - if (conn->dirreq_id) - geoip_change_dirreq_state(conn->dirreq_id, DIRREQ_TUNNELED, - DIRREQ_FLUSHING_DIR_CONN_FINISHED); - else - geoip_change_dirreq_state(TO_CONN(conn)->global_identifier, - DIRREQ_DIRECT, - DIRREQ_FLUSHING_DIR_CONN_FINISHED); - switch (conn->base_.state) { - case DIR_CONN_STATE_CONNECTING: - case DIR_CONN_STATE_CLIENT_SENDING: - log_debug(LD_DIR,"client finished sending command."); - conn->base_.state = DIR_CONN_STATE_CLIENT_READING; - return 0; - case DIR_CONN_STATE_SERVER_WRITING: - if (conn->spool) { - log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!"); - connection_mark_for_close(TO_CONN(conn)); - } else { - log_debug(LD_DIRSERV, "Finished writing server response. Closing."); - connection_mark_for_close(TO_CONN(conn)); - } - return 0; - default: - log_warn(LD_BUG,"called in unexpected state %d.", - conn->base_.state); - tor_fragile_assert(); - return -1; - } - return 0; -} - -/* We just got a new consensus! If there are other in-progress requests - * for this consensus flavor (for example because we launched several in - * parallel), cancel them. - * - * We do this check here (not just in - * connection_ap_handshake_attach_circuit()) to handle the edge case where - * a consensus fetch begins and ends before some other one tries to attach to - * a circuit, in which case the other one won't know that we're all happy now. - * - * Don't mark the conn that just gave us the consensus -- otherwise we - * would end up double-marking it when it cleans itself up. - */ -static void -connection_dir_close_consensus_fetches(dir_connection_t *except_this_one, - const char *resource) -{ - smartlist_t *conns_to_close = - connection_dir_list_by_purpose_and_resource(DIR_PURPOSE_FETCH_CONSENSUS, - resource); - SMARTLIST_FOREACH_BEGIN(conns_to_close, dir_connection_t *, d) { - if (d == except_this_one) - continue; - log_info(LD_DIR, "Closing consensus fetch (to %s) since one " - "has just arrived.", TO_CONN(d)->address); - connection_mark_for_close(TO_CONN(d)); - } SMARTLIST_FOREACH_END(d); - smartlist_free(conns_to_close); -} - -/** Connected handler for directory connections: begin sending data to the - * server, and return 0. - * Only used when connections don't immediately connect. */ -int -connection_dir_finished_connecting(dir_connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - tor_assert(conn->base_.state == DIR_CONN_STATE_CONNECTING); - - log_debug(LD_HTTP,"Dir connection to router %s:%u established.", - conn->base_.address,conn->base_.port); - - /* start flushing conn */ - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; - return 0; -} - -/** Decide which download schedule we want to use based on descriptor type - * in dls and options. - * Then return a list of int pointers defining download delays in seconds. - * Helper function for download_status_increment_failure(), - * download_status_reset(), and download_status_increment_attempt(). */ -STATIC const smartlist_t * -find_dl_schedule(const download_status_t *dls, const or_options_t *options) -{ - switch (dls->schedule) { - case DL_SCHED_GENERIC: - /* Any other directory document */ - if (dir_server_mode(options)) { - /* A directory authority or directory mirror */ - return options->TestingServerDownloadSchedule; - } else { - return options->TestingClientDownloadSchedule; - } - case DL_SCHED_CONSENSUS: - if (!networkstatus_consensus_can_use_multiple_directories(options)) { - /* A public relay */ - return options->TestingServerConsensusDownloadSchedule; - } else { - /* A client or bridge */ - if (networkstatus_consensus_is_bootstrapping(time(NULL))) { - /* During bootstrapping */ - if (!networkstatus_consensus_can_use_extra_fallbacks(options)) { - /* A bootstrapping client without extra fallback directories */ - return - options->ClientBootstrapConsensusAuthorityOnlyDownloadSchedule; - } else if (dls->want_authority) { - /* A bootstrapping client with extra fallback directories, but - * connecting to an authority */ - return - options->ClientBootstrapConsensusAuthorityDownloadSchedule; - } else { - /* A bootstrapping client connecting to extra fallback directories - */ - return - options->ClientBootstrapConsensusFallbackDownloadSchedule; - } - } else { - /* A client with a reasonably live consensus, with or without - * certificates */ - return options->TestingClientConsensusDownloadSchedule; - } - } - case DL_SCHED_BRIDGE: - if (options->UseBridges && num_bridges_usable(0) > 0) { - /* A bridge client that is sure that one or more of its bridges are - * running can afford to wait longer to update bridge descriptors. */ - return options->TestingBridgeDownloadSchedule; - } else { - /* A bridge client which might have no running bridges, must try to - * get bridge descriptors straight away. */ - return options->TestingBridgeBootstrapDownloadSchedule; - } - default: - tor_assert(0); - } - - /* Impossible, but gcc will fail with -Werror without a `return`. */ - return NULL; -} - -/** Decide which minimum and maximum delay step we want to use based on - * descriptor type in dls and options. - * Helper function for download_status_schedule_get_delay(). */ -STATIC void -find_dl_min_and_max_delay(download_status_t *dls, const or_options_t *options, - int *min, int *max) -{ - tor_assert(dls); - tor_assert(options); - tor_assert(min); - tor_assert(max); - - /* - * For now, just use the existing schedule config stuff and pick the - * first/last entries off to get min/max delay for backoff purposes - */ - const smartlist_t *schedule = find_dl_schedule(dls, options); - tor_assert(schedule != NULL && smartlist_len(schedule) >= 2); - *min = *((int *)(smartlist_get(schedule, 0))); - /* Increment on failure schedules always use exponential backoff, but they - * have a smaller limit when they're deterministic */ - if (dls->backoff == DL_SCHED_DETERMINISTIC) - *max = *((int *)((smartlist_get(schedule, smartlist_len(schedule) - 1)))); - else - *max = INT_MAX; -} - -/** As next_random_exponential_delay() below, but does not compute a random - * value. Instead, compute the range of values that - * next_random_exponential_delay() should use when computing its random value. - * Store the low bound into *low_bound_out, and the high bound into - * *high_bound_out. Guarantees that the low bound is strictly less - * than the high bound. */ -STATIC void -next_random_exponential_delay_range(int *low_bound_out, - int *high_bound_out, - int delay, - int base_delay) -{ - // This is the "decorrelated jitter" approach, from - // https://www.awsarchitectureblog.com/2015/03/backoff.html - // The formula is - // sleep = min(cap, random_between(base, sleep * 3)) - - const int delay_times_3 = delay < INT_MAX/3 ? delay * 3 : INT_MAX; - *low_bound_out = base_delay; - if (delay_times_3 > base_delay) { - *high_bound_out = delay_times_3; - } else { - *high_bound_out = base_delay+1; - } -} - -/** Advance one delay step. The algorithm will generate a random delay, - * such that each failure is possibly (random) longer than the ones before. - * - * We then clamp that value to be no larger than max_delay, and return it. - * - * The base_delay parameter is lowest possible delay time (can't be - * zero); the backoff_position parameter is the number of times we've - * generated a delay; and the delay argument is the most recently used - * delay. - * - * Requires that delay is less than INT_MAX, and delay is in [0,max_delay]. - */ -STATIC int -next_random_exponential_delay(int delay, - int base_delay, - int max_delay) -{ - /* Check preconditions */ - if (BUG(max_delay < 0)) - max_delay = 0; - if (BUG(delay > max_delay)) - delay = max_delay; - if (BUG(delay < 0)) - delay = 0; - - if (base_delay < 1) - base_delay = 1; - - int low_bound=0, high_bound=max_delay; - - next_random_exponential_delay_range(&low_bound, &high_bound, - delay, base_delay); - - int rand_delay = crypto_rand_int_range(low_bound, high_bound); - - return MIN(rand_delay, max_delay); -} - -/** Find the current delay for dls based on schedule or min_delay/ - * max_delay if we're using exponential backoff. If dls->backoff is - * DL_SCHED_RANDOM_EXPONENTIAL, we must have 0 <= min_delay <= max_delay <= - * INT_MAX, but schedule may be set to NULL; otherwise schedule is required. - * This function sets dls->next_attempt_at based on now, and returns the delay. - * Helper for download_status_increment_failure and - * download_status_increment_attempt. */ -STATIC int -download_status_schedule_get_delay(download_status_t *dls, - const smartlist_t *schedule, - int min_delay, int max_delay, - time_t now) -{ - tor_assert(dls); - /* We don't need a schedule if we're using random exponential backoff */ - tor_assert(dls->backoff == DL_SCHED_RANDOM_EXPONENTIAL || - schedule != NULL); - /* If we're using random exponential backoff, we do need min/max delay */ - tor_assert(dls->backoff != DL_SCHED_RANDOM_EXPONENTIAL || - (min_delay >= 0 && max_delay >= min_delay)); - - int delay = INT_MAX; - uint8_t dls_schedule_position = (dls->increment_on - == DL_SCHED_INCREMENT_ATTEMPT - ? dls->n_download_attempts - : dls->n_download_failures); - - if (dls->backoff == DL_SCHED_DETERMINISTIC) { - if (dls_schedule_position < smartlist_len(schedule)) - delay = *(int *)smartlist_get(schedule, dls_schedule_position); - else if (dls_schedule_position == IMPOSSIBLE_TO_DOWNLOAD) - delay = INT_MAX; - else - delay = *(int *)smartlist_get(schedule, smartlist_len(schedule) - 1); - } else if (dls->backoff == DL_SCHED_RANDOM_EXPONENTIAL) { - /* Check if we missed a reset somehow */ - IF_BUG_ONCE(dls->last_backoff_position > dls_schedule_position) { - dls->last_backoff_position = 0; - dls->last_delay_used = 0; - } - - if (dls_schedule_position > 0) { - delay = dls->last_delay_used; - - while (dls->last_backoff_position < dls_schedule_position) { - /* Do one increment step */ - delay = next_random_exponential_delay(delay, min_delay, max_delay); - /* Update our position */ - ++(dls->last_backoff_position); - } - } else { - /* If we're just starting out, use the minimum delay */ - delay = min_delay; - } - - /* Clamp it within min/max if we have them */ - if (min_delay >= 0 && delay < min_delay) delay = min_delay; - if (max_delay != INT_MAX && delay > max_delay) delay = max_delay; - - /* Store it for next time */ - dls->last_backoff_position = dls_schedule_position; - dls->last_delay_used = delay; - } - - /* A negative delay makes no sense. Knowing that delay is - * non-negative allows us to safely do the wrapping check below. */ - tor_assert(delay >= 0); - - /* Avoid now+delay overflowing TIME_MAX, by comparing with a subtraction - * that won't overflow (since delay is non-negative). */ - if (delay < INT_MAX && now <= TIME_MAX - delay) { - dls->next_attempt_at = now+delay; - } else { - dls->next_attempt_at = TIME_MAX; - } - - return delay; -} - -/* Log a debug message about item, which increments on increment_action, has - * incremented dls_n_download_increments times. The message varies based on - * was_schedule_incremented (if not, not_incremented_response is logged), and - * the values of increment, dls_next_attempt_at, and now. - * Helper for download_status_increment_failure and - * download_status_increment_attempt. */ -static void -download_status_log_helper(const char *item, int was_schedule_incremented, - const char *increment_action, - const char *not_incremented_response, - uint8_t dls_n_download_increments, int increment, - time_t dls_next_attempt_at, time_t now) -{ - if (item) { - if (!was_schedule_incremented) - log_debug(LD_DIR, "%s %s %d time(s); I'll try again %s.", - item, increment_action, (int)dls_n_download_increments, - not_incremented_response); - else if (increment == 0) - log_debug(LD_DIR, "%s %s %d time(s); I'll try again immediately.", - item, increment_action, (int)dls_n_download_increments); - else if (dls_next_attempt_at < TIME_MAX) - log_debug(LD_DIR, "%s %s %d time(s); I'll try again in %d seconds.", - item, increment_action, (int)dls_n_download_increments, - (int)(dls_next_attempt_at-now)); - else - log_debug(LD_DIR, "%s %s %d time(s); Giving up for a while.", - item, increment_action, (int)dls_n_download_increments); - } -} - -/** Determine when a failed download attempt should be retried. - * Called when an attempt to download dls has failed with HTTP status - * status_code. Increment the failure count (if the code indicates a - * real failure, or if we're a server) and set dls-\>next_attempt_at to - * an appropriate time in the future and return it. - * If dls->increment_on is DL_SCHED_INCREMENT_ATTEMPT, increment the - * failure count, and return a time in the far future for the next attempt (to - * avoid an immediate retry). */ -time_t -download_status_increment_failure(download_status_t *dls, int status_code, - const char *item, int server, time_t now) -{ - (void) status_code; // XXXX no longer used. - (void) server; // XXXX no longer used. - int increment = -1; - int min_delay = 0, max_delay = INT_MAX; - - tor_assert(dls); - - /* dls wasn't reset before it was used */ - if (dls->next_attempt_at == 0) { - download_status_reset(dls); - } - - /* count the failure */ - if (dls->n_download_failures < IMPOSSIBLE_TO_DOWNLOAD-1) { - ++dls->n_download_failures; - } - - if (dls->increment_on == DL_SCHED_INCREMENT_FAILURE) { - /* We don't find out that a failure-based schedule has attempted a - * connection until that connection fails. - * We'll never find out about successful connections, but this doesn't - * matter, because schedules are reset after a successful download. - */ - if (dls->n_download_attempts < IMPOSSIBLE_TO_DOWNLOAD-1) - ++dls->n_download_attempts; - - /* only return a failure retry time if this schedule increments on failures - */ - const smartlist_t *schedule = find_dl_schedule(dls, get_options()); - find_dl_min_and_max_delay(dls, get_options(), &min_delay, &max_delay); - increment = download_status_schedule_get_delay(dls, schedule, - min_delay, max_delay, now); - } - - download_status_log_helper(item, !dls->increment_on, "failed", - "concurrently", dls->n_download_failures, - increment, - download_status_get_next_attempt_at(dls), - now); - - if (dls->increment_on == DL_SCHED_INCREMENT_ATTEMPT) { - /* stop this schedule retrying on failure, it will launch concurrent - * connections instead */ - return TIME_MAX; - } else { - return download_status_get_next_attempt_at(dls); - } -} - -/** Determine when the next download attempt should be made when using an - * attempt-based (potentially concurrent) download schedule. - * Called when an attempt to download dls is being initiated. - * Increment the attempt count and set dls-\>next_attempt_at to an - * appropriate time in the future and return it. - * If dls->increment_on is DL_SCHED_INCREMENT_FAILURE, don't increment - * the attempts, and return a time in the far future (to avoid launching a - * concurrent attempt). */ -time_t -download_status_increment_attempt(download_status_t *dls, const char *item, - time_t now) -{ - int delay = -1; - int min_delay = 0, max_delay = INT_MAX; - - tor_assert(dls); - - /* dls wasn't reset before it was used */ - if (dls->next_attempt_at == 0) { - download_status_reset(dls); - } - - if (dls->increment_on == DL_SCHED_INCREMENT_FAILURE) { - /* this schedule should retry on failure, and not launch any concurrent - attempts */ - log_warn(LD_BUG, "Tried to launch an attempt-based connection on a " - "failure-based schedule."); - return TIME_MAX; - } - - if (dls->n_download_attempts < IMPOSSIBLE_TO_DOWNLOAD-1) - ++dls->n_download_attempts; - - const smartlist_t *schedule = find_dl_schedule(dls, get_options()); - find_dl_min_and_max_delay(dls, get_options(), &min_delay, &max_delay); - delay = download_status_schedule_get_delay(dls, schedule, - min_delay, max_delay, now); - - download_status_log_helper(item, dls->increment_on, "attempted", - "on failure", dls->n_download_attempts, - delay, download_status_get_next_attempt_at(dls), - now); - - return download_status_get_next_attempt_at(dls); -} - -static time_t -download_status_get_initial_delay_from_now(const download_status_t *dls) -{ - const smartlist_t *schedule = find_dl_schedule(dls, get_options()); - /* We use constant initial delays, even in exponential backoff - * schedules. */ - return time(NULL) + *(int *)smartlist_get(schedule, 0); -} - -/** Reset dls so that it will be considered downloadable - * immediately, and/or to show that we don't need it anymore. - * - * Must be called to initialise a download schedule, otherwise the zeroth item - * in the schedule will never be used. - * - * (We find the zeroth element of the download schedule, and set - * next_attempt_at to be the appropriate offset from 'now'. In most - * cases this means setting it to 'now', so the item will be immediately - * downloadable; when using authorities with fallbacks, there is a few seconds' - * delay.) */ -void -download_status_reset(download_status_t *dls) -{ - if (dls->n_download_failures == IMPOSSIBLE_TO_DOWNLOAD - || dls->n_download_attempts == IMPOSSIBLE_TO_DOWNLOAD) - return; /* Don't reset this. */ - - dls->n_download_failures = 0; - dls->n_download_attempts = 0; - dls->next_attempt_at = download_status_get_initial_delay_from_now(dls); - dls->last_backoff_position = 0; - dls->last_delay_used = 0; - /* Don't reset dls->want_authority or dls->increment_on */ -} - -/** Return the number of failures on dls since the last success (if - * any). */ -int -download_status_get_n_failures(const download_status_t *dls) -{ - return dls->n_download_failures; -} - -/** Return the number of attempts to download dls since the last success - * (if any). This can differ from download_status_get_n_failures() due to - * outstanding concurrent attempts. */ -int -download_status_get_n_attempts(const download_status_t *dls) -{ - return dls->n_download_attempts; -} - -/** Return the next time to attempt to download dls. */ -time_t -download_status_get_next_attempt_at(const download_status_t *dls) -{ - /* dls wasn't reset before it was used */ - if (dls->next_attempt_at == 0) { - /* so give the answer we would have given if it had been */ - return download_status_get_initial_delay_from_now(dls); - } - - return dls->next_attempt_at; -} - -/** Called when one or more routerdesc (or extrainfo, if was_extrainfo) - * fetches have failed (with uppercase fingerprints listed in failed, - * either as descriptor digests or as identity digests based on - * was_descriptor_digests). - */ -static void -dir_routerdesc_download_failed(smartlist_t *failed, int status_code, - int router_purpose, - int was_extrainfo, int was_descriptor_digests) -{ - char digest[DIGEST_LEN]; - time_t now = time(NULL); - int server = directory_fetches_from_authorities(get_options()); - if (!was_descriptor_digests) { - if (router_purpose == ROUTER_PURPOSE_BRIDGE) { - tor_assert(!was_extrainfo); - connection_dir_retry_bridges(failed); - } - return; /* FFFF should implement for other-than-router-purpose someday */ - } - SMARTLIST_FOREACH_BEGIN(failed, const char *, cp) { - download_status_t *dls = NULL; - if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp)) != DIGEST_LEN) { - log_warn(LD_BUG, "Malformed fingerprint in list: %s", escaped(cp)); - continue; - } - if (was_extrainfo) { - signed_descriptor_t *sd = - router_get_by_extrainfo_digest(digest); - if (sd) - dls = &sd->ei_dl_status; - } else { - dls = router_get_dl_status_by_descriptor_digest(digest); - } - if (!dls || dls->n_download_failures >= - get_options()->TestingDescriptorMaxDownloadTries) - continue; - download_status_increment_failure(dls, status_code, cp, server, now); - } SMARTLIST_FOREACH_END(cp); - - /* No need to relaunch descriptor downloads here: we already do it - * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in main.c. */ -} - -/** Called when a connection to download microdescriptors from relay with - * dir_id has failed in whole or in part. failed is a list - * of every microdesc digest we didn't get. status_code is the http - * status code we received. Reschedule the microdesc downloads as - * appropriate. */ -static void -dir_microdesc_download_failed(smartlist_t *failed, - int status_code, const char *dir_id) -{ - networkstatus_t *consensus - = networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); - routerstatus_t *rs; - download_status_t *dls; - time_t now = time(NULL); - int server = directory_fetches_from_authorities(get_options()); - - if (! consensus) - return; - - /* We failed to fetch a microdescriptor from 'dir_id', note it down - * so that we don't try the same relay next time... */ - microdesc_note_outdated_dirserver(dir_id); - - SMARTLIST_FOREACH_BEGIN(failed, const char *, d) { - rs = router_get_mutable_consensus_status_by_descriptor_digest(consensus,d); - if (!rs) - continue; - dls = &rs->dl_status; - if (dls->n_download_failures >= - get_options()->TestingMicrodescMaxDownloadTries) { - continue; - } - - { /* Increment the failure count for this md fetch */ - char buf[BASE64_DIGEST256_LEN+1]; - digest256_to_base64(buf, d); - log_info(LD_DIR, "Failed to download md %s from %s", - buf, hex_str(dir_id, DIGEST_LEN)); - download_status_increment_failure(dls, status_code, buf, - server, now); - } - } SMARTLIST_FOREACH_END(d); -} - -/** Helper. Compare two fp_pair_t objects, and return negative, 0, or - * positive as appropriate. */ -static int -compare_pairs_(const void **a, const void **b) -{ - const fp_pair_t *fp1 = *a, *fp2 = *b; - int r; - if ((r = fast_memcmp(fp1->first, fp2->first, DIGEST_LEN))) - return r; - else - return fast_memcmp(fp1->second, fp2->second, DIGEST_LEN); -} - -/** Divide a string res of the form FP1-FP2+FP3-FP4...[.z], where each - * FP is a hex-encoded fingerprint, into a sequence of distinct sorted - * fp_pair_t. Skip malformed pairs. On success, return 0 and add those - * fp_pair_t into pairs_out. On failure, return -1. */ -int -dir_split_resource_into_fingerprint_pairs(const char *res, - smartlist_t *pairs_out) -{ - smartlist_t *pairs_tmp = smartlist_new(); - smartlist_t *pairs_result = smartlist_new(); - - smartlist_split_string(pairs_tmp, res, "+", 0, 0); - if (smartlist_len(pairs_tmp)) { - char *last = smartlist_get(pairs_tmp,smartlist_len(pairs_tmp)-1); - size_t last_len = strlen(last); - if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { - last[last_len-2] = '\0'; - } - } - SMARTLIST_FOREACH_BEGIN(pairs_tmp, char *, cp) { - if (strlen(cp) != HEX_DIGEST_LEN*2+1) { - log_info(LD_DIR, - "Skipping digest pair %s with non-standard length.", escaped(cp)); - } else if (cp[HEX_DIGEST_LEN] != '-') { - log_info(LD_DIR, - "Skipping digest pair %s with missing dash.", escaped(cp)); - } else { - fp_pair_t pair; - if (base16_decode(pair.first, DIGEST_LEN, - cp, HEX_DIGEST_LEN) != DIGEST_LEN || - base16_decode(pair.second,DIGEST_LEN, - cp+HEX_DIGEST_LEN+1, HEX_DIGEST_LEN) != DIGEST_LEN) { - log_info(LD_DIR, "Skipping non-decodable digest pair %s", escaped(cp)); - } else { - smartlist_add(pairs_result, tor_memdup(&pair, sizeof(pair))); - } - } - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - smartlist_free(pairs_tmp); - - /* Uniq-and-sort */ - smartlist_sort(pairs_result, compare_pairs_); - smartlist_uniq(pairs_result, compare_pairs_, tor_free_); - - smartlist_add_all(pairs_out, pairs_result); - smartlist_free(pairs_result); - return 0; -} - -/** Given a directory resource request, containing zero - * or more strings separated by plus signs, followed optionally by ".z", store - * the strings, in order, into fp_out. If compressed_out is - * non-NULL, set it to 1 if the resource ends in ".z", else set it to 0. - * - * If (flags & DSR_HEX), then delete all elements that aren't hex digests, and - * decode the rest. If (flags & DSR_BASE64), then use "-" rather than "+" as - * a separator, delete all the elements that aren't base64-encoded digests, - * and decode the rest. If (flags & DSR_DIGEST256), these digests should be - * 256 bits long; else they should be 160. - * - * If (flags & DSR_SORT_UNIQ), then sort the list and remove all duplicates. - */ -int -dir_split_resource_into_fingerprints(const char *resource, - smartlist_t *fp_out, int *compressed_out, - int flags) -{ - const int decode_hex = flags & DSR_HEX; - const int decode_base64 = flags & DSR_BASE64; - const int digests_are_256 = flags & DSR_DIGEST256; - const int sort_uniq = flags & DSR_SORT_UNIQ; - - const int digest_len = digests_are_256 ? DIGEST256_LEN : DIGEST_LEN; - const int hex_digest_len = digests_are_256 ? - HEX_DIGEST256_LEN : HEX_DIGEST_LEN; - const int base64_digest_len = digests_are_256 ? - BASE64_DIGEST256_LEN : BASE64_DIGEST_LEN; - smartlist_t *fp_tmp = smartlist_new(); - - tor_assert(!(decode_hex && decode_base64)); - tor_assert(fp_out); - - smartlist_split_string(fp_tmp, resource, decode_base64?"-":"+", 0, 0); - if (compressed_out) - *compressed_out = 0; - if (smartlist_len(fp_tmp)) { - char *last = smartlist_get(fp_tmp,smartlist_len(fp_tmp)-1); - size_t last_len = strlen(last); - if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { - last[last_len-2] = '\0'; - if (compressed_out) - *compressed_out = 1; - } - } - if (decode_hex || decode_base64) { - const size_t encoded_len = decode_hex ? hex_digest_len : base64_digest_len; - int i; - char *cp, *d = NULL; - for (i = 0; i < smartlist_len(fp_tmp); ++i) { - cp = smartlist_get(fp_tmp, i); - if (strlen(cp) != encoded_len) { - log_info(LD_DIR, - "Skipping digest %s with non-standard length.", escaped(cp)); - smartlist_del_keeporder(fp_tmp, i--); - goto again; - } - d = tor_malloc_zero(digest_len); - if (decode_hex ? - (base16_decode(d, digest_len, cp, hex_digest_len) != digest_len) : - (base64_decode(d, digest_len, cp, base64_digest_len) - != digest_len)) { - log_info(LD_DIR, "Skipping non-decodable digest %s", escaped(cp)); - smartlist_del_keeporder(fp_tmp, i--); - goto again; - } - smartlist_set(fp_tmp, i, d); - d = NULL; - again: - tor_free(cp); - tor_free(d); - } - } - if (sort_uniq) { - if (decode_hex || decode_base64) { - if (digests_are_256) { - smartlist_sort_digests256(fp_tmp); - smartlist_uniq_digests256(fp_tmp); - } else { - smartlist_sort_digests(fp_tmp); - smartlist_uniq_digests(fp_tmp); - } - } else { - smartlist_sort_strings(fp_tmp); - smartlist_uniq_strings(fp_tmp); - } - } - smartlist_add_all(fp_out, fp_tmp); - smartlist_free(fp_tmp); - return 0; -} - -/** As dir_split_resource_into_fingerprints, but instead fills - * spool_out with a list of spoolable_resource_t for the resource - * identified through source. */ -int -dir_split_resource_into_spoolable(const char *resource, - dir_spool_source_t source, - smartlist_t *spool_out, - int *compressed_out, - int flags) -{ - smartlist_t *fingerprints = smartlist_new(); - - tor_assert(flags & (DSR_HEX|DSR_BASE64)); - const size_t digest_len = - (flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN; - - int r = dir_split_resource_into_fingerprints(resource, fingerprints, - compressed_out, flags); - /* This is not a very efficient implementation XXXX */ - SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) { - spooled_resource_t *spooled = - spooled_resource_new(source, digest, digest_len); - if (spooled) - smartlist_add(spool_out, spooled); - tor_free(digest); - } SMARTLIST_FOREACH_END(digest); - - smartlist_free(fingerprints); - return r; -} - diff --git a/src/tor/src/or/directory.h b/src/tor/src/or/directory.h deleted file mode 100644 index edf75ffe1..000000000 --- a/src/tor/src/or/directory.h +++ /dev/null @@ -1,305 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file directory.h - * \brief Header file for directory.c. - **/ - -#ifndef TOR_DIRECTORY_H -#define TOR_DIRECTORY_H - -#include "hs_ident.h" - -int directories_have_accepted_server_descriptor(void); -void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, - dirinfo_type_t type, const char *payload, - size_t payload_len, size_t extrainfo_len); -MOCK_DECL(void, directory_get_from_dirserver, ( - uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource, - int pds_flags, - download_want_authority_t want_authority)); -void directory_get_from_all_authorities(uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource); - -/** Enumeration of ways to connect to a directory server */ -typedef enum { - /** Default: connect over a one-hop Tor circuit. Relays fall back to direct - * DirPort connections, clients, onion services, and bridges do not */ - DIRIND_ONEHOP=0, - /** Connect over a multi-hop anonymizing Tor circuit */ - DIRIND_ANONYMOUS=1, - /** Connect to the DirPort directly */ - DIRIND_DIRECT_CONN, - /** Connect over a multi-hop anonymizing Tor circuit to our dirport */ - DIRIND_ANON_DIRPORT, -} dir_indirection_t; - -int directory_must_use_begindir(const or_options_t *options); - -/** - * A directory_request_t describes the information about a directory request - * at the client side. It describes what we're going to ask for, which - * directory we're going to ask for it, how we're going to contact that - * directory, and (in some cases) what to do with it when we're done. - */ -typedef struct directory_request_t directory_request_t; -directory_request_t *directory_request_new(uint8_t dir_purpose); -void directory_request_free_(directory_request_t *req); -#define directory_request_free(req) \ - FREE_AND_NULL(directory_request_t, directory_request_free_, (req)) -void directory_request_set_or_addr_port(directory_request_t *req, - const tor_addr_port_t *p); -void directory_request_set_dir_addr_port(directory_request_t *req, - const tor_addr_port_t *p); -void directory_request_set_directory_id_digest(directory_request_t *req, - const char *digest); -void directory_request_set_guard_state(directory_request_t *req, - struct circuit_guard_state_t *state); -void directory_request_set_router_purpose(directory_request_t *req, - uint8_t router_purpose); -void directory_request_set_indirection(directory_request_t *req, - dir_indirection_t indirection); -void directory_request_set_resource(directory_request_t *req, - const char *resource); -void directory_request_set_payload(directory_request_t *req, - const char *payload, - size_t payload_len); -void directory_request_set_if_modified_since(directory_request_t *req, - time_t if_modified_since); -void directory_request_set_rend_query(directory_request_t *req, - const rend_data_t *query); -void directory_request_upload_set_hs_ident(directory_request_t *req, - const hs_ident_dir_conn_t *ident); -void directory_request_fetch_set_hs_ident(directory_request_t *req, - const hs_ident_dir_conn_t *ident); - -void directory_request_set_routerstatus(directory_request_t *req, - const routerstatus_t *rs); -void directory_request_add_header(directory_request_t *req, - const char *key, - const char *val); -MOCK_DECL(void, directory_initiate_request, (directory_request_t *request)); - -int parse_http_response(const char *headers, int *code, time_t *date, - compress_method_t *compression, char **response); -int parse_http_command(const char *headers, - char **command_out, char **url_out); -char *http_get_header(const char *headers, const char *which); - -int connection_dir_is_encrypted(const dir_connection_t *conn); -int connection_dir_reached_eof(dir_connection_t *conn); -int connection_dir_process_inbuf(dir_connection_t *conn); -int connection_dir_finished_flushing(dir_connection_t *conn); -int connection_dir_finished_connecting(dir_connection_t *conn); -void connection_dir_about_to_close(dir_connection_t *dir_conn); - -#define DSR_HEX (1<<0) -#define DSR_BASE64 (1<<1) -#define DSR_DIGEST256 (1<<2) -#define DSR_SORT_UNIQ (1<<3) -int dir_split_resource_into_fingerprints(const char *resource, - smartlist_t *fp_out, int *compressed_out, - int flags); -enum dir_spool_source_t; -int dir_split_resource_into_spoolable(const char *resource, - enum dir_spool_source_t source, - smartlist_t *spool_out, - int *compressed_out, - int flags); -int dir_split_resource_into_fingerprint_pairs(const char *res, - smartlist_t *pairs_out); -char *directory_dump_request_log(void); -void note_request(const char *key, size_t bytes); -int router_supports_extrainfo(const char *identity_digest, int is_authority); - -time_t download_status_increment_failure(download_status_t *dls, - int status_code, const char *item, - int server, time_t now); -time_t download_status_increment_attempt(download_status_t *dls, - const char *item, time_t now); -/** Increment the failure count of the download_status_t dls, with - * the optional status code sc. */ -#define download_status_failed(dls, sc) \ - download_status_increment_failure((dls), (sc), NULL, \ - dir_server_mode(get_options()), \ - time(NULL)) - -void download_status_reset(download_status_t *dls); -static int download_status_is_ready(download_status_t *dls, time_t now, - int max_failures); -time_t download_status_get_next_attempt_at(const download_status_t *dls); - -/** Return true iff, as of now, the resource tracked by dls is - * ready to get its download reattempted. */ -static inline int -download_status_is_ready(download_status_t *dls, time_t now, - int max_failures) -{ - /* dls wasn't reset before it was used */ - if (dls->next_attempt_at == 0) { - download_status_reset(dls); - } - - if (dls->backoff == DL_SCHED_DETERMINISTIC) { - /* Deterministic schedules can hit an endpoint; exponential backoff - * schedules just wait longer and longer. */ - int under_failure_limit = (dls->n_download_failures <= max_failures - && dls->n_download_attempts <= max_failures); - if (!under_failure_limit) - return 0; - } - return download_status_get_next_attempt_at(dls) <= now; -} - -static void download_status_mark_impossible(download_status_t *dl); -/** Mark dl as never downloadable. */ -static inline void -download_status_mark_impossible(download_status_t *dl) -{ - dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; - dl->n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD; -} - -int download_status_get_n_failures(const download_status_t *dls); -int download_status_get_n_attempts(const download_status_t *dls); - -int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource); - -#ifdef DIRECTORY_PRIVATE - -/** A structure to hold arguments passed into each directory response - * handler */ -typedef struct response_handler_args_t { - int status_code; - const char *reason; - const char *body; - size_t body_len; - const char *headers; -} response_handler_args_t; - -struct directory_request_t { - /** - * These fields specify which directory we're contacting. Routerstatus, - * if present, overrides the other fields. - * - * @{ */ - tor_addr_port_t or_addr_port; - tor_addr_port_t dir_addr_port; - char digest[DIGEST_LEN]; - - const routerstatus_t *routerstatus; - /** @} */ - /** One of DIR_PURPOSE_* other than DIR_PURPOSE_SERVER. Describes what - * kind of operation we'll be doing (upload/download), and of what kind - * of document. */ - uint8_t dir_purpose; - /** One of ROUTER_PURPOSE_*; used for uploads and downloads of routerinfo - * and extrainfo docs. */ - uint8_t router_purpose; - /** Enum: determines whether to anonymize, and whether to use dirport or - * orport. */ - dir_indirection_t indirection; - /** Alias to the variable part of the URL for this request */ - const char *resource; - /** Alias to the payload to upload (if any) */ - const char *payload; - /** Number of bytes to upload from payload */ - size_t payload_len; - /** Value to send in an if-modified-since header, or 0 for none. */ - time_t if_modified_since; - /** Hidden-service-specific information v2. */ - const rend_data_t *rend_query; - /** Extra headers to append to the request */ - config_line_t *additional_headers; - /** Hidden-service-specific information for v3+. */ - const hs_ident_dir_conn_t *hs_ident; - /** Used internally to directory.c: gets informed when the attempt to - * connect to the directory succeeds or fails, if that attempt bears on the - * directory's usability as a directory guard. */ - struct circuit_guard_state_t *guard_state; -}; - -struct get_handler_args_t; -STATIC int handle_get_hs_descriptor_v3(dir_connection_t *conn, - const struct get_handler_args_t *args); -STATIC int directory_handle_command(dir_connection_t *conn); -STATIC char *accept_encoding_header(void); -STATIC int allowed_anonymous_connection_compression_method(compress_method_t); -STATIC void warn_disallowed_anonymous_compression_method(compress_method_t); - -STATIC int handle_response_fetch_hsdesc_v3(dir_connection_t *conn, - const response_handler_args_t *args); -STATIC int handle_response_fetch_microdesc(dir_connection_t *conn, - const response_handler_args_t *args); - -STATIC int handle_response_fetch_consensus(dir_connection_t *conn, - const response_handler_args_t *args); - -#endif /* defined(DIRECTORY_PRIVATE) */ - -#ifdef TOR_UNIT_TESTS -/* Used only by test_dir.c and test_hs_cache.c */ - -STATIC int parse_http_url(const char *headers, char **url); -STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose, - const char *resource); -MOCK_DECL(STATIC int, directory_handle_command_get,(dir_connection_t *conn, - const char *headers, - const char *req_body, - size_t req_body_len)); -MOCK_DECL(STATIC int, directory_handle_command_post,(dir_connection_t *conn, - const char *headers, - const char *body, - size_t body_len)); -STATIC int download_status_schedule_get_delay(download_status_t *dls, - const smartlist_t *schedule, - int min_delay, int max_delay, - time_t now); - -STATIC int handle_post_hs_descriptor(const char *url, const char *body); - -STATIC char* authdir_type_to_string(dirinfo_type_t auth); -STATIC const char * dir_conn_purpose_to_string(int purpose); -STATIC int should_use_directory_guards(const or_options_t *options); -STATIC compression_level_t choose_compression_level(ssize_t n_bytes); -STATIC const smartlist_t *find_dl_schedule(const download_status_t *dls, - const or_options_t *options); -STATIC void find_dl_min_and_max_delay(download_status_t *dls, - const or_options_t *options, - int *min, int *max); - -STATIC int next_random_exponential_delay(int delay, - int base_delay, - int max_delay); - -STATIC void next_random_exponential_delay_range(int *low_bound_out, - int *high_bound_out, - int delay, - int base_delay); - -STATIC int parse_hs_version_from_post(const char *url, const char *prefix, - const char **end_pos); - -STATIC unsigned parse_accept_encoding_header(const char *h); -#endif /* defined(TOR_UNIT_TESTS) */ - -#if defined(TOR_UNIT_TESTS) || defined(DIRECTORY_PRIVATE) -/* Used only by directory.c and test_dir.c */ - -/* no more than quadruple the previous delay (multiplier + 1) */ -#define DIR_DEFAULT_RANDOM_MULTIPLIER (3) -/* no more than triple the previous delay */ -#define DIR_TEST_NET_RANDOM_MULTIPLIER (2) - -#endif /* defined(TOR_UNIT_TESTS) || defined(DIRECTORY_PRIVATE) */ - -#endif /* !defined(TOR_DIRECTORY_H) */ - diff --git a/src/tor/src/or/dirvote.h b/src/tor/src/or/dirvote.h deleted file mode 100644 index deeb27bfe..000000000 --- a/src/tor/src/or/dirvote.h +++ /dev/null @@ -1,264 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dirvote.h - * \brief Header file for dirvote.c. - **/ - -#ifndef TOR_DIRVOTE_H -#define TOR_DIRVOTE_H - -#include "testsupport.h" - -/* - * Ideally, assuming synced clocks, we should only need 1 second for each of: - * - Vote - * - Distribute - * - Consensus Publication - * As we can gather descriptors continuously. - * (Could we even go as far as publishing the previous consensus, - * in the same second that we vote for the next one?) - * But we're not there yet: these are the lowest working values at this time. - */ - -/** Lowest allowable value for VoteSeconds. */ -#define MIN_VOTE_SECONDS 2 -/** Lowest allowable value for VoteSeconds when TestingTorNetwork is 1 */ -#define MIN_VOTE_SECONDS_TESTING 2 - -/** Lowest allowable value for DistSeconds. */ -#define MIN_DIST_SECONDS 2 -/** Lowest allowable value for DistSeconds when TestingTorNetwork is 1 */ -#define MIN_DIST_SECONDS_TESTING 2 - -/** Lowest allowable voting interval. */ -#define MIN_VOTE_INTERVAL 300 -/** Lowest allowable voting interval when TestingTorNetwork is 1: - * Voting Interval can be: - * 10, 12, 15, 18, 20, 24, 25, 30, 36, 40, 45, 50, 60, ... - * Testing Initial Voting Interval can be: - * 5, 6, 8, 9, or any of the possible values for Voting Interval, - * as they both need to evenly divide 30 minutes. - * If clock desynchronisation is an issue, use an interval of at least: - * 18 * drift in seconds, to allow for a clock slop factor */ -#define MIN_VOTE_INTERVAL_TESTING \ - (((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1)*2) - -#define MIN_VOTE_INTERVAL_TESTING_INITIAL \ - ((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1) - -/* A placeholder for routerstatus_format_entry() when the consensus method - * argument is not applicable. */ -#define ROUTERSTATUS_FORMAT_NO_CONSENSUS_METHOD 0 - -/** The lowest consensus method that we currently support. */ -#define MIN_SUPPORTED_CONSENSUS_METHOD 13 - -/** The highest consensus method that we currently support. */ -#define MAX_SUPPORTED_CONSENSUS_METHOD 28 - -/** Lowest consensus method where microdesc consensuses omit any entry - * with no microdesc. */ -#define MIN_METHOD_FOR_MANDATORY_MICRODESC 13 - -/** Lowest consensus method that contains "a" lines. */ -#define MIN_METHOD_FOR_A_LINES 14 - -/** Lowest consensus method where microdescs may include a "p6" line. */ -#define MIN_METHOD_FOR_P6_LINES 15 - -/** Lowest consensus method where microdescs may include an onion-key-ntor - * line */ -#define MIN_METHOD_FOR_NTOR_KEY 16 - -/** Lowest consensus method that ensures that authorities output an - * Unmeasured=1 flag for unmeasured bandwidths */ -#define MIN_METHOD_TO_CLIP_UNMEASURED_BW 17 - -/** Lowest consensus method where authorities may include an "id" line in - * microdescriptors. */ -#define MIN_METHOD_FOR_ID_HASH_IN_MD 18 - -/** Lowest consensus method where we include "package" lines*/ -#define MIN_METHOD_FOR_PACKAGE_LINES 19 - -/** Lowest consensus method where authorities may include - * GuardFraction information in microdescriptors. */ -#define MIN_METHOD_FOR_GUARDFRACTION 20 - -/** Lowest consensus method where authorities may include an "id" line for - * ed25519 identities in microdescriptors. (Broken; see - * consensus_method_is_supported() for more info.) */ -#define MIN_METHOD_FOR_ED25519_ID_IN_MD 21 - -/** Lowest consensus method where authorities vote on ed25519 ids and ensure - * ed25519 id consistency. */ -#define MIN_METHOD_FOR_ED25519_ID_VOTING 22 - -/** Lowest consensus method where authorities may include a shared random - * value(s). */ -#define MIN_METHOD_FOR_SHARED_RANDOM 23 - -/** Lowest consensus method where authorities drop all nodes that don't get - * the Valid flag. */ -#define MIN_METHOD_FOR_EXCLUDING_INVALID_NODES 24 - -/** Lowest consensus method where authorities vote on required/recommended - * protocols. */ -#define MIN_METHOD_FOR_RECOMMENDED_PROTOCOLS 25 - -/** Lowest consensus method where authorities add protocols to routerstatus - * entries. */ -#define MIN_METHOD_FOR_RS_PROTOCOLS 25 - -/** Lowest consensus method where authorities initialize bandwidth weights to 1 - * instead of 0. See #14881 */ -#define MIN_METHOD_FOR_INIT_BW_WEIGHTS_ONE 26 - -/** Lowest consensus method where the microdesc consensus contains relay IPv6 - * addresses. See #23826 and #20916. */ -#define MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS 27 - -/** Lowest consensus method where microdescriptors do not contain relay IPv6 - * addresses. See #23828 and #20916. */ -#define MIN_METHOD_FOR_NO_A_LINES_IN_MICRODESC 28 - -/** Default bandwidth to clip unmeasured bandwidths to using method >= - * MIN_METHOD_TO_CLIP_UNMEASURED_BW. (This is not a consensus method; do not - * get confused with the above macros.) */ -#define DEFAULT_MAX_UNMEASURED_BW_KB 20 - -void dirvote_free_all(void); - -/* vote manipulation */ -char *networkstatus_compute_consensus(smartlist_t *votes, - int total_authorities, - crypto_pk_t *identity_key, - crypto_pk_t *signing_key, - const char *legacy_identity_key_digest, - crypto_pk_t *legacy_signing_key, - consensus_flavor_t flavor); -int networkstatus_add_detached_signatures(networkstatus_t *target, - ns_detached_signatures_t *sigs, - const char *source, - int severity, - const char **msg_out); -char *networkstatus_get_detached_signatures(smartlist_t *consensuses); -void ns_detached_signatures_free_(ns_detached_signatures_t *s); -#define ns_detached_signatures_free(s) \ - FREE_AND_NULL(ns_detached_signatures_t, ns_detached_signatures_free_, (s)) - -/* cert manipulation */ -authority_cert_t *authority_cert_dup(authority_cert_t *cert); - -/* vote scheduling */ - -/** Scheduling information for a voting interval. */ -typedef struct { - /** When do we generate and distribute our vote for this interval? */ - time_t voting_starts; - /** When do we send an HTTP request for any votes that we haven't - * been posted yet?*/ - time_t fetch_missing_votes; - /** When do we give up on getting more votes and generate a consensus? */ - time_t voting_ends; - /** When do we send an HTTP request for any signatures we're expecting to - * see on the consensus? */ - time_t fetch_missing_signatures; - /** When do we publish the consensus? */ - time_t interval_starts; - - /* True iff we have generated and distributed our vote. */ - int have_voted; - /* True iff we've requested missing votes. */ - int have_fetched_missing_votes; - /* True iff we have built a consensus and sent the signatures around. */ - int have_built_consensus; - /* True iff we've fetched missing signatures. */ - int have_fetched_missing_signatures; - /* True iff we have published our consensus. */ - int have_published_consensus; - - /* True iff this voting schedule was set on demand meaning not through the - * normal vote operation of a dirauth or when a consensus is set. This only - * applies to a directory authority that needs to recalculate the voting - * timings only for the first vote even though this object was initilized - * prior to voting. */ - int created_on_demand; -} voting_schedule_t; - -void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); -time_t dirvote_get_start_of_next_interval(time_t now, - int interval, - int offset); -void dirvote_recalculate_timing(const or_options_t *options, time_t now); -void dirvote_act(const or_options_t *options, time_t now); -time_t dirvote_get_next_valid_after_time(void); - -/* invoked on timers and by outside triggers. */ -struct pending_vote_t * dirvote_add_vote(const char *vote_body, - const char **msg_out, - int *status_out); -int dirvote_add_signatures(const char *detached_signatures_body, - const char *source, - const char **msg_out); - -/* Item access */ -MOCK_DECL(const char*, dirvote_get_pending_consensus, - (consensus_flavor_t flav)); -MOCK_DECL(const char*, dirvote_get_pending_detached_signatures, (void)); - -#define DGV_BY_ID 1 -#define DGV_INCLUDE_PENDING 2 -#define DGV_INCLUDE_PREVIOUS 4 -const cached_dir_t *dirvote_get_vote(const char *fp, int flags); -void set_routerstatus_from_routerinfo(routerstatus_t *rs, - node_t *node, - routerinfo_t *ri, time_t now, - int listbadexits); -networkstatus_t * -dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, - authority_cert_t *cert); - -microdesc_t *dirvote_create_microdescriptor(const routerinfo_t *ri, - int consensus_method); -ssize_t dirvote_format_microdesc_vote_line(char *out, size_t out_len, - const microdesc_t *md, - int consensus_method_low, - int consensus_method_high); -vote_microdesc_hash_t *dirvote_format_all_microdesc_vote_lines( - const routerinfo_t *ri, - time_t now, - smartlist_t *microdescriptors_out); - -int vote_routerstatus_find_microdesc_hash(char *digest256_out, - const vote_routerstatus_t *vrs, - int method, - digest_algorithm_t alg); -document_signature_t *voter_get_sig_by_algorithm( - const networkstatus_voter_info_t *voter, - digest_algorithm_t alg); - -#ifdef DIRVOTE_PRIVATE -STATIC int32_t dirvote_get_intermediate_param_value( - const smartlist_t *param_list, - const char *keyword, - int32_t default_val); -STATIC char *format_networkstatus_vote(crypto_pk_t *private_key, - networkstatus_t *v3_ns); -STATIC smartlist_t *dirvote_compute_params(smartlist_t *votes, int method, - int total_authorities); -STATIC char *compute_consensus_package_lines(smartlist_t *votes); -STATIC char *make_consensus_method_list(int low, int high, const char *sep); -STATIC int -networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, - int64_t M, int64_t E, int64_t D, - int64_t T, int64_t weight_scale); -#endif /* defined(DIRVOTE_PRIVATE) */ - -#endif /* !defined(TOR_DIRVOTE_H) */ - diff --git a/src/tor/src/or/dns.h b/src/tor/src/or/dns.h deleted file mode 100644 index 28d9f947b..000000000 --- a/src/tor/src/or/dns.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dns.h - * \brief Header file for dns.c. - **/ - -#ifndef TOR_DNS_H -#define TOR_DNS_H - -/** Lowest value for DNS ttl that a server will give. */ -#define MIN_DNS_TTL_AT_EXIT (5*60) -/** Highest value for DNS ttl that a server will give. */ -#define MAX_DNS_TTL_AT_EXIT (60*60) - -/** How long do we keep DNS cache entries before purging them (regardless of - * their TTL)? */ -#define MAX_DNS_ENTRY_AGE (3*60*60) -/** How long do we cache/tell clients to cache DNS records when no TTL is - * known? */ -#define DEFAULT_DNS_TTL (30*60) - -int dns_init(void); -int has_dns_init_failed(void); -void dns_free_all(void); -uint32_t dns_clip_ttl(uint32_t ttl); -int dns_reset(void); -void connection_dns_remove(edge_connection_t *conn); -void assert_connection_edge_not_dns_pending(edge_connection_t *conn); -void assert_all_pending_dns_resolves_ok(void); -MOCK_DECL(void,dns_cancel_pending_resolve,(const char *question)); -int dns_resolve(edge_connection_t *exitconn); -void dns_launch_correctness_checks(void); -int dns_seems_to_be_broken(void); -int dns_seems_to_be_broken_for_ipv6(void); -void dns_reset_correctness_checks(void); -void dump_dns_mem_usage(int severity); - -#ifdef DNS_PRIVATE -#include "dns_structs.h" - -MOCK_DECL(STATIC int,dns_resolve_impl,(edge_connection_t *exitconn, -int is_resolve,or_circuit_t *oncirc, char **hostname_out, -int *made_connection_pending_out, cached_resolve_t **resolve_out)); - -MOCK_DECL(STATIC void,send_resolved_cell,(edge_connection_t *conn, -uint8_t answer_type,const cached_resolve_t *resolved)); - -MOCK_DECL(STATIC void,send_resolved_hostname_cell,(edge_connection_t *conn, -const char *hostname)); - -cached_resolve_t *dns_get_cache_entry(cached_resolve_t *query); -void dns_insert_cache_entry(cached_resolve_t *new_entry); - -MOCK_DECL(STATIC int, -set_exitconn_info_from_resolve,(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out)); - -MOCK_DECL(STATIC int, -launch_resolve,(cached_resolve_t *resolve)); - -#endif /* defined(DNS_PRIVATE) */ - -#endif /* !defined(TOR_DNS_H) */ - diff --git a/src/tor/src/or/dns_structs.h b/src/tor/src/or/dns_structs.h deleted file mode 100644 index e22f23ac1..000000000 --- a/src/tor/src/or/dns_structs.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dns_structs.h - * - * \brief Structures used in dns.c. Exposed to dns.c, and to the unit tests - * that declare DNS_PRIVATE. - */ - -#ifndef TOR_DNS_STRUCTS_H -#define TOR_DNS_STRUCTS_H - -/** Longest hostname we're willing to resolve. */ -#define MAX_ADDRESSLEN 256 - -/** Linked list of connections waiting for a DNS answer. */ -typedef struct pending_connection_t { - edge_connection_t *conn; - struct pending_connection_t *next; -} pending_connection_t; - -/** Value of 'magic' field for cached_resolve_t. Used to try to catch bad - * pointers and memory stomping. */ -#define CACHED_RESOLVE_MAGIC 0x1234F00D - -/* Possible states for a cached resolve_t */ -/** We are waiting for the resolver system to tell us an answer here. - * When we get one, or when we time out, the state of this cached_resolve_t - * will become "DONE" and we'll possibly add a CACHED - * entry. This cached_resolve_t will be in the hash table so that we will - * know not to launch more requests for this addr, but rather to add more - * connections to the pending list for the addr. */ -#define CACHE_STATE_PENDING 0 -/** This used to be a pending cached_resolve_t, and we got an answer for it. - * Now we're waiting for this cached_resolve_t to expire. This should - * have no pending connections, and should not appear in the hash table. */ -#define CACHE_STATE_DONE 1 -/** We are caching an answer for this address. This should have no pending - * connections, and should appear in the hash table. */ -#define CACHE_STATE_CACHED 2 - -/** @name status values for a single DNS request. - * - * @{ */ -/** The DNS request is in progress. */ -#define RES_STATUS_INFLIGHT 1 -/** The DNS request finished and gave an answer */ -#define RES_STATUS_DONE_OK 2 -/** The DNS request finished and gave an error */ -#define RES_STATUS_DONE_ERR 3 -/**@}*/ - -/** A DNS request: possibly completed, possibly pending; cached_resolve - * structs are stored at the OR side in a hash table, and as a linked - * list from oldest to newest. - */ -typedef struct cached_resolve_t { - HT_ENTRY(cached_resolve_t) node; - uint32_t magic; /**< Must be CACHED_RESOLVE_MAGIC */ - char address[MAX_ADDRESSLEN]; /**< The hostname to be resolved. */ - - union { - uint32_t addr_ipv4; /**< IPv4 addr for address, if successful. - * (In host order.) */ - int err_ipv4; /**< One of DNS_ERR_*, if IPv4 lookup failed. */ - } result_ipv4; /**< Outcome of IPv4 lookup */ - union { - struct in6_addr addr_ipv6; /**< IPv6 addr for address, if - * successful */ - int err_ipv6; /**< One of DNS_ERR_*, if IPv6 lookup failed. */ - } result_ipv6; /**< Outcome of IPv6 lookup, if any */ - union { - char *hostname; /** A hostname, if PTR lookup happened successfully*/ - int err_hostname; /** One of DNS_ERR_*, if PTR lookup failed. */ - } result_ptr; - /** @name Status fields - * - * These take one of the RES_STATUS_* values, depending on the state - * of the corresponding lookup. - * - * @{ */ - unsigned int res_status_ipv4 : 2; - unsigned int res_status_ipv6 : 2; - unsigned int res_status_hostname : 2; - /**@}*/ - uint8_t state; /**< Is this cached entry pending/done/informative? */ - - time_t expire; /**< Remove items from cache after this time. */ - uint32_t ttl_ipv4; /**< What TTL did the nameserver tell us? */ - uint32_t ttl_ipv6; /**< What TTL did the nameserver tell us? */ - uint32_t ttl_hostname; /**< What TTL did the nameserver tell us? */ - /** Connections that want to know when we get an answer for this resolve. */ - pending_connection_t *pending_connections; - /** Position of this element in the heap*/ - int minheap_idx; -} cached_resolve_t; - -#endif /* !defined(TOR_DNS_STRUCTS_H) */ - diff --git a/src/tor/src/or/entrynodes.c b/src/tor/src/or/entrynodes.c deleted file mode 100644 index 292a393e5..000000000 --- a/src/tor/src/or/entrynodes.c +++ /dev/null @@ -1,3658 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file entrynodes.c - * \brief Code to manage our fixed first nodes for various functions. - * - * Entry nodes can be guards (for general use) or bridges (for censorship - * circumvention). - * - * In general, we use entry guards to prevent traffic-sampling attacks: - * if we chose every circuit independently, an adversary controlling - * some fraction of paths on the network would observe a sample of every - * user's traffic. Using guards gives users a chance of not being - * profiled. - * - * The current entry guard selection code is designed to try to avoid - * _ever_ trying every guard on the network, to try to stick to guards - * that we've used before, to handle hostile/broken networks, and - * to behave sanely when the network goes up and down. - * - * Our algorithm works as follows: First, we maintain a SAMPLE of guards - * we've seen in the networkstatus consensus. We maintain this sample - * over time, and store it persistently; it is chosen without reference - * to our configuration or firewall rules. Guards remain in the sample - * as they enter and leave the consensus. We expand this sample as - * needed, up to a maximum size. - * - * As a subset of the sample, we maintain a FILTERED SET of the guards - * that we would be willing to use if we could connect to them. The - * filter removes all the guards that we're excluding because they're - * bridges (or not bridges), because we have restrictive firewall rules, - * because of ExcludeNodes, because we of path bias restrictions, - * because they're absent from the network at present, and so on. - * - * As a subset of the filtered set, we keep a REACHABLE FILTERED SET - * (also called a "usable filtered set") of those guards that we call - * "reachable" or "maybe reachable". A guard is reachable if we've - * connected to it more recently than we've failed. A guard is "maybe - * reachable" if we have never tried to connect to it, or if we - * failed to connect to it so long ago that we no longer think our - * failure means it's down. - * - * As a persistent ordered list whose elements are taken from the - * sampled set, we track a CONFIRMED GUARDS LIST. A guard becomes - * confirmed when we successfully build a circuit through it, and decide - * to use that circuit. We order the guards on this list by the order - * in which they became confirmed. - * - * And as a final group, we have an ordered list of PRIMARY GUARDS, - * whose elements are taken from the filtered set. We prefer - * confirmed guards to non-confirmed guards for this list, and place - * other restrictions on it. The primary guards are the ones that we - * connect to "when nothing is wrong" -- circuits through them can be used - * immediately. - * - * To build circuits, we take a primary guard if possible -- or a - * reachable filtered confirmed guard if no primary guard is possible -- - * or a random reachable filtered guard otherwise. If the guard is - * primary, we can use the circuit immediately on success. Otherwise, - * the guard is now "pending" -- we won't use its circuit unless all - * of the circuits we're trying to build through better guards have - * definitely failed. - * - * While we're building circuits, we track a little "guard state" for - * each circuit. We use this to keep track of whether the circuit is - * one that we can use as soon as it's done, or whether it's one that - * we should keep around to see if we can do better. In the latter case, - * a periodic call to entry_guards_upgrade_waiting_circuits() will - * eventually upgrade it. - **/ -/* DOCDOC -- expand this. - * - * Information invariants: - * - * [x] whenever a guard becomes unreachable, clear its usable_filtered flag. - * - * [x] Whenever a guard becomes reachable or maybe-reachable, if its filtered - * flag is set, set its usable_filtered flag. - * - * [x] Whenever we get a new consensus, call update_from_consensus(). (LATER.) - * - * [x] Whenever the configuration changes in a relevant way, update the - * filtered/usable flags. (LATER.) - * - * [x] Whenever we add a guard to the sample, make sure its filtered/usable - * flags are set as possible. - * - * [x] Whenever we remove a guard from the sample, remove it from the primary - * and confirmed lists. - * - * [x] When we make a guard confirmed, update the primary list. - * - * [x] When we make a guard filtered or unfiltered, update the primary list. - * - * [x] When we are about to pick a guard, make sure that the primary list is - * full. - * - * [x] Before calling sample_reachable_filtered_entry_guards(), make sure - * that the filtered, primary, and confirmed flags are up-to-date. - * - * [x] Call entry_guard_consider_retry every time we are about to check - * is_usable_filtered or is_reachable, and every time we set - * is_filtered to 1. - * - * [x] Call entry_guards_changed_for_guard_selection() whenever we update - * a persistent field. - */ - -#define ENTRYNODES_PRIVATE - -#include "or.h" -#include "channel.h" -#include "bridges.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "control.h" -#include "directory.h" -#include "entrynodes.h" -#include "main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "transports.h" -#include "statefile.h" - -/** A list of existing guard selection contexts. */ -static smartlist_t *guard_contexts = NULL; -/** The currently enabled guard selection context. */ -static guard_selection_t *curr_guard_context = NULL; - -/** A value of 1 means that at least one context has changed, - * and those changes need to be flushed to disk. */ -static int entry_guards_dirty = 0; - -static void entry_guard_set_filtered_flags(const or_options_t *options, - guard_selection_t *gs, - entry_guard_t *guard); -static void pathbias_check_use_success_count(entry_guard_t *guard); -static void pathbias_check_close_success_count(entry_guard_t *guard); -static int node_is_possible_guard(const node_t *node); -static int node_passes_guard_filter(const or_options_t *options, - const node_t *node); -static entry_guard_t *entry_guard_add_to_sample_impl(guard_selection_t *gs, - const uint8_t *rsa_id_digest, - const char *nickname, - const tor_addr_port_t *bridge_addrport); -static entry_guard_t *get_sampled_guard_by_bridge_addr(guard_selection_t *gs, - const tor_addr_port_t *addrport); -static int entry_guard_obeys_restriction(const entry_guard_t *guard, - const entry_guard_restriction_t *rst); - -/** Return 0 if we should apply guardfraction information found in the - * consensus. A specific consensus can be specified with the - * ns argument, if NULL the most recent one will be picked.*/ -int -should_apply_guardfraction(const networkstatus_t *ns) -{ - /* We need to check the corresponding torrc option and the consensus - * parameter if we need to. */ - const or_options_t *options = get_options(); - - /* If UseGuardFraction is 'auto' then check the same-named consensus - * parameter. If the consensus parameter is not present, default to - * "off". */ - if (options->UseGuardFraction == -1) { - return networkstatus_get_param(ns, "UseGuardFraction", - 0, /* default to "off" */ - 0, 1); - } - - return options->UseGuardFraction; -} - -/** Return true iff we know a descriptor for guard */ -static int -guard_has_descriptor(const entry_guard_t *guard) -{ - const node_t *node = node_get_by_id(guard->identity); - if (!node) - return 0; - return node_has_descriptor(node); -} - -/** - * Try to determine the correct type for a selection named "name", - * if type is GS_TYPE_INFER. - */ -STATIC guard_selection_type_t -guard_selection_infer_type(guard_selection_type_t type, - const char *name) -{ - if (type == GS_TYPE_INFER) { - if (!strcmp(name, "bridges")) - type = GS_TYPE_BRIDGE; - else if (!strcmp(name, "restricted")) - type = GS_TYPE_RESTRICTED; - else - type = GS_TYPE_NORMAL; - } - return type; -} - -/** - * Allocate and return a new guard_selection_t, with the name name. - */ -STATIC guard_selection_t * -guard_selection_new(const char *name, - guard_selection_type_t type) -{ - guard_selection_t *gs; - - type = guard_selection_infer_type(type, name); - - gs = tor_malloc_zero(sizeof(*gs)); - gs->name = tor_strdup(name); - gs->type = type; - gs->sampled_entry_guards = smartlist_new(); - gs->confirmed_entry_guards = smartlist_new(); - gs->primary_entry_guards = smartlist_new(); - - return gs; -} - -/** - * Return the guard selection called name. If there is none, and - * create_if_absent is true, then create and return it. If there - * is none, and create_if_absent is false, then return NULL. - */ -STATIC guard_selection_t * -get_guard_selection_by_name(const char *name, - guard_selection_type_t type, - int create_if_absent) -{ - if (!guard_contexts) { - guard_contexts = smartlist_new(); - } - SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - if (!strcmp(gs->name, name)) - return gs; - } SMARTLIST_FOREACH_END(gs); - - if (! create_if_absent) - return NULL; - - log_debug(LD_GUARD, "Creating a guard selection called %s", name); - guard_selection_t *new_selection = guard_selection_new(name, type); - smartlist_add(guard_contexts, new_selection); - - return new_selection; -} - -/** - * Allocate the first guard context that we're planning to use, - * and make it the current context. - */ -static void -create_initial_guard_context(void) -{ - tor_assert(! curr_guard_context); - if (!guard_contexts) { - guard_contexts = smartlist_new(); - } - guard_selection_type_t type = GS_TYPE_INFER; - const char *name = choose_guard_selection( - get_options(), - networkstatus_get_live_consensus(approx_time()), - NULL, - &type); - tor_assert(name); // "name" can only be NULL if we had an old name. - tor_assert(type != GS_TYPE_INFER); - log_notice(LD_GUARD, "Starting with guard context \"%s\"", name); - curr_guard_context = get_guard_selection_by_name(name, type, 1); -} - -/** Get current default guard_selection_t, creating it if necessary */ -guard_selection_t * -get_guard_selection_info(void) -{ - if (!curr_guard_context) { - create_initial_guard_context(); - } - - return curr_guard_context; -} - -/** Return a statically allocated human-readable description of guard - */ -const char * -entry_guard_describe(const entry_guard_t *guard) -{ - static char buf[256]; - tor_snprintf(buf, sizeof(buf), - "%s ($%s)", - strlen(guard->nickname) ? guard->nickname : "[bridge]", - hex_str(guard->identity, DIGEST_LEN)); - return buf; -} - -/** Return guard's 20-byte RSA identity digest */ -const char * -entry_guard_get_rsa_id_digest(const entry_guard_t *guard) -{ - return guard->identity; -} - -/** Return the pathbias state associated with guard. */ -guard_pathbias_t * -entry_guard_get_pathbias_state(entry_guard_t *guard) -{ - return &guard->pb; -} - -HANDLE_IMPL(entry_guard, entry_guard_t, ATTR_UNUSED STATIC) - -/** Return an interval betweeen 'now' and 'max_backdate' seconds in the past, - * chosen uniformly at random. We use this before recording persistent - * dates, so that we aren't leaking exactly when we recorded it. - */ -MOCK_IMPL(STATIC time_t, -randomize_time,(time_t now, time_t max_backdate)) -{ - tor_assert(max_backdate > 0); - - time_t earliest = now - max_backdate; - time_t latest = now; - if (earliest <= 0) - earliest = 1; - if (latest <= earliest) - latest = earliest + 1; - - return crypto_rand_time_range(earliest, latest); -} - -/** - * @name parameters for networkstatus algorithm - * - * These parameters are taken from the consensus; some are overrideable in - * the torrc. - */ -/**@{*/ -/** - * We never let our sampled guard set grow larger than this fraction - * of the guards on the network. - */ -STATIC double -get_max_sample_threshold(void) -{ - int32_t pct = - networkstatus_get_param(NULL, "guard-max-sample-threshold-percent", - DFLT_MAX_SAMPLE_THRESHOLD_PERCENT, - 1, 100); - return pct / 100.0; -} -/** - * We never let our sampled guard set grow larger than this number. - */ -STATIC int -get_max_sample_size_absolute(void) -{ - return (int) networkstatus_get_param(NULL, "guard-max-sample-size", - DFLT_MAX_SAMPLE_SIZE, - 1, INT32_MAX); -} -/** - * We always try to make our sample contain at least this many guards. - */ -STATIC int -get_min_filtered_sample_size(void) -{ - return networkstatus_get_param(NULL, "guard-min-filtered-sample-size", - DFLT_MIN_FILTERED_SAMPLE_SIZE, - 1, INT32_MAX); -} -/** - * If a guard is unlisted for this many days in a row, we remove it. - */ -STATIC int -get_remove_unlisted_guards_after_days(void) -{ - return networkstatus_get_param(NULL, - "guard-remove-unlisted-guards-after-days", - DFLT_REMOVE_UNLISTED_GUARDS_AFTER_DAYS, - 1, 365*10); -} -/** - * We remove unconfirmed guards from the sample after this many days, - * regardless of whether they are listed or unlisted. - */ -STATIC int -get_guard_lifetime(void) -{ - if (get_options()->GuardLifetime >= 86400) - return get_options()->GuardLifetime; - int32_t days; - days = networkstatus_get_param(NULL, - "guard-lifetime-days", - DFLT_GUARD_LIFETIME_DAYS, 1, 365*10); - return days * 86400; -} -/** - * We remove confirmed guards from the sample if they were sampled - * GUARD_LIFETIME_DAYS ago and confirmed this many days ago. - */ -STATIC int -get_guard_confirmed_min_lifetime(void) -{ - if (get_options()->GuardLifetime >= 86400) - return get_options()->GuardLifetime; - int32_t days; - days = networkstatus_get_param(NULL, "guard-confirmed-min-lifetime-days", - DFLT_GUARD_CONFIRMED_MIN_LIFETIME_DAYS, - 1, 365*10); - return days * 86400; -} -/** - * How many guards do we try to keep on our primary guard list? - */ -STATIC int -get_n_primary_guards(void) -{ - const int n = get_options()->NumEntryGuards; - const int n_dir = get_options()->NumDirectoryGuards; - if (n > 5) { - return MAX(n_dir, n + n / 2); - } else if (n >= 1) { - return MAX(n_dir, n * 2); - } - - return networkstatus_get_param(NULL, - "guard-n-primary-guards", - DFLT_N_PRIMARY_GUARDS, 1, INT32_MAX); -} -/** - * Return the number of the live primary guards we should look at when - * making a circuit. - */ -STATIC int -get_n_primary_guards_to_use(guard_usage_t usage) -{ - int configured; - const char *param_name; - int param_default; - if (usage == GUARD_USAGE_DIRGUARD) { - configured = get_options()->NumDirectoryGuards; - param_name = "guard-n-primary-dir-guards-to-use"; - param_default = DFLT_N_PRIMARY_DIR_GUARDS_TO_USE; - } else { - configured = get_options()->NumEntryGuards; - param_name = "guard-n-primary-guards-to-use"; - param_default = DFLT_N_PRIMARY_GUARDS_TO_USE; - } - if (configured >= 1) { - return configured; - } - return networkstatus_get_param(NULL, - param_name, param_default, 1, INT32_MAX); -} -/** - * If we haven't successfully built or used a circuit in this long, then - * consider that the internet is probably down. - */ -STATIC int -get_internet_likely_down_interval(void) -{ - return networkstatus_get_param(NULL, "guard-internet-likely-down-interval", - DFLT_INTERNET_LIKELY_DOWN_INTERVAL, - 1, INT32_MAX); -} -/** - * If we're trying to connect to a nonprimary guard for at least this - * many seconds, and we haven't gotten the connection to work, we will treat - * lower-priority guards as usable. - */ -STATIC int -get_nonprimary_guard_connect_timeout(void) -{ - return networkstatus_get_param(NULL, - "guard-nonprimary-guard-connect-timeout", - DFLT_NONPRIMARY_GUARD_CONNECT_TIMEOUT, - 1, INT32_MAX); -} -/** - * If a circuit has been sitting around in 'waiting for better guard' state - * for at least this long, we'll expire it. - */ -STATIC int -get_nonprimary_guard_idle_timeout(void) -{ - return networkstatus_get_param(NULL, - "guard-nonprimary-guard-idle-timeout", - DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT, - 1, INT32_MAX); -} -/** - * If our configuration retains fewer than this fraction of guards from the - * torrc, we are in a restricted setting. - */ -STATIC double -get_meaningful_restriction_threshold(void) -{ - int32_t pct = networkstatus_get_param(NULL, - "guard-meaningful-restriction-percent", - DFLT_MEANINGFUL_RESTRICTION_PERCENT, - 1, INT32_MAX); - return pct / 100.0; -} -/** - * If our configuration retains fewer than this fraction of guards from the - * torrc, we are in an extremely restricted setting, and should warn. - */ -STATIC double -get_extreme_restriction_threshold(void) -{ - int32_t pct = networkstatus_get_param(NULL, - "guard-extreme-restriction-percent", - DFLT_EXTREME_RESTRICTION_PERCENT, - 1, INT32_MAX); - return pct / 100.0; -} - -/* Mark guard as maybe reachable again. */ -static void -mark_guard_maybe_reachable(entry_guard_t *guard) -{ - if (guard->is_reachable != GUARD_REACHABLE_NO) { - return; - } - - /* Note that we do not clear failing_since: this guard is now only - * _maybe-reachable_. */ - guard->is_reachable = GUARD_REACHABLE_MAYBE; - if (guard->is_filtered_guard) - guard->is_usable_filtered_guard = 1; -} - -/** - * Called when the network comes up after having seemed to be down for - * a while: Mark the primary guards as maybe-reachable so that we'll - * try them again. - */ -STATIC void -mark_primary_guards_maybe_reachable(guard_selection_t *gs) -{ - tor_assert(gs); - - if (!gs->primary_guards_up_to_date) - entry_guards_update_primary(gs); - - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { - mark_guard_maybe_reachable(guard); - } SMARTLIST_FOREACH_END(guard); -} - -/* Called when we exhaust all guards in our sampled set: Marks all guards as - maybe-reachable so that we 'll try them again. */ -static void -mark_all_guards_maybe_reachable(guard_selection_t *gs) -{ - tor_assert(gs); - - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - mark_guard_maybe_reachable(guard); - } SMARTLIST_FOREACH_END(guard); -} - -/**@}*/ - -/** - * Given our options and our list of nodes, return the name of the - * guard selection that we should use. Return NULL for "use the - * same selection you were using before. - */ -STATIC const char * -choose_guard_selection(const or_options_t *options, - const networkstatus_t *live_ns, - const guard_selection_t *old_selection, - guard_selection_type_t *type_out) -{ - tor_assert(options); - tor_assert(type_out); - - if (options->UseBridges) { - *type_out = GS_TYPE_BRIDGE; - return "bridges"; - } - - if (! live_ns) { - /* without a networkstatus, we can't tell any more than that. */ - *type_out = GS_TYPE_NORMAL; - return "default"; - } - - const smartlist_t *nodes = nodelist_get_list(); - int n_guards = 0, n_passing_filter = 0; - SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) { - if (node_is_possible_guard(node)) { - ++n_guards; - if (node_passes_guard_filter(options, node)) { - ++n_passing_filter; - } - } - } SMARTLIST_FOREACH_END(node); - - /* We use separate 'high' and 'low' thresholds here to prevent flapping - * back and forth */ - const int meaningful_threshold_high = - (int)(n_guards * get_meaningful_restriction_threshold() * 1.05); - const int meaningful_threshold_mid = - (int)(n_guards * get_meaningful_restriction_threshold()); - const int meaningful_threshold_low = - (int)(n_guards * get_meaningful_restriction_threshold() * .95); - const int extreme_threshold = - (int)(n_guards * get_extreme_restriction_threshold()); - - /* - If we have no previous selection, then we're "restricted" iff we are - below the meaningful restriction threshold. That's easy enough. - - But if we _do_ have a previous selection, we make it a little - "sticky": we only move from "restricted" to "default" when we find - that we're above the threshold plus 5%, and we only move from - "default" to "restricted" when we're below the threshold minus 5%. - That should prevent us from flapping back and forth if we happen to - be hovering very close to the default. - - The extreme threshold is for warning only. - */ - - static int have_warned_extreme_threshold = 0; - if (n_guards && - n_passing_filter < extreme_threshold && - ! have_warned_extreme_threshold) { - have_warned_extreme_threshold = 1; - const double exclude_frac = - (n_guards - n_passing_filter) / (double)n_guards; - log_warn(LD_GUARD, "Your configuration excludes %d%% of all possible " - "guards. That's likely to make you stand out from the " - "rest of the world.", (int)(exclude_frac * 100)); - } - - /* Easy case: no previous selection. Just check if we are in restricted or - normal guard selection. */ - if (old_selection == NULL) { - if (n_passing_filter >= meaningful_threshold_mid) { - *type_out = GS_TYPE_NORMAL; - return "default"; - } else { - *type_out = GS_TYPE_RESTRICTED; - return "restricted"; - } - } - - /* Trickier case: we do have a previous guard selection context. */ - tor_assert(old_selection); - - /* Use high and low thresholds to decide guard selection, and if we fall in - the middle then keep the current guard selection context. */ - if (n_passing_filter >= meaningful_threshold_high) { - *type_out = GS_TYPE_NORMAL; - return "default"; - } else if (n_passing_filter < meaningful_threshold_low) { - *type_out = GS_TYPE_RESTRICTED; - return "restricted"; - } else { - /* we are in the middle: maintain previous guard selection */ - *type_out = old_selection->type; - return old_selection->name; - } -} - -/** - * Check whether we should switch from our current guard selection to a - * different one. If so, switch and return 1. Return 0 otherwise. - * - * On a 1 return, the caller should mark all currently live circuits unusable - * for new streams, by calling circuit_mark_all_unused_circs() and - * circuit_mark_all_dirty_circs_as_unusable(). - */ -int -update_guard_selection_choice(const or_options_t *options) -{ - if (!curr_guard_context) { - create_initial_guard_context(); - return 1; - } - - guard_selection_type_t type = GS_TYPE_INFER; - const char *new_name = choose_guard_selection( - options, - networkstatus_get_live_consensus(approx_time()), - curr_guard_context, - &type); - tor_assert(new_name); - tor_assert(type != GS_TYPE_INFER); - - const char *cur_name = curr_guard_context->name; - if (! strcmp(cur_name, new_name)) { - log_debug(LD_GUARD, - "Staying with guard context \"%s\" (no change)", new_name); - return 0; // No change - } - - log_notice(LD_GUARD, "Switching to guard context \"%s\" (was using \"%s\")", - new_name, cur_name); - guard_selection_t *new_guard_context; - new_guard_context = get_guard_selection_by_name(new_name, type, 1); - tor_assert(new_guard_context); - tor_assert(new_guard_context != curr_guard_context); - curr_guard_context = new_guard_context; - - return 1; -} - -/** - * Return true iff node has all the flags needed for us to consider it - * a possible guard when sampling guards. - */ -static int -node_is_possible_guard(const node_t *node) -{ - /* The "GUARDS" set is all nodes in the nodelist for which this predicate - * holds. */ - - tor_assert(node); - return (node->is_possible_guard && - node->is_stable && - node->is_fast && - node->is_valid && - node_is_dir(node) && - !router_digest_is_me(node->identity)); -} - -/** - * Return the sampled guard with the RSA identity digest rsa_id, or - * NULL if we don't have one. */ -STATIC entry_guard_t * -get_sampled_guard_with_id(guard_selection_t *gs, - const uint8_t *rsa_id) -{ - tor_assert(gs); - tor_assert(rsa_id); - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - if (tor_memeq(guard->identity, rsa_id, DIGEST_LEN)) - return guard; - } SMARTLIST_FOREACH_END(guard); - return NULL; -} - -/** If gs contains a sampled entry guard matching bridge, - * return that guard. Otherwise return NULL. */ -static entry_guard_t * -get_sampled_guard_for_bridge(guard_selection_t *gs, - const bridge_info_t *bridge) -{ - const uint8_t *id = bridge_get_rsa_id_digest(bridge); - const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); - entry_guard_t *guard; - if (BUG(!addrport)) - return NULL; // LCOV_EXCL_LINE - guard = get_sampled_guard_by_bridge_addr(gs, addrport); - if (! guard || (id && tor_memneq(id, guard->identity, DIGEST_LEN))) - return NULL; - else - return guard; -} - -/** If we know a bridge_info_t matching guard, return that - * bridge. Otherwise return NULL. */ -static bridge_info_t * -get_bridge_info_for_guard(const entry_guard_t *guard) -{ - const uint8_t *identity = NULL; - if (! tor_digest_is_zero(guard->identity)) { - identity = (const uint8_t *)guard->identity; - } - if (BUG(guard->bridge_addr == NULL)) - return NULL; - - return get_configured_bridge_by_exact_addr_port_digest( - &guard->bridge_addr->addr, - guard->bridge_addr->port, - (const char*)identity); -} - -/** - * Return true iff we have a sampled guard with the RSA identity digest - * rsa_id. */ -static inline int -have_sampled_guard_with_id(guard_selection_t *gs, const uint8_t *rsa_id) -{ - return get_sampled_guard_with_id(gs, rsa_id) != NULL; -} - -/** - * Allocate a new entry_guard_t object for node, add it to the - * sampled entry guards in gs, and return it. node must - * not currently be a sampled guard in gs. - */ -STATIC entry_guard_t * -entry_guard_add_to_sample(guard_selection_t *gs, - const node_t *node) -{ - log_info(LD_GUARD, "Adding %s to the entry guard sample set.", - node_describe(node)); - - /* make sure that the guard is not already sampled. */ - if (BUG(have_sampled_guard_with_id(gs, (const uint8_t*)node->identity))) - return NULL; // LCOV_EXCL_LINE - - return entry_guard_add_to_sample_impl(gs, - (const uint8_t*)node->identity, - node_get_nickname(node), - NULL); -} - -/** - * Backend: adds a new sampled guard to gs, with given identity, - * nickname, and ORPort. rsa_id_digest and bridge_addrport are optional, but - * we need one of them. nickname is optional. The caller is responsible for - * maintaining the size limit of the SAMPLED_GUARDS set. - */ -static entry_guard_t * -entry_guard_add_to_sample_impl(guard_selection_t *gs, - const uint8_t *rsa_id_digest, - const char *nickname, - const tor_addr_port_t *bridge_addrport) -{ - const int GUARD_LIFETIME = get_guard_lifetime(); - tor_assert(gs); - - // XXXX #20827 take ed25519 identity here too. - - /* Make sure we can actually identify the guard. */ - if (BUG(!rsa_id_digest && !bridge_addrport)) - return NULL; // LCOV_EXCL_LINE - - entry_guard_t *guard = tor_malloc_zero(sizeof(entry_guard_t)); - - /* persistent fields */ - guard->is_persistent = (rsa_id_digest != NULL); - guard->selection_name = tor_strdup(gs->name); - if (rsa_id_digest) - memcpy(guard->identity, rsa_id_digest, DIGEST_LEN); - if (nickname) - strlcpy(guard->nickname, nickname, sizeof(guard->nickname)); - guard->sampled_on_date = randomize_time(approx_time(), GUARD_LIFETIME/10); - tor_free(guard->sampled_by_version); - guard->sampled_by_version = tor_strdup(VERSION); - guard->currently_listed = 1; - guard->confirmed_idx = -1; - - /* non-persistent fields */ - guard->is_reachable = GUARD_REACHABLE_MAYBE; - if (bridge_addrport) - guard->bridge_addr = tor_memdup(bridge_addrport, sizeof(*bridge_addrport)); - - smartlist_add(gs->sampled_entry_guards, guard); - guard->in_selection = gs; - entry_guard_set_filtered_flags(get_options(), gs, guard); - entry_guards_changed_for_guard_selection(gs); - return guard; -} - -/** - * Add an entry guard to the "bridges" guard selection sample, with - * information taken from bridge. Return that entry guard. - */ -static entry_guard_t * -entry_guard_add_bridge_to_sample(guard_selection_t *gs, - const bridge_info_t *bridge) -{ - const uint8_t *id_digest = bridge_get_rsa_id_digest(bridge); - const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); - - tor_assert(addrport); - - /* make sure that the guard is not already sampled. */ - if (BUG(get_sampled_guard_for_bridge(gs, bridge))) - return NULL; // LCOV_EXCL_LINE - - return entry_guard_add_to_sample_impl(gs, id_digest, NULL, addrport); -} - -/** - * Return the entry_guard_t in gs whose address is addrport, - * or NULL if none exists. -*/ -static entry_guard_t * -get_sampled_guard_by_bridge_addr(guard_selection_t *gs, - const tor_addr_port_t *addrport) -{ - if (! gs) - return NULL; - if (BUG(!addrport)) - return NULL; - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, g) { - if (g->bridge_addr && tor_addr_port_eq(addrport, g->bridge_addr)) - return g; - } SMARTLIST_FOREACH_END(g); - return NULL; -} - -/** Update the guard subsystem's knowledge of the identity of the bridge - * at addrport. Idempotent. - */ -void -entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, - const uint8_t *rsa_id_digest) -{ - guard_selection_t *gs = get_guard_selection_by_name("bridges", - GS_TYPE_BRIDGE, - 0); - if (!gs) - return; - - entry_guard_t *g = get_sampled_guard_by_bridge_addr(gs, addrport); - if (!g) - return; - - int make_persistent = 0; - - if (tor_digest_is_zero(g->identity)) { - memcpy(g->identity, rsa_id_digest, DIGEST_LEN); - make_persistent = 1; - } else if (tor_memeq(g->identity, rsa_id_digest, DIGEST_LEN)) { - /* Nothing to see here; we learned something we already knew. */ - if (BUG(! g->is_persistent)) - make_persistent = 1; - } else { - char old_id[HEX_DIGEST_LEN+1]; - base16_encode(old_id, sizeof(old_id), g->identity, sizeof(g->identity)); - log_warn(LD_BUG, "We 'learned' an identity %s for a bridge at %s:%d, but " - "we already knew a different one (%s). Ignoring the new info as " - "possibly bogus.", - hex_str((const char *)rsa_id_digest, DIGEST_LEN), - fmt_and_decorate_addr(&addrport->addr), addrport->port, - old_id); - return; // redundant, but let's be clear: we're not making this persistent. - } - - if (make_persistent) { - g->is_persistent = 1; - entry_guards_changed_for_guard_selection(gs); - } -} - -/** - * Return the number of sampled guards in gs that are "filtered" - * (that is, we're willing to connect to them) and that are "usable" - * (that is, either "reachable" or "maybe reachable"). - * - * If a restriction is provided in rst, do not count any guards that - * violate it. - */ -STATIC int -num_reachable_filtered_guards(const guard_selection_t *gs, - const entry_guard_restriction_t *rst) -{ - int n_reachable_filtered_guards = 0; - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard); - if (! entry_guard_obeys_restriction(guard, rst)) - continue; - if (guard->is_usable_filtered_guard) - ++n_reachable_filtered_guards; - } SMARTLIST_FOREACH_END(guard); - return n_reachable_filtered_guards; -} - -/** Return the actual maximum size for the sample in gs, - * given that we know about n_guards total. */ -static int -get_max_sample_size(guard_selection_t *gs, - int n_guards) -{ - const int using_bridges = (gs->type == GS_TYPE_BRIDGE); - const int min_sample = get_min_filtered_sample_size(); - - /* If we are in bridge mode, expand our sample set as needed without worrying - * about max size. We should respect the user's wishes to use many bridges if - * that's what they have specified in their configuration file. */ - if (using_bridges) - return INT_MAX; - - const int max_sample_by_pct = (int)(n_guards * get_max_sample_threshold()); - const int max_sample_absolute = get_max_sample_size_absolute(); - const int max_sample = MIN(max_sample_by_pct, max_sample_absolute); - if (max_sample < min_sample) - return min_sample; - else - return max_sample; -} - -/** - * Return a smartlist of the all the guards that are not currently - * members of the sample (GUARDS - SAMPLED_GUARDS). The elements of - * this list are node_t pointers in the non-bridge case, and - * bridge_info_t pointers in the bridge case. Set *n_guards_out/b> - * to the number of guards that we found in GUARDS, including those - * that were already sampled. - */ -static smartlist_t * -get_eligible_guards(const or_options_t *options, - guard_selection_t *gs, - int *n_guards_out) -{ - /* Construct eligible_guards as GUARDS - SAMPLED_GUARDS */ - smartlist_t *eligible_guards = smartlist_new(); - int n_guards = 0; // total size of "GUARDS" - - if (gs->type == GS_TYPE_BRIDGE) { - const smartlist_t *bridges = bridge_list_get(); - SMARTLIST_FOREACH_BEGIN(bridges, bridge_info_t *, bridge) { - ++n_guards; - if (NULL != get_sampled_guard_for_bridge(gs, bridge)) { - continue; - } - smartlist_add(eligible_guards, bridge); - } SMARTLIST_FOREACH_END(bridge); - } else { - const smartlist_t *nodes = nodelist_get_list(); - const int n_sampled = smartlist_len(gs->sampled_entry_guards); - - /* Build a bloom filter of our current guards: let's keep this O(N). */ - digestset_t *sampled_guard_ids = digestset_new(n_sampled); - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, const entry_guard_t *, - guard) { - digestset_add(sampled_guard_ids, guard->identity); - } SMARTLIST_FOREACH_END(guard); - - SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) { - if (! node_is_possible_guard(node)) - continue; - if (gs->type == GS_TYPE_RESTRICTED) { - /* In restricted mode, we apply the filter BEFORE sampling, so - * that we are sampling from the nodes that we might actually - * select. If we sampled first, we might wind up with a sample - * that didn't include any EntryNodes at all. */ - if (! node_passes_guard_filter(options, node)) - continue; - } - ++n_guards; - if (digestset_contains(sampled_guard_ids, node->identity)) - continue; - smartlist_add(eligible_guards, (node_t*)node); - } SMARTLIST_FOREACH_END(node); - - /* Now we can free that bloom filter. */ - digestset_free(sampled_guard_ids); - } - - *n_guards_out = n_guards; - return eligible_guards; -} - -/** Helper: given a smartlist of either bridge_info_t (if gs->type is - * GS_TYPE_BRIDGE) or node_t (otherwise), pick one that can be a guard, - * add it as a guard, remove it from the list, and return a new - * entry_guard_t. Return NULL on failure. */ -static entry_guard_t * -select_and_add_guard_item_for_sample(guard_selection_t *gs, - smartlist_t *eligible_guards) -{ - entry_guard_t *added_guard; - if (gs->type == GS_TYPE_BRIDGE) { - const bridge_info_t *bridge = smartlist_choose(eligible_guards); - if (BUG(!bridge)) - return NULL; // LCOV_EXCL_LINE - smartlist_remove(eligible_guards, bridge); - added_guard = entry_guard_add_bridge_to_sample(gs, bridge); - } else { - const node_t *node = - node_sl_choose_by_bandwidth(eligible_guards, WEIGHT_FOR_GUARD); - if (BUG(!node)) - return NULL; // LCOV_EXCL_LINE - smartlist_remove(eligible_guards, node); - added_guard = entry_guard_add_to_sample(gs, node); - } - - return added_guard; -} - -/** - * Return true iff we need a consensus to update our guards, but we don't - * have one. (We can return 0 here either if the consensus is _not_ missing, - * or if we don't need a consensus because we're using bridges.) - */ -static int -live_consensus_is_missing(const guard_selection_t *gs) -{ - tor_assert(gs); - if (gs->type == GS_TYPE_BRIDGE) { - /* We don't update bridges from the consensus; they aren't there. */ - return 0; - } - return networkstatus_get_live_consensus(approx_time()) == NULL; -} - -/** - * Add new guards to the sampled guards in gs until there are - * enough usable filtered guards, but never grow the sample beyond its - * maximum size. Return the last guard added, or NULL if none were - * added. - */ -STATIC entry_guard_t * -entry_guards_expand_sample(guard_selection_t *gs) -{ - tor_assert(gs); - const or_options_t *options = get_options(); - - if (live_consensus_is_missing(gs)) { - log_info(LD_GUARD, "Not expanding the sample guard set; we have " - "no live consensus."); - return NULL; - } - - int n_sampled = smartlist_len(gs->sampled_entry_guards); - entry_guard_t *added_guard = NULL; - int n_usable_filtered_guards = num_reachable_filtered_guards(gs, NULL); - int n_guards = 0; - smartlist_t *eligible_guards = get_eligible_guards(options, gs, &n_guards); - - const int max_sample = get_max_sample_size(gs, n_guards); - const int min_filtered_sample = get_min_filtered_sample_size(); - - log_info(LD_GUARD, "Expanding the sample guard set. We have %d guards " - "in the sample, and %d eligible guards to extend it with.", - n_sampled, smartlist_len(eligible_guards)); - - while (n_usable_filtered_guards < min_filtered_sample) { - /* Has our sample grown too large to expand? */ - if (n_sampled >= max_sample) { - log_info(LD_GUARD, "Not expanding the guard sample any further; " - "just hit the maximum sample threshold of %d", - max_sample); - goto done; - } - - /* Did we run out of guards? */ - if (smartlist_len(eligible_guards) == 0) { - /* LCOV_EXCL_START - As long as MAX_SAMPLE_THRESHOLD makes can't be adjusted to - allow all guards to be sampled, this can't be reached. - */ - log_info(LD_GUARD, "Not expanding the guard sample any further; " - "just ran out of eligible guards"); - goto done; - /* LCOV_EXCL_STOP */ - } - - /* Otherwise we can add at least one new guard. */ - added_guard = select_and_add_guard_item_for_sample(gs, eligible_guards); - if (!added_guard) - goto done; // LCOV_EXCL_LINE -- only fails on BUG. - - ++n_sampled; - - if (added_guard->is_usable_filtered_guard) - ++n_usable_filtered_guards; - } - - done: - smartlist_free(eligible_guards); - return added_guard; -} - -/** - * Helper: guard has just been removed from the sampled guards: - * also remove it from primary and confirmed. */ -static void -remove_guard_from_confirmed_and_primary_lists(guard_selection_t *gs, - entry_guard_t *guard) -{ - if (guard->is_primary) { - guard->is_primary = 0; - smartlist_remove_keeporder(gs->primary_entry_guards, guard); - } else { - if (BUG(smartlist_contains(gs->primary_entry_guards, guard))) { - smartlist_remove_keeporder(gs->primary_entry_guards, guard); - } - } - - if (guard->confirmed_idx >= 0) { - smartlist_remove_keeporder(gs->confirmed_entry_guards, guard); - guard->confirmed_idx = -1; - guard->confirmed_on_date = 0; - } else { - if (BUG(smartlist_contains(gs->confirmed_entry_guards, guard))) { - // LCOV_EXCL_START - smartlist_remove_keeporder(gs->confirmed_entry_guards, guard); - // LCOV_EXCL_STOP - } - } -} - -/** Return true iff guard is currently "listed" -- that is, it - * appears in the consensus, or as a configured bridge (as - * appropriate) */ -MOCK_IMPL(STATIC int, -entry_guard_is_listed,(guard_selection_t *gs, const entry_guard_t *guard)) -{ - if (gs->type == GS_TYPE_BRIDGE) { - return NULL != get_bridge_info_for_guard(guard); - } else { - const node_t *node = node_get_by_id(guard->identity); - - return node && node_is_possible_guard(node); - } -} - -/** - * Update the status of all sampled guards based on the arrival of a - * new consensus networkstatus document. This will include marking - * some guards as listed or unlisted, and removing expired guards. */ -STATIC void -sampled_guards_update_from_consensus(guard_selection_t *gs) -{ - tor_assert(gs); - const int REMOVE_UNLISTED_GUARDS_AFTER = - (get_remove_unlisted_guards_after_days() * 86400); - const int unlisted_since_slop = REMOVE_UNLISTED_GUARDS_AFTER / 5; - - // It's important to use only a live consensus here; we don't want to - // make changes based on anything expired or old. - if (live_consensus_is_missing(gs)) { - log_info(LD_GUARD, "Not updating the sample guard set; we have " - "no live consensus."); - return; - } - log_info(LD_GUARD, "Updating sampled guard status based on received " - "consensus."); - - int n_changes = 0; - - /* First: Update listed/unlisted. */ - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - /* XXXX #20827 check ed ID too */ - const int is_listed = entry_guard_is_listed(gs, guard); - - if (is_listed && ! guard->currently_listed) { - ++n_changes; - guard->currently_listed = 1; - guard->unlisted_since_date = 0; - log_info(LD_GUARD, "Sampled guard %s is now listed again.", - entry_guard_describe(guard)); - } else if (!is_listed && guard->currently_listed) { - ++n_changes; - guard->currently_listed = 0; - guard->unlisted_since_date = randomize_time(approx_time(), - unlisted_since_slop); - log_info(LD_GUARD, "Sampled guard %s is now unlisted.", - entry_guard_describe(guard)); - } else if (is_listed && guard->currently_listed) { - log_debug(LD_GUARD, "Sampled guard %s is still listed.", - entry_guard_describe(guard)); - } else { - tor_assert(! is_listed && ! guard->currently_listed); - log_debug(LD_GUARD, "Sampled guard %s is still unlisted.", - entry_guard_describe(guard)); - } - - /* Clean up unlisted_since_date, just in case. */ - if (guard->currently_listed && guard->unlisted_since_date) { - ++n_changes; - guard->unlisted_since_date = 0; - log_warn(LD_BUG, "Sampled guard %s was listed, but with " - "unlisted_since_date set. Fixing.", - entry_guard_describe(guard)); - } else if (!guard->currently_listed && ! guard->unlisted_since_date) { - ++n_changes; - guard->unlisted_since_date = randomize_time(approx_time(), - unlisted_since_slop); - log_warn(LD_BUG, "Sampled guard %s was unlisted, but with " - "unlisted_since_date unset. Fixing.", - entry_guard_describe(guard)); - } - } SMARTLIST_FOREACH_END(guard); - - const time_t remove_if_unlisted_since = - approx_time() - REMOVE_UNLISTED_GUARDS_AFTER; - const time_t maybe_remove_if_sampled_before = - approx_time() - get_guard_lifetime(); - const time_t remove_if_confirmed_before = - approx_time() - get_guard_confirmed_min_lifetime(); - - /* Then: remove the ones that have been junk for too long */ - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - int rmv = 0; - - if (guard->currently_listed == 0 && - guard->unlisted_since_date < remove_if_unlisted_since) { - /* - "We have a live consensus, and {IS_LISTED} is false, and - {FIRST_UNLISTED_AT} is over {REMOVE_UNLISTED_GUARDS_AFTER} - days in the past." - */ - log_info(LD_GUARD, "Removing sampled guard %s: it has been unlisted " - "for over %d days", entry_guard_describe(guard), - get_remove_unlisted_guards_after_days()); - rmv = 1; - } else if (guard->sampled_on_date < maybe_remove_if_sampled_before) { - /* We have a live consensus, and {ADDED_ON_DATE} is over - {GUARD_LIFETIME} ago, *and* {CONFIRMED_ON_DATE} is either - "never", or over {GUARD_CONFIRMED_MIN_LIFETIME} ago. - */ - if (guard->confirmed_on_date == 0) { - rmv = 1; - log_info(LD_GUARD, "Removing sampled guard %s: it was sampled " - "over %d days ago, but never confirmed.", - entry_guard_describe(guard), - get_guard_lifetime() / 86400); - } else if (guard->confirmed_on_date < remove_if_confirmed_before) { - rmv = 1; - log_info(LD_GUARD, "Removing sampled guard %s: it was sampled " - "over %d days ago, and confirmed over %d days ago.", - entry_guard_describe(guard), - get_guard_lifetime() / 86400, - get_guard_confirmed_min_lifetime() / 86400); - } - } - - if (rmv) { - ++n_changes; - SMARTLIST_DEL_CURRENT(gs->sampled_entry_guards, guard); - remove_guard_from_confirmed_and_primary_lists(gs, guard); - entry_guard_free(guard); - } - } SMARTLIST_FOREACH_END(guard); - - if (n_changes) { - gs->primary_guards_up_to_date = 0; - entry_guards_update_filtered_sets(gs); - /* We don't need to rebuild the confirmed list right here -- we may have - * removed confirmed guards above, but we can't have added any new - * confirmed guards. - */ - entry_guards_changed_for_guard_selection(gs); - } -} - -/** - * Return true iff node is a Tor relay that we are configured to - * be able to connect to. */ -static int -node_passes_guard_filter(const or_options_t *options, - const node_t *node) -{ - /* NOTE: Make sure that this function stays in sync with - * options_transition_affects_entry_guards */ - if (routerset_contains_node(options->ExcludeNodes, node)) - return 0; - - if (options->EntryNodes && - !routerset_contains_node(options->EntryNodes, node)) - return 0; - - if (!fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0)) - return 0; - - if (node_is_a_configured_bridge(node)) - return 0; - - return 1; -} - -/** Helper: Return true iff bridge passes our configuration - * filter-- if it is a relay that we are configured to be able to - * connect to. */ -static int -bridge_passes_guard_filter(const or_options_t *options, - const bridge_info_t *bridge) -{ - tor_assert(bridge); - if (!bridge) - return 0; - - if (routerset_contains_bridge(options->ExcludeNodes, bridge)) - return 0; - - /* Ignore entrynodes */ - const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); - - if (!fascist_firewall_allows_address_addr(&addrport->addr, - addrport->port, - FIREWALL_OR_CONNECTION, - 0, 0)) - return 0; - - return 1; -} - -/** - * Return true iff guard is a Tor relay that we are configured to - * be able to connect to, and we haven't disabled it for omission from - * the consensus or path bias issues. */ -static int -entry_guard_passes_filter(const or_options_t *options, guard_selection_t *gs, - entry_guard_t *guard) -{ - if (guard->currently_listed == 0) - return 0; - if (guard->pb.path_bias_disabled) - return 0; - - if (gs->type == GS_TYPE_BRIDGE) { - const bridge_info_t *bridge = get_bridge_info_for_guard(guard); - if (bridge == NULL) - return 0; - return bridge_passes_guard_filter(options, bridge); - } else { - const node_t *node = node_get_by_id(guard->identity); - if (node == NULL) { - // This can happen when currently_listed is true, and we're not updating - // it because we don't have a live consensus. - return 0; - } - - return node_passes_guard_filter(options, node); - } -} - -/** Return true iff guard is in the same family as node. - */ -static int -guard_in_node_family(const entry_guard_t *guard, const node_t *node) -{ - const node_t *guard_node = node_get_by_id(guard->identity); - if (guard_node) { - return nodes_in_same_family(guard_node, node); - } else { - /* If we don't have a node_t for the guard node, we might have - * a bridge_info_t for it. So let's check to see whether the bridge - * address matches has any family issues. - * - * (Strictly speaking, I believe this check is unnecessary, since we only - * use it to avoid the exit's family when building circuits, and we don't - * build multihop circuits until we have a routerinfo_t for the - * bridge... at which point, we'll also have a node_t for the - * bridge. Nonetheless, it seems wise to include it, in case our - * assumptions change down the road. -nickm.) - */ - if (get_options()->EnforceDistinctSubnets && guard->bridge_addr) { - tor_addr_t node_addr; - node_get_addr(node, &node_addr); - if (addrs_in_same_network_family(&node_addr, - &guard->bridge_addr->addr)) { - return 1; - } - } - return 0; - } -} - -/* Allocate and return a new exit guard restriction (where exit_id is of - * size DIGEST_LEN) */ -STATIC entry_guard_restriction_t * -guard_create_exit_restriction(const uint8_t *exit_id) -{ - entry_guard_restriction_t *rst = NULL; - rst = tor_malloc_zero(sizeof(entry_guard_restriction_t)); - rst->type = RST_EXIT_NODE; - memcpy(rst->exclude_id, exit_id, DIGEST_LEN); - return rst; -} - -/** If we have fewer than this many possible usable guards, don't set - * MD-availability-based restrictions: we might blacklist all of them. */ -#define MIN_GUARDS_FOR_MD_RESTRICTION 10 - -/** Return true if we should set md dirserver restrictions. We might not want - * to set those if our guard options are too restricted, since we don't want - * to blacklist all of them. */ -static int -should_set_md_dirserver_restriction(void) -{ - const guard_selection_t *gs = get_guard_selection_info(); - int num_usable_guards = num_reachable_filtered_guards(gs, NULL); - - /* Don't set restriction if too few reachable filtered guards. */ - if (num_usable_guards < MIN_GUARDS_FOR_MD_RESTRICTION) { - log_info(LD_GUARD, "Not setting md restriction: only %d" - " usable guards.", num_usable_guards); - return 0; - } - - /* We have enough usable guards: set MD restriction */ - return 1; -} - -/** Allocate and return an outdated md guard restriction. Return NULL if no - * such restriction is needed. */ -STATIC entry_guard_restriction_t * -guard_create_dirserver_md_restriction(void) -{ - entry_guard_restriction_t *rst = NULL; - - if (!should_set_md_dirserver_restriction()) { - log_debug(LD_GUARD, "Not setting md restriction: too few " - "filtered guards."); - return NULL; - } - - rst = tor_malloc_zero(sizeof(entry_guard_restriction_t)); - rst->type = RST_OUTDATED_MD_DIRSERVER; - - return rst; -} - -/* Return True if guard obeys the exit restriction rst. */ -static int -guard_obeys_exit_restriction(const entry_guard_t *guard, - const entry_guard_restriction_t *rst) -{ - tor_assert(rst->type == RST_EXIT_NODE); - - // Exclude the exit ID and all of its family. - const node_t *node = node_get_by_id((const char*)rst->exclude_id); - if (node && guard_in_node_family(guard, node)) - return 0; - - return tor_memneq(guard->identity, rst->exclude_id, DIGEST_LEN); -} - -/** Return True if guard should be used as a dirserver for fetching - * microdescriptors. */ -static int -guard_obeys_md_dirserver_restriction(const entry_guard_t *guard) -{ - /* If this guard is an outdated dirserver, don't use it. */ - if (microdesc_relay_is_outdated_dirserver(guard->identity)) { - log_info(LD_GENERAL, "Skipping %s dirserver: outdated", - hex_str(guard->identity, DIGEST_LEN)); - return 0; - } - - log_debug(LD_GENERAL, "%s dirserver obeys md restrictions", - hex_str(guard->identity, DIGEST_LEN)); - - return 1; -} - -/** - * Return true iff guard obeys the restrictions defined in rst. - * (If rst is NULL, there are no restrictions.) - */ -static int -entry_guard_obeys_restriction(const entry_guard_t *guard, - const entry_guard_restriction_t *rst) -{ - tor_assert(guard); - if (! rst) - return 1; // No restriction? No problem. - - if (rst->type == RST_EXIT_NODE) { - return guard_obeys_exit_restriction(guard, rst); - } else if (rst->type == RST_OUTDATED_MD_DIRSERVER) { - return guard_obeys_md_dirserver_restriction(guard); - } - - tor_assert_nonfatal_unreached(); - return 0; -} - -/** - * Update the is_filtered_guard and is_usable_filtered_guard - * flags on guard. */ -void -entry_guard_set_filtered_flags(const or_options_t *options, - guard_selection_t *gs, - entry_guard_t *guard) -{ - unsigned was_filtered = guard->is_filtered_guard; - guard->is_filtered_guard = 0; - guard->is_usable_filtered_guard = 0; - - if (entry_guard_passes_filter(options, gs, guard)) { - guard->is_filtered_guard = 1; - - if (guard->is_reachable != GUARD_REACHABLE_NO) - guard->is_usable_filtered_guard = 1; - - entry_guard_consider_retry(guard); - } - log_debug(LD_GUARD, "Updated sampled guard %s: filtered=%d; " - "reachable_filtered=%d.", entry_guard_describe(guard), - guard->is_filtered_guard, guard->is_usable_filtered_guard); - - if (!bool_eq(was_filtered, guard->is_filtered_guard)) { - /* This guard might now be primary or nonprimary. */ - gs->primary_guards_up_to_date = 0; - } -} - -/** - * Update the is_filtered_guard and is_usable_filtered_guard - * flag on every guard in gs. */ -STATIC void -entry_guards_update_filtered_sets(guard_selection_t *gs) -{ - const or_options_t *options = get_options(); - - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - entry_guard_set_filtered_flags(options, gs, guard); - } SMARTLIST_FOREACH_END(guard); -} - -/** - * Return a random guard from the reachable filtered sample guards - * in gs, subject to the exclusion rules listed in flags. - * Return NULL if no such guard can be found. - * - * Make sure that the sample is big enough, and that all the filter flags - * are set correctly, before calling this function. - * - * If a restriction is provided in rst, do not return any guards that - * violate it. - **/ -STATIC entry_guard_t * -sample_reachable_filtered_entry_guards(guard_selection_t *gs, - const entry_guard_restriction_t *rst, - unsigned flags) -{ - tor_assert(gs); - entry_guard_t *result = NULL; - const unsigned exclude_confirmed = flags & SAMPLE_EXCLUDE_CONFIRMED; - const unsigned exclude_primary = flags & SAMPLE_EXCLUDE_PRIMARY; - const unsigned exclude_pending = flags & SAMPLE_EXCLUDE_PENDING; - const unsigned no_update_primary = flags & SAMPLE_NO_UPDATE_PRIMARY; - const unsigned need_descriptor = flags & SAMPLE_EXCLUDE_NO_DESCRIPTOR; - - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard); - } SMARTLIST_FOREACH_END(guard); - - const int n_reachable_filtered = num_reachable_filtered_guards(gs, rst); - - log_info(LD_GUARD, "Trying to sample a reachable guard: We know of %d " - "in the USABLE_FILTERED set.", n_reachable_filtered); - - const int min_filtered_sample = get_min_filtered_sample_size(); - if (n_reachable_filtered < min_filtered_sample) { - log_info(LD_GUARD, " (That isn't enough. Trying to expand the sample.)"); - entry_guards_expand_sample(gs); - } - - if (exclude_primary && !gs->primary_guards_up_to_date && !no_update_primary) - entry_guards_update_primary(gs); - - /* Build the set of reachable filtered guards. */ - smartlist_t *reachable_filtered_sample = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard);// redundant, but cheap. - if (! entry_guard_obeys_restriction(guard, rst)) - continue; - if (! guard->is_usable_filtered_guard) - continue; - if (exclude_confirmed && guard->confirmed_idx >= 0) - continue; - if (exclude_primary && guard->is_primary) - continue; - if (exclude_pending && guard->is_pending) - continue; - if (need_descriptor && !guard_has_descriptor(guard)) - continue; - smartlist_add(reachable_filtered_sample, guard); - } SMARTLIST_FOREACH_END(guard); - - log_info(LD_GUARD, " (After filters [%x], we have %d guards to consider.)", - flags, smartlist_len(reachable_filtered_sample)); - - if (smartlist_len(reachable_filtered_sample)) { - result = smartlist_choose(reachable_filtered_sample); - log_info(LD_GUARD, " (Selected %s.)", - result ? entry_guard_describe(result) : ""); - } - smartlist_free(reachable_filtered_sample); - - return result; -} - -/** - * Helper: compare two entry_guard_t by their confirmed_idx values. - * Used to sort the confirmed list. - */ -static int -compare_guards_by_confirmed_idx(const void **a_, const void **b_) -{ - const entry_guard_t *a = *a_, *b = *b_; - if (a->confirmed_idx < b->confirmed_idx) - return -1; - else if (a->confirmed_idx > b->confirmed_idx) - return 1; - else - return 0; -} - -/** - * Find the confirmed guards from among the sampled guards in gs, - * and put them in confirmed_entry_guards in the correct - * order. Recalculate their indices. - */ -STATIC void -entry_guards_update_confirmed(guard_selection_t *gs) -{ - smartlist_clear(gs->confirmed_entry_guards); - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - if (guard->confirmed_idx >= 0) - smartlist_add(gs->confirmed_entry_guards, guard); - } SMARTLIST_FOREACH_END(guard); - - smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_confirmed_idx); - - int any_changed = 0; - SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) { - if (guard->confirmed_idx != guard_sl_idx) { - any_changed = 1; - guard->confirmed_idx = guard_sl_idx; - } - } SMARTLIST_FOREACH_END(guard); - - gs->next_confirmed_idx = smartlist_len(gs->confirmed_entry_guards); - - if (any_changed) { - entry_guards_changed_for_guard_selection(gs); - } -} - -/** - * Mark guard as a confirmed guard -- that is, one that we have - * connected to, and intend to use again. - */ -STATIC void -make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard) -{ - if (BUG(guard->confirmed_on_date && guard->confirmed_idx >= 0)) - return; // LCOV_EXCL_LINE - - if (BUG(smartlist_contains(gs->confirmed_entry_guards, guard))) - return; // LCOV_EXCL_LINE - - const int GUARD_LIFETIME = get_guard_lifetime(); - guard->confirmed_on_date = randomize_time(approx_time(), GUARD_LIFETIME/10); - - log_info(LD_GUARD, "Marking %s as a confirmed guard (index %d)", - entry_guard_describe(guard), - gs->next_confirmed_idx); - - guard->confirmed_idx = gs->next_confirmed_idx++; - smartlist_add(gs->confirmed_entry_guards, guard); - - // This confirmed guard might kick something else out of the primary - // guards. - gs->primary_guards_up_to_date = 0; - - entry_guards_changed_for_guard_selection(gs); -} - -/** - * Recalculate the list of primary guards (the ones we'd prefer to use) from - * the filtered sample and the confirmed list. - */ -STATIC void -entry_guards_update_primary(guard_selection_t *gs) -{ - tor_assert(gs); - - // prevent recursion. Recursion is potentially very bad here. - static int running = 0; - tor_assert(!running); - running = 1; - - const int N_PRIMARY_GUARDS = get_n_primary_guards(); - - smartlist_t *new_primary_guards = smartlist_new(); - smartlist_t *old_primary_guards = smartlist_new(); - smartlist_add_all(old_primary_guards, gs->primary_entry_guards); - - /* Set this flag now, to prevent the calls below from recursing. */ - gs->primary_guards_up_to_date = 1; - - /* First, can we fill it up with confirmed guards? */ - SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) { - if (smartlist_len(new_primary_guards) >= N_PRIMARY_GUARDS) - break; - if (! guard->is_filtered_guard) - continue; - guard->is_primary = 1; - smartlist_add(new_primary_guards, guard); - } SMARTLIST_FOREACH_END(guard); - - /* Can we keep any older primary guards? First remove all the ones - * that we already kept. */ - SMARTLIST_FOREACH_BEGIN(old_primary_guards, entry_guard_t *, guard) { - if (smartlist_contains(new_primary_guards, guard)) { - SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard); - } - } SMARTLIST_FOREACH_END(guard); - - /* Now add any that are still good. */ - SMARTLIST_FOREACH_BEGIN(old_primary_guards, entry_guard_t *, guard) { - if (smartlist_len(new_primary_guards) >= N_PRIMARY_GUARDS) - break; - if (! guard->is_filtered_guard) - continue; - guard->is_primary = 1; - smartlist_add(new_primary_guards, guard); - SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard); - } SMARTLIST_FOREACH_END(guard); - - /* Mark the remaining previous primary guards as non-primary */ - SMARTLIST_FOREACH_BEGIN(old_primary_guards, entry_guard_t *, guard) { - guard->is_primary = 0; - } SMARTLIST_FOREACH_END(guard); - - /* Finally, fill out the list with sampled guards. */ - while (smartlist_len(new_primary_guards) < N_PRIMARY_GUARDS) { - entry_guard_t *guard = sample_reachable_filtered_entry_guards(gs, NULL, - SAMPLE_EXCLUDE_CONFIRMED| - SAMPLE_EXCLUDE_PRIMARY| - SAMPLE_NO_UPDATE_PRIMARY); - if (!guard) - break; - guard->is_primary = 1; - smartlist_add(new_primary_guards, guard); - } - -#if 1 - /* Debugging. */ - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, guard, { - tor_assert_nonfatal( - bool_eq(guard->is_primary, - smartlist_contains(new_primary_guards, guard))); - }); -#endif /* 1 */ - - int any_change = 0; - if (smartlist_len(gs->primary_entry_guards) != - smartlist_len(new_primary_guards)) { - any_change = 1; - } else { - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, g) { - if (g != smartlist_get(new_primary_guards, g_sl_idx)) { - any_change = 1; - } - } SMARTLIST_FOREACH_END(g); - } - - if (any_change) { - log_info(LD_GUARD, "Primary entry guards have changed. " - "New primary guard list is: "); - int n = smartlist_len(new_primary_guards); - SMARTLIST_FOREACH_BEGIN(new_primary_guards, entry_guard_t *, g) { - log_info(LD_GUARD, " %d/%d: %s%s%s", - g_sl_idx+1, n, entry_guard_describe(g), - g->confirmed_idx >= 0 ? " (confirmed)" : "", - g->is_filtered_guard ? "" : " (excluded by filter)"); - } SMARTLIST_FOREACH_END(g); - } - - smartlist_free(old_primary_guards); - smartlist_free(gs->primary_entry_guards); - gs->primary_entry_guards = new_primary_guards; - gs->primary_guards_up_to_date = 1; - running = 0; -} - -/** - * Return the number of seconds after the last attempt at which we should - * retry a guard that has been failing since failing_since. - */ -static int -get_retry_schedule(time_t failing_since, time_t now, - int is_primary) -{ - const unsigned SIX_HOURS = 6 * 3600; - const unsigned FOUR_DAYS = 4 * 86400; - const unsigned SEVEN_DAYS = 7 * 86400; - - time_t tdiff; - if (now > failing_since) { - tdiff = now - failing_since; - } else { - tdiff = 0; - } - - const struct { - time_t maximum; int primary_delay; int nonprimary_delay; - } delays[] = { - { SIX_HOURS, 10*60, 1*60*60 }, - { FOUR_DAYS, 90*60, 4*60*60 }, - { SEVEN_DAYS, 4*60*60, 18*60*60 }, - { TIME_MAX, 9*60*60, 36*60*60 } - }; - - unsigned i; - for (i = 0; i < ARRAY_LENGTH(delays); ++i) { - if (tdiff <= delays[i].maximum) { - return is_primary ? delays[i].primary_delay : delays[i].nonprimary_delay; - } - } - /* LCOV_EXCL_START -- can't reach, since delays ends with TIME_MAX. */ - tor_assert_nonfatal_unreached(); - return 36*60*60; - /* LCOV_EXCL_STOP */ -} - -/** - * If guard is unreachable, consider whether enough time has passed - * to consider it maybe-reachable again. - */ -STATIC void -entry_guard_consider_retry(entry_guard_t *guard) -{ - if (guard->is_reachable != GUARD_REACHABLE_NO) - return; /* No retry needed. */ - - const time_t now = approx_time(); - const int delay = - get_retry_schedule(guard->failing_since, now, guard->is_primary); - const time_t last_attempt = guard->last_tried_to_connect; - - if (BUG(last_attempt == 0) || - now >= last_attempt + delay) { - /* We should mark this retriable. */ - char tbuf[ISO_TIME_LEN+1]; - format_local_iso_time(tbuf, last_attempt); - log_info(LD_GUARD, "Marked %s%sguard %s for possible retry, since we " - "haven't tried to use it since %s.", - guard->is_primary?"primary ":"", - guard->confirmed_idx>=0?"confirmed ":"", - entry_guard_describe(guard), - tbuf); - - guard->is_reachable = GUARD_REACHABLE_MAYBE; - if (guard->is_filtered_guard) - guard->is_usable_filtered_guard = 1; - } -} - -/** Tell the entry guards subsystem that we have confirmed that as of - * just now, we're on the internet. */ -void -entry_guards_note_internet_connectivity(guard_selection_t *gs) -{ - gs->last_time_on_internet = approx_time(); -} - -/** - * Get a guard for use with a circuit. Prefer to pick a running primary - * guard; then a non-pending running filtered confirmed guard; then a - * non-pending runnable filtered guard. Update the - * last_tried_to_connect time and the is_pending fields of the - * guard as appropriate. Set state_out to the new guard-state - * of the circuit. - */ -STATIC entry_guard_t * -select_entry_guard_for_circuit(guard_selection_t *gs, - guard_usage_t usage, - const entry_guard_restriction_t *rst, - unsigned *state_out) -{ - const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC); - tor_assert(gs); - tor_assert(state_out); - - if (!gs->primary_guards_up_to_date) - entry_guards_update_primary(gs); - - int num_entry_guards = get_n_primary_guards_to_use(usage); - smartlist_t *usable_primary_guards = smartlist_new(); - - /* "If any entry in PRIMARY_GUARDS has {is_reachable} status of - or , return the first such guard." */ - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard); - if (! entry_guard_obeys_restriction(guard, rst)) - continue; - if (guard->is_reachable != GUARD_REACHABLE_NO) { - if (need_descriptor && !guard_has_descriptor(guard)) { - continue; - } - *state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION; - guard->last_tried_to_connect = approx_time(); - smartlist_add(usable_primary_guards, guard); - if (smartlist_len(usable_primary_guards) >= num_entry_guards) - break; - } - } SMARTLIST_FOREACH_END(guard); - - if (smartlist_len(usable_primary_guards)) { - entry_guard_t *guard = smartlist_choose(usable_primary_guards); - smartlist_free(usable_primary_guards); - log_info(LD_GUARD, "Selected primary guard %s for circuit.", - entry_guard_describe(guard)); - return guard; - } - smartlist_free(usable_primary_guards); - - /* "Otherwise, if the ordered intersection of {CONFIRMED_GUARDS} - and {USABLE_FILTERED_GUARDS} is nonempty, return the first - entry in that intersection that has {is_pending} set to - false." */ - SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) { - if (guard->is_primary) - continue; /* we already considered this one. */ - if (! entry_guard_obeys_restriction(guard, rst)) - continue; - entry_guard_consider_retry(guard); - if (guard->is_usable_filtered_guard && ! guard->is_pending) { - if (need_descriptor && !guard_has_descriptor(guard)) - continue; /* not a bug */ - guard->is_pending = 1; - guard->last_tried_to_connect = approx_time(); - *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD; - log_info(LD_GUARD, "No primary guards available. Selected confirmed " - "guard %s for circuit. Will try other guards before using " - "this circuit.", - entry_guard_describe(guard)); - return guard; - } - } SMARTLIST_FOREACH_END(guard); - - /* "Otherwise, if there is no such entry, select a member at - random from {USABLE_FILTERED_GUARDS}." */ - { - entry_guard_t *guard; - unsigned flags = 0; - if (need_descriptor) - flags |= SAMPLE_EXCLUDE_NO_DESCRIPTOR; - guard = sample_reachable_filtered_entry_guards(gs, - rst, - SAMPLE_EXCLUDE_CONFIRMED | - SAMPLE_EXCLUDE_PRIMARY | - SAMPLE_EXCLUDE_PENDING | - flags); - if (guard == NULL) { - log_info(LD_GUARD, "Absolutely no sampled guards were available. " - "Marking all guards for retry and starting from top again."); - mark_all_guards_maybe_reachable(gs); - return NULL; - } - guard->is_pending = 1; - guard->last_tried_to_connect = approx_time(); - *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD; - log_info(LD_GUARD, "No primary or confirmed guards available. Selected " - "random guard %s for circuit. Will try other guards before " - "using this circuit.", - entry_guard_describe(guard)); - return guard; - } -} - -/** - * Note that we failed to connect to or build circuits through guard. - * Use with a guard returned by select_entry_guard_for_circuit(). - */ -STATIC void -entry_guards_note_guard_failure(guard_selection_t *gs, - entry_guard_t *guard) -{ - tor_assert(gs); - - guard->is_reachable = GUARD_REACHABLE_NO; - guard->is_usable_filtered_guard = 0; - - guard->is_pending = 0; - if (guard->failing_since == 0) - guard->failing_since = approx_time(); - - log_info(LD_GUARD, "Recorded failure for %s%sguard %s", - guard->is_primary?"primary ":"", - guard->confirmed_idx>=0?"confirmed ":"", - entry_guard_describe(guard)); -} - -/** - * Note that we successfully connected to, and built a circuit through - * guard. Given the old guard-state of the circuit in old_state, - * return the new guard-state of the circuit. - * - * Be aware: the circuit is only usable when its guard-state becomes - * GUARD_CIRC_STATE_COMPLETE. - **/ -STATIC unsigned -entry_guards_note_guard_success(guard_selection_t *gs, - entry_guard_t *guard, - unsigned old_state) -{ - tor_assert(gs); - - /* Save this, since we're about to overwrite it. */ - const time_t last_time_on_internet = gs->last_time_on_internet; - gs->last_time_on_internet = approx_time(); - - guard->is_reachable = GUARD_REACHABLE_YES; - guard->failing_since = 0; - guard->is_pending = 0; - if (guard->is_filtered_guard) - guard->is_usable_filtered_guard = 1; - - if (guard->confirmed_idx < 0) { - make_guard_confirmed(gs, guard); - if (!gs->primary_guards_up_to_date) - entry_guards_update_primary(gs); - } - - unsigned new_state; - switch (old_state) { - case GUARD_CIRC_STATE_COMPLETE: - case GUARD_CIRC_STATE_USABLE_ON_COMPLETION: - new_state = GUARD_CIRC_STATE_COMPLETE; - break; - default: - tor_assert_nonfatal_unreached(); - /* Fall through. */ - case GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD: - if (guard->is_primary) { - /* XXXX #20832 -- I don't actually like this logic. It seems to make - * us a little more susceptible to evil-ISP attacks. The mitigations - * I'm thinking of, however, aren't local to this point, so I'll leave - * it alone. */ - /* This guard may have become primary by virtue of being confirmed. - * If so, the circuit for it is now complete. - */ - new_state = GUARD_CIRC_STATE_COMPLETE; - } else { - new_state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD; - } - break; - } - - if (! guard->is_primary) { - if (last_time_on_internet + get_internet_likely_down_interval() - < approx_time()) { - mark_primary_guards_maybe_reachable(gs); - } - } - - log_info(LD_GUARD, "Recorded success for %s%sguard %s", - guard->is_primary?"primary ":"", - guard->confirmed_idx>=0?"confirmed ":"", - entry_guard_describe(guard)); - - return new_state; -} - -/** - * Helper: Return true iff a has higher priority than b. - */ -STATIC int -entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b) -{ - tor_assert(a && b); - if (a == b) - return 0; - - /* Confirmed is always better than unconfirmed; lower index better - than higher */ - if (a->confirmed_idx < 0) { - if (b->confirmed_idx >= 0) - return 0; - } else { - if (b->confirmed_idx < 0) - return 1; - - /* Lower confirmed_idx is better than higher. */ - return (a->confirmed_idx < b->confirmed_idx); - } - - /* If we reach this point, both are unconfirmed. If one is pending, it - * has higher priority. */ - if (a->is_pending) { - if (! b->is_pending) - return 1; - - /* Both are pending: earlier last_tried_connect wins. */ - return a->last_tried_to_connect < b->last_tried_to_connect; - } else { - if (b->is_pending) - return 0; - - /* Neither is pending: priorities are equal. */ - return 0; - } -} - -/** Release all storage held in restriction */ -STATIC void -entry_guard_restriction_free_(entry_guard_restriction_t *rst) -{ - tor_free(rst); -} - -/** - * Release all storage held in state. - */ -void -circuit_guard_state_free_(circuit_guard_state_t *state) -{ - if (!state) - return; - entry_guard_restriction_free(state->restrictions); - entry_guard_handle_free(state->guard); - tor_free(state); -} - -/** Allocate and return a new circuit_guard_state_t to track the result - * of using guard for a given operation. */ -MOCK_IMPL(STATIC circuit_guard_state_t *, -circuit_guard_state_new,(entry_guard_t *guard, unsigned state, - entry_guard_restriction_t *rst)) -{ - circuit_guard_state_t *result; - - result = tor_malloc_zero(sizeof(circuit_guard_state_t)); - result->guard = entry_guard_handle_new(guard); - result->state = state; - result->state_set_at = approx_time(); - result->restrictions = rst; - - return result; -} - -/** - * Pick a suitable entry guard for a circuit in, and place that guard - * in *chosen_node_out. Set *guard_state_out to an opaque - * state object that will record whether the circuit is ready to be used - * or not. Return 0 on success; on failure, return -1. - * - * If a restriction is provided in rst, do not return any guards that - * violate it, and remember that restriction in guard_state_out for - * later use. (Takes ownership of the rst object.) - */ -int -entry_guard_pick_for_circuit(guard_selection_t *gs, - guard_usage_t usage, - entry_guard_restriction_t *rst, - const node_t **chosen_node_out, - circuit_guard_state_t **guard_state_out) -{ - tor_assert(gs); - tor_assert(chosen_node_out); - tor_assert(guard_state_out); - *chosen_node_out = NULL; - *guard_state_out = NULL; - - unsigned state = 0; - entry_guard_t *guard = - select_entry_guard_for_circuit(gs, usage, rst, &state); - if (! guard) - goto fail; - if (BUG(state == 0)) - goto fail; - const node_t *node = node_get_by_id(guard->identity); - // XXXX #20827 check Ed ID. - if (! node) - goto fail; - if (BUG(usage != GUARD_USAGE_DIRGUARD && !node_has_descriptor(node))) - goto fail; - - *chosen_node_out = node; - *guard_state_out = circuit_guard_state_new(guard, state, rst); - - return 0; - fail: - entry_guard_restriction_free(rst); - return -1; -} - -/** - * Called by the circuit building module when a circuit has succeeded: informs - * the guards code that the guard in *guard_state_p is working, and - * advances the state of the guard module. On a GUARD_USABLE_NEVER return - * value, the circuit is broken and should not be used. On a GUARD_USABLE_NOW - * return value, the circuit is ready to use. On a GUARD_MAYBE_USABLE_LATER - * return value, the circuit should not be used until we find out whether - * preferred guards will work for us. - */ -guard_usable_t -entry_guard_succeeded(circuit_guard_state_t **guard_state_p) -{ - if (BUG(*guard_state_p == NULL)) - return GUARD_USABLE_NEVER; - - entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard); - if (! guard || BUG(guard->in_selection == NULL)) - return GUARD_USABLE_NEVER; - - unsigned newstate = - entry_guards_note_guard_success(guard->in_selection, guard, - (*guard_state_p)->state); - - (*guard_state_p)->state = newstate; - (*guard_state_p)->state_set_at = approx_time(); - - if (newstate == GUARD_CIRC_STATE_COMPLETE) { - return GUARD_USABLE_NOW; - } else { - return GUARD_MAYBE_USABLE_LATER; - } -} - -/** Cancel the selection of *guard_state_p without declaring - * success or failure. It is safe to call this function if success or - * failure _has_ already been declared. */ -void -entry_guard_cancel(circuit_guard_state_t **guard_state_p) -{ - if (BUG(*guard_state_p == NULL)) - return; - entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard); - if (! guard) - return; - - /* XXXX prop271 -- last_tried_to_connect_at will be erroneous here, but this - * function will only get called in "bug" cases anyway. */ - guard->is_pending = 0; - circuit_guard_state_free(*guard_state_p); - *guard_state_p = NULL; -} - -/** - * Called by the circuit building module when a circuit has succeeded: - * informs the guards code that the guard in *guard_state_p is - * not working, and advances the state of the guard module. - */ -void -entry_guard_failed(circuit_guard_state_t **guard_state_p) -{ - if (BUG(*guard_state_p == NULL)) - return; - - entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard); - if (! guard || BUG(guard->in_selection == NULL)) - return; - - entry_guards_note_guard_failure(guard->in_selection, guard); - - (*guard_state_p)->state = GUARD_CIRC_STATE_DEAD; - (*guard_state_p)->state_set_at = approx_time(); -} - -/** - * Run the entry_guard_failed() function on every circuit that is - * pending on chan. - */ -void -entry_guard_chan_failed(channel_t *chan) -{ - if (!chan) - return; - - smartlist_t *pending = smartlist_new(); - circuit_get_all_pending_on_channel(pending, chan); - SMARTLIST_FOREACH_BEGIN(pending, circuit_t *, circ) { - if (!CIRCUIT_IS_ORIGIN(circ)) - continue; - - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - if (origin_circ->guard_state) { - /* We might have no guard state if we didn't use a guard on this - * circuit (eg it's for a fallback directory). */ - entry_guard_failed(&origin_circ->guard_state); - } - } SMARTLIST_FOREACH_END(circ); - smartlist_free(pending); -} - -/** - * Return true iff every primary guard in gs is believed to - * be unreachable. - */ -STATIC int -entry_guards_all_primary_guards_are_down(guard_selection_t *gs) -{ - tor_assert(gs); - if (!gs->primary_guards_up_to_date) - entry_guards_update_primary(gs); - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard); - if (guard->is_reachable != GUARD_REACHABLE_NO) - return 0; - } SMARTLIST_FOREACH_END(guard); - return 1; -} - -/** Wrapper for entry_guard_has_higher_priority that compares the - * guard-priorities of a pair of circuits. Return 1 if a has higher - * priority than b. - * - * If a restriction is provided in rst, then do not consider - * a to have higher priority if it violates the restriction. - */ -static int -circ_state_has_higher_priority(origin_circuit_t *a, - const entry_guard_restriction_t *rst, - origin_circuit_t *b) -{ - circuit_guard_state_t *state_a = origin_circuit_get_guard_state(a); - circuit_guard_state_t *state_b = origin_circuit_get_guard_state(b); - - tor_assert(state_a); - tor_assert(state_b); - - entry_guard_t *guard_a = entry_guard_handle_get(state_a->guard); - entry_guard_t *guard_b = entry_guard_handle_get(state_b->guard); - - if (! guard_a) { - /* Unknown guard -- never higher priority. */ - return 0; - } else if (! guard_b) { - /* Known guard -- higher priority than any unknown guard. */ - return 1; - } else if (! entry_guard_obeys_restriction(guard_a, rst)) { - /* Restriction violated; guard_a cannot have higher priority. */ - return 0; - } else { - /* Both known -- compare.*/ - return entry_guard_has_higher_priority(guard_a, guard_b); - } -} - -/** - * Look at all of the origin_circuit_t * objects in all_circuits_in, - * and see if any of them that were previously not ready to use for - * guard-related reasons are now ready to use. Place those circuits - * in newly_complete_out, and mark them COMPLETE. - * - * Return 1 if we upgraded any circuits, and 0 otherwise. - */ -int -entry_guards_upgrade_waiting_circuits(guard_selection_t *gs, - const smartlist_t *all_circuits_in, - smartlist_t *newly_complete_out) -{ - tor_assert(gs); - tor_assert(all_circuits_in); - tor_assert(newly_complete_out); - - if (! entry_guards_all_primary_guards_are_down(gs)) { - /* We only upgrade a waiting circuit if the primary guards are all - * down. */ - log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, " - "but not all primary guards were definitely down."); - return 0; - } - - int n_waiting = 0; - int n_complete = 0; - int n_complete_blocking = 0; - origin_circuit_t *best_waiting_circuit = NULL; - smartlist_t *all_circuits = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(all_circuits_in, origin_circuit_t *, circ) { - // We filter out circuits that aren't ours, or which we can't - // reason about. - circuit_guard_state_t *state = origin_circuit_get_guard_state(circ); - if (state == NULL) - continue; - entry_guard_t *guard = entry_guard_handle_get(state->guard); - if (!guard || guard->in_selection != gs) - continue; - - smartlist_add(all_circuits, circ); - } SMARTLIST_FOREACH_END(circ); - - SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) { - circuit_guard_state_t *state = origin_circuit_get_guard_state(circ); - if (BUG(state == NULL)) - continue; - - if (state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD) { - ++n_waiting; - if (! best_waiting_circuit || - circ_state_has_higher_priority(circ, NULL, best_waiting_circuit)) { - best_waiting_circuit = circ; - } - } - } SMARTLIST_FOREACH_END(circ); - - if (! best_waiting_circuit) { - log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, " - "but didn't find any."); - goto no_change; - } - - /* We'll need to keep track of what restrictions were used when picking this - * circuit, so that we don't allow any circuit without those restrictions to - * block it. */ - const entry_guard_restriction_t *rst_on_best_waiting = - origin_circuit_get_guard_state(best_waiting_circuit)->restrictions; - - /* First look at the complete circuits: Do any block this circuit? */ - SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) { - /* "C2 "blocks" C1 if: - * C2 obeys all the restrictions that C1 had to obey, AND - * C2 has higher priority than C1, AND - * Either C2 is , or C2 is , - or C2 has been for no more than - {NONPRIMARY_GUARD_CONNECT_TIMEOUT} seconds." - */ - circuit_guard_state_t *state = origin_circuit_get_guard_state(circ); - if BUG((state == NULL)) - continue; - if (state->state != GUARD_CIRC_STATE_COMPLETE) - continue; - ++n_complete; - if (circ_state_has_higher_priority(circ, rst_on_best_waiting, - best_waiting_circuit)) - ++n_complete_blocking; - } SMARTLIST_FOREACH_END(circ); - - if (n_complete_blocking) { - log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found " - "%d complete and %d guard-stalled. At least one complete " - "circuit had higher priority, so not upgrading.", - n_complete, n_waiting); - goto no_change; - } - - /* " * If any circuit C1 is , AND: - * All primary guards have reachable status of . - * There is no circuit C2 that "blocks" C1. - Then, upgrade C1 to ."" - */ - int n_blockers_found = 0; - const time_t state_set_at_cutoff = - approx_time() - get_nonprimary_guard_connect_timeout(); - SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) { - circuit_guard_state_t *state = origin_circuit_get_guard_state(circ); - if (BUG(state == NULL)) - continue; - if (state->state != GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD) - continue; - if (state->state_set_at <= state_set_at_cutoff) - continue; - if (circ_state_has_higher_priority(circ, rst_on_best_waiting, - best_waiting_circuit)) - ++n_blockers_found; - } SMARTLIST_FOREACH_END(circ); - - if (n_blockers_found) { - log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found " - "%d guard-stalled, but %d pending circuit(s) had higher " - "guard priority, so not upgrading.", - n_waiting, n_blockers_found); - goto no_change; - } - - /* Okay. We have a best waiting circuit, and we aren't waiting for - anything better. Add all circuits with that priority to the - list, and call them COMPLETE. */ - int n_succeeded = 0; - SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) { - circuit_guard_state_t *state = origin_circuit_get_guard_state(circ); - if (BUG(state == NULL)) - continue; - if (circ != best_waiting_circuit && rst_on_best_waiting) { - /* Can't upgrade other circ with same priority as best; might - be blocked. */ - continue; - } - if (state->state != GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD) - continue; - if (circ_state_has_higher_priority(best_waiting_circuit, NULL, circ)) - continue; - - state->state = GUARD_CIRC_STATE_COMPLETE; - state->state_set_at = approx_time(); - smartlist_add(newly_complete_out, circ); - ++n_succeeded; - } SMARTLIST_FOREACH_END(circ); - - log_info(LD_GUARD, "Considered upgrading guard-stalled circuits: found " - "%d guard-stalled, %d complete. %d of the guard-stalled " - "circuit(s) had high enough priority to upgrade.", - n_waiting, n_complete, n_succeeded); - - tor_assert_nonfatal(n_succeeded >= 1); - smartlist_free(all_circuits); - return 1; - - no_change: - smartlist_free(all_circuits); - return 0; -} - -/** - * Return true iff the circuit whose state is guard_state should - * expire. - */ -int -entry_guard_state_should_expire(circuit_guard_state_t *guard_state) -{ - if (guard_state == NULL) - return 0; - const time_t expire_if_waiting_since = - approx_time() - get_nonprimary_guard_idle_timeout(); - return (guard_state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD - && guard_state->state_set_at < expire_if_waiting_since); -} - -/** - * Update all derived pieces of the guard selection state in gs. - * Return true iff we should stop using all previously generated circuits. - */ -int -entry_guards_update_all(guard_selection_t *gs) -{ - sampled_guards_update_from_consensus(gs); - entry_guards_update_filtered_sets(gs); - entry_guards_update_confirmed(gs); - entry_guards_update_primary(gs); - return 0; -} - -/** - * Return a newly allocated string for encoding the persistent parts of - * guard to the state file. - */ -STATIC char * -entry_guard_encode_for_state(entry_guard_t *guard) -{ - /* - * The meta-format we use is K=V K=V K=V... where K can be any - * characters excepts space and =, and V can be any characters except - * space. The order of entries is not allowed to matter. - * Unrecognized K=V entries are persisted; recognized but erroneous - * entries are corrected. - */ - - smartlist_t *result = smartlist_new(); - char tbuf[ISO_TIME_LEN+1]; - - tor_assert(guard); - - smartlist_add_asprintf(result, "in=%s", guard->selection_name); - smartlist_add_asprintf(result, "rsa_id=%s", - hex_str(guard->identity, DIGEST_LEN)); - if (guard->bridge_addr) { - smartlist_add_asprintf(result, "bridge_addr=%s:%d", - fmt_and_decorate_addr(&guard->bridge_addr->addr), - guard->bridge_addr->port); - } - if (strlen(guard->nickname) && is_legal_nickname(guard->nickname)) { - smartlist_add_asprintf(result, "nickname=%s", guard->nickname); - } - - format_iso_time_nospace(tbuf, guard->sampled_on_date); - smartlist_add_asprintf(result, "sampled_on=%s", tbuf); - - if (guard->sampled_by_version) { - smartlist_add_asprintf(result, "sampled_by=%s", - guard->sampled_by_version); - } - - if (guard->unlisted_since_date > 0) { - format_iso_time_nospace(tbuf, guard->unlisted_since_date); - smartlist_add_asprintf(result, "unlisted_since=%s", tbuf); - } - - smartlist_add_asprintf(result, "listed=%d", - (int)guard->currently_listed); - - if (guard->confirmed_idx >= 0) { - format_iso_time_nospace(tbuf, guard->confirmed_on_date); - smartlist_add_asprintf(result, "confirmed_on=%s", tbuf); - - smartlist_add_asprintf(result, "confirmed_idx=%d", guard->confirmed_idx); - } - - const double EPSILON = 1.0e-6; - - /* Make a copy of the pathbias object, since we will want to update - some of them */ - guard_pathbias_t *pb = tor_memdup(&guard->pb, sizeof(*pb)); - pb->use_successes = pathbias_get_use_success_count(guard); - pb->successful_circuits_closed = pathbias_get_close_success_count(guard); - - #define PB_FIELD(field) do { \ - if (pb->field >= EPSILON) { \ - smartlist_add_asprintf(result, "pb_" #field "=%f", pb->field); \ - } \ - } while (0) - PB_FIELD(use_attempts); - PB_FIELD(use_successes); - PB_FIELD(circ_attempts); - PB_FIELD(circ_successes); - PB_FIELD(successful_circuits_closed); - PB_FIELD(collapsed_circuits); - PB_FIELD(unusable_circuits); - PB_FIELD(timeouts); - tor_free(pb); -#undef PB_FIELD - - if (guard->extra_state_fields) - smartlist_add_strdup(result, guard->extra_state_fields); - - char *joined = smartlist_join_strings(result, " ", 0, NULL); - SMARTLIST_FOREACH(result, char *, cp, tor_free(cp)); - smartlist_free(result); - - return joined; -} - -/** - * Given a string generated by entry_guard_encode_for_state(), parse it - * (if possible) and return an entry_guard_t object for it. Return NULL - * on complete failure. - */ -STATIC entry_guard_t * -entry_guard_parse_from_state(const char *s) -{ - /* Unrecognized entries get put in here. */ - smartlist_t *extra = smartlist_new(); - - /* These fields get parsed from the string. */ - char *in = NULL; - char *rsa_id = NULL; - char *nickname = NULL; - char *sampled_on = NULL; - char *sampled_by = NULL; - char *unlisted_since = NULL; - char *listed = NULL; - char *confirmed_on = NULL; - char *confirmed_idx = NULL; - char *bridge_addr = NULL; - - // pathbias - char *pb_use_attempts = NULL; - char *pb_use_successes = NULL; - char *pb_circ_attempts = NULL; - char *pb_circ_successes = NULL; - char *pb_successful_circuits_closed = NULL; - char *pb_collapsed_circuits = NULL; - char *pb_unusable_circuits = NULL; - char *pb_timeouts = NULL; - - /* Split up the entries. Put the ones we know about in strings and the - * rest in "extra". */ - { - smartlist_t *entries = smartlist_new(); - - strmap_t *vals = strmap_new(); // Maps keyword to location -#define FIELD(f) \ - strmap_set(vals, #f, &f); - FIELD(in); - FIELD(rsa_id); - FIELD(nickname); - FIELD(sampled_on); - FIELD(sampled_by); - FIELD(unlisted_since); - FIELD(listed); - FIELD(confirmed_on); - FIELD(confirmed_idx); - FIELD(bridge_addr); - FIELD(pb_use_attempts); - FIELD(pb_use_successes); - FIELD(pb_circ_attempts); - FIELD(pb_circ_successes); - FIELD(pb_successful_circuits_closed); - FIELD(pb_collapsed_circuits); - FIELD(pb_unusable_circuits); - FIELD(pb_timeouts); -#undef FIELD - - smartlist_split_string(entries, s, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - - SMARTLIST_FOREACH_BEGIN(entries, char *, entry) { - const char *eq = strchr(entry, '='); - if (!eq) { - smartlist_add(extra, entry); - continue; - } - char *key = tor_strndup(entry, eq-entry); - char **target = strmap_get(vals, key); - if (target == NULL || *target != NULL) { - /* unrecognized or already set */ - smartlist_add(extra, entry); - tor_free(key); - continue; - } - - *target = tor_strdup(eq+1); - tor_free(key); - tor_free(entry); - } SMARTLIST_FOREACH_END(entry); - - smartlist_free(entries); - strmap_free(vals, NULL); - } - - entry_guard_t *guard = tor_malloc_zero(sizeof(entry_guard_t)); - guard->is_persistent = 1; - - if (in == NULL) { - log_warn(LD_CIRC, "Guard missing 'in' field"); - goto err; - } - - guard->selection_name = in; - in = NULL; - - if (rsa_id == NULL) { - log_warn(LD_CIRC, "Guard missing RSA ID field"); - goto err; - } - - /* Process the identity and nickname. */ - if (base16_decode(guard->identity, sizeof(guard->identity), - rsa_id, strlen(rsa_id)) != DIGEST_LEN) { - log_warn(LD_CIRC, "Unable to decode guard identity %s", escaped(rsa_id)); - goto err; - } - - if (nickname) { - strlcpy(guard->nickname, nickname, sizeof(guard->nickname)); - } else { - guard->nickname[0]='$'; - base16_encode(guard->nickname+1, sizeof(guard->nickname)-1, - guard->identity, DIGEST_LEN); - } - - if (bridge_addr) { - tor_addr_port_t res; - memset(&res, 0, sizeof(res)); - int r = tor_addr_port_parse(LOG_WARN, bridge_addr, - &res.addr, &res.port, -1); - if (r == 0) - guard->bridge_addr = tor_memdup(&res, sizeof(res)); - /* On error, we already warned. */ - } - - /* Process the various time fields. */ - -#define HANDLE_TIME(field) do { \ - if (field) { \ - int r = parse_iso_time_nospace(field, &field ## _time); \ - if (r < 0) { \ - log_warn(LD_CIRC, "Unable to parse %s %s from guard", \ - #field, escaped(field)); \ - field##_time = -1; \ - } \ - } \ - } while (0) - - time_t sampled_on_time = 0; - time_t unlisted_since_time = 0; - time_t confirmed_on_time = 0; - - HANDLE_TIME(sampled_on); - HANDLE_TIME(unlisted_since); - HANDLE_TIME(confirmed_on); - - if (sampled_on_time <= 0) - sampled_on_time = approx_time(); - if (unlisted_since_time < 0) - unlisted_since_time = 0; - if (confirmed_on_time < 0) - confirmed_on_time = 0; - - #undef HANDLE_TIME - - guard->sampled_on_date = sampled_on_time; - guard->unlisted_since_date = unlisted_since_time; - guard->confirmed_on_date = confirmed_on_time; - - /* Take sampled_by_version verbatim. */ - guard->sampled_by_version = sampled_by; - sampled_by = NULL; /* prevent free */ - - /* Listed is a boolean */ - if (listed && strcmp(listed, "0")) - guard->currently_listed = 1; - - /* The index is a nonnegative integer. */ - guard->confirmed_idx = -1; - if (confirmed_idx) { - int ok=1; - long idx = tor_parse_long(confirmed_idx, 10, 0, INT_MAX, &ok, NULL); - if (! ok) { - log_warn(LD_GUARD, "Guard has invalid confirmed_idx %s", - escaped(confirmed_idx)); - } else { - guard->confirmed_idx = (int)idx; - } - } - - /* Anything we didn't recognize gets crammed together */ - if (smartlist_len(extra) > 0) { - guard->extra_state_fields = smartlist_join_strings(extra, " ", 0, NULL); - } - - /* initialize non-persistent fields */ - guard->is_reachable = GUARD_REACHABLE_MAYBE; - -#define PB_FIELD(field) \ - do { \ - if (pb_ ## field) { \ - int ok = 1; \ - double r = tor_parse_double(pb_ ## field, 0.0, 1e9, &ok, NULL); \ - if (! ok) { \ - log_warn(LD_CIRC, "Guard has invalid pb_%s %s", \ - #field, pb_ ## field); \ - } else { \ - guard->pb.field = r; \ - } \ - } \ - } while (0) - PB_FIELD(use_attempts); - PB_FIELD(use_successes); - PB_FIELD(circ_attempts); - PB_FIELD(circ_successes); - PB_FIELD(successful_circuits_closed); - PB_FIELD(collapsed_circuits); - PB_FIELD(unusable_circuits); - PB_FIELD(timeouts); -#undef PB_FIELD - - pathbias_check_use_success_count(guard); - pathbias_check_close_success_count(guard); - - /* We update everything on this guard later, after we've parsed - * everything. */ - - goto done; - - err: - // only consider it an error if the guard state was totally unparseable. - entry_guard_free(guard); - guard = NULL; - - done: - tor_free(in); - tor_free(rsa_id); - tor_free(nickname); - tor_free(sampled_on); - tor_free(sampled_by); - tor_free(unlisted_since); - tor_free(listed); - tor_free(confirmed_on); - tor_free(confirmed_idx); - tor_free(bridge_addr); - tor_free(pb_use_attempts); - tor_free(pb_use_successes); - tor_free(pb_circ_attempts); - tor_free(pb_circ_successes); - tor_free(pb_successful_circuits_closed); - tor_free(pb_collapsed_circuits); - tor_free(pb_unusable_circuits); - tor_free(pb_timeouts); - - SMARTLIST_FOREACH(extra, char *, cp, tor_free(cp)); - smartlist_free(extra); - - return guard; -} - -/** - * Replace the Guards entries in state with a list of all our sampled - * guards. - */ -static void -entry_guards_update_guards_in_state(or_state_t *state) -{ - if (!guard_contexts) - return; - config_line_t *lines = NULL; - config_line_t **nextline = &lines; - - SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - if (guard->is_persistent == 0) - continue; - *nextline = tor_malloc_zero(sizeof(config_line_t)); - (*nextline)->key = tor_strdup("Guard"); - (*nextline)->value = entry_guard_encode_for_state(guard); - nextline = &(*nextline)->next; - } SMARTLIST_FOREACH_END(guard); - } SMARTLIST_FOREACH_END(gs); - - config_free_lines(state->Guard); - state->Guard = lines; -} - -/** - * Replace our sampled guards from the Guards entries in state. Return 0 - * on success, -1 on failure. (If set is true, replace nothing -- only - * check whether replacing would work.) - */ -static int -entry_guards_load_guards_from_state(or_state_t *state, int set) -{ - const config_line_t *line = state->Guard; - int n_errors = 0; - - if (!guard_contexts) - guard_contexts = smartlist_new(); - - /* Wipe all our existing guard info. (we shouldn't have any, but - * let's be safe.) */ - if (set) { - SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - guard_selection_free(gs); - if (curr_guard_context == gs) - curr_guard_context = NULL; - SMARTLIST_DEL_CURRENT(guard_contexts, gs); - } SMARTLIST_FOREACH_END(gs); - } - - for ( ; line != NULL; line = line->next) { - entry_guard_t *guard = entry_guard_parse_from_state(line->value); - if (guard == NULL) { - ++n_errors; - continue; - } - tor_assert(guard->selection_name); - if (!strcmp(guard->selection_name, "legacy")) { - ++n_errors; - entry_guard_free(guard); - continue; - } - - if (set) { - guard_selection_t *gs; - gs = get_guard_selection_by_name(guard->selection_name, - GS_TYPE_INFER, 1); - tor_assert(gs); - smartlist_add(gs->sampled_entry_guards, guard); - guard->in_selection = gs; - } else { - entry_guard_free(guard); - } - } - - if (set) { - SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - entry_guards_update_all(gs); - } SMARTLIST_FOREACH_END(gs); - } - return n_errors ? -1 : 0; -} - -/** If digest matches the identity of any node in the - * entry_guards list for the provided guard selection state, - return that node. Else return NULL. */ -entry_guard_t * -entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, - const char *digest) -{ - return get_sampled_guard_with_id(gs, (const uint8_t*)digest); -} - -/** Return the node_t associated with a single entry_guard_t. May - * return NULL if the guard is not currently in the consensus. */ -const node_t * -entry_guard_find_node(const entry_guard_t *guard) -{ - tor_assert(guard); - return node_get_by_id(guard->identity); -} - -/** If digest matches the identity of any node in the - * entry_guards list for the default guard selection state, - return that node. Else return NULL. */ -entry_guard_t * -entry_guard_get_by_id_digest(const char *digest) -{ - return entry_guard_get_by_id_digest_for_guard_selection( - get_guard_selection_info(), digest); -} - -/** We are about to connect to bridge with identity digest to fetch its - * descriptor. Create a new guard state for this connection and return it. */ -circuit_guard_state_t * -get_guard_state_for_bridge_desc_fetch(const char *digest) -{ - circuit_guard_state_t *guard_state = NULL; - entry_guard_t *guard = NULL; - - guard = entry_guard_get_by_id_digest_for_guard_selection( - get_guard_selection_info(), digest); - if (!guard) { - return NULL; - } - - /* Update the guard last_tried_to_connect time since it's checked by the - * guard susbsystem. */ - guard->last_tried_to_connect = approx_time(); - - /* Create the guard state */ - guard_state = circuit_guard_state_new(guard, - GUARD_CIRC_STATE_USABLE_ON_COMPLETION, - NULL); - - return guard_state; -} - -/** Release all storage held by e. */ -STATIC void -entry_guard_free_(entry_guard_t *e) -{ - if (!e) - return; - entry_guard_handles_clear(e); - tor_free(e->sampled_by_version); - tor_free(e->extra_state_fields); - tor_free(e->selection_name); - tor_free(e->bridge_addr); - tor_free(e); -} - -/** Return 0 if we're fine adding arbitrary routers out of the - * directory to our entry guard list, or return 1 if we have a - * list already and we must stick to it. - */ -int -entry_list_is_constrained(const or_options_t *options) -{ - // XXXX #21425 look at the current selection. - if (options->EntryNodes) - return 1; - if (options->UseBridges) - return 1; - return 0; -} - -/** Return the number of bridges that have descriptors that are marked with - * purpose 'bridge' and are running. If use_maybe_reachable is - * true, include bridges that might be reachable in the count. - * Otherwise, if it is false, only include bridges that have recently been - * found running in the count. - * - * We use this function to decide if we're ready to start building - * circuits through our bridges, or if we need to wait until the - * directory "server/authority" requests finish. */ -MOCK_IMPL(int, -num_bridges_usable,(int use_maybe_reachable)) -{ - int n_options = 0; - - if (BUG(!get_options()->UseBridges)) { - return 0; - } - guard_selection_t *gs = get_guard_selection_info(); - if (BUG(gs->type != GS_TYPE_BRIDGE)) { - return 0; - } - - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) { - /* Definitely not usable */ - if (guard->is_reachable == GUARD_REACHABLE_NO) - continue; - /* If we want to be really sure the bridges will work, skip maybes */ - if (!use_maybe_reachable && guard->is_reachable == GUARD_REACHABLE_MAYBE) - continue; - if (tor_digest_is_zero(guard->identity)) - continue; - const node_t *node = node_get_by_id(guard->identity); - if (node && node->ri) - ++n_options; - } SMARTLIST_FOREACH_END(guard); - - return n_options; -} - -/** Check the pathbias use success count of node and disable it if it - * goes over our thresholds. */ -static void -pathbias_check_use_success_count(entry_guard_t *node) -{ - const or_options_t *options = get_options(); - const double EPSILON = 1.0e-9; - - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (node->pb.use_attempts > EPSILON && - pathbias_get_use_success_count(node)/node->pb.use_attempts - < pathbias_get_extreme_use_rate(options) && - pathbias_get_dropguards(options)) { - node->pb.path_bias_disabled = 1; - log_info(LD_GENERAL, - "Path use bias is too high (%f/%f); disabling node %s", - node->pb.circ_successes, node->pb.circ_attempts, - node->nickname); - } -} - -/** Check the pathbias close count of node and disable it if it goes - * over our thresholds. */ -static void -pathbias_check_close_success_count(entry_guard_t *node) -{ - const or_options_t *options = get_options(); - const double EPSILON = 1.0e-9; - - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (node->pb.circ_attempts > EPSILON && - pathbias_get_close_success_count(node)/node->pb.circ_attempts - < pathbias_get_extreme_rate(options) && - pathbias_get_dropguards(options)) { - node->pb.path_bias_disabled = 1; - log_info(LD_GENERAL, - "Path bias is too high (%f/%f); disabling node %s", - node->pb.circ_successes, node->pb.circ_attempts, - node->nickname); - } -} - -/** Parse state and learn about the entry guards it describes. - * If set is true, and there are no errors, replace the guard - * list in the default guard selection context with what we find. - * On success, return 0. On failure, alloc into *msg a string - * describing the error, and return -1. - */ -int -entry_guards_parse_state(or_state_t *state, int set, char **msg) -{ - entry_guards_dirty = 0; - int r1 = entry_guards_load_guards_from_state(state, set); - entry_guards_dirty = 0; - - if (r1 < 0) { - if (msg && *msg == NULL) { - *msg = tor_strdup("parsing error"); - } - return -1; - } - return 0; -} - -/** How long will we let a change in our guard nodes stay un-saved - * when we are trying to avoid disk writes? */ -#define SLOW_GUARD_STATE_FLUSH_TIME 600 -/** How long will we let a change in our guard nodes stay un-saved - * when we are not trying to avoid disk writes? */ -#define FAST_GUARD_STATE_FLUSH_TIME 30 - -/** Our list of entry guards has changed for a particular guard selection - * context, or some element of one of our entry guards has changed for one. - * Write the changes to disk within the next few minutes. - */ -void -entry_guards_changed_for_guard_selection(guard_selection_t *gs) -{ - time_t when; - - tor_assert(gs != NULL); - - entry_guards_dirty = 1; - - if (get_options()->AvoidDiskWrites) - when = time(NULL) + SLOW_GUARD_STATE_FLUSH_TIME; - else - when = time(NULL) + FAST_GUARD_STATE_FLUSH_TIME; - - /* or_state_save() will call entry_guards_update_state() and - entry_guards_update_guards_in_state() - */ - or_state_mark_dirty(get_or_state(), when); -} - -/** Our list of entry guards has changed for the default guard selection - * context, or some element of one of our entry guards has changed. Write - * the changes to disk within the next few minutes. - */ -void -entry_guards_changed(void) -{ - entry_guards_changed_for_guard_selection(get_guard_selection_info()); -} - -/** If the entry guard info has not changed, do nothing and return. - * Otherwise, free the EntryGuards piece of state and create - * a new one out of the global entry_guards list, and then mark - * state dirty so it will get saved to disk. - */ -void -entry_guards_update_state(or_state_t *state) -{ - entry_guards_dirty = 0; - - // Handles all guard info. - entry_guards_update_guards_in_state(state); - - entry_guards_dirty = 0; - - if (!get_options()->AvoidDiskWrites) - or_state_mark_dirty(get_or_state(), 0); - entry_guards_dirty = 0; -} - -/** - * Format a single entry guard in the format expected by the controller. - * Return a newly allocated string. - */ -STATIC char * -getinfo_helper_format_single_entry_guard(const entry_guard_t *e) -{ - const char *status = NULL; - time_t when = 0; - const node_t *node; - char tbuf[ISO_TIME_LEN+1]; - char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; - - /* This is going to be a bit tricky, since the status - * codes weren't really intended for prop271 guards. - * - * XXXX use a more appropriate format for exporting this information - */ - if (e->confirmed_idx < 0) { - status = "never-connected"; - } else if (! e->currently_listed) { - when = e->unlisted_since_date; - status = "unusable"; - } else if (! e->is_filtered_guard) { - status = "unusable"; - } else if (e->is_reachable == GUARD_REACHABLE_NO) { - when = e->failing_since; - status = "down"; - } else { - status = "up"; - } - - node = entry_guard_find_node(e); - if (node) { - node_get_verbose_nickname(node, nbuf); - } else { - nbuf[0] = '$'; - base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); - /* e->nickname field is not very reliable if we don't know about - * this router any longer; don't include it. */ - } - - char *result = NULL; - if (when) { - format_iso_time(tbuf, when); - tor_asprintf(&result, "%s %s %s\n", nbuf, status, tbuf); - } else { - tor_asprintf(&result, "%s %s\n", nbuf, status); - } - return result; -} - -/** If question is the string "entry-guards", then dump - * to *answer a newly allocated string describing all of - * the nodes in the global entry_guards list. See control-spec.txt - * for details. - * For backward compatibility, we also handle the string "helper-nodes". - * - * XXX this should be totally redesigned after prop 271 too, and that's - * going to take some control spec work. - * */ -int -getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - guard_selection_t *gs = get_guard_selection_info(); - - tor_assert(gs != NULL); - - (void) conn; - (void) errmsg; - - if (!strcmp(question,"entry-guards") || - !strcmp(question,"helper-nodes")) { - const smartlist_t *guards; - guards = gs->sampled_entry_guards; - - smartlist_t *sl = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(guards, const entry_guard_t *, e) { - char *cp = getinfo_helper_format_single_entry_guard(e); - smartlist_add(sl, cp); - } SMARTLIST_FOREACH_END(e); - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } - return 0; -} - -/* Given the original bandwidth of a guard and its guardfraction, - * calculate how much bandwidth the guard should have as a guard and - * as a non-guard. - * - * Quoting from proposal236: - * - * Let Wpf denote the weight from the 'bandwidth-weights' line a - * client would apply to N for position p if it had the guard - * flag, Wpn the weight if it did not have the guard flag, and B the - * measured bandwidth of N in the consensus. Then instead of choosing - * N for position p proportionally to Wpf*B or Wpn*B, clients should - * choose N proportionally to F*Wpf*B + (1-F)*Wpn*B. - * - * This function fills the guardfraction_bw structure. It sets - * guard_bw to F*B and non_guard_bw to (1-F)*B. - */ -void -guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw, - int orig_bandwidth, - uint32_t guardfraction_percentage) -{ - double guardfraction_fraction; - - /* Turn the percentage into a fraction. */ - tor_assert(guardfraction_percentage <= 100); - guardfraction_fraction = guardfraction_percentage / 100.0; - - long guard_bw = tor_lround(guardfraction_fraction * orig_bandwidth); - tor_assert(guard_bw <= INT_MAX); - - guardfraction_bw->guard_bw = (int) guard_bw; - - guardfraction_bw->non_guard_bw = orig_bandwidth - (int) guard_bw; -} - -/** Helper: Update the status of all entry guards, in whatever algorithm - * is used. Return true if we should stop using all previously generated - * circuits, by calling circuit_mark_all_unused_circs() and - * circuit_mark_all_dirty_circs_as_unusable(). - */ -int -guards_update_all(void) -{ - int mark_circuits = 0; - if (update_guard_selection_choice(get_options())) - mark_circuits = 1; - - tor_assert(curr_guard_context); - - if (entry_guards_update_all(curr_guard_context)) - mark_circuits = 1; - - return mark_circuits; -} - -/** Helper: pick a guard for a circuit, with whatever algorithm is - used. */ -const node_t * -guards_choose_guard(cpath_build_state_t *state, - circuit_guard_state_t **guard_state_out) -{ - const node_t *r = NULL; - const uint8_t *exit_id = NULL; - entry_guard_restriction_t *rst = NULL; - if (state && (exit_id = build_state_get_exit_rsa_id(state))) { - /* We're building to a targeted exit node, so that node can't be - * chosen as our guard for this circuit. Remember that fact in a - * restriction. */ - rst = guard_create_exit_restriction(exit_id); - tor_assert(rst); - } - if (entry_guard_pick_for_circuit(get_guard_selection_info(), - GUARD_USAGE_TRAFFIC, - rst, - &r, - guard_state_out) < 0) { - tor_assert(r == NULL); - } - return r; -} - -/** Remove all currently listed entry guards for a given guard selection - * context. This frees and replaces gs, so don't use gs - * after calling this function. */ -void -remove_all_entry_guards_for_guard_selection(guard_selection_t *gs) -{ - // This function shouldn't exist. XXXX - tor_assert(gs != NULL); - char *old_name = tor_strdup(gs->name); - guard_selection_type_t old_type = gs->type; - - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, { - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - }); - - if (gs == curr_guard_context) { - curr_guard_context = NULL; - } - - smartlist_remove(guard_contexts, gs); - guard_selection_free(gs); - - gs = get_guard_selection_by_name(old_name, old_type, 1); - entry_guards_changed_for_guard_selection(gs); - tor_free(old_name); -} - -/** Remove all currently listed entry guards, so new ones will be chosen. - * - * XXXX This function shouldn't exist -- it's meant to support the DROPGUARDS - * command, which is deprecated. - */ -void -remove_all_entry_guards(void) -{ - remove_all_entry_guards_for_guard_selection(get_guard_selection_info()); -} - -/** Helper: pick a directory guard, with whatever algorithm is used. */ -const node_t * -guards_choose_dirguard(uint8_t dir_purpose, - circuit_guard_state_t **guard_state_out) -{ - const node_t *r = NULL; - entry_guard_restriction_t *rst = NULL; - - /* If we are fetching microdescs, don't query outdated dirservers. */ - if (dir_purpose == DIR_PURPOSE_FETCH_MICRODESC) { - rst = guard_create_dirserver_md_restriction(); - } - - if (entry_guard_pick_for_circuit(get_guard_selection_info(), - GUARD_USAGE_DIRGUARD, - rst, - &r, - guard_state_out) < 0) { - tor_assert(r == NULL); - } - return r; -} - -/** - * If we're running with a constrained guard set, then maybe mark our guards - * usable. Return 1 if we do; 0 if we don't. - */ -int -guards_retry_optimistic(const or_options_t *options) -{ - if (! entry_list_is_constrained(options)) - return 0; - - mark_primary_guards_maybe_reachable(get_guard_selection_info()); - - return 1; -} - -/** - * Check if we are missing any crucial dirinfo for the guard subsystem to - * work. Return NULL if everything went well, otherwise return a newly - * allocated string with an informative error message. In the latter case, use - * the genreal descriptor information using_mds, num_present and - * num_usable to improve the error message. */ -char * -guard_selection_get_err_str_if_dir_info_missing(guard_selection_t *gs, - int using_mds, - int num_present, int num_usable) -{ - if (!gs->primary_guards_up_to_date) - entry_guards_update_primary(gs); - - char *ret_str = NULL; - int n_missing_descriptors = 0; - int n_considered = 0; - int num_primary_to_check; - - /* We want to check for the descriptor of at least the first two primary - * guards in our list, since these are the guards that we typically use for - * circuits. */ - num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC); - num_primary_to_check++; - - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { - entry_guard_consider_retry(guard); - if (guard->is_reachable == GUARD_REACHABLE_NO) - continue; - n_considered++; - if (!guard_has_descriptor(guard)) - n_missing_descriptors++; - if (n_considered >= num_primary_to_check) - break; - } SMARTLIST_FOREACH_END(guard); - - /* If we are not missing any descriptors, return NULL. */ - if (!n_missing_descriptors) { - return NULL; - } - - /* otherwise return a helpful error string */ - tor_asprintf(&ret_str, "We're missing descriptors for %d/%d of our " - "primary entry guards (total %sdescriptors: %d/%d).", - n_missing_descriptors, num_primary_to_check, - using_mds?"micro":"", num_present, num_usable); - - return ret_str; -} - -/** As guard_selection_have_enough_dir_info_to_build_circuits, but uses - * the default guard selection. */ -char * -entry_guards_get_err_str_if_dir_info_missing(int using_mds, - int num_present, int num_usable) -{ - return guard_selection_get_err_str_if_dir_info_missing( - get_guard_selection_info(), - using_mds, - num_present, num_usable); -} - -/** Free one guard selection context */ -STATIC void -guard_selection_free_(guard_selection_t *gs) -{ - if (!gs) return; - - tor_free(gs->name); - - if (gs->sampled_entry_guards) { - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(gs->sampled_entry_guards); - gs->sampled_entry_guards = NULL; - } - - smartlist_free(gs->confirmed_entry_guards); - smartlist_free(gs->primary_entry_guards); - - tor_free(gs); -} - -/** Release all storage held by the list of entry guards and related - * memory structs. */ -void -entry_guards_free_all(void) -{ - /* Null out the default */ - curr_guard_context = NULL; - /* Free all the guard contexts */ - if (guard_contexts != NULL) { - SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) { - guard_selection_free(gs); - } SMARTLIST_FOREACH_END(gs); - smartlist_free(guard_contexts); - guard_contexts = NULL; - } - circuit_build_times_free_timeouts(get_circuit_build_times_mutable()); -} - diff --git a/src/tor/src/or/entrynodes.h b/src/tor/src/or/entrynodes.h deleted file mode 100644 index aa9c8fe19..000000000 --- a/src/tor/src/or/entrynodes.h +++ /dev/null @@ -1,634 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file entrynodes.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_ENTRYNODES_H -#define TOR_ENTRYNODES_H - -#include "handles.h" - -/* Forward declare for guard_selection_t; entrynodes.c has the real struct */ -typedef struct guard_selection_s guard_selection_t; - -/* Forward declare for entry_guard_t; the real declaration is private. */ -typedef struct entry_guard_t entry_guard_t; - -/* Forward declaration for circuit_guard_state_t; the real declaration is - private. */ -typedef struct circuit_guard_state_t circuit_guard_state_t; - -/* Forward declaration for entry_guard_restriction_t; the real declaration is - private. */ -typedef struct entry_guard_restriction_t entry_guard_restriction_t; - -/* Information about a guard's pathbias status. - * These fields are used in circpathbias.c to try to detect entry - * nodes that are failing circuits at a suspicious frequency. - */ -typedef struct guard_pathbias_t { - unsigned int path_bias_noticed : 1; /**< Did we alert the user about path - * bias for this node already? */ - unsigned int path_bias_warned : 1; /**< Did we alert the user about path bias - * for this node already? */ - unsigned int path_bias_extreme : 1; /**< Did we alert the user about path - * bias for this node already? */ - unsigned int path_bias_disabled : 1; /**< Have we disabled this node because - * of path bias issues? */ - unsigned int path_bias_use_noticed : 1; /**< Did we alert the user about path - * use bias for this node already? */ - unsigned int path_bias_use_extreme : 1; /**< Did we alert the user about path - * use bias for this node already? */ - - double circ_attempts; /**< Number of circuits this guard has "attempted" */ - double circ_successes; /**< Number of successfully built circuits using - * this guard as first hop. */ - double successful_circuits_closed; /**< Number of circuits that carried - * streams successfully. */ - double collapsed_circuits; /**< Number of fully built circuits that were - * remotely closed before any streams were - * attempted. */ - double unusable_circuits; /**< Number of circuits for which streams were - * attempted, but none succeeded. */ - double timeouts; /**< Number of 'right-censored' circuit timeouts for this - * guard. */ - double use_attempts; /**< Number of circuits we tried to use with streams */ - double use_successes; /**< Number of successfully used circuits using - * this guard as first hop. */ -} guard_pathbias_t; - -#if defined(ENTRYNODES_PRIVATE) -/** - * @name values for entry_guard_t.is_reachable. - * - * See entry_guard_t.is_reachable for more information. - */ -/**@{*/ -#define GUARD_REACHABLE_NO 0 -#define GUARD_REACHABLE_YES 1 -#define GUARD_REACHABLE_MAYBE 2 -/**@}*/ - -/** An entry_guard_t represents our information about a chosen long-term - * first hop, known as a "helper" node in the literature. We can't just - * use a node_t, since we want to remember these even when we - * don't have any directory info. */ -struct entry_guard_t { - HANDLE_ENTRY(entry_guard, entry_guard_t); - - char nickname[MAX_HEX_NICKNAME_LEN+1]; - char identity[DIGEST_LEN]; - ed25519_public_key_t ed_id; - - /** - * @name new guard selection algorithm fields. - * - * Only the new (prop271) algorithm uses these. For a more full - * description of the algorithm, see the module documentation for - * entrynodes.c - */ - /**@{*/ - - /* == Persistent fields, present for all sampled guards. */ - /** When was this guard added to the sample? */ - time_t sampled_on_date; - /** Since what date has this guard been "unlisted"? A guard counts as - * unlisted if we have a live consensus that does not include it, or - * if we have a live consensus that does not include it as a usable - * guard. This field is zero when the guard is listed. */ - time_t unlisted_since_date; // can be zero - /** What version of Tor added this guard to the sample? */ - char *sampled_by_version; - /** Is this guard listed right now? If this is set, then - * unlisted_since_date should be set too. */ - unsigned currently_listed : 1; - - /* == Persistent fields, for confirmed guards only */ - /** When was this guard confirmed? (That is, when did we first use it - * successfully and decide to keep it?) This field is zero if this is not a - * confirmed guard. */ - time_t confirmed_on_date; /* 0 if not confirmed */ - /** - * In what order was this guard confirmed? Guards with lower indices - * appear earlier on the confirmed list. If the confirmed list is compacted, - * this field corresponds to the index of this guard on the confirmed list. - * - * This field is set to -1 if this guard is not confirmed. - */ - int confirmed_idx; /* -1 if not confirmed; otherwise the order that this - * item should occur in the CONFIRMED_GUARDS ordered - * list */ - - /** - * Which selection does this guard belong to? - */ - char *selection_name; - - /** Bridges only: address of the bridge. */ - tor_addr_port_t *bridge_addr; - - /* ==== Non-persistent fields. */ - /* == These are used by sampled guards */ - /** When did we last decide to try using this guard for a circuit? 0 for - * "not since we started up." */ - time_t last_tried_to_connect; - /** How reachable do we consider this guard to be? One of - * GUARD_REACHABLE_NO, GUARD_REACHABLE_YES, or GUARD_REACHABLE_MAYBE. */ - unsigned is_reachable : 2; - /** Boolean: true iff this guard is pending. A pending guard is one - * that we have an in-progress circuit through, and which we do not plan - * to try again until it either succeeds or fails. Primary guards can - * never be pending. */ - unsigned is_pending : 1; - /** If true, don't write this guard to disk. (Used for bridges with unknown - * identities) */ - unsigned is_persistent : 1; - /** When did we get the earliest connection failure for this guard? - * We clear this field on a successful connect. We do _not_ clear it - * when we mark the guard as "MAYBE" reachable. - */ - time_t failing_since; - - /* == Set inclusion flags. */ - /** If true, this guard is in the filtered set. The filtered set includes - * all sampled guards that our configuration allows us to use. */ - unsigned is_filtered_guard : 1; - /** If true, this guard is in the usable filtered set. The usable filtered - * set includes all filtered guards that are not believed to be - * unreachable. (That is, those for which is_reachable is not - * GUARD_REACHABLE_NO) */ - unsigned is_usable_filtered_guard : 1; - unsigned is_primary:1; - - /** This string holds any fields that we are maintaining because - * we saw them in the state, even if we don't understand them. */ - char *extra_state_fields; - - /** Backpointer to the guard selection that this guard belongs to. - * The entry_guard_t must never outlive its guard_selection. */ - guard_selection_t *in_selection; - /**@}*/ - - /** Path bias information for this guard. */ - guard_pathbias_t pb; -}; - -/** - * Possible rules for a guard selection to follow - */ -typedef enum guard_selection_type_t { - /** Infer the type of this selection from its name. */ - GS_TYPE_INFER=0, - /** Use the normal guard selection algorithm, taking our sample from the - * complete list of guards in the consensus. */ - GS_TYPE_NORMAL=1, - /** Use the normal guard selection algorithm, taking our sample from the - * configured bridges, and allowing it to grow as large as all the configured - * bridges */ - GS_TYPE_BRIDGE, - /** Use the normal guard selection algorithm, taking our sample from the - * set of filtered nodes. */ - GS_TYPE_RESTRICTED, -} guard_selection_type_t; - -/** - * All of the the context for guard selection on a particular client. - * - * We maintain multiple guard selection contexts for a client, depending - * aspects on its current configuration -- whether an extremely - * restrictive EntryNodes is used, whether UseBridges is enabled, and so - * on.) - * - * See the module documentation for entrynodes.c for more information - * about guard selection algorithms. - */ -struct guard_selection_s { - /** - * The name for this guard-selection object. (Must not contain spaces). - */ - char *name; - - /** - * What rules does this guard-selection object follow? - */ - guard_selection_type_t type; - - /** - * A value of 1 means that primary_entry_guards is up-to-date; 0 - * means we need to recalculate it before using primary_entry_guards - * or the is_primary flag on any guard. - */ - int primary_guards_up_to_date; - - /** - * A list of the sampled entry guards, as entry_guard_t structures. - * Not in any particular order. When we 'sample' a guard, we are - * noting it as a possible guard to pick in the future. The use of - * sampling here prevents us from being forced by an attacker to try - * every guard on the network. This list is persistent. - */ - smartlist_t *sampled_entry_guards; - - /** - * Ordered list (from highest to lowest priority) of guards that we - * have successfully contacted and decided to use. Every member of - * this list is a member of sampled_entry_guards. Every member should - * have confirmed_on_date set, and have confirmed_idx greater than - * any earlier member of the list. - * - * This list is persistent. It is a subset of the elements in - * sampled_entry_guards, and its pointers point to elements of - * sampled_entry_guards. - */ - smartlist_t *confirmed_entry_guards; - - /** - * Ordered list (from highest to lowest priority) of guards that we - * are willing to use the most happily. These guards may or may not - * yet be confirmed yet. If we can use one of these guards, we are - * probably not on a network that is trying to restrict our guard - * choices. - * - * This list is a subset of the elements in - * sampled_entry_guards, and its pointers point to elements of - * sampled_entry_guards. - */ - smartlist_t *primary_entry_guards; - - /** When did we last successfully build a circuit or use a circuit? */ - time_t last_time_on_internet; - - /** What confirmed_idx value should the next-added member of - * confirmed_entry_guards receive? */ - int next_confirmed_idx; - -}; - -struct entry_guard_handle_t; - -/** Types of restrictions we impose when picking guard nodes */ -typedef enum guard_restriction_type_t { - /* Don't pick the same guard node as our exit node (or its family) */ - RST_EXIT_NODE = 0, - /* Don't pick dirguards that have previously shown to be outdated */ - RST_OUTDATED_MD_DIRSERVER = 1 -} guard_restriction_type_t; - -/** - * A restriction to remember which entry guards are off-limits for a given - * circuit. - * - * Note: This mechanism is NOT for recording which guards are never to be - * used: only which guards cannot be used on one particular circuit. - */ -struct entry_guard_restriction_t { - /* What type of restriction are we imposing? */ - guard_restriction_type_t type; - - /* In case of restriction type RST_EXIT_NODE, the guard's RSA identity - * digest must not equal this; and it must not be in the same family as any - * node with this digest. */ - uint8_t exclude_id[DIGEST_LEN]; -}; - -/** - * Per-circuit state to track whether we'll be able to use the circuit. - */ -struct circuit_guard_state_t { - /** Handle to the entry guard object for this circuit. */ - struct entry_guard_handle_t *guard; - /** The time at which state last changed. */ - time_t state_set_at; - /** One of GUARD_CIRC_STATE_* */ - uint8_t state; - - /** - * A set of restrictions that were placed on this guard when we selected it - * for this particular circuit. We need to remember the restrictions here, - * since any guard that breaks these restrictions will not block this - * circuit from becoming COMPLETE. - */ - entry_guard_restriction_t *restrictions; -}; -#endif /* defined(ENTRYNODES_PRIVATE) */ - -/* Common entry points for old and new guard code */ -int guards_update_all(void); -const node_t *guards_choose_guard(cpath_build_state_t *state, - circuit_guard_state_t **guard_state_out); -const node_t *guards_choose_dirguard(uint8_t dir_purpose, - circuit_guard_state_t **guard_state_out); - -#if 1 -/* XXXX NM I would prefer that all of this stuff be private to - * entrynodes.c. */ -entry_guard_t *entry_guard_get_by_id_digest_for_guard_selection( - guard_selection_t *gs, const char *digest); -entry_guard_t *entry_guard_get_by_id_digest(const char *digest); - -circuit_guard_state_t * -get_guard_state_for_bridge_desc_fetch(const char *digest); - -void entry_guards_changed_for_guard_selection(guard_selection_t *gs); -void entry_guards_changed(void); -guard_selection_t * get_guard_selection_info(void); -int num_live_entry_guards_for_guard_selection( - guard_selection_t *gs, - int for_directory); -int num_live_entry_guards(int for_directory); -#endif /* 1 */ - -const node_t *entry_guard_find_node(const entry_guard_t *guard); -const char *entry_guard_get_rsa_id_digest(const entry_guard_t *guard); -const char *entry_guard_describe(const entry_guard_t *guard); -guard_pathbias_t *entry_guard_get_pathbias_state(entry_guard_t *guard); - -/** Enum to specify how we're going to use a given guard, when we're picking - * one for immediate use. */ -typedef enum { - GUARD_USAGE_TRAFFIC = 0, - GUARD_USAGE_DIRGUARD = 1 -} guard_usage_t; - -#define circuit_guard_state_free(val) \ - FREE_AND_NULL(circuit_guard_state_t, circuit_guard_state_free_, (val)) - -void circuit_guard_state_free_(circuit_guard_state_t *state); -int entry_guard_pick_for_circuit(guard_selection_t *gs, - guard_usage_t usage, - entry_guard_restriction_t *rst, - const node_t **chosen_node_out, - circuit_guard_state_t **guard_state_out); - -/* We just connected to an entry guard. What should we do with the circuit? */ -typedef enum { - GUARD_USABLE_NEVER = -1, /* Never use the circuit */ - GUARD_MAYBE_USABLE_LATER = 0, /* Keep it. We might use it in the future */ - GUARD_USABLE_NOW = 1, /* Use it right now */ -} guard_usable_t; - -guard_usable_t entry_guard_succeeded(circuit_guard_state_t **guard_state_p); -void entry_guard_failed(circuit_guard_state_t **guard_state_p); -void entry_guard_cancel(circuit_guard_state_t **guard_state_p); -void entry_guard_chan_failed(channel_t *chan); -int entry_guards_update_all(guard_selection_t *gs); -int entry_guards_upgrade_waiting_circuits(guard_selection_t *gs, - const smartlist_t *all_circuits, - smartlist_t *newly_complete_out); -int entry_guard_state_should_expire(circuit_guard_state_t *guard_state); -void entry_guards_note_internet_connectivity(guard_selection_t *gs); - -int update_guard_selection_choice(const or_options_t *options); - -MOCK_DECL(int,num_bridges_usable,(int use_maybe_reachable)); - -#ifdef ENTRYNODES_PRIVATE -/** - * @name Default values for the parameters for the new (prop271) entry guard - * algorithm. - */ -/**@{*/ -/** - * We never let our sampled guard set grow larger than this percentage - * of the guards on the network. - */ -#define DFLT_MAX_SAMPLE_THRESHOLD_PERCENT 20 -/** - * We never let our sampled guard set grow larger than this number of - * guards. - */ -#define DFLT_MAX_SAMPLE_SIZE 60 -/** - * We always try to make our sample contain at least this many guards. - */ -#define DFLT_MIN_FILTERED_SAMPLE_SIZE 20 -/** - * If a guard is unlisted for this many days in a row, we remove it. - */ -#define DFLT_REMOVE_UNLISTED_GUARDS_AFTER_DAYS 20 -/** - * We remove unconfirmed guards from the sample after this many days, - * regardless of whether they are listed or unlisted. - */ -#define DFLT_GUARD_LIFETIME_DAYS 120 -/** - * We remove confirmed guards from the sample if they were sampled - * GUARD_LIFETIME_DAYS ago and confirmed this many days ago. - */ -#define DFLT_GUARD_CONFIRMED_MIN_LIFETIME_DAYS 60 -/** - * How many guards do we try to keep on our primary guard list? - */ -#define DFLT_N_PRIMARY_GUARDS 3 -/** - * Of the live guards on the primary guard list, how many do we consider when - * choosing a guard to use? - */ -#define DFLT_N_PRIMARY_GUARDS_TO_USE 1 -/** - * As DFLT_N_PRIMARY_GUARDS, but for choosing which directory guard to use. - */ -#define DFLT_N_PRIMARY_DIR_GUARDS_TO_USE 3 -/** - * If we haven't successfully built or used a circuit in this long, then - * consider that the internet is probably down. - */ -#define DFLT_INTERNET_LIKELY_DOWN_INTERVAL (10*60) -/** - * If we're trying to connect to a nonprimary guard for at least this - * many seconds, and we haven't gotten the connection to work, we will treat - * lower-priority guards as usable. - */ -#define DFLT_NONPRIMARY_GUARD_CONNECT_TIMEOUT 15 -/** - * If a circuit has been sitting around in 'waiting for better guard' state - * for at least this long, we'll expire it. - */ -#define DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT (10*60) -/** - * If our configuration retains fewer than this fraction of guards from the - * torrc, we are in a restricted setting. - */ -#define DFLT_MEANINGFUL_RESTRICTION_PERCENT 20 -/** - * If our configuration retains fewer than this fraction of guards from the - * torrc, we are in an extremely restricted setting, and should warn. - */ -#define DFLT_EXTREME_RESTRICTION_PERCENT 1 -/**@}*/ - -STATIC double get_max_sample_threshold(void); -STATIC int get_max_sample_size_absolute(void); -STATIC int get_min_filtered_sample_size(void); -STATIC int get_remove_unlisted_guards_after_days(void); -STATIC int get_guard_lifetime(void); -STATIC int get_guard_confirmed_min_lifetime(void); -STATIC int get_n_primary_guards(void); -STATIC int get_n_primary_guards_to_use(guard_usage_t usage); -STATIC int get_internet_likely_down_interval(void); -STATIC int get_nonprimary_guard_connect_timeout(void); -STATIC int get_nonprimary_guard_idle_timeout(void); -STATIC double get_meaningful_restriction_threshold(void); -STATIC double get_extreme_restriction_threshold(void); - -HANDLE_DECL(entry_guard, entry_guard_t, STATIC) -#define entry_guard_handle_free(h) \ - FREE_AND_NULL(entry_guard_handle_t, entry_guard_handle_free_, (h)) - -STATIC guard_selection_type_t guard_selection_infer_type( - guard_selection_type_t type_in, - const char *name); -STATIC guard_selection_t *guard_selection_new(const char *name, - guard_selection_type_t type); -STATIC guard_selection_t *get_guard_selection_by_name( - const char *name, guard_selection_type_t type, int create_if_absent); -STATIC void guard_selection_free_(guard_selection_t *gs); -#define guard_selection_free(gs) \ - FREE_AND_NULL(guard_selection_t, guard_selection_free_, (gs)) -MOCK_DECL(STATIC int, entry_guard_is_listed, - (guard_selection_t *gs, const entry_guard_t *guard)); -STATIC const char *choose_guard_selection(const or_options_t *options, - const networkstatus_t *ns, - const guard_selection_t *old_selection, - guard_selection_type_t *type_out); -STATIC entry_guard_t *get_sampled_guard_with_id(guard_selection_t *gs, - const uint8_t *rsa_id); - -MOCK_DECL(STATIC time_t, randomize_time, (time_t now, time_t max_backdate)); - -MOCK_DECL(STATIC circuit_guard_state_t *, - circuit_guard_state_new,(entry_guard_t *guard, unsigned state, - entry_guard_restriction_t *rst)); - -STATIC entry_guard_t *entry_guard_add_to_sample(guard_selection_t *gs, - const node_t *node); -STATIC entry_guard_t *entry_guards_expand_sample(guard_selection_t *gs); -STATIC char *entry_guard_encode_for_state(entry_guard_t *guard); -STATIC entry_guard_t *entry_guard_parse_from_state(const char *s); -#define entry_guard_free(e) \ - FREE_AND_NULL(entry_guard_t, entry_guard_free_, (e)) -STATIC void entry_guard_free_(entry_guard_t *e); -STATIC void entry_guards_update_filtered_sets(guard_selection_t *gs); -STATIC int entry_guards_all_primary_guards_are_down(guard_selection_t *gs); -/** - * @name Flags for sample_reachable_filtered_entry_guards() - */ -/**@{*/ -#define SAMPLE_EXCLUDE_CONFIRMED (1u<<0) -#define SAMPLE_EXCLUDE_PRIMARY (1u<<1) -#define SAMPLE_EXCLUDE_PENDING (1u<<2) -#define SAMPLE_NO_UPDATE_PRIMARY (1u<<3) -#define SAMPLE_EXCLUDE_NO_DESCRIPTOR (1u<<4) -/**@}*/ -STATIC entry_guard_t *sample_reachable_filtered_entry_guards( - guard_selection_t *gs, - const entry_guard_restriction_t *rst, - unsigned flags); -STATIC void entry_guard_consider_retry(entry_guard_t *guard); -STATIC void make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard); -STATIC void entry_guards_update_confirmed(guard_selection_t *gs); -STATIC void entry_guards_update_primary(guard_selection_t *gs); -STATIC int num_reachable_filtered_guards(const guard_selection_t *gs, - const entry_guard_restriction_t *rst); -STATIC void sampled_guards_update_from_consensus(guard_selection_t *gs); -/** - * @name Possible guard-states for a circuit. - */ -/**@{*/ -/** State for a circuit that can (so far as the guard subsystem is - * concerned) be used for actual traffic as soon as it is successfully - * opened. */ -#define GUARD_CIRC_STATE_USABLE_ON_COMPLETION 1 -/** State for an non-open circuit that we shouldn't use for actual - * traffic, when it completes, unless other circuits to preferable - * guards fail. */ -#define GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD 2 -/** State for an open circuit that we shouldn't use for actual traffic - * unless other circuits to preferable guards fail. */ -#define GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD 3 -/** State for a circuit that can (so far as the guard subsystem is - * concerned) be used for actual traffic. */ -#define GUARD_CIRC_STATE_COMPLETE 4 -/** State for a circuit that is unusable, and will not become usable. */ -#define GUARD_CIRC_STATE_DEAD 5 -/**@}*/ -STATIC void entry_guards_note_guard_failure(guard_selection_t *gs, - entry_guard_t *guard); -STATIC entry_guard_t *select_entry_guard_for_circuit(guard_selection_t *gs, - guard_usage_t usage, - const entry_guard_restriction_t *rst, - unsigned *state_out); -STATIC void mark_primary_guards_maybe_reachable(guard_selection_t *gs); -STATIC unsigned entry_guards_note_guard_success(guard_selection_t *gs, - entry_guard_t *guard, - unsigned old_state); -STATIC int entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b); -STATIC char *getinfo_helper_format_single_entry_guard(const entry_guard_t *e); - -STATIC entry_guard_restriction_t *guard_create_exit_restriction( - const uint8_t *exit_id); - -STATIC entry_guard_restriction_t *guard_create_dirserver_md_restriction(void); - -STATIC void entry_guard_restriction_free_(entry_guard_restriction_t *rst); -#define entry_guard_restriction_free(rst) \ - FREE_AND_NULL(entry_guard_restriction_t, \ - entry_guard_restriction_free_, (rst)) - -#endif /* defined(ENTRYNODES_PRIVATE) */ - -void remove_all_entry_guards_for_guard_selection(guard_selection_t *gs); -void remove_all_entry_guards(void); - -struct bridge_info_t; -void entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, - const uint8_t *rsa_id_digest); - -int entry_list_is_constrained(const or_options_t *options); -int guards_retry_optimistic(const or_options_t *options); -int entry_guards_parse_state_for_guard_selection( - guard_selection_t *gs, or_state_t *state, int set, char **msg); -int entry_guards_parse_state(or_state_t *state, int set, char **msg); -void entry_guards_update_state(or_state_t *state); -int getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -int entries_known_but_down(const or_options_t *options); -void entries_retry_all(const or_options_t *options); - -char *entry_guards_get_err_str_if_dir_info_missing(int using_mds, - int num_present, int num_usable); -char *guard_selection_get_err_str_if_dir_info_missing(guard_selection_t *gs, - int using_mds, - int num_present, int num_usable); - -void entry_guards_free_all(void); - -double pathbias_get_close_success_count(entry_guard_t *guard); -double pathbias_get_use_success_count(entry_guard_t *guard); - -/** Contains the bandwidth of a relay as a guard and as a non-guard - * after the guardfraction has been considered. */ -typedef struct guardfraction_bandwidth_t { - /** Bandwidth as a guard after guardfraction has been considered. */ - int guard_bw; - /** Bandwidth as a non-guard after guardfraction has been considered. */ - int non_guard_bw; -} guardfraction_bandwidth_t; - -int should_apply_guardfraction(const networkstatus_t *ns); - -void -guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw, - int orig_bandwidth, - uint32_t guardfraction_percentage); - -#endif /* !defined(TOR_ENTRYNODES_H) */ - diff --git a/src/tor/src/or/fallback_dirs.inc b/src/tor/src/or/fallback_dirs.inc deleted file mode 100644 index cc37e5f9a..000000000 --- a/src/tor/src/or/fallback_dirs.inc +++ /dev/null @@ -1,370 +0,0 @@ -/* Whitelist & blacklist excluded 1326 of 1513 candidates. */ -/* To comment-out entries in this file, use C comments, and add * to the start of each line. (stem finds fallback entries using " at the start of a line.) */ -/* Checked IPv4 DirPorts served a consensus within 15.0s. */ -/* -Final Count: 151 (Eligible 187, Target 392 (1963 * 0.20), Max 200) -Excluded: 36 (Same Operator 27, Failed/Skipped Download 9, Excess 0) -Bandwidth Range: 1.3 - 40.0 MByte/s -*/ -/* -Onionoo Source: details Date: 2017-05-16 07:00:00 Version: 4.0 -URL: https:onionoo.torproject.orgdetails?fields=fingerprint%2Cnickname%2Ccontact%2Clast_changed_address_or_port%2Cconsensus_weight%2Cadvertised_bandwidth%2Cor_addresses%2Cdir_address%2Crecommended_version%2Cflags%2Ceffective_family%2Cplatform&flag=V2Dir&type=relay&last_seen_days=-0&first_seen_days=30- -*/ -/* -Onionoo Source: uptime Date: 2017-05-16 07:00:00 Version: 4.0 -URL: https:onionoo.torproject.orguptime?first_seen_days=30-&flag=V2Dir&type=relay&last_seen_days=-0 -*/ -"176.10.104.240:80 orport=443 id=0111BA9B604669E636FFD5B503F382A4B7AD6E80" -" weight=10", -"193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524" -" weight=10", -"185.100.85.61:80 orport=443 id=025B66CEBC070FCB0519D206CF0CF4965C20C96E" -" weight=10", -"185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088" -" weight=10", -"5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB" -" ipv6=[2a01:4f8:162:51e2::2]:9001" -" weight=10", -"109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281" -" weight=10", -"163.172.149.155:80 orport=443 id=0B85617241252517E8ECF2CFC7F4C1A32DCD153F" -" weight=10", -"5.39.92.199:80 orport=443 id=0BEA4A88D069753218EAAAD6D22EA87B9A1319D6" -" ipv6=[2001:41d0:8:b1c7::1]:443" -" weight=10", -"178.62.197.82:80 orport=443 id=0D3EBA17E1C78F1E9900BABDB23861D46FCAF163" -" weight=10", -"185.100.86.100:80 orport=443 id=0E8C0C8315B66DB5F703804B3889A1DD66C67CE0" -" weight=10", -"95.85.8.226:80 orport=443 id=1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423" -" weight=10", -"193.11.114.43:9030 orport=9001 id=12AD30E5D25AA67F519780E2111E611A455FDC89" -" ipv6=[2001:6b0:30:1000::99]:9050" -" weight=10", -"37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2" -" weight=10", -"178.16.208.59:80 orport=443 id=136F9299A5009A4E0E96494E723BDB556FB0A26B" -" ipv6=[2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6]:443" -" weight=10", -"144.76.14.145:110 orport=143 id=14419131033443AE6E21DA82B0D307F7CAE42BDB" -" ipv6=[2a01:4f8:190:9490::dead]:443" -" weight=10", -"178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794" -" weight=10", -"204.11.50.131:9030 orport=9001 id=185F2A57B0C4620582602761097D17DB81654F70" -" weight=10", -"5.9.158.75:80 orport=443 id=1AF72E8906E6C49481A791A6F8F84F8DFEBBB2BA" -" ipv6=[2a01:4f8:190:514a::2]:443" -" weight=10", -"46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8" -" weight=10", -"91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7" -" weight=10", -"212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68" -" ipv6=[2001:bc8:4400:2100::f03]:9001" -" weight=10", -"144.76.163.93:9030 orport=9001 id=22F08CF09764C4E8982640D77F71ED72FF26A9AC" -" weight=10", -"163.172.176.167:80 orport=443 id=230A8B2A8BA861210D9B4BA97745AEC217A94207" -" weight=10", -"37.200.98.5:80 orport=443 id=231C2B9C8C31C295C472D031E06964834B745996" -" ipv6=[2a00:1158:3::11a]:993" -" weight=10", -"212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB" -" weight=10", -"144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510" -" weight=10", -"97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94" -" weight=10", -"107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA" -" weight=10", -"64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2" -" weight=10", -"212.83.154.33:8080 orport=8443 id=322C6E3A973BC10FC36DE3037AD27BC89F14723B" -" weight=10", -"109.105.109.162:52860 orport=60784 id=32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F" -" ipv6=[2001:948:7:2::163]:5001" -" weight=10", -"163.172.13.165:9030 orport=9001 id=33DA0CAB7C27812EFF2E22C9705630A54D101FEB" -" ipv6=[2001:bc8:38cb:201::8]:9001" -" weight=10", -"217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B" -" weight=10", -"37.187.22.87:9030 orport=9001 id=36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400" -" ipv6=[2001:41d0:a:1657::1]:9001" -" weight=10", -"62.210.92.11:9130 orport=9101 id=387B065A38E4DAA16D9D41C2964ECBC4B31D30FF" -" ipv6=[2001:bc8:338c::1]:9101" -" weight=10", -"198.50.191.95:80 orport=443 id=39F096961ED2576975C866D450373A9913AFDC92" -" weight=10", -"164.132.77.175:9030 orport=9001 id=3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B" -" weight=10", -"212.47.230.49:9030 orport=9001 id=3D6D0771E54056AEFC28BB1DE816951F11826E97" -" weight=10", -"176.10.107.180:9030 orport=9001 id=3D7E274A87D9A89AF064C13D1EE4CA1F184F2600" -" weight=10", -"217.79.179.177:9030 orport=9001 id=3E53D3979DB07EFD736661C934A1DED14127B684" -" ipv6=[2001:4ba0:fff9:131:6c4f::90d3]:9001" -" weight=10", -"178.62.86.96:9030 orport=9001 id=439D0447772CB107B886F7782DBC201FA26B92D1" -" ipv6=[2a03:b0c0:1:d0::3cf:7001]:9050" -" weight=10", -"163.172.157.213:8080 orport=443 id=4623A9EC53BFD83155929E56D6F7B55B5E718C24" -" weight=10", -"31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798" -" weight=10", -"69.162.139.9:9030 orport=9001 id=4791FC0692EAB60DF2BCCAFF940B95B74E7654F6" -" ipv6=[2607:f128:40:1212::45a2:8b09]:9001" -" weight=10", -"51.254.246.203:9030 orport=9001 id=47B596B81C9E6277B98623A84B7629798A16E8D5" -" weight=10", -"37.187.102.186:9030 orport=9001 id=489D94333DF66D57FFE34D9D59CC2D97E2CB0053" -" ipv6=[2001:41d0:a:26ba::1]:9001" -" weight=10", -"188.165.194.195:9030 orport=9001 id=49E7AD01BB96F6FE3AB8C3B15BD2470B150354DF" -" weight=10", -"62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF" -" weight=10", -"51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF" -" weight=10", -"81.7.16.182:80 orport=443 id=51E1CF613FD6F9F11FE24743C91D6F9981807D82" -" ipv6=[2a02:180:1:1::517:10b6]:993" -" weight=10", -"94.23.204.175:9030 orport=9001 id=5665A3904C89E22E971305EE8C1997BCA4123C69" -" weight=10", -"95.130.12.119:80 orport=443 id=587E0A9552E4274B251F29B5B2673D38442EE4BF" -" weight=10", -"185.21.100.50:9030 orport=9001 id=58ED9C9C35E433EE58764D62892B4FFD518A3CD0" -" ipv6=[2a00:1158:2:cd00:0:74:6f:72]:443" -" weight=10", -"78.142.142.246:80 orport=443 id=5A5E03355C1908EBF424CAF1F3ED70782C0D2F74" -" weight=10", -"120.29.217.46:80 orport=443 id=5E853C94AB1F655E9C908924370A0A6707508C62" -" weight=10", -"109.163.234.5:80 orport=443 id=5EB8D862E70981B8690DEDEF546789E26AB2BD24" -" weight=10", -"95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90" -" ipv6=[2a02:ec0:209:10::4]:443" -" weight=10", -"163.172.139.104:8080 orport=443 id=68F175CCABE727AA2D2309BCD8789499CEE36ED7" -" weight=10", -"85.214.62.48:80 orport=443 id=6A7551EEE18F78A9813096E82BF84F740D32B911" -" weight=10", -"80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621" -" ipv6=[2001:981:47c1:1::6]:443" -" weight=10", -"95.183.48.12:80 orport=443 id=7187CED1A3871F837D0E60AC98F374AC541CB0DA" -" weight=10", -"85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812" -" weight=10", -"85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE" -" weight=10", -"176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C" -" weight=10", -"134.119.36.135:80 orport=443 id=763C9556602BD6207771A7A3D958091D44C43228" -" ipv6=[2a00:1158:3::2a8]:993" -" weight=10", -"188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7" -" ipv6=[2a03:b0c0:2:d0::5:f001]:9001" -" weight=10", -"81.30.158.213:9030 orport=9001 id=789EA6C9AE9ADDD8760903171CFA9AC5741B0C70" -" ipv6=[2001:4ba0:cafe:e84::1]:9001" -" weight=10", -"171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576" -" weight=10", -"82.223.21.74:9030 orport=9001 id=7A32C9519D80CA458FC8B034A28F5F6815649A98" -" ipv6=[2001:470:53e0::cafe]:9050" -" weight=10", -"51.254.136.195:80 orport=443 id=7BB70F8585DFC27E75D692970C0EEB0F22983A63" -" weight=10", -"193.11.114.45:9031 orport=9002 id=80AAF8D5956A43C197104CEF2550CD42D165C6FB" -" weight=10", -"192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F" -" ipv6=[2605:e200:d00c:c01d::1111]:9002" -" weight=10", -"192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7" -" weight=10", -"188.166.23.127:80 orport=443 id=8672E8A01B4D3FA4C0BBE21C740D4506302EA487" -" ipv6=[2a03:b0c0:2:d0::27b:7001]:9050" -" weight=10", -"93.180.156.84:9030 orport=9001 id=8844D87E9B038BE3270938F05AF797E1D3C74C0F" -" weight=10", -"212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C" -" weight=10", -"163.172.194.53:9030 orport=9001 id=8C00FA7369A7A308F6A137600F0FA07990D9D451" -" ipv6=[2001:bc8:225f:142:6c69:7461:7669:73]:9001" -" weight=10", -"178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422" -" weight=10", -"151.80.42.103:9030 orport=9001 id=9007C1D8E4F03D506A4A011B907A9E8D04E3C605" -" ipv6=[2001:41d0:e:f67::114]:9001" -" weight=10", -"173.255.245.116:9030 orport=9001 id=91E4015E1F82DAF0121D62267E54A1F661AB6DC7" -" weight=10", -"51.255.41.65:9030 orport=9001 id=9231DF741915AA1630031A93026D88726877E93A" -" weight=10", -"178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A" -" ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443" -" weight=10", -"91.219.237.244:80 orport=443 id=92ECC9E0E2AF81BB954719B189AC362E254AD4A5" -" weight=10", -"204.8.156.142:80 orport=443 id=94C4B7B8C50C86A92B6A20107539EE2678CF9A28" -" weight=10", -"163.172.223.200:80 orport=443 id=998BF3ED7F70E33D1C307247B9626D9E7573C438" -" weight=10", -"81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7" -" weight=10", -"91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F" -" weight=10", -"66.111.2.20:9030 orport=9001 id=9A68B85A02318F4E7E87F2828039FBD5D75B0142" -" weight=10", -"185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883" -" weight=10", -"5.9.151.241:9030 orport=4223 id=9BF04559224F0F1C3C953D641F1744AF0192543A" -" ipv6=[2a01:4f8:190:34f0::2]:4223" -" weight=10", -"86.105.212.130:9030 orport=443 id=9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022" -" weight=10", -"178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377" -" weight=10", -"46.28.110.244:80 orport=443 id=9F7D6E6420183C2B76D3CE99624EBC98A21A967E" -" weight=10", -"91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334" -" ipv6=[2001:41d0:1:8989::1]:4052" -" weight=10", -"178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1" -" ipv6=[2a03:b0c0:1:d0::174:1]:9050" -" weight=10", -"171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A" -" ipv6=[2001:67c:289c:3::77]:443" -" weight=10", -"171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE" -" ipv6=[2001:67c:289c:3::78]:443" -" weight=10", -"163.172.149.122:80 orport=443 id=A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2" -" weight=10", -"192.34.63.137:9030 orport=443 id=ABCB4965F1FEE193602B50A365425105C889D3F8" -" weight=10", -"109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9" -" weight=10", -"86.59.119.88:80 orport=443 id=ACD889D86E02EDDAB1AFD81F598C0936238DC6D0" -" weight=10", -"185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F" -" ipv6=[2a06:d380:0:3700::62]:9001" -" weight=10", -"163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE" -" ipv6=[2001:bc8:4400:2100::2:1009]:443" -" weight=10", -"31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D" -" weight=10", -"37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05" -" ipv6=[2001:41d0:a:74a::1]:443" -" weight=10", -"46.28.205.170:80 orport=443 id=AF322D83A4D2048B22F7F1AF5F38AFF4D09D0B76" -" weight=10", -"5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2" -" weight=10", -"212.129.62.232:80 orport=443 id=B143D439B72D239A419F8DCE07B8A8EB1B486FA7" -" weight=10", -"198.199.64.217:80 orport=443 id=B1D81825CFD7209BD1B4520B040EF5653C204A23" -" ipv6=[2604:a880:400:d0::1a9:b001]:9050" -" weight=10", -"136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664" -" weight=10", -"178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A" -" ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443" -" weight=10", -"93.115.97.242:9030 orport=9001 id=B5212DB685A2A0FCFBAE425738E478D12361710D" -" weight=10", -"81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243" -" ipv6=[2001:15e8:201:1::d10a]:80" -" weight=10", -"193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E" -" weight=10", -"85.248.227.164:444 orport=9002 id=B84F248233FEA90CAD439F292556A3139F6E1B82" -" ipv6=[2a00:1298:8011:212::164]:9004" -" weight=10", -"89.163.247.43:9030 orport=9001 id=BC7ACFAC04854C77167C7D66B7E471314ED8C410" -" ipv6=[2001:4ba0:fff7:25::5]:9001" -" weight=10", -"198.96.155.3:8080 orport=5001 id=BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E" -" weight=10", -"128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5" -" ipv6=[2a03:b0c0:2:d0::158:3001]:9001" -" weight=10", -"185.35.202.221:9030 orport=9001 id=C13B91384CDD52A871E3ECECE4EF74A7AC7DCB08" -" ipv6=[2a02:ed06::221]:9001" -" weight=10", -"213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2" -" ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337" -" weight=10", -"188.138.112.60:1433 orport=1521 id=C414F28FD2BEC1553024299B31D4E726BEB8E788" -" weight=10", -"85.248.227.163:443 orport=9001 id=C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9" -" ipv6=[2a00:1298:8011:212::163]:9003" -" weight=10", -"178.62.199.226:80 orport=443 id=CBEFF7BA4A4062045133C053F2D70524D8BBE5BE" -" ipv6=[2a03:b0c0:2:d0::b7:5001]:443" -" weight=10", -"134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE" -" weight=10", -"31.171.155.108:9030 orport=9001 id=D3E5EDDBE5159388704D6785BE51930AAFACEC6F" -" weight=10", -"37.187.115.157:9030 orport=9001 id=D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A" -" weight=10", -"166.82.21.200:9030 orport=9029 id=D5C33F3E203728EDF8361EA868B2939CCC43FAFB" -" weight=10", -"185.14.185.240:9030 orport=443 id=D62FB817B0288085FAC38A6DC8B36DCD85B70260" -" weight=10", -"46.101.169.151:9030 orport=9001 id=D760C5B436E42F93D77EF2D969157EEA14F9B39C" -" ipv6=[2a03:b0c0:3:d0::74f:a001]:9001" -" weight=10", -"46.4.111.124:9030 orport=9001 id=D9065F9E57899B3D272AA212317AF61A9B14D204" -" weight=10", -"193.35.52.53:9030 orport=9001 id=DAA39FC00B196B353C2A271459C305C429AF09E4" -" weight=10", -"178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB" -" ipv6=[2001:41d0:2:a683::251]:443" -" weight=10", -"178.62.173.203:9030 orport=9001 id=DD85503F2D1F52EF9EAD621E942298F46CD2FC10" -" ipv6=[2a03:b0c0:0:1010::a4:b001]:9001" -" weight=10", -"5.34.183.205:80 orport=443 id=DDD7871C1B7FA32CB55061E08869A236E61BDDF8" -" weight=10", -"78.24.75.53:9030 orport=9001 id=DEB73705B2929AE9BE87091607388939332EF123" -" weight=10", -"92.222.38.67:80 orport=443 id=DED6892FF89DBD737BA689698A171B2392EB3E82" -" weight=10", -"166.70.207.2:9030 orport=9001 id=E3DB2E354B883B59E8DC56B3E7A353DDFD457812" -" weight=10", -"46.252.26.2:45212 orport=49991 id=E589316576A399C511A9781A73DA4545640B479D" -" weight=10", -"167.114.35.28:9030 orport=9001 id=E65D300F11E1DB12C534B0146BDAB6972F1A8A48" -" weight=10", -"131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8" -" weight=10", -"192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024" -" weight=10", -"192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC" -" weight=10", -"212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109" -" ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001" -" weight=10", -"46.28.207.141:80 orport=443 id=F69BED36177ED727706512BA6A97755025EEA0FB" -" weight=10", -"78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE" -" weight=10", -"178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE" -" weight=10", -"185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216" -" weight=10", -"86.59.119.83:80 orport=443 id=FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B" -" weight=10", -"192.187.124.98:9030 orport=9001 id=FD1871854BFC06D7B02F10742073069F0528B5CC" -" weight=10", -"149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76" -" weight=10", -"193.11.164.243:9030 orport=9001 id=FFA72BD683BC2FCF988356E6BEC1E490F313FB07" -" ipv6=[2001:6b0:7:125::243]:9001" -" weight=10", diff --git a/src/tor/src/or/git_revision.c b/src/tor/src/or/git_revision.c deleted file mode 100644 index 8f326b875..000000000 --- a/src/tor/src/or/git_revision.c +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright 2001-2004 Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "git_revision.h" - -/** String describing which Tor Git repository version the source was - * built from. This string is generated by a bit of shell kludging in - * src/or/include.am, and is usually right. - */ -const char tor_git_revision[] = -#ifndef _MSC_VER -#include "micro-revision.i" -#endif - ""; - diff --git a/src/tor/src/or/git_revision.h b/src/tor/src/or/git_revision.h deleted file mode 100644 index 5613cb433..000000000 --- a/src/tor/src/or/git_revision.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright 2001-2004 Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_GIT_REVISION_H -#define TOR_GIT_REVISION_H - -extern const char tor_git_revision[]; - -#endif /* !defined(TOR_GIT_REVISION_H) */ - diff --git a/src/tor/src/or/hs_cache.c b/src/tor/src/or/hs_cache.c deleted file mode 100644 index 1a8fdbd03..000000000 --- a/src/tor/src/or/hs_cache.c +++ /dev/null @@ -1,976 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_cache.c - * \brief Handle hidden service descriptor caches. - **/ - -/* For unit tests.*/ -#define HS_CACHE_PRIVATE - -#include "or.h" -#include "config.h" -#include "hs_ident.h" -#include "hs_common.h" -#include "hs_client.h" -#include "hs_descriptor.h" -#include "networkstatus.h" -#include "rendcache.h" - -#include "hs_cache.h" - -static int cached_client_descriptor_has_expired(time_t now, - const hs_cache_client_descriptor_t *cached_desc); - -/********************** Directory HS cache ******************/ - -/* Directory descriptor cache. Map indexed by blinded key. */ -static digest256map_t *hs_cache_v3_dir; - -/* Remove a given descriptor from our cache. */ -static void -remove_v3_desc_as_dir(const hs_cache_dir_descriptor_t *desc) -{ - tor_assert(desc); - digest256map_remove(hs_cache_v3_dir, desc->key); -} - -/* Store a given descriptor in our cache. */ -static void -store_v3_desc_as_dir(hs_cache_dir_descriptor_t *desc) -{ - tor_assert(desc); - digest256map_set(hs_cache_v3_dir, desc->key, desc); -} - -/* Query our cache and return the entry or NULL if not found. */ -static hs_cache_dir_descriptor_t * -lookup_v3_desc_as_dir(const uint8_t *key) -{ - tor_assert(key); - return digest256map_get(hs_cache_v3_dir, key); -} - -#define cache_dir_desc_free(val) \ - FREE_AND_NULL(hs_cache_dir_descriptor_t, cache_dir_desc_free_, (val)) - -/* Free a directory descriptor object. */ -static void -cache_dir_desc_free_(hs_cache_dir_descriptor_t *desc) -{ - if (desc == NULL) { - return; - } - hs_desc_plaintext_data_free(desc->plaintext_data); - tor_free(desc->encoded_desc); - tor_free(desc); -} - -/* Helper function: Use by the free all function using the digest256map - * interface to cache entries. */ -static void -cache_dir_desc_free_void(void *ptr) -{ - cache_dir_desc_free_(ptr); -} - -/* Create a new directory cache descriptor object from a encoded descriptor. - * On success, return the heap-allocated cache object, otherwise return NULL if - * we can't decode the descriptor. */ -static hs_cache_dir_descriptor_t * -cache_dir_desc_new(const char *desc) -{ - hs_cache_dir_descriptor_t *dir_desc; - - tor_assert(desc); - - dir_desc = tor_malloc_zero(sizeof(hs_cache_dir_descriptor_t)); - dir_desc->plaintext_data = - tor_malloc_zero(sizeof(hs_desc_plaintext_data_t)); - dir_desc->encoded_desc = tor_strdup(desc); - - if (hs_desc_decode_plaintext(desc, dir_desc->plaintext_data) < 0) { - log_debug(LD_DIR, "Unable to decode descriptor. Rejecting."); - goto err; - } - - /* The blinded pubkey is the indexed key. */ - dir_desc->key = dir_desc->plaintext_data->blinded_pubkey.pubkey; - dir_desc->created_ts = time(NULL); - return dir_desc; - - err: - cache_dir_desc_free(dir_desc); - return NULL; -} - -/* Return the size of a cache entry in bytes. */ -static size_t -cache_get_dir_entry_size(const hs_cache_dir_descriptor_t *entry) -{ - return (sizeof(*entry) + hs_desc_plaintext_obj_size(entry->plaintext_data) - + strlen(entry->encoded_desc)); -} - -/* Try to store a valid version 3 descriptor in the directory cache. Return 0 - * on success else a negative value is returned indicating that we have a - * newer version in our cache. On error, caller is responsible to free the - * given descriptor desc. */ -static int -cache_store_v3_as_dir(hs_cache_dir_descriptor_t *desc) -{ - hs_cache_dir_descriptor_t *cache_entry; - - tor_assert(desc); - - /* Verify if we have an entry in the cache for that key and if yes, check - * if we should replace it? */ - cache_entry = lookup_v3_desc_as_dir(desc->key); - if (cache_entry != NULL) { - /* Only replace descriptor if revision-counter is greater than the one - * in our cache */ - if (cache_entry->plaintext_data->revision_counter >= - desc->plaintext_data->revision_counter) { - log_info(LD_REND, "Descriptor revision counter in our cache is " - "greater or equal than the one we received (%d/%d). " - "Rejecting!", - (int)cache_entry->plaintext_data->revision_counter, - (int)desc->plaintext_data->revision_counter); - goto err; - } - /* We now know that the descriptor we just received is a new one so - * remove the entry we currently have from our cache so we can then - * store the new one. */ - remove_v3_desc_as_dir(cache_entry); - rend_cache_decrement_allocation(cache_get_dir_entry_size(cache_entry)); - cache_dir_desc_free(cache_entry); - } - /* Store the descriptor we just got. We are sure here that either we - * don't have the entry or we have a newer descriptor and the old one - * has been removed from the cache. */ - store_v3_desc_as_dir(desc); - - /* Update our total cache size with this entry for the OOM. This uses the - * old HS protocol cache subsystem for which we are tied with. */ - rend_cache_increment_allocation(cache_get_dir_entry_size(desc)); - - /* XXX: Update HS statistics. We should have specific stats for v3. */ - - return 0; - - err: - return -1; -} - -/* Using the query which is the base64 encoded blinded key of a version 3 - * descriptor, lookup in our directory cache the entry. If found, 1 is - * returned and desc_out is populated with a newly allocated string being the - * encoded descriptor. If not found, 0 is returned and desc_out is untouched. - * On error, a negative value is returned and desc_out is untouched. */ -static int -cache_lookup_v3_as_dir(const char *query, const char **desc_out) -{ - int found = 0; - ed25519_public_key_t blinded_key; - const hs_cache_dir_descriptor_t *entry; - - tor_assert(query); - - /* Decode blinded key using the given query value. */ - if (ed25519_public_from_base64(&blinded_key, query) < 0) { - log_info(LD_REND, "Unable to decode the v3 HSDir query %s.", - safe_str_client(query)); - goto err; - } - - entry = lookup_v3_desc_as_dir(blinded_key.pubkey); - if (entry != NULL) { - found = 1; - if (desc_out) { - *desc_out = entry->encoded_desc; - } - } - - return found; - - err: - return -1; -} - -/* Clean the v3 cache by removing any entry that has expired using the - * global_cutoff value. If global_cutoff is 0, the cleaning - * process will use the lifetime found in the plaintext data section. Return - * the number of bytes cleaned. */ -STATIC size_t -cache_clean_v3_as_dir(time_t now, time_t global_cutoff) -{ - size_t bytes_removed = 0; - - /* Code flow error if this ever happens. */ - tor_assert(global_cutoff >= 0); - - if (!hs_cache_v3_dir) { /* No cache to clean. Just return. */ - return 0; - } - - DIGEST256MAP_FOREACH_MODIFY(hs_cache_v3_dir, key, - hs_cache_dir_descriptor_t *, entry) { - size_t entry_size; - time_t cutoff = global_cutoff; - if (!cutoff) { - /* Cutoff is the lifetime of the entry found in the descriptor. */ - cutoff = now - entry->plaintext_data->lifetime_sec; - } - - /* If the entry has been created _after_ the cutoff, not expired so - * continue to the next entry in our v3 cache. */ - if (entry->created_ts > cutoff) { - continue; - } - /* Here, our entry has expired, remove and free. */ - MAP_DEL_CURRENT(key); - entry_size = cache_get_dir_entry_size(entry); - bytes_removed += entry_size; - /* Entry is not in the cache anymore, destroy it. */ - cache_dir_desc_free(entry); - /* Update our cache entry allocation size for the OOM. */ - rend_cache_decrement_allocation(entry_size); - /* Logging. */ - { - char key_b64[BASE64_DIGEST256_LEN + 1]; - digest256_to_base64(key_b64, (const char *) key); - log_info(LD_REND, "Removing v3 descriptor '%s' from HSDir cache", - safe_str_client(key_b64)); - } - } DIGEST256MAP_FOREACH_END; - - return bytes_removed; -} - -/* Given an encoded descriptor, store it in the directory cache depending on - * which version it is. Return a negative value on error. On success, 0 is - * returned. */ -int -hs_cache_store_as_dir(const char *desc) -{ - hs_cache_dir_descriptor_t *dir_desc = NULL; - - tor_assert(desc); - - /* Create a new cache object. This can fail if the descriptor plaintext data - * is unparseable which in this case a log message will be triggered. */ - dir_desc = cache_dir_desc_new(desc); - if (dir_desc == NULL) { - goto err; - } - - /* Call the right function against the descriptor version. At this point, - * we are sure that the descriptor's version is supported else the - * decoding would have failed. */ - switch (dir_desc->plaintext_data->version) { - case HS_VERSION_THREE: - default: - if (cache_store_v3_as_dir(dir_desc) < 0) { - goto err; - } - break; - } - return 0; - - err: - cache_dir_desc_free(dir_desc); - return -1; -} - -/* Using the query, lookup in our directory cache the entry. If found, 1 is - * returned and desc_out is populated with a newly allocated string being - * the encoded descriptor. If not found, 0 is returned and desc_out is - * untouched. On error, a negative value is returned and desc_out is - * untouched. */ -int -hs_cache_lookup_as_dir(uint32_t version, const char *query, - const char **desc_out) -{ - int found; - - tor_assert(query); - /* This should never be called with an unsupported version. */ - tor_assert(hs_desc_is_supported_version(version)); - - switch (version) { - case HS_VERSION_THREE: - default: - found = cache_lookup_v3_as_dir(query, desc_out); - break; - } - - return found; -} - -/* Clean all directory caches using the current time now. */ -void -hs_cache_clean_as_dir(time_t now) -{ - time_t cutoff; - - /* Start with v2 cache cleaning. */ - cutoff = now - rend_cache_max_entry_lifetime(); - rend_cache_clean_v2_descs_as_dir(cutoff); - - /* Now, clean the v3 cache. Set the cutoff to 0 telling the cleanup function - * to compute the cutoff by itself using the lifetime value. */ - cache_clean_v3_as_dir(now, 0); -} - -/********************** Client-side HS cache ******************/ - -/* Client-side HS descriptor cache. Map indexed by service identity key. */ -static digest256map_t *hs_cache_v3_client; - -/* Client-side introduction point state cache. Map indexed by service public - * identity key (onion address). It contains hs_cache_client_intro_state_t - * objects all related to a specific service. */ -static digest256map_t *hs_cache_client_intro_state; - -/* Return the size of a client cache entry in bytes. */ -static size_t -cache_get_client_entry_size(const hs_cache_client_descriptor_t *entry) -{ - return sizeof(*entry) + - strlen(entry->encoded_desc) + hs_desc_obj_size(entry->desc); -} - -/* Remove a given descriptor from our cache. */ -static void -remove_v3_desc_as_client(const hs_cache_client_descriptor_t *desc) -{ - tor_assert(desc); - digest256map_remove(hs_cache_v3_client, desc->key.pubkey); - /* Update cache size with this entry for the OOM handler. */ - rend_cache_decrement_allocation(cache_get_client_entry_size(desc)); -} - -/* Store a given descriptor in our cache. */ -static void -store_v3_desc_as_client(hs_cache_client_descriptor_t *desc) -{ - tor_assert(desc); - digest256map_set(hs_cache_v3_client, desc->key.pubkey, desc); - /* Update cache size with this entry for the OOM handler. */ - rend_cache_increment_allocation(cache_get_client_entry_size(desc)); -} - -/* Query our cache and return the entry or NULL if not found or if expired. */ -STATIC hs_cache_client_descriptor_t * -lookup_v3_desc_as_client(const uint8_t *key) -{ - time_t now = approx_time(); - hs_cache_client_descriptor_t *cached_desc; - - tor_assert(key); - - /* Do the lookup */ - cached_desc = digest256map_get(hs_cache_v3_client, key); - if (!cached_desc) { - return NULL; - } - - /* Don't return expired entries */ - if (cached_client_descriptor_has_expired(now, cached_desc)) { - return NULL; - } - - return cached_desc; -} - -/* Parse the encoded descriptor in desc_str using - * service_identity_pk to decrypt it first. - * - * If everything goes well, allocate and return a new - * hs_cache_client_descriptor_t object. In case of error, return NULL. */ -static hs_cache_client_descriptor_t * -cache_client_desc_new(const char *desc_str, - const ed25519_public_key_t *service_identity_pk) -{ - hs_descriptor_t *desc = NULL; - hs_cache_client_descriptor_t *client_desc = NULL; - - tor_assert(desc_str); - tor_assert(service_identity_pk); - - /* Decode the descriptor we just fetched. */ - if (hs_client_decode_descriptor(desc_str, service_identity_pk, &desc) < 0) { - goto end; - } - tor_assert(desc); - - /* All is good: make a cache object for this descriptor */ - client_desc = tor_malloc_zero(sizeof(hs_cache_client_descriptor_t)); - ed25519_pubkey_copy(&client_desc->key, service_identity_pk); - /* Set expiration time for this cached descriptor to be the start of the next - * time period since that's when clients need to start using the next blinded - * pk of the service (and hence will need its next descriptor). */ - client_desc->expiration_ts = hs_get_start_time_of_next_time_period(0); - client_desc->desc = desc; - client_desc->encoded_desc = tor_strdup(desc_str); - - end: - return client_desc; -} - -#define cache_client_desc_free(val) \ - FREE_AND_NULL(hs_cache_client_descriptor_t, cache_client_desc_free_, (val)) - -/** Free memory allocated by desc. */ -static void -cache_client_desc_free_(hs_cache_client_descriptor_t *desc) -{ - if (desc == NULL) { - return; - } - hs_descriptor_free(desc->desc); - memwipe(&desc->key, 0, sizeof(desc->key)); - memwipe(desc->encoded_desc, 0, strlen(desc->encoded_desc)); - tor_free(desc->encoded_desc); - tor_free(desc); -} - -/** Helper function: Use by the free all function to clear the client cache */ -static void -cache_client_desc_free_void(void *ptr) -{ - hs_cache_client_descriptor_t *desc = ptr; - cache_client_desc_free(desc); -} - -/* Return a newly allocated and initialized hs_cache_intro_state_t object. */ -static hs_cache_intro_state_t * -cache_intro_state_new(void) -{ - hs_cache_intro_state_t *state = tor_malloc_zero(sizeof(*state)); - state->created_ts = approx_time(); - return state; -} - -#define cache_intro_state_free(val) \ - FREE_AND_NULL(hs_cache_intro_state_t, cache_intro_state_free_, (val)) - -/* Free an hs_cache_intro_state_t object. */ -static void -cache_intro_state_free_(hs_cache_intro_state_t *state) -{ - tor_free(state); -} - -/* Helper function: use by the free all function. */ -static void -cache_intro_state_free_void(void *state) -{ - cache_intro_state_free_(state); -} - -/* Return a newly allocated and initialized hs_cache_client_intro_state_t - * object. */ -static hs_cache_client_intro_state_t * -cache_client_intro_state_new(void) -{ - hs_cache_client_intro_state_t *cache = tor_malloc_zero(sizeof(*cache)); - cache->intro_points = digest256map_new(); - return cache; -} - -#define cache_client_intro_state_free(val) \ - FREE_AND_NULL(hs_cache_client_intro_state_t, \ - cache_client_intro_state_free_, (val)) - -/* Free a cache client intro state object. */ -static void -cache_client_intro_state_free_(hs_cache_client_intro_state_t *cache) -{ - if (cache == NULL) { - return; - } - digest256map_free(cache->intro_points, cache_intro_state_free_void); - tor_free(cache); -} - -/* Helper function: use by the free all function. */ -static void -cache_client_intro_state_free_void(void *entry) -{ - cache_client_intro_state_free_(entry); -} - -/* For the given service identity key service_pk and an introduction - * authentication key auth_key, lookup the intro state object. Return 1 if - * found and put it in entry if not NULL. Return 0 if not found and entry is - * untouched. */ -static int -cache_client_intro_state_lookup(const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key, - hs_cache_intro_state_t **entry) -{ - hs_cache_intro_state_t *state; - hs_cache_client_intro_state_t *cache; - - tor_assert(service_pk); - tor_assert(auth_key); - - /* Lookup the intro state cache for this service key. */ - cache = digest256map_get(hs_cache_client_intro_state, service_pk->pubkey); - if (cache == NULL) { - goto not_found; - } - - /* From the cache we just found for the service, lookup in the introduction - * points map for the given authentication key. */ - state = digest256map_get(cache->intro_points, auth_key->pubkey); - if (state == NULL) { - goto not_found; - } - if (entry) { - *entry = state; - } - return 1; - not_found: - return 0; -} - -/* Note the given failure in state. */ -static void -cache_client_intro_state_note(hs_cache_intro_state_t *state, - rend_intro_point_failure_t failure) -{ - tor_assert(state); - switch (failure) { - case INTRO_POINT_FAILURE_GENERIC: - state->error = 1; - break; - case INTRO_POINT_FAILURE_TIMEOUT: - state->timed_out = 1; - break; - case INTRO_POINT_FAILURE_UNREACHABLE: - state->unreachable_count++; - break; - default: - tor_assert_nonfatal_unreached(); - return; - } -} - -/* For the given service identity key service_pk and an introduction - * authentication key auth_key, add an entry in the client intro state cache - * If no entry exists for the service, it will create one. If state is non - * NULL, it will point to the new intro state entry. */ -static void -cache_client_intro_state_add(const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key, - hs_cache_intro_state_t **state) -{ - hs_cache_intro_state_t *entry, *old_entry; - hs_cache_client_intro_state_t *cache; - - tor_assert(service_pk); - tor_assert(auth_key); - - /* Lookup the state cache for this service key. */ - cache = digest256map_get(hs_cache_client_intro_state, service_pk->pubkey); - if (cache == NULL) { - cache = cache_client_intro_state_new(); - digest256map_set(hs_cache_client_intro_state, service_pk->pubkey, cache); - } - - entry = cache_intro_state_new(); - old_entry = digest256map_set(cache->intro_points, auth_key->pubkey, entry); - /* This should never happened because the code flow is to lookup the entry - * before adding it. But, just in case, non fatal assert and free it. */ - tor_assert_nonfatal(old_entry == NULL); - tor_free(old_entry); - - if (state) { - *state = entry; - } -} - -/* Remove every intro point state entry from cache that has been created - * before or at the cutoff. */ -static void -cache_client_intro_state_clean(time_t cutoff, - hs_cache_client_intro_state_t *cache) -{ - tor_assert(cache); - - DIGEST256MAP_FOREACH_MODIFY(cache->intro_points, key, - hs_cache_intro_state_t *, entry) { - if (entry->created_ts <= cutoff) { - cache_intro_state_free(entry); - MAP_DEL_CURRENT(key); - } - } DIGEST256MAP_FOREACH_END; -} - -/* Return true iff no intro points are in this cache. */ -static int -cache_client_intro_state_is_empty(const hs_cache_client_intro_state_t *cache) -{ - return digest256map_isempty(cache->intro_points); -} - -/** Check whether client_desc is useful for us, and store it in the - * client-side HS cache if so. The client_desc is freed if we already have a - * fresher (higher revision counter count) in the cache. */ -static int -cache_store_as_client(hs_cache_client_descriptor_t *client_desc) -{ - hs_cache_client_descriptor_t *cache_entry; - - /* TODO: Heavy code duplication with cache_store_as_dir(). Consider - * refactoring and uniting! */ - - tor_assert(client_desc); - - /* Check if we already have a descriptor from this HS in cache. If we do, - * check if this descriptor is newer than the cached one */ - cache_entry = lookup_v3_desc_as_client(client_desc->key.pubkey); - if (cache_entry != NULL) { - /* If we have an entry in our cache that has a revision counter greater - * than the one we just fetched, discard the one we fetched. */ - if (BUG(cache_entry->desc->plaintext_data.revision_counter > - client_desc->desc->plaintext_data.revision_counter)) { - cache_client_desc_free(client_desc); - goto done; - } - /* Remove old entry. Make space for the new one! */ - remove_v3_desc_as_client(cache_entry); - cache_client_desc_free(cache_entry); - } - - /* Store descriptor in cache */ - store_v3_desc_as_client(client_desc); - - done: - return 0; -} - -/* Return true iff the cached client descriptor at cached_descexpiration_ts <= ns->valid_after) { - return 1; - } - - return 0; -} - -/* clean the client cache using now as the current time. Return the total size - * of removed bytes from the cache. */ -static size_t -cache_clean_v3_as_client(time_t now) -{ - size_t bytes_removed = 0; - - if (!hs_cache_v3_client) { /* No cache to clean. Just return. */ - return 0; - } - - DIGEST256MAP_FOREACH_MODIFY(hs_cache_v3_client, key, - hs_cache_client_descriptor_t *, entry) { - size_t entry_size; - - /* If the entry has not expired, continue to the next cached entry */ - if (!cached_client_descriptor_has_expired(now, entry)) { - continue; - } - /* Here, our entry has expired, remove and free. */ - MAP_DEL_CURRENT(key); - entry_size = cache_get_client_entry_size(entry); - bytes_removed += entry_size; - /* Entry is not in the cache anymore, destroy it. */ - cache_client_desc_free(entry); - /* Update our OOM. We didn't use the remove() function because we are in - * a loop so we have to explicitely decrement. */ - rend_cache_decrement_allocation(entry_size); - /* Logging. */ - { - char key_b64[BASE64_DIGEST256_LEN + 1]; - digest256_to_base64(key_b64, (const char *) key); - log_info(LD_REND, "Removing hidden service v3 descriptor '%s' " - "from client cache", - safe_str_client(key_b64)); - } - } DIGEST256MAP_FOREACH_END; - - return bytes_removed; -} - -/** Public API: Given the HS ed25519 identity public key in key, return - * its HS encoded descriptor if it's stored in our cache, or NULL if not. */ -const char * -hs_cache_lookup_encoded_as_client(const ed25519_public_key_t *key) -{ - hs_cache_client_descriptor_t *cached_desc = NULL; - - tor_assert(key); - - cached_desc = lookup_v3_desc_as_client(key->pubkey); - if (cached_desc) { - tor_assert(cached_desc->encoded_desc); - return cached_desc->encoded_desc; - } - - return NULL; -} - -/** Public API: Given the HS ed25519 identity public key in key, return - * its HS descriptor if it's stored in our cache, or NULL if not. */ -const hs_descriptor_t * -hs_cache_lookup_as_client(const ed25519_public_key_t *key) -{ - hs_cache_client_descriptor_t *cached_desc = NULL; - - tor_assert(key); - - cached_desc = lookup_v3_desc_as_client(key->pubkey); - if (cached_desc) { - tor_assert(cached_desc->desc); - return cached_desc->desc; - } - - return NULL; -} - -/** Public API: Given an encoded descriptor, store it in the client HS - * cache. Return -1 on error, 0 on success .*/ -int -hs_cache_store_as_client(const char *desc_str, - const ed25519_public_key_t *identity_pk) -{ - hs_cache_client_descriptor_t *client_desc = NULL; - - tor_assert(desc_str); - tor_assert(identity_pk); - - /* Create client cache descriptor object */ - client_desc = cache_client_desc_new(desc_str, identity_pk); - if (!client_desc) { - log_warn(LD_GENERAL, "Failed to parse received descriptor %s.", - escaped(desc_str)); - goto err; - } - - /* Push it to the cache */ - if (cache_store_as_client(client_desc) < 0) { - goto err; - } - - return 0; - - err: - cache_client_desc_free(client_desc); - return -1; -} - -/* Clean all client caches using the current time now. */ -void -hs_cache_clean_as_client(time_t now) -{ - /* Start with v2 cache cleaning. */ - rend_cache_clean(now, REND_CACHE_TYPE_CLIENT); - /* Now, clean the v3 cache. Set the cutoff to 0 telling the cleanup function - * to compute the cutoff by itself using the lifetime value. */ - cache_clean_v3_as_client(now); -} - -/* Purge the client descriptor cache. */ -void -hs_cache_purge_as_client(void) -{ - DIGEST256MAP_FOREACH_MODIFY(hs_cache_v3_client, key, - hs_cache_client_descriptor_t *, entry) { - size_t entry_size = cache_get_client_entry_size(entry); - MAP_DEL_CURRENT(key); - cache_client_desc_free(entry); - /* Update our OOM. We didn't use the remove() function because we are in - * a loop so we have to explicitely decrement. */ - rend_cache_decrement_allocation(entry_size); - } DIGEST256MAP_FOREACH_END; - - log_info(LD_REND, "Hidden service client descriptor cache purged."); -} - -/* For a given service identity public key and an introduction authentication - * key, note the given failure in the client intro state cache. */ -void -hs_cache_client_intro_state_note(const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key, - rend_intro_point_failure_t failure) -{ - int found; - hs_cache_intro_state_t *entry; - - tor_assert(service_pk); - tor_assert(auth_key); - - found = cache_client_intro_state_lookup(service_pk, auth_key, &entry); - if (!found) { - /* Create a new entry and add it to the cache. */ - cache_client_intro_state_add(service_pk, auth_key, &entry); - } - /* Note down the entry. */ - cache_client_intro_state_note(entry, failure); -} - -/* For a given service identity public key and an introduction authentication - * key, return true iff it is present in the failure cache. */ -const hs_cache_intro_state_t * -hs_cache_client_intro_state_find(const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key) -{ - hs_cache_intro_state_t *state = NULL; - cache_client_intro_state_lookup(service_pk, auth_key, &state); - return state; -} - -/* Cleanup the client introduction state cache. */ -void -hs_cache_client_intro_state_clean(time_t now) -{ - time_t cutoff = now - HS_CACHE_CLIENT_INTRO_STATE_MAX_AGE; - - DIGEST256MAP_FOREACH_MODIFY(hs_cache_client_intro_state, key, - hs_cache_client_intro_state_t *, cache) { - /* Cleanup intro points failure. */ - cache_client_intro_state_clean(cutoff, cache); - - /* Is this cache empty for this service key? If yes, remove it from the - * cache. Else keep it. */ - if (cache_client_intro_state_is_empty(cache)) { - cache_client_intro_state_free(cache); - MAP_DEL_CURRENT(key); - } - } DIGEST256MAP_FOREACH_END; -} - -/* Purge the client introduction state cache. */ -void -hs_cache_client_intro_state_purge(void) -{ - DIGEST256MAP_FOREACH_MODIFY(hs_cache_client_intro_state, key, - hs_cache_client_intro_state_t *, cache) { - MAP_DEL_CURRENT(key); - cache_client_intro_state_free(cache); - } DIGEST256MAP_FOREACH_END; - - log_info(LD_REND, "Hidden service client introduction point state " - "cache purged."); -} - -/**************** Generics *********************************/ - -/* Do a round of OOM cleanup on all directory caches. Return the amount of - * removed bytes. It is possible that the returned value is lower than - * min_remove_bytes if the caches get emptied out so the caller should be - * aware of this. */ -size_t -hs_cache_handle_oom(time_t now, size_t min_remove_bytes) -{ - time_t k; - size_t bytes_removed = 0; - - /* Our OOM handler called with 0 bytes to remove is a code flow error. */ - tor_assert(min_remove_bytes != 0); - - /* The algorithm is as follow. K is the oldest expected descriptor age. - * - * 1) Deallocate all entries from v2 cache that are older than K hours. - * 1.1) If the amount of remove bytes has been reached, stop. - * 2) Deallocate all entries from v3 cache that are older than K hours - * 2.1) If the amount of remove bytes has been reached, stop. - * 3) Set K = K - RendPostPeriod and repeat process until K is < 0. - * - * This ends up being O(Kn). - */ - - /* Set K to the oldest expected age in seconds which is the maximum - * lifetime of a cache entry. We'll use the v2 lifetime because it's much - * bigger than the v3 thus leading to cleaning older descriptors. */ - k = rend_cache_max_entry_lifetime(); - - do { - time_t cutoff; - - /* If K becomes negative, it means we've empty the caches so stop and - * return what we were able to cleanup. */ - if (k < 0) { - break; - } - /* Compute a cutoff value with K and the current time. */ - cutoff = now - k; - - /* Start by cleaning the v2 cache with that cutoff. */ - bytes_removed += rend_cache_clean_v2_descs_as_dir(cutoff); - - if (bytes_removed < min_remove_bytes) { - /* We haven't remove enough bytes so clean v3 cache. */ - bytes_removed += cache_clean_v3_as_dir(now, cutoff); - /* Decrement K by a post period to shorten the cutoff. */ - k -= get_options()->RendPostPeriod; - } - } while (bytes_removed < min_remove_bytes); - - return bytes_removed; -} - -/* Return the maximum size of a v3 HS descriptor. */ -unsigned int -hs_cache_get_max_descriptor_size(void) -{ - return (unsigned) networkstatus_get_param(NULL, - "HSV3MaxDescriptorSize", - HS_DESC_MAX_LEN, 1, INT32_MAX); -} - -/* Initialize the hidden service cache subsystem. */ -void -hs_cache_init(void) -{ - /* Calling this twice is very wrong code flow. */ - tor_assert(!hs_cache_v3_dir); - hs_cache_v3_dir = digest256map_new(); - - tor_assert(!hs_cache_v3_client); - hs_cache_v3_client = digest256map_new(); - - tor_assert(!hs_cache_client_intro_state); - hs_cache_client_intro_state = digest256map_new(); -} - -/* Cleanup the hidden service cache subsystem. */ -void -hs_cache_free_all(void) -{ - digest256map_free(hs_cache_v3_dir, cache_dir_desc_free_void); - hs_cache_v3_dir = NULL; - - digest256map_free(hs_cache_v3_client, cache_client_desc_free_void); - hs_cache_v3_client = NULL; - - digest256map_free(hs_cache_client_intro_state, - cache_client_intro_state_free_void); - hs_cache_client_intro_state = NULL; -} - diff --git a/src/tor/src/or/hs_cache.h b/src/tor/src/or/hs_cache.h deleted file mode 100644 index a141634cc..000000000 --- a/src/tor/src/or/hs_cache.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_cache.h - * \brief Header file for hs_cache.c - **/ - -#ifndef TOR_HS_CACHE_H -#define TOR_HS_CACHE_H - -#include - -#include "crypto.h" -#include "crypto_ed25519.h" -#include "hs_common.h" -#include "hs_descriptor.h" -#include "rendcommon.h" -#include "torcert.h" - -/* This is the maximum time an introduction point state object can stay in the - * client cache in seconds (2 mins or 120 seconds). */ -#define HS_CACHE_CLIENT_INTRO_STATE_MAX_AGE (2 * 60) - -/* Introduction point state. */ -typedef struct hs_cache_intro_state_t { - /* When this entry was created and put in the cache. */ - time_t created_ts; - - /* Did it suffered a generic error? */ - unsigned int error : 1; - - /* Did it timed out? */ - unsigned int timed_out : 1; - - /* How many times we tried to reached it and it was unreachable. */ - uint32_t unreachable_count; -} hs_cache_intro_state_t; - -typedef struct hs_cache_client_intro_state_t { - /* Contains hs_cache_intro_state_t object indexed by introduction point - * authentication key. */ - digest256map_t *intro_points; -} hs_cache_client_intro_state_t; - -/* Descriptor representation on the directory side which is a subset of - * information that the HSDir can decode and serve it. */ -typedef struct hs_cache_dir_descriptor_t { - /* This object is indexed using the blinded pubkey located in the plaintext - * data which is populated only once the descriptor has been successfully - * decoded and validated. This simply points to that pubkey. */ - const uint8_t *key; - - /* When does this entry has been created. Used to expire entries. */ - time_t created_ts; - - /* Descriptor plaintext information. Obviously, we can't decrypt the - * encrypted part of the descriptor. */ - hs_desc_plaintext_data_t *plaintext_data; - - /* Encoded descriptor which is basically in text form. It's a NUL terminated - * string thus safe to strlen(). */ - char *encoded_desc; -} hs_cache_dir_descriptor_t; - -/* Public API */ - -void hs_cache_init(void); -void hs_cache_free_all(void); -void hs_cache_clean_as_dir(time_t now); -size_t hs_cache_handle_oom(time_t now, size_t min_remove_bytes); - -unsigned int hs_cache_get_max_descriptor_size(void); - -/* Store and Lookup function. They are version agnostic that is depending on - * the requested version of the descriptor, it will be re-routed to the - * right function. */ -int hs_cache_store_as_dir(const char *desc); -int hs_cache_lookup_as_dir(uint32_t version, const char *query, - const char **desc_out); - -const hs_descriptor_t * -hs_cache_lookup_as_client(const ed25519_public_key_t *key); -const char * -hs_cache_lookup_encoded_as_client(const ed25519_public_key_t *key); -int hs_cache_store_as_client(const char *desc_str, - const ed25519_public_key_t *identity_pk); -void hs_cache_clean_as_client(time_t now); -void hs_cache_purge_as_client(void); - -/* Client failure cache. */ -void hs_cache_client_intro_state_note(const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key, - rend_intro_point_failure_t failure); -const hs_cache_intro_state_t *hs_cache_client_intro_state_find( - const ed25519_public_key_t *service_pk, - const ed25519_public_key_t *auth_key); -void hs_cache_client_intro_state_clean(time_t now); -void hs_cache_client_intro_state_purge(void); - -#ifdef HS_CACHE_PRIVATE - -/** Represents a locally cached HS descriptor on a hidden service client. */ -typedef struct hs_cache_client_descriptor_t { - /* This object is indexed using the service identity public key */ - ed25519_public_key_t key; - - /* When will this entry expire? We expire cached client descriptors in the - * start of the next time period, since that's when clients need to start - * using the next blinded key of the service. */ - time_t expiration_ts; - - /* The cached descriptor, this object is the owner. It can't be NULL. A - * cache object without a valid descriptor is not possible. */ - hs_descriptor_t *desc; - - /* Encoded descriptor in string form. Can't be NULL. */ - char *encoded_desc; -} hs_cache_client_descriptor_t; - -STATIC size_t cache_clean_v3_as_dir(time_t now, time_t global_cutoff); - -STATIC hs_cache_client_descriptor_t * -lookup_v3_desc_as_client(const uint8_t *key); - -#endif /* defined(HS_CACHE_PRIVATE) */ - -#endif /* !defined(TOR_HS_CACHE_H) */ - diff --git a/src/tor/src/or/hs_cell.c b/src/tor/src/or/hs_cell.c deleted file mode 100644 index 5244cfa3d..000000000 --- a/src/tor/src/or/hs_cell.c +++ /dev/null @@ -1,948 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_cell.c - * \brief Hidden service API for cell creation and handling. - **/ - -#include "or.h" -#include "config.h" -#include "rendservice.h" -#include "replaycache.h" -#include "util.h" - -#include "hs_cell.h" -#include "hs_ntor.h" - -/* Trunnel. */ -#include "ed25519_cert.h" -#include "hs/cell_common.h" -#include "hs/cell_establish_intro.h" -#include "hs/cell_introduce1.h" -#include "hs/cell_rendezvous.h" - -/* Compute the MAC of an INTRODUCE cell in mac_out. The encoded_cell param is - * the cell content up to the ENCRYPTED section of length encoded_cell_len. - * The encrypted param is the start of the ENCRYPTED section of length - * encrypted_len. The mac_key is the key needed for the computation of the MAC - * derived from the ntor handshake of length mac_key_len. - * - * The length mac_out_len must be at least DIGEST256_LEN. */ -static void -compute_introduce_mac(const uint8_t *encoded_cell, size_t encoded_cell_len, - const uint8_t *encrypted, size_t encrypted_len, - const uint8_t *mac_key, size_t mac_key_len, - uint8_t *mac_out, size_t mac_out_len) -{ - size_t offset = 0; - size_t mac_msg_len; - uint8_t mac_msg[RELAY_PAYLOAD_SIZE] = {0}; - - tor_assert(encoded_cell); - tor_assert(encrypted); - tor_assert(mac_key); - tor_assert(mac_out); - tor_assert(mac_out_len >= DIGEST256_LEN); - - /* Compute the size of the message which is basically the entire cell until - * the MAC field of course. */ - mac_msg_len = encoded_cell_len + (encrypted_len - DIGEST256_LEN); - tor_assert(mac_msg_len <= sizeof(mac_msg)); - - /* First, put the encoded cell in the msg. */ - memcpy(mac_msg, encoded_cell, encoded_cell_len); - offset += encoded_cell_len; - /* Second, put the CLIENT_PK + ENCRYPTED_DATA but ommit the MAC field (which - * is junk at this point). */ - memcpy(mac_msg + offset, encrypted, (encrypted_len - DIGEST256_LEN)); - offset += (encrypted_len - DIGEST256_LEN); - tor_assert(offset == mac_msg_len); - - crypto_mac_sha3_256(mac_out, mac_out_len, - mac_key, mac_key_len, - mac_msg, mac_msg_len); - memwipe(mac_msg, 0, sizeof(mac_msg)); -} - -/* From a set of keys, subcredential and the ENCRYPTED section of an - * INTRODUCE2 cell, return a newly allocated intro cell keys structure. - * Finally, the client public key is copied in client_pk. On error, return - * NULL. */ -static hs_ntor_intro_cell_keys_t * -get_introduce2_key_material(const ed25519_public_key_t *auth_key, - const curve25519_keypair_t *enc_key, - const uint8_t *subcredential, - const uint8_t *encrypted_section, - curve25519_public_key_t *client_pk) -{ - hs_ntor_intro_cell_keys_t *keys; - - tor_assert(auth_key); - tor_assert(enc_key); - tor_assert(subcredential); - tor_assert(encrypted_section); - tor_assert(client_pk); - - keys = tor_malloc_zero(sizeof(*keys)); - - /* First bytes of the ENCRYPTED section are the client public key. */ - memcpy(client_pk->public_key, encrypted_section, CURVE25519_PUBKEY_LEN); - - if (hs_ntor_service_get_introduce1_keys(auth_key, enc_key, client_pk, - subcredential, keys) < 0) { - /* Don't rely on the caller to wipe this on error. */ - memwipe(client_pk, 0, sizeof(curve25519_public_key_t)); - tor_free(keys); - keys = NULL; - } - return keys; -} - -/* Using the given encryption key, decrypt the encrypted_section of length - * encrypted_section_len of an INTRODUCE2 cell and return a newly allocated - * buffer containing the decrypted data. On decryption failure, NULL is - * returned. */ -static uint8_t * -decrypt_introduce2(const uint8_t *enc_key, const uint8_t *encrypted_section, - size_t encrypted_section_len) -{ - uint8_t *decrypted = NULL; - crypto_cipher_t *cipher = NULL; - - tor_assert(enc_key); - tor_assert(encrypted_section); - - /* Decrypt ENCRYPTED section. */ - cipher = crypto_cipher_new_with_bits((char *) enc_key, - CURVE25519_PUBKEY_LEN * 8); - tor_assert(cipher); - - /* This is symmetric encryption so can't be bigger than the encrypted - * section length. */ - decrypted = tor_malloc_zero(encrypted_section_len); - if (crypto_cipher_decrypt(cipher, (char *) decrypted, - (const char *) encrypted_section, - encrypted_section_len) < 0) { - tor_free(decrypted); - decrypted = NULL; - goto done; - } - - done: - crypto_cipher_free(cipher); - return decrypted; -} - -/* Given a pointer to the decrypted data of the ENCRYPTED section of an - * INTRODUCE2 cell of length decrypted_len, parse and validate the cell - * content. Return a newly allocated cell structure or NULL on error. The - * circuit and service object are only used for logging purposes. */ -static trn_cell_introduce_encrypted_t * -parse_introduce2_encrypted(const uint8_t *decrypted_data, - size_t decrypted_len, const origin_circuit_t *circ, - const hs_service_t *service) -{ - trn_cell_introduce_encrypted_t *enc_cell = NULL; - - tor_assert(decrypted_data); - tor_assert(circ); - tor_assert(service); - - if (trn_cell_introduce_encrypted_parse(&enc_cell, decrypted_data, - decrypted_len) < 0) { - log_info(LD_REND, "Unable to parse the decrypted ENCRYPTED section of " - "the INTRODUCE2 cell on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - - if (trn_cell_introduce_encrypted_get_onion_key_type(enc_cell) != - HS_CELL_ONION_KEY_TYPE_NTOR) { - log_info(LD_REND, "INTRODUCE2 onion key type is invalid. Got %u but " - "expected %u on circuit %u for service %s", - trn_cell_introduce_encrypted_get_onion_key_type(enc_cell), - HS_CELL_ONION_KEY_TYPE_NTOR, TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - - if (trn_cell_introduce_encrypted_getlen_onion_key(enc_cell) != - CURVE25519_PUBKEY_LEN) { - log_info(LD_REND, "INTRODUCE2 onion key length is invalid. Got %u but " - "expected %d on circuit %u for service %s", - (unsigned)trn_cell_introduce_encrypted_getlen_onion_key(enc_cell), - CURVE25519_PUBKEY_LEN, TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - /* XXX: Validate NSPEC field as well. */ - - return enc_cell; - err: - trn_cell_introduce_encrypted_free(enc_cell); - return NULL; -} - -/* Build a legacy ESTABLISH_INTRO cell with the given circuit nonce and RSA - * encryption key. The encoded cell is put in cell_out that MUST at least be - * of the size of RELAY_PAYLOAD_SIZE. Return the encoded cell length on - * success else a negative value and cell_out is untouched. */ -static ssize_t -build_legacy_establish_intro(const char *circ_nonce, crypto_pk_t *enc_key, - uint8_t *cell_out) -{ - ssize_t cell_len; - - tor_assert(circ_nonce); - tor_assert(enc_key); - tor_assert(cell_out); - - memwipe(cell_out, 0, RELAY_PAYLOAD_SIZE); - - cell_len = rend_service_encode_establish_intro_cell((char*)cell_out, - RELAY_PAYLOAD_SIZE, - enc_key, circ_nonce); - return cell_len; -} - -/* Parse an INTRODUCE2 cell from payload of size payload_len for the given - * service and circuit which are used only for logging purposes. The resulting - * parsed cell is put in cell_ptr_out. - * - * This function only parses prop224 INTRODUCE2 cells even when the intro point - * is a legacy intro point. That's because intro points don't actually care - * about the contents of the introduce cell. Legacy INTRODUCE cells are only - * used by the legacy system now. - * - * Return 0 on success else a negative value and cell_ptr_out is untouched. */ -static int -parse_introduce2_cell(const hs_service_t *service, - const origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len, - trn_cell_introduce1_t **cell_ptr_out) -{ - trn_cell_introduce1_t *cell = NULL; - - tor_assert(service); - tor_assert(circ); - tor_assert(payload); - tor_assert(cell_ptr_out); - - /* Parse the cell so we can start cell validation. */ - if (trn_cell_introduce1_parse(&cell, payload, payload_len) < 0) { - log_info(LD_PROTOCOL, "Unable to parse INTRODUCE2 cell on circuit %u " - "for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - - /* Success. */ - *cell_ptr_out = cell; - return 0; - err: - return -1; -} - -/* Set the onion public key onion_pk in cell, the encrypted section of an - * INTRODUCE1 cell. */ -static void -introduce1_set_encrypted_onion_key(trn_cell_introduce_encrypted_t *cell, - const uint8_t *onion_pk) -{ - tor_assert(cell); - tor_assert(onion_pk); - /* There is only one possible key type for a non legacy cell. */ - trn_cell_introduce_encrypted_set_onion_key_type(cell, - HS_CELL_ONION_KEY_TYPE_NTOR); - trn_cell_introduce_encrypted_set_onion_key_len(cell, CURVE25519_PUBKEY_LEN); - trn_cell_introduce_encrypted_setlen_onion_key(cell, CURVE25519_PUBKEY_LEN); - memcpy(trn_cell_introduce_encrypted_getarray_onion_key(cell), onion_pk, - trn_cell_introduce_encrypted_getlen_onion_key(cell)); -} - -/* Set the link specifiers in lspecs in cell, the encrypted section of an - * INTRODUCE1 cell. */ -static void -introduce1_set_encrypted_link_spec(trn_cell_introduce_encrypted_t *cell, - const smartlist_t *lspecs) -{ - tor_assert(cell); - tor_assert(lspecs); - tor_assert(smartlist_len(lspecs) > 0); - tor_assert(smartlist_len(lspecs) <= UINT8_MAX); - - uint8_t lspecs_num = (uint8_t) smartlist_len(lspecs); - trn_cell_introduce_encrypted_set_nspec(cell, lspecs_num); - /* We aren't duplicating the link specifiers object here which means that - * the ownership goes to the trn_cell_introduce_encrypted_t cell and those - * object will be freed when the cell is. */ - SMARTLIST_FOREACH(lspecs, link_specifier_t *, ls, - trn_cell_introduce_encrypted_add_nspecs(cell, ls)); -} - -/* Set padding in the enc_cell only if needed that is the total length of both - * sections are below the mininum required for an INTRODUCE1 cell. */ -static void -introduce1_set_encrypted_padding(const trn_cell_introduce1_t *cell, - trn_cell_introduce_encrypted_t *enc_cell) -{ - tor_assert(cell); - tor_assert(enc_cell); - /* This is the length we expect to have once encoded of the whole cell. */ - ssize_t full_len = trn_cell_introduce1_encoded_len(cell) + - trn_cell_introduce_encrypted_encoded_len(enc_cell); - tor_assert(full_len > 0); - if (full_len < HS_CELL_INTRODUCE1_MIN_SIZE) { - size_t padding = HS_CELL_INTRODUCE1_MIN_SIZE - full_len; - trn_cell_introduce_encrypted_setlen_pad(enc_cell, padding); - memset(trn_cell_introduce_encrypted_getarray_pad(enc_cell), 0, - trn_cell_introduce_encrypted_getlen_pad(enc_cell)); - } -} - -/* Encrypt the ENCRYPTED payload and encode it in the cell using the enc_cell - * and the INTRODUCE1 data. - * - * This can't fail but it is very important that the caller sets every field - * in data so the computation of the INTRODUCE1 keys doesn't fail. */ -static void -introduce1_encrypt_and_encode(trn_cell_introduce1_t *cell, - const trn_cell_introduce_encrypted_t *enc_cell, - const hs_cell_introduce1_data_t *data) -{ - size_t offset = 0; - ssize_t encrypted_len; - ssize_t encoded_cell_len, encoded_enc_cell_len; - uint8_t encoded_cell[RELAY_PAYLOAD_SIZE] = {0}; - uint8_t encoded_enc_cell[RELAY_PAYLOAD_SIZE] = {0}; - uint8_t *encrypted = NULL; - uint8_t mac[DIGEST256_LEN]; - crypto_cipher_t *cipher = NULL; - hs_ntor_intro_cell_keys_t keys; - - tor_assert(cell); - tor_assert(enc_cell); - tor_assert(data); - - /* Encode the cells up to now of what we have to we can perform the MAC - * computation on it. */ - encoded_cell_len = trn_cell_introduce1_encode(encoded_cell, - sizeof(encoded_cell), cell); - /* We have a much more serious issue if this isn't true. */ - tor_assert(encoded_cell_len > 0); - - encoded_enc_cell_len = - trn_cell_introduce_encrypted_encode(encoded_enc_cell, - sizeof(encoded_enc_cell), enc_cell); - /* We have a much more serious issue if this isn't true. */ - tor_assert(encoded_enc_cell_len > 0); - - /* Get the key material for the encryption. */ - if (hs_ntor_client_get_introduce1_keys(data->auth_pk, data->enc_pk, - data->client_kp, - data->subcredential, &keys) < 0) { - tor_assert_unreached(); - } - - /* Prepare cipher with the encryption key just computed. */ - cipher = crypto_cipher_new_with_bits((const char *) keys.enc_key, - sizeof(keys.enc_key) * 8); - tor_assert(cipher); - - /* Compute the length of the ENCRYPTED section which is the CLIENT_PK, - * ENCRYPTED_DATA and MAC length. */ - encrypted_len = sizeof(data->client_kp->pubkey) + encoded_enc_cell_len + - sizeof(mac); - tor_assert(encrypted_len < RELAY_PAYLOAD_SIZE); - encrypted = tor_malloc_zero(encrypted_len); - - /* Put the CLIENT_PK first. */ - memcpy(encrypted, data->client_kp->pubkey.public_key, - sizeof(data->client_kp->pubkey.public_key)); - offset += sizeof(data->client_kp->pubkey.public_key); - /* Then encrypt and set the ENCRYPTED_DATA. This can't fail. */ - crypto_cipher_encrypt(cipher, (char *) encrypted + offset, - (const char *) encoded_enc_cell, encoded_enc_cell_len); - crypto_cipher_free(cipher); - offset += encoded_enc_cell_len; - /* Compute MAC from the above and put it in the buffer. This function will - * make the adjustment to the encryptled_len to ommit the MAC length. */ - compute_introduce_mac(encoded_cell, encoded_cell_len, - encrypted, encrypted_len, - keys.mac_key, sizeof(keys.mac_key), - mac, sizeof(mac)); - memcpy(encrypted + offset, mac, sizeof(mac)); - offset += sizeof(mac); - tor_assert(offset == (size_t) encrypted_len); - - /* Set the ENCRYPTED section in the cell. */ - trn_cell_introduce1_setlen_encrypted(cell, encrypted_len); - memcpy(trn_cell_introduce1_getarray_encrypted(cell), - encrypted, encrypted_len); - - /* Cleanup. */ - memwipe(&keys, 0, sizeof(keys)); - memwipe(mac, 0, sizeof(mac)); - memwipe(encrypted, 0, sizeof(encrypted_len)); - memwipe(encoded_enc_cell, 0, sizeof(encoded_enc_cell)); - tor_free(encrypted); -} - -/* Using the INTRODUCE1 data, setup the ENCRYPTED section in cell. This means - * set it, encrypt it and encode it. */ -static void -introduce1_set_encrypted(trn_cell_introduce1_t *cell, - const hs_cell_introduce1_data_t *data) -{ - trn_cell_introduce_encrypted_t *enc_cell; - trn_cell_extension_t *ext; - - tor_assert(cell); - tor_assert(data); - - enc_cell = trn_cell_introduce_encrypted_new(); - tor_assert(enc_cell); - - /* Set extension data. None are used. */ - ext = trn_cell_extension_new(); - tor_assert(ext); - trn_cell_extension_set_num(ext, 0); - trn_cell_introduce_encrypted_set_extensions(enc_cell, ext); - - /* Set the rendezvous cookie. */ - memcpy(trn_cell_introduce_encrypted_getarray_rend_cookie(enc_cell), - data->rendezvous_cookie, REND_COOKIE_LEN); - - /* Set the onion public key. */ - introduce1_set_encrypted_onion_key(enc_cell, data->onion_pk->public_key); - - /* Set the link specifiers. */ - introduce1_set_encrypted_link_spec(enc_cell, data->link_specifiers); - - /* Set padding. */ - introduce1_set_encrypted_padding(cell, enc_cell); - - /* Encrypt and encode it in the cell. */ - introduce1_encrypt_and_encode(cell, enc_cell, data); - - /* Cleanup. */ - trn_cell_introduce_encrypted_free(enc_cell); -} - -/* Set the authentication key in the INTRODUCE1 cell from the given data. */ -static void -introduce1_set_auth_key(trn_cell_introduce1_t *cell, - const hs_cell_introduce1_data_t *data) -{ - tor_assert(cell); - tor_assert(data); - /* There is only one possible type for a non legacy cell. */ - trn_cell_introduce1_set_auth_key_type(cell, HS_INTRO_AUTH_KEY_TYPE_ED25519); - trn_cell_introduce1_set_auth_key_len(cell, ED25519_PUBKEY_LEN); - trn_cell_introduce1_setlen_auth_key(cell, ED25519_PUBKEY_LEN); - memcpy(trn_cell_introduce1_getarray_auth_key(cell), - data->auth_pk->pubkey, trn_cell_introduce1_getlen_auth_key(cell)); -} - -/* Set the legacy ID field in the INTRODUCE1 cell from the given data. */ -static void -introduce1_set_legacy_id(trn_cell_introduce1_t *cell, - const hs_cell_introduce1_data_t *data) -{ - tor_assert(cell); - tor_assert(data); - - if (data->is_legacy) { - uint8_t digest[DIGEST_LEN]; - if (BUG(crypto_pk_get_digest(data->legacy_key, (char *) digest) < 0)) { - return; - } - memcpy(trn_cell_introduce1_getarray_legacy_key_id(cell), - digest, trn_cell_introduce1_getlen_legacy_key_id(cell)); - } else { - /* We have to zeroed the LEGACY_KEY_ID field. */ - memset(trn_cell_introduce1_getarray_legacy_key_id(cell), 0, - trn_cell_introduce1_getlen_legacy_key_id(cell)); - } -} - -/* ========== */ -/* Public API */ -/* ========== */ - -/* Build an ESTABLISH_INTRO cell with the given circuit nonce and intro point - * object. The encoded cell is put in cell_out that MUST at least be of the - * size of RELAY_PAYLOAD_SIZE. Return the encoded cell length on success else - * a negative value and cell_out is untouched. This function also supports - * legacy cell creation. */ -ssize_t -hs_cell_build_establish_intro(const char *circ_nonce, - const hs_service_intro_point_t *ip, - uint8_t *cell_out) -{ - ssize_t cell_len = -1; - uint16_t sig_len = ED25519_SIG_LEN; - trn_cell_extension_t *ext; - trn_cell_establish_intro_t *cell = NULL; - - tor_assert(circ_nonce); - tor_assert(ip); - - /* Quickly handle the legacy IP. */ - if (ip->base.is_only_legacy) { - tor_assert(ip->legacy_key); - cell_len = build_legacy_establish_intro(circ_nonce, ip->legacy_key, - cell_out); - tor_assert(cell_len <= RELAY_PAYLOAD_SIZE); - /* Success or not we are done here. */ - goto done; - } - - /* Set extension data. None used here. */ - ext = trn_cell_extension_new(); - trn_cell_extension_set_num(ext, 0); - cell = trn_cell_establish_intro_new(); - trn_cell_establish_intro_set_extensions(cell, ext); - /* Set signature size. Array is then allocated in the cell. We need to do - * this early so we can use trunnel API to get the signature length. */ - trn_cell_establish_intro_set_sig_len(cell, sig_len); - trn_cell_establish_intro_setlen_sig(cell, sig_len); - - /* Set AUTH_KEY_TYPE: 2 means ed25519 */ - trn_cell_establish_intro_set_auth_key_type(cell, - HS_INTRO_AUTH_KEY_TYPE_ED25519); - - /* Set AUTH_KEY and AUTH_KEY_LEN field. Must also set byte-length of - * AUTH_KEY to match */ - { - uint16_t auth_key_len = ED25519_PUBKEY_LEN; - trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len); - trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len); - /* We do this call _after_ setting the length because it's reallocated at - * that point only. */ - uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell); - memcpy(auth_key_ptr, ip->auth_key_kp.pubkey.pubkey, auth_key_len); - } - - /* Calculate HANDSHAKE_AUTH field (MAC). */ - { - ssize_t tmp_cell_enc_len = 0; - ssize_t tmp_cell_mac_offset = - sig_len + sizeof(cell->sig_len) + - trn_cell_establish_intro_getlen_handshake_mac(cell); - uint8_t tmp_cell_enc[RELAY_PAYLOAD_SIZE] = {0}; - uint8_t mac[TRUNNEL_SHA3_256_LEN], *handshake_ptr; - - /* We first encode the current fields we have in the cell so we can - * compute the MAC using the raw bytes. */ - tmp_cell_enc_len = trn_cell_establish_intro_encode(tmp_cell_enc, - sizeof(tmp_cell_enc), - cell); - if (BUG(tmp_cell_enc_len < 0)) { - goto done; - } - /* Sanity check. */ - tor_assert(tmp_cell_enc_len > tmp_cell_mac_offset); - - /* Circuit nonce is always DIGEST_LEN according to tor-spec.txt. */ - crypto_mac_sha3_256(mac, sizeof(mac), - (uint8_t *) circ_nonce, DIGEST_LEN, - tmp_cell_enc, tmp_cell_enc_len - tmp_cell_mac_offset); - handshake_ptr = trn_cell_establish_intro_getarray_handshake_mac(cell); - memcpy(handshake_ptr, mac, sizeof(mac)); - - memwipe(mac, 0, sizeof(mac)); - memwipe(tmp_cell_enc, 0, sizeof(tmp_cell_enc)); - } - - /* Calculate the cell signature SIG. */ - { - ssize_t tmp_cell_enc_len = 0; - ssize_t tmp_cell_sig_offset = (sig_len + sizeof(cell->sig_len)); - uint8_t tmp_cell_enc[RELAY_PAYLOAD_SIZE] = {0}, *sig_ptr; - ed25519_signature_t sig; - - /* We first encode the current fields we have in the cell so we can - * compute the signature from the raw bytes of the cell. */ - tmp_cell_enc_len = trn_cell_establish_intro_encode(tmp_cell_enc, - sizeof(tmp_cell_enc), - cell); - if (BUG(tmp_cell_enc_len < 0)) { - goto done; - } - - if (ed25519_sign_prefixed(&sig, tmp_cell_enc, - tmp_cell_enc_len - tmp_cell_sig_offset, - ESTABLISH_INTRO_SIG_PREFIX, &ip->auth_key_kp)) { - log_warn(LD_BUG, "Unable to make signature for ESTABLISH_INTRO cell."); - goto done; - } - /* Copy the signature into the cell. */ - sig_ptr = trn_cell_establish_intro_getarray_sig(cell); - memcpy(sig_ptr, sig.sig, sig_len); - - memwipe(tmp_cell_enc, 0, sizeof(tmp_cell_enc)); - } - - /* Encode the cell. Can't be bigger than a standard cell. */ - cell_len = trn_cell_establish_intro_encode(cell_out, RELAY_PAYLOAD_SIZE, - cell); - - done: - trn_cell_establish_intro_free(cell); - return cell_len; -} - -/* Parse the INTRO_ESTABLISHED cell in the payload of size payload_len. If we - * are successful at parsing it, return the length of the parsed cell else a - * negative value on error. */ -ssize_t -hs_cell_parse_intro_established(const uint8_t *payload, size_t payload_len) -{ - ssize_t ret; - trn_cell_intro_established_t *cell = NULL; - - tor_assert(payload); - - /* Try to parse the payload into a cell making sure we do actually have a - * valid cell. */ - ret = trn_cell_intro_established_parse(&cell, payload, payload_len); - if (ret >= 0) { - /* On success, we do not keep the cell, we just notify the caller that it - * was successfully parsed. */ - trn_cell_intro_established_free(cell); - } - return ret; -} - -/* Parsse the INTRODUCE2 cell using data which contains everything we need to - * do so and contains the destination buffers of information we extract and - * compute from the cell. Return 0 on success else a negative value. The - * service and circ are only used for logging purposes. */ -ssize_t -hs_cell_parse_introduce2(hs_cell_introduce2_data_t *data, - const origin_circuit_t *circ, - const hs_service_t *service) -{ - int ret = -1; - time_t elapsed; - uint8_t *decrypted = NULL; - size_t encrypted_section_len; - const uint8_t *encrypted_section; - trn_cell_introduce1_t *cell = NULL; - trn_cell_introduce_encrypted_t *enc_cell = NULL; - hs_ntor_intro_cell_keys_t *intro_keys = NULL; - - tor_assert(data); - tor_assert(circ); - tor_assert(service); - - /* Parse the cell into a decoded data structure pointed by cell_ptr. */ - if (parse_introduce2_cell(service, circ, data->payload, data->payload_len, - &cell) < 0) { - goto done; - } - - log_info(LD_REND, "Received a decodable INTRODUCE2 cell on circuit %u " - "for service %s. Decoding encrypted section...", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - - encrypted_section = trn_cell_introduce1_getconstarray_encrypted(cell); - encrypted_section_len = trn_cell_introduce1_getlen_encrypted(cell); - - /* Encrypted section must at least contain the CLIENT_PK and MAC which is - * defined in section 3.3.2 of the specification. */ - if (encrypted_section_len < (CURVE25519_PUBKEY_LEN + DIGEST256_LEN)) { - log_info(LD_REND, "Invalid INTRODUCE2 encrypted section length " - "for service %s. Dropping cell.", - safe_str_client(service->onion_address)); - goto done; - } - - /* Check our replay cache for this introduction point. */ - if (replaycache_add_test_and_elapsed(data->replay_cache, encrypted_section, - encrypted_section_len, &elapsed)) { - log_warn(LD_REND, "Possible replay detected! An INTRODUCE2 cell with the" - "same ENCRYPTED section was seen %ld seconds ago. " - "Dropping cell.", (long int) elapsed); - goto done; - } - - /* Build the key material out of the key material found in the cell. */ - intro_keys = get_introduce2_key_material(data->auth_pk, data->enc_kp, - data->subcredential, - encrypted_section, - &data->client_pk); - if (intro_keys == NULL) { - log_info(LD_REND, "Invalid INTRODUCE2 encrypted data. Unable to " - "compute key material on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto done; - } - - /* Validate MAC from the cell and our computed key material. The MAC field - * in the cell is at the end of the encrypted section. */ - { - uint8_t mac[DIGEST256_LEN]; - /* The MAC field is at the very end of the ENCRYPTED section. */ - size_t mac_offset = encrypted_section_len - sizeof(mac); - /* Compute the MAC. Use the entire encoded payload with a length up to the - * ENCRYPTED section. */ - compute_introduce_mac(data->payload, - data->payload_len - encrypted_section_len, - encrypted_section, encrypted_section_len, - intro_keys->mac_key, sizeof(intro_keys->mac_key), - mac, sizeof(mac)); - if (tor_memcmp(mac, encrypted_section + mac_offset, sizeof(mac))) { - log_info(LD_REND, "Invalid MAC validation for INTRODUCE2 cell on " - "circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto done; - } - } - - { - /* The ENCRYPTED_DATA section starts just after the CLIENT_PK. */ - const uint8_t *encrypted_data = - encrypted_section + sizeof(data->client_pk); - /* It's symmetric encryption so it's correct to use the ENCRYPTED length - * for decryption. Computes the length of ENCRYPTED_DATA meaning removing - * the CLIENT_PK and MAC length. */ - size_t encrypted_data_len = - encrypted_section_len - (sizeof(data->client_pk) + DIGEST256_LEN); - - /* This decrypts the ENCRYPTED_DATA section of the cell. */ - decrypted = decrypt_introduce2(intro_keys->enc_key, - encrypted_data, encrypted_data_len); - if (decrypted == NULL) { - log_info(LD_REND, "Unable to decrypt the ENCRYPTED section of an " - "INTRODUCE2 cell on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto done; - } - - /* Parse this blob into an encrypted cell structure so we can then extract - * the data we need out of it. */ - enc_cell = parse_introduce2_encrypted(decrypted, encrypted_data_len, - circ, service); - memwipe(decrypted, 0, encrypted_data_len); - if (enc_cell == NULL) { - goto done; - } - } - - /* XXX: Implement client authorization checks. */ - - /* Extract onion key and rendezvous cookie from the cell used for the - * rendezvous point circuit e2e encryption. */ - memcpy(data->onion_pk.public_key, - trn_cell_introduce_encrypted_getconstarray_onion_key(enc_cell), - CURVE25519_PUBKEY_LEN); - memcpy(data->rendezvous_cookie, - trn_cell_introduce_encrypted_getconstarray_rend_cookie(enc_cell), - sizeof(data->rendezvous_cookie)); - - /* Extract rendezvous link specifiers. */ - for (size_t idx = 0; - idx < trn_cell_introduce_encrypted_get_nspec(enc_cell); idx++) { - link_specifier_t *lspec = - trn_cell_introduce_encrypted_get_nspecs(enc_cell, idx); - smartlist_add(data->link_specifiers, hs_link_specifier_dup(lspec)); - } - - /* Success. */ - ret = 0; - log_info(LD_REND, "Valid INTRODUCE2 cell. Launching rendezvous circuit."); - - done: - if (intro_keys) { - memwipe(intro_keys, 0, sizeof(hs_ntor_intro_cell_keys_t)); - tor_free(intro_keys); - } - tor_free(decrypted); - trn_cell_introduce_encrypted_free(enc_cell); - trn_cell_introduce1_free(cell); - return ret; -} - -/* Build a RENDEZVOUS1 cell with the given rendezvous cookie and handshake - * info. The encoded cell is put in cell_out and the length of the data is - * returned. This can't fail. */ -ssize_t -hs_cell_build_rendezvous1(const uint8_t *rendezvous_cookie, - size_t rendezvous_cookie_len, - const uint8_t *rendezvous_handshake_info, - size_t rendezvous_handshake_info_len, - uint8_t *cell_out) -{ - ssize_t cell_len; - trn_cell_rendezvous1_t *cell; - - tor_assert(rendezvous_cookie); - tor_assert(rendezvous_handshake_info); - tor_assert(cell_out); - - cell = trn_cell_rendezvous1_new(); - /* Set the RENDEZVOUS_COOKIE. */ - memcpy(trn_cell_rendezvous1_getarray_rendezvous_cookie(cell), - rendezvous_cookie, rendezvous_cookie_len); - /* Set the HANDSHAKE_INFO. */ - trn_cell_rendezvous1_setlen_handshake_info(cell, - rendezvous_handshake_info_len); - memcpy(trn_cell_rendezvous1_getarray_handshake_info(cell), - rendezvous_handshake_info, rendezvous_handshake_info_len); - /* Encoding. */ - cell_len = trn_cell_rendezvous1_encode(cell_out, RELAY_PAYLOAD_SIZE, cell); - tor_assert(cell_len > 0); - - trn_cell_rendezvous1_free(cell); - return cell_len; -} - -/* Build an INTRODUCE1 cell from the given data. The encoded cell is put in - * cell_out which must be of at least size RELAY_PAYLOAD_SIZE. On success, the - * encoded length is returned else a negative value and the content of - * cell_out should be ignored. */ -ssize_t -hs_cell_build_introduce1(const hs_cell_introduce1_data_t *data, - uint8_t *cell_out) -{ - ssize_t cell_len; - trn_cell_introduce1_t *cell; - trn_cell_extension_t *ext; - - tor_assert(data); - tor_assert(cell_out); - - cell = trn_cell_introduce1_new(); - tor_assert(cell); - - /* Set extension data. None are used. */ - ext = trn_cell_extension_new(); - tor_assert(ext); - trn_cell_extension_set_num(ext, 0); - trn_cell_introduce1_set_extensions(cell, ext); - - /* Set the legacy ID field. */ - introduce1_set_legacy_id(cell, data); - - /* Set the authentication key. */ - introduce1_set_auth_key(cell, data); - - /* Set the encrypted section. This will set, encrypt and encode the - * ENCRYPTED section in the cell. After this, we'll be ready to encode. */ - introduce1_set_encrypted(cell, data); - - /* Final encoding. */ - cell_len = trn_cell_introduce1_encode(cell_out, RELAY_PAYLOAD_SIZE, cell); - - trn_cell_introduce1_free(cell); - return cell_len; -} - -/* Build an ESTABLISH_RENDEZVOUS cell from the given rendezvous_cookie. The - * encoded cell is put in cell_out which must be of at least - * RELAY_PAYLOAD_SIZE. On success, the encoded length is returned and the - * caller should clear up the content of the cell. - * - * This function can't fail. */ -ssize_t -hs_cell_build_establish_rendezvous(const uint8_t *rendezvous_cookie, - uint8_t *cell_out) -{ - tor_assert(rendezvous_cookie); - tor_assert(cell_out); - - memcpy(cell_out, rendezvous_cookie, HS_REND_COOKIE_LEN); - return HS_REND_COOKIE_LEN; -} - -/* Handle an INTRODUCE_ACK cell encoded in payload of length payload_len. - * Return the status code on success else a negative value if the cell as not - * decodable. */ -int -hs_cell_parse_introduce_ack(const uint8_t *payload, size_t payload_len) -{ - int ret = -1; - trn_cell_introduce_ack_t *cell = NULL; - - tor_assert(payload); - - /* If it is a legacy IP, rend-spec.txt specifies that a ACK is 0 byte and a - * NACK is 1 byte. We can't use the legacy function for this so we have to - * do a special case. */ - if (payload_len <= 1) { - if (payload_len == 0) { - ret = HS_CELL_INTRO_ACK_SUCCESS; - } else { - ret = HS_CELL_INTRO_ACK_FAILURE; - } - goto end; - } - - if (trn_cell_introduce_ack_parse(&cell, payload, payload_len) < 0) { - log_info(LD_REND, "Invalid INTRODUCE_ACK cell. Unable to parse it."); - goto end; - } - - ret = trn_cell_introduce_ack_get_status(cell); - - end: - trn_cell_introduce_ack_free(cell); - return ret; -} - -/* Handle a RENDEZVOUS2 cell encoded in payload of length payload_len. On - * success, handshake_info contains the data in the HANDSHAKE_INFO field, and - * 0 is returned. On error, a negative value is returned. */ -int -hs_cell_parse_rendezvous2(const uint8_t *payload, size_t payload_len, - uint8_t *handshake_info, size_t handshake_info_len) -{ - int ret = -1; - trn_cell_rendezvous2_t *cell = NULL; - - tor_assert(payload); - tor_assert(handshake_info); - - if (trn_cell_rendezvous2_parse(&cell, payload, payload_len) < 0) { - log_info(LD_REND, "Invalid RENDEZVOUS2 cell. Unable to parse it."); - goto end; - } - - /* Static size, we should never have an issue with this else we messed up - * our code flow. */ - tor_assert(trn_cell_rendezvous2_getlen_handshake_info(cell) == - handshake_info_len); - memcpy(handshake_info, - trn_cell_rendezvous2_getconstarray_handshake_info(cell), - handshake_info_len); - ret = 0; - - end: - trn_cell_rendezvous2_free(cell); - return ret; -} - -/* Clear the given INTRODUCE1 data structure data. */ -void -hs_cell_introduce1_data_clear(hs_cell_introduce1_data_t *data) -{ - if (data == NULL) { - return; - } - /* Object in this list have been moved to the cell object when building it - * so they've been freed earlier. We do that in order to avoid duplicating - * them leading to more memory and CPU time being used for nothing. */ - smartlist_free(data->link_specifiers); - /* The data object has no ownership of any members. */ - memwipe(data, 0, sizeof(hs_cell_introduce1_data_t)); -} - diff --git a/src/tor/src/or/hs_cell.h b/src/tor/src/or/hs_cell.h deleted file mode 100644 index 958dde4ff..000000000 --- a/src/tor/src/or/hs_cell.h +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_cell.h - * \brief Header file containing cell data for the whole HS subsytem. - **/ - -#ifndef TOR_HS_CELL_H -#define TOR_HS_CELL_H - -#include "or.h" -#include "hs_service.h" - -/* An INTRODUCE1 cell requires at least this amount of bytes (see section - * 3.2.2 of the specification). Below this value, the cell must be padded. */ -#define HS_CELL_INTRODUCE1_MIN_SIZE 246 - -/* Status code of an INTRODUCE_ACK cell. */ -typedef enum { - HS_CELL_INTRO_ACK_SUCCESS = 0x0000, /* Cell relayed to service. */ - HS_CELL_INTRO_ACK_FAILURE = 0x0001, /* Service ID not recognized */ - HS_CELL_INTRO_ACK_BADFMT = 0x0002, /* Bad message format */ - HS_CELL_INTRO_ACK_NORELAY = 0x0003, /* Can't relay cell to service */ -} hs_cell_introd_ack_status_t; - -/* Onion key type found in the INTRODUCE1 cell. */ -typedef enum { - HS_CELL_ONION_KEY_TYPE_NTOR = 1, -} hs_cell_onion_key_type_t; - -/* This data structure contains data that we need to build an INTRODUCE1 cell - * used by the INTRODUCE1 build function. */ -typedef struct hs_cell_introduce1_data_t { - /* Is this a legacy introduction point? */ - unsigned int is_legacy : 1; - /* (Legacy only) The encryption key for a legacy intro point. Only set if - * is_legacy is true. */ - const crypto_pk_t *legacy_key; - /* Introduction point authentication public key. */ - const ed25519_public_key_t *auth_pk; - /* Introduction point encryption public key. */ - const curve25519_public_key_t *enc_pk; - /* Subcredentials of the service. */ - const uint8_t *subcredential; - /* Onion public key for the ntor handshake. */ - const curve25519_public_key_t *onion_pk; - /* Rendezvous cookie. */ - const uint8_t *rendezvous_cookie; - /* Public key put before the encrypted data (CLIENT_PK). */ - const curve25519_keypair_t *client_kp; - /* Rendezvous point link specifiers. */ - smartlist_t *link_specifiers; -} hs_cell_introduce1_data_t; - -/* This data structure contains data that we need to parse an INTRODUCE2 cell - * which is used by the INTRODUCE2 cell parsing function. On a successful - * parsing, the onion_pk and rendezvous_cookie will be populated with the - * computed key material from the cell data. This structure is only used during - * INTRO2 parsing and discarded after that. */ -typedef struct hs_cell_introduce2_data_t { - /*** Immutable Section: Set on structure init. ***/ - - /* Introduction point authentication public key. Pointer owned by the - introduction point object through which we received the INTRO2 cell. */ - const ed25519_public_key_t *auth_pk; - /* Introduction point encryption keypair for the ntor handshake. Pointer - owned by the introduction point object through which we received the - INTRO2 cell*/ - const curve25519_keypair_t *enc_kp; - /* Subcredentials of the service. Pointer owned by the descriptor that owns - the introduction point through which we received the INTRO2 cell. */ - const uint8_t *subcredential; - /* Payload of the received encoded cell. */ - const uint8_t *payload; - /* Size of the payload of the received encoded cell. */ - size_t payload_len; - - /*** Mutable Section: Set upon parsing INTRODUCE2 cell. ***/ - - /* Onion public key computed using the INTRODUCE2 encrypted section. */ - curve25519_public_key_t onion_pk; - /* Rendezvous cookie taken from the INTRODUCE2 encrypted section. */ - uint8_t rendezvous_cookie[REND_COOKIE_LEN]; - /* Client public key from the INTRODUCE2 encrypted section. */ - curve25519_public_key_t client_pk; - /* Link specifiers of the rendezvous point. Contains link_specifier_t. */ - smartlist_t *link_specifiers; - /* Replay cache of the introduction point. */ - replaycache_t *replay_cache; -} hs_cell_introduce2_data_t; - -/* Build cell API. */ -ssize_t hs_cell_build_establish_intro(const char *circ_nonce, - const hs_service_intro_point_t *ip, - uint8_t *cell_out); -ssize_t hs_cell_build_rendezvous1(const uint8_t *rendezvous_cookie, - size_t rendezvous_cookie_len, - const uint8_t *rendezvous_handshake_info, - size_t rendezvous_handshake_info_len, - uint8_t *cell_out); -ssize_t hs_cell_build_introduce1(const hs_cell_introduce1_data_t *data, - uint8_t *cell_out); -ssize_t hs_cell_build_establish_rendezvous(const uint8_t *rendezvous_cookie, - uint8_t *cell_out); - -/* Parse cell API. */ -ssize_t hs_cell_parse_intro_established(const uint8_t *payload, - size_t payload_len); -ssize_t hs_cell_parse_introduce2(hs_cell_introduce2_data_t *data, - const origin_circuit_t *circ, - const hs_service_t *service); -int hs_cell_parse_introduce_ack(const uint8_t *payload, size_t payload_len); -int hs_cell_parse_rendezvous2(const uint8_t *payload, size_t payload_len, - uint8_t *handshake_info, - size_t handshake_info_len); - -/* Util API. */ -void hs_cell_introduce1_data_clear(hs_cell_introduce1_data_t *data); - -#endif /* !defined(TOR_HS_CELL_H) */ - diff --git a/src/tor/src/or/hs_circuit.c b/src/tor/src/or/hs_circuit.c deleted file mode 100644 index 95073522e..000000000 --- a/src/tor/src/or/hs_circuit.c +++ /dev/null @@ -1,1242 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_circuit.c - **/ - -#define HS_CIRCUIT_PRIVATE - -#include "or.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "nodelist.h" -#include "policies.h" -#include "relay.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" - -#include "hs_cell.h" -#include "hs_ident.h" -#include "hs_ntor.h" -#include "hs_service.h" -#include "hs_circuit.h" - -/* Trunnel. */ -#include "ed25519_cert.h" -#include "hs/cell_common.h" -#include "hs/cell_establish_intro.h" - -/* A circuit is about to become an e2e rendezvous circuit. Check - * circ_purpose and ensure that it's properly set. Return true iff - * circuit purpose is properly set, otherwise return false. */ -static int -circuit_purpose_is_correct_for_rend(unsigned int circ_purpose, - int is_service_side) -{ - if (is_service_side) { - if (circ_purpose != CIRCUIT_PURPOSE_S_CONNECT_REND) { - log_warn(LD_BUG, - "HS e2e circuit setup with wrong purpose (%d)", circ_purpose); - return 0; - } - } - - if (!is_service_side) { - if (circ_purpose != CIRCUIT_PURPOSE_C_REND_READY && - circ_purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) { - log_warn(LD_BUG, - "Client e2e circuit setup with wrong purpose (%d)", circ_purpose); - return 0; - } - } - - return 1; -} - -/* Create and return a crypt path for the final hop of a v3 prop224 rendezvous - * circuit. Initialize the crypt path crypto using the output material from the - * ntor key exchange at ntor_key_seed. - * - * If is_service_side is set, we are the hidden service and the final - * hop of the rendezvous circuit is the client on the other side. */ -static crypt_path_t * -create_rend_cpath(const uint8_t *ntor_key_seed, size_t seed_len, - int is_service_side) -{ - uint8_t keys[HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN]; - crypt_path_t *cpath = NULL; - - /* Do the key expansion */ - if (hs_ntor_circuit_key_expansion(ntor_key_seed, seed_len, - keys, sizeof(keys)) < 0) { - goto err; - } - - /* Setup the cpath */ - cpath = tor_malloc_zero(sizeof(crypt_path_t)); - cpath->magic = CRYPT_PATH_MAGIC; - - if (circuit_init_cpath_crypto(cpath, (char*)keys, sizeof(keys), - is_service_side, 1) < 0) { - tor_free(cpath); - goto err; - } - - err: - memwipe(keys, 0, sizeof(keys)); - return cpath; -} - -/* We are a v2 legacy HS client: Create and return a crypt path for the hidden - * service on the other side of the rendezvous circuit circ. Initialize - * the crypt path crypto using the body of the RENDEZVOUS1 cell at - * rend_cell_body (which must be at least DH_KEY_LEN+DIGEST_LEN bytes). - */ -static crypt_path_t * -create_rend_cpath_legacy(origin_circuit_t *circ, const uint8_t *rend_cell_body) -{ - crypt_path_t *hop = NULL; - char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; - - /* first DH_KEY_LEN bytes are g^y from the service. Finish the dh - * handshake...*/ - tor_assert(circ->build_state); - tor_assert(circ->build_state->pending_final_cpath); - hop = circ->build_state->pending_final_cpath; - - tor_assert(hop->rend_dh_handshake_state); - if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, hop->rend_dh_handshake_state, - (char*)rend_cell_body, DH_KEY_LEN, - keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { - log_warn(LD_GENERAL, "Couldn't complete DH handshake."); - goto err; - } - /* ... and set up cpath. */ - if (circuit_init_cpath_crypto(hop, - keys+DIGEST_LEN, sizeof(keys)-DIGEST_LEN, - 0, 0) < 0) - goto err; - - /* Check whether the digest is right... */ - if (tor_memneq(keys, rend_cell_body+DH_KEY_LEN, DIGEST_LEN)) { - log_warn(LD_PROTOCOL, "Incorrect digest of key material."); - goto err; - } - - /* clean up the crypto stuff we just made */ - crypto_dh_free(hop->rend_dh_handshake_state); - hop->rend_dh_handshake_state = NULL; - - goto done; - - err: - hop = NULL; - - done: - memwipe(keys, 0, sizeof(keys)); - return hop; -} - -/* Append the final hop to the cpath of the rend circ, and mark - * circ ready for use to transfer HS relay cells. */ -static void -finalize_rend_circuit(origin_circuit_t *circ, crypt_path_t *hop, - int is_service_side) -{ - tor_assert(circ); - tor_assert(hop); - - /* Notify the circuit state machine that we are splicing this circuit */ - int new_circ_purpose = is_service_side ? - CIRCUIT_PURPOSE_S_REND_JOINED : CIRCUIT_PURPOSE_C_REND_JOINED; - circuit_change_purpose(TO_CIRCUIT(circ), new_circ_purpose); - - /* All is well. Extend the circuit. */ - hop->state = CPATH_STATE_OPEN; - /* Set the windows to default. */ - hop->package_window = circuit_initial_package_window(); - hop->deliver_window = CIRCWINDOW_START; - - /* Now that this circuit has finished connecting to its destination, - * make sure circuit_get_open_circ_or_launch is willing to return it - * so we can actually use it. */ - circ->hs_circ_has_timed_out = 0; - - /* Append the hop to the cpath of this circuit */ - onion_append_to_cpath(&circ->cpath, hop); - - /* In legacy code, 'pending_final_cpath' points to the final hop we just - * appended to the cpath. We set the original pointer to NULL so that we - * don't double free it. */ - if (circ->build_state) { - circ->build_state->pending_final_cpath = NULL; - } - - /* Finally, mark circuit as ready to be used for client streams */ - if (!is_service_side) { - circuit_try_attaching_streams(circ); - } -} - -/* For a given circuit and a service introduction point object, register the - * intro circuit to the circuitmap. This supports legacy intro point. */ -static void -register_intro_circ(const hs_service_intro_point_t *ip, - origin_circuit_t *circ) -{ - tor_assert(ip); - tor_assert(circ); - - if (ip->base.is_only_legacy) { - uint8_t digest[DIGEST_LEN]; - if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) { - return; - } - hs_circuitmap_register_intro_circ_v2_service_side(circ, digest); - } else { - hs_circuitmap_register_intro_circ_v3_service_side(circ, - &ip->auth_key_kp.pubkey); - } -} - -/* Return the number of opened introduction circuit for the given circuit that - * is matching its identity key. */ -static unsigned int -count_opened_desc_intro_point_circuits(const hs_service_t *service, - const hs_service_descriptor_t *desc) -{ - unsigned int count = 0; - - tor_assert(service); - tor_assert(desc); - - DIGEST256MAP_FOREACH(desc->intro_points.map, key, - const hs_service_intro_point_t *, ip) { - const circuit_t *circ; - const origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip); - if (ocirc == NULL) { - continue; - } - circ = TO_CIRCUIT(ocirc); - tor_assert(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_S_INTRO); - /* Having a circuit not for the requested service is really bad. */ - tor_assert(ed25519_pubkey_eq(&service->keys.identity_pk, - ô->hs_ident->identity_pk)); - /* Only count opened circuit and skip circuit that will be closed. */ - if (!circ->marked_for_close && circ->state == CIRCUIT_STATE_OPEN) { - count++; - } - } DIGEST256MAP_FOREACH_END; - return count; -} - -/* From a given service, rendezvous cookie and handshake info, create a - * rendezvous point circuit identifier. This can't fail. */ -STATIC hs_ident_circuit_t * -create_rp_circuit_identifier(const hs_service_t *service, - const uint8_t *rendezvous_cookie, - const curve25519_public_key_t *server_pk, - const hs_ntor_rend_cell_keys_t *keys) -{ - hs_ident_circuit_t *ident; - uint8_t handshake_info[CURVE25519_PUBKEY_LEN + DIGEST256_LEN]; - - tor_assert(service); - tor_assert(rendezvous_cookie); - tor_assert(server_pk); - tor_assert(keys); - - ident = hs_ident_circuit_new(&service->keys.identity_pk, - HS_IDENT_CIRCUIT_RENDEZVOUS); - /* Copy the RENDEZVOUS_COOKIE which is the unique identifier. */ - memcpy(ident->rendezvous_cookie, rendezvous_cookie, - sizeof(ident->rendezvous_cookie)); - /* Build the HANDSHAKE_INFO which looks like this: - * SERVER_PK [32 bytes] - * AUTH_INPUT_MAC [32 bytes] - */ - memcpy(handshake_info, server_pk->public_key, CURVE25519_PUBKEY_LEN); - memcpy(handshake_info + CURVE25519_PUBKEY_LEN, keys->rend_cell_auth_mac, - DIGEST256_LEN); - tor_assert(sizeof(ident->rendezvous_handshake_info) == - sizeof(handshake_info)); - memcpy(ident->rendezvous_handshake_info, handshake_info, - sizeof(ident->rendezvous_handshake_info)); - /* Finally copy the NTOR_KEY_SEED for e2e encryption on the circuit. */ - tor_assert(sizeof(ident->rendezvous_ntor_key_seed) == - sizeof(keys->ntor_key_seed)); - memcpy(ident->rendezvous_ntor_key_seed, keys->ntor_key_seed, - sizeof(ident->rendezvous_ntor_key_seed)); - return ident; -} - -/* From a given service and service intro point, create an introduction point - * circuit identifier. This can't fail. */ -static hs_ident_circuit_t * -create_intro_circuit_identifier(const hs_service_t *service, - const hs_service_intro_point_t *ip) -{ - hs_ident_circuit_t *ident; - - tor_assert(service); - tor_assert(ip); - - ident = hs_ident_circuit_new(&service->keys.identity_pk, - HS_IDENT_CIRCUIT_INTRO); - ed25519_pubkey_copy(&ident->intro_auth_pk, &ip->auth_key_kp.pubkey); - - return ident; -} - -/* For a given introduction point and an introduction circuit, send the - * ESTABLISH_INTRO cell. The service object is used for logging. This can fail - * and if so, the circuit is closed and the intro point object is flagged - * that the circuit is not established anymore which is important for the - * retry mechanism. */ -static void -send_establish_intro(const hs_service_t *service, - hs_service_intro_point_t *ip, origin_circuit_t *circ) -{ - ssize_t cell_len; - uint8_t payload[RELAY_PAYLOAD_SIZE]; - - tor_assert(service); - tor_assert(ip); - tor_assert(circ); - - /* Encode establish intro cell. */ - cell_len = hs_cell_build_establish_intro(circ->cpath->prev->rend_circ_nonce, - ip, payload); - if (cell_len < 0) { - log_warn(LD_REND, "Unable to encode ESTABLISH_INTRO cell for service %s " - "on circuit %u. Closing circuit.", - safe_str_client(service->onion_address), - TO_CIRCUIT(circ)->n_circ_id); - goto err; - } - - /* Send the cell on the circuit. */ - if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), - RELAY_COMMAND_ESTABLISH_INTRO, - (char *) payload, cell_len, - circ->cpath->prev) < 0) { - log_info(LD_REND, "Unable to send ESTABLISH_INTRO cell for service %s " - "on circuit %u.", - safe_str_client(service->onion_address), - TO_CIRCUIT(circ)->n_circ_id); - /* On error, the circuit has been closed. */ - goto done; - } - - /* Record the attempt to use this circuit. */ - pathbias_count_use_attempt(circ); - goto done; - - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - done: - memwipe(payload, 0, sizeof(payload)); -} - -/* Return a string constant describing the anonymity of service. */ -static const char * -get_service_anonymity_string(const hs_service_t *service) -{ - if (service->config.is_single_onion) { - return "single onion"; - } else { - return "hidden"; - } -} - -/* For a given service, the ntor onion key and a rendezvous cookie, launch a - * circuit to the rendezvous point specified by the link specifiers. On - * success, a circuit identifier is attached to the circuit with the needed - * data. This function will try to open a circuit for a maximum value of - * MAX_REND_FAILURES then it will give up. */ -static void -launch_rendezvous_point_circuit(const hs_service_t *service, - const hs_service_intro_point_t *ip, - const hs_cell_introduce2_data_t *data) -{ - int circ_needs_uptime; - time_t now = time(NULL); - extend_info_t *info = NULL; - origin_circuit_t *circ; - - tor_assert(service); - tor_assert(ip); - tor_assert(data); - - circ_needs_uptime = hs_service_requires_uptime_circ(service->config.ports); - - /* Get the extend info data structure for the chosen rendezvous point - * specified by the given link specifiers. */ - info = hs_get_extend_info_from_lspecs(data->link_specifiers, - &data->onion_pk, - service->config.is_single_onion); - if (info == NULL) { - /* We are done here, we can't extend to the rendezvous point. - * If you're running an IPv6-only v3 single onion service on 0.3.2 or with - * 0.3.2 clients, and somehow disable the option check, it will fail here. - */ - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Not enough info to open a circuit to a rendezvous point for " - "%s service %s.", - get_service_anonymity_string(service), - safe_str_client(service->onion_address)); - goto end; - } - - for (int i = 0; i < MAX_REND_FAILURES; i++) { - int circ_flags = CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_IS_INTERNAL; - if (circ_needs_uptime) { - circ_flags |= CIRCLAUNCH_NEED_UPTIME; - } - /* Firewall and policies are checked when getting the extend info. */ - if (service->config.is_single_onion) { - circ_flags |= CIRCLAUNCH_ONEHOP_TUNNEL; - } - - circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, info, - circ_flags); - if (circ != NULL) { - /* Stop retrying, we have a circuit! */ - break; - } - } - if (circ == NULL) { - log_warn(LD_REND, "Giving up on launching a rendezvous circuit to %s " - "for %s service %s", - safe_str_client(extend_info_describe(info)), - get_service_anonymity_string(service), - safe_str_client(service->onion_address)); - goto end; - } - log_info(LD_REND, "Rendezvous circuit launched to %s with cookie %s " - "for %s service %s", - safe_str_client(extend_info_describe(info)), - safe_str_client(hex_str((const char *) data->rendezvous_cookie, - REND_COOKIE_LEN)), - get_service_anonymity_string(service), - safe_str_client(service->onion_address)); - tor_assert(circ->build_state); - /* Rendezvous circuit have a specific timeout for the time spent on trying - * to connect to the rendezvous point. */ - circ->build_state->expiry_time = now + MAX_REND_TIMEOUT; - - /* Create circuit identifier and key material. */ - { - hs_ntor_rend_cell_keys_t keys; - curve25519_keypair_t ephemeral_kp; - /* No need for extra strong, this is only for this circuit life time. This - * key will be used for the RENDEZVOUS1 cell that will be sent on the - * circuit once opened. */ - curve25519_keypair_generate(&ephemeral_kp, 0); - if (hs_ntor_service_get_rendezvous1_keys(&ip->auth_key_kp.pubkey, - &ip->enc_key_kp, - &ephemeral_kp, &data->client_pk, - &keys) < 0) { - /* This should not really happened but just in case, don't make tor - * freak out, close the circuit and move on. */ - log_info(LD_REND, "Unable to get RENDEZVOUS1 key material for " - "service %s", - safe_str_client(service->onion_address)); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - goto end; - } - circ->hs_ident = create_rp_circuit_identifier(service, - data->rendezvous_cookie, - &ephemeral_kp.pubkey, &keys); - memwipe(&ephemeral_kp, 0, sizeof(ephemeral_kp)); - memwipe(&keys, 0, sizeof(keys)); - tor_assert(circ->hs_ident); - } - - end: - extend_info_free(info); -} - -/* Return true iff the given service rendezvous circuit circ is allowed for a - * relaunch to the rendezvous point. */ -static int -can_relaunch_service_rendezvous_point(const origin_circuit_t *circ) -{ - tor_assert(circ); - /* This is initialized when allocating an origin circuit. */ - tor_assert(circ->build_state); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - - /* XXX: Retrying under certain condition. This is related to #22455. */ - - /* Avoid to relaunch twice a circuit to the same rendezvous point at the - * same time. */ - if (circ->hs_service_side_rend_circ_has_been_relaunched) { - log_info(LD_REND, "Rendezvous circuit to %s has already been retried. " - "Skipping retry.", - safe_str_client( - extend_info_describe(circ->build_state->chosen_exit))); - goto disallow; - } - - /* A failure count that has reached maximum allowed or circuit that expired, - * we skip relaunching. */ - if (circ->build_state->failure_count > MAX_REND_FAILURES || - circ->build_state->expiry_time <= time(NULL)) { - log_info(LD_REND, "Attempt to build a rendezvous circuit to %s has " - "failed with %d attempts and expiry time %ld. " - "Giving up building.", - safe_str_client( - extend_info_describe(circ->build_state->chosen_exit)), - circ->build_state->failure_count, - (long int) circ->build_state->expiry_time); - goto disallow; - } - - /* Allowed to relaunch. */ - return 1; - disallow: - return 0; -} - -/* Retry the rendezvous point of circ by launching a new circuit to it. */ -static void -retry_service_rendezvous_point(const origin_circuit_t *circ) -{ - int flags = 0; - origin_circuit_t *new_circ; - cpath_build_state_t *bstate; - - tor_assert(circ); - /* This is initialized when allocating an origin circuit. */ - tor_assert(circ->build_state); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - - /* Ease our life. */ - bstate = circ->build_state; - - log_info(LD_REND, "Retrying rendezvous point circuit to %s", - safe_str_client(extend_info_describe(bstate->chosen_exit))); - - /* Get the current build state flags for the next circuit. */ - flags |= (bstate->need_uptime) ? CIRCLAUNCH_NEED_UPTIME : 0; - flags |= (bstate->need_capacity) ? CIRCLAUNCH_NEED_CAPACITY : 0; - flags |= (bstate->is_internal) ? CIRCLAUNCH_IS_INTERNAL : 0; - - /* We do NOT add the onehop tunnel flag even though it might be a single - * onion service. The reason is that if we failed once to connect to the RP - * with a direct connection, we consider that chances are that we will fail - * again so try a 3-hop circuit and hope for the best. Because the service - * has no anonymity (single onion), this change of behavior won't affect - * security directly. */ - - new_circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, - bstate->chosen_exit, flags); - if (new_circ == NULL) { - log_warn(LD_REND, "Failed to launch rendezvous circuit to %s", - safe_str_client(extend_info_describe(bstate->chosen_exit))); - goto done; - } - - /* Transfer build state information to the new circuit state in part to - * catch any other failures. */ - new_circ->build_state->failure_count = bstate->failure_count++; - new_circ->build_state->expiry_time = bstate->expiry_time; - new_circ->hs_ident = hs_ident_circuit_dup(circ->hs_ident); - - done: - return; -} - -/* Add all possible link specifiers in node to lspecs. - * legacy ID is mandatory thus MUST be present in node. If the primary address - * is not IPv4, log a BUG() warning, and return an empty smartlist. - * Includes ed25519 id and IPv6 link specifiers if present in the node. */ -static void -get_lspecs_from_node(const node_t *node, smartlist_t *lspecs) -{ - link_specifier_t *ls; - tor_addr_port_t ap; - - tor_assert(node); - tor_assert(lspecs); - - /* Get the relay's IPv4 address. */ - node_get_prim_orport(node, &ap); - - /* We expect the node's primary address to be a valid IPv4 address. - * This conforms to the protocol, which requires either an IPv4 or IPv6 - * address (or both). */ - if (BUG(!tor_addr_is_v4(&ap.addr)) || - BUG(!tor_addr_port_is_valid_ap(&ap, 0))) { - return; - } - - ls = link_specifier_new(); - link_specifier_set_ls_type(ls, LS_IPV4); - link_specifier_set_un_ipv4_addr(ls, tor_addr_to_ipv4h(&ap.addr)); - link_specifier_set_un_ipv4_port(ls, ap.port); - /* Four bytes IPv4 and two bytes port. */ - link_specifier_set_ls_len(ls, sizeof(ap.addr.addr.in_addr) + - sizeof(ap.port)); - smartlist_add(lspecs, ls); - - /* Legacy ID is mandatory and will always be present in node. */ - ls = link_specifier_new(); - link_specifier_set_ls_type(ls, LS_LEGACY_ID); - memcpy(link_specifier_getarray_un_legacy_id(ls), node->identity, - link_specifier_getlen_un_legacy_id(ls)); - link_specifier_set_ls_len(ls, link_specifier_getlen_un_legacy_id(ls)); - smartlist_add(lspecs, ls); - - /* ed25519 ID is only included if the node has it. */ - if (!ed25519_public_key_is_zero(&node->ed25519_id)) { - ls = link_specifier_new(); - link_specifier_set_ls_type(ls, LS_ED25519_ID); - memcpy(link_specifier_getarray_un_ed25519_id(ls), &node->ed25519_id, - link_specifier_getlen_un_ed25519_id(ls)); - link_specifier_set_ls_len(ls, link_specifier_getlen_un_ed25519_id(ls)); - smartlist_add(lspecs, ls); - } - - /* Check for IPv6. If so, include it as well. */ - if (node_has_ipv6_orport(node)) { - ls = link_specifier_new(); - node_get_pref_ipv6_orport(node, &ap); - link_specifier_set_ls_type(ls, LS_IPV6); - size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls); - const uint8_t *in6_addr = tor_addr_to_in6_addr8(&ap.addr); - uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls); - memcpy(ipv6_array, in6_addr, addr_len); - link_specifier_set_un_ipv6_port(ls, ap.port); - /* Sixteen bytes IPv6 and two bytes port. */ - link_specifier_set_ls_len(ls, addr_len + sizeof(ap.port)); - smartlist_add(lspecs, ls); - } -} - -/* Using the given descriptor intro point ip, the node of the - * rendezvous point rp_node and the service's subcredential, populate the - * already allocated intro1_data object with the needed key material and link - * specifiers. - * - * If rp_node has an invalid primary address, intro1_data->link_specifiers - * will be an empty list. Otherwise, this function can't fail. The ip - * MUST be a valid object containing the needed keys and authentication - * method. */ -static void -setup_introduce1_data(const hs_desc_intro_point_t *ip, - const node_t *rp_node, - const uint8_t *subcredential, - hs_cell_introduce1_data_t *intro1_data) -{ - smartlist_t *rp_lspecs; - - tor_assert(ip); - tor_assert(rp_node); - tor_assert(subcredential); - tor_assert(intro1_data); - - /* Build the link specifiers from the extend information of the rendezvous - * circuit that we've picked previously. */ - rp_lspecs = smartlist_new(); - get_lspecs_from_node(rp_node, rp_lspecs); - - /* Populate the introduce1 data object. */ - memset(intro1_data, 0, sizeof(hs_cell_introduce1_data_t)); - if (ip->legacy.key != NULL) { - intro1_data->is_legacy = 1; - intro1_data->legacy_key = ip->legacy.key; - } - intro1_data->auth_pk = &ip->auth_key_cert->signed_key; - intro1_data->enc_pk = &ip->enc_key; - intro1_data->subcredential = subcredential; - intro1_data->onion_pk = node_get_curve25519_onion_key(rp_node); - intro1_data->link_specifiers = rp_lspecs; -} - -/* ========== */ -/* Public API */ -/* ========== */ - -/* Return an introduction point circuit matching the given intro point object. - * NULL is returned is no such circuit can be found. */ -origin_circuit_t * -hs_circ_service_get_intro_circ(const hs_service_intro_point_t *ip) -{ - origin_circuit_t *circ = NULL; - - tor_assert(ip); - - if (ip->base.is_only_legacy) { - uint8_t digest[DIGEST_LEN]; - if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) { - goto end; - } - circ = hs_circuitmap_get_intro_circ_v2_service_side(digest); - } else { - circ = hs_circuitmap_get_intro_circ_v3_service_side( - &ip->auth_key_kp.pubkey); - } - end: - return circ; -} - -/* Called when we fail building a rendezvous circuit at some point other than - * the last hop: launches a new circuit to the same rendezvous point. This - * supports legacy service. - * - * We currently relaunch connections to rendezvous points if: - * - A rendezvous circuit timed out before connecting to RP. - * - The redenzvous circuit failed to connect to the RP. - * - * We avoid relaunching a connection to this rendezvous point if: - * - We have already tried MAX_REND_FAILURES times to connect to this RP. - * - We've been trying to connect to this RP for more than MAX_REND_TIMEOUT - * seconds - * - We've already retried this specific rendezvous circuit. - */ -void -hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ) -{ - tor_assert(circ); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - - /* Check if we are allowed to relaunch to the rendezvous point of circ. */ - if (!can_relaunch_service_rendezvous_point(circ)) { - goto done; - } - - /* Flag the circuit that we are relaunching so to avoid to relaunch twice a - * circuit to the same rendezvous point at the same time. */ - circ->hs_service_side_rend_circ_has_been_relaunched = 1; - - /* Legacy service don't have an hidden service ident. */ - if (circ->hs_ident) { - retry_service_rendezvous_point(circ); - } else { - rend_service_relaunch_rendezvous(circ); - } - - done: - return; -} - -/* For a given service and a service intro point, launch a circuit to the - * extend info ei. If the service is a single onion, a one-hop circuit will be - * requested. Return 0 if the circuit was successfully launched and tagged - * with the correct identifier. On error, a negative value is returned. */ -int -hs_circ_launch_intro_point(hs_service_t *service, - const hs_service_intro_point_t *ip, - extend_info_t *ei) -{ - /* Standard flags for introduction circuit. */ - int ret = -1, circ_flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - origin_circuit_t *circ; - - tor_assert(service); - tor_assert(ip); - tor_assert(ei); - - /* Update circuit flags in case of a single onion service that requires a - * direct connection. */ - if (service->config.is_single_onion) { - circ_flags |= CIRCLAUNCH_ONEHOP_TUNNEL; - } - - log_info(LD_REND, "Launching a circuit to intro point %s for service %s.", - safe_str_client(extend_info_describe(ei)), - safe_str_client(service->onion_address)); - - /* Note down the launch for the retry period. Even if the circuit fails to - * be launched, we still want to respect the retry period to avoid stress on - * the circuit subsystem. */ - service->state.num_intro_circ_launched++; - circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, - ei, circ_flags); - if (circ == NULL) { - goto end; - } - - /* Setup the circuit identifier and attach it to it. */ - circ->hs_ident = create_intro_circuit_identifier(service, ip); - tor_assert(circ->hs_ident); - /* Register circuit in the global circuitmap. */ - register_intro_circ(ip, circ); - - /* Success. */ - ret = 0; - end: - return ret; -} - -/* Called when a service introduction point circuit is done building. Given - * the service and intro point object, this function will send the - * ESTABLISH_INTRO cell on the circuit. Return 0 on success. Return 1 if the - * circuit has been repurposed to General because we already have too many - * opened. */ -int -hs_circ_service_intro_has_opened(hs_service_t *service, - hs_service_intro_point_t *ip, - const hs_service_descriptor_t *desc, - origin_circuit_t *circ) -{ - int ret = 0; - unsigned int num_intro_circ, num_needed_circ; - - tor_assert(service); - tor_assert(ip); - tor_assert(desc); - tor_assert(circ); - - /* Cound opened circuits that have sent ESTABLISH_INTRO cells or are already - * established introduction circuits */ - num_intro_circ = count_opened_desc_intro_point_circuits(service, desc); - num_needed_circ = service->config.num_intro_points; - if (num_intro_circ > num_needed_circ) { - /* There are too many opened valid intro circuit for what the service - * needs so repurpose this one. */ - - /* XXX: Legacy code checks options->ExcludeNodes and if not NULL it just - * closes the circuit. I have NO idea why it does that so it hasn't been - * added here. I can only assume in case our ExcludeNodes list changes but - * in that case, all circuit are flagged unusable (config.c). --dgoulet */ - - log_info(LD_CIRC | LD_REND, "Introduction circuit just opened but we " - "have enough for service %s. Repurposing " - "it to general and leaving internal.", - safe_str_client(service->onion_address)); - tor_assert(circ->build_state->is_internal); - /* Remove it from the circuitmap. */ - hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); - /* Cleaning up the hidden service identifier and repurpose. */ - hs_ident_circuit_free(circ->hs_ident); - circ->hs_ident = NULL; - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_GENERAL); - /* Inform that this circuit just opened for this new purpose. */ - circuit_has_opened(circ); - /* This return value indicate to the caller that the IP object should be - * removed from the service because it's corresponding circuit has just - * been repurposed. */ - ret = 1; - goto done; - } - - log_info(LD_REND, "Introduction circuit %u established for service %s.", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - circuit_log_path(LOG_INFO, LD_REND, circ); - - /* Time to send an ESTABLISH_INTRO cell on this circuit. On error, this call - * makes sure the circuit gets closed. */ - send_establish_intro(service, ip, circ); - - done: - return ret; -} - -/* Called when a service rendezvous point circuit is done building. Given the - * service and the circuit, this function will send a RENDEZVOUS1 cell on the - * circuit using the information in the circuit identifier. If the cell can't - * be sent, the circuit is closed. */ -void -hs_circ_service_rp_has_opened(const hs_service_t *service, - origin_circuit_t *circ) -{ - size_t payload_len; - uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; - - tor_assert(service); - tor_assert(circ); - tor_assert(circ->hs_ident); - - /* Some useful logging. */ - log_info(LD_REND, "Rendezvous circuit %u has opened with cookie %s " - "for service %s", - TO_CIRCUIT(circ)->n_circ_id, - hex_str((const char *) circ->hs_ident->rendezvous_cookie, - REND_COOKIE_LEN), - safe_str_client(service->onion_address)); - circuit_log_path(LOG_INFO, LD_REND, circ); - - /* This can't fail. */ - payload_len = hs_cell_build_rendezvous1( - circ->hs_ident->rendezvous_cookie, - sizeof(circ->hs_ident->rendezvous_cookie), - circ->hs_ident->rendezvous_handshake_info, - sizeof(circ->hs_ident->rendezvous_handshake_info), - payload); - - /* Pad the payload with random bytes so it matches the size of a legacy cell - * which is normally always bigger. Also, the size of a legacy cell is - * always smaller than the RELAY_PAYLOAD_SIZE so this is safe. */ - if (payload_len < HS_LEGACY_RENDEZVOUS_CELL_SIZE) { - crypto_rand((char *) payload + payload_len, - HS_LEGACY_RENDEZVOUS_CELL_SIZE - payload_len); - payload_len = HS_LEGACY_RENDEZVOUS_CELL_SIZE; - } - - if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), - RELAY_COMMAND_RENDEZVOUS1, - (const char *) payload, payload_len, - circ->cpath->prev) < 0) { - /* On error, circuit is closed. */ - log_warn(LD_REND, "Unable to send RENDEZVOUS1 cell on circuit %u " - "for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto done; - } - - /* Setup end-to-end rendezvous circuit between the client and us. */ - if (hs_circuit_setup_e2e_rend_circ(circ, - circ->hs_ident->rendezvous_ntor_key_seed, - sizeof(circ->hs_ident->rendezvous_ntor_key_seed), - 1) < 0) { - log_warn(LD_GENERAL, "Failed to setup circ"); - goto done; - } - - done: - memwipe(payload, 0, sizeof(payload)); -} - -/* Circ has been expecting an INTRO_ESTABLISHED cell that just arrived. Handle - * the INTRO_ESTABLISHED cell payload of length payload_len arriving on the - * given introduction circuit circ. The service is only used for logging - * purposes. Return 0 on success else a negative value. */ -int -hs_circ_handle_intro_established(const hs_service_t *service, - const hs_service_intro_point_t *ip, - origin_circuit_t *circ, - const uint8_t *payload, size_t payload_len) -{ - int ret = -1; - - tor_assert(service); - tor_assert(ip); - tor_assert(circ); - tor_assert(payload); - - if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)) { - goto done; - } - - /* Try to parse the payload into a cell making sure we do actually have a - * valid cell. For a legacy node, it's an empty payload so as long as we - * have the cell, we are good. */ - if (!ip->base.is_only_legacy && - hs_cell_parse_intro_established(payload, payload_len) < 0) { - log_warn(LD_REND, "Unable to parse the INTRO_ESTABLISHED cell on " - "circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto done; - } - - /* Switch the purpose to a fully working intro point. */ - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_S_INTRO); - /* Getting a valid INTRODUCE_ESTABLISHED means we've successfully used the - * circuit so update our pathbias subsystem. */ - pathbias_mark_use_success(circ); - /* Success. */ - ret = 0; - - done: - return ret; -} - -/* We just received an INTRODUCE2 cell on the established introduction circuit - * circ. Handle the INTRODUCE2 payload of size payload_len for the given - * circuit and service. This cell is associated with the intro point object ip - * and the subcredential. Return 0 on success else a negative value. */ -int -hs_circ_handle_introduce2(const hs_service_t *service, - const origin_circuit_t *circ, - hs_service_intro_point_t *ip, - const uint8_t *subcredential, - const uint8_t *payload, size_t payload_len) -{ - int ret = -1; - time_t elapsed; - hs_cell_introduce2_data_t data; - - tor_assert(service); - tor_assert(circ); - tor_assert(ip); - tor_assert(subcredential); - tor_assert(payload); - - /* Populate the data structure with everything we need for the cell to be - * parsed, decrypted and key material computed correctly. */ - data.auth_pk = &ip->auth_key_kp.pubkey; - data.enc_kp = &ip->enc_key_kp; - data.subcredential = subcredential; - data.payload = payload; - data.payload_len = payload_len; - data.link_specifiers = smartlist_new(); - data.replay_cache = ip->replay_cache; - - if (hs_cell_parse_introduce2(&data, circ, service) < 0) { - goto done; - } - - /* Check whether we've seen this REND_COOKIE before to detect repeats. */ - if (replaycache_add_test_and_elapsed( - service->state.replay_cache_rend_cookie, - data.rendezvous_cookie, sizeof(data.rendezvous_cookie), - &elapsed)) { - /* A Tor client will send a new INTRODUCE1 cell with the same REND_COOKIE - * as its previous one if its intro circ times out while in state - * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT. If we received the first - * INTRODUCE1 cell (the intro-point relay converts it into an INTRODUCE2 - * cell), we are already trying to connect to that rend point (and may - * have already succeeded); drop this cell. */ - log_info(LD_REND, "We received an INTRODUCE2 cell with same REND_COOKIE " - "field %ld seconds ago. Dropping cell.", - (long int) elapsed); - goto done; - } - - /* At this point, we just confirmed that the full INTRODUCE2 cell is valid - * so increment our counter that we've seen one on this intro point. */ - ip->introduce2_count++; - - /* Launch rendezvous circuit with the onion key and rend cookie. */ - launch_rendezvous_point_circuit(service, ip, &data); - /* Success. */ - ret = 0; - - done: - SMARTLIST_FOREACH(data.link_specifiers, link_specifier_t *, lspec, - link_specifier_free(lspec)); - smartlist_free(data.link_specifiers); - memwipe(&data, 0, sizeof(data)); - return ret; -} - -/* Circuit circ just finished the rend ntor key exchange. Use the key - * exchange output material at ntor_key_seed and setup circ to - * serve as a rendezvous end-to-end circuit between the client and the - * service. If is_service_side is set, then we are the hidden service - * and the other side is the client. - * - * Return 0 if the operation went well; in case of error return -1. */ -int -hs_circuit_setup_e2e_rend_circ(origin_circuit_t *circ, - const uint8_t *ntor_key_seed, size_t seed_len, - int is_service_side) -{ - if (BUG(!circuit_purpose_is_correct_for_rend(TO_CIRCUIT(circ)->purpose, - is_service_side))) { - return -1; - } - - crypt_path_t *hop = create_rend_cpath(ntor_key_seed, seed_len, - is_service_side); - if (!hop) { - log_warn(LD_REND, "Couldn't get v3 %s cpath!", - is_service_side ? "service-side" : "client-side"); - return -1; - } - - finalize_rend_circuit(circ, hop, is_service_side); - - return 0; -} - -/* We are a v2 legacy HS client and we just received a RENDEZVOUS1 cell - * rend_cell_body on circ. Finish up the DH key exchange and then - * extend the crypt path of circ so that the hidden service is on the - * other side. */ -int -hs_circuit_setup_e2e_rend_circ_legacy_client(origin_circuit_t *circ, - const uint8_t *rend_cell_body) -{ - - if (BUG(!circuit_purpose_is_correct_for_rend( - TO_CIRCUIT(circ)->purpose, 0))) { - return -1; - } - - crypt_path_t *hop = create_rend_cpath_legacy(circ, rend_cell_body); - if (!hop) { - log_warn(LD_GENERAL, "Couldn't get v2 cpath."); - return -1; - } - - finalize_rend_circuit(circ, hop, 0); - - return 0; -} - -/* Given the introduction circuit intro_circ, the rendezvous circuit - * rend_circ, a descriptor intro point object ip and the service's - * subcredential, send an INTRODUCE1 cell on intro_circ. - * - * This will also setup the circuit identifier on rend_circ containing the key - * material for the handshake and e2e encryption. Return 0 on success else - * negative value. Because relay_send_command_from_edge() closes the circuit - * on error, it is possible that intro_circ is closed on error. */ -int -hs_circ_send_introduce1(origin_circuit_t *intro_circ, - origin_circuit_t *rend_circ, - const hs_desc_intro_point_t *ip, - const uint8_t *subcredential) -{ - int ret = -1; - ssize_t payload_len; - uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; - hs_cell_introduce1_data_t intro1_data; - - tor_assert(intro_circ); - tor_assert(rend_circ); - tor_assert(ip); - tor_assert(subcredential); - - /* It is undefined behavior in hs_cell_introduce1_data_clear() if intro1_data - * has been declared on the stack but not initialized. Here, we set it to 0. - */ - memset(&intro1_data, 0, sizeof(hs_cell_introduce1_data_t)); - - /* This takes various objects in order to populate the introduce1 data - * object which is used to build the content of the cell. */ - const node_t *exit_node = build_state_get_exit_node(rend_circ->build_state); - if (exit_node == NULL) { - log_info(LD_REND, "Unable to get rendezvous point for circuit %u. " - "Failing.", TO_CIRCUIT(intro_circ)->n_circ_id); - goto done; - } - setup_introduce1_data(ip, exit_node, subcredential, &intro1_data); - /* If we didn't get any link specifiers, it's because our node was - * bad. */ - if (BUG(!intro1_data.link_specifiers) || - !smartlist_len(intro1_data.link_specifiers)) { - log_warn(LD_REND, "Unable to get link specifiers for INTRODUCE1 cell on " - "circuit %u.", TO_CIRCUIT(intro_circ)->n_circ_id); - goto done; - } - - /* Final step before we encode a cell, we setup the circuit identifier which - * will generate both the rendezvous cookie and client keypair for this - * connection. Those are put in the ident. */ - intro1_data.rendezvous_cookie = rend_circ->hs_ident->rendezvous_cookie; - intro1_data.client_kp = &rend_circ->hs_ident->rendezvous_client_kp; - - memcpy(intro_circ->hs_ident->rendezvous_cookie, - rend_circ->hs_ident->rendezvous_cookie, - sizeof(intro_circ->hs_ident->rendezvous_cookie)); - - /* From the introduce1 data object, this will encode the INTRODUCE1 cell - * into payload which is then ready to be sent as is. */ - payload_len = hs_cell_build_introduce1(&intro1_data, payload); - if (BUG(payload_len < 0)) { - goto done; - } - - if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(intro_circ), - RELAY_COMMAND_INTRODUCE1, - (const char *) payload, payload_len, - intro_circ->cpath->prev) < 0) { - /* On error, circuit is closed. */ - log_warn(LD_REND, "Unable to send INTRODUCE1 cell on circuit %u.", - TO_CIRCUIT(intro_circ)->n_circ_id); - goto done; - } - - /* Success. */ - ret = 0; - goto done; - - done: - hs_cell_introduce1_data_clear(&intro1_data); - memwipe(payload, 0, sizeof(payload)); - return ret; -} - -/* Send an ESTABLISH_RENDEZVOUS cell along the rendezvous circuit circ. On - * success, 0 is returned else -1 and the circuit is marked for close. */ -int -hs_circ_send_establish_rendezvous(origin_circuit_t *circ) -{ - ssize_t cell_len = 0; - uint8_t cell[RELAY_PAYLOAD_SIZE] = {0}; - - tor_assert(circ); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND); - - log_info(LD_REND, "Send an ESTABLISH_RENDEZVOUS cell on circuit %u", - TO_CIRCUIT(circ)->n_circ_id); - - /* Set timestamp_dirty, because circuit_expire_building expects it, - * and the rend cookie also means we've used the circ. */ - TO_CIRCUIT(circ)->timestamp_dirty = time(NULL); - - /* We've attempted to use this circuit. Probe it if we fail */ - pathbias_count_use_attempt(circ); - - /* Generate the RENDEZVOUS_COOKIE and place it in the identifier so we can - * complete the handshake when receiving the acknowledgement. */ - crypto_rand((char *) circ->hs_ident->rendezvous_cookie, HS_REND_COOKIE_LEN); - /* Generate the client keypair. No need to be extra strong, not long term */ - curve25519_keypair_generate(&circ->hs_ident->rendezvous_client_kp, 0); - - cell_len = - hs_cell_build_establish_rendezvous(circ->hs_ident->rendezvous_cookie, - cell); - if (BUG(cell_len < 0)) { - goto err; - } - - if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), - RELAY_COMMAND_ESTABLISH_RENDEZVOUS, - (const char *) cell, cell_len, - circ->cpath->prev) < 0) { - /* Circuit has been marked for close */ - log_warn(LD_REND, "Unable to send ESTABLISH_RENDEZVOUS cell on " - "circuit %u", TO_CIRCUIT(circ)->n_circ_id); - memwipe(cell, 0, cell_len); - goto err; - } - - memwipe(cell, 0, cell_len); - return 0; - err: - return -1; -} - -/* We are about to close or free this circ. Clean it up from any - * related HS data structures. This function can be called multiple times - * safely for the same circuit. */ -void -hs_circ_cleanup(circuit_t *circ) -{ - tor_assert(circ); - - /* If it's a service-side intro circ, notify the HS subsystem for the intro - * point circuit closing so it can be dealt with cleanly. */ - if (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_S_INTRO) { - hs_service_intro_circ_has_closed(TO_ORIGIN_CIRCUIT(circ)); - } - - /* Clear HS circuitmap token for this circ (if any). Very important to be - * done after the HS subsystem has been notified of the close else the - * circuit will not be found. - * - * We do this at the close if possible because from that point on, the - * circuit is good as dead. We can't rely on removing it in the circuit - * free() function because we open a race window between the close and free - * where we can't register a new circuit for the same intro point. */ - if (circ->hs_token) { - hs_circuitmap_remove_circuit(circ); - } -} - diff --git a/src/tor/src/or/hs_circuit.h b/src/tor/src/or/hs_circuit.h deleted file mode 100644 index 2f5beaa16..000000000 --- a/src/tor/src/or/hs_circuit.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_circuit.h - * \brief Header file containing circuit data for the whole HS subsytem. - **/ - -#ifndef TOR_HS_CIRCUIT_H -#define TOR_HS_CIRCUIT_H - -#include "or.h" -#include "crypto.h" -#include "crypto_ed25519.h" - -#include "hs_service.h" - -/* Cleanup function when the circuit is closed or/and freed. */ -void hs_circ_cleanup(circuit_t *circ); - -/* Circuit API. */ -int hs_circ_service_intro_has_opened(hs_service_t *service, - hs_service_intro_point_t *ip, - const hs_service_descriptor_t *desc, - origin_circuit_t *circ); -void hs_circ_service_rp_has_opened(const hs_service_t *service, - origin_circuit_t *circ); -int hs_circ_launch_intro_point(hs_service_t *service, - const hs_service_intro_point_t *ip, - extend_info_t *ei); -int hs_circ_launch_rendezvous_point(const hs_service_t *service, - const curve25519_public_key_t *onion_key, - const uint8_t *rendezvous_cookie); -void hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ); - -origin_circuit_t *hs_circ_service_get_intro_circ( - const hs_service_intro_point_t *ip); - -/* Cell API. */ -int hs_circ_handle_intro_established(const hs_service_t *service, - const hs_service_intro_point_t *ip, - origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); -int hs_circ_handle_introduce2(const hs_service_t *service, - const origin_circuit_t *circ, - hs_service_intro_point_t *ip, - const uint8_t *subcredential, - const uint8_t *payload, size_t payload_len); -int hs_circ_send_introduce1(origin_circuit_t *intro_circ, - origin_circuit_t *rend_circ, - const hs_desc_intro_point_t *ip, - const uint8_t *subcredential); -int hs_circ_send_establish_rendezvous(origin_circuit_t *circ); - -/* e2e circuit API. */ - -int hs_circuit_setup_e2e_rend_circ(origin_circuit_t *circ, - const uint8_t *ntor_key_seed, - size_t seed_len, - int is_service_side); -int hs_circuit_setup_e2e_rend_circ_legacy_client(origin_circuit_t *circ, - const uint8_t *rend_cell_body); - -#ifdef HS_CIRCUIT_PRIVATE - -STATIC hs_ident_circuit_t * -create_rp_circuit_identifier(const hs_service_t *service, - const uint8_t *rendezvous_cookie, - const curve25519_public_key_t *server_pk, - const hs_ntor_rend_cell_keys_t *keys); - -#endif /* defined(HS_CIRCUIT_PRIVATE) */ - -#endif /* !defined(TOR_HS_CIRCUIT_H) */ - diff --git a/src/tor/src/or/hs_circuitmap.c b/src/tor/src/or/hs_circuitmap.c deleted file mode 100644 index 112c8bdce..000000000 --- a/src/tor/src/or/hs_circuitmap.c +++ /dev/null @@ -1,583 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_circuitmap.c - * - * \brief Hidden service circuitmap: A hash table that maps binary tokens to - * introduction and rendezvous circuits; it's used: - * (a) by relays acting as intro points and rendezvous points - * (b) by hidden services to find intro and rend circuits and - * (c) by HS clients to find rendezvous circuits. - **/ - -#define HS_CIRCUITMAP_PRIVATE - -#include "or.h" -#include "config.h" -#include "circuitlist.h" -#include "hs_circuitmap.h" - -/************************** HS circuitmap code *******************************/ - -/* This is the hidden service circuitmap. It's a hash table that maps - introduction and rendezvous tokens to specific circuits such that given a - token it's easy to find the corresponding circuit. */ -static struct hs_circuitmap_ht *the_hs_circuitmap = NULL; - -/* This is a helper function used by the hash table code (HT_). It returns 1 if - * two circuits have the same HS token. */ -static int -hs_circuits_have_same_token(const circuit_t *first_circuit, - const circuit_t *second_circuit) -{ - const hs_token_t *first_token; - const hs_token_t *second_token; - - tor_assert(first_circuit); - tor_assert(second_circuit); - - first_token = first_circuit->hs_token; - second_token = second_circuit->hs_token; - - /* Both circs must have a token */ - if (BUG(!first_token) || BUG(!second_token)) { - return 0; - } - - if (first_token->type != second_token->type) { - return 0; - } - - if (first_token->token_len != second_token->token_len) - return 0; - - return tor_memeq(first_token->token, - second_token->token, - first_token->token_len); -} - -/* This is a helper function for the hash table code (HT_). It hashes a circuit - * HS token into an unsigned int for use as a key by the hash table routines.*/ -static inline unsigned int -hs_circuit_hash_token(const circuit_t *circuit) -{ - tor_assert(circuit->hs_token); - - return (unsigned) siphash24g(circuit->hs_token->token, - circuit->hs_token->token_len); -} - -/* Register the circuitmap hash table */ -HT_PROTOTYPE(hs_circuitmap_ht, // The name of the hashtable struct - circuit_t, // The name of the element struct, - hs_circuitmap_node, // The name of HT_ENTRY member - hs_circuit_hash_token, hs_circuits_have_same_token) - -HT_GENERATE2(hs_circuitmap_ht, circuit_t, hs_circuitmap_node, - hs_circuit_hash_token, hs_circuits_have_same_token, - 0.6, tor_reallocarray, tor_free_) - -#ifdef TOR_UNIT_TESTS - -/* Return the global HS circuitmap. Used by unittests. */ -hs_circuitmap_ht * -get_hs_circuitmap(void) -{ - return the_hs_circuitmap; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - -/****************** HS circuitmap utility functions **************************/ - -/** Return a new HS token of type type containing token. */ -static hs_token_t * -hs_token_new(hs_token_type_t type, size_t token_len, - const uint8_t *token) -{ - tor_assert(token); - - hs_token_t *hs_token = tor_malloc_zero(sizeof(hs_token_t)); - hs_token->type = type; - hs_token->token_len = token_len; - hs_token->token = tor_memdup(token, token_len); - - return hs_token; -} - -#define hs_token_free(val) \ - FREE_AND_NULL(hs_token_t, hs_token_free_, (val)) - -/** Free memory allocated by this hs_token. */ -static void -hs_token_free_(hs_token_t *hs_token) -{ - if (!hs_token) { - return; - } - - tor_free(hs_token->token); - tor_free(hs_token); -} - -/** Return the circuit from the circuitmap with token search_token. */ -static circuit_t * -get_circuit_with_token(hs_token_t *search_token) -{ - tor_assert(the_hs_circuitmap); - - /* We use a dummy circuit object for the hash table search routine. */ - circuit_t search_circ; - search_circ.hs_token = search_token; - return HT_FIND(hs_circuitmap_ht, the_hs_circuitmap, &search_circ); -} - -/* Helper function that registers circ with token on the HS - circuitmap. This function steals reference of token. */ -static void -hs_circuitmap_register_impl(circuit_t *circ, hs_token_t *token) -{ - tor_assert(circ); - tor_assert(token); - tor_assert(the_hs_circuitmap); - - /* If this circuit already has a token, clear it. */ - if (circ->hs_token) { - hs_circuitmap_remove_circuit(circ); - } - - /* Kill old circuits with the same token. We want new intro/rend circuits to - take precedence over old ones, so that HSes and clients and reestablish - killed circuits without changing the HS token. */ - { - circuit_t *found_circ; - found_circ = get_circuit_with_token(token); - if (found_circ) { - hs_circuitmap_remove_circuit(found_circ); - if (!found_circ->marked_for_close) { - circuit_mark_for_close(found_circ, END_CIRC_REASON_FINISHED); - } - } - } - - /* Register circuit and token to circuitmap. */ - circ->hs_token = token; - HT_INSERT(hs_circuitmap_ht, the_hs_circuitmap, circ); -} - -/** Helper function: Register circ of type on the HS - * circuitmap. Use the HS token as the key to the hash table. If - * token is not set, clear the circuit of any HS tokens. */ -static void -hs_circuitmap_register_circuit(circuit_t *circ, - hs_token_type_t type, size_t token_len, - const uint8_t *token) -{ - hs_token_t *hs_token = NULL; - - /* Create a new token and register it to the circuitmap */ - tor_assert(token); - hs_token = hs_token_new(type, token_len, token); - tor_assert(hs_token); - hs_circuitmap_register_impl(circ, hs_token); -} - -/* Helper function for hs_circuitmap_get_origin_circuit() and - * hs_circuitmap_get_or_circuit(). Because only circuit_t are indexed in the - * circuitmap, this function returns object type so the specialized functions - * using this helper can upcast it to the right type. - * - * Return NULL if not such circuit is found. */ -static circuit_t * -hs_circuitmap_get_circuit_impl(hs_token_type_t type, - size_t token_len, - const uint8_t *token, - uint8_t wanted_circ_purpose) -{ - circuit_t *found_circ = NULL; - - tor_assert(the_hs_circuitmap); - - /* Check the circuitmap if we have a circuit with this token */ - { - hs_token_t *search_hs_token = hs_token_new(type, token_len, token); - tor_assert(search_hs_token); - found_circ = get_circuit_with_token(search_hs_token); - hs_token_free(search_hs_token); - } - - /* Check that the circuit is useful to us */ - if (!found_circ || - found_circ->purpose != wanted_circ_purpose || - found_circ->marked_for_close) { - return NULL; - } - - return found_circ; -} - -/* Helper function: Query circuitmap for origin circuit with token of - * size token_len and type. Only returns a circuit with purpose - * equal to the wanted_circ_purpose parameter and if it is NOT marked - * for close. Return NULL if no such circuit is found. */ -static origin_circuit_t * -hs_circuitmap_get_origin_circuit(hs_token_type_t type, - size_t token_len, - const uint8_t *token, - uint8_t wanted_circ_purpose) -{ - circuit_t *circ; - tor_assert(token); - tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); - - circ = hs_circuitmap_get_circuit_impl(type, token_len, token, - wanted_circ_purpose); - if (!circ) { - return NULL; - } - - tor_assert(CIRCUIT_IS_ORIGIN(circ)); - return TO_ORIGIN_CIRCUIT(circ); -} - -/* Helper function: Query circuitmap for OR circuit with token of size - * token_len and type. Only returns a circuit with purpose equal - * to the wanted_circ_purpose parameter and if it is NOT marked for - * close. Return NULL if no such circuit is found. */ -static or_circuit_t * -hs_circuitmap_get_or_circuit(hs_token_type_t type, - size_t token_len, - const uint8_t *token, - uint8_t wanted_circ_purpose) -{ - circuit_t *circ; - tor_assert(token); - tor_assert(!CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); - - circ = hs_circuitmap_get_circuit_impl(type, token_len, token, - wanted_circ_purpose); - if (!circ) { - return NULL; - } - - tor_assert(CIRCUIT_IS_ORCIRC(circ)); - return TO_OR_CIRCUIT(circ); -} - -/************** Public circuitmap API ****************************************/ - -/**** Public relay-side getters: */ - -/* Public function: Return a v3 introduction circuit to this relay with - * auth_key. Return NULL if no such circuit is found in the - * circuitmap. */ -or_circuit_t * -hs_circuitmap_get_intro_circ_v3_relay_side( - const ed25519_public_key_t *auth_key) -{ - return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V3_RELAY_SIDE, - ED25519_PUBKEY_LEN, auth_key->pubkey, - CIRCUIT_PURPOSE_INTRO_POINT); -} - -/* Public function: Return v2 introduction circuit to this relay with - * digest. Return NULL if no such circuit is found in the circuitmap. */ -or_circuit_t * -hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest) -{ - return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V2_RELAY_SIDE, - REND_TOKEN_LEN, digest, - CIRCUIT_PURPOSE_INTRO_POINT); -} - -/* Public function: Return rendezvous circuit to this relay with rendezvous - * cookie. Return NULL if no such circuit is found in the circuitmap. */ -or_circuit_t * -hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie) -{ - return hs_circuitmap_get_or_circuit(HS_TOKEN_REND_RELAY_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_REND_POINT_WAITING); -} - -/** Public relay-side setters: */ - -/* Public function: Register rendezvous circuit with key cookie to the - * circuitmap. */ -void -hs_circuitmap_register_rend_circ_relay_side(or_circuit_t *circ, - const uint8_t *cookie) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_REND_RELAY_SIDE, - REND_TOKEN_LEN, cookie); -} -/* Public function: Register v2 intro circuit with key digest to the - * circuitmap. */ -void -hs_circuitmap_register_intro_circ_v2_relay_side(or_circuit_t *circ, - const uint8_t *digest) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_INTRO_V2_RELAY_SIDE, - REND_TOKEN_LEN, digest); -} - -/* Public function: Register v3 intro circuit with key auth_key to the - * circuitmap. */ -void -hs_circuitmap_register_intro_circ_v3_relay_side(or_circuit_t *circ, - const ed25519_public_key_t *auth_key) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_INTRO_V3_RELAY_SIDE, - ED25519_PUBKEY_LEN, auth_key->pubkey); -} - -/**** Public servide-side getters: */ - -/* Public function: Return v3 introduction circuit with auth_key - * originating from this hidden service. Return NULL if no such circuit is - * found in the circuitmap. */ -origin_circuit_t * -hs_circuitmap_get_intro_circ_v3_service_side(const - ed25519_public_key_t *auth_key) -{ - origin_circuit_t *circ = NULL; - - /* Check first for established intro circuits */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, - ED25519_PUBKEY_LEN, auth_key->pubkey, - CIRCUIT_PURPOSE_S_INTRO); - if (circ) { - return circ; - } - - /* ...if nothing found, check for pending intro circs */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, - ED25519_PUBKEY_LEN, auth_key->pubkey, - CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); - - return circ; -} - -/* Public function: Return v2 introduction circuit originating from this hidden - * service with digest. Return NULL if no such circuit is found in the - * circuitmap. */ -origin_circuit_t * -hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest) -{ - origin_circuit_t *circ = NULL; - - /* Check first for established intro circuits */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, - REND_TOKEN_LEN, digest, - CIRCUIT_PURPOSE_S_INTRO); - if (circ) { - return circ; - } - - /* ...if nothing found, check for pending intro circs */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, - REND_TOKEN_LEN, digest, - CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); - - return circ; -} - -/* Public function: Return rendezvous circuit originating from this hidden - * service with rendezvous cookie. Return NULL if no such circuit is - * found in the circuitmap. */ -origin_circuit_t * -hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie) -{ - origin_circuit_t *circ = NULL; - - /* Try to check if we have a connecting circuit. */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_S_CONNECT_REND); - if (circ) { - return circ; - } - - /* Then try for connected circuit. */ - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_S_REND_JOINED); - return circ; -} - -/* Public function: Return client-side rendezvous circuit with rendezvous - * cookie. It will look for circuits with the following purposes: - - * a) CIRCUIT_PURPOSE_C_REND_READY: Established rend circuit (received - * RENDEZVOUS_ESTABLISHED). Waiting for RENDEZVOUS2 from service, and for - * INTRODUCE_ACK from intro point. - * - * b) CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: Established rend circuit and - * introduce circuit acked. Waiting for RENDEZVOUS2 from service. - * - * c) CIRCUIT_PURPOSE_C_REND_JOINED: Established rend circuit and received - * RENDEZVOUS2 from service. - * - * d) CIRCUIT_PURPOSE_C_ESTABLISH_REND: Rend circuit open but not yet - * established. - * - * Return NULL if no such circuit is found in the circuitmap. */ -origin_circuit_t * -hs_circuitmap_get_rend_circ_client_side(const uint8_t *cookie) -{ - origin_circuit_t *circ = NULL; - - circ = hs_circuitmap_get_established_rend_circ_client_side(cookie); - if (circ) { - return circ; - } - - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_C_ESTABLISH_REND); - return circ; -} - -/* Public function: Return client-side established rendezvous circuit with - * rendezvous cookie. It will look for circuits with the following - * purposes: - * - * a) CIRCUIT_PURPOSE_C_REND_READY: Established rend circuit (received - * RENDEZVOUS_ESTABLISHED). Waiting for RENDEZVOUS2 from service, and for - * INTRODUCE_ACK from intro point. - * - * b) CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: Established rend circuit and - * introduce circuit acked. Waiting for RENDEZVOUS2 from service. - * - * c) CIRCUIT_PURPOSE_C_REND_JOINED: Established rend circuit and received - * RENDEZVOUS2 from service. - * - * Return NULL if no such circuit is found in the circuitmap. */ -origin_circuit_t * -hs_circuitmap_get_established_rend_circ_client_side(const uint8_t *cookie) -{ - origin_circuit_t *circ = NULL; - - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_C_REND_READY); - if (circ) { - return circ; - } - - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED); - if (circ) { - return circ; - } - - circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_C_REND_JOINED); - return circ; -} - -/**** Public servide-side setters: */ - -/* Public function: Register v2 intro circuit with key digest to the - * circuitmap. */ -void -hs_circuitmap_register_intro_circ_v2_service_side(origin_circuit_t *circ, - const uint8_t *digest) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_INTRO_V2_SERVICE_SIDE, - REND_TOKEN_LEN, digest); -} - -/* Public function: Register v3 intro circuit with key auth_key to the - * circuitmap. */ -void -hs_circuitmap_register_intro_circ_v3_service_side(origin_circuit_t *circ, - const ed25519_public_key_t *auth_key) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_INTRO_V3_SERVICE_SIDE, - ED25519_PUBKEY_LEN, auth_key->pubkey); -} - -/* Public function: Register rendezvous circuit with key cookie to the - * circuitmap. */ -void -hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ, - const uint8_t *cookie) -{ - hs_circuitmap_register_circuit(TO_CIRCUIT(circ), - HS_TOKEN_REND_SERVICE_SIDE, - REND_TOKEN_LEN, cookie); -} - -/* Public function: Register rendezvous circuit with key cookie to the - * client-side circuitmap. */ -void -hs_circuitmap_register_rend_circ_client_side(origin_circuit_t *or_circ, - const uint8_t *cookie) -{ - circuit_t *circ = TO_CIRCUIT(or_circ); - { /* Basic circ purpose sanity checking */ - tor_assert_nonfatal(circ->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND); - } - - hs_circuitmap_register_circuit(circ, HS_TOKEN_REND_CLIENT_SIDE, - REND_TOKEN_LEN, cookie); -} - -/**** Misc public functions: */ - -/** Public function: Remove this circuit from the HS circuitmap. Clear its HS - * token, and remove it from the hashtable. */ -void -hs_circuitmap_remove_circuit(circuit_t *circ) -{ - tor_assert(the_hs_circuitmap); - - if (!circ || !circ->hs_token) { - return; - } - - /* Remove circ from circuitmap */ - circuit_t *tmp; - tmp = HT_REMOVE(hs_circuitmap_ht, the_hs_circuitmap, circ); - /* ... and ensure the removal was successful. */ - if (tmp) { - tor_assert(tmp == circ); - } else { - log_warn(LD_BUG, "Could not find circuit (%u) in circuitmap.", - circ->n_circ_id); - } - - /* Clear token from circ */ - hs_token_free(circ->hs_token); - circ->hs_token = NULL; -} - -/* Public function: Initialize the global HS circuitmap. */ -void -hs_circuitmap_init(void) -{ - tor_assert(!the_hs_circuitmap); - - the_hs_circuitmap = tor_malloc_zero(sizeof(struct hs_circuitmap_ht)); - HT_INIT(hs_circuitmap_ht, the_hs_circuitmap); -} - -/* Public function: Free all memory allocated by the global HS circuitmap. */ -void -hs_circuitmap_free_all(void) -{ - if (the_hs_circuitmap) { - HT_CLEAR(hs_circuitmap_ht, the_hs_circuitmap); - tor_free(the_hs_circuitmap); - } -} - diff --git a/src/tor/src/or/hs_circuitmap.h b/src/tor/src/or/hs_circuitmap.h deleted file mode 100644 index 9e653480b..000000000 --- a/src/tor/src/or/hs_circuitmap.h +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_circuitmap.h - * \brief Header file for hs_circuitmap.c. - **/ - -#ifndef TOR_HS_CIRCUITMAP_H -#define TOR_HS_CIRCUITMAP_H - -typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht; - -typedef struct hs_token_s hs_token_t; -struct or_circuit_t; -struct origin_circuit_t; - -/** Public HS circuitmap API: */ - -/** Public relay-side API: */ - -struct or_circuit_t * -hs_circuitmap_get_intro_circ_v3_relay_side(const - ed25519_public_key_t *auth_key); -struct or_circuit_t * -hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest); -struct or_circuit_t * -hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie); - -void hs_circuitmap_register_rend_circ_relay_side(struct or_circuit_t *circ, - const uint8_t *cookie); -void hs_circuitmap_register_intro_circ_v2_relay_side(struct or_circuit_t *circ, - const uint8_t *digest); -void hs_circuitmap_register_intro_circ_v3_relay_side(struct or_circuit_t *circ, - const ed25519_public_key_t *auth_key); - -/** Public service-side API: */ - -struct origin_circuit_t * -hs_circuitmap_get_intro_circ_v3_service_side(const - ed25519_public_key_t *auth_key); -struct origin_circuit_t * -hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest); -struct origin_circuit_t * -hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie); -struct origin_circuit_t * -hs_circuitmap_get_rend_circ_client_side(const uint8_t *cookie); -struct origin_circuit_t * -hs_circuitmap_get_established_rend_circ_client_side(const uint8_t *cookie); - -void hs_circuitmap_register_intro_circ_v2_service_side( - struct origin_circuit_t *circ, - const uint8_t *digest); -void hs_circuitmap_register_intro_circ_v3_service_side( - struct origin_circuit_t *circ, - const ed25519_public_key_t *auth_key); -void hs_circuitmap_register_rend_circ_service_side( - struct origin_circuit_t *circ, - const uint8_t *cookie); -void hs_circuitmap_register_rend_circ_client_side( - struct origin_circuit_t *circ, - const uint8_t *cookie); - -void hs_circuitmap_remove_circuit(struct circuit_t *circ); - -void hs_circuitmap_init(void); -void hs_circuitmap_free_all(void); - -#ifdef HS_CIRCUITMAP_PRIVATE - -/** Represents the type of HS token. */ -typedef enum { - /** A rendezvous cookie on a relay (128bit)*/ - HS_TOKEN_REND_RELAY_SIDE, - /** A v2 introduction point pubkey on a relay (160bit) */ - HS_TOKEN_INTRO_V2_RELAY_SIDE, - /** A v3 introduction point pubkey on a relay (256bit) */ - HS_TOKEN_INTRO_V3_RELAY_SIDE, - - /** A rendezvous cookie on a hidden service (128bit)*/ - HS_TOKEN_REND_SERVICE_SIDE, - /** A v2 introduction point pubkey on a hidden service (160bit) */ - HS_TOKEN_INTRO_V2_SERVICE_SIDE, - /** A v3 introduction point pubkey on a hidden service (256bit) */ - HS_TOKEN_INTRO_V3_SERVICE_SIDE, - - /** A rendezvous cookie on the client side (128bit) */ - HS_TOKEN_REND_CLIENT_SIDE, -} hs_token_type_t; - -/** Represents a token used in the HS protocol. Each such token maps to a - * specific introduction or rendezvous circuit. */ -struct hs_token_s { - /* Type of HS token. */ - hs_token_type_t type; - - /* The size of the token (depends on the type). */ - size_t token_len; - - /* The token itself. Memory allocated at runtime. */ - uint8_t *token; -}; - -#endif /* defined(HS_CIRCUITMAP_PRIVATE) */ - -#ifdef TOR_UNIT_TESTS - -hs_circuitmap_ht *get_hs_circuitmap(void); - -#endif /* TOR_UNIT_TESTS */ - -#endif /* !defined(TOR_HS_CIRCUITMAP_H) */ - diff --git a/src/tor/src/or/hs_client.c b/src/tor/src/or/hs_client.c deleted file mode 100644 index c863475af..000000000 --- a/src/tor/src/or/hs_client.c +++ /dev/null @@ -1,1615 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_client.c - * \brief Implement next generation hidden service client functionality - **/ - -#define HS_CLIENT_PRIVATE - -#include "or.h" -#include "hs_circuit.h" -#include "hs_ident.h" -#include "connection_edge.h" -#include "container.h" -#include "rendclient.h" -#include "hs_descriptor.h" -#include "hs_cache.h" -#include "hs_cell.h" -#include "hs_ident.h" -#include "config.h" -#include "directory.h" -#include "hs_client.h" -#include "hs_control.h" -#include "router.h" -#include "routerset.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "connection.h" -#include "nodelist.h" -#include "circpathbias.h" -#include "connection.h" -#include "hs_ntor.h" -#include "circuitbuild.h" -#include "networkstatus.h" -#include "reasons.h" - -/* Return a human-readable string for the client fetch status code. */ -static const char * -fetch_status_to_string(hs_client_fetch_status_t status) -{ - switch (status) { - case HS_CLIENT_FETCH_ERROR: - return "Internal error"; - case HS_CLIENT_FETCH_LAUNCHED: - return "Descriptor fetch launched"; - case HS_CLIENT_FETCH_HAVE_DESC: - return "Already have descriptor"; - case HS_CLIENT_FETCH_NO_HSDIRS: - return "No more HSDir available to query"; - case HS_CLIENT_FETCH_NOT_ALLOWED: - return "Fetching descriptors is not allowed"; - case HS_CLIENT_FETCH_MISSING_INFO: - return "Missing directory information"; - case HS_CLIENT_FETCH_PENDING: - return "Pending descriptor fetch"; - default: - return "(Unknown client fetch status code)"; - } -} - -/* Return true iff tor should close the SOCKS request(s) for the descriptor - * fetch that ended up with this given status code. */ -static int -fetch_status_should_close_socks(hs_client_fetch_status_t status) -{ - switch (status) { - case HS_CLIENT_FETCH_NO_HSDIRS: - /* No more HSDir to query, we can't complete the SOCKS request(s). */ - case HS_CLIENT_FETCH_ERROR: - /* The fetch triggered an internal error. */ - case HS_CLIENT_FETCH_NOT_ALLOWED: - /* Client is not allowed to fetch (FetchHidServDescriptors 0). */ - goto close; - case HS_CLIENT_FETCH_MISSING_INFO: - case HS_CLIENT_FETCH_HAVE_DESC: - case HS_CLIENT_FETCH_PENDING: - case HS_CLIENT_FETCH_LAUNCHED: - /* The rest doesn't require tor to close the SOCKS request(s). */ - goto no_close; - } - - no_close: - return 0; - close: - return 1; -} - -/* Cancel all descriptor fetches currently in progress. */ -static void -cancel_descriptor_fetches(void) -{ - smartlist_t *conns = - connection_list_by_type_state(CONN_TYPE_DIR, DIR_PURPOSE_FETCH_HSDESC); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - const hs_ident_dir_conn_t *ident = TO_DIR_CONN(conn)->hs_ident; - if (BUG(ident == NULL)) { - /* A directory connection fetching a service descriptor can't have an - * empty hidden service identifier. */ - continue; - } - log_debug(LD_REND, "Marking for close a directory connection fetching " - "a hidden service descriptor for service %s.", - safe_str_client(ed25519_fmt(&ident->identity_pk))); - connection_mark_for_close(conn); - } SMARTLIST_FOREACH_END(conn); - - /* No ownership of the objects in this list. */ - smartlist_free(conns); - log_info(LD_REND, "Hidden service client descriptor fetches cancelled."); -} - -/* Get all connections that are waiting on a circuit and flag them back to - * waiting for a hidden service descriptor for the given service key - * service_identity_pk. */ -static void -flag_all_conn_wait_desc(const ed25519_public_key_t *service_identity_pk) -{ - tor_assert(service_identity_pk); - - smartlist_t *conns = - connection_list_by_type_state(CONN_TYPE_AP, AP_CONN_STATE_CIRCUIT_WAIT); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - edge_connection_t *edge_conn; - if (BUG(!CONN_IS_EDGE(conn))) { - continue; - } - edge_conn = TO_EDGE_CONN(conn); - if (edge_conn->hs_ident && - ed25519_pubkey_eq(&edge_conn->hs_ident->identity_pk, - service_identity_pk)) { - connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn)); - conn->state = AP_CONN_STATE_RENDDESC_WAIT; - } - } SMARTLIST_FOREACH_END(conn); - - smartlist_free(conns); -} - -/* Remove tracked HSDir requests from our history for this hidden service - * identity public key. */ -static void -purge_hid_serv_request(const ed25519_public_key_t *identity_pk) -{ - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - ed25519_public_key_t blinded_pk; - - tor_assert(identity_pk); - - /* Get blinded pubkey of hidden service. It is possible that we just moved - * to a new time period meaning that we won't be able to purge the request - * from the previous time period. That is fine because they will expire at - * some point and we don't care about those anymore. */ - hs_build_blinded_pubkey(identity_pk, NULL, 0, - hs_get_time_period_num(0), &blinded_pk); - if (BUG(ed25519_public_to_base64(base64_blinded_pk, &blinded_pk) < 0)) { - return; - } - /* Purge last hidden service request from cache for this blinded key. */ - hs_purge_hid_serv_from_last_hid_serv_requests(base64_blinded_pk); -} - -/* Return true iff there is at least one pending directory descriptor request - * for the service identity_pk. */ -static int -directory_request_is_pending(const ed25519_public_key_t *identity_pk) -{ - int ret = 0; - smartlist_t *conns = - connection_list_by_type_purpose(CONN_TYPE_DIR, DIR_PURPOSE_FETCH_HSDESC); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - const hs_ident_dir_conn_t *ident = TO_DIR_CONN(conn)->hs_ident; - if (BUG(ident == NULL)) { - /* A directory connection fetching a service descriptor can't have an - * empty hidden service identifier. */ - continue; - } - if (!ed25519_pubkey_eq(identity_pk, &ident->identity_pk)) { - continue; - } - ret = 1; - break; - } SMARTLIST_FOREACH_END(conn); - - /* No ownership of the objects in this list. */ - smartlist_free(conns); - return ret; -} - -/* We failed to fetch a descriptor for the service with identity_pk - * because of status. Find all pending SOCKS connections for this - * service that are waiting on the descriptor and close them with - * reason. */ -static void -close_all_socks_conns_waiting_for_desc(const ed25519_public_key_t *identity_pk, - hs_client_fetch_status_t status, - int reason) -{ - unsigned int count = 0; - time_t now = approx_time(); - smartlist_t *conns = - connection_list_by_type_state(CONN_TYPE_AP, AP_CONN_STATE_RENDDESC_WAIT); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - entry_connection_t *entry_conn = TO_ENTRY_CONN(base_conn); - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(entry_conn); - - /* Only consider the entry connections that matches the service for which - * we tried to get the descriptor */ - if (!edge_conn->hs_ident || - !ed25519_pubkey_eq(identity_pk, - &edge_conn->hs_ident->identity_pk)) { - continue; - } - assert_connection_ok(base_conn, now); - /* Unattach the entry connection which will close for the reason. */ - connection_mark_unattached_ap(entry_conn, reason); - count++; - } SMARTLIST_FOREACH_END(base_conn); - - if (count > 0) { - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - hs_build_address(identity_pk, HS_VERSION_THREE, onion_address); - log_notice(LD_REND, "Closed %u streams for service %s.onion " - "for reason %s. Fetch status: %s.", - count, safe_str_client(onion_address), - stream_end_reason_to_string(reason), - fetch_status_to_string(status)); - } - - /* No ownership of the object(s) in this list. */ - smartlist_free(conns); -} - -/* Find all pending SOCKS connection waiting for a descriptor and retry them - * all. This is called when the directory information changed. */ -static void -retry_all_socks_conn_waiting_for_desc(void) -{ - smartlist_t *conns = - connection_list_by_type_state(CONN_TYPE_AP, AP_CONN_STATE_RENDDESC_WAIT); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - hs_client_fetch_status_t status; - const edge_connection_t *edge_conn = - ENTRY_TO_EDGE_CONN(TO_ENTRY_CONN(base_conn)); - - /* Ignore non HS or non v3 connection. */ - if (edge_conn->hs_ident == NULL) { - continue; - } - /* In this loop, we will possibly try to fetch a descriptor for the - * pending connections because we just got more directory information. - * However, the refetch process can cleanup all SOCKS request so the same - * service if an internal error happens. Thus, we can end up with closed - * connections in our list. */ - if (base_conn->marked_for_close) { - continue; - } - - /* XXX: There is an optimization we could do which is that for a service - * key, we could check if we can fetch and remember that decision. */ - - /* Order a refetch in case it works this time. */ - status = hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk); - if (BUG(status == HS_CLIENT_FETCH_HAVE_DESC)) { - /* This case is unique because it can NOT happen in theory. Once we get - * a new descriptor, the HS client subsystem is notified immediately and - * the connections waiting for it are handled which means the state will - * change from renddesc wait state. Log this and continue to next - * connection. */ - continue; - } - /* In the case of an error, either all SOCKS connections have been - * closed or we are still missing directory information. Leave the - * connection in renddesc wait state so when we get more info, we'll be - * able to try it again. */ - } SMARTLIST_FOREACH_END(base_conn); - - /* We don't have ownership of those objects. */ - smartlist_free(conns); -} - -/* A v3 HS circuit successfully connected to the hidden service. Update the - * stream state at hs_conn_ident appropriately. */ -static void -note_connection_attempt_succeeded(const hs_ident_edge_conn_t *hs_conn_ident) -{ - tor_assert(hs_conn_ident); - - /* Remove from the hid serv cache all requests for that service so we can - * query the HSDir again later on for various reasons. */ - purge_hid_serv_request(&hs_conn_ident->identity_pk); - - /* The v2 subsystem cleans up the intro point time out flag at this stage. - * We don't try to do it here because we still need to keep intact the intro - * point state for future connections. Even though we are able to connect to - * the service, doesn't mean we should reset the timed out intro points. - * - * It is not possible to have successfully connected to an intro point - * present in our cache that was on error or timed out. Every entry in that - * cache have a 2 minutes lifetime so ultimately the intro point(s) state - * will be reset and thus possible to be retried. */ -} - -/* Given the pubkey of a hidden service in onion_identity_pk, fetch its - * descriptor by launching a dir connection to hsdir. Return a - * hs_client_fetch_status_t status code depending on how it went. */ -static hs_client_fetch_status_t -directory_launch_v3_desc_fetch(const ed25519_public_key_t *onion_identity_pk, - const routerstatus_t *hsdir) -{ - uint64_t current_time_period = hs_get_time_period_num(0); - ed25519_public_key_t blinded_pubkey; - char base64_blinded_pubkey[ED25519_BASE64_LEN + 1]; - hs_ident_dir_conn_t hs_conn_dir_ident; - int retval; - - tor_assert(hsdir); - tor_assert(onion_identity_pk); - - /* Get blinded pubkey */ - hs_build_blinded_pubkey(onion_identity_pk, NULL, 0, - current_time_period, &blinded_pubkey); - /* ...and base64 it. */ - retval = ed25519_public_to_base64(base64_blinded_pubkey, &blinded_pubkey); - if (BUG(retval < 0)) { - return HS_CLIENT_FETCH_ERROR; - } - - /* Copy onion pk to a dir_ident so that we attach it to the dir conn */ - hs_ident_dir_conn_init(onion_identity_pk, &blinded_pubkey, - &hs_conn_dir_ident); - - /* Setup directory request */ - directory_request_t *req = - directory_request_new(DIR_PURPOSE_FETCH_HSDESC); - directory_request_set_routerstatus(req, hsdir); - directory_request_set_indirection(req, DIRIND_ANONYMOUS); - directory_request_set_resource(req, base64_blinded_pubkey); - directory_request_fetch_set_hs_ident(req, &hs_conn_dir_ident); - directory_initiate_request(req); - directory_request_free(req); - - log_info(LD_REND, "Descriptor fetch request for service %s with blinded " - "key %s to directory %s", - safe_str_client(ed25519_fmt(onion_identity_pk)), - safe_str_client(base64_blinded_pubkey), - safe_str_client(routerstatus_describe(hsdir))); - - /* Fire a REQUESTED event on the control port. */ - hs_control_desc_event_requested(onion_identity_pk, base64_blinded_pubkey, - hsdir); - - /* Cleanup memory. */ - memwipe(&blinded_pubkey, 0, sizeof(blinded_pubkey)); - memwipe(base64_blinded_pubkey, 0, sizeof(base64_blinded_pubkey)); - memwipe(&hs_conn_dir_ident, 0, sizeof(hs_conn_dir_ident)); - - return HS_CLIENT_FETCH_LAUNCHED; -} - -/** Return the HSDir we should use to fetch the descriptor of the hidden - * service with identity key onion_identity_pk. */ -STATIC routerstatus_t * -pick_hsdir_v3(const ed25519_public_key_t *onion_identity_pk) -{ - int retval; - char base64_blinded_pubkey[ED25519_BASE64_LEN + 1]; - uint64_t current_time_period = hs_get_time_period_num(0); - smartlist_t *responsible_hsdirs; - ed25519_public_key_t blinded_pubkey; - routerstatus_t *hsdir_rs = NULL; - - tor_assert(onion_identity_pk); - - responsible_hsdirs = smartlist_new(); - - /* Get blinded pubkey of hidden service */ - hs_build_blinded_pubkey(onion_identity_pk, NULL, 0, - current_time_period, &blinded_pubkey); - /* ...and base64 it. */ - retval = ed25519_public_to_base64(base64_blinded_pubkey, &blinded_pubkey); - if (BUG(retval < 0)) { - return NULL; - } - - /* Get responsible hsdirs of service for this time period */ - hs_get_responsible_hsdirs(&blinded_pubkey, current_time_period, - 0, 1, responsible_hsdirs); - - log_debug(LD_REND, "Found %d responsible HSDirs and about to pick one.", - smartlist_len(responsible_hsdirs)); - - /* Pick an HSDir from the responsible ones. The ownership of - * responsible_hsdirs is given to this function so no need to free it. */ - hsdir_rs = hs_pick_hsdir(responsible_hsdirs, base64_blinded_pubkey); - - return hsdir_rs; -} - -/** Fetch a v3 descriptor using the given onion_identity_pk. - * - * On success, HS_CLIENT_FETCH_LAUNCHED is returned. Otherwise, an error from - * hs_client_fetch_status_t is returned. */ -MOCK_IMPL(STATIC hs_client_fetch_status_t, -fetch_v3_desc, (const ed25519_public_key_t *onion_identity_pk)) -{ - routerstatus_t *hsdir_rs =NULL; - - tor_assert(onion_identity_pk); - - hsdir_rs = pick_hsdir_v3(onion_identity_pk); - if (!hsdir_rs) { - log_info(LD_REND, "Couldn't pick a v3 hsdir."); - return HS_CLIENT_FETCH_NO_HSDIRS; - } - - return directory_launch_v3_desc_fetch(onion_identity_pk, hsdir_rs); -} - -/* Make sure that the given v3 origin circuit circ is a valid correct - * introduction circuit. This will BUG() on any problems and hard assert if - * the anonymity of the circuit is not ok. Return 0 on success else -1 where - * the circuit should be mark for closed immediately. */ -static int -intro_circ_is_ok(const origin_circuit_t *circ) -{ - int ret = 0; - - tor_assert(circ); - - if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCING && - TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && - TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) { - ret = -1; - } - if (BUG(circ->hs_ident == NULL)) { - ret = -1; - } - if (BUG(!hs_ident_intro_circ_is_valid(circ->hs_ident))) { - ret = -1; - } - - /* This can stop the tor daemon but we want that since if we don't have - * anonymity on this circuit, something went really wrong. */ - assert_circ_anonymity_ok(circ, get_options()); - return ret; -} - -/* Find a descriptor intro point object that matches the given ident in the - * given descriptor desc. Return NULL if not found. */ -static const hs_desc_intro_point_t * -find_desc_intro_point_by_ident(const hs_ident_circuit_t *ident, - const hs_descriptor_t *desc) -{ - const hs_desc_intro_point_t *intro_point = NULL; - - tor_assert(ident); - tor_assert(desc); - - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - const hs_desc_intro_point_t *, ip) { - if (ed25519_pubkey_eq(&ident->intro_auth_pk, - &ip->auth_key_cert->signed_key)) { - intro_point = ip; - break; - } - } SMARTLIST_FOREACH_END(ip); - - return intro_point; -} - -/* Find a descriptor intro point object from the descriptor object desc that - * matches the given legacy identity digest in legacy_id. Return NULL if not - * found. */ -static hs_desc_intro_point_t * -find_desc_intro_point_by_legacy_id(const char *legacy_id, - const hs_descriptor_t *desc) -{ - hs_desc_intro_point_t *ret_ip = NULL; - - tor_assert(legacy_id); - tor_assert(desc); - - /* We will go over every intro point and try to find which one is linked to - * that circuit. Those lists are small so it's not that expensive. */ - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - hs_desc_intro_point_t *, ip) { - SMARTLIST_FOREACH_BEGIN(ip->link_specifiers, - const hs_desc_link_specifier_t *, lspec) { - /* Not all tor node have an ed25519 identity key so we still rely on the - * legacy identity digest. */ - if (lspec->type != LS_LEGACY_ID) { - continue; - } - if (fast_memneq(legacy_id, lspec->u.legacy_id, DIGEST_LEN)) { - break; - } - /* Found it. */ - ret_ip = ip; - goto end; - } SMARTLIST_FOREACH_END(lspec); - } SMARTLIST_FOREACH_END(ip); - - end: - return ret_ip; -} - -/* Send an INTRODUCE1 cell along the intro circuit and populate the rend - * circuit identifier with the needed key material for the e2e encryption. - * Return 0 on success, -1 if there is a transient error such that an action - * has been taken to recover and -2 if there is a permanent error indicating - * that both circuits were closed. */ -static int -send_introduce1(origin_circuit_t *intro_circ, - origin_circuit_t *rend_circ) -{ - int status; - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - const ed25519_public_key_t *service_identity_pk = NULL; - const hs_desc_intro_point_t *ip; - - tor_assert(rend_circ); - if (intro_circ_is_ok(intro_circ) < 0) { - goto perm_err; - } - - service_identity_pk = &intro_circ->hs_ident->identity_pk; - /* For logging purposes. There will be a time where the hs_ident will have a - * version number but for now there is none because it's all v3. */ - hs_build_address(service_identity_pk, HS_VERSION_THREE, onion_address); - - log_info(LD_REND, "Sending INTRODUCE1 cell to service %s on circuit %u", - safe_str_client(onion_address), TO_CIRCUIT(intro_circ)->n_circ_id); - - /* 1) Get descriptor from our cache. */ - const hs_descriptor_t *desc = - hs_cache_lookup_as_client(service_identity_pk); - if (desc == NULL || !hs_client_any_intro_points_usable(service_identity_pk, - desc)) { - log_info(LD_REND, "Request to %s %s. Trying to fetch a new descriptor.", - safe_str_client(onion_address), - (desc) ? "didn't have usable intro points" : - "didn't have a descriptor"); - hs_client_refetch_hsdesc(service_identity_pk); - /* We just triggered a refetch, make sure every connections are back - * waiting for that descriptor. */ - flag_all_conn_wait_desc(service_identity_pk); - /* We just asked for a refetch so this is a transient error. */ - goto tran_err; - } - - /* We need to find which intro point in the descriptor we are connected to - * on intro_circ. */ - ip = find_desc_intro_point_by_ident(intro_circ->hs_ident, desc); - if (BUG(ip == NULL)) { - /* If we can find a descriptor from this introduction circuit ident, we - * must have a valid intro point object. Permanent error. */ - goto perm_err; - } - - /* Send the INTRODUCE1 cell. */ - if (hs_circ_send_introduce1(intro_circ, rend_circ, ip, - desc->subcredential) < 0) { - /* Unable to send the cell, the intro circuit has been marked for close so - * this is a permanent error. */ - tor_assert_nonfatal(TO_CIRCUIT(intro_circ)->marked_for_close); - goto perm_err; - } - - /* Cell has been sent successfully. Copy the introduction point - * authentication and encryption key in the rendezvous circuit identifier so - * we can compute the ntor keys when we receive the RENDEZVOUS2 cell. */ - memcpy(&rend_circ->hs_ident->intro_enc_pk, &ip->enc_key, - sizeof(rend_circ->hs_ident->intro_enc_pk)); - ed25519_pubkey_copy(&rend_circ->hs_ident->intro_auth_pk, - &intro_circ->hs_ident->intro_auth_pk); - - /* Now, we wait for an ACK or NAK on this circuit. */ - circuit_change_purpose(TO_CIRCUIT(intro_circ), - CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT); - /* Set timestamp_dirty, because circuit_expire_building expects it to - * specify when a circuit entered the _C_INTRODUCE_ACK_WAIT state. */ - TO_CIRCUIT(intro_circ)->timestamp_dirty = time(NULL); - pathbias_count_use_attempt(intro_circ); - - /* Success. */ - status = 0; - goto end; - - perm_err: - /* Permanent error: it is possible that the intro circuit was closed prior - * because we weren't able to send the cell. Make sure we don't double close - * it which would result in a warning. */ - if (!TO_CIRCUIT(intro_circ)->marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_INTERNAL); - } - circuit_mark_for_close(TO_CIRCUIT(rend_circ), END_CIRC_REASON_INTERNAL); - status = -2; - goto end; - - tran_err: - status = -1; - - end: - memwipe(onion_address, 0, sizeof(onion_address)); - return status; -} - -/* Using the introduction circuit circ, setup the authentication key of the - * intro point this circuit has extended to. */ -static void -setup_intro_circ_auth_key(origin_circuit_t *circ) -{ - const hs_descriptor_t *desc; - const hs_desc_intro_point_t *ip; - - tor_assert(circ); - - desc = hs_cache_lookup_as_client(&circ->hs_ident->identity_pk); - if (BUG(desc == NULL)) { - /* Opening intro circuit without the descriptor is no good... */ - goto end; - } - - /* We will go over every intro point and try to find which one is linked to - * that circuit. Those lists are small so it's not that expensive. */ - ip = find_desc_intro_point_by_legacy_id( - circ->build_state->chosen_exit->identity_digest, desc); - if (ip) { - /* We got it, copy its authentication key to the identifier. */ - ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, - &ip->auth_key_cert->signed_key); - goto end; - } - - /* Reaching this point means we didn't find any intro point for this circuit - * which is not suppose to happen. */ - tor_assert_nonfatal_unreached(); - - end: - return; -} - -/* Called when an introduction circuit has opened. */ -static void -client_intro_circ_has_opened(origin_circuit_t *circ) -{ - tor_assert(circ); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_INTRODUCING); - log_info(LD_REND, "Introduction circuit %u has opened. Attaching streams.", - (unsigned int) TO_CIRCUIT(circ)->n_circ_id); - - /* This is an introduction circuit so we'll attach the correct - * authentication key to the circuit identifier so it can be identified - * properly later on. */ - setup_intro_circ_auth_key(circ); - - connection_ap_attach_pending(1); -} - -/* Called when a rendezvous circuit has opened. */ -static void -client_rendezvous_circ_has_opened(origin_circuit_t *circ) -{ - tor_assert(circ); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND); - - const extend_info_t *rp_ei = circ->build_state->chosen_exit; - - /* Check that we didn't accidentally choose a node that does not understand - * the v3 rendezvous protocol */ - if (rp_ei) { - const node_t *rp_node = node_get_by_id(rp_ei->identity_digest); - if (rp_node) { - if (BUG(!node_supports_v3_rendezvous_point(rp_node))) { - return; - } - } - } - - log_info(LD_REND, "Rendezvous circuit has opened to %s.", - safe_str_client(extend_info_describe(rp_ei))); - - /* Ignore returned value, nothing we can really do. On failure, the circuit - * will be marked for close. */ - hs_circ_send_establish_rendezvous(circ); - - /* Register rend circuit in circuitmap if it's still alive. */ - if (!TO_CIRCUIT(circ)->marked_for_close) { - hs_circuitmap_register_rend_circ_client_side(circ, - circ->hs_ident->rendezvous_cookie); - } -} - -/* This is an helper function that convert a descriptor intro point object ip - * to a newly allocated extend_info_t object fully initialized. Return NULL if - * we can't convert it for which chances are that we are missing or malformed - * link specifiers. */ -STATIC extend_info_t * -desc_intro_point_to_extend_info(const hs_desc_intro_point_t *ip) -{ - extend_info_t *ei; - smartlist_t *lspecs = smartlist_new(); - - tor_assert(ip); - - /* We first encode the descriptor link specifiers into the binary - * representation which is a trunnel object. */ - SMARTLIST_FOREACH_BEGIN(ip->link_specifiers, - const hs_desc_link_specifier_t *, desc_lspec) { - link_specifier_t *lspec = hs_desc_lspec_to_trunnel(desc_lspec); - smartlist_add(lspecs, lspec); - } SMARTLIST_FOREACH_END(desc_lspec); - - /* Explicitely put the direct connection option to 0 because this is client - * side and there is no such thing as a non anonymous client. */ - ei = hs_get_extend_info_from_lspecs(lspecs, &ip->onion_key, 0); - - SMARTLIST_FOREACH(lspecs, link_specifier_t *, ls, link_specifier_free(ls)); - smartlist_free(lspecs); - return ei; -} - -/* Return true iff the intro point ip for the service service_pk is usable. - * This function checks if the intro point is in the client intro state cache - * and checks at the failures. It is considered usable if: - * - No error happened (INTRO_POINT_FAILURE_GENERIC) - * - It is not flagged as timed out (INTRO_POINT_FAILURE_TIMEOUT) - * - The unreachable count is lower than - * MAX_INTRO_POINT_REACHABILITY_FAILURES (INTRO_POINT_FAILURE_UNREACHABLE) - */ -static int -intro_point_is_usable(const ed25519_public_key_t *service_pk, - const hs_desc_intro_point_t *ip) -{ - const hs_cache_intro_state_t *state; - - tor_assert(service_pk); - tor_assert(ip); - - state = hs_cache_client_intro_state_find(service_pk, - &ip->auth_key_cert->signed_key); - if (state == NULL) { - /* This means we've never encountered any problem thus usable. */ - goto usable; - } - if (state->error) { - log_info(LD_REND, "Intro point with auth key %s had an error. Not usable", - safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key))); - goto not_usable; - } - if (state->timed_out) { - log_info(LD_REND, "Intro point with auth key %s timed out. Not usable", - safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key))); - goto not_usable; - } - if (state->unreachable_count >= MAX_INTRO_POINT_REACHABILITY_FAILURES) { - log_info(LD_REND, "Intro point with auth key %s unreachable. Not usable", - safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key))); - goto not_usable; - } - - usable: - return 1; - not_usable: - return 0; -} - -/* Using a descriptor desc, return a newly allocated extend_info_t object of a - * randomly picked introduction point from its list. Return NULL if none are - * usable. */ -STATIC extend_info_t * -client_get_random_intro(const ed25519_public_key_t *service_pk) -{ - extend_info_t *ei = NULL, *ei_excluded = NULL; - smartlist_t *usable_ips = NULL; - const hs_descriptor_t *desc; - const hs_desc_encrypted_data_t *enc_data; - const or_options_t *options = get_options(); - /* Calculate the onion address for logging purposes */ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - - tor_assert(service_pk); - - desc = hs_cache_lookup_as_client(service_pk); - /* Assume the service is v3 if the descriptor is missing. This is ok, - * because we only use the address in log messages */ - hs_build_address(service_pk, - desc ? desc->plaintext_data.version : HS_VERSION_THREE, - onion_address); - if (desc == NULL || !hs_client_any_intro_points_usable(service_pk, - desc)) { - log_info(LD_REND, "Unable to randomly select an introduction point " - "for service %s because descriptor %s. We can't connect.", - safe_str_client(onion_address), - (desc) ? "doesn't have any usable intro points" - : "is missing (assuming v3 onion address)"); - goto end; - } - - enc_data = &desc->encrypted_data; - usable_ips = smartlist_new(); - smartlist_add_all(usable_ips, enc_data->intro_points); - while (smartlist_len(usable_ips) != 0) { - int idx; - const hs_desc_intro_point_t *ip; - - /* Pick a random intro point and immediately remove it from the usable - * list so we don't pick it again if we have to iterate more. */ - idx = crypto_rand_int(smartlist_len(usable_ips)); - ip = smartlist_get(usable_ips, idx); - smartlist_del(usable_ips, idx); - - /* We need to make sure we have a usable intro points which is in a good - * state in our cache. */ - if (!intro_point_is_usable(service_pk, ip)) { - continue; - } - - /* Generate an extend info object from the intro point object. */ - ei = desc_intro_point_to_extend_info(ip); - if (ei == NULL) { - /* We can get here for instance if the intro point is a private address - * and we aren't allowed to extend to those. */ - log_info(LD_REND, "Unable to select introduction point with auth key %s " - "for service %s, because we could not extend to it.", - safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key)), - safe_str_client(onion_address)); - continue; - } - - /* Test the pick against ExcludeNodes. */ - if (routerset_contains_extendinfo(options->ExcludeNodes, ei)) { - /* If this pick is in the ExcludeNodes list, we keep its reference so if - * we ever end up not being able to pick anything else and StrictNodes is - * unset, we'll use it. */ - if (ei_excluded) { - /* If something was already here free it. After the loop is gone we - * will examine the last excluded intro point, and that's fine since - * that's random anyway */ - extend_info_free(ei_excluded); - } - ei_excluded = ei; - continue; - } - - /* Good pick! Let's go with this. */ - goto end; - } - - /* Reaching this point means a couple of things. Either we can't use any of - * the intro point listed because the IP address can't be extended to or it - * is listed in the ExcludeNodes list. In the later case, if StrictNodes is - * set, we are forced to not use anything. */ - ei = ei_excluded; - if (options->StrictNodes) { - log_warn(LD_REND, "Every introduction point for service %s is in the " - "ExcludeNodes set and StrictNodes is set. We can't connect.", - safe_str_client(onion_address)); - extend_info_free(ei); - ei = NULL; - } else { - log_fn(LOG_PROTOCOL_WARN, LD_REND, "Every introduction point for service " - "%s is unusable or we can't extend to it. We can't connect.", - safe_str_client(onion_address)); - } - - end: - smartlist_free(usable_ips); - memwipe(onion_address, 0, sizeof(onion_address)); - return ei; -} - -/* For this introduction circuit, we'll look at if we have any usable - * introduction point left for this service. If so, we'll use the circuit to - * re-extend to a new intro point. Else, we'll close the circuit and its - * corresponding rendezvous circuit. Return 0 if we are re-extending else -1 - * if we are closing the circuits. - * - * This is called when getting an INTRODUCE_ACK cell with a NACK. */ -static int -close_or_reextend_intro_circ(origin_circuit_t *intro_circ) -{ - int ret = -1; - const hs_descriptor_t *desc; - origin_circuit_t *rend_circ; - - tor_assert(intro_circ); - - desc = hs_cache_lookup_as_client(&intro_circ->hs_ident->identity_pk); - if (BUG(desc == NULL)) { - /* We can't continue without a descriptor. */ - goto close; - } - /* We still have the descriptor, great! Let's try to see if we can - * re-extend by looking up if there are any usable intro points. */ - if (!hs_client_any_intro_points_usable(&intro_circ->hs_ident->identity_pk, - desc)) { - goto close; - } - /* Try to re-extend now. */ - if (hs_client_reextend_intro_circuit(intro_circ) < 0) { - goto close; - } - /* Success on re-extending. Don't return an error. */ - ret = 0; - goto end; - - close: - /* Change the intro circuit purpose before so we don't report an intro point - * failure again triggering an extra descriptor fetch. The circuit can - * already be closed on failure to re-extend. */ - if (!TO_CIRCUIT(intro_circ)->marked_for_close) { - circuit_change_purpose(TO_CIRCUIT(intro_circ), - CIRCUIT_PURPOSE_C_INTRODUCE_ACKED); - circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_FINISHED); - } - /* Close the related rendezvous circuit. */ - rend_circ = hs_circuitmap_get_rend_circ_client_side( - intro_circ->hs_ident->rendezvous_cookie); - /* The rendezvous circuit might have collapsed while the INTRODUCE_ACK was - * inflight so we can't expect one every time. */ - if (rend_circ) { - circuit_mark_for_close(TO_CIRCUIT(rend_circ), END_CIRC_REASON_FINISHED); - } - - end: - return ret; -} - -/* Called when we get an INTRODUCE_ACK success status code. Do the appropriate - * actions for the rendezvous point and finally close intro_circ. */ -static void -handle_introduce_ack_success(origin_circuit_t *intro_circ) -{ - origin_circuit_t *rend_circ = NULL; - - tor_assert(intro_circ); - - log_info(LD_REND, "Received INTRODUCE_ACK ack! Informing rendezvous"); - - /* Get the rendezvous circuit for this rendezvous cookie. */ - uint8_t *rendezvous_cookie = intro_circ->hs_ident->rendezvous_cookie; - rend_circ = - hs_circuitmap_get_established_rend_circ_client_side(rendezvous_cookie); - if (rend_circ == NULL) { - log_warn(LD_REND, "Can't find any rendezvous circuit. Stopping"); - goto end; - } - - assert_circ_anonymity_ok(rend_circ, get_options()); - - /* It is possible to get a RENDEZVOUS2 cell before the INTRODUCE_ACK which - * means that the circuit will be joined and already transmitting data. In - * that case, simply skip the purpose change and close the intro circuit - * like it should be. */ - if (TO_CIRCUIT(rend_circ)->purpose == CIRCUIT_PURPOSE_C_REND_JOINED) { - goto end; - } - circuit_change_purpose(TO_CIRCUIT(rend_circ), - CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED); - /* Set timestamp_dirty, because circuit_expire_building expects it to - * specify when a circuit entered the - * CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED state. */ - TO_CIRCUIT(rend_circ)->timestamp_dirty = time(NULL); - - end: - /* We don't need the intro circuit anymore. It did what it had to do! */ - circuit_change_purpose(TO_CIRCUIT(intro_circ), - CIRCUIT_PURPOSE_C_INTRODUCE_ACKED); - circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_FINISHED); - - /* XXX: Close pending intro circuits we might have in parallel. */ - return; -} - -/* Called when we get an INTRODUCE_ACK failure status code. Depending on our - * failure cache status, either close the circuit or re-extend to a new - * introduction point. */ -static void -handle_introduce_ack_bad(origin_circuit_t *circ, int status) -{ - tor_assert(circ); - - log_info(LD_REND, "Received INTRODUCE_ACK nack by %s. Reason: %u", - safe_str_client(extend_info_describe(circ->build_state->chosen_exit)), - status); - - /* It's a NAK. The introduction point didn't relay our request. */ - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_INTRODUCING); - - /* Note down this failure in the intro point failure cache. Depending on how - * many times we've tried this intro point, close it or reextend. */ - hs_cache_client_intro_state_note(&circ->hs_ident->identity_pk, - &circ->hs_ident->intro_auth_pk, - INTRO_POINT_FAILURE_GENERIC); -} - -/* Called when we get an INTRODUCE_ACK on the intro circuit circ. The encoded - * cell is in payload of length payload_len. Return 0 on success else a - * negative value. The circuit is either close or reuse to re-extend to a new - * introduction point. */ -static int -handle_introduce_ack(origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len) -{ - int status, ret = -1; - - tor_assert(circ); - tor_assert(circ->build_state); - tor_assert(circ->build_state->chosen_exit); - assert_circ_anonymity_ok(circ, get_options()); - tor_assert(payload); - - status = hs_cell_parse_introduce_ack(payload, payload_len); - switch (status) { - case HS_CELL_INTRO_ACK_SUCCESS: - ret = 0; - handle_introduce_ack_success(circ); - goto end; - case HS_CELL_INTRO_ACK_FAILURE: - case HS_CELL_INTRO_ACK_BADFMT: - case HS_CELL_INTRO_ACK_NORELAY: - handle_introduce_ack_bad(circ, status); - /* We are going to see if we have to close the circuits (IP and RP) or we - * can re-extend to a new intro point. */ - ret = close_or_reextend_intro_circ(circ); - break; - default: - log_info(LD_PROTOCOL, "Unknown INTRODUCE_ACK status code %u from %s", - status, - safe_str_client(extend_info_describe(circ->build_state->chosen_exit))); - break; - } - - end: - return ret; -} - -/* Called when we get a RENDEZVOUS2 cell on the rendezvous circuit circ. The - * encoded cell is in payload of length payload_len. Return 0 on success or a - * negative value on error. On error, the circuit is marked for close. */ -STATIC int -handle_rendezvous2(origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len) -{ - int ret = -1; - curve25519_public_key_t server_pk; - uint8_t auth_mac[DIGEST256_LEN] = {0}; - uint8_t handshake_info[CURVE25519_PUBKEY_LEN + sizeof(auth_mac)] = {0}; - hs_ntor_rend_cell_keys_t keys; - const hs_ident_circuit_t *ident; - - tor_assert(circ); - tor_assert(payload); - - /* Make things easier. */ - ident = circ->hs_ident; - tor_assert(ident); - - if (hs_cell_parse_rendezvous2(payload, payload_len, handshake_info, - sizeof(handshake_info)) < 0) { - goto err; - } - /* Get from the handshake info the SERVER_PK and AUTH_MAC. */ - memcpy(&server_pk, handshake_info, CURVE25519_PUBKEY_LEN); - memcpy(auth_mac, handshake_info + CURVE25519_PUBKEY_LEN, sizeof(auth_mac)); - - /* Generate the handshake info. */ - if (hs_ntor_client_get_rendezvous1_keys(&ident->intro_auth_pk, - &ident->rendezvous_client_kp, - &ident->intro_enc_pk, &server_pk, - &keys) < 0) { - log_info(LD_REND, "Unable to compute the rendezvous keys."); - goto err; - } - - /* Critical check, make sure that the MAC matches what we got with what we - * computed just above. */ - if (!hs_ntor_client_rendezvous2_mac_is_good(&keys, auth_mac)) { - log_info(LD_REND, "Invalid MAC in RENDEZVOUS2. Rejecting cell."); - goto err; - } - - /* Setup the e2e encryption on the circuit and finalize its state. */ - if (hs_circuit_setup_e2e_rend_circ(circ, keys.ntor_key_seed, - sizeof(keys.ntor_key_seed), 0) < 0) { - log_info(LD_REND, "Unable to setup the e2e encryption."); - goto err; - } - /* Success. Hidden service connection finalized! */ - ret = 0; - goto end; - - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - end: - memwipe(&keys, 0, sizeof(keys)); - return ret; -} - -/* Return true iff the client can fetch a descriptor for this service public - * identity key and status_out if not NULL is untouched. If the client can - * _not_ fetch the descriptor and if status_out is not NULL, it is set with - * the fetch status code. */ -static unsigned int -can_client_refetch_desc(const ed25519_public_key_t *identity_pk, - hs_client_fetch_status_t *status_out) -{ - hs_client_fetch_status_t status; - - tor_assert(identity_pk); - - /* Are we configured to fetch descriptors? */ - if (!get_options()->FetchHidServDescriptors) { - log_warn(LD_REND, "We received an onion address for a hidden service " - "descriptor but we are configured to not fetch."); - status = HS_CLIENT_FETCH_NOT_ALLOWED; - goto cannot; - } - - /* Without a live consensus we can't do any client actions. It is needed to - * compute the hashring for a service. */ - if (!networkstatus_get_live_consensus(approx_time())) { - log_info(LD_REND, "Can't fetch descriptor for service %s because we " - "are missing a live consensus. Stalling connection.", - safe_str_client(ed25519_fmt(identity_pk))); - status = HS_CLIENT_FETCH_MISSING_INFO; - goto cannot; - } - - if (!router_have_minimum_dir_info()) { - log_info(LD_REND, "Can't fetch descriptor for service %s because we " - "dont have enough descriptors. Stalling connection.", - safe_str_client(ed25519_fmt(identity_pk))); - status = HS_CLIENT_FETCH_MISSING_INFO; - goto cannot; - } - - /* Check if fetching a desc for this HS is useful to us right now */ - { - const hs_descriptor_t *cached_desc = NULL; - cached_desc = hs_cache_lookup_as_client(identity_pk); - if (cached_desc && hs_client_any_intro_points_usable(identity_pk, - cached_desc)) { - log_info(LD_GENERAL, "We would fetch a v3 hidden service descriptor " - "but we already have a usable descriptor."); - status = HS_CLIENT_FETCH_HAVE_DESC; - goto cannot; - } - } - - /* Don't try to refetch while we have a pending request for it. */ - if (directory_request_is_pending(identity_pk)) { - log_info(LD_REND, "Already a pending directory request. Waiting on it."); - status = HS_CLIENT_FETCH_PENDING; - goto cannot; - } - - /* Yes, client can fetch! */ - return 1; - cannot: - if (status_out) { - *status_out = status; - } - return 0; -} - -/* ========== */ -/* Public API */ -/* ========== */ - -/** A circuit just finished connecting to a hidden service that the stream - * conn has been waiting for. Let the HS subsystem know about this. */ -void -hs_client_note_connection_attempt_succeeded(const edge_connection_t *conn) -{ - tor_assert(connection_edge_is_rendezvous_stream(conn)); - - if (BUG(conn->rend_data && conn->hs_ident)) { - log_warn(LD_BUG, "Stream had both rend_data and hs_ident..." - "Prioritizing hs_ident"); - } - - if (conn->hs_ident) { /* It's v3: pass it to the prop224 handler */ - note_connection_attempt_succeeded(conn->hs_ident); - return; - } else if (conn->rend_data) { /* It's v2: pass it to the legacy handler */ - rend_client_note_connection_attempt_ended(conn->rend_data); - return; - } -} - -/* With the given encoded descriptor in desc_str and the service key in - * service_identity_pk, decode the descriptor and set the desc pointer with a - * newly allocated descriptor object. - * - * Return 0 on success else a negative value and desc is set to NULL. */ -int -hs_client_decode_descriptor(const char *desc_str, - const ed25519_public_key_t *service_identity_pk, - hs_descriptor_t **desc) -{ - int ret; - uint8_t subcredential[DIGEST256_LEN]; - ed25519_public_key_t blinded_pubkey; - - tor_assert(desc_str); - tor_assert(service_identity_pk); - tor_assert(desc); - - /* Create subcredential for this HS so that we can decrypt */ - { - uint64_t current_time_period = hs_get_time_period_num(0); - hs_build_blinded_pubkey(service_identity_pk, NULL, 0, current_time_period, - &blinded_pubkey); - hs_get_subcredential(service_identity_pk, &blinded_pubkey, subcredential); - } - - /* Parse descriptor */ - ret = hs_desc_decode_descriptor(desc_str, subcredential, desc); - memwipe(subcredential, 0, sizeof(subcredential)); - if (ret < 0) { - log_warn(LD_GENERAL, "Could not parse received descriptor as client."); - if (get_options()->SafeLogging_ == SAFELOG_SCRUB_NONE) { - log_warn(LD_GENERAL, "%s", escaped(desc_str)); - } - goto err; - } - - /* Make sure the descriptor signing key cross certifies with the computed - * blinded key. Without this validation, anyone knowing the subcredential - * and onion address can forge a descriptor. */ - if (tor_cert_checksig((*desc)->plaintext_data.signing_key_cert, - &blinded_pubkey, approx_time()) < 0) { - log_warn(LD_GENERAL, "Descriptor signing key certificate signature " - "doesn't validate with computed blinded key."); - goto err; - } - - return 0; - err: - return -1; -} - -/* Return true iff there are at least one usable intro point in the service - * descriptor desc. */ -int -hs_client_any_intro_points_usable(const ed25519_public_key_t *service_pk, - const hs_descriptor_t *desc) -{ - tor_assert(service_pk); - tor_assert(desc); - - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - const hs_desc_intro_point_t *, ip) { - if (intro_point_is_usable(service_pk, ip)) { - goto usable; - } - } SMARTLIST_FOREACH_END(ip); - - return 0; - usable: - return 1; -} - -/** Launch a connection to a hidden service directory to fetch a hidden - * service descriptor using identity_pk to get the necessary keys. - * - * A hs_client_fetch_status_t code is returned. */ -int -hs_client_refetch_hsdesc(const ed25519_public_key_t *identity_pk) -{ - hs_client_fetch_status_t status; - - tor_assert(identity_pk); - - if (!can_client_refetch_desc(identity_pk, &status)) { - return status; - } - - /* Try to fetch the desc and if we encounter an unrecoverable error, mark - * the desc as unavailable for now. */ - status = fetch_v3_desc(identity_pk); - if (fetch_status_should_close_socks(status)) { - close_all_socks_conns_waiting_for_desc(identity_pk, status, - END_STREAM_REASON_RESOLVEFAILED); - /* Remove HSDir fetch attempts so that we can retry later if the user - * wants us to regardless of if we closed any connections. */ - purge_hid_serv_request(identity_pk); - } - return status; -} - -/* This is called when we are trying to attach an AP connection to these - * hidden service circuits from connection_ap_handshake_attach_circuit(). - * Return 0 on success, -1 for a transient error that is actions were - * triggered to recover or -2 for a permenent error where both circuits will - * marked for close. - * - * The following supports every hidden service version. */ -int -hs_client_send_introduce1(origin_circuit_t *intro_circ, - origin_circuit_t *rend_circ) -{ - return (intro_circ->hs_ident) ? send_introduce1(intro_circ, rend_circ) : - rend_client_send_introduction(intro_circ, - rend_circ); -} - -/* Called when the client circuit circ has been established. It can be either - * an introduction or rendezvous circuit. This function handles all hidden - * service versions. */ -void -hs_client_circuit_has_opened(origin_circuit_t *circ) -{ - tor_assert(circ); - - /* Handle both version. v2 uses rend_data and v3 uses the hs circuit - * identifier hs_ident. Can't be both. */ - switch (TO_CIRCUIT(circ)->purpose) { - case CIRCUIT_PURPOSE_C_INTRODUCING: - if (circ->hs_ident) { - client_intro_circ_has_opened(circ); - } else { - rend_client_introcirc_has_opened(circ); - } - break; - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - if (circ->hs_ident) { - client_rendezvous_circ_has_opened(circ); - } else { - rend_client_rendcirc_has_opened(circ); - } - break; - default: - tor_assert_nonfatal_unreached(); - } -} - -/* Called when we receive a RENDEZVOUS_ESTABLISHED cell. Change the state of - * the circuit to CIRCUIT_PURPOSE_C_REND_READY. Return 0 on success else a - * negative value and the circuit marked for close. */ -int -hs_client_receive_rendezvous_acked(origin_circuit_t *circ, - const uint8_t *payload, size_t payload_len) -{ - tor_assert(circ); - tor_assert(payload); - - (void) payload_len; - - if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_ESTABLISH_REND) { - log_warn(LD_PROTOCOL, "Got a RENDEZVOUS_ESTABLISHED but we were not " - "expecting one. Closing circuit."); - goto err; - } - - log_info(LD_REND, "Received an RENDEZVOUS_ESTABLISHED. This circuit is " - "now ready for rendezvous."); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_READY); - - /* Set timestamp_dirty, because circuit_expire_building expects it to - * specify when a circuit entered the _C_REND_READY state. */ - TO_CIRCUIT(circ)->timestamp_dirty = time(NULL); - - /* From a path bias point of view, this circuit is now successfully used. - * Waiting any longer opens us up to attacks from malicious hidden services. - * They could induce the client to attempt to connect to their hidden - * service and never reply to the client's rend requests */ - pathbias_mark_use_success(circ); - - /* If we already have the introduction circuit built, make sure we send - * the INTRODUCE cell _now_ */ - connection_ap_attach_pending(1); - - return 0; - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return -1; -} - -/* This is called when a descriptor has arrived following a fetch request and - * has been stored in the client cache. Every entry connection that matches - * the service identity key in the ident will get attached to the hidden - * service circuit. */ -void -hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident) -{ - time_t now = time(NULL); - smartlist_t *conns = NULL; - - tor_assert(ident); - - conns = connection_list_by_type_state(CONN_TYPE_AP, - AP_CONN_STATE_RENDDESC_WAIT); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - const hs_descriptor_t *desc; - entry_connection_t *entry_conn = TO_ENTRY_CONN(base_conn); - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(entry_conn); - - /* Only consider the entry connections that matches the service for which - * we just fetched its descriptor. */ - if (!edge_conn->hs_ident || - !ed25519_pubkey_eq(&ident->identity_pk, - &edge_conn->hs_ident->identity_pk)) { - continue; - } - assert_connection_ok(base_conn, now); - - /* We were just called because we stored the descriptor for this service - * so not finding a descriptor means we have a bigger problem. */ - desc = hs_cache_lookup_as_client(&ident->identity_pk); - if (BUG(desc == NULL)) { - goto end; - } - - if (!hs_client_any_intro_points_usable(&ident->identity_pk, desc)) { - log_info(LD_REND, "Hidden service descriptor is unusable. " - "Closing streams."); - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_RESOLVEFAILED); - /* We are unable to use the descriptor so remove the directory request - * from the cache so the next connection can try again. */ - note_connection_attempt_succeeded(edge_conn->hs_ident); - goto end; - } - - log_info(LD_REND, "Descriptor has arrived. Launching circuits."); - - /* Because the connection can now proceed to opening circuit and - * ultimately connect to the service, reset those timestamp so the - * connection is considered "fresh" and can continue without being closed - * too early. */ - base_conn->timestamp_created = now; - base_conn->timestamp_lastread = now; - base_conn->timestamp_lastwritten = now; - /* Change connection's state into waiting for a circuit. */ - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - - connection_ap_mark_as_pending_circuit(entry_conn); - } SMARTLIST_FOREACH_END(base_conn); - - end: - /* We don't have ownership of the objects in this list. */ - smartlist_free(conns); -} - -/* Return a newly allocated extend_info_t for a randomly chosen introduction - * point for the given edge connection identifier ident. Return NULL if we - * can't pick any usable introduction points. */ -extend_info_t * -hs_client_get_random_intro_from_edge(const edge_connection_t *edge_conn) -{ - tor_assert(edge_conn); - - return (edge_conn->hs_ident) ? - client_get_random_intro(&edge_conn->hs_ident->identity_pk) : - rend_client_get_random_intro(edge_conn->rend_data); -} -/* Called when get an INTRODUCE_ACK cell on the introduction circuit circ. - * Return 0 on success else a negative value is returned. The circuit will be - * closed or reuse to extend again to another intro point. */ -int -hs_client_receive_introduce_ack(origin_circuit_t *circ, - const uint8_t *payload, size_t payload_len) -{ - int ret = -1; - - tor_assert(circ); - tor_assert(payload); - - if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { - log_warn(LD_PROTOCOL, "Unexpected INTRODUCE_ACK on circuit %u.", - (unsigned int) TO_CIRCUIT(circ)->n_circ_id); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - goto end; - } - - ret = (circ->hs_ident) ? handle_introduce_ack(circ, payload, payload_len) : - rend_client_introduction_acked(circ, payload, - payload_len); - /* For path bias: This circuit was used successfully. NACK or ACK counts. */ - pathbias_mark_use_success(circ); - - end: - return ret; -} - -/* Called when get a RENDEZVOUS2 cell on the rendezvous circuit circ. Return - * 0 on success else a negative value is returned. The circuit will be closed - * on error. */ -int -hs_client_receive_rendezvous2(origin_circuit_t *circ, - const uint8_t *payload, size_t payload_len) -{ - int ret = -1; - - tor_assert(circ); - tor_assert(payload); - - /* Circuit can possibly be in both state because we could receive a - * RENDEZVOUS2 cell before the INTRODUCE_ACK has been received. */ - if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_REND_READY && - TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) { - log_warn(LD_PROTOCOL, "Unexpected RENDEZVOUS2 cell on circuit %u. " - "Closing circuit.", - (unsigned int) TO_CIRCUIT(circ)->n_circ_id); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - goto end; - } - - log_info(LD_REND, "Got RENDEZVOUS2 cell from hidden service on circuit %u.", - TO_CIRCUIT(circ)->n_circ_id); - - ret = (circ->hs_ident) ? handle_rendezvous2(circ, payload, payload_len) : - rend_client_receive_rendezvous(circ, payload, - payload_len); - end: - return ret; -} - -/* Extend the introduction circuit circ to another valid introduction point - * for the hidden service it is trying to connect to, or mark it and launch a - * new circuit if we can't extend it. Return 0 on success or possible - * success. Return -1 and mark the introduction circuit for close on permanent - * failure. - * - * On failure, the caller is responsible for marking the associated rendezvous - * circuit for close. */ -int -hs_client_reextend_intro_circuit(origin_circuit_t *circ) -{ - int ret = -1; - extend_info_t *ei; - - tor_assert(circ); - - ei = (circ->hs_ident) ? - client_get_random_intro(&circ->hs_ident->identity_pk) : - rend_client_get_random_intro(circ->rend_data); - if (ei == NULL) { - log_warn(LD_REND, "No usable introduction points left. Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - goto end; - } - - if (circ->remaining_relay_early_cells) { - log_info(LD_REND, "Re-extending circ %u, this time to %s.", - (unsigned int) TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(extend_info_describe(ei))); - ret = circuit_extend_to_new_exit(circ, ei); - if (ret == 0) { - /* We were able to extend so update the timestamp so we avoid expiring - * this circuit too early. The intro circuit is short live so the - * linkability issue is minimized, we just need the circuit to hold a - * bit longer so we can introduce. */ - TO_CIRCUIT(circ)->timestamp_dirty = time(NULL); - } - } else { - log_info(LD_REND, "Closing intro circ %u (out of RELAY_EARLY cells).", - (unsigned int) TO_CIRCUIT(circ)->n_circ_id); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); - /* connection_ap_handshake_attach_circuit will launch a new intro circ. */ - ret = 0; - } - - end: - extend_info_free(ei); - return ret; -} - -/* Release all the storage held by the client subsystem. */ -void -hs_client_free_all(void) -{ - /* Purge the hidden service request cache. */ - hs_purge_last_hid_serv_requests(); -} - -/* Purge all potentially remotely-detectable state held in the hidden - * service client code. Called on SIGNAL NEWNYM. */ -void -hs_client_purge_state(void) -{ - /* v2 subsystem. */ - rend_client_purge_state(); - - /* Cancel all descriptor fetches. Do this first so once done we are sure - * that our descriptor cache won't modified. */ - cancel_descriptor_fetches(); - /* Purge the introduction point state cache. */ - hs_cache_client_intro_state_purge(); - /* Purge the descriptor cache. */ - hs_cache_purge_as_client(); - /* Purge the last hidden service request cache. */ - hs_purge_last_hid_serv_requests(); - - log_info(LD_REND, "Hidden service client state has been purged."); -} - -/* Called when our directory information has changed. */ -void -hs_client_dir_info_changed(void) -{ - /* We have possibly reached the minimum directory information or new - * consensus so retry all pending SOCKS connection in - * AP_CONN_STATE_RENDDESC_WAIT state in order to fetch the descriptor. */ - retry_all_socks_conn_waiting_for_desc(); -} - diff --git a/src/tor/src/or/hs_client.h b/src/tor/src/or/hs_client.h deleted file mode 100644 index 2523568ad..000000000 --- a/src/tor/src/or/hs_client.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_client.h - * \brief Header file containing client data for the HS subsytem. - **/ - -#ifndef TOR_HS_CLIENT_H -#define TOR_HS_CLIENT_H - -#include "crypto_ed25519.h" -#include "hs_descriptor.h" -#include "hs_ident.h" - -/* Status code of a descriptor fetch request. */ -typedef enum { - /* Something internally went wrong. */ - HS_CLIENT_FETCH_ERROR = -1, - /* The fetch request has been launched successfully. */ - HS_CLIENT_FETCH_LAUNCHED = 0, - /* We already have a usable descriptor. No fetch. */ - HS_CLIENT_FETCH_HAVE_DESC = 1, - /* No more HSDir available to query. */ - HS_CLIENT_FETCH_NO_HSDIRS = 2, - /* The fetch request is not allowed. */ - HS_CLIENT_FETCH_NOT_ALLOWED = 3, - /* We are missing information to be able to launch a request. */ - HS_CLIENT_FETCH_MISSING_INFO = 4, - /* There is a pending fetch for the requested service. */ - HS_CLIENT_FETCH_PENDING = 5, -} hs_client_fetch_status_t; - -void hs_client_note_connection_attempt_succeeded( - const edge_connection_t *conn); - -int hs_client_decode_descriptor( - const char *desc_str, - const ed25519_public_key_t *service_identity_pk, - hs_descriptor_t **desc); -int hs_client_any_intro_points_usable(const ed25519_public_key_t *service_pk, - const hs_descriptor_t *desc); -int hs_client_refetch_hsdesc(const ed25519_public_key_t *identity_pk); -void hs_client_dir_info_changed(void); - -int hs_client_send_introduce1(origin_circuit_t *intro_circ, - origin_circuit_t *rend_circ); - -void hs_client_circuit_has_opened(origin_circuit_t *circ); - -int hs_client_receive_rendezvous_acked(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); -int hs_client_receive_introduce_ack(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); -int hs_client_receive_rendezvous2(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); - -void hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident); - -extend_info_t *hs_client_get_random_intro_from_edge( - const edge_connection_t *edge_conn); - -int hs_client_reextend_intro_circuit(origin_circuit_t *circ); - -void hs_client_purge_state(void); - -void hs_client_free_all(void); - -#ifdef HS_CLIENT_PRIVATE - -STATIC routerstatus_t * -pick_hsdir_v3(const ed25519_public_key_t *onion_identity_pk); - -STATIC extend_info_t * -client_get_random_intro(const ed25519_public_key_t *service_pk); - -STATIC extend_info_t * -desc_intro_point_to_extend_info(const hs_desc_intro_point_t *ip); - -STATIC int handle_rendezvous2(origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len); - -MOCK_DECL(STATIC hs_client_fetch_status_t, - fetch_v3_desc, (const ed25519_public_key_t *onion_identity_pk)); - -#endif /* defined(HS_CLIENT_PRIVATE) */ - -#endif /* !defined(TOR_HS_CLIENT_H) */ - diff --git a/src/tor/src/or/hs_common.c b/src/tor/src/or/hs_common.c deleted file mode 100644 index 2c0c2aecd..000000000 --- a/src/tor/src/or/hs_common.c +++ /dev/null @@ -1,1793 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_common.c - * \brief Contains code shared between different HS protocol version as well - * as useful data structures and accessors used by other subsystems. - * The rendcommon.c should only contains code relating to the v2 - * protocol. - **/ - -#define HS_COMMON_PRIVATE - -#include "or.h" - -#include "config.h" -#include "circuitbuild.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "hs_cache.h" -#include "hs_common.h" -#include "hs_client.h" -#include "hs_ident.h" -#include "hs_service.h" -#include "hs_circuitmap.h" -#include "policies.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "routerset.h" -#include "router.h" -#include "routerset.h" -#include "shared_random.h" -#include "shared_random_state.h" - -/* Trunnel */ -#include "ed25519_cert.h" - -/* Ed25519 Basepoint value. Taken from section 5 of - * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03 */ -static const char *str_ed25519_basepoint = - "(15112221349535400772501151409588531511" - "454012693041857206046113283949847762202, " - "463168356949264781694283940034751631413" - "07993866256225615783033603165251855960)"; - -#ifdef HAVE_SYS_UN_H - -/** Given ports, a smarlist containing rend_service_port_config_t, - * add the given p, a AF_UNIX port to the list. Return 0 on success - * else return -ENOSYS if AF_UNIX is not supported (see function in the - * #else statement below). */ -static int -add_unix_port(smartlist_t *ports, rend_service_port_config_t *p) -{ - tor_assert(ports); - tor_assert(p); - tor_assert(p->is_unix_addr); - - smartlist_add(ports, p); - return 0; -} - -/** Given conn set it to use the given port p values. Return 0 - * on success else return -ENOSYS if AF_UNIX is not supported (see function - * in the #else statement below). */ -static int -set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p) -{ - tor_assert(conn); - tor_assert(p); - tor_assert(p->is_unix_addr); - - conn->base_.socket_family = AF_UNIX; - tor_addr_make_unspec(&conn->base_.addr); - conn->base_.port = 1; - conn->base_.address = tor_strdup(p->unix_addr); - return 0; -} - -#else /* !(defined(HAVE_SYS_UN_H)) */ - -static int -set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p) -{ - (void) conn; - (void) p; - return -ENOSYS; -} - -static int -add_unix_port(smartlist_t *ports, rend_service_port_config_t *p) -{ - (void) ports; - (void) p; - return -ENOSYS; -} - -#endif /* defined(HAVE_SYS_UN_H) */ - -/* Helper function: The key is a digest that we compare to a node_t object - * current hsdir_index. */ -static int -compare_digest_to_fetch_hsdir_index(const void *_key, const void **_member) -{ - const char *key = _key; - const node_t *node = *_member; - return tor_memcmp(key, node->hsdir_index->fetch, DIGEST256_LEN); -} - -/* Helper function: The key is a digest that we compare to a node_t object - * next hsdir_index. */ -static int -compare_digest_to_store_first_hsdir_index(const void *_key, - const void **_member) -{ - const char *key = _key; - const node_t *node = *_member; - return tor_memcmp(key, node->hsdir_index->store_first, DIGEST256_LEN); -} - -/* Helper function: The key is a digest that we compare to a node_t object - * next hsdir_index. */ -static int -compare_digest_to_store_second_hsdir_index(const void *_key, - const void **_member) -{ - const char *key = _key; - const node_t *node = *_member; - return tor_memcmp(key, node->hsdir_index->store_second, DIGEST256_LEN); -} - -/* Helper function: Compare two node_t objects current hsdir_index. */ -static int -compare_node_fetch_hsdir_index(const void **a, const void **b) -{ - const node_t *node1= *a; - const node_t *node2 = *b; - return tor_memcmp(node1->hsdir_index->fetch, - node2->hsdir_index->fetch, - DIGEST256_LEN); -} - -/* Helper function: Compare two node_t objects next hsdir_index. */ -static int -compare_node_store_first_hsdir_index(const void **a, const void **b) -{ - const node_t *node1= *a; - const node_t *node2 = *b; - return tor_memcmp(node1->hsdir_index->store_first, - node2->hsdir_index->store_first, - DIGEST256_LEN); -} - -/* Helper function: Compare two node_t objects next hsdir_index. */ -static int -compare_node_store_second_hsdir_index(const void **a, const void **b) -{ - const node_t *node1= *a; - const node_t *node2 = *b; - return tor_memcmp(node1->hsdir_index->store_second, - node2->hsdir_index->store_second, - DIGEST256_LEN); -} - -/* Allocate and return a string containing the path to filename in directory. - * This function will never return NULL. The caller must free this path. */ -char * -hs_path_from_filename(const char *directory, const char *filename) -{ - char *file_path = NULL; - - tor_assert(directory); - tor_assert(filename); - - tor_asprintf(&file_path, "%s%s%s", directory, PATH_SEPARATOR, filename); - return file_path; -} - -/* Make sure that the directory for service is private, using the config - * username. - * If create is true: - * - if the directory exists, change permissions if needed, - * - if the directory does not exist, create it with the correct permissions. - * If create is false: - * - if the directory exists, check permissions, - * - if the directory does not exist, check if we think we can create it. - * Return 0 on success, -1 on failure. */ -int -hs_check_service_private_dir(const char *username, const char *path, - unsigned int dir_group_readable, - unsigned int create) -{ - cpd_check_t check_opts = CPD_NONE; - - tor_assert(path); - - if (create) { - check_opts |= CPD_CREATE; - } else { - check_opts |= CPD_CHECK_MODE_ONLY; - check_opts |= CPD_CHECK; - } - if (dir_group_readable) { - check_opts |= CPD_GROUP_READ; - } - /* Check/create directory */ - if (check_private_dir(path, check_opts, username) < 0) { - return -1; - } - return 0; -} - -/** Get the default HS time period length in minutes from the consensus. */ -STATIC uint64_t -get_time_period_length(void) -{ - /* If we are on a test network, make the time period smaller than normal so - that we actually see it rotate. Specifically, make it the same length as - an SRV protocol run. */ - if (get_options()->TestingTorNetwork) { - unsigned run_duration = sr_state_get_protocol_run_duration(); - /* An SRV run should take more than a minute (it's 24 rounds) */ - tor_assert_nonfatal(run_duration > 60); - /* Turn it from seconds to minutes before returning: */ - return sr_state_get_protocol_run_duration() / 60; - } - - int32_t time_period_length = networkstatus_get_param(NULL, "hsdir_interval", - HS_TIME_PERIOD_LENGTH_DEFAULT, - HS_TIME_PERIOD_LENGTH_MIN, - HS_TIME_PERIOD_LENGTH_MAX); - /* Make sure it's a positive value. */ - tor_assert(time_period_length >= 0); - /* uint64_t will always be able to contain a int32_t */ - return (uint64_t) time_period_length; -} - -/** Get the HS time period number at time now. If now is not set, - * we try to get the time ourselves from a live consensus. */ -uint64_t -hs_get_time_period_num(time_t now) -{ - uint64_t time_period_num; - time_t current_time; - - /* If no time is specified, set current time based on consensus time, and - * only fall back to system time if that fails. */ - if (now != 0) { - current_time = now; - } else { - networkstatus_t *ns = networkstatus_get_live_consensus(approx_time()); - current_time = ns ? ns->valid_after : approx_time(); - } - - /* Start by calculating minutes since the epoch */ - uint64_t time_period_length = get_time_period_length(); - uint64_t minutes_since_epoch = current_time / 60; - - /* Apply the rotation offset as specified by prop224 (section - * [TIME-PERIODS]), so that new time periods synchronize nicely with SRV - * publication */ - unsigned int time_period_rotation_offset = sr_state_get_phase_duration(); - time_period_rotation_offset /= 60; /* go from seconds to minutes */ - tor_assert(minutes_since_epoch > time_period_rotation_offset); - minutes_since_epoch -= time_period_rotation_offset; - - /* Calculate the time period */ - time_period_num = minutes_since_epoch / time_period_length; - return time_period_num; -} - -/** Get the number of the _upcoming_ HS time period, given that the current - * time is now. If now is not set, we try to get the time from a - * live consensus. */ -uint64_t -hs_get_next_time_period_num(time_t now) -{ - return hs_get_time_period_num(now) + 1; -} - -/* Get the number of the _previous_ HS time period, given that the current time - * is now. If now is not set, we try to get the time from a live - * consensus. */ -uint64_t -hs_get_previous_time_period_num(time_t now) -{ - return hs_get_time_period_num(now) - 1; -} - -/* Return the start time of the upcoming time period based on now. If - now is not set, we try to get the time ourselves from a live - consensus. */ -time_t -hs_get_start_time_of_next_time_period(time_t now) -{ - uint64_t time_period_length = get_time_period_length(); - - /* Get start time of next time period */ - uint64_t next_time_period_num = hs_get_next_time_period_num(now); - uint64_t start_of_next_tp_in_mins = next_time_period_num *time_period_length; - - /* Apply rotation offset as specified by prop224 section [TIME-PERIODS] */ - unsigned int time_period_rotation_offset = sr_state_get_phase_duration(); - return (time_t)(start_of_next_tp_in_mins * 60 + time_period_rotation_offset); -} - -/* Create a new rend_data_t for a specific given version. - * Return a pointer to the newly allocated data structure. */ -static rend_data_t * -rend_data_alloc(uint32_t version) -{ - rend_data_t *rend_data = NULL; - - switch (version) { - case HS_VERSION_TWO: - { - rend_data_v2_t *v2 = tor_malloc_zero(sizeof(*v2)); - v2->base_.version = HS_VERSION_TWO; - v2->base_.hsdirs_fp = smartlist_new(); - rend_data = &v2->base_; - break; - } - default: - tor_assert(0); - break; - } - - return rend_data; -} - -/** Free all storage associated with data */ -void -rend_data_free_(rend_data_t *data) -{ - if (!data) { - return; - } - /* By using our allocation function, this should always be set. */ - tor_assert(data->hsdirs_fp); - /* Cleanup the HSDir identity digest. */ - SMARTLIST_FOREACH(data->hsdirs_fp, char *, d, tor_free(d)); - smartlist_free(data->hsdirs_fp); - /* Depending on the version, cleanup. */ - switch (data->version) { - case HS_VERSION_TWO: - { - rend_data_v2_t *v2_data = TO_REND_DATA_V2(data); - tor_free(v2_data); - break; - } - default: - tor_assert(0); - } -} - -/* Allocate and return a deep copy of data. */ -rend_data_t * -rend_data_dup(const rend_data_t *data) -{ - rend_data_t *data_dup = NULL; - smartlist_t *hsdirs_fp = smartlist_new(); - - tor_assert(data); - tor_assert(data->hsdirs_fp); - - SMARTLIST_FOREACH(data->hsdirs_fp, char *, fp, - smartlist_add(hsdirs_fp, tor_memdup(fp, DIGEST_LEN))); - - switch (data->version) { - case HS_VERSION_TWO: - { - rend_data_v2_t *v2_data = tor_memdup(TO_REND_DATA_V2(data), - sizeof(*v2_data)); - data_dup = &v2_data->base_; - data_dup->hsdirs_fp = hsdirs_fp; - break; - } - default: - tor_assert(0); - break; - } - - return data_dup; -} - -/* Compute the descriptor ID for each HS descriptor replica and save them. A - * valid onion address must be present in the rend_data. - * - * Return 0 on success else -1. */ -static int -compute_desc_id(rend_data_t *rend_data) -{ - int ret = 0; - unsigned replica; - time_t now = time(NULL); - - tor_assert(rend_data); - - switch (rend_data->version) { - case HS_VERSION_TWO: - { - rend_data_v2_t *v2_data = TO_REND_DATA_V2(rend_data); - /* Compute descriptor ID for each replicas. */ - for (replica = 0; replica < ARRAY_LENGTH(v2_data->descriptor_id); - replica++) { - ret = rend_compute_v2_desc_id(v2_data->descriptor_id[replica], - v2_data->onion_address, - v2_data->descriptor_cookie, - now, replica); - if (ret < 0) { - goto end; - } - } - break; - } - default: - tor_assert(0); - } - - end: - return ret; -} - -/* Allocate and initialize a rend_data_t object for a service using the - * provided arguments. All arguments are optional (can be NULL), except from - * onion_address which MUST be set. The pk_digest is the hash of - * the service private key. The cookie is the rendezvous cookie and - * auth_type is which authentiation this service is configured with. - * - * Return a valid rend_data_t pointer. This only returns a version 2 object of - * rend_data_t. */ -rend_data_t * -rend_data_service_create(const char *onion_address, const char *pk_digest, - const uint8_t *cookie, rend_auth_type_t auth_type) -{ - /* Create a rend_data_t object for version 2. */ - rend_data_t *rend_data = rend_data_alloc(HS_VERSION_TWO); - rend_data_v2_t *v2= TO_REND_DATA_V2(rend_data); - - /* We need at least one else the call is wrong. */ - tor_assert(onion_address != NULL); - - if (pk_digest) { - memcpy(v2->rend_pk_digest, pk_digest, sizeof(v2->rend_pk_digest)); - } - if (cookie) { - memcpy(rend_data->rend_cookie, cookie, sizeof(rend_data->rend_cookie)); - } - - strlcpy(v2->onion_address, onion_address, sizeof(v2->onion_address)); - v2->auth_type = auth_type; - - return rend_data; -} - -/* Allocate and initialize a rend_data_t object for a client request using the - * given arguments. Either an onion address or a descriptor ID is needed. Both - * can be given but in this case only the onion address will be used to make - * the descriptor fetch. The cookie is the rendezvous cookie and - * auth_type is which authentiation the service is configured with. - * - * Return a valid rend_data_t pointer or NULL on error meaning the - * descriptor IDs couldn't be computed from the given data. */ -rend_data_t * -rend_data_client_create(const char *onion_address, const char *desc_id, - const char *cookie, rend_auth_type_t auth_type) -{ - /* Create a rend_data_t object for version 2. */ - rend_data_t *rend_data = rend_data_alloc(HS_VERSION_TWO); - rend_data_v2_t *v2= TO_REND_DATA_V2(rend_data); - - /* We need at least one else the call is wrong. */ - tor_assert(onion_address != NULL || desc_id != NULL); - - if (cookie) { - memcpy(v2->descriptor_cookie, cookie, sizeof(v2->descriptor_cookie)); - } - if (desc_id) { - memcpy(v2->desc_id_fetch, desc_id, sizeof(v2->desc_id_fetch)); - } - if (onion_address) { - strlcpy(v2->onion_address, onion_address, sizeof(v2->onion_address)); - if (compute_desc_id(rend_data) < 0) { - goto error; - } - } - - v2->auth_type = auth_type; - - return rend_data; - - error: - rend_data_free(rend_data); - return NULL; -} - -/* Return the onion address from the rend data. Depending on the version, - * the size of the address can vary but it's always NUL terminated. */ -const char * -rend_data_get_address(const rend_data_t *rend_data) -{ - tor_assert(rend_data); - - switch (rend_data->version) { - case HS_VERSION_TWO: - return TO_REND_DATA_V2(rend_data)->onion_address; - default: - /* We should always have a supported version. */ - tor_assert(0); - } -} - -/* Return the descriptor ID for a specific replica number from the rend - * data. The returned data is a binary digest and depending on the version its - * size can vary. The size of the descriptor ID is put in len_out if - * non NULL. */ -const char * -rend_data_get_desc_id(const rend_data_t *rend_data, uint8_t replica, - size_t *len_out) -{ - tor_assert(rend_data); - - switch (rend_data->version) { - case HS_VERSION_TWO: - tor_assert(replica < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS); - if (len_out) { - *len_out = DIGEST_LEN; - } - return TO_REND_DATA_V2(rend_data)->descriptor_id[replica]; - default: - /* We should always have a supported version. */ - tor_assert(0); - } -} - -/* Return the public key digest using the given rend_data. The size of - * the digest is put in len_out (if set) which can differ depending on - * the version. */ -const uint8_t * -rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out) -{ - tor_assert(rend_data); - - switch (rend_data->version) { - case HS_VERSION_TWO: - { - const rend_data_v2_t *v2_data = TO_REND_DATA_V2(rend_data); - if (len_out) { - *len_out = sizeof(v2_data->rend_pk_digest); - } - return (const uint8_t *) v2_data->rend_pk_digest; - } - default: - /* We should always have a supported version. */ - tor_assert(0); - } -} - -/* Using the given time period number, compute the disaster shared random - * value and put it in srv_out. It MUST be at least DIGEST256_LEN bytes. */ -static void -compute_disaster_srv(uint64_t time_period_num, uint8_t *srv_out) -{ - crypto_digest_t *digest; - - tor_assert(srv_out); - - digest = crypto_digest256_new(DIGEST_SHA3_256); - - /* Start setting up payload: - * H("shared-random-disaster" | INT_8(period_length) | INT_8(period_num)) */ - crypto_digest_add_bytes(digest, HS_SRV_DISASTER_PREFIX, - HS_SRV_DISASTER_PREFIX_LEN); - - /* Setup INT_8(period_length) | INT_8(period_num) */ - { - uint64_t time_period_length = get_time_period_length(); - char period_stuff[sizeof(uint64_t)*2]; - size_t offset = 0; - set_uint64(period_stuff, tor_htonll(time_period_length)); - offset += sizeof(uint64_t); - set_uint64(period_stuff+offset, tor_htonll(time_period_num)); - offset += sizeof(uint64_t); - tor_assert(offset == sizeof(period_stuff)); - - crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff)); - } - - crypto_digest_get_digest(digest, (char *) srv_out, DIGEST256_LEN); - crypto_digest_free(digest); -} - -/** Due to the high cost of computing the disaster SRV and that potentially we - * would have to do it thousands of times in a row, we always cache the - * computer disaster SRV (and its corresponding time period num) in case we - * want to reuse it soon after. We need to cache two SRVs, one for each active - * time period. - */ -static uint8_t cached_disaster_srv[2][DIGEST256_LEN]; -static uint64_t cached_time_period_nums[2] = {0}; - -/** Compute the disaster SRV value for this time_period_num and put it - * in srv_out (of size at least DIGEST256_LEN). First check our caches - * to see if we have already computed it. */ -STATIC void -get_disaster_srv(uint64_t time_period_num, uint8_t *srv_out) -{ - if (time_period_num == cached_time_period_nums[0]) { - memcpy(srv_out, cached_disaster_srv[0], DIGEST256_LEN); - return; - } else if (time_period_num == cached_time_period_nums[1]) { - memcpy(srv_out, cached_disaster_srv[1], DIGEST256_LEN); - return; - } else { - int replace_idx; - // Replace the lower period number. - if (cached_time_period_nums[0] <= cached_time_period_nums[1]) { - replace_idx = 0; - } else { - replace_idx = 1; - } - cached_time_period_nums[replace_idx] = time_period_num; - compute_disaster_srv(time_period_num, cached_disaster_srv[replace_idx]); - memcpy(srv_out, cached_disaster_srv[replace_idx], DIGEST256_LEN); - return; - } -} - -#ifdef TOR_UNIT_TESTS - -/** Get the first cached disaster SRV. Only used by unittests. */ -STATIC uint8_t * -get_first_cached_disaster_srv(void) -{ - return cached_disaster_srv[0]; -} - -/** Get the second cached disaster SRV. Only used by unittests. */ -STATIC uint8_t * -get_second_cached_disaster_srv(void) -{ - return cached_disaster_srv[1]; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - -/* When creating a blinded key, we need a parameter which construction is as - * follow: H(pubkey | [secret] | ed25519-basepoint | nonce). - * - * The nonce has a pre-defined format which uses the time period number - * period_num and the start of the period in second start_time_period. - * - * The secret of size secret_len is optional meaning that it can be NULL and - * thus will be ignored for the param construction. - * - * The result is put in param_out. */ -static void -build_blinded_key_param(const ed25519_public_key_t *pubkey, - const uint8_t *secret, size_t secret_len, - uint64_t period_num, uint64_t period_length, - uint8_t *param_out) -{ - size_t offset = 0; - const char blind_str[] = "Derive temporary signing key"; - uint8_t nonce[HS_KEYBLIND_NONCE_LEN]; - crypto_digest_t *digest; - - tor_assert(pubkey); - tor_assert(param_out); - - /* Create the nonce N. The construction is as follow: - * N = "key-blind" || INT_8(period_num) || INT_8(period_length) */ - memcpy(nonce, HS_KEYBLIND_NONCE_PREFIX, HS_KEYBLIND_NONCE_PREFIX_LEN); - offset += HS_KEYBLIND_NONCE_PREFIX_LEN; - set_uint64(nonce + offset, tor_htonll(period_num)); - offset += sizeof(uint64_t); - set_uint64(nonce + offset, tor_htonll(period_length)); - offset += sizeof(uint64_t); - tor_assert(offset == HS_KEYBLIND_NONCE_LEN); - - /* Generate the parameter h and the construction is as follow: - * h = H(BLIND_STRING | pubkey | [secret] | ed25519-basepoint | N) */ - digest = crypto_digest256_new(DIGEST_SHA3_256); - crypto_digest_add_bytes(digest, blind_str, sizeof(blind_str)); - crypto_digest_add_bytes(digest, (char *) pubkey, ED25519_PUBKEY_LEN); - /* Optional secret. */ - if (secret) { - crypto_digest_add_bytes(digest, (char *) secret, secret_len); - } - crypto_digest_add_bytes(digest, str_ed25519_basepoint, - strlen(str_ed25519_basepoint)); - crypto_digest_add_bytes(digest, (char *) nonce, sizeof(nonce)); - - /* Extract digest and put it in the param. */ - crypto_digest_get_digest(digest, (char *) param_out, DIGEST256_LEN); - crypto_digest_free(digest); - - memwipe(nonce, 0, sizeof(nonce)); -} - -/* Using an ed25519 public key and version to build the checksum of an - * address. Put in checksum_out. Format is: - * SHA3-256(".onion checksum" || PUBKEY || VERSION) - * - * checksum_out must be large enough to receive 32 bytes (DIGEST256_LEN). */ -static void -build_hs_checksum(const ed25519_public_key_t *key, uint8_t version, - uint8_t *checksum_out) -{ - size_t offset = 0; - char data[HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN]; - - /* Build checksum data. */ - memcpy(data, HS_SERVICE_ADDR_CHECKSUM_PREFIX, - HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN); - offset += HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN; - memcpy(data + offset, key->pubkey, ED25519_PUBKEY_LEN); - offset += ED25519_PUBKEY_LEN; - set_uint8(data + offset, version); - offset += sizeof(version); - tor_assert(offset == HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN); - - /* Hash the data payload to create the checksum. */ - crypto_digest256((char *) checksum_out, data, sizeof(data), - DIGEST_SHA3_256); -} - -/* Using an ed25519 public key, checksum and version to build the binary - * representation of a service address. Put in addr_out. Format is: - * addr_out = PUBKEY || CHECKSUM || VERSION - * - * addr_out must be large enough to receive HS_SERVICE_ADDR_LEN bytes. */ -static void -build_hs_address(const ed25519_public_key_t *key, const uint8_t *checksum, - uint8_t version, char *addr_out) -{ - size_t offset = 0; - - tor_assert(key); - tor_assert(checksum); - - memcpy(addr_out, key->pubkey, ED25519_PUBKEY_LEN); - offset += ED25519_PUBKEY_LEN; - memcpy(addr_out + offset, checksum, HS_SERVICE_ADDR_CHECKSUM_LEN_USED); - offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED; - set_uint8(addr_out + offset, version); - offset += sizeof(uint8_t); - tor_assert(offset == HS_SERVICE_ADDR_LEN); -} - -/* Helper for hs_parse_address(): Using a binary representation of a service - * address, parse its content into the key_out, checksum_out and version_out. - * Any out variable can be NULL in case the caller would want only one field. - * checksum_out MUST at least be 2 bytes long. address must be at least - * HS_SERVICE_ADDR_LEN bytes but doesn't need to be NUL terminated. */ -static void -hs_parse_address_impl(const char *address, ed25519_public_key_t *key_out, - uint8_t *checksum_out, uint8_t *version_out) -{ - size_t offset = 0; - - tor_assert(address); - - if (key_out) { - /* First is the key. */ - memcpy(key_out->pubkey, address, ED25519_PUBKEY_LEN); - } - offset += ED25519_PUBKEY_LEN; - if (checksum_out) { - /* Followed by a 2 bytes checksum. */ - memcpy(checksum_out, address + offset, HS_SERVICE_ADDR_CHECKSUM_LEN_USED); - } - offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED; - if (version_out) { - /* Finally, version value is 1 byte. */ - *version_out = get_uint8(address + offset); - } - offset += sizeof(uint8_t); - /* Extra safety. */ - tor_assert(offset == HS_SERVICE_ADDR_LEN); -} - -/* Using the given identity public key and a blinded public key, compute the - * subcredential and put it in subcred_out (must be of size DIGEST256_LEN). - * This can't fail. */ -void -hs_get_subcredential(const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - uint8_t *subcred_out) -{ - uint8_t credential[DIGEST256_LEN]; - crypto_digest_t *digest; - - tor_assert(identity_pk); - tor_assert(blinded_pk); - tor_assert(subcred_out); - - /* First, build the credential. Construction is as follow: - * credential = H("credential" | public-identity-key) */ - digest = crypto_digest256_new(DIGEST_SHA3_256); - crypto_digest_add_bytes(digest, HS_CREDENTIAL_PREFIX, - HS_CREDENTIAL_PREFIX_LEN); - crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey, - ED25519_PUBKEY_LEN); - crypto_digest_get_digest(digest, (char *) credential, DIGEST256_LEN); - crypto_digest_free(digest); - - /* Now, compute the subcredential. Construction is as follow: - * subcredential = H("subcredential" | credential | blinded-public-key). */ - digest = crypto_digest256_new(DIGEST_SHA3_256); - crypto_digest_add_bytes(digest, HS_SUBCREDENTIAL_PREFIX, - HS_SUBCREDENTIAL_PREFIX_LEN); - crypto_digest_add_bytes(digest, (const char *) credential, - sizeof(credential)); - crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey, - ED25519_PUBKEY_LEN); - crypto_digest_get_digest(digest, (char *) subcred_out, DIGEST256_LEN); - crypto_digest_free(digest); - - memwipe(credential, 0, sizeof(credential)); -} - -/* From the given list of hidden service ports, find the ones that much the - * given edge connection conn, pick one at random and use it to set the - * connection address. Return 0 on success or -1 if none. */ -int -hs_set_conn_addr_port(const smartlist_t *ports, edge_connection_t *conn) -{ - rend_service_port_config_t *chosen_port; - unsigned int warn_once = 0; - smartlist_t *matching_ports; - - tor_assert(ports); - tor_assert(conn); - - matching_ports = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(ports, rend_service_port_config_t *, p) { - if (TO_CONN(conn)->port != p->virtual_port) { - continue; - } - if (!(p->is_unix_addr)) { - smartlist_add(matching_ports, p); - } else { - if (add_unix_port(matching_ports, p)) { - if (!warn_once) { - /* Unix port not supported so warn only once. */ - log_warn(LD_REND, "Saw AF_UNIX virtual port mapping for port %d " - "which is unsupported on this platform. " - "Ignoring it.", - TO_CONN(conn)->port); - } - warn_once++; - } - } - } SMARTLIST_FOREACH_END(p); - - chosen_port = smartlist_choose(matching_ports); - smartlist_free(matching_ports); - if (chosen_port) { - if (!(chosen_port->is_unix_addr)) { - /* Get a non-AF_UNIX connection ready for connection_exit_connect() */ - tor_addr_copy(&TO_CONN(conn)->addr, &chosen_port->real_addr); - TO_CONN(conn)->port = chosen_port->real_port; - } else { - if (set_unix_port(conn, chosen_port)) { - /* Simply impossible to end up here else we were able to add a Unix - * port without AF_UNIX support... ? */ - tor_assert(0); - } - } - } - return (chosen_port) ? 0 : -1; -} - -/* Using a base32 representation of a service address, parse its content into - * the key_out, checksum_out and version_out. Any out variable can be NULL in - * case the caller would want only one field. checksum_out MUST at least be 2 - * bytes long. - * - * Return 0 if parsing went well; return -1 in case of error. */ -int -hs_parse_address(const char *address, ed25519_public_key_t *key_out, - uint8_t *checksum_out, uint8_t *version_out) -{ - char decoded[HS_SERVICE_ADDR_LEN]; - - tor_assert(address); - - /* Obvious length check. */ - if (strlen(address) != HS_SERVICE_ADDR_LEN_BASE32) { - log_warn(LD_REND, "Service address %s has an invalid length. " - "Expected %lu but got %lu.", - escaped_safe_str(address), - (unsigned long) HS_SERVICE_ADDR_LEN_BASE32, - (unsigned long) strlen(address)); - goto invalid; - } - - /* Decode address so we can extract needed fields. */ - if (base32_decode(decoded, sizeof(decoded), address, strlen(address)) < 0) { - log_warn(LD_REND, "Service address %s can't be decoded.", - escaped_safe_str(address)); - goto invalid; - } - - /* Parse the decoded address into the fields we need. */ - hs_parse_address_impl(decoded, key_out, checksum_out, version_out); - - return 0; - invalid: - return -1; -} - -/* Validate a given onion address. The length, the base32 decoding and - * checksum are validated. Return 1 if valid else 0. */ -int -hs_address_is_valid(const char *address) -{ - uint8_t version; - uint8_t checksum[HS_SERVICE_ADDR_CHECKSUM_LEN_USED]; - uint8_t target_checksum[DIGEST256_LEN]; - ed25519_public_key_t service_pubkey; - - /* Parse the decoded address into the fields we need. */ - if (hs_parse_address(address, &service_pubkey, checksum, &version) < 0) { - goto invalid; - } - - /* Get the checksum it's suppose to be and compare it with what we have - * encoded in the address. */ - build_hs_checksum(&service_pubkey, version, target_checksum); - if (tor_memcmp(checksum, target_checksum, sizeof(checksum))) { - log_warn(LD_REND, "Service address %s invalid checksum.", - escaped_safe_str(address)); - goto invalid; - } - - /* Validate that this pubkey does not have a torsion component. We need to do - * this on the prop224 client-side so that attackers can't give equivalent - * forms of an onion address to users. */ - if (ed25519_validate_pubkey(&service_pubkey) < 0) { - log_warn(LD_REND, "Service address %s has bad pubkey .", - escaped_safe_str(address)); - goto invalid; - } - - /* Valid address. */ - return 1; - invalid: - return 0; -} - -/* Build a service address using an ed25519 public key and a given version. - * The returned address is base32 encoded and put in addr_out. The caller MUST - * make sure the addr_out is at least HS_SERVICE_ADDR_LEN_BASE32 + 1 long. - * - * Format is as follow: - * base32(PUBKEY || CHECKSUM || VERSION) - * CHECKSUM = H(".onion checksum" || PUBKEY || VERSION) - * */ -void -hs_build_address(const ed25519_public_key_t *key, uint8_t version, - char *addr_out) -{ - uint8_t checksum[DIGEST256_LEN]; - char address[HS_SERVICE_ADDR_LEN]; - - tor_assert(key); - tor_assert(addr_out); - - /* Get the checksum of the address. */ - build_hs_checksum(key, version, checksum); - /* Get the binary address representation. */ - build_hs_address(key, checksum, version, address); - - /* Encode the address. addr_out will be NUL terminated after this. */ - base32_encode(addr_out, HS_SERVICE_ADDR_LEN_BASE32 + 1, address, - sizeof(address)); - /* Validate what we just built. */ - tor_assert(hs_address_is_valid(addr_out)); -} - -/* Return a newly allocated copy of lspec. */ -link_specifier_t * -hs_link_specifier_dup(const link_specifier_t *lspec) -{ - link_specifier_t *dup = link_specifier_new(); - memcpy(dup, lspec, sizeof(*dup)); - /* The unrecognized field is a dynamic array so make sure to copy its - * content and not the pointer. */ - link_specifier_setlen_un_unrecognized( - dup, link_specifier_getlen_un_unrecognized(lspec)); - if (link_specifier_getlen_un_unrecognized(dup)) { - memcpy(link_specifier_getarray_un_unrecognized(dup), - link_specifier_getconstarray_un_unrecognized(lspec), - link_specifier_getlen_un_unrecognized(dup)); - } - return dup; -} - -/* From a given ed25519 public key pk and an optional secret, compute a - * blinded public key and put it in blinded_pk_out. This is only useful to - * the client side because the client only has access to the identity public - * key of the service. */ -void -hs_build_blinded_pubkey(const ed25519_public_key_t *pk, - const uint8_t *secret, size_t secret_len, - uint64_t time_period_num, - ed25519_public_key_t *blinded_pk_out) -{ - /* Our blinding key API requires a 32 bytes parameter. */ - uint8_t param[DIGEST256_LEN]; - - tor_assert(pk); - tor_assert(blinded_pk_out); - tor_assert(!tor_mem_is_zero((char *) pk, ED25519_PUBKEY_LEN)); - - build_blinded_key_param(pk, secret, secret_len, - time_period_num, get_time_period_length(), param); - ed25519_public_blind(blinded_pk_out, pk, param); - - memwipe(param, 0, sizeof(param)); -} - -/* From a given ed25519 keypair kp and an optional secret, compute a blinded - * keypair for the current time period and put it in blinded_kp_out. This is - * only useful by the service side because the client doesn't have access to - * the identity secret key. */ -void -hs_build_blinded_keypair(const ed25519_keypair_t *kp, - const uint8_t *secret, size_t secret_len, - uint64_t time_period_num, - ed25519_keypair_t *blinded_kp_out) -{ - /* Our blinding key API requires a 32 bytes parameter. */ - uint8_t param[DIGEST256_LEN]; - - tor_assert(kp); - tor_assert(blinded_kp_out); - /* Extra safety. A zeroed key is bad. */ - tor_assert(!tor_mem_is_zero((char *) &kp->pubkey, ED25519_PUBKEY_LEN)); - tor_assert(!tor_mem_is_zero((char *) &kp->seckey, ED25519_SECKEY_LEN)); - - build_blinded_key_param(&kp->pubkey, secret, secret_len, - time_period_num, get_time_period_length(), param); - ed25519_keypair_blind(blinded_kp_out, kp, param); - - memwipe(param, 0, sizeof(param)); -} - -/* Return true if we are currently in the time segment between a new time - * period and a new SRV (in the real network that happens between 12:00 and - * 00:00 UTC). Here is a diagram showing exactly when this returns true: - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^^^^^^^^^^^^ ^^^^^^^^^^^^ | - * | | - * +------------------------------------------------------------------+ - */ -MOCK_IMPL(int, -hs_in_period_between_tp_and_srv,(const networkstatus_t *consensus, time_t now)) -{ - time_t valid_after; - time_t srv_start_time, tp_start_time; - - if (!consensus) { - consensus = networkstatus_get_live_consensus(now); - if (!consensus) { - return 0; - } - } - - /* Get start time of next TP and of current SRV protocol run, and check if we - * are between them. */ - valid_after = consensus->valid_after; - srv_start_time = - sr_state_get_start_time_of_current_protocol_run(valid_after); - tp_start_time = hs_get_start_time_of_next_time_period(srv_start_time); - - if (valid_after >= srv_start_time && valid_after < tp_start_time) { - return 0; - } - - return 1; -} - -/* Return 1 if any virtual port in ports needs a circuit with good uptime. - * Else return 0. */ -int -hs_service_requires_uptime_circ(const smartlist_t *ports) -{ - tor_assert(ports); - - SMARTLIST_FOREACH_BEGIN(ports, rend_service_port_config_t *, p) { - if (smartlist_contains_int_as_string(get_options()->LongLivedPorts, - p->virtual_port)) { - return 1; - } - } SMARTLIST_FOREACH_END(p); - return 0; -} - -/* Build hs_index which is used to find the responsible hsdirs. This index - * value is used to select the responsible HSDir where their hsdir_index is - * closest to this value. - * SHA3-256("store-at-idx" | blinded_public_key | - * INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) ) - * - * hs_index_out must be large enough to receive DIGEST256_LEN bytes. */ -void -hs_build_hs_index(uint64_t replica, const ed25519_public_key_t *blinded_pk, - uint64_t period_num, uint8_t *hs_index_out) -{ - crypto_digest_t *digest; - - tor_assert(blinded_pk); - tor_assert(hs_index_out); - - /* Build hs_index. See construction at top of function comment. */ - digest = crypto_digest256_new(DIGEST_SHA3_256); - crypto_digest_add_bytes(digest, HS_INDEX_PREFIX, HS_INDEX_PREFIX_LEN); - crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey, - ED25519_PUBKEY_LEN); - - /* Now setup INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) */ - { - uint64_t period_length = get_time_period_length(); - char buf[sizeof(uint64_t)*3]; - size_t offset = 0; - set_uint64(buf, tor_htonll(replica)); - offset += sizeof(uint64_t); - set_uint64(buf+offset, tor_htonll(period_length)); - offset += sizeof(uint64_t); - set_uint64(buf+offset, tor_htonll(period_num)); - offset += sizeof(uint64_t); - tor_assert(offset == sizeof(buf)); - - crypto_digest_add_bytes(digest, buf, sizeof(buf)); - } - - crypto_digest_get_digest(digest, (char *) hs_index_out, DIGEST256_LEN); - crypto_digest_free(digest); -} - -/* Build hsdir_index which is used to find the responsible hsdirs. This is the - * index value that is compare to the hs_index when selecting an HSDir. - * SHA3-256("node-idx" | node_identity | - * shared_random_value | INT_8(period_length) | INT_8(period_num) ) - * - * hsdir_index_out must be large enough to receive DIGEST256_LEN bytes. */ -void -hs_build_hsdir_index(const ed25519_public_key_t *identity_pk, - const uint8_t *srv_value, uint64_t period_num, - uint8_t *hsdir_index_out) -{ - crypto_digest_t *digest; - - tor_assert(identity_pk); - tor_assert(srv_value); - tor_assert(hsdir_index_out); - - /* Build hsdir_index. See construction at top of function comment. */ - digest = crypto_digest256_new(DIGEST_SHA3_256); - crypto_digest_add_bytes(digest, HSDIR_INDEX_PREFIX, HSDIR_INDEX_PREFIX_LEN); - crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey, - ED25519_PUBKEY_LEN); - crypto_digest_add_bytes(digest, (const char *) srv_value, DIGEST256_LEN); - - { - uint64_t time_period_length = get_time_period_length(); - char period_stuff[sizeof(uint64_t)*2]; - size_t offset = 0; - set_uint64(period_stuff, tor_htonll(period_num)); - offset += sizeof(uint64_t); - set_uint64(period_stuff+offset, tor_htonll(time_period_length)); - offset += sizeof(uint64_t); - tor_assert(offset == sizeof(period_stuff)); - - crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff)); - } - - crypto_digest_get_digest(digest, (char *) hsdir_index_out, DIGEST256_LEN); - crypto_digest_free(digest); -} - -/* Return a newly allocated buffer containing the current shared random value - * or if not present, a disaster value is computed using the given time period - * number. If a consensus is provided in ns, use it to get the SRV - * value. This function can't fail. */ -uint8_t * -hs_get_current_srv(uint64_t time_period_num, const networkstatus_t *ns) -{ - uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN); - const sr_srv_t *current_srv = sr_get_current(ns); - - if (current_srv) { - memcpy(sr_value, current_srv->value, sizeof(current_srv->value)); - } else { - /* Disaster mode. */ - get_disaster_srv(time_period_num, sr_value); - } - return sr_value; -} - -/* Return a newly allocated buffer containing the previous shared random - * value or if not present, a disaster value is computed using the given time - * period number. This function can't fail. */ -uint8_t * -hs_get_previous_srv(uint64_t time_period_num, const networkstatus_t *ns) -{ - uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN); - const sr_srv_t *previous_srv = sr_get_previous(ns); - - if (previous_srv) { - memcpy(sr_value, previous_srv->value, sizeof(previous_srv->value)); - } else { - /* Disaster mode. */ - get_disaster_srv(time_period_num, sr_value); - } - return sr_value; -} - -/* Return the number of replicas defined by a consensus parameter or the - * default value. */ -int32_t -hs_get_hsdir_n_replicas(void) -{ - /* The [1,16] range is a specification requirement. */ - return networkstatus_get_param(NULL, "hsdir_n_replicas", - HS_DEFAULT_HSDIR_N_REPLICAS, 1, 16); -} - -/* Return the spread fetch value defined by a consensus parameter or the - * default value. */ -int32_t -hs_get_hsdir_spread_fetch(void) -{ - /* The [1,128] range is a specification requirement. */ - return networkstatus_get_param(NULL, "hsdir_spread_fetch", - HS_DEFAULT_HSDIR_SPREAD_FETCH, 1, 128); -} - -/* Return the spread store value defined by a consensus parameter or the - * default value. */ -int32_t -hs_get_hsdir_spread_store(void) -{ - /* The [1,128] range is a specification requirement. */ - return networkstatus_get_param(NULL, "hsdir_spread_store", - HS_DEFAULT_HSDIR_SPREAD_STORE, 1, 128); -} - -/** node is an HSDir so make sure that we have assigned an hsdir index. - * Return 0 if everything is as expected, else return -1. */ -static int -node_has_hsdir_index(const node_t *node) -{ - tor_assert(node_supports_v3_hsdir(node)); - - /* A node can't have an HSDir index without a descriptor since we need desc - * to get its ed25519 key */ - if (!node_has_descriptor(node)) { - return 0; - } - - /* At this point, since the node has a desc, this node must also have an - * hsdir index. If not, something went wrong, so BUG out. */ - if (BUG(node->hsdir_index == NULL)) { - return 0; - } - if (BUG(tor_mem_is_zero((const char*)node->hsdir_index->fetch, - DIGEST256_LEN))) { - return 0; - } - if (BUG(tor_mem_is_zero((const char*)node->hsdir_index->store_first, - DIGEST256_LEN))) { - return 0; - } - if (BUG(tor_mem_is_zero((const char*)node->hsdir_index->store_second, - DIGEST256_LEN))) { - return 0; - } - - return 1; -} - -/* For a given blinded key and time period number, get the responsible HSDir - * and put their routerstatus_t object in the responsible_dirs list. If - * 'use_second_hsdir_index' is true, use the second hsdir_index of the node_t - * is used. If 'for_fetching' is true, the spread fetch consensus parameter is - * used else the spread store is used which is only for upload. This function - * can't fail but it is possible that the responsible_dirs list contains fewer - * nodes than expected. - * - * This function goes over the latest consensus routerstatus list and sorts it - * by their node_t hsdir_index then does a binary search to find the closest - * node. All of this makes it a bit CPU intensive so use it wisely. */ -void -hs_get_responsible_hsdirs(const ed25519_public_key_t *blinded_pk, - uint64_t time_period_num, int use_second_hsdir_index, - int for_fetching, smartlist_t *responsible_dirs) -{ - smartlist_t *sorted_nodes; - /* The compare function used for the smartlist bsearch. We have two - * different depending on is_next_period. */ - int (*cmp_fct)(const void *, const void **); - - tor_assert(blinded_pk); - tor_assert(responsible_dirs); - - sorted_nodes = smartlist_new(); - - /* Add every node_t that support HSDir v3 for which we do have a valid - * hsdir_index already computed for them for this consensus. */ - { - networkstatus_t *c = networkstatus_get_latest_consensus(); - if (!c || smartlist_len(c->routerstatus_list) == 0) { - log_warn(LD_REND, "No valid consensus so we can't get the responsible " - "hidden service directories."); - goto done; - } - SMARTLIST_FOREACH_BEGIN(c->routerstatus_list, const routerstatus_t *, rs) { - /* Even though this node_t object won't be modified and should be const, - * we can't add const object in a smartlist_t. */ - node_t *n = node_get_mutable_by_id(rs->identity_digest); - tor_assert(n); - if (node_supports_v3_hsdir(n) && rs->is_hs_dir) { - if (!node_has_hsdir_index(n)) { - log_info(LD_GENERAL, "Node %s was found without hsdir index.", - node_describe(n)); - continue; - } - smartlist_add(sorted_nodes, n); - } - } SMARTLIST_FOREACH_END(rs); - } - if (smartlist_len(sorted_nodes) == 0) { - log_warn(LD_REND, "No nodes found to be HSDir or supporting v3."); - goto done; - } - - /* First thing we have to do is sort all node_t by hsdir_index. The - * is_next_period tells us if we want the current or the next one. Set the - * bsearch compare function also while we are at it. */ - if (for_fetching) { - smartlist_sort(sorted_nodes, compare_node_fetch_hsdir_index); - cmp_fct = compare_digest_to_fetch_hsdir_index; - } else if (use_second_hsdir_index) { - smartlist_sort(sorted_nodes, compare_node_store_second_hsdir_index); - cmp_fct = compare_digest_to_store_second_hsdir_index; - } else { - smartlist_sort(sorted_nodes, compare_node_store_first_hsdir_index); - cmp_fct = compare_digest_to_store_first_hsdir_index; - } - - /* For all replicas, we'll select a set of HSDirs using the consensus - * parameters and the sorted list. The replica starting at value 1 is - * defined by the specification. */ - for (int replica = 1; replica <= hs_get_hsdir_n_replicas(); replica++) { - int idx, start, found, n_added = 0; - uint8_t hs_index[DIGEST256_LEN] = {0}; - /* Number of node to add to the responsible dirs list depends on if we are - * trying to fetch or store. A client always fetches. */ - int n_to_add = (for_fetching) ? hs_get_hsdir_spread_fetch() : - hs_get_hsdir_spread_store(); - - /* Get the index that we should use to select the node. */ - hs_build_hs_index(replica, blinded_pk, time_period_num, hs_index); - /* The compare function pointer has been set correctly earlier. */ - start = idx = smartlist_bsearch_idx(sorted_nodes, hs_index, cmp_fct, - &found); - /* Getting the length of the list if no member is greater than the key we - * are looking for so start at the first element. */ - if (idx == smartlist_len(sorted_nodes)) { - start = idx = 0; - } - while (n_added < n_to_add) { - const node_t *node = smartlist_get(sorted_nodes, idx); - /* If the node has already been selected which is possible between - * replicas, the specification says to skip over. */ - if (!smartlist_contains(responsible_dirs, node->rs)) { - smartlist_add(responsible_dirs, node->rs); - ++n_added; - } - if (++idx == smartlist_len(sorted_nodes)) { - /* Wrap if we've reached the end of the list. */ - idx = 0; - } - if (idx == start) { - /* We've gone over the whole list, stop and avoid infinite loop. */ - break; - } - } - } - - done: - smartlist_free(sorted_nodes); -} - -/*********************** HSDir request tracking ***************************/ - -/** Return the period for which a hidden service directory cannot be queried - * for the same descriptor ID again, taking TestingTorNetwork into account. */ -time_t -hs_hsdir_requery_period(const or_options_t *options) -{ - tor_assert(options); - - if (options->TestingTorNetwork) { - return REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING; - } else { - return REND_HID_SERV_DIR_REQUERY_PERIOD; - } -} - -/** Tracks requests for fetching hidden service descriptors. It's used by - * hidden service clients, to avoid querying HSDirs that have already failed - * giving back a descriptor. The same data structure is used to track both v2 - * and v3 HS descriptor requests. - * - * The string map is a key/value store that contains the last request times to - * hidden service directories for certain queries. Specifically: - * - * key = base32(hsdir_identity) + base32(hs_identity) - * value = time_t of last request for that hs_identity to that HSDir - * - * where 'hsdir_identity' is the identity digest of the HSDir node, and - * 'hs_identity' is the descriptor ID of the HS in the v2 case, or the ed25519 - * blinded public key of the HS in the v3 case. */ -static strmap_t *last_hid_serv_requests_ = NULL; - -/** Returns last_hid_serv_requests_, initializing it to a new strmap if - * necessary. */ -STATIC strmap_t * -get_last_hid_serv_requests(void) -{ - if (!last_hid_serv_requests_) - last_hid_serv_requests_ = strmap_new(); - return last_hid_serv_requests_; -} - -/** Look up the last request time to hidden service directory hs_dir - * for descriptor request key req_key_str which is the descriptor ID - * for a v2 service or the blinded key for v3. If set is non-zero, - * assign the current time now and return that. Otherwise, return the - * most recent request time, or 0 if no such request has been sent before. */ -time_t -hs_lookup_last_hid_serv_request(routerstatus_t *hs_dir, - const char *req_key_str, - time_t now, int set) -{ - char hsdir_id_base32[BASE32_DIGEST_LEN + 1]; - char *hsdir_desc_comb_id = NULL; - time_t *last_request_ptr; - strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); - - /* Create the key */ - base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32), - hs_dir->identity_digest, DIGEST_LEN); - tor_asprintf(&hsdir_desc_comb_id, "%s%s", hsdir_id_base32, req_key_str); - - if (set) { - time_t *oldptr; - last_request_ptr = tor_malloc_zero(sizeof(time_t)); - *last_request_ptr = now; - oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id, - last_request_ptr); - tor_free(oldptr); - } else { - last_request_ptr = strmap_get(last_hid_serv_requests, - hsdir_desc_comb_id); - } - - tor_free(hsdir_desc_comb_id); - return (last_request_ptr) ? *last_request_ptr : 0; -} - -/** Clean the history of request times to hidden service directories, so that - * it does not contain requests older than REND_HID_SERV_DIR_REQUERY_PERIOD - * seconds any more. */ -void -hs_clean_last_hid_serv_requests(time_t now) -{ - strmap_iter_t *iter; - time_t cutoff = now - hs_hsdir_requery_period(get_options()); - strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); - for (iter = strmap_iter_init(last_hid_serv_requests); - !strmap_iter_done(iter); ) { - const char *key; - void *val; - time_t *ent; - strmap_iter_get(iter, &key, &val); - ent = (time_t *) val; - if (*ent < cutoff) { - iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); - tor_free(ent); - } else { - iter = strmap_iter_next(last_hid_serv_requests, iter); - } - } -} - -/** Remove all requests related to the descriptor request key string - * req_key_str from the history of times of requests to hidden service - * directories. - * - * This is called from rend_client_note_connection_attempt_ended(), which - * must be idempotent, so any future changes to this function must leave it - * idempotent too. */ -void -hs_purge_hid_serv_from_last_hid_serv_requests(const char *req_key_str) -{ - strmap_iter_t *iter; - strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); - - for (iter = strmap_iter_init(last_hid_serv_requests); - !strmap_iter_done(iter); ) { - const char *key; - void *val; - strmap_iter_get(iter, &key, &val); - - /* XXX: The use of REND_DESC_ID_V2_LEN_BASE32 is very wrong in terms of - * semantic, see #23305. */ - - /* This strmap contains variable-sized elements so this is a basic length - * check on the strings we are about to compare. The key is variable sized - * since it's composed as follows: - * key = base32(hsdir_identity) + base32(req_key_str) - * where 'req_key_str' is the descriptor ID of the HS in the v2 case, or - * the ed25519 blinded public key of the HS in the v3 case. */ - if (strlen(key) < REND_DESC_ID_V2_LEN_BASE32 + strlen(req_key_str)) { - iter = strmap_iter_next(last_hid_serv_requests, iter); - continue; - } - - /* Check if the tracked request matches our request key */ - if (tor_memeq(key + REND_DESC_ID_V2_LEN_BASE32, req_key_str, - strlen(req_key_str))) { - iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); - tor_free(val); - } else { - iter = strmap_iter_next(last_hid_serv_requests, iter); - } - } -} - -/** Purge the history of request times to hidden service directories, - * so that future lookups of an HS descriptor will not fail because we - * accessed all of the HSDir relays responsible for the descriptor - * recently. */ -void -hs_purge_last_hid_serv_requests(void) -{ - /* Don't create the table if it doesn't exist yet (and it may very - * well not exist if the user hasn't accessed any HSes)... */ - strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_; - /* ... and let get_last_hid_serv_requests re-create it for us if - * necessary. */ - last_hid_serv_requests_ = NULL; - - if (old_last_hid_serv_requests != NULL) { - log_info(LD_REND, "Purging client last-HS-desc-request-time table"); - strmap_free(old_last_hid_serv_requests, tor_free_); - } -} - -/***********************************************************************/ - -/** Given the list of responsible HSDirs in responsible_dirs, pick the - * one that we should use to fetch a descriptor right now. Take into account - * previous failed attempts at fetching this descriptor from HSDirs using the - * string identifier req_key_str. - * - * Steals ownership of responsible_dirs. - * - * Return the routerstatus of the chosen HSDir if successful, otherwise return - * NULL if no HSDirs are worth trying right now. */ -routerstatus_t * -hs_pick_hsdir(smartlist_t *responsible_dirs, const char *req_key_str) -{ - smartlist_t *usable_responsible_dirs = smartlist_new(); - const or_options_t *options = get_options(); - routerstatus_t *hs_dir; - time_t now = time(NULL); - int excluded_some; - - tor_assert(req_key_str); - - /* Clean outdated request history first. */ - hs_clean_last_hid_serv_requests(now); - - /* Only select those hidden service directories to which we did not send a - * request recently and for which we have a router descriptor here. */ - SMARTLIST_FOREACH_BEGIN(responsible_dirs, routerstatus_t *, dir) { - time_t last = hs_lookup_last_hid_serv_request(dir, req_key_str, 0, 0); - const node_t *node = node_get_by_id(dir->identity_digest); - if (last + hs_hsdir_requery_period(options) >= now || - !node || !node_has_descriptor(node)) { - SMARTLIST_DEL_CURRENT(responsible_dirs, dir); - continue; - } - if (!routerset_contains_node(options->ExcludeNodes, node)) { - smartlist_add(usable_responsible_dirs, dir); - } - } SMARTLIST_FOREACH_END(dir); - - excluded_some = - smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs); - - hs_dir = smartlist_choose(usable_responsible_dirs); - if (!hs_dir && !options->StrictNodes) { - hs_dir = smartlist_choose(responsible_dirs); - } - - smartlist_free(responsible_dirs); - smartlist_free(usable_responsible_dirs); - if (!hs_dir) { - log_info(LD_REND, "Could not pick one of the responsible hidden " - "service directories, because we requested them all " - "recently without success."); - if (options->StrictNodes && excluded_some) { - log_warn(LD_REND, "Could not pick a hidden service directory for the " - "requested hidden service: they are all either down or " - "excluded, and StrictNodes is set."); - } - } else { - /* Remember that we are requesting a descriptor from this hidden service - * directory now. */ - hs_lookup_last_hid_serv_request(hs_dir, req_key_str, now, 1); - } - - return hs_dir; -} - -/* From a list of link specifier, an onion key and if we are requesting a - * direct connection (ex: single onion service), return a newly allocated - * extend_info_t object. This function always returns an extend info with - * an IPv4 address, or NULL. - * - * It performs the following checks: - * if either IPv4 or legacy ID is missing, return NULL. - * if direct_conn, and we can't reach the IPv4 address, return NULL. - */ -extend_info_t * -hs_get_extend_info_from_lspecs(const smartlist_t *lspecs, - const curve25519_public_key_t *onion_key, - int direct_conn) -{ - int have_v4 = 0, have_legacy_id = 0, have_ed25519_id = 0; - char legacy_id[DIGEST_LEN] = {0}; - uint16_t port_v4 = 0; - tor_addr_t addr_v4; - ed25519_public_key_t ed25519_pk; - extend_info_t *info = NULL; - - tor_assert(lspecs); - - SMARTLIST_FOREACH_BEGIN(lspecs, const link_specifier_t *, ls) { - switch (link_specifier_get_ls_type(ls)) { - case LS_IPV4: - /* Skip if we already seen a v4. */ - if (have_v4) continue; - tor_addr_from_ipv4h(&addr_v4, - link_specifier_get_un_ipv4_addr(ls)); - port_v4 = link_specifier_get_un_ipv4_port(ls); - have_v4 = 1; - break; - case LS_LEGACY_ID: - /* Make sure we do have enough bytes for the legacy ID. */ - if (link_specifier_getlen_un_legacy_id(ls) < sizeof(legacy_id)) { - break; - } - memcpy(legacy_id, link_specifier_getconstarray_un_legacy_id(ls), - sizeof(legacy_id)); - have_legacy_id = 1; - break; - case LS_ED25519_ID: - memcpy(ed25519_pk.pubkey, - link_specifier_getconstarray_un_ed25519_id(ls), - ED25519_PUBKEY_LEN); - have_ed25519_id = 1; - break; - default: - /* Ignore unknown. */ - break; - } - } SMARTLIST_FOREACH_END(ls); - - /* Legacy ID is mandatory, and we require IPv4. */ - if (!have_v4 || !have_legacy_id) { - goto done; - } - - /* We know we have IPv4, because we just checked. */ - if (!direct_conn) { - /* All clients can extend to any IPv4 via a 3-hop path. */ - goto validate; - } else if (direct_conn && - fascist_firewall_allows_address_addr(&addr_v4, port_v4, - FIREWALL_OR_CONNECTION, - 0, 0)) { - /* Direct connection and we can reach it in IPv4 so go for it. */ - goto validate; - - /* We will add support for falling back to a 3-hop path in a later - * release. */ - } else { - /* If we can't reach IPv4, return NULL. */ - goto done; - } - - /* We will add support for IPv6 in a later release. */ - - validate: - /* We'll validate now that the address we've picked isn't a private one. If - * it is, are we allowing to extend to private address? */ - if (!extend_info_addr_is_allowed(&addr_v4)) { - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Requested address is private and we are not allowed to extend to " - "it: %s:%u", fmt_addr(&addr_v4), port_v4); - goto done; - } - - /* We do have everything for which we think we can connect successfully. */ - info = extend_info_new(NULL, legacy_id, - (have_ed25519_id) ? &ed25519_pk : NULL, NULL, - onion_key, &addr_v4, port_v4); - done: - return info; -} - -/***********************************************************************/ - -/* Initialize the entire HS subsytem. This is called in tor_init() before any - * torrc options are loaded. Only for >= v3. */ -void -hs_init(void) -{ - hs_circuitmap_init(); - hs_service_init(); - hs_cache_init(); -} - -/* Release and cleanup all memory of the HS subsystem (all version). This is - * called by tor_free_all(). */ -void -hs_free_all(void) -{ - hs_circuitmap_free_all(); - hs_service_free_all(); - hs_cache_free_all(); - hs_client_free_all(); -} - -/* For the given origin circuit circ, decrement the number of rendezvous - * stream counter. This handles every hidden service version. */ -void -hs_dec_rdv_stream_counter(origin_circuit_t *circ) -{ - tor_assert(circ); - - if (circ->rend_data) { - circ->rend_data->nr_streams--; - } else if (circ->hs_ident) { - circ->hs_ident->num_rdv_streams--; - } else { - /* Should not be called if this circuit is not for hidden service. */ - tor_assert_nonfatal_unreached(); - } -} - -/* For the given origin circuit circ, increment the number of rendezvous - * stream counter. This handles every hidden service version. */ -void -hs_inc_rdv_stream_counter(origin_circuit_t *circ) -{ - tor_assert(circ); - - if (circ->rend_data) { - circ->rend_data->nr_streams++; - } else if (circ->hs_ident) { - circ->hs_ident->num_rdv_streams++; - } else { - /* Should not be called if this circuit is not for hidden service. */ - tor_assert_nonfatal_unreached(); - } -} - diff --git a/src/tor/src/or/hs_common.h b/src/tor/src/or/hs_common.h deleted file mode 100644 index f59c2b605..000000000 --- a/src/tor/src/or/hs_common.h +++ /dev/null @@ -1,295 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_common.h - * \brief Header file containing common data for the whole HS subsytem. - **/ - -#ifndef TOR_HS_COMMON_H -#define TOR_HS_COMMON_H - -#include "or.h" - -/* Trunnel */ -#include "ed25519_cert.h" - -/* Protocol version 2. Use this instead of hardcoding "2" in the code base, - * this adds a clearer semantic to the value when used. */ -#define HS_VERSION_TWO 2 -/* Version 3 of the protocol (prop224). */ -#define HS_VERSION_THREE 3 -/* Earliest and latest version we support. */ -#define HS_VERSION_MIN HS_VERSION_TWO -#define HS_VERSION_MAX HS_VERSION_THREE - -/** Try to maintain this many intro points per service by default. */ -#define NUM_INTRO_POINTS_DEFAULT 3 -/** Maximum number of intro points per generic and version 2 service. */ -#define NUM_INTRO_POINTS_MAX 10 -/** Number of extra intro points we launch if our set of intro nodes is empty. - * See proposal 155, section 4. */ -#define NUM_INTRO_POINTS_EXTRA 2 - -/** If we can't build our intro circuits, don't retry for this long. */ -#define INTRO_CIRC_RETRY_PERIOD (60*5) -/** Don't try to build more than this many circuits before giving up for a - * while.*/ -#define MAX_INTRO_CIRCS_PER_PERIOD 10 -/** How many times will a hidden service operator attempt to connect to a - * requested rendezvous point before giving up? */ -#define MAX_REND_FAILURES 1 -/** How many seconds should we spend trying to connect to a requested - * rendezvous point before giving up? */ -#define MAX_REND_TIMEOUT 30 - -/* String prefix for the signature of ESTABLISH_INTRO */ -#define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1" - -/* The default HS time period length */ -#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */ -/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ -#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */ -/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ -#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */ - -/* Prefix of the onion address checksum. */ -#define HS_SERVICE_ADDR_CHECKSUM_PREFIX ".onion checksum" -/* Length of the checksum prefix minus the NUL terminated byte. */ -#define HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN \ - (sizeof(HS_SERVICE_ADDR_CHECKSUM_PREFIX) - 1) -/* Length of the resulting checksum of the address. The construction of this - * checksum looks like: - * CHECKSUM = ".onion checksum" || PUBKEY || VERSION - * where VERSION is 1 byte. This is pre-hashing. */ -#define HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN \ - (HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN + ED25519_PUBKEY_LEN + sizeof(uint8_t)) -/* The amount of bytes we use from the address checksum. */ -#define HS_SERVICE_ADDR_CHECKSUM_LEN_USED 2 -/* Length of the binary encoded service address which is of course before the - * base32 encoding. Construction is: - * PUBKEY || CHECKSUM || VERSION - * with 1 byte VERSION and 2 bytes CHECKSUM. The following is 35 bytes. */ -#define HS_SERVICE_ADDR_LEN \ - (ED25519_PUBKEY_LEN + HS_SERVICE_ADDR_CHECKSUM_LEN_USED + sizeof(uint8_t)) -/* Length of 'y' portion of 'y.onion' URL. This is base32 encoded and the - * length ends up to 56 bytes (not counting the terminated NUL byte.) */ -#define HS_SERVICE_ADDR_LEN_BASE32 \ - (CEIL_DIV(HS_SERVICE_ADDR_LEN * 8, 5)) - -/* The default HS time period length */ -#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */ -/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ -#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */ -/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ -#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */ -/* The time period rotation offset as seen in prop224 section [TIME-PERIODS] */ -#define HS_TIME_PERIOD_ROTATION_OFFSET (12 * 60) /* minutes */ - -/* Keyblinding parameter construction is as follow: - * "key-blind" || INT_8(period_num) || INT_8(start_period_sec) */ -#define HS_KEYBLIND_NONCE_PREFIX "key-blind" -#define HS_KEYBLIND_NONCE_PREFIX_LEN (sizeof(HS_KEYBLIND_NONCE_PREFIX) - 1) -#define HS_KEYBLIND_NONCE_LEN \ - (HS_KEYBLIND_NONCE_PREFIX_LEN + sizeof(uint64_t) + sizeof(uint64_t)) - -/* Credential and subcredential prefix value. */ -#define HS_CREDENTIAL_PREFIX "credential" -#define HS_CREDENTIAL_PREFIX_LEN (sizeof(HS_CREDENTIAL_PREFIX) - 1) -#define HS_SUBCREDENTIAL_PREFIX "subcredential" -#define HS_SUBCREDENTIAL_PREFIX_LEN (sizeof(HS_SUBCREDENTIAL_PREFIX) - 1) - -/* Node hidden service stored at index prefix value. */ -#define HS_INDEX_PREFIX "store-at-idx" -#define HS_INDEX_PREFIX_LEN (sizeof(HS_INDEX_PREFIX) - 1) - -/* Node hidden service directory index prefix value. */ -#define HSDIR_INDEX_PREFIX "node-idx" -#define HSDIR_INDEX_PREFIX_LEN (sizeof(HSDIR_INDEX_PREFIX) - 1) - -/* Prefix of the shared random value disaster mode. */ -#define HS_SRV_DISASTER_PREFIX "shared-random-disaster" -#define HS_SRV_DISASTER_PREFIX_LEN (sizeof(HS_SRV_DISASTER_PREFIX) - 1) - -/* Default value of number of hsdir replicas (hsdir_n_replicas). */ -#define HS_DEFAULT_HSDIR_N_REPLICAS 2 -/* Default value of hsdir spread store (hsdir_spread_store). */ -#define HS_DEFAULT_HSDIR_SPREAD_STORE 4 -/* Default value of hsdir spread fetch (hsdir_spread_fetch). */ -#define HS_DEFAULT_HSDIR_SPREAD_FETCH 3 - -/* The size of a legacy RENDEZVOUS1 cell which adds up to 168 bytes. It is - * bigger than the 84 bytes needed for version 3 so we need to pad up to that - * length so it is indistinguishable between versions. */ -#define HS_LEGACY_RENDEZVOUS_CELL_SIZE \ - (REND_COOKIE_LEN + DH_KEY_LEN + DIGEST_LEN) - -/* Type of authentication key used by an introduction point. */ -typedef enum { - HS_AUTH_KEY_TYPE_LEGACY = 1, - HS_AUTH_KEY_TYPE_ED25519 = 2, -} hs_auth_key_type_t; - -/* Return value when adding an ephemeral service through the ADD_ONION - * control port command. Both v2 and v3 share these. */ -typedef enum { - RSAE_BADAUTH = -5, /**< Invalid auth_type/auth_clients */ - RSAE_BADVIRTPORT = -4, /**< Invalid VIRTPORT/TARGET(s) */ - RSAE_ADDREXISTS = -3, /**< Onion address collision */ - RSAE_BADPRIVKEY = -2, /**< Invalid public key */ - RSAE_INTERNAL = -1, /**< Internal error */ - RSAE_OKAY = 0 /**< Service added as expected */ -} hs_service_add_ephemeral_status_t; - -/* Represents the mapping from a virtual port of a rendezvous service to a - * real port on some IP. */ -typedef struct rend_service_port_config_t { - /* The incoming HS virtual port we're mapping */ - uint16_t virtual_port; - /* Is this an AF_UNIX port? */ - unsigned int is_unix_addr:1; - /* The outgoing TCP port to use, if !is_unix_addr */ - uint16_t real_port; - /* The outgoing IPv4 or IPv6 address to use, if !is_unix_addr */ - tor_addr_t real_addr; - /* The socket path to connect to, if is_unix_addr */ - char unix_addr[FLEXIBLE_ARRAY_MEMBER]; -} rend_service_port_config_t; - -/* Hidden service directory index used in a node_t which is set once we set - * the consensus. */ -typedef struct hsdir_index_t { - /* HSDir index to use when fetching a descriptor. */ - uint8_t fetch[DIGEST256_LEN]; - - /* HSDir index used by services to store their first and second - * descriptor. The first descriptor is chronologically older than the second - * one and uses older TP and SRV values. */ - uint8_t store_first[DIGEST256_LEN]; - uint8_t store_second[DIGEST256_LEN]; -} hsdir_index_t; - -void hs_init(void); -void hs_free_all(void); - -void hs_cleanup_circ(circuit_t *circ); - -int hs_check_service_private_dir(const char *username, const char *path, - unsigned int dir_group_readable, - unsigned int create); -char *hs_path_from_filename(const char *directory, const char *filename); -void hs_build_address(const ed25519_public_key_t *key, uint8_t version, - char *addr_out); -int hs_address_is_valid(const char *address); -int hs_parse_address(const char *address, ed25519_public_key_t *key_out, - uint8_t *checksum_out, uint8_t *version_out); - -void hs_build_blinded_pubkey(const ed25519_public_key_t *pubkey, - const uint8_t *secret, size_t secret_len, - uint64_t time_period_num, - ed25519_public_key_t *pubkey_out); -void hs_build_blinded_keypair(const ed25519_keypair_t *kp, - const uint8_t *secret, size_t secret_len, - uint64_t time_period_num, - ed25519_keypair_t *kp_out); -int hs_service_requires_uptime_circ(const smartlist_t *ports); - -void rend_data_free_(rend_data_t *data); -#define rend_data_free(data) \ - FREE_AND_NULL(rend_data_t, rend_data_free_, (data)) -rend_data_t *rend_data_dup(const rend_data_t *data); -rend_data_t *rend_data_client_create(const char *onion_address, - const char *desc_id, - const char *cookie, - rend_auth_type_t auth_type); -rend_data_t *rend_data_service_create(const char *onion_address, - const char *pk_digest, - const uint8_t *cookie, - rend_auth_type_t auth_type); -const char *rend_data_get_address(const rend_data_t *rend_data); -const char *rend_data_get_desc_id(const rend_data_t *rend_data, - uint8_t replica, size_t *len_out); -const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data, - size_t *len_out); - -routerstatus_t *pick_hsdir(const char *desc_id, const char *desc_id_base32); - -void hs_get_subcredential(const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - uint8_t *subcred_out); - -uint64_t hs_get_previous_time_period_num(time_t now); -uint64_t hs_get_time_period_num(time_t now); -uint64_t hs_get_next_time_period_num(time_t now); -time_t hs_get_start_time_of_next_time_period(time_t now); - -link_specifier_t *hs_link_specifier_dup(const link_specifier_t *lspec); - -MOCK_DECL(int, hs_in_period_between_tp_and_srv, - (const networkstatus_t *consensus, time_t now)); - -uint8_t *hs_get_current_srv(uint64_t time_period_num, - const networkstatus_t *ns); -uint8_t *hs_get_previous_srv(uint64_t time_period_num, - const networkstatus_t *ns); - -void hs_build_hsdir_index(const ed25519_public_key_t *identity_pk, - const uint8_t *srv, uint64_t period_num, - uint8_t *hsdir_index_out); -void hs_build_hs_index(uint64_t replica, - const ed25519_public_key_t *blinded_pk, - uint64_t period_num, uint8_t *hs_index_out); - -int32_t hs_get_hsdir_n_replicas(void); -int32_t hs_get_hsdir_spread_fetch(void); -int32_t hs_get_hsdir_spread_store(void); - -void hs_get_responsible_hsdirs(const ed25519_public_key_t *blinded_pk, - uint64_t time_period_num, - int use_second_hsdir_index, - int for_fetching, smartlist_t *responsible_dirs); -routerstatus_t *hs_pick_hsdir(smartlist_t *responsible_dirs, - const char *req_key_str); - -time_t hs_hsdir_requery_period(const or_options_t *options); -time_t hs_lookup_last_hid_serv_request(routerstatus_t *hs_dir, - const char *desc_id_base32, - time_t now, int set); -void hs_clean_last_hid_serv_requests(time_t now); -void hs_purge_hid_serv_from_last_hid_serv_requests(const char *desc_id); -void hs_purge_last_hid_serv_requests(void); - -int hs_set_conn_addr_port(const smartlist_t *ports, edge_connection_t *conn); - -void hs_inc_rdv_stream_counter(origin_circuit_t *circ); -void hs_dec_rdv_stream_counter(origin_circuit_t *circ); - -extend_info_t *hs_get_extend_info_from_lspecs(const smartlist_t *lspecs, - const curve25519_public_key_t *onion_key, - int direct_conn); - -#ifdef HS_COMMON_PRIVATE - -STATIC void get_disaster_srv(uint64_t time_period_num, uint8_t *srv_out); - -/** The period for which a hidden service directory cannot be queried for - * the same descriptor ID again. */ -#define REND_HID_SERV_DIR_REQUERY_PERIOD (15 * 60) -/** Test networks generate a new consensus every 5 or 10 seconds. - * So allow them to requery HSDirs much faster. */ -#define REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING (5) - -#ifdef TOR_UNIT_TESTS - -STATIC strmap_t *get_last_hid_serv_requests(void); -STATIC uint64_t get_time_period_length(void); - -STATIC uint8_t *get_first_cached_disaster_srv(void); -STATIC uint8_t *get_second_cached_disaster_srv(void); - -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* defined(HS_COMMON_PRIVATE) */ - -#endif /* !defined(TOR_HS_COMMON_H) */ - diff --git a/src/tor/src/or/hs_config.c b/src/tor/src/or/hs_config.c deleted file mode 100644 index fa5c1ab17..000000000 --- a/src/tor/src/or/hs_config.c +++ /dev/null @@ -1,590 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_config.c - * \brief Implement hidden service configuration subsystem. - * - * \details - * - * This file has basically one main entry point: hs_config_service_all(). It - * takes the torrc options and configure hidden service from it. In validate - * mode, nothing is added to the global service list or keys are not generated - * nor loaded. - * - * A service is configured in two steps. It is first created using the tor - * options and then put in a staging list. It will stay there until - * hs_service_load_all_keys() is called. That function is responsible to - * load/generate the keys for the service in the staging list and if - * successful, transfert the service to the main global service list where - * at that point it is ready to be used. - * - * Configuration functions are per-version and there is a main generic one for - * every option that is common to all version (config_generic_service). - **/ - -#define HS_CONFIG_PRIVATE - -#include "hs_common.h" -#include "hs_config.h" -#include "hs_service.h" -#include "rendservice.h" - -/* Using the given list of services, stage them into our global state. Every - * service version are handled. This function can remove entries in the given - * service_list. - * - * Staging a service means that we take all services in service_list and we - * put them in the staging list (global) which acts as a temporary list that - * is used by the service loading key process. In other words, staging a - * service puts it in a list to be considered when loading the keys and then - * moved to the main global list. */ -static void -stage_services(smartlist_t *service_list) -{ - tor_assert(service_list); - - /* This is v2 specific. Trigger service pruning which will make sure the - * just configured services end up in the main global list. It should only - * be done in non validation mode because v2 subsystem handles service - * object differently. */ - rend_service_prune_list(); - - /* Cleanup v2 service from the list, we don't need those object anymore - * because we validated them all against the others and we want to stage - * only >= v3 service. And remember, v2 has a different object type which is - * shadow copied from an hs_service_t type. */ - SMARTLIST_FOREACH_BEGIN(service_list, hs_service_t *, s) { - if (s->config.version == HS_VERSION_TWO) { - SMARTLIST_DEL_CURRENT(service_list, s); - hs_service_free(s); - } - } SMARTLIST_FOREACH_END(s); - - /* This is >= v3 specific. Using the newly configured service list, stage - * them into our global state. Every object ownership is lost after. */ - hs_service_stage_services(service_list); -} - -/* Validate the given service against all service in the given list. If the - * service is ephemeral, this function ignores it. Services with the same - * directory path aren't allowed and will return an error. If a duplicate is - * found, 1 is returned else 0 if none found. */ -static int -service_is_duplicate_in_list(const smartlist_t *service_list, - const hs_service_t *service) -{ - int ret = 0; - - tor_assert(service_list); - tor_assert(service); - - /* Ephemeral service don't have a directory configured so no need to check - * for a service in the list having the same path. */ - if (service->config.is_ephemeral) { - goto end; - } - - /* XXX: Validate if we have any service that has the given service dir path. - * This has two problems: - * - * a) It's O(n^2), but the same comment from the bottom of - * rend_config_services() should apply. - * - * b) We only compare directory paths as strings, so we can't - * detect two distinct paths that specify the same directory - * (which can arise from symlinks, case-insensitivity, bind - * mounts, etc.). - * - * It also can't detect that two separate Tor instances are trying - * to use the same HiddenServiceDir; for that, we would need a - * lock file. But this is enough to detect a simple mistake that - * at least one person has actually made. */ - SMARTLIST_FOREACH_BEGIN(service_list, const hs_service_t *, s) { - if (!strcmp(s->config.directory_path, service->config.directory_path)) { - log_warn(LD_REND, "Another hidden service is already configured " - "for directory %s", - escaped(service->config.directory_path)); - ret = 1; - goto end; - } - } SMARTLIST_FOREACH_END(s); - - end: - return ret; -} - -/* Helper function: Given an configuration option name, its value, a minimum - * min and a maxium max, parse the value as a uint64_t. On success, ok is set - * to 1 and ret is the parsed value. On error, ok is set to 0 and ret must be - * ignored. This function logs both on error and success. */ -static uint64_t -helper_parse_uint64(const char *opt, const char *value, uint64_t min, - uint64_t max, int *ok) -{ - uint64_t ret = 0; - - tor_assert(opt); - tor_assert(value); - tor_assert(ok); - - *ok = 0; - ret = tor_parse_uint64(value, 10, min, max, ok, NULL); - if (!*ok) { - log_warn(LD_CONFIG, "%s must be between %" PRIu64 " and %"PRIu64 - ", not %s.", - opt, min, max, value); - goto err; - } - log_info(LD_CONFIG, "%s was parsed to %" PRIu64, opt, ret); - err: - return ret; -} - -/* Return true iff the given options starting at line_ for a hidden service - * contains at least one invalid option. Each hidden service option don't - * apply to all versions so this function can find out. The line_ MUST start - * right after the HiddenServiceDir line of this service. - * - * This is mainly for usability so we can inform the user of any invalid - * option for the hidden service version instead of silently ignoring. */ -static int -config_has_invalid_options(const config_line_t *line_, - const hs_service_t *service) -{ - int ret = 0; - const char **optlist; - const config_line_t *line; - - tor_assert(service); - tor_assert(service->config.version <= HS_VERSION_MAX); - - /* List of options that a v3 service doesn't support thus must exclude from - * its configuration. */ - const char *opts_exclude_v3[] = { - "HiddenServiceAuthorizeClient", - NULL /* End marker. */ - }; - - /* Defining the size explicitly allows us to take advantage of the compiler - * which warns us if we ever bump the max version but forget to grow this - * array. The plus one is because we have a version 0 :). */ - struct { - const char **list; - } exclude_lists[HS_VERSION_MAX + 1] = { - { NULL }, /* v0. */ - { NULL }, /* v1. */ - { NULL }, /* v2 */ - { opts_exclude_v3 }, /* v3. */ - }; - - optlist = exclude_lists[service->config.version].list; - if (optlist == NULL) { - /* No exclude options to look at for this version. */ - goto end; - } - for (int i = 0; optlist[i]; i++) { - const char *opt = optlist[i]; - for (line = line_; line; line = line->next) { - if (!strcasecmp(line->key, "HiddenServiceDir")) { - /* We just hit the next hidden service, stop right now. */ - goto end; - } - if (!strcasecmp(line->key, opt)) { - log_warn(LD_CONFIG, "Hidden service option %s is incompatible with " - "version %" PRIu32 " of service in %s", - opt, service->config.version, - service->config.directory_path); - ret = 1; - /* Continue the loop so we can find all possible options. */ - continue; - } - } - } - end: - return ret; -} - -/* Validate service configuration. This is used when loading the configuration - * and once we've setup a service object, it's config object is passed to this - * function for further validation. This does not validate service key - * material. Return 0 if valid else -1 if invalid. */ -static int -config_validate_service(const hs_service_config_t *config) -{ - tor_assert(config); - - /* Amount of ports validation. */ - if (!config->ports || smartlist_len(config->ports) == 0) { - log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured.", - escaped(config->directory_path)); - goto invalid; - } - - /* Valid. */ - return 0; - invalid: - return -1; -} - -/* Configuration funcion for a version 3 service. The line_ must be pointing - * to the directive directly after a HiddenServiceDir. That way, when hitting - * the next HiddenServiceDir line or reaching the end of the list of lines, we - * know that we have to stop looking for more options. The given service - * object must be already allocated and passed through - * config_generic_service() prior to calling this function. - * - * Return 0 on success else a negative value. */ -static int -config_service_v3(const config_line_t *line_, - hs_service_config_t *config) -{ - int have_num_ip = 0; - const char *dup_opt_seen = NULL; - const config_line_t *line; - - tor_assert(config); - - for (line = line_; line; line = line->next) { - int ok = 0; - if (!strcasecmp(line->key, "HiddenServiceDir")) { - /* We just hit the next hidden service, stop right now. */ - break; - } - /* Number of introduction points. */ - if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) { - config->num_intro_points = - (unsigned int) helper_parse_uint64(line->key, line->value, - NUM_INTRO_POINTS_DEFAULT, - HS_CONFIG_V3_MAX_INTRO_POINTS, - &ok); - if (!ok || have_num_ip) { - if (have_num_ip) - dup_opt_seen = line->key; - goto err; - } - have_num_ip = 1; - continue; - } - } - - /* We do not load the key material for the service at this stage. This is - * done later once tor can confirm that it is in a running state. */ - - /* We are about to return a fully configured service so do one last pass of - * validation at it. */ - if (config_validate_service(config) < 0) { - goto err; - } - - return 0; - err: - if (dup_opt_seen) { - log_warn(LD_CONFIG, "Duplicate directive %s.", dup_opt_seen); - } - return -1; -} - -/* Configure a service using the given options in line_ and options. This is - * called for any service regardless of its version which means that all - * directives in this function are generic to any service version. This - * function will also check the validity of the service directory path. - * - * The line_ must be pointing to the directive directly after a - * HiddenServiceDir. That way, when hitting the next HiddenServiceDir line or - * reaching the end of the list of lines, we know that we have to stop looking - * for more options. - * - * Return 0 on success else -1. */ -static int -config_generic_service(const config_line_t *line_, - const or_options_t *options, - hs_service_t *service) -{ - int dir_seen = 0; - const config_line_t *line; - hs_service_config_t *config; - /* If this is set, we've seen a duplicate of this option. Keep the string - * so we can log the directive. */ - const char *dup_opt_seen = NULL; - /* These variables will tell us if we ever have duplicate. */ - int have_version = 0, have_allow_unknown_ports = 0; - int have_dir_group_read = 0, have_max_streams = 0; - int have_max_streams_close = 0; - - tor_assert(line_); - tor_assert(options); - tor_assert(service); - - /* Makes thing easier. */ - config = &service->config; - - /* The first line starts with HiddenServiceDir so we consider what's next is - * the configuration of the service. */ - for (line = line_; line ; line = line->next) { - int ok = 0; - - /* This indicate that we have a new service to configure. */ - if (!strcasecmp(line->key, "HiddenServiceDir")) { - /* This function only configures one service at a time so if we've - * already seen one, stop right now. */ - if (dir_seen) { - break; - } - /* Ok, we've seen one and we are about to configure it. */ - dir_seen = 1; - config->directory_path = tor_strdup(line->value); - log_info(LD_CONFIG, "HiddenServiceDir=%s. Configuring...", - escaped(config->directory_path)); - continue; - } - if (BUG(!dir_seen)) { - goto err; - } - /* Version of the service. */ - if (!strcasecmp(line->key, "HiddenServiceVersion")) { - service->config.version = - (uint32_t) helper_parse_uint64(line->key, line->value, HS_VERSION_MIN, - HS_VERSION_MAX, &ok); - if (!ok || have_version) { - if (have_version) - dup_opt_seen = line->key; - goto err; - } - have_version = 1; - continue; - } - /* Virtual port. */ - if (!strcasecmp(line->key, "HiddenServicePort")) { - char *err_msg = NULL; - /* XXX: Can we rename this? */ - rend_service_port_config_t *portcfg = - rend_service_parse_port_config(line->value, " ", &err_msg); - if (!portcfg) { - if (err_msg) { - log_warn(LD_CONFIG, "%s", err_msg); - } - tor_free(err_msg); - goto err; - } - tor_assert(!err_msg); - smartlist_add(config->ports, portcfg); - log_info(LD_CONFIG, "HiddenServicePort=%s for %s", - line->value, escaped(config->directory_path)); - continue; - } - /* Do we allow unknown ports. */ - if (!strcasecmp(line->key, "HiddenServiceAllowUnknownPorts")) { - config->allow_unknown_ports = - (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok); - if (!ok || have_allow_unknown_ports) { - if (have_allow_unknown_ports) - dup_opt_seen = line->key; - goto err; - } - have_allow_unknown_ports = 1; - continue; - } - /* Directory group readable. */ - if (!strcasecmp(line->key, "HiddenServiceDirGroupReadable")) { - config->dir_group_readable = - (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok); - if (!ok || have_dir_group_read) { - if (have_dir_group_read) - dup_opt_seen = line->key; - goto err; - } - have_dir_group_read = 1; - continue; - } - /* Maximum streams per circuit. */ - if (!strcasecmp(line->key, "HiddenServiceMaxStreams")) { - config->max_streams_per_rdv_circuit = - helper_parse_uint64(line->key, line->value, 0, - HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT, &ok); - if (!ok || have_max_streams) { - if (have_max_streams) - dup_opt_seen = line->key; - goto err; - } - have_max_streams = 1; - continue; - } - /* Maximum amount of streams before we close the circuit. */ - if (!strcasecmp(line->key, "HiddenServiceMaxStreamsCloseCircuit")) { - config->max_streams_close_circuit = - (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok); - if (!ok || have_max_streams_close) { - if (have_max_streams_close) - dup_opt_seen = line->key; - goto err; - } - have_max_streams_close = 1; - continue; - } - } - - /* Check if we are configured in non anonymous mode meaning every service - * becomes a single onion service. */ - if (rend_service_non_anonymous_mode_enabled(options)) { - config->is_single_onion = 1; - /* We will add support for IPv6-only v3 single onion services in a future - * Tor version. This won't catch "ReachableAddresses reject *4", but that - * option doesn't work anyway. */ - if (options->ClientUseIPv4 == 0 && config->version == HS_VERSION_THREE) { - log_warn(LD_CONFIG, "IPv6-only v3 single onion services are not " - "supported. Set HiddenServiceSingleHopMode 0 and " - "HiddenServiceNonAnonymousMode 0, or set ClientUseIPv4 1."); - goto err; - } - } - - /* Success */ - return 0; - err: - if (dup_opt_seen) { - log_warn(LD_CONFIG, "Duplicate directive %s.", dup_opt_seen); - } - return -1; -} - -/* Configure a service using the given line and options. This function will - * call the corresponding configuration function for a specific service - * version and validate the service against the other ones. On success, add - * the service to the given list and return 0. On error, nothing is added to - * the list and a negative value is returned. */ -static int -config_service(const config_line_t *line, const or_options_t *options, - smartlist_t *service_list) -{ - int ret; - hs_service_t *service = NULL; - - tor_assert(line); - tor_assert(options); - tor_assert(service_list); - - /* We have a new hidden service. */ - service = hs_service_new(options); - /* We'll configure that service as a generic one and then pass it to a - * specific function according to the configured version number. */ - if (config_generic_service(line, options, service) < 0) { - goto err; - } - tor_assert(service->config.version <= HS_VERSION_MAX); - /* Before we configure the service on a per-version basis, we'll make - * sure that this set of options for a service are valid that is for - * instance an option only for v2 is not used for v3. */ - if (config_has_invalid_options(line->next, service)) { - goto err; - } - /* Check permission on service directory that was just parsed. And this must - * be done regardless of the service version. Do not ask for the directory - * to be created, this is done when the keys are loaded because we could be - * in validation mode right now. */ - if (hs_check_service_private_dir(options->User, - service->config.directory_path, - service->config.dir_group_readable, - 0) < 0) { - goto err; - } - /* Different functions are in charge of specific options for a version. We - * start just after the service directory line so once we hit another - * directory line, the function knows that it has to stop parsing. */ - switch (service->config.version) { - case HS_VERSION_TWO: - ret = rend_config_service(line->next, options, &service->config); - break; - case HS_VERSION_THREE: - ret = config_service_v3(line->next, &service->config); - break; - default: - /* We do validate before if we support the parsed version. */ - tor_assert_nonfatal_unreached(); - goto err; - } - if (ret < 0) { - goto err; - } - /* We'll check if this service can be kept depending on the others - * configured previously. */ - if (service_is_duplicate_in_list(service_list, service)) { - goto err; - } - /* Passes, add it to the given list. */ - smartlist_add(service_list, service); - return 0; - - err: - hs_service_free(service); - return -1; -} - -/* From a set of options, setup every hidden service found. Return 0 on - * success or -1 on failure. If validate_only is set, parse, warn and - * return as normal, but don't actually change the configured services. */ -int -hs_config_service_all(const or_options_t *options, int validate_only) -{ - int dir_option_seen = 0, ret = -1; - const config_line_t *line; - smartlist_t *new_service_list = NULL; - - tor_assert(options); - - /* Newly configured service are put in that list which is then used for - * validation and staging for >= v3. */ - new_service_list = smartlist_new(); - - for (line = options->RendConfigLines; line; line = line->next) { - /* Ignore all directives that aren't the start of a service. */ - if (strcasecmp(line->key, "HiddenServiceDir")) { - if (!dir_option_seen) { - log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive", - line->key); - goto err; - } - continue; - } - /* Flag that we've seen a directory directive and we'll use it to make - * sure that the torrc options ordering is actually valid. */ - dir_option_seen = 1; - - /* Try to configure this service now. On success, it will be added to the - * list and validated against the service in that same list. */ - if (config_service(line, options, new_service_list) < 0) { - goto err; - } - } - - /* In non validation mode, we'll stage those services we just successfully - * configured. Service ownership is transfered from the list to the global - * state. If any service is invalid, it will be removed from the list and - * freed. All versions are handled in that function. */ - if (!validate_only) { - stage_services(new_service_list); - } else { - /* We've just validated that we were able to build a clean working list of - * services. We don't need those objects anymore. */ - SMARTLIST_FOREACH(new_service_list, hs_service_t *, s, - hs_service_free(s)); - /* For the v2 subsystem, the configuration function adds the service - * object to the staging list and it is transferred in the main list - * through the prunning process. In validation mode, we thus have to purge - * the staging list so it's not kept in memory as valid service. */ - rend_service_free_staging_list(); - } - - /* Success. Note that the service list has no ownership of its content. */ - ret = 0; - goto end; - - err: - SMARTLIST_FOREACH(new_service_list, hs_service_t *, s, hs_service_free(s)); - - end: - smartlist_free(new_service_list); - /* Tor main should call the free all function on error. */ - return ret; -} - diff --git a/src/tor/src/or/hs_config.h b/src/tor/src/or/hs_config.h deleted file mode 100644 index 6cd7aed46..000000000 --- a/src/tor/src/or/hs_config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_config.h - * \brief Header file containing configuration ABI/API for the HS subsytem. - **/ - -#ifndef TOR_HS_CONFIG_H -#define TOR_HS_CONFIG_H - -#include "or.h" - -/* Max value for HiddenServiceMaxStreams */ -#define HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT 65535 -/* Maximum number of intro points per version 3 services. */ -#define HS_CONFIG_V3_MAX_INTRO_POINTS 20 - -/* API */ - -int hs_config_service_all(const or_options_t *options, int validate_only); - -#endif /* !defined(TOR_HS_CONFIG_H) */ - diff --git a/src/tor/src/or/hs_control.c b/src/tor/src/or/hs_control.c deleted file mode 100644 index 87b4e3fca..000000000 --- a/src/tor/src/or/hs_control.c +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_control.c - * \brief Contains control port event related code. - **/ - -#include "or.h" -#include "control.h" -#include "hs_common.h" -#include "hs_control.h" -#include "hs_descriptor.h" -#include "hs_service.h" -#include "nodelist.h" - -/* Send on the control port the "HS_DESC REQUESTED [...]" event. - * - * The onion_pk is the onion service public key, base64_blinded_pk is the - * base64 encoded blinded key for the service and hsdir_rs is the routerstatus - * object of the HSDir that this request is for. */ -void -hs_control_desc_event_requested(const ed25519_public_key_t *onion_pk, - const char *base64_blinded_pk, - const routerstatus_t *hsdir_rs) -{ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - const uint8_t *hsdir_index; - const node_t *hsdir_node; - - tor_assert(onion_pk); - tor_assert(base64_blinded_pk); - tor_assert(hsdir_rs); - - hs_build_address(onion_pk, HS_VERSION_THREE, onion_address); - - /* Get the node from the routerstatus object to get the HSDir index used for - * this request. We can't have a routerstatus entry without a node and we - * can't pick a node without an hsdir_index. */ - hsdir_node = node_get_by_id(hsdir_rs->identity_digest); - tor_assert(hsdir_node); - tor_assert(hsdir_node->hsdir_index); - /* This is a fetch event. */ - hsdir_index = hsdir_node->hsdir_index->fetch; - - /* Trigger the event. */ - control_event_hs_descriptor_requested(onion_address, REND_NO_AUTH, - hsdir_rs->identity_digest, - base64_blinded_pk, - hex_str((const char *) hsdir_index, - DIGEST256_LEN)); - memwipe(onion_address, 0, sizeof(onion_address)); -} - -/* Send on the control port the "HS_DESC FAILED [...]" event. - * - * Using a directory connection identifier, the HSDir identity digest and a - * reason for the failure. None can be NULL. */ -void -hs_control_desc_event_failed(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest, - const char *reason) -{ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - - tor_assert(ident); - tor_assert(hsdir_id_digest); - tor_assert(reason); - - /* Build onion address and encoded blinded key. */ - IF_BUG_ONCE(ed25519_public_to_base64(base64_blinded_pk, - &ident->blinded_pk) < 0) { - return; - } - hs_build_address(&ident->identity_pk, HS_VERSION_THREE, onion_address); - - control_event_hsv3_descriptor_failed(onion_address, base64_blinded_pk, - hsdir_id_digest, reason); -} - -/* Send on the control port the "HS_DESC RECEIVED [...]" event. - * - * Using a directory connection identifier and the HSDir identity digest. - * None can be NULL. */ -void -hs_control_desc_event_received(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest) -{ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - - tor_assert(ident); - tor_assert(hsdir_id_digest); - - /* Build onion address and encoded blinded key. */ - IF_BUG_ONCE(ed25519_public_to_base64(base64_blinded_pk, - &ident->blinded_pk) < 0) { - return; - } - hs_build_address(&ident->identity_pk, HS_VERSION_THREE, onion_address); - - control_event_hsv3_descriptor_received(onion_address, base64_blinded_pk, - hsdir_id_digest); -} - -/* Send on the control port the "HS_DESC CREATED [...]" event. - * - * Using the onion address of the descriptor's service and the blinded public - * key of the descriptor as a descriptor ID. None can be NULL. */ -void -hs_control_desc_event_created(const char *onion_address, - const ed25519_public_key_t *blinded_pk) -{ - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - - tor_assert(onion_address); - tor_assert(blinded_pk); - - /* Build base64 encoded blinded key. */ - IF_BUG_ONCE(ed25519_public_to_base64(base64_blinded_pk, blinded_pk) < 0) { - return; - } - - /* Version 3 doesn't use the replica number in its descriptor ID computation - * so we pass negative value so the control port subsystem can ignore it. */ - control_event_hs_descriptor_created(onion_address, base64_blinded_pk, -1); -} - -/* Send on the control port the "HS_DESC UPLOAD [...]" event. - * - * Using the onion address of the descriptor's service, the HSDir identity - * digest, the blinded public key of the descriptor as a descriptor ID and the - * HSDir index for this particular request. None can be NULL. */ -void -hs_control_desc_event_upload(const char *onion_address, - const char *hsdir_id_digest, - const ed25519_public_key_t *blinded_pk, - const uint8_t *hsdir_index) -{ - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - - tor_assert(onion_address); - tor_assert(hsdir_id_digest); - tor_assert(blinded_pk); - tor_assert(hsdir_index); - - /* Build base64 encoded blinded key. */ - IF_BUG_ONCE(ed25519_public_to_base64(base64_blinded_pk, blinded_pk) < 0) { - return; - } - - control_event_hs_descriptor_upload(onion_address, hsdir_id_digest, - base64_blinded_pk, - hex_str((const char *) hsdir_index, - DIGEST256_LEN)); -} - -/* Send on the control port the "HS_DESC UPLOADED [...]" event. - * - * Using the directory connection identifier and the HSDir identity digest. - * None can be NULL. */ -void -hs_control_desc_event_uploaded(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest) -{ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - - tor_assert(ident); - tor_assert(hsdir_id_digest); - - hs_build_address(&ident->identity_pk, HS_VERSION_THREE, onion_address); - - control_event_hs_descriptor_uploaded(hsdir_id_digest, onion_address); -} - -/* Send on the control port the "HS_DESC_CONTENT [...]" event. - * - * Using the directory connection identifier, the HSDir identity digest and - * the body of the descriptor (as it was received from the directory). None - * can be NULL. */ -void -hs_control_desc_event_content(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest, - const char *body) -{ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - - tor_assert(ident); - tor_assert(hsdir_id_digest); - - /* Build onion address and encoded blinded key. */ - IF_BUG_ONCE(ed25519_public_to_base64(base64_blinded_pk, - &ident->blinded_pk) < 0) { - return; - } - hs_build_address(&ident->identity_pk, HS_VERSION_THREE, onion_address); - - control_event_hs_descriptor_content(onion_address, base64_blinded_pk, - hsdir_id_digest, body); -} - -/* Handle the "HSPOST [...]" command. The body is an encoded descriptor for - * the given onion_address. The descriptor will be uploaded to each directory - * in hsdirs_rs. If NULL, the responsible directories for the current time - * period will be selected. - * - * Return -1 on if the descriptor plaintext section is not decodable. Else, 0 - * on success. */ -int -hs_control_hspost_command(const char *body, const char *onion_address, - const smartlist_t *hsdirs_rs) -{ - int ret = -1; - ed25519_public_key_t identity_pk; - hs_desc_plaintext_data_t plaintext; - smartlist_t *hsdirs = NULL; - - tor_assert(body); - tor_assert(onion_address); - - /* This can't fail because we require the caller to pass us a valid onion - * address that has passed hs_address_is_valid(). */ - if (BUG(hs_parse_address(onion_address, &identity_pk, NULL, NULL) < 0)) { - goto done; // LCOV_EXCL_LINE - } - - /* Only decode the plaintext part which is what the directory will do to - * validate before caching. */ - if (hs_desc_decode_plaintext(body, &plaintext) < 0) { - goto done; - } - - /* No HSDir(s) given, we'll compute what the current ones should be. */ - if (hsdirs_rs == NULL) { - hsdirs = smartlist_new(); - hs_get_responsible_hsdirs(&plaintext.blinded_pubkey, - hs_get_time_period_num(0), - 0, /* Always the current descriptor which uses - * the first hsdir index. */ - 0, /* It is for storing on a directory. */ - hsdirs); - hsdirs_rs = hsdirs; - } - - SMARTLIST_FOREACH_BEGIN(hsdirs_rs, const routerstatus_t *, rs) { - hs_service_upload_desc_to_dir(body, plaintext.version, &identity_pk, - &plaintext.blinded_pubkey, rs); - } SMARTLIST_FOREACH_END(rs); - ret = 0; - - done: - /* We don't have ownership of the objects in this list. */ - smartlist_free(hsdirs); - return ret; -} - diff --git a/src/tor/src/or/hs_control.h b/src/tor/src/or/hs_control.h deleted file mode 100644 index 95c46e655..000000000 --- a/src/tor/src/or/hs_control.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_control.h - * \brief Header file containing control port event related code. - **/ - -#ifndef TOR_HS_CONTROL_H -#define TOR_HS_CONTROL_H - -#include "hs_ident.h" - -/* Event "HS_DESC REQUESTED [...]" */ -void hs_control_desc_event_requested(const ed25519_public_key_t *onion_pk, - const char *base64_blinded_pk, - const routerstatus_t *hsdir_rs); - -/* Event "HS_DESC FAILED [...]" */ -void hs_control_desc_event_failed(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest, - const char *reason); - -/* Event "HS_DESC RECEIVED [...]" */ -void hs_control_desc_event_received(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest); - -/* Event "HS_DESC CREATED [...]" */ -void hs_control_desc_event_created(const char *onion_address, - const ed25519_public_key_t *blinded_pk); - -/* Event "HS_DESC UPLOAD [...]" */ -void hs_control_desc_event_upload(const char *onion_address, - const char *hsdir_id_digest, - const ed25519_public_key_t *blinded_pk, - const uint8_t *hsdir_index); - -/* Event "HS_DESC UPLOADED [...]" */ -void hs_control_desc_event_uploaded(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest); - -/* Event "HS_DESC_CONTENT [...]" */ -void hs_control_desc_event_content(const hs_ident_dir_conn_t *ident, - const char *hsdir_id_digest, - const char *body); - -/* Command "HSPOST [...]" */ -int hs_control_hspost_command(const char *body, const char *onion_address, - const smartlist_t *hsdirs_rs); - -#endif /* !defined(TOR_HS_CONTROL_H) */ - diff --git a/src/tor/src/or/hs_descriptor.c b/src/tor/src/or/hs_descriptor.c deleted file mode 100644 index 789bc1d04..000000000 --- a/src/tor/src/or/hs_descriptor.c +++ /dev/null @@ -1,2602 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_descriptor.c - * \brief Handle hidden service descriptor encoding/decoding. - * - * \details - * Here is a graphical depiction of an HS descriptor and its layers: - * - * +------------------------------------------------------+ - * |DESCRIPTOR HEADER: | - * | hs-descriptor 3 | - * | descriptor-lifetime 180 | - * | ... | - * | superencrypted | - * |+---------------------------------------------------+ | - * ||SUPERENCRYPTED LAYER (aka OUTER ENCRYPTED LAYER): | | - * || desc-auth-type x25519 | | - * || desc-auth-ephemeral-key | | - * || auth-client | | - * || auth-client | | - * || ... | | - * || encrypted | | - * ||+-------------------------------------------------+| | - * |||ENCRYPTED LAYER (aka INNER ENCRYPTED LAYER): || | - * ||| create2-formats || | - * ||| intro-auth-required || | - * ||| introduction-point || | - * ||| introduction-point || | - * ||| ... || | - * ||+-------------------------------------------------+| | - * |+---------------------------------------------------+ | - * +------------------------------------------------------+ - * - * The DESCRIPTOR HEADER section is completely unencrypted and contains generic - * descriptor metadata. - * - * The SUPERENCRYPTED LAYER section is the first layer of encryption, and it's - * encrypted using the blinded public key of the hidden service to protect - * against entities who don't know its onion address. The clients of the hidden - * service know its onion address and blinded public key, whereas third-parties - * (like HSDirs) don't know it (except if it's a public hidden service). - * - * The ENCRYPTED LAYER section is the second layer of encryption, and it's - * encrypted using the client authorization key material (if those exist). When - * client authorization is enabled, this second layer of encryption protects - * the descriptor content from unauthorized entities. If client authorization - * is disabled, this second layer of encryption does not provide any extra - * security but is still present. The plaintext of this layer contains all the - * information required to connect to the hidden service like its list of - * introduction points. - **/ - -/* For unit tests.*/ -#define HS_DESCRIPTOR_PRIVATE - -#include "or.h" -#include "ed25519_cert.h" /* Trunnel interface. */ -#include "hs_descriptor.h" -#include "circuitbuild.h" -#include "parsecommon.h" -#include "rendcache.h" -#include "hs_cache.h" -#include "hs_config.h" -#include "torcert.h" /* tor_cert_encode_ed22519() */ - -/* Constant string value used for the descriptor format. */ -#define str_hs_desc "hs-descriptor" -#define str_desc_cert "descriptor-signing-key-cert" -#define str_rev_counter "revision-counter" -#define str_superencrypted "superencrypted" -#define str_encrypted "encrypted" -#define str_signature "signature" -#define str_lifetime "descriptor-lifetime" -/* Constant string value for the encrypted part of the descriptor. */ -#define str_create2_formats "create2-formats" -#define str_intro_auth_required "intro-auth-required" -#define str_single_onion "single-onion-service" -#define str_intro_point "introduction-point" -#define str_ip_onion_key "onion-key" -#define str_ip_auth_key "auth-key" -#define str_ip_enc_key "enc-key" -#define str_ip_enc_key_cert "enc-key-cert" -#define str_ip_legacy_key "legacy-key" -#define str_ip_legacy_key_cert "legacy-key-cert" -#define str_intro_point_start "\n" str_intro_point " " -/* Constant string value for the construction to encrypt the encrypted data - * section. */ -#define str_enc_const_superencryption "hsdir-superencrypted-data" -#define str_enc_const_encryption "hsdir-encrypted-data" -/* Prefix required to compute/verify HS desc signatures */ -#define str_desc_sig_prefix "Tor onion service descriptor sig v3" -#define str_desc_auth_type "desc-auth-type" -#define str_desc_auth_key "desc-auth-ephemeral-key" -#define str_desc_auth_client "auth-client" -#define str_encrypted "encrypted" - -/* Authentication supported types. */ -static const struct { - hs_desc_auth_type_t type; - const char *identifier; -} intro_auth_types[] = { - { HS_DESC_AUTH_ED25519, "ed25519" }, - /* Indicate end of array. */ - { 0, NULL } -}; - -/* Descriptor ruleset. */ -static token_rule_t hs_desc_v3_token_table[] = { - T1_START(str_hs_desc, R_HS_DESCRIPTOR, EQ(1), NO_OBJ), - T1(str_lifetime, R3_DESC_LIFETIME, EQ(1), NO_OBJ), - T1(str_desc_cert, R3_DESC_SIGNING_CERT, NO_ARGS, NEED_OBJ), - T1(str_rev_counter, R3_REVISION_COUNTER, EQ(1), NO_OBJ), - T1(str_superencrypted, R3_SUPERENCRYPTED, NO_ARGS, NEED_OBJ), - T1_END(str_signature, R3_SIGNATURE, EQ(1), NO_OBJ), - END_OF_TABLE -}; - -/* Descriptor ruleset for the superencrypted section. */ -static token_rule_t hs_desc_superencrypted_v3_token_table[] = { - T1_START(str_desc_auth_type, R3_DESC_AUTH_TYPE, GE(1), NO_OBJ), - T1(str_desc_auth_key, R3_DESC_AUTH_KEY, GE(1), NO_OBJ), - T1N(str_desc_auth_client, R3_DESC_AUTH_CLIENT, GE(3), NO_OBJ), - T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ), - END_OF_TABLE -}; - -/* Descriptor ruleset for the encrypted section. */ -static token_rule_t hs_desc_encrypted_v3_token_table[] = { - T1_START(str_create2_formats, R3_CREATE2_FORMATS, CONCAT_ARGS, NO_OBJ), - T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, ARGS, NO_OBJ), - T01(str_single_onion, R3_SINGLE_ONION_SERVICE, ARGS, NO_OBJ), - END_OF_TABLE -}; - -/* Descriptor ruleset for the introduction points section. */ -static token_rule_t hs_desc_intro_point_v3_token_table[] = { - T1_START(str_intro_point, R3_INTRODUCTION_POINT, EQ(1), NO_OBJ), - T1N(str_ip_onion_key, R3_INTRO_ONION_KEY, GE(2), OBJ_OK), - T1(str_ip_auth_key, R3_INTRO_AUTH_KEY, NO_ARGS, NEED_OBJ), - T1(str_ip_enc_key, R3_INTRO_ENC_KEY, GE(2), OBJ_OK), - T1(str_ip_enc_key_cert, R3_INTRO_ENC_KEY_CERT, ARGS, OBJ_OK), - T01(str_ip_legacy_key, R3_INTRO_LEGACY_KEY, ARGS, NEED_KEY_1024), - T01(str_ip_legacy_key_cert, R3_INTRO_LEGACY_KEY_CERT, ARGS, OBJ_OK), - END_OF_TABLE -}; - -/* Free the content of the plaintext section of a descriptor. */ -STATIC void -desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc) -{ - if (!desc) { - return; - } - - if (desc->superencrypted_blob) { - tor_free(desc->superencrypted_blob); - } - tor_cert_free(desc->signing_key_cert); - - memwipe(desc, 0, sizeof(*desc)); -} - -/* Free the content of the encrypted section of a descriptor. */ -static void -desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc) -{ - if (!desc) { - return; - } - - if (desc->intro_auth_types) { - SMARTLIST_FOREACH(desc->intro_auth_types, char *, a, tor_free(a)); - smartlist_free(desc->intro_auth_types); - } - if (desc->intro_points) { - SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip, - hs_desc_intro_point_free(ip)); - smartlist_free(desc->intro_points); - } - memwipe(desc, 0, sizeof(*desc)); -} - -/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out. - * We use SHA3-256 for the MAC computation. - * This function can't fail. */ -static void -build_mac(const uint8_t *mac_key, size_t mac_key_len, - const uint8_t *salt, size_t salt_len, - const uint8_t *encrypted, size_t encrypted_len, - uint8_t *mac_out, size_t mac_len) -{ - crypto_digest_t *digest; - - const uint64_t mac_len_netorder = tor_htonll(mac_key_len); - const uint64_t salt_len_netorder = tor_htonll(salt_len); - - tor_assert(mac_key); - tor_assert(salt); - tor_assert(encrypted); - tor_assert(mac_out); - - digest = crypto_digest256_new(DIGEST_SHA3_256); - /* As specified in section 2.5 of proposal 224, first add the mac key - * then add the salt first and then the encrypted section. */ - - crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len); - crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) salt, salt_len); - crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len); - crypto_digest_get_digest(digest, (char *) mac_out, mac_len); - crypto_digest_free(digest); -} - -/* Using a given decriptor object, build the secret input needed for the - * KDF and put it in the dst pointer which is an already allocated buffer - * of size dstlen. */ -static void -build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) -{ - size_t offset = 0; - - tor_assert(desc); - tor_assert(dst); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen); - - /* XXX use the destination length as the memcpy length */ - /* Copy blinded public key. */ - memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, - sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); - offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); - /* Copy subcredential. */ - memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); - offset += sizeof(desc->subcredential); - /* Copy revision counter value. */ - set_uint64(dst + offset, tor_htonll(desc->plaintext_data.revision_counter)); - offset += sizeof(uint64_t); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset); -} - -/* Do the KDF construction and put the resulting data in key_out which is of - * key_out_len length. It uses SHAKE-256 as specified in the spec. */ -static void -build_kdf_key(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_out_len, - int is_superencrypted_layer) -{ - uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN]; - crypto_xof_t *xof; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - - /* Build the secret input for the KDF computation. */ - build_secret_input(desc, secret_input, sizeof(secret_input)); - - xof = crypto_xof_new(); - /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */ - crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input)); - crypto_xof_add_bytes(xof, salt, salt_len); - - /* Feed in the right string constant based on the desc layer */ - if (is_superencrypted_layer) { - crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_superencryption, - strlen(str_enc_const_superencryption)); - } else { - crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_encryption, - strlen(str_enc_const_encryption)); - } - - /* Eat from our KDF. */ - crypto_xof_squeeze_bytes(xof, key_out, key_out_len); - crypto_xof_free(xof); - memwipe(secret_input, 0, sizeof(secret_input)); -} - -/* Using the given descriptor and salt, run it through our KDF function and - * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out. - * This function can't fail. */ -static void -build_secret_key_iv_mac(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_len, - uint8_t *iv_out, size_t iv_len, - uint8_t *mac_out, size_t mac_len, - int is_superencrypted_layer) -{ - size_t offset = 0; - uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN]; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - tor_assert(iv_out); - tor_assert(mac_out); - - build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key), - is_superencrypted_layer); - /* Copy the bytes we need for both the secret key and IV. */ - memcpy(key_out, kdf_key, key_len); - offset += key_len; - memcpy(iv_out, kdf_key + offset, iv_len); - offset += iv_len; - memcpy(mac_out, kdf_key + offset, mac_len); - /* Extra precaution to make sure we are not out of bound. */ - tor_assert((offset + mac_len) == sizeof(kdf_key)); - memwipe(kdf_key, 0, sizeof(kdf_key)); -} - -/* === ENCODING === */ - -/* Encode the given link specifier objects into a newly allocated string. - * This can't fail so caller can always assume a valid string being - * returned. */ -STATIC char * -encode_link_specifiers(const smartlist_t *specs) -{ - char *encoded_b64 = NULL; - link_specifier_list_t *lslist = link_specifier_list_new(); - - tor_assert(specs); - /* No link specifiers is a code flow error, can't happen. */ - tor_assert(smartlist_len(specs) > 0); - tor_assert(smartlist_len(specs) <= UINT8_MAX); - - link_specifier_list_set_n_spec(lslist, smartlist_len(specs)); - - SMARTLIST_FOREACH_BEGIN(specs, const hs_desc_link_specifier_t *, - spec) { - link_specifier_t *ls = hs_desc_lspec_to_trunnel(spec); - if (ls) { - link_specifier_list_add_spec(lslist, ls); - } - } SMARTLIST_FOREACH_END(spec); - - { - uint8_t *encoded; - ssize_t encoded_len, encoded_b64_len, ret; - - encoded_len = link_specifier_list_encoded_len(lslist); - tor_assert(encoded_len > 0); - encoded = tor_malloc_zero(encoded_len); - ret = link_specifier_list_encode(encoded, encoded_len, lslist); - tor_assert(ret == encoded_len); - - /* Base64 encode our binary format. Add extra NUL byte for the base64 - * encoded value. */ - encoded_b64_len = base64_encode_size(encoded_len, 0) + 1; - encoded_b64 = tor_malloc_zero(encoded_b64_len); - ret = base64_encode(encoded_b64, encoded_b64_len, (const char *) encoded, - encoded_len, 0); - tor_assert(ret == (encoded_b64_len - 1)); - tor_free(encoded); - } - - link_specifier_list_free(lslist); - return encoded_b64; -} - -/* Encode an introduction point legacy key and certificate. Return a newly - * allocated string with it. On failure, return NULL. */ -static char * -encode_legacy_key(const hs_desc_intro_point_t *ip) -{ - char *key_str, b64_cert[256], *encoded = NULL; - size_t key_str_len; - - tor_assert(ip); - - /* Encode cross cert. */ - if (base64_encode(b64_cert, sizeof(b64_cert), - (const char *) ip->legacy.cert.encoded, - ip->legacy.cert.len, BASE64_ENCODE_MULTILINE) < 0) { - log_warn(LD_REND, "Unable to encode legacy crosscert."); - goto done; - } - /* Convert the encryption key to PEM format NUL terminated. */ - if (crypto_pk_write_public_key_to_string(ip->legacy.key, &key_str, - &key_str_len) < 0) { - log_warn(LD_REND, "Unable to encode legacy encryption key."); - goto done; - } - tor_asprintf(&encoded, - "%s \n%s" /* Newline is added by the call above. */ - "%s\n" - "-----BEGIN CROSSCERT-----\n" - "%s" - "-----END CROSSCERT-----", - str_ip_legacy_key, key_str, - str_ip_legacy_key_cert, b64_cert); - tor_free(key_str); - - done: - return encoded; -} - -/* Encode an introduction point encryption key and certificate. Return a newly - * allocated string with it. On failure, return NULL. */ -static char * -encode_enc_key(const hs_desc_intro_point_t *ip) -{ - char *encoded = NULL, *encoded_cert; - char key_b64[CURVE25519_BASE64_PADDED_LEN + 1]; - - tor_assert(ip); - - /* Base64 encode the encryption key for the "enc-key" field. */ - if (curve25519_public_to_base64(key_b64, &ip->enc_key) < 0) { - goto done; - } - if (tor_cert_encode_ed22519(ip->enc_key_cert, &encoded_cert) < 0) { - goto done; - } - tor_asprintf(&encoded, - "%s ntor %s\n" - "%s\n%s", - str_ip_enc_key, key_b64, - str_ip_enc_key_cert, encoded_cert); - tor_free(encoded_cert); - - done: - return encoded; -} - -/* Encode an introduction point onion key. Return a newly allocated string - * with it. On failure, return NULL. */ -static char * -encode_onion_key(const hs_desc_intro_point_t *ip) -{ - char *encoded = NULL; - char key_b64[CURVE25519_BASE64_PADDED_LEN + 1]; - - tor_assert(ip); - - /* Base64 encode the encryption key for the "onion-key" field. */ - if (curve25519_public_to_base64(key_b64, &ip->onion_key) < 0) { - goto done; - } - tor_asprintf(&encoded, "%s ntor %s", str_ip_onion_key, key_b64); - - done: - return encoded; -} - -/* Encode an introduction point object and return a newly allocated string - * with it. On failure, return NULL. */ -static char * -encode_intro_point(const ed25519_public_key_t *sig_key, - const hs_desc_intro_point_t *ip) -{ - char *encoded_ip = NULL; - smartlist_t *lines = smartlist_new(); - - tor_assert(ip); - tor_assert(sig_key); - - /* Encode link specifier. */ - { - char *ls_str = encode_link_specifiers(ip->link_specifiers); - smartlist_add_asprintf(lines, "%s %s", str_intro_point, ls_str); - tor_free(ls_str); - } - - /* Onion key encoding. */ - { - char *encoded_onion_key = encode_onion_key(ip); - if (encoded_onion_key == NULL) { - goto err; - } - smartlist_add_asprintf(lines, "%s", encoded_onion_key); - tor_free(encoded_onion_key); - } - - /* Authentication key encoding. */ - { - char *encoded_cert; - if (tor_cert_encode_ed22519(ip->auth_key_cert, &encoded_cert) < 0) { - goto err; - } - smartlist_add_asprintf(lines, "%s\n%s", str_ip_auth_key, encoded_cert); - tor_free(encoded_cert); - } - - /* Encryption key encoding. */ - { - char *encoded_enc_key = encode_enc_key(ip); - if (encoded_enc_key == NULL) { - goto err; - } - smartlist_add_asprintf(lines, "%s", encoded_enc_key); - tor_free(encoded_enc_key); - } - - /* Legacy key if any. */ - if (ip->legacy.key != NULL) { - /* Strong requirement else the IP creation was badly done. */ - tor_assert(ip->legacy.cert.encoded); - char *encoded_legacy_key = encode_legacy_key(ip); - if (encoded_legacy_key == NULL) { - goto err; - } - smartlist_add_asprintf(lines, "%s", encoded_legacy_key); - tor_free(encoded_legacy_key); - } - - /* Join them all in one blob of text. */ - encoded_ip = smartlist_join_strings(lines, "\n", 1, NULL); - - err: - SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); - smartlist_free(lines); - return encoded_ip; -} - -/* Given a source length, return the new size including padding for the - * plaintext encryption. */ -static size_t -compute_padded_plaintext_length(size_t plaintext_len) -{ - size_t plaintext_padded_len; - const int padding_block_length = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; - - /* Make sure we won't overflow. */ - tor_assert(plaintext_len <= (SIZE_T_CEILING - padding_block_length)); - - /* Get the extra length we need to add. For example, if srclen is 10200 - * bytes, this will expand to (2 * 10k) == 20k thus an extra 9800 bytes. */ - plaintext_padded_len = CEIL_DIV(plaintext_len, padding_block_length) * - padding_block_length; - /* Can never be extra careful. Make sure we are _really_ padded. */ - tor_assert(!(plaintext_padded_len % padding_block_length)); - return plaintext_padded_len; -} - -/* Given a buffer, pad it up to the encrypted section padding requirement. Set - * the newly allocated string in padded_out and return the length of the - * padded buffer. */ -STATIC size_t -build_plaintext_padding(const char *plaintext, size_t plaintext_len, - uint8_t **padded_out) -{ - size_t padded_len; - uint8_t *padded; - - tor_assert(plaintext); - tor_assert(padded_out); - - /* Allocate the final length including padding. */ - padded_len = compute_padded_plaintext_length(plaintext_len); - tor_assert(padded_len >= plaintext_len); - padded = tor_malloc_zero(padded_len); - - memcpy(padded, plaintext, plaintext_len); - *padded_out = padded; - return padded_len; -} - -/* Using a key, IV and plaintext data of length plaintext_len, create the - * encrypted section by encrypting it and setting encrypted_out with the - * data. Return size of the encrypted data buffer. */ -static size_t -build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, - size_t plaintext_len, uint8_t **encrypted_out, - int is_superencrypted_layer) -{ - size_t encrypted_len; - uint8_t *padded_plaintext, *encrypted; - crypto_cipher_t *cipher; - - tor_assert(key); - tor_assert(iv); - tor_assert(plaintext); - tor_assert(encrypted_out); - - /* If we are encrypting the middle layer of the descriptor, we need to first - pad the plaintext */ - if (is_superencrypted_layer) { - encrypted_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - /* Extra precautions that we have a valid padding length. */ - tor_assert(!(encrypted_len % HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE)); - } else { /* No padding required for inner layers */ - padded_plaintext = tor_memdup(plaintext, plaintext_len); - encrypted_len = plaintext_len; - } - - /* This creates a cipher for AES. It can't fail. */ - cipher = crypto_cipher_new_with_iv_and_bits(key, iv, - HS_DESC_ENCRYPTED_BIT_SIZE); - /* We use a stream cipher so the encrypted length will be the same as the - * plaintext padded length. */ - encrypted = tor_malloc_zero(encrypted_len); - /* This can't fail. */ - crypto_cipher_encrypt(cipher, (char *) encrypted, - (const char *) padded_plaintext, encrypted_len); - *encrypted_out = encrypted; - /* Cleanup. */ - crypto_cipher_free(cipher); - tor_free(padded_plaintext); - return encrypted_len; -} - -/* Encrypt the given plaintext buffer using desc to get the - * keys. Set encrypted_out with the encrypted data and return the length of - * it. is_superencrypted_layer is set if this is the outer encrypted - * layer of the descriptor. */ -static size_t -encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, - char **encrypted_out, int is_superencrypted_layer) -{ - char *final_blob; - size_t encrypted_len, final_blob_len, offset = 0; - uint8_t *encrypted; - uint8_t salt[HS_DESC_ENCRYPTED_SALT_LEN]; - uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; - uint8_t mac_key[DIGEST256_LEN], mac[DIGEST256_LEN]; - - tor_assert(desc); - tor_assert(plaintext); - tor_assert(encrypted_out); - - /* Get our salt. The returned bytes are already hashed. */ - crypto_strongest_rand(salt, sizeof(salt)); - - /* KDF construction resulting in a key from which the secret key, IV and MAC - * key are extracted which is what we need for the encryption. */ - build_secret_key_iv_mac(desc, salt, sizeof(salt), - secret_key, sizeof(secret_key), - secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key), - is_superencrypted_layer); - - /* Build the encrypted part that is do the actual encryption. */ - encrypted_len = build_encrypted(secret_key, secret_iv, plaintext, - strlen(plaintext), &encrypted, - is_superencrypted_layer); - memwipe(secret_key, 0, sizeof(secret_key)); - memwipe(secret_iv, 0, sizeof(secret_iv)); - /* This construction is specified in section 2.5 of proposal 224. */ - final_blob_len = sizeof(salt) + encrypted_len + DIGEST256_LEN; - final_blob = tor_malloc_zero(final_blob_len); - - /* Build the MAC. */ - build_mac(mac_key, sizeof(mac_key), salt, sizeof(salt), - encrypted, encrypted_len, mac, sizeof(mac)); - memwipe(mac_key, 0, sizeof(mac_key)); - - /* The salt is the first value. */ - memcpy(final_blob, salt, sizeof(salt)); - offset = sizeof(salt); - /* Second value is the encrypted data. */ - memcpy(final_blob + offset, encrypted, encrypted_len); - offset += encrypted_len; - /* Third value is the MAC. */ - memcpy(final_blob + offset, mac, sizeof(mac)); - offset += sizeof(mac); - /* Cleanup the buffers. */ - memwipe(salt, 0, sizeof(salt)); - memwipe(encrypted, 0, encrypted_len); - tor_free(encrypted); - /* Extra precaution. */ - tor_assert(offset == final_blob_len); - - *encrypted_out = final_blob; - return final_blob_len; -} - -/* Create and return a string containing a fake client-auth entry. It's the - * responsibility of the caller to free the returned string. This function will - * never fail. */ -static char * -get_fake_auth_client_str(void) -{ - char *auth_client_str = NULL; - /* We are gonna fill these arrays with fake base64 data. They are all double - * the size of their binary representation to fit the base64 overhead. */ - char client_id_b64[8*2]; - char iv_b64[16*2]; - char encrypted_cookie_b64[16*2]; - int retval; - - /* This is a macro to fill a field with random data and then base64 it. */ -#define FILL_WITH_FAKE_DATA_AND_BASE64(field) STMT_BEGIN \ - crypto_rand((char *)field, sizeof(field)); \ - retval = base64_encode_nopad(field##_b64, sizeof(field##_b64), \ - field, sizeof(field)); \ - tor_assert(retval > 0); \ - STMT_END - - { /* Get those fakes! */ - uint8_t client_id[8]; /* fake client-id */ - uint8_t iv[16]; /* fake IV (initialization vector) */ - uint8_t encrypted_cookie[16]; /* fake encrypted cookie */ - - FILL_WITH_FAKE_DATA_AND_BASE64(client_id); - FILL_WITH_FAKE_DATA_AND_BASE64(iv); - FILL_WITH_FAKE_DATA_AND_BASE64(encrypted_cookie); - } - - /* Build the final string */ - tor_asprintf(&auth_client_str, "%s %s %s %s", str_desc_auth_client, - client_id_b64, iv_b64, encrypted_cookie_b64); - -#undef FILL_WITH_FAKE_DATA_AND_BASE64 - - return auth_client_str; -} - -/** How many lines of "client-auth" we want in our descriptors; fake or not. */ -#define CLIENT_AUTH_ENTRIES_BLOCK_SIZE 16 - -/** Create the "client-auth" part of the descriptor and return a - * newly-allocated string with it. It's the responsibility of the caller to - * free the returned string. */ -static char * -get_fake_auth_client_lines(void) -{ - /* XXX: Client authorization is still not implemented, so all this function - does is make fake clients */ - int i = 0; - smartlist_t *auth_client_lines = smartlist_new(); - char *auth_client_lines_str = NULL; - - /* Make a line for each fake client */ - const int num_fake_clients = CLIENT_AUTH_ENTRIES_BLOCK_SIZE; - for (i = 0; i < num_fake_clients; i++) { - char *auth_client_str = get_fake_auth_client_str(); - tor_assert(auth_client_str); - smartlist_add(auth_client_lines, auth_client_str); - } - - /* Join all lines together to form final string */ - auth_client_lines_str = smartlist_join_strings(auth_client_lines, - "\n", 1, NULL); - /* Cleanup the mess */ - SMARTLIST_FOREACH(auth_client_lines, char *, a, tor_free(a)); - smartlist_free(auth_client_lines); - - return auth_client_lines_str; -} - -/* Create the inner layer of the descriptor (which includes the intro points, - * etc.). Return a newly-allocated string with the layer plaintext, or NULL if - * an error occured. It's the responsibility of the caller to free the returned - * string. */ -static char * -get_inner_encrypted_layer_plaintext(const hs_descriptor_t *desc) -{ - char *encoded_str = NULL; - smartlist_t *lines = smartlist_new(); - - /* Build the start of the section prior to the introduction points. */ - { - if (!desc->encrypted_data.create2_ntor) { - log_err(LD_BUG, "HS desc doesn't have recognized handshake type."); - goto err; - } - smartlist_add_asprintf(lines, "%s %d\n", str_create2_formats, - ONION_HANDSHAKE_TYPE_NTOR); - - if (desc->encrypted_data.intro_auth_types && - smartlist_len(desc->encrypted_data.intro_auth_types)) { - /* Put the authentication-required line. */ - char *buf = smartlist_join_strings(desc->encrypted_data.intro_auth_types, - " ", 0, NULL); - smartlist_add_asprintf(lines, "%s %s\n", str_intro_auth_required, buf); - tor_free(buf); - } - - if (desc->encrypted_data.single_onion_service) { - smartlist_add_asprintf(lines, "%s\n", str_single_onion); - } - } - - /* Build the introduction point(s) section. */ - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - const hs_desc_intro_point_t *, ip) { - char *encoded_ip = encode_intro_point(&desc->plaintext_data.signing_pubkey, - ip); - if (encoded_ip == NULL) { - log_err(LD_BUG, "HS desc intro point is malformed."); - goto err; - } - smartlist_add(lines, encoded_ip); - } SMARTLIST_FOREACH_END(ip); - - /* Build the entire encrypted data section into one encoded plaintext and - * then encrypt it. */ - encoded_str = smartlist_join_strings(lines, "", 0, NULL); - - err: - SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); - smartlist_free(lines); - - return encoded_str; -} - -/* Create the middle layer of the descriptor, which includes the client auth - * data and the encrypted inner layer (provided as a base64 string at - * layer2_b64_ciphertext). Return a newly-allocated string with the - * layer plaintext, or NULL if an error occured. It's the responsibility of the - * caller to free the returned string. */ -static char * -get_outer_encrypted_layer_plaintext(const hs_descriptor_t *desc, - const char *layer2_b64_ciphertext) -{ - char *layer1_str = NULL; - smartlist_t *lines = smartlist_new(); - - /* XXX: Disclaimer: This function generates only _fake_ client auth - * data. Real client auth is not yet implemented, but client auth data MUST - * always be present in descriptors. In the future this function will be - * refactored to use real client auth data if they exist (#20700). */ - (void) *desc; - - /* Specify auth type */ - smartlist_add_asprintf(lines, "%s %s\n", str_desc_auth_type, "x25519"); - - { /* Create fake ephemeral x25519 key */ - char fake_key_base64[CURVE25519_BASE64_PADDED_LEN + 1]; - curve25519_keypair_t fake_x25519_keypair; - if (curve25519_keypair_generate(&fake_x25519_keypair, 0) < 0) { - goto done; - } - if (curve25519_public_to_base64(fake_key_base64, - &fake_x25519_keypair.pubkey) < 0) { - goto done; - } - smartlist_add_asprintf(lines, "%s %s\n", - str_desc_auth_key, fake_key_base64); - /* No need to memwipe any of these fake keys. They will go unused. */ - } - - { /* Create fake auth-client lines. */ - char *auth_client_lines = get_fake_auth_client_lines(); - tor_assert(auth_client_lines); - smartlist_add(lines, auth_client_lines); - } - - /* create encrypted section */ - { - smartlist_add_asprintf(lines, - "%s\n" - "-----BEGIN MESSAGE-----\n" - "%s" - "-----END MESSAGE-----", - str_encrypted, layer2_b64_ciphertext); - } - - layer1_str = smartlist_join_strings(lines, "", 0, NULL); - - done: - SMARTLIST_FOREACH(lines, char *, a, tor_free(a)); - smartlist_free(lines); - - return layer1_str; -} - -/* Encrypt encoded_str into an encrypted blob and then base64 it before - * returning it. desc is provided to derive the encryption - * keys. is_superencrypted_layer is set if encoded_str is the - * middle (superencrypted) layer of the descriptor. It's the responsibility of - * the caller to free the returned string. */ -static char * -encrypt_desc_data_and_base64(const hs_descriptor_t *desc, - const char *encoded_str, - int is_superencrypted_layer) -{ - char *enc_b64; - ssize_t enc_b64_len, ret_len, enc_len; - char *encrypted_blob = NULL; - - enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob, - is_superencrypted_layer); - /* Get the encoded size plus a NUL terminating byte. */ - enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1; - enc_b64 = tor_malloc_zero(enc_b64_len); - /* Base64 the encrypted blob before returning it. */ - ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len, - BASE64_ENCODE_MULTILINE); - /* Return length doesn't count the NUL byte. */ - tor_assert(ret_len == (enc_b64_len - 1)); - tor_free(encrypted_blob); - - return enc_b64; -} - -/* Generate and encode the superencrypted portion of desc. This also - * involves generating the encrypted portion of the descriptor, and performing - * the superencryption. A newly allocated NUL-terminated string pointer - * containing the encrypted encoded blob is put in encrypted_blob_out. Return 0 - * on success else a negative value. */ -static int -encode_superencrypted_data(const hs_descriptor_t *desc, - char **encrypted_blob_out) -{ - int ret = -1; - char *layer2_str = NULL; - char *layer2_b64_ciphertext = NULL; - char *layer1_str = NULL; - char *layer1_b64_ciphertext = NULL; - - tor_assert(desc); - tor_assert(encrypted_blob_out); - - /* Func logic: We first create the inner layer of the descriptor (layer2). - * We then encrypt it and use it to create the middle layer of the descriptor - * (layer1). Finally we superencrypt the middle layer and return it to our - * caller. */ - - /* Create inner descriptor layer */ - layer2_str = get_inner_encrypted_layer_plaintext(desc); - if (!layer2_str) { - goto err; - } - - /* Encrypt and b64 the inner layer */ - layer2_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer2_str, 0); - if (!layer2_b64_ciphertext) { - goto err; - } - - /* Now create middle descriptor layer given the inner layer */ - layer1_str = get_outer_encrypted_layer_plaintext(desc,layer2_b64_ciphertext); - if (!layer1_str) { - goto err; - } - - /* Encrypt and base64 the middle layer */ - layer1_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer1_str, 1); - if (!layer1_b64_ciphertext) { - goto err; - } - - /* Success! */ - ret = 0; - - err: - tor_free(layer1_str); - tor_free(layer2_str); - tor_free(layer2_b64_ciphertext); - - *encrypted_blob_out = layer1_b64_ciphertext; - return ret; -} - -/* Encode a v3 HS descriptor. Return 0 on success and set encoded_out to the - * newly allocated string of the encoded descriptor. On error, -1 is returned - * and encoded_out is untouched. */ -static int -desc_encode_v3(const hs_descriptor_t *desc, - const ed25519_keypair_t *signing_kp, char **encoded_out) -{ - int ret = -1; - char *encoded_str = NULL; - size_t encoded_len; - smartlist_t *lines = smartlist_new(); - - tor_assert(desc); - tor_assert(signing_kp); - tor_assert(encoded_out); - tor_assert(desc->plaintext_data.version == 3); - - if (BUG(desc->subcredential == NULL)) { - goto err; - } - - /* Build the non-encrypted values. */ - { - char *encoded_cert; - /* Encode certificate then create the first line of the descriptor. */ - if (desc->plaintext_data.signing_key_cert->cert_type - != CERT_TYPE_SIGNING_HS_DESC) { - log_err(LD_BUG, "HS descriptor signing key has an unexpected cert type " - "(%d)", (int) desc->plaintext_data.signing_key_cert->cert_type); - goto err; - } - if (tor_cert_encode_ed22519(desc->plaintext_data.signing_key_cert, - &encoded_cert) < 0) { - /* The function will print error logs. */ - goto err; - } - /* Create the hs descriptor line. */ - smartlist_add_asprintf(lines, "%s %" PRIu32, str_hs_desc, - desc->plaintext_data.version); - /* Add the descriptor lifetime line (in minutes). */ - smartlist_add_asprintf(lines, "%s %" PRIu32, str_lifetime, - desc->plaintext_data.lifetime_sec / 60); - /* Create the descriptor certificate line. */ - smartlist_add_asprintf(lines, "%s\n%s", str_desc_cert, encoded_cert); - tor_free(encoded_cert); - /* Create the revision counter line. */ - smartlist_add_asprintf(lines, "%s %" PRIu64, str_rev_counter, - desc->plaintext_data.revision_counter); - } - - /* Build the superencrypted data section. */ - { - char *enc_b64_blob=NULL; - if (encode_superencrypted_data(desc, &enc_b64_blob) < 0) { - goto err; - } - smartlist_add_asprintf(lines, - "%s\n" - "-----BEGIN MESSAGE-----\n" - "%s" - "-----END MESSAGE-----", - str_superencrypted, enc_b64_blob); - tor_free(enc_b64_blob); - } - - /* Join all lines in one string so we can generate a signature and append - * it to the descriptor. */ - encoded_str = smartlist_join_strings(lines, "\n", 1, &encoded_len); - - /* Sign all fields of the descriptor with our short term signing key. */ - { - ed25519_signature_t sig; - char ed_sig_b64[ED25519_SIG_BASE64_LEN + 1]; - if (ed25519_sign_prefixed(&sig, - (const uint8_t *) encoded_str, encoded_len, - str_desc_sig_prefix, signing_kp) < 0) { - log_warn(LD_BUG, "Can't sign encoded HS descriptor!"); - tor_free(encoded_str); - goto err; - } - if (ed25519_signature_to_base64(ed_sig_b64, &sig) < 0) { - log_warn(LD_BUG, "Can't base64 encode descriptor signature!"); - tor_free(encoded_str); - goto err; - } - /* Create the signature line. */ - smartlist_add_asprintf(lines, "%s %s", str_signature, ed_sig_b64); - } - /* Free previous string that we used so compute the signature. */ - tor_free(encoded_str); - encoded_str = smartlist_join_strings(lines, "\n", 1, NULL); - *encoded_out = encoded_str; - - if (strlen(encoded_str) >= hs_cache_get_max_descriptor_size()) { - log_warn(LD_GENERAL, "We just made an HS descriptor that's too big (%d)." - "Failing.", (int)strlen(encoded_str)); - tor_free(encoded_str); - goto err; - } - - /* XXX: Trigger a control port event. */ - - /* Success! */ - ret = 0; - - err: - SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); - smartlist_free(lines); - return ret; -} - -/* === DECODING === */ - -/* Given an encoded string of the link specifiers, return a newly allocated - * list of decoded link specifiers. Return NULL on error. */ -STATIC smartlist_t * -decode_link_specifiers(const char *encoded) -{ - int decoded_len; - size_t encoded_len, i; - uint8_t *decoded; - smartlist_t *results = NULL; - link_specifier_list_t *specs = NULL; - - tor_assert(encoded); - - encoded_len = strlen(encoded); - decoded = tor_malloc(encoded_len); - decoded_len = base64_decode((char *) decoded, encoded_len, encoded, - encoded_len); - if (decoded_len < 0) { - goto err; - } - - if (link_specifier_list_parse(&specs, decoded, - (size_t) decoded_len) < decoded_len) { - goto err; - } - tor_assert(specs); - results = smartlist_new(); - - for (i = 0; i < link_specifier_list_getlen_spec(specs); i++) { - hs_desc_link_specifier_t *hs_spec; - link_specifier_t *ls = link_specifier_list_get_spec(specs, i); - tor_assert(ls); - - hs_spec = tor_malloc_zero(sizeof(*hs_spec)); - hs_spec->type = link_specifier_get_ls_type(ls); - switch (hs_spec->type) { - case LS_IPV4: - tor_addr_from_ipv4h(&hs_spec->u.ap.addr, - link_specifier_get_un_ipv4_addr(ls)); - hs_spec->u.ap.port = link_specifier_get_un_ipv4_port(ls); - break; - case LS_IPV6: - tor_addr_from_ipv6_bytes(&hs_spec->u.ap.addr, (const char *) - link_specifier_getarray_un_ipv6_addr(ls)); - hs_spec->u.ap.port = link_specifier_get_un_ipv6_port(ls); - break; - case LS_LEGACY_ID: - /* Both are known at compile time so let's make sure they are the same - * else we can copy memory out of bound. */ - tor_assert(link_specifier_getlen_un_legacy_id(ls) == - sizeof(hs_spec->u.legacy_id)); - memcpy(hs_spec->u.legacy_id, link_specifier_getarray_un_legacy_id(ls), - sizeof(hs_spec->u.legacy_id)); - break; - case LS_ED25519_ID: - /* Both are known at compile time so let's make sure they are the same - * else we can copy memory out of bound. */ - tor_assert(link_specifier_getlen_un_ed25519_id(ls) == - sizeof(hs_spec->u.ed25519_id)); - memcpy(hs_spec->u.ed25519_id, - link_specifier_getconstarray_un_ed25519_id(ls), - sizeof(hs_spec->u.ed25519_id)); - break; - default: - goto err; - } - - smartlist_add(results, hs_spec); - } - - goto done; - err: - if (results) { - SMARTLIST_FOREACH(results, hs_desc_link_specifier_t *, s, tor_free(s)); - smartlist_free(results); - results = NULL; - } - done: - link_specifier_list_free(specs); - tor_free(decoded); - return results; -} - -/* Given a list of authentication types, decode it and put it in the encrypted - * data section. Return 1 if we at least know one of the type or 0 if we know - * none of them. */ -static int -decode_auth_type(hs_desc_encrypted_data_t *desc, const char *list) -{ - int match = 0; - - tor_assert(desc); - tor_assert(list); - - desc->intro_auth_types = smartlist_new(); - smartlist_split_string(desc->intro_auth_types, list, " ", 0, 0); - - /* Validate the types that we at least know about one. */ - SMARTLIST_FOREACH_BEGIN(desc->intro_auth_types, const char *, auth) { - for (int idx = 0; intro_auth_types[idx].identifier; idx++) { - if (!strncmp(auth, intro_auth_types[idx].identifier, - strlen(intro_auth_types[idx].identifier))) { - match = 1; - break; - } - } - } SMARTLIST_FOREACH_END(auth); - - return match; -} - -/* Parse a space-delimited list of integers representing CREATE2 formats into - * the bitfield in hs_desc_encrypted_data_t. Ignore unrecognized values. */ -static void -decode_create2_list(hs_desc_encrypted_data_t *desc, const char *list) -{ - smartlist_t *tokens; - - tor_assert(desc); - tor_assert(list); - - tokens = smartlist_new(); - smartlist_split_string(tokens, list, " ", 0, 0); - - SMARTLIST_FOREACH_BEGIN(tokens, char *, s) { - int ok; - unsigned long type = tor_parse_ulong(s, 10, 1, UINT16_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_REND, "Unparseable value %s in create2 list", escaped(s)); - continue; - } - switch (type) { - case ONION_HANDSHAKE_TYPE_NTOR: - desc->create2_ntor = 1; - break; - default: - /* We deliberately ignore unsupported handshake types */ - continue; - } - } SMARTLIST_FOREACH_END(s); - - SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); - smartlist_free(tokens); -} - -/* Given a certificate, validate the certificate for certain conditions which - * are if the given type matches the cert's one, if the signing key is - * included and if the that key was actually used to sign the certificate. - * - * Return 1 iff if all conditions pass or 0 if one of them fails. */ -STATIC int -cert_is_valid(tor_cert_t *cert, uint8_t type, const char *log_obj_type) -{ - tor_assert(log_obj_type); - - if (cert == NULL) { - log_warn(LD_REND, "Certificate for %s couldn't be parsed.", log_obj_type); - goto err; - } - if (cert->cert_type != type) { - log_warn(LD_REND, "Invalid cert type %02x for %s.", cert->cert_type, - log_obj_type); - goto err; - } - /* All certificate must have its signing key included. */ - if (!cert->signing_key_included) { - log_warn(LD_REND, "Signing key is NOT included for %s.", log_obj_type); - goto err; - } - /* The following will not only check if the signature matches but also the - * expiration date and overall validity. */ - if (tor_cert_checksig(cert, &cert->signing_key, approx_time()) < 0) { - log_warn(LD_REND, "Invalid signature for %s.", log_obj_type); - goto err; - } - - return 1; - err: - return 0; -} - -/* Given some binary data, try to parse it to get a certificate object. If we - * have a valid cert, validate it using the given wanted type. On error, print - * a log using the err_msg has the certificate identifier adding semantic to - * the log and cert_out is set to NULL. On success, 0 is returned and cert_out - * points to a newly allocated certificate object. */ -static int -cert_parse_and_validate(tor_cert_t **cert_out, const char *data, - size_t data_len, unsigned int cert_type_wanted, - const char *err_msg) -{ - tor_cert_t *cert; - - tor_assert(cert_out); - tor_assert(data); - tor_assert(err_msg); - - /* Parse certificate. */ - cert = tor_cert_parse((const uint8_t *) data, data_len); - if (!cert) { - log_warn(LD_REND, "Certificate for %s couldn't be parsed.", err_msg); - goto err; - } - - /* Validate certificate. */ - if (!cert_is_valid(cert, cert_type_wanted, err_msg)) { - goto err; - } - - *cert_out = cert; - return 0; - - err: - tor_cert_free(cert); - *cert_out = NULL; - return -1; -} - -/* Return true iff the given length of the encrypted data of a descriptor - * passes validation. */ -STATIC int -encrypted_data_length_is_valid(size_t len) -{ - /* Make sure there is enough data for the salt and the mac. The equality is - there to ensure that there is at least one byte of encrypted data. */ - if (len <= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN) { - log_warn(LD_REND, "Length of descriptor's encrypted data is too small. " - "Got %lu but minimum value is %d", - (unsigned long)len, HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); - goto err; - } - - return 1; - err: - return 0; -} - -/** Decrypt an encrypted descriptor layer at encrypted_blob of size - * encrypted_blob_size. Use the descriptor object desc to - * generate the right decryption keys; set decrypted_out to the - * plaintext. If is_superencrypted_layer is set, this is the outter - * encrypted layer of the descriptor. - * - * On any error case, including an empty output, return 0 and set - * *decrypted_out to NULL. - */ -MOCK_IMPL(STATIC size_t, -decrypt_desc_layer,(const hs_descriptor_t *desc, - const uint8_t *encrypted_blob, - size_t encrypted_blob_size, - int is_superencrypted_layer, - char **decrypted_out)) -{ - uint8_t *decrypted = NULL; - uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; - uint8_t mac_key[DIGEST256_LEN], our_mac[DIGEST256_LEN]; - const uint8_t *salt, *encrypted, *desc_mac; - size_t encrypted_len, result_len = 0; - - tor_assert(decrypted_out); - tor_assert(desc); - tor_assert(encrypted_blob); - - /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC . - * Make sure we have enough space for all these things. */ - if (!encrypted_data_length_is_valid(encrypted_blob_size)) { - goto err; - } - - /* Start of the blob thus the salt. */ - salt = encrypted_blob; - - /* Next is the encrypted data. */ - encrypted = encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN; - encrypted_len = encrypted_blob_size - - (HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); - tor_assert(encrypted_len > 0); /* guaranteed by the check above */ - - /* And last comes the MAC. */ - desc_mac = encrypted_blob + encrypted_blob_size - DIGEST256_LEN; - - /* KDF construction resulting in a key from which the secret key, IV and MAC - * key are extracted which is what we need for the decryption. */ - build_secret_key_iv_mac(desc, salt, HS_DESC_ENCRYPTED_SALT_LEN, - secret_key, sizeof(secret_key), - secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key), - is_superencrypted_layer); - - /* Build MAC. */ - build_mac(mac_key, sizeof(mac_key), salt, HS_DESC_ENCRYPTED_SALT_LEN, - encrypted, encrypted_len, our_mac, sizeof(our_mac)); - memwipe(mac_key, 0, sizeof(mac_key)); - /* Verify MAC; MAC is H(mac_key || salt || encrypted) - * - * This is a critical check that is making sure the computed MAC matches the - * one in the descriptor. */ - if (!tor_memeq(our_mac, desc_mac, sizeof(our_mac))) { - log_warn(LD_REND, "Encrypted service descriptor MAC check failed"); - goto err; - } - - { - /* Decrypt. Here we are assured that the encrypted length is valid for - * decryption. */ - crypto_cipher_t *cipher; - - cipher = crypto_cipher_new_with_iv_and_bits(secret_key, secret_iv, - HS_DESC_ENCRYPTED_BIT_SIZE); - /* Extra byte for the NUL terminated byte. */ - decrypted = tor_malloc_zero(encrypted_len + 1); - crypto_cipher_decrypt(cipher, (char *) decrypted, - (const char *) encrypted, encrypted_len); - crypto_cipher_free(cipher); - } - - { - /* Adjust length to remove NUL padding bytes */ - uint8_t *end = memchr(decrypted, 0, encrypted_len); - result_len = encrypted_len; - if (end) { - result_len = end - decrypted; - } - } - - if (result_len == 0) { - /* Treat this as an error, so that somebody will free the output. */ - goto err; - } - - /* Make sure to NUL terminate the string. */ - decrypted[encrypted_len] = '\0'; - *decrypted_out = (char *) decrypted; - goto done; - - err: - if (decrypted) { - tor_free(decrypted); - } - *decrypted_out = NULL; - result_len = 0; - - done: - memwipe(secret_key, 0, sizeof(secret_key)); - memwipe(secret_iv, 0, sizeof(secret_iv)); - return result_len; -} - -/* Basic validation that the superencrypted client auth portion of the - * descriptor is well-formed and recognized. Return True if so, otherwise - * return False. */ -static int -superencrypted_auth_data_is_valid(smartlist_t *tokens) -{ - /* XXX: This is just basic validation for now. When we implement client auth, - we can refactor this function so that it actually parses and saves the - data. */ - - { /* verify desc auth type */ - const directory_token_t *tok; - tok = find_by_keyword(tokens, R3_DESC_AUTH_TYPE); - tor_assert(tok->n_args >= 1); - if (strcmp(tok->args[0], "x25519")) { - log_warn(LD_DIR, "Unrecognized desc auth type"); - return 0; - } - } - - { /* verify desc auth key */ - const directory_token_t *tok; - curve25519_public_key_t k; - tok = find_by_keyword(tokens, R3_DESC_AUTH_KEY); - tor_assert(tok->n_args >= 1); - if (curve25519_public_from_base64(&k, tok->args[0]) < 0) { - log_warn(LD_DIR, "Bogus desc auth key in HS desc"); - return 0; - } - } - - /* verify desc auth client items */ - SMARTLIST_FOREACH_BEGIN(tokens, const directory_token_t *, tok) { - if (tok->tp == R3_DESC_AUTH_CLIENT) { - tor_assert(tok->n_args >= 3); - } - } SMARTLIST_FOREACH_END(tok); - - return 1; -} - -/* Parse message, the plaintext of the superencrypted portion of an HS - * descriptor. Set encrypted_out to the encrypted blob, and return its - * size */ -STATIC size_t -decode_superencrypted(const char *message, size_t message_len, - uint8_t **encrypted_out) -{ - int retval = 0; - memarea_t *area = NULL; - smartlist_t *tokens = NULL; - - area = memarea_new(); - tokens = smartlist_new(); - if (tokenize_string(area, message, message + message_len, tokens, - hs_desc_superencrypted_v3_token_table, 0) < 0) { - log_warn(LD_REND, "Superencrypted portion is not parseable"); - goto err; - } - - /* Do some rudimentary validation of the authentication data */ - if (!superencrypted_auth_data_is_valid(tokens)) { - log_warn(LD_REND, "Invalid auth data"); - goto err; - } - - /* Extract the encrypted data section. */ - { - const directory_token_t *tok; - tok = find_by_keyword(tokens, R3_ENCRYPTED); - tor_assert(tok->object_body); - if (strcmp(tok->object_type, "MESSAGE") != 0) { - log_warn(LD_REND, "Desc superencrypted data section is invalid"); - goto err; - } - /* Make sure the length of the encrypted blob is valid. */ - if (!encrypted_data_length_is_valid(tok->object_size)) { - goto err; - } - - /* Copy the encrypted blob to the descriptor object so we can handle it - * latter if needed. */ - tor_assert(tok->object_size <= INT_MAX); - *encrypted_out = tor_memdup(tok->object_body, tok->object_size); - retval = (int) tok->object_size; - } - - err: - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); - smartlist_free(tokens); - if (area) { - memarea_drop_all(area); - } - - return retval; -} - -/* Decrypt both the superencrypted and the encrypted section of the descriptor - * using the given descriptor object desc. A newly allocated NUL - * terminated string is put in decrypted_out which contains the inner encrypted - * layer of the descriptor. Return the length of decrypted_out on success else - * 0 is returned and decrypted_out is set to NULL. */ -static size_t -desc_decrypt_all(const hs_descriptor_t *desc, char **decrypted_out) -{ - size_t decrypted_len = 0; - size_t encrypted_len = 0; - size_t superencrypted_len = 0; - char *superencrypted_plaintext = NULL; - uint8_t *encrypted_blob = NULL; - - /** Function logic: This function takes us from the descriptor header to the - * inner encrypted layer, by decrypting and decoding the middle descriptor - * layer. In the end we return the contents of the inner encrypted layer to - * our caller. */ - - /* 1. Decrypt middle layer of descriptor */ - superencrypted_len = decrypt_desc_layer(desc, - desc->plaintext_data.superencrypted_blob, - desc->plaintext_data.superencrypted_blob_size, - 1, - &superencrypted_plaintext); - if (!superencrypted_len) { - log_warn(LD_REND, "Decrypting superencrypted desc failed."); - goto err; - } - tor_assert(superencrypted_plaintext); - - /* 2. Parse "superencrypted" */ - encrypted_len = decode_superencrypted(superencrypted_plaintext, - superencrypted_len, - &encrypted_blob); - if (!encrypted_len) { - log_warn(LD_REND, "Decrypting encrypted desc failed."); - goto err; - } - tor_assert(encrypted_blob); - - /* 3. Decrypt "encrypted" and set decrypted_out */ - char *decrypted_desc; - decrypted_len = decrypt_desc_layer(desc, - encrypted_blob, encrypted_len, - 0, &decrypted_desc); - if (!decrypted_len) { - log_warn(LD_REND, "Decrypting encrypted desc failed."); - goto err; - } - tor_assert(decrypted_desc); - - *decrypted_out = decrypted_desc; - - err: - tor_free(superencrypted_plaintext); - tor_free(encrypted_blob); - - return decrypted_len; -} - -/* Given the token tok for an intro point legacy key, the list of tokens, the - * introduction point ip being decoded and the descriptor desc from which it - * comes from, decode the legacy key and set the intro point object. Return 0 - * on success else -1 on failure. */ -static int -decode_intro_legacy_key(const directory_token_t *tok, - smartlist_t *tokens, - hs_desc_intro_point_t *ip, - const hs_descriptor_t *desc) -{ - tor_assert(tok); - tor_assert(tokens); - tor_assert(ip); - tor_assert(desc); - - if (!crypto_pk_public_exponent_ok(tok->key)) { - log_warn(LD_REND, "Introduction point legacy key is invalid"); - goto err; - } - ip->legacy.key = crypto_pk_dup_key(tok->key); - /* Extract the legacy cross certification cert which MUST be present if we - * have a legacy key. */ - tok = find_opt_by_keyword(tokens, R3_INTRO_LEGACY_KEY_CERT); - if (!tok) { - log_warn(LD_REND, "Introduction point legacy key cert is missing"); - goto err; - } - tor_assert(tok->object_body); - if (strcmp(tok->object_type, "CROSSCERT")) { - /* Info level because this might be an unknown field that we should - * ignore. */ - log_info(LD_REND, "Introduction point legacy encryption key " - "cross-certification has an unknown format."); - goto err; - } - /* Keep a copy of the certificate. */ - ip->legacy.cert.encoded = tor_memdup(tok->object_body, tok->object_size); - ip->legacy.cert.len = tok->object_size; - /* The check on the expiration date is for the entire lifetime of a - * certificate which is 24 hours. However, a descriptor has a maximum - * lifetime of 12 hours meaning we have a 12h difference between the two - * which ultimately accomodate the clock skewed client. */ - if (rsa_ed25519_crosscert_check(ip->legacy.cert.encoded, - ip->legacy.cert.len, ip->legacy.key, - &desc->plaintext_data.signing_pubkey, - approx_time() - HS_DESC_CERT_LIFETIME)) { - log_warn(LD_REND, "Unable to check cross-certification on the " - "introduction point legacy encryption key."); - ip->cross_certified = 0; - goto err; - } - - /* Success. */ - return 0; - err: - return -1; -} - -/* Dig into the descriptor tokens to find the onion key we should use - * for this intro point, and set it into onion_key_out. Return 0 if it - * was found and well-formed, otherwise return -1 in case of errors. */ -static int -set_intro_point_onion_key(curve25519_public_key_t *onion_key_out, - const smartlist_t *tokens) -{ - int retval = -1; - smartlist_t *onion_keys = NULL; - - tor_assert(onion_key_out); - - onion_keys = find_all_by_keyword(tokens, R3_INTRO_ONION_KEY); - if (!onion_keys) { - log_warn(LD_REND, "Descriptor did not contain intro onion keys"); - goto err; - } - - SMARTLIST_FOREACH_BEGIN(onion_keys, directory_token_t *, tok) { - /* This field is using GE(2) so for possible forward compatibility, we - * accept more fields but must be at least 2. */ - tor_assert(tok->n_args >= 2); - - /* Try to find an ntor key, it's the only recognized type right now */ - if (!strcmp(tok->args[0], "ntor")) { - if (curve25519_public_from_base64(onion_key_out, tok->args[1]) < 0) { - log_warn(LD_REND, "Introduction point ntor onion-key is invalid"); - goto err; - } - /* Got the onion key! Set the appropriate retval */ - retval = 0; - } - } SMARTLIST_FOREACH_END(tok); - - /* Log an error if we didn't find it :( */ - if (retval < 0) { - log_warn(LD_REND, "Descriptor did not contain ntor onion keys"); - } - - err: - smartlist_free(onion_keys); - return retval; -} - -/* Given the start of a section and the end of it, decode a single - * introduction point from that section. Return a newly allocated introduction - * point object containing the decoded data. Return NULL if the section can't - * be decoded. */ -STATIC hs_desc_intro_point_t * -decode_introduction_point(const hs_descriptor_t *desc, const char *start) -{ - hs_desc_intro_point_t *ip = NULL; - memarea_t *area = NULL; - smartlist_t *tokens = NULL; - const directory_token_t *tok; - - tor_assert(desc); - tor_assert(start); - - area = memarea_new(); - tokens = smartlist_new(); - if (tokenize_string(area, start, start + strlen(start), - tokens, hs_desc_intro_point_v3_token_table, 0) < 0) { - log_warn(LD_REND, "Introduction point is not parseable"); - goto err; - } - - /* Ok we seem to have a well formed section containing enough tokens to - * parse. Allocate our IP object and try to populate it. */ - ip = hs_desc_intro_point_new(); - - /* "introduction-point" SP link-specifiers NL */ - tok = find_by_keyword(tokens, R3_INTRODUCTION_POINT); - tor_assert(tok->n_args == 1); - /* Our constructor creates this list by default so free it. */ - smartlist_free(ip->link_specifiers); - ip->link_specifiers = decode_link_specifiers(tok->args[0]); - if (!ip->link_specifiers) { - log_warn(LD_REND, "Introduction point has invalid link specifiers"); - goto err; - } - - /* "onion-key" SP ntor SP key NL */ - if (set_intro_point_onion_key(&ip->onion_key, tokens) < 0) { - goto err; - } - - /* "auth-key" NL certificate NL */ - tok = find_by_keyword(tokens, R3_INTRO_AUTH_KEY); - tor_assert(tok->object_body); - if (strcmp(tok->object_type, "ED25519 CERT")) { - log_warn(LD_REND, "Unexpected object type for introduction auth key"); - goto err; - } - /* Parse cert and do some validation. */ - if (cert_parse_and_validate(&ip->auth_key_cert, tok->object_body, - tok->object_size, CERT_TYPE_AUTH_HS_IP_KEY, - "introduction point auth-key") < 0) { - goto err; - } - /* Validate authentication certificate with descriptor signing key. */ - if (tor_cert_checksig(ip->auth_key_cert, - &desc->plaintext_data.signing_pubkey, 0) < 0) { - log_warn(LD_REND, "Invalid authentication key signature"); - goto err; - } - - /* Exactly one "enc-key" SP "ntor" SP key NL */ - tok = find_by_keyword(tokens, R3_INTRO_ENC_KEY); - if (!strcmp(tok->args[0], "ntor")) { - /* This field is using GE(2) so for possible forward compatibility, we - * accept more fields but must be at least 2. */ - tor_assert(tok->n_args >= 2); - - if (curve25519_public_from_base64(&ip->enc_key, tok->args[1]) < 0) { - log_warn(LD_REND, "Introduction point ntor enc-key is invalid"); - goto err; - } - } else { - /* Unknown key type so we can't use that introduction point. */ - log_warn(LD_REND, "Introduction point encryption key is unrecognized."); - goto err; - } - - /* Exactly once "enc-key-cert" NL certificate NL */ - tok = find_by_keyword(tokens, R3_INTRO_ENC_KEY_CERT); - tor_assert(tok->object_body); - /* Do the cross certification. */ - if (strcmp(tok->object_type, "ED25519 CERT")) { - log_warn(LD_REND, "Introduction point ntor encryption key " - "cross-certification has an unknown format."); - goto err; - } - if (cert_parse_and_validate(&ip->enc_key_cert, tok->object_body, - tok->object_size, CERT_TYPE_CROSS_HS_IP_KEYS, - "introduction point enc-key-cert") < 0) { - goto err; - } - if (tor_cert_checksig(ip->enc_key_cert, - &desc->plaintext_data.signing_pubkey, 0) < 0) { - log_warn(LD_REND, "Invalid encryption key signature"); - goto err; - } - /* It is successfully cross certified. Flag the object. */ - ip->cross_certified = 1; - - /* Do we have a "legacy-key" SP key NL ?*/ - tok = find_opt_by_keyword(tokens, R3_INTRO_LEGACY_KEY); - if (tok) { - if (decode_intro_legacy_key(tok, tokens, ip, desc) < 0) { - goto err; - } - } - - /* Introduction point has been parsed successfully. */ - goto done; - - err: - hs_desc_intro_point_free(ip); - ip = NULL; - - done: - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); - smartlist_free(tokens); - if (area) { - memarea_drop_all(area); - } - - return ip; -} - -/* Given a descriptor string at data, decode all possible introduction - * points that we can find. Add the introduction point object to desc_enc as we - * find them. This function can't fail and it is possible that zero - * introduction points can be decoded. */ -static void -decode_intro_points(const hs_descriptor_t *desc, - hs_desc_encrypted_data_t *desc_enc, - const char *data) -{ - smartlist_t *chunked_desc = smartlist_new(); - smartlist_t *intro_points = smartlist_new(); - - tor_assert(desc); - tor_assert(desc_enc); - tor_assert(data); - tor_assert(desc_enc->intro_points); - - /* Take the desc string, and extract the intro point substrings out of it */ - { - /* Split the descriptor string using the intro point header as delimiter */ - smartlist_split_string(chunked_desc, data, str_intro_point_start, 0, 0); - - /* Check if there are actually any intro points included. The first chunk - * should be other descriptor fields (e.g. create2-formats), so it's not an - * intro point. */ - if (smartlist_len(chunked_desc) < 2) { - goto done; - } - } - - /* Take the intro point substrings, and prepare them for parsing */ - { - int i = 0; - /* Prepend the introduction-point header to all the chunks, since - smartlist_split_string() devoured it. */ - SMARTLIST_FOREACH_BEGIN(chunked_desc, char *, chunk) { - /* Ignore first chunk. It's other descriptor fields. */ - if (i++ == 0) { - continue; - } - - smartlist_add_asprintf(intro_points, "%s %s", str_intro_point, chunk); - } SMARTLIST_FOREACH_END(chunk); - } - - /* Parse the intro points! */ - SMARTLIST_FOREACH_BEGIN(intro_points, const char *, intro_point) { - hs_desc_intro_point_t *ip = decode_introduction_point(desc, intro_point); - if (!ip) { - /* Malformed introduction point section. We'll ignore this introduction - * point and continue parsing. New or unknown fields are possible for - * forward compatibility. */ - continue; - } - smartlist_add(desc_enc->intro_points, ip); - } SMARTLIST_FOREACH_END(intro_point); - - done: - SMARTLIST_FOREACH(chunked_desc, char *, a, tor_free(a)); - smartlist_free(chunked_desc); - SMARTLIST_FOREACH(intro_points, char *, a, tor_free(a)); - smartlist_free(intro_points); -} -/* Return 1 iff the given base64 encoded signature in b64_sig from the encoded - * descriptor in encoded_desc validates the descriptor content. */ -STATIC int -desc_sig_is_valid(const char *b64_sig, - const ed25519_public_key_t *signing_pubkey, - const char *encoded_desc, size_t encoded_len) -{ - int ret = 0; - ed25519_signature_t sig; - const char *sig_start; - - tor_assert(b64_sig); - tor_assert(signing_pubkey); - tor_assert(encoded_desc); - /* Verifying nothing won't end well :). */ - tor_assert(encoded_len > 0); - - /* Signature length check. */ - if (strlen(b64_sig) != ED25519_SIG_BASE64_LEN) { - log_warn(LD_REND, "Service descriptor has an invalid signature length." - "Exptected %d but got %lu", - ED25519_SIG_BASE64_LEN, (unsigned long) strlen(b64_sig)); - goto err; - } - - /* First, convert base64 blob to an ed25519 signature. */ - if (ed25519_signature_from_base64(&sig, b64_sig) != 0) { - log_warn(LD_REND, "Service descriptor does not contain a valid " - "signature"); - goto err; - } - - /* Find the start of signature. */ - sig_start = tor_memstr(encoded_desc, encoded_len, "\n" str_signature); - /* Getting here means the token parsing worked for the signature so if we - * can't find the start of the signature, we have a code flow issue. */ - if (!sig_start) { - log_warn(LD_GENERAL, "Malformed signature line. Rejecting."); - goto err; - } - /* Skip newline, it has to go in the signature check. */ - sig_start++; - - /* Validate signature with the full body of the descriptor. */ - if (ed25519_checksig_prefixed(&sig, - (const uint8_t *) encoded_desc, - sig_start - encoded_desc, - str_desc_sig_prefix, - signing_pubkey) != 0) { - log_warn(LD_REND, "Invalid signature on service descriptor"); - goto err; - } - /* Valid signature! All is good. */ - ret = 1; - - err: - return ret; -} - -/* Decode descriptor plaintext data for version 3. Given a list of tokens, an - * allocated plaintext object that will be populated and the encoded - * descriptor with its length. The last one is needed for signature - * verification. Unknown tokens are simply ignored so this won't error on - * unknowns but requires that all v3 token be present and valid. - * - * Return 0 on success else a negative value. */ -static int -desc_decode_plaintext_v3(smartlist_t *tokens, - hs_desc_plaintext_data_t *desc, - const char *encoded_desc, size_t encoded_len) -{ - int ok; - directory_token_t *tok; - - tor_assert(tokens); - tor_assert(desc); - /* Version higher could still use this function to decode most of the - * descriptor and then they decode the extra part. */ - tor_assert(desc->version >= 3); - - /* Descriptor lifetime parsing. */ - tok = find_by_keyword(tokens, R3_DESC_LIFETIME); - tor_assert(tok->n_args == 1); - desc->lifetime_sec = (uint32_t) tor_parse_ulong(tok->args[0], 10, 0, - UINT32_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_REND, "Service descriptor lifetime value is invalid"); - goto err; - } - /* Put it from minute to second. */ - desc->lifetime_sec *= 60; - if (desc->lifetime_sec > HS_DESC_MAX_LIFETIME) { - log_warn(LD_REND, "Service descriptor lifetime is too big. " - "Got %" PRIu32 " but max is %d", - desc->lifetime_sec, HS_DESC_MAX_LIFETIME); - goto err; - } - - /* Descriptor signing certificate. */ - tok = find_by_keyword(tokens, R3_DESC_SIGNING_CERT); - tor_assert(tok->object_body); - /* Expecting a prop220 cert with the signing key extension, which contains - * the blinded public key. */ - if (strcmp(tok->object_type, "ED25519 CERT") != 0) { - log_warn(LD_REND, "Service descriptor signing cert wrong type (%s)", - escaped(tok->object_type)); - goto err; - } - if (cert_parse_and_validate(&desc->signing_key_cert, tok->object_body, - tok->object_size, CERT_TYPE_SIGNING_HS_DESC, - "service descriptor signing key") < 0) { - goto err; - } - - /* Copy the public keys into signing_pubkey and blinded_pubkey */ - memcpy(&desc->signing_pubkey, &desc->signing_key_cert->signed_key, - sizeof(ed25519_public_key_t)); - memcpy(&desc->blinded_pubkey, &desc->signing_key_cert->signing_key, - sizeof(ed25519_public_key_t)); - - /* Extract revision counter value. */ - tok = find_by_keyword(tokens, R3_REVISION_COUNTER); - tor_assert(tok->n_args == 1); - desc->revision_counter = tor_parse_uint64(tok->args[0], 10, 0, - UINT64_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_REND, "Service descriptor revision-counter is invalid"); - goto err; - } - - /* Extract the encrypted data section. */ - tok = find_by_keyword(tokens, R3_SUPERENCRYPTED); - tor_assert(tok->object_body); - if (strcmp(tok->object_type, "MESSAGE") != 0) { - log_warn(LD_REND, "Service descriptor encrypted data section is invalid"); - goto err; - } - /* Make sure the length of the encrypted blob is valid. */ - if (!encrypted_data_length_is_valid(tok->object_size)) { - goto err; - } - - /* Copy the encrypted blob to the descriptor object so we can handle it - * latter if needed. */ - desc->superencrypted_blob = tor_memdup(tok->object_body, tok->object_size); - desc->superencrypted_blob_size = tok->object_size; - - /* Extract signature and verify it. */ - tok = find_by_keyword(tokens, R3_SIGNATURE); - tor_assert(tok->n_args == 1); - /* First arg here is the actual encoded signature. */ - if (!desc_sig_is_valid(tok->args[0], &desc->signing_pubkey, - encoded_desc, encoded_len)) { - goto err; - } - - return 0; - - err: - return -1; -} - -/* Decode the version 3 encrypted section of the given descriptor desc. The - * desc_encrypted_out will be populated with the decoded data. Return 0 on - * success else -1. */ -static int -desc_decode_encrypted_v3(const hs_descriptor_t *desc, - hs_desc_encrypted_data_t *desc_encrypted_out) -{ - int result = -1; - char *message = NULL; - size_t message_len; - memarea_t *area = NULL; - directory_token_t *tok; - smartlist_t *tokens = NULL; - - tor_assert(desc); - tor_assert(desc_encrypted_out); - - /* Decrypt the superencrypted data that is located in the plaintext section - * in the descriptor as a blob of bytes. */ - message_len = desc_decrypt_all(desc, &message); - if (!message_len) { - log_warn(LD_REND, "Service descriptor decryption failed."); - goto err; - } - tor_assert(message); - - area = memarea_new(); - tokens = smartlist_new(); - if (tokenize_string(area, message, message + message_len, - tokens, hs_desc_encrypted_v3_token_table, 0) < 0) { - log_warn(LD_REND, "Encrypted service descriptor is not parseable."); - goto err; - } - - /* CREATE2 supported cell format. It's mandatory. */ - tok = find_by_keyword(tokens, R3_CREATE2_FORMATS); - tor_assert(tok); - decode_create2_list(desc_encrypted_out, tok->args[0]); - /* Must support ntor according to the specification */ - if (!desc_encrypted_out->create2_ntor) { - log_warn(LD_REND, "Service create2-formats does not include ntor."); - goto err; - } - - /* Authentication type. It's optional but only once. */ - tok = find_opt_by_keyword(tokens, R3_INTRO_AUTH_REQUIRED); - if (tok) { - if (!decode_auth_type(desc_encrypted_out, tok->args[0])) { - log_warn(LD_REND, "Service descriptor authentication type has " - "invalid entry(ies)."); - goto err; - } - } - - /* Is this service a single onion service? */ - tok = find_opt_by_keyword(tokens, R3_SINGLE_ONION_SERVICE); - if (tok) { - desc_encrypted_out->single_onion_service = 1; - } - - /* Initialize the descriptor's introduction point list before we start - * decoding. Having 0 intro point is valid. Then decode them all. */ - desc_encrypted_out->intro_points = smartlist_new(); - decode_intro_points(desc, desc_encrypted_out, message); - - /* Validation of maximum introduction points allowed. */ - if (smartlist_len(desc_encrypted_out->intro_points) > - HS_CONFIG_V3_MAX_INTRO_POINTS) { - log_warn(LD_REND, "Service descriptor contains too many introduction " - "points. Maximum allowed is %d but we have %d", - HS_CONFIG_V3_MAX_INTRO_POINTS, - smartlist_len(desc_encrypted_out->intro_points)); - goto err; - } - - /* NOTE: Unknown fields are allowed because this function could be used to - * decode other descriptor version. */ - - result = 0; - goto done; - - err: - tor_assert(result < 0); - desc_encrypted_data_free_contents(desc_encrypted_out); - - done: - if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); - smartlist_free(tokens); - } - if (area) { - memarea_drop_all(area); - } - if (message) { - tor_free(message); - } - return result; -} - -/* Table of encrypted decode function version specific. The function are - * indexed by the version number so v3 callback is at index 3 in the array. */ -static int - (*decode_encrypted_handlers[])( - const hs_descriptor_t *desc, - hs_desc_encrypted_data_t *desc_encrypted) = -{ - /* v0 */ NULL, /* v1 */ NULL, /* v2 */ NULL, - desc_decode_encrypted_v3, -}; - -/* Decode the encrypted data section of the given descriptor and store the - * data in the given encrypted data object. Return 0 on success else a - * negative value on error. */ -int -hs_desc_decode_encrypted(const hs_descriptor_t *desc, - hs_desc_encrypted_data_t *desc_encrypted) -{ - int ret; - uint32_t version; - - tor_assert(desc); - /* Ease our life a bit. */ - version = desc->plaintext_data.version; - tor_assert(desc_encrypted); - /* Calling this function without an encrypted blob to parse is a code flow - * error. The plaintext parsing should never succeed in the first place - * without an encrypted section. */ - tor_assert(desc->plaintext_data.superencrypted_blob); - /* Let's make sure we have a supported version as well. By correctly parsing - * the plaintext, this should not fail. */ - if (BUG(!hs_desc_is_supported_version(version))) { - ret = -1; - goto err; - } - /* Extra precaution. Having no handler for the supported version should - * never happened else we forgot to add it but we bumped the version. */ - tor_assert(ARRAY_LENGTH(decode_encrypted_handlers) >= version); - tor_assert(decode_encrypted_handlers[version]); - - /* Run the version specific plaintext decoder. */ - ret = decode_encrypted_handlers[version](desc, desc_encrypted); - if (ret < 0) { - goto err; - } - - err: - return ret; -} - -/* Table of plaintext decode function version specific. The function are - * indexed by the version number so v3 callback is at index 3 in the array. */ -static int - (*decode_plaintext_handlers[])( - smartlist_t *tokens, - hs_desc_plaintext_data_t *desc, - const char *encoded_desc, - size_t encoded_len) = -{ - /* v0 */ NULL, /* v1 */ NULL, /* v2 */ NULL, - desc_decode_plaintext_v3, -}; - -/* Fully decode the given descriptor plaintext and store the data in the - * plaintext data object. Returns 0 on success else a negative value. */ -int -hs_desc_decode_plaintext(const char *encoded, - hs_desc_plaintext_data_t *plaintext) -{ - int ok = 0, ret = -1; - memarea_t *area = NULL; - smartlist_t *tokens = NULL; - size_t encoded_len; - directory_token_t *tok; - - tor_assert(encoded); - tor_assert(plaintext); - - /* Check that descriptor is within size limits. */ - encoded_len = strlen(encoded); - if (encoded_len >= hs_cache_get_max_descriptor_size()) { - log_warn(LD_REND, "Service descriptor is too big (%lu bytes)", - (unsigned long) encoded_len); - goto err; - } - - area = memarea_new(); - tokens = smartlist_new(); - /* Tokenize the descriptor so we can start to parse it. */ - if (tokenize_string(area, encoded, encoded + encoded_len, tokens, - hs_desc_v3_token_table, 0) < 0) { - log_warn(LD_REND, "Service descriptor is not parseable"); - goto err; - } - - /* Get the version of the descriptor which is the first mandatory field of - * the descriptor. From there, we'll decode the right descriptor version. */ - tok = find_by_keyword(tokens, R_HS_DESCRIPTOR); - tor_assert(tok->n_args == 1); - plaintext->version = (uint32_t) tor_parse_ulong(tok->args[0], 10, 0, - UINT32_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_REND, "Service descriptor has unparseable version %s", - escaped(tok->args[0])); - goto err; - } - if (!hs_desc_is_supported_version(plaintext->version)) { - log_warn(LD_REND, "Service descriptor has unsupported version %" PRIu32, - plaintext->version); - goto err; - } - /* Extra precaution. Having no handler for the supported version should - * never happened else we forgot to add it but we bumped the version. */ - tor_assert(ARRAY_LENGTH(decode_plaintext_handlers) >= plaintext->version); - tor_assert(decode_plaintext_handlers[plaintext->version]); - - /* Run the version specific plaintext decoder. */ - ret = decode_plaintext_handlers[plaintext->version](tokens, plaintext, - encoded, encoded_len); - if (ret < 0) { - goto err; - } - /* Success. Descriptor has been populated with the data. */ - ret = 0; - - err: - if (tokens) { - SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); - smartlist_free(tokens); - } - if (area) { - memarea_drop_all(area); - } - return ret; -} - -/* Fully decode an encoded descriptor and set a newly allocated descriptor - * object in desc_out. Subcredentials are used if not NULL else it's ignored. - * - * Return 0 on success. A negative value is returned on error and desc_out is - * set to NULL. */ -int -hs_desc_decode_descriptor(const char *encoded, - const uint8_t *subcredential, - hs_descriptor_t **desc_out) -{ - int ret = -1; - hs_descriptor_t *desc; - - tor_assert(encoded); - - desc = tor_malloc_zero(sizeof(hs_descriptor_t)); - - /* Subcredentials are optional. */ - if (BUG(!subcredential)) { - log_warn(LD_GENERAL, "Tried to decrypt without subcred. Impossible!"); - goto err; - } - - memcpy(desc->subcredential, subcredential, sizeof(desc->subcredential)); - - ret = hs_desc_decode_plaintext(encoded, &desc->plaintext_data); - if (ret < 0) { - goto err; - } - - ret = hs_desc_decode_encrypted(desc, &desc->encrypted_data); - if (ret < 0) { - goto err; - } - - if (desc_out) { - *desc_out = desc; - } else { - hs_descriptor_free(desc); - } - return ret; - - err: - hs_descriptor_free(desc); - if (desc_out) { - *desc_out = NULL; - } - - tor_assert(ret < 0); - return ret; -} - -/* Table of encode function version specific. The functions are indexed by the - * version number so v3 callback is at index 3 in the array. */ -static int - (*encode_handlers[])( - const hs_descriptor_t *desc, - const ed25519_keypair_t *signing_kp, - char **encoded_out) = -{ - /* v0 */ NULL, /* v1 */ NULL, /* v2 */ NULL, - desc_encode_v3, -}; - -/* Encode the given descriptor desc including signing with the given key pair - * signing_kp. On success, encoded_out points to a newly allocated NUL - * terminated string that contains the encoded descriptor as a string. - * - * Return 0 on success and encoded_out is a valid pointer. On error, -1 is - * returned and encoded_out is set to NULL. */ -MOCK_IMPL(int, -hs_desc_encode_descriptor,(const hs_descriptor_t *desc, - const ed25519_keypair_t *signing_kp, - char **encoded_out)) -{ - int ret = -1; - uint32_t version; - - tor_assert(desc); - tor_assert(encoded_out); - - /* Make sure we support the version of the descriptor format. */ - version = desc->plaintext_data.version; - if (!hs_desc_is_supported_version(version)) { - goto err; - } - /* Extra precaution. Having no handler for the supported version should - * never happened else we forgot to add it but we bumped the version. */ - tor_assert(ARRAY_LENGTH(encode_handlers) >= version); - tor_assert(encode_handlers[version]); - - ret = encode_handlers[version](desc, signing_kp, encoded_out); - if (ret < 0) { - goto err; - } - - /* Try to decode what we just encoded. Symmetry is nice! */ - ret = hs_desc_decode_descriptor(*encoded_out, desc->subcredential, NULL); - if (BUG(ret < 0)) { - goto err; - } - - return 0; - - err: - *encoded_out = NULL; - return ret; -} - -/* Free the descriptor plaintext data object. */ -void -hs_desc_plaintext_data_free_(hs_desc_plaintext_data_t *desc) -{ - desc_plaintext_data_free_contents(desc); - tor_free(desc); -} - -/* Free the descriptor encrypted data object. */ -void -hs_desc_encrypted_data_free_(hs_desc_encrypted_data_t *desc) -{ - desc_encrypted_data_free_contents(desc); - tor_free(desc); -} - -/* Free the given descriptor object. */ -void -hs_descriptor_free_(hs_descriptor_t *desc) -{ - if (!desc) { - return; - } - - desc_plaintext_data_free_contents(&desc->plaintext_data); - desc_encrypted_data_free_contents(&desc->encrypted_data); - tor_free(desc); -} - -/* Return the size in bytes of the given plaintext data object. A sizeof() is - * not enough because the object contains pointers and the encrypted blob. - * This is particularly useful for our OOM subsystem that tracks the HSDir - * cache size for instance. */ -size_t -hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data) -{ - tor_assert(data); - return (sizeof(*data) + sizeof(*data->signing_key_cert) + - data->superencrypted_blob_size); -} - -/* Return the size in bytes of the given encrypted data object. Used by OOM - * subsystem. */ -static size_t -hs_desc_encrypted_obj_size(const hs_desc_encrypted_data_t *data) -{ - tor_assert(data); - size_t intro_size = 0; - if (data->intro_auth_types) { - intro_size += - smartlist_len(data->intro_auth_types) * sizeof(intro_auth_types); - } - if (data->intro_points) { - /* XXX could follow pointers here and get more accurate size */ - intro_size += - smartlist_len(data->intro_points) * sizeof(hs_desc_intro_point_t); - } - - return sizeof(*data) + intro_size; -} - -/* Return the size in bytes of the given descriptor object. Used by OOM - * subsystem. */ - size_t -hs_desc_obj_size(const hs_descriptor_t *data) -{ - tor_assert(data); - return (hs_desc_plaintext_obj_size(&data->plaintext_data) + - hs_desc_encrypted_obj_size(&data->encrypted_data) + - sizeof(data->subcredential)); -} - -/* Return a newly allocated descriptor intro point. */ -hs_desc_intro_point_t * -hs_desc_intro_point_new(void) -{ - hs_desc_intro_point_t *ip = tor_malloc_zero(sizeof(*ip)); - ip->link_specifiers = smartlist_new(); - return ip; -} - -/* Free a descriptor intro point object. */ -void -hs_desc_intro_point_free_(hs_desc_intro_point_t *ip) -{ - if (ip == NULL) { - return; - } - if (ip->link_specifiers) { - SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *, - ls, hs_desc_link_specifier_free(ls)); - smartlist_free(ip->link_specifiers); - } - tor_cert_free(ip->auth_key_cert); - tor_cert_free(ip->enc_key_cert); - crypto_pk_free(ip->legacy.key); - tor_free(ip->legacy.cert.encoded); - tor_free(ip); -} - -/* Free the given descriptor link specifier. */ -void -hs_desc_link_specifier_free_(hs_desc_link_specifier_t *ls) -{ - if (ls == NULL) { - return; - } - tor_free(ls); -} - -/* Return a newly allocated descriptor link specifier using the given extend - * info and requested type. Return NULL on error. */ -hs_desc_link_specifier_t * -hs_desc_link_specifier_new(const extend_info_t *info, uint8_t type) -{ - hs_desc_link_specifier_t *ls = NULL; - - tor_assert(info); - - ls = tor_malloc_zero(sizeof(*ls)); - ls->type = type; - switch (ls->type) { - case LS_IPV4: - if (info->addr.family != AF_INET) { - goto err; - } - tor_addr_copy(&ls->u.ap.addr, &info->addr); - ls->u.ap.port = info->port; - break; - case LS_IPV6: - if (info->addr.family != AF_INET6) { - goto err; - } - tor_addr_copy(&ls->u.ap.addr, &info->addr); - ls->u.ap.port = info->port; - break; - case LS_LEGACY_ID: - /* Bug out if the identity digest is not set */ - if (BUG(tor_mem_is_zero(info->identity_digest, - sizeof(info->identity_digest)))) { - goto err; - } - memcpy(ls->u.legacy_id, info->identity_digest, sizeof(ls->u.legacy_id)); - break; - case LS_ED25519_ID: - /* ed25519 keys are optional for intro points */ - if (ed25519_public_key_is_zero(&info->ed_identity)) { - goto err; - } - memcpy(ls->u.ed25519_id, info->ed_identity.pubkey, - sizeof(ls->u.ed25519_id)); - break; - default: - /* Unknown type is code flow error. */ - tor_assert(0); - } - - return ls; - err: - tor_free(ls); - return NULL; -} - -/* From the given descriptor, remove and free every introduction point. */ -void -hs_descriptor_clear_intro_points(hs_descriptor_t *desc) -{ - smartlist_t *ips; - - tor_assert(desc); - - ips = desc->encrypted_data.intro_points; - if (ips) { - SMARTLIST_FOREACH(ips, hs_desc_intro_point_t *, - ip, hs_desc_intro_point_free(ip)); - smartlist_clear(ips); - } -} - -/* From a descriptor link specifier object spec, returned a newly allocated - * link specifier object that is the encoded representation of spec. Return - * NULL on error. */ -link_specifier_t * -hs_desc_lspec_to_trunnel(const hs_desc_link_specifier_t *spec) -{ - tor_assert(spec); - - link_specifier_t *ls = link_specifier_new(); - link_specifier_set_ls_type(ls, spec->type); - - switch (spec->type) { - case LS_IPV4: - link_specifier_set_un_ipv4_addr(ls, - tor_addr_to_ipv4h(&spec->u.ap.addr)); - link_specifier_set_un_ipv4_port(ls, spec->u.ap.port); - /* Four bytes IPv4 and two bytes port. */ - link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) + - sizeof(spec->u.ap.port)); - break; - case LS_IPV6: - { - size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls); - const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr); - uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls); - memcpy(ipv6_array, in6_addr, addr_len); - link_specifier_set_un_ipv6_port(ls, spec->u.ap.port); - /* Sixteen bytes IPv6 and two bytes port. */ - link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port)); - break; - } - case LS_LEGACY_ID: - { - size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls); - uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls); - memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len); - link_specifier_set_ls_len(ls, legacy_id_len); - break; - } - case LS_ED25519_ID: - { - size_t ed25519_id_len = link_specifier_getlen_un_ed25519_id(ls); - uint8_t *ed25519_id_array = link_specifier_getarray_un_ed25519_id(ls); - memcpy(ed25519_id_array, spec->u.ed25519_id, ed25519_id_len); - link_specifier_set_ls_len(ls, ed25519_id_len); - break; - } - default: - tor_assert_nonfatal_unreached(); - link_specifier_free(ls); - ls = NULL; - } - - return ls; -} - diff --git a/src/tor/src/or/hs_descriptor.h b/src/tor/src/or/hs_descriptor.h deleted file mode 100644 index 09979410e..000000000 --- a/src/tor/src/or/hs_descriptor.h +++ /dev/null @@ -1,284 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_descriptor.h - * \brief Header file for hs_descriptor.c - **/ - -#ifndef TOR_HS_DESCRIPTOR_H -#define TOR_HS_DESCRIPTOR_H - -#include - -#include "or.h" -#include "address.h" -#include "container.h" -#include "crypto.h" -#include "crypto_ed25519.h" -#include "torcert.h" - -/* Trunnel */ -struct link_specifier_t; - -/* The earliest descriptor format version we support. */ -#define HS_DESC_SUPPORTED_FORMAT_VERSION_MIN 3 -/* The latest descriptor format version we support. */ -#define HS_DESC_SUPPORTED_FORMAT_VERSION_MAX 3 - -/* Default lifetime of a descriptor in seconds. The valus is set at 3 hours - * which is 180 minutes or 10800 seconds. */ -#define HS_DESC_DEFAULT_LIFETIME (3 * 60 * 60) -/* Maximum lifetime of a descriptor in seconds. The value is set at 12 hours - * which is 720 minutes or 43200 seconds. */ -#define HS_DESC_MAX_LIFETIME (12 * 60 * 60) -/* Lifetime of certificate in the descriptor. This defines the lifetime of the - * descriptor signing key and the cross certification cert of that key. It is - * set to 54 hours because a descriptor can be around for 48 hours and because - * consensuses are used after the hour, add an extra 6 hours to give some time - * for the service to stop using it. */ -#define HS_DESC_CERT_LIFETIME (54 * 60 * 60) -/* Length of the salt needed for the encrypted section of a descriptor. */ -#define HS_DESC_ENCRYPTED_SALT_LEN 16 -/* Length of the secret input needed for the KDF construction which derives - * the encryption key for the encrypted data section of the descriptor. This - * adds up to 68 bytes being the blinded key, hashed subcredential and - * revision counter. */ -#define HS_DESC_ENCRYPTED_SECRET_INPUT_LEN \ - ED25519_PUBKEY_LEN + DIGEST256_LEN + sizeof(uint64_t) -/* Length of the KDF output value which is the length of the secret key, - * the secret IV and MAC key length which is the length of H() output. */ -#define HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN \ - CIPHER256_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN -/* Pad plaintext of superencrypted data section before encryption so that its - * length is a multiple of this value. */ -#define HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE 10000 -/* Maximum length in bytes of a full hidden service descriptor. */ -#define HS_DESC_MAX_LEN 50000 /* 50kb max size */ - -/* Key length for the descriptor symmetric encryption. As specified in the - * protocol, we use AES-256 for the encrypted section of the descriptor. The - * following is the length in bytes and the bit size. */ -#define HS_DESC_ENCRYPTED_KEY_LEN CIPHER256_KEY_LEN -#define HS_DESC_ENCRYPTED_BIT_SIZE (HS_DESC_ENCRYPTED_KEY_LEN * 8) - -/* Type of authentication in the descriptor. */ -typedef enum { - HS_DESC_AUTH_ED25519 = 1 -} hs_desc_auth_type_t; - -/* Link specifier object that contains information on how to extend to the - * relay that is the address, port and handshake type. */ -typedef struct hs_desc_link_specifier_t { - /* Indicate the type of link specifier. See trunnel ed25519_cert - * specification. */ - uint8_t type; - - /* It must be one of these types, can't be more than one. */ - union { - /* IP address and port of the relay use to extend. */ - tor_addr_port_t ap; - /* Legacy identity. A 20-byte SHA1 identity fingerprint. */ - uint8_t legacy_id[DIGEST_LEN]; - /* ed25519 identity. A 32-byte key. */ - uint8_t ed25519_id[ED25519_PUBKEY_LEN]; - } u; -} hs_desc_link_specifier_t; - -/* Introduction point information located in a descriptor. */ -typedef struct hs_desc_intro_point_t { - /* Link specifier(s) which details how to extend to the relay. This list - * contains hs_desc_link_specifier_t object. It MUST have at least one. */ - smartlist_t *link_specifiers; - - /* Onion key of the introduction point used to extend to it for the ntor - * handshake. */ - curve25519_public_key_t onion_key; - - /* Authentication key used to establish the introduction point circuit and - * cross-certifies the blinded public key for the replica thus signed by - * the blinded key and in turn signs it. */ - tor_cert_t *auth_key_cert; - - /* Encryption key for the "ntor" type. */ - curve25519_public_key_t enc_key; - - /* Certificate cross certifying the descriptor signing key by the encryption - * curve25519 key. This certificate contains the signing key and is of type - * CERT_TYPE_CROSS_HS_IP_KEYS [0B]. */ - tor_cert_t *enc_key_cert; - - /* (Optional): If this introduction point is a legacy one that is version <= - * 0.2.9.x (HSIntro=3), we use this extra key for the intro point to be able - * to relay the cells to the service correctly. */ - struct { - /* RSA public key. */ - crypto_pk_t *key; - - /* Cross certified cert with the descriptor signing key (RSA->Ed). Because - * of the cross certification API, we need to keep the certificate binary - * blob and its length in order to properly encode it after. */ - struct { - uint8_t *encoded; - size_t len; - } cert; - } legacy; - - /* True iff the introduction point has passed the cross certification. Upon - * decoding an intro point, this must be true. */ - unsigned int cross_certified : 1; -} hs_desc_intro_point_t; - -/* The encrypted data section of a descriptor. Obviously the data in this is - * in plaintext but encrypted once encoded. */ -typedef struct hs_desc_encrypted_data_t { - /* Bitfield of CREATE2 cell supported formats. The only currently supported - * format is ntor. */ - unsigned int create2_ntor : 1; - - /* A list of authentication types that a client must at least support one - * in order to contact the service. Contains NULL terminated strings. */ - smartlist_t *intro_auth_types; - - /* Is this descriptor a single onion service? */ - unsigned int single_onion_service : 1; - - /* A list of intro points. Contains hs_desc_intro_point_t objects. */ - smartlist_t *intro_points; -} hs_desc_encrypted_data_t; - -/* Plaintext data that is unencrypted information of the descriptor. */ -typedef struct hs_desc_plaintext_data_t { - /* Version of the descriptor format. Spec specifies this field as a - * positive integer. */ - uint32_t version; - - /* The lifetime of the descriptor in seconds. */ - uint32_t lifetime_sec; - - /* Certificate with the short-term ed22519 descriptor signing key for the - * replica which is signed by the blinded public key for that replica. */ - tor_cert_t *signing_key_cert; - - /* Signing public key which is used to sign the descriptor. Same public key - * as in the signing key certificate. */ - ed25519_public_key_t signing_pubkey; - - /* Blinded public key used for this descriptor derived from the master - * identity key and generated for a specific replica number. */ - ed25519_public_key_t blinded_pubkey; - - /* Revision counter is incremented at each upload, regardless of whether - * the descriptor has changed. This avoids leaking whether the descriptor - * has changed. Spec specifies this as a 8 bytes positive integer. */ - uint64_t revision_counter; - - /* Decoding only: The b64-decoded superencrypted blob from the descriptor */ - uint8_t *superencrypted_blob; - - /* Decoding only: Size of the superencrypted_blob */ - size_t superencrypted_blob_size; -} hs_desc_plaintext_data_t; - -/* Service descriptor in its decoded form. */ -typedef struct hs_descriptor_t { - /* Contains the plaintext part of the descriptor. */ - hs_desc_plaintext_data_t plaintext_data; - - /* The following contains what's in the encrypted part of the descriptor. - * It's only encrypted in the encoded version of the descriptor thus the - * data contained in that object is in plaintext. */ - hs_desc_encrypted_data_t encrypted_data; - - /* Subcredentials of a service, used by the client and service to decrypt - * the encrypted data. */ - uint8_t subcredential[DIGEST256_LEN]; -} hs_descriptor_t; - -/* Return true iff the given descriptor format version is supported. */ -static inline int -hs_desc_is_supported_version(uint32_t version) -{ - if (version < HS_DESC_SUPPORTED_FORMAT_VERSION_MIN || - version > HS_DESC_SUPPORTED_FORMAT_VERSION_MAX) { - return 0; - } - return 1; -} - -/* Public API. */ - -void hs_descriptor_free_(hs_descriptor_t *desc); -#define hs_descriptor_free(desc) \ - FREE_AND_NULL(hs_descriptor_t, hs_descriptor_free_, (desc)) -void hs_desc_plaintext_data_free_(hs_desc_plaintext_data_t *desc); -#define hs_desc_plaintext_data_free(desc) \ - FREE_AND_NULL(hs_desc_plaintext_data_t, hs_desc_plaintext_data_free_, (desc)) -void hs_desc_encrypted_data_free_(hs_desc_encrypted_data_t *desc); -#define hs_desc_encrypted_data_free(desc) \ - FREE_AND_NULL(hs_desc_encrypted_data_t, hs_desc_encrypted_data_free_, (desc)) - -void hs_desc_link_specifier_free_(hs_desc_link_specifier_t *ls); -#define hs_desc_link_specifier_free(ls) \ - FREE_AND_NULL(hs_desc_link_specifier_t, hs_desc_link_specifier_free_, (ls)) - -hs_desc_link_specifier_t *hs_desc_link_specifier_new( - const extend_info_t *info, uint8_t type); -void hs_descriptor_clear_intro_points(hs_descriptor_t *desc); - -MOCK_DECL(int, - hs_desc_encode_descriptor,(const hs_descriptor_t *desc, - const ed25519_keypair_t *signing_kp, - char **encoded_out)); - -int hs_desc_decode_descriptor(const char *encoded, - const uint8_t *subcredential, - hs_descriptor_t **desc_out); -int hs_desc_decode_plaintext(const char *encoded, - hs_desc_plaintext_data_t *plaintext); -int hs_desc_decode_encrypted(const hs_descriptor_t *desc, - hs_desc_encrypted_data_t *desc_out); - -size_t hs_desc_obj_size(const hs_descriptor_t *data); -size_t hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data); - -hs_desc_intro_point_t *hs_desc_intro_point_new(void); -void hs_desc_intro_point_free_(hs_desc_intro_point_t *ip); -#define hs_desc_intro_point_free(ip) \ - FREE_AND_NULL(hs_desc_intro_point_t, hs_desc_intro_point_free_, (ip)) - -link_specifier_t *hs_desc_lspec_to_trunnel( - const hs_desc_link_specifier_t *spec); - -#ifdef HS_DESCRIPTOR_PRIVATE - -/* Encoding. */ -STATIC char *encode_link_specifiers(const smartlist_t *specs); -STATIC size_t build_plaintext_padding(const char *plaintext, - size_t plaintext_len, - uint8_t **padded_out); -/* Decoding. */ -STATIC smartlist_t *decode_link_specifiers(const char *encoded); -STATIC hs_desc_intro_point_t *decode_introduction_point( - const hs_descriptor_t *desc, - const char *text); -STATIC int encrypted_data_length_is_valid(size_t len); -STATIC int cert_is_valid(tor_cert_t *cert, uint8_t type, - const char *log_obj_type); -STATIC int desc_sig_is_valid(const char *b64_sig, - const ed25519_public_key_t *signing_pubkey, - const char *encoded_desc, size_t encoded_len); -STATIC size_t decode_superencrypted(const char *message, size_t message_len, - uint8_t **encrypted_out); -STATIC void desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc); - -MOCK_DECL(STATIC size_t, decrypt_desc_layer,(const hs_descriptor_t *desc, - const uint8_t *encrypted_blob, - size_t encrypted_blob_size, - int is_superencrypted_layer, - char **decrypted_out)); - -#endif /* defined(HS_DESCRIPTOR_PRIVATE) */ - -#endif /* !defined(TOR_HS_DESCRIPTOR_H) */ - diff --git a/src/tor/src/or/hs_ident.c b/src/tor/src/or/hs_ident.c deleted file mode 100644 index 0bce2f625..000000000 --- a/src/tor/src/or/hs_ident.c +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_ident.c - * \brief Contains circuit and connection identifier code for the whole HS - * subsytem. - **/ - -#include "hs_ident.h" - -/* Return a newly allocated circuit identifier. The given public key is copied - * identity_pk into the identifier. */ -hs_ident_circuit_t * -hs_ident_circuit_new(const ed25519_public_key_t *identity_pk, - hs_ident_circuit_type_t circuit_type) -{ - tor_assert(circuit_type == HS_IDENT_CIRCUIT_INTRO || - circuit_type == HS_IDENT_CIRCUIT_RENDEZVOUS); - hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident)); - ed25519_pubkey_copy(&ident->identity_pk, identity_pk); - ident->circuit_type = circuit_type; - return ident; -} - -/* Free the given circuit identifier. */ -void -hs_ident_circuit_free_(hs_ident_circuit_t *ident) -{ - if (ident == NULL) { - return; - } - memwipe(ident, 0, sizeof(hs_ident_circuit_t)); - tor_free(ident); -} - -/* For a given circuit identifier src, return a newly allocated copy of it. - * This can't fail. */ -hs_ident_circuit_t * -hs_ident_circuit_dup(const hs_ident_circuit_t *src) -{ - hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident)); - memcpy(ident, src, sizeof(*ident)); - return ident; -} - -/* For a given directory connection identifier src, return a newly allocated - * copy of it. This can't fail. */ -hs_ident_dir_conn_t * -hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src) -{ - hs_ident_dir_conn_t *ident = tor_malloc_zero(sizeof(*ident)); - memcpy(ident, src, sizeof(*ident)); - return ident; -} - -/* Free the given directory connection identifier. */ -void -hs_ident_dir_conn_free_(hs_ident_dir_conn_t *ident) -{ - if (ident == NULL) { - return; - } - memwipe(ident, 0, sizeof(hs_ident_dir_conn_t)); - tor_free(ident); -} - -/* Initialized the allocated ident object with identity_pk and blinded_pk. - * None of them can be NULL since a valid directory connection identifier must - * have all fields set. */ -void -hs_ident_dir_conn_init(const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - hs_ident_dir_conn_t *ident) -{ - tor_assert(identity_pk); - tor_assert(blinded_pk); - tor_assert(ident); - - ed25519_pubkey_copy(&ident->identity_pk, identity_pk); - ed25519_pubkey_copy(&ident->blinded_pk, blinded_pk); -} - -/* Return a newly allocated edge connection identifier. The given public key - * identity_pk is copied into the identifier. */ -hs_ident_edge_conn_t * -hs_ident_edge_conn_new(const ed25519_public_key_t *identity_pk) -{ - hs_ident_edge_conn_t *ident = tor_malloc_zero(sizeof(*ident)); - ed25519_pubkey_copy(&ident->identity_pk, identity_pk); - return ident; -} - -/* Free the given edge connection identifier. */ -void -hs_ident_edge_conn_free_(hs_ident_edge_conn_t *ident) -{ - if (ident == NULL) { - return; - } - memwipe(ident, 0, sizeof(hs_ident_edge_conn_t)); - tor_free(ident); -} - -/* Return true if the given ident is valid for an introduction circuit. */ -int -hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident) -{ - if (ident == NULL) { - goto invalid; - } - - if (ed25519_public_key_is_zero(&ident->identity_pk)) { - goto invalid; - } - - if (ed25519_public_key_is_zero(&ident->intro_auth_pk)) { - goto invalid; - } - - /* Valid. */ - return 1; - invalid: - return 0; -} - diff --git a/src/tor/src/or/hs_ident.h b/src/tor/src/or/hs_ident.h deleted file mode 100644 index 91ec389aa..000000000 --- a/src/tor/src/or/hs_ident.h +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_ident.h - * \brief Header file containing circuit and connection identifier data for - * the whole HS subsytem. - * - * \details - * This interface is used to uniquely identify a hidden service on a circuit - * or connection using the service identity public key. Once the circuit or - * connection subsystem calls in the hidden service one, we use those - * identifiers to lookup the corresponding objects like service, intro point - * and descriptor. - * - * Furthermore, the circuit identifier holds cryptographic material needed for - * the e2e encryption on the rendezvous circuit which is set once the - * rendezvous circuit has opened and ready to be used. - **/ - -#ifndef TOR_HS_IDENT_H -#define TOR_HS_IDENT_H - -#include "crypto.h" -#include "crypto_ed25519.h" - -#include "hs_common.h" - -/* Length of the rendezvous cookie that is used to connect circuits at the - * rendezvous point. */ -#define HS_REND_COOKIE_LEN DIGEST_LEN - -/* Type of circuit an hs_ident_t object is associated with. */ -typedef enum { - HS_IDENT_CIRCUIT_INTRO = 1, - HS_IDENT_CIRCUIT_RENDEZVOUS = 2, -} hs_ident_circuit_type_t; - -/* Client and service side circuit identifier that is used for hidden service - * circuit establishment. Not all fields contain data, it depends on the - * circuit purpose. This is attached to an origin_circuit_t. All fields are - * used by both client and service. */ -typedef struct hs_ident_circuit_t { - /* (All circuit) The public key used to uniquely identify the service. It is - * the one found in the onion address. */ - ed25519_public_key_t identity_pk; - - /* (All circuit) The type of circuit this identifier is attached to. - * Accessors of the fields in this object assert non fatal on this circuit - * type. In other words, if a rendezvous field is being accessed, the - * circuit type MUST BE of type HS_IDENT_CIRCUIT_RENDEZVOUS. This value is - * set when an object is initialized in its constructor. */ - hs_ident_circuit_type_t circuit_type; - - /* (All circuit) Introduction point authentication key. It's also needed on - * the rendezvous circuit for the ntor handshake. It's used as the unique key - * of the introduction point so it should not be shared between multiple - * intro points. */ - ed25519_public_key_t intro_auth_pk; - - /* (Only client rendezvous circuit) Introduction point encryption public - * key. We keep it in the rendezvous identifier for the ntor handshake. */ - curve25519_public_key_t intro_enc_pk; - - /* (Only rendezvous circuit) Rendezvous cookie sent from the client to the - * service with an INTRODUCE1 cell and used by the service in an - * RENDEZVOUS1 cell. */ - uint8_t rendezvous_cookie[HS_REND_COOKIE_LEN]; - - /* (Only service rendezvous circuit) The HANDSHAKE_INFO needed in the - * RENDEZVOUS1 cell of the service. The construction is as follows: - * SERVER_PK [32 bytes] - * AUTH_MAC [32 bytes] - */ - uint8_t rendezvous_handshake_info[CURVE25519_PUBKEY_LEN + DIGEST256_LEN]; - - /* (Only client rendezvous circuit) Client ephemeral keypair needed for the - * e2e encryption with the service. */ - curve25519_keypair_t rendezvous_client_kp; - - /* (Only rendezvous circuit) The NTOR_KEY_SEED needed for key derivation for - * the e2e encryption with the client on the circuit. */ - uint8_t rendezvous_ntor_key_seed[DIGEST256_LEN]; - - /* (Only rendezvous circuit) Number of streams associated with this - * rendezvous circuit. We track this because there is a check on a maximum - * value. */ - uint64_t num_rdv_streams; -} hs_ident_circuit_t; - -/* Client and service side directory connection identifier used for a - * directory connection to identify which service is being queried. This is - * attached to a dir_connection_t. */ -typedef struct hs_ident_dir_conn_t { - /* The public key used to uniquely identify the service. It is the one found - * in the onion address. */ - ed25519_public_key_t identity_pk; - - /* The blinded public key used to uniquely identify the descriptor that this - * directory connection identifier is for. Only used by the service-side code - * to fine control descriptor uploads. */ - ed25519_public_key_t blinded_pk; - - /* XXX: Client authorization. */ -} hs_ident_dir_conn_t; - -/* Client and service side edge connection identifier used for an edge - * connection to identify which service is being queried. This is attached to - * a edge_connection_t. */ -typedef struct hs_ident_edge_conn_t { - /* The public key used to uniquely identify the service. It is the one found - * in the onion address. */ - ed25519_public_key_t identity_pk; - - /* XXX: Client authorization. */ -} hs_ident_edge_conn_t; - -/* Circuit identifier API. */ -hs_ident_circuit_t *hs_ident_circuit_new( - const ed25519_public_key_t *identity_pk, - hs_ident_circuit_type_t circuit_type); -void hs_ident_circuit_free_(hs_ident_circuit_t *ident); -#define hs_ident_circuit_free(id) \ - FREE_AND_NULL(hs_ident_circuit_t, hs_ident_circuit_free_, (id)) -hs_ident_circuit_t *hs_ident_circuit_dup(const hs_ident_circuit_t *src); - -/* Directory connection identifier API. */ -hs_ident_dir_conn_t *hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src); -void hs_ident_dir_conn_free_(hs_ident_dir_conn_t *ident); -#define hs_ident_dir_conn_free(id) \ - FREE_AND_NULL(hs_ident_dir_conn_t, hs_ident_dir_conn_free_, (id)) -void hs_ident_dir_conn_init(const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - hs_ident_dir_conn_t *ident); - -/* Edge connection identifier API. */ -hs_ident_edge_conn_t *hs_ident_edge_conn_new( - const ed25519_public_key_t *identity_pk); -void hs_ident_edge_conn_free_(hs_ident_edge_conn_t *ident); -#define hs_ident_edge_conn_free(id) \ - FREE_AND_NULL(hs_ident_edge_conn_t, hs_ident_edge_conn_free_, (id)) - -/* Validators */ -int hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident); - -#endif /* !defined(TOR_HS_IDENT_H) */ - diff --git a/src/tor/src/or/hs_intropoint.c b/src/tor/src/or/hs_intropoint.c deleted file mode 100644 index 4a5202f61..000000000 --- a/src/tor/src/or/hs_intropoint.c +++ /dev/null @@ -1,613 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_intropoint.c - * \brief Implement next generation introductions point functionality - **/ - -#define HS_INTROPOINT_PRIVATE - -#include "or.h" -#include "config.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "relay.h" -#include "rendmid.h" -#include "rephist.h" - -/* Trunnel */ -#include "ed25519_cert.h" -#include "hs/cell_common.h" -#include "hs/cell_establish_intro.h" -#include "hs/cell_introduce1.h" - -#include "hs_circuitmap.h" -#include "hs_descriptor.h" -#include "hs_intropoint.h" -#include "hs_common.h" - -/** Extract the authentication key from an ESTABLISH_INTRO or INTRODUCE1 using - * the given cell_type from cell and place it in - * auth_key_out. */ -STATIC void -get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, - unsigned int cell_type, const void *cell) -{ - size_t auth_key_len; - const uint8_t *key_array; - - tor_assert(auth_key_out); - tor_assert(cell); - - switch (cell_type) { - case RELAY_COMMAND_ESTABLISH_INTRO: - { - const trn_cell_establish_intro_t *c_cell = cell; - key_array = trn_cell_establish_intro_getconstarray_auth_key(c_cell); - auth_key_len = trn_cell_establish_intro_getlen_auth_key(c_cell); - break; - } - case RELAY_COMMAND_INTRODUCE1: - { - const trn_cell_introduce1_t *c_cell = cell; - key_array = trn_cell_introduce1_getconstarray_auth_key(cell); - auth_key_len = trn_cell_introduce1_getlen_auth_key(c_cell); - break; - } - default: - /* Getting here is really bad as it means we got a unknown cell type from - * this file where every call has an hardcoded value. */ - tor_assert(0); /* LCOV_EXCL_LINE */ - } - tor_assert(key_array); - tor_assert(auth_key_len == sizeof(auth_key_out->pubkey)); - memcpy(auth_key_out->pubkey, key_array, auth_key_len); -} - -/** We received an ESTABLISH_INTRO cell. Verify its signature and MAC, - * given circuit_key_material. Return 0 on success else -1 on error. */ -STATIC int -verify_establish_intro_cell(const trn_cell_establish_intro_t *cell, - const uint8_t *circuit_key_material, - size_t circuit_key_material_len) -{ - /* We only reach this function if the first byte of the cell is 0x02 which - * means that auth_key_type is of ed25519 type, hence this check should - * always pass. See hs_intro_received_establish_intro(). */ - if (BUG(cell->auth_key_type != HS_INTRO_AUTH_KEY_TYPE_ED25519)) { - return -1; - } - - /* Make sure the auth key length is of the right size for this type. For - * EXTRA safety, we check both the size of the array and the length which - * must be the same. Safety first!*/ - if (trn_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN || - trn_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "ESTABLISH_INTRO auth key length is invalid"); - return -1; - } - - const uint8_t *msg = cell->start_cell; - - /* Verify the sig */ - { - ed25519_signature_t sig_struct; - const uint8_t *sig_array = - trn_cell_establish_intro_getconstarray_sig(cell); - - /* Make sure the signature length is of the right size. For EXTRA safety, - * we check both the size of the array and the length which must be the - * same. Safety first!*/ - if (trn_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || - trn_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "ESTABLISH_INTRO sig len is invalid"); - return -1; - } - /* We are now sure that sig_len is of the right size. */ - memcpy(sig_struct.sig, sig_array, cell->sig_len); - - ed25519_public_key_t auth_key; - get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, cell); - - const size_t sig_msg_len = cell->end_sig_fields - msg; - int sig_mismatch = ed25519_checksig_prefixed(&sig_struct, - msg, sig_msg_len, - ESTABLISH_INTRO_SIG_PREFIX, - &auth_key); - if (sig_mismatch) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "ESTABLISH_INTRO signature not as expected"); - return -1; - } - } - - /* Verify the MAC */ - { - const size_t auth_msg_len = cell->end_mac_fields - msg; - uint8_t mac[DIGEST256_LEN]; - crypto_mac_sha3_256(mac, sizeof(mac), - circuit_key_material, circuit_key_material_len, - msg, auth_msg_len); - if (tor_memneq(mac, cell->handshake_mac, sizeof(mac))) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "ESTABLISH_INTRO handshake_auth not as expected"); - return -1; - } - } - - return 0; -} - -/* Send an INTRO_ESTABLISHED cell to circ. */ -MOCK_IMPL(int, -hs_intro_send_intro_established_cell,(or_circuit_t *circ)) -{ - int ret; - uint8_t *encoded_cell = NULL; - ssize_t encoded_len, result_len; - trn_cell_intro_established_t *cell; - trn_cell_extension_t *ext; - - tor_assert(circ); - - /* Build the cell payload. */ - cell = trn_cell_intro_established_new(); - ext = trn_cell_extension_new(); - trn_cell_extension_set_num(ext, 0); - trn_cell_intro_established_set_extensions(cell, ext); - /* Encode the cell to binary format. */ - encoded_len = trn_cell_intro_established_encoded_len(cell); - tor_assert(encoded_len > 0); - encoded_cell = tor_malloc_zero(encoded_len); - result_len = trn_cell_intro_established_encode(encoded_cell, encoded_len, - cell); - tor_assert(encoded_len == result_len); - - ret = relay_send_command_from_edge(0, TO_CIRCUIT(circ), - RELAY_COMMAND_INTRO_ESTABLISHED, - (char *) encoded_cell, encoded_len, - NULL); - /* On failure, the above function will close the circuit. */ - trn_cell_intro_established_free(cell); - tor_free(encoded_cell); - return ret; -} - -/** We received an ESTABLISH_INTRO parsed_cell on circ. It's - * well-formed and passed our verifications. Perform appropriate actions to - * establish an intro point. */ -static int -handle_verified_establish_intro_cell(or_circuit_t *circ, - const trn_cell_establish_intro_t *parsed_cell) -{ - /* Get the auth key of this intro point */ - ed25519_public_key_t auth_key; - get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, - parsed_cell); - - /* Then notify the hidden service that the intro point is established by - sending an INTRO_ESTABLISHED cell */ - if (hs_intro_send_intro_established_cell(circ)) { - log_warn(LD_PROTOCOL, "Couldn't send INTRO_ESTABLISHED cell."); - return -1; - } - - /* Associate intro point auth key with this circuit. */ - hs_circuitmap_register_intro_circ_v3_relay_side(circ, &auth_key); - /* Repurpose this circuit into an intro circuit. */ - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); - - return 0; -} - -/** We just received an ESTABLISH_INTRO cell in circ with payload in - * request. Handle it by making circ an intro circuit. Return 0 - * if everything went well, or -1 if there were errors. */ -static int -handle_establish_intro(or_circuit_t *circ, const uint8_t *request, - size_t request_len) -{ - int cell_ok, retval = -1; - trn_cell_establish_intro_t *parsed_cell = NULL; - - tor_assert(circ); - tor_assert(request); - - log_info(LD_REND, "Received an ESTABLISH_INTRO request on circuit %" PRIu32, - circ->p_circ_id); - - /* Check that the circuit is in shape to become an intro point */ - if (!hs_intro_circuit_is_suitable_for_establish_intro(circ)) { - goto err; - } - - /* Parse the cell */ - ssize_t parsing_result = trn_cell_establish_intro_parse(&parsed_cell, - request, request_len); - if (parsing_result < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting %s ESTABLISH_INTRO cell.", - parsing_result == -1 ? "invalid" : "truncated"); - goto err; - } - - cell_ok = verify_establish_intro_cell(parsed_cell, - (uint8_t *) circ->rend_circ_nonce, - sizeof(circ->rend_circ_nonce)); - if (cell_ok < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Failed to verify ESTABLISH_INTRO cell."); - goto err; - } - - /* This cell is legit. Take the appropriate actions. */ - cell_ok = handle_verified_establish_intro_cell(circ, parsed_cell); - if (cell_ok < 0) { - goto err; - } - - /* We are done! */ - retval = 0; - goto done; - - err: - /* When sending the intro establish ack, on error the circuit can be marked - * as closed so avoid a double close. */ - if (!TO_CIRCUIT(circ)->marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - } - - done: - trn_cell_establish_intro_free(parsed_cell); - return retval; -} - -/* Return True if circuit is suitable for being an intro circuit. */ -static int -circuit_is_suitable_intro_point(const or_circuit_t *circ, - const char *log_cell_type_str) -{ - tor_assert(circ); - tor_assert(log_cell_type_str); - - /* Basic circuit state sanity checks. */ - if (circ->base_.purpose != CIRCUIT_PURPOSE_OR) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting %s on non-OR circuit.", log_cell_type_str); - return 0; - } - - if (circ->base_.n_chan) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting %s on non-edge circuit.", log_cell_type_str); - return 0; - } - - /* Suitable. */ - return 1; -} - -/* Return True if circuit is suitable for being service-side intro circuit. */ -int -hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ) -{ - return circuit_is_suitable_intro_point(circ, "ESTABLISH_INTRO"); -} - -/* We just received an ESTABLISH_INTRO cell in circ. Figure out of it's - * a legacy or a next gen cell, and pass it to the appropriate handler. */ -int -hs_intro_received_establish_intro(or_circuit_t *circ, const uint8_t *request, - size_t request_len) -{ - tor_assert(circ); - tor_assert(request); - - if (request_len == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Empty ESTABLISH_INTRO cell."); - goto err; - } - - /* Using the first byte of the cell, figure out the version of - * ESTABLISH_INTRO and pass it to the appropriate cell handler */ - const uint8_t first_byte = request[0]; - switch (first_byte) { - case HS_INTRO_AUTH_KEY_TYPE_LEGACY0: - case HS_INTRO_AUTH_KEY_TYPE_LEGACY1: - return rend_mid_establish_intro_legacy(circ, request, request_len); - case HS_INTRO_AUTH_KEY_TYPE_ED25519: - return handle_establish_intro(circ, request, request_len); - default: - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Unrecognized AUTH_KEY_TYPE %u.", first_byte); - goto err; - } - - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return -1; -} - -/* Send an INTRODUCE_ACK cell onto the circuit circ with the status - * value in status. Depending on the status, it can be ACK or a NACK. - * Return 0 on success else a negative value on error which will close the - * circuit. */ -static int -send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) -{ - int ret = -1; - uint8_t *encoded_cell = NULL; - ssize_t encoded_len, result_len; - trn_cell_introduce_ack_t *cell; - trn_cell_extension_t *ext; - - tor_assert(circ); - - /* Setup the INTRODUCE_ACK cell. We have no extensions so the N_EXTENSIONS - * field is set to 0 by default with a new object. */ - cell = trn_cell_introduce_ack_new(); - ret = trn_cell_introduce_ack_set_status(cell, status); - /* We have no cell extensions in an INTRODUCE_ACK cell. */ - ext = trn_cell_extension_new(); - trn_cell_extension_set_num(ext, 0); - trn_cell_introduce_ack_set_extensions(cell, ext); - /* A wrong status is a very bad code flow error as this value is controlled - * by the code in this file and not an external input. This means we use a - * code that is not known by the trunnel ABI. */ - tor_assert(ret == 0); - /* Encode the payload. We should never fail to get the encoded length. */ - encoded_len = trn_cell_introduce_ack_encoded_len(cell); - tor_assert(encoded_len > 0); - encoded_cell = tor_malloc_zero(encoded_len); - result_len = trn_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); - tor_assert(encoded_len == result_len); - - ret = relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), - RELAY_COMMAND_INTRODUCE_ACK, - (char *) encoded_cell, encoded_len, - NULL); - /* On failure, the above function will close the circuit. */ - trn_cell_introduce_ack_free(cell); - tor_free(encoded_cell); - return ret; -} - -/* Validate a parsed INTRODUCE1 cell. Return 0 if valid or else a - * negative value for an invalid cell that should be NACKed. */ -STATIC int -validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell) -{ - size_t legacy_key_id_len; - const uint8_t *legacy_key_id; - - tor_assert(cell); - - /* This code path SHOULD NEVER be reached if the cell is a legacy type so - * safety net here. The legacy ID must be zeroes in this case. */ - legacy_key_id_len = trn_cell_introduce1_getlen_legacy_key_id(cell); - legacy_key_id = trn_cell_introduce1_getconstarray_legacy_key_id(cell); - if (BUG(!tor_mem_is_zero((char *) legacy_key_id, legacy_key_id_len))) { - goto invalid; - } - - /* The auth key of an INTRODUCE1 should be of type ed25519 thus leading to a - * known fixed length as well. */ - if (trn_cell_introduce1_get_auth_key_type(cell) != - HS_INTRO_AUTH_KEY_TYPE_ED25519) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting invalid INTRODUCE1 cell auth key type. " - "Responding with NACK."); - goto invalid; - } - if (trn_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || - trn_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting invalid INTRODUCE1 cell auth key length. " - "Responding with NACK."); - goto invalid; - } - if (trn_cell_introduce1_getlen_encrypted(cell) == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting invalid INTRODUCE1 cell encrypted length. " - "Responding with NACK."); - goto invalid; - } - - return 0; - invalid: - return -1; -} - -/* We just received a non legacy INTRODUCE1 cell on client_circ with - * the payload in request of size request_len. Return 0 if - * everything went well, or -1 if an error occured. This function is in charge - * of sending back an INTRODUCE_ACK cell and will close client_circ on error. - */ -STATIC int -handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, - size_t request_len) -{ - int ret = -1; - or_circuit_t *service_circ; - trn_cell_introduce1_t *parsed_cell; - hs_intro_ack_status_t status = HS_INTRO_ACK_STATUS_SUCCESS; - - tor_assert(client_circ); - tor_assert(request); - - /* Parse cell. Note that we can only parse the non encrypted section for - * which we'll use the authentication key to find the service introduction - * circuit and relay the cell on it. */ - ssize_t cell_size = trn_cell_introduce1_parse(&parsed_cell, request, - request_len); - if (cell_size < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Rejecting %s INTRODUCE1 cell. Responding with NACK.", - cell_size == -1 ? "invalid" : "truncated"); - /* Inform client that the INTRODUCE1 has a bad format. */ - status = HS_INTRO_ACK_STATUS_BAD_FORMAT; - goto send_ack; - } - - /* Once parsed validate the cell format. */ - if (validate_introduce1_parsed_cell(parsed_cell) < 0) { - /* Inform client that the INTRODUCE1 has bad format. */ - status = HS_INTRO_ACK_STATUS_BAD_FORMAT; - goto send_ack; - } - - /* Find introduction circuit through our circuit map. */ - { - ed25519_public_key_t auth_key; - get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell); - service_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); - if (service_circ == NULL) { - char b64_key[ED25519_BASE64_LEN + 1]; - ed25519_public_to_base64(b64_key, &auth_key); - log_info(LD_REND, "No intro circuit found for INTRODUCE1 cell " - "with auth key %s from circuit %" PRIu32 ". " - "Responding with NACK.", - safe_str(b64_key), client_circ->p_circ_id); - /* Inform the client that we don't know the requested service ID. */ - status = HS_INTRO_ACK_STATUS_UNKNOWN_ID; - goto send_ack; - } - } - - /* Relay the cell to the service on its intro circuit with an INTRODUCE2 - * cell which is the same exact payload. */ - if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(service_circ), - RELAY_COMMAND_INTRODUCE2, - (char *) request, request_len, NULL)) { - log_warn(LD_PROTOCOL, "Unable to send INTRODUCE2 cell to the service."); - /* Inform the client that we can't relay the cell. */ - status = HS_INTRO_ACK_STATUS_CANT_RELAY; - goto send_ack; - } - - /* Success! Send an INTRODUCE_ACK success status onto the client circuit. */ - status = HS_INTRO_ACK_STATUS_SUCCESS; - ret = 0; - - send_ack: - /* Send INTRODUCE_ACK or INTRODUCE_NACK to client */ - if (send_introduce_ack_cell(client_circ, status) < 0) { - log_warn(LD_PROTOCOL, "Unable to send an INTRODUCE ACK status %d " - "to client.", status); - /* Circuit has been closed on failure of transmission. */ - goto done; - } - if (status != HS_INTRO_ACK_STATUS_SUCCESS) { - /* We just sent a NACK that is a non success status code so close the - * circuit because it's not useful to keep it open. Remember, a client can - * only send one INTRODUCE1 cell on a circuit. */ - circuit_mark_for_close(TO_CIRCUIT(client_circ), END_CIRC_REASON_INTERNAL); - } - done: - trn_cell_introduce1_free(parsed_cell); - return ret; -} - -/* Identify if the encoded cell we just received is a legacy one or not. The - * request should be at least DIGEST_LEN bytes long. */ -STATIC int -introduce1_cell_is_legacy(const uint8_t *request) -{ - tor_assert(request); - - /* If the first 20 bytes of the cell (DIGEST_LEN) are NOT zeroes, it - * indicates a legacy cell (v2). */ - if (!tor_mem_is_zero((const char *) request, DIGEST_LEN)) { - /* Legacy cell. */ - return 1; - } - /* Not a legacy cell. */ - return 0; -} - -/* Return true iff the circuit circ is suitable for receiving an - * INTRODUCE1 cell. */ -STATIC int -circuit_is_suitable_for_introduce1(const or_circuit_t *circ) -{ - tor_assert(circ); - - /* Is this circuit an intro point circuit? */ - if (!circuit_is_suitable_intro_point(circ, "INTRODUCE1")) { - return 0; - } - - if (circ->already_received_introduce1) { - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Blocking multiple introductions on the same circuit. " - "Someone might be trying to attack a hidden service through " - "this relay."); - return 0; - } - - return 1; -} - -/* We just received an INTRODUCE1 cell on circ. Figure out which type - * it is and pass it to the appropriate handler. Return 0 on success else a - * negative value and the circuit is closed. */ -int -hs_intro_received_introduce1(or_circuit_t *circ, const uint8_t *request, - size_t request_len) -{ - int ret; - - tor_assert(circ); - tor_assert(request); - - /* A cell that can't hold a DIGEST_LEN is invalid as we need to check if - * it's a legacy cell or not using the first DIGEST_LEN bytes. */ - if (request_len < DIGEST_LEN) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Invalid INTRODUCE1 cell length."); - goto err; - } - - /* Make sure we have a circuit that can have an INTRODUCE1 cell on it. */ - if (!circuit_is_suitable_for_introduce1(circ)) { - /* We do not send a NACK because the circuit is not suitable for any kind - * of response or transmission as it's a violation of the protocol. */ - goto err; - } - /* Mark the circuit that we got this cell. None are allowed after this as a - * DoS mitigation since one circuit with one client can hammer a service. */ - circ->already_received_introduce1 = 1; - - /* We are sure here to have at least DIGEST_LEN bytes. */ - if (introduce1_cell_is_legacy(request)) { - /* Handle a legacy cell. */ - ret = rend_mid_introduce_legacy(circ, request, request_len); - } else { - /* Handle a non legacy cell. */ - ret = handle_introduce1(circ, request, request_len); - } - return ret; - - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return -1; -} - -/* Clear memory allocated by the given intropoint object ip (but don't free the - * object itself). */ -void -hs_intropoint_clear(hs_intropoint_t *ip) -{ - if (ip == NULL) { - return; - } - tor_cert_free(ip->auth_key_cert); - SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *, ls, - hs_desc_link_specifier_free(ls)); - smartlist_free(ip->link_specifiers); - memset(ip, 0, sizeof(hs_intropoint_t)); -} - diff --git a/src/tor/src/or/hs_intropoint.h b/src/tor/src/or/hs_intropoint.h deleted file mode 100644 index 749d1530e..000000000 --- a/src/tor/src/or/hs_intropoint.h +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_intropoint.h - * \brief Header file for hs_intropoint.c. - **/ - -#ifndef TOR_HS_INTRO_H -#define TOR_HS_INTRO_H - -#include "crypto_curve25519.h" -#include "torcert.h" - -/* Authentication key type in an ESTABLISH_INTRO cell. */ -typedef enum { - HS_INTRO_AUTH_KEY_TYPE_LEGACY0 = 0x00, - HS_INTRO_AUTH_KEY_TYPE_LEGACY1 = 0x01, - HS_INTRO_AUTH_KEY_TYPE_ED25519 = 0x02, -} hs_intro_auth_key_type_t; - -/* INTRODUCE_ACK status code. */ -typedef enum { - HS_INTRO_ACK_STATUS_SUCCESS = 0x0000, - HS_INTRO_ACK_STATUS_UNKNOWN_ID = 0x0001, - HS_INTRO_ACK_STATUS_BAD_FORMAT = 0x0002, - HS_INTRO_ACK_STATUS_CANT_RELAY = 0x0003, -} hs_intro_ack_status_t; - -/* Object containing introduction point common data between the service and - * the client side. */ -typedef struct hs_intropoint_t { - /* Does this intro point only supports legacy ID ?. */ - unsigned int is_only_legacy : 1; - - /* Authentication key certificate from the descriptor. */ - tor_cert_t *auth_key_cert; - /* A list of link specifier. */ - smartlist_t *link_specifiers; -} hs_intropoint_t; - -int hs_intro_received_establish_intro(or_circuit_t *circ, - const uint8_t *request, - size_t request_len); -int hs_intro_received_introduce1(or_circuit_t *circ, const uint8_t *request, - size_t request_len); - -MOCK_DECL(int, hs_intro_send_intro_established_cell,(or_circuit_t *circ)); - -/* also used by rendservice.c */ -int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ); - -hs_intropoint_t *hs_intro_new(void); -void hs_intropoint_clear(hs_intropoint_t *ip); - -#ifdef HS_INTROPOINT_PRIVATE - -#include "hs/cell_establish_intro.h" -#include "hs/cell_introduce1.h" - -STATIC int -verify_establish_intro_cell(const trn_cell_establish_intro_t *out, - const uint8_t *circuit_key_material, - size_t circuit_key_material_len); - -STATIC void -get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, - unsigned int cell_type, const void *cell); - -STATIC int introduce1_cell_is_legacy(const uint8_t *request); -STATIC int handle_introduce1(or_circuit_t *client_circ, - const uint8_t *request, size_t request_len); -STATIC int validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell); -STATIC int circuit_is_suitable_for_introduce1(const or_circuit_t *circ); - -#endif /* defined(HS_INTROPOINT_PRIVATE) */ - -#endif /* !defined(TOR_HS_INTRO_H) */ - diff --git a/src/tor/src/or/hs_ntor.c b/src/tor/src/or/hs_ntor.c deleted file mode 100644 index a416bc46c..000000000 --- a/src/tor/src/or/hs_ntor.c +++ /dev/null @@ -1,618 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** \file hs_ntor.c - * \brief Implements the ntor variant used in Tor hidden services. - * - * \details - * This module handles the variant of the ntor handshake that is documented in - * section [NTOR-WITH-EXTRA-DATA] of rend-spec-ng.txt . - * - * The functions in this file provide an API that should be used when sending - * or receiving INTRODUCE1/RENDEZVOUS1 cells to generate the various key - * material required to create and handle those cells. - * - * In the case of INTRODUCE1 it provides encryption and MAC keys to - * encode/decode the encrypted blob (see hs_ntor_intro_cell_keys_t). The - * relevant pub functions are hs_ntor_{client,service}_get_introduce1_keys(). - * - * In the case of RENDEZVOUS1 it calculates the MAC required to authenticate - * the cell, and also provides the key seed that is used to derive the crypto - * material for rendezvous encryption (see hs_ntor_rend_cell_keys_t). The - * relevant pub functions are hs_ntor_{client,service}_get_rendezvous1_keys(). - * It also provides a function (hs_ntor_circuit_key_expansion()) that does the - * rendezvous key expansion to setup end-to-end rend circuit keys. - */ - -#include "or.h" -#include "hs_ntor.h" - -/* String constants used by the ntor HS protocol */ -#define PROTOID "tor-hs-ntor-curve25519-sha3-256-1" -#define PROTOID_LEN (sizeof(PROTOID) - 1) -#define SERVER_STR "Server" -#define SERVER_STR_LEN (sizeof(SERVER_STR) - 1) - -/* Protocol-specific tweaks to our crypto inputs */ -#define T_HSENC PROTOID ":hs_key_extract" -#define T_HSENC_LEN (sizeof(T_HSENC) - 1) -#define T_HSVERIFY PROTOID ":hs_verify" -#define T_HSMAC PROTOID ":hs_mac" -#define M_HSEXPAND PROTOID ":hs_key_expand" -#define M_HSEXPAND_LEN (sizeof(M_HSEXPAND) - 1) - -/************************* Helper functions: *******************************/ - -/** Helper macro: copy len bytes from inp to ptr and - *advance ptr by the number of bytes copied. Stolen from onion_ntor.c */ -#define APPEND(ptr, inp, len) \ - STMT_BEGIN { \ - memcpy(ptr, (inp), (len)); \ - ptr += len; \ - } STMT_END - -/* Length of EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID */ -#define REND_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN * 2 + \ - ED25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN) -/* Length of auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" */ -#define REND_AUTH_INPUT_LEN (DIGEST256_LEN + ED25519_PUBKEY_LEN + \ - CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN + SERVER_STR_LEN) - -/** Helper function: Compute the last part of the HS ntor handshake which - * derives key material necessary to create and handle RENDEZVOUS1 - * cells. Function used by both client and service. The actual calculations is - * as follows: - * - * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) - * verify = MAC(rend_secret_hs_input, t_hsverify) - * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" - * auth_input_mac = MAC(auth_input, t_hsmac) - * - * where in the above, AUTH_KEY is intro_auth_pubkey, B is - * intro_enc_pubkey, Y is service_ephemeral_rend_pubkey, and X - * is client_ephemeral_enc_pubkey. The provided - * rend_secret_hs_input is of size REND_SECRET_HS_INPUT_LEN. - * - * The final results of NTOR_KEY_SEED and auth_input_mac are placed in - * hs_ntor_rend_cell_keys_out. Return 0 if everything went fine. */ -static int -get_rendezvous1_key_material(const uint8_t *rend_secret_hs_input, - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_public_key_t *service_ephemeral_rend_pubkey, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) -{ - int bad = 0; - uint8_t ntor_key_seed[DIGEST256_LEN]; - uint8_t ntor_verify[DIGEST256_LEN]; - uint8_t rend_auth_input[REND_AUTH_INPUT_LEN]; - uint8_t rend_cell_auth[DIGEST256_LEN]; - uint8_t *ptr; - - /* Let's build NTOR_KEY_SEED */ - crypto_mac_sha3_256(ntor_key_seed, sizeof(ntor_key_seed), - rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, - (const uint8_t *)T_HSENC, strlen(T_HSENC)); - bad |= safe_mem_is_zero(ntor_key_seed, DIGEST256_LEN); - - /* Let's build ntor_verify */ - crypto_mac_sha3_256(ntor_verify, sizeof(ntor_verify), - rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, - (const uint8_t *)T_HSVERIFY, strlen(T_HSVERIFY)); - bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); - - /* Let's build auth_input: */ - ptr = rend_auth_input; - /* Append ntor_verify */ - APPEND(ptr, ntor_verify, sizeof(ntor_verify)); - /* Append AUTH_KEY */ - APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); - /* Append B */ - APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append Y */ - APPEND(ptr, - service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append X */ - APPEND(ptr, - client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append PROTOID */ - APPEND(ptr, PROTOID, strlen(PROTOID)); - /* Append "Server" */ - APPEND(ptr, SERVER_STR, strlen(SERVER_STR)); - tor_assert(ptr == rend_auth_input + sizeof(rend_auth_input)); - - /* Let's build auth_input_mac that goes in RENDEZVOUS1 cell */ - crypto_mac_sha3_256(rend_cell_auth, sizeof(rend_cell_auth), - rend_auth_input, sizeof(rend_auth_input), - (const uint8_t *)T_HSMAC, strlen(T_HSMAC)); - bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); - - { /* Get the computed RENDEZVOUS1 material! */ - memcpy(&hs_ntor_rend_cell_keys_out->rend_cell_auth_mac, - rend_cell_auth, DIGEST256_LEN); - memcpy(&hs_ntor_rend_cell_keys_out->ntor_key_seed, - ntor_key_seed, DIGEST256_LEN); - } - - memwipe(rend_cell_auth, 0, sizeof(rend_cell_auth)); - memwipe(rend_auth_input, 0, sizeof(rend_auth_input)); - memwipe(ntor_key_seed, 0, sizeof(ntor_key_seed)); - - return bad; -} - -/** Length of secret_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID */ -#define INTRO_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN +ED25519_PUBKEY_LEN +\ - CURVE25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN + PROTOID_LEN) -/* Length of info = m_hsexpand | subcredential */ -#define INFO_BLOB_LEN (M_HSEXPAND_LEN + DIGEST256_LEN) -/* Length of KDF input = intro_secret_hs_input | t_hsenc | info */ -#define KDF_INPUT_LEN (INTRO_SECRET_HS_INPUT_LEN + T_HSENC_LEN + INFO_BLOB_LEN) - -/** Helper function: Compute the part of the HS ntor handshake that generates - * key material for creating and handling INTRODUCE1 cells. Function used - * by both client and service. Specifically, calculate the following: - * - * info = m_hsexpand | subcredential - * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) - * ENC_KEY = hs_keys[0:S_KEY_LEN] - * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] - * - * where intro_secret_hs_input is secret_input (of size - * INTRO_SECRET_HS_INPUT_LEN), and subcredential is of size - * DIGEST256_LEN. - * - * If everything went well, fill hs_ntor_intro_cell_keys_out with the - * necessary key material, and return 0. */ -static void -get_introduce1_key_material(const uint8_t *secret_input, - const uint8_t *subcredential, - hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) -{ - uint8_t keystream[CIPHER256_KEY_LEN + DIGEST256_LEN]; - uint8_t info_blob[INFO_BLOB_LEN]; - uint8_t kdf_input[KDF_INPUT_LEN]; - crypto_xof_t *xof; - uint8_t *ptr; - - /* Let's build info */ - ptr = info_blob; - APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); - APPEND(ptr, subcredential, DIGEST256_LEN); - tor_assert(ptr == info_blob + sizeof(info_blob)); - - /* Let's build the input to the KDF */ - ptr = kdf_input; - APPEND(ptr, secret_input, INTRO_SECRET_HS_INPUT_LEN); - APPEND(ptr, T_HSENC, strlen(T_HSENC)); - APPEND(ptr, info_blob, sizeof(info_blob)); - tor_assert(ptr == kdf_input + sizeof(kdf_input)); - - /* Now we need to run kdf_input over SHAKE-256 */ - xof = crypto_xof_new(); - crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); - crypto_xof_squeeze_bytes(xof, keystream, sizeof(keystream)) ; - crypto_xof_free(xof); - - { /* Get the keys */ - memcpy(&hs_ntor_intro_cell_keys_out->enc_key, keystream,CIPHER256_KEY_LEN); - memcpy(&hs_ntor_intro_cell_keys_out->mac_key, - keystream+CIPHER256_KEY_LEN, DIGEST256_LEN); - } - - memwipe(keystream, 0, sizeof(keystream)); - memwipe(kdf_input, 0, sizeof(kdf_input)); -} - -/** Helper function: Calculate the 'intro_secret_hs_input' element used by the - * HS ntor handshake and place it in secret_input_out. This function is - * used by both client and service code. - * - * For the client-side it looks like this: - * - * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID - * - * whereas for the service-side it looks like this: - * - * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID - * - * In this function, dh_result carries the EXP() result (and has size - * CURVE25519_OUTPUT_LEN) intro_auth_pubkey is AUTH_KEY, - * client_ephemeral_enc_pubkey is X, and intro_enc_pubkey is B. - */ -static void -get_intro_secret_hs_input(const uint8_t *dh_result, - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - const curve25519_public_key_t *intro_enc_pubkey, - uint8_t *secret_input_out) -{ - uint8_t *ptr; - - /* Append EXP() */ - ptr = secret_input_out; - APPEND(ptr, dh_result, CURVE25519_OUTPUT_LEN); - /* Append AUTH_KEY */ - APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); - /* Append X */ - APPEND(ptr, client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append B */ - APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append PROTOID */ - APPEND(ptr, PROTOID, strlen(PROTOID)); - tor_assert(ptr == secret_input_out + INTRO_SECRET_HS_INPUT_LEN); -} - -/** Calculate the 'rend_secret_hs_input' element used by the HS ntor handshake - * and place it in rend_secret_hs_input_out. This function is used by - * both client and service code. - * - * The computation on the client side is: - * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID - * whereas on the service side it is: - * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID - * - * where: - * dh_result1 and dh_result2 carry the two EXP() results (of size - * CURVE25519_OUTPUT_LEN) - * intro_auth_pubkey is AUTH_KEY, - * intro_enc_pubkey is B, - * client_ephemeral_enc_pubkey is X, and - * service_ephemeral_rend_pubkey is Y. - */ -static void -get_rend_secret_hs_input(const uint8_t *dh_result1, const uint8_t *dh_result2, - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - const curve25519_public_key_t *service_ephemeral_rend_pubkey, - uint8_t *rend_secret_hs_input_out) -{ - uint8_t *ptr; - - ptr = rend_secret_hs_input_out; - /* Append the first EXP() */ - APPEND(ptr, dh_result1, CURVE25519_OUTPUT_LEN); - /* Append the other EXP() */ - APPEND(ptr, dh_result2, CURVE25519_OUTPUT_LEN); - /* Append AUTH_KEY */ - APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); - /* Append B */ - APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append X */ - APPEND(ptr, - client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append Y */ - APPEND(ptr, - service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); - /* Append PROTOID */ - APPEND(ptr, PROTOID, strlen(PROTOID)); - tor_assert(ptr == rend_secret_hs_input_out + REND_SECRET_HS_INPUT_LEN); -} - -/************************* Public functions: *******************************/ - -/* Public function: Do the appropriate ntor calculations and derive the keys - * needed to encrypt and authenticate INTRODUCE1 cells. Return 0 and place the - * final key material in hs_ntor_intro_cell_keys_out if everything went - * well, otherwise return -1; - * - * The relevant calculations are as follows: - * - * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID - * info = m_hsexpand | subcredential - * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) - * ENC_KEY = hs_keys[0:S_KEY_LEN] - * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] - * - * where: - * intro_auth_pubkey is AUTH_KEY (found in HS descriptor), - * intro_enc_pubkey is B (also found in HS descriptor), - * client_ephemeral_enc_keypair is freshly generated keypair (x,X) - * subcredential is the hidden service subcredential (of size - * DIGEST256_LEN). */ -int -hs_ntor_client_get_introduce1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_keypair_t *client_ephemeral_enc_keypair, - const uint8_t *subcredential, - hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) -{ - int bad = 0; - uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; - uint8_t dh_result[CURVE25519_OUTPUT_LEN]; - - tor_assert(intro_auth_pubkey); - tor_assert(intro_enc_pubkey); - tor_assert(client_ephemeral_enc_keypair); - tor_assert(subcredential); - tor_assert(hs_ntor_intro_cell_keys_out); - - /* Calculate EXP(B,x) */ - curve25519_handshake(dh_result, - &client_ephemeral_enc_keypair->seckey, - intro_enc_pubkey); - bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); - - /* Get intro_secret_hs_input */ - get_intro_secret_hs_input(dh_result, intro_auth_pubkey, - &client_ephemeral_enc_keypair->pubkey, - intro_enc_pubkey, secret_input); - bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); - - /* Get ENC_KEY and MAC_KEY! */ - get_introduce1_key_material(secret_input, subcredential, - hs_ntor_intro_cell_keys_out); - - /* Cleanup */ - memwipe(secret_input, 0, sizeof(secret_input)); - if (bad) { - memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); - } - - return bad ? -1 : 0; -} - -/* Public function: Do the appropriate ntor calculations and derive the keys - * needed to verify RENDEZVOUS1 cells and encrypt further rendezvous - * traffic. Return 0 and place the final key material in - * hs_ntor_rend_cell_keys_out if everything went well, else return -1. - * - * The relevant calculations are as follows: - * - * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID - * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) - * verify = MAC(rend_secret_hs_input, t_hsverify) - * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" - * auth_input_mac = MAC(auth_input, t_hsmac) - * - * where: - * intro_auth_pubkey is AUTH_KEY (found in HS descriptor), - * client_ephemeral_enc_keypair is freshly generated keypair (x,X) - * intro_enc_pubkey is B (also found in HS descriptor), - * service_ephemeral_rend_pubkey is Y (SERVER_PK in RENDEZVOUS1 cell) */ -int -hs_ntor_client_get_rendezvous1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *client_ephemeral_enc_keypair, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_public_key_t *service_ephemeral_rend_pubkey, - hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) -{ - int bad = 0; - uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; - uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; - uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; - - tor_assert(intro_auth_pubkey); - tor_assert(client_ephemeral_enc_keypair); - tor_assert(intro_enc_pubkey); - tor_assert(service_ephemeral_rend_pubkey); - tor_assert(hs_ntor_rend_cell_keys_out); - - /* Compute EXP(Y, x) */ - curve25519_handshake(dh_result1, - &client_ephemeral_enc_keypair->seckey, - service_ephemeral_rend_pubkey); - bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); - - /* Compute EXP(B, x) */ - curve25519_handshake(dh_result2, - &client_ephemeral_enc_keypair->seckey, - intro_enc_pubkey); - bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); - - /* Get rend_secret_hs_input */ - get_rend_secret_hs_input(dh_result1, dh_result2, - intro_auth_pubkey, intro_enc_pubkey, - &client_ephemeral_enc_keypair->pubkey, - service_ephemeral_rend_pubkey, - rend_secret_hs_input); - - /* Get NTOR_KEY_SEED and the auth_input MAC */ - bad |= get_rendezvous1_key_material(rend_secret_hs_input, - intro_auth_pubkey, - intro_enc_pubkey, - service_ephemeral_rend_pubkey, - &client_ephemeral_enc_keypair->pubkey, - hs_ntor_rend_cell_keys_out); - - memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); - if (bad) { - memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); - } - - return bad ? -1 : 0; -} - -/* Public function: Do the appropriate ntor calculations and derive the keys - * needed to decrypt and verify INTRODUCE1 cells. Return 0 and place the final - * key material in hs_ntor_intro_cell_keys_out if everything went well, - * otherwise return -1; - * - * The relevant calculations are as follows: - * - * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID - * info = m_hsexpand | subcredential - * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) - * HS_DEC_KEY = hs_keys[0:S_KEY_LEN] - * HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] - * - * where: - * intro_auth_pubkey is AUTH_KEY (introduction point auth key), - * intro_enc_keypair is (b,B) (introduction point encryption keypair), - * client_ephemeral_enc_pubkey is X (CLIENT_PK in INTRODUCE2 cell), - * subcredential is the HS subcredential (of size DIGEST256_LEN) */ -int -hs_ntor_service_get_introduce1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *intro_enc_keypair, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - const uint8_t *subcredential, - hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) -{ - int bad = 0; - uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; - uint8_t dh_result[CURVE25519_OUTPUT_LEN]; - - tor_assert(intro_auth_pubkey); - tor_assert(intro_enc_keypair); - tor_assert(client_ephemeral_enc_pubkey); - tor_assert(subcredential); - tor_assert(hs_ntor_intro_cell_keys_out); - - /* Compute EXP(X, b) */ - curve25519_handshake(dh_result, - &intro_enc_keypair->seckey, - client_ephemeral_enc_pubkey); - bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); - - /* Get intro_secret_hs_input */ - get_intro_secret_hs_input(dh_result, intro_auth_pubkey, - client_ephemeral_enc_pubkey, - &intro_enc_keypair->pubkey, - secret_input); - bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); - - /* Get ENC_KEY and MAC_KEY! */ - get_introduce1_key_material(secret_input, subcredential, - hs_ntor_intro_cell_keys_out); - - memwipe(secret_input, 0, sizeof(secret_input)); - if (bad) { - memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); - } - - return bad ? -1 : 0; -} - -/* Public function: Do the appropriate ntor calculations and derive the keys - * needed to create and authenticate RENDEZVOUS1 cells. Return 0 and place the - * final key material in hs_ntor_rend_cell_keys_out if all went fine, - * return -1 if error happened. - * - * The relevant calculations are as follows: - * - * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID - * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) - * verify = MAC(rend_secret_hs_input, t_hsverify) - * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" - * auth_input_mac = MAC(auth_input, t_hsmac) - * - * where: - * intro_auth_pubkey is AUTH_KEY (intro point auth key), - * intro_enc_keypair is (b,B) (intro point enc keypair) - * service_ephemeral_rend_keypair is a fresh (y,Y) keypair - * client_ephemeral_enc_pubkey is X (CLIENT_PK in INTRODUCE2 cell) */ -int -hs_ntor_service_get_rendezvous1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *intro_enc_keypair, - const curve25519_keypair_t *service_ephemeral_rend_keypair, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) -{ - int bad = 0; - uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; - uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; - uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; - - tor_assert(intro_auth_pubkey); - tor_assert(intro_enc_keypair); - tor_assert(service_ephemeral_rend_keypair); - tor_assert(client_ephemeral_enc_pubkey); - tor_assert(hs_ntor_rend_cell_keys_out); - - /* Compute EXP(X, y) */ - curve25519_handshake(dh_result1, - &service_ephemeral_rend_keypair->seckey, - client_ephemeral_enc_pubkey); - bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); - - /* Compute EXP(X, b) */ - curve25519_handshake(dh_result2, - &intro_enc_keypair->seckey, - client_ephemeral_enc_pubkey); - bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); - - /* Get rend_secret_hs_input */ - get_rend_secret_hs_input(dh_result1, dh_result2, - intro_auth_pubkey, - &intro_enc_keypair->pubkey, - client_ephemeral_enc_pubkey, - &service_ephemeral_rend_keypair->pubkey, - rend_secret_hs_input); - - /* Get NTOR_KEY_SEED and AUTH_INPUT_MAC! */ - bad |= get_rendezvous1_key_material(rend_secret_hs_input, - intro_auth_pubkey, - &intro_enc_keypair->pubkey, - &service_ephemeral_rend_keypair->pubkey, - client_ephemeral_enc_pubkey, - hs_ntor_rend_cell_keys_out); - - memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); - if (bad) { - memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); - } - - return bad ? -1 : 0; -} - -/** Given a received RENDEZVOUS2 MAC in mac (of length DIGEST256_LEN), - * and the RENDEZVOUS1 key material in hs_ntor_rend_cell_keys, return 1 - * if the MAC is good, otherwise return 0. */ -int -hs_ntor_client_rendezvous2_mac_is_good( - const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, - const uint8_t *rcvd_mac) -{ - tor_assert(rcvd_mac); - tor_assert(hs_ntor_rend_cell_keys); - - return tor_memeq(hs_ntor_rend_cell_keys->rend_cell_auth_mac, - rcvd_mac, DIGEST256_LEN); -} - -/* Input length to KDF for key expansion */ -#define NTOR_KEY_EXPANSION_KDF_INPUT_LEN (DIGEST256_LEN + M_HSEXPAND_LEN) - -/** Given the rendezvous key seed in ntor_key_seed (of size - * DIGEST256_LEN), do the circuit key expansion as specified by section - * '4.2.1. Key expansion' and place the keys in keys_out (which must be - * of size HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN). - * - * Return 0 if things went well, else return -1. */ -int -hs_ntor_circuit_key_expansion(const uint8_t *ntor_key_seed, size_t seed_len, - uint8_t *keys_out, size_t keys_out_len) -{ - uint8_t *ptr; - uint8_t kdf_input[NTOR_KEY_EXPANSION_KDF_INPUT_LEN]; - crypto_xof_t *xof; - - /* Sanity checks on lengths to make sure we are good */ - if (BUG(seed_len != DIGEST256_LEN)) { - return -1; - } - if (BUG(keys_out_len != HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN)) { - return -1; - } - - /* Let's build the input to the KDF */ - ptr = kdf_input; - APPEND(ptr, ntor_key_seed, DIGEST256_LEN); - APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); - tor_assert(ptr == kdf_input + sizeof(kdf_input)); - - /* Generate the keys */ - xof = crypto_xof_new(); - crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); - crypto_xof_squeeze_bytes(xof, keys_out, HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN); - crypto_xof_free(xof); - - return 0; -} - diff --git a/src/tor/src/or/hs_ntor.h b/src/tor/src/or/hs_ntor.h deleted file mode 100644 index 77e544a13..000000000 --- a/src/tor/src/or/hs_ntor.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_HS_NTOR_H -#define TOR_HS_NTOR_H - -#include "or.h" - -/* Output length of KDF for key expansion */ -#define HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN \ - (DIGEST256_LEN*2 + CIPHER256_KEY_LEN*2) - -/* Key material needed to encode/decode INTRODUCE1 cells */ -typedef struct { - /* Key used for encryption of encrypted INTRODUCE1 blob */ - uint8_t enc_key[CIPHER256_KEY_LEN]; - /* MAC key used to protect encrypted INTRODUCE1 blob */ - uint8_t mac_key[DIGEST256_LEN]; -} hs_ntor_intro_cell_keys_t; - -/* Key material needed to encode/decode RENDEZVOUS1 cells */ -typedef struct { - /* This is the MAC of the HANDSHAKE_INFO field */ - uint8_t rend_cell_auth_mac[DIGEST256_LEN]; - /* This is the key seed used to derive further rendezvous crypto keys as - * detailed in section 4.2.1 of rend-spec-ng.txt. */ - uint8_t ntor_key_seed[DIGEST256_LEN]; -} hs_ntor_rend_cell_keys_t; - -int hs_ntor_client_get_introduce1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_keypair_t *client_ephemeral_enc_keypair, - const uint8_t *subcredential, - hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); - -int hs_ntor_client_get_rendezvous1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *client_ephemeral_enc_keypair, - const curve25519_public_key_t *intro_enc_pubkey, - const curve25519_public_key_t *service_ephemeral_rend_pubkey, - hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); - -int hs_ntor_service_get_introduce1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *intro_enc_keypair, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - const uint8_t *subcredential, - hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); - -int hs_ntor_service_get_rendezvous1_keys( - const ed25519_public_key_t *intro_auth_pubkey, - const curve25519_keypair_t *intro_enc_keypair, - const curve25519_keypair_t *service_ephemeral_rend_keypair, - const curve25519_public_key_t *client_ephemeral_enc_pubkey, - hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); - -int hs_ntor_circuit_key_expansion(const uint8_t *ntor_key_seed, - size_t seed_len, - uint8_t *keys_out, size_t keys_out_len); - -int hs_ntor_client_rendezvous2_mac_is_good( - const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, - const uint8_t *rcvd_mac); - -#endif /* !defined(TOR_HS_NTOR_H) */ - diff --git a/src/tor/src/or/hs_service.c b/src/tor/src/or/hs_service.c deleted file mode 100644 index 80f3e5020..000000000 --- a/src/tor/src/or/hs_service.c +++ /dev/null @@ -1,3563 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_service.c - * \brief Implement next generation hidden service functionality - **/ - -#define HS_SERVICE_PRIVATE - -#include "or.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "connection.h" -#include "directory.h" -#include "main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "relay.h" -#include "rendservice.h" -#include "router.h" -#include "routerkeys.h" -#include "routerlist.h" -#include "shared_random_state.h" -#include "statefile.h" - -#include "hs_circuit.h" -#include "hs_common.h" -#include "hs_config.h" -#include "hs_control.h" -#include "hs_circuit.h" -#include "hs_descriptor.h" -#include "hs_ident.h" -#include "hs_intropoint.h" -#include "hs_service.h" - -/* Trunnel */ -#include "ed25519_cert.h" -#include "hs/cell_common.h" -#include "hs/cell_establish_intro.h" - -/* Helper macro. Iterate over every service in the global map. The var is the - * name of the service pointer. */ -#define FOR_EACH_SERVICE_BEGIN(var) \ - STMT_BEGIN \ - hs_service_t **var##_iter, *var; \ - HT_FOREACH(var##_iter, hs_service_ht, hs_service_map) { \ - var = *var##_iter; -#define FOR_EACH_SERVICE_END } STMT_END ; - -/* Helper macro. Iterate over both current and previous descriptor of a - * service. The var is the name of the descriptor pointer. This macro skips - * any descriptor object of the service that is NULL. */ -#define FOR_EACH_DESCRIPTOR_BEGIN(service, var) \ - STMT_BEGIN \ - hs_service_descriptor_t *var; \ - for (int var ## _loop_idx = 0; var ## _loop_idx < 2; \ - ++var ## _loop_idx) { \ - (var ## _loop_idx == 0) ? (var = service->desc_current) : \ - (var = service->desc_next); \ - if (var == NULL) continue; -#define FOR_EACH_DESCRIPTOR_END } STMT_END ; - -/* Onion service directory file names. */ -static const char fname_keyfile_prefix[] = "hs_ed25519"; -static const char fname_hostname[] = "hostname"; -static const char address_tld[] = "onion"; - -/* Staging list of service object. When configuring service, we add them to - * this list considered a staging area and they will get added to our global - * map once the keys have been loaded. These two steps are seperated because - * loading keys requires that we are an actual running tor process. */ -static smartlist_t *hs_service_staging_list; - -/** True if the list of available router descriptors might have changed which - * might result in an altered hash ring. Check if the hash ring changed and - * reupload if needed */ -static int consider_republishing_hs_descriptors = 0; - -static void set_descriptor_revision_counter(hs_descriptor_t *hs_desc); -static void move_descriptors(hs_service_t *src, hs_service_t *dst); - -/* Helper: Function to compare two objects in the service map. Return 1 if the - * two service have the same master public identity key. */ -static inline int -hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second) -{ - tor_assert(first); - tor_assert(second); - /* Simple key compare. */ - return ed25519_pubkey_eq(&first->keys.identity_pk, - &second->keys.identity_pk); -} - -/* Helper: Function for the service hash table code below. The key used is the - * master public identity key which is ultimately the onion address. */ -static inline unsigned int -hs_service_ht_hash(const hs_service_t *service) -{ - tor_assert(service); - return (unsigned int) siphash24g(service->keys.identity_pk.pubkey, - sizeof(service->keys.identity_pk.pubkey)); -} - -/* This is _the_ global hash map of hidden services which indexed the service - * contained in it by master public identity key which is roughly the onion - * address of the service. */ -static struct hs_service_ht *hs_service_map; - -/* Register the service hash table. */ -HT_PROTOTYPE(hs_service_ht, /* Name of hashtable. */ - hs_service_t, /* Object contained in the map. */ - hs_service_node, /* The name of the HT_ENTRY member. */ - hs_service_ht_hash, /* Hashing function. */ - hs_service_ht_eq) /* Compare function for objects. */ - -HT_GENERATE2(hs_service_ht, hs_service_t, hs_service_node, - hs_service_ht_hash, hs_service_ht_eq, - 0.6, tor_reallocarray, tor_free_) - -/* Query the given service map with a public key and return a service object - * if found else NULL. It is also possible to set a directory path in the - * search query. If pk is NULL, then it will be set to zero indicating the - * hash table to compare the directory path instead. */ -STATIC hs_service_t * -find_service(hs_service_ht *map, const ed25519_public_key_t *pk) -{ - hs_service_t dummy_service; - tor_assert(map); - tor_assert(pk); - memset(&dummy_service, 0, sizeof(dummy_service)); - ed25519_pubkey_copy(&dummy_service.keys.identity_pk, pk); - return HT_FIND(hs_service_ht, map, &dummy_service); -} - -/* Register the given service in the given map. If the service already exists - * in the map, -1 is returned. On success, 0 is returned and the service - * ownership has been transfered to the global map. */ -STATIC int -register_service(hs_service_ht *map, hs_service_t *service) -{ - tor_assert(map); - tor_assert(service); - tor_assert(!ed25519_public_key_is_zero(&service->keys.identity_pk)); - - if (find_service(map, &service->keys.identity_pk)) { - /* Existing service with the same key. Do not register it. */ - return -1; - } - /* Taking ownership of the object at this point. */ - HT_INSERT(hs_service_ht, map, service); - return 0; -} - -/* Remove a given service from the given map. If service is NULL or the - * service key is unset, return gracefully. */ -STATIC void -remove_service(hs_service_ht *map, hs_service_t *service) -{ - hs_service_t *elm; - - tor_assert(map); - - /* Ignore if no service or key is zero. */ - if (BUG(service == NULL) || - BUG(ed25519_public_key_is_zero(&service->keys.identity_pk))) { - return; - } - - elm = HT_REMOVE(hs_service_ht, map, service); - if (elm) { - tor_assert(elm == service); - } else { - log_warn(LD_BUG, "Could not find service in the global map " - "while removing service %s", - escaped(service->config.directory_path)); - } -} - -/* Set the default values for a service configuration object c. */ -static void -set_service_default_config(hs_service_config_t *c, - const or_options_t *options) -{ - (void) options; - tor_assert(c); - c->ports = smartlist_new(); - c->directory_path = NULL; - c->max_streams_per_rdv_circuit = 0; - c->max_streams_close_circuit = 0; - c->num_intro_points = NUM_INTRO_POINTS_DEFAULT; - c->allow_unknown_ports = 0; - c->is_single_onion = 0; - c->dir_group_readable = 0; - c->is_ephemeral = 0; -} - -/* From a service configuration object config, clear everything from it - * meaning free allocated pointers and reset the values. */ -static void -service_clear_config(hs_service_config_t *config) -{ - if (config == NULL) { - return; - } - tor_free(config->directory_path); - if (config->ports) { - SMARTLIST_FOREACH(config->ports, rend_service_port_config_t *, p, - rend_service_port_config_free(p);); - smartlist_free(config->ports); - } - memset(config, 0, sizeof(*config)); -} - -/* Helper function to return a human readable description of the given intro - * point object. - * - * This function is not thread-safe. Each call to this invalidates the - * previous values returned by it. */ -static const char * -describe_intro_point(const hs_service_intro_point_t *ip) -{ - /* Hex identity digest of the IP prefixed by the $ sign and ends with NUL - * byte hence the plus two. */ - static char buf[HEX_DIGEST_LEN + 2]; - const char *legacy_id = NULL; - - SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers, - const hs_desc_link_specifier_t *, lspec) { - if (lspec->type == LS_LEGACY_ID) { - legacy_id = (const char *) lspec->u.legacy_id; - break; - } - } SMARTLIST_FOREACH_END(lspec); - - /* For now, we only print the identity digest but we could improve this with - * much more information such as the ed25519 identity has well. */ - buf[0] = '$'; - if (legacy_id) { - base16_encode(buf + 1, HEX_DIGEST_LEN + 1, legacy_id, DIGEST_LEN); - } - - return buf; -} - -/* Return the lower bound of maximum INTRODUCE2 cells per circuit before we - * rotate intro point (defined by a consensus parameter or the default - * value). */ -static int32_t -get_intro_point_min_introduce2(void) -{ - /* The [0, 2147483647] range is quite large to accomodate anything we decide - * in the future. */ - return networkstatus_get_param(NULL, "hs_intro_min_introduce2", - INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS, - 0, INT32_MAX); -} - -/* Return the upper bound of maximum INTRODUCE2 cells per circuit before we - * rotate intro point (defined by a consensus parameter or the default - * value). */ -static int32_t -get_intro_point_max_introduce2(void) -{ - /* The [0, 2147483647] range is quite large to accomodate anything we decide - * in the future. */ - return networkstatus_get_param(NULL, "hs_intro_max_introduce2", - INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS, - 0, INT32_MAX); -} - -/* Return the minimum lifetime in seconds of an introduction point defined by a - * consensus parameter or the default value. */ -static int32_t -get_intro_point_min_lifetime(void) -{ -#define MIN_INTRO_POINT_LIFETIME_TESTING 10 - if (get_options()->TestingTorNetwork) { - return MIN_INTRO_POINT_LIFETIME_TESTING; - } - - /* The [0, 2147483647] range is quite large to accomodate anything we decide - * in the future. */ - return networkstatus_get_param(NULL, "hs_intro_min_lifetime", - INTRO_POINT_LIFETIME_MIN_SECONDS, - 0, INT32_MAX); -} - -/* Return the maximum lifetime in seconds of an introduction point defined by a - * consensus parameter or the default value. */ -static int32_t -get_intro_point_max_lifetime(void) -{ -#define MAX_INTRO_POINT_LIFETIME_TESTING 30 - if (get_options()->TestingTorNetwork) { - return MAX_INTRO_POINT_LIFETIME_TESTING; - } - - /* The [0, 2147483647] range is quite large to accomodate anything we decide - * in the future. */ - return networkstatus_get_param(NULL, "hs_intro_max_lifetime", - INTRO_POINT_LIFETIME_MAX_SECONDS, - 0, INT32_MAX); -} - -/* Return the number of extra introduction point defined by a consensus - * parameter or the default value. */ -static int32_t -get_intro_point_num_extra(void) -{ - /* The [0, 128] range bounds the number of extra introduction point allowed. - * Above 128 intro points, it's getting a bit crazy. */ - return networkstatus_get_param(NULL, "hs_intro_num_extra", - NUM_INTRO_POINTS_EXTRA, 0, 128); -} - -/* Helper: Function that needs to return 1 for the HT for each loop which - * frees every service in an hash map. */ -static int -ht_free_service_(struct hs_service_t *service, void *data) -{ - (void) data; - hs_service_free(service); - /* This function MUST return 1 so the given object is then removed from the - * service map leading to this free of the object being safe. */ - return 1; -} - -/* Free every service that can be found in the global map. Once done, clear - * and free the global map. */ -static void -service_free_all(void) -{ - if (hs_service_map) { - /* The free helper function returns 1 so this is safe. */ - hs_service_ht_HT_FOREACH_FN(hs_service_map, ht_free_service_, NULL); - HT_CLEAR(hs_service_ht, hs_service_map); - tor_free(hs_service_map); - hs_service_map = NULL; - } - - if (hs_service_staging_list) { - /* Cleanup staging list. */ - SMARTLIST_FOREACH(hs_service_staging_list, hs_service_t *, s, - hs_service_free(s)); - smartlist_free(hs_service_staging_list); - hs_service_staging_list = NULL; - } -} - -/* Free a given service intro point object. */ -STATIC void -service_intro_point_free_(hs_service_intro_point_t *ip) -{ - if (!ip) { - return; - } - memwipe(&ip->auth_key_kp, 0, sizeof(ip->auth_key_kp)); - memwipe(&ip->enc_key_kp, 0, sizeof(ip->enc_key_kp)); - crypto_pk_free(ip->legacy_key); - replaycache_free(ip->replay_cache); - hs_intropoint_clear(&ip->base); - tor_free(ip); -} - -/* Helper: free an hs_service_intro_point_t object. This function is used by - * digest256map_free() which requires a void * pointer. */ -static void -service_intro_point_free_void(void *obj) -{ - service_intro_point_free_(obj); -} - -/* Return a newly allocated service intro point and fully initialized from the - * given extend_info_t ei if non NULL. If is_legacy is true, we also generate - * the legacy key. On error, NULL is returned. - * - * If ei is NULL, returns a hs_service_intro_point_t with an empty link - * specifier list and no onion key. (This is used for testing.) - * - * ei must be an extend_info_t containing an IPv4 address. (We will add supoort - * for IPv6 in a later release.) When calling extend_info_from_node(), pass - * 0 in for_direct_connection to make sure ei always has an IPv4 address. */ -STATIC hs_service_intro_point_t * -service_intro_point_new(const extend_info_t *ei, unsigned int is_legacy) -{ - hs_desc_link_specifier_t *ls; - hs_service_intro_point_t *ip; - - ip = tor_malloc_zero(sizeof(*ip)); - /* We'll create the key material. No need for extra strong, those are short - * term keys. */ - ed25519_keypair_generate(&ip->auth_key_kp, 0); - - { /* Set introduce2 max cells limit */ - int32_t min_introduce2_cells = get_intro_point_min_introduce2(); - int32_t max_introduce2_cells = get_intro_point_max_introduce2(); - if (BUG(max_introduce2_cells < min_introduce2_cells)) { - goto err; - } - ip->introduce2_max = crypto_rand_int_range(min_introduce2_cells, - max_introduce2_cells); - } - { /* Set intro point lifetime */ - int32_t intro_point_min_lifetime = get_intro_point_min_lifetime(); - int32_t intro_point_max_lifetime = get_intro_point_max_lifetime(); - if (BUG(intro_point_max_lifetime < intro_point_min_lifetime)) { - goto err; - } - ip->time_to_expire = time(NULL) + - crypto_rand_int_range(intro_point_min_lifetime,intro_point_max_lifetime); - } - - ip->replay_cache = replaycache_new(0, 0); - - /* Initialize the base object. We don't need the certificate object. */ - ip->base.link_specifiers = smartlist_new(); - - /* Generate the encryption key for this intro point. */ - curve25519_keypair_generate(&ip->enc_key_kp, 0); - /* Figure out if this chosen node supports v3 or is legacy only. */ - if (is_legacy) { - ip->base.is_only_legacy = 1; - /* Legacy mode that is doesn't support v3+ with ed25519 auth key. */ - ip->legacy_key = crypto_pk_new(); - if (crypto_pk_generate_key(ip->legacy_key) < 0) { - goto err; - } - } - - if (ei == NULL) { - goto done; - } - - /* We'll try to add all link specifiers. Legacy is mandatory. - * IPv4 or IPv6 is required, and we always send IPv4. */ - ls = hs_desc_link_specifier_new(ei, LS_IPV4); - /* It is impossible to have an extend info object without a v4. */ - if (BUG(!ls)) { - goto err; - } - smartlist_add(ip->base.link_specifiers, ls); - - ls = hs_desc_link_specifier_new(ei, LS_LEGACY_ID); - /* It is impossible to have an extend info object without an identity - * digest. */ - if (BUG(!ls)) { - goto err; - } - smartlist_add(ip->base.link_specifiers, ls); - - /* ed25519 identity key is optional for intro points */ - ls = hs_desc_link_specifier_new(ei, LS_ED25519_ID); - if (ls) { - smartlist_add(ip->base.link_specifiers, ls); - } - - /* IPv6 is not supported in this release. */ - - /* Finally, copy onion key from the extend_info_t object. */ - memcpy(&ip->onion_key, &ei->curve25519_onion_key, sizeof(ip->onion_key)); - - done: - return ip; - err: - service_intro_point_free(ip); - return NULL; -} - -/* Add the given intro point object to the given intro point map. The intro - * point MUST have its RSA encryption key set if this is a legacy type or the - * authentication key set otherwise. */ -STATIC void -service_intro_point_add(digest256map_t *map, hs_service_intro_point_t *ip) -{ - hs_service_intro_point_t *old_ip_entry; - - tor_assert(map); - tor_assert(ip); - - old_ip_entry = digest256map_set(map, ip->auth_key_kp.pubkey.pubkey, ip); - /* Make sure we didn't just try to double-add an intro point */ - tor_assert_nonfatal(!old_ip_entry); -} - -/* For a given service, remove the intro point from that service's descriptors - * (check both current and next descriptor) */ -STATIC void -service_intro_point_remove(const hs_service_t *service, - const hs_service_intro_point_t *ip) -{ - tor_assert(service); - tor_assert(ip); - - /* Trying all descriptors. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - /* We'll try to remove the descriptor on both descriptors which is not - * very expensive to do instead of doing loopup + remove. */ - digest256map_remove(desc->intro_points.map, - ip->auth_key_kp.pubkey.pubkey); - } FOR_EACH_DESCRIPTOR_END; -} - -/* For a given service and authentication key, return the intro point or NULL - * if not found. This will check both descriptors in the service. */ -STATIC hs_service_intro_point_t * -service_intro_point_find(const hs_service_t *service, - const ed25519_public_key_t *auth_key) -{ - hs_service_intro_point_t *ip = NULL; - - tor_assert(service); - tor_assert(auth_key); - - /* Trying all descriptors to find the right intro point. - * - * Even if we use the same node as intro point in both descriptors, the node - * will have a different intro auth key for each descriptor since we generate - * a new one everytime we pick an intro point. - * - * After #22893 gets implemented, intro points will be moved to be - * per-service instead of per-descriptor so this function will need to - * change. - */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - if ((ip = digest256map_get(desc->intro_points.map, - auth_key->pubkey)) != NULL) { - break; - } - } FOR_EACH_DESCRIPTOR_END; - - return ip; -} - -/* For a given service and intro point, return the descriptor for which the - * intro point is assigned to. NULL is returned if not found. */ -STATIC hs_service_descriptor_t * -service_desc_find_by_intro(const hs_service_t *service, - const hs_service_intro_point_t *ip) -{ - hs_service_descriptor_t *descp = NULL; - - tor_assert(service); - tor_assert(ip); - - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - if (digest256map_get(desc->intro_points.map, - ip->auth_key_kp.pubkey.pubkey)) { - descp = desc; - break; - } - } FOR_EACH_DESCRIPTOR_END; - - return descp; -} - -/* From a circuit identifier, get all the possible objects associated with the - * ident. If not NULL, service, ip or desc are set if the object can be found. - * They are untouched if they can't be found. - * - * This is an helper function because we do those lookups often so it's more - * convenient to simply call this functions to get all the things at once. */ -STATIC void -get_objects_from_ident(const hs_ident_circuit_t *ident, - hs_service_t **service, hs_service_intro_point_t **ip, - hs_service_descriptor_t **desc) -{ - hs_service_t *s; - - tor_assert(ident); - - /* Get service object from the circuit identifier. */ - s = find_service(hs_service_map, &ident->identity_pk); - if (s && service) { - *service = s; - } - - /* From the service object, get the intro point object of that circuit. The - * following will query both descriptors intro points list. */ - if (s && ip) { - *ip = service_intro_point_find(s, &ident->intro_auth_pk); - } - - /* Get the descriptor for this introduction point and service. */ - if (s && ip && *ip && desc) { - *desc = service_desc_find_by_intro(s, *ip); - } -} - -/* From a given intro point, return the first link specifier of type - * encountered in the link specifier list. Return NULL if it can't be found. - * - * The caller does NOT have ownership of the object, the intro point does. */ -static hs_desc_link_specifier_t * -get_link_spec_by_type(const hs_service_intro_point_t *ip, uint8_t type) -{ - hs_desc_link_specifier_t *lnk_spec = NULL; - - tor_assert(ip); - - SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers, - hs_desc_link_specifier_t *, ls) { - if (ls->type == type) { - lnk_spec = ls; - goto end; - } - } SMARTLIST_FOREACH_END(ls); - - end: - return lnk_spec; -} - -/* Given a service intro point, return the node_t associated to it. This can - * return NULL if the given intro point has no legacy ID or if the node can't - * be found in the consensus. */ -STATIC const node_t * -get_node_from_intro_point(const hs_service_intro_point_t *ip) -{ - const hs_desc_link_specifier_t *ls; - - tor_assert(ip); - - ls = get_link_spec_by_type(ip, LS_LEGACY_ID); - if (BUG(!ls)) { - return NULL; - } - /* XXX In the future, we want to only use the ed25519 ID (#22173). */ - return node_get_by_id((const char *) ls->u.legacy_id); -} - -/* Given a service intro point, return the extend_info_t for it. This can - * return NULL if the node can't be found for the intro point or the extend - * info can't be created for the found node. If direct_conn is set, the extend - * info is validated on if we can connect directly. */ -static extend_info_t * -get_extend_info_from_intro_point(const hs_service_intro_point_t *ip, - unsigned int direct_conn) -{ - extend_info_t *info = NULL; - const node_t *node; - - tor_assert(ip); - - node = get_node_from_intro_point(ip); - if (node == NULL) { - /* This can happen if the relay serving as intro point has been removed - * from the consensus. In that case, the intro point will be removed from - * the descriptor during the scheduled events. */ - goto end; - } - - /* In the case of a direct connection (single onion service), it is possible - * our firewall policy won't allow it so this can return a NULL value. */ - info = extend_info_from_node(node, direct_conn); - - end: - return info; -} - -/* Return the number of introduction points that are established for the - * given descriptor. */ -static unsigned int -count_desc_circuit_established(const hs_service_descriptor_t *desc) -{ - unsigned int count = 0; - - tor_assert(desc); - - DIGEST256MAP_FOREACH(desc->intro_points.map, key, - const hs_service_intro_point_t *, ip) { - count += ip->circuit_established; - } DIGEST256MAP_FOREACH_END; - - return count; -} - -/* For a given service and descriptor of that service, close all active - * directory connections. */ -static void -close_directory_connections(const hs_service_t *service, - const hs_service_descriptor_t *desc) -{ - unsigned int count = 0; - smartlist_t *dir_conns; - - tor_assert(service); - tor_assert(desc); - - /* Close pending HS desc upload connections for the blinded key of 'desc'. */ - dir_conns = connection_list_by_type_purpose(CONN_TYPE_DIR, - DIR_PURPOSE_UPLOAD_HSDESC); - SMARTLIST_FOREACH_BEGIN(dir_conns, connection_t *, conn) { - dir_connection_t *dir_conn = TO_DIR_CONN(conn); - if (ed25519_pubkey_eq(&dir_conn->hs_ident->identity_pk, - &service->keys.identity_pk) && - ed25519_pubkey_eq(&dir_conn->hs_ident->blinded_pk, - &desc->blinded_kp.pubkey)) { - connection_mark_for_close(conn); - count++; - continue; - } - } SMARTLIST_FOREACH_END(conn); - - log_info(LD_REND, "Closed %u active service directory connections for " - "descriptor %s of service %s", - count, safe_str_client(ed25519_fmt(&desc->blinded_kp.pubkey)), - safe_str_client(service->onion_address)); - /* We don't have ownership of the objects in this list. */ - smartlist_free(dir_conns); -} - -/* Close all rendezvous circuits for the given service. */ -static void -close_service_rp_circuits(hs_service_t *service) -{ - origin_circuit_t *ocirc = NULL; - - tor_assert(service); - - /* The reason we go over all circuit instead of using the circuitmap API is - * because most hidden service circuits are rendezvous circuits so there is - * no real improvement at getting all rendezvous circuits from the - * circuitmap and then going over them all to find the right ones. - * Furthermore, another option would have been to keep a list of RP cookies - * for a service but it creates an engineering complexity since we don't - * have a "RP circuit closed" event to clean it up properly so we avoid a - * memory DoS possibility. */ - - while ((ocirc = circuit_get_next_service_rp_circ(ocirc))) { - /* Only close circuits that are v3 and for this service. */ - if (ocirc->hs_ident != NULL && - ed25519_pubkey_eq(ô->hs_ident->identity_pk, - &service->keys.identity_pk)) { - /* Reason is FINISHED because service has been removed and thus the - * circuit is considered old/uneeded. When freed, it is removed from the - * hs circuitmap. */ - circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED); - } - } -} - -/* Close the circuit(s) for the given map of introduction points. */ -static void -close_intro_circuits(hs_service_intropoints_t *intro_points) -{ - tor_assert(intro_points); - - DIGEST256MAP_FOREACH(intro_points->map, key, - const hs_service_intro_point_t *, ip) { - origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip); - if (ocirc) { - /* Reason is FINISHED because service has been removed and thus the - * circuit is considered old/uneeded. When freed, the circuit is removed - * from the HS circuitmap. */ - circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED); - } - } DIGEST256MAP_FOREACH_END; -} - -/* Close all introduction circuits for the given service. */ -static void -close_service_intro_circuits(hs_service_t *service) -{ - tor_assert(service); - - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - close_intro_circuits(&desc->intro_points); - } FOR_EACH_DESCRIPTOR_END; -} - -/* Close any circuits related to the given service. */ -static void -close_service_circuits(hs_service_t *service) -{ - tor_assert(service); - - /* Only support for version >= 3. */ - if (BUG(service->config.version < HS_VERSION_THREE)) { - return; - } - /* Close intro points. */ - close_service_intro_circuits(service); - /* Close rendezvous points. */ - close_service_rp_circuits(service); -} - -/* Move every ephemeral services from the src service map to the dst service - * map. It is possible that a service can't be register to the dst map which - * won't stop the process of moving them all but will trigger a log warn. */ -static void -move_ephemeral_services(hs_service_ht *src, hs_service_ht *dst) -{ - hs_service_t **iter, **next; - - tor_assert(src); - tor_assert(dst); - - /* Iterate over the map to find ephemeral service and move them to the other - * map. We loop using this method to have a safe removal process. */ - for (iter = HT_START(hs_service_ht, src); iter != NULL; iter = next) { - hs_service_t *s = *iter; - if (!s->config.is_ephemeral) { - /* Yeah, we are in a very manual loop :). */ - next = HT_NEXT(hs_service_ht, src, iter); - continue; - } - /* Remove service from map and then register to it to the other map. - * Reminder that "*iter" and "s" are the same thing. */ - next = HT_NEXT_RMV(hs_service_ht, src, iter); - if (register_service(dst, s) < 0) { - log_warn(LD_BUG, "Ephemeral service key is already being used. " - "Skipping."); - } - } -} - -/* Return a const string of the directory path escaped. If this is an - * ephemeral service, it returns "[EPHEMERAL]". This can only be called from - * the main thread because escaped() uses a static variable. */ -static const char * -service_escaped_dir(const hs_service_t *s) -{ - return (s->config.is_ephemeral) ? "[EPHEMERAL]" : - escaped(s->config.directory_path); -} - -/** Move the hidden service state from src to dst. We do this - * when we receive a SIGHUP: dst is the post-HUP service */ -static void -move_hs_state(hs_service_t *src_service, hs_service_t *dst_service) -{ - tor_assert(src_service); - tor_assert(dst_service); - - hs_service_state_t *src = &src_service->state; - hs_service_state_t *dst = &dst_service->state; - - /* Let's do a shallow copy */ - dst->intro_circ_retry_started_time = src->intro_circ_retry_started_time; - dst->num_intro_circ_launched = src->num_intro_circ_launched; - dst->replay_cache_rend_cookie = src->replay_cache_rend_cookie; - - src->replay_cache_rend_cookie = NULL; /* steal pointer reference */ -} - -/* Register services that are in the staging list. Once this function returns, - * the global service map will be set with the right content and all non - * surviving services will be cleaned up. */ -static void -register_all_services(void) -{ - struct hs_service_ht *new_service_map; - - tor_assert(hs_service_staging_list); - - /* We'll save us some allocation and computing time. */ - if (smartlist_len(hs_service_staging_list) == 0) { - return; - } - - /* Allocate a new map that will replace the current one. */ - new_service_map = tor_malloc_zero(sizeof(*new_service_map)); - HT_INIT(hs_service_ht, new_service_map); - - /* First step is to transfer all ephemeral services from the current global - * map to the new one we are constructing. We do not prune ephemeral - * services as the only way to kill them is by deleting it from the control - * port or stopping the tor daemon. */ - move_ephemeral_services(hs_service_map, new_service_map); - - SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, snew) { - hs_service_t *s; - - /* Check if that service is already in our global map and if so, we'll - * transfer the intro points to it. */ - s = find_service(hs_service_map, &snew->keys.identity_pk); - if (s) { - /* Pass ownership of the descriptors from s (the current service) to - * snew (the newly configured one). */ - move_descriptors(s, snew); - move_hs_state(s, snew); - /* Remove the service from the global map because after this, we need to - * go over the remaining service in that map that aren't surviving the - * reload to close their circuits. */ - remove_service(hs_service_map, s); - hs_service_free(s); - } - /* Great, this service is now ready to be added to our new map. */ - if (BUG(register_service(new_service_map, snew) < 0)) { - /* This should never happen because prior to registration, we validate - * every service against the entire set. Not being able to register a - * service means we failed to validate correctly. In that case, don't - * break tor and ignore the service but tell user. */ - log_warn(LD_BUG, "Unable to register service with directory %s", - service_escaped_dir(snew)); - SMARTLIST_DEL_CURRENT(hs_service_staging_list, snew); - hs_service_free(snew); - } - } SMARTLIST_FOREACH_END(snew); - - /* Close any circuits associated with the non surviving services. Every - * service in the current global map are roaming. */ - FOR_EACH_SERVICE_BEGIN(service) { - close_service_circuits(service); - } FOR_EACH_SERVICE_END; - - /* Time to make the switch. We'll clear the staging list because its content - * has now changed ownership to the map. */ - smartlist_clear(hs_service_staging_list); - service_free_all(); - hs_service_map = new_service_map; -} - -/* Write the onion address of a given service to the given filename fname_ in - * the service directory. Return 0 on success else -1 on error. */ -STATIC int -write_address_to_file(const hs_service_t *service, const char *fname_) -{ - int ret = -1; - char *fname = NULL; - char *addr_buf = NULL; - - tor_assert(service); - tor_assert(fname_); - - /* Construct the full address with the onion tld and write the hostname file - * to disk. */ - tor_asprintf(&addr_buf, "%s.%s\n", service->onion_address, address_tld); - /* Notice here that we use the given "fname_". */ - fname = hs_path_from_filename(service->config.directory_path, fname_); - if (write_str_to_file(fname, addr_buf, 0) < 0) { - log_warn(LD_REND, "Could not write onion address to hostname file %s", - escaped(fname)); - goto end; - } - -#ifndef _WIN32 - if (service->config.dir_group_readable) { - /* Mode to 0640. */ - if (chmod(fname, S_IRUSR | S_IWUSR | S_IRGRP) < 0) { - log_warn(LD_FS, "Unable to make onion service hostname file %s " - "group-readable.", escaped(fname)); - } - } -#endif /* !defined(_WIN32) */ - - /* Success. */ - ret = 0; - end: - tor_free(fname); - tor_free(addr_buf); - return ret; -} - -/* Load and/or generate private keys for the given service. On success, the - * hostname file will be written to disk along with the master private key iff - * the service is not configured for offline keys. Return 0 on success else -1 - * on failure. */ -static int -load_service_keys(hs_service_t *service) -{ - int ret = -1; - char *fname = NULL; - ed25519_keypair_t *kp; - const hs_service_config_t *config; - - tor_assert(service); - - config = &service->config; - - /* Create and fix permission on service directory. We are about to write - * files to that directory so make sure it exists and has the right - * permissions. We do this here because at this stage we know that Tor is - * actually running and the service we have has been validated. */ - if (BUG(hs_check_service_private_dir(get_options()->User, - config->directory_path, - config->dir_group_readable, 1) < 0)) { - goto end; - } - - /* Try to load the keys from file or generate it if not found. */ - fname = hs_path_from_filename(config->directory_path, fname_keyfile_prefix); - /* Don't ask for key creation, we want to know if we were able to load it or - * we had to generate it. Better logging! */ - kp = ed_key_init_from_file(fname, INIT_ED_KEY_SPLIT, LOG_INFO, NULL, 0, 0, - 0, NULL); - if (!kp) { - log_info(LD_REND, "Unable to load keys from %s. Generating it...", fname); - /* We'll now try to generate the keys and for it we want the strongest - * randomness for it. The keypair will be written in different files. */ - uint32_t key_flags = INIT_ED_KEY_CREATE | INIT_ED_KEY_EXTRA_STRONG | - INIT_ED_KEY_SPLIT; - kp = ed_key_init_from_file(fname, key_flags, LOG_WARN, NULL, 0, 0, 0, - NULL); - if (!kp) { - log_warn(LD_REND, "Unable to generate keys and save in %s.", fname); - goto end; - } - } - - /* Copy loaded or generated keys to service object. */ - ed25519_pubkey_copy(&service->keys.identity_pk, &kp->pubkey); - memcpy(&service->keys.identity_sk, &kp->seckey, - sizeof(service->keys.identity_sk)); - /* This does a proper memory wipe. */ - ed25519_keypair_free(kp); - - /* Build onion address from the newly loaded keys. */ - tor_assert(service->config.version <= UINT8_MAX); - hs_build_address(&service->keys.identity_pk, - (uint8_t) service->config.version, - service->onion_address); - - /* Write onion address to hostname file. */ - if (write_address_to_file(service, fname_hostname) < 0) { - goto end; - } - - /* Succes. */ - ret = 0; - end: - tor_free(fname); - return ret; -} - -/* Free a given service descriptor object and all key material is wiped. */ -STATIC void -service_descriptor_free_(hs_service_descriptor_t *desc) -{ - if (!desc) { - return; - } - hs_descriptor_free(desc->desc); - memwipe(&desc->signing_kp, 0, sizeof(desc->signing_kp)); - memwipe(&desc->blinded_kp, 0, sizeof(desc->blinded_kp)); - /* Cleanup all intro points. */ - digest256map_free(desc->intro_points.map, service_intro_point_free_void); - digestmap_free(desc->intro_points.failed_id, tor_free_); - if (desc->previous_hsdirs) { - SMARTLIST_FOREACH(desc->previous_hsdirs, char *, s, tor_free(s)); - smartlist_free(desc->previous_hsdirs); - } - tor_free(desc); -} - -/* Return a newly allocated service descriptor object. */ -STATIC hs_service_descriptor_t * -service_descriptor_new(void) -{ - hs_service_descriptor_t *sdesc = tor_malloc_zero(sizeof(*sdesc)); - sdesc->desc = tor_malloc_zero(sizeof(hs_descriptor_t)); - /* Initialize the intro points map. */ - sdesc->intro_points.map = digest256map_new(); - sdesc->intro_points.failed_id = digestmap_new(); - sdesc->previous_hsdirs = smartlist_new(); - return sdesc; -} - -/* Move descriptor(s) from the src service to the dst service. We do this - * during SIGHUP when we re-create our hidden services. */ -static void -move_descriptors(hs_service_t *src, hs_service_t *dst) -{ - tor_assert(src); - tor_assert(dst); - - if (src->desc_current) { - /* Nothing should be there, but clean it up just in case */ - if (BUG(dst->desc_current)) { - service_descriptor_free(dst->desc_current); - } - dst->desc_current = src->desc_current; - src->desc_current = NULL; - } - - if (src->desc_next) { - /* Nothing should be there, but clean it up just in case */ - if (BUG(dst->desc_next)) { - service_descriptor_free(dst->desc_next); - } - dst->desc_next = src->desc_next; - src->desc_next = NULL; - } -} - -/* From the given service, remove all expired failing intro points for each - * descriptor. */ -static void -remove_expired_failing_intro(hs_service_t *service, time_t now) -{ - tor_assert(service); - - /* For both descriptors, cleanup the failing intro points list. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - DIGESTMAP_FOREACH_MODIFY(desc->intro_points.failed_id, key, time_t *, t) { - time_t failure_time = *t; - if ((failure_time + INTRO_CIRC_RETRY_PERIOD) <= now) { - MAP_DEL_CURRENT(key); - tor_free(t); - } - } DIGESTMAP_FOREACH_END; - } FOR_EACH_DESCRIPTOR_END; -} - -/* For the given descriptor desc, put all node_t object found from its failing - * intro point list and put them in the given node_list. */ -static void -setup_intro_point_exclude_list(const hs_service_descriptor_t *desc, - smartlist_t *node_list) -{ - tor_assert(desc); - tor_assert(node_list); - - DIGESTMAP_FOREACH(desc->intro_points.failed_id, key, time_t *, t) { - (void) t; /* Make gcc happy. */ - const node_t *node = node_get_by_id(key); - if (node) { - smartlist_add(node_list, (void *) node); - } - } DIGESTMAP_FOREACH_END; -} - -/* For the given failing intro point ip, we add its time of failure to the - * failed map and index it by identity digest (legacy ID) in the descriptor - * desc failed id map. */ -static void -remember_failing_intro_point(const hs_service_intro_point_t *ip, - hs_service_descriptor_t *desc, time_t now) -{ - time_t *time_of_failure, *prev_ptr; - const hs_desc_link_specifier_t *legacy_ls; - - tor_assert(ip); - tor_assert(desc); - - time_of_failure = tor_malloc_zero(sizeof(time_t)); - *time_of_failure = now; - legacy_ls = get_link_spec_by_type(ip, LS_LEGACY_ID); - tor_assert(legacy_ls); - prev_ptr = digestmap_set(desc->intro_points.failed_id, - (const char *) legacy_ls->u.legacy_id, - time_of_failure); - tor_free(prev_ptr); -} - -/* Copy the descriptor link specifier object from src to dst. */ -static void -link_specifier_copy(hs_desc_link_specifier_t *dst, - const hs_desc_link_specifier_t *src) -{ - tor_assert(dst); - tor_assert(src); - memcpy(dst, src, sizeof(hs_desc_link_specifier_t)); -} - -/* Using a given descriptor signing keypair signing_kp, a service intro point - * object ip and the time now, setup the content of an already allocated - * descriptor intro desc_ip. - * - * Return 0 on success else a negative value. */ -static int -setup_desc_intro_point(const ed25519_keypair_t *signing_kp, - const hs_service_intro_point_t *ip, - time_t now, hs_desc_intro_point_t *desc_ip) -{ - int ret = -1; - time_t nearest_hour = now - (now % 3600); - - tor_assert(signing_kp); - tor_assert(ip); - tor_assert(desc_ip); - - /* Copy the onion key. */ - memcpy(&desc_ip->onion_key, &ip->onion_key, sizeof(desc_ip->onion_key)); - - /* Key and certificate material. */ - desc_ip->auth_key_cert = tor_cert_create(signing_kp, - CERT_TYPE_AUTH_HS_IP_KEY, - &ip->auth_key_kp.pubkey, - nearest_hour, - HS_DESC_CERT_LIFETIME, - CERT_FLAG_INCLUDE_SIGNING_KEY); - if (desc_ip->auth_key_cert == NULL) { - log_warn(LD_REND, "Unable to create intro point auth-key certificate"); - goto done; - } - - /* Copy link specifier(s). */ - SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers, - const hs_desc_link_specifier_t *, ls) { - hs_desc_link_specifier_t *dup = tor_malloc_zero(sizeof(*dup)); - link_specifier_copy(dup, ls); - smartlist_add(desc_ip->link_specifiers, dup); - } SMARTLIST_FOREACH_END(ls); - - /* For a legacy intro point, we'll use an RSA/ed cross certificate. */ - if (ip->base.is_only_legacy) { - desc_ip->legacy.key = crypto_pk_dup_key(ip->legacy_key); - /* Create cross certification cert. */ - ssize_t cert_len = tor_make_rsa_ed25519_crosscert( - &signing_kp->pubkey, - desc_ip->legacy.key, - nearest_hour + HS_DESC_CERT_LIFETIME, - &desc_ip->legacy.cert.encoded); - if (cert_len < 0) { - log_warn(LD_REND, "Unable to create enc key legacy cross cert."); - goto done; - } - desc_ip->legacy.cert.len = cert_len; - } - - /* Encryption key and its cross certificate. */ - { - ed25519_public_key_t ed25519_pubkey; - - /* Use the public curve25519 key. */ - memcpy(&desc_ip->enc_key, &ip->enc_key_kp.pubkey, - sizeof(desc_ip->enc_key)); - /* The following can't fail. */ - ed25519_public_key_from_curve25519_public_key(&ed25519_pubkey, - &ip->enc_key_kp.pubkey, - 0); - desc_ip->enc_key_cert = tor_cert_create(signing_kp, - CERT_TYPE_CROSS_HS_IP_KEYS, - &ed25519_pubkey, nearest_hour, - HS_DESC_CERT_LIFETIME, - CERT_FLAG_INCLUDE_SIGNING_KEY); - if (desc_ip->enc_key_cert == NULL) { - log_warn(LD_REND, "Unable to create enc key curve25519 cross cert."); - goto done; - } - } - /* Success. */ - ret = 0; - - done: - return ret; -} - -/* Using the given descriptor from the given service, build the descriptor - * intro point list so we can then encode the descriptor for publication. This - * function does not pick intro points, they have to be in the descriptor - * current map. Cryptographic material (keys) must be initialized in the - * descriptor for this function to make sense. */ -static void -build_desc_intro_points(const hs_service_t *service, - hs_service_descriptor_t *desc, time_t now) -{ - hs_desc_encrypted_data_t *encrypted; - - tor_assert(service); - tor_assert(desc); - - /* Ease our life. */ - encrypted = &desc->desc->encrypted_data; - /* Cleanup intro points, we are about to set them from scratch. */ - hs_descriptor_clear_intro_points(desc->desc); - - DIGEST256MAP_FOREACH(desc->intro_points.map, key, - const hs_service_intro_point_t *, ip) { - hs_desc_intro_point_t *desc_ip = hs_desc_intro_point_new(); - if (setup_desc_intro_point(&desc->signing_kp, ip, now, desc_ip) < 0) { - hs_desc_intro_point_free(desc_ip); - continue; - } - /* We have a valid descriptor intro point. Add it to the list. */ - smartlist_add(encrypted->intro_points, desc_ip); - } DIGEST256MAP_FOREACH_END; -} - -/* Populate the descriptor encrypted section fomr the given service object. - * This will generate a valid list of introduction points that can be used - * after for circuit creation. Return 0 on success else -1 on error. */ -static int -build_service_desc_encrypted(const hs_service_t *service, - hs_service_descriptor_t *desc) -{ - hs_desc_encrypted_data_t *encrypted; - - tor_assert(service); - tor_assert(desc); - - encrypted = &desc->desc->encrypted_data; - - encrypted->create2_ntor = 1; - encrypted->single_onion_service = service->config.is_single_onion; - - /* Setup introduction points from what we have in the service. */ - if (encrypted->intro_points == NULL) { - encrypted->intro_points = smartlist_new(); - } - /* We do NOT build introduction point yet, we only do that once the circuit - * have been opened. Until we have the right number of introduction points, - * we do not encode anything in the descriptor. */ - - /* XXX: Support client authorization (#20700). */ - encrypted->intro_auth_types = NULL; - return 0; -} - -/* Populare the descriptor plaintext section from the given service object. - * The caller must make sure that the keys in the descriptors are valid that - * is are non-zero. Return 0 on success else -1 on error. */ -static int -build_service_desc_plaintext(const hs_service_t *service, - hs_service_descriptor_t *desc, time_t now) -{ - int ret = -1; - hs_desc_plaintext_data_t *plaintext; - - tor_assert(service); - tor_assert(desc); - /* XXX: Use a "assert_desc_ok()" ? */ - tor_assert(!tor_mem_is_zero((char *) &desc->blinded_kp, - sizeof(desc->blinded_kp))); - tor_assert(!tor_mem_is_zero((char *) &desc->signing_kp, - sizeof(desc->signing_kp))); - - /* Set the subcredential. */ - hs_get_subcredential(&service->keys.identity_pk, &desc->blinded_kp.pubkey, - desc->desc->subcredential); - - plaintext = &desc->desc->plaintext_data; - - plaintext->version = service->config.version; - plaintext->lifetime_sec = HS_DESC_DEFAULT_LIFETIME; - plaintext->signing_key_cert = - tor_cert_create(&desc->blinded_kp, CERT_TYPE_SIGNING_HS_DESC, - &desc->signing_kp.pubkey, now, HS_DESC_CERT_LIFETIME, - CERT_FLAG_INCLUDE_SIGNING_KEY); - if (plaintext->signing_key_cert == NULL) { - log_warn(LD_REND, "Unable to create descriptor signing certificate for " - "service %s", - safe_str_client(service->onion_address)); - goto end; - } - /* Copy public key material to go in the descriptor. */ - ed25519_pubkey_copy(&plaintext->signing_pubkey, &desc->signing_kp.pubkey); - ed25519_pubkey_copy(&plaintext->blinded_pubkey, &desc->blinded_kp.pubkey); - /* Success. */ - ret = 0; - - end: - return ret; -} - -/* For the given service and descriptor object, create the key material which - * is the blinded keypair and the descriptor signing keypair. Return 0 on - * success else -1 on error where the generated keys MUST be ignored. */ -static int -build_service_desc_keys(const hs_service_t *service, - hs_service_descriptor_t *desc, - uint64_t time_period_num) -{ - int ret = 0; - ed25519_keypair_t kp; - - tor_assert(desc); - tor_assert(!tor_mem_is_zero((char *) &service->keys.identity_pk, - ED25519_PUBKEY_LEN)); - - /* XXX: Support offline key feature (#18098). */ - - /* Copy the identity keys to the keypair so we can use it to create the - * blinded key. */ - memcpy(&kp.pubkey, &service->keys.identity_pk, sizeof(kp.pubkey)); - memcpy(&kp.seckey, &service->keys.identity_sk, sizeof(kp.seckey)); - /* Build blinded keypair for this time period. */ - hs_build_blinded_keypair(&kp, NULL, 0, time_period_num, &desc->blinded_kp); - /* Let's not keep too much traces of our keys in memory. */ - memwipe(&kp, 0, sizeof(kp)); - - /* No need for extra strong, this is a temporary key only for this - * descriptor. Nothing long term. */ - if (ed25519_keypair_generate(&desc->signing_kp, 0) < 0) { - log_warn(LD_REND, "Can't generate descriptor signing keypair for " - "service %s", - safe_str_client(service->onion_address)); - ret = -1; - } - - return ret; -} - -/* Given a service and the current time, build a descriptor for the service. - * This function does not pick introduction point, this needs to be done by - * the update function. On success, desc_out will point to the newly allocated - * descriptor object. - * - * This can error if we are unable to create keys or certificate. */ -static void -build_service_descriptor(hs_service_t *service, time_t now, - uint64_t time_period_num, - hs_service_descriptor_t **desc_out) -{ - char *encoded_desc; - hs_service_descriptor_t *desc; - - tor_assert(service); - tor_assert(desc_out); - - desc = service_descriptor_new(); - desc->time_period_num = time_period_num; - - /* Create the needed keys so we can setup the descriptor content. */ - if (build_service_desc_keys(service, desc, time_period_num) < 0) { - goto err; - } - /* Setup plaintext descriptor content. */ - if (build_service_desc_plaintext(service, desc, now) < 0) { - goto err; - } - /* Setup encrypted descriptor content. */ - if (build_service_desc_encrypted(service, desc) < 0) { - goto err; - } - - /* Set the revision counter for this descriptor */ - set_descriptor_revision_counter(desc->desc); - - /* Let's make sure that we've created a descriptor that can actually be - * encoded properly. This function also checks if the encoded output is - * decodable after. */ - if (BUG(hs_desc_encode_descriptor(desc->desc, &desc->signing_kp, - &encoded_desc) < 0)) { - goto err; - } - tor_free(encoded_desc); - - /* Assign newly built descriptor to the next slot. */ - *desc_out = desc; - /* Fire a CREATED control port event. */ - hs_control_desc_event_created(service->onion_address, - &desc->blinded_kp.pubkey); - return; - - err: - service_descriptor_free(desc); -} - -/* Build both descriptors for the given service that has just booted up. - * Because it's a special case, it deserves its special function ;). */ -static void -build_descriptors_for_new_service(hs_service_t *service, time_t now) -{ - uint64_t current_desc_tp, next_desc_tp; - - tor_assert(service); - /* These are the conditions for a new service. */ - tor_assert(!service->desc_current); - tor_assert(!service->desc_next); - - /* - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | A B | - * +------------------------------------------------------------------+ - * - * Case A: The service boots up before a new time period, the current time - * period is thus TP#1 and the next is TP#2 which for both we have access to - * their SRVs. - * - * Case B: The service boots up inside TP#2, we can't use the TP#3 for the - * next descriptor because we don't have the SRV#3 so the current should be - * TP#1 and next TP#2. - */ - - if (hs_in_period_between_tp_and_srv(NULL, now)) { - /* Case B from the above, inside of the new time period. */ - current_desc_tp = hs_get_previous_time_period_num(0); /* TP#1 */ - next_desc_tp = hs_get_time_period_num(0); /* TP#2 */ - } else { - /* Case A from the above, outside of the new time period. */ - current_desc_tp = hs_get_time_period_num(0); /* TP#1 */ - next_desc_tp = hs_get_next_time_period_num(0); /* TP#2 */ - } - - /* Build descriptors. */ - build_service_descriptor(service, now, current_desc_tp, - &service->desc_current); - build_service_descriptor(service, now, next_desc_tp, - &service->desc_next); - log_info(LD_REND, "Hidden service %s has just started. Both descriptors " - "built. Now scheduled for upload.", - safe_str_client(service->onion_address)); -} - -/* Build descriptors for each service if needed. There are conditions to build - * a descriptor which are details in the function. */ -STATIC void -build_all_descriptors(time_t now) -{ - FOR_EACH_SERVICE_BEGIN(service) { - - /* A service booting up will have both descriptors to NULL. No other cases - * makes both descriptor non existent. */ - if (service->desc_current == NULL && service->desc_next == NULL) { - build_descriptors_for_new_service(service, now); - continue; - } - - /* Reaching this point means we are pass bootup so at runtime. We should - * *never* have an empty current descriptor. If the next descriptor is - * empty, we'll try to build it for the next time period. This only - * happens when we rotate meaning that we are guaranteed to have a new SRV - * at that point for the next time period. */ - tor_assert(service->desc_current); - - if (service->desc_next == NULL) { - build_service_descriptor(service, now, hs_get_next_time_period_num(0), - &service->desc_next); - log_info(LD_REND, "Hidden service %s next descriptor successfully " - "built. Now scheduled for upload.", - safe_str_client(service->onion_address)); - } - } FOR_EACH_DESCRIPTOR_END; -} - -/* Randomly pick a node to become an introduction point but not present in the - * given exclude_nodes list. The chosen node is put in the exclude list - * regardless of success or not because in case of failure, the node is simply - * unsusable from that point on. - * - * If direct_conn is set, try to pick a node that our local firewall/policy - * allows us to connect to directly. If we can't find any, return NULL. - * This function supports selecting dual-stack nodes for direct single onion - * service IPv6 connections. But it does not send IPv6 addresses in link - * specifiers. (Current clients don't use IPv6 addresses to extend, and - * direct client connections to intro points are not supported.) - * - * Return a newly allocated service intro point ready to be used for encoding. - * Return NULL on error. */ -static hs_service_intro_point_t * -pick_intro_point(unsigned int direct_conn, smartlist_t *exclude_nodes) -{ - const node_t *node; - extend_info_t *info = NULL; - hs_service_intro_point_t *ip = NULL; - /* Normal 3-hop introduction point flags. */ - router_crn_flags_t flags = CRN_NEED_UPTIME | CRN_NEED_DESC; - /* Single onion flags. */ - router_crn_flags_t direct_flags = flags | CRN_PREF_ADDR | CRN_DIRECT_CONN; - - node = router_choose_random_node(exclude_nodes, get_options()->ExcludeNodes, - direct_conn ? direct_flags : flags); - /* Unable to find a node. When looking for a node for a direct connection, - * we could try a 3-hop path instead. We'll add support for this in a later - * release. */ - if (!node) { - goto err; - } - - /* We have a suitable node, add it to the exclude list. We do this *before* - * we can validate the extend information because even in case of failure, - * we don't want to use that node anymore. */ - smartlist_add(exclude_nodes, (void *) node); - - /* We do this to ease our life but also this call makes appropriate checks - * of the node object such as validating ntor support for instance. - * - * We must provide an extend_info for clients to connect over a 3-hop path, - * so we don't pass direct_conn here. */ - info = extend_info_from_node(node, 0); - if (BUG(info == NULL)) { - goto err; - } - - /* Let's do a basic sanity check here so that we don't end up advertising the - * ed25519 identity key of relays that don't actually support the link - * protocol */ - if (!node_supports_ed25519_link_authentication(node, 0)) { - tor_assert_nonfatal(ed25519_public_key_is_zero(&info->ed_identity)); - } else { - /* Make sure we *do* have an ed key if we support the link authentication. - * Sending an empty key would result in a failure to extend. */ - tor_assert_nonfatal(!ed25519_public_key_is_zero(&info->ed_identity)); - } - - /* Create our objects and populate them with the node information. */ - ip = service_intro_point_new(info, !node_supports_ed25519_hs_intro(node)); - if (ip == NULL) { - goto err; - } - - log_info(LD_REND, "Picked intro point: %s", extend_info_describe(info)); - extend_info_free(info); - return ip; - err: - service_intro_point_free(ip); - extend_info_free(info); - return NULL; -} - -/* For a given descriptor from the given service, pick any needed intro points - * and update the current map with those newly picked intro points. Return the - * number node that might have been added to the descriptor current map. */ -static unsigned int -pick_needed_intro_points(hs_service_t *service, - hs_service_descriptor_t *desc) -{ - int i = 0, num_needed_ip; - smartlist_t *exclude_nodes = smartlist_new(); - - tor_assert(service); - tor_assert(desc); - - /* Compute how many intro points we actually need to open. */ - num_needed_ip = service->config.num_intro_points - - digest256map_size(desc->intro_points.map); - if (BUG(num_needed_ip < 0)) { - /* Let's not make tor freak out here and just skip this. */ - goto done; - } - - /* We want to end up with config.num_intro_points intro points, but if we - * have no intro points at all (chances are they all cycled or we are - * starting up), we launch get_intro_point_num_extra() extra circuits and - * use the first config.num_intro_points that complete. See proposal #155, - * section 4 for the rationale of this which is purely for performance. - * - * The ones after the first config.num_intro_points will be converted to - * 'General' internal circuits and then we'll drop them from the list of - * intro points. */ - if (digest256map_size(desc->intro_points.map) == 0) { - num_needed_ip += get_intro_point_num_extra(); - } - - /* Build an exclude list of nodes of our intro point(s). The expiring intro - * points are OK to pick again because this is afterall a concept of round - * robin so they are considered valid nodes to pick again. */ - DIGEST256MAP_FOREACH(desc->intro_points.map, key, - hs_service_intro_point_t *, ip) { - const node_t *intro_node = get_node_from_intro_point(ip); - if (intro_node) { - smartlist_add(exclude_nodes, (void*)intro_node); - } - } DIGEST256MAP_FOREACH_END; - /* Also, add the failing intro points that our descriptor encounteered in - * the exclude node list. */ - setup_intro_point_exclude_list(desc, exclude_nodes); - - for (i = 0; i < num_needed_ip; i++) { - hs_service_intro_point_t *ip; - - /* This function will add the picked intro point node to the exclude nodes - * list so we don't pick the same one at the next iteration. */ - ip = pick_intro_point(service->config.is_single_onion, exclude_nodes); - if (ip == NULL) { - /* If we end up unable to pick an introduction point it is because we - * can't find suitable node and calling this again is highly unlikely to - * give us a valid node all of the sudden. */ - log_info(LD_REND, "Unable to find a suitable node to be an " - "introduction point for service %s.", - safe_str_client(service->onion_address)); - goto done; - } - /* Valid intro point object, add it to the descriptor current map. */ - service_intro_point_add(desc->intro_points.map, ip); - } - /* We've successfully picked all our needed intro points thus none are - * missing which will tell our upload process to expect the number of - * circuits to be the number of configured intro points circuits and not the - * number of intro points object that we have. */ - desc->missing_intro_points = 0; - - /* Success. */ - done: - /* We don't have ownership of the node_t object in this list. */ - smartlist_free(exclude_nodes); - return i; -} - -/** Clear previous cached HSDirs in desc. */ -static void -service_desc_clear_previous_hsdirs(hs_service_descriptor_t *desc) -{ - if (BUG(!desc->previous_hsdirs)) { - return; - } - - SMARTLIST_FOREACH(desc->previous_hsdirs, char*, s, tor_free(s)); - smartlist_clear(desc->previous_hsdirs); -} - -/** Note that we attempted to upload desc to hsdir. */ -static void -service_desc_note_upload(hs_service_descriptor_t *desc, const node_t *hsdir) -{ - char b64_digest[BASE64_DIGEST_LEN+1] = {0}; - digest_to_base64(b64_digest, hsdir->identity); - - if (BUG(!desc->previous_hsdirs)) { - return; - } - - if (!smartlist_contains_string(desc->previous_hsdirs, b64_digest)) { - smartlist_add_strdup(desc->previous_hsdirs, b64_digest); - } -} - -/** Schedule an upload of desc. If descriptor_changed is set, it - * means that this descriptor is dirty. */ -STATIC void -service_desc_schedule_upload(hs_service_descriptor_t *desc, - time_t now, - int descriptor_changed) - -{ - desc->next_upload_time = now; - - /* If the descriptor changed, clean up the old HSDirs list. We want to - * re-upload no matter what. */ - if (descriptor_changed) { - service_desc_clear_previous_hsdirs(desc); - } -} - -/* Update the given descriptor from the given service. The possible update - * actions includes: - * - Picking missing intro points if needed. - * - Incrementing the revision counter if needed. - */ -static void -update_service_descriptor(hs_service_t *service, - hs_service_descriptor_t *desc, time_t now) -{ - unsigned int num_intro_points; - - tor_assert(service); - tor_assert(desc); - tor_assert(desc->desc); - - num_intro_points = digest256map_size(desc->intro_points.map); - - /* Pick any missing introduction point(s). */ - if (num_intro_points < service->config.num_intro_points) { - unsigned int num_new_intro_points = pick_needed_intro_points(service, - desc); - if (num_new_intro_points != 0) { - log_info(LD_REND, "Service %s just picked %u intro points and wanted " - "%u for %s descriptor. It currently has %d intro " - "points. Launching ESTABLISH_INTRO circuit shortly.", - safe_str_client(service->onion_address), - num_new_intro_points, - service->config.num_intro_points - num_intro_points, - (desc == service->desc_current) ? "current" : "next", - num_intro_points); - /* We'll build those introduction point into the descriptor once we have - * confirmation that the circuits are opened and ready. However, - * indicate that this descriptor should be uploaded from now on. */ - service_desc_schedule_upload(desc, now, 1); - } - /* Were we able to pick all the intro points we needed? If not, we'll - * flag the descriptor that it's missing intro points because it - * couldn't pick enough which will trigger a descriptor upload. */ - if ((num_new_intro_points + num_intro_points) < - service->config.num_intro_points) { - desc->missing_intro_points = 1; - } - } -} - -/* Update descriptors for each service if needed. */ -STATIC void -update_all_descriptors(time_t now) -{ - FOR_EACH_SERVICE_BEGIN(service) { - /* We'll try to update each descriptor that is if certain conditions apply - * in order for the descriptor to be updated. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - update_service_descriptor(service, desc, now); - } FOR_EACH_DESCRIPTOR_END; - } FOR_EACH_SERVICE_END; -} - -/* Return true iff the given intro point has expired that is it has been used - * for too long or we've reached our max seen INTRODUCE2 cell. */ -STATIC int -intro_point_should_expire(const hs_service_intro_point_t *ip, - time_t now) -{ - tor_assert(ip); - - if (ip->introduce2_count >= ip->introduce2_max) { - goto expired; - } - - if (ip->time_to_expire <= now) { - goto expired; - } - - /* Not expiring. */ - return 0; - expired: - return 1; -} - -/* Go over the given set of intro points for each service and remove any - * invalid ones. The conditions for removal are: - * - * - The node doesn't exists anymore (not in consensus) - * OR - * - The intro point maximum circuit retry count has been reached and no - * circuit can be found associated with it. - * OR - * - The intro point has expired and we should pick a new one. - * - * If an intro point is removed, the circuit (if any) is immediately close. - * If a circuit can't be found, the intro point is kept if it hasn't reached - * its maximum circuit retry value and thus should be retried. */ -static void -cleanup_intro_points(hs_service_t *service, time_t now) -{ - /* List of intro points to close. We can't mark the intro circuits for close - * in the modify loop because doing so calls - * hs_service_intro_circ_has_closed() which does a digest256map_get() on the - * intro points map (that we are iterating over). This can't be done in a - * single iteration after a MAP_DEL_CURRENT, the object will still be - * returned leading to a use-after-free. So, we close the circuits and free - * the intro points after the loop if any. */ - smartlist_t *ips_to_free = smartlist_new(); - - tor_assert(service); - - /* For both descriptors, cleanup the intro points. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - /* Go over the current intro points we have, make sure they are still - * valid and remove any of them that aren't. */ - DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key, - hs_service_intro_point_t *, ip) { - const node_t *node = get_node_from_intro_point(ip); - int has_expired = intro_point_should_expire(ip, now); - - /* We cleanup an intro point if it has expired or if we do not know the - * node_t anymore (removed from our latest consensus) or if we've - * reached the maximum number of retry with a non existing circuit. */ - if (has_expired || node == NULL || - ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) { - log_info(LD_REND, "Intro point %s%s (retried: %u times). " - "Removing it.", - describe_intro_point(ip), - has_expired ? " has expired" : - (node == NULL) ? " fell off the consensus" : "", - ip->circuit_retries); - - /* We've retried too many times, remember it as a failed intro point - * so we don't pick it up again for INTRO_CIRC_RETRY_PERIOD sec. */ - if (ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) { - remember_failing_intro_point(ip, desc, approx_time()); - } - - /* Remove intro point from descriptor map and add it to the list of - * ips to free for which we'll also try to close the intro circuit. */ - MAP_DEL_CURRENT(key); - smartlist_add(ips_to_free, ip); - } - } DIGEST256MAP_FOREACH_END; - } FOR_EACH_DESCRIPTOR_END; - - /* Go over the intro points to free and close their circuit if any. */ - SMARTLIST_FOREACH_BEGIN(ips_to_free, hs_service_intro_point_t *, ip) { - /* See if we need to close the intro point circuit as well */ - - /* XXX: Legacy code does NOT close circuits like this: it keeps the circuit - * open until a new descriptor is uploaded and then closed all expiring - * intro point circuit. Here, we close immediately and because we just - * discarded the intro point, a new one will be selected, a new descriptor - * created and uploaded. There is no difference to an attacker between the - * timing of a new consensus and intro point rotation (possibly?). */ - origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip); - if (ocirc && !TO_CIRCUIT(ocirc)->marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED); - } - - /* Cleanup the intro point */ - service_intro_point_free(ip); - } SMARTLIST_FOREACH_END(ip); - - smartlist_free(ips_to_free); -} - -/* Set the next rotation time of the descriptors for the given service for the - * time now. */ -static void -set_rotation_time(hs_service_t *service, time_t now) -{ - time_t valid_after; - const networkstatus_t *ns = networkstatus_get_live_consensus(now); - if (ns) { - valid_after = ns->valid_after; - } else { - valid_after = now; - } - - tor_assert(service); - service->state.next_rotation_time = - sr_state_get_start_time_of_current_protocol_run(valid_after) + - sr_state_get_protocol_run_duration(); - - { - char fmt_time[ISO_TIME_LEN + 1]; - format_local_iso_time(fmt_time, service->state.next_rotation_time); - log_info(LD_REND, "Next descriptor rotation time set to %s for %s", - fmt_time, safe_str_client(service->onion_address)); - } -} - -/* Return true iff the service should rotate its descriptor. The time now is - * only used to fetch the live consensus and if none can be found, this - * returns false. */ -static unsigned int -should_rotate_descriptors(hs_service_t *service, time_t now) -{ - const networkstatus_t *ns; - - tor_assert(service); - - ns = networkstatus_get_live_consensus(now); - if (ns == NULL) { - goto no_rotation; - } - - if (ns->valid_after >= service->state.next_rotation_time) { - goto rotation; - } - - no_rotation: - return 0; - rotation: - return 1; -} - -/* Rotate the service descriptors of the given service. The current descriptor - * will be freed, the next one put in as the current and finally the next - * descriptor pointer is NULLified. */ -static void -rotate_service_descriptors(hs_service_t *service, time_t now) -{ - if (service->desc_current) { - /* Close all IP circuits for the descriptor. */ - close_intro_circuits(&service->desc_current->intro_points); - /* We don't need this one anymore, we won't serve any clients coming with - * this service descriptor. */ - service_descriptor_free(service->desc_current); - } - /* The next one become the current one and emptying the next will trigger - * a descriptor creation for it. */ - service->desc_current = service->desc_next; - service->desc_next = NULL; - - /* We've just rotated, set the next time for the rotation. */ - set_rotation_time(service, now); -} - -/* Rotate descriptors for each service if needed. A non existing current - * descriptor will trigger a descriptor build for the next time period. */ -STATIC void -rotate_all_descriptors(time_t now) -{ - /* XXX We rotate all our service descriptors at once. In the future it might - * be wise, to rotate service descriptors independently to hide that all - * those descriptors are on the same tor instance */ - - FOR_EACH_SERVICE_BEGIN(service) { - - /* Note for a service booting up: Both descriptors are NULL in that case - * so this function might return true if we are in the timeframe for a - * rotation leading to basically swapping two NULL pointers which is - * harmless. However, the side effect is that triggering a rotation will - * update the service state and avoid doing anymore rotations after the - * two descriptors have been built. */ - if (!should_rotate_descriptors(service, now)) { - continue; - } - - tor_assert(service->desc_current); - tor_assert(service->desc_next); - - log_info(LD_REND, "Time to rotate our descriptors (%p / %p) for %s", - service->desc_current, service->desc_next, - safe_str_client(service->onion_address)); - - rotate_service_descriptors(service, now); - } FOR_EACH_SERVICE_END; -} - -/* Scheduled event run from the main loop. Make sure all our services are up - * to date and ready for the other scheduled events. This includes looking at - * the introduction points status and descriptor rotation time. */ -STATIC void -run_housekeeping_event(time_t now) -{ - /* Note that nothing here opens circuit(s) nor uploads descriptor(s). We are - * simply moving things around or removing unneeded elements. */ - - FOR_EACH_SERVICE_BEGIN(service) { - - /* If the service is starting off, set the rotation time. We can't do that - * at configure time because the get_options() needs to be set for setting - * that time that uses the voting interval. */ - if (service->state.next_rotation_time == 0) { - /* Set the next rotation time of the descriptors. If it's Oct 25th - * 23:47:00, the next rotation time is when the next SRV is computed - * which is at Oct 26th 00:00:00 that is in 13 minutes. */ - set_rotation_time(service, now); - } - - /* Cleanup invalid intro points from the service descriptor. */ - cleanup_intro_points(service, now); - - /* Remove expired failing intro point from the descriptor failed list. We - * reset them at each INTRO_CIRC_RETRY_PERIOD. */ - remove_expired_failing_intro(service, now); - - /* At this point, the service is now ready to go through the scheduled - * events guaranteeing a valid state. Intro points might be missing from - * the descriptors after the cleanup but the update/build process will - * make sure we pick those missing ones. */ - } FOR_EACH_SERVICE_END; -} - -/* Scheduled event run from the main loop. Make sure all descriptors are up to - * date. Once this returns, each service descriptor needs to be considered for - * new introduction circuits and then for upload. */ -static void -run_build_descriptor_event(time_t now) -{ - /* For v2 services, this step happens in the upload event. */ - - /* Run v3+ events. */ - /* We start by rotating the descriptors only if needed. */ - rotate_all_descriptors(now); - - /* Then, we'll try to build new descriptors that we might need. The - * condition is that the next descriptor is non existing because it has - * been rotated or we just started up. */ - build_all_descriptors(now); - - /* Finally, we'll check if we should update the descriptors. Missing - * introduction points will be picked in this function which is useful for - * newly built descriptors. */ - update_all_descriptors(now); -} - -/* For the given service, launch any intro point circuits that could be - * needed. This considers every descriptor of the service. */ -static void -launch_intro_point_circuits(hs_service_t *service) -{ - tor_assert(service); - - /* For both descriptors, try to launch any missing introduction point - * circuits using the current map. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - /* Keep a ref on if we need a direct connection. We use this often. */ - unsigned int direct_conn = service->config.is_single_onion; - - DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key, - hs_service_intro_point_t *, ip) { - extend_info_t *ei; - - /* Skip the intro point that already has an existing circuit - * (established or not). */ - if (hs_circ_service_get_intro_circ(ip)) { - continue; - } - - ei = get_extend_info_from_intro_point(ip, direct_conn); - if (ei == NULL) { - /* This is possible if we can get a node_t but not the extend info out - * of it. In this case, we remove the intro point and a new one will - * be picked at the next main loop callback. */ - MAP_DEL_CURRENT(key); - service_intro_point_free(ip); - continue; - } - - /* Launch a circuit to the intro point. */ - ip->circuit_retries++; - if (hs_circ_launch_intro_point(service, ip, ei) < 0) { - log_info(LD_REND, "Unable to launch intro circuit to node %s " - "for service %s.", - safe_str_client(extend_info_describe(ei)), - safe_str_client(service->onion_address)); - /* Intro point will be retried if possible after this. */ - } - extend_info_free(ei); - } DIGEST256MAP_FOREACH_END; - } FOR_EACH_DESCRIPTOR_END; -} - -/* Don't try to build more than this many circuits before giving up for a - * while. Dynamically calculated based on the configured number of intro - * points for the given service and how many descriptor exists. The default - * use case of 3 introduction points and two descriptors will allow 28 - * circuits for a retry period (((3 + 2) + (3 * 3)) * 2). */ -static unsigned int -get_max_intro_circ_per_period(const hs_service_t *service) -{ - unsigned int count = 0; - unsigned int multiplier = 0; - unsigned int num_wanted_ip; - - tor_assert(service); - tor_assert(service->config.num_intro_points <= - HS_CONFIG_V3_MAX_INTRO_POINTS); - -/* For a testing network, allow to do it for the maximum amount so circuit - * creation and rotation and so on can actually be tested without limit. */ -#define MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING -1 - if (get_options()->TestingTorNetwork) { - return MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING; - } - - num_wanted_ip = service->config.num_intro_points; - - /* The calculation is as follow. We have a number of intro points that we - * want configured as a torrc option (num_intro_points). We then add an - * extra value so we can launch multiple circuits at once and pick the - * quickest ones. For instance, we want 3 intros, we add 2 extra so we'll - * pick 5 intros and launch 5 circuits. */ - count += (num_wanted_ip + get_intro_point_num_extra()); - - /* Then we add the number of retries that is possible to do for each intro - * point. If we want 3 intros, we'll allow 3 times the number of possible - * retry. */ - count += (num_wanted_ip * MAX_INTRO_POINT_CIRCUIT_RETRIES); - - /* Then, we multiply by a factor of 2 if we have both descriptor or 0 if we - * have none. */ - multiplier += (service->desc_current) ? 1 : 0; - multiplier += (service->desc_next) ? 1 : 0; - - return (count * multiplier); -} - -/* For the given service, return 1 if the service is allowed to launch more - * introduction circuits else 0 if the maximum has been reached for the retry - * period of INTRO_CIRC_RETRY_PERIOD. */ -STATIC int -can_service_launch_intro_circuit(hs_service_t *service, time_t now) -{ - tor_assert(service); - - /* Consider the intro circuit retry period of the service. */ - if (now > (service->state.intro_circ_retry_started_time + - INTRO_CIRC_RETRY_PERIOD)) { - service->state.intro_circ_retry_started_time = now; - service->state.num_intro_circ_launched = 0; - goto allow; - } - /* Check if we can still launch more circuits in this period. */ - if (service->state.num_intro_circ_launched <= - get_max_intro_circ_per_period(service)) { - goto allow; - } - - /* Rate limit log that we've reached our circuit creation limit. */ - { - char *msg; - time_t elapsed_time = now - service->state.intro_circ_retry_started_time; - static ratelim_t rlimit = RATELIM_INIT(INTRO_CIRC_RETRY_PERIOD); - if ((msg = rate_limit_log(&rlimit, now))) { - log_info(LD_REND, "Hidden service %s exceeded its circuit launch limit " - "of %u per %d seconds. It launched %u circuits in " - "the last %ld seconds. Will retry in %ld seconds.", - safe_str_client(service->onion_address), - get_max_intro_circ_per_period(service), - INTRO_CIRC_RETRY_PERIOD, - service->state.num_intro_circ_launched, - (long int) elapsed_time, - (long int) (INTRO_CIRC_RETRY_PERIOD - elapsed_time)); - tor_free(msg); - } - } - - /* Not allow. */ - return 0; - allow: - return 1; -} - -/* Scheduled event run from the main loop. Make sure we have all the circuits - * we need for each service. */ -static void -run_build_circuit_event(time_t now) -{ - /* Make sure we can actually have enough information or able to build - * internal circuits as required by services. */ - if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN || - !have_completed_a_circuit()) { - return; - } - - /* Run v2 check. */ - if (rend_num_services() > 0) { - rend_consider_services_intro_points(now); - } - - /* Run v3+ check. */ - FOR_EACH_SERVICE_BEGIN(service) { - /* For introduction circuit, we need to make sure we don't stress too much - * circuit creation so make sure this service is respecting that limit. */ - if (can_service_launch_intro_circuit(service, now)) { - /* Launch intro point circuits if needed. */ - launch_intro_point_circuits(service); - /* Once the circuits have opened, we'll make sure to update the - * descriptor intro point list and cleanup any extraneous. */ - } - } FOR_EACH_SERVICE_END; -} - -/* Encode and sign the service descriptor desc and upload it to the given - * hidden service directory. This does nothing if PublishHidServDescriptors - * is false. */ -static void -upload_descriptor_to_hsdir(const hs_service_t *service, - hs_service_descriptor_t *desc, const node_t *hsdir) -{ - char *encoded_desc = NULL; - - tor_assert(service); - tor_assert(desc); - tor_assert(hsdir); - - /* Let's avoid doing that if tor is configured to not publish. */ - if (!get_options()->PublishHidServDescriptors) { - log_info(LD_REND, "Service %s not publishing descriptor. " - "PublishHidServDescriptors is set to 1.", - safe_str_client(service->onion_address)); - goto end; - } - - /* First of all, we'll encode the descriptor. This should NEVER fail but - * just in case, let's make sure we have an actual usable descriptor. */ - if (BUG(hs_desc_encode_descriptor(desc->desc, &desc->signing_kp, - &encoded_desc) < 0)) { - goto end; - } - - /* Time to upload the descriptor to the directory. */ - hs_service_upload_desc_to_dir(encoded_desc, service->config.version, - &service->keys.identity_pk, - &desc->blinded_kp.pubkey, hsdir->rs); - - /* Add this node to previous_hsdirs list */ - service_desc_note_upload(desc, hsdir); - - /* Logging so we know where it was sent. */ - { - int is_next_desc = (service->desc_next == desc); - const uint8_t *index = (is_next_desc) ? hsdir->hsdir_index->store_second: - hsdir->hsdir_index->store_first; - log_info(LD_REND, "Service %s %s descriptor of revision %" PRIu64 - " initiated upload request to %s with index %s", - safe_str_client(service->onion_address), - (is_next_desc) ? "next" : "current", - desc->desc->plaintext_data.revision_counter, - safe_str_client(node_describe(hsdir)), - safe_str_client(hex_str((const char *) index, 32))); - - /* Fire a UPLOAD control port event. */ - hs_control_desc_event_upload(service->onion_address, hsdir->identity, - &desc->blinded_kp.pubkey, index); - } - - end: - tor_free(encoded_desc); - return; -} - -/** Return a newly-allocated string for our state file which contains revision - * counter information for desc. The format is: - * - * HidServRevCounter - */ -STATIC char * -encode_desc_rev_counter_for_state(const hs_service_descriptor_t *desc) -{ - char *state_str = NULL; - char blinded_pubkey_b64[ED25519_BASE64_LEN+1]; - uint64_t rev_counter = desc->desc->plaintext_data.revision_counter; - const ed25519_public_key_t *blinded_pubkey = &desc->blinded_kp.pubkey; - - /* Turn the blinded key into b64 so that we save it on state */ - tor_assert(blinded_pubkey); - if (ed25519_public_to_base64(blinded_pubkey_b64, blinded_pubkey) < 0) { - goto done; - } - - /* Format is: */ - tor_asprintf(&state_str, "%s %" PRIu64, blinded_pubkey_b64, rev_counter); - - log_info(LD_GENERAL, "[!] Adding rev counter %" PRIu64 " for %s!", - rev_counter, blinded_pubkey_b64); - - done: - return state_str; -} - -/** Update HS descriptor revision counters in our state by removing the old - * ones and writing down the ones that are currently active. */ -static void -update_revision_counters_in_state(void) -{ - config_line_t *lines = NULL; - config_line_t **nextline = &lines; - or_state_t *state = get_or_state(); - - /* Prepare our state structure with the rev counters */ - FOR_EACH_SERVICE_BEGIN(service) { - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - /* We don't want to save zero counters */ - if (desc->desc->plaintext_data.revision_counter == 0) { - continue; - } - - *nextline = tor_malloc_zero(sizeof(config_line_t)); - (*nextline)->key = tor_strdup("HidServRevCounter"); - (*nextline)->value = encode_desc_rev_counter_for_state(desc); - nextline = &(*nextline)->next; - } FOR_EACH_DESCRIPTOR_END; - } FOR_EACH_SERVICE_END; - - /* Remove the old rev counters, and replace them with the new ones */ - config_free_lines(state->HidServRevCounter); - state->HidServRevCounter = lines; - - /* Set the state as dirty since we just edited it */ - if (!get_options()->AvoidDiskWrites) { - or_state_mark_dirty(state, 0); - } -} - -/** Scan the string state_line for the revision counter of the service - * with blinded_pubkey. Set service_found_out to True if the - * line is relevant to this service, and return the cached revision - * counter. Else set service_found_out to False. */ -STATIC uint64_t -check_state_line_for_service_rev_counter(const char *state_line, - const ed25519_public_key_t *blinded_pubkey, - int *service_found_out) -{ - smartlist_t *items = NULL; - int ok; - ed25519_public_key_t pubkey_in_state; - uint64_t rev_counter = 0; - - tor_assert(service_found_out); - tor_assert(state_line); - tor_assert(blinded_pubkey); - - /* Assume that the line is not for this service */ - *service_found_out = 0; - - /* Start parsing the state line */ - items = smartlist_new(); - smartlist_split_string(items, state_line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (smartlist_len(items) < 2) { - log_warn(LD_GENERAL, "Incomplete rev counter line. Ignoring."); - goto done; - } - - char *b64_key_str = smartlist_get(items, 0); - char *saved_rev_counter_str = smartlist_get(items, 1); - - /* Parse blinded key to check if it's for this hidden service */ - if (ed25519_public_from_base64(&pubkey_in_state, b64_key_str) < 0) { - log_warn(LD_GENERAL, "Unable to base64 key in revcount line. Ignoring."); - goto done; - } - /* State line not for this hidden service */ - if (!ed25519_pubkey_eq(&pubkey_in_state, blinded_pubkey)) { - goto done; - } - - rev_counter = tor_parse_uint64(saved_rev_counter_str, - 10, 0, UINT64_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_GENERAL, "Unable to parse rev counter. Ignoring."); - goto done; - } - - /* Since we got this far, the line was for this service */ - *service_found_out = 1; - - log_info(LD_GENERAL, "Found rev counter for %s: %" PRIu64, - b64_key_str, rev_counter); - - done: - tor_assert(items); - SMARTLIST_FOREACH(items, char*, s, tor_free(s)); - smartlist_free(items); - - return rev_counter; -} - -/** Dig into our state file and find the current revision counter for the - * service with blinded key blinded_pubkey. If no revision counter is - * found, return 0. */ -static uint64_t -get_rev_counter_for_service(const ed25519_public_key_t *blinded_pubkey) -{ - or_state_t *state = get_or_state(); - config_line_t *line; - - /* Set default value for rev counters (if not found) to 0 */ - uint64_t final_rev_counter = 0; - - for (line = state->HidServRevCounter ; line ; line = line->next) { - int service_found = 0; - uint64_t rev_counter = 0; - - tor_assert(!strcmp(line->key, "HidServRevCounter")); - - /* Scan all the HidServRevCounter lines till we find the line for this - service: */ - rev_counter = check_state_line_for_service_rev_counter(line->value, - blinded_pubkey, - &service_found); - if (service_found) { - final_rev_counter = rev_counter; - goto done; - } - } - - done: - return final_rev_counter; -} - -/** Update the value of the revision counter for hs_desc and save it on - our state file. */ -static void -increment_descriptor_revision_counter(hs_descriptor_t *hs_desc) -{ - /* Find stored rev counter if it exists */ - uint64_t rev_counter = - get_rev_counter_for_service(&hs_desc->plaintext_data.blinded_pubkey); - - /* Increment the revision counter of hs_desc so the next update (which - * will trigger an upload) will have the right value. We do this at this - * stage to only do it once because a descriptor can have many updates before - * being uploaded. By doing it at upload, we are sure to only increment by 1 - * and thus avoid leaking how many operations we made on the descriptor from - * the previous one before uploading. */ - rev_counter++; - hs_desc->plaintext_data.revision_counter = rev_counter; - - update_revision_counters_in_state(); -} - -/** Set the revision counter in hs_desc, using the state file to find - * the current counter value if it exists. */ -static void -set_descriptor_revision_counter(hs_descriptor_t *hs_desc) -{ - /* Find stored rev counter if it exists */ - uint64_t rev_counter = - get_rev_counter_for_service(&hs_desc->plaintext_data.blinded_pubkey); - - hs_desc->plaintext_data.revision_counter = rev_counter; -} - -/* Encode and sign the service descriptor desc and upload it to the - * responsible hidden service directories. If for_next_period is true, the set - * of directories are selected using the next hsdir_index. This does nothing - * if PublishHidServDescriptors is false. */ -STATIC void -upload_descriptor_to_all(const hs_service_t *service, - hs_service_descriptor_t *desc) -{ - smartlist_t *responsible_dirs = NULL; - - tor_assert(service); - tor_assert(desc); - - /* We'll first cancel any directory request that are ongoing for this - * descriptor. It is possible that we can trigger multiple uploads in a - * short time frame which can lead to a race where the second upload arrives - * before the first one leading to a 400 malformed descriptor response from - * the directory. Closing all pending requests avoids that. */ - close_directory_connections(service, desc); - - /* Get our list of responsible HSDir. */ - responsible_dirs = smartlist_new(); - /* The parameter 0 means that we aren't a client so tell the function to use - * the spread store consensus paremeter. */ - hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num, - service->desc_next == desc, 0, responsible_dirs); - - /** Clear list of previous hsdirs since we are about to upload to a new - * list. Let's keep it up to date. */ - service_desc_clear_previous_hsdirs(desc); - - /* For each responsible HSDir we have, initiate an upload command. */ - SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, - hsdir_rs) { - const node_t *hsdir_node = node_get_by_id(hsdir_rs->identity_digest); - /* Getting responsible hsdir implies that the node_t object exists for the - * routerstatus_t found in the consensus else we have a problem. */ - tor_assert(hsdir_node); - /* Upload this descriptor to the chosen directory. */ - upload_descriptor_to_hsdir(service, desc, hsdir_node); - } SMARTLIST_FOREACH_END(hsdir_rs); - - /* Set the next upload time for this descriptor. Even if we are configured - * to not upload, we still want to follow the right cycle of life for this - * descriptor. */ - desc->next_upload_time = - (time(NULL) + crypto_rand_int_range(HS_SERVICE_NEXT_UPLOAD_TIME_MIN, - HS_SERVICE_NEXT_UPLOAD_TIME_MAX)); - { - char fmt_next_time[ISO_TIME_LEN+1]; - format_local_iso_time(fmt_next_time, desc->next_upload_time); - log_debug(LD_REND, "Service %s set to upload a descriptor at %s", - safe_str_client(service->onion_address), fmt_next_time); - } - - /* Update the revision counter of this descriptor */ - increment_descriptor_revision_counter(desc->desc); - - smartlist_free(responsible_dirs); - return; -} - -/** The set of HSDirs have changed: check if the change affects our descriptor - * HSDir placement, and if it does, reupload the desc. */ -STATIC int -service_desc_hsdirs_changed(const hs_service_t *service, - const hs_service_descriptor_t *desc) -{ - int should_reupload = 0; - smartlist_t *responsible_dirs = smartlist_new(); - - /* No desc upload has happened yet: it will happen eventually */ - if (!desc->previous_hsdirs || !smartlist_len(desc->previous_hsdirs)) { - goto done; - } - - /* Get list of responsible hsdirs */ - hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num, - service->desc_next == desc, 0, responsible_dirs); - - /* Check if any new hsdirs have been added to the responsible hsdirs set: - * Iterate over the list of new hsdirs, and reupload if any of them is not - * present in the list of previous hsdirs. - */ - SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, hsdir_rs) { - char b64_digest[BASE64_DIGEST_LEN+1] = {0}; - digest_to_base64(b64_digest, hsdir_rs->identity_digest); - - if (!smartlist_contains_string(desc->previous_hsdirs, b64_digest)) { - should_reupload = 1; - break; - } - } SMARTLIST_FOREACH_END(hsdir_rs); - - done: - smartlist_free(responsible_dirs); - - return should_reupload; -} - -/* Return 1 if the given descriptor from the given service can be uploaded - * else return 0 if it can not. */ -static int -should_service_upload_descriptor(const hs_service_t *service, - const hs_service_descriptor_t *desc, time_t now) -{ - unsigned int num_intro_points; - - tor_assert(service); - tor_assert(desc); - - /* If this descriptors has missing intro points that is that it couldn't get - * them all when it was time to pick them, it means that we should upload - * instead of waiting an arbitrary amount of time breaking the service. - * Else, if we have no missing intro points, we use the value taken from the - * service configuration. */ - if (desc->missing_intro_points) { - num_intro_points = digest256map_size(desc->intro_points.map); - } else { - num_intro_points = service->config.num_intro_points; - } - - /* This means we tried to pick intro points but couldn't get any so do not - * upload descriptor in this case. We need at least one for the service to - * be reachable. */ - if (desc->missing_intro_points && num_intro_points == 0) { - goto cannot; - } - - /* Check if all our introduction circuit have been established for all the - * intro points we have selected. */ - if (count_desc_circuit_established(desc) != num_intro_points) { - goto cannot; - } - - /* Is it the right time to upload? */ - if (desc->next_upload_time > now) { - goto cannot; - } - - /* Don't upload desc if we don't have a live consensus */ - if (!networkstatus_get_live_consensus(now)) { - goto cannot; - } - - /* Do we know enough router descriptors to have adequate vision of the HSDir - hash ring? */ - if (!router_have_minimum_dir_info()) { - goto cannot; - } - - /* Can upload! */ - return 1; - cannot: - return 0; -} - -/* Scheduled event run from the main loop. Try to upload the descriptor for - * each service. */ -STATIC void -run_upload_descriptor_event(time_t now) -{ - /* v2 services use the same function for descriptor creation and upload so - * we do everything here because the intro circuits were checked before. */ - if (rend_num_services() > 0) { - rend_consider_services_upload(now); - rend_consider_descriptor_republication(); - } - - /* Run v3+ check. */ - FOR_EACH_SERVICE_BEGIN(service) { - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - /* If we were asked to re-examine the hash ring, and it changed, then - schedule an upload */ - if (consider_republishing_hs_descriptors && - service_desc_hsdirs_changed(service, desc)) { - service_desc_schedule_upload(desc, now, 0); - } - - /* Can this descriptor be uploaded? */ - if (!should_service_upload_descriptor(service, desc, now)) { - continue; - } - - log_info(LD_REND, "Initiating upload for hidden service %s descriptor " - "for service %s with %u/%u introduction points%s.", - (desc == service->desc_current) ? "current" : "next", - safe_str_client(service->onion_address), - digest256map_size(desc->intro_points.map), - service->config.num_intro_points, - (desc->missing_intro_points) ? " (couldn't pick more)" : ""); - - /* At this point, we have to upload the descriptor so start by building - * the intro points descriptor section which we are now sure to be - * accurate because all circuits have been established. */ - build_desc_intro_points(service, desc, now); - - upload_descriptor_to_all(service, desc); - } FOR_EACH_DESCRIPTOR_END; - } FOR_EACH_SERVICE_END; - - /* We are done considering whether to republish rend descriptors */ - consider_republishing_hs_descriptors = 0; -} - -/* Called when the introduction point circuit is done building and ready to be - * used. */ -static void -service_intro_circ_has_opened(origin_circuit_t *circ) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - hs_service_descriptor_t *desc = NULL; - - tor_assert(circ); - - /* Let's do some basic sanity checking of the circ state */ - if (BUG(!circ->cpath)) { - return; - } - if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)) { - return; - } - if (BUG(!circ->hs_ident)) { - return; - } - - /* Get the corresponding service and intro point. */ - get_objects_from_ident(circ->hs_ident, &service, &ip, &desc); - - if (service == NULL) { - log_warn(LD_REND, "Unknown service identity key %s on the introduction " - "circuit %u. Can't find onion service.", - safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)), - TO_CIRCUIT(circ)->n_circ_id); - goto err; - } - if (ip == NULL) { - log_warn(LD_REND, "Unknown introduction point auth key on circuit %u " - "for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - /* We can't have an IP object without a descriptor. */ - tor_assert(desc); - - if (hs_circ_service_intro_has_opened(service, ip, desc, circ)) { - /* Getting here means that the circuit has been re-purposed because we - * have enough intro circuit opened. Remove the IP from the service. */ - service_intro_point_remove(service, ip); - service_intro_point_free(ip); - } - - goto done; - - err: - /* Close circuit, we can't use it. */ - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE); - done: - return; -} - -/* Called when a rendezvous circuit is done building and ready to be used. */ -static void -service_rendezvous_circ_has_opened(origin_circuit_t *circ) -{ - hs_service_t *service = NULL; - - tor_assert(circ); - tor_assert(circ->cpath); - /* Getting here means this is a v3 rendezvous circuit. */ - tor_assert(circ->hs_ident); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - - /* Declare the circuit dirty to avoid reuse, and for path-bias. We set the - * timestamp regardless of its content because that circuit could have been - * cannibalized so in any cases, we are about to use that circuit more. */ - TO_CIRCUIT(circ)->timestamp_dirty = time(NULL); - pathbias_count_use_attempt(circ); - - /* Get the corresponding service and intro point. */ - get_objects_from_ident(circ->hs_ident, &service, NULL, NULL); - if (service == NULL) { - log_warn(LD_REND, "Unknown service identity key %s on the rendezvous " - "circuit %u with cookie %s. Can't find onion service.", - safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)), - TO_CIRCUIT(circ)->n_circ_id, - hex_str((const char *) circ->hs_ident->rendezvous_cookie, - REND_COOKIE_LEN)); - goto err; - } - - /* If the cell can't be sent, the circuit will be closed within this - * function. */ - hs_circ_service_rp_has_opened(service, circ); - goto done; - - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE); - done: - return; -} - -/* We've been expecting an INTRO_ESTABLISHED cell on this circuit and it just - * arrived. Handle the INTRO_ESTABLISHED cell arriving on the given - * introduction circuit. Return 0 on success else a negative value. */ -static int -service_handle_intro_established(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - - tor_assert(circ); - tor_assert(payload); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); - - /* We need the service and intro point for this cell. */ - get_objects_from_ident(circ->hs_ident, &service, &ip, NULL); - - /* Get service object from the circuit identifier. */ - if (service == NULL) { - log_warn(LD_REND, "Unknown service identity key %s on the introduction " - "circuit %u. Can't find onion service.", - safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)), - TO_CIRCUIT(circ)->n_circ_id); - goto err; - } - if (ip == NULL) { - /* We don't recognize the key. */ - log_warn(LD_REND, "Introduction circuit established without an intro " - "point object on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - - /* Try to parse the payload into a cell making sure we do actually have a - * valid cell. On success, the ip object and circuit purpose is updated to - * reflect the fact that the introduction circuit is established. */ - if (hs_circ_handle_intro_established(service, ip, circ, payload, - payload_len) < 0) { - goto err; - } - - /* Flag that we have an established circuit for this intro point. This value - * is what indicates the upload scheduled event if we are ready to build the - * intro point into the descriptor and upload. */ - ip->circuit_established = 1; - - log_info(LD_REND, "Successfully received an INTRO_ESTABLISHED cell " - "on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - return 0; - - err: - return -1; -} - -/* We just received an INTRODUCE2 cell on the established introduction circuit - * circ. Handle the cell and return 0 on success else a negative value. */ -static int -service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - hs_service_descriptor_t *desc = NULL; - - tor_assert(circ); - tor_assert(payload); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO); - - /* We'll need every object associated with this circuit. */ - get_objects_from_ident(circ->hs_ident, &service, &ip, &desc); - - /* Get service object from the circuit identifier. */ - if (service == NULL) { - log_warn(LD_BUG, "Unknown service identity key %s when handling " - "an INTRODUCE2 cell on circuit %u", - safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)), - TO_CIRCUIT(circ)->n_circ_id); - goto err; - } - if (ip == NULL) { - /* We don't recognize the key. */ - log_warn(LD_BUG, "Unknown introduction auth key when handling " - "an INTRODUCE2 cell on circuit %u for service %s", - TO_CIRCUIT(circ)->n_circ_id, - safe_str_client(service->onion_address)); - goto err; - } - /* If we have an IP object, we MUST have a descriptor object. */ - tor_assert(desc); - - /* The following will parse, decode and launch the rendezvous point circuit. - * Both current and legacy cells are handled. */ - if (hs_circ_handle_introduce2(service, circ, ip, desc->desc->subcredential, - payload, payload_len) < 0) { - goto err; - } - - return 0; - err: - return -1; -} - -/* Add to list every filename used by service. This is used by the sandbox - * subsystem. */ -static void -service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list) -{ - const char *s_dir; - char fname[128] = {0}; - - tor_assert(service); - tor_assert(list); - - /* Ease our life. */ - s_dir = service->config.directory_path; - /* The hostname file. */ - smartlist_add(list, hs_path_from_filename(s_dir, fname_hostname)); - /* The key files splitted in two. */ - tor_snprintf(fname, sizeof(fname), "%s_secret_key", fname_keyfile_prefix); - smartlist_add(list, hs_path_from_filename(s_dir, fname)); - tor_snprintf(fname, sizeof(fname), "%s_public_key", fname_keyfile_prefix); - smartlist_add(list, hs_path_from_filename(s_dir, fname)); -} - -/* ========== */ -/* Public API */ -/* ========== */ - -/* Upload an encoded descriptor in encoded_desc of the given version. This - * descriptor is for the service identity_pk and blinded_pk used to setup the - * directory connection identifier. It is uploaded to the directory hsdir_rs - * routerstatus_t object. - * - * NOTE: This function does NOT check for PublishHidServDescriptors because it - * is only used by the control port command HSPOST outside of this subsystem. - * Inside this code, upload_descriptor_to_hsdir() should be used. */ -void -hs_service_upload_desc_to_dir(const char *encoded_desc, - const uint8_t version, - const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - const routerstatus_t *hsdir_rs) -{ - char version_str[4] = {0}; - directory_request_t *dir_req; - hs_ident_dir_conn_t ident; - - tor_assert(encoded_desc); - tor_assert(identity_pk); - tor_assert(blinded_pk); - tor_assert(hsdir_rs); - - /* Setup the connection identifier. */ - memset(&ident, 0, sizeof(ident)); - hs_ident_dir_conn_init(identity_pk, blinded_pk, &ident); - - /* This is our resource when uploading which is used to construct the URL - * with the version number: "/tor/hs//publish". */ - tor_snprintf(version_str, sizeof(version_str), "%u", version); - - /* Build the directory request for this HSDir. */ - dir_req = directory_request_new(DIR_PURPOSE_UPLOAD_HSDESC); - directory_request_set_routerstatus(dir_req, hsdir_rs); - directory_request_set_indirection(dir_req, DIRIND_ANONYMOUS); - directory_request_set_resource(dir_req, version_str); - directory_request_set_payload(dir_req, encoded_desc, - strlen(encoded_desc)); - /* The ident object is copied over the directory connection object once - * the directory request is initiated. */ - directory_request_upload_set_hs_ident(dir_req, &ident); - - /* Initiate the directory request to the hsdir.*/ - directory_initiate_request(dir_req); - directory_request_free(dir_req); -} - -/* Add the ephemeral service using the secret key sk and ports. Both max - * streams parameter will be set in the newly created service. - * - * Ownership of sk and ports is passed to this routine. Regardless of - * success/failure, callers should not touch these values after calling this - * routine, and may assume that correct cleanup has been done on failure. - * - * Return an appropriate hs_service_add_ephemeral_status_t. */ -hs_service_add_ephemeral_status_t -hs_service_add_ephemeral(ed25519_secret_key_t *sk, smartlist_t *ports, - int max_streams_per_rdv_circuit, - int max_streams_close_circuit, char **address_out) -{ - hs_service_add_ephemeral_status_t ret; - hs_service_t *service = NULL; - - tor_assert(sk); - tor_assert(ports); - tor_assert(address_out); - - service = hs_service_new(get_options()); - - /* Setup the service configuration with specifics. A default service is - * HS_VERSION_TWO so explicitely set it. */ - service->config.version = HS_VERSION_THREE; - service->config.max_streams_per_rdv_circuit = max_streams_per_rdv_circuit; - service->config.max_streams_close_circuit = !!max_streams_close_circuit; - service->config.is_ephemeral = 1; - smartlist_free(service->config.ports); - service->config.ports = ports; - - /* Handle the keys. */ - memcpy(&service->keys.identity_sk, sk, sizeof(service->keys.identity_sk)); - if (ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk) < 0) { - log_warn(LD_CONFIG, "Unable to generate ed25519 public key" - "for v3 service."); - ret = RSAE_BADPRIVKEY; - goto err; - } - - /* Make sure we have at least one port. */ - if (smartlist_len(service->config.ports) == 0) { - log_warn(LD_CONFIG, "At least one VIRTPORT/TARGET must be specified " - "for v3 service."); - ret = RSAE_BADVIRTPORT; - goto err; - } - - /* The only way the registration can fail is if the service public key - * already exists. */ - if (BUG(register_service(hs_service_map, service) < 0)) { - log_warn(LD_CONFIG, "Onion Service private key collides with an " - "existing v3 service."); - ret = RSAE_ADDREXISTS; - goto err; - } - - /* Last step is to build the onion address. */ - hs_build_address(&service->keys.identity_pk, - (uint8_t) service->config.version, - service->onion_address); - *address_out = tor_strdup(service->onion_address); - - log_info(LD_CONFIG, "Added ephemeral v3 onion service: %s", - safe_str_client(service->onion_address)); - ret = RSAE_OKAY; - goto end; - - err: - hs_service_free(service); - - end: - memwipe(sk, 0, sizeof(ed25519_secret_key_t)); - tor_free(sk); - return ret; -} - -/* For the given onion address, delete the ephemeral service. Return 0 on - * success else -1 on error. */ -int -hs_service_del_ephemeral(const char *address) -{ - uint8_t version; - ed25519_public_key_t pk; - hs_service_t *service = NULL; - - tor_assert(address); - - if (hs_parse_address(address, &pk, NULL, &version) < 0) { - log_warn(LD_CONFIG, "Requested malformed v3 onion address for removal."); - goto err; - } - - if (version != HS_VERSION_THREE) { - log_warn(LD_CONFIG, "Requested version of onion address for removal " - "is not supported."); - goto err; - } - - service = find_service(hs_service_map, &pk); - if (service == NULL) { - log_warn(LD_CONFIG, "Requested non-existent v3 hidden service for " - "removal."); - goto err; - } - - if (!service->config.is_ephemeral) { - log_warn(LD_CONFIG, "Requested non-ephemeral v3 hidden service for " - "removal."); - goto err; - } - - /* Close circuits, remove from map and finally free. */ - close_service_circuits(service); - remove_service(hs_service_map, service); - hs_service_free(service); - - log_info(LD_CONFIG, "Removed ephemeral v3 hidden service: %s", - safe_str_client(address)); - return 0; - - err: - return -1; -} - -/* Using the ed25519 public key pk, find a service for that key and return the - * current encoded descriptor as a newly allocated string or NULL if not - * found. This is used by the control port subsystem. */ -char * -hs_service_lookup_current_desc(const ed25519_public_key_t *pk) -{ - const hs_service_t *service; - - tor_assert(pk); - - service = find_service(hs_service_map, pk); - if (service && service->desc_current) { - char *encoded_desc = NULL; - /* No matter what is the result (which should never be a failure), return - * the encoded variable, if success it will contain the right thing else - * it will be NULL. */ - hs_desc_encode_descriptor(service->desc_current->desc, - &service->desc_current->signing_kp, - &encoded_desc); - return encoded_desc; - } - - return NULL; -} - -/* Return the number of service we have configured and usable. */ -unsigned int -hs_service_get_num_services(void) -{ - if (hs_service_map == NULL) { - return 0; - } - return HT_SIZE(hs_service_map); -} - -/* Called once an introduction circuit is closed. If the circuit doesn't have - * a v3 identifier, it is ignored. */ -void -hs_service_intro_circ_has_closed(origin_circuit_t *circ) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - hs_service_descriptor_t *desc = NULL; - - tor_assert(circ); - - if (circ->hs_ident == NULL) { - /* This is not a v3 circuit, ignore. */ - goto end; - } - - get_objects_from_ident(circ->hs_ident, &service, &ip, &desc); - if (service == NULL) { - /* This is possible if the circuits are closed and the service is - * immediately deleted. */ - log_info(LD_REND, "Unable to find any hidden service associated " - "identity key %s on intro circuit %u.", - ed25519_fmt(&circ->hs_ident->identity_pk), - TO_CIRCUIT(circ)->n_circ_id); - goto end; - } - if (ip == NULL) { - /* The introduction point object has already been removed probably by our - * cleanup process so ignore. */ - goto end; - } - /* Can't have an intro point object without a descriptor. */ - tor_assert(desc); - - /* Circuit disappeared so make sure the intro point is updated. By - * keeping the object in the descriptor, we'll be able to retry. */ - ip->circuit_established = 0; - - end: - return; -} - -/* Given conn, a rendezvous edge connection acting as an exit stream, look up - * the hidden service for the circuit circ, and look up the port and address - * based on the connection port. Assign the actual connection address. - * - * Return 0 on success. Return -1 on failure and the caller should NOT close - * the circuit. Return -2 on failure and the caller MUST close the circuit for - * security reasons. */ -int -hs_service_set_conn_addr_port(const origin_circuit_t *circ, - edge_connection_t *conn) -{ - hs_service_t *service = NULL; - - tor_assert(circ); - tor_assert(conn); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_REND_JOINED); - tor_assert(circ->hs_ident); - - get_objects_from_ident(circ->hs_ident, &service, NULL, NULL); - - if (service == NULL) { - log_warn(LD_REND, "Unable to find any hidden service associated " - "identity key %s on rendezvous circuit %u.", - ed25519_fmt(&circ->hs_ident->identity_pk), - TO_CIRCUIT(circ)->n_circ_id); - /* We want the caller to close the circuit because it's not a valid - * service so no danger. Attempting to bruteforce the entire key space by - * opening circuits to learn which service is being hosted here is - * impractical. */ - goto err_close; - } - - /* Enforce the streams-per-circuit limit, and refuse to provide a mapping if - * this circuit will exceed the limit. */ - if (service->config.max_streams_per_rdv_circuit > 0 && - (circ->hs_ident->num_rdv_streams >= - service->config.max_streams_per_rdv_circuit)) { -#define MAX_STREAM_WARN_INTERVAL 600 - static struct ratelim_t stream_ratelim = - RATELIM_INIT(MAX_STREAM_WARN_INTERVAL); - log_fn_ratelim(&stream_ratelim, LOG_WARN, LD_REND, - "Maximum streams per circuit limit reached on " - "rendezvous circuit %u for service %s. Circuit has " - "%" PRIu64 " out of %" PRIu64 " streams. %s.", - TO_CIRCUIT(circ)->n_circ_id, - service->onion_address, - circ->hs_ident->num_rdv_streams, - service->config.max_streams_per_rdv_circuit, - service->config.max_streams_close_circuit ? - "Closing circuit" : "Ignoring open stream request"); - if (service->config.max_streams_close_circuit) { - /* Service explicitly configured to close immediately. */ - goto err_close; - } - /* Exceeding the limit makes tor silently ignore the stream creation - * request and keep the circuit open. */ - goto err_no_close; - } - - /* Find a virtual port of that service mathcing the one in the connection if - * succesful, set the address in the connection. */ - if (hs_set_conn_addr_port(service->config.ports, conn) < 0) { - log_info(LD_REND, "No virtual port mapping exists for port %d for " - "hidden service %s.", - TO_CONN(conn)->port, service->onion_address); - if (service->config.allow_unknown_ports) { - /* Service explicitly allow connection to unknown ports so close right - * away because we do not care about port mapping. */ - goto err_close; - } - /* If the service didn't explicitly allow it, we do NOT close the circuit - * here to raise the bar in terms of performance for port mapping. */ - goto err_no_close; - } - - /* Success. */ - return 0; - err_close: - /* Indicate the caller that the circuit should be closed. */ - return -2; - err_no_close: - /* Indicate the caller to NOT close the circuit. */ - return -1; -} - -/* Add to file_list every filename used by a configured hidden service, and to - * dir_list every directory path used by a configured hidden service. This is - * used by the sandbox subsystem to whitelist those. */ -void -hs_service_lists_fnames_for_sandbox(smartlist_t *file_list, - smartlist_t *dir_list) -{ - tor_assert(file_list); - tor_assert(dir_list); - - /* Add files and dirs for legacy services. */ - rend_services_add_filenames_to_lists(file_list, dir_list); - - /* Add files and dirs for v3+. */ - FOR_EACH_SERVICE_BEGIN(service) { - /* Skip ephemeral service, they don't touch the disk. */ - if (service->config.is_ephemeral) { - continue; - } - service_add_fnames_to_list(service, file_list); - smartlist_add_strdup(dir_list, service->config.directory_path); - } FOR_EACH_DESCRIPTOR_END; -} - -/* Called when our internal view of the directory has changed. We might have - * received a new batch of descriptors which might affect the shape of the - * HSDir hash ring. Signal that we should reexamine the hash ring and - * re-upload our HS descriptors if needed. */ -void -hs_service_dir_info_changed(void) -{ - if (hs_service_get_num_services() > 0) { - /* New directory information usually goes every consensus so rate limit - * every 30 minutes to not be too conservative. */ - static struct ratelim_t dir_info_changed_ratelim = RATELIM_INIT(30 * 60); - log_fn_ratelim(&dir_info_changed_ratelim, LOG_INFO, LD_REND, - "New dirinfo arrived: consider reuploading descriptor"); - consider_republishing_hs_descriptors = 1; - } -} - -/* Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and - * launch a circuit to the rendezvous point. */ -int -hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload, - size_t payload_len) -{ - int ret = -1; - - tor_assert(circ); - tor_assert(payload); - - /* Do some initial validation and logging before we parse the cell */ - if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_INTRO) { - log_warn(LD_PROTOCOL, "Received an INTRODUCE2 cell on a " - "non introduction circuit of purpose %d", - TO_CIRCUIT(circ)->purpose); - goto done; - } - - if (circ->hs_ident) { - ret = service_handle_introduce2(circ, payload, payload_len); - } else { - ret = rend_service_receive_introduction(circ, payload, payload_len); - } - - done: - return ret; -} - -/* Called when we get an INTRO_ESTABLISHED cell. Mark the circuit as an - * established introduction point. Return 0 on success else a negative value - * and the circuit is closed. */ -int -hs_service_receive_intro_established(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len) -{ - int ret = -1; - - tor_assert(circ); - tor_assert(payload); - - if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) { - log_warn(LD_PROTOCOL, "Received an INTRO_ESTABLISHED cell on a " - "non introduction circuit of purpose %d", - TO_CIRCUIT(circ)->purpose); - goto err; - } - - /* Handle both version. v2 uses rend_data and v3 uses the hs circuit - * identifier hs_ident. Can't be both. */ - if (circ->hs_ident) { - ret = service_handle_intro_established(circ, payload, payload_len); - } else { - ret = rend_service_intro_established(circ, payload, payload_len); - } - - if (ret < 0) { - goto err; - } - return 0; - err: - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return -1; -} - -/* Called when any kind of hidden service circuit is done building thus - * opened. This is the entry point from the circuit subsystem. */ -void -hs_service_circuit_has_opened(origin_circuit_t *circ) -{ - tor_assert(circ); - - /* Handle both version. v2 uses rend_data and v3 uses the hs circuit - * identifier hs_ident. Can't be both. */ - switch (TO_CIRCUIT(circ)->purpose) { - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - if (circ->hs_ident) { - service_intro_circ_has_opened(circ); - } else { - rend_service_intro_has_opened(circ); - } - break; - case CIRCUIT_PURPOSE_S_CONNECT_REND: - if (circ->hs_ident) { - service_rendezvous_circ_has_opened(circ); - } else { - rend_service_rendezvous_has_opened(circ); - } - break; - default: - tor_assert(0); - } -} - -/* Load and/or generate keys for all onion services including the client - * authorization if any. Return 0 on success, -1 on failure. */ -int -hs_service_load_all_keys(void) -{ - /* Load v2 service keys if we have v2. */ - if (rend_num_services() != 0) { - if (rend_service_load_all_keys(NULL) < 0) { - goto err; - } - } - - /* Load or/and generate them for v3+. */ - SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, service) { - /* Ignore ephemeral service, they already have their keys set. */ - if (service->config.is_ephemeral) { - continue; - } - log_info(LD_REND, "Loading v3 onion service keys from %s", - service_escaped_dir(service)); - if (load_service_keys(service) < 0) { - goto err; - } - /* XXX: Load/Generate client authorization keys. (#20700) */ - } SMARTLIST_FOREACH_END(service); - - /* Final step, the staging list contains service in a quiescent state that - * is ready to be used. Register them to the global map. Once this is over, - * the staging list will be cleaned up. */ - register_all_services(); - - /* All keys have been loaded successfully. */ - return 0; - err: - return -1; -} - -/* Put all service object in the given service list. After this, the caller - * looses ownership of every elements in the list and responsible to free the - * list pointer. */ -void -hs_service_stage_services(const smartlist_t *service_list) -{ - tor_assert(service_list); - /* This list is freed at registration time but this function can be called - * multiple time. */ - if (hs_service_staging_list == NULL) { - hs_service_staging_list = smartlist_new(); - } - /* Add all service object to our staging list. Caller is responsible for - * freeing the service_list. */ - smartlist_add_all(hs_service_staging_list, service_list); -} - -/* Allocate and initilize a service object. The service configuration will - * contain the default values. Return the newly allocated object pointer. This - * function can't fail. */ -hs_service_t * -hs_service_new(const or_options_t *options) -{ - hs_service_t *service = tor_malloc_zero(sizeof(hs_service_t)); - /* Set default configuration value. */ - set_service_default_config(&service->config, options); - /* Set the default service version. */ - service->config.version = HS_SERVICE_DEFAULT_VERSION; - /* Allocate the CLIENT_PK replay cache in service state. */ - service->state.replay_cache_rend_cookie = - replaycache_new(REND_REPLAY_TIME_INTERVAL, REND_REPLAY_TIME_INTERVAL); - - return service; -} - -/* Free the given service object and all its content. This function - * also takes care of wiping service keys from memory. It is safe to pass a - * NULL pointer. */ -void -hs_service_free_(hs_service_t *service) -{ - if (service == NULL) { - return; - } - - /* Free descriptors. Go over both descriptor with this loop. */ - FOR_EACH_DESCRIPTOR_BEGIN(service, desc) { - service_descriptor_free(desc); - } FOR_EACH_DESCRIPTOR_END; - - /* Free service configuration. */ - service_clear_config(&service->config); - - /* Free replay cache from state. */ - if (service->state.replay_cache_rend_cookie) { - replaycache_free(service->state.replay_cache_rend_cookie); - } - - /* Wipe service keys. */ - memwipe(&service->keys.identity_sk, 0, sizeof(service->keys.identity_sk)); - - tor_free(service); -} - -/* Periodic callback. Entry point from the main loop to the HS service - * subsystem. This is call every second. This is skipped if tor can't build a - * circuit or the network is disabled. */ -void -hs_service_run_scheduled_events(time_t now) -{ - /* First thing we'll do here is to make sure our services are in a - * quiescent state for the scheduled events. */ - run_housekeeping_event(now); - - /* Order matters here. We first make sure the descriptor object for each - * service contains the latest data. Once done, we check if we need to open - * new introduction circuit. Finally, we try to upload the descriptor for - * each service. */ - - /* Make sure descriptors are up to date. */ - run_build_descriptor_event(now); - /* Make sure services have enough circuits. */ - run_build_circuit_event(now); - /* Upload the descriptors if needed/possible. */ - run_upload_descriptor_event(now); -} - -/* Initialize the service HS subsystem. */ -void -hs_service_init(void) -{ - /* Should never be called twice. */ - tor_assert(!hs_service_map); - tor_assert(!hs_service_staging_list); - - /* v2 specific. */ - rend_service_init(); - - hs_service_map = tor_malloc_zero(sizeof(struct hs_service_ht)); - HT_INIT(hs_service_ht, hs_service_map); - - hs_service_staging_list = smartlist_new(); -} - -/* Release all global storage of the hidden service subsystem. */ -void -hs_service_free_all(void) -{ - rend_service_free_all(); - service_free_all(); -} - -#ifdef TOR_UNIT_TESTS - -/* Return the global service map size. Only used by unit test. */ -STATIC unsigned int -get_hs_service_map_size(void) -{ - return HT_SIZE(hs_service_map); -} - -/* Return the staging list size. Only used by unit test. */ -STATIC int -get_hs_service_staging_list_size(void) -{ - return smartlist_len(hs_service_staging_list); -} - -STATIC hs_service_ht * -get_hs_service_map(void) -{ - return hs_service_map; -} - -STATIC hs_service_t * -get_first_service(void) -{ - hs_service_t **obj = HT_START(hs_service_ht, hs_service_map); - if (obj == NULL) { - return NULL; - } - return *obj; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/hs_service.h b/src/tor/src/or/hs_service.h deleted file mode 100644 index d163eeef2..000000000 --- a/src/tor/src/or/hs_service.h +++ /dev/null @@ -1,374 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hs_service.h - * \brief Header file containing service data for the HS subsytem. - **/ - -#ifndef TOR_HS_SERVICE_H -#define TOR_HS_SERVICE_H - -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "replaycache.h" - -#include "hs_common.h" -#include "hs_descriptor.h" -#include "hs_ident.h" -#include "hs_intropoint.h" - -/* Trunnel */ -#include "hs/cell_establish_intro.h" - -/* When loading and configuring a service, this is the default version it will - * be configured for as it is possible that no HiddenServiceVersion is - * present. */ -#define HS_SERVICE_DEFAULT_VERSION HS_VERSION_TWO - -/* As described in the specification, service publishes their next descriptor - * at a random time between those two values (in seconds). */ -#define HS_SERVICE_NEXT_UPLOAD_TIME_MIN (60 * 60) -#define HS_SERVICE_NEXT_UPLOAD_TIME_MAX (120 * 60) - -/* Service side introduction point. */ -typedef struct hs_service_intro_point_t { - /* Top level intropoint "shared" data between client/service. */ - hs_intropoint_t base; - - /* Onion key of the introduction point used to extend to it for the ntor - * handshake. */ - curve25519_public_key_t onion_key; - - /* Authentication keypair used to create the authentication certificate - * which is published in the descriptor. */ - ed25519_keypair_t auth_key_kp; - - /* Encryption keypair for the "ntor" type. */ - curve25519_keypair_t enc_key_kp; - - /* Legacy key if that intro point doesn't support v3. This should be used if - * the base object legacy flag is set. */ - crypto_pk_t *legacy_key; - - /* Amount of INTRODUCE2 cell accepted from this intro point. */ - uint64_t introduce2_count; - - /* Maximum number of INTRODUCE2 cell this intro point should accept. */ - uint64_t introduce2_max; - - /* The time at which this intro point should expire and stop being used. */ - time_t time_to_expire; - - /* The amount of circuit creation we've made to this intro point. This is - * incremented every time we do a circuit relaunch on this intro point which - * is triggered when the circuit dies but the node is still in the - * consensus. After MAX_INTRO_POINT_CIRCUIT_RETRIES, we give up on it. */ - uint32_t circuit_retries; - - /* Set if this intro point has an established circuit. */ - unsigned int circuit_established : 1; - - /* Replay cache recording the encrypted part of an INTRODUCE2 cell that the - * circuit associated with this intro point has received. This is used to - * prevent replay attacks. */ - replaycache_t *replay_cache; -} hs_service_intro_point_t; - -/* Object handling introduction points of a service. */ -typedef struct hs_service_intropoints_t { - /* The time at which we've started our retry period to build circuits. We - * don't want to stress circuit creation so we can only retry for a certain - * time and then after we stop and wait. */ - time_t retry_period_started; - - /* Number of circuit we've launched during a single retry period. */ - unsigned int num_circuits_launched; - - /* Contains the current hs_service_intro_point_t objects indexed by - * authentication public key. */ - digest256map_t *map; - - /* Contains node's identity key digest that were introduction point for this - * descriptor but were retried to many times. We keep those so we avoid - * re-picking them over and over for a circuit retry period. - * XXX: Once we have #22173, change this to only use ed25519 identity. */ - digestmap_t *failed_id; -} hs_service_intropoints_t; - -/* Representation of a service descriptor. */ -typedef struct hs_service_descriptor_t { - /* Decoded descriptor. This object is used for encoding when the service - * publishes the descriptor. */ - hs_descriptor_t *desc; - - /* Descriptor signing keypair. */ - ed25519_keypair_t signing_kp; - - /* Blinded keypair derived from the master identity public key. */ - ed25519_keypair_t blinded_kp; - - /* When is the next time when we should upload the descriptor. */ - time_t next_upload_time; - - /* Introduction points assign to this descriptor which contains - * hs_service_intropoints_t object indexed by authentication key (the RSA - * key if the node is legacy). */ - hs_service_intropoints_t intro_points; - - /* The time period number this descriptor has been created for. */ - uint64_t time_period_num; - - /* True iff we have missing intro points for this descriptor because we - * couldn't pick any nodes. */ - unsigned int missing_intro_points : 1; - - /** List of the responsible HSDirs (their b64ed identity digest) last time we - * uploaded this descriptor. If the set of responsible HSDirs is different - * from this list, this means we received new dirinfo and we need to - * reupload our descriptor. */ - smartlist_t *previous_hsdirs; -} hs_service_descriptor_t; - -/* Service key material. */ -typedef struct hs_service_keys_t { - /* Master identify public key. */ - ed25519_public_key_t identity_pk; - /* Master identity private key. */ - ed25519_secret_key_t identity_sk; - /* True iff the key is kept offline which means the identity_sk MUST not be - * used in that case. */ - unsigned int is_identify_key_offline : 1; -} hs_service_keys_t; - -/* Service configuration. The following are set from the torrc options either - * set by the configuration file or by the control port. Nothing else should - * change those values. */ -typedef struct hs_service_config_t { - /* Protocol version of the service. Specified by HiddenServiceVersion - * option. */ - uint32_t version; - - /* List of rend_service_port_config_t */ - smartlist_t *ports; - - /* Path on the filesystem where the service persistent data is stored. NULL - * if the service is ephemeral. Specified by HiddenServiceDir option. */ - char *directory_path; - - /* The maximum number of simultaneous streams per rendezvous circuit that - * are allowed to be created. No limit if 0. Specified by - * HiddenServiceMaxStreams option. */ - uint64_t max_streams_per_rdv_circuit; - - /* If true, we close circuits that exceed the max_streams_per_rdv_circuit - * limit. Specified by HiddenServiceMaxStreamsCloseCircuit option. */ - unsigned int max_streams_close_circuit : 1; - - /* How many introduction points this service has. Specified by - * HiddenServiceNumIntroductionPoints option. */ - unsigned int num_intro_points; - - /* True iff we allow request made on unknown ports. Specified by - * HiddenServiceAllowUnknownPorts option. */ - unsigned int allow_unknown_ports : 1; - - /* If true, this service is a Single Onion Service. Specified by - * HiddenServiceSingleHopMode and HiddenServiceNonAnonymousMode options. */ - unsigned int is_single_onion : 1; - - /* If true, allow group read permissions on the directory_path. Specified by - * HiddenServiceDirGroupReadable option. */ - unsigned int dir_group_readable : 1; - - /* Is this service ephemeral? */ - unsigned int is_ephemeral : 1; -} hs_service_config_t; - -/* Service state. */ -typedef struct hs_service_state_t { - /* The time at which we've started our retry period to build circuits. We - * don't want to stress circuit creation so we can only retry for a certain - * time and then after we stop and wait. */ - time_t intro_circ_retry_started_time; - - /* Number of circuit we've launched during a single retry period. This - * should never go over MAX_INTRO_CIRCS_PER_PERIOD. */ - unsigned int num_intro_circ_launched; - - /* Replay cache tracking the REND_COOKIE found in INTRODUCE2 cell to detect - * repeats. Clients may send INTRODUCE1 cells for the same rendezvous point - * through two or more different introduction points; when they do, this - * keeps us from launching multiple simultaneous attempts to connect to the - * same rend point. */ - replaycache_t *replay_cache_rend_cookie; - - /* When is the next time we should rotate our descriptors. This is has to be - * done at the start time of the next SRV protocol run. */ - time_t next_rotation_time; -} hs_service_state_t; - -/* Representation of a service running on this tor instance. */ -typedef struct hs_service_t { - /* Onion address base32 encoded and NUL terminated. We keep it for logging - * purposes so we don't have to build it everytime. */ - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - - /* Hashtable node: use to look up the service by its master public identity - * key in the service global map. */ - HT_ENTRY(hs_service_t) hs_service_node; - - /* Service state which contains various flags and counters. */ - hs_service_state_t state; - - /* Key material of the service. */ - hs_service_keys_t keys; - - /* Configuration of the service. */ - hs_service_config_t config; - - /* Current descriptor. */ - hs_service_descriptor_t *desc_current; - /* Next descriptor. */ - hs_service_descriptor_t *desc_next; - - /* XXX: Credential (client auth.) #20700. */ - -} hs_service_t; - -/* For the service global hash map, we define a specific type for it which - * will make it safe to use and specific to some controlled parameters such as - * the hashing function and how to compare services. */ -typedef HT_HEAD(hs_service_ht, hs_service_t) hs_service_ht; - -/* API */ - -/* Global initializer and cleanup function. */ -void hs_service_init(void); -void hs_service_free_all(void); - -/* Service new/free functions. */ -hs_service_t *hs_service_new(const or_options_t *options); -void hs_service_free_(hs_service_t *service); -#define hs_service_free(s) FREE_AND_NULL(hs_service_t, hs_service_free_, (s)) - -unsigned int hs_service_get_num_services(void); -void hs_service_stage_services(const smartlist_t *service_list); -int hs_service_load_all_keys(void); -void hs_service_lists_fnames_for_sandbox(smartlist_t *file_list, - smartlist_t *dir_list); -int hs_service_set_conn_addr_port(const origin_circuit_t *circ, - edge_connection_t *conn); - -void hs_service_dir_info_changed(void); -void hs_service_run_scheduled_events(time_t now); -void hs_service_circuit_has_opened(origin_circuit_t *circ); -int hs_service_receive_intro_established(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); -int hs_service_receive_introduce2(origin_circuit_t *circ, - const uint8_t *payload, - size_t payload_len); - -void hs_service_intro_circ_has_closed(origin_circuit_t *circ); - -char *hs_service_lookup_current_desc(const ed25519_public_key_t *pk); - -hs_service_add_ephemeral_status_t -hs_service_add_ephemeral(ed25519_secret_key_t *sk, smartlist_t *ports, - int max_streams_per_rdv_circuit, - int max_streams_close_circuit, char **address_out); -int hs_service_del_ephemeral(const char *address); - -/* Used outside of the HS subsystem by the control port command HSPOST. */ -void hs_service_upload_desc_to_dir(const char *encoded_desc, - const uint8_t version, - const ed25519_public_key_t *identity_pk, - const ed25519_public_key_t *blinded_pk, - const routerstatus_t *hsdir_rs); - -#ifdef HS_SERVICE_PRIVATE - -#ifdef TOR_UNIT_TESTS -/* Useful getters for unit tests. */ -STATIC unsigned int get_hs_service_map_size(void); -STATIC int get_hs_service_staging_list_size(void); -STATIC hs_service_ht *get_hs_service_map(void); -STATIC hs_service_t *get_first_service(void); -STATIC hs_service_intro_point_t *service_intro_point_find_by_ident( - const hs_service_t *service, - const hs_ident_circuit_t *ident); -#endif - -/* Service accessors. */ -STATIC hs_service_t *find_service(hs_service_ht *map, - const ed25519_public_key_t *pk); -STATIC void remove_service(hs_service_ht *map, hs_service_t *service); -STATIC int register_service(hs_service_ht *map, hs_service_t *service); -/* Service introduction point functions. */ -STATIC hs_service_intro_point_t *service_intro_point_new( - const extend_info_t *ei, - unsigned int is_legacy); -STATIC void service_intro_point_free_(hs_service_intro_point_t *ip); -#define service_intro_point_free(ip) \ - FREE_AND_NULL(hs_service_intro_point_t, \ - service_intro_point_free_, (ip)) -STATIC void service_intro_point_add(digest256map_t *map, - hs_service_intro_point_t *ip); -STATIC void service_intro_point_remove(const hs_service_t *service, - const hs_service_intro_point_t *ip); -STATIC hs_service_intro_point_t *service_intro_point_find( - const hs_service_t *service, - const ed25519_public_key_t *auth_key); -/* Service descriptor functions. */ -STATIC hs_service_descriptor_t *service_descriptor_new(void); -STATIC hs_service_descriptor_t *service_desc_find_by_intro( - const hs_service_t *service, - const hs_service_intro_point_t *ip); -/* Helper functions. */ -STATIC void get_objects_from_ident(const hs_ident_circuit_t *ident, - hs_service_t **service, - hs_service_intro_point_t **ip, - hs_service_descriptor_t **desc); -STATIC const node_t * -get_node_from_intro_point(const hs_service_intro_point_t *ip); -STATIC int can_service_launch_intro_circuit(hs_service_t *service, - time_t now); -STATIC int intro_point_should_expire(const hs_service_intro_point_t *ip, - time_t now); -STATIC void run_housekeeping_event(time_t now); -STATIC void rotate_all_descriptors(time_t now); -STATIC void build_all_descriptors(time_t now); -STATIC void update_all_descriptors(time_t now); -STATIC void run_upload_descriptor_event(time_t now); - -STATIC char * -encode_desc_rev_counter_for_state(const hs_service_descriptor_t *desc); - -STATIC void service_descriptor_free_(hs_service_descriptor_t *desc); -#define service_descriptor_free(d) \ - FREE_AND_NULL(hs_service_descriptor_t, \ - service_descriptor_free_, (d)) - -STATIC uint64_t -check_state_line_for_service_rev_counter(const char *state_line, - const ed25519_public_key_t *blinded_pubkey, - int *service_found_out); - -STATIC int -write_address_to_file(const hs_service_t *service, const char *fname_); - -STATIC void upload_descriptor_to_all(const hs_service_t *service, - hs_service_descriptor_t *desc); - -STATIC void service_desc_schedule_upload(hs_service_descriptor_t *desc, - time_t now, - int descriptor_changed); - -STATIC int service_desc_hsdirs_changed(const hs_service_t *service, - const hs_service_descriptor_t *desc); - -#endif /* defined(HS_SERVICE_PRIVATE) */ - -#endif /* !defined(TOR_HS_SERVICE_H) */ - diff --git a/src/tor/src/or/include.am b/src/tor/src/or/include.am deleted file mode 100644 index 1c66cd2de..000000000 --- a/src/tor/src/or/include.am +++ /dev/null @@ -1,280 +0,0 @@ -bin_PROGRAMS+= src/or/tor -noinst_LIBRARIES += \ - src/or/libtor.a -if UNITTESTS_ENABLED -noinst_LIBRARIES += \ - src/or/libtor-testing.a -endif -if COVERAGE_ENABLED -noinst_PROGRAMS+= src/or/tor-cov -endif - -if BUILD_NT_SERVICES -tor_platform_source=src/or/ntmain.c -else -tor_platform_source= -endif - -EXTRA_DIST+= src/or/ntmain.c src/or/Makefile.nmake - -LIBTOR_A_SOURCES = \ - src/or/addressmap.c \ - src/or/bridges.c \ - src/or/channel.c \ - src/or/channelpadding.c \ - src/or/channeltls.c \ - src/or/circpathbias.c \ - src/or/circuitbuild.c \ - src/or/circuitlist.c \ - src/or/circuitmux.c \ - src/or/circuitmux_ewma.c \ - src/or/circuitstats.c \ - src/or/circuituse.c \ - src/or/command.c \ - src/or/config.c \ - src/or/confparse.c \ - src/or/connection.c \ - src/or/connection_edge.c \ - src/or/connection_or.c \ - src/or/conscache.c \ - src/or/consdiff.c \ - src/or/consdiffmgr.c \ - src/or/control.c \ - src/or/cpuworker.c \ - src/or/dircollate.c \ - src/or/directory.c \ - src/or/dirserv.c \ - src/or/dirvote.c \ - src/or/dns.c \ - src/or/dnsserv.c \ - src/or/fp_pair.c \ - src/or/geoip.c \ - src/or/entrynodes.c \ - src/or/ext_orport.c \ - src/or/git_revision.c \ - src/or/hibernate.c \ - src/or/hs_cache.c \ - src/or/hs_cell.c \ - src/or/hs_circuit.c \ - src/or/hs_circuitmap.c \ - src/or/hs_client.c \ - src/or/hs_common.c \ - src/or/hs_config.c \ - src/or/hs_control.c \ - src/or/hs_descriptor.c \ - src/or/hs_ident.c \ - src/or/hs_intropoint.c \ - src/or/hs_ntor.c \ - src/or/hs_service.c \ - src/or/keypin.c \ - src/or/main.c \ - src/or/microdesc.c \ - src/or/networkstatus.c \ - src/or/nodelist.c \ - src/or/onion.c \ - src/or/onion_fast.c \ - src/or/onion_tap.c \ - src/or/shared_random.c \ - src/or/shared_random_state.c \ - src/or/transports.c \ - src/or/parsecommon.c \ - src/or/periodic.c \ - src/or/protover.c \ - src/or/protover_rust.c \ - src/or/proto_cell.c \ - src/or/proto_control0.c \ - src/or/proto_ext_or.c \ - src/or/proto_http.c \ - src/or/proto_socks.c \ - src/or/policies.c \ - src/or/reasons.c \ - src/or/relay.c \ - src/or/rendcache.c \ - src/or/rendclient.c \ - src/or/rendcommon.c \ - src/or/rendmid.c \ - src/or/rendservice.c \ - src/or/rephist.c \ - src/or/replaycache.c \ - src/or/router.c \ - src/or/routerkeys.c \ - src/or/routerlist.c \ - src/or/routerparse.c \ - src/or/routerset.c \ - src/or/scheduler.c \ - src/or/scheduler_kist.c \ - src/or/scheduler_vanilla.c \ - src/or/statefile.c \ - src/or/status.c \ - src/or/torcert.c \ - src/or/tor_api.c \ - src/or/onion_ntor.c \ - $(tor_platform_source) - -src_or_libtor_a_SOURCES = $(LIBTOR_A_SOURCES) -src_or_libtor_testing_a_SOURCES = $(LIBTOR_A_SOURCES) - -src_or_tor_SOURCES = src/or/tor_main.c -AM_CPPFLAGS += -I$(srcdir)/src/or -Isrc/or - -src/or/tor_main.$(OBJEXT) \ - src/or/src_or_tor_cov-tor_main.$(OBJEXT): micro-revision.i - -AM_CPPFLAGS += -DSHARE_DATADIR="\"$(datadir)\"" \ - -DLOCALSTATEDIR="\"$(localstatedir)\"" \ - -DBINDIR="\"$(bindir)\"" - -src_or_libtor_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_or_libtor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - -# -L flags need to go in LDFLAGS. -l flags need to go in LDADD. -# This seems to matter nowhere but on windows, but I assure you that it -# matters a lot there, and is quite hard to debug if you forget to do it. - - -src_or_tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ -src_or_tor_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-ctime.a \ - src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - src/common/libor-event.a src/trunnel/libor-trunnel.a \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ - @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ - -if COVERAGE_ENABLED -src_or_tor_cov_SOURCES = src/or/tor_main.c -src_or_tor_cov_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_or_tor_cov_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_or_tor_cov_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ -src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ - @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ -endif - -ORHEADERS = \ - src/or/addressmap.h \ - src/or/bridges.h \ - src/or/channel.h \ - src/or/channelpadding.h \ - src/or/channeltls.h \ - src/or/circpathbias.h \ - src/or/circuitbuild.h \ - src/or/circuitlist.h \ - src/or/circuitmux.h \ - src/or/circuitmux_ewma.h \ - src/or/circuitstats.h \ - src/or/circuituse.h \ - src/or/command.h \ - src/or/config.h \ - src/or/confparse.h \ - src/or/connection.h \ - src/or/connection_edge.h \ - src/or/connection_or.h \ - src/or/conscache.h \ - src/or/consdiff.h \ - src/or/consdiffmgr.h \ - src/or/control.h \ - src/or/cpuworker.h \ - src/or/dircollate.h \ - src/or/directory.h \ - src/or/dirserv.h \ - src/or/dirvote.h \ - src/or/dns.h \ - src/or/dns_structs.h \ - src/or/dnsserv.h \ - src/or/ext_orport.h \ - src/or/fallback_dirs.inc \ - src/or/fp_pair.h \ - src/or/geoip.h \ - src/or/entrynodes.h \ - src/or/git_revision.h \ - src/or/hibernate.h \ - src/or/hs_cache.h \ - src/or/hs_cell.h \ - src/or/hs_circuit.h \ - src/or/hs_circuitmap.h \ - src/or/hs_client.h \ - src/or/hs_common.h \ - src/or/hs_config.h \ - src/or/hs_control.h \ - src/or/hs_descriptor.h \ - src/or/hs_ident.h \ - src/or/hs_intropoint.h \ - src/or/hs_ntor.h \ - src/or/hs_service.h \ - src/or/keypin.h \ - src/or/main.h \ - src/or/microdesc.h \ - src/or/networkstatus.h \ - src/or/nodelist.h \ - src/or/ntmain.h \ - src/or/onion.h \ - src/or/onion_fast.h \ - src/or/onion_ntor.h \ - src/or/onion_tap.h \ - src/or/or.h \ - src/or/shared_random.h \ - src/or/shared_random_state.h \ - src/or/transports.h \ - src/or/parsecommon.h \ - src/or/periodic.h \ - src/or/policies.h \ - src/or/protover.h \ - src/or/proto_cell.h \ - src/or/proto_control0.h \ - src/or/proto_ext_or.h \ - src/or/proto_http.h \ - src/or/proto_socks.h \ - src/or/reasons.h \ - src/or/relay.h \ - src/or/rendcache.h \ - src/or/rendclient.h \ - src/or/rendcommon.h \ - src/or/rendmid.h \ - src/or/rendservice.h \ - src/or/rephist.h \ - src/or/replaycache.h \ - src/or/router.h \ - src/or/routerkeys.h \ - src/or/routerlist.h \ - src/or/routerkeys.h \ - src/or/routerset.h \ - src/or/routerparse.h \ - src/or/scheduler.h \ - src/or/statefile.h \ - src/or/status.h \ - src/or/torcert.h \ - src/or/tor_api_internal.h - -# This may someday want to be an installed file? -noinst_HEADERS += src/or/tor_api.h - -noinst_HEADERS += $(ORHEADERS) micro-revision.i - -micro-revision.i: FORCE - $(AM_V_at)rm -f micro-revision.tmp; \ - if test -r "$(top_srcdir)/.git" && \ - test -x "`which git 2>&1;true`"; then \ - HASH="`cd "$(top_srcdir)" && git rev-parse --short=16 HEAD`"; \ - echo \"$$HASH\" > micro-revision.tmp; \ - fi; \ - if test ! -f micro-revision.tmp; then \ - if test ! -f micro-revision.i; then \ - echo '""' > micro-revision.i; \ - fi; \ - elif test ! -f micro-revision.i || \ - test x"`cat micro-revision.tmp`" != x"`cat micro-revision.i`"; then \ - mv micro-revision.tmp micro-revision.i; \ - fi; \ - rm -f micro-revision.tmp; \ - true - -CLEANFILES+= micro-revision.i src/or/micro-revision.i micro-revision.tmp - -FORCE: diff --git a/src/tor/src/or/keypin.c b/src/tor/src/or/keypin.c deleted file mode 100644 index 1698dc184..000000000 --- a/src/tor/src/or/keypin.c +++ /dev/null @@ -1,498 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file keypin.c - * - * \brief Functions and structures for associating routers' RSA key - * fingerprints with their ED25519 keys. - */ - -#define KEYPIN_PRIVATE - -#include "orconfig.h" -#include "compat.h" -#include "crypto.h" -#include "crypto_format.h" -#include "di_ops.h" -#include "ht.h" -#include "keypin.h" -#include "siphash.h" -#include "torint.h" -#include "torlog.h" -#include "util.h" -#include "util_format.h" - -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef _WIN32 -#include -#endif - -/** - * @file keypin.c - * @brief Key-pinning for RSA and Ed25519 identity keys at directory - * authorities. - * - * Many older clients, and many internal interfaces, still refer to relays by - * their RSA1024 identity keys. We can make this more secure, however: - * authorities use this module to track which RSA keys have been used along - * with which Ed25519 keys, and force such associations to be permanent. - * - * This module implements a key-pinning mechanism to ensure that it's safe - * to use RSA keys as identitifers even as we migrate to Ed25519 keys. It - * remembers, for every Ed25519 key we've seen, what the associated Ed25519 - * key is. This way, if we see a different Ed25519 key with that RSA key, - * we'll know that there's a mismatch. - * - * (As of this writing, these key associations are advisory only, mostly - * because some relay operators kept mishandling their Ed25519 keys during - * the initial Ed25519 rollout. We should fix this problem, and then toggle - * the AuthDirPinKeys option.) - * - * We persist these entries to disk using a simple format, where each line - * has a base64-encoded RSA SHA1 hash, then a base64-endoded Ed25519 key. - * Empty lines, misformed lines, and lines beginning with # are - * ignored. Lines beginning with @ are reserved for future extensions. - * - * The dirserv.c module is the main user of these functions. - */ - -static int keypin_journal_append_entry(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key); -static int keypin_check_and_add_impl(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key, - const int do_not_add, - const int replace); -static int keypin_add_or_replace_entry_in_map(keypin_ent_t *ent); - -static HT_HEAD(rsamap, keypin_ent_st) the_rsa_map = HT_INITIALIZER(); -static HT_HEAD(edmap, keypin_ent_st) the_ed_map = HT_INITIALIZER(); - -/** Hashtable helper: compare two keypin table entries and return true iff - * they have the same RSA key IDs. */ -static inline int -keypin_ents_eq_rsa(const keypin_ent_t *a, const keypin_ent_t *b) -{ - return tor_memeq(a->rsa_id, b->rsa_id, sizeof(a->rsa_id)); -} - -/** Hashtable helper: hash a keypin table entries based on its RSA key ID */ -static inline unsigned -keypin_ent_hash_rsa(const keypin_ent_t *a) -{ -return (unsigned) siphash24g(a->rsa_id, sizeof(a->rsa_id)); -} - -/** Hashtable helper: compare two keypin table entries and return true iff - * they have the same ed25519 keys */ -static inline int -keypin_ents_eq_ed(const keypin_ent_t *a, const keypin_ent_t *b) -{ - return tor_memeq(a->ed25519_key, b->ed25519_key, sizeof(a->ed25519_key)); -} - -/** Hashtable helper: hash a keypin table entries based on its ed25519 key */ -static inline unsigned -keypin_ent_hash_ed(const keypin_ent_t *a) -{ -return (unsigned) siphash24g(a->ed25519_key, sizeof(a->ed25519_key)); -} - -HT_PROTOTYPE(rsamap, keypin_ent_st, rsamap_node, keypin_ent_hash_rsa, - keypin_ents_eq_rsa) -HT_GENERATE2(rsamap, keypin_ent_st, rsamap_node, keypin_ent_hash_rsa, - keypin_ents_eq_rsa, 0.6, tor_reallocarray, tor_free_) - -HT_PROTOTYPE(edmap, keypin_ent_st, edmap_node, keypin_ent_hash_ed, - keypin_ents_eq_ed) -HT_GENERATE2(edmap, keypin_ent_st, edmap_node, keypin_ent_hash_ed, - keypin_ents_eq_ed, 0.6, tor_reallocarray, tor_free_) - -/** - * Check whether we already have an entry in the key pinning table for a - * router with RSA ID digest rsa_id_digest or for ed25519 key - * ed25519_id_key. If we have an entry that matches both keys, - * return KEYPIN_FOUND. If we find an entry that matches one key but - * not the other, return KEYPIN_MISMATCH. If we have no entry for either - * key, add such an entry to the table and return KEYPIN_ADDED. - * - * If replace_existing_entry is true, then any time we would have said - * KEYPIN_FOUND, we instead add this entry anyway and return KEYPIN_ADDED. - */ -int -keypin_check_and_add(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key, - const int replace_existing_entry) -{ - return keypin_check_and_add_impl(rsa_id_digest, ed25519_id_key, 0, - replace_existing_entry); -} - -/** - * As keypin_check_and_add, but do not add. Return KEYPIN_NOT_FOUND if - * we would add. - */ -int -keypin_check(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key) -{ - return keypin_check_and_add_impl(rsa_id_digest, ed25519_id_key, 1, 0); -} - -/** - * Helper: implements keypin_check and keypin_check_and_add. - */ -static int -keypin_check_and_add_impl(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key, - const int do_not_add, - const int replace) -{ - keypin_ent_t search, *ent; - memset(&search, 0, sizeof(search)); - memcpy(search.rsa_id, rsa_id_digest, sizeof(search.rsa_id)); - memcpy(search.ed25519_key, ed25519_id_key, sizeof(search.ed25519_key)); - - /* Search by RSA key digest first */ - ent = HT_FIND(rsamap, &the_rsa_map, &search); - if (ent) { - tor_assert(fast_memeq(ent->rsa_id, rsa_id_digest, sizeof(ent->rsa_id))); - if (tor_memeq(ent->ed25519_key, ed25519_id_key,sizeof(ent->ed25519_key))) { - return KEYPIN_FOUND; /* Match on both keys. Great. */ - } else { - if (!replace) - return KEYPIN_MISMATCH; /* Found RSA with different Ed key */ - } - } - - /* See if we know a different RSA key for this ed key */ - if (! replace) { - ent = HT_FIND(edmap, &the_ed_map, &search); - if (ent) { - /* If we got here, then the ed key matches and the RSA doesn't */ - tor_assert(fast_memeq(ent->ed25519_key, ed25519_id_key, - sizeof(ent->ed25519_key))); - tor_assert(fast_memneq(ent->rsa_id, rsa_id_digest, sizeof(ent->rsa_id))); - return KEYPIN_MISMATCH; - } - } - - /* Okay, this one is new to us. */ - if (do_not_add) - return KEYPIN_NOT_FOUND; - - ent = tor_memdup(&search, sizeof(search)); - int r = keypin_add_or_replace_entry_in_map(ent); - if (! replace) { - tor_assert(r == 1); - } else { - tor_assert(r != 0); - } - keypin_journal_append_entry(rsa_id_digest, ed25519_id_key); - return KEYPIN_ADDED; -} - -/** - * Helper: add ent to the hash tables. - */ -MOCK_IMPL(STATIC void, -keypin_add_entry_to_map, (keypin_ent_t *ent)) -{ - HT_INSERT(rsamap, &the_rsa_map, ent); - HT_INSERT(edmap, &the_ed_map, ent); -} - -/** - * Helper: add 'ent' to the maps, replacing any entries that contradict it. - * Take ownership of 'ent', freeing it if needed. - * - * Return 0 if the entry was a duplicate, -1 if there was a conflict, - * and 1 if there was no conflict. - */ -static int -keypin_add_or_replace_entry_in_map(keypin_ent_t *ent) -{ - int r = 1; - keypin_ent_t *ent2 = HT_FIND(rsamap, &the_rsa_map, ent); - keypin_ent_t *ent3 = HT_FIND(edmap, &the_ed_map, ent); - if (ent2 && - fast_memeq(ent2->ed25519_key, ent->ed25519_key, DIGEST256_LEN)) { - /* We already have this mapping stored. Ignore it. */ - tor_free(ent); - return 0; - } else if (ent2 || ent3) { - /* We have a conflict. (If we had no entry, we would have ent2 == ent3 - * == NULL. If we had a non-conflicting duplicate, we would have found - * it above.) - * - * We respond by having this entry (ent) supersede all entries that it - * contradicts (ent2 and/or ent3). In other words, if we receive - * , we remove all and all , for rsa'!=rsa - * and ed'!= ed. - */ - const keypin_ent_t *t; - if (ent2) { - t = HT_REMOVE(rsamap, &the_rsa_map, ent2); - tor_assert(ent2 == t); - t = HT_REMOVE(edmap, &the_ed_map, ent2); - tor_assert(ent2 == t); - } - if (ent3 && ent2 != ent3) { - t = HT_REMOVE(rsamap, &the_rsa_map, ent3); - tor_assert(ent3 == t); - t = HT_REMOVE(edmap, &the_ed_map, ent3); - tor_assert(ent3 == t); - tor_free(ent3); - } - tor_free(ent2); - r = -1; - /* Fall through */ - } - - keypin_add_entry_to_map(ent); - return r; -} - -/** - * Check whether we already have an entry in the key pinning table for a - * router with RSA ID digest rsa_id_digest. If we have no such entry, - * return KEYPIN_NOT_FOUND. If we find an entry that matches the RSA key but - * which has an ed25519 key, return KEYPIN_MISMATCH. - */ -int -keypin_check_lone_rsa(const uint8_t *rsa_id_digest) -{ - keypin_ent_t search, *ent; - memset(&search, 0, sizeof(search)); - memcpy(search.rsa_id, rsa_id_digest, sizeof(search.rsa_id)); - - /* Search by RSA key digest first */ - ent = HT_FIND(rsamap, &the_rsa_map, &search); - if (ent) { - return KEYPIN_MISMATCH; - } else { - return KEYPIN_NOT_FOUND; - } -} - -/** Open fd to the keypinning journal file. */ -static int keypin_journal_fd = -1; - -/** Open the key-pinning journal to append to fname. Return 0 on - * success, -1 on failure. */ -int -keypin_open_journal(const char *fname) -{ - /* O_SYNC ??*/ - int fd = tor_open_cloexec(fname, O_WRONLY|O_CREAT|O_BINARY, 0600); - if (fd < 0) - goto err; - - if (tor_fd_seekend(fd) < 0) - goto err; - - /* Add a newline in case the last line was only partially written */ - if (write(fd, "\n", 1) < 1) - goto err; - - /* Add something about when we opened this file. */ - char buf[80]; - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, approx_time()); - tor_snprintf(buf, sizeof(buf), "@opened-at %s\n", tbuf); - if (write_all(fd, buf, strlen(buf), 0) < 0) - goto err; - - keypin_journal_fd = fd; - return 0; - err: - if (fd >= 0) - close(fd); - return -1; -} - -/** Close the keypinning journal file. */ -int -keypin_close_journal(void) -{ - if (keypin_journal_fd >= 0) - close(keypin_journal_fd); - keypin_journal_fd = -1; - return 0; -} - -/** Length of a keypinning journal line, including terminating newline. */ -#define JOURNAL_LINE_LEN (BASE64_DIGEST_LEN + BASE64_DIGEST256_LEN + 2) - -/** Add an entry to the keypinning journal to map rsa_id_digest and - * ed25519_id_key. */ -static int -keypin_journal_append_entry(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key) -{ - if (keypin_journal_fd == -1) - return -1; - char line[JOURNAL_LINE_LEN]; - digest_to_base64(line, (const char*)rsa_id_digest); - line[BASE64_DIGEST_LEN] = ' '; - digest256_to_base64(line + BASE64_DIGEST_LEN + 1, - (const char*)ed25519_id_key); - line[BASE64_DIGEST_LEN+1+BASE64_DIGEST256_LEN] = '\n'; - - if (write_all(keypin_journal_fd, line, JOURNAL_LINE_LEN, 0)<0) { - log_warn(LD_DIRSERV, "Error while adding a line to the key-pinning " - "journal: %s", strerror(errno)); - keypin_close_journal(); - return -1; - } - - return 0; -} - -/** Load a journal from the size-byte region at data. Return 0 - * on success, -1 on failure. */ -STATIC int -keypin_load_journal_impl(const char *data, size_t size) -{ - const char *start = data, *end = data + size, *next; - - int n_corrupt_lines = 0; - int n_entries = 0; - int n_duplicates = 0; - int n_conflicts = 0; - - for (const char *cp = start; cp < end; cp = next) { - const char *eol = memchr(cp, '\n', end-cp); - const char *eos = eol ? eol : end; - const size_t len = eos - cp; - - next = eol ? eol + 1 : end; - - if (len == 0) { - continue; - } - - if (*cp == '@') { - /* Lines that start with @ are reserved. Ignore for now. */ - continue; - } - if (*cp == '#') { - /* Lines that start with # are comments. */ - continue; - } - - /* Is it the right length? (The -1 here is for the newline.) */ - if (len != JOURNAL_LINE_LEN - 1) { - /* Lines with a bad length are corrupt unless they are empty. - * Ignore them either way */ - for (const char *s = cp; s < eos; ++s) { - if (! TOR_ISSPACE(*s)) { - ++n_corrupt_lines; - break; - } - } - continue; - } - - keypin_ent_t *ent = keypin_parse_journal_line(cp); - - if (ent == NULL) { - ++n_corrupt_lines; - continue; - } - - const int r = keypin_add_or_replace_entry_in_map(ent); - if (r == 0) { - ++n_duplicates; - } else if (r == -1) { - ++n_conflicts; - } - - ++n_entries; - } - - int severity = (n_corrupt_lines || n_duplicates) ? LOG_WARN : LOG_INFO; - tor_log(severity, LD_DIRSERV, - "Loaded %d entries from keypin journal. " - "Found %d corrupt lines, %d duplicates, and %d conflicts.", - n_entries, n_corrupt_lines, n_duplicates, n_conflicts); - - return 0; -} - -/** - * Load a journal from the file called fname. Return 0 on success, - * -1 on failure. - */ -int -keypin_load_journal(const char *fname) -{ - tor_mmap_t *map = tor_mmap_file(fname); - if (!map) { - if (errno == ENOENT) - return 0; - else - return -1; - } - int r = keypin_load_journal_impl(map->data, map->size); - tor_munmap_file(map); - return r; -} - -/** Parse a single keypinning journal line entry from cp. The input - * does not need to be NUL-terminated, but it does need to have - * KEYPIN_JOURNAL_LINE_LEN -1 bytes available to read. Return a new entry - * on success, and NULL on failure. - */ -STATIC keypin_ent_t * -keypin_parse_journal_line(const char *cp) -{ - /* XXXX assumes !USE_OPENSSL_BASE64 */ - keypin_ent_t *ent = tor_malloc_zero(sizeof(keypin_ent_t)); - - if (base64_decode((char*)ent->rsa_id, sizeof(ent->rsa_id), - cp, BASE64_DIGEST_LEN) != DIGEST_LEN || - cp[BASE64_DIGEST_LEN] != ' ' || - base64_decode((char*)ent->ed25519_key, sizeof(ent->ed25519_key), - cp+BASE64_DIGEST_LEN+1, BASE64_DIGEST256_LEN) != DIGEST256_LEN) { - tor_free(ent); - return NULL; - } else { - return ent; - } -} - -/** Remove all entries from the keypinning table.*/ -void -keypin_clear(void) -{ - int bad_entries = 0; - { - keypin_ent_t **ent, **next, *this; - for (ent = HT_START(rsamap, &the_rsa_map); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(rsamap, &the_rsa_map, ent); - - keypin_ent_t *other_ent = HT_REMOVE(edmap, &the_ed_map, this); - bad_entries += (other_ent != this); - - tor_free(this); - } - } - bad_entries += HT_SIZE(&the_ed_map); - - HT_CLEAR(edmap,&the_ed_map); - HT_CLEAR(rsamap,&the_rsa_map); - - if (bad_entries) { - log_warn(LD_BUG, "Found %d discrepencies in the keypin database.", - bad_entries); - } -} - diff --git a/src/tor/src/or/keypin.h b/src/tor/src/or/keypin.h deleted file mode 100644 index fbb77e5c3..000000000 --- a/src/tor/src/or/keypin.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_KEYPIN_H -#define TOR_KEYPIN_H - -#include "testsupport.h" - -int keypin_check_and_add(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key, - const int replace_existing_entry); -int keypin_check(const uint8_t *rsa_id_digest, - const uint8_t *ed25519_id_key); - -int keypin_open_journal(const char *fname); -int keypin_close_journal(void); -int keypin_load_journal(const char *fname); -void keypin_clear(void); -int keypin_check_lone_rsa(const uint8_t *rsa_id_digest); - -#define KEYPIN_FOUND 0 -#define KEYPIN_ADDED 1 -#define KEYPIN_MISMATCH -1 -#define KEYPIN_NOT_FOUND -2 - -#ifdef KEYPIN_PRIVATE - -/** - * In-memory representation of a key-pinning table entry. - */ -typedef struct keypin_ent_st { - HT_ENTRY(keypin_ent_st) rsamap_node; - HT_ENTRY(keypin_ent_st) edmap_node; - /** SHA1 hash of the RSA key */ - uint8_t rsa_id[DIGEST_LEN]; - /** Ed2219 key. */ - uint8_t ed25519_key[DIGEST256_LEN]; -} keypin_ent_t; - -STATIC keypin_ent_t * keypin_parse_journal_line(const char *cp); -STATIC int keypin_load_journal_impl(const char *data, size_t size); - -MOCK_DECL(STATIC void, keypin_add_entry_to_map, (keypin_ent_t *ent)); -#endif /* defined(KEYPIN_PRIVATE) */ - -#endif /* !defined(TOR_KEYPIN_H) */ - diff --git a/src/tor/src/or/main.c b/src/tor/src/or/main.c deleted file mode 100644 index e449b95b9..000000000 --- a/src/tor/src/or/main.c +++ /dev/null @@ -1,4049 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file main.c - * \brief Toplevel module. Handles signals, multiplexes between - * connections, implements main loop, and drives scheduled events. - * - * For the main loop itself; see run_main_loop_once(). It invokes the rest of - * Tor mostly through Libevent callbacks. Libevent callbacks can happen when - * a timer elapses, a signal is received, a socket is ready to read or write, - * or an event is manually activated. - * - * Most events in Tor are driven from these callbacks: - *
        - *
      • conn_read_callback() and conn_write_callback() here, which are - * invoked when a socket is ready to read or write respectively. - *
      • signal_callback(), which handles incoming signals. - *
      - * Other events are used for specific purposes, or for building more complex - * control structures. If you search for usage of tor_libevent_new(), you - * will find all the events that we construct in Tor. - * - * Tor has numerous housekeeping operations that need to happen - * regularly. They are handled in different ways: - *
        - *
      • The most frequent operations are handled after every read or write - * event, at the end of connection_handle_read() and - * connection_handle_write(). - * - *
      • The next most frequent operations happen after each invocation of the - * main loop, in run_main_loop_once(). - * - *
      • Once per second, we run all of the operations listed in - * second_elapsed_callback(), and in its child, run_scheduled_events(). - * - *
      • Once-a-second operations are handled in second_elapsed_callback(). - * - *
      • More infrequent operations take place based on the periodic event - * driver in periodic.c . These are stored in the periodic_events[] - * table. - *
      - * - **/ - -#define MAIN_PRIVATE -#include "or.h" -#include "addressmap.h" -#include "backtrace.h" -#include "bridges.h" -#include "buffers.h" -#include "buffers_tls.h" -#include "channel.h" -#include "channeltls.h" -#include "channelpadding.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "command.h" -#include "compress.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "consdiffmgr.h" -#include "control.h" -#include "cpuworker.h" -#include "crypto_s2k.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "dns.h" -#include "dnsserv.h" -#include "entrynodes.h" -#include "geoip.h" -#include "hibernate.h" -#include "hs_cache.h" -#include "hs_circuitmap.h" -#include "hs_client.h" -#include "keypin.h" -#include "main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "ntmain.h" -#include "onion.h" -#include "periodic.h" -#include "policies.h" -#include "protover.h" -#include "transports.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerkeys.h" -#include "routerlist.h" -#include "routerparse.h" -#include "scheduler.h" -#include "shared_random.h" -#include "statefile.h" -#include "status.h" -#include "tor_api.h" -#include "tor_api_internal.h" -#include "util_process.h" -#include "ext_orport.h" -#ifdef USE_DMALLOC -#include -#endif -#include "memarea.h" -#include "sandbox.h" - -#include - -#ifdef HAVE_SYSTEMD -# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) -/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse - * Coverity. Here's a kludge to unconfuse it. - */ -# define __INCLUDE_LEVEL__ 2 -#endif /* defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) */ -#include -#endif /* defined(HAVE_SYSTEMD) */ - -void evdns_shutdown(int); - -#ifdef HAVE_RUST -// helper function defined in Rust to output a log message indicating if tor is -// running with Rust enabled. See src/rust/tor_util -char *rust_welcome_string(void); -#endif - -/********* PROTOTYPES **********/ - -static void dumpmemusage(int severity); -static void dumpstats(int severity); /* log stats */ -static void conn_read_callback(evutil_socket_t fd, short event, void *_conn); -static void conn_write_callback(evutil_socket_t fd, short event, void *_conn); -static void second_elapsed_callback(periodic_timer_t *timer, void *args); -static int conn_close_if_marked(int i); -static void connection_start_reading_from_linked_conn(connection_t *conn); -static int connection_should_read_from_linked_conn(connection_t *conn); -static int run_main_loop_until_done(void); -static void process_signal(int sig); -static void shutdown_did_not_work_callback(evutil_socket_t fd, short event, - void *arg) ATTR_NORETURN; - -/********* START VARIABLES **********/ -int global_read_bucket; /**< Max number of bytes I can read this second. */ -int global_write_bucket; /**< Max number of bytes I can write this second. */ - -/** Max number of relayed (bandwidth class 1) bytes I can read this second. */ -int global_relayed_read_bucket; -/** Max number of relayed (bandwidth class 1) bytes I can write this second. */ -int global_relayed_write_bucket; -/** What was the read bucket before the last second_elapsed_callback() call? - * (used to determine how many bytes we've read). */ -static int stats_prev_global_read_bucket; -/** What was the write bucket before the last second_elapsed_callback() call? - * (used to determine how many bytes we've written). */ -static int stats_prev_global_write_bucket; - -/* DOCDOC stats_prev_n_read */ -static uint64_t stats_prev_n_read = 0; -/* DOCDOC stats_prev_n_written */ -static uint64_t stats_prev_n_written = 0; - -/* XXX we might want to keep stats about global_relayed_*_bucket too. Or not.*/ -/** How many bytes have we read since we started the process? */ -static uint64_t stats_n_bytes_read = 0; -/** How many bytes have we written since we started the process? */ -static uint64_t stats_n_bytes_written = 0; -/** What time did this process start up? */ -time_t time_of_process_start = 0; -/** How many seconds have we been running? */ -long stats_n_seconds_working = 0; -/** How many times have we returned from the main loop successfully? */ -static uint64_t stats_n_main_loop_successes = 0; -/** How many times have we received an error from the main loop? */ -static uint64_t stats_n_main_loop_errors = 0; -/** How many times have we returned from the main loop with no events. */ -static uint64_t stats_n_main_loop_idle = 0; - -/** How often will we honor SIGNEWNYM requests? */ -#define MAX_SIGNEWNYM_RATE 10 -/** When did we last process a SIGNEWNYM request? */ -static time_t time_of_last_signewnym = 0; -/** Is there a signewnym request we're currently waiting to handle? */ -static int signewnym_is_pending = 0; -/** How many times have we called newnym? */ -static unsigned newnym_epoch = 0; - -/** Smartlist of all open connections. */ -STATIC smartlist_t *connection_array = NULL; -/** List of connections that have been marked for close and need to be freed - * and removed from connection_array. */ -static smartlist_t *closeable_connection_lst = NULL; -/** List of linked connections that are currently reading data into their - * inbuf from their partner's outbuf. */ -static smartlist_t *active_linked_connection_lst = NULL; -/** Flag: Set to true iff we entered the current libevent main loop via - * loop_once. If so, there's no need to trigger a loopexit in order - * to handle linked connections. */ -static int called_loop_once = 0; -/** Flag: if true, it's time to shut down, so the main loop should exit as - * soon as possible. - */ -static int main_loop_should_exit = 0; -/** The return value that the main loop should yield when it exits, if - * main_loop_should_exit is true. - */ -static int main_loop_exit_value = 0; - -/** We set this to 1 when we've opened a circuit, so we can print a log - * entry to inform the user that Tor is working. We set it to 0 when - * we think the fact that we once opened a circuit doesn't mean we can do so - * any longer (a big time jump happened, when we notice our directory is - * heinously out-of-date, etc. - */ -static int can_complete_circuits = 0; - -/** How often do we check for router descriptors that we should download - * when we have too little directory info? */ -#define GREEDY_DESCRIPTOR_RETRY_INTERVAL (10) -/** How often do we check for router descriptors that we should download - * when we have enough directory info? */ -#define LAZY_DESCRIPTOR_RETRY_INTERVAL (60) - -/** Decides our behavior when no logs are configured/before any - * logs have been configured. For 0, we log notice to stdout as normal. - * For 1, we log warnings only. For 2, we log nothing. - */ -int quiet_level = 0; - -/********* END VARIABLES ************/ - -/**************************************************************************** - * - * This section contains accessors and other methods on the connection_array - * variables (which are global within this file and unavailable outside it). - * - ****************************************************************************/ - -/** Return 1 if we have successfully built a circuit, and nothing has changed - * to make us think that maybe we can't. - */ -int -have_completed_a_circuit(void) -{ - return can_complete_circuits; -} - -/** Note that we have successfully built a circuit, so that reachability - * testing and introduction points and so on may be attempted. */ -void -note_that_we_completed_a_circuit(void) -{ - can_complete_circuits = 1; -} - -/** Note that something has happened (like a clock jump, or DisableNetwork) to - * make us think that maybe we can't complete circuits. */ -void -note_that_we_maybe_cant_complete_circuits(void) -{ - can_complete_circuits = 0; -} - -/** Add conn to the array of connections that we can poll on. The - * connection's socket must be set; the connection starts out - * non-reading and non-writing. - */ -int -connection_add_impl(connection_t *conn, int is_connecting) -{ - tor_assert(conn); - tor_assert(SOCKET_OK(conn->s) || - conn->linked || - (conn->type == CONN_TYPE_AP && - TO_EDGE_CONN(conn)->is_dns_request)); - - tor_assert(conn->conn_array_index == -1); /* can only connection_add once */ - conn->conn_array_index = smartlist_len(connection_array); - smartlist_add(connection_array, conn); - - (void) is_connecting; - - if (SOCKET_OK(conn->s) || conn->linked) { - conn->read_event = tor_event_new(tor_libevent_get_base(), - conn->s, EV_READ|EV_PERSIST, conn_read_callback, conn); - conn->write_event = tor_event_new(tor_libevent_get_base(), - conn->s, EV_WRITE|EV_PERSIST, conn_write_callback, conn); - /* XXXX CHECK FOR NULL RETURN! */ - } - - log_debug(LD_NET,"new conn type %s, socket %d, address %s, n_conns %d.", - conn_type_to_string(conn->type), (int)conn->s, conn->address, - smartlist_len(connection_array)); - - return 0; -} - -/** Tell libevent that we don't care about conn any more. */ -void -connection_unregister_events(connection_t *conn) -{ - if (conn->read_event) { - if (event_del(conn->read_event)) - log_warn(LD_BUG, "Error removing read event for %d", (int)conn->s); - tor_free(conn->read_event); - } - if (conn->write_event) { - if (event_del(conn->write_event)) - log_warn(LD_BUG, "Error removing write event for %d", (int)conn->s); - tor_free(conn->write_event); - } - if (conn->type == CONN_TYPE_AP_DNS_LISTENER) { - dnsserv_close_listener(conn); - } -} - -/** Remove the connection from the global list, and remove the - * corresponding poll entry. Calling this function will shift the last - * connection (if any) into the position occupied by conn. - */ -int -connection_remove(connection_t *conn) -{ - int current_index; - connection_t *tmp; - - tor_assert(conn); - - log_debug(LD_NET,"removing socket %d (type %s), n_conns now %d", - (int)conn->s, conn_type_to_string(conn->type), - smartlist_len(connection_array)); - - if (conn->type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) { - log_info(LD_NET, "Closing SOCKS SocksSocket connection"); - } - - control_event_conn_bandwidth(conn); - - tor_assert(conn->conn_array_index >= 0); - current_index = conn->conn_array_index; - connection_unregister_events(conn); /* This is redundant, but cheap. */ - if (current_index == smartlist_len(connection_array)-1) { /* at the end */ - smartlist_del(connection_array, current_index); - return 0; - } - - /* replace this one with the one at the end */ - smartlist_del(connection_array, current_index); - tmp = smartlist_get(connection_array, current_index); - tmp->conn_array_index = current_index; - - return 0; -} - -/** If conn is an edge conn, remove it from the list - * of conn's on this circuit. If it's not on an edge, - * flush and send destroys for all circuits on this conn. - * - * Remove it from connection_array (if applicable) and - * from closeable_connection_list. - * - * Then free it. - */ -static void -connection_unlink(connection_t *conn) -{ - connection_about_to_close_connection(conn); - if (conn->conn_array_index >= 0) { - connection_remove(conn); - } - if (conn->linked_conn) { - conn->linked_conn->linked_conn = NULL; - if (! conn->linked_conn->marked_for_close && - conn->linked_conn->reading_from_linked_conn) - connection_start_reading(conn->linked_conn); - conn->linked_conn = NULL; - } - smartlist_remove(closeable_connection_lst, conn); - smartlist_remove(active_linked_connection_lst, conn); - if (conn->type == CONN_TYPE_EXIT) { - assert_connection_edge_not_dns_pending(TO_EDGE_CONN(conn)); - } - if (conn->type == CONN_TYPE_OR) { - if (!tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) - connection_or_clear_identity(TO_OR_CONN(conn)); - /* connection_unlink() can only get called if the connection - * was already on the closeable list, and it got there by - * connection_mark_for_close(), which was called from - * connection_or_close_normally() or - * connection_or_close_for_error(), so the channel should - * already be in CHANNEL_STATE_CLOSING, and then the - * connection_about_to_close_connection() goes to - * connection_or_about_to_close(), which calls channel_closed() - * to notify the channel_t layer, and closed the channel, so - * nothing more to do here to deal with the channel associated - * with an orconn. - */ - } - connection_free(conn); -} - -/** Initialize the global connection list, closeable connection list, - * and active connection list. */ -STATIC void -init_connection_lists(void) -{ - if (!connection_array) - connection_array = smartlist_new(); - if (!closeable_connection_lst) - closeable_connection_lst = smartlist_new(); - if (!active_linked_connection_lst) - active_linked_connection_lst = smartlist_new(); -} - -/** Schedule conn to be closed. **/ -void -add_connection_to_closeable_list(connection_t *conn) -{ - tor_assert(!smartlist_contains(closeable_connection_lst, conn)); - tor_assert(conn->marked_for_close); - assert_connection_ok(conn, time(NULL)); - smartlist_add(closeable_connection_lst, conn); -} - -/** Return 1 if conn is on the closeable list, else return 0. */ -int -connection_is_on_closeable_list(connection_t *conn) -{ - return smartlist_contains(closeable_connection_lst, conn); -} - -/** Return true iff conn is in the current poll array. */ -int -connection_in_array(connection_t *conn) -{ - return smartlist_contains(connection_array, conn); -} - -/** Set *array to an array of all connections. *array must not - * be modified. - */ -MOCK_IMPL(smartlist_t *, -get_connection_array, (void)) -{ - if (!connection_array) - connection_array = smartlist_new(); - return connection_array; -} - -/** Provides the traffic read and written over the life of the process. */ - -MOCK_IMPL(uint64_t, -get_bytes_read,(void)) -{ - return stats_n_bytes_read; -} - -/* DOCDOC get_bytes_written */ -MOCK_IMPL(uint64_t, -get_bytes_written,(void)) -{ - return stats_n_bytes_written; -} - -/** Set the event mask on conn to events. (The event - * mask is a bitmask whose bits are READ_EVENT and WRITE_EVENT) - */ -void -connection_watch_events(connection_t *conn, watchable_events_t events) -{ - if (events & READ_EVENT) - connection_start_reading(conn); - else - connection_stop_reading(conn); - - if (events & WRITE_EVENT) - connection_start_writing(conn); - else - connection_stop_writing(conn); -} - -/** Return true iff conn is listening for read events. */ -int -connection_is_reading(connection_t *conn) -{ - tor_assert(conn); - - return conn->reading_from_linked_conn || - (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); -} - -/** Reset our main loop counters. */ -void -reset_main_loop_counters(void) -{ - stats_n_main_loop_successes = 0; - stats_n_main_loop_errors = 0; - stats_n_main_loop_idle = 0; -} - -/** Increment the main loop success counter. */ -static void -increment_main_loop_success_count(void) -{ - ++stats_n_main_loop_successes; -} - -/** Get the main loop success counter. */ -uint64_t -get_main_loop_success_count(void) -{ - return stats_n_main_loop_successes; -} - -/** Increment the main loop error counter. */ -static void -increment_main_loop_error_count(void) -{ - ++stats_n_main_loop_errors; -} - -/** Get the main loop error counter. */ -uint64_t -get_main_loop_error_count(void) -{ - return stats_n_main_loop_errors; -} - -/** Increment the main loop idle counter. */ -static void -increment_main_loop_idle_count(void) -{ - ++stats_n_main_loop_idle; -} - -/** Get the main loop idle counter. */ -uint64_t -get_main_loop_idle_count(void) -{ - return stats_n_main_loop_idle; -} - -/** Check whether conn is correct in having (or not having) a - * read/write event (passed in ev). On success, return 0. On failure, - * log a warning and return -1. */ -static int -connection_check_event(connection_t *conn, struct event *ev) -{ - int bad; - - if (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request) { - /* DNS requests which we launch through the dnsserv.c module do not have - * any underlying socket or any underlying linked connection, so they - * shouldn't have any attached events either. - */ - bad = ev != NULL; - } else { - /* Everything else should have an underlying socket, or a linked - * connection (which is also tracked with a read_event/write_event pair). - */ - bad = ev == NULL; - } - - if (bad) { - log_warn(LD_BUG, "Event missing on connection %p [%s;%s]. " - "socket=%d. linked=%d. " - "is_dns_request=%d. Marked_for_close=%s:%d", - conn, - conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state), - (int)conn->s, (int)conn->linked, - (conn->type == CONN_TYPE_AP && - TO_EDGE_CONN(conn)->is_dns_request), - conn->marked_for_close_file ? conn->marked_for_close_file : "-", - conn->marked_for_close - ); - log_backtrace(LOG_WARN, LD_BUG, "Backtrace attached."); - return -1; - } - return 0; -} - -/** Tell the main loop to stop notifying conn of any read events. */ -MOCK_IMPL(void, -connection_stop_reading,(connection_t *conn)) -{ - tor_assert(conn); - - if (connection_check_event(conn, conn->read_event) < 0) { - return; - } - - if (conn->linked) { - conn->reading_from_linked_conn = 0; - connection_stop_reading_from_linked_conn(conn); - } else { - if (event_del(conn->read_event)) - log_warn(LD_NET, "Error from libevent setting read event state for %d " - "to unwatched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Tell the main loop to start notifying conn of any read events. */ -MOCK_IMPL(void, -connection_start_reading,(connection_t *conn)) -{ - tor_assert(conn); - - if (connection_check_event(conn, conn->read_event) < 0) { - return; - } - - if (conn->linked) { - conn->reading_from_linked_conn = 1; - if (connection_should_read_from_linked_conn(conn)) - connection_start_reading_from_linked_conn(conn); - } else { - if (event_add(conn->read_event, NULL)) - log_warn(LD_NET, "Error from libevent setting read event state for %d " - "to watched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Return true iff conn is listening for write events. */ -int -connection_is_writing(connection_t *conn) -{ - tor_assert(conn); - - return conn->writing_to_linked_conn || - (conn->write_event && event_pending(conn->write_event, EV_WRITE, NULL)); -} - -/** Tell the main loop to stop notifying conn of any write events. */ -MOCK_IMPL(void, -connection_stop_writing,(connection_t *conn)) -{ - tor_assert(conn); - - if (connection_check_event(conn, conn->write_event) < 0) { - return; - } - - if (conn->linked) { - conn->writing_to_linked_conn = 0; - if (conn->linked_conn) - connection_stop_reading_from_linked_conn(conn->linked_conn); - } else { - if (event_del(conn->write_event)) - log_warn(LD_NET, "Error from libevent setting write event state for %d " - "to unwatched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Tell the main loop to start notifying conn of any write events. */ -MOCK_IMPL(void, -connection_start_writing,(connection_t *conn)) -{ - tor_assert(conn); - - if (connection_check_event(conn, conn->write_event) < 0) { - return; - } - - if (conn->linked) { - conn->writing_to_linked_conn = 1; - if (conn->linked_conn && - connection_should_read_from_linked_conn(conn->linked_conn)) - connection_start_reading_from_linked_conn(conn->linked_conn); - } else { - if (event_add(conn->write_event, NULL)) - log_warn(LD_NET, "Error from libevent setting write event state for %d " - "to watched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Return true iff conn is linked conn, and reading from the conn - * linked to it would be good and feasible. (Reading is "feasible" if the - * other conn exists and has data in its outbuf, and is "good" if we have our - * reading_from_linked_conn flag set and the other conn has its - * writing_to_linked_conn flag set.)*/ -static int -connection_should_read_from_linked_conn(connection_t *conn) -{ - if (conn->linked && conn->reading_from_linked_conn) { - if (! conn->linked_conn || - (conn->linked_conn->writing_to_linked_conn && - buf_datalen(conn->linked_conn->outbuf))) - return 1; - } - return 0; -} - -/** If we called event_base_loop() and told it to never stop until it - * runs out of events, now we've changed our mind: tell it we want it to - * exit once the current round of callbacks is done, so that we can - * run external code, and then return to the main loop. */ -void -tell_event_loop_to_run_external_code(void) -{ - if (!called_loop_once) { - struct timeval tv = { 0, 0 }; - tor_event_base_loopexit(tor_libevent_get_base(), &tv); - called_loop_once = 1; /* hack to avoid adding more exit events */ - } -} - -/** Failsafe measure that should never actually be necessary: If - * tor_shutdown_event_loop_and_exit() somehow doesn't successfully exit the - * event loop, then this callback will kill Tor with an assertion failure - * seconds later - */ -static void -shutdown_did_not_work_callback(evutil_socket_t fd, short event, void *arg) -{ - // LCOV_EXCL_START - (void) fd; - (void) event; - (void) arg; - tor_assert_unreached(); - // LCOV_EXCL_STOP -} - -/** - * After finishing the current callback (if any), shut down the main loop, - * clean up the process, and exit with exitcode. - */ -void -tor_shutdown_event_loop_and_exit(int exitcode) -{ - if (main_loop_should_exit) - return; /* Ignore multiple calls to this function. */ - - main_loop_should_exit = 1; - main_loop_exit_value = exitcode; - - /* Die with an assertion failure in ten seconds, if for some reason we don't - * exit normally. */ - /* XXXX We should consider this code if it's never used. */ - struct timeval ten_seconds = { 10, 0 }; - event_base_once(tor_libevent_get_base(), -1, EV_TIMEOUT, - shutdown_did_not_work_callback, NULL, - &ten_seconds); - - /* Unlike loopexit, loopbreak prevents other callbacks from running. */ - tor_event_base_loopbreak(tor_libevent_get_base()); -} - -/** Return true iff tor_shutdown_event_loop_and_exit() has been called. */ -int -tor_event_loop_shutdown_is_pending(void) -{ - return main_loop_should_exit; -} - -/** Helper: Tell the main loop to begin reading bytes into conn from - * its linked connection, if it is not doing so already. Called by - * connection_start_reading and connection_start_writing as appropriate. */ -static void -connection_start_reading_from_linked_conn(connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->linked == 1); - - if (!conn->active_on_link) { - conn->active_on_link = 1; - smartlist_add(active_linked_connection_lst, conn); - /* make sure that the event_base_loop() function exits at - * the end of its run through the current connections, so we can - * activate read events for linked connections. */ - tell_event_loop_to_run_external_code(); - } else { - tor_assert(smartlist_contains(active_linked_connection_lst, conn)); - } -} - -/** Tell the main loop to stop reading bytes into conn from its linked - * connection, if is currently doing so. Called by connection_stop_reading, - * connection_stop_writing, and connection_read. */ -void -connection_stop_reading_from_linked_conn(connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->linked == 1); - - if (conn->active_on_link) { - conn->active_on_link = 0; - /* FFFF We could keep an index here so we can smartlist_del - * cleanly. On the other hand, this doesn't show up on profiles, - * so let's leave it alone for now. */ - smartlist_remove(active_linked_connection_lst, conn); - } else { - tor_assert(!smartlist_contains(active_linked_connection_lst, conn)); - } -} - -/** Close all connections that have been scheduled to get closed. */ -STATIC void -close_closeable_connections(void) -{ - int i; - for (i = 0; i < smartlist_len(closeable_connection_lst); ) { - connection_t *conn = smartlist_get(closeable_connection_lst, i); - if (conn->conn_array_index < 0) { - connection_unlink(conn); /* blow it away right now */ - } else { - if (!conn_close_if_marked(conn->conn_array_index)) - ++i; - } - } -} - -/** Count moribund connections for the OOS handler */ -MOCK_IMPL(int, -connection_count_moribund, (void)) -{ - int moribund = 0; - - /* - * Count things we'll try to kill when close_closeable_connections() - * runs next. - */ - SMARTLIST_FOREACH_BEGIN(closeable_connection_lst, connection_t *, conn) { - if (SOCKET_OK(conn->s) && connection_is_moribund(conn)) ++moribund; - } SMARTLIST_FOREACH_END(conn); - - return moribund; -} - -/** Libevent callback: this gets invoked when (connection_t*)conn has - * some data to read. */ -static void -conn_read_callback(evutil_socket_t fd, short event, void *_conn) -{ - connection_t *conn = _conn; - (void)fd; - (void)event; - - log_debug(LD_NET,"socket %d wants to read.",(int)conn->s); - - /* assert_connection_ok(conn, time(NULL)); */ - - if (connection_handle_read(conn) < 0) { - if (!conn->marked_for_close) { -#ifndef _WIN32 - log_warn(LD_BUG,"Unhandled error on read for %s connection " - "(fd %d); removing", - conn_type_to_string(conn->type), (int)conn->s); - tor_fragile_assert(); -#endif /* !defined(_WIN32) */ - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - connection_mark_for_close(conn); - } - } - assert_connection_ok(conn, time(NULL)); - - if (smartlist_len(closeable_connection_lst)) - close_closeable_connections(); -} - -/** Libevent callback: this gets invoked when (connection_t*)conn has - * some data to write. */ -static void -conn_write_callback(evutil_socket_t fd, short events, void *_conn) -{ - connection_t *conn = _conn; - (void)fd; - (void)events; - - LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "socket %d wants to write.", - (int)conn->s)); - - /* assert_connection_ok(conn, time(NULL)); */ - - if (connection_handle_write(conn, 0) < 0) { - if (!conn->marked_for_close) { - /* this connection is broken. remove it. */ - log_fn(LOG_WARN,LD_BUG, - "unhandled error on write for %s connection (fd %d); removing", - conn_type_to_string(conn->type), (int)conn->s); - tor_fragile_assert(); - if (CONN_IS_EDGE(conn)) { - /* otherwise we cry wolf about duplicate close */ - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - if (!edge_conn->end_reason) - edge_conn->end_reason = END_STREAM_REASON_INTERNAL; - edge_conn->edge_has_sent_end = 1; - } - connection_close_immediate(conn); /* So we don't try to flush. */ - connection_mark_for_close(conn); - } - } - assert_connection_ok(conn, time(NULL)); - - if (smartlist_len(closeable_connection_lst)) - close_closeable_connections(); -} - -/** If the connection at connection_array[i] is marked for close, then: - * - If it has data that it wants to flush, try to flush it. - * - If it _still_ has data to flush, and conn->hold_open_until_flushed is - * true, then leave the connection open and return. - * - Otherwise, remove the connection from connection_array and from - * all other lists, close it, and free it. - * Returns 1 if the connection was closed, 0 otherwise. - */ -static int -conn_close_if_marked(int i) -{ - connection_t *conn; - int retval; - time_t now; - - conn = smartlist_get(connection_array, i); - if (!conn->marked_for_close) - return 0; /* nothing to see here, move along */ - now = time(NULL); - assert_connection_ok(conn, now); - /* assert_all_pending_dns_resolves_ok(); */ - - log_debug(LD_NET,"Cleaning up connection (fd "TOR_SOCKET_T_FORMAT").", - conn->s); - - /* If the connection we are about to close was trying to connect to - a proxy server and failed, the client won't be able to use that - proxy. We should warn the user about this. */ - if (conn->proxy_state == PROXY_INFANT) - log_failed_proxy_connection(conn); - - if ((SOCKET_OK(conn->s) || conn->linked_conn) && - connection_wants_to_flush(conn)) { - /* s == -1 means it's an incomplete edge connection, or that the socket - * has already been closed as unflushable. */ - ssize_t sz = connection_bucket_write_limit(conn, now); - if (!conn->hold_open_until_flushed) - log_info(LD_NET, - "Conn (addr %s, fd %d, type %s, state %d) marked, but wants " - "to flush %d bytes. (Marked at %s:%d)", - escaped_safe_str_client(conn->address), - (int)conn->s, conn_type_to_string(conn->type), conn->state, - (int)conn->outbuf_flushlen, - conn->marked_for_close_file, conn->marked_for_close); - if (conn->linked_conn) { - retval = buf_move_to_buf(conn->linked_conn->inbuf, conn->outbuf, - &conn->outbuf_flushlen); - if (retval >= 0) { - /* The linked conn will notice that it has data when it notices that - * we're gone. */ - connection_start_reading_from_linked_conn(conn->linked_conn); - } - log_debug(LD_GENERAL, "Flushed last %d bytes from a linked conn; " - "%d left; flushlen %d; wants-to-flush==%d", retval, - (int)connection_get_outbuf_len(conn), - (int)conn->outbuf_flushlen, - connection_wants_to_flush(conn)); - } else if (connection_speaks_cells(conn)) { - if (conn->state == OR_CONN_STATE_OPEN) { - retval = buf_flush_to_tls(conn->outbuf, TO_OR_CONN(conn)->tls, sz, - &conn->outbuf_flushlen); - } else - retval = -1; /* never flush non-open broken tls connections */ - } else { - retval = buf_flush_to_socket(conn->outbuf, conn->s, sz, - &conn->outbuf_flushlen); - } - if (retval >= 0 && /* Technically, we could survive things like - TLS_WANT_WRITE here. But don't bother for now. */ - conn->hold_open_until_flushed && connection_wants_to_flush(conn)) { - if (retval > 0) { - LOG_FN_CONN(conn, (LOG_INFO,LD_NET, - "Holding conn (fd %d) open for more flushing.", - (int)conn->s)); - conn->timestamp_lastwritten = now; /* reset so we can flush more */ - } else if (sz == 0) { - /* Also, retval==0. If we get here, we didn't want to write anything - * (because of rate-limiting) and we didn't. */ - - /* Connection must flush before closing, but it's being rate-limited. - * Let's remove from Libevent, and mark it as blocked on bandwidth - * so it will be re-added on next token bucket refill. Prevents - * busy Libevent loops where we keep ending up here and returning - * 0 until we are no longer blocked on bandwidth. - */ - if (connection_is_writing(conn)) { - conn->write_blocked_on_bw = 1; - connection_stop_writing(conn); - } - if (connection_is_reading(conn)) { - /* XXXX+ We should make this code unreachable; if a connection is - * marked for close and flushing, there is no point in reading to it - * at all. Further, checking at this point is a bit of a hack: it - * would make much more sense to react in - * connection_handle_read_impl, or to just stop reading in - * mark_and_flush */ - conn->read_blocked_on_bw = 1; - connection_stop_reading(conn); - } - } - return 0; - } - if (connection_wants_to_flush(conn)) { - log_fn(LOG_INFO, LD_NET, "We stalled too much while trying to write %d " - "bytes to address %s. If this happens a lot, either " - "something is wrong with your network connection, or " - "something is wrong with theirs. " - "(fd %d, type %s, state %d, marked at %s:%d).", - (int)connection_get_outbuf_len(conn), - escaped_safe_str_client(conn->address), - (int)conn->s, conn_type_to_string(conn->type), conn->state, - conn->marked_for_close_file, - conn->marked_for_close); - } - } - - connection_unlink(conn); /* unlink, remove, free */ - return 1; -} - -/** Implementation for directory_all_unreachable. This is done in a callback, - * since otherwise it would complicate Tor's control-flow graph beyond all - * reason. - */ -static void -directory_all_unreachable_cb(evutil_socket_t fd, short event, void *arg) -{ - (void)fd; - (void)event; - (void)arg; - - connection_t *conn; - - while ((conn = connection_get_by_type_state(CONN_TYPE_AP, - AP_CONN_STATE_CIRCUIT_WAIT))) { - entry_connection_t *entry_conn = TO_ENTRY_CONN(conn); - log_notice(LD_NET, - "Is your network connection down? " - "Failing connection to '%s:%d'.", - safe_str_client(entry_conn->socks_request->address), - entry_conn->socks_request->port); - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_NET_UNREACHABLE); - } - control_event_general_error("DIR_ALL_UNREACHABLE"); -} - -static struct event *directory_all_unreachable_cb_event = NULL; - -/** We've just tried every dirserver we know about, and none of - * them were reachable. Assume the network is down. Change state - * so next time an application connection arrives we'll delay it - * and try another directory fetch. Kill off all the circuit_wait - * streams that are waiting now, since they will all timeout anyway. - */ -void -directory_all_unreachable(time_t now) -{ - (void)now; - - stats_n_seconds_working=0; /* reset it */ - - if (!directory_all_unreachable_cb_event) { - directory_all_unreachable_cb_event = - tor_event_new(tor_libevent_get_base(), - -1, EV_READ, directory_all_unreachable_cb, NULL); - tor_assert(directory_all_unreachable_cb_event); - } - - event_active(directory_all_unreachable_cb_event, EV_READ, 1); -} - -/** This function is called whenever we successfully pull down some new - * network statuses or server descriptors. */ -void -directory_info_has_arrived(time_t now, int from_cache, int suppress_logs) -{ - const or_options_t *options = get_options(); - - /* if we have enough dir info, then update our guard status with - * whatever we just learned. */ - int invalidate_circs = guards_update_all(); - - if (invalidate_circs) { - circuit_mark_all_unused_circs(); - circuit_mark_all_dirty_circs_as_unusable(); - } - - if (!router_have_minimum_dir_info()) { - int quiet = suppress_logs || from_cache || - directory_too_idle_to_fetch_descriptors(options, now); - tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, - "I learned some more directory information, but not enough to " - "build a circuit: %s", get_dir_info_status_string()); - update_all_descriptor_downloads(now); - return; - } else { - if (directory_fetches_from_authorities(options)) { - update_all_descriptor_downloads(now); - } - - /* Don't even bother trying to get extrainfo until the rest of our - * directory info is up-to-date */ - if (options->DownloadExtraInfo) - update_extrainfo_downloads(now); - } - - if (server_mode(options) && !net_is_disabled() && !from_cache && - (have_completed_a_circuit() || !any_predicted_circuits(now))) - consider_testing_reachability(1, 1); -} - -/** Perform regular maintenance tasks for a single connection. This - * function gets run once per second per connection by run_scheduled_events. - */ -static void -run_connection_housekeeping(int i, time_t now) -{ - cell_t cell; - connection_t *conn = smartlist_get(connection_array, i); - const or_options_t *options = get_options(); - or_connection_t *or_conn; - channel_t *chan = NULL; - int have_any_circuits; - int past_keepalive = - now >= conn->timestamp_lastwritten + options->KeepalivePeriod; - - if (conn->outbuf && !connection_get_outbuf_len(conn) && - conn->type == CONN_TYPE_OR) - TO_OR_CONN(conn)->timestamp_lastempty = now; - - if (conn->marked_for_close) { - /* nothing to do here */ - return; - } - - /* Expire any directory connections that haven't been active (sent - * if a server or received if a client) for 5 min */ - if (conn->type == CONN_TYPE_DIR && - ((DIR_CONN_IS_SERVER(conn) && - conn->timestamp_lastwritten - + options->TestingDirConnectionMaxStall < now) || - (!DIR_CONN_IS_SERVER(conn) && - conn->timestamp_lastread - + options->TestingDirConnectionMaxStall < now))) { - log_info(LD_DIR,"Expiring wedged directory conn (fd %d, purpose %d)", - (int)conn->s, conn->purpose); - /* This check is temporary; it's to let us know whether we should consider - * parsing partial serverdesc responses. */ - if (conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && - connection_get_inbuf_len(conn) >= 1024) { - log_info(LD_DIR,"Trying to extract information from wedged server desc " - "download."); - connection_dir_reached_eof(TO_DIR_CONN(conn)); - } else { - connection_mark_for_close(conn); - } - return; - } - - if (!connection_speaks_cells(conn)) - return; /* we're all done here, the rest is just for OR conns */ - - /* If we haven't written to an OR connection for a while, then either nuke - the connection or send a keepalive, depending. */ - - or_conn = TO_OR_CONN(conn); - tor_assert(conn->outbuf); - - chan = TLS_CHAN_TO_BASE(or_conn->chan); - tor_assert(chan); - - if (channel_num_circuits(chan) != 0) { - have_any_circuits = 1; - chan->timestamp_last_had_circuits = now; - } else { - have_any_circuits = 0; - } - - if (channel_is_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan)) && - ! have_any_circuits) { - /* It's bad for new circuits, and has no unmarked circuits on it: - * mark it now. */ - log_info(LD_OR, - "Expiring non-used OR connection to fd %d (%s:%d) [Too old].", - (int)conn->s, conn->address, conn->port); - if (conn->state == OR_CONN_STATE_CONNECTING) - connection_or_connect_failed(TO_OR_CONN(conn), - END_OR_CONN_REASON_TIMEOUT, - "Tor gave up on the connection"); - connection_or_close_normally(TO_OR_CONN(conn), 1); - } else if (!connection_state_is_open(conn)) { - if (past_keepalive) { - /* We never managed to actually get this connection open and happy. */ - log_info(LD_OR,"Expiring non-open OR connection to fd %d (%s:%d).", - (int)conn->s,conn->address, conn->port); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } - } else if (we_are_hibernating() && - ! have_any_circuits && - !connection_get_outbuf_len(conn)) { - /* We're hibernating, there's no circuits, and nothing to flush.*/ - log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " - "[Hibernating or exiting].", - (int)conn->s,conn->address, conn->port); - connection_or_close_normally(TO_OR_CONN(conn), 1); - } else if (!have_any_circuits && - now - or_conn->idle_timeout >= - chan->timestamp_last_had_circuits) { - log_info(LD_OR,"Expiring non-used OR connection "U64_FORMAT" to fd %d " - "(%s:%d) [no circuits for %d; timeout %d; %scanonical].", - U64_PRINTF_ARG(chan->global_identifier), - (int)conn->s, conn->address, conn->port, - (int)(now - chan->timestamp_last_had_circuits), - or_conn->idle_timeout, - or_conn->is_canonical ? "" : "non"); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } else if ( - now >= or_conn->timestamp_lastempty + options->KeepalivePeriod*10 && - now >= conn->timestamp_lastwritten + options->KeepalivePeriod*10) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, - "Expiring stuck OR connection to fd %d (%s:%d). (%d bytes to " - "flush; %d seconds since last write)", - (int)conn->s, conn->address, conn->port, - (int)connection_get_outbuf_len(conn), - (int)(now-conn->timestamp_lastwritten)); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } else if (past_keepalive && !connection_get_outbuf_len(conn)) { - /* send a padding cell */ - log_fn(LOG_DEBUG,LD_OR,"Sending keepalive to (%s:%d)", - conn->address, conn->port); - memset(&cell,0,sizeof(cell_t)); - cell.command = CELL_PADDING; - connection_or_write_cell_to_buf(&cell, or_conn); - } else { - channelpadding_decide_to_pad_channel(chan); - } -} - -/** Honor a NEWNYM request: make future requests unlinkable to past - * requests. */ -static void -signewnym_impl(time_t now) -{ - const or_options_t *options = get_options(); - if (!proxy_mode(options)) { - log_info(LD_CONTROL, "Ignoring SIGNAL NEWNYM because client functionality " - "is disabled."); - return; - } - - circuit_mark_all_dirty_circs_as_unusable(); - addressmap_clear_transient(); - hs_client_purge_state(); - time_of_last_signewnym = now; - signewnym_is_pending = 0; - - ++newnym_epoch; - - control_event_signal(SIGNEWNYM); -} - -/** Return the number of times that signewnym has been called. */ -unsigned -get_signewnym_epoch(void) -{ - return newnym_epoch; -} - -/** True iff we have initialized all the members of periodic_events. - * Used to prevent double-initialization. */ -static int periodic_events_initialized = 0; - -/* Declare all the timer callback functions... */ -#undef CALLBACK -#define CALLBACK(name) \ - static int name ## _callback(time_t, const or_options_t *) -CALLBACK(rotate_onion_key); -CALLBACK(check_onion_keys_expiry_time); -CALLBACK(check_ed_keys); -CALLBACK(launch_descriptor_fetches); -CALLBACK(rotate_x509_certificate); -CALLBACK(add_entropy); -CALLBACK(launch_reachability_tests); -CALLBACK(downrate_stability); -CALLBACK(save_stability); -CALLBACK(check_authority_cert); -CALLBACK(check_expired_networkstatus); -CALLBACK(write_stats_file); -CALLBACK(record_bridge_stats); -CALLBACK(clean_caches); -CALLBACK(rend_cache_failure_clean); -CALLBACK(retry_dns); -CALLBACK(check_descriptor); -CALLBACK(check_for_reachability_bw); -CALLBACK(fetch_networkstatus); -CALLBACK(retry_listeners); -CALLBACK(expire_old_ciruits_serverside); -CALLBACK(check_dns_honesty); -CALLBACK(write_bridge_ns); -CALLBACK(check_fw_helper_app); -CALLBACK(heartbeat); -CALLBACK(clean_consdiffmgr); -CALLBACK(reset_padding_counts); -CALLBACK(check_canonical_channels); -CALLBACK(hs_service); - -#undef CALLBACK - -/* Now we declare an array of periodic_event_item_t for each periodic event */ -#define CALLBACK(name) PERIODIC_EVENT(name) - -static periodic_event_item_t periodic_events[] = { - CALLBACK(rotate_onion_key), - CALLBACK(check_onion_keys_expiry_time), - CALLBACK(check_ed_keys), - CALLBACK(launch_descriptor_fetches), - CALLBACK(rotate_x509_certificate), - CALLBACK(add_entropy), - CALLBACK(launch_reachability_tests), - CALLBACK(downrate_stability), - CALLBACK(save_stability), - CALLBACK(check_authority_cert), - CALLBACK(check_expired_networkstatus), - CALLBACK(write_stats_file), - CALLBACK(record_bridge_stats), - CALLBACK(clean_caches), - CALLBACK(rend_cache_failure_clean), - CALLBACK(retry_dns), - CALLBACK(check_descriptor), - CALLBACK(check_for_reachability_bw), - CALLBACK(fetch_networkstatus), - CALLBACK(retry_listeners), - CALLBACK(expire_old_ciruits_serverside), - CALLBACK(check_dns_honesty), - CALLBACK(write_bridge_ns), - CALLBACK(check_fw_helper_app), - CALLBACK(heartbeat), - CALLBACK(clean_consdiffmgr), - CALLBACK(reset_padding_counts), - CALLBACK(check_canonical_channels), - CALLBACK(hs_service), - END_OF_PERIODIC_EVENTS -}; -#undef CALLBACK - -/* These are pointers to members of periodic_events[] that are used to - * implement particular callbacks. We keep them separate here so that we - * can access them by name. We also keep them inside periodic_events[] - * so that we can implement "reset all timers" in a reasonable way. */ -static periodic_event_item_t *check_descriptor_event=NULL; -static periodic_event_item_t *fetch_networkstatus_event=NULL; -static periodic_event_item_t *launch_descriptor_fetches_event=NULL; -static periodic_event_item_t *check_dns_honesty_event=NULL; - -/** Reset all the periodic events so we'll do all our actions again as if we - * just started up. - * Useful if our clock just moved back a long time from the future, - * so we don't wait until that future arrives again before acting. - */ -void -reset_all_main_loop_timers(void) -{ - int i; - for (i = 0; periodic_events[i].name; ++i) { - periodic_event_reschedule(&periodic_events[i]); - } -} - -/** Return the member of periodic_events[] whose name is name. - * Return NULL if no such event is found. - */ -static periodic_event_item_t * -find_periodic_event(const char *name) -{ - int i; - for (i = 0; periodic_events[i].name; ++i) { - if (strcmp(name, periodic_events[i].name) == 0) - return &periodic_events[i]; - } - return NULL; -} - -/** Helper, run one second after setup: - * Initializes all members of periodic_events and starts them running. - * - * (We do this one second after setup for backward-compatibility reasons; - * it might not actually be necessary.) */ -static void -initialize_periodic_events_cb(evutil_socket_t fd, short events, void *data) -{ - (void) fd; - (void) events; - (void) data; - int i; - for (i = 0; periodic_events[i].name; ++i) { - periodic_event_launch(&periodic_events[i]); - } -} - -/** Set up all the members of periodic_events[], and configure them all to be - * launched from a callback. */ -STATIC void -initialize_periodic_events(void) -{ - tor_assert(periodic_events_initialized == 0); - periodic_events_initialized = 1; - - int i; - for (i = 0; periodic_events[i].name; ++i) { - periodic_event_setup(&periodic_events[i]); - } - -#define NAMED_CALLBACK(name) \ - STMT_BEGIN name ## _event = find_periodic_event( #name ); STMT_END - - NAMED_CALLBACK(check_descriptor); - NAMED_CALLBACK(fetch_networkstatus); - NAMED_CALLBACK(launch_descriptor_fetches); - NAMED_CALLBACK(check_dns_honesty); - - struct timeval one_second = { 1, 0 }; - event_base_once(tor_libevent_get_base(), -1, EV_TIMEOUT, - initialize_periodic_events_cb, NULL, - &one_second); -} - -STATIC void -teardown_periodic_events(void) -{ - int i; - for (i = 0; periodic_events[i].name; ++i) { - periodic_event_destroy(&periodic_events[i]); - } -} - -/** - * Update our schedule so that we'll check whether we need to update our - * descriptor immediately, rather than after up to CHECK_DESCRIPTOR_INTERVAL - * seconds. - */ -void -reschedule_descriptor_update_check(void) -{ - tor_assert(check_descriptor_event); - periodic_event_reschedule(check_descriptor_event); -} - -/** - * Update our schedule so that we'll check whether we need to fetch directory - * info immediately. - */ -void -reschedule_directory_downloads(void) -{ - tor_assert(fetch_networkstatus_event); - tor_assert(launch_descriptor_fetches_event); - - periodic_event_reschedule(fetch_networkstatus_event); - periodic_event_reschedule(launch_descriptor_fetches_event); -} - -#define LONGEST_TIMER_PERIOD (30 * 86400) -/** Helper: Return the number of seconds between now and next, - * clipped to the range [1 second, LONGEST_TIMER_PERIOD]. */ -static inline int -safe_timer_diff(time_t now, time_t next) -{ - if (next > now) { - /* There were no computers at signed TIME_MIN (1902 on 32-bit systems), - * and nothing that could run Tor. It's a bug if 'next' is around then. - * On 64-bit systems with signed TIME_MIN, TIME_MIN is before the Big - * Bang. We cannot extrapolate past a singularity, but there was probably - * nothing that could run Tor then, either. - **/ - tor_assert(next > TIME_MIN + LONGEST_TIMER_PERIOD); - - if (next - LONGEST_TIMER_PERIOD > now) - return LONGEST_TIMER_PERIOD; - return (int)(next - now); - } else { - return 1; - } -} - -/** Perform regular maintenance tasks. This function gets run once per - * second by second_elapsed_callback(). - */ -static void -run_scheduled_events(time_t now) -{ - const or_options_t *options = get_options(); - - /* 0. See if we've been asked to shut down and our timeout has - * expired; or if our bandwidth limits are exhausted and we - * should hibernate; or if it's time to wake up from hibernation. - */ - consider_hibernation(now); - - /* 0b. If we've deferred a signewnym, make sure it gets handled - * eventually. */ - if (signewnym_is_pending && - time_of_last_signewnym + MAX_SIGNEWNYM_RATE <= now) { - log_info(LD_CONTROL, "Honoring delayed NEWNYM request"); - signewnym_impl(now); - } - - /* 0c. If we've deferred log messages for the controller, handle them now */ - flush_pending_log_callbacks(); - - /* Maybe enough time elapsed for us to reconsider a circuit. */ - circuit_upgrade_circuits_from_guard_wait(); - - if (options->UseBridges && !net_is_disabled()) { - /* Note: this check uses net_is_disabled(), not should_delay_dir_fetches() - * -- the latter is only for fetching consensus-derived directory info. */ - fetch_bridge_descriptors(options, now); - } - - if (accounting_is_enabled(options)) { - accounting_run_housekeeping(now); - } - - if (authdir_mode_v3(options)) { - dirvote_act(options, now); - } - - /* 3a. Every second, we examine pending circuits and prune the - * ones which have been pending for more than a few seconds. - * We do this before step 4, so it can try building more if - * it's not comfortable with the number of available circuits. - */ - /* (If our circuit build timeout can ever become lower than a second (which - * it can't, currently), we should do this more often.) */ - circuit_expire_building(); - circuit_expire_waiting_for_better_guard(); - - /* 3b. Also look at pending streams and prune the ones that 'began' - * a long time ago but haven't gotten a 'connected' yet. - * Do this before step 4, so we can put them back into pending - * state to be picked up by the new circuit. - */ - connection_ap_expire_beginning(); - - /* 3c. And expire connections that we've held open for too long. - */ - connection_expire_held_open(); - - /* 4. Every second, we try a new circuit if there are no valid - * circuits. Every NewCircuitPeriod seconds, we expire circuits - * that became dirty more than MaxCircuitDirtiness seconds ago, - * and we make a new circ if there are no clean circuits. - */ - const int have_dir_info = router_have_minimum_dir_info(); - if (have_dir_info && !net_is_disabled()) { - circuit_build_needed_circs(now); - } else { - circuit_expire_old_circs_as_needed(now); - } - - if (!net_is_disabled()) { - /* This is usually redundant with circuit_build_needed_circs() above, - * but it is very fast when there is no work to do. */ - connection_ap_attach_pending(0); - } - - /* 5. We do housekeeping for each connection... */ - channel_update_bad_for_new_circs(NULL, 0); - int i; - for (i=0;i now) { - return ONION_KEY_CONSENSUS_CHECK_INTERVAL; - } - - log_info(LD_GENERAL,"Rotating onion key."); - rotate_onion_key(); - cpuworkers_rotate_keyinfo(); - if (router_rebuild_descriptor(1)<0) { - log_info(LD_CONFIG, "Couldn't rebuild router descriptor"); - } - if (advertised_server_mode() && !net_is_disabled()) - router_upload_dir_desc_to_dirservers(0); - return ONION_KEY_CONSENSUS_CHECK_INTERVAL; - } - return PERIODIC_EVENT_NO_UPDATE; -} - -/* Period callback: Check if our old onion keys are still valid after the - * period of time defined by the consensus parameter - * "onion-key-grace-period-days", otherwise expire them by setting them to - * NULL. - */ -static int -check_onion_keys_expiry_time_callback(time_t now, const or_options_t *options) -{ - if (server_mode(options)) { - int onion_key_grace_period = get_onion_key_grace_period(); - time_t expiry_time = get_onion_key_set_at()+onion_key_grace_period; - if (expiry_time > now) { - return ONION_KEY_CONSENSUS_CHECK_INTERVAL; - } - - log_info(LD_GENERAL, "Expiring old onion keys."); - expire_old_onion_keys(); - cpuworkers_rotate_keyinfo(); - return ONION_KEY_CONSENSUS_CHECK_INTERVAL; - } - - return PERIODIC_EVENT_NO_UPDATE; -} - -/* Periodic callback: Every 30 seconds, check whether it's time to make new - * Ed25519 subkeys. - */ -static int -check_ed_keys_callback(time_t now, const or_options_t *options) -{ - if (server_mode(options)) { - if (should_make_new_ed_keys(options, now)) { - int new_signing_key = load_ed_keys(options, now); - if (new_signing_key < 0 || - generate_ed_link_cert(options, now, new_signing_key > 0)) { - log_err(LD_OR, "Unable to update Ed25519 keys! Exiting."); - tor_shutdown_event_loop_and_exit(1); - } - } - return 30; - } - return PERIODIC_EVENT_NO_UPDATE; -} - -/** - * Periodic callback: Every {LAZY,GREEDY}_DESCRIPTOR_RETRY_INTERVAL, - * see about fetching descriptors, microdescriptors, and extrainfo - * documents. - */ -static int -launch_descriptor_fetches_callback(time_t now, const or_options_t *options) -{ - if (should_delay_dir_fetches(options, NULL)) - return PERIODIC_EVENT_NO_UPDATE; - - update_all_descriptor_downloads(now); - update_extrainfo_downloads(now); - if (router_have_minimum_dir_info()) - return LAZY_DESCRIPTOR_RETRY_INTERVAL; - else - return GREEDY_DESCRIPTOR_RETRY_INTERVAL; -} - -/** - * Periodic event: Rotate our X.509 certificates and TLS keys once every - * MAX_SSL_KEY_LIFETIME_INTERNAL. - */ -static int -rotate_x509_certificate_callback(time_t now, const or_options_t *options) -{ - static int first = 1; - (void)now; - (void)options; - if (first) { - first = 0; - return MAX_SSL_KEY_LIFETIME_INTERNAL; - } - - /* 1b. Every MAX_SSL_KEY_LIFETIME_INTERNAL seconds, we change our - * TLS context. */ - log_info(LD_GENERAL,"Rotating tls context."); - if (router_initialize_tls_context() < 0) { - log_err(LD_BUG, "Error reinitializing TLS context"); - tor_assert_unreached(); - } - if (generate_ed_link_cert(options, now, 1)) { - log_err(LD_OR, "Unable to update Ed25519->TLS link certificate for " - "new TLS context."); - tor_assert_unreached(); - } - - /* We also make sure to rotate the TLS connections themselves if they've - * been up for too long -- but that's done via is_bad_for_new_circs in - * run_connection_housekeeping() above. */ - return MAX_SSL_KEY_LIFETIME_INTERNAL; -} - -/** - * Periodic callback: once an hour, grab some more entropy from the - * kernel and feed it to our CSPRNG. - **/ -static int -add_entropy_callback(time_t now, const or_options_t *options) -{ - (void)now; - (void)options; - /* We already seeded once, so don't die on failure. */ - if (crypto_seed_rng() < 0) { - log_warn(LD_GENERAL, "Tried to re-seed RNG, but failed. We already " - "seeded once, though, so we won't exit here."); - } - - /** How often do we add more entropy to OpenSSL's RNG pool? */ -#define ENTROPY_INTERVAL (60*60) - return ENTROPY_INTERVAL; -} - -/** - * Periodic callback: if we're an authority, make sure we test - * the routers on the network for reachability. - */ -static int -launch_reachability_tests_callback(time_t now, const or_options_t *options) -{ - if (authdir_mode_tests_reachability(options) && - !net_is_disabled()) { - /* try to determine reachability of the other Tor relays */ - dirserv_test_reachability(now); - } - return REACHABILITY_TEST_INTERVAL; -} - -/** - * Periodic callback: if we're an authority, discount the stability - * information (and other rephist information) that's older. - */ -static int -downrate_stability_callback(time_t now, const or_options_t *options) -{ - (void)options; - /* 1d. Periodically, we discount older stability information so that new - * stability info counts more, and save the stability information to disk as - * appropriate. */ - time_t next = rep_hist_downrate_old_runs(now); - return safe_timer_diff(now, next); -} - -/** - * Periodic callback: if we're an authority, record our measured stability - * information from rephist in an mtbf file. - */ -static int -save_stability_callback(time_t now, const or_options_t *options) -{ - if (authdir_mode_tests_reachability(options)) { - if (rep_hist_record_mtbf_data(now, 1)<0) { - log_warn(LD_GENERAL, "Couldn't store mtbf data."); - } - } -#define SAVE_STABILITY_INTERVAL (30*60) - return SAVE_STABILITY_INTERVAL; -} - -/** - * Periodic callback: if we're an authority, check on our authority - * certificate (the one that authenticates our authority signing key). - */ -static int -check_authority_cert_callback(time_t now, const or_options_t *options) -{ - (void)now; - (void)options; - /* 1e. Periodically, if we're a v3 authority, we check whether our cert is - * close to expiring and warn the admin if it is. */ - v3_authority_check_key_expiry(); -#define CHECK_V3_CERTIFICATE_INTERVAL (5*60) - return CHECK_V3_CERTIFICATE_INTERVAL; -} - -/** - * Periodic callback: If our consensus is too old, recalculate whether - * we can actually use it. - */ -static int -check_expired_networkstatus_callback(time_t now, const or_options_t *options) -{ - (void)options; - /* Check whether our networkstatus has expired. */ - networkstatus_t *ns = networkstatus_get_latest_consensus(); - /*XXXX RD: This value needs to be the same as REASONABLY_LIVE_TIME in - * networkstatus_get_reasonably_live_consensus(), but that value is way - * way too high. Arma: is the bridge issue there resolved yet? -NM */ -#define NS_EXPIRY_SLOP (24*60*60) - if (ns && ns->valid_until < (now - NS_EXPIRY_SLOP) && - router_have_minimum_dir_info()) { - router_dir_info_changed(); - } -#define CHECK_EXPIRED_NS_INTERVAL (2*60) - return CHECK_EXPIRED_NS_INTERVAL; -} - -/** - * Periodic callback: Write statistics to disk if appropriate. - */ -static int -write_stats_file_callback(time_t now, const or_options_t *options) -{ - /* 1g. Check whether we should write statistics to disk. - */ -#define CHECK_WRITE_STATS_INTERVAL (60*60) - time_t next_time_to_write_stats_files = now + CHECK_WRITE_STATS_INTERVAL; - if (options->CellStatistics) { - time_t next_write = - rep_hist_buffer_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->DirReqStatistics) { - time_t next_write = geoip_dirreq_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->EntryStatistics) { - time_t next_write = geoip_entry_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->HiddenServiceStatistics) { - time_t next_write = rep_hist_hs_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->ExitPortStatistics) { - time_t next_write = rep_hist_exit_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->ConnDirectionStatistics) { - time_t next_write = rep_hist_conn_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->BridgeAuthoritativeDir) { - time_t next_write = rep_hist_desc_stats_write(now); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - - return safe_timer_diff(now, next_time_to_write_stats_files); -} - -#define CHANNEL_CHECK_INTERVAL (60*60) -static int -check_canonical_channels_callback(time_t now, const or_options_t *options) -{ - (void)now; - if (public_server_mode(options)) - channel_check_for_duplicates(); - - return CHANNEL_CHECK_INTERVAL; -} - -static int -reset_padding_counts_callback(time_t now, const or_options_t *options) -{ - if (options->PaddingStatistics) { - rep_hist_prep_published_padding_counts(now); - } - - rep_hist_reset_padding_counts(); - return REPHIST_CELL_PADDING_COUNTS_INTERVAL; -} - -/** - * Periodic callback: Write bridge statistics to disk if appropriate. - */ -static int -record_bridge_stats_callback(time_t now, const or_options_t *options) -{ - static int should_init_bridge_stats = 1; - - /* 1h. Check whether we should write bridge statistics to disk. - */ - if (should_record_bridge_info(options)) { - if (should_init_bridge_stats) { - /* (Re-)initialize bridge statistics. */ - geoip_bridge_stats_init(now); - should_init_bridge_stats = 0; - return WRITE_STATS_INTERVAL; - } else { - /* Possibly write bridge statistics to disk and ask when to write - * them next time. */ - time_t next = geoip_bridge_stats_write(now); - return safe_timer_diff(now, next); - } - } else if (!should_init_bridge_stats) { - /* Bridge mode was turned off. Ensure that stats are re-initialized - * next time bridge mode is turned on. */ - should_init_bridge_stats = 1; - } - return PERIODIC_EVENT_NO_UPDATE; -} - -/** - * Periodic callback: Clean in-memory caches every once in a while - */ -static int -clean_caches_callback(time_t now, const or_options_t *options) -{ - /* Remove old information from rephist and the rend cache. */ - rep_history_clean(now - options->RephistTrackTime); - rend_cache_clean(now, REND_CACHE_TYPE_SERVICE); - hs_cache_clean_as_client(now); - hs_cache_clean_as_dir(now); - microdesc_cache_rebuild(NULL, 0); -#define CLEAN_CACHES_INTERVAL (30*60) - return CLEAN_CACHES_INTERVAL; -} - -/** - * Periodic callback: Clean the cache of failed hidden service lookups - * frequently. - */ -static int -rend_cache_failure_clean_callback(time_t now, const or_options_t *options) -{ - (void)options; - /* We don't keep entries that are more than five minutes old so we try to - * clean it as soon as we can since we want to make sure the client waits - * as little as possible for reachability reasons. */ - rend_cache_failure_clean(now); - hs_cache_client_intro_state_clean(now); - return 30; -} - -/** - * Periodic callback: If we're a server and initializing dns failed, retry. - */ -static int -retry_dns_callback(time_t now, const or_options_t *options) -{ - (void)now; -#define RETRY_DNS_INTERVAL (10*60) - if (server_mode(options) && has_dns_init_failed()) - dns_init(); - return RETRY_DNS_INTERVAL; -} - -/** Periodic callback: consider rebuilding or and re-uploading our descriptor - * (if we've passed our internal checks). */ -static int -check_descriptor_callback(time_t now, const or_options_t *options) -{ -/** How often do we check whether part of our router info has changed in a - * way that would require an upload? That includes checking whether our IP - * address has changed. */ -#define CHECK_DESCRIPTOR_INTERVAL (60) - - (void)options; - - /* 2b. Once per minute, regenerate and upload the descriptor if the old - * one is inaccurate. */ - if (!net_is_disabled()) { - check_descriptor_bandwidth_changed(now); - check_descriptor_ipaddress_changed(now); - mark_my_descriptor_dirty_if_too_old(now); - consider_publishable_server(0); - /* If any networkstatus documents are no longer recent, we need to - * update all the descriptors' running status. */ - /* Remove dead routers. */ - /* XXXX This doesn't belong here, but it was here in the pre- - * XXXX refactoring code. */ - routerlist_remove_old_routers(); - } - - return CHECK_DESCRIPTOR_INTERVAL; -} - -/** - * Periodic callback: check whether we're reachable (as a relay), and - * whether our bandwidth has changed enough that we need to - * publish a new descriptor. - */ -static int -check_for_reachability_bw_callback(time_t now, const or_options_t *options) -{ - /* XXXX This whole thing was stuck in the middle of what is now - * XXXX check_descriptor_callback. I'm not sure it's right. */ - - static int dirport_reachability_count = 0; - /* also, check religiously for reachability, if it's within the first - * 20 minutes of our uptime. */ - if (server_mode(options) && - (have_completed_a_circuit() || !any_predicted_circuits(now)) && - !net_is_disabled()) { - if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { - consider_testing_reachability(1, dirport_reachability_count==0); - if (++dirport_reachability_count > 5) - dirport_reachability_count = 0; - return 1; - } else { - /* If we haven't checked for 12 hours and our bandwidth estimate is - * low, do another bandwidth test. This is especially important for - * bridges, since they might go long periods without much use. */ - const routerinfo_t *me = router_get_my_routerinfo(); - static int first_time = 1; - if (!first_time && me && - me->bandwidthcapacity < me->bandwidthrate && - me->bandwidthcapacity < 51200) { - reset_bandwidth_test(); - } - first_time = 0; -#define BANDWIDTH_RECHECK_INTERVAL (12*60*60) - return BANDWIDTH_RECHECK_INTERVAL; - } - } - return CHECK_DESCRIPTOR_INTERVAL; -} - -/** - * Periodic event: once a minute, (or every second if TestingTorNetwork, or - * during client bootstrap), check whether we want to download any - * networkstatus documents. */ -static int -fetch_networkstatus_callback(time_t now, const or_options_t *options) -{ - /* How often do we check whether we should download network status - * documents? */ - const int we_are_bootstrapping = networkstatus_consensus_is_bootstrapping( - now); - const int prefer_mirrors = !directory_fetches_from_authorities( - get_options()); - int networkstatus_dl_check_interval = 60; - /* check more often when testing, or when bootstrapping from mirrors - * (connection limits prevent too many connections being made) */ - if (options->TestingTorNetwork - || (we_are_bootstrapping && prefer_mirrors)) { - networkstatus_dl_check_interval = 1; - } - - if (should_delay_dir_fetches(options, NULL)) - return PERIODIC_EVENT_NO_UPDATE; - - update_networkstatus_downloads(now); - return networkstatus_dl_check_interval; -} - -/** - * Periodic callback: Every 60 seconds, we relaunch listeners if any died. */ -static int -retry_listeners_callback(time_t now, const or_options_t *options) -{ - (void)now; - (void)options; - if (!net_is_disabled()) { - retry_all_listeners(NULL, NULL, 0); - return 60; - } - return PERIODIC_EVENT_NO_UPDATE; -} - -/** - * Periodic callback: as a server, see if we have any old unused circuits - * that should be expired */ -static int -expire_old_ciruits_serverside_callback(time_t now, const or_options_t *options) -{ - (void)options; - /* every 11 seconds, so not usually the same second as other such events */ - circuit_expire_old_circuits_serverside(now); - return 11; -} - -/** - * Periodic event: if we're an exit, see if our DNS server is telling us - * obvious lies. - */ -static int -check_dns_honesty_callback(time_t now, const or_options_t *options) -{ - (void)now; - /* 9. and if we're an exit node, check whether our DNS is telling stories - * to us. */ - if (net_is_disabled() || - ! public_server_mode(options) || - router_my_exit_policy_is_reject_star()) - return PERIODIC_EVENT_NO_UPDATE; - - static int first_time = 1; - if (first_time) { - /* Don't launch right when we start */ - first_time = 0; - return crypto_rand_int_range(60, 180); - } - - dns_launch_correctness_checks(); - return 12*3600 + crypto_rand_int(12*3600); -} - -/** - * Periodic callback: if we're the bridge authority, write a networkstatus - * file to disk. - */ -static int -write_bridge_ns_callback(time_t now, const or_options_t *options) -{ - /* 10. write bridge networkstatus file to disk */ - if (options->BridgeAuthoritativeDir) { - networkstatus_dump_bridge_status_to_file(now); -#define BRIDGE_STATUSFILE_INTERVAL (30*60) - return BRIDGE_STATUSFILE_INTERVAL; - } - return PERIODIC_EVENT_NO_UPDATE; -} - -/** - * Periodic callback: poke the tor-fw-helper app if we're using one. - */ -static int -check_fw_helper_app_callback(time_t now, const or_options_t *options) -{ - if (net_is_disabled() || - ! server_mode(options) || - ! options->PortForwarding || - options->NoExec) { - return PERIODIC_EVENT_NO_UPDATE; - } - /* 11. check the port forwarding app */ - -#define PORT_FORWARDING_CHECK_INTERVAL 5 - smartlist_t *ports_to_forward = get_list_of_ports_to_forward(); - if (ports_to_forward) { - tor_check_port_forwarding(options->PortForwardingHelper, - ports_to_forward, - now); - - SMARTLIST_FOREACH(ports_to_forward, char *, cp, tor_free(cp)); - smartlist_free(ports_to_forward); - } - return PORT_FORWARDING_CHECK_INTERVAL; -} - -/** - * Periodic callback: write the heartbeat message in the logs. - * - * If writing the heartbeat message to the logs fails for some reason, retry - * again after MIN_HEARTBEAT_PERIOD seconds. - */ -static int -heartbeat_callback(time_t now, const or_options_t *options) -{ - static int first = 1; - - /* Check if heartbeat is disabled */ - if (!options->HeartbeatPeriod) { - return PERIODIC_EVENT_NO_UPDATE; - } - - /* Skip the first one. */ - if (first) { - first = 0; - return options->HeartbeatPeriod; - } - - /* Write the heartbeat message */ - if (log_heartbeat(now) == 0) { - return options->HeartbeatPeriod; - } else { - /* If we couldn't write the heartbeat log message, try again in the minimum - * interval of time. */ - return MIN_HEARTBEAT_PERIOD; - } -} - -#define CDM_CLEAN_CALLBACK_INTERVAL 600 -static int -clean_consdiffmgr_callback(time_t now, const or_options_t *options) -{ - (void)now; - if (server_mode(options)) { - consdiffmgr_cleanup(); - } - return CDM_CLEAN_CALLBACK_INTERVAL; -} - -/* - * Periodic callback: Run scheduled events for HS service. This is called - * every second. - */ -static int -hs_service_callback(time_t now, const or_options_t *options) -{ - (void) options; - - /* We need to at least be able to build circuits and that we actually have - * a working network. */ - if (!have_completed_a_circuit() || net_is_disabled() || - networkstatus_get_live_consensus(now) == NULL) { - goto end; - } - - hs_service_run_scheduled_events(now); - - end: - /* Every 1 second. */ - return 1; -} - -/** Timer: used to invoke second_elapsed_callback() once per second. */ -static periodic_timer_t *second_timer = NULL; -/** Number of libevent errors in the last second: we die if we get too many. */ -static int n_libevent_errors = 0; - -/** Libevent callback: invoked once every second. */ -static void -second_elapsed_callback(periodic_timer_t *timer, void *arg) -{ - /* XXXX This could be sensibly refactored into multiple callbacks, and we - * could use Libevent's timers for this rather than checking the current - * time against a bunch of timeouts every second. */ - static time_t current_second = 0; - time_t now; - size_t bytes_written; - size_t bytes_read; - int seconds_elapsed; - const or_options_t *options = get_options(); - (void)timer; - (void)arg; - - n_libevent_errors = 0; - - /* log_notice(LD_GENERAL, "Tick."); */ - now = time(NULL); - update_approx_time(now); - - /* the second has rolled over. check more stuff. */ - seconds_elapsed = current_second ? (int)(now - current_second) : 0; - bytes_read = (size_t)(stats_n_bytes_read - stats_prev_n_read); - bytes_written = (size_t)(stats_n_bytes_written - stats_prev_n_written); - stats_prev_n_read = stats_n_bytes_read; - stats_prev_n_written = stats_n_bytes_written; - - control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written); - control_event_stream_bandwidth_used(); - control_event_conn_bandwidth_used(); - control_event_circ_bandwidth_used(); - control_event_circuit_cell_stats(); - - if (server_mode(options) && - !net_is_disabled() && - seconds_elapsed > 0 && - have_completed_a_circuit() && - stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT != - (stats_n_seconds_working+seconds_elapsed) / - TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { - /* every 20 minutes, check and complain if necessary */ - const routerinfo_t *me = router_get_my_routerinfo(); - if (me && !check_whether_orport_reachable(options)) { - char *address = tor_dup_ip(me->addr); - log_warn(LD_CONFIG,"Your server (%s:%d) has not managed to confirm that " - "its ORPort is reachable. Relays do not publish descriptors " - "until their ORPort and DirPort are reachable. Please check " - "your firewalls, ports, address, /etc/hosts file, etc.", - address, me->or_port); - control_event_server_status(LOG_WARN, - "REACHABILITY_FAILED ORADDRESS=%s:%d", - address, me->or_port); - tor_free(address); - } - - if (me && !check_whether_dirport_reachable(options)) { - char *address = tor_dup_ip(me->addr); - log_warn(LD_CONFIG, - "Your server (%s:%d) has not managed to confirm that its " - "DirPort is reachable. Relays do not publish descriptors " - "until their ORPort and DirPort are reachable. Please check " - "your firewalls, ports, address, /etc/hosts file, etc.", - address, me->dir_port); - control_event_server_status(LOG_WARN, - "REACHABILITY_FAILED DIRADDRESS=%s:%d", - address, me->dir_port); - tor_free(address); - } - } - -/** If more than this many seconds have elapsed, probably the clock - * jumped: doesn't count. */ -#define NUM_JUMPED_SECONDS_BEFORE_WARN 100 - if (seconds_elapsed < -NUM_JUMPED_SECONDS_BEFORE_WARN || - seconds_elapsed >= NUM_JUMPED_SECONDS_BEFORE_WARN) { - circuit_note_clock_jumped(seconds_elapsed); - } else if (seconds_elapsed > 0) - stats_n_seconds_working += seconds_elapsed; - - run_scheduled_events(now); - - current_second = now; /* remember which second it is, for next time */ -} - -#ifdef HAVE_SYSTEMD_209 -static periodic_timer_t *systemd_watchdog_timer = NULL; - -/** Libevent callback: invoked to reset systemd watchdog. */ -static void -systemd_watchdog_callback(periodic_timer_t *timer, void *arg) -{ - (void)timer; - (void)arg; - sd_notify(0, "WATCHDOG=1"); -} -#endif /* defined(HAVE_SYSTEMD_209) */ - -/** Timer: used to invoke refill_callback(). */ -static periodic_timer_t *refill_timer = NULL; - -/** Libevent callback: invoked periodically to refill token buckets - * and count r/w bytes. */ -static void -refill_callback(periodic_timer_t *timer, void *arg) -{ - static struct timeval current_millisecond; - struct timeval now; - - size_t bytes_written; - size_t bytes_read; - int milliseconds_elapsed = 0; - int seconds_rolled_over = 0; - - const or_options_t *options = get_options(); - - (void)timer; - (void)arg; - - tor_gettimeofday(&now); - - /* If this is our first time, no time has passed. */ - if (current_millisecond.tv_sec) { - long mdiff = tv_mdiff(¤t_millisecond, &now); - if (mdiff > INT_MAX) - mdiff = INT_MAX; - milliseconds_elapsed = (int)mdiff; - seconds_rolled_over = (int)(now.tv_sec - current_millisecond.tv_sec); - } - - bytes_written = stats_prev_global_write_bucket - global_write_bucket; - bytes_read = stats_prev_global_read_bucket - global_read_bucket; - - stats_n_bytes_read += bytes_read; - stats_n_bytes_written += bytes_written; - if (accounting_is_enabled(options) && milliseconds_elapsed >= 0) - accounting_add_bytes(bytes_read, bytes_written, seconds_rolled_over); - - if (milliseconds_elapsed > 0) - connection_bucket_refill(milliseconds_elapsed, (time_t)now.tv_sec); - - stats_prev_global_read_bucket = global_read_bucket; - stats_prev_global_write_bucket = global_write_bucket; - - current_millisecond = now; /* remember what time it is, for next time */ -} - -#ifndef _WIN32 -/** Called when a possibly ignorable libevent error occurs; ensures that we - * don't get into an infinite loop by ignoring too many errors from - * libevent. */ -static int -got_libevent_error(void) -{ - if (++n_libevent_errors > 8) { - log_err(LD_NET, "Too many libevent errors in one second; dying"); - return -1; - } - return 0; -} -#endif /* !defined(_WIN32) */ - -#define UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST (6*60*60) - -/** Called when our IP address seems to have changed. at_interface - * should be true if we detected a change in our interface, and false if we - * detected a change in our published address. */ -void -ip_address_changed(int at_interface) -{ - const or_options_t *options = get_options(); - int server = server_mode(options); - int exit_reject_interfaces = (server && options->ExitRelay - && options->ExitPolicyRejectLocalInterfaces); - - if (at_interface) { - if (! server) { - /* Okay, change our keys. */ - if (init_keys_client() < 0) - log_warn(LD_GENERAL, "Unable to rotate keys after IP change!"); - } - } else { - if (server) { - if (stats_n_seconds_working > UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST) - reset_bandwidth_test(); - stats_n_seconds_working = 0; - router_reset_reachability(); - } - } - - /* Exit relays incorporate interface addresses in their exit policies when - * ExitPolicyRejectLocalInterfaces is set */ - if (exit_reject_interfaces || (server && !at_interface)) { - mark_my_descriptor_dirty("IP address changed"); - } - - dns_servers_relaunch_checks(); -} - -/** Forget what we've learned about the correctness of our DNS servers, and - * start learning again. */ -void -dns_servers_relaunch_checks(void) -{ - if (server_mode(get_options())) { - dns_reset_correctness_checks(); - if (periodic_events_initialized) { - tor_assert(check_dns_honesty_event); - periodic_event_reschedule(check_dns_honesty_event); - } - } -} - -/** Called when we get a SIGHUP: reload configuration files and keys, - * retry all connections, and so on. */ -static int -do_hup(void) -{ - const or_options_t *options = get_options(); - -#ifdef USE_DMALLOC - dmalloc_log_stats(); - dmalloc_log_changed(0, 1, 0, 0); -#endif - - log_notice(LD_GENERAL,"Received reload signal (hup). Reloading config and " - "resetting internal state."); - if (accounting_is_enabled(options)) - accounting_record_bandwidth_usage(time(NULL), get_or_state()); - - router_reset_warnings(); - routerlist_reset_warnings(); - /* first, reload config variables, in case they've changed */ - if (options->ReloadTorrcOnSIGHUP) { - /* no need to provide argc/v, they've been cached in init_from_config */ - int init_rv = options_init_from_torrc(0, NULL); - if (init_rv < 0) { - log_err(LD_CONFIG,"Reading config failed--see warnings above. " - "For usage, try -h."); - return -1; - } else if (BUG(init_rv > 0)) { - // LCOV_EXCL_START - /* This should be impossible: the only "return 1" cases in - * options_init_from_torrc are ones caused by command-line arguments; - * but they can't change while Tor is running. */ - return -1; - // LCOV_EXCL_STOP - } - options = get_options(); /* they have changed now */ - /* Logs are only truncated the first time they are opened, but were - probably intended to be cleaned up on signal. */ - if (options->TruncateLogFile) - truncate_logs(); - } else { - char *msg = NULL; - log_notice(LD_GENERAL, "Not reloading config file: the controller told " - "us not to."); - /* Make stuff get rescanned, reloaded, etc. */ - if (set_options((or_options_t*)options, &msg) < 0) { - if (!msg) - msg = tor_strdup("Unknown error"); - log_warn(LD_GENERAL, "Unable to re-set previous options: %s", msg); - tor_free(msg); - } - } - if (authdir_mode(options)) { - /* reload the approved-routers file */ - if (dirserv_load_fingerprint_file() < 0) { - /* warnings are logged from dirserv_load_fingerprint_file() directly */ - log_info(LD_GENERAL, "Error reloading fingerprints. " - "Continuing with old list."); - } - } - - /* Rotate away from the old dirty circuits. This has to be done - * after we've read the new options, but before we start using - * circuits for directory fetches. */ - circuit_mark_all_dirty_circs_as_unusable(); - - /* retry appropriate downloads */ - router_reset_status_download_failures(); - router_reset_descriptor_download_failures(); - if (!net_is_disabled()) - update_networkstatus_downloads(time(NULL)); - - /* We'll retry routerstatus downloads in about 10 seconds; no need to - * force a retry there. */ - - if (server_mode(options)) { - /* Maybe we've been given a new ed25519 key or certificate? - */ - time_t now = approx_time(); - int new_signing_key = load_ed_keys(options, now); - if (new_signing_key < 0 || - generate_ed_link_cert(options, now, new_signing_key > 0)) { - log_warn(LD_OR, "Problem reloading Ed25519 keys; still using old keys."); - } - - /* Update cpuworker and dnsworker processes, so they get up-to-date - * configuration options. */ - cpuworkers_rotate_keyinfo(); - dns_reset(); - } - return 0; -} - -/** Tor main loop. */ -int -do_main_loop(void) -{ - time_t now; - - /* initialize the periodic events first, so that code that depends on the - * events being present does not assert. - */ - if (! periodic_events_initialized) { - initialize_periodic_events(); - } - - /* initialize dns resolve map, spawn workers if needed */ - if (dns_init() < 0) { - if (get_options()->ServerDNSAllowBrokenConfig) - log_warn(LD_GENERAL, "Couldn't set up any working nameservers. " - "Network not up yet? Will try again soon."); - else { - log_err(LD_GENERAL,"Error initializing dns subsystem; exiting. To " - "retry instead, set the ServerDNSAllowBrokenResolvConf option."); - } - } - - handle_signals(1); - monotime_init(); - timers_initialize(); - - /* load the private keys, if we're supposed to have them, and set up the - * TLS context. */ - if (! client_identity_key_is_set()) { - if (init_keys() < 0) { - log_err(LD_OR, "Error initializing keys; exiting"); - return -1; - } - } - - /* Set up our buckets */ - connection_bucket_init(); - stats_prev_global_read_bucket = global_read_bucket; - stats_prev_global_write_bucket = global_write_bucket; - - /* initialize the bootstrap status events to know we're starting up */ - control_event_bootstrap(BOOTSTRAP_STATUS_STARTING, 0); - - /* Initialize the keypinning log. */ - if (authdir_mode_v3(get_options())) { - char *fname = get_datadir_fname("key-pinning-journal"); - int r = 0; - if (keypin_load_journal(fname)<0) { - log_err(LD_DIR, "Error loading key-pinning journal: %s",strerror(errno)); - r = -1; - } - if (keypin_open_journal(fname)<0) { - log_err(LD_DIR, "Error opening key-pinning journal: %s",strerror(errno)); - r = -1; - } - tor_free(fname); - if (r) - return r; - } - { - /* This is the old name for key-pinning-journal. These got corrupted - * in a couple of cases by #16530, so we started over. See #16580 for - * the rationale and for other options we didn't take. We can remove - * this code once all the authorities that ran 0.2.7.1-alpha-dev are - * upgraded. - */ - char *fname = get_datadir_fname("key-pinning-entries"); - unlink(fname); - tor_free(fname); - } - - if (trusted_dirs_reload_certs()) { - log_warn(LD_DIR, - "Couldn't load all cached v3 certificates. Starting anyway."); - } - if (router_reload_consensus_networkstatus()) { - return -1; - } - /* load the routers file, or assign the defaults. */ - if (router_reload_router_list()) { - return -1; - } - /* load the networkstatuses. (This launches a download for new routers as - * appropriate.) - */ - now = time(NULL); - directory_info_has_arrived(now, 1, 0); - - if (server_mode(get_options())) { - /* launch cpuworkers. Need to do this *after* we've read the onion key. */ - cpu_init(); - } - consdiffmgr_enable_background_compression(); - - /* Setup shared random protocol subsystem. */ - if (authdir_mode_v3(get_options())) { - if (sr_init(1) < 0) { - return -1; - } - } - - /* set up once-a-second callback. */ - if (! second_timer) { - struct timeval one_second; - one_second.tv_sec = 1; - one_second.tv_usec = 0; - - second_timer = periodic_timer_new(tor_libevent_get_base(), - &one_second, - second_elapsed_callback, - NULL); - tor_assert(second_timer); - } - -#ifdef HAVE_SYSTEMD_209 - uint64_t watchdog_delay; - /* set up systemd watchdog notification. */ - if (sd_watchdog_enabled(1, &watchdog_delay) > 0) { - if (! systemd_watchdog_timer) { - struct timeval watchdog; - /* The manager will "act on" us if we don't send them a notification - * every 'watchdog_delay' microseconds. So, send notifications twice - * that often. */ - watchdog_delay /= 2; - watchdog.tv_sec = watchdog_delay / 1000000; - watchdog.tv_usec = watchdog_delay % 1000000; - - systemd_watchdog_timer = periodic_timer_new(tor_libevent_get_base(), - &watchdog, - systemd_watchdog_callback, - NULL); - tor_assert(systemd_watchdog_timer); - } - } -#endif /* defined(HAVE_SYSTEMD_209) */ - - if (!refill_timer) { - struct timeval refill_interval; - int msecs = get_options()->TokenBucketRefillInterval; - - refill_interval.tv_sec = msecs/1000; - refill_interval.tv_usec = (msecs%1000)*1000; - - refill_timer = periodic_timer_new(tor_libevent_get_base(), - &refill_interval, - refill_callback, - NULL); - tor_assert(refill_timer); - } - -#ifdef HAVE_SYSTEMD - { - const int r = sd_notify(0, "READY=1"); - if (r < 0) { - log_warn(LD_GENERAL, "Unable to send readiness to systemd: %s", - strerror(r)); - } else if (r > 0) { - log_notice(LD_GENERAL, "Signaled readiness to systemd"); - } else { - log_info(LD_GENERAL, "Systemd NOTIFY_SOCKET not present."); - } - } -#endif /* defined(HAVE_SYSTEMD) */ - - main_loop_should_exit = 0; - main_loop_exit_value = 0; - - return run_main_loop_until_done(); -} - -/** - * Run the main loop a single time. Return 0 for "exit"; -1 for "exit with - * error", and 1 for "run this again." - */ -static int -run_main_loop_once(void) -{ - int loop_result; - - if (nt_service_is_stopping()) - return 0; - - if (main_loop_should_exit) - return 0; - - const or_options_t *options = get_options(); - -#ifndef _WIN32 - /* Make it easier to tell whether libevent failure is our fault or not. */ - errno = 0; -#endif - - /* All active linked conns should get their read events activated, - * so that libevent knows to run their callbacks. */ - SMARTLIST_FOREACH(active_linked_connection_lst, connection_t *, conn, - event_active(conn->read_event, EV_READ, 1)); - - if (options->MainloopStats) { - /* We always enforce that EVLOOP_ONCE is passed to event_base_loop() if we - * are collecting main loop statistics. */ - called_loop_once = 1; - } else { - called_loop_once = smartlist_len(active_linked_connection_lst) ? 1 : 0; - } - - /* Make sure we know (about) what time it is. */ - update_approx_time(time(NULL)); - - /* Here it is: the main loop. Here we tell Libevent to poll until we have - * an event, or the second ends, or until we have some active linked - * connections to trigger events for. Libevent will wait till one - * of these happens, then run all the appropriate callbacks. */ - loop_result = event_base_loop(tor_libevent_get_base(), - called_loop_once ? EVLOOP_ONCE : 0); - - if (options->MainloopStats) { - /* Update our main loop counters. */ - if (loop_result == 0) { - // The call was succesful. - increment_main_loop_success_count(); - } else if (loop_result == -1) { - // The call was erroneous. - increment_main_loop_error_count(); - } else if (loop_result == 1) { - // The call didn't have any active or pending events - // to handle. - increment_main_loop_idle_count(); - } - } - - /* Oh, the loop failed. That might be an error that we need to - * catch, but more likely, it's just an interrupted poll() call or something, - * and we should try again. */ - if (loop_result < 0) { - int e = tor_socket_errno(-1); - /* let the program survive things like ^z */ - if (e != EINTR && !ERRNO_IS_EINPROGRESS(e)) { - log_err(LD_NET,"libevent call with %s failed: %s [%d]", - tor_libevent_get_method(), tor_socket_strerror(e), e); - return -1; -#ifndef _WIN32 - } else if (e == EINVAL) { - log_warn(LD_NET, "EINVAL from libevent: should you upgrade libevent?"); - if (got_libevent_error()) - return -1; -#endif /* !defined(_WIN32) */ - } else { - tor_assert_nonfatal_once(! ERRNO_IS_EINPROGRESS(e)); - log_debug(LD_NET,"libevent call interrupted."); - /* You can't trust the results of this poll(). Go back to the - * top of the big for loop. */ - return 1; - } - } - - if (main_loop_should_exit) - return 0; - - /* And here is where we put callbacks that happen "every time the event loop - * runs." They must be very fast, or else the whole Tor process will get - * slowed down. - * - * Note that this gets called once per libevent loop, which will make it - * happen once per group of events that fire, or once per second. */ - - /* If there are any pending client connections, try attaching them to - * circuits (if we can.) This will be pretty fast if nothing new is - * pending. - */ - connection_ap_attach_pending(0); - - return 1; -} - -/** Run the run_main_loop_once() function until it declares itself done, - * and return its final return value. - * - * Shadow won't invoke this function, so don't fill it up with things. - */ -static int -run_main_loop_until_done(void) -{ - int loop_result = 1; - do { - loop_result = run_main_loop_once(); - } while (loop_result == 1); - - if (main_loop_should_exit) - return main_loop_exit_value; - else - return loop_result; -} - -/** Libevent callback: invoked when we get a signal. - */ -static void -signal_callback(evutil_socket_t fd, short events, void *arg) -{ - const int *sigptr = arg; - const int sig = *sigptr; - (void)fd; - (void)events; - - process_signal(sig); -} - -/** Do the work of acting on a signal received in sig */ -static void -process_signal(int sig) -{ - switch (sig) - { - case SIGTERM: - log_notice(LD_GENERAL,"Catching signal TERM, exiting cleanly."); - tor_shutdown_event_loop_and_exit(0); - break; - case SIGINT: - if (!server_mode(get_options())) { /* do it now */ - log_notice(LD_GENERAL,"Interrupt: exiting cleanly."); - tor_shutdown_event_loop_and_exit(0); - return; - } -#ifdef HAVE_SYSTEMD - sd_notify(0, "STOPPING=1"); -#endif - hibernate_begin_shutdown(); - break; -#ifdef SIGPIPE - case SIGPIPE: - log_debug(LD_GENERAL,"Caught SIGPIPE. Ignoring."); - break; -#endif - case SIGUSR1: - /* prefer to log it at INFO, but make sure we always see it */ - dumpstats(get_min_log_level() now) { - signewnym_is_pending = 1; - log_notice(LD_CONTROL, - "Rate limiting NEWNYM request: delaying by %d second(s)", - (int)(MAX_SIGNEWNYM_RATE+time_of_last_signewnym-now)); - } else { - signewnym_impl(now); - } - break; - } - case SIGCLEARDNSCACHE: - addressmap_clear_transient(); - control_event_signal(sig); - break; - case SIGHEARTBEAT: - log_heartbeat(time(NULL)); - control_event_signal(sig); - break; - } -} - -/** Returns Tor's uptime. */ -MOCK_IMPL(long, -get_uptime,(void)) -{ - return stats_n_seconds_working; -} - -/** - * Write current memory usage information to the log. - */ -static void -dumpmemusage(int severity) -{ - connection_dump_buffer_mem_stats(severity); - tor_log(severity, LD_GENERAL, "In rephist: "U64_FORMAT" used by %d Tors.", - U64_PRINTF_ARG(rephist_total_alloc), rephist_total_num); - dump_routerlist_mem_usage(severity); - dump_cell_pool_usage(severity); - dump_dns_mem_usage(severity); - tor_log_mallinfo(severity); -} - -/** Write all statistics to the log, with log level severity. Called - * in response to a SIGUSR1. */ -static void -dumpstats(int severity) -{ - time_t now = time(NULL); - time_t elapsed; - size_t rbuf_cap, wbuf_cap, rbuf_len, wbuf_len; - - tor_log(severity, LD_GENERAL, "Dumping stats:"); - - SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) { - int i = conn_sl_idx; - tor_log(severity, LD_GENERAL, - "Conn %d (socket %d) type %d (%s), state %d (%s), created %d secs ago", - i, (int)conn->s, conn->type, conn_type_to_string(conn->type), - conn->state, conn_state_to_string(conn->type, conn->state), - (int)(now - conn->timestamp_created)); - if (!connection_is_listener(conn)) { - tor_log(severity,LD_GENERAL, - "Conn %d is to %s:%d.", i, - safe_str_client(conn->address), - conn->port); - tor_log(severity,LD_GENERAL, - "Conn %d: %d bytes waiting on inbuf (len %d, last read %d secs ago)", - i, - (int)connection_get_inbuf_len(conn), - (int)buf_allocation(conn->inbuf), - (int)(now - conn->timestamp_lastread)); - tor_log(severity,LD_GENERAL, - "Conn %d: %d bytes waiting on outbuf " - "(len %d, last written %d secs ago)",i, - (int)connection_get_outbuf_len(conn), - (int)buf_allocation(conn->outbuf), - (int)(now - conn->timestamp_lastwritten)); - if (conn->type == CONN_TYPE_OR) { - or_connection_t *or_conn = TO_OR_CONN(conn); - if (or_conn->tls) { - if (tor_tls_get_buffer_sizes(or_conn->tls, &rbuf_cap, &rbuf_len, - &wbuf_cap, &wbuf_len) == 0) { - tor_log(severity, LD_GENERAL, - "Conn %d: %d/%d bytes used on OpenSSL read buffer; " - "%d/%d bytes used on write buffer.", - i, (int)rbuf_len, (int)rbuf_cap, (int)wbuf_len, (int)wbuf_cap); - } - } - } - } - circuit_dump_by_conn(conn, severity); /* dump info about all the circuits - * using this conn */ - } SMARTLIST_FOREACH_END(conn); - - channel_dumpstats(severity); - channel_listener_dumpstats(severity); - - tor_log(severity, LD_NET, - "Cells processed: "U64_FORMAT" padding\n" - " "U64_FORMAT" create\n" - " "U64_FORMAT" created\n" - " "U64_FORMAT" relay\n" - " ("U64_FORMAT" relayed)\n" - " ("U64_FORMAT" delivered)\n" - " "U64_FORMAT" destroy", - U64_PRINTF_ARG(stats_n_padding_cells_processed), - U64_PRINTF_ARG(stats_n_create_cells_processed), - U64_PRINTF_ARG(stats_n_created_cells_processed), - U64_PRINTF_ARG(stats_n_relay_cells_processed), - U64_PRINTF_ARG(stats_n_relay_cells_relayed), - U64_PRINTF_ARG(stats_n_relay_cells_delivered), - U64_PRINTF_ARG(stats_n_destroy_cells_processed)); - if (stats_n_data_cells_packaged) - tor_log(severity,LD_NET,"Average packaged cell fullness: %2.3f%%", - 100*(U64_TO_DBL(stats_n_data_bytes_packaged) / - U64_TO_DBL(stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)) ); - if (stats_n_data_cells_received) - tor_log(severity,LD_NET,"Average delivered cell fullness: %2.3f%%", - 100*(U64_TO_DBL(stats_n_data_bytes_received) / - U64_TO_DBL(stats_n_data_cells_received*RELAY_PAYLOAD_SIZE)) ); - - cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_TAP, "TAP"); - cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_NTOR,"ntor"); - - if (now - time_of_process_start >= 0) - elapsed = now - time_of_process_start; - else - elapsed = 0; - - if (elapsed) { - tor_log(severity, LD_NET, - "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec reading", - U64_PRINTF_ARG(stats_n_bytes_read), - (int)elapsed, - (int) (stats_n_bytes_read/elapsed)); - tor_log(severity, LD_NET, - "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec writing", - U64_PRINTF_ARG(stats_n_bytes_written), - (int)elapsed, - (int) (stats_n_bytes_written/elapsed)); - } - - tor_log(severity, LD_NET, "--------------- Dumping memory information:"); - dumpmemusage(severity); - - rep_hist_dump_stats(now,severity); - rend_service_dump_stats(severity); - dump_distinct_digest_count(severity); -} - -/** Called by exit() as we shut down the process. - */ -static void -exit_function(void) -{ - /* NOTE: If we ever daemonize, this gets called immediately. That's - * okay for now, because we only use this on Windows. */ -#ifdef _WIN32 - WSACleanup(); -#endif -} - -#ifdef _WIN32 -#define UNIX_ONLY 0 -#else -#define UNIX_ONLY 1 -#endif -static struct { - int signal_value; - int try_to_register; - struct event *signal_event; -} signal_handlers[] = { -#ifdef SIGINT - { SIGINT, UNIX_ONLY, NULL }, /* do a controlled slow shutdown */ -#endif -#ifdef SIGTERM - { SIGTERM, UNIX_ONLY, NULL }, /* to terminate now */ -#endif -#ifdef SIGPIPE - { SIGPIPE, UNIX_ONLY, NULL }, /* otherwise SIGPIPE kills us */ -#endif -#ifdef SIGUSR1 - { SIGUSR1, UNIX_ONLY, NULL }, /* dump stats */ -#endif -#ifdef SIGUSR2 - { SIGUSR2, UNIX_ONLY, NULL }, /* go to loglevel debug */ -#endif -#ifdef SIGHUP - { SIGHUP, UNIX_ONLY, NULL }, /* to reload config, retry conns, etc */ -#endif -#ifdef SIGXFSZ - { SIGXFSZ, UNIX_ONLY, NULL }, /* handle file-too-big resource exhaustion */ -#endif -#ifdef SIGCHLD - { SIGCHLD, UNIX_ONLY, NULL }, /* handle dns/cpu workers that exit */ -#endif - /* These are controller-only */ - { SIGNEWNYM, 0, NULL }, - { SIGCLEARDNSCACHE, 0, NULL }, - { SIGHEARTBEAT, 0, NULL }, - { -1, -1, NULL } -}; - -/** Set up the signal handlers for either parent or child process */ -void -handle_signals(int is_parent) -{ - int i; - if (is_parent) { - for (i = 0; signal_handlers[i].signal_value >= 0; ++i) { - if (signal_handlers[i].try_to_register) { - signal_handlers[i].signal_event = - tor_evsignal_new(tor_libevent_get_base(), - signal_handlers[i].signal_value, - signal_callback, - &signal_handlers[i].signal_value); - if (event_add(signal_handlers[i].signal_event, NULL)) - log_warn(LD_BUG, "Error from libevent when adding " - "event for signal %d", - signal_handlers[i].signal_value); - } else { - signal_handlers[i].signal_event = - tor_event_new(tor_libevent_get_base(), -1, - EV_SIGNAL, signal_callback, - &signal_handlers[i].signal_value); - } - } - } else { -#ifndef _WIN32 - struct sigaction action; - action.sa_flags = 0; - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGINT, &action, NULL); - sigaction(SIGTERM, &action, NULL); - sigaction(SIGPIPE, &action, NULL); - sigaction(SIGUSR1, &action, NULL); - sigaction(SIGUSR2, &action, NULL); - sigaction(SIGHUP, &action, NULL); -#ifdef SIGXFSZ - sigaction(SIGXFSZ, &action, NULL); -#endif -#endif /* !defined(_WIN32) */ - } -} - -/* Make sure the signal handler for signal_num will be called. */ -void -activate_signal(int signal_num) -{ - int i; - for (i = 0; signal_handlers[i].signal_value >= 0; ++i) { - if (signal_handlers[i].signal_value == signal_num) { - event_active(signal_handlers[i].signal_event, EV_SIGNAL, 1); - return; - } - } -} - -/** Main entry point for the Tor command-line client. Return 0 on "success", - * negative on "failure", and positive on "success and exit". - */ -int -tor_init(int argc, char *argv[]) -{ - char progname[256]; - int quiet = 0; - - time_of_process_start = time(NULL); - init_connection_lists(); - /* Have the log set up with our application name. */ - tor_snprintf(progname, sizeof(progname), "Tor %s", get_version()); - log_set_application_name(progname); - - /* Set up the crypto nice and early */ - if (crypto_early_init() < 0) { - log_err(LD_GENERAL, "Unable to initialize the crypto subsystem!"); - return -1; - } - - /* Initialize the history structures. */ - rep_hist_init(); - /* Initialize the service cache. */ - rend_cache_init(); - addressmap_init(); /* Init the client dns cache. Do it always, since it's - * cheap. */ - /* Initialize the HS subsystem. */ - hs_init(); - - { - /* We search for the "quiet" option first, since it decides whether we - * will log anything at all to the command line. */ - config_line_t *opts = NULL, *cmdline_opts = NULL; - const config_line_t *cl; - (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts); - for (cl = cmdline_opts; cl; cl = cl->next) { - if (!strcmp(cl->key, "--hush")) - quiet = 1; - if (!strcmp(cl->key, "--quiet") || - !strcmp(cl->key, "--dump-config")) - quiet = 2; - /* The following options imply --hush */ - if (!strcmp(cl->key, "--version") || !strcmp(cl->key, "--digests") || - !strcmp(cl->key, "--list-torrc-options") || - !strcmp(cl->key, "--library-versions") || - !strcmp(cl->key, "--hash-password") || - !strcmp(cl->key, "-h") || !strcmp(cl->key, "--help")) { - if (quiet < 1) - quiet = 1; - } - } - config_free_lines(opts); - config_free_lines(cmdline_opts); - } - - /* give it somewhere to log to initially */ - switch (quiet) { - case 2: - /* no initial logging */ - break; - case 1: - add_temp_log(LOG_WARN); - break; - default: - add_temp_log(LOG_NOTICE); - } - quiet_level = quiet; - - { - const char *version = get_version(); - - log_notice(LD_GENERAL, "Tor %s running on %s with Libevent %s, " - "OpenSSL %s, Zlib %s, Liblzma %s, and Libzstd %s.", version, - get_uname(), - tor_libevent_get_version_str(), - crypto_openssl_get_version_str(), - tor_compress_supports_method(ZLIB_METHOD) ? - tor_compress_version_str(ZLIB_METHOD) : "N/A", - tor_compress_supports_method(LZMA_METHOD) ? - tor_compress_version_str(LZMA_METHOD) : "N/A", - tor_compress_supports_method(ZSTD_METHOD) ? - tor_compress_version_str(ZSTD_METHOD) : "N/A"); - - log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " - "Learn how to be safe at " - "https://www.torproject.org/download/download#warning"); - - if (strstr(version, "alpha") || strstr(version, "beta")) - log_notice(LD_GENERAL, "This version is not a stable Tor release. " - "Expect more bugs than usual."); - } - -#ifdef HAVE_RUST - char *rust_str = rust_welcome_string(); - if (rust_str != NULL && strlen(rust_str) > 0) { - log_notice(LD_GENERAL, "%s", rust_str); - } - tor_free(rust_str); -#endif /* defined(HAVE_RUST) */ - - if (network_init()<0) { - log_err(LD_BUG,"Error initializing network; exiting."); - return -1; - } - atexit(exit_function); - - int init_rv = options_init_from_torrc(argc,argv); - if (init_rv < 0) { - log_err(LD_CONFIG,"Reading config failed--see warnings above."); - return -1; - } else if (init_rv > 0) { - // We succeeded, and should exit anyway -- probably the user just said - // "--version" or something like that. - return 1; - } - - /* The options are now initialised */ - const or_options_t *options = get_options(); - - /* Initialize channelpadding parameters to defaults until we get - * a consensus */ - channelpadding_new_consensus_params(NULL); - - /* Initialize predicted ports list after loading options */ - predicted_ports_init(); - -#ifndef _WIN32 - if (geteuid()==0) - log_warn(LD_GENERAL,"You are running Tor as root. You don't need to, " - "and you probably shouldn't."); -#endif - - if (crypto_global_init(options->HardwareAccel, - options->AccelName, - options->AccelDir)) { - log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); - return -1; - } - stream_choice_seed_weak_rng(); - if (tor_init_libevent_rng() < 0) { - log_warn(LD_NET, "Problem initializing libevent RNG."); - } - - /* Scan/clean unparseable descroptors; after reading config */ - routerparse_init(); - - return 0; -} - -/** A lockfile structure, used to prevent two Tors from messing with the - * data directory at once. If this variable is non-NULL, we're holding - * the lockfile. */ -static tor_lockfile_t *lockfile = NULL; - -/** Try to grab the lock file described in options, if we do not - * already have it. If err_if_locked is true, warn if somebody else is - * holding the lock, and exit if we can't get it after waiting. Otherwise, - * return -1 if we can't get the lockfile. Return 0 on success. - */ -int -try_locking(const or_options_t *options, int err_if_locked) -{ - if (lockfile) - return 0; - else { - char *fname = options_get_datadir_fname(options, "lock"); - int already_locked = 0; - tor_lockfile_t *lf = tor_lockfile_lock(fname, 0, &already_locked); - tor_free(fname); - if (!lf) { - if (err_if_locked && already_locked) { - int r; - log_warn(LD_GENERAL, "It looks like another Tor process is running " - "with the same data directory. Waiting 5 seconds to see " - "if it goes away."); -#ifndef _WIN32 - sleep(5); -#else - Sleep(5000); -#endif - r = try_locking(options, 0); - if (r<0) { - log_err(LD_GENERAL, "No, it's still there. Exiting."); - return -1; - } - return r; - } - return -1; - } - lockfile = lf; - return 0; - } -} - -/** Return true iff we've successfully acquired the lock file. */ -int -have_lockfile(void) -{ - return lockfile != NULL; -} - -/** If we have successfully acquired the lock file, release it. */ -void -release_lockfile(void) -{ - if (lockfile) { - tor_lockfile_unlock(lockfile); - lockfile = NULL; - } -} - -/** Free all memory that we might have allocated somewhere. - * If postfork, we are a worker process and we want to free - * only the parts of memory that we won't touch. If !postfork, - * Tor is shutting down and we should free everything. - * - * Helps us find the real leaks with dmalloc and the like. Also valgrind - * should then report 0 reachable in its leak report (in an ideal world -- - * in practice libevent, SSL, libc etc never quite free everything). */ -void -tor_free_all(int postfork) -{ - if (!postfork) { - evdns_shutdown(1); - } - geoip_free_all(); - dirvote_free_all(); - routerlist_free_all(); - networkstatus_free_all(); - addressmap_free_all(); - dirserv_free_all(); - rend_cache_free_all(); - rend_service_authorization_free_all(); - rep_hist_free_all(); - dns_free_all(); - clear_pending_onions(); - circuit_free_all(); - entry_guards_free_all(); - pt_free_all(); - channel_tls_free_all(); - channel_free_all(); - connection_free_all(); - connection_edge_free_all(); - scheduler_free_all(); - nodelist_free_all(); - microdesc_free_all(); - routerparse_free_all(); - ext_orport_free_all(); - control_free_all(); - sandbox_free_getaddrinfo_cache(); - protover_free_all(); - bridges_free_all(); - consdiffmgr_free_all(); - hs_free_all(); - if (!postfork) { - config_free_all(); - or_state_free_all(); - router_free_all(); - routerkeys_free_all(); - policies_free_all(); - } - if (!postfork) { - tor_tls_free_all(); -#ifndef _WIN32 - tor_getpwnam(NULL); -#endif - } - /* stuff in main.c */ - - smartlist_free(connection_array); - smartlist_free(closeable_connection_lst); - smartlist_free(active_linked_connection_lst); - periodic_timer_free(second_timer); - teardown_periodic_events(); - periodic_timer_free(refill_timer); - - if (!postfork) { - release_lockfile(); - } - /* Stuff in util.c and address.c*/ - if (!postfork) { - escaped(NULL); - esc_router_info(NULL); - clean_up_backtrace_handler(); - logs_free_all(); /* free log strings. do this last so logs keep working. */ - } -} - -/** - * Remove the specified file, and log a warning if the operation fails for - * any reason other than the file not existing. - */ -void -tor_remove_file(const char *filename) -{ - if (tor_unlink(filename) != 0 && errno != ENOENT) { - log_warn(LD_FS, "Couldn't unlink %s: %s", - filename, strerror(errno)); - } -} - -/** Do whatever cleanup is necessary before shutting Tor down. */ -void -tor_cleanup(void) -{ - const or_options_t *options = get_options(); - if (options->command == CMD_RUN_TOR) { - time_t now = time(NULL); - /* Remove our pid file. We don't care if there was an error when we - * unlink, nothing we could do about it anyways. */ - tor_remove_file(options->PidFile); - /* Remove control port file */ - tor_remove_file(options->ControlPortWriteToFile); - /* Remove cookie authentication file */ - { - char *cookie_fname = get_controller_cookie_file_name(); - tor_remove_file(cookie_fname); - tor_free(cookie_fname); - } - /* Remove Extended ORPort cookie authentication file */ - { - char *cookie_fname = get_ext_or_auth_cookie_file_name(); - tor_remove_file(cookie_fname); - tor_free(cookie_fname); - } - if (accounting_is_enabled(options)) - accounting_record_bandwidth_usage(now, get_or_state()); - or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */ - or_state_save(now); - if (authdir_mode(options)) { - sr_save_and_cleanup(); - } - if (authdir_mode_tests_reachability(options)) - rep_hist_record_mtbf_data(now, 0); - keypin_close_journal(); - } - - timers_shutdown(); - -#ifdef USE_DMALLOC - dmalloc_log_stats(); -#endif - tor_free_all(0); /* We could move tor_free_all back into the ifdef below - later, if it makes shutdown unacceptably slow. But for - now, leave it here: it's helped us catch bugs in the - past. */ - crypto_global_cleanup(); -#ifdef USE_DMALLOC - dmalloc_log_unfreed(); - dmalloc_shutdown(); -#endif -} - -/** Read/create keys as needed, and echo our fingerprint to stdout. */ -static int -do_list_fingerprint(void) -{ - char buf[FINGERPRINT_LEN+1]; - crypto_pk_t *k; - const char *nickname = get_options()->Nickname; - sandbox_disable_getaddrinfo_cache(); - if (!server_mode(get_options())) { - log_err(LD_GENERAL, - "Clients don't have long-term identity keys. Exiting."); - return -1; - } - tor_assert(nickname); - if (init_keys() < 0) { - log_err(LD_GENERAL,"Error initializing keys; exiting."); - return -1; - } - if (!(k = get_server_identity_key())) { - log_err(LD_GENERAL,"Error: missing identity key."); - return -1; - } - if (crypto_pk_get_fingerprint(k, buf, 1)<0) { - log_err(LD_BUG, "Error computing fingerprint"); - return -1; - } - printf("%s %s\n", nickname, buf); - return 0; -} - -/** Entry point for password hashing: take the desired password from - * the command line, and print its salted hash to stdout. **/ -static void -do_hash_password(void) -{ - - char output[256]; - char key[S2K_RFC2440_SPECIFIER_LEN+DIGEST_LEN]; - - crypto_rand(key, S2K_RFC2440_SPECIFIER_LEN-1); - key[S2K_RFC2440_SPECIFIER_LEN-1] = (uint8_t)96; /* Hash 64 K of data. */ - secret_to_key_rfc2440(key+S2K_RFC2440_SPECIFIER_LEN, DIGEST_LEN, - get_options()->command_arg, strlen(get_options()->command_arg), - key); - base16_encode(output, sizeof(output), key, sizeof(key)); - printf("16:%s\n",output); -} - -/** Entry point for configuration dumping: write the configuration to - * stdout. */ -static int -do_dump_config(void) -{ - const or_options_t *options = get_options(); - const char *arg = options->command_arg; - int how; - char *opts; - - if (!strcmp(arg, "short")) { - how = OPTIONS_DUMP_MINIMAL; - } else if (!strcmp(arg, "non-builtin")) { - how = OPTIONS_DUMP_DEFAULTS; - } else if (!strcmp(arg, "full")) { - how = OPTIONS_DUMP_ALL; - } else { - fprintf(stderr, "No valid argument to --dump-config found!\n"); - fprintf(stderr, "Please select 'short', 'non-builtin', or 'full'.\n"); - - return -1; - } - - opts = options_dump(options, how); - printf("%s", opts); - tor_free(opts); - - return 0; -} - -static void -init_addrinfo(void) -{ - if (! server_mode(get_options()) || - (get_options()->Address && strlen(get_options()->Address) > 0)) { - /* We don't need to seed our own hostname, because we won't be calling - * resolve_my_address on it. - */ - return; - } - char hname[256]; - - // host name to sandbox - gethostname(hname, sizeof(hname)); - sandbox_add_addrinfo(hname); -} - -static sandbox_cfg_t* -sandbox_init_filter(void) -{ - const or_options_t *options = get_options(); - sandbox_cfg_t *cfg = sandbox_cfg_new(); - int i; - - sandbox_cfg_allow_openat_filename(&cfg, - get_cachedir_fname("cached-status")); - -#define OPEN(name) \ - sandbox_cfg_allow_open_filename(&cfg, tor_strdup(name)) - -#define OPEN_DATADIR(name) \ - sandbox_cfg_allow_open_filename(&cfg, get_datadir_fname(name)) - -#define OPEN_DATADIR2(name, name2) \ - sandbox_cfg_allow_open_filename(&cfg, get_datadir_fname2((name), (name2))) - -#define OPEN_DATADIR_SUFFIX(name, suffix) do { \ - OPEN_DATADIR(name); \ - OPEN_DATADIR(name suffix); \ - } while (0) - -#define OPEN_DATADIR2_SUFFIX(name, name2, suffix) do { \ - OPEN_DATADIR2(name, name2); \ - OPEN_DATADIR2(name, name2 suffix); \ - } while (0) - -#define OPEN_KEY_DIRECTORY() \ - sandbox_cfg_allow_open_filename(&cfg, tor_strdup(options->KeyDirectory)) -#define OPEN_CACHEDIR(name) \ - sandbox_cfg_allow_open_filename(&cfg, get_cachedir_fname(name)) -#define OPEN_CACHEDIR_SUFFIX(name, suffix) do { \ - OPEN_CACHEDIR(name); \ - OPEN_CACHEDIR(name suffix); \ - } while (0) -#define OPEN_KEYDIR(name) \ - sandbox_cfg_allow_open_filename(&cfg, get_keydir_fname(name)) -#define OPEN_KEYDIR_SUFFIX(name, suffix) do { \ - OPEN_KEYDIR(name); \ - OPEN_KEYDIR(name suffix); \ - } while (0) - - OPEN(options->DataDirectory); - OPEN_KEY_DIRECTORY(); - - OPEN_CACHEDIR_SUFFIX("cached-certs", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-consensus", ".tmp"); - OPEN_CACHEDIR_SUFFIX("unverified-consensus", ".tmp"); - OPEN_CACHEDIR_SUFFIX("unverified-microdesc-consensus", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-microdesc-consensus", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-microdescs", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-microdescs.new", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-descriptors", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-descriptors.new", ".tmp"); - OPEN_CACHEDIR("cached-descriptors.tmp.tmp"); - OPEN_CACHEDIR_SUFFIX("cached-extrainfo", ".tmp"); - OPEN_CACHEDIR_SUFFIX("cached-extrainfo.new", ".tmp"); - OPEN_CACHEDIR("cached-extrainfo.tmp.tmp"); - - OPEN_DATADIR_SUFFIX("state", ".tmp"); - OPEN_DATADIR_SUFFIX("sr-state", ".tmp"); - OPEN_DATADIR_SUFFIX("unparseable-desc", ".tmp"); - OPEN_DATADIR_SUFFIX("v3-status-votes", ".tmp"); - OPEN_DATADIR("key-pinning-journal"); - OPEN("/dev/srandom"); - OPEN("/dev/urandom"); - OPEN("/dev/random"); - OPEN("/etc/hosts"); - OPEN("/proc/meminfo"); - - if (options->BridgeAuthoritativeDir) - OPEN_DATADIR_SUFFIX("networkstatus-bridges", ".tmp"); - - if (authdir_mode(options)) - OPEN_DATADIR("approved-routers"); - - if (options->ServerDNSResolvConfFile) - sandbox_cfg_allow_open_filename(&cfg, - tor_strdup(options->ServerDNSResolvConfFile)); - else - sandbox_cfg_allow_open_filename(&cfg, tor_strdup("/etc/resolv.conf")); - - for (i = 0; i < 2; ++i) { - if (get_torrc_fname(i)) { - sandbox_cfg_allow_open_filename(&cfg, tor_strdup(get_torrc_fname(i))); - } - } - - SMARTLIST_FOREACH(options->FilesOpenedByIncludes, char *, f, { - OPEN(f); - }); - -#define RENAME_SUFFIX(name, suffix) \ - sandbox_cfg_allow_rename(&cfg, \ - get_datadir_fname(name suffix), \ - get_datadir_fname(name)) - -#define RENAME_SUFFIX2(prefix, name, suffix) \ - sandbox_cfg_allow_rename(&cfg, \ - get_datadir_fname2(prefix, name suffix), \ - get_datadir_fname2(prefix, name)) - -#define RENAME_CACHEDIR_SUFFIX(name, suffix) \ - sandbox_cfg_allow_rename(&cfg, \ - get_cachedir_fname(name suffix), \ - get_cachedir_fname(name)) - -#define RENAME_KEYDIR_SUFFIX(name, suffix) \ - sandbox_cfg_allow_rename(&cfg, \ - get_keydir_fname(name suffix), \ - get_keydir_fname(name)) - - RENAME_CACHEDIR_SUFFIX("cached-certs", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-consensus", ".tmp"); - RENAME_CACHEDIR_SUFFIX("unverified-consensus", ".tmp"); - RENAME_CACHEDIR_SUFFIX("unverified-microdesc-consensus", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-microdesc-consensus", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-microdescs", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-microdescs", ".new"); - RENAME_CACHEDIR_SUFFIX("cached-microdescs.new", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-descriptors", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-descriptors", ".new"); - RENAME_CACHEDIR_SUFFIX("cached-descriptors.new", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-extrainfo", ".tmp"); - RENAME_CACHEDIR_SUFFIX("cached-extrainfo", ".new"); - RENAME_CACHEDIR_SUFFIX("cached-extrainfo.new", ".tmp"); - - RENAME_SUFFIX("state", ".tmp"); - RENAME_SUFFIX("sr-state", ".tmp"); - RENAME_SUFFIX("unparseable-desc", ".tmp"); - RENAME_SUFFIX("v3-status-votes", ".tmp"); - - if (options->BridgeAuthoritativeDir) - RENAME_SUFFIX("networkstatus-bridges", ".tmp"); - -#define STAT_DATADIR(name) \ - sandbox_cfg_allow_stat_filename(&cfg, get_datadir_fname(name)) - -#define STAT_CACHEDIR(name) \ - sandbox_cfg_allow_stat_filename(&cfg, get_cachedir_fname(name)) - -#define STAT_DATADIR2(name, name2) \ - sandbox_cfg_allow_stat_filename(&cfg, get_datadir_fname2((name), (name2))) - -#define STAT_KEY_DIRECTORY() \ - sandbox_cfg_allow_stat_filename(&cfg, tor_strdup(options->KeyDirectory)) - - STAT_DATADIR(NULL); - STAT_DATADIR("lock"); - STAT_DATADIR("state"); - STAT_DATADIR("router-stability"); - - STAT_CACHEDIR("cached-extrainfo.new"); - - { - smartlist_t *files = smartlist_new(); - tor_log_get_logfile_names(files); - SMARTLIST_FOREACH(files, char *, file_name, { - /* steals reference */ - sandbox_cfg_allow_open_filename(&cfg, file_name); - }); - smartlist_free(files); - } - - { - smartlist_t *files = smartlist_new(); - smartlist_t *dirs = smartlist_new(); - hs_service_lists_fnames_for_sandbox(files, dirs); - SMARTLIST_FOREACH(files, char *, file_name, { - char *tmp_name = NULL; - tor_asprintf(&tmp_name, "%s.tmp", file_name); - sandbox_cfg_allow_rename(&cfg, - tor_strdup(tmp_name), tor_strdup(file_name)); - /* steals references */ - sandbox_cfg_allow_open_filename(&cfg, file_name); - sandbox_cfg_allow_open_filename(&cfg, tmp_name); - }); - SMARTLIST_FOREACH(dirs, char *, dir, { - /* steals reference */ - sandbox_cfg_allow_stat_filename(&cfg, dir); - }); - smartlist_free(files); - smartlist_free(dirs); - } - - { - char *fname; - if ((fname = get_controller_cookie_file_name())) { - sandbox_cfg_allow_open_filename(&cfg, fname); - } - if ((fname = get_ext_or_auth_cookie_file_name())) { - sandbox_cfg_allow_open_filename(&cfg, fname); - } - } - - SMARTLIST_FOREACH_BEGIN(get_configured_ports(), port_cfg_t *, port) { - if (!port->is_unix_addr) - continue; - /* When we open an AF_UNIX address, we want permission to open the - * directory that holds it. */ - char *dirname = tor_strdup(port->unix_addr); - if (get_parent_directory(dirname) == 0) { - OPEN(dirname); - } - tor_free(dirname); - sandbox_cfg_allow_chmod_filename(&cfg, tor_strdup(port->unix_addr)); - sandbox_cfg_allow_chown_filename(&cfg, tor_strdup(port->unix_addr)); - } SMARTLIST_FOREACH_END(port); - - if (options->DirPortFrontPage) { - sandbox_cfg_allow_open_filename(&cfg, - tor_strdup(options->DirPortFrontPage)); - } - - // orport - if (server_mode(get_options())) { - - OPEN_KEYDIR_SUFFIX("secret_id_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("secret_onion_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("secret_onion_key_ntor", ".tmp"); - OPEN_KEYDIR("secret_id_key.old"); - OPEN_KEYDIR("secret_onion_key.old"); - OPEN_KEYDIR("secret_onion_key_ntor.old"); - - OPEN_KEYDIR_SUFFIX("ed25519_master_id_secret_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_master_id_secret_key_encrypted", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_master_id_public_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_signing_secret_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_signing_secret_key_encrypted", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_signing_public_key", ".tmp"); - OPEN_KEYDIR_SUFFIX("ed25519_signing_cert", ".tmp"); - - OPEN_DATADIR2_SUFFIX("stats", "bridge-stats", ".tmp"); - OPEN_DATADIR2_SUFFIX("stats", "dirreq-stats", ".tmp"); - - OPEN_DATADIR2_SUFFIX("stats", "entry-stats", ".tmp"); - OPEN_DATADIR2_SUFFIX("stats", "exit-stats", ".tmp"); - OPEN_DATADIR2_SUFFIX("stats", "buffer-stats", ".tmp"); - OPEN_DATADIR2_SUFFIX("stats", "conn-stats", ".tmp"); - OPEN_DATADIR2_SUFFIX("stats", "hidserv-stats", ".tmp"); - - OPEN_DATADIR("approved-routers"); - OPEN_DATADIR_SUFFIX("fingerprint", ".tmp"); - OPEN_DATADIR_SUFFIX("hashed-fingerprint", ".tmp"); - OPEN_DATADIR_SUFFIX("router-stability", ".tmp"); - - OPEN("/etc/resolv.conf"); - - RENAME_SUFFIX("fingerprint", ".tmp"); - RENAME_KEYDIR_SUFFIX("secret_onion_key_ntor", ".tmp"); - - RENAME_KEYDIR_SUFFIX("secret_id_key", ".tmp"); - RENAME_KEYDIR_SUFFIX("secret_id_key.old", ".tmp"); - RENAME_KEYDIR_SUFFIX("secret_onion_key", ".tmp"); - RENAME_KEYDIR_SUFFIX("secret_onion_key.old", ".tmp"); - - RENAME_SUFFIX2("stats", "bridge-stats", ".tmp"); - RENAME_SUFFIX2("stats", "dirreq-stats", ".tmp"); - RENAME_SUFFIX2("stats", "entry-stats", ".tmp"); - RENAME_SUFFIX2("stats", "exit-stats", ".tmp"); - RENAME_SUFFIX2("stats", "buffer-stats", ".tmp"); - RENAME_SUFFIX2("stats", "conn-stats", ".tmp"); - RENAME_SUFFIX2("stats", "hidserv-stats", ".tmp"); - RENAME_SUFFIX("hashed-fingerprint", ".tmp"); - RENAME_SUFFIX("router-stability", ".tmp"); - - RENAME_KEYDIR_SUFFIX("ed25519_master_id_secret_key", ".tmp"); - RENAME_KEYDIR_SUFFIX("ed25519_master_id_secret_key_encrypted", ".tmp"); - RENAME_KEYDIR_SUFFIX("ed25519_master_id_public_key", ".tmp"); - RENAME_KEYDIR_SUFFIX("ed25519_signing_secret_key", ".tmp"); - RENAME_KEYDIR_SUFFIX("ed25519_signing_cert", ".tmp"); - - sandbox_cfg_allow_rename(&cfg, - get_keydir_fname("secret_onion_key"), - get_keydir_fname("secret_onion_key.old")); - sandbox_cfg_allow_rename(&cfg, - get_keydir_fname("secret_onion_key_ntor"), - get_keydir_fname("secret_onion_key_ntor.old")); - - STAT_KEY_DIRECTORY(); - OPEN_DATADIR("stats"); - STAT_DATADIR("stats"); - STAT_DATADIR2("stats", "dirreq-stats"); - - consdiffmgr_register_with_sandbox(&cfg); - } - - init_addrinfo(); - - return cfg; -} - -/* Main entry point for the Tor process. Called from tor_main(), and by - * anybody embedding Tor. */ -int -tor_run_main(const tor_main_configuration_t *tor_cfg) -{ - int result = 0; - - int argc = tor_cfg->argc; - char **argv = tor_cfg->argv; - -#ifdef _WIN32 -#ifndef HeapEnableTerminationOnCorruption -#define HeapEnableTerminationOnCorruption 1 -#endif - /* On heap corruption, just give up; don't try to play along. */ - HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); - /* Call SetProcessDEPPolicy to permanently enable DEP. - The function will not resolve on earlier versions of Windows, - and failure is not dangerous. */ - HMODULE hMod = GetModuleHandleA("Kernel32.dll"); - if (hMod) { - typedef BOOL (WINAPI *PSETDEP)(DWORD); - PSETDEP setdeppolicy = (PSETDEP)GetProcAddress(hMod, - "SetProcessDEPPolicy"); - if (setdeppolicy) { - /* PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION */ - setdeppolicy(3); - } - } -#endif /* defined(_WIN32) */ - - configure_backtrace_handler(get_version()); - - update_approx_time(time(NULL)); - tor_threads_init(); - tor_compress_init(); - init_logging(0); - monotime_init(); -#ifdef USE_DMALLOC - { - /* Instruct OpenSSL to use our internal wrappers for malloc, - realloc and free. */ - int r = crypto_use_tor_alloc_functions(); - tor_assert(r == 0); - } -#endif /* defined(USE_DMALLOC) */ -#ifdef NT_SERVICE - { - int done = 0; - result = nt_service_parse_options(argc, argv, &done); - if (done) return result; - } -#endif /* defined(NT_SERVICE) */ - { - int init_rv = tor_init(argc, argv); - if (init_rv < 0) - return -1; - else if (init_rv > 0) - return 0; - } - - if (get_options()->Sandbox && get_options()->command == CMD_RUN_TOR) { - sandbox_cfg_t* cfg = sandbox_init_filter(); - - if (sandbox_init(cfg)) { - log_err(LD_BUG,"Failed to create syscall sandbox filter"); - return -1; - } - - // registering libevent rng -#ifdef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE - evutil_secure_rng_set_urandom_device_file( - (char*) sandbox_intern_string("/dev/urandom")); -#endif - } - - switch (get_options()->command) { - case CMD_RUN_TOR: -#ifdef NT_SERVICE - nt_service_set_state(SERVICE_RUNNING); -#endif - result = do_main_loop(); - break; - case CMD_KEYGEN: - result = load_ed_keys(get_options(), time(NULL)) < 0; - break; - case CMD_KEY_EXPIRATION: - init_keys(); - result = log_cert_expiration(); - break; - case CMD_LIST_FINGERPRINT: - result = do_list_fingerprint(); - break; - case CMD_HASH_PASSWORD: - do_hash_password(); - result = 0; - break; - case CMD_VERIFY_CONFIG: - if (quiet_level == 0) - printf("Configuration was valid\n"); - result = 0; - break; - case CMD_DUMP_CONFIG: - result = do_dump_config(); - break; - case CMD_RUN_UNITTESTS: /* only set by test.c */ - default: - log_warn(LD_BUG,"Illegal command number %d: internal error.", - get_options()->command); - result = -1; - } - tor_cleanup(); - return result; -} - diff --git a/src/tor/src/or/nodelist.h b/src/tor/src/or/nodelist.h deleted file mode 100644 index e879b4e8f..000000000 --- a/src/tor/src/or/nodelist.h +++ /dev/null @@ -1,160 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file nodelist.h - * \brief Header file for nodelist.c. - **/ - -#ifndef TOR_NODELIST_H -#define TOR_NODELIST_H - -#define node_assert_ok(n) STMT_BEGIN { \ - tor_assert((n)->ri || (n)->rs); \ - } STMT_END - -node_t *node_get_mutable_by_id(const char *identity_digest); -MOCK_DECL(const node_t *, node_get_by_id, (const char *identity_digest)); -node_t *node_get_mutable_by_ed25519_id(const ed25519_public_key_t *ed_id); -MOCK_DECL(const node_t *, node_get_by_ed25519_id, - (const ed25519_public_key_t *ed_id)); - -#define NNF_NO_WARN_UNNAMED (1u<<0) - -const node_t *node_get_by_hex_id(const char *identity_digest, - unsigned flags); -node_t *nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out); -node_t *nodelist_add_microdesc(microdesc_t *md); -void nodelist_set_consensus(networkstatus_t *ns); - -void nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md); -void nodelist_remove_routerinfo(routerinfo_t *ri); -void nodelist_purge(void); -smartlist_t *nodelist_find_nodes_with_microdesc(const microdesc_t *md); - -void nodelist_recompute_all_hsdir_indices(void); - -void nodelist_free_all(void); -void nodelist_assert_ok(void); - -MOCK_DECL(const node_t *, node_get_by_nickname, - (const char *nickname, unsigned flags)); -void node_get_verbose_nickname(const node_t *node, - char *verbose_name_out); -void node_get_verbose_nickname_by_id(const char *id_digest, - char *verbose_name_out); -int node_is_dir(const node_t *node); -int node_has_descriptor(const node_t *node); -int node_get_purpose(const node_t *node); -#define node_is_bridge(node) \ - (node_get_purpose((node)) == ROUTER_PURPOSE_BRIDGE) -int node_is_me(const node_t *node); -int node_exit_policy_rejects_all(const node_t *node); -int node_exit_policy_is_exact(const node_t *node, sa_family_t family); -smartlist_t *node_get_all_orports(const node_t *node); -int node_allows_single_hop_exits(const node_t *node); -const char *node_get_nickname(const node_t *node); -const char *node_get_platform(const node_t *node); -uint32_t node_get_prim_addr_ipv4h(const node_t *node); -void node_get_address_string(const node_t *node, char *cp, size_t len); -long node_get_declared_uptime(const node_t *node); -const smartlist_t *node_get_declared_family(const node_t *node); -const ed25519_public_key_t *node_get_ed25519_id(const node_t *node); -int node_ed25519_id_matches(const node_t *node, - const ed25519_public_key_t *id); -int node_supports_ed25519_link_authentication(const node_t *node, - int compatible_with_us); -int node_supports_v3_hsdir(const node_t *node); -int node_supports_ed25519_hs_intro(const node_t *node); -int node_supports_v3_rendezvous_point(const node_t *node); -const uint8_t *node_get_rsa_id_digest(const node_t *node); - -int node_has_ipv6_addr(const node_t *node); -int node_has_ipv6_orport(const node_t *node); -int node_has_ipv6_dirport(const node_t *node); -/* Deprecated - use node_ipv6_or_preferred or node_ipv6_dir_preferred */ -#define node_ipv6_preferred(node) node_ipv6_or_preferred(node) -int node_ipv6_or_preferred(const node_t *node); -int node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out); -int node_ipv6_dir_preferred(const node_t *node); -int node_get_prim_dirport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_dirport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_ipv6_dirport(const node_t *node, tor_addr_port_t *ap_out); -int node_has_curve25519_onion_key(const node_t *node); -const curve25519_public_key_t *node_get_curve25519_onion_key( - const node_t *node); - -MOCK_DECL(smartlist_t *, nodelist_get_list, (void)); - -/* Temporary during transition to multiple addresses. */ -void node_get_addr(const node_t *node, tor_addr_t *addr_out); -#define node_get_addr_ipv4h(n) node_get_prim_addr_ipv4h((n)) - -void nodelist_refresh_countries(void); -void node_set_country(node_t *node); -void nodelist_add_node_and_family(smartlist_t *nodes, const node_t *node); -int nodes_in_same_family(const node_t *node1, const node_t *node2); - -const node_t *router_find_exact_exit_enclave(const char *address, - uint16_t port); -int node_is_unreliable(const node_t *router, int need_uptime, - int need_capacity, int need_guard); -int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, - int need_uptime); -void router_set_status(const char *digest, int up); -int addrs_in_same_network_family(const tor_addr_t *a1, - const tor_addr_t *a2); - -/** router_have_minimum_dir_info tests to see if we have enough - * descriptor information to create circuits. - * If there are exits in the consensus, we wait until we have enough - * info to create exit paths before creating any circuits. If there are - * no exits in the consensus, we wait for enough info to create internal - * paths, and should avoid creating exit paths, as they will simply fail. - * We make sure we create all available circuit types at the same time. */ -MOCK_DECL(int, router_have_minimum_dir_info,(void)); - -/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node - * in the consensus. We update this flag in compute_frac_paths_available if - * there is at least one relay that has an Exit flag in the consensus. - * Used to avoid building exit circuits when they will almost certainly fail. - * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus. - * (This situation typically occurs during bootstrap of a test network.) - * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have - * reason to believe our last known value was invalid or has expired. - */ -typedef enum { - /* we haven't checked yet, or we have invalidated our previous check */ - CONSENSUS_PATH_UNKNOWN = -1, - /* The consensus only has internal relays, and we should only - * create internal paths, circuits, streams, ... */ - CONSENSUS_PATH_INTERNAL = 0, - /* The consensus has at least one exit, and can therefore (potentially) - * create exit and internal paths, circuits, streams, ... */ - CONSENSUS_PATH_EXIT = 1 -} consensus_path_type_t; - -MOCK_DECL(consensus_path_type_t, router_have_consensus_path, (void)); - -void router_dir_info_changed(void); -const char *get_dir_info_status_string(void); -int count_loading_descriptors_progress(void); - -#ifdef NODELIST_PRIVATE - -#ifdef TOR_UNIT_TESTS - -STATIC void -node_set_hsdir_index(node_t *node, const networkstatus_t *ns); - -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* defined(NODELIST_PRIVATE) */ - -#endif /* !defined(TOR_NODELIST_H) */ - diff --git a/src/tor/src/or/ntmain.c b/src/tor/src/or/ntmain.c deleted file mode 100644 index ebbe0018b..000000000 --- a/src/tor/src/or/ntmain.c +++ /dev/null @@ -1,782 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file ntmain.c - * - * \brief Entry points for running/configuring Tor as a Windows Service. - * - * Windows Services expect to be registered with the operating system, and to - * have entry points for starting, stopping, and monitoring them. This module - * implements those entry points so that a tor relay or client or hidden - * service can run as a Windows service. Therefore, this module - * is only compiled when building for Windows. - * - * Warning: this module is not very well tested or very well maintained. - */ - -#ifdef _WIN32 - -#include "or.h" -#include "config.h" -#include "main.h" -#include "ntmain.h" - -#include - -#include -#define GENSRV_SERVICENAME "tor" -#define GENSRV_DISPLAYNAME "Tor Win32 Service" -#define GENSRV_DESCRIPTION \ - "Provides an anonymous Internet communication system" -#define GENSRV_USERACCT "NT AUTHORITY\\LocalService" - -// Cheating: using the pre-defined error codes, tricks Windows into displaying -// a semi-related human-readable error message if startup fails as -// opposed to simply scaring people with Error: 0xffffffff -#define NT_SERVICE_ERROR_TORINIT_FAILED ERROR_EXCEPTION_IN_SERVICE - -static SERVICE_STATUS service_status; -static SERVICE_STATUS_HANDLE hStatus; - -/* XXXX This 'backup argv' and 'backup argc' business is an ugly hack. This - * is a job for arguments, not globals. Alas, some of the functions that - * use them use them need to have fixed signatures, so they can be passed - * to the NT service functions. */ -static char **backup_argv; -static int backup_argc; - -static void nt_service_control(DWORD request); -static void nt_service_body(int argc, char **argv); -static void nt_service_main(void); -static SC_HANDLE nt_service_open_scm(void); -static SC_HANDLE nt_service_open(SC_HANDLE hSCManager); -static int nt_service_start(SC_HANDLE hService); -static int nt_service_stop(SC_HANDLE hService); -static int nt_service_install(int argc, char **argv); -static int nt_service_remove(void); -static int nt_service_cmd_start(void); -static int nt_service_cmd_stop(void); - -/** Struct to hold dynamically loaded NT-service related function pointers. - */ -struct service_fns { - int loaded; - - /** @{ */ - /** Function pointers for Windows API functions related to service - * management. These are NULL, or they point to the . They're set by - * calling the LOAD macro below. */ - - BOOL (WINAPI *ChangeServiceConfig2A_fn)( - SC_HANDLE hService, - DWORD dwInfoLevel, - LPVOID lpInfo); - - BOOL (WINAPI *CloseServiceHandle_fn)( - SC_HANDLE hSCObject); - - BOOL (WINAPI *ControlService_fn)( - SC_HANDLE hService, - DWORD dwControl, - LPSERVICE_STATUS lpServiceStatus); - - SC_HANDLE (WINAPI *CreateServiceA_fn)( - SC_HANDLE hSCManager, - LPCSTR lpServiceName, - LPCSTR lpDisplayName, - DWORD dwDesiredAccess, - DWORD dwServiceType, - DWORD dwStartType, - DWORD dwErrorControl, - LPCSTR lpBinaryPathName, - LPCSTR lpLoadOrderGroup, - LPDWORD lpdwTagId, - LPCSTR lpDependencies, - LPCSTR lpServiceStartName, - LPCSTR lpPassword); - - BOOL (WINAPI *DeleteService_fn)( - SC_HANDLE hService); - - SC_HANDLE (WINAPI *OpenSCManagerA_fn)( - LPCSTR lpMachineName, - LPCSTR lpDatabaseName, - DWORD dwDesiredAccess); - - SC_HANDLE (WINAPI *OpenServiceA_fn)( - SC_HANDLE hSCManager, - LPCSTR lpServiceName, - DWORD dwDesiredAccess); - - BOOL (WINAPI *QueryServiceStatus_fn)( - SC_HANDLE hService, - LPSERVICE_STATUS lpServiceStatus); - - SERVICE_STATUS_HANDLE (WINAPI *RegisterServiceCtrlHandlerA_fn)( - LPCSTR lpServiceName, - LPHANDLER_FUNCTION lpHandlerProc); - - BOOL (WINAPI *SetServiceStatus_fn)(SERVICE_STATUS_HANDLE, - LPSERVICE_STATUS); - - BOOL (WINAPI *StartServiceCtrlDispatcherA_fn)( - const SERVICE_TABLE_ENTRYA* lpServiceTable); - - BOOL (WINAPI *StartServiceA_fn)( - SC_HANDLE hService, - DWORD dwNumServiceArgs, - LPCSTR* lpServiceArgVectors); - - BOOL (WINAPI *LookupAccountNameA_fn)( - LPCSTR lpSystemName, - LPCSTR lpAccountName, - PSID Sid, - LPDWORD cbSid, - LPTSTR ReferencedDomainName, - LPDWORD cchReferencedDomainName, - PSID_NAME_USE peUse); - /** @} */ -} service_fns = { 0, - NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, - NULL}; - -/** Loads functions used by NT services. Returns on success, or prints a - * complaint to stdout and exits on error. */ -static void -nt_service_loadlibrary(void) -{ - HMODULE library = 0; - void *fn; - - if (service_fns.loaded) - return; - - if (!(library = load_windows_system_library(TEXT("advapi32.dll")))) { - log_err(LD_GENERAL, "Couldn't open advapi32.dll. Are you trying to use " - "NT services on Windows 98? That doesn't work."); - goto err; - } - -/* Helper macro: try to load a function named f from "library" into - * service_functions.f_fn. On failure, log an error message, and goto - * err. - */ -#define LOAD(f) STMT_BEGIN \ - if (!(fn = GetProcAddress(library, #f))) { \ - log_err(LD_BUG, \ - "Couldn't find %s in advapi32.dll! We probably got the " \ - "name wrong.", #f); \ - goto err; \ - } else { \ - service_fns.f ## _fn = fn; \ - } \ - STMT_END - - LOAD(ChangeServiceConfig2A); - LOAD(CloseServiceHandle); - LOAD(ControlService); - LOAD(CreateServiceA); - LOAD(DeleteService); - LOAD(OpenSCManagerA); - LOAD(OpenServiceA); - LOAD(QueryServiceStatus); - LOAD(RegisterServiceCtrlHandlerA); - LOAD(SetServiceStatus); - LOAD(StartServiceCtrlDispatcherA); - LOAD(StartServiceA); - LOAD(LookupAccountNameA); - - service_fns.loaded = 1; - - return; - err: - printf("Unable to load library support for NT services: exiting.\n"); - exit(1); // exit ok: ntmain can't read libraries -} - -/** If we're compiled to run as an NT service, and the service wants to - * shut down, then change our current status and return 1. Else - * return 0. - */ -int -nt_service_is_stopping(void) -{ - /* If we haven't loaded the function pointers, we can't possibly be an NT - * service trying to shut down. */ - if (!service_fns.loaded) - return 0; - - if (service_status.dwCurrentState == SERVICE_STOP_PENDING) { - service_status.dwWin32ExitCode = 0; - service_status.dwCurrentState = SERVICE_STOPPED; - service_fns.SetServiceStatus_fn(hStatus, &service_status); - return 1; - } else if (service_status.dwCurrentState == SERVICE_STOPPED) { - return 1; - } - return 0; -} - -/** Set the dwCurrentState field for our service to state. */ -void -nt_service_set_state(DWORD state) -{ - service_status.dwCurrentState = state; -} - -/** Handles service control requests, such as stopping or starting the - * Tor service. */ -static void -nt_service_control(DWORD request) -{ - static struct timeval exit_now; - exit_now.tv_sec = 0; - exit_now.tv_usec = 0; - - nt_service_loadlibrary(); - - switch (request) { - case SERVICE_CONTROL_STOP: - case SERVICE_CONTROL_SHUTDOWN: - log_notice(LD_GENERAL, - "Got stop/shutdown request; shutting down cleanly."); - service_status.dwCurrentState = SERVICE_STOP_PENDING; - event_base_loopexit(tor_libevent_get_base(), &exit_now); - return; - } - service_fns.SetServiceStatus_fn(hStatus, &service_status); -} - -/** Called when the service is started via the system's service control - * manager. This calls tor_init() and starts the main event loop. If - * tor_init() fails, the service will be stopped and exit code set to - * NT_SERVICE_ERROR_TORINIT_FAILED. */ -static void -nt_service_body(int argc, char **argv) -{ - int r; - (void) argc; /* unused */ - (void) argv; /* unused */ - nt_service_loadlibrary(); - service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - service_status.dwCurrentState = SERVICE_START_PENDING; - service_status.dwControlsAccepted = - SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; - service_status.dwWin32ExitCode = 0; - service_status.dwServiceSpecificExitCode = 0; - service_status.dwCheckPoint = 0; - service_status.dwWaitHint = 1000; - hStatus = service_fns.RegisterServiceCtrlHandlerA_fn(GENSRV_SERVICENAME, - (LPHANDLER_FUNCTION) nt_service_control); - - if (hStatus == 0) { - /* Failed to register the service control handler function */ - return; - } - - r = tor_init(backup_argc, backup_argv); - if (r) { - /* Failed to start the Tor service */ - r = NT_SERVICE_ERROR_TORINIT_FAILED; - service_status.dwCurrentState = SERVICE_STOPPED; - service_status.dwWin32ExitCode = r; - service_status.dwServiceSpecificExitCode = r; - service_fns.SetServiceStatus_fn(hStatus, &service_status); - return; - } - - /* Set the service's status to SERVICE_RUNNING and start the main - * event loop */ - service_status.dwCurrentState = SERVICE_RUNNING; - service_fns.SetServiceStatus_fn(hStatus, &service_status); - set_main_thread(); - do_main_loop(); - tor_cleanup(); -} - -/** Main service entry point. Starts the service control dispatcher and waits - * until the service status is set to SERVICE_STOPPED. */ -static void -nt_service_main(void) -{ - SERVICE_TABLE_ENTRYA table[2]; - DWORD result = 0; - char *errmsg; - nt_service_loadlibrary(); - table[0].lpServiceName = (char*)GENSRV_SERVICENAME; - table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)nt_service_body; - table[1].lpServiceName = NULL; - table[1].lpServiceProc = NULL; - - if (!service_fns.StartServiceCtrlDispatcherA_fn(table)) { - result = GetLastError(); - errmsg = format_win32_error(result); - printf("Service error %d : %s\n", (int) result, errmsg); - tor_free(errmsg); - if (result == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { - if (tor_init(backup_argc, backup_argv)) - return; - switch (get_options()->command) { - case CMD_RUN_TOR: - do_main_loop(); - break; - case CMD_LIST_FINGERPRINT: - case CMD_HASH_PASSWORD: - case CMD_VERIFY_CONFIG: - case CMD_DUMP_CONFIG: - case CMD_KEYGEN: - case CMD_KEY_EXPIRATION: - log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, " - "--hash-password, --keygen, --dump-config, --verify-config, " - "or --key-expiration) in NT service."); - break; - case CMD_RUN_UNITTESTS: - default: - log_err(LD_CONFIG, "Illegal command number %d: internal error.", - get_options()->command); - } - tor_cleanup(); - } - } -} - -/** Return a handle to the service control manager on success, or NULL on - * failure. */ -static SC_HANDLE -nt_service_open_scm(void) -{ - SC_HANDLE hSCManager; - char *errmsg = NULL; - - nt_service_loadlibrary(); - if ((hSCManager = service_fns.OpenSCManagerA_fn( - NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL) { - errmsg = format_win32_error(GetLastError()); - printf("OpenSCManager() failed : %s\n", errmsg); - tor_free(errmsg); - } - return hSCManager; -} - -/** Open a handle to the Tor service using hSCManager. Return NULL - * on failure. */ -static SC_HANDLE -nt_service_open(SC_HANDLE hSCManager) -{ - SC_HANDLE hService; - char *errmsg = NULL; - nt_service_loadlibrary(); - if ((hService = service_fns.OpenServiceA_fn(hSCManager, GENSRV_SERVICENAME, - SERVICE_ALL_ACCESS)) == NULL) { - errmsg = format_win32_error(GetLastError()); - printf("OpenService() failed : %s\n", errmsg); - tor_free(errmsg); - } - return hService; -} - -/** Start the Tor service. Return 0 if the service is started or was - * previously running. Return -1 on error. */ -static int -nt_service_start(SC_HANDLE hService) -{ - char *errmsg = NULL; - - nt_service_loadlibrary(); - - service_fns.QueryServiceStatus_fn(hService, &service_status); - if (service_status.dwCurrentState == SERVICE_RUNNING) { - printf("Service is already running\n"); - return 0; - } - - if (service_fns.StartServiceA_fn(hService, 0, NULL)) { - /* Loop until the service has finished attempting to start */ - while (service_fns.QueryServiceStatus_fn(hService, &service_status) && - (service_status.dwCurrentState == SERVICE_START_PENDING)) { - Sleep(500); - } - - /* Check if it started successfully or not */ - if (service_status.dwCurrentState == SERVICE_RUNNING) { - printf("Service started successfully\n"); - return 0; - } else { - errmsg = format_win32_error(service_status.dwWin32ExitCode); - printf("Service failed to start : %s\n", errmsg); - tor_free(errmsg); - } - } else { - errmsg = format_win32_error(GetLastError()); - printf("StartService() failed : %s\n", errmsg); - tor_free(errmsg); - } - return -1; -} - -/** Stop the Tor service. Return 0 if the service is stopped or was not - * previously running. Return -1 on error. */ -static int -nt_service_stop(SC_HANDLE hService) -{ -/** Wait at most 10 seconds for the service to stop. */ -#define MAX_SERVICE_WAIT_TIME 10 - int wait_time; - char *errmsg = NULL; - nt_service_loadlibrary(); - - service_fns.QueryServiceStatus_fn(hService, &service_status); - if (service_status.dwCurrentState == SERVICE_STOPPED) { - printf("Service is already stopped\n"); - return 0; - } - - if (service_fns.ControlService_fn(hService, SERVICE_CONTROL_STOP, - &service_status)) { - wait_time = 0; - while (service_fns.QueryServiceStatus_fn(hService, &service_status) && - (service_status.dwCurrentState != SERVICE_STOPPED) && - (wait_time < MAX_SERVICE_WAIT_TIME)) { - Sleep(1000); - wait_time++; - } - if (service_status.dwCurrentState == SERVICE_STOPPED) { - printf("Service stopped successfully\n"); - return 0; - } else if (wait_time == MAX_SERVICE_WAIT_TIME) { - printf("Service did not stop within %d seconds.\n", wait_time); - } else { - errmsg = format_win32_error(GetLastError()); - printf("QueryServiceStatus() failed : %s\n",errmsg); - tor_free(errmsg); - } - } else { - errmsg = format_win32_error(GetLastError()); - printf("ControlService() failed : %s\n", errmsg); - tor_free(errmsg); - } - return -1; -} - -/** Build a formatted command line used for the NT service. Return a - * pointer to the formatted string on success, or NULL on failure. Set - * *using_default_torrc to true if we're going to use the default - * location to torrc, or 1 if an option was specified on the command line. - */ -static char * -nt_service_command_line(int *using_default_torrc) -{ - TCHAR tor_exe[MAX_PATH+1]; - char tor_exe_ascii[MAX_PATH*2+1]; - char *command=NULL, *options=NULL; - smartlist_t *sl; - int i; - *using_default_torrc = 1; - - /* Get the location of tor.exe */ - if (0 == GetModuleFileName(NULL, tor_exe, MAX_PATH)) - return NULL; - - /* Get the service arguments */ - sl = smartlist_new(); - for (i = 1; i < backup_argc; ++i) { - if (!strcmp(backup_argv[i], "--options") || - !strcmp(backup_argv[i], "-options")) { - while (++i < backup_argc) { - if (!strcmp(backup_argv[i], "-f")) - *using_default_torrc = 0; - smartlist_add(sl, backup_argv[i]); - } - } - } - if (smartlist_len(sl)) - options = smartlist_join_strings(sl,"\" \"",0,NULL); - smartlist_free(sl); - -#ifdef UNICODE - wcstombs(tor_exe_ascii, tor_exe, sizeof(tor_exe_ascii)); - tor_exe_ascii[sizeof(tor_exe_ascii)-1] = '\0'; -#else - strlcpy(tor_exe_ascii, tor_exe, sizeof(tor_exe_ascii)); -#endif /* defined(UNICODE) */ - - /* Allocate a string for the NT service command line and */ - /* Format the service command */ - if (options) { - tor_asprintf(&command, "\"%s\" --nt-service \"%s\"", - tor_exe_ascii, options); - } else { /* ! options */ - tor_asprintf(&command, "\"%s\" --nt-service", tor_exe_ascii); - } - - tor_free(options); - return command; -} - -/** Creates a Tor NT service, set to start on boot. The service will be - * started if installation succeeds. Returns 0 on success, or -1 on - * failure. */ -static int -nt_service_install(int argc, char **argv) -{ - /* Notes about developing NT services: - * - * 1. Don't count on your CWD. If an absolute path is not given, the - * fopen() function goes wrong. - * 2. The parameters given to the nt_service_body() function differ - * from those given to main() function. - */ - - SC_HANDLE hSCManager = NULL; - SC_HANDLE hService = NULL; - SERVICE_DESCRIPTIONA sdBuff; - char *command; - char *errmsg; - const char *user_acct = NULL; - const char *password = ""; - int i; - OSVERSIONINFOEX info; - SID_NAME_USE sidUse; - DWORD sidLen = 0, domainLen = 0; - int is_win2k_or_worse = 0; - int using_default_torrc = 0; - - nt_service_loadlibrary(); - - /* Open the service control manager so we can create a new service */ - if ((hSCManager = nt_service_open_scm()) == NULL) - return -1; - /* Build the command line used for the service */ - if ((command = nt_service_command_line(&using_default_torrc)) == NULL) { - printf("Unable to build service command line.\n"); - service_fns.CloseServiceHandle_fn(hSCManager); - return -1; - } - - for (i=1; i < argc; ++i) { - if (!strcmp(argv[i], "--user") && i+1"); - - /* Create the Tor service, set to auto-start on boot */ - if ((hService = service_fns.CreateServiceA_fn(hSCManager, GENSRV_SERVICENAME, - GENSRV_DISPLAYNAME, - SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, - command, NULL, NULL, NULL, - user_acct, password)) == NULL) { - errmsg = format_win32_error(GetLastError()); - printf("CreateService() failed : %s\n", errmsg); - service_fns.CloseServiceHandle_fn(hSCManager); - tor_free(errmsg); - tor_free(command); - return -1; - } - printf("Done with CreateService.\n"); - - /* Set the service's description */ - sdBuff.lpDescription = (char*)GENSRV_DESCRIPTION; - service_fns.ChangeServiceConfig2A_fn(hService, SERVICE_CONFIG_DESCRIPTION, - &sdBuff); - printf("Service installed successfully\n"); - - /* Start the service initially */ - nt_service_start(hService); - - service_fns.CloseServiceHandle_fn(hService); - service_fns.CloseServiceHandle_fn(hSCManager); - tor_free(command); - - return 0; -} - -/** Removes the Tor NT service. Returns 0 if the service was successfully - * removed, or -1 on error. */ -static int -nt_service_remove(void) -{ - SC_HANDLE hSCManager = NULL; - SC_HANDLE hService = NULL; - char *errmsg; - - nt_service_loadlibrary(); - if ((hSCManager = nt_service_open_scm()) == NULL) - return -1; - if ((hService = nt_service_open(hSCManager)) == NULL) { - service_fns.CloseServiceHandle_fn(hSCManager); - return -1; - } - - nt_service_stop(hService); - if (service_fns.DeleteService_fn(hService) == FALSE) { - errmsg = format_win32_error(GetLastError()); - printf("DeleteService() failed : %s\n", errmsg); - tor_free(errmsg); - service_fns.CloseServiceHandle_fn(hService); - service_fns.CloseServiceHandle_fn(hSCManager); - return -1; - } - - service_fns.CloseServiceHandle_fn(hService); - service_fns.CloseServiceHandle_fn(hSCManager); - printf("Service removed successfully\n"); - - return 0; -} - -/** Starts the Tor service. Returns 0 on success, or -1 on error. */ -static int -nt_service_cmd_start(void) -{ - SC_HANDLE hSCManager; - SC_HANDLE hService; - int start; - - if ((hSCManager = nt_service_open_scm()) == NULL) - return -1; - if ((hService = nt_service_open(hSCManager)) == NULL) { - service_fns.CloseServiceHandle_fn(hSCManager); - return -1; - } - - start = nt_service_start(hService); - service_fns.CloseServiceHandle_fn(hService); - service_fns.CloseServiceHandle_fn(hSCManager); - - return start; -} - -/** Stops the Tor service. Returns 0 on success, or -1 on error. */ -static int -nt_service_cmd_stop(void) -{ - SC_HANDLE hSCManager; - SC_HANDLE hService; - int stop; - - if ((hSCManager = nt_service_open_scm()) == NULL) - return -1; - if ((hService = nt_service_open(hSCManager)) == NULL) { - service_fns.CloseServiceHandle_fn(hSCManager); - return -1; - } - - stop = nt_service_stop(hService); - service_fns.CloseServiceHandle_fn(hService); - service_fns.CloseServiceHandle_fn(hSCManager); - - return stop; -} - -int -nt_service_parse_options(int argc, char **argv, int *should_exit) -{ - backup_argv = argv; - backup_argc = argc; - *should_exit = 0; - - if ((argc >= 3) && - (!strcmp(argv[1], "-service") || !strcmp(argv[1], "--service"))) { - nt_service_loadlibrary(); - *should_exit = 1; - if (!strcmp(argv[2], "install")) - return nt_service_install(argc, argv); - if (!strcmp(argv[2], "remove")) - return nt_service_remove(); - if (!strcmp(argv[2], "start")) - return nt_service_cmd_start(); - if (!strcmp(argv[2], "stop")) - return nt_service_cmd_stop(); - printf("Unrecognized service command '%s'\n", argv[2]); - return 1; - } - if (argc >= 2) { - if (!strcmp(argv[1], "-nt-service") || !strcmp(argv[1], "--nt-service")) { - nt_service_loadlibrary(); - nt_service_main(); - *should_exit = 1; - return 0; - } - // These values have been deprecated since 0.1.1.2-alpha; we've warned - // about them since 0.1.2.7-alpha. - if (!strcmp(argv[1], "-install") || !strcmp(argv[1], "--install")) { - nt_service_loadlibrary(); - fprintf(stderr, - "The %s option is deprecated; use \"--service install\" instead.", - argv[1]); - *should_exit = 1; - return nt_service_install(argc, argv); - } - if (!strcmp(argv[1], "-remove") || !strcmp(argv[1], "--remove")) { - nt_service_loadlibrary(); - fprintf(stderr, - "The %s option is deprecated; use \"--service remove\" instead.", - argv[1]); - *should_exit = 1; - return nt_service_remove(); - } - } - *should_exit = 0; - return 0; -} - -#endif /* defined(_WIN32) */ - diff --git a/src/tor/src/or/parsecommon.c b/src/tor/src/or/parsecommon.c deleted file mode 100644 index 6c3dd3100..000000000 --- a/src/tor/src/or/parsecommon.c +++ /dev/null @@ -1,451 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file parsecommon.c - * \brief Common code to parse and validate various type of descriptors. - **/ - -#include "parsecommon.h" -#include "torlog.h" -#include "util_format.h" - -#define MIN_ANNOTATION A_PURPOSE -#define MAX_ANNOTATION A_UNKNOWN_ - -#define ALLOC_ZERO(sz) memarea_alloc_zero(area,sz) -#define ALLOC(sz) memarea_alloc(area,sz) -#define STRDUP(str) memarea_strdup(area,str) -#define STRNDUP(str,n) memarea_strndup(area,(str),(n)) - -#define RET_ERR(msg) \ - STMT_BEGIN \ - if (tok) token_clear(tok); \ - tok = ALLOC_ZERO(sizeof(directory_token_t)); \ - tok->tp = ERR_; \ - tok->error = STRDUP(msg); \ - goto done_tokenizing; \ - STMT_END - -/** Free all resources allocated for tok */ -void -token_clear(directory_token_t *tok) -{ - if (tok->key) - crypto_pk_free(tok->key); -} - -/** Read all tokens from a string between start and end, and add - * them to out. Parse according to the token rules in table. - * Caller must free tokens in out. If end is NULL, use the - * entire string. - */ -int -tokenize_string(memarea_t *area, - const char *start, const char *end, smartlist_t *out, - token_rule_t *table, int flags) -{ - const char **s; - directory_token_t *tok = NULL; - int counts[NIL_]; - int i; - int first_nonannotation; - int prev_len = smartlist_len(out); - tor_assert(area); - - s = &start; - if (!end) { - end = start+strlen(start); - } else { - /* it's only meaningful to check for nuls if we got an end-of-string ptr */ - if (memchr(start, '\0', end-start)) { - log_warn(LD_DIR, "parse error: internal NUL character."); - return -1; - } - } - for (i = 0; i < NIL_; ++i) - counts[i] = 0; - - SMARTLIST_FOREACH(out, const directory_token_t *, t, ++counts[t->tp]); - - while (*s < end && (!tok || tok->tp != EOF_)) { - tok = get_next_token(area, s, end, table); - if (tok->tp == ERR_) { - log_warn(LD_DIR, "parse error: %s", tok->error); - token_clear(tok); - return -1; - } - ++counts[tok->tp]; - smartlist_add(out, tok); - *s = eat_whitespace_eos(*s, end); - } - - if (flags & TS_NOCHECK) - return 0; - - if ((flags & TS_ANNOTATIONS_OK)) { - first_nonannotation = -1; - for (i = 0; i < smartlist_len(out); ++i) { - tok = smartlist_get(out, i); - if (tok->tp < MIN_ANNOTATION || tok->tp > MAX_ANNOTATION) { - first_nonannotation = i; - break; - } - } - if (first_nonannotation < 0) { - log_warn(LD_DIR, "parse error: item contains only annotations"); - return -1; - } - for (i=first_nonannotation; i < smartlist_len(out); ++i) { - tok = smartlist_get(out, i); - if (tok->tp >= MIN_ANNOTATION && tok->tp <= MAX_ANNOTATION) { - log_warn(LD_DIR, "parse error: Annotations mixed with keywords"); - return -1; - } - } - if ((flags & TS_NO_NEW_ANNOTATIONS)) { - if (first_nonannotation != prev_len) { - log_warn(LD_DIR, "parse error: Unexpected annotations."); - return -1; - } - } - } else { - for (i=0; i < smartlist_len(out); ++i) { - tok = smartlist_get(out, i); - if (tok->tp >= MIN_ANNOTATION && tok->tp <= MAX_ANNOTATION) { - log_warn(LD_DIR, "parse error: no annotations allowed."); - return -1; - } - } - first_nonannotation = 0; - } - for (i = 0; table[i].t; ++i) { - if (counts[table[i].v] < table[i].min_cnt) { - log_warn(LD_DIR, "Parse error: missing %s element.", table[i].t); - return -1; - } - if (counts[table[i].v] > table[i].max_cnt) { - log_warn(LD_DIR, "Parse error: too many %s elements.", table[i].t); - return -1; - } - if (table[i].pos & AT_START) { - if (smartlist_len(out) < 1 || - (tok = smartlist_get(out, first_nonannotation))->tp != table[i].v) { - log_warn(LD_DIR, "Parse error: first item is not %s.", table[i].t); - return -1; - } - } - if (table[i].pos & AT_END) { - if (smartlist_len(out) < 1 || - (tok = smartlist_get(out, smartlist_len(out)-1))->tp != table[i].v) { - log_warn(LD_DIR, "Parse error: last item is not %s.", table[i].t); - return -1; - } - } - } - return 0; -} - -/** Helper: parse space-separated arguments from the string s ending at - * eol, and store them in the args field of tok. Store the - * number of parsed elements into the n_args field of tok. Allocate - * all storage in area. Return the number of arguments parsed, or - * return -1 if there was an insanely high number of arguments. */ -static inline int -get_token_arguments(memarea_t *area, directory_token_t *tok, - const char *s, const char *eol) -{ -/** Largest number of arguments we'll accept to any token, ever. */ -#define MAX_ARGS 512 - char *mem = memarea_strndup(area, s, eol-s); - char *cp = mem; - int j = 0; - char *args[MAX_ARGS]; - memset(args, 0, sizeof(args)); - while (*cp) { - if (j == MAX_ARGS) - return -1; - args[j++] = cp; - cp = (char*)find_whitespace(cp); - if (!cp || !*cp) - break; /* End of the line. */ - *cp++ = '\0'; - cp = (char*)eat_whitespace(cp); - } - tok->n_args = j; - tok->args = memarea_memdup(area, args, j*sizeof(char*)); - return j; -#undef MAX_ARGS -} - -/** Helper: make sure that the token tok with keyword kwd obeys - * the object syntax of o_syn. Allocate all storage in area. - * Return tok on success, or a new ERR_ token if the token didn't - * conform to the syntax we wanted. - **/ -static inline directory_token_t * -token_check_object(memarea_t *area, const char *kwd, - directory_token_t *tok, obj_syntax o_syn) -{ - char ebuf[128]; - switch (o_syn) { - case NO_OBJ: - /* No object is allowed for this token. */ - if (tok->object_body) { - tor_snprintf(ebuf, sizeof(ebuf), "Unexpected object for %s", kwd); - RET_ERR(ebuf); - } - if (tok->key) { - tor_snprintf(ebuf, sizeof(ebuf), "Unexpected public key for %s", kwd); - RET_ERR(ebuf); - } - break; - case NEED_OBJ: - /* There must be a (non-key) object. */ - if (!tok->object_body) { - tor_snprintf(ebuf, sizeof(ebuf), "Missing object for %s", kwd); - RET_ERR(ebuf); - } - break; - case NEED_KEY_1024: /* There must be a 1024-bit public key. */ - case NEED_SKEY_1024: /* There must be a 1024-bit private key. */ - if (tok->key && crypto_pk_num_bits(tok->key) != PK_BYTES*8) { - tor_snprintf(ebuf, sizeof(ebuf), "Wrong size on key for %s: %d bits", - kwd, crypto_pk_num_bits(tok->key)); - RET_ERR(ebuf); - } - /* fall through */ - case NEED_KEY: /* There must be some kind of key. */ - if (!tok->key) { - tor_snprintf(ebuf, sizeof(ebuf), "Missing public key for %s", kwd); - RET_ERR(ebuf); - } - if (o_syn != NEED_SKEY_1024) { - if (crypto_pk_key_is_private(tok->key)) { - tor_snprintf(ebuf, sizeof(ebuf), - "Private key given for %s, which wants a public key", kwd); - RET_ERR(ebuf); - } - } else { /* o_syn == NEED_SKEY_1024 */ - if (!crypto_pk_key_is_private(tok->key)) { - tor_snprintf(ebuf, sizeof(ebuf), - "Public key given for %s, which wants a private key", kwd); - RET_ERR(ebuf); - } - } - break; - case OBJ_OK: - /* Anything goes with this token. */ - break; - } - - done_tokenizing: - return tok; -} - -/** Helper function: read the next token from *s, advance *s to the end of the - * token, and return the parsed token. Parse *s according to the list - * of tokens in table. - */ -directory_token_t * -get_next_token(memarea_t *area, - const char **s, const char *eos, token_rule_t *table) -{ - /** Reject any object at least this big; it is probably an overflow, an - * attack, a bug, or some other nonsense. */ -#define MAX_UNPARSED_OBJECT_SIZE (128*1024) - /** Reject any line at least this big; it is probably an overflow, an - * attack, a bug, or some other nonsense. */ -#define MAX_LINE_LENGTH (128*1024) - - const char *next, *eol, *obstart; - size_t obname_len; - int i; - directory_token_t *tok; - obj_syntax o_syn = NO_OBJ; - char ebuf[128]; - const char *kwd = ""; - - tor_assert(area); - tok = ALLOC_ZERO(sizeof(directory_token_t)); - tok->tp = ERR_; - - /* Set *s to first token, eol to end-of-line, next to after first token */ - *s = eat_whitespace_eos(*s, eos); /* eat multi-line whitespace */ - tor_assert(eos >= *s); - eol = memchr(*s, '\n', eos-*s); - if (!eol) - eol = eos; - if (eol - *s > MAX_LINE_LENGTH) { - RET_ERR("Line far too long"); - } - - next = find_whitespace_eos(*s, eol); - - if (!strcmp_len(*s, "opt", next-*s)) { - /* Skip past an "opt" at the start of the line. */ - *s = eat_whitespace_eos_no_nl(next, eol); - next = find_whitespace_eos(*s, eol); - } else if (*s == eos) { /* If no "opt", and end-of-line, line is invalid */ - RET_ERR("Unexpected EOF"); - } - - /* Search the table for the appropriate entry. (I tried a binary search - * instead, but it wasn't any faster.) */ - for (i = 0; table[i].t ; ++i) { - if (!strcmp_len(*s, table[i].t, next-*s)) { - /* We've found the keyword. */ - kwd = table[i].t; - tok->tp = table[i].v; - o_syn = table[i].os; - *s = eat_whitespace_eos_no_nl(next, eol); - /* We go ahead whether there are arguments or not, so that tok->args is - * always set if we want arguments. */ - if (table[i].concat_args) { - /* The keyword takes the line as a single argument */ - tok->args = ALLOC(sizeof(char*)); - tok->args[0] = STRNDUP(*s,eol-*s); /* Grab everything on line */ - tok->n_args = 1; - } else { - /* This keyword takes multiple arguments. */ - if (get_token_arguments(area, tok, *s, eol)<0) { - tor_snprintf(ebuf, sizeof(ebuf),"Far too many arguments to %s", kwd); - RET_ERR(ebuf); - } - *s = eol; - } - if (tok->n_args < table[i].min_args) { - tor_snprintf(ebuf, sizeof(ebuf), "Too few arguments to %s", kwd); - RET_ERR(ebuf); - } else if (tok->n_args > table[i].max_args) { - tor_snprintf(ebuf, sizeof(ebuf), "Too many arguments to %s", kwd); - RET_ERR(ebuf); - } - break; - } - } - - if (tok->tp == ERR_) { - /* No keyword matched; call it an "K_opt" or "A_unrecognized" */ - if (*s < eol && **s == '@') - tok->tp = A_UNKNOWN_; - else - tok->tp = K_OPT; - tok->args = ALLOC(sizeof(char*)); - tok->args[0] = STRNDUP(*s, eol-*s); - tok->n_args = 1; - o_syn = OBJ_OK; - } - - /* Check whether there's an object present */ - *s = eat_whitespace_eos(eol, eos); /* Scan from end of first line */ - tor_assert(eos >= *s); - eol = memchr(*s, '\n', eos-*s); - if (!eol || eol-*s<11 || strcmpstart(*s, "-----BEGIN ")) /* No object. */ - goto check_object; - - obstart = *s; /* Set obstart to start of object spec */ - if (*s+16 >= eol || memchr(*s+11,'\0',eol-*s-16) || /* no short lines, */ - strcmp_len(eol-5, "-----", 5) || /* nuls or invalid endings */ - (eol-*s) > MAX_UNPARSED_OBJECT_SIZE) { /* name too long */ - RET_ERR("Malformed object: bad begin line"); - } - tok->object_type = STRNDUP(*s+11, eol-*s-16); - obname_len = eol-*s-16; /* store objname length here to avoid a strlen() */ - *s = eol+1; /* Set *s to possible start of object data (could be eos) */ - - /* Go to the end of the object */ - next = tor_memstr(*s, eos-*s, "-----END "); - if (!next) { - RET_ERR("Malformed object: missing object end line"); - } - tor_assert(eos >= next); - eol = memchr(next, '\n', eos-next); - if (!eol) /* end-of-line marker, or eos if there's no '\n' */ - eol = eos; - /* Validate the ending tag, which should be 9 + NAME + 5 + eol */ - if ((size_t)(eol-next) != 9+obname_len+5 || - strcmp_len(next+9, tok->object_type, obname_len) || - strcmp_len(eol-5, "-----", 5)) { - tor_snprintf(ebuf, sizeof(ebuf), "Malformed object: mismatched end tag %s", - tok->object_type); - ebuf[sizeof(ebuf)-1] = '\0'; - RET_ERR(ebuf); - } - if (next - *s > MAX_UNPARSED_OBJECT_SIZE) - RET_ERR("Couldn't parse object: missing footer or object much too big."); - - if (!strcmp(tok->object_type, "RSA PUBLIC KEY")) { /* If it's a public key */ - tok->key = crypto_pk_new(); - if (crypto_pk_read_public_key_from_string(tok->key, obstart, eol-obstart)) - RET_ERR("Couldn't parse public key."); - } else if (!strcmp(tok->object_type, "RSA PRIVATE KEY")) { /* private key */ - tok->key = crypto_pk_new(); - if (crypto_pk_read_private_key_from_string(tok->key, obstart, eol-obstart)) - RET_ERR("Couldn't parse private key."); - } else { /* If it's something else, try to base64-decode it */ - int r; - tok->object_body = ALLOC(next-*s); /* really, this is too much RAM. */ - r = base64_decode(tok->object_body, next-*s, *s, next-*s); - if (r<0) - RET_ERR("Malformed object: bad base64-encoded data"); - tok->object_size = r; - } - *s = eol; - - check_object: - tok = token_check_object(area, kwd, tok, o_syn); - - done_tokenizing: - return tok; - -#undef RET_ERR -#undef ALLOC -#undef ALLOC_ZERO -#undef STRDUP -#undef STRNDUP -} - -/** Find the first token in s whose keyword is keyword; fail - * with an assert if no such keyword is found. - */ -directory_token_t * -find_by_keyword_(smartlist_t *s, directory_keyword keyword, - const char *keyword_as_string) -{ - directory_token_t *tok = find_opt_by_keyword(s, keyword); - if (PREDICT_UNLIKELY(!tok)) { - log_err(LD_BUG, "Missing %s [%d] in directory object that should have " - "been validated. Internal error.", keyword_as_string, (int)keyword); - tor_assert(tok); - } - return tok; -} - -/** Find the first token in s whose keyword is keyword; return - * NULL if no such keyword is found. - */ -directory_token_t * -find_opt_by_keyword(smartlist_t *s, directory_keyword keyword) -{ - SMARTLIST_FOREACH(s, directory_token_t *, t, if (t->tp == keyword) return t); - return NULL; -} - -/** If there are any directory_token_t entries in s whose keyword is - * k, return a newly allocated smartlist_t containing all such entries, - * in the same order in which they occur in s. Otherwise return - * NULL. */ -smartlist_t * -find_all_by_keyword(const smartlist_t *s, directory_keyword k) -{ - smartlist_t *out = NULL; - SMARTLIST_FOREACH(s, directory_token_t *, t, - if (t->tp == k) { - if (!out) - out = smartlist_new(); - smartlist_add(out, t); - }); - return out; -} - diff --git a/src/tor/src/or/parsecommon.h b/src/tor/src/or/parsecommon.h deleted file mode 100644 index 903d94478..000000000 --- a/src/tor/src/or/parsecommon.h +++ /dev/null @@ -1,322 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file parsecommon.h - * \brief Header file for parsecommon.c - **/ - -#ifndef TOR_PARSECOMMON_H -#define TOR_PARSECOMMON_H - -#include "container.h" -#include "crypto.h" -#include "memarea.h" - -/** Enumeration of possible token types. The ones starting with K_ correspond -* to directory 'keywords'. A_ is for an annotation, R or C is related to -* hidden services, ERR_ is an error in the tokenizing process, EOF_ is an -* end-of-file marker, and NIL_ is used to encode not-a-token. -*/ -typedef enum { - K_ACCEPT = 0, - K_ACCEPT6, - K_DIRECTORY_SIGNATURE, - K_RECOMMENDED_SOFTWARE, - K_REJECT, - K_REJECT6, - K_ROUTER, - K_SIGNED_DIRECTORY, - K_SIGNING_KEY, - K_ONION_KEY, - K_ONION_KEY_NTOR, - K_ROUTER_SIGNATURE, - K_PUBLISHED, - K_RUNNING_ROUTERS, - K_ROUTER_STATUS, - K_PLATFORM, - K_PROTO, - K_OPT, - K_BANDWIDTH, - K_CONTACT, - K_NETWORK_STATUS, - K_UPTIME, - K_DIR_SIGNING_KEY, - K_FAMILY, - K_FINGERPRINT, - K_HIBERNATING, - K_READ_HISTORY, - K_WRITE_HISTORY, - K_NETWORK_STATUS_VERSION, - K_DIR_SOURCE, - K_DIR_OPTIONS, - K_CLIENT_VERSIONS, - K_SERVER_VERSIONS, - K_RECOMMENDED_CLIENT_PROTOCOLS, - K_RECOMMENDED_RELAY_PROTOCOLS, - K_REQUIRED_CLIENT_PROTOCOLS, - K_REQUIRED_RELAY_PROTOCOLS, - K_OR_ADDRESS, - K_ID, - K_P, - K_P6, - K_R, - K_A, - K_S, - K_V, - K_W, - K_M, - K_EXTRA_INFO, - K_EXTRA_INFO_DIGEST, - K_CACHES_EXTRA_INFO, - K_HIDDEN_SERVICE_DIR, - K_ALLOW_SINGLE_HOP_EXITS, - K_IPV6_POLICY, - K_ROUTER_SIG_ED25519, - K_IDENTITY_ED25519, - K_MASTER_KEY_ED25519, - K_ONION_KEY_CROSSCERT, - K_NTOR_ONION_KEY_CROSSCERT, - - K_DIRREQ_END, - K_DIRREQ_V2_IPS, - K_DIRREQ_V3_IPS, - K_DIRREQ_V2_REQS, - K_DIRREQ_V3_REQS, - K_DIRREQ_V2_SHARE, - K_DIRREQ_V3_SHARE, - K_DIRREQ_V2_RESP, - K_DIRREQ_V3_RESP, - K_DIRREQ_V2_DIR, - K_DIRREQ_V3_DIR, - K_DIRREQ_V2_TUN, - K_DIRREQ_V3_TUN, - K_ENTRY_END, - K_ENTRY_IPS, - K_CELL_END, - K_CELL_PROCESSED, - K_CELL_QUEUED, - K_CELL_TIME, - K_CELL_CIRCS, - K_EXIT_END, - K_EXIT_WRITTEN, - K_EXIT_READ, - K_EXIT_OPENED, - - K_DIR_KEY_CERTIFICATE_VERSION, - K_DIR_IDENTITY_KEY, - K_DIR_KEY_PUBLISHED, - K_DIR_KEY_EXPIRES, - K_DIR_KEY_CERTIFICATION, - K_DIR_KEY_CROSSCERT, - K_DIR_ADDRESS, - K_DIR_TUNNELLED, - - K_VOTE_STATUS, - K_VALID_AFTER, - K_FRESH_UNTIL, - K_VALID_UNTIL, - K_VOTING_DELAY, - - K_KNOWN_FLAGS, - K_PARAMS, - K_BW_WEIGHTS, - K_VOTE_DIGEST, - K_CONSENSUS_DIGEST, - K_ADDITIONAL_DIGEST, - K_ADDITIONAL_SIGNATURE, - K_CONSENSUS_METHODS, - K_CONSENSUS_METHOD, - K_LEGACY_DIR_KEY, - K_DIRECTORY_FOOTER, - K_SIGNING_CERT_ED, - K_SR_FLAG, - K_COMMIT, - K_PREVIOUS_SRV, - K_CURRENT_SRV, - K_PACKAGE, - - A_PURPOSE, - A_LAST_LISTED, - A_UNKNOWN_, - - R_RENDEZVOUS_SERVICE_DESCRIPTOR, - R_VERSION, - R_PERMANENT_KEY, - R_SECRET_ID_PART, - R_PUBLICATION_TIME, - R_PROTOCOL_VERSIONS, - R_INTRODUCTION_POINTS, - R_SIGNATURE, - - R_HS_DESCRIPTOR, /* From version 3, this MUST be generic to all future - descriptor versions thus making it R_. */ - R3_DESC_LIFETIME, - R3_DESC_SIGNING_CERT, - R3_REVISION_COUNTER, - R3_SUPERENCRYPTED, - R3_SIGNATURE, - R3_CREATE2_FORMATS, - R3_INTRO_AUTH_REQUIRED, - R3_SINGLE_ONION_SERVICE, - R3_INTRODUCTION_POINT, - R3_INTRO_ONION_KEY, - R3_INTRO_AUTH_KEY, - R3_INTRO_ENC_KEY, - R3_INTRO_ENC_KEY_CERT, - R3_INTRO_LEGACY_KEY, - R3_INTRO_LEGACY_KEY_CERT, - R3_DESC_AUTH_TYPE, - R3_DESC_AUTH_KEY, - R3_DESC_AUTH_CLIENT, - R3_ENCRYPTED, - - R_IPO_IDENTIFIER, - R_IPO_IP_ADDRESS, - R_IPO_ONION_PORT, - R_IPO_ONION_KEY, - R_IPO_SERVICE_KEY, - - C_CLIENT_NAME, - C_DESCRIPTOR_COOKIE, - C_CLIENT_KEY, - - ERR_, - EOF_, - NIL_ -} directory_keyword; - -/** Structure to hold a single directory token. - * - * We parse a directory by breaking it into "tokens", each consisting - * of a keyword, a line full of arguments, and a binary object. The - * arguments and object are both optional, depending on the keyword - * type. - * - * This structure is only allocated in memareas; do not allocate it on - * the heap, or token_clear() won't work. - */ -typedef struct directory_token_t { - directory_keyword tp; /**< Type of the token. */ - int n_args:30; /**< Number of elements in args */ - char **args; /**< Array of arguments from keyword line. */ - - char *object_type; /**< -----BEGIN [object_type]-----*/ - size_t object_size; /**< Bytes in object_body */ - char *object_body; /**< Contents of object, base64-decoded. */ - - crypto_pk_t *key; /**< For public keys only. Heap-allocated. */ - - char *error; /**< For ERR_ tokens only. */ -} directory_token_t; - -/** We use a table of rules to decide how to parse each token type. */ - -/** Rules for whether the keyword needs an object. */ -typedef enum { - NO_OBJ, /**< No object, ever. */ - NEED_OBJ, /**< Object is required. */ - NEED_SKEY_1024,/**< Object is required, and must be a 1024 bit private key */ - NEED_KEY_1024, /**< Object is required, and must be a 1024 bit public key */ - NEED_KEY, /**< Object is required, and must be a public key. */ - OBJ_OK, /**< Object is optional. */ -} obj_syntax; - -#define AT_START 1 -#define AT_END 2 - -#define TS_ANNOTATIONS_OK 1 -#define TS_NOCHECK 2 -#define TS_NO_NEW_ANNOTATIONS 4 - -/** - * @name macros for defining token rules - * - * Helper macros to define token tables. 's' is a string, 't' is a - * directory_keyword, 'a' is a trio of argument multiplicities, and 'o' is an - * object syntax. - */ -/**@{*/ - -/** Appears to indicate the end of a table. */ -#define END_OF_TABLE { NULL, NIL_, 0,0,0, NO_OBJ, 0, INT_MAX, 0, 0 } -/** An item with no restrictions: used for obsolete document types */ -#define T(s,t,a,o) { s, t, a, o, 0, INT_MAX, 0, 0 } -/** An item with no restrictions on multiplicity or location. */ -#define T0N(s,t,a,o) { s, t, a, o, 0, INT_MAX, 0, 0 } -/** An item that must appear exactly once */ -#define T1(s,t,a,o) { s, t, a, o, 1, 1, 0, 0 } -/** An item that must appear exactly once, at the start of the document */ -#define T1_START(s,t,a,o) { s, t, a, o, 1, 1, AT_START, 0 } -/** An item that must appear exactly once, at the end of the document */ -#define T1_END(s,t,a,o) { s, t, a, o, 1, 1, AT_END, 0 } -/** An item that must appear one or more times */ -#define T1N(s,t,a,o) { s, t, a, o, 1, INT_MAX, 0, 0 } -/** An item that must appear no more than once */ -#define T01(s,t,a,o) { s, t, a, o, 0, 1, 0, 0 } -/** An annotation that must appear no more than once */ -#define A01(s,t,a,o) { s, t, a, o, 0, 1, 0, 1 } - -/** Argument multiplicity: any number of arguments. */ -#define ARGS 0,INT_MAX,0 -/** Argument multiplicity: no arguments. */ -#define NO_ARGS 0,0,0 -/** Argument multiplicity: concatenate all arguments. */ -#define CONCAT_ARGS 1,1,1 -/** Argument multiplicity: at least n arguments. */ -#define GE(n) n,INT_MAX,0 -/** Argument multiplicity: exactly n arguments. */ -#define EQ(n) n,n,0 -/**@}*/ - -/** Determines the parsing rules for a single token type. */ -typedef struct token_rule_t { - /** The string value of the keyword identifying the type of item. */ - const char *t; - /** The corresponding directory_keyword enum. */ - directory_keyword v; - /** Minimum number of arguments for this item */ - int min_args; - /** Maximum number of arguments for this item */ - int max_args; - /** If true, we concatenate all arguments for this item into a single - * string. */ - int concat_args; - /** Requirements on object syntax for this item. */ - obj_syntax os; - /** Lowest number of times this item may appear in a document. */ - int min_cnt; - /** Highest number of times this item may appear in a document. */ - int max_cnt; - /** One or more of AT_START/AT_END to limit where the item may appear in a - * document. */ - int pos; - /** True iff this token is an annotation. */ - int is_annotation; -} token_rule_t; - -void token_clear(directory_token_t *tok); - -int tokenize_string(memarea_t *area, - const char *start, const char *end, - smartlist_t *out, - token_rule_t *table, - int flags); -directory_token_t *get_next_token(memarea_t *area, - const char **s, - const char *eos, - token_rule_t *table); - -directory_token_t *find_by_keyword_(smartlist_t *s, - directory_keyword keyword, - const char *keyword_str); - -#define find_by_keyword(s, keyword) \ - find_by_keyword_((s), (keyword), #keyword) - -directory_token_t *find_opt_by_keyword(smartlist_t *s, - directory_keyword keyword); -smartlist_t * find_all_by_keyword(const smartlist_t *s, directory_keyword k); - -#endif /* !defined(TOR_PARSECOMMON_H) */ - diff --git a/src/tor/src/or/periodic.c b/src/tor/src/or/periodic.c deleted file mode 100644 index 6896b41c8..000000000 --- a/src/tor/src/or/periodic.c +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file periodic.c - * - * \brief Generic backend for handling periodic events. - * - * The events in this module are used by main.c to track items that need - * to fire once every N seconds, possibly picking a new interval each time - * that they fire. See periodic_events[] in main.c for examples. - */ - -#include "or.h" -#include "compat_libevent.h" -#include "config.h" -#include "periodic.h" - -#include - -/** We disable any interval greater than this number of seconds, on the - * grounds that it is probably an absolute time mistakenly passed in as a - * relative time. - */ -static const int MAX_INTERVAL = 10 * 365 * 86400; - -/** Set the event event to run in next_interval seconds from - * now. */ -static void -periodic_event_set_interval(periodic_event_item_t *event, - time_t next_interval) -{ - tor_assert(next_interval < MAX_INTERVAL); - struct timeval tv; - tv.tv_sec = next_interval; - tv.tv_usec = 0; - event_add(event->ev, &tv); -} - -/** Wraps dispatches for periodic events, data will be a pointer to the - * event that needs to be called */ -static void -periodic_event_dispatch(evutil_socket_t fd, short what, void *data) -{ - (void)fd; - (void)what; - periodic_event_item_t *event = data; - - time_t now = time(NULL); - const or_options_t *options = get_options(); -// log_debug(LD_GENERAL, "Dispatching %s", event->name); - int r = event->fn(now, options); - int next_interval = 0; - - /* update the last run time if action was taken */ - if (r==0) { - log_err(LD_BUG, "Invalid return value for periodic event from %s.", - event->name); - tor_assert(r != 0); - } else if (r > 0) { - event->last_action_time = now; - /* If the event is meant to happen after ten years, that's likely - * a bug, and somebody gave an absolute time rather than an interval. - */ - tor_assert(r < MAX_INTERVAL); - next_interval = r; - } else { - /* no action was taken, it is likely a precondition failed, - * we should reschedule for next second incase the precondition - * passes then */ - next_interval = 1; - } - -// log_debug(LD_GENERAL, "Scheduling %s for %d seconds", event->name, -// next_interval); - struct timeval tv = { next_interval , 0 }; - event_add(event->ev, &tv); -} - -/** Schedules event to run as soon as possible from now. */ -void -periodic_event_reschedule(periodic_event_item_t *event) -{ - periodic_event_set_interval(event, 1); -} - -/** Initializes the libevent backend for a periodic event. */ -void -periodic_event_setup(periodic_event_item_t *event) -{ - if (event->ev) { /* Already setup? This is a bug */ - log_err(LD_BUG, "Initial dispatch should only be done once."); - tor_assert(0); - } - - event->ev = tor_event_new(tor_libevent_get_base(), - -1, 0, - periodic_event_dispatch, - event); - tor_assert(event->ev); -} - -/** Handles initial dispatch for periodic events. It should happen 1 second - * after the events are created to mimic behaviour before #3199's refactor */ -void -periodic_event_launch(periodic_event_item_t *event) -{ - if (! event->ev) { /* Not setup? This is a bug */ - log_err(LD_BUG, "periodic_event_launch without periodic_event_setup"); - tor_assert(0); - } - - // Initial dispatch - periodic_event_dispatch(-1, EV_TIMEOUT, event); -} - -/** Release all storage associated with event */ -void -periodic_event_destroy(periodic_event_item_t *event) -{ - if (!event) - return; - tor_event_free(event->ev); - event->last_action_time = 0; -} - diff --git a/src/tor/src/or/periodic.h b/src/tor/src/or/periodic.h deleted file mode 100644 index 8baf3994e..000000000 --- a/src/tor/src/or/periodic.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PERIODIC_H -#define TOR_PERIODIC_H - -#define PERIODIC_EVENT_NO_UPDATE (-1) - -/** Callback function for a periodic event to take action. The return value -* influences the next time the function will get called. Return -* PERIODIC_EVENT_NO_UPDATE to not update last_action_time and be polled -* again in the next second. If a positive value is returned it will update the -* interval time. */ -typedef int (*periodic_event_helper_t)(time_t now, - const or_options_t *options); - -struct event; - -/** A single item for the periodic-events-function table. */ -typedef struct periodic_event_item_t { - periodic_event_helper_t fn; /**< The function to run the event */ - time_t last_action_time; /**< The last time the function did something */ - struct event *ev; /**< Libevent callback we're using to implement this */ - const char *name; /**< Name of the function -- for debug */ -} periodic_event_item_t; - -/** events will get their interval from first execution */ -#define PERIODIC_EVENT(fn) { fn##_callback, 0, NULL, #fn } -#define END_OF_PERIODIC_EVENTS { NULL, 0, NULL, NULL } - -void periodic_event_launch(periodic_event_item_t *event); -void periodic_event_setup(periodic_event_item_t *event); -void periodic_event_destroy(periodic_event_item_t *event); -void periodic_event_reschedule(periodic_event_item_t *event); - -#endif /* !defined(TOR_PERIODIC_H) */ - diff --git a/src/tor/src/or/policies.c b/src/tor/src/or/policies.c deleted file mode 100644 index a5bde2fe7..000000000 --- a/src/tor/src/or/policies.c +++ /dev/null @@ -1,3131 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file policies.c - * \brief Code to parse and use address policies and exit policies. - * - * We have two key kinds of address policy: full and compressed. A full - * policy is an array of accept/reject patterns, to be applied in order. - * A short policy is simply a list of ports. This module handles both - * kinds, including generic functions to apply them to addresses, and - * also including code to manage the global policies that we apply to - * incoming and outgoing connections. - **/ - -#define POLICIES_PRIVATE - -#include "or.h" -#include "bridges.h" -#include "config.h" -#include "dirserv.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerparse.h" -#include "geoip.h" -#include "ht.h" - -/** Policy that addresses for incoming SOCKS connections must match. */ -static smartlist_t *socks_policy = NULL; -/** Policy that addresses for incoming directory connections must match. */ -static smartlist_t *dir_policy = NULL; -/** Policy that addresses for incoming router descriptors must match in order - * to be published by us. */ -static smartlist_t *authdir_reject_policy = NULL; -/** Policy that addresses for incoming router descriptors must match in order - * to be marked as valid in our networkstatus. */ -static smartlist_t *authdir_invalid_policy = NULL; -/** Policy that addresses for incoming router descriptors must not - * match in order to not be marked as BadExit. */ -static smartlist_t *authdir_badexit_policy = NULL; - -/** Parsed addr_policy_t describing which addresses we believe we can start - * circuits at. */ -static smartlist_t *reachable_or_addr_policy = NULL; -/** Parsed addr_policy_t describing which addresses we believe we can connect - * to directories at. */ -static smartlist_t *reachable_dir_addr_policy = NULL; - -/** Element of an exit policy summary */ -typedef struct policy_summary_item_t { - uint16_t prt_min; /**< Lowest port number to accept/reject. */ - uint16_t prt_max; /**< Highest port number to accept/reject. */ - uint64_t reject_count; /**< Number of IP-Addresses that are rejected to - this port range. */ - unsigned int accepted:1; /** Has this port already been accepted */ -} policy_summary_item_t; - -/** Private networks. This list is used in two places, once to expand the - * "private" keyword when parsing our own exit policy, secondly to ignore - * just such networks when building exit policy summaries. It is important - * that all authorities agree on that list when creating summaries, so don't - * just change this without a proper migration plan and a proposal and stuff. - */ -static const char *private_nets[] = { - "0.0.0.0/8", "169.254.0.0/16", - "127.0.0.0/8", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12", - "[::]/8", - "[fc00::]/7", "[fe80::]/10", "[fec0::]/10", "[ff00::]/8", "[::]/127", - NULL -}; - -static int policies_parse_exit_policy_internal( - config_line_t *cfg, - smartlist_t **dest, - int ipv6_exit, - int rejectprivate, - const smartlist_t *configured_addresses, - int reject_interface_addresses, - int reject_configured_port_addresses, - int add_default_policy, - int add_reduced_policy); - -/** Replace all "private" entries in *policy with their expanded - * equivalents. */ -void -policy_expand_private(smartlist_t **policy) -{ - uint16_t port_min, port_max; - - int i; - smartlist_t *tmp; - - if (!*policy) /*XXXX disallow NULL policies? */ - return; - - tmp = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, p) { - if (! p->is_private) { - smartlist_add(tmp, p); - continue; - } - for (i = 0; private_nets[i]; ++i) { - addr_policy_t newpolicy; - memcpy(&newpolicy, p, sizeof(addr_policy_t)); - newpolicy.is_private = 0; - newpolicy.is_canonical = 0; - if (tor_addr_parse_mask_ports(private_nets[i], 0, - &newpolicy.addr, - &newpolicy.maskbits, &port_min, &port_max)<0) { - tor_assert_unreached(); - } - smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy)); - } - addr_policy_free(p); - } SMARTLIST_FOREACH_END(p); - - smartlist_free(*policy); - *policy = tmp; -} - -/** Expand each of the AF_UNSPEC elements in *policy (which indicate - * protocol-neutral wildcards) into a pair of wildcard elements: one IPv4- - * specific and one IPv6-specific. */ -void -policy_expand_unspec(smartlist_t **policy) -{ - smartlist_t *tmp; - if (!*policy) - return; - - tmp = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, p) { - sa_family_t family = tor_addr_family(&p->addr); - if (family == AF_INET6 || family == AF_INET || p->is_private) { - smartlist_add(tmp, p); - } else if (family == AF_UNSPEC) { - addr_policy_t newpolicy_ipv4; - addr_policy_t newpolicy_ipv6; - memcpy(&newpolicy_ipv4, p, sizeof(addr_policy_t)); - memcpy(&newpolicy_ipv6, p, sizeof(addr_policy_t)); - newpolicy_ipv4.is_canonical = 0; - newpolicy_ipv6.is_canonical = 0; - if (p->maskbits != 0) { - log_warn(LD_BUG, "AF_UNSPEC policy with maskbits==%d", p->maskbits); - newpolicy_ipv4.maskbits = 0; - newpolicy_ipv6.maskbits = 0; - } - tor_addr_from_ipv4h(&newpolicy_ipv4.addr, 0); - tor_addr_from_ipv6_bytes(&newpolicy_ipv6.addr, - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); - smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy_ipv4)); - smartlist_add(tmp, addr_policy_get_canonical_entry(&newpolicy_ipv6)); - addr_policy_free(p); - } else { - log_warn(LD_BUG, "Funny-looking address policy with family %d", family); - smartlist_add(tmp, p); - } - } SMARTLIST_FOREACH_END(p); - - smartlist_free(*policy); - *policy = tmp; -} - -/** - * Given a linked list of config lines containing "accept[6]" and "reject[6]" - * tokens, parse them and append the result to dest. Return -1 - * if any tokens are malformed (and don't append any), else return 0. - * - * If assume_action is nonnegative, then insert its action - * (ADDR_POLICY_ACCEPT or ADDR_POLICY_REJECT) for items that specify no - * action. - */ -static int -parse_addr_policy(config_line_t *cfg, smartlist_t **dest, - int assume_action) -{ - smartlist_t *result; - smartlist_t *entries; - addr_policy_t *item; - int malformed_list; - int r = 0; - - if (!cfg) - return 0; - - result = smartlist_new(); - entries = smartlist_new(); - for (; cfg; cfg = cfg->next) { - smartlist_split_string(entries, cfg->value, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(entries, const char *, ent) { - log_debug(LD_CONFIG,"Adding new entry '%s'",ent); - malformed_list = 0; - item = router_parse_addr_policy_item_from_string(ent, assume_action, - &malformed_list); - if (item) { - smartlist_add(result, item); - } else if (malformed_list) { - /* the error is so severe the entire list should be discarded */ - log_warn(LD_CONFIG, "Malformed policy '%s'. Discarding entire policy " - "list.", ent); - r = -1; - } else { - /* the error is minor: don't add the item, but keep processing the - * rest of the policies in the list */ - log_debug(LD_CONFIG, "Ignored policy '%s' due to non-fatal error. " - "The remainder of the policy list will be used.", - ent); - } - } SMARTLIST_FOREACH_END(ent); - SMARTLIST_FOREACH(entries, char *, ent, tor_free(ent)); - smartlist_clear(entries); - } - smartlist_free(entries); - if (r == -1) { - addr_policy_list_free(result); - } else { - policy_expand_private(&result); - policy_expand_unspec(&result); - - if (*dest) { - smartlist_add_all(*dest, result); - smartlist_free(result); - } else { - *dest = result; - } - } - - return r; -} - -/** Helper: parse the Reachable(Dir|OR)?Addresses fields into - * reachable_(or|dir)_addr_policy. The options should already have - * been validated by validate_addr_policies. - */ -static int -parse_reachable_addresses(void) -{ - const or_options_t *options = get_options(); - int ret = 0; - - if (options->ReachableDirAddresses && - options->ReachableORAddresses && - options->ReachableAddresses) { - log_warn(LD_CONFIG, - "Both ReachableDirAddresses and ReachableORAddresses are set. " - "ReachableAddresses setting will be ignored."); - } - addr_policy_list_free(reachable_or_addr_policy); - reachable_or_addr_policy = NULL; - if (!options->ReachableORAddresses && options->ReachableAddresses) - log_info(LD_CONFIG, - "Using ReachableAddresses as ReachableORAddresses."); - if (parse_addr_policy(options->ReachableORAddresses ? - options->ReachableORAddresses : - options->ReachableAddresses, - &reachable_or_addr_policy, ADDR_POLICY_ACCEPT)) { - log_warn(LD_CONFIG, - "Error parsing Reachable%sAddresses entry; ignoring.", - options->ReachableORAddresses ? "OR" : ""); - ret = -1; - } - - addr_policy_list_free(reachable_dir_addr_policy); - reachable_dir_addr_policy = NULL; - if (!options->ReachableDirAddresses && options->ReachableAddresses) - log_info(LD_CONFIG, - "Using ReachableAddresses as ReachableDirAddresses"); - if (parse_addr_policy(options->ReachableDirAddresses ? - options->ReachableDirAddresses : - options->ReachableAddresses, - &reachable_dir_addr_policy, ADDR_POLICY_ACCEPT)) { - if (options->ReachableDirAddresses) - log_warn(LD_CONFIG, - "Error parsing ReachableDirAddresses entry; ignoring."); - ret = -1; - } - - /* We ignore ReachableAddresses for relays */ - if (!server_mode(options)) { - if (policy_is_reject_star(reachable_or_addr_policy, AF_UNSPEC, 0) - || policy_is_reject_star(reachable_dir_addr_policy, AF_UNSPEC,0)) { - log_warn(LD_CONFIG, "Tor cannot connect to the Internet if " - "ReachableAddresses, ReachableORAddresses, or " - "ReachableDirAddresses reject all addresses. Please accept " - "some addresses in these options."); - } else if (options->ClientUseIPv4 == 1 - && (policy_is_reject_star(reachable_or_addr_policy, AF_INET, 0) - || policy_is_reject_star(reachable_dir_addr_policy, AF_INET, 0))) { - log_warn(LD_CONFIG, "You have set ClientUseIPv4 1, but " - "ReachableAddresses, ReachableORAddresses, or " - "ReachableDirAddresses reject all IPv4 addresses. " - "Tor will not connect using IPv4."); - } else if (fascist_firewall_use_ipv6(options) - && (policy_is_reject_star(reachable_or_addr_policy, AF_INET6, 0) - || policy_is_reject_star(reachable_dir_addr_policy, AF_INET6, 0))) { - log_warn(LD_CONFIG, "You have configured tor to use or prefer IPv6 " - "(or UseBridges 1), but " - "ReachableAddresses, ReachableORAddresses, or " - "ReachableDirAddresses reject all IPv6 addresses. " - "Tor will not connect using IPv6."); - } - } - - return ret; -} - -/* Return true iff ClientUseIPv4 0 or ClientUseIPv6 0 might block any OR or Dir - * address:port combination. */ -static int -firewall_is_fascist_impl(void) -{ - const or_options_t *options = get_options(); - /* Assume every non-bridge relay has an IPv4 address. - * Clients which use bridges may only know the IPv6 address of their - * bridge, but they will connect regardless of the ClientUseIPv6 setting. */ - return options->ClientUseIPv4 == 0; -} - -/** Return true iff the firewall options, including ClientUseIPv4 0 and - * ClientUseIPv6 0, might block any OR address:port combination. - * Address preferences may still change which address is selected even if - * this function returns false. - */ -int -firewall_is_fascist_or(void) -{ - return (reachable_or_addr_policy != NULL || firewall_is_fascist_impl()); -} - -/** Return true iff the firewall options, including ClientUseIPv4 0 and - * ClientUseIPv6 0, might block any Dir address:port combination. - * Address preferences may still change which address is selected even if - * this function returns false. - */ -int -firewall_is_fascist_dir(void) -{ - return (reachable_dir_addr_policy != NULL || firewall_is_fascist_impl()); -} - -/** Return true iff policy (possibly NULL) will allow a - * connection to addr:port. - */ -static int -addr_policy_permits_tor_addr(const tor_addr_t *addr, uint16_t port, - smartlist_t *policy) -{ - addr_policy_result_t p; - p = compare_tor_addr_to_addr_policy(addr, port, policy); - switch (p) { - case ADDR_POLICY_PROBABLY_ACCEPTED: - case ADDR_POLICY_ACCEPTED: - return 1; - case ADDR_POLICY_PROBABLY_REJECTED: - case ADDR_POLICY_REJECTED: - return 0; - default: - log_warn(LD_BUG, "Unexpected result: %d", (int)p); - return 0; - } -} - -/** Return true iff policy (possibly NULL) will allow a connection to - * addr:port. addr is an IPv4 address given in host - * order. */ -/* XXXX deprecate when possible. */ -static int -addr_policy_permits_address(uint32_t addr, uint16_t port, - smartlist_t *policy) -{ - tor_addr_t a; - tor_addr_from_ipv4h(&a, addr); - return addr_policy_permits_tor_addr(&a, port, policy); -} - -/** Return true iff we think our firewall will let us make a connection to - * addr:port. - * - * If we are configured as a server, ignore any address family preference and - * just use IPv4. - * Otherwise: - * - return false for all IPv4 addresses: - * - if ClientUseIPv4 is 0, or - * if pref_only and pref_ipv6 are both true; - * - return false for all IPv6 addresses: - * - if fascist_firewall_use_ipv6() is 0, or - * - if pref_only is true and pref_ipv6 is false. - * - * Return false if addr is NULL or tor_addr_is_null(), or if port is 0. */ -STATIC int -fascist_firewall_allows_address(const tor_addr_t *addr, - uint16_t port, - smartlist_t *firewall_policy, - int pref_only, int pref_ipv6) -{ - const or_options_t *options = get_options(); - const int client_mode = !server_mode(options); - - if (!addr || tor_addr_is_null(addr) || !port) { - return 0; - } - - /* Clients stop using IPv4 if it's disabled. In most cases, clients also - * stop using IPv4 if it's not preferred. - * Servers must have IPv4 enabled and preferred. */ - if (tor_addr_family(addr) == AF_INET && client_mode && - (!options->ClientUseIPv4 || (pref_only && pref_ipv6))) { - return 0; - } - - /* Clients and Servers won't use IPv6 unless it's enabled (and in most - * cases, IPv6 must also be preferred before it will be used). */ - if (tor_addr_family(addr) == AF_INET6 && - (!fascist_firewall_use_ipv6(options) || (pref_only && !pref_ipv6))) { - return 0; - } - - return addr_policy_permits_tor_addr(addr, port, - firewall_policy); -} - -/** Is this client configured to use IPv6? - * Returns true if the client might use IPv6 for some of its connections - * (including dual-stack and IPv6-only clients), and false if it will never - * use IPv6 for any connections. - * Use node_ipv6_or/dir_preferred() when checking a specific node and OR/Dir - * port: it supports bridge client per-node IPv6 preferences. - */ -int -fascist_firewall_use_ipv6(const or_options_t *options) -{ - /* Clients use IPv6 if it's set, or they use bridges, or they don't use - * IPv4, or they prefer it. - * ClientPreferIPv6DirPort is deprecated, but check it anyway. */ - return (options->ClientUseIPv6 == 1 || options->ClientUseIPv4 == 0 || - options->ClientPreferIPv6ORPort == 1 || - options->ClientPreferIPv6DirPort == 1 || options->UseBridges == 1); -} - -/** Do we prefer to connect to IPv6, ignoring ClientPreferIPv6ORPort and - * ClientPreferIPv6DirPort? - * If we're unsure, return -1, otherwise, return 1 for IPv6 and 0 for IPv4. - */ -static int -fascist_firewall_prefer_ipv6_impl(const or_options_t *options) -{ - /* - Cheap implementation of config options ClientUseIPv4 & ClientUseIPv6 -- - If we're a server or IPv6 is disabled, use IPv4. - If IPv4 is disabled, use IPv6. - */ - - if (server_mode(options) || !fascist_firewall_use_ipv6(options)) { - return 0; - } - - if (!options->ClientUseIPv4) { - return 1; - } - - return -1; -} - -/** Do we prefer to connect to IPv6 ORPorts? - * Use node_ipv6_or_preferred() whenever possible: it supports bridge client - * per-node IPv6 preferences. - */ -int -fascist_firewall_prefer_ipv6_orport(const or_options_t *options) -{ - int pref_ipv6 = fascist_firewall_prefer_ipv6_impl(options); - - if (pref_ipv6 >= 0) { - return pref_ipv6; - } - - /* We can use both IPv4 and IPv6 - which do we prefer? */ - if (options->ClientPreferIPv6ORPort == 1) { - return 1; - } - - return 0; -} - -/** Do we prefer to connect to IPv6 DirPorts? - * - * (node_ipv6_dir_preferred() doesn't support bridge client per-node IPv6 - * preferences. There's no reason to use it instead of this function.) - */ -int -fascist_firewall_prefer_ipv6_dirport(const or_options_t *options) -{ - int pref_ipv6 = fascist_firewall_prefer_ipv6_impl(options); - - if (pref_ipv6 >= 0) { - return pref_ipv6; - } - - /* We can use both IPv4 and IPv6 - which do we prefer? */ - if (options->ClientPreferIPv6DirPort == 1) { - return 1; - } - - return 0; -} - -/** Return true iff we think our firewall will let us make a connection to - * addr:port. Uses ReachableORAddresses or ReachableDirAddresses based on - * fw_connection. - * If pref_only is true, return true if addr is in the client's preferred - * address family, which is IPv6 if pref_ipv6 is true, and IPv4 otherwise. - * If pref_only is false, ignore pref_ipv6, and return true if addr is allowed. - */ -int -fascist_firewall_allows_address_addr(const tor_addr_t *addr, uint16_t port, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - if (fw_connection == FIREWALL_OR_CONNECTION) { - return fascist_firewall_allows_address(addr, port, - reachable_or_addr_policy, - pref_only, pref_ipv6); - } else if (fw_connection == FIREWALL_DIR_CONNECTION) { - return fascist_firewall_allows_address(addr, port, - reachable_dir_addr_policy, - pref_only, pref_ipv6); - } else { - log_warn(LD_BUG, "Bad firewall_connection_t value %d.", - fw_connection); - return 0; - } -} - -/** Return true iff we think our firewall will let us make a connection to - * addr:port (ap). Uses ReachableORAddresses or ReachableDirAddresses based on - * fw_connection. - * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr(). - */ -static int -fascist_firewall_allows_address_ap(const tor_addr_port_t *ap, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - tor_assert(ap); - return fascist_firewall_allows_address_addr(&ap->addr, ap->port, - fw_connection, pref_only, - pref_ipv6); -} - -/* Return true iff we think our firewall will let us make a connection to - * ipv4h_or_addr:ipv4_or_port. ipv4h_or_addr is interpreted in host order. - * Uses ReachableORAddresses or ReachableDirAddresses based on - * fw_connection. - * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr(). - */ -static int -fascist_firewall_allows_address_ipv4h(uint32_t ipv4h_or_addr, - uint16_t ipv4_or_port, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - tor_addr_t ipv4_or_addr; - tor_addr_from_ipv4h(&ipv4_or_addr, ipv4h_or_addr); - return fascist_firewall_allows_address_addr(&ipv4_or_addr, ipv4_or_port, - fw_connection, pref_only, - pref_ipv6); -} - -/** Return true iff we think our firewall will let us make a connection to - * ipv4h_addr/ipv6_addr. Uses ipv4_orport/ipv6_orport/ReachableORAddresses or - * ipv4_dirport/ipv6_dirport/ReachableDirAddresses based on IPv4/IPv6 and - * fw_connection. - * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr(). - */ -static int -fascist_firewall_allows_base(uint32_t ipv4h_addr, uint16_t ipv4_orport, - uint16_t ipv4_dirport, - const tor_addr_t *ipv6_addr, uint16_t ipv6_orport, - uint16_t ipv6_dirport, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - if (fascist_firewall_allows_address_ipv4h(ipv4h_addr, - (fw_connection == FIREWALL_OR_CONNECTION - ? ipv4_orport - : ipv4_dirport), - fw_connection, - pref_only, pref_ipv6)) { - return 1; - } - - if (fascist_firewall_allows_address_addr(ipv6_addr, - (fw_connection == FIREWALL_OR_CONNECTION - ? ipv6_orport - : ipv6_dirport), - fw_connection, - pref_only, pref_ipv6)) { - return 1; - } - - return 0; -} - -/** Like fascist_firewall_allows_base(), but takes ri. */ -static int -fascist_firewall_allows_ri_impl(const routerinfo_t *ri, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - if (!ri) { - return 0; - } - - /* Assume IPv4 and IPv6 DirPorts are the same */ - return fascist_firewall_allows_base(ri->addr, ri->or_port, ri->dir_port, - &ri->ipv6_addr, ri->ipv6_orport, - ri->dir_port, fw_connection, pref_only, - pref_ipv6); -} - -/** Like fascist_firewall_allows_rs, but takes pref_ipv6. */ -static int -fascist_firewall_allows_rs_impl(const routerstatus_t *rs, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - if (!rs) { - return 0; - } - - /* Assume IPv4 and IPv6 DirPorts are the same */ - return fascist_firewall_allows_base(rs->addr, rs->or_port, rs->dir_port, - &rs->ipv6_addr, rs->ipv6_orport, - rs->dir_port, fw_connection, pref_only, - pref_ipv6); -} - -/** Like fascist_firewall_allows_base(), but takes rs. - * When rs is a fake_status from a dir_server_t, it can have a reachable - * address, even when the corresponding node does not. - * nodes can be missing addresses when there's no consensus (IPv4 and IPv6), - * or when there is a microdescriptor consensus, but no microdescriptors - * (microdescriptors have IPv6, the microdesc consensus does not). */ -int -fascist_firewall_allows_rs(const routerstatus_t *rs, - firewall_connection_t fw_connection, int pref_only) -{ - if (!rs) { - return 0; - } - - /* We don't have access to the node-specific IPv6 preference, so use the - * generic IPv6 preference instead. */ - const or_options_t *options = get_options(); - int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION - ? fascist_firewall_prefer_ipv6_orport(options) - : fascist_firewall_prefer_ipv6_dirport(options)); - - return fascist_firewall_allows_rs_impl(rs, fw_connection, pref_only, - pref_ipv6); -} - -/** Return true iff we think our firewall will let us make a connection to - * ipv6_addr:ipv6_orport based on ReachableORAddresses. - * If fw_connection is FIREWALL_DIR_CONNECTION, returns 0. - * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr(). - */ -static int -fascist_firewall_allows_md_impl(const microdesc_t *md, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - if (!md) { - return 0; - } - - /* Can't check dirport, it doesn't have one */ - if (fw_connection == FIREWALL_DIR_CONNECTION) { - return 0; - } - - /* Also can't check IPv4, doesn't have that either */ - return fascist_firewall_allows_address_addr(&md->ipv6_addr, md->ipv6_orport, - fw_connection, pref_only, - pref_ipv6); -} - -/** Like fascist_firewall_allows_base(), but takes node, and looks up pref_ipv6 - * from node_ipv6_or/dir_preferred(). */ -int -fascist_firewall_allows_node(const node_t *node, - firewall_connection_t fw_connection, - int pref_only) -{ - if (!node) { - return 0; - } - - node_assert_ok(node); - - const int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION - ? node_ipv6_or_preferred(node) - : node_ipv6_dir_preferred(node)); - - /* Sometimes, the rs is missing the IPv6 address info, and we need to go - * all the way to the md */ - if (node->ri && fascist_firewall_allows_ri_impl(node->ri, fw_connection, - pref_only, pref_ipv6)) { - return 1; - } else if (node->rs && fascist_firewall_allows_rs_impl(node->rs, - fw_connection, - pref_only, - pref_ipv6)) { - return 1; - } else if (node->md && fascist_firewall_allows_md_impl(node->md, - fw_connection, - pref_only, - pref_ipv6)) { - return 1; - } else { - /* If we know nothing, assume it's unreachable, we'll never get an address - * to connect to. */ - return 0; - } -} - -/** Like fascist_firewall_allows_rs(), but takes ds. */ -int -fascist_firewall_allows_dir_server(const dir_server_t *ds, - firewall_connection_t fw_connection, - int pref_only) -{ - if (!ds) { - return 0; - } - - /* A dir_server_t always has a fake_status. As long as it has the same - * addresses/ports in both fake_status and dir_server_t, this works fine. - * (See #17867.) - * fascist_firewall_allows_rs only checks the addresses in fake_status. */ - return fascist_firewall_allows_rs(&ds->fake_status, fw_connection, - pref_only); -} - -/** If a and b are both valid and allowed by fw_connection, - * choose one based on want_a and return it. - * Otherwise, return whichever is allowed. - * Otherwise, return NULL. - * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr(). - */ -static const tor_addr_port_t * -fascist_firewall_choose_address_impl(const tor_addr_port_t *a, - const tor_addr_port_t *b, - int want_a, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - const tor_addr_port_t *use_a = NULL; - const tor_addr_port_t *use_b = NULL; - - if (fascist_firewall_allows_address_ap(a, fw_connection, pref_only, - pref_ipv6)) { - use_a = a; - } - - if (fascist_firewall_allows_address_ap(b, fw_connection, pref_only, - pref_ipv6)) { - use_b = b; - } - - /* If both are allowed */ - if (use_a && use_b) { - /* Choose a if we want it */ - return (want_a ? use_a : use_b); - } else { - /* Choose a if we have it */ - return (use_a ? use_a : use_b); - } -} - -/** If a and b are both valid and preferred by fw_connection, - * choose one based on want_a and return it. - * Otherwise, return whichever is preferred. - * If neither are preferred, and pref_only is false: - * - If a and b are both allowed by fw_connection, - * choose one based on want_a and return it. - * - Otherwise, return whichever is preferred. - * Otherwise, return NULL. */ -STATIC const tor_addr_port_t * -fascist_firewall_choose_address(const tor_addr_port_t *a, - const tor_addr_port_t *b, - int want_a, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6) -{ - const tor_addr_port_t *pref = fascist_firewall_choose_address_impl( - a, b, want_a, - fw_connection, - 1, pref_ipv6); - if (pref_only || pref) { - /* If there is a preferred address, use it. If we can only use preferred - * addresses, and neither address is preferred, pref will be NULL, and we - * want to return NULL, so return it. */ - return pref; - } else { - /* If there's no preferred address, and we can return addresses that are - * not preferred, use an address that's allowed */ - return fascist_firewall_choose_address_impl(a, b, want_a, fw_connection, - 0, pref_ipv6); - } -} - -/** Copy an address and port into ap that we think our firewall will - * let us connect to. Uses ipv4_addr/ipv6_addr and - * ipv4_orport/ipv6_orport/ReachableORAddresses or - * ipv4_dirport/ipv6_dirport/ReachableDirAddresses based on IPv4/IPv6 and - * fw_connection. - * If pref_only, only choose preferred addresses. In either case, choose - * a preferred address before an address that's not preferred. - * If both addresses could be chosen (they are both preferred or both allowed) - * choose IPv6 if pref_ipv6 is true, otherwise choose IPv4. - * If neither address is chosen, return 0, else return 1. */ -static int -fascist_firewall_choose_address_base(const tor_addr_t *ipv4_addr, - uint16_t ipv4_orport, - uint16_t ipv4_dirport, - const tor_addr_t *ipv6_addr, - uint16_t ipv6_orport, - uint16_t ipv6_dirport, - firewall_connection_t fw_connection, - int pref_only, - int pref_ipv6, - tor_addr_port_t* ap) -{ - const tor_addr_port_t *result = NULL; - const int want_ipv4 = !pref_ipv6; - - tor_assert(ipv6_addr); - tor_assert(ap); - - tor_addr_port_t ipv4_ap; - tor_addr_copy(&ipv4_ap.addr, ipv4_addr); - ipv4_ap.port = (fw_connection == FIREWALL_OR_CONNECTION - ? ipv4_orport - : ipv4_dirport); - - tor_addr_port_t ipv6_ap; - tor_addr_copy(&ipv6_ap.addr, ipv6_addr); - ipv6_ap.port = (fw_connection == FIREWALL_OR_CONNECTION - ? ipv6_orport - : ipv6_dirport); - - result = fascist_firewall_choose_address(&ipv4_ap, &ipv6_ap, - want_ipv4, - fw_connection, pref_only, - pref_ipv6); - - if (result) { - tor_addr_copy(&ap->addr, &result->addr); - ap->port = result->port; - return 1; - } else { - return 0; - } -} - -/** Like fascist_firewall_choose_address_base(), but takes a host-order IPv4 - * address as the first parameter. */ -static int -fascist_firewall_choose_address_ipv4h(uint32_t ipv4h_addr, - uint16_t ipv4_orport, - uint16_t ipv4_dirport, - const tor_addr_t *ipv6_addr, - uint16_t ipv6_orport, - uint16_t ipv6_dirport, - firewall_connection_t fw_connection, - int pref_only, - int pref_ipv6, - tor_addr_port_t* ap) -{ - tor_addr_t ipv4_addr; - tor_addr_from_ipv4h(&ipv4_addr, ipv4h_addr); - return fascist_firewall_choose_address_base(&ipv4_addr, ipv4_orport, - ipv4_dirport, ipv6_addr, - ipv6_orport, ipv6_dirport, - fw_connection, pref_only, - pref_ipv6, ap); -} - -/* Some microdescriptor consensus methods have no IPv6 addresses in rs: they - * are in the microdescriptors. For these consensus methods, we can't rely on - * the node's IPv6 address until its microdescriptor is available (when using - * microdescs). - * But for bridges, rewrite_node_address_for_bridge() updates node->ri with - * the configured address, so we can trust bridge addresses. - * (Bridges could gain an IPv6 address if their microdescriptor arrives, but - * this will never be their preferred address: that is in the config.) - * Returns true if the node needs a microdescriptor for its IPv6 address, and - * false if the addresses in the node are already up-to-date. - */ -static int -node_awaiting_ipv6(const or_options_t* options, const node_t *node) -{ - tor_assert(node); - - /* There's no point waiting for an IPv6 address if we'd never use it */ - if (!fascist_firewall_use_ipv6(options)) { - return 0; - } - - /* If the node has an IPv6 address, we're not waiting */ - if (node_has_ipv6_addr(node)) { - return 0; - } - - /* If the current consensus method and flavour has IPv6 addresses, we're not - * waiting */ - if (networkstatus_consensus_has_ipv6(options)) { - return 0; - } - - /* Bridge clients never use the address from a bridge's md, so there's no - * need to wait for it. */ - if (node_is_a_configured_bridge(node)) { - return 0; - } - - /* We are waiting if we_use_microdescriptors_for_circuits() and we have no - * md. */ - return (!node->md && we_use_microdescriptors_for_circuits(options)); -} - -/** Like fascist_firewall_choose_address_base(), but takes rs. - * Consults the corresponding node, then falls back to rs if node is NULL. - * This should only happen when there's no valid consensus, and rs doesn't - * correspond to a bridge client's bridge. - */ -int -fascist_firewall_choose_address_rs(const routerstatus_t *rs, - firewall_connection_t fw_connection, - int pref_only, tor_addr_port_t* ap) -{ - if (!rs) { - return 0; - } - - tor_assert(ap); - - const or_options_t *options = get_options(); - const node_t *node = node_get_by_id(rs->identity_digest); - - if (node && !node_awaiting_ipv6(options, node)) { - return fascist_firewall_choose_address_node(node, fw_connection, pref_only, - ap); - } else { - /* There's no node-specific IPv6 preference, so use the generic IPv6 - * preference instead. */ - int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION - ? fascist_firewall_prefer_ipv6_orport(options) - : fascist_firewall_prefer_ipv6_dirport(options)); - - /* Assume IPv4 and IPv6 DirPorts are the same. - * Assume the IPv6 OR and Dir addresses are the same. */ - return fascist_firewall_choose_address_ipv4h(rs->addr, - rs->or_port, - rs->dir_port, - &rs->ipv6_addr, - rs->ipv6_orport, - rs->dir_port, - fw_connection, - pref_only, - pref_ipv6, - ap); - } -} - -/** Like fascist_firewall_choose_address_base(), but takes node, and - * looks up the node's IPv6 preference rather than taking an argument - * for pref_ipv6. */ -int -fascist_firewall_choose_address_node(const node_t *node, - firewall_connection_t fw_connection, - int pref_only, tor_addr_port_t *ap) -{ - if (!node) { - return 0; - } - - node_assert_ok(node); - - /* Calling fascist_firewall_choose_address_node() when the node is missing - * IPv6 information breaks IPv6-only clients. - * If the node is a hard-coded fallback directory or authority, call - * fascist_firewall_choose_address_rs() on the fake (hard-coded) routerstatus - * for the node. - * If it is not hard-coded, check that the node has a microdescriptor, full - * descriptor (routerinfo), or is one of our configured bridges before - * calling this function. */ - if (BUG(node_awaiting_ipv6(get_options(), node))) { - return 0; - } - - const int pref_ipv6_node = (fw_connection == FIREWALL_OR_CONNECTION - ? node_ipv6_or_preferred(node) - : node_ipv6_dir_preferred(node)); - - tor_addr_port_t ipv4_or_ap; - node_get_prim_orport(node, &ipv4_or_ap); - tor_addr_port_t ipv4_dir_ap; - node_get_prim_dirport(node, &ipv4_dir_ap); - - tor_addr_port_t ipv6_or_ap; - node_get_pref_ipv6_orport(node, &ipv6_or_ap); - tor_addr_port_t ipv6_dir_ap; - node_get_pref_ipv6_dirport(node, &ipv6_dir_ap); - - /* Assume the IPv6 OR and Dir addresses are the same. */ - return fascist_firewall_choose_address_base(&ipv4_or_ap.addr, - ipv4_or_ap.port, - ipv4_dir_ap.port, - &ipv6_or_ap.addr, - ipv6_or_ap.port, - ipv6_dir_ap.port, - fw_connection, - pref_only, - pref_ipv6_node, - ap); -} - -/** Like fascist_firewall_choose_address_rs(), but takes ds. */ -int -fascist_firewall_choose_address_dir_server(const dir_server_t *ds, - firewall_connection_t fw_connection, - int pref_only, - tor_addr_port_t *ap) -{ - if (!ds) { - return 0; - } - - /* A dir_server_t always has a fake_status. As long as it has the same - * addresses/ports in both fake_status and dir_server_t, this works fine. - * (See #17867.) - * This function relies on fascist_firewall_choose_address_rs looking up the - * node if it can, because that will get the latest info for the relay. */ - return fascist_firewall_choose_address_rs(&ds->fake_status, fw_connection, - pref_only, ap); -} - -/** Return 1 if addr is permitted to connect to our dir port, - * based on dir_policy. Else return 0. - */ -int -dir_policy_permits_address(const tor_addr_t *addr) -{ - return addr_policy_permits_tor_addr(addr, 1, dir_policy); -} - -/** Return 1 if addr is permitted to connect to our socks port, - * based on socks_policy. Else return 0. - */ -int -socks_policy_permits_address(const tor_addr_t *addr) -{ - return addr_policy_permits_tor_addr(addr, 1, socks_policy); -} - -/** Return true iff the address addr is in a country listed in the - * case-insensitive list of country codes cc_list. */ -static int -addr_is_in_cc_list(uint32_t addr, const smartlist_t *cc_list) -{ - country_t country; - const char *name; - tor_addr_t tar; - - if (!cc_list) - return 0; - /* XXXXipv6 */ - tor_addr_from_ipv4h(&tar, addr); - country = geoip_get_country_by_addr(&tar); - name = geoip_get_country_name(country); - return smartlist_contains_string_case(cc_list, name); -} - -/** Return 1 if addr:port is permitted to publish to our - * directory, based on authdir_reject_policy. Else return 0. - */ -int -authdir_policy_permits_address(uint32_t addr, uint16_t port) -{ - if (! addr_policy_permits_address(addr, port, authdir_reject_policy)) - return 0; - return !addr_is_in_cc_list(addr, get_options()->AuthDirRejectCCs); -} - -/** Return 1 if addr:port is considered valid in our - * directory, based on authdir_invalid_policy. Else return 0. - */ -int -authdir_policy_valid_address(uint32_t addr, uint16_t port) -{ - if (! addr_policy_permits_address(addr, port, authdir_invalid_policy)) - return 0; - return !addr_is_in_cc_list(addr, get_options()->AuthDirInvalidCCs); -} - -/** Return 1 if addr:port should be marked as a bad exit, - * based on authdir_badexit_policy. Else return 0. - */ -int -authdir_policy_badexit_address(uint32_t addr, uint16_t port) -{ - if (! addr_policy_permits_address(addr, port, authdir_badexit_policy)) - return 1; - return addr_is_in_cc_list(addr, get_options()->AuthDirBadExitCCs); -} - -#define REJECT(arg) \ - STMT_BEGIN *msg = tor_strdup(arg); goto err; STMT_END - -/** Config helper: If there's any problem with the policy configuration - * options in options, return -1 and set msg to a newly - * allocated description of the error. Else return 0. */ -int -validate_addr_policies(const or_options_t *options, char **msg) -{ - /* XXXX Maybe merge this into parse_policies_from_options, to make sure - * that the two can't go out of sync. */ - - smartlist_t *addr_policy=NULL; - *msg = NULL; - - if (policies_parse_exit_policy_from_options(options,0,NULL,&addr_policy)) { - REJECT("Error in ExitPolicy entry."); - } - - static int warned_about_exitrelay = 0; - - const int exitrelay_setting_is_auto = options->ExitRelay == -1; - const int policy_accepts_something = - ! (policy_is_reject_star(addr_policy, AF_INET, 1) && - policy_is_reject_star(addr_policy, AF_INET6, 1)); - - if (server_mode(options) && - ! warned_about_exitrelay && - exitrelay_setting_is_auto && - policy_accepts_something) { - /* Policy accepts something */ - warned_about_exitrelay = 1; - log_warn(LD_CONFIG, - "Tor is running as an exit relay%s. If you did not want this " - "behavior, please set the ExitRelay option to 0. If you do " - "want to run an exit Relay, please set the ExitRelay option " - "to 1 to disable this warning, and for forward compatibility.", - options->ExitPolicy == NULL ? - " with the default exit policy" : ""); - if (options->ExitPolicy == NULL && options->ReducedExitPolicy == 0) { - log_warn(LD_CONFIG, - "In a future version of Tor, ExitRelay 0 may become the " - "default when no ExitPolicy is given."); - } - } - - /* The rest of these calls *append* to addr_policy. So don't actually - * use the results for anything other than checking if they parse! */ - if (parse_addr_policy(options->DirPolicy, &addr_policy, -1)) - REJECT("Error in DirPolicy entry."); - if (parse_addr_policy(options->SocksPolicy, &addr_policy, -1)) - REJECT("Error in SocksPolicy entry."); - if (parse_addr_policy(options->AuthDirReject, &addr_policy, - ADDR_POLICY_REJECT)) - REJECT("Error in AuthDirReject entry."); - if (parse_addr_policy(options->AuthDirInvalid, &addr_policy, - ADDR_POLICY_REJECT)) - REJECT("Error in AuthDirInvalid entry."); - if (parse_addr_policy(options->AuthDirBadExit, &addr_policy, - ADDR_POLICY_REJECT)) - REJECT("Error in AuthDirBadExit entry."); - - if (parse_addr_policy(options->ReachableAddresses, &addr_policy, - ADDR_POLICY_ACCEPT)) - REJECT("Error in ReachableAddresses entry."); - if (parse_addr_policy(options->ReachableORAddresses, &addr_policy, - ADDR_POLICY_ACCEPT)) - REJECT("Error in ReachableORAddresses entry."); - if (parse_addr_policy(options->ReachableDirAddresses, &addr_policy, - ADDR_POLICY_ACCEPT)) - REJECT("Error in ReachableDirAddresses entry."); - - err: - addr_policy_list_free(addr_policy); - return *msg ? -1 : 0; -#undef REJECT -} - -/** Parse string in the same way that the exit policy - * is parsed, and put the processed version in *policy. - * Ignore port specifiers. - */ -static int -load_policy_from_option(config_line_t *config, const char *option_name, - smartlist_t **policy, - int assume_action) -{ - int r; - int killed_any_ports = 0; - addr_policy_list_free(*policy); - *policy = NULL; - r = parse_addr_policy(config, policy, assume_action); - if (r < 0) { - return -1; - } - if (*policy) { - SMARTLIST_FOREACH_BEGIN(*policy, addr_policy_t *, n) { - /* ports aren't used in these. */ - if (n->prt_min > 1 || n->prt_max != 65535) { - addr_policy_t newp, *c; - memcpy(&newp, n, sizeof(newp)); - newp.prt_min = 1; - newp.prt_max = 65535; - newp.is_canonical = 0; - c = addr_policy_get_canonical_entry(&newp); - SMARTLIST_REPLACE_CURRENT(*policy, n, c); - addr_policy_free(n); - killed_any_ports = 1; - } - } SMARTLIST_FOREACH_END(n); - } - if (killed_any_ports) { - log_warn(LD_CONFIG, "Ignoring ports in %s option.", option_name); - } - return 0; -} - -/** Set all policies based on options, which should have been validated - * first by validate_addr_policies. */ -int -policies_parse_from_options(const or_options_t *options) -{ - int ret = 0; - if (load_policy_from_option(options->SocksPolicy, "SocksPolicy", - &socks_policy, -1) < 0) - ret = -1; - if (load_policy_from_option(options->DirPolicy, "DirPolicy", - &dir_policy, -1) < 0) - ret = -1; - if (load_policy_from_option(options->AuthDirReject, "AuthDirReject", - &authdir_reject_policy, ADDR_POLICY_REJECT) < 0) - ret = -1; - if (load_policy_from_option(options->AuthDirInvalid, "AuthDirInvalid", - &authdir_invalid_policy, ADDR_POLICY_REJECT) < 0) - ret = -1; - if (load_policy_from_option(options->AuthDirBadExit, "AuthDirBadExit", - &authdir_badexit_policy, ADDR_POLICY_REJECT) < 0) - ret = -1; - if (parse_reachable_addresses() < 0) - ret = -1; - return ret; -} - -/** Compare two provided address policy items, and renturn -1, 0, or 1 - * if the first is less than, equal to, or greater than the second. */ -static int -single_addr_policy_eq(const addr_policy_t *a, const addr_policy_t *b) -{ - int r; -#define CMP_FIELD(field) do { \ - if (a->field != b->field) { \ - return 0; \ - } \ - } while (0) - CMP_FIELD(policy_type); - CMP_FIELD(is_private); - /* refcnt and is_canonical are irrelevant to equality, - * they are hash table implementation details */ - if ((r=tor_addr_compare(&a->addr, &b->addr, CMP_EXACT))) - return 0; - CMP_FIELD(maskbits); - CMP_FIELD(prt_min); - CMP_FIELD(prt_max); -#undef CMP_FIELD - return 1; -} - -/** As single_addr_policy_eq, but compare every element of two policies. - */ -int -addr_policies_eq(const smartlist_t *a, const smartlist_t *b) -{ - int i; - int len_a = a ? smartlist_len(a) : 0; - int len_b = b ? smartlist_len(b) : 0; - - if (len_a != len_b) - return 0; - - for (i = 0; i < len_a; ++i) { - if (! single_addr_policy_eq(smartlist_get(a, i), smartlist_get(b, i))) - return 0; - } - - return 1; -} - -/** Node in hashtable used to store address policy entries. */ -typedef struct policy_map_ent_t { - HT_ENTRY(policy_map_ent_t) node; - addr_policy_t *policy; -} policy_map_ent_t; - -/* DOCDOC policy_root */ -static HT_HEAD(policy_map, policy_map_ent_t) policy_root = HT_INITIALIZER(); - -/** Return true iff a and b are equal. */ -static inline int -policy_eq(policy_map_ent_t *a, policy_map_ent_t *b) -{ - return single_addr_policy_eq(a->policy, b->policy); -} - -/** Return a hashcode for ent */ -static unsigned int -policy_hash(const policy_map_ent_t *ent) -{ - const addr_policy_t *a = ent->policy; - addr_policy_t aa; - memset(&aa, 0, sizeof(aa)); - - aa.prt_min = a->prt_min; - aa.prt_max = a->prt_max; - aa.maskbits = a->maskbits; - aa.policy_type = a->policy_type; - aa.is_private = a->is_private; - - if (a->is_private) { - aa.is_private = 1; - } else { - tor_addr_copy_tight(&aa.addr, &a->addr); - } - - return (unsigned) siphash24g(&aa, sizeof(aa)); -} - -HT_PROTOTYPE(policy_map, policy_map_ent_t, node, policy_hash, - policy_eq) -HT_GENERATE2(policy_map, policy_map_ent_t, node, policy_hash, - policy_eq, 0.6, tor_reallocarray_, tor_free_) - -/** Given a pointer to an addr_policy_t, return a copy of the pointer to the - * "canonical" copy of that addr_policy_t; the canonical copy is a single - * reference-counted object. */ -addr_policy_t * -addr_policy_get_canonical_entry(addr_policy_t *e) -{ - policy_map_ent_t search, *found; - if (e->is_canonical) - return e; - - search.policy = e; - found = HT_FIND(policy_map, &policy_root, &search); - if (!found) { - found = tor_malloc_zero(sizeof(policy_map_ent_t)); - found->policy = tor_memdup(e, sizeof(addr_policy_t)); - found->policy->is_canonical = 1; - found->policy->refcnt = 0; - HT_INSERT(policy_map, &policy_root, found); - } - - tor_assert(single_addr_policy_eq(found->policy, e)); - ++found->policy->refcnt; - return found->policy; -} - -/** Helper for compare_tor_addr_to_addr_policy. Implements the case where - * addr and port are both known. */ -static addr_policy_result_t -compare_known_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - /* We know the address and port, and we know the policy, so we can just - * compute an exact match. */ - SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { - if (tmpe->addr.family == AF_UNSPEC) { - log_warn(LD_BUG, "Policy contains an AF_UNSPEC address, which only " - "matches other AF_UNSPEC addresses."); - } - /* Address is known */ - if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, - CMP_EXACT)) { - if (port >= tmpe->prt_min && port <= tmpe->prt_max) { - /* Exact match for the policy */ - return tmpe->policy_type == ADDR_POLICY_ACCEPT ? - ADDR_POLICY_ACCEPTED : ADDR_POLICY_REJECTED; - } - } - } SMARTLIST_FOREACH_END(tmpe); - - /* accept all by default. */ - return ADDR_POLICY_ACCEPTED; -} - -/** Helper for compare_tor_addr_to_addr_policy. Implements the case where - * addr is known but port is not. */ -static addr_policy_result_t -compare_known_tor_addr_to_addr_policy_noport(const tor_addr_t *addr, - const smartlist_t *policy) -{ - /* We look to see if there's a definite match. If so, we return that - match's value, unless there's an intervening possible match that says - something different. */ - int maybe_accept = 0, maybe_reject = 0; - - SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { - if (tmpe->addr.family == AF_UNSPEC) { - log_warn(LD_BUG, "Policy contains an AF_UNSPEC address, which only " - "matches other AF_UNSPEC addresses."); - } - if (!tor_addr_compare_masked(addr, &tmpe->addr, tmpe->maskbits, - CMP_EXACT)) { - if (tmpe->prt_min <= 1 && tmpe->prt_max >= 65535) { - /* Definitely matches, since it covers all ports. */ - if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { - /* If we already hit a clause that might trigger a 'reject', than we - * can't be sure of this certain 'accept'.*/ - return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : - ADDR_POLICY_ACCEPTED; - } else { - return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : - ADDR_POLICY_REJECTED; - } - } else { - /* Might match. */ - if (tmpe->policy_type == ADDR_POLICY_REJECT) - maybe_reject = 1; - else - maybe_accept = 1; - } - } - } SMARTLIST_FOREACH_END(tmpe); - - /* accept all by default. */ - return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; -} - -/** Helper for compare_tor_addr_to_addr_policy. Implements the case where - * port is known but address is not. */ -static addr_policy_result_t -compare_unknown_tor_addr_to_addr_policy(uint16_t port, - const smartlist_t *policy) -{ - /* We look to see if there's a definite match. If so, we return that - match's value, unless there's an intervening possible match that says - something different. */ - int maybe_accept = 0, maybe_reject = 0; - - SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, tmpe) { - if (tmpe->addr.family == AF_UNSPEC) { - log_warn(LD_BUG, "Policy contains an AF_UNSPEC address, which only " - "matches other AF_UNSPEC addresses."); - } - if (tmpe->prt_min <= port && port <= tmpe->prt_max) { - if (tmpe->maskbits == 0) { - /* Definitely matches, since it covers all addresses. */ - if (tmpe->policy_type == ADDR_POLICY_ACCEPT) { - /* If we already hit a clause that might trigger a 'reject', than we - * can't be sure of this certain 'accept'.*/ - return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : - ADDR_POLICY_ACCEPTED; - } else { - return maybe_accept ? ADDR_POLICY_PROBABLY_REJECTED : - ADDR_POLICY_REJECTED; - } - } else { - /* Might match. */ - if (tmpe->policy_type == ADDR_POLICY_REJECT) - maybe_reject = 1; - else - maybe_accept = 1; - } - } - } SMARTLIST_FOREACH_END(tmpe); - - /* accept all by default. */ - return maybe_reject ? ADDR_POLICY_PROBABLY_ACCEPTED : ADDR_POLICY_ACCEPTED; -} - -/** Decide whether a given addr:port is definitely accepted, - * definitely rejected, probably accepted, or probably rejected by a - * given policy. If addr is 0, we don't know the IP of the - * target address. If port is 0, we don't know the port of the - * target address. (At least one of addr and port must be - * provided. If you want to know whether a policy would definitely reject - * an unknown address:port, use policy_is_reject_star().) - * - * We could do better by assuming that some ranges never match typical - * addresses (127.0.0.1, and so on). But we'll try this for now. - */ -MOCK_IMPL(addr_policy_result_t, -compare_tor_addr_to_addr_policy,(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy)) -{ - if (!policy) { - /* no policy? accept all. */ - return ADDR_POLICY_ACCEPTED; - } else if (addr == NULL || tor_addr_is_null(addr)) { - if (port == 0) { - log_info(LD_BUG, "Rejecting null address with 0 port (family %d)", - addr ? tor_addr_family(addr) : -1); - return ADDR_POLICY_REJECTED; - } - return compare_unknown_tor_addr_to_addr_policy(port, policy); - } else if (port == 0) { - return compare_known_tor_addr_to_addr_policy_noport(addr, policy); - } else { - return compare_known_tor_addr_to_addr_policy(addr, port, policy); - } -} - -/** Return true iff the address policy a covers every case that - * would be covered by b, so that a,b is redundant. */ -static int -addr_policy_covers(addr_policy_t *a, addr_policy_t *b) -{ - if (tor_addr_family(&a->addr) != tor_addr_family(&b->addr)) { - /* You can't cover a different family. */ - return 0; - } - /* We can ignore accept/reject, since "accept *:80, reject *:80" reduces - * to "accept *:80". */ - if (a->maskbits > b->maskbits) { - /* a has more fixed bits than b; it can't possibly cover b. */ - return 0; - } - if (tor_addr_compare_masked(&a->addr, &b->addr, a->maskbits, CMP_EXACT)) { - /* There's a fixed bit in a that's set differently in b. */ - return 0; - } - return (a->prt_min <= b->prt_min && a->prt_max >= b->prt_max); -} - -/** Return true iff the address policies a and b intersect, - * that is, there exists an address/port that is covered by a that - * is also covered by b. - */ -static int -addr_policy_intersects(addr_policy_t *a, addr_policy_t *b) -{ - maskbits_t minbits; - /* All the bits we care about are those that are set in both - * netmasks. If they are equal in a and b's networkaddresses - * then the networks intersect. If there is a difference, - * then they do not. */ - if (a->maskbits < b->maskbits) - minbits = a->maskbits; - else - minbits = b->maskbits; - if (tor_addr_compare_masked(&a->addr, &b->addr, minbits, CMP_EXACT)) - return 0; - if (a->prt_max < b->prt_min || b->prt_max < a->prt_min) - return 0; - return 1; -} - -/** Add the exit policy described by more to policy. - */ -STATIC void -append_exit_policy_string(smartlist_t **policy, const char *more) -{ - config_line_t tmp; - - tmp.key = NULL; - tmp.value = (char*) more; - tmp.next = NULL; - if (parse_addr_policy(&tmp, policy, -1)<0) { - log_warn(LD_BUG, "Unable to parse internally generated policy %s",more); - } -} - -/** Add "reject addr:*" to dest, creating the list as needed. */ -void -addr_policy_append_reject_addr(smartlist_t **dest, const tor_addr_t *addr) -{ - tor_assert(dest); - tor_assert(addr); - - addr_policy_t p, *add; - memset(&p, 0, sizeof(p)); - p.policy_type = ADDR_POLICY_REJECT; - p.maskbits = tor_addr_family(addr) == AF_INET6 ? 128 : 32; - tor_addr_copy(&p.addr, addr); - p.prt_min = 1; - p.prt_max = 65535; - - add = addr_policy_get_canonical_entry(&p); - if (!*dest) - *dest = smartlist_new(); - smartlist_add(*dest, add); - log_debug(LD_CONFIG, "Adding a reject ExitPolicy 'reject %s:*'", - fmt_addr(addr)); -} - -/* Is addr public for the purposes of rejection? */ -static int -tor_addr_is_public_for_reject(const tor_addr_t *addr) -{ - return (!tor_addr_is_null(addr) && !tor_addr_is_internal(addr, 0) - && !tor_addr_is_multicast(addr)); -} - -/* Add "reject addr:*" to dest, creating the list as needed. - * Filter the address, only adding an IPv4 reject rule if ipv4_rules - * is true, and similarly for ipv6_rules. Check each address returns true for - * tor_addr_is_public_for_reject before adding it. - */ -static void -addr_policy_append_reject_addr_filter(smartlist_t **dest, - const tor_addr_t *addr, - int ipv4_rules, - int ipv6_rules) -{ - tor_assert(dest); - tor_assert(addr); - - /* Only reject IP addresses which are public */ - if (tor_addr_is_public_for_reject(addr)) { - - /* Reject IPv4 addresses and IPv6 addresses based on the filters */ - int is_ipv4 = tor_addr_is_v4(addr); - if ((is_ipv4 && ipv4_rules) || (!is_ipv4 && ipv6_rules)) { - addr_policy_append_reject_addr(dest, addr); - } - } -} - -/** Add "reject addr:*" to dest, for each addr in addrs, creating the - * list as needed. */ -void -addr_policy_append_reject_addr_list(smartlist_t **dest, - const smartlist_t *addrs) -{ - tor_assert(dest); - tor_assert(addrs); - - SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, addr) { - addr_policy_append_reject_addr(dest, addr); - } SMARTLIST_FOREACH_END(addr); -} - -/** Add "reject addr:*" to dest, for each addr in addrs, creating the - * list as needed. Filter using */ -static void -addr_policy_append_reject_addr_list_filter(smartlist_t **dest, - const smartlist_t *addrs, - int ipv4_rules, - int ipv6_rules) -{ - tor_assert(dest); - tor_assert(addrs); - - SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, addr) { - addr_policy_append_reject_addr_filter(dest, addr, ipv4_rules, ipv6_rules); - } SMARTLIST_FOREACH_END(addr); -} - -/** Detect and excise "dead code" from the policy *dest. */ -static void -exit_policy_remove_redundancies(smartlist_t *dest) -{ - addr_policy_t *ap, *tmp; - int i, j; - - /* Step one: kill every ipv4 thing after *4:*, every IPv6 thing after *6:* - */ - { - int kill_v4=0, kill_v6=0; - for (i = 0; i < smartlist_len(dest); ++i) { - sa_family_t family; - ap = smartlist_get(dest, i); - family = tor_addr_family(&ap->addr); - if ((family == AF_INET && kill_v4) || - (family == AF_INET6 && kill_v6)) { - smartlist_del_keeporder(dest, i--); - addr_policy_free(ap); - continue; - } - - if (ap->maskbits == 0 && ap->prt_min <= 1 && ap->prt_max >= 65535) { - /* This is a catch-all line -- later lines are unreachable. */ - if (family == AF_INET) { - kill_v4 = 1; - } else if (family == AF_INET6) { - kill_v6 = 1; - } - } - } - } - - /* Step two: for every entry, see if there's a redundant entry - * later on, and remove it. */ - for (i = 0; i < smartlist_len(dest)-1; ++i) { - ap = smartlist_get(dest, i); - for (j = i+1; j < smartlist_len(dest); ++j) { - tmp = smartlist_get(dest, j); - tor_assert(j > i); - if (addr_policy_covers(ap, tmp)) { - char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; - policy_write_item(p1, sizeof(p1), tmp, 0); - policy_write_item(p2, sizeof(p2), ap, 0); - log_debug(LD_CONFIG, "Removing exit policy %s (%d). It is made " - "redundant by %s (%d).", p1, j, p2, i); - smartlist_del_keeporder(dest, j--); - addr_policy_free(tmp); - } - } - } - - /* Step three: for every entry A, see if there's an entry B making this one - * redundant later on. This is the case if A and B are of the same type - * (accept/reject), A is a subset of B, and there is no other entry of - * different type in between those two that intersects with A. - * - * Anybody want to double-check the logic here? XXX - */ - for (i = 0; i < smartlist_len(dest)-1; ++i) { - ap = smartlist_get(dest, i); - for (j = i+1; j < smartlist_len(dest); ++j) { - // tor_assert(j > i); // j starts out at i+1; j only increases; i only - // // decreases. - tmp = smartlist_get(dest, j); - if (ap->policy_type != tmp->policy_type) { - if (addr_policy_intersects(ap, tmp)) - break; - } else { /* policy_types are equal. */ - if (addr_policy_covers(tmp, ap)) { - char p1[POLICY_BUF_LEN], p2[POLICY_BUF_LEN]; - policy_write_item(p1, sizeof(p1), ap, 0); - policy_write_item(p2, sizeof(p2), tmp, 0); - log_debug(LD_CONFIG, "Removing exit policy %s. It is already " - "covered by %s.", p1, p2); - smartlist_del_keeporder(dest, i--); - addr_policy_free(ap); - break; - } - } - } - } -} - -/** Reject private helper for policies_parse_exit_policy_internal: rejects - * publicly routable addresses on this exit relay. - * - * Add reject entries to the linked list *dest: - *
        - *
      • if configured_addresses is non-NULL, add entries that reject each - * tor_addr_t in the list as a destination. - *
      • if reject_interface_addresses is true, add entries that reject each - * public IPv4 and IPv6 address of each interface on this machine. - *
      • if reject_configured_port_addresses is true, add entries that reject - * each IPv4 and IPv6 address configured for a port. - *
      - * - * IPv6 entries are only added if ipv6_exit is true. (All IPv6 addresses are - * already blocked by policies_parse_exit_policy_internal if ipv6_exit is - * false.) - * - * The list in dest is created as needed. - */ -void -policies_parse_exit_policy_reject_private( - smartlist_t **dest, - int ipv6_exit, - const smartlist_t *configured_addresses, - int reject_interface_addresses, - int reject_configured_port_addresses) -{ - tor_assert(dest); - - /* Reject configured addresses, if they are from public netblocks. */ - if (configured_addresses) { - addr_policy_append_reject_addr_list_filter(dest, configured_addresses, - 1, ipv6_exit); - } - - /* Reject configured port addresses, if they are from public netblocks. */ - if (reject_configured_port_addresses) { - const smartlist_t *port_addrs = get_configured_ports(); - - SMARTLIST_FOREACH_BEGIN(port_addrs, port_cfg_t *, port) { - - /* Only reject port IP addresses, not port unix sockets */ - if (!port->is_unix_addr) { - addr_policy_append_reject_addr_filter(dest, &port->addr, 1, ipv6_exit); - } - } SMARTLIST_FOREACH_END(port); - } - - /* Reject local addresses from public netblocks on any interface. */ - if (reject_interface_addresses) { - smartlist_t *public_addresses = NULL; - - /* Reject public IPv4 addresses on any interface */ - public_addresses = get_interface_address6_list(LOG_INFO, AF_INET, 0); - addr_policy_append_reject_addr_list_filter(dest, public_addresses, 1, 0); - interface_address6_list_free(public_addresses); - - /* Don't look for IPv6 addresses if we're configured as IPv4-only */ - if (ipv6_exit) { - /* Reject public IPv6 addresses on any interface */ - public_addresses = get_interface_address6_list(LOG_INFO, AF_INET6, 0); - addr_policy_append_reject_addr_list_filter(dest, public_addresses, 0, 1); - interface_address6_list_free(public_addresses); - } - } - - /* If addresses were added multiple times, remove all but one of them. */ - if (*dest) { - exit_policy_remove_redundancies(*dest); - } -} - -/** - * Iterate through policy looking for redundant entries. Log a - * warning message with the first redundant entry, if any is found. - */ -static void -policies_log_first_redundant_entry(const smartlist_t *policy) -{ - int found_final_effective_entry = 0; - int first_redundant_entry = 0; - tor_assert(policy); - SMARTLIST_FOREACH_BEGIN(policy, const addr_policy_t *, p) { - sa_family_t family; - int found_ipv4_wildcard = 0, found_ipv6_wildcard = 0; - const int i = p_sl_idx; - - /* Look for accept/reject *[4|6|]:* entires */ - if (p->prt_min <= 1 && p->prt_max == 65535 && p->maskbits == 0) { - family = tor_addr_family(&p->addr); - /* accept/reject *:* may have already been expanded into - * accept/reject *4:*,accept/reject *6:* - * But handle both forms. - */ - if (family == AF_INET || family == AF_UNSPEC) { - found_ipv4_wildcard = 1; - } - if (family == AF_INET6 || family == AF_UNSPEC) { - found_ipv6_wildcard = 1; - } - } - - /* We also find accept *4:*,reject *6:* ; and - * accept *4:*,,accept *6:* ; and similar. - * That's ok, because they make any subsequent entries redundant. */ - if (found_ipv4_wildcard && found_ipv6_wildcard) { - found_final_effective_entry = 1; - /* if we're not on the final entry in the list */ - if (i < smartlist_len(policy) - 1) { - first_redundant_entry = i + 1; - } - break; - } - } SMARTLIST_FOREACH_END(p); - - /* Work out if there are redundant trailing entries in the policy list */ - if (found_final_effective_entry && first_redundant_entry > 0) { - const addr_policy_t *p; - /* Longest possible policy is - * "accept6 ffff:ffff:..255/128:10000-65535", - * which contains a max-length IPv6 address, plus 24 characters. */ - char line[TOR_ADDR_BUF_LEN + 32]; - - tor_assert(first_redundant_entry < smartlist_len(policy)); - p = smartlist_get(policy, first_redundant_entry); - /* since we've already parsed the policy into an addr_policy_t struct, - * we might not log exactly what the user typed in */ - policy_write_item(line, TOR_ADDR_BUF_LEN + 32, p, 0); - log_warn(LD_DIR, "Exit policy '%s' and all following policies are " - "redundant, as it follows accept/reject *:* rules for both " - "IPv4 and IPv6. They will be removed from the exit policy. (Use " - "accept/reject *:* as the last entry in any exit policy.)", - line); - } -} - -#define DEFAULT_EXIT_POLICY \ - "reject *:25,reject *:119,reject *:135-139,reject *:445," \ - "reject *:563,reject *:1214,reject *:4661-4666," \ - "reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*" - -#define REDUCED_EXIT_POLICY \ - "accept *:20-23,accept *:43,accept *:53,accept *:79-81,accept *:88," \ - "accept *:110,accept *:143,accept *:194,accept *:220,accept *:389," \ - "accept *:443,accept *:464,accept *:465,accept *:531,accept *:543-544," \ - "accept *:554,accept *:563,accept *:587,accept *:636,accept *:706," \ - "accept *:749,accept *:873,accept *:902-904,accept *:981,accept *:989-995," \ - "accept *:1194,accept *:1220,accept *:1293,accept *:1500,accept *:1533," \ - "accept *:1677,accept *:1723,accept *:1755,accept *:1863," \ - "accept *:2082-2083,accept *:2086-2087,accept *:2095-2096," \ - "accept *:2102-2104,accept *:3128,accept *:3389,accept *:3690," \ - "accept *:4321,accept *:4643,accept *:5050,accept *:5190," \ - "accept *:5222-5223,accept *:5228,accept *:5900,accept *:6660-6669," \ - "accept *:6679,accept *:6697,accept *:8000,accept *:8008,accept *:8074," \ - "accept *:8080,accept *:8082,accept *:8087-8088,accept *:8232-8233," \ - "accept *:8332-8333,accept *:8443,accept *:8888,accept *:9418," \ - "accept *:9999,accept *:10000,accept *:11371,accept *:19294," \ - "accept *:19638,accept *:50002,accept *:64738,reject *:*" - -/** Parse the exit policy cfg into the linked list *dest. - * - * If ipv6_exit is false, prepend "reject *6:*" to the policy. - * - * If configured_addresses contains addresses: - * - prepend entries that reject the addresses in this list. These may be the - * advertised relay addresses and/or the outbound bind addresses, - * depending on the ExitPolicyRejectPrivate and - * ExitPolicyRejectLocalInterfaces settings. - * If rejectprivate is true: - * - prepend "reject private:*" to the policy. - * If reject_interface_addresses is true: - * - prepend entries that reject publicly routable interface addresses on - * this exit relay by calling policies_parse_exit_policy_reject_private - * If reject_configured_port_addresses is true: - * - prepend entries that reject all configured port addresses - * - * If cfg doesn't end in an absolute accept or reject and if - * add_default_policy is true, add the default exit - * policy afterwards. - * - * Return -1 if we can't parse cfg, else return 0. - * - * This function is used to parse the exit policy from our torrc. For - * the functions used to parse the exit policy from a router descriptor, - * see router_add_exit_policy. - */ -static int -policies_parse_exit_policy_internal(config_line_t *cfg, - smartlist_t **dest, - int ipv6_exit, - int rejectprivate, - const smartlist_t *configured_addresses, - int reject_interface_addresses, - int reject_configured_port_addresses, - int add_default_policy, - int add_reduced_policy) -{ - if (!ipv6_exit) { - append_exit_policy_string(dest, "reject *6:*"); - } - if (rejectprivate) { - /* Reject IPv4 and IPv6 reserved private netblocks */ - append_exit_policy_string(dest, "reject private:*"); - } - - /* Consider rejecting IPv4 and IPv6 advertised relay addresses, outbound bind - * addresses, publicly routable addresses, and configured port addresses - * on this exit relay */ - policies_parse_exit_policy_reject_private(dest, ipv6_exit, - configured_addresses, - reject_interface_addresses, - reject_configured_port_addresses); - - if (parse_addr_policy(cfg, dest, -1)) - return -1; - - /* Before we add the default policy and final rejects, check to see if - * there are any lines after accept *:* or reject *:*. These lines have no - * effect, and are most likely an error. */ - policies_log_first_redundant_entry(*dest); - - if (add_reduced_policy) { - append_exit_policy_string(dest, REDUCED_EXIT_POLICY); - } else if (add_default_policy) { - append_exit_policy_string(dest, DEFAULT_EXIT_POLICY); - } else { - append_exit_policy_string(dest, "reject *4:*"); - append_exit_policy_string(dest, "reject *6:*"); - } - exit_policy_remove_redundancies(*dest); - - return 0; -} - -/** Parse exit policy in cfg into dest smartlist. - * - * Prepend an entry that rejects all IPv6 destinations unless - * EXIT_POLICY_IPV6_ENABLED bit is set in options bitmask. - * - * If EXIT_POLICY_REJECT_PRIVATE bit is set in options: - * - prepend an entry that rejects all destinations in all netblocks - * reserved for private use. - * - prepend entries that reject the advertised relay addresses in - * configured_addresses - * If EXIT_POLICY_REJECT_LOCAL_INTERFACES bit is set in options: - * - prepend entries that reject publicly routable addresses on this exit - * relay by calling policies_parse_exit_policy_internal - * - prepend entries that reject the outbound bind addresses in - * configured_addresses - * - prepend entries that reject all configured port addresses - * - * If EXIT_POLICY_ADD_DEFAULT bit is set in options, append - * default exit policy entries to result smartlist. - */ -int -policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, - exit_policy_parser_cfg_t options, - const smartlist_t *configured_addresses) -{ - int ipv6_enabled = (options & EXIT_POLICY_IPV6_ENABLED) ? 1 : 0; - int reject_private = (options & EXIT_POLICY_REJECT_PRIVATE) ? 1 : 0; - int add_default = (options & EXIT_POLICY_ADD_DEFAULT) ? 1 : 0; - int reject_local_interfaces = (options & - EXIT_POLICY_REJECT_LOCAL_INTERFACES) ? 1 : 0; - int add_reduced = (options & EXIT_POLICY_ADD_REDUCED) ? 1 : 0; - - return policies_parse_exit_policy_internal(cfg,dest,ipv6_enabled, - reject_private, - configured_addresses, - reject_local_interfaces, - reject_local_interfaces, - add_default, - add_reduced); -} - -/** Helper function that adds a copy of addr to a smartlist as long as it is - * non-NULL and not tor_addr_is_null(). - * - * The caller is responsible for freeing all the tor_addr_t* in the smartlist. - */ -static void -policies_copy_addr_to_smartlist(smartlist_t *addr_list, const tor_addr_t *addr) -{ - if (addr && !tor_addr_is_null(addr)) { - tor_addr_t *addr_copy = tor_malloc(sizeof(tor_addr_t)); - tor_addr_copy(addr_copy, addr); - smartlist_add(addr_list, addr_copy); - } -} - -/** Helper function that adds ipv4h_addr to a smartlist as a tor_addr_t *, - * as long as it is not tor_addr_is_null(), by converting it to a tor_addr_t - * and passing it to policies_add_addr_to_smartlist. - * - * The caller is responsible for freeing all the tor_addr_t* in the smartlist. - */ -static void -policies_copy_ipv4h_to_smartlist(smartlist_t *addr_list, uint32_t ipv4h_addr) -{ - if (ipv4h_addr) { - tor_addr_t ipv4_tor_addr; - tor_addr_from_ipv4h(&ipv4_tor_addr, ipv4h_addr); - policies_copy_addr_to_smartlist(addr_list, &ipv4_tor_addr); - } -} - -/** Helper function that adds copies of or_options->OutboundBindAddresses - * to a smartlist as tor_addr_t *, as long as or_options is non-NULL, and - * the addresses are not tor_addr_is_null(), by passing them to - * policies_add_addr_to_smartlist. - * - * The caller is responsible for freeing all the tor_addr_t* in the smartlist. - */ -static void -policies_copy_outbound_addresses_to_smartlist(smartlist_t *addr_list, - const or_options_t *or_options) -{ - if (or_options) { - for (int i=0;iOutboundBindAddresses[i][j])) { - policies_copy_addr_to_smartlist(addr_list, - &or_options->OutboundBindAddresses[i][j]); - } - } - } - } -} - -/** Parse ExitPolicy member of or_options into result - * smartlist. - * If or_options->IPv6Exit is false, prepend an entry that - * rejects all IPv6 destinations. - * - * If or_options->ExitPolicyRejectPrivate is true: - * - prepend an entry that rejects all destinations in all netblocks reserved - * for private use. - * - if local_address is non-zero, treat it as a host-order IPv4 address, and - * add it to the list of configured addresses. - * - if ipv6_local_address is non-NULL, and not the null tor_addr_t, add it - * to the list of configured addresses. - * If or_options->ExitPolicyRejectLocalInterfaces is true: - * - if or_options->OutboundBindAddresses[][0] (=IPv4) is not the null - * tor_addr_t, add it to the list of configured addresses. - * - if or_options->OutboundBindAddresses[][1] (=IPv6) is not the null - * tor_addr_t, add it to the list of configured addresses. - * - * If or_options->BridgeRelay is false, append entries of default - * Tor exit policy into result smartlist. - * - * If or_options->ExitRelay is false, then make our exit policy into - * "reject *:*" regardless. - */ -int -policies_parse_exit_policy_from_options(const or_options_t *or_options, - uint32_t local_address, - const tor_addr_t *ipv6_local_address, - smartlist_t **result) -{ - exit_policy_parser_cfg_t parser_cfg = 0; - smartlist_t *configured_addresses = NULL; - int rv = 0; - - /* Short-circuit for non-exit relays */ - if (or_options->ExitRelay == 0) { - append_exit_policy_string(result, "reject *4:*"); - append_exit_policy_string(result, "reject *6:*"); - return 0; - } - - configured_addresses = smartlist_new(); - - /* Configure the parser */ - if (or_options->IPv6Exit) { - parser_cfg |= EXIT_POLICY_IPV6_ENABLED; - } - - if (or_options->ExitPolicyRejectPrivate) { - parser_cfg |= EXIT_POLICY_REJECT_PRIVATE; - } - - if (!or_options->BridgeRelay) { - if (or_options->ReducedExitPolicy) - parser_cfg |= EXIT_POLICY_ADD_REDUCED; - else - parser_cfg |= EXIT_POLICY_ADD_DEFAULT; - } - - if (or_options->ExitPolicyRejectLocalInterfaces) { - parser_cfg |= EXIT_POLICY_REJECT_LOCAL_INTERFACES; - } - - /* Copy the configured addresses into the tor_addr_t* list */ - if (or_options->ExitPolicyRejectPrivate) { - policies_copy_ipv4h_to_smartlist(configured_addresses, local_address); - policies_copy_addr_to_smartlist(configured_addresses, ipv6_local_address); - } - - if (or_options->ExitPolicyRejectLocalInterfaces) { - policies_copy_outbound_addresses_to_smartlist(configured_addresses, - or_options); - } - - rv = policies_parse_exit_policy(or_options->ExitPolicy, result, parser_cfg, - configured_addresses); - - SMARTLIST_FOREACH(configured_addresses, tor_addr_t *, a, tor_free(a)); - smartlist_free(configured_addresses); - - return rv; -} - -/** Add "reject *:*" to the end of the policy in *dest, allocating - * *dest as needed. */ -void -policies_exit_policy_append_reject_star(smartlist_t **dest) -{ - append_exit_policy_string(dest, "reject *4:*"); - append_exit_policy_string(dest, "reject *6:*"); -} - -/** Replace the exit policy of node with reject *:* */ -void -policies_set_node_exitpolicy_to_reject_all(node_t *node) -{ - node->rejects_all = 1; -} - -/** Return 1 if there is at least one /8 subnet in policy that - * allows exiting to port. Otherwise, return 0. */ -static int -exit_policy_is_general_exit_helper(smartlist_t *policy, int port) -{ - uint32_t mask, ip, i; - /* Is this /8 rejected (1), or undecided (0)? */ - char subnet_status[256]; - - memset(subnet_status, 0, sizeof(subnet_status)); - SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, p) { - if (tor_addr_family(&p->addr) != AF_INET) - continue; /* IPv4 only for now */ - if (p->prt_min > port || p->prt_max < port) - continue; /* Doesn't cover our port. */ - mask = 0; - tor_assert(p->maskbits <= 32); - - if (p->maskbits) - mask = UINT32_MAX<<(32-p->maskbits); - ip = tor_addr_to_ipv4h(&p->addr); - - /* Calculate the first and last subnet that this exit policy touches - * and set it as loop boundaries. */ - for (i = ((mask & ip)>>24); i <= (~((mask & ip) ^ mask)>>24); ++i) { - tor_addr_t addr; - if (subnet_status[i] != 0) - continue; /* We already reject some part of this /8 */ - tor_addr_from_ipv4h(&addr, i<<24); - if (tor_addr_is_internal(&addr, 0) && - !get_options()->DirAllowPrivateAddresses) { - continue; /* Local or non-routable addresses */ - } - if (p->policy_type == ADDR_POLICY_ACCEPT) { - if (p->maskbits > 8) - continue; /* Narrower than a /8. */ - /* We found an allowed subnet of at least size /8. Done - * for this port! */ - return 1; - } else if (p->policy_type == ADDR_POLICY_REJECT) { - subnet_status[i] = 1; - } - } - } SMARTLIST_FOREACH_END(p); - return 0; -} - -/** Return true iff ri is "useful as an exit node", meaning - * it allows exit to at least one /8 address space for each of ports 80 - * and 443. */ -int -exit_policy_is_general_exit(smartlist_t *policy) -{ - if (!policy) /*XXXX disallow NULL policies? */ - return 0; - - return (exit_policy_is_general_exit_helper(policy, 80) && - exit_policy_is_general_exit_helper(policy, 443)); -} - -/** Return false if policy might permit access to some addr:port; - * otherwise if we are certain it rejects everything, return true. If no - * part of policy matches, return default_reject. - * NULL policies are allowed, and treated as empty. */ -int -policy_is_reject_star(const smartlist_t *policy, sa_family_t family, - int default_reject) -{ - if (!policy) - return default_reject; - SMARTLIST_FOREACH_BEGIN(policy, const addr_policy_t *, p) { - if (p->policy_type == ADDR_POLICY_ACCEPT && - (tor_addr_family(&p->addr) == family || - tor_addr_family(&p->addr) == AF_UNSPEC)) { - return 0; - } else if (p->policy_type == ADDR_POLICY_REJECT && - p->prt_min <= 1 && p->prt_max == 65535 && - p->maskbits == 0 && - (tor_addr_family(&p->addr) == family || - tor_addr_family(&p->addr) == AF_UNSPEC)) { - return 1; - } - } SMARTLIST_FOREACH_END(p); - return default_reject; -} - -/** Write a single address policy to the buf_len byte buffer at buf. Return - * the number of characters written, or -1 on failure. */ -int -policy_write_item(char *buf, size_t buflen, const addr_policy_t *policy, - int format_for_desc) -{ - size_t written = 0; - char addrbuf[TOR_ADDR_BUF_LEN]; - const char *addrpart; - int result; - const int is_accept = policy->policy_type == ADDR_POLICY_ACCEPT; - const sa_family_t family = tor_addr_family(&policy->addr); - const int is_ip6 = (family == AF_INET6); - - tor_addr_to_str(addrbuf, &policy->addr, sizeof(addrbuf), 1); - - /* write accept/reject 1.2.3.4 */ - if (policy->is_private) { - addrpart = "private"; - } else if (policy->maskbits == 0) { - if (format_for_desc) - addrpart = "*"; - else if (family == AF_INET6) - addrpart = "*6"; - else if (family == AF_INET) - addrpart = "*4"; - else - addrpart = "*"; - } else { - addrpart = addrbuf; - } - - result = tor_snprintf(buf, buflen, "%s%s %s", - is_accept ? "accept" : "reject", - (is_ip6&&format_for_desc)?"6":"", - addrpart); - if (result < 0) - return -1; - written += strlen(buf); - /* If the maskbits is 32 (IPv4) or 128 (IPv6) we don't need to give it. If - the mask is 0, we already wrote "*". */ - if (policy->maskbits < (is_ip6?128:32) && policy->maskbits > 0) { - if (tor_snprintf(buf+written, buflen-written, "/%d", policy->maskbits)<0) - return -1; - written += strlen(buf+written); - } - if (policy->prt_min <= 1 && policy->prt_max == 65535) { - /* There is no port set; write ":*" */ - if (written+4 > buflen) - return -1; - strlcat(buf+written, ":*", buflen-written); - written += 2; - } else if (policy->prt_min == policy->prt_max) { - /* There is only one port; write ":80". */ - result = tor_snprintf(buf+written, buflen-written, ":%d", policy->prt_min); - if (result<0) - return -1; - written += result; - } else { - /* There is a range of ports; write ":79-80". */ - result = tor_snprintf(buf+written, buflen-written, ":%d-%d", - policy->prt_min, policy->prt_max); - if (result<0) - return -1; - written += result; - } - if (written < buflen) - buf[written] = '\0'; - else - return -1; - - return (int)written; -} - -/** Create a new exit policy summary, initially only with a single - * port 1-64k item */ -/* XXXX This entire thing will do most stuff in O(N^2), or worse. Use an - * RB-tree if that turns out to matter. */ -static smartlist_t * -policy_summary_create(void) -{ - smartlist_t *summary; - policy_summary_item_t* item; - - item = tor_malloc_zero(sizeof(policy_summary_item_t)); - item->prt_min = 1; - item->prt_max = 65535; - item->reject_count = 0; - item->accepted = 0; - - summary = smartlist_new(); - smartlist_add(summary, item); - - return summary; -} - -/** Split the summary item in item at the port new_starts. - * The current item is changed to end at new-starts - 1, the new item - * copies reject_count and accepted from the old item, - * starts at new_starts and ends at the port where the original item - * previously ended. - */ -static policy_summary_item_t* -policy_summary_item_split(policy_summary_item_t* old, uint16_t new_starts) -{ - policy_summary_item_t* new; - - new = tor_malloc_zero(sizeof(policy_summary_item_t)); - new->prt_min = new_starts; - new->prt_max = old->prt_max; - new->reject_count = old->reject_count; - new->accepted = old->accepted; - - old->prt_max = new_starts-1; - - tor_assert(old->prt_min <= old->prt_max); - tor_assert(new->prt_min <= new->prt_max); - return new; -} - -/* XXXX Nick says I'm going to hell for this. If he feels charitably towards - * my immortal soul, he can clean it up himself. */ -#define AT(x) ((policy_summary_item_t*)smartlist_get(summary, x)) - -#define IPV4_BITS (32) -/* Every IPv4 address is counted as one rejection */ -#define REJECT_CUTOFF_SCALE_IPV4 (0) -/* Ports are rejected in an IPv4 summary if they are rejected in more than two - * IPv4 /8 address blocks */ -#define REJECT_CUTOFF_COUNT_IPV4 (U64_LITERAL(1) << \ - (IPV4_BITS - REJECT_CUTOFF_SCALE_IPV4 - 7)) - -#define IPV6_BITS (128) -/* IPv6 /64s are counted as one rejection, anything smaller is ignored */ -#define REJECT_CUTOFF_SCALE_IPV6 (64) -/* Ports are rejected in an IPv6 summary if they are rejected in more than one - * IPv6 /16 address block. - * This is rougly equivalent to the IPv4 cutoff, as only five IPv6 /12s (and - * some scattered smaller blocks) have been allocated to the RIRs. - * Network providers are typically allocated one or more IPv6 /32s. - */ -#define REJECT_CUTOFF_COUNT_IPV6 (U64_LITERAL(1) << \ - (IPV6_BITS - REJECT_CUTOFF_SCALE_IPV6 - 16)) - -/** Split an exit policy summary so that prt_min and prt_max - * fall at exactly the start and end of an item respectively. - */ -static int -policy_summary_split(smartlist_t *summary, - uint16_t prt_min, uint16_t prt_max) -{ - int start_at_index; - - int i = 0; - - while (AT(i)->prt_max < prt_min) - i++; - if (AT(i)->prt_min != prt_min) { - policy_summary_item_t* new_item; - new_item = policy_summary_item_split(AT(i), prt_min); - smartlist_insert(summary, i+1, new_item); - i++; - } - start_at_index = i; - - while (AT(i)->prt_max < prt_max) - i++; - if (AT(i)->prt_max != prt_max) { - policy_summary_item_t* new_item; - new_item = policy_summary_item_split(AT(i), prt_max+1); - smartlist_insert(summary, i+1, new_item); - } - - return start_at_index; -} - -/** Mark port ranges as accepted if they are below the reject_count for family - */ -static void -policy_summary_accept(smartlist_t *summary, - uint16_t prt_min, uint16_t prt_max, - sa_family_t family) -{ - tor_assert_nonfatal_once(family == AF_INET || family == AF_INET6); - uint64_t family_reject_count = ((family == AF_INET) ? - REJECT_CUTOFF_COUNT_IPV4 : - REJECT_CUTOFF_COUNT_IPV6); - - int i = policy_summary_split(summary, prt_min, prt_max); - while (i < smartlist_len(summary) && - AT(i)->prt_max <= prt_max) { - if (!AT(i)->accepted && - AT(i)->reject_count <= family_reject_count) - AT(i)->accepted = 1; - i++; - } - tor_assert(i < smartlist_len(summary) || prt_max==65535); -} - -/** Count the number of addresses in a network in family with prefixlen - * maskbits against the given portrange. */ -static void -policy_summary_reject(smartlist_t *summary, - maskbits_t maskbits, - uint16_t prt_min, uint16_t prt_max, - sa_family_t family) -{ - tor_assert_nonfatal_once(family == AF_INET || family == AF_INET6); - - int i = policy_summary_split(summary, prt_min, prt_max); - - /* The length of a single address mask */ - int addrbits = (family == AF_INET) ? IPV4_BITS : IPV6_BITS; - tor_assert_nonfatal_once(addrbits >= maskbits); - - /* We divide IPv6 address counts by (1 << scale) to keep them in a uint64_t - */ - int scale = ((family == AF_INET) ? - REJECT_CUTOFF_SCALE_IPV4 : - REJECT_CUTOFF_SCALE_IPV6); - - tor_assert_nonfatal_once(addrbits >= scale); - if (maskbits > (addrbits - scale)) { - tor_assert_nonfatal_once(family == AF_INET6); - /* The address range is so small, we'd need billions of them to reach the - * rejection limit. So we ignore this range in the reject count. */ - return; - } - - uint64_t count = 0; - if (addrbits - scale - maskbits >= 64) { - tor_assert_nonfatal_once(family == AF_INET6); - /* The address range is so large, it's an automatic rejection for all ports - * in the range. */ - count = UINT64_MAX; - } else { - count = (U64_LITERAL(1) << (addrbits - scale - maskbits)); - } - tor_assert_nonfatal_once(count > 0); - while (i < smartlist_len(summary) && - AT(i)->prt_max <= prt_max) { - if (AT(i)->reject_count <= UINT64_MAX - count) { - AT(i)->reject_count += count; - } else { - /* IPv4 would require a 4-billion address redundant policy to get here, - * but IPv6 just needs to have ::/0 */ - if (family == AF_INET) { - tor_assert_nonfatal_unreached_once(); - } - /* If we do get here, use saturating arithmetic */ - AT(i)->reject_count = UINT64_MAX; - } - i++; - } - tor_assert(i < smartlist_len(summary) || prt_max==65535); -} - -/** Add a single exit policy item to our summary: - * - * If it is an accept, ignore it unless it is for all IP addresses - * ("*", i.e. its prefixlen/maskbits is 0). Otherwise call - * policy_summary_accept(). - * - * If it is a reject, ignore it if it is about one of the private - * networks. Otherwise call policy_summary_reject(). - */ -static void -policy_summary_add_item(smartlist_t *summary, addr_policy_t *p) -{ - if (p->policy_type == ADDR_POLICY_ACCEPT) { - if (p->maskbits == 0) { - policy_summary_accept(summary, p->prt_min, p->prt_max, p->addr.family); - } - } else if (p->policy_type == ADDR_POLICY_REJECT) { - - int is_private = 0; - int i; - for (i = 0; private_nets[i]; ++i) { - tor_addr_t addr; - maskbits_t maskbits; - if (tor_addr_parse_mask_ports(private_nets[i], 0, &addr, - &maskbits, NULL, NULL)<0) { - tor_assert(0); - } - if (tor_addr_compare(&p->addr, &addr, CMP_EXACT) == 0 && - p->maskbits == maskbits) { - is_private = 1; - break; - } - } - - if (!is_private) { - policy_summary_reject(summary, p->maskbits, p->prt_min, p->prt_max, - p->addr.family); - } - } else - tor_assert(0); -} - -/** Create a string representing a summary for an exit policy. - * The summary will either be an "accept" plus a comma-separated list of port - * ranges or a "reject" plus port-ranges, depending on which is shorter. - * - * If no exits are allowed at all then "reject 1-65535" is returned. If no - * ports are blocked instead of "reject " we return "accept 1-65535". (These - * are an exception to the shorter-representation-wins rule). - */ -char * -policy_summarize(smartlist_t *policy, sa_family_t family) -{ - smartlist_t *summary = policy_summary_create(); - smartlist_t *accepts, *rejects; - int i, last, start_prt; - size_t accepts_len, rejects_len; - char *accepts_str = NULL, *rejects_str = NULL, *shorter_str, *result; - const char *prefix; - - tor_assert(policy); - - /* Create the summary list */ - SMARTLIST_FOREACH_BEGIN(policy, addr_policy_t *, p) { - sa_family_t f = tor_addr_family(&p->addr); - if (f != AF_INET && f != AF_INET6) { - log_warn(LD_BUG, "Weird family when summarizing address policy"); - } - if (f != family) - continue; - policy_summary_add_item(summary, p); - } SMARTLIST_FOREACH_END(p); - - /* Now create two lists of strings, one for accepted and one - * for rejected ports. We take care to merge ranges so that - * we avoid getting stuff like "1-4,5-9,10", instead we want - * "1-10" - */ - i = 0; - start_prt = 1; - accepts = smartlist_new(); - rejects = smartlist_new(); - while (1) { - last = i == smartlist_len(summary)-1; - if (last || - AT(i)->accepted != AT(i+1)->accepted) { - char buf[POLICY_BUF_LEN]; - - if (start_prt == AT(i)->prt_max) - tor_snprintf(buf, sizeof(buf), "%d", start_prt); - else - tor_snprintf(buf, sizeof(buf), "%d-%d", start_prt, AT(i)->prt_max); - - if (AT(i)->accepted) - smartlist_add_strdup(accepts, buf); - else - smartlist_add_strdup(rejects, buf); - - if (last) - break; - - start_prt = AT(i+1)->prt_min; - }; - i++; - }; - - /* Figure out which of the two stringlists will be shorter and use - * that to build the result - */ - if (smartlist_len(accepts) == 0) { /* no exits at all */ - result = tor_strdup("reject 1-65535"); - goto cleanup; - } - if (smartlist_len(rejects) == 0) { /* no rejects at all */ - result = tor_strdup("accept 1-65535"); - goto cleanup; - } - - accepts_str = smartlist_join_strings(accepts, ",", 0, &accepts_len); - rejects_str = smartlist_join_strings(rejects, ",", 0, &rejects_len); - - if (rejects_len > MAX_EXITPOLICY_SUMMARY_LEN-strlen("reject")-1 && - accepts_len > MAX_EXITPOLICY_SUMMARY_LEN-strlen("accept")-1) { - char *c; - shorter_str = accepts_str; - prefix = "accept"; - - c = shorter_str + (MAX_EXITPOLICY_SUMMARY_LEN-strlen(prefix)-1); - while (*c != ',' && c >= shorter_str) - c--; - tor_assert(c >= shorter_str); - tor_assert(*c == ','); - *c = '\0'; - - } else if (rejects_len < accepts_len) { - shorter_str = rejects_str; - prefix = "reject"; - } else { - shorter_str = accepts_str; - prefix = "accept"; - } - - tor_asprintf(&result, "%s %s", prefix, shorter_str); - - cleanup: - /* cleanup */ - SMARTLIST_FOREACH(summary, policy_summary_item_t *, s, tor_free(s)); - smartlist_free(summary); - - tor_free(accepts_str); - SMARTLIST_FOREACH(accepts, char *, s, tor_free(s)); - smartlist_free(accepts); - - tor_free(rejects_str); - SMARTLIST_FOREACH(rejects, char *, s, tor_free(s)); - smartlist_free(rejects); - - return result; -} - -/** Convert a summarized policy string into a short_policy_t. Return NULL - * if the string is not well-formed. */ -short_policy_t * -parse_short_policy(const char *summary) -{ - const char *orig_summary = summary; - short_policy_t *result; - int is_accept; - int n_entries; - short_policy_entry_t entries[MAX_EXITPOLICY_SUMMARY_LEN]; /* overkill */ - const char *next; - - if (!strcmpstart(summary, "accept ")) { - is_accept = 1; - summary += strlen("accept "); - } else if (!strcmpstart(summary, "reject ")) { - is_accept = 0; - summary += strlen("reject "); - } else { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Unrecognized policy summary keyword"); - return NULL; - } - - n_entries = 0; - for ( ; *summary; summary = next) { - const char *comma = strchr(summary, ','); - unsigned low, high; - char dummy; - char ent_buf[32]; - size_t len; - - next = comma ? comma+1 : strchr(summary, '\0'); - len = comma ? (size_t)(comma - summary) : strlen(summary); - - if (n_entries == MAX_EXITPOLICY_SUMMARY_LEN) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Impossibly long policy summary %s", - escaped(orig_summary)); - return NULL; - } - - if (! TOR_ISDIGIT(*summary) || len > (sizeof(ent_buf)-1)) { - /* unrecognized entry format. skip it. */ - continue; - } - if (len < 1) { - /* empty; skip it. */ - /* XXX This happens to be unreachable, since if len==0, then *summary is - * ',' or '\0', and the TOR_ISDIGIT test above would have failed. */ - continue; - } - - memcpy(ent_buf, summary, len); - ent_buf[len] = '\0'; - - if (tor_sscanf(ent_buf, "%u-%u%c", &low, &high, &dummy) == 2) { - if (low<1 || low>65535 || high<1 || high>65535 || low>high) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "Found bad entry in policy summary %s", escaped(orig_summary)); - return NULL; - } - } else if (tor_sscanf(ent_buf, "%u%c", &low, &dummy) == 1) { - if (low<1 || low>65535) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "Found bad entry in policy summary %s", escaped(orig_summary)); - return NULL; - } - high = low; - } else { - log_fn(LOG_PROTOCOL_WARN, LD_DIR,"Found bad entry in policy summary %s", - escaped(orig_summary)); - return NULL; - } - - entries[n_entries].min_port = low; - entries[n_entries].max_port = high; - n_entries++; - } - - if (n_entries == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "Found no port-range entries in summary %s", escaped(orig_summary)); - return NULL; - } - - { - size_t size = offsetof(short_policy_t, entries) + - sizeof(short_policy_entry_t)*(n_entries); - result = tor_malloc_zero(size); - - tor_assert( (char*)&result->entries[n_entries-1] < ((char*)result)+size); - } - - result->is_accept = is_accept; - result->n_entries = n_entries; - memcpy(result->entries, entries, sizeof(short_policy_entry_t)*n_entries); - return result; -} - -/** Write policy back out into a string. */ -char * -write_short_policy(const short_policy_t *policy) -{ - int i; - char *answer; - smartlist_t *sl = smartlist_new(); - - smartlist_add_asprintf(sl, "%s", policy->is_accept ? "accept " : "reject "); - - for (i=0; i < policy->n_entries; i++) { - const short_policy_entry_t *e = &policy->entries[i]; - if (e->min_port == e->max_port) { - smartlist_add_asprintf(sl, "%d", e->min_port); - } else { - smartlist_add_asprintf(sl, "%d-%d", e->min_port, e->max_port); - } - if (i < policy->n_entries-1) - smartlist_add_strdup(sl, ","); - } - answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, a, tor_free(a)); - smartlist_free(sl); - return answer; -} - -/** Release all storage held in policy. */ -void -short_policy_free_(short_policy_t *policy) -{ - tor_free(policy); -} - -/** See whether the addr:port address is likely to be accepted - * or rejected by the summarized policy policy. Return values are as - * for compare_tor_addr_to_addr_policy. Unlike the regular addr_policy - * functions, requires the port be specified. */ -addr_policy_result_t -compare_tor_addr_to_short_policy(const tor_addr_t *addr, uint16_t port, - const short_policy_t *policy) -{ - int i; - int found_match = 0; - int accept_; - - tor_assert(port != 0); - - if (addr && tor_addr_is_null(addr)) - addr = NULL; /* Unspec means 'no address at all,' in this context. */ - - if (addr && get_options()->ClientRejectInternalAddresses && - (tor_addr_is_internal(addr, 0) || tor_addr_is_loopback(addr))) - return ADDR_POLICY_REJECTED; - - for (i=0; i < policy->n_entries; ++i) { - const short_policy_entry_t *e = &policy->entries[i]; - if (e->min_port <= port && port <= e->max_port) { - found_match = 1; - break; - } - } - - if (found_match) - accept_ = policy->is_accept; - else - accept_ = ! policy->is_accept; - - /* ???? are these right? -NM */ - /* We should be sure not to return ADDR_POLICY_ACCEPTED in the accept - * case here, because it would cause clients to believe that the node - * allows exit enclaving. Trying it anyway would open up a cool attack - * where the node refuses due to exitpolicy, the client reacts in - * surprise by rewriting the node's exitpolicy to reject *:*, and then - * an adversary targets users by causing them to attempt such connections - * to 98% of the exits. - * - * Once microdescriptors can handle addresses in special cases (e.g. if - * we ever solve ticket 1774), we can provide certainty here. -RD */ - if (accept_) - return ADDR_POLICY_PROBABLY_ACCEPTED; - else - return ADDR_POLICY_REJECTED; -} - -/** Return true iff policy seems reject all ports */ -int -short_policy_is_reject_star(const short_policy_t *policy) -{ - /* This doesn't need to be as much on the lookout as policy_is_reject_star, - * since policy summaries are from the consensus or from consensus - * microdescs. - */ - tor_assert(policy); - /* Check for an exact match of "reject 1-65535". */ - return (policy->is_accept == 0 && policy->n_entries == 1 && - policy->entries[0].min_port == 1 && - policy->entries[0].max_port == 65535); -} - -/** Decide whether addr:port is probably or definitely accepted or rejected by - * node. See compare_tor_addr_to_addr_policy for details on addr/port - * interpretation. */ -addr_policy_result_t -compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port, - const node_t *node) -{ - if (node->rejects_all) - return ADDR_POLICY_REJECTED; - - if (addr && tor_addr_family(addr) == AF_INET6) { - const short_policy_t *p = NULL; - if (node->ri) - p = node->ri->ipv6_exit_policy; - else if (node->md) - p = node->md->ipv6_exit_policy; - if (p) - return compare_tor_addr_to_short_policy(addr, port, p); - else - return ADDR_POLICY_REJECTED; - } - - if (node->ri) { - return compare_tor_addr_to_addr_policy(addr, port, node->ri->exit_policy); - } else if (node->md) { - if (node->md->exit_policy == NULL) - return ADDR_POLICY_REJECTED; - else - return compare_tor_addr_to_short_policy(addr, port, - node->md->exit_policy); - } else { - return ADDR_POLICY_PROBABLY_REJECTED; - } -} - -/** - * Given policy_list, a list of addr_policy_t, produce a string - * representation of the list. - * If include_ipv4 is true, include IPv4 entries. - * If include_ipv6 is true, include IPv6 entries. - */ -char * -policy_dump_to_string(const smartlist_t *policy_list, - int include_ipv4, - int include_ipv6) -{ - smartlist_t *policy_string_list; - char *policy_string = NULL; - - policy_string_list = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(policy_list, addr_policy_t *, tmpe) { - char *pbuf; - int bytes_written_to_pbuf; - if ((tor_addr_family(&tmpe->addr) == AF_INET6) && (!include_ipv6)) { - continue; /* Don't include IPv6 parts of address policy */ - } - if ((tor_addr_family(&tmpe->addr) == AF_INET) && (!include_ipv4)) { - continue; /* Don't include IPv4 parts of address policy */ - } - - pbuf = tor_malloc(POLICY_BUF_LEN); - bytes_written_to_pbuf = policy_write_item(pbuf,POLICY_BUF_LEN, tmpe, 1); - - if (bytes_written_to_pbuf < 0) { - log_warn(LD_BUG, "policy_dump_to_string ran out of room!"); - tor_free(pbuf); - goto done; - } - - smartlist_add(policy_string_list,pbuf); - } SMARTLIST_FOREACH_END(tmpe); - - policy_string = smartlist_join_strings(policy_string_list, "\n", 0, NULL); - - done: - SMARTLIST_FOREACH(policy_string_list, char *, str, tor_free(str)); - smartlist_free(policy_string_list); - - return policy_string; -} - -/** Implementation for GETINFO control command: knows the answer for questions - * about "exit-policy/..." */ -int -getinfo_helper_policies(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) conn; - (void) errmsg; - if (!strcmp(question, "exit-policy/default")) { - *answer = tor_strdup(DEFAULT_EXIT_POLICY); - } else if (!strcmp(question, "exit-policy/reject-private/default")) { - smartlist_t *private_policy_strings; - const char **priv = private_nets; - - private_policy_strings = smartlist_new(); - - while (*priv != NULL) { - /* IPv6 addresses are in "[]" and contain ":", - * IPv4 addresses are not in "[]" and contain "." */ - smartlist_add_asprintf(private_policy_strings, "reject %s:*", *priv); - priv++; - } - - *answer = smartlist_join_strings(private_policy_strings, - ",", 0, NULL); - - SMARTLIST_FOREACH(private_policy_strings, char *, str, tor_free(str)); - smartlist_free(private_policy_strings); - } else if (!strcmp(question, "exit-policy/reject-private/relay")) { - const or_options_t *options = get_options(); - const routerinfo_t *me = router_get_my_routerinfo(); - - if (!me) { - *errmsg = "router_get_my_routerinfo returned NULL"; - return -1; - } - - if (!options->ExitPolicyRejectPrivate && - !options->ExitPolicyRejectLocalInterfaces) { - *answer = tor_strdup(""); - return 0; - } - - smartlist_t *private_policy_list = smartlist_new(); - smartlist_t *configured_addresses = smartlist_new(); - - /* Copy the configured addresses into the tor_addr_t* list */ - if (options->ExitPolicyRejectPrivate) { - policies_copy_ipv4h_to_smartlist(configured_addresses, me->addr); - policies_copy_addr_to_smartlist(configured_addresses, &me->ipv6_addr); - } - - if (options->ExitPolicyRejectLocalInterfaces) { - policies_copy_outbound_addresses_to_smartlist(configured_addresses, - options); - } - - policies_parse_exit_policy_reject_private( - &private_policy_list, - options->IPv6Exit, - configured_addresses, - options->ExitPolicyRejectLocalInterfaces, - options->ExitPolicyRejectLocalInterfaces); - *answer = policy_dump_to_string(private_policy_list, 1, 1); - - addr_policy_list_free(private_policy_list); - SMARTLIST_FOREACH(configured_addresses, tor_addr_t *, a, tor_free(a)); - smartlist_free(configured_addresses); - } else if (!strcmpstart(question, "exit-policy/")) { - const routerinfo_t *me = router_get_my_routerinfo(); - - int include_ipv4 = 0; - int include_ipv6 = 0; - - if (!strcmp(question, "exit-policy/ipv4")) { - include_ipv4 = 1; - } else if (!strcmp(question, "exit-policy/ipv6")) { - include_ipv6 = 1; - } else if (!strcmp(question, "exit-policy/full")) { - include_ipv4 = include_ipv6 = 1; - } else { - return 0; /* No such key. */ - } - - if (!me) { - *errmsg = "router_get_my_routerinfo returned NULL"; - return -1; - } - - *answer = router_dump_exit_policy_to_string(me,include_ipv4,include_ipv6); - } - return 0; -} - -/** Release all storage held by p. */ -void -addr_policy_list_free_(smartlist_t *lst) -{ - if (!lst) - return; - SMARTLIST_FOREACH(lst, addr_policy_t *, policy, addr_policy_free(policy)); - smartlist_free(lst); -} - -/** Release all storage held by p. */ -void -addr_policy_free_(addr_policy_t *p) -{ - if (!p) - return; - - if (--p->refcnt <= 0) { - if (p->is_canonical) { - policy_map_ent_t search, *found; - search.policy = p; - found = HT_REMOVE(policy_map, &policy_root, &search); - if (found) { - tor_assert(p == found->policy); - tor_free(found); - } - } - tor_free(p); - } -} - -/** Release all storage held by policy variables. */ -void -policies_free_all(void) -{ - addr_policy_list_free(reachable_or_addr_policy); - reachable_or_addr_policy = NULL; - addr_policy_list_free(reachable_dir_addr_policy); - reachable_dir_addr_policy = NULL; - addr_policy_list_free(socks_policy); - socks_policy = NULL; - addr_policy_list_free(dir_policy); - dir_policy = NULL; - addr_policy_list_free(authdir_reject_policy); - authdir_reject_policy = NULL; - addr_policy_list_free(authdir_invalid_policy); - authdir_invalid_policy = NULL; - addr_policy_list_free(authdir_badexit_policy); - authdir_badexit_policy = NULL; - - if (!HT_EMPTY(&policy_root)) { - policy_map_ent_t **ent; - int n = 0; - char buf[POLICY_BUF_LEN]; - - log_warn(LD_MM, "Still had %d address policies cached at shutdown.", - (int)HT_SIZE(&policy_root)); - - /* Note the first 10 cached policies to try to figure out where they - * might be coming from. */ - HT_FOREACH(ent, policy_map, &policy_root) { - if (++n > 10) - break; - if (policy_write_item(buf, sizeof(buf), (*ent)->policy, 0) >= 0) - log_warn(LD_MM," %d [%d]: %s", n, (*ent)->policy->refcnt, buf); - } - } - HT_CLEAR(policy_map, &policy_root); -} - diff --git a/src/tor/src/or/policies.h b/src/tor/src/or/policies.h deleted file mode 100644 index 35220a812..000000000 --- a/src/tor/src/or/policies.h +++ /dev/null @@ -1,154 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file policies.h - * \brief Header file for policies.c. - **/ - -#ifndef TOR_POLICIES_H -#define TOR_POLICIES_H - -/* (length of - * "accept6 [ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]/128:65535-65535\n" - * plus a terminating NUL, rounded up to a nice number.) - */ -#define POLICY_BUF_LEN 72 - -#define EXIT_POLICY_IPV6_ENABLED (1 << 0) -#define EXIT_POLICY_REJECT_PRIVATE (1 << 1) -#define EXIT_POLICY_ADD_DEFAULT (1 << 2) -#define EXIT_POLICY_REJECT_LOCAL_INTERFACES (1 << 3) -#define EXIT_POLICY_ADD_REDUCED (1 << 4) -#define EXIT_POLICY_OPTION_MAX EXIT_POLICY_ADD_REDUCED -/* All options set: used for unit testing */ -#define EXIT_POLICY_OPTION_ALL ((EXIT_POLICY_OPTION_MAX << 1) - 1) - -typedef enum firewall_connection_t { - FIREWALL_OR_CONNECTION = 0, - FIREWALL_DIR_CONNECTION = 1 -} firewall_connection_t; - -typedef int exit_policy_parser_cfg_t; - -int firewall_is_fascist_or(void); -int firewall_is_fascist_dir(void); -int fascist_firewall_use_ipv6(const or_options_t *options); -int fascist_firewall_prefer_ipv6_orport(const or_options_t *options); -int fascist_firewall_prefer_ipv6_dirport(const or_options_t *options); - -int fascist_firewall_allows_address_addr(const tor_addr_t *addr, - uint16_t port, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6); - -int fascist_firewall_allows_rs(const routerstatus_t *rs, - firewall_connection_t fw_connection, - int pref_only); -int fascist_firewall_allows_node(const node_t *node, - firewall_connection_t fw_connection, - int pref_only); -int fascist_firewall_allows_dir_server(const dir_server_t *ds, - firewall_connection_t fw_connection, - int pref_only); - -int fascist_firewall_choose_address_rs(const routerstatus_t *rs, - firewall_connection_t fw_connection, - int pref_only, tor_addr_port_t* ap); -int fascist_firewall_choose_address_node(const node_t *node, - firewall_connection_t fw_connection, - int pref_only, tor_addr_port_t* ap); -int fascist_firewall_choose_address_dir_server(const dir_server_t *ds, - firewall_connection_t fw_connection, - int pref_only, tor_addr_port_t* ap); - -int dir_policy_permits_address(const tor_addr_t *addr); -int socks_policy_permits_address(const tor_addr_t *addr); -int authdir_policy_permits_address(uint32_t addr, uint16_t port); -int authdir_policy_valid_address(uint32_t addr, uint16_t port); -int authdir_policy_badexit_address(uint32_t addr, uint16_t port); - -int validate_addr_policies(const or_options_t *options, char **msg); -void policy_expand_private(smartlist_t **policy); -void policy_expand_unspec(smartlist_t **policy); -int policies_parse_from_options(const or_options_t *options); - -addr_policy_t *addr_policy_get_canonical_entry(addr_policy_t *ent); -int addr_policies_eq(const smartlist_t *a, const smartlist_t *b); -MOCK_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); -addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr, - uint16_t port, const node_t *node); - -int policies_parse_exit_policy_from_options( - const or_options_t *or_options, - uint32_t local_address, - const tor_addr_t *ipv6_local_address, - smartlist_t **result); -int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, - exit_policy_parser_cfg_t options, - const smartlist_t *configured_addresses); -void policies_parse_exit_policy_reject_private( - smartlist_t **dest, - int ipv6_exit, - const smartlist_t *configured_addresses, - int reject_interface_addresses, - int reject_configured_port_addresses); -void policies_exit_policy_append_reject_star(smartlist_t **dest); -void addr_policy_append_reject_addr(smartlist_t **dest, - const tor_addr_t *addr); -void addr_policy_append_reject_addr_list(smartlist_t **dest, - const smartlist_t *addrs); -void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter); -int exit_policy_is_general_exit(smartlist_t *policy); -int policy_is_reject_star(const smartlist_t *policy, sa_family_t family, - int reject_by_default); -char * policy_dump_to_string(const smartlist_t *policy_list, - int include_ipv4, - int include_ipv6); -int getinfo_helper_policies(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); -int policy_write_item(char *buf, size_t buflen, const addr_policy_t *item, - int format_for_desc); - -void addr_policy_list_free_(smartlist_t *p); -#define addr_policy_list_free(lst) \ - FREE_AND_NULL(smartlist_t, addr_policy_list_free_, (lst)) -void addr_policy_free_(addr_policy_t *p); -#define addr_policy_free(p) \ - FREE_AND_NULL(addr_policy_t, addr_policy_free_, (p)) -void policies_free_all(void); - -char *policy_summarize(smartlist_t *policy, sa_family_t family); - -short_policy_t *parse_short_policy(const char *summary); -char *write_short_policy(const short_policy_t *policy); -void short_policy_free_(short_policy_t *policy); -#define short_policy_free(p) \ - FREE_AND_NULL(short_policy_t, short_policy_free_, (p)) -int short_policy_is_reject_star(const short_policy_t *policy); -addr_policy_result_t compare_tor_addr_to_short_policy( - const tor_addr_t *addr, uint16_t port, - const short_policy_t *policy); - -#ifdef POLICIES_PRIVATE -STATIC void append_exit_policy_string(smartlist_t **policy, const char *more); -STATIC int fascist_firewall_allows_address(const tor_addr_t *addr, - uint16_t port, - smartlist_t *firewall_policy, - int pref_only, int pref_ipv6); -STATIC const tor_addr_port_t * fascist_firewall_choose_address( - const tor_addr_port_t *a, - const tor_addr_port_t *b, - int want_a, - firewall_connection_t fw_connection, - int pref_only, int pref_ipv6); - -#endif /* defined(POLICIES_PRIVATE) */ - -#endif /* !defined(TOR_POLICIES_H) */ - diff --git a/src/tor/src/or/proto_cell.c b/src/tor/src/or/proto_cell.c deleted file mode 100644 index 75eb2a7e7..000000000 --- a/src/tor/src/or/proto_cell.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "buffers.h" -#include "proto_cell.h" - -#include "connection_or.h" - -/** True iff the cell command command is one that implies a - * variable-length cell in Tor link protocol linkproto. */ -static inline int -cell_command_is_var_length(uint8_t command, int linkproto) -{ - /* If linkproto is v2 (2), CELL_VERSIONS is the only variable-length cells - * work as implemented here. If it's 1, there are no variable-length cells. - * Tor does not support other versions right now, and so can't negotiate - * them. - */ - switch (linkproto) { - case 1: - /* Link protocol version 1 has no variable-length cells. */ - return 0; - case 2: - /* In link protocol version 2, VERSIONS is the only variable-length cell */ - return command == CELL_VERSIONS; - case 0: - case 3: - default: - /* In link protocol version 3 and later, and in version "unknown", - * commands 128 and higher indicate variable-length. VERSIONS is - * grandfathered in. */ - return command == CELL_VERSIONS || command >= 128; - } -} - -/** Check buf for a variable-length cell according to the rules of link - * protocol version linkproto. If one is found, pull it off the buffer - * and assign a newly allocated var_cell_t to *out, and return 1. - * Return 0 if whatever is on the start of buf_t is not a variable-length - * cell. Return 1 and set *out to NULL if there seems to be the start - * of a variable-length cell on buf, but the whole thing isn't there - * yet. */ -int -fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto) -{ - char hdr[VAR_CELL_MAX_HEADER_SIZE]; - var_cell_t *result; - uint8_t command; - uint16_t length; - const int wide_circ_ids = linkproto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS; - const int circ_id_len = get_circ_id_size(wide_circ_ids); - const unsigned header_len = get_var_cell_header_size(wide_circ_ids); - *out = NULL; - if (buf_datalen(buf) < header_len) - return 0; - buf_peek(buf, hdr, header_len); - - command = get_uint8(hdr + circ_id_len); - if (!(cell_command_is_var_length(command, linkproto))) - return 0; - - length = ntohs(get_uint16(hdr + circ_id_len + 1)); - if (buf_datalen(buf) < (size_t)(header_len+length)) - return 1; - - result = var_cell_new(length); - result->command = command; - if (wide_circ_ids) - result->circ_id = ntohl(get_uint32(hdr)); - else - result->circ_id = ntohs(get_uint16(hdr)); - - buf_drain(buf, header_len); - buf_peek(buf, (char*) result->payload, length); - buf_drain(buf, length); - - *out = result; - return 1; -} - diff --git a/src/tor/src/or/proto_cell.h b/src/tor/src/or/proto_cell.h deleted file mode 100644 index bbc14b9a0..000000000 --- a/src/tor/src/or/proto_cell.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PROTO_CELL_H -#define TOR_PROTO_CELL_H - -struct buf_t; -struct var_cell_t; - -int fetch_var_cell_from_buf(struct buf_t *buf, struct var_cell_t **out, - int linkproto); - -#endif /* !defined(TOR_PROTO_CELL_H) */ - diff --git a/src/tor/src/or/proto_control0.c b/src/tor/src/or/proto_control0.c deleted file mode 100644 index c17ba3494..000000000 --- a/src/tor/src/or/proto_control0.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "buffers.h" -#include "proto_control0.h" - -/** Return 1 iff buf looks more like it has an (obsolete) v0 controller - * command on it than any valid v1 controller command. */ -int -peek_buf_has_control0_command(buf_t *buf) -{ - if (buf_datalen(buf) >= 4) { - char header[4]; - uint16_t cmd; - buf_peek(buf, header, sizeof(header)); - cmd = ntohs(get_uint16(header+2)); - if (cmd <= 0x14) - return 1; /* This is definitely not a v1 control command. */ - } - return 0; -} - diff --git a/src/tor/src/or/proto_control0.h b/src/tor/src/or/proto_control0.h deleted file mode 100644 index 0cc8eacad..000000000 --- a/src/tor/src/or/proto_control0.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PROTO_CONTROL0_H -#define TOR_PROTO_CONTROL0_H - -struct buf_t; -int peek_buf_has_control0_command(struct buf_t *buf); - -#endif /* !defined(TOR_PROTO_CONTROL0_H) */ - diff --git a/src/tor/src/or/proto_ext_or.c b/src/tor/src/or/proto_ext_or.c deleted file mode 100644 index 057cf109e..000000000 --- a/src/tor/src/or/proto_ext_or.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "buffers.h" -#include "ext_orport.h" -#include "proto_ext_or.h" - -/** The size of the header of an Extended ORPort message: 2 bytes for - * COMMAND, 2 bytes for BODYLEN */ -#define EXT_OR_CMD_HEADER_SIZE 4 - -/** Read buf, which should contain an Extended ORPort message - * from a transport proxy. If well-formed, create and populate - * out with the Extended ORport message. Return 0 if the - * buffer was incomplete, 1 if it was well-formed and -1 if we - * encountered an error while parsing it. */ -int -fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out) -{ - char hdr[EXT_OR_CMD_HEADER_SIZE]; - uint16_t len; - - if (buf_datalen(buf) < EXT_OR_CMD_HEADER_SIZE) - return 0; - buf_peek(buf, hdr, sizeof(hdr)); - len = ntohs(get_uint16(hdr+2)); - if (buf_datalen(buf) < (unsigned)len + EXT_OR_CMD_HEADER_SIZE) - return 0; - *out = ext_or_cmd_new(len); - (*out)->cmd = ntohs(get_uint16(hdr)); - (*out)->len = len; - buf_drain(buf, EXT_OR_CMD_HEADER_SIZE); - buf_get_bytes(buf, (*out)->body, len); - return 1; -} - diff --git a/src/tor/src/or/proto_ext_or.h b/src/tor/src/or/proto_ext_or.h deleted file mode 100644 index cc504d18e..000000000 --- a/src/tor/src/or/proto_ext_or.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PROTO_EXT_OR_H -#define TOR_PROTO_EXT_OR_H - -struct buf_t; -struct ext_or_cmt_t; - -int fetch_ext_or_command_from_buf(struct buf_t *buf, - struct ext_or_cmd_t **out); - -#endif /* !defined(TOR_PROTO_EXT_OR_H) */ - diff --git a/src/tor/src/or/proto_http.c b/src/tor/src/or/proto_http.c deleted file mode 100644 index 3762429e1..000000000 --- a/src/tor/src/or/proto_http.c +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define PROTO_HTTP_PRIVATE -#include "or.h" -#include "buffers.h" -#include "proto_http.h" - -/** Return true if cmd looks like a HTTP (proxy) request. */ -int -peek_buf_has_http_command(const buf_t *buf) -{ - if (buf_peek_startswith(buf, "CONNECT ") || - buf_peek_startswith(buf, "DELETE ") || - buf_peek_startswith(buf, "GET ") || - buf_peek_startswith(buf, "POST ") || - buf_peek_startswith(buf, "PUT " )) - return 1; - return 0; -} - -/** There is a (possibly incomplete) http statement on buf, of the - * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain NULs.) - * If a) the headers include a Content-Length field and all bytes in - * the body are present, or b) there's no Content-Length field and - * all headers are present, then: - * - * - strdup headers into *headers_out, and NUL-terminate it. - * - memdup body into *body_out, and NUL-terminate it. - * - Then remove them from buf, and return 1. - * - * - If headers or body is NULL, discard that part of the buf. - * - If a headers or body doesn't fit in the arg, return -1. - * (We ensure that the headers or body don't exceed max len, - * _even if_ we're planning to discard them.) - * - If force_complete is true, then succeed even if not all of the - * content has arrived. - * - * Else, change nothing and return 0. - */ -int -fetch_from_buf_http(buf_t *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete) -{ - const char *headers; - size_t headerlen, bodylen, contentlen=0; - int crlf_offset; - int r; - - if (buf_datalen(buf) == 0) - return 0; - - crlf_offset = buf_find_string_offset(buf, "\r\n\r\n", 4); - if (crlf_offset > (int)max_headerlen || - (crlf_offset < 0 && buf_datalen(buf) > max_headerlen)) { - log_debug(LD_HTTP,"headers too long."); - return -1; - } else if (crlf_offset < 0) { - log_debug(LD_HTTP,"headers not all here yet."); - return 0; - } - /* Okay, we have a full header. Make sure it all appears in the first - * chunk. */ - headerlen = crlf_offset + 4; - size_t headers_in_chunk = 0; - buf_pullup(buf, headerlen, &headers, &headers_in_chunk); - - bodylen = buf_datalen(buf) - headerlen; - log_debug(LD_HTTP,"headerlen %d, bodylen %d.", (int)headerlen, (int)bodylen); - - if (max_headerlen <= headerlen) { - log_warn(LD_HTTP,"headerlen %d larger than %d. Failing.", - (int)headerlen, (int)max_headerlen-1); - return -1; - } - if (max_bodylen <= bodylen) { - log_warn(LD_HTTP,"bodylen %d larger than %d. Failing.", - (int)bodylen, (int)max_bodylen-1); - return -1; - } - - r = buf_http_find_content_length(headers, headerlen, &contentlen); - if (r == -1) { - log_warn(LD_PROTOCOL, "Content-Length is bogus; maybe " - "someone is trying to crash us."); - return -1; - } else if (r == 1) { - /* if content-length is malformed, then our body length is 0. fine. */ - log_debug(LD_HTTP,"Got a contentlen of %d.",(int)contentlen); - if (bodylen < contentlen) { - if (!force_complete) { - log_debug(LD_HTTP,"body not all here yet."); - return 0; /* not all there yet */ - } - } - if (bodylen > contentlen) { - bodylen = contentlen; - log_debug(LD_HTTP,"bodylen reduced to %d.",(int)bodylen); - } - } else { - tor_assert(r == 0); - /* Leave bodylen alone */ - } - - /* all happy. copy into the appropriate places, and return 1 */ - if (headers_out) { - *headers_out = tor_malloc(headerlen+1); - buf_get_bytes(buf, *headers_out, headerlen); - (*headers_out)[headerlen] = 0; /* NUL terminate it */ - } - if (body_out) { - tor_assert(body_used); - *body_used = bodylen; - *body_out = tor_malloc(bodylen+1); - buf_get_bytes(buf, *body_out, bodylen); - (*body_out)[bodylen] = 0; /* NUL terminate it */ - } - return 1; -} - -/** - * Scan the HTTP headers in the headerlen-byte memory range at - * headers, looking for a "Content-Length" header. Try to set - * *result_out to the numeric value of that header if possible. - * Return -1 if the header was malformed, 0 if it was missing, and 1 if - * it was present and well-formed. - */ -STATIC int -buf_http_find_content_length(const char *headers, size_t headerlen, - size_t *result_out) -{ - const char *p, *newline; - char *len_str, *eos=NULL; - size_t remaining, result; - int ok; - *result_out = 0; /* The caller shouldn't look at this unless the - * return value is 1, but let's prevent confusion */ - -#define CONTENT_LENGTH "\r\nContent-Length: " - p = (char*) tor_memstr(headers, headerlen, CONTENT_LENGTH); - if (p == NULL) - return 0; - - tor_assert(p >= headers && p < headers+headerlen); - remaining = (headers+headerlen)-p; - p += strlen(CONTENT_LENGTH); - remaining -= strlen(CONTENT_LENGTH); - - newline = memchr(p, '\n', remaining); - if (newline == NULL) - return -1; - - len_str = tor_memdup_nulterm(p, newline-p); - /* We limit the size to INT_MAX because other parts of the buffer.c - * code don't like buffers to be any bigger than that. */ - result = (size_t) tor_parse_uint64(len_str, 10, 0, INT_MAX, &ok, &eos); - if (eos && !tor_strisspace(eos)) { - ok = 0; - } else { - *result_out = result; - } - tor_free(len_str); - - return ok ? 1 : -1; -} - diff --git a/src/tor/src/or/proto_http.h b/src/tor/src/or/proto_http.h deleted file mode 100644 index 805686070..000000000 --- a/src/tor/src/or/proto_http.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PROTO_HTTP_H -#define TOR_PROTO_HTTP_H - -struct buf_t; - -int fetch_from_buf_http(struct buf_t *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete); -int peek_buf_has_http_command(const struct buf_t *buf); - -#ifdef PROTO_HTTP_PRIVATE -STATIC int buf_http_find_content_length(const char *headers, size_t headerlen, - size_t *result_out); -#endif - -#endif /* !defined(TOR_PROTO_HTTP_H) */ - diff --git a/src/tor/src/or/proto_socks.c b/src/tor/src/or/proto_socks.c deleted file mode 100644 index 91633d02a..000000000 --- a/src/tor/src/or/proto_socks.c +++ /dev/null @@ -1,710 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "addressmap.h" -#include "buffers.h" -#include "control.h" -#include "config.h" -#include "ext_orport.h" -#include "proto_socks.h" -#include "reasons.h" - -static void socks_request_set_socks5_error(socks_request_t *req, - socks5_reply_status_t reason); - -static int parse_socks(const char *data, size_t datalen, socks_request_t *req, - int log_sockstype, int safe_socks, ssize_t *drain_out, - size_t *want_length_out); -static int parse_socks_client(const uint8_t *data, size_t datalen, - int state, char **reason, - ssize_t *drain_out); -/** - * Wait this many seconds before warning the user about using SOCKS unsafely - * again. */ -#define SOCKS_WARN_INTERVAL 5 - -/** Warn that the user application has made an unsafe socks request using - * protocol socks_protocol on port port. Don't warn more than - * once per SOCKS_WARN_INTERVAL, unless safe_socks is set. */ -static void -log_unsafe_socks_warning(int socks_protocol, const char *address, - uint16_t port, int safe_socks) -{ - static ratelim_t socks_ratelim = RATELIM_INIT(SOCKS_WARN_INTERVAL); - - if (safe_socks) { - log_fn_ratelim(&socks_ratelim, LOG_WARN, LD_APP, - "Your application (using socks%d to port %d) is giving " - "Tor only an IP address. Applications that do DNS resolves " - "themselves may leak information. Consider using Socks4A " - "(e.g. via privoxy or socat) instead. For more information, " - "please see https://wiki.torproject.org/TheOnionRouter/" - "TorFAQ#SOCKSAndDNS.%s", - socks_protocol, - (int)port, - safe_socks ? " Rejecting." : ""); - } - control_event_client_status(LOG_WARN, - "DANGEROUS_SOCKS PROTOCOL=SOCKS%d ADDRESS=%s:%d", - socks_protocol, address, (int)port); -} - -/** Do not attempt to parse socks messages longer than this. This value is - * actually significantly higher than the longest possible socks message. */ -#define MAX_SOCKS_MESSAGE_LEN 512 - -/** Return a new socks_request_t. */ -socks_request_t * -socks_request_new(void) -{ - return tor_malloc_zero(sizeof(socks_request_t)); -} - -/** Free all storage held in the socks_request_t req. */ -void -socks_request_free_(socks_request_t *req) -{ - if (!req) - return; - if (req->username) { - memwipe(req->username, 0x10, req->usernamelen); - tor_free(req->username); - } - if (req->password) { - memwipe(req->password, 0x04, req->passwordlen); - tor_free(req->password); - } - memwipe(req, 0xCC, sizeof(socks_request_t)); - tor_free(req); -} - -/** There is a (possibly incomplete) socks handshake on buf, of one - * of the forms - * - socks4: "socksheader username\\0" - * - socks4a: "socksheader username\\0 destaddr\\0" - * - socks5 phase one: "version #methods methods" - * - socks5 phase two: "version command 0 addresstype..." - * If it's a complete and valid handshake, and destaddr fits in - * MAX_SOCKS_ADDR_LEN bytes, then pull the handshake off the buf, - * assign to req, and return 1. - * - * If it's invalid or too big, return -1. - * - * Else it's not all there yet, leave buf alone and return 0. - * - * If you want to specify the socks reply, write it into req->reply - * and set req->replylen, else leave req->replylen alone. - * - * If log_sockstype is non-zero, then do a notice-level log of whether - * the connection is possibly leaking DNS requests locally or not. - * - * If safe_socks is true, then reject unsafe socks protocols. - * - * If returning 0 or -1, req->address and req->port are - * undefined. - */ -int -fetch_from_buf_socks(buf_t *buf, socks_request_t *req, - int log_sockstype, int safe_socks) -{ - int res; - ssize_t n_drain; - size_t want_length = 128; - const char *head = NULL; - size_t datalen = 0; - - if (buf_datalen(buf) < 2) /* version and another byte */ - return 0; - - do { - n_drain = 0; - buf_pullup(buf, want_length, &head, &datalen); - tor_assert(head && datalen >= 2); - want_length = 0; - - res = parse_socks(head, datalen, req, log_sockstype, - safe_socks, &n_drain, &want_length); - - if (n_drain < 0) - buf_clear(buf); - else if (n_drain > 0) - buf_drain(buf, n_drain); - - } while (res == 0 && head && want_length < buf_datalen(buf) && - buf_datalen(buf) >= 2); - - return res; -} - -/** Create a SOCKS5 reply message with reason in its REP field and - * have Tor send it as error response to req. - */ -static void -socks_request_set_socks5_error(socks_request_t *req, - socks5_reply_status_t reason) -{ - req->replylen = 10; - memset(req->reply,0,10); - - req->reply[0] = 0x05; // VER field. - req->reply[1] = reason; // REP field. - req->reply[3] = 0x01; // ATYP field. -} - -static const char SOCKS_PROXY_IS_NOT_AN_HTTP_PROXY_MSG[] = - "HTTP/1.0 501 Tor is not an HTTP Proxy\r\n" - "Content-Type: text/html; charset=iso-8859-1\r\n\r\n" - "\n" - "\n" - "This is a SOCKS Proxy, Not An HTTP Proxy\n" - "\n" - "\n" - "

      This is a SOCKs proxy, not an HTTP proxy.

      \n" - "

      \n" - "It appears you have configured your web browser to use this Tor port as\n" - "an HTTP proxy.\n" - "

      \n" - "This is not correct: This port is configured as a SOCKS proxy, not\n" - "an HTTP proxy. If you need an HTTP proxy tunnel, use the HTTPTunnelPort\n" - "configuration option in place of, or in addition to, SOCKSPort.\n" - "Please configure your client accordingly.\n" - "

      \n" - "

      \n" - "See " - "https://www.torproject.org/documentation.html for more " - "information.\n" - "

      \n" - "\n" - "\n"; - -/** Implementation helper to implement fetch_from_*_socks. Instead of looking - * at a buffer's contents, we look at the datalen bytes of data in - * data. Instead of removing data from the buffer, we set - * drain_out to the amount of data that should be removed (or -1 if the - * buffer should be cleared). Instead of pulling more data into the first - * chunk of the buffer, we set *want_length_out to the number of bytes - * we'd like to see in the input buffer, if they're available. */ -static int -parse_socks(const char *data, size_t datalen, socks_request_t *req, - int log_sockstype, int safe_socks, ssize_t *drain_out, - size_t *want_length_out) -{ - unsigned int len; - char tmpbuf[TOR_ADDR_BUF_LEN+1]; - tor_addr_t destaddr; - uint32_t destip; - uint8_t socksver; - char *next, *startaddr; - unsigned char usernamelen, passlen; - struct in_addr in; - - if (datalen < 2) { - /* We always need at least 2 bytes. */ - *want_length_out = 2; - return 0; - } - - if (req->socks_version == 5 && !req->got_auth) { - /* See if we have received authentication. Strictly speaking, we should - also check whether we actually negotiated username/password - authentication. But some broken clients will send us authentication - even if we negotiated SOCKS_NO_AUTH. */ - if (*data == 1) { /* username/pass version 1 */ - /* Format is: authversion [1 byte] == 1 - usernamelen [1 byte] - username [usernamelen bytes] - passlen [1 byte] - password [passlen bytes] */ - usernamelen = (unsigned char)*(data + 1); - if (datalen < 2u + usernamelen + 1u) { - *want_length_out = 2u + usernamelen + 1u; - return 0; - } - passlen = (unsigned char)*(data + 2u + usernamelen); - if (datalen < 2u + usernamelen + 1u + passlen) { - *want_length_out = 2u + usernamelen + 1u + passlen; - return 0; - } - req->replylen = 2; /* 2 bytes of response */ - req->reply[0] = 1; /* authversion == 1 */ - req->reply[1] = 0; /* authentication successful */ - log_debug(LD_APP, - "socks5: Accepted username/password without checking."); - if (usernamelen) { - req->username = tor_memdup(data+2u, usernamelen); - req->usernamelen = usernamelen; - } - if (passlen) { - req->password = tor_memdup(data+3u+usernamelen, passlen); - req->passwordlen = passlen; - } - *drain_out = 2u + usernamelen + 1u + passlen; - req->got_auth = 1; - *want_length_out = 7; /* Minimal socks5 command. */ - return 0; - } else if (req->auth_type == SOCKS_USER_PASS) { - /* unknown version byte */ - log_warn(LD_APP, "Socks5 username/password version %d not recognized; " - "rejecting.", (int)*data); - return -1; - } - } - - socksver = *data; - - switch (socksver) { /* which version of socks? */ - case 5: /* socks5 */ - - if (req->socks_version != 5) { /* we need to negotiate a method */ - unsigned char nummethods = (unsigned char)*(data+1); - int have_user_pass, have_no_auth; - int r=0; - tor_assert(!req->socks_version); - if (datalen < 2u+nummethods) { - *want_length_out = 2u+nummethods; - return 0; - } - if (!nummethods) - return -1; - req->replylen = 2; /* 2 bytes of response */ - req->reply[0] = 5; /* socks5 reply */ - have_user_pass = (memchr(data+2, SOCKS_USER_PASS, nummethods) !=NULL); - have_no_auth = (memchr(data+2, SOCKS_NO_AUTH, nummethods) !=NULL); - if (have_user_pass && !(have_no_auth && req->socks_prefer_no_auth)) { - req->auth_type = SOCKS_USER_PASS; - req->reply[1] = SOCKS_USER_PASS; /* tell client to use "user/pass" - auth method */ - req->socks_version = 5; /* remember we've already negotiated auth */ - log_debug(LD_APP,"socks5: accepted method 2 (username/password)"); - r=0; - } else if (have_no_auth) { - req->reply[1] = SOCKS_NO_AUTH; /* tell client to use "none" auth - method */ - req->socks_version = 5; /* remember we've already negotiated auth */ - log_debug(LD_APP,"socks5: accepted method 0 (no authentication)"); - r=0; - } else { - log_warn(LD_APP, - "socks5: offered methods don't include 'no auth' or " - "username/password. Rejecting."); - req->reply[1] = '\xFF'; /* reject all methods */ - r=-1; - } - /* Remove packet from buf. Some SOCKS clients will have sent extra - * junk at this point; let's hope it's an authentication message. */ - *drain_out = 2u + nummethods; - - return r; - } - if (req->auth_type != SOCKS_NO_AUTH && !req->got_auth) { - log_warn(LD_APP, - "socks5: negotiated authentication, but none provided"); - return -1; - } - /* we know the method; read in the request */ - log_debug(LD_APP,"socks5: checking request"); - if (datalen < 7) {/* basic info plus >=1 for addr plus 2 for port */ - *want_length_out = 7; - return 0; /* not yet */ - } - req->command = (unsigned char) *(data+1); - if (req->command != SOCKS_COMMAND_CONNECT && - req->command != SOCKS_COMMAND_RESOLVE && - req->command != SOCKS_COMMAND_RESOLVE_PTR) { - /* not a connect or resolve or a resolve_ptr? we don't support it. */ - socks_request_set_socks5_error(req,SOCKS5_COMMAND_NOT_SUPPORTED); - - log_warn(LD_APP,"socks5: command %d not recognized. Rejecting.", - req->command); - return -1; - } - switch (*(data+3)) { /* address type */ - case 1: /* IPv4 address */ - case 4: /* IPv6 address */ { - const int is_v6 = *(data+3) == 4; - const unsigned addrlen = is_v6 ? 16 : 4; - log_debug(LD_APP,"socks5: ipv4 address type"); - if (datalen < 6+addrlen) {/* ip/port there? */ - *want_length_out = 6+addrlen; - return 0; /* not yet */ - } - - if (is_v6) - tor_addr_from_ipv6_bytes(&destaddr, data+4); - else - tor_addr_from_ipv4n(&destaddr, get_uint32(data+4)); - - tor_addr_to_str(tmpbuf, &destaddr, sizeof(tmpbuf), 1); - - if (BUG(strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN)) { - /* LCOV_EXCL_START -- This branch is unreachable, given the - * size of tmpbuf and the actual value of MAX_SOCKS_ADDR_LEN */ - socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR); - log_warn(LD_APP, - "socks5 IP takes %d bytes, which doesn't fit in %d. " - "Rejecting.", - (int)strlen(tmpbuf)+1,(int)MAX_SOCKS_ADDR_LEN); - return -1; - /* LCOV_EXCL_STOP */ - } - strlcpy(req->address,tmpbuf,sizeof(req->address)); - req->port = ntohs(get_uint16(data+4+addrlen)); - *drain_out = 6+addrlen; - if (req->command != SOCKS_COMMAND_RESOLVE_PTR && - !addressmap_have_mapping(req->address,0)) { - log_unsafe_socks_warning(5, req->address, req->port, safe_socks); - if (safe_socks) { - socks_request_set_socks5_error(req, SOCKS5_NOT_ALLOWED); - return -1; - } - } - return 1; - } - case 3: /* fqdn */ - log_debug(LD_APP,"socks5: fqdn address type"); - if (req->command == SOCKS_COMMAND_RESOLVE_PTR) { - socks_request_set_socks5_error(req, - SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED); - log_warn(LD_APP, "socks5 received RESOLVE_PTR command with " - "hostname type. Rejecting."); - return -1; - } - len = (unsigned char)*(data+4); - if (datalen < 7+len) { /* addr/port there? */ - *want_length_out = 7+len; - return 0; /* not yet */ - } - if (BUG(len+1 > MAX_SOCKS_ADDR_LEN)) { - /* LCOV_EXCL_START -- unreachable, since len is at most 255, - * and MAX_SOCKS_ADDR_LEN is 256. */ - socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR); - log_warn(LD_APP, - "socks5 hostname is %d bytes, which doesn't fit in " - "%d. Rejecting.", len+1,MAX_SOCKS_ADDR_LEN); - return -1; - /* LCOV_EXCL_STOP */ - } - memcpy(req->address,data+5,len); - req->address[len] = 0; - req->port = ntohs(get_uint16(data+5+len)); - *drain_out = 5+len+2; - - if (!string_is_valid_hostname(req->address)) { - socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR); - - log_warn(LD_PROTOCOL, - "Your application (using socks5 to port %d) gave Tor " - "a malformed hostname: %s. Rejecting the connection.", - req->port, escaped_safe_str_client(req->address)); - return -1; - } - if (log_sockstype) - log_notice(LD_APP, - "Your application (using socks5 to port %d) instructed " - "Tor to take care of the DNS resolution itself if " - "necessary. This is good.", req->port); - return 1; - default: /* unsupported */ - socks_request_set_socks5_error(req, - SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED); - log_warn(LD_APP,"socks5: unsupported address type %d. Rejecting.", - (int) *(data+3)); - return -1; - } - tor_assert(0); - break; - case 4: { /* socks4 */ - enum {socks4, socks4a} socks4_prot = socks4a; - const char *authstart, *authend; - /* http://ss5.sourceforge.net/socks4.protocol.txt */ - /* http://ss5.sourceforge.net/socks4A.protocol.txt */ - - req->socks_version = 4; - if (datalen < SOCKS4_NETWORK_LEN) {/* basic info available? */ - *want_length_out = SOCKS4_NETWORK_LEN; - return 0; /* not yet */ - } - // buf_pullup(buf, 1280); - req->command = (unsigned char) *(data+1); - if (req->command != SOCKS_COMMAND_CONNECT && - req->command != SOCKS_COMMAND_RESOLVE) { - /* not a connect or resolve? we don't support it. (No resolve_ptr with - * socks4.) */ - log_warn(LD_APP,"socks4: command %d not recognized. Rejecting.", - req->command); - return -1; - } - - req->port = ntohs(get_uint16(data+2)); - destip = ntohl(get_uint32(data+4)); - if ((!req->port && req->command!=SOCKS_COMMAND_RESOLVE) || !destip) { - log_warn(LD_APP,"socks4: Port or DestIP is zero. Rejecting."); - return -1; - } - if (destip >> 8) { - log_debug(LD_APP,"socks4: destip not in form 0.0.0.x."); - in.s_addr = htonl(destip); - tor_inet_ntoa(&in,tmpbuf,sizeof(tmpbuf)); - if (BUG(strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN)) { - /* LCOV_EXCL_START -- This branch is unreachable, given the - * size of tmpbuf and the actual value of MAX_SOCKS_ADDR_LEN */ - log_debug(LD_APP,"socks4 addr (%d bytes) too long. Rejecting.", - (int)strlen(tmpbuf)); - return -1; - /* LCOV_EXCL_STOP */ - } - log_debug(LD_APP, - "socks4: successfully read destip (%s)", - safe_str_client(tmpbuf)); - socks4_prot = socks4; - } - - authstart = data + SOCKS4_NETWORK_LEN; - next = memchr(authstart, 0, - datalen-SOCKS4_NETWORK_LEN); - if (!next) { - if (datalen >= 1024) { - log_debug(LD_APP, "Socks4 user name too long; rejecting."); - return -1; - } - log_debug(LD_APP,"socks4: Username not here yet."); - *want_length_out = datalen+1024; /* More than we need, but safe */ - return 0; - } - authend = next; - tor_assert(next < data+datalen); - - startaddr = NULL; - if (socks4_prot != socks4a && - !addressmap_have_mapping(tmpbuf,0)) { - log_unsafe_socks_warning(4, tmpbuf, req->port, safe_socks); - - if (safe_socks) - return -1; - } - if (socks4_prot == socks4a) { - if (next+1 == data+datalen) { - log_debug(LD_APP,"socks4: No part of destaddr here yet."); - *want_length_out = datalen + 1024; /* More than we need, but safe */ - return 0; - } - startaddr = next+1; - next = memchr(startaddr, 0, data + datalen - startaddr); - if (!next) { - if (datalen >= 1024) { - log_debug(LD_APP,"socks4: Destaddr too long."); - return -1; - } - log_debug(LD_APP,"socks4: Destaddr not all here yet."); - *want_length_out = datalen + 1024; /* More than we need, but safe */ - return 0; - } - if (MAX_SOCKS_ADDR_LEN <= next-startaddr) { - log_warn(LD_APP,"socks4: Destaddr too long. Rejecting."); - return -1; - } - // tor_assert(next < buf->cur+buf_datalen(buf)); - - if (log_sockstype) - log_notice(LD_APP, - "Your application (using socks4a to port %d) instructed " - "Tor to take care of the DNS resolution itself if " - "necessary. This is good.", req->port); - } - log_debug(LD_APP,"socks4: Everything is here. Success."); - strlcpy(req->address, startaddr ? startaddr : tmpbuf, - sizeof(req->address)); - if (!string_is_valid_hostname(req->address)) { - log_warn(LD_PROTOCOL, - "Your application (using socks4 to port %d) gave Tor " - "a malformed hostname: %s. Rejecting the connection.", - req->port, escaped_safe_str_client(req->address)); - return -1; - } - if (authend != authstart) { - req->got_auth = 1; - req->usernamelen = authend - authstart; - req->username = tor_memdup(authstart, authend - authstart); - } - /* next points to the final \0 on inbuf */ - *drain_out = next - data + 1; - return 1; - } - case 'G': /* get */ - case 'H': /* head */ - case 'P': /* put/post */ - case 'C': /* connect */ - strlcpy((char*)req->reply, SOCKS_PROXY_IS_NOT_AN_HTTP_PROXY_MSG, - MAX_SOCKS_REPLY_LEN); - req->replylen = strlen((char*)req->reply)+1; - /* fall through */ - default: /* version is not socks4 or socks5 */ - log_warn(LD_APP, - "Socks version %d not recognized. (This port is not an " - "HTTP proxy; did you want to use HTTPTunnelPort?)", - *(data)); - { - /* Tell the controller the first 8 bytes. */ - char *tmp = tor_strndup(data, datalen < 8 ? datalen : 8); - control_event_client_status(LOG_WARN, - "SOCKS_UNKNOWN_PROTOCOL DATA=\"%s\"", - escaped(tmp)); - tor_free(tmp); - } - return -1; - } -} - -/** Inspect a reply from SOCKS server stored in buf according - * to state, removing the protocol data upon success. Return 0 on - * incomplete response, 1 on success and -1 on error, in which case - * reason is set to a descriptive message (free() when finished - * with it). - * - * As a special case, 2 is returned when user/pass is required - * during SOCKS5 handshake and user/pass is configured. - */ -int -fetch_from_buf_socks_client(buf_t *buf, int state, char **reason) -{ - ssize_t drain = 0; - int r; - const char *head = NULL; - size_t datalen = 0; - - if (buf_datalen(buf) < 2) - return 0; - - buf_pullup(buf, MAX_SOCKS_MESSAGE_LEN, &head, &datalen); - tor_assert(head && datalen >= 2); - - r = parse_socks_client((uint8_t*)head, datalen, - state, reason, &drain); - if (drain > 0) - buf_drain(buf, drain); - else if (drain < 0) - buf_clear(buf); - - return r; -} - -/** Implementation logic for fetch_from_*_socks_client. */ -static int -parse_socks_client(const uint8_t *data, size_t datalen, - int state, char **reason, - ssize_t *drain_out) -{ - unsigned int addrlen; - *drain_out = 0; - if (datalen < 2) - return 0; - - switch (state) { - case PROXY_SOCKS4_WANT_CONNECT_OK: - /* Wait for the complete response */ - if (datalen < 8) - return 0; - - if (data[1] != 0x5a) { - *reason = tor_strdup(socks4_response_code_to_string(data[1])); - return -1; - } - - /* Success */ - *drain_out = 8; - return 1; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: - /* we don't have any credentials */ - if (data[1] != 0x00) { - *reason = tor_strdup("server doesn't support any of our " - "available authentication methods"); - return -1; - } - - log_info(LD_NET, "SOCKS 5 client: continuing without authentication"); - *drain_out = -1; - return 1; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: - /* we have a username and password. return 1 if we can proceed without - * providing authentication, or 2 otherwise. */ - switch (data[1]) { - case 0x00: - log_info(LD_NET, "SOCKS 5 client: we have auth details but server " - "doesn't require authentication."); - *drain_out = -1; - return 1; - case 0x02: - log_info(LD_NET, "SOCKS 5 client: need authentication."); - *drain_out = -1; - return 2; - /* fall through */ - } - - *reason = tor_strdup("server doesn't support any of our available " - "authentication methods"); - return -1; - - case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: - /* handle server reply to rfc1929 authentication */ - if (data[1] != 0x00) { - *reason = tor_strdup("authentication failed"); - return -1; - } - - log_info(LD_NET, "SOCKS 5 client: authentication successful."); - *drain_out = -1; - return 1; - - case PROXY_SOCKS5_WANT_CONNECT_OK: - /* response is variable length. BND.ADDR, etc, isn't needed - * (don't bother with buf_pullup()), but make sure to eat all - * the data used */ - - /* wait for address type field to arrive */ - if (datalen < 4) - return 0; - - switch (data[3]) { - case 0x01: /* ip4 */ - addrlen = 4; - break; - case 0x04: /* ip6 */ - addrlen = 16; - break; - case 0x03: /* fqdn (can this happen here?) */ - if (datalen < 5) - return 0; - addrlen = 1 + data[4]; - break; - default: - *reason = tor_strdup("invalid response to connect request"); - return -1; - } - - /* wait for address and port */ - if (datalen < 6 + addrlen) - return 0; - - if (data[1] != 0x00) { - *reason = tor_strdup(socks5_response_code_to_string(data[1])); - return -1; - } - - *drain_out = 6 + addrlen; - return 1; - } - - /* LCOV_EXCL_START */ - /* shouldn't get here if the input state is one we know about... */ - tor_assert(0); - - return -1; - /* LCOV_EXCL_STOP */ -} - diff --git a/src/tor/src/or/proto_socks.h b/src/tor/src/or/proto_socks.h deleted file mode 100644 index 02e0aca7e..000000000 --- a/src/tor/src/or/proto_socks.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_PROTO_SOCKS_H -#define TOR_PROTO_SOCKS_H - -struct socks_request_t; -struct buf_t; - -struct socks_request_t *socks_request_new(void); -void socks_request_free_(struct socks_request_t *req); -#define socks_request_free(req) \ - FREE_AND_NULL(socks_request_t, socks_request_free_, (req)) -int fetch_from_buf_socks(struct buf_t *buf, socks_request_t *req, - int log_sockstype, int safe_socks); -int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason); - -#endif /* !defined(TOR_PROTO_SOCKS_H) */ - diff --git a/src/tor/src/or/protover.c b/src/tor/src/or/protover.c deleted file mode 100644 index 1a5f4ac91..000000000 --- a/src/tor/src/or/protover.c +++ /dev/null @@ -1,787 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file protover.c - * \brief Versioning information for different pieces of the Tor protocol. - * - * Starting in version 0.2.9.3-alpha, Tor places separate version numbers on - * each of the different components of its protocol. Relays use these numbers - * to advertise what versions of the protocols they can support, and clients - * use them to find what they can ask a given relay to do. Authorities vote - * on the supported protocol versions for each relay, and also vote on the - * which protocols you should have to support in order to be on the Tor - * network. All Tor instances use these required/recommended protocol versions - * to tell what level of support for recent protocols each relay has, and - * to decide whether they should be running given their current protocols. - * - * The main advantage of these protocol versions numbers over using Tor - * version numbers is that they allow different implementations of the Tor - * protocols to develop independently, without having to claim compatibility - * with specific versions of Tor. - **/ - -#define PROTOVER_PRIVATE - -#include "or.h" -#include "protover.h" -#include "routerparse.h" - -#ifndef HAVE_RUST - -static const smartlist_t *get_supported_protocol_list(void); -static int protocol_list_contains(const smartlist_t *protos, - protocol_type_t pr, uint32_t ver); - -/** Mapping between protocol type string and protocol type. */ -/// C_RUST_COUPLED: src/rust/protover/protover.rs `PROTOCOL_NAMES` -static const struct { - protocol_type_t protover_type; - const char *name; -} PROTOCOL_NAMES[] = { - { PRT_LINK, "Link" }, - { PRT_LINKAUTH, "LinkAuth" }, - { PRT_RELAY, "Relay" }, - { PRT_DIRCACHE, "DirCache" }, - { PRT_HSDIR, "HSDir" }, - { PRT_HSINTRO, "HSIntro" }, - { PRT_HSREND, "HSRend" }, - { PRT_DESC, "Desc" }, - { PRT_MICRODESC, "Microdesc"}, - { PRT_CONS, "Cons" } -}; - -#define N_PROTOCOL_NAMES ARRAY_LENGTH(PROTOCOL_NAMES) - -/** - * Given a protocol_type_t, return the corresponding string used in - * descriptors. - */ -STATIC const char * -protocol_type_to_str(protocol_type_t pr) -{ - unsigned i; - for (i=0; i < N_PROTOCOL_NAMES; ++i) { - if (PROTOCOL_NAMES[i].protover_type == pr) - return PROTOCOL_NAMES[i].name; - } - /* LCOV_EXCL_START */ - tor_assert_nonfatal_unreached_once(); - return "UNKNOWN"; - /* LCOV_EXCL_STOP */ -} - -/** - * Given a string, find the corresponding protocol type and store it in - * pr_out. Return 0 on success, -1 on failure. - */ -STATIC int -str_to_protocol_type(const char *s, protocol_type_t *pr_out) -{ - if (BUG(!pr_out)) - return -1; - - unsigned i; - for (i=0; i < N_PROTOCOL_NAMES; ++i) { - if (0 == strcmp(s, PROTOCOL_NAMES[i].name)) { - *pr_out = PROTOCOL_NAMES[i].protover_type; - return 0; - } - } - - return -1; -} - -/** - * Release all space held by a single proto_entry_t structure - */ -STATIC void -proto_entry_free_(proto_entry_t *entry) -{ - if (!entry) - return; - tor_free(entry->name); - SMARTLIST_FOREACH(entry->ranges, proto_range_t *, r, tor_free(r)); - smartlist_free(entry->ranges); - tor_free(entry); -} - -/** - * Given a string s and optional end-of-string pointer - * end_of_range, parse the protocol range and store it in - * low_out and high_out. A protocol range has the format U, or - * U-U, where U is an unsigned 32-bit integer. - */ -static int -parse_version_range(const char *s, const char *end_of_range, - uint32_t *low_out, uint32_t *high_out) -{ - uint32_t low, high; - char *next = NULL; - int ok; - - tor_assert(high_out); - tor_assert(low_out); - - if (BUG(!end_of_range)) - end_of_range = s + strlen(s); // LCOV_EXCL_LINE - - /* Note that this wouldn't be safe if we didn't know that eventually, - * we'd hit a NUL */ - low = (uint32_t) tor_parse_ulong(s, 10, 0, UINT32_MAX, &ok, &next); - if (!ok) - goto error; - if (next > end_of_range) - goto error; - if (next == end_of_range) { - high = low; - goto done; - } - - if (*next != '-') - goto error; - s = next+1; - /* ibid */ - high = (uint32_t) tor_parse_ulong(s, 10, 0, UINT32_MAX, &ok, &next); - if (!ok) - goto error; - if (next != end_of_range) - goto error; - - done: - *high_out = high; - *low_out = low; - return 0; - - error: - return -1; -} - -/** Parse a single protocol entry from s up to an optional - * end_of_entry pointer, and return that protocol entry. Return NULL - * on error. - * - * A protocol entry has a keyword, an = sign, and zero or more ranges. */ -static proto_entry_t * -parse_single_entry(const char *s, const char *end_of_entry) -{ - proto_entry_t *out = tor_malloc_zero(sizeof(proto_entry_t)); - const char *equals; - - out->ranges = smartlist_new(); - - if (BUG (!end_of_entry)) - end_of_entry = s + strlen(s); // LCOV_EXCL_LINE - - /* There must be an =. */ - equals = memchr(s, '=', end_of_entry - s); - if (!equals) - goto error; - - /* The name must be nonempty */ - if (equals == s) - goto error; - - out->name = tor_strndup(s, equals-s); - - tor_assert(equals < end_of_entry); - - s = equals + 1; - while (s < end_of_entry) { - const char *comma = memchr(s, ',', end_of_entry-s); - proto_range_t *range = tor_malloc_zero(sizeof(proto_range_t)); - if (! comma) - comma = end_of_entry; - - smartlist_add(out->ranges, range); - if (parse_version_range(s, comma, &range->low, &range->high) < 0) { - goto error; - } - - if (range->low > range->high) { - goto error; - } - - s = comma; - while (*s == ',' && s < end_of_entry) - ++s; - } - - return out; - - error: - proto_entry_free(out); - return NULL; -} - -/** - * Parse the protocol list from s and return it as a smartlist of - * proto_entry_t - */ -STATIC smartlist_t * -parse_protocol_list(const char *s) -{ - smartlist_t *entries = smartlist_new(); - - while (*s) { - /* Find the next space or the NUL. */ - const char *end_of_entry = strchr(s, ' '); - proto_entry_t *entry; - if (!end_of_entry) - end_of_entry = s + strlen(s); - - entry = parse_single_entry(s, end_of_entry); - - if (! entry) - goto error; - - smartlist_add(entries, entry); - - s = end_of_entry; - while (*s == ' ') - ++s; - } - - return entries; - - error: - SMARTLIST_FOREACH(entries, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(entries); - return NULL; -} - -/** - * Given a protocol type and version number, return true iff we know - * how to speak that protocol. - */ -int -protover_is_supported_here(protocol_type_t pr, uint32_t ver) -{ - const smartlist_t *ours = get_supported_protocol_list(); - return protocol_list_contains(ours, pr, ver); -} - -/** - * Return true iff "list" encodes a protocol list that includes support for - * the indicated protocol and version. - */ -int -protocol_list_supports_protocol(const char *list, protocol_type_t tp, - uint32_t version) -{ - /* NOTE: This is a pretty inefficient implementation. If it ever shows - * up in profiles, we should memoize it. - */ - smartlist_t *protocols = parse_protocol_list(list); - if (!protocols) { - return 0; - } - int contains = protocol_list_contains(protocols, tp, version); - - SMARTLIST_FOREACH(protocols, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(protocols); - return contains; -} - -/** - * Return true iff "list" encodes a protocol list that includes support for - * the indicated protocol and version, or some later version. - */ -int -protocol_list_supports_protocol_or_later(const char *list, - protocol_type_t tp, - uint32_t version) -{ - /* NOTE: This is a pretty inefficient implementation. If it ever shows - * up in profiles, we should memoize it. - */ - smartlist_t *protocols = parse_protocol_list(list); - if (!protocols) { - return 0; - } - const char *pr_name = protocol_type_to_str(tp); - - int contains = 0; - SMARTLIST_FOREACH_BEGIN(protocols, proto_entry_t *, proto) { - if (strcasecmp(proto->name, pr_name)) - continue; - SMARTLIST_FOREACH_BEGIN(proto->ranges, const proto_range_t *, range) { - if (range->high >= version) { - contains = 1; - goto found; - } - } SMARTLIST_FOREACH_END(range); - } SMARTLIST_FOREACH_END(proto); - - found: - SMARTLIST_FOREACH(protocols, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(protocols); - return contains; -} - -/** Return the canonical string containing the list of protocols - * that we support. */ -/// C_RUST_COUPLED: src/rust/protover/protover.rs `SUPPORTED_PROTOCOLS` -const char * -protover_get_supported_protocols(void) -{ - return - "Cons=1-2 " - "Desc=1-2 " - "DirCache=1-2 " - "HSDir=1-2 " - "HSIntro=3-4 " - "HSRend=1-2 " - "Link=1-4 " - "LinkAuth=1,3 " - "Microdesc=1-2 " - "Relay=1-2"; -} - -/** The protocols from protover_get_supported_protocols(), as parsed into a - * list of proto_entry_t values. Access this via - * get_supported_protocol_list. */ -static smartlist_t *supported_protocol_list = NULL; - -/** Return a pointer to a smartlist of proto_entry_t for the protocols - * we support. */ -static const smartlist_t * -get_supported_protocol_list(void) -{ - if (PREDICT_UNLIKELY(supported_protocol_list == NULL)) { - supported_protocol_list = - parse_protocol_list(protover_get_supported_protocols()); - } - return supported_protocol_list; -} - -/** - * Given a protocol entry, encode it at the end of the smartlist chunks - * as one or more newly allocated strings. - */ -static void -proto_entry_encode_into(smartlist_t *chunks, const proto_entry_t *entry) -{ - smartlist_add_asprintf(chunks, "%s=", entry->name); - - SMARTLIST_FOREACH_BEGIN(entry->ranges, proto_range_t *, range) { - const char *comma = ""; - if (range_sl_idx != 0) - comma = ","; - - if (range->low == range->high) { - smartlist_add_asprintf(chunks, "%s%lu", - comma, (unsigned long)range->low); - } else { - smartlist_add_asprintf(chunks, "%s%lu-%lu", - comma, (unsigned long)range->low, - (unsigned long)range->high); - } - } SMARTLIST_FOREACH_END(range); -} - -/** Given a list of space-separated proto_entry_t items, - * encode it into a newly allocated space-separated string. */ -STATIC char * -encode_protocol_list(const smartlist_t *sl) -{ - const char *separator = ""; - smartlist_t *chunks = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(sl, const proto_entry_t *, ent) { - smartlist_add_strdup(chunks, separator); - - proto_entry_encode_into(chunks, ent); - - separator = " "; - } SMARTLIST_FOREACH_END(ent); - - char *result = smartlist_join_strings(chunks, "", 0, NULL); - - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - - return result; -} - -/* We treat any protocol list with more than this many subprotocols in it - * as a DoS attempt. */ -/// C_RUST_COUPLED: src/rust/protover/protover.rs -/// `MAX_PROTOCOLS_TO_EXPAND` -static const int MAX_PROTOCOLS_TO_EXPAND = (1<<16); - -/** Voting helper: Given a list of proto_entry_t, return a newly allocated - * smartlist of newly allocated strings, one for each included protocol - * version. (So 'Foo=3,5-7' expands to a list of 'Foo=3', 'Foo=5', 'Foo=6', - * 'Foo=7'.) - * - * Do not list any protocol version more than once. - * - * Return NULL if the list would be too big. - */ -static smartlist_t * -expand_protocol_list(const smartlist_t *protos) -{ - smartlist_t *expanded = smartlist_new(); - if (!protos) - return expanded; - - SMARTLIST_FOREACH_BEGIN(protos, const proto_entry_t *, ent) { - const char *name = ent->name; - SMARTLIST_FOREACH_BEGIN(ent->ranges, const proto_range_t *, range) { - uint32_t u; - for (u = range->low; u <= range->high; ++u) { - smartlist_add_asprintf(expanded, "%s=%lu", name, (unsigned long)u); - if (smartlist_len(expanded) > MAX_PROTOCOLS_TO_EXPAND) - goto too_many; - } - } SMARTLIST_FOREACH_END(range); - } SMARTLIST_FOREACH_END(ent); - - smartlist_sort_strings(expanded); - smartlist_uniq_strings(expanded); // This makes voting work. do not remove - return expanded; - - too_many: - SMARTLIST_FOREACH(expanded, char *, cp, tor_free(cp)); - smartlist_free(expanded); - return NULL; -} - -/** Voting helper: compare two singleton proto_entry_t items by version - * alone. (A singleton item is one with a single range entry where - * low==high.) */ -static int -cmp_single_ent_by_version(const void **a_, const void **b_) -{ - const proto_entry_t *ent_a = *a_; - const proto_entry_t *ent_b = *b_; - - tor_assert(smartlist_len(ent_a->ranges) == 1); - tor_assert(smartlist_len(ent_b->ranges) == 1); - - const proto_range_t *a = smartlist_get(ent_a->ranges, 0); - const proto_range_t *b = smartlist_get(ent_b->ranges, 0); - - tor_assert(a->low == a->high); - tor_assert(b->low == b->high); - - if (a->low < b->low) { - return -1; - } else if (a->low == b->low) { - return 0; - } else { - return 1; - } -} - -/** Voting helper: Given a list of singleton protocol strings (of the form - * Foo=7), return a canonical listing of all the protocol versions listed, - * with as few ranges as possible, with protocol versions sorted lexically and - * versions sorted in numerically increasing order, using as few range entries - * as possible. - **/ -static char * -contract_protocol_list(const smartlist_t *proto_strings) -{ - // map from name to list of single-version entries - strmap_t *entry_lists_by_name = strmap_new(); - // list of protocol names - smartlist_t *all_names = smartlist_new(); - // list of strings for the output we're building - smartlist_t *chunks = smartlist_new(); - - // Parse each item and stick it entry_lists_by_name. Build - // 'all_names' at the same time. - SMARTLIST_FOREACH_BEGIN(proto_strings, const char *, s) { - if (BUG(!s)) - continue;// LCOV_EXCL_LINE - proto_entry_t *ent = parse_single_entry(s, s+strlen(s)); - if (BUG(!ent)) - continue; // LCOV_EXCL_LINE - smartlist_t *lst = strmap_get(entry_lists_by_name, ent->name); - if (!lst) { - smartlist_add(all_names, ent->name); - lst = smartlist_new(); - strmap_set(entry_lists_by_name, ent->name, lst); - } - smartlist_add(lst, ent); - } SMARTLIST_FOREACH_END(s); - - // We want to output the protocols sorted by their name. - smartlist_sort_strings(all_names); - - SMARTLIST_FOREACH_BEGIN(all_names, const char *, name) { - const int first_entry = (name_sl_idx == 0); - smartlist_t *lst = strmap_get(entry_lists_by_name, name); - tor_assert(lst); - // Sort every entry with this name by version. They are - // singletons, so there can't be overlap. - smartlist_sort(lst, cmp_single_ent_by_version); - - if (! first_entry) - smartlist_add_strdup(chunks, " "); - - /* We're going to construct this entry from the ranges. */ - proto_entry_t *entry = tor_malloc_zero(sizeof(proto_entry_t)); - entry->ranges = smartlist_new(); - entry->name = tor_strdup(name); - - // Now, find all the ranges of versions start..end where - // all of start, start+1, start+2, ..end are included. - int start_of_cur_series = 0; - while (start_of_cur_series < smartlist_len(lst)) { - const proto_entry_t *ent = smartlist_get(lst, start_of_cur_series); - const proto_range_t *range = smartlist_get(ent->ranges, 0); - const uint32_t ver_low = range->low; - uint32_t ver_high = ver_low; - - int idx; - for (idx = start_of_cur_series+1; idx < smartlist_len(lst); ++idx) { - ent = smartlist_get(lst, idx); - range = smartlist_get(ent->ranges, 0); - if (range->low != ver_high + 1) - break; - ver_high += 1; - } - - // Now idx is either off the end of the list, or the first sequence - // break in the list. - start_of_cur_series = idx; - - proto_range_t *new_range = tor_malloc_zero(sizeof(proto_range_t)); - new_range->low = ver_low; - new_range->high = ver_high; - smartlist_add(entry->ranges, new_range); - } - proto_entry_encode_into(chunks, entry); - proto_entry_free(entry); - - } SMARTLIST_FOREACH_END(name); - - // Build the result... - char *result = smartlist_join_strings(chunks, "", 0, NULL); - - // And free all the stuff we allocated. - SMARTLIST_FOREACH_BEGIN(all_names, const char *, name) { - smartlist_t *lst = strmap_get(entry_lists_by_name, name); - tor_assert(lst); - SMARTLIST_FOREACH(lst, proto_entry_t *, e, proto_entry_free(e)); - smartlist_free(lst); - } SMARTLIST_FOREACH_END(name); - - strmap_free(entry_lists_by_name, NULL); - smartlist_free(all_names); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - - return result; -} - -/** - * Protocol voting implementation. - * - * Given a list of strings describing protocol versions, return a newly - * allocated string encoding all of the protocols that are listed by at - * least threshold of the inputs. - * - * The string is minimal and sorted according to the rules of - * contract_protocol_list above. - */ -char * -protover_compute_vote(const smartlist_t *list_of_proto_strings, - int threshold) -{ - smartlist_t *all_entries = smartlist_new(); - - // First, parse the inputs and break them into singleton entries. - SMARTLIST_FOREACH_BEGIN(list_of_proto_strings, const char *, vote) { - smartlist_t *unexpanded = parse_protocol_list(vote); - smartlist_t *this_vote = expand_protocol_list(unexpanded); - if (this_vote == NULL) { - log_warn(LD_NET, "When expanding a protocol list from an authority, I " - "got too many protocols. This is possibly an attack or a bug, " - "unless the Tor network truly has expanded to support over %d " - "different subprotocol versions. The offending string was: %s", - MAX_PROTOCOLS_TO_EXPAND, escaped(vote)); - } else { - smartlist_add_all(all_entries, this_vote); - smartlist_free(this_vote); - } - SMARTLIST_FOREACH(unexpanded, proto_entry_t *, e, proto_entry_free(e)); - smartlist_free(unexpanded); - } SMARTLIST_FOREACH_END(vote); - - // Now sort the singleton entries - smartlist_sort_strings(all_entries); - - // Now find all the strings that appear at least 'threshold' times. - smartlist_t *include_entries = smartlist_new(); - const char *cur_entry = smartlist_get(all_entries, 0); - int n_times = 0; - SMARTLIST_FOREACH_BEGIN(all_entries, const char *, ent) { - if (!strcmp(ent, cur_entry)) { - n_times++; - } else { - if (n_times >= threshold && cur_entry) - smartlist_add(include_entries, (void*)cur_entry); - cur_entry = ent; - n_times = 1 ; - } - } SMARTLIST_FOREACH_END(ent); - - if (n_times >= threshold && cur_entry) - smartlist_add(include_entries, (void*)cur_entry); - - // Finally, compress that list. - char *result = contract_protocol_list(include_entries); - smartlist_free(include_entries); - SMARTLIST_FOREACH(all_entries, char *, cp, tor_free(cp)); - smartlist_free(all_entries); - - return result; -} - -/** Return true if every protocol version described in the string s is - * one that we support, and false otherwise. If missing_out is - * provided, set it to the list of protocols we do not support. - * - * NOTE: This is quadratic, but we don't do it much: only a few times per - * consensus. Checking signatures should be way more expensive than this - * ever would be. - **/ -int -protover_all_supported(const char *s, char **missing_out) -{ - int all_supported = 1; - smartlist_t *missing; - - if (!s) { - return 1; - } - - smartlist_t *entries = parse_protocol_list(s); - - missing = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(entries, const proto_entry_t *, ent) { - protocol_type_t tp; - if (str_to_protocol_type(ent->name, &tp) < 0) { - if (smartlist_len(ent->ranges)) { - goto unsupported; - } - continue; - } - - SMARTLIST_FOREACH_BEGIN(ent->ranges, const proto_range_t *, range) { - uint32_t i; - for (i = range->low; i <= range->high; ++i) { - if (!protover_is_supported_here(tp, i)) { - goto unsupported; - } - } - } SMARTLIST_FOREACH_END(range); - - continue; - - unsupported: - all_supported = 0; - smartlist_add(missing, (void*) ent); - } SMARTLIST_FOREACH_END(ent); - - if (missing_out && !all_supported) { - tor_assert(0 != smartlist_len(missing)); - *missing_out = encode_protocol_list(missing); - } - smartlist_free(missing); - - SMARTLIST_FOREACH(entries, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(entries); - - return all_supported; -} - -/** Helper: Given a list of proto_entry_t, return true iff - * pr=ver is included in that list. */ -static int -protocol_list_contains(const smartlist_t *protos, - protocol_type_t pr, uint32_t ver) -{ - if (BUG(protos == NULL)) { - return 0; // LCOV_EXCL_LINE - } - const char *pr_name = protocol_type_to_str(pr); - if (BUG(pr_name == NULL)) { - return 0; // LCOV_EXCL_LINE - } - - SMARTLIST_FOREACH_BEGIN(protos, const proto_entry_t *, ent) { - if (strcasecmp(ent->name, pr_name)) - continue; - /* name matches; check the ranges */ - SMARTLIST_FOREACH_BEGIN(ent->ranges, const proto_range_t *, range) { - if (ver >= range->low && ver <= range->high) - return 1; - } SMARTLIST_FOREACH_END(range); - } SMARTLIST_FOREACH_END(ent); - - return 0; -} - -/** Return a string describing the protocols supported by tor version - * version, or an empty string if we cannot tell. - * - * Note that this is only used to infer protocols for Tor versions that - * can't declare their own. - **/ -/// C_RUST_COUPLED: src/rust/protover/protover.rs `compute_for_old_tor` -const char * -protover_compute_for_old_tor(const char *version) -{ - if (version == NULL) { - /* No known version; guess the oldest series that is still supported. */ - version = "0.2.5.15"; - } - - if (tor_version_as_new_as(version, - FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS)) { - return ""; - } else if (tor_version_as_new_as(version, "0.2.9.1-alpha")) { - /* 0.2.9.1-alpha HSRend=2 */ - return "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 " - "Link=1-4 LinkAuth=1 " - "Microdesc=1-2 Relay=1-2"; - } else if (tor_version_as_new_as(version, "0.2.7.5")) { - /* 0.2.7-stable added Desc=2, Microdesc=2, Cons=2, which indicate - * ed25519 support. We'll call them present only in "stable" 027, - * though. */ - return "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=1-4 LinkAuth=1 " - "Microdesc=1-2 Relay=1-2"; - } else if (tor_version_as_new_as(version, "0.2.4.19")) { - /* No currently supported Tor server versions are older than this, or - * lack these protocols. */ - return "Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 " - "Link=1-4 LinkAuth=1 " - "Microdesc=1 Relay=1-2"; - } else { - /* Cannot infer protocols. */ - return ""; - } -} - -/** - * Release all storage held by static fields in protover.c - */ -void -protover_free_all(void) -{ - if (supported_protocol_list) { - smartlist_t *entries = supported_protocol_list; - SMARTLIST_FOREACH(entries, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(entries); - supported_protocol_list = NULL; - } -} - -#endif /* !defined(HAVE_RUST) */ - diff --git a/src/tor/src/or/protover.h b/src/tor/src/or/protover.h deleted file mode 100644 index 477274e29..000000000 --- a/src/tor/src/or/protover.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file protover.h - * \brief Headers and type declarations for protover.c - **/ - -#ifndef TOR_PROTOVER_H -#define TOR_PROTOVER_H - -#include "container.h" - -/** The first version of Tor that included "proto" entries in its - * descriptors. Authorities should use this to decide whether to - * guess proto lines. */ -/* This is a guess. */ -/// C_RUST_COUPLED: src/rust/protover/protover.rs -/// `FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS` -#define FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS "0.2.9.3-alpha" - -/** The protover version number that signifies HSDir support for HSv3 */ -#define PROTOVER_HSDIR_V3 2 -/** The protover version number that signifies HSv3 intro point support */ -#define PROTOVER_HS_INTRO_V3 4 -/** The protover version number that signifies HSv3 rendezvous point support */ -#define PROTOVER_HS_RENDEZVOUS_POINT_V3 2 - -/** List of recognized subprotocols. */ -/// C_RUST_COUPLED: src/rust/protover/ffi.rs `translate_to_rust` -/// C_RUST_COUPLED: src/rust/protover/protover.rs `Proto` -typedef enum protocol_type_t { - PRT_LINK, - PRT_LINKAUTH, - PRT_RELAY, - PRT_DIRCACHE, - PRT_HSDIR, - PRT_HSINTRO, - PRT_HSREND, - PRT_DESC, - PRT_MICRODESC, - PRT_CONS, -} protocol_type_t; - -int protover_all_supported(const char *s, char **missing); -int protover_is_supported_here(protocol_type_t pr, uint32_t ver); -const char *protover_get_supported_protocols(void); - -char *protover_compute_vote(const smartlist_t *list_of_proto_strings, - int threshold); -const char *protover_compute_for_old_tor(const char *version); -int protocol_list_supports_protocol(const char *list, protocol_type_t tp, - uint32_t version); -int protocol_list_supports_protocol_or_later(const char *list, - protocol_type_t tp, - uint32_t version); - -void protover_free_all(void); - -#ifdef PROTOVER_PRIVATE -/** Represents a range of subprotocols of a given type. All subprotocols - * between low and high inclusive are included. */ -typedef struct proto_range_t { - uint32_t low; - uint32_t high; -} proto_range_t; - -/** Represents a set of ranges of subprotocols of a given type. */ -typedef struct proto_entry_t { - /** The name of the protocol. - * - * (This needs to handle voting on protocols which - * we don't recognize yet, so it's a char* rather than a protocol_type_t.) - */ - char *name; - /** Smartlist of proto_range_t */ - smartlist_t *ranges; -} proto_entry_t; - -#if !defined(HAVE_RUST) && defined(TOR_UNIT_TESTS) -STATIC smartlist_t *parse_protocol_list(const char *s); -STATIC char *encode_protocol_list(const smartlist_t *sl); -STATIC const char *protocol_type_to_str(protocol_type_t pr); -STATIC int str_to_protocol_type(const char *s, protocol_type_t *pr_out); -STATIC void proto_entry_free_(proto_entry_t *entry); -#endif /* !defined(HAVE_RUST) && defined(TOR_UNIT_TESTS) */ - -#define proto_entry_free(entry) \ - FREE_AND_NULL(proto_entry_t, proto_entry_free_, (entry)) - -#endif /* defined(PROTOVER_PRIVATE) */ - -#endif /* !defined(TOR_PROTOVER_H) */ - diff --git a/src/tor/src/or/protover_rust.c b/src/tor/src/or/protover_rust.c deleted file mode 100644 index 26e21cc1c..000000000 --- a/src/tor/src/or/protover_rust.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* - * \file protover_rust.c - * \brief Provide a C wrapper for functions exposed in /src/rust/protover, - * and safe translation/handling between the Rust/C boundary. - */ - -#include "or.h" -#include "protover.h" - -#ifdef HAVE_RUST - -/* Define for compatibility, used in main.c */ -void protover_free_all(void) {} - -#endif /* defined(HAVE_RUST) */ - diff --git a/src/tor/src/or/rendcache.c b/src/tor/src/or/rendcache.c deleted file mode 100644 index 6f56df671..000000000 --- a/src/tor/src/or/rendcache.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendcache.c - * \brief Hidden service descriptor cache. - **/ - -#define RENDCACHE_PRIVATE -#include "rendcache.h" - -#include "config.h" -#include "rephist.h" -#include "routerlist.h" -#include "routerparse.h" -#include "rendcommon.h" - -/** Map from service id (as generated by rend_get_service_id) to - * rend_cache_entry_t. */ -STATIC strmap_t *rend_cache = NULL; - -/** Map from service id to rend_cache_entry_t; only for hidden services. */ -static strmap_t *rend_cache_local_service = NULL; - -/** Map from descriptor id to rend_cache_entry_t; only for hidden service - * directories. */ -STATIC digestmap_t *rend_cache_v2_dir = NULL; - -/** (Client side only) Map from service id to rend_cache_failure_t. This - * cache is used to track intro point(IP) failures so we know when to keep - * or discard a new descriptor we just fetched. Here is a description of the - * cache behavior. - * - * Everytime tor discards an IP (ex: receives a NACK), we add an entry to - * this cache noting the identity digest of the IP and it's failure type for - * the service ID. The reason we indexed this cache by service ID is to - * differentiate errors that can occur only for a specific service like a - * NACK for instance. It applies for one but maybe not for the others. - * - * Once a service descriptor is fetched and considered valid, each IP is - * looked up in this cache and if present, it is discarded from the fetched - * descriptor. At the end, all IP(s) in the cache, for a specific service - * ID, that were NOT present in the descriptor are removed from this cache. - * Which means that if at least one IP was not in this cache, thus usuable, - * it's considered a new descriptor so we keep it. Else, if all IPs were in - * this cache, we discard the descriptor as it's considered unsuable. - * - * Once a descriptor is removed from the rend cache or expires, the entry - * in this cache is also removed for the service ID. - * - * This scheme allows us to not realy on the descriptor's timestamp (which - * is rounded down to the hour) to know if we have a newer descriptor. We - * only rely on the usability of intro points from an internal state. */ -STATIC strmap_t *rend_cache_failure = NULL; - -/* DOCDOC */ -STATIC size_t rend_cache_total_allocation = 0; - -/** Initializes the service descriptor cache. -*/ -void -rend_cache_init(void) -{ - rend_cache = strmap_new(); - rend_cache_v2_dir = digestmap_new(); - rend_cache_local_service = strmap_new(); - rend_cache_failure = strmap_new(); -} - -/** Return the approximate number of bytes needed to hold e. */ -STATIC size_t -rend_cache_entry_allocation(const rend_cache_entry_t *e) -{ - if (!e) - return 0; - - /* This doesn't count intro_nodes or key size */ - return sizeof(*e) + e->len + sizeof(*e->parsed); -} - -/* DOCDOC */ -size_t -rend_cache_get_total_allocation(void) -{ - return rend_cache_total_allocation; -} - -/** Decrement the total bytes attributed to the rendezvous cache by n. */ -void -rend_cache_decrement_allocation(size_t n) -{ - static int have_underflowed = 0; - - if (rend_cache_total_allocation >= n) { - rend_cache_total_allocation -= n; - } else { - rend_cache_total_allocation = 0; - if (! have_underflowed) { - have_underflowed = 1; - log_warn(LD_BUG, "Underflow in rend_cache_decrement_allocation"); - } - } -} - -/** Increase the total bytes attributed to the rendezvous cache by n. */ -void -rend_cache_increment_allocation(size_t n) -{ - static int have_overflowed = 0; - if (rend_cache_total_allocation <= SIZE_MAX - n) { - rend_cache_total_allocation += n; - } else { - rend_cache_total_allocation = SIZE_MAX; - if (! have_overflowed) { - have_overflowed = 1; - log_warn(LD_BUG, "Overflow in rend_cache_increment_allocation"); - } - } -} - -/** Helper: free a rend cache failure intro object. */ -STATIC void -rend_cache_failure_intro_entry_free_(rend_cache_failure_intro_t *entry) -{ - if (entry == NULL) { - return; - } - tor_free(entry); -} - -static void -rend_cache_failure_intro_entry_free_void(void *entry) -{ - rend_cache_failure_intro_entry_free_(entry); -} - -/** Allocate a rend cache failure intro object and return it. failure - * is set into the object. This function can not fail. */ -STATIC rend_cache_failure_intro_t * -rend_cache_failure_intro_entry_new(rend_intro_point_failure_t failure) -{ - rend_cache_failure_intro_t *entry = tor_malloc(sizeof(*entry)); - entry->failure_type = failure; - entry->created_ts = time(NULL); - return entry; -} - -/** Helper: free a rend cache failure object. */ -STATIC void -rend_cache_failure_entry_free_(rend_cache_failure_t *entry) -{ - if (entry == NULL) { - return; - } - - /* Free and remove every intro failure object. */ - digestmap_free(entry->intro_failures, - rend_cache_failure_intro_entry_free_void); - - tor_free(entry); -} - -/** Helper: deallocate a rend_cache_failure_t. (Used with strmap_free(), - * which requires a function pointer whose argument is void*). */ -STATIC void -rend_cache_failure_entry_free_void(void *entry) -{ - rend_cache_failure_entry_free_(entry); -} - -/** Allocate a rend cache failure object and return it. This function can - * not fail. */ -STATIC rend_cache_failure_t * -rend_cache_failure_entry_new(void) -{ - rend_cache_failure_t *entry = tor_malloc(sizeof(*entry)); - entry->intro_failures = digestmap_new(); - return entry; -} - -/** Remove failure cache entry for the service ID in the given descriptor - * desc. */ -STATIC void -rend_cache_failure_remove(rend_service_descriptor_t *desc) -{ - char service_id[REND_SERVICE_ID_LEN_BASE32 + 1]; - rend_cache_failure_t *entry; - - if (desc == NULL) { - return; - } - if (rend_get_service_id(desc->pk, service_id) < 0) { - return; - } - entry = strmap_get_lc(rend_cache_failure, service_id); - if (entry != NULL) { - strmap_remove_lc(rend_cache_failure, service_id); - rend_cache_failure_entry_free(entry); - } -} - -/** Helper: free storage held by a single service descriptor cache entry. */ -STATIC void -rend_cache_entry_free_(rend_cache_entry_t *e) -{ - if (!e) - return; - rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); - /* We are about to remove a descriptor from the cache so remove the entry - * in the failure cache. */ - rend_cache_failure_remove(e->parsed); - rend_service_descriptor_free(e->parsed); - tor_free(e->desc); - tor_free(e); -} - -/** Helper: deallocate a rend_cache_entry_t. (Used with strmap_free(), which - * requires a function pointer whose argument is void*). */ -static void -rend_cache_entry_free_void(void *p) -{ - rend_cache_entry_free_(p); -} - -/** Free all storage held by the service descriptor cache. */ -void -rend_cache_free_all(void) -{ - strmap_free(rend_cache, rend_cache_entry_free_void); - digestmap_free(rend_cache_v2_dir, rend_cache_entry_free_void); - strmap_free(rend_cache_local_service, rend_cache_entry_free_void); - strmap_free(rend_cache_failure, rend_cache_failure_entry_free_void); - rend_cache = NULL; - rend_cache_v2_dir = NULL; - rend_cache_local_service = NULL; - rend_cache_failure = NULL; - rend_cache_total_allocation = 0; -} - -/** Remove all entries that re REND_CACHE_FAILURE_MAX_AGE old. This is - * called every second. - * - * We have to clean these regurlarly else if for whatever reasons an hidden - * service goes offline and a client tries to connect to it during that - * time, a failure entry is created and the client will be unable to connect - * for a while even though the service has return online. */ -void -rend_cache_failure_clean(time_t now) -{ - time_t cutoff = now - REND_CACHE_FAILURE_MAX_AGE; - STRMAP_FOREACH_MODIFY(rend_cache_failure, key, - rend_cache_failure_t *, ent) { - /* Free and remove every intro failure object that match the cutoff. */ - DIGESTMAP_FOREACH_MODIFY(ent->intro_failures, ip_key, - rend_cache_failure_intro_t *, ip_ent) { - if (ip_ent->created_ts < cutoff) { - rend_cache_failure_intro_entry_free(ip_ent); - MAP_DEL_CURRENT(ip_key); - } - } DIGESTMAP_FOREACH_END; - /* If the entry is now empty of intro point failures, remove it. */ - if (digestmap_isempty(ent->intro_failures)) { - rend_cache_failure_entry_free(ent); - MAP_DEL_CURRENT(key); - } - } STRMAP_FOREACH_END; -} - -/** Removes all old entries from the client or service descriptor cache. -*/ -void -rend_cache_clean(time_t now, rend_cache_type_t cache_type) -{ - strmap_iter_t *iter; - const char *key; - void *val; - rend_cache_entry_t *ent; - time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW; - strmap_t *cache = NULL; - - if (cache_type == REND_CACHE_TYPE_CLIENT) { - cache = rend_cache; - } else if (cache_type == REND_CACHE_TYPE_SERVICE) { - cache = rend_cache_local_service; - } - tor_assert(cache); - - for (iter = strmap_iter_init(cache); !strmap_iter_done(iter); ) { - strmap_iter_get(iter, &key, &val); - ent = (rend_cache_entry_t*)val; - if (ent->parsed->timestamp < cutoff) { - iter = strmap_iter_next_rmv(cache, iter); - rend_cache_entry_free(ent); - } else { - iter = strmap_iter_next(cache, iter); - } - } -} - -/** Remove ALL entries from the rendezvous service descriptor cache. -*/ -void -rend_cache_purge(void) -{ - if (rend_cache) { - log_info(LD_REND, "Purging HS v2 descriptor cache"); - strmap_free(rend_cache, rend_cache_entry_free_void); - } - rend_cache = strmap_new(); -} - -/** Remove ALL entries from the failure cache. This is also called when a - * NEWNYM signal is received. */ -void -rend_cache_failure_purge(void) -{ - if (rend_cache_failure) { - log_info(LD_REND, "Purging HS v2 failure cache"); - strmap_free(rend_cache_failure, rend_cache_failure_entry_free_void); - } - rend_cache_failure = strmap_new(); -} - -/** Lookup the rend failure cache using a relay identity digest in - * identity which has DIGEST_LEN bytes and service ID service_id - * which is a null-terminated string. If found, the intro failure is set in - * intro_entry else it stays untouched. Return 1 iff found else 0. */ -STATIC int -cache_failure_intro_lookup(const uint8_t *identity, const char *service_id, - rend_cache_failure_intro_t **intro_entry) -{ - rend_cache_failure_t *elem; - rend_cache_failure_intro_t *intro_elem; - - tor_assert(rend_cache_failure); - - if (intro_entry) { - *intro_entry = NULL; - } - - /* Lookup descriptor and return it. */ - elem = strmap_get_lc(rend_cache_failure, service_id); - if (elem == NULL) { - goto not_found; - } - intro_elem = digestmap_get(elem->intro_failures, (char *) identity); - if (intro_elem == NULL) { - goto not_found; - } - if (intro_entry) { - *intro_entry = intro_elem; - } - return 1; - not_found: - return 0; -} - -/** Allocate a new cache failure intro object and copy the content from - * entry to this newly allocated object. Return it. */ -static rend_cache_failure_intro_t * -cache_failure_intro_dup(const rend_cache_failure_intro_t *entry) -{ - rend_cache_failure_intro_t *ent_dup = - rend_cache_failure_intro_entry_new(entry->failure_type); - ent_dup->created_ts = entry->created_ts; - return ent_dup; -} - -/** Add an intro point failure to the failure cache using the relay - * identity and service ID service_id. Record the - * failure in that object. */ -STATIC void -cache_failure_intro_add(const uint8_t *identity, const char *service_id, - rend_intro_point_failure_t failure) -{ - rend_cache_failure_t *fail_entry; - rend_cache_failure_intro_t *entry, *old_entry; - - /* Make sure we have a failure object for this service ID and if not, - * create it with this new intro failure entry. */ - fail_entry = strmap_get_lc(rend_cache_failure, service_id); - if (fail_entry == NULL) { - fail_entry = rend_cache_failure_entry_new(); - /* Add failure entry to global rend failure cache. */ - strmap_set_lc(rend_cache_failure, service_id, fail_entry); - } - entry = rend_cache_failure_intro_entry_new(failure); - old_entry = digestmap_set(fail_entry->intro_failures, - (char *) identity, entry); - /* This _should_ be NULL, but in case it isn't, free it. */ - rend_cache_failure_intro_entry_free(old_entry); -} - -/** Using a parsed descriptor desc, check if the introduction points - * are present in the failure cache and if so they are removed from the - * descriptor and kept into the failure cache. Then, each intro points that - * are NOT in the descriptor but in the failure cache for the given - * service_id are removed from the failure cache. */ -STATIC void -validate_intro_point_failure(const rend_service_descriptor_t *desc, - const char *service_id) -{ - rend_cache_failure_t *new_entry, *cur_entry; - /* New entry for the service ID that will be replacing the one in the - * failure cache since we have a new descriptor. In the case where all - * intro points are removed, we are assured that the new entry is the same - * as the current one. */ - new_entry = tor_malloc(sizeof(*new_entry)); - new_entry->intro_failures = digestmap_new(); - - tor_assert(desc); - - SMARTLIST_FOREACH_BEGIN(desc->intro_nodes, rend_intro_point_t *, intro) { - int found; - rend_cache_failure_intro_t *entry; - const uint8_t *identity = - (uint8_t *) intro->extend_info->identity_digest; - - found = cache_failure_intro_lookup(identity, service_id, &entry); - if (found) { - /* Dup here since it will be freed at the end when removing the - * original entry in the cache. */ - rend_cache_failure_intro_t *ent_dup = cache_failure_intro_dup(entry); - /* This intro point is in our cache, discard it from the descriptor - * because chances are that it's unusable. */ - SMARTLIST_DEL_CURRENT(desc->intro_nodes, intro); - /* Keep it for our new entry. */ - digestmap_set(new_entry->intro_failures, (char *) identity, ent_dup); - /* Only free it when we're done looking at it. */ - rend_intro_point_free(intro); - continue; - } - } SMARTLIST_FOREACH_END(intro); - - /* Swap the failure entry in the cache and free the current one. */ - cur_entry = strmap_get_lc(rend_cache_failure, service_id); - if (cur_entry != NULL) { - rend_cache_failure_entry_free(cur_entry); - } - strmap_set_lc(rend_cache_failure, service_id, new_entry); -} - -/** Note down an intro failure in the rend failure cache using the type of - * failure in failure for the relay identity digest in - * identity and service ID service_id. If an entry already - * exists in the cache, the failure type is changed with failure. */ -void -rend_cache_intro_failure_note(rend_intro_point_failure_t failure, - const uint8_t *identity, - const char *service_id) -{ - int found; - rend_cache_failure_intro_t *entry; - - found = cache_failure_intro_lookup(identity, service_id, &entry); - if (!found) { - cache_failure_intro_add(identity, service_id, failure); - } else { - /* Replace introduction point failure with this one. */ - entry->failure_type = failure; - } -} - -/** Remove all old v2 descriptors and those for which this hidden service - * directory is not responsible for any more. The cutoff is the time limit for - * which we want to keep the cache entry. In other words, any entry created - * before will be removed. */ -size_t -rend_cache_clean_v2_descs_as_dir(time_t cutoff) -{ - digestmap_iter_t *iter; - size_t bytes_removed = 0; - - for (iter = digestmap_iter_init(rend_cache_v2_dir); - !digestmap_iter_done(iter); ) { - const char *key; - void *val; - rend_cache_entry_t *ent; - digestmap_iter_get(iter, &key, &val); - ent = val; - if (ent->parsed->timestamp < cutoff) { - char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN); - log_info(LD_REND, "Removing descriptor with ID '%s' from cache", - safe_str_client(key_base32)); - bytes_removed += rend_cache_entry_allocation(ent); - iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter); - rend_cache_entry_free(ent); - } else { - iter = digestmap_iter_next(rend_cache_v2_dir, iter); - } - } - - return bytes_removed; -} - -/** Lookup in the client cache the given service ID query for - * version. - * - * Return 0 if found and if e is non NULL, set it with the entry - * found. Else, a negative value is returned and e is untouched. - * -EINVAL means that query is not a valid service id. - * -ENOENT means that no entry in the cache was found. */ -int -rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e) -{ - int ret = 0; - char key[REND_SERVICE_ID_LEN_BASE32 + 2]; /* \0 */ - rend_cache_entry_t *entry = NULL; - static const int default_version = 2; - - tor_assert(rend_cache); - tor_assert(query); - - if (!rend_valid_v2_service_id(query)) { - ret = -EINVAL; - goto end; - } - - switch (version) { - case 0: - log_warn(LD_REND, "Cache lookup of a v0 renddesc is deprecated."); - break; - case 2: - /* Default is version 2. */ - default: - tor_snprintf(key, sizeof(key), "%d%s", default_version, query); - entry = strmap_get_lc(rend_cache, key); - break; - } - if (!entry) { - ret = -ENOENT; - goto end; - } - tor_assert(entry->parsed && entry->parsed->intro_nodes); - - if (e) { - *e = entry; - } - - end: - return ret; -} - -/* - * Lookup the v2 service descriptor with the service ID query in the - * local service descriptor cache. Return 0 if found and if e is - * non NULL, set it with the entry found. Else, a negative value is returned - * and e is untouched. - * -EINVAL means that query is not a valid service id. - * -ENOENT means that no entry in the cache was found. */ -int -rend_cache_lookup_v2_desc_as_service(const char *query, rend_cache_entry_t **e) -{ - int ret = 0; - rend_cache_entry_t *entry = NULL; - - tor_assert(rend_cache_local_service); - tor_assert(query); - - if (!rend_valid_v2_service_id(query)) { - ret = -EINVAL; - goto end; - } - - /* Lookup descriptor and return. */ - entry = strmap_get_lc(rend_cache_local_service, query); - if (!entry) { - ret = -ENOENT; - goto end; - } - - if (e) { - *e = entry; - } - - end: - return ret; -} - -/** Lookup the v2 service descriptor with base32-encoded desc_id and - * copy the pointer to it to *desc. Return 1 on success, 0 on - * well-formed-but-not-found, and -1 on failure. - */ -int -rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc) -{ - rend_cache_entry_t *e; - char desc_id_digest[DIGEST_LEN]; - tor_assert(rend_cache_v2_dir); - if (base32_decode(desc_id_digest, DIGEST_LEN, - desc_id, REND_DESC_ID_V2_LEN_BASE32) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_REND, - "Rejecting v2 rendezvous descriptor request -- descriptor ID " - "contains illegal characters: %s", - safe_str(desc_id)); - return -1; - } - /* Lookup descriptor and return. */ - e = digestmap_get(rend_cache_v2_dir, desc_id_digest); - if (e) { - *desc = e->desc; - e->last_served = approx_time(); - return 1; - } - return 0; -} - -/** Parse the v2 service descriptor(s) in desc and store it/them to the - * local rend cache. Don't attempt to decrypt the included list of introduction - * points (as we don't have a descriptor cookie for it). - * - * If we have a newer descriptor with the same ID, ignore this one. - * If we have an older descriptor with the same ID, replace it. - * - * Return 0 on success, or -1 if we couldn't parse any of them. - * - * We should only call this function for public (e.g. non bridge) relays. - */ -int -rend_cache_store_v2_desc_as_dir(const char *desc) -{ - const or_options_t *options = get_options(); - rend_service_descriptor_t *parsed; - char desc_id[DIGEST_LEN]; - char *intro_content; - size_t intro_size; - size_t encoded_size; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - int number_parsed = 0, number_stored = 0; - const char *current_desc = desc; - const char *next_desc; - rend_cache_entry_t *e; - time_t now = time(NULL); - tor_assert(rend_cache_v2_dir); - tor_assert(desc); - while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, - &intro_size, &encoded_size, - &next_desc, current_desc, 1) >= 0) { - number_parsed++; - /* We don't care about the introduction points. */ - tor_free(intro_content); - /* For pretty log statements. */ - base32_encode(desc_id_base32, sizeof(desc_id_base32), - desc_id, DIGEST_LEN); - /* Is descriptor too old? */ - if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { - log_info(LD_REND, "Service descriptor with desc ID %s is too old.", - safe_str(desc_id_base32)); - goto skip; - } - /* Is descriptor too far in the future? */ - if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) { - log_info(LD_REND, "Service descriptor with desc ID %s is too far in the " - "future.", - safe_str(desc_id_base32)); - goto skip; - } - /* Do we already have a newer descriptor? */ - e = digestmap_get(rend_cache_v2_dir, desc_id); - if (e && e->parsed->timestamp > parsed->timestamp) { - log_info(LD_REND, "We already have a newer service descriptor with the " - "same desc ID %s and version.", - safe_str(desc_id_base32)); - goto skip; - } - /* Do we already have this descriptor? */ - if (e && !strcmp(desc, e->desc)) { - log_info(LD_REND, "We already have this service descriptor with desc " - "ID %s.", safe_str(desc_id_base32)); - goto skip; - } - /* Store received descriptor. */ - if (!e) { - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - digestmap_set(rend_cache_v2_dir, desc_id, e); - /* Treat something just uploaded as having been served a little - * while ago, so that flooding with new descriptors doesn't help - * too much. - */ - e->last_served = approx_time() - 3600; - } else { - rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); - rend_service_descriptor_free(e->parsed); - tor_free(e->desc); - } - e->parsed = parsed; - e->desc = tor_strndup(current_desc, encoded_size); - e->len = encoded_size; - rend_cache_increment_allocation(rend_cache_entry_allocation(e)); - log_info(LD_REND, "Successfully stored service descriptor with desc ID " - "'%s' and len %d.", - safe_str(desc_id_base32), (int)encoded_size); - /* Statistics: Note down this potentially new HS. */ - if (options->HiddenServiceStatistics) { - rep_hist_stored_maybe_new_hs(e->parsed->pk); - } - - number_stored++; - goto advance; - skip: - rend_service_descriptor_free(parsed); - advance: - /* advance to next descriptor, if available. */ - current_desc = next_desc; - /* check if there is a next descriptor. */ - if (!current_desc || - strcmpstart(current_desc, "rendezvous-service-descriptor ")) - break; - } - if (!number_parsed) { - log_info(LD_REND, "Could not parse any descriptor."); - return -1; - } - log_info(LD_REND, "Parsed %d and added %d descriptor%s.", - number_parsed, number_stored, number_stored != 1 ? "s" : ""); - return 0; -} - -/** Parse the v2 service descriptor in desc and store it to the -* local service rend cache. Don't attempt to decrypt the included list of -* introduction points. -* -* If we have a newer descriptor with the same ID, ignore this one. -* If we have an older descriptor with the same ID, replace it. -* -* Return 0 on success, or -1 if we couldn't understand the descriptor. -*/ -int -rend_cache_store_v2_desc_as_service(const char *desc) -{ - rend_service_descriptor_t *parsed = NULL; - char desc_id[DIGEST_LEN]; - char *intro_content = NULL; - size_t intro_size; - size_t encoded_size; - const char *next_desc; - char service_id[REND_SERVICE_ID_LEN_BASE32+1]; - rend_cache_entry_t *e; - int retval = -1; - tor_assert(rend_cache_local_service); - tor_assert(desc); - - /* Parse the descriptor. */ - if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, - &intro_size, &encoded_size, - &next_desc, desc, 0) < 0) { - log_warn(LD_REND, "Could not parse descriptor."); - goto err; - } - /* Compute service ID from public key. */ - if (rend_get_service_id(parsed->pk, service_id)<0) { - log_warn(LD_REND, "Couldn't compute service ID."); - goto err; - } - - /* Do we already have a newer descriptor? Allow new descriptors with a - rounded timestamp equal to or newer than the current descriptor */ - e = (rend_cache_entry_t*) strmap_get_lc(rend_cache_local_service, - service_id); - if (e && e->parsed->timestamp > parsed->timestamp) { - log_info(LD_REND, "We already have a newer service descriptor for " - "service ID %s.", safe_str_client(service_id)); - goto okay; - } - /* We don't care about the introduction points. */ - tor_free(intro_content); - if (!e) { - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - strmap_set_lc(rend_cache_local_service, service_id, e); - } else { - rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); - rend_service_descriptor_free(e->parsed); - tor_free(e->desc); - } - e->parsed = parsed; - e->desc = tor_malloc_zero(encoded_size + 1); - strlcpy(e->desc, desc, encoded_size + 1); - e->len = encoded_size; - rend_cache_increment_allocation(rend_cache_entry_allocation(e)); - log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", - safe_str_client(service_id), (int)encoded_size); - return 0; - - okay: - retval = 0; - - err: - rend_service_descriptor_free(parsed); - tor_free(intro_content); - return retval; -} - -/** Parse the v2 service descriptor in desc, decrypt the included list - * of introduction points with descriptor_cookie (which may also be - * NULL if decryption is not necessary), and store the descriptor to - * the local cache under its version and service id. - * - * If we have a newer v2 descriptor with the same ID, ignore this one. - * If we have an older descriptor with the same ID, replace it. - * If the descriptor's service ID does not match - * rend_query-\>onion_address, reject it. - * - * If the descriptor's descriptor ID doesn't match desc_id_base32, - * reject it. - * - * Return 0 on success, or -1 if we rejected the descriptor. - * If entry is not NULL, set it with the cache entry pointer of the descriptor. - */ -int -rend_cache_store_v2_desc_as_client(const char *desc, - const char *desc_id_base32, - const rend_data_t *rend_query, - rend_cache_entry_t **entry) -{ - /*XXXX this seems to have a bit of duplicate code with - * rend_cache_store_v2_desc_as_dir(). Fix that. */ - /* Though having similar elements, both functions were separated on - * purpose: - * - dirs don't care about encoded/encrypted introduction points, clients - * do. - * - dirs store descriptors in a separate cache by descriptor ID, whereas - * clients store them by service ID; both caches are different data - * structures and have different access methods. - * - dirs store a descriptor only if they are responsible for its ID, - * clients do so in every way (because they have requested it before). - * - dirs can process multiple concatenated descriptors which is required - * for replication, whereas clients only accept a single descriptor. - * Thus, combining both methods would result in a lot of if statements - * which probably would not improve, but worsen code readability. -KL */ - rend_service_descriptor_t *parsed = NULL; - char desc_id[DIGEST_LEN]; - char *intro_content = NULL; - size_t intro_size; - size_t encoded_size; - const char *next_desc; - time_t now = time(NULL); - char key[REND_SERVICE_ID_LEN_BASE32+2]; - char service_id[REND_SERVICE_ID_LEN_BASE32+1]; - char want_desc_id[DIGEST_LEN]; - rend_cache_entry_t *e; - int retval = -1; - rend_data_v2_t *rend_data = TO_REND_DATA_V2(rend_query); - - tor_assert(rend_cache); - tor_assert(desc); - tor_assert(desc_id_base32); - memset(want_desc_id, 0, sizeof(want_desc_id)); - if (entry) { - *entry = NULL; - } - if (base32_decode(want_desc_id, sizeof(want_desc_id), - desc_id_base32, strlen(desc_id_base32)) != 0) { - log_warn(LD_BUG, "Couldn't decode base32 %s for descriptor id.", - escaped_safe_str_client(desc_id_base32)); - goto err; - } - /* Parse the descriptor. */ - if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, - &intro_size, &encoded_size, - &next_desc, desc, 0) < 0) { - log_warn(LD_REND, "Could not parse descriptor."); - goto err; - } - /* Compute service ID from public key. */ - if (rend_get_service_id(parsed->pk, service_id)<0) { - log_warn(LD_REND, "Couldn't compute service ID."); - goto err; - } - if (rend_data->onion_address[0] != '\0' && - strcmp(rend_data->onion_address, service_id)) { - log_warn(LD_REND, "Received service descriptor for service ID %s; " - "expected descriptor for service ID %s.", - service_id, safe_str(rend_data->onion_address)); - goto err; - } - if (tor_memneq(desc_id, want_desc_id, DIGEST_LEN)) { - log_warn(LD_REND, "Received service descriptor for %s with incorrect " - "descriptor ID.", service_id); - goto err; - } - - /* Decode/decrypt introduction points. */ - if (intro_content && intro_size > 0) { - int n_intro_points; - if (rend_data->auth_type != REND_NO_AUTH && - !tor_mem_is_zero(rend_data->descriptor_cookie, - sizeof(rend_data->descriptor_cookie))) { - char *ipos_decrypted = NULL; - size_t ipos_decrypted_size; - if (rend_decrypt_introduction_points(&ipos_decrypted, - &ipos_decrypted_size, - rend_data->descriptor_cookie, - intro_content, - intro_size) < 0) { - log_warn(LD_REND, "Failed to decrypt introduction points. We are " - "probably unable to parse the encoded introduction points."); - } else { - /* Replace encrypted with decrypted introduction points. */ - log_info(LD_REND, "Successfully decrypted introduction points."); - tor_free(intro_content); - intro_content = ipos_decrypted; - intro_size = ipos_decrypted_size; - } - } - n_intro_points = rend_parse_introduction_points(parsed, intro_content, - intro_size); - if (n_intro_points <= 0) { - log_warn(LD_REND, "Failed to parse introduction points. Either the " - "service has published a corrupt descriptor or you have " - "provided invalid authorization data, or (maybe!) the " - "server is deliberately serving broken data in an attempt " - "to crash you with bug 21018."); - goto err; - } else if (n_intro_points > MAX_INTRO_POINTS) { - log_warn(LD_REND, "Found too many introduction points on a hidden " - "service descriptor for %s. This is probably a (misguided) " - "attempt to improve reliability, but it could also be an " - "attempt to do a guard enumeration attack. Rejecting.", - safe_str_client(service_id)); - - goto err; - } - } else { - log_info(LD_REND, "Descriptor does not contain any introduction points."); - parsed->intro_nodes = smartlist_new(); - } - /* We don't need the encoded/encrypted introduction points any longer. */ - tor_free(intro_content); - /* Is descriptor too old? */ - if (parsed->timestamp < now - REND_CACHE_MAX_AGE-REND_CACHE_MAX_SKEW) { - log_warn(LD_REND, "Service descriptor with service ID %s is too old.", - safe_str_client(service_id)); - goto err; - } - /* Is descriptor too far in the future? */ - if (parsed->timestamp > now + REND_CACHE_MAX_SKEW) { - log_warn(LD_REND, "Service descriptor with service ID %s is too far in " - "the future.", safe_str_client(service_id)); - goto err; - } - /* Do we have the same exact copy already in our cache? */ - tor_snprintf(key, sizeof(key), "2%s", service_id); - e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key); - if (e && !strcmp(desc, e->desc)) { - log_info(LD_REND,"We already have this service descriptor %s.", - safe_str_client(service_id)); - goto okay; - } - /* Verify that we are not replacing an older descriptor. It's important to - * avoid an evil HSDir serving old descriptor. We validate if the - * timestamp is greater than and not equal because it's a rounded down - * timestamp to the hour so if the descriptor changed in the same hour, - * the rend cache failure will tell us if we have a new descriptor. */ - if (e && e->parsed->timestamp > parsed->timestamp) { - log_info(LD_REND, "We already have a new enough service descriptor for " - "service ID %s with the same desc ID and version.", - safe_str_client(service_id)); - goto okay; - } - /* Lookup our failure cache for intro point that might be unusable. */ - validate_intro_point_failure(parsed, service_id); - /* It's now possible that our intro point list is empty, which means that - * this descriptor is useless to us because intro points have all failed - * somehow before. Discard the descriptor. */ - if (smartlist_len(parsed->intro_nodes) == 0) { - log_info(LD_REND, "Service descriptor with service ID %s has no " - "usable intro points. Discarding it.", - safe_str_client(service_id)); - goto err; - } - /* Now either purge the current one and replace its content or create a - * new one and add it to the rend cache. */ - if (!e) { - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - strmap_set_lc(rend_cache, key, e); - } else { - rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); - rend_cache_failure_remove(e->parsed); - rend_service_descriptor_free(e->parsed); - tor_free(e->desc); - } - e->parsed = parsed; - e->desc = tor_malloc_zero(encoded_size + 1); - strlcpy(e->desc, desc, encoded_size + 1); - e->len = encoded_size; - rend_cache_increment_allocation(rend_cache_entry_allocation(e)); - log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", - safe_str_client(service_id), (int)encoded_size); - if (entry) { - *entry = e; - } - return 0; - - okay: - if (entry) { - *entry = e; - } - retval = 0; - - err: - rend_service_descriptor_free(parsed); - tor_free(intro_content); - return retval; -} - diff --git a/src/tor/src/or/rendcache.h b/src/tor/src/or/rendcache.h deleted file mode 100644 index 66e978564..000000000 --- a/src/tor/src/or/rendcache.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendcache.h - * \brief Header file for rendcache.c - **/ - -#ifndef TOR_RENDCACHE_H -#define TOR_RENDCACHE_H - -#include "or.h" -#include "rendcommon.h" - -/** How old do we let hidden service descriptors get before discarding - * them as too old? */ -#define REND_CACHE_MAX_AGE (2*24*60*60) -/** How wrong do we assume our clock may be when checking whether hidden - * services are too old or too new? */ -#define REND_CACHE_MAX_SKEW (24*60*60) -/** How old do we keep an intro point failure entry in the failure cache? */ -#define REND_CACHE_FAILURE_MAX_AGE (5*60) - -/* Do not allow more than this many introduction points in a hidden service - * descriptor */ -#define MAX_INTRO_POINTS 10 - -/** A cached rendezvous descriptor. */ -typedef struct rend_cache_entry_t { - size_t len; /**< Length of desc */ - time_t last_served; /**< When did we last write this one to somebody? - * (HSDir only) */ - char *desc; /**< Service descriptor */ - rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */ -} rend_cache_entry_t; - -/* Introduction point failure type. */ -typedef struct rend_cache_failure_intro_t { - /* When this intro point failure occured thus we allocated this object and - * cache it. */ - time_t created_ts; - rend_intro_point_failure_t failure_type; -} rend_cache_failure_intro_t; - -/** Cache failure object indexed by service ID. */ -typedef struct rend_cache_failure_t { - /* Contains rend_cache_failure_intro_t indexed by identity digest. */ - digestmap_t *intro_failures; -} rend_cache_failure_t; - -typedef enum { - REND_CACHE_TYPE_CLIENT = 1, - REND_CACHE_TYPE_SERVICE = 2, -} rend_cache_type_t; - -/* Return maximum lifetime in seconds of a cache entry. */ -static inline time_t -rend_cache_max_entry_lifetime(void) -{ - return REND_CACHE_MAX_AGE + REND_CACHE_MAX_SKEW; -} - -void rend_cache_init(void); -void rend_cache_clean(time_t now, rend_cache_type_t cache_type); -void rend_cache_failure_clean(time_t now); -size_t rend_cache_clean_v2_descs_as_dir(time_t cutoff); -void rend_cache_purge(void); -void rend_cache_free_all(void); -int rend_cache_lookup_entry(const char *query, int version, - rend_cache_entry_t **entry_out); -int rend_cache_lookup_v2_desc_as_service(const char *query, - rend_cache_entry_t **entry_out); -int rend_cache_lookup_v2_desc_as_dir(const char *query, const char **desc); - -int rend_cache_store_v2_desc_as_dir(const char *desc); -int rend_cache_store_v2_desc_as_service(const char *desc); -int rend_cache_store_v2_desc_as_client(const char *desc, - const char *desc_id_base32, - const rend_data_t *rend_query, - rend_cache_entry_t **entry); -size_t rend_cache_get_total_allocation(void); - -void rend_cache_intro_failure_note(rend_intro_point_failure_t failure, - const uint8_t *identity, - const char *service_id); -void rend_cache_failure_purge(void); -void rend_cache_decrement_allocation(size_t n); -void rend_cache_increment_allocation(size_t n); - -#ifdef RENDCACHE_PRIVATE - -STATIC size_t rend_cache_entry_allocation(const rend_cache_entry_t *e); -STATIC void rend_cache_entry_free_(rend_cache_entry_t *e); -#define rend_cache_entry_free(e) \ - FREE_AND_NULL(rend_cache_entry_t, rend_cache_entry_free_, (e)) -STATIC void rend_cache_failure_intro_entry_free_(rend_cache_failure_intro_t - *entry); -#define rend_cache_failure_intro_entry_free(e) \ - FREE_AND_NULL(rend_cache_failure_intro_t, \ - rend_cache_failure_intro_entry_free_, (e)) -STATIC void rend_cache_failure_entry_free_(rend_cache_failure_t *entry); -#define rend_cache_failure_entry_free(e) \ - FREE_AND_NULL(rend_cache_failure_t, \ - rend_cache_failure_entry_free_, (e)) -STATIC int cache_failure_intro_lookup(const uint8_t *identity, - const char *service_id, - rend_cache_failure_intro_t - **intro_entry); -STATIC rend_cache_failure_intro_t *rend_cache_failure_intro_entry_new( - rend_intro_point_failure_t failure); -STATIC rend_cache_failure_t *rend_cache_failure_entry_new(void); -STATIC void rend_cache_failure_remove(rend_service_descriptor_t *desc); -STATIC void cache_failure_intro_add(const uint8_t *identity, - const char *service_id, - rend_intro_point_failure_t failure); -STATIC void validate_intro_point_failure(const rend_service_descriptor_t *desc, - const char *service_id); - -STATIC void rend_cache_failure_entry_free_void(void *entry); - -#ifdef TOR_UNIT_TESTS -extern strmap_t *rend_cache; -extern strmap_t *rend_cache_failure; -extern digestmap_t *rend_cache_v2_dir; -extern size_t rend_cache_total_allocation; -#endif /* defined(TOR_UNIT_TESTS) */ -#endif /* defined(RENDCACHE_PRIVATE) */ - -#endif /* !defined(TOR_RENDCACHE_H) */ - diff --git a/src/tor/src/or/rendcommon.c b/src/tor/src/or/rendcommon.c deleted file mode 100644 index 230da4be5..000000000 --- a/src/tor/src/or/rendcommon.c +++ /dev/null @@ -1,1037 +0,0 @@ -/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendcommon.c - * \brief Rendezvous implementation: shared code between - * introducers, services, clients, and rendezvous points. - **/ - -#define RENDCOMMON_PRIVATE - -#include "or.h" -#include "circuitbuild.h" -#include "config.h" -#include "control.h" -#include "hs_common.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendmid.h" -#include "hs_intropoint.h" -#include "hs_client.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "networkstatus.h" - -/** Return 0 if one and two are the same service ids, else -1 or 1 */ -int -rend_cmp_service_ids(const char *one, const char *two) -{ - return strcasecmp(one,two); -} - -/** Free the storage held by the service descriptor desc. - */ -void -rend_service_descriptor_free_(rend_service_descriptor_t *desc) -{ - if (!desc) - return; - if (desc->pk) - crypto_pk_free(desc->pk); - if (desc->intro_nodes) { - SMARTLIST_FOREACH(desc->intro_nodes, rend_intro_point_t *, intro, - rend_intro_point_free(intro);); - smartlist_free(desc->intro_nodes); - } - if (desc->successful_uploads) { - SMARTLIST_FOREACH(desc->successful_uploads, char *, c, tor_free(c);); - smartlist_free(desc->successful_uploads); - } - tor_free(desc); -} - -/** Length of the descriptor cookie that is used for versioned hidden - * service descriptors. */ -#define REND_DESC_COOKIE_LEN 16 - -/** Length of the replica number that is used to determine the secret ID - * part of versioned hidden service descriptors. */ -#define REND_REPLICA_LEN 1 - -/** Compute the descriptor ID for service_id of length - * REND_SERVICE_ID_LEN and secret_id_part of length - * DIGEST_LEN, and write it to descriptor_id_out of length - * DIGEST_LEN. */ -void -rend_get_descriptor_id_bytes(char *descriptor_id_out, - const char *service_id, - const char *secret_id_part) -{ - crypto_digest_t *digest = crypto_digest_new(); - crypto_digest_add_bytes(digest, service_id, REND_SERVICE_ID_LEN); - crypto_digest_add_bytes(digest, secret_id_part, DIGEST_LEN); - crypto_digest_get_digest(digest, descriptor_id_out, DIGEST_LEN); - crypto_digest_free(digest); -} - -/** Compute the secret ID part for time_period, - * a descriptor_cookie of length - * REND_DESC_COOKIE_LEN which may also be NULL if no - * descriptor_cookie shall be used, and replica, and write it to - * secret_id_part of length DIGEST_LEN. */ -static void -get_secret_id_part_bytes(char *secret_id_part, uint32_t time_period, - const char *descriptor_cookie, uint8_t replica) -{ - crypto_digest_t *digest = crypto_digest_new(); - time_period = htonl(time_period); - crypto_digest_add_bytes(digest, (char*)&time_period, sizeof(uint32_t)); - if (descriptor_cookie) { - crypto_digest_add_bytes(digest, descriptor_cookie, - REND_DESC_COOKIE_LEN); - } - crypto_digest_add_bytes(digest, (const char *)&replica, REND_REPLICA_LEN); - crypto_digest_get_digest(digest, secret_id_part, DIGEST_LEN); - crypto_digest_free(digest); -} - -/** Return the time period for time now plus a potentially - * intended deviation of one or more periods, based on the first byte - * of service_id. */ -static uint32_t -get_time_period(time_t now, uint8_t deviation, const char *service_id) -{ - /* The time period is the number of REND_TIME_PERIOD_V2_DESC_VALIDITY - * intervals that have passed since the epoch, offset slightly so that - * each service's time periods start and end at a fraction of that - * period based on their first byte. */ - return (uint32_t) - (now + ((uint8_t) *service_id) * REND_TIME_PERIOD_V2_DESC_VALIDITY / 256) - / REND_TIME_PERIOD_V2_DESC_VALIDITY + deviation; -} - -/** Compute the time in seconds that a descriptor that is generated - * now for service_id will be valid. */ -static uint32_t -get_seconds_valid(time_t now, const char *service_id) -{ - uint32_t result = REND_TIME_PERIOD_V2_DESC_VALIDITY - - ((uint32_t) - (now + ((uint8_t) *service_id) * REND_TIME_PERIOD_V2_DESC_VALIDITY / 256) - % REND_TIME_PERIOD_V2_DESC_VALIDITY); - return result; -} - -/** Compute the binary desc_id_out (DIGEST_LEN bytes long) for a given - * base32-encoded service_id and optional unencoded - * descriptor_cookie of length REND_DESC_COOKIE_LEN, - * at time now for replica number - * replica. desc_id needs to have DIGEST_LEN bytes - * free. Return 0 for success, -1 otherwise. */ -int -rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, - const char *descriptor_cookie, time_t now, - uint8_t replica) -{ - char service_id_binary[REND_SERVICE_ID_LEN]; - char secret_id_part[DIGEST_LEN]; - uint32_t time_period; - if (!service_id || - strlen(service_id) != REND_SERVICE_ID_LEN_BASE32) { - log_warn(LD_REND, "Could not compute v2 descriptor ID: " - "Illegal service ID: %s", - safe_str(service_id)); - return -1; - } - if (replica >= REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS) { - log_warn(LD_REND, "Could not compute v2 descriptor ID: " - "Replica number out of range: %d", replica); - return -1; - } - /* Convert service ID to binary. */ - if (base32_decode(service_id_binary, REND_SERVICE_ID_LEN, - service_id, REND_SERVICE_ID_LEN_BASE32) < 0) { - log_warn(LD_REND, "Could not compute v2 descriptor ID: " - "Illegal characters in service ID: %s", - safe_str_client(service_id)); - return -1; - } - /* Calculate current time-period. */ - time_period = get_time_period(now, 0, service_id_binary); - /* Calculate secret-id-part = h(time-period | desc-cookie | replica). */ - get_secret_id_part_bytes(secret_id_part, time_period, descriptor_cookie, - replica); - /* Calculate descriptor ID: H(permanent-id | secret-id-part) */ - rend_get_descriptor_id_bytes(desc_id_out, service_id_binary, secret_id_part); - return 0; -} - -/** Encode the introduction points in desc and write the result to a - * newly allocated string pointed to by encoded. Return 0 for - * success, -1 otherwise. */ -static int -rend_encode_v2_intro_points(char **encoded, rend_service_descriptor_t *desc) -{ - size_t unenc_len; - char *unenc = NULL; - size_t unenc_written = 0; - int i; - int r = -1; - /* Assemble unencrypted list of introduction points. */ - unenc_len = smartlist_len(desc->intro_nodes) * 1000; /* too long, but ok. */ - unenc = tor_malloc_zero(unenc_len); - for (i = 0; i < smartlist_len(desc->intro_nodes); i++) { - char id_base32[REND_INTRO_POINT_ID_LEN_BASE32 + 1]; - char *onion_key = NULL; - size_t onion_key_len; - crypto_pk_t *intro_key; - char *service_key = NULL; - char *address = NULL; - size_t service_key_len; - int res; - rend_intro_point_t *intro = smartlist_get(desc->intro_nodes, i); - /* Obtain extend info with introduction point details. */ - extend_info_t *info = intro->extend_info; - /* Encode introduction point ID. */ - base32_encode(id_base32, sizeof(id_base32), - info->identity_digest, DIGEST_LEN); - /* Encode onion key. */ - if (crypto_pk_write_public_key_to_string(info->onion_key, &onion_key, - &onion_key_len) < 0) { - log_warn(LD_REND, "Could not write onion key."); - goto done; - } - /* Encode intro key. */ - intro_key = intro->intro_key; - if (!intro_key || - crypto_pk_write_public_key_to_string(intro_key, &service_key, - &service_key_len) < 0) { - log_warn(LD_REND, "Could not write intro key."); - tor_free(onion_key); - goto done; - } - /* Assemble everything for this introduction point. */ - address = tor_addr_to_str_dup(&info->addr); - res = tor_snprintf(unenc + unenc_written, unenc_len - unenc_written, - "introduction-point %s\n" - "ip-address %s\n" - "onion-port %d\n" - "onion-key\n%s" - "service-key\n%s", - id_base32, - address, - info->port, - onion_key, - service_key); - tor_free(address); - tor_free(onion_key); - tor_free(service_key); - if (res < 0) { - log_warn(LD_REND, "Not enough space for writing introduction point " - "string."); - goto done; - } - /* Update total number of written bytes for unencrypted intro points. */ - unenc_written += res; - } - /* Finalize unencrypted introduction points. */ - if (unenc_len < unenc_written + 2) { - log_warn(LD_REND, "Not enough space for finalizing introduction point " - "string."); - goto done; - } - unenc[unenc_written++] = '\n'; - unenc[unenc_written++] = 0; - *encoded = unenc; - r = 0; - done: - if (r<0) - tor_free(unenc); - return r; -} - -/** Encrypt the encoded introduction points in encoded using - * authorization type 'basic' with client_cookies and write the - * result to a newly allocated string pointed to by encrypted_out of - * length encrypted_len_out. Return 0 for success, -1 otherwise. */ -static int -rend_encrypt_v2_intro_points_basic(char **encrypted_out, - size_t *encrypted_len_out, - const char *encoded, - smartlist_t *client_cookies) -{ - int r = -1, i, pos, enclen, client_blocks; - size_t len, client_entries_len; - char *enc = NULL, iv[CIPHER_IV_LEN], *client_part = NULL, - session_key[CIPHER_KEY_LEN]; - smartlist_t *encrypted_session_keys = NULL; - crypto_digest_t *digest; - crypto_cipher_t *cipher; - tor_assert(encoded); - tor_assert(client_cookies && smartlist_len(client_cookies) > 0); - - /* Generate session key. */ - crypto_rand(session_key, CIPHER_KEY_LEN); - - /* Determine length of encrypted introduction points including session - * keys. */ - client_blocks = 1 + ((smartlist_len(client_cookies) - 1) / - REND_BASIC_AUTH_CLIENT_MULTIPLE); - client_entries_len = client_blocks * REND_BASIC_AUTH_CLIENT_MULTIPLE * - REND_BASIC_AUTH_CLIENT_ENTRY_LEN; - len = 2 + client_entries_len + CIPHER_IV_LEN + strlen(encoded); - if (client_blocks >= 256) { - log_warn(LD_REND, "Too many clients in introduction point string."); - goto done; - } - enc = tor_malloc_zero(len); - enc[0] = 0x01; /* type of authorization. */ - enc[1] = (uint8_t)client_blocks; - - /* Encrypt with random session key. */ - enclen = crypto_cipher_encrypt_with_iv(session_key, - enc + 2 + client_entries_len, - CIPHER_IV_LEN + strlen(encoded), encoded, strlen(encoded)); - - if (enclen < 0) { - log_warn(LD_REND, "Could not encrypt introduction point string."); - goto done; - } - memcpy(iv, enc + 2 + client_entries_len, CIPHER_IV_LEN); - - /* Encrypt session key for cookies, determine client IDs, and put both - * in a smartlist. */ - encrypted_session_keys = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(client_cookies, const char *, cookie) { - client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); - /* Encrypt session key. */ - cipher = crypto_cipher_new(cookie); - if (crypto_cipher_encrypt(cipher, client_part + - REND_BASIC_AUTH_CLIENT_ID_LEN, - session_key, CIPHER_KEY_LEN) < 0) { - log_warn(LD_REND, "Could not encrypt session key for client."); - crypto_cipher_free(cipher); - tor_free(client_part); - goto done; - } - crypto_cipher_free(cipher); - - /* Determine client ID. */ - digest = crypto_digest_new(); - crypto_digest_add_bytes(digest, cookie, REND_DESC_COOKIE_LEN); - crypto_digest_add_bytes(digest, iv, CIPHER_IV_LEN); - crypto_digest_get_digest(digest, client_part, - REND_BASIC_AUTH_CLIENT_ID_LEN); - crypto_digest_free(digest); - - /* Put both together. */ - smartlist_add(encrypted_session_keys, client_part); - } SMARTLIST_FOREACH_END(cookie); - - /* Add some fake client IDs and encrypted session keys. */ - for (i = (smartlist_len(client_cookies) - 1) % - REND_BASIC_AUTH_CLIENT_MULTIPLE; - i < REND_BASIC_AUTH_CLIENT_MULTIPLE - 1; i++) { - client_part = tor_malloc_zero(REND_BASIC_AUTH_CLIENT_ENTRY_LEN); - crypto_rand(client_part, REND_BASIC_AUTH_CLIENT_ENTRY_LEN); - smartlist_add(encrypted_session_keys, client_part); - } - /* Sort smartlist and put elements in result in order. */ - smartlist_sort_digests(encrypted_session_keys); - pos = 2; - SMARTLIST_FOREACH(encrypted_session_keys, const char *, entry, { - memcpy(enc + pos, entry, REND_BASIC_AUTH_CLIENT_ENTRY_LEN); - pos += REND_BASIC_AUTH_CLIENT_ENTRY_LEN; - }); - *encrypted_out = enc; - *encrypted_len_out = len; - enc = NULL; /* prevent free. */ - r = 0; - done: - tor_free(enc); - if (encrypted_session_keys) { - SMARTLIST_FOREACH(encrypted_session_keys, char *, d, tor_free(d);); - smartlist_free(encrypted_session_keys); - } - return r; -} - -/** Encrypt the encoded introduction points in encoded using - * authorization type 'stealth' with descriptor_cookie of length - * REND_DESC_COOKIE_LEN and write the result to a newly allocated string - * pointed to by encrypted_out of length encrypted_len_out. - * Return 0 for success, -1 otherwise. */ -static int -rend_encrypt_v2_intro_points_stealth(char **encrypted_out, - size_t *encrypted_len_out, - const char *encoded, - const char *descriptor_cookie) -{ - int r = -1, enclen; - char *enc; - tor_assert(encoded); - tor_assert(descriptor_cookie); - - enc = tor_malloc_zero(1 + CIPHER_IV_LEN + strlen(encoded)); - enc[0] = 0x02; /* Auth type */ - enclen = crypto_cipher_encrypt_with_iv(descriptor_cookie, - enc + 1, - CIPHER_IV_LEN+strlen(encoded), - encoded, strlen(encoded)); - if (enclen < 0) { - log_warn(LD_REND, "Could not encrypt introduction point string."); - goto done; - } - *encrypted_out = enc; - *encrypted_len_out = enclen; - enc = NULL; /* prevent free */ - r = 0; - done: - tor_free(enc); - return r; -} - -/** Attempt to parse the given desc_str and return true if this - * succeeds, false otherwise. */ -STATIC int -rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc) -{ - rend_service_descriptor_t *test_parsed = NULL; - char test_desc_id[DIGEST_LEN]; - char *test_intro_content = NULL; - size_t test_intro_size; - size_t test_encoded_size; - const char *test_next; - int res = rend_parse_v2_service_descriptor(&test_parsed, test_desc_id, - &test_intro_content, - &test_intro_size, - &test_encoded_size, - &test_next, desc->desc_str, 1); - rend_service_descriptor_free(test_parsed); - tor_free(test_intro_content); - return (res >= 0); -} - -/** Free the storage held by an encoded v2 service descriptor. */ -void -rend_encoded_v2_service_descriptor_free_( - rend_encoded_v2_service_descriptor_t *desc) -{ - if (!desc) - return; - tor_free(desc->desc_str); - tor_free(desc); -} - -/** Free the storage held by an introduction point info. */ -void -rend_intro_point_free_(rend_intro_point_t *intro) -{ - if (!intro) - return; - - extend_info_free(intro->extend_info); - crypto_pk_free(intro->intro_key); - - if (intro->accepted_intro_rsa_parts != NULL) { - replaycache_free(intro->accepted_intro_rsa_parts); - } - - tor_free(intro); -} - -/** Encode a set of rend_encoded_v2_service_descriptor_t's for desc - * at time now using service_key, depending on - * auth_type a descriptor_cookie and a list of - * client_cookies (which are both NULL if no client - * authorization is performed), and period (e.g. 0 for the current - * period, 1 for the next period, etc.) and add them to the existing list - * descs_out; return the number of seconds that the descriptors will - * be found by clients, or -1 if the encoding was not successful. */ -int -rend_encode_v2_descriptors(smartlist_t *descs_out, - rend_service_descriptor_t *desc, time_t now, - uint8_t period, rend_auth_type_t auth_type, - crypto_pk_t *client_key, - smartlist_t *client_cookies) -{ - char service_id[DIGEST_LEN]; - char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1]; - uint32_t time_period; - char *ipos_base64 = NULL, *ipos = NULL, *ipos_encrypted = NULL, - *descriptor_cookie = NULL; - size_t ipos_len = 0, ipos_encrypted_len = 0; - int k; - uint32_t seconds_valid; - crypto_pk_t *service_key; - if (!desc) { - log_warn(LD_BUG, "Could not encode v2 descriptor: No desc given."); - return -1; - } - service_key = (auth_type == REND_STEALTH_AUTH) ? client_key : desc->pk; - tor_assert(service_key); - if (auth_type == REND_STEALTH_AUTH) { - descriptor_cookie = smartlist_get(client_cookies, 0); - tor_assert(descriptor_cookie); - } - /* Obtain service_id from public key. */ - if (crypto_pk_get_digest(service_key, service_id) < 0) { - log_warn(LD_BUG, "Couldn't compute service key digest."); - return -1; - } - /* Calculate current time-period. */ - time_period = get_time_period(now, period, service_id); - /* Determine how many seconds the descriptor will be valid. */ - seconds_valid = period * REND_TIME_PERIOD_V2_DESC_VALIDITY + - get_seconds_valid(now, service_id); - /* Assemble, possibly encrypt, and encode introduction points. */ - if (smartlist_len(desc->intro_nodes) > 0) { - if (rend_encode_v2_intro_points(&ipos, desc) < 0) { - log_warn(LD_REND, "Encoding of introduction points did not succeed."); - return -1; - } - switch (auth_type) { - case REND_NO_AUTH: - ipos_len = strlen(ipos); - break; - case REND_BASIC_AUTH: - if (rend_encrypt_v2_intro_points_basic(&ipos_encrypted, - &ipos_encrypted_len, ipos, - client_cookies) < 0) { - log_warn(LD_REND, "Encrypting of introduction points did not " - "succeed."); - tor_free(ipos); - return -1; - } - tor_free(ipos); - ipos = ipos_encrypted; - ipos_len = ipos_encrypted_len; - break; - case REND_STEALTH_AUTH: - if (rend_encrypt_v2_intro_points_stealth(&ipos_encrypted, - &ipos_encrypted_len, ipos, - descriptor_cookie) < 0) { - log_warn(LD_REND, "Encrypting of introduction points did not " - "succeed."); - tor_free(ipos); - return -1; - } - tor_free(ipos); - ipos = ipos_encrypted; - ipos_len = ipos_encrypted_len; - break; - default: - log_warn(LD_REND|LD_BUG, "Unrecognized authorization type %d", - (int)auth_type); - tor_free(ipos); - return -1; - } - /* Base64-encode introduction points. */ - ipos_base64 = tor_calloc(ipos_len, 2); - if (base64_encode(ipos_base64, ipos_len * 2, ipos, ipos_len, - BASE64_ENCODE_MULTILINE)<0) { - log_warn(LD_REND, "Could not encode introduction point string to " - "base64. length=%d", (int)ipos_len); - tor_free(ipos_base64); - tor_free(ipos); - return -1; - } - tor_free(ipos); - } - /* Encode REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS descriptors. */ - for (k = 0; k < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; k++) { - char secret_id_part[DIGEST_LEN]; - char secret_id_part_base32[REND_SECRET_ID_PART_LEN_BASE32 + 1]; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - char *permanent_key = NULL; - size_t permanent_key_len; - char published[ISO_TIME_LEN+1]; - int i; - char protocol_versions_string[16]; /* max len: "0,1,2,3,4,5,6,7\0" */ - size_t protocol_versions_written; - size_t desc_len; - char *desc_str = NULL; - int result = 0; - size_t written = 0; - char desc_digest[DIGEST_LEN]; - rend_encoded_v2_service_descriptor_t *enc = - tor_malloc_zero(sizeof(rend_encoded_v2_service_descriptor_t)); - /* Calculate secret-id-part = h(time-period | cookie | replica). */ - get_secret_id_part_bytes(secret_id_part, time_period, descriptor_cookie, - k); - base32_encode(secret_id_part_base32, sizeof(secret_id_part_base32), - secret_id_part, DIGEST_LEN); - /* Calculate descriptor ID. */ - rend_get_descriptor_id_bytes(enc->desc_id, service_id, secret_id_part); - base32_encode(desc_id_base32, sizeof(desc_id_base32), - enc->desc_id, DIGEST_LEN); - /* PEM-encode the public key */ - if (crypto_pk_write_public_key_to_string(service_key, &permanent_key, - &permanent_key_len) < 0) { - log_warn(LD_BUG, "Could not write public key to string."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - /* Encode timestamp. */ - format_iso_time(published, desc->timestamp); - /* Write protocol-versions bitmask to comma-separated value string. */ - protocol_versions_written = 0; - for (i = 0; i < 8; i++) { - if (desc->protocols & 1 << i) { - tor_snprintf(protocol_versions_string + protocol_versions_written, - 16 - protocol_versions_written, "%d,", i); - protocol_versions_written += 2; - } - } - if (protocol_versions_written) - protocol_versions_string[protocol_versions_written - 1] = '\0'; - else - protocol_versions_string[0]= '\0'; - /* Assemble complete descriptor. */ - desc_len = 2000 + smartlist_len(desc->intro_nodes) * 1000; /* far too long, - but okay.*/ - enc->desc_str = desc_str = tor_malloc_zero(desc_len); - result = tor_snprintf(desc_str, desc_len, - "rendezvous-service-descriptor %s\n" - "version 2\n" - "permanent-key\n%s" - "secret-id-part %s\n" - "publication-time %s\n" - "protocol-versions %s\n", - desc_id_base32, - permanent_key, - secret_id_part_base32, - published, - protocol_versions_string); - tor_free(permanent_key); - if (result < 0) { - log_warn(LD_BUG, "Descriptor ran out of room."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - written = result; - /* Add introduction points. */ - if (ipos_base64) { - result = tor_snprintf(desc_str + written, desc_len - written, - "introduction-points\n" - "-----BEGIN MESSAGE-----\n%s" - "-----END MESSAGE-----\n", - ipos_base64); - if (result < 0) { - log_warn(LD_BUG, "could not write introduction points."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - written += result; - } - /* Add signature. */ - strlcpy(desc_str + written, "signature\n", desc_len - written); - written += strlen(desc_str + written); - if (crypto_digest(desc_digest, desc_str, written) < 0) { - log_warn(LD_BUG, "could not create digest."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - if (router_append_dirobj_signature(desc_str + written, - desc_len - written, - desc_digest, DIGEST_LEN, - service_key) < 0) { - log_warn(LD_BUG, "Couldn't sign desc."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - written += strlen(desc_str+written); - if (written+2 > desc_len) { - log_warn(LD_BUG, "Could not finish desc."); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - desc_str[written++] = 0; - /* Check if we can parse our own descriptor. */ - if (!rend_desc_v2_is_parsable(enc)) { - log_warn(LD_BUG, "Could not parse my own descriptor: %s", desc_str); - rend_encoded_v2_service_descriptor_free(enc); - goto err; - } - smartlist_add(descs_out, enc); - /* Add the uploaded descriptor to the local service's descriptor cache */ - rend_cache_store_v2_desc_as_service(enc->desc_str); - base32_encode(service_id_base32, sizeof(service_id_base32), - service_id, REND_SERVICE_ID_LEN); - control_event_hs_descriptor_created(service_id_base32, desc_id_base32, k); - } - - log_info(LD_REND, "Successfully encoded a v2 descriptor and " - "confirmed that it is parsable."); - goto done; - - err: - SMARTLIST_FOREACH(descs_out, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d);); - smartlist_clear(descs_out); - seconds_valid = -1; - - done: - tor_free(ipos_base64); - return seconds_valid; -} - -/** Sets out to the first 10 bytes of the digest of pk, - * base32 encoded. NUL-terminates out. (We use this string to - * identify services in directory requests and .onion URLs.) - */ -int -rend_get_service_id(crypto_pk_t *pk, char *out) -{ - char buf[DIGEST_LEN]; - tor_assert(pk); - if (crypto_pk_get_digest(pk, buf) < 0) - return -1; - base32_encode(out, REND_SERVICE_ID_LEN_BASE32+1, buf, REND_SERVICE_ID_LEN); - return 0; -} - -/** Return true iff query is a syntactically valid service ID (as - * generated by rend_get_service_id). */ -int -rend_valid_v2_service_id(const char *query) -{ - if (strlen(query) != REND_SERVICE_ID_LEN_BASE32) - return 0; - - if (strspn(query, BASE32_CHARS) != REND_SERVICE_ID_LEN_BASE32) - return 0; - - return 1; -} - -/** Return true iff query is a syntactically valid descriptor ID. - * (as generated by rend_get_descriptor_id_bytes). */ -int -rend_valid_descriptor_id(const char *query) -{ - if (strlen(query) != REND_DESC_ID_V2_LEN_BASE32) { - goto invalid; - } - if (strspn(query, BASE32_CHARS) != REND_DESC_ID_V2_LEN_BASE32) { - goto invalid; - } - - return 1; - - invalid: - return 0; -} - -/** Return true iff client_name is a syntactically valid name - * for rendezvous client authentication. */ -int -rend_valid_client_name(const char *client_name) -{ - size_t len = strlen(client_name); - if (len < 1 || len > REND_CLIENTNAME_MAX_LEN) { - return 0; - } - if (strspn(client_name, REND_LEGAL_CLIENTNAME_CHARACTERS) != len) { - return 0; - } - - return 1; -} - -/** Called when we get a rendezvous-related relay cell on circuit - * circ. Dispatch on rendezvous relay command. */ -void -rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, - int command, size_t length, - const uint8_t *payload) -{ - or_circuit_t *or_circ = NULL; - origin_circuit_t *origin_circ = NULL; - int r = -2; - if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circ = TO_ORIGIN_CIRCUIT(circ); - if (!layer_hint || layer_hint != origin_circ->cpath->prev) { - log_fn(LOG_PROTOCOL_WARN, LD_APP, - "Relay cell (rend purpose %d) from wrong hop on origin circ", - command); - origin_circ = NULL; - } - } else { - or_circ = TO_OR_CIRCUIT(circ); - } - - switch (command) { - case RELAY_COMMAND_ESTABLISH_INTRO: - if (or_circ) - r = hs_intro_received_establish_intro(or_circ,payload,length); - break; - case RELAY_COMMAND_ESTABLISH_RENDEZVOUS: - if (or_circ) - r = rend_mid_establish_rendezvous(or_circ,payload,length); - break; - case RELAY_COMMAND_INTRODUCE1: - if (or_circ) - r = hs_intro_received_introduce1(or_circ,payload,length); - break; - case RELAY_COMMAND_INTRODUCE2: - if (origin_circ) - r = hs_service_receive_introduce2(origin_circ,payload,length); - break; - case RELAY_COMMAND_INTRODUCE_ACK: - if (origin_circ) - r = hs_client_receive_introduce_ack(origin_circ,payload,length); - break; - case RELAY_COMMAND_RENDEZVOUS1: - if (or_circ) - r = rend_mid_rendezvous(or_circ,payload,length); - break; - case RELAY_COMMAND_RENDEZVOUS2: - if (origin_circ) - r = hs_client_receive_rendezvous2(origin_circ,payload,length); - break; - case RELAY_COMMAND_INTRO_ESTABLISHED: - if (origin_circ) - r = hs_service_receive_intro_established(origin_circ,payload,length); - break; - case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED: - if (origin_circ) - r = hs_client_receive_rendezvous_acked(origin_circ,payload,length); - break; - default: - tor_fragile_assert(); - } - - if (r == -2) - log_info(LD_PROTOCOL, "Dropping cell (type %d) for wrong circuit type.", - command); -} - -/** Determine the routers that are responsible for id (binary) and - * add pointers to those routers' routerstatus_t to responsible_dirs. - * Return -1 if we're returning an empty smartlist, else return 0. - */ -int -hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, - const char *id) -{ - int start, found, n_added = 0, i; - networkstatus_t *c = networkstatus_get_latest_consensus(); - if (!c || !smartlist_len(c->routerstatus_list)) { - log_warn(LD_REND, "We don't have a consensus, so we can't perform v2 " - "rendezvous operations."); - return -1; - } - tor_assert(id); - start = networkstatus_vote_find_entry_idx(c, id, &found); - if (start == smartlist_len(c->routerstatus_list)) start = 0; - i = start; - do { - routerstatus_t *r = smartlist_get(c->routerstatus_list, i); - if (r->is_hs_dir) { - smartlist_add(responsible_dirs, r); - if (++n_added == REND_NUMBER_OF_CONSECUTIVE_REPLICAS) - return 0; - } - if (++i == smartlist_len(c->routerstatus_list)) - i = 0; - } while (i != start); - - /* Even though we don't have the desired number of hidden service - * directories, be happy if we got any. */ - return smartlist_len(responsible_dirs) ? 0 : -1; -} - -/* Length of the 'extended' auth cookie used to encode auth type before - * base64 encoding. */ -#define REND_DESC_COOKIE_LEN_EXT (REND_DESC_COOKIE_LEN + 1) -/* Length of the zero-padded auth cookie when base64 encoded. These two - * padding bytes always (A=) are stripped off of the returned cookie. */ -#define REND_DESC_COOKIE_LEN_EXT_BASE64 (REND_DESC_COOKIE_LEN_BASE64 + 2) - -/** Encode a client authorization descriptor cookie. - * The result of this function is suitable for use in the HidServAuth - * option. The trailing padding characters are removed, and the - * auth type is encoded into the cookie. - * - * Returns a new base64-encoded cookie. This function cannot fail. - * The caller is responsible for freeing the returned value. - */ -char * -rend_auth_encode_cookie(const uint8_t *cookie_in, rend_auth_type_t auth_type) -{ - uint8_t extended_cookie[REND_DESC_COOKIE_LEN_EXT]; - char *cookie_out = tor_malloc_zero(REND_DESC_COOKIE_LEN_EXT_BASE64 + 1); - int re; - - tor_assert(cookie_in); - - memcpy(extended_cookie, cookie_in, REND_DESC_COOKIE_LEN); - extended_cookie[REND_DESC_COOKIE_LEN] = ((int)auth_type - 1) << 4; - re = base64_encode(cookie_out, REND_DESC_COOKIE_LEN_EXT_BASE64 + 1, - (const char *) extended_cookie, REND_DESC_COOKIE_LEN_EXT, - 0); - tor_assert(re == REND_DESC_COOKIE_LEN_EXT_BASE64); - - /* Remove the trailing 'A='. Auth type is encoded in the high bits - * of the last byte, so the last base64 character will always be zero - * (A). This is subtly different behavior from base64_encode_nopad. */ - cookie_out[REND_DESC_COOKIE_LEN_BASE64] = '\0'; - memwipe(extended_cookie, 0, sizeof(extended_cookie)); - return cookie_out; -} - -/** Decode a base64-encoded client authorization descriptor cookie. - * The descriptor_cookie can be truncated to REND_DESC_COOKIE_LEN_BASE64 - * characters (as given to clients), or may include the two padding - * characters (as stored by the service). - * - * The result is stored in REND_DESC_COOKIE_LEN bytes of cookie_out. - * The rend_auth_type_t decoded from the cookie is stored in the - * optional auth_type_out parameter. - * - * Return 0 on success, or -1 on error. The caller is responsible for - * freeing the returned err_msg. - */ -int -rend_auth_decode_cookie(const char *cookie_in, uint8_t *cookie_out, - rend_auth_type_t *auth_type_out, char **err_msg_out) -{ - uint8_t descriptor_cookie_decoded[REND_DESC_COOKIE_LEN_EXT + 1] = { 0 }; - char descriptor_cookie_base64ext[REND_DESC_COOKIE_LEN_EXT_BASE64 + 1]; - const char *descriptor_cookie = cookie_in; - char *err_msg = NULL; - int auth_type_val = 0; - int res = -1; - int decoded_len; - - size_t len = strlen(descriptor_cookie); - if (len == REND_DESC_COOKIE_LEN_BASE64) { - /* Add a trailing zero byte to make base64-decoding happy. */ - tor_snprintf(descriptor_cookie_base64ext, - sizeof(descriptor_cookie_base64ext), - "%sA=", descriptor_cookie); - descriptor_cookie = descriptor_cookie_base64ext; - } else if (len != REND_DESC_COOKIE_LEN_EXT_BASE64) { - tor_asprintf(&err_msg, "Authorization cookie has wrong length: %s", - escaped(cookie_in)); - goto err; - } - - decoded_len = base64_decode((char *) descriptor_cookie_decoded, - sizeof(descriptor_cookie_decoded), - descriptor_cookie, - REND_DESC_COOKIE_LEN_EXT_BASE64); - if (decoded_len != REND_DESC_COOKIE_LEN && - decoded_len != REND_DESC_COOKIE_LEN_EXT) { - tor_asprintf(&err_msg, "Authorization cookie has invalid characters: %s", - escaped(cookie_in)); - goto err; - } - - if (auth_type_out) { - auth_type_val = (descriptor_cookie_decoded[REND_DESC_COOKIE_LEN] >> 4) + 1; - if (auth_type_val < 1 || auth_type_val > 2) { - tor_asprintf(&err_msg, "Authorization cookie type is unknown: %s", - escaped(cookie_in)); - goto err; - } - *auth_type_out = auth_type_val == 1 ? REND_BASIC_AUTH : REND_STEALTH_AUTH; - } - - memcpy(cookie_out, descriptor_cookie_decoded, REND_DESC_COOKIE_LEN); - res = 0; - err: - if (err_msg_out) { - *err_msg_out = err_msg; - } else { - tor_free(err_msg); - } - memwipe(descriptor_cookie_decoded, 0, sizeof(descriptor_cookie_decoded)); - memwipe(descriptor_cookie_base64ext, 0, sizeof(descriptor_cookie_base64ext)); - return res; -} - -/* Is this a rend client or server that allows direct (non-anonymous) - * connections? - * Clients must be specifically compiled and configured in this mode. - * Onion services can be configured to start in this mode. - * Prefer rend_client_allow_non_anonymous_connection() or - * rend_service_allow_non_anonymous_connection() whenever possible, so that - * checks are specific to Single Onion Services or Tor2web. */ -int -rend_allow_non_anonymous_connection(const or_options_t* options) -{ - return (rend_client_allow_non_anonymous_connection(options) - || rend_service_allow_non_anonymous_connection(options)); -} - -/* Is this a rend client or server in non-anonymous mode? - * Clients must be specifically compiled in this mode. - * Onion services can be configured to start in this mode. - * Prefer rend_client_non_anonymous_mode_enabled() or - * rend_service_non_anonymous_mode_enabled() whenever possible, so that checks - * are specific to Single Onion Services or Tor2web. */ -int -rend_non_anonymous_mode_enabled(const or_options_t *options) -{ - return (rend_client_non_anonymous_mode_enabled(options) - || rend_service_non_anonymous_mode_enabled(options)); -} - -/* Make sure that tor only builds one-hop circuits when they would not - * compromise user anonymity. - * - * One-hop circuits are permitted in Tor2web or Single Onion modes. - * - * Tor2web or Single Onion modes are also allowed to make multi-hop circuits. - * For example, single onion HSDir circuits are 3-hop to prevent denial of - * service. - */ -void -assert_circ_anonymity_ok(const origin_circuit_t *circ, - const or_options_t *options) -{ - tor_assert(options); - tor_assert(circ); - tor_assert(circ->build_state); - - if (circ->build_state->onehop_tunnel) { - tor_assert(rend_allow_non_anonymous_connection(options)); - } -} - -/* Return 1 iff the given digest of a permenanent hidden service key is - * equal to the digest in the origin circuit ocirc of its rend data . - * If the rend data doesn't exist, 0 is returned. This function is agnostic to - * the rend data version. */ -int -rend_circuit_pk_digest_eq(const origin_circuit_t *ocirc, - const uint8_t *digest) -{ - size_t rend_pk_digest_len; - const uint8_t *rend_pk_digest; - - tor_assert(ocirc); - tor_assert(digest); - - if (ocirc->rend_data == NULL) { - goto no_match; - } - - rend_pk_digest = rend_data_get_pk_digest(ocirc->rend_data, - &rend_pk_digest_len); - if (tor_memeq(rend_pk_digest, digest, rend_pk_digest_len)) { - goto match; - } - no_match: - return 0; - match: - return 1; -} - diff --git a/src/tor/src/or/rendcommon.h b/src/tor/src/or/rendcommon.h deleted file mode 100644 index 1ed0f6260..000000000 --- a/src/tor/src/or/rendcommon.h +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendcommon.h - * \brief Header file for rendcommon.c. - **/ - -#ifndef TOR_RENDCOMMON_H -#define TOR_RENDCOMMON_H - -typedef enum rend_intro_point_failure_t { - INTRO_POINT_FAILURE_GENERIC = 0, - INTRO_POINT_FAILURE_TIMEOUT = 1, - INTRO_POINT_FAILURE_UNREACHABLE = 2, -} rend_intro_point_failure_t; - -int rend_cmp_service_ids(const char *one, const char *two); - -void rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint, - int command, size_t length, - const uint8_t *payload); - -void rend_service_descriptor_free_(rend_service_descriptor_t *desc); -#define rend_service_descriptor_free(desc) \ - FREE_AND_NULL(rend_service_descriptor_t, rend_service_descriptor_free_, \ - (desc)) -int rend_get_service_id(crypto_pk_t *pk, char *out); -void rend_encoded_v2_service_descriptor_free_( - rend_encoded_v2_service_descriptor_t *desc); -#define rend_encoded_v2_service_descriptor_free(desc) \ - FREE_AND_NULL(rend_encoded_v2_service_descriptor_t, \ - rend_encoded_v2_service_descriptor_free_, (desc)) -void rend_intro_point_free_(rend_intro_point_t *intro); -#define rend_intro_point_free(intro) \ - FREE_AND_NULL(rend_intro_point_t, rend_intro_point_free_, (intro)) - -int rend_valid_v2_service_id(const char *query); -int rend_valid_descriptor_id(const char *query); -int rend_valid_client_name(const char *client_name); -int rend_encode_v2_descriptors(smartlist_t *descs_out, - rend_service_descriptor_t *desc, time_t now, - uint8_t period, rend_auth_type_t auth_type, - crypto_pk_t *client_key, - smartlist_t *client_cookies); -int rend_compute_v2_desc_id(char *desc_id_out, const char *service_id, - const char *descriptor_cookie, - time_t now, uint8_t replica); -void rend_get_descriptor_id_bytes(char *descriptor_id_out, - const char *service_id, - const char *secret_id_part); -int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, - const char *id); - -int rend_circuit_pk_digest_eq(const origin_circuit_t *ocirc, - const uint8_t *digest); - -char *rend_auth_encode_cookie(const uint8_t *cookie_in, - rend_auth_type_t auth_type); -int rend_auth_decode_cookie(const char *cookie_in, - uint8_t *cookie_out, - rend_auth_type_t *auth_type_out, - char **err_msg_out); - -int rend_allow_non_anonymous_connection(const or_options_t* options); -int rend_non_anonymous_mode_enabled(const or_options_t *options); - -void assert_circ_anonymity_ok(const origin_circuit_t *circ, - const or_options_t *options); - -#ifdef RENDCOMMON_PRIVATE - -STATIC int -rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc); - -#endif /* defined(RENDCOMMON_PRIVATE) */ - -#endif /* !defined(TOR_RENDCOMMON_H) */ - diff --git a/src/tor/src/or/rendservice.c b/src/tor/src/or/rendservice.c deleted file mode 100644 index 06166d7cf..000000000 --- a/src/tor/src/or/rendservice.c +++ /dev/null @@ -1,4408 +0,0 @@ -/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendservice.c - * \brief The hidden-service side of rendezvous functionality. - **/ - -#define RENDSERVICE_PRIVATE - -#include "or.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "control.h" -#include "directory.h" -#include "hs_common.h" -#include "hs_config.h" -#include "main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "router.h" -#include "relay.h" -#include "rephist.h" -#include "replaycache.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" - -struct rend_service_t; -static origin_circuit_t *find_intro_circuit(rend_intro_point_t *intro, - const char *pk_digest); -static rend_intro_point_t *find_intro_point(origin_circuit_t *circ); -static rend_intro_point_t *find_expiring_intro_point( - struct rend_service_t *service, origin_circuit_t *circ); - -static extend_info_t *find_rp_for_intro( - const rend_intro_cell_t *intro, - char **err_msg_out); - -static int intro_point_accepted_intro_count(rend_intro_point_t *intro); -static int intro_point_should_expire_now(rend_intro_point_t *intro, - time_t now); -static int rend_service_derive_key_digests(struct rend_service_t *s); -static int rend_service_load_keys(struct rend_service_t *s); -static int rend_service_load_auth_keys(struct rend_service_t *s, - const char *hfname); -static struct rend_service_t *rend_service_get_by_pk_digest( - const char* digest); -static struct rend_service_t *rend_service_get_by_service_id(const char *id); -static const char *rend_service_escaped_dir( - const struct rend_service_t *s); - -static ssize_t rend_service_parse_intro_for_v0_or_v1( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out); -static ssize_t rend_service_parse_intro_for_v2( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out); -static ssize_t rend_service_parse_intro_for_v3( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out); - -static int rend_service_check_private_dir(const or_options_t *options, - const rend_service_t *s, - int create); -static const smartlist_t* rend_get_service_list( - const smartlist_t* substitute_service_list); -static smartlist_t* rend_get_service_list_mutable( - smartlist_t* substitute_service_list); -static int rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted); - -/* Hidden service directory file names: - * new file names should be added to rend_service_add_filenames_to_list() - * for sandboxing purposes. */ -static const char *private_key_fname = "private_key"; -static const char *hostname_fname = "hostname"; -static const char *client_keys_fname = "client_keys"; -static const char *sos_poison_fname = "onion_service_non_anonymous"; - -/** A list of rend_service_t's for services run on this OP. */ -static smartlist_t *rend_service_list = NULL; -/** A list of rend_service_t's for services run on this OP which is used as a - * staging area before they are put in the main list in order to prune dying - * service on config reload. */ -static smartlist_t *rend_service_staging_list = NULL; - -/* Like rend_get_service_list_mutable, but returns a read-only list. */ -static const smartlist_t* -rend_get_service_list(const smartlist_t* substitute_service_list) -{ - /* It is safe to cast away the const here, because - * rend_get_service_list_mutable does not actually modify the list */ - return rend_get_service_list_mutable((smartlist_t*)substitute_service_list); -} - -/* Return a mutable list of hidden services. - * If substitute_service_list is not NULL, return it. - * Otherwise, check if the global rend_service_list is non-NULL, and if so, - * return it. - * Otherwise, log a BUG message and return NULL. - * */ -static smartlist_t* -rend_get_service_list_mutable(smartlist_t* substitute_service_list) -{ - if (substitute_service_list) { - return substitute_service_list; - } - - /* If no special service list is provided, then just use the global one. */ - - if (BUG(!rend_service_list)) { - /* No global HS list, which is a programmer error. */ - return NULL; - } - - return rend_service_list; -} - -/** Tells if onion service s is ephemeral. - */ -static unsigned int -rend_service_is_ephemeral(const struct rend_service_t *s) -{ - return (s->directory == NULL); -} - -/** Returns a escaped string representation of the service, s. - */ -static const char * -rend_service_escaped_dir(const struct rend_service_t *s) -{ - return rend_service_is_ephemeral(s) ? "[EPHEMERAL]" : escaped(s->directory); -} - -/** Return the number of rendezvous services we have configured. */ -int -rend_num_services(void) -{ - if (!rend_service_list) - return 0; - return smartlist_len(rend_service_list); -} - -/** Helper: free storage held by a single service authorized client entry. */ -void -rend_authorized_client_free_(rend_authorized_client_t *client) -{ - if (!client) - return; - if (client->client_key) - crypto_pk_free(client->client_key); - if (client->client_name) - memwipe(client->client_name, 0, strlen(client->client_name)); - tor_free(client->client_name); - memwipe(client->descriptor_cookie, 0, sizeof(client->descriptor_cookie)); - tor_free(client); -} - -/** Helper for strmap_free. */ -static void -rend_authorized_client_free_void(void *authorized_client) -{ - rend_authorized_client_free_(authorized_client); -} - -/** Release the storage held by service. - */ -STATIC void -rend_service_free_(rend_service_t *service) -{ - if (!service) - return; - - tor_free(service->directory); - if (service->ports) { - SMARTLIST_FOREACH(service->ports, rend_service_port_config_t*, p, - rend_service_port_config_free(p)); - smartlist_free(service->ports); - } - if (service->private_key) - crypto_pk_free(service->private_key); - if (service->intro_nodes) { - SMARTLIST_FOREACH(service->intro_nodes, rend_intro_point_t *, intro, - rend_intro_point_free(intro);); - smartlist_free(service->intro_nodes); - } - if (service->expiring_nodes) { - SMARTLIST_FOREACH(service->expiring_nodes, rend_intro_point_t *, intro, - rend_intro_point_free(intro);); - smartlist_free(service->expiring_nodes); - } - - rend_service_descriptor_free(service->desc); - if (service->clients) { - SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, c, - rend_authorized_client_free(c);); - smartlist_free(service->clients); - } - if (service->accepted_intro_dh_parts) { - replaycache_free(service->accepted_intro_dh_parts); - } - tor_free(service); -} - -/* Release all the storage held in rend_service_staging_list. */ -void -rend_service_free_staging_list(void) -{ - if (rend_service_staging_list) { - SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t*, ptr, - rend_service_free(ptr)); - smartlist_free(rend_service_staging_list); - rend_service_staging_list = NULL; - } -} - -/** Release all the storage held in both rend_service_list and - * rend_service_staging_list. */ -void -rend_service_free_all(void) -{ - if (rend_service_list) { - SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, - rend_service_free(ptr)); - smartlist_free(rend_service_list); - rend_service_list = NULL; - } - rend_service_free_staging_list(); -} - -/* Initialize the subsystem. */ -void -rend_service_init(void) -{ - tor_assert(!rend_service_list); - tor_assert(!rend_service_staging_list); - - rend_service_list = smartlist_new(); - rend_service_staging_list = smartlist_new(); -} - -/* Validate a service. Use the service_list to make sure there - * is no duplicate entry for the given service object. Return 0 if valid else - * -1 if not.*/ -static int -rend_validate_service(const smartlist_t *service_list, - const rend_service_t *service) -{ - tor_assert(service_list); - tor_assert(service); - - if (service->max_streams_per_circuit < 0) { - log_warn(LD_CONFIG, "Hidden service (%s) configured with negative max " - "streams per circuit.", - rend_service_escaped_dir(service)); - goto invalid; - } - - if (service->max_streams_close_circuit < 0 || - service->max_streams_close_circuit > 1) { - log_warn(LD_CONFIG, "Hidden service (%s) configured with invalid " - "max streams handling.", - rend_service_escaped_dir(service)); - goto invalid; - } - - if (service->auth_type != REND_NO_AUTH && - (!service->clients || smartlist_len(service->clients) == 0)) { - log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but " - "no clients.", - rend_service_escaped_dir(service)); - goto invalid; - } - - if (!service->ports || !smartlist_len(service->ports)) { - log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured.", - rend_service_escaped_dir(service)); - goto invalid; - } - - /* Valid. */ - return 0; - invalid: - return -1; -} - -/** Add it to service_list, or to the global rend_service_list if - * service_list is NULL. Return 0 on success. On failure, free - * service and return -1. Takes ownership of service. */ -static int -rend_add_service(smartlist_t *service_list, rend_service_t *service) -{ - int i; - rend_service_port_config_t *p; - - tor_assert(service); - - smartlist_t *s_list = rend_get_service_list_mutable(service_list); - /* We must have a service list, even if it's a temporary one, so we can - * check for duplicate services */ - if (BUG(!s_list)) { - rend_service_free(service); - return -1; - } - - service->intro_nodes = smartlist_new(); - service->expiring_nodes = smartlist_new(); - - log_debug(LD_REND,"Configuring service with directory %s", - rend_service_escaped_dir(service)); - for (i = 0; i < smartlist_len(service->ports); ++i) { - p = smartlist_get(service->ports, i); - if (!(p->is_unix_addr)) { - log_debug(LD_REND, - "Service maps port %d to %s", - p->virtual_port, - fmt_addrport(&p->real_addr, p->real_port)); - } else { -#ifdef HAVE_SYS_UN_H - log_debug(LD_REND, - "Service maps port %d to socket at \"%s\"", - p->virtual_port, p->unix_addr); -#else - log_warn(LD_BUG, - "Service maps port %d to an AF_UNIX socket, but we " - "have no AF_UNIX support on this platform. This is " - "probably a bug.", - p->virtual_port); - rend_service_free(service); - return -1; -#endif /* defined(HAVE_SYS_UN_H) */ - } - } - /* The service passed all the checks */ - tor_assert(s_list); - smartlist_add(s_list, service); - return 0; -} - -/** Return a new rend_service_port_config_t with its path set to - * socket_path or empty if socket_path is NULL */ -static rend_service_port_config_t * -rend_service_port_config_new(const char *socket_path) -{ - if (!socket_path) - return tor_malloc_zero(sizeof(rend_service_port_config_t) + 1); - - const size_t pathlen = strlen(socket_path) + 1; - rend_service_port_config_t *conf = - tor_malloc_zero(sizeof(rend_service_port_config_t) + pathlen); - memcpy(conf->unix_addr, socket_path, pathlen); - conf->is_unix_addr = 1; - return conf; -} - -/** Parses a virtual-port to real-port/socket mapping separated by - * the provided separator and returns a new rend_service_port_config_t, - * or NULL and an optional error string on failure. - * - * The format is: VirtualPort SEP (IP|RealPort|IP:RealPort|'socket':path)? - * - * IP defaults to 127.0.0.1; RealPort defaults to VirtualPort. - */ -rend_service_port_config_t * -rend_service_parse_port_config(const char *string, const char *sep, - char **err_msg_out) -{ - smartlist_t *sl; - int virtport; - int realport = 0; - uint16_t p; - tor_addr_t addr; - rend_service_port_config_t *result = NULL; - unsigned int is_unix_addr = 0; - const char *socket_path = NULL; - char *err_msg = NULL; - char *addrport = NULL; - - sl = smartlist_new(); - smartlist_split_string(sl, string, sep, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - if (smartlist_len(sl) < 1 || BUG(smartlist_len(sl) > 2)) { - err_msg = tor_strdup("Bad syntax in hidden service port configuration."); - goto err; - } - virtport = (int)tor_parse_long(smartlist_get(sl,0), 10, 1, 65535, NULL,NULL); - if (!virtport) { - tor_asprintf(&err_msg, "Missing or invalid port %s in hidden service " - "port configuration", escaped(smartlist_get(sl,0))); - - goto err; - } - if (smartlist_len(sl) == 1) { - /* No addr:port part; use default. */ - realport = virtport; - tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */ - } else { - int ret; - - const char *addrport_element = smartlist_get(sl,1); - const char *rest = NULL; - int is_unix; - ret = port_cfg_line_extract_addrport(addrport_element, &addrport, - &is_unix, &rest); - if (ret < 0) { - tor_asprintf(&err_msg, "Couldn't process address <%s> from hidden " - "service configuration", addrport_element); - goto err; - } - if (is_unix) { - socket_path = addrport; - is_unix_addr = 1; - } else if (strchr(addrport, ':') || strchr(addrport, '.')) { - /* else try it as an IP:port pair if it has a : or . in it */ - if (tor_addr_port_lookup(addrport, &addr, &p)<0) { - err_msg = tor_strdup("Unparseable address in hidden service port " - "configuration."); - goto err; - } - realport = p?p:virtport; - } else { - /* No addr:port, no addr -- must be port. */ - realport = (int)tor_parse_long(addrport, 10, 1, 65535, NULL, NULL); - if (!realport) { - tor_asprintf(&err_msg, "Unparseable or out-of-range port %s in " - "hidden service port configuration.", - escaped(addrport)); - goto err; - } - tor_addr_from_ipv4h(&addr, 0x7F000001u); /* Default to 127.0.0.1 */ - } - } - - /* Allow room for unix_addr */ - result = rend_service_port_config_new(socket_path); - result->virtual_port = virtport; - result->is_unix_addr = is_unix_addr; - if (!is_unix_addr) { - result->real_port = realport; - tor_addr_copy(&result->real_addr, &addr); - result->unix_addr[0] = '\0'; - } - - err: - tor_free(addrport); - if (err_msg_out != NULL) { - *err_msg_out = err_msg; - } else { - tor_free(err_msg); - } - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - - return result; -} - -/** Release all storage held in a rend_service_port_config_t. */ -void -rend_service_port_config_free_(rend_service_port_config_t *p) -{ - tor_free(p); -} - -/* Copy relevant data from service src to dst while pruning the service lists. - * This should only be called during the pruning process which takes existing - * services and copy their data to the newly configured services. The src - * service replaycache will be set to NULL after this call. */ -static void -copy_service_on_prunning(rend_service_t *dst, rend_service_t *src) -{ - tor_assert(dst); - tor_assert(src); - - /* Keep the timestamps for when the content changed and the next upload - * time so we can properly upload the descriptor if needed for the new - * service object. */ - dst->desc_is_dirty = src->desc_is_dirty; - dst->next_upload_time = src->next_upload_time; - /* Move the replaycache to the new object. */ - dst->accepted_intro_dh_parts = src->accepted_intro_dh_parts; - src->accepted_intro_dh_parts = NULL; - /* Copy intro point information to destination service. */ - dst->intro_period_started = src->intro_period_started; - dst->n_intro_circuits_launched = src->n_intro_circuits_launched; - dst->n_intro_points_wanted = src->n_intro_points_wanted; -} - -/* Helper: Actual implementation of the pruning on reload which we've - * decoupled in order to make the unit test workeable without ugly hacks. - * Furthermore, this function does NOT free any memory but will nullify the - * temporary list pointer whatever happens. */ -STATIC void -rend_service_prune_list_impl_(void) -{ - origin_circuit_t *ocirc = NULL; - smartlist_t *surviving_services, *old_service_list, *new_service_list; - - /* When pruning our current service list, we must have a staging list that - * contains what we want to check else it's a code flow error. */ - tor_assert(rend_service_staging_list); - - /* We are about to prune the current list of its dead service so set the - * semantic for that list to be the "old" one. */ - old_service_list = rend_service_list; - /* The staging list is now the "new" list so set this semantic. */ - new_service_list = rend_service_staging_list; - /* After this, whatever happens, we'll use our new list. */ - rend_service_list = new_service_list; - /* Finally, nullify the staging list pointer as we don't need it anymore - * and it needs to be NULL before the next reload. */ - rend_service_staging_list = NULL; - /* Nothing to prune if we have no service list so stop right away. */ - if (!old_service_list) { - return; - } - - /* This contains all _existing_ services that survives the relaod that is - * that haven't been removed from the configuration. The difference between - * this list and the new service list is that the new list can possibly - * contain newly configured service that have no introduction points opened - * yet nor key material loaded or generated. */ - surviving_services = smartlist_new(); - - /* Preserve the existing ephemeral services. - * - * This is the ephemeral service equivalent of the "Copy introduction - * points to new services" block, except there's no copy required since - * the service structure isn't regenerated. - * - * After this is done, all ephemeral services will be: - * * Removed from old_service_list, so the equivalent non-ephemeral code - * will not attempt to preserve them. - * * Added to the new_service_list (that previously only had the - * services listed in the configuration). - * * Added to surviving_services, which is the list of services that - * will NOT have their intro point closed. - */ - SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { - if (rend_service_is_ephemeral(old)) { - SMARTLIST_DEL_CURRENT(old_service_list, old); - smartlist_add(surviving_services, old); - smartlist_add(new_service_list, old); - } - } SMARTLIST_FOREACH_END(old); - - /* Copy introduction points to new services. This is O(n^2), but it's only - * called on reconfigure, so it's ok performance wise. */ - SMARTLIST_FOREACH_BEGIN(new_service_list, rend_service_t *, new) { - SMARTLIST_FOREACH_BEGIN(old_service_list, rend_service_t *, old) { - /* Skip ephemeral services as we only want to copy introduction points - * from current services to newly configured one that already exists. - * The same directory means it's the same service. */ - if (rend_service_is_ephemeral(new) || rend_service_is_ephemeral(old) || - strcmp(old->directory, new->directory)) { - continue; - } - smartlist_add_all(new->intro_nodes, old->intro_nodes); - smartlist_clear(old->intro_nodes); - smartlist_add_all(new->expiring_nodes, old->expiring_nodes); - smartlist_clear(old->expiring_nodes); - - /* Copy needed information from old to new. */ - copy_service_on_prunning(new, old); - - /* This regular service will survive the closing IPs step after. */ - smartlist_add(surviving_services, old); - break; - } SMARTLIST_FOREACH_END(old); - } SMARTLIST_FOREACH_END(new); - - /* For every service introduction circuit we can find, see if we have a - * matching surviving configured service. If not, close the circuit. */ - while ((ocirc = circuit_get_next_service_intro_circ(ocirc))) { - int keep_it = 0; - if (ocirc->rend_data == NULL) { - /* This is a v3 circuit, ignore it. */ - continue; - } - SMARTLIST_FOREACH_BEGIN(surviving_services, const rend_service_t *, s) { - if (rend_circuit_pk_digest_eq(ocirc, (uint8_t *) s->pk_digest)) { - /* Keep this circuit as we have a matching configured service. */ - keep_it = 1; - break; - } - } SMARTLIST_FOREACH_END(s); - if (keep_it) { - continue; - } - log_info(LD_REND, "Closing intro point %s for service %s.", - safe_str_client(extend_info_describe( - ocirc->build_state->chosen_exit)), - safe_str_client(rend_data_get_address(ocirc->rend_data))); - /* Reason is FINISHED because service has been removed and thus the - * circuit is considered old/uneeded. */ - circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED); - } - smartlist_free(surviving_services); -} - -/* Try to prune our main service list using the temporary one that we just - * loaded and parsed successfully. The pruning process decides which onion - * services to keep and which to discard after a reload. */ -void -rend_service_prune_list(void) -{ - smartlist_t *old_service_list = rend_service_list; - /* Don't try to prune anything if we have no staging list. */ - if (!rend_service_staging_list) { - return; - } - rend_service_prune_list_impl_(); - if (old_service_list) { - /* Every remaining service in the old list have been removed from the - * configuration so clean them up safely. */ - SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, - rend_service_free(s)); - smartlist_free(old_service_list); - } -} - -/* Copy all the relevant data that the hs_service object contains over to the - * rend_service_t object. The reason to do so is because when configuring a - * service, we go through a generic handler that creates an hs_service_t - * object which so we have to copy the parsed values to a rend service object - * which is version 2 specific. */ -static void -service_config_shadow_copy(rend_service_t *service, - hs_service_config_t *config) -{ - tor_assert(service); - tor_assert(config); - - service->directory = tor_strdup(config->directory_path); - service->dir_group_readable = config->dir_group_readable; - service->allow_unknown_ports = config->allow_unknown_ports; - /* This value can't go above HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT (65535) - * if the code flow is right so this cast is safe. But just in case, we'll - * check it. */ - service->max_streams_per_circuit = (int) config->max_streams_per_rdv_circuit; - if (BUG(config->max_streams_per_rdv_circuit > - HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT)) { - service->max_streams_per_circuit = HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT; - } - service->max_streams_close_circuit = config->max_streams_close_circuit; - service->n_intro_points_wanted = config->num_intro_points; - /* Switching ownership of the ports to the rend service object. */ - smartlist_add_all(service->ports, config->ports); - smartlist_free(config->ports); - config->ports = NULL; -} - -/* Parse the hidden service configuration starting at line_ using the - * already configured generic service configuration in config. This - * function will translate the config object to a rend_service_t and add it to - * the temporary list if valid. If validate_only is set, parse, warn - * and return as normal but don't actually add the service to the list. */ -int -rend_config_service(const config_line_t *line_, - const or_options_t *options, - hs_service_config_t *config) -{ - const config_line_t *line; - rend_service_t *service = NULL; - - /* line_ can be NULL which would mean that the service configuration only - * have one line that is the directory directive. */ - tor_assert(options); - tor_assert(config); - - /* Use the staging service list so that we can check then do the pruning - * process using the main list at the end. */ - if (rend_service_staging_list == NULL) { - rend_service_staging_list = smartlist_new(); - } - - /* Initialize service. */ - service = tor_malloc_zero(sizeof(rend_service_t)); - service->intro_period_started = time(NULL); - service->ports = smartlist_new(); - /* From the hs_service object which has been used to load the generic - * options, we'll copy over the useful data to the rend_service_t object. */ - service_config_shadow_copy(service, config); - - for (line = line_; line; line = line->next) { - if (!strcasecmp(line->key, "HiddenServiceDir")) { - /* We just hit the next hidden service, stop right now. */ - break; - } - /* Number of introduction points. */ - if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) { - int ok = 0; - /* Those are specific defaults for version 2. */ - service->n_intro_points_wanted = - (unsigned int) tor_parse_long(line->value, 10, - 0, NUM_INTRO_POINTS_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, - "HiddenServiceNumIntroductionPoints " - "should be between %d and %d, not %s", - 0, NUM_INTRO_POINTS_MAX, line->value); - goto err; - } - log_info(LD_CONFIG, "HiddenServiceNumIntroductionPoints=%d for %s", - service->n_intro_points_wanted, escaped(service->directory)); - continue; - } - if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) { - /* Parse auth type and comma-separated list of client names and add a - * rend_authorized_client_t for each client to the service's list - * of authorized clients. */ - smartlist_t *type_names_split, *clients; - const char *authname; - if (service->auth_type != REND_NO_AUTH) { - log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " - "lines for a single service."); - goto err; - } - type_names_split = smartlist_new(); - smartlist_split_string(type_names_split, line->value, " ", 0, 2); - if (smartlist_len(type_names_split) < 1) { - log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " - "should have been prevented when parsing the " - "configuration."); - smartlist_free(type_names_split); - goto err; - } - authname = smartlist_get(type_names_split, 0); - if (!strcasecmp(authname, "basic")) { - service->auth_type = REND_BASIC_AUTH; - } else if (!strcasecmp(authname, "stealth")) { - service->auth_type = REND_STEALTH_AUTH; - } else { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " - "unrecognized auth-type '%s'. Only 'basic' or 'stealth' " - "are recognized.", - (char *) smartlist_get(type_names_split, 0)); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - goto err; - } - service->clients = smartlist_new(); - if (smartlist_len(type_names_split) < 2) { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " - "auth-type '%s', but no client names.", - service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - continue; - } - clients = smartlist_new(); - smartlist_split_string(clients, smartlist_get(type_names_split, 1), - ",", SPLIT_SKIP_SPACE, 0); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - /* Remove duplicate client names. */ - { - int num_clients = smartlist_len(clients); - smartlist_sort_strings(clients); - smartlist_uniq_strings(clients); - if (smartlist_len(clients) < num_clients) { - log_info(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " - "duplicate client name(s); removing.", - num_clients - smartlist_len(clients)); - } - } - SMARTLIST_FOREACH_BEGIN(clients, const char *, client_name) - { - rend_authorized_client_t *client; - if (!rend_valid_client_name(client_name)) { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains an " - "illegal client name: '%s'. Names must be " - "between 1 and %d characters and contain " - "only [A-Za-z0-9+_-].", - client_name, REND_CLIENTNAME_MAX_LEN); - SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); - smartlist_free(clients); - goto err; - } - client = tor_malloc_zero(sizeof(rend_authorized_client_t)); - client->client_name = tor_strdup(client_name); - smartlist_add(service->clients, client); - log_debug(LD_REND, "Adding client name '%s'", client_name); - } - SMARTLIST_FOREACH_END(client_name); - SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp)); - smartlist_free(clients); - /* Ensure maximum number of clients. */ - if ((service->auth_type == REND_BASIC_AUTH && - smartlist_len(service->clients) > 512) || - (service->auth_type == REND_STEALTH_AUTH && - smartlist_len(service->clients) > 16)) { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " - "client authorization entries, but only a " - "maximum of %d entries is allowed for " - "authorization type '%s'.", - smartlist_len(service->clients), - service->auth_type == REND_BASIC_AUTH ? 512 : 16, - service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); - goto err; - } - continue; - } - } - /* Validate the service just parsed. */ - if (rend_validate_service(rend_service_staging_list, service) < 0) { - /* Service is in the staging list so don't try to free it. */ - goto err; - } - - /* Add it to the temporary list which we will use to prune our current - * list if any after configuring all services. */ - if (rend_add_service(rend_service_staging_list, service) < 0) { - /* The object has been freed on error already. */ - service = NULL; - goto err; - } - - return 0; - err: - rend_service_free(service); - return -1; -} - -/** Add the ephemeral service pk/ports if possible, using - * client authorization auth_type and an optional list of - * rend_authorized_client_t in auth_clients, with - * max_streams_per_circuit streams allowed per rendezvous circuit, - * and circuit closure on max streams being exceeded set by - * max_streams_close_circuit. - * - * Ownership of pk, ports, and auth_clients is passed to this routine. - * Regardless of success/failure, callers should not touch these values - * after calling this routine, and may assume that correct cleanup has - * been done on failure. - * - * Return an appropriate hs_service_add_ephemeral_status_t. - */ -hs_service_add_ephemeral_status_t -rend_service_add_ephemeral(crypto_pk_t *pk, - smartlist_t *ports, - int max_streams_per_circuit, - int max_streams_close_circuit, - rend_auth_type_t auth_type, - smartlist_t *auth_clients, - char **service_id_out) -{ - *service_id_out = NULL; - /* Allocate the service structure, and initialize the key, and key derived - * parameters. - */ - rend_service_t *s = tor_malloc_zero(sizeof(rend_service_t)); - s->directory = NULL; /* This indicates the service is ephemeral. */ - s->private_key = pk; - s->auth_type = auth_type; - s->clients = auth_clients; - s->ports = ports; - s->intro_period_started = time(NULL); - s->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT; - s->max_streams_per_circuit = max_streams_per_circuit; - s->max_streams_close_circuit = max_streams_close_circuit; - if (rend_service_derive_key_digests(s) < 0) { - rend_service_free(s); - return RSAE_BADPRIVKEY; - } - - if (!s->ports || smartlist_len(s->ports) == 0) { - log_warn(LD_CONFIG, "At least one VIRTPORT/TARGET must be specified."); - rend_service_free(s); - return RSAE_BADVIRTPORT; - } - if (s->auth_type != REND_NO_AUTH && - (!s->clients || smartlist_len(s->clients) == 0)) { - log_warn(LD_CONFIG, "At least one authorized client must be specified."); - rend_service_free(s); - return RSAE_BADAUTH; - } - - /* Enforcing pk/id uniqueness should be done by rend_service_load_keys(), but - * it's not, see #14828. - */ - if (rend_service_get_by_pk_digest(s->pk_digest)) { - log_warn(LD_CONFIG, "Onion Service private key collides with an " - "existing service."); - rend_service_free(s); - return RSAE_ADDREXISTS; - } - if (rend_service_get_by_service_id(s->service_id)) { - log_warn(LD_CONFIG, "Onion Service id collides with an existing service."); - rend_service_free(s); - return RSAE_ADDREXISTS; - } - - /* Initialize the service. */ - if (rend_add_service(NULL, s)) { - return RSAE_INTERNAL; - } - *service_id_out = tor_strdup(s->service_id); - - log_debug(LD_CONFIG, "Added ephemeral Onion Service: %s", s->service_id); - return RSAE_OKAY; -} - -/** Remove the ephemeral service service_id if possible. Returns 0 on - * success, and -1 on failure. - */ -int -rend_service_del_ephemeral(const char *service_id) -{ - rend_service_t *s; - if (!rend_valid_v2_service_id(service_id)) { - log_warn(LD_CONFIG, "Requested malformed Onion Service id for removal."); - return -1; - } - if ((s = rend_service_get_by_service_id(service_id)) == NULL) { - log_warn(LD_CONFIG, "Requested non-existent Onion Service id for " - "removal."); - return -1; - } - if (!rend_service_is_ephemeral(s)) { - log_warn(LD_CONFIG, "Requested non-ephemeral Onion Service for removal."); - return -1; - } - - /* Kill the intro point circuit for the Onion Service, and remove it from - * the list. Closing existing connections is the application's problem. - * - * XXX: As with the comment in rend_config_services(), a nice abstraction - * would be ideal here, but for now just duplicate the code. - */ - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - if (!circ->marked_for_close && - (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - if (oc->rend_data == NULL || - !rend_circuit_pk_digest_eq(oc, (uint8_t *) s->pk_digest)) { - continue; - } - log_debug(LD_REND, "Closing intro point %s for service %s.", - safe_str_client(extend_info_describe( - oc->build_state->chosen_exit)), - rend_data_get_address(oc->rend_data)); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } - } SMARTLIST_FOREACH_END(circ); - smartlist_remove(rend_service_list, s); - rend_service_free(s); - - log_debug(LD_CONFIG, "Removed ephemeral Onion Service: %s", service_id); - - return 0; -} - -/* There can be 1 second's delay due to second_elapsed_callback, and perhaps - * another few seconds due to blocking calls. */ -#define INTRO_CIRC_RETRY_PERIOD_SLOP 10 - -/** Log information about the intro point creation rate and current intro - * points for service, upgrading the log level from min_severity to warn if - * we have stopped launching new intro point circuits. */ -static void -rend_log_intro_limit(const rend_service_t *service, int min_severity) -{ - int exceeded_limit = (service->n_intro_circuits_launched >= - rend_max_intro_circs_per_period( - service->n_intro_points_wanted)); - int severity = min_severity; - /* We stopped creating circuits */ - if (exceeded_limit) { - severity = LOG_WARN; - } - time_t intro_period_elapsed = time(NULL) - service->intro_period_started; - tor_assert_nonfatal(intro_period_elapsed >= 0); - { - char *msg; - static ratelim_t rlimit = RATELIM_INIT(INTRO_CIRC_RETRY_PERIOD); - if ((msg = rate_limit_log(&rlimit, approx_time()))) { - log_fn(severity, LD_REND, - "Hidden service %s %s %d intro points in the last %d seconds. " - "Intro circuit launches are limited to %d per %d seconds.%s", - service->service_id, - exceeded_limit ? "exceeded launch limit with" : "launched", - service->n_intro_circuits_launched, - (int)intro_period_elapsed, - rend_max_intro_circs_per_period(service->n_intro_points_wanted), - INTRO_CIRC_RETRY_PERIOD, msg); - rend_service_dump_stats(severity); - tor_free(msg); - } - } -} - -/** Replace the old value of service-\>desc with one that reflects - * the other fields in service. - */ -static void -rend_service_update_descriptor(rend_service_t *service) -{ - rend_service_descriptor_t *d; - int i; - - rend_service_descriptor_free(service->desc); - service->desc = NULL; - - d = service->desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - d->pk = crypto_pk_dup_key(service->private_key); - d->timestamp = time(NULL); - d->timestamp -= d->timestamp % 3600; /* Round down to nearest hour */ - d->intro_nodes = smartlist_new(); - /* Support intro protocols 2 and 3. */ - d->protocols = (1 << 2) + (1 << 3); - - for (i = 0; i < smartlist_len(service->intro_nodes); ++i) { - rend_intro_point_t *intro_svc = smartlist_get(service->intro_nodes, i); - rend_intro_point_t *intro_desc; - - /* This intro point won't be listed in the descriptor... */ - intro_svc->listed_in_last_desc = 0; - - /* circuit_established is set in rend_service_intro_established(), and - * checked every second in rend_consider_services_intro_points(), so it's - * safe to use it here */ - if (!intro_svc->circuit_established) { - continue; - } - - /* ...unless this intro point is listed in the descriptor. */ - intro_svc->listed_in_last_desc = 1; - - /* We have an entirely established intro circuit. Publish it in - * our descriptor. */ - intro_desc = tor_malloc_zero(sizeof(rend_intro_point_t)); - intro_desc->extend_info = extend_info_dup(intro_svc->extend_info); - if (intro_svc->intro_key) - intro_desc->intro_key = crypto_pk_dup_key(intro_svc->intro_key); - smartlist_add(d->intro_nodes, intro_desc); - - if (intro_svc->time_published == -1) { - /* We are publishing this intro point in a descriptor for the - * first time -- note the current time in the service's copy of - * the intro point. */ - intro_svc->time_published = time(NULL); - } - } - - /* Check that we have the right number of intro points */ - unsigned int have_intro = (unsigned int)smartlist_len(d->intro_nodes); - if (have_intro != service->n_intro_points_wanted) { - int severity; - /* Getting less than we wanted or more than we're allowed is serious */ - if (have_intro < service->n_intro_points_wanted || - have_intro > NUM_INTRO_POINTS_MAX) { - severity = LOG_WARN; - } else { - /* Getting more than we wanted is weird, but less of a problem */ - severity = LOG_NOTICE; - } - log_fn(severity, LD_REND, "Hidden service %s wanted %d intro points, but " - "descriptor was updated with %d instead.", - service->service_id, - service->n_intro_points_wanted, have_intro); - /* Now log an informative message about how we might have got here. */ - rend_log_intro_limit(service, severity); - } -} - -/* Allocate and return a string containing the path to file_name in - * service->directory. Asserts that service has a directory. - * This function will never return NULL. - * The caller must free this path. */ -static char * -rend_service_path(const rend_service_t *service, const char *file_name) -{ - tor_assert(service->directory); - return hs_path_from_filename(service->directory, file_name); -} - -/* Allocate and return a string containing the path to the single onion - * service poison file in service->directory. Asserts that service has a - * directory. - * The caller must free this path. */ -STATIC char * -rend_service_sos_poison_path(const rend_service_t *service) -{ - return rend_service_path(service, sos_poison_fname); -} - -/** Return True if hidden services service has been poisoned by single - * onion mode. */ -static int -service_is_single_onion_poisoned(const rend_service_t *service) -{ - char *poison_fname = NULL; - file_status_t fstatus; - - /* Passing a NULL service is a bug */ - if (BUG(!service)) { - return 0; - } - - if (rend_service_is_ephemeral(service)) { - return 0; - } - - poison_fname = rend_service_sos_poison_path(service); - - fstatus = file_status(poison_fname); - tor_free(poison_fname); - - /* If this fname is occupied, the hidden service has been poisoned. - * fstatus can be FN_ERROR if the service directory does not exist, in that - * case, there is obviously no private key. */ - if (fstatus == FN_FILE || fstatus == FN_EMPTY) { - return 1; - } - - return 0; -} - -/* Return 1 if the private key file for service exists and has a non-zero size, - * and 0 otherwise. */ -static int -rend_service_private_key_exists(const rend_service_t *service) -{ - char *private_key_path = rend_service_path(service, private_key_fname); - const file_status_t private_key_status = file_status(private_key_path); - tor_free(private_key_path); - /* Only non-empty regular private key files could have been used before. - * fstatus can be FN_ERROR if the service directory does not exist, in that - * case, there is obviously no private key. */ - return private_key_status == FN_FILE; -} - -/** Check the single onion service poison state of the directory for s: - * - If the service is poisoned, and we are in Single Onion Mode, - * return 0, - * - If the service is not poisoned, and we are not in Single Onion Mode, - * return 0, - * - Otherwise, the poison state is invalid: the service was created in one - * mode, and is being used in the other, return -1. - * Hidden service directories without keys are always considered consistent. - * They will be poisoned after their directory is created (if needed). */ -STATIC int -rend_service_verify_single_onion_poison(const rend_service_t* s, - const or_options_t* options) -{ - /* Passing a NULL service is a bug */ - if (BUG(!s)) { - return -1; - } - - /* Ephemeral services are checked at ADD_ONION time */ - if (BUG(rend_service_is_ephemeral(s))) { - return -1; - } - - /* Service is expected to have a directory */ - if (BUG(!s->directory)) { - return -1; - } - - /* Services without keys are always ok - their keys will only ever be used - * in the current mode */ - if (!rend_service_private_key_exists(s)) { - return 0; - } - - /* The key has been used before in a different mode */ - if (service_is_single_onion_poisoned(s) != - rend_service_non_anonymous_mode_enabled(options)) { - return -1; - } - - /* The key exists and is consistent with the current mode */ - return 0; -} - -/*** Helper for rend_service_poison_new_single_onion_dir(). Add a file to - * the hidden service directory for s that marks it as a single onion service. - * Tor must be in single onion mode before calling this function, and the - * service directory must already have been created. - * Returns 0 when a directory is successfully poisoned, or if it is already - * poisoned. Returns -1 on a failure to read the directory or write the poison - * file, or if there is an existing private key file in the directory. (The - * service should have been poisoned when the key was created.) */ -static int -poison_new_single_onion_hidden_service_dir_impl(const rend_service_t *service, - const or_options_t* options) -{ - /* Passing a NULL service is a bug */ - if (BUG(!service)) { - return -1; - } - - /* We must only poison directories if we're in Single Onion mode */ - tor_assert(rend_service_non_anonymous_mode_enabled(options)); - - int fd; - int retval = -1; - char *poison_fname = NULL; - - if (rend_service_is_ephemeral(service)) { - log_info(LD_REND, "Ephemeral HS started in non-anonymous mode."); - return 0; - } - - /* Make sure we're only poisoning new hidden service directories */ - if (rend_service_private_key_exists(service)) { - log_warn(LD_BUG, "Tried to single onion poison a service directory after " - "the private key was created."); - return -1; - } - - /* Make sure the directory was created before calling this function. */ - if (BUG(hs_check_service_private_dir(options->User, service->directory, - service->dir_group_readable, 0) < 0)) - return -1; - - poison_fname = rend_service_sos_poison_path(service); - - switch (file_status(poison_fname)) { - case FN_DIR: - case FN_ERROR: - log_warn(LD_FS, "Can't read single onion poison file \"%s\"", - poison_fname); - goto done; - case FN_FILE: /* single onion poison file already exists. NOP. */ - case FN_EMPTY: /* single onion poison file already exists. NOP. */ - log_debug(LD_FS, "Tried to re-poison a single onion poisoned file \"%s\"", - poison_fname); - break; - case FN_NOENT: - fd = tor_open_cloexec(poison_fname, O_RDWR|O_CREAT|O_TRUNC, 0600); - if (fd < 0) { - log_warn(LD_FS, "Could not create single onion poison file %s", - poison_fname); - goto done; - } - close(fd); - break; - default: - tor_assert(0); - } - - retval = 0; - - done: - tor_free(poison_fname); - - return retval; -} - -/** We just got launched in Single Onion Mode. That's a non-anonymous mode for - * hidden services. If s is new, we should mark its hidden service - * directory appropriately so that it is never launched as a location-private - * hidden service. (New directories don't have private key files.) - * Return 0 on success, -1 on fail. */ -STATIC int -rend_service_poison_new_single_onion_dir(const rend_service_t *s, - const or_options_t* options) -{ - /* Passing a NULL service is a bug */ - if (BUG(!s)) { - return -1; - } - - /* We must only poison directories if we're in Single Onion mode */ - tor_assert(rend_service_non_anonymous_mode_enabled(options)); - - /* Ephemeral services aren't allowed in non-anonymous mode */ - if (BUG(rend_service_is_ephemeral(s))) { - return -1; - } - - /* Service is expected to have a directory */ - if (BUG(!s->directory)) { - return -1; - } - - if (!rend_service_private_key_exists(s)) { - if (poison_new_single_onion_hidden_service_dir_impl(s, options) - < 0) { - return -1; - } - } - - return 0; -} - -/** Load and/or generate private keys for all hidden services, possibly - * including keys for client authorization. - * If a service_list is provided, treat it as the list of hidden - * services (used in unittests). Otherwise, require that rend_service_list is - * not NULL. - * Return 0 on success, -1 on failure. */ -int -rend_service_load_all_keys(const smartlist_t *service_list) -{ - /* Use service_list for unit tests */ - const smartlist_t *s_list = rend_get_service_list(service_list); - if (BUG(!s_list)) { - return -1; - } - - SMARTLIST_FOREACH_BEGIN(s_list, rend_service_t *, s) { - if (s->private_key) - continue; - log_info(LD_REND, "Loading hidden-service keys from %s", - rend_service_escaped_dir(s)); - - if (rend_service_load_keys(s) < 0) - return -1; - } SMARTLIST_FOREACH_END(s); - - return 0; -} - -/** Add to lst every filename used by s. */ -static void -rend_service_add_filenames_to_list(smartlist_t *lst, const rend_service_t *s) -{ - tor_assert(lst); - tor_assert(s); - tor_assert(s->directory); - smartlist_add(lst, rend_service_path(s, private_key_fname)); - smartlist_add(lst, rend_service_path(s, hostname_fname)); - smartlist_add(lst, rend_service_path(s, client_keys_fname)); - smartlist_add(lst, rend_service_sos_poison_path(s)); -} - -/** Add to open_lst every filename used by a configured hidden service, - * and to stat_lst every directory used by a configured hidden - * service */ -void -rend_services_add_filenames_to_lists(smartlist_t *open_lst, - smartlist_t *stat_lst) -{ - if (!rend_service_list) - return; - SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, s) { - if (!rend_service_is_ephemeral(s)) { - rend_service_add_filenames_to_list(open_lst, s); - smartlist_add_strdup(stat_lst, s->directory); - } - } SMARTLIST_FOREACH_END(s); -} - -/** Derive all rend_service_t internal material based on the service's key. - * Returns 0 on sucess, -1 on failure. - */ -static int -rend_service_derive_key_digests(struct rend_service_t *s) -{ - if (rend_get_service_id(s->private_key, s->service_id)<0) { - log_warn(LD_BUG, "Internal error: couldn't encode service ID."); - return -1; - } - if (crypto_pk_get_digest(s->private_key, s->pk_digest)<0) { - log_warn(LD_BUG, "Couldn't compute hash of public key."); - return -1; - } - - return 0; -} - -/** Make sure that the directory for s is private, using the config in - * options. - * If create is true: - * - if the directory exists, change permissions if needed, - * - if the directory does not exist, create it with the correct permissions. - * If create is false: - * - if the directory exists, check permissions, - * - if the directory does not exist, check if we think we can create it. - * Return 0 on success, -1 on failure. */ -static int -rend_service_check_private_dir(const or_options_t *options, - const rend_service_t *s, - int create) -{ - /* Passing a NULL service is a bug */ - if (BUG(!s)) { - return -1; - } - - /* Check/create directory */ - if (hs_check_service_private_dir(options->User, s->directory, - s->dir_group_readable, create) < 0) { - return -1; - } - - /* Check if the hidden service key exists, and was created in a different - * single onion service mode, and refuse to launch if it has. - * This is safe to call even when create is false, as it ignores missing - * keys and directories: they are always valid. - */ - if (rend_service_verify_single_onion_poison(s, options) < 0) { - /* We can't use s->service_id here, as the key may not have been loaded */ - log_warn(LD_GENERAL, "We are configured with " - "HiddenServiceNonAnonymousMode %d, but the hidden " - "service key in directory %s was created in %s mode. " - "This is not allowed.", - rend_service_non_anonymous_mode_enabled(options) ? 1 : 0, - rend_service_escaped_dir(s), - rend_service_non_anonymous_mode_enabled(options) ? - "an anonymous" : "a non-anonymous" - ); - return -1; - } - - /* Poison new single onion directories immediately after they are created, - * so that we never accidentally launch non-anonymous hidden services - * thinking they are anonymous. Any keys created later will end up with the - * correct poisoning state. - */ - if (create && rend_service_non_anonymous_mode_enabled(options)) { - static int logged_warning = 0; - - if (rend_service_poison_new_single_onion_dir(s, options) < 0) { - log_warn(LD_GENERAL,"Failed to mark new hidden services as non-anonymous" - "."); - return -1; - } - - if (!logged_warning) { - /* The keys for these services are linked to the server IP address */ - log_notice(LD_REND, "The configured onion service directories have been " - "used in single onion mode. They can not be used for " - "anonymous hidden services."); - logged_warning = 1; - } - } - - return 0; -} - -/** Load and/or generate private keys for the hidden service s, - * possibly including keys for client authorization. Return 0 on success, -1 - * on failure. */ -static int -rend_service_load_keys(rend_service_t *s) -{ - char *fname = NULL; - char buf[128]; - - /* Create the directory if needed which will also poison it in case of - * single onion service. */ - if (rend_service_check_private_dir(get_options(), s, 1) < 0) - goto err; - - /* Load key */ - fname = rend_service_path(s, private_key_fname); - s->private_key = init_key_from_file(fname, 1, LOG_ERR, 0); - - if (!s->private_key) - goto err; - - if (rend_service_derive_key_digests(s) < 0) - goto err; - - tor_free(fname); - /* Create service file */ - fname = rend_service_path(s, hostname_fname); - - tor_snprintf(buf, sizeof(buf),"%s.onion\n", s->service_id); - if (write_str_to_file(fname,buf,0)<0) { - log_warn(LD_CONFIG, "Could not write onion address to hostname file."); - goto err; - } -#ifndef _WIN32 - if (s->dir_group_readable) { - /* Also verify hostname file created with group read. */ - if (chmod(fname, 0640)) - log_warn(LD_FS,"Unable to make hidden hostname file %s group-readable.", - fname); - } -#endif /* !defined(_WIN32) */ - - /* If client authorization is configured, load or generate keys. */ - if (s->auth_type != REND_NO_AUTH) { - if (rend_service_load_auth_keys(s, fname) < 0) { - goto err; - } - } - - int r = 0; - goto done; - err: - r = -1; - done: - memwipe(buf, 0, sizeof(buf)); - tor_free(fname); - return r; -} - -/** Load and/or generate client authorization keys for the hidden service - * s, which stores its hostname in hfname. Return 0 on success, - * -1 on failure. */ -static int -rend_service_load_auth_keys(rend_service_t *s, const char *hfname) -{ - int r = 0; - char *cfname = NULL; - char *client_keys_str = NULL; - strmap_t *parsed_clients = strmap_new(); - FILE *cfile, *hfile; - open_file_t *open_cfile = NULL, *open_hfile = NULL; - char desc_cook_out[3*REND_DESC_COOKIE_LEN_BASE64+1]; - char service_id[16+1]; - char buf[1500]; - - /* Load client keys and descriptor cookies, if available. */ - cfname = rend_service_path(s, client_keys_fname); - client_keys_str = read_file_to_str(cfname, RFTS_IGNORE_MISSING, NULL); - if (client_keys_str) { - if (rend_parse_client_keys(parsed_clients, client_keys_str) < 0) { - log_warn(LD_CONFIG, "Previously stored client_keys file could not " - "be parsed."); - goto err; - } else { - log_info(LD_CONFIG, "Parsed %d previously stored client entries.", - strmap_size(parsed_clients)); - } - } - - /* Prepare client_keys and hostname files. */ - if (!(cfile = start_writing_to_stdio_file(cfname, - OPEN_FLAGS_REPLACE | O_TEXT, - 0600, &open_cfile))) { - log_warn(LD_CONFIG, "Could not open client_keys file %s", - escaped(cfname)); - goto err; - } - - if (!(hfile = start_writing_to_stdio_file(hfname, - OPEN_FLAGS_REPLACE | O_TEXT, - 0600, &open_hfile))) { - log_warn(LD_CONFIG, "Could not open hostname file %s", escaped(hfname)); - goto err; - } - - /* Either use loaded keys for configured clients or generate new - * ones if a client is new. */ - SMARTLIST_FOREACH_BEGIN(s->clients, rend_authorized_client_t *, client) { - rend_authorized_client_t *parsed = - strmap_get(parsed_clients, client->client_name); - int written; - size_t len; - /* Copy descriptor cookie from parsed entry or create new one. */ - if (parsed) { - memcpy(client->descriptor_cookie, parsed->descriptor_cookie, - REND_DESC_COOKIE_LEN); - } else { - crypto_rand((char *) client->descriptor_cookie, REND_DESC_COOKIE_LEN); - } - /* For compatibility with older tor clients, this does not - * truncate the padding characters, unlike rend_auth_encode_cookie. */ - if (base64_encode(desc_cook_out, 3*REND_DESC_COOKIE_LEN_BASE64+1, - (char *) client->descriptor_cookie, - REND_DESC_COOKIE_LEN, 0) < 0) { - log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); - goto err; - } - /* Copy client key from parsed entry or create new one if required. */ - if (parsed && parsed->client_key) { - client->client_key = crypto_pk_dup_key(parsed->client_key); - } else if (s->auth_type == REND_STEALTH_AUTH) { - /* Create private key for client. */ - crypto_pk_t *prkey = NULL; - if (!(prkey = crypto_pk_new())) { - log_warn(LD_BUG,"Error constructing client key"); - goto err; - } - if (crypto_pk_generate_key(prkey)) { - log_warn(LD_BUG,"Error generating client key"); - crypto_pk_free(prkey); - goto err; - } - if (crypto_pk_check_key(prkey) <= 0) { - log_warn(LD_BUG,"Generated client key seems invalid"); - crypto_pk_free(prkey); - goto err; - } - client->client_key = prkey; - } - /* Add entry to client_keys file. */ - written = tor_snprintf(buf, sizeof(buf), - "client-name %s\ndescriptor-cookie %s\n", - client->client_name, desc_cook_out); - if (written < 0) { - log_warn(LD_BUG, "Could not write client entry."); - goto err; - } - if (client->client_key) { - char *client_key_out = NULL; - if (crypto_pk_write_private_key_to_string(client->client_key, - &client_key_out, &len) != 0) { - log_warn(LD_BUG, "Internal error: " - "crypto_pk_write_private_key_to_string() failed."); - goto err; - } - if (rend_get_service_id(client->client_key, service_id)<0) { - log_warn(LD_BUG, "Internal error: couldn't encode service ID."); - /* - * len is string length, not buffer length, but last byte is NUL - * anyway. - */ - memwipe(client_key_out, 0, len); - tor_free(client_key_out); - goto err; - } - written = tor_snprintf(buf + written, sizeof(buf) - written, - "client-key\n%s", client_key_out); - memwipe(client_key_out, 0, len); - tor_free(client_key_out); - if (written < 0) { - log_warn(LD_BUG, "Could not write client entry."); - goto err; - } - } else { - strlcpy(service_id, s->service_id, sizeof(service_id)); - } - - if (fputs(buf, cfile) < 0) { - log_warn(LD_FS, "Could not append client entry to file: %s", - strerror(errno)); - goto err; - } - - /* Add line to hostname file. This is not the same encoding as in - * client_keys. */ - char *encoded_cookie = rend_auth_encode_cookie(client->descriptor_cookie, - s->auth_type); - if (!encoded_cookie) { - log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); - goto err; - } - tor_snprintf(buf, sizeof(buf), "%s.onion %s # client: %s\n", - service_id, encoded_cookie, client->client_name); - memwipe(encoded_cookie, 0, strlen(encoded_cookie)); - tor_free(encoded_cookie); - - if (fputs(buf, hfile)<0) { - log_warn(LD_FS, "Could not append host entry to file: %s", - strerror(errno)); - goto err; - } - } SMARTLIST_FOREACH_END(client); - - finish_writing_to_file(open_cfile); - finish_writing_to_file(open_hfile); - - goto done; - err: - r = -1; - if (open_cfile) - abort_writing_to_file(open_cfile); - if (open_hfile) - abort_writing_to_file(open_hfile); - done: - if (client_keys_str) { - memwipe(client_keys_str, 0, strlen(client_keys_str)); - tor_free(client_keys_str); - } - strmap_free(parsed_clients, rend_authorized_client_free_void); - - if (cfname) { - memwipe(cfname, 0, strlen(cfname)); - tor_free(cfname); - } - - /* Clear stack buffers that held key-derived material. */ - memwipe(buf, 0, sizeof(buf)); - memwipe(desc_cook_out, 0, sizeof(desc_cook_out)); - memwipe(service_id, 0, sizeof(service_id)); - - return r; -} - -/** Return the service whose public key has a digest of digest, or - * NULL if no such service exists. - */ -static rend_service_t * -rend_service_get_by_pk_digest(const char* digest) -{ - SMARTLIST_FOREACH(rend_service_list, rend_service_t*, s, - if (tor_memeq(s->pk_digest,digest,DIGEST_LEN)) - return s); - return NULL; -} - -/** Return the service whose service id is id, or NULL if no such - * service exists. - */ -static struct rend_service_t * -rend_service_get_by_service_id(const char *id) -{ - tor_assert(strlen(id) == REND_SERVICE_ID_LEN_BASE32); - SMARTLIST_FOREACH(rend_service_list, rend_service_t*, s, { - if (tor_memeq(s->service_id, id, REND_SERVICE_ID_LEN_BASE32)) - return s; - }); - return NULL; -} - -/** Check client authorization of a given descriptor_cookie of - * length cookie_len for service. Return 1 for success - * and 0 for failure. */ -static int -rend_check_authorization(rend_service_t *service, - const char *descriptor_cookie, - size_t cookie_len) -{ - rend_authorized_client_t *auth_client = NULL; - tor_assert(service); - tor_assert(descriptor_cookie); - if (!service->clients) { - log_warn(LD_BUG, "Can't check authorization for a service that has no " - "authorized clients configured."); - return 0; - } - - if (cookie_len != REND_DESC_COOKIE_LEN) { - log_info(LD_REND, "Descriptor cookie is %lu bytes, but we expected " - "%lu bytes. Dropping cell.", - (unsigned long)cookie_len, (unsigned long)REND_DESC_COOKIE_LEN); - return 0; - } - - /* Look up client authorization by descriptor cookie. */ - SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, client, { - if (tor_memeq(client->descriptor_cookie, descriptor_cookie, - REND_DESC_COOKIE_LEN)) { - auth_client = client; - break; - } - }); - if (!auth_client) { - char descriptor_cookie_base64[3*REND_DESC_COOKIE_LEN_BASE64]; - base64_encode(descriptor_cookie_base64, sizeof(descriptor_cookie_base64), - descriptor_cookie, REND_DESC_COOKIE_LEN, 0); - log_info(LD_REND, "No authorization found for descriptor cookie '%s'! " - "Dropping cell!", - descriptor_cookie_base64); - return 0; - } - - /* Allow the request. */ - log_info(LD_REND, "Client %s authorized for service %s.", - auth_client->client_name, service->service_id); - return 1; -} - -/* Can this service make a direct connection to ei? - * It must be a single onion service, and the firewall rules must allow ei. */ -static int -rend_service_use_direct_connection(const or_options_t* options, - const extend_info_t* ei) -{ - /* We'll connect directly all reachable addresses, whether preferred or not. - * The prefer_ipv6 argument to fascist_firewall_allows_address_addr is - * ignored, because pref_only is 0. */ - return (rend_service_allow_non_anonymous_connection(options) && - fascist_firewall_allows_address_addr(&ei->addr, ei->port, - FIREWALL_OR_CONNECTION, 0, 0)); -} - -/* Like rend_service_use_direct_connection, but to a node. */ -static int -rend_service_use_direct_connection_node(const or_options_t* options, - const node_t* node) -{ - /* We'll connect directly all reachable addresses, whether preferred or not. - */ - return (rend_service_allow_non_anonymous_connection(options) && - fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0)); -} - -/****** - * Handle cells - ******/ - -/** Respond to an INTRODUCE2 cell by launching a circuit to the chosen - * rendezvous point. - */ -int -rend_service_receive_introduction(origin_circuit_t *circuit, - const uint8_t *request, - size_t request_len) -{ - /* Global status stuff */ - int status = 0, result; - const or_options_t *options = get_options(); - char *err_msg = NULL; - int err_msg_severity = LOG_WARN; - const char *stage_descr = NULL, *rend_pk_digest; - int reason = END_CIRC_REASON_TORPROTOCOL; - /* Service/circuit/key stuff we can learn before parsing */ - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - rend_service_t *service = NULL; - rend_intro_point_t *intro_point = NULL; - crypto_pk_t *intro_key = NULL; - /* Parsed cell */ - rend_intro_cell_t *parsed_req = NULL; - /* Rendezvous point */ - extend_info_t *rp = NULL; - /* XXX not handled yet */ - char buf[RELAY_PAYLOAD_SIZE]; - char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; /* Holds KH, Df, Db, Kf, Kb */ - int i; - crypto_dh_t *dh = NULL; - origin_circuit_t *launched = NULL; - crypt_path_t *cpath = NULL; - char hexcookie[9]; - int circ_needs_uptime; - time_t now = time(NULL); - time_t elapsed; - int replay; - ssize_t keylen; - - /* Do some initial validation and logging before we parse the cell */ - if (circuit->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) { - log_warn(LD_PROTOCOL, - "Got an INTRODUCE2 over a non-introduction circuit %u.", - (unsigned) circuit->base_.n_circ_id); - goto err; - } - - assert_circ_anonymity_ok(circuit, options); - tor_assert(circuit->rend_data); - /* XXX: This is version 2 specific (only one supported). */ - rend_pk_digest = (char *) rend_data_get_pk_digest(circuit->rend_data, NULL); - - /* We'll use this in a bazillion log messages */ - base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - rend_pk_digest, REND_SERVICE_ID_LEN); - - /* look up service depending on circuit. */ - service = rend_service_get_by_pk_digest(rend_pk_digest); - if (!service) { - log_warn(LD_BUG, - "Internal error: Got an INTRODUCE2 cell on an intro " - "circ for an unrecognized service %s.", - escaped(serviceid)); - goto err; - } - - intro_point = find_intro_point(circuit); - if (intro_point == NULL) { - intro_point = find_expiring_intro_point(service, circuit); - if (intro_point == NULL) { - log_warn(LD_BUG, - "Internal error: Got an INTRODUCE2 cell on an " - "intro circ (for service %s) with no corresponding " - "rend_intro_point_t.", - escaped(serviceid)); - goto err; - } - } - - log_info(LD_REND, "Received INTRODUCE2 cell for service %s on circ %u.", - escaped(serviceid), (unsigned)circuit->base_.n_circ_id); - - /* use intro key instead of service key. */ - intro_key = circuit->intro_key; - - tor_free(err_msg); - stage_descr = NULL; - - stage_descr = "early parsing"; - /* Early parsing pass (get pk, ciphertext); type 2 is INTRODUCE2 */ - parsed_req = - rend_service_begin_parse_intro(request, request_len, 2, &err_msg); - if (!parsed_req) { - goto log_error; - } else if (err_msg) { - log_info(LD_REND, "%s on circ %u.", err_msg, - (unsigned)circuit->base_.n_circ_id); - tor_free(err_msg); - } - - /* make sure service replay caches are present */ - if (!service->accepted_intro_dh_parts) { - service->accepted_intro_dh_parts = - replaycache_new(REND_REPLAY_TIME_INTERVAL, - REND_REPLAY_TIME_INTERVAL); - } - - if (!intro_point->accepted_intro_rsa_parts) { - intro_point->accepted_intro_rsa_parts = replaycache_new(0, 0); - } - - /* check for replay of PK-encrypted portion. */ - keylen = crypto_pk_keysize(intro_key); - replay = replaycache_add_test_and_elapsed( - intro_point->accepted_intro_rsa_parts, - parsed_req->ciphertext, MIN(parsed_req->ciphertext_len, keylen), - &elapsed); - - if (replay) { - log_warn(LD_REND, - "Possible replay detected! We received an " - "INTRODUCE2 cell with same PK-encrypted part %d " - "seconds ago. Dropping cell.", - (int)elapsed); - goto err; - } - - stage_descr = "decryption"; - /* Now try to decrypt it */ - result = rend_service_decrypt_intro(parsed_req, intro_key, &err_msg); - if (result < 0) { - goto log_error; - } else if (err_msg) { - log_info(LD_REND, "%s on circ %u.", err_msg, - (unsigned)circuit->base_.n_circ_id); - tor_free(err_msg); - } - - stage_descr = "late parsing"; - /* Parse the plaintext */ - result = rend_service_parse_intro_plaintext(parsed_req, &err_msg); - if (result < 0) { - goto log_error; - } else if (err_msg) { - log_info(LD_REND, "%s on circ %u.", err_msg, - (unsigned)circuit->base_.n_circ_id); - tor_free(err_msg); - } - - stage_descr = "late validation"; - /* Validate the parsed plaintext parts */ - result = rend_service_validate_intro_late(parsed_req, &err_msg); - if (result < 0) { - goto log_error; - } else if (err_msg) { - log_info(LD_REND, "%s on circ %u.", err_msg, - (unsigned)circuit->base_.n_circ_id); - tor_free(err_msg); - } - stage_descr = NULL; - - /* Increment INTRODUCE2 counter */ - ++(intro_point->accepted_introduce2_count); - - /* Find the rendezvous point */ - rp = find_rp_for_intro(parsed_req, &err_msg); - if (!rp) { - err_msg_severity = LOG_PROTOCOL_WARN; - goto log_error; - } - - /* Check if we'd refuse to talk to this router */ - if (options->StrictNodes && - routerset_contains_extendinfo(options->ExcludeNodes, rp)) { - log_warn(LD_REND, "Client asked to rendezvous at a relay that we " - "exclude, and StrictNodes is set. Refusing service."); - reason = END_CIRC_REASON_INTERNAL; /* XXX might leak why we refused */ - goto err; - } - - base16_encode(hexcookie, 9, (const char *)(parsed_req->rc), 4); - - /* Check whether there is a past request with the same Diffie-Hellman, - * part 1. */ - replay = replaycache_add_test_and_elapsed( - service->accepted_intro_dh_parts, - parsed_req->dh, DH_KEY_LEN, - &elapsed); - - if (replay) { - /* A Tor client will send a new INTRODUCE1 cell with the same rend - * cookie and DH public key as its previous one if its intro circ - * times out while in state CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT . - * If we received the first INTRODUCE1 cell (the intro-point relay - * converts it into an INTRODUCE2 cell), we are already trying to - * connect to that rend point (and may have already succeeded); - * drop this cell. */ - log_info(LD_REND, "We received an " - "INTRODUCE2 cell with same first part of " - "Diffie-Hellman handshake %d seconds ago. Dropping " - "cell.", - (int) elapsed); - goto err; - } - - /* If the service performs client authorization, check included auth data. */ - if (service->clients) { - if (parsed_req->version == 3 && parsed_req->u.v3.auth_len > 0) { - if (rend_check_authorization(service, - (const char*)parsed_req->u.v3.auth_data, - parsed_req->u.v3.auth_len)) { - log_info(LD_REND, "Authorization data in INTRODUCE2 cell are valid."); - } else { - log_info(LD_REND, "The authorization data that are contained in " - "the INTRODUCE2 cell are invalid. Dropping cell."); - reason = END_CIRC_REASON_CONNECTFAILED; - goto err; - } - } else { - log_info(LD_REND, "INTRODUCE2 cell does not contain authentication " - "data, but we require client authorization. Dropping cell."); - reason = END_CIRC_REASON_CONNECTFAILED; - goto err; - } - } - - /* Try DH handshake... */ - dh = crypto_dh_new(DH_TYPE_REND); - if (!dh || crypto_dh_generate_public(dh)<0) { - log_warn(LD_BUG,"Internal error: couldn't build DH state " - "or generate public key."); - reason = END_CIRC_REASON_INTERNAL; - goto err; - } - if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh, - (char *)(parsed_req->dh), - DH_KEY_LEN, keys, - DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) { - log_warn(LD_BUG, "Internal error: couldn't complete DH handshake"); - reason = END_CIRC_REASON_INTERNAL; - goto err; - } - - circ_needs_uptime = hs_service_requires_uptime_circ(service->ports); - - /* help predict this next time */ - rep_hist_note_used_internal(now, circ_needs_uptime, 1); - - /* Launch a circuit to the client's chosen rendezvous point. - */ - for (i=0;ibuild_state); - /* Fill in the circuit's state. */ - - launched->rend_data = - rend_data_service_create(service->service_id, rend_pk_digest, - parsed_req->rc, service->auth_type); - - launched->build_state->service_pending_final_cpath_ref = - tor_malloc_zero(sizeof(crypt_path_reference_t)); - launched->build_state->service_pending_final_cpath_ref->refcount = 1; - - launched->build_state->service_pending_final_cpath_ref->cpath = cpath = - tor_malloc_zero(sizeof(crypt_path_t)); - cpath->magic = CRYPT_PATH_MAGIC; - launched->build_state->expiry_time = now + MAX_REND_TIMEOUT; - - cpath->rend_dh_handshake_state = dh; - dh = NULL; - if (circuit_init_cpath_crypto(cpath, - keys+DIGEST_LEN, sizeof(keys)-DIGEST_LEN, - 1, 0)<0) - goto err; - memcpy(cpath->rend_circ_nonce, keys, DIGEST_LEN); - - goto done; - - log_error: - if (!err_msg) { - if (stage_descr) { - tor_asprintf(&err_msg, - "unknown %s error for INTRODUCE2", stage_descr); - } else { - err_msg = tor_strdup("unknown error for INTRODUCE2"); - } - } - - log_fn(err_msg_severity, LD_REND, "%s on circ %u", err_msg, - (unsigned)circuit->base_.n_circ_id); - err: - status = -1; - if (dh) crypto_dh_free(dh); - if (launched) { - circuit_mark_for_close(TO_CIRCUIT(launched), reason); - } - tor_free(err_msg); - - done: - memwipe(keys, 0, sizeof(keys)); - memwipe(buf, 0, sizeof(buf)); - memwipe(serviceid, 0, sizeof(serviceid)); - memwipe(hexcookie, 0, sizeof(hexcookie)); - - /* Free the parsed cell */ - rend_service_free_intro(parsed_req); - - /* Free rp */ - extend_info_free(rp); - - return status; -} - -/** Given a parsed and decrypted INTRODUCE2, find the rendezvous point or - * return NULL and an error string if we can't. Return a newly allocated - * extend_info_t* for the rendezvous point. */ -static extend_info_t * -find_rp_for_intro(const rend_intro_cell_t *intro, - char **err_msg_out) -{ - extend_info_t *rp = NULL; - char *err_msg = NULL; - const char *rp_nickname = NULL; - const node_t *node = NULL; - - if (!intro) { - if (err_msg_out) - err_msg = tor_strdup("Bad parameters to find_rp_for_intro()"); - - goto err; - } - - if (intro->version == 0 || intro->version == 1) { - rp_nickname = (const char *)(intro->u.v0_v1.rp); - - node = node_get_by_nickname(rp_nickname, NNF_NO_WARN_UNNAMED); - if (!node) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "Couldn't find router %s named in INTRODUCE2 cell", - escaped_safe_str_client(rp_nickname)); - } - - goto err; - } - - /* Are we in single onion mode? */ - const int allow_direct = rend_service_allow_non_anonymous_connection( - get_options()); - rp = extend_info_from_node(node, allow_direct); - if (!rp) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "Couldn't build extend_info_t for router %s named " - "in INTRODUCE2 cell", - escaped_safe_str_client(rp_nickname)); - } - - goto err; - } - } else if (intro->version == 2) { - rp = extend_info_dup(intro->u.v2.extend_info); - } else if (intro->version == 3) { - rp = extend_info_dup(intro->u.v3.extend_info); - } else { - if (err_msg_out) { - tor_asprintf(&err_msg, - "Unknown version %d in INTRODUCE2 cell", - (int)(intro->version)); - } - - goto err; - } - - /* rp is always set here: extend_info_dup guarantees a non-NULL result, and - * the other cases goto err. */ - tor_assert(rp); - - /* Make sure the RP we are being asked to connect to is _not_ a private - * address unless it's allowed. Let's avoid to build a circuit to our - * second middle node and fail right after when extending to the RP. */ - if (!extend_info_addr_is_allowed(&rp->addr)) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "Relay IP in INTRODUCE2 cell is private address."); - } - extend_info_free(rp); - rp = NULL; - goto err; - } - goto done; - - err: - if (err_msg_out) - *err_msg_out = err_msg; - else - tor_free(err_msg); - - done: - return rp; -} - -/** Free a parsed INTRODUCE1 or INTRODUCE2 cell that was allocated by - * rend_service_parse_intro(). - */ -void -rend_service_free_intro_(rend_intro_cell_t *request) -{ - if (!request) { - return; - } - - /* Free ciphertext */ - tor_free(request->ciphertext); - request->ciphertext_len = 0; - - /* Have plaintext? */ - if (request->plaintext) { - /* Zero it out just to be safe */ - memwipe(request->plaintext, 0, request->plaintext_len); - tor_free(request->plaintext); - request->plaintext_len = 0; - } - - /* Have parsed plaintext? */ - if (request->parsed) { - switch (request->version) { - case 0: - case 1: - /* - * Nothing more to do; these formats have no further pointers - * in them. - */ - break; - case 2: - extend_info_free(request->u.v2.extend_info); - request->u.v2.extend_info = NULL; - break; - case 3: - if (request->u.v3.auth_data) { - memwipe(request->u.v3.auth_data, 0, request->u.v3.auth_len); - tor_free(request->u.v3.auth_data); - } - - extend_info_free(request->u.v3.extend_info); - request->u.v3.extend_info = NULL; - break; - default: - log_info(LD_BUG, - "rend_service_free_intro() saw unknown protocol " - "version %d.", - request->version); - } - } - - /* Zero it out to make sure sensitive stuff doesn't hang around in memory */ - memwipe(request, 0, sizeof(*request)); - - tor_free(request); -} - -/** Parse an INTRODUCE1 or INTRODUCE2 cell into a newly allocated - * rend_intro_cell_t structure. Free it with rend_service_free_intro() - * when finished. The type parameter should be 1 or 2 to indicate whether - * this is INTRODUCE1 or INTRODUCE2. This parses only the non-encrypted - * parts; after this, call rend_service_decrypt_intro() with a key, then - * rend_service_parse_intro_plaintext() to finish parsing. The optional - * err_msg_out parameter is set to a string suitable for log output - * if parsing fails. This function does some validation, but only - * that which depends solely on the contents of the cell and the - * key; it can be unit-tested. Further validation is done in - * rend_service_validate_intro(). - */ - -rend_intro_cell_t * -rend_service_begin_parse_intro(const uint8_t *request, - size_t request_len, - uint8_t type, - char **err_msg_out) -{ - rend_intro_cell_t *rv = NULL; - char *err_msg = NULL; - - if (!request || request_len <= 0) goto err; - if (!(type == 1 || type == 2)) goto err; - - /* First, check that the cell is long enough to be a sensible INTRODUCE */ - - /* min key length plus digest length plus nickname length */ - if (request_len < - (DIGEST_LEN + REND_COOKIE_LEN + (MAX_NICKNAME_LEN + 1) + - DH_KEY_LEN + 42)) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "got a truncated INTRODUCE%d cell", - (int)type); - } - goto err; - } - - /* Allocate a new parsed cell structure */ - rv = tor_malloc_zero(sizeof(*rv)); - - /* Set the type */ - rv->type = type; - - /* Copy in the ID */ - memcpy(rv->pk, request, DIGEST_LEN); - - /* Copy in the ciphertext */ - rv->ciphertext = tor_malloc(request_len - DIGEST_LEN); - memcpy(rv->ciphertext, request + DIGEST_LEN, request_len - DIGEST_LEN); - rv->ciphertext_len = request_len - DIGEST_LEN; - - goto done; - - err: - rend_service_free_intro(rv); - rv = NULL; - - if (err_msg_out && !err_msg) { - tor_asprintf(&err_msg, - "unknown INTRODUCE%d error", - (int)type); - } - - done: - if (err_msg_out) *err_msg_out = err_msg; - else tor_free(err_msg); - - return rv; -} - -/** Parse the version-specific parts of a v0 or v1 INTRODUCE1 or INTRODUCE2 - * cell - */ - -static ssize_t -rend_service_parse_intro_for_v0_or_v1( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out) -{ - const char *rp_nickname, *endptr; - size_t nickname_field_len, ver_specific_len; - - if (intro->version == 1) { - ver_specific_len = MAX_HEX_NICKNAME_LEN + 2; - rp_nickname = ((const char *)buf) + 1; - nickname_field_len = MAX_HEX_NICKNAME_LEN + 1; - } else if (intro->version == 0) { - ver_specific_len = MAX_NICKNAME_LEN + 1; - rp_nickname = (const char *)buf; - nickname_field_len = MAX_NICKNAME_LEN + 1; - } else { - if (err_msg_out) - tor_asprintf(err_msg_out, - "rend_service_parse_intro_for_v0_or_v1() called with " - "bad version %d on INTRODUCE%d cell (this is a bug)", - intro->version, - (int)(intro->type)); - goto err; - } - - if (plaintext_len < ver_specific_len) { - if (err_msg_out) - tor_asprintf(err_msg_out, - "short plaintext of encrypted part in v1 INTRODUCE%d " - "cell (%lu bytes, needed %lu)", - (int)(intro->type), - (unsigned long)plaintext_len, - (unsigned long)ver_specific_len); - goto err; - } - - endptr = memchr(rp_nickname, 0, nickname_field_len); - if (!endptr || endptr == rp_nickname) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "couldn't find a nul-padded nickname in " - "INTRODUCE%d cell", - (int)(intro->type)); - } - goto err; - } - - if ((intro->version == 0 && - !is_legal_nickname(rp_nickname)) || - (intro->version == 1 && - !is_legal_nickname_or_hexdigest(rp_nickname))) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "bad nickname in INTRODUCE%d cell", - (int)(intro->type)); - } - goto err; - } - - memcpy(intro->u.v0_v1.rp, rp_nickname, endptr - rp_nickname + 1); - - return ver_specific_len; - - err: - return -1; -} - -/** Parse the version-specific parts of a v2 INTRODUCE1 or INTRODUCE2 cell - */ - -static ssize_t -rend_service_parse_intro_for_v2( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out) -{ - unsigned int klen; - extend_info_t *extend_info = NULL; - ssize_t ver_specific_len; - - /* - * We accept version 3 too so that the v3 parser can call this with - * an adjusted buffer for the latter part of a v3 cell, which is - * identical to a v2 cell. - */ - if (!(intro->version == 2 || - intro->version == 3)) { - if (err_msg_out) - tor_asprintf(err_msg_out, - "rend_service_parse_intro_for_v2() called with " - "bad version %d on INTRODUCE%d cell (this is a bug)", - intro->version, - (int)(intro->type)); - goto err; - } - - /* 7 == version, IP and port, DIGEST_LEN == id, 2 == key length */ - if (plaintext_len < 7 + DIGEST_LEN + 2) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "truncated plaintext of encrypted parted of " - "version %d INTRODUCE%d cell", - intro->version, - (int)(intro->type)); - } - - goto err; - } - - extend_info = tor_malloc_zero(sizeof(extend_info_t)); - tor_addr_from_ipv4n(&extend_info->addr, get_uint32(buf + 1)); - extend_info->port = ntohs(get_uint16(buf + 5)); - memcpy(extend_info->identity_digest, buf + 7, DIGEST_LEN); - extend_info->nickname[0] = '$'; - base16_encode(extend_info->nickname + 1, sizeof(extend_info->nickname) - 1, - extend_info->identity_digest, DIGEST_LEN); - klen = ntohs(get_uint16(buf + 7 + DIGEST_LEN)); - - /* 7 == version, IP and port, DIGEST_LEN == id, 2 == key length */ - if (plaintext_len < 7 + DIGEST_LEN + 2 + klen) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "truncated plaintext of encrypted parted of " - "version %d INTRODUCE%d cell", - intro->version, - (int)(intro->type)); - } - - goto err; - } - - extend_info->onion_key = - crypto_pk_asn1_decode((const char *)(buf + 7 + DIGEST_LEN + 2), klen); - if (!extend_info->onion_key) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "error decoding onion key in version %d " - "INTRODUCE%d cell", - intro->version, - (intro->type)); - } - - goto err; - } - if (128 != crypto_pk_keysize(extend_info->onion_key)) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "invalid onion key size in version %d INTRODUCE%d cell", - intro->version, - (intro->type)); - } - - goto err; - } - - ver_specific_len = 7+DIGEST_LEN+2+klen; - - if (intro->version == 2) intro->u.v2.extend_info = extend_info; - else intro->u.v3.extend_info = extend_info; - - return ver_specific_len; - - err: - extend_info_free(extend_info); - - return -1; -} - -/** Parse the version-specific parts of a v3 INTRODUCE1 or INTRODUCE2 cell - */ - -static ssize_t -rend_service_parse_intro_for_v3( - rend_intro_cell_t *intro, - const uint8_t *buf, - size_t plaintext_len, - char **err_msg_out) -{ - ssize_t adjust, v2_ver_specific_len, ts_offset; - - /* This should only be called on v3 cells */ - if (intro->version != 3) { - if (err_msg_out) - tor_asprintf(err_msg_out, - "rend_service_parse_intro_for_v3() called with " - "bad version %d on INTRODUCE%d cell (this is a bug)", - intro->version, - (int)(intro->type)); - goto err; - } - - /* - * Check that we have at least enough to get auth_len: - * - * 1 octet for version, 1 for auth_type, 2 for auth_len - */ - if (plaintext_len < 4) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "truncated plaintext of encrypted parted of " - "version %d INTRODUCE%d cell", - intro->version, - (int)(intro->type)); - } - - goto err; - } - - /* - * The rend_client_send_introduction() function over in rendclient.c is - * broken (i.e., fails to match the spec) in such a way that we can't - * change it without breaking the protocol. Specifically, it doesn't - * emit auth_len when auth-type is REND_NO_AUTH, so everything is off - * by two bytes after that. Calculate ts_offset and do everything from - * the timestamp on relative to that to handle this dain bramage. - */ - - intro->u.v3.auth_type = buf[1]; - if (intro->u.v3.auth_type != REND_NO_AUTH) { - intro->u.v3.auth_len = ntohs(get_uint16(buf + 2)); - ts_offset = 4 + intro->u.v3.auth_len; - } else { - intro->u.v3.auth_len = 0; - ts_offset = 2; - } - - /* Check that auth len makes sense for this auth type */ - if (intro->u.v3.auth_type == REND_BASIC_AUTH || - intro->u.v3.auth_type == REND_STEALTH_AUTH) { - if (intro->u.v3.auth_len != REND_DESC_COOKIE_LEN) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "wrong auth data size %d for INTRODUCE%d cell, " - "should be %d", - (int)(intro->u.v3.auth_len), - (int)(intro->type), - REND_DESC_COOKIE_LEN); - } - - goto err; - } - } - - /* Check that we actually have everything up through the timestamp */ - if (plaintext_len < (size_t)(ts_offset)+4) { - if (err_msg_out) { - tor_asprintf(err_msg_out, - "truncated plaintext of encrypted parted of " - "version %d INTRODUCE%d cell", - intro->version, - (int)(intro->type)); - } - - goto err; - } - - if (intro->u.v3.auth_type != REND_NO_AUTH && - intro->u.v3.auth_len > 0) { - /* Okay, we can go ahead and copy auth_data */ - intro->u.v3.auth_data = tor_malloc(intro->u.v3.auth_len); - /* - * We know we had an auth_len field in this case, so 4 is - * always right. - */ - memcpy(intro->u.v3.auth_data, buf + 4, intro->u.v3.auth_len); - } - - /* - * From here on, the format is as in v2, so we call the v2 parser with - * adjusted buffer and length. We are 4 + ts_offset octets in, but the - * v2 parser expects to skip over a version byte at the start, so we - * adjust by 3 + ts_offset. - */ - adjust = 3 + ts_offset; - - v2_ver_specific_len = - rend_service_parse_intro_for_v2(intro, - buf + adjust, plaintext_len - adjust, - err_msg_out); - - /* Success in v2 parser */ - if (v2_ver_specific_len >= 0) return v2_ver_specific_len + adjust; - /* Failure in v2 parser; it will have provided an err_msg */ - else return v2_ver_specific_len; - - err: - return -1; -} - -/** Table of parser functions for version-specific parts of an INTRODUCE2 - * cell. - */ - -static ssize_t - (*intro_version_handlers[])( - rend_intro_cell_t *, - const uint8_t *, - size_t, - char **) = -{ rend_service_parse_intro_for_v0_or_v1, - rend_service_parse_intro_for_v0_or_v1, - rend_service_parse_intro_for_v2, - rend_service_parse_intro_for_v3 }; - -/** Decrypt the encrypted part of an INTRODUCE1 or INTRODUCE2 cell, - * return 0 if successful, or < 0 and write an error message to - * *err_msg_out if provided. - */ - -int -rend_service_decrypt_intro( - rend_intro_cell_t *intro, - crypto_pk_t *key, - char **err_msg_out) -{ - char *err_msg = NULL; - uint8_t key_digest[DIGEST_LEN]; - char service_id[REND_SERVICE_ID_LEN_BASE32+1]; - ssize_t key_len; - uint8_t buf[RELAY_PAYLOAD_SIZE]; - int result, status = -1; - - if (!intro || !key) { - if (err_msg_out) { - err_msg = - tor_strdup("rend_service_decrypt_intro() called with bad " - "parameters"); - } - - status = -2; - goto err; - } - - /* Make sure we have ciphertext */ - if (!(intro->ciphertext) || intro->ciphertext_len <= 0) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "rend_intro_cell_t was missing ciphertext for " - "INTRODUCE%d cell", - (int)(intro->type)); - } - status = -3; - goto err; - } - - /* Check that this cell actually matches this service key */ - - /* first DIGEST_LEN bytes of request is intro or service pk digest */ - if (crypto_pk_get_digest(key, (char *)key_digest) < 0) { - if (err_msg_out) - *err_msg_out = tor_strdup("Couldn't compute RSA digest."); - log_warn(LD_BUG, "Couldn't compute key digest."); - status = -7; - goto err; - } - - if (tor_memneq(key_digest, intro->pk, DIGEST_LEN)) { - if (err_msg_out) { - base32_encode(service_id, REND_SERVICE_ID_LEN_BASE32 + 1, - (char*)(intro->pk), REND_SERVICE_ID_LEN); - tor_asprintf(&err_msg, - "got an INTRODUCE%d cell for the wrong service (%s)", - (int)(intro->type), - escaped(service_id)); - } - - status = -4; - goto err; - } - - /* Make sure the encrypted part is long enough to decrypt */ - - key_len = crypto_pk_keysize(key); - if (intro->ciphertext_len < key_len) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "got an INTRODUCE%d cell with a truncated PK-encrypted " - "part", - (int)(intro->type)); - } - - status = -5; - goto err; - } - - /* Decrypt the encrypted part */ - result = - crypto_pk_obsolete_private_hybrid_decrypt( - key, (char *)buf, sizeof(buf), - (const char *)(intro->ciphertext), intro->ciphertext_len, - PK_PKCS1_OAEP_PADDING, 1); - if (result < 0) { - if (err_msg_out) { - tor_asprintf(&err_msg, - "couldn't decrypt INTRODUCE%d cell", - (int)(intro->type)); - } - status = -6; - goto err; - } - intro->plaintext_len = result; - intro->plaintext = tor_malloc(intro->plaintext_len); - memcpy(intro->plaintext, buf, intro->plaintext_len); - - status = 0; - - goto done; - - err: - if (err_msg_out && !err_msg) { - tor_asprintf(&err_msg, - "unknown INTRODUCE%d error decrypting encrypted part", - intro ? (int)(intro->type) : -1); - } - - done: - if (err_msg_out) *err_msg_out = err_msg; - else tor_free(err_msg); - - /* clean up potentially sensitive material */ - memwipe(buf, 0, sizeof(buf)); - memwipe(key_digest, 0, sizeof(key_digest)); - memwipe(service_id, 0, sizeof(service_id)); - - return status; -} - -/** Parse the plaintext of the encrypted part of an INTRODUCE1 or - * INTRODUCE2 cell, return 0 if successful, or < 0 and write an error - * message to *err_msg_out if provided. - */ - -int -rend_service_parse_intro_plaintext( - rend_intro_cell_t *intro, - char **err_msg_out) -{ - char *err_msg = NULL; - ssize_t ver_specific_len, ver_invariant_len; - uint8_t version; - int status = -1; - - if (!intro) { - if (err_msg_out) { - err_msg = - tor_strdup("rend_service_parse_intro_plaintext() called with NULL " - "rend_intro_cell_t"); - } - - status = -2; - goto err; - } - - /* Check that we have plaintext */ - if (!(intro->plaintext) || intro->plaintext_len <= 0) { - if (err_msg_out) { - err_msg = tor_strdup("rend_intro_cell_t was missing plaintext"); - } - status = -3; - goto err; - } - - /* In all formats except v0, the first byte is a version number */ - version = intro->plaintext[0]; - - /* v0 has no version byte (stupid...), so handle it as a fallback */ - if (version > 3) version = 0; - - /* Copy the version into the parsed cell structure */ - intro->version = version; - - /* Call the version-specific parser from the table */ - ver_specific_len = - intro_version_handlers[version](intro, - intro->plaintext, intro->plaintext_len, - &err_msg); - if (ver_specific_len < 0) { - status = -4; - goto err; - } - - /** The rendezvous cookie and Diffie-Hellman stuff are version-invariant - * and at the end of the plaintext of the encrypted part of the cell. - */ - - ver_invariant_len = intro->plaintext_len - ver_specific_len; - if (ver_invariant_len < REND_COOKIE_LEN + DH_KEY_LEN) { - tor_asprintf(&err_msg, - "decrypted plaintext of INTRODUCE%d cell was truncated (%ld bytes)", - (int)(intro->type), - (long)(intro->plaintext_len)); - status = -5; - goto err; - } else if (ver_invariant_len > REND_COOKIE_LEN + DH_KEY_LEN) { - tor_asprintf(&err_msg, - "decrypted plaintext of INTRODUCE%d cell was too long (%ld bytes)", - (int)(intro->type), - (long)(intro->plaintext_len)); - status = -6; - goto err; - } else { - memcpy(intro->rc, - intro->plaintext + ver_specific_len, - REND_COOKIE_LEN); - memcpy(intro->dh, - intro->plaintext + ver_specific_len + REND_COOKIE_LEN, - DH_KEY_LEN); - } - - /* Flag it as being fully parsed */ - intro->parsed = 1; - - status = 0; - goto done; - - err: - if (err_msg_out && !err_msg) { - tor_asprintf(&err_msg, - "unknown INTRODUCE%d error parsing encrypted part", - intro ? (int)(intro->type) : -1); - } - - done: - if (err_msg_out) *err_msg_out = err_msg; - else tor_free(err_msg); - - return status; -} - -/** Do validity checks on a parsed intro cell after decryption; some of - * these are not done in rend_service_parse_intro_plaintext() itself because - * they depend on a lot of other state and would make it hard to unit test. - * Returns >= 0 if successful or < 0 if the intro cell is invalid, and - * optionally writes out an error message for logging. If an err_msg - * pointer is provided, it is the caller's responsibility to free any - * provided message. - */ - -int -rend_service_validate_intro_late(const rend_intro_cell_t *intro, - char **err_msg_out) -{ - int status = 0; - - if (!intro) { - if (err_msg_out) - *err_msg_out = - tor_strdup("NULL intro cell passed to " - "rend_service_validate_intro_late()"); - - status = -1; - goto err; - } - - if (intro->version == 3 && intro->parsed) { - if (!(intro->u.v3.auth_type == REND_NO_AUTH || - intro->u.v3.auth_type == REND_BASIC_AUTH || - intro->u.v3.auth_type == REND_STEALTH_AUTH)) { - /* This is an informative message, not an error, as in the old code */ - if (err_msg_out) - tor_asprintf(err_msg_out, - "unknown authorization type %d", - intro->u.v3.auth_type); - } - } - - err: - return status; -} - -/** Called when we fail building a rendezvous circuit at some point other - * than the last hop: launches a new circuit to the same rendezvous point. - */ -void -rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc) -{ - origin_circuit_t *newcirc; - cpath_build_state_t *newstate, *oldstate; - - tor_assert(oldcirc->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - - oldstate = oldcirc->build_state; - tor_assert(oldstate); - - if (oldstate->service_pending_final_cpath_ref == NULL) { - log_info(LD_REND,"Skipping relaunch of circ that failed on its first hop. " - "Initiator will retry."); - return; - } - - log_info(LD_REND,"Reattempting rendezvous circuit to '%s'", - safe_str(extend_info_describe(oldstate->chosen_exit))); - - /* You'd think Single Onion Services would want to retry the rendezvous - * using a direct connection. But if it's blocked by a firewall, or the - * service is IPv6-only, or the rend point avoiding becoming a one-hop - * proxy, we need a 3-hop connection. */ - newcirc = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, - oldstate->chosen_exit, - CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); - - if (!newcirc) { - log_warn(LD_REND,"Couldn't relaunch rendezvous circuit to '%s'.", - safe_str(extend_info_describe(oldstate->chosen_exit))); - return; - } - newstate = newcirc->build_state; - tor_assert(newstate); - newstate->failure_count = oldstate->failure_count+1; - newstate->expiry_time = oldstate->expiry_time; - newstate->service_pending_final_cpath_ref = - oldstate->service_pending_final_cpath_ref; - ++(newstate->service_pending_final_cpath_ref->refcount); - - newcirc->rend_data = rend_data_dup(oldcirc->rend_data); -} - -/** Launch a circuit to serve as an introduction point for the service - * service at the introduction point nickname - */ -static int -rend_service_launch_establish_intro(rend_service_t *service, - rend_intro_point_t *intro) -{ - origin_circuit_t *launched; - int flags = CIRCLAUNCH_NEED_UPTIME|CIRCLAUNCH_IS_INTERNAL; - const or_options_t *options = get_options(); - extend_info_t *launch_ei = intro->extend_info; - extend_info_t *direct_ei = NULL; - - /* Are we in single onion mode? */ - if (rend_service_allow_non_anonymous_connection(options)) { - /* Do we have a descriptor for the node? - * We've either just chosen it from the consensus, or we've just reviewed - * our intro points to see which ones are still valid, and deleted the ones - * that aren't in the consensus any more. */ - const node_t *node = node_get_by_id(launch_ei->identity_digest); - if (BUG(!node)) { - /* The service has kept an intro point after it went missing from the - * consensus. If we did anything else here, it would be a consensus - * distinguisher. Which are less of an issue for single onion services, - * but still a bug. */ - return -1; - } - /* Can we connect to the node directly? If so, replace launch_ei - * (a multi-hop extend_info) with one suitable for direct connection. */ - if (rend_service_use_direct_connection_node(options, node)) { - direct_ei = extend_info_from_node(node, 1); - if (BUG(!direct_ei)) { - /* rend_service_use_direct_connection_node and extend_info_from_node - * disagree about which addresses on this node are permitted. This - * should never happen. Avoiding the connection is a safe response. */ - return -1; - } - flags = flags | CIRCLAUNCH_ONEHOP_TUNNEL; - launch_ei = direct_ei; - } - } - /* launch_ei is either intro->extend_info, or has been replaced with a valid - * extend_info for single onion service direct connection. */ - tor_assert(launch_ei); - /* We must have the same intro when making a direct connection. */ - tor_assert(tor_memeq(intro->extend_info->identity_digest, - launch_ei->identity_digest, - DIGEST_LEN)); - - log_info(LD_REND, - "Launching circuit to introduction point %s%s%s for service %s", - safe_str_client(extend_info_describe(intro->extend_info)), - direct_ei ? " via direct address " : "", - direct_ei ? safe_str_client(extend_info_describe(direct_ei)) : "", - service->service_id); - - rep_hist_note_used_internal(time(NULL), 1, 0); - - ++service->n_intro_circuits_launched; - launched = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, - launch_ei, flags); - - if (!launched) { - log_info(LD_REND, - "Can't launch circuit to establish introduction at %s%s%s.", - safe_str_client(extend_info_describe(intro->extend_info)), - direct_ei ? " via direct address " : "", - direct_ei ? safe_str_client(extend_info_describe(direct_ei)) : "" - ); - extend_info_free(direct_ei); - return -1; - } - /* We must have the same exit node even if cannibalized or direct connection. - */ - tor_assert(tor_memeq(intro->extend_info->identity_digest, - launched->build_state->chosen_exit->identity_digest, - DIGEST_LEN)); - - launched->rend_data = rend_data_service_create(service->service_id, - service->pk_digest, NULL, - service->auth_type); - launched->intro_key = crypto_pk_dup_key(intro->intro_key); - if (launched->base_.state == CIRCUIT_STATE_OPEN) - rend_service_intro_has_opened(launched); - extend_info_free(direct_ei); - return 0; -} - -/** Return the number of introduction points that are established for the - * given service. */ -static unsigned int -count_established_intro_points(const rend_service_t *service) -{ - unsigned int num = 0; - - SMARTLIST_FOREACH(service->intro_nodes, rend_intro_point_t *, intro, - num += intro->circuit_established - ); - return num; -} - -/** Return the number of introduction points that are or are being - * established for the given service. This function iterates over all - * circuit and count those that are linked to the service and are waiting - * for the intro point to respond. */ -static unsigned int -count_intro_point_circuits(const rend_service_t *service) -{ - unsigned int num_ipos = 0; - SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { - if (!circ->marked_for_close && - circ->state == CIRCUIT_STATE_OPEN && - (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) { - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - if (oc->rend_data && - rend_circuit_pk_digest_eq(oc, (uint8_t *) service->pk_digest)) { - num_ipos++; - } - } - } - SMARTLIST_FOREACH_END(circ); - return num_ipos; -} - -/* Given a buffer of at least RELAY_PAYLOAD_SIZE bytes in cell_body_out, - write the body of a legacy ESTABLISH_INTRO cell in it. Use intro_key - as the intro point auth key, and rend_circ_nonce as the circuit - crypto material. On success, fill cell_body_out and return the number - of bytes written. On fail, return -1. - */ -ssize_t -rend_service_encode_establish_intro_cell(char *cell_body_out, - size_t cell_body_out_len, - crypto_pk_t *intro_key, - const char *rend_circ_nonce) -{ - int retval = -1; - int r; - int len = 0; - char auth[DIGEST_LEN + 9]; - - tor_assert(intro_key); - tor_assert(rend_circ_nonce); - - /* Build the payload for a RELAY_ESTABLISH_INTRO cell. */ - r = crypto_pk_asn1_encode(intro_key, cell_body_out+2, - RELAY_PAYLOAD_SIZE-2); - if (r < 0) { - log_warn(LD_BUG, "Internal error; failed to establish intro point."); - goto err; - } - len = r; - set_uint16(cell_body_out, htons((uint16_t)len)); - len += 2; - memcpy(auth, rend_circ_nonce, DIGEST_LEN); - memcpy(auth+DIGEST_LEN, "INTRODUCE", 9); - if (crypto_digest(cell_body_out+len, auth, DIGEST_LEN+9)) - goto err; - len += 20; - r = crypto_pk_private_sign_digest(intro_key, cell_body_out+len, - cell_body_out_len - len, - cell_body_out, len); - if (r<0) { - log_warn(LD_BUG, "Internal error: couldn't sign introduction request."); - goto err; - } - len += r; - - retval = len; - - err: - memwipe(auth, 0, sizeof(auth)); - - return retval; -} - -/** Called when we're done building a circuit to an introduction point: - * sends a RELAY_ESTABLISH_INTRO cell. - */ -void -rend_service_intro_has_opened(origin_circuit_t *circuit) -{ - rend_service_t *service; - char buf[RELAY_PAYLOAD_SIZE]; - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - unsigned int expiring_nodes_len, num_ip_circuits, valid_ip_circuits = 0; - int reason = END_CIRC_REASON_TORPROTOCOL; - const char *rend_pk_digest; - - tor_assert(circuit->base_.purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); - assert_circ_anonymity_ok(circuit, get_options()); - tor_assert(circuit->cpath); - tor_assert(circuit->rend_data); - /* XXX: This is version 2 specific (only on supported). */ - rend_pk_digest = (char *) rend_data_get_pk_digest(circuit->rend_data, NULL); - - base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - rend_pk_digest, REND_SERVICE_ID_LEN); - - service = rend_service_get_by_pk_digest(rend_pk_digest); - if (!service) { - log_warn(LD_REND, "Unrecognized service ID %s on introduction circuit %u.", - safe_str_client(serviceid), (unsigned)circuit->base_.n_circ_id); - reason = END_CIRC_REASON_NOSUCHSERVICE; - goto err; - } - - /* Take the current amount of expiring nodes and the current amount of IP - * circuits and compute how many valid IP circuits we have. */ - expiring_nodes_len = (unsigned int) smartlist_len(service->expiring_nodes); - num_ip_circuits = count_intro_point_circuits(service); - /* Let's avoid an underflow. The valid_ip_circuits is initialized to 0 in - * case this condition turns out false because it means that all circuits - * are expiring so we need to keep this circuit. */ - if (num_ip_circuits > expiring_nodes_len) { - valid_ip_circuits = num_ip_circuits - expiring_nodes_len; - } - - /* If we already have enough introduction circuits for this service, - * redefine this one as a general circuit or close it, depending. - * Substract the amount of expiring nodes here because the circuits are - * still opened. */ - if (valid_ip_circuits > service->n_intro_points_wanted) { - const or_options_t *options = get_options(); - /* Remove the intro point associated with this circuit, it's being - * repurposed or closed thus cleanup memory. */ - rend_intro_point_t *intro = find_intro_point(circuit); - if (intro != NULL) { - smartlist_remove(service->intro_nodes, intro); - rend_intro_point_free(intro); - } - - if (options->ExcludeNodes) { - /* XXXX in some future version, we can test whether the transition is - allowed or not given the actual nodes in the circuit. But for now, - this case, we might as well close the thing. */ - log_info(LD_CIRC|LD_REND, "We have just finished an introduction " - "circuit, but we already have enough. Closing it."); - reason = END_CIRC_REASON_NONE; - goto err; - } else { - tor_assert(circuit->build_state->is_internal); - log_info(LD_CIRC|LD_REND, "We have just finished an introduction " - "circuit, but we already have enough. Redefining purpose to " - "general; leaving as internal."); - - circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_C_GENERAL); - - { - rend_data_free(circuit->rend_data); - circuit->rend_data = NULL; - } - { - crypto_pk_t *intro_key = circuit->intro_key; - circuit->intro_key = NULL; - crypto_pk_free(intro_key); - } - - circuit_has_opened(circuit); - goto done; - } - } - - log_info(LD_REND, - "Established circuit %u as introduction point for service %s", - (unsigned)circuit->base_.n_circ_id, serviceid); - circuit_log_path(LOG_INFO, LD_REND, circuit); - - /* Send the ESTABLISH_INTRO cell */ - { - ssize_t len; - len = rend_service_encode_establish_intro_cell(buf, sizeof(buf), - circuit->intro_key, - circuit->cpath->prev->rend_circ_nonce); - if (len < 0) { - reason = END_CIRC_REASON_INTERNAL; - goto err; - } - - if (relay_send_command_from_edge(0, TO_CIRCUIT(circuit), - RELAY_COMMAND_ESTABLISH_INTRO, - buf, len, circuit->cpath->prev)<0) { - log_info(LD_GENERAL, - "Couldn't send introduction request for service %s on circuit %u", - serviceid, (unsigned)circuit->base_.n_circ_id); - goto done; - } - } - - /* We've attempted to use this circuit */ - pathbias_count_use_attempt(circuit); - - goto done; - - err: - circuit_mark_for_close(TO_CIRCUIT(circuit), reason); - done: - memwipe(buf, 0, sizeof(buf)); - memwipe(serviceid, 0, sizeof(serviceid)); - - return; -} - -/** Called when we get an INTRO_ESTABLISHED cell; mark the circuit as a - * live introduction point, and note that the service descriptor is - * now out-of-date. */ -int -rend_service_intro_established(origin_circuit_t *circuit, - const uint8_t *request, - size_t request_len) -{ - rend_service_t *service; - rend_intro_point_t *intro; - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - (void) request; - (void) request_len; - tor_assert(circuit->rend_data); - /* XXX: This is version 2 specific (only supported one for now). */ - const char *rend_pk_digest = - (char *) rend_data_get_pk_digest(circuit->rend_data, NULL); - - if (circuit->base_.purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) { - log_warn(LD_PROTOCOL, - "received INTRO_ESTABLISHED cell on non-intro circuit."); - goto err; - } - service = rend_service_get_by_pk_digest(rend_pk_digest); - if (!service) { - log_warn(LD_REND, "Unknown service on introduction circuit %u.", - (unsigned)circuit->base_.n_circ_id); - goto err; - } - base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32 + 1, - rend_pk_digest, REND_SERVICE_ID_LEN); - /* We've just successfully established a intro circuit to one of our - * introduction point, account for it. */ - intro = find_intro_point(circuit); - if (intro == NULL) { - log_warn(LD_REND, - "Introduction circuit established without a rend_intro_point_t " - "object for service %s on circuit %u", - safe_str_client(serviceid), (unsigned)circuit->base_.n_circ_id); - goto err; - } - intro->circuit_established = 1; - /* We might not have every introduction point ready but at this point we - * know that the descriptor needs to be uploaded. */ - service->desc_is_dirty = time(NULL); - circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_S_INTRO); - - log_info(LD_REND, - "Received INTRO_ESTABLISHED cell on circuit %u for service %s", - (unsigned)circuit->base_.n_circ_id, serviceid); - - /* Getting a valid INTRODUCE_ESTABLISHED means we've successfully - * used the circ */ - pathbias_mark_use_success(circuit); - - return 0; - err: - circuit_mark_for_close(TO_CIRCUIT(circuit), END_CIRC_REASON_TORPROTOCOL); - return -1; -} - -/** Called once a circuit to a rendezvous point is established: sends a - * RELAY_COMMAND_RENDEZVOUS1 cell. - */ -void -rend_service_rendezvous_has_opened(origin_circuit_t *circuit) -{ - rend_service_t *service; - char buf[RELAY_PAYLOAD_SIZE]; - crypt_path_t *hop; - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - char hexcookie[9]; - int reason; - const char *rend_cookie, *rend_pk_digest; - - tor_assert(circuit->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); - tor_assert(circuit->cpath); - tor_assert(circuit->build_state); - assert_circ_anonymity_ok(circuit, get_options()); - tor_assert(circuit->rend_data); - - /* XXX: This is version 2 specific (only one supported). */ - rend_pk_digest = (char *) rend_data_get_pk_digest(circuit->rend_data, - NULL); - rend_cookie = circuit->rend_data->rend_cookie; - - /* Declare the circuit dirty to avoid reuse, and for path-bias. We set the - * timestamp regardless of its content because that circuit could have been - * cannibalized so in any cases, we are about to use that circuit more. */ - circuit->base_.timestamp_dirty = time(NULL); - - /* This may be redundant */ - pathbias_count_use_attempt(circuit); - - hop = circuit->build_state->service_pending_final_cpath_ref->cpath; - - base16_encode(hexcookie,9, rend_cookie,4); - base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - rend_pk_digest, REND_SERVICE_ID_LEN); - - log_info(LD_REND, - "Done building circuit %u to rendezvous with " - "cookie %s for service %s", - (unsigned)circuit->base_.n_circ_id, hexcookie, serviceid); - circuit_log_path(LOG_INFO, LD_REND, circuit); - - /* Clear the 'in-progress HS circ has timed out' flag for - * consistency with what happens on the client side; this line has - * no effect on Tor's behaviour. */ - circuit->hs_circ_has_timed_out = 0; - - /* If hop is NULL, another rend circ has already connected to this - * rend point. Close this circ. */ - if (hop == NULL) { - log_info(LD_REND, "Another rend circ has already reached this rend point; " - "closing this rend circ."); - reason = END_CIRC_REASON_NONE; - goto err; - } - - /* Remove our final cpath element from the reference, so that no - * other circuit will try to use it. Store it in - * pending_final_cpath for now to ensure that it will be freed if - * our rendezvous attempt fails. */ - circuit->build_state->pending_final_cpath = hop; - circuit->build_state->service_pending_final_cpath_ref->cpath = NULL; - - service = rend_service_get_by_pk_digest(rend_pk_digest); - if (!service) { - log_warn(LD_GENERAL, "Internal error: unrecognized service ID on " - "rendezvous circuit."); - reason = END_CIRC_REASON_INTERNAL; - goto err; - } - - /* All we need to do is send a RELAY_RENDEZVOUS1 cell... */ - memcpy(buf, rend_cookie, REND_COOKIE_LEN); - if (crypto_dh_get_public(hop->rend_dh_handshake_state, - buf+REND_COOKIE_LEN, DH_KEY_LEN)<0) { - log_warn(LD_GENERAL,"Couldn't get DH public key."); - reason = END_CIRC_REASON_INTERNAL; - goto err; - } - memcpy(buf+REND_COOKIE_LEN+DH_KEY_LEN, hop->rend_circ_nonce, - DIGEST_LEN); - - /* Send the cell */ - if (relay_send_command_from_edge(0, TO_CIRCUIT(circuit), - RELAY_COMMAND_RENDEZVOUS1, - buf, HS_LEGACY_RENDEZVOUS_CELL_SIZE, - circuit->cpath->prev)<0) { - log_warn(LD_GENERAL, "Couldn't send RENDEZVOUS1 cell."); - goto done; - } - - crypto_dh_free(hop->rend_dh_handshake_state); - hop->rend_dh_handshake_state = NULL; - - /* Append the cpath entry. */ - hop->state = CPATH_STATE_OPEN; - /* set the windows to default. these are the windows - * that the service thinks the client has. - */ - hop->package_window = circuit_initial_package_window(); - hop->deliver_window = CIRCWINDOW_START; - - onion_append_to_cpath(&circuit->cpath, hop); - circuit->build_state->pending_final_cpath = NULL; /* prevent double-free */ - - /* Change the circuit purpose. */ - circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_S_REND_JOINED); - - goto done; - - err: - circuit_mark_for_close(TO_CIRCUIT(circuit), reason); - done: - memwipe(buf, 0, sizeof(buf)); - memwipe(serviceid, 0, sizeof(serviceid)); - memwipe(hexcookie, 0, sizeof(hexcookie)); - - return; -} - -/* - * Manage introduction points - */ - -/** Return the (possibly non-open) introduction circuit ending at - * intro for the service whose public key is pk_digest. - * (desc_version is ignored). Return NULL if no such service is - * found. - */ -static origin_circuit_t * -find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest) -{ - origin_circuit_t *circ = NULL; - - tor_assert(intro); - while ((circ = circuit_get_next_by_pk_and_purpose(circ, - (uint8_t *) pk_digest, CIRCUIT_PURPOSE_S_INTRO))) { - if (tor_memeq(circ->build_state->chosen_exit->identity_digest, - intro->extend_info->identity_digest, DIGEST_LEN) && - circ->rend_data) { - return circ; - } - } - - circ = NULL; - while ((circ = circuit_get_next_by_pk_and_purpose(circ, - (uint8_t *) pk_digest, - CIRCUIT_PURPOSE_S_ESTABLISH_INTRO))) { - if (tor_memeq(circ->build_state->chosen_exit->identity_digest, - intro->extend_info->identity_digest, DIGEST_LEN) && - circ->rend_data) { - return circ; - } - } - return NULL; -} - -/** Return the corresponding introdution point using the circuit circ - * found in the service. NULL is returned if not found. */ -static rend_intro_point_t * -find_expiring_intro_point(rend_service_t *service, origin_circuit_t *circ) -{ - tor_assert(service); - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO); - - SMARTLIST_FOREACH(service->expiring_nodes, rend_intro_point_t *, - intro_point, - if (crypto_pk_eq_keys(intro_point->intro_key, circ->intro_key)) { - return intro_point; - }); - - return NULL; -} - -/** Return a pointer to the rend_intro_point_t corresponding to the - * service-side introduction circuit circ. */ -static rend_intro_point_t * -find_intro_point(origin_circuit_t *circ) -{ - const char *serviceid; - rend_service_t *service = NULL; - - tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO); - tor_assert(circ->rend_data); - serviceid = rend_data_get_address(circ->rend_data); - - SMARTLIST_FOREACH(rend_service_list, rend_service_t *, s, - if (tor_memeq(s->service_id, serviceid, REND_SERVICE_ID_LEN_BASE32)) { - service = s; - break; - }); - - if (service == NULL) return NULL; - - SMARTLIST_FOREACH(service->intro_nodes, rend_intro_point_t *, intro_point, - if (crypto_pk_eq_keys(intro_point->intro_key, circ->intro_key)) { - return intro_point; - }); - - return NULL; -} - -/** Upload the rend_encoded_v2_service_descriptor_t's in descs - * associated with the rend_service_descriptor_t renddesc to - * the responsible hidden service directories OR the hidden service - * directories specified by hs_dirs; service_id and - * seconds_valid are only passed for logging purposes. - */ -void -directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, - smartlist_t *descs, smartlist_t *hs_dirs, - const char *service_id, int seconds_valid) -{ - int i, j, failed_upload = 0; - smartlist_t *responsible_dirs = smartlist_new(); - smartlist_t *successful_uploads = smartlist_new(); - routerstatus_t *hs_dir; - for (i = 0; i < smartlist_len(descs); i++) { - rend_encoded_v2_service_descriptor_t *desc = smartlist_get(descs, i); - /** If any HSDirs are specified, they should be used instead of - * the responsible directories */ - if (hs_dirs && smartlist_len(hs_dirs) > 0) { - smartlist_add_all(responsible_dirs, hs_dirs); - } else { - /* Determine responsible dirs. */ - if (hid_serv_get_responsible_directories(responsible_dirs, - desc->desc_id) < 0) { - log_warn(LD_REND, "Could not determine the responsible hidden service " - "directories to post descriptors to."); - control_event_hs_descriptor_upload(service_id, - "UNKNOWN", - "UNKNOWN", NULL); - goto done; - } - } - for (j = 0; j < smartlist_len(responsible_dirs); j++) { - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - char *hs_dir_ip; - const node_t *node; - rend_data_t *rend_data; - hs_dir = smartlist_get(responsible_dirs, j); - if (smartlist_contains_digest(renddesc->successful_uploads, - hs_dir->identity_digest)) - /* Don't upload descriptor if we succeeded in doing so last time. */ - continue; - node = node_get_by_id(hs_dir->identity_digest); - if (!node || !node_has_descriptor(node)) { - log_info(LD_REND, "Not launching upload for for v2 descriptor to " - "hidden service directory %s; we don't have its " - "router descriptor. Queuing for later upload.", - safe_str_client(routerstatus_describe(hs_dir))); - failed_upload = -1; - continue; - } - /* Send publish request. */ - - /* We need the service ID to identify which service did the upload - * request. Lookup is made in rend_service_desc_has_uploaded(). */ - rend_data = rend_data_client_create(service_id, desc->desc_id, NULL, - REND_NO_AUTH); - directory_request_t *req = - directory_request_new(DIR_PURPOSE_UPLOAD_RENDDESC_V2); - directory_request_set_routerstatus(req, hs_dir); - directory_request_set_indirection(req, DIRIND_ANONYMOUS); - directory_request_set_payload(req, - desc->desc_str, strlen(desc->desc_str)); - directory_request_set_rend_query(req, rend_data); - directory_initiate_request(req); - directory_request_free(req); - - rend_data_free(rend_data); - base32_encode(desc_id_base32, sizeof(desc_id_base32), - desc->desc_id, DIGEST_LEN); - hs_dir_ip = tor_dup_ip(hs_dir->addr); - log_info(LD_REND, "Launching upload for v2 descriptor for " - "service '%s' with descriptor ID '%s' with validity " - "of %d seconds to hidden service directory '%s' on " - "%s:%d.", - safe_str_client(service_id), - safe_str_client(desc_id_base32), - seconds_valid, - hs_dir->nickname, - hs_dir_ip, - hs_dir->or_port); - control_event_hs_descriptor_upload(service_id, - hs_dir->identity_digest, - desc_id_base32, NULL); - tor_free(hs_dir_ip); - /* Remember successful upload to this router for next time. */ - if (!smartlist_contains_digest(successful_uploads, - hs_dir->identity_digest)) - smartlist_add(successful_uploads, hs_dir->identity_digest); - } - smartlist_clear(responsible_dirs); - } - if (!failed_upload) { - if (renddesc->successful_uploads) { - SMARTLIST_FOREACH(renddesc->successful_uploads, char *, c, tor_free(c);); - smartlist_free(renddesc->successful_uploads); - renddesc->successful_uploads = NULL; - } - renddesc->all_uploads_performed = 1; - } else { - /* Remember which routers worked this time, so that we don't upload the - * descriptor to them again. */ - if (!renddesc->successful_uploads) - renddesc->successful_uploads = smartlist_new(); - SMARTLIST_FOREACH(successful_uploads, const char *, c, { - if (!smartlist_contains_digest(renddesc->successful_uploads, c)) { - char *hsdir_id = tor_memdup(c, DIGEST_LEN); - smartlist_add(renddesc->successful_uploads, hsdir_id); - } - }); - } - done: - smartlist_free(responsible_dirs); - smartlist_free(successful_uploads); -} - -/** Encode and sign an up-to-date service descriptor for service, - * and upload it/them to the responsible hidden service directories. - */ -static void -upload_service_descriptor(rend_service_t *service) -{ - time_t now = time(NULL); - int rendpostperiod; - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - int uploaded = 0; - - rendpostperiod = get_options()->RendPostPeriod; - - networkstatus_t *c = networkstatus_get_latest_consensus(); - if (c && smartlist_len(c->routerstatus_list) > 0) { - int seconds_valid, i, j, num_descs; - smartlist_t *descs = smartlist_new(); - smartlist_t *client_cookies = smartlist_new(); - /* Either upload a single descriptor (including replicas) or one - * descriptor for each authorized client in case of authorization - * type 'stealth'. */ - num_descs = service->auth_type == REND_STEALTH_AUTH ? - smartlist_len(service->clients) : 1; - for (j = 0; j < num_descs; j++) { - crypto_pk_t *client_key = NULL; - rend_authorized_client_t *client = NULL; - smartlist_clear(client_cookies); - switch (service->auth_type) { - case REND_NO_AUTH: - /* Do nothing here. */ - break; - case REND_BASIC_AUTH: - SMARTLIST_FOREACH(service->clients, rend_authorized_client_t *, - cl, smartlist_add(client_cookies, cl->descriptor_cookie)); - break; - case REND_STEALTH_AUTH: - client = smartlist_get(service->clients, j); - client_key = client->client_key; - smartlist_add(client_cookies, client->descriptor_cookie); - break; - } - /* Encode the current descriptor. */ - seconds_valid = rend_encode_v2_descriptors(descs, service->desc, - now, 0, - service->auth_type, - client_key, - client_cookies); - if (seconds_valid < 0) { - log_warn(LD_BUG, "Internal error: couldn't encode service " - "descriptor; not uploading."); - smartlist_free(descs); - smartlist_free(client_cookies); - return; - } - rend_get_service_id(service->desc->pk, serviceid); - if (get_options()->PublishHidServDescriptors) { - /* Post the current descriptors to the hidden service directories. */ - log_info(LD_REND, "Launching upload for hidden service %s", - serviceid); - directory_post_to_hs_dir(service->desc, descs, NULL, serviceid, - seconds_valid); - } - /* Free memory for descriptors. */ - for (i = 0; i < smartlist_len(descs); i++) - rend_encoded_v2_service_descriptor_free_(smartlist_get(descs, i)); - smartlist_clear(descs); - /* Update next upload time. */ - if (seconds_valid - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS - > rendpostperiod) - service->next_upload_time = now + rendpostperiod; - else if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) - service->next_upload_time = now + seconds_valid + 1; - else - service->next_upload_time = now + seconds_valid - - REND_TIME_PERIOD_OVERLAPPING_V2_DESCS + 1; - /* Post also the next descriptors, if necessary. */ - if (seconds_valid < REND_TIME_PERIOD_OVERLAPPING_V2_DESCS) { - seconds_valid = rend_encode_v2_descriptors(descs, service->desc, - now, 1, - service->auth_type, - client_key, - client_cookies); - if (seconds_valid < 0) { - log_warn(LD_BUG, "Internal error: couldn't encode service " - "descriptor; not uploading."); - smartlist_free(descs); - smartlist_free(client_cookies); - return; - } - if (get_options()->PublishHidServDescriptors) { - directory_post_to_hs_dir(service->desc, descs, NULL, serviceid, - seconds_valid); - } - /* Free memory for descriptors. */ - for (i = 0; i < smartlist_len(descs); i++) - rend_encoded_v2_service_descriptor_free_(smartlist_get(descs, i)); - smartlist_clear(descs); - } - } - smartlist_free(descs); - smartlist_free(client_cookies); - uploaded = 1; - if (get_options()->PublishHidServDescriptors) { - log_info(LD_REND, "Successfully uploaded v2 rend descriptors!"); - } else { - log_info(LD_REND, "Successfully stored created v2 rend descriptors!"); - } - } - - /* If not uploaded, try again in one minute. */ - if (!uploaded) - service->next_upload_time = now + 60; - - /* Unmark dirty flag of this service. */ - service->desc_is_dirty = 0; -} - -/** Return the number of INTRODUCE2 cells this hidden service has received - * from this intro point. */ -static int -intro_point_accepted_intro_count(rend_intro_point_t *intro) -{ - return intro->accepted_introduce2_count; -} - -/** Return non-zero iff intro should 'expire' now (i.e. we - * should stop publishing it in new descriptors and eventually close - * it). */ -static int -intro_point_should_expire_now(rend_intro_point_t *intro, - time_t now) -{ - tor_assert(intro != NULL); - - if (intro->time_published == -1) { - /* Don't expire an intro point if we haven't even published it yet. */ - return 0; - } - - if (intro_point_accepted_intro_count(intro) >= - intro->max_introductions) { - /* This intro point has been used too many times. Expire it now. */ - return 1; - } - - if (intro->time_to_expire == -1) { - /* This intro point has been published, but we haven't picked an - * expiration time for it. Pick one now. */ - int intro_point_lifetime_seconds = - crypto_rand_int_range(INTRO_POINT_LIFETIME_MIN_SECONDS, - INTRO_POINT_LIFETIME_MAX_SECONDS); - - /* Start the expiration timer now, rather than when the intro - * point was first published. There shouldn't be much of a time - * difference. */ - intro->time_to_expire = now + intro_point_lifetime_seconds; - - return 0; - } - - /* This intro point has a time to expire set already. Use it. */ - return (now >= intro->time_to_expire); -} - -/** Iterate over intro points in the given service and remove the invalid - * ones. For an intro point object to be considered invalid, the circuit - * _and_ node need to have disappeared. - * - * If the intro point should expire, it's placed into the expiring_nodes - * list of the service and removed from the active intro nodes list. - * - * If exclude_nodes is not NULL, add the valid nodes to it. - * - * If retry_nodes is not NULL, add the valid node to it if the - * circuit disappeared but the node is still in the consensus. */ -static void -remove_invalid_intro_points(rend_service_t *service, - smartlist_t *exclude_nodes, - smartlist_t *retry_nodes, time_t now) -{ - tor_assert(service); - - /* Remove any expired nodes that doesn't have a circuit. */ - SMARTLIST_FOREACH_BEGIN(service->expiring_nodes, rend_intro_point_t *, - intro) { - origin_circuit_t *intro_circ = - find_intro_circuit(intro, service->pk_digest); - if (intro_circ) { - continue; - } - /* No more circuit, cleanup the into point object. */ - SMARTLIST_DEL_CURRENT(service->expiring_nodes, intro); - rend_intro_point_free(intro); - } SMARTLIST_FOREACH_END(intro); - - SMARTLIST_FOREACH_BEGIN(service->intro_nodes, rend_intro_point_t *, - intro) { - /* Find the introduction point node object. */ - const node_t *node = - node_get_by_id(intro->extend_info->identity_digest); - /* Find the intro circuit, this might be NULL. */ - origin_circuit_t *intro_circ = - find_intro_circuit(intro, service->pk_digest); - - /* Add the valid node to the exclusion list so we don't try to establish - * an introduction point to it again. */ - if (node && exclude_nodes) { - smartlist_add(exclude_nodes, (void*) node); - } - - /* First, make sure we still have a valid circuit for this intro point. - * If we dont, we'll give up on it and make a new one. */ - if (intro_circ == NULL) { - log_info(LD_REND, "Attempting to retry on %s as intro point for %s" - " (circuit disappeared).", - safe_str_client(extend_info_describe(intro->extend_info)), - safe_str_client(service->service_id)); - /* We've lost the circuit for this intro point, flag it so it can be - * accounted for when considiring uploading a descriptor. */ - intro->circuit_established = 0; - - /* Node is gone or we've reached our maximum circuit creationg retry - * count, clean up everything, we'll find a new one. */ - if (node == NULL || - intro->circuit_retries >= MAX_INTRO_POINT_CIRCUIT_RETRIES) { - rend_intro_point_free(intro); - SMARTLIST_DEL_CURRENT(service->intro_nodes, intro); - /* We've just killed the intro point, nothing left to do. */ - continue; - } - - /* The intro point is still alive so let's try to use it again because - * we have a published descriptor containing it. Keep the intro point - * in the intro_nodes list because it's still valid, we are rebuilding - * a circuit to it. */ - if (retry_nodes) { - smartlist_add(retry_nodes, intro); - } - } - /* else, the circuit is valid so in both cases, node being alive or not, - * we leave the circuit and intro point object as is. Closing the - * circuit here would leak new consensus timing and freeing the intro - * point object would make the intro circuit unusable. */ - - /* Now, check if intro point should expire. If it does, queue it so - * it can be cleaned up once it has been replaced properly. */ - if (intro_point_should_expire_now(intro, now)) { - log_info(LD_REND, "Expiring %s as intro point for %s.", - safe_str_client(extend_info_describe(intro->extend_info)), - safe_str_client(service->service_id)); - /* We might have put it in the retry list if so, undo. */ - if (retry_nodes) { - smartlist_remove(retry_nodes, intro); - } - smartlist_add(service->expiring_nodes, intro); - SMARTLIST_DEL_CURRENT(service->intro_nodes, intro); - /* Intro point is expired, we need a new one thus don't consider it - * anymore has a valid established intro point. */ - intro->circuit_established = 0; - } - } SMARTLIST_FOREACH_END(intro); -} - -/** A new descriptor has been successfully uploaded for the given - * rend_data. Remove and free the expiring nodes from the associated - * service. */ -void -rend_service_desc_has_uploaded(const rend_data_t *rend_data) -{ - rend_service_t *service; - const char *onion_address; - - tor_assert(rend_data); - - onion_address = rend_data_get_address(rend_data); - - service = rend_service_get_by_service_id(onion_address); - if (service == NULL) { - return; - } - - SMARTLIST_FOREACH_BEGIN(service->expiring_nodes, rend_intro_point_t *, - intro) { - origin_circuit_t *intro_circ = - find_intro_circuit(intro, service->pk_digest); - if (intro_circ != NULL) { - circuit_mark_for_close(TO_CIRCUIT(intro_circ), - END_CIRC_REASON_FINISHED); - } - SMARTLIST_DEL_CURRENT(service->expiring_nodes, intro); - rend_intro_point_free(intro); - } SMARTLIST_FOREACH_END(intro); -} - -/** Don't try to build more than this many circuits before giving up - * for a while. Dynamically calculated based on the configured number of - * introduction points for the service, n_intro_points_wanted. */ -static int -rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted) -{ - /* Allow all but one of the initial connections to fail and be - * retried. (If all fail, we *want* to wait, because something is broken.) */ - tor_assert(n_intro_points_wanted <= NUM_INTRO_POINTS_MAX); - - /* For the normal use case, 3 intro points plus 2 extra for performance and - * allow that twice because once every 24h or so, we can do it twice for two - * descriptors that is the current one and the next one. So (3 + 2) * 2 == - * 12 allowed attempts for one period. */ - return ((n_intro_points_wanted + NUM_INTRO_POINTS_EXTRA) * 2); -} - -/** For every service, check how many intro points it currently has, and: - * - Invalidate introdution points based on specific criteria, see - * remove_invalid_intro_points comments. - * - Pick new intro points as necessary. - * - Launch circuits to any new intro points. - * - * This is called once a second by the main loop. - */ -void -rend_consider_services_intro_points(time_t now) -{ - int i; - const or_options_t *options = get_options(); - /* Are we in single onion mode? */ - const int allow_direct = rend_service_allow_non_anonymous_connection( - get_options()); - /* List of nodes we need to _exclude_ when choosing a new node to - * establish an intro point to. */ - smartlist_t *exclude_nodes; - /* List of nodes we need to retry to build a circuit on them because the - * node is valid but circuit died. */ - smartlist_t *retry_nodes; - - if (!have_completed_a_circuit()) - return; - - exclude_nodes = smartlist_new(); - retry_nodes = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, service) { - int r; - /* Number of intro points we want to open and add to the intro nodes - * list of the service. */ - unsigned int n_intro_points_to_open; - /* Have an unsigned len so we can use it to compare values else gcc is - * not happy with unmatching signed comparaison. */ - unsigned int intro_nodes_len; - /* Different service are allowed to have the same introduction point as - * long as they are on different circuit thus why we clear this list. */ - smartlist_clear(exclude_nodes); - smartlist_clear(retry_nodes); - - /* Cleanup the invalid intro points and save the node objects, if any, - * in the exclude_nodes and retry_nodes lists. */ - remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now); - - /* This retry period is important here so we don't stress circuit - * creation. */ - - if (now > service->intro_period_started + INTRO_CIRC_RETRY_PERIOD) { - /* One period has elapsed: - * - if we stopped, we can try building circuits again, - * - if we haven't, we reset the circuit creation counts. */ - rend_log_intro_limit(service, LOG_INFO); - service->intro_period_started = now; - service->n_intro_circuits_launched = 0; - } else if (service->n_intro_circuits_launched >= - rend_max_intro_circs_per_period( - service->n_intro_points_wanted)) { - /* We have failed too many times in this period; wait for the next - * one before we try to initiate any more connections. */ - rend_log_intro_limit(service, LOG_WARN); - continue; - } - - /* Let's try to rebuild circuit on the nodes we want to retry on. */ - SMARTLIST_FOREACH_BEGIN(retry_nodes, rend_intro_point_t *, intro) { - r = rend_service_launch_establish_intro(service, intro); - if (r < 0) { - log_warn(LD_REND, "Error launching circuit to node %s for service %s.", - safe_str_client(extend_info_describe(intro->extend_info)), - safe_str_client(service->service_id)); - /* Unable to launch a circuit to that intro point, remove it from - * the valid list so we can create a new one. */ - smartlist_remove(service->intro_nodes, intro); - rend_intro_point_free(intro); - continue; - } - intro->circuit_retries++; - } SMARTLIST_FOREACH_END(intro); - - /* Avoid mismatched signed comparaison below. */ - intro_nodes_len = (unsigned int) smartlist_len(service->intro_nodes); - - /* Quiescent state, we have more or the equal amount of wanted node for - * this service. Proceed to the next service. We can have more nodes - * because we launch extra preemptive circuits if our intro nodes list was - * originally empty for performance reasons. */ - if (intro_nodes_len >= service->n_intro_points_wanted) { - continue; - } - - /* Number of intro points we want to open which is the wanted amount minus - * the current amount of valid nodes. We know that this won't underflow - * because of the check above. */ - n_intro_points_to_open = service->n_intro_points_wanted - intro_nodes_len; - if (intro_nodes_len == 0) { - /* We want to end up with n_intro_points_wanted intro points, but if - * we have no intro points at all (chances are they all cycled or we - * are starting up), we launch NUM_INTRO_POINTS_EXTRA extra circuits - * and use the first n_intro_points_wanted that complete. See proposal - * #155, section 4 for the rationale of this which is purely for - * performance. - * - * The ones after the first n_intro_points_to_open will be converted - * to 'general' internal circuits in rend_service_intro_has_opened(), - * and then we'll drop them from the list of intro points. */ - n_intro_points_to_open += NUM_INTRO_POINTS_EXTRA; - } - - for (i = 0; i < (int) n_intro_points_to_open; i++) { - const node_t *node; - rend_intro_point_t *intro; - router_crn_flags_t flags = CRN_NEED_UPTIME|CRN_NEED_DESC; - router_crn_flags_t direct_flags = flags; - direct_flags |= CRN_PREF_ADDR; - direct_flags |= CRN_DIRECT_CONN; - - node = router_choose_random_node(exclude_nodes, - options->ExcludeNodes, - allow_direct ? direct_flags : flags); - /* If we are in single onion mode, retry node selection for a 3-hop - * path */ - if (allow_direct && !node) { - log_info(LD_REND, - "Unable to find an intro point that we can connect to " - "directly for %s, falling back to a 3-hop path.", - safe_str_client(service->service_id)); - node = router_choose_random_node(exclude_nodes, - options->ExcludeNodes, flags); - } - - if (!node) { - log_warn(LD_REND, - "We only have %d introduction points established for %s; " - "wanted %u.", - smartlist_len(service->intro_nodes), - safe_str_client(service->service_id), - n_intro_points_to_open); - break; - } - /* Add the choosen node to the exclusion list in order to avoid picking - * it again in the next iteration. */ - smartlist_add(exclude_nodes, (void*)node); - intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - /* extend_info is for clients, so we want the multi-hop primary ORPort, - * even if we are a single onion service and intend to connect to it - * directly ourselves. */ - intro->extend_info = extend_info_from_node(node, 0); - if (BUG(intro->extend_info == NULL)) { - break; - } - intro->intro_key = crypto_pk_new(); - const int fail = crypto_pk_generate_key(intro->intro_key); - tor_assert(!fail); - intro->time_published = -1; - intro->time_to_expire = -1; - intro->max_introductions = - crypto_rand_int_range(INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS, - INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS); - smartlist_add(service->intro_nodes, intro); - log_info(LD_REND, "Picked router %s as an intro point for %s.", - safe_str_client(node_describe(node)), - safe_str_client(service->service_id)); - /* Establish new introduction circuit to our chosen intro point. */ - r = rend_service_launch_establish_intro(service, intro); - if (r < 0) { - log_warn(LD_REND, "Error launching circuit to node %s for service %s.", - safe_str_client(extend_info_describe(intro->extend_info)), - safe_str_client(service->service_id)); - /* This funcion will be called again by the main loop so this intro - * point without a intro circuit will be retried on or removed after - * a maximum number of attempts. */ - } - } - } SMARTLIST_FOREACH_END(service); - smartlist_free(exclude_nodes); - smartlist_free(retry_nodes); -} - -#define MIN_REND_INITIAL_POST_DELAY (30) -#define MIN_REND_INITIAL_POST_DELAY_TESTING (5) - -/** Regenerate and upload rendezvous service descriptors for all - * services, if necessary. If the descriptor has been dirty enough - * for long enough, definitely upload; else only upload when the - * periodic timeout has expired. - * - * For the first upload, pick a random time between now and two periods - * from now, and pick it independently for each service. - */ -void -rend_consider_services_upload(time_t now) -{ - int i; - rend_service_t *service; - const or_options_t *options = get_options(); - int rendpostperiod = options->RendPostPeriod; - int rendinitialpostdelay = (options->TestingTorNetwork ? - MIN_REND_INITIAL_POST_DELAY_TESTING : - MIN_REND_INITIAL_POST_DELAY); - - for (i=0; i < smartlist_len(rend_service_list); ++i) { - service = smartlist_get(rend_service_list, i); - if (!service->next_upload_time) { /* never been uploaded yet */ - /* The fixed lower bound of rendinitialpostdelay seconds ensures that - * the descriptor is stable before being published. See comment below. */ - service->next_upload_time = - now + rendinitialpostdelay + crypto_rand_int(2*rendpostperiod); - /* Single Onion Services prioritise availability over hiding their - * startup time, as their IP address is publicly discoverable anyway. - */ - if (rend_service_reveal_startup_time(options)) { - service->next_upload_time = now + rendinitialpostdelay; - } - } - /* Does every introduction points have been established? */ - unsigned int intro_points_ready = - count_established_intro_points(service) >= - service->n_intro_points_wanted; - if (intro_points_ready && - (service->next_upload_time < now || - (service->desc_is_dirty && - service->desc_is_dirty < now-rendinitialpostdelay))) { - /* if it's time, or if the directory servers have a wrong service - * descriptor and ours has been stable for rendinitialpostdelay seconds, - * upload a new one of each format. */ - rend_service_update_descriptor(service); - upload_service_descriptor(service); - } - } -} - -/** True if the list of available router descriptors might have changed so - * that we should have a look whether we can republish previously failed - * rendezvous service descriptors. */ -static int consider_republishing_rend_descriptors = 1; - -/** Called when our internal view of the directory has changed, so that we - * might have router descriptors of hidden service directories available that - * we did not have before. */ -void -rend_hsdir_routers_changed(void) -{ - consider_republishing_rend_descriptors = 1; -} - -/** Consider republication of v2 rendezvous service descriptors that failed - * previously, but without regenerating descriptor contents. - */ -void -rend_consider_descriptor_republication(void) -{ - int i; - rend_service_t *service; - - if (!consider_republishing_rend_descriptors) - return; - consider_republishing_rend_descriptors = 0; - - if (!get_options()->PublishHidServDescriptors) - return; - - for (i=0; i < smartlist_len(rend_service_list); ++i) { - service = smartlist_get(rend_service_list, i); - if (service->desc && !service->desc->all_uploads_performed) { - /* If we failed in uploading a descriptor last time, try again *without* - * updating the descriptor's contents. */ - upload_service_descriptor(service); - } - } -} - -/** Log the status of introduction points for all rendezvous services - * at log severity severity. - */ -void -rend_service_dump_stats(int severity) -{ - int i,j; - rend_service_t *service; - rend_intro_point_t *intro; - const char *safe_name; - origin_circuit_t *circ; - - for (i=0; i < smartlist_len(rend_service_list); ++i) { - service = smartlist_get(rend_service_list, i); - tor_log(severity, LD_GENERAL, "Service configured in %s:", - rend_service_escaped_dir(service)); - for (j=0; j < smartlist_len(service->intro_nodes); ++j) { - intro = smartlist_get(service->intro_nodes, j); - safe_name = safe_str_client(intro->extend_info->nickname); - - circ = find_intro_circuit(intro, service->pk_digest); - if (!circ) { - tor_log(severity, LD_GENERAL, " Intro point %d at %s: no circuit", - j, safe_name); - continue; - } - tor_log(severity, LD_GENERAL, " Intro point %d at %s: circuit is %s", - j, safe_name, circuit_state_to_string(circ->base_.state)); - } - } -} - -/** Given conn, a rendezvous exit stream, look up the hidden service for - * 'circ', and look up the port and address based on conn-\>port. - * Assign the actual conn-\>addr and conn-\>port. Return -2 on failure - * for which the circuit should be closed, -1 on other failure, - * or 0 for success. - */ -int -rend_service_set_connection_addr_port(edge_connection_t *conn, - origin_circuit_t *circ) -{ - rend_service_t *service; - char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; - const char *rend_pk_digest; - - tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED); - tor_assert(circ->rend_data); - log_debug(LD_REND,"beginning to hunt for addr/port"); - rend_pk_digest = (char *) rend_data_get_pk_digest(circ->rend_data, NULL); - base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1, - rend_pk_digest, REND_SERVICE_ID_LEN); - service = rend_service_get_by_pk_digest(rend_pk_digest); - if (!service) { - log_warn(LD_REND, "Couldn't find any service associated with pk %s on " - "rendezvous circuit %u; closing.", - serviceid, (unsigned)circ->base_.n_circ_id); - return -2; - } - if (service->max_streams_per_circuit > 0) { - /* Enforce the streams-per-circuit limit, and refuse to provide a - * mapping if this circuit will exceed the limit. */ -#define MAX_STREAM_WARN_INTERVAL 600 - static struct ratelim_t stream_ratelim = - RATELIM_INIT(MAX_STREAM_WARN_INTERVAL); - if (circ->rend_data->nr_streams >= service->max_streams_per_circuit) { - log_fn_ratelim(&stream_ratelim, LOG_WARN, LD_REND, - "Maximum streams per circuit limit reached on rendezvous " - "circuit %u; %s. Circuit has %d out of %d streams.", - (unsigned)circ->base_.n_circ_id, - service->max_streams_close_circuit ? - "closing circuit" : - "ignoring open stream request", - circ->rend_data->nr_streams, - service->max_streams_per_circuit); - return service->max_streams_close_circuit ? -2 : -1; - } - } - - if (hs_set_conn_addr_port(service->ports, conn) == 0) { - /* Successfully set the port to the connection. We are done. */ - return 0; - } - - log_info(LD_REND, - "No virtual port mapping exists for port %d on service %s", - conn->base_.port, serviceid); - - if (service->allow_unknown_ports) - return -1; - else - return -2; -} - -/* Are HiddenServiceSingleHopMode and HiddenServiceNonAnonymousMode consistent? - */ -static int -rend_service_non_anonymous_mode_consistent(const or_options_t *options) -{ - /* !! is used to make these options boolean */ - return (!! options->HiddenServiceSingleHopMode == - !! options->HiddenServiceNonAnonymousMode); -} - -/* Do the options allow onion services to make direct (non-anonymous) - * connections to introduction or rendezvous points? - * Must only be called after options_validate_single_onion() has successfully - * checked onion service option consistency. - * Returns true if tor is in HiddenServiceSingleHopMode. */ -int -rend_service_allow_non_anonymous_connection(const or_options_t *options) -{ - tor_assert(rend_service_non_anonymous_mode_consistent(options)); - return options->HiddenServiceSingleHopMode ? 1 : 0; -} - -/* Do the options allow us to reveal the exact startup time of the onion - * service? - * Single Onion Services prioritise availability over hiding their - * startup time, as their IP address is publicly discoverable anyway. - * Must only be called after options_validate_single_onion() has successfully - * checked onion service option consistency. - * Returns true if tor is in non-anonymous hidden service mode. */ -int -rend_service_reveal_startup_time(const or_options_t *options) -{ - tor_assert(rend_service_non_anonymous_mode_consistent(options)); - return rend_service_non_anonymous_mode_enabled(options); -} - -/* Is non-anonymous mode enabled using the HiddenServiceNonAnonymousMode - * config option? - * Must only be called after options_validate_single_onion() has successfully - * checked onion service option consistency. - */ -int -rend_service_non_anonymous_mode_enabled(const or_options_t *options) -{ - tor_assert(rend_service_non_anonymous_mode_consistent(options)); - return options->HiddenServiceNonAnonymousMode ? 1 : 0; -} - -#ifdef TOR_UNIT_TESTS - -STATIC void -set_rend_service_list(smartlist_t *new_list) -{ - rend_service_list = new_list; -} - -STATIC void -set_rend_rend_service_staging_list(smartlist_t *new_list) -{ - rend_service_staging_list = new_list; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/rendservice.h b/src/tor/src/or/rendservice.h deleted file mode 100644 index 88da7b866..000000000 --- a/src/tor/src/or/rendservice.h +++ /dev/null @@ -1,221 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file rendservice.h - * \brief Header file for rendservice.c. - **/ - -#ifndef TOR_RENDSERVICE_H -#define TOR_RENDSERVICE_H - -#include "or.h" -#include "hs_service.h" - -typedef struct rend_intro_cell_s rend_intro_cell_t; - -/* This can be used for both INTRODUCE1 and INTRODUCE2 */ - -struct rend_intro_cell_s { - /* Is this an INTRODUCE1 or INTRODUCE2? (set to 1 or 2) */ - uint8_t type; - /* Public key digest */ - uint8_t pk[DIGEST_LEN]; - /* Optionally, store ciphertext here */ - uint8_t *ciphertext; - ssize_t ciphertext_len; - /* Optionally, store plaintext */ - uint8_t *plaintext; - ssize_t plaintext_len; - /* Have we parsed the plaintext? */ - uint8_t parsed; - /* intro protocol version (0, 1, 2 or 3) */ - uint8_t version; - /* Version-specific parts */ - union { - struct { - /* Rendezvous point nickname or hex-encoded key digest */ - uint8_t rp[42]; - } v0_v1; - struct { - /* The extend_info_t struct has everything v2 uses */ - extend_info_t *extend_info; - } v2; - struct { - /* Auth type used */ - uint8_t auth_type; - /* Length of auth data */ - uint16_t auth_len; - /* Auth data */ - uint8_t *auth_data; - /* Rendezvous point's IP address/port, identity digest and onion key */ - extend_info_t *extend_info; - } v3; - } u; - /* Rendezvous cookie */ - uint8_t rc[REND_COOKIE_LEN]; - /* Diffie-Hellman data */ - uint8_t dh[DH_KEY_LEN]; -}; - -#ifdef RENDSERVICE_PRIVATE - -/** Represents a single hidden service running at this OP. */ -typedef struct rend_service_t { - /* Fields specified in config file */ - char *directory; /**< where in the filesystem it stores it. Will be NULL if - * this service is ephemeral. */ - int dir_group_readable; /**< if 1, allow group read - permissions on directory */ - smartlist_t *ports; /**< List of rend_service_port_config_t */ - rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client - * authorization is performed. */ - smartlist_t *clients; /**< List of rend_authorized_client_t's of - * clients that may access our service. Can be NULL - * if no client authorization is performed. */ - /* Other fields */ - crypto_pk_t *private_key; /**< Permanent hidden-service key. */ - char service_id[REND_SERVICE_ID_LEN_BASE32+1]; /**< Onion address without - * '.onion' */ - char pk_digest[DIGEST_LEN]; /**< Hash of permanent hidden-service key. */ - smartlist_t *intro_nodes; /**< List of rend_intro_point_t's we have, - * or are trying to establish. */ - /** List of rend_intro_point_t that are expiring. They are removed once - * the new descriptor is successfully uploaded. A node in this list CAN - * NOT appear in the intro_nodes list. */ - smartlist_t *expiring_nodes; - time_t intro_period_started; /**< Start of the current period to build - * introduction points. */ - int n_intro_circuits_launched; /**< Count of intro circuits we have - * established in this period. */ - unsigned int n_intro_points_wanted; /**< Number of intro points this - * service wants to have open. */ - rend_service_descriptor_t *desc; /**< Current hidden service descriptor. */ - time_t desc_is_dirty; /**< Time at which changes to the hidden service - * descriptor content occurred, or 0 if it's - * up-to-date. */ - time_t next_upload_time; /**< Scheduled next hidden service descriptor - * upload time. */ - /** Replay cache for Diffie-Hellman values of INTRODUCE2 cells, to - * detect repeats. Clients may send INTRODUCE1 cells for the same - * rendezvous point through two or more different introduction points; - * when they do, this keeps us from launching multiple simultaneous attempts - * to connect to the same rend point. */ - replaycache_t *accepted_intro_dh_parts; - /** If true, we don't close circuits for making requests to unsupported - * ports. */ - int allow_unknown_ports; - /** The maximum number of simultanious streams-per-circuit that are allowed - * to be established, or 0 if no limit is set. - */ - int max_streams_per_circuit; - /** If true, we close circuits that exceed the max_streams_per_circuit - * limit. */ - int max_streams_close_circuit; -} rend_service_t; - -STATIC void rend_service_free_(rend_service_t *service); -#define rend_service_free(s) \ - FREE_AND_NULL(rend_service_t, rend_service_free_, (s)) -STATIC char *rend_service_sos_poison_path(const rend_service_t *service); -STATIC int rend_service_verify_single_onion_poison( - const rend_service_t *s, - const or_options_t *options); -STATIC int rend_service_poison_new_single_onion_dir( - const rend_service_t *s, - const or_options_t* options); -#ifdef TOR_UNIT_TESTS - -STATIC void set_rend_service_list(smartlist_t *new_list); -STATIC void set_rend_rend_service_staging_list(smartlist_t *new_list); -STATIC void rend_service_prune_list_impl_(void); - -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* defined(RENDSERVICE_PRIVATE) */ - -int rend_num_services(void); -int rend_config_service(const config_line_t *line_, - const or_options_t *options, - hs_service_config_t *config); -void rend_service_prune_list(void); -void rend_service_free_staging_list(void); -int rend_service_load_all_keys(const smartlist_t *service_list); -void rend_services_add_filenames_to_lists(smartlist_t *open_lst, - smartlist_t *stat_lst); -void rend_consider_services_intro_points(time_t now); -void rend_consider_services_upload(time_t now); -void rend_hsdir_routers_changed(void); -void rend_consider_descriptor_republication(void); - -void rend_service_intro_has_opened(origin_circuit_t *circuit); -int rend_service_intro_established(origin_circuit_t *circuit, - const uint8_t *request, - size_t request_len); -void rend_service_rendezvous_has_opened(origin_circuit_t *circuit); -int rend_service_receive_introduction(origin_circuit_t *circuit, - const uint8_t *request, - size_t request_len); -int rend_service_decrypt_intro(rend_intro_cell_t *request, - crypto_pk_t *key, - char **err_msg_out); -void rend_service_free_intro_(rend_intro_cell_t *request); -#define rend_service_free_intro(req) do { \ - rend_service_free_intro_(req); \ - (req) = NULL; \ - } while (0) -rend_intro_cell_t * rend_service_begin_parse_intro(const uint8_t *request, - size_t request_len, - uint8_t type, - char **err_msg_out); -int rend_service_parse_intro_plaintext(rend_intro_cell_t *intro, - char **err_msg_out); -ssize_t rend_service_encode_establish_intro_cell(char *cell_body_out, - size_t cell_body_out_len, - crypto_pk_t *intro_key, - const char *rend_circ_nonce); -int rend_service_validate_intro_late(const rend_intro_cell_t *intro, - char **err_msg_out); -void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc); -int rend_service_set_connection_addr_port(edge_connection_t *conn, - origin_circuit_t *circ); -void rend_service_dump_stats(int severity); -void rend_service_free_all(void); -void rend_service_init(void); - -rend_service_port_config_t *rend_service_parse_port_config(const char *string, - const char *sep, - char **err_msg_out); -void rend_service_port_config_free_(rend_service_port_config_t *p); -#define rend_service_port_config_free(p) \ - FREE_AND_NULL(rend_service_port_config_t, rend_service_port_config_free_, \ - (p)) - -void rend_authorized_client_free_(rend_authorized_client_t *client); -#define rend_authorized_client_free(client) \ - FREE_AND_NULL(rend_authorized_client_t, rend_authorized_client_free_, \ - (client)) - -hs_service_add_ephemeral_status_t rend_service_add_ephemeral(crypto_pk_t *pk, - smartlist_t *ports, - int max_streams_per_circuit, - int max_streams_close_circuit, - rend_auth_type_t auth_type, - smartlist_t *auth_clients, - char **service_id_out); -int rend_service_del_ephemeral(const char *service_id); - -void directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, - smartlist_t *descs, smartlist_t *hs_dirs, - const char *service_id, int seconds_valid); -void rend_service_desc_has_uploaded(const rend_data_t *rend_data); - -int rend_service_allow_non_anonymous_connection(const or_options_t *options); -int rend_service_reveal_startup_time(const or_options_t *options); -int rend_service_non_anonymous_mode_enabled(const or_options_t *options); - -#endif /* !defined(TOR_RENDSERVICE_H) */ - diff --git a/src/tor/src/or/routerkeys.c b/src/tor/src/or/routerkeys.c deleted file mode 100644 index af230f07b..000000000 --- a/src/tor/src/or/routerkeys.c +++ /dev/null @@ -1,1400 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file routerkeys.c - * - * \brief Functions and structures to handle generating and maintaining the - * set of keypairs necessary to be an OR. - * - * The keys handled here now are the Ed25519 keys that Tor relays use to sign - * descriptors, authenticate themselves on links, and identify one another - * uniquely. Other keys are maintained in router.c and rendservice.c. - * - * (TODO: The keys in router.c should go here too.) - */ - -#include "or.h" -#include "config.h" -#include "router.h" -#include "crypto_pwbox.h" -#include "routerkeys.h" -#include "torcert.h" - -#define ENC_KEY_HEADER "Boxed Ed25519 key" -#define ENC_KEY_TAG "master" - -/* DOCDOC */ -static ssize_t -do_getpass(const char *prompt, char *buf, size_t buflen, - int twice, const or_options_t *options) -{ - if (options->keygen_force_passphrase == FORCE_PASSPHRASE_OFF) { - tor_assert(buflen); - buf[0] = 0; - return 0; - } - - char *prompt2 = NULL; - char *buf2 = NULL; - int fd = -1; - ssize_t length = -1; - - if (options->use_keygen_passphrase_fd) { - twice = 0; - fd = options->keygen_passphrase_fd; - length = read_all(fd, buf, buflen-1, 0); - if (length >= 0) - buf[length] = 0; - goto done_reading; - } - - if (twice) { - const char msg[] = "One more time:"; - size_t p2len = strlen(prompt) + 1; - if (p2len < sizeof(msg)) - p2len = sizeof(msg); - prompt2 = tor_malloc(p2len); - memset(prompt2, ' ', p2len); - memcpy(prompt2 + p2len - sizeof(msg), msg, sizeof(msg)); - - buf2 = tor_malloc_zero(buflen); - } - - while (1) { - length = tor_getpass(prompt, buf, buflen); - if (length < 0) - goto done_reading; - - if (! twice) - break; - - ssize_t length2 = tor_getpass(prompt2, buf2, buflen); - - if (length != length2 || tor_memneq(buf, buf2, length)) { - fprintf(stderr, "That didn't match.\n"); - } else { - break; - } - } - - done_reading: - if (twice) { - tor_free(prompt2); - memwipe(buf2, 0, buflen); - tor_free(buf2); - } - - if (options->keygen_force_passphrase == FORCE_PASSPHRASE_ON && length == 0) - return -1; - - return length; -} - -/* DOCDOC */ -int -read_encrypted_secret_key(ed25519_secret_key_t *out, - const char *fname) -{ - int r = -1; - uint8_t *secret = NULL; - size_t secret_len = 0; - char pwbuf[256]; - uint8_t encrypted_key[256]; - char *tag = NULL; - int saved_errno = 0; - - ssize_t encrypted_len = crypto_read_tagged_contents_from_file(fname, - ENC_KEY_HEADER, - &tag, - encrypted_key, - sizeof(encrypted_key)); - if (encrypted_len < 0) { - saved_errno = errno; - log_info(LD_OR, "%s is missing", fname); - r = 0; - goto done; - } - if (strcmp(tag, ENC_KEY_TAG)) { - saved_errno = EINVAL; - goto done; - } - - while (1) { - ssize_t pwlen = - do_getpass("Enter passphrase for master key:", pwbuf, sizeof(pwbuf), 0, - get_options()); - if (pwlen < 0) { - saved_errno = EINVAL; - goto done; - } - const int r_unbox = crypto_unpwbox(&secret, &secret_len, - encrypted_key, encrypted_len, - pwbuf, pwlen); - if (r_unbox == UNPWBOX_CORRUPTED) { - log_err(LD_OR, "%s is corrupted.", fname); - saved_errno = EINVAL; - goto done; - } else if (r_unbox == UNPWBOX_OKAY) { - break; - } - - /* Otherwise, passphrase is bad, so try again till user does ctrl-c or gets - * it right. */ - } - - if (secret_len != ED25519_SECKEY_LEN) { - log_err(LD_OR, "%s is corrupted.", fname); - saved_errno = EINVAL; - goto done; - } - memcpy(out->seckey, secret, ED25519_SECKEY_LEN); - r = 1; - - done: - memwipe(encrypted_key, 0, sizeof(encrypted_key)); - memwipe(pwbuf, 0, sizeof(pwbuf)); - tor_free(tag); - if (secret) { - memwipe(secret, 0, secret_len); - tor_free(secret); - } - if (saved_errno) - errno = saved_errno; - return r; -} - -/* DOCDOC */ -int -write_encrypted_secret_key(const ed25519_secret_key_t *key, - const char *fname) -{ - int r = -1; - char pwbuf0[256]; - uint8_t *encrypted_key = NULL; - size_t encrypted_len = 0; - - if (do_getpass("Enter new passphrase:", pwbuf0, sizeof(pwbuf0), 1, - get_options()) < 0) { - log_warn(LD_OR, "NO/failed passphrase"); - return -1; - } - - if (strlen(pwbuf0) == 0) { - if (get_options()->keygen_force_passphrase == FORCE_PASSPHRASE_ON) - return -1; - else - return 0; - } - - if (crypto_pwbox(&encrypted_key, &encrypted_len, - key->seckey, sizeof(key->seckey), - pwbuf0, strlen(pwbuf0), 0) < 0) { - log_warn(LD_OR, "crypto_pwbox failed!?"); - goto done; - } - if (crypto_write_tagged_contents_to_file(fname, - ENC_KEY_HEADER, - ENC_KEY_TAG, - encrypted_key, encrypted_len) < 0) - goto done; - r = 1; - done: - if (encrypted_key) { - memwipe(encrypted_key, 0, encrypted_len); - tor_free(encrypted_key); - } - memwipe(pwbuf0, 0, sizeof(pwbuf0)); - return r; -} - -/* DOCDOC */ -static int -write_secret_key(const ed25519_secret_key_t *key, int encrypted, - const char *fname, - const char *fname_tag, - const char *encrypted_fname) -{ - if (encrypted) { - int r = write_encrypted_secret_key(key, encrypted_fname); - if (r == 1) { - /* Success! */ - - /* Try to unlink the unencrypted key, if any existed before */ - if (strcmp(fname, encrypted_fname)) - unlink(fname); - return r; - } else if (r != 0) { - /* Unrecoverable failure! */ - return r; - } - - fprintf(stderr, "Not encrypting the secret key.\n"); - } - return ed25519_seckey_write_to_file(key, fname, fname_tag); -} - -/** - * Read an ed25519 key and associated certificates from files beginning with - * fname, with certificate type cert_type. On failure, return - * NULL; on success return the keypair. - * - * If INIT_ED_KEY_CREATE is set in flags, then create the key (and - * certificate if requested) if it doesn't exist, and save it to disk. - * - * If INIT_ED_KEY_NEEDCERT is set in flags, load/create a certificate - * too and store it in *cert_out. Fail if the cert can't be - * found/created. To create a certificate, signing_key must be set to - * the key that should sign it; now to the current time, and - * lifetime to the lifetime of the key. - * - * If INIT_ED_KEY_REPLACE is set in flags, then create and save new key - * whether we can read the old one or not. - * - * If INIT_ED_KEY_EXTRA_STRONG is set in flags, set the extra_strong - * flag when creating the secret key. - * - * If INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT is set in flags, and - * we create a new certificate, create it with the signing key embedded. - * - * If INIT_ED_KEY_SPLIT is set in flags, and we create a new key, - * store the public key in a separate file from the secret key. - * - * If INIT_ED_KEY_MISSING_SECRET_OK is set in flags, and we find a - * public key file but no secret key file, return successfully anyway. - * - * If INIT_ED_KEY_OMIT_SECRET is set in flags, do not try to load a - * secret key unless no public key is found. Do not return a secret key. (but - * create and save one if needed). - * - * If INIT_ED_KEY_NO_LOAD_SECRET is set in flags, don't try to load - * a secret key, no matter what. - * - * If INIT_ED_KEY_TRY_ENCRYPTED is set, we look for an encrypted secret key - * and consider encrypting any new secret key. - * - * If INIT_ED_KEY_NO_REPAIR is set, and there is any issue loading the keys - * from disk _other than their absence_ (full or partial), we do not try to - * replace them. - * - * If INIT_ED_KEY_SUGGEST_KEYGEN is set, have log messages about failures - * refer to the --keygen option. - * - * If INIT_ED_KEY_EXPLICIT_FNAME is set, use the provided file name for the - * secret key file, encrypted or not. - */ -ed25519_keypair_t * -ed_key_init_from_file(const char *fname, uint32_t flags, - int severity, - const ed25519_keypair_t *signing_key, - time_t now, - time_t lifetime, - uint8_t cert_type, - struct tor_cert_st **cert_out) -{ - char *secret_fname = NULL; - char *encrypted_secret_fname = NULL; - char *public_fname = NULL; - char *cert_fname = NULL; - const char *loaded_secret_fname = NULL; - int created_pk = 0, created_sk = 0, created_cert = 0; - const int try_to_load = ! (flags & INIT_ED_KEY_REPLACE); - const int encrypt_key = !! (flags & INIT_ED_KEY_TRY_ENCRYPTED); - const int norepair = !! (flags & INIT_ED_KEY_NO_REPAIR); - const int split = !! (flags & INIT_ED_KEY_SPLIT); - const int omit_secret = !! (flags & INIT_ED_KEY_OMIT_SECRET); - const int offline_secret = !! (flags & INIT_ED_KEY_OFFLINE_SECRET); - const int explicit_fname = !! (flags & INIT_ED_KEY_EXPLICIT_FNAME); - - /* we don't support setting both of these flags at once. */ - tor_assert((flags & (INIT_ED_KEY_NO_REPAIR|INIT_ED_KEY_NEEDCERT)) != - (INIT_ED_KEY_NO_REPAIR|INIT_ED_KEY_NEEDCERT)); - - char tag[8]; - tor_snprintf(tag, sizeof(tag), "type%d", (int)cert_type); - - tor_cert_t *cert = NULL; - char *got_tag = NULL; - ed25519_keypair_t *keypair = tor_malloc_zero(sizeof(ed25519_keypair_t)); - - if (explicit_fname) { - secret_fname = tor_strdup(fname); - encrypted_secret_fname = tor_strdup(fname); - } else { - tor_asprintf(&secret_fname, "%s_secret_key", fname); - tor_asprintf(&encrypted_secret_fname, "%s_secret_key_encrypted", fname); - } - tor_asprintf(&public_fname, "%s_public_key", fname); - tor_asprintf(&cert_fname, "%s_cert", fname); - - /* Try to read the secret key. */ - int have_secret = 0; - int load_secret = try_to_load && - !offline_secret && - (!omit_secret || file_status(public_fname)==FN_NOENT); - if (load_secret) { - int rv = ed25519_seckey_read_from_file(&keypair->seckey, - &got_tag, secret_fname); - if (rv == 0) { - have_secret = 1; - loaded_secret_fname = secret_fname; - tor_assert(got_tag); - } else { - if (errno != ENOENT && norepair) { - tor_log(severity, LD_OR, "Unable to read %s: %s", secret_fname, - strerror(errno)); - goto err; - } - } - } - - /* Should we try for an encrypted key? */ - int have_encrypted_secret_file = 0; - if (!have_secret && try_to_load && encrypt_key) { - int r = read_encrypted_secret_key(&keypair->seckey, - encrypted_secret_fname); - if (r > 0) { - have_secret = 1; - have_encrypted_secret_file = 1; - tor_free(got_tag); /* convince coverity we aren't leaking */ - got_tag = tor_strdup(tag); - loaded_secret_fname = encrypted_secret_fname; - } else if (errno != ENOENT && norepair) { - tor_log(severity, LD_OR, "Unable to read %s: %s", - encrypted_secret_fname, strerror(errno)); - goto err; - } - } else { - if (try_to_load) { - /* Check if it's there anyway, so we don't replace it. */ - if (file_status(encrypted_secret_fname) != FN_NOENT) - have_encrypted_secret_file = 1; - } - } - - if (have_secret) { - if (strcmp(got_tag, tag)) { - tor_log(severity, LD_OR, "%s has wrong tag", loaded_secret_fname); - goto err; - } - /* Derive the public key */ - if (ed25519_public_key_generate(&keypair->pubkey, &keypair->seckey)<0) { - tor_log(severity, LD_OR, "%s can't produce a public key", - loaded_secret_fname); - goto err; - } - } - - /* If we do split keys here, try to read the pubkey. */ - int found_public = 0; - if (try_to_load && (!have_secret || split)) { - ed25519_public_key_t pubkey_tmp; - tor_free(got_tag); - found_public = ed25519_pubkey_read_from_file(&pubkey_tmp, - &got_tag, public_fname) == 0; - if (!found_public && errno != ENOENT && norepair) { - tor_log(severity, LD_OR, "Unable to read %s: %s", public_fname, - strerror(errno)); - goto err; - } - if (found_public && strcmp(got_tag, tag)) { - tor_log(severity, LD_OR, "%s has wrong tag", public_fname); - goto err; - } - if (found_public) { - if (have_secret) { - /* If we have a secret key and we're reloading the public key, - * the key must match! */ - if (! ed25519_pubkey_eq(&keypair->pubkey, &pubkey_tmp)) { - tor_log(severity, LD_OR, "%s does not match %s! If you are trying " - "to restore from backup, make sure you didn't mix up the " - "key files. If you are absolutely sure that %s is the right " - "key for this relay, delete %s or move it out of the way.", - public_fname, loaded_secret_fname, - loaded_secret_fname, public_fname); - goto err; - } - } else { - /* We only have the public key; better use that. */ - tor_assert(split); - memcpy(&keypair->pubkey, &pubkey_tmp, sizeof(pubkey_tmp)); - } - } else { - /* We have no public key file, but we do have a secret key, make the - * public key file! */ - if (have_secret) { - if (ed25519_pubkey_write_to_file(&keypair->pubkey, public_fname, tag) - < 0) { - tor_log(severity, LD_OR, "Couldn't repair %s", public_fname); - goto err; - } else { - tor_log(LOG_NOTICE, LD_OR, - "Found secret key but not %s. Regenerating.", - public_fname); - } - } - } - } - - /* If the secret key is absent and it's not allowed to be, fail. */ - if (!have_secret && found_public && - !(flags & INIT_ED_KEY_MISSING_SECRET_OK)) { - if (have_encrypted_secret_file) { - tor_log(severity, LD_OR, "We needed to load a secret key from %s, " - "but it was encrypted. Try 'tor --keygen' instead, so you " - "can enter the passphrase.", - secret_fname); - } else if (offline_secret) { - tor_log(severity, LD_OR, "We wanted to load a secret key from %s, " - "but you're keeping it offline. (OfflineMasterKey is set.)", - secret_fname); - } else { - tor_log(severity, LD_OR, "We needed to load a secret key from %s, " - "but couldn't find it. %s", secret_fname, - (flags & INIT_ED_KEY_SUGGEST_KEYGEN) ? - "If you're keeping your master secret key offline, you will " - "need to run 'tor --keygen' to generate new signing keys." : - "Did you forget to copy it over when you copied the rest of the " - "signing key material?"); - } - goto err; - } - - /* If it's absent, and we're not supposed to make a new keypair, fail. */ - if (!have_secret && !found_public && !(flags & INIT_ED_KEY_CREATE)) { - if (split) { - tor_log(severity, LD_OR, "No key found in %s or %s.", - secret_fname, public_fname); - } else { - tor_log(severity, LD_OR, "No key found in %s.", secret_fname); - } - goto err; - } - - /* If the secret key is absent, but the encrypted key would be present, - * that's an error */ - if (!have_secret && !found_public && have_encrypted_secret_file) { - tor_assert(!encrypt_key); - tor_log(severity, LD_OR, "Found an encrypted secret key, " - "but not public key file %s!", public_fname); - goto err; - } - - /* if it's absent, make a new keypair... */ - if (!have_secret && !found_public) { - tor_free(keypair); - keypair = ed_key_new(signing_key, flags, now, lifetime, - cert_type, &cert); - if (!keypair) { - tor_log(severity, LD_OR, "Couldn't create keypair"); - goto err; - } - created_pk = created_sk = created_cert = 1; - } - - /* Write it to disk if we're supposed to do with a new passphrase, or if - * we just created it. */ - if (created_sk || (have_secret && get_options()->change_key_passphrase)) { - if (write_secret_key(&keypair->seckey, - encrypt_key, - secret_fname, tag, encrypted_secret_fname) < 0 - || - (split && - ed25519_pubkey_write_to_file(&keypair->pubkey, public_fname, tag) < 0) - || - (cert && - crypto_write_tagged_contents_to_file(cert_fname, "ed25519v1-cert", - tag, cert->encoded, cert->encoded_len) < 0)) { - tor_log(severity, LD_OR, "Couldn't write keys or cert to file."); - goto err; - } - goto done; - } - - /* If we're not supposed to get a cert, we're done. */ - if (! (flags & INIT_ED_KEY_NEEDCERT)) - goto done; - - /* Read a cert. */ - tor_free(got_tag); - uint8_t certbuf[256]; - ssize_t cert_body_len = crypto_read_tagged_contents_from_file( - cert_fname, "ed25519v1-cert", - &got_tag, certbuf, sizeof(certbuf)); - if (cert_body_len >= 0 && !strcmp(got_tag, tag)) - cert = tor_cert_parse(certbuf, cert_body_len); - - /* If we got it, check it to the extent we can. */ - int bad_cert = 0; - - if (! cert) { - tor_log(severity, LD_OR, "Cert was unparseable"); - bad_cert = 1; - } else if (!tor_memeq(cert->signed_key.pubkey, keypair->pubkey.pubkey, - ED25519_PUBKEY_LEN)) { - tor_log(severity, LD_OR, "Cert was for wrong key"); - bad_cert = 1; - } else if (signing_key && - tor_cert_checksig(cert, &signing_key->pubkey, now) < 0) { - tor_log(severity, LD_OR, "Can't check certificate"); - bad_cert = 1; - } else if (cert->cert_expired) { - tor_log(severity, LD_OR, "Certificate is expired"); - bad_cert = 1; - } else if (signing_key && cert->signing_key_included && - ! ed25519_pubkey_eq(&signing_key->pubkey, &cert->signing_key)) { - tor_log(severity, LD_OR, "Certificate signed by unexpectd key!"); - bad_cert = 1; - } - - if (bad_cert) { - tor_cert_free(cert); - cert = NULL; - } - - /* If we got a cert, we're done. */ - if (cert) - goto done; - - /* If we didn't get a cert, and we're not supposed to make one, fail. */ - if (!signing_key || !(flags & INIT_ED_KEY_CREATE)) { - tor_log(severity, LD_OR, "Without signing key, can't create certificate"); - goto err; - } - - /* We have keys but not a certificate, so make one. */ - uint32_t cert_flags = 0; - if (flags & INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT) - cert_flags |= CERT_FLAG_INCLUDE_SIGNING_KEY; - cert = tor_cert_create(signing_key, cert_type, - &keypair->pubkey, - now, lifetime, - cert_flags); - - if (! cert) { - tor_log(severity, LD_OR, "Couldn't create certificate"); - goto err; - } - - /* Write it to disk. */ - created_cert = 1; - if (crypto_write_tagged_contents_to_file(cert_fname, "ed25519v1-cert", - tag, cert->encoded, cert->encoded_len) < 0) { - tor_log(severity, LD_OR, "Couldn't write cert to disk."); - goto err; - } - - done: - if (cert_out) - *cert_out = cert; - else - tor_cert_free(cert); - - goto cleanup; - - err: - if (keypair) - memwipe(keypair, 0, sizeof(*keypair)); - tor_free(keypair); - tor_cert_free(cert); - if (cert_out) - *cert_out = NULL; - if (created_sk) - unlink(secret_fname); - if (created_pk) - unlink(public_fname); - if (created_cert) - unlink(cert_fname); - - cleanup: - tor_free(encrypted_secret_fname); - tor_free(secret_fname); - tor_free(public_fname); - tor_free(cert_fname); - tor_free(got_tag); - - return keypair; -} - -/** - * Create a new signing key and (optionally) certficiate; do not read or write - * from disk. See ed_key_init_from_file() for more information. - */ -ed25519_keypair_t * -ed_key_new(const ed25519_keypair_t *signing_key, - uint32_t flags, - time_t now, - time_t lifetime, - uint8_t cert_type, - struct tor_cert_st **cert_out) -{ - if (cert_out) - *cert_out = NULL; - - const int extra_strong = !! (flags & INIT_ED_KEY_EXTRA_STRONG); - ed25519_keypair_t *keypair = tor_malloc_zero(sizeof(ed25519_keypair_t)); - if (ed25519_keypair_generate(keypair, extra_strong) < 0) - goto err; - - if (! (flags & INIT_ED_KEY_NEEDCERT)) - return keypair; - - tor_assert(signing_key); - tor_assert(cert_out); - uint32_t cert_flags = 0; - if (flags & INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT) - cert_flags |= CERT_FLAG_INCLUDE_SIGNING_KEY; - tor_cert_t *cert = tor_cert_create(signing_key, cert_type, - &keypair->pubkey, - now, lifetime, - cert_flags); - if (! cert) - goto err; - - *cert_out = cert; - return keypair; - - err: - tor_free(keypair); - return NULL; -} - -static ed25519_keypair_t *master_identity_key = NULL; -static ed25519_keypair_t *master_signing_key = NULL; -static ed25519_keypair_t *current_auth_key = NULL; -static tor_cert_t *signing_key_cert = NULL; -static tor_cert_t *link_cert_cert = NULL; -static tor_cert_t *auth_key_cert = NULL; - -static uint8_t *rsa_ed_crosscert = NULL; -static size_t rsa_ed_crosscert_len = 0; -static time_t rsa_ed_crosscert_expiration = 0; - -/** - * Running as a server: load, reload, or refresh our ed25519 keys and - * certificates, creating and saving new ones as needed. - * - * Return -1 on failure; 0 on success if the signing key was not replaced; - * and 1 on success if the signing key was replaced. - */ -int -load_ed_keys(const or_options_t *options, time_t now) -{ - ed25519_keypair_t *id = NULL; - ed25519_keypair_t *sign = NULL; - ed25519_keypair_t *auth = NULL; - const ed25519_keypair_t *sign_signing_key_with_id = NULL; - const ed25519_keypair_t *use_signing = NULL; - const tor_cert_t *check_signing_cert = NULL; - tor_cert_t *sign_cert = NULL; - tor_cert_t *auth_cert = NULL; - int signing_key_changed = 0; - - // It is later than 1972, since otherwise there would be no C compilers. - // (Try to diagnose #22466.) - tor_assert_nonfatal(now >= 2 * 365 * 86400); - -#define FAIL(msg) do { \ - log_warn(LD_OR, (msg)); \ - goto err; \ - } while (0) -#define SET_KEY(key, newval) do { \ - if ((key) != (newval)) \ - ed25519_keypair_free(key); \ - key = (newval); \ - } while (0) -#define SET_CERT(cert, newval) do { \ - if ((cert) != (newval)) \ - tor_cert_free(cert); \ - cert = (newval); \ - } while (0) -#define HAPPENS_SOON(when, interval) \ - ((when) < now + (interval)) -#define EXPIRES_SOON(cert, interval) \ - (!(cert) || HAPPENS_SOON((cert)->valid_until, (interval))) - - /* XXXX support encrypted identity keys fully */ - - /* First try to get the signing key to see how it is. */ - { - char *fname = - options_get_keydir_fname(options, "ed25519_signing"); - sign = ed_key_init_from_file( - fname, - INIT_ED_KEY_NEEDCERT| - INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT, - LOG_INFO, - NULL, 0, 0, CERT_TYPE_ID_SIGNING, &sign_cert); - tor_free(fname); - check_signing_cert = sign_cert; - use_signing = sign; - } - - if (use_signing) { - /* We loaded a signing key with its certificate. */ - if (! master_signing_key) { - /* We didn't know one before! */ - signing_key_changed = 1; - } else if (! ed25519_pubkey_eq(&use_signing->pubkey, - &master_signing_key->pubkey) || - ! tor_memeq(use_signing->seckey.seckey, - master_signing_key->seckey.seckey, - ED25519_SECKEY_LEN)) { - /* We loaded a different signing key than the one we knew before. */ - signing_key_changed = 1; - } - } - - if (!use_signing && master_signing_key) { - /* We couldn't load a signing key, but we already had one loaded */ - check_signing_cert = signing_key_cert; - use_signing = master_signing_key; - } - - const int offline_master = - options->OfflineMasterKey && options->command != CMD_KEYGEN; - const int need_new_signing_key = - NULL == use_signing || - EXPIRES_SOON(check_signing_cert, 0) || - (options->command == CMD_KEYGEN && ! options->change_key_passphrase); - const int want_new_signing_key = - need_new_signing_key || - EXPIRES_SOON(check_signing_cert, options->TestingSigningKeySlop); - - /* We can only create a master key if we haven't been told that the - * master key will always be offline. Also, if we have a signing key, - * then we shouldn't make a new master ID key. */ - const int can_make_master_id_key = !offline_master && - NULL == use_signing; - - if (need_new_signing_key) { - log_notice(LD_OR, "It looks like I need to generate and sign a new " - "medium-term signing key, because %s. To do that, I " - "need to load%s the permanent master identity key. " - "If the master identity key was not moved or encrypted " - "with a passphrase, this will be done automatically and " - "no further action is required. Otherwise, provide the " - "necessary data using 'tor --keygen' to do it manually.", - (NULL == use_signing) ? "I don't have one" : - EXPIRES_SOON(check_signing_cert, 0) ? "the one I have is expired" : - "you asked me to make one with --keygen", - can_make_master_id_key ? " (or create)" : ""); - } else if (want_new_signing_key && !offline_master) { - log_notice(LD_OR, "It looks like I should try to generate and sign a " - "new medium-term signing key, because the one I have is " - "going to expire soon. To do that, I'm going to have to " - "try to load the permanent master identity key. " - "If the master identity key was not moved or encrypted " - "with a passphrase, this will be done automatically and " - "no further action is required. Otherwise, provide the " - "necessary data using 'tor --keygen' to do it manually."); - } else if (want_new_signing_key) { - log_notice(LD_OR, "It looks like I should try to generate and sign a " - "new medium-term signing key, because the one I have is " - "going to expire soon. But OfflineMasterKey is set, so I " - "won't try to load a permanent master identity key. You " - "will need to use 'tor --keygen' to make a new signing " - "key and certificate."); - } - - { - uint32_t flags = - (INIT_ED_KEY_SPLIT| - INIT_ED_KEY_EXTRA_STRONG|INIT_ED_KEY_NO_REPAIR); - if (can_make_master_id_key) - flags |= INIT_ED_KEY_CREATE; - if (! need_new_signing_key) - flags |= INIT_ED_KEY_MISSING_SECRET_OK; - if (! want_new_signing_key || offline_master) - flags |= INIT_ED_KEY_OMIT_SECRET; - if (offline_master) - flags |= INIT_ED_KEY_OFFLINE_SECRET; - if (options->command == CMD_KEYGEN) - flags |= INIT_ED_KEY_TRY_ENCRYPTED; - - /* Check/Create the key directory */ - if (create_keys_directory(options) < 0) - return -1; - - char *fname; - if (options->master_key_fname) { - fname = tor_strdup(options->master_key_fname); - flags |= INIT_ED_KEY_EXPLICIT_FNAME; - } else { - fname = options_get_keydir_fname(options, "ed25519_master_id"); - } - id = ed_key_init_from_file( - fname, - flags, - LOG_WARN, NULL, 0, 0, 0, NULL); - tor_free(fname); - if (!id) { - if (need_new_signing_key) { - if (offline_master) - FAIL("Can't load master identity key; OfflineMasterKey is set."); - else - FAIL("Missing identity key"); - } else { - log_warn(LD_OR, "Master public key was absent; inferring from " - "public key in signing certificate and saving to disk."); - tor_assert(check_signing_cert); - id = tor_malloc_zero(sizeof(*id)); - memcpy(&id->pubkey, &check_signing_cert->signing_key, - sizeof(ed25519_public_key_t)); - fname = options_get_keydir_fname(options, - "ed25519_master_id_public_key"); - if (ed25519_pubkey_write_to_file(&id->pubkey, fname, "type0") < 0) { - log_warn(LD_OR, "Error while attempting to write master public key " - "to disk"); - tor_free(fname); - goto err; - } - tor_free(fname); - } - } - if (tor_mem_is_zero((char*)id->seckey.seckey, sizeof(id->seckey))) - sign_signing_key_with_id = NULL; - else - sign_signing_key_with_id = id; - } - - if (master_identity_key && - !ed25519_pubkey_eq(&id->pubkey, &master_identity_key->pubkey)) { - FAIL("Identity key on disk does not match key we loaded earlier!"); - } - - if (need_new_signing_key && NULL == sign_signing_key_with_id) - FAIL("Can't load master key make a new signing key."); - - if (sign_cert) { - if (! sign_cert->signing_key_included) - FAIL("Loaded a signing cert with no key included!"); - if (! ed25519_pubkey_eq(&sign_cert->signing_key, &id->pubkey)) - FAIL("The signing cert we have was not signed with the master key " - "we loaded!"); - if (tor_cert_checksig(sign_cert, &id->pubkey, 0) < 0) - FAIL("The signing cert we loaded was not signed correctly!"); - } - - if (want_new_signing_key && sign_signing_key_with_id) { - uint32_t flags = (INIT_ED_KEY_CREATE| - INIT_ED_KEY_REPLACE| - INIT_ED_KEY_EXTRA_STRONG| - INIT_ED_KEY_NEEDCERT| - INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT); - char *fname = - options_get_keydir_fname(options, "ed25519_signing"); - ed25519_keypair_free(sign); - tor_cert_free(sign_cert); - sign = ed_key_init_from_file(fname, - flags, LOG_WARN, - sign_signing_key_with_id, now, - options->SigningKeyLifetime, - CERT_TYPE_ID_SIGNING, &sign_cert); - tor_free(fname); - if (!sign) - FAIL("Missing signing key"); - use_signing = sign; - signing_key_changed = 1; - - tor_assert(sign_cert->signing_key_included); - tor_assert(ed25519_pubkey_eq(&sign_cert->signing_key, &id->pubkey)); - tor_assert(ed25519_pubkey_eq(&sign_cert->signed_key, &sign->pubkey)); - } else if (want_new_signing_key) { - static ratelim_t missing_master = RATELIM_INIT(3600); - log_fn_ratelim(&missing_master, LOG_WARN, LD_OR, - "Signing key will expire soon, but I can't load the " - "master key to sign a new one!"); - } - - tor_assert(use_signing); - - /* At this point we no longer need our secret identity key. So wipe - * it, if we loaded it in the first place. */ - memwipe(id->seckey.seckey, 0, sizeof(id->seckey)); - - if (options->command == CMD_KEYGEN) - goto end; - - if (server_mode(options) && - (!rsa_ed_crosscert || - HAPPENS_SOON(rsa_ed_crosscert_expiration, 30*86400))) { - uint8_t *crosscert; - time_t expiration = now+6*30*86400; /* 6 months in the future. */ - ssize_t crosscert_len = tor_make_rsa_ed25519_crosscert(&id->pubkey, - get_server_identity_key(), - expiration, - &crosscert); - tor_free(rsa_ed_crosscert); - rsa_ed_crosscert_len = crosscert_len; - rsa_ed_crosscert = crosscert; - rsa_ed_crosscert_expiration = expiration; - } - - if (!current_auth_key || - signing_key_changed || - EXPIRES_SOON(auth_key_cert, options->TestingAuthKeySlop)) { - auth = ed_key_new(use_signing, INIT_ED_KEY_NEEDCERT, - now, - options->TestingAuthKeyLifetime, - CERT_TYPE_SIGNING_AUTH, &auth_cert); - - if (!auth) - FAIL("Can't create auth key"); - } - - /* We've generated or loaded everything. Put them in memory. */ - - end: - if (! master_identity_key) { - SET_KEY(master_identity_key, id); - } else { - tor_free(id); - } - if (sign) { - SET_KEY(master_signing_key, sign); - SET_CERT(signing_key_cert, sign_cert); - } - if (auth) { - SET_KEY(current_auth_key, auth); - SET_CERT(auth_key_cert, auth_cert); - } - - return signing_key_changed; - err: - ed25519_keypair_free(id); - ed25519_keypair_free(sign); - ed25519_keypair_free(auth); - tor_cert_free(sign_cert); - tor_cert_free(auth_cert); - return -1; -} - -/** - * Retrieve our currently-in-use Ed25519 link certificate and id certificate, - * and, if they would expire soon (based on the time now, generate new - * certificates (without embedding the public part of the signing key inside). - * If force is true, always generate a new certificate. - * - * The signed_key from the current id->signing certificate will be used to - * sign the new key within newly generated X509 certificate. - * - * Returns -1 upon error. Otherwise, returns 0 upon success (either when the - * current certificate is still valid, or when a new certificate was - * successfully generated, or no certificate was needed). - */ -int -generate_ed_link_cert(const or_options_t *options, time_t now, - int force) -{ - const tor_x509_cert_t *link_ = NULL, *id = NULL; - tor_cert_t *link_cert = NULL; - - if (tor_tls_get_my_certs(1, &link_, &id) < 0 || link_ == NULL) { - if (!server_mode(options)) { - /* No need to make an Ed25519->Link cert: we are a client */ - return 0; - } - log_warn(LD_OR, "Can't get my x509 link cert."); - return -1; - } - - const common_digests_t *digests = tor_x509_cert_get_cert_digests(link_); - - if (force == 0 && - link_cert_cert && - ! EXPIRES_SOON(link_cert_cert, options->TestingLinkKeySlop) && - fast_memeq(digests->d[DIGEST_SHA256], link_cert_cert->signed_key.pubkey, - DIGEST256_LEN)) { - return 0; - } - - ed25519_public_key_t dummy_key; - memcpy(dummy_key.pubkey, digests->d[DIGEST_SHA256], DIGEST256_LEN); - - link_cert = tor_cert_create(get_master_signing_keypair(), - CERT_TYPE_SIGNING_LINK, - &dummy_key, - now, - options->TestingLinkCertLifetime, 0); - - if (link_cert) { - SET_CERT(link_cert_cert, link_cert); - } - return 0; -} - -#undef FAIL -#undef SET_KEY -#undef SET_CERT - -/** - * Return 1 if any of the following are true: - * - * - if one of our Ed25519 signing, auth, or link certificates would expire - * soon w.r.t. the time now, - * - if we do not currently have a link certificate, or - * - if our cached Ed25519 link certificate is not same as the one we're - * currently using. - * - * Otherwise, returns 0. - */ -int -should_make_new_ed_keys(const or_options_t *options, const time_t now) -{ - if (!master_identity_key || - !master_signing_key || - !current_auth_key || - !link_cert_cert || - EXPIRES_SOON(signing_key_cert, options->TestingSigningKeySlop) || - EXPIRES_SOON(auth_key_cert, options->TestingAuthKeySlop) || - EXPIRES_SOON(link_cert_cert, options->TestingLinkKeySlop)) - return 1; - - const tor_x509_cert_t *link_ = NULL, *id = NULL; - - if (tor_tls_get_my_certs(1, &link_, &id) < 0 || link_ == NULL) - return 1; - - const common_digests_t *digests = tor_x509_cert_get_cert_digests(link_); - - if (!fast_memeq(digests->d[DIGEST_SHA256], - link_cert_cert->signed_key.pubkey, - DIGEST256_LEN)) { - return 1; - } - - return 0; -} - -#undef EXPIRES_SOON -#undef HAPPENS_SOON - -#ifdef TOR_UNIT_TESTS -/* Helper for unit tests: populate the ed25519 keys without saving or - * loading */ -void -init_mock_ed_keys(const crypto_pk_t *rsa_identity_key) -{ - routerkeys_free_all(); - -#define MAKEKEY(k) \ - k = tor_malloc_zero(sizeof(*k)); \ - if (ed25519_keypair_generate(k, 0) < 0) { \ - log_warn(LD_BUG, "Couldn't make a keypair"); \ - goto err; \ - } - MAKEKEY(master_identity_key); - MAKEKEY(master_signing_key); - MAKEKEY(current_auth_key); -#define MAKECERT(cert, signing, signed_, type, flags) \ - cert = tor_cert_create(signing, \ - type, \ - &signed_->pubkey, \ - time(NULL), 86400, \ - flags); \ - if (!cert) { \ - log_warn(LD_BUG, "Couldn't make a %s certificate!", #cert); \ - goto err; \ - } - - MAKECERT(signing_key_cert, - master_identity_key, master_signing_key, CERT_TYPE_ID_SIGNING, - CERT_FLAG_INCLUDE_SIGNING_KEY); - MAKECERT(auth_key_cert, - master_signing_key, current_auth_key, CERT_TYPE_SIGNING_AUTH, 0); - - if (generate_ed_link_cert(get_options(), time(NULL), 0) < 0) { - log_warn(LD_BUG, "Couldn't make link certificate"); - goto err; - } - - rsa_ed_crosscert_len = tor_make_rsa_ed25519_crosscert( - &master_identity_key->pubkey, - rsa_identity_key, - time(NULL)+86400, - &rsa_ed_crosscert); - - return; - - err: - routerkeys_free_all(); - tor_assert_nonfatal_unreached(); -} -#undef MAKEKEY -#undef MAKECERT -#endif /* defined(TOR_UNIT_TESTS) */ - -/** - * Print the ISO8601-formated expiration for a certificate with - * some description to stdout. - * - * For example, for a signing certificate, this might print out: - * signing-cert-expiry: 2017-07-25 08:30:15 UTC - */ -static void -print_cert_expiration(const char *expiration, - const char *description) -{ - fprintf(stderr, "%s-cert-expiry: %s\n", description, expiration); -} - -/** - * Log when a certificate, cert, with some description and - * stored in a file named fname, is going to expire. - */ -static void -log_ed_cert_expiration(const tor_cert_t *cert, - const char *description, - const char *fname) { - char expiration[ISO_TIME_LEN+1]; - - if (BUG(!cert)) { /* If the specified key hasn't been loaded */ - log_warn(LD_OR, "No %s key loaded; can't get certificate expiration.", - description); - } else { - format_local_iso_time(expiration, cert->valid_until); - log_notice(LD_OR, "The %s certificate stored in %s is valid until %s.", - description, fname, expiration); - print_cert_expiration(expiration, description); - } -} - -/** - * Log when our master signing key certificate expires. Used when tor is given - * the --key-expiration command-line option. - * - * Returns 0 on success and 1 on failure. - */ -static int -log_master_signing_key_cert_expiration(const or_options_t *options) -{ - const tor_cert_t *signing_key; - char *fn = NULL; - int failed = 0; - time_t now = approx_time(); - - fn = options_get_keydir_fname(options, "ed25519_signing_cert"); - - /* Try to grab our cached copy of the key. */ - signing_key = get_master_signing_key_cert(); - - tor_assert(server_identity_key_is_set()); - - /* Load our keys from disk, if necessary. */ - if (!signing_key) { - failed = load_ed_keys(options, now) < 0; - signing_key = get_master_signing_key_cert(); - } - - /* If we do have a signing key, log the expiration time. */ - if (signing_key) { - log_ed_cert_expiration(signing_key, "signing", fn); - } else { - log_warn(LD_OR, "Could not load signing key certificate from %s, so " \ - "we couldn't learn anything about certificate expiration.", fn); - } - - tor_free(fn); - - return failed; -} - -/** - * Log when a key certificate expires. Used when tor is given the - * --key-expiration command-line option. - * - * If an command argument is given, which should specify the type of - * key to get expiry information about (currently supported arguments - * are "sign"), get info about that type of certificate. Otherwise, - * print info about the supported arguments. - * - * Returns 0 on success and -1 on failure. - */ -int -log_cert_expiration(void) -{ - const or_options_t *options = get_options(); - const char *arg = options->command_arg; - - if (!strcmp(arg, "sign")) { - return log_master_signing_key_cert_expiration(options); - } else { - fprintf(stderr, "No valid argument to --key-expiration found!\n"); - fprintf(stderr, "Currently recognised arguments are: 'sign'\n"); - - return -1; - } -} - -const ed25519_public_key_t * -get_master_identity_key(void) -{ - if (!master_identity_key) - return NULL; - return &master_identity_key->pubkey; -} - -/** Return true iff id is our Ed25519 master identity key. */ -int -router_ed25519_id_is_me(const ed25519_public_key_t *id) -{ - return id && master_identity_key && - ed25519_pubkey_eq(id, &master_identity_key->pubkey); -} - -#ifdef TOR_UNIT_TESTS -/* only exists for the unit tests, since otherwise the identity key - * should be used to sign nothing but the signing key. */ -const ed25519_keypair_t * -get_master_identity_keypair(void) -{ - return master_identity_key; -} -#endif /* defined(TOR_UNIT_TESTS) */ - -const ed25519_keypair_t * -get_master_signing_keypair(void) -{ - return master_signing_key; -} - -const struct tor_cert_st * -get_master_signing_key_cert(void) -{ - return signing_key_cert; -} - -const ed25519_keypair_t * -get_current_auth_keypair(void) -{ - return current_auth_key; -} - -const tor_cert_t * -get_current_link_cert_cert(void) -{ - return link_cert_cert; -} - -const tor_cert_t * -get_current_auth_key_cert(void) -{ - return auth_key_cert; -} - -void -get_master_rsa_crosscert(const uint8_t **cert_out, - size_t *size_out) -{ - *cert_out = rsa_ed_crosscert; - *size_out = rsa_ed_crosscert_len; -} - -/** Construct cross-certification for the master identity key with - * the ntor onion key. Store the sign of the corresponding ed25519 public key - * in *sign_out. */ -tor_cert_t * -make_ntor_onion_key_crosscert(const curve25519_keypair_t *onion_key, - const ed25519_public_key_t *master_id_key, time_t now, time_t lifetime, - int *sign_out) -{ - tor_cert_t *cert = NULL; - ed25519_keypair_t ed_onion_key; - - if (ed25519_keypair_from_curve25519_keypair(&ed_onion_key, sign_out, - onion_key) < 0) - goto end; - - cert = tor_cert_create(&ed_onion_key, CERT_TYPE_ONION_ID, master_id_key, - now, lifetime, 0); - - end: - memwipe(&ed_onion_key, 0, sizeof(ed_onion_key)); - return cert; -} - -/** Construct and return an RSA signature for the TAP onion key to - * cross-certify the RSA and Ed25519 identity keys. Set len_out to its - * length. */ -uint8_t * -make_tap_onion_key_crosscert(const crypto_pk_t *onion_key, - const ed25519_public_key_t *master_id_key, - const crypto_pk_t *rsa_id_key, - int *len_out) -{ - uint8_t signature[PK_BYTES]; - uint8_t signed_data[DIGEST_LEN + ED25519_PUBKEY_LEN]; - - *len_out = 0; - if (crypto_pk_get_digest(rsa_id_key, (char*)signed_data) < 0) { - return NULL; - } - memcpy(signed_data + DIGEST_LEN, master_id_key->pubkey, ED25519_PUBKEY_LEN); - - int r = crypto_pk_private_sign(onion_key, - (char*)signature, sizeof(signature), - (const char*)signed_data, sizeof(signed_data)); - if (r < 0) - return NULL; - - *len_out = r; - - return tor_memdup(signature, r); -} - -/** Check whether an RSA-TAP cross-certification is correct. Return 0 if it - * is, -1 if it isn't. */ -MOCK_IMPL(int, -check_tap_onion_key_crosscert,(const uint8_t *crosscert, - int crosscert_len, - const crypto_pk_t *onion_pkey, - const ed25519_public_key_t *master_id_pkey, - const uint8_t *rsa_id_digest)) -{ - uint8_t *cc = tor_malloc(crypto_pk_keysize(onion_pkey)); - int cc_len = - crypto_pk_public_checksig(onion_pkey, - (char*)cc, - crypto_pk_keysize(onion_pkey), - (const char*)crosscert, - crosscert_len); - if (cc_len < 0) { - goto err; - } - if (cc_len < DIGEST_LEN + ED25519_PUBKEY_LEN) { - log_warn(LD_DIR, "Short signature on cross-certification with TAP key"); - goto err; - } - if (tor_memneq(cc, rsa_id_digest, DIGEST_LEN) || - tor_memneq(cc + DIGEST_LEN, master_id_pkey->pubkey, - ED25519_PUBKEY_LEN)) { - log_warn(LD_DIR, "Incorrect cross-certification with TAP key"); - goto err; - } - - tor_free(cc); - return 0; - err: - tor_free(cc); - return -1; -} - -void -routerkeys_free_all(void) -{ - ed25519_keypair_free(master_identity_key); - ed25519_keypair_free(master_signing_key); - ed25519_keypair_free(current_auth_key); - tor_cert_free(signing_key_cert); - tor_cert_free(link_cert_cert); - tor_cert_free(auth_key_cert); - tor_free(rsa_ed_crosscert); - - master_identity_key = master_signing_key = NULL; - current_auth_key = NULL; - signing_key_cert = link_cert_cert = auth_key_cert = NULL; - rsa_ed_crosscert = NULL; // redundant - rsa_ed_crosscert_len = 0; -} - diff --git a/src/tor/src/or/routerkeys.h b/src/tor/src/or/routerkeys.h deleted file mode 100644 index 3e67952ea..000000000 --- a/src/tor/src/or/routerkeys.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_ROUTERKEYS_H -#define TOR_ROUTERKEYS_H - -#include "crypto_ed25519.h" - -#define INIT_ED_KEY_CREATE (1u<<0) -#define INIT_ED_KEY_REPLACE (1u<<1) -#define INIT_ED_KEY_SPLIT (1u<<2) -#define INIT_ED_KEY_MISSING_SECRET_OK (1u<<3) -#define INIT_ED_KEY_NEEDCERT (1u<<4) -#define INIT_ED_KEY_EXTRA_STRONG (1u<<5) -#define INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT (1u<<6) -#define INIT_ED_KEY_OMIT_SECRET (1u<<7) -#define INIT_ED_KEY_TRY_ENCRYPTED (1u<<8) -#define INIT_ED_KEY_NO_REPAIR (1u<<9) -#define INIT_ED_KEY_SUGGEST_KEYGEN (1u<<10) -#define INIT_ED_KEY_OFFLINE_SECRET (1u<<11) -#define INIT_ED_KEY_EXPLICIT_FNAME (1u<<12) - -struct tor_cert_st; -ed25519_keypair_t *ed_key_init_from_file(const char *fname, uint32_t flags, - int severity, - const ed25519_keypair_t *signing_key, - time_t now, - time_t lifetime, - uint8_t cert_type, - struct tor_cert_st **cert_out); -ed25519_keypair_t *ed_key_new(const ed25519_keypair_t *signing_key, - uint32_t flags, - time_t now, - time_t lifetime, - uint8_t cert_type, - struct tor_cert_st **cert_out); -const ed25519_public_key_t *get_master_identity_key(void); -const ed25519_keypair_t *get_master_signing_keypair(void); -const struct tor_cert_st *get_master_signing_key_cert(void); - -const ed25519_keypair_t *get_current_auth_keypair(void); -const struct tor_cert_st *get_current_link_cert_cert(void); -const struct tor_cert_st *get_current_auth_key_cert(void); - -void get_master_rsa_crosscert(const uint8_t **cert_out, - size_t *size_out); - -int router_ed25519_id_is_me(const ed25519_public_key_t *id); - -struct tor_cert_st *make_ntor_onion_key_crosscert( - const curve25519_keypair_t *onion_key, - const ed25519_public_key_t *master_id_key, - time_t now, time_t lifetime, - int *sign_out); -uint8_t *make_tap_onion_key_crosscert(const crypto_pk_t *onion_key, - const ed25519_public_key_t *master_id_key, - const crypto_pk_t *rsa_id_key, - int *len_out); - -MOCK_DECL(int, check_tap_onion_key_crosscert,(const uint8_t *crosscert, - int crosscert_len, - const crypto_pk_t *onion_pkey, - const ed25519_public_key_t *master_id_pkey, - const uint8_t *rsa_id_digest)); - -int log_cert_expiration(void); -int load_ed_keys(const or_options_t *options, time_t now); -int should_make_new_ed_keys(const or_options_t *options, const time_t now); - -int generate_ed_link_cert(const or_options_t *options, time_t now, int force); - -int read_encrypted_secret_key(ed25519_secret_key_t *out, - const char *fname); -int write_encrypted_secret_key(const ed25519_secret_key_t *out, - const char *fname); - -void routerkeys_free_all(void); - -#ifdef TOR_UNIT_TESTS -const ed25519_keypair_t *get_master_identity_keypair(void); -void init_mock_ed_keys(const crypto_pk_t *rsa_identity_key); -#endif - -#endif /* !defined(TOR_ROUTERKEYS_H) */ - diff --git a/src/tor/src/or/routerset.h b/src/tor/src/or/routerset.h deleted file mode 100644 index 53e8c66c5..000000000 --- a/src/tor/src/or/routerset.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file routerlist.h - * \brief Header file for routerset.c - **/ - -#ifndef TOR_ROUTERSET_H -#define TOR_ROUTERSET_H - -routerset_t *routerset_new(void); -void routerset_refresh_countries(routerset_t *rs); -int routerset_parse(routerset_t *target, const char *s, - const char *description); -void routerset_union(routerset_t *target, const routerset_t *source); -int routerset_is_list(const routerset_t *set); -int routerset_needs_geoip(const routerset_t *set); -int routerset_is_empty(const routerset_t *set); -int routerset_contains_router(const routerset_t *set, const routerinfo_t *ri, - country_t country); -int routerset_contains_routerstatus(const routerset_t *set, - const routerstatus_t *rs, - country_t country); -int routerset_contains_extendinfo(const routerset_t *set, - const extend_info_t *ei); -struct bridge_info_t; -int routerset_contains_bridge(const routerset_t *set, - const struct bridge_info_t *bridge); -int routerset_contains_node(const routerset_t *set, const node_t *node); - -void routerset_get_all_nodes(smartlist_t *out, const routerset_t *routerset, - const routerset_t *excludeset, - int running_only); -int routerset_add_unknown_ccs(routerset_t **setp, int only_if_some_cc_set); -void routerset_subtract_nodes(smartlist_t *out, - const routerset_t *routerset); - -char *routerset_to_string(const routerset_t *routerset); -int routerset_equal(const routerset_t *old, const routerset_t *new); -void routerset_free_(routerset_t *routerset); -#define routerset_free(rs) FREE_AND_NULL(routerset_t, routerset_free_, (rs)) -int routerset_len(const routerset_t *set); - -#ifdef ROUTERSET_PRIVATE -STATIC char * routerset_get_countryname(const char *c); -STATIC int routerset_contains(const routerset_t *set, const tor_addr_t *addr, - uint16_t orport, - const char *nickname, const char *id_digest, - country_t country); - -/** A routerset specifies constraints on a set of possible routerinfos, based - * on their names, identities, or addresses. It is optimized for determining - * whether a router is a member or not, in O(1+P) time, where P is the number - * of address policy constraints. */ -struct routerset_t { - /** A list of strings for the elements of the policy. Each string is either - * a nickname, a hexadecimal identity fingerprint, or an address policy. A - * router belongs to the set if its nickname OR its identity OR its address - * matches an entry here. */ - smartlist_t *list; - /** A map from lowercase nicknames of routers in the set to (void*)1 */ - strmap_t *names; - /** A map from identity digests routers in the set to (void*)1 */ - digestmap_t *digests; - /** An address policy for routers in the set. For implementation reasons, - * a router belongs to the set if it is _rejected_ by this policy. */ - smartlist_t *policies; - - /** A human-readable description of what this routerset is for. Used in - * log messages. */ - char *description; - - /** A list of the country codes in this set. */ - smartlist_t *country_names; - /** Total number of countries we knew about when we built countries.*/ - int n_countries; - /** Bit array mapping the return value of geoip_get_country() to 1 iff the - * country is a member of this routerset. Note that we MUST call - * routerset_refresh_countries() whenever the geoip country list is - * reloaded. */ - bitarray_t *countries; -}; -#endif /* defined(ROUTERSET_PRIVATE) */ -#endif /* !defined(TOR_ROUTERSET_H) */ - diff --git a/src/tor/src/or/scheduler.c b/src/tor/src/or/scheduler.c deleted file mode 100644 index cd047d5a7..000000000 --- a/src/tor/src/or/scheduler.c +++ /dev/null @@ -1,758 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "config.h" - -#include "compat_libevent.h" -#define SCHEDULER_PRIVATE_ -#define SCHEDULER_KIST_PRIVATE -#include "scheduler.h" -#include "main.h" -#include "buffers.h" -#define TOR_CHANNEL_INTERNAL_ -#include "channeltls.h" - -#include - -/** - * \file scheduler.c - * \brief Channel scheduling system: decides which channels should send and - * receive when. - * - * This module is the global/common parts of the scheduling system. This system - * is what decides what channels get to send cells on their circuits and when. - * - * Terms: - * - "Scheduling system": the collection of scheduler*.{h,c} files and their - * aggregate behavior. - * - "Scheduler implementation": a scheduler_t. The scheduling system has one - * active scheduling implementation at a time. - * - * In this file you will find state that any scheduler implementation can have - * access to as well as the functions the rest of Tor uses to interact with the - * scheduling system. - * - * The earliest versions of Tor approximated a kind of round-robin system - * among active connections, but only approximated it. It would only consider - * one connection (roughly equal to a channel in today's terms) at a time, and - * thus could only prioritize circuits against others on the same connection. - * - * Then in response to the KIST paper[0], Tor implemented a global - * circuit scheduler. It was supposed to prioritize circuits across many - * channels, but wasn't effective. It is preserved in scheduler_vanilla.c. - * - * [0]: http://www.robgjansen.com/publications/kist-sec2014.pdf - * - * Then we actually got around to implementing KIST for real. We decided to - * modularize the scheduler so new ones can be implemented. You can find KIST - * in scheduler_kist.c. - * - * Channels have one of four scheduling states based on whether or not they - * have cells to send and whether or not they are able to send. - * - *
        - *
      1. - * Not open for writes, no cells to send. - *
        • Not much to do here, and the channel will have scheduler_state - * == SCHED_CHAN_IDLE - *
        • Transitions from: - *
            - *
          • Open for writes/has cells by simultaneously draining all circuit - * queues and filling the output buffer. - *
          - *
        • Transitions to: - *
            - *
          • Not open for writes/has cells by arrival of cells on an attached - * circuit (this would be driven from append_cell_to_circuit_queue()) - *
          • Open for writes/no cells by a channel type specific path; - * driven from connection_or_flushed_some() for channel_tls_t. - *
          - *
        - * - *
      2. Open for writes, no cells to send - *
          - *
        • Not much here either; this will be the state an idle but open - * channel can be expected to settle in. It will have scheduler_state - * == SCHED_CHAN_WAITING_FOR_CELLS - *
        • Transitions from: - *
            - *
          • Not open for writes/no cells by flushing some of the output - * buffer. - *
          • Open for writes/has cells by the scheduler moving cells from - * circuit queues to channel output queue, but not having enough - * to fill the output queue. - *
          - *
        • Transitions to: - *
            - *
          • Open for writes/has cells by arrival of new cells on an attached - * circuit, in append_cell_to_circuit_queue() - *
          - *
        - * - *
      3. Not open for writes, cells to send - *
          - *
        • This is the state of a busy circuit limited by output bandwidth; - * cells have piled up in the circuit queues waiting to be relayed. - * The channel will have scheduler_state == SCHED_CHAN_WAITING_TO_WRITE. - *
        • Transitions from: - *
            - *
          • Not open for writes/no cells by arrival of cells on an attached - * circuit - *
          • Open for writes/has cells by filling an output buffer without - * draining all cells from attached circuits - *
          - *
        • Transitions to: - *
            - *
          • Opens for writes/has cells by draining some of the output buffer - * via the connection_or_flushed_some() path (for channel_tls_t). - *
          - *
        - * - *
      4. Open for writes, cells to send - *
          - *
        • This connection is ready to relay some cells and waiting for - * the scheduler to choose it. The channel will have scheduler_state == - * SCHED_CHAN_PENDING. - *
        • Transitions from: - *
            - *
          • Not open for writes/has cells by the connection_or_flushed_some() - * path - *
          • Open for writes/no cells by the append_cell_to_circuit_queue() - * path - *
          - *
        • Transitions to: - *
            - *
          • Not open for writes/no cells by draining all circuit queues and - * simultaneously filling the output buffer. - *
          • Not open for writes/has cells by writing enough cells to fill the - * output buffer - *
          • Open for writes/no cells by draining all attached circuit queues - * without also filling the output buffer - *
          - *
        - *
      - * - * Other event-driven parts of the code move channels between these scheduling - * states by calling scheduler functions. The scheduling system builds up a - * list of channels in the SCHED_CHAN_PENDING state that the scheduler - * implementation should then use when it runs. Scheduling implementations need - * to properly update channel states during their scheduler_t->run() function - * as that is the only opportunity for channels to move from SCHED_CHAN_PENDING - * to any other state. - * - * The remainder of this file is a small amount of state that any scheduler - * implementation should have access to, and the functions the rest of Tor uses - * to interact with the scheduling system. - */ - -/***************************************************************************** - * Scheduling system state - * - * State that can be accessed from any scheduler implementation (but not - * outside the scheduling system) - *****************************************************************************/ - -/** DOCDOC */ -STATIC const scheduler_t *the_scheduler; - -/** - * We keep a list of channels that are pending - i.e, have cells to write - * and can accept them to send. The enum scheduler_state in channel_t - * is reserved for our use. - * - * Priority queue of channels that can write and have cells (pending work) - */ -STATIC smartlist_t *channels_pending = NULL; - -/** - * This event runs the scheduler from its callback, and is manually - * activated whenever a channel enters open for writes/cells to send. - */ -STATIC struct event *run_sched_ev = NULL; - -static int have_logged_kist_suddenly_disabled = 0; - -/***************************************************************************** - * Scheduling system static function definitions - * - * Functions that can only be accessed from this file. - *****************************************************************************/ - -/** Return a human readable string for the given scheduler type. */ -static const char * -get_scheduler_type_string(scheduler_types_t type) -{ - switch (type) { - case SCHEDULER_VANILLA: - return "Vanilla"; - case SCHEDULER_KIST: - return "KIST"; - case SCHEDULER_KIST_LITE: - return "KISTLite"; - case SCHEDULER_NONE: - /* fallthrough */ - default: - tor_assert_unreached(); - return "(N/A)"; - } -} - -/** - * Scheduler event callback; this should get triggered once per event loop - * if any scheduling work was created during the event loop. - */ -static void -scheduler_evt_callback(evutil_socket_t fd, short events, void *arg) -{ - (void) fd; - (void) events; - (void) arg; - - log_debug(LD_SCHED, "Scheduler event callback called"); - - /* Run the scheduler. This is a mandatory function. */ - - /* We might as well assert on this. If this function doesn't exist, no cells - * are getting scheduled. Things are very broken. scheduler_t says the run() - * function is mandatory. */ - tor_assert(the_scheduler->run); - the_scheduler->run(); - - /* Schedule itself back in if it has more work. */ - - /* Again, might as well assert on this mandatory scheduler_t function. If it - * doesn't exist, there's no way to tell libevent to run the scheduler again - * in the future. */ - tor_assert(the_scheduler->schedule); - the_scheduler->schedule(); -} - -/** Using the global options, select the scheduler we should be using. */ -static void -select_scheduler(void) -{ - scheduler_t *new_scheduler = NULL; - -#ifdef TOR_UNIT_TESTS - /* This is hella annoying to set in the options for every test that passes - * through the scheduler and there are many so if we don't explicitly have - * a list of types set, just put the vanilla one. */ - if (get_options()->SchedulerTypes_ == NULL) { - the_scheduler = get_vanilla_scheduler(); - return; - } -#endif /* defined(TOR_UNIT_TESTS) */ - - /* This list is ordered that is first entry has the first priority. Thus, as - * soon as we find a scheduler type that we can use, we use it and stop. */ - SMARTLIST_FOREACH_BEGIN(get_options()->SchedulerTypes_, int *, type) { - switch (*type) { - case SCHEDULER_VANILLA: - new_scheduler = get_vanilla_scheduler(); - goto end; - case SCHEDULER_KIST: - if (!scheduler_can_use_kist()) { -#ifdef HAVE_KIST_SUPPORT - if (!have_logged_kist_suddenly_disabled) { - /* We should only log this once in most cases. If it was the kernel - * losing support for kist that caused scheduler_can_use_kist() to - * return false, then this flag makes sure we only log this message - * once. If it was the consensus that switched from "yes use kist" - * to "no don't use kist", then we still set the flag so we log - * once, but we unset the flag elsewhere if we ever can_use_kist() - * again. - */ - have_logged_kist_suddenly_disabled = 1; - log_notice(LD_SCHED, "Scheduler type KIST has been disabled by " - "the consensus or no kernel support."); - } -#else /* !(defined(HAVE_KIST_SUPPORT)) */ - log_info(LD_SCHED, "Scheduler type KIST not built in"); -#endif /* defined(HAVE_KIST_SUPPORT) */ - continue; - } - /* This flag will only get set in one of two cases: - * 1 - the kernel lost support for kist. In that case, we don't expect to - * ever end up here - * 2 - the consensus went from "yes use kist" to "no don't use kist". - * We might end up here if the consensus changes back to "yes", in which - * case we might want to warn the user again if it goes back to "no" - * yet again. Thus we unset the flag */ - have_logged_kist_suddenly_disabled = 0; - new_scheduler = get_kist_scheduler(); - scheduler_kist_set_full_mode(); - goto end; - case SCHEDULER_KIST_LITE: - new_scheduler = get_kist_scheduler(); - scheduler_kist_set_lite_mode(); - goto end; - case SCHEDULER_NONE: - /* fallthrough */ - default: - /* Our option validation should have caught this. */ - tor_assert_unreached(); - } - } SMARTLIST_FOREACH_END(type); - - end: - if (new_scheduler == NULL) { - log_err(LD_SCHED, "Tor was unable to select a scheduler type. Please " - "make sure Schedulers is correctly configured with " - "what Tor does support."); - /* We weren't able to choose a scheduler which means that none of the ones - * set in Schedulers are supported or usable. We will respect the user - * wishes of using what it has been configured and don't do a sneaky - * fallback. Because this can be changed at runtime, we have to stop tor - * right now. */ - exit(1); // XXXX bad exit - } - - /* Set the chosen scheduler. */ - the_scheduler = new_scheduler; -} - -/** - * Helper function called from a few different places. It changes the - * scheduler implementation, if necessary. And if it did, it then tells the - * old one to free its state and the new one to initialize. - */ -static void -set_scheduler(void) -{ - const scheduler_t *old_scheduler = the_scheduler; - scheduler_types_t old_scheduler_type = SCHEDULER_NONE; - - /* We keep track of the type in order to log only if the type switched. We - * can't just use the scheduler pointers because KIST and KISTLite share the - * same object. */ - if (the_scheduler) { - old_scheduler_type = the_scheduler->type; - } - - /* From the options, select the scheduler type to set. */ - select_scheduler(); - tor_assert(the_scheduler); - - /* We look at the pointer difference in case the old sched and new sched - * share the same scheduler object, as is the case with KIST and KISTLite. */ - if (old_scheduler != the_scheduler) { - /* Allow the old scheduler to clean up, if needed. */ - if (old_scheduler && old_scheduler->free_all) { - old_scheduler->free_all(); - } - - /* Initialize the new scheduler. */ - if (the_scheduler->init) { - the_scheduler->init(); - } - } - - /* Finally we notice log if we switched schedulers. We use the type in case - * two schedulers share a scheduler object. */ - if (old_scheduler_type != the_scheduler->type) { - log_notice(LD_CONFIG, "Scheduler type %s has been enabled.", - get_scheduler_type_string(the_scheduler->type)); - } -} - -/***************************************************************************** - * Scheduling system private function definitions - * - * Functions that can only be accessed from scheduler*.c - *****************************************************************************/ - -/** Return the pending channel list. */ -smartlist_t * -get_channels_pending(void) -{ - return channels_pending; -} - -/** Comparison function to use when sorting pending channels. */ -MOCK_IMPL(int, -scheduler_compare_channels, (const void *c1_v, const void *c2_v)) -{ - const channel_t *c1 = NULL, *c2 = NULL; - /* These are a workaround for -Wbad-function-cast throwing a fit */ - const circuitmux_policy_t *p1, *p2; - uintptr_t p1_i, p2_i; - - tor_assert(c1_v); - tor_assert(c2_v); - - c1 = (const channel_t *)(c1_v); - c2 = (const channel_t *)(c2_v); - - if (c1 != c2) { - if (circuitmux_get_policy(c1->cmux) == - circuitmux_get_policy(c2->cmux)) { - /* Same cmux policy, so use the mux comparison */ - return circuitmux_compare_muxes(c1->cmux, c2->cmux); - } else { - /* - * Different policies; not important to get this edge case perfect - * because the current code never actually gives different channels - * different cmux policies anyway. Just use this arbitrary but - * definite choice. - */ - p1 = circuitmux_get_policy(c1->cmux); - p2 = circuitmux_get_policy(c2->cmux); - p1_i = (uintptr_t)p1; - p2_i = (uintptr_t)p2; - - return (p1_i < p2_i) ? -1 : 1; - } - } else { - /* c1 == c2, so always equal */ - return 0; - } -} - -/***************************************************************************** - * Scheduling system global functions - * - * Functions that can be accessed from anywhere in Tor. - *****************************************************************************/ - -/** - * This is how the scheduling system is notified of Tor's configuration - * changing. For example: a SIGHUP was issued. - */ -void -scheduler_conf_changed(void) -{ - /* Let the scheduler decide what it should do. */ - set_scheduler(); - - /* Then tell the (possibly new) scheduler that we have new options. */ - if (the_scheduler->on_new_options) { - the_scheduler->on_new_options(); - } -} - -/** - * Whenever we get a new consensus, this function is called. - */ -void -scheduler_notify_networkstatus_changed(const networkstatus_t *old_c, - const networkstatus_t *new_c) -{ - /* Maybe the consensus param made us change the scheduler. */ - set_scheduler(); - - /* Then tell the (possibly new) scheduler that we have a new consensus */ - if (the_scheduler->on_new_consensus) { - the_scheduler->on_new_consensus(old_c, new_c); - } -} - -/** - * Free everything scheduling-related from main.c. Note this is only called - * when Tor is shutting down, while scheduler_t->free_all() is called both when - * Tor is shutting down and when we are switching schedulers. - */ -void -scheduler_free_all(void) -{ - log_debug(LD_SCHED, "Shutting down scheduler"); - - if (run_sched_ev) { - if (event_del(run_sched_ev) < 0) { - log_warn(LD_BUG, "Problem deleting run_sched_ev"); - } - tor_event_free(run_sched_ev); - run_sched_ev = NULL; - } - - if (channels_pending) { - /* We don't have ownership of the objects in this list. */ - smartlist_free(channels_pending); - channels_pending = NULL; - } - - if (the_scheduler && the_scheduler->free_all) { - the_scheduler->free_all(); - } - the_scheduler = NULL; -} - -/** Mark a channel as no longer ready to accept writes. */ -MOCK_IMPL(void, -scheduler_channel_doesnt_want_writes,(channel_t *chan)) -{ - IF_BUG_ONCE(!chan) { - return; - } - IF_BUG_ONCE(!channels_pending) { - return; - } - - /* If it's already in pending, we can put it in waiting_to_write */ - if (chan->scheduler_state == SCHED_CHAN_PENDING) { - /* - * It's in channels_pending, so it shouldn't be in any of - * the other lists. It can't write any more, so it goes to - * channels_waiting_to_write. - */ - smartlist_pqueue_remove(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p went from pending " - "to waiting_to_write", - U64_PRINTF_ARG(chan->global_identifier), chan); - } else { - /* - * It's not in pending, so it can't become waiting_to_write; it's - * either not in any of the lists (nothing to do) or it's already in - * waiting_for_cells (remove it, can't write any more). - */ - if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) { - chan->scheduler_state = SCHED_CHAN_IDLE; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p left waiting_for_cells", - U64_PRINTF_ARG(chan->global_identifier), chan); - } - } -} - -/** Mark a channel as having waiting cells. */ -MOCK_IMPL(void, -scheduler_channel_has_waiting_cells,(channel_t *chan)) -{ - IF_BUG_ONCE(!chan) { - return; - } - IF_BUG_ONCE(!channels_pending) { - return; - } - - /* First, check if it's also writeable */ - if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) { - /* - * It's in channels_waiting_for_cells, so it shouldn't be in any of - * the other lists. It has waiting cells now, so it goes to - * channels_pending. - */ - chan->scheduler_state = SCHED_CHAN_PENDING; - smartlist_pqueue_add(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p went from waiting_for_cells " - "to pending", - U64_PRINTF_ARG(chan->global_identifier), chan); - /* If we made a channel pending, we potentially have scheduling work to - * do. */ - the_scheduler->schedule(); - } else { - /* - * It's not in waiting_for_cells, so it can't become pending; it's - * either not in any of the lists (we add it to waiting_to_write) - * or it's already in waiting_to_write or pending (we do nothing) - */ - if (!(chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE || - chan->scheduler_state == SCHED_CHAN_PENDING)) { - chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p entered waiting_to_write", - U64_PRINTF_ARG(chan->global_identifier), chan); - } - } -} - -/** Add the scheduler event to the set of pending events with next_run being - * the longest time libevent should wait before triggering the event. */ -void -scheduler_ev_add(const struct timeval *next_run) -{ - tor_assert(run_sched_ev); - tor_assert(next_run); - if (BUG(event_add(run_sched_ev, next_run) < 0)) { - log_warn(LD_SCHED, "Adding to libevent failed. Next run time was set to: " - "%ld.%06ld", next_run->tv_sec, (long)next_run->tv_usec); - return; - } -} - -/** Make the scheduler event active with the given flags. */ -void -scheduler_ev_active(int flags) -{ - tor_assert(run_sched_ev); - event_active(run_sched_ev, flags, 1); -} - -/* - * Initialize everything scheduling-related from config.c. Note this is only - * called when Tor is starting up, while scheduler_t->init() is called both - * when Tor is starting up and when we are switching schedulers. - */ -void -scheduler_init(void) -{ - log_debug(LD_SCHED, "Initting scheduler"); - - // Two '!' because we really do want to check if the pointer is non-NULL - IF_BUG_ONCE(!!run_sched_ev) { - log_warn(LD_SCHED, "We should not already have a libevent scheduler event." - "I'll clean the old one up, but this is odd."); - tor_event_free(run_sched_ev); - run_sched_ev = NULL; - } - run_sched_ev = tor_event_new(tor_libevent_get_base(), -1, - 0, scheduler_evt_callback, NULL); - channels_pending = smartlist_new(); - - set_scheduler(); -} - -/* - * If a channel is going away, this is how the scheduling system is informed - * so it can do any freeing necessary. This ultimately calls - * scheduler_t->on_channel_free() so the current scheduler can release any - * state specific to this channel. - */ -MOCK_IMPL(void, -scheduler_release_channel,(channel_t *chan)) -{ - IF_BUG_ONCE(!chan) { - return; - } - IF_BUG_ONCE(!channels_pending) { - return; - } - - if (chan->scheduler_state == SCHED_CHAN_PENDING) { - if (SCHED_BUG(smartlist_pos(channels_pending, chan) == -1, chan)) { - log_warn(LD_SCHED, "Scheduler asked to release channel %" PRIu64 " " - "but it wasn't in channels_pending", - chan->global_identifier); - } else { - smartlist_pqueue_remove(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - } - } - - if (the_scheduler->on_channel_free) { - the_scheduler->on_channel_free(chan); - } - chan->scheduler_state = SCHED_CHAN_IDLE; -} - -/** Mark a channel as ready to accept writes */ - -void -scheduler_channel_wants_writes(channel_t *chan) -{ - IF_BUG_ONCE(!chan) { - return; - } - IF_BUG_ONCE(!channels_pending) { - return; - } - - /* If it's already in waiting_to_write, we can put it in pending */ - if (chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE) { - /* - * It can write now, so it goes to channels_pending. - */ - log_debug(LD_SCHED, "chan=%" PRIu64 " became pending", - chan->global_identifier); - smartlist_pqueue_add(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - chan->scheduler_state = SCHED_CHAN_PENDING; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p went from waiting_to_write " - "to pending", - U64_PRINTF_ARG(chan->global_identifier), chan); - /* We just made a channel pending, we have scheduling work to do. */ - the_scheduler->schedule(); - } else { - /* - * It's not in SCHED_CHAN_WAITING_TO_WRITE, so it can't become pending; - * it's either idle and goes to WAITING_FOR_CELLS, or it's a no-op. - */ - if (!(chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS || - chan->scheduler_state == SCHED_CHAN_PENDING)) { - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p entered waiting_for_cells", - U64_PRINTF_ARG(chan->global_identifier), chan); - } - } -} - -/* Log warn the given channel and extra scheduler context as well. This is - * used by SCHED_BUG() in order to be able to extract as much information as - * we can when we hit a bug. Channel chan can be NULL. */ -void -scheduler_bug_occurred(const channel_t *chan) -{ - char buf[128]; - - if (chan != NULL) { - const size_t outbuf_len = - buf_datalen(TO_CONN(BASE_CHAN_TO_TLS((channel_t *) chan)->conn)->outbuf); - tor_snprintf(buf, sizeof(buf), - "Channel %" PRIu64 " in state %s and scheduler state %d." - " Num cells on cmux: %d. Connection outbuf len: %lu.", - chan->global_identifier, - channel_state_to_string(chan->state), - chan->scheduler_state, circuitmux_num_cells(chan->cmux), - (unsigned long)outbuf_len); - } - - { - char *msg; - /* Rate limit every 60 seconds. If we start seeing this every 60 sec, we - * know something is stuck/wrong. It *should* be loud but not too much. */ - static ratelim_t rlimit = RATELIM_INIT(60); - if ((msg = rate_limit_log(&rlimit, approx_time()))) { - log_warn(LD_BUG, "%s Num pending channels: %d. " - "Channel in pending list: %s.%s", - (chan != NULL) ? buf : "No channel in bug context.", - smartlist_len(channels_pending), - (smartlist_pos(channels_pending, chan) == -1) ? "no" : "yes", - msg); - tor_free(msg); - } - } -} - -#ifdef TOR_UNIT_TESTS - -/* - * Notify scheduler that a channel's queue position may have changed. - */ -void -scheduler_touch_channel(channel_t *chan) -{ - IF_BUG_ONCE(!chan) { - return; - } - - if (chan->scheduler_state == SCHED_CHAN_PENDING) { - /* Remove and re-add it */ - smartlist_pqueue_remove(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - smartlist_pqueue_add(channels_pending, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - chan); - } - /* else no-op, since it isn't in the queue */ -} - -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/scheduler.h b/src/tor/src/or/scheduler.h deleted file mode 100644 index 47c98f096..000000000 --- a/src/tor/src/or/scheduler.h +++ /dev/null @@ -1,217 +0,0 @@ -/* * Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file scheduler.h - * \brief Header file for scheduler*.c - **/ - -#ifndef TOR_SCHEDULER_H -#define TOR_SCHEDULER_H - -#include "or.h" -#include "channel.h" -#include "testsupport.h" - -/** Scheduler type, we build an ordered list with those values from the - * parsed strings in Schedulers. The reason to do such a thing is so we can - * quickly and without parsing strings select the scheduler at anytime. */ -typedef enum { - SCHEDULER_NONE = -1, - SCHEDULER_VANILLA = 1, - SCHEDULER_KIST = 2, - SCHEDULER_KIST_LITE = 3, -} scheduler_types_t; - -/** - * A scheduler implementation is a collection of function pointers. If you - * would like to add a new scheduler called foo, create scheduler_foo.c, - * implement at least the mandatory ones, and implement get_foo_scheduler() - * that returns a complete scheduler_t for your foo scheduler. See - * scheduler_kist.c for an example. - * - * These function pointers SHOULD NOT be used anywhere outside of the - * scheduling source files. The rest of Tor should communicate with the - * scheduling system through the functions near the bottom of this file, and - * those functions will call into the current scheduler implementation as - * necessary. - * - * If your scheduler doesn't need to implement something (for example: it - * doesn't create any state for itself, thus it has nothing to free when Tor - * is shutting down), then set that function pointer to NULL. - */ -typedef struct scheduler_s { - /* Scheduler type. This is used for logging when the scheduler is switched - * during runtime. */ - scheduler_types_t type; - - /* (Optional) To be called when we want to prepare a scheduler for use. - * Perhaps Tor just started and we are the lucky chosen scheduler, or - * perhaps Tor is switching to this scheduler. No matter the case, this is - * where we would prepare any state and initialize parameters. You might - * think of this as the opposite of free_all(). */ - void (*init)(void); - - /* (Optional) To be called when we want to tell the scheduler to delete all - * of its state (if any). Perhaps Tor is shutting down or perhaps we are - * switching schedulers. */ - void (*free_all)(void); - - /* (Mandatory) Libevent controls the main event loop in Tor, and this is - * where we register with libevent the next execution of run_sched_ev [which - * ultimately calls run()]. */ - void (*schedule)(void); - - /* (Mandatory) This is the heart of a scheduler! This is where the - * excitement happens! Here libevent has given us the chance to execute, and - * we should do whatever we need to do in order to move some cells from - * their circuit queues to output buffers in an intelligent manner. We - * should do this quickly. When we are done, we'll try to schedule() ourself - * if more work needs to be done to setup the next scheduling run. */ - void (*run)(void); - - /* - * External event not related to the scheduler but that can influence it. - */ - - /* (Optional) To be called whenever Tor finds out about a new consensus. - * First the scheduling system as a whole will react to the new consensus - * and change the scheduler if needed. After that, the current scheduler - * (which might be new) will call this so it has the chance to react to the - * new consensus too. If there's a consensus parameter that your scheduler - * wants to keep an eye on, this is where you should check for it. */ - void (*on_new_consensus)(const networkstatus_t *old_c, - const networkstatus_t *new_c); - - /* (Optional) To be called when a channel is being freed. Sometimes channels - * go away (for example: the relay on the other end is shutting down). If - * the scheduler keeps any channel-specific state and has memory to free - * when channels go away, implement this and free it here. */ - void (*on_channel_free)(const channel_t *); - - /* (Optional) To be called whenever Tor is reloading configuration options. - * For example: SIGHUP was issued and Tor is rereading its torrc. A - * scheduler should use this as an opportunity to parse and cache torrc - * options so that it doesn't have to call get_options() all the time. */ - void (*on_new_options)(void); -} scheduler_t; - -/***************************************************************************** - * Globally visible scheduler variables/values - * - * These are variables/constants that all of Tor should be able to see. - *****************************************************************************/ - -/* Default interval that KIST runs (in ms). */ -#define KIST_SCHED_RUN_INTERVAL_DEFAULT 10 -/* Minimum interval that KIST runs. This value disables KIST. */ -#define KIST_SCHED_RUN_INTERVAL_MIN 0 -/* Maximum interval that KIST runs (in ms). */ -#define KIST_SCHED_RUN_INTERVAL_MAX 100 - -/***************************************************************************** - * Globally visible scheduler functions - * - * These functions are how the rest of Tor communicates with the scheduling - * system. - *****************************************************************************/ - -void scheduler_init(void); -void scheduler_free_all(void); -void scheduler_conf_changed(void); -void scheduler_notify_networkstatus_changed(const networkstatus_t *old_c, - const networkstatus_t *new_c); -MOCK_DECL(void, scheduler_release_channel, (channel_t *chan)); - -/* - * Ways for a channel to interact with the scheduling system. A channel only - * really knows (i) whether or not it has cells it wants to send, and - * (ii) whether or not it would like to write. - */ -void scheduler_channel_wants_writes(channel_t *chan); -MOCK_DECL(void, scheduler_channel_doesnt_want_writes, (channel_t *chan)); -MOCK_DECL(void, scheduler_channel_has_waiting_cells, (channel_t *chan)); - -/***************************************************************************** - * Private scheduler functions - * - * These functions are only visible to the scheduling system, the current - * scheduler implementation, and tests. - *****************************************************************************/ -#ifdef SCHEDULER_PRIVATE_ - -/********************************* - * Defined in scheduler.c - *********************************/ - -/* Triggers a BUG() and extra information with chan if available. */ -#define SCHED_BUG(cond, chan) \ - (PREDICT_UNLIKELY(cond) ? \ - ((BUG(cond)) ? (scheduler_bug_occurred(chan), 1) : 0) : 0) - -void scheduler_bug_occurred(const channel_t *chan); - -smartlist_t *get_channels_pending(void); -MOCK_DECL(int, scheduler_compare_channels, - (const void *c1_v, const void *c2_v)); -void scheduler_ev_active(int flags); -void scheduler_ev_add(const struct timeval *next_run); - -#ifdef TOR_UNIT_TESTS -extern smartlist_t *channels_pending; -extern struct event *run_sched_ev; -extern const scheduler_t *the_scheduler; -void scheduler_touch_channel(channel_t *chan); -#endif /* defined(TOR_UNIT_TESTS) */ - -/********************************* - * Defined in scheduler_kist.c - *********************************/ - -#ifdef SCHEDULER_KIST_PRIVATE - -/* Socket table entry which holds information of a channel's socket and kernel - * TCP information. Only used by KIST. */ -typedef struct socket_table_ent_s { - HT_ENTRY(socket_table_ent_s) node; - const channel_t *chan; - /* Amount written this scheduling run */ - uint64_t written; - /* Amount that can be written this scheduling run */ - uint64_t limit; - /* TCP info from the kernel */ - uint32_t cwnd; - uint32_t unacked; - uint32_t mss; - uint32_t notsent; -} socket_table_ent_t; - -typedef HT_HEAD(outbuf_table_s, outbuf_table_ent_s) outbuf_table_t; - -MOCK_DECL(int, channel_should_write_to_kernel, - (outbuf_table_t *table, channel_t *chan)); -MOCK_DECL(void, channel_write_to_kernel, (channel_t *chan)); -MOCK_DECL(void, update_socket_info_impl, (socket_table_ent_t *ent)); - -int scheduler_can_use_kist(void); -void scheduler_kist_set_full_mode(void); -void scheduler_kist_set_lite_mode(void); -scheduler_t *get_kist_scheduler(void); -int kist_scheduler_run_interval(const networkstatus_t *ns); - -#ifdef TOR_UNIT_TESTS -extern int32_t sched_run_interval; -#endif /* TOR_UNIT_TESTS */ - -#endif /* defined(SCHEDULER_KIST_PRIVATE) */ - -/********************************* - * Defined in scheduler_vanilla.c - *********************************/ - -scheduler_t *get_vanilla_scheduler(void); - -#endif /* defined(SCHEDULER_PRIVATE_) */ - -#endif /* !defined(TOR_SCHEDULER_H) */ - diff --git a/src/tor/src/or/scheduler_kist.c b/src/tor/src/or/scheduler_kist.c deleted file mode 100644 index a707ab275..000000000 --- a/src/tor/src/or/scheduler_kist.c +++ /dev/null @@ -1,842 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define SCHEDULER_KIST_PRIVATE - -#include - -#include "or.h" -#include "buffers.h" -#include "config.h" -#include "connection.h" -#include "networkstatus.h" -#define TOR_CHANNEL_INTERNAL_ -#include "channel.h" -#include "channeltls.h" -#define SCHEDULER_PRIVATE_ -#include "scheduler.h" - -#define TLS_PER_CELL_OVERHEAD 29 - -#ifdef HAVE_KIST_SUPPORT -/* Kernel interface needed for KIST. */ -#include -#include -#endif /* HAVE_KIST_SUPPORT */ - -/***************************************************************************** - * Data structures and supporting functions - *****************************************************************************/ - -/* Socket_table hash table stuff. The socket_table keeps track of per-socket - * limit information imposed by kist and used by kist. */ - -static uint32_t -socket_table_ent_hash(const socket_table_ent_t *ent) -{ - return (uint32_t)ent->chan->global_identifier; -} - -static unsigned -socket_table_ent_eq(const socket_table_ent_t *a, const socket_table_ent_t *b) -{ - return a->chan == b->chan; -} - -typedef HT_HEAD(socket_table_s, socket_table_ent_s) socket_table_t; - -static socket_table_t socket_table = HT_INITIALIZER(); - -HT_PROTOTYPE(socket_table_s, socket_table_ent_s, node, socket_table_ent_hash, - socket_table_ent_eq) -HT_GENERATE2(socket_table_s, socket_table_ent_s, node, socket_table_ent_hash, - socket_table_ent_eq, 0.6, tor_reallocarray, tor_free_) - -/* outbuf_table hash table stuff. The outbuf_table keeps track of which - * channels have data sitting in their outbuf so the kist scheduler can force - * a write from outbuf to kernel periodically during a run and at the end of a - * run. */ - -typedef struct outbuf_table_ent_s { - HT_ENTRY(outbuf_table_ent_s) node; - channel_t *chan; -} outbuf_table_ent_t; - -static uint32_t -outbuf_table_ent_hash(const outbuf_table_ent_t *ent) -{ - return (uint32_t)ent->chan->global_identifier; -} - -static unsigned -outbuf_table_ent_eq(const outbuf_table_ent_t *a, const outbuf_table_ent_t *b) -{ - return a->chan->global_identifier == b->chan->global_identifier; -} - -HT_PROTOTYPE(outbuf_table_s, outbuf_table_ent_s, node, outbuf_table_ent_hash, - outbuf_table_ent_eq) -HT_GENERATE2(outbuf_table_s, outbuf_table_ent_s, node, outbuf_table_ent_hash, - outbuf_table_ent_eq, 0.6, tor_reallocarray, tor_free_) - -/***************************************************************************** - * Other internal data - *****************************************************************************/ - -/* Store the last time the scheduler was run so we can decide when to next run - * the scheduler based on it. */ -static monotime_t scheduler_last_run; -/* This is a factor for the extra_space calculation in kist per-socket limits. - * It is the number of extra congestion windows we want to write to the kernel. - */ -static double sock_buf_size_factor = 1.0; -/* How often the scheduler runs. */ -STATIC int sched_run_interval = KIST_SCHED_RUN_INTERVAL_DEFAULT; - -#ifdef HAVE_KIST_SUPPORT -/* Indicate if KIST lite mode is on or off. We can disable it at runtime. - * Important to have because of the KISTLite -> KIST possible transition. */ -static unsigned int kist_lite_mode = 0; -/* Indicate if we don't have the kernel support. This can happen if the kernel - * changed and it doesn't recognized the values passed to the syscalls needed - * by KIST. In that case, fallback to the naive approach. */ -static unsigned int kist_no_kernel_support = 0; -#else /* !(defined(HAVE_KIST_SUPPORT)) */ -static unsigned int kist_lite_mode = 1; -#endif /* defined(HAVE_KIST_SUPPORT) */ - -/***************************************************************************** - * Internally called function implementations - *****************************************************************************/ - -/* Little helper function to get the length of a channel's output buffer */ -static inline size_t -channel_outbuf_length(channel_t *chan) -{ - /* In theory, this can not happen because we can not scheduler a channel - * without a connection that has its outbuf initialized. Just in case, bug - * on this so we can understand a bit more why it happened. */ - if (SCHED_BUG(BASE_CHAN_TO_TLS(chan)->conn == NULL, chan)) { - return 0; - } - return buf_datalen(TO_CONN(BASE_CHAN_TO_TLS(chan)->conn)->outbuf); -} - -/* Little helper function for HT_FOREACH_FN. */ -static int -each_channel_write_to_kernel(outbuf_table_ent_t *ent, void *data) -{ - (void) data; /* Make compiler happy. */ - channel_write_to_kernel(ent->chan); - return 0; /* Returning non-zero removes the element from the table. */ -} - -/* Free the given outbuf table entry ent. */ -static int -free_outbuf_info_by_ent(outbuf_table_ent_t *ent, void *data) -{ - (void) data; /* Make compiler happy. */ - log_debug(LD_SCHED, "Freeing outbuf table entry from chan=%" PRIu64, - ent->chan->global_identifier); - tor_free(ent); - return 1; /* So HT_FOREACH_FN will remove the element */ -} - -/* Free the given socket table entry ent. */ -static int -free_socket_info_by_ent(socket_table_ent_t *ent, void *data) -{ - (void) data; /* Make compiler happy. */ - log_debug(LD_SCHED, "Freeing socket table entry from chan=%" PRIu64, - ent->chan->global_identifier); - tor_free(ent); - return 1; /* So HT_FOREACH_FN will remove the element */ -} - -/* Clean up socket_table. Probably because the KIST sched impl is going away */ -static void -free_all_socket_info(void) -{ - HT_FOREACH_FN(socket_table_s, &socket_table, free_socket_info_by_ent, NULL); - HT_CLEAR(socket_table_s, &socket_table); -} - -static socket_table_ent_t * -socket_table_search(socket_table_t *table, const channel_t *chan) -{ - socket_table_ent_t search, *ent = NULL; - search.chan = chan; - ent = HT_FIND(socket_table_s, table, &search); - return ent; -} - -/* Free a socket entry in table for the given chan. */ -static void -free_socket_info_by_chan(socket_table_t *table, const channel_t *chan) -{ - socket_table_ent_t *ent = NULL; - ent = socket_table_search(table, chan); - if (!ent) - return; - log_debug(LD_SCHED, "scheduler free socket info for chan=%" PRIu64, - chan->global_identifier); - HT_REMOVE(socket_table_s, table, ent); - free_socket_info_by_ent(ent, NULL); -} - -/* Perform system calls for the given socket in order to calculate kist's - * per-socket limit as documented in the function body. */ -MOCK_IMPL(void, -update_socket_info_impl, (socket_table_ent_t *ent)) -{ -#ifdef HAVE_KIST_SUPPORT - int64_t tcp_space, extra_space; - const tor_socket_t sock = - TO_CONN(BASE_CHAN_TO_TLS((channel_t *) ent->chan)->conn)->s; - struct tcp_info tcp; - socklen_t tcp_info_len = sizeof(tcp); - - if (kist_no_kernel_support || kist_lite_mode) { - goto fallback; - } - - /* Gather information */ - if (getsockopt(sock, SOL_TCP, TCP_INFO, (void *)&(tcp), &tcp_info_len) < 0) { - if (errno == EINVAL) { - /* Oops, this option is not provided by the kernel, we'll have to - * disable KIST entirely. This can happen if tor was built on a machine - * with the support previously or if the kernel was updated and lost the - * support. */ - log_notice(LD_SCHED, "Looks like our kernel doesn't have the support " - "for KIST anymore. We will fallback to the naive " - "approach. Remove KIST from the Schedulers list " - "to disable."); - kist_no_kernel_support = 1; - } - goto fallback; - } - if (ioctl(sock, SIOCOUTQNSD, &(ent->notsent)) < 0) { - if (errno == EINVAL) { - log_notice(LD_SCHED, "Looks like our kernel doesn't have the support " - "for KIST anymore. We will fallback to the naive " - "approach. Remove KIST from the Schedulers list " - "to disable."); - /* Same reason as the above. */ - kist_no_kernel_support = 1; - } - goto fallback; - } - ent->cwnd = tcp.tcpi_snd_cwnd; - ent->unacked = tcp.tcpi_unacked; - ent->mss = tcp.tcpi_snd_mss; - - /* In order to reduce outbound kernel queuing delays and thus improve Tor's - * ability to prioritize circuits, KIST wants to set a socket write limit - * that is near the amount that the socket would be able to immediately send - * into the Internet. - * - * We first calculate how much the socket could send immediately (assuming - * completely full packets) according to the congestion window and the number - * of unacked packets. - * - * Then we add a little extra space in a controlled way. We do this so any - * when the kernel gets ACKs back for data currently sitting in the "TCP - * space", it will already have some more data to send immediately. It will - * not have to wait for the scheduler to run again. The amount of extra space - * is a factor of the current congestion window. With the suggested - * sock_buf_size_factor value of 1.0, we allow at most 2*cwnd bytes to sit in - * the kernel: 1 cwnd on the wire waiting for ACKs and 1 cwnd ready and - * waiting to be sent when those ACKs finally come. - * - * In the below diagram, we see some bytes in the TCP-space (denoted by '*') - * that have be sent onto the wire and are waiting for ACKs. We have a little - * more room in "TCP space" that we can fill with data that will be - * immediately sent. We also see the "extra space" KIST calculates. The sum - * of the empty "TCP space" and the "extra space" is the kist-imposed write - * limit for this socket. - * - * <----------------kernel-outbound-socket-queue----------------| - * <*********---------------------------------------------------| - * |----TCP-space-----|----extra-space-----| - * |------------------| - * ^ ((cwnd - unacked) * mss) bytes - * |--------------------| - * ^ ((cwnd * mss) * factor) bytes - */ - - /* These values from the kernel are uint32_t, they will always fit into a - * int64_t tcp_space variable but if the congestion window cwnd is smaller - * than the unacked packets, the remaining TCP space is set to 0. */ - if (ent->cwnd >= ent->unacked) { - tcp_space = (ent->cwnd - ent->unacked) * (int64_t)(ent->mss); - } else { - tcp_space = 0; - } - - /* The clamp_double_to_int64 makes sure the first part fits into an int64_t. - * In fact, if sock_buf_size_factor is still forced to be >= 0 in config.c, - * then it will be positive for sure. Then we subtract a uint32_t. Getting a - * negative value is OK, see after how it is being handled. */ - extra_space = - clamp_double_to_int64( - (ent->cwnd * (int64_t)ent->mss) * sock_buf_size_factor) - - ent->notsent; - if ((tcp_space + extra_space) < 0) { - /* This means that the "notsent" queue is just too big so we shouldn't put - * more in the kernel for now. */ - ent->limit = 0; - } else { - /* The positive sum of two int64_t will always fit into an uint64_t. - * And we know this will always be positive, since we checked above. */ - ent->limit = (uint64_t)tcp_space + (uint64_t)extra_space; - } - return; - -#else /* !(defined(HAVE_KIST_SUPPORT)) */ - goto fallback; -#endif /* defined(HAVE_KIST_SUPPORT) */ - - fallback: - /* If all of a sudden we don't have kist support, we just zero out all the - * variables for this socket since we don't know what they should be. We - * also allow the socket to write as much as it can from the estimated - * number of cells the lower layer can accept, effectively returning it to - * Vanilla scheduler behavior. */ - ent->cwnd = ent->unacked = ent->mss = ent->notsent = 0; - /* This function calls the specialized channel object (currently channeltls) - * and ask how many cells it can write on the outbuf which we then multiply - * by the size of the cells for this channel. The cast is because this - * function requires a non-const channel object, meh. */ - ent->limit = channel_num_cells_writeable((channel_t *) ent->chan) * - (get_cell_network_size(ent->chan->wide_circ_ids) + - TLS_PER_CELL_OVERHEAD); -} - -/* Given a socket that isn't in the table, add it. - * Given a socket that is in the table, re-init values that need init-ing - * every scheduling run - */ -static void -init_socket_info(socket_table_t *table, const channel_t *chan) -{ - socket_table_ent_t *ent = NULL; - ent = socket_table_search(table, chan); - if (!ent) { - log_debug(LD_SCHED, "scheduler init socket info for chan=%" PRIu64, - chan->global_identifier); - ent = tor_malloc_zero(sizeof(*ent)); - ent->chan = chan; - HT_INSERT(socket_table_s, table, ent); - } - ent->written = 0; -} - -/* Add chan to the outbuf table if it isn't already in it. If it is, then don't - * do anything */ -static void -outbuf_table_add(outbuf_table_t *table, channel_t *chan) -{ - outbuf_table_ent_t search, *ent; - search.chan = chan; - ent = HT_FIND(outbuf_table_s, table, &search); - if (!ent) { - log_debug(LD_SCHED, "scheduler init outbuf info for chan=%" PRIu64, - chan->global_identifier); - ent = tor_malloc_zero(sizeof(*ent)); - ent->chan = chan; - HT_INSERT(outbuf_table_s, table, ent); - } -} - -static void -outbuf_table_remove(outbuf_table_t *table, channel_t *chan) -{ - outbuf_table_ent_t search, *ent; - search.chan = chan; - ent = HT_FIND(outbuf_table_s, table, &search); - if (ent) { - HT_REMOVE(outbuf_table_s, table, ent); - free_outbuf_info_by_ent(ent, NULL); - } -} - -/* Set the scheduler running interval. */ -static void -set_scheduler_run_interval(const networkstatus_t *ns) -{ - int old_sched_run_interval = sched_run_interval; - sched_run_interval = kist_scheduler_run_interval(ns); - if (old_sched_run_interval != sched_run_interval) { - log_info(LD_SCHED, "Scheduler KIST changing its running interval " - "from %" PRId32 " to %" PRId32, - old_sched_run_interval, sched_run_interval); - } -} - -/* Return true iff the channel hasn’t hit its kist-imposed write limit yet */ -static int -socket_can_write(socket_table_t *table, const channel_t *chan) -{ - socket_table_ent_t *ent = NULL; - ent = socket_table_search(table, chan); - if (SCHED_BUG(!ent, chan)) { - return 1; // Just return true, saying that kist wouldn't limit the socket - } - - /* We previously calculated a write limit for this socket. In the below - * calculation, first determine how much room is left in bytes. Then divide - * that by the amount of space a cell takes. If there's room for at least 1 - * cell, then KIST will allow the socket to write. */ - int64_t kist_limit_space = - (int64_t) (ent->limit - ent->written) / - (CELL_MAX_NETWORK_SIZE + TLS_PER_CELL_OVERHEAD); - return kist_limit_space > 0; -} - -/* Update the channel's socket kernel information. */ -static void -update_socket_info(socket_table_t *table, const channel_t *chan) -{ - socket_table_ent_t *ent = NULL; - ent = socket_table_search(table, chan); - if (SCHED_BUG(!ent, chan)) { - return; // Whelp. Entry didn't exist for some reason so nothing to do. - } - update_socket_info_impl(ent); - log_debug(LD_SCHED, "chan=%" PRIu64 " updated socket info, limit: %" PRIu64 - ", cwnd: %" PRIu32 ", unacked: %" PRIu32 - ", notsent: %" PRIu32 ", mss: %" PRIu32, - ent->chan->global_identifier, ent->limit, ent->cwnd, ent->unacked, - ent->notsent, ent->mss); -} - -/* Increment the channel's socket written value by the number of bytes. */ -static void -update_socket_written(socket_table_t *table, channel_t *chan, size_t bytes) -{ - socket_table_ent_t *ent = NULL; - ent = socket_table_search(table, chan); - if (SCHED_BUG(!ent, chan)) { - return; // Whelp. Entry didn't exist so nothing to do. - } - - log_debug(LD_SCHED, "chan=%" PRIu64 " wrote %lu bytes, old was %" PRIi64, - chan->global_identifier, (unsigned long) bytes, ent->written); - - ent->written += bytes; -} - -/* - * A naive KIST impl would write every single cell all the way to the kernel. - * That would take a lot of system calls. A less bad KIST impl would write a - * channel's outbuf to the kernel only when we are switching to a different - * channel. But if we have two channels with equal priority, we end up writing - * one cell for each and bouncing back and forth. This KIST impl avoids that - * by only writing a channel's outbuf to the kernel if it has 8 cells or more - * in it. - */ -MOCK_IMPL(int, channel_should_write_to_kernel, - (outbuf_table_t *table, channel_t *chan)) -{ - outbuf_table_add(table, chan); - /* CELL_MAX_NETWORK_SIZE * 8 because we only want to write the outbuf to the - * kernel if there's 8 or more cells waiting */ - return channel_outbuf_length(chan) > (CELL_MAX_NETWORK_SIZE * 8); -} - -/* Little helper function to write a channel's outbuf all the way to the - * kernel */ -MOCK_IMPL(void, channel_write_to_kernel, (channel_t *chan)) -{ - log_debug(LD_SCHED, "Writing %lu bytes to kernel for chan %" PRIu64, - (unsigned long)channel_outbuf_length(chan), - chan->global_identifier); - connection_handle_write(TO_CONN(BASE_CHAN_TO_TLS(chan)->conn), 0); -} - -/* Return true iff the scheduler has work to perform. */ -static int -have_work(void) -{ - smartlist_t *cp = get_channels_pending(); - IF_BUG_ONCE(!cp) { - return 0; // channels_pending doesn't exist so... no work? - } - return smartlist_len(cp) > 0; -} - -/* Function of the scheduler interface: free_all() */ -static void -kist_free_all(void) -{ - free_all_socket_info(); -} - -/* Function of the scheduler interface: on_channel_free() */ -static void -kist_on_channel_free_fn(const channel_t *chan) -{ - free_socket_info_by_chan(&socket_table, chan); -} - -/* Function of the scheduler interface: on_new_consensus() */ -static void -kist_scheduler_on_new_consensus(const networkstatus_t *old_c, - const networkstatus_t *new_c) -{ - (void) old_c; - (void) new_c; - - set_scheduler_run_interval(new_c); -} - -/* Function of the scheduler interface: on_new_options() */ -static void -kist_scheduler_on_new_options(void) -{ - sock_buf_size_factor = get_options()->KISTSockBufSizeFactor; - - /* Calls kist_scheduler_run_interval which calls get_options(). */ - set_scheduler_run_interval(NULL); -} - -/* Function of the scheduler interface: init() */ -static void -kist_scheduler_init(void) -{ - /* When initializing the scheduler, the last run could be 0 because it is - * declared static or a value in the past that was set when it was last - * used. In both cases, we want to initialize it to now so we don't risk - * using the value 0 which doesn't play well with our monotonic time - * interface. - * - * One side effect is that the first scheduler run will be at the next tick - * that is in now + 10 msec (KIST_SCHED_RUN_INTERVAL_DEFAULT) by default. */ - monotime_get(&scheduler_last_run); - - kist_scheduler_on_new_options(); - IF_BUG_ONCE(sched_run_interval == 0) { - log_warn(LD_SCHED, "We are initing the KIST scheduler and noticed the " - "KISTSchedRunInterval is telling us to not use KIST. That's " - "weird! We'll continue using KIST, but at %" PRId32 "ms.", - KIST_SCHED_RUN_INTERVAL_DEFAULT); - sched_run_interval = KIST_SCHED_RUN_INTERVAL_DEFAULT; - } -} - -/* Function of the scheduler interface: schedule() */ -static void -kist_scheduler_schedule(void) -{ - struct monotime_t now; - struct timeval next_run; - int64_t diff; - - if (!have_work()) { - return; - } - monotime_get(&now); - - /* If time is really monotonic, we can never have now being smaller than the - * last scheduler run. The scheduler_last_run at first is set to 0. - * Unfortunately, not all platforms guarantee monotonic time so we log at - * info level but don't make it more noisy. */ - diff = monotime_diff_msec(&scheduler_last_run, &now); - if (diff < 0) { - log_info(LD_SCHED, "Monotonic time between now and last run of scheduler " - "is negative: %" PRId64 ". Setting diff to 0.", diff); - diff = 0; - } - if (diff < sched_run_interval) { - next_run.tv_sec = 0; - /* Takes 1000 ms -> us. This will always be valid because diff can NOT be - * negative and can NOT be bigger than sched_run_interval so values can - * only go from 1000 usec (diff set to interval - 1) to 100000 usec (diff - * set to 0) for the maximum allowed run interval (100ms). */ - next_run.tv_usec = (int) ((sched_run_interval - diff) * 1000); - /* Re-adding an event reschedules it. It does not duplicate it. */ - scheduler_ev_add(&next_run); - } else { - scheduler_ev_active(EV_TIMEOUT); - } -} - -/* Function of the scheduler interface: run() */ -static void -kist_scheduler_run(void) -{ - /* Define variables */ - channel_t *chan = NULL; // current working channel - /* The last distinct chan served in a sched loop. */ - channel_t *prev_chan = NULL; - int flush_result; // temporarily store results from flush calls - /* Channels to be re-adding to pending at the end */ - smartlist_t *to_readd = NULL; - smartlist_t *cp = get_channels_pending(); - - outbuf_table_t outbuf_table = HT_INITIALIZER(); - - /* For each pending channel, collect new kernel information */ - SMARTLIST_FOREACH_BEGIN(cp, const channel_t *, pchan) { - init_socket_info(&socket_table, pchan); - update_socket_info(&socket_table, pchan); - } SMARTLIST_FOREACH_END(pchan); - - log_debug(LD_SCHED, "Running the scheduler. %d channels pending", - smartlist_len(cp)); - - /* The main scheduling loop. Loop until there are no more pending channels */ - while (smartlist_len(cp) > 0) { - /* get best channel */ - chan = smartlist_pqueue_pop(cp, scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx)); - if (SCHED_BUG(!chan, NULL)) { - /* Some-freaking-how a NULL got into the channels_pending. That should - * never happen, but it should be harmless to ignore it and keep looping. - */ - continue; - } - outbuf_table_add(&outbuf_table, chan); - - /* if we have switched to a new channel, consider writing the previous - * channel's outbuf to the kernel. */ - if (!prev_chan) { - prev_chan = chan; - } - if (prev_chan != chan) { - if (channel_should_write_to_kernel(&outbuf_table, prev_chan)) { - channel_write_to_kernel(prev_chan); - outbuf_table_remove(&outbuf_table, prev_chan); - } - prev_chan = chan; - } - - /* Only flush and write if the per-socket limit hasn't been hit */ - if (socket_can_write(&socket_table, chan)) { - /* flush to channel queue/outbuf */ - flush_result = (int)channel_flush_some_cells(chan, 1); // 1 for num cells - /* XXX: While flushing cells, it is possible that the connection write - * fails leading to the channel to be closed which triggers a release - * and free its entry in the socket table. And because of a engineering - * design issue, the error is not propagated back so we don't get an - * error at this point. So before we continue, make sure the channel is - * open and if not just ignore it. See #23751. */ - if (!CHANNEL_IS_OPEN(chan)) { - /* Channel isn't open so we put it back in IDLE mode. It is either - * renegotiating its TLS session or about to be released. */ - chan->scheduler_state = SCHED_CHAN_IDLE; - continue; - } - /* flush_result has the # cells flushed */ - if (flush_result > 0) { - update_socket_written(&socket_table, chan, flush_result * - (CELL_MAX_NETWORK_SIZE + TLS_PER_CELL_OVERHEAD)); - } else { - /* XXX: This can happen because tor sometimes does flush in an - * opportunistic way cells from the circuit to the outbuf so the - * channel can end up here without having anything to flush nor needed - * to write to the kernel. Hopefully we'll fix that soon but for now - * we have to handle this case which happens kind of often. */ - log_debug(LD_SCHED, - "We didn't flush anything on a chan that we think " - "can write and wants to write. The channel's state is '%s' " - "and in scheduler state %d. We're going to mark it as " - "waiting_for_cells (as that's most likely the issue) and " - "stop scheduling it this round.", - channel_state_to_string(chan->state), - chan->scheduler_state); - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - continue; - } - } - - /* Decide what to do with the channel now */ - - if (!channel_more_to_flush(chan) && - !socket_can_write(&socket_table, chan)) { - - /* Case 1: no more cells to send, and cannot write */ - - /* - * You might think we should put the channel in SCHED_CHAN_IDLE. And - * you're probably correct. While implementing KIST, we found that the - * scheduling system would sometimes lose track of channels when we did - * that. We suspect it has to do with the difference between "can't - * write because socket/outbuf is full" and KIST's "can't write because - * we've arbitrarily decided that that's enough for now." Sometimes - * channels run out of cells at the same time they hit their - * kist-imposed write limit and maybe the rest of Tor doesn't put the - * channel back in pending when it is supposed to. - * - * This should be investigated again. It is as simple as changing - * SCHED_CHAN_WAITING_FOR_CELLS to SCHED_CHAN_IDLE and seeing if Tor - * starts having serious throughput issues. Best done in shadow/chutney. - */ - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - log_debug(LD_SCHED, "chan=%" PRIu64 " now waiting_for_cells", - chan->global_identifier); - } else if (!channel_more_to_flush(chan)) { - - /* Case 2: no more cells to send, but still open for writes */ - - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - log_debug(LD_SCHED, "chan=%" PRIu64 " now waiting_for_cells", - chan->global_identifier); - } else if (!socket_can_write(&socket_table, chan)) { - - /* Case 3: cells to send, but cannot write */ - - /* - * We want to write, but can't. If we left the channel in - * channels_pending, we would never exit the scheduling loop. We need to - * add it to a temporary list of channels to be added to channels_pending - * after the scheduling loop is over. They can hopefully be taken care of - * in the next scheduling round. - */ - chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; - if (!to_readd) { - to_readd = smartlist_new(); - } - smartlist_add(to_readd, chan); - log_debug(LD_SCHED, "chan=%" PRIu64 " now waiting_to_write", - chan->global_identifier); - } else { - - /* Case 4: cells to send, and still open for writes */ - - chan->scheduler_state = SCHED_CHAN_PENDING; - smartlist_pqueue_add(cp, scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), chan); - } - } /* End of main scheduling loop */ - - /* Write the outbuf of any channels that still have data */ - HT_FOREACH_FN(outbuf_table_s, &outbuf_table, each_channel_write_to_kernel, - NULL); - /* We are done with it. */ - HT_FOREACH_FN(outbuf_table_s, &outbuf_table, free_outbuf_info_by_ent, NULL); - HT_CLEAR(outbuf_table_s, &outbuf_table); - - log_debug(LD_SCHED, "len pending=%d, len to_readd=%d", - smartlist_len(cp), - (to_readd ? smartlist_len(to_readd) : -1)); - - /* Re-add any channels we need to */ - if (to_readd) { - SMARTLIST_FOREACH_BEGIN(to_readd, channel_t *, readd_chan) { - readd_chan->scheduler_state = SCHED_CHAN_PENDING; - if (!smartlist_contains(cp, readd_chan)) { - smartlist_pqueue_add(cp, scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), readd_chan); - } - } SMARTLIST_FOREACH_END(readd_chan); - smartlist_free(to_readd); - } - - monotime_get(&scheduler_last_run); -} - -/***************************************************************************** - * Externally called function implementations not called through scheduler_t - *****************************************************************************/ - -/* Stores the kist scheduler function pointers. */ -static scheduler_t kist_scheduler = { - .type = SCHEDULER_KIST, - .free_all = kist_free_all, - .on_channel_free = kist_on_channel_free_fn, - .init = kist_scheduler_init, - .on_new_consensus = kist_scheduler_on_new_consensus, - .schedule = kist_scheduler_schedule, - .run = kist_scheduler_run, - .on_new_options = kist_scheduler_on_new_options, -}; - -/* Return the KIST scheduler object. If it didn't exists, return a newly - * allocated one but init() is not called. */ -scheduler_t * -get_kist_scheduler(void) -{ - return &kist_scheduler; -} - -/* Check the torrc (and maybe consensus) for the configured KIST scheduler run - * interval. - * - If torrc > 0, then return the positive torrc value (should use KIST, and - * should use the set value) - * - If torrc == 0, then look in the consensus for what the value should be. - * - If == 0, then return 0 (don't use KIST) - * - If > 0, then return the positive consensus value - * - If consensus doesn't say anything, return 10 milliseconds, default. - */ -int -kist_scheduler_run_interval(const networkstatus_t *ns) -{ - int run_interval = get_options()->KISTSchedRunInterval; - - if (run_interval != 0) { - log_debug(LD_SCHED, "Found KISTSchedRunInterval=%" PRId32 " in torrc. " - "Using that.", run_interval); - return run_interval; - } - - log_debug(LD_SCHED, "KISTSchedRunInterval=0, turning to the consensus."); - - /* Will either be the consensus value or the default. Note that 0 can be - * returned which means the consensus wants us to NOT use KIST. */ - return networkstatus_get_param(ns, "KISTSchedRunInterval", - KIST_SCHED_RUN_INTERVAL_DEFAULT, - KIST_SCHED_RUN_INTERVAL_MIN, - KIST_SCHED_RUN_INTERVAL_MAX); -} - -/* Set KISTLite mode that is KIST without kernel support. */ -void -scheduler_kist_set_lite_mode(void) -{ - kist_lite_mode = 1; - kist_scheduler.type = SCHEDULER_KIST_LITE; - log_info(LD_SCHED, - "Setting KIST scheduler without kernel support (KISTLite mode)"); -} - -/* Set KIST mode that is KIST with kernel support. */ -void -scheduler_kist_set_full_mode(void) -{ - kist_lite_mode = 0; - kist_scheduler.type = SCHEDULER_KIST; - log_info(LD_SCHED, - "Setting KIST scheduler with kernel support (KIST mode)"); -} - -#ifdef HAVE_KIST_SUPPORT - -/* Return true iff the scheduler subsystem should use KIST. */ -int -scheduler_can_use_kist(void) -{ - if (kist_no_kernel_support) { - /* We have no kernel support so we can't use KIST. */ - return 0; - } - - /* We do have the support, time to check if we can get the interval that the - * consensus can be disabling. */ - int run_interval = kist_scheduler_run_interval(NULL); - log_debug(LD_SCHED, "Determined KIST sched_run_interval should be " - "%" PRId32 ". Can%s use KIST.", - run_interval, (run_interval > 0 ? "" : " not")); - return run_interval > 0; -} - -#else /* !(defined(HAVE_KIST_SUPPORT)) */ - -int -scheduler_can_use_kist(void) -{ - return 0; -} - -#endif /* defined(HAVE_KIST_SUPPORT) */ - diff --git a/src/tor/src/or/scheduler_vanilla.c b/src/tor/src/or/scheduler_vanilla.c deleted file mode 100644 index 303b3dbba..000000000 --- a/src/tor/src/or/scheduler_vanilla.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include - -#include "or.h" -#include "config.h" -#define TOR_CHANNEL_INTERNAL_ -#include "channel.h" -#define SCHEDULER_PRIVATE_ -#include "scheduler.h" - -/***************************************************************************** - * Other internal data - *****************************************************************************/ - -/* Maximum cells to flush in a single call to channel_flush_some_cells(); */ -#define MAX_FLUSH_CELLS 1000 - -/***************************************************************************** - * Externally called function implementations - *****************************************************************************/ - -/* Return true iff the scheduler has work to perform. */ -static int -have_work(void) -{ - smartlist_t *cp = get_channels_pending(); - IF_BUG_ONCE(!cp) { - return 0; // channels_pending doesn't exist so... no work? - } - return smartlist_len(cp) > 0; -} - -/** Re-trigger the scheduler in a way safe to use from the callback */ - -static void -vanilla_scheduler_schedule(void) -{ - if (!have_work()) { - return; - } - - /* Activate our event so it can process channels. */ - scheduler_ev_active(EV_TIMEOUT); -} - -static void -vanilla_scheduler_run(void) -{ - int n_cells, n_chans_before, n_chans_after; - ssize_t flushed, flushed_this_time; - smartlist_t *cp = get_channels_pending(); - smartlist_t *to_readd = NULL; - channel_t *chan = NULL; - - log_debug(LD_SCHED, "We have a chance to run the scheduler"); - - n_chans_before = smartlist_len(cp); - - while (smartlist_len(cp) > 0) { - /* Pop off a channel */ - chan = smartlist_pqueue_pop(cp, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx)); - IF_BUG_ONCE(!chan) { - /* Some-freaking-how a NULL got into the channels_pending. That should - * never happen, but it should be harmless to ignore it and keep looping. - */ - continue; - } - - /* Figure out how many cells we can write */ - n_cells = channel_num_cells_writeable(chan); - if (n_cells > 0) { - log_debug(LD_SCHED, - "Scheduler saw pending channel " U64_FORMAT " at %p with " - "%d cells writeable", - U64_PRINTF_ARG(chan->global_identifier), chan, n_cells); - - flushed = 0; - while (flushed < n_cells) { - flushed_this_time = - channel_flush_some_cells(chan, - MIN(MAX_FLUSH_CELLS, (size_t) n_cells - flushed)); - if (flushed_this_time <= 0) break; - flushed += flushed_this_time; - } - - if (flushed < n_cells) { - /* We ran out of cells to flush */ - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p " - "entered waiting_for_cells from pending", - U64_PRINTF_ARG(chan->global_identifier), - chan); - } else { - /* The channel may still have some cells */ - if (channel_more_to_flush(chan)) { - /* The channel goes to either pending or waiting_to_write */ - if (channel_num_cells_writeable(chan) > 0) { - /* Add it back to pending later */ - if (!to_readd) to_readd = smartlist_new(); - smartlist_add(to_readd, chan); - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p " - "is still pending", - U64_PRINTF_ARG(chan->global_identifier), - chan); - } else { - /* It's waiting to be able to write more */ - chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p " - "entered waiting_to_write from pending", - U64_PRINTF_ARG(chan->global_identifier), - chan); - } - } else { - /* No cells left; it can go to idle or waiting_for_cells */ - if (channel_num_cells_writeable(chan) > 0) { - /* - * It can still accept writes, so it goes to - * waiting_for_cells - */ - chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p " - "entered waiting_for_cells from pending", - U64_PRINTF_ARG(chan->global_identifier), - chan); - } else { - /* - * We exactly filled up the output queue with all available - * cells; go to idle. - */ - chan->scheduler_state = SCHED_CHAN_IDLE; - log_debug(LD_SCHED, - "Channel " U64_FORMAT " at %p " - "become idle from pending", - U64_PRINTF_ARG(chan->global_identifier), - chan); - } - } - } - - log_debug(LD_SCHED, - "Scheduler flushed %d cells onto pending channel " - U64_FORMAT " at %p", - (int)flushed, U64_PRINTF_ARG(chan->global_identifier), - chan); - } else { - log_info(LD_SCHED, - "Scheduler saw pending channel " U64_FORMAT " at %p with " - "no cells writeable", - U64_PRINTF_ARG(chan->global_identifier), chan); - /* Put it back to WAITING_TO_WRITE */ - chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; - } - } - - /* Readd any channels we need to */ - if (to_readd) { - SMARTLIST_FOREACH_BEGIN(to_readd, channel_t *, readd_chan) { - readd_chan->scheduler_state = SCHED_CHAN_PENDING; - smartlist_pqueue_add(cp, - scheduler_compare_channels, - offsetof(channel_t, sched_heap_idx), - readd_chan); - } SMARTLIST_FOREACH_END(readd_chan); - smartlist_free(to_readd); - } - - n_chans_after = smartlist_len(cp); - log_debug(LD_SCHED, "Scheduler handled %d of %d pending channels", - n_chans_before - n_chans_after, n_chans_before); -} - -/* Stores the vanilla scheduler function pointers. */ -static scheduler_t vanilla_scheduler = { - .type = SCHEDULER_VANILLA, - .free_all = NULL, - .on_channel_free = NULL, - .init = NULL, - .on_new_consensus = NULL, - .schedule = vanilla_scheduler_schedule, - .run = vanilla_scheduler_run, - .on_new_options = NULL, -}; - -scheduler_t * -get_vanilla_scheduler(void) -{ - return &vanilla_scheduler; -} - diff --git a/src/tor/src/or/shared_random.c b/src/tor/src/or/shared_random.c deleted file mode 100644 index 7723ad461..000000000 --- a/src/tor/src/or/shared_random.c +++ /dev/null @@ -1,1445 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file shared_random.c - * - * \brief Functions and data structure needed to accomplish the shared - * random protocol as defined in proposal #250. - * - * \details - * - * This file implements the dirauth-only commit-and-reveal protocol specified - * by proposal #250. The protocol has two phases (sr_phase_t): the commitment - * phase and the reveal phase (see get_sr_protocol_phase()). - * - * During the protocol, directory authorities keep state in memory (using - * sr_state_t) and in disk (using sr_disk_state_t). The synchronization between - * these two data structures happens in disk_state_update() and - * disk_state_parse(). - * - * Here is a rough protocol outline: - * - * 1) In the beginning of the commitment phase, dirauths generate a - * commitment/reveal value for the current protocol run (see - * new_protocol_run() and sr_generate_our_commit()). - * - * 2) During voting, dirauths publish their commits in their votes - * depending on the current phase. Dirauths also include the two - * latest shared random values (SRV) in their votes. - * (see sr_get_string_for_vote()) - * - * 3) Upon receiving a commit from a vote, authorities parse it, verify - * it, and attempt to save any new commitment or reveal information in - * their state file (see extract_shared_random_commits() and - * sr_handle_received_commits()). They also parse SRVs from votes to - * decide which SRV should be included in the final consensus (see - * extract_shared_random_srvs()). - * - * 3) After voting is done, we count the SRVs we extracted from the votes, - * to find the one voted by the majority of dirauths which should be - * included in the final consensus (see get_majority_srv_from_votes()). - * If an appropriate SRV is found, it is embedded in the consensus (see - * sr_get_string_for_consensus()). - * - * 4) At the end of the reveal phase, dirauths compute a fresh SRV for the - * day using the active commits (see sr_compute_srv()). This new SRV - * is embedded in the votes as described above. - * - * Some more notes: - * - * - To support rebooting authorities and to avoid double voting, each dirauth - * saves the current state of the protocol on disk so that it can resume - * normally in case of reboot. The disk state (sr_disk_state_t) is managed by - * shared_random_state.c:state_query() and we go to extra lengths to ensure - * that the state is flushed on disk everytime we receive any useful - * information like commits or SRVs. - * - * - When we receive a commit from a vote, we examine it to see if it's useful - * to us and whether it's appropriate to receive it according to the current - * phase of the protocol (see should_keep_commit()). If the commit is useful - * to us, we save it in our disk state using save_commit_to_state(). When we - * receive the reveal information corresponding to a commitment, we verify - * that they indeed match using verify_commit_and_reveal(). - * - * - We treat consensuses as the ground truth, so everytime we generate a new - * consensus we update our SR state accordingly even if our local view was - * different (see sr_act_post_consensus()). - * - * - After a consensus has been composed, the SR protocol state gets prepared - * for the next voting session using sr_state_update(). That function takes - * care of housekeeping and also rotates the SRVs and commits in case a new - * protocol run is coming up. We also call sr_state_update() on bootup (in - * sr_state_init()), to prepare the state for the very first voting session. - * - * Terminology: - * - * - "Commitment" is the commitment value of the commit-and-reveal protocol. - * - * - "Reveal" is the reveal value of the commit-and-reveal protocol. - * - * - "Commit" is a struct (sr_commit_t) that contains a commitment value and - * optionally also a corresponding reveal value. - * - * - "SRV" is the Shared Random Value that gets generated as the result of the - * commit-and-reveal protocol. - **/ - -#define SHARED_RANDOM_PRIVATE - -#include "or.h" -#include "shared_random.h" -#include "config.h" -#include "confparse.h" -#include "dirvote.h" -#include "networkstatus.h" -#include "routerkeys.h" -#include "router.h" -#include "routerlist.h" -#include "shared_random_state.h" -#include "util.h" - -/* String prefix of shared random values in votes/consensuses. */ -static const char previous_srv_str[] = "shared-rand-previous-value"; -static const char current_srv_str[] = "shared-rand-current-value"; -static const char commit_ns_str[] = "shared-rand-commit"; -static const char sr_flag_ns_str[] = "shared-rand-participate"; - -/* The value of the consensus param AuthDirNumSRVAgreements found in the - * vote. This is set once the consensus creation subsystem requests the - * SRV(s) that should be put in the consensus. We use this value to decide - * if we keep or not an SRV. */ -static int32_t num_srv_agreements_from_vote; - -/* Return a heap allocated copy of the SRV orig. */ -STATIC sr_srv_t * -srv_dup(const sr_srv_t *orig) -{ - sr_srv_t *duplicate = NULL; - - if (!orig) { - return NULL; - } - - duplicate = tor_malloc_zero(sizeof(sr_srv_t)); - duplicate->num_reveals = orig->num_reveals; - memcpy(duplicate->value, orig->value, sizeof(duplicate->value)); - return duplicate; -} - -/* Allocate a new commit object and initializing it with rsa_identity - * that MUST be provided. The digest algorithm is set to the default one - * that is supported. The rest is uninitialized. This never returns NULL. */ -static sr_commit_t * -commit_new(const char *rsa_identity) -{ - sr_commit_t *commit; - - tor_assert(rsa_identity); - - commit = tor_malloc_zero(sizeof(*commit)); - commit->alg = SR_DIGEST_ALG; - memcpy(commit->rsa_identity, rsa_identity, sizeof(commit->rsa_identity)); - base16_encode(commit->rsa_identity_hex, sizeof(commit->rsa_identity_hex), - commit->rsa_identity, sizeof(commit->rsa_identity)); - return commit; -} - -/* Issue a log message describing commit. */ -static void -commit_log(const sr_commit_t *commit) -{ - tor_assert(commit); - - log_debug(LD_DIR, "SR: Commit from %s", sr_commit_get_rsa_fpr(commit)); - log_debug(LD_DIR, "SR: Commit: [TS: %" PRIu64 "] [Encoded: %s]", - commit->commit_ts, commit->encoded_commit); - log_debug(LD_DIR, "SR: Reveal: [TS: %" PRIu64 "] [Encoded: %s]", - commit->reveal_ts, safe_str(commit->encoded_reveal)); -} - -/* Make sure that the commitment and reveal information in commit - * match. If they match return 0, return -1 otherwise. This function MUST be - * used everytime we receive a new reveal value. Furthermore, the commit - * object MUST have a reveal value and the hash of the reveal value. */ -STATIC int -verify_commit_and_reveal(const sr_commit_t *commit) -{ - tor_assert(commit); - - log_debug(LD_DIR, "SR: Validating commit from authority %s", - sr_commit_get_rsa_fpr(commit)); - - /* Check that the timestamps match. */ - if (commit->commit_ts != commit->reveal_ts) { - log_warn(LD_BUG, "SR: Commit timestamp %" PRIu64 " doesn't match reveal " - "timestamp %" PRIu64, commit->commit_ts, - commit->reveal_ts); - goto invalid; - } - - /* Verify that the hashed_reveal received in the COMMIT message, matches - * the reveal we just received. */ - { - /* We first hash the reveal we just received. */ - char received_hashed_reveal[sizeof(commit->hashed_reveal)]; - - /* Only sha3-256 is supported. */ - if (commit->alg != SR_DIGEST_ALG) { - goto invalid; - } - - /* Use the invariant length since the encoded reveal variable has an - * extra byte for the NUL terminated byte. */ - if (crypto_digest256(received_hashed_reveal, commit->encoded_reveal, - SR_REVEAL_BASE64_LEN, commit->alg) < 0) { - /* Unable to digest the reveal blob, this is unlikely. */ - goto invalid; - } - - /* Now compare that with the hashed_reveal we received in COMMIT. */ - if (fast_memneq(received_hashed_reveal, commit->hashed_reveal, - sizeof(received_hashed_reveal))) { - log_warn(LD_BUG, "SR: Received reveal value from authority %s " - "doesn't match the commit value.", - sr_commit_get_rsa_fpr(commit)); - goto invalid; - } - } - - return 0; - invalid: - return -1; -} - -/* Return true iff the commit contains an encoded reveal value. */ -STATIC int -commit_has_reveal_value(const sr_commit_t *commit) -{ - return !tor_mem_is_zero(commit->encoded_reveal, - sizeof(commit->encoded_reveal)); -} - -/* Parse the encoded commit. The format is: - * base64-encode( TIMESTAMP || H(REVEAL) ) - * - * If successfully decoded and parsed, commit is updated and 0 is returned. - * On error, return -1. */ -STATIC int -commit_decode(const char *encoded, sr_commit_t *commit) -{ - int decoded_len = 0; - size_t offset = 0; - char b64_decoded[SR_COMMIT_LEN]; - - tor_assert(encoded); - tor_assert(commit); - - if (strlen(encoded) > SR_COMMIT_BASE64_LEN) { - /* This means that if we base64 decode successfully the reveiced commit, - * we'll end up with a bigger decoded commit thus unusable. */ - goto error; - } - - /* Decode our encoded commit. Let's be careful here since _encoded_ is - * coming from the network in a dirauth vote so we expect nothing more - * than the base64 encoded length of a commit. */ - decoded_len = base64_decode(b64_decoded, sizeof(b64_decoded), - encoded, strlen(encoded)); - if (decoded_len < 0) { - log_warn(LD_BUG, "SR: Commit from authority %s can't be decoded.", - sr_commit_get_rsa_fpr(commit)); - goto error; - } - - if (decoded_len != SR_COMMIT_LEN) { - log_warn(LD_BUG, "SR: Commit from authority %s decoded length doesn't " - "match the expected length (%d vs %u).", - sr_commit_get_rsa_fpr(commit), decoded_len, - (unsigned)SR_COMMIT_LEN); - goto error; - } - - /* First is the timestamp (8 bytes). */ - commit->commit_ts = tor_ntohll(get_uint64(b64_decoded)); - offset += sizeof(uint64_t); - /* Next is hashed reveal. */ - memcpy(commit->hashed_reveal, b64_decoded + offset, - sizeof(commit->hashed_reveal)); - /* Copy the base64 blob to the commit. Useful for voting. */ - strlcpy(commit->encoded_commit, encoded, sizeof(commit->encoded_commit)); - - return 0; - - error: - return -1; -} - -/* Parse the b64 blob at encoded containing reveal information and - * store the information in-place in commit. Return 0 on success else - * a negative value. */ -STATIC int -reveal_decode(const char *encoded, sr_commit_t *commit) -{ - int decoded_len = 0; - char b64_decoded[SR_REVEAL_LEN]; - - tor_assert(encoded); - tor_assert(commit); - - if (strlen(encoded) > SR_REVEAL_BASE64_LEN) { - /* This means that if we base64 decode successfully the received reveal - * value, we'll end up with a bigger decoded value thus unusable. */ - goto error; - } - - /* Decode our encoded reveal. Let's be careful here since _encoded_ is - * coming from the network in a dirauth vote so we expect nothing more - * than the base64 encoded length of our reveal. */ - decoded_len = base64_decode(b64_decoded, sizeof(b64_decoded), - encoded, strlen(encoded)); - if (decoded_len < 0) { - log_warn(LD_BUG, "SR: Reveal from authority %s can't be decoded.", - sr_commit_get_rsa_fpr(commit)); - goto error; - } - - if (decoded_len != SR_REVEAL_LEN) { - log_warn(LD_BUG, "SR: Reveal from authority %s decoded length is " - "doesn't match the expected length (%d vs %u)", - sr_commit_get_rsa_fpr(commit), decoded_len, - (unsigned)SR_REVEAL_LEN); - goto error; - } - - commit->reveal_ts = tor_ntohll(get_uint64(b64_decoded)); - /* Copy the last part, the random value. */ - memcpy(commit->random_number, b64_decoded + 8, - sizeof(commit->random_number)); - /* Also copy the whole message to use during verification */ - strlcpy(commit->encoded_reveal, encoded, sizeof(commit->encoded_reveal)); - - return 0; - - error: - return -1; -} - -/* Encode a reveal element using a given commit object to dst which is a - * buffer large enough to put the base64-encoded reveal construction. The - * format is as follow: - * REVEAL = base64-encode( TIMESTAMP || H(RN) ) - * Return base64 encoded length on success else a negative value. - */ -STATIC int -reveal_encode(const sr_commit_t *commit, char *dst, size_t len) -{ - int ret; - size_t offset = 0; - char buf[SR_REVEAL_LEN] = {0}; - - tor_assert(commit); - tor_assert(dst); - - set_uint64(buf, tor_htonll(commit->reveal_ts)); - offset += sizeof(uint64_t); - memcpy(buf + offset, commit->random_number, - sizeof(commit->random_number)); - - /* Let's clean the buffer and then b64 encode it. */ - memset(dst, 0, len); - ret = base64_encode(dst, len, buf, sizeof(buf), 0); - /* Wipe this buffer because it contains our random value. */ - memwipe(buf, 0, sizeof(buf)); - return ret; -} - -/* Encode the given commit object to dst which is a buffer large enough to - * put the base64-encoded commit. The format is as follow: - * COMMIT = base64-encode( TIMESTAMP || H(H(RN)) ) - * Return base64 encoded length on success else a negative value. - */ -STATIC int -commit_encode(const sr_commit_t *commit, char *dst, size_t len) -{ - size_t offset = 0; - char buf[SR_COMMIT_LEN] = {0}; - - tor_assert(commit); - tor_assert(dst); - - /* First is the timestamp (8 bytes). */ - set_uint64(buf, tor_htonll(commit->commit_ts)); - offset += sizeof(uint64_t); - /* and then the hashed reveal. */ - memcpy(buf + offset, commit->hashed_reveal, - sizeof(commit->hashed_reveal)); - - /* Clean the buffer and then b64 encode it. */ - memset(dst, 0, len); - return base64_encode(dst, len, buf, sizeof(buf), 0); -} - -/* Cleanup both our global state and disk state. */ -static void -sr_cleanup(void) -{ - sr_state_free_all(); -} - -/* Using commit, return a newly allocated string containing the commit - * information that should be used during SRV calculation. It's the caller - * responsibility to free the memory. Return NULL if this is not a commit to be - * used for SRV calculation. */ -static char * -get_srv_element_from_commit(const sr_commit_t *commit) -{ - char *element; - tor_assert(commit); - - if (!commit_has_reveal_value(commit)) { - return NULL; - } - - tor_asprintf(&element, "%s%s", sr_commit_get_rsa_fpr(commit), - commit->encoded_reveal); - return element; -} - -/* Return a srv object that is built with the construction: - * SRV = SHA3-256("shared-random" | INT_8(reveal_num) | - * INT_4(version) | HASHED_REVEALS | previous_SRV) - * This function cannot fail. */ -static sr_srv_t * -generate_srv(const char *hashed_reveals, uint64_t reveal_num, - const sr_srv_t *previous_srv) -{ - char msg[DIGEST256_LEN + SR_SRV_MSG_LEN] = {0}; - size_t offset = 0; - sr_srv_t *srv; - - tor_assert(hashed_reveals); - - /* Add the invariant token. */ - memcpy(msg, SR_SRV_TOKEN, SR_SRV_TOKEN_LEN); - offset += SR_SRV_TOKEN_LEN; - set_uint64(msg + offset, tor_htonll(reveal_num)); - offset += sizeof(uint64_t); - set_uint32(msg + offset, htonl(SR_PROTO_VERSION)); - offset += sizeof(uint32_t); - memcpy(msg + offset, hashed_reveals, DIGEST256_LEN); - offset += DIGEST256_LEN; - if (previous_srv != NULL) { - memcpy(msg + offset, previous_srv->value, sizeof(previous_srv->value)); - } - - /* Ok we have our message and key for the HMAC computation, allocate our - * srv object and do the last step. */ - srv = tor_malloc_zero(sizeof(*srv)); - crypto_digest256((char *) srv->value, msg, sizeof(msg), SR_DIGEST_ALG); - srv->num_reveals = reveal_num; - - { - /* Debugging. */ - char srv_hash_encoded[SR_SRV_VALUE_BASE64_LEN + 1]; - sr_srv_encode(srv_hash_encoded, sizeof(srv_hash_encoded), srv); - log_info(LD_DIR, "SR: Generated SRV: %s", srv_hash_encoded); - } - return srv; -} - -/* Compare reveal values and return the result. This should exclusively be - * used by smartlist_sort(). */ -static int -compare_reveal_(const void **_a, const void **_b) -{ - const sr_commit_t *a = *_a, *b = *_b; - return fast_memcmp(a->hashed_reveal, b->hashed_reveal, - sizeof(a->hashed_reveal)); -} - -/* Given commit give the line that we should place in our votes. - * It's the responsibility of the caller to free the string. */ -static char * -get_vote_line_from_commit(const sr_commit_t *commit, sr_phase_t phase) -{ - char *vote_line = NULL; - - switch (phase) { - case SR_PHASE_COMMIT: - tor_asprintf(&vote_line, "%s %u %s %s %s\n", - commit_ns_str, - SR_PROTO_VERSION, - crypto_digest_algorithm_get_name(commit->alg), - sr_commit_get_rsa_fpr(commit), - commit->encoded_commit); - break; - case SR_PHASE_REVEAL: - { - /* Send a reveal value for this commit if we have one. */ - const char *reveal_str = commit->encoded_reveal; - if (tor_mem_is_zero(commit->encoded_reveal, - sizeof(commit->encoded_reveal))) { - reveal_str = ""; - } - tor_asprintf(&vote_line, "%s %u %s %s %s %s\n", - commit_ns_str, - SR_PROTO_VERSION, - crypto_digest_algorithm_get_name(commit->alg), - sr_commit_get_rsa_fpr(commit), - commit->encoded_commit, reveal_str); - break; - } - default: - tor_assert(0); - } - - log_debug(LD_DIR, "SR: Commit vote line: %s", vote_line); - return vote_line; -} - -/* Convert a given srv object to a string for the control port. This doesn't - * fail and the srv object MUST be valid. */ -static char * -srv_to_control_string(const sr_srv_t *srv) -{ - char *srv_str; - char srv_hash_encoded[SR_SRV_VALUE_BASE64_LEN + 1]; - tor_assert(srv); - - sr_srv_encode(srv_hash_encoded, sizeof(srv_hash_encoded), srv); - tor_asprintf(&srv_str, "%s", srv_hash_encoded); - return srv_str; -} - -/* Return a heap allocated string that contains the given srv string - * representation formatted for a networkstatus document using the - * key as the start of the line. This doesn't return NULL. */ -static char * -srv_to_ns_string(const sr_srv_t *srv, const char *key) -{ - char *srv_str; - char srv_hash_encoded[SR_SRV_VALUE_BASE64_LEN + 1]; - tor_assert(srv); - tor_assert(key); - - sr_srv_encode(srv_hash_encoded, sizeof(srv_hash_encoded), srv); - tor_asprintf(&srv_str, "%s %" PRIu64 " %s\n", key, - srv->num_reveals, srv_hash_encoded); - log_debug(LD_DIR, "SR: Consensus SRV line: %s", srv_str); - return srv_str; -} - -/* Given the previous SRV and the current SRV, return a heap allocated - * string with their data that could be put in a vote or a consensus. Caller - * must free the returned string. Return NULL if no SRVs were provided. */ -static char * -get_ns_str_from_sr_values(const sr_srv_t *prev_srv, const sr_srv_t *cur_srv) -{ - smartlist_t *chunks = NULL; - char *srv_str; - - if (!prev_srv && !cur_srv) { - return NULL; - } - - chunks = smartlist_new(); - - if (prev_srv) { - char *srv_line = srv_to_ns_string(prev_srv, previous_srv_str); - smartlist_add(chunks, srv_line); - } - - if (cur_srv) { - char *srv_line = srv_to_ns_string(cur_srv, current_srv_str); - smartlist_add(chunks, srv_line); - } - - /* Join the line(s) here in one string to return. */ - srv_str = smartlist_join_strings(chunks, "", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, s, tor_free(s)); - smartlist_free(chunks); - - return srv_str; -} - -/* Return 1 iff the two commits have the same commitment values. This - * function does not care about reveal values. */ -STATIC int -commitments_are_the_same(const sr_commit_t *commit_one, - const sr_commit_t *commit_two) -{ - tor_assert(commit_one); - tor_assert(commit_two); - - if (strcmp(commit_one->encoded_commit, commit_two->encoded_commit)) { - return 0; - } - return 1; -} - -/* We just received a commit from the vote of authority with - * identity_digest. Return 1 if this commit is authorititative that - * is, it belongs to the authority that voted it. Else return 0 if not. */ -STATIC int -commit_is_authoritative(const sr_commit_t *commit, - const char *voter_key) -{ - tor_assert(commit); - tor_assert(voter_key); - - return fast_memeq(commit->rsa_identity, voter_key, - sizeof(commit->rsa_identity)); -} - -/* Decide if the newly received commit should be kept depending on - * the current phase and state of the protocol. The voter_key is the - * RSA identity key fingerprint of the authority's vote from which the - * commit comes from. The phase is the phase we should be validating - * the commit for. Return 1 if the commit should be added to our state or 0 - * if not. */ -STATIC int -should_keep_commit(const sr_commit_t *commit, const char *voter_key, - sr_phase_t phase) -{ - const sr_commit_t *saved_commit; - - tor_assert(commit); - tor_assert(voter_key); - - log_debug(LD_DIR, "SR: Inspecting commit from %s (voter: %s)?", - sr_commit_get_rsa_fpr(commit), - hex_str(voter_key, DIGEST_LEN)); - - /* For a commit to be considered, it needs to be authoritative (it should - * be the voter's own commit). */ - if (!commit_is_authoritative(commit, voter_key)) { - log_debug(LD_DIR, "SR: Ignoring non-authoritative commit."); - goto ignore; - } - - /* Let's make sure, for extra safety, that this fingerprint is known to - * us. Even though this comes from a vote, doesn't hurt to be - * extracareful. */ - if (trusteddirserver_get_by_v3_auth_digest(commit->rsa_identity) == NULL) { - log_warn(LD_DIR, "SR: Fingerprint %s is not from a recognized " - "authority. Discarding commit.", - escaped(commit->rsa_identity)); - goto ignore; - } - - /* Check if the authority that voted for commit has already posted - * a commit before. */ - saved_commit = sr_state_get_commit(commit->rsa_identity); - - switch (phase) { - case SR_PHASE_COMMIT: - /* Already having a commit for an authority so ignore this one. */ - if (saved_commit) { - /* Receiving known commits should happen naturally since commit phase - lasts multiple rounds. However if the commitment value changes - during commit phase, it might be a bug so log more loudly. */ - if (!commitments_are_the_same(commit, saved_commit)) { - log_info(LD_DIR, - "SR: Received altered commit from %s in commit phase.", - sr_commit_get_rsa_fpr(commit)); - } else { - log_debug(LD_DIR, "SR: Ignoring known commit during commit phase."); - } - goto ignore; - } - - /* A commit with a reveal value during commitment phase is very wrong. */ - if (commit_has_reveal_value(commit)) { - log_warn(LD_DIR, "SR: Commit from authority %s has a reveal value " - "during COMMIT phase. (voter: %s)", - sr_commit_get_rsa_fpr(commit), - hex_str(voter_key, DIGEST_LEN)); - goto ignore; - } - break; - case SR_PHASE_REVEAL: - /* We are now in reveal phase. We keep a commit if and only if: - * - * - We have already seen a commit by this auth, AND - * - the saved commit has the same commitment value as this one, AND - * - the saved commit has no reveal information, AND - * - this commit does have reveal information, AND - * - the reveal & commit information are matching. - * - * If all the above are true, then we are interested in this new commit - * for its reveal information. */ - - if (!saved_commit) { - log_debug(LD_DIR, "SR: Ignoring commit first seen in reveal phase."); - goto ignore; - } - - if (!commitments_are_the_same(commit, saved_commit)) { - log_warn(LD_DIR, "SR: Commit from authority %s is different from " - "previous commit in our state (voter: %s)", - sr_commit_get_rsa_fpr(commit), - hex_str(voter_key, DIGEST_LEN)); - goto ignore; - } - - if (commit_has_reveal_value(saved_commit)) { - log_debug(LD_DIR, "SR: Ignoring commit with known reveal info."); - goto ignore; - } - - if (!commit_has_reveal_value(commit)) { - log_debug(LD_DIR, "SR: Ignoring commit without reveal value."); - goto ignore; - } - - if (verify_commit_and_reveal(commit) < 0) { - log_warn(LD_BUG, "SR: Commit from authority %s has an invalid " - "reveal value. (voter: %s)", - sr_commit_get_rsa_fpr(commit), - hex_str(voter_key, DIGEST_LEN)); - goto ignore; - } - break; - default: - tor_assert(0); - } - - return 1; - - ignore: - return 0; -} - -/* We are in reveal phase and we found a valid and verified commit in - * a vote that contains reveal values that we could use. Update the commit - * we have in our state. Never call this with an unverified commit. */ -STATIC void -save_commit_during_reveal_phase(const sr_commit_t *commit) -{ - sr_commit_t *saved_commit; - - tor_assert(commit); - - /* Get the commit from our state. */ - saved_commit = sr_state_get_commit(commit->rsa_identity); - tor_assert(saved_commit); - /* Safety net. They can not be different commitments at this point. */ - int same_commits = commitments_are_the_same(commit, saved_commit); - tor_assert(same_commits); - - /* Copy reveal information to our saved commit. */ - sr_state_copy_reveal_info(saved_commit, commit); -} - -/* Save commit to our persistent state. Depending on the current - * phase, different actions are taken. Steals reference of commit. - * The commit object MUST be valid and verified before adding it to the - * state. */ -STATIC void -save_commit_to_state(sr_commit_t *commit) -{ - sr_phase_t phase = sr_state_get_phase(); - - ASSERT_COMMIT_VALID(commit); - - switch (phase) { - case SR_PHASE_COMMIT: - /* During commit phase, just save any new authoritative commit */ - sr_state_add_commit(commit); - break; - case SR_PHASE_REVEAL: - save_commit_during_reveal_phase(commit); - sr_commit_free(commit); - break; - default: - tor_assert(0); - } -} - -/* Return 1 if we should we keep an SRV voted by n_agreements auths. - * Return 0 if we should ignore it. */ -static int -should_keep_srv(int n_agreements) -{ - /* Check if the most popular SRV has reached majority. */ - int n_voters = get_n_authorities(V3_DIRINFO); - int votes_required_for_majority = (n_voters / 2) + 1; - - /* We need at the very least majority to keep a value. */ - if (n_agreements < votes_required_for_majority) { - log_notice(LD_DIR, "SR: SRV didn't reach majority [%d/%d]!", - n_agreements, votes_required_for_majority); - return 0; - } - - /* When we just computed a new SRV, we need to have super majority in order - * to keep it. */ - if (sr_state_srv_is_fresh()) { - /* Check if we have super majority for this new SRV value. */ - if (n_agreements < num_srv_agreements_from_vote) { - log_notice(LD_DIR, "SR: New SRV didn't reach agreement [%d/%d]!", - n_agreements, num_srv_agreements_from_vote); - return 0; - } - } - - return 1; -} - -/* Helper: compare two DIGEST256_LEN digests. */ -static int -compare_srvs_(const void **_a, const void **_b) -{ - const sr_srv_t *a = *_a, *b = *_b; - return tor_memcmp(a->value, b->value, sizeof(a->value)); -} - -/* Return the most frequent member of the sorted list of DIGEST256_LEN - * digests in sl with the count of that most frequent element. */ -static sr_srv_t * -smartlist_get_most_frequent_srv(const smartlist_t *sl, int *count_out) -{ - return smartlist_get_most_frequent_(sl, compare_srvs_, count_out); -} - -/** Compare two SRVs. Used in smartlist sorting. */ -static int -compare_srv_(const void **_a, const void **_b) -{ - const sr_srv_t *a = *_a, *b = *_b; - return fast_memcmp(a->value, b->value, - sizeof(a->value)); -} - -/* Using a list of votes, return the SRV object from them that has - * been voted by the majority of dirauths. If current is set, we look - * for the current SRV value else the previous one. The returned pointer is - * an object located inside a vote. NULL is returned if no appropriate value - * could be found. */ -STATIC sr_srv_t * -get_majority_srv_from_votes(const smartlist_t *votes, int current) -{ - int count = 0; - sr_srv_t *most_frequent_srv = NULL; - sr_srv_t *the_srv = NULL; - smartlist_t *srv_list; - - tor_assert(votes); - - srv_list = smartlist_new(); - - /* Walk over votes and register any SRVs found. */ - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - sr_srv_t *srv_tmp = NULL; - - if (!v->sr_info.participate) { - /* Ignore vote that do not participate. */ - continue; - } - /* Do we want previous or current SRV? */ - srv_tmp = current ? v->sr_info.current_srv : v->sr_info.previous_srv; - if (!srv_tmp) { - continue; - } - - smartlist_add(srv_list, srv_tmp); - } SMARTLIST_FOREACH_END(v); - - smartlist_sort(srv_list, compare_srv_); - most_frequent_srv = smartlist_get_most_frequent_srv(srv_list, &count); - if (!most_frequent_srv) { - goto end; - } - - /* Was this SRV voted by enough auths for us to keep it? */ - if (!should_keep_srv(count)) { - goto end; - } - - /* We found an SRV that we can use! Habemus SRV! */ - the_srv = most_frequent_srv; - - { - /* Debugging */ - char encoded[SR_SRV_VALUE_BASE64_LEN + 1]; - sr_srv_encode(encoded, sizeof(encoded), the_srv); - log_debug(LD_DIR, "SR: Chosen SRV by majority: %s (%d votes)", encoded, - count); - } - - end: - /* We do not free any sr_srv_t values, we don't have the ownership. */ - smartlist_free(srv_list); - return the_srv; -} - -/* Encode the given shared random value and put it in dst. Destination - * buffer must be at least SR_SRV_VALUE_BASE64_LEN plus the NULL byte. */ -void -sr_srv_encode(char *dst, size_t dst_len, const sr_srv_t *srv) -{ - int ret; - /* Extra byte for the NULL terminated char. */ - char buf[SR_SRV_VALUE_BASE64_LEN + 1]; - - tor_assert(dst); - tor_assert(srv); - tor_assert(dst_len >= sizeof(buf)); - - ret = base64_encode(buf, sizeof(buf), (const char *) srv->value, - sizeof(srv->value), 0); - /* Always expect the full length without the NULL byte. */ - tor_assert(ret == (sizeof(buf) - 1)); - tor_assert(ret <= (int) dst_len); - strlcpy(dst, buf, dst_len); -} - -/* Free a commit object. */ -void -sr_commit_free_(sr_commit_t *commit) -{ - if (commit == NULL) { - return; - } - /* Make sure we do not leave OUR random number in memory. */ - memwipe(commit->random_number, 0, sizeof(commit->random_number)); - tor_free(commit); -} - -/* Generate the commitment/reveal value for the protocol run starting at - * timestamp. my_rsa_cert is our authority RSA certificate. */ -sr_commit_t * -sr_generate_our_commit(time_t timestamp, const authority_cert_t *my_rsa_cert) -{ - sr_commit_t *commit = NULL; - char digest[DIGEST_LEN]; - - tor_assert(my_rsa_cert); - - /* Get our RSA identity fingerprint */ - if (crypto_pk_get_digest(my_rsa_cert->identity_key, digest) < 0) { - goto error; - } - - /* New commit with our identity key. */ - commit = commit_new(digest); - - /* Generate the reveal random value */ - crypto_strongest_rand(commit->random_number, - sizeof(commit->random_number)); - commit->commit_ts = commit->reveal_ts = timestamp; - - /* Now get the base64 blob that corresponds to our reveal */ - if (reveal_encode(commit, commit->encoded_reveal, - sizeof(commit->encoded_reveal)) < 0) { - log_err(LD_DIR, "SR: Unable to encode our reveal value!"); - goto error; - } - - /* Now let's create the commitment */ - tor_assert(commit->alg == SR_DIGEST_ALG); - /* The invariant length is used here since the encoded reveal variable - * has an extra byte added for the NULL terminated byte. */ - if (crypto_digest256(commit->hashed_reveal, commit->encoded_reveal, - SR_REVEAL_BASE64_LEN, commit->alg) < 0) { - goto error; - } - - /* Now get the base64 blob that corresponds to our commit. */ - if (commit_encode(commit, commit->encoded_commit, - sizeof(commit->encoded_commit)) < 0) { - log_err(LD_DIR, "SR: Unable to encode our commit value!"); - goto error; - } - - log_debug(LD_DIR, "SR: Generated our commitment:"); - commit_log(commit); - /* Our commit better be valid :). */ - commit->valid = 1; - return commit; - - error: - sr_commit_free(commit); - return NULL; -} - -/* Compute the shared random value based on the active commits in our state. */ -void -sr_compute_srv(void) -{ - uint64_t reveal_num = 0; - char *reveals = NULL; - smartlist_t *chunks, *commits; - digestmap_t *state_commits; - - /* Computing a shared random value in the commit phase is very wrong. This - * should only happen at the very end of the reveal phase when a new - * protocol run is about to start. */ - tor_assert(sr_state_get_phase() == SR_PHASE_REVEAL); - state_commits = sr_state_get_commits(); - - commits = smartlist_new(); - chunks = smartlist_new(); - - /* We must make a list of commit ordered by authority fingerprint in - * ascending order as specified by proposal 250. */ - DIGESTMAP_FOREACH(state_commits, key, sr_commit_t *, c) { - /* Extra safety net, make sure we have valid commit before using it. */ - ASSERT_COMMIT_VALID(c); - /* Let's not use a commit from an authority that we don't know. It's - * possible that an authority could be removed during a protocol run so - * that commit value should never be used in the SRV computation. */ - if (trusteddirserver_get_by_v3_auth_digest(c->rsa_identity) == NULL) { - log_warn(LD_DIR, "SR: Fingerprint %s is not from a recognized " - "authority. Discarding commit for the SRV computation.", - sr_commit_get_rsa_fpr(c)); - continue; - } - /* We consider this commit valid. */ - smartlist_add(commits, c); - } DIGESTMAP_FOREACH_END; - smartlist_sort(commits, compare_reveal_); - - /* Now for each commit for that sorted list in ascending order, we'll - * build the element for each authority that needs to go into the srv - * computation. */ - SMARTLIST_FOREACH_BEGIN(commits, const sr_commit_t *, c) { - char *element = get_srv_element_from_commit(c); - if (element) { - smartlist_add(chunks, element); - reveal_num++; - } - } SMARTLIST_FOREACH_END(c); - smartlist_free(commits); - - { - /* Join all reveal values into one giant string that we'll hash so we - * can generated our shared random value. */ - sr_srv_t *current_srv; - char hashed_reveals[DIGEST256_LEN]; - reveals = smartlist_join_strings(chunks, "", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, s, tor_free(s)); - smartlist_free(chunks); - if (crypto_digest256(hashed_reveals, reveals, strlen(reveals), - SR_DIGEST_ALG) < 0) { - goto end; - } - current_srv = generate_srv(hashed_reveals, reveal_num, - sr_state_get_previous_srv()); - sr_state_set_current_srv(current_srv); - /* We have a fresh SRV, flag our state. */ - sr_state_set_fresh_srv(); - } - - end: - tor_free(reveals); -} - -/* Parse a list of arguments from a SRV value either from a vote, consensus - * or from our disk state and return a newly allocated srv object. NULL is - * returned on error. - * - * The arguments' order: - * num_reveals, value - */ -sr_srv_t * -sr_parse_srv(const smartlist_t *args) -{ - char *value; - int ok, ret; - uint64_t num_reveals; - sr_srv_t *srv = NULL; - - tor_assert(args); - - if (smartlist_len(args) < 2) { - goto end; - } - - /* First argument is the number of reveal values */ - num_reveals = tor_parse_uint64(smartlist_get(args, 0), - 10, 0, UINT64_MAX, &ok, NULL); - if (!ok) { - goto end; - } - /* Second and last argument is the shared random value it self. */ - value = smartlist_get(args, 1); - if (strlen(value) != SR_SRV_VALUE_BASE64_LEN) { - goto end; - } - - srv = tor_malloc_zero(sizeof(*srv)); - srv->num_reveals = num_reveals; - /* We substract one byte from the srclen because the function ignores the - * '=' character in the given buffer. This is broken but it's a documented - * behavior of the implementation. */ - ret = base64_decode((char *) srv->value, sizeof(srv->value), value, - SR_SRV_VALUE_BASE64_LEN - 1); - if (ret != sizeof(srv->value)) { - tor_free(srv); - srv = NULL; - goto end; - } - end: - return srv; -} - -/* Parse a commit from a vote or from our disk state and return a newly - * allocated commit object. NULL is returned on error. - * - * The commit's data is in args and the order matters very much: - * version, algname, RSA fingerprint, commit value[, reveal value] - */ -sr_commit_t * -sr_parse_commit(const smartlist_t *args) -{ - uint32_t version; - char *value, digest[DIGEST_LEN]; - digest_algorithm_t alg; - const char *rsa_identity_fpr; - sr_commit_t *commit = NULL; - - if (smartlist_len(args) < 4) { - goto error; - } - - /* First is the version number of the SR protocol which indicates at which - * version that commit was created. */ - value = smartlist_get(args, 0); - version = (uint32_t) tor_parse_ulong(value, 10, 1, UINT32_MAX, NULL, NULL); - if (version > SR_PROTO_VERSION) { - log_info(LD_DIR, "SR: Commit version %" PRIu32 " (%s) is not supported.", - version, escaped(value)); - goto error; - } - - /* Second is the algorithm. */ - value = smartlist_get(args, 1); - alg = crypto_digest_algorithm_parse_name(value); - if (alg != SR_DIGEST_ALG) { - log_warn(LD_BUG, "SR: Commit algorithm %s is not recognized.", - escaped(value)); - goto error; - } - - /* Third argument is the RSA fingerprint of the auth and turn it into a - * digest value. */ - rsa_identity_fpr = smartlist_get(args, 2); - if (base16_decode(digest, DIGEST_LEN, rsa_identity_fpr, - HEX_DIGEST_LEN) < 0) { - log_warn(LD_DIR, "SR: RSA fingerprint %s not decodable", - escaped(rsa_identity_fpr)); - goto error; - } - - /* Allocate commit since we have a valid identity now. */ - commit = commit_new(digest); - - /* Fourth argument is the commitment value base64-encoded. */ - value = smartlist_get(args, 3); - if (commit_decode(value, commit) < 0) { - goto error; - } - - /* (Optional) Fifth argument is the revealed value. */ - if (smartlist_len(args) > 4) { - value = smartlist_get(args, 4); - if (reveal_decode(value, commit) < 0) { - goto error; - } - } - - return commit; - - error: - sr_commit_free(commit); - return NULL; -} - -/* Called when we are done parsing a vote by voter_key that might - * contain some useful commits. Find if any of them should be kept - * and update our state accordingly. Once done, the list of commitments will - * be empty. */ -void -sr_handle_received_commits(smartlist_t *commits, crypto_pk_t *voter_key) -{ - char rsa_identity[DIGEST_LEN]; - - tor_assert(voter_key); - - /* It's possible that the vote has _NO_ commits. */ - if (commits == NULL) { - return; - } - - /* Get the RSA identity fingerprint of this voter */ - if (crypto_pk_get_digest(voter_key, rsa_identity) < 0) { - return; - } - - SMARTLIST_FOREACH_BEGIN(commits, sr_commit_t *, commit) { - /* We won't need the commit in this list anymore, kept or not. */ - SMARTLIST_DEL_CURRENT(commits, commit); - /* Check if this commit is valid and should be stored in our state. */ - if (!should_keep_commit(commit, rsa_identity, - sr_state_get_phase())) { - sr_commit_free(commit); - continue; - } - /* Ok, we have a valid commit now that we are about to put in our state. - * so flag it valid from now on. */ - commit->valid = 1; - /* Everything lines up: save this commit to state then! */ - save_commit_to_state(commit); - } SMARTLIST_FOREACH_END(commit); -} - -/* Return a heap-allocated string containing commits that should be put in - * the votes. It's the responsibility of the caller to free the string. - * This always return a valid string, either empty or with line(s). */ -char * -sr_get_string_for_vote(void) -{ - char *vote_str = NULL; - digestmap_t *state_commits; - smartlist_t *chunks = smartlist_new(); - const or_options_t *options = get_options(); - - /* Are we participating in the protocol? */ - if (!options->AuthDirSharedRandomness) { - goto end; - } - - log_debug(LD_DIR, "SR: Preparing our vote info:"); - - /* First line, put in the vote the participation flag. */ - { - char *sr_flag_line; - tor_asprintf(&sr_flag_line, "%s\n", sr_flag_ns_str); - smartlist_add(chunks, sr_flag_line); - } - - /* In our vote we include every commitment in our permanent state. */ - state_commits = sr_state_get_commits(); - smartlist_t *state_commit_vote_lines = smartlist_new(); - DIGESTMAP_FOREACH(state_commits, key, const sr_commit_t *, commit) { - char *line = get_vote_line_from_commit(commit, sr_state_get_phase()); - smartlist_add(state_commit_vote_lines, line); - } DIGESTMAP_FOREACH_END; - - /* Sort the commit strings by version (string, not numeric), algorithm, - * and fingerprint. This makes sure the commit lines in votes are in a - * recognisable, stable order. */ - smartlist_sort_strings(state_commit_vote_lines); - - /* Now add the sorted list of commits to the vote */ - smartlist_add_all(chunks, state_commit_vote_lines); - smartlist_free(state_commit_vote_lines); - - /* Add the SRV value(s) if any. */ - { - char *srv_lines = get_ns_str_from_sr_values(sr_state_get_previous_srv(), - sr_state_get_current_srv()); - if (srv_lines) { - smartlist_add(chunks, srv_lines); - } - } - - end: - vote_str = smartlist_join_strings(chunks, "", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, s, tor_free(s)); - smartlist_free(chunks); - return vote_str; -} - -/* Return a heap-allocated string that should be put in the consensus and - * contains the shared randomness values. It's the responsibility of the - * caller to free the string. NULL is returned if no SRV(s) available. - * - * This is called when a consensus (any flavor) is bring created thus it - * should NEVER change the state nor the state should be changed in between - * consensus creation. - * - * num_srv_agreements is taken from the votes thus the voted value - * that should be used. - * */ -char * -sr_get_string_for_consensus(const smartlist_t *votes, - int32_t num_srv_agreements) -{ - char *srv_str; - const or_options_t *options = get_options(); - - tor_assert(votes); - - /* Not participating, avoid returning anything. */ - if (!options->AuthDirSharedRandomness) { - log_info(LD_DIR, "SR: Support disabled (AuthDirSharedRandomness %d)", - options->AuthDirSharedRandomness); - goto end; - } - - /* Set the global value of AuthDirNumSRVAgreements found in the votes. */ - num_srv_agreements_from_vote = num_srv_agreements; - - /* Check the votes and figure out if SRVs should be included in the final - * consensus. */ - sr_srv_t *prev_srv = get_majority_srv_from_votes(votes, 0); - sr_srv_t *cur_srv = get_majority_srv_from_votes(votes, 1); - srv_str = get_ns_str_from_sr_values(prev_srv, cur_srv); - if (!srv_str) { - goto end; - } - - return srv_str; - end: - return NULL; -} - -/* We just computed a new consensus. Update our state with the SRVs - * from the consensus (might be NULL as well). Register the SRVs in our SR - * state and prepare for the upcoming protocol round. */ -void -sr_act_post_consensus(const networkstatus_t *consensus) -{ - const or_options_t *options = get_options(); - - /* Don't act if our state hasn't been initialized. We can be called during - * boot time when loading consensus from disk which is prior to the - * initialization of the SR subsystem. We also should not be doing - * anything if we are _not_ a directory authority and if we are a bridge - * authority. */ - if (!sr_state_is_initialized() || !authdir_mode_v3(options) || - authdir_mode_bridge(options)) { - return; - } - - /* Set the majority voted SRVs in our state even if both are NULL. It - * doesn't matter this is what the majority has decided. Obviously, we can - * only do that if we have a consensus. */ - if (consensus) { - /* Start by freeing the current SRVs since the SRVs we believed during - * voting do not really matter. Now that all the votes are in, we use the - * majority's opinion on which are the active SRVs. */ - sr_state_clean_srvs(); - /* Reset the fresh flag of the SRV so we know that from now on we don't - * have a new SRV to vote for. We just used the one from the consensus - * decided by the majority. */ - sr_state_unset_fresh_srv(); - /* Set the SR values from the given consensus. */ - sr_state_set_previous_srv(srv_dup(consensus->sr_info.previous_srv)); - sr_state_set_current_srv(srv_dup(consensus->sr_info.current_srv)); - } - - /* Prepare our state so that it's ready for the next voting period. */ - sr_state_update(dirvote_get_next_valid_after_time()); -} - -/* Initialize shared random subsystem. This MUST be called early in the boot - * process of tor. Return 0 on success else -1 on error. */ -int -sr_init(int save_to_disk) -{ - return sr_state_init(save_to_disk, 1); -} - -/* Save our state to disk and cleanup everything. */ -void -sr_save_and_cleanup(void) -{ - sr_state_save(); - sr_cleanup(); -} - -/* Return the current SRV string representation for the control port. Return a - * newly allocated string on success containing the value else "" if not found - * or if we don't have a valid consensus yet. */ -char * -sr_get_current_for_control(void) -{ - char *srv_str; - const networkstatus_t *c = networkstatus_get_latest_consensus(); - if (c && c->sr_info.current_srv) { - srv_str = srv_to_control_string(c->sr_info.current_srv); - } else { - srv_str = tor_strdup(""); - } - return srv_str; -} - -/* Return the previous SRV string representation for the control port. Return - * a newly allocated string on success containing the value else "" if not - * found or if we don't have a valid consensus yet. */ -char * -sr_get_previous_for_control(void) -{ - char *srv_str; - const networkstatus_t *c = networkstatus_get_latest_consensus(); - if (c && c->sr_info.previous_srv) { - srv_str = srv_to_control_string(c->sr_info.previous_srv); - } else { - srv_str = tor_strdup(""); - } - return srv_str; -} - -/* Return current shared random value from the latest consensus. Caller can - * NOT keep a reference to the returned pointer. Return NULL if none. */ -const sr_srv_t * -sr_get_current(const networkstatus_t *ns) -{ - const networkstatus_t *consensus; - - /* Use provided ns else get a live one */ - if (ns) { - consensus = ns; - } else { - consensus = networkstatus_get_live_consensus(approx_time()); - } - /* Ideally we would never be asked for an SRV without a live consensus. Make - * sure this assumption is correct. */ - tor_assert_nonfatal(consensus); - - if (consensus) { - return consensus->sr_info.current_srv; - } - return NULL; -} - -/* Return previous shared random value from the latest consensus. Caller can - * NOT keep a reference to the returned pointer. Return NULL if none. */ -const sr_srv_t * -sr_get_previous(const networkstatus_t *ns) -{ - const networkstatus_t *consensus; - - /* Use provided ns else get a live one */ - if (ns) { - consensus = ns; - } else { - consensus = networkstatus_get_live_consensus(approx_time()); - } - /* Ideally we would never be asked for an SRV without a live consensus. Make - * sure this assumption is correct. */ - tor_assert_nonfatal(consensus); - - if (consensus) { - return consensus->sr_info.previous_srv; - } - return NULL; -} - -#ifdef TOR_UNIT_TESTS - -/* Set the global value of number of SRV agreements so the test can play - * along by calling specific functions that don't parse the votes prior for - * the AuthDirNumSRVAgreements value. */ -void -set_num_srv_agreements(int32_t value) -{ - num_srv_agreements_from_vote = value; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/shared_random.h b/src/tor/src/or/shared_random.h deleted file mode 100644 index 675a8d8b0..000000000 --- a/src/tor/src/or/shared_random.h +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_SHARED_RANDOM_H -#define TOR_SHARED_RANDOM_H - -/* - * This file contains ABI/API of the shared random protocol defined in - * proposal #250. Every public functions and data structure are namespaced - * with "sr_" which stands for shared random. - */ - -#include "or.h" - -/* Protocol version */ -#define SR_PROTO_VERSION 1 -/* Default digest algorithm. */ -#define SR_DIGEST_ALG DIGEST_SHA3_256 -/* Invariant token in the SRV calculation. */ -#define SR_SRV_TOKEN "shared-random" -/* Don't count the NUL terminated byte even though the TOKEN has it. */ -#define SR_SRV_TOKEN_LEN (sizeof(SR_SRV_TOKEN) - 1) - -/* Length of the random number (in bytes). */ -#define SR_RANDOM_NUMBER_LEN 32 -/* Size of a decoded commit value in a vote or state. It's a hash and a - * timestamp. It adds up to 40 bytes. */ -#define SR_COMMIT_LEN (sizeof(uint64_t) + DIGEST256_LEN) -/* Size of a decoded reveal value from a vote or state. It's a 64 bit - * timestamp and the hashed random number. This adds up to 40 bytes. */ -#define SR_REVEAL_LEN (sizeof(uint64_t) + DIGEST256_LEN) -/* Size of SRV message length. The construction is has follow: - * "shared-random" | INT_8(reveal_num) | INT_4(version) | PREV_SRV */ -#define SR_SRV_MSG_LEN \ - (SR_SRV_TOKEN_LEN + sizeof(uint64_t) + sizeof(uint32_t) + DIGEST256_LEN) - -/* Length of base64 encoded commit NOT including the NUL terminated byte. - * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_COMMIT_BASE64_LEN (BASE64_LEN(SR_COMMIT_LEN)) -/* Length of base64 encoded reveal NOT including the NUL terminated byte. - * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_REVEAL_BASE64_LEN (BASE64_LEN(SR_REVEAL_LEN)) -/* Length of base64 encoded shared random value. It's 32 bytes long so 44 - * bytes from the base64_encode_size formula. That includes the '=' - * character at the end. */ -#define SR_SRV_VALUE_BASE64_LEN (BASE64_LEN(DIGEST256_LEN)) - -/* Assert if commit valid flag is not set. */ -#define ASSERT_COMMIT_VALID(c) tor_assert((c)->valid) - -/* Protocol phase. */ -typedef enum { - /* Commitment phase */ - SR_PHASE_COMMIT = 1, - /* Reveal phase */ - SR_PHASE_REVEAL = 2, -} sr_phase_t; - -/* A shared random value (SRV). */ -typedef struct sr_srv_t { - /* The number of reveal values used to derive this SRV. */ - uint64_t num_reveals; - /* The actual value. This is the stored result of SHA3-256. */ - uint8_t value[DIGEST256_LEN]; -} sr_srv_t; - -/* A commit (either ours or from another authority). */ -typedef struct sr_commit_t { - /* Hashing algorithm used. */ - digest_algorithm_t alg; - /* Indicate if this commit has been verified thus valid. */ - unsigned int valid:1; - - /* Commit owner info */ - - /* The RSA identity key of the authority and its base16 representation, - * which includes the NUL terminated byte. */ - char rsa_identity[DIGEST_LEN]; - char rsa_identity_hex[HEX_DIGEST_LEN + 1]; - - /* Commitment information */ - - /* Timestamp of reveal. Correspond to TIMESTAMP. */ - uint64_t reveal_ts; - /* H(REVEAL) as found in COMMIT message. */ - char hashed_reveal[DIGEST256_LEN]; - /* Base64 encoded COMMIT. We use this to put it in our vote. */ - char encoded_commit[SR_COMMIT_BASE64_LEN + 1]; - - /* Reveal information */ - - /* H(RN) which is what we used as the random value for this commit. We - * don't use the raw bytes since those are sent on the network thus - * avoiding possible information leaks of our PRNG. */ - uint8_t random_number[SR_RANDOM_NUMBER_LEN]; - /* Timestamp of commit. Correspond to TIMESTAMP. */ - uint64_t commit_ts; - /* This is the whole reveal message. We use it during verification */ - char encoded_reveal[SR_REVEAL_BASE64_LEN + 1]; -} sr_commit_t; - -/* API */ - -/* Public methods: */ - -int sr_init(int save_to_disk); -void sr_save_and_cleanup(void); -void sr_act_post_consensus(const networkstatus_t *consensus); -void sr_handle_received_commits(smartlist_t *commits, - crypto_pk_t *voter_key); -sr_commit_t *sr_parse_commit(const smartlist_t *args); -sr_srv_t *sr_parse_srv(const smartlist_t *args); -char *sr_get_string_for_vote(void); -char *sr_get_string_for_consensus(const smartlist_t *votes, - int32_t num_srv_agreements); -void sr_commit_free_(sr_commit_t *commit); -#define sr_commit_free(sr) FREE_AND_NULL(sr_commit_t, sr_commit_free_, (sr)) -void sr_srv_encode(char *dst, size_t dst_len, const sr_srv_t *srv); - -/* Private methods (only used by shared_random_state.c): */ -static inline -const char *sr_commit_get_rsa_fpr(const sr_commit_t *commit) -{ - return commit->rsa_identity_hex; -} - -void sr_compute_srv(void); -sr_commit_t *sr_generate_our_commit(time_t timestamp, - const authority_cert_t *my_rsa_cert); - -char *sr_get_current_for_control(void); -char *sr_get_previous_for_control(void); - -const sr_srv_t *sr_get_current(const networkstatus_t *ns); -const sr_srv_t *sr_get_previous(const networkstatus_t *ns); - -#ifdef SHARED_RANDOM_PRIVATE - -/* Encode */ -STATIC int reveal_encode(const sr_commit_t *commit, char *dst, size_t len); -STATIC int commit_encode(const sr_commit_t *commit, char *dst, size_t len); -/* Decode. */ -STATIC int commit_decode(const char *encoded, sr_commit_t *commit); -STATIC int reveal_decode(const char *encoded, sr_commit_t *commit); - -STATIC int commit_has_reveal_value(const sr_commit_t *commit); - -STATIC int verify_commit_and_reveal(const sr_commit_t *commit); - -STATIC sr_srv_t *get_majority_srv_from_votes(const smartlist_t *votes, - int current); - -STATIC void save_commit_to_state(sr_commit_t *commit); -STATIC sr_srv_t *srv_dup(const sr_srv_t *orig); -STATIC int commitments_are_the_same(const sr_commit_t *commit_one, - const sr_commit_t *commit_two); -STATIC int commit_is_authoritative(const sr_commit_t *commit, - const char *voter_key); -STATIC int should_keep_commit(const sr_commit_t *commit, - const char *voter_key, - sr_phase_t phase); -STATIC void save_commit_during_reveal_phase(const sr_commit_t *commit); - -#endif /* defined(SHARED_RANDOM_PRIVATE) */ - -#ifdef TOR_UNIT_TESTS - -void set_num_srv_agreements(int32_t value); - -#endif /* TOR_UNIT_TESTS */ - -#endif /* !defined(TOR_SHARED_RANDOM_H) */ - diff --git a/src/tor/src/or/shared_random_state.c b/src/tor/src/or/shared_random_state.c deleted file mode 100644 index d6109b2de..000000000 --- a/src/tor/src/or/shared_random_state.c +++ /dev/null @@ -1,1399 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file shared_random_state.c - * - * \brief Functions and data structures for the state of the random protocol - * as defined in proposal #250. - **/ - -#define SHARED_RANDOM_STATE_PRIVATE - -#include "or.h" -#include "shared_random.h" -#include "config.h" -#include "confparse.h" -#include "dirvote.h" -#include "networkstatus.h" -#include "router.h" -#include "shared_random_state.h" - -/* Default filename of the shared random state on disk. */ -static const char default_fname[] = "sr-state"; - -/* String representation of a protocol phase. */ -static const char *phase_str[] = { "unknown", "commit", "reveal" }; - -/* Our shared random protocol state. There is only one possible state per - * protocol run so this is the global state which is reset at every run once - * the shared random value has been computed. */ -static sr_state_t *sr_state = NULL; - -/* Representation of our persistent state on disk. The sr_state above - * contains the data parsed from this state. When we save to disk, we - * translate the sr_state to this sr_disk_state. */ -static sr_disk_state_t *sr_disk_state = NULL; - -/* Disk state file keys. */ -static const char dstate_commit_key[] = "Commit"; -static const char dstate_prev_srv_key[] = "SharedRandPreviousValue"; -static const char dstate_cur_srv_key[] = "SharedRandCurrentValue"; - -/** dummy instance of sr_disk_state_t, used for type-checking its - * members with CONF_CHECK_VAR_TYPE. */ -DUMMY_TYPECHECK_INSTANCE(sr_disk_state_t); - -/* These next two are duplicates or near-duplicates from config.c */ -#define VAR(name, conftype, member, initvalue) \ - { name, CONFIG_TYPE_ ## conftype, offsetof(sr_disk_state_t, member), \ - initvalue CONF_TEST_MEMBERS(sr_disk_state_t, conftype, member) } -/* As VAR, but the option name and member name are the same. */ -#define V(member, conftype, initvalue) \ - VAR(#member, conftype, member, initvalue) -/* Our persistent state magic number. */ -#define SR_DISK_STATE_MAGIC 0x98AB1254 -/* Each protocol phase has 12 rounds */ -#define SHARED_RANDOM_N_ROUNDS 12 -/* Number of phase we have in a protocol. */ -#define SHARED_RANDOM_N_PHASES 2 - -static int -disk_state_validate_cb(void *old_state, void *state, void *default_state, - int from_setconf, char **msg); - -/* Array of variables that are saved to disk as a persistent state. */ -static config_var_t state_vars[] = { - V(Version, UINT, "0"), - V(TorVersion, STRING, NULL), - V(ValidAfter, ISOTIME, NULL), - V(ValidUntil, ISOTIME, NULL), - - V(Commit, LINELIST, NULL), - - V(SharedRandValues, LINELIST_V, NULL), - VAR("SharedRandPreviousValue",LINELIST_S, SharedRandValues, NULL), - VAR("SharedRandCurrentValue", LINELIST_S, SharedRandValues, NULL), - END_OF_CONFIG_VARS -}; - -/* "Extra" variable in the state that receives lines we can't parse. This - * lets us preserve options from versions of Tor newer than us. */ -static config_var_t state_extra_var = { - "__extra", CONFIG_TYPE_LINELIST, - offsetof(sr_disk_state_t, ExtraLines), NULL - CONF_TEST_MEMBERS(sr_disk_state_t, LINELIST, ExtraLines) -}; - -/* Configuration format of sr_disk_state_t. */ -static const config_format_t state_format = { - sizeof(sr_disk_state_t), - SR_DISK_STATE_MAGIC, - offsetof(sr_disk_state_t, magic_), - NULL, - NULL, - state_vars, - disk_state_validate_cb, - &state_extra_var, -}; - -/* Return a string representation of a protocol phase. */ -STATIC const char * -get_phase_str(sr_phase_t phase) -{ - const char *the_string = NULL; - - switch (phase) { - case SR_PHASE_COMMIT: - case SR_PHASE_REVEAL: - the_string = phase_str[phase]; - break; - default: - /* Unknown phase shouldn't be possible. */ - tor_assert(0); - } - - return the_string; -} - -/* Return the voting interval of the tor vote subsystem. */ -static int -get_voting_interval(void) -{ - int interval; - networkstatus_t *consensus = networkstatus_get_live_consensus(time(NULL)); - - if (consensus) { - interval = (int)(consensus->fresh_until - consensus->valid_after); - } else { - /* Same for both a testing and real network. We voluntarily ignore the - * InitialVotingInterval since it complexifies things and it doesn't - * affect the SR protocol. */ - interval = get_options()->V3AuthVotingInterval; - } - tor_assert(interval > 0); - return interval; -} - -/* Given the time now, return the start time of the current round of - * the SR protocol. For example, if it's 23:47:08, the current round thus - * started at 23:47:00 for a voting interval of 10 seconds. */ -STATIC time_t -get_start_time_of_current_round(void) -{ - const or_options_t *options = get_options(); - int voting_interval = get_voting_interval(); - /* First, get the start time of the next round */ - time_t next_start = dirvote_get_next_valid_after_time(); - /* Now roll back next_start by a voting interval to find the start time of - the current round. */ - time_t curr_start = dirvote_get_start_of_next_interval( - next_start - voting_interval - 1, - voting_interval, - options->TestingV3AuthVotingStartOffset); - return curr_start; -} - -/** Return the start time of the current SR protocol run. For example, if the - * time is 23/06/2017 23:47:08 and a full SR protocol run is 24 hours, this - * function should return 23/06/2017 00:00:00. */ -time_t -sr_state_get_start_time_of_current_protocol_run(time_t now) -{ - int total_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; - int voting_interval = get_voting_interval(); - /* Find the time the current round started. */ - time_t beginning_of_current_round = get_start_time_of_current_round(); - - /* Get current SR protocol round */ - int current_round = (now / voting_interval) % total_rounds; - - /* Get start time by subtracting the time elapsed from the beginning of the - protocol run */ - time_t time_elapsed_since_start_of_run = current_round * voting_interval; - return beginning_of_current_round - time_elapsed_since_start_of_run; -} - -/** Return the time (in seconds) it takes to complete a full SR protocol phase - * (e.g. the commit phase). */ -unsigned int -sr_state_get_phase_duration(void) -{ - return SHARED_RANDOM_N_ROUNDS * get_voting_interval(); -} - -/** Return the time (in seconds) it takes to complete a full SR protocol run */ -unsigned int -sr_state_get_protocol_run_duration(void) -{ - int total_protocol_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; - return total_protocol_rounds * get_voting_interval(); -} - -/* Return the time we should expire the state file created at now. - * We expire the state file in the beginning of the next protocol run. */ -STATIC time_t -get_state_valid_until_time(time_t now) -{ - int total_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; - int current_round, voting_interval, rounds_left; - time_t valid_until, beginning_of_current_round; - - voting_interval = get_voting_interval(); - /* Find the time the current round started. */ - beginning_of_current_round = get_start_time_of_current_round(); - - /* Find how many rounds are left till the end of the protocol run */ - current_round = (now / voting_interval) % total_rounds; - rounds_left = total_rounds - current_round; - - /* To find the valid-until time now, take the start time of the current - * round and add to it the time it takes for the leftover rounds to - * complete. */ - valid_until = beginning_of_current_round + (rounds_left * voting_interval); - - { /* Logging */ - char tbuf[ISO_TIME_LEN + 1]; - format_iso_time(tbuf, valid_until); - log_debug(LD_DIR, "SR: Valid until time for state set to %s.", tbuf); - } - - return valid_until; -} - -/* Given the consensus 'valid-after' time, return the protocol phase we should - * be in. */ -STATIC sr_phase_t -get_sr_protocol_phase(time_t valid_after) -{ - /* Shared random protocol has two phases, commit and reveal. */ - int total_periods = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; - int current_slot; - - /* Split time into slots of size 'voting_interval'. See which slot we are - * currently into, and find which phase it corresponds to. */ - current_slot = (valid_after / get_voting_interval()) % total_periods; - - if (current_slot < SHARED_RANDOM_N_ROUNDS) { - return SR_PHASE_COMMIT; - } else { - return SR_PHASE_REVEAL; - } -} - -/* Add the given commit to state. It MUST be a valid commit - * and there shouldn't be a commit from the same authority in the state - * already else verification hasn't been done prior. This takes ownership of - * the commit once in our state. */ -static void -commit_add_to_state(sr_commit_t *commit, sr_state_t *state) -{ - sr_commit_t *saved_commit; - - tor_assert(commit); - tor_assert(state); - - saved_commit = digestmap_set(state->commits, commit->rsa_identity, - commit); - if (saved_commit != NULL) { - /* This means we already have that commit in our state so adding twice - * the same commit is either a code flow error, a corrupted disk state - * or some new unknown issue. */ - log_warn(LD_DIR, "SR: Commit from %s exists in our state while " - "adding it: '%s'", sr_commit_get_rsa_fpr(commit), - commit->encoded_commit); - sr_commit_free(saved_commit); - } -} - -/* Helper: deallocate a commit object. (Used with digestmap_free(), which - * requires a function pointer whose argument is void *). */ -static void -commit_free_(void *p) -{ - sr_commit_free_(p); -} - -#define state_free(val) \ - FREE_AND_NULL(sr_state_t, state_free_, (val)) - -/* Free a state that was allocated with state_new(). */ -static void -state_free_(sr_state_t *state) -{ - if (state == NULL) { - return; - } - tor_free(state->fname); - digestmap_free(state->commits, commit_free_); - tor_free(state->current_srv); - tor_free(state->previous_srv); - tor_free(state); -} - -/* Allocate an sr_state_t object and returns it. If no fname, the - * default file name is used. This function does NOT initialize the state - * timestamp, phase or shared random value. NULL is never returned. */ -static sr_state_t * -state_new(const char *fname, time_t now) -{ - sr_state_t *new_state = tor_malloc_zero(sizeof(*new_state)); - /* If file name is not provided, use default. */ - if (fname == NULL) { - fname = default_fname; - } - new_state->fname = tor_strdup(fname); - new_state->version = SR_PROTO_VERSION; - new_state->commits = digestmap_new(); - new_state->phase = get_sr_protocol_phase(now); - new_state->valid_until = get_state_valid_until_time(now); - return new_state; -} - -/* Set our global state pointer with the one given. */ -static void -state_set(sr_state_t *state) -{ - tor_assert(state); - if (sr_state != NULL) { - state_free(sr_state); - } - sr_state = state; -} - -#define disk_state_free(val) \ - FREE_AND_NULL(sr_disk_state_t, disk_state_free_, (val)) - -/* Free an allocated disk state. */ -static void -disk_state_free_(sr_disk_state_t *state) -{ - if (state == NULL) { - return; - } - config_free(&state_format, state); -} - -/* Allocate a new disk state, initialize it and return it. */ -static sr_disk_state_t * -disk_state_new(time_t now) -{ - sr_disk_state_t *new_state = tor_malloc_zero(sizeof(*new_state)); - - new_state->magic_ = SR_DISK_STATE_MAGIC; - new_state->Version = SR_PROTO_VERSION; - new_state->TorVersion = tor_strdup(get_version()); - new_state->ValidUntil = get_state_valid_until_time(now); - new_state->ValidAfter = now; - - /* Init config format. */ - config_init(&state_format, new_state); - return new_state; -} - -/* Set our global disk state with the given state. */ -static void -disk_state_set(sr_disk_state_t *state) -{ - tor_assert(state); - if (sr_disk_state != NULL) { - disk_state_free(sr_disk_state); - } - sr_disk_state = state; -} - -/* Return -1 if the disk state is invalid (something in there that we can't or - * shouldn't use). Return 0 if everything checks out. */ -static int -disk_state_validate(const sr_disk_state_t *state) -{ - time_t now; - - tor_assert(state); - - /* Do we support the protocol version in the state or is it 0 meaning - * Version wasn't found in the state file or bad anyway ? */ - if (state->Version == 0 || state->Version > SR_PROTO_VERSION) { - goto invalid; - } - - /* If the valid until time is before now, we shouldn't use that state. */ - now = time(NULL); - if (state->ValidUntil < now) { - log_info(LD_DIR, "SR: Disk state has expired. Ignoring it."); - goto invalid; - } - - /* Make sure we don't have a valid after time that is earlier than a valid - * until time which would make things not work well. */ - if (state->ValidAfter >= state->ValidUntil) { - log_info(LD_DIR, "SR: Disk state valid after/until times are invalid."); - goto invalid; - } - - return 0; - - invalid: - return -1; -} - -/* Validate the disk state (NOP for now). */ -static int -disk_state_validate_cb(void *old_state, void *state, void *default_state, - int from_setconf, char **msg) -{ - /* We don't use these; only options do. */ - (void) from_setconf; - (void) default_state; - (void) old_state; - - /* This is called by config_dump which is just before we are about to - * write it to disk. At that point, our global memory state has been - * copied to the disk state so it's fair to assume it's trustable. */ - (void) state; - (void) msg; - return 0; -} - -/* Parse the Commit line(s) in the disk state and translate them to the - * the memory state. Return 0 on success else -1 on error. */ -static int -disk_state_parse_commits(sr_state_t *state, - const sr_disk_state_t *disk_state) -{ - config_line_t *line; - smartlist_t *args = NULL; - - tor_assert(state); - tor_assert(disk_state); - - for (line = disk_state->Commit; line; line = line->next) { - sr_commit_t *commit = NULL; - - /* Extra safety. */ - if (strcasecmp(line->key, dstate_commit_key) || - line->value == NULL) { - /* Ignore any lines that are not commits. */ - tor_fragile_assert(); - continue; - } - args = smartlist_new(); - smartlist_split_string(args, line->value, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args) < 3) { - log_warn(LD_BUG, "SR: Too few arguments in Commit Line: %s", - escaped(line->value)); - goto error; - } - commit = sr_parse_commit(args); - if (commit == NULL) { - /* Ignore badly formed commit. It could also be a authority - * fingerprint that we don't know about so it shouldn't be used. */ - continue; - } - /* We consider parseable commit from our disk state to be valid because - * they need to be in the first place to get in there. */ - commit->valid = 1; - /* Add commit to our state pointer. */ - commit_add_to_state(commit, state); - - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - } - - return 0; - - error: - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - return -1; -} - -/* Parse a share random value line from the disk state and save it to dst - * which is an allocated srv object. Return 0 on success else -1. */ -static int -disk_state_parse_srv(const char *value, sr_srv_t *dst) -{ - int ret = -1; - smartlist_t *args; - sr_srv_t *srv; - - tor_assert(value); - tor_assert(dst); - - args = smartlist_new(); - smartlist_split_string(args, value, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args) < 2) { - log_warn(LD_BUG, "SR: Too few arguments in shared random value. " - "Line: %s", escaped(value)); - goto error; - } - srv = sr_parse_srv(args); - if (srv == NULL) { - goto error; - } - dst->num_reveals = srv->num_reveals; - memcpy(dst->value, srv->value, sizeof(dst->value)); - tor_free(srv); - ret = 0; - - error: - SMARTLIST_FOREACH(args, char *, s, tor_free(s)); - smartlist_free(args); - return ret; -} - -/* Parse both SharedRandCurrentValue and SharedRandPreviousValue line from - * the state. Return 0 on success else -1. */ -static int -disk_state_parse_sr_values(sr_state_t *state, - const sr_disk_state_t *disk_state) -{ - /* Only one value per type (current or previous) is allowed so we keep - * track of it with these flag. */ - unsigned int seen_previous = 0, seen_current = 0; - config_line_t *line; - sr_srv_t *srv = NULL; - - tor_assert(state); - tor_assert(disk_state); - - for (line = disk_state->SharedRandValues; line; line = line->next) { - if (line->value == NULL) { - continue; - } - srv = tor_malloc_zero(sizeof(*srv)); - if (disk_state_parse_srv(line->value, srv) < 0) { - log_warn(LD_BUG, "SR: Broken current SRV line in state %s", - escaped(line->value)); - goto bad; - } - if (!strcasecmp(line->key, dstate_prev_srv_key)) { - if (seen_previous) { - log_warn(LD_DIR, "SR: Second previous SRV value seen. Bad state"); - goto bad; - } - state->previous_srv = srv; - seen_previous = 1; - } else if (!strcasecmp(line->key, dstate_cur_srv_key)) { - if (seen_current) { - log_warn(LD_DIR, "SR: Second current SRV value seen. Bad state"); - goto bad; - } - state->current_srv = srv; - seen_current = 1; - } else { - /* Unknown key. Ignoring. */ - tor_free(srv); - } - } - - return 0; - bad: - tor_free(srv); - return -1; -} - -/* Parse the given disk state and set a newly allocated state. On success, - * return that state else NULL. */ -static sr_state_t * -disk_state_parse(const sr_disk_state_t *new_disk_state) -{ - sr_state_t *new_state = state_new(default_fname, time(NULL)); - - tor_assert(new_disk_state); - - new_state->version = new_disk_state->Version; - new_state->valid_until = new_disk_state->ValidUntil; - new_state->valid_after = new_disk_state->ValidAfter; - - /* Set our current phase according to the valid-after time in our disk - * state. The disk state we are parsing contains everything for the phase - * starting at valid_after so make sure our phase reflects that. */ - new_state->phase = get_sr_protocol_phase(new_state->valid_after); - - /* Parse the shared random values. */ - if (disk_state_parse_sr_values(new_state, new_disk_state) < 0) { - goto error; - } - /* Parse the commits. */ - if (disk_state_parse_commits(new_state, new_disk_state) < 0) { - goto error; - } - /* Great! This new state contains everything we had on disk. */ - return new_state; - - error: - state_free(new_state); - return NULL; -} - -/* From a valid commit object and an allocated config line, set the line's - * value to the state string representation of a commit. */ -static void -disk_state_put_commit_line(const sr_commit_t *commit, config_line_t *line) -{ - char *reveal_str = NULL; - - tor_assert(commit); - tor_assert(line); - - if (!tor_mem_is_zero(commit->encoded_reveal, - sizeof(commit->encoded_reveal))) { - /* Add extra whitespace so we can format the line correctly. */ - tor_asprintf(&reveal_str, " %s", commit->encoded_reveal); - } - tor_asprintf(&line->value, "%u %s %s %s%s", - SR_PROTO_VERSION, - crypto_digest_algorithm_get_name(commit->alg), - sr_commit_get_rsa_fpr(commit), - commit->encoded_commit, - reveal_str != NULL ? reveal_str : ""); - if (reveal_str != NULL) { - memwipe(reveal_str, 0, strlen(reveal_str)); - tor_free(reveal_str); - } -} - -/* From a valid srv object and an allocated config line, set the line's - * value to the state string representation of a shared random value. */ -static void -disk_state_put_srv_line(const sr_srv_t *srv, config_line_t *line) -{ - char encoded[SR_SRV_VALUE_BASE64_LEN + 1]; - - tor_assert(line); - - /* No SRV value thus don't add the line. This is possible since we might - * not have a current or previous SRV value in our state. */ - if (srv == NULL) { - return; - } - sr_srv_encode(encoded, sizeof(encoded), srv); - tor_asprintf(&line->value, "%" PRIu64 " %s", srv->num_reveals, encoded); -} - -/* Reset disk state that is free allocated memory and zeroed the object. */ -static void -disk_state_reset(void) -{ - /* Free allocated memory */ - config_free_lines(sr_disk_state->Commit); - config_free_lines(sr_disk_state->SharedRandValues); - config_free_lines(sr_disk_state->ExtraLines); - tor_free(sr_disk_state->TorVersion); - - /* Clean up the struct */ - memset(sr_disk_state, 0, sizeof(*sr_disk_state)); - - /* Reset it with useful data */ - sr_disk_state->magic_ = SR_DISK_STATE_MAGIC; - sr_disk_state->TorVersion = tor_strdup(get_version()); -} - -/* Update our disk state based on our global SR state. */ -static void -disk_state_update(void) -{ - config_line_t **next, *line; - - tor_assert(sr_disk_state); - tor_assert(sr_state); - - /* Reset current disk state. */ - disk_state_reset(); - - /* First, update elements that we don't need to do a construction. */ - sr_disk_state->Version = sr_state->version; - sr_disk_state->ValidUntil = sr_state->valid_until; - sr_disk_state->ValidAfter = sr_state->valid_after; - - /* Shared random values. */ - next = &sr_disk_state->SharedRandValues; - if (sr_state->previous_srv != NULL) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup(dstate_prev_srv_key); - disk_state_put_srv_line(sr_state->previous_srv, line); - /* Go to the next shared random value. */ - next = &(line->next); - } - if (sr_state->current_srv != NULL) { - *next = line = tor_malloc_zero(sizeof(*line)); - line->key = tor_strdup(dstate_cur_srv_key); - disk_state_put_srv_line(sr_state->current_srv, line); - } - - /* Parse the commits and construct config line(s). */ - next = &sr_disk_state->Commit; - DIGESTMAP_FOREACH(sr_state->commits, key, sr_commit_t *, commit) { - *next = line = tor_malloc_zero(sizeof(*line)); - line->key = tor_strdup(dstate_commit_key); - disk_state_put_commit_line(commit, line); - next = &(line->next); - } DIGESTMAP_FOREACH_END; -} - -/* Load state from disk and put it into our disk state. If the state passes - * validation, our global state will be updated with it. Return 0 on - * success. On error, -EINVAL is returned if the state on disk did contained - * something malformed or is unreadable. -ENOENT is returned indicating that - * the state file is either empty of non existing. */ -static int -disk_state_load_from_disk(void) -{ - int ret; - char *fname; - - fname = get_datadir_fname(default_fname); - ret = disk_state_load_from_disk_impl(fname); - tor_free(fname); - - return ret; -} - -/* Helper for disk_state_load_from_disk(). */ -STATIC int -disk_state_load_from_disk_impl(const char *fname) -{ - int ret; - char *content = NULL; - sr_state_t *parsed_state = NULL; - sr_disk_state_t *disk_state = NULL; - - /* Read content of file so we can parse it. */ - if ((content = read_file_to_str(fname, 0, NULL)) == NULL) { - log_warn(LD_FS, "SR: Unable to read SR state file %s", - escaped(fname)); - ret = -errno; - goto error; - } - - { - config_line_t *lines = NULL; - char *errmsg = NULL; - - /* Every error in this code path will return EINVAL. */ - ret = -EINVAL; - if (config_get_lines(content, &lines, 0) < 0) { - config_free_lines(lines); - goto error; - } - - disk_state = disk_state_new(time(NULL)); - config_assign(&state_format, disk_state, lines, 0, &errmsg); - config_free_lines(lines); - if (errmsg) { - log_warn(LD_DIR, "SR: Reading state error: %s", errmsg); - tor_free(errmsg); - goto error; - } - } - - /* So far so good, we've loaded our state file into our disk state. Let's - * validate it and then parse it. */ - if (disk_state_validate(disk_state) < 0) { - ret = -EINVAL; - goto error; - } - - parsed_state = disk_state_parse(disk_state); - if (parsed_state == NULL) { - ret = -EINVAL; - goto error; - } - state_set(parsed_state); - disk_state_set(disk_state); - tor_free(content); - log_info(LD_DIR, "SR: State loaded successfully from file %s", fname); - return 0; - - error: - disk_state_free(disk_state); - tor_free(content); - return ret; -} - -/* Save the disk state to disk but before that update it from the current - * state so we always have the latest. Return 0 on success else -1. */ -static int -disk_state_save_to_disk(void) -{ - int ret; - char *state, *content = NULL, *fname = NULL; - char tbuf[ISO_TIME_LEN + 1]; - time_t now = time(NULL); - - /* If we didn't have the opportunity to setup an internal disk state, - * don't bother saving something to disk. */ - if (sr_disk_state == NULL) { - ret = 0; - goto done; - } - - /* Make sure that our disk state is up to date with our memory state - * before saving it to disk. */ - disk_state_update(); - state = config_dump(&state_format, NULL, sr_disk_state, 0, 0); - format_local_iso_time(tbuf, now); - tor_asprintf(&content, - "# Tor shared random state file last generated on %s " - "local time\n" - "# Other times below are in UTC\n" - "# Please *do not* edit this file.\n\n%s", - tbuf, state); - tor_free(state); - fname = get_datadir_fname(default_fname); - if (write_str_to_file(fname, content, 0) < 0) { - log_warn(LD_FS, "SR: Unable to write SR state to file %s", fname); - ret = -1; - goto done; - } - ret = 0; - log_debug(LD_DIR, "SR: Saved state to file %s", fname); - - done: - tor_free(fname); - tor_free(content); - return ret; -} - -/* Reset our state to prepare for a new protocol run. Once this returns, all - * commits in the state will be removed and freed. */ -STATIC void -reset_state_for_new_protocol_run(time_t valid_after) -{ - tor_assert(sr_state); - - /* Keep counters in track */ - sr_state->n_reveal_rounds = 0; - sr_state->n_commit_rounds = 0; - sr_state->n_protocol_runs++; - - /* Reset valid-until */ - sr_state->valid_until = get_state_valid_until_time(valid_after); - sr_state->valid_after = valid_after; - - /* We are in a new protocol run so cleanup commits. */ - sr_state_delete_commits(); -} - -/* This is the first round of the new protocol run starting at - * valid_after. Do the necessary housekeeping. */ -STATIC void -new_protocol_run(time_t valid_after) -{ - sr_commit_t *our_commitment = NULL; - - /* Only compute the srv at the end of the reveal phase. */ - if (sr_state->phase == SR_PHASE_REVEAL) { - /* We are about to compute a new shared random value that will be set in - * our state as the current value so rotate values. */ - state_rotate_srv(); - /* Compute the shared randomness value of the day. */ - sr_compute_srv(); - } - - /* Prepare for the new protocol run by reseting the state */ - reset_state_for_new_protocol_run(valid_after); - - /* Do some logging */ - log_info(LD_DIR, "SR: Protocol run #%" PRIu64 " starting!", - sr_state->n_protocol_runs); - - /* Generate fresh commitments for this protocol run */ - our_commitment = sr_generate_our_commit(valid_after, - get_my_v3_authority_cert()); - if (our_commitment) { - /* Add our commitment to our state. In case we are unable to create one - * (highly unlikely), we won't vote for this protocol run since our - * commitment won't be in our state. */ - sr_state_add_commit(our_commitment); - } -} - -/* Return 1 iff the next_phase is a phase transition from the current - * phase that is it's different. */ -STATIC int -is_phase_transition(sr_phase_t next_phase) -{ - return sr_state->phase != next_phase; -} - -/* Helper function: return a commit using the RSA fingerprint of the - * authority or NULL if no such commit is known. */ -static sr_commit_t * -state_query_get_commit(const char *rsa_fpr) -{ - tor_assert(rsa_fpr); - return digestmap_get(sr_state->commits, rsa_fpr); -} - -/* Helper function: This handles the GET state action using an - * obj_type and data needed for the action. */ -static void * -state_query_get_(sr_state_object_t obj_type, const void *data) -{ - void *obj = NULL; - - switch (obj_type) { - case SR_STATE_OBJ_COMMIT: - { - obj = state_query_get_commit(data); - break; - } - case SR_STATE_OBJ_COMMITS: - obj = sr_state->commits; - break; - case SR_STATE_OBJ_CURSRV: - obj = sr_state->current_srv; - break; - case SR_STATE_OBJ_PREVSRV: - obj = sr_state->previous_srv; - break; - case SR_STATE_OBJ_PHASE: - obj = &sr_state->phase; - break; - case SR_STATE_OBJ_VALID_AFTER: - default: - tor_assert(0); - } - return obj; -} - -/* Helper function: This handles the PUT state action using an - * obj_type and data needed for the action. */ -static void -state_query_put_(sr_state_object_t obj_type, void *data) -{ - switch (obj_type) { - case SR_STATE_OBJ_COMMIT: - { - sr_commit_t *commit = data; - tor_assert(commit); - commit_add_to_state(commit, sr_state); - break; - } - case SR_STATE_OBJ_CURSRV: - sr_state->current_srv = (sr_srv_t *) data; - break; - case SR_STATE_OBJ_PREVSRV: - sr_state->previous_srv = (sr_srv_t *) data; - break; - case SR_STATE_OBJ_VALID_AFTER: - sr_state->valid_after = *((time_t *) data); - break; - /* It's not allowed to change the phase nor the full commitments map from - * the state. The phase is decided during a strict process post voting and - * the commits should be put individually. */ - case SR_STATE_OBJ_PHASE: - case SR_STATE_OBJ_COMMITS: - default: - tor_assert(0); - } -} - -/* Helper function: This handles the DEL_ALL state action using an - * obj_type and data needed for the action. */ -static void -state_query_del_all_(sr_state_object_t obj_type) -{ - switch (obj_type) { - case SR_STATE_OBJ_COMMIT: - { - /* We are in a new protocol run so cleanup commitments. */ - DIGESTMAP_FOREACH_MODIFY(sr_state->commits, key, sr_commit_t *, c) { - sr_commit_free(c); - MAP_DEL_CURRENT(key); - } DIGESTMAP_FOREACH_END; - break; - } - /* The following object are _NOT_ suppose to be removed. */ - case SR_STATE_OBJ_CURSRV: - case SR_STATE_OBJ_PREVSRV: - case SR_STATE_OBJ_PHASE: - case SR_STATE_OBJ_COMMITS: - case SR_STATE_OBJ_VALID_AFTER: - default: - tor_assert(0); - } -} - -/* Helper function: This handles the DEL state action using an - * obj_type and data needed for the action. */ -static void -state_query_del_(sr_state_object_t obj_type, void *data) -{ - (void) data; - - switch (obj_type) { - case SR_STATE_OBJ_PREVSRV: - tor_free(sr_state->previous_srv); - break; - case SR_STATE_OBJ_CURSRV: - tor_free(sr_state->current_srv); - break; - case SR_STATE_OBJ_COMMIT: - case SR_STATE_OBJ_COMMITS: - case SR_STATE_OBJ_PHASE: - case SR_STATE_OBJ_VALID_AFTER: - default: - tor_assert(0); - } -} - -/* Query state using an action for an object type obj_type. - * The data pointer needs to point to an object that the action needs - * to use and if anything is required to be returned, it is stored in - * out. - * - * This mechanism exists so we have one single point where we synchronized - * our memory state with our disk state for every actions that changes it. - * We then trigger a write on disk immediately. - * - * This should be the only entry point to our memory state. It's used by all - * our state accessors and should be in the future. */ -static void -state_query(sr_state_action_t action, sr_state_object_t obj_type, - void *data, void **out) -{ - switch (action) { - case SR_STATE_ACTION_GET: - *out = state_query_get_(obj_type, data); - break; - case SR_STATE_ACTION_PUT: - state_query_put_(obj_type, data); - break; - case SR_STATE_ACTION_DEL: - state_query_del_(obj_type, data); - break; - case SR_STATE_ACTION_DEL_ALL: - state_query_del_all_(obj_type); - break; - case SR_STATE_ACTION_SAVE: - /* Only trigger a disk state save. */ - break; - default: - tor_assert(0); - } - - /* If the action actually changes the state, immediately save it to disk. - * The following will sync the state -> disk state and then save it. */ - if (action != SR_STATE_ACTION_GET) { - disk_state_save_to_disk(); - } -} - -/* Delete the current SRV value from the state freeing it and the value is set - * to NULL meaning empty. */ -static void -state_del_current_srv(void) -{ - state_query(SR_STATE_ACTION_DEL, SR_STATE_OBJ_CURSRV, NULL, NULL); -} - -/* Delete the previous SRV value from the state freeing it and the value is - * set to NULL meaning empty. */ -static void -state_del_previous_srv(void) -{ - state_query(SR_STATE_ACTION_DEL, SR_STATE_OBJ_PREVSRV, NULL, NULL); -} - -/* Rotate SRV value by freeing the previous value, assigning the current - * value to the previous one and nullifying the current one. */ -STATIC void -state_rotate_srv(void) -{ - /* First delete previous SRV from the state. Object will be freed. */ - state_del_previous_srv(); - /* Set previous SRV with the current one. */ - sr_state_set_previous_srv(sr_state_get_current_srv()); - /* Nullify the current srv. */ - sr_state_set_current_srv(NULL); -} - -/* Set valid after time in the our state. */ -void -sr_state_set_valid_after(time_t valid_after) -{ - state_query(SR_STATE_ACTION_PUT, SR_STATE_OBJ_VALID_AFTER, - (void *) &valid_after, NULL); -} - -/* Return the phase we are currently in according to our state. */ -sr_phase_t -sr_state_get_phase(void) -{ - void *ptr; - state_query(SR_STATE_ACTION_GET, SR_STATE_OBJ_PHASE, NULL, &ptr); - return *(sr_phase_t *) ptr; -} - -/* Return the previous SRV value from our state. Value CAN be NULL. */ -const sr_srv_t * -sr_state_get_previous_srv(void) -{ - const sr_srv_t *srv; - state_query(SR_STATE_ACTION_GET, SR_STATE_OBJ_PREVSRV, NULL, - (void *) &srv); - return srv; -} - -/* Set the current SRV value from our state. Value CAN be NULL. The srv - * object ownership is transfered to the state object. */ -void -sr_state_set_previous_srv(const sr_srv_t *srv) -{ - state_query(SR_STATE_ACTION_PUT, SR_STATE_OBJ_PREVSRV, (void *) srv, - NULL); -} - -/* Return the current SRV value from our state. Value CAN be NULL. */ -const sr_srv_t * -sr_state_get_current_srv(void) -{ - const sr_srv_t *srv; - state_query(SR_STATE_ACTION_GET, SR_STATE_OBJ_CURSRV, NULL, - (void *) &srv); - return srv; -} - -/* Set the current SRV value from our state. Value CAN be NULL. The srv - * object ownership is transfered to the state object. */ -void -sr_state_set_current_srv(const sr_srv_t *srv) -{ - state_query(SR_STATE_ACTION_PUT, SR_STATE_OBJ_CURSRV, (void *) srv, - NULL); -} - -/* Clean all the SRVs in our state. */ -void -sr_state_clean_srvs(void) -{ - /* Remove SRVs from state. They will be set to NULL as "empty". */ - state_del_previous_srv(); - state_del_current_srv(); -} - -/* Return a pointer to the commits map from our state. CANNOT be NULL. */ -digestmap_t * -sr_state_get_commits(void) -{ - digestmap_t *commits; - state_query(SR_STATE_ACTION_GET, SR_STATE_OBJ_COMMITS, - NULL, (void *) &commits); - tor_assert(commits); - return commits; -} - -/* Update the current SR state as needed for the upcoming voting round at - * valid_after. */ -void -sr_state_update(time_t valid_after) -{ - sr_phase_t next_phase; - - tor_assert(sr_state); - - /* Don't call this function twice in the same voting period. */ - if (valid_after <= sr_state->valid_after) { - log_info(LD_DIR, "SR: Asked to update state twice. Ignoring."); - return; - } - - /* Get phase of upcoming round. */ - next_phase = get_sr_protocol_phase(valid_after); - - /* If we are transitioning to a new protocol phase, prepare the stage. */ - if (is_phase_transition(next_phase)) { - if (next_phase == SR_PHASE_COMMIT) { - /* Going into commit phase means we are starting a new protocol run. */ - new_protocol_run(valid_after); - } - /* Set the new phase for this round */ - sr_state->phase = next_phase; - } else if (sr_state->phase == SR_PHASE_COMMIT && - digestmap_size(sr_state->commits) == 0) { - /* We are _NOT_ in a transition phase so if we are in the commit phase - * and have no commit, generate one. Chances are that we are booting up - * so let's have a commit in our state for the next voting period. */ - sr_commit_t *our_commit = - sr_generate_our_commit(valid_after, get_my_v3_authority_cert()); - if (our_commit) { - /* Add our commitment to our state. In case we are unable to create one - * (highly unlikely), we won't vote for this protocol run since our - * commitment won't be in our state. */ - sr_state_add_commit(our_commit); - } - } - - sr_state_set_valid_after(valid_after); - - /* Count the current round */ - if (sr_state->phase == SR_PHASE_COMMIT) { - /* invariant check: we've not entered reveal phase yet */ - tor_assert(sr_state->n_reveal_rounds == 0); - sr_state->n_commit_rounds++; - } else { - sr_state->n_reveal_rounds++; - } - - { /* Debugging. */ - char tbuf[ISO_TIME_LEN + 1]; - format_iso_time(tbuf, valid_after); - log_info(LD_DIR, "SR: State prepared for upcoming voting period (%s). " - "Upcoming phase is %s (counters: %d commit & %d reveal rounds).", - tbuf, get_phase_str(sr_state->phase), - sr_state->n_commit_rounds, sr_state->n_reveal_rounds); - } -} - -/* Return commit object from the given authority digest rsa_identity. - * Return NULL if not found. */ -sr_commit_t * -sr_state_get_commit(const char *rsa_identity) -{ - sr_commit_t *commit; - - tor_assert(rsa_identity); - - state_query(SR_STATE_ACTION_GET, SR_STATE_OBJ_COMMIT, - (void *) rsa_identity, (void *) &commit); - return commit; -} - -/* Add commit to the permanent state. The commit object ownership is - * transfered to the state so the caller MUST not free it. */ -void -sr_state_add_commit(sr_commit_t *commit) -{ - tor_assert(commit); - - /* Put the commit to the global state. */ - state_query(SR_STATE_ACTION_PUT, SR_STATE_OBJ_COMMIT, - (void *) commit, NULL); - - log_debug(LD_DIR, "SR: Commit from %s has been added to our state.", - sr_commit_get_rsa_fpr(commit)); -} - -/* Remove all commits from our state. */ -void -sr_state_delete_commits(void) -{ - state_query(SR_STATE_ACTION_DEL_ALL, SR_STATE_OBJ_COMMIT, NULL, NULL); -} - -/* Copy the reveal information from commit into saved_commit. - * This saved_commit MUST come from our current SR state. Once modified, - * the disk state is updated. */ -void -sr_state_copy_reveal_info(sr_commit_t *saved_commit, const sr_commit_t *commit) -{ - tor_assert(saved_commit); - tor_assert(commit); - - saved_commit->reveal_ts = commit->reveal_ts; - memcpy(saved_commit->random_number, commit->random_number, - sizeof(saved_commit->random_number)); - - strlcpy(saved_commit->encoded_reveal, commit->encoded_reveal, - sizeof(saved_commit->encoded_reveal)); - state_query(SR_STATE_ACTION_SAVE, 0, NULL, NULL); - log_debug(LD_DIR, "SR: Reveal value learned %s (for commit %s) from %s", - saved_commit->encoded_reveal, saved_commit->encoded_commit, - sr_commit_get_rsa_fpr(saved_commit)); -} - -/* Set the fresh SRV flag from our state. This doesn't need to trigger a - * disk state synchronization so we directly change the state. */ -void -sr_state_set_fresh_srv(void) -{ - sr_state->is_srv_fresh = 1; -} - -/* Unset the fresh SRV flag from our state. This doesn't need to trigger a - * disk state synchronization so we directly change the state. */ -void -sr_state_unset_fresh_srv(void) -{ - sr_state->is_srv_fresh = 0; -} - -/* Return the value of the fresh SRV flag. */ -unsigned int -sr_state_srv_is_fresh(void) -{ - return sr_state->is_srv_fresh; -} - -/* Cleanup and free our disk and memory state. */ -void -sr_state_free_all(void) -{ - state_free(sr_state); - disk_state_free(sr_disk_state); - /* Nullify our global state. */ - sr_state = NULL; - sr_disk_state = NULL; -} - -/* Save our current state in memory to disk. */ -void -sr_state_save(void) -{ - /* Query a SAVE action on our current state so it's synced and saved. */ - state_query(SR_STATE_ACTION_SAVE, 0, NULL, NULL); -} - -/* Return 1 iff the state has been initialized that is it exists in memory. - * Return 0 otherwise. */ -int -sr_state_is_initialized(void) -{ - return sr_state == NULL ? 0 : 1; -} - -/* Initialize the disk and memory state. - * - * If save_to_disk is set to 1, the state is immediately saved to disk after - * creation else it's not thus only kept in memory. - * If read_from_disk is set to 1, we try to load the state from the disk and - * if not found, a new state is created. - * - * Return 0 on success else a negative value on error. */ -int -sr_state_init(int save_to_disk, int read_from_disk) -{ - int ret = -ENOENT; - time_t now = time(NULL); - - /* We shouldn't have those assigned. */ - tor_assert(sr_disk_state == NULL); - tor_assert(sr_state == NULL); - - /* First, try to load the state from disk. */ - if (read_from_disk) { - ret = disk_state_load_from_disk(); - } - - if (ret < 0) { - switch (-ret) { - case EINVAL: - /* We have a state on disk but it contains something we couldn't parse - * or an invalid entry in the state file. Let's remove it since it's - * obviously unusable and replace it by an new fresh state below. */ - case ENOENT: - { - /* No state on disk so allocate our states for the first time. */ - sr_state_t *new_state = state_new(default_fname, now); - sr_disk_state_t *new_disk_state = disk_state_new(now); - state_set(new_state); - /* It's important to set our disk state pointer since the save call - * below uses it to synchronized it with our memory state. */ - disk_state_set(new_disk_state); - /* No entry, let's save our new state to disk. */ - if (save_to_disk && disk_state_save_to_disk() < 0) { - goto error; - } - break; - } - default: - /* Big problem. Not possible. */ - tor_assert(0); - } - } - /* We have a state in memory, let's make sure it's updated for the current - * and next voting round. */ - { - time_t valid_after = dirvote_get_next_valid_after_time(); - sr_state_update(valid_after); - } - return 0; - - error: - return -1; -} - -#ifdef TOR_UNIT_TESTS - -/* Set the current phase of the protocol. Used only by unit tests. */ -void -set_sr_phase(sr_phase_t phase) -{ - tor_assert(sr_state); - sr_state->phase = phase; -} - -/* Get the SR state. Used only by unit tests */ -sr_state_t * -get_sr_state(void) -{ - return sr_state; -} - -#endif /* defined(TOR_UNIT_TESTS) */ - diff --git a/src/tor/src/or/shared_random_state.h b/src/tor/src/or/shared_random_state.h deleted file mode 100644 index fdbbf4919..000000000 --- a/src/tor/src/or/shared_random_state.h +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_SHARED_RANDOM_STATE_H -#define TOR_SHARED_RANDOM_STATE_H - -#include "shared_random.h" - -/* Action that can be performed on the state for any objects. */ -typedef enum { - SR_STATE_ACTION_GET = 1, - SR_STATE_ACTION_PUT = 2, - SR_STATE_ACTION_DEL = 3, - SR_STATE_ACTION_DEL_ALL = 4, - SR_STATE_ACTION_SAVE = 5, -} sr_state_action_t; - -/* Object in the state that can be queried through the state API. */ -typedef enum { - /* Will return a single commit using an authority identity key. */ - SR_STATE_OBJ_COMMIT, - /* Returns the entire list of commits from the state. */ - SR_STATE_OBJ_COMMITS, - /* Return the current SRV object pointer. */ - SR_STATE_OBJ_CURSRV, - /* Return the previous SRV object pointer. */ - SR_STATE_OBJ_PREVSRV, - /* Return the phase. */ - SR_STATE_OBJ_PHASE, - /* Get or Put the valid after time. */ - SR_STATE_OBJ_VALID_AFTER, -} sr_state_object_t; - -/* State of the protocol. It's also saved on disk in fname. This data - * structure MUST be synchronized at all time with the one on disk. */ -typedef struct sr_state_t { - /* Filename of the state file on disk. */ - char *fname; - /* Version of the protocol. */ - uint32_t version; - /* The valid-after of the voting period we have prepared the state for. */ - time_t valid_after; - /* Until when is this state valid? */ - time_t valid_until; - /* Protocol phase. */ - sr_phase_t phase; - - /* Number of runs completed. */ - uint64_t n_protocol_runs; - /* The number of commitment rounds we've performed in this protocol run. */ - unsigned int n_commit_rounds; - /* The number of reveal rounds we've performed in this protocol run. */ - unsigned int n_reveal_rounds; - - /* A map of all the received commitments for this protocol run. This is - * indexed by authority RSA identity digest. */ - digestmap_t *commits; - - /* Current and previous shared random value. */ - sr_srv_t *previous_srv; - sr_srv_t *current_srv; - - /* Indicate if the state contains an SRV that was _just_ generated. This is - * used during voting so that we know whether to use the super majority rule - * or not when deciding on keeping it for the consensus. It is _always_ set - * to 0 post consensus. - * - * EDGE CASE: if an authority computes a new SRV then immediately reboots - * and, once back up, votes for the current round, it won't know if the - * SRV is fresh or not ultimately making it _NOT_ use the super majority - * when deciding to put or not the SRV in the consensus. This is for now - * an acceptable very rare edge case. */ - unsigned int is_srv_fresh:1; -} sr_state_t; - -/* Persistent state of the protocol, as saved to disk. */ -typedef struct sr_disk_state_t { - uint32_t magic_; - /* Version of the protocol. */ - int Version; - /* Version of our running tor. */ - char *TorVersion; - /* Creation time of this state */ - time_t ValidAfter; - /* State valid until? */ - time_t ValidUntil; - /* All commits seen that are valid. */ - config_line_t *Commit; - /* Previous and current shared random value. */ - config_line_t *SharedRandValues; - /* Extra Lines for configuration we might not know. */ - config_line_t *ExtraLines; -} sr_disk_state_t; - -/* API */ - -/* Public methods: */ - -void sr_state_update(time_t valid_after); - -/* Private methods (only used by shared-random.c): */ - -void sr_state_set_valid_after(time_t valid_after); -sr_phase_t sr_state_get_phase(void); -const sr_srv_t *sr_state_get_previous_srv(void); -const sr_srv_t *sr_state_get_current_srv(void); -void sr_state_set_previous_srv(const sr_srv_t *srv); -void sr_state_set_current_srv(const sr_srv_t *srv); -void sr_state_clean_srvs(void); -digestmap_t *sr_state_get_commits(void); -sr_commit_t *sr_state_get_commit(const char *rsa_fpr); -void sr_state_add_commit(sr_commit_t *commit); -void sr_state_delete_commits(void); -void sr_state_copy_reveal_info(sr_commit_t *saved_commit, - const sr_commit_t *commit); -unsigned int sr_state_srv_is_fresh(void); -void sr_state_set_fresh_srv(void); -void sr_state_unset_fresh_srv(void); -int sr_state_init(int save_to_disk, int read_from_disk); -int sr_state_is_initialized(void); -void sr_state_save(void); -void sr_state_free_all(void); - -time_t sr_state_get_start_time_of_current_protocol_run(time_t now); -unsigned int sr_state_get_phase_duration(void); -unsigned int sr_state_get_protocol_run_duration(void); - -#ifdef SHARED_RANDOM_STATE_PRIVATE - -STATIC int disk_state_load_from_disk_impl(const char *fname); - -STATIC sr_phase_t get_sr_protocol_phase(time_t valid_after); -STATIC time_t get_start_time_of_current_round(void); - -STATIC time_t get_state_valid_until_time(time_t now); -STATIC const char *get_phase_str(sr_phase_t phase); -STATIC void reset_state_for_new_protocol_run(time_t valid_after); -STATIC void new_protocol_run(time_t valid_after); -STATIC void state_rotate_srv(void); -STATIC int is_phase_transition(sr_phase_t next_phase); - -#endif /* defined(SHARED_RANDOM_STATE_PRIVATE) */ - -#ifdef TOR_UNIT_TESTS - -STATIC void set_sr_phase(sr_phase_t phase); -STATIC sr_state_t *get_sr_state(void); - -#endif /* defined(TOR_UNIT_TESTS) */ - -#endif /* !defined(TOR_SHARED_RANDOM_STATE_H) */ - diff --git a/src/tor/src/or/status.h b/src/tor/src/or/status.h deleted file mode 100644 index 49da6abc0..000000000 --- a/src/tor/src/or/status.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_STATUS_H -#define TOR_STATUS_H - -#include "testsupport.h" - -int log_heartbeat(time_t now); - -#ifdef STATUS_PRIVATE -STATIC int count_circuits(void); -STATIC char *secs_to_uptime(long secs); -STATIC char *bytes_to_usage(uint64_t bytes); -#endif - -#endif /* !defined(TOR_STATUS_H) */ - diff --git a/src/tor/src/or/tor_api.c b/src/tor/src/or/tor_api.c deleted file mode 100644 index 4260cc88f..000000000 --- a/src/tor/src/or/tor_api.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file tor_api.c - **/ - -#include "tor_api.h" -#include "tor_api_internal.h" - -// Include this after the above headers, to insure that they don't -// depend on anything else. -#include "orconfig.h" - -#include -#include -#include - -// We don't want to use tor_malloc and tor_free here, since this needs -// to run before anything is initialized at all, and ought to run when -// we're not linked to anything at all. - -#define raw_malloc malloc -#define raw_free free - -tor_main_configuration_t * -tor_main_configuration_new(void) -{ - static const char *fake_argv[] = { "tor" }; - tor_main_configuration_t *cfg = raw_malloc(sizeof(*cfg)); - if (cfg == NULL) - return NULL; - - memset(cfg, 0, sizeof(*cfg)); - - cfg->argc = 1; - cfg->argv = (char **) fake_argv; - - return cfg; -} - -int -tor_main_configuration_set_command_line(tor_main_configuration_t *cfg, - int argc, char *argv[]) -{ - if (cfg == NULL) - return -1; - cfg->argc = argc; - cfg->argv = argv; - return 0; -} - -void -tor_main_configuration_free(tor_main_configuration_t *cfg) -{ - if (cfg == NULL) - return; - raw_free(cfg); -} - -/* Main entry point for the Tor process. Called from main(). - * - * This function is distinct from main() only so we can link main.c into - * the unittest binary without conflicting with the unittests' main. - * - * Some embedders have historically called this function; but that usage is - * deprecated: they should use tor_run_main() instead. - */ -int -tor_main(int argc, char *argv[]) -{ - tor_main_configuration_t *cfg = tor_main_configuration_new(); - if (!cfg) { - puts("INTERNAL ERROR: Allocation failure. Cannot proceed"); - return 1; - } - if (tor_main_configuration_set_command_line(cfg, argc, argv) < 0) { - puts("INTERNAL ERROR: Can't set command line. Cannot proceed."); - return 1; - } - int rv = tor_run_main(cfg); - tor_main_configuration_free(cfg); - return rv; -} - diff --git a/src/tor/src/or/tor_api.h b/src/tor/src/or/tor_api.h deleted file mode 100644 index b12ed718c..000000000 --- a/src/tor/src/or/tor_api.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file tor_api.h - * \brief Public C API for the Tor network service. - * - * This interface is intended for use by programs that need to link Tor as - * a library, and launch it in a separate thread. If you have the ability - * to run Tor as a separate executable, you should probably do that instead - * of embedding it as a library. - * - * To use this API, first construct a tor_main_configuration_t object using - * tor_main_configuration_new(). Then, you use one or more other function - * calls (such as tor_main_configuration_set_command_line() to configure how - * Tor should be run. Finally, you pass the configuration object to - * tor_run_main(). - * - * At this point, tor_run_main() will block its thread to run a Tor daemon; - * when the Tor daemon exits, it will return. See notes on bugs and - * limitations below. - * - * There is no other public C API to Tor: calling any C Tor function not - * documented in this file is not guaranteed to be stable. - **/ - -#ifndef TOR_API_H -#define TOR_API_H - -typedef struct tor_main_configuration_t tor_main_configuration_t; - -/** - * Create and return a new tor_main_configuration(). - */ -tor_main_configuration_t *tor_main_configuration_new(void); - -/** - * Set the command-line arguments in cfg. - * - * The argc and argv values here are as for main(). The - * contents of the argv pointer must remain unchanged until tor_run_main() has - * finished and you call tor_main_configuration_free(). - * - * Return 0 on success, -1 on failure. - */ -int tor_main_configuration_set_command_line(tor_main_configuration_t *cfg, - int argc, char *argv[]); - -/** - * Release all storage held in cfg. - * - * Once you have passed a tor_main_configuration_t to tor_run_main(), you - * must not free it until tor_run_main() has finished. - */ -void tor_main_configuration_free(tor_main_configuration_t *cfg); - -/** - * Run the tor process, as if from the command line. - * - * The command line arguments from tor_main_configuration_set_command_line() - * are taken as if they had been passed to main(). - * - * This function will not return until Tor is done running. It returns zero - * on success, and nonzero on failure. - * - * BUG 23848: In many cases, tor_main will call exit() or abort() instead of - * returning. This is not the intended long-term behavior; we are trying to - * fix it. - * - * BUG 23847: You can only call tor_main() once in a single process; if it - * returns and you call it again, you may crash. This is not intended - * long-term behavior; we are trying to fix it. - * - * LIMITATION: You cannot run more than one instance of Tor in the same - * process at the same time. Concurrent calls will cause undefined behavior. - * We do not currently have plans to change this. - * - * LIMITATION: While we will try to fix any problems found here, you - * should be aware that Tor was originally written to run as its own - * process, and that the functionality of this file was added later. If - * you find any bugs or strange behavior, please report them, and we'll - * try to straighten them out. - */ -int tor_run_main(const tor_main_configuration_t *); - -/** - * Run the tor process, as if from the command line. - * - * @deprecated Using this function from outside Tor is deprecated; you should - * use tor_run_main() instead. - * - * BUGS: This function has all the same bugs as tor_run_main(). - * - * LIMITATIONS: This function has all the limitations of tor_run_main(). - */ -int tor_main(int argc, char **argv); - -#endif /* !defined(TOR_API_H) */ - diff --git a/src/tor/src/or/tor_api_internal.h b/src/tor/src/or/tor_api_internal.h deleted file mode 100644 index 10b6278b7..000000000 --- a/src/tor/src/or/tor_api_internal.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_API_INTERNAL_H -#define TOR_API_INTERNAL_H - -/* The contents of this type are private; don't mess with them from outside - * Tor. */ -struct tor_main_configuration_t { - /** As in main() */ - int argc; - /** As in main(). This pointer is owned by the caller */ - char **argv; -}; - -#endif /* !defined(TOR_API_INTERNAL_H) */ - diff --git a/src/tor/src/or/tor_main.c b/src/tor/src/or/tor_main.c deleted file mode 100644 index c203d8248..000000000 --- a/src/tor/src/or/tor_main.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright 2001-2004 Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file tor_main.c - * \brief Stub module containing a main() function. - * - * We keep the main function in a separate module so that the unit - * tests, which have their own main()s, can link against main.c. - **/ - -int tor_main(int argc, char *argv[]); - -/** We keep main() in a separate file so that our unit tests can use - * functions from main.c. - */ -int -main(int argc, char *argv[]) -{ - int r = tor_main(argc, argv); - if (r < 0 || r > 255) - return 1; - else - return r; -} - diff --git a/src/tor/src/or/torcert.c b/src/tor/src/or/torcert.c deleted file mode 100644 index bd677d1f4..000000000 --- a/src/tor/src/or/torcert.c +++ /dev/null @@ -1,706 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file torcert.c - * - * \brief Implementation for ed25519-signed certificates as used in the Tor - * protocol. - * - * This certificate format is designed to be simple and compact; it's - * documented in tor-spec.txt in the torspec.git repository. All of the - * certificates in this format are signed with an Ed25519 key; the - * contents themselves may be another Ed25519 key, a digest of a - * RSA key, or some other material. - * - * In this module there is also support for a crooss-certification of - * Ed25519 identities using (older) RSA1024 identities. - * - * Tor uses other types of certificate too, beyond those described in this - * module. Notably, our use of TLS requires us to touch X.509 certificates, - * even though sensible people would stay away from those. Our X.509 - * certificates are represented with tor_x509_cert_t, and implemented in - * tortls.c. We also have a separate certificate type that authorities - * use to authenticate their RSA signing keys with their RSA identity keys: - * that one is authority_cert_t, and it's mostly handled in routerlist.c. - */ - -#include "or.h" -#include "config.h" -#include "crypto.h" -#include "torcert.h" -#include "ed25519_cert.h" -#include "torlog.h" -#include "util.h" -#include "compat.h" -#include "link_handshake.h" - -/** Helper for tor_cert_create(): signs any 32 bytes, not just an ed25519 - * key. - */ -static tor_cert_t * -tor_cert_sign_impl(const ed25519_keypair_t *signing_key, - uint8_t cert_type, - uint8_t signed_key_type, - const uint8_t signed_key_info[32], - time_t now, time_t lifetime, - uint32_t flags) -{ - tor_cert_t *torcert = NULL; - - ed25519_cert_t *cert = ed25519_cert_new(); - cert->cert_type = cert_type; - cert->exp_field = (uint32_t) CEIL_DIV(now + lifetime, 3600); - cert->cert_key_type = signed_key_type; - memcpy(cert->certified_key, signed_key_info, 32); - - if (flags & CERT_FLAG_INCLUDE_SIGNING_KEY) { - ed25519_cert_extension_t *ext = ed25519_cert_extension_new(); - ext->ext_type = CERTEXT_SIGNED_WITH_KEY; - memcpy(ext->un_signing_key, signing_key->pubkey.pubkey, 32); - ed25519_cert_add_ext(cert, ext); - ++cert->n_extensions; - } - - const ssize_t alloc_len = ed25519_cert_encoded_len(cert); - tor_assert(alloc_len > 0); - uint8_t *encoded = tor_malloc(alloc_len); - const ssize_t real_len = ed25519_cert_encode(encoded, alloc_len, cert); - if (real_len < 0) - goto err; - tor_assert(real_len == alloc_len); - tor_assert(real_len > ED25519_SIG_LEN); - uint8_t *sig = encoded + (real_len - ED25519_SIG_LEN); - tor_assert(tor_mem_is_zero((char*)sig, ED25519_SIG_LEN)); - - ed25519_signature_t signature; - if (ed25519_sign(&signature, encoded, - real_len-ED25519_SIG_LEN, signing_key)<0) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Can't sign certificate"); - goto err; - /* LCOV_EXCL_STOP */ - } - memcpy(sig, signature.sig, ED25519_SIG_LEN); - - torcert = tor_cert_parse(encoded, real_len); - if (! torcert) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Generated a certificate we cannot parse"); - goto err; - /* LCOV_EXCL_STOP */ - } - - if (tor_cert_checksig(torcert, &signing_key->pubkey, now) < 0) { - /* LCOV_EXCL_START */ - log_warn(LD_BUG, "Generated a certificate whose signature we can't check"); - goto err; - /* LCOV_EXCL_STOP */ - } - - tor_free(encoded); - - goto done; - - /* LCOV_EXCL_START */ - err: - tor_cert_free(torcert); - torcert = NULL; - /* LCOV_EXCL_STOP */ - - done: - ed25519_cert_free(cert); - tor_free(encoded); - return torcert; -} - -/** - * Create and return a new new certificate of type cert_type to - * authenticate signed_key using the key signing_key. The - * certificate should remain valid for at least lifetime seconds after - * now. - * - * If CERT_FLAG_INCLUDE_SIGNING_KEY is set in flags, embed - * the public part of signing_key in the certificate. - */ -tor_cert_t * -tor_cert_create(const ed25519_keypair_t *signing_key, - uint8_t cert_type, - const ed25519_public_key_t *signed_key, - time_t now, time_t lifetime, - uint32_t flags) -{ - return tor_cert_sign_impl(signing_key, cert_type, - SIGNED_KEY_TYPE_ED25519, signed_key->pubkey, - now, lifetime, flags); -} - -/** Release all storage held for cert. */ -void -tor_cert_free_(tor_cert_t *cert) -{ - if (! cert) - return; - - if (cert->encoded) - memwipe(cert->encoded, 0, cert->encoded_len); - tor_free(cert->encoded); - - memwipe(cert, 0, sizeof(tor_cert_t)); - tor_free(cert); -} - -/** Parse a certificate encoded with len bytes in encoded. */ -tor_cert_t * -tor_cert_parse(const uint8_t *encoded, const size_t len) -{ - tor_cert_t *cert = NULL; - ed25519_cert_t *parsed = NULL; - ssize_t got_len = ed25519_cert_parse(&parsed, encoded, len); - if (got_len < 0 || (size_t) got_len != len) - goto err; - - cert = tor_malloc_zero(sizeof(tor_cert_t)); - cert->encoded = tor_memdup(encoded, len); - cert->encoded_len = len; - - memcpy(cert->signed_key.pubkey, parsed->certified_key, 32); - int64_t valid_until_64 = ((int64_t)parsed->exp_field) * 3600; -#if SIZEOF_TIME_T < SIZEOF_INT64_T - if (valid_until_64 > TIME_MAX) - valid_until_64 = TIME_MAX - 1; -#endif - cert->valid_until = (time_t) valid_until_64; - cert->cert_type = parsed->cert_type; - - for (unsigned i = 0; i < ed25519_cert_getlen_ext(parsed); ++i) { - ed25519_cert_extension_t *ext = ed25519_cert_get_ext(parsed, i); - if (ext->ext_type == CERTEXT_SIGNED_WITH_KEY) { - if (cert->signing_key_included) - goto err; - - cert->signing_key_included = 1; - memcpy(cert->signing_key.pubkey, ext->un_signing_key, 32); - } else if (ext->ext_flags & CERTEXT_FLAG_AFFECTS_VALIDATION) { - /* Unrecognized extension with affects_validation set */ - goto err; - } - } - - goto done; - err: - tor_cert_free(cert); - cert = NULL; - done: - ed25519_cert_free(parsed); - return cert; -} - -/** Fill in checkable_out with the information needed to check - * the signature on cert with pubkey. - * - * On success, if expiration_out is provided, and it is some time - * _after_ the expiration time of this certificate, set it to the - * expiration time of this certificate. - */ -int -tor_cert_get_checkable_sig(ed25519_checkable_t *checkable_out, - const tor_cert_t *cert, - const ed25519_public_key_t *pubkey, - time_t *expiration_out) -{ - if (! pubkey) { - if (cert->signing_key_included) - pubkey = &cert->signing_key; - else - return -1; - } - - checkable_out->msg = cert->encoded; - checkable_out->pubkey = pubkey; - tor_assert(cert->encoded_len > ED25519_SIG_LEN); - const size_t signed_len = cert->encoded_len - ED25519_SIG_LEN; - checkable_out->len = signed_len; - memcpy(checkable_out->signature.sig, - cert->encoded + signed_len, ED25519_SIG_LEN); - - if (expiration_out) { - *expiration_out = MIN(*expiration_out, cert->valid_until); - } - - return 0; -} - -/** Validates the signature on cert with pubkey relative to the - * current time now. (If now is 0, do not check the expiration - * time.) Return 0 on success, -1 on failure. Sets flags in cert as - * appropriate. - */ -int -tor_cert_checksig(tor_cert_t *cert, - const ed25519_public_key_t *pubkey, time_t now) -{ - ed25519_checkable_t checkable; - int okay; - time_t expires = TIME_MAX; - - if (tor_cert_get_checkable_sig(&checkable, cert, pubkey, &expires) < 0) - return -1; - - if (now && now > expires) { - cert->cert_expired = 1; - return -1; - } - - if (ed25519_checksig_batch(&okay, &checkable, 1) < 0) { - cert->sig_bad = 1; - return -1; - } else { - cert->sig_ok = 1; - /* Only copy the checkable public key when it is different from the signing - * key of the certificate to avoid undefined behavior. */ - if (cert->signing_key.pubkey != checkable.pubkey->pubkey) { - memcpy(cert->signing_key.pubkey, checkable.pubkey->pubkey, 32); - } - cert->cert_valid = 1; - return 0; - } -} - -/** Return a new copy of cert */ -tor_cert_t * -tor_cert_dup(const tor_cert_t *cert) -{ - tor_cert_t *newcert = tor_memdup(cert, sizeof(tor_cert_t)); - if (cert->encoded) - newcert->encoded = tor_memdup(cert->encoded, cert->encoded_len); - return newcert; -} - -/** Return true iff cert1 and cert2 are the same cert. */ -int -tor_cert_eq(const tor_cert_t *cert1, const tor_cert_t *cert2) -{ - tor_assert(cert1); - tor_assert(cert2); - return cert1->encoded_len == cert2->encoded_len && - tor_memeq(cert1->encoded, cert2->encoded, cert1->encoded_len); -} - -/** Return true iff cert1 and cert2 are the same cert, or if they are both - * NULL. */ -int -tor_cert_opt_eq(const tor_cert_t *cert1, const tor_cert_t *cert2) -{ - if (cert1 == NULL && cert2 == NULL) - return 1; - if (!cert1 || !cert2) - return 0; - return tor_cert_eq(cert1, cert2); -} - -#define RSA_ED_CROSSCERT_PREFIX "Tor TLS RSA/Ed25519 cross-certificate" - -/** Create new cross-certification object to certify ed_key as the - * master ed25519 identity key for the RSA identity key rsa_key. - * Allocates and stores the encoded certificate in *cert, and returns - * the number of bytes stored. Returns negative on error.*/ -ssize_t -tor_make_rsa_ed25519_crosscert(const ed25519_public_key_t *ed_key, - const crypto_pk_t *rsa_key, - time_t expires, - uint8_t **cert) -{ - // It is later than 1985, since otherwise there would be no C89 - // compilers. (Try to diagnose #22466.) - tor_assert_nonfatal(expires >= 15 * 365 * 86400); - - uint8_t *res; - - rsa_ed_crosscert_t *cc = rsa_ed_crosscert_new(); - memcpy(cc->ed_key, ed_key->pubkey, ED25519_PUBKEY_LEN); - cc->expiration = (uint32_t) CEIL_DIV(expires, 3600); - cc->sig_len = crypto_pk_keysize(rsa_key); - rsa_ed_crosscert_setlen_sig(cc, crypto_pk_keysize(rsa_key)); - - ssize_t alloc_sz = rsa_ed_crosscert_encoded_len(cc); - tor_assert(alloc_sz > 0); - res = tor_malloc_zero(alloc_sz); - ssize_t sz = rsa_ed_crosscert_encode(res, alloc_sz, cc); - tor_assert(sz > 0 && sz <= alloc_sz); - - crypto_digest_t *d = crypto_digest256_new(DIGEST_SHA256); - crypto_digest_add_bytes(d, RSA_ED_CROSSCERT_PREFIX, - strlen(RSA_ED_CROSSCERT_PREFIX)); - - const int signed_part_len = 32 + 4; - crypto_digest_add_bytes(d, (char*)res, signed_part_len); - - uint8_t digest[DIGEST256_LEN]; - crypto_digest_get_digest(d, (char*)digest, sizeof(digest)); - crypto_digest_free(d); - - int siglen = crypto_pk_private_sign(rsa_key, - (char*)rsa_ed_crosscert_getarray_sig(cc), - rsa_ed_crosscert_getlen_sig(cc), - (char*)digest, sizeof(digest)); - tor_assert(siglen > 0 && siglen <= (int)crypto_pk_keysize(rsa_key)); - tor_assert(siglen <= UINT8_MAX); - cc->sig_len = siglen; - rsa_ed_crosscert_setlen_sig(cc, siglen); - - sz = rsa_ed_crosscert_encode(res, alloc_sz, cc); - rsa_ed_crosscert_free(cc); - *cert = res; - return sz; -} - -/** - * Check whether the crosscert_len byte certificate in crosscert - * is in fact a correct cross-certification of master_key using - * the RSA key rsa_id_key. - * - * Also reject the certificate if it expired before - * reject_if_expired_before. - * - * Return 0 on success, negative on failure. - */ -MOCK_IMPL(int, -rsa_ed25519_crosscert_check, (const uint8_t *crosscert, - const size_t crosscert_len, - const crypto_pk_t *rsa_id_key, - const ed25519_public_key_t *master_key, - const time_t reject_if_expired_before)) -{ - rsa_ed_crosscert_t *cc = NULL; - int rv; - -#define ERR(code, s) \ - do { \ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, \ - "Received a bad RSA->Ed25519 crosscert: %s", \ - (s)); \ - rv = (code); \ - goto err; \ - } while (0) - - if (BUG(crypto_pk_keysize(rsa_id_key) > PK_BYTES)) - return -1; - - if (BUG(!crosscert)) - return -1; - - ssize_t parsed_len = rsa_ed_crosscert_parse(&cc, crosscert, crosscert_len); - if (parsed_len < 0 || crosscert_len != (size_t)parsed_len) { - ERR(-2, "Unparseable or overlong crosscert"); - } - - if (tor_memneq(rsa_ed_crosscert_getarray_ed_key(cc), - master_key->pubkey, - ED25519_PUBKEY_LEN)) { - ERR(-3, "Crosscert did not match Ed25519 key"); - } - - const uint32_t expiration_date = rsa_ed_crosscert_get_expiration(cc); - const uint64_t expiration_time = ((uint64_t)expiration_date) * 3600; - - if (reject_if_expired_before < 0 || - expiration_time < (uint64_t)reject_if_expired_before) { - ERR(-4, "Crosscert is expired"); - } - - const uint8_t *eos = rsa_ed_crosscert_get_end_of_signed(cc); - const uint8_t *sig = rsa_ed_crosscert_getarray_sig(cc); - const uint8_t siglen = rsa_ed_crosscert_get_sig_len(cc); - tor_assert(eos >= crosscert); - tor_assert((size_t)(eos - crosscert) <= crosscert_len); - tor_assert(siglen == rsa_ed_crosscert_getlen_sig(cc)); - - /* Compute the digest */ - uint8_t digest[DIGEST256_LEN]; - crypto_digest_t *d = crypto_digest256_new(DIGEST_SHA256); - crypto_digest_add_bytes(d, RSA_ED_CROSSCERT_PREFIX, - strlen(RSA_ED_CROSSCERT_PREFIX)); - crypto_digest_add_bytes(d, (char*)crosscert, eos-crosscert); - crypto_digest_get_digest(d, (char*)digest, sizeof(digest)); - crypto_digest_free(d); - - /* Now check the signature */ - uint8_t signed_[PK_BYTES]; - int signed_len = crypto_pk_public_checksig(rsa_id_key, - (char*)signed_, sizeof(signed_), - (char*)sig, siglen); - if (signed_len < DIGEST256_LEN) { - ERR(-5, "Bad signature, or length of signed data not as expected"); - } - - if (tor_memneq(digest, signed_, DIGEST256_LEN)) { - ERR(-6, "The signature was good, but it didn't match the data"); - } - - rv = 0; - err: - rsa_ed_crosscert_free(cc); - return rv; -} - -/** Construct and return a new empty or_handshake_certs object */ -or_handshake_certs_t * -or_handshake_certs_new(void) -{ - return tor_malloc_zero(sizeof(or_handshake_certs_t)); -} - -/** Release all storage held in certs */ -void -or_handshake_certs_free_(or_handshake_certs_t *certs) -{ - if (!certs) - return; - - tor_x509_cert_free(certs->auth_cert); - tor_x509_cert_free(certs->link_cert); - tor_x509_cert_free(certs->id_cert); - - tor_cert_free(certs->ed_id_sign); - tor_cert_free(certs->ed_sign_link); - tor_cert_free(certs->ed_sign_auth); - tor_free(certs->ed_rsa_crosscert); - - memwipe(certs, 0xBD, sizeof(*certs)); - tor_free(certs); -} - -#undef ERR -#define ERR(s) \ - do { \ - log_fn(severity, LD_PROTOCOL, \ - "Received a bad CERTS cell: %s", \ - (s)); \ - return 0; \ - } while (0) - -int -or_handshake_certs_rsa_ok(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now) -{ - tor_x509_cert_t *link_cert = certs->link_cert; - tor_x509_cert_t *auth_cert = certs->auth_cert; - tor_x509_cert_t *id_cert = certs->id_cert; - - if (certs->started_here) { - if (! (id_cert && link_cert)) - ERR("The certs we wanted (ID, Link) were missing"); - if (! tor_tls_cert_matches_key(tls, link_cert)) - ERR("The link certificate didn't match the TLS public key"); - if (! tor_tls_cert_is_valid(severity, link_cert, id_cert, now, 0)) - ERR("The link certificate was not valid"); - if (! tor_tls_cert_is_valid(severity, id_cert, id_cert, now, 1)) - ERR("The ID certificate was not valid"); - } else { - if (! (id_cert && auth_cert)) - ERR("The certs we wanted (ID, Auth) were missing"); - if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, auth_cert, id_cert, now, 1)) - ERR("The authentication certificate was not valid"); - if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, id_cert, id_cert, now, 1)) - ERR("The ID certificate was not valid"); - } - - return 1; -} - -/** Check all the ed25519 certificates in certs against each other, and - * against the peer certificate in tls if appropriate. On success, - * return 0; on failure, return a negative value and warn at level - * severity */ -int -or_handshake_certs_ed25519_ok(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now) -{ - ed25519_checkable_t check[10]; - unsigned n_checkable = 0; - time_t expiration = TIME_MAX; - -#define ADDCERT(cert, pk) \ - do { \ - tor_assert(n_checkable < ARRAY_LENGTH(check)); \ - if (tor_cert_get_checkable_sig(&check[n_checkable++], cert, pk, \ - &expiration) < 0) \ - ERR("Could not get checkable cert."); \ - } while (0) - - if (! certs->ed_id_sign || !certs->ed_id_sign->signing_key_included) { - ERR("No Ed25519 signing key"); - } - ADDCERT(certs->ed_id_sign, NULL); - - if (certs->started_here) { - if (! certs->ed_sign_link) - ERR("No Ed25519 link key"); - { - /* check for a match with the TLS cert. */ - tor_x509_cert_t *peer_cert = tor_tls_get_peer_cert(tls); - if (BUG(!peer_cert)) { - /* This is a bug, because if we got to this point, we are a connection - * that was initiated here, and we completed a TLS handshake. The - * other side *must* have given us a certificate! */ - ERR("No x509 peer cert"); // LCOV_EXCL_LINE - } - const common_digests_t *peer_cert_digests = - tor_x509_cert_get_cert_digests(peer_cert); - int okay = tor_memeq(peer_cert_digests->d[DIGEST_SHA256], - certs->ed_sign_link->signed_key.pubkey, - DIGEST256_LEN); - tor_x509_cert_free(peer_cert); - if (!okay) - ERR("Link certificate does not match TLS certificate"); - } - - ADDCERT(certs->ed_sign_link, &certs->ed_id_sign->signed_key); - - } else { - if (! certs->ed_sign_auth) - ERR("No Ed25519 link authentication key"); - ADDCERT(certs->ed_sign_auth, &certs->ed_id_sign->signed_key); - } - - if (expiration < now) { - ERR("At least one certificate expired."); - } - - /* Okay, we've gotten ready to check all the Ed25519 certificates. - * Now, we are going to check the RSA certificate's cross-certification - * with the ED certificates. - * - * FFFF In the future, we might want to make this optional. - */ - - tor_x509_cert_t *rsa_id_cert = certs->id_cert; - if (!rsa_id_cert) { - ERR("Missing legacy RSA ID certificate"); - } - if (! tor_tls_cert_is_valid(severity, rsa_id_cert, rsa_id_cert, now, 1)) { - ERR("The legacy RSA ID certificate was not valid"); - } - if (! certs->ed_rsa_crosscert) { - ERR("Missing RSA->Ed25519 crosscert"); - } - crypto_pk_t *rsa_id_key = tor_tls_cert_get_key(rsa_id_cert); - if (!rsa_id_key) { - ERR("RSA ID cert had no RSA key"); - } - - if (rsa_ed25519_crosscert_check(certs->ed_rsa_crosscert, - certs->ed_rsa_crosscert_len, - rsa_id_key, - &certs->ed_id_sign->signing_key, - now) < 0) { - crypto_pk_free(rsa_id_key); - ERR("Invalid RSA->Ed25519 crosscert"); - } - crypto_pk_free(rsa_id_key); - rsa_id_key = NULL; - - /* FFFF We could save a little time in the client case by queueing - * this batch to check it later, along with the signature from the - * AUTHENTICATE cell. That will change our data flow a bit, though, - * so I say "postpone". */ - - if (ed25519_checksig_batch(NULL, check, n_checkable) < 0) { - ERR("At least one Ed25519 certificate was badly signed"); - } - - return 1; -} - -/** - * Check the Ed certificates and/or the RSA certificates, as appropriate. If - * we obtained an Ed25519 identity, set *ed_id_out. If we obtained an RSA - * identity, set *rs_id_out. Otherwise, set them both to NULL. - */ -void -or_handshake_certs_check_both(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now, - const ed25519_public_key_t **ed_id_out, - const common_digests_t **rsa_id_out) -{ - tor_assert(ed_id_out); - tor_assert(rsa_id_out); - - *ed_id_out = NULL; - *rsa_id_out = NULL; - - if (certs->ed_id_sign) { - if (or_handshake_certs_ed25519_ok(severity, certs, tls, now)) { - tor_assert(certs->ed_id_sign); - tor_assert(certs->id_cert); - - *ed_id_out = &certs->ed_id_sign->signing_key; - *rsa_id_out = tor_x509_cert_get_id_digests(certs->id_cert); - - /* If we reached this point, we did not look at any of the - * subsidiary RSA certificates, so we'd better just remove them. - */ - tor_x509_cert_free(certs->link_cert); - tor_x509_cert_free(certs->auth_cert); - certs->link_cert = certs->auth_cert = NULL; - } - /* We do _not_ fall through here. If you provided us Ed25519 - * certificates, we expect to verify them! */ - } else { - /* No ed25519 keys given in the CERTS cell */ - if (or_handshake_certs_rsa_ok(severity, certs, tls, now)) { - *rsa_id_out = tor_x509_cert_get_id_digests(certs->id_cert); - } - } -} - -/* === ENCODING === */ - -/* Encode the ed25519 certificate cert and put the newly allocated - * string in cert_str_out. Return 0 on success else a negative value. */ -int -tor_cert_encode_ed22519(const tor_cert_t *cert, char **cert_str_out) -{ - int ret = -1; - char *ed_cert_b64 = NULL; - size_t ed_cert_b64_len; - - tor_assert(cert); - tor_assert(cert_str_out); - - /* Get the encoded size and add the NUL byte. */ - ed_cert_b64_len = base64_encode_size(cert->encoded_len, - BASE64_ENCODE_MULTILINE) + 1; - ed_cert_b64 = tor_malloc_zero(ed_cert_b64_len); - - /* Base64 encode the encoded certificate. */ - if (base64_encode(ed_cert_b64, ed_cert_b64_len, - (const char *) cert->encoded, cert->encoded_len, - BASE64_ENCODE_MULTILINE) < 0) { - /* LCOV_EXCL_START */ - log_err(LD_BUG, "Couldn't base64-encode ed22519 cert!"); - goto err; - /* LCOV_EXCL_STOP */ - } - - /* Put everything together in a NUL terminated string. */ - tor_asprintf(cert_str_out, - "-----BEGIN ED25519 CERT-----\n" - "%s" - "-----END ED25519 CERT-----", - ed_cert_b64); - /* Success! */ - ret = 0; - - err: - tor_free(ed_cert_b64); - return ret; -} - diff --git a/src/tor/src/or/torcert.h b/src/tor/src/or/torcert.h deleted file mode 100644 index 0a8a25204..000000000 --- a/src/tor/src/or/torcert.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TORCERT_H_INCLUDED -#define TORCERT_H_INCLUDED - -#include "crypto_ed25519.h" - -#define SIGNED_KEY_TYPE_ED25519 0x01 - -#define CERT_TYPE_ID_SIGNING 0x04 -#define CERT_TYPE_SIGNING_LINK 0x05 -#define CERT_TYPE_SIGNING_AUTH 0x06 -#define CERT_TYPE_SIGNING_HS_DESC 0x08 -#define CERT_TYPE_AUTH_HS_IP_KEY 0x09 -#define CERT_TYPE_ONION_ID 0x0A -#define CERT_TYPE_CROSS_HS_IP_KEYS 0x0B - -#define CERT_FLAG_INCLUDE_SIGNING_KEY 0x1 - -/** An ed25519-signed certificate as used throughout the Tor protocol. - **/ -typedef struct tor_cert_st { - /** The key authenticated by this certificate */ - ed25519_public_key_t signed_key; - /** The key that signed this certificate. This value may be unset if the - * certificate has never been checked, and didn't include its own key. */ - ed25519_public_key_t signing_key; - /** A time after which this certificate will no longer be valid. */ - time_t valid_until; - - /** The encoded representation of this certificate */ - uint8_t *encoded; - /** The length of encoded */ - size_t encoded_len; - - /** One of CERT_TYPE_... */ - uint8_t cert_type; - /** True iff we received a signing key embedded in this certificate */ - unsigned signing_key_included : 1; - /** True iff we checked the signature and found it bad */ - unsigned sig_bad : 1; - /** True iff we checked the signature and found it correct */ - unsigned sig_ok : 1; - /** True iff we checked the signature and first found that the cert - * had expired */ - unsigned cert_expired : 1; - /** True iff we checked the signature and found the whole cert valid */ - unsigned cert_valid : 1; -} tor_cert_t; - -tor_cert_t *tor_cert_create(const ed25519_keypair_t *signing_key, - uint8_t cert_type, - const ed25519_public_key_t *signed_key, - time_t now, time_t lifetime, - uint32_t flags); - -tor_cert_t *tor_cert_parse(const uint8_t *cert, size_t certlen); - -void tor_cert_free_(tor_cert_t *cert); -#define tor_cert_free(cert) FREE_AND_NULL(tor_cert_t, tor_cert_free_, (cert)) - -int tor_cert_get_checkable_sig(ed25519_checkable_t *checkable_out, - const tor_cert_t *out, - const ed25519_public_key_t *pubkey, - time_t *expiration_out); - -int tor_cert_checksig(tor_cert_t *cert, - const ed25519_public_key_t *pubkey, time_t now); - -tor_cert_t *tor_cert_dup(const tor_cert_t *cert); -int tor_cert_eq(const tor_cert_t *cert1, const tor_cert_t *cert2); -int tor_cert_opt_eq(const tor_cert_t *cert1, const tor_cert_t *cert2); - -ssize_t tor_make_rsa_ed25519_crosscert(const ed25519_public_key_t *ed_key, - const crypto_pk_t *rsa_key, - time_t expires, - uint8_t **cert); -MOCK_DECL(int, -rsa_ed25519_crosscert_check, (const uint8_t *crosscert, - const size_t crosscert_len, - const crypto_pk_t *rsa_id_key, - const ed25519_public_key_t *master_key, - const time_t reject_if_expired_before)); - -or_handshake_certs_t *or_handshake_certs_new(void); -void or_handshake_certs_free_(or_handshake_certs_t *certs); -#define or_handshake_certs_free(certs) \ - FREE_AND_NULL(or_handshake_certs_t, or_handshake_certs_free_, (certs)) -int or_handshake_certs_rsa_ok(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now); -int or_handshake_certs_ed25519_ok(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now); -void or_handshake_certs_check_both(int severity, - or_handshake_certs_t *certs, - tor_tls_t *tls, - time_t now, - const ed25519_public_key_t **ed_id_out, - const common_digests_t **rsa_id_out); - -int tor_cert_encode_ed22519(const tor_cert_t *cert, char **cert_str_out); - -#endif /* !defined(TORCERT_H_INCLUDED) */ - diff --git a/src/tor/src/rust/.cargo/config.in b/src/tor/src/rust/.cargo/config.in deleted file mode 100644 index 301e7fdbe..000000000 --- a/src/tor/src/rust/.cargo/config.in +++ /dev/null @@ -1,8 +0,0 @@ -[source] - -@RUST_DL@ [source.crates-io] -@RUST_DL@ registry = 'https://github.com/rust-lang/crates.io-index' -@RUST_DL@ replace-with = 'vendored-sources' - -@RUST_DL@ [source.vendored-sources] -@RUST_DL@ directory = '@TOR_RUST_DEPENDENCIES@' diff --git a/src/tor/src/rust/.rustfmt.toml b/src/tor/src/rust/.rustfmt.toml deleted file mode 100644 index f25bd5188..000000000 --- a/src/tor/src/rust/.rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ -max_width = 80 -comment_width = 80 diff --git a/src/tor/src/rust/Cargo.lock b/src/tor/src/rust/Cargo.lock deleted file mode 100644 index 224d2135b..000000000 --- a/src/tor/src/rust/Cargo.lock +++ /dev/null @@ -1,55 +0,0 @@ -[root] -name = "tor_util" -version = "0.0.1" -dependencies = [ - "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tor_allocate 0.0.1", -] - -[[package]] -name = "external" -version = "0.0.1" -dependencies = [ - "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libc" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "protover" -version = "0.0.1" -dependencies = [ - "external 0.0.1", - "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smartlist 0.0.1", - "tor_allocate 0.0.1", - "tor_util 0.0.1", -] - -[[package]] -name = "smartlist" -version = "0.0.1" -dependencies = [ - "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tor_allocate" -version = "0.0.1" -dependencies = [ - "libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tor_rust" -version = "0.1.0" -dependencies = [ - "protover 0.0.1", - "tor_util 0.0.1", -] - -[metadata] -"checksum libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "babb8281da88cba992fa1f4ddec7d63ed96280a1a53ec9b919fd37b53d71e502" diff --git a/src/tor/src/rust/Cargo.toml b/src/tor/src/rust/Cargo.toml deleted file mode 100644 index 953c9b96b..000000000 --- a/src/tor/src/rust/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[workspace] -members = ["tor_util", "protover", "smartlist", "external", "tor_allocate", "tor_rust"] - -[profile.release] -debug = true -panic = "abort" - diff --git a/src/tor/src/rust/external/Cargo.toml b/src/tor/src/rust/external/Cargo.toml deleted file mode 100644 index bccd7033a..000000000 --- a/src/tor/src/rust/external/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -authors = ["The Tor Project"] -version = "0.0.1" -name = "external" - -[dependencies] -libc = "0.2.22" - -[lib] -name = "external" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - diff --git a/src/tor/src/rust/external/external.rs b/src/tor/src/rust/external/external.rs deleted file mode 100644 index b9e17f021..000000000 --- a/src/tor/src/rust/external/external.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -use libc::{c_char, c_int}; -use std::ffi::CString; - -extern "C" { - fn tor_version_as_new_as( - platform: *const c_char, - cutoff: *const c_char, - ) -> c_int; -} - -/// Wrap calls to tor_version_as_new_as, defined in src/or/routerparse.c -pub fn c_tor_version_as_new_as(platform: &str, cutoff: &str) -> bool { - // CHK: These functions should log a warning if an error occurs. This - // can be added when integration with tor's logger is added to rust - let c_platform = match CString::new(platform) { - Ok(n) => n, - Err(_) => return false, - }; - - let c_cutoff = match CString::new(cutoff) { - Ok(n) => n, - Err(_) => return false, - }; - - let result: c_int = unsafe { - tor_version_as_new_as(c_platform.as_ptr(), c_cutoff.as_ptr()) - }; - - result == 1 -} diff --git a/src/tor/src/rust/external/lib.rs b/src/tor/src/rust/external/lib.rs deleted file mode 100644 index 0af0d6452..000000000 --- a/src/tor/src/rust/external/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! Copyright (c) 2016-2017, The Tor Project, Inc. */ -//! See LICENSE for licensing information */ - -//! Interface for external calls to tor C ABI -//! -//! The purpose of this module is to provide a clean interface for when Rust -//! modules need to interact with functionality in tor C code rather than each -//! module implementing this functionality repeatedly. - -extern crate libc; - -mod external; - -pub use external::*; diff --git a/src/tor/src/rust/include.am b/src/tor/src/rust/include.am deleted file mode 100644 index 9c4337484..000000000 --- a/src/tor/src/rust/include.am +++ /dev/null @@ -1,26 +0,0 @@ -include src/rust/tor_rust/include.am - -EXTRA_DIST +=\ - src/rust/Cargo.toml \ - src/rust/Cargo.lock \ - src/rust/.cargo/config.in \ - src/rust/external/Cargo.toml \ - src/rust/external/external.rs \ - src/rust/external/lib.rs \ - src/rust/protover/Cargo.toml \ - src/rust/protover/ffi.rs \ - src/rust/protover/lib.rs \ - src/rust/protover/protover.rs \ - src/rust/protover/tests/protover.rs \ - src/rust/smartlist/Cargo.toml \ - src/rust/smartlist/lib.rs \ - src/rust/smartlist/smartlist.rs \ - src/rust/tor_allocate/Cargo.toml \ - src/rust/tor_allocate/lib.rs \ - src/rust/tor_allocate/tor_allocate.rs \ - src/rust/tor_rust/Cargo.toml \ - src/rust/tor_rust/include.am \ - src/rust/tor_rust/lib.rs \ - src/rust/tor_util/Cargo.toml \ - src/rust/tor_util/ffi.rs \ - src/rust/tor_util/lib.rs diff --git a/src/tor/src/rust/protover/Cargo.toml b/src/tor/src/rust/protover/Cargo.toml deleted file mode 100644 index 04d2f2ed7..000000000 --- a/src/tor/src/rust/protover/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -authors = ["The Tor Project"] -version = "0.0.1" -name = "protover" - -[dependencies] -libc = "0.2.22" - -[dependencies.smartlist] -path = "../smartlist" - -[dependencies.external] -path = "../external" - -[dependencies.tor_util] -path = "../tor_util" - -[dependencies.tor_allocate] -path = "../tor_allocate" - -[lib] -name = "protover" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - diff --git a/src/tor/src/rust/protover/ffi.rs b/src/tor/src/rust/protover/ffi.rs deleted file mode 100644 index 3eb22c933..000000000 --- a/src/tor/src/rust/protover/ffi.rs +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -//! FFI functions, only to be called from C. -//! -//! Equivalent C versions of this api are in `src/or/protover.c` - -use libc::{c_char, c_int, uint32_t}; -use std::ffi::CStr; -use std::ffi::CString; - -use protover::*; -use smartlist::*; -use tor_allocate::allocate_and_copy_string; - -/// Translate C enums to Rust Proto enums, using the integer value of the C -/// enum to map to its associated Rust enum -/// -/// C_RUST_COUPLED: src/or/protover.h `protocol_type_t` -fn translate_to_rust(c_proto: uint32_t) -> Result { - match c_proto { - 0 => Ok(Proto::Link), - 1 => Ok(Proto::LinkAuth), - 2 => Ok(Proto::Relay), - 3 => Ok(Proto::DirCache), - 4 => Ok(Proto::HSDir), - 5 => Ok(Proto::HSIntro), - 6 => Ok(Proto::HSRend), - 7 => Ok(Proto::Desc), - 8 => Ok(Proto::Microdesc), - 9 => Ok(Proto::Cons), - _ => Err("Invalid protocol type"), - } -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::all_supported -#[no_mangle] -pub extern "C" fn protover_all_supported( - c_relay_version: *const c_char, - missing_out: *mut *mut c_char, -) -> c_int { - - if c_relay_version.is_null() { - return 1; - } - - // Require an unsafe block to read the version from a C string. The pointer - // is checked above to ensure it is not null. - let c_str: &CStr = unsafe { CStr::from_ptr(c_relay_version) }; - - let relay_version = match c_str.to_str() { - Ok(n) => n, - Err(_) => return 1, - }; - - let (is_supported, unsupported) = all_supported(relay_version); - - if unsupported.len() > 0 { - let c_unsupported = match CString::new(unsupported) { - Ok(n) => n, - Err(_) => return 1, - }; - - let ptr = c_unsupported.into_raw(); - unsafe { *missing_out = ptr }; - } - - return if is_supported { 1 } else { 0 }; -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::list_supports_protocol -#[no_mangle] -pub extern "C" fn protocol_list_supports_protocol( - c_protocol_list: *const c_char, - c_protocol: uint32_t, - version: uint32_t, -) -> c_int { - if c_protocol_list.is_null() { - return 1; - } - - // Require an unsafe block to read the version from a C string. The pointer - // is checked above to ensure it is not null. - let c_str: &CStr = unsafe { CStr::from_ptr(c_protocol_list) }; - - let protocol_list = match c_str.to_str() { - Ok(n) => n, - Err(_) => return 1, - }; - - let protocol = match translate_to_rust(c_protocol) { - Ok(n) => n, - Err(_) => return 0, - }; - - let is_supported = - protover_string_supports_protocol(protocol_list, protocol, version); - - return if is_supported { 1 } else { 0 }; -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::list_supports_protocol_or_later -#[no_mangle] -pub extern "C" fn protocol_list_supports_protocol_or_later( - c_protocol_list: *const c_char, - c_protocol: uint32_t, - version: uint32_t, -) -> c_int { - if c_protocol_list.is_null() { - return 1; - } - - // Require an unsafe block to read the version from a C string. The pointer - // is checked above to ensure it is not null. - let c_str: &CStr = unsafe { CStr::from_ptr(c_protocol_list) }; - - let protocol_list = match c_str.to_str() { - Ok(n) => n, - Err(_) => return 1, - }; - - let protocol = match translate_to_rust(c_protocol) { - Ok(n) => n, - Err(_) => return 0, - }; - - let is_supported = - protover_string_supports_protocol_or_later( - protocol_list, protocol, version); - - return if is_supported { 1 } else { 0 }; -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::get_supported_protocols -#[no_mangle] -pub extern "C" fn protover_get_supported_protocols() -> *mut c_char { - // Not handling errors when unwrapping as the content is controlled - // and is an empty string - let empty = CString::new("").unwrap(); - - let supported = get_supported_protocols(); - let c_supported = match CString::new(supported) { - Ok(n) => n, - Err(_) => return empty.into_raw(), - }; - - c_supported.into_raw() -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::compute_vote -#[no_mangle] -pub extern "C" fn protover_compute_vote( - list: *const Stringlist, - threshold: c_int, -) -> *mut c_char { - - if list.is_null() { - let empty = String::new(); - return allocate_and_copy_string(&empty); - } - - // Dereference of raw pointer requires an unsafe block. The pointer is - // checked above to ensure it is not null. - let data: Vec = unsafe { (*list).get_list() }; - - let vote = compute_vote(data, threshold); - - allocate_and_copy_string(&vote) -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::is_supported_here -#[no_mangle] -pub extern "C" fn protover_is_supported_here( - c_protocol: uint32_t, - version: uint32_t, -) -> c_int { - let protocol = match translate_to_rust(c_protocol) { - Ok(n) => n, - Err(_) => return 0, - }; - - let is_supported = is_supported_here(protocol, version); - - return if is_supported { 1 } else { 0 }; -} - -/// Provide an interface for C to translate arguments and return types for -/// protover::compute_for_old_tor -#[no_mangle] -pub extern "C" fn protover_compute_for_old_tor( - version: *const c_char, -) -> *mut c_char { - // Not handling errors when unwrapping as the content is controlled - // and is an empty string - let empty = String::new(); - - if version.is_null() { - return allocate_and_copy_string(&empty); - } - - // Require an unsafe block to read the version from a C string. The pointer - // is checked above to ensure it is not null. - let c_str: &CStr = unsafe { CStr::from_ptr(version) }; - - let version = match c_str.to_str() { - Ok(n) => n, - Err(_) => return allocate_and_copy_string(&empty), - }; - - let supported = compute_for_old_tor(&version); - - allocate_and_copy_string(&supported) -} diff --git a/src/tor/src/rust/protover/lib.rs b/src/tor/src/rust/protover/lib.rs deleted file mode 100644 index 5a5dea440..000000000 --- a/src/tor/src/rust/protover/lib.rs +++ /dev/null @@ -1,33 +0,0 @@ -//! Copyright (c) 2016-2017, The Tor Project, Inc. */ -//! See LICENSE for licensing information */ - -//! Versioning information for different pieces of the Tor protocol. -//! -//! The below description is taken from src/rust/protover.c, which is currently -//! enabled by default. We are in the process of experimenting with Rust in -//! tor, and this protover module is implemented to help achieve this goal. -//! -//! Starting in version 0.2.9.3-alpha, Tor places separate version numbers on -//! each of the different components of its protocol. Relays use these numbers -//! to advertise what versions of the protocols they can support, and clients -//! use them to find what they can ask a given relay to do. Authorities vote -//! on the supported protocol versions for each relay, and also vote on the -//! which protocols you should have to support in order to be on the Tor -//! network. All Tor instances use these required/recommended protocol versions -//! to tell what level of support for recent protocols each relay has, and -//! to decide whether they should be running given their current protocols. -//! -//! The main advantage of these protocol versions numbers over using Tor -//! version numbers is that they allow different implementations of the Tor -//! protocols to develop independently, without having to claim compatibility -//! with specific versions of Tor. - -extern crate libc; -extern crate smartlist; -extern crate external; -extern crate tor_allocate; - -mod protover; -pub mod ffi; - -pub use protover::*; diff --git a/src/tor/src/rust/protover/protover.rs b/src/tor/src/rust/protover/protover.rs deleted file mode 100644 index 7d5947ca2..000000000 --- a/src/tor/src/rust/protover/protover.rs +++ /dev/null @@ -1,906 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -use external::c_tor_version_as_new_as; - -use std::str::FromStr; -use std::fmt; -use std::collections::{HashMap, HashSet}; -use std::string::String; - -/// The first version of Tor that included "proto" entries in its descriptors. -/// Authorities should use this to decide whether to guess proto lines. -/// -/// C_RUST_COUPLED: -/// src/or/protover.h `FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS` -const FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS: &'static str = "0.2.9.3-alpha"; - -/// The maximum number of subprotocol version numbers we will attempt to expand -/// before concluding that someone is trying to DoS us -/// -/// C_RUST_COUPLED: src/or/protover.c `MAX_PROTOCOLS_TO_EXPAND` -const MAX_PROTOCOLS_TO_EXPAND: u32 = 500; - -/// Currently supported protocols and their versions -/// -/// C_RUST_COUPLED: src/or/protover.c `protover_get_supported_protocols` -const SUPPORTED_PROTOCOLS: &'static [&'static str] = &[ - "Cons=1-2", - "Desc=1-2", - "DirCache=1-2", - "HSDir=1-2", - "HSIntro=3-4", - "HSRend=1-2", - "Link=1-4", - "LinkAuth=1,3", - "Microdesc=1-2", - "Relay=1-2", -]; - -/// Known subprotocols in Tor. Indicates which subprotocol a relay supports. -/// -/// C_RUST_COUPLED: src/or/protover.h `protocol_type_t` -#[derive(Hash, Eq, PartialEq, Debug)] -pub enum Proto { - Cons, - Desc, - DirCache, - HSDir, - HSIntro, - HSRend, - Link, - LinkAuth, - Microdesc, - Relay, -} - -impl fmt::Display for Proto { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -/// Translates a string representation of a protocol into a Proto type. -/// Error if the string is an unrecognized protocol name. -/// -/// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES` -impl FromStr for Proto { - type Err = &'static str; - - fn from_str(s: &str) -> Result { - match s { - "Cons" => Ok(Proto::Cons), - "Desc" => Ok(Proto::Desc), - "DirCache" => Ok(Proto::DirCache), - "HSDir" => Ok(Proto::HSDir), - "HSIntro" => Ok(Proto::HSIntro), - "HSRend" => Ok(Proto::HSRend), - "Link" => Ok(Proto::Link), - "LinkAuth" => Ok(Proto::LinkAuth), - "Microdesc" => Ok(Proto::Microdesc), - "Relay" => Ok(Proto::Relay), - _ => Err("Not a valid protocol type"), - } - } -} - -/// Get the string representation of current supported protocols -/// -/// # Returns -/// -/// A `String` whose value is the existing protocols supported by tor. -/// Returned data is in the format as follows: -/// -/// "HSDir=1-1 LinkAuth=1" -/// -pub fn get_supported_protocols() -> String { - SUPPORTED_PROTOCOLS.join(" ") -} - -/// Translates a vector representation of a protocol list into a HashMap -fn parse_protocols( - protocols: &[&str], -) -> Result>, &'static str> { - let mut parsed = HashMap::new(); - - for subproto in protocols { - let (name, version) = get_proto_and_vers(subproto)?; - parsed.insert(name, version); - } - Ok(parsed) -} - -/// Translates a string representation of a protocol list to a HashMap -fn parse_protocols_from_string<'a>( - protocol_string: &'a str, -) -> Result>, &'static str> { - let protocols: &[&'a str] = - &protocol_string.split(" ").collect::>()[..]; - - parse_protocols(protocols) -} - -/// Translates supported tor versions from a string into a HashMap, which is -/// useful when looking up a specific subprotocol. -/// -/// # Returns -/// -/// A `Result` whose `Ok` value is a `HashMap>` holding all -/// subprotocols and versions currently supported by tor. -/// -/// The returned `Result`'s `Err` value is an `&'static str` with a description -/// of the error. -/// -fn tor_supported() -> Result>, &'static str> { - parse_protocols(&SUPPORTED_PROTOCOLS) -} - -/// Get the unique version numbers supported by a subprotocol. -/// -/// # Inputs -/// -/// * `version_string`, a string comprised of "[0-9,-]" -/// -/// # Returns -/// -/// A `Result` whose `Ok` value is a `HashSet` holding all of the unique -/// version numbers. If there were ranges in the `version_string`, then these -/// are expanded, i.e. `"1-3"` would expand to `HashSet::new([1, 2, 3])`. -/// The returned HashSet is *unordered*. -/// -/// The returned `Result`'s `Err` value is an `&'static str` with a description -/// of the error. -/// -/// # Errors -/// -/// This function will error if: -/// -/// * the `version_string` is empty or contains an equals (`"="`) sign, -/// * the expansion of a version range produces an error (see -/// `expand_version_range`), -/// * any single version number is not parseable as an `u32` in radix 10, or -/// * there are greater than 2^16 version numbers to expand. -/// -fn get_versions(version_string: &str) -> Result, &'static str> { - if version_string.is_empty() { - return Err("version string is empty"); - } - - let mut versions = HashSet::::new(); - - for piece in version_string.split(",") { - if piece.contains("-") { - for p in expand_version_range(piece)? { - versions.insert(p); - } - } else { - versions.insert(u32::from_str(piece).or( - Err("invalid protocol entry"), - )?); - } - - if versions.len() > MAX_PROTOCOLS_TO_EXPAND as usize { - return Err("Too many versions to expand"); - } - } - Ok(versions) -} - - -/// Parse the subprotocol type and its version numbers. -/// -/// # Inputs -/// -/// * A `protocol_entry` string, comprised of a keyword, an "=" sign, and one -/// or more version numbers. -/// -/// # Returns -/// -/// A `Result` whose `Ok` value is a tuple of `(Proto, HashSet)`, where the -/// first element is the subprotocol type (see `protover::Proto`) and the last -/// element is a(n unordered) set of unique version numbers which are supported. -/// Otherwise, the `Err` value of this `Result` is a description of the error -/// -fn get_proto_and_vers<'a>( - protocol_entry: &'a str, -) -> Result<(Proto, HashSet), &'static str> { - let mut parts = protocol_entry.splitn(2, "="); - - let proto = match parts.next() { - Some(n) => n, - None => return Err("invalid protover entry"), - }; - - let vers = match parts.next() { - Some(n) => n, - None => return Err("invalid protover entry"), - }; - - let versions = get_versions(vers)?; - let proto_name = proto.parse()?; - - Ok((proto_name, versions)) -} - -/// Parses a single subprotocol entry string into subprotocol and version -/// parts, and then checks whether any of those versions are unsupported. -/// Helper for protover::all_supported -/// -/// # Inputs -/// -/// Accepted data is in the string format as follows: -/// -/// "HSDir=1-1" -/// -/// # Returns -/// -/// Returns `true` if the protocol entry is well-formatted and only contains -/// versions that are also supported in tor. Otherwise, returns false -/// -fn contains_only_supported_protocols(proto_entry: &str) -> bool { - let (name, mut vers) = match get_proto_and_vers(proto_entry) { - Ok(n) => n, - Err(_) => return false, - }; - - let currently_supported: HashMap> = - match tor_supported() { - Ok(n) => n, - Err(_) => return false, - }; - - let supported_versions = match currently_supported.get(&name) { - Some(n) => n, - None => return false, - }; - - vers.retain(|x| !supported_versions.contains(x)); - vers.is_empty() -} - -/// Determine if we support every protocol a client supports, and if not, -/// determine which protocols we do not have support for. -/// -/// # Inputs -/// -/// Accepted data is in the string format as follows: -/// -/// "HSDir=1-1 LinkAuth=1-2" -/// -/// # Returns -/// -/// Return `true` if every protocol version is one that we support. -/// Otherwise, return `false`. -/// Optionally, return parameters which the client supports but which we do not -/// -/// # Examples -/// ``` -/// use protover::all_supported; -/// -/// let (is_supported, unsupported) = all_supported("Link=1"); -/// assert_eq!(true, is_supported); -/// -/// let (is_supported, unsupported) = all_supported("Link=5-6"); -/// assert_eq!(false, is_supported); -/// assert_eq!("Link=5-6", unsupported); -/// -pub fn all_supported(protocols: &str) -> (bool, String) { - let unsupported = protocols - .split_whitespace() - .filter(|v| !contains_only_supported_protocols(v)) - .collect::>(); - - (unsupported.is_empty(), unsupported.join(" ")) -} - -/// Return true iff the provided protocol list includes support for the -/// indicated protocol and version. -/// Otherwise, return false -/// -/// # Inputs -/// -/// * `list`, a string representation of a list of protocol entries. -/// * `proto`, a `Proto` to test support for -/// * `vers`, a `u32` version which we will go on to determine whether the -/// specified protocol supports. -/// -/// # Examples -/// ``` -/// use protover::*; -/// -/// let is_supported = protover_string_supports_protocol("Link=3-4 Cons=1", -/// Proto::Cons,1); -/// assert_eq!(true, is_supported); -/// -/// let is_not_supported = protover_string_supports_protocol("Link=3-4 Cons=1", -/// Proto::Cons,5); -/// assert_eq!(false, is_not_supported) -/// ``` -pub fn protover_string_supports_protocol( - list: &str, - proto: Proto, - vers: u32, -) -> bool { - let supported: HashMap>; - - match parse_protocols_from_string(list) { - Ok(result) => supported = result, - Err(_) => return false, - } - - let supported_versions = match supported.get(&proto) { - Some(n) => n, - None => return false, - }; - - supported_versions.contains(&vers) -} - -/// As protover_string_supports_protocol(), but also returns True if -/// any later version of the protocol is supported. -/// -/// # Examples -/// ``` -/// use protover::*; -/// -/// let is_supported = protover_string_supports_protocol_or_later( -/// "Link=3-4 Cons=5", Proto::Cons, 5); -/// -/// assert_eq!(true, is_supported); -/// -/// let is_supported = protover_string_supports_protocol_or_later( -/// "Link=3-4 Cons=5", Proto::Cons, 4); -/// -/// assert_eq!(true, is_supported); -/// -/// let is_supported = protover_string_supports_protocol_or_later( -/// "Link=3-4 Cons=5", Proto::Cons, 6); -/// -/// assert_eq!(false, is_supported); -/// ``` -pub fn protover_string_supports_protocol_or_later( - list: &str, - proto: Proto, - vers: u32, -) -> bool { - let supported: HashMap>; - - match parse_protocols_from_string(list) { - Ok(result) => supported = result, - Err(_) => return false, - } - - let supported_versions = match supported.get(&proto) { - Some(n) => n, - None => return false, - }; - - supported_versions.iter().any(|v| v >= &vers) -} - -/// Fully expand a version range. For example, 1-3 expands to 1,2,3 -/// Helper for get_versions -/// -/// # Inputs -/// -/// `range`, a string comprised of "[0-9,-]" -/// -/// # Returns -/// -/// A `Result` whose `Ok` value a vector of unsigned integers representing the -/// expanded range of supported versions by a single protocol. -/// Otherwise, the `Err` value of this `Result` is a description of the error -/// -/// # Errors -/// -/// This function will error if: -/// -/// * the specified range is empty -/// * the version range does not contain both a valid lower and upper bound. -/// -fn expand_version_range(range: &str) -> Result, &'static str> { - if range.is_empty() { - return Err("version string empty"); - } - - let mut parts = range.split("-"); - - let lower_string = parts.next().ok_or( - "cannot parse protocol range lower bound", - )?; - - let lower = u32::from_str_radix(lower_string, 10).or(Err( - "cannot parse protocol range lower bound", - ))?; - - let higher_string = parts.next().ok_or( - "cannot parse protocol range upper bound", - )?; - - let higher = u32::from_str_radix(higher_string, 10).or(Err( - "cannot parse protocol range upper bound", - ))?; - - // We can use inclusive range syntax when it becomes stable. - Ok((lower..higher + 1).collect()) -} - -/// Checks to see if there is a continuous range of integers, starting at the -/// first in the list. Returns the last integer in the range if a range exists. -/// Helper for compute_vote -/// -/// # Inputs -/// -/// `list`, an ordered vector of `u32` integers of "[0-9,-]" representing the -/// supported versions for a single protocol. -/// -/// # Returns -/// -/// A `bool` indicating whether the list contains a range, starting at the -/// first in the list, and an `u32` of the last integer in the range. -/// -/// For example, if given vec![1, 2, 3, 5], find_range will return true, -/// as there is a continuous range, and 3, which is the last number in the -/// continuous range. -/// -fn find_range(list: &Vec) -> (bool, u32) { - if list.len() == 0 { - return (false, 0); - } - - let mut iterable = list.iter().peekable(); - let mut range_end = match iterable.next() { - Some(n) => *n, - None => return (false, 0), - }; - - let mut has_range = false; - - while iterable.peek().is_some() { - let n = *iterable.next().unwrap(); - if n != range_end + 1 { - break; - } - - has_range = true; - range_end = n; - } - - (has_range, range_end) -} - -/// Contracts a HashSet representation of supported versions into a string. -/// Helper for compute_vote -/// -/// # Inputs -/// -/// `supported_set`, a set of integers of "[0-9,-]" representing the -/// supported versions for a single protocol. -/// -/// # Returns -/// -/// A `String` representation of this set in ascending order. -/// -fn contract_protocol_list<'a>(supported_set: &'a HashSet) -> String { - let mut supported: Vec = supported_set.iter() - .map(|x| *x) - .collect(); - supported.sort(); - - let mut final_output: Vec = Vec::new(); - - while supported.len() != 0 { - let (has_range, end) = find_range(&supported); - let current = supported.remove(0); - - if has_range { - final_output.push(format!( - "{}-{}", - current.to_string(), - &end.to_string(), - )); - supported.retain(|&x| x > end); - } else { - final_output.push(current.to_string()); - } - } - - final_output.join(",") -} - -/// Parses a protocol list without validating the protocol names -/// -/// # Inputs -/// -/// * `protocol_string`, a string comprised of keys and values, both which are -/// strings. The keys are the protocol names while values are a string -/// representation of the supported versions. -/// -/// The input is _not_ expected to be a subset of the Proto types -/// -/// # Returns -/// -/// A `Result` whose `Ok` value is a `HashSet` holding all of the unique -/// version numbers. -/// -/// The returned `Result`'s `Err` value is an `&'static str` with a description -/// of the error. -/// -/// # Errors -/// -/// This function will error if: -/// -/// * The protocol string does not follow the "protocol_name=version_list" -/// expected format -/// * If the version string is malformed. See `get_versions`. -/// -fn parse_protocols_from_string_with_no_validation<'a>( - protocol_string: &'a str, -) -> Result>, &'static str> { - let protocols = &protocol_string.split(" ").collect::>()[..]; - - let mut parsed: HashMap> = HashMap::new(); - - for subproto in protocols { - let mut parts = subproto.splitn(2, "="); - - let name = match parts.next() { - Some(n) => n, - None => return Err("invalid protover entry"), - }; - - let vers = match parts.next() { - Some(n) => n, - None => return Err("invalid protover entry"), - }; - - let versions = get_versions(vers)?; - - parsed.insert(String::from(name), versions); - } - Ok(parsed) -} - -/// Protocol voting implementation. -/// -/// Given a list of strings describing protocol versions, return a new -/// string encoding all of the protocols that are listed by at -/// least threshold of the inputs. -/// -/// The string is sorted according to the following conventions: -/// - Protocols names are alphabetized -/// - Protocols are in order low to high -/// - Individual and ranges are listed together. For example, -/// "3, 5-10,13" -/// - All entries are unique -/// -/// # Examples -/// ``` -/// use protover::compute_vote; -/// -/// let protos = vec![String::from("Link=3-4"), String::from("Link=3")]; -/// let vote = compute_vote(protos, 2); -/// assert_eq!("Link=3", vote) -/// ``` -pub fn compute_vote( - list_of_proto_strings: Vec, - threshold: i32, -) -> String { - let empty = String::from(""); - - if list_of_proto_strings.is_empty() { - return empty; - } - - // all_count is a structure to represent the count of the number of - // supported versions for a specific protocol. For example, in JSON format: - // { - // "FirstSupportedProtocol": { - // "1": "3", - // "2": "1" - // } - // } - // means that FirstSupportedProtocol has three votes which support version - // 1, and one vote that supports version 2 - let mut all_count: HashMap> = HashMap::new(); - - // parse and collect all of the protos and their versions and collect them - for vote in list_of_proto_strings { - let this_vote: HashMap> = - match parse_protocols_from_string_with_no_validation(&vote) { - Ok(result) => result, - Err(_) => continue, - }; - - for (protocol, versions) in this_vote { - let supported_vers: &mut HashMap = - all_count.entry(protocol).or_insert(HashMap::new()); - - for version in versions { - let counter: &mut usize = - supported_vers.entry(version).or_insert(0); - *counter += 1; - } - } - } - - let mut final_output: HashMap = - HashMap::with_capacity(SUPPORTED_PROTOCOLS.len()); - - // Go through and remove verstions that are less than the threshold - for (protocol, versions) in all_count { - let mut meets_threshold = HashSet::new(); - for (version, count) in versions { - if count >= threshold as usize { - meets_threshold.insert(version); - } - } - - // For each protocol, compress its version list into the expected - // protocol version string format - let contracted = contract_protocol_list(&meets_threshold); - if !contracted.is_empty() { - final_output.insert(protocol, contracted); - } - } - - write_vote_to_string(&final_output) -} - -/// Return a String comprised of protocol entries in alphabetical order -/// -/// # Inputs -/// -/// * `vote`, a `HashMap` comprised of keys and values, both which are strings. -/// The keys are the protocol names while values are a string representation of -/// the supported versions. -/// -/// # Returns -/// -/// A `String` whose value is series of pairs, comprising of the protocol name -/// and versions that it supports. The string takes the following format: -/// -/// "first_protocol_name=1,2-5, second_protocol_name=4,5" -/// -/// Sorts the keys in alphabetical order and creates the expected subprotocol -/// entry format. -/// -fn write_vote_to_string(vote: &HashMap) -> String { - let mut keys: Vec<&String> = vote.keys().collect(); - keys.sort(); - - let mut output = Vec::new(); - for key in keys { - // TODO error in indexing here? - output.push(format!("{}={}", key, vote[key])); - } - output.join(" ") -} - -/// Returns a boolean indicating whether the given protocol and version is -/// supported in any of the existing Tor protocols -/// -/// # Examples -/// ``` -/// use protover::*; -/// -/// let is_supported = is_supported_here(Proto::Link, 5); -/// assert_eq!(false, is_supported); -/// -/// let is_supported = is_supported_here(Proto::Link, 1); -/// assert_eq!(true, is_supported); -/// ``` -pub fn is_supported_here(proto: Proto, vers: u32) -> bool { - let currently_supported: HashMap>; - - match tor_supported() { - Ok(result) => currently_supported = result, - Err(_) => return false, - } - - let supported_versions = match currently_supported.get(&proto) { - Some(n) => n, - None => return false, - }; - - supported_versions.contains(&vers) -} - -/// Older versions of Tor cannot infer their own subprotocols -/// Used to determine which subprotocols are supported by older Tor versions. -/// -/// # Inputs -/// -/// * `version`, a string comprised of "[0-9,-]" -/// -/// # Returns -/// -/// A `String` whose value is series of pairs, comprising of the protocol name -/// and versions that it supports. The string takes the following format: -/// -/// "HSDir=1-1 LinkAuth=1" -/// -/// This function returns the protocols that are supported by the version input, -/// only for tor versions older than FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS. -/// -/// C_RUST_COUPLED: src/rust/protover.c `compute_for_old_tor` -pub fn compute_for_old_tor(version: &str) -> String { - if c_tor_version_as_new_as( - version, - FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS, - ) - { - return String::new(); - } - - if c_tor_version_as_new_as(version, "0.2.9.1-alpha") { - let ret = "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 \ - Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2"; - return String::from(ret); - } - - if c_tor_version_as_new_as(version, "0.2.7.5") { - let ret = "Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 \ - Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2"; - return String::from(ret); - } - - if c_tor_version_as_new_as(version, "0.2.4.19") { - let ret = "Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 \ - Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2"; - return String::from(ret); - } - String::new() -} - -#[cfg(test)] -mod test { - #[test] - fn test_get_versions() { - use std::collections::HashSet; - - use super::get_versions; - - assert_eq!(Err("version string is empty"), get_versions("")); - assert_eq!(Err("invalid protocol entry"), get_versions("a,b")); - assert_eq!(Err("invalid protocol entry"), get_versions("1,!")); - - { - let mut versions: HashSet = HashSet::new(); - versions.insert(1); - assert_eq!(Ok(versions), get_versions("1")); - } - { - let mut versions: HashSet = HashSet::new(); - versions.insert(1); - versions.insert(2); - assert_eq!(Ok(versions), get_versions("1,2")); - } - { - let mut versions: HashSet = HashSet::new(); - versions.insert(1); - versions.insert(2); - versions.insert(3); - assert_eq!(Ok(versions), get_versions("1-3")); - } - { - let mut versions: HashSet = HashSet::new(); - versions.insert(1); - versions.insert(2); - versions.insert(5); - assert_eq!(Ok(versions), get_versions("1-2,5")); - } - { - let mut versions: HashSet = HashSet::new(); - versions.insert(1); - versions.insert(3); - versions.insert(4); - versions.insert(5); - assert_eq!(Ok(versions), get_versions("1,3-5")); - } - } - - #[test] - fn test_contains_only_supported_protocols() { - use super::contains_only_supported_protocols; - - assert_eq!(false, contains_only_supported_protocols("")); - assert_eq!(false, contains_only_supported_protocols("Cons=")); - assert_eq!(true, contains_only_supported_protocols("Cons=1")); - assert_eq!(false, contains_only_supported_protocols("Cons=0")); - assert_eq!(false, contains_only_supported_protocols("Cons=0-1")); - assert_eq!(false, contains_only_supported_protocols("Cons=5")); - assert_eq!(false, contains_only_supported_protocols("Cons=1-5")); - assert_eq!(false, contains_only_supported_protocols("Cons=1,5")); - assert_eq!(false, contains_only_supported_protocols("Cons=5,6")); - assert_eq!(false, contains_only_supported_protocols("Cons=1,5,6")); - assert_eq!(true, contains_only_supported_protocols("Cons=1,2")); - assert_eq!(true, contains_only_supported_protocols("Cons=1-2")); - } - - #[test] - fn test_find_range() { - use super::find_range; - - assert_eq!((false, 0), find_range(&vec![])); - assert_eq!((false, 1), find_range(&vec![1])); - assert_eq!((true, 2), find_range(&vec![1, 2])); - assert_eq!((true, 3), find_range(&vec![1, 2, 3])); - assert_eq!((true, 3), find_range(&vec![1, 2, 3, 5])); - } - - #[test] - fn test_expand_version_range() { - use super::expand_version_range; - - assert_eq!(Err("version string empty"), expand_version_range("")); - assert_eq!(Ok(vec![1, 2]), expand_version_range("1-2")); - assert_eq!(Ok(vec![1, 2, 3, 4]), expand_version_range("1-4")); - assert_eq!( - Err("cannot parse protocol range lower bound"), - expand_version_range("a") - ); - assert_eq!( - Err("cannot parse protocol range upper bound"), - expand_version_range("1-a") - ); - } - - #[test] - fn test_contract_protocol_list() { - use std::collections::HashSet; - use super::contract_protocol_list; - - { - let mut versions = HashSet::::new(); - assert_eq!(String::from(""), contract_protocol_list(&versions)); - - versions.insert(1); - assert_eq!(String::from("1"), contract_protocol_list(&versions)); - - versions.insert(2); - assert_eq!(String::from("1-2"), contract_protocol_list(&versions)); - } - - { - let mut versions = HashSet::::new(); - versions.insert(1); - versions.insert(3); - assert_eq!(String::from("1,3"), contract_protocol_list(&versions)); - } - - { - let mut versions = HashSet::::new(); - versions.insert(1); - versions.insert(2); - versions.insert(3); - versions.insert(4); - assert_eq!(String::from("1-4"), contract_protocol_list(&versions)); - } - - { - let mut versions = HashSet::::new(); - versions.insert(1); - versions.insert(3); - versions.insert(5); - versions.insert(6); - versions.insert(7); - assert_eq!( - String::from("1,3,5-7"), - contract_protocol_list(&versions) - ); - } - - { - let mut versions = HashSet::::new(); - versions.insert(1); - versions.insert(2); - versions.insert(3); - versions.insert(500); - assert_eq!( - String::from("1-3,500"), - contract_protocol_list(&versions) - ); - } - } -} diff --git a/src/tor/src/rust/protover/tests/protover.rs b/src/tor/src/rust/protover/tests/protover.rs deleted file mode 100644 index f4e394b3e..000000000 --- a/src/tor/src/rust/protover/tests/protover.rs +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -extern crate protover; - -#[test] -fn parse_protocol_list_with_single_proto_and_single_version() { - let protocol = "Cons=1"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_single_protocol_and_multiple_versions() { - let protocol = "Cons=1-2"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_different_single_protocol_and_single_version() { - let protocol = "HSDir=1"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_single_protocol_and_supported_version() { - let protocol = "Desc=2"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_two_protocols_and_single_version() { - let protocols = "Cons=1 HSDir=1"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - - -#[test] -fn parse_protocol_list_with_single_protocol_and_two_nonsequential_versions() { - let protocol = "Desc=1,2"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - - -#[test] -fn parse_protocol_list_with_single_protocol_and_two_sequential_versions() { - let protocol = "Desc=1-2"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_single_protocol_and_protocol_range_returns_set() { - let protocol = "Link=1-4"; - let (is_supported, unsupported) = protover::all_supported(protocol); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn parse_protocol_list_with_single_protocol_and_protocol_set() { - let protocols = "Link=3-4 Desc=2"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn protover_all_supported_with_two_values() { - let protocols = "Microdesc=1-2 Relay=2"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!("", &unsupported); - assert_eq!(true, is_supported); -} - -#[test] -fn protover_all_supported_with_one_value() { - let protocols = "Microdesc=1-2"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!("", &unsupported); - assert_eq!(true, is_supported); -} - -#[test] -fn protover_all_supported_with_empty() { - let protocols = ""; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(true, is_supported); - assert_eq!("", &unsupported); -} - -#[test] -fn protover_all_supported_with_three_values() { - let protocols = "LinkAuth=1 Microdesc=1-2 Relay=2"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!("", &unsupported); - assert_eq!(true, is_supported); -} - -#[test] -fn protover_all_supported_with_unsupported_protocol() { - let protocols = "Wombat=9"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Wombat=9", &unsupported); -} - -#[test] -fn protover_all_supported_with_unsupported_versions() { - let protocols = "Link=3-999"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Link=3-999", &unsupported); -} - -#[test] -fn protover_all_supported_with_unsupported_low_version() { - let protocols = "Cons=0-1"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Cons=0-1", &unsupported); -} - -#[test] -fn protover_all_supported_with_unsupported_high_version() { - let protocols = "Cons=1-3"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Cons=1-3", &unsupported); -} - -#[test] -fn protover_all_supported_with_mix_of_supported_and_unsupproted() { - let protocols = "Link=3-4 Wombat=9"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Wombat=9", &unsupported); -} - -#[test] -fn protover_string_supports_protocol_returns_true_for_single_supported() { - let protocols = "Link=3-4 Cons=1"; - let is_supported = protover::protover_string_supports_protocol( - protocols, - protover::Proto::Cons, - 1, - ); - assert_eq!(true, is_supported); -} - -#[test] -fn protover_string_supports_protocol_returns_false_for_single_unsupported() { - let protocols = "Link=3-4 Cons=1"; - let is_supported = protover::protover_string_supports_protocol( - protocols, - protover::Proto::Cons, - 2, - ); - assert_eq!(false, is_supported); -} - -#[test] -fn protover_string_supports_protocol_returns_false_for_unsupported() { - let protocols = "Link=3-4"; - let is_supported = protover::protover_string_supports_protocol( - protocols, - protover::Proto::Cons, - 2, - ); - assert_eq!(false, is_supported); -} - -#[test] -fn protover_all_supported_with_unexpected_characters() { - let protocols = "Cons=*-%"; - let (is_supported, unsupported) = protover::all_supported(protocols); - assert_eq!(false, is_supported); - assert_eq!("Cons=*-%", &unsupported); -} - -#[test] -fn protover_compute_vote_returns_empty_for_empty_string() { - let protocols = vec![String::from("")]; - let listed = protover::compute_vote(protocols, 1); - assert_eq!("", listed); -} - -#[test] -fn protover_compute_vote_returns_single_protocol_for_matching() { - let protocols = vec![String::from("Cons=1")]; - let listed = protover::compute_vote(protocols, 1); - assert_eq!("Cons=1", listed); -} - -#[test] -fn protover_compute_vote_returns_two_protocols_for_two_matching() { - let protocols = vec![String::from("Link=1 Cons=1")]; - let listed = protover::compute_vote(protocols, 1); - assert_eq!("Cons=1 Link=1", listed); -} - -#[test] -fn protover_compute_vote_returns_one_protocol_when_one_out_of_two_matches() { - let protocols = vec![String::from("Cons=1 Link=2"), String::from("Cons=1")]; - let listed = protover::compute_vote(protocols, 2); - assert_eq!("Cons=1", listed); -} - -#[test] -fn protover_compute_vote_returns_protocols_that_it_doesnt_currently_support() { - let protocols = vec![String::from("Foo=1 Cons=2"), String::from("Bar=1")]; - let listed = protover::compute_vote(protocols, 1); - assert_eq!("Bar=1 Cons=2 Foo=1", listed); -} - -#[test] -fn protover_compute_vote_returns_matching_for_mix() { - let protocols = vec![String::from("Link=1-10,500 Cons=1,3-7,8")]; - let listed = protover::compute_vote(protocols, 1); - assert_eq!("Cons=1,3-8 Link=1-10,500", listed); -} - -#[test] -fn protover_compute_vote_returns_matching_for_longer_mix() { - let protocols = vec![ - String::from("Desc=1-10,500 Cons=1,3-7,8"), - String::from("Link=123-456,78 Cons=2-6,8 Desc=9"), - ]; - - let listed = protover::compute_vote(protocols, 1); - assert_eq!("Cons=1-8 Desc=1-10,500 Link=78,123-456", listed); -} - -#[test] -fn protover_compute_vote_returns_matching_for_longer_mix_with_threshold_two() { - let protocols = vec![ - String::from("Desc=1-10,500 Cons=1,3-7,8"), - String::from("Link=123-456,78 Cons=2-6,8 Desc=9"), - ]; - - let listed = protover::compute_vote(protocols, 2); - assert_eq!("Cons=3-6,8 Desc=9", listed); -} - -#[test] -fn protover_compute_vote_handles_duplicated_versions() { - let protocols = vec![String::from("Cons=1"), String::from("Cons=1")]; - assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); - - let protocols = vec![String::from("Cons=1-2"), String::from("Cons=1-2")]; - assert_eq!("Cons=1-2", protover::compute_vote(protocols, 2)); -} - -#[test] -fn protover_compute_vote_handles_invalid_proto_entries() { - let protocols = vec![ - String::from("Cons=1"), - String::from("Cons=1"), - String::from("Link=a"), - ]; - assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); - - let protocols = vec![ - String::from("Cons=1"), - String::from("Cons=1"), - String::from("Link=1-%"), - ]; - assert_eq!("Cons=1", protover::compute_vote(protocols, 2)); -} - -#[test] -fn protover_is_supported_here_returns_true_for_supported_protocol() { - assert_eq!(true, protover::is_supported_here(protover::Proto::Cons, 1)); -} - -#[test] -fn protover_is_supported_here_returns_false_for_unsupported_protocol() { - assert_eq!(false, protover::is_supported_here(protover::Proto::Cons, 5)); -} diff --git a/src/tor/src/rust/smartlist/Cargo.toml b/src/tor/src/rust/smartlist/Cargo.toml deleted file mode 100644 index 51f486c4d..000000000 --- a/src/tor/src/rust/smartlist/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -authors = ["The Tor Project"] -version = "0.0.1" -name = "smartlist" - -[dependencies] -libc = "0.2.22" - -[lib] -name = "smartlist" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - diff --git a/src/tor/src/rust/smartlist/lib.rs b/src/tor/src/rust/smartlist/lib.rs deleted file mode 100644 index 14a814831..000000000 --- a/src/tor/src/rust/smartlist/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -extern crate libc; - -mod smartlist; - -pub use smartlist::*; diff --git a/src/tor/src/rust/smartlist/smartlist.rs b/src/tor/src/rust/smartlist/smartlist.rs deleted file mode 100644 index ec5d7a57f..000000000 --- a/src/tor/src/rust/smartlist/smartlist.rs +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -use std::slice; -use libc::{c_char, c_int}; -use std::ffi::CStr; - -/// Smartlists are a type used in C code in tor to define a collection of a -/// generic type, which has a capacity and a number used. Each Smartlist -/// defines how to extract the list of values from the underlying C structure -/// -/// Implementations are required to have a C representation, as this module -/// serves purely to translate smartlists as defined in tor to vectors in Rust. -pub trait Smartlist { - fn get_list(&self) -> Vec; -} - -#[repr(C)] -pub struct Stringlist { - pub list: *const *const c_char, - pub num_used: c_int, - pub capacity: c_int, -} - -impl Smartlist for Stringlist { - fn get_list(&self) -> Vec { - let empty: Vec = Vec::new(); - let mut rust_list: Vec = Vec::new(); - - if self.list.is_null() || self.num_used == 0 { - return empty; - } - - // unsafe, as we need to extract the smartlist list into a vector of - // pointers, and then transform each element into a Rust string. - let elems: &[*const i8] = - unsafe { slice::from_raw_parts(self.list, self.num_used as usize) }; - - for elem in elems.iter() { - if elem.is_null() { - continue; - } - - // unsafe, as we need to create a cstring from the referenced - // element - let c_string = unsafe { CStr::from_ptr(*elem) }; - - let r_string = match c_string.to_str() { - Ok(n) => n, - Err(_) => return empty, - }; - - rust_list.push(String::from(r_string)); - } - - rust_list - } -} - -// TODO: CHK: this module maybe should be tested from a test in C with a -// smartlist as defined in tor. -#[cfg(test)] -mod test { - #[test] - fn test_get_list_of_strings() { - extern crate libc; - - use std::ffi::CString; - use libc::c_char; - - use super::Smartlist; - use super::Stringlist; - - { - // test to verify that null pointers are gracefully handled - use std::ptr; - - let sl = Stringlist { - list: ptr::null(), - num_used: 0, - capacity: 0, - }; - - let data = sl.get_list(); - assert_eq!(0, data.len()); - } - - { - let args = vec![String::from("a"), String::from("b")]; - - // for each string, transform it into a CString - let c_strings: Vec<_> = args.iter() - .map(|arg| CString::new(arg.as_str()).unwrap()) - .collect(); - - // then, collect a pointer for each CString - let p_args: Vec<_> = - c_strings.iter().map(|arg| arg.as_ptr()).collect(); - - let p: *const *const c_char = p_args.as_ptr(); - - // This is the representation that we expect when receiving a - // smartlist at the Rust/C FFI layer. - let sl = Stringlist { - list: p, - num_used: 2, - capacity: 2, - }; - - let data = sl.get_list(); - assert_eq!("a", &data[0]); - assert_eq!("b", &data[1]); - } - } -} diff --git a/src/tor/src/rust/tor_allocate/Cargo.toml b/src/tor/src/rust/tor_allocate/Cargo.toml deleted file mode 100644 index ceb08b78a..000000000 --- a/src/tor/src/rust/tor_allocate/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -authors = ["The Tor Project"] -version = "0.0.1" -name = "tor_allocate" - -[dependencies] -libc = "0.2.22" - -[lib] -name = "tor_allocate" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - diff --git a/src/tor/src/rust/tor_allocate/lib.rs b/src/tor/src/rust/tor_allocate/lib.rs deleted file mode 100644 index 937a5dcf6..000000000 --- a/src/tor/src/rust/tor_allocate/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -//! Allocation helper functions that allow data to be allocated in Rust -//! using tor's specified allocator. In doing so, this can be later freed -//! from C. -//! -//! This is currently a temporary solution, we will later use tor's allocator -//! by default for any allocation that occurs in Rust. However, as this will -//! stabalize in 2018, we can use this as a temporary measure. - -extern crate libc; - -mod tor_allocate; -pub use tor_allocate::*; diff --git a/src/tor/src/rust/tor_allocate/tor_allocate.rs b/src/tor/src/rust/tor_allocate/tor_allocate.rs deleted file mode 100644 index 359df1cd7..000000000 --- a/src/tor/src/rust/tor_allocate/tor_allocate.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -use libc::{c_char, c_void}; -use std::{ptr, slice, mem}; - -#[cfg(not(test))] -extern "C" { - fn tor_malloc_(size: usize) -> *mut c_void; -} - -// Defined only for tests, used for testing purposes, so that we don't need -// to link to tor C files. Uses the system allocator -#[cfg(test)] -unsafe extern "C" fn tor_malloc_(size: usize) -> *mut c_void { - use libc::malloc; - malloc(size) -} - -/// Allocate memory using tor_malloc_ and copy an existing string into the -/// allocated buffer, returning a pointer that can later be called in C. -/// -/// # Inputs -/// -/// * `src`, a reference to a String. -/// -/// # Returns -/// -/// A `*mut c_char` that should be freed by tor_free in C -/// -pub fn allocate_and_copy_string(src: &String) -> *mut c_char { - let bytes: &[u8] = src.as_bytes(); - - let size = mem::size_of_val::<[u8]>(bytes); - let size_one_byte = mem::size_of::(); - - // handle integer overflow when adding one to the calculated length - let size_with_null_byte = match size.checked_add(size_one_byte) { - Some(n) => n, - None => return ptr::null_mut(), - }; - - let dest = unsafe { tor_malloc_(size_with_null_byte) as *mut u8 }; - - if dest.is_null() { - return ptr::null_mut(); - } - - unsafe { ptr::copy_nonoverlapping(bytes.as_ptr(), dest, size) }; - - // set the last byte as null, using the ability to index into a slice - // rather than doing pointer arithmatic - let slice = unsafe { slice::from_raw_parts_mut(dest, size_with_null_byte) }; - slice[size] = 0; // add a null terminator - - dest as *mut c_char -} - -#[cfg(test)] -mod test { - - #[test] - fn test_allocate_and_copy_string_with_empty() { - use std::ffi::CStr; - use libc::{free, c_void}; - - use tor_allocate::allocate_and_copy_string; - - let empty = String::new(); - let allocated_empty = allocate_and_copy_string(&empty); - - let allocated_empty_rust = - unsafe { CStr::from_ptr(allocated_empty).to_str().unwrap() }; - - assert_eq!("", allocated_empty_rust); - - unsafe { free(allocated_empty as *mut c_void) }; - } - - #[test] - fn test_allocate_and_copy_string_with_not_empty_string() { - use std::ffi::CStr; - use libc::{free, c_void}; - - use tor_allocate::allocate_and_copy_string; - - let empty = String::from("foo bar biz"); - let allocated_empty = allocate_and_copy_string(&empty); - - let allocated_empty_rust = - unsafe { CStr::from_ptr(allocated_empty).to_str().unwrap() }; - - assert_eq!("foo bar biz", allocated_empty_rust); - - unsafe { free(allocated_empty as *mut c_void) }; - } -} diff --git a/src/tor/src/rust/tor_rust/Cargo.toml b/src/tor/src/rust/tor_rust/Cargo.toml deleted file mode 100644 index 86fad3ee7..000000000 --- a/src/tor/src/rust/tor_rust/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -authors = ["The Tor Project"] -name = "tor_rust" -version = "0.1.0" - -[lib] -name = "tor_rust" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - -[dependencies.tor_util] -path = "../tor_util" - -[dependencies.protover] -path = "../protover" - diff --git a/src/tor/src/rust/tor_rust/include.am b/src/tor/src/rust/tor_rust/include.am deleted file mode 100644 index c02324cb7..000000000 --- a/src/tor/src/rust/tor_rust/include.am +++ /dev/null @@ -1,30 +0,0 @@ -EXTRA_DIST +=\ - src/rust/tor_rust/Cargo.toml \ - src/rust/tor_rust/lib.rs - -EXTRA_CARGO_OPTIONS= - -src/rust/target/release/@TOR_RUST_STATIC_NAME@: FORCE - ( cd "$(abs_top_builddir)/src/rust" ; \ - CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \ - CARGO_HOME="$(abs_top_builddir)/src/rust" \ - $(CARGO) build --release $(EXTRA_CARGO_OPTIONS) \ - $(CARGO_ONLINE) \ - --manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" ) - -distclean-rust: - ( cd "$(abs_top_builddir)/src/rust" ; \ - CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \ - CARGO_HOME="$(abs_top_builddir)/src/rust" \ - $(CARGO) clean $(EXTRA_CARGO_OPTIONS) \ - $(CARGO_ONLINE) \ - --manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" ) - rm -rf "$(abs_top_builddir)/src/rust/registry" - -if USE_RUST -build-rust: src/rust/target/release/@TOR_RUST_STATIC_NAME@ -else -build-rust: -endif - -FORCE: diff --git a/src/tor/src/rust/tor_rust/lib.rs b/src/tor/src/rust/tor_rust/lib.rs deleted file mode 100644 index c1585c048..000000000 --- a/src/tor/src/rust/tor_rust/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern crate tor_util; -extern crate protover; - -pub use tor_util::*; -pub use protover::*; diff --git a/src/tor/src/rust/tor_util/Cargo.toml b/src/tor/src/rust/tor_util/Cargo.toml deleted file mode 100644 index d7379a598..000000000 --- a/src/tor/src/rust/tor_util/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -authors = ["The Tor Project"] -name = "tor_util" -version = "0.0.1" - -[lib] -name = "tor_util" -path = "lib.rs" -crate_type = ["rlib", "staticlib"] - -[dependencies.tor_allocate] -path = "../tor_allocate" - -[dependencies] -libc = "0.2.22" - diff --git a/src/tor/src/rust/tor_util/ffi.rs b/src/tor/src/rust/tor_util/ffi.rs deleted file mode 100644 index 5c3cdba4b..000000000 --- a/src/tor/src/rust/tor_util/ffi.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -//! FFI functions to announce Rust support during tor startup, only to be -//! called from C. -//! - -use libc::c_char; -use tor_allocate::allocate_and_copy_string; - -/// Returns a short string to announce Rust support during startup. -/// -/// # Examples -/// ```c -/// char *rust_str = rust_welcome_string(); -/// printf("%s", rust_str); -/// tor_free(rust_str); -/// ``` -#[no_mangle] -pub extern "C" fn rust_welcome_string() -> *mut c_char { - let rust_welcome = String::from( - "Tor is running with Rust integration. Please report \ - any bugs you encounter.", - ); - allocate_and_copy_string(&rust_welcome) -} diff --git a/src/tor/src/rust/tor_util/lib.rs b/src/tor/src/rust/tor_util/lib.rs deleted file mode 100644 index 42fa9d5ad..000000000 --- a/src/tor/src/rust/tor_util/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2016-2017, The Tor Project, Inc. */ -// See LICENSE for licensing information */ - -//! Small module to announce Rust support during startup for demonstration -//! purposes. -//! - -extern crate libc; -extern crate tor_allocate; - -pub mod ffi; diff --git a/src/tor/src/test/Makefile.nmake b/src/tor/src/test/Makefile.nmake deleted file mode 100644 index cfbe281b9..000000000 --- a/src/tor/src/test/Makefile.nmake +++ /dev/null @@ -1,37 +0,0 @@ -all: test.exe test-child.exe bench.exe - -CFLAGS = /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common /I ..\or \ - /I ..\ext - -LIBS = ..\..\..\build-alpha\lib\libevent.lib \ - ..\..\..\build-alpha\lib\libcrypto.lib \ - ..\..\..\build-alpha\lib\libssl.lib \ - ..\..\..\build-alpha\lib\libz.lib \ - ..\or\libtor.lib \ - ws2_32.lib advapi32.lib shell32.lib \ - crypt32.lib gdi32.lib user32.lib - -TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \ - test_consdiff.obj test_containers.obj \ - test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \ - test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj \ - test_config.obj test_connection.obj \ - test_cell_formats.obj test_relay.obj test_replay.obj \ - test_channelpadding.obj \ - test_circuitstats.obj \ - test_scheduler.obj test_introduce.obj test_hs.obj tinytest.obj - -tinytest.obj: ..\ext\tinytest.c - $(CC) $(CFLAGS) /D snprintf=_snprintf /c ..\ext\tinytest.c - -test.exe: $(TEST_OBJECTS) - $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib $(TEST_OBJECTS) /Fe$@ - -bench.exe: bench.obj - $(CC) $(CFLAGS) bench.obj $(LIBS) ..\common\*.lib /Fe$@ - -test-child.exe: test-child.obj - $(CC) $(CFLAGS) test-child.obj /Fe$@ - -clean: - del *.obj *.lib test.exe bench.exe test-child.exe diff --git a/src/tor/src/test/bench.c b/src/tor/src/test/bench.c deleted file mode 100644 index f30b60990..000000000 --- a/src/tor/src/test/bench.c +++ /dev/null @@ -1,738 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file bench.c - * \brief Benchmarks for lower level Tor modules. - **/ - -#include "orconfig.h" - -#include "or.h" -#include "onion_tap.h" -#include "relay.h" -#include -#include -#include -#include -#include - -#include "config.h" -#include "crypto_curve25519.h" -#include "onion_ntor.h" -#include "crypto_ed25519.h" -#include "consdiff.h" - -#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) -static uint64_t nanostart; -static inline uint64_t -timespec_to_nsec(const struct timespec *ts) -{ - return ((uint64_t)ts->tv_sec)*1000000000 + ts->tv_nsec; -} - -static void -reset_perftime(void) -{ - struct timespec ts; - int r; - r = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); - tor_assert(r == 0); - nanostart = timespec_to_nsec(&ts); -} - -static uint64_t -perftime(void) -{ - struct timespec ts; - int r; - r = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); - tor_assert(r == 0); - return timespec_to_nsec(&ts) - nanostart; -} - -#else /* !(defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID)) */ -static struct timeval tv_start = { 0, 0 }; -static void -reset_perftime(void) -{ - tor_gettimeofday(&tv_start); -} -static uint64_t -perftime(void) -{ - struct timeval now, out; - tor_gettimeofday(&now); - timersub(&now, &tv_start, &out); - return ((uint64_t)out.tv_sec)*1000000000 + out.tv_usec*1000; -} -#endif /* defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) */ - -#define NANOCOUNT(start,end,iters) \ - ( ((double)((end)-(start))) / (iters) ) - -#define MICROCOUNT(start,end,iters) \ - ( NANOCOUNT((start), (end), (iters)) / 1000.0 ) - -/** Run AES performance benchmarks. */ -static void -bench_aes(void) -{ - int len, i; - char *b1, *b2; - crypto_cipher_t *c; - uint64_t start, end; - const int bytes_per_iter = (1<<24); - reset_perftime(); - char key[CIPHER_KEY_LEN]; - crypto_rand(key, sizeof(key)); - c = crypto_cipher_new(key); - - for (len = 1; len <= 8192; len *= 2) { - int iters = bytes_per_iter / len; - b1 = tor_malloc_zero(len); - b2 = tor_malloc_zero(len); - start = perftime(); - for (i = 0; i < iters; ++i) { - crypto_cipher_encrypt(c, b1, b2, len); - } - end = perftime(); - tor_free(b1); - tor_free(b2); - printf("%d bytes: %.2f nsec per byte\n", len, - NANOCOUNT(start, end, iters*len)); - } - crypto_cipher_free(c); -} - -static void -bench_onion_TAP(void) -{ - const int iters = 1<<9; - int i; - crypto_pk_t *key, *key2; - uint64_t start, end; - char os[TAP_ONIONSKIN_CHALLENGE_LEN]; - char or[TAP_ONIONSKIN_REPLY_LEN]; - crypto_dh_t *dh_out = NULL; - - key = crypto_pk_new(); - key2 = crypto_pk_new(); - if (crypto_pk_generate_key_with_bits(key, 1024) < 0) - goto done; - if (crypto_pk_generate_key_with_bits(key2, 1024) < 0) - goto done; - - reset_perftime(); - start = perftime(); - for (i = 0; i < iters; ++i) { - onion_skin_TAP_create(key, &dh_out, os); - crypto_dh_free(dh_out); - } - end = perftime(); - printf("Client-side, part 1: %f usec.\n", NANOCOUNT(start, end, iters)/1e3); - - onion_skin_TAP_create(key, &dh_out, os); - start = perftime(); - for (i = 0; i < iters; ++i) { - char key_out[CPATH_KEY_MATERIAL_LEN]; - onion_skin_TAP_server_handshake(os, key, NULL, or, - key_out, sizeof(key_out)); - } - end = perftime(); - printf("Server-side, key guessed right: %f usec\n", - NANOCOUNT(start, end, iters)/1e3); - - start = perftime(); - for (i = 0; i < iters; ++i) { - char key_out[CPATH_KEY_MATERIAL_LEN]; - onion_skin_TAP_server_handshake(os, key2, key, or, - key_out, sizeof(key_out)); - } - end = perftime(); - printf("Server-side, key guessed wrong: %f usec.\n", - NANOCOUNT(start, end, iters)/1e3); - - start = perftime(); - for (i = 0; i < iters; ++i) { - crypto_dh_t *dh; - char key_out[CPATH_KEY_MATERIAL_LEN]; - int s; - dh = crypto_dh_dup(dh_out); - s = onion_skin_TAP_client_handshake(dh, or, key_out, sizeof(key_out), - NULL); - crypto_dh_free(dh); - tor_assert(s == 0); - } - end = perftime(); - printf("Client-side, part 2: %f usec.\n", - NANOCOUNT(start, end, iters)/1e3); - - done: - crypto_dh_free(dh_out); - crypto_pk_free(key); - crypto_pk_free(key2); -} - -static void -bench_onion_ntor_impl(void) -{ - const int iters = 1<<10; - int i; - curve25519_keypair_t keypair1, keypair2; - uint64_t start, end; - uint8_t os[NTOR_ONIONSKIN_LEN]; - uint8_t or[NTOR_REPLY_LEN]; - ntor_handshake_state_t *state = NULL; - uint8_t nodeid[DIGEST_LEN]; - di_digest256_map_t *keymap = NULL; - - curve25519_secret_key_generate(&keypair1.seckey, 0); - curve25519_public_key_generate(&keypair1.pubkey, &keypair1.seckey); - curve25519_secret_key_generate(&keypair2.seckey, 0); - curve25519_public_key_generate(&keypair2.pubkey, &keypair2.seckey); - dimap_add_entry(&keymap, keypair1.pubkey.public_key, &keypair1); - dimap_add_entry(&keymap, keypair2.pubkey.public_key, &keypair2); - crypto_rand((char *)nodeid, sizeof(nodeid)); - - reset_perftime(); - start = perftime(); - for (i = 0; i < iters; ++i) { - onion_skin_ntor_create(nodeid, &keypair1.pubkey, &state, os); - ntor_handshake_state_free(state); - state = NULL; - } - end = perftime(); - printf("Client-side, part 1: %f usec.\n", NANOCOUNT(start, end, iters)/1e3); - - state = NULL; - onion_skin_ntor_create(nodeid, &keypair1.pubkey, &state, os); - start = perftime(); - for (i = 0; i < iters; ++i) { - uint8_t key_out[CPATH_KEY_MATERIAL_LEN]; - onion_skin_ntor_server_handshake(os, keymap, NULL, nodeid, or, - key_out, sizeof(key_out)); - } - end = perftime(); - printf("Server-side: %f usec\n", - NANOCOUNT(start, end, iters)/1e3); - - start = perftime(); - for (i = 0; i < iters; ++i) { - uint8_t key_out[CPATH_KEY_MATERIAL_LEN]; - int s; - s = onion_skin_ntor_client_handshake(state, or, key_out, sizeof(key_out), - NULL); - tor_assert(s == 0); - } - end = perftime(); - printf("Client-side, part 2: %f usec.\n", - NANOCOUNT(start, end, iters)/1e3); - - ntor_handshake_state_free(state); - dimap_free(keymap, NULL); -} - -static void -bench_onion_ntor(void) -{ - int ed; - - for (ed = 0; ed <= 1; ++ed) { - printf("Ed25519-based basepoint multiply = %s.\n", - (ed == 0) ? "disabled" : "enabled"); - curve25519_set_impl_params(ed); - bench_onion_ntor_impl(); - } -} - -static void -bench_ed25519_impl(void) -{ - uint64_t start, end; - const int iters = 1<<12; - int i; - const uint8_t msg[] = "but leaving, could not tell what they had heard"; - ed25519_signature_t sig; - ed25519_keypair_t kp; - curve25519_keypair_t curve_kp; - ed25519_public_key_t pubkey_tmp; - - ed25519_secret_key_generate(&kp.seckey, 0); - start = perftime(); - for (i = 0; i < iters; ++i) { - ed25519_public_key_generate(&kp.pubkey, &kp.seckey); - } - end = perftime(); - printf("Generate public key: %.2f usec\n", - MICROCOUNT(start, end, iters)); - - start = perftime(); - for (i = 0; i < iters; ++i) { - ed25519_sign(&sig, msg, sizeof(msg), &kp); - } - end = perftime(); - printf("Sign a short message: %.2f usec\n", - MICROCOUNT(start, end, iters)); - - start = perftime(); - for (i = 0; i < iters; ++i) { - ed25519_checksig(&sig, msg, sizeof(msg), &kp.pubkey); - } - end = perftime(); - printf("Verify signature: %.2f usec\n", - MICROCOUNT(start, end, iters)); - - curve25519_keypair_generate(&curve_kp, 0); - start = perftime(); - for (i = 0; i < iters; ++i) { - ed25519_public_key_from_curve25519_public_key(&pubkey_tmp, - &curve_kp.pubkey, 1); - } - end = perftime(); - printf("Convert public point from curve25519: %.2f usec\n", - MICROCOUNT(start, end, iters)); - - curve25519_keypair_generate(&curve_kp, 0); - start = perftime(); - for (i = 0; i < iters; ++i) { - ed25519_public_blind(&pubkey_tmp, &kp.pubkey, msg); - } - end = perftime(); - printf("Blind a public key: %.2f usec\n", - MICROCOUNT(start, end, iters)); -} - -static void -bench_ed25519(void) -{ - int donna; - - for (donna = 0; donna <= 1; ++donna) { - printf("Ed25519-donna = %s.\n", - (donna == 0) ? "disabled" : "enabled"); - ed25519_set_impl_params(donna); - bench_ed25519_impl(); - } -} - -static void -bench_cell_aes(void) -{ - uint64_t start, end; - const int len = 509; - const int iters = (1<<16); - const int max_misalign = 15; - char *b = tor_malloc(len+max_misalign); - crypto_cipher_t *c; - int i, misalign; - char key[CIPHER_KEY_LEN]; - crypto_rand(key, sizeof(key)); - c = crypto_cipher_new(key); - - reset_perftime(); - for (misalign = 0; misalign <= max_misalign; ++misalign) { - start = perftime(); - for (i = 0; i < iters; ++i) { - crypto_cipher_crypt_inplace(c, b+misalign, len); - } - end = perftime(); - printf("%d bytes, misaligned by %d: %.2f nsec per byte\n", len, misalign, - NANOCOUNT(start, end, iters*len)); - } - - crypto_cipher_free(c); - tor_free(b); -} - -/** Run digestmap_t performance benchmarks. */ -static void -bench_dmap(void) -{ - smartlist_t *sl = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); - uint64_t start, end, pt2, pt3, pt4; - int iters = 8192; - const int elts = 4000; - const int fpostests = 100000; - char d[20]; - int i,n=0, fp = 0; - digestmap_t *dm = digestmap_new(); - digestset_t *ds = digestset_new(elts); - - for (i = 0; i < elts; ++i) { - crypto_rand(d, 20); - smartlist_add(sl, tor_memdup(d, 20)); - } - for (i = 0; i < elts; ++i) { - crypto_rand(d, 20); - smartlist_add(sl2, tor_memdup(d, 20)); - } - printf("nbits=%d\n", ds->mask+1); - - reset_perftime(); - - start = perftime(); - for (i = 0; i < iters; ++i) { - SMARTLIST_FOREACH(sl, const char *, cp, digestmap_set(dm, cp, (void*)1)); - } - pt2 = perftime(); - printf("digestmap_set: %.2f ns per element\n", - NANOCOUNT(start, pt2, iters*elts)); - - for (i = 0; i < iters; ++i) { - SMARTLIST_FOREACH(sl, const char *, cp, digestmap_get(dm, cp)); - SMARTLIST_FOREACH(sl2, const char *, cp, digestmap_get(dm, cp)); - } - pt3 = perftime(); - printf("digestmap_get: %.2f ns per element\n", - NANOCOUNT(pt2, pt3, iters*elts*2)); - - for (i = 0; i < iters; ++i) { - SMARTLIST_FOREACH(sl, const char *, cp, digestset_add(ds, cp)); - } - pt4 = perftime(); - printf("digestset_add: %.2f ns per element\n", - NANOCOUNT(pt3, pt4, iters*elts)); - - for (i = 0; i < iters; ++i) { - SMARTLIST_FOREACH(sl, const char *, cp, n += digestset_contains(ds, cp)); - SMARTLIST_FOREACH(sl2, const char *, cp, n += digestset_contains(ds, cp)); - } - end = perftime(); - printf("digestset_contains: %.2f ns per element.\n", - NANOCOUNT(pt4, end, iters*elts*2)); - /* We need to use this, or else the whole loop gets optimized out. */ - printf("Hits == %d\n", n); - - for (i = 0; i < fpostests; ++i) { - crypto_rand(d, 20); - if (digestset_contains(ds, d)) ++fp; - } - printf("False positive rate on digestset: %.2f%%\n", - (fp/(double)fpostests)*100); - - digestmap_free(dm, NULL); - digestset_free(ds); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); - smartlist_free(sl); - smartlist_free(sl2); -} - -static void -bench_siphash(void) -{ - char buf[128]; - int lens[] = { 7, 8, 15, 16, 20, 32, 111, 128, -1 }; - int i, j; - uint64_t start, end; - const int N = 300000; - crypto_rand(buf, sizeof(buf)); - - for (i = 0; lens[i] > 0; ++i) { - reset_perftime(); - start = perftime(); - for (j = 0; j < N; ++j) { - siphash24g(buf, lens[i]); - } - end = perftime(); - printf("siphash24g(%d): %.2f ns per call\n", - lens[i], NANOCOUNT(start,end,N)); - } -} - -static void -bench_digest(void) -{ - char buf[8192]; - char out[DIGEST512_LEN]; - const int lens[] = { 1, 16, 32, 64, 128, 512, 1024, 2048, -1 }; - const int N = 300000; - uint64_t start, end; - crypto_rand(buf, sizeof(buf)); - - for (int alg = 0; alg < N_DIGEST_ALGORITHMS; alg++) { - for (int i = 0; lens[i] > 0; ++i) { - reset_perftime(); - start = perftime(); - for (int j = 0; j < N; ++j) { - switch (alg) { - case DIGEST_SHA1: - crypto_digest(out, buf, lens[i]); - break; - case DIGEST_SHA256: - case DIGEST_SHA3_256: - crypto_digest256(out, buf, lens[i], alg); - break; - case DIGEST_SHA512: - case DIGEST_SHA3_512: - crypto_digest512(out, buf, lens[i], alg); - break; - default: - tor_assert(0); - } - } - end = perftime(); - printf("%s(%d): %.2f ns per call\n", - crypto_digest_algorithm_get_name(alg), - lens[i], NANOCOUNT(start,end,N)); - } - } -} - -static void -bench_cell_ops(void) -{ - const int iters = 1<<16; - int i; - - /* benchmarks for cell ops at relay. */ - or_circuit_t *or_circ = tor_malloc_zero(sizeof(or_circuit_t)); - cell_t *cell = tor_malloc(sizeof(cell_t)); - int outbound; - uint64_t start, end; - - crypto_rand((char*)cell->payload, sizeof(cell->payload)); - - /* Mock-up or_circuit_t */ - or_circ->base_.magic = OR_CIRCUIT_MAGIC; - or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; - - /* Initialize crypto */ - char key1[CIPHER_KEY_LEN], key2[CIPHER_KEY_LEN]; - crypto_rand(key1, sizeof(key1)); - crypto_rand(key2, sizeof(key2)); - or_circ->p_crypto = crypto_cipher_new(key1); - or_circ->n_crypto = crypto_cipher_new(key2); - or_circ->p_digest = crypto_digest_new(); - or_circ->n_digest = crypto_digest_new(); - - reset_perftime(); - - for (outbound = 0; outbound <= 1; ++outbound) { - cell_direction_t d = outbound ? CELL_DIRECTION_OUT : CELL_DIRECTION_IN; - start = perftime(); - for (i = 0; i < iters; ++i) { - char recognized = 0; - crypt_path_t *layer_hint = NULL; - relay_crypt(TO_CIRCUIT(or_circ), cell, d, &layer_hint, &recognized); - } - end = perftime(); - printf("%sbound cells: %.2f ns per cell. (%.2f ns per byte of payload)\n", - outbound?"Out":" In", - NANOCOUNT(start,end,iters), - NANOCOUNT(start,end,iters*CELL_PAYLOAD_SIZE)); - } - - crypto_digest_free(or_circ->p_digest); - crypto_digest_free(or_circ->n_digest); - crypto_cipher_free(or_circ->p_crypto); - crypto_cipher_free(or_circ->n_crypto); - tor_free(or_circ); - tor_free(cell); -} - -static void -bench_dh(void) -{ - const int iters = 1<<10; - int i; - uint64_t start, end; - - reset_perftime(); - start = perftime(); - for (i = 0; i < iters; ++i) { - char dh_pubkey_a[DH_BYTES], dh_pubkey_b[DH_BYTES]; - char secret_a[DH_BYTES], secret_b[DH_BYTES]; - ssize_t slen_a, slen_b; - crypto_dh_t *dh_a = crypto_dh_new(DH_TYPE_TLS); - crypto_dh_t *dh_b = crypto_dh_new(DH_TYPE_TLS); - crypto_dh_generate_public(dh_a); - crypto_dh_generate_public(dh_b); - crypto_dh_get_public(dh_a, dh_pubkey_a, sizeof(dh_pubkey_a)); - crypto_dh_get_public(dh_b, dh_pubkey_b, sizeof(dh_pubkey_b)); - slen_a = crypto_dh_compute_secret(LOG_NOTICE, - dh_a, dh_pubkey_b, sizeof(dh_pubkey_b), - secret_a, sizeof(secret_a)); - slen_b = crypto_dh_compute_secret(LOG_NOTICE, - dh_b, dh_pubkey_a, sizeof(dh_pubkey_a), - secret_b, sizeof(secret_b)); - tor_assert(slen_a == slen_b); - tor_assert(fast_memeq(secret_a, secret_b, slen_a)); - crypto_dh_free(dh_a); - crypto_dh_free(dh_b); - } - end = perftime(); - printf("Complete DH handshakes (1024 bit, public and private ops):\n" - " %f millisec each.\n", NANOCOUNT(start, end, iters)/1e6); -} - -static void -bench_ecdh_impl(int nid, const char *name) -{ - const int iters = 1<<10; - int i; - uint64_t start, end; - - reset_perftime(); - start = perftime(); - for (i = 0; i < iters; ++i) { - char secret_a[DH_BYTES], secret_b[DH_BYTES]; - ssize_t slen_a, slen_b; - EC_KEY *dh_a = EC_KEY_new_by_curve_name(nid); - EC_KEY *dh_b = EC_KEY_new_by_curve_name(nid); - if (!dh_a || !dh_b) { - puts("Skipping. (No implementation?)"); - return; - } - - EC_KEY_generate_key(dh_a); - EC_KEY_generate_key(dh_b); - slen_a = ECDH_compute_key(secret_a, DH_BYTES, - EC_KEY_get0_public_key(dh_b), dh_a, - NULL); - slen_b = ECDH_compute_key(secret_b, DH_BYTES, - EC_KEY_get0_public_key(dh_a), dh_b, - NULL); - - tor_assert(slen_a == slen_b); - tor_assert(fast_memeq(secret_a, secret_b, slen_a)); - EC_KEY_free(dh_a); - EC_KEY_free(dh_b); - } - end = perftime(); - printf("Complete ECDH %s handshakes (2 public and 2 private ops):\n" - " %f millisec each.\n", name, NANOCOUNT(start, end, iters)/1e6); -} - -static void -bench_ecdh_p256(void) -{ - bench_ecdh_impl(NID_X9_62_prime256v1, "P-256"); -} - -static void -bench_ecdh_p224(void) -{ - bench_ecdh_impl(NID_secp224r1, "P-224"); -} - -typedef void (*bench_fn)(void); - -typedef struct benchmark_t { - const char *name; - bench_fn fn; - int enabled; -} benchmark_t; - -#define ENT(s) { #s , bench_##s, 0 } - -static struct benchmark_t benchmarks[] = { - ENT(dmap), - ENT(siphash), - ENT(digest), - ENT(aes), - ENT(onion_TAP), - ENT(onion_ntor), - ENT(ed25519), - - ENT(cell_aes), - ENT(cell_ops), - ENT(dh), - ENT(ecdh_p256), - ENT(ecdh_p224), - {NULL,NULL,0} -}; - -static benchmark_t * -find_benchmark(const char *name) -{ - benchmark_t *b; - for (b = benchmarks; b->name; ++b) { - if (!strcmp(name, b->name)) { - return b; - } - } - return NULL; -} - -/** Main entry point for benchmark code: parse the command line, and run - * some benchmarks. */ -int -main(int argc, const char **argv) -{ - int i; - int list=0, n_enabled=0; - char *errmsg; - or_options_t *options; - - tor_threads_init(); - tor_compress_init(); - - if (argc == 4 && !strcmp(argv[1], "diff")) { - init_logging(1); - const int N = 200; - char *f1 = read_file_to_str(argv[2], RFTS_BIN, NULL); - char *f2 = read_file_to_str(argv[3], RFTS_BIN, NULL); - if (! f1 || ! f2) { - perror("X"); - return 1; - } - for (i = 0; i < N; ++i) { - char *diff = consensus_diff_generate(f1, f2); - tor_free(diff); - } - char *diff = consensus_diff_generate(f1, f2); - printf("%s", diff); - tor_free(f1); - tor_free(f2); - tor_free(diff); - return 0; - } - - for (i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "--list")) { - list = 1; - } else { - benchmark_t *benchmark = find_benchmark(argv[i]); - ++n_enabled; - if (benchmark) { - benchmark->enabled = 1; - } else { - printf("No such benchmark as %s\n", argv[i]); - } - } - } - - reset_perftime(); - - if (crypto_seed_rng() < 0) { - printf("Couldn't seed RNG; exiting.\n"); - return 1; - } - crypto_init_siphash_key(); - options = options_new(); - init_logging(1); - options->command = CMD_RUN_UNITTESTS; - options->DataDirectory = tor_strdup(""); - options_init(options); - if (set_options(options, &errmsg) < 0) { - printf("Failed to set initial options: %s\n", errmsg); - tor_free(errmsg); - return 1; - } - - for (benchmark_t *b = benchmarks; b->name; ++b) { - if (b->enabled || n_enabled == 0) { - printf("===== %s =====\n", b->name); - if (!list) - b->fn(); - } - } - - return 0; -} - diff --git a/src/tor/src/test/bt_test.py b/src/tor/src/test/bt_test.py deleted file mode 100644 index 4cb332604..000000000 --- a/src/tor/src/test/bt_test.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2013-2017, The Tor Project, Inc -# See LICENSE for licensing information - -""" -bt_test.py - -This file tests the output from test-bt-cl to make sure it's as expected. - -Example usage: - -$ ./src/test/test-bt-cl crash | ./src/test/bt_test.py -OK -$ ./src/test/test-bt-cl assert | ./src/test/bt_test.py -OK - -""" - -from __future__ import print_function -import sys - - -def matches(lines, funcs): - if len(lines) < len(funcs): - return False - try: - for l, f in zip(lines, funcs): - l.index(f) - except ValueError: - return False - else: - return True - -FUNCNAMES = "crash oh_what a_tangled_web we_weave main".split() - -LINES = sys.stdin.readlines() - -for I in range(len(LINES)): - if matches(LINES[I:], FUNCNAMES): - print("OK") - sys.exit(0) - -print("BAD") - -for l in LINES: - print("{}".format(l), end="") - -if sys.platform.startswith('freebsd'): - # See bug #17808 if you know how to fix this. - print("Test failed; but FreeBSD is known to have backtrace problems.\n" - "Treating as 'SKIP'.") - sys.exit(77) - -sys.exit(1) diff --git a/src/tor/src/test/ed25519_exts_ref.py b/src/tor/src/test/ed25519_exts_ref.py deleted file mode 100644 index f84d3002d..000000000 --- a/src/tor/src/test/ed25519_exts_ref.py +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/python -# Copyright 2014-2017, The Tor Project, Inc -# See LICENSE for licensing information - -""" - Reference implementations for the ed25519 tweaks that Tor uses. - - Includes self-tester and test vector generator. -""" - -import slow_ed25519 -from slow_ed25519 import * - -import os -import random -import slownacl_curve25519 -import unittest -import binascii -import textwrap - -#define a synonym that doesn't look like 1 -ell = l - -# This replaces expmod above and makes it go a lot faster. -slow_ed25519.expmod = pow - -def curve25519ToEd25519(c, sign): - u = decodeint(c) - y = ((u - 1) * inv(u + 1)) % q - x = xrecover(y) - if x & 1 != sign: x = q-x - return encodepoint([x,y]) - -def blindESK(esk, param): - mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2)) - s = decodeint(esk[:32]) - s_prime = (s * mult) % ell - k = esk[32:] - assert(len(k) == 32) - k_prime = H("Derive temporary signing key hash input" + k)[:32] - return encodeint(s_prime) + k_prime - -def blindPK(pk, param): - mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2)) - P = decodepoint(pk) - return encodepoint(scalarmult(P, mult)) - -def expandSK(sk): - h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - k = ''.join([h[i] for i in range(b/8,b/4)]) - assert len(k) == 32 - return encodeint(a)+k - -def publickeyFromESK(h): - a = decodeint(h[:32]) - A = scalarmult(B,a) - return encodepoint(A) - -def signatureWithESK(m,h,pk): - a = decodeint(h[:32]) - r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) - R = scalarmult(B,r) - S = (r + Hint(encodepoint(R) + pk + m) * a) % l - return encodepoint(R) + encodeint(S) - -def newSK(): - return os.urandom(32) - -def random_scalar(entropy_f): # 0..L-1 inclusive - # reduce the bias to a safe level by generating 256 extra bits - oversized = int(binascii.hexlify(entropy_f(32+32)), 16) - return oversized % ell - -# ------------------------------------------------------------ - -MSG = "This is extremely silly. But it is also incredibly serious business!" - -class SelfTest(unittest.TestCase): - - def _testSignatures(self, esk, pk): - sig = signatureWithESK(MSG, esk, pk) - checkvalid(sig, MSG, pk) - bad = False - try: - checkvalid(sig, MSG*2, pk) - bad = True - except Exception: - pass - - self.failIf(bad) - - def testExpand(self): - sk = newSK() - pk = publickey(sk) - esk = expandSK(sk) - sig1 = signature(MSG, sk, pk) - sig2 = signatureWithESK(MSG, esk, pk) - self.assertEquals(sig1, sig2) - - def testSignatures(self): - sk = newSK() - esk = expandSK(sk) - pk = publickeyFromESK(esk) - pk2 = publickey(sk) - self.assertEquals(pk, pk2) - - self._testSignatures(esk, pk) - - def testDerivation(self): - priv = slownacl_curve25519.Private() - pub = priv.get_public() - - ed_pub0 = publickeyFromESK(priv.private) - sign = (ord(ed_pub0[31]) & 255) >> 7 - ed_pub1 = curve25519ToEd25519(pub.public, sign) - - self.assertEquals(ed_pub0, ed_pub1) - - def testBlinding(self): - sk = newSK() - esk = expandSK(sk) - pk = publickeyFromESK(esk) - param = os.urandom(32) - besk = blindESK(esk, param) - bpk = blindPK(pk, param) - bpk2 = publickeyFromESK(besk) - self.assertEquals(bpk, bpk2) - - self._testSignatures(besk, bpk) - - def testIdentity(self): - # Base point: - # B is the unique point (x, 4/5) \in E for which x is positive - By = 4 * inv(5) - Bx = xrecover(By) - B = [Bx % q,By % q] - - # Get identity E by doing: E = l*B, where l is the group order - identity = scalarmult(B, ell) - - # Get identity E by doing: E = l*A, where A is a random point - sk = newSK() - pk = decodepoint(publickey(sk)) - identity2 = scalarmult(pk, ell) - - # Check that identities match - assert(identity == identity2) - # Check that identity is the point (0,1) - assert(identity == [0L,1L]) - - # Check identity element: a*E = E, where a is a random scalar - scalar = random_scalar(os.urandom) - result = scalarmult(identity, scalar) - assert(result == identity == identity2) - -# ------------------------------------------------------------ - -# From pprint.pprint([ binascii.b2a_hex(os.urandom(32)) for _ in xrange(8) ]) -RAND_INPUTS = [ - '26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36', - 'fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d', - '67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e', - 'd51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6', - '5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433', - 'eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86', - '4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d', - 'c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b'] - -# From pprint.pprint([ binascii.b2a_hex(os.urandom(32)) for _ in xrange(8) ]) -BLINDING_PARAMS = [ - '54a513898b471d1d448a2f3c55c1de2c0ef718c447b04497eeb999ed32027823', - '831e9b5325b5d31b7ae6197e9c7a7baf2ec361e08248bce055908971047a2347', - 'ac78a1d46faf3bfbbdc5af5f053dc6dc9023ed78236bec1760dadfd0b2603760', - 'f9c84dc0ac31571507993df94da1b3d28684a12ad14e67d0a068aba5c53019fc', - 'b1fe79d1dec9bc108df69f6612c72812755751f21ecc5af99663b30be8b9081f', - '81f1512b63ab5fb5c1711a4ec83d379c420574aedffa8c3368e1c3989a3a0084', - '97f45142597c473a4b0e9a12d64561133ad9e1155fe5a9807fe6af8a93557818', - '3f44f6a5a92cde816635dfc12ade70539871078d2ff097278be2a555c9859cd0'] - -PREFIX = "ED25519_" - -def writeArray(name, array): - print "static const char *{prefix}{name}[] = {{".format( - prefix=PREFIX,name=name) - for a in array: - h = binascii.b2a_hex(a) - if len(h) > 70: - h1 = h[:70] - h2 = h[70:] - print ' "{0}"\n "{1}",'.format(h1,h2) - else: - print ' "{0}",'.format(h) - print "};\n" - -def comment(text, initial="/**"): - print initial - print textwrap.fill(text,initial_indent=" * ",subsequent_indent=" * ") - print " */" - -def makeTestVectors(): - comment("""Test vectors for our ed25519 implementation and related - functions. These were automatically generated by the - ed25519_exts_ref.py script.""", initial="/*") - - - comment("""Secret key seeds used as inputs for the ed25519 test vectors. - Randomly generated. """) - secretKeys = [ binascii.a2b_hex(r) for r in RAND_INPUTS ] - writeArray("SECRET_KEYS", secretKeys) - - comment("""Secret ed25519 keys after expansion from seeds. This is how Tor - represents them internally.""") - expandedSecretKeys = [ expandSK(sk) for sk in secretKeys ] - writeArray("EXPANDED_SECRET_KEYS", expandedSecretKeys) - - comment("""Public keys derived from the above secret keys""") - publicKeys = [ publickey(sk) for sk in secretKeys ] - writeArray("PUBLIC_KEYS", publicKeys) - - comment("""The curve25519 public keys from which the ed25519 keys can be - derived. Used to test our 'derive ed25519 from curve25519' - code.""") - writeArray("CURVE25519_PUBLIC_KEYS", - (slownacl_curve25519.smult_curve25519_base(sk[:32]) - for sk in expandedSecretKeys)) - - comment("""Parameters used for key blinding tests. Randomly generated.""") - blindingParams = [ binascii.a2b_hex(r) for r in BLINDING_PARAMS ] - writeArray("BLINDING_PARAMS", blindingParams) - - comment("""Blinded secret keys for testing key blinding. The nth blinded - key corresponds to the nth secret key blidned with the nth - blinding parameter.""") - writeArray("BLINDED_SECRET_KEYS", - (blindESK(expandSK(sk), bp) - for sk,bp in zip(secretKeys,blindingParams))) - - comment("""Blinded public keys for testing key blinding. The nth blinded - key corresponds to the nth public key blidned with the nth - blinding parameter.""") - writeArray("BLINDED_PUBLIC_KEYS", - (blindPK(pk, bp) for pk,bp in zip(publicKeys,blindingParams))) - - comment("""Signatures of the public keys, made with their corresponding - secret keys.""") - writeArray("SELF_SIGNATURES", - (signature(pk, sk, pk) for pk,sk in zip(publicKeys,secretKeys))) - - - -if __name__ == '__main__': - import sys - if len(sys.argv) == 1 or sys.argv[1] not in ("SelfTest", "MakeVectors"): - print "You should specify one of 'SelfTest' or 'MakeVectors'" - sys.exit(1) - if sys.argv[1] == 'SelfTest': - unittest.main() - else: - makeTestVectors() - - diff --git a/src/tor/src/test/ed25519_vectors.inc b/src/tor/src/test/ed25519_vectors.inc deleted file mode 100644 index 60c863beb..000000000 --- a/src/tor/src/test/ed25519_vectors.inc +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Test vectors for our ed25519 implementation and related - * functions. These were automatically generated by the - * ed25519_exts_ref.py script. - */ -/** - * Secret key seeds used as inputs for the ed25519 test vectors. - * Randomly generated. - */ -static const char *ED25519_SECRET_KEYS[] = { - "26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36", - "fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d", - "67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e", - "d51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6", - "5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433", - "eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86", - "4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d", - "c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b", -}; - -/** - * Secret ed25519 keys after expansion from seeds. This is how Tor - * represents them internally. - */ -static const char *ED25519_EXPANDED_SECRET_KEYS[] = { - "c0a4de23cc64392d85aa1da82b3defddbea946d13bb053bf8489fa9296281f495022f1" - "f7ec0dcf52f07d4c7965c4eaed121d5d88d0a8ff546b06116a20e97755", - "18a8a69a06790dac778e882f7e868baacfa12521a5c058f5194f3a729184514a2a656f" - "e7799c3e41f43d756da8d9cd47a061316cfe6147e23ea2f90d1ca45f30", - "58d84f8862d2ecfa30eb491a81c36d05b574310ea69dae18ecb57e992a896656b98218" - "7ee96c15bf4caeeab2d0b0ae4cd0b8d17470fc7efa98bb26428f4ef36d", - "50702d20b3550c6e16033db5ad4fba16436f1ecc7485be6af62b0732ceb5d173c47ccd" - "9d044b6ea99dd99256adcc9c62191be194e7cb1a5b58ddcec85d876a2b", - "7077464c864c2ed5ed21c9916dc3b3ba6256f8b742fec67658d8d233dadc8d5a7a82c3" - "71083cc86892c2c8782dda2a09b6baf016aec51b689183ae59ce932ff2", - "8883c1387a6c86fc0bd7b9f157b4e4cd83f6885bf55e2706d2235d4527a2f05311a359" - "5953282e436df0349e1bb313a19b3ddbf7a7b91ecce8a2c34abadb38b3", - "186791ac8d03a3ac8efed6ac360467edd5a3bed2d02b3be713ddd5be53b3287ee37436" - "e5fd7ac43794394507ad440ecfdf59c4c255f19b768a273109e06d7d8e", - "b003077c1e52a62308eef7950b2d532e1d4a7eea50ad22d8ac11b892851f1c40ffb9c9" - "ff8dcd0c6c233f665a2e176324d92416bfcfcd1f787424c0c667452d86", -}; - -/** - * Public keys derived from the above secret keys - */ -static const char *ED25519_PUBLIC_KEYS[] = { - "c2247870536a192d142d056abefca68d6193158e7c1a59c1654c954eccaff894", - "1519a3b15816a1aafab0b213892026ebf5c0dc232c58b21088d88cb90e9b940d", - "081faa81992e360ea22c06af1aba096e7a73f1c665bc8b3e4e531c46455fd1dd", - "73cfa1189a723aad7966137cbffa35140bb40d7e16eae4c40b79b5f0360dd65a", - "66c1a77104d86461b6f98f73acf3cd229c80624495d2d74d6fda1e940080a96b", - "d21c294db0e64cb2d8976625786ede1d9754186ae8197a64d72f68c792eecc19", - "c4d58b4cf85a348ff3d410dd936fa460c4f18da962c01b1963792b9dcc8a6ea6", - "95126f14d86494020665face03f2d42ee2b312a85bc729903eb17522954a1c4a", -}; - -/** - * The curve25519 public keys from which the ed25519 keys can be - * derived. Used to test our 'derive ed25519 from curve25519' - * code. - */ -static const char *ED25519_CURVE25519_PUBLIC_KEYS[] = { - "17ba77846e04c7ee5ca17cade774ac1884408f9701f439d4df32cbd8736c6a1f", - "022be2124bc1899a78ba2b4167d191af3b59cadf94f0382bc31ce183a117f161", - "bf4fd38ef22f718f03c0a12ba5127bd1e3afd494793753f519728b29cc577571", - "56c493e490261cef31633efd2461d2b896908e90459e4eecde950a895aef681d", - "089675a3e8ff2a7d8b2844a79269c95b7f97a4b8b5ea0cbeec669c6f2dea9b39", - "59e20dcb691c4a345fe86c8a79ac817e5b514d84bbf0512a842a08e43f7f087e", - "9e43b820b320eda35f66f122c155b2bf8e2192c468617b7115bf067d19e08369", - "861f33296cb57f8f01e4a5e8a7e5d5d7043a6247586ab36dea8a1a3c4403ee30", -}; - -/** - * Parameters used for key blinding tests. Randomly generated. - */ -static const char *ED25519_BLINDING_PARAMS[] = { - "54a513898b471d1d448a2f3c55c1de2c0ef718c447b04497eeb999ed32027823", - "831e9b5325b5d31b7ae6197e9c7a7baf2ec361e08248bce055908971047a2347", - "ac78a1d46faf3bfbbdc5af5f053dc6dc9023ed78236bec1760dadfd0b2603760", - "f9c84dc0ac31571507993df94da1b3d28684a12ad14e67d0a068aba5c53019fc", - "b1fe79d1dec9bc108df69f6612c72812755751f21ecc5af99663b30be8b9081f", - "81f1512b63ab5fb5c1711a4ec83d379c420574aedffa8c3368e1c3989a3a0084", - "97f45142597c473a4b0e9a12d64561133ad9e1155fe5a9807fe6af8a93557818", - "3f44f6a5a92cde816635dfc12ade70539871078d2ff097278be2a555c9859cd0", -}; - -/** - * Blinded secret keys for testing key blinding. The nth blinded - * key corresponds to the nth secret key blidned with the nth - * blinding parameter. - */ -static const char *ED25519_BLINDED_SECRET_KEYS[] = { - "293c3acff4e902f6f63ddc5d5caa2a57e771db4f24de65d4c28df3232f47fa01171d43" - "f24e3f53e70ec7ac280044ac77d4942dee5d6807118a59bdf3ee647e89", - "38b88f9f9440358da544504ee152fb475528f7c51c285bd1c68b14ade8e29a07b8ceff" - "20dfcf53eb52b891fc078c934efbf0353af7242e7dc51bb32a093afa29", - "4d03ce16a3f3249846aac9de0a0075061495c3b027248eeee47da4ddbaf9e0049217f5" - "2e92797462bd890fc274672e05c98f2c82970d640084781334aae0f940", - "51d7db01aaa0d937a9fd7c8c7381445a14d8fa61f43347af5460d7cd8fda9904509ece" - "e77082ce088f7c19d5a00e955eeef8df6fa41686abc1030c2d76807733", - "1f76cab834e222bd2546efa7e073425680ab88df186ff41327d3e40770129b00b57b95" - "a440570659a440a3e4771465022a8e67af86bdf2d0990c54e7bb87ff9a", - "c23588c23ee76093419d07b27c6df5922a03ac58f96c53671456a7d1bdbf560ec492fc" - "87d5ec2a1b185ca5a40541fdef0b1e128fd5c2380c888bfa924711bcab", - "3ed249c6932d076e1a2f6916975914b14e8c739da00992358b8f37d3e790650691b476" - "8f8e556d78f4bdcb9a13b6f6066fe81d3134ae965dc48cd0785b3af2b8", - "288cbfd923cb286d48c084555b5bdd06c05e92fb81acdb45271367f57515380e053d9c" - "00c81e1331c06ab50087be8cfc7dc11691b132614474f1aa9c2503cccd", -}; - -/** - * Blinded public keys for testing key blinding. The nth blinded - * key corresponds to the nth public key blidned with the nth - * blinding parameter. - */ -static const char *ED25519_BLINDED_PUBLIC_KEYS[] = { - "1fc1fa4465bd9d4956fdbdc9d3acb3c7019bb8d5606b951c2e1dfe0b42eaeb41", - "1cbbd4a88ce8f165447f159d9f628ada18674158c4f7c5ead44ce8eb0fa6eb7e", - "c5419ad133ffde7e0ac882055d942f582054132b092de377d587435722deb028", - "3e08d0dc291066272e313014bfac4d39ad84aa93c038478a58011f431648105f", - "59381f06acb6bf1389ba305f70874eed3e0f2ab57cdb7bc69ed59a9b8899ff4d", - "2b946a484344eb1c17c89dd8b04196a84f3b7222c876a07a4cece85f676f87d9", - "c6b585129b135f8769df2eba987e76e089e80ba3a2a6729134d3b28008ac098e", - "0eefdc795b59cabbc194c6174e34ba9451e8355108520554ec285acabebb34ac", -}; - -/** - * Signatures of the public keys, made with their corresponding - * secret keys. - */ -static const char *ED25519_SELF_SIGNATURES[] = { - "d23188eac3773a316d46006fa59c095060be8b1a23582a0dd99002a82a0662bd246d84" - "49e172e04c5f46ac0d1404cebe4aabd8a75a1457aa06cae41f3334f104", - "3a785ac1201c97ee5f6f0d99323960d5f264c7825e61aa7cc81262f15bef75eb4fa572" - "3add9b9d45b12311b6d403eb3ac79ff8e4e631fc3cd51e4ad2185b200b", - "cf431fd0416bfbd20c9d95ef9b723e2acddffb33900edc72195dea95965d52d888d30b" - "7b8a677c0bd8ae1417b1e1a0ec6700deadd5d8b54b6689275e04a04509", - "2375380cd72d1a6c642aeddff862be8a5804b916acb72c02d9ed052c1561881aa658a5" - "af856fcd6d43113e42f698cd6687c99efeef7f2ce045824440d26c5d00", - "2385a472f599ca965bbe4d610e391cdeabeba9c336694b0d6249e551458280be122c24" - "41dd9746a81bbfb9cd619364bab0df37ff4ceb7aefd24469c39d3bc508", - "e500cd0b8cfff35442f88008d894f3a2fa26ef7d3a0ca5714ae0d3e2d40caae58ba7cd" - "f69dd126994dad6be536fcda846d89dd8138d1683cc144c8853dce7607", - "d187b9e334b0050154de10bf69b3e4208a584e1a65015ec28b14bcc252cf84b8baa9c9" - "4867daa60f2a82d09ba9652d41e8dde292b624afc8d2c26441b95e3c0e", - "815213640a643d198bd056e02bba74e1c8d2d931643e84497adf3347eb485079c9afe0" - "afce9284cdc084946b561abbb214f1304ca11228ff82702185cf28f60d", -}; - diff --git a/src/tor/src/test/example_extrainfo.inc b/src/tor/src/test/example_extrainfo.inc deleted file mode 100644 index 0bf2341ef..000000000 --- a/src/tor/src/test/example_extrainfo.inc +++ /dev/null @@ -1,435 +0,0 @@ -static const char EX_EI_MINIMAL[] = - "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" - "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" - "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_MINIMAL_FP[] = "3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B"; -static const char EX_EI_MINIMAL_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALSppIF3t3wOAm4fzxRvK+q/wh1gGAWwS0JEn8d+c/x+rt1oQabGkqsB\n" - "GU6rz1z1AN02W0P2+EcyJQVBjGR3gHQNoDGx0KIdnr3caGAw3XmQXrJLPaViEk28\n" - "RJMxx6umpP27YKSyEMHgVTDXblKImT0mE7fVOx8tD0EWRYazmp4NAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_MAXIMAL[] = - "extra-info bob FF8248FE780A7236D3FA5D62DEA642055135F942\n" - "published 2014-10-05 20:07:00\n" - "opt foobarbaz\n" - "read-history 900 1,2,3\n" - "write-history 900 1,2,3\n" - "dirreq-v2-ips 1\n" - "dirreq-v3-ips 100\n" - "dirreq-v3-reqs blahblah\n" - "dirreq-v2-share blahblah\n" - "dirreq-v3-share blahblah\n" - "dirreq-v2-resp djfkdj\n" - "dirreq-v3-resp djfkdj\n" - "dirreq-v2-direct-dl djfkdj\n" - "dirreq-v3-direct-dl djfkdj\n" - "dirreq-v2-tunneled-dl djfkdj\n" - "dirreq-v3-tunneled-dl djfkdj\n" - "dirreq-stats-end foobar\n" - "entry-ips jfsdfds\n" - "entry-stats-end ksdflkjfdkf\n" - "cell-stats-end FOO\n" - "cell-processed-cells FOO\n" - "cell-queued-cells FOO\n" - "cell-time-in-queue FOO\n" - "cell-circuits-per-decile FOO\n" - "exit-stats-end FOO\n" - "exit-kibibytes-written FOO\n" - "exit-kibibytes-read FOO\n" - "exit-streams-opened FOO\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "ZO79bLlWVNIruCnWW9duDcOKydPWbL5DfrpUv5IRLF4MMFoacMUdJPDUs9e+wY2C\n" - "zndHe6i2JK7yKJj+uCOSC8cx61OLG+kVxMLJ/qhA4H5thrYb+GpzMKwbHzQc3PTH\n" - "zHRzj041iWXTL7/DMaQlpJOBoac/wTSIKzoV2B00jBw=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_MAXIMAL_FP[] = "FF8248FE780A7236D3FA5D62DEA642055135F942"; -static const char EX_EI_MAXIMAL_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANSpkYhHUW1EqodY4d3JRbvEM1vjjR/vEE8gjONiJ5t2Sten53jzt8bh\n" - "8/VJn7pQGs8zR5CIxCw4P68xMtZJJedS3hhjqubheOE/yW1DtpkiCf+zVEaLpeA8\n" - "fYQChkRICnR/BZd4W9bbohLVII5ym2PaJt2ihB3FeVZIsGXm4wxhAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_BAD_SIG1[] = - "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" - "V3l9u1uUdGiUPOl8j+hXXw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" - "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_SIG2[] = - "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" - "published 2014-10-06 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" - "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" - "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2R3EA=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_SIG3[] = - "extra-info bob 3E1B2DC141F2B7C6A0F3C4ED9A14A9C35762E24B\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "K5GAkVjpUlofL78NIOE1VDxFn8yYbHK50rVuZG2HxqG/727bon+uMprv4MHjfDcP\n" - "V3l9u1uUdGiUPOl8j+hRNw4z/ODeCj/24r2+L32MTjyfUhK49Ld2IlK9iZKlgKYi\n" - "zyoatxdAjU8Xc5WPX692HO4/R9CGLsUfYcEEFU2=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_FP[] = - "extra-info bob C34293303F0F1E42CB14E593717B834E8E53797D8888\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "IDA8ryUYeMx7+Au/xQmX7Y8fXksoHUOXmePND2JYM4rPfishQJ1LpQ15KrolOZDH\n" - "FVIk3RmCefNlJeS1/UgWPcU8u2nGw1YQuRBHF4ViTmZ0OevI1pTsSApl4+oIx2dy\n" - "DGgCQmKfMbaOixIK8Ioh1Z2NUfMkjbUUE2WWgFTAsac=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_FP_FP[] = "C34293303F0F1E42CB14E593717B834E8E53797D"; -static const char EX_EI_BAD_FP_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKXMSbif4fG+BW/5lIq5V1tMRondIUfKiNizp0E6EcBw5LvYfQV6zrj8\n" - "HmMFbB/WGf9XGVMxIBzxzeQBRvCQJh+0QH7+ju5/isIHJZsACMILepr6ywmCcjVU\n" - "iYRtC8zGQLqfkf2cNoo7AhcI5i/YzyW2u1zmbPX5J+8sUErfxydbAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_BAD_NICKNAME[] = - "extra-info bobhasaverylongnameandidontthinkweshouldlethim A4EA2389A52459B3F7C7121A46012F098BDFC2A4\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "e2wLJFThRMGawxKrQPuH2XCLek/LJsg4XOB8waAjE0xdHOrzjur9x1jIxy7DVU6t\n" - "z1edbIoL24qucMJvFy2xjSQhFRX4OsyNc0nWr3LfJnTW9aEmxuwXM+mltUD2uFN1\n" - "2vYOIQjUmJwS2yfeSKnhXEl2PWVUmgzYL3r4S5kHco4=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_NICKNAME_FP[] = "A4EA2389A52459B3F7C7121A46012F098BDFC2A4"; -static const char EX_EI_BAD_NICKNAME_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKfq7oxD1kMu1+zeG2UVXN4vOu6FDp0V/olA3ttmXpUCgCiBxWTgtwNl\n" - "nPf0HcKMaCp/0D9XrbhvIoOsg0OTf1TcJfGsA/zPG7jrWYa4xhD50KYvty9EINK9\n" - "/UBWNSyXCFDMqnddb/LZ8+VgttmxfYkpeRzSSmDijN3RbOvYJhhBAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_BAD_TOKENS[] = - "extra-info bob 6F314FB01A31162BD5E473D4977AC570DC5B86BB\n" - "published 2014-10-05 20:07:00\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "lhRIafrkKoQmnUoBLiq4XC8XKXrleGJZ5vefkLcgjOJ5IffsvVdIA7Vqq/ISbPrG\n" - "b/Zs0sJNL6naHPxJBglgHJqksSyiYHaeOetXg2Rb+vZ1v2S5BrVgk1nPMDhyIzqc\n" - "zU7eCxFf/1sXKtWlEKxGdX4LmVfnIln5aI31Bc4xRrE=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_TOKENS_FP[] = - "6F314FB01A31162BD5E473D4977AC570DC5B86BB"; -static const char EX_EI_BAD_TOKENS_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL7Z8tz45Tb4tnEFS2sAyjubBV/giSfZdmXRkDV8Jo4xqWqhWFJn7+zN\n" - "AXBWBThGeVH2WXrpz5seNJXgZJPxMTMsrnSCGcRXZw0Npti2MkLuQ6+prZa+OPwE\n" - "OyC6jivtAaY/o9iYQjDC2avLXD3N4LvoygyF418KnNcjbzuFygffAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_BAD_START[] = - "published 2014-10-05 20:07:00\n" - "extra-info bob 5CCCACE71A9BDB5E8E0C942AB3407452350434C0\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "BOiWgexqCAMZ8uyJ7jwBwRkz7Ox8cT4BImkmkV3bQiZgcWvPiYA3EnCm2ye48Ldg\n" - "zBST2p6zJM5o4MEDYGMxfViS86Abj/z7DOY1gtLhjmAaVjIIpXc3koxEZtzCecqy\n" - "JQz6xEg9/KoEuoT0DRrfYQ+KtQfzBDWrotfOvEa1rvc=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_START_FP[] = "5CCCACE71A9BDB5E8E0C942AB3407452350434C0"; -static const char EX_EI_BAD_START_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAK2OCIfM6Cin/lq99Z3w9tl6HeyGlkBZu9MQEPHxqGIHTq78lIC1UkrC\n" - "6NTqlrHBV9dmfzdwJn4GgMWsCZafL0FPIH3HNyNKUxLgyjixyKljHx2rfErSfOxI\n" - "bMoOGBKv7m1EZZ0O5uG9ly9MBiNGdJyLdlnVvH7wSCnYciizpO4lAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_BAD_PUBLISHED[] = - "extra-info bob E67C477E3536BDE348BD407426D9679E5AE0BC16\n" - "published 2014-99-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "l45IziBaXRKIjPAIUogMFNjQgH6k6Vm0+6r5+oByr4sP+B3ufNdUA6+WqBs43F0Z\n" - "IqcJiT9nFn0DuNd/liOyOCixppDLx5h5NrhoGqcT3ySADEEXhzjlmc35TI3YBNVO\n" - "v98fotmwIEg9YRWVGPg6XuIn2PRyiboFyjUpaYGCV0Q=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_EI_BAD_PUBLISHED_FP[] = "E67C477E3536BDE348BD407426D9679E5AE0BC16"; -static const char EX_EI_BAD_PUBLISHED_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL7q8GEI18iv8Fo0QbNHmFatQ2FNacalPldpmKUdMJYEVZtdOR0nhcrY\n" - "BvG6303md3INygg+KP49RvWEJR/cU4RZ9QfHpORxH2OocMyRedw2rLex2E7jNNSi\n" - "52yd1sHFYI8ZQ4aff+ZHUjJUGKRyqpbc8okVbq/Rl7vug0dd12eHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char EX_EI_GOOD_ED_EI[] = - "extra-info emma A692FE045C32B5E3A54B52882EF678A9DAC46A73\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AYgHn/OKR8GHBlscN5VkO73wA9jSci8QgTM30615ZT44AQAgBAC08woT\n" - "MBZpKzRcaoEJhEG7+RmuYtnB2+nODk9IRIs8ZoyYPTZ6dLzI+MLMmtzUuo/Wmvw0\n" - "PflTyCb2RlWitOEhAErWH3Z9UmYGnzM/COId0Fe3ScSriyvRoFnJY1+GVAQ=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 a7K8nwfg+HrdlSGQwr9rnLBq0qozkyZZs6d6aiLEiXGdhV1r9KJncmlQ5SNoY/zMQlyQm8EV5rCyBiVliKQ1Bw\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "GvmCmIGgbC1DeawRyRuChy62VmBOG0EviryG/a2qSZiFy0iPPwqSp5ZyZDQEIEId\n" - "kkk1zPzK1+S3fmgOAXyXGH0r4YFkoLGnhMk07BoEwi6HEXzjJsabmcNkOHfaOWgs\n" - "/5nvnLfcmxL4c6FstZ7t9VQpE06y3GU0zwBeIy1qjp0=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - ; -static const char EX_EI_GOOD_ED_EI_FP[] = - "A692FE045C32B5E3A54B52882EF678A9DAC46A73"; -static const char EX_EI_GOOD_ED_EI_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM3jdYwjwGxDWYj/vyFkQT7RgeCNIn89Ei6D2+L/fdtFnqrMXOreFFHL\n" - "C7CK2v2uN3v+uXxfb5lADz3NcalxJrCfGTGtaBk7PwMZraTSh2luFKOvSRBQCmB1\n" - "yD5N0QqnIhBJoGr6NITpbWyiTKWvYLjl9PZd9af8e8jQCAa5P1j1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; - -static const char EX_EI_ED_MISSING_SIG[] = - "extra-info rachel 2A7521497B91A8437021515308A47491164EDBA1\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AT2/T71LFYHiI1ppwNiuaewIu2Hq+GWWQ85O8gpWcUxeAQAgBAC2dgYu\n" - "moxhtuip7GVlthT9iomZKba1IllVa7uE1u2uO9BUYZQWXciFt7OnNzMH5mlffwxB\n" - "1dWCl+G5nbOsV5jYLbfhrF5afZotf+EQTfob4cCH79AV223LPcySbTHTtQ4=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "oypRD2IZQ5EttOE8dvofrW80nnBfijSkvYzBrM6H4KVeayRYvWfmi96dYO6ybMqm\n" - "Yp7Gs3ngqeeNdfHtkRPuQVUXUGYZgBTvYItuagnFlFgRqaHy0knwUIVOL35eqWYx\n" - "xSbQKA7fglxEDMFs/RK7FRP4dWc731ZMt5wzzfJHZ8E=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - ; -static const char EX_EI_ED_MISSING_SIG_FP[] = - "2A7521497B91A8437021515308A47491164EDBA1"; -static const char EX_EI_ED_MISSING_SIG_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOOB8ccxbtk2dB5FuKFhGndDcO6STNjB6KiG0b9X2QwKrOZMfmXSigto\n" - "mtC1JfPTxECayRjLSiP/9UD8iTVvlcnc8mMWBGM12Pa/KoCZRn7McHI3JJ7n9lfn\n" - "qw9+iZ9b/rBimzOb3W6k3uxzg9r8secdq4jJwTnwSjTObgxZtC8/AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; - -static const char EX_EI_ED_MISSING_CERT[] = - "extra-info lynne E88E43E86015345A323D93D825C33E4AD1028F65\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 H4gKIKm5K9Pfkriy7SlMUD6BdYVp6B5mXKzR/rTyYlpH0tEZ4Fx2hlHNfNNdWXJieXzKZQZo8e7SOVzvrAC3CQ\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "dIrbQjK5T9t5KM8CpsMF85hh2i060oPIxzYQMgE1q4j99dtb/n7SE8nhj1Sjij4D\n" - "7JvTjGdLHi3bFSxXaSmla0wxD9PUYFN7VsBQmwSaDrqrzJFb1SGwZuzW1IEZ7BBi\n" - "H0czsxEteg5hcNRwISj5WVthuWmau9v13MijtZGSK40=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - "\n" - ; -static const char EX_EI_ED_MISSING_CERT_FP[] = - "E88E43E86015345A323D93D825C33E4AD1028F65"; -static const char EX_EI_ED_MISSING_CERT_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALjA/geb0TR9rp/UPvLhABQpB0XUDYuZAnLkrv+i7AAV7FemTDveEGnc\n" - "XdXNSusO1mHOquvr0YYKPhwauInxD56S8QOzLYiWWajGq8XHARQ33b4/9K2TUrAx\n" - "W9HTHV1U1zrPlCJtrkbjxsYoHpUg5ljzM7FGYGY5xuvyHu18SQvzAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; -static const char EX_EI_ED_BAD_CERT1[] = - "extra-info marcie F78D8A655607D32281D02144817A4F1D26AE520F\n" - "identity-ed25519\n" - "-----BEGIN PLAGICAL SPELL-----\n" - "aaaa\n" - "-----END PLAGICAL SPELL\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 KQJ+2AH7EkkjrD0RtDtUAIr+Vc7wndwILYnoUxFLSJiTP+5fMi54eFF/f1OgkG8gYyTh8phMij9WOxK/dsOpBg\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "XWD+P25AH6moi79j20Si3hqKGcJDws+FORL1MTu+GeJLV1mp5CR9N83UH4ffulcL\n" - "CpSSBDL/j74HqapzW7QvBx3FilaNT55GvcobZDFK4TKkCEyEmcuWKpEceBS7JTTV\n" - "SvwZeOObTjWPafELbsc/gI9Rh5Idwu7mZt3ZVntCGaQ=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_EI_ED_BAD_CERT1_FP[] = - "F78D8A655607D32281D02144817A4F1D26AE520F"; -static const char EX_EI_ED_BAD_CERT1_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMlR46JhxsCmWYtmIB/JjTV2TUYIhJLmHy+X7FfkK3ZVQvvl9/3GSXFL\n" - "3USfyf3j34XLh8An7pJBi9LAHkIXgnRbglCud7dXoexabmC+c2mSbw5RnuxDGEwz\n" - "krXUph/r2b+2UY1CgEt28nFigaHrIQbCmF4szFX/2GPYCLi5SrRNAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; -static const char EX_EI_ED_BAD_CERT2[] = - "extra-info jaeger 7C2B42E783C4E0EB0CC3BDB37385D16737BACFBD\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55Acpw27GZBdwGCgawCj2F/DPadt8F/9DnEWywEew1Yi3qAOtLpCB8KXL7\n" - "4w5deFW2RBg8qTondNSUvAmwYLbLjNXMmgA3+nkoJOP3fcmQMHz1jm5xzgs2lCVP\n" - "t5txApaBIA4=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 DRQ4MLOGosBbW8M+17klNu8uWVkPxErmmEYoSo6OuH2Tzrcs6sUY+8Xi2qLoV1SbOugJ214Htl0I+6ceag+vBA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "DfdA+DbuN9nVJNujuSY5wNCDLk7Hfzkrde/sK0hVmZRvivtpF/Fy/dVQHHGNFY5i\n" - "L1cESAgq9HLdbHU+hcc08XXxTIaGwvoklcJClcG3ENVBWkTXbJNT+ifr7chEagIi\n" - "cVrtU6RVmzldSbyir8V/Z4S/Cm67gYAgjM5gfoFUqDs=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_EI_ED_BAD_CERT2_FP[] = - "7C2B42E783C4E0EB0CC3BDB37385D16737BACFBD"; -static const char EX_EI_ED_BAD_CERT2_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALAM1F/0XJEsbxIQqb3+ObX/yGVnq9of8Q9sLsmxffD6hwVpCqnV3lTg\n" - "iC6+xZ/bSlTGLPi0k8QLCaTmYxgKwmlMPpbQZ4kpZUrsb9flKdChMN7w8hd48pY9\n" - "lu8QiAEgErsl5rCCJIHHjrxxM/Cnd0TnedRnj/Z2YqpNx/ggsmsRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; -static const char EX_EI_ED_BAD_SIG1[] = - "extra-info vary 5AC3A538FEEFC6F9FCC5FA0CE64704396C30D62A\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AbPp++GrRb6WphSu+PkMaYsqY/beiLBmtiV3YP5i2JkKAQAgBABKXjg1\n" - "aiz2JfQpNOG308i2EojnUAZEk0C0x9g2BAAXGL63sv3eO/qrlytsG1x2hkcamxFn\n" - "LmfZBb/prqe1Vy4wABuhqWHAUtM29vXR6lpiCJeddt9Pa8XVy/tgWLX6TAw=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 a7K8nwfg+HrdlSGQwr9rnLBq0qozkyZZs6d6aiLEiXGdhV1r9KJncmlQ5SNoY/zMQlyQm8EV5rCyBiVliKQ1Bw\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "xhZX8Qmgft51NJ7eMd4vrESzf/VdxDrBz7hgn8K+5bLtZUksG0s6s7IyGRYWQtp4\n" - "/7oc9sYe3lcQiUN2K7DkeBDlL8Pcsl8aIlKuujWomCE3j0TIu+8XK6oJeo7eYic+\n" - "IA7EwVbdZsKsW5/eJVzbX2eO0a5zyJ5RIYotFNYNCSE=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_EI_ED_BAD_SIG1_FP[] = - "5AC3A538FEEFC6F9FCC5FA0CE64704396C30D62A"; -static const char EX_EI_ED_BAD_SIG1_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMvb6SuoIkPfBkJgQuo5aQDepAs1kEETZ9VXotMlhB0JJikrqBrAAz+7\n" - "rjIJ4JsBaeQuN0Z5ksXk2ebxtef7oMIUs37NfekLQHbNR0VsXkFXPEGmOAqpZjW0\n" - "P524eHqybWYZTckvZtUvKI3xYGD6kEEkz4qmV6dcExU1OiAYO9jrAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; -static const char EX_EI_ED_BAD_SIG2[] = - "extra-info coward 7F1D4DD477E340C6D6B389FAC26EDC746113082F\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf56AZkSDiFZ1QaiLJhcKdFDE5Kei/sPaPEIEoPMGP4BvOVXAQAgBAAlRLzx\n" - "U029tgIL9BRe47MVgcPJGy48db6ntzhjil7iOnWKT70z2LorUD5CZoLJs72TjB6r\n" - "8+HYNyFLEM6dvytWZf9NA5gLdhogbFcUk/R3gbNepmCF7XoZjbhPIp8zOwg=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 20:07:00\n" - "router-sig-ed25519 yfV+GySMIP1fw1oVa1C1de4XOWBqT4pUtEmSHq1h+WrLBNCh3/HZWvNC/denf2YVntuQrMLCJEv5ZaFKU+AIDQ\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "g+BWq69i9CP19va2cYMAXCQ6jK3IG0VmNYspjjUFgmFpJKGG6bHeOkuy1GXp47fG\n" - "LzZ3OPfJLptxU5AOQDUUYf25hu9uSl6gyknCzsszFs5n6ticuNejvcpzw6UfO1LP\n" - "5u+mGJlgpcMtmSraImDZrRipmZ3oRWvEULltlvzGQcQ=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_EI_ED_BAD_SIG2_FP[] = - "7F1D4DD477E340C6D6B389FAC26EDC746113082F"; -static const char EX_EI_ED_BAD_SIG2_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALzOyfCEUZnvCyhlyMctPkdXg/XRE3Cr6QgyzdKf5kQbUiu2n0FgSHOX\n" - "iP5gfq8sO9eVeTPZtjE7/+KiR8aQJECy+eoye+lpsfm3tXpLxnpOIgL4DlURxlo/\n" - "rfCyv30SYBN9j62qgU9m6U2ydI0tH7/9Ep8yIY/QL8me8VAjLbf/AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; - -static const char EX_EI_ED_MISPLACED_CERT[] = - "extra-info msselene 3B788BD0CE348BC5CED48313307C78175EB6D0F3\n" - "published 2014-10-05 20:07:00\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AWBcqjzLESDuLNGsqQ/tHn32XueXwj2fDlgEy/kQNVf/AQAgBAAFOegg\n" - "XY1LR82xE9ohAYJxYpwJJw0YfXsBhGHqfakEoBtSgFJ3cQAUXZQX4lX6G8IxAlQB\n" - "7Rj7dPQuQRUmqD1yyKb/ScBgCa8esxlhNlATz47kRNR38A3TcoJ4c1Zv6AE=\n" - "-----END ED25519 CERT-----\n" - "router-sig-ed25519 Q52JKH9/iMsr1jIPlWHHxakSBvyqjT1gzL944vad4OhzCZuNuAYGWyWSGzTb1DVmBqqbAUq73TiZKAz77YLNCQ\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "YplvAIwExGf5/L8AoroVQXtGm+26EffrxKBArMKn0zS1NOOie1p0oF/+qJg+rNWU\n" - "6cv3Anf188EXGlkUOddavgVH8CQbvve2nHSfIAPxjgEX9QNXbM5CiaMwgpCewXnF\n" - "UoNBVo5tydeLHVns15MBg/JNIxUQMd6svMoPp2WqmaE=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_EI_ED_MISPLACED_CERT_FP[] = - "3B788BD0CE348BC5CED48313307C78175EB6D0F3"; -static const char EX_EI_ED_MISPLACED_CERT_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALTwNqhTprg1oC6bEbDqwIYBoER6prqUXQFbwbFDn+ekXhZj8vltgGwp\n" - "aDGl9ceZWDKfi+reR6rZXjAJGctmv0VHkfe7maUX4FC/d2T8N8DvS+3IvJzFMpbT\n" - "O0fFrDTrCSnPikqFfQWnlP8yoF5vO7wo0jRRY432fLRXg9WqVzdrAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; -static const char EX_EI_ED_MISPLACED_SIG[] = - "extra-info grazie 384E40A5DEED4AB1D8A74F1FCBDB18B7C24A8284\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AcGuIBoa6TBqD8Gg5atcwp/+r9ThxIBkULmPv9OSGhv+AQAgBACXH13y\n" - "mUvdpcN6oRN1nX6mnH40LyfYR5um8xogJZk3oINse5cRNrfMgVWiBpDlJZAwlDDa\n" - "lx99hzuZBong+CiOcnEvLMsBaVJmNTm5mpdetYclZpl0g8QEXznXXeRBMgM=\n" - "-----END ED25519 CERT-----\n" - "router-sig-ed25519 TxuO86dQ3pUaIY2raQ3hoDBmh4TTPC0OVgY98T5cf6Y+sHyiELCkkKQ3lqqXCjqnbTLr1/4riH980JoWPpR+Dw\n" - "published 2014-10-05 20:07:00\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "kV2CtArl1VF1nUSyHL00mO3nEdNxlQU5N7/hZNTd+45lej5Veb+6vb4ujelsFERJ\n" - "YoxwIs6SuKAR4orQytCL0e+GgZsrg8zGTveEtMX/+u//OcCwQBYEevR5duBZjVw/\n" - "yzpEHwdIdB2PPyDBLkf1VKnP7uDj059tXiQRWl7LXgE=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_EI_ED_MISPLACED_SIG_FP[] = - "384E40A5DEED4AB1D8A74F1FCBDB18B7C24A8284"; -static const char EX_EI_ED_MISPLACED_SIG_KEY[] = - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAK0HgOCG/6433VCrwz/vhk3cKmyOfenCp0GZ4DIUwPWt4DeyP4nTbN6T\n" - "1HJ1H8+hXC9bMuI4m43IWrzgLycQ9UaskUn372ZjHP9InPqHMJU6GQ7vZUe9Tgza\n" - "qnBdRPoxnrZzUOzlvatGrePt0hDiOZaMtDAkeEojFp9Wp2ZN7+tZAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - ; - diff --git a/src/tor/src/test/failing_routerdescs.inc b/src/tor/src/test/failing_routerdescs.inc deleted file mode 100644 index e2b72c58a..000000000 --- a/src/tor/src/test/failing_routerdescs.inc +++ /dev/null @@ -1,1569 +0,0 @@ -/* This one actually succeeds */ -static const char EX_RI_MINIMAL[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" - "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" - "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" - "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" - "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" - "fkIprv9UXqkv5iY+pXSYSI12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" - "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" - "-----END SIGNATURE-----\n"; - -/* So does this, and it's bigger. */ -static const char EX_RI_MAXIMAL[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANNI56H+b7SW5LMzvXyY5NJzXszsHZZ4O1CPm4CePhBsAz1r0s1JYJ1F\n" - "Anrc0mEcLtmj0c5+HnhPBNrfpjO6G94Wp3NZMVykHDhfNVDBRyFZMroG8/GlysYB\n" - "MQPGQYR0xBgiuclNHoyk/vygQhZekumamu2O86EIPcfg9LhGIgEbAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALvuNVSmg6R9USFbQcNbRjMCJAV0Rwdv0DlS6Rl02ibJgb01G7v391xE\n" - "d9Njzgf93n8gOrE195bkUbvS6k/DM3HFGgArq6q9AZ2LTbu3KbAYy1YPsSIh07kB\n" - "/8kkvRRGx37X9WGZU3j5VUEuzqI//xDE9lbanlnnFXpnb6ymehDJAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject 127.0.0.1:*\n" - "accept *:80\n" - "reject *:*\n" - "ipv6-policy accept 80,100,101\n" - "ntor-onion-key s7rSohmz9SXn8WWh1EefTHIsWePthsEntQi0WL+ScVw\n" - "uptime 1000\n" - "hibernating 0\n" - "unrecognized-keywords are just dandy in this format\n" - "platform Tor 0.2.4.23 on a Banana PC Jr 6000 Series\n" - "contact O.W.Jones\n" - "fingerprint CC43 DC8E 8C9E 3E6D 59CD 0399 2491 0C8C E1E4 50D2\n" - "read-history 900 1,2,3,4\n" - "write-history 900 1,2,3,4\n" - "extra-info-digest AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" - "hidden-service-dir\n" - "allow-single-hop-exits\n" - "family $AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA $BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" - "caches-extra-info\n" - "or-address [::1:2:3:4]:9999\n" - "or-address 127.0.0.99:10000\n" - "opt fred is a fine router\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "x5cxL2h2UsEKk2OVnCTxOF8a89HAe/HwQnSlrBy8+l0YdVCcePDJhm1WyWU7ToHZ\n" - "K8auwreuw+u/n14sQHPYrM9NQE689hP4LC9AYOnrCnMHysfVqKuou+DSKYYRgs0D\n" - "ySCmJ9p+xekfmms+JBmS5o5DVo48VGlG0VksegoB264=\n" - "-----END SIGNATURE-----\n" - ; - -/* I've messed with 12 bits of the signature on this one */ -static const char EX_RI_BAD_SIG1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" - "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" - "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" - "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" - "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" - "fkIprv9UXqkv5iY+pXSYXX12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" - "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" - "-----END SIGNATURE-----\n"; - -/* This is a good signature of the wrong data: I changed 'published' */ -static const char EX_RI_BAD_SIG2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAObzT4opT9uaThByupbb96tYxVpGxzL9CRPKUcU0beGpHyognD9USHWc\n" - "SpSpKfBL5P3xr2i/XTs34M4UTbT9PE7bVyxv7RD/BZmI4gc8R3PMU77xxbpEU5bK\n" - "LF3QUPpuB88m/2fXUGgMNVDc5MIq6pod2NRoDpeU7WA8T3ewXzK5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM1QKsQiup9DNMCgNeE2FkAhCWzpMZKCn1nNlZbDGfE3Z22ex6bdWWY6\n" - "ocEZ3JZDsZsnaZrdYxrL3Mquq7MbHdfx90EdlOvDRP1SAIbZ55mLR77fZTu4BKd/\n" - "h9BC6I26uZE0QavFq3+BhoVVhVn5Mqv05nR9CeUMSSZLxw/RJm4DAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:01\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Ft/y3JXowjItgfTHwYcZzuUgXrskluoINW5sr+GQoNYE2F4sT8o0tBBJwqJ6FwKd\n" - "fkIprv9UXqkv5iY+pXSYSI12mY1K5GMNkXiObk46NjuoNNP9l8oidhO6eNfcE+k3\n" - "CRIYS4FbBaD0fWUSwgMuo0Bp83/Wzp3B9ytEBh0/624=\n" - "-----END SIGNATURE-----\n"; - -/* This one will fail while tokenizing the first line. */ -static const char EX_RI_BAD_TOKENS[] = - "router bob\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANGCgvZc+JRtAzuzk3gBD2rH9SHrXzjJ1wqdU3tLKr7FamKCMI2pLwSA\n" - "FZUpTuSqB9wJ/iVcYws+/kA3FjLqgPtzJFI0SVLvQcz5oIC1rEWpuP6t88duMlO9\n" - "flOUzmYu29sBffrXkQr8pesYvakyXArOJVeRR7fSvouneV5aDYWrAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAML+pYZoYc+whKLijupd63xn0gzlEQqe7k07x/lWMqWFT37FfG6YeNr5\n" - "fpFoo77FDfuFaL+VfPfI8i88g157hcPKBVX6OyRH54+l5By0tN91S0H+abXjXQpv\n" - "U/Bvmul+5QpUeVJa1nPg71HRIauoDnBNexUQ7Xf/Bwb2xCt+IJ6DAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "tbxtYYzyVqi6w6jz1k8NPjFvZaSNR0WzixVTTvKKGoMPx/6+Z8QAFK1ILzRUVucB\n" - "nRhmZMFaPr3vREMErLRE47ODAzwoBCE9C+vYFvROhgfzuQ3cYXla+4sMaRXYZzjH\n" - "PQ82bTwvSbHsR8fTTgePD/Ac082WxXTGpx6HOLBfNsQ=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_BAD_PUBLISHED[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMoipSwZgTG6SpSOm6ENbyALS1Ljqqa1LSGmtHSRfGYgUQGWZXERXKQj\n" - "P5ql6o7EbGr1wnispGW/KB8Age09jGDvd/oGhQ9TDFluhLZon3obkZSFw7f9iA7Q\n" - "s29rNxoeXXLZVyS7+sux70b8x2Dt4CeG8GA8nQLljy1euwU+qYYJAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPzfzQ+2WFMUvnB3z0xD+zwczWcFyYYNW8Lj7/aRGSNN2DICp5uzSjKq\n" - "qkYQ+C8jG21+MR2PE+ZBmq6CL5mvlFKlWKouXUlN7BejwWf2gw0UYag0SYctae1b\n" - "bu8NuUEvdeGWg5Odgs+abH7U9S0hEtjKrmE5vvJS5L841IcaPLCFAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 99:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "G92pnwCIXGJ9Q0fI9y4m/fHpWCsD0Hnk81/6T4TmRH3jt77fc0uRdomUOC5id4kz\n" - "J2M4vqXwRs5OK+eaPbtxf8Yv6FPmB3OBNCIhwNHIIqzKQStHUhPxD3P6j8uJFwot\n" - "/CNGciDN+owZ2DzwrXpszDfzcyp/nmwhApbi3W601vY=\n" - "-----END SIGNATURE-----\n" - ; - -/* Bandwidth field isn't an integer. */ -static const char EX_RI_BAD_BANDWIDTH[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAN32LAvXQaq0p554FcL4LVwnxyiZvscfuFnfpXwWTDRJJHd2+JCttWIx\n" - "v+eW7dNq+rq/tzSzaZwnp8b4V2skLRojSt6UUHD234eZcsPwUNhSr0y1eMuoZbnV\n" - "UBBPevpuXea85aSFEXXRlIpQfvFc43y3/UFoRzo5iMPqReo2uQ4BAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMBuF1GvOyVcRDNjzlEmGHJkTA7qkaWgTp33NSY/DPEJoahg0Qswuh2w\n" - "1YCBqem6Txp+/Vl9hoUoUGwb7Vwq0+YDMSyr0z3Ih2NcNjOMZPVtjJuv+3wXrQC8\n" - "LPpCpfU9m9QvhQ7f9zprEqUHOQTT0v5j2a5bpfd++6LFxrMUNwbfAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth hello world today\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "svABTGDNJOgaiPLqDlkRU6ldYJcoEe2qHlr4O30lVM2hS3Gg6o4QARL7QRt7VepT\n" - "SruR6pE83xOr7/5Ijq5PlamS4WtODMJSH3DXT2hM5dYYrEX5jsJNZTQ+cYwPQI3y\n" - "ykuvQIutH6ipz5MYc9n0GWAzDjLq1G8wlcEfFXQLD10=\n" - "-----END SIGNATURE-----\n" - ; - -/* Onion key is actually a signature. */ -static const char EX_RI_BAD_ONIONKEY1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANByIdFOKA3r2nnWyLjdZE8oGHqJE62T1zjW/nsCzCJQ8/kBMRYeGDu4\n" - "SeUJJ2rsh2t3PNzkqJM14f4DKmc2q76STsOW0Zcj70Bjhxb9r/OfyELVsi+x3CsE\n" - "Zo/W4JtdlVFjqevhODJdyFNLKOvqwG7sZo/K++Hx01Iu0zXLeg8nAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "svABTGDNJOgaiPLqDlkRU6ldYJcoEe2qHlr4O30lVM2hS3Gg6o4QARL7QRt7VepT\n" - "SruR6pE83xOr7/5Ijq5PlamS4WtODMJSH3DXT2hM5dYYrEX5jsJNZTQ+cYwPQI3y\n" - "ykuvQIutH6ipz5MYc9n0GWAzDjLq1G8wlcEfFXQLD10=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Cc/Y22KFvxXPXZtjvGIyQdjm4EMhXVXJEBwt8PvK7qlO1AgiVjEBPkUrTQQ/paLQ\n" - "lmeCN6jEVcZ8lNiVZgzRQ/2mTO3xLBPj26UNSDuouUwZ01tZ4wPENylNYnLKv5hg\n" - "gYARg/nXEJiTVe9LHl99Hr9EWWruRG2wFQjjTILaWzI=\n" - "-----END SIGNATURE-----\n" - ; - -/* Onion key has exponent 3 */ -static const char EX_RI_BAD_ONIONKEY2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKP1kWHsH/BZhNSZmn0FyzIrAHtMl1IVPzc7ABbx+kK+IIEMD9k1fy2h\n" - "AP2JTm2UmJDUwutVxPsxmndI+9QsRDpu33E5Ai4U1Rb6Qu+2BRj43YAyg414caIu\n" - "J5LLn6bOzt7gtz0+q69WHbnwgI4zUgUbwYpwoB7k0dRY97xip9fHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGHAoGBANBKlyoqApWzG7UzmXcxhXM4T370FbN1edPbw4WAczBDXJslXCU9Xk1r\n" - "fKfoi/+WiTGvH7RcZWPm7wnThq2u2EAO/IPPcLE9cshLBkK28EvDg5K/WsYedbY9\n" - "1Gou+7ZSwMEPv2b13c7eWnSW1YvFa64pVDKu2sKnIjX6Bm0HZGbXAgED\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "cYcBOlapA+R4xq3nn5CjpnzNXdDArMlHuXv4MairjleF1n755ecH8A/R8YIc2ioV\n" - "n/C1TACzFVQ12Q9P3iikVOjIXNxYzaz4Lm/L/Lq4sEOPRJC38QEXeIHEaeM51lE6\n" - "p6kCqXcGu/51p5vAFCSiXI1ciucmx93N+TH1yGKRLV0=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_BAD_PORTS[] = - "router fred 127.0.0.1 900001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANVi/MVWhzT5uo3Jxw4ElS7UGmA24dnckdkCLetMhZOcE9e9mg4WcImL\n" - "NuBe2L/9YaL4PFVchCGlq73phKG6yFdqJdjDV8Qh9MJdAYWW2ORrjRvCrspPaYPN\n" - "BGJrkD2Gd4u3sq7f26TIkzmBx0Acd/FD4PQf8+XOt9YYd36ooS4vAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALtP4cIpAYp9nqo1ak4SxALcndFw4o51U36R4oa+uJS/lYQPHkMMOj6K\n" - "+AVnj9sxkDJ1POaU5lsCQ5JPG1t+Tkh7vDlJb6RCUy25vJOuaQCb9GVVY7KQTJqA\n" - "E0fU73JdKACNjMlbF36aliQhrG4Fq2Uv+y7yp8qsRxQ8jvzEMES/AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "xzu2T+pMZtdsS5q1cwXM2hMIH2c8mpAV31G2hKIuiQRwtPD1ne4iJsnoVCXhFakd\n" - "QTq7eTXM174fGWyIT93wvQx/Uqnp29dGZp/VaNOsxHFdYVB4VIVqkBh757h+PSJ+\n" - "VNV5JUm4XQ1QbmniJGdTQp4PLBM++fOXMR3ZNd6rt4o=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_NEG_BANDWIDTH[] = - "router fred 100.127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMCG/ZCXNCF02uXRSCP7qWBN75jDMQZ363ubnQWhF9KDDNWWiwj3UiZR\n" - "zqsM4zKRgjtarWZvp2qxKABFAODd+j9iq5DvUGRbbXv+aR8TT/ifMtwwxHZQBk1F\n" - "1hbsLdwWzGIiyz5k2MVhXnt6JTlklH2hgT++gt9YTHYKxkssaq5TAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM3vk/4kOTB1VXrve29JeHOzNUsPwKruBcjxJf+aatxjf6KO2/RW41bM\n" - "gRYq9V7VAYeZTsbS727fy03F5rk3QIBhMJxm9FHatQ6rT/iEDD4Q1UZQsNtm+OLf\n" - "/TkZZhgfB3MiDQ4ld/+GKd7qww8HXTE+m/g1rXNyZPKozn8K7YUHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 -1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "bUBBZYZWqCbsH4/7fNXtC/HgIZNGOfDF9v4d9YfKaDs5xDYf2o67hRcwx5imhrgC\n" - "IU7n9AI4AGxkFoN6g3Y/t4pqebxdkF678rRDCtrlwwreAiUktgrwnetp9Tpo16xj\n" - "V7Uf6LcqQdvu78lRh1dsrY78sf7sb90vusFMPLXGUKM=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_IP[] = - "router fred 100.127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMtMrM24AJpJCevxnseIpRlSuAIMksfkfky2+noe7Rok8xn6AMQzMrwx\n" - "AiCJ8Jy4DBzIKUiJK4/y1FimyM08qZGR0xeqblCxZ1lbSiXv6OYxoaD2xmWw8zEP\n" - "Zgu4jKReHh+gan1D+XpAbFNY0KrANhjRo96ZZ3AQsZQcWBiPKCynAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOPclmBO/amw1RWTSI1y80qY/EPjc0I+sk9HKr0BQOovxqJ0lmy9Gaue\n" - "y+MOejQ9H2hNev0nd7z1fPxEogt7SCe22qJHHX3xDf+D9RpKsvVzDYZsk7hVL7T1\n" - "mwHzuiV/dtRa7yAMp7+q0vTUGesU2PYFYMOyPvz5skNLSWrXOm05AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "g6besL/zxOp0N6Q5/7QZgai2kmCU5EAWJlvZrf5jyrjKhsv2a4LDkap07m9QRFqW\n" - "GGe7g5iiABIqnl0kzv7NLX7ah+d/xxv+IILXyZfVTxSw0e+zFb3uPlQ7f9JsGJ8i\n" - "a+w8wyyDBpOAmi8Ny866Cnp9ojVzCyIErUYHFaPvKao=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_BAD_DIRPORT[] = - "router fred 127.0.0.1 9001 0 bob\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANKcD6DJ16X3yvdq05jatdwgjO+hyoIpckW9sV/OkdfIZwf+S6Q4pZGC\n" - "doMw5XeOM52gjpx42kUp6M2WlTGDFEpaNU0VyeZYG/M1CM1xvfj3+1PoebioAGdf\n" - "GuhNBCHZdaYNiOGnh9t2GgUomgpE6njdS/lovSrDeTL469hfcUghAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANWeGHig5wE9UijaNnEW5au3B3hZKSlzCi+T6MYDPbbYhm8qJaVoXUXF\n" - "EP1EUgzDcX3dPEo9upUA1+91GkjGQCo9eOYlqGib8kHIwKnHZK+hernBc/DnOeUp\n" - "Wyk9SW5s+fi12OQhr3NGjbSn76FMY9XU3Qt7m3EviTwWpI3Jr5eRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "t77wEoLjyfMf9LKgBfjveosgwvJ8Go0nb27Ae3Ng9tGtR4qaJQfmwZ5fOOuVU9QC\n" - "3s8ww3aY91KD3NTcN3v3FKngxWtRM8AIfwh4pqT3zW6OSP4+nO3xml7ql0Zf6wfj\n" - "TPFV2941O3yplAsmBJ41sRSWizF04wTtZAIgzY7dMLA=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_NAME2[] = - "router verylongnamethatnevereverendsandgoesontoolong 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL0mcUxg7GJ6oxgciLiBCbo+NuZ/OVKRrERCSM6j6iHERcB9+ciSRgQ5\n" - "H6o6FUX2LoRmHYzBk1x7kIjHa9kx9g6CAbBamdZrQbdVnc1y2NrdHB/jvwLj3C48\n" - "PgzFIrLg9OlkuoWck/E+YpPllONfF65e0+ualgVjPgpQpXwmz+ktAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOgHvvTAxyjJtHx9W2X7aOI05H9sYDDY+sxhovT/8EpAHrioex54tsMT\n" - "ifgtoXTjGIBEOTDi/1ry39nEW5WPbowqvyzRfR2M43pc96WV7e1nhmD/JrnTYgtR\n" - "5/15KxcMJxoDhod7WZ/wlXBnHc2VevX8JTaeOe9KYORCj5iNbtVZAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "j/nFT5gyj20cLHWv94O1jmnqy3n6qkO8Av0OdvvfNeXsMK2UHxk84vzFvEwpUF/Y\n" - "i+VR3LXY4CjTpuliMtjt7BQGtmJSvB8W0CeIUenIGzfwDxW9dG2o7spDldKDB/OU\n" - "C1wyHvKaA6Yss/02RIDa4AxyjsfbgdJ91qK+aAnYAtA=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_BANDWIDTH2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALQDCm9VEopiYILmt4X9kP6DQazfgKnLXv+6rHbc4qtmvQQD3TVYbxMP\n" - "F4sEUaz+YHAPnomfDVW3a0YFRYXwDzUm1n47YYCyhUzEaD2f69Mcl/gLpKdg+QOy\n" - "boGB1oD4CStWL3y05KhxxTNiTrg+veMzXTqNwryCYm+GoihIAM9fAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALYHwdx6bmYy09AW5ElN/DWh0fHh3mBK97ryiIMi8FImYfzbw2BR6xuT\n" - "aQT5omqS3PNJJcNWZt5gOyDtA9kLh03cch7t1PenXSYJshbME2bDrZDJKVJMN6vV\n" - "B1v/9HjXsVF50jBzZsJo3j26XCPT5s6u9wqUFWW09QR3E/1HInHVAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 -1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "p09ijyuvcW+WKRj4mJA/nkLCvZkRcMzykAWheJi1IHCoqhXFdkFLiIRqjaeDVHRr\n" - "zBtD+YCQiGvFcaQJ9IUhh7IleHcyyljmDYlvuBAxWiKvVZstJac0kclCU4W+g8yK\n" - "0Qug3PmGKk115x2TllHaCZqMo5OkK4I/WAsKp+DnJ1A=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_UPTIME[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMM0Nubr1VXQ/FcgIQTFxZpZDlAEh2XN8FoJ8d+X5S46VDGijmMoYmyN\n" - "oLXqMTGmOaR0RGZOeGLgDzeY8tLrfF821IjfkXeAANZibUjdsHwqHO3wlWD2v+GN\n" - "0GBocWXEdAp/os229mQQKgYAATJ0Ib3jKhBdtgm5R444u8VX5XnbAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMpyOr4kEtSTZw4H9eSkH2+WmwIlO4VBpY2HkPS00l6L5fM2REjt50Xi\n" - "lsNOz8Q6mAn5cMYmsGlv61kg01mCvYc7Z715jGh+1hhVAxMaNS3ED/nSPnslyjhq\n" - "BUm51LhYNHD4ktISIqPMurx6aC8B68UYgKzLgCYNzkathFXSBpjRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "uptime forever-and-a-day\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "NHYeiQOu0nZdrhSy31Xz4F0T6OTU23hPQDzoLax1/zq6iTVrz9xi3HGm7HhOMW1j\n" - "YgFGK3+Xm4iJL+DwriunsAIuL5axr3z2hlmFDQHYItP//KyPpOqSrfEOhwcuj/PE\n" - "VbWsiVYwz9VJLO8SfHoBeHI6PsjQRQFt2REBKZhYdxA=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_BAD_BANDWIDTH3[] = - "router lucy 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAO6HrITQTEjV/v/rInQ2REmCFZa4dZg8zIh6+B51U/I6hDiZaKGwpNey\n" - "9OfjoRqT2DwyLEe3ORm9A2RAz2twLBixrpt5IvC0sbGustmW964BHW7k9VvRupwl\n" - "ovujHpLIj5dkLxD15jGXHoTp1yHUVk9NkMGN+ahg6y+QhTbIrWbRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOEpciJFXauEqs31GMTUTzu6edBj9WtV+sIflhGKvU1KKRfwCgOcuKMx\n" - "QiLHHD9AjhMAFGT/qtNbPFkzfYxHKLHw+NLJsxmNtdkYM26FX3ButPiX+69sq9fI\n" - "PCHqQy6z/A7hHwtEk6niWgK2PLhAZCg9duAv+mqFVXe2QEBjax/lAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 electric\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Jk0Xk1RMJSjEflNRcp4qznaHKcfe2r0kOc7TdLAnM8zyNDVj6+Bn8HWmyp/oFmf6\n" - "xtWKKgkKxriAVIJgqZMchPbr9RuZS+i+cad++FCwpTVkyBP920XWC47jA3ZXSBee\n" - "HK6FaoK5LfmUm8XEU9BVhiwISXaUfTdkR8HfzugFbWk=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_NTOR_KEY[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKYDCSr0Jh9d/mJKjnGYAHKNBcxR3EJk6GGLwKUrRpN8z/aHRxdWlZF2\n" - "lBml6yQNK/VPftcvOekxrKq3/dISrIFBzFYj6XHNtg31d09UgitVkk0VfRarZiGu\n" - "O6Yv55GSJ9a3AZDE4YmIp5eBjVuChyVkeDFYKVn0ed4sj9gg35rjAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALXdUQuq1pYHyYP0qU6Ik+oOmwl0eOsuwiLWf9Vd+dsgEszICX4DRWPx\n" - "syDxfxyA/g9FEPvlI7Nglx6cKe2MT0AutSRLbbML4smfuRZNIF35Cnfu5qTGVVzL\n" - "GWVSA2Ip7p+9S9xLhLBdc6qmrxEXCPL6anEhCR4f8AeybXAsz2JLAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "ntor-onion-key s7rSohmz9SXn8WWh1EefTHIsWePthsEntQi0WL+ScVfjdklsdfjkf\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Yf9axWyzPudnRvQstNdbtBYo7pGpUEIdECMGcJtFb6v/00pxk4Tt3RiOKa84cOBV\n" - "7V9NjOLdqlx88pGz0DNCJKqToIrwjZDeQ8Q1yi9XClLDkC32fQRX4y6vNBZ3LXLe\n" - "ayVrdRrb41/DP+E7FP4RNPA5czujTfs8xLBMbGew8AA=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_FINGERPRINT[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM0wDWF2dBLzsmoIDHRugzosCSR9TSvEE0TkvKu6+agfogGtkQJwQ5zO\n" - "sGzZbRR+okO7d+QCED2i3rUs1iikoMUT+pwgvOm8Bxg9R64GK7fl9K5WuAiG11Uj\n" - "DQAfSx5Fo30+rhOhe16c9CT7xJhj//ZKDbXUW7BrJI8zpuOnvgD5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKACg1nWM/WjpUiGwlLQsY3Tq1h0RTz/HmOMx/6rTRxS5HLz0KnLg5zV\n" - "dvmfhxqQVKBkt1N2+y+qO7x71oFzIsFMfHYWSxOCEo8Nkff1BqAPqxxUHvM0HwJo\n" - "d7lswJ/UT1j4+WZNZ4sFIujsIW2/zZqKlxG9xaw0GXJ082Cj9XkPAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "fingerprint 5555\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "mlqyJ/ZGBINKwSNEi7GpNBCMqIVbL0pGAOBYHJF1GbRlU28uRyNyeELIxIK5ZIet\n" - "ZzKr7KPvlBxlyolScPhTJfP98TFSubrwYz7NnQv0vLI0bD0OyoBf/9/1GYlzgTso\n" - "3mKfnV7THUalpxe9EjQ/x61Yqf26Co0+jYpt8/Ck6tg=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_MISMATCHED_FINGERPRINT[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANUAvwbpGbsAyA+mBwjFkvurtRzdw9btDqNKtPImufIE+q+AFTaCnwPr\n" - "kA7vm/O6h6OhgfdYEC2GfYJfwPGM7MDuz+NnuKxUb3qb2DQN2laqow6qWs9La/if\n" - "oHKUjC5mNeAgHcbWapx9CygwaFeVW6FBPl6Db6GIRAlywPSX+XMJAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANlSGd+Vm9nLiUk6zgu8dPnSFfw4F0R2GYfmzncIGJWtRFTF9ThW/0av\n" - "/9vZAWyVBjjtnpAP5R1BzdJYV2RwimC/6tqoHtkSbCBhdq5Cb/EHG7Xgb8KwNWVJ\n" - "NV1EESDwvWnRfSPGTreRw9+2LkdXri17FhDo2GjRxAq/N7YkLK5hAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "fingerprint CC43 DC8E 8C9E 3E6D 59CD 0399 2491 0C8C E1E4 50D2\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Y8MwYBeEfMhoAABK/FgpVRYolZ7jQ2BJL+8Lb6i4yAuk+HeVmPKTX7MqQoekUuin\n" - "/HdPKP+g/9HPMS5pCiW4FMwnXAF0ZocPXF0ndmsTuh0/7VWVOUGgvBpPbIW6guvt\n" - "sLLQ3Cq9a4Kwmd+koatfLB6xSZjhXmOn7nRy7gOdwJ8=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_HAS_ACCEPT6[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAJfPJNA3zZ77v2nlX2j5dXImcB/NhRtkG8XQgF7z+3H17sqoXgBgZ1dq\n" - "IbyJmAy2Lrvk/8VkXNFrT5/ErThn1B98V/PsJOOW1x7jGcix6X4zDYn/MvwC+AxA\n" - "zNP0ozNcVZ6BzVYq8w4I1V4O3Cd6VJesxRVX6mUeSeNawOb7fBY7AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKBzfB4mDEJjFTnmtqZxDG8G1yAiccVgAtq9ECEREL/BOQyukixUBeBe\n" - "j/FgXzbMJ7DZAuopuJZU2ma6h14G63fZs7eNFceDtmdLpuCOsFuvJ5Mlkf3hDZ1u\n" - "1KK5q+tiG7MKxgnGrqjPBUO2uubs2Cpx0HmsqBNUalXd/KAkFJbXAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "accept6 *:80\n" - "reject6 *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Dp9dLgs9s5beMPxfD0m96as9gNBvlmKhH1RQ/kcOKscia4R8Q42CnUtIqLkCdjOu\n" - "zErc2Vj9QzjKOvlqUqHxP+J+l+ZJez6F+E1tcmK/Ydz3exL8cg9f4sAOCSXcpBey\n" - "llTFDibz6GkQ2j3/Uc4bN/uLzoyZKunpJbSKZP5nt8Q=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_NO_EXIT_POLICY[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAK4fbjTKYqv2fygfjzY53sVTdtbNMjq293/uffKKxFYnOVvPzrHlP6Go\n" - "2S19ZcyDxOuH1unbBChPnV0GpxXX6+bgfDkaFh7+jef0RQ3fpJl84hSvdM8J8SCt\n" - "Q/F4Oqk3NeKKs+zAHDjhAU1G4LkF9/SZ9WZVXlH4a4pf7xgQtaShAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKahvyDkmh33ob/bLVO1icgz2ntOZN6ZQUfgpMU4Cd6DQtOEwFUGhbVt\n" - "gvtMHv2+VbxM31ZfUsyBqJ1rJBLpOqlPvSoYwSac2+twa+w/qjfGqcJYhBjP9TV9\n" - "n9y8DzBX85p6vRcCzcuZ4qUJ2nRzdLHwjdgzeLmmCHuPO2dQxQhXAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "ntgCtMC0VrsY42dKts8igGQ2Nu1BpuzUltisIsJz75dDx2LCqTn7p4VpWbTrj1sH\n" - "MRNOvEPFxVMs0Lu50ZUGRzeV6GrHmzIRnOIWanb3I/jyrJLM0jTIjCOLwdMRA298\n" - "tw8Y9Hnwj4K7K6VvgU8LP4l7MAJNfR6UT46AJ6vkgL0=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_IPV6_EXIT_POLICY[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKHJKLHqjYoW9M+1q0CGHJRT5u2CnZWb8Qr1DpLkkusQ6ru+cDAG12so\n" - "IpDQh7IyB2JosVJi9ogekYxJ3O1p5WlFUi0X19DMoer9FJ9J7/3s4enGJ/yMBeuu\n" - "jLVRkjMJhsfhj3Cykon+8Rrf520wSmBg1dpJQCXTwtb7DARgYRpZAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPJH61Ir6XSu9/Q9tXGaINbXO1GWQQUXtwh6TX9lxnaCNDLGnxiY+ZZw\n" - "+Vqj3LAQoMrz1PpPsF5e0VIxok10Vc8y4cWC+kIitcecut4vWC5FYTtVVP9wtlyg\n" - "YCcVOVhtFQxtLiGqprl84+EVxrR7RQVCMLNDUXIgxAfdnS24eBPDAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "ipv6-policy kfdslfdfj sdjfk sdfjsdf\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "XWorzVT5Owg+QcsBtksiUNtpQQ5+IdvbsN+0O9FbFtGZeaeBAbPJ3Poz+KFCUjZY\n" - "DeDAiu1cVgODx2St+99LpwEuIBx78HaD8RYU8tHx8LoA+mGC43ogQQS9lmfxzvP5\n" - "eT5WXhkOS5AZ8LZOCOmT+tj/LkSXev2x/NC9+Vc1HPo=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_FAMILY[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM62QoRxSPnm+ZM4fv9p03Qqbz5SzhXYSNjKWqylBruaofTw6oIM8DtX\n" - "7QnrEe/ou/WtfB+swV/2rt/r0EzmeWBWuDmuSUrN5TC2AdOi9brSJMgXVW6VW77X\n" - "fuIlLd5DVSId2zs3cKLDqp36CUsooA9sS6I5HrvW9QDf3VS3pGBtAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANg1trpnRzkCi4t4Z4qnBKF612H5A3Zrjg7Jo2b3ajUnON/KEuLPTc3t\n" - "PPN0W4qqeCMmVQEuxf3DRbTPS20ycy4B/JDWYfxCNwuj5YAx04REf7T0Hlx7Aee/\n" - "sHEQBhIBfasA2idhTh3cAm4DMYn+00BqjxF6jmyRA0hyntEABabrAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "family aaaa,bbbb\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "xOgP3liKF/WEvwbbGzUUVRZ5WPrOI7jex8pZU/02UEnHjit7vCf9fsUcvkeo0xjz\n" - "n3FQHIO1iAJS7dEaEM4nz6wtPUb2iXSU9QajkGBkJ9/V7NHMFIU3FGfP47PIJJkd\n" - "nz5INoS+AsE7PmnDjUMm1H45TCCl8N8y4FO6TtN7p8I=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_BAD_EI_DIGEST[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAJ8Sn8AxBRbeIAHUvaKjqmcYOvXz7YFlpYFiVHp/cn+l+KUkIYTOFQXf\n" - "K8AtwjmJ4R2qJIbNlY/6oZGFbizt/B+WPuWsTj+8ACEEDlxx0ibg3EJRB8AZYiWv\n" - "0zC/loiUvHm6fXF5ghvDr9BQzEUo9kBk5haoHwROtGawr1+vOEiNAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMzok3ZJtLjXOC8RKltXI8xulwn/ctCvQFHImR0+ccA1uBxaZNYgiIcc\n" - "q8XngROfV8xEgDbYPiWiLXJOMSwOd7hfs3YzRWF+LKftYs8PuRyMJcCoBjOPZ4QX\n" - "HRfTetEvu2SijZMby+lkqpZg2nuF/ipsXUjrabRZdNiIGhC451vdAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "extra-info-digest not-a-digest\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "c/6zAxO04izQvqdM4bZVGE+ak0nna5pz9XZizFkieZEDWGzWQuVMhXyL5sbsFbsx\n" - "6Hn7DvNRYR/2nA0teDeRyIHMoMHi76te5X9OFDgaeUVCbyJ8h/KZYfPnN86IDbsR\n" - "dCSmj9kX55keu64ccCAH1CqwcN/UsbplXiJJVG5pTfI=\n" - "-----END SIGNATURE-----\n" - ; -static const char EX_RI_ZERO_ORPORT[] = - "router fred 127.0.0.1 0 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMc4MOhLG3PKPgc+xYVf4eScWzeOf8wq7Cb/JxZm50G0LuvVbhHtHEZX\n" - "VOSHI7mLE1ifakJvCFJRLobMU7lU0yhn18/nKl2Cu5NfFHHeF/NieUBSxBGb2wD6\n" - "aM1azheXrRqvDVVfbI0DLc/XfQC/YNiohOsQ/c9C6wuffA4+Sg85AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALBWdl9/Vft+NQKQlg5kgvZo+krnhNTRVQojWtUEzom4TFIT+NNKJyMG\n" - "reQXcNdzNptTB0aOBGGwqAesqzsZ2Hje699NsDe7hdl7Sb5yhKDqtdQY6yDXJUFt\n" - "zqpAUkmYMLe2p3kPiWefNso56KYXrZrlNAiIS/FhQ5cmuMC2jPydAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "gFg08P9A6QNQjURlebfdhU3DSV0BeM0j2SFza1jF9JcBOWDRmT8FvYFK1B3js6jK\n" - "8LNV8JOUssv14z5CnUY9CO1BD0xSl+vGlSS4VOXD7rxui8IoWgnqnZsitq+Qzs95\n" - "wgFKhHI/49NHyWHX5IMQpeicg0T7Qa6qwnUvspH62p8=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_MINIMAL_ED[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf5iAa+2yD5ryD5kXaWbpmzaTyuTjRfjMTFleDuFGkHe26wrAQAgBABFTAHm\n" - "hdZriC+6BRCCMYu48cYc9tUN1adfEROqSHZN3HHP4k/fYgncoxrS3OYDX1x8Ysm/\n" - "sqxAXBY4NhCMswWvuDYgtQpro9YaFohiorJkHjyLQXjUeZikCfDrlxyR8AM=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOsjlHgM/lPQgjJyfrq0y+cR+iipcAeS2HAU8CK9SATETOTZYrxoL5vH\n" - "1BNteT+JxAxpjva+j7r7XZV41xPDx7alVr8G3zQsjqkAt5NnleTfUREUbg0+OSMV\n" - "10gU+DgcZJTMehfGYJnuJsF4eQHio/ZTdJLaZML7qwq0iWg3sZfBAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAK9NjRY7GtAZnlxrAZlImChXmGzml0uk2KlCugvju+eIsjSA/zW3LuqW\n" - "wqp7Kh488Ak5nUFSlCaV9GjAexT134pynst8P0m/ofrejwlzl5DHd6sFbR33Fkzl\n" - "H48zic0QDY+8tKXI732dA4GveEwZDlxxy8sPcvUDaVyTsuZLHR4zAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key 71DgscFrk4i58O5GuTerI9g3JL0kz+6QaCstAllz9xw=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf5iAUVMAeaF1muIL7oFEIIxi7jxxhz21Q3Vp18RE6pIdk3cAH5ijeKqa+LM\n" - "T5Nb0I42Io4Z7BVjXG7sYVSxrospCOI4dqkl2ln3BKNuEFFT42xJwt+XGz3aMyK2\n" - "Cpp8w8I8nwU=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "lAZwD6YVic61NvJ0Iy62cSPuzJl5hJOFYNh9iSG/vn4/lVfnnCik+Gqi2v9pwItC\n" - "acwmutCSrMprmmFAW1dgzoU7GzUtdbxaGaOJdg8WwtO4JjFSzScTDB8R6sp0SCAI\n" - "PdbzAzJyiMqYcynyyCTiL77iwhUOBPzs2fXlivMtW2E=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 Oyo/eES+/wsgse1f+YSiJDGatBDaiB4fASf7vJ7GxFeD4OfLbB7OYa4hYNEo5NBssNt/PA55AQVSL8hvzBE3Cg\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "wdk26ZtS1H81IxcUThyirANLoszrnYYhOMP57YRAUDEzUr88X6yNDZ5S0tLl+FoT\n" - "9XlEVrpN7Z3k4N9WloWb0o/zVVidPMRVwt8YQakSgR8axzMQg6QhQ6zXTiYhiXa4\n" - "mawlwYFXsaVDSIIqYA2CudIyF3UBRZuTbw0CFZElMWc=\n" - "-----END SIGNATURE-----\n" - "\n" - ; - -static const char EX_RI_ED_MISSING_CROSSCERT[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AfsyyHhGluzfESzL4LP8AhFEm83+GkFoHbe1KnssVngHAQAgBABNzJRw\n" - "BLXT3QMlic0QZ4eG612wkfSRS4yzONIbATKLHIgyzgGiGl4gaSX0JTeHeGfIlu7P\n" - "5SKocZVNxm1mp55PG+tgBqHObDRJRSgbOyUbUgfOtcbQGUeVgUlFKWZ9FAY=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMqT7K8cEzWIaPNXbNgvoZ5ejavoszI2OjW9XXetPD/S2f+N7TfQXHBW\n" - "bnjpgj87gmk59w0OXTMCv+XofZ0xOy2YR/jG5l1VJIvqgJhhFJ8oSEGVzy+97Ekn\n" - "Lb1FEYuVfVxSxnU2jhHW6KPtee/gvuyRI/TvZuwmYWxLRpikVn4pAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM4nITNe8UykgsIuo5czSSSl3Okr1K+UVWTzDGLznDg77MkLy7mydmk9\n" - "vf51OB+ogQhozYKIh9uHvecOzY4EhSIuKhui4hNyQklD9juGoW7RVTSpGdYT1ymp\n" - "dDYS30JBPwCZ7KjdMtXiU8ch2WgbzYBuI+JfjwOhfcsuNC9QPfbfAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key lx8o212IYw5Ly2KbH2ua1+fr4YvDq5nKd7LHMdPzTGo=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" - "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" - "mjQFK4AtRwg=\n" - "-----END ED25519 CERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dg\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "cv1yL8HhQzQfjzkSosziu2kMecNUQGle4d103h6tVMoZS1ua1xiDpVKeuWPl9Z0+\n" - "wpFwRkOmK0HpNeOXCNHJwfJaWBGQXunB3WQ6Oi1BLilwLtWQixGTYG0hZ6xYLTnX\n" - "PdSQIbsohSgCzo9HLTAgTnkyBgklIO1PHJBJsaNOwfI=\n" - "-----END SIGNATURE-----\n" - "\n" - ; - -static const char EX_RI_ED_MISSING_CROSSCERT2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AXXgm0CUWQr+rxvgdIslqaFdBiwosT+9PaC8zOxYGIsZAQAgBAA6yeH7\n" - "3AfGIGuDpVihVUUo0QwguWDPwk2dBJan7B0qgPWF5Y4YL5XDh2nMatskUrtUGCr1\n" - "abLYlJPozmYd6QBSv6eyBfITS/oNOMyZpjDiIjcLQD08tVQ2Jho+WmN64wc=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMdyTK/VPZloLUaLsvj1+NOFs33/E9HmA0VgvZ1nNUrR+PxSR71QF7Tw\n" - "DKz+/p2rJE+MPfQ/Na3dH0vH4CDZ+FH2m4A8SB9emF8aKxdc/7KCjQNDQCNlEQYn\n" - "O9WvZJhbNPHUmX0z4OotI+Sk3qBzVHu0BGDsPYC9gwszIumDUILxAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL8o6CJiLfW4vdRFvJ2nFt/H/ei0ov83rilOuwSmNORmL9lvnHY++HrD\n" - "dmEEvBv74xqWJxGbJ6OQ3VOwRpf2X/cb4gAvsQDqDmNwpJsrPYRQVXp/KY/8z7bJ\n" - "dM4CjcsuJHHmj3yc3iCzgqt/Xr6vR24X4bee12/bP7R8IETvWoiHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key qpNEGrLMVn28Odonk/nDtZq1ljy0fBshwgoAm4X1yzQ=\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "i4RKGIeaUrO6nzfdtb6j+ijYJh1Vgc9bsHMpW9cVCOjoJKFW9xljgl9xp6LytviN\n" - "ppKYCt9/JflbZUZjny34ESltPGrdquvHe8TtdQazjiZBWQok/kKnx2i+PioRF/xI\n" - "P8D0512kbJjXSuuq9tGl94RKPM/ySGjkTJPevN4TaJE=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 pMAOpepn5Q9MxcV9+Yiftu50oBzBsItQcBV9qdZCIt3lvSFqFY9+wJjaShvW3N9ICHkunrC0h/w5VEfx4SQdDA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Du5fJYDzvEeGqKTJwgaQsJJgz39K/J4qEM2TZ3Mh0XuDM1ZWDtjyzP03PaPQqbJ1\n" - "FsN5IStjOqN3O1IWuLzGaZGpGVuqcyYOxjs7REkGQn2LfqCjpzjaAdcsL0fI4ain\n" - "o/in8GQ6S/qhsx8enKlN0tffTmWmH9bmmVz0+yYmBSo=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_MISSING_CROSSCERT_SIGN[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AfoVFYuJnDNBWbjbTqfXACUtXWPipmqEYC++Ok/+4VoFAQAgBADH7JzI\n" - "fjSMV158AMiftgNY+KyHYIECuL9SnV3CSO+8+I7+r9n+A3DQQmGLULo/uZnkbteJ\n" - "+uy6uRG4kW0fnuBlKhseJQm9hjNGWzC8hmebp1M+bxwG41EGI7BZvnTrRgM=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALEqlijoFIDX1y1i5zfei8DuDIsFtSw56PGgnMRGcybwD1PRQCheCUZM\n" - "erQgFCWjgLgvGJERBK/oILW1dFXp4MAR5RgnrPGTfWTinCj32obMLN1gIczpq6a9\n" - "P9uv6Cz0ApSxpA/AuvjyAZwQKbUXuMvIY4aTprAKSqqVohk6E+E1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMZbbBjGV7xPri4XNmejq4add93p+XsWlsfbM930bcC2JZiwg4g4cq6W\n" - "idl8VDmCXeaWg5y3kb82Ch/Q9vPG0QYQbXxUA3JxQKKbcEK3QsEvqQh8Nb7krILK\n" - "YnSGAnLG2Nc3PnKb7Wpb8M3rAysC5O99Gq1mSfm8ntj3zlIM7NSHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key CYcpfIF4T9PJcfROfVJTUYl0zNd4Ia5u0L9eng/EBSo=\n" - "ntor-onion-key-crosscert\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AcfsnMh+NIxXXnwAyJ+2A1j4rIdggQK4v1KdXcJI77z4AMRc2LxiKbyr\n" - "fqRVynHuB031C4TN/HAlNPBjVoRvQRgzpiyyoyCqMDxLZdM8KtzdLLeqZJOXtWod\n" - "UXbYG3L70go=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "BRwRAK2lWxWGS49k8gXFHLEQ/h4k8gOQxM0WgCaN4LjAOilLHFjsjXkmKgttVpHl\n" - "f0V9ebSf+HgkpQnDSD8ittnr/0QaohUbD4lzslW4e/tQYEiM46soSoFft85J6U3G\n" - "D3D63+GmaOfIaa4nv7CD0Rw/Jz0zTuyEuARsdJIr1IY=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 7XfV5r7FXbXPEvrxlecWmAJxat/6VT+/4tE5cHrQnvLM4zslysstWH6/AfIfcmUuDlQ0watmfg1MvVnjavcfDA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "eigLL3S/oMGL2tJULt9bl3S0iY+YIxdKeGFCcKZci59zD786m+n+BpGM3yPpvrXr\n" - "bGvl4IBqCa1I+TqPP1rM9lIEcUWaBT7Zo5uMcL1o+zZl1ZWPWVVKP5hC5ehDueu8\n" - "/blzNhTEFAp23ftDK9PnFf+bXxqbgKkEoZsxnd3e9Ns=\n" - "-----END SIGNATURE-----\n" - "\n" - ; - -static const char EX_RI_ED_BAD_SIG1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AR8QC+SNBpPOTVY198IQBANNwZjy+SBqQNxfzjEmo204AQAgBABjz4FP\n" - "zW/G+fu7YirvANvvqJeb7S1YYJnf6IrPaPsPRzDqJcO3/sTzFC5OSb9iJmzQAWnn\n" - "ADPOl+nOJC58XJnJ7CUJdPtyoVdMvUiUT/Jtg4RuCN1iDaDYaTh2VavImAY=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKuLC0kzCBTV6+WPZcAOQPKjqbjvMIyaehIQS1o90dYM+Tosrhtk3bw8\n" - "QBLMaiWL3kfIWPZuWi2ai40dmqAXMrXH3yBgKRNZ6zZSbUUuJ1IknqmrQ2PKjC/p\n" - "sIW2awC6Tq+zrZ7vntDb02zY857vP59j8eolTDg1Vvn6l2ieL+WhAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMnBQPOJBQLZ3NAa70n6lGZGvS3DYZFNOZ2QnHVeVvOSFIFsuvHtnUdX\n" - "svDafznYAuRFRVqJS2xtKKGu0cmy6ulEbBF+4uAEMwQY7dGRPMgVF1Z33U0CSd08\n" - "ChCJGPTE7tGGuoeSIGN3mfC4z2v9SP3McBdAiLHisPzaUjfRTcwRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key W8fUvBpKBoePmqb70rdJUcRT0NhELDWH7/BSXJtkXS0=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AWPPgU/Nb8b5+7tiKu8A2++ol5vtLVhgmd/ois9o+w9HAAPwWqmL0HXa\n" - "bYKrKPWQYnpQHQ3Ty0MmCgj3ABF940JURnV161RlN8CRAOJaeQ0Z8wBRLFC1NqLT\n" - "+GVdtewGeQA=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "x0vT5Wv7Guc0/Vu2BqomWwenh8oda9+8K/7ILi5GQL/WC29Tj51i0EE7PVSnSMJ7\n" - "33I/V+N5neauqWnbg7TxYaLsPfr6SpPTpBL1Xt0OiwT1//PvPYZ1gCcF3ig3KcfI\n" - "mreQd5C5Vri6ukWkMtz/zNDaDpDanzaNXTdaUXmFHF4=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dg\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Hci/Br1+NNymDZBmQy1QWMlCeLe8Z1vtZ2ZTj42jDhWg1OC/v72ptI072x4x5cmi\n" - "X3EONy8wQUvTNowkfG6/V/B768C7FYJYBId1GAFZZymXnON9zUYnE3z1J20eu6l6\n" - "QepmmdvRmteIHMQ7HLSrBuDuXZUDJD0yXm6g8bMT+Ek=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_SIG2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AW8fyx54c7vQQA/AmShAitFP7XI1CLdifEVPSrFKwYq6AQAgBAChqjVA\n" - "/wKKJZ30BIQoXe5+QMiPR6meNxF1lBttQ2t5AhauZbH5XzRhZkdGo114wuyPNEM9\n" - "PrBwp5akTtari9doVy6gs3McqdoIbRdWevpaGj5g5oOEOtA9b5UNWQSwUAs=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALp0Croi9zhpGxi9sUj54jr/flZdzxVVS+8VNldJG2c1soSx8kwlwotu\n" - "7mGGudJDAzDHGo5F5CCPEfQov2OmDehpefYUz/AaMLly6PrLRJlcUcpLogGf1+KU\n" - "1lLwE8kanXUkgvDhVQiFvNjy2Dxxuv3AHH4WdZZfbMbm8FJRGoHzAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMoI9vQT4g2sV2dViGOWOzxckk367T9sMjVwcYfJCmnixGxjWeKScQFB\n" - "K9v1uK73cfZR8AxiUGK4/iOX/9en14mJOGF7fftAqypFLAt1TBvb07IgXljOBoHc\n" - "Paw4oZoJQzEoazt0Oa181LyNnNIoaZpHVZd1+a1Gs1gKoM4xDBv1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key KjyvXYkMcpke5ZsUYf2gZAUNeEoz8NAwYoQvvbcDGiw=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AaGqNUD/AoolnfQEhChd7n5AyI9HqZ43EXWUG21Da3kCAI6MRHm7GpCF\n" - "/3zDGR/6jKe625uFZX9HpLt6FgAdGSJeMQ9W4Np9VkrFXAB3gvh7xxRzSgZ1rXgR\n" - "lUomgi7N1gc=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "xJXvCCpP4ExBuT3OTsdn2HJB0HidupmQq5zBh8fx/ox6+047ZBOM7+hVxxWapcMg\n" - "PMXbcLD4L/FCBpA/rjnFUE/9kztdq7FH/rOdi0nB6FZWhwDcsZuyfvbnDTxz5iHJ\n" - "87gd5nXA5PE649SRCxW5LX0OtSiPFPazu4KyyBgnTIM=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "tk4kBNYqB8utOmX30HrV8YfnwBXYODIiL3M/juRS6nPn0uvbW7pjoZ3ck/ahgW+6\n" - "FNQsgTJnEADCWS1r6v7PcvzQjtrOUUpNxGJxYw1r8yZkvmIxSQD6GMzuTxq7o1VA\n" - "/wZYDLonLhCWRdPjxnrl12+z92NdyISJCHMLRVqs2QY=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_SIG3[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf54AYYiKZrFWZ/Cj5mZbfK11MZHYbwchllsUl4qPqY9gfi6AQAgBAB4irxT\n" - "86FYA0NbZssSTmfyG6Edcf0ge61OwB4QD35kHCrvuZk2HnmL+63Tj4QoFqIVnwVC\n" - "3wRGJGcmS7y+vS64GUXbuyTgqgpl/KuoHo5Aqe6IxJlVWYtU6W0M6FV9tAM=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMUEvXTVTl5xkQ2MTEsB4sXQ3MQkz8sQrU63rlqglpi1yUv24fotjzvE\n" - "oJpeKJBwwg5WBW/fW0bUDJF2cOHRHkj/R4Is3m+2PR1Kn3UbYfxNkFkTE11l099V\n" - "H6xlsi0TJOJKlgrcbSuB7se2QctZVhwsdsJvFRptC9Qd+klAPb7tAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMooTeSUX7GPoyklSd1/6cF1u8e2LbjOLIpZrMon0Xt7c/aNwlrG9rVo\n" - "TSokHs3AQ2H2XIceySVRRWR4AdX9KApO4CX0gGTuVUmq6hFJWMnHdAs2mKL0kt1w\n" - "I+YWzjUqn4jIVa2nMbyHVQWzIysWwWiO4yduIjAYpBbWd9Biew4BAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key BN0I+pLmFkDQD5iRsdkcped4eZwGIuXnLiX2K0Zoi2I=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AXiKvFPzoVgDQ1tmyxJOZ/IboR1x/SB7rU7AHhAPfmQcAOrIvaG/xJqe\n" - "adM6mai+FlV8Dbt6QrXTcNHJU1m+CUDthA9TPTAYz9D8W0mTEQ6KEAKGfQrNLy2r\n" - "G1B+9wWSpA4=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" - "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" - "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 abcdvEzGFYMcJ/Ea7sbessW1qRJmnNNo2Khkkl0rEEgtLX0b4L4MMhK/ktS52Y6jX3PRQWK5PZc6gjV7Jaldh+g0Aw\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Vyj7g3eQ3K4+tm49fJkAtsAYnYHcEiMnlucYCEPeKojzYStNfZwQO2SG5gsoBIif\n" - "urgQZ/heaF4uiGFg64UFw08doXqQkd5SHO3B4astslITvmq0jyaqzSXhdB5uUzvp\n" - "QCR0fqGLVS1acUiqGbRr4PiZ9G7OJkm230N3rGdet+0=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_BAD_SIG4[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AaEnncX/t0cbLm1xrtlUpkXghaA8fVuV7g1VF3YNfCaIAQAgBAC7Ki3S\n" - "zzH9Aezz5X4fbwHeF+BQEDfVasfyTxTI4fhRi7t3RxHzBJd60uEMXy2FchD8VO5d\n" - "j4Dl7R4btrohPVSVBQZuemBQSW6g3ufNl0txpFWu0R7vBPTFH6oyXYfY9gQ=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALGKwzhOui2/jJPjU1ngW5IZRPcoDk7RAfGDO4xaef4VfAFHCV9CQO1c\n" - "/wQ09CcRdggTvUcv9hJTGJhSObUUooCkxw4/35f/A6/NoW1Gi0JqF9EsQWHpuAfr\n" - "n/ATlJQ9oGdTCNDq/BXSPWXhoI6UhUe0wiD4P4x4QwaYHcZh+lE5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOKrizVm2h5/jE/HqqLCBLWJZVVoGspasCtDDqHhSqsPzyjpqa52iMKi\n" - "q/deJ92le3J2NJRGKxPmPQqWxwhIjnMS5kUMoW182iLpO/G9qyPZ0dh6jXB0NBLF\n" - "ySfW6V2s3h4G4D2P+fqnsnzQnAX7YufkvgDau/qTWi2CqD0CjavDAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key A9h8jY9dPbhHTDbIc/NYWXmRP65wwSMrkY1MN8dV3BM=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AbsqLdLPMf0B7PPlfh9vAd4X4FAQN9Vqx/JPFMjh+FGLAN8xr/w3KFVi\n" - "yXoP/az6hIbJh0HYCwH8D1rPoQLcdpe8XVwFSrHGarZesdslIwc9dZa/D1dx3OGO\n" - "UhJOrdv51QY=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "bLmdO7ME5vq+c9y/Hd8EyBviMBTeo85sHZF/z6Pehc3Wg3i1BJ8DHSd1cK24Pg48\n" - "4WUrGTfonewuzJBDd3MLkKe6epXmvUgvuQN5wQszq1+u9ap/mRf6b3nEG0MHxMlO\n" - "FLx5MBsScuo+Q+pwXZa8vPuKTtEjqbVZivdKExJuIX0=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - " router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "LqNGEa10zwSPeomBXTfgvBnnWAdWyiR7KYZq9T++jK4ctR6hUaWngH8qSteUrkMx\n" - "gyWb6UMmlxdfOG0sdcU463HsqV7zObaKya8/WwQ9elj3FfsToswUCeOaLR/Rg7wC\n" - "zcUjI5VsneQoXT2WVZbZBLsLB3+7QfezVHRMB377GAY=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_ED_BAD_CROSSCERT1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AV1AfOvQWKlWsbzoBdJc5m72ShIJuA8eNV15basjhXYdAQAgBABy+KQK\n" - "3oLDGtqL5kwRmjAsls/+C6SAoAALll7U7wNSH7en5RVBal4RUzCf57ea/KG0c9V8\n" - "2DmZ3PdOt2aY/M2bWGmmH/tyyapOoV98dhDwFU7zcx/pMfRnJTDRSDwl8QE=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMP6xbqbj+x1mq5XImjeT0rUzqKZTgBd5zvK4Xcy9IifJuFC9+mMzrY4\n" - "WhYbdClxKUkDMkit9MVhek+P/w5TSHKl6AuqGaO09ID+hZpoUSdoBUYktynxfGsx\n" - "kIDu0XvgtAeSyJaVvoV1SKVChY0IBbzUqbHt4O2Q1BhzFCKEJTEzAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANwWlBh7e/eSLlhto5YUdj1iGYOq+yAmlosDItVfYrSPJuUfM2ocMBAn\n" - "udbRbWiADoqsbKn/gwwHCC/f1HX2FkRXxxnOlJKLo+NEi8tGmOlcQXSQol1pCpvK\n" - "sA9TxtYr+Ft4LRpxNrexF+pIBxqzwetqQrZbKYr0CFJi8q1qlMynAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key cs1AP+xF5cXTLuKeOeItdoDAzfALTJkwk9lB4mtC4QI=\n" - "ntor-onion-key-crosscert 3\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AXL4pAregsMa2ovmTBGaMCyWz/4LpICgAAuWXtTvA1IfAKo6ANUq+hi+\n" - "xb3J4aYafnszlj87oi/DR+SDf29wzwNw8gmaqGzJ5GbfISfABuTUCzlilZyVnLxi\n" - "BHcCH6PWiAQ=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "qC9Kph/kGtONR2DxZDoIFFgnDFC+/7H07EgCiYQdIFIROc+gGK9qBOgeFEptrkXF\n" - "XdE35xxox5xSASQvp7hjFwxUtJRGOtf2O98regqeeaz6O9VPXHkLf51uqX3bVgq8\n" - "KvFAsFFS66GxhtbrVjpyRgIwHAYvse1WVESfLuZZTn0=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 3uW8Q1aetIQLOsqSco128ZUaHlhqdYiBvrxV7x75BGNS5RzIMTEwYDNtEX1LNPFJ5N0YOV0HEEOLhrJUV9QCBA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "WuD7S/saTYBxKvItITbHRi8n+e6g/oVbosicfbRbafYPzPp4Prb+RK03UTafzXrV\n" - "QEQIzDNhfePcIMH8qX+qrogLMXFqiXx6TVQ0GqNvqirokk8ar3AgtRtewhChAuAj\n" - "8pmQTj2JpZn/iB3PCE2l/93O9LHZfp44hc8QOWKs6BE=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_CROSSCERT4[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AW5TTGF9jCMl7aALZzqypD9Bj8WYnAPIrKCoIJdgMbY0AQAgBAB7eCn8\n" - "rukx7t/egZUdqU7+FYqsnO4wdmOkLZkp0+gpF3jjk6N1Q0037NNVNZBjONB0Nm2F\n" - "CpB3nWSJliSSKr5tOYsuBPFy5VVGYeKPakpOoxanQ1UcqevMBAQy0zf9hwA=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALeS5YbeDuKQ5iiuUvh3REoyJ47/YU9lslWmTrVBf9b66pMnYJv/awPu\n" - "m2HredUAJ3VzwQ38VJA39w3fQXUhQDnQ0OPpKzeAmIiuG+6WdW/mBSK7uKcezC23\n" - "LA1d6Afyl79LjZz/n+ENXqNMlJk4QPcPHuRnAvwBl3t8YVRPJmxhAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPprokY7utWuO/0252dBB5MCxmVD/dROaIBDyFtpdH+YVv04rkOlDzYD\n" - "W4mgHVBMxEm/cspTgQmJ4exRHJPpcSe1RYHt1ONZdLYr6D7OOWf0y1IUrVSzF6K4\n" - "lqlmNuH1H4+TKGbkvixYc5GU/2ZmAy6gFEuphYnBbsN2Ywc38mnfAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key Cgo6xniGfEiuYoLSPUdE4Vb2D4zj2NQzC1lRjysRRXs=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" - "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" - "mjQFK4AtRwg=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "bi4M/AJLZF7/vSNmOj4uhrgKBQA/KfcZy5e58mhGL4owxd9vaWfl3aelvb9jf9zN\n" - "Q7FMv8f9aXzeVIoXIpRJxSKIJgBtG2wnMumIc80pqBvTyGInharszb6njfm0bg1u\n" - "PfJkbQYyf/dA5l5UwCrjFs06ImDmjFTAdsSWf6DfZ/k=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "io16v+e0pK3sbFzPGnkQrAjrRgIOJHrVZ1RXcxZ1+UNXagWM/MOLhQpkU/cw49Wd\n" - "4rQeZD3JQh16330eXbxc97AyDgp0b30He846SI0MfW/DnmGI8ZNeYfLbMv2bmbs9\n" - "QULzyIH8C+5mnMI1arcuiAua+Dpa34F79vgqPuvw5fU=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_CROSSCERT3[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AVB+j+B2yPgGywvp7nvejyhMh9ejKmw7LCwufV83Zl9eAQAgBAConA3B\n" - "jJ3X2tES40jd94rRUFS2/s/Yv7E4LEQ9z0+jz8horNivzK3O/t7IGxJggi+b41/9\n" - "Uaqt+wqtVuKj0xJ9jwBlCXFt28G2P9s4ZyXYgGZqo7MlJlboybnOMvmoTQA=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPWuEWckT4aYAVNrZzLA8xVwfXp0wzfXeTWBztLS8VzssN6w/+cwXdeY\n" - "N1YNc2DiD3u8f+7kmuZIqL1EFQUwTvRwEzQXm2dqGM7qkm5ZGNMb5FKu+QwO2ImI\n" - "FLNiO5zO/LqP3cf/2L8/DuvruLenUrhRtecGFaHmhDYl+2brHIiPAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMtHTfk0gDvp9+PtIG8Ks7rgCiJZ2aihSvr6WaKHYuIprgspFuga98cg\n" - "D//J80CrgH5Dw68YnkG+gU40IxP7YzhQ4glFlJGu3s2y7Qazcv5ww1XtHur+GDoA\n" - "cY0zCLhltNQFxIsoVUepY97XA6Y2ejYJjyqNXQcAmoPNoVhnTdkhAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key ibZf57LptdOK3WpVFXkYMatEEqPhuVWxsnkwF6638V4=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AaicDcGMndfa0RLjSN33itFQVLb+z9i/sTgsRD3PT6PPAEbkxCdI/bH/\n" - "B06DAjRuoDiv1HKsGuW+UN1iGEiWu2ieFzf3m0Z7BL9p2u2zIbHYkP50b3T3sebD\n" - "1AksemmMdA0=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" - "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" - "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 XS4zVi46Xl3xKhuozPCDlW0QRFD4qUhJmkefonQNsRlMVsrPkALnP2tfnfdfTc69hbNa22pOjJNf6Gm505EnAw\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "Q+R3OpO8VhfvFbXuE5qolhVbgosBHy2A5QS91TMzCbsxa8pBA6Li4QdPR37wvdLq\n" - "KayfmmNCMKU5qiZMyXqJZm4fdpxiSi50Z0tYlXM3b2OVfza3+pSOEBl89fN6G4Qc\n" - "pAmM14eEo1UzXrqZw76tMS2CwOYF5vR2xFGCYC0b5hM=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_CROSSCERT5[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AaCfOaispi7dJhK0c8HXJHIwoBkMgRpmmHu+3Zce/soMAQAgBAB5bAIo\n" - "5i4TSY/bV2KQAyziRwvgJm+nEiECClflPbP9Um+zOzOgxtDmNnR5UFQj+VWNG4uf\n" - "5lnaryN+PfUXZMTcs8AARof3fFz9tVPINHDrsGvKt8gpzgZEHkVioAXOFwg=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL3Fr/ovZ9SMGYrAM24taKBm/NpemZaXdD/JeBXFYm5Zs3szLwJC4Etm\n" - "zjNL6tVy+I21O1g3cs16TkflcidsjPXNx//PHAn7bqWMekjrt3SQdkHW2gDPgT2c\n" - "zYJ/hBR96JYG796jP3pkfJz6Iz5uT/ci3A/cdaVbzM1uZbMUgYGzAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMHB+1dWa8BBrKE94vTqfbkSEuysG5LyyZF/WrqHq/3W+ocDLz795k8O\n" - "2Zvgr9im/Ib4hD7IyrtRexcuBdwujdG7cBALdCcWiUTGAMkl96HNETSX+lUVIpJ9\n" - "pMsc9O7+yz+/0Cl2RpILZCdE/7I96qHpZl3tzlRKSu15WeIm5U77AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key GXi0a2VLcRHQMMYys85zu3IPqOn5ZTsOixYyQvTGnQs=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN BUTTERED CRUMPET-----\n" - "AQoABf54AU3MlHAEtdPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" - "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" - "mjQFK4AtRwg=\n" - "-----END BUTTERED CRUMPET-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "T9NHMBhuJo+TlfU3TztNgCc9fK1naNRwPOyoqr5R6lJvJ40jkHnIVOFuvuzvZ35O\n" - "QgPbyFcMjv6leV5xcW+/I9tWaBUFXiRGI27qjCFth4Gxq2B6B2dIcQliLXSvW9b+\n" - "CMTgDwVa4h2R2PMh18TRx1596ywE09YhCgBF3CwYsiM=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 sRpiP9kyW/DGOphp4V2VCtcKNA8i7zGuv2tnljNIPTB7r7KsTvdUk/Ha9ArRQEivO4nC2HHENtknDl3GtWIPCA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "DtORw3+gO/yUUIp70xDaWSOgQZrJAAoZTNCB7q5WCoZOngeaCiC1Gtc+Fmdn7tER\n" - "uPqQC5H/Kh3Mi82PCj0JxvNivnNTNY1AZVaIX5YoioXVOkWF0B2pqMvFuDSdm2oJ\n" - "29PqSVcklquu19EjJRTopIHvYn3sFhQL4LarMsYY11c=\n" - "-----END SIGNATURE-----\n" - "\n" - "\n" - "\n" - ; -static const char EX_RI_ED_BAD_CROSSCERT6[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55ARMMCtQ8pObC5bq02AUE9Lx2bqsZBBkeOsDZVaEq6JavAQAgBABtV0xF\n" - "CsWXL/uFIBnoEsnXBeU1MvYRFrj1vR7QHdWXnxywXvBYUAC8lu/uyc8qqLp+aQSJ\n" - "5JzpDYlg3hp1fl5k97iv5F9WrR6s554YpmgYy9agFaxZ4LmRgz7n0UJ8mwM=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAO5qd1TndKD2pEs1ZLWsHlvfO/E7cA0H7NKGLSioGpBf4P0rtkueX4ci\n" - "kJNa/4Fn/QsLECqEF2lUjkIc8YL+HMS6qteKvN8+nn16DfvnIhPDNZWTJjLl1bOI\n" - "sWSSiduhanoWQnhRtl3Rxg3opdNd9ApO0DLUNy4Qy18Ai6SgksfHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAJkMYNpK7eJJyGwD/xG/iNg6gzzbIwrOSvmtoP7Rot42qtBiQ9A9kdsy\n" - "sazwkWkM93U1+1OaAADPYxeHoyHnuia95Cnc5y2lFSH3I7gnGGSPKSTwXtdyvDWZ\n" - "P1LbmQ4Bnh5leTCNZ/eFC4/GjNVzqHxjbb8a11dQhA8dOk8PrUq9AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key HdSQOqvLr4YnJE1XzzVIddgKgnjaHKJqnq0GqF4wXDg=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AW1XTEUKxZcv+4UgGegSydcF5TUy9hEWuPW9HtAd1ZefACVwif1deQry\n" - "K5GeemRa32sGzujVDDe75WRiPKFT3l/EtjTq3oeVq2xwbVJklnG3ASejKTr3YcHt\n" - "ov0jOl0jywc=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN NAUGHTY MARMOSET-----\n" - "BpLBsl6Yo64QzczJn0TjdcXC1Jv9IhUG2m/Re3v0voCELOP+t5vkZXXLoVL23oKv\n" - "JheSkWiuAIEPsatb4afXZ8wZxPcQjwy3zTOBM7p9CG5fA+KYpqKTxAi+dhVYlcDo\n" - "M7S5nMV63FclkZIT70FFTHwWed1sAKwEO3/Ny24eppc=\n" - "-----END NAUGHTY MARMOSET-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 lNY8TRX/FZdH5eFbsBkFHuRi8bPDsE5P+v7zExyD/IXnKS/ffYlP8qw1XIPdEDOIzGQ14+kyPX0SotaAqHRtBA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "BHamS+epF77iozo5cBt+tbs22m9GhwY55DRXpEWAtvn67jsMnmn7qCOLONigK1RT\n" - "adZNezIydcCxXltgHTdKaZw4lcqv3s0KL8kI8frbBmm7PjXtWnrdXBYY+YK54MN/\n" - "t4N3162o9hzzKSwye0gPjgzpQ1xtEIkzWhBcmE9Vw5s=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_BAD_CROSSCERT7[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AfVmH2ReTyatl4VnS5YREtCM2dwikWuAPffq6M5bysZxAQAgBAAXoqE7\n" - "taqwLDXLZrZukpF1eBkCwYQK9uzctHTuMdqOHChguvkfX7V4H3O76Ayqvz+Z1ut1\n" - "KYRdgiArn3viRaBv3ZKT4Z75suMI3bjqGOSGLAKfOa0uLkOmKblHHhSUkwQ=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOLNugzUezzzw+N1SuQWzILJYkUJyQDoVXSZjT0dzBplHCjlrv0WZCUP\n" - "/pbonE7SlCChIovHcdiASaLj7MVaGgYDq3M1Vtgt5vhgGl10/+evBAD1QEt8AVfr\n" - "5+PH/sbZvOWucAhNUhOlqFKAn4vdRY39VEEXC5/Jz5fsk1E/DBu5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKxzg1hsYMS+0zAIrgYxSGO0GbKRrL/VhdlMEGu7ACaoqlGnmGQS3B4B\n" - "gLk8xDdx9N//8+YTx0hUIxP38w08lubPl1WXMq8s7wAiFd06Nklf65mHs0sXVtS1\n" - "EG3f97PQqmBpEJOwYBATNcA9e6F62P8SXNkpSjOzNaE0h9wHNKk7AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key msdr3O4W4bm/xdmZLzj35363ZSFex8yQxLWsV3wRCAQ=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "VQoABx54AU3MlHAEtgPdAyWJzRBnh4brXbCR9JFLjLM40hsBMoscAJ8cHMIc71+p\n" - "Qa+lg5JiYb551mLgtPWLy12xdhog7SXiJl3NvnMgbMZXHDqkU2YZCidnVz+xqMdh\n" - "mjQFK4AtRwg=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "RJJRiU0vjVtRi3bVZru3aTvV5l56X/WOOp/ii316yPAS3aAMpOm1+piFVR5MNqcB\n" - "ZGyrA2Kx0hawdL2buU47iZ12GOCi4f1Es4V4N0TQgJICsKX38DsRdct9c1qMcqpp\n" - "1aENSRuaw0szTIr9OgR7/8stqR5c3iF1H5fOhmTi6xM=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 4DSdPePrToNx3WQ+4GfFelB8IyHu5Z9vTbbLZ02vfYEsCF9QeaeHbYagY/yjdt+9e71jmfM+W5MfRQd8FJ1+Dgxx\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "F3ZqvsyL6RRhPEnNFFIZY4WJM7LK082rseWzRkGNXjwoEwOWUK8enQ4Wjit+wozW\n" - "4HVIY1F+vP7gm6IiOEAFgEpB4C8FGuyoFw2q0ONA2tqTcvBJDDnqbx08FO7v2Dij\n" - "d3ucfc5gf7YNaoFCMMuyAzC56eyNk4U+6cSKy6wnJds=\n" - "-----END SIGNATURE-----\n" - ; - -static const char EX_RI_ED_MISPLACED1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKT6OIN6TsDB+xcp1uLeE0K3aiHGqa7hdxMBGpvcD0UFSyzpVv1A/fJa\n" - "tClDCwTpfTGbyK2L7AO75Ci0c7jf6Pq+V7L6R7o12g6WBTMrgsceC4YqXSKpXNhi\n" - "oudJyPfVzBfKcJUSynv89FUQOyul/WRRqWTfv0xUsJ3yjuOESfCNAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AbBV9NVz0Hdl0Uiv87LiXaTAoeSXE+bheNG4Dju1GzQHAQAgBAD16h+T\n" - "ygzSgPN4Qat5ITthvm+lvMwMVGbVNWMxNy9i33NGhgp8kqMp2iPAY+LhX8It2b+X\n" - "8H9cBmYLO5G7AlMPj7GsuWdCdP/M/ldMvFfznlqeE3pCpRas6W48CFJ+9Ao=\n" - "-----END ED25519 CERT-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANMO/MepK3uCkKTLRCwIWc/8URVza2gEmDx6mDTJIB/Mw8U8VRDuu4iJ\n" - "v+LL3D8/HGLvT9a8OXbl5525Zszt8XueF3uePBF0Qp0fjGBL8GFqmrmFe6plurPJ\n" - "TfrS/m3q+KhXAUowmghciVGDY0kMiDG9X/t/zKLMKWVDYRZk+fupAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key I8yDO62Flx5O/QsFvgb2ArIRqwJLWetHMeZdxngRl2A=\n" - "ntor-onion-key-crosscert 1\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AfXqH5PKDNKA83hBq3khO2G+b6W8zAxUZtU1YzE3L2LfAGC1uXxN2KwW\n" - "w4PqRidM1UPZ5jVOHceZYNQcTzzzArfBpr9OraOO2up4TGte8GVqjJNxrZc1gfjn\n" - "CwPW5WxpFg0=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "jLg3D3VO4i0sN8p2qtB6+5C3tai/K4M89mP7z2abQnUTbynOacPoNXIk4o64DjBJ\n" - "kaR42yfA7yQZ8Rj8abwgz0Zz6zbd+JjE+s/EklrEEtOl+jZAl3i+92FaHROJojXq\n" - "hw+ZEPOb9zgb1UQ7S1Fo+GoqA5bdGm/Wg1kSQielkNE=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 TRKvIl/wIIRD4Xcmd6HYmy7tD0KhVGgoStpWPtX0zmXGZ7+jugItrY0frDu9n82syiruuA45ZOs1Rfi4CbOSCg\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "NYpRfurB1YhFmDAdRc2Sd77S7By2V/0kgEHpJhtySb7efiQsyOA4ZBr1zEFPAXdp\n" - "TviKzyS9kN2fnz3hORoqFul33BDZbiLMNLtt5tzp62TYtmIg9IZdjjczbJUgbVLt\n" - "KCJL0vM7fdbXkZX61GIBbMYwzwIiHvVxG7F/AS5RbtE=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_MISPLACED2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55AfJo9FIePrxeDNnWT6SWkoz0/L27018XjUNWEHfaR06MAQAgBAAMgolK\n" - "nLg3ZnVv0skzHCfmX+ZR9Ttwj7FNXfhXCsyr860S79OW5LD0/m1GcS9JflWhP+FO\n" - "ng5cRb+aqNc8Ul+/4sQudZRx8w4U3d5rOuMGCqhQXnktH9AFzQHFq0jpAAU=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPeK/znKLRvSUmCIUiZOgfhiRFt7XGN//C2GFuey4xkKiIr9LWMuVe9m\n" - "Wx39Ea2UGEtNGCEVvZdJMDVRl7heFTfJTN4L1YeyWx6iNRWlpAmgQOKII7slHwlq\n" - "seEULOLOXc9AsU/v9ba9G54DFbHfe2k44ZOwEmaQZW5VF/I0YMMdAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKFRzlrqPPxEW0nboAJ1qzKFb/vFtvRW0xNVb8RtbOY/NY5FV1hS8yfH\n" - "igtugkrOBmWah7cmJhiON2j+TKeBxEoXwJMZeyV+HLbr7nY/mFhad4BQ3Frkl8d6\n" - "1kQMhOJswMdwnnVHPNGUob4YAX0SpFA6MpBVj92zmMBeaihqUS9VAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key br8svioLcJCAQxoo3KvlT288p8rb4lQIZNLlplkIKkw=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AQyCiUqcuDdmdW/SyTMcJ+Zf5lH1O3CPsU1d+FcKzKvzAG9XqwmRm0uJ\n" - "E49NoHcWr9IzdIwSGo+PJSkVpk95a5p2s065BetCWxEEBJQniajQf2hZ36zmV9rq\n" - "a6puqkEAKAM=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "d6QGIVAJL5JjHUyV+aicLIdBYyxHwviKpPcp7uldRF8vfDGFpu0qFgJ5KT+3t36w\n" - "QY1r75bvUMG/ZzGKDg95dcK0X2AK6GFlcrYyCoQEVOsuPc1QEUeK9P2s7viNQE4V\n" - "tRwG/CvJhPfcnxErzVGfXIeYRL1r/hPNFDZSeSxPPM0=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "router-sig-ed25519 ts9pFk8PnDWtXgQad09XC/ZCbruSx1U1pNOMWF9fyoNG0CodxdDH9Vglg+BOS7Nd9fmsINfPWKCVdVuSSM7zCA\n" - "reject *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "YMl6mpQm7UCsPQhZKMm0aZ7fzGevWzRbQO+de20HTn7fVqMWQf2hBDJe9QTN/uDK\n" - "/VKYT8SnIBexbrSMy1N5q8kNFKxxUtwA9GRtz620Vvc4m+lz/tnT9qucIKCDL5iJ\n" - "eRpnls0JoAMIHKl99zdUioYubmOZuqUaRAdT8ulWy+Y=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_BAD_CERT1[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AYf+rX8a5rzdTBGPvLdQIP8XcElDDQnJIruGqfDTj+tjAP+3XOL2UTmn\n" - "Hu39PbLZV+m9DIj/DvG38M0hP4MmHUjP/iZG5PaCX6/aMe+nQSNuTl0IDGpIo1l8\n" - "dZToQTFSzAQ=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM4o2DrTwn3wrvUMm41S/hFL5ZtRHGRDh26o8htn14AKMC65vpygKFY7\n" - "fUQVClAiJthAs5fD/8sE5XDtQrLnFv5OegQx8kSPuwyS/+5pI1bdxRJvKMOUl2Tc\n" - "fAUhzeNBmPvW3lMi9Fksw5sCSAKQ5VH/+DlYvBGZIO49pTnOAty1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMzIsJeEWWjN3Lp6qrzaJGn8uhJPJyjy2Wt3sp7z7iD/yBWW6Q7Jku3e\n" - "C5QfKmSmNi2pNjS0SqPjqZZNsbcxpq/bEOcZdysZG1lqi/QgxUevk57RWjh3EFsG\n" - "TwK3ougKWB5Q6/3m32dNsnnnDqzVapgZo7Zd3V/aCo0BVtL5VXZbAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key W28nwT/5FJ818M78y/5sNOkxhQ7ENBhjVhGG2j6KvFY=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AYf+rX8a5rzdTBGPvLdQIP8XcElDDQnJIruGqfDTj+tjAP+3XOL2UTmn\n" - "Hu39PbLZV+m9DIj/DvG38M0hP4MmHUjP/iZG5PaCX6/aMe+nQSNuTl0IDGpIo1l8\n" - "dZToQTFSzAQ=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "FWnEjvFob0ObgqohMT7miwGsAuioCT7Urz6tyWaGWph/TP9hbFWj4MPK5mt998mn\n" - "xA8zHSF5n/edu7wVX+rtnPrYPBmg+qN8+Pq6XMg64CwtWu+sqigsi6vtz/TfAIDL\n" - "mypENmSY32sWPvy/CA8dAZ2ASh57EH9a+WcFModpXkM=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 88YqJdGJS4O6XiUCNrc9xbOHxujvcN/TkCoRuQQeKfZGHM+4IhI6AcXFlPIfDYq0SAavMhVmzsDDw0ROl7vyCQ\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "cU4WDO3w9ZfVRbNUgxOQMbwS2xWXvaL+cZmIV6AAjAZVWkLEpif4g6uYu+jJUZOS\n" - "NUT7lNOMwTu4tE4b1YJpnD9T8iW0DlOXxlvRBMQYmKwhQuYk898BDGTSk+0AY0HJ\n" - "vv8wRVewDajNhW7tFY907IdHvPXG0u83GANxkYrRyUg=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_BAD_CERT2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN WOBBLY RUTABAGA-----\n" - "helo\n" - "-----END WOBBLY RUTABAGA-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANZvqyqFeiekh8ApqIGK4ZtOqjaX87EzDestvAWwamVOXiPoUrzXgM3O\n" - "l8uuTnMA4TfnjLyyA2TnaMzJylOI1OMHuW/D9B/liWDstSxWNNIlKgLQ/Dh9xBS7\n" - "uQb2PYlI+iMkPKPyJQSTDdGHE7cdFPewUfhRtJU3F5ztm/3FLBFvAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANZl8U/Z8KCPS7EBDzt8i9kNETXS7vnp9gnw3BQNXfjiDtDg9eO7ChxY\n" - "NBwuOTXmRxfX3W9kvZ0op9Hno6hixIhHzDql+vZ+hN7yPanVVDglSUXcr31yBm5K\n" - "kA+ZnRvH3oVQ97E4rRzpi09dtI13Pzu7JS5jRMtH+JF1kQBoNC0dAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key lUrEL+TVXpjjHQ2BIKk34vblyDmoyMro1a6/9hJ4VRc=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55Abm5E7FBdd3F8N1xuz/vdv03zh2lABrmGjzPQ3AFJtntALNeQTgjv0JL\n" - "jON4+SPNi0B2Bva3yKaSsdxiHQ1rIwQqIUVkzXmmX4jmsvJK/9gERAdD7GafTKZQ\n" - "BaZbNXBvmQw=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "OxkqFsw1vHUQ9iPYcKC/MHUBtbLPK6JY2i81ccAai2eW118UXcTbeCRccrXyqSkl\n" - "RLcooZyli1D6wg9x7O8+2+HXIbUa6WcTOD1Qi7Z9wKZfk4sDUy7QHKENMRfAXwX3\n" - "U/gqd4BflMPp4+XrYfPzz+6yQPWp0t9wXbFv5hZ9F3k=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 fW6Bt4R3xVk5KMDyOcYg8n5ANP0OrQq2PQFK2cW0lTAdi+eX+oT/BeWnkrn0uSWOC/t4omCmH4Rdl8M9xtpfBA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "DHxiQXuLxZR0ylqwUGGePgN4KF4ItlOV/DuGmmszCO/Ut0p+5s4FP2v6Mm9M92Wj\n" - "75rS9xF/Ts0Kf49dvgc+c5VTvhX5I5SwGQkRk0RNJtNoP0t+qXBHaFV8BlAeaWF6\n" - "Lg3O+GUK325fQv9uDPCe37mFQV9jafAzsZUrO/ggb1U=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_ED_BAD_CERT3[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "BVVVnf55AW5TTGF9jCMl7aALZzqypD9Bj8WYnAPIrKCoIJdgMbY0AQAgBAB7eCn8\n" - "rukx7t/egZUdqU7+FYqsnO4wdmOkLZkp0+gpF3jjk6N1Q0037NNVNZBjONB0Nm2F\n" - "CpB3nWSJliSSKr5tOYsuBPFy5VVGYeKPakpOoxanQ1UcqevMBAQy0zf9hwA=\n" - "-----END ED25519 CERT-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPgeQNbKwpnTU+qW/2djh66hptS9rcy1B4vdyWkDTdREao2ECuCv691Y\n" - "oIw3MpTWvpC1qHIKorunusR0FKgwXw3xQTikXbDq/1ptsekzoIA1R/hltQV3UuGH\n" - "zdzHuQXAMX7Fdll2gyya03c3Yq5s+xSDvGdkEeaIoctKjwxp4SdNAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOzWuH4cPW9rIrfi8MrruMUg4IUVHz4BxfY4/szMIUvzeEAdHn4FYkWy\n" - "Vt7MDtUELZsmZeFNmkn72kLxnrdZ5XhxZBriq1Fzq11cSWRBF+SyE1MdcouY4GyG\n" - "drw6T8xb8ty19q0eO6C/gw27iqXPAp1clvkroLg6Nv9lGZvsedVDAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key /vYZ+9yLqG7yUnutoI57s96JBl36GTz0IDWE244rbzE=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AZ4zVBWP/fIYEgWmyj0WpO6CkXRJjtrWXtiT02k3IddiAMpYgMemGIpN\n" - "xj7TQRULsHHYvo4fLcKrSgndQbUUhfLTUuVhIzbnE2TBLMVOEkpxKU6mTuvTT/3h\n" - "MJugrwTWVg4=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "c/Vqu3wtsTsYMdnhTS9Tn1Pq6jDmH4uRD5WmbaCKKrkin2DjuYSMVpypndkdlZDE\n" - "He7uF7SUO3QG/UcRIXYOsg9MSLUmvn2kIwef8ykyqlRh95Csjo5DyattUhL2w4QF\n" - "tJkJBQAnXWaAVW1O8XimGCAvJ84cxbmZEcpN6WKjrXI=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 Ue7bkPpOoc8ca7cyQj/Vq3BP5X4vwLA5QmpLGw/WfRNVRPojJRxU3RVqWMi3JbsJFRTe6pH6ZHyXER33G5aAAA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "ifKUtbxmqHVs8A0oT5n7Te0c6D/XqWQTc0RxX9OKGspzh6wNX26h0Xa2vpK1Q9Zu\n" - "sj61I7vbHuZN6rxiWs9IzJgb//XaNJasX1pd9tbGSXW+yYzc9G9kaa7vp3HcnhIP\n" - "XVWzzS8WmOiVNGcF65j6f7yGloTgN7cHMptgJG7pWes=\n" - "-----END SIGNATURE-----\n" - "\n" - ; -static const char EX_RI_BAD_EI_DIGEST2[] = - "router fred 127.0.0.1 9001 0 9002\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf55ATrK8IVBWLO2yXKCqXLXJOTu89W2b+hREPO+tCrxjVqWAQAgBACG/vVx\n" - "NK8wKVZvf34d75ZObSR0ge1N2RrAIKNslNXBq/tcllIrNE4S0ZNcMpA+hxXoVFeo\n" - "jbxifYX7nTs5N3GrGPmkiuo82v2X6ZwoIXJGFnvWMxCjsYsUVDDxoT6h/w8=\n" - "-----END ED25519 CERT-----\n" - "extra-info-digest E5FAC29E766D63F96AD175069640E803F2723765 99oo\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAK9wHSdRalxkuAybrSCA3dlEC1ZGc7oHOzXRGLg+z6batuiCdQtus1Rk\n" - "LP821eZJtEMAE56aewCIHDcTiCxVa6DMqmxRjm5pfW4G5H5QCPYT6Fu0RoYck3Ef\n" - "vkgits5/fNYGPPVC7k8AdGax5dKj5oFVGq+JWolYFRv6tyR9AThvAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKxjxTQ/T/MHpFbk7/zwA7l5b3IW3yVcyVe6eIGFoYun8FI0fbYRmR4M\n" - "G5Asu07gP9Bbgt3AFPuEqrjg4u+lIkgqTcCgKWJbAgm7fslwaDTXQ36A7I1M95PD\n" - "GJ10Dk5v4dVbrqwoF7MSrQPFtMO91RP11nGPSvDqXZJ4XpwqwdxpAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key LuVmHxpj4F5mPXGNi4MtxbIbLMav6frJRBsRgAvpdzo=\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf55AYb+9XE0rzApVm9/fh3vlk5tJHSB7U3ZGsAgo2yU1cGrAKBcSzwi4lY/\n" - "salCELOLdeZzOjDNnBd6cKp2WJg7Yz5zFlbVbyNk0iwfGmucHk8vQZe5BS0Oq/Pz\n" - "B1u/BcJv8gk=\n" - "-----END ED25519 CERT-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "QsAQVdDVHtasDbhrZG4ZxImdTTMY7fz3vouAiGyZx6/jCCB5v0gHwTn4xo6pgLEW\n" - "LQfMhQZIr76Ky67c0hAN2hihuDlfvhfVe9c2c5UOH1BOhq3llE3Hc3xGyEy3rw7r\n" - "5y38YGi759CvsP2/L8JfXMuBg89OcgJYFa27Q6e6MdQ=\n" - "-----END CROSSCERT-----\n" - "published 2014-10-05 12:00:00\n" - "bandwidth 1000 1000 1000\n" - "reject *:*\n" - "router-sig-ed25519 5zoQ0dufeeOJ/tE/BgcWgM8JpfW1ELSXLz4dI+K8YRH/gUtaPmYJgU2QfeUHD0oy1iwv4Qvl8Ferga7aBk1+DA\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "D6KRMwkb6JmVEnpZ825SD3LMB84UmVy0i94xk44OwhoWNKLXhaSTWJgf6AqnPG5o\n" - "QrCypSb44bYLn+VaDN5LVUl36jeZqCT4xd+4ZwIRdPOUj7vcVmyUDg3lXcAIk97Q\n" - "E5PrQY1mQuLSIjjKInAR2NRBumNJtRw31Y/DTB7tODU=\n" - "-----END SIGNATURE-----\n" - "\n" - ; diff --git a/src/tor/src/test/fakechans.h b/src/tor/src/test/fakechans.h deleted file mode 100644 index ab5d8461b..000000000 --- a/src/tor/src/test/fakechans.h +++ /dev/null @@ -1,25 +0,0 @@ - /* Copyright (c) 2014-2017, The Tor Project, Inc. */ - /* See LICENSE for licensing information */ - -#ifndef TOR_FAKECHANS_H -#define TOR_FAKECHANS_H - -/** - * \file fakechans.h - * \brief Declarations for fake channels for test suite use - */ - -void make_fake_cell(cell_t *c); -void make_fake_var_cell(var_cell_t *c); -channel_t * new_fake_channel(void); -void free_fake_channel(channel_t *c); - -/* Also exposes some a mock used by both test_channel.c and test_relay.c */ -void scheduler_channel_has_waiting_cells_mock(channel_t *ch); -void scheduler_release_channel_mock(channel_t *ch); - -/* Query some counters used by the exposed mocks */ -int get_mock_scheduler_has_waiting_cells_count(void); - -#endif /* !defined(TOR_FAKECHANS_H) */ - diff --git a/src/tor/src/test/fuzz/dict/consensus b/src/tor/src/test/fuzz/dict/consensus deleted file mode 100644 index 3fcd9ee7f..000000000 --- a/src/tor/src/test/fuzz/dict/consensus +++ /dev/null @@ -1,52 +0,0 @@ -"a" -"additional-digest" -"additional-signature" -"bandwidth-weights" -"client-versions" -"consensus-digest" -"consensus-method" -"consensus-methods" -"contact" -"dir-address" -"directory-footer" -"directory-signature" -"dir-identity-key" -"dir-key-certificate-version" -"dir-key-certification" -"dir-key-crosscert" -"dir-key-expires" -"dir-key-published" -"dir-signing-key" -"dir-source" -"fingerprint" -"fresh-until" -"id" -"known-flags" -"legacy-dir-key" -"m" -"network-status-version" -"opt" -"p" -"package" -"params" -"pr" -"published" -"r" -"recommended-client-protocols" -"recommended-relay-protocols" -"required-client-protocols" -"required-relay-protocols" -"s" -"server-versions" -"shared-rand-commit" -"shared-rand-current-value" -"shared-rand-participate" -"shared-rand-previous-value" -"signing-ed25519" -"v" -"valid-after" -"valid-until" -"vote-digest" -"vote-status" -"voting-delay" -"w" diff --git a/src/tor/src/test/fuzz/dict/descriptor b/src/tor/src/test/fuzz/dict/descriptor deleted file mode 100644 index 110ee3e82..000000000 --- a/src/tor/src/test/fuzz/dict/descriptor +++ /dev/null @@ -1,41 +0,0 @@ -"reject" -"accept" -"reject6" -"accept6" -"router" -"ipv6-policy" -"signing-key" -"onion-key" -"ntor-onion-key" -"router-signature" -"published" -"uptime" -"fingerprint" -"hibernating" -"platform" -"proto" -"contact" -"read-history" -"write-history" -"extra-info-digest" -"hidden-service-dir" -"identity-ed25519" -"master-key-ed25519" -"router-sig-ed25519" -"onion-key-crosscert" -"ntor-onion-key-crosscert" -"allow-single-hop-exits" -"family" -"caches-extra-info" -"or-address" -"opt" - "bandwidth" -"@purpose" -"tunnelled-dir-server" -"-----BEGIN" -"-----END" -"-----" -"ED25519 CERT" -"RSA PUBLIC KEY" -"CROSSCERT" -"SIGNATURE" diff --git a/src/tor/src/test/fuzz/dict/extrainfo b/src/tor/src/test/fuzz/dict/extrainfo deleted file mode 100644 index eba7a1e4c..000000000 --- a/src/tor/src/test/fuzz/dict/extrainfo +++ /dev/null @@ -1,32 +0,0 @@ -"cell-circuits-per-decile" -"cell-processed-cells" -"cell-queued-cells" -"cell-stats-end" -"cell-time-in-queue" -"dirreq-stats-end" -"dirreq-v2-direct-dl" -"dirreq-v2-ips" -"dirreq-v2-reqs" -"dirreq-v2-resp" -"dirreq-v2-share" -"dirreq-v2-tunneled-dl" -"dirreq-v3-direct-dl" -"dirreq-v3-ips" -"dirreq-v3-reqs" -"dirreq-v3-resp" -"dirreq-v3-share" -"dirreq-v3-tunneled-dl" -"entry-ips" -"entry-stats-end" -"exit-kibibytes-read" -"exit-kibibytes-written" -"exit-stats-end" -"exit-streams-opened" -"extra-info" -"identity-ed25519" -"opt" -"published" -"read-history" -"router-sig-ed25519" -"router-signature" -"write-history" diff --git a/src/tor/src/test/fuzz/dict/hsdescv2 b/src/tor/src/test/fuzz/dict/hsdescv2 deleted file mode 100644 index 48788301d..000000000 --- a/src/tor/src/test/fuzz/dict/hsdescv2 +++ /dev/null @@ -1,8 +0,0 @@ -"introduction-points" -"permanent-key" -"protocol-versions" -"publication-time" -"rendezvous-service-descriptor" -"secret-id-part" -"signature" -"version" diff --git a/src/tor/src/test/fuzz/dict/hsdescv3 b/src/tor/src/test/fuzz/dict/hsdescv3 deleted file mode 100644 index 84e8db578..000000000 --- a/src/tor/src/test/fuzz/dict/hsdescv3 +++ /dev/null @@ -1,6 +0,0 @@ -"hs-descriptor" -"descriptor-lifetime" -"descriptor-signing-key-cert" -"revision-counter" -"superencrypted" -"signature" diff --git a/src/tor/src/test/fuzz/dict/http b/src/tor/src/test/fuzz/dict/http deleted file mode 100644 index 3b0531579..000000000 --- a/src/tor/src/test/fuzz/dict/http +++ /dev/null @@ -1,24 +0,0 @@ -# -# AFL dictionary for the Tor Directory protocol's HTTP headers -# ------------------------------------------------------------ -# -# Extracted from directory_handle_command() in the tor source code -# -# Copyright (c) 2016-2017, The Tor Project, Inc. -# See LICENSE for licensing information -# -# Usage: -# Select the dictionaries relevant to the part of the directory protocol you -# are fuzzing, and feed them to your fuzzer (if it supports dictionaries). - -http_header_body_delimiter = "\x0d\x0a\x0d\x0a" -http_header_header_delimiter = "\x0d\x0a" -# multi-character tokens only -#http_header_value_delimiter = " " - -content_length_header = "Content-Length:" -forwarded_for_header = "Forwarded-For:" -x_forwarded_for_header = "X-Forwarded-For:" - -get_command = "GET" -post_command = "POST" diff --git a/src/tor/src/test/fuzz/dict/iptsv2 b/src/tor/src/test/fuzz/dict/iptsv2 deleted file mode 100644 index 57791c5e3..000000000 --- a/src/tor/src/test/fuzz/dict/iptsv2 +++ /dev/null @@ -1,6 +0,0 @@ -"introduction-point" -"ip-address" -"onion-port" -"onion-key" -"service-key" - diff --git a/src/tor/src/test/fuzz/dict/microdesc b/src/tor/src/test/fuzz/dict/microdesc deleted file mode 100644 index fdd0567b6..000000000 --- a/src/tor/src/test/fuzz/dict/microdesc +++ /dev/null @@ -1,7 +0,0 @@ -"onion-key" -"ntor-onion-key" -"id" -"a" -"family" -"p" -"p6" diff --git a/src/tor/src/test/fuzz/fixup_filenames.sh b/src/tor/src/test/fuzz/fixup_filenames.sh deleted file mode 100644 index 68efc1abc..000000000 --- a/src/tor/src/test/fuzz/fixup_filenames.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -set -e - -if [ ! -d "$1" ] ; then - echo "I need a directory" - exit 1 -fi - -for fn in "$1"/* ; do - prev=`basename "$fn"` - post=`sha256sum "$fn" | sed -e 's/ .*//;'` - if [ "$prev" == "$post" ] ; then - echo "OK $prev" - else - echo "mv $prev $post" - mv "$fn" "$1/$post" - fi -done diff --git a/src/tor/src/test/fuzz/fuzz_consensus.c b/src/tor/src/test/fuzz/fuzz_consensus.c deleted file mode 100644 index 6610ade7a..000000000 --- a/src/tor/src/test/fuzz/fuzz_consensus.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "networkstatus.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -static int -mock_router_produce_hash_final__nohash(char *digest, - const char *start, size_t len, - digest_algorithm_t alg) -{ - (void)start; - (void)len; - /* we could look at start[..] */ - if (alg == DIGEST_SHA1) - memset(digest, 0x01, 20); - else - memset(digest, 0x02, 32); - return 0; -} - -static int -mock_signed_digest_equals__yes(const uint8_t *d1, const uint8_t *d2, - size_t len) -{ - (void) tor_memeq(d1, d2, len); - return 1; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); - MOCK(signed_digest_equals, mock_signed_digest_equals__yes); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - networkstatus_t *ns; - char *str = tor_memdup_nulterm(data, sz); - const char *eos = NULL; - networkstatus_type_t tp = NS_TYPE_CONSENSUS; - if (tor_memstr(data, MIN(sz, 1024), "tus vote")) - tp = NS_TYPE_VOTE; - const char *what = (tp == NS_TYPE_CONSENSUS) ? "consensus" : "vote"; - ns = networkstatus_parse_vote_from_string(str, - &eos, - tp); - if (ns) { - log_debug(LD_GENERAL, "Parsing as %s okay", what); - networkstatus_vote_free(ns); - } else { - log_debug(LD_GENERAL, "Parsing as %s failed", what); - } - tor_free(str); - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_descriptor.c b/src/tor/src/test/fuzz/fuzz_descriptor.c deleted file mode 100644 index 1a50beae1..000000000 --- a/src/tor/src/test/fuzz/fuzz_descriptor.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "routerlist.h" -#include "routerkeys.h" -#include "fuzzing.h" - -static int -mock_check_tap_onion_key_crosscert__nocheck(const uint8_t *crosscert, - int crosscert_len, - const crypto_pk_t *onion_pkey, - const ed25519_public_key_t *master_id_pkey, - const uint8_t *rsa_id_digest) -{ - tor_assert(crosscert && onion_pkey && master_id_pkey && rsa_id_digest); - /* we could look at crosscert[..] */ - (void) crosscert_len; - return 0; -} - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -static int -mock_router_produce_hash_final__nohash(char *digest, - const char *start, size_t len, - digest_algorithm_t alg) -{ - (void)start; - (void)len; - /* we could look at start[..] */ - if (alg == DIGEST_SHA1) - memset(digest, 0x01, 20); - else - memset(digest, 0x02, 32); - return 0; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(check_tap_onion_key_crosscert, - mock_check_tap_onion_key_crosscert__nocheck); - MOCK(dump_desc, mock_dump_desc__nodump); - MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - routerinfo_t *ri; - const char *str = (const char*) data; - ri = router_parse_entry_from_string((const char *)str, - str+sz, - 0, 0, 0, NULL); - if (ri) { - log_debug(LD_GENERAL, "Parsing okay"); - routerinfo_free(ri); - } else { - log_debug(LD_GENERAL, "Parsing failed"); - } - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_diff.c b/src/tor/src/test/fuzz/fuzz_diff.c deleted file mode 100644 index 642380b51..000000000 --- a/src/tor/src/test/fuzz/fuzz_diff.c +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONSDIFF_PRIVATE - -#include "orconfig.h" -#include "or.h" -#include "consdiff.h" - -#include "fuzzing.h" - -static int -mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) -{ - (void)c; - memset(d->sha3_256, 3, sizeof(d->sha3_256)); - return 0; -} - -int -fuzz_init(void) -{ - MOCK(consensus_compute_digest, mock_consensus_compute_digest_); - MOCK(consensus_compute_digest_as_signed, mock_consensus_compute_digest_); - return 0; -} - -int -fuzz_cleanup(void) -{ - UNMOCK(consensus_compute_digest); - UNMOCK(consensus_compute_digest_as_signed); - return 0; -} - -int -fuzz_main(const uint8_t *stdin_buf, size_t data_size) -{ -#define SEP "=====\n" -#define SEPLEN strlen(SEP) - const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); - if (! separator) - return 0; - size_t c1_len = separator - stdin_buf; - char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); - size_t c2_len = data_size - c1_len - SEPLEN; - char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); - - char *c3 = consensus_diff_generate(c1, c2); - - if (c3) { - char *c4 = consensus_diff_apply(c1, c3); - tor_assert(c4); - if (strcmp(c2, c4)) { - printf("%s\n", escaped(c1)); - printf("%s\n", escaped(c2)); - printf("%s\n", escaped(c3)); - printf("%s\n", escaped(c4)); - } - tor_assert(! strcmp(c2, c4)); - tor_free(c3); - tor_free(c4); - } - tor_free(c1); - tor_free(c2); - - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_diff_apply.c b/src/tor/src/test/fuzz/fuzz_diff_apply.c deleted file mode 100644 index 8d7bf751b..000000000 --- a/src/tor/src/test/fuzz/fuzz_diff_apply.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONSDIFF_PRIVATE - -#include "orconfig.h" -#include "or.h" -#include "consdiff.h" - -#include "fuzzing.h" - -static int -mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) -{ - (void)c; - memset(d->sha3_256, 3, sizeof(d->sha3_256)); - return 0; -} - -static int -mock_consensus_digest_eq_(const uint8_t *a, const uint8_t *b) -{ - (void)a; - (void)b; - return 1; -} - -int -fuzz_init(void) -{ - MOCK(consensus_compute_digest, mock_consensus_compute_digest_); - MOCK(consensus_digest_eq, mock_consensus_digest_eq_); - return 0; -} - -int -fuzz_cleanup(void) -{ - UNMOCK(consensus_compute_digest); - UNMOCK(consensus_digest_eq); - return 0; -} - -int -fuzz_main(const uint8_t *stdin_buf, size_t data_size) -{ -#define SEP "=====\n" -#define SEPLEN strlen(SEP) - const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); - if (! separator) - return 0; - size_t c1_len = separator - stdin_buf; - char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); - size_t c2_len = data_size - c1_len - SEPLEN; - char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); - - char *c3 = consensus_diff_apply(c1, c2); - - tor_free(c1); - tor_free(c2); - tor_free(c3); - - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_extrainfo.c b/src/tor/src/test/fuzz/fuzz_extrainfo.c deleted file mode 100644 index 2a3de7ecf..000000000 --- a/src/tor/src/test/fuzz/fuzz_extrainfo.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "routerlist.h" -#include "routerkeys.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -static int -mock_router_produce_hash_final__nohash(char *digest, - const char *start, size_t len, - digest_algorithm_t alg) -{ - (void)start; - (void)len; - /* we could look at start[..] */ - if (alg == DIGEST_SHA1) - memset(digest, 0x01, 20); - else - memset(digest, 0x02, 32); - return 0; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - MOCK(router_compute_hash_final, mock_router_produce_hash_final__nohash); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - extrainfo_t *ei; - const char *str = (const char*) data; - int again = 0; - ei = extrainfo_parse_entry_from_string((const char *)str, - str+sz, - 0, NULL, &again); - if (ei) { - log_debug(LD_GENERAL, "Parsing okay"); - extrainfo_free(ei); - } else { - log_debug(LD_GENERAL, "Parsing failed"); - } - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_hsdescv2.c b/src/tor/src/test/fuzz/fuzz_hsdescv2.c deleted file mode 100644 index 19db26571..000000000 --- a/src/tor/src/test/fuzz/fuzz_hsdescv2.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "rendcommon.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - rend_service_descriptor_t *desc = NULL; - char desc_id[64]; - char *ipts = NULL; - size_t ipts_size, esize; - const char *next; - char *str = tor_memdup_nulterm(data, sz); - (void) rend_parse_v2_service_descriptor(&desc, desc_id, &ipts, &ipts_size, - &esize, &next, str, 1); - if (desc) { - log_debug(LD_GENERAL, "Parsing okay"); - rend_service_descriptor_free(desc); - } else { - log_debug(LD_GENERAL, "Parsing failed"); - } - tor_free(ipts); - tor_free(str); - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_hsdescv3.c b/src/tor/src/test/fuzz/fuzz_hsdescv3.c deleted file mode 100644 index 428774e33..000000000 --- a/src/tor/src/test/fuzz/fuzz_hsdescv3.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define ROUTERPARSE_PRIVATE -#define HS_DESCRIPTOR_PRIVATE - -#include "or.h" -#include "ed25519_cert.h" /* Trunnel interface. */ -#include "crypto_ed25519.h" -#include "hs_descriptor.h" -#include "routerparse.h" -#include "util.h" - -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -static int -mock_rsa_ed25519_crosscert_check(const uint8_t *crosscert, - const size_t crosscert_len, - const crypto_pk_t *rsa_id_key, - const ed25519_public_key_t *master_key, - const time_t reject_if_expired_before) -{ - (void) crosscert; - (void) crosscert_len; - (void) rsa_id_key; - (void) master_key; - (void) reject_if_expired_before; - return 0; -} - -static size_t -mock_decrypt_desc_layer(const hs_descriptor_t *desc, - const uint8_t *encrypted_blob, - size_t encrypted_blob_size, - int is_superencrypted_layer, - char **decrypted_out) -{ - (void)is_superencrypted_layer; - (void)desc; - const size_t overhead = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN; - if (encrypted_blob_size < overhead) - return 0; - *decrypted_out = tor_memdup_nulterm( - encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN, - encrypted_blob_size - overhead); - size_t result = strlen(*decrypted_out); - if (result) { - return result; - } else { - tor_free(*decrypted_out); - return 0; - } -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - MOCK(rsa_ed25519_crosscert_check, mock_rsa_ed25519_crosscert_check); - MOCK(decrypt_desc_layer, mock_decrypt_desc_layer); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - hs_descriptor_t *desc = NULL; - uint8_t subcredential[DIGEST256_LEN]; - - char *fuzzing_data = tor_memdup_nulterm(data, sz); - memset(subcredential, 'A', sizeof(subcredential)); - - hs_desc_decode_descriptor(fuzzing_data, subcredential, &desc); - if (desc) { - log_debug(LD_GENERAL, "Decoding okay"); - hs_descriptor_free(desc); - } else { - log_debug(LD_GENERAL, "Decoding failed"); - } - - tor_free(fuzzing_data); - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_http.c b/src/tor/src/test/fuzz/fuzz_http.c deleted file mode 100644 index 2ffeb6024..000000000 --- a/src/tor/src/test/fuzz/fuzz_http.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define BUFFERS_PRIVATE -#define DIRECTORY_PRIVATE - -#include "or.h" -#include "backtrace.h" -#include "buffers.h" -#include "config.h" -#include "connection.h" -#include "directory.h" -#include "torlog.h" - -#include "fuzzing.h" - -static void -mock_connection_write_to_buf_impl_(const char *string, size_t len, - connection_t *conn, int compressed) -{ - log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", - compressed ? "Compressed " : "", (unsigned)len, conn, string); -} - -static int -mock_directory_handle_command_get(dir_connection_t *conn, - const char *headers, - const char *body, - size_t body_len) -{ - (void)conn; - - log_debug(LD_GENERAL, "Method:\nGET\n"); - - if (headers) { - log_debug(LD_GENERAL, "Header-Length:\n%u\n", (unsigned)strlen(headers)); - log_debug(LD_GENERAL, "Headers:\n%s\n", headers); - } - - log_debug(LD_GENERAL, "Body-Length:\n%u\n", (unsigned)body_len); - if (body) { - log_debug(LD_GENERAL, "Body:\n%s\n", body); - } - - /* Always tell the caller we succeeded */ - return 0; -} - -static int -mock_directory_handle_command_post(dir_connection_t *conn, - const char *headers, - const char *body, - size_t body_len) -{ - (void)conn; - - log_debug(LD_GENERAL, "Method:\nPOST\n"); - - if (headers) { - log_debug(LD_GENERAL, "Header-Length:\n%u\n", (unsigned)strlen(headers)); - log_debug(LD_GENERAL, "Headers:\n%s\n", headers); - } - - log_debug(LD_GENERAL, "Body-Length:\n%u\n", (unsigned)body_len); - if (body) { - log_debug(LD_GENERAL, "Body:\n%s\n", body); - } - - /* Always tell the caller we succeeded */ - return 0; -} - -int -fuzz_init(void) -{ - /* Set up fake response handler */ - MOCK(connection_write_to_buf_impl_, mock_connection_write_to_buf_impl_); - /* Set up the fake handler functions */ - MOCK(directory_handle_command_get, mock_directory_handle_command_get); - MOCK(directory_handle_command_post, mock_directory_handle_command_post); - - return 0; -} - -int -fuzz_cleanup(void) -{ - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(directory_handle_command_get); - UNMOCK(directory_handle_command_post); - return 0; -} - -int -fuzz_main(const uint8_t *stdin_buf, size_t data_size) -{ - dir_connection_t dir_conn; - - /* Set up the fake connection */ - memset(&dir_conn, 0, sizeof(dir_connection_t)); - dir_conn.base_.type = CONN_TYPE_DIR; - /* Apparently tor sets this before directory_handle_command() is called. */ - dir_conn.base_.address = tor_strdup("replace-this-address.example.com"); - - dir_conn.base_.inbuf = buf_new_with_data((char*)stdin_buf, data_size); - if (!dir_conn.base_.inbuf) { - log_debug(LD_GENERAL, "Zero-Length-Input\n"); - goto done; - } - - /* Parse the headers */ - int rv = directory_handle_command(&dir_conn); - - /* TODO: check the output is correctly parsed based on the input */ - - /* Report the parsed origin address */ - if (dir_conn.base_.address) { - log_debug(LD_GENERAL, "Address:\n%s\n", dir_conn.base_.address); - } - - log_debug(LD_GENERAL, "Result:\n%d\n", rv); - - done: - /* Reset. */ - tor_free(dir_conn.base_.address); - buf_free(dir_conn.base_.inbuf); - dir_conn.base_.inbuf = NULL; - - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_http_connect.c b/src/tor/src/test/fuzz/fuzz_http_connect.c deleted file mode 100644 index dc674070b..000000000 --- a/src/tor/src/test/fuzz/fuzz_http_connect.c +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define BUFFERS_PRIVATE -#define CONNECTION_EDGE_PRIVATE - -#include "or.h" -#include "backtrace.h" -#include "buffers.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "proto_socks.h" -#include "torlog.h" - -#include "fuzzing.h" - -static void -mock_connection_write_to_buf_impl_(const char *string, size_t len, - connection_t *conn, int compressed) -{ - log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", - compressed ? "Compressed " : "", (unsigned)len, conn, string); -} - -static void -mock_connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, - int line, const char *file) -{ - (void)conn; - (void)endreason; - (void)line; - (void)file; -} - -static int -mock_connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) -{ - (void)conn; - (void)circ; - (void)cpath; - return 0; -} - -int -fuzz_init(void) -{ - /* Set up fake response handler */ - MOCK(connection_write_to_buf_impl_, mock_connection_write_to_buf_impl_); - /* Set up the fake handler functions */ - MOCK(connection_mark_unattached_ap_, mock_connection_mark_unattached_ap_); - MOCK(connection_ap_rewrite_and_attach_if_allowed, - mock_connection_ap_rewrite_and_attach_if_allowed); - - return 0; -} - -int -fuzz_cleanup(void) -{ - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(connection_mark_unattached_ap_); - UNMOCK(connection_ap_rewrite_and_attach_if_allowed); - return 0; -} - -int -fuzz_main(const uint8_t *stdin_buf, size_t data_size) -{ - entry_connection_t conn; - - /* Set up the fake connection */ - memset(&conn, 0, sizeof(conn)); - conn.edge_.base_.type = CONN_TYPE_AP; - conn.edge_.base_.state = AP_CONN_STATE_HTTP_CONNECT_WAIT; - conn.socks_request = tor_malloc_zero(sizeof(socks_request_t)); - conn.socks_request->listener_type = CONN_TYPE_AP_HTTP_CONNECT_LISTENER; - - conn.edge_.base_.inbuf = buf_new_with_data((char*)stdin_buf, data_size); - if (!conn.edge_.base_.inbuf) { - log_debug(LD_GENERAL, "Zero-Length-Input\n"); - goto done; - } - - /* Parse the headers */ - int rv = connection_ap_process_http_connect(&conn); - - /* TODO: check the output is correctly parsed based on the input */ - - log_debug(LD_GENERAL, "Result:\n%d\n", rv); - - goto done; - - done: - /* Reset. */ - socks_request_free(conn.socks_request); - buf_free(conn.edge_.base_.inbuf); - conn.edge_.base_.inbuf = NULL; - - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_iptsv2.c b/src/tor/src/test/fuzz/fuzz_iptsv2.c deleted file mode 100644 index 4abde0c16..000000000 --- a/src/tor/src/test/fuzz/fuzz_iptsv2.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "rendcommon.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - rend_service_descriptor_t *desc = - tor_malloc_zero(sizeof(rend_service_descriptor_t)); - const char *str = (const char*) data; - int r = rend_parse_introduction_points(desc, str, sz); - if (r >= 0) { - log_debug(LD_GENERAL, "Parsing okay: %d", r); - } else { - log_debug(LD_GENERAL, "Parsing failed"); - } - rend_service_descriptor_free(desc); - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_microdesc.c b/src/tor/src/test/fuzz/fuzz_microdesc.c deleted file mode 100644 index 396115026..000000000 --- a/src/tor/src/test/fuzz/fuzz_microdesc.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "microdesc.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - ed25519_init(); - return 0; -} - -int -fuzz_cleanup(void) -{ - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - const char *str = (const char*) data; - smartlist_t *result = microdescs_parse_from_string((const char *)str, - str+sz, - 0, SAVED_NOWHERE, NULL); - if (result) { - log_debug(LD_GENERAL, "Parsing okay: %d", smartlist_len(result)); - SMARTLIST_FOREACH(result, microdesc_t *, md, microdesc_free(md)); - smartlist_free(result); - } else { - log_debug(LD_GENERAL, "Parsing failed"); - } - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzz_multi.sh b/src/tor/src/test/fuzz/fuzz_multi.sh deleted file mode 100644 index b4a17ed8c..000000000 --- a/src/tor/src/test/fuzz/fuzz_multi.sh +++ /dev/null @@ -1,34 +0,0 @@ -MEMLIMIT_BYTES=21990500990976 - -N_CPUS=1 -if [ $# -ge 1 ]; then - N_CPUS="$1" - shift -fi - -FILTER=echo - -for i in `seq -w "$N_CPUS"`; do - if [ "$i" -eq 1 ]; then - if [ "$N_CPUS" -eq 1 ]; then - INSTANCE="" - NUMBER="" - else - INSTANCE="-M" - NUMBER="$i" - fi - else - INSTANCE="-S" - NUMBER="$i" - fi - # use whatever remains on the command-line to prefix the fuzzer command - # you have to copy and paste and run these commands yourself - "$FILTER" "$@" \ - ../afl/afl-fuzz \ - -i src/test/fuzz/fuzz_dir_testcase \ - -o src/test/fuzz/fuzz_dir_findings \ - -x src/test/fuzz/fuzz_dir_dictionary/fuzz_dir_http_header.dct \ - -m "$MEMLIMIT_BYTES" \ - "$INSTANCE" "$NUMBER" \ - -- src/test/fuzz_dir -done diff --git a/src/tor/src/test/fuzz/fuzz_vrs.c b/src/tor/src/test/fuzz/fuzz_vrs.c deleted file mode 100644 index baf0610a0..000000000 --- a/src/tor/src/test/fuzz/fuzz_vrs.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define ROUTERPARSE_PRIVATE -#define NETWORKSTATUS_PRIVATE -#include "or.h" -#include "routerparse.h" -#include "memarea.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "fuzzing.h" - -static void -mock_dump_desc__nodump(const char *desc, const char *type) -{ - (void)desc; - (void)type; -} - -static networkstatus_t *dummy_vote = NULL; -static memarea_t *area = NULL; - -int -fuzz_init(void) -{ - disable_signature_checking(); - MOCK(dump_desc, mock_dump_desc__nodump); - ed25519_init(); - area = memarea_new(); - dummy_vote = tor_malloc_zero(sizeof(*dummy_vote)); - dummy_vote->known_flags = smartlist_new(); - smartlist_split_string(dummy_vote->known_flags, - "Authority BadExit Exit Fast Guard HSDir " - "NoEdConsensus Running Stable V2Dir Valid", - " ", 0, 0); - return 0; -} - -int -fuzz_cleanup(void) -{ - SMARTLIST_FOREACH(dummy_vote->known_flags, char *, cp, tor_free(cp)); - smartlist_free(dummy_vote->known_flags); - tor_free(dummy_vote); - return 0; -} - -int -fuzz_main(const uint8_t *data, size_t sz) -{ - char *str = tor_memdup_nulterm(data, sz); - const char *s; - routerstatus_t *rs_ns = NULL, *rs_md = NULL, *rs_vote = NULL; - vote_routerstatus_t *vrs = tor_malloc_zero(sizeof(*vrs)); - smartlist_t *tokens = smartlist_new(); - - s = str; - rs_ns = routerstatus_parse_entry_from_string(area, &s, tokens, - NULL, NULL, 26, FLAV_NS); - tor_assert(smartlist_len(tokens) == 0); - - s = str; - rs_md = routerstatus_parse_entry_from_string(area, &s, tokens, - NULL, NULL, 26, FLAV_MICRODESC); - tor_assert(smartlist_len(tokens) == 0); - - s = str; - rs_vote = routerstatus_parse_entry_from_string(area, &s, tokens, - dummy_vote, vrs, 26, FLAV_NS); - tor_assert(smartlist_len(tokens) == 0); - - log_debug(LD_GENERAL, - "ns=%p, md=%p, vote=%p", rs_ns, rs_md, rs_vote); - - routerstatus_free(rs_md); - routerstatus_free(rs_ns); - vote_routerstatus_free(vrs); - memarea_clear(area); - smartlist_free(tokens); - tor_free(str); - return 0; -} - diff --git a/src/tor/src/test/fuzz/fuzzing.h b/src/tor/src/test/fuzz/fuzzing.h deleted file mode 100644 index aecdbb4e5..000000000 --- a/src/tor/src/test/fuzz/fuzzing.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#ifndef FUZZING_H -#define FUZZING_H - -int fuzz_init(void); -int fuzz_cleanup(void); -int fuzz_main(const uint8_t *data, size_t sz); - -void disable_signature_checking(void); - -#endif /* FUZZING_H */ - diff --git a/src/tor/src/test/fuzz/fuzzing_common.c b/src/tor/src/test/fuzz/fuzzing_common.c deleted file mode 100644 index 1d54e41db..000000000 --- a/src/tor/src/test/fuzz/fuzzing_common.c +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define CRYPTO_ED25519_PRIVATE -#include "orconfig.h" -#include "or.h" -#include "backtrace.h" -#include "config.h" -#include "fuzzing.h" -#include "crypto.h" -#include "crypto_ed25519.h" - -static or_options_t *mock_options = NULL; -static const or_options_t * -mock_get_options(void) -{ - return mock_options; -} - -static int -mock_crypto_pk_public_checksig__nocheck(const crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen) -{ - tor_assert(env && to && from); - (void)fromlen; - /* We could look at from[0..fromlen-1] ... */ - tor_assert(tolen >= crypto_pk_keysize(env)); - size_t siglen = MIN(20, crypto_pk_keysize(env)); - memset(to, 0x01, siglen); - return (int)siglen; -} - -static int -mock_crypto_pk_public_checksig_digest__nocheck(crypto_pk_t *env, - const char *data, - size_t datalen, - const char *sig, - size_t siglen) -{ - tor_assert(env && data && sig); - (void)datalen; - (void)siglen; - /* We could look at data[..] and sig[..] */ - return 0; -} - -static int -mock_ed25519_checksig__nocheck(const ed25519_signature_t *signature, - const uint8_t *msg, size_t len, - const ed25519_public_key_t *pubkey) -{ - tor_assert(signature && msg && pubkey); - /* We could look at msg[0..len-1] ... */ - (void)len; - return 0; -} - -static int -mock_ed25519_checksig_batch__nocheck(int *okay_out, - const ed25519_checkable_t *checkable, - int n_checkable) -{ - tor_assert(checkable); - int i; - for (i = 0; i < n_checkable; ++i) { - /* We could look at messages and signatures XXX */ - tor_assert(checkable[i].pubkey); - tor_assert(checkable[i].msg); - if (okay_out) - okay_out[i] = 1; - } - return 0; -} - -static int -mock_ed25519_impl_spot_check__nocheck(void) -{ - return 0; -} - -void -disable_signature_checking(void) -{ - MOCK(crypto_pk_public_checksig, - mock_crypto_pk_public_checksig__nocheck); - MOCK(crypto_pk_public_checksig_digest, - mock_crypto_pk_public_checksig_digest__nocheck); - MOCK(ed25519_checksig, mock_ed25519_checksig__nocheck); - MOCK(ed25519_checksig_batch, mock_ed25519_checksig_batch__nocheck); - MOCK(ed25519_impl_spot_check, mock_ed25519_impl_spot_check__nocheck); -} - -static void -global_init(void) -{ - tor_threads_init(); - tor_compress_init(); - { - struct sipkey sipkey = { 1337, 7331 }; - siphash_set_global_key(&sipkey); - } - - /* Initialise logging first */ - init_logging(1); - configure_backtrace_handler(get_version()); - - /* set up the options. */ - mock_options = tor_malloc_zero(sizeof(or_options_t)); - MOCK(get_options, mock_get_options); - - /* Make BUG() and nonfatal asserts crash */ - tor_set_failed_assertion_callback(abort); -} - -#ifdef LLVM_FUZZ -int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); -int -LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) -{ - static int initialized = 0; - if (!initialized) { - global_init(); - if (fuzz_init() < 0) - abort(); - initialized = 1; - } - - return fuzz_main(Data, Size); -} - -#else /* Not LLVM_FUZZ, so AFL. */ - -int -main(int argc, char **argv) -{ - size_t size; - - global_init(); - - /* Disable logging by default to speed up fuzzing. */ - int loglevel = LOG_ERR; - - for (int i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "--warn")) { - loglevel = LOG_WARN; - } else if (!strcmp(argv[i], "--notice")) { - loglevel = LOG_NOTICE; - } else if (!strcmp(argv[i], "--info")) { - loglevel = LOG_INFO; - } else if (!strcmp(argv[i], "--debug")) { - loglevel = LOG_DEBUG; - } - } - - { - log_severity_list_t s; - memset(&s, 0, sizeof(s)); - set_log_severity_config(loglevel, LOG_ERR, &s); - /* ALWAYS log bug warnings. */ - s.masks[LOG_WARN-LOG_ERR] |= LD_BUG; - add_stream_log(&s, "", fileno(stdout)); - } - - if (fuzz_init() < 0) - abort(); - -#ifdef __AFL_HAVE_MANUAL_CONTROL - /* Tell AFL to pause and fork here - ignored if not using AFL */ - __AFL_INIT(); -#endif - -#define MAX_FUZZ_SIZE (128*1024) - char *input = read_file_to_str_until_eof(0, MAX_FUZZ_SIZE, &size); - tor_assert(input); - char *raw = tor_memdup(input, size); /* Because input is nul-terminated */ - tor_free(input); - fuzz_main((const uint8_t*)raw, size); - tor_free(raw); - - if (fuzz_cleanup() < 0) - abort(); - - tor_free(mock_options); - UNMOCK(get_options); - return 0; -} - -#endif - diff --git a/src/tor/src/test/fuzz/include.am b/src/tor/src/test/fuzz/include.am deleted file mode 100644 index cd16dc05b..000000000 --- a/src/tor/src/test/fuzz/include.am +++ /dev/null @@ -1,351 +0,0 @@ -# This file was generated by fuzzing_include_am.py; do not hand-edit unless -# you enjoy having your changes erased. -FUZZING_CPPFLAGS = \ - $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) -FUZZING_CFLAGS = \ - $(AM_CFLAGS) $(TEST_CFLAGS) -FUZZING_LDFLAG = \ - @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ -FUZZING_LIBS = \ - src/or/libtor-testing.a \ - src/common/libor-crypto-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/trunnel/libor-trunnel-testing.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ \ - @TOR_LZMA_LIBS@ \ - @TOR_ZSTD_LIBS@ - -oss-fuzz-prereqs: \ - src/or/libtor-testing.a \ - src/common/libor-crypto-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/trunnel/libor-trunnel-testing.a - -noinst_HEADERS += \ - src/test/fuzz/fuzzing.h - -LIBFUZZER = -lFuzzer -LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) -LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ - -LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) - -# ===== AFL fuzzers -src_test_fuzz_fuzz_consensus_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_consensus.c -src_test_fuzz_fuzz_consensus_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_consensus_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_consensus_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_consensus_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_descriptor_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_descriptor.c -src_test_fuzz_fuzz_descriptor_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_descriptor_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_descriptor_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_descriptor_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_diff_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_diff.c -src_test_fuzz_fuzz_diff_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_diff_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_diff_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_diff_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_diff_apply_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_diff_apply.c -src_test_fuzz_fuzz_diff_apply_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_diff_apply_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_diff_apply_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_diff_apply_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_extrainfo_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_extrainfo.c -src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_hsdescv2_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_hsdescv2.c -src_test_fuzz_fuzz_hsdescv2_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_hsdescv2_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_hsdescv2_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_hsdescv2_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_hsdescv3_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_hsdescv3.c -src_test_fuzz_fuzz_hsdescv3_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_hsdescv3_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_hsdescv3_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_hsdescv3_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_http_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_http.c -src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_http_connect_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_http_connect.c -src_test_fuzz_fuzz_http_connect_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_http_connect_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_http_connect_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_http_connect_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_iptsv2_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_iptsv2.c -src_test_fuzz_fuzz_iptsv2_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_iptsv2_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_iptsv2_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_iptsv2_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_microdesc_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_microdesc.c -src_test_fuzz_fuzz_microdesc_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_microdesc_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_microdesc_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_microdesc_LDADD = $(FUZZING_LIBS) - -src_test_fuzz_fuzz_vrs_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_vrs.c -src_test_fuzz_fuzz_vrs_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_vrs_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_vrs_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_vrs_LDADD = $(FUZZING_LIBS) - -FUZZERS = \ - src/test/fuzz/fuzz-consensus \ - src/test/fuzz/fuzz-descriptor \ - src/test/fuzz/fuzz-diff \ - src/test/fuzz/fuzz-diff-apply \ - src/test/fuzz/fuzz-extrainfo \ - src/test/fuzz/fuzz-hsdescv2 \ - src/test/fuzz/fuzz-hsdescv3 \ - src/test/fuzz/fuzz-http \ - src/test/fuzz/fuzz-http-connect \ - src/test/fuzz/fuzz-iptsv2 \ - src/test/fuzz/fuzz-microdesc \ - src/test/fuzz/fuzz-vrs - -# ===== libfuzzer - -if LIBFUZZER_ENABLED -src_test_fuzz_lf_fuzz_consensus_SOURCES = \ - $(src_test_fuzz_fuzz_consensus_SOURCES) -src_test_fuzz_lf_fuzz_consensus_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_consensus_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_consensus_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_consensus_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_descriptor_SOURCES = \ - $(src_test_fuzz_fuzz_descriptor_SOURCES) -src_test_fuzz_lf_fuzz_descriptor_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_descriptor_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_descriptor_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_descriptor_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_diff_SOURCES = \ - $(src_test_fuzz_fuzz_diff_SOURCES) -src_test_fuzz_lf_fuzz_diff_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_diff_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_diff_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_diff_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_diff_apply_SOURCES = \ - $(src_test_fuzz_fuzz_diff_apply_SOURCES) -src_test_fuzz_lf_fuzz_diff_apply_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_diff_apply_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_diff_apply_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_diff_apply_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_extrainfo_SOURCES = \ - $(src_test_fuzz_fuzz_extrainfo_SOURCES) -src_test_fuzz_lf_fuzz_extrainfo_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_extrainfo_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_extrainfo_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_extrainfo_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_hsdescv2_SOURCES = \ - $(src_test_fuzz_fuzz_hsdescv2_SOURCES) -src_test_fuzz_lf_fuzz_hsdescv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_hsdescv2_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_hsdescv2_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_hsdescv2_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_hsdescv3_SOURCES = \ - $(src_test_fuzz_fuzz_hsdescv3_SOURCES) -src_test_fuzz_lf_fuzz_hsdescv3_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_hsdescv3_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_hsdescv3_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_hsdescv3_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_http_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_http_connect_SOURCES = \ - $(src_test_fuzz_fuzz_http_connect_SOURCES) -src_test_fuzz_lf_fuzz_http_connect_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_http_connect_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_http_connect_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_http_connect_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_iptsv2_SOURCES = \ - $(src_test_fuzz_fuzz_iptsv2_SOURCES) -src_test_fuzz_lf_fuzz_iptsv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_iptsv2_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_iptsv2_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_iptsv2_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_microdesc_SOURCES = \ - $(src_test_fuzz_fuzz_microdesc_SOURCES) -src_test_fuzz_lf_fuzz_microdesc_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_microdesc_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_microdesc_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_microdesc_LDADD = $(LIBFUZZER_LIBS) - -src_test_fuzz_lf_fuzz_vrs_SOURCES = \ - $(src_test_fuzz_fuzz_vrs_SOURCES) -src_test_fuzz_lf_fuzz_vrs_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_vrs_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_vrs_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_vrs_LDADD = $(LIBFUZZER_LIBS) - -LIBFUZZER_FUZZERS = \ - src/test/fuzz/lf-fuzz-consensus \ - src/test/fuzz/lf-fuzz-descriptor \ - src/test/fuzz/lf-fuzz-diff \ - src/test/fuzz/lf-fuzz-diff-apply \ - src/test/fuzz/lf-fuzz-extrainfo \ - src/test/fuzz/lf-fuzz-hsdescv2 \ - src/test/fuzz/lf-fuzz-hsdescv3 \ - src/test/fuzz/lf-fuzz-http \ - src/test/fuzz/lf-fuzz-http-connect \ - src/test/fuzz/lf-fuzz-iptsv2 \ - src/test/fuzz/lf-fuzz-microdesc \ - src/test/fuzz/lf-fuzz-vrs - -else -LIBFUZZER_FUZZERS = -endif - -# ===== oss-fuzz - -if OSS_FUZZ_ENABLED -src_test_fuzz_liboss_fuzz_consensus_a_SOURCES = \ - $(src_test_fuzz_fuzz_consensus_SOURCES) -src_test_fuzz_liboss_fuzz_consensus_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_consensus_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_descriptor_a_SOURCES = \ - $(src_test_fuzz_fuzz_descriptor_SOURCES) -src_test_fuzz_liboss_fuzz_descriptor_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_descriptor_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_diff_a_SOURCES = \ - $(src_test_fuzz_fuzz_diff_SOURCES) -src_test_fuzz_liboss_fuzz_diff_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_diff_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_diff_apply_a_SOURCES = \ - $(src_test_fuzz_fuzz_diff_apply_SOURCES) -src_test_fuzz_liboss_fuzz_diff_apply_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_diff_apply_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_extrainfo_a_SOURCES = \ - $(src_test_fuzz_fuzz_extrainfo_SOURCES) -src_test_fuzz_liboss_fuzz_extrainfo_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_extrainfo_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_hsdescv2_a_SOURCES = \ - $(src_test_fuzz_fuzz_hsdescv2_SOURCES) -src_test_fuzz_liboss_fuzz_hsdescv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_hsdescv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_hsdescv3_a_SOURCES = \ - $(src_test_fuzz_fuzz_hsdescv3_SOURCES) -src_test_fuzz_liboss_fuzz_hsdescv3_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_hsdescv3_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_http_connect_a_SOURCES = \ - $(src_test_fuzz_fuzz_http_connect_SOURCES) -src_test_fuzz_liboss_fuzz_http_connect_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_http_connect_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_iptsv2_a_SOURCES = \ - $(src_test_fuzz_fuzz_iptsv2_SOURCES) -src_test_fuzz_liboss_fuzz_iptsv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_iptsv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_microdesc_a_SOURCES = \ - $(src_test_fuzz_fuzz_microdesc_SOURCES) -src_test_fuzz_liboss_fuzz_microdesc_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_microdesc_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -src_test_fuzz_liboss_fuzz_vrs_a_SOURCES = \ - $(src_test_fuzz_fuzz_vrs_SOURCES) -src_test_fuzz_liboss_fuzz_vrs_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_vrs_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - -OSS_FUZZ_FUZZERS = \ - src/test/fuzz/liboss-fuzz-consensus.a \ - src/test/fuzz/liboss-fuzz-descriptor.a \ - src/test/fuzz/liboss-fuzz-diff.a \ - src/test/fuzz/liboss-fuzz-diff-apply.a \ - src/test/fuzz/liboss-fuzz-extrainfo.a \ - src/test/fuzz/liboss-fuzz-hsdescv2.a \ - src/test/fuzz/liboss-fuzz-hsdescv3.a \ - src/test/fuzz/liboss-fuzz-http.a \ - src/test/fuzz/liboss-fuzz-http-connect.a \ - src/test/fuzz/liboss-fuzz-iptsv2.a \ - src/test/fuzz/liboss-fuzz-microdesc.a \ - src/test/fuzz/liboss-fuzz-vrs.a - -else -OSS_FUZZ_FUZZERS = -endif - -noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) -noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) -oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) -fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) - -test-fuzz-corpora: $(FUZZERS) - $(top_srcdir)/src/test/fuzz_static_testcases.sh diff --git a/src/tor/src/test/fuzz/minimize.sh b/src/tor/src/test/fuzz/minimize.sh deleted file mode 100644 index 87d3dda13..000000000 --- a/src/tor/src/test/fuzz/minimize.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -set -e - -if [ ! -d "$1" ] ; then - echo "I need a directory" - exit 1 -fi - -which=`basename "$1"` - -mkdir "$1.out" -afl-cmin -i "$1" -o "$1.out" -m none "./src/test/fuzz/fuzz-${which}" - diff --git a/src/tor/src/test/fuzz_static_testcases.sh b/src/tor/src/test/fuzz_static_testcases.sh deleted file mode 100644 index 3cb45ad5e..000000000 --- a/src/tor/src/test/fuzz_static_testcases.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2016-2017, The Tor Project, Inc. -# See LICENSE for licensing information - -set -e - -if [ -z "${TOR_FUZZ_CORPORA}" ] || [ ! -d "${TOR_FUZZ_CORPORA}" ] ; then - echo "You need to set TOR_FUZZ_CORPORA to point to a checkout of " - echo "the 'fuzzing-corpora' repository." - exit 77 -fi - - - -for fuzzer in "${builddir:-.}"/src/test/fuzz/fuzz-* ; do - f=`basename $fuzzer` - case="${f#fuzz-}" - if [ -d "${TOR_FUZZ_CORPORA}/${case}" ]; then - echo "Running tests for ${case}" - for entry in "${TOR_FUZZ_CORPORA}/${case}/"*; do - "${fuzzer}" "--err" < "$entry" - done - else - echo "No tests found for ${case}" - fi -done diff --git a/src/tor/src/test/hs_build_address.py b/src/tor/src/test/hs_build_address.py deleted file mode 100644 index 7ff22c3a9..000000000 --- a/src/tor/src/test/hs_build_address.py +++ /dev/null @@ -1,38 +0,0 @@ -import sys -import hashlib -import struct -import base64 - -# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires -# the pysha3 package (pip install pysha3). -if sys.version_info < (3, 6): - import sha3 - -# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 -# used the old Keccak implementation. During the finalization of SHA3, NIST -# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function -# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. -TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" -if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): - print("pysha3 version is < 1.0. Please install from:") - print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") - sys.exit(1) - -# Checksum is built like so: -# CHECKSUM = SHA3(".onion checksum" || PUBKEY || VERSION) -PREFIX = ".onion checksum".encode() -# 32 bytes ed25519 pubkey from first test vector of -# https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-02#section-6 -PUBKEY = "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a".decode('hex') -# Version 3 is proposal224 -VERSION = 3 - -data = struct.pack('15s32sb', PREFIX, PUBKEY, VERSION) -checksum = hashlib.sha3_256(data).digest() - -# Onion address is built like so: -# onion_address = base32(PUBKEY || CHECKSUM || VERSION) + ".onion" -address = struct.pack('!32s2sb', PUBKEY, checksum, VERSION) -onion_addr = base64.b32encode(address).decode().lower() - -print("%s" % (onion_addr)) diff --git a/src/tor/src/test/hs_indexes.py b/src/tor/src/test/hs_indexes.py deleted file mode 100644 index af0b81f8d..000000000 --- a/src/tor/src/test/hs_indexes.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# The hidden service subsystem has two type of index. The first type is a -# value that each node in the network gets assigned to using their identity -# key which is their position in the hashring. (hs_build_hsdir_index()). -# -# The second type is a value that both the client and service computes to -# store/fetch the descriptor on the hashring. (hs_build_hs_index()). -# - -import sys -import hashlib -import struct -import base64 - -# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires -# the pysha3 package (pip install pysha3). -if sys.version_info < (3, 6): - import sha3 - # Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 - # used the old Keccak implementation. During the finalization of SHA3, NIST - # changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function - # stayed the same. pysha3 1.0 provides the previous Keccak hash, too. - TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" - if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): - print("pysha3 version is < 1.0. Please install from:") - print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") - sys.exit(1) - -# The first index we'll build is the position index in the hashring that is -# constructed by the hs_build_hsdir_index() function. Construction is: -# SHA3-256("node-idx" | node_identity | -# shared_random_value | INT_8(period_length) | INT_8(period_num) ) - -PREFIX = "node-idx".encode() -# 32 bytes ed25519 pubkey. -IDENTITY = ("\x42" * 32).encode() -# SRV is 32 bytes. -SRV = ("\x43" * 32).encode() -# Time period length is a 8 bytes value. -PERIOD_LEN = 1440 -# Period number is a 8 bytes value. -PERIOD_NUM = 42 - -data = struct.pack('!8s32s32sQQ', PREFIX, IDENTITY, SRV, PERIOD_NUM, - PERIOD_LEN) -hsdir_index = hashlib.sha3_256(data).hexdigest() - -print("[hs_build_hsdir_index] %s" % (hsdir_index)) - -# The second index we'll build is where the HS stores and the client fetches -# the descriptor on the hashring. It is constructed by the hs_build_hs_index() -# function and the construction is: -# SHA3-256("store-at-idx" | blinded_public_key | -# INT_8(replicanum) | INT_8(period_num) | INT_8(period_length) ) - -PREFIX = "store-at-idx".encode() -# 32 bytes ed25519 pubkey. -PUBKEY = ("\x42" * 32).encode() -# Replica number is a 8 bytes value. -REPLICA_NUM = 1 -# Time period length is a 8 bytes value. -PERIOD_LEN = 1440 -# Period number is a 8 bytes value. -PERIOD_NUM = 42 - -data = struct.pack('!12s32sQQQ', PREFIX, PUBKEY, REPLICA_NUM, PERIOD_LEN, - PERIOD_NUM) -hs_index = hashlib.sha3_256(data).hexdigest() - -print("[hs_build_hs_index] %s" % (hs_index)) diff --git a/src/tor/src/test/hs_ntor_ref.py b/src/tor/src/test/hs_ntor_ref.py deleted file mode 100644 index 2ed9324e1..000000000 --- a/src/tor/src/test/hs_ntor_ref.py +++ /dev/null @@ -1,425 +0,0 @@ -#!/usr/bin/python -# Copyright 2017, The Tor Project, Inc -# See LICENSE for licensing information - -""" -hs_ntor_ref.py - -This module is a reference implementation of the modified ntor protocol -proposed for Tor hidden services in proposal 224 (Next Generation Hidden -Services) in section [NTOR-WITH-EXTRA-DATA]. - -The modified ntor protocol is a single-round protocol, with three steps in total: - - 1: Client generates keys and sends them to service via INTRODUCE cell - - 2: Service computes key material based on client's keys, and sends its own - keys to client via RENDEZVOUS cell - - 3: Client computes key material as well. - -It's meant to be used to validate Tor's HS ntor implementation by conducting -various integration tests. Specifically it conducts the following three tests: - -- Tests our Python implementation by running the whole protocol in Python and - making sure that results are consistent. - -- Tests little-t-tor ntor implementation. We use this Python code to instrument - little-t-tor and carry out the handshake by using little-t-tor code. The - small C wrapper at src/test/test-hs-ntor-cl is used for this Python module to - interface with little-t-tor. - -- Cross-tests Python and little-t-tor implementation by running half of the - protocol in Python code and the other in little-t-tor. This is actually two - tests so that all parts of the protocol are run both by little-t-tor and - Python. - -It requires the curve25519 python module from the curve25519-donna package. - -The whole logic and concept for this test suite was taken from ntor_ref.py. - - *** DO NOT USE THIS IN PRODUCTION. *** -""" - -import struct -import os, sys -import binascii -import subprocess - -try: - import curve25519 - curve25519mod = curve25519.keys -except ImportError: - curve25519 = None - import slownacl_curve25519 - curve25519mod = slownacl_curve25519 - -import hashlib -try: - import sha3 -except ImportError: - # In python 3.6, the sha3 functions are in hashlib whether we - # import sha3 or not. - sha3 = None - -try: - # Pull the sha3 functions in. - from hashlib import sha3_256, shake_256 - shake_squeeze = shake_256.digest -except ImportError: - if hasattr(sha3, "SHA3256"): - # If this happens, then we have the old "sha3" module which - # hashlib and pysha3 superseded. - sha3_256 = sha3.SHA3256 - shake_256 = sha3.SHAKE256 - shake_squeeze = shake_256.squeeze - else: - # error code 77 tells automake to skip this test - sys.exit(77) - -# Import Nick's ntor reference implementation in Python -# We are gonna use a few of its utilities. -from ntor_ref import hash_nil -from ntor_ref import PrivateKey - -# String constants used in this protocol -PROTOID = b"tor-hs-ntor-curve25519-sha3-256-1" -T_HSENC = PROTOID + b":hs_key_extract" -T_HSVERIFY = PROTOID + b":hs_verify" -T_HSMAC = PROTOID + b":hs_mac" -M_HSEXPAND = PROTOID + b":hs_key_expand" - -INTRO_SECRET_LEN = 161 -REND_SECRET_LEN = 225 -AUTH_INPUT_LEN = 199 - -# Implements MAC(k,m) = H(htonll(len(k)) | k | m) -def mac(k,m): - def htonll(num): - return struct.pack('!q', num) - - s = sha3_256() - s.update(htonll(len(k))) - s.update(k) - s.update(m) - return s.digest() - -###################################################################### - -# Functions that implement the modified HS ntor protocol - -"""As client compute key material for INTRODUCE cell as follows: - - intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID - info = m_hsexpand | subcredential - hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) - ENC_KEY = hs_keys[0:S_KEY_LEN] - MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] -""" -def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): - - dh_result = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) - secret = dh_result + intro_auth_pubkey_str + client_ephemeral_enc_pubkey.serialize() + intro_enc_pubkey.serialize() + PROTOID - assert(len(secret) == INTRO_SECRET_LEN) - info = M_HSEXPAND + subcredential - - kdf = shake_256() - kdf.update(secret + T_HSENC + info) - key_material = shake_squeeze(kdf, 64*8) - - enc_key = key_material[0:32] - mac_key = key_material[32:64] - - return enc_key, mac_key - -"""Wrapper over intro2_ntor_client()""" -def client_part1(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): - enc_key, mac_key = intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) - assert(enc_key) - assert(mac_key) - - return enc_key, mac_key - -"""As service compute key material for INTRODUCE cell as follows: - - intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID - info = m_hsexpand | subcredential - hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) - HS_DEC_KEY = hs_keys[0:S_KEY_LEN] - HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] -""" -def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_privkey, service_enc_pubkey, subcredential): - dh_result = service_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) - secret = dh_result + intro_auth_pubkey_str + client_enc_pubkey.serialize() + service_enc_pubkey.serialize() + PROTOID - assert(len(secret) == INTRO_SECRET_LEN) - info = M_HSEXPAND + subcredential - - kdf = shake_256() - kdf.update(secret + T_HSENC + info) - key_material = shake_squeeze(kdf, 64*8) - - enc_key = key_material[0:32] - mac_key = key_material[32:64] - - return enc_key, mac_key - -"""As service compute key material for INTRODUCE and REDNEZVOUS cells. - - Use intro2_ntor_service() to calculate the INTRODUCE key material, and use - the following computations to do the RENDEZVOUS ones: - - rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID - NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) - verify = MAC(rend_secret_hs_input, t_hsverify) - auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" - AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) -""" -def service_part1(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential): - intro_enc_key, intro_mac_key = intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) - assert(intro_enc_key) - assert(intro_mac_key) - - service_ephemeral_privkey = PrivateKey() - service_ephemeral_pubkey = service_ephemeral_privkey.get_public() - - dh_result1 = service_ephemeral_privkey.get_shared_key(client_enc_pubkey, hash_nil) - dh_result2 = intro_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) - rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + PROTOID - assert(len(rend_secret_hs_input) == REND_SECRET_LEN) - - ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) - verify = mac(rend_secret_hs_input, T_HSVERIFY) - auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + client_enc_pubkey.serialize() + PROTOID + b"Server" - assert(len(auth_input) == AUTH_INPUT_LEN) - auth_input_mac = mac(auth_input, T_HSMAC) - - assert(ntor_key_seed) - assert(auth_input_mac) - assert(service_ephemeral_pubkey) - - return intro_enc_key, intro_mac_key, ntor_key_seed, auth_input_mac, service_ephemeral_pubkey - -"""As client compute key material for rendezvous cells as follows: - - rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID - NTOR_KEY_SEED = MAC(ntor_secret_input, t_hsenc) - verify = MAC(ntor_secret_input, t_hsverify) - auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" - AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) -""" -def client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_ephemeral_rend_pubkey): - dh_result1 = client_ephemeral_enc_privkey.get_shared_key(service_ephemeral_rend_pubkey, hash_nil) - dh_result2 = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) - rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + PROTOID - assert(len(rend_secret_hs_input) == REND_SECRET_LEN) - - ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) - verify = mac(rend_secret_hs_input, T_HSVERIFY) - auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + PROTOID + b"Server" - assert(len(auth_input) == AUTH_INPUT_LEN) - auth_input_mac = mac(auth_input, T_HSMAC) - - assert(ntor_key_seed) - assert(auth_input_mac) - - return ntor_key_seed, auth_input_mac - -################################################################################# - -""" -Utilities for communicating with the little-t-tor ntor wrapper to conduct the -integration tests -""" - -PROG = b"./src/test/test-hs-ntor-cl" -enhex=lambda s: binascii.b2a_hex(s) -dehex=lambda s: binascii.a2b_hex(s.strip()) - -def tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_privkey, subcredential): - p = subprocess.Popen([PROG, "client1", - enhex(intro_auth_pubkey_str), - enhex(intro_enc_pubkey.serialize()), - enhex(client_ephemeral_enc_privkey.serialize()), - enhex(subcredential)], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - -def tor_server1(intro_auth_pubkey_str, intro_enc_privkey, - client_ephemeral_enc_pubkey, subcredential): - p = subprocess.Popen([PROG, "server1", - enhex(intro_auth_pubkey_str), - enhex(intro_enc_privkey.serialize()), - enhex(client_ephemeral_enc_pubkey.serialize()), - enhex(subcredential)], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - -def tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_ephemeral_rend_pubkey, subcredential): - p = subprocess.Popen([PROG, "client2", - enhex(intro_auth_pubkey_str), - enhex(client_ephemeral_enc_privkey.serialize()), - enhex(intro_enc_pubkey.serialize()), - enhex(service_ephemeral_rend_pubkey.serialize()), - enhex(subcredential)], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - -################################################################################## - -# Perform a pure python ntor test -def do_pure_python_ntor_test(): - # Initialize all needed key material - client_ephemeral_enc_privkey = PrivateKey() - client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() - intro_enc_privkey = PrivateKey() - intro_enc_pubkey = intro_enc_privkey.get_public() - intro_auth_pubkey_str = os.urandom(32) - subcredential = os.urandom(32) - - client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) - - service_enc_key, service_mac_key, service_ntor_key_seed, service_auth_input_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) - - assert(client_enc_key == service_enc_key) - assert(client_mac_key == service_mac_key) - - client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_ephemeral_pubkey) - - assert(client_ntor_key_seed == service_ntor_key_seed) - assert(client_auth_input_mac == service_auth_input_mac) - - print("DONE: python dance [%s]" % repr(client_auth_input_mac)) - -# Perform a pure little-t-tor integration test. -def do_little_t_tor_ntor_test(): - # Initialize all needed key material - subcredential = os.urandom(32) - client_ephemeral_enc_privkey = PrivateKey() - client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() - intro_enc_privkey = PrivateKey() - intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key - intro_auth_pubkey_str = os.urandom(32) - - client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_privkey, subcredential) - assert(client_enc_key) - assert(client_mac_key) - - service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, - intro_enc_privkey, - client_ephemeral_enc_pubkey, - subcredential) - assert(service_enc_key) - assert(service_mac_key) - assert(service_ntor_auth_mac) - assert(service_ntor_key_seed) - - assert(client_enc_key == service_enc_key) - assert(client_mac_key == service_mac_key) - - # Turn from bytes to key - service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) - - client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_eph_pubkey, subcredential) - assert(client_ntor_auth_mac) - assert(client_ntor_key_seed) - - assert(client_ntor_key_seed == service_ntor_key_seed) - assert(client_ntor_auth_mac == service_ntor_auth_mac) - - print("DONE: tor dance [%s]" % repr(client_ntor_auth_mac)) - -""" -Do mixed test as follows: - 1. C -> S (python mode) - 2. C <- S (tor mode) - 3. Client computes keys (python mode) -""" -def do_first_mixed_test(): - subcredential = os.urandom(32) - - client_ephemeral_enc_privkey = PrivateKey() - client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() - intro_enc_privkey = PrivateKey() - intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key - - intro_auth_pubkey_str = os.urandom(32) - - # Let's do mixed - client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, - subcredential) - - service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, - intro_enc_privkey, - client_ephemeral_enc_pubkey, - subcredential) - assert(service_enc_key) - assert(service_mac_key) - assert(service_ntor_auth_mac) - assert(service_ntor_key_seed) - assert(service_eph_pubkey) - - assert(client_enc_key == service_enc_key) - assert(client_mac_key == service_mac_key) - - # Turn from bytes to key - service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) - - client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_eph_pubkey) - - assert(client_auth_input_mac == service_ntor_auth_mac) - assert(client_ntor_key_seed == service_ntor_key_seed) - - print("DONE: 1st mixed dance [%s]" % repr(client_auth_input_mac)) - -""" -Do mixed test as follows: - 1. C -> S (tor mode) - 2. C <- S (python mode) - 3. Client computes keys (tor mode) -""" -def do_second_mixed_test(): - subcredential = os.urandom(32) - - client_ephemeral_enc_privkey = PrivateKey() - client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() - intro_enc_privkey = PrivateKey() - intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key - - intro_auth_pubkey_str = os.urandom(32) - - # Let's do mixed - client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, - client_ephemeral_enc_privkey, subcredential) - assert(client_enc_key) - assert(client_mac_key) - - service_enc_key, service_mac_key, service_ntor_key_seed, service_ntor_auth_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) - - client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, - intro_enc_pubkey, service_ephemeral_pubkey, subcredential) - assert(client_ntor_auth_mac) - assert(client_ntor_key_seed) - - assert(client_ntor_key_seed == service_ntor_key_seed) - assert(client_ntor_auth_mac == service_ntor_auth_mac) - - print("DONE: 2nd mixed dance [%s]" % repr(client_ntor_auth_mac)) - -def do_mixed_tests(): - do_first_mixed_test() - do_second_mixed_test() - -if __name__ == '__main__': - do_pure_python_ntor_test() - do_little_t_tor_ntor_test() - do_mixed_tests() diff --git a/src/tor/src/test/hs_test_helpers.c b/src/tor/src/test/hs_test_helpers.c deleted file mode 100644 index 935597126..000000000 --- a/src/tor/src/test/hs_test_helpers.c +++ /dev/null @@ -1,276 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "crypto_ed25519.h" -#include "test.h" -#include "torcert.h" - -#include "hs_common.h" -#include "hs_test_helpers.h" - -hs_desc_intro_point_t * -hs_helper_build_intro_point(const ed25519_keypair_t *signing_kp, time_t now, - const char *addr, int legacy) -{ - int ret; - ed25519_keypair_t auth_kp; - hs_desc_intro_point_t *intro_point = NULL; - hs_desc_intro_point_t *ip = hs_desc_intro_point_new(); - - /* For a usable intro point we need at least two link specifiers: One legacy - * keyid and one ipv4 */ - { - hs_desc_link_specifier_t *ls_legacy = tor_malloc_zero(sizeof(*ls_legacy)); - hs_desc_link_specifier_t *ls_v4 = tor_malloc_zero(sizeof(*ls_v4)); - ls_legacy->type = LS_LEGACY_ID; - memcpy(ls_legacy->u.legacy_id, "0299F268FCA9D55CD157976D39AE92B4B455B3A8", - DIGEST_LEN); - ls_v4->u.ap.port = 9001; - int family = tor_addr_parse(&ls_v4->u.ap.addr, addr); - switch (family) { - case AF_INET: - ls_v4->type = LS_IPV4; - break; - case AF_INET6: - ls_v4->type = LS_IPV6; - break; - default: - /* Stop the test, not suppose to have an error. */ - tt_int_op(family, OP_EQ, AF_INET); - } - smartlist_add(ip->link_specifiers, ls_legacy); - smartlist_add(ip->link_specifiers, ls_v4); - } - - ret = ed25519_keypair_generate(&auth_kp, 0); - tt_int_op(ret, ==, 0); - ip->auth_key_cert = tor_cert_create(signing_kp, CERT_TYPE_AUTH_HS_IP_KEY, - &auth_kp.pubkey, now, - HS_DESC_CERT_LIFETIME, - CERT_FLAG_INCLUDE_SIGNING_KEY); - tt_assert(ip->auth_key_cert); - - if (legacy) { - ip->legacy.key = crypto_pk_new(); - tt_assert(ip->legacy.key); - ret = crypto_pk_generate_key(ip->legacy.key); - tt_int_op(ret, ==, 0); - ssize_t cert_len = tor_make_rsa_ed25519_crosscert( - &signing_kp->pubkey, ip->legacy.key, - now + HS_DESC_CERT_LIFETIME, - &ip->legacy.cert.encoded); - tt_assert(ip->legacy.cert.encoded); - tt_u64_op(cert_len, OP_GT, 0); - ip->legacy.cert.len = cert_len; - } - - /* Encryption key. */ - { - int signbit; - curve25519_keypair_t curve25519_kp; - ed25519_keypair_t ed25519_kp; - tor_cert_t *cross_cert; - - ret = curve25519_keypair_generate(&curve25519_kp, 0); - tt_int_op(ret, ==, 0); - ed25519_keypair_from_curve25519_keypair(&ed25519_kp, &signbit, - &curve25519_kp); - cross_cert = tor_cert_create(signing_kp, CERT_TYPE_CROSS_HS_IP_KEYS, - &ed25519_kp.pubkey, time(NULL), - HS_DESC_CERT_LIFETIME, - CERT_FLAG_INCLUDE_SIGNING_KEY); - tt_assert(cross_cert); - ip->enc_key_cert = cross_cert; - } - - intro_point = ip; - done: - return intro_point; -} - -/* Return a valid hs_descriptor_t object. If no_ip is set, no introduction - * points are added. */ -static hs_descriptor_t * -hs_helper_build_hs_desc_impl(unsigned int no_ip, - const ed25519_keypair_t *signing_kp) -{ - time_t now = approx_time(); - ed25519_keypair_t blinded_kp; - hs_descriptor_t *descp = NULL, *desc = tor_malloc_zero(sizeof(*desc)); - - desc->plaintext_data.version = HS_DESC_SUPPORTED_FORMAT_VERSION_MAX; - - /* Copy only the public key into the descriptor. */ - memcpy(&desc->plaintext_data.signing_pubkey, &signing_kp->pubkey, - sizeof(ed25519_public_key_t)); - - uint64_t current_time_period = hs_get_time_period_num(0); - hs_build_blinded_keypair(signing_kp, NULL, 0, - current_time_period, &blinded_kp); - /* Copy only the public key into the descriptor. */ - memcpy(&desc->plaintext_data.blinded_pubkey, &blinded_kp.pubkey, - sizeof(ed25519_public_key_t)); - - desc->plaintext_data.signing_key_cert = - tor_cert_create(&blinded_kp, CERT_TYPE_SIGNING_HS_DESC, - &signing_kp->pubkey, now, 3600, - CERT_FLAG_INCLUDE_SIGNING_KEY); - tt_assert(desc->plaintext_data.signing_key_cert); - desc->plaintext_data.revision_counter = 42; - desc->plaintext_data.lifetime_sec = 3 * 60 * 60; - - hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey, - desc->subcredential); - - /* Setup encrypted data section. */ - desc->encrypted_data.create2_ntor = 1; - desc->encrypted_data.intro_auth_types = smartlist_new(); - desc->encrypted_data.single_onion_service = 1; - smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); - desc->encrypted_data.intro_points = smartlist_new(); - if (!no_ip) { - /* Add four intro points. */ - smartlist_add(desc->encrypted_data.intro_points, - hs_helper_build_intro_point(signing_kp, now, "1.2.3.4", 0)); - smartlist_add(desc->encrypted_data.intro_points, - hs_helper_build_intro_point(signing_kp, now, "[2600::1]", 0)); - smartlist_add(desc->encrypted_data.intro_points, - hs_helper_build_intro_point(signing_kp, now, "3.2.1.4", 1)); - smartlist_add(desc->encrypted_data.intro_points, - hs_helper_build_intro_point(signing_kp, now, "5.6.7.8", 1)); - } - - descp = desc; - done: - return descp; -} - -/** Helper function to get the HS subcredential using the identity keypair of - * an HS. Used to decrypt descriptors in unittests. */ -void -hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp, - uint8_t *subcred_out) -{ - ed25519_keypair_t blinded_kp; - uint64_t current_time_period = hs_get_time_period_num(approx_time()); - hs_build_blinded_keypair(signing_kp, NULL, 0, - current_time_period, &blinded_kp); - - hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey, - subcred_out); -} - -/* Build a descriptor with introduction points. */ -hs_descriptor_t * -hs_helper_build_hs_desc_with_ip(const ed25519_keypair_t *signing_kp) -{ - return hs_helper_build_hs_desc_impl(0, signing_kp); -} - -/* Build a descriptor without any introduction points. */ -hs_descriptor_t * -hs_helper_build_hs_desc_no_ip(const ed25519_keypair_t *signing_kp) -{ - return hs_helper_build_hs_desc_impl(1, signing_kp); -} - -void -hs_helper_desc_equal(const hs_descriptor_t *desc1, - const hs_descriptor_t *desc2) -{ - char *addr1 = NULL, *addr2 = NULL; - /* Plaintext data section. */ - tt_int_op(desc1->plaintext_data.version, OP_EQ, - desc2->plaintext_data.version); - tt_uint_op(desc1->plaintext_data.lifetime_sec, OP_EQ, - desc2->plaintext_data.lifetime_sec); - tt_assert(tor_cert_eq(desc1->plaintext_data.signing_key_cert, - desc2->plaintext_data.signing_key_cert)); - tt_mem_op(desc1->plaintext_data.signing_pubkey.pubkey, OP_EQ, - desc2->plaintext_data.signing_pubkey.pubkey, - ED25519_PUBKEY_LEN); - tt_mem_op(desc1->plaintext_data.blinded_pubkey.pubkey, OP_EQ, - desc2->plaintext_data.blinded_pubkey.pubkey, - ED25519_PUBKEY_LEN); - tt_u64_op(desc1->plaintext_data.revision_counter, ==, - desc2->plaintext_data.revision_counter); - - /* NOTE: We can't compare the encrypted blob because when encoding the - * descriptor, the object is immutable thus we don't update it with the - * encrypted blob. As contrast to the decoding process where we populate a - * descriptor object. */ - - /* Encrypted data section. */ - tt_uint_op(desc1->encrypted_data.create2_ntor, ==, - desc2->encrypted_data.create2_ntor); - - /* Authentication type. */ - tt_int_op(!!desc1->encrypted_data.intro_auth_types, ==, - !!desc2->encrypted_data.intro_auth_types); - if (desc1->encrypted_data.intro_auth_types && - desc2->encrypted_data.intro_auth_types) { - tt_int_op(smartlist_len(desc1->encrypted_data.intro_auth_types), ==, - smartlist_len(desc2->encrypted_data.intro_auth_types)); - for (int i = 0; - i < smartlist_len(desc1->encrypted_data.intro_auth_types); - i++) { - tt_str_op(smartlist_get(desc1->encrypted_data.intro_auth_types, i),OP_EQ, - smartlist_get(desc2->encrypted_data.intro_auth_types, i)); - } - } - - /* Introduction points. */ - { - tt_assert(desc1->encrypted_data.intro_points); - tt_assert(desc2->encrypted_data.intro_points); - tt_int_op(smartlist_len(desc1->encrypted_data.intro_points), ==, - smartlist_len(desc2->encrypted_data.intro_points)); - for (int i=0; i < smartlist_len(desc1->encrypted_data.intro_points); i++) { - hs_desc_intro_point_t *ip1 = smartlist_get(desc1->encrypted_data - .intro_points, i), - *ip2 = smartlist_get(desc2->encrypted_data - .intro_points, i); - tt_assert(tor_cert_eq(ip1->auth_key_cert, ip2->auth_key_cert)); - if (ip1->legacy.key) { - tt_int_op(crypto_pk_cmp_keys(ip1->legacy.key, ip2->legacy.key), - OP_EQ, 0); - } else { - tt_mem_op(&ip1->enc_key, OP_EQ, &ip2->enc_key, CURVE25519_PUBKEY_LEN); - } - - tt_int_op(smartlist_len(ip1->link_specifiers), ==, - smartlist_len(ip2->link_specifiers)); - for (int j = 0; j < smartlist_len(ip1->link_specifiers); j++) { - hs_desc_link_specifier_t *ls1 = smartlist_get(ip1->link_specifiers, j), - *ls2 = smartlist_get(ip2->link_specifiers, j); - tt_int_op(ls1->type, ==, ls2->type); - switch (ls1->type) { - case LS_IPV4: - case LS_IPV6: - { - addr1 = tor_addr_to_str_dup(&ls1->u.ap.addr); - addr2 = tor_addr_to_str_dup(&ls2->u.ap.addr); - tt_str_op(addr1, OP_EQ, addr2); - tor_free(addr1); - tor_free(addr2); - tt_int_op(ls1->u.ap.port, ==, ls2->u.ap.port); - } - break; - case LS_LEGACY_ID: - tt_mem_op(ls1->u.legacy_id, OP_EQ, ls2->u.legacy_id, - sizeof(ls1->u.legacy_id)); - break; - default: - /* Unknown type, caught it and print its value. */ - tt_int_op(ls1->type, OP_EQ, -1); - } - } - } - } - - done: - tor_free(addr1); - tor_free(addr2); -} - diff --git a/src/tor/src/test/hs_test_helpers.h b/src/tor/src/test/hs_test_helpers.h deleted file mode 100644 index b1b0490f0..000000000 --- a/src/tor/src/test/hs_test_helpers.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_HS_TEST_HELPERS_H -#define TOR_HS_TEST_HELPERS_H - -#include "ed25519_cert.h" -#include "hs_descriptor.h" - -/* Set of functions to help build and test descriptors. */ -hs_desc_intro_point_t *hs_helper_build_intro_point( - const ed25519_keypair_t *signing_kp, time_t now, - const char *addr, int legacy); -hs_descriptor_t *hs_helper_build_hs_desc_no_ip( - const ed25519_keypair_t *signing_kp); -hs_descriptor_t *hs_helper_build_hs_desc_with_ip( - const ed25519_keypair_t *signing_kp); -void hs_helper_desc_equal(const hs_descriptor_t *desc1, - const hs_descriptor_t *desc2); -void -hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp, - uint8_t *subcred_out); - -#endif /* !defined(TOR_HS_TEST_HELPERS_H) */ - diff --git a/src/tor/src/test/include.am b/src/tor/src/test/include.am deleted file mode 100644 index a4b9705fd..000000000 --- a/src/tor/src/test/include.am +++ /dev/null @@ -1,359 +0,0 @@ -# When the day comes that Tor requires Automake >= 1.12 change -# TESTS_ENVIRONMENT to AM_TESTS_ENVIRONMENT because the former is reserved for -# users while the later is reserved for developers. -TESTS_ENVIRONMENT = \ - export PYTHON="$(PYTHON)"; \ - export SHELL="$(SHELL)"; \ - export abs_top_srcdir="$(abs_top_srcdir)"; \ - export abs_top_builddir="$(abs_top_builddir)"; \ - export builddir="$(builddir)"; \ - export TESTING_TOR_BINARY="$(TESTING_TOR_BINARY)"; \ - export CARGO="$(CARGO)"; \ - export CARGO_ONLINE="$(CARGO_ONLINE)"; - -TESTSCRIPTS = \ - src/test/fuzz_static_testcases.sh \ - src/test/test_zero_length_keys.sh \ - src/test/test_workqueue_cancel.sh \ - src/test/test_workqueue_efd.sh \ - src/test/test_workqueue_efd2.sh \ - src/test/test_workqueue_pipe.sh \ - src/test/test_workqueue_pipe2.sh \ - src/test/test_workqueue_socketpair.sh \ - src/test/test_switch_id.sh - -if USE_RUST -TESTSCRIPTS += \ - src/test/test_rust.sh -endif - -if USEPYTHON -TESTSCRIPTS += src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh -endif - -TESTS += src/test/test src/test/test-slow src/test/test-memwipe \ - src/test/test_workqueue \ - src/test/test_keygen.sh \ - src/test/test_key_expiration.sh \ - src/test/test-timers \ - $(TESTSCRIPTS) - -# These flavors are run using automake's test-driver and test-network.sh -TEST_CHUTNEY_FLAVORS = basic-min bridges-min hs-v2-min hs-v3-min \ - single-onion-v23 -# only run if we can ping6 ::1 (localhost) -# IPv6-only v3 single onion services don't work yet, so we don't test the -# single-onion-v23-ipv6-md flavor -TEST_CHUTNEY_FLAVORS_IPV6 = bridges+ipv6-min ipv6-exit-min hs-v23-ipv6-md \ - single-onion-ipv6-md -# only run if we can find a stable (or simply another) version of tor -TEST_CHUTNEY_FLAVORS_MIXED = mixed+hs-v23 - -### This is a lovely feature, but it requires automake >= 1.12, and Tor -### doesn't require that yet. -### -# TEST_EXTENSIONS = .sh -# SH_LOG_COMPILER = $(SHELL) - -noinst_PROGRAMS+= src/test/bench -if UNITTESTS_ENABLED -noinst_PROGRAMS+= \ - src/test/test \ - src/test/test-slow \ - src/test/test-memwipe \ - src/test/test-child \ - src/test/test_workqueue \ - src/test/test-switch-id \ - src/test/test-timers -endif - -src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ - -DLOCALSTATEDIR="\"$(localstatedir)\"" \ - -DBINDIR="\"$(bindir)\"" \ - -I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext" \ - -I"$(top_srcdir)/src/trunnel" \ - -I"$(top_srcdir)/src/ext/trunnel" \ - -DTOR_UNIT_TESTS - -# -L flags need to go in LDFLAGS. -l flags need to go in LDADD. -# This seems to matter nowhere but on Windows, but I assure you that it -# matters a lot there, and is quite hard to debug if you forget to do it. - -src_test_test_SOURCES = \ - src/test/log_test_helpers.c \ - src/test/hs_test_helpers.c \ - src/test/rend_test_helpers.c \ - src/test/test.c \ - src/test/test_accounting.c \ - src/test/test_addr.c \ - src/test/test_address.c \ - src/test/test_buffers.c \ - src/test/test_cell_formats.c \ - src/test/test_cell_queue.c \ - src/test/test_channel.c \ - src/test/test_channelpadding.c \ - src/test/test_channeltls.c \ - src/test/test_checkdir.c \ - src/test/test_circuitlist.c \ - src/test/test_circuitmux.c \ - src/test/test_circuitbuild.c \ - src/test/test_circuituse.c \ - src/test/test_circuitstats.c \ - src/test/test_compat_libevent.c \ - src/test/test_config.c \ - src/test/test_connection.c \ - src/test/test_conscache.c \ - src/test/test_consdiff.c \ - src/test/test_consdiffmgr.c \ - src/test/test_containers.c \ - src/test/test_controller.c \ - src/test/test_controller_events.c \ - src/test/test_crypto.c \ - src/test/test_crypto_openssl.c \ - src/test/test_data.c \ - src/test/test_dir.c \ - src/test/test_dir_common.c \ - src/test/test_dir_handle_get.c \ - src/test/test_entryconn.c \ - src/test/test_entrynodes.c \ - src/test/test_guardfraction.c \ - src/test/test_extorport.c \ - src/test/test_hs.c \ - src/test/test_hs_common.c \ - src/test/test_hs_config.c \ - src/test/test_hs_cell.c \ - src/test/test_hs_ntor.c \ - src/test/test_hs_service.c \ - src/test/test_hs_client.c \ - src/test/test_hs_intropoint.c \ - src/test/test_hs_control.c \ - src/test/test_handles.c \ - src/test/test_hs_cache.c \ - src/test/test_hs_descriptor.c \ - src/test/test_introduce.c \ - src/test/test_keypin.c \ - src/test/test_link_handshake.c \ - src/test/test_logging.c \ - src/test/test_microdesc.c \ - src/test/test_nodelist.c \ - src/test/test_oom.c \ - src/test/test_oos.c \ - src/test/test_options.c \ - src/test/test_policy.c \ - src/test/test_procmon.c \ - src/test/test_proto_http.c \ - src/test/test_proto_misc.c \ - src/test/test_protover.c \ - src/test/test_pt.c \ - src/test/test_pubsub.c \ - src/test/test_relay.c \ - src/test/test_relaycell.c \ - src/test/test_rendcache.c \ - src/test/test_replay.c \ - src/test/test_router.c \ - src/test/test_routerkeys.c \ - src/test/test_routerlist.c \ - src/test/test_routerset.c \ - src/test/test_scheduler.c \ - src/test/test_shared_random.c \ - src/test/test_socks.c \ - src/test/test_status.c \ - src/test/test_storagedir.c \ - src/test/test_threads.c \ - src/test/test_tortls.c \ - src/test/test_util.c \ - src/test/test_util_format.c \ - src/test/test_util_process.c \ - src/test/test_helpers.c \ - src/test/test_dns.c \ - src/test/testing_common.c \ - src/test/testing_rsakeys.c \ - src/ext/tinytest.c - -src_test_test_slow_SOURCES = \ - src/test/test_slow.c \ - src/test/test_crypto_slow.c \ - src/test/test_util_slow.c \ - src/test/testing_common.c \ - src/test/testing_rsakeys.c \ - src/ext/tinytest.c - -src_test_test_memwipe_SOURCES = \ - src/test/test-memwipe.c - -src_test_test_timers_SOURCES = \ - src/test/test-timers.c - -src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - -src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) - -src_test_bench_SOURCES = \ - src/test/bench.c - -src_test_test_workqueue_SOURCES = \ - src/test/test_workqueue.c -src_test_test_workqueue_CPPFLAGS= $(src_test_AM_CPPFLAGS) -src_test_test_workqueue_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - -src_test_test_switch_id_SOURCES = \ - src/test/test_switch_id.c -src_test_test_switch_id_CPPFLAGS= $(src_test_AM_CPPFLAGS) -src_test_test_switch_id_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_test_test_switch_id_LDFLAGS = @TOR_LDFLAGS_zlib@ -src_test_test_switch_id_LDADD = \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_LIB_WS32@ @TOR_LIB_USERENV@ \ - @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ - -src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ - @TOR_LDFLAGS_libevent@ -src_test_test_LDADD = src/or/libtor-testing.a \ - src/common/libor-crypto-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/trunnel/libor-trunnel-testing.a \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ - -src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS) -src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS) -src_test_test_slow_LDADD = $(src_test_test_LDADD) -src_test_test_slow_LDFLAGS = $(src_test_test_LDFLAGS) - -src_test_test_memwipe_CPPFLAGS = $(src_test_test_CPPFLAGS) -# Don't use bugtrap cflags here: memwipe tests require memory violations. -src_test_test_memwipe_CFLAGS = $(TEST_CFLAGS) -src_test_test_memwipe_LDADD = $(src_test_test_LDADD) -# The LDFLAGS need to include the bugtrap cflags, or else we won't link -# successfully with the libraries built with them. -src_test_test_memwipe_LDFLAGS = $(src_test_test_LDFLAGS) @CFLAGS_BUGTRAP@ - -src_test_bench_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ - @TOR_LDFLAGS_libevent@ -src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - src/common/libor-event.a src/trunnel/libor-trunnel.a \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ - -src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ - @TOR_LDFLAGS_libevent@ -src_test_test_workqueue_LDADD = src/or/libtor-testing.a \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - src/common/libor-event-testing.a \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ \ - @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ - -src_test_test_timers_CPPFLAGS = $(src_test_test_CPPFLAGS) -src_test_test_timers_CFLAGS = $(src_test_test_CFLAGS) -src_test_test_timers_LDADD = \ - src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/common/libor-event-testing.a \ - src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ \ - @TOR_LZMA_LIBS@ -src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS) - -noinst_HEADERS+= \ - src/test/fakechans.h \ - src/test/hs_test_helpers.h \ - src/test/log_test_helpers.h \ - src/test/rend_test_helpers.h \ - src/test/test.h \ - src/test/test_helpers.h \ - src/test/test_dir_common.h \ - src/test/test_connection.h \ - src/test/test_descriptors.inc \ - src/test/example_extrainfo.inc \ - src/test/failing_routerdescs.inc \ - src/test/ed25519_vectors.inc \ - src/test/test_descriptors.inc \ - src/test/test_hs_descriptor.inc \ - src/test/vote_descriptors.inc - -noinst_PROGRAMS+= src/test/test-ntor-cl -noinst_PROGRAMS+= src/test/test-hs-ntor-cl -src_test_test_ntor_cl_SOURCES = src/test/test_ntor_cl.c -src_test_test_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_test_test_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \ - @CURVE25519_LIBS@ @TOR_LZMA_LIBS@ -src_test_test_ntor_cl_AM_CPPFLAGS = \ - -I"$(top_srcdir)/src/or" - -src_test_test_hs_ntor_cl_SOURCES = src/test/test_hs_ntor_cl.c -src_test_test_hs_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_test_test_hs_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ -src_test_test_hs_ntor_cl_AM_CPPFLAGS = \ - -I"$(top_srcdir)/src/or" - - -noinst_PROGRAMS += src/test/test-bt-cl -src_test_test_bt_cl_SOURCES = src/test/test_bt_cl.c -src_test_test_bt_cl_LDADD = src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - src/trace/libor-trace.a \ - $(rust_ldadd) \ - @TOR_LIB_MATH@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ -src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) - -EXTRA_DIST += \ - src/test/bt_test.py \ - src/test/ntor_ref.py \ - src/test/hs_ntor_ref.py \ - src/test/hs_build_address.py \ - src/test/hs_indexes.py \ - src/test/fuzz_static_testcases.sh \ - src/test/slownacl_curve25519.py \ - src/test/zero_length_keys.sh \ - src/test/test_keygen.sh \ - src/test/test_key_expiration.sh \ - src/test/test_zero_length_keys.sh \ - src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh \ - src/test/test-network.sh \ - src/test/test_rust.sh \ - src/test/test_switch_id.sh \ - src/test/test_workqueue_cancel.sh \ - src/test/test_workqueue_efd.sh \ - src/test/test_workqueue_efd2.sh \ - src/test/test_workqueue_pipe.sh \ - src/test/test_workqueue_pipe2.sh \ - src/test/test_workqueue_socketpair.sh - diff --git a/src/tor/src/test/log_test_helpers.c b/src/tor/src/test/log_test_helpers.c deleted file mode 100644 index d5a39cfee..000000000 --- a/src/tor/src/test/log_test_helpers.c +++ /dev/null @@ -1,241 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#define LOG_PRIVATE -#include "torlog.h" -#include "log_test_helpers.h" - -/** - * \file log_test_helpers.c - * \brief Code to check for expected log messages during testing. - */ - -static void mock_saving_logv(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, - const char *format, va_list ap) - CHECK_PRINTF(5, 0); - -/** - * Smartlist of all the logs we've received since we last set up - * log capture. - */ -static smartlist_t *saved_logs = NULL; - -/** Boolean: should we also send messages to the test-runner? */ -static int echo_to_real_logs = 1; - -/** Record logs at this level or more severe */ -static int record_logs_at_level = LOG_ERR; - -static int saved_log_level = 0; - -/** - * As setup_capture_of_logs, but do not relay log messages into the main - * logging system. - * - * Avoid using this function; use setup_capture_of_logs() instead if you - * can. If you must use this function, then make sure you detect any - * unexpected log messages, and treat them as test failures. */ -void -setup_full_capture_of_logs(int new_level) -{ - setup_capture_of_logs(new_level); - echo_to_real_logs = 0; -} - -/** - * Temporarily capture all the messages logged at severity new_level or - * higher. - * - * This function does not prevent messages from being sent to the main - * logging system. - */ -void -setup_capture_of_logs(int new_level) -{ - if (saved_log_level == 0) { - saved_log_level = log_global_min_severity_; - } else { - tor_assert(0); - } - - /* Only change the log_global_min_severity_ if we're making things _more_ - * verbose. Otherwise we could prevent real log messages that the test- - * runner wanted. - */ - if (log_global_min_severity_ < new_level) - log_global_min_severity_ = new_level; - - record_logs_at_level = new_level; - mock_clean_saved_logs(); - saved_logs = smartlist_new(); - MOCK(logv, mock_saving_logv); - echo_to_real_logs = 1; -} - -/** - * Undo setup_capture_of_logs(). - * - * This function is safe to call more than once. - */ -void -teardown_capture_of_logs(void) -{ - UNMOCK(logv); - if (saved_log_level) - log_global_min_severity_ = saved_log_level; - saved_log_level = 0; - mock_clean_saved_logs(); -} - -/** - * Clear all messages in mock_saved_logs() - */ -void -mock_clean_saved_logs(void) -{ - if (!saved_logs) - return; - SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, - { tor_free(m->generated_msg); tor_free(m); }); - smartlist_free(saved_logs); - saved_logs = NULL; -} - -/** - * Return a list of all the messages captured since the last - * setup_[full_]capture_of_logs() call. Each log call is recorded as a - * mock_saved_log_entry_t. - */ -const smartlist_t * -mock_saved_logs(void) -{ - return saved_logs; -} - -int -mock_saved_log_n_entries(void) -{ - return saved_logs ? smartlist_len(saved_logs) : 0; -} - -/** - * Return true iff there is a message recorded by log capture - * that is exactly equal to msg - */ -int -mock_saved_log_has_message(const char *msg) -{ - if (saved_logs) { - SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, - { - if (msg && m->generated_msg && - !strcmp(msg, m->generated_msg)) { - return 1; - } - }); - } - - return 0; -} - -/** - * Return true iff there is a message recorded by log capture - * that contains msg as a substring. - */ -int -mock_saved_log_has_message_containing(const char *msg) -{ - if (saved_logs) { - SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, - { - if (msg && m->generated_msg && - strstr(m->generated_msg, msg)) { - return 1; - } - }); - } - - return 0; -} - -/** Return true iff the saved logs have any messages with severity */ -int -mock_saved_log_has_severity(int severity) -{ - int has_sev = 0; - if (saved_logs) { - SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m, - { - if (m->severity == severity) { - has_sev = 1; - } - }); - } - - return has_sev; -} - -/** Return true iff the the saved logs have at lease one message */ -int -mock_saved_log_has_entry(void) -{ - if (saved_logs) { - return smartlist_len(saved_logs) > 0; - } - return 0; -} - -/* Replacement for logv: record the log message, and (maybe) send it - * into the logging system again. - */ -static void -mock_saving_logv(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, - const char *format, va_list ap) -{ - char *buf = tor_malloc_zero(10240); - int n; - n = tor_vsnprintf(buf,10240,format,ap); - tor_assert(n < 10240-1); - buf[n]='\n'; - buf[n+1]='\0'; - - if (echo_to_real_logs) { - tor_log(severity, domain|LD_NO_MOCK, "%s", buf); - } - - if (severity > record_logs_at_level) { - tor_free(buf); - return; - } - - if (!saved_logs) - saved_logs = smartlist_new(); - - mock_saved_log_entry_t *e = tor_malloc_zero(sizeof(mock_saved_log_entry_t)); - e->severity = severity; - e->funcname = funcname; - e->suffix = suffix; - e->format = format; - e->generated_msg = tor_strdup(buf); - tor_free(buf); - - smartlist_add(saved_logs, e); -} - -void -mock_dump_saved_logs(void) -{ - if (saved_logs == NULL) { - puts(" Captured logs: NULL"); - return; - } - - puts(" Captured logs:"); - SMARTLIST_FOREACH_BEGIN(saved_logs, const mock_saved_log_entry_t *, m) { - printf("% 5d. %s: %s\n", m_sl_idx + 1, - log_level_to_string(m->severity), - escaped(m->generated_msg)); - } SMARTLIST_FOREACH_END(m); -} - diff --git a/src/tor/src/test/log_test_helpers.h b/src/tor/src/test/log_test_helpers.h deleted file mode 100644 index 70c584eb3..000000000 --- a/src/tor/src/test/log_test_helpers.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" - -#ifndef TOR_LOG_TEST_HELPERS_H -#define TOR_LOG_TEST_HELPERS_H - -/** An element of mock_saved_logs(); records the log element that we - * received. */ -typedef struct mock_saved_log_entry_t { - int severity; - const char *funcname; - const char *suffix; - const char *format; - char *generated_msg; -} mock_saved_log_entry_t; - -void mock_clean_saved_logs(void); -const smartlist_t *mock_saved_logs(void); -void setup_capture_of_logs(int new_level); -void setup_full_capture_of_logs(int new_level); -void teardown_capture_of_logs(void); - -int mock_saved_log_has_message(const char *msg); -int mock_saved_log_has_message_containing(const char *msg); -int mock_saved_log_has_severity(int severity); -int mock_saved_log_has_entry(void); -int mock_saved_log_n_entries(void); -void mock_dump_saved_logs(void); - -#define assert_log_predicate(predicate, failure_msg) \ - do { \ - if (!(predicate)) { \ - tt_fail_msg((failure_msg)); \ - mock_dump_saved_logs(); \ - TT_EXIT_TEST_FUNCTION; \ - } \ - } while (0) - -#define expect_log_msg(str) \ - assert_log_predicate(mock_saved_log_has_message(str), \ - "expected log to contain " # str); - -#define expect_log_msg_containing(str) \ - assert_log_predicate(mock_saved_log_has_message_containing(str), \ - "expected log to contain " # str); - -#define expect_log_msg_containing_either(str1, str2) \ - assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ - mock_saved_log_has_message_containing(str2), \ - "expected log to contain " # str1 " or " # str2); - -#define expect_log_msg_containing_either3(str1, str2, str3) \ - assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ - mock_saved_log_has_message_containing(str2) || \ - mock_saved_log_has_message_containing(str3), \ - "expected log to contain " # str1 " or " # str2 \ - " or " # str3); - -#define expect_log_msg_containing_either4(str1, str2, str3, str4) \ - assert_log_predicate(mock_saved_log_has_message_containing(str1) || \ - mock_saved_log_has_message_containing(str2) || \ - mock_saved_log_has_message_containing(str3) || \ - mock_saved_log_has_message_containing(str4), \ - "expected log to contain " # str1 " or " # str2 \ - " or " # str3 " or " # str4); - -#define expect_single_log_msg(str) \ - do { \ - \ - assert_log_predicate(mock_saved_log_has_message_containing(str) && \ - mock_saved_log_n_entries() == 1, \ - "expected log to contain exactly 1 message " # str); \ - } while (0); - -#define expect_single_log_msg_containing(str) \ - do { \ - assert_log_predicate(mock_saved_log_has_message_containing(str)&& \ - mock_saved_log_n_entries() == 1 , \ - "expected log to contain 1 message, containing " # str); \ - } while (0); - -#define expect_no_log_msg(str) \ - assert_log_predicate(!mock_saved_log_has_message(str), \ - "expected log to not contain " # str); - -#define expect_log_severity(severity) \ - assert_log_predicate(mock_saved_log_has_severity(severity), \ - "expected log to contain severity " # severity); - -#define expect_no_log_severity(severity) \ - assert_log_predicate(!mock_saved_log_has_severity(severity), \ - "expected log to not contain severity " # severity); - -#define expect_log_entry() \ - assert_log_predicate(mock_saved_log_has_entry(), \ - "expected log to contain entries"); - -#define expect_no_log_entry() \ - assert_log_predicate(!mock_saved_log_has_entry(), \ - "expected log to not contain entries"); - -#endif /* !defined(TOR_LOG_TEST_HELPERS_H) */ - diff --git a/src/tor/src/test/ntor_ref.py b/src/tor/src/test/ntor_ref.py deleted file mode 100644 index c753588f9..000000000 --- a/src/tor/src/test/ntor_ref.py +++ /dev/null @@ -1,405 +0,0 @@ -#!/usr/bin/python -# Copyright 2012-2017, The Tor Project, Inc -# See LICENSE for licensing information - -""" -ntor_ref.py - - -This module is a reference implementation for the "ntor" protocol -s proposed by Goldberg, Stebila, and Ustaoglu and as instantiated in -Tor Proposal 216. - -It's meant to be used to validate Tor's ntor implementation. It -requirs the curve25519 python module from the curve25519-donna -package. - - *** DO NOT USE THIS IN PRODUCTION. *** - -commands: - - gen_kdf_vectors: Print out some test vectors for the RFC5869 KDF. - timing: Print a little timing information about this implementation's - handshake. - self-test: Try handshaking with ourself; make sure we can. - test-tor: Handshake with tor's ntor implementation via the program - src/test/test-ntor-cl; make sure we can. - -""" - -import binascii -try: - import curve25519 - curve25519mod = curve25519.keys -except ImportError: - curve25519 = None - import slownacl_curve25519 - curve25519mod = slownacl_curve25519 - -import hashlib -import hmac -import subprocess -import sys - -# ********************************************************************** -# Helpers and constants - -def HMAC(key,msg): - "Return the HMAC-SHA256 of 'msg' using the key 'key'." - H = hmac.new(key, b"", hashlib.sha256) - H.update(msg) - return H.digest() - -def H(msg,tweak): - """Return the hash of 'msg' using tweak 'tweak'. (In this version of ntor, - the tweaked hash is just HMAC with the tweak as the key.)""" - return HMAC(key=tweak, - msg=msg) - -def keyid(k): - """Return the 32-byte key ID of a public key 'k'. (Since we're - using curve25519, we let k be its own keyid.) - """ - return k.serialize() - -NODE_ID_LENGTH = 20 -KEYID_LENGTH = 32 -G_LENGTH = 32 -H_LENGTH = 32 - -PROTOID = b"ntor-curve25519-sha256-1" -M_EXPAND = PROTOID + b":key_expand" -T_MAC = PROTOID + b":mac" -T_KEY = PROTOID + b":key_extract" -T_VERIFY = PROTOID + b":verify" - -def H_mac(msg): return H(msg, tweak=T_MAC) -def H_verify(msg): return H(msg, tweak=T_VERIFY) - -class PrivateKey(curve25519mod.Private): - """As curve25519mod.Private, but doesn't regenerate its public key - every time you ask for it. - """ - def __init__(self): - curve25519mod.Private.__init__(self) - self._memo_public = None - - def get_public(self): - if self._memo_public is None: - self._memo_public = curve25519mod.Private.get_public(self) - - return self._memo_public - -# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -if sys.version < '3': - def int2byte(i): - return chr(i) -else: - def int2byte(i): - return bytes([i]) - -def kdf_rfc5869(key, salt, info, n): - - prk = HMAC(key=salt, msg=key) - - out = b"" - last = b"" - i = 1 - while len(out) < n: - m = last + info + int2byte(i) - last = h = HMAC(key=prk, msg=m) - out += h - i = i + 1 - return out[:n] - -def kdf_ntor(key, n): - return kdf_rfc5869(key, T_KEY, M_EXPAND, n) - -# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -def client_part1(node_id, pubkey_B): - """Initial handshake, client side. - - From the specification: - - <> - - Takes node_id -- a digest of the server's identity key, - pubkey_B -- a public key for the server. - Returns a tuple of (client secret key x, client->server message)""" - - assert len(node_id) == NODE_ID_LENGTH - - key_id = keyid(pubkey_B) - seckey_x = PrivateKey() - pubkey_X = seckey_x.get_public().serialize() - - message = node_id + key_id + pubkey_X - - assert len(message) == NODE_ID_LENGTH + H_LENGTH + H_LENGTH - return seckey_x , message - -def hash_nil(x): - """Identity function: if we don't pass a hash function that does nothing, - the curve25519 python lib will try to sha256 it for us.""" - return x - -def bad_result(r): - """Helper: given a result of multiplying a public key by a private key, - return True iff one of the inputs was broken""" - assert len(r) == 32 - return r == '\x00'*32 - -def server(seckey_b, my_node_id, message, keyBytes=72): - """Handshake step 2, server side. - - From the spec: - - << - The server generates a keypair of y,Y = KEYGEN(), and computes - - secret_input = EXP(X,y) | EXP(X,b) | ID | B | X | Y | PROTOID - KEY_SEED = H(secret_input, t_key) - verify = H(secret_input, t_verify) - auth_input = verify | ID | B | Y | X | PROTOID | "Server" - - The server sends a CREATED cell containing: - - SERVER_PK: Y -- G_LENGTH bytes - AUTH: H(auth_input, t_mac) -- H_LENGTH byets - >> - - Takes seckey_b -- the server's secret key - my_node_id -- the servers's public key digest, - message -- a message from a client - keybytes -- amount of key material to generate - - Returns a tuple of (key material, sever->client reply), or None on - error. - """ - - assert len(message) == NODE_ID_LENGTH + H_LENGTH + H_LENGTH - - if my_node_id != message[:NODE_ID_LENGTH]: - return None - - badness = (keyid(seckey_b.get_public()) != - message[NODE_ID_LENGTH:NODE_ID_LENGTH+H_LENGTH]) - - pubkey_X = curve25519mod.Public(message[NODE_ID_LENGTH+H_LENGTH:]) - seckey_y = PrivateKey() - pubkey_Y = seckey_y.get_public() - pubkey_B = seckey_b.get_public() - xy = seckey_y.get_shared_key(pubkey_X, hash_nil) - xb = seckey_b.get_shared_key(pubkey_X, hash_nil) - - # secret_input = EXP(X,y) | EXP(X,b) | ID | B | X | Y | PROTOID - secret_input = (xy + xb + my_node_id + - pubkey_B.serialize() + - pubkey_X.serialize() + - pubkey_Y.serialize() + - PROTOID) - - verify = H_verify(secret_input) - - # auth_input = verify | ID | B | Y | X | PROTOID | "Server" - auth_input = (verify + - my_node_id + - pubkey_B.serialize() + - pubkey_Y.serialize() + - pubkey_X.serialize() + - PROTOID + - b"Server") - - msg = pubkey_Y.serialize() + H_mac(auth_input) - - badness += bad_result(xb) - badness += bad_result(xy) - - if badness: - return None - - keys = kdf_ntor(secret_input, keyBytes) - - return keys, msg - -def client_part2(seckey_x, msg, node_id, pubkey_B, keyBytes=72): - """Handshake step 3: client side again. - - From the spec: - - << - The client then checks Y is in G^* [see NOTE below], and computes - - secret_input = EXP(Y,x) | EXP(B,x) | ID | B | X | Y | PROTOID - KEY_SEED = H(secret_input, t_key) - verify = H(secret_input, t_verify) - auth_input = verify | ID | B | Y | X | PROTOID | "Server" - - The client verifies that AUTH == H(auth_input, t_mac). - >> - - Takes seckey_x -- the secret key we generated in step 1. - msg -- the message from the server. - node_id -- the node_id we used in step 1. - server_key -- the same public key we used in step 1. - keyBytes -- the number of bytes we want to generate - Returns key material, or None on error - - """ - assert len(msg) == G_LENGTH + H_LENGTH - - pubkey_Y = curve25519mod.Public(msg[:G_LENGTH]) - their_auth = msg[G_LENGTH:] - - pubkey_X = seckey_x.get_public() - - yx = seckey_x.get_shared_key(pubkey_Y, hash_nil) - bx = seckey_x.get_shared_key(pubkey_B, hash_nil) - - - # secret_input = EXP(Y,x) | EXP(B,x) | ID | B | X | Y | PROTOID - secret_input = (yx + bx + node_id + - pubkey_B.serialize() + - pubkey_X.serialize() + - pubkey_Y.serialize() + PROTOID) - - verify = H_verify(secret_input) - - # auth_input = verify | ID | B | Y | X | PROTOID | "Server" - auth_input = (verify + node_id + - pubkey_B.serialize() + - pubkey_Y.serialize() + - pubkey_X.serialize() + PROTOID + - b"Server") - - my_auth = H_mac(auth_input) - - badness = my_auth != their_auth - badness |= bad_result(yx) + bad_result(bx) - - if badness: - return None - - return kdf_ntor(secret_input, keyBytes) - -# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -def demo(node_id=b"iToldYouAboutStairs.", server_key=PrivateKey()): - """ - Try to handshake with ourself. - """ - x, create = client_part1(node_id, server_key.get_public()) - skeys, created = server(server_key, node_id, create) - ckeys = client_part2(x, created, node_id, server_key.get_public()) - assert len(skeys) == 72 - assert len(ckeys) == 72 - assert skeys == ckeys - print("OK") - -# ====================================================================== -def timing(): - """ - Use Python's timeit module to see how fast this nonsense is - """ - import timeit - t = timeit.Timer(stmt="ntor_ref.demo(N,SK)", - setup="import ntor_ref,curve25519;N='ABCD'*5;SK=ntor_ref.PrivateKey()") - print(t.timeit(number=1000)) - -# ====================================================================== - -def kdf_vectors(): - """ - Generate some vectors to check our KDF. - """ - import binascii - def kdf_vec(inp): - k = kdf_rfc5869(inp, T_KEY, M_EXPAND, 100) - print(repr(inp), "\n\""+ binascii.b2a_hex(k)+ "\"") - kdf_vec("") - kdf_vec("Tor") - kdf_vec("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT") - -# ====================================================================== - - -def test_tor(): - """ - Call the test-ntor-cl command-line program to make sure we can - interoperate with Tor's ntor program - """ - enhex=lambda s: binascii.b2a_hex(s) - dehex=lambda s: binascii.a2b_hex(s.strip()) - - PROG = b"./src/test/test-ntor-cl" - def tor_client1(node_id, pubkey_B): - " returns (msg, state) " - p = subprocess.Popen([PROG, b"client1", enhex(node_id), - enhex(pubkey_B.serialize())], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - def tor_server1(seckey_b, node_id, msg, n): - " returns (msg, keys) " - p = subprocess.Popen([PROG, "server1", enhex(seckey_b.serialize()), - enhex(node_id), enhex(msg), str(n)], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - def tor_client2(state, msg, n): - " returns (keys,) " - p = subprocess.Popen([PROG, "client2", enhex(state), - enhex(msg), str(n)], - stdout=subprocess.PIPE) - return map(dehex, p.stdout.readlines()) - - - node_id = b"thisisatornodeid$#%^" - seckey_b = PrivateKey() - pubkey_B = seckey_b.get_public() - - # Do a pure-Tor handshake - c2s_msg, c_state = tor_client1(node_id, pubkey_B) - s2c_msg, s_keys = tor_server1(seckey_b, node_id, c2s_msg, 90) - c_keys, = tor_client2(c_state, s2c_msg, 90) - assert c_keys == s_keys - assert len(c_keys) == 90 - - # Try a mixed handshake with Tor as the client - c2s_msg, c_state = tor_client1(node_id, pubkey_B) - s_keys, s2c_msg = server(seckey_b, node_id, c2s_msg, 90) - c_keys, = tor_client2(c_state, s2c_msg, 90) - assert c_keys == s_keys - assert len(c_keys) == 90 - - # Now do a mixed handshake with Tor as the server - c_x, c2s_msg = client_part1(node_id, pubkey_B) - s2c_msg, s_keys = tor_server1(seckey_b, node_id, c2s_msg, 90) - c_keys = client_part2(c_x, s2c_msg, node_id, pubkey_B, 90) - assert c_keys == s_keys - assert len(c_keys) == 90 - - print("OK") - -# ====================================================================== - -if __name__ == '__main__': - if len(sys.argv) < 2: - print(__doc__) - elif sys.argv[1] == 'gen_kdf_vectors': - kdf_vectors() - elif sys.argv[1] == 'timing': - timing() - elif sys.argv[1] == 'self-test': - demo() - elif sys.argv[1] == 'test-tor': - test_tor() - - else: - print(__doc__) diff --git a/src/tor/src/test/rend_test_helpers.c b/src/tor/src/test/rend_test_helpers.c deleted file mode 100644 index 095bfecf2..000000000 --- a/src/tor/src/test/rend_test_helpers.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "test.h" -#include "rendcommon.h" -#include "rend_test_helpers.h" - -void -generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, - char **service_id, int intro_points) -{ - rend_service_descriptor_t *generated = NULL; - smartlist_t *descs = smartlist_new(); - time_t now; - - now = time(NULL) + time_diff; - create_descriptor(&generated, service_id, intro_points); - generated->timestamp = now; - - rend_encode_v2_descriptors(descs, generated, now, 0, REND_NO_AUTH, NULL, - NULL); - tor_assert(smartlist_len(descs) > 1); - *desc = smartlist_get(descs, 0); - smartlist_set(descs, 0, NULL); - - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - rend_service_descriptor_free(generated); -} - -void -create_descriptor(rend_service_descriptor_t **generated, char **service_id, - int intro_points) -{ - crypto_pk_t *pk1 = NULL; - crypto_pk_t *pk2 = NULL; - int i; - - *service_id = tor_malloc(REND_SERVICE_ID_LEN_BASE32+1); - pk1 = pk_generate(0); - pk2 = pk_generate(1); - - *generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - (*generated)->pk = crypto_pk_dup_key(pk1); - rend_get_service_id((*generated)->pk, *service_id); - - (*generated)->version = 2; - (*generated)->protocols = 42; - (*generated)->intro_nodes = smartlist_new(); - - for (i = 0; i < intro_points; i++) { - rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - crypto_pk_t *okey = pk_generate(2 + i); - intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); - intro->extend_info->onion_key = okey; - crypto_pk_get_digest(intro->extend_info->onion_key, - intro->extend_info->identity_digest); - intro->extend_info->nickname[0] = '$'; - base16_encode(intro->extend_info->nickname + 1, - sizeof(intro->extend_info->nickname) - 1, - intro->extend_info->identity_digest, DIGEST_LEN); - tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536)); - intro->extend_info->port = 1 + crypto_rand_int(65535); - intro->intro_key = crypto_pk_dup_key(pk2); - smartlist_add((*generated)->intro_nodes, intro); - } - - crypto_pk_free(pk1); - crypto_pk_free(pk2); -} - -rend_data_t * -mock_rend_data(const char *onion_address) -{ - rend_data_v2_t *v2_data = tor_malloc_zero(sizeof(*v2_data)); - rend_data_t *rend_query = &v2_data->base_; - rend_query->version = 2; - - strlcpy(v2_data->onion_address, onion_address, - sizeof(v2_data->onion_address)); - v2_data->auth_type = REND_NO_AUTH; - rend_query->hsdirs_fp = smartlist_new(); - smartlist_add(rend_query->hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa", - DIGEST_LEN)); - return rend_query; -} - diff --git a/src/tor/src/test/rend_test_helpers.h b/src/tor/src/test/rend_test_helpers.h deleted file mode 100644 index abf432498..000000000 --- a/src/tor/src/test/rend_test_helpers.h +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" - -#ifndef TOR_REND_TEST_HELPERS_H -#define TOR_REND_TEST_HELPERS_H - -void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, - char **service_id, int intro_points); -void create_descriptor(rend_service_descriptor_t **generated, - char **service_id, int intro_points); -rend_data_t *mock_rend_data(const char *onion_address); - -#endif /* !defined(TOR_REND_TEST_HELPERS_H) */ - diff --git a/src/tor/src/test/slow_ed25519.py b/src/tor/src/test/slow_ed25519.py deleted file mode 100644 index f44708b20..000000000 --- a/src/tor/src/test/slow_ed25519.py +++ /dev/null @@ -1,115 +0,0 @@ -# This is the ed25519 implementation from -# http://ed25519.cr.yp.to/python/ed25519.py . -# It is in the public domain. -# -# It isn't constant-time. Don't use it except for testing. Also, see -# warnings about how very slow it is. Only use this for generating -# test vectors, I'd suggest. -# -# Don't edit this file. Mess with ed25519_ref.py - -import hashlib - -b = 256 -q = 2**255 - 19 -l = 2**252 + 27742317777372353535851937790883648493 - -def H(m): - return hashlib.sha512(m).digest() - -def expmod(b,e,m): - if e == 0: return 1 - t = expmod(b,e/2,m)**2 % m - if e & 1: t = (t*b) % m - return t - -def inv(x): - return expmod(x,q-2,q) - -d = -121665 * inv(121666) -I = expmod(2,(q-1)/4,q) - -def xrecover(y): - xx = (y*y-1) * inv(d*y*y+1) - x = expmod(xx,(q+3)/8,q) - if (x*x - xx) % q != 0: x = (x*I) % q - if x % 2 != 0: x = q-x - return x - -By = 4 * inv(5) -Bx = xrecover(By) -B = [Bx % q,By % q] - -def edwards(P,Q): - x1 = P[0] - y1 = P[1] - x2 = Q[0] - y2 = Q[1] - x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) - y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) - return [x3 % q,y3 % q] - -def scalarmult(P,e): - if e == 0: return [0,1] - Q = scalarmult(P,e/2) - Q = edwards(Q,Q) - if e & 1: Q = edwards(Q,P) - return Q - -def encodeint(y): - bits = [(y >> i) & 1 for i in range(b)] - return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) - -def encodepoint(P): - x = P[0] - y = P[1] - bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1] - return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) - -def bit(h,i): - return (ord(h[i/8]) >> (i%8)) & 1 - -def publickey(sk): - h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - A = scalarmult(B,a) - return encodepoint(A) - -def Hint(m): - h = H(m) - return sum(2**i * bit(h,i) for i in range(2*b)) - -def signature(m,sk,pk): - h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) - R = scalarmult(B,r) - S = (r + Hint(encodepoint(R) + pk + m) * a) % l - return encodepoint(R) + encodeint(S) - -def isoncurve(P): - x = P[0] - y = P[1] - return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0 - -def decodeint(s): - return sum(2**i * bit(s,i) for i in range(0,b)) - -def decodepoint(s): - y = sum(2**i * bit(s,i) for i in range(0,b-1)) - x = xrecover(y) - if x & 1 != bit(s,b-1): x = q-x - P = [x,y] - if not isoncurve(P): raise Exception("decoding point that is not on curve") - return P - -def checkvalid(s,m,pk): - if len(s) != b/4: raise Exception("signature length is wrong") - if len(pk) != b/8: raise Exception("public-key length is wrong") - R = decodepoint(s[0:b/8]) - A = decodepoint(pk) - S = decodeint(s[b/8:b/4]) - h = Hint(encodepoint(R) + pk + m) - if scalarmult(B,S) != edwards(R,scalarmult(A,h)): - raise Exception("signature does not pass verification") - diff --git a/src/tor/src/test/slownacl_curve25519.py b/src/tor/src/test/slownacl_curve25519.py deleted file mode 100644 index 4dabab61b..000000000 --- a/src/tor/src/test/slownacl_curve25519.py +++ /dev/null @@ -1,117 +0,0 @@ -# This is the curve25519 implementation from Matthew Dempsky's "Slownacl" -# library. It is in the public domain. -# -# It isn't constant-time. Don't use it except for testing. -# -# Nick got the slownacl source from: -# https://github.com/mdempsky/dnscurve/tree/master/slownacl - -__all__ = ['smult_curve25519_base', 'smult_curve25519'] - -import sys - -P = 2 ** 255 - 19 -A = 486662 - -def expmod(b, e, m): - if e == 0: return 1 - t = expmod(b, e // 2, m) ** 2 % m - if e & 1: t = (t * b) % m - return t - -def inv(x): - return expmod(x, P - 2, P) - -# Addition and doubling formulas taken from Appendix D of "Curve25519: -# new Diffie-Hellman speed records". - -def add(n,m,d): - (xn,zn), (xm,zm), (xd,zd) = n, m, d - x = 4 * (xm * xn - zm * zn) ** 2 * zd - z = 4 * (xm * zn - zm * xn) ** 2 * xd - return (x % P, z % P) - -def double(n): - (xn,zn) = n - x = (xn ** 2 - zn ** 2) ** 2 - z = 4 * xn * zn * (xn ** 2 + A * xn * zn + zn ** 2) - return (x % P, z % P) - -def curve25519(n, base): - one = (base,1) - two = double(one) - # f(m) evaluates to a tuple containing the mth multiple and the - # (m+1)th multiple of base. - def f(m): - if m == 1: return (one, two) - (pm, pm1) = f(m // 2) - if (m & 1): - return (add(pm, pm1, one), double(pm1)) - return (double(pm), add(pm, pm1, one)) - ((x,z), _) = f(n) - return (x * inv(z)) % P - -if sys.version < '3': - def b2i(c): - return ord(c) - def i2b(i): - return chr(i) - def ba2bs(ba): - return "".join(ba) -else: - def b2i(c): - return c - def i2b(i): - return i - def ba2bs(ba): - return bytes(ba) - -def unpack(s): - if len(s) != 32: raise ValueError('Invalid Curve25519 argument') - return sum(b2i(s[i]) << (8 * i) for i in range(32)) - -def pack(n): - return ba2bs([i2b((n >> (8 * i)) & 255) for i in range(32)]) - -def clamp(n): - n &= ~7 - n &= ~(128 << 8 * 31) - n |= 64 << 8 * 31 - return n - -def smult_curve25519(n, p): - n = clamp(unpack(n)) - p = unpack(p) - return pack(curve25519(n, p)) - -def smult_curve25519_base(n): - n = clamp(unpack(n)) - return pack(curve25519(n, 9)) - - -# -# This part I'm adding in for compatibility with the curve25519 python -# module. -Nick -# -import os - -class Private: - def __init__(self, secret=None, seed=None): - self.private = pack(clamp(unpack(os.urandom(32)))) - - def get_public(self): - return Public(smult_curve25519_base(self.private)) - - def get_shared_key(self, public, hashfn): - return hashfn(smult_curve25519(self.private, public.public)) - - def serialize(self): - return self.private - -class Public: - def __init__(self, public): - self.public = public - - def serialize(self): - return self.public - diff --git a/src/tor/src/test/sr_commit_calc_ref.py b/src/tor/src/test/sr_commit_calc_ref.py deleted file mode 100644 index 45e629cfb..000000000 --- a/src/tor/src/test/sr_commit_calc_ref.py +++ /dev/null @@ -1,51 +0,0 @@ -# This is a reference implementation of the COMMIT/REVEAL calculation for -# prop250. We use it to generate a test vector for the test_encoding() -# unittest. -# -# Here is the computation formula: -# -# H = SHA3-256 -# TIMESTAMP = 8 bytes network-endian value -# RAND = H(32 bytes of random) -# -# REVEAL = base64-encode( TIMESTAMP || RAND ) -# COMMIT = base64-encode( TIMESTAMP || H(REVEAL) ) -# - -import sys -import hashlib -import struct -import base64 - -# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires -# the pysha3 package (pip install pysha3). -if sys.version_info < (3, 6): - import sha3 - -# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 -# used the old Keccak implementation. During the finalization of SHA3, NIST -# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function -# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. -TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" -if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): - print("pysha3 version is < 1.0. Please install from:") - print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") - sys.exit(1) - -# TIMESTAMP -ts = 1454333590 -# RAND -data = 'A' * 32 # Yes very very random, NIST grade :). -rand = hashlib.sha3_256(data) - -reveal = struct.pack('!Q', ts) + rand.digest() -b64_reveal = base64.b64encode(reveal) -print("REVEAL: %s" % (b64_reveal)) - -# Yes we do hash the _encoded_ reveal here that is H(REVEAL) -hashed_reveal = hashlib.sha3_256(b64_reveal) -commit = struct.pack('!Q', ts) + hashed_reveal.digest() -print("COMMIT: %s" % (base64.b64encode(commit))) - -# REVEAL: AAAAAFavXpZJxbwTupvaJCTeIUCQmOPxAMblc7ChL5H2nZKuGchdaA== -# COMMIT: AAAAAFavXpbkBMzMQG7aNoaGLFNpm2Wkk1ozXhuWWqL//GynltxVAg== diff --git a/src/tor/src/test/sr_srv_calc_ref.py b/src/tor/src/test/sr_srv_calc_ref.py deleted file mode 100644 index 492ca62b1..000000000 --- a/src/tor/src/test/sr_srv_calc_ref.py +++ /dev/null @@ -1,71 +0,0 @@ -# This is a reference implementation of the SRV calculation for prop250. We -# use it to generate a test vector for the test_sr_compute_srv() unittest. -# (./test shared-random/sr_compute_srv) -# -# Here is the SRV computation formula: -# -# HASHED_REVEALS = H(ID_a | R_a | ID_b | R_b | ..) -# -# SRV = SHA3-256("shared-random" | INT_8(reveal_num) | INT_4(version) | -# HASHED_REVEALS | previous_SRV) -# - -import sys -import hashlib -import struct - -# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires -# the pysha3 package (pip install pysha3). -if sys.version_info < (3, 6): - import sha3 - -# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0 -# used the old Keccak implementation. During the finalization of SHA3, NIST -# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function -# stayed the same. pysha3 1.0 provides the previous Keccak hash, too. -TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51" -if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest(): - print("pysha3 version is < 1.0. Please install from:") - print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3") - sys.exit(1) - -# In this example, we use three reveal values. -reveal_num = 3 -version = 1 - -# We set directly the ascii value because memset(buf, 'A', 20) makes it to 20 -# times "41" in the final string. - -# Identity and reveal value of dirauth a -ID_a = 20 * "41" # RSA identity of 40 base16 bytes. -R_a = 56 * 'A' # 56 base64 characters - -# Identity and reveal value of dirauth b -ID_b = 20 * "42" # RSA identity of 40 base16 bytes. -R_b = 56 * 'B' # 56 base64 characters - -# Identity and reveal value of dirauth c -ID_c = 20 * "43" # RSA identity of 40 base16 bytes. -R_c = 56 * 'C' # 56 base64 characters - -# Concatenate them all together and hash them to form HASHED_REVEALS. -REVEALS = (ID_a + R_a + ID_b + R_b + ID_c + R_c).encode() -hashed_reveals_object = hashlib.sha3_256(REVEALS) -hashed_reveals = hashed_reveals_object.digest() - -previous_SRV = (32 * 'Z').encode() - -# Now form the message. -#srv_msg = struct.pack('13sQL256ss', "shared-random", reveal_num, version, -# hashed_reveals, previous_SRV) -invariant_token = b"shared-random" -srv_msg = invariant_token + \ - struct.pack('!QL', reveal_num, version) + \ - hashed_reveals + \ - previous_SRV - -# Now calculate the HMAC -srv = hashlib.sha3_256(srv_msg) -print("%s" % srv.hexdigest().upper()) - -# 2A9B1D6237DAB312A40F575DA85C147663E7ED3F80E9555395F15B515C74253D diff --git a/src/tor/src/test/test-child.c b/src/tor/src/test/test-child.c deleted file mode 100644 index f78a82910..000000000 --- a/src/tor/src/test/test-child.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include -#ifdef _WIN32 -#define WINDOWS_LEAN_AND_MEAN -#include -#else -#include -#endif /* defined(_WIN32) */ -#include - -#ifdef _WIN32 -#define SLEEP(sec) Sleep((sec)*1000) -#else -#define SLEEP(sec) sleep(sec) -#endif - -/** Trivial test program which prints out its command line arguments so we can - * check if tor_spawn_background() works */ -int -main(int argc, char **argv) -{ - int i; - int delay = 1; - int fast = 0; - - if (argc > 1) { - if (!strcmp(argv[1], "--hang")) { - delay = 60; - } else if (!strcmp(argv[1], "--fast")) { - fast = 1; - delay = 0; - } - } - - fprintf(stdout, "OUT\n"); - fprintf(stderr, "ERR\n"); - for (i = 1; i < argc; i++) - fprintf(stdout, "%s\n", argv[i]); - if (!fast) - fprintf(stdout, "SLEEPING\n"); - /* We need to flush stdout so that test_util_spawn_background_partial_read() - succeed. Otherwise ReadFile() will get the entire output in one */ - // XXX: Can we make stdio flush on newline? - fflush(stdout); - if (!fast) - SLEEP(1); - fprintf(stdout, "DONE\n"); - fflush(stdout); - if (fast) - return 0; - - while (--delay) { - SLEEP(1); - } - - return 0; -} - diff --git a/src/tor/src/test/test-memwipe.c b/src/tor/src/test/test-memwipe.c deleted file mode 100644 index 89d946d50..000000000 --- a/src/tor/src/test/test-memwipe.c +++ /dev/null @@ -1,218 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include -#include -#include -#include - -#include "crypto.h" -#include "compat.h" -#include "util.h" - -static unsigned fill_a_buffer_memset(void) __attribute__((noinline)); -static unsigned fill_a_buffer_memwipe(void) __attribute__((noinline)); -static unsigned fill_a_buffer_nothing(void) __attribute__((noinline)); -static unsigned fill_heap_buffer_memset(void) __attribute__((noinline)); -static unsigned fill_heap_buffer_memwipe(void) __attribute__((noinline)); -static unsigned fill_heap_buffer_nothing(void) __attribute__((noinline)); -static unsigned check_a_buffer(void) __attribute__((noinline)); - -extern const char *s; /* Make the linkage global */ -const char *s = NULL; - -#define BUF_LEN 2048 - -#define FILL_BUFFER_IMPL() \ - unsigned int i; \ - unsigned sum = 0; \ - \ - /* Fill up a 1k buffer with a recognizable pattern. */ \ - for (i = 0; i < BUF_LEN; i += strlen(s)) { \ - memcpy(buf+i, s, MIN(strlen(s), BUF_LEN-i)); \ - } \ - \ - /* Use the buffer as input to a computation so the above can't get */ \ - /* optimized away. */ \ - for (i = 0; i < BUF_LEN; ++i) { \ - sum += (unsigned char)buf[i]; \ - } - -#ifdef OpenBSD -/* Disable some of OpenBSD's malloc protections for this test. This helps - * us do bad things, such as access freed buffers, without crashing. */ -const char *malloc_options="sufjj"; -#endif - -static unsigned -fill_a_buffer_memset(void) -{ - char buf[BUF_LEN]; - FILL_BUFFER_IMPL() - memset(buf, 0, sizeof(buf)); - return sum; -} - -static unsigned -fill_a_buffer_memwipe(void) -{ - char buf[BUF_LEN]; - FILL_BUFFER_IMPL() - memwipe(buf, 0, sizeof(buf)); - return sum; -} - -static unsigned -fill_a_buffer_nothing(void) -{ - char buf[BUF_LEN]; - FILL_BUFFER_IMPL() - return sum; -} - -static inline int -vmemeq(volatile char *a, const char *b, size_t n) -{ - while (n--) { - if (*a++ != *b++) - return 0; - } - return 1; -} - -static unsigned -check_a_buffer(void) -{ - unsigned int i; - volatile char buf[BUF_LEN]; - unsigned sum = 0; - - /* See if this buffer has the string in it. - - YES, THIS DOES INVOKE UNDEFINED BEHAVIOR BY READING FROM AN UNINITIALIZED - BUFFER. - - If you know a better way to figure out whether the compiler eliminated - the memset/memwipe calls or not, please let me know. - */ - for (i = 0; i < BUF_LEN - strlen(s); ++i) { - if (vmemeq(buf+i, s, strlen(s))) - ++sum; - } - - return sum; -} - -static char *heap_buf = NULL; - -static unsigned -fill_heap_buffer_memset(void) -{ - char *buf = heap_buf = raw_malloc(BUF_LEN); - FILL_BUFFER_IMPL() - memset(buf, 0, BUF_LEN); - raw_free(buf); - return sum; -} - -static unsigned -fill_heap_buffer_memwipe(void) -{ - char *buf = heap_buf = raw_malloc(BUF_LEN); - FILL_BUFFER_IMPL() - memwipe(buf, 0, BUF_LEN); - raw_free(buf); - return sum; -} - -static unsigned -fill_heap_buffer_nothing(void) -{ - char *buf = heap_buf = raw_malloc(BUF_LEN); - FILL_BUFFER_IMPL() - raw_free(buf); - return sum; -} - -static unsigned -check_heap_buffer(void) -{ - unsigned int i; - unsigned sum = 0; - volatile char *buf = heap_buf; - - /* See if this buffer has the string in it. - - YES, THIS DOES INVOKE UNDEFINED BEHAVIOR BY READING FROM A FREED BUFFER. - - If you know a better way to figure out whether the compiler eliminated - the memset/memwipe calls or not, please let me know. - */ - for (i = 0; i < BUF_LEN - strlen(s); ++i) { - if (vmemeq(buf+i, s, strlen(s))) - ++sum; - } - - return sum; -} - -static struct testcase { - const char *name; - /* this spacing satisfies make check-spaces */ - unsigned - (*fill_fn)(void); - unsigned - (*check_fn)(void); -} testcases[] = { - { "nil", fill_a_buffer_nothing, check_a_buffer }, - { "nil-heap", fill_heap_buffer_nothing, check_heap_buffer }, - { "memset", fill_a_buffer_memset, check_a_buffer }, - { "memset-heap", fill_heap_buffer_memset, check_heap_buffer }, - { "memwipe", fill_a_buffer_memwipe, check_a_buffer }, - { "memwipe-heap", fill_heap_buffer_memwipe, check_heap_buffer }, - { NULL, NULL, NULL } -}; - -int -main(int argc, char **argv) -{ - unsigned x, x2; - int i; - int working = 1; - unsigned found[6]; - (void) argc; (void) argv; - - s = "squamous haberdasher gallimaufry"; - - memset(found, 0, sizeof(found)); - - for (i = 0; testcases[i].name; ++i) { - x = testcases[i].fill_fn(); - found[i] = testcases[i].check_fn(); - - x2 = fill_a_buffer_nothing(); - - if (x != x2) { - working = 0; - } - } - - if (!working || !found[0] || !found[1]) { - printf("It appears that this test case may not give you reliable " - "information. Sorry.\n"); - } - - if (!found[2] && !found[3]) { - printf("It appears that memset is good enough on this platform. Good.\n"); - } - - if (found[4] || found[5]) { - printf("ERROR: memwipe does not wipe data!\n"); - return 1; - } else { - printf("OKAY: memwipe seems to work.\n"); - return 0; - } -} - diff --git a/src/tor/src/test/test-network.sh b/src/tor/src/test/test-network.sh deleted file mode 100644 index 6e0f28657..000000000 --- a/src/tor/src/test/test-network.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/sh - -# This script calls the equivalent script in chutney/tools - -# If we already know CHUTNEY_PATH, don't bother with argument parsing -TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" -# Call the chutney version of this script, if it exists, and we can find it -if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then - # we can't produce any output, because we might be --quiet - # this preserves arguments with spaces correctly - exec "$TEST_NETWORK" "$@" -fi - -# We need to go looking for CHUTNEY_PATH - -# Do we output anything at all? -ECHO="${ECHO:-echo}" -# Output is prefixed with the name of the script -myname=$(basename $0) - -# Save the arguments before we destroy them -# This might not preserve arguments with spaces in them -ORIGINAL_ARGS="$@" - -# We need to find CHUTNEY_PATH, so that we can call the version of this script -# in chutney/tools with the same arguments. We also need to respect --quiet. -until [ -z "$1" ] -do - case "$1" in - --chutney-path) - CHUTNEY_PATH="$2" - shift - ;; - --tor-path) - TOR_DIR="$2" - shift - ;; - --quiet) - ECHO=true - ;; - *) - # maybe chutney's test-network.sh can handle it - ;; - esac - shift -done - -# optional: $TOR_DIR is the tor build directory -# it's used to find the location of tor binaries -# if it's not set: -# - set it to $BUILDDIR, or -# - if $PWD looks like a tor build directory, set it to $PWD, or -# - unset $TOR_DIR, and let chutney fall back to finding tor binaries in $PATH -if [ ! -d "$TOR_DIR" ]; then - if [ -d "$BUILDDIR/src/or" -a -d "$BUILDDIR/src/tools" ]; then - # Choose the build directory - # But only if it looks like one - $ECHO "$myname: \$TOR_DIR not set, trying \$BUILDDIR" - TOR_DIR="$BUILDDIR" - elif [ -d "$PWD/src/or" -a -d "$PWD/src/tools" ]; then - # Guess the tor directory is the current directory - # But only if it looks like one - $ECHO "$myname: \$TOR_DIR not set, trying \$PWD" - TOR_DIR="$PWD" - else - $ECHO "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" - unset TOR_DIR - fi -fi - -# mandatory: $CHUTNEY_PATH is the path to the chutney launch script -# if it's not set: -# - if $PWD looks like a chutney directory, set it to $PWD, or -# - set it based on $TOR_DIR, expecting chutney to be next to tor, or -# - fail and tell the user how to clone the chutney repository -if [ ! -d "$CHUTNEY_PATH" -o ! -x "$CHUTNEY_PATH/chutney" ]; then - if [ -x "$PWD/chutney" ]; then - $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" - CHUTNEY_PATH="$PWD" - elif [ -d "$TOR_DIR" -a -d "$TOR_DIR/../chutney" -a \ - -x "$TOR_DIR/../chutney/chutney" ]; then - $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" - CHUTNEY_PATH="$TOR_DIR/../chutney" - else - $ECHO "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" - $ECHO "$myname: Get chutney: git clone https://git.torproject.org/\ -chutney.git" - $ECHO "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ -CHUTNEY_PATH=\`pwd\`/chutney" - unset CHUTNEY_PATH - exit 1 - fi -fi - -TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" -# Call the chutney version of this script, if it exists, and we can find it -if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then - $ECHO "$myname: Calling newer chutney script $TEST_NETWORK" - # this may fail if some arguments have spaces in them - # if so, set CHUTNEY_PATH before calling test-network.sh, and spaces - # will be handled correctly - exec "$TEST_NETWORK" $ORIGINAL_ARGS -else - $ECHO "$myname: Could not find tools/test-network.sh in CHUTNEY_PATH." - $ECHO "$myname: Please update your chutney using 'git pull'." - # We have failed to do what the user asked - exit 1 -fi diff --git a/src/tor/src/test/test-timers.c b/src/tor/src/test/test-timers.c deleted file mode 100644 index a0b5b535c..000000000 --- a/src/tor/src/test/test-timers.c +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include -#include -#include - -#include - -#include "compat.h" -#include "compat_libevent.h" -#include "crypto.h" -#include "timers.h" -#include "util.h" - -#define N_TIMERS 1000 -#define MAX_DURATION 30 -#define N_DISABLE 5 - -static struct timeval fire_at[N_TIMERS] = { {0,0} }; -static int is_disabled[N_TIMERS] = {0}; -static int fired[N_TIMERS] = {0}; -static struct timeval difference[N_TIMERS] = { {0,0} }; -static tor_timer_t *timers[N_TIMERS] = {NULL}; - -static int n_active_timers = 0; -static int n_fired = 0; - -static monotime_t started_at; -static int64_t delay_usec[N_TIMERS]; -static int64_t diffs_mono_usec[N_TIMERS]; - -static void -timer_cb(tor_timer_t *t, void *arg, const monotime_t *now_mono) -{ - struct timeval now; - - tor_gettimeofday(&now); - tor_timer_t **t_ptr = arg; - tor_assert(*t_ptr == t); - int idx = (int) (t_ptr - timers); - ++fired[idx]; - timersub(&now, &fire_at[idx], &difference[idx]); - diffs_mono_usec[idx] = - monotime_diff_usec(&started_at, now_mono) - - delay_usec[idx]; - ++n_fired; - - // printf("%d / %d\n",n_fired, N_TIMERS); - if (n_fired == n_active_timers) { - event_base_loopbreak(tor_libevent_get_base()); - } -} - -int -main(int argc, char **argv) -{ - (void)argc; - (void)argv; - tor_libevent_cfg cfg; - memset(&cfg, 0, sizeof(cfg)); - tor_libevent_initialize(&cfg); - timers_initialize(); - - int i; - int ret; - struct timeval now; - tor_gettimeofday(&now); - monotime_get(&started_at); - for (i = 0; i < N_TIMERS; ++i) { - struct timeval delay; - delay.tv_sec = crypto_rand_int_range(0,MAX_DURATION); - delay.tv_usec = crypto_rand_int_range(0,1000000); - delay_usec[i] = delay.tv_sec * 1000000 + delay.tv_usec; - timeradd(&now, &delay, &fire_at[i]); - timers[i] = timer_new(timer_cb, &timers[i]); - timer_schedule(timers[i], &delay); - ++n_active_timers; - } - - /* Disable some; we'll make sure they don't trigger. */ - for (i = 0; i < N_DISABLE; ++i) { - int idx = crypto_rand_int_range(0, N_TIMERS); - if (is_disabled[idx]) - continue; - is_disabled[idx] = 1; - timer_disable(timers[idx]); - --n_active_timers; - } - - event_base_loop(tor_libevent_get_base(), 0); - - int64_t total_difference = 0; - uint64_t total_square_difference = 0; - tor_assert(n_fired == n_active_timers); - for (i = 0; i < N_TIMERS; ++i) { - if (is_disabled[i]) { - tor_assert(fired[i] == 0); - continue; - } - tor_assert(fired[i] == 1); - //int64_t diff = difference[i].tv_usec + difference[i].tv_sec * 1000000; - int64_t diff = diffs_mono_usec[i]; - total_difference += diff; - total_square_difference += diff*diff; - } - const int64_t mean_diff = total_difference / n_active_timers; - printf("mean difference: "I64_FORMAT" usec\n", - I64_PRINTF_ARG(mean_diff)); - - const double mean_sq = ((double)total_square_difference)/ n_active_timers; - const double sq_mean = mean_diff * mean_diff; - const double stddev = sqrt(mean_sq - sq_mean); - printf("standard deviation: %lf usec\n", stddev); - -#define MAX_DIFF_USEC (500*1000) -#define MAX_STDDEV_USEC (500*1000) -#define ODD_DIFF_USEC (2000) -#define ODD_STDDEV_USEC (2000) - - if (mean_diff < 0 || mean_diff > MAX_DIFF_USEC || stddev > MAX_STDDEV_USEC) { - printf("Either your system is under ridiculous load, or the " - "timer backend is broken.\n"); - ret = 1; - } else if (mean_diff > ODD_DIFF_USEC || stddev > ODD_STDDEV_USEC) { - printf("Either your system is a bit slow or the " - "timer backend is odd.\n"); - ret = 0; - } else { - printf("Looks good enough.\n"); - ret = 0; - } - - timer_free_(NULL); - - for (i = 0; i < N_TIMERS; ++i) { - timer_free(timers[i]); - } - timers_shutdown(); - return ret; -} - diff --git a/src/tor/src/test/test.c b/src/tor/src/test/test.c deleted file mode 100644 index f225fd277..000000000 --- a/src/tor/src/test/test.c +++ /dev/null @@ -1,1248 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test.c - * \brief Unit tests for many pieces of the lower level Tor modules. - **/ - -#include "orconfig.h" - -#include -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef _WIN32 -/* For mkdir() */ -#include -#else -#include -#endif /* defined(_WIN32) */ - -/* These macros pull in declarations for some functions and structures that - * are typically file-private. */ -#define GEOIP_PRIVATE -#define ROUTER_PRIVATE -#define CIRCUITSTATS_PRIVATE -#define CIRCUITLIST_PRIVATE -#define MAIN_PRIVATE -#define STATEFILE_PRIVATE - -/* - * Linux doesn't provide lround in math.h by default, but mac os does... - * It's best just to leave math.h out of the picture entirely. - */ -//#include -long int lround(double x); -double fabs(double x); - -#include "or.h" -#include "backtrace.h" -#include "buffers.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "compress.h" -#include "config.h" -#include "connection_edge.h" -#include "geoip.h" -#include "rendcommon.h" -#include "rendcache.h" -#include "test.h" -#include "main.h" -#include "memarea.h" -#include "onion.h" -#include "onion_ntor.h" -#include "onion_fast.h" -#include "onion_tap.h" -#include "policies.h" -#include "rephist.h" -#include "routerparse.h" -#include "statefile.h" -#include "crypto_curve25519.h" -#include "onion_ntor.h" - -/** Run unit tests for the onion handshake code. */ -static void -test_onion_handshake(void *arg) -{ - /* client-side */ - crypto_dh_t *c_dh = NULL; - char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; - char c_keys[40]; - /* server-side */ - char s_buf[TAP_ONIONSKIN_REPLY_LEN]; - char s_keys[40]; - int i; - /* shared */ - crypto_pk_t *pk = NULL, *pk2 = NULL; - - (void)arg; - pk = pk_generate(0); - pk2 = pk_generate(1); - - /* client handshake 1. */ - memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf)); - - for (i = 1; i <= 3; ++i) { - crypto_pk_t *k1, *k2; - if (i==1) { - /* server handshake: only one key known. */ - k1 = pk; k2 = NULL; - } else if (i==2) { - /* server handshake: try the right key first. */ - k1 = pk; k2 = pk2; - } else { - /* server handshake: try the right key second. */ - k1 = pk2; k2 = pk; - } - - memset(s_buf, 0, TAP_ONIONSKIN_REPLY_LEN); - memset(s_keys, 0, 40); - tt_assert(! onion_skin_TAP_server_handshake(c_buf, k1, k2, - s_buf, s_keys, 40)); - - /* client handshake 2 */ - memset(c_keys, 0, 40); - tt_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, - 40, NULL)); - - tt_mem_op(c_keys,OP_EQ, s_keys, 40); - memset(s_buf, 0, 40); - tt_mem_op(c_keys,OP_NE, s_buf, 40); - } - done: - crypto_dh_free(c_dh); - crypto_pk_free(pk); - crypto_pk_free(pk2); -} - -static void -test_bad_onion_handshake(void *arg) -{ - char junk_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; - char junk_buf2[TAP_ONIONSKIN_CHALLENGE_LEN]; - /* client-side */ - crypto_dh_t *c_dh = NULL; - char c_buf[TAP_ONIONSKIN_CHALLENGE_LEN]; - char c_keys[40]; - /* server-side */ - char s_buf[TAP_ONIONSKIN_REPLY_LEN]; - char s_keys[40]; - /* shared */ - crypto_pk_t *pk = NULL, *pk2 = NULL; - - (void)arg; - - pk = pk_generate(0); - pk2 = pk_generate(1); - - /* Server: Case 1: the encrypted data is degenerate. */ - memset(junk_buf, 0, sizeof(junk_buf)); - crypto_pk_obsolete_public_hybrid_encrypt(pk, - junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN, - junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1); - tt_int_op(-1, OP_EQ, - onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, - s_buf, s_keys, 40)); - - /* Server: Case 2: the encrypted data is not long enough. */ - memset(junk_buf, 0, sizeof(junk_buf)); - memset(junk_buf2, 0, sizeof(junk_buf2)); - crypto_pk_public_encrypt(pk, junk_buf2, sizeof(junk_buf2), - junk_buf, 48, PK_PKCS1_OAEP_PADDING); - tt_int_op(-1, OP_EQ, - onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, - s_buf, s_keys, 40)); - - /* client handshake 1: do it straight. */ - memset(c_buf, 0, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf)); - - /* Server: Case 3: we just don't have the right key. */ - tt_int_op(-1, OP_EQ, - onion_skin_TAP_server_handshake(c_buf, pk2, NULL, - s_buf, s_keys, 40)); - - /* Server: Case 4: The RSA-encrypted portion is corrupt. */ - c_buf[64] ^= 33; - tt_int_op(-1, OP_EQ, - onion_skin_TAP_server_handshake(c_buf, pk, NULL, - s_buf, s_keys, 40)); - c_buf[64] ^= 33; - - /* (Let the server procede) */ - tt_int_op(0, OP_EQ, - onion_skin_TAP_server_handshake(c_buf, pk, NULL, - s_buf, s_keys, 40)); - - /* Client: Case 1: The server sent back junk. */ - const char *msg = NULL; - s_buf[64] ^= 33; - tt_int_op(-1, OP_EQ, - onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); - s_buf[64] ^= 33; - tt_str_op(msg, OP_EQ, "Digest DOES NOT MATCH on onion handshake. " - "Bug or attack."); - - /* Let the client finish; make sure it can. */ - msg = NULL; - tt_int_op(0, OP_EQ, - onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); - tt_mem_op(s_keys,OP_EQ, c_keys, 40); - tt_ptr_op(msg, OP_EQ, NULL); - - /* Client: Case 2: The server sent back a degenerate DH. */ - memset(s_buf, 0, sizeof(s_buf)); - tt_int_op(-1, OP_EQ, - onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40, &msg)); - tt_str_op(msg, OP_EQ, "DH computation failed."); - - done: - crypto_dh_free(c_dh); - crypto_pk_free(pk); - crypto_pk_free(pk2); -} - -static void -test_ntor_handshake(void *arg) -{ - /* client-side */ - ntor_handshake_state_t *c_state = NULL; - uint8_t c_buf[NTOR_ONIONSKIN_LEN]; - uint8_t c_keys[400]; - - /* server-side */ - di_digest256_map_t *s_keymap=NULL; - curve25519_keypair_t s_keypair; - uint8_t s_buf[NTOR_REPLY_LEN]; - uint8_t s_keys[400]; - - /* shared */ - const curve25519_public_key_t *server_pubkey; - uint8_t node_id[20] = "abcdefghijklmnopqrst"; - - (void) arg; - - /* Make the server some keys */ - curve25519_secret_key_generate(&s_keypair.seckey, 0); - curve25519_public_key_generate(&s_keypair.pubkey, &s_keypair.seckey); - dimap_add_entry(&s_keymap, s_keypair.pubkey.public_key, &s_keypair); - server_pubkey = &s_keypair.pubkey; - - /* client handshake 1. */ - memset(c_buf, 0, NTOR_ONIONSKIN_LEN); - tt_int_op(0, OP_EQ, onion_skin_ntor_create(node_id, server_pubkey, - &c_state, c_buf)); - - /* server handshake */ - memset(s_buf, 0, NTOR_REPLY_LEN); - memset(s_keys, 0, 40); - tt_int_op(0, OP_EQ, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL, - node_id, - s_buf, s_keys, 400)); - - /* client handshake 2 */ - memset(c_keys, 0, 40); - tt_int_op(0, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf, - c_keys, 400, NULL)); - - tt_mem_op(c_keys,OP_EQ, s_keys, 400); - memset(s_buf, 0, 40); - tt_mem_op(c_keys,OP_NE, s_buf, 40); - - /* Now try with a bogus server response. Zero input should trigger - * All The Problems. */ - memset(c_keys, 0, 400); - memset(s_buf, 0, NTOR_REPLY_LEN); - const char *msg = NULL; - tt_int_op(-1, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf, - c_keys, 400, &msg)); - tt_str_op(msg, OP_EQ, "Zero output from curve25519 handshake"); - - done: - ntor_handshake_state_free(c_state); - dimap_free(s_keymap, NULL); -} - -static void -test_fast_handshake(void *arg) -{ - /* tests for the obsolete "CREATE_FAST" handshake. */ - (void) arg; - fast_handshake_state_t *state = NULL; - uint8_t client_handshake[CREATE_FAST_LEN]; - uint8_t server_handshake[CREATED_FAST_LEN]; - uint8_t s_keys[100], c_keys[100]; - - /* First, test an entire handshake. */ - memset(client_handshake, 0, sizeof(client_handshake)); - tt_int_op(0, OP_EQ, fast_onionskin_create(&state, client_handshake)); - tt_assert(! tor_mem_is_zero((char*)client_handshake, - sizeof(client_handshake))); - - tt_int_op(0, OP_EQ, - fast_server_handshake(client_handshake, server_handshake, - s_keys, 100)); - const char *msg = NULL; - tt_int_op(0, OP_EQ, - fast_client_handshake(state, server_handshake, c_keys, 100, &msg)); - tt_ptr_op(msg, OP_EQ, NULL); - tt_mem_op(s_keys, OP_EQ, c_keys, 100); - - /* Now test a failing handshake. */ - server_handshake[0] ^= 3; - tt_int_op(-1, OP_EQ, - fast_client_handshake(state, server_handshake, c_keys, 100, &msg)); - tt_str_op(msg, OP_EQ, "Digest DOES NOT MATCH on fast handshake. " - "Bug or attack."); - - done: - fast_handshake_state_free(state); -} - -/** Run unit tests for the onion queues. */ -static void -test_onion_queues(void *arg) -{ - uint8_t buf1[TAP_ONIONSKIN_CHALLENGE_LEN] = {0}; - uint8_t buf2[NTOR_ONIONSKIN_LEN] = {0}; - - or_circuit_t *circ1 = or_circuit_new(0, NULL); - or_circuit_t *circ2 = or_circuit_new(0, NULL); - - create_cell_t *onionskin = NULL, *create2_ptr; - create_cell_t *create1 = tor_malloc_zero(sizeof(create_cell_t)); - create_cell_t *create2 = tor_malloc_zero(sizeof(create_cell_t)); - (void)arg; - create2_ptr = create2; /* remember, but do not free */ - - create_cell_init(create1, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP, - TAP_ONIONSKIN_CHALLENGE_LEN, buf1); - create_cell_init(create2, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR, - NTOR_ONIONSKIN_LEN, buf2); - - tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,OP_EQ, onion_pending_add(circ1, create1)); - create1 = NULL; - tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - - tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - tt_int_op(0,OP_EQ, onion_pending_add(circ2, create2)); - create2 = NULL; - tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - - tt_ptr_op(circ2,OP_EQ, onion_next_task(&onionskin)); - tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - tt_ptr_op(onionskin, OP_EQ, create2_ptr); - - clear_pending_onions(); - tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - - done: - circuit_free_(TO_CIRCUIT(circ1)); - circuit_free_(TO_CIRCUIT(circ2)); - tor_free(create1); - tor_free(create2); - tor_free(onionskin); -} - -static void -test_circuit_timeout(void *arg) -{ - /* Plan: - * 1. Generate 1000 samples - * 2. Estimate parameters - * 3. If difference, repeat - * 4. Save state - * 5. load state - * 6. Estimate parameters - * 7. compare differences - */ - circuit_build_times_t initial; - circuit_build_times_t estimate; - circuit_build_times_t final; - double timeout1, timeout2; - or_state_t *state=NULL; - int i, runs; - double close_ms; - (void)arg; - - initialize_periodic_events(); - - circuit_build_times_init(&initial); - circuit_build_times_init(&estimate); - circuit_build_times_init(&final); - - state = or_state_new(); - - circuitbuild_running_unit_tests(); -#define timeout0 (build_time_t)(30*1000.0) - initial.Xm = 3000; - circuit_build_times_initial_alpha(&initial, - CBT_DEFAULT_QUANTILE_CUTOFF/100.0, - timeout0); - close_ms = MAX(circuit_build_times_calculate_timeout(&initial, - CBT_DEFAULT_CLOSE_QUANTILE/100.0), - CBT_DEFAULT_TIMEOUT_INITIAL_VALUE); - do { - for (i=0; i < CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE; i++) { - build_time_t sample = circuit_build_times_generate_sample(&initial,0,1); - - if (sample > close_ms) { - circuit_build_times_add_time(&estimate, CBT_BUILD_ABANDONED); - } else { - circuit_build_times_add_time(&estimate, sample); - } - } - circuit_build_times_update_alpha(&estimate); - timeout1 = circuit_build_times_calculate_timeout(&estimate, - CBT_DEFAULT_QUANTILE_CUTOFF/100.0); - circuit_build_times_set_timeout(&estimate); - log_notice(LD_CIRC, "Timeout1 is %f, Xm is %d", timeout1, estimate.Xm); - /* 2% error */ - } while (fabs(circuit_build_times_cdf(&initial, timeout0) - - circuit_build_times_cdf(&initial, timeout1)) > 0.02); - - tt_int_op(estimate.total_build_times, OP_LE, CBT_NCIRCUITS_TO_OBSERVE); - - circuit_build_times_update_state(&estimate, state); - circuit_build_times_free_timeouts(&final); - tt_int_op(circuit_build_times_parse_state(&final, state), OP_EQ, 0); - - circuit_build_times_update_alpha(&final); - timeout2 = circuit_build_times_calculate_timeout(&final, - CBT_DEFAULT_QUANTILE_CUTOFF/100.0); - - circuit_build_times_set_timeout(&final); - log_notice(LD_CIRC, "Timeout2 is %f, Xm is %d", timeout2, final.Xm); - - /* 5% here because some accuracy is lost due to histogram conversion */ - tt_assert(fabs(circuit_build_times_cdf(&initial, timeout0) - - circuit_build_times_cdf(&initial, timeout2)) < 0.05); - - for (runs = 0; runs < 50; runs++) { - int build_times_idx = 0; - int total_build_times = 0; - - final.close_ms = final.timeout_ms = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; - estimate.close_ms = estimate.timeout_ms - = CBT_DEFAULT_TIMEOUT_INITIAL_VALUE; - - for (i = 0; i < CBT_DEFAULT_RECENT_CIRCUITS*2; i++) { - circuit_build_times_network_circ_success(&estimate); - circuit_build_times_add_time(&estimate, - circuit_build_times_generate_sample(&estimate, 0, - CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); - - circuit_build_times_network_circ_success(&estimate); - circuit_build_times_add_time(&final, - circuit_build_times_generate_sample(&final, 0, - CBT_DEFAULT_QUANTILE_CUTOFF/100.0)); - } - - tt_assert(!circuit_build_times_network_check_changed(&estimate)); - tt_assert(!circuit_build_times_network_check_changed(&final)); - - /* Reset liveness to be non-live */ - final.liveness.network_last_live = 0; - estimate.liveness.network_last_live = 0; - - build_times_idx = estimate.build_times_idx; - total_build_times = estimate.total_build_times; - - tt_assert(circuit_build_times_network_check_live(&estimate)); - tt_assert(circuit_build_times_network_check_live(&final)); - - circuit_build_times_count_close(&estimate, 0, - (time_t)(approx_time()-estimate.close_ms/1000.0-1)); - circuit_build_times_count_close(&final, 0, - (time_t)(approx_time()-final.close_ms/1000.0-1)); - - tt_assert(!circuit_build_times_network_check_live(&estimate)); - tt_assert(!circuit_build_times_network_check_live(&final)); - - log_info(LD_CIRC, "idx: %d %d, tot: %d %d", - build_times_idx, estimate.build_times_idx, - total_build_times, estimate.total_build_times); - - /* Check rollback index. Should match top of loop. */ - tt_assert(build_times_idx == estimate.build_times_idx); - // This can fail if estimate.total_build_times == 1000, because - // in that case, rewind actually causes us to lose timeouts - if (total_build_times != CBT_NCIRCUITS_TO_OBSERVE) - tt_assert(total_build_times == estimate.total_build_times); - - /* Now simulate that the network has become live and we need - * a change */ - circuit_build_times_network_is_live(&estimate); - circuit_build_times_network_is_live(&final); - - for (i = 0; i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT; i++) { - circuit_build_times_count_timeout(&estimate, 1); - - if (i < CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1) { - circuit_build_times_count_timeout(&final, 1); - } - } - - tt_int_op(estimate.liveness.after_firsthop_idx, OP_EQ, 0); - tt_assert(final.liveness.after_firsthop_idx == - CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1); - - tt_assert(circuit_build_times_network_check_live(&estimate)); - tt_assert(circuit_build_times_network_check_live(&final)); - - circuit_build_times_count_timeout(&final, 1); - - /* Ensure return value for degenerate cases are clamped correctly */ - initial.alpha = INT32_MAX; - tt_assert(circuit_build_times_calculate_timeout(&initial, .99999999) <= - INT32_MAX); - initial.alpha = 0; - tt_assert(circuit_build_times_calculate_timeout(&initial, .5) <= - INT32_MAX); - } - - done: - circuit_build_times_free_timeouts(&initial); - circuit_build_times_free_timeouts(&estimate); - circuit_build_times_free_timeouts(&final); - or_state_free(state); - teardown_periodic_events(); -} - -/** Test encoding and parsing of rendezvous service descriptors. */ -static void -test_rend_fns(void *arg) -{ - rend_service_descriptor_t *generated = NULL, *parsed = NULL; - char service_id[DIGEST_LEN]; - char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1]; - const char *next_desc; - smartlist_t *descs = smartlist_new(); - char computed_desc_id[DIGEST_LEN]; - char parsed_desc_id[DIGEST_LEN]; - crypto_pk_t *pk1 = NULL, *pk2 = NULL; - time_t now; - char *intro_points_encrypted = NULL; - size_t intro_points_size; - size_t encoded_size; - int i; - - (void)arg; - - /* Initialize the service cache. */ - rend_cache_init(); - - pk1 = pk_generate(0); - pk2 = pk_generate(1); - generated = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - generated->pk = crypto_pk_dup_key(pk1); - crypto_pk_get_digest(generated->pk, service_id); - base32_encode(service_id_base32, REND_SERVICE_ID_LEN_BASE32+1, - service_id, REND_SERVICE_ID_LEN); - now = time(NULL); - generated->timestamp = now; - generated->version = 2; - generated->protocols = 42; - generated->intro_nodes = smartlist_new(); - - for (i = 0; i < 3; i++) { - rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t)); - crypto_pk_t *okey = pk_generate(2 + i); - intro->extend_info = tor_malloc_zero(sizeof(extend_info_t)); - intro->extend_info->onion_key = okey; - crypto_pk_get_digest(intro->extend_info->onion_key, - intro->extend_info->identity_digest); - //crypto_rand(info->identity_digest, DIGEST_LEN); /* Would this work? */ - intro->extend_info->nickname[0] = '$'; - base16_encode(intro->extend_info->nickname + 1, - sizeof(intro->extend_info->nickname) - 1, - intro->extend_info->identity_digest, DIGEST_LEN); - /* Does not cover all IP addresses. */ - tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536)); - intro->extend_info->port = 1 + crypto_rand_int(65535); - intro->intro_key = crypto_pk_dup_key(pk2); - smartlist_add(generated->intro_nodes, intro); - } - int rv = rend_encode_v2_descriptors(descs, generated, now, 0, - REND_NO_AUTH, NULL, NULL); - tt_int_op(rv, OP_GT, 0); - rv = rend_compute_v2_desc_id(computed_desc_id, service_id_base32, NULL, - now, 0); - tt_int_op(rv, OP_EQ, 0); - tt_mem_op(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id, OP_EQ, - computed_desc_id, DIGEST_LEN); - rv = rend_parse_v2_service_descriptor(&parsed, parsed_desc_id, - &intro_points_encrypted, &intro_points_size, &encoded_size, - &next_desc, - ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)) - ->desc_str, 1); - tt_int_op(rv, OP_EQ, 0); - tt_assert(parsed); - tt_mem_op(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id,OP_EQ, parsed_desc_id, DIGEST_LEN); - tt_int_op(rend_parse_introduction_points(parsed, intro_points_encrypted, - intro_points_size),OP_EQ, 3); - tt_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk)); - tt_int_op(parsed->timestamp,OP_EQ, now); - tt_int_op(parsed->version,OP_EQ, 2); - tt_int_op(parsed->protocols,OP_EQ, 42); - tt_int_op(smartlist_len(parsed->intro_nodes),OP_EQ, 3); - for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) { - rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i), - *gen_intro = smartlist_get(generated->intro_nodes, i); - extend_info_t *par_info = par_intro->extend_info; - extend_info_t *gen_info = gen_intro->extend_info; - tt_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key)); - tt_mem_op(gen_info->identity_digest,OP_EQ, par_info->identity_digest, - DIGEST_LEN); - tt_str_op(gen_info->nickname,OP_EQ, par_info->nickname); - tt_assert(tor_addr_eq(&gen_info->addr, &par_info->addr)); - tt_int_op(gen_info->port,OP_EQ, par_info->port); - } - - rend_service_descriptor_free(parsed); - rend_service_descriptor_free(generated); - parsed = generated = NULL; - - done: - if (descs) { - for (i = 0; i < smartlist_len(descs); i++) - rend_encoded_v2_service_descriptor_free_(smartlist_get(descs, i)); - smartlist_free(descs); - } - if (parsed) - rend_service_descriptor_free(parsed); - if (generated) - rend_service_descriptor_free(generated); - if (pk1) - crypto_pk_free(pk1); - if (pk2) - crypto_pk_free(pk2); - tor_free(intro_points_encrypted); -} - - /* Record odd numbered fake-IPs using ipv6, even numbered fake-IPs - * using ipv4. Since our fake geoip database is the same between - * ipv4 and ipv6, we should get the same result no matter which - * address family we pick for each IP. */ -#define SET_TEST_ADDRESS(i) do { \ - if ((i) & 1) { \ - SET_TEST_IPV6(i); \ - tor_addr_from_in6(&addr, &in6); \ - } else { \ - tor_addr_from_ipv4h(&addr, (uint32_t) i); \ - } \ - } while (0) - - /* Make sure that country ID actually works. */ -#define SET_TEST_IPV6(i) \ - do { \ - set_uint32(in6.s6_addr + 12, htonl((uint32_t) (i))); \ - } while (0) -#define CHECK_COUNTRY(country, val) do { \ - /* test ipv4 country lookup */ \ - tt_str_op(country, OP_EQ, \ - geoip_get_country_name(geoip_get_country_by_ipv4(val))); \ - /* test ipv6 country lookup */ \ - SET_TEST_IPV6(val); \ - tt_str_op(country, OP_EQ, \ - geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \ - } while (0) - -/** Run unit tests for GeoIP code. */ -static void -test_geoip(void *arg) -{ - int i, j; - time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ - char *s = NULL, *v = NULL; - const char *bridge_stats_1 = - "bridge-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "bridge-ips zz=24,xy=8\n" - "bridge-ip-versions v4=16,v6=16\n" - "bridge-ip-transports =24\n", - *dirreq_stats_1 = - "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "dirreq-v3-ips ab=8\n" - "dirreq-v3-reqs ab=8\n" - "dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0," - "not-modified=0,busy=0\n" - "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" - "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", - *dirreq_stats_2 = - "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "dirreq-v3-ips \n" - "dirreq-v3-reqs \n" - "dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0," - "not-modified=0,busy=0\n" - "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" - "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", - *dirreq_stats_3 = - "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "dirreq-v3-ips \n" - "dirreq-v3-reqs \n" - "dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0," - "not-modified=0,busy=0\n" - "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" - "dirreq-v3-tunneled-dl complete=0,timeout=0,running=0\n", - *dirreq_stats_4 = - "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "dirreq-v3-ips \n" - "dirreq-v3-reqs \n" - "dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0," - "not-modified=0,busy=0\n" - "dirreq-v3-direct-dl complete=0,timeout=0,running=0\n" - "dirreq-v3-tunneled-dl complete=0,timeout=0,running=4\n", - *entry_stats_1 = - "entry-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "entry-ips ab=8\n", - *entry_stats_2 = - "entry-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "entry-ips \n"; - tor_addr_t addr; - struct in6_addr in6; - - /* Populate the DB a bit. Add these in order, since we can't do the final - * 'sort' step. These aren't very good IP addresses, but they're perfectly - * fine uint32_t values. */ - (void)arg; - tt_int_op(0,OP_EQ, geoip_parse_entry("10,50,AB", AF_INET)); - tt_int_op(0,OP_EQ, geoip_parse_entry("52,90,XY", AF_INET)); - tt_int_op(0,OP_EQ, geoip_parse_entry("95,100,AB", AF_INET)); - tt_int_op(0,OP_EQ, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET)); - tt_int_op(0,OP_EQ, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET)); - tt_int_op(0,OP_EQ, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET)); - - /* Populate the IPv6 DB equivalently with fake IPs in the same range */ - tt_int_op(0,OP_EQ, geoip_parse_entry("::a,::32,AB", AF_INET6)); - tt_int_op(0,OP_EQ, geoip_parse_entry("::34,::5a,XY", AF_INET6)); - tt_int_op(0,OP_EQ, geoip_parse_entry("::5f,::64,AB", AF_INET6)); - tt_int_op(0,OP_EQ, geoip_parse_entry("::69,::8c,ZZ", AF_INET6)); - tt_int_op(0,OP_EQ, geoip_parse_entry("::96,::be,XY", AF_INET6)); - tt_int_op(0,OP_EQ, geoip_parse_entry("::c8,::fa,AB", AF_INET6)); - - /* We should have 4 countries: ??, ab, xy, zz. */ - tt_int_op(4,OP_EQ, geoip_get_n_countries()); - memset(&in6, 0, sizeof(in6)); - - CHECK_COUNTRY("??", 3); - CHECK_COUNTRY("ab", 32); - CHECK_COUNTRY("??", 5); - CHECK_COUNTRY("??", 51); - CHECK_COUNTRY("xy", 150); - CHECK_COUNTRY("xy", 190); - CHECK_COUNTRY("??", 2000); - - tt_int_op(0,OP_EQ, geoip_get_country_by_ipv4(3)); - SET_TEST_IPV6(3); - tt_int_op(0,OP_EQ, geoip_get_country_by_ipv6(&in6)); - - get_options_mutable()->BridgeRelay = 1; - get_options_mutable()->BridgeRecordUsageByCountry = 1; - /* Put 9 observations in AB... */ - for (i=32; i < 40; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); - } - SET_TEST_ADDRESS(225); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); - /* and 3 observations in XY, several times. */ - for (j=0; j < 10; ++j) - for (i=52; i < 55; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-3600); - } - /* and 17 observations in ZZ... */ - for (i=110; i < 127; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); - } - geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); - tt_assert(s); - tt_assert(v); - tt_str_op("zz=24,ab=16,xy=8",OP_EQ, s); - tt_str_op("v4=16,v6=16",OP_EQ, v); - tor_free(s); - tor_free(v); - - /* Now clear out all the AB observations. */ - geoip_remove_old_clients(now-6000); - geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); - tt_assert(s); - tt_assert(v); - tt_str_op("zz=24,xy=8",OP_EQ, s); - tt_str_op("v4=16,v6=16",OP_EQ, v); - tor_free(s); - tor_free(v); - - /* Start testing bridge statistics by making sure that we don't output - * bridge stats without initializing them. */ - s = geoip_format_bridge_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats and generate the bridge-stats history string out of - * the connecting clients added above. */ - geoip_bridge_stats_init(now); - s = geoip_format_bridge_stats(now + 86400); - tt_assert(s); - tt_str_op(bridge_stats_1,OP_EQ, s); - tor_free(s); - - /* Stop collecting bridge stats and make sure we don't write a history - * string anymore. */ - geoip_bridge_stats_term(); - s = geoip_format_bridge_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Stop being a bridge and start being a directory mirror that gathers - * directory request statistics. */ - geoip_bridge_stats_term(); - get_options_mutable()->BridgeRelay = 0; - get_options_mutable()->BridgeRecordUsageByCountry = 0; - get_options_mutable()->DirReqStatistics = 1; - - /* Start testing dirreq statistics by making sure that we don't collect - * dirreq stats without initializing them. */ - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); - s = geoip_format_dirreq_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats, note one connecting client, and generate the - * dirreq-stats history string. */ - geoip_dirreq_stats_init(now); - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); - s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_1,OP_EQ, s); - tor_free(s); - - /* Stop collecting stats, add another connecting client, and ensure we - * don't generate a history string. */ - geoip_dirreq_stats_term(); - SET_TEST_ADDRESS(101); - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); - s = geoip_format_dirreq_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Re-start stats, add a connecting client, reset stats, and make sure - * that we get an all empty history string. */ - geoip_dirreq_stats_init(now); - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); - geoip_reset_dirreq_stats(now); - s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_2,OP_EQ, s); - tor_free(s); - - /* Note a successful network status response and make sure that it - * appears in the history string. */ - geoip_note_ns_response(GEOIP_SUCCESS); - s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_3,OP_EQ, s); - tor_free(s); - - /* Start a tunneled directory request. */ - geoip_start_dirreq((uint64_t) 1, 1024, DIRREQ_TUNNELED); - s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_4,OP_EQ, s); - tor_free(s); - - /* Stop collecting directory request statistics and start gathering - * entry stats. */ - geoip_dirreq_stats_term(); - get_options_mutable()->DirReqStatistics = 0; - get_options_mutable()->EntryStatistics = 1; - - /* Start testing entry statistics by making sure that we don't collect - * anything without initializing entry stats. */ - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); - s = geoip_format_entry_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats, note one connecting client, and generate the - * entry-stats history string. */ - geoip_entry_stats_init(now); - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); - s = geoip_format_entry_stats(now + 86400); - tt_str_op(entry_stats_1,OP_EQ, s); - tor_free(s); - - /* Stop collecting stats, add another connecting client, and ensure we - * don't generate a history string. */ - geoip_entry_stats_term(); - SET_TEST_ADDRESS(101); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); - s = geoip_format_entry_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Re-start stats, add a connecting client, reset stats, and make sure - * that we get an all empty history string. */ - geoip_entry_stats_init(now); - SET_TEST_ADDRESS(100); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); - geoip_reset_entry_stats(now); - s = geoip_format_entry_stats(now + 86400); - tt_str_op(entry_stats_2,OP_EQ, s); - tor_free(s); - - /* Stop collecting entry statistics. */ - geoip_entry_stats_term(); - get_options_mutable()->EntryStatistics = 0; - - done: - tor_free(s); - tor_free(v); -} - -static void -test_geoip_with_pt(void *arg) -{ - time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ - char *s = NULL; - int i; - tor_addr_t addr; - struct in6_addr in6; - - (void)arg; - get_options_mutable()->BridgeRelay = 1; - get_options_mutable()->BridgeRecordUsageByCountry = 1; - - memset(&in6, 0, sizeof(in6)); - - /* No clients seen yet. */ - s = geoip_get_transport_history(); - tor_assert(!s); - - /* 4 connections without a pluggable transport */ - for (i=0; i < 4; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now-7200); - } - - /* 9 connections with "alpha" */ - for (i=4; i < 13; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "alpha", now-7200); - } - - /* one connection with "beta" */ - SET_TEST_ADDRESS(13); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "beta", now-7200); - - /* 14 connections with "charlie" */ - for (i=14; i < 28; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "charlie", now-7200); - } - - /* 131 connections with "ddr" */ - for (i=28; i < 159; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "ddr", now-7200); - } - - /* 8 connections with "entropy" */ - for (i=159; i < 167; ++i) { - SET_TEST_ADDRESS(i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200); - } - - /* 2 connections from the same IP with two different transports. */ - SET_TEST_ADDRESS(++i); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200); - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200); - - /* Test the transport history string. */ - s = geoip_get_transport_history(); - tor_assert(s); - tt_str_op(s,OP_EQ, "=8,alpha=16,beta=8,charlie=16,ddr=136," - "entropy=8,fire=8,google=8"); - - /* Stop collecting entry statistics. */ - geoip_entry_stats_term(); - get_options_mutable()->EntryStatistics = 0; - - done: - tor_free(s); -} - -#undef SET_TEST_ADDRESS -#undef SET_TEST_IPV6 -#undef CHECK_COUNTRY - -/** Run unit tests for stats code. */ -static void -test_stats(void *arg) -{ - time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ - char *s = NULL; - int i; - - /* Start with testing exit port statistics; we shouldn't collect exit - * stats without initializing them. */ - (void)arg; - rep_hist_note_exit_stream_opened(80); - rep_hist_note_exit_bytes(80, 100, 10000); - s = rep_hist_format_exit_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats, note some streams and bytes, and generate history - * string. */ - rep_hist_exit_stats_init(now); - rep_hist_note_exit_stream_opened(80); - rep_hist_note_exit_bytes(80, 100, 10000); - rep_hist_note_exit_stream_opened(443); - rep_hist_note_exit_bytes(443, 100, 10000); - rep_hist_note_exit_bytes(443, 100, 10000); - s = rep_hist_format_exit_stats(now + 86400); - tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "exit-kibibytes-written 80=1,443=1,other=0\n" - "exit-kibibytes-read 80=10,443=20,other=0\n" - "exit-streams-opened 80=4,443=4,other=0\n",OP_EQ, s); - tor_free(s); - - /* Add a few bytes on 10 more ports and ensure that only the top 10 - * ports are contained in the history string. */ - for (i = 50; i < 60; i++) { - rep_hist_note_exit_bytes(i, i, i); - rep_hist_note_exit_stream_opened(i); - } - s = rep_hist_format_exit_stats(now + 86400); - tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "exit-kibibytes-written 52=1,53=1,54=1,55=1,56=1,57=1,58=1," - "59=1,80=1,443=1,other=1\n" - "exit-kibibytes-read 52=1,53=1,54=1,55=1,56=1,57=1,58=1," - "59=1,80=10,443=20,other=1\n" - "exit-streams-opened 52=4,53=4,54=4,55=4,56=4,57=4,58=4," - "59=4,80=4,443=4,other=4\n",OP_EQ, s); - tor_free(s); - - /* Stop collecting stats, add some bytes, and ensure we don't generate - * a history string. */ - rep_hist_exit_stats_term(); - rep_hist_note_exit_bytes(80, 100, 10000); - s = rep_hist_format_exit_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Re-start stats, add some bytes, reset stats, and see what history we - * get when observing no streams or bytes at all. */ - rep_hist_exit_stats_init(now); - rep_hist_note_exit_stream_opened(80); - rep_hist_note_exit_bytes(80, 100, 10000); - rep_hist_reset_exit_stats(now); - s = rep_hist_format_exit_stats(now + 86400); - tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "exit-kibibytes-written other=0\n" - "exit-kibibytes-read other=0\n" - "exit-streams-opened other=0\n",OP_EQ, s); - tor_free(s); - - /* Continue with testing connection statistics; we shouldn't collect - * conn stats without initializing them. */ - rep_hist_note_or_conn_bytes(1, 20, 400, now); - s = rep_hist_format_conn_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats, note bytes, and generate history string. */ - rep_hist_conn_stats_init(now); - rep_hist_note_or_conn_bytes(1, 30000, 400000, now); - rep_hist_note_or_conn_bytes(1, 30000, 400000, now + 5); - rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10); - rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); - s = rep_hist_format_conn_stats(now + 86400); - tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",OP_EQ, s); - tor_free(s); - - /* Stop collecting stats, add some bytes, and ensure we don't generate - * a history string. */ - rep_hist_conn_stats_term(); - rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); - s = rep_hist_format_conn_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Re-start stats, add some bytes, reset stats, and see what history we - * get when observing no bytes at all. */ - rep_hist_conn_stats_init(now); - rep_hist_note_or_conn_bytes(1, 30000, 400000, now); - rep_hist_note_or_conn_bytes(1, 30000, 400000, now + 5); - rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10); - rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); - rep_hist_reset_conn_stats(now); - s = rep_hist_format_conn_stats(now + 86400); - tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",OP_EQ, s); - tor_free(s); - - /* Continue with testing buffer statistics; we shouldn't collect buffer - * stats without initializing them. */ - rep_hist_add_buffer_stats(2.0, 2.0, 20); - s = rep_hist_format_buffer_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Initialize stats, add statistics for a single circuit, and generate - * the history string. */ - rep_hist_buffer_stats_init(now); - rep_hist_add_buffer_stats(2.0, 2.0, 20); - s = rep_hist_format_buffer_stats(now + 86400); - tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "cell-processed-cells 20,0,0,0,0,0,0,0,0,0\n" - "cell-queued-cells 2.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," - "0.00,0.00\n" - "cell-time-in-queue 2,0,0,0,0,0,0,0,0,0\n" - "cell-circuits-per-decile 1\n",OP_EQ, s); - tor_free(s); - - /* Add nineteen more circuit statistics to the one that's already in the - * history to see that the math works correctly. */ - for (i = 21; i < 30; i++) - rep_hist_add_buffer_stats(2.0, 2.0, i); - for (i = 20; i < 30; i++) - rep_hist_add_buffer_stats(3.5, 3.5, i); - s = rep_hist_format_buffer_stats(now + 86400); - tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "cell-processed-cells 29,28,27,26,25,24,23,22,21,20\n" - "cell-queued-cells 2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75," - "2.75,2.75\n" - "cell-time-in-queue 3,3,3,3,3,3,3,3,3,3\n" - "cell-circuits-per-decile 2\n",OP_EQ, s); - tor_free(s); - - /* Stop collecting stats, add statistics for one circuit, and ensure we - * don't generate a history string. */ - rep_hist_buffer_stats_term(); - rep_hist_add_buffer_stats(2.0, 2.0, 20); - s = rep_hist_format_buffer_stats(now + 86400); - tt_ptr_op(s, OP_EQ, NULL); - - /* Re-start stats, add statistics for one circuit, reset stats, and make - * sure that the history has all zeros. */ - rep_hist_buffer_stats_init(now); - rep_hist_add_buffer_stats(2.0, 2.0, 20); - rep_hist_reset_buffer_stats(now); - s = rep_hist_format_buffer_stats(now + 86400); - tt_str_op("cell-stats-end 2010-08-12 13:27:30 (86400 s)\n" - "cell-processed-cells 0,0,0,0,0,0,0,0,0,0\n" - "cell-queued-cells 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," - "0.00,0.00\n" - "cell-time-in-queue 0,0,0,0,0,0,0,0,0,0\n" - "cell-circuits-per-decile 0\n",OP_EQ, s); - - done: - tor_free(s); -} - -#define ENT(name) \ - { #name, test_ ## name , 0, NULL, NULL } -#define FORK(name) \ - { #name, test_ ## name , TT_FORK, NULL, NULL } - -static struct testcase_t test_array[] = { - ENT(onion_handshake), - { "bad_onion_handshake", test_bad_onion_handshake, 0, NULL, NULL }, - ENT(onion_queues), - { "ntor_handshake", test_ntor_handshake, 0, NULL, NULL }, - { "fast_handshake", test_fast_handshake, 0, NULL, NULL }, - FORK(circuit_timeout), - FORK(rend_fns), - ENT(geoip), - FORK(geoip_with_pt), - FORK(stats), - - END_OF_TESTCASES -}; - -struct testgroup_t testgroups[] = { - { "", test_array }, - { "accounting/", accounting_tests }, - { "addr/", addr_tests }, - { "address/", address_tests }, - { "buffer/", buffer_tests }, - { "cellfmt/", cell_format_tests }, - { "cellqueue/", cell_queue_tests }, - { "channel/", channel_tests }, - { "channelpadding/", channelpadding_tests }, - { "channeltls/", channeltls_tests }, - { "checkdir/", checkdir_tests }, - { "circuitbuild/", circuitbuild_tests }, - { "circuitlist/", circuitlist_tests }, - { "circuitmux/", circuitmux_tests }, - { "circuituse/", circuituse_tests }, - { "circuitstats/", circuitstats_tests }, - { "compat/libevent/", compat_libevent_tests }, - { "config/", config_tests }, - { "connection/", connection_tests }, - { "conscache/", conscache_tests }, - { "consdiff/", consdiff_tests }, - { "consdiffmgr/", consdiffmgr_tests }, - { "container/", container_tests }, - { "control/", controller_tests }, - { "control/event/", controller_event_tests }, - { "crypto/", crypto_tests }, - { "crypto/openssl/", crypto_openssl_tests }, - { "dir/", dir_tests }, - { "dir_handle_get/", dir_handle_get_tests }, - { "dir/md/", microdesc_tests }, - { "entryconn/", entryconn_tests }, - { "entrynodes/", entrynodes_tests }, - { "guardfraction/", guardfraction_tests }, - { "extorport/", extorport_tests }, - { "legacy_hs/", hs_tests }, - { "hs_cache/", hs_cache }, - { "hs_cell/", hs_cell_tests }, - { "hs_common/", hs_common_tests }, - { "hs_config/", hs_config_tests }, - { "hs_control/", hs_control_tests }, - { "hs_descriptor/", hs_descriptor }, - { "hs_ntor/", hs_ntor_tests }, - { "hs_service/", hs_service_tests }, - { "hs_client/", hs_client_tests }, - { "hs_intropoint/", hs_intropoint_tests }, - { "introduce/", introduce_tests }, - { "keypin/", keypin_tests }, - { "link-handshake/", link_handshake_tests }, - { "nodelist/", nodelist_tests }, - { "oom/", oom_tests }, - { "oos/", oos_tests }, - { "options/", options_tests }, - { "policy/" , policy_tests }, - { "procmon/", procmon_tests }, - { "proto/http/", proto_http_tests }, - { "proto/misc/", proto_misc_tests }, - { "protover/", protover_tests }, - { "pt/", pt_tests }, - { "relay/" , relay_tests }, - { "relaycell/", relaycell_tests }, - { "rend_cache/", rend_cache_tests }, - { "replaycache/", replaycache_tests }, - { "router/", router_tests }, - { "routerkeys/", routerkeys_tests }, - { "routerlist/", routerlist_tests }, - { "routerset/" , routerset_tests }, - { "scheduler/", scheduler_tests }, - { "socks/", socks_tests }, - { "shared-random/", sr_tests }, - { "status/" , status_tests }, - { "storagedir/", storagedir_tests }, - { "tortls/", tortls_tests }, - { "util/", util_tests }, - { "util/format/", util_format_tests }, - { "util/logging/", logging_tests }, - { "util/process/", util_process_tests }, - { "util/pubsub/", pubsub_tests }, - { "util/thread/", thread_tests }, - { "util/handle/", handle_tests }, - { "dns/", dns_tests }, - END_OF_GROUPS -}; - diff --git a/src/tor/src/test/test.h b/src/tor/src/test/test.h deleted file mode 100644 index 93d527ba1..000000000 --- a/src/tor/src/test/test.h +++ /dev/null @@ -1,276 +0,0 @@ -/* Copyright (c) 2001-2003, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TEST_H -#define TOR_TEST_H - -/** - * \file test.h - * \brief Macros and functions used by unit tests. - */ - -#include "compat.h" -#include "tinytest.h" -#define TT_EXIT_TEST_FUNCTION STMT_BEGIN goto done; STMT_END -#include "tinytest_macros.h" - -#ifdef __GNUC__ -#define PRETTY_FUNCTION __PRETTY_FUNCTION__ -#else -#define PRETTY_FUNCTION "" -#endif - -/* As test_mem_op, but decodes 'hex' before comparing. There must be a - * local char* variable called mem_op_hex_tmp for this to work. */ -#define test_mem_op_hex(expr1, op, hex) \ - STMT_BEGIN \ - size_t length = strlen(hex); \ - tor_free(mem_op_hex_tmp); \ - mem_op_hex_tmp = tor_malloc(length/2); \ - tor_assert((length&1)==0); \ - base16_decode(mem_op_hex_tmp, length/2, hex, length); \ - tt_mem_op(expr1, op, mem_op_hex_tmp, length/2); \ - STMT_END - -#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, OP_EQ, hex) - -#define tt_double_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,double,(val1_ op val2_),"%g", \ - TT_EXIT_TEST_FUNCTION) - -/* Declare "double equal" in a sneaky way, so compiler won't complain about - * comparing floats with == or !=. Of course, only do this if you know what - * you're doing. */ -#define tt_double_eq(a,b) \ - STMT_BEGIN \ - tt_double_op((a), OP_GE, (b)); \ - tt_double_op((a), OP_LE, (b)); \ - STMT_END - -#ifdef _MSC_VER -#define U64_PRINTF_TYPE uint64_t -#define I64_PRINTF_TYPE int64_t -#else -#define U64_PRINTF_TYPE unsigned long long -#define I64_PRINTF_TYPE long long -#endif /* defined(_MSC_VER) */ - -#define tt_size_op(a,op,b) \ - tt_assert_test_fmt_type(a,b,#a" "#op" "#b,size_t,(val1_ op val2_), \ - U64_PRINTF_TYPE, U64_FORMAT, \ - {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) - -#define tt_u64_op(a,op,b) \ - tt_assert_test_fmt_type(a,b,#a" "#op" "#b,uint64_t,(val1_ op val2_), \ - U64_PRINTF_TYPE, U64_FORMAT, \ - {print_ = (U64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) - -#define tt_i64_op(a,op,b) \ - tt_assert_test_fmt_type(a,b,#a" "#op" "#b,int64_t,(val1_ op val2_), \ - I64_PRINTF_TYPE, I64_FORMAT, \ - {print_ = (I64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION) - -const char *get_fname(const char *name); -const char *get_fname_rnd(const char *name); -struct crypto_pk_t *pk_generate(int idx); -void init_pregenerated_keys(void); -void free_pregenerated_keys(void); - -#define US2_CONCAT_2__(a, b) a ## __ ## b -#define US_CONCAT_2__(a, b) a ## _ ## b -#define US_CONCAT_3__(a, b, c) a ## _ ## b ## _ ## c -#define US_CONCAT_2_(a, b) US_CONCAT_2__(a, b) -#define US_CONCAT_3_(a, b, c) US_CONCAT_3__(a, b, c) - -/* - * These macros are helpful for streamlining the authorship of several test - * cases that use mocks. - * - * The pattern is as follows. - * * Declare a top level namespace: - * #define NS_MODULE foo - * - * * For each test case you want to write, create a new submodule in the - * namespace. All mocks and other information should belong to a single - * submodule to avoid interference with other test cases. - * You can simply name the submodule after the function in the module you - * are testing: - * #define NS_SUBMODULE some_function - * or, if you're wanting to write several tests against the same function, - * ie., you are testing an aspect of that function, you can use: - * #define NS_SUBMODULE ASPECT(some_function, behavior) - * - * * Declare all the mocks you will use. The NS_DECL macro serves to declare - * the mock in the current namespace (defined by NS_MODULE and NS_SUBMODULE). - * It behaves like MOCK_DECL: - * NS_DECL(int, dependent_function, (void *)); - * Here, dependent_function must be declared and implemented with the - * MOCK_DECL and MOCK_IMPL macros. The NS_DECL macro also defines an integer - * global for use for tracking how many times a mock was called, and can be - * accessed by CALLED(mock_name). For example, you might put - * CALLED(dependent_function)++; - * in your mock body. - * - * * Define a function called NS(main) that will contain the body of the - * test case. The NS macro can be used to reference a name in the current - * namespace. - * - * * In NS(main), indicate that a mock function in the current namespace, - * declared with NS_DECL is to override that in the global namespace, - * with the NS_MOCK macro: - * NS_MOCK(dependent_function) - * Unmock with: - * NS_UNMOCK(dependent_function) - * - * * Define the mocks with the NS macro, eg., - * int - * NS(dependent_function)(void *) - * { - * CALLED(dependent_function)++; - * } - * - * * In the struct testcase_t array, you can use the TEST_CASE and - * TEST_CASE_ASPECT macros to define the cases without having to do so - * explicitly nor without having to reset NS_SUBMODULE, eg., - * struct testcase_t foo_tests[] = { - * TEST_CASE_ASPECT(some_function, behavior), - * ... - * END_OF_TESTCASES - * which will define a test case named "some_function__behavior". - */ - -#define NAME_TEST_(name) #name -#define NAME_TEST(name) NAME_TEST_(name) -#define ASPECT(test_module, test_name) US2_CONCAT_2__(test_module, test_name) -#define TEST_CASE(function) \ - { \ - NAME_TEST(function), \ - NS_FULL(NS_MODULE, function, test_main), \ - TT_FORK, \ - NULL, \ - NULL, \ - } -#define TEST_CASE_ASPECT(function, aspect) \ - { \ - NAME_TEST(ASPECT(function, aspect)), \ - NS_FULL(NS_MODULE, ASPECT(function, aspect), test_main), \ - TT_FORK, \ - NULL, \ - NULL, \ - } - -#define NS(name) US_CONCAT_3_(NS_MODULE, NS_SUBMODULE, name) -#define NS_FULL(module, submodule, name) US_CONCAT_3_(module, submodule, name) - -#define CALLED(mock_name) US_CONCAT_2_(NS(mock_name), called) -#define NS_DECL(retval, mock_fn, args) \ - extern int CALLED(mock_fn); \ - static retval NS(mock_fn) args; int CALLED(mock_fn) = 0 -#define NS_MOCK(name) MOCK(name, NS(name)) -#define NS_UNMOCK(name) UNMOCK(name) - -extern const struct testcase_setup_t passthrough_setup; -extern const struct testcase_setup_t ed25519_test_setup; - -extern struct testcase_t accounting_tests[]; -extern struct testcase_t addr_tests[]; -extern struct testcase_t address_tests[]; -extern struct testcase_t buffer_tests[]; -extern struct testcase_t cell_format_tests[]; -extern struct testcase_t cell_queue_tests[]; -extern struct testcase_t channel_tests[]; -extern struct testcase_t channelpadding_tests[]; -extern struct testcase_t channeltls_tests[]; -extern struct testcase_t checkdir_tests[]; -extern struct testcase_t circuitbuild_tests[]; -extern struct testcase_t circuitlist_tests[]; -extern struct testcase_t circuitmux_tests[]; -extern struct testcase_t circuituse_tests[]; -extern struct testcase_t circuitstats_tests[]; -extern struct testcase_t compat_libevent_tests[]; -extern struct testcase_t config_tests[]; -extern struct testcase_t connection_tests[]; -extern struct testcase_t conscache_tests[]; -extern struct testcase_t consdiff_tests[]; -extern struct testcase_t consdiffmgr_tests[]; -extern struct testcase_t container_tests[]; -extern struct testcase_t controller_tests[]; -extern struct testcase_t controller_event_tests[]; -extern struct testcase_t crypto_tests[]; -extern struct testcase_t crypto_openssl_tests[]; -extern struct testcase_t dir_tests[]; -extern struct testcase_t dir_handle_get_tests[]; -extern struct testcase_t entryconn_tests[]; -extern struct testcase_t entrynodes_tests[]; -extern struct testcase_t guardfraction_tests[]; -extern struct testcase_t extorport_tests[]; -extern struct testcase_t hs_tests[]; -extern struct testcase_t hs_cache[]; -extern struct testcase_t hs_cell_tests[]; -extern struct testcase_t hs_common_tests[]; -extern struct testcase_t hs_config_tests[]; -extern struct testcase_t hs_control_tests[]; -extern struct testcase_t hs_descriptor[]; -extern struct testcase_t hs_ntor_tests[]; -extern struct testcase_t hs_service_tests[]; -extern struct testcase_t hs_client_tests[]; -extern struct testcase_t hs_intropoint_tests[]; -extern struct testcase_t introduce_tests[]; -extern struct testcase_t keypin_tests[]; -extern struct testcase_t link_handshake_tests[]; -extern struct testcase_t logging_tests[]; -extern struct testcase_t microdesc_tests[]; -extern struct testcase_t nodelist_tests[]; -extern struct testcase_t oom_tests[]; -extern struct testcase_t oos_tests[]; -extern struct testcase_t options_tests[]; -extern struct testcase_t policy_tests[]; -extern struct testcase_t procmon_tests[]; -extern struct testcase_t proto_http_tests[]; -extern struct testcase_t proto_misc_tests[]; -extern struct testcase_t protover_tests[]; -extern struct testcase_t pubsub_tests[]; -extern struct testcase_t pt_tests[]; -extern struct testcase_t relay_tests[]; -extern struct testcase_t relaycell_tests[]; -extern struct testcase_t rend_cache_tests[]; -extern struct testcase_t replaycache_tests[]; -extern struct testcase_t router_tests[]; -extern struct testcase_t routerkeys_tests[]; -extern struct testcase_t routerlist_tests[]; -extern struct testcase_t routerset_tests[]; -extern struct testcase_t scheduler_tests[]; -extern struct testcase_t storagedir_tests[]; -extern struct testcase_t socks_tests[]; -extern struct testcase_t status_tests[]; -extern struct testcase_t thread_tests[]; -extern struct testcase_t tortls_tests[]; -extern struct testcase_t util_tests[]; -extern struct testcase_t util_format_tests[]; -extern struct testcase_t util_process_tests[]; -extern struct testcase_t dns_tests[]; -extern struct testcase_t handle_tests[]; -extern struct testcase_t sr_tests[]; - -extern struct testcase_t slow_crypto_tests[]; -extern struct testcase_t slow_util_tests[]; - -extern struct testgroup_t testgroups[]; - -extern const char AUTHORITY_CERT_1[]; -extern const char AUTHORITY_SIGNKEY_1[]; -extern const char AUTHORITY_SIGNKEY_A_DIGEST[]; -extern const char AUTHORITY_SIGNKEY_A_DIGEST256[]; -extern const char AUTHORITY_CERT_2[]; -extern const char AUTHORITY_SIGNKEY_2[]; -extern const char AUTHORITY_SIGNKEY_B_DIGEST[]; -extern const char AUTHORITY_SIGNKEY_B_DIGEST256[]; -extern const char AUTHORITY_CERT_3[]; -extern const char AUTHORITY_SIGNKEY_3[]; -extern const char AUTHORITY_SIGNKEY_C_DIGEST[]; -extern const char AUTHORITY_SIGNKEY_C_DIGEST256[]; - -#endif /* !defined(TOR_TEST_H) */ - diff --git a/src/tor/src/test/test_accounting.c b/src/tor/src/test/test_accounting.c deleted file mode 100644 index b0d37b298..000000000 --- a/src/tor/src/test/test_accounting.c +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "test.h" -#define HIBERNATE_PRIVATE -#include "hibernate.h" -#include "config.h" -#define STATEFILE_PRIVATE -#include "statefile.h" - -#define NS_MODULE accounting - -#define NS_SUBMODULE limits - -/* - * Test to make sure accounting triggers hibernation - * correctly with both sum or max rules set - */ - -static or_state_t *or_state; -NS_DECL(or_state_t *, get_or_state, (void)); -static or_state_t * -NS(get_or_state)(void) -{ - return or_state; -} - -static void -test_accounting_limits(void *arg) -{ - or_options_t *options = get_options_mutable(); - time_t fake_time = time(NULL); - (void) arg; - - NS_MOCK(get_or_state); - or_state = or_state_new(); - - options->AccountingMax = 100; - options->AccountingRule = ACCT_MAX; - - tor_assert(accounting_is_enabled(options)); - configure_accounting(fake_time); - - accounting_add_bytes(10, 0, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 0); - - accounting_add_bytes(90, 0, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 1); - - options->AccountingMax = 200; - options->AccountingRule = ACCT_SUM; - - accounting_add_bytes(0, 10, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 0); - - accounting_add_bytes(0, 90, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 1); - - options->AccountingRule = ACCT_OUT; - - accounting_add_bytes(100, 10, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 0); - - accounting_add_bytes(0, 90, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 1); - - options->AccountingMax = 300; - options->AccountingRule = ACCT_IN; - - accounting_add_bytes(10, 100, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 0); - - accounting_add_bytes(90, 0, 1); - fake_time += 1; - consider_hibernation(fake_time); - tor_assert(we_are_hibernating() == 1); - - goto done; - done: - NS_UNMOCK(get_or_state); - or_state_free(or_state); -} - -#undef NS_SUBMODULE - -struct testcase_t accounting_tests[] = { - { "bwlimits", test_accounting_limits, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_addr.c b/src/tor/src/test/test_addr.c deleted file mode 100644 index e1a40b7e6..000000000 --- a/src/tor/src/test/test_addr.c +++ /dev/null @@ -1,1105 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define ADDRESSMAP_PRIVATE -#include "orconfig.h" -#include "or.h" -#include "test.h" -#include "addressmap.h" - -/** Mocking replacement: only handles localhost. */ -static int -mock_tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out) -{ - if (!strcmp(name, "localhost")) { - if (family == AF_INET || family == AF_UNSPEC) { - tor_addr_from_ipv4h(addr_out, 0x7f000001); - return 0; - } else if (family == AF_INET6) { - char bytes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1 }; - tor_addr_from_ipv6_bytes(addr_out, bytes); - return 0; - } - } - return -1; -} - -static void -test_addr_basic(void *arg) -{ - uint32_t u32; - uint16_t u16; - char *cp; - - /* Test addr_port_lookup */ - (void)arg; - cp = NULL; u32 = 3; u16 = 3; - tt_assert(!addr_port_lookup(LOG_WARN, "1.2.3.4", &cp, &u32, &u16)); - tt_str_op(cp,OP_EQ, "1.2.3.4"); - tt_int_op(u32,OP_EQ, 0x01020304u); - tt_int_op(u16,OP_EQ, 0); - tor_free(cp); - tt_assert(!addr_port_lookup(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16)); - tt_str_op(cp,OP_EQ, "4.3.2.1"); - tt_int_op(u32,OP_EQ, 0x04030201u); - tt_int_op(u16,OP_EQ, 99); - tor_free(cp); - - MOCK(tor_addr_lookup, mock_tor_addr_lookup); - - tt_assert(!addr_port_lookup(LOG_WARN, "nonexistent.address:4040", - &cp, NULL, &u16)); - tt_str_op(cp,OP_EQ, "nonexistent.address"); - tt_int_op(u16,OP_EQ, 4040); - tor_free(cp); - tt_assert(!addr_port_lookup(LOG_WARN, "localhost:9999", &cp, &u32, &u16)); - tt_str_op(cp,OP_EQ, "localhost"); - tt_int_op(u16,OP_EQ, 9999); - tt_int_op(u32,OP_EQ, 0x7f000001u); - tor_free(cp); - u32 = 3; - tt_assert(!addr_port_lookup(LOG_WARN, "localhost", NULL, &u32, &u16)); - tt_ptr_op(cp,OP_EQ, NULL); - tt_int_op(u32,OP_EQ, 0x7f000001u); - tt_int_op(u16,OP_EQ, 0); - tor_free(cp); - - tt_assert(addr_port_lookup(LOG_WARN, "localhost:3", &cp, &u32, NULL)); - tor_free(cp); - - tt_int_op(0,OP_EQ, addr_mask_get_bits(0x0u)); - tt_int_op(32,OP_EQ, addr_mask_get_bits(0xFFFFFFFFu)); - tt_int_op(16,OP_EQ, addr_mask_get_bits(0xFFFF0000u)); - tt_int_op(31,OP_EQ, addr_mask_get_bits(0xFFFFFFFEu)); - tt_int_op(1,OP_EQ, addr_mask_get_bits(0x80000000u)); - - /* Test inet_ntop */ - { - char tmpbuf[TOR_ADDR_BUF_LEN]; - const char *ip = "176.192.208.224"; - struct in_addr in; - - /* good round trip */ - tt_int_op(tor_inet_pton(AF_INET, ip, &in), OP_EQ, 1); - tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)), - OP_EQ, &tmpbuf); - tt_str_op(tmpbuf,OP_EQ, ip); - - /* just enough buffer length */ - tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1), OP_EQ, ip); - - /* too short buffer */ - tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),OP_EQ, NULL); - } - - done: - UNMOCK(tor_addr_lookup); - tor_free(cp); -} - -#define test_op_ip6_(a,op,b,e1,e2) \ - STMT_BEGIN \ - tt_assert_test_fmt_type(a,b,e1" "#op" "e2,struct in6_addr*, \ - (fast_memcmp(val1_->s6_addr, val2_->s6_addr, 16) op 0), \ - char *, "%s", \ - { char *cp; \ - cp = print_ = tor_malloc(64); \ - for (int ii_=0;ii_<16;++ii_) { \ - tor_snprintf(cp, 3,"%02x", (unsigned)value_->s6_addr[ii_]); \ - cp += 2; \ - if (ii_ != 15) *cp++ = ':'; \ - } \ - }, \ - { tor_free(print_); }, \ - TT_EXIT_TEST_FUNCTION \ - ); \ - STMT_END - -/** Helper: Assert that two strings both decode as IPv6 addresses with - * tor_inet_pton(), and both decode to the same address. */ -#define test_pton6_same(a,b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ - test_op_ip6_(&a1,OP_EQ,&a2,#a,#b); \ - STMT_END - -/** Helper: Assert that a is recognized as a bad IPv6 address by - * tor_inet_pton(). */ -#define test_pton6_bad(a) \ - tt_int_op(0, OP_EQ, tor_inet_pton(AF_INET6, a, &a1)) - -/** Helper: assert that a, when parsed by tor_inet_pton() and displayed - * with tor_inet_ntop(), yields b. Also assert that b parses to - * the same value as a. */ -#define test_ntop6_reduces(a,b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ - tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), OP_EQ, b); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ - test_op_ip6_(&a1, OP_EQ, &a2, a, b); \ - STMT_END - -/** Helper: assert that a parses by tor_inet_pton() into a address that - * passes tor_addr_is_internal() with for_listening. */ -#define test_internal_ip(a,for_listening) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ - t1.family = AF_INET6; \ - if (!tor_addr_is_internal(&t1, for_listening)) \ - TT_DIE(("%s was not internal", a)); \ - STMT_END - -/** Helper: assert that a parses by tor_inet_pton() into a address that - * does not pass tor_addr_is_internal() with for_listening. */ -#define test_external_ip(a,for_listening) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ - t1.family = AF_INET6; \ - if (tor_addr_is_internal(&t1, for_listening)) \ - TT_DIE(("%s was not internal", a)); \ - STMT_END - -/** Helper: Assert that a and b, when parsed by - * tor_inet_pton(), give addresses that compare in the order defined by - * op with tor_addr_compare(). */ -#define test_addr_compare(a, op, b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ - t1.family = t2.family = AF_INET6; \ - r = tor_addr_compare(&t1,&t2,CMP_SEMANTIC); \ - if (!(r op 0)) \ - TT_DIE(("Failed: tor_addr_compare(%s,%s) %s 0", a, b, #op));\ - STMT_END - -/** Helper: Assert that a and b, when parsed by - * tor_inet_pton(), give addresses that compare in the order defined by - * op with tor_addr_compare_masked() with m masked. */ -#define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ - t1.family = t2.family = AF_INET6; \ - r = tor_addr_compare_masked(&t1,&t2,m,CMP_SEMANTIC); \ - if (!(r op 0)) \ - TT_DIE(("Failed: tor_addr_compare_masked(%s,%s,%d) %s 0", \ - a, b, m, #op)); \ - STMT_END - -/** Helper: assert that xx is parseable as a masked IPv6 address with - * ports by tor_parse_mask_addr_ports(), with family f, IP address - * as 4 32-bit words ip1...ip4, mask bits as mm, and port range - * as pt1..pt2. */ -#define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \ - STMT_BEGIN \ - tt_int_op(tor_addr_parse_mask_ports(xx, 0, &t1, &mask, &port1, &port2), \ - OP_EQ, f); \ - p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \ - tt_int_op(htonl(ip1), OP_EQ, tor_addr_to_in6_addr32(&t1)[0]); \ - tt_int_op(htonl(ip2), OP_EQ, tor_addr_to_in6_addr32(&t1)[1]); \ - tt_int_op(htonl(ip3), OP_EQ, tor_addr_to_in6_addr32(&t1)[2]); \ - tt_int_op(htonl(ip4), OP_EQ, tor_addr_to_in6_addr32(&t1)[3]); \ - tt_int_op(mask, OP_EQ, mm); \ - tt_uint_op(port1, OP_EQ, pt1); \ - tt_uint_op(port2, OP_EQ, pt2); \ - STMT_END - -/** Run unit tests for IPv6 encoding/decoding/manipulation functions. */ -static void -test_addr_ip6_helpers(void *arg) -{ - char buf[TOR_ADDR_BUF_LEN], bug[TOR_ADDR_BUF_LEN]; - char rbuf[REVERSE_LOOKUP_NAME_BUF_LEN]; - struct in6_addr a1, a2; - tor_addr_t t1, t2; - int r, i; - uint16_t port1, port2; - maskbits_t mask; - const char *p1; - struct sockaddr_storage sa_storage; - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - - /* Test tor_inet_ntop and tor_inet_pton: IPv6 */ - (void)arg; - { - const char *ip = "2001::1234"; - const char *ip_ffff = "::ffff:192.168.1.2"; - - /* good round trip */ - tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),OP_EQ, 1); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),OP_EQ, &buf); - tt_str_op(buf,OP_EQ, ip); - - /* good round trip - ::ffff:0:0 style */ - tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),OP_EQ, 1); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),OP_EQ, &buf); - tt_str_op(buf,OP_EQ, ip_ffff); - - /* just long enough buffer (remember \0) */ - tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),OP_EQ, ip); - tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),OP_EQ, - ip_ffff); - - /* too short buffer (remember \0) */ - tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),OP_EQ, NULL); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),OP_EQ, NULL); - } - - /* ==== Converting to and from sockaddr_t. */ - sin = (struct sockaddr_in *)&sa_storage; - sin->sin_family = AF_INET; - sin->sin_port = htons(9090); - sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/ - tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, &port1); - tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f7f0102); - tt_int_op(port1, OP_EQ, 9090); - - memset(&sa_storage, 0, sizeof(sa_storage)); - tt_int_op(sizeof(struct sockaddr_in),OP_EQ, - tor_addr_to_sockaddr(&t1, 1234, (struct sockaddr *)&sa_storage, - sizeof(sa_storage))); - tt_int_op(1234,OP_EQ, ntohs(sin->sin_port)); - tt_int_op(0x7f7f0102,OP_EQ, ntohl(sin->sin_addr.s_addr)); - - memset(&sa_storage, 0, sizeof(sa_storage)); - sin6 = (struct sockaddr_in6 *)&sa_storage; - sin6->sin6_family = AF_INET6; - sin6->sin6_port = htons(7070); - sin6->sin6_addr.s6_addr[0] = 128; - tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, &port1); - tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET6); - tt_int_op(port1, OP_EQ, 7070); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,OP_EQ, "8000::"); - - memset(&sa_storage, 0, sizeof(sa_storage)); - tt_int_op(sizeof(struct sockaddr_in6),OP_EQ, - tor_addr_to_sockaddr(&t1, 9999, (struct sockaddr *)&sa_storage, - sizeof(sa_storage))); - tt_int_op(AF_INET6,OP_EQ, sin6->sin6_family); - tt_int_op(9999,OP_EQ, ntohs(sin6->sin6_port)); - tt_int_op(0x80000000,OP_EQ, ntohl(S6_ADDR32(sin6->sin6_addr)[0])); - - /* ==== tor_addr_lookup: static cases. (Can't test dns without knowing we - * have a good resolver. */ - tt_int_op(0,OP_EQ, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1)); - tt_int_op(AF_INET,OP_EQ, tor_addr_family(&t1)); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f808182); - - tt_int_op(0,OP_EQ, tor_addr_lookup("9000::5", AF_UNSPEC, &t1)); - tt_int_op(AF_INET6,OP_EQ, tor_addr_family(&t1)); - tt_int_op(0x90,OP_EQ, tor_addr_to_in6_addr8(&t1)[0]); - tt_assert(tor_mem_is_zero((char*)tor_addr_to_in6_addr8(&t1)+1, 14)); - tt_int_op(0x05,OP_EQ, tor_addr_to_in6_addr8(&t1)[15]); - - /* === Test pton: valid af_inet6 */ - /* Simple, valid parsing. */ - r = tor_inet_pton(AF_INET6, - "0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1); - tt_int_op(r, OP_EQ, 1); - for (i=0;i<16;++i) { tt_int_op(i+1,OP_EQ, (int)a1.s6_addr[i]); } - /* ipv4 ending. */ - test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10", - "0102:0304:0506:0708:090A:0B0C:13.14.15.16"); - /* shortened words. */ - test_pton6_same("0001:0099:BEEF:0000:0123:FFFF:0001:0001", - "1:99:BEEF:0:0123:FFFF:1:1"); - /* zeros at the beginning */ - test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:1:1"); - test_pton6_same("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:0.1.0.1"); - /* zeros in the middle. */ - test_pton6_same("fe80:0000:0000:0000:0202:1111:0001:0001", - "fe80::202:1111:1:1"); - /* zeros at the end. */ - test_pton6_same("1000:0001:0000:0007:0000:0000:0000:0000", - "1000:1:0:7::"); - - /* === Test ntop: af_inet6 */ - test_ntop6_reduces("0:0:0:0:0:0:0:0", "::"); - - test_ntop6_reduces("0001:0099:BEEF:0006:0123:FFFF:0001:0001", - "1:99:beef:6:123:ffff:1:1"); - - //test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); - test_ntop6_reduces("0:0:0:0:0:ffff:c0a8:0101", "::ffff:192.168.1.1"); - test_ntop6_reduces("0:0:0:0:0:0:c0a8:0101", "::192.168.1.1"); - test_ntop6_reduces("002:0:0000:0:3::4", "2::3:0:0:4"); - test_ntop6_reduces("0:0::1:0:3", "::1:0:3"); - test_ntop6_reduces("008:0::0", "8::"); - test_ntop6_reduces("0:0:0:0:0:ffff::1", "::ffff:0.0.0.1"); - test_ntop6_reduces("abcd:0:0:0:0:0:7f00::", "abcd::7f00:0"); - test_ntop6_reduces("0000:0000:0000:0000:0009:C0A8:0001:0001", - "::9:c0a8:1:1"); - test_ntop6_reduces("fe80:0000:0000:0000:0202:1111:0001:0001", - "fe80::202:1111:1:1"); - test_ntop6_reduces("1000:0001:0000:0007:0000:0000:0000:0000", - "1000:1:0:7::"); - - /* Bad af param */ - tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),OP_EQ, -1); - - /* === Test pton: invalid in6. */ - test_pton6_bad("foobar."); - test_pton6_bad("-1::"); - test_pton6_bad("00001::"); - test_pton6_bad("10000::"); - test_pton6_bad("::10000"); - test_pton6_bad("55555::"); - test_pton6_bad("9:-60::"); - test_pton6_bad("9:+60::"); - test_pton6_bad("9|60::"); - test_pton6_bad("0x60::"); - test_pton6_bad("::0x60"); - test_pton6_bad("9:0x60::"); - test_pton6_bad("1:2:33333:4:0002:3::"); - test_pton6_bad("1:2:3333:4:fish:3::"); - test_pton6_bad("1:2:3:4:5:6:7:8:9"); - test_pton6_bad("1:2:3:4:5:6:7"); - test_pton6_bad("1:2:3:4:5:6:1.2.3.4.5"); - test_pton6_bad("1:2:3:4:5:6:1.2.3"); - test_pton6_bad("::1.2.3"); - test_pton6_bad("::1.2.3.4.5"); - test_pton6_bad("::ffff:0xff.0.0.0"); - test_pton6_bad("::ffff:ff.0.0.0"); - test_pton6_bad("::ffff:256.0.0.0"); - test_pton6_bad("::ffff:-1.0.0.0"); - test_pton6_bad("99"); - test_pton6_bad(""); - test_pton6_bad("."); - test_pton6_bad(":"); - test_pton6_bad("1::2::3:4"); - test_pton6_bad("a:::b:c"); - test_pton6_bad(":::a:b:c"); - test_pton6_bad("a:b:c:::"); - test_pton6_bad("1.2.3.4"); - test_pton6_bad(":1.2.3.4"); - test_pton6_bad(".2.3.4"); - /* Regression tests for 22789. */ - test_pton6_bad("0xfoo"); - test_pton6_bad("0x88"); - test_pton6_bad("0xyxxy"); - test_pton6_bad("0XFOO"); - test_pton6_bad("0X88"); - test_pton6_bad("0XYXXY"); - test_pton6_bad("0x"); - test_pton6_bad("0X"); - - /* test internal checking */ - test_external_ip("fbff:ffff::2:7", 0); - test_internal_ip("fc01::2:7", 0); - test_internal_ip("fc01::02:7", 0); - test_internal_ip("fc01::002:7", 0); - test_internal_ip("fc01::0002:7", 0); - test_internal_ip("fdff:ffff::f:f", 0); - test_external_ip("fe00::3:f", 0); - - test_external_ip("fe7f:ffff::2:7", 0); - test_internal_ip("fe80::2:7", 0); - test_internal_ip("febf:ffff::f:f", 0); - - test_internal_ip("fec0::2:7:7", 0); - test_internal_ip("feff:ffff::e:7:7", 0); - test_external_ip("ff00::e:7:7", 0); - - test_internal_ip("::", 0); - test_internal_ip("::1", 0); - test_internal_ip("::1", 1); - test_internal_ip("::", 0); - test_external_ip("::", 1); - test_external_ip("::2", 0); - test_external_ip("2001::", 0); - test_external_ip("ffff::", 0); - - test_external_ip("::ffff:0.0.0.0", 1); - test_internal_ip("::ffff:0.0.0.0", 0); - test_internal_ip("::ffff:0.255.255.255", 0); - test_external_ip("::ffff:1.0.0.0", 0); - - test_external_ip("::ffff:9.255.255.255", 0); - test_internal_ip("::ffff:10.0.0.0", 0); - test_internal_ip("::ffff:10.255.255.255", 0); - test_external_ip("::ffff:11.0.0.0", 0); - - test_external_ip("::ffff:126.255.255.255", 0); - test_internal_ip("::ffff:127.0.0.0", 0); - test_internal_ip("::ffff:127.255.255.255", 0); - test_external_ip("::ffff:128.0.0.0", 0); - - test_external_ip("::ffff:172.15.255.255", 0); - test_internal_ip("::ffff:172.16.0.0", 0); - test_internal_ip("::ffff:172.31.255.255", 0); - test_external_ip("::ffff:172.32.0.0", 0); - - test_external_ip("::ffff:192.167.255.255", 0); - test_internal_ip("::ffff:192.168.0.0", 0); - test_internal_ip("::ffff:192.168.255.255", 0); - test_external_ip("::ffff:192.169.0.0", 0); - - test_external_ip("::ffff:169.253.255.255", 0); - test_internal_ip("::ffff:169.254.0.0", 0); - test_internal_ip("::ffff:169.254.255.255", 0); - test_external_ip("::ffff:169.255.0.0", 0); - - /* tor_addr_compare(tor_addr_t x2) */ - test_addr_compare("ffff::", OP_EQ, "ffff::0"); - test_addr_compare("0::3:2:1", OP_LT, "0::ffff:0.3.2.1"); - test_addr_compare("0::2:2:1", OP_LT, "0::ffff:0.3.2.1"); - test_addr_compare("0::ffff:0.3.2.1", OP_GT, "0::0:0:0"); - test_addr_compare("0::ffff:5.2.2.1", OP_LT, - "::ffff:6.0.0.0"); /* XXXX wrong. */ - tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", 0, &t1, NULL, NULL, NULL); - tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL); - tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_EQ, 0); - tor_addr_parse_mask_ports("[::ffff:2.3.4.4]", 0, &t1, NULL, NULL, NULL); - tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL); - tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_LT, 0); - - /* test compare_masked */ - test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 128); - test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 64); - test_addr_compare_masked("0::2:2:1", OP_LT, "0::8000:2:1", 81); - test_addr_compare_masked("0::2:2:1", OP_EQ, "0::8000:2:1", 80); - - /* Test undecorated tor_addr_to_str */ - tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,OP_EQ, "123:45:6789::5005:11"); - tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,OP_EQ, "18.0.0.1"); - - /* Test decorated tor_addr_to_str */ - tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,OP_EQ, "[123:45:6789::5005:11]"); - tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,OP_EQ, "18.0.0.1"); - - /* Test buffer bounds checking of tor_addr_to_str */ - tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "::")); /* 2 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),OP_EQ, "::"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),OP_EQ, "[::]"); - - tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),OP_EQ, "2000::1337"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),OP_EQ, "[2000::1337]"); - - tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),OP_EQ, "1.2.3.4"); - - tt_int_op(AF_INET, OP_EQ, - tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),OP_EQ, "255.255.255.255"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),OP_EQ, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),OP_EQ, "255.255.255.255"); - - t1.family = AF_UNSPEC; - tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),OP_EQ, NULL); - - /* Test tor_addr_parse_PTR_name */ - i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 0); - tt_int_op(0,OP_EQ, i); - i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 1); - tt_int_op(0,OP_EQ, i); - i = tor_addr_parse_PTR_name(&t1, "9999999999999999999999999999.in-addr.arpa", - AF_UNSPEC, 1); - tt_int_op(-1,OP_EQ, i); - i = tor_addr_parse_PTR_name(&t1, "1.0.168.192.in-addr.arpa", - AF_UNSPEC, 1); - tt_int_op(1,OP_EQ, i); - tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,OP_EQ, "192.168.0.1"); - i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 0); - tt_int_op(0,OP_EQ, i); - i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 1); - tt_int_op(1,OP_EQ, i); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,OP_EQ, "192.168.0.99"); - memset(&t1, 0, sizeof(t1)); - i = tor_addr_parse_PTR_name(&t1, - "0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f." - "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." - "ip6.ARPA", - AF_UNSPEC, 0); - tt_int_op(1,OP_EQ, i); - p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,OP_EQ, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]"); - /* Failing cases. */ - i = tor_addr_parse_PTR_name(&t1, - "6.7.8.9.a.b.c.d.e.f." - "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." - "ip6.ARPA", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, - "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.f.0." - "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." - "ip6.ARPA", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, - "6.7.8.9.a.b.c.d.e.f.X.0.0.0.0.9." - "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." - "ip6.ARPA", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, "32.1.1.in-addr.arpa", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, ".in-addr.arpa", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", - AF_UNSPEC, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", - AF_INET6, 0); - tt_int_op(i,OP_EQ, -1); - i = tor_addr_parse_PTR_name(&t1, - "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.0." - "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." - "ip6.ARPA", - AF_INET, 0); - tt_int_op(i,OP_EQ, -1); - - /* === Test tor_addr_to_PTR_name */ - - /* Stage IPv4 addr */ - memset(&sa_storage, 0, sizeof(sa_storage)); - sin = (struct sockaddr_in *)&sa_storage; - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = htonl(0x7f010203); /* 127.1.2.3 */ - tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL); - - /* Check IPv4 PTR - too short buffer */ - tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),OP_EQ, -1); - tt_int_op(tor_addr_to_PTR_name(rbuf, - strlen("3.2.1.127.in-addr.arpa") - 1, - &t1),OP_EQ, -1); - - /* Check IPv4 PTR - valid addr */ - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, - strlen("3.2.1.127.in-addr.arpa")); - tt_str_op(rbuf,OP_EQ, "3.2.1.127.in-addr.arpa"); - - /* Invalid addr family */ - t1.family = AF_UNSPEC; - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, -1); - - /* Stage IPv6 addr */ - memset(&sa_storage, 0, sizeof(sa_storage)); - sin6 = (struct sockaddr_in6 *)&sa_storage; - sin6->sin6_family = AF_INET6; - sin6->sin6_addr.s6_addr[0] = 0x80; /* 8000::abcd */ - sin6->sin6_addr.s6_addr[14] = 0xab; - sin6->sin6_addr.s6_addr[15] = 0xcd; - - tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, NULL); - - { - const char* addr_PTR = "d.c.b.a.0.0.0.0.0.0.0.0.0.0.0.0." - "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.ip6.arpa"; - - /* Check IPv6 PTR - too short buffer */ - tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),OP_EQ, -1); - tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),OP_EQ, -1); - - /* Check IPv6 PTR - valid addr */ - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, - strlen(addr_PTR)); - tt_str_op(rbuf,OP_EQ, addr_PTR); - } - - /* XXXX turn this into a separate function; it's not all IPv6. */ - /* test tor_addr_parse_mask_ports */ - test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6, - 0, 0, 0, 0x0000000f, 17, 47, 95); - tt_str_op(p1,OP_EQ, "::f"); - //test_addr_parse("[::fefe:4.1.1.7/120]:999-1000"); - //test_addr_parse_check("::fefe:401:107", 120, 999, 1000); - test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6, - 0, 0, 0x0000ffff, 0x04010107, 120, 443, 443); - tt_str_op(p1,OP_EQ, "::ffff:4.1.1.7"); - test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6, - 0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000); - - tt_str_op(p1,OP_EQ, "abcd:2::44a:0"); - /* Try some long addresses. */ - r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111]", - 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, AF_INET6); - r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:11111]", - 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111:1]", - 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports( - "[ffff:1111:1111:1111:1111:1111:1111:ffff:" - "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" - "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" - "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]", - 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - /* Try some failing cases. */ - r=tor_addr_parse_mask_ports("[fefef::]/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[fefe::/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[fefe::", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[fefe::X]", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("efef::/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/fred",0,&t1,&mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/255.255.0.0", - 0,&t1, NULL, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - /* This one will get rejected because it isn't a pure prefix. */ - r=tor_addr_parse_mask_ports("1.1.2.3/255.255.64.0",0,&t1, &mask,NULL,NULL); - tt_int_op(r, OP_EQ, -1); - /* Test for V4-mapped address with mask < 96. (arguably not valid) */ - r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("1.1.2.2/33",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - /* Try extended wildcard addresses with out TAPMP_EXTENDED_STAR*/ - r=tor_addr_parse_mask_ports("*4",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("*6",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - tt_int_op(r, OP_EQ, -1); - /* Try a mask with a wildcard. */ - r=tor_addr_parse_mask_ports("*/16",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("*4/16",TAPMP_EXTENDED_STAR, - &t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - r=tor_addr_parse_mask_ports("*6/30",TAPMP_EXTENDED_STAR, - &t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, -1); - /* Basic mask tests*/ - r=tor_addr_parse_mask_ports("1.1.2.2/31",0,&t1, &mask, NULL, NULL); - tt_int_op(r, OP_EQ, AF_INET); - tt_int_op(mask,OP_EQ,31); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010202); - r=tor_addr_parse_mask_ports("3.4.16.032:1-2",0,&t1, &mask, &port1, &port2); - tt_int_op(r, OP_EQ, AF_INET); - tt_int_op(mask,OP_EQ,32); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x03041020); - tt_uint_op(port1, OP_EQ, 1); - tt_uint_op(port2, OP_EQ, 2); - r=tor_addr_parse_mask_ports("1.1.2.3/255.255.128.0",0,&t1, &mask,NULL,NULL); - tt_int_op(r, OP_EQ, AF_INET); - tt_int_op(mask,OP_EQ,17); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010203); - r=tor_addr_parse_mask_ports("[efef::]/112",0,&t1, &mask, &port1, &port2); - tt_int_op(r, OP_EQ, AF_INET6); - tt_uint_op(port1, OP_EQ, 1); - tt_uint_op(port2, OP_EQ, 65535); - /* Try regular wildcard behavior without TAPMP_EXTENDED_STAR */ - r=tor_addr_parse_mask_ports("*:80-443",0,&t1,&mask,&port1,&port2); - tt_int_op(r,OP_EQ,AF_INET); /* Old users of this always get inet */ - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); - tt_int_op(mask,OP_EQ,0); - tt_int_op(port1,OP_EQ,80); - tt_int_op(port2,OP_EQ,443); - /* Now try wildcards *with* TAPMP_EXTENDED_STAR */ - r=tor_addr_parse_mask_ports("*:8000-9000",TAPMP_EXTENDED_STAR, - &t1,&mask,&port1,&port2); - tt_int_op(r,OP_EQ,AF_UNSPEC); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_UNSPEC); - tt_int_op(mask,OP_EQ,0); - tt_int_op(port1,OP_EQ,8000); - tt_int_op(port2,OP_EQ,9000); - r=tor_addr_parse_mask_ports("*4:6667",TAPMP_EXTENDED_STAR, - &t1,&mask,&port1,&port2); - tt_int_op(r,OP_EQ,AF_INET); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); - tt_int_op(mask,OP_EQ,0); - tt_int_op(port1,OP_EQ,6667); - tt_int_op(port2,OP_EQ,6667); - r=tor_addr_parse_mask_ports("*6",TAPMP_EXTENDED_STAR, - &t1,&mask,&port1,&port2); - tt_int_op(r,OP_EQ,AF_INET6); - tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET6); - tt_assert(tor_mem_is_zero((const char*)tor_addr_to_in6_addr32(&t1), 16)); - tt_int_op(mask,OP_EQ,0); - tt_int_op(port1,OP_EQ,1); - tt_int_op(port2,OP_EQ,65535); - - /* make sure inet address lengths >= max */ - tt_int_op(INET_NTOA_BUF_LEN, OP_GE, sizeof("255.255.255.255")); - tt_int_op(TOR_ADDR_BUF_LEN, OP_GE, - sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")); - - tt_assert(sizeof(tor_addr_t) >= sizeof(struct in6_addr)); - - /* get interface addresses */ - r = get_interface_address6(LOG_DEBUG, AF_INET, &t1); - tt_int_op(r, OP_LE, 0); // "it worked or it didn't" - i = get_interface_address6(LOG_DEBUG, AF_INET6, &t2); - tt_int_op(i, OP_LE, 0); // "it worked or it didn't" - - TT_BLATHER(("v4 address: %s (family=%d)", fmt_addr(&t1), - tor_addr_family(&t1))); - TT_BLATHER(("v6 address: %s (family=%d)", fmt_addr(&t2), - tor_addr_family(&t2))); - - done: - ; -} - -/** Test tor_addr_port_parse(). */ -static void -test_addr_parse(void *arg) -{ - int r; - tor_addr_t addr; - char buf[TOR_ADDR_BUF_LEN]; - uint16_t port = 0; - - /* Correct call. */ - (void)arg; - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.1:1234", - &addr, &port, -1); - tt_int_op(r, OP_EQ, 0); - tor_addr_to_str(buf, &addr, sizeof(buf), 0); - tt_str_op(buf,OP_EQ, "192.0.2.1"); - tt_int_op(port,OP_EQ, 1234); - - r= tor_addr_port_parse(LOG_DEBUG, - "[::1]:1234", - &addr, &port, -1); - tt_int_op(r, OP_EQ, 0); - tor_addr_to_str(buf, &addr, sizeof(buf), 0); - tt_str_op(buf,OP_EQ, "::1"); - tt_int_op(port,OP_EQ, 1234); - - /* Domain name. */ - r= tor_addr_port_parse(LOG_DEBUG, - "torproject.org:1234", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - - /* Only IP. */ - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.2", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.2", - &addr, &port, 200); - tt_int_op(r, OP_EQ, 0); - tt_int_op(port,OP_EQ,200); - - r= tor_addr_port_parse(LOG_DEBUG, - "[::1]", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - - r= tor_addr_port_parse(LOG_DEBUG, - "[::1]", - &addr, &port, 400); - tt_int_op(r, OP_EQ, 0); - tt_int_op(port,OP_EQ,400); - - /* Bad port. */ - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.2:66666", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.2:66666", - &addr, &port, 200); - tt_int_op(r, OP_EQ, -1); - - /* Only domain name */ - r= tor_addr_port_parse(LOG_DEBUG, - "torproject.org", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - r= tor_addr_port_parse(LOG_DEBUG, - "torproject.org", - &addr, &port, 200); - tt_int_op(r, OP_EQ, -1); - - /* Bad IP address */ - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2:1234", - &addr, &port, -1); - tt_int_op(r, OP_EQ, -1); - - /* Make sure that the default port has lower priority than the real - one */ - r= tor_addr_port_parse(LOG_DEBUG, - "192.0.2.2:1337", - &addr, &port, 200); - tt_int_op(r, OP_EQ, 0); - tt_int_op(port,OP_EQ,1337); - - r= tor_addr_port_parse(LOG_DEBUG, - "[::1]:1369", - &addr, &port, 200); - tt_int_op(r, OP_EQ, 0); - tt_int_op(port,OP_EQ,1369); - - done: - ; -} - -static void -update_difference(int ipv6, uint8_t *d, - const tor_addr_t *a, const tor_addr_t *b) -{ - const int n_bytes = ipv6 ? 16 : 4; - uint8_t a_tmp[4], b_tmp[4]; - const uint8_t *ba, *bb; - int i; - - if (ipv6) { - ba = tor_addr_to_in6_addr8(a); - bb = tor_addr_to_in6_addr8(b); - } else { - set_uint32(a_tmp, tor_addr_to_ipv4n(a)); - set_uint32(b_tmp, tor_addr_to_ipv4n(b)); - ba = a_tmp; bb = b_tmp; - } - - for (i = 0; i < n_bytes; ++i) { - d[i] |= ba[i] ^ bb[i]; - } -} - -static void -test_virtaddrmap(void *data) -{ - /* Let's start with a bunch of random addresses. */ - int ipv6, bits, iter, b; - virtual_addr_conf_t cfg[2]; - uint8_t bytes[16]; - - (void)data; - - tor_addr_parse(&cfg[0].addr, "64.65.0.0"); - tor_addr_parse(&cfg[1].addr, "3491:c0c0::"); - - for (ipv6 = 0; ipv6 <= 1; ++ipv6) { - for (bits = 0; bits < 18; ++bits) { - tor_addr_t last_a; - cfg[ipv6].bits = bits; - memset(bytes, 0, sizeof(bytes)); - tor_addr_copy(&last_a, &cfg[ipv6].addr); - /* Generate 128 addresses with each addr/bits combination. */ - for (iter = 0; iter < 128; ++iter) { - tor_addr_t a; - - get_random_virtual_addr(&cfg[ipv6], &a); - //printf("%s\n", fmt_addr(&a)); - /* Make sure that the first b bits match the configured network */ - tt_int_op(0, OP_EQ, tor_addr_compare_masked(&a, &cfg[ipv6].addr, - bits, CMP_EXACT)); - - /* And track which bits have been different between pairs of - * addresses */ - update_difference(ipv6, bytes, &last_a, &a); - } - - /* Now make sure all but the first 'bits' bits of bytes are true */ - for (b = bits+1; b < (ipv6?128:32); ++b) { - tt_assert(1 & (bytes[b/8] >> (7-(b&7)))); - } - } - } - - done: - ; -} - -static void -test_addr_localname(void *arg) -{ - (void)arg; - tt_assert(tor_addr_hostname_is_local("localhost")); - tt_assert(tor_addr_hostname_is_local("LOCALHOST")); - tt_assert(tor_addr_hostname_is_local("LocalHost")); - tt_assert(tor_addr_hostname_is_local("local")); - tt_assert(tor_addr_hostname_is_local("LOCAL")); - tt_assert(tor_addr_hostname_is_local("here.now.local")); - tt_assert(tor_addr_hostname_is_local("here.now.LOCAL")); - - tt_assert(!tor_addr_hostname_is_local(" localhost")); - tt_assert(!tor_addr_hostname_is_local("www.torproject.org")); - done: - ; -} - -static void -test_addr_dup_ip(void *arg) -{ - char *v = NULL; - (void)arg; -#define CHECK(ip, s) do { \ - v = tor_dup_ip(ip); \ - tt_str_op(v,OP_EQ,(s)); \ - tor_free(v); \ - } while (0) - - CHECK(0xffffffff, "255.255.255.255"); - CHECK(0x00000000, "0.0.0.0"); - CHECK(0x7f000001, "127.0.0.1"); - CHECK(0x01020304, "1.2.3.4"); - -#undef CHECK - done: - tor_free(v); -} - -static void -test_addr_sockaddr_to_str(void *arg) -{ - char *v = NULL; - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - struct sockaddr_storage ss; -#ifdef HAVE_SYS_UN_H - struct sockaddr_un s_un; -#endif -#define CHECK(sa, s) do { \ - v = tor_sockaddr_to_str((const struct sockaddr*) &(sa)); \ - tt_str_op(v,OP_EQ,(s)); \ - tor_free(v); \ - } while (0) - (void)arg; - - memset(&ss,0,sizeof(ss)); - ss.ss_family = AF_UNSPEC; - CHECK(ss, "unspec"); - - memset(&sin,0,sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(0x7f808001); - sin.sin_port = htons(1234); - CHECK(sin, "127.128.128.1:1234"); - -#ifdef HAVE_SYS_UN_H - memset(&s_un,0,sizeof(s_un)); - s_un.sun_family = AF_UNIX; - strlcpy(s_un.sun_path, "/here/is/a/path", sizeof(s_un.sun_path)); - CHECK(s_un, "unix:/here/is/a/path"); -#endif /* defined(HAVE_SYS_UN_H) */ - - memset(&sin6,0,sizeof(sin6)); - sin6.sin6_family = AF_INET6; - memcpy(sin6.sin6_addr.s6_addr, "\x20\x00\x00\x00\x00\x00\x00\x00" - "\x00\x1a\x2b\x3c\x4d\x5e\x00\x01", 16); - sin6.sin6_port = htons(1234); - CHECK(sin6, "[2000::1a:2b3c:4d5e:1]:1234"); - - done: - tor_free(v); -} - -static void -test_addr_is_loopback(void *data) -{ - static const struct loopback_item { - const char *name; - int is_loopback; - } loopback_items[] = { - { "::1", 1 }, - { "127.0.0.1", 1 }, - { "127.99.100.101", 1 }, - { "128.99.100.101", 0 }, - { "8.8.8.8", 0 }, - { "0.0.0.0", 0 }, - { "::2", 0 }, - { "::", 0 }, - { "::1.0.0.0", 0 }, - { NULL, 0 } - }; - - int i; - tor_addr_t addr; - (void)data; - - for (i=0; loopback_items[i].name; ++i) { - tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), OP_GE, 0); - tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, - loopback_items[i].is_loopback); - } - - tor_addr_make_unspec(&addr); - tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, 0); - - done: - ; -} - -static void -test_addr_make_null(void *data) -{ - tor_addr_t *addr = tor_malloc(sizeof(*addr)); - tor_addr_t *zeros = tor_malloc_zero(sizeof(*addr)); - char buf[TOR_ADDR_BUF_LEN]; - (void) data; - /* Ensure that before tor_addr_make_null, addr != 0's */ - memset(addr, 1, sizeof(*addr)); - tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_NE, 0); - /* Test with AF == AF_INET */ - zeros->family = AF_INET; - tor_addr_make_null(addr, AF_INET); - tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); - tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "0.0.0.0"); - /* Test with AF == AF_INET6 */ - memset(addr, 1, sizeof(*addr)); - zeros->family = AF_INET6; - tor_addr_make_null(addr, AF_INET6); - tt_int_op(fast_memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); - tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "::"); - done: - tor_free(addr); - tor_free(zeros); -} - -#define ADDR_LEGACY(name) \ - { #name, test_addr_ ## name , 0, NULL, NULL } - -struct testcase_t addr_tests[] = { - ADDR_LEGACY(basic), - ADDR_LEGACY(ip6_helpers), - ADDR_LEGACY(parse), - { "virtaddr", test_virtaddrmap, 0, NULL, NULL }, - { "localname", test_addr_localname, 0, NULL, NULL }, - { "dup_ip", test_addr_dup_ip, 0, NULL, NULL }, - { "sockaddr_to_str", test_addr_sockaddr_to_str, 0, NULL, NULL }, - { "is_loopback", test_addr_is_loopback, 0, NULL, NULL }, - { "make_null", test_addr_make_null, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_address.c b/src/tor/src/test/test_address.c deleted file mode 100644 index 9c88d37a4..000000000 --- a/src/tor/src/test/test_address.c +++ /dev/null @@ -1,1175 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define ADDRESS_PRIVATE - -#include "orconfig.h" - -#ifdef _WIN32 -#include -/* For access to structs needed by GetAdaptersAddresses */ -#include -#endif - -#ifdef HAVE_IFADDRS_TO_SMARTLIST -#include -#include -#endif - -#ifdef HAVE_IFCONF_TO_SMARTLIST -#ifdef HAVE_SYS_IOCTL_H -#include -#endif -#include -#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */ - -#include "or.h" -#include "address.h" -#include "test.h" -#include "log_test_helpers.h" - -/** Return 1 iff sockaddr1 and sockaddr2 represent - * the same IP address and port combination. Otherwise, return 0. - */ -static uint8_t -sockaddr_in_are_equal(struct sockaddr_in *sockaddr1, - struct sockaddr_in *sockaddr2) -{ - return ((sockaddr1->sin_family == sockaddr2->sin_family) && - (sockaddr1->sin_port == sockaddr2->sin_port) && - (sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr)); -} - -/** Return 1 iff sockaddr1 and sockaddr2 represent - * the same IP address and port combination. Otherwise, return 0. - */ -static uint8_t -sockaddr_in6_are_equal(struct sockaddr_in6 *sockaddr1, - struct sockaddr_in6 *sockaddr2) -{ - return ((sockaddr1->sin6_family == sockaddr2->sin6_family) && - (sockaddr1->sin6_port == sockaddr2->sin6_port) && - (tor_memeq(sockaddr1->sin6_addr.s6_addr, - sockaddr2->sin6_addr.s6_addr,16))); -} - -/** Create a sockaddr_in structure from IP address string ip_str. - * - * If out is not NULL, write the result - * to the memory address in out. Otherwise, allocate the memory - * for result. On success, return pointer to result. Otherwise, return - * NULL. - */ -static struct sockaddr_in * -sockaddr_in_from_string(const char *ip_str, struct sockaddr_in *out) -{ - // [FIXME: add some error checking?] - if (!out) - out = tor_malloc_zero(sizeof(struct sockaddr_in)); - - out->sin_family = AF_INET; - out->sin_port = 0; - tor_inet_pton(AF_INET,ip_str,&(out->sin_addr)); - - return out; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is an IPv4 or IPv6 localhost address. Otherwise, return 0. - */ -static int -smartlist_contains_localhost_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - if (tor_addr_is_loopback(tor_addr)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is an IPv4 or IPv6 multicast address. Otherwise, return 0. - */ -static int -smartlist_contains_multicast_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - if (tor_addr_is_multicast(tor_addr)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is an IPv4 or IPv6 internal address. Otherwise, return 0. - */ -static int -smartlist_contains_internal_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - if (tor_addr_is_internal(tor_addr, 0)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is NULL or the null tor_addr_t. Otherwise, return 0. - */ -static int -smartlist_contains_null_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - if (tor_addr == NULL || tor_addr_is_null(tor_addr)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is an IPv4 address. Otherwise, return 0. - */ -static int -smartlist_contains_ipv4_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - if (tor_addr_is_v4(tor_addr)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -/** Return 1 iff smartlist contains a tor_addr_t structure - * that is an IPv6 address. Otherwise, return 0. - */ -static int -smartlist_contains_ipv6_tor_addr(smartlist_t *smartlist) -{ - SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { - /* Since there's no tor_addr_is_v6, assume all non-v4s are v6 */ - if (!tor_addr_is_v4(tor_addr)) { - return 1; - } - } SMARTLIST_FOREACH_END(tor_addr); - - return 0; -} - -#ifdef HAVE_IFADDRS_TO_SMARTLIST -static void -test_address_ifaddrs_to_smartlist(void *arg) -{ - struct ifaddrs *ifa = NULL; - struct ifaddrs *ifa_ipv4 = NULL; - struct ifaddrs *ifa_ipv6 = NULL; - struct sockaddr_in *ipv4_sockaddr_local = NULL; - struct sockaddr_in *netmask_slash8 = NULL; - struct sockaddr_in *ipv4_sockaddr_remote = NULL; - struct sockaddr_in6 *ipv6_sockaddr = NULL; - smartlist_t *smartlist = NULL; - tor_addr_t *tor_addr = NULL; - struct sockaddr *sockaddr_to_check = NULL; - socklen_t addr_len; - - (void)arg; - - netmask_slash8 = sockaddr_in_from_string("255.0.0.0",NULL); - ipv4_sockaddr_local = sockaddr_in_from_string("127.0.0.1",NULL); - ipv4_sockaddr_remote = sockaddr_in_from_string("128.52.160.20",NULL); - - ipv6_sockaddr = tor_malloc(sizeof(struct sockaddr_in6)); - ipv6_sockaddr->sin6_family = AF_INET6; - ipv6_sockaddr->sin6_port = 0; - tor_inet_pton(AF_INET6, "2001:db8:8714:3a90::12", - &(ipv6_sockaddr->sin6_addr)); - - ifa = tor_malloc(sizeof(struct ifaddrs)); - ifa_ipv4 = tor_malloc(sizeof(struct ifaddrs)); - ifa_ipv6 = tor_malloc(sizeof(struct ifaddrs)); - - ifa->ifa_next = ifa_ipv4; - ifa->ifa_name = tor_strdup("eth0"); - ifa->ifa_flags = IFF_UP | IFF_RUNNING; - ifa->ifa_addr = (struct sockaddr *)ipv4_sockaddr_local; - ifa->ifa_netmask = (struct sockaddr *)netmask_slash8; - ifa->ifa_dstaddr = NULL; - ifa->ifa_data = NULL; - - ifa_ipv4->ifa_next = ifa_ipv6; - ifa_ipv4->ifa_name = tor_strdup("eth1"); - ifa_ipv4->ifa_flags = IFF_UP | IFF_RUNNING; - ifa_ipv4->ifa_addr = (struct sockaddr *)ipv4_sockaddr_remote; - ifa_ipv4->ifa_netmask = (struct sockaddr *)netmask_slash8; - ifa_ipv4->ifa_dstaddr = NULL; - ifa_ipv4->ifa_data = NULL; - - ifa_ipv6->ifa_next = NULL; - ifa_ipv6->ifa_name = tor_strdup("eth2"); - ifa_ipv6->ifa_flags = IFF_UP | IFF_RUNNING; - ifa_ipv6->ifa_addr = (struct sockaddr *)ipv6_sockaddr; - ifa_ipv6->ifa_netmask = NULL; - ifa_ipv6->ifa_dstaddr = NULL; - ifa_ipv6->ifa_data = NULL; - - smartlist = ifaddrs_to_smartlist(ifa, AF_UNSPEC); - - tt_assert(smartlist); - tt_int_op(smartlist_len(smartlist), OP_EQ, 3); - - sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6)); - - tor_addr = smartlist_get(smartlist,0); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); - tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, - ipv4_sockaddr_local)); - - tor_addr = smartlist_get(smartlist,1); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); - tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, - ipv4_sockaddr_remote)); - - tor_addr = smartlist_get(smartlist,2); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, - sizeof(struct sockaddr_in6)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in6)); - tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check, - ipv6_sockaddr)); - - done: - tor_free(netmask_slash8); - tor_free(ipv4_sockaddr_local); - tor_free(ipv4_sockaddr_remote); - tor_free(ipv6_sockaddr); - tor_free(ifa->ifa_name); - tor_free(ifa_ipv4->ifa_name); - tor_free(ifa_ipv6->ifa_name); - tor_free(ifa); - tor_free(ifa_ipv4); - tor_free(ifa_ipv6); - tor_free(sockaddr_to_check); - if (smartlist) { - SMARTLIST_FOREACH(smartlist, tor_addr_t *, t, tor_free(t)); - smartlist_free(smartlist); - } - return; -} - -static void -test_address_get_if_addrs_ifaddrs(void *arg) -{ - - smartlist_t *results = NULL; - - (void)arg; - - results = get_interface_addresses_ifaddrs(LOG_ERR, AF_UNSPEC); - - tt_assert(results); - /* Some FreeBSD jails don't have localhost IP address. Instead, they only - * have the address assigned to the jail (whatever that may be). - * And a jail without a network connection might not have any addresses at - * all. */ - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* If there are addresses, they must be IPv4 or IPv6 */ - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv4_tor_addr(results) - || smartlist_contains_ipv6_tor_addr(results)); - } - - done: - if (results) { - SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); - } - smartlist_free(results); - return; -} - -#endif /* defined(HAVE_IFADDRS_TO_SMARTLIST) */ - -#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST - -static void -test_address_get_if_addrs_win32(void *arg) -{ - - smartlist_t *results = NULL; - - (void)arg; - - results = get_interface_addresses_win32(LOG_ERR, AF_UNSPEC); - - tt_int_op(smartlist_len(results),OP_GE,1); - tt_assert(smartlist_contains_localhost_tor_addr(results)); - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* If there are addresses, they must be IPv4 or IPv6 */ - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv4_tor_addr(results) - || smartlist_contains_ipv6_tor_addr(results)); - } - - done: - SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); - tor_free(results); - return; -} - -static void -test_address_ip_adapter_addresses_to_smartlist(void *arg) -{ - - IP_ADAPTER_ADDRESSES *addrs1; - IP_ADAPTER_ADDRESSES *addrs2; - - IP_ADAPTER_UNICAST_ADDRESS *unicast11; - IP_ADAPTER_UNICAST_ADDRESS *unicast12; - IP_ADAPTER_UNICAST_ADDRESS *unicast21; - - smartlist_t *result = NULL; - - struct sockaddr_in *sockaddr_test1; - struct sockaddr_in *sockaddr_test2; - struct sockaddr_in *sockaddr_localhost; - struct sockaddr_in *sockaddr_to_check; - - tor_addr_t *tor_addr; - - (void)arg; - (void)sockaddr_in6_are_equal; - - sockaddr_to_check = tor_malloc_zero(sizeof(struct sockaddr_in)); - - addrs1 = - tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); - - addrs1->FirstUnicastAddress = - unicast11 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); - sockaddr_test1 = sockaddr_in_from_string("86.59.30.40",NULL); - unicast11->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test1; - - unicast11->Next = unicast12 = - tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); - sockaddr_test2 = sockaddr_in_from_string("93.95.227.222", NULL); - unicast12->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test2; - - addrs1->Next = addrs2 = - tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); - - addrs2->FirstUnicastAddress = - unicast21 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); - sockaddr_localhost = sockaddr_in_from_string("127.0.0.1", NULL); - unicast21->Address.lpSockaddr = (LPSOCKADDR)sockaddr_localhost; - - result = ip_adapter_addresses_to_smartlist(addrs1); - - tt_assert(result); - tt_int_op(smartlist_len(result), OP_EQ, 3); - - tor_addr = smartlist_get(result,0); - - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_assert(sockaddr_in_are_equal(sockaddr_test1,sockaddr_to_check)); - - tor_addr = smartlist_get(result,1); - - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_assert(sockaddr_in_are_equal(sockaddr_test2,sockaddr_to_check)); - - tor_addr = smartlist_get(result,2); - - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_assert(sockaddr_in_are_equal(sockaddr_localhost,sockaddr_to_check)); - - done: - SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); - smartlist_free(result); - tor_free(addrs1); - tor_free(addrs2); - tor_free(unicast11->Address.lpSockaddr); - tor_free(unicast11); - tor_free(unicast12->Address.lpSockaddr); - tor_free(unicast12); - tor_free(unicast21->Address.lpSockaddr); - tor_free(unicast21); - tor_free(sockaddr_to_check); - return; -} -#endif /* defined(HAVE_IP_ADAPTER_TO_SMARTLIST) */ - -#ifdef HAVE_IFCONF_TO_SMARTLIST - -static void -test_address_ifreq_to_smartlist(void *arg) -{ - smartlist_t *results = NULL; - const tor_addr_t *tor_addr = NULL; - struct sockaddr_in *sockaddr = NULL; - struct sockaddr_in *sockaddr_eth1 = NULL; - struct sockaddr_in *sockaddr_to_check = NULL; - - struct ifconf *ifc; - struct ifreq *ifr; - struct ifreq *ifr_next; - - socklen_t addr_len; - - (void)arg; - - sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in)); - - ifr = tor_malloc(sizeof(struct ifreq)); - memset(ifr,0,sizeof(struct ifreq)); - strlcpy(ifr->ifr_name,"lo",3); - sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); - sockaddr_in_from_string("127.0.0.1",sockaddr); - - ifc = tor_malloc(sizeof(struct ifconf)); - memset(ifc,0,sizeof(struct ifconf)); - ifc->ifc_len = sizeof(struct ifreq); - ifc->ifc_ifcu.ifcu_req = ifr; - - results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len); - tt_int_op(smartlist_len(results),OP_EQ,1); - - tor_addr = smartlist_get(results, 0); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); - tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); - - ifr = tor_realloc(ifr,2*sizeof(struct ifreq)); - ifr_next = ifr+1; - strlcpy(ifr_next->ifr_name,"eth1",5); - ifc->ifc_len = 2*sizeof(struct ifreq); - ifc->ifc_ifcu.ifcu_req = ifr; - sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); - - sockaddr_eth1 = (struct sockaddr_in *) &(ifr_next->ifr_ifru.ifru_addr); - sockaddr_in_from_string("192.168.10.55",sockaddr_eth1); - SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); - smartlist_free(results); - - results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len); - tt_int_op(smartlist_len(results),OP_EQ,2); - - tor_addr = smartlist_get(results, 0); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); - tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); - - tor_addr = smartlist_get(results, 1); - addr_len = - tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, - sizeof(struct sockaddr_in)); - - tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in)); - tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check)); - - done: - tor_free(sockaddr_to_check); - SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); - smartlist_free(results); - tor_free(ifc); - tor_free(ifr); - return; -} - -static void -test_address_get_if_addrs_ioctl(void *arg) -{ - - smartlist_t *result = NULL; - - (void)arg; - - result = get_interface_addresses_ioctl(LOG_ERR, AF_INET); - - /* On an IPv6-only system, this will fail and return NULL - tt_assert(result); - */ - - /* Some FreeBSD jails don't have localhost IP address. Instead, they only - * have the address assigned to the jail (whatever that may be). - * And a jail without a network connection might not have any addresses at - * all. */ - if (result) { - tt_assert(!smartlist_contains_null_tor_addr(result)); - - /* If there are addresses, they must be IPv4 or IPv6. - * (AIX supports IPv6 from SIOCGIFCONF.) */ - if (smartlist_len(result) > 0) { - tt_assert(smartlist_contains_ipv4_tor_addr(result) - || smartlist_contains_ipv6_tor_addr(result)); - } - } - - done: - if (result) { - SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); - smartlist_free(result); - } - return; -} - -#endif /* defined(HAVE_IFCONF_TO_SMARTLIST) */ - -#define FAKE_SOCKET_FD (42) - -static tor_socket_t -fake_open_socket(int domain, int type, int protocol) -{ - (void)domain; - (void)type; - (void)protocol; - - return FAKE_SOCKET_FD; -} - -static int -fake_close_socket(tor_socket_t s) -{ - (void)s; - return 0; -} - -static int last_connected_socket_fd = 0; - -static int connect_retval = 0; - -static tor_socket_t -pretend_to_connect(tor_socket_t sock, const struct sockaddr *address, - socklen_t address_len) -{ - (void)address; - (void)address_len; - - last_connected_socket_fd = sock; - - return connect_retval; -} - -static struct sockaddr *mock_addr = NULL; - -static int -fake_getsockname(tor_socket_t sock, struct sockaddr *address, - socklen_t *address_len) -{ - socklen_t bytes_to_copy = 0; - (void) sock; - - if (!mock_addr) - return -1; - - if (mock_addr->sa_family == AF_INET) { - bytes_to_copy = sizeof(struct sockaddr_in); - } else if (mock_addr->sa_family == AF_INET6) { - bytes_to_copy = sizeof(struct sockaddr_in6); - } else { - return -1; - } - - if (*address_len < bytes_to_copy) { - return -1; - } - - memcpy(address,mock_addr,bytes_to_copy); - *address_len = bytes_to_copy; - - return 0; -} - -static void -test_address_udp_socket_trick_whitebox(void *arg) -{ - int hack_retval; - tor_addr_t *addr_from_hack = tor_malloc_zero(sizeof(tor_addr_t)); - struct sockaddr_in6 *mock_addr6; - struct sockaddr_in6 *ipv6_to_check = - tor_malloc_zero(sizeof(struct sockaddr_in6)); - - (void)arg; - - MOCK(tor_open_socket,fake_open_socket); - MOCK(tor_connect_socket,pretend_to_connect); - MOCK(tor_getsockname,fake_getsockname); - MOCK(tor_close_socket,fake_close_socket); - - mock_addr = tor_malloc_zero(sizeof(struct sockaddr_storage)); - sockaddr_in_from_string("23.32.246.118",(struct sockaddr_in *)mock_addr); - - hack_retval = - get_interface_address6_via_udp_socket_hack(LOG_DEBUG, - AF_INET, addr_from_hack); - - tt_int_op(hack_retval,OP_EQ,0); - tt_assert(tor_addr_eq_ipv4h(addr_from_hack, 0x1720f676)); - - /* Now, lets do an IPv6 case. */ - memset(mock_addr,0,sizeof(struct sockaddr_storage)); - - mock_addr6 = (struct sockaddr_in6 *)mock_addr; - mock_addr6->sin6_family = AF_INET6; - mock_addr6->sin6_port = 0; - tor_inet_pton(AF_INET6,"2001:cdba::3257:9652",&(mock_addr6->sin6_addr)); - - hack_retval = - get_interface_address6_via_udp_socket_hack(LOG_DEBUG, - AF_INET6, addr_from_hack); - - tt_int_op(hack_retval,OP_EQ,0); - - tor_addr_to_sockaddr(addr_from_hack,0,(struct sockaddr *)ipv6_to_check, - sizeof(struct sockaddr_in6)); - - tt_assert(sockaddr_in6_are_equal(mock_addr6,ipv6_to_check)); - - done: - UNMOCK(tor_open_socket); - UNMOCK(tor_connect_socket); - UNMOCK(tor_getsockname); - UNMOCK(tor_close_socket); - - tor_free(ipv6_to_check); - tor_free(mock_addr); - tor_free(addr_from_hack); - return; -} - -static void -test_address_udp_socket_trick_blackbox(void *arg) -{ - /* We want get_interface_address6_via_udp_socket_hack() to yield - * the same valid address that get_interface_address6() returns. - * If the latter is unable to find a valid address, we want - * _hack() to fail and return-1. - * - * Furthermore, we want _hack() never to crash, even if - * get_interface_addresses_raw() is returning NULL. - */ - - tor_addr_t addr4; - tor_addr_t addr4_to_check; - tor_addr_t addr6; - tor_addr_t addr6_to_check; - int retval, retval_reference; - - (void)arg; - -#if 0 - retval_reference = get_interface_address6(LOG_DEBUG,AF_INET,&addr4); - retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, - AF_INET, - &addr4_to_check); - - tt_int_op(retval,OP_EQ,retval_reference); - tt_assert( (retval == -1 && retval_reference == -1) || - (tor_addr_compare(&addr4,&addr4_to_check,CMP_EXACT) == 0) ); - - retval_reference = get_interface_address6(LOG_DEBUG,AF_INET6,&addr6); - retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, - AF_INET6, - &addr6_to_check); - - tt_int_op(retval,OP_EQ,retval_reference); - tt_assert( (retval == -1 && retval_reference == -1) || - (tor_addr_compare(&addr6,&addr6_to_check,CMP_EXACT) == 0) ); - -#else /* !(0) */ - /* Both of the blackbox test cases fail horribly if: - * * The host has no external addreses. - * * There are multiple interfaces with either AF_INET or AF_INET6. - * * The last address isn't the one associated with the default route. - * - * The tests SHOULD be re-enabled when #12377 is fixed correctly, but till - * then this fails a lot, in situations we expect failures due to knowing - * about the code being broken. - */ - - (void)addr4_to_check; - (void)addr6_to_check; - (void)addr6; - (void) retval_reference; -#endif /* 0 */ - - /* When family is neither AF_INET nor AF_INET6, we want _hack to - * fail and return -1. - */ - - retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG, - AF_INET+AF_INET6,&addr4); - - tt_int_op(retval, OP_EQ, -1); - - done: - return; -} - -static void -test_address_get_if_addrs_list_internal(void *arg) -{ - smartlist_t *results = NULL; - - (void)arg; - - results = get_interface_address_list(LOG_ERR, 1); - - tt_ptr_op(results, OP_NE, NULL); - /* When the network is down, a system might not have any non-local - * non-multicast addresseses, not even internal ones. - * Unit tests shouldn't fail because of this. */ - tt_int_op(smartlist_len(results),OP_GE,0); - - tt_assert(!smartlist_contains_localhost_tor_addr(results)); - tt_assert(!smartlist_contains_multicast_tor_addr(results)); - /* The list may or may not contain internal addresses */ - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* if there are any addresses, they must be IPv4 */ - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv4_tor_addr(results)); - } - tt_assert(!smartlist_contains_ipv6_tor_addr(results)); - - done: - interface_address_list_free(results); - return; -} - -static void -test_address_get_if_addrs_list_no_internal(void *arg) -{ - smartlist_t *results = NULL; - - (void)arg; - - results = get_interface_address_list(LOG_ERR, 0); - - tt_ptr_op(results, OP_NE, NULL); - /* Work even on systems with only internal IPv4 addresses */ - tt_int_op(smartlist_len(results),OP_GE,0); - - tt_assert(!smartlist_contains_localhost_tor_addr(results)); - tt_assert(!smartlist_contains_multicast_tor_addr(results)); - tt_assert(!smartlist_contains_internal_tor_addr(results)); - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* if there are any addresses, they must be IPv4 */ - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv4_tor_addr(results)); - } - tt_assert(!smartlist_contains_ipv6_tor_addr(results)); - - done: - interface_address_list_free(results); - return; -} - -static void -test_address_get_if_addrs6_list_internal(void *arg) -{ - smartlist_t *results = NULL; - - (void)arg; - - /* We might drop a log_err */ - setup_full_capture_of_logs(LOG_ERR); - results = get_interface_address6_list(LOG_ERR, AF_INET6, 1); - tt_int_op(smartlist_len(mock_saved_logs()), OP_LE, 1); - if (smartlist_len(mock_saved_logs()) == 1) { - expect_log_msg_containing_either4("connect() failed", - "unable to create socket", - "Address that we determined via UDP " - "socket magic is unsuitable for public " - "comms.", - "getsockname() to determine interface " - "failed"); - } - teardown_capture_of_logs(); - - tt_ptr_op(results, OP_NE, NULL); - /* Work even on systems without IPv6 interfaces */ - tt_int_op(smartlist_len(results),OP_GE,0); - - tt_assert(!smartlist_contains_localhost_tor_addr(results)); - tt_assert(!smartlist_contains_multicast_tor_addr(results)); - /* The list may or may not contain internal addresses */ - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* if there are any addresses, they must be IPv6 */ - tt_assert(!smartlist_contains_ipv4_tor_addr(results)); - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv6_tor_addr(results)); - } - - done: - interface_address6_list_free(results); - teardown_capture_of_logs(); - return; -} - -static void -test_address_get_if_addrs6_list_no_internal(void *arg) -{ - smartlist_t *results = NULL; - - (void)arg; - - /* We might drop a log_err */ - setup_full_capture_of_logs(LOG_ERR); - results = get_interface_address6_list(LOG_ERR, AF_INET6, 0); - tt_int_op(smartlist_len(mock_saved_logs()), OP_LE, 1); - if (smartlist_len(mock_saved_logs()) == 1) { - expect_log_msg_containing_either4("connect() failed", - "unable to create socket", - "Address that we determined via UDP " - "socket magic is unsuitable for public " - "comms.", - "getsockname() to determine interface " - "failed"); - } - teardown_capture_of_logs(); - - tt_ptr_op(results, OP_NE, NULL); - /* Work even on systems without IPv6 interfaces */ - tt_int_op(smartlist_len(results),OP_GE,0); - - tt_assert(!smartlist_contains_localhost_tor_addr(results)); - tt_assert(!smartlist_contains_multicast_tor_addr(results)); - tt_assert(!smartlist_contains_internal_tor_addr(results)); - tt_assert(!smartlist_contains_null_tor_addr(results)); - - /* if there are any addresses, they must be IPv6 */ - tt_assert(!smartlist_contains_ipv4_tor_addr(results)); - if (smartlist_len(results) > 0) { - tt_assert(smartlist_contains_ipv6_tor_addr(results)); - } - - done: - teardown_capture_of_logs(); - interface_address6_list_free(results); - return; -} - -static int called_get_interface_addresses_raw = 0; - -static smartlist_t * -mock_get_interface_addresses_raw_fail(int severity, sa_family_t family) -{ - (void)severity; - (void)family; - - called_get_interface_addresses_raw++; - return smartlist_new(); -} - -static int called_get_interface_address6_via_udp_socket_hack = 0; - -static int -mock_get_interface_address6_via_udp_socket_hack_fail(int severity, - sa_family_t family, - tor_addr_t *addr) -{ - (void)severity; - (void)family; - (void)addr; - - called_get_interface_address6_via_udp_socket_hack++; - return -1; -} - -static void -test_address_get_if_addrs_internal_fail(void *arg) -{ - smartlist_t *results1 = NULL, *results2 = NULL; - int rv = 0; - uint32_t ipv4h_addr = 0; - tor_addr_t ipv6_addr; - - memset(&ipv6_addr, 0, sizeof(tor_addr_t)); - - (void)arg; - - MOCK(get_interface_addresses_raw, - mock_get_interface_addresses_raw_fail); - MOCK(get_interface_address6_via_udp_socket_hack, - mock_get_interface_address6_via_udp_socket_hack_fail); - - results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 1); - tt_ptr_op(results1, OP_NE, NULL); - tt_int_op(smartlist_len(results1),OP_EQ,0); - - results2 = get_interface_address_list(LOG_ERR, 1); - tt_ptr_op(results2, OP_NE, NULL); - tt_int_op(smartlist_len(results2),OP_EQ,0); - - rv = get_interface_address6(LOG_ERR, AF_INET6, &ipv6_addr); - tt_int_op(rv, OP_EQ, -1); - - rv = get_interface_address(LOG_ERR, &ipv4h_addr); - tt_int_op(rv, OP_EQ, -1); - - done: - UNMOCK(get_interface_addresses_raw); - UNMOCK(get_interface_address6_via_udp_socket_hack); - interface_address6_list_free(results1); - interface_address6_list_free(results2); - return; -} - -static void -test_address_get_if_addrs_no_internal_fail(void *arg) -{ - smartlist_t *results1 = NULL, *results2 = NULL; - - (void)arg; - - MOCK(get_interface_addresses_raw, - mock_get_interface_addresses_raw_fail); - MOCK(get_interface_address6_via_udp_socket_hack, - mock_get_interface_address6_via_udp_socket_hack_fail); - - results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 0); - tt_ptr_op(results1, OP_NE, NULL); - tt_int_op(smartlist_len(results1),OP_EQ,0); - - results2 = get_interface_address_list(LOG_ERR, 0); - tt_ptr_op(results2, OP_NE, NULL); - tt_int_op(smartlist_len(results2),OP_EQ,0); - - done: - UNMOCK(get_interface_addresses_raw); - UNMOCK(get_interface_address6_via_udp_socket_hack); - interface_address6_list_free(results1); - interface_address6_list_free(results2); - return; -} - -static void -test_address_get_if_addrs(void *arg) -{ - int rv; - uint32_t addr_h = 0; - tor_addr_t tor_addr; - - (void)arg; - - rv = get_interface_address(LOG_ERR, &addr_h); - - /* When the network is down, a system might not have any non-local - * non-multicast IPv4 addresses, not even internal ones. - * Unit tests shouldn't fail because of this. */ - if (rv == 0) { - tor_addr_from_ipv4h(&tor_addr, addr_h); - - tt_assert(!tor_addr_is_loopback(&tor_addr)); - tt_assert(!tor_addr_is_multicast(&tor_addr)); - /* The address may or may not be an internal address */ - - tt_assert(tor_addr_is_v4(&tor_addr)); - } - - done: - return; -} - -static void -test_address_get_if_addrs6(void *arg) -{ - int rv; - tor_addr_t tor_addr; - - (void)arg; - - rv = get_interface_address6(LOG_ERR, AF_INET6, &tor_addr); - - /* Work even on systems without IPv6 interfaces */ - if (rv == 0) { - tt_assert(!tor_addr_is_loopback(&tor_addr)); - tt_assert(!tor_addr_is_multicast(&tor_addr)); - /* The address may or may not be an internal address */ - - tt_assert(!tor_addr_is_v4(&tor_addr)); - } - - done: - return; -} - -static void -test_address_tor_addr_to_in6(void *ignored) -{ - (void)ignored; - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - const struct in6_addr *res; - uint8_t expected[16] = {42, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15}; - - a->family = AF_INET; - res = tor_addr_to_in6(a); - tt_assert(!res); - - a->family = AF_INET6; - memcpy(a->addr.in6_addr.s6_addr, expected, 16); - res = tor_addr_to_in6(a); - tt_assert(res); - tt_mem_op(res->s6_addr, OP_EQ, expected, 16); - - done: - tor_free(a); -} - -static void -test_address_tor_addr_to_in(void *ignored) -{ - (void)ignored; - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - const struct in_addr *res; - - a->family = AF_INET6; - res = tor_addr_to_in(a); - tt_assert(!res); - - a->family = AF_INET; - a->addr.in_addr.s_addr = 44; - res = tor_addr_to_in(a); - tt_assert(res); - tt_int_op(res->s_addr, OP_EQ, 44); - - done: - tor_free(a); -} - -static void -test_address_tor_addr_to_ipv4n(void *ignored) -{ - (void)ignored; - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - uint32_t res; - - a->family = AF_INET6; - res = tor_addr_to_ipv4n(a); - tt_assert(!res); - - a->family = AF_INET; - a->addr.in_addr.s_addr = 43; - res = tor_addr_to_ipv4n(a); - tt_assert(res); - tt_int_op(res, OP_EQ, 43); - - done: - tor_free(a); -} - -static void -test_address_tor_addr_to_mapped_ipv4h(void *ignored) -{ - (void)ignored; - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - uint32_t res; - uint8_t toset[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 42}; - - a->family = AF_INET; - res = tor_addr_to_mapped_ipv4h(a); - tt_assert(!res); - - a->family = AF_INET6; - - memcpy(a->addr.in6_addr.s6_addr, toset, 16); - res = tor_addr_to_mapped_ipv4h(a); - tt_assert(res); - tt_int_op(res, OP_EQ, 42); - - done: - tor_free(a); -} - -static void -test_address_tor_addr_eq_ipv4h(void *ignored) -{ - (void)ignored; - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - int res; - - a->family = AF_INET6; - res = tor_addr_eq_ipv4h(a, 42); - tt_assert(!res); - - a->family = AF_INET; - a->addr.in_addr.s_addr = 52; - res = tor_addr_eq_ipv4h(a, 42); - tt_assert(!res); - - a->addr.in_addr.s_addr = 52; - res = tor_addr_eq_ipv4h(a, ntohl(52)); - tt_assert(res); - - done: - tor_free(a); -} - -#define ADDRESS_TEST(name, flags) \ - { #name, test_address_ ## name, flags, NULL, NULL } - -struct testcase_t address_tests[] = { - ADDRESS_TEST(udp_socket_trick_whitebox, TT_FORK), - ADDRESS_TEST(udp_socket_trick_blackbox, TT_FORK), - ADDRESS_TEST(get_if_addrs_list_internal, 0), - ADDRESS_TEST(get_if_addrs_list_no_internal, 0), - ADDRESS_TEST(get_if_addrs6_list_internal, 0), - ADDRESS_TEST(get_if_addrs6_list_no_internal, TT_FORK), - ADDRESS_TEST(get_if_addrs_internal_fail, 0), - ADDRESS_TEST(get_if_addrs_no_internal_fail, 0), - ADDRESS_TEST(get_if_addrs, 0), - ADDRESS_TEST(get_if_addrs6, 0), -#ifdef HAVE_IFADDRS_TO_SMARTLIST - ADDRESS_TEST(get_if_addrs_ifaddrs, TT_FORK), - ADDRESS_TEST(ifaddrs_to_smartlist, 0), -#endif -#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST - ADDRESS_TEST(get_if_addrs_win32, TT_FORK), - ADDRESS_TEST(ip_adapter_addresses_to_smartlist, 0), -#endif -#ifdef HAVE_IFCONF_TO_SMARTLIST - ADDRESS_TEST(get_if_addrs_ioctl, TT_FORK), - ADDRESS_TEST(ifreq_to_smartlist, 0), -#endif - ADDRESS_TEST(tor_addr_to_in6, 0), - ADDRESS_TEST(tor_addr_to_in, 0), - ADDRESS_TEST(tor_addr_to_ipv4n, 0), - ADDRESS_TEST(tor_addr_to_mapped_ipv4h, 0), - ADDRESS_TEST(tor_addr_eq_ipv4h, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_bt.sh b/src/tor/src/test/test_bt.sh deleted file mode 100644 index 312905a4e..000000000 --- a/src/tor/src/test/test_bt.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# Test backtrace functionality. - -exitcode=0 - -export ASAN_OPTIONS="handle_segv=0:allow_user_segv_handler=1" -"${builddir:-.}/src/test/test-bt-cl" backtraces || exit $? -"${builddir:-.}/src/test/test-bt-cl" assert 2>&1 | "${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/bt_test.py" || exitcode="$?" -"${builddir:-.}/src/test/test-bt-cl" crash 2>&1 | "${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/bt_test.py" || exitcode="$?" - -"${builddir:-.}/src/test/test-bt-cl" none || exitcode="$?" - -exit ${exitcode} diff --git a/src/tor/src/test/test_bt_cl.c b/src/tor/src/test/test_bt_cl.c deleted file mode 100644 index b5c8d7cf9..000000000 --- a/src/tor/src/test/test_bt_cl.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include -#include - -/* To prevent 'assert' from going away. */ -#undef TOR_COVERAGE -#include "or.h" -#include "util.h" -#include "backtrace.h" -#include "torlog.h" - -/* -1: no crash. - * 0: crash with a segmentation fault. - * 1x: crash with an assertion failure. */ -static int crashtype = 0; - -#ifdef __GNUC__ -#define NOINLINE __attribute__((noinline)) -#endif - -int crash(int x) NOINLINE; -int oh_what(int x) NOINLINE; -int a_tangled_web(int x) NOINLINE; -int we_weave(int x) NOINLINE; - -#ifdef HAVE_CFLAG_WNULL_DEREFERENCE -DISABLE_GCC_WARNING(null-dereference) -#endif -int -crash(int x) -{ - if (crashtype == 0) { -#if defined(__clang_analyzer__) || defined(__COVERITY__) - tor_assert(1 == 0); /* Avert your eyes, clangalyzer and coverity! You - * don't need to see us dereference NULL. */ -#else - *(volatile int *)0 = 0; -#endif /* defined(__clang_analyzer__) || defined(__COVERITY__) */ - } else if (crashtype == 1) { - tor_assert(1 == 0); - } else if (crashtype == -1) { - ; - } - - crashtype *= x; - return crashtype; -} -#ifdef HAVE_CFLAG_WNULL_DEREFERENCE -ENABLE_GCC_WARNING(null-dereference) -#endif - -int -oh_what(int x) -{ - /* We call crash() twice here, so that the compiler won't try to do a - * tail-call optimization. Only the first call will actually happen, but - * telling the compiler to maybe do the second call will prevent it from - * replacing the first call with a jump. */ - return crash(x) + crash(x*2); -} - -int -a_tangled_web(int x) -{ - return oh_what(x) * 99 + oh_what(x); -} - -int -we_weave(int x) -{ - return a_tangled_web(x) + a_tangled_web(x+1); -} - -int -main(int argc, char **argv) -{ - log_severity_list_t severity; - - if (argc < 2) { - puts("I take an argument. It should be \"assert\" or \"crash\" or " - "\"backtraces\" or \"none\""); - return 1; - } - -#if !(defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ - defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)) - puts("Backtrace reporting is not supported on this platform"); - return 77; -#endif - - if (!strcmp(argv[1], "assert")) { - crashtype = 1; - } else if (!strcmp(argv[1], "crash")) { - crashtype = 0; - } else if (!strcmp(argv[1], "none")) { - crashtype = -1; - } else if (!strcmp(argv[1], "backtraces")) { - return 0; - } else { - puts("Argument should be \"assert\" or \"crash\" or \"none\""); - return 1; - } - - init_logging(1); - set_log_severity_config(LOG_WARN, LOG_ERR, &severity); - add_stream_log(&severity, "stdout", STDOUT_FILENO); - tor_log_update_sigsafe_err_fds(); - - configure_backtrace_handler(NULL); - - printf("%d\n", we_weave(2)); - - clean_up_backtrace_handler(); - logs_free_all(); - - return 0; -} - diff --git a/src/tor/src/test/test_buffers.c b/src/tor/src/test/test_buffers.c deleted file mode 100644 index 057d9fa2d..000000000 --- a/src/tor/src/test/test_buffers.c +++ /dev/null @@ -1,821 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define BUFFERS_PRIVATE -#define PROTO_HTTP_PRIVATE -#include "or.h" -#include "buffers.h" -#include "buffers_tls.h" -#include "proto_http.h" -#include "proto_socks.h" -#include "test.h" - -/** Run unit tests for buffers.c */ -static void -test_buffers_basic(void *arg) -{ - char str[256]; - char str2[256]; - - buf_t *buf = NULL, *buf2 = NULL; - const char *cp; - - int j; - size_t r; - (void) arg; - - /**** - * buf_new - ****/ - if (!(buf = buf_new())) - TT_DIE(("Assertion failed.")); - - //test_eq(buf_capacity(buf), 4096); - tt_int_op(buf_datalen(buf),OP_EQ, 0); - - /**** - * General pointer frobbing - */ - for (j=0;j<256;++j) { - str[j] = (char)j; - } - buf_add(buf, str, 256); - buf_add(buf, str, 256); - tt_int_op(buf_datalen(buf),OP_EQ, 512); - buf_get_bytes(buf, str2, 200); - tt_mem_op(str,OP_EQ, str2, 200); - tt_int_op(buf_datalen(buf),OP_EQ, 312); - memset(str2, 0, sizeof(str2)); - - buf_get_bytes(buf, str2, 256); - tt_mem_op(str+200,OP_EQ, str2, 56); - tt_mem_op(str,OP_EQ, str2+56, 200); - tt_int_op(buf_datalen(buf),OP_EQ, 56); - memset(str2, 0, sizeof(str2)); - /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add - * another 3584 bytes, we hit the end. */ - for (j=0;j<15;++j) { - buf_add(buf, str, 256); - } - buf_assert_ok(buf); - tt_int_op(buf_datalen(buf),OP_EQ, 3896); - buf_get_bytes(buf, str2, 56); - tt_int_op(buf_datalen(buf),OP_EQ, 3840); - tt_mem_op(str+200,OP_EQ, str2, 56); - for (j=0;j<15;++j) { - memset(str2, 0, sizeof(str2)); - buf_get_bytes(buf, str2, 256); - tt_mem_op(str,OP_EQ, str2, 256); - } - tt_int_op(buf_datalen(buf),OP_EQ, 0); - buf_free(buf); - buf = NULL; - - /* Okay, now make sure growing can work. */ - buf = buf_new_with_capacity(16); - //test_eq(buf_capacity(buf), 16); - buf_add(buf, str+1, 255); - //test_eq(buf_capacity(buf), 256); - buf_get_bytes(buf, str2, 254); - tt_mem_op(str+1,OP_EQ, str2, 254); - //test_eq(buf_capacity(buf), 256); - buf_assert_ok(buf); - buf_add(buf, str, 32); - //test_eq(buf_capacity(buf), 256); - buf_assert_ok(buf); - buf_add(buf, str, 256); - buf_assert_ok(buf); - //test_eq(buf_capacity(buf), 512); - tt_int_op(buf_datalen(buf),OP_EQ, 33+256); - buf_get_bytes(buf, str2, 33); - tt_int_op(*str2,OP_EQ, str[255]); - - tt_mem_op(str2+1,OP_EQ, str, 32); - //test_eq(buf_capacity(buf), 512); - tt_int_op(buf_datalen(buf),OP_EQ, 256); - buf_get_bytes(buf, str2, 256); - tt_mem_op(str,OP_EQ, str2, 256); - - /* now try shrinking: case 1. */ - buf_free(buf); - buf = buf_new_with_capacity(33668); - for (j=0;j<67;++j) { - buf_add(buf, str,255); - } - //test_eq(buf_capacity(buf), 33668); - tt_int_op(buf_datalen(buf),OP_EQ, 17085); - for (j=0; j < 40; ++j) { - buf_get_bytes(buf, str2, 255); - tt_mem_op(str2,OP_EQ, str, 255); - } - - /* now try shrinking: case 2. */ - buf_free(buf); - buf = buf_new_with_capacity(33668); - for (j=0;j<67;++j) { - buf_add(buf, str, 255); - } - for (j=0; j < 20; ++j) { - buf_get_bytes(buf, str2, 255); - tt_mem_op(str2,OP_EQ, str, 255); - } - for (j=0;j<80;++j) { - buf_add(buf, str, 255); - } - //test_eq(buf_capacity(buf),33668); - for (j=0; j < 120; ++j) { - buf_get_bytes(buf, str2, 255); - tt_mem_op(str2,OP_EQ, str, 255); - } - - /* Move from buf to buf. */ - buf_free(buf); - buf = buf_new_with_capacity(4096); - buf2 = buf_new_with_capacity(4096); - for (j=0;j<100;++j) - buf_add(buf, str, 255); - tt_int_op(buf_datalen(buf),OP_EQ, 25500); - for (j=0;j<100;++j) { - r = 10; - buf_move_to_buf(buf2, buf, &r); - tt_int_op(r,OP_EQ, 0); - } - tt_int_op(buf_datalen(buf),OP_EQ, 24500); - tt_int_op(buf_datalen(buf2),OP_EQ, 1000); - for (j=0;j<3;++j) { - buf_get_bytes(buf2, str2, 255); - tt_mem_op(str2,OP_EQ, str, 255); - } - r = 8192; /*big move*/ - buf_move_to_buf(buf2, buf, &r); - tt_int_op(r,OP_EQ, 0); - r = 30000; /* incomplete move */ - buf_move_to_buf(buf2, buf, &r); - tt_int_op(r,OP_EQ, 13692); - for (j=0;j<97;++j) { - buf_get_bytes(buf2, str2, 255); - tt_mem_op(str2,OP_EQ, str, 255); - } - buf_free(buf); - buf_free(buf2); - buf = buf2 = NULL; - - buf = buf_new_with_capacity(5); - cp = "Testing. This is a moderately long Testing string."; - for (j = 0; cp[j]; j++) - buf_add(buf, cp+j, 1); - tt_int_op(0,OP_EQ, buf_find_string_offset(buf, "Testing", 7)); - tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "esting", 6)); - tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "est", 3)); - tt_int_op(39,OP_EQ, buf_find_string_offset(buf, "ing str", 7)); - tt_int_op(35,OP_EQ, buf_find_string_offset(buf, "Testing str", 11)); - tt_int_op(32,OP_EQ, buf_find_string_offset(buf, "ng ", 3)); - tt_int_op(43,OP_EQ, buf_find_string_offset(buf, "string.", 7)); - tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "shrdlu", 6)); - tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "Testing thing", 13)); - tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "ngx", 3)); - buf_free(buf); - buf = NULL; - - /* Try adding a string too long for any freelist. */ - { - char *mem = tor_malloc_zero(65536); - buf = buf_new(); - buf_add(buf, mem, 65536); - tor_free(mem); - - tt_int_op(buf_datalen(buf), OP_EQ, 65536); - buf_free(buf); - buf = NULL; - } - - done: - if (buf) - buf_free(buf); - if (buf2) - buf_free(buf2); -} - -static void -test_buffer_pullup(void *arg) -{ - buf_t *buf; - char *stuff, *tmp; - const char *cp; - size_t sz; - (void)arg; - stuff = tor_malloc(16384); - tmp = tor_malloc(16384); - - buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ - - tt_assert(buf); - tt_int_op(buf_get_default_chunk_size(buf), OP_EQ, 4096); - - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - /* There are a bunch of cases for pullup. One is the trivial case. Let's - mess around with an empty buffer. */ - buf_pullup(buf, 16, &cp, &sz); - tt_ptr_op(cp, OP_EQ, NULL); - tt_uint_op(sz, OP_EQ, 0); - - /* Let's make sure nothing got allocated */ - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - /* Case 1: everything puts into the first chunk with some moving. */ - - /* Let's add some data. */ - crypto_rand(stuff, 16384); - buf_add(buf, stuff, 3000); - buf_add(buf, stuff+3000, 3000); - buf_pullup(buf, 0, &cp, &sz); - tt_ptr_op(cp, OP_NE, NULL); - tt_int_op(sz, OP_LE, 4096); - - /* Make room for 3000 bytes in the first chunk, so that the pullup-move code - * can get tested. */ - tt_int_op(buf_get_bytes(buf, tmp, 3000), OP_EQ, 3000); - tt_mem_op(tmp,OP_EQ, stuff, 3000); - buf_pullup(buf, 2048, &cp, &sz); - buf_assert_ok(buf); - tt_ptr_op(cp, OP_NE, NULL); - tt_int_op(sz, OP_GE, 2048); - tt_mem_op(cp,OP_EQ, stuff+3000, 2048); - tt_int_op(3000, OP_EQ, buf_datalen(buf)); - tt_int_op(buf_get_bytes(buf, tmp, 3000), OP_EQ, 0); - tt_mem_op(tmp,OP_EQ, stuff+3000, 2048); - - buf_free(buf); - - /* Now try the large-chunk case. */ - buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ - buf_add(buf, stuff, 4000); - buf_add(buf, stuff+4000, 4000); - buf_add(buf, stuff+8000, 4000); - buf_add(buf, stuff+12000, 4000); - tt_int_op(buf_datalen(buf), OP_EQ, 16000); - buf_pullup(buf, 0, &cp, &sz); - tt_ptr_op(cp, OP_NE, NULL); - tt_int_op(sz, OP_LE, 4096); - - buf_pullup(buf, 12500, &cp, &sz); - buf_assert_ok(buf); - tt_ptr_op(cp, OP_NE, NULL); - tt_int_op(sz, OP_GE, 12500); - tt_mem_op(cp,OP_EQ, stuff, 12500); - tt_int_op(buf_datalen(buf), OP_EQ, 16000); - - buf_get_bytes(buf, tmp, 12400); - tt_mem_op(tmp,OP_EQ, stuff, 12400); - tt_int_op(buf_datalen(buf), OP_EQ, 3600); - buf_get_bytes(buf, tmp, 3500); - tt_mem_op(tmp,OP_EQ, stuff+12400, 3500); - buf_get_bytes(buf, tmp, 100); - tt_mem_op(tmp,OP_EQ, stuff+15900, 10); - - buf_free(buf); - - /* Make sure that the pull-up-whole-buffer case works */ - buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ - buf_add(buf, stuff, 4000); - buf_add(buf, stuff+4000, 4000); - buf_get_bytes(buf, tmp, 100); /* dump 100 bytes from first chunk */ - buf_pullup(buf, 16000, &cp, &sz); - buf_assert_ok(buf); - tt_ptr_op(cp, OP_NE, NULL); - tt_int_op(sz, OP_EQ, 7900); - tt_mem_op(cp,OP_EQ, stuff+100, 7900); - - buf_free(buf); - buf = NULL; - - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - done: - buf_free(buf); - tor_free(stuff); - tor_free(tmp); -} - -static void -test_buffer_copy(void *arg) -{ - buf_t *buf=NULL, *buf2=NULL; - const char *s; - size_t len; - char b[256]; - int i; - (void)arg; - - buf = buf_new(); - tt_assert(buf); - - /* Copy an empty buffer. */ - tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); - tt_assert(buf2); - tt_int_op(0, OP_EQ, buf_datalen(buf2)); - - /* Now try with a short buffer. */ - s = "And now comes an act of enormous enormance!"; - len = strlen(s); - buf_add(buf, s, len); - tt_int_op(len, OP_EQ, buf_datalen(buf)); - /* Add junk to buf2 so we can test replacing.*/ - buf_add(buf2, "BLARG", 5); - tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); - tt_int_op(len, OP_EQ, buf_datalen(buf2)); - buf_get_bytes(buf2, b, len); - tt_mem_op(b, OP_EQ, s, len); - /* Now free buf2 and retry so we can test allocating */ - buf_free(buf2); - buf2 = NULL; - tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); - tt_int_op(len, OP_EQ, buf_datalen(buf2)); - buf_get_bytes(buf2, b, len); - tt_mem_op(b, OP_EQ, s, len); - /* Clear buf for next test */ - buf_get_bytes(buf, b, len); - tt_int_op(buf_datalen(buf),OP_EQ,0); - - /* Okay, now let's try a bigger buffer. */ - s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit " - "esse quam nihil molestiae consequatur, vel illum qui dolorem eum " - "fugiat quo voluptas nulla pariatur?"; - len = strlen(s); - for (i = 0; i < 256; ++i) { - b[0]=i; - buf_add(buf, b, 1); - buf_add(buf, s, len); - } - tt_int_op(0, OP_EQ, buf_set_to_copy(&buf2, buf)); - tt_int_op(buf_datalen(buf2), OP_EQ, buf_datalen(buf)); - for (i = 0; i < 256; ++i) { - buf_get_bytes(buf2, b, len+1); - tt_int_op((unsigned char)b[0],OP_EQ,i); - tt_mem_op(b+1, OP_EQ, s, len); - } - - done: - if (buf) - buf_free(buf); - if (buf2) - buf_free(buf2); -} - -static void -test_buffer_allocation_tracking(void *arg) -{ - char *junk = tor_malloc(16384); - buf_t *buf1 = NULL, *buf2 = NULL; - int i; - - (void)arg; - - crypto_rand(junk, 16384); - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - buf1 = buf_new(); - tt_assert(buf1); - buf2 = buf_new(); - tt_assert(buf2); - - tt_int_op(buf_allocation(buf1), OP_EQ, 0); - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - buf_add(buf1, junk, 4000); - buf_add(buf1, junk, 4000); - buf_add(buf1, junk, 4000); - buf_add(buf1, junk, 4000); - tt_int_op(buf_allocation(buf1), OP_EQ, 16384); - buf_get_bytes(buf1, junk, 100); - tt_int_op(buf_allocation(buf1), OP_EQ, 16384); /* still 4 4k chunks */ - - tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); - - buf_get_bytes(buf1, junk, 4096); /* drop a 1k chunk... */ - tt_int_op(buf_allocation(buf1), OP_EQ, 3*4096); /* now 3 4k chunks */ - - tt_int_op(buf_get_total_allocation(), OP_EQ, 12288); /* that chunk was really - freed. */ - - buf_add(buf2, junk, 4000); - tt_int_op(buf_allocation(buf2), OP_EQ, 4096); /* another 4k chunk. */ - /* - * We bounce back up to 16384 by allocating a new chunk. - */ - tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); - buf_add(buf2, junk, 4000); - tt_int_op(buf_allocation(buf2), OP_EQ, 8192); /* another 4k chunk. */ - tt_int_op(buf_get_total_allocation(), - OP_EQ, 5*4096); /* that chunk was new. */ - - /* Make a really huge buffer */ - for (i = 0; i < 1000; ++i) { - buf_add(buf2, junk, 4000); - } - tt_int_op(buf_allocation(buf2), OP_GE, 4008000); - tt_int_op(buf_get_total_allocation(), OP_GE, 4008000); - buf_free(buf2); - buf2 = NULL; - - tt_int_op(buf_get_total_allocation(), OP_LT, 4008000); - tt_int_op(buf_get_total_allocation(), OP_EQ, buf_allocation(buf1)); - buf_free(buf1); - buf1 = NULL; - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - done: - buf_free(buf1); - buf_free(buf2); - tor_free(junk); -} - -static void -test_buffer_time_tracking(void *arg) -{ - buf_t *buf=NULL, *buf2=NULL; - const time_t START = 1389288246; - const uint64_t START_NSEC = ((uint64_t)START) * 1000000000; - int i; - char tmp[4096]; - (void)arg; - - crypto_rand(tmp, sizeof(tmp)); - - monotime_enable_test_mocking(); - - buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ - tt_assert(buf); - - monotime_coarse_set_mock_time_nsec(START_NSEC); - const uint32_t START_TS = monotime_coarse_get_stamp(); - - /* Empty buffer means the timestamp is 0. */ - tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS)); - tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+1000)); - - buf_add(buf, "ABCDEFG", 7); - tt_int_op(1000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+1000)); - - buf2 = buf_copy(buf); - tt_assert(buf2); - tt_int_op(1234, OP_EQ, - buf_get_oldest_chunk_timestamp(buf2, START_TS+1234)); - - /* Now add more bytes; enough to overflow the first chunk. */ - monotime_coarse_set_mock_time_nsec(START_NSEC + 123 * (uint64_t)1000000); - const uint32_t TS2 = monotime_coarse_get_stamp(); - for (i = 0; i < 600; ++i) - buf_add(buf, "ABCDEFG", 7); - tt_int_op(4207, OP_EQ, buf_datalen(buf)); - - /* The oldest bytes are still in the front. */ - tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+2000)); - - /* Once those bytes are dropped, the chunk is still on the first - * timestamp. */ - buf_get_bytes(buf, tmp, 100); - tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_TS+2000)); - - /* But once we discard the whole first chunk, we get the data in the second - * chunk. */ - buf_get_bytes(buf, tmp, 4000); - tt_int_op(107, OP_EQ, buf_datalen(buf)); - tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS2+2000)); - - /* This time we'll be grabbing a chunk from the freelist, and making sure - its time gets updated */ - monotime_coarse_set_mock_time_nsec(START_NSEC + 5617 * (uint64_t)1000000); - const uint32_t TS3 = monotime_coarse_get_stamp(); - for (i = 0; i < 600; ++i) - buf_add(buf, "ABCDEFG", 7); - tt_int_op(4307, OP_EQ, buf_datalen(buf)); - - tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS2+2000)); - buf_get_bytes(buf, tmp, 4000); - buf_get_bytes(buf, tmp, 306); - tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS3)); - tt_int_op(383, OP_EQ, buf_get_oldest_chunk_timestamp(buf, TS3+383)); - - done: - buf_free(buf); - buf_free(buf2); - monotime_disable_test_mocking(); -} - -static void -test_buffers_compress_fin_at_chunk_end_impl(compress_method_t method, - compression_level_t level) -{ - char *msg = NULL; - char *contents = NULL; - char *expanded = NULL; - buf_t *buf = NULL; - tor_compress_state_t *compress_state = NULL; - size_t out_len, in_len; - size_t sz, headerjunk; - - buf = buf_new_with_capacity(128); /* will round up */ - sz = buf_get_default_chunk_size(buf); - msg = tor_malloc_zero(sz); - - buf_add(buf, msg, 1); - tt_assert(buf->head); - - /* Fill up the chunk so the compression stuff won't fit in one chunk. */ - tt_uint_op(buf->head->memlen, OP_LT, sz); - headerjunk = buf->head->memlen - 7; - buf_add(buf, msg, headerjunk-1); - tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); - tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); - /* Write an empty string, with finalization on. */ - compress_state = tor_compress_new(1, method, level); - tt_int_op(buf_add_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); - - in_len = buf_datalen(buf); - contents = tor_malloc(in_len); - - tt_int_op(buf_get_bytes(buf, contents, in_len), OP_EQ, 0); - - if (method == NO_METHOD) { - tt_uint_op(in_len, OP_EQ, headerjunk); - } else { - tt_uint_op(in_len, OP_GT, headerjunk); - } - - tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, - contents + headerjunk, - in_len - headerjunk, - method, 1, - LOG_WARN)); - - tt_int_op(out_len, OP_EQ, 0); - tt_assert(expanded); - - done: - buf_free(buf); - tor_compress_free(compress_state); - tor_free(contents); - tor_free(expanded); - tor_free(msg); -} - -static void -test_buffers_compress_impl(compress_method_t method, - compression_level_t level, - int finalize_with_nil) -{ - char *msg = NULL; - char *contents = NULL; - char *expanded = NULL; - buf_t *buf = NULL; - tor_compress_state_t *compress_state = NULL; - size_t out_len, in_len; - int done; - - buf = buf_new_with_capacity(128); /* will round up */ - compress_state = tor_compress_new(1, method, level); - - msg = tor_malloc(512); - crypto_rand(msg, 512); - tt_int_op(buf_add_compress(buf, compress_state, - msg, 128, 0), OP_EQ, 0); - tt_int_op(buf_add_compress(buf, compress_state, - msg+128, 128, 0), OP_EQ, 0); - tt_int_op(buf_add_compress(buf, compress_state, - msg+256, 256, 0), OP_EQ, 0); - done = !finalize_with_nil; - tt_int_op(buf_add_compress(buf, compress_state, - "all done", 9, done), OP_EQ, 0); - if (finalize_with_nil) { - tt_int_op(buf_add_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); - } - - in_len = buf_datalen(buf); - contents = tor_malloc(in_len); - - tt_int_op(buf_get_bytes(buf, contents, in_len), OP_EQ, 0); - - tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, - contents, in_len, - method, 1, - LOG_WARN)); - - tt_int_op(out_len, OP_GE, 128); - tt_mem_op(msg, OP_EQ, expanded, 128); - tt_int_op(out_len, OP_GE, 512); - tt_mem_op(msg, OP_EQ, expanded, 512); - tt_int_op(out_len, OP_EQ, 512+9); - tt_mem_op("all done", OP_EQ, expanded+512, 9); - - done: - buf_free(buf); - tor_compress_free(compress_state); - tor_free(contents); - tor_free(expanded); - tor_free(msg); -} - -static void -test_buffers_compress(void *arg) -{ - const char *methodname = arg; - tt_assert(methodname); - - compress_method_t method = compression_method_get_by_name(methodname); - tt_int_op(method, OP_NE, UNKNOWN_METHOD); - - if (! tor_compress_supports_method(method)) { - tt_skip(); - } - - compression_level_t levels[] = { - BEST_COMPRESSION, - HIGH_COMPRESSION, - MEDIUM_COMPRESSION, - LOW_COMPRESSION - }; - - for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { - compression_level_t level = levels[l]; - - test_buffers_compress_impl(method, level, 0); - test_buffers_compress_impl(method, level, 1); - test_buffers_compress_fin_at_chunk_end_impl(method, level); - } - - done: - ; -} - -static const uint8_t *tls_read_ptr; -static int n_remaining; -static int next_reply_val[16]; - -static int -mock_tls_read(tor_tls_t *tls, char *cp, size_t len) -{ - (void)tls; - int rv = next_reply_val[0]; - if (rv > 0) { - int max = rv > (int)len ? (int)len : rv; - if (max > n_remaining) - max = n_remaining; - memcpy(cp, tls_read_ptr, max); - rv = max; - n_remaining -= max; - tls_read_ptr += max; - } - - memmove(next_reply_val, next_reply_val + 1, 15*sizeof(int)); - return rv; -} - -static void -test_buffers_tls_read_mocked(void *arg) -{ - uint8_t *mem; - buf_t *buf; - (void)arg; - - mem = tor_malloc(64*1024); - crypto_rand((char*)mem, 64*1024); - tls_read_ptr = mem; - n_remaining = 64*1024; - - MOCK(tor_tls_read, mock_tls_read); - - buf = buf_new(); - - next_reply_val[0] = 1024; - tt_int_op(128, OP_EQ, buf_read_from_tls(buf, NULL, 128)); - - next_reply_val[0] = 5000; - next_reply_val[1] = 5000; - tt_int_op(6000, OP_EQ, buf_read_from_tls(buf, NULL, 6000)); - - done: - UNMOCK(tor_tls_read); - tor_free(mem); - buf_free(buf); -} - -static void -test_buffers_chunk_size(void *arg) -{ - (void)arg; - const int min = 256; - const int max = 65536; - tt_uint_op(buf_preferred_chunk_size(3), OP_EQ, min); - tt_uint_op(buf_preferred_chunk_size(25), OP_EQ, min); - tt_uint_op(buf_preferred_chunk_size(0), OP_EQ, min); - tt_uint_op(buf_preferred_chunk_size(256), OP_EQ, 512); - tt_uint_op(buf_preferred_chunk_size(65400), OP_EQ, max); - /* Here, we're implicitly saying that the chunk header overhead is - * between 1 and 100 bytes. 24..48 would probably be more accurate. */ - tt_uint_op(buf_preferred_chunk_size(65536), OP_GT, 65536); - tt_uint_op(buf_preferred_chunk_size(65536), OP_LT, 65536+100); - tt_uint_op(buf_preferred_chunk_size(165536), OP_GT, 165536); - tt_uint_op(buf_preferred_chunk_size(165536), OP_LT, 165536+100); - done: - ; -} - -static void -test_buffers_find_contentlen(void *arg) -{ - static const struct { - const char *headers; - int r; - int contentlen; - } results[] = { - { "Blah blah\r\nContent-Length: 1\r\n\r\n", 1, 1 }, - { "Blah blah\r\n\r\n", 0, 0 }, /* no content-len */ - { "Blah blah Content-Length: 1\r\n", 0, 0 }, /* no content-len. */ - { "Blah blah\r\nContent-Length: 100000\r\n", 1, 100000}, - { "Blah blah\r\nContent-Length: 1000000000000000000000000\r\n", -1, 0}, - { "Blah blah\r\nContent-Length: 0\r\n", 1, 0}, - { "Blah blah\r\nContent-Length: -1\r\n", -1, 0}, - { "Blah blah\r\nContent-Length: 1x\r\n", -1, 0}, - { "Blah blah\r\nContent-Length: 1 x\r\n", -1, 0}, - { "Blah blah\r\nContent-Length: 1 \r\n", 1, 1}, - { "Blah blah\r\nContent-Length: \r\n", -1, 0}, - { "Blah blah\r\nContent-Length: ", -1, 0}, - { "Blah blah\r\nContent-Length: 5050", -1, 0}, - { NULL, 0, 0 } - }; - int i; - - (void)arg; - - for (i = 0; results[i].headers; ++i) { - int r; - size_t sz; - size_t headerlen = strlen(results[i].headers); - char * tmp = tor_memdup(results[i].headers, headerlen);/* ensure no eos */ - sz = 999; /* to ensure it gets set */ - r = buf_http_find_content_length(tmp, headerlen, &sz); - tor_free(tmp); - log_debug(LD_DIR, "%d: %s", i, escaped(results[i].headers)); - tt_int_op(r, OP_EQ, results[i].r); - tt_int_op(sz, OP_EQ, results[i].contentlen); - } - done: - ; -} - -static void -test_buffer_peek_startswith(void *arg) -{ - (void)arg; - buf_t *buf; - buf = buf_new(); - tt_ptr_op(buf, OP_NE, NULL); - - tt_assert(buf_peek_startswith(buf, "")); - tt_assert(! buf_peek_startswith(buf, "X")); - - buf_add(buf, "Tor", 3); - - tt_assert(buf_peek_startswith(buf, "")); - tt_assert(buf_peek_startswith(buf, "T")); - tt_assert(buf_peek_startswith(buf, "To")); - tt_assert(buf_peek_startswith(buf, "Tor")); - tt_assert(! buf_peek_startswith(buf, "Top")); - tt_assert(! buf_peek_startswith(buf, "For")); - tt_assert(! buf_peek_startswith(buf, "Tork")); - tt_assert(! buf_peek_startswith(buf, "Torpor")); - - done: - buf_free(buf); -} - -struct testcase_t buffer_tests[] = { - { "basic", test_buffers_basic, TT_FORK, NULL, NULL }, - { "copy", test_buffer_copy, TT_FORK, NULL, NULL }, - { "pullup", test_buffer_pullup, TT_FORK, NULL, NULL }, - { "startswith", test_buffer_peek_startswith, 0, NULL, NULL }, - { "allocation_tracking", test_buffer_allocation_tracking, TT_FORK, - NULL, NULL }, - { "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL }, - { "tls_read_mocked", test_buffers_tls_read_mocked, 0, - NULL, NULL }, - { "chunk_size", test_buffers_chunk_size, 0, NULL, NULL }, - { "find_contentlen", test_buffers_find_contentlen, 0, NULL, NULL }, - - { "compress/zlib", test_buffers_compress, TT_FORK, - &passthrough_setup, (char*)"deflate" }, - { "compress/gzip", test_buffers_compress, TT_FORK, - &passthrough_setup, (char*)"gzip" }, - { "compress/zstd", test_buffers_compress, TT_FORK, - &passthrough_setup, (char*)"x-zstd" }, - { "compress/lzma", test_buffers_compress, TT_FORK, - &passthrough_setup, (char*)"x-tor-lzma" }, - { "compress/none", test_buffers_compress, TT_FORK, - &passthrough_setup, (char*)"identity" }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_cell_formats.c b/src/tor/src/test/test_cell_formats.c deleted file mode 100644 index 007f7e3d3..000000000 --- a/src/tor/src/test/test_cell_formats.c +++ /dev/null @@ -1,1299 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CONNECTION_EDGE_PRIVATE -#define RELAY_PRIVATE -#include "or.h" -#include "channel.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "config.h" -#include "onion.h" -#include "onion_tap.h" -#include "onion_fast.h" -#include "onion_ntor.h" -#include "relay.h" -#include "test.h" - -#include -#include - -static void -test_cfmt_relay_header(void *arg) -{ - relay_header_t rh; - const uint8_t hdr_1[RELAY_HEADER_SIZE] = - "\x03" "\x00\x00" "\x21\x22" "ABCD" "\x01\x03"; - uint8_t hdr_out[RELAY_HEADER_SIZE]; - (void)arg; - - tt_int_op(sizeof(hdr_1), OP_EQ, RELAY_HEADER_SIZE); - relay_header_unpack(&rh, hdr_1); - tt_int_op(rh.command, OP_EQ, 3); - tt_int_op(rh.recognized, OP_EQ, 0); - tt_int_op(rh.stream_id, OP_EQ, 0x2122); - tt_mem_op(rh.integrity, OP_EQ, "ABCD", 4); - tt_int_op(rh.length, OP_EQ, 0x103); - - relay_header_pack(hdr_out, &rh); - tt_mem_op(hdr_out, OP_EQ, hdr_1, RELAY_HEADER_SIZE); - - done: - ; -} - -static void -make_relay_cell(cell_t *out, uint8_t command, - const void *body, size_t bodylen) -{ - relay_header_t rh; - - memset(&rh, 0, sizeof(rh)); - rh.stream_id = 5; - rh.command = command; - rh.length = bodylen; - - out->command = CELL_RELAY; - out->circ_id = 10; - relay_header_pack(out->payload, &rh); - - memcpy(out->payload + RELAY_HEADER_SIZE, body, bodylen); -} - -static void -test_cfmt_begin_cells(void *arg) -{ - cell_t cell; - begin_cell_t bcell; - uint8_t end_reason; - (void)arg; - - /* Try begindir. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "", 0); - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_ptr_op(NULL, OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(0, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(1, OP_EQ, bcell.is_begindir); - - /* A Begindir with extra stuff. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "12345", 5); - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_ptr_op(NULL, OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(0, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(1, OP_EQ, bcell.is_begindir); - - /* A short but valid begin cell */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:9", 6); - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("a.b", OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(9, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* A significantly loner begin cell */ - memset(&bcell, 0x7f, sizeof(bcell)); - { - const char c[] = "here-is-a-nice-long.hostname.com:65535"; - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, strlen(c)+1); - } - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("here-is-a-nice-long.hostname.com", OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(65535, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* An IPv4 begin cell. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "18.9.22.169:80", 15); - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("18.9.22.169", OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(80, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* An IPv6 begin cell. Let's make sure we handle colons*/ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, - "[2620::6b0:b:1a1a:0:26e5:480e]:80", 34); - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(80, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* a begin cell with extra junk but not enough for flags. */ - memset(&bcell, 0x7f, sizeof(bcell)); - { - const char c[] = "another.example.com:80\x00\x01\x02"; - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); - } - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("another.example.com", OP_EQ, bcell.address); - tt_int_op(0, OP_EQ, bcell.flags); - tt_int_op(80, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* a begin cell with flags. */ - memset(&bcell, 0x7f, sizeof(bcell)); - { - const char c[] = "another.example.com:443\x00\x01\x02\x03\x04"; - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); - } - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("another.example.com", OP_EQ, bcell.address); - tt_int_op(0x1020304, OP_EQ, bcell.flags); - tt_int_op(443, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* a begin cell with flags and even more cruft after that. */ - memset(&bcell, 0x7f, sizeof(bcell)); - { - const char c[] = "a-further.example.com:22\x00\xee\xaa\x00\xffHi mom"; - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); - } - tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("a-further.example.com", OP_EQ, bcell.address); - tt_int_op(0xeeaa00ff, OP_EQ, bcell.flags); - tt_int_op(22, OP_EQ, bcell.port); - tt_int_op(5, OP_EQ, bcell.stream_id); - tt_int_op(0, OP_EQ, bcell.is_begindir); - tor_free(bcell.address); - - /* bad begin cell: impossible length. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 7); - cell.payload[9] = 0x01; /* Set length to 510 */ - cell.payload[10] = 0xfe; - { - relay_header_t rh; - relay_header_unpack(&rh, cell.payload); - tt_int_op(rh.length, OP_EQ, 510); - } - tt_int_op(-2, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* Bad begin cell: no body. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* bad begin cell: no body. */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* bad begin cell: no colon */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b", 4); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* bad begin cell: no ports */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:", 5); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* bad begin cell: bad port */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:xyz", 8); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:100000", 11); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - /* bad begin cell: no nul */ - memset(&bcell, 0x7f, sizeof(bcell)); - make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 6); - tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); - - done: - tor_free(bcell.address); -} - -static void -test_cfmt_connected_cells(void *arg) -{ - relay_header_t rh; - cell_t cell; - tor_addr_t addr; - int ttl, r; - char *mem_op_hex_tmp = NULL; - (void)arg; - - /* Let's try an oldschool one with nothing in it. */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "", 0); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_UNSPEC); - tt_int_op(ttl, OP_EQ, -1); - - /* A slightly less oldschool one: only an IPv4 address */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x20\x30\x40\x50", 4); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); - tt_str_op(fmt_addr(&addr), OP_EQ, "32.48.64.80"); - tt_int_op(ttl, OP_EQ, -1); - - /* Bogus but understandable: truncated TTL */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x11\x12\x13\x14\x15", 5); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); - tt_str_op(fmt_addr(&addr), OP_EQ, "17.18.19.20"); - tt_int_op(ttl, OP_EQ, -1); - - /* Regular IPv4 one: address and TTL */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x02\x03\x04\x05\x00\x00\x0e\x10", 8); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); - tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); - tt_int_op(ttl, OP_EQ, 3600); - - /* IPv4 with too-big TTL */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x02\x03\x04\x05\xf0\x00\x00\x00", 8); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); - tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); - tt_int_op(ttl, OP_EQ, -1); - - /* IPv6 (ttl is mandatory) */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x00\x00\x00\x00\x06" - "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" - "\x00\x00\x00\x00\x00\x00\x00\x68" - "\x00\x00\x02\x58", 25); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); - tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); - tt_int_op(ttl, OP_EQ, 600); - - /* IPv6 (ttl too big) */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x00\x00\x00\x00\x06" - "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" - "\x00\x00\x00\x00\x00\x00\x00\x68" - "\x90\x00\x02\x58", 25); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); - tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); - tt_int_op(ttl, OP_EQ, -1); - - /* Bogus size: 3. */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x00\x01\x02", 3); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, -1); - - /* Bogus family: 7. */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x00\x00\x00\x00\x07" - "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" - "\x00\x00\x00\x00\x00\x00\x00\x68" - "\x90\x00\x02\x58", 25); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, -1); - - /* Truncated IPv6. */ - make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, - "\x00\x00\x00\x00\x06" - "\x26\x07\xf8\xb0\x40\x0c\x0c\x02" - "\x00\x00\x00\x00\x00\x00\x00\x68" - "\x00\x00\x02", 24); - relay_header_unpack(&rh, cell.payload); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, -1); - - /* Now make sure we can generate connected cells correctly. */ - /* Try an IPv4 address */ - memset(&rh, 0, sizeof(rh)); - memset(&cell, 0, sizeof(cell)); - tor_addr_parse(&addr, "30.40.50.60"); - rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, - &addr, 1024); - tt_int_op(rh.length, OP_EQ, 8); - test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000e10"); - - /* Try parsing it. */ - tor_addr_make_unspec(&addr); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); - tt_str_op(fmt_addr(&addr), OP_EQ, "30.40.50.60"); - tt_int_op(ttl, OP_EQ, 3600); /* not 1024, since we clipped to 3600 */ - - /* Try an IPv6 address */ - memset(&rh, 0, sizeof(rh)); - memset(&cell, 0, sizeof(cell)); - tor_addr_parse(&addr, "2620::6b0:b:1a1a:0:26e5:480e"); - rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, - &addr, 3600); - tt_int_op(rh.length, OP_EQ, 25); - test_memeq_hex(cell.payload + RELAY_HEADER_SIZE, - "00000000" "06" - "2620000006b0000b1a1a000026e5480e" "00000e10"); - - /* Try parsing it. */ - tor_addr_make_unspec(&addr); - r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, OP_EQ, 0); - tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); - tt_str_op(fmt_addr(&addr), OP_EQ, "2620:0:6b0:b:1a1a:0:26e5:480e"); - tt_int_op(ttl, OP_EQ, 3600); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_cfmt_create_cells(void *arg) -{ - uint8_t b[MAX_ONIONSKIN_CHALLENGE_LEN]; - create_cell_t cc; - cell_t cell; - cell_t cell2; - - (void)arg; - - /* === Let's try parsing some good cells! */ - - /* A valid create cell. */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); - cell.command = CELL_CREATE; - memcpy(cell.payload, b, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); - tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); - tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A valid create_fast cell. */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, CREATE_FAST_LEN); - cell.command = CELL_CREATE_FAST; - memcpy(cell.payload, b, CREATE_FAST_LEN); - tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE_FAST, OP_EQ, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_FAST, OP_EQ, cc.handshake_type); - tt_int_op(CREATE_FAST_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.onionskin,OP_EQ, b, CREATE_FAST_LEN + 10); - tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A valid create2 cell with a TAP payload */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); - cell.command = CELL_CREATE2; - memcpy(cell.payload, "\x00\x00\x00\xBA", 4); /* TAP, 186 bytes long */ - memcpy(cell.payload+4, b, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); - tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); - tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A valid create2 cell with an ntor payload */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); - cell.command = CELL_CREATE2; - memcpy(cell.payload, "\x00\x02\x00\x54", 4); /* ntor, 84 bytes long */ - memcpy(cell.payload+4, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); - tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); - tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A valid create cell with an ntor payload, in legacy format. */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); - cell.command = CELL_CREATE; - memcpy(cell.payload, "ntorNTORntorNTOR", 16); - memcpy(cell.payload+16, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); - tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); - tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* == Okay, now let's try to parse some impossible stuff. */ - - /* It has to be some kind of a create cell! */ - cell.command = CELL_CREATED; - tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); - - /* You can't acutally make an unparseable CREATE or CREATE_FAST cell. */ - - /* Try some CREATE2 cells. First with a bad type. */ - cell.command = CELL_CREATE2; - memcpy(cell.payload, "\x00\x50\x00\x99", 4); /* Type 0x50???? */ - tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); - /* Now a good type with an incorrect length. */ - memcpy(cell.payload, "\x00\x00\x00\xBC", 4); /* TAP, 187 bytes.*/ - tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); - /* Now a good type with a ridiculous length. */ - memcpy(cell.payload, "\x00\x00\x02\x00", 4); /* TAP, 512 bytes.*/ - tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); - - /* == Time to try formatting bad cells. The important thing is that - we reject big lengths, so just check that for now. */ - cc.handshake_len = 512; - tt_int_op(-1, OP_EQ, create_cell_format(&cell2, &cc)); - - /* == Try formatting a create2 cell we don't understand. XXXX */ - - done: - ; -} - -static void -test_cfmt_created_cells(void *arg) -{ - uint8_t b[512]; - created_cell_t cc; - cell_t cell; - cell_t cell2; - - (void)arg; - - /* A good CREATED cell */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); - cell.command = CELL_CREATED; - memcpy(cell.payload, b, TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED, OP_EQ, cc.cell_type); - tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN + 10); - tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A good CREATED_FAST cell */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, CREATED_FAST_LEN); - cell.command = CELL_CREATED_FAST; - memcpy(cell.payload, b, CREATED_FAST_LEN); - tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED_FAST, OP_EQ, cc.cell_type); - tt_int_op(CREATED_FAST_LEN, OP_EQ, cc.handshake_len); - tt_mem_op(cc.reply,OP_EQ, b, CREATED_FAST_LEN + 10); - tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A good CREATED2 cell with short reply */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, 64); - cell.command = CELL_CREATED2; - memcpy(cell.payload, "\x00\x40", 2); - memcpy(cell.payload+2, b, 64); - tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); - tt_int_op(64, OP_EQ, cc.handshake_len); - tt_mem_op(cc.reply,OP_EQ, b, 80); - tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* A good CREATED2 cell with maximal reply */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, 496); - cell.command = CELL_CREATED2; - memcpy(cell.payload, "\x01\xF0", 2); - memcpy(cell.payload+2, b, 496); - tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); - tt_int_op(496, OP_EQ, cc.handshake_len); - tt_mem_op(cc.reply,OP_EQ, b, 496); - tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, OP_EQ, cell2.command); - tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); - - /* Bogus CREATED2 cell: too long! */ - memset(&cell, 0, sizeof(cell)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, 496); - cell.command = CELL_CREATED2; - memcpy(cell.payload, "\x01\xF1", 2); - tt_int_op(-1, OP_EQ, created_cell_parse(&cc, &cell)); - - /* Unformattable CREATED2 cell: too long! */ - cc.handshake_len = 497; - tt_int_op(-1, OP_EQ, created_cell_format(&cell2, &cc)); - - done: - ; -} - -static void -test_cfmt_extend_cells(void *arg) -{ - cell_t cell; - uint8_t b[512]; - extend_cell_t ec; - create_cell_t *cc = &ec.create_cell; - uint8_t p[RELAY_PAYLOAD_SIZE]; - uint8_t p2[RELAY_PAYLOAD_SIZE]; - uint8_t p2_cmd; - uint16_t p2_len; - char *mem_op_hex_tmp = NULL; - - (void) arg; - - /* Let's start with a simple EXTEND cell. */ - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); - memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */ - memcpy(p+6,b,TAP_ONIONSKIN_CHALLENGE_LEN); - memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); - tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, - p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); - tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(258, OP_EQ, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE); - tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_TAP); - tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(cc->onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN+20); - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); - tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); - - /* Let's do an ntor stuffed in a legacy EXTEND cell */ - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); - memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */ - memcpy(p+6,"ntorNTORntorNTOR", 16); - memcpy(p+22, b, NTOR_ONIONSKIN_LEN); - memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); - tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, - p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); - tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(258, OP_EQ, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); - tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); - tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); - tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); - tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); - tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); - - /* Now let's do a minimal ntor EXTEND2 cell. */ - memset(&ec, 0xff, sizeof(ec)); - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, NTOR_ONIONSKIN_LEN); - /* 2 items; one 18.244.0.1:61681 */ - memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - /* The other is a digest. */ - memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); - /* Prep for the handshake: type and length */ - memcpy(p+31, "\x00\x02\x00\x54", 4); - memcpy(p+35, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, 35+NTOR_ONIONSKIN_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); - tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,OP_EQ, "anarchoindividualist", 20); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); - tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); - tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); - tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); - tt_int_op(p2_len, OP_EQ, 35+NTOR_ONIONSKIN_LEN); - tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); - - /* Now let's do a fanciful EXTEND2 cell. */ - memset(&ec, 0xff, sizeof(ec)); - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, 99); - /* 4 items; one 18 244 0 1 61681 */ - memcpy(p, "\x04\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - /* One is a digest. */ - memcpy(p+9, "\x02\x14" "anthropomorphization", 22); - /* One is an ipv6 address */ - memcpy(p+31, "\x01\x12\x20\x02\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf0\xc5\x1e\x11\x12", 20); - /* One is the Konami code. */ - memcpy(p+51, "\xf0\x20upupdowndownleftrightleftrightba", 34); - /* Prep for the handshake: weird type and length */ - memcpy(p+85, "\x01\x05\x00\x63", 4); - memcpy(p+89, b, 99); - tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99)); - tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); - tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); - tt_str_op("2002::f0:c51e", OP_EQ, fmt_addr(&ec.orport_ipv6.addr)); - tt_int_op(4370, OP_EQ, ec.orport_ipv6.port); - tt_assert(ed25519_public_key_is_zero(&ec.ed_pubkey)); - tt_mem_op(ec.node_id,OP_EQ, "anthropomorphization", 20); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); - tt_int_op(cc->handshake_type, OP_EQ, 0x105); - tt_int_op(cc->handshake_len, OP_EQ, 99); - tt_mem_op(cc->onionskin,OP_EQ, b, 99+20); - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); - /* We'll generate it minus the IPv6 address and minus the konami code */ - tt_int_op(p2_len, OP_EQ, 89+99-34-20); - test_memeq_hex(p2, - /* Two items: one that same darn IP address. */ - "02000612F40001F0F1" - /* The next is a digest : anthropomorphization */ - "0214616e7468726f706f6d6f727068697a6174696f6e" - /* Now the handshake prologue */ - "01050063"); - tt_mem_op(p2+1+8+22+4,OP_EQ, b, 99+20); - tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); - - /* Now let's add an ed25519 key to that extend2 cell. */ - memcpy(ec.ed_pubkey.pubkey, - "brownshoesdontmakeit/brownshoesd", 32); - - /* As before, since we aren't extending by ed25519. */ - get_options_mutable()->ExtendByEd25519ID = 0; - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_len, OP_EQ, 89+99-34-20); - test_memeq_hex(p2, - "02000612F40001F0F1" - "0214616e7468726f706f6d6f727068697a6174696f6e" - "01050063"); - - /* Now try with the ed25519 ID. */ - get_options_mutable()->ExtendByEd25519ID = 1; - tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_len, OP_EQ, 89+99-34-20 + 34); - test_memeq_hex(p2, - "03000612F40001F0F1" - "0214616e7468726f706f6d6f727068697a6174696f6e" - // ed digest follows: - "0320" "62726f776e73686f6573646f6e746d616b656" - "9742f62726f776e73686f657364" - "01050063"); - /* Can we parse that? Did the key come through right? */ - memset(&ec, 0, sizeof(ec)); - tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p2, p2_len)); - tt_mem_op("brownshoesdontmakeit/brownshoesd", OP_EQ, - ec.ed_pubkey.pubkey, 32); - - /* == Now try parsing some junk */ - - /* Try a too-long handshake */ - memset(p, 0, sizeof(p)); - memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+31, "\xff\xff\x01\xd0", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* Try two identities. */ - memset(p, 0, sizeof(p)); - memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+31, "\x02\x14" "autodepolymerization", 22); - memcpy(p+53, "\xff\xff\x00\x10", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* No identities. */ - memset(p, 0, sizeof(p)); - memcpy(p, "\x01\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - memcpy(p+53, "\xff\xff\x00\x10", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* Try a bad IPv4 address (too long, too short)*/ - memset(p, 0, sizeof(p)); - memcpy(p, "\x02\x00\x07\x12\xf4\x00\x01\xf0\xf1\xff", 10); - memcpy(p+10, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+32, "\xff\xff\x00\x10", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - memset(p, 0, sizeof(p)); - memcpy(p, "\x02\x00\x05\x12\xf4\x00\x01\xf0", 8); - memcpy(p+8, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+30, "\xff\xff\x00\x10", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* IPv6 address (too long, too short, no IPv4)*/ - memset(p, 0, sizeof(p)); - memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+31, "\x01\x13" "xxxxxxxxxxxxxxxxYYZ", 19); - memcpy(p+50, "\xff\xff\x00\x20", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - memset(p, 0, sizeof(p)); - memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); - memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+31, "\x01\x11" "xxxxxxxxxxxxxxxxY", 17); - memcpy(p+48, "\xff\xff\x00\x20", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - memset(p, 0, sizeof(p)); - memcpy(p, "\x02", 1); - memcpy(p+1, "\x02\x14" "anarchoindividualist", 22); - memcpy(p+23, "\x01\x12" "xxxxxxxxxxxxxxxxYY", 18); - memcpy(p+41, "\xff\xff\x00\x20", 4); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* Running out of space in specifiers */ - memset(p,0,sizeof(p)); - memcpy(p, "\x05\x0a\xff", 3); - memcpy(p+3+255, "\x0a\xff", 2); - tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, - p, sizeof(p))); - - /* Fuzz, because why not. */ - memset(&ec, 0xff, sizeof(ec)); - { - int i; - memset(p, 0, sizeof(p)); - for (i = 0; i < 10000; ++i) { - int n = crypto_rand_int(sizeof(p)); - crypto_rand((char *)p, n); - extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, n); - } - } - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_cfmt_extended_cells(void *arg) -{ - uint8_t b[512]; - extended_cell_t ec; - created_cell_t *cc = &ec.created_cell; - uint8_t p[RELAY_PAYLOAD_SIZE]; - uint8_t p2[RELAY_PAYLOAD_SIZE]; - uint8_t p2_cmd; - uint16_t p2_len; - char *mem_op_hex_tmp = NULL; - - (void) arg; - - /* Try a regular EXTENDED cell. */ - memset(&ec, 0xff, sizeof(ec)); - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); - memcpy(p,b,TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p, - TAP_ONIONSKIN_REPLY_LEN)); - tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, ec.cell_type); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED); - tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_REPLY_LEN); - tt_mem_op(cc->reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, p2_cmd); - tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, p2_len); - tt_mem_op(p2,OP_EQ, p, sizeof(p2)); - - /* Try an EXTENDED2 cell */ - memset(&ec, 0xff, sizeof(ec)); - memset(p, 0, sizeof(p)); - memset(b, 0, sizeof(b)); - crypto_rand((char*)b, 42); - memcpy(p,"\x00\x2a",2); - memcpy(p+2,b,42); - tt_int_op(0, OP_EQ, - extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42)); - tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, ec.cell_type); - tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED2); - tt_int_op(cc->handshake_len, OP_EQ, 42); - tt_mem_op(cc->reply,OP_EQ, b, 42+10); - tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, p2_cmd); - tt_int_op(2+42, OP_EQ, p2_len); - tt_mem_op(p2,OP_EQ, p, sizeof(p2)); - - /* Try an almost-too-long EXTENDED2 cell */ - memcpy(p, "\x01\xf0", 2); - tt_int_op(0, OP_EQ, - extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); - - /* Now try a too-long extended2 cell. That's the only misparse I can think - * of. */ - memcpy(p, "\x01\xf1", 2); - tt_int_op(-1, OP_EQ, - extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_cfmt_resolved_cells(void *arg) -{ - smartlist_t *addrs = smartlist_new(); - relay_header_t rh; - cell_t cell; - int r, errcode; - address_ttl_t *a; - - (void)arg; -#define CLEAR_CELL() do { \ - memset(&cell, 0, sizeof(cell)); \ - memset(&rh, 0, sizeof(rh)); \ - } while (0) -#define CLEAR_ADDRS() do { \ - SMARTLIST_FOREACH(addrs, address_ttl_t *, aa_, \ - address_ttl_free(aa_); ); \ - smartlist_clear(addrs); \ - } while (0) -#define SET_CELL(s) do { \ - CLEAR_CELL(); \ - memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \ - rh.length = sizeof((s))-1; \ - rh.command = RELAY_COMMAND_RESOLVED; \ - errcode = -1; \ - } while (0) - - /* The cell format is one or more answers; each of the form - * type [1 byte---0:hostname, 4:ipv4, 6:ipv6, f0:err-transient, f1:err] - * length [1 byte] - * body [length bytes] - * ttl [4 bytes] - */ - - /* Let's try an empty cell */ - SET_CELL(""); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - CLEAR_ADDRS(); /* redundant but let's be consistent */ - - /* Cell with one ipv4 addr */ - SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); - tt_int_op(rh.length, OP_EQ, 10); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 1); - a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 256); - CLEAR_ADDRS(); - - /* Cell with one ipv6 addr */ - SET_CELL("\x06\x10" - "\x20\x02\x90\x90\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf0\xf0\xab\xcd" - "\x02\00\x00\x01"); - tt_int_op(rh.length, OP_EQ, 22); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 1); - a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 0x2000001); - CLEAR_ADDRS(); - - /* Cell with one hostname */ - SET_CELL("\x00\x11" - "motherbrain.zebes" - "\x00\00\x00\x00"); - tt_int_op(rh.length, OP_EQ, 23); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 1); - a = smartlist_get(addrs, 0); - tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); - tt_int_op(a->ttl, OP_EQ, 0); - CLEAR_ADDRS(); - -#define LONG_NAME \ - "this-hostname-has-255-characters.in-order-to-test-whether-very-long.ho" \ - "stnames-are-accepted.i-am-putting-it-in-a-macro-because-although.this-" \ - "function-is-already-very-full.of-copy-and-pasted-stuff.having-this-app" \ - "ear-more-than-once-would-bother-me-somehow.is" - - tt_int_op(strlen(LONG_NAME), OP_EQ, 255); - SET_CELL("\x00\xff" - LONG_NAME - "\x00\01\x00\x00"); - tt_int_op(rh.length, OP_EQ, 261); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 1); - a = smartlist_get(addrs, 0); - tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, OP_EQ, LONG_NAME); - tt_int_op(a->ttl, OP_EQ, 65536); - CLEAR_ADDRS(); - - /* Cells with an error */ - SET_CELL("\xf0\x2b" - "I'm sorry, Dave. I'm afraid I can't do that" - "\x00\x11\x22\x33"); - tt_int_op(rh.length, OP_EQ, 49); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR_TRANSIENT); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - CLEAR_ADDRS(); - - SET_CELL("\xf1\x40" - "This hostname is too important for me to allow you to resolve it" - "\x00\x00\x00\x00"); - tt_int_op(rh.length, OP_EQ, 70); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - CLEAR_ADDRS(); - - /* Cell with an unrecognized type */ - SET_CELL("\xee\x16" - "fault in the AE35 unit" - "\x09\x09\x01\x01"); - tt_int_op(rh.length, OP_EQ, 28); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - CLEAR_ADDRS(); - - /* Cell with one of each */ - SET_CELL(/* unrecognized: */ - "\xee\x16" - "fault in the AE35 unit" - "\x09\x09\x01\x01" - /* error: */ - "\xf0\x2b" - "I'm sorry, Dave. I'm afraid I can't do that" - "\x00\x11\x22\x33" - /* IPv6: */ - "\x06\x10" - "\x20\x02\x90\x90\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf0\xf0\xab\xcd" - "\x02\00\x00\x01" - /* IPv4: */ - "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" - /* Hostname: */ - "\x00\x11" - "motherbrain.zebes" - "\x00\00\x00\x00" - ); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); /* no error reported; we got answers */ - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 3); - a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 0x2000001); - a = smartlist_get(addrs, 1); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 256); - a = smartlist_get(addrs, 2); - tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); - tt_int_op(a->ttl, OP_EQ, 0); - CLEAR_ADDRS(); - - /* Cell with several of similar type */ - SET_CELL(/* IPv4 */ - "\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" - "\x04\x04" "\x08\x08\x08\x08" "\x00\00\x01\x05" - "\x04\x04" "\x7f\xb0\x02\xb0" "\x00\01\xff\xff" - /* IPv6 */ - "\x06\x10" - "\x20\x02\x90\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xca\xfe\xf0\x0d" - "\x00\00\x00\x01" - "\x06\x10" - "\x20\x02\x90\x01\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfa\xca\xde" - "\x00\00\x00\x03"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 5); - a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 256); - a = smartlist_get(addrs, 1); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "8.8.8.8"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 261); - a = smartlist_get(addrs, 2); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.176.2.176"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 131071); - a = smartlist_get(addrs, 3); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9000::cafe:f00d"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 1); - a = smartlist_get(addrs, 4); - tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9001::fa:cade"); - tt_ptr_op(a->hostname, OP_EQ, NULL); - tt_int_op(a->ttl, OP_EQ, 3); - CLEAR_ADDRS(); - - /* Full cell */ -#define LONG_NAME2 \ - "this-name-has-231-characters.so-that-it-plus-LONG_NAME-can-completely-" \ - "fill-up-the-payload-of-a-cell.its-important-to-check-for-the-full-thin" \ - "g-case.to-avoid-off-by-one-errors.where-full-things-are-misreported-as" \ - ".overflowing-by-one.z" - - tt_int_op(strlen(LONG_NAME2), OP_EQ, 231); - SET_CELL("\x00\xff" - LONG_NAME - "\x00\01\x00\x00" - "\x00\xe7" - LONG_NAME2 - "\x00\01\x00\x00"); - tt_int_op(rh.length, OP_EQ, RELAY_PAYLOAD_SIZE); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(addrs), OP_EQ, 2); - a = smartlist_get(addrs, 0); - tt_str_op(a->hostname, OP_EQ, LONG_NAME); - a = smartlist_get(addrs, 1); - tt_str_op(a->hostname, OP_EQ, LONG_NAME2); - CLEAR_ADDRS(); - - /* BAD CELLS */ - - /* Invalid length on an IPv4 */ - SET_CELL("\x04\x03zzz1234"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" - "\x04\x05zzzzz1234"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - /* Invalid length on an IPv6 */ - SET_CELL("\x06\x03zzz1234"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" - "\x06\x17wwwwwwwwwwwwwwwww1234"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" - "\x06\x10xxxx"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - /* Empty hostname */ - SET_CELL("\x00\x00xxxx"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - /* rh.length out of range */ - CLEAR_CELL(); - rh.length = 499; - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, OP_EQ, 0); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - /* Item length extends beyond rh.length */ - CLEAR_CELL(); - SET_CELL("\x00\xff" - LONG_NAME - "\x00\01\x00\x00"); - rh.length -= 1; - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - rh.length -= 5; - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); - rh.length -= 1; - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - SET_CELL("\xee\x10" - "\x20\x02\x90\x01\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfa\xca\xde" - "\x00\00\x00\x03"); - rh.length -= 1; - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - /* Truncated item after first character */ - SET_CELL("\x04"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - SET_CELL("\xee"); - r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, OP_EQ, -1); - tt_int_op(smartlist_len(addrs), OP_EQ, 0); - - done: - CLEAR_ADDRS(); - CLEAR_CELL(); - smartlist_free(addrs); -#undef CLEAR_ADDRS -#undef CLEAR_CELL -} - -static void -test_cfmt_is_destroy(void *arg) -{ - cell_t cell; - packed_cell_t packed; - circid_t circid = 0; - channel_t *chan; - (void)arg; - - chan = tor_malloc_zero(sizeof(channel_t)); - - memset(&cell, 0xff, sizeof(cell)); - cell.circ_id = 3003; - cell.command = CELL_RELAY; - - cell_pack(&packed, &cell, 0); - chan->wide_circ_ids = 0; - tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, OP_EQ, 0); - - cell_pack(&packed, &cell, 1); - chan->wide_circ_ids = 1; - tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, OP_EQ, 0); - - cell.command = CELL_DESTROY; - - cell_pack(&packed, &cell, 0); - chan->wide_circ_ids = 0; - tt_assert(packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, OP_EQ, 3003); - - circid = 0; - cell_pack(&packed, &cell, 1); - chan->wide_circ_ids = 1; - tt_assert(packed_cell_is_destroy(chan, &packed, &circid)); - - done: - tor_free(chan); -} - -#define TEST(name, flags) \ - { #name, test_cfmt_ ## name, flags, 0, NULL } - -struct testcase_t cell_format_tests[] = { - TEST(relay_header, 0), - TEST(begin_cells, 0), - TEST(connected_cells, 0), - TEST(create_cells, 0), - TEST(created_cells, 0), - TEST(extend_cells, TT_FORK), - TEST(extended_cells, 0), - TEST(resolved_cells, 0), - TEST(is_destroy, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_cell_queue.c b/src/tor/src/test/test_cell_queue.c deleted file mode 100644 index df987f82c..000000000 --- a/src/tor/src/test/test_cell_queue.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CIRCUITLIST_PRIVATE -#define RELAY_PRIVATE -#include "or.h" -#include "circuitlist.h" -#include "relay.h" -#include "test.h" - -static void -test_cq_manip(void *arg) -{ - packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc_tmp=NULL; - cell_queue_t cq; - cell_t cell; - (void) arg; - - cell_queue_init(&cq); - tt_int_op(cq.n, OP_EQ, 0); - - pc1 = packed_cell_new(); - pc2 = packed_cell_new(); - pc3 = packed_cell_new(); - pc4 = packed_cell_new(); - tt_assert(pc1 && pc2 && pc3 && pc4); - - tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); - - /* Add and remove a singleton. */ - cell_queue_append(&cq, pc1); - tt_int_op(cq.n, OP_EQ, 1); - tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); - tt_int_op(cq.n, OP_EQ, 0); - - /* Add and remove four items */ - cell_queue_append(&cq, pc4); - cell_queue_append(&cq, pc3); - cell_queue_append(&cq, pc2); - cell_queue_append(&cq, pc1); - tt_int_op(cq.n, OP_EQ, 4); - tt_ptr_op(pc4, OP_EQ, cell_queue_pop(&cq)); - tt_ptr_op(pc3, OP_EQ, cell_queue_pop(&cq)); - tt_ptr_op(pc2, OP_EQ, cell_queue_pop(&cq)); - tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); - tt_int_op(cq.n, OP_EQ, 0); - tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); - - /* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a - * real cell queue has only one type.) */ - memset(&cell, 0, sizeof(cell)); - cell.circ_id = 0x12345678; - cell.command = 10; - strlcpy((char*)cell.payload, "Lorax ipsum gruvvulus thneed amet, snergelly " - "once-ler lerkim, sed do barbaloot tempor gluppitus ut labore et " - "truffula magna aliqua.", - sizeof(cell.payload)); - cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell, - 1 /*wide*/, 0 /*stats*/); - cell.circ_id = 0x2013; - cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell, - 0 /*wide*/, 0 /*stats*/); - tt_int_op(cq.n, OP_EQ, 2); - - pc_tmp = cell_queue_pop(&cq); - tt_int_op(cq.n, OP_EQ, 1); - tt_ptr_op(pc_tmp, OP_NE, NULL); - tt_mem_op(pc_tmp->body, OP_EQ, "\x12\x34\x56\x78\x0a", 5); - tt_mem_op(pc_tmp->body+5, OP_EQ, cell.payload, sizeof(cell.payload)); - packed_cell_free(pc_tmp); - - pc_tmp = cell_queue_pop(&cq); - tt_int_op(cq.n, OP_EQ, 0); - tt_ptr_op(pc_tmp, OP_NE, NULL); - tt_mem_op(pc_tmp->body, OP_EQ, "\x20\x13\x0a", 3); - tt_mem_op(pc_tmp->body+3, OP_EQ, cell.payload, sizeof(cell.payload)); - packed_cell_free(pc_tmp); - pc_tmp = NULL; - - tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); - - /* Now make sure cell_queue_clear works. */ - cell_queue_append(&cq, pc2); - cell_queue_append(&cq, pc1); - tt_int_op(cq.n, OP_EQ, 2); - cell_queue_clear(&cq); - pc2 = pc1 = NULL; /* prevent double-free */ - tt_int_op(cq.n, OP_EQ, 0); - - done: - packed_cell_free(pc1); - packed_cell_free(pc2); - packed_cell_free(pc3); - packed_cell_free(pc4); - packed_cell_free(pc_tmp); - - cell_queue_clear(&cq); -} - -static void -test_circuit_n_cells(void *arg) -{ - packed_cell_t *pc1=NULL, *pc2=NULL, *pc3=NULL, *pc4=NULL, *pc5=NULL; - origin_circuit_t *origin_c=NULL; - or_circuit_t *or_c=NULL; - - (void)arg; - - pc1 = packed_cell_new(); - pc2 = packed_cell_new(); - pc3 = packed_cell_new(); - pc4 = packed_cell_new(); - pc5 = packed_cell_new(); - tt_assert(pc1 && pc2 && pc3 && pc4 && pc5); - - or_c = or_circuit_new(0, NULL); - origin_c = origin_circuit_new(); - origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; - - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 0); - cell_queue_append(&or_c->p_chan_cells, pc1); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 1); - cell_queue_append(&or_c->base_.n_chan_cells, pc2); - cell_queue_append(&or_c->base_.n_chan_cells, pc3); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 3); - - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 0); - cell_queue_append(&origin_c->base_.n_chan_cells, pc4); - cell_queue_append(&origin_c->base_.n_chan_cells, pc5); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 2); - - done: - circuit_free_(TO_CIRCUIT(or_c)); - circuit_free_(TO_CIRCUIT(origin_c)); -} - -struct testcase_t cell_queue_tests[] = { - { "basic", test_cq_manip, TT_FORK, NULL, NULL, }, - { "circ_n_cells", test_circuit_n_cells, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_channel.c b/src/tor/src/test/test_channel.c deleted file mode 100644 index bdc9d32f7..000000000 --- a/src/tor/src/test/test_channel.c +++ /dev/null @@ -1,1556 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define TOR_CHANNEL_INTERNAL_ -#define CHANNEL_PRIVATE_ -#include "or.h" -#include "channel.h" -/* For channel_note_destroy_not_pending */ -#define CIRCUITLIST_PRIVATE -#include "circuitlist.h" -#include "circuitmux.h" -#include "circuitmux_ewma.h" -/* For var_cell_free */ -#include "connection_or.h" -/* For packed_cell stuff */ -#define RELAY_PRIVATE -#include "relay.h" -/* For init/free stuff */ -#include "scheduler.h" -#include "networkstatus.h" - -/* Test suite stuff */ -#include "log_test_helpers.h" -#include "test.h" -#include "fakechans.h" - -static int test_chan_accept_cells = 0; -static int test_chan_fixed_cells_recved = 0; -static cell_t * test_chan_last_seen_fixed_cell_ptr = NULL; -static int test_chan_var_cells_recved = 0; -static var_cell_t * test_chan_last_seen_var_cell_ptr = NULL; -static int test_cells_written = 0; -static int test_doesnt_want_writes_count = 0; -static int test_dumpstats_calls = 0; -static int test_has_waiting_cells_count = 0; -static int test_releases_count = 0; -static channel_t *dump_statistics_mock_target = NULL; -static int dump_statistics_mock_matches = 0; -static int test_close_called = 0; -static int test_chan_should_be_canonical = 0; -static int test_chan_should_match_target = 0; -static int test_chan_canonical_should_be_reliable = 0; -static int test_chan_listener_close_fn_called = 0; -static int test_chan_listener_fn_called = 0; - -static const char * -chan_test_describe_transport(channel_t *ch) -{ - tt_ptr_op(ch, OP_NE, NULL); - - done: - return "Fake channel for unit tests"; -} - -/** - * Mock for channel_dump_statistics(); if the channel matches the - * target, bump a counter - otherwise ignore. - */ - -static void -chan_test_channel_dump_statistics_mock(channel_t *chan, int severity) -{ - tt_ptr_op(chan, OP_NE, NULL); - - (void)severity; - - if (chan != NULL && chan == dump_statistics_mock_target) { - ++dump_statistics_mock_matches; - } - - done: - return; -} - -/* - * Handle an incoming fixed-size cell for unit tests - */ - -static void -chan_test_cell_handler(channel_t *chan, cell_t *cell) -{ - tt_assert(chan); - tt_assert(cell); - - test_chan_last_seen_fixed_cell_ptr = cell; - ++test_chan_fixed_cells_recved; - - done: - return; -} - -/* - * Fake transport-specific stats call - */ - -static void -chan_test_dumpstats(channel_t *ch, int severity) -{ - tt_ptr_op(ch, OP_NE, NULL); - - (void)severity; - - ++test_dumpstats_calls; - - done: - return; -} - -/* - * Handle an incoming variable-size cell for unit tests - */ - -static void -chan_test_var_cell_handler(channel_t *ch, - var_cell_t *var_cell) -{ - tt_assert(ch); - tt_assert(var_cell); - - test_chan_last_seen_var_cell_ptr = var_cell; - ++test_chan_var_cells_recved; - - done: - return; -} - -static void -chan_test_close(channel_t *ch) -{ - tt_assert(ch); - - ++test_close_called; - - done: - return; -} - -/* - * Close a channel through the error path - */ - -static void -chan_test_error(channel_t *ch) -{ - tt_assert(ch); - tt_assert(!(ch->state == CHANNEL_STATE_CLOSING || - ch->state == CHANNEL_STATE_ERROR || - ch->state == CHANNEL_STATE_CLOSED)); - - channel_close_for_error(ch); - - done: - return; -} - -/* - * Finish closing a channel from CHANNEL_STATE_CLOSING - */ - -static void -chan_test_finish_close(channel_t *ch) -{ - tt_assert(ch); - tt_assert(ch->state == CHANNEL_STATE_CLOSING); - - channel_closed(ch); - - done: - return; -} - -static const char * -chan_test_get_remote_descr(channel_t *ch, int flags) -{ - tt_assert(ch); - tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), OP_EQ, 0); - - done: - return "Fake channel for unit tests; no real endpoint"; -} - -static int -chan_test_num_cells_writeable(channel_t *ch) -{ - tt_assert(ch); - - done: - return 32; -} - -static int -chan_test_write_packed_cell(channel_t *ch, - packed_cell_t *packed_cell) -{ - int rv = 0; - - tt_assert(ch); - tt_assert(packed_cell); - - if (test_chan_accept_cells) { - /* Free the cell and bump the counter */ - ++test_cells_written; - rv = 1; - } - /* else return 0, we didn't accept it */ - - done: - return rv; -} - -static int -chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell) -{ - int rv = 0; - - tt_assert(ch); - tt_assert(var_cell); - - if (test_chan_accept_cells) { - /* Free the cell and bump the counter */ - var_cell_free(var_cell); - ++test_cells_written; - rv = 1; - } - /* else return 0, we didn't accept it */ - - done: - return rv; -} - -/** - * Fill out c with a new fake cell for test suite use - */ - -void -make_fake_cell(cell_t *c) -{ - tt_ptr_op(c, OP_NE, NULL); - - c->circ_id = 1; - c->command = CELL_RELAY; - memset(c->payload, 0, CELL_PAYLOAD_SIZE); - - done: - return; -} - -/** - * Fill out c with a new fake var_cell for test suite use - */ - -void -make_fake_var_cell(var_cell_t *c) -{ - tt_ptr_op(c, OP_NE, NULL); - - c->circ_id = 1; - c->command = CELL_VERSIONS; - c->payload_len = CELL_PAYLOAD_SIZE / 2; - memset(c->payload, 0, c->payload_len); - - done: - return; -} - -/** - * Set up a new fake channel for the test suite - */ - -channel_t * -new_fake_channel(void) -{ - channel_t *chan = tor_malloc_zero(sizeof(channel_t)); - channel_init(chan); - - chan->close = chan_test_close; - chan->num_cells_writeable = chan_test_num_cells_writeable; - chan->get_remote_descr = chan_test_get_remote_descr; - chan->write_packed_cell = chan_test_write_packed_cell; - chan->write_var_cell = chan_test_write_var_cell; - chan->state = CHANNEL_STATE_OPEN; - - chan->cmux = circuitmux_alloc(); - - return chan; -} - -void -free_fake_channel(channel_t *chan) -{ - if (! chan) - return; - - if (chan->cmux) - circuitmux_free(chan->cmux); - - tor_free(chan); -} - -/** - * Counter query for scheduler_channel_has_waiting_cells_mock() - */ - -int -get_mock_scheduler_has_waiting_cells_count(void) -{ - return test_has_waiting_cells_count; -} - -/** - * Mock for scheduler_channel_has_waiting_cells() - */ - -void -scheduler_channel_has_waiting_cells_mock(channel_t *ch) -{ - (void)ch; - - /* Increment counter */ - ++test_has_waiting_cells_count; - - return; -} - -static void -scheduler_channel_doesnt_want_writes_mock(channel_t *ch) -{ - (void)ch; - - /* Increment counter */ - ++test_doesnt_want_writes_count; - - return; -} - -/** - * Mock for scheduler_release_channel() - */ - -void -scheduler_release_channel_mock(channel_t *ch) -{ - (void)ch; - - /* Increment counter */ - ++test_releases_count; - - return; -} - -static int -test_chan_is_canonical(channel_t *chan, int req) -{ - tor_assert(chan); - - if (req && test_chan_canonical_should_be_reliable) { - return 1; - } - - if (test_chan_should_be_canonical) { - return 1; - } - return 0; -} - -static int -test_chan_matches_target(channel_t *chan, const tor_addr_t *target) -{ - (void) chan; - (void) target; - - if (test_chan_should_match_target) { - return 1; - } - return 0; -} - -static void -test_chan_listener_close(channel_listener_t *chan) -{ - (void) chan; - ++test_chan_listener_close_fn_called; - return; -} - -static void -test_chan_listener_fn(channel_listener_t *listener, channel_t *chan) -{ - (void) listener; - (void) chan; - - ++test_chan_listener_fn_called; - return; -} - -static const char * -test_chan_listener_describe_transport(channel_listener_t *chan) -{ - (void) chan; - return "Fake listener channel."; -} - -/** - * Test for channel_dumpstats() and limited test for - * channel_dump_statistics() - */ - -static void -test_channel_dumpstats(void *arg) -{ - channel_t *ch = NULL; - cell_t *cell = NULL; - packed_cell_t *p_cell = NULL; - int old_count; - - (void)arg; - - /* Mock these for duration of the test */ - MOCK(scheduler_channel_doesnt_want_writes, - scheduler_channel_doesnt_want_writes_mock); - MOCK(scheduler_release_channel, - scheduler_release_channel_mock); - - /* Set up a new fake channel */ - ch = new_fake_channel(); - tt_assert(ch); - - /* Try to register it */ - channel_register(ch); - tt_assert(ch->registered); - - /* Set up mock */ - dump_statistics_mock_target = ch; - dump_statistics_mock_matches = 0; - MOCK(channel_dump_statistics, - chan_test_channel_dump_statistics_mock); - - /* Call channel_dumpstats() */ - channel_dumpstats(LOG_DEBUG); - - /* Assert that we hit the mock */ - tt_int_op(dump_statistics_mock_matches, OP_EQ, 1); - - /* Close the channel */ - channel_mark_for_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); - - /* Try again and hit the finished channel */ - channel_dumpstats(LOG_DEBUG); - tt_int_op(dump_statistics_mock_matches, OP_EQ, 2); - - channel_run_cleanup(); - ch = NULL; - - /* Now we should hit nothing */ - channel_dumpstats(LOG_DEBUG); - tt_int_op(dump_statistics_mock_matches, OP_EQ, 2); - - /* Unmock */ - UNMOCK(channel_dump_statistics); - dump_statistics_mock_target = NULL; - dump_statistics_mock_matches = 0; - - /* Now make another channel */ - ch = new_fake_channel(); - tt_assert(ch); - channel_register(ch); - tt_int_op(ch->registered, OP_EQ, 1); - /* Lie about its age so dumpstats gets coverage for rate calculations */ - ch->timestamp_created = time(NULL) - 30; - tt_int_op(ch->timestamp_created, OP_GT, 0); - tt_int_op(time(NULL), OP_GT, ch->timestamp_created); - - /* Put cells through it both ways to make the counters non-zero */ - p_cell = packed_cell_new(); - test_chan_accept_cells = 1; - old_count = test_cells_written; - channel_write_packed_cell(ch, p_cell); - tt_int_op(test_cells_written, OP_EQ, old_count + 1); - tt_u64_op(ch->n_bytes_xmitted, OP_GT, 0); - tt_u64_op(ch->n_cells_xmitted, OP_GT, 0); - - /* Receive path */ - channel_set_cell_handlers(ch, - chan_test_cell_handler, - chan_test_var_cell_handler); - tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, chan_test_cell_handler); - tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ, - chan_test_var_cell_handler); - cell = tor_malloc_zero(sizeof(*cell)); - old_count = test_chan_fixed_cells_recved; - channel_process_cell(ch, cell); - tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1); - tt_u64_op(ch->n_bytes_recved, OP_GT, 0); - tt_u64_op(ch->n_cells_recved, OP_GT, 0); - - /* Test channel_dump_statistics */ - ch->describe_transport = chan_test_describe_transport; - ch->dumpstats = chan_test_dumpstats; - test_chan_should_be_canonical = 1; - ch->is_canonical = test_chan_is_canonical; - old_count = test_dumpstats_calls; - channel_dump_statistics(ch, LOG_DEBUG); - tt_int_op(test_dumpstats_calls, OP_EQ, old_count + 1); - - /* Close the channel */ - channel_mark_for_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); - channel_run_cleanup(); - ch = NULL; - - done: - free_fake_channel(ch); - tor_free(cell); - - UNMOCK(scheduler_channel_doesnt_want_writes); - UNMOCK(scheduler_release_channel); - - return; -} - -/* Test outbound cell. The callstack is: - * channel_flush_some_cells() - * -> channel_flush_from_first_active_circuit() - * -> channel_write_packed_cell() - * -> write_packed_cell() - * -> chan->write_packed_cell() fct ptr. - * - * This test goes from a cell in a circuit up to the channel write handler - * that should put them on the connection outbuf. */ -static void -test_channel_outbound_cell(void *arg) -{ - int old_count; - channel_t *chan = NULL; - packed_cell_t *p_cell = NULL, *p_cell2 = NULL; - origin_circuit_t *circ = NULL; - cell_queue_t *queue; - - (void) arg; - - /* The channel will be freed so we need to hijack this so the scheduler - * doesn't get confused. */ - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - - /* Accept cells to lower layer */ - test_chan_accept_cells = 1; - - /* Setup a valid circuit to queue a cell. */ - circ = origin_circuit_new(); - tt_assert(circ); - /* Circuit needs an origin purpose to be considered origin. */ - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; - TO_CIRCUIT(circ)->n_circ_id = 42; - /* This is the outbound test so use the next channel queue. */ - queue = &TO_CIRCUIT(circ)->n_chan_cells; - /* Setup packed cell to queue on the circuit. */ - p_cell = packed_cell_new(); - tt_assert(p_cell); - p_cell2 = packed_cell_new(); - tt_assert(p_cell2); - /* Setup a channel to put the circuit on. */ - chan = new_fake_channel(); - tt_assert(chan); - chan->state = CHANNEL_STATE_OPENING; - channel_change_state_open(chan); - /* Outbound channel. */ - channel_mark_outgoing(chan); - /* Try to register it so we can clean it through the channel cleanup - * process. */ - channel_register(chan); - tt_int_op(chan->registered, OP_EQ, 1); - /* Set EWMA policy so we can pick it when flushing. */ - channel_set_cmux_policy_everywhere(&ewma_policy); - tt_ptr_op(circuitmux_get_policy(chan->cmux), OP_EQ, &ewma_policy); - - /* Register circuit to the channel circid map which will attach the circuit - * to the channel's cmux as well. */ - circuit_set_n_circid_chan(TO_CIRCUIT(circ), 42, chan); - tt_int_op(channel_num_circuits(chan), OP_EQ, 1); - tt_assert(!TO_CIRCUIT(circ)->next_active_on_n_chan); - tt_assert(!TO_CIRCUIT(circ)->prev_active_on_n_chan); - /* Test the cmux state. */ - tt_ptr_op(TO_CIRCUIT(circ)->n_mux, OP_EQ, chan->cmux); - tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 1); - - /* Flush the channel without any cell on it. */ - old_count = test_cells_written; - ssize_t flushed = channel_flush_some_cells(chan, 1); - tt_i64_op(flushed, OP_EQ, 0); - tt_int_op(test_cells_written, OP_EQ, old_count); - tt_int_op(channel_more_to_flush(chan), OP_EQ, 0); - tt_int_op(circuitmux_num_active_circuits(chan->cmux), OP_EQ, 0); - tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 0); - tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 0); - tt_u64_op(chan->n_cells_xmitted, OP_EQ, 0); - tt_u64_op(chan->n_bytes_xmitted, OP_EQ, 0); - - /* Queue cell onto the next queue that is the outbound direction. Than - * update its cmux so the circuit can be picked when flushing cells. */ - cell_queue_append(queue, p_cell); - p_cell = NULL; - tt_int_op(queue->n, OP_EQ, 1); - cell_queue_append(queue, p_cell2); - p_cell2 = NULL; - tt_int_op(queue->n, OP_EQ, 2); - - update_circuit_on_cmux(TO_CIRCUIT(circ), CELL_DIRECTION_OUT); - tt_int_op(circuitmux_num_active_circuits(chan->cmux), OP_EQ, 1); - tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 2); - tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 1); - - /* From this point on, we have a queued cell on an active circuit attached - * to the channel's cmux. */ - - /* Flush the first cell. This is going to go down the call stack. */ - old_count = test_cells_written; - flushed = channel_flush_some_cells(chan, 1); - tt_i64_op(flushed, OP_EQ, 1); - tt_int_op(test_cells_written, OP_EQ, old_count + 1); - tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 1); - tt_int_op(channel_more_to_flush(chan), OP_EQ, 1); - /* Circuit should remain active because there is a second cell queued. */ - tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 1); - /* Should still be attached. */ - tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 1); - tt_u64_op(chan->n_cells_xmitted, OP_EQ, 1); - tt_u64_op(chan->n_bytes_xmitted, OP_EQ, get_cell_network_size(0)); - - /* Flush second cell. This is going to go down the call stack. */ - old_count = test_cells_written; - flushed = channel_flush_some_cells(chan, 1); - tt_i64_op(flushed, OP_EQ, 1); - tt_int_op(test_cells_written, OP_EQ, old_count + 1); - tt_int_op(circuitmux_num_cells(chan->cmux), OP_EQ, 0); - tt_int_op(channel_more_to_flush(chan), OP_EQ, 0); - /* No more cells should make the circuit inactive. */ - tt_int_op(circuitmux_is_circuit_active(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 0); - /* Should still be attached. */ - tt_int_op(circuitmux_is_circuit_attached(chan->cmux, TO_CIRCUIT(circ)), - OP_EQ, 1); - tt_u64_op(chan->n_cells_xmitted, OP_EQ, 2); - tt_u64_op(chan->n_bytes_xmitted, OP_EQ, get_cell_network_size(0) * 2); - - done: - if (circ) { - circuit_free_(TO_CIRCUIT(circ)); - } - tor_free(p_cell); - channel_free_all(); - UNMOCK(scheduler_release_channel); -} - -/* Test inbound cell. The callstack is: - * channel_process_cell() - * -> chan->cell_handler() - * - * This test is about checking if we can process an inbound cell down to the - * channel handler. */ -static void -test_channel_inbound_cell(void *arg) -{ - channel_t *chan = NULL; - cell_t *cell = NULL; - int old_count; - - (void) arg; - - /* The channel will be freed so we need to hijack this so the scheduler - * doesn't get confused. */ - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - - /* Accept cells to lower layer */ - test_chan_accept_cells = 1; - - chan = new_fake_channel(); - tt_assert(chan); - /* Start it off in OPENING */ - chan->state = CHANNEL_STATE_OPENING; - - /* Try to register it */ - channel_register(chan); - tt_int_op(chan->registered, OP_EQ, 1); - - /* Open it */ - channel_change_state_open(chan); - tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_OPEN); - tt_int_op(chan->has_been_open, OP_EQ, 1); - - /* Receive a cell now. */ - cell = tor_malloc_zero(sizeof(*cell)); - make_fake_cell(cell); - old_count = test_chan_fixed_cells_recved; - channel_process_cell(chan, cell); - tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count); - tt_assert(monotime_coarse_is_zero(&chan->timestamp_xfer)); - tt_u64_op(chan->timestamp_active, OP_EQ, 0); - tt_u64_op(chan->timestamp_recv, OP_EQ, 0); - - /* Setup incoming cell handlers. We don't care about var cell, the channel - * layers is not handling those. */ - channel_set_cell_handlers(chan, chan_test_cell_handler, NULL); - tt_ptr_op(chan->cell_handler, OP_EQ, chan_test_cell_handler); - /* Now process the cell, we should see it. */ - old_count = test_chan_fixed_cells_recved; - channel_process_cell(chan, cell); - tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1); - /* We should have a series of timestamp set. */ - tt_assert(!monotime_coarse_is_zero(&chan->timestamp_xfer)); - tt_u64_op(chan->timestamp_active, OP_NE, 0); - tt_u64_op(chan->timestamp_recv, OP_NE, 0); - tt_assert(monotime_coarse_is_zero(&chan->next_padding_time)); - tt_u64_op(chan->n_cells_recved, OP_EQ, 1); - tt_u64_op(chan->n_bytes_recved, OP_EQ, get_cell_network_size(0)); - - /* Close it */ - old_count = test_close_called; - channel_mark_for_close(chan); - tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_CLOSING); - tt_int_op(chan->reason_for_closing, OP_EQ, CHANNEL_CLOSE_REQUESTED); - tt_int_op(test_close_called, OP_EQ, old_count + 1); - - /* This closes the channe so it calls in the scheduler, make sure of it. */ - old_count = test_releases_count; - chan_test_finish_close(chan); - tt_int_op(test_releases_count, OP_EQ, old_count + 1); - tt_int_op(chan->state, OP_EQ, CHANNEL_STATE_CLOSED); - - /* The channel will be free, lets make sure it is not accessible. */ - uint64_t chan_id = chan->global_identifier; - tt_ptr_op(channel_find_by_global_id(chan_id), OP_EQ, chan); - channel_run_cleanup(); - chan = channel_find_by_global_id(chan_id); - tt_assert(chan == NULL); - - done: - tor_free(cell); - UNMOCK(scheduler_release_channel); -} - -/** - * Normal channel lifecycle test: - * - * OPENING->OPEN->MAINT->OPEN->CLOSING->CLOSED - */ - -static void -test_channel_lifecycle(void *arg) -{ - channel_t *ch1 = NULL, *ch2 = NULL; - packed_cell_t *p_cell = NULL; - int old_count, init_doesnt_want_writes_count; - int init_releases_count; - - (void)arg; - - /* Mock these for the whole lifecycle test */ - MOCK(scheduler_channel_doesnt_want_writes, - scheduler_channel_doesnt_want_writes_mock); - MOCK(scheduler_release_channel, - scheduler_release_channel_mock); - - /* Cache some initial counter values */ - init_doesnt_want_writes_count = test_doesnt_want_writes_count; - init_releases_count = test_releases_count; - - /* Accept cells to lower layer */ - test_chan_accept_cells = 1; - - ch1 = new_fake_channel(); - tt_assert(ch1); - /* Start it off in OPENING */ - ch1->state = CHANNEL_STATE_OPENING; - - /* Try to register it */ - channel_register(ch1); - tt_assert(ch1->registered); - - /* Try to write a cell through (should queue) */ - p_cell = packed_cell_new(); - old_count = test_cells_written; - channel_write_packed_cell(ch1, p_cell); - tt_int_op(old_count, OP_EQ, test_cells_written); - - /* Move it to OPEN and flush */ - channel_change_state_open(ch1); - -/* Get another one */ - ch2 = new_fake_channel(); - tt_assert(ch2); - ch2->state = CHANNEL_STATE_OPENING; - - /* Register */ - channel_register(ch2); - tt_assert(ch2->registered); - - /* Check counters */ - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count); - tt_int_op(test_releases_count, OP_EQ, init_releases_count); - - /* Move ch1 to MAINT */ - channel_change_state(ch1, CHANNEL_STATE_MAINT); - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count + 1); - tt_int_op(test_releases_count, OP_EQ, init_releases_count); - - /* Move ch2 to OPEN */ - channel_change_state_open(ch2); - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count + 1); - tt_int_op(test_releases_count, OP_EQ, init_releases_count); - - /* Move ch1 back to OPEN */ - channel_change_state_open(ch1); - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count + 1); - tt_int_op(test_releases_count, OP_EQ, init_releases_count); - - /* Mark ch2 for close */ - channel_mark_for_close(ch2); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count + 1); - tt_int_op(test_releases_count, OP_EQ, init_releases_count + 1); - - /* Shut down channels */ - channel_free_all(); - ch1 = ch2 = NULL; - tt_int_op(test_doesnt_want_writes_count, OP_EQ, - init_doesnt_want_writes_count + 1); - /* channel_free() calls scheduler_release_channel() */ - tt_int_op(test_releases_count, OP_EQ, init_releases_count + 4); - - done: - free_fake_channel(ch1); - free_fake_channel(ch2); - - UNMOCK(scheduler_channel_doesnt_want_writes); - UNMOCK(scheduler_release_channel); -} - -/** - * Weird channel lifecycle test: - * - * OPENING->CLOSING->CLOSED - * OPENING->OPEN->CLOSING->ERROR - * OPENING->OPEN->MAINT->CLOSING->CLOSED - * OPENING->OPEN->MAINT->CLOSING->ERROR - */ - -static void -test_channel_lifecycle_2(void *arg) -{ - channel_t *ch = NULL; - - (void)arg; - - /* Mock these for the whole lifecycle test */ - MOCK(scheduler_channel_doesnt_want_writes, - scheduler_channel_doesnt_want_writes_mock); - MOCK(scheduler_release_channel, - scheduler_release_channel_mock); - - /* Accept cells to lower layer */ - test_chan_accept_cells = 1; - - ch = new_fake_channel(); - tt_assert(ch); - /* Start it off in OPENING */ - ch->state = CHANNEL_STATE_OPENING; - - /* Try to register it */ - channel_register(ch); - tt_assert(ch->registered); - - /* Try to close it */ - channel_mark_for_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - - /* Finish closing it */ - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); - channel_run_cleanup(); - ch = NULL; - - /* Now try OPENING->OPEN->CLOSING->ERROR */ - ch = new_fake_channel(); - tt_assert(ch); - ch->state = CHANNEL_STATE_OPENING; - channel_register(ch); - tt_assert(ch->registered); - - /* Finish opening it */ - channel_change_state_open(ch); - - /* Error exit from lower layer */ - chan_test_error(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR); - channel_run_cleanup(); - ch = NULL; - - /* OPENING->OPEN->MAINT->CLOSING->CLOSED close from maintenance state */ - ch = new_fake_channel(); - tt_assert(ch); - ch->state = CHANNEL_STATE_OPENING; - channel_register(ch); - tt_assert(ch->registered); - - /* Finish opening it */ - channel_change_state_open(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); - - /* Go to maintenance state */ - channel_change_state(ch, CHANNEL_STATE_MAINT); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); - - /* Lower layer close */ - channel_mark_for_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - - /* Finish */ - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); - channel_run_cleanup(); - ch = NULL; - - /* - * OPENING->OPEN->MAINT->CLOSING->CLOSED lower-layer close during - * maintenance state - */ - ch = new_fake_channel(); - tt_assert(ch); - ch->state = CHANNEL_STATE_OPENING; - channel_register(ch); - tt_assert(ch->registered); - - /* Finish opening it */ - channel_change_state_open(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); - - /* Go to maintenance state */ - channel_change_state(ch, CHANNEL_STATE_MAINT); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); - - /* Lower layer close */ - channel_close_from_lower_layer(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - - /* Finish */ - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED); - channel_run_cleanup(); - ch = NULL; - - /* OPENING->OPEN->MAINT->CLOSING->ERROR */ - ch = new_fake_channel(); - tt_assert(ch); - ch->state = CHANNEL_STATE_OPENING; - channel_register(ch); - tt_assert(ch->registered); - - /* Finish opening it */ - channel_change_state_open(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN); - - /* Go to maintenance state */ - channel_change_state(ch, CHANNEL_STATE_MAINT); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT); - - /* Lower layer close */ - chan_test_error(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING); - - /* Finish */ - chan_test_finish_close(ch); - tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR); - channel_run_cleanup(); - ch = NULL; - - /* Shut down channels */ - channel_free_all(); - - done: - tor_free(ch); - - UNMOCK(scheduler_channel_doesnt_want_writes); - UNMOCK(scheduler_release_channel); - - return; -} - -static void -test_channel_id_map(void *arg) -{ - (void)arg; -#define N_CHAN 6 - char rsa_id[N_CHAN][DIGEST_LEN]; - ed25519_public_key_t *ed_id[N_CHAN]; - channel_t *chan[N_CHAN]; - int i; - ed25519_public_key_t ed_zero; - memset(&ed_zero, 0, sizeof(ed_zero)); - - tt_int_op(DIGEST_LEN, OP_EQ, sizeof(rsa_id[0])); // Do I remember C? - - for (i = 0; i < N_CHAN; ++i) { - crypto_rand(rsa_id[i], DIGEST_LEN); - ed_id[i] = tor_malloc_zero(sizeof(*ed_id[i])); - crypto_rand((char*)ed_id[i]->pubkey, sizeof(ed_id[i]->pubkey)); - } - - /* For channel 3, have no Ed identity. */ - tor_free(ed_id[3]); - - /* Channel 2 and 4 have same ROSA identity */ - memcpy(rsa_id[4], rsa_id[2], DIGEST_LEN); - - /* Channel 2 and 4 and 5 have same RSA identity */ - memcpy(rsa_id[4], rsa_id[2], DIGEST_LEN); - memcpy(rsa_id[5], rsa_id[2], DIGEST_LEN); - - /* Channels 2 and 5 have same Ed25519 identity */ - memcpy(ed_id[5], ed_id[2], sizeof(*ed_id[2])); - - for (i = 0; i < N_CHAN; ++i) { - chan[i] = new_fake_channel(); - channel_register(chan[i]); - channel_set_identity_digest(chan[i], rsa_id[i], ed_id[i]); - } - - /* Lookup by RSA id only */ - tt_ptr_op(chan[0], OP_EQ, - channel_find_by_remote_identity(rsa_id[0], NULL)); - tt_ptr_op(chan[1], OP_EQ, - channel_find_by_remote_identity(rsa_id[1], NULL)); - tt_ptr_op(chan[3], OP_EQ, - channel_find_by_remote_identity(rsa_id[3], NULL)); - channel_t *ch; - ch = channel_find_by_remote_identity(rsa_id[2], NULL); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_ptr_op(ch, OP_EQ, NULL); - - /* As above, but with zero Ed25519 ID (meaning "any ID") */ - tt_ptr_op(chan[0], OP_EQ, - channel_find_by_remote_identity(rsa_id[0], &ed_zero)); - tt_ptr_op(chan[1], OP_EQ, - channel_find_by_remote_identity(rsa_id[1], &ed_zero)); - tt_ptr_op(chan[3], OP_EQ, - channel_find_by_remote_identity(rsa_id[3], &ed_zero)); - ch = channel_find_by_remote_identity(rsa_id[2], &ed_zero); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]); - ch = channel_next_with_rsa_identity(ch); - tt_ptr_op(ch, OP_EQ, NULL); - - /* Lookup nonexistent RSA identity */ - tt_ptr_op(NULL, OP_EQ, - channel_find_by_remote_identity("!!!!!!!!!!!!!!!!!!!!", NULL)); - - /* Look up by full identity pair */ - tt_ptr_op(chan[0], OP_EQ, - channel_find_by_remote_identity(rsa_id[0], ed_id[0])); - tt_ptr_op(chan[1], OP_EQ, - channel_find_by_remote_identity(rsa_id[1], ed_id[1])); - tt_ptr_op(chan[3], OP_EQ, - channel_find_by_remote_identity(rsa_id[3], ed_id[3] /*NULL*/)); - tt_ptr_op(chan[4], OP_EQ, - channel_find_by_remote_identity(rsa_id[4], ed_id[4])); - ch = channel_find_by_remote_identity(rsa_id[2], ed_id[2]); - tt_assert(ch == chan[2] || ch == chan[5]); - - /* Look up RSA identity with wrong ed25519 identity */ - tt_ptr_op(NULL, OP_EQ, - channel_find_by_remote_identity(rsa_id[4], ed_id[0])); - tt_ptr_op(NULL, OP_EQ, - channel_find_by_remote_identity(rsa_id[2], ed_id[1])); - tt_ptr_op(NULL, OP_EQ, - channel_find_by_remote_identity(rsa_id[3], ed_id[1])); - - done: - for (i = 0; i < N_CHAN; ++i) { - channel_clear_identity_digest(chan[i]); - channel_unregister(chan[i]); - free_fake_channel(chan[i]); - tor_free(ed_id[i]); - } -#undef N_CHAN -} - -static void -test_channel_state(void *arg) -{ - (void) arg; - - /* Test state validity. */ - tt_int_op(channel_state_is_valid(CHANNEL_STATE_CLOSED), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_CLOSING), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_OPEN), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_OPENING), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_MAINT), OP_EQ, 1); - tt_int_op(channel_state_is_valid(CHANNEL_STATE_LAST), OP_EQ, 0); - tt_int_op(channel_state_is_valid(INT_MAX), OP_EQ, 0); - - /* Test listener state validity. */ - tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_CLOSED), - OP_EQ, 1); - tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_LISTENING), - OP_EQ, 1); - tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_CLOSING), - OP_EQ, 1); - tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_ERROR), - OP_EQ, 1); - tt_int_op(channel_listener_state_is_valid(CHANNEL_LISTENER_STATE_LAST), - OP_EQ, 0); - tt_int_op(channel_listener_state_is_valid(INT_MAX), OP_EQ, 0); - - /* Test state transition. */ - tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSED, - CHANNEL_STATE_OPENING), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSED, - CHANNEL_STATE_ERROR), OP_EQ, 0); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, - CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, - CHANNEL_STATE_CLOSED), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_CLOSING, - CHANNEL_STATE_OPEN), OP_EQ, 0); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, - CHANNEL_STATE_CLOSING), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, - CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, - CHANNEL_STATE_OPEN), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_MAINT, - CHANNEL_STATE_OPENING), OP_EQ, 0); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, - CHANNEL_STATE_OPEN), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, - CHANNEL_STATE_CLOSING), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPENING, - CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, - CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, - CHANNEL_STATE_CLOSING), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, - CHANNEL_STATE_ERROR), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_OPEN, - CHANNEL_STATE_MAINT), OP_EQ, 1); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_LAST, - CHANNEL_STATE_MAINT), OP_EQ, 0); - tt_int_op(channel_state_can_transition(CHANNEL_STATE_LAST, INT_MAX), - OP_EQ, 0); - - /* Test listener state transition. */ - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_CLOSED, - CHANNEL_LISTENER_STATE_LISTENING), - OP_EQ, 1); - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_CLOSED, - CHANNEL_LISTENER_STATE_ERROR), - OP_EQ, 0); - - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_CLOSING, - CHANNEL_LISTENER_STATE_CLOSED), - OP_EQ, 1); - - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_CLOSING, - CHANNEL_LISTENER_STATE_ERROR), - OP_EQ, 1); - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_ERROR, - CHANNEL_LISTENER_STATE_CLOSING), - OP_EQ, 0); - - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_LISTENING, - CHANNEL_LISTENER_STATE_CLOSING), - OP_EQ, 1); - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_LISTENING, - CHANNEL_LISTENER_STATE_ERROR), - OP_EQ, 1); - tt_int_op(channel_listener_state_can_transition( - CHANNEL_LISTENER_STATE_LAST, - INT_MAX), - OP_EQ, 0); - - /* Test state string. */ - tt_str_op(channel_state_to_string(CHANNEL_STATE_CLOSING), OP_EQ, - "closing"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_ERROR), OP_EQ, - "channel error"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_CLOSED), OP_EQ, - "closed"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_OPEN), OP_EQ, - "open"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_OPENING), OP_EQ, - "opening"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_MAINT), OP_EQ, - "temporarily suspended for maintenance"); - tt_str_op(channel_state_to_string(CHANNEL_STATE_LAST), OP_EQ, - "unknown or invalid channel state"); - tt_str_op(channel_state_to_string(INT_MAX), OP_EQ, - "unknown or invalid channel state"); - - /* Test listener state string. */ - tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_CLOSING), - OP_EQ, "closing"); - tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_ERROR), - OP_EQ, "channel listener error"); - tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_LISTENING), - OP_EQ, "listening"); - tt_str_op(channel_listener_state_to_string(CHANNEL_LISTENER_STATE_LAST), - OP_EQ, "unknown or invalid channel listener state"); - tt_str_op(channel_listener_state_to_string(INT_MAX), - OP_EQ, "unknown or invalid channel listener state"); - - done: - ; -} - -static networkstatus_t *mock_ns = NULL; - -static networkstatus_t * -mock_networkstatus_get_latest_consensus(void) -{ - return mock_ns; -} - -static void -test_channel_duplicates(void *arg) -{ - channel_t *chan = NULL; - routerstatus_t rs; - - (void) arg; - - setup_full_capture_of_logs(LOG_INFO); - /* Try a flat call with channel nor connections. */ - channel_check_for_duplicates(); - expect_log_msg_containing( - "Found 0 connections to 0 relays. Found 0 current canonical " - "connections, in 0 of which we were a non-canonical peer. " - "0 relays had more than 1 connection, 0 had more than 2, and " - "0 had more than 4 connections."); - - mock_ns = tor_malloc_zero(sizeof(*mock_ns)); - mock_ns->routerstatus_list = smartlist_new(); - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus); - - chan = new_fake_channel(); - tt_assert(chan); - chan->is_canonical = test_chan_is_canonical; - memset(chan->identity_digest, 'A', sizeof(chan->identity_digest)); - channel_add_to_digest_map(chan); - tt_ptr_op(channel_find_by_remote_identity(chan->identity_digest, NULL), - OP_EQ, chan); - - /* No relay has been associated with this channel. */ - channel_check_for_duplicates(); - expect_log_msg_containing( - "Found 0 connections to 0 relays. Found 0 current canonical " - "connections, in 0 of which we were a non-canonical peer. " - "0 relays had more than 1 connection, 0 had more than 2, and " - "0 had more than 4 connections."); - - /* Associate relay to this connection in the consensus. */ - memset(&rs, 0, sizeof(rs)); - memset(rs.identity_digest, 'A', sizeof(rs.identity_digest)); - smartlist_add(mock_ns->routerstatus_list, &rs); - - /* Non opened channel. */ - chan->state = CHANNEL_STATE_CLOSING; - channel_check_for_duplicates(); - expect_log_msg_containing( - "Found 0 connections to 0 relays. Found 0 current canonical " - "connections, in 0 of which we were a non-canonical peer. " - "0 relays had more than 1 connection, 0 had more than 2, and " - "0 had more than 4 connections."); - chan->state = CHANNEL_STATE_OPEN; - - channel_check_for_duplicates(); - expect_log_msg_containing( - "Found 1 connections to 1 relays. Found 0 current canonical " - "connections, in 0 of which we were a non-canonical peer. " - "0 relays had more than 1 connection, 0 had more than 2, and " - "0 had more than 4 connections."); - - test_chan_should_be_canonical = 1; - channel_check_for_duplicates(); - expect_log_msg_containing( - "Found 1 connections to 1 relays. Found 1 current canonical " - "connections, in 1 of which we were a non-canonical peer. " - "0 relays had more than 1 connection, 0 had more than 2, and " - "0 had more than 4 connections."); - teardown_capture_of_logs(); - - done: - free_fake_channel(chan); - smartlist_clear(mock_ns->routerstatus_list); - networkstatus_vote_free(mock_ns); - UNMOCK(networkstatus_get_latest_consensus); -} - -static void -test_channel_for_extend(void *arg) -{ - channel_t *chan1 = NULL, *chan2 = NULL; - channel_t *ret_chan = NULL; - char digest[DIGEST_LEN]; - ed25519_public_key_t ed_id; - tor_addr_t addr; - const char *msg; - int launch; - time_t now = time(NULL); - - (void) arg; - - memset(digest, 'A', sizeof(digest)); - memset(&ed_id, 'B', sizeof(ed_id)); - - chan1 = new_fake_channel(); - tt_assert(chan1); - /* Need to be registered to get added to the id map. */ - channel_register(chan1); - tt_int_op(chan1->registered, OP_EQ, 1); - /* We need those for the test. */ - chan1->is_canonical = test_chan_is_canonical; - chan1->matches_target = test_chan_matches_target; - chan1->timestamp_created = now - 9; - - chan2 = new_fake_channel(); - tt_assert(chan2); - /* Need to be registered to get added to the id map. */ - channel_register(chan2); - tt_int_op(chan2->registered, OP_EQ, 1); - /* We need those for the test. */ - chan2->is_canonical = test_chan_is_canonical; - chan2->matches_target = test_chan_matches_target; - /* Make it older than chan1. */ - chan2->timestamp_created = chan1->timestamp_created - 1; - - /* Set channel identities and add it to the channel map. The last one to be - * added is made the first one in the list so the lookup will always return - * that one first. */ - channel_set_identity_digest(chan2, digest, &ed_id); - channel_set_identity_digest(chan1, digest, &ed_id); - tt_ptr_op(channel_find_by_remote_identity(digest, NULL), OP_EQ, chan1); - tt_ptr_op(channel_find_by_remote_identity(digest, &ed_id), OP_EQ, chan1); - - /* The expected result is chan2 because it is older than chan1. */ - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan2); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - - /* Switch that around from previous test. */ - chan2->timestamp_created = chan1->timestamp_created + 1; - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan1); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - - /* Same creation time, num circuits will be used and they both have 0 so the - * channel 2 should be picked due to how channel_is_better() work. */ - chan2->timestamp_created = chan1->timestamp_created; - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan1); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - - /* For the rest of the tests, we need channel 1 to be the older. */ - chan2->timestamp_created = chan1->timestamp_created + 1; - - /* Condemned the older channel. */ - chan1->state = CHANNEL_STATE_CLOSING; - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan2); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - chan1->state = CHANNEL_STATE_OPEN; - - /* Make the older channel a client one. */ - channel_mark_client(chan1); - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan2); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - channel_clear_client(chan1); - - /* Non matching ed identity with valid digest. */ - ed25519_public_key_t dumb_ed_id; - memset(&dumb_ed_id, 0, sizeof(dumb_ed_id)); - ret_chan = channel_get_for_extend(digest, &dumb_ed_id, &addr, &msg, - &launch); - tt_assert(!ret_chan); - tt_str_op(msg, OP_EQ, "Not connected. Connecting."); - tt_int_op(launch, OP_EQ, 1); - - /* Opening channel, we'll check if the target address matches. */ - test_chan_should_match_target = 1; - chan1->state = CHANNEL_STATE_OPENING; - chan2->state = CHANNEL_STATE_OPENING; - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(!ret_chan); - tt_str_op(msg, OP_EQ, "Connection in progress; waiting."); - tt_int_op(launch, OP_EQ, 0); - chan1->state = CHANNEL_STATE_OPEN; - chan2->state = CHANNEL_STATE_OPEN; - - /* Mark channel 1 as bad for circuits. */ - channel_mark_bad_for_new_circs(chan1); - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(ret_chan); - tt_ptr_op(ret_chan, OP_EQ, chan2); - tt_int_op(launch, OP_EQ, 0); - tt_str_op(msg, OP_EQ, "Connection is fine; using it."); - chan1->is_bad_for_new_circs = 0; - - /* Mark both channels as unusable. */ - channel_mark_bad_for_new_circs(chan1); - channel_mark_bad_for_new_circs(chan2); - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(!ret_chan); - tt_str_op(msg, OP_EQ, "Connections all too old, or too non-canonical. " - " Launching a new one."); - tt_int_op(launch, OP_EQ, 1); - chan1->is_bad_for_new_circs = 0; - chan2->is_bad_for_new_circs = 0; - - /* Non canonical channels. */ - test_chan_should_match_target = 0; - test_chan_canonical_should_be_reliable = 1; - ret_chan = channel_get_for_extend(digest, &ed_id, &addr, &msg, &launch); - tt_assert(!ret_chan); - tt_str_op(msg, OP_EQ, "Connections all too old, or too non-canonical. " - " Launching a new one."); - tt_int_op(launch, OP_EQ, 1); - - done: - free_fake_channel(chan1); - free_fake_channel(chan2); -} - -static void -test_channel_listener(void *arg) -{ - int old_count; - time_t now = time(NULL); - channel_listener_t *chan = NULL; - - (void) arg; - - chan = tor_malloc_zero(sizeof(*chan)); - tt_assert(chan); - channel_init_listener(chan); - tt_u64_op(chan->global_identifier, OP_EQ, 1); - tt_int_op(chan->timestamp_created, OP_GE, now); - chan->close = test_chan_listener_close; - - /* Register it. At this point, it is not open so it will be put in the - * finished list. */ - channel_listener_register(chan); - tt_int_op(chan->registered, OP_EQ, 1); - channel_listener_unregister(chan); - - /* Register it as listening now thus active. */ - chan->state = CHANNEL_LISTENER_STATE_LISTENING; - channel_listener_register(chan); - tt_int_op(chan->registered, OP_EQ, 1); - - /* Set the listener function. */ - channel_listener_set_listener_fn(chan, test_chan_listener_fn); - tt_ptr_op(chan->listener, OP_EQ, test_chan_listener_fn); - - /* Put a channel in the listener incoming list and queue it. - * function. By doing this, the listener() handler will be called. */ - channel_t *in_chan = new_fake_channel(); - old_count = test_chan_listener_fn_called; - channel_listener_queue_incoming(chan, in_chan); - free_fake_channel(in_chan); - tt_int_op(test_chan_listener_fn_called, OP_EQ, old_count + 1); - - /* Put listener channel in CLOSING state. */ - old_count = test_chan_listener_close_fn_called; - channel_listener_mark_for_close(chan); - tt_int_op(test_chan_listener_close_fn_called, OP_EQ, old_count + 1); - channel_listener_change_state(chan, CHANNEL_LISTENER_STATE_CLOSED); - - /* Dump stats so we at least hit the code path. */ - chan->describe_transport = test_chan_listener_describe_transport; - /* There is a check for "now > timestamp_created" when dumping the stats so - * make sure we go in. */ - chan->timestamp_created = now - 10; - channel_listener_dump_statistics(chan, LOG_INFO); - - done: - channel_free_all(); -} - -struct testcase_t channel_tests[] = { - { "inbound_cell", test_channel_inbound_cell, TT_FORK, - NULL, NULL }, - { "outbound_cell", test_channel_outbound_cell, TT_FORK, - NULL, NULL }, - { "id_map", test_channel_id_map, TT_FORK, - NULL, NULL }, - { "lifecycle", test_channel_lifecycle, TT_FORK, - NULL, NULL }, - { "lifecycle_2", test_channel_lifecycle_2, TT_FORK, - NULL, NULL }, - { "dumpstats", test_channel_dumpstats, TT_FORK, - NULL, NULL }, - { "state", test_channel_state, TT_FORK, - NULL, NULL }, - { "duplicates", test_channel_duplicates, TT_FORK, - NULL, NULL }, - { "get_channel_for_extend", test_channel_for_extend, TT_FORK, - NULL, NULL }, - { "listener", test_channel_listener, TT_FORK, - NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_channelpadding.c b/src/tor/src/test/test_channelpadding.c deleted file mode 100644 index 4cc33cbe7..000000000 --- a/src/tor/src/test/test_channelpadding.c +++ /dev/null @@ -1,1163 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define TOR_CHANNEL_INTERNAL_ -#define MAIN_PRIVATE -#define NETWORKSTATUS_PRIVATE -#define TOR_TIMERS_PRIVATE -#include "or.h" -#include "test.h" -#include "testsupport.h" -#include "connection.h" -#include "connection_or.h" -#include "channel.h" -#include "channeltls.h" -#include "channelpadding.h" -#include "compat_libevent.h" -#include "config.h" -#include -#include "compat_time.h" -#include "main.h" -#include "networkstatus.h" -#include "log_test_helpers.h" - -int channelpadding_get_netflow_inactive_timeout_ms(channel_t *chan); -int64_t channelpadding_compute_time_until_pad_for_netflow(channel_t *chan); -int channelpadding_send_disable_command(channel_t*); -int channelpadding_find_timerslot(channel_t *chan); - -void test_channelpadding_timers(void *arg); -void test_channelpadding_consensus(void *arg); -void test_channelpadding_negotiation(void *arg); -void test_channelpadding_decide_to_pad_channel(void *arg); -void test_channelpadding_killonehop(void *arg); - -void dummy_nop_timer(void); - -#define NSEC_PER_MSEC (1000*1000) - -/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */ -static int fake_tortls = 0; /* Bleh... */ - -static int dont_stop_libevent = 0; - -// From test_channel.c -channel_t * new_fake_channel(void); -void free_fake_channel(channel_t*); - -static int -mock_channel_has_queued_writes(channel_t *chan) -{ - (void)chan; - return 0; -} - -static int tried_to_write_cell = 0; - -static channel_t *relay1_relay2; -static channel_t *relay2_relay1; -static channel_t *relay3_client; -static channel_t *client_relay3; - -static int -mock_channel_write_cell_relay2(channel_t *chan, cell_t *cell) -{ - (void)chan; - tried_to_write_cell++; - channel_tls_handle_cell(cell, ((channel_tls_t*)relay1_relay2)->conn); - event_base_loopbreak(tor_libevent_get_base()); - return 0; -} - -static int -mock_channel_write_cell_relay1(channel_t *chan, cell_t *cell) -{ - (void)chan; - tried_to_write_cell++; - channel_tls_handle_cell(cell, ((channel_tls_t*)relay2_relay1)->conn); - event_base_loopbreak(tor_libevent_get_base()); - return 0; -} - -static int -mock_channel_write_cell_relay3(channel_t *chan, cell_t *cell) -{ - (void)chan; - tried_to_write_cell++; - channel_tls_handle_cell(cell, ((channel_tls_t*)client_relay3)->conn); - event_base_loopbreak(tor_libevent_get_base()); - return 0; -} - -static int -mock_channel_write_cell_client(channel_t *chan, cell_t *cell) -{ - (void)chan; - tried_to_write_cell++; - channel_tls_handle_cell(cell, ((channel_tls_t*)relay3_client)->conn); - event_base_loopbreak(tor_libevent_get_base()); - return 0; -} - -static int -mock_channel_write_cell(channel_t *chan, cell_t *cell) -{ - tried_to_write_cell++; - channel_tls_handle_cell(cell, ((channel_tls_t*)chan)->conn); - if (!dont_stop_libevent) - event_base_loopbreak(tor_libevent_get_base()); - return 0; -} - -static void -setup_fake_connection_for_channel(channel_tls_t *chan) -{ - or_connection_t *conn = (or_connection_t*)connection_new(CONN_TYPE_OR, - AF_INET); - - conn->base_.conn_array_index = smartlist_len(connection_array); - smartlist_add(connection_array, conn); - - conn->chan = chan; - chan->conn = conn; - - conn->base_.magic = OR_CONNECTION_MAGIC; - conn->base_.state = OR_CONN_STATE_OPEN; - conn->base_.type = CONN_TYPE_OR; - conn->base_.socket_family = AF_INET; - conn->base_.address = tor_strdup(""); - - conn->base_.port = 4242; - - conn->tls = (tor_tls_t *)((void *)(&fake_tortls)); - - conn->link_proto = MIN_LINK_PROTO_FOR_CHANNEL_PADDING; - - connection_or_set_canonical(conn, 1); -} - -static channel_tls_t * -new_fake_channeltls(uint8_t id) -{ - channel_tls_t *chan = tor_realloc(new_fake_channel(), sizeof(channel_tls_t)); - chan->base_.magic = TLS_CHAN_MAGIC; - setup_fake_connection_for_channel(chan); - chan->base_.channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; - chan->base_.has_queued_writes = mock_channel_has_queued_writes; - chan->base_.write_cell = mock_channel_write_cell; - chan->base_.padding_enabled = 1; - - chan->base_.identity_digest[0] = id; - channel_register(&chan->base_); - - return chan; -} - -static void -free_fake_channeltls(channel_tls_t *chan) -{ - channel_unregister(&chan->base_); - - tor_free(((channel_tls_t*)chan)->conn->base_.address); - buf_free(((channel_tls_t*)chan)->conn->base_.inbuf); - buf_free(((channel_tls_t*)chan)->conn->base_.outbuf); - tor_free(((channel_tls_t*)chan)->conn); - - timer_free(chan->base_.padding_timer); - channel_handle_free(chan->base_.timer_handle); - channel_handles_clear(&chan->base_); - - free_fake_channel(&chan->base_); - - return; -} - -static void -setup_mock_consensus(void) -{ - current_md_consensus = current_ns_consensus - = tor_malloc_zero(sizeof(networkstatus_t)); - current_md_consensus->net_params = smartlist_new(); - current_md_consensus->routerstatus_list = smartlist_new(); - channelpadding_new_consensus_params(current_md_consensus); -} - -static void -free_mock_consensus(void) -{ - SMARTLIST_FOREACH(current_md_consensus->routerstatus_list, void *, r, - tor_free(r)); - smartlist_free(current_md_consensus->routerstatus_list); - smartlist_free(current_ns_consensus->net_params); - tor_free(current_ns_consensus); -} - -static void -setup_mock_network(void) -{ - routerstatus_t *relay; - if (!connection_array) - connection_array = smartlist_new(); - - relay1_relay2 = (channel_t*)new_fake_channeltls(2); - relay1_relay2->write_cell = mock_channel_write_cell_relay1; - channel_timestamp_active(relay1_relay2); - relay = tor_malloc_zero(sizeof(routerstatus_t)); - relay->identity_digest[0] = 1; - smartlist_add(current_md_consensus->routerstatus_list, relay); - - relay2_relay1 = (channel_t*)new_fake_channeltls(1); - relay2_relay1->write_cell = mock_channel_write_cell_relay2; - channel_timestamp_active(relay2_relay1); - relay = tor_malloc_zero(sizeof(routerstatus_t)); - relay->identity_digest[0] = 2; - smartlist_add(current_md_consensus->routerstatus_list, relay); - - relay3_client = (channel_t*)new_fake_channeltls(0); - relay3_client->write_cell = mock_channel_write_cell_relay3; - relay3_client->is_client = 1; - channel_timestamp_active(relay3_client); - relay = tor_malloc_zero(sizeof(routerstatus_t)); - relay->identity_digest[0] = 3; - smartlist_add(current_md_consensus->routerstatus_list, relay); - - client_relay3 = (channel_t*)new_fake_channeltls(3); - client_relay3->write_cell = mock_channel_write_cell_client; - channel_timestamp_active(client_relay3); - - channel_do_open_actions(relay1_relay2); - channel_do_open_actions(relay2_relay1); - channel_do_open_actions(relay3_client); - channel_do_open_actions(client_relay3); -} - -static void -free_mock_network(void) -{ - free_fake_channeltls((channel_tls_t*)relay1_relay2); - free_fake_channeltls((channel_tls_t*)relay2_relay1); - free_fake_channeltls((channel_tls_t*)relay3_client); - free_fake_channeltls((channel_tls_t*)client_relay3); - - smartlist_free(connection_array); -} - -static void -dummy_timer_cb(tor_timer_t *t, void *arg, const monotime_t *now_mono) -{ - (void)t; (void)arg; (void)now_mono; - event_base_loopbreak(tor_libevent_get_base()); - return; -} - -// This hack adds a dummy timer so that the libevent base loop -// actually returns when we don't expect any timers to fire. Otherwise, -// the global_timer_event gets scheduled an hour from now, and the -// base loop never returns. -void -dummy_nop_timer(void) -{ - tor_timer_t *dummy_timer = timer_new(dummy_timer_cb, NULL); - struct timeval timeout; - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - timer_schedule(dummy_timer, &timeout); - - event_base_loop(tor_libevent_get_base(), 0); - timer_free(dummy_timer); -} - -#define CHANNELPADDING_MAX_TIMERS 25 -#define CHANNELS_TO_TEST (CHANNELPADDING_MAX_TIMERS*4) -/** - * Tests to ensure that we handle more than the max number of pending - * timers properly. - */ -void -test_channelpadding_timers(void *arg) -{ - channelpadding_decision_t decision; - channel_t *chans[CHANNELS_TO_TEST]; - (void)arg; - - tor_libevent_postfork(); - - if (!connection_array) - connection_array = smartlist_new(); - - monotime_init(); - monotime_enable_test_mocking(); - uint64_t nsec_mock = 1; - monotime_set_mock_time_nsec(nsec_mock); - monotime_coarse_set_mock_time_nsec(nsec_mock); - - timers_initialize(); - channelpadding_new_consensus_params(NULL); - - for (int i = 0; i < CHANNELS_TO_TEST; i++) { - chans[i] = (channel_t*)new_fake_channeltls(0); - channel_timestamp_active(chans[i]); - } - - for (int j = 0; j < 2; j++) { - tried_to_write_cell = 0; - int i = 0; - - monotime_coarse_t now; - monotime_coarse_get(&now); - - /* This loop fills our timerslot array with timers of increasing time - * until they fire */ - for (; i < CHANNELPADDING_MAX_TIMERS; i++) { - monotime_coarse_add_msec(&chans[i]->next_padding_time, - &now, 10 + i*4); - decision = channelpadding_decide_to_pad_channel(chans[i]); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chans[i]->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - } - - /* This loop should add timers to the first position in the timerslot - * array, since its timeout is before all other timers. */ - for (; i < CHANNELS_TO_TEST/3; i++) { - monotime_coarse_add_msec(&chans[i]->next_padding_time, - &now, 1); - decision = channelpadding_decide_to_pad_channel(chans[i]); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chans[i]->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - } - - /* This loop should add timers to our existing lists in a weak - * pseudorandom pattern. It ensures that the lists can grow with multiple - * timers in them. */ - for (; i < CHANNELS_TO_TEST/2; i++) { - monotime_coarse_add_msec(&chans[i]->next_padding_time, - &now, 10 + i*3 % CHANNELPADDING_MAX_TIMERS); - decision = channelpadding_decide_to_pad_channel(chans[i]); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chans[i]->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - } - - /* This loop should add timers to the last position in the timerslot - * array, since its timeout is after all other timers. */ - for (; i < CHANNELS_TO_TEST; i++) { - monotime_coarse_add_msec(&chans[i]->next_padding_time, - &now, 500 + i % CHANNELPADDING_MAX_TIMERS); - decision = channelpadding_decide_to_pad_channel(chans[i]); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chans[i]->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - } - - // Wait for the timers and then kill the event loop. - nsec_mock += 1001 * NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(nsec_mock); - monotime_set_mock_time_nsec(nsec_mock); - timers_run_pending(); - - tt_int_op(tried_to_write_cell, OP_EQ, CHANNELS_TO_TEST); - - // Test that we have no pending callbacks and all empty slots now - for (i = 0; i < CHANNELS_TO_TEST; i++) { - tt_assert(!chans[i]->pending_padding_callback); - } - } - - done: - for (int i = 0; i < CHANNELS_TO_TEST; i++) { - free_fake_channeltls((channel_tls_t*)chans[i]); - } - smartlist_free(connection_array); - - timers_shutdown(); - monotime_disable_test_mocking(); - channel_free_all(); - - return; -} - -void -test_channelpadding_killonehop(void *arg) -{ - channelpadding_decision_t decision; - int64_t new_time; - (void)arg; - tor_libevent_postfork(); - - routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t)); - monotime_init(); - monotime_enable_test_mocking(); - monotime_set_mock_time_nsec(1); - monotime_coarse_set_mock_time_nsec(1); - new_time = 1; - - timers_initialize(); - setup_mock_consensus(); - setup_mock_network(); - - /* Do we disable padding if tor2webmode or rsos are enabled, and - * the consensus says don't pad? */ - - /* Ensure we can kill tor2web and rsos padding if we want. */ - // First, test that padding works if either is enabled - smartlist_clear(current_md_consensus->net_params); - channelpadding_new_consensus_params(current_md_consensus); - - monotime_coarse_t now; - monotime_coarse_get(&now); - - tried_to_write_cell = 0; - get_options_mutable()->Tor2webMode = 1; - monotime_coarse_add_msec(&client_relay3->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(client_relay3->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); - - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!client_relay3->pending_padding_callback); - - // Then test disabling each via consensus param - smartlist_add(current_md_consensus->net_params, - (void*)"nf_pad_tor2web=0"); - channelpadding_new_consensus_params(current_md_consensus); - - // Before the client tries to pad, the relay will still pad: - tried_to_write_cell = 0; - monotime_coarse_add_msec(&relay3_client->next_padding_time, &now, 100); - get_options_mutable()->ORPort_set = 1; - get_options_mutable()->Tor2webMode = 0; - decision = channelpadding_decide_to_pad_channel(relay3_client); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(relay3_client->pending_padding_callback); - - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!client_relay3->pending_padding_callback); - - // Test client side (it should stop immediately, but send a negotiate) - tried_to_write_cell = 0; - tt_assert(relay3_client->padding_enabled); - tt_assert(client_relay3->padding_enabled); - get_options_mutable()->Tor2webMode = 1; - /* For the relay to recieve the negotiate: */ - get_options_mutable()->ORPort_set = 1; - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!client_relay3->pending_padding_callback); - tt_assert(!relay3_client->padding_enabled); - - // Test relay side (it should have gotten the negotiation to disable) - get_options_mutable()->ORPort_set = 1; - get_options_mutable()->Tor2webMode = 0; - tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, - CHANNELPADDING_WONTPAD); - tt_assert(!relay3_client->padding_enabled); - - /* Repeat for SOS */ - // First, test that padding works if either is enabled - smartlist_clear(current_md_consensus->net_params); - channelpadding_new_consensus_params(current_md_consensus); - - relay3_client->padding_enabled = 1; - client_relay3->padding_enabled = 1; - - tried_to_write_cell = 0; - get_options_mutable()->ORPort_set = 0; - get_options_mutable()->HiddenServiceSingleHopMode = 1; - get_options_mutable()->HiddenServiceNonAnonymousMode = 1; - - monotime_coarse_add_msec(&client_relay3->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(client_relay3->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); - - // Wait for the timer - new_time += 101 * NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!client_relay3->pending_padding_callback); - - // Then test disabling each via consensus param - smartlist_add(current_md_consensus->net_params, - (void*)"nf_pad_single_onion=0"); - channelpadding_new_consensus_params(current_md_consensus); - - // Before the client tries to pad, the relay will still pad: - tried_to_write_cell = 0; - monotime_coarse_add_msec(&relay3_client->next_padding_time, &now, 100); - get_options_mutable()->ORPort_set = 1; - get_options_mutable()->HiddenServiceSingleHopMode = 0; - get_options_mutable()->HiddenServiceNonAnonymousMode = 0; - decision = channelpadding_decide_to_pad_channel(relay3_client); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(relay3_client->pending_padding_callback); - - // Wait for the timer - new_time += 101 * NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!client_relay3->pending_padding_callback); - - // Test client side (it should stop immediately) - get_options_mutable()->HiddenServiceSingleHopMode = 1; - get_options_mutable()->HiddenServiceNonAnonymousMode = 1; - /* For the relay to recieve the negotiate: */ - get_options_mutable()->ORPort_set = 1; - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!client_relay3->pending_padding_callback); - - // Test relay side (it should have gotten the negotiation to disable) - get_options_mutable()->ORPort_set = 1; - get_options_mutable()->HiddenServiceSingleHopMode = 0; - get_options_mutable()->HiddenServiceNonAnonymousMode = 0; - tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, - CHANNELPADDING_WONTPAD); - tt_assert(!relay3_client->padding_enabled); - - done: - free_mock_consensus(); - free_mock_network(); - tor_free(relay); - - timers_shutdown(); - monotime_disable_test_mocking(); - channel_free_all(); -} - -void -test_channelpadding_consensus(void *arg) -{ - channelpadding_decision_t decision; - or_options_t *options = get_options_mutable(); - int64_t val; - int64_t new_time; - (void)arg; - - tor_libevent_postfork(); - - /* - * Params tested: - * nf_pad_before_usage - * nf_pad_relays - * nf_ito_low - * nf_ito_high - * - * Plan: - * 1. Padding can be completely disabled via consensus - * 2. Negotiation can't re-enable consensus-disabled padding - * 3. Negotiation can't increase padding from relays beyond - * consensus defaults - * 4. Relay-to-relay padding can be enabled/disabled in consensus - * 5. Can enable/disable padding before actually using a connection - * 6. Can we control circ and TLS conn lifetime from the consensus? - */ - channel_t *chan; - routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t)); - monotime_enable_test_mocking(); - monotime_set_mock_time_nsec(1); - monotime_coarse_set_mock_time_nsec(1); - new_time = 1; - monotime_coarse_t now; - monotime_coarse_get(&now); - timers_initialize(); - - if (!connection_array) - connection_array = smartlist_new(); - chan = (channel_t*)new_fake_channeltls(0); - channel_timestamp_active(chan); - - setup_mock_consensus(); - - get_options_mutable()->ORPort_set = 1; - - /* Test 1: Padding can be completely disabled via consensus */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); - - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_low=0"); - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_high=0"); - get_options_mutable()->ConnectionPadding = 1; - channelpadding_new_consensus_params(current_md_consensus); - - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!chan->pending_padding_callback); - val = channelpadding_get_netflow_inactive_timeout_ms(chan); - tt_i64_op(val, OP_EQ, 0); - val = channelpadding_compute_time_until_pad_for_netflow(chan); - tt_i64_op(val, OP_EQ, -2); - - /* Test 2: Negotiation can't re-enable consensus-disabled padding */ - channelpadding_send_enable_command(chan, 100, 200); - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!chan->pending_padding_callback); - val = channelpadding_get_netflow_inactive_timeout_ms(chan); - tt_i64_op(val, OP_EQ, 0); - val = channelpadding_compute_time_until_pad_for_netflow(chan); - tt_i64_op(val, OP_EQ, -2); - tt_assert(monotime_coarse_is_zero(&chan->next_padding_time)); - - smartlist_clear(current_md_consensus->net_params); - - /* Test 3: Negotiation can't increase padding from relays beyond consensus - * values */ - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_low=100"); - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_high=200"); - channelpadding_new_consensus_params(current_md_consensus); - - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - val = channelpadding_get_netflow_inactive_timeout_ms(chan); - tt_i64_op(val, OP_GE, 100); - tt_i64_op(val, OP_LE, 200); - val = channelpadding_compute_time_until_pad_for_netflow(chan); - tt_i64_op(val, OP_LE, 200); - - // Wait for the timer - new_time += 201*NSEC_PER_MSEC; - monotime_set_mock_time_nsec(new_time); - monotime_coarse_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - smartlist_clear(current_md_consensus->net_params); - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_low=1500"); - smartlist_add(current_md_consensus->net_params, - (void*)"nf_ito_high=4500"); - channelpadding_new_consensus_params(current_md_consensus); - - channelpadding_send_enable_command(chan, 100, 200); - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - tt_assert(!chan->pending_padding_callback); - val = channelpadding_get_netflow_inactive_timeout_ms(chan); - tt_i64_op(val, OP_GE, 1500); - tt_i64_op(val, OP_LE, 4500); - val = channelpadding_compute_time_until_pad_for_netflow(chan); - tt_i64_op(val, OP_LE, 4500); - - /* Test 4: Relay-to-relay padding can be enabled/disabled in consensus */ - /* Make this channel a relay's channel */ - memcpy(relay->identity_digest, - ((channel_tls_t *)chan)->conn->identity_digest, DIGEST_LEN); - smartlist_add(current_md_consensus->routerstatus_list, relay); - - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!chan->pending_padding_callback); - - smartlist_add(current_md_consensus->net_params, - (void*)"nf_pad_relays=1"); - channelpadding_new_consensus_params(current_md_consensus); - - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - tt_assert(!chan->pending_padding_callback); - val = channelpadding_get_netflow_inactive_timeout_ms(chan); - tt_i64_op(val, OP_GE, 1500); - tt_i64_op(val, OP_LE, 4500); - val = channelpadding_compute_time_until_pad_for_netflow(chan); - tt_i64_op(val, OP_LE, 4500); - - /* Test 5: If we disable padding before channel usage, does that work? */ - smartlist_add(current_md_consensus->net_params, - (void*)"nf_pad_before_usage=0"); - channelpadding_new_consensus_params(current_md_consensus); - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!chan->pending_padding_callback); - - /* Test 6: Can we control circ and TLS conn lifetime from the consensus? */ - val = channelpadding_get_channel_idle_timeout(NULL, 0); - tt_i64_op(val, OP_GE, 180); - tt_i64_op(val, OP_LE, 180+90); - val = channelpadding_get_channel_idle_timeout(chan, 0); - tt_i64_op(val, OP_GE, 180); - tt_i64_op(val, OP_LE, 180+90); - options->ReducedConnectionPadding = 1; - val = channelpadding_get_channel_idle_timeout(chan, 0); - tt_i64_op(val, OP_GE, 180/2); - tt_i64_op(val, OP_LE, (180+90)/2); - - options->ReducedConnectionPadding = 0; - options->ORPort_set = 1; - smartlist_add(current_md_consensus->net_params, - (void*)"nf_conntimeout_relays=600"); - channelpadding_new_consensus_params(current_md_consensus); - val = channelpadding_get_channel_idle_timeout(chan, 1); - tt_i64_op(val, OP_GE, 450); - tt_i64_op(val, OP_LE, 750); - - val = channelpadding_get_circuits_available_timeout(); - tt_i64_op(val, OP_GE, 30*60); - tt_i64_op(val, OP_LE, 30*60*2); - - options->ReducedConnectionPadding = 1; - smartlist_add(current_md_consensus->net_params, - (void*)"nf_conntimeout_clients=600"); - channelpadding_new_consensus_params(current_md_consensus); - val = channelpadding_get_circuits_available_timeout(); - tt_i64_op(val, OP_GE, 600/2); - tt_i64_op(val, OP_LE, 600*2/2); - - options->ReducedConnectionPadding = 0; - options->CircuitsAvailableTimeout = 24*60*60; - val = channelpadding_get_circuits_available_timeout(); - tt_i64_op(val, OP_GE, 24*60*60); - tt_i64_op(val, OP_LE, 24*60*60*2); - - done: - free_mock_consensus(); - free_fake_channeltls((channel_tls_t*)chan); - smartlist_free(connection_array); - - timers_shutdown(); - monotime_disable_test_mocking(); - channel_free_all(); - - return; -} - -void -test_channelpadding_negotiation(void *arg) -{ - channelpadding_negotiate_t disable; - cell_t cell; - channelpadding_decision_t decision; - int val; - (void)arg; - - /* Plan: - * 1. Clients reject negotiation, relays accept it. - * * Bridges accept negotiation from their clients, - * but not from relays. - * 2. Torrc options can override client-side negotiation - * 3. Test a version issue in channelpadidng cell - * 4. Test channelpadding_reduced_padding - */ - monotime_init(); - monotime_enable_test_mocking(); - monotime_set_mock_time_nsec(1); - monotime_coarse_set_mock_time_nsec(1); - timers_initialize(); - setup_mock_consensus(); - setup_mock_network(); - - /* Test case #1: Do the right things ignore negotiation? */ - /* relay-to-client case: */ - channelpadding_send_disable_command(relay3_client); - tt_assert(client_relay3->padding_enabled); - - /* client-to-relay case: */ - get_options_mutable()->ORPort_set = 1; - channelpadding_disable_padding_on_channel(client_relay3); - tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, - CHANNELPADDING_WONTPAD); - tt_assert(!relay3_client->padding_enabled); - relay3_client->padding_enabled = 1; - client_relay3->padding_enabled = 1; - - /* Bridge case from relay */ - get_options_mutable()->BridgeRelay = 1; - channelpadding_disable_padding_on_channel(relay2_relay1); - tt_assert(relay1_relay2->padding_enabled); - - /* Bridge case from client */ - channelpadding_disable_padding_on_channel(client_relay3); - tt_assert(!relay3_client->padding_enabled); - tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ, - CHANNELPADDING_WONTPAD); - relay3_client->padding_enabled = 1; - client_relay3->padding_enabled = 1; - get_options_mutable()->BridgeRelay = 0; - get_options_mutable()->ORPort_set = 0; - - /* Test case #2: Torrc options */ - /* ConnectionPadding auto; Relay doesn't suport us */ - ((channel_tls_t*)relay3_client)->conn->link_proto = 4; - relay3_client->padding_enabled = 0; - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(relay3_client); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!relay3_client->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - ((channel_tls_t*)relay3_client)->conn->link_proto = 5; - relay3_client->padding_enabled = 1; - - /* ConnectionPadding 1; Relay doesn't suport us */ - get_options_mutable()->ConnectionPadding = 1; - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - tt_assert(!client_relay3->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - get_options_mutable()->ConnectionPadding = 0; - - /* Test case #3: Test a version issue in channelpadding cell */ - get_options_mutable()->ORPort_set = 1; - client_relay3->padding_enabled = 1; - relay3_client->padding_enabled = 1; - memset(&cell, 0, sizeof(cell_t)); - memset(&disable, 0, sizeof(channelpadding_negotiate_t)); - cell.command = CELL_PADDING_NEGOTIATE; - - channelpadding_negotiate_set_command(&disable, CHANNELPADDING_COMMAND_STOP); - disable.version = 1; - channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable); - client_relay3->write_cell(client_relay3, &cell); - tt_assert(relay3_client->padding_enabled); - tt_int_op(channelpadding_update_padding_for_channel(client_relay3, &disable), - OP_EQ, -1); - tt_assert(client_relay3->padding_enabled); - - disable.version = 0; - channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable); - client_relay3->write_cell(client_relay3, &cell); - tt_assert(!relay3_client->padding_enabled); - - /* Test case 4: Reducing padding actually reduces it */ - relay3_client->padding_enabled = 1; - client_relay3->padding_enabled = 1; - - decision = channelpadding_decide_to_pad_channel(relay3_client); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - - channelpadding_reduce_padding_on_channel(client_relay3); - - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(relay3_client); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - - get_options_mutable()->ORPort_set = 0; - decision = channelpadding_decide_to_pad_channel(client_relay3); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - - tt_assert(!client_relay3->pending_padding_callback); - val = channelpadding_get_netflow_inactive_timeout_ms(client_relay3); - tt_int_op(val, OP_GE, 9000); - tt_int_op(val, OP_LE, 14000); - int64_t val64 = - channelpadding_compute_time_until_pad_for_netflow(client_relay3); - tt_i64_op(val64, OP_LE, 14000); - - done: - free_mock_network(); - free_mock_consensus(); - - timers_shutdown(); - monotime_disable_test_mocking(); - channel_free_all(); - - return; -} - -void -test_channelpadding_decide_to_pad_channel(void *arg) -{ - channelpadding_decision_t decision; - /** - * Test case plan: - * - * 1. Channel that has "sent a packet" before the timeout. - * + We should decide to pad later - * 2. Channel that has not "sent a packet" before the timeout: - * 2a. Not within 1.1s of the timeout. - * + We should decide to pad later - * 2b. Within 1.1s of the timemout. - * + We should schedule padding - * + We should get feedback that we wrote a cell - * 2c. Within 0.1s of the timeout. - * + We should schedule padding - * + We should get feedback that we wrote a cell - * 2d. Channel that asks to pad while timeout is scheduled - * + We should schedule padding - * + We should get feedback that we wrote a cell - * 2e. 0s of the timeout - * + We should send padding immediately - * + We should get feedback that we wrote a cell - * 2f. <0s of the timeout - * + We should send padding immediately - * + We should get feedback that we wrote a cell - * 3. Channel that sends a packet while timeout is scheduled - * + We should not get feedback that we wrote a cell - * 4. Channel that closes while timeout is scheduled - * + We should not get feedback that we wrote a cell - * 5. Make sure the channel still would work if repaired - * + We should be able to schedule padding and resend - * 6. Channel is not used for full circuits - * 7. Channel that disappears while timeout is scheduled - * + We should not send padding - */ - channel_t *chan; - int64_t new_time; - if (!connection_array) - connection_array = smartlist_new(); - (void)arg; - - tor_libevent_postfork(); - - monotime_init(); - monotime_enable_test_mocking(); - monotime_set_mock_time_nsec(1); - monotime_coarse_set_mock_time_nsec(1); - new_time = 1; - monotime_coarse_t now; - monotime_coarse_get(&now); - timers_initialize(); - setup_full_capture_of_logs(LOG_WARN); - channelpadding_new_consensus_params(NULL); - - chan = (channel_t*)new_fake_channeltls(0); - channel_timestamp_active(chan); - - /* Test case #1: Channel that has "sent a packet" before the timeout. */ - tried_to_write_cell = 0; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - tt_assert(!chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - /* Test case #2a: > 1.1s until timeout */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 1200); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER); - tt_assert(!chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - /* Test case #2b: >= 1.0s until timeout */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 1000); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - // Set up a timer for the <0 case below. - monotime_coarse_t now_minus_100s; - monotime_coarse_add_msec(&now_minus_100s, &now, 900); - // Wait for the timer from case #2b - new_time += 1000*NSEC_PER_MSEC; - monotime_set_mock_time_nsec(new_time); - monotime_coarse_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - /* Test case #2c: > 0.1s until timeout */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - /* Test case #2d: Channel that asks to pad while timeout is scheduled */ - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED); - - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - /* Test case #2e: 0s until timeout */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 0); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - /* Test case #2f: <0s until timeout */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now_minus_100s, 0); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT); - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - /* Test case #3: Channel that sends a packet while timeout is scheduled */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - tt_assert(chan->pending_padding_callback); - - // Pretend the channel sent a packet - channel_timestamp_active(chan); - - // We don't expect any timer callbacks here. Make a dummy one to be sure. - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - - tt_int_op(tried_to_write_cell, OP_EQ, 0); - tt_assert(!chan->pending_padding_callback); - - /* Test case #4: Channel that closes while a timeout is scheduled */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - tt_assert(chan->pending_padding_callback); - - // Pretend the channel is temporarily down - chan->state = CHANNEL_STATE_MAINT; - - // We don't expect any timer callbacks here. Make a dummy one to be sure. - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - - tt_int_op(tried_to_write_cell, OP_EQ, 0); - tt_assert(!chan->pending_padding_callback); - chan->state = CHANNEL_STATE_OPEN; - - /* Test case #5: Make sure previous test case didn't break everything */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_assert(chan->pending_padding_callback); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - // Wait for the timer - new_time += 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - - tt_int_op(tried_to_write_cell, OP_EQ, 1); - tt_assert(!chan->pending_padding_callback); - - /* Test case #6. Channel is not used for full circuits */ - chan->channel_usage = CHANNEL_USED_NOT_USED_FOR_FULL_CIRCS; - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD); - tt_assert(!chan->pending_padding_callback); - chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS; - - /* Test case #7. Channel is closed while timeout is scheduled. - * - * NOTE: This test deliberately breaks the channel callback mechanism. - * It must be last. - */ - tried_to_write_cell = 0; - monotime_coarse_add_msec(&chan->next_padding_time, &now, 100); - decision = channelpadding_decide_to_pad_channel(chan); - tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED); - tt_int_op(tried_to_write_cell, OP_EQ, 0); - tt_assert(chan->pending_padding_callback); - - // Close the connection while the timer is scheduled - free_fake_channeltls((channel_tls_t*)chan); - - // We don't expect any timer callbacks here. Make a dummy one to be sure. - new_time = 101*NSEC_PER_MSEC; - monotime_coarse_set_mock_time_nsec(new_time); - monotime_set_mock_time_nsec(new_time); - monotime_coarse_get(&now); - timers_run_pending(); - - tt_int_op(tried_to_write_cell, OP_EQ, 0); - - done: - smartlist_free(connection_array); - - teardown_capture_of_logs(); - monotime_disable_test_mocking(); - timers_shutdown(); - channel_free_all(); - - return; -} - -#define TEST_CHANNELPADDING(name, flags) \ - { #name, test_##name, (flags), NULL, NULL } - -struct testcase_t channelpadding_tests[] = { - //TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, 0), - TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, TT_FORK), - TEST_CHANNELPADDING(channelpadding_negotiation, TT_FORK), - TEST_CHANNELPADDING(channelpadding_consensus, TT_FORK), - TEST_CHANNELPADDING(channelpadding_killonehop, TT_FORK), - TEST_CHANNELPADDING(channelpadding_timers, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_channeltls.c b/src/tor/src/test/test_channeltls.c deleted file mode 100644 index 94f1893ca..000000000 --- a/src/tor/src/test/test_channeltls.c +++ /dev/null @@ -1,337 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include - -#define TOR_CHANNEL_INTERNAL_ -#include "or.h" -#include "address.h" -#include "buffers.h" -#include "channel.h" -#include "channeltls.h" -#include "connection_or.h" -#include "config.h" -/* For init/free stuff */ -#include "scheduler.h" -#include "tortls.h" - -/* Test suite stuff */ -#include "test.h" -#include "fakechans.h" - -/* The channeltls unit tests */ -static void test_channeltls_create(void *arg); -static void test_channeltls_num_bytes_queued(void *arg); -static void test_channeltls_overhead_estimate(void *arg); - -/* Mocks used by channeltls unit tests */ -static size_t tlschan_buf_datalen_mock(const buf_t *buf); -static or_connection_t * tlschan_connection_or_connect_mock( - const tor_addr_t *addr, - uint16_t port, - const char *digest, - const ed25519_public_key_t *ed_id, - channel_tls_t *tlschan); -static int tlschan_is_local_addr_mock(const tor_addr_t *addr); - -/* Fake close method */ -static void tlschan_fake_close_method(channel_t *chan); - -/* Flags controlling behavior of channeltls unit test mocks */ -static int tlschan_local = 0; -static const buf_t * tlschan_buf_datalen_mock_target = NULL; -static size_t tlschan_buf_datalen_mock_size = 0; - -/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */ -static int fake_tortls = 0; /* Bleh... */ - -static void -test_channeltls_create(void *arg) -{ - tor_addr_t test_addr; - channel_t *ch = NULL; - const char test_digest[DIGEST_LEN] = { - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; - - (void)arg; - - /* Set up a fake address to fake-connect to */ - test_addr.family = AF_INET; - test_addr.addr.in_addr.s_addr = htonl(0x01020304); - - /* For this test we always want the address to be treated as non-local */ - tlschan_local = 0; - /* Install is_local_addr() mock */ - MOCK(is_local_addr, tlschan_is_local_addr_mock); - - /* Install mock for connection_or_connect() */ - MOCK(connection_or_connect, tlschan_connection_or_connect_mock); - - /* Try connecting */ - ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); - tt_ptr_op(ch, OP_NE, NULL); - - done: - if (ch) { - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - /* - * Use fake close method that doesn't try to do too much to fake - * orconn - */ - ch->close = tlschan_fake_close_method; - channel_mark_for_close(ch); - free_fake_channel(ch); - UNMOCK(scheduler_release_channel); - } - - UNMOCK(connection_or_connect); - UNMOCK(is_local_addr); - - return; -} - -static void -test_channeltls_num_bytes_queued(void *arg) -{ - tor_addr_t test_addr; - channel_t *ch = NULL; - const char test_digest[DIGEST_LEN] = { - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; - channel_tls_t *tlschan = NULL; - size_t len; - int fake_outbuf = 0, n; - - (void)arg; - - /* Set up a fake address to fake-connect to */ - test_addr.family = AF_INET; - test_addr.addr.in_addr.s_addr = htonl(0x01020304); - - /* For this test we always want the address to be treated as non-local */ - tlschan_local = 0; - /* Install is_local_addr() mock */ - MOCK(is_local_addr, tlschan_is_local_addr_mock); - - /* Install mock for connection_or_connect() */ - MOCK(connection_or_connect, tlschan_connection_or_connect_mock); - - /* Try connecting */ - ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); - tt_ptr_op(ch, OP_NE, NULL); - - /* - * Next, we have to test ch->num_bytes_queued, which is - * channel_tls_num_bytes_queued_method. We can't mock - * connection_get_outbuf_len() directly because it's static inline - * in connection.h, but we can mock buf_datalen(). - */ - - tt_assert(ch->num_bytes_queued != NULL); - tlschan = BASE_CHAN_TO_TLS(ch); - tt_ptr_op(tlschan, OP_NE, NULL); - if (TO_CONN(tlschan->conn)->outbuf == NULL) { - /* We need an outbuf to make sure buf_datalen() gets called */ - fake_outbuf = 1; - TO_CONN(tlschan->conn)->outbuf = buf_new(); - } - tlschan_buf_datalen_mock_target = TO_CONN(tlschan->conn)->outbuf; - tlschan_buf_datalen_mock_size = 1024; - MOCK(buf_datalen, tlschan_buf_datalen_mock); - len = ch->num_bytes_queued(ch); - tt_int_op(len, OP_EQ, tlschan_buf_datalen_mock_size); - /* - * We also cover num_cells_writeable here; since wide_circ_ids = 0 on - * the fake tlschans, cell_network_size returns 512, and so with - * tlschan_buf_datalen_mock_size == 1024, we should be able to write - * ceil((OR_CONN_HIGHWATER - 1024) / 512) = ceil(OR_CONN_HIGHWATER / 512) - * - 2 cells. - */ - n = ch->num_cells_writeable(ch); - tt_int_op(n, OP_EQ, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2); - UNMOCK(buf_datalen); - tlschan_buf_datalen_mock_target = NULL; - tlschan_buf_datalen_mock_size = 0; - if (fake_outbuf) { - buf_free(TO_CONN(tlschan->conn)->outbuf); - TO_CONN(tlschan->conn)->outbuf = NULL; - } - - done: - if (ch) { - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - /* - * Use fake close method that doesn't try to do too much to fake - * orconn - */ - ch->close = tlschan_fake_close_method; - channel_mark_for_close(ch); - free_fake_channel(ch); - UNMOCK(scheduler_release_channel); - } - - UNMOCK(connection_or_connect); - UNMOCK(is_local_addr); - - return; -} - -static void -test_channeltls_overhead_estimate(void *arg) -{ - tor_addr_t test_addr; - channel_t *ch = NULL; - const char test_digest[DIGEST_LEN] = { - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; - double r; - channel_tls_t *tlschan = NULL; - - (void)arg; - - /* Set up a fake address to fake-connect to */ - test_addr.family = AF_INET; - test_addr.addr.in_addr.s_addr = htonl(0x01020304); - - /* For this test we always want the address to be treated as non-local */ - tlschan_local = 0; - /* Install is_local_addr() mock */ - MOCK(is_local_addr, tlschan_is_local_addr_mock); - - /* Install mock for connection_or_connect() */ - MOCK(connection_or_connect, tlschan_connection_or_connect_mock); - - /* Try connecting */ - ch = channel_tls_connect(&test_addr, 567, test_digest, NULL); - tt_ptr_op(ch, OP_NE, NULL); - - /* First case: silly low ratios should get clamped to 1.0 */ - tlschan = BASE_CHAN_TO_TLS(ch); - tt_ptr_op(tlschan, OP_NE, NULL); - tlschan->conn->bytes_xmitted = 128; - tlschan->conn->bytes_xmitted_by_tls = 64; - r = ch->get_overhead_estimate(ch); - tt_assert(fabs(r - 1.0) < 1E-12); - - tlschan->conn->bytes_xmitted_by_tls = 127; - r = ch->get_overhead_estimate(ch); - tt_assert(fabs(r - 1.0) < 1E-12); - - /* Now middle of the range */ - tlschan->conn->bytes_xmitted_by_tls = 192; - r = ch->get_overhead_estimate(ch); - tt_assert(fabs(r - 1.5) < 1E-12); - - /* Now above the 2.0 clamp */ - tlschan->conn->bytes_xmitted_by_tls = 257; - r = ch->get_overhead_estimate(ch); - tt_assert(fabs(r - 2.0) < 1E-12); - - tlschan->conn->bytes_xmitted_by_tls = 512; - r = ch->get_overhead_estimate(ch); - tt_assert(fabs(r - 2.0) < 1E-12); - - done: - if (ch) { - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - /* - * Use fake close method that doesn't try to do too much to fake - * orconn - */ - ch->close = tlschan_fake_close_method; - channel_mark_for_close(ch); - free_fake_channel(ch); - UNMOCK(scheduler_release_channel); - } - - UNMOCK(connection_or_connect); - UNMOCK(is_local_addr); - - return; -} - -static size_t -tlschan_buf_datalen_mock(const buf_t *buf) -{ - if (buf != NULL && buf == tlschan_buf_datalen_mock_target) { - return tlschan_buf_datalen_mock_size; - } else { - return buf_datalen__real(buf); - } -} - -static or_connection_t * -tlschan_connection_or_connect_mock(const tor_addr_t *addr, - uint16_t port, - const char *digest, - const ed25519_public_key_t *ed_id, - channel_tls_t *tlschan) -{ - or_connection_t *result = NULL; - (void) ed_id; // XXXX Not yet used. - - tt_ptr_op(addr, OP_NE, NULL); - tt_uint_op(port, OP_NE, 0); - tt_ptr_op(digest, OP_NE, NULL); - tt_ptr_op(tlschan, OP_NE, NULL); - - /* Make a fake orconn */ - result = tor_malloc_zero(sizeof(*result)); - result->base_.magic = OR_CONNECTION_MAGIC; - result->base_.state = OR_CONN_STATE_OPEN; - result->base_.type = CONN_TYPE_OR; - result->base_.socket_family = addr->family; - result->base_.address = tor_strdup(""); - memcpy(&(result->base_.addr), addr, sizeof(tor_addr_t)); - result->base_.port = port; - memcpy(result->identity_digest, digest, DIGEST_LEN); - result->chan = tlschan; - memcpy(&(result->real_addr), addr, sizeof(tor_addr_t)); - result->tls = (tor_tls_t *)((void *)(&fake_tortls)); - - done: - return result; -} - -static void -tlschan_fake_close_method(channel_t *chan) -{ - channel_tls_t *tlschan = NULL; - - tt_ptr_op(chan, OP_NE, NULL); - tt_int_op(chan->magic, OP_EQ, TLS_CHAN_MAGIC); - - tlschan = BASE_CHAN_TO_TLS(chan); - tt_ptr_op(tlschan, OP_NE, NULL); - - /* Just free the fake orconn */ - tor_free(tlschan->conn->base_.address); - tor_free(tlschan->conn); - - channel_closed(chan); - - done: - return; -} - -static int -tlschan_is_local_addr_mock(const tor_addr_t *addr) -{ - tt_ptr_op(addr, OP_NE, NULL); - - done: - return tlschan_local; -} - -struct testcase_t channeltls_tests[] = { - { "create", test_channeltls_create, TT_FORK, NULL, NULL }, - { "num_bytes_queued", test_channeltls_num_bytes_queued, - TT_FORK, NULL, NULL }, - { "overhead_estimate", test_channeltls_overhead_estimate, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_checkdir.c b/src/tor/src/test/test_checkdir.c deleted file mode 100644 index bf6a8376b..000000000 --- a/src/tor/src/test/test_checkdir.c +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" - -#ifdef _WIN32 -#include -#else -#include -#endif - -#include "config.h" -#include "test.h" -#include "util.h" - -#ifdef _WIN32 -#define mkdir(a,b) mkdir(a) -#define tt_int_op_nowin(a,op,b) do { (void)(a); (void)(b); } while (0) -#define umask(mask) ((void)0) -#else -#define tt_int_op_nowin(a,op,b) tt_int_op((a),op,(b)) -#endif /* defined(_WIN32) */ - -/** Run unit tests for private dir permission enforcement logic. */ -static void -test_checkdir_perms(void *testdata) -{ - (void)testdata; - or_options_t *options = get_options_mutable(); - const char *subdir = "test_checkdir"; - char *testdir = NULL; - cpd_check_t cpd_chkopts; - cpd_check_t unix_create_opts; - cpd_check_t unix_verify_optsmask; - struct stat st; - - umask(022); - - /* setup data directory before tests. */ - tor_free(options->DataDirectory); - options->DataDirectory = tor_strdup(get_fname(subdir)); - tt_int_op(mkdir(options->DataDirectory, 0750), OP_EQ, 0); - - /* test: create new dir, no flags. */ - testdir = get_datadir_fname("checkdir_new_none"); - cpd_chkopts = CPD_CREATE; - unix_verify_optsmask = 0077; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: create new dir, CPD_GROUP_OK option set. */ - testdir = get_datadir_fname("checkdir_new_groupok"); - cpd_chkopts = CPD_CREATE|CPD_GROUP_OK; - unix_verify_optsmask = 0077; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: should get an error on existing dir with - wrong perms */ - testdir = get_datadir_fname("checkdir_new_groupok_err"); - tt_int_op(0, OP_EQ, mkdir(testdir, 027)); - cpd_chkopts = CPD_CHECK_MODE_ONLY|CPD_CREATE|CPD_GROUP_OK; - tt_int_op_nowin(-1, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tor_free(testdir); - - /* test: create new dir, CPD_GROUP_READ option set. */ - testdir = get_datadir_fname("checkdir_new_groupread"); - cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; - unix_verify_optsmask = 0027; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: check existing dir created with defaults, - and verify with CPD_CREATE only. */ - testdir = get_datadir_fname("checkdir_exists_none"); - cpd_chkopts = CPD_CREATE; - unix_create_opts = 0700; - (void)unix_create_opts; - unix_verify_optsmask = 0077; - tt_int_op(0, OP_EQ, mkdir(testdir, unix_create_opts)); - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: check existing dir created with defaults, - and verify with CPD_GROUP_OK option set. */ - testdir = get_datadir_fname("checkdir_exists_groupok"); - cpd_chkopts = CPD_CREATE; - unix_verify_optsmask = 0077; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - cpd_chkopts = CPD_GROUP_OK; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: check existing dir created with defaults, - and verify with CPD_GROUP_READ option set. */ - testdir = get_datadir_fname("checkdir_exists_groupread"); - cpd_chkopts = CPD_CREATE; - unix_verify_optsmask = 0027; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - cpd_chkopts = CPD_GROUP_READ; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: check existing dir created with CPD_GROUP_READ, - and verify with CPD_GROUP_OK option set. */ - testdir = get_datadir_fname("checkdir_existsread_groupok"); - cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; - unix_verify_optsmask = 0027; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - cpd_chkopts = CPD_GROUP_OK; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); - - /* test: check existing dir created with CPD_GROUP_READ, - and verify with CPD_GROUP_READ option set. */ - testdir = get_datadir_fname("checkdir_existsread_groupread"); - cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; - unix_verify_optsmask = 0027; - tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, OP_EQ, stat(testdir, &st)); - tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - - done: - tor_free(testdir); -} - -#define CHECKDIR(name,flags) \ - { #name, test_checkdir_##name, (flags), NULL, NULL } - -struct testcase_t checkdir_tests[] = { - CHECKDIR(perms, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_circuitbuild.c b/src/tor/src/test/test_circuitbuild.c deleted file mode 100644 index a5282df69..000000000 --- a/src/tor/src/test/test_circuitbuild.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CIRCUITBUILD_PRIVATE - -#include "or.h" -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" -#include "config.h" -#include "circuitbuild.h" - -/* Dummy nodes smartlist for testing */ -static smartlist_t dummy_nodes; -/* Dummy exit extend_info for testing */ -static extend_info_t dummy_ei; - -static int -mock_count_acceptable_nodes(smartlist_t *nodes) -{ - (void)nodes; - - return DEFAULT_ROUTE_LEN + 1; -} - -/* Test route lengths when the caller of new_route_len() doesn't - * specify exit_ei. */ -static void -test_new_route_len_noexit(void *arg) -{ - int r; - - (void)arg; - MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); - - r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, NULL, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); - - r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, NULL, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); - - r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, NULL, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); - - done: - UNMOCK(count_acceptable_nodes); -} - -/* Test route lengths where someone else chose the "exit" node, which - * require an extra hop for safety. */ -static void -test_new_route_len_unsafe_exit(void *arg) -{ - int r; - - (void)arg; - MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); - - /* connecting to hidden service directory */ - r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, &dummy_ei, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); - - /* client connecting to introduction point */ - r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCING, &dummy_ei, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); - - /* hidden service connecting to rendezvous point */ - r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, &dummy_ei, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); - - done: - UNMOCK(count_acceptable_nodes); -} - -/* Test route lengths where we chose the "exit" node, which don't - * require an extra hop for safety. */ -static void -test_new_route_len_safe_exit(void *arg) -{ - int r; - - (void)arg; - MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); - - /* hidden service connecting to introduction point */ - r = new_route_len(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, &dummy_ei, - &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); - - /* router testing its own reachability */ - r = new_route_len(CIRCUIT_PURPOSE_TESTING, &dummy_ei, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); - - done: - UNMOCK(count_acceptable_nodes); -} - -/* Make sure a non-fatal assertion fails when new_route_len() gets an - * unexpected circuit purpose. */ -static void -test_new_route_len_unhandled_exit(void *arg) -{ - int r; - - (void)arg; - MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); - - tor_capture_bugs_(1); - setup_full_capture_of_logs(LOG_WARN); - r = new_route_len(CIRCUIT_PURPOSE_CONTROLLER, &dummy_ei, &dummy_nodes); - tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); - tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); - tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, - "!(exit_ei && !known_purpose)"); - expect_single_log_msg_containing("Unhandled purpose"); - expect_single_log_msg_containing("with a chosen exit; assuming routelen"); - teardown_capture_of_logs(); - tor_end_capture_bugs_(); - - done: - UNMOCK(count_acceptable_nodes); -} - -struct testcase_t circuitbuild_tests[] = { - { "noexit", test_new_route_len_noexit, 0, NULL, NULL }, - { "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL }, - { "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL }, - { "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_circuitlist.c b/src/tor/src/test/test_circuitlist.c deleted file mode 100644 index d170009a9..000000000 --- a/src/tor/src/test/test_circuitlist.c +++ /dev/null @@ -1,469 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define TOR_CHANNEL_INTERNAL_ -#define CIRCUITBUILD_PRIVATE -#define CIRCUITLIST_PRIVATE -#define HS_CIRCUITMAP_PRIVATE -#include "or.h" -#include "channel.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "hs_circuitmap.h" -#include "test.h" -#include "log_test_helpers.h" - -static channel_t * -new_fake_channel(void) -{ - channel_t *chan = tor_malloc_zero(sizeof(channel_t)); - channel_init(chan); - return chan; -} - -static struct { - int ncalls; - void *cmux; - void *circ; - cell_direction_t dir; -} cam; - -static void -circuitmux_attach_mock(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t dir) -{ - ++cam.ncalls; - cam.cmux = cmux; - cam.circ = circ; - cam.dir = dir; -} - -static struct { - int ncalls; - void *cmux; - void *circ; -} cdm; - -static void -circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ) -{ - ++cdm.ncalls; - cdm.cmux = cmux; - cdm.circ = circ; -} - -#define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \ - tt_int_op(cam.ncalls, OP_EQ, 1); \ - tt_ptr_op(cam.cmux, OP_EQ, (mux_)); \ - tt_ptr_op(cam.circ, OP_EQ, (circ_)); \ - tt_int_op(cam.dir, OP_EQ, (dir_)); \ - memset(&cam, 0, sizeof(cam)); \ - } while (0) - -#define GOT_CMUX_DETACH(mux_, circ_) do { \ - tt_int_op(cdm.ncalls, OP_EQ, 1); \ - tt_ptr_op(cdm.cmux, OP_EQ, (mux_)); \ - tt_ptr_op(cdm.circ, OP_EQ, (circ_)); \ - memset(&cdm, 0, sizeof(cdm)); \ - } while (0) - -static void -test_clist_maps(void *arg) -{ - channel_t *ch1 = new_fake_channel(); - channel_t *ch2 = new_fake_channel(); - channel_t *ch3 = new_fake_channel(); - or_circuit_t *or_c1=NULL, *or_c2=NULL; - - (void) arg; - - MOCK(circuitmux_attach_circuit, circuitmux_attach_mock); - MOCK(circuitmux_detach_circuit, circuitmux_detach_mock); - memset(&cam, 0, sizeof(cam)); - memset(&cdm, 0, sizeof(cdm)); - - tt_assert(ch1); - tt_assert(ch2); - tt_assert(ch3); - - ch1->cmux = tor_malloc(1); - ch2->cmux = tor_malloc(1); - ch3->cmux = tor_malloc(1); - - or_c1 = or_circuit_new(100, ch2); - tt_assert(or_c1); - GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN); - tt_int_op(or_c1->p_circ_id, OP_EQ, 100); - tt_ptr_op(or_c1->p_chan, OP_EQ, ch2); - - or_c2 = or_circuit_new(100, ch1); - tt_assert(or_c2); - GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN); - tt_int_op(or_c2->p_circ_id, OP_EQ, 100); - tt_ptr_op(or_c2->p_chan, OP_EQ, ch1); - - circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1); - GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT); - - circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2); - GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT); - - tt_ptr_op(circuit_get_by_circid_channel(200, ch1), OP_EQ, TO_CIRCUIT(or_c1)); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); - /* Try the same thing again, to test the "fast" path. */ - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); - tt_assert(circuit_id_in_use_on_channel(100, ch2)); - tt_assert(! circuit_id_in_use_on_channel(101, ch2)); - - /* Try changing the circuitid and channel of that circuit. */ - circuit_set_p_circid_chan(or_c1, 500, ch3); - GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1)); - GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN); - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, NULL); - tt_assert(! circuit_id_in_use_on_channel(100, ch2)); - tt_ptr_op(circuit_get_by_circid_channel(500, ch3), OP_EQ, TO_CIRCUIT(or_c1)); - - /* Now let's see about destroy handling. */ - tt_assert(! circuit_id_in_use_on_channel(205, ch2)); - tt_assert(circuit_id_in_use_on_channel(200, ch2)); - channel_note_destroy_pending(ch2, 200); - channel_note_destroy_pending(ch2, 205); - channel_note_destroy_pending(ch1, 100); - tt_assert(circuit_id_in_use_on_channel(205, ch2)) - tt_assert(circuit_id_in_use_on_channel(200, ch2)); - tt_assert(circuit_id_in_use_on_channel(100, ch1)); - - tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, TO_CIRCUIT(or_c2)); - - /* Okay, now free ch2 and make sure that the circuit ID is STILL not - * usable, because we haven't declared the destroy to be nonpending */ - tt_int_op(cdm.ncalls, OP_EQ, 0); - circuit_free_(TO_CIRCUIT(or_c2)); - or_c2 = NULL; /* prevent free */ - tt_int_op(cdm.ncalls, OP_EQ, 2); - memset(&cdm, 0, sizeof(cdm)); - tt_assert(circuit_id_in_use_on_channel(200, ch2)); - tt_assert(circuit_id_in_use_on_channel(100, ch1)); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); - - /* Now say that the destroy is nonpending */ - channel_note_destroy_not_pending(ch2, 200); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); - channel_note_destroy_not_pending(ch1, 100); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); - tt_assert(! circuit_id_in_use_on_channel(200, ch2)); - tt_assert(! circuit_id_in_use_on_channel(100, ch1)); - - done: - if (or_c1) - circuit_free_(TO_CIRCUIT(or_c1)); - if (or_c2) - circuit_free_(TO_CIRCUIT(or_c2)); - if (ch1) - tor_free(ch1->cmux); - if (ch2) - tor_free(ch2->cmux); - if (ch3) - tor_free(ch3->cmux); - tor_free(ch1); - tor_free(ch2); - tor_free(ch3); - UNMOCK(circuitmux_attach_circuit); - UNMOCK(circuitmux_detach_circuit); -} - -static void -test_rend_token_maps(void *arg) -{ - or_circuit_t *c1, *c2, *c3, *c4; - origin_circuit_t *c5; - const uint8_t tok1[REND_TOKEN_LEN] = "The cat can't tell y"; - const uint8_t tok2[REND_TOKEN_LEN] = "ou its name, and it "; - const uint8_t tok3[REND_TOKEN_LEN] = "doesn't really care."; - /* -- Adapted from a quote by Fredrik Lundh. */ - - (void)arg; - (void)tok1; //xxxx - - hs_circuitmap_init(); - - c1 = or_circuit_new(0, NULL); - c2 = or_circuit_new(0, NULL); - c3 = or_circuit_new(0, NULL); - c4 = or_circuit_new(0, NULL); - c5 = origin_circuit_new(); - - /* Make sure we really filled up the tok* variables */ - tt_int_op(tok1[REND_TOKEN_LEN-1], OP_EQ, 'y'); - tt_int_op(tok2[REND_TOKEN_LEN-1], OP_EQ, ' '); - tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.'); - - /* No maps; nothing there. */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); - - hs_circuitmap_register_rend_circ_relay_side(c1, tok1); - hs_circuitmap_register_intro_circ_v2_relay_side(c2, tok2); - - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); - - /* Without purpose set, we don't get the circuits */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); - - c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - - /* Okay, make sure they show up now. */ - tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); - - /* Two items at the same place with the same token. */ - c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - hs_circuitmap_register_rend_circ_relay_side(c3, tok2); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); - - /* Marking a circuit makes it not get returned any more */ - circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - circuit_free_(TO_CIRCUIT(c1)); - c1 = NULL; - - /* Freeing a circuit makes it not get returned any more. */ - circuit_free_(TO_CIRCUIT(c2)); - c2 = NULL; - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); - - /* c3 -- are you still there? */ - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); - /* Change its cookie. This never happens in Tor per se, but hey. */ - c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3); - - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - - /* Now replace c3 with c4. */ - c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3); - - tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - - tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL); - tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL); - tt_mem_op(TO_CIRCUIT(c4)->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); - - /* Now clear c4's cookie. */ - hs_circuitmap_remove_circuit(TO_CIRCUIT(c4)); - tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - - /* Now let's do a check for the client-side rend circuitmap */ - c5->base_.purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND; - hs_circuitmap_register_rend_circ_client_side(c5, tok1); - - tt_ptr_op(c5, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok2)); - - done: - if (c1) - circuit_free_(TO_CIRCUIT(c1)); - if (c2) - circuit_free_(TO_CIRCUIT(c2)); - if (c3) - circuit_free_(TO_CIRCUIT(c3)); - if (c4) - circuit_free_(TO_CIRCUIT(c4)); - if (c5) - circuit_free_(TO_CIRCUIT(c5)); -} - -static void -mock_channel_dump_statistics(channel_t *chan, int severity) -{ - (void)chan; - (void)severity; -} - -static void -test_pick_circid(void *arg) -{ - bitarray_t *ba = NULL; - channel_t *chan1, *chan2; - circid_t circid; - int i; - (void) arg; - - MOCK(channel_dump_statistics, mock_channel_dump_statistics); - - chan1 = tor_malloc_zero(sizeof(channel_t)); - chan2 = tor_malloc_zero(sizeof(channel_t)); - chan2->wide_circ_ids = 1; - - chan1->cmux = circuitmux_alloc(); - chan2->cmux = circuitmux_alloc(); - - /* CIRC_ID_TYPE_NEITHER is supposed to create a warning. */ - chan1->circ_id_type = CIRC_ID_TYPE_NEITHER; - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(0, OP_EQ, get_unique_circ_id_by_chan(chan1)); - expect_single_log_msg_containing("Trying to pick a circuit ID for a " - "connection from a client with no identity."); - teardown_capture_of_logs(); - - /* Basic tests, with no collisions */ - chan1->circ_id_type = CIRC_ID_TYPE_LOWER; - for (i = 0; i < 50; ++i) { - circid = get_unique_circ_id_by_chan(chan1); - tt_uint_op(0, OP_LT, circid); - tt_uint_op(circid, OP_LT, (1<<15)); - } - chan1->circ_id_type = CIRC_ID_TYPE_HIGHER; - for (i = 0; i < 50; ++i) { - circid = get_unique_circ_id_by_chan(chan1); - tt_uint_op((1<<15), OP_LT, circid); - tt_uint_op(circid, OP_LT, (1<<16)); - } - - chan2->circ_id_type = CIRC_ID_TYPE_LOWER; - for (i = 0; i < 50; ++i) { - circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op(0, OP_LT, circid); - tt_uint_op(circid, OP_LT, (1u<<31)); - } - chan2->circ_id_type = CIRC_ID_TYPE_HIGHER; - for (i = 0; i < 50; ++i) { - circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op((1u<<31), OP_LT, circid); - } - - /* Now make sure that we can behave well when we are full up on circuits */ - chan1->circ_id_type = CIRC_ID_TYPE_LOWER; - chan2->circ_id_type = CIRC_ID_TYPE_LOWER; - chan1->wide_circ_ids = chan2->wide_circ_ids = 0; - ba = bitarray_init_zero((1<<15)); - for (i = 0; i < (1<<15); ++i) { - circid = get_unique_circ_id_by_chan(chan1); - if (circid == 0) { - tt_int_op(i, OP_GT, (1<<14)); - break; - } - tt_uint_op(circid, OP_LT, (1<<15)); - tt_assert(! bitarray_is_set(ba, circid)); - bitarray_set(ba, circid); - channel_mark_circid_unusable(chan1, circid); - } - tt_int_op(i, OP_LT, (1<<15)); - /* Make sure that being full on chan1 does not interfere with chan2 */ - for (i = 0; i < 100; ++i) { - circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op(circid, OP_GT, 0); - tt_uint_op(circid, OP_LT, (1<<15)); - channel_mark_circid_unusable(chan2, circid); - } - - done: - circuitmux_free(chan1->cmux); - circuitmux_free(chan2->cmux); - tor_free(chan1); - tor_free(chan2); - bitarray_free(ba); - circuit_free_all(); - teardown_capture_of_logs(); - UNMOCK(channel_dump_statistics); -} - -/** Test that the circuit pools of our HS circuitmap are isolated based on - * their token type. */ -static void -test_hs_circuitmap_isolation(void *arg) -{ - or_circuit_t *circ1 = NULL; - origin_circuit_t *circ2 = NULL; - or_circuit_t *circ3 = NULL; - origin_circuit_t *circ4 = NULL; - - (void)arg; - - hs_circuitmap_init(); - - { - const uint8_t tok1[REND_TOKEN_LEN] = "bet i got some of th"; - - circ1 = or_circuit_new(0, NULL); - tt_assert(circ1); - circ1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - - /* check that circuitmap is empty right? */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - - /* Register circ1 with tok1 as relay-side rend circ */ - hs_circuitmap_register_rend_circ_relay_side(circ1, tok1); - - /* check that service-side getters don't work */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_service_side(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok1)); - - /* Check that the right getter works. */ - tt_ptr_op(circ1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); - } - - { - const uint8_t tok2[REND_TOKEN_LEN] = "you dont know anythi"; - - circ2 = origin_circuit_new(); - tt_assert(circ2); - circ2->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; - circ3 = or_circuit_new(0, NULL); - tt_assert(circ3); - circ3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - circ4 = origin_circuit_new(); - tt_assert(circ4); - circ4->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; - - /* Register circ2 with tok2 as service-side intro v2 circ */ - hs_circuitmap_register_intro_circ_v2_service_side(circ2, tok2); - /* Register circ3 with tok2 again but for different purpose */ - hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2); - - /* Check that the getters work */ - tt_ptr_op(circ2, OP_EQ, - hs_circuitmap_get_intro_circ_v2_service_side(tok2)); - tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); - - /* Register circ4 with tok2: it should override circ2 */ - hs_circuitmap_register_intro_circ_v2_service_side(circ4, tok2); - - /* check that relay-side getters don't work */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); - - /* Check that the getter returns circ4; the last circuit registered with - * that token. */ - tt_ptr_op(circ4, OP_EQ, - hs_circuitmap_get_intro_circ_v2_service_side(tok2)); - } - - done: - circuit_free_(TO_CIRCUIT(circ1)); - circuit_free_(TO_CIRCUIT(circ2)); - circuit_free_(TO_CIRCUIT(circ3)); - circuit_free_(TO_CIRCUIT(circ4)); -} - -struct testcase_t circuitlist_tests[] = { - { "maps", test_clist_maps, TT_FORK, NULL, NULL }, - { "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL }, - { "pick_circid", test_pick_circid, TT_FORK, NULL, NULL }, - { "hs_circuitmap_isolation", test_hs_circuitmap_isolation, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_circuitmux.c b/src/tor/src/test/test_circuitmux.c deleted file mode 100644 index 854f72505..000000000 --- a/src/tor/src/test/test_circuitmux.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define TOR_CHANNEL_INTERNAL_ -#define CIRCUITMUX_PRIVATE -#define RELAY_PRIVATE -#include "or.h" -#include "channel.h" -#include "circuitmux.h" -#include "relay.h" -#include "scheduler.h" -#include "test.h" - -/* XXXX duplicated function from test_circuitlist.c */ -static channel_t * -new_fake_channel(void) -{ - channel_t *chan = tor_malloc_zero(sizeof(channel_t)); - channel_init(chan); - return chan; -} - -static int -has_queued_writes(channel_t *c) -{ - (void) c; - return 1; -} - -/** Test destroy cell queue with no interference from other queues. */ -static void -test_cmux_destroy_cell_queue(void *arg) -{ - circuitmux_t *cmux = NULL; - channel_t *ch = NULL; - circuit_t *circ = NULL; - destroy_cell_queue_t *cq = NULL; - packed_cell_t *pc = NULL; - destroy_cell_t *dc = NULL; - - scheduler_init(); - - (void) arg; - - cmux = circuitmux_alloc(); - tt_assert(cmux); - ch = new_fake_channel(); - ch->has_queued_writes = has_queued_writes; - ch->wide_circ_ids = 1; - - circ = circuitmux_get_first_active_circuit(cmux, &cq); - tt_ptr_op(circ, OP_EQ, NULL); - tt_ptr_op(cq, OP_EQ, NULL); - - circuitmux_append_destroy_cell(ch, cmux, 100, 10); - circuitmux_append_destroy_cell(ch, cmux, 190, 6); - circuitmux_append_destroy_cell(ch, cmux, 30, 1); - - tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 3); - - circ = circuitmux_get_first_active_circuit(cmux, &cq); - tt_ptr_op(circ, OP_EQ, NULL); - tt_assert(cq); - - tt_int_op(cq->n, OP_EQ, 3); - - dc = destroy_cell_queue_pop(cq); - tt_assert(dc); - tt_uint_op(dc->circid, OP_EQ, 100); - - tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 2); - - done: - circuitmux_free(cmux); - channel_free(ch); - packed_cell_free(pc); - tor_free(dc); -} - -struct testcase_t circuitmux_tests[] = { - { "destroy_cell_queue", test_cmux_destroy_cell_queue, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_circuitstats.c b/src/tor/src/test/test_circuitstats.c deleted file mode 100644 index 9d87c325b..000000000 --- a/src/tor/src/test/test_circuitstats.c +++ /dev/null @@ -1,199 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CIRCUITBUILD_PRIVATE -#define CIRCUITSTATS_PRIVATE -#define CIRCUITLIST_PRIVATE -#define CHANNEL_PRIVATE_ - -#include "or.h" -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" -#include "config.h" -#include "circuitlist.h" -#include "circuitbuild.h" -#include "circuitstats.h" -#include "circuituse.h" -#include "channel.h" - -void test_circuitstats_timeout(void *arg); -void test_circuitstats_hoplen(void *arg); -origin_circuit_t *subtest_fourhop_circuit(struct timeval, int); -origin_circuit_t *add_opened_threehop(void); -origin_circuit_t *build_unopened_fourhop(struct timeval); - -int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); - -static int marked_for_close; -/* Mock function because we are not trying to test the close circuit that does - * an awful lot of checks on the circuit object. */ -static void -mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, - const char *file) -{ - (void) circ; - (void) reason; - (void) line; - (void) file; - marked_for_close = 1; - return; -} - -origin_circuit_t * -add_opened_threehop(void) -{ - origin_circuit_t *or_circ = origin_circuit_new(); - extend_info_t fakehop; - memset(&fakehop, 0, sizeof(fakehop)); - - TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; - - or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - or_circ->build_state->desired_path_len = DEFAULT_ROUTE_LEN; - - onion_append_hop(&or_circ->cpath, &fakehop); - onion_append_hop(&or_circ->cpath, &fakehop); - onion_append_hop(&or_circ->cpath, &fakehop); - - or_circ->has_opened = 1; - TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; - TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; - - return or_circ; -} - -origin_circuit_t * -build_unopened_fourhop(struct timeval circ_start_time) -{ - origin_circuit_t *or_circ = origin_circuit_new(); - extend_info_t *fakehop = tor_malloc_zero(sizeof(extend_info_t)); - memset(fakehop, 0, sizeof(extend_info_t)); - - TO_CIRCUIT(or_circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; - TO_CIRCUIT(or_circ)->timestamp_began = circ_start_time; - TO_CIRCUIT(or_circ)->timestamp_created = circ_start_time; - - or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - or_circ->build_state->desired_path_len = 4; - - onion_append_hop(&or_circ->cpath, fakehop); - onion_append_hop(&or_circ->cpath, fakehop); - onion_append_hop(&or_circ->cpath, fakehop); - onion_append_hop(&or_circ->cpath, fakehop); - - return or_circ; -} - -origin_circuit_t * -subtest_fourhop_circuit(struct timeval circ_start_time, int should_timeout) -{ - origin_circuit_t *or_circ = build_unopened_fourhop(circ_start_time); - - // Now make them open one at a time and call - // circuit_build_times_handle_completed_hop(); - or_circ->cpath->state = CPATH_STATE_OPEN; - circuit_build_times_handle_completed_hop(or_circ); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 0); - - or_circ->cpath->next->state = CPATH_STATE_OPEN; - circuit_build_times_handle_completed_hop(or_circ); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 0); - - // Third hop: We should count it now. - or_circ->cpath->next->next->state = CPATH_STATE_OPEN; - circuit_build_times_handle_completed_hop(or_circ); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, - !should_timeout); // 1 if counted, 0 otherwise - - // Fourth hop: Don't double count - or_circ->cpath->next->next->next->state = CPATH_STATE_OPEN; - circuit_build_times_handle_completed_hop(or_circ); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, - !should_timeout); - - done: - return or_circ; -} - -void -test_circuitstats_hoplen(void *arg) -{ - /* Plan: - * 0. Test no other opened circs (relaxed timeout) - * 1. Check >3 hop circ building w/o timeout - * 2. Check >3 hop circs w/ timeouts.. - */ - struct timeval circ_start_time; - origin_circuit_t *threehop = NULL; - origin_circuit_t *fourhop = NULL; - (void)arg; - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - - circuit_build_times_init(get_circuit_build_times_mutable()); - - // Let's set a close_ms to 2X the initial timeout, so we can - // test relaxed functionality (which uses the close_ms timeout) - get_circuit_build_times_mutable()->close_ms *= 2; - - tor_gettimeofday(&circ_start_time); - circ_start_time.tv_sec -= 119; // make us hit "relaxed" cutoff - - // Test 1: Build a fourhop circuit that should get marked - // as relaxed and eventually counted by circuit_expire_building - // (but not before) - fourhop = subtest_fourhop_circuit(circ_start_time, 0); - tt_int_op(fourhop->relaxed_timeout, OP_EQ, 0); - tt_int_op(marked_for_close, OP_EQ, 0); - circuit_expire_building(); - tt_int_op(marked_for_close, OP_EQ, 0); - tt_int_op(fourhop->relaxed_timeout, OP_EQ, 1); - TO_CIRCUIT(fourhop)->timestamp_began.tv_sec -= 119; - circuit_expire_building(); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); - tt_int_op(marked_for_close, OP_EQ, 1); - - circuit_free_(TO_CIRCUIT(fourhop)); - circuit_build_times_reset(get_circuit_build_times_mutable()); - - // Test 2: Add a threehop circuit for non-relaxed timeouts - threehop = add_opened_threehop(); - - /* This circuit should not timeout */ - tor_gettimeofday(&circ_start_time); - circ_start_time.tv_sec -= 59; - fourhop = subtest_fourhop_circuit(circ_start_time, 0); - circuit_expire_building(); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); - tt_int_op(TO_CIRCUIT(fourhop)->purpose, OP_NE, - CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); - - circuit_free_((circuit_t *)fourhop); - circuit_build_times_reset(get_circuit_build_times_mutable()); - - /* Test 3: This circuit should now time out and get marked as a - * measurement circuit, but still get counted (and counted only once) - */ - circ_start_time.tv_sec -= 2; - fourhop = subtest_fourhop_circuit(circ_start_time, 0); - tt_int_op(TO_CIRCUIT(fourhop)->purpose, OP_EQ, - CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); - circuit_expire_building(); - tt_int_op(get_circuit_build_times()->total_build_times, OP_EQ, 1); - - done: - UNMOCK(circuit_mark_for_close_); - circuit_free_(TO_CIRCUIT(threehop)); - circuit_free_(TO_CIRCUIT(fourhop)); - circuit_build_times_free_timeouts(get_circuit_build_times_mutable()); -} - -#define TEST_CIRCUITSTATS(name, flags) \ - { #name, test_##name, (flags), NULL, NULL } - -struct testcase_t circuitstats_tests[] = { - TEST_CIRCUITSTATS(circuitstats_hoplen, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_circuituse.c b/src/tor/src/test/test_circuituse.c deleted file mode 100644 index df1b43807..000000000 --- a/src/tor/src/test/test_circuituse.c +++ /dev/null @@ -1,307 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CIRCUITLIST_PRIVATE - -#include "or.h" -#include "test.h" -#include "test_helpers.h" -#include "config.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "circuitbuild.h" -#include "nodelist.h" - -static void -test_circuit_is_available_for_use_ret_false_when_marked_for_close(void *arg) -{ - (void)arg; - - circuit_t *circ = tor_malloc(sizeof(circuit_t)); - circ->marked_for_close = 1; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - tor_free(circ); -} - -static void -test_circuit_is_available_for_use_ret_false_when_timestamp_dirty(void *arg) -{ - (void)arg; - - circuit_t *circ = tor_malloc(sizeof(circuit_t)); - circ->timestamp_dirty = 1; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - tor_free(circ); -} - -static void -test_circuit_is_available_for_use_ret_false_for_non_general_purpose(void *arg) -{ - (void)arg; - - circuit_t *circ = tor_malloc(sizeof(circuit_t)); - circ->purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - tor_free(circ); -} - -static void -test_circuit_is_available_for_use_ret_false_for_non_general_origin(void *arg) -{ - (void)arg; - - circuit_t *circ = tor_malloc(sizeof(circuit_t)); - circ->purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - tor_free(circ); -} - -static void -test_circuit_is_available_for_use_ret_false_for_non_origin_purpose(void *arg) -{ - (void)arg; - - circuit_t *circ = tor_malloc(sizeof(circuit_t)); - circ->purpose = CIRCUIT_PURPOSE_OR; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - tor_free(circ); -} - -static void -test_circuit_is_available_for_use_ret_false_unusable_for_new_conns(void *arg) -{ - (void)arg; - - circuit_t *circ = dummy_origin_circuit_new(30); - mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ)); - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - circuit_free(circ); -} - -static void -test_circuit_is_available_for_use_returns_false_for_onehop_tunnel(void *arg) -{ - (void)arg; - - circuit_t *circ = dummy_origin_circuit_new(30); - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - oc->build_state->onehop_tunnel = 1; - - tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ)); - - done: - circuit_free(circ); -} - -static void -test_circuit_is_available_for_use_returns_true_for_clean_circuit(void *arg) -{ - (void)arg; - - circuit_t *circ = dummy_origin_circuit_new(30); - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - oc->build_state->onehop_tunnel = 0; - - tt_int_op(1, OP_EQ, circuit_is_available_for_use(circ)); - - done: - circuit_free(circ); -} - -static int -mock_circuit_all_predicted_ports_handled(time_t now, - int *need_uptime, - int *need_capacity) -{ - (void)now; - - if (need_uptime && need_capacity) - return 0; - return 1; -} - -static consensus_path_type_t -mock_router_have_unknown_consensus_path(void) -{ - return CONSENSUS_PATH_UNKNOWN; -} - -static consensus_path_type_t -mock_router_have_exit_consensus_path(void) -{ - return CONSENSUS_PATH_EXIT; -} - -static void -test_needs_exit_circuits_ret_false_for_predicted_ports_and_path(void *arg) -{ - (void)arg; - - MOCK(circuit_all_predicted_ports_handled, - mock_circuit_all_predicted_ports_handled); - int needs_uptime = 1; - int needs_capacity = 0; - - time_t now = time(NULL); - tt_int_op(0, OP_EQ, - needs_exit_circuits(now, &needs_uptime, &needs_capacity)); - - done: - UNMOCK(circuit_all_predicted_ports_handled); -} - -static void -test_needs_exit_circuits_ret_false_for_non_exit_consensus_path(void *arg) -{ - (void)arg; - - MOCK(circuit_all_predicted_ports_handled, - mock_circuit_all_predicted_ports_handled); - int needs_uptime = 1; - int needs_capacity = 1; - MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path); - - time_t now = time(NULL); - tt_int_op(0, OP_EQ, - needs_exit_circuits(now, &needs_uptime, &needs_capacity)); - - done: - UNMOCK(circuit_all_predicted_ports_handled); - UNMOCK(router_have_consensus_path); -} - -static void -test_needs_exit_circuits_ret_true_for_predicted_ports_and_path(void *arg) -{ - (void)arg; - - MOCK(circuit_all_predicted_ports_handled, - mock_circuit_all_predicted_ports_handled); - int needs_uptime = 1; - int needs_capacity = 1; - MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); - - time_t now = time(NULL); - tt_int_op(1, OP_EQ, - needs_exit_circuits(now, &needs_uptime, &needs_capacity)); - - done: - UNMOCK(circuit_all_predicted_ports_handled); - UNMOCK(router_have_consensus_path); -} - -static void -test_needs_circuits_for_build_ret_false_consensus_path_unknown(void *arg) -{ - (void)arg; - MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path); - tt_int_op(0, OP_EQ, needs_circuits_for_build(0)); - done: ; -} - -static void -test_needs_circuits_for_build_ret_false_if_num_less_than_max(void *arg) -{ - (void)arg; - MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); - tt_int_op(0, OP_EQ, needs_circuits_for_build(13)); - done: - UNMOCK(router_have_consensus_path); -} - -static void -test_needs_circuits_for_build_returns_true_when_more_are_needed(void *arg) -{ - (void)arg; - MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path); - tt_int_op(1, OP_EQ, needs_circuits_for_build(0)); - done: - UNMOCK(router_have_consensus_path); -} - -struct testcase_t circuituse_tests[] = { - { "marked", - test_circuit_is_available_for_use_ret_false_when_marked_for_close, - TT_FORK, NULL, NULL - }, - { "timestamp", - test_circuit_is_available_for_use_ret_false_when_timestamp_dirty, - TT_FORK, NULL, NULL - }, - { "non_general", - test_circuit_is_available_for_use_ret_false_for_non_general_purpose, - TT_FORK, NULL, NULL - }, - { "non_general", - test_circuit_is_available_for_use_ret_false_for_non_general_origin, - TT_FORK, NULL, NULL - }, - { "origin", - test_circuit_is_available_for_use_ret_false_for_non_origin_purpose, - TT_FORK, NULL, NULL - }, - { "clean", - test_circuit_is_available_for_use_ret_false_unusable_for_new_conns, - TT_FORK, NULL, NULL - }, - { "onehop", - test_circuit_is_available_for_use_returns_false_for_onehop_tunnel, - TT_FORK, NULL, NULL - }, - { "clean_circ", - test_circuit_is_available_for_use_returns_true_for_clean_circuit, - TT_FORK, NULL, NULL - }, - { "exit_f", - test_needs_exit_circuits_ret_false_for_predicted_ports_and_path, - TT_FORK, NULL, NULL - }, - { "exit_t", - test_needs_exit_circuits_ret_true_for_predicted_ports_and_path, - TT_FORK, NULL, NULL - }, - { "non_exit", - test_needs_exit_circuits_ret_false_for_non_exit_consensus_path, - TT_FORK, NULL, NULL - }, - { "true", - test_needs_exit_circuits_ret_true_for_predicted_ports_and_path, - TT_FORK, NULL, NULL - }, - { "consensus_path_unknown", - test_needs_circuits_for_build_ret_false_consensus_path_unknown, - TT_FORK, NULL, NULL - }, - { "less_than_max", - test_needs_circuits_for_build_ret_false_if_num_less_than_max, - TT_FORK, NULL, NULL - }, - { "more_needed", - test_needs_circuits_for_build_returns_true_when_more_are_needed, - TT_FORK, NULL, NULL - }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_compat_libevent.c b/src/tor/src/test/test_compat_libevent.c deleted file mode 100644 index 7dd8e6519..000000000 --- a/src/tor/src/test/test_compat_libevent.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define COMPAT_LIBEVENT_PRIVATE -#include "orconfig.h" -#include "or.h" - -#include "test.h" - -#include "compat_libevent.h" - -#include -#include - -#include "log_test_helpers.h" - -#define NS_MODULE compat_libevent - -static void -test_compat_libevent_logging_callback(void *ignored) -{ - (void)ignored; - setup_full_capture_of_logs(LOG_DEBUG); - - libevent_logging_callback(_EVENT_LOG_DEBUG, "hello world"); - expect_log_msg("Message from libevent: hello world\n"); - expect_log_severity(LOG_DEBUG); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_MSG, "hello world another time"); - expect_log_msg("Message from libevent: hello world another time\n"); - expect_log_severity(LOG_INFO); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_WARN, "hello world a third time"); - expect_log_msg("Warning from libevent: hello world a third time\n"); - expect_log_severity(LOG_WARN); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_ERR, "hello world a fourth time"); - expect_log_msg("Error from libevent: hello world a fourth time\n"); - expect_log_severity(LOG_ERR); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(42, "hello world a fifth time"); - expect_log_msg("Message [42] from libevent: hello world a fifth time\n"); - expect_log_severity(LOG_WARN); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_DEBUG, - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - ); - expect_log_msg("Message from libevent: " - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789" - "012345678901234567890123456789\n"); - expect_log_severity(LOG_DEBUG); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(42, "xxx\n"); - expect_log_msg("Message [42] from libevent: xxx\n"); - expect_log_severity(LOG_WARN); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - suppress_libevent_log_msg("something"); - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_MSG, "hello there"); - expect_log_msg("Message from libevent: hello there\n"); - expect_log_severity(LOG_INFO); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - - mock_clean_saved_logs(); - libevent_logging_callback(_EVENT_LOG_MSG, "hello there something else"); - expect_no_log_msg("hello there something else"); - if (mock_saved_logs()) - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 0); - - // No way of verifying the result of this, it seems =/ - configure_libevent_logging(); - - done: - suppress_libevent_log_msg(NULL); - teardown_capture_of_logs(); -} - -static void -test_compat_libevent_header_version(void *ignored) -{ - (void)ignored; - const char *res; - - res = tor_libevent_get_header_version_str(); - tt_str_op(res, OP_EQ, LIBEVENT_VERSION); - - done: - (void)0; -} - -struct testcase_t compat_libevent_tests[] = { - { "logging_callback", test_compat_libevent_logging_callback, - TT_FORK, NULL, NULL }, - { "header_version", test_compat_libevent_header_version, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_config.c b/src/tor/src/test/test_config.c deleted file mode 100644 index 4290d0dc6..000000000 --- a/src/tor/src/test/test_config.c +++ /dev/null @@ -1,5649 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CONFIG_PRIVATE -#define PT_PRIVATE -#define ROUTERSET_PRIVATE -#include "or.h" -#include "address.h" -#include "addressmap.h" -#include "bridges.h" -#include "circuitmux_ewma.h" -#include "circuitbuild.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "test.h" -#include "util.h" -#include "address.h" -#include "connection_or.h" -#include "control.h" -#include "cpuworker.h" -#include "dirserv.h" -#include "dirvote.h" -#include "dns.h" -#include "entrynodes.h" -#include "transports.h" -#include "ext_orport.h" -#include "geoip.h" -#include "hibernate.h" -#include "main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "rendclient.h" -#include "rendservice.h" -#include "router.h" -#include "routerlist.h" -#include "routerset.h" -#include "statefile.h" -#include "test.h" -#include "transports.h" -#include "util.h" - -#include "test_helpers.h" - -static void -test_config_addressmap(void *arg) -{ - char buf[1024]; - char address[256]; - time_t expires = TIME_MAX; - (void)arg; - - strlcpy(buf, "MapAddress .invalidwildcard.com *.torserver.exit\n" // invalid - "MapAddress *invalidasterisk.com *.torserver.exit\n" // invalid - "MapAddress *.google.com *.torserver.exit\n" - "MapAddress *.yahoo.com *.google.com.torserver.exit\n" - "MapAddress *.cn.com www.cnn.com\n" - "MapAddress *.cnn.com www.cnn.com\n" - "MapAddress ex.com www.cnn.com\n" - "MapAddress ey.com *.cnn.com\n" - "MapAddress www.torproject.org 1.1.1.1\n" - "MapAddress other.torproject.org " - "this.torproject.org.otherserver.exit\n" - "MapAddress test.torproject.org 2.2.2.2\n" - "MapAddress www.google.com 3.3.3.3\n" - "MapAddress www.example.org 4.4.4.4\n" - "MapAddress 4.4.4.4 7.7.7.7\n" - "MapAddress 4.4.4.4 5.5.5.5\n" - "MapAddress www.infiniteloop.org 6.6.6.6\n" - "MapAddress 6.6.6.6 www.infiniteloop.org\n" - , sizeof(buf)); - - config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); - config_register_addressmaps(get_options()); - -/* Use old interface for now, so we don't need to rewrite the unit tests */ -#define addressmap_rewrite(a,s,eo,ao) \ - addressmap_rewrite((a),(s), ~0, (eo),(ao)) - - /* MapAddress .invalidwildcard.com .torserver.exit - no match */ - strlcpy(address, "www.invalidwildcard.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - /* MapAddress *invalidasterisk.com .torserver.exit - no match */ - strlcpy(address, "www.invalidasterisk.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - /* Where no mapping for FQDN match on top-level domain */ - /* MapAddress .google.com .torserver.exit */ - strlcpy(address, "reader.google.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "reader.torserver.exit"); - - /* MapAddress *.yahoo.com *.google.com.torserver.exit */ - strlcpy(address, "reader.yahoo.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "reader.google.com.torserver.exit"); - - /*MapAddress *.cnn.com www.cnn.com */ - strlcpy(address, "cnn.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "www.cnn.com"); - - /* MapAddress .cn.com www.cnn.com */ - strlcpy(address, "www.cn.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "www.cnn.com"); - - /* MapAddress ex.com www.cnn.com - no match */ - strlcpy(address, "www.ex.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - /* MapAddress ey.com *.cnn.com - invalid expression */ - strlcpy(address, "ey.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - /* Where mapping for FQDN match on FQDN */ - strlcpy(address, "www.google.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "3.3.3.3"); - - strlcpy(address, "www.torproject.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "1.1.1.1"); - - strlcpy(address, "other.torproject.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "this.torproject.org.otherserver.exit"); - - strlcpy(address, "test.torproject.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "2.2.2.2"); - - /* Test a chain of address mappings and the order in which they were added: - "MapAddress www.example.org 4.4.4.4" - "MapAddress 4.4.4.4 7.7.7.7" - "MapAddress 4.4.4.4 5.5.5.5" - */ - strlcpy(address, "www.example.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "5.5.5.5"); - - /* Test infinite address mapping results in no change */ - strlcpy(address, "www.infiniteloop.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "www.infiniteloop.org"); - - /* Test we don't find false positives */ - strlcpy(address, "www.example.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - /* Test top-level-domain matching a bit harder */ - config_free_lines(get_options_mutable()->AddressMap); - addressmap_clear_configured(); - strlcpy(buf, "MapAddress *.com *.torserver.exit\n" - "MapAddress *.torproject.org 1.1.1.1\n" - "MapAddress *.net 2.2.2.2\n" - , sizeof(buf)); - config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); - config_register_addressmaps(get_options()); - - strlcpy(address, "www.abc.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "www.abc.torserver.exit"); - - strlcpy(address, "www.def.com", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "www.def.torserver.exit"); - - strlcpy(address, "www.torproject.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "1.1.1.1"); - - strlcpy(address, "test.torproject.org", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "1.1.1.1"); - - strlcpy(address, "torproject.net", sizeof(address)); - tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,OP_EQ, "2.2.2.2"); - - /* We don't support '*' as a mapping directive */ - config_free_lines(get_options_mutable()->AddressMap); - addressmap_clear_configured(); - strlcpy(buf, "MapAddress * *.torserver.exit\n", sizeof(buf)); - config_get_lines(buf, &(get_options_mutable()->AddressMap), 0); - config_register_addressmaps(get_options()); - - strlcpy(address, "www.abc.com", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - strlcpy(address, "www.def.net", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - - strlcpy(address, "www.torproject.org", sizeof(address)); - tt_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL)); - -#undef addressmap_rewrite - - done: - config_free_lines(get_options_mutable()->AddressMap); - get_options_mutable()->AddressMap = NULL; - addressmap_free_all(); -} - -static int -is_private_dir(const char* path) -{ - struct stat st; - int r = stat(path, &st); - if (r) { - return 0; - } -#if !defined (_WIN32) - if ((st.st_mode & (S_IFDIR | 0777)) != (S_IFDIR | 0700)) { - return 0; - } -#endif - return 1; -} - -static void -test_config_check_or_create_data_subdir(void *arg) -{ - or_options_t *options = get_options_mutable(); - char *datadir; - const char *subdir = "test_stats"; - char *subpath; - struct stat st; - int r; -#if !defined (_WIN32) - unsigned group_permission; -#endif - (void)arg; - - tor_free(options->DataDirectory); - datadir = options->DataDirectory = tor_strdup(get_fname("datadir-0")); - subpath = get_datadir_fname(subdir); - -#if defined (_WIN32) - tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); -#else - tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); -#endif - - r = stat(subpath, &st); - - // The subdirectory shouldn't exist yet, - // but should be created by the call to check_or_create_data_subdir. - tt_assert(r && (errno == ENOENT)); - tt_assert(!check_or_create_data_subdir(subdir)); - tt_assert(is_private_dir(subpath)); - - // The check should return 0, if the directory already exists - // and is private to the user. - tt_assert(!check_or_create_data_subdir(subdir)); - - r = stat(subpath, &st); - if (r) { - tt_abort_perror("stat"); - } - -#if !defined (_WIN32) - group_permission = st.st_mode | 0070; - r = chmod(subpath, group_permission); - - if (r) { - tt_abort_perror("chmod"); - } - - // If the directory exists, but its mode is too permissive - // a call to check_or_create_data_subdir should reset the mode. - tt_assert(!is_private_dir(subpath)); - tt_assert(!check_or_create_data_subdir(subdir)); - tt_assert(is_private_dir(subpath)); -#endif /* !defined (_WIN32) */ - - done: - rmdir(subpath); - tor_free(datadir); - tor_free(subpath); -} - -static void -test_config_write_to_data_subdir(void *arg) -{ - or_options_t* options = get_options_mutable(); - char *datadir; - char *cp = NULL; - const char* subdir = "test_stats"; - const char* fname = "test_file"; - const char* str = - "Lorem ipsum dolor sit amet, consetetur sadipscing\n" - "elitr, sed diam nonumy eirmod\n" - "tempor invidunt ut labore et dolore magna aliquyam\n" - "erat, sed diam voluptua.\n" - "At vero eos et accusam et justo duo dolores et ea\n" - "rebum. Stet clita kasd gubergren,\n" - "no sea takimata sanctus est Lorem ipsum dolor sit amet.\n" - "Lorem ipsum dolor sit amet,\n" - "consetetur sadipscing elitr, sed diam nonumy eirmod\n" - "tempor invidunt ut labore et dolore\n" - "magna aliquyam erat, sed diam voluptua. At vero eos et\n" - "accusam et justo duo dolores et\n" - "ea rebum. Stet clita kasd gubergren, no sea takimata\n" - "sanctus est Lorem ipsum dolor sit amet."; - char* filepath = NULL; - (void)arg; - - tor_free(options->DataDirectory); - datadir = options->DataDirectory = tor_strdup(get_fname("datadir-1")); - filepath = get_datadir_fname2(subdir, fname); - -#if defined (_WIN32) - tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); -#else - tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); -#endif - - // Write attempt shoudl fail, if subdirectory doesn't exist. - tt_assert(write_to_data_subdir(subdir, fname, str, NULL)); - tt_assert(! check_or_create_data_subdir(subdir)); - - // Content of file after write attempt should be - // equal to the original string. - tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); - cp = read_file_to_str(filepath, 0, NULL); - tt_str_op(cp,OP_EQ, str); - tor_free(cp); - - // A second write operation should overwrite the old content. - tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); - cp = read_file_to_str(filepath, 0, NULL); - tt_str_op(cp,OP_EQ, str); - tor_free(cp); - - done: - (void) unlink(filepath); - rmdir(options->DataDirectory); - tor_free(datadir); - tor_free(filepath); - tor_free(cp); -} - -/* Test helper function: Make sure that a bridge line gets parsed - * properly. Also make sure that the resulting bridge_line_t structure - * has its fields set correctly. */ -static void -good_bridge_line_test(const char *string, const char *test_addrport, - const char *test_digest, const char *test_transport, - const smartlist_t *test_socks_args) -{ - char *tmp = NULL; - bridge_line_t *bridge_line = parse_bridge_line(string); - tt_assert(bridge_line); - - /* test addrport */ - tmp = tor_strdup(fmt_addrport(&bridge_line->addr, bridge_line->port)); - tt_str_op(test_addrport,OP_EQ, tmp); - tor_free(tmp); - - /* If we were asked to validate a digest, but we did not get a - digest after parsing, we failed. */ - if (test_digest && tor_digest_is_zero(bridge_line->digest)) - tt_abort(); - - /* If we were not asked to validate a digest, and we got a digest - after parsing, we failed again. */ - if (!test_digest && !tor_digest_is_zero(bridge_line->digest)) - tt_abort(); - - /* If we were asked to validate a digest, and we got a digest after - parsing, make sure it's correct. */ - if (test_digest) { - tmp = tor_strdup(hex_str(bridge_line->digest, DIGEST_LEN)); - tor_strlower(tmp); - tt_str_op(test_digest,OP_EQ, tmp); - tor_free(tmp); - } - - /* If we were asked to validate a transport name, make sure tha it - matches with the transport name that was parsed. */ - if (test_transport && !bridge_line->transport_name) - tt_abort(); - if (!test_transport && bridge_line->transport_name) - tt_abort(); - if (test_transport) - tt_str_op(test_transport,OP_EQ, bridge_line->transport_name); - - /* Validate the SOCKS argument smartlist. */ - if (test_socks_args && !bridge_line->socks_args) - tt_abort(); - if (!test_socks_args && bridge_line->socks_args) - tt_abort(); - if (test_socks_args) - tt_assert(smartlist_strings_eq(test_socks_args, - bridge_line->socks_args)); - - done: - tor_free(tmp); - bridge_line_free(bridge_line); -} - -/* Test helper function: Make sure that a bridge line is - * unparseable. */ -static void -bad_bridge_line_test(const char *string) -{ - bridge_line_t *bridge_line = parse_bridge_line(string); - if (bridge_line) - TT_FAIL(("%s was supposed to fail, but it didn't.", string)); - tt_ptr_op(bridge_line, OP_EQ, NULL); - - done: - bridge_line_free(bridge_line); -} - -static void -test_config_parse_bridge_line(void *arg) -{ - (void) arg; - good_bridge_line_test("192.0.2.1:4123", - "192.0.2.1:4123", NULL, NULL, NULL); - - good_bridge_line_test("192.0.2.1", - "192.0.2.1:443", NULL, NULL, NULL); - - good_bridge_line_test("transport [::1]", - "[::1]:443", NULL, "transport", NULL); - - good_bridge_line_test("transport 192.0.2.1:12 " - "4352e58420e68f5e40bf7c74faddccd9d1349413", - "192.0.2.1:12", - "4352e58420e68f5e40bf7c74faddccd9d1349413", - "transport", NULL); - - { - smartlist_t *sl_tmp = smartlist_new(); - smartlist_add_asprintf(sl_tmp, "twoandtwo=five"); - - good_bridge_line_test("transport 192.0.2.1:12 " - "4352e58420e68f5e40bf7c74faddccd9d1349413 twoandtwo=five", - "192.0.2.1:12", "4352e58420e68f5e40bf7c74faddccd9d1349413", - "transport", sl_tmp); - - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - } - - { - smartlist_t *sl_tmp = smartlist_new(); - smartlist_add_asprintf(sl_tmp, "twoandtwo=five"); - smartlist_add_asprintf(sl_tmp, "z=z"); - - good_bridge_line_test("transport 192.0.2.1:12 twoandtwo=five z=z", - "192.0.2.1:12", NULL, "transport", sl_tmp); - - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - } - - { - smartlist_t *sl_tmp = smartlist_new(); - smartlist_add_asprintf(sl_tmp, "dub=come"); - smartlist_add_asprintf(sl_tmp, "save=me"); - - good_bridge_line_test("transport 192.0.2.1:12 " - "4352e58420e68f5e40bf7c74faddccd9d1349666 " - "dub=come save=me", - - "192.0.2.1:12", - "4352e58420e68f5e40bf7c74faddccd9d1349666", - "transport", sl_tmp); - - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - } - - good_bridge_line_test("192.0.2.1:1231 " - "4352e58420e68f5e40bf7c74faddccd9d1349413", - "192.0.2.1:1231", - "4352e58420e68f5e40bf7c74faddccd9d1349413", - NULL, NULL); - - /* Empty line */ - bad_bridge_line_test(""); - /* bad transport name */ - bad_bridge_line_test("tr$n_sp0r7 190.20.2.2"); - /* weird ip address */ - bad_bridge_line_test("a.b.c.d"); - /* invalid fpr */ - bad_bridge_line_test("2.2.2.2:1231 4352e58420e68f5e40bf7c74faddccd9d1349"); - /* no k=v in the end */ - bad_bridge_line_test("obfs2 2.2.2.2:1231 " - "4352e58420e68f5e40bf7c74faddccd9d1349413 what"); - /* no addrport */ - bad_bridge_line_test("asdw"); - /* huge k=v value that can't fit in SOCKS fields */ - bad_bridge_line_test( - "obfs2 2.2.2.2:1231 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aa=b"); -} - -static void -test_config_parse_transport_options_line(void *arg) -{ - smartlist_t *options_sl = NULL, *sl_tmp = NULL; - - (void) arg; - - { /* too small line */ - options_sl = get_options_from_transport_options_line("valley", NULL); - tt_ptr_op(options_sl, OP_EQ, NULL); - } - - { /* no k=v values */ - options_sl = get_options_from_transport_options_line("hit it!", NULL); - tt_ptr_op(options_sl, OP_EQ, NULL); - } - - { /* correct line, but wrong transport specified */ - options_sl = - get_options_from_transport_options_line("trebuchet k=v", "rook"); - tt_ptr_op(options_sl, OP_EQ, NULL); - } - - { /* correct -- no transport specified */ - sl_tmp = smartlist_new(); - smartlist_add_asprintf(sl_tmp, "ladi=dadi"); - smartlist_add_asprintf(sl_tmp, "weliketo=party"); - - options_sl = - get_options_from_transport_options_line("rook ladi=dadi weliketo=party", - NULL); - tt_assert(options_sl); - tt_assert(smartlist_strings_eq(options_sl, sl_tmp)); - - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - sl_tmp = NULL; - SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); - smartlist_free(options_sl); - options_sl = NULL; - } - - { /* correct -- correct transport specified */ - sl_tmp = smartlist_new(); - smartlist_add_asprintf(sl_tmp, "ladi=dadi"); - smartlist_add_asprintf(sl_tmp, "weliketo=party"); - - options_sl = - get_options_from_transport_options_line("rook ladi=dadi weliketo=party", - "rook"); - tt_assert(options_sl); - tt_assert(smartlist_strings_eq(options_sl, sl_tmp)); - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - sl_tmp = NULL; - SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); - smartlist_free(options_sl); - options_sl = NULL; - } - - done: - if (options_sl) { - SMARTLIST_FOREACH(options_sl, char *, s, tor_free(s)); - smartlist_free(options_sl); - } - if (sl_tmp) { - SMARTLIST_FOREACH(sl_tmp, char *, s, tor_free(s)); - smartlist_free(sl_tmp); - } -} - -/* Mocks needed for the transport plugin line test */ - -static void pt_kickstart_proxy_mock(const smartlist_t *transport_list, - char **proxy_argv, int is_server); -static int transport_add_from_config_mock(const tor_addr_t *addr, - uint16_t port, const char *name, - int socks_ver); -static int transport_is_needed_mock(const char *transport_name); - -static int pt_kickstart_proxy_mock_call_count = 0; -static int transport_add_from_config_mock_call_count = 0; -static int transport_is_needed_mock_call_count = 0; -static int transport_is_needed_mock_return = 0; - -static void -pt_kickstart_proxy_mock(const smartlist_t *transport_list, - char **proxy_argv, int is_server) -{ - (void) transport_list; - (void) proxy_argv; - (void) is_server; - /* XXXX check that args are as expected. */ - - ++pt_kickstart_proxy_mock_call_count; - - free_execve_args(proxy_argv); -} - -static int -transport_add_from_config_mock(const tor_addr_t *addr, - uint16_t port, const char *name, - int socks_ver) -{ - (void) addr; - (void) port; - (void) name; - (void) socks_ver; - /* XXXX check that args are as expected. */ - - ++transport_add_from_config_mock_call_count; - - return 0; -} - -static int -transport_is_needed_mock(const char *transport_name) -{ - (void) transport_name; - /* XXXX check that arg is as expected. */ - - ++transport_is_needed_mock_call_count; - - return transport_is_needed_mock_return; -} - -/** - * Test parsing for the ClientTransportPlugin and ServerTransportPlugin config - * options. - */ - -static void -test_config_parse_transport_plugin_line(void *arg) -{ - (void)arg; - - or_options_t *options = get_options_mutable(); - int r, tmp; - int old_pt_kickstart_proxy_mock_call_count; - int old_transport_add_from_config_mock_call_count; - int old_transport_is_needed_mock_call_count; - - /* Bad transport lines - too short */ - r = parse_transport_line(options, "bad", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, "bad", 1, 1); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, "bad bad", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, "bad bad", 1, 1); - tt_int_op(r, OP_LT, 0); - - /* Test transport list parsing */ - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 1, 0); - tt_int_op(r, OP_EQ, 0); - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 1, 1); - tt_int_op(r, OP_EQ, 0); - r = parse_transport_line(options, - "transport_1,transport_2 exec /usr/bin/fake-transport", 1, 0); - tt_int_op(r, OP_EQ, 0); - r = parse_transport_line(options, - "transport_1,transport_2 exec /usr/bin/fake-transport", 1, 1); - tt_int_op(r, OP_EQ, 0); - /* Bad transport identifiers */ - r = parse_transport_line(options, - "transport_* exec /usr/bin/fake-transport", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_* exec /usr/bin/fake-transport", 1, 1); - tt_int_op(r, OP_LT, 0); - - /* Check SOCKS cases for client transport */ - r = parse_transport_line(options, - "transport_1 socks4 1.2.3.4:567", 1, 0); - tt_int_op(r, OP_EQ, 0); - r = parse_transport_line(options, - "transport_1 socks5 1.2.3.4:567", 1, 0); - tt_int_op(r, OP_EQ, 0); - /* Proxy case for server transport */ - r = parse_transport_line(options, - "transport_1 proxy 1.2.3.4:567", 1, 1); - tt_int_op(r, OP_EQ, 0); - /* Multiple-transport error exit */ - r = parse_transport_line(options, - "transport_1,transport_2 socks5 1.2.3.4:567", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_1,transport_2 proxy 1.2.3.4:567", 1, 1); - tt_int_op(r, OP_LT, 0); - /* No port error exit */ - r = parse_transport_line(options, - "transport_1 socks5 1.2.3.4", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_1 proxy 1.2.3.4", 1, 1); - tt_int_op(r, OP_LT, 0); - /* Unparsable address error exit */ - r = parse_transport_line(options, - "transport_1 socks5 1.2.3:6x7", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_1 proxy 1.2.3:6x7", 1, 1); - tt_int_op(r, OP_LT, 0); - - /* "Strange {Client|Server}TransportPlugin field" error exit */ - r = parse_transport_line(options, - "transport_1 foo bar", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_1 foo bar", 1, 1); - tt_int_op(r, OP_LT, 0); - - /* No sandbox mode error exit */ - tmp = options->Sandbox; - options->Sandbox = 1; - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 1, 0); - tt_int_op(r, OP_LT, 0); - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 1, 1); - tt_int_op(r, OP_LT, 0); - options->Sandbox = tmp; - - /* - * These final test cases cover code paths that only activate without - * validate_only, so they need mocks in place. - */ - MOCK(pt_kickstart_proxy, pt_kickstart_proxy_mock); - old_pt_kickstart_proxy_mock_call_count = - pt_kickstart_proxy_mock_call_count; - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 0, 1); - tt_int_op(r, OP_EQ, 0); - tt_assert(pt_kickstart_proxy_mock_call_count == - old_pt_kickstart_proxy_mock_call_count + 1); - UNMOCK(pt_kickstart_proxy); - - /* This one hits a log line in the !validate_only case only */ - r = parse_transport_line(options, - "transport_1 proxy 1.2.3.4:567", 0, 1); - tt_int_op(r, OP_EQ, 0); - - /* Check mocked client transport cases */ - MOCK(pt_kickstart_proxy, pt_kickstart_proxy_mock); - MOCK(transport_add_from_config, transport_add_from_config_mock); - MOCK(transport_is_needed, transport_is_needed_mock); - - /* Unnecessary transport case */ - transport_is_needed_mock_return = 0; - old_pt_kickstart_proxy_mock_call_count = - pt_kickstart_proxy_mock_call_count; - old_transport_add_from_config_mock_call_count = - transport_add_from_config_mock_call_count; - old_transport_is_needed_mock_call_count = - transport_is_needed_mock_call_count; - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 0, 0); - /* Should have succeeded */ - tt_int_op(r, OP_EQ, 0); - /* transport_is_needed() should have been called */ - tt_assert(transport_is_needed_mock_call_count == - old_transport_is_needed_mock_call_count + 1); - /* - * pt_kickstart_proxy() and transport_add_from_config() should - * not have been called. - */ - tt_assert(pt_kickstart_proxy_mock_call_count == - old_pt_kickstart_proxy_mock_call_count); - tt_assert(transport_add_from_config_mock_call_count == - old_transport_add_from_config_mock_call_count); - - /* Necessary transport case */ - transport_is_needed_mock_return = 1; - old_pt_kickstart_proxy_mock_call_count = - pt_kickstart_proxy_mock_call_count; - old_transport_add_from_config_mock_call_count = - transport_add_from_config_mock_call_count; - old_transport_is_needed_mock_call_count = - transport_is_needed_mock_call_count; - r = parse_transport_line(options, - "transport_1 exec /usr/bin/fake-transport", 0, 0); - /* Should have succeeded */ - tt_int_op(r, OP_EQ, 0); - /* - * transport_is_needed() and pt_kickstart_proxy() should have been - * called. - */ - tt_assert(pt_kickstart_proxy_mock_call_count == - old_pt_kickstart_proxy_mock_call_count + 1); - tt_assert(transport_is_needed_mock_call_count == - old_transport_is_needed_mock_call_count + 1); - /* transport_add_from_config() should not have been called. */ - tt_assert(transport_add_from_config_mock_call_count == - old_transport_add_from_config_mock_call_count); - - /* proxy case */ - transport_is_needed_mock_return = 1; - old_pt_kickstart_proxy_mock_call_count = - pt_kickstart_proxy_mock_call_count; - old_transport_add_from_config_mock_call_count = - transport_add_from_config_mock_call_count; - old_transport_is_needed_mock_call_count = - transport_is_needed_mock_call_count; - r = parse_transport_line(options, - "transport_1 socks5 1.2.3.4:567", 0, 0); - /* Should have succeeded */ - tt_int_op(r, OP_EQ, 0); - /* - * transport_is_needed() and transport_add_from_config() should have - * been called. - */ - tt_assert(transport_add_from_config_mock_call_count == - old_transport_add_from_config_mock_call_count + 1); - tt_assert(transport_is_needed_mock_call_count == - old_transport_is_needed_mock_call_count + 1); - /* pt_kickstart_proxy() should not have been called. */ - tt_assert(pt_kickstart_proxy_mock_call_count == - old_pt_kickstart_proxy_mock_call_count); - - /* Done with mocked client transport cases */ - UNMOCK(transport_is_needed); - UNMOCK(transport_add_from_config); - UNMOCK(pt_kickstart_proxy); - - done: - /* Make sure we undo all mocks */ - UNMOCK(pt_kickstart_proxy); - UNMOCK(transport_add_from_config); - UNMOCK(transport_is_needed); - - return; -} - -// Tests if an options with MyFamily fingerprints missing '$' normalises -// them correctly and also ensure it also works with multiple fingerprints -static void -test_config_fix_my_family(void *arg) -{ - char *err = NULL; - config_line_t *family = tor_malloc_zero(sizeof(config_line_t)); - family->key = tor_strdup("MyFamily"); - family->value = tor_strdup("$1111111111111111111111111111111111111111, " - "1111111111111111111111111111111111111112, " - "$1111111111111111111111111111111111111113"); - - config_line_t *family2 = tor_malloc_zero(sizeof(config_line_t)); - family2->key = tor_strdup("MyFamily"); - family2->value = tor_strdup("1111111111111111111111111111111111111114"); - - config_line_t *family3 = tor_malloc_zero(sizeof(config_line_t)); - family3->key = tor_strdup("MyFamily"); - family3->value = tor_strdup("$1111111111111111111111111111111111111115"); - - family->next = family2; - family2->next = family3; - family3->next = NULL; - - or_options_t* options = options_new(); - or_options_t* defaults = options_new(); - (void) arg; - - options_init(options); - options_init(defaults); - options->MyFamily_lines = family; - - options_validate(NULL, options, defaults, 0, &err) ; - - if (err != NULL) { - TT_FAIL(("options_validate failed: %s", err)); - } - - const char *valid[] = { "$1111111111111111111111111111111111111111", - "$1111111111111111111111111111111111111112", - "$1111111111111111111111111111111111111113", - "$1111111111111111111111111111111111111114", - "$1111111111111111111111111111111111111115" }; - int ret_size = 0; - config_line_t *ret; - for (ret = options->MyFamily; ret && ret_size < 5; ret = ret->next) { - tt_str_op(ret->value, OP_EQ, valid[ret_size]); - ret_size++; - } - tt_int_op(ret_size, OP_EQ, 5); - - done: - tor_free(err); - or_options_free(options); - or_options_free(defaults); -} - -static int n_hostname_01010101 = 0; - -/** This mock function is meant to replace tor_lookup_hostname(). - * It answers with 1.1.1.1 as IP adddress that resulted from lookup. - * This function increments n_hostname_01010101 counter by one - * every time it is called. - */ -static int -tor_lookup_hostname_01010101(const char *name, uint32_t *addr) -{ - n_hostname_01010101++; - - if (name && addr) { - *addr = ntohl(0x01010101); - } - - return 0; -} - -static int n_hostname_localhost = 0; - -/** This mock function is meant to replace tor_lookup_hostname(). - * It answers with 127.0.0.1 as IP adddress that resulted from lookup. - * This function increments n_hostname_localhost counter by one - * every time it is called. - */ -static int -tor_lookup_hostname_localhost(const char *name, uint32_t *addr) -{ - n_hostname_localhost++; - - if (name && addr) { - *addr = 0x7f000001; - } - - return 0; -} - -static int n_hostname_failure = 0; - -/** This mock function is meant to replace tor_lookup_hostname(). - * It pretends to fail by returning -1 to caller. Also, this function - * increments n_hostname_failure every time it is called. - */ -static int -tor_lookup_hostname_failure(const char *name, uint32_t *addr) -{ - (void)name; - (void)addr; - - n_hostname_failure++; - - return -1; -} - -static int n_gethostname_replacement = 0; - -/** This mock function is meant to replace tor_gethostname(). It - * responds with string "onionrouter!" as hostname. This function - * increments n_gethostname_replacement by one every time - * it is called. - */ -static int -tor_gethostname_replacement(char *name, size_t namelen) -{ - n_gethostname_replacement++; - - if (name && namelen) { - strlcpy(name,"onionrouter!",namelen); - } - - return 0; -} - -static int n_gethostname_localhost = 0; - -/** This mock function is meant to replace tor_gethostname(). It - * responds with string "127.0.0.1" as hostname. This function - * increments n_gethostname_localhost by one every time - * it is called. - */ -static int -tor_gethostname_localhost(char *name, size_t namelen) -{ - n_gethostname_localhost++; - - if (name && namelen) { - strlcpy(name,"127.0.0.1",namelen); - } - - return 0; -} - -static int n_gethostname_failure = 0; - -/** This mock function is meant to replace tor_gethostname. - * It pretends to fail by returning -1. This function increments - * n_gethostname_failure by one every time it is called. - */ -static int -tor_gethostname_failure(char *name, size_t namelen) -{ - (void)name; - (void)namelen; - n_gethostname_failure++; - - return -1; -} - -static int n_get_interface_address = 0; - -/** This mock function is meant to replace get_interface_address(). - * It answers with address 8.8.8.8. This function increments - * n_get_interface_address by one every time it is called. - */ -static int -get_interface_address_08080808(int severity, uint32_t *addr) -{ - (void)severity; - - n_get_interface_address++; - - if (addr) { - *addr = ntohl(0x08080808); - } - - return 0; -} - -static int n_get_interface_address6 = 0; -static sa_family_t last_address6_family; - -/** This mock function is meant to replace get_interface_address6(). - * It answers with IP address 9.9.9.9 iff both of the following are true: - * - family is AF_INET - * - addr pointer is not NULL. - * This function increments n_get_interface_address6 by one every - * time it is called. - */ -static int -get_interface_address6_replacement(int severity, sa_family_t family, - tor_addr_t *addr) -{ - (void)severity; - - last_address6_family = family; - n_get_interface_address6++; - - if ((family != AF_INET) || !addr) { - return -1; - } - - tor_addr_from_ipv4h(addr,0x09090909); - - return 0; -} - -static int n_get_interface_address_failure = 0; - -/** - * This mock function is meant to replace get_interface_address(). - * It pretends to fail getting interface address by returning -1. - * n_get_interface_address_failure is incremented by one - * every time this function is called. - */ -static int -get_interface_address_failure(int severity, uint32_t *addr) -{ - (void)severity; - (void)addr; - - n_get_interface_address_failure++; - - return -1; -} - -static int n_get_interface_address6_failure = 0; - -/** - * This mock function is meant to replace get_interface_addres6(). - * It will pretend to fail by return -1. - * n_get_interface_address6_failure is incremented by one - * every time this function is called and last_address6_family - * is assigned the value of family argument. - */ -static int -get_interface_address6_failure(int severity, sa_family_t family, - tor_addr_t *addr) -{ - (void)severity; - (void)addr; - n_get_interface_address6_failure++; - last_address6_family = family; - - return -1; -} - -static void -test_config_resolve_my_address(void *arg) -{ - or_options_t *options; - uint32_t resolved_addr; - const char *method_used; - char *hostname_out = NULL; - int retval; - int prev_n_hostname_01010101; - int prev_n_hostname_localhost; - int prev_n_hostname_failure; - int prev_n_gethostname_replacement; - int prev_n_gethostname_failure; - int prev_n_gethostname_localhost; - int prev_n_get_interface_address; - int prev_n_get_interface_address_failure; - int prev_n_get_interface_address6; - int prev_n_get_interface_address6_failure; - - (void)arg; - - options = options_new(); - - options_init(options); - - /* - * CASE 1: - * If options->Address is a valid IPv4 address string, we want - * the corresponding address to be parsed and returned. - */ - - options->Address = tor_strdup("128.52.128.105"); - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(retval == 0); - tt_want_str_op(method_used,OP_EQ,"CONFIGURED"); - tt_want(hostname_out == NULL); - tt_assert(resolved_addr == 0x80348069); - - tor_free(options->Address); - -/* - * CASE 2: - * If options->Address is a valid DNS address, we want resolve_my_address() - * function to ask tor_lookup_hostname() for help with resolving it - * and return the address that was resolved (in host order). - */ - - MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); - - tor_free(options->Address); - options->Address = tor_strdup("www.torproject.org"); - - prev_n_hostname_01010101 = n_hostname_01010101; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(retval == 0); - tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); - tt_want_str_op(method_used,OP_EQ,"RESOLVED"); - tt_want_str_op(hostname_out,OP_EQ,"www.torproject.org"); - tt_assert(resolved_addr == 0x01010101); - - UNMOCK(tor_lookup_hostname); - - tor_free(options->Address); - tor_free(hostname_out); - -/* - * CASE 3: - * Given that options->Address is NULL, we want resolve_my_address() - * to try and use tor_gethostname() to get hostname AND use - * tor_lookup_hostname() to get IP address. - */ - - resolved_addr = 0; - tor_free(options->Address); - options->Address = NULL; - - MOCK(tor_gethostname,tor_gethostname_replacement); - MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); - - prev_n_gethostname_replacement = n_gethostname_replacement; - prev_n_hostname_01010101 = n_hostname_01010101; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(retval == 0); - tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); - tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); - tt_want_str_op(method_used,OP_EQ,"GETHOSTNAME"); - tt_want_str_op(hostname_out,OP_EQ,"onionrouter!"); - tt_assert(resolved_addr == 0x01010101); - - UNMOCK(tor_gethostname); - UNMOCK(tor_lookup_hostname); - - tor_free(hostname_out); - -/* - * CASE 4: - * Given that options->Address is a local host address, we want - * resolve_my_address() function to fail. - */ - - resolved_addr = 0; - tor_free(options->Address); - options->Address = tor_strdup("127.0.0.1"); - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(resolved_addr == 0); - tt_int_op(retval, OP_EQ, -1); - - tor_free(options->Address); - tor_free(hostname_out); - -/* - * CASE 5: - * We want resolve_my_address() to fail if DNS address in options->Address - * cannot be resolved. - */ - - MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); - - prev_n_hostname_failure = n_hostname_failure; - - tor_free(options->Address); - options->Address = tor_strdup("www.tor-project.org"); - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(n_hostname_failure == prev_n_hostname_failure + 1); - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(tor_lookup_hostname); - - tor_free(options->Address); - tor_free(hostname_out); - -/* - * CASE 6: - * If options->Address is NULL AND gettting local hostname fails, we want - * resolve_my_address() to fail as well. - */ - - MOCK(tor_gethostname,tor_gethostname_failure); - - prev_n_gethostname_failure = n_gethostname_failure; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(n_gethostname_failure == prev_n_gethostname_failure + 1); - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(tor_gethostname); - tor_free(hostname_out); - -/* - * CASE 7: - * We want resolve_my_address() to try and get network interface address via - * get_interface_address() if hostname returned by tor_gethostname() cannot be - * resolved into IP address. - */ - - MOCK(tor_gethostname,tor_gethostname_replacement); - MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); - MOCK(get_interface_address,get_interface_address_08080808); - - prev_n_gethostname_replacement = n_gethostname_replacement; - prev_n_get_interface_address = n_get_interface_address; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(retval == 0); - tt_want_int_op(n_gethostname_replacement, OP_EQ, - prev_n_gethostname_replacement + 1); - tt_want_int_op(n_get_interface_address, OP_EQ, - prev_n_get_interface_address + 1); - tt_want_str_op(method_used,OP_EQ,"INTERFACE"); - tt_want(hostname_out == NULL); - tt_assert(resolved_addr == 0x08080808); - - UNMOCK(get_interface_address); - tor_free(hostname_out); - -/* - * CASE 8: - * Suppose options->Address is NULL AND hostname returned by tor_gethostname() - * is unresolvable. We want resolve_my_address to fail if - * get_interface_address() fails. - */ - - MOCK(get_interface_address,get_interface_address_failure); - - prev_n_get_interface_address_failure = n_get_interface_address_failure; - prev_n_gethostname_replacement = n_gethostname_replacement; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(n_get_interface_address_failure == - prev_n_get_interface_address_failure + 1); - tt_want(n_gethostname_replacement == - prev_n_gethostname_replacement + 1); - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(get_interface_address); - tor_free(hostname_out); - -/* - * CASE 9: - * Given that options->Address is NULL AND tor_lookup_hostname() - * fails AND hostname returned by gethostname() resolves - * to local IP address, we want resolve_my_address() function to - * call get_interface_address6(.,AF_INET,.) and return IP address - * the latter function has found. - */ - - MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); - MOCK(tor_gethostname,tor_gethostname_replacement); - MOCK(get_interface_address6,get_interface_address6_replacement); - - prev_n_gethostname_replacement = n_gethostname_replacement; - prev_n_hostname_failure = n_hostname_failure; - prev_n_get_interface_address6 = n_get_interface_address6; - - retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, - &method_used,&hostname_out); - - tt_want(last_address6_family == AF_INET); - tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); - tt_want(n_hostname_failure == prev_n_hostname_failure + 1); - tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); - tt_want(retval == 0); - tt_want_str_op(method_used,OP_EQ,"INTERFACE"); - tt_assert(resolved_addr == 0x09090909); - - UNMOCK(tor_lookup_hostname); - UNMOCK(tor_gethostname); - UNMOCK(get_interface_address6); - - tor_free(hostname_out); - - /* - * CASE 10: We want resolve_my_address() to fail if all of the following - * are true: - * 1. options->Address is not NULL - * 2. ... but it cannot be converted to struct in_addr by - * tor_inet_aton() - * 3. ... and tor_lookup_hostname() fails to resolve the - * options->Address - */ - - MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); - - prev_n_hostname_failure = n_hostname_failure; - - tor_free(options->Address); - options->Address = tor_strdup("some_hostname"); - - retval = resolve_my_address(LOG_NOTICE, options, &resolved_addr, - &method_used,&hostname_out); - - tt_want(n_hostname_failure == prev_n_hostname_failure + 1); - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(tor_gethostname); - UNMOCK(tor_lookup_hostname); - - tor_free(hostname_out); - - /* - * CASE 11: - * Suppose the following sequence of events: - * 1. options->Address is NULL - * 2. tor_gethostname() succeeds to get hostname of machine Tor - * if running on. - * 3. Hostname from previous step cannot be converted to - * address by using tor_inet_aton() function. - * 4. However, tor_lookup_hostname() succeds in resolving the - * hostname from step 2. - * 5. Unfortunately, tor_addr_is_internal() deems this address - * to be internal. - * 6. get_interface_address6(.,AF_INET,.) returns non-internal - * IPv4 - * - * We want resolve_my_addr() to succeed with method "INTERFACE" - * and address from step 6. - */ - - tor_free(options->Address); - options->Address = NULL; - - MOCK(tor_gethostname,tor_gethostname_replacement); - MOCK(tor_lookup_hostname,tor_lookup_hostname_localhost); - MOCK(get_interface_address6,get_interface_address6_replacement); - - prev_n_gethostname_replacement = n_gethostname_replacement; - prev_n_hostname_localhost = n_hostname_localhost; - prev_n_get_interface_address6 = n_get_interface_address6; - - retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, - &method_used,&hostname_out); - - tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); - tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); - tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); - - tt_str_op(method_used,OP_EQ,"INTERFACE"); - tt_ptr_op(hostname_out, OP_EQ, NULL); - tt_int_op(retval, OP_EQ, 0); - - /* - * CASE 11b: - * 1-5 as above. - * 6. get_interface_address6() fails. - * - * In this subcase, we want resolve_my_address() to fail. - */ - - UNMOCK(get_interface_address6); - MOCK(get_interface_address6,get_interface_address6_failure); - - prev_n_gethostname_replacement = n_gethostname_replacement; - prev_n_hostname_localhost = n_hostname_localhost; - prev_n_get_interface_address6_failure = n_get_interface_address6_failure; - - retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, - &method_used,&hostname_out); - - tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); - tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); - tt_want(n_get_interface_address6_failure == - prev_n_get_interface_address6_failure + 1); - - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(tor_gethostname); - UNMOCK(tor_lookup_hostname); - UNMOCK(get_interface_address6); - - /* CASE 12: - * Suppose the following happens: - * 1. options->Address is NULL AND options->DirAuthorities is non-NULL - * 2. tor_gethostname() succeeds in getting hostname of a machine ... - * 3. ... which is successfully parsed by tor_inet_aton() ... - * 4. into IPv4 address that tor_addr_is_inernal() considers to be - * internal. - * - * In this case, we want resolve_my_address() to fail. - */ - - tor_free(options->Address); - options->Address = NULL; - options->DirAuthorities = tor_malloc_zero(sizeof(config_line_t)); - - MOCK(tor_gethostname,tor_gethostname_localhost); - - prev_n_gethostname_localhost = n_gethostname_localhost; - - retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, - &method_used,&hostname_out); - - tt_want(n_gethostname_localhost == prev_n_gethostname_localhost + 1); - tt_int_op(retval, OP_EQ, -1); - - UNMOCK(tor_gethostname); - - done: - tor_free(options->Address); - tor_free(options->DirAuthorities); - or_options_free(options); - tor_free(hostname_out); - - UNMOCK(tor_gethostname); - UNMOCK(tor_lookup_hostname); - UNMOCK(get_interface_address); - UNMOCK(get_interface_address6); - UNMOCK(tor_gethostname); -} - -static void -test_config_adding_trusted_dir_server(void *arg) -{ - (void)arg; - - const char digest[DIGEST_LEN] = ""; - dir_server_t *ds = NULL; - tor_addr_port_t ipv6; - int rv = -1; - - clear_dir_servers(); - routerlist_free_all(); - - /* create a trusted ds without an IPv6 address and port */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 1); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); - - /* create a trusted ds with an IPv6 address and port */ - rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1); - tt_int_op(rv, OP_EQ, 0); - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, &ipv6, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 2); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2); - - done: - clear_dir_servers(); - routerlist_free_all(); -} - -static void -test_config_adding_fallback_dir_server(void *arg) -{ - (void)arg; - - const char digest[DIGEST_LEN] = ""; - dir_server_t *ds = NULL; - tor_addr_t ipv4; - tor_addr_port_t ipv6; - int rv = -1; - - clear_dir_servers(); - routerlist_free_all(); - - rv = tor_addr_parse(&ipv4, "127.0.0.1"); - tt_int_op(rv, OP_EQ, AF_INET); - - /* create a trusted ds without an IPv6 address and port */ - ds = fallback_dir_server_new(&ipv4, 9059, 9060, NULL, digest, 1.0); - tt_assert(ds); - dir_server_add(ds); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); - - /* create a trusted ds with an IPv6 address and port */ - rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1); - tt_int_op(rv, OP_EQ, 0); - ds = fallback_dir_server_new(&ipv4, 9059, 9060, &ipv6, digest, 1.0); - tt_assert(ds); - dir_server_add(ds); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2); - - done: - clear_dir_servers(); - routerlist_free_all(); -} - -/* No secrets here: - * v3ident is `echo "onion" | shasum | cut -d" " -f1 | tr "a-f" "A-F"` - * fingerprint is `echo "unionem" | shasum | cut -d" " -f1 | tr "a-f" "A-F"` - * with added spaces - */ -#define TEST_DIR_AUTH_LINE_START \ - "foobar orport=12345 " \ - "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " -#define TEST_DIR_AUTH_LINE_END \ - "1.2.3.4:54321 " \ - "FDB2 FBD2 AAA5 25FA 2999 E617 5091 5A32 C777 3B17" -#define TEST_DIR_AUTH_IPV6_FLAG \ - "ipv6=[feed::beef]:9 " - -static void -test_config_parsing_trusted_dir_server(void *arg) -{ - (void)arg; - int rv = -1; - - /* parse a trusted dir server without an IPv6 address and port */ - rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START - TEST_DIR_AUTH_LINE_END, - V3_DIRINFO, 1); - tt_int_op(rv, OP_EQ, 0); - - /* parse a trusted dir server with an IPv6 address and port */ - rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START - TEST_DIR_AUTH_IPV6_FLAG - TEST_DIR_AUTH_LINE_END, - V3_DIRINFO, 1); - tt_int_op(rv, OP_EQ, 0); - - /* Since we are only validating, there is no cleanup. */ - done: - ; -} - -#undef TEST_DIR_AUTH_LINE_START -#undef TEST_DIR_AUTH_LINE_END -#undef TEST_DIR_AUTH_IPV6_FLAG - -/* No secrets here: - * id is `echo "syn-propanethial-S-oxide" | shasum | cut -d" " -f1` - */ -#define TEST_DIR_FALLBACK_LINE \ - "1.2.3.4:54321 orport=12345 " \ - "id=50e643986f31ea1235bcc1af17a1c5c5cfc0ee54 " -#define TEST_DIR_FALLBACK_IPV6_FLAG \ - "ipv6=[2015:c0de::deed]:9" - -static void -test_config_parsing_fallback_dir_server(void *arg) -{ - (void)arg; - int rv = -1; - - /* parse a trusted dir server without an IPv6 address and port */ - rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE, 1); - tt_int_op(rv, OP_EQ, 0); - - /* parse a trusted dir server with an IPv6 address and port */ - rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE - TEST_DIR_FALLBACK_IPV6_FLAG, - 1); - tt_int_op(rv, OP_EQ, 0); - - /* Since we are only validating, there is no cleanup. */ - done: - ; -} - -#undef TEST_DIR_FALLBACK_LINE -#undef TEST_DIR_FALLBACK_IPV6_FLAG - -static void -test_config_adding_default_trusted_dir_servers(void *arg) -{ - (void)arg; - - clear_dir_servers(); - routerlist_free_all(); - - /* Assume we only have one bridge authority */ - add_default_trusted_dir_authorities(BRIDGE_DIRINFO); - tt_int_op(get_n_authorities(BRIDGE_DIRINFO), OP_EQ, 1); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1); - - /* Assume we have eight V3 authorities */ - add_default_trusted_dir_authorities(V3_DIRINFO); - tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 9); - tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 10); - - done: - clear_dir_servers(); - routerlist_free_all(); -} - -static int n_add_default_fallback_dir_servers_known_default = 0; - -/** - * This mock function is meant to replace add_default_fallback_dir_servers(). - * It will parse and add one known default fallback dir server, - * which has a dir_port of 99. - * n_add_default_fallback_dir_servers_known_default is incremented by - * one every time this function is called. - */ -static void -add_default_fallback_dir_servers_known_default(void) -{ - int i; - const char *fallback[] = { - "127.0.0.1:60099 orport=9009 " - "id=0923456789012345678901234567890123456789", - NULL - }; - for (i=0; fallback[i]; i++) { - if (parse_dir_fallback_line(fallback[i], 0)<0) { - log_err(LD_BUG, "Couldn't parse internal FallbackDir line %s", - fallback[i]); - } - } - n_add_default_fallback_dir_servers_known_default++; -} - -/* Test all the different combinations of adding dir servers */ -static void -test_config_adding_dir_servers(void *arg) -{ - (void)arg; - - /* allocate options */ - or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); - - /* Allocate and populate configuration lines: - * - * Use the same format as the hard-coded directories in - * add_default_trusted_dir_authorities(). - * Zeroing the structure has the same effect as initialising to: - * { NULL, NULL, NULL, CONFIG_LINE_NORMAL, 0}; - */ - config_line_t *test_dir_authority = tor_malloc_zero(sizeof(config_line_t)); - test_dir_authority->key = tor_strdup("DirAuthority"); - test_dir_authority->value = tor_strdup( - "D0 orport=9000 " - "v3ident=0023456789012345678901234567890123456789 " - "127.0.0.1:60090 0123 4567 8901 2345 6789 0123 4567 8901 2345 6789" - ); - - config_line_t *test_alt_bridge_authority = tor_malloc_zero( - sizeof(config_line_t)); - test_alt_bridge_authority->key = tor_strdup("AlternateBridgeAuthority"); - test_alt_bridge_authority->value = tor_strdup( - "B1 orport=9001 bridge " - "127.0.0.1:60091 1123 4567 8901 2345 6789 0123 4567 8901 2345 6789" - ); - - config_line_t *test_alt_dir_authority = tor_malloc_zero( - sizeof(config_line_t)); - test_alt_dir_authority->key = tor_strdup("AlternateDirAuthority"); - test_alt_dir_authority->value = tor_strdup( - "A2 orport=9002 " - "v3ident=0223456789012345678901234567890123456789 " - "127.0.0.1:60092 2123 4567 8901 2345 6789 0123 4567 8901 2345 6789" - ); - - /* Use the format specified in the manual page */ - config_line_t *test_fallback_directory = tor_malloc_zero( - sizeof(config_line_t)); - test_fallback_directory->key = tor_strdup("FallbackDir"); - test_fallback_directory->value = tor_strdup( - "127.0.0.1:60093 orport=9003 id=0323456789012345678901234567890123456789" - ); - - /* We need to know if add_default_fallback_dir_servers is called, - * whatever the size of the list in fallback_dirs.inc, - * so we use a version of add_default_fallback_dir_servers that adds - * one known default fallback directory. */ - MOCK(add_default_fallback_dir_servers, - add_default_fallback_dir_servers_known_default); - - /* There are 16 different cases, covering each combination of set/NULL for: - * DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority & - * FallbackDir. (We always set UseDefaultFallbackDirs to 1.) - * But validate_dir_servers() ensures that: - * "You cannot set both DirAuthority and Alternate*Authority." - * This reduces the number of cases to 10. - * - * Let's count these cases using binary, with 1 meaning set & 0 meaning NULL - * So 1001 or case 9 is: - * DirAuthorities set, - * AlternateBridgeAuthority NULL, - * AlternateDirAuthority NULL - * FallbackDir set - * The valid cases are cases 0-9 counting using this method, as every case - * greater than or equal to 10 = 1010 is invalid. - * - * 1. Outcome: Use Set Directory Authorities - * - No Default Authorities - * - Use AlternateBridgeAuthority, AlternateDirAuthority, and FallbackDir - * if they are set - * Cases expected to yield this outcome: - * 8 & 9 (the 2 valid cases where DirAuthorities is set) - * 6 & 7 (the 2 cases where DirAuthorities is NULL, and - * AlternateBridgeAuthority and AlternateDirAuthority are both set) - * - * 2. Outcome: Use Set Bridge Authority - * - Use Default Non-Bridge Directory Authorities - * - Use FallbackDir if it is set, otherwise use default FallbackDir - * Cases expected to yield this outcome: - * 4 & 5 (the 2 cases where DirAuthorities is NULL, - * AlternateBridgeAuthority is set, and - * AlternateDirAuthority is NULL) - * - * 3. Outcome: Use Set Alternate Directory Authority - * - Use Default Bridge Authorities - * - Use FallbackDir if it is set, otherwise No Default Fallback Directories - * Cases expected to yield this outcome: - * 2 & 3 (the 2 cases where DirAuthorities and AlternateBridgeAuthority - * are both NULL, but AlternateDirAuthority is set) - * - * 4. Outcome: Use Set Custom Fallback Directory - * - Use Default Bridge & Directory Authorities - * Cases expected to yield this outcome: - * 1 (DirAuthorities, AlternateBridgeAuthority and AlternateDirAuthority - * are all NULL, but FallbackDir is set) - * - * 5. Outcome: Use All Defaults - * - Use Default Bridge & Directory Authorities, and - * Default Fallback Directories - * Cases expected to yield this outcome: - * 0 (DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority - * and FallbackDir are all NULL) - */ - - /* - * Find out how many default Bridge, Non-Bridge and Fallback Directories - * are hard-coded into this build. - * This code makes some assumptions about the implementation. - * If they are wrong, one or more of cases 0-5 could fail. - */ - int n_default_alt_bridge_authority = 0; - int n_default_alt_dir_authority = 0; - int n_default_fallback_dir = 0; -#define n_default_authorities ((n_default_alt_bridge_authority) \ - + (n_default_alt_dir_authority)) - - /* Pre-Count Number of Authorities of Each Type - * Use 0000: No Directory Authorities or Fallback Directories Set - */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0000 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - - /* Count Bridge Authorities */ - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if it's a bridge auth */ - n_default_alt_bridge_authority += - ((ds->is_authority && (ds->type & BRIDGE_DIRINFO)) ? - 1 : 0) - ); - /* If we have no default bridge authority, something has gone wrong */ - tt_int_op(n_default_alt_bridge_authority, OP_GE, 1); - - /* Count v3 Authorities */ - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment found counter if it's a v3 auth */ - n_default_alt_dir_authority += - ((ds->is_authority && (ds->type & V3_DIRINFO)) ? - 1 : 0) - ); - /* If we have no default authorities, something has gone really wrong */ - tt_int_op(n_default_alt_dir_authority, OP_GE, 1); - - /* Calculate Fallback Directory Count */ - n_default_fallback_dir = (smartlist_len(fallback_servers) - - n_default_alt_bridge_authority - - n_default_alt_dir_authority); - /* If we have a negative count, something has gone really wrong, - * or some authorities aren't being added as fallback directories. - * (networkstatus_consensus_can_use_extra_fallbacks depends on all - * authorities being fallback directories.) */ - tt_int_op(n_default_fallback_dir, OP_GE, 0); - } - } - - /* - * 1. Outcome: Use Set Directory Authorities - * - No Default Authorities - * - Use AlternateBridgeAuthority, AlternateDirAuthority, and FallbackDir - * if they are set - * Cases expected to yield this outcome: - * 8 & 9 (the 2 valid cases where DirAuthorities is set) - * 6 & 7 (the 2 cases where DirAuthorities is NULL, and - * AlternateBridgeAuthority and AlternateDirAuthority are both set) - */ - - /* Case 9: 1001 - DirAuthorities Set, AlternateBridgeAuthority Not Set, - AlternateDirAuthority Not Set, FallbackDir Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 1001 */ - options->DirAuthorities = test_dir_authority; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = test_fallback_directory; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* D0, (No B1), (No A2) */ - tt_int_op(smartlist_len(dir_servers), OP_EQ, 1); - - /* DirAuthority - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 1); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* D0, (No B1), (No A2), Custom Fallback */ - tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2); - - /* DirAuthority - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 1); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 1); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - } - } - - /* Case 8: 1000 - DirAuthorities Set, Others Not Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 1000 */ - options->DirAuthorities = test_dir_authority; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we just have the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* D0, (No B1), (No A2) */ - tt_int_op(smartlist_len(dir_servers), OP_EQ, 1); - - /* DirAuthority - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 1); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* D0, (No B1), (No A2), (No Fallback) */ - tt_int_op(smartlist_len(fallback_servers), OP_EQ, 1); - - /* DirAuthority - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 1); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 0); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - } - } - - /* Case 7: 0111 - DirAuthorities Not Set, Others Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0111 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = test_alt_bridge_authority; - options->AlternateDirAuthority = test_alt_dir_authority; - options->FallbackDir = test_fallback_directory; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), B1, A2 */ - tt_int_op(smartlist_len(dir_servers), OP_EQ, 2); - - /* (No DirAuthority) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), B1, A2, Custom Fallback */ - tt_int_op(smartlist_len(fallback_servers), OP_EQ, 3); - - /* (No DirAuthority) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 1); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - } - } - - /* Case 6: 0110 - DirAuthorities Not Set, AlternateBridgeAuthority & - AlternateDirAuthority Set, FallbackDir Not Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0110 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = test_alt_bridge_authority; - options->AlternateDirAuthority = test_alt_dir_authority; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), B1, A2 */ - tt_int_op(smartlist_len(dir_servers), OP_EQ, 2); - - /* (No DirAuthority) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), B1, A2, (No Fallback) */ - tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2); - - /* (No DirAuthority) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 0); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - } - } - - /* - 2. Outcome: Use Set Bridge Authority - - Use Default Non-Bridge Directory Authorities - - Use FallbackDir if it is set, otherwise use default FallbackDir - Cases expected to yield this outcome: - 4 & 5 (the 2 cases where DirAuthorities is NULL, - AlternateBridgeAuthority is set, and - AlternateDirAuthority is NULL) - */ - - /* Case 5: 0101 - DirAuthorities Not Set, AlternateBridgeAuthority Set, - AlternateDirAuthority Not Set, FallbackDir Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0101 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = test_alt_bridge_authority; - options->AlternateDirAuthority = NULL; - options->FallbackDir = test_fallback_directory; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities */ - tt_assert(smartlist_len(dir_servers) == 1 + n_default_alt_dir_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default v3 non-Bridge directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities, - * Custom Fallback */ - tt_assert(smartlist_len(fallback_servers) == - 2 + n_default_alt_dir_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 1); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default v3 non-Bridge directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - } - - /* Case 4: 0100 - DirAuthorities Not Set, AlternateBridgeAuthority Set, - AlternateDirAuthority & FallbackDir Not Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0100 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = test_alt_bridge_authority; - options->AlternateDirAuthority = NULL; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities */ - tt_assert(smartlist_len(dir_servers) == 1 + n_default_alt_dir_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default v3 non-Bridge directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), B1, (No A2), Default v3 Non-Bridge Authorities, - * Default Fallback */ - tt_assert(smartlist_len(fallback_servers) == - 2 + n_default_alt_dir_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* AlternateBridgeAuthority - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 1); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 0); - - /* Default FallbackDir - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 1); - - /* There's no easy way of checking that we have included all the - * default v3 non-Bridge directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - } - - /* - 3. Outcome: Use Set Alternate Directory Authority - - Use Default Bridge Authorities - - Use FallbackDir if it is set, otherwise No Default Fallback Directories - Cases expected to yield this outcome: - 2 & 3 (the 2 cases where DirAuthorities and AlternateBridgeAuthority - are both NULL, but AlternateDirAuthority is set) - */ - - /* Case 3: 0011 - DirAuthorities & AlternateBridgeAuthority Not Set, - AlternateDirAuthority & FallbackDir Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0011 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = test_alt_dir_authority; - options->FallbackDir = test_fallback_directory; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, A2 */ - tt_assert(smartlist_len(dir_servers) == - 1 + n_default_alt_bridge_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* There's no easy way of checking that we have included all the - * default Bridge authorities (except for hard-coding tonga's details), - * so let's assume that if the total count above is correct, - * we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, A2, - * Custom Fallback Directory, (No Default Fallback Directories) */ - tt_assert(smartlist_len(fallback_servers) == - 2 + n_default_alt_bridge_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 1); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default Bridge authorities (except for hard-coding tonga's details), - * so let's assume that if the total count above is correct, - * we have the right ones. - */ - } - } - - /* Case 2: 0010 - DirAuthorities & AlternateBridgeAuthority Not Set, - AlternateDirAuthority Set, FallbackDir Not Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0010 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = test_alt_dir_authority; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we just have the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, A2, - * No Default or Custom Fallback Directories */ - tt_assert(smartlist_len(dir_servers) == - 1 + n_default_alt_bridge_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* There's no easy way of checking that we have included all the - * default Bridge authorities (except for hard-coding tonga's details), - * so let's assume that if the total count above is correct, - * we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, A2, - * No Custom or Default Fallback Directories */ - tt_assert(smartlist_len(fallback_servers) == - 1 + n_default_alt_bridge_authority); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* AlternateDirAuthority - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 1); - - /* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 0); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default Bridge authorities (except for hard-coding tonga's details), - * so let's assume that if the total count above is correct, - * we have the right ones. - */ - } - } - - /* - 4. Outcome: Use Set Custom Fallback Directory - - Use Default Bridge & Directory Authorities - Cases expected to yield this outcome: - 1 (DirAuthorities, AlternateBridgeAuthority and AlternateDirAuthority - are all NULL, but FallbackDir is set) - */ - - /* Case 1: 0001 - DirAuthorities, AlternateBridgeAuthority - & AlternateDirAuthority Not Set, FallbackDir Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0001 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = test_fallback_directory; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must not have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, - * (No A2), Default v3 Directory Authorities */ - tt_assert(smartlist_len(dir_servers) == n_default_authorities); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default Bridge & V3 Directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, - * (No A2), Default v3 Directory Authorities, - * Custom Fallback Directory, (No Default Fallback Directories) */ - tt_assert(smartlist_len(fallback_servers) == - 1 + n_default_authorities); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 1); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default Bridge & V3 Directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - } - - /* - 5. Outcome: Use All Defaults - - Use Default Bridge & Directory Authorities, Default Fallback Directories - Cases expected to yield this outcome: - 0 (DirAuthorities, AlternateBridgeAuthority, AlternateDirAuthority - and FallbackDir are all NULL) - */ - - /* Case 0: 0000 - All Not Set */ - { - /* clear fallback dirs counter */ - n_add_default_fallback_dir_servers_known_default = 0; - - /* clear options*/ - memset(options, 0, sizeof(or_options_t)); - - /* clear any previous dir servers: - consider_adding_dir_servers() should do this anyway */ - clear_dir_servers(); - - /* assign options: 0001 */ - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = NULL; - options->UseDefaultFallbackDirs = 1; - - /* parse options - ensure we always update by passing NULL old_options */ - consider_adding_dir_servers(options, NULL); - - /* check outcome */ - - /* we must have added the default fallback dirs */ - tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1); - - /* we have more fallbacks than just the authorities */ - tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1); - - { - /* trusted_dir_servers */ - const smartlist_t *dir_servers = router_get_trusted_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, - * (No A2), Default v3 Directory Authorities */ - tt_assert(smartlist_len(dir_servers) == n_default_authorities); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(dir_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* There's no easy way of checking that we have included all the - * default Bridge & V3 Directory authorities, so let's assume that - * if the total count above is correct, we have the right ones. - */ - } - - { - /* fallback_dir_servers */ - const smartlist_t *fallback_servers = router_get_fallback_dir_servers(); - /* (No D0), (No B1), Default Bridge Authorities, - * (No A2), Default v3 Directory Authorities, - * (No Custom Fallback Directory), Default Fallback Directories */ - tt_assert(smartlist_len(fallback_servers) == - n_default_authorities + n_default_fallback_dir); - - /* (No DirAuthorities) - D0 - dir_port: 60090 */ - int found_D0 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_D0 += - (ds->dir_port == 60090 ? - 1 : 0) - ); - tt_int_op(found_D0, OP_EQ, 0); - - /* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */ - int found_B1 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_B1 += - (ds->dir_port == 60091 ? - 1 : 0) - ); - tt_int_op(found_B1, OP_EQ, 0); - - /* (No AlternateDirAuthority) - A2 - dir_port: 60092 */ - int found_A2 = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_A2 += - (ds->dir_port == 60092 ? - 1 : 0) - ); - tt_int_op(found_A2, OP_EQ, 0); - - /* Custom FallbackDir - No Nickname - dir_port: 60093 */ - int found_non_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_non_default_fallback += - (ds->dir_port == 60093 ? - 1 : 0) - ); - tt_int_op(found_non_default_fallback, OP_EQ, 0); - - /* (No Default FallbackDir) - No Nickname - dir_port: 60099 */ - int found_default_fallback = 0; - SMARTLIST_FOREACH(fallback_servers, - dir_server_t *, - ds, - /* increment the found counter if dir_port matches */ - found_default_fallback += - (ds->dir_port == 60099 ? - 1 : 0) - ); - tt_int_op(found_default_fallback, OP_EQ, 1); - - /* There's no easy way of checking that we have included all the - * default Bridge & V3 Directory authorities, and the default - * Fallback Directories, so let's assume that if the total count - * above is correct, we have the right ones. - */ - } - } - - done: - clear_dir_servers(); - - tor_free(test_dir_authority->key); - tor_free(test_dir_authority->value); - tor_free(test_dir_authority); - - tor_free(test_alt_dir_authority->key); - tor_free(test_alt_dir_authority->value); - tor_free(test_alt_dir_authority); - - tor_free(test_alt_bridge_authority->key); - tor_free(test_alt_bridge_authority->value); - tor_free(test_alt_bridge_authority); - - tor_free(test_fallback_directory->key); - tor_free(test_fallback_directory->value); - tor_free(test_fallback_directory); - - options->DirAuthorities = NULL; - options->AlternateBridgeAuthority = NULL; - options->AlternateDirAuthority = NULL; - options->FallbackDir = NULL; - or_options_free(options); - - UNMOCK(add_default_fallback_dir_servers); -} - -static void -test_config_default_dir_servers(void *arg) -{ - or_options_t *opts = NULL; - (void)arg; - int trusted_count = 0; - int fallback_count = 0; - - /* new set of options should stop fallback parsing */ - opts = tor_malloc_zero(sizeof(or_options_t)); - opts->UseDefaultFallbackDirs = 0; - /* set old_options to NULL to force dir update */ - consider_adding_dir_servers(opts, NULL); - trusted_count = smartlist_len(router_get_trusted_dir_servers()); - fallback_count = smartlist_len(router_get_fallback_dir_servers()); - or_options_free(opts); - opts = NULL; - - /* assume a release will never go out with less than 7 authorities */ - tt_int_op(trusted_count, OP_GE, 7); - /* if we disable the default fallbacks, there must not be any extra */ - tt_assert(fallback_count == trusted_count); - - opts = tor_malloc_zero(sizeof(or_options_t)); - opts->UseDefaultFallbackDirs = 1; - consider_adding_dir_servers(opts, opts); - trusted_count = smartlist_len(router_get_trusted_dir_servers()); - fallback_count = smartlist_len(router_get_fallback_dir_servers()); - or_options_free(opts); - opts = NULL; - - /* assume a release will never go out with less than 7 authorities */ - tt_int_op(trusted_count, OP_GE, 7); - /* XX/teor - allow for default fallbacks to be added without breaking - * the unit tests. Set a minimum fallback count once the list is stable. */ - tt_assert(fallback_count >= trusted_count); - - done: - or_options_free(opts); -} - -static int mock_router_pick_published_address_result = 0; - -static int -mock_router_pick_published_address(const or_options_t *options, - uint32_t *addr, int cache_only) -{ - (void)options; - (void)addr; - (void)cache_only; - return mock_router_pick_published_address_result; -} - -static int mock_router_my_exit_policy_is_reject_star_result = 0; - -static int -mock_router_my_exit_policy_is_reject_star(void) -{ - return mock_router_my_exit_policy_is_reject_star_result; -} - -static int mock_advertised_server_mode_result = 0; - -static int -mock_advertised_server_mode(void) -{ - return mock_advertised_server_mode_result; -} - -static routerinfo_t *mock_router_get_my_routerinfo_result = NULL; - -static const routerinfo_t * -mock_router_get_my_routerinfo(void) -{ - return mock_router_get_my_routerinfo_result; -} - -static void -test_config_directory_fetch(void *arg) -{ - (void)arg; - - /* Test Setup */ - or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); - routerinfo_t routerinfo; - memset(&routerinfo, 0, sizeof(routerinfo)); - mock_router_pick_published_address_result = -1; - mock_router_my_exit_policy_is_reject_star_result = 1; - mock_advertised_server_mode_result = 0; - mock_router_get_my_routerinfo_result = NULL; - MOCK(router_pick_published_address, mock_router_pick_published_address); - MOCK(router_my_exit_policy_is_reject_star, - mock_router_my_exit_policy_is_reject_star); - MOCK(advertised_server_mode, mock_advertised_server_mode); - MOCK(router_get_my_routerinfo, mock_router_get_my_routerinfo); - - /* Clients can use multiple directory mirrors for bootstrap */ - memset(options, 0, sizeof(or_options_t)); - options->ClientOnly = 1; - tt_assert(server_mode(options) == 0); - tt_assert(public_server_mode(options) == 0); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 1); - - /* Bridge Clients can use multiple directory mirrors for bootstrap */ - memset(options, 0, sizeof(or_options_t)); - options->UseBridges = 1; - tt_assert(server_mode(options) == 0); - tt_assert(public_server_mode(options) == 0); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 1); - - /* Bridge Relays (Bridges) must act like clients, and use multiple - * directory mirrors for bootstrap */ - memset(options, 0, sizeof(or_options_t)); - options->BridgeRelay = 1; - options->ORPort_set = 1; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 0); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 1); - - /* Clients set to FetchDirInfoEarly must fetch it from the authorities, - * but can use multiple authorities for bootstrap */ - memset(options, 0, sizeof(or_options_t)); - options->FetchDirInfoEarly = 1; - tt_assert(server_mode(options) == 0); - tt_assert(public_server_mode(options) == 0); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 1); - - /* OR servers only fetch the consensus from the authorities when they don't - * know their own address, but never use multiple directories for bootstrap - */ - memset(options, 0, sizeof(or_options_t)); - options->ORPort_set = 1; - - mock_router_pick_published_address_result = -1; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - mock_router_pick_published_address_result = 0; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - /* Exit OR servers only fetch the consensus from the authorities when they - * refuse unknown exits, but never use multiple directories for bootstrap - */ - memset(options, 0, sizeof(or_options_t)); - options->ORPort_set = 1; - options->ExitRelay = 1; - mock_router_pick_published_address_result = 0; - mock_router_my_exit_policy_is_reject_star_result = 0; - mock_advertised_server_mode_result = 1; - mock_router_get_my_routerinfo_result = &routerinfo; - - routerinfo.supports_tunnelled_dir_requests = 1; - - options->RefuseUnknownExits = 1; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - options->RefuseUnknownExits = 0; - mock_router_pick_published_address_result = 0; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - /* Dir servers fetch the consensus from the authorities, unless they are not - * advertising themselves (hibernating) or have no routerinfo or are not - * advertising their dirport, and never use multiple directories for - * bootstrap. This only applies if they are also OR servers. - * (We don't care much about the behaviour of non-OR directory servers.) */ - memset(options, 0, sizeof(or_options_t)); - options->DirPort_set = 1; - options->ORPort_set = 1; - options->DirCache = 1; - mock_router_pick_published_address_result = 0; - mock_router_my_exit_policy_is_reject_star_result = 1; - - mock_advertised_server_mode_result = 1; - routerinfo.dir_port = 1; - mock_router_get_my_routerinfo_result = &routerinfo; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - mock_advertised_server_mode_result = 0; - routerinfo.dir_port = 1; - mock_router_get_my_routerinfo_result = &routerinfo; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - mock_advertised_server_mode_result = 1; - mock_router_get_my_routerinfo_result = NULL; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - mock_advertised_server_mode_result = 1; - routerinfo.dir_port = 0; - routerinfo.supports_tunnelled_dir_requests = 0; - mock_router_get_my_routerinfo_result = &routerinfo; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - mock_advertised_server_mode_result = 1; - routerinfo.dir_port = 1; - routerinfo.supports_tunnelled_dir_requests = 1; - mock_router_get_my_routerinfo_result = &routerinfo; - tt_assert(server_mode(options) == 1); - tt_assert(public_server_mode(options) == 1); - tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1); - tt_int_op(networkstatus_consensus_can_use_multiple_directories(options), - OP_EQ, 0); - - done: - tor_free(options); - UNMOCK(router_pick_published_address); - UNMOCK(router_get_my_routerinfo); - UNMOCK(advertised_server_mode); - UNMOCK(router_my_exit_policy_is_reject_star); -} - -static void -test_config_default_fallback_dirs(void *arg) -{ - const char *fallback[] = { -#include "../or/fallback_dirs.inc" - NULL - }; - - int n_included_fallback_dirs = 0; - int n_added_fallback_dirs = 0; - - (void)arg; - clear_dir_servers(); - - while (fallback[n_included_fallback_dirs]) - n_included_fallback_dirs++; - - add_default_fallback_dir_servers(); - - n_added_fallback_dirs = smartlist_len(router_get_fallback_dir_servers()); - - tt_assert(n_included_fallback_dirs == n_added_fallback_dirs); - - done: - clear_dir_servers(); -} - -static void -test_config_port_cfg_line_extract_addrport(void *arg) -{ - (void)arg; - int unixy = 0; - const char *rest = NULL; - char *a = NULL; - - tt_int_op(port_cfg_line_extract_addrport("", &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, ""); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("hello", &a, &unixy, &rest), - OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "hello"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport(" flipperwalt gersplut", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "flipperwalt"); - tt_str_op(rest, OP_EQ, "gersplut"); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport(" flipperwalt \t gersplut", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "flipperwalt"); - tt_str_op(rest, OP_EQ, "gersplut"); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("flipperwalt \t gersplut", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "flipperwalt"); - tt_str_op(rest, OP_EQ, "gersplut"); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:flipperwalt \t gersplut", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "flipperwalt"); - tt_str_op(rest, OP_EQ, "gersplut"); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("lolol", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:lolol", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:lolol ", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport(" unix:lolol", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("foobar:lolol", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, "foobar:lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport(":lolol", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 0); - tt_str_op(a, OP_EQ, ":lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\"", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\" ", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, ""); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lolol\" foo ", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lolol"); - tt_str_op(rest, OP_EQ, "foo "); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lol ol\" foo ", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lol ol"); - tt_str_op(rest, OP_EQ, "foo "); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\\" ol\" foo ", - &a, &unixy, &rest), OP_EQ, 0); - tt_int_op(unixy, OP_EQ, 1); - tt_str_op(a, OP_EQ, "lol\" ol"); - tt_str_op(rest, OP_EQ, "foo "); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\\" ol foo ", - &a, &unixy, &rest), OP_EQ, -1); - tor_free(a); - - tt_int_op(port_cfg_line_extract_addrport("unix:\"lol\\0\" ol foo ", - &a, &unixy, &rest), OP_EQ, -1); - tor_free(a); - - done: - tor_free(a); -} - -static config_line_t * -mock_config_line(const char *key, const char *val) -{ - config_line_t *config_line = tor_malloc(sizeof(config_line_t)); - memset(config_line, 0, sizeof(config_line_t)); - config_line->key = tor_strdup(key); - config_line->value = tor_strdup(val); - return config_line; -} - -static void -test_config_parse_port_config__ports__no_ports_given(void *data) -{ - (void)data; - int ret; - smartlist_t *slout = NULL; - port_cfg_t *port_cfg = NULL; - - slout = smartlist_new(); - - // Test no defaultport, no defaultaddress and no out - ret = parse_port_config(NULL, NULL, "DNS", 0, NULL, 0, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test with defaultport, no defaultaddress and no out - ret = parse_port_config(NULL, NULL, "DNS", 0, NULL, 42, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test no defaultport, with defaultaddress and no out - ret = parse_port_config(NULL, NULL, "DNS", 0, "127.0.0.2", 0, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test with defaultport, with defaultaddress and no out - ret = parse_port_config(NULL, NULL, "DNS", 0, "127.0.0.2", 42, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test no defaultport, no defaultaddress and with out - ret = parse_port_config(slout, NULL, "DNS", 0, NULL, 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 0); - - // Test with defaultport, no defaultaddress and with out - ret = parse_port_config(slout, NULL, "DNS", 0, NULL, 42, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 0); - - // Test no defaultport, with defaultaddress and with out - ret = parse_port_config(slout, NULL, "DNS", 0, "127.0.0.2", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 0); - - // Test with defaultport, with defaultaddress and out, adds a new port cfg - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, NULL, "DNS", 0, "127.0.0.2", 42, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, 42); - tt_int_op(port_cfg->is_unix_addr, OP_EQ, 0); - - // Test with defaultport, with defaultaddress and out, adds a new port cfg - // for a unix address - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, NULL, "DNS", 0, "/foo/bar/unixdomain", - 42, CL_PORT_IS_UNIXSOCKET); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, 0); - tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); - tt_str_op(port_cfg->unix_addr, OP_EQ, "/foo/bar/unixdomain"); - - done: - if (slout) - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_free(slout); -} - -static void -test_config_parse_port_config__ports__ports_given(void *data) -{ - (void)data; - int ret; - smartlist_t *slout = NULL; - port_cfg_t *port_cfg = NULL; - config_line_t *config_port_invalid = NULL, *config_port_valid = NULL; - tor_addr_t addr; - - slout = smartlist_new(); - - // Test error when encounters an invalid Port specification - config_port_invalid = mock_config_line("DNSPort", ""); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, NULL, - 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test error when encounters an empty unix domain specification - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", "unix:"); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, NULL, - 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test error when encounters a unix domain specification but the listener - // doesn't support domain sockets - config_port_valid = mock_config_line("DNSPort", "unix:/tmp/foo/bar"); - ret = parse_port_config(NULL, config_port_valid, "DNS", - CONN_TYPE_AP_DNS_LISTENER, NULL, 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test valid unix domain - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, 0); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, 0); - tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); - tt_str_op(port_cfg->unix_addr, OP_EQ, "/tmp/foo/bar"); - /* Test entry port defaults as initialised in parse_port_config */ - tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.prefer_ipv6_virtaddr, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test failure if we have no ipv4 and no ipv6 and no onion (DNS only) - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("SOCKSPort", - "unix:/tmp/foo/bar NoIPv4Traffic " - "NoIPv6Traffic " - "NoOnionTraffic"); - ret = parse_port_config(NULL, config_port_invalid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, -1); - - // Test failure if we have no DNS and we're a DNSPort - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", - "127.0.0.1:80 NoDNSRequest"); - ret = parse_port_config(NULL, config_port_invalid, "DNS", - CONN_TYPE_AP_DNS_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, -1); - - // If we're a DNSPort, DNS only is ok - // Use a port because DNSPort doesn't support sockets - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.1:80 " - "NoIPv6Traffic " - "NoIPv4Traffic NoOnionTraffic"); - ret = parse_port_config(slout, config_port_valid, "DNS", - CONN_TYPE_AP_DNS_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 0); - - // Test failure if we have DNS but no ipv4 and no ipv6 - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("SOCKSPort", - "NoIPv6Traffic " - "unix:/tmp/foo/bar NoIPv4Traffic"); - ret = parse_port_config(NULL, config_port_invalid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, -1); - - // Test success with no DNS, no ipv4, no ipv6 (only onion, using separate - // options) - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " - "NoIPv6Traffic " - "NoDNSRequest NoIPv4Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test success with quoted unix: address. - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar\" " - "NoIPv6Traffic " - "NoDNSRequest NoIPv4Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test failure with broken quoted unix: address. - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:\"/tmp/foo/ bar " - "NoIPv6Traffic " - "NoDNSRequest NoIPv4Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, -1); - - // Test failure with empty quoted unix: address. - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:\"\" " - "NoIPv6Traffic " - "NoDNSRequest NoIPv4Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, -1); - - // Test success with OnionTrafficOnly (no DNS, no ipv4, no ipv6) - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " - "OnionTrafficOnly"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.dns_request, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.onion_traffic, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test success with no ipv4 but take ipv6 - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " - "NoIPv4Traffic IPv6Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test success with both ipv4 and ipv6 - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/foo/bar " - "IPv4Traffic IPv6Traffic"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, NULL, 0, - CL_PORT_TAKES_HOSTNAMES); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - // Test failure if we specify world writable for an IP Port - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", "42 WorldWritable"); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test failure if we specify group writable for an IP Port - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", "42 GroupWritable"); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test failure if we specify group writable for an IP Port - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", "42 RelaxDirModeCheck"); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test success with only a port (this will fail without a default address) - config_free_lines(config_port_valid); config_port_valid = NULL; - config_port_valid = mock_config_line("DNSPort", "42"); - ret = parse_port_config(NULL, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test success with only a port and isolate destination port - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IsolateDestPort"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT | ISO_DESTPORT); - - // Test success with a negative isolate destination port, and plural - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 NoIsolateDestPorts"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT & ~ISO_DESTPORT); - - // Test success with isolate destination address - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IsolateDestAddr"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT | ISO_DESTADDR); - - // Test success with isolate socks AUTH - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IsolateSOCKSAuth"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT | ISO_SOCKSAUTH); - - // Test success with isolate client protocol - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IsolateClientProtocol"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT | ISO_CLIENTPROTO); - - // Test success with isolate client address - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IsolateClientAddr"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.isolation_flags, OP_EQ, - ISO_DEFAULT | ISO_CLIENTADDR); - - // Test success with ignored unknown options - config_free_lines(config_port_valid); config_port_valid = NULL; - config_port_valid = mock_config_line("DNSPort", "42 ThisOptionDoesntExist"); - ret = parse_port_config(NULL, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - - // Test success with no isolate socks AUTH - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 NoIsolateSOCKSAuth"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.3", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.socks_prefer_no_auth, OP_EQ, 1); - - // Test success with prefer ipv6 - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", - "42 IPv6Traffic PreferIPv6"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, "127.0.0.42", 0, - CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.prefer_ipv6, OP_EQ, 1); - - // Test success with cache ipv4 DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 CacheIPv4DNS"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 0); - - // Test success with cache ipv6 DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 CacheIPv6DNS"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 1); - - // Test success with no cache ipv4 DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 NoCacheIPv4DNS"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 0); - - // Test success with cache DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 CacheDNS"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, CL_PORT_TAKES_HOSTNAMES); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.cache_ipv4_answers, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.cache_ipv6_answers, OP_EQ, 1); - - // Test success with use cached ipv4 DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 UseIPv4Cache"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 0); - - // Test success with use cached ipv6 DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 UseIPv6Cache"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 0); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 1); - - // Test success with use cached DNS - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 UseDNSCache"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv4_answers, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.use_cached_ipv6_answers, OP_EQ, 1); - - // Test success with not preferring ipv6 automap - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 NoPreferIPv6Automap"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.prefer_ipv6_virtaddr, OP_EQ, 0); - - // Test success with prefer SOCKS no auth - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 PreferSOCKSNoAuth"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.socks_prefer_no_auth, OP_EQ, 1); - - // Test failure with both a zero port and a non-zero port - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "0"); - config_port_valid = mock_config_line("DNSPort", "42"); - config_port_invalid->next = config_port_valid; - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.42", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test success with warn non-local control - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, config_port_valid, "Control", - CONN_TYPE_CONTROL_LISTENER, "127.0.0.42", 0, - CL_PORT_WARN_NONLOCAL); - tt_int_op(ret, OP_EQ, 0); - - // Test success with warn non-local listener - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, config_port_valid, "ExtOR", - CONN_TYPE_EXT_OR_LISTENER, "127.0.0.42", 0, - CL_PORT_WARN_NONLOCAL); - tt_int_op(ret, OP_EQ, 0); - - // Test success with warn non-local other - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.42", 0, CL_PORT_WARN_NONLOCAL); - tt_int_op(ret, OP_EQ, 0); - - // Test success with warn non-local other without out - ret = parse_port_config(NULL, config_port_valid, "DNS", 0, - "127.0.0.42", 0, CL_PORT_WARN_NONLOCAL); - tt_int_op(ret, OP_EQ, 0); - - // Test success with both ipv4 and ipv6 but without stream options - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 IPv4Traffic " - "IPv6Traffic"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.44", 0, - CL_PORT_TAKES_HOSTNAMES | - CL_PORT_NO_STREAM_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.ipv4_traffic, OP_EQ, 1); - tt_int_op(port_cfg->entry_cfg.ipv6_traffic, OP_EQ, 1); - - // Test failure for a SessionGroup argument with invalid value - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=invalid"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // TODO: this seems wrong. Shouldn't it be the other way around? - // Potential bug. - // Test failure for a SessionGroup argument with valid value but with stream - // options allowed - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=123"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.44", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test failure for more than one SessionGroup argument - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "42 SessionGroup=123 " - "SessionGroup=321"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // Test success with a sessiongroup options - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "42 SessionGroup=1111122"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.44", 0, CL_PORT_NO_STREAM_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->entry_cfg.session_group, OP_EQ, 1111122); - - // Test success with a zero unix domain socket, and doesnt add it to out - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "0"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.45", 0, CL_PORT_IS_UNIXSOCKET); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 0); - - // Test success with a one unix domain socket, and doesnt add it to out - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "something"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.45", 0, CL_PORT_IS_UNIXSOCKET); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->is_unix_addr, OP_EQ, 1); - tt_str_op(port_cfg->unix_addr, OP_EQ, "something"); - - // Test success with a port of auto - it uses the default address - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "auto"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.46", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, CFG_AUTO_PORT); - tor_addr_parse(&addr, "127.0.0.46"); - tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) - - // Test success with parsing both an address and an auto port - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.122:auto"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.46", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, CFG_AUTO_PORT); - tor_addr_parse(&addr, "127.0.0.122"); - tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) - - // Test failure when asked to parse an invalid address followed by auto - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_port_invalid = mock_config_line("DNSPort", "invalidstuff!!:auto"); - MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); - ret = parse_port_config(NULL, config_port_invalid, "DNS", 0, - "127.0.0.46", 0, 0); - UNMOCK(tor_addr_lookup); - tt_int_op(ret, OP_EQ, -1); - - // Test success with parsing both an address and a real port - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.123:656"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, - "127.0.0.46", 0, 0); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->port, OP_EQ, 656); - tor_addr_parse(&addr, "127.0.0.123"); - tt_assert(tor_addr_eq(&port_cfg->addr, &addr)) - - // Test failure if we can't parse anything at all - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "something wrong"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.46", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test failure if we find both an address, a port and an auto - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "127.0.1.0:123:auto"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, - "127.0.0.46", 0, 0); - tt_int_op(ret, OP_EQ, -1); - - // Test that default to group writeable default sets group writeable for - // domain socket - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("SOCKSPort", "unix:/tmp/somewhere"); - ret = parse_port_config(slout, config_port_valid, "SOCKS", - CONN_TYPE_AP_LISTENER, "127.0.0.46", 0, - CL_PORT_DFLT_GROUP_WRITABLE); -#ifdef _WIN32 - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->is_group_writable, OP_EQ, 1); -#endif /* defined(_WIN32) */ - - done: - if (slout) - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_free(slout); - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_free_lines(config_port_valid); config_port_valid = NULL; -} - -static void -test_config_parse_port_config__ports__server_options(void *data) -{ - (void)data; - int ret; - smartlist_t *slout = NULL; - port_cfg_t *port_cfg = NULL; - config_line_t *config_port_invalid = NULL, *config_port_valid = NULL; - - slout = smartlist_new(); - - // Test success with NoAdvertise option - config_free_lines(config_port_valid); config_port_valid = NULL; - config_port_valid = mock_config_line("DNSPort", - "127.0.0.124:656 NoAdvertise"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, - CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->server_cfg.no_advertise, OP_EQ, 1); - tt_int_op(port_cfg->server_cfg.no_listen, OP_EQ, 0); - - // Test success with NoListen option - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 NoListen"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, - CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->server_cfg.no_advertise, OP_EQ, 0); - tt_int_op(port_cfg->server_cfg.no_listen, OP_EQ, 1); - - // Test failure with both NoAdvertise and NoListen option - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "127.0.0.124:656 NoListen " - "NoAdvertise"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, - 0, CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // Test success with IPv4Only - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 IPv4Only"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, - CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->server_cfg.bind_ipv4_only, OP_EQ, 1); - tt_int_op(port_cfg->server_cfg.bind_ipv6_only, OP_EQ, 0); - - // Test success with IPv6Only - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "[::1]:656 IPv6Only"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, - CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - port_cfg = (port_cfg_t *)smartlist_get(slout, 0); - tt_int_op(port_cfg->server_cfg.bind_ipv4_only, OP_EQ, 0); - tt_int_op(port_cfg->server_cfg.bind_ipv6_only, OP_EQ, 1); - - // Test failure with both IPv4Only and IPv6Only - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "127.0.0.124:656 IPv6Only " - "IPv4Only"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, - 0, CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // Test success with invalid parameter - config_free_lines(config_port_valid); config_port_valid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_valid = mock_config_line("DNSPort", "127.0.0.124:656 unknown"); - ret = parse_port_config(slout, config_port_valid, "DNS", 0, NULL, 0, - CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(slout), OP_EQ, 1); - - // Test failure when asked to bind only to ipv6 but gets an ipv4 address - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", - "127.0.0.124:656 IPv6Only"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, - 0, CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // Test failure when asked to bind only to ipv4 but gets an ipv6 address - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("DNSPort", "[::1]:656 IPv4Only"); - ret = parse_port_config(slout, config_port_invalid, "DNS", 0, NULL, - 0, CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - // Check for failure with empty unix: address. - config_free_lines(config_port_invalid); config_port_invalid = NULL; - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_clear(slout); - config_port_invalid = mock_config_line("ORPort", "unix:\"\""); - ret = parse_port_config(slout, config_port_invalid, "ORPort", 0, NULL, - 0, CL_PORT_SERVER_OPTIONS); - tt_int_op(ret, OP_EQ, -1); - - done: - if (slout) - SMARTLIST_FOREACH(slout,port_cfg_t *,pf,port_cfg_free(pf)); - smartlist_free(slout); - config_free_lines(config_port_invalid); config_port_invalid = NULL; - config_free_lines(config_port_valid); config_port_valid = NULL; -} - -static void -test_config_parse_log_severity(void *data) -{ - int ret; - const char *severity_log_lines[] = { - "debug file /tmp/debug.log", - "debug\tfile /tmp/debug.log", - "[handshake]debug [~net,~mm]info notice stdout", - "[handshake]debug\t[~net,~mm]info\tnotice\tstdout", - NULL - }; - int i; - log_severity_list_t *severity; - - (void) data; - - severity = tor_malloc(sizeof(log_severity_list_t)); - for (i = 0; severity_log_lines[i]; i++) { - memset(severity, 0, sizeof(log_severity_list_t)); - ret = parse_log_severity_config(&severity_log_lines[i], severity); - tt_int_op(ret, OP_EQ, 0); - } - - done: - tor_free(severity); -} - -static void -test_config_include_limit(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *torrc_path = NULL; - char *dir = tor_strdup(get_fname("test_include_limit")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", - torrc_path); - tt_int_op(write_str_to_file(torrc_path, torrc_contents, 0), OP_EQ, 0); - - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), - OP_EQ, -1); - - done: - config_free_lines(result); - tor_free(torrc_path); - tor_free(dir); -} - -static void -test_config_include_does_not_exist(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *dir = tor_strdup(get_fname("test_include_does_not_exist")); - char *missing_path = NULL; - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&missing_path, "%s"PATH_SEPARATOR"missing", dir); - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", - missing_path); - - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), - OP_EQ, -1); - - done: - config_free_lines(result); - tor_free(dir); - tor_free(missing_path); -} - -static void -test_config_include_error_in_included_file(void *data) -{ - (void)data; - config_line_t *result = NULL; - - char *dir = tor_strdup(get_fname("test_error_in_included_file")); - char *invalid_path = NULL; - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&invalid_path, "%s"PATH_SEPARATOR"invalid", dir); - tt_int_op(write_str_to_file(invalid_path, "unclosed \"", 0), OP_EQ, 0); - - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s", - invalid_path); - - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, NULL, NULL), - OP_EQ, -1); - - done: - config_free_lines(result); - tor_free(dir); - tor_free(invalid_path); -} - -static void -test_config_include_empty_file_folder(void *data) -{ - (void)data; - config_line_t *result = NULL; - - char *folder_path = NULL; - char *file_path = NULL; - char *dir = tor_strdup(get_fname("test_include_empty_file_folder")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&folder_path, "%s"PATH_SEPARATOR"empty_dir", dir); -#ifdef _WIN32 - tt_int_op(mkdir(folder_path), OP_EQ, 0); -#else - tt_int_op(mkdir(folder_path, 0700), OP_EQ, 0); -#endif - tor_asprintf(&file_path, "%s"PATH_SEPARATOR"empty_file", dir); - tt_int_op(write_str_to_file(file_path, "", 0), OP_EQ, 0); - - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), - "%%include %s\n" - "%%include %s\n", - folder_path, file_path); - - int include_used; - tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, - NULL), OP_EQ, 0); - tt_ptr_op(result, OP_EQ, NULL); - tt_int_op(include_used, OP_EQ, 1); - - done: - config_free_lines(result); - tor_free(folder_path); - tor_free(file_path); - tor_free(dir); -} - -#ifndef _WIN32 -static void -test_config_include_no_permission(void *data) -{ - (void)data; - config_line_t *result = NULL; - - char *folder_path = NULL; - char *dir = NULL; - if (geteuid() == 0) - tt_skip(); - - dir = tor_strdup(get_fname("test_include_forbidden_folder")); - tt_ptr_op(dir, OP_NE, NULL); - - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); - - tor_asprintf(&folder_path, "%s"PATH_SEPARATOR"forbidden_dir", dir); - tt_int_op(mkdir(folder_path, 0100), OP_EQ, 0); - - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), - "%%include %s\n", - folder_path); - - int include_used; - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, - &include_used, NULL), - OP_EQ, -1); - tt_ptr_op(result, OP_EQ, NULL); - - done: - config_free_lines(result); - tor_free(folder_path); - if (dir) - chmod(dir, 0700); - tor_free(dir); -} -#endif - -static void -test_config_include_recursion_before_after(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *torrc_path = NULL; - char *dir = tor_strdup(get_fname("test_include_recursion_before_after")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); - - char file_contents[1000]; - const int limit = MAX_INCLUDE_RECURSION_LEVEL; - int i; - // Loop backwards so file_contents has the contents of the first file by the - // end of the loop - for (i = limit; i > 0; i--) { - if (i < limit) { - tor_snprintf(file_contents, sizeof(file_contents), - "Test %d\n" - "%%include %s%d\n" - "Test %d\n", - i, torrc_path, i + 1, 2 * limit - i); - } else { - tor_snprintf(file_contents, sizeof(file_contents), "Test %d\n", i); - } - - if (i > 1) { - char *file_path = NULL; - tor_asprintf(&file_path, "%s%d", torrc_path, i); - tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0); - tor_free(file_path); - } - } - - int include_used; - tt_int_op(config_get_lines_include(file_contents, &result, 0, &include_used, - NULL), OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - tt_int_op(include_used, OP_EQ, 1); - - int len = 0; - config_line_t *next; - for (next = result; next != NULL; next = next->next) { - char expected[10]; - tor_snprintf(expected, sizeof(expected), "%d", len + 1); - tt_str_op(next->key, OP_EQ, "Test"); - tt_str_op(next->value, OP_EQ, expected); - len++; - } - tt_int_op(len, OP_EQ, 2 * limit - 1); - - done: - config_free_lines(result); - tor_free(dir); - tor_free(torrc_path); -} - -static void -test_config_include_recursion_after_only(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *torrc_path = NULL; - char *dir = tor_strdup(get_fname("test_include_recursion_after_only")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir); - - char file_contents[1000]; - const int limit = MAX_INCLUDE_RECURSION_LEVEL; - int i; - // Loop backwards so file_contents has the contents of the first file by the - // end of the loop - for (i = limit; i > 0; i--) { - int n = (i - limit - 1) * -1; - if (i < limit) { - tor_snprintf(file_contents, sizeof(file_contents), - "%%include %s%d\n" - "Test %d\n", - torrc_path, i + 1, n); - } else { - tor_snprintf(file_contents, sizeof(file_contents), "Test %d\n", n); - } - - if (i > 1) { - char *file_path = NULL; - tor_asprintf(&file_path, "%s%d", torrc_path, i); - tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0); - tor_free(file_path); - } - } - - int include_used; - tt_int_op(config_get_lines_include(file_contents, &result, 0, &include_used, - NULL), OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - tt_int_op(include_used, OP_EQ, 1); - - int len = 0; - config_line_t *next; - for (next = result; next != NULL; next = next->next) { - char expected[10]; - tor_snprintf(expected, sizeof(expected), "%d", len + 1); - tt_str_op(next->key, OP_EQ, "Test"); - tt_str_op(next->value, OP_EQ, expected); - len++; - } - tt_int_op(len, OP_EQ, limit); - - done: - config_free_lines(result); - tor_free(dir); - tor_free(torrc_path); -} - -static void -test_config_include_folder_order(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *torrcd = NULL; - char *path = NULL; - char *path2 = NULL; - char *dir = tor_strdup(get_fname("test_include_folder_order")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&torrcd, "%s"PATH_SEPARATOR"%s", dir, "torrc.d"); - -#ifdef _WIN32 - tt_int_op(mkdir(torrcd), OP_EQ, 0); -#else - tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0); -#endif - - // test that files in subfolders are ignored - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "subfolder"); - -#ifdef _WIN32 - tt_int_op(mkdir(path), OP_EQ, 0); -#else - tt_int_op(mkdir(path, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&path2, "%s"PATH_SEPARATOR"%s", path, "01_ignore"); - tt_int_op(write_str_to_file(path2, "ShouldNotSee 1\n", 0), OP_EQ, 0); - tor_free(path); - - // test that files starting with . are ignored - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, ".dot"); - tt_int_op(write_str_to_file(path, "ShouldNotSee 2\n", 0), OP_EQ, 0); - tor_free(path); - - // test file order - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "01_1st"); - tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0); - tor_free(path); - - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "02_2nd"); - tt_int_op(write_str_to_file(path, "Test 2\n", 0), OP_EQ, 0); - tor_free(path); - - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "aa_3rd"); - tt_int_op(write_str_to_file(path, "Test 3\n", 0), OP_EQ, 0); - tor_free(path); - - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "ab_4th"); - tt_int_op(write_str_to_file(path, "Test 4\n", 0), OP_EQ, 0); - tor_free(path); - - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), - "%%include %s\n", - torrcd); - - int include_used; - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, &include_used, - NULL), OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - tt_int_op(include_used, OP_EQ, 1); - - int len = 0; - config_line_t *next; - for (next = result; next != NULL; next = next->next) { - char expected[10]; - tor_snprintf(expected, sizeof(expected), "%d", len + 1); - tt_str_op(next->key, OP_EQ, "Test"); - tt_str_op(next->value, OP_EQ, expected); - len++; - } - tt_int_op(len, OP_EQ, 4); - - done: - config_free_lines(result); - tor_free(torrcd); - tor_free(path); - tor_free(path2); - tor_free(dir); -} - -static void -test_config_include_path_syntax(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *dir = tor_strdup(get_fname("test_include_path_syntax")); - char *esc_dir = NULL, *dir_with_pathsep = NULL, - *esc_dir_with_pathsep = NULL, *torrc_contents = NULL; - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - esc_dir = esc_for_log(dir); - tor_asprintf(&dir_with_pathsep, "%s%s", dir, PATH_SEPARATOR); - esc_dir_with_pathsep = esc_for_log(dir_with_pathsep); - - tor_asprintf(&torrc_contents, - "%%include %s\n" - "%%include %s%s \n" // space to avoid suppressing newline - "%%include %s\n", - esc_dir, - dir, PATH_SEPARATOR, - esc_dir_with_pathsep); - - int include_used; - tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, - NULL), OP_EQ, 0); - tt_ptr_op(result, OP_EQ, NULL); - tt_int_op(include_used, OP_EQ, 1); - - done: - config_free_lines(result); - tor_free(dir); - tor_free(torrc_contents); - tor_free(esc_dir); - tor_free(dir_with_pathsep); - tor_free(esc_dir_with_pathsep); -} - -static void -test_config_include_not_processed(void *data) -{ - (void)data; - - char torrc_contents[1000] = "%include does_not_exist\n"; - config_line_t *result = NULL; - tt_int_op(config_get_lines(torrc_contents, &result, 0),OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - - int len = 0; - config_line_t *next; - for (next = result; next != NULL; next = next->next) { - tt_str_op(next->key, OP_EQ, "%include"); - tt_str_op(next->value, OP_EQ, "does_not_exist"); - len++; - } - tt_int_op(len, OP_EQ, 1); - - done: - config_free_lines(result); -} - -static void -test_config_include_has_include(void *data) -{ - (void)data; - - config_line_t *result = NULL; - char *dir = tor_strdup(get_fname("test_include_has_include")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - char torrc_contents[1000] = "Test 1\n"; - int include_used; - - tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, - NULL), OP_EQ, 0); - tt_int_op(include_used, OP_EQ, 0); - config_free_lines(result); - - tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s\n", dir); - tt_int_op(config_get_lines_include(torrc_contents, &result, 0,&include_used, - NULL), OP_EQ, 0); - tt_int_op(include_used, OP_EQ, 1); - - done: - config_free_lines(result); - tor_free(dir); -} - -static void -test_config_include_flag_both_without(void *data) -{ - (void)data; - - char *errmsg = NULL; - char conf_empty[1000]; - tor_snprintf(conf_empty, sizeof(conf_empty), - "DataDirectory %s\n", - get_fname(NULL)); - // test with defaults-torrc and torrc without include - int ret = options_init_from_string(conf_empty, conf_empty, CMD_RUN_UNITTESTS, - NULL, &errmsg); - tt_int_op(ret, OP_EQ, 0); - - const or_options_t *options = get_options(); - tt_int_op(options->IncludeUsed, OP_EQ, 0); - - done: - tor_free(errmsg); -} - -static void -test_config_include_flag_torrc_only(void *data) -{ - (void)data; - - char *errmsg = NULL; - char *path = NULL; - char *dir = tor_strdup(get_fname("test_include_flag_torrc_only")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy"); - tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0); - - char conf_empty[1000]; - tor_snprintf(conf_empty, sizeof(conf_empty), - "DataDirectory %s\n", - get_fname(NULL)); - char conf_include[1000]; - tor_snprintf(conf_include, sizeof(conf_include), "%%include %s", path); - - // test with defaults-torrc without include and torrc with include - int ret = options_init_from_string(conf_empty, conf_include, - CMD_RUN_UNITTESTS, NULL, &errmsg); - tt_int_op(ret, OP_EQ, 0); - - const or_options_t *options = get_options(); - tt_int_op(options->IncludeUsed, OP_EQ, 1); - - done: - tor_free(errmsg); - tor_free(path); - tor_free(dir); -} - -static void -test_config_include_flag_defaults_only(void *data) -{ - (void)data; - - char *errmsg = NULL; - char *path = NULL; - char *dir = tor_strdup(get_fname("test_include_flag_defaults_only")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy"); - tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0); - - char conf_empty[1000]; - tor_snprintf(conf_empty, sizeof(conf_empty), - "DataDirectory %s\n", - get_fname(NULL)); - char conf_include[1000]; - tor_snprintf(conf_include, sizeof(conf_include), "%%include %s", path); - - // test with defaults-torrc with include and torrc without include - int ret = options_init_from_string(conf_include, conf_empty, - CMD_RUN_UNITTESTS, NULL, &errmsg); - tt_int_op(ret, OP_EQ, 0); - - const or_options_t *options = get_options(); - tt_int_op(options->IncludeUsed, OP_EQ, 0); - - done: - tor_free(errmsg); - tor_free(path); - tor_free(dir); -} - -static void -test_config_dup_and_filter(void *arg) -{ - (void)arg; - /* Test normal input. */ - config_line_t *line = NULL; - config_line_append(&line, "abc", "def"); - config_line_append(&line, "ghi", "jkl"); - config_line_append(&line, "ABCD", "mno"); - - config_line_t *line_dup = config_lines_dup_and_filter(line, "aBc"); - tt_ptr_op(line_dup, OP_NE, NULL); - tt_ptr_op(line_dup->next, OP_NE, NULL); - tt_ptr_op(line_dup->next->next, OP_EQ, NULL); - - tt_str_op(line_dup->key, OP_EQ, "abc"); - tt_str_op(line_dup->value, OP_EQ, "def"); - tt_str_op(line_dup->next->key, OP_EQ, "ABCD"); - tt_str_op(line_dup->next->value, OP_EQ, "mno"); - - /* empty output */ - config_free_lines(line_dup); - line_dup = config_lines_dup_and_filter(line, "skdjfsdkljf"); - tt_ptr_op(line_dup, OP_EQ, NULL); - - /* empty input */ - config_free_lines(line_dup); - line_dup = config_lines_dup_and_filter(NULL, "abc"); - tt_ptr_op(line_dup, OP_EQ, NULL); - - done: - config_free_lines(line); - config_free_lines(line_dup); -} - -/* If we're not configured to be a bridge, but we set - * BridgeDistribution, then options_validate () should return -1. */ -static void -test_config_check_bridge_distribution_setting_not_a_bridge(void *arg) -{ - or_options_t* options = get_options_mutable(); - or_options_t* old_options = options; - or_options_t* default_options = options; - char* message = NULL; - int ret; - - (void)arg; - - options->BridgeRelay = 0; - options->BridgeDistribution = (char*)("https"); - - ret = options_validate(old_options, options, default_options, 0, &message); - - tt_int_op(ret, OP_EQ, -1); - tt_str_op(message, OP_EQ, "You set BridgeDistribution, but you " - "didn't set BridgeRelay!"); - done: - tor_free(message); - options->BridgeDistribution = NULL; -} - -/* If the BridgeDistribution setting was valid, 0 should be returned. */ -static void -test_config_check_bridge_distribution_setting_valid(void *arg) -{ - int ret = check_bridge_distribution_setting("https"); - - (void)arg; - - tt_int_op(ret, OP_EQ, 0); - done: - return; -} - -/* If the BridgeDistribution setting was invalid, -1 should be returned. */ -static void -test_config_check_bridge_distribution_setting_invalid(void *arg) -{ - int ret = check_bridge_distribution_setting("hyphens-are-allowed"); - - (void)arg; - - tt_int_op(ret, OP_EQ, 0); - - ret = check_bridge_distribution_setting("asterisks*are*forbidden"); - - tt_int_op(ret, OP_EQ, -1); - done: - return; -} - -/* If the BridgeDistribution setting was unrecognised, a warning should be - * logged and 0 should be returned. */ -static void -test_config_check_bridge_distribution_setting_unrecognised(void *arg) -{ - int ret = check_bridge_distribution_setting("unicorn"); - - (void)arg; - - tt_int_op(ret, OP_EQ, 0); - done: - return; -} - -static void -test_config_include_opened_file_list(void *data) -{ - (void)data; - - config_line_t *result = NULL; - smartlist_t *opened_files = smartlist_new(); - char *dir = tor_strdup(get_fname("test_include_opened_file_list")); - tt_ptr_op(dir, OP_NE, NULL); - -#ifdef _WIN32 - tt_int_op(mkdir(dir), OP_EQ, 0); -#else - tt_int_op(mkdir(dir, 0700), OP_EQ, 0); -#endif - - char torrcd[PATH_MAX+1]; - tor_snprintf(torrcd, sizeof(torrcd), "%s"PATH_SEPARATOR"%s", dir, "torrc.d"); - -#ifdef _WIN32 - tt_int_op(mkdir(torrcd), OP_EQ, 0); -#else - tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0); -#endif - - char subfolder[PATH_MAX+1]; - tor_snprintf(subfolder, sizeof(subfolder), "%s"PATH_SEPARATOR"%s", torrcd, - "subfolder"); - -#ifdef _WIN32 - tt_int_op(mkdir(subfolder), OP_EQ, 0); -#else - tt_int_op(mkdir(subfolder, 0700), OP_EQ, 0); -#endif - - char path[PATH_MAX+1]; - tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", subfolder, - "01_file_in_subfolder"); - tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0); - - char empty[PATH_MAX+1]; - tor_snprintf(empty, sizeof(empty), "%s"PATH_SEPARATOR"%s", torrcd, "empty"); - tt_int_op(write_str_to_file(empty, "", 0), OP_EQ, 0); - - char file[PATH_MAX+1]; - tor_snprintf(file, sizeof(file), "%s"PATH_SEPARATOR"%s", torrcd, "file"); - tt_int_op(write_str_to_file(file, "Test 2\n", 0), OP_EQ, 0); - - char dot[PATH_MAX+1]; - tor_snprintf(dot, sizeof(dot), "%s"PATH_SEPARATOR"%s", torrcd, ".dot"); - tt_int_op(write_str_to_file(dot, "Test 3\n", 0), OP_EQ, 0); - - char torrc_contents[1000]; - tor_snprintf(torrc_contents, sizeof(torrc_contents), - "%%include %s\n", - torrcd); - - int include_used; - tt_int_op(config_get_lines_include(torrc_contents, &result, 0, &include_used, - opened_files), OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - tt_int_op(include_used, OP_EQ, 1); - - tt_int_op(smartlist_len(opened_files), OP_EQ, 4); - tt_int_op(smartlist_contains_string(opened_files, torrcd), OP_EQ, 1); - tt_int_op(smartlist_contains_string(opened_files, subfolder), OP_EQ, 1); - // files inside subfolders are not opended, only the subfolder is opened - tt_int_op(smartlist_contains_string(opened_files, empty), OP_EQ, 1); - tt_int_op(smartlist_contains_string(opened_files, file), OP_EQ, 1); - // dot files are not opened as we ignore them when we get their name from - // their parent folder - - done: - SMARTLIST_FOREACH(opened_files, char *, f, tor_free(f)); - smartlist_free(opened_files); - config_free_lines(result); - tor_free(dir); -} - -#define CONFIG_TEST(name, flags) \ - { #name, test_config_ ## name, flags, NULL, NULL } - -struct testcase_t config_tests[] = { - CONFIG_TEST(adding_trusted_dir_server, TT_FORK), - CONFIG_TEST(adding_fallback_dir_server, TT_FORK), - CONFIG_TEST(parsing_trusted_dir_server, 0), - CONFIG_TEST(parsing_fallback_dir_server, 0), - CONFIG_TEST(adding_default_trusted_dir_servers, TT_FORK), - CONFIG_TEST(adding_dir_servers, TT_FORK), - CONFIG_TEST(default_dir_servers, TT_FORK), - CONFIG_TEST(default_fallback_dirs, 0), - CONFIG_TEST(resolve_my_address, TT_FORK), - CONFIG_TEST(addressmap, 0), - CONFIG_TEST(parse_bridge_line, 0), - CONFIG_TEST(parse_transport_options_line, 0), - CONFIG_TEST(parse_transport_plugin_line, TT_FORK), - CONFIG_TEST(check_or_create_data_subdir, TT_FORK), - CONFIG_TEST(write_to_data_subdir, TT_FORK), - CONFIG_TEST(fix_my_family, 0), - CONFIG_TEST(directory_fetch, 0), - CONFIG_TEST(port_cfg_line_extract_addrport, 0), - CONFIG_TEST(parse_port_config__ports__no_ports_given, 0), - CONFIG_TEST(parse_port_config__ports__server_options, 0), - CONFIG_TEST(parse_port_config__ports__ports_given, 0), - CONFIG_TEST(parse_log_severity, 0), - CONFIG_TEST(include_limit, 0), - CONFIG_TEST(include_does_not_exist, 0), - CONFIG_TEST(include_error_in_included_file, 0), - CONFIG_TEST(include_empty_file_folder, 0), -#ifndef _WIN32 - CONFIG_TEST(include_no_permission, 0), -#endif - CONFIG_TEST(include_recursion_before_after, 0), - CONFIG_TEST(include_recursion_after_only, 0), - CONFIG_TEST(include_folder_order, 0), - CONFIG_TEST(include_path_syntax, 0), - CONFIG_TEST(include_not_processed, 0), - CONFIG_TEST(include_has_include, 0), - CONFIG_TEST(include_flag_both_without, TT_FORK), - CONFIG_TEST(include_flag_torrc_only, TT_FORK), - CONFIG_TEST(include_flag_defaults_only, TT_FORK), - CONFIG_TEST(dup_and_filter, 0), - CONFIG_TEST(check_bridge_distribution_setting_not_a_bridge, TT_FORK), - CONFIG_TEST(check_bridge_distribution_setting_valid, 0), - CONFIG_TEST(check_bridge_distribution_setting_invalid, 0), - CONFIG_TEST(check_bridge_distribution_setting_unrecognised, 0), - CONFIG_TEST(include_opened_file_list, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_connection.c b/src/tor/src/test/test_connection.c deleted file mode 100644 index 314b90cfd..000000000 --- a/src/tor/src/test/test_connection.c +++ /dev/null @@ -1,797 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CONNECTION_PRIVATE -#define MAIN_PRIVATE - -#include "or.h" -#include "test.h" - -#include "connection.h" -#include "hs_common.h" -#include "main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "rendcache.h" -#include "directory.h" - -#include "test_connection.h" -#include "test_helpers.h" - -static void * test_conn_get_basic_setup(const struct testcase_t *tc); -static int test_conn_get_basic_teardown(const struct testcase_t *tc, - void *arg); - -static void * test_conn_get_rend_setup(const struct testcase_t *tc); -static int test_conn_get_rend_teardown(const struct testcase_t *tc, - void *arg); - -static void * test_conn_get_rsrc_setup(const struct testcase_t *tc); -static int test_conn_get_rsrc_teardown(const struct testcase_t *tc, - void *arg); - -/* Arbitrary choice - IPv4 Directory Connection to localhost */ -#define TEST_CONN_TYPE (CONN_TYPE_DIR) -/* We assume every machine has IPv4 localhost, is that ok? */ -#define TEST_CONN_ADDRESS "127.0.0.1" -#define TEST_CONN_PORT (12345) -#define TEST_CONN_ADDRESS_PORT "127.0.0.1:12345" -#define TEST_CONN_FAMILY (AF_INET) -#define TEST_CONN_STATE (DIR_CONN_STATE_MIN_) -#define TEST_CONN_ADDRESS_2 "127.0.0.2" - -#define TEST_CONN_BASIC_PURPOSE (DIR_PURPOSE_MIN_) - -#define TEST_CONN_REND_ADDR "cfs3rltphxxvabci" -#define TEST_CONN_REND_PURPOSE (DIR_PURPOSE_FETCH_RENDDESC_V2) -#define TEST_CONN_REND_PURPOSE_SUCCESSFUL (DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2) -#define TEST_CONN_REND_TYPE_2 (CONN_TYPE_AP) -#define TEST_CONN_REND_ADDR_2 "icbavxxhptlr3sfc" - -#define TEST_CONN_RSRC (networkstatus_get_flavor_name(FLAV_MICRODESC)) -#define TEST_CONN_RSRC_PURPOSE (DIR_PURPOSE_FETCH_CONSENSUS) -#define TEST_CONN_RSRC_STATE_SUCCESSFUL (DIR_CONN_STATE_CLIENT_FINISHED) -#define TEST_CONN_RSRC_2 (networkstatus_get_flavor_name(FLAV_NS)) - -#define TEST_CONN_DL_STATE (DIR_CONN_STATE_CLIENT_READING) - -/* see AP_CONN_STATE_IS_UNATTACHED() */ -#define TEST_CONN_UNATTACHED_STATE (AP_CONN_STATE_CIRCUIT_WAIT) -#define TEST_CONN_ATTACHED_STATE (AP_CONN_STATE_CONNECT_WAIT) - -void -test_conn_lookup_addr_helper(const char *address, int family, tor_addr_t *addr) -{ - int rv = 0; - - tt_assert(addr); - - rv = tor_addr_lookup(address, family, addr); - /* XXXX - should we retry on transient failure? */ - tt_int_op(rv, OP_EQ, 0); - tt_assert(tor_addr_is_loopback(addr)); - tt_assert(tor_addr_is_v4(addr)); - - return; - - done: - tor_addr_make_null(addr, TEST_CONN_FAMILY); -} - -static void * -test_conn_get_basic_setup(const struct testcase_t *tc) -{ - (void)tc; - return test_conn_get_connection(TEST_CONN_STATE, TEST_CONN_TYPE, - TEST_CONN_BASIC_PURPOSE); -} - -static int -test_conn_get_basic_teardown(const struct testcase_t *tc, void *arg) -{ - (void)tc; - connection_t *conn = arg; - - tt_assert(conn); - assert_connection_ok(conn, time(NULL)); - - /* teardown the connection as fast as possible */ - if (conn->linked_conn) { - assert_connection_ok(conn->linked_conn, time(NULL)); - - /* We didn't call tor_libevent_initialize(), so event_base was NULL, - * so we can't rely on connection_unregister_events() use of event_del(). - */ - if (conn->linked_conn->read_event) { - tor_free(conn->linked_conn->read_event); - conn->linked_conn->read_event = NULL; - } - if (conn->linked_conn->write_event) { - tor_free(conn->linked_conn->write_event); - conn->linked_conn->write_event = NULL; - } - - if (!conn->linked_conn->marked_for_close) { - connection_close_immediate(conn->linked_conn); - if (CONN_IS_EDGE(conn->linked_conn)) { - /* Suppress warnings about all the stuff we didn't do */ - TO_EDGE_CONN(conn->linked_conn)->edge_has_sent_end = 1; - TO_EDGE_CONN(conn->linked_conn)->end_reason = - END_STREAM_REASON_INTERNAL; - if (conn->linked_conn->type == CONN_TYPE_AP) { - TO_ENTRY_CONN(conn->linked_conn)->socks_request->has_finished = 1; - } - } - connection_mark_for_close(conn->linked_conn); - } - - close_closeable_connections(); - } - - /* We didn't set the events up properly, so we can't use event_del() in - * close_closeable_connections() > connection_free() - * > connection_unregister_events() */ - if (conn->read_event) { - tor_free(conn->read_event); - conn->read_event = NULL; - } - if (conn->write_event) { - tor_free(conn->write_event); - conn->write_event = NULL; - } - - if (!conn->marked_for_close) { - connection_close_immediate(conn); - if (CONN_IS_EDGE(conn)) { - /* Suppress warnings about all the stuff we didn't do */ - TO_EDGE_CONN(conn)->edge_has_sent_end = 1; - TO_EDGE_CONN(conn)->end_reason = END_STREAM_REASON_INTERNAL; - if (conn->type == CONN_TYPE_AP) { - TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; - } - } - connection_mark_for_close(conn); - } - - close_closeable_connections(); - - /* The unit test will fail if we return 0 */ - return 1; - - /* When conn == NULL, we can't cleanup anything */ - done: - return 0; -} - -static void * -test_conn_get_rend_setup(const struct testcase_t *tc) -{ - dir_connection_t *conn = DOWNCAST(dir_connection_t, - test_conn_get_connection( - TEST_CONN_STATE, - TEST_CONN_TYPE, - TEST_CONN_REND_PURPOSE)); - tt_assert(conn); - assert_connection_ok(&conn->base_, time(NULL)); - - rend_cache_init(); - - /* TODO: use directory_initiate_request() to do this - maybe? */ - tor_assert(strlen(TEST_CONN_REND_ADDR) == REND_SERVICE_ID_LEN_BASE32); - conn->rend_data = rend_data_client_create(TEST_CONN_REND_ADDR, NULL, NULL, - REND_NO_AUTH); - assert_connection_ok(&conn->base_, time(NULL)); - return conn; - - /* On failure */ - done: - test_conn_get_rend_teardown(tc, conn); - /* Returning NULL causes the unit test to fail */ - return NULL; -} - -static int -test_conn_get_rend_teardown(const struct testcase_t *tc, void *arg) -{ - dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); - int rv = 0; - - tt_assert(conn); - assert_connection_ok(&conn->base_, time(NULL)); - - /* avoid a last-ditch attempt to refetch the descriptor */ - conn->base_.purpose = TEST_CONN_REND_PURPOSE_SUCCESSFUL; - - /* connection_free_() cleans up rend_data */ - rv = test_conn_get_basic_teardown(tc, arg); - done: - rend_cache_free_all(); - return rv; -} - -static dir_connection_t * -test_conn_download_status_add_a_connection(const char *resource) -{ - dir_connection_t *conn = DOWNCAST(dir_connection_t, - test_conn_get_connection( - TEST_CONN_STATE, - TEST_CONN_TYPE, - TEST_CONN_RSRC_PURPOSE)); - - tt_assert(conn); - assert_connection_ok(&conn->base_, time(NULL)); - - /* Replace the existing resource with the one we want */ - if (resource) { - if (conn->requested_resource) { - tor_free(conn->requested_resource); - } - conn->requested_resource = tor_strdup(resource); - assert_connection_ok(&conn->base_, time(NULL)); - } - - return conn; - - done: - test_conn_get_rsrc_teardown(NULL, conn); - return NULL; -} - -static void * -test_conn_get_rsrc_setup(const struct testcase_t *tc) -{ - (void)tc; - return test_conn_download_status_add_a_connection(TEST_CONN_RSRC); -} - -static int -test_conn_get_rsrc_teardown(const struct testcase_t *tc, void *arg) -{ - int rv = 0; - - connection_t *conn = (connection_t *)arg; - tt_assert(conn); - assert_connection_ok(conn, time(NULL)); - - if (conn->type == CONN_TYPE_DIR) { - dir_connection_t *dir_conn = DOWNCAST(dir_connection_t, arg); - - tt_assert(dir_conn); - assert_connection_ok(&dir_conn->base_, time(NULL)); - - /* avoid a last-ditch attempt to refetch the consensus */ - dir_conn->base_.state = TEST_CONN_RSRC_STATE_SUCCESSFUL; - assert_connection_ok(&dir_conn->base_, time(NULL)); - } - - /* connection_free_() cleans up requested_resource */ - rv = test_conn_get_basic_teardown(tc, conn); - - done: - return rv; -} - -static void * -test_conn_download_status_setup(const struct testcase_t *tc) -{ - return (void*)tc; -} - -static int -test_conn_download_status_teardown(const struct testcase_t *tc, void *arg) -{ - (void)arg; - int rv = 0; - - /* Ignore arg, and just loop through the connection array */ - SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { - if (conn) { - assert_connection_ok(conn, time(NULL)); - - /* connection_free_() cleans up requested_resource */ - rv = test_conn_get_rsrc_teardown(tc, conn); - tt_int_op(rv, OP_EQ, 1); - } - } SMARTLIST_FOREACH_END(conn); - - done: - return rv; -} - -/* Like connection_ap_make_link(), but does much less */ -static connection_t * -test_conn_get_linked_connection(connection_t *l_conn, uint8_t state) -{ - tt_assert(l_conn); - assert_connection_ok(l_conn, time(NULL)); - - /* AP connections don't seem to have purposes */ - connection_t *conn = test_conn_get_connection(state, CONN_TYPE_AP, - 0); - - tt_assert(conn); - assert_connection_ok(conn, time(NULL)); - - conn->linked = 1; - l_conn->linked = 1; - conn->linked_conn = l_conn; - l_conn->linked_conn = conn; - /* we never opened a real socket, so we can just overwrite it */ - conn->s = TOR_INVALID_SOCKET; - l_conn->s = TOR_INVALID_SOCKET; - - assert_connection_ok(conn, time(NULL)); - assert_connection_ok(l_conn, time(NULL)); - - return conn; - - done: - test_conn_download_status_teardown(NULL, NULL); - return NULL; -} - -static struct testcase_setup_t test_conn_get_basic_st = { - test_conn_get_basic_setup, test_conn_get_basic_teardown -}; - -static struct testcase_setup_t test_conn_get_rend_st = { - test_conn_get_rend_setup, test_conn_get_rend_teardown -}; - -static struct testcase_setup_t test_conn_get_rsrc_st = { - test_conn_get_rsrc_setup, test_conn_get_rsrc_teardown -}; - -static struct testcase_setup_t test_conn_download_status_st = { - test_conn_download_status_setup, test_conn_download_status_teardown -}; - -static void -test_conn_get_basic(void *arg) -{ - connection_t *conn = (connection_t*)arg; - tor_addr_t addr, addr2; - - tt_assert(conn); - assert_connection_ok(conn, time(NULL)); - - test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr); - tt_assert(!tor_addr_is_null(&addr)); - test_conn_lookup_addr_helper(TEST_CONN_ADDRESS_2, TEST_CONN_FAMILY, &addr2); - tt_assert(!tor_addr_is_null(&addr2)); - - /* Check that we get this connection back when we search for it by - * its attributes, but get NULL when we supply a different value. */ - - tt_assert(connection_get_by_global_id(conn->global_identifier) == conn); - tt_ptr_op(connection_get_by_global_id(!conn->global_identifier), OP_EQ, - NULL); - - tt_assert(connection_get_by_type(conn->type) == conn); - tt_assert(connection_get_by_type(TEST_CONN_TYPE) == conn); - tt_ptr_op(connection_get_by_type(!conn->type), OP_EQ, NULL); - tt_ptr_op(connection_get_by_type(!TEST_CONN_TYPE), OP_EQ, NULL); - - tt_assert(connection_get_by_type_state(conn->type, conn->state) - == conn); - tt_assert(connection_get_by_type_state(TEST_CONN_TYPE, TEST_CONN_STATE) - == conn); - tt_assert(connection_get_by_type_state(!conn->type, !conn->state) - == NULL); - tt_assert(connection_get_by_type_state(!TEST_CONN_TYPE, !TEST_CONN_STATE) - == NULL); - - /* Match on the connection fields themselves */ - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &conn->addr, - conn->port, - conn->purpose) - == conn); - /* Match on the original inputs to the connection */ - tt_assert(connection_get_by_type_addr_port_purpose(TEST_CONN_TYPE, - &conn->addr, - conn->port, - conn->purpose) - == conn); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &addr, - conn->port, - conn->purpose) - == conn); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &conn->addr, - TEST_CONN_PORT, - conn->purpose) - == conn); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &conn->addr, - conn->port, - TEST_CONN_BASIC_PURPOSE) - == conn); - tt_assert(connection_get_by_type_addr_port_purpose(TEST_CONN_TYPE, - &addr, - TEST_CONN_PORT, - TEST_CONN_BASIC_PURPOSE) - == conn); - /* Then try each of the not-matching combinations */ - tt_assert(connection_get_by_type_addr_port_purpose(!conn->type, - &conn->addr, - conn->port, - conn->purpose) - == NULL); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &addr2, - conn->port, - conn->purpose) - == NULL); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &conn->addr, - !conn->port, - conn->purpose) - == NULL); - tt_assert(connection_get_by_type_addr_port_purpose(conn->type, - &conn->addr, - conn->port, - !conn->purpose) - == NULL); - /* Then try everything not-matching */ - tt_assert(connection_get_by_type_addr_port_purpose(!conn->type, - &addr2, - !conn->port, - !conn->purpose) - == NULL); - tt_assert(connection_get_by_type_addr_port_purpose(!TEST_CONN_TYPE, - &addr2, - !TEST_CONN_PORT, - !TEST_CONN_BASIC_PURPOSE) - == NULL); - - done: - ; -} - -static void -test_conn_get_rend(void *arg) -{ - dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); - tt_assert(conn); - assert_connection_ok(&conn->base_, time(NULL)); - - tt_assert(connection_get_by_type_state_rendquery( - conn->base_.type, - conn->base_.state, - rend_data_get_address( - conn->rend_data)) - == TO_CONN(conn)); - tt_assert(connection_get_by_type_state_rendquery( - TEST_CONN_TYPE, - TEST_CONN_STATE, - TEST_CONN_REND_ADDR) - == TO_CONN(conn)); - tt_assert(connection_get_by_type_state_rendquery(TEST_CONN_REND_TYPE_2, - !conn->base_.state, - "") - == NULL); - tt_assert(connection_get_by_type_state_rendquery(TEST_CONN_REND_TYPE_2, - !TEST_CONN_STATE, - TEST_CONN_REND_ADDR_2) - == NULL); - - done: - ; -} - -#define sl_is_conn_assert(sl_input, conn) \ - do { \ - the_sl = (sl_input); \ - tt_int_op(smartlist_len((the_sl)), OP_EQ, 1); \ - tt_assert(smartlist_get((the_sl), 0) == (conn)); \ - smartlist_free(the_sl); the_sl = NULL; \ - } while (0) - -#define sl_no_conn_assert(sl_input) \ - do { \ - the_sl = (sl_input); \ - tt_int_op(smartlist_len((the_sl)), OP_EQ, 0); \ - smartlist_free(the_sl); the_sl = NULL; \ - } while (0) - -static void -test_conn_get_rsrc(void *arg) -{ - dir_connection_t *conn = DOWNCAST(dir_connection_t, arg); - smartlist_t *the_sl = NULL; - tt_assert(conn); - assert_connection_ok(&conn->base_, time(NULL)); - - sl_is_conn_assert(connection_dir_list_by_purpose_and_resource( - conn->base_.purpose, - conn->requested_resource), - conn); - sl_is_conn_assert(connection_dir_list_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, - TEST_CONN_RSRC), - conn); - sl_no_conn_assert(connection_dir_list_by_purpose_and_resource( - !conn->base_.purpose, - "")); - sl_no_conn_assert(connection_dir_list_by_purpose_and_resource( - !TEST_CONN_RSRC_PURPOSE, - TEST_CONN_RSRC_2)); - - sl_is_conn_assert(connection_dir_list_by_purpose_resource_and_state( - conn->base_.purpose, - conn->requested_resource, - conn->base_.state), - conn); - sl_is_conn_assert(connection_dir_list_by_purpose_resource_and_state( - TEST_CONN_RSRC_PURPOSE, - TEST_CONN_RSRC, - TEST_CONN_STATE), - conn); - sl_no_conn_assert(connection_dir_list_by_purpose_resource_and_state( - !conn->base_.purpose, - "", - !conn->base_.state)); - sl_no_conn_assert(connection_dir_list_by_purpose_resource_and_state( - !TEST_CONN_RSRC_PURPOSE, - TEST_CONN_RSRC_2, - !TEST_CONN_STATE)); - - tt_int_op(connection_dir_count_by_purpose_and_resource( - conn->base_.purpose, conn->requested_resource), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - !conn->base_.purpose, ""), - OP_EQ, 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2), - OP_EQ, 0); - - tt_int_op(connection_dir_count_by_purpose_resource_and_state( - conn->base_.purpose, conn->requested_resource, - conn->base_.state), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_resource_and_state( - TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC, TEST_CONN_STATE), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_resource_and_state( - !conn->base_.purpose, "", !conn->base_.state), - OP_EQ, 0); - tt_int_op(connection_dir_count_by_purpose_resource_and_state( - !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2, !TEST_CONN_STATE), - OP_EQ, 0); - - done: - smartlist_free(the_sl); -} - -static void -test_conn_download_status(void *arg) -{ - dir_connection_t *conn = NULL; - dir_connection_t *conn2 = NULL; - dir_connection_t *conn4 = NULL; - connection_t *ap_conn = NULL; - - const struct testcase_t *tc = arg; - consensus_flavor_t usable_flavor = (consensus_flavor_t)tc->setup_data; - - /* The "other flavor" trick only works if there are two flavors */ - tor_assert(N_CONSENSUS_FLAVORS == 2); - consensus_flavor_t other_flavor = ((usable_flavor == FLAV_NS) - ? FLAV_MICRODESC - : FLAV_NS); - const char *res = networkstatus_get_flavor_name(usable_flavor); - const char *other_res = networkstatus_get_flavor_name(other_flavor); - - /* no connections */ - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* one connection, not downloading */ - conn = test_conn_download_status_add_a_connection(res); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* one connection, downloading but not linked (not possible on a client, - * but possible on a relay) */ - conn->base_.state = TEST_CONN_DL_STATE; - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* one connection, downloading and linked, but not yet attached */ - ap_conn = test_conn_get_linked_connection(TO_CONN(conn), - TEST_CONN_UNATTACHED_STATE); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* one connection, downloading and linked and attached */ - ap_conn->state = TEST_CONN_ATTACHED_STATE; - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* one connection, linked and attached but not downloading */ - conn->base_.state = TEST_CONN_STATE; - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* two connections, both not downloading */ - conn2 = test_conn_download_status_add_a_connection(res); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 2); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* two connections, one downloading */ - conn->base_.state = TEST_CONN_DL_STATE; - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 2); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - conn->base_.state = TEST_CONN_STATE; - - /* more connections, all not downloading */ - /* ignore the return value, it's free'd using the connection list */ - (void)test_conn_download_status_add_a_connection(res); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* more connections, one downloading */ - conn->base_.state = TEST_CONN_DL_STATE; - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* more connections, two downloading (should never happen, but needs - * to be tested for completeness) */ - conn2->base_.state = TEST_CONN_DL_STATE; - /* ignore the return value, it's free'd using the connection list */ - (void)test_conn_get_linked_connection(TO_CONN(conn2), - TEST_CONN_ATTACHED_STATE); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - conn->base_.state = TEST_CONN_STATE; - - /* more connections, a different one downloading */ - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 0); - - /* a connection for the other flavor (could happen if a client is set to - * cache directory documents), one preferred flavor downloading - */ - conn4 = test_conn_download_status_add_a_connection(other_res); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 0); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 1); - - /* a connection for the other flavor (could happen if a client is set to - * cache directory documents), both flavors downloading - */ - conn4->base_.state = TEST_CONN_DL_STATE; - /* ignore the return value, it's free'd using the connection list */ - (void)test_conn_get_linked_connection(TO_CONN(conn4), - TEST_CONN_ATTACHED_STATE); - tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1); - tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ, - 1); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, res), - OP_EQ, 3); - tt_int_op(connection_dir_count_by_purpose_and_resource( - TEST_CONN_RSRC_PURPOSE, other_res), - OP_EQ, 1); - - done: - /* the teardown function removes all the connections in the global list*/; -} - -#define CONNECTION_TESTCASE(name, fork, setup) \ - { #name, test_conn_##name, fork, &setup, NULL } - -/* where arg is an expression (constant, varaible, compound expression) */ -#define CONNECTION_TESTCASE_ARG(name, fork, setup, arg) \ - { #name "_" #arg, test_conn_##name, fork, &setup, (void *)arg } - -struct testcase_t connection_tests[] = { - CONNECTION_TESTCASE(get_basic, TT_FORK, test_conn_get_basic_st), - CONNECTION_TESTCASE(get_rend, TT_FORK, test_conn_get_rend_st), - CONNECTION_TESTCASE(get_rsrc, TT_FORK, test_conn_get_rsrc_st), - CONNECTION_TESTCASE_ARG(download_status, TT_FORK, - test_conn_download_status_st, FLAV_MICRODESC), - CONNECTION_TESTCASE_ARG(download_status, TT_FORK, - test_conn_download_status_st, FLAV_NS), -//CONNECTION_TESTCASE(func_suffix, TT_FORK, setup_func_pair), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_connection.h b/src/tor/src/test/test_connection.h deleted file mode 100644 index 392783b53..000000000 --- a/src/tor/src/test/test_connection.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** Some constants used by test_connection and helpers */ -#define TEST_CONN_FAMILY (AF_INET) -#define TEST_CONN_ADDRESS "127.0.0.1" -#define TEST_CONN_PORT (12345) -#define TEST_CONN_ADDRESS_PORT "127.0.0.1:12345" -#define TEST_CONN_FD_INIT 50 - -void test_conn_lookup_addr_helper(const char *address, - int family, tor_addr_t *addr); - diff --git a/src/tor/src/test/test_conscache.c b/src/tor/src/test/test_conscache.c deleted file mode 100644 index ffec3149b..000000000 --- a/src/tor/src/test/test_conscache.c +++ /dev/null @@ -1,340 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "config.h" -#include "conscache.h" -#include "test.h" - -#ifdef HAVE_UTIME_H -#include -#endif - -static void -test_conscache_open_failure(void *arg) -{ - (void) arg; - /* Try opening a directory that doesn't exist and which we shouldn't be - * able to create. */ - consensus_cache_t *cache = consensus_cache_open("a/b/c/d/e/f/g", 128); - tt_ptr_op(cache, OP_EQ, NULL); - - done: - ; -} - -static void -test_conscache_simple_usage(void *arg) -{ - (void)arg; - consensus_cache_entry_t *ent = NULL, *ent2 = NULL; - - /* Make a temporary datadir for these tests */ - char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); - tor_free(get_options_mutable()->CacheDirectory); - get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); - check_private_dir(ddir_fname, CPD_CREATE, NULL); - consensus_cache_t *cache = consensus_cache_open("cons", 128); - - tt_assert(cache); - - /* Create object; make sure it exists. */ - config_line_t *labels = NULL; - config_line_append(&labels, "Hello", "world"); - config_line_append(&labels, "Adios", "planetas"); - ent = consensus_cache_add(cache, - labels, (const uint8_t *)"A\0B\0C", 5); - config_free_lines(labels); - labels = NULL; - tt_assert(ent); - - /* Make a second object */ - config_line_append(&labels, "Hello", "mundo"); - config_line_append(&labels, "Adios", "planets"); - ent2 = consensus_cache_add(cache, - labels, (const uint8_t *)"xyzzy", 5); - config_free_lines(labels); - labels = NULL; - tt_assert(ent2); - tt_assert(! consensus_cache_entry_is_mapped(ent2)); - consensus_cache_entry_decref(ent2); - ent2 = NULL; - - /* Check get_value */ - tt_ptr_op(NULL, OP_EQ, consensus_cache_entry_get_value(ent, "hebbo")); - tt_str_op("world", OP_EQ, consensus_cache_entry_get_value(ent, "Hello")); - - /* Check find_first */ - ent2 = consensus_cache_find_first(cache, "Hello", "world!"); - tt_ptr_op(ent2, OP_EQ, NULL); - ent2 = consensus_cache_find_first(cache, "Hello", "world"); - tt_ptr_op(ent2, OP_EQ, ent); - ent2 = consensus_cache_find_first(cache, "Hello", "mundo"); - tt_ptr_op(ent2, OP_NE, ent); - - tt_assert(! consensus_cache_entry_is_mapped(ent)); - - /* Check get_body */ - const uint8_t *bp = NULL; - size_t sz = 0; - int r = consensus_cache_entry_get_body(ent, &bp, &sz); - tt_int_op(r, OP_EQ, 0); - tt_u64_op(sz, OP_EQ, 5); - tt_mem_op(bp, OP_EQ, "A\0B\0C", 5); - tt_assert(consensus_cache_entry_is_mapped(ent)); - - /* Free and re-create the cache, to rescan the directory. */ - consensus_cache_free(cache); - consensus_cache_entry_decref(ent); - cache = consensus_cache_open("cons", 128); - - /* Make sure the entry is still there */ - ent = consensus_cache_find_first(cache, "Hello", "mundo"); - tt_assert(ent); - ent2 = consensus_cache_find_first(cache, "Adios", "planets"); - tt_ptr_op(ent, OP_EQ, ent2); - consensus_cache_entry_incref(ent); - tt_assert(! consensus_cache_entry_is_mapped(ent)); - r = consensus_cache_entry_get_body(ent, &bp, &sz); - tt_int_op(r, OP_EQ, 0); - tt_u64_op(sz, OP_EQ, 5); - tt_mem_op(bp, OP_EQ, "xyzzy", 5); - tt_assert(consensus_cache_entry_is_mapped(ent)); - - /* There should be two entries total. */ - smartlist_t *entries = smartlist_new(); - consensus_cache_find_all(entries, cache, NULL, NULL); - int n = smartlist_len(entries); - smartlist_free(entries); - tt_int_op(n, OP_EQ, 2); - - done: - consensus_cache_entry_decref(ent); - tor_free(ddir_fname); - consensus_cache_free(cache); -} - -static void -test_conscache_cleanup(void *arg) -{ - (void)arg; - const int N = 20; - consensus_cache_entry_t **ents = - tor_calloc(N, sizeof(consensus_cache_entry_t*)); - - /* Make a temporary datadir for these tests */ - char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); - tor_free(get_options_mutable()->CacheDirectory); - get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); - check_private_dir(ddir_fname, CPD_CREATE, NULL); - consensus_cache_t *cache = consensus_cache_open("cons", 128); - - tt_assert(cache); - - /* Create a bunch of entries. */ - int i; - for (i = 0; i < N; ++i) { - config_line_t *labels = NULL; - char num[8]; - tor_snprintf(num, sizeof(num), "%d", i); - config_line_append(&labels, "test-id", "cleanup"); - config_line_append(&labels, "index", num); - size_t bodylen = i * 3; - uint8_t *body = tor_malloc(bodylen); - memset(body, i, bodylen); - ents[i] = consensus_cache_add(cache, labels, body, bodylen); - tor_free(body); - config_free_lines(labels); - tt_assert(ents[i]); - /* We're still holding a reference to each entry at this point. */ - } - - /* Page all of the entries into RAM */ - for (i = 0; i < N; ++i) { - const uint8_t *bp; - size_t sz; - tt_assert(! consensus_cache_entry_is_mapped(ents[i])); - consensus_cache_entry_get_body(ents[i], &bp, &sz); - tt_assert(consensus_cache_entry_is_mapped(ents[i])); - } - - /* Mark some of the entries as deletable. */ - for (i = 7; i < N; i += 7) { - consensus_cache_entry_mark_for_removal(ents[i]); - tt_assert(consensus_cache_entry_is_mapped(ents[i])); - } - - /* Mark some of the entries as aggressively unpaged. */ - for (i = 3; i < N; i += 3) { - consensus_cache_entry_mark_for_aggressive_release(ents[i]); - tt_assert(consensus_cache_entry_is_mapped(ents[i])); - } - - /* Incref some of the entries again */ - for (i = 0; i < N; i += 2) { - consensus_cache_entry_incref(ents[i]); - } - - /* Now we're going to decref everything. We do so at a specific time. I'm - * picking the moment when I was writing this test, at 2017-04-05 12:16:48 - * UTC. */ - const time_t example_time = 1491394608; - update_approx_time(example_time); - for (i = 0; i < N; ++i) { - consensus_cache_entry_decref(ents[i]); - if (i % 2) { - ents[i] = NULL; /* We're no longer holding any reference here. */ - } - } - - /* At this point, the aggressively-released items with refcount 1 should - * be unmapped. Nothing should be deleted. */ - consensus_cache_entry_t *e_tmp; - e_tmp = consensus_cache_find_first(cache, "index", "3"); - tt_assert(e_tmp); - tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); - e_tmp = consensus_cache_find_first(cache, "index", "5"); - tt_assert(e_tmp); - tt_assert(consensus_cache_entry_is_mapped(e_tmp)); - e_tmp = consensus_cache_find_first(cache, "index", "6"); - tt_assert(e_tmp); - tt_assert(consensus_cache_entry_is_mapped(e_tmp)); - e_tmp = consensus_cache_find_first(cache, "index", "7"); - tt_ptr_op(e_tmp, OP_EQ, NULL); // not found because pending deletion. - - /* Delete the pending-deletion items. */ - consensus_cache_delete_pending(cache, 0); - { - smartlist_t *entries = smartlist_new(); - consensus_cache_find_all(entries, cache, NULL, NULL); - int n = smartlist_len(entries); - smartlist_free(entries); - tt_int_op(n, OP_EQ, 20 - 2); /* 1 entry was deleted; 1 is not-found. */ - } - e_tmp = consensus_cache_find_first(cache, "index", "7"); // refcnt == 1... - tt_ptr_op(e_tmp, OP_EQ, NULL); // so deleted. - e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2 - tt_ptr_op(e_tmp, OP_EQ, NULL); // not deleted; but not found. - - /* Now do lazy unmapping. */ - // should do nothing. - consensus_cache_unmap_lazy(cache, example_time - 10); - e_tmp = consensus_cache_find_first(cache, "index", "11"); - tt_assert(e_tmp); - tt_assert(consensus_cache_entry_is_mapped(e_tmp)); - // should actually unmap - consensus_cache_unmap_lazy(cache, example_time + 10); - e_tmp = consensus_cache_find_first(cache, "index", "11"); - tt_assert(e_tmp); - tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); - // This one will still be mapped, since it has a reference. - e_tmp = consensus_cache_find_first(cache, "index", "16"); - tt_assert(e_tmp); - tt_assert(consensus_cache_entry_is_mapped(e_tmp)); - - for (i = 0; i < N; ++i) { - consensus_cache_entry_decref(ents[i]); - ents[i] = NULL; - } - - /* Free and re-create the cache, to rescan the directory. Make sure the - * deleted thing is still deleted, along with the other deleted thing. */ - consensus_cache_free(cache); - cache = consensus_cache_open("cons", 128); - { - smartlist_t *entries = smartlist_new(); - consensus_cache_find_all(entries, cache, NULL, NULL); - int n = smartlist_len(entries); - smartlist_free(entries); - tt_int_op(n, OP_EQ, 18); - } - - done: - for (i = 0; i < N; ++i) { - consensus_cache_entry_decref(ents[i]); - } - tor_free(ents); - tor_free(ddir_fname); - consensus_cache_free(cache); -} - -static void -test_conscache_filter(void *arg) -{ - (void)arg; - const int N = 30; - smartlist_t *lst = NULL; - - /* Make a temporary datadir for these tests */ - char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); - tor_free(get_options_mutable()->CacheDirectory); - get_options_mutable()->CacheDirectory = tor_strdup(ddir_fname); - check_private_dir(ddir_fname, CPD_CREATE, NULL); - consensus_cache_t *cache = consensus_cache_open("cons", 128); - - tt_assert(cache); - - /* Create a bunch of entries with different labels */ - int i; - for (i = 0; i < N; ++i) { - config_line_t *labels = NULL; - char num[8]; - tor_snprintf(num, sizeof(num), "%d", i); - config_line_append(&labels, "test-id", "filter"); - config_line_append(&labels, "index", num); - tor_snprintf(num, sizeof(num), "%d", i % 3); - config_line_append(&labels, "mod3", num); - tor_snprintf(num, sizeof(num), "%d", i % 5); - config_line_append(&labels, "mod5", num); - - size_t bodylen = i * 3; - uint8_t *body = tor_malloc(bodylen); - memset(body, i, bodylen); - consensus_cache_entry_t *ent = - consensus_cache_add(cache, labels, body, bodylen); - tor_free(body); - config_free_lines(labels); - tt_assert(ent); - consensus_cache_entry_decref(ent); - } - - lst = smartlist_new(); - /* Find nothing. */ - consensus_cache_find_all(lst, cache, "mod5", "5"); - tt_int_op(smartlist_len(lst), OP_EQ, 0); - /* Find everything. */ - consensus_cache_find_all(lst, cache, "test-id", "filter"); - tt_int_op(smartlist_len(lst), OP_EQ, N); - - /* Now filter to find the entries that have i%3 == 1 */ - consensus_cache_filter_list(lst, "mod3", "1"); - tt_int_op(smartlist_len(lst), OP_EQ, 10); - /* Now filter to find the entries that also have i%5 == 3 */ - consensus_cache_filter_list(lst, "mod5", "3"); - tt_int_op(smartlist_len(lst), OP_EQ, 2); - /* So now we have those entries for which i%15 == 13. */ - - consensus_cache_entry_t *ent1 = smartlist_get(lst, 0); - consensus_cache_entry_t *ent2 = smartlist_get(lst, 1); - const char *idx1 = consensus_cache_entry_get_value(ent1, "index"); - const char *idx2 = consensus_cache_entry_get_value(ent2, "index"); - tt_assert( (!strcmp(idx1, "28") && !strcmp(idx2, "13")) || - (!strcmp(idx1, "13") && !strcmp(idx2, "28")) ); - - done: - tor_free(ddir_fname); - consensus_cache_free(cache); - smartlist_free(lst); -} - -#define ENT(name) \ - { #name, test_conscache_ ## name, TT_FORK, NULL, NULL } - -struct testcase_t conscache_tests[] = { - ENT(open_failure), - ENT(simple_usage), - ENT(cleanup), - ENT(filter), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_consdiff.c b/src/tor/src/test/test_consdiff.c deleted file mode 100644 index fda3a7f18..000000000 --- a/src/tor/src/test/test_consdiff.c +++ /dev/null @@ -1,1185 +0,0 @@ -/* Copyright (c) 2014, Daniel Martí - * Copyright (c) 2014, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONSDIFF_PRIVATE - -#include "or.h" -#include "test.h" - -#include "consdiff.h" -#include "memarea.h" -#include "log_test_helpers.h" - -#define tt_str_eq_line(a,b) \ - tt_assert(line_str_eq((b),(a))) - -static void -test_consdiff_smartlist_slice(void *arg) -{ - smartlist_t *sl = smartlist_new(); - smartlist_slice_t *sls; - int items[6] = {0,0,0,0,0,0}; - - /* Create a regular smartlist. */ - (void)arg; - smartlist_add(sl, &items[1]); - smartlist_add(sl, &items[2]); - smartlist_add(sl, &items[3]); - smartlist_add(sl, &items[4]); - smartlist_add(sl, &items[5]); - - /* See if the slice was done correctly. */ - sls = smartlist_slice(sl, 2, 5); - tt_ptr_op(sl, OP_EQ, sls->list); - tt_ptr_op(&items[3], OP_EQ, smartlist_get(sls->list, sls->offset)); - tt_ptr_op(&items[5], OP_EQ, - smartlist_get(sls->list, sls->offset + (sls->len-1))); - tor_free(sls); - - /* See that using -1 as the end does get to the last element. */ - sls = smartlist_slice(sl, 2, -1); - tt_ptr_op(sl, OP_EQ, sls->list); - tt_ptr_op(&items[3], OP_EQ, smartlist_get(sls->list, sls->offset)); - tt_ptr_op(&items[5], OP_EQ, - smartlist_get(sls->list, sls->offset + (sls->len-1))); - - done: - tor_free(sls); - smartlist_free(sl); -} - -static void -test_consdiff_smartlist_slice_string_pos(void *arg) -{ - smartlist_t *sl = smartlist_new(); - smartlist_slice_t *sls; - memarea_t *area = memarea_new(); - - /* Create a regular smartlist. */ - (void)arg; - consensus_split_lines(sl, "a\nd\nc\na\nb\n", area); - - /* See that smartlist_slice_string_pos respects the bounds of the slice. */ - sls = smartlist_slice(sl, 2, 5); - cdline_t a_line = { "a", 1 }; - tt_int_op(3, OP_EQ, smartlist_slice_string_pos(sls, &a_line)); - cdline_t d_line = { "d", 1 }; - tt_int_op(-1, OP_EQ, smartlist_slice_string_pos(sls, &d_line)); - - done: - tor_free(sls); - smartlist_free(sl); - memarea_drop_all(area); -} - -static void -test_consdiff_lcs_lengths(void *arg) -{ - smartlist_t *sl1 = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); - smartlist_slice_t *sls1, *sls2; - int *lengths1, *lengths2; - memarea_t *area = memarea_new(); - - /* Expected lcs lengths in regular and reverse order. */ - int e_lengths1[] = { 0, 1, 2, 3, 3, 4 }; - int e_lengths2[] = { 0, 1, 1, 2, 3, 4 }; - - (void)arg; - consensus_split_lines(sl1, "a\nb\nc\nd\ne\n", area); - consensus_split_lines(sl2, "a\nc\nd\ni\ne\n", area); - - sls1 = smartlist_slice(sl1, 0, -1); - sls2 = smartlist_slice(sl2, 0, -1); - - lengths1 = lcs_lengths(sls1, sls2, 1); - lengths2 = lcs_lengths(sls1, sls2, -1); - tt_mem_op(e_lengths1, OP_EQ, lengths1, sizeof(int) * 6); - tt_mem_op(e_lengths2, OP_EQ, lengths2, sizeof(int) * 6); - - done: - tor_free(lengths1); - tor_free(lengths2); - tor_free(sls1); - tor_free(sls2); - smartlist_free(sl1); - smartlist_free(sl2); - memarea_drop_all(area); -} - -static void -test_consdiff_trim_slices(void *arg) -{ - smartlist_t *sl1 = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); - smartlist_t *sl3 = smartlist_new(); - smartlist_t *sl4 = smartlist_new(); - smartlist_slice_t *sls1, *sls2, *sls3, *sls4; - memarea_t *area = memarea_new(); - - (void)arg; - consensus_split_lines(sl1, "a\nb\nb\nb\nd\n", area); - consensus_split_lines(sl2, "a\nc\nc\nc\nd\n", area); - consensus_split_lines(sl3, "a\nb\nb\nb\na\n", area); - consensus_split_lines(sl4, "c\nb\nb\nb\nc\n", area); - sls1 = smartlist_slice(sl1, 0, -1); - sls2 = smartlist_slice(sl2, 0, -1); - sls3 = smartlist_slice(sl3, 0, -1); - sls4 = smartlist_slice(sl4, 0, -1); - - /* They should be trimmed by one line at each end. */ - tt_int_op(5, OP_EQ, sls1->len); - tt_int_op(5, OP_EQ, sls2->len); - trim_slices(sls1, sls2); - tt_int_op(3, OP_EQ, sls1->len); - tt_int_op(3, OP_EQ, sls2->len); - - /* They should not be trimmed at all. */ - tt_int_op(5, OP_EQ, sls3->len); - tt_int_op(5, OP_EQ, sls4->len); - trim_slices(sls3, sls4); - tt_int_op(5, OP_EQ, sls3->len); - tt_int_op(5, OP_EQ, sls4->len); - - done: - tor_free(sls1); - tor_free(sls2); - tor_free(sls3); - tor_free(sls4); - smartlist_free(sl1); - smartlist_free(sl2); - smartlist_free(sl3); - smartlist_free(sl4); - memarea_drop_all(area); -} - -static void -test_consdiff_set_changed(void *arg) -{ - smartlist_t *sl1 = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); - bitarray_t *changed1 = bitarray_init_zero(4); - bitarray_t *changed2 = bitarray_init_zero(4); - smartlist_slice_t *sls1, *sls2; - memarea_t *area = memarea_new(); - - (void)arg; - consensus_split_lines(sl1, "a\nb\na\na\n", area); - consensus_split_lines(sl2, "a\na\na\na\n", area); - - /* Length of sls1 is 0. */ - sls1 = smartlist_slice(sl1, 0, 0); - sls2 = smartlist_slice(sl2, 1, 3); - set_changed(changed1, changed2, sls1, sls2); - - /* The former is not changed, the latter changes all of its elements. */ - tt_assert(!bitarray_is_set(changed1, 0)); - tt_assert(!bitarray_is_set(changed1, 1)); - tt_assert(!bitarray_is_set(changed1, 2)); - tt_assert(!bitarray_is_set(changed1, 3)); - - tt_assert(!bitarray_is_set(changed2, 0)); - tt_assert(bitarray_is_set(changed2, 1)); - tt_assert(bitarray_is_set(changed2, 2)); - tt_assert(!bitarray_is_set(changed2, 3)); - bitarray_clear(changed2, 1); - bitarray_clear(changed2, 2); - - /* Length of sls1 is 1 and its element is in sls2. */ - tor_free(sls1); - sls1 = smartlist_slice(sl1, 0, 1); - set_changed(changed1, changed2, sls1, sls2); - - /* The latter changes all elements but the (first) common one. */ - tt_assert(!bitarray_is_set(changed1, 0)); - tt_assert(!bitarray_is_set(changed1, 1)); - tt_assert(!bitarray_is_set(changed1, 2)); - tt_assert(!bitarray_is_set(changed1, 3)); - - tt_assert(!bitarray_is_set(changed2, 0)); - tt_assert(!bitarray_is_set(changed2, 1)); - tt_assert(bitarray_is_set(changed2, 2)); - tt_assert(!bitarray_is_set(changed2, 3)); - bitarray_clear(changed2, 2); - - /* Length of sls1 is 1 and its element is not in sls2. */ - tor_free(sls1); - sls1 = smartlist_slice(sl1, 1, 2); - set_changed(changed1, changed2, sls1, sls2); - - /* The former changes its element, the latter changes all elements. */ - tt_assert(!bitarray_is_set(changed1, 0)); - tt_assert(bitarray_is_set(changed1, 1)); - tt_assert(!bitarray_is_set(changed1, 2)); - tt_assert(!bitarray_is_set(changed1, 3)); - - tt_assert(!bitarray_is_set(changed2, 0)); - tt_assert(bitarray_is_set(changed2, 1)); - tt_assert(bitarray_is_set(changed2, 2)); - tt_assert(!bitarray_is_set(changed2, 3)); - - done: - bitarray_free(changed1); - bitarray_free(changed2); - smartlist_free(sl1); - smartlist_free(sl2); - tor_free(sls1); - tor_free(sls2); - memarea_drop_all(area); -} - -static void -test_consdiff_calc_changes(void *arg) -{ - smartlist_t *sl1 = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); - smartlist_slice_t *sls1, *sls2; - bitarray_t *changed1 = bitarray_init_zero(4); - bitarray_t *changed2 = bitarray_init_zero(4); - memarea_t *area = memarea_new(); - - (void)arg; - consensus_split_lines(sl1, "a\na\na\na\n", area); - consensus_split_lines(sl2, "a\na\na\na\n", area); - - sls1 = smartlist_slice(sl1, 0, -1); - sls2 = smartlist_slice(sl2, 0, -1); - calc_changes(sls1, sls2, changed1, changed2); - - /* Nothing should be set to changed. */ - tt_assert(!bitarray_is_set(changed1, 0)); - tt_assert(!bitarray_is_set(changed1, 1)); - tt_assert(!bitarray_is_set(changed1, 2)); - tt_assert(!bitarray_is_set(changed1, 3)); - - tt_assert(!bitarray_is_set(changed2, 0)); - tt_assert(!bitarray_is_set(changed2, 1)); - tt_assert(!bitarray_is_set(changed2, 2)); - tt_assert(!bitarray_is_set(changed2, 3)); - - smartlist_clear(sl2); - consensus_split_lines(sl2, "a\nb\na\nb\n", area); - tor_free(sls1); - tor_free(sls2); - sls1 = smartlist_slice(sl1, 0, -1); - sls2 = smartlist_slice(sl2, 0, -1); - calc_changes(sls1, sls2, changed1, changed2); - - /* Two elements are changed. */ - tt_assert(!bitarray_is_set(changed1, 0)); - tt_assert(bitarray_is_set(changed1, 1)); - tt_assert(bitarray_is_set(changed1, 2)); - tt_assert(!bitarray_is_set(changed1, 3)); - bitarray_clear(changed1, 1); - bitarray_clear(changed1, 2); - - tt_assert(!bitarray_is_set(changed2, 0)); - tt_assert(bitarray_is_set(changed2, 1)); - tt_assert(!bitarray_is_set(changed2, 2)); - tt_assert(bitarray_is_set(changed2, 3)); - bitarray_clear(changed1, 1); - bitarray_clear(changed1, 3); - - smartlist_clear(sl2); - consensus_split_lines(sl2, "b\nb\nb\nb\n", area); - tor_free(sls1); - tor_free(sls2); - sls1 = smartlist_slice(sl1, 0, -1); - sls2 = smartlist_slice(sl2, 0, -1); - calc_changes(sls1, sls2, changed1, changed2); - - /* All elements are changed. */ - tt_assert(bitarray_is_set(changed1, 0)); - tt_assert(bitarray_is_set(changed1, 1)); - tt_assert(bitarray_is_set(changed1, 2)); - tt_assert(bitarray_is_set(changed1, 3)); - - tt_assert(bitarray_is_set(changed2, 0)); - tt_assert(bitarray_is_set(changed2, 1)); - tt_assert(bitarray_is_set(changed2, 2)); - tt_assert(bitarray_is_set(changed2, 3)); - - done: - bitarray_free(changed1); - bitarray_free(changed2); - smartlist_free(sl1); - smartlist_free(sl2); - tor_free(sls1); - tor_free(sls2); - memarea_drop_all(area); -} - -static void -test_consdiff_get_id_hash(void *arg) -{ - (void)arg; - - cdline_t line1 = { "r name", 6 }; - cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; - cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; - cdline_t tmp; - - /* No hash. */ - tt_int_op(-1, OP_EQ, get_id_hash(&line1, &tmp)); - /* The hash contains characters that are not base64. */ - tt_int_op(-1, OP_EQ, get_id_hash(&line2, &tmp)); - - /* valid hash. */ - tt_int_op(0, OP_EQ, get_id_hash(&line3, &tmp)); - tt_ptr_op(tmp.s, OP_EQ, line3.s + 7); - tt_uint_op(tmp.len, OP_EQ, line3.len - 11); - - done: - ; -} - -static void -test_consdiff_is_valid_router_entry(void *arg) -{ - /* Doesn't start with "r ". */ - (void)arg; - cdline_t line0 = { "foo", 3 }; - tt_int_op(0, OP_EQ, is_valid_router_entry(&line0)); - - /* These are already tested with get_id_hash, but make sure it's run - * properly. */ - - cdline_t line1 = { "r name", 6 }; - cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; - cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; - tt_int_op(0, OP_EQ, is_valid_router_entry(&line1)); - tt_int_op(0, OP_EQ, is_valid_router_entry(&line2)); - tt_int_op(1, OP_EQ, is_valid_router_entry(&line3)); - - done: - ; -} - -static void -test_consdiff_next_router(void *arg) -{ - smartlist_t *sl = smartlist_new(); - memarea_t *area = memarea_new(); - (void)arg; - smartlist_add_linecpy(sl, area, "foo"); - smartlist_add_linecpy(sl, area, - "r name hash+longer+than+27+chars+and+valid+base64 etc"); - smartlist_add_linecpy(sl, area, "foo"); - smartlist_add_linecpy(sl, area, "foo"); - smartlist_add_linecpy(sl, area, - "r name hash+longer+than+27+chars+and+valid+base64 etc"); - smartlist_add_linecpy(sl, area, "foo"); - - /* Not currently on a router entry line, finding the next one. */ - tt_int_op(1, OP_EQ, next_router(sl, 0)); - tt_int_op(4, OP_EQ, next_router(sl, 2)); - - /* Already at the beginning of a router entry line, ignore it. */ - tt_int_op(4, OP_EQ, next_router(sl, 1)); - - /* There are no more router entries, so return the line after the last. */ - tt_int_op(6, OP_EQ, next_router(sl, 4)); - tt_int_op(6, OP_EQ, next_router(sl, 5)); - - done: - smartlist_free(sl); - memarea_drop_all(area); -} - -static int -base64cmp_wrapper(const char *a, const char *b) -{ - cdline_t aa = { a, a ? (uint32_t) strlen(a) : 0 }; - cdline_t bb = { b, b ? (uint32_t) strlen(b) : 0 }; - return base64cmp(&aa, &bb); -} - -static void -test_consdiff_base64cmp(void *arg) -{ - /* NULL arguments. */ - (void)arg; - tt_int_op(0, OP_EQ, base64cmp_wrapper(NULL, NULL)); - tt_int_op(-1, OP_EQ, base64cmp_wrapper(NULL, "foo")); - tt_int_op(1, OP_EQ, base64cmp_wrapper("bar", NULL)); - - /* Nil base64 values. */ - tt_int_op(0, OP_EQ, base64cmp_wrapper("", "")); - tt_int_op(0, OP_EQ, base64cmp_wrapper("_", "&")); - - /* Exact same valid strings. */ - tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+", "abcABC/+")); - /* Both end with an invalid base64 char other than '\0'. */ - tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+ ")); - /* Only one ends with an invalid base64 char other than '\0'. */ - tt_int_op(-1, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+a")); - - /* Comparisons that would return differently with strcmp(). */ - tt_int_op(strcmp("/foo", "Afoo"), OP_LT, 0); - tt_int_op(base64cmp_wrapper("/foo", "Afoo"), OP_GT, 0); - tt_int_op(strcmp("Afoo", "0foo"), OP_GT, 0); - tt_int_op(base64cmp_wrapper("Afoo", "0foo"), OP_LT, 0); - - /* Comparisons that would return the same as with strcmp(). */ - tt_int_op(strcmp("afoo", "Afoo"), OP_GT, 0); - tt_int_op(base64cmp_wrapper("afoo", "Afoo"), OP_GT, 0); - - /* Different lengths */ - tt_int_op(base64cmp_wrapper("afoo", "afooo"), OP_LT, 0); - tt_int_op(base64cmp_wrapper("afooo", "afoo"), OP_GT, 0); - - done: - ; -} - -static void -test_consdiff_gen_ed_diff(void *arg) -{ - smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; - int i; - memarea_t *area = memarea_new(); - setup_capture_of_logs(LOG_WARN); - - (void)arg; - cons1 = smartlist_new(); - cons2 = smartlist_new(); - - /* Identity hashes are not sorted properly, return NULL. */ - smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); - smartlist_add_linecpy(cons1, area, "foo"); - smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); - smartlist_add_linecpy(cons1, area, "bar"); - - smartlist_add_linecpy(cons2, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); - smartlist_add_linecpy(cons2, area, "foo"); - smartlist_add_linecpy(cons2, area, "r name ccccccccccccccccccccccccccc etc"); - smartlist_add_linecpy(cons2, area, "bar"); - - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because the base consensus doesn't have its router entries sorted " - "properly."); - - /* Same, but now with the second consensus. */ - mock_clean_saved_logs(); - diff = gen_ed_diff(cons2, cons1, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because the target consensus doesn't have its router entries sorted " - "properly."); - - /* Same as the two above, but with the reversed thing immediately after a - match. (The code handles this differently) */ - smartlist_del(cons1, 0); - smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); - - mock_clean_saved_logs(); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because the base consensus doesn't have its router entries sorted " - "properly."); - - mock_clean_saved_logs(); - diff = gen_ed_diff(cons2, cons1, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because the target consensus doesn't have its router entries sorted " - "properly."); - - /* Identity hashes are repeated, return NULL. */ - smartlist_clear(cons1); - - smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); - smartlist_add_linecpy(cons1, area, "foo"); - smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); - smartlist_add_linecpy(cons1, area, "bar"); - - mock_clean_saved_logs(); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because the base consensus doesn't have its router entries sorted " - "properly."); - - /* We have to add a line that is just a dot, return NULL. */ - smartlist_clear(cons1); - smartlist_clear(cons2); - - smartlist_add_linecpy(cons1, area, "foo1"); - smartlist_add_linecpy(cons1, area, "foo2"); - - smartlist_add_linecpy(cons2, area, "foo1"); - smartlist_add_linecpy(cons2, area, "."); - smartlist_add_linecpy(cons2, area, "foo2"); - - mock_clean_saved_logs(); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Cannot generate consensus diff " - "because one of the lines to be added is \".\"."); - -#define MAX_LINE_COUNT (10000) - /* Too many lines to be fed to the quadratic-time function. */ - smartlist_clear(cons1); - smartlist_clear(cons2); - - for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "a"); - for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "b"); - - mock_clean_saved_logs(); - diff = gen_ed_diff(cons1, cons2, area); - - tt_ptr_op(NULL, OP_EQ, diff); - expect_single_log_msg_containing("Refusing to generate consensus diff " - "because we found too few common router ids."); - - /* We have dot lines, but they don't interfere with the script format. */ - smartlist_clear(cons1); - smartlist_clear(cons2); - - smartlist_add_linecpy(cons1, area, "foo1"); - smartlist_add_linecpy(cons1, area, "."); - smartlist_add_linecpy(cons1, area, "."); - smartlist_add_linecpy(cons1, area, "foo2"); - - smartlist_add_linecpy(cons2, area, "foo1"); - smartlist_add_linecpy(cons2, area, "."); - smartlist_add_linecpy(cons2, area, "foo2"); - - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - smartlist_free(diff); - - /* Empty diff tests. */ - smartlist_clear(cons1); - smartlist_clear(cons2); - - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(0, OP_EQ, smartlist_len(diff)); - smartlist_free(diff); - - smartlist_add_linecpy(cons1, area, "foo"); - smartlist_add_linecpy(cons1, area, "bar"); - - smartlist_add_linecpy(cons2, area, "foo"); - smartlist_add_linecpy(cons2, area, "bar"); - - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(0, OP_EQ, smartlist_len(diff)); - smartlist_free(diff); - - /* Everything is deleted. */ - smartlist_clear(cons2); - - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(1, OP_EQ, smartlist_len(diff)); - tt_str_eq_line("1,2d", smartlist_get(diff, 0)); - - smartlist_free(diff); - - /* Everything is added. */ - diff = gen_ed_diff(cons2, cons1, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(4, OP_EQ, smartlist_len(diff)); - tt_str_eq_line("0a", smartlist_get(diff, 0)); - tt_str_eq_line("foo", smartlist_get(diff, 1)); - tt_str_eq_line("bar", smartlist_get(diff, 2)); - tt_str_eq_line(".", smartlist_get(diff, 3)); - - smartlist_free(diff); - - /* Everything is changed. */ - smartlist_add_linecpy(cons2, area, "foo2"); - smartlist_add_linecpy(cons2, area, "bar2"); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(4, OP_EQ, smartlist_len(diff)); - tt_str_eq_line("1,2c", smartlist_get(diff, 0)); - tt_str_eq_line("foo2", smartlist_get(diff, 1)); - tt_str_eq_line("bar2", smartlist_get(diff, 2)); - tt_str_eq_line(".", smartlist_get(diff, 3)); - - smartlist_free(diff); - - /* Test 'a', 'c' and 'd' together. See that it is done in reverse order. */ - smartlist_clear(cons1); - smartlist_clear(cons2); - consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); - consensus_split_lines(cons2, "A\nC\nO\nE\nU\n", area); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(7, OP_EQ, smartlist_len(diff)); - tt_str_eq_line("5a", smartlist_get(diff, 0)); - tt_str_eq_line("U", smartlist_get(diff, 1)); - tt_str_eq_line(".", smartlist_get(diff, 2)); - tt_str_eq_line("4c", smartlist_get(diff, 3)); - tt_str_eq_line("O", smartlist_get(diff, 4)); - tt_str_eq_line(".", smartlist_get(diff, 5)); - tt_str_eq_line("2d", smartlist_get(diff, 6)); - - smartlist_free(diff); - - smartlist_clear(cons1); - smartlist_clear(cons2); - consensus_split_lines(cons1, "B\n", area); - consensus_split_lines(cons2, "A\nB\n", area); - diff = gen_ed_diff(cons1, cons2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(3, OP_EQ, smartlist_len(diff)); - tt_str_eq_line("0a", smartlist_get(diff, 0)); - tt_str_eq_line("A", smartlist_get(diff, 1)); - tt_str_eq_line(".", smartlist_get(diff, 2)); - - /* TODO: small real use-cases, i.e. consensuses. */ - - done: - teardown_capture_of_logs(); - smartlist_free(cons1); - smartlist_free(cons2); - smartlist_free(diff); - memarea_drop_all(area); -} - -static void -test_consdiff_apply_ed_diff(void *arg) -{ - smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; - memarea_t *area = memarea_new(); - (void)arg; - cons1 = smartlist_new(); - diff = smartlist_new(); - setup_capture_of_logs(LOG_WARN); - - consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); - - /* Command without range. */ - smartlist_add_linecpy(diff, area, "a"); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - smartlist_clear(diff); - expect_single_log_msg_containing("an ed command was missing a line number"); - - /* Range without command. */ - smartlist_add_linecpy(diff, area, "1"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("a line with no ed command was found"); - - smartlist_clear(diff); - - /* Range without end. */ - smartlist_add_linecpy(diff, area, "1,"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command was missing a range " - "end line number."); - - smartlist_clear(diff); - - /* Incoherent ranges. */ - smartlist_add_linecpy(diff, area, "1,1"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an invalid range was found"); - - smartlist_clear(diff); - - smartlist_add_linecpy(diff, area, "3,2"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an invalid range was found"); - - smartlist_clear(diff); - - /* Unexpected range for add command. */ - smartlist_add_linecpy(diff, area, "1,2a"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("add lines after a range"); - - smartlist_clear(diff); - - /* $ for a non-delete command. */ - smartlist_add_linecpy(diff, area, "1,$c"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("it wanted to use $ with a command " - "other than delete"); - - smartlist_clear(diff); - - /* Script is not in reverse order. */ - smartlist_add_linecpy(diff, area, "1d"); - smartlist_add_linecpy(diff, area, "3d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("its commands are not properly sorted"); - - smartlist_clear(diff); - - /* Script contains unrecognised commands longer than one char. */ - smartlist_add_linecpy(diff, area, "1foo"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command longer than one char was " - "found"); - - smartlist_clear(diff); - - /* Script contains unrecognised commands. */ - smartlist_add_linecpy(diff, area, "1e"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an unrecognised ed command was found"); - - smartlist_clear(diff); - - /* Command that should be followed by at least one line and a ".", but - * isn't. */ - smartlist_add_linecpy(diff, area, "0a"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("it has an ed command that tries to " - "insert zero lines."); - - /* Now it is followed by a ".", but it inserts zero lines. */ - smartlist_add_linecpy(diff, area, "."); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("it has an ed command that tries to " - "insert zero lines."); - - smartlist_clear(diff); - - /* Now it it inserts something, but has no terminator. */ - smartlist_add_linecpy(diff, area, "0a"); - smartlist_add_linecpy(diff, area, "hello"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("lines to be inserted that don't end with " - "a \".\"."); - - smartlist_clear(diff); - - /* Ranges must be numeric only and cannot contain spaces. */ - smartlist_add_linecpy(diff, area, "0, 4d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command was missing a range " - "end line number."); - - smartlist_clear(diff); - - /* '+' is not a number. */ - smartlist_add_linecpy(diff, area, "+0,4d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command was missing a line number"); - - smartlist_clear(diff); - - /* range duplication */ - smartlist_add_linecpy(diff, area, "0,4d,5d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command longer than one char was " - "found"); - - smartlist_clear(diff); - - /* space before command */ - smartlist_add_linecpy(diff, area, "0,4 d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command longer than one char was " - "found"); - - smartlist_clear(diff); - - /* space inside number */ - smartlist_add_linecpy(diff, area, "0,4 5d"); - mock_clean_saved_logs(); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("an ed command longer than one char was " - "found"); - - smartlist_clear(diff); - - /* Test appending text, 'a'. */ - consensus_split_lines(diff, "3a\nU\nO\n.\n0a\nV\n.\n", area); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_NE, cons2); - tt_int_op(8, OP_EQ, smartlist_len(cons2)); - tt_str_eq_line("V", smartlist_get(cons2, 0)); - tt_str_eq_line("A", smartlist_get(cons2, 1)); - tt_str_eq_line("B", smartlist_get(cons2, 2)); - tt_str_eq_line("C", smartlist_get(cons2, 3)); - tt_str_eq_line("U", smartlist_get(cons2, 4)); - tt_str_eq_line("O", smartlist_get(cons2, 5)); - tt_str_eq_line("D", smartlist_get(cons2, 6)); - tt_str_eq_line("E", smartlist_get(cons2, 7)); - - smartlist_clear(diff); - smartlist_free(cons2); - - /* Test deleting text, 'd'. */ - consensus_split_lines(diff, "4d\n1,2d\n", area); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_NE, cons2); - tt_int_op(2, OP_EQ, smartlist_len(cons2)); - tt_str_eq_line("C", smartlist_get(cons2, 0)); - tt_str_eq_line("E", smartlist_get(cons2, 1)); - - smartlist_clear(diff); - smartlist_free(cons2); - - /* Test changing text, 'c'. */ - consensus_split_lines(diff, "4c\nT\nX\n.\n1,2c\nM\n.\n", area); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_NE, cons2); - tt_int_op(5, OP_EQ, smartlist_len(cons2)); - tt_str_eq_line("M", smartlist_get(cons2, 0)); - tt_str_eq_line("C", smartlist_get(cons2, 1)); - tt_str_eq_line("T", smartlist_get(cons2, 2)); - tt_str_eq_line("X", smartlist_get(cons2, 3)); - tt_str_eq_line("E", smartlist_get(cons2, 4)); - - smartlist_clear(diff); - smartlist_free(cons2); - - /* Test 'a', 'd' and 'c' together. */ - consensus_split_lines(diff, "4c\nT\nX\n.\n2d\n0a\nM\n.\n", area); - cons2 = apply_ed_diff(cons1, diff, 0); - tt_ptr_op(NULL, OP_NE, cons2); - tt_int_op(6, OP_EQ, smartlist_len(cons2)); - tt_str_eq_line("M", smartlist_get(cons2, 0)); - tt_str_eq_line("A", smartlist_get(cons2, 1)); - tt_str_eq_line("C", smartlist_get(cons2, 2)); - tt_str_eq_line("T", smartlist_get(cons2, 3)); - tt_str_eq_line("X", smartlist_get(cons2, 4)); - tt_str_eq_line("E", smartlist_get(cons2, 5)); - - done: - teardown_capture_of_logs(); - smartlist_free(cons1); - smartlist_free(cons2); - smartlist_free(diff); - memarea_drop_all(area); -} - -static void -test_consdiff_gen_diff(void *arg) -{ - char *cons1_str=NULL, *cons2_str=NULL; - smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; - consensus_digest_t digests1, digests2; - memarea_t *area = memarea_new(); - (void)arg; - cons1 = smartlist_new(); - cons2 = smartlist_new(); - - /* Identity hashes are not sorted properly, return NULL. - * Already tested in gen_ed_diff, but see that a NULL ed diff also makes - * gen_diff return NULL. */ - cons1_str = tor_strdup( - "network-status-version foo\n" - "r name bbbbbbbbbbbbbbbbb etc\nfoo\n" - "r name aaaaaaaaaaaaaaaaa etc\nbar\n" - "directory-signature foo bar\nbar\n" - ); - cons2_str = tor_strdup( - "network-status-version foo\n" - "r name aaaaaaaaaaaaaaaaa etc\nfoo\n" - "r name ccccccccccccccccc etc\nbar\n" - "directory-signature foo bar\nbar\n" - ); - - tt_int_op(0, OP_EQ, - consensus_compute_digest_as_signed(cons1_str, &digests1)); - tt_int_op(0, OP_EQ, - consensus_compute_digest(cons2_str, &digests2)); - - consensus_split_lines(cons1, cons1_str, area); - consensus_split_lines(cons2, cons2_str, area); - - diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); - tt_ptr_op(NULL, OP_EQ, diff); - - /* Check that the headers are done properly. */ - tor_free(cons1_str); - cons1_str = tor_strdup( - "network-status-version foo\n" - "r name ccccccccccccccccc etc\nfoo\n" - "r name eeeeeeeeeeeeeeeee etc\nbar\n" - "directory-signature foo bar\nbar\n" - ); - tt_int_op(0, OP_EQ, - consensus_compute_digest_as_signed(cons1_str, &digests1)); - smartlist_clear(cons1); - consensus_split_lines(cons1, cons1_str, area); - diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); - tt_ptr_op(NULL, OP_NE, diff); - tt_int_op(11, OP_EQ, smartlist_len(diff)); - tt_assert(line_str_eq(smartlist_get(diff, 0), - "network-status-diff-version 1")); - tt_assert(line_str_eq(smartlist_get(diff, 1), "hash " - "95D70F5A3CC65F920AA8B44C4563D7781A082674329661884E19E94B79D539C2 " - "7AFECEFA4599BA33D603653E3D2368F648DF4AC4723929B0F7CF39281596B0C1")); - tt_assert(line_str_eq(smartlist_get(diff, 2), "6,$d")); - tt_assert(line_str_eq(smartlist_get(diff, 3), "3,4c")); - tt_assert(line_str_eq(smartlist_get(diff, 4), "bar")); - tt_assert(line_str_eq(smartlist_get(diff, 5), - "directory-signature foo bar")); - tt_assert(line_str_eq(smartlist_get(diff, 6), - ".")); - tt_assert(line_str_eq(smartlist_get(diff, 7), "1a")); - tt_assert(line_str_eq(smartlist_get(diff, 8), - "r name aaaaaaaaaaaaaaaaa etc")); - tt_assert(line_str_eq(smartlist_get(diff, 9), "foo")); - tt_assert(line_str_eq(smartlist_get(diff, 10), ".")); - - /* TODO: small real use-cases, i.e. consensuses. */ - - done: - tor_free(cons1_str); - tor_free(cons2_str); - smartlist_free(cons1); - smartlist_free(cons2); - smartlist_free(diff); - memarea_drop_all(area); -} - -static void -test_consdiff_apply_diff(void *arg) -{ - smartlist_t *cons1=NULL, *diff=NULL; - char *cons1_str=NULL, *cons2 = NULL; - consensus_digest_t digests1; - (void)arg; - memarea_t *area = memarea_new(); - cons1 = smartlist_new(); - diff = smartlist_new(); - setup_capture_of_logs(LOG_INFO); - - cons1_str = tor_strdup( - "network-status-version foo\n" - "r name ccccccccccccccccc etc\nfoo\n" - "r name eeeeeeeeeeeeeeeee etc\nbar\n" - "directory-signature foo bar\nbar\n" - ); - tt_int_op(0, OP_EQ, - consensus_compute_digest(cons1_str, &digests1)); - consensus_split_lines(cons1, cons1_str, area); - - /* diff doesn't have enough lines. */ - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("too short") - - /* first line doesn't match format-version string. */ - smartlist_add_linecpy(diff, area, "foo-bar"); - smartlist_add_linecpy(diff, area, "header-line"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("format is not known") - - /* The first word of the second header line is not "hash". */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "word a b"); - smartlist_add_linecpy(diff, area, "x"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("does not include the necessary digests") - - /* Wrong number of words after "hash". */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash a b c"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("does not include the necessary digests") - - /* base16 digests do not have the expected length. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash aaa bbb"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("includes base16-encoded digests of " - "incorrect size") - - /* base16 digests contain non-base16 characters. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - " ????????????????????????????????????????????????????????????????" - " ----------------------------------------------------------------"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("includes malformed digests") - - /* Invalid ed diff. - * As tested in apply_ed_diff, but check that apply_diff does return NULL if - * the ed diff can't be applied. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* sha3 of cons1. */ - " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" - /* sha256 of cons2. */ - " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); - smartlist_add_linecpy(diff, area, "foobar"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_single_log_msg_containing("because an ed command was missing a line " - "number") - - /* Base consensus doesn't match its digest as found in the diff. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* bogus sha256. */ - " 3333333333333333333333333333333333333333333333333333333333333333" - /* sha256 of cons2. */ - " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_log_msg_containing("base consensus doesn't match the digest " - "as found"); - - /* Resulting consensus doesn't match its digest as found in the diff. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* sha3 of cons1. */ - " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" - /* bogus sha3. */ - " 3333333333333333333333333333333333333333333333333333333333333333"); - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_log_msg_containing("resulting consensus doesn't match the " - "digest as found"); - -#if 0 - /* XXXX No longer possible, since we aren't using the other algorithm. */ - /* Resulting consensus digest cannot be computed */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* sha3 of cons1. */ - " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" - /* bogus sha3. */ - " 3333333333333333333333333333333333333333333333333333333333333333"); - smartlist_add_linecpy(diff, area, "1,2d"); // remove starting line - mock_clean_saved_logs(); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_EQ, cons2); - expect_log_msg_containing("Could not compute digests of the consensus " - "resulting from applying a consensus diff."); -#endif /* 0 */ - - /* Very simple test, only to see that nothing errors. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* sha3 of cons1. */ - " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" - /* sha3 of cons2. */ - " 90A418881B2FCAB3D9E60EE02E4D666D56CFA38F8A3B7AA3E0ADBA530DDA9353"); - smartlist_add_linecpy(diff, area, "3c"); - smartlist_add_linecpy(diff, area, "sample"); - smartlist_add_linecpy(diff, area, "."); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_NE, cons2); - tt_str_op( - "network-status-version foo\n" - "r name ccccccccccccccccc etc\nsample\n" - "r name eeeeeeeeeeeeeeeee etc\nbar\n" - "directory-signature foo bar\nbar\n", OP_EQ, - cons2); - tor_free(cons2); - - /* Check that lowercase letters in base16-encoded digests work too. */ - smartlist_clear(diff); - smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); - smartlist_add_linecpy(diff, area, "hash" - /* sha3 of cons1. */ - " 06646d6cf563a41869d3b02e73254372ae3140046c5e7d83c9f71e54976af9b4" - /* sha3 of cons2. */ - " 90a418881b2fcab3d9e60ee02e4d666d56cfa38f8a3b7aa3e0adba530dda9353"); - smartlist_add_linecpy(diff, area, "3c"); - smartlist_add_linecpy(diff, area, "sample"); - smartlist_add_linecpy(diff, area, "."); - cons2 = consdiff_apply_diff(cons1, diff, &digests1); - tt_ptr_op(NULL, OP_NE, cons2); - tt_str_op( - "network-status-version foo\n" - "r name ccccccccccccccccc etc\nsample\n" - "r name eeeeeeeeeeeeeeeee etc\nbar\n" - "directory-signature foo bar\nbar\n", OP_EQ, - cons2); - tor_free(cons2); - - smartlist_clear(diff); - - done: - teardown_capture_of_logs(); - tor_free(cons1_str); - smartlist_free(cons1); - smartlist_free(diff); - memarea_drop_all(area); -} - -#define CONSDIFF_LEGACY(name) \ - { #name, test_consdiff_ ## name , 0, NULL, NULL } - -struct testcase_t consdiff_tests[] = { - CONSDIFF_LEGACY(smartlist_slice), - CONSDIFF_LEGACY(smartlist_slice_string_pos), - CONSDIFF_LEGACY(lcs_lengths), - CONSDIFF_LEGACY(trim_slices), - CONSDIFF_LEGACY(set_changed), - CONSDIFF_LEGACY(calc_changes), - CONSDIFF_LEGACY(get_id_hash), - CONSDIFF_LEGACY(is_valid_router_entry), - CONSDIFF_LEGACY(next_router), - CONSDIFF_LEGACY(base64cmp), - CONSDIFF_LEGACY(gen_ed_diff), - CONSDIFF_LEGACY(apply_ed_diff), - CONSDIFF_LEGACY(gen_diff), - CONSDIFF_LEGACY(apply_diff), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_consdiffmgr.c b/src/tor/src/test/test_consdiffmgr.c deleted file mode 100644 index a9a4b6a98..000000000 --- a/src/tor/src/test/test_consdiffmgr.c +++ /dev/null @@ -1,896 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONSDIFFMGR_PRIVATE - -#include "or.h" -#include "config.h" -#include "conscache.h" -#include "consdiff.h" -#include "consdiffmgr.h" -#include "cpuworker.h" -#include "networkstatus.h" -#include "routerparse.h" -#include "workqueue.h" - -#include "test.h" -#include "log_test_helpers.h" - -// ============================== Setup/teardown the consdiffmgr -// These functions get run before/after each test in this module - -static void * -consdiffmgr_test_setup(const struct testcase_t *arg) -{ - (void)arg; - char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); - tor_free(get_options_mutable()->CacheDirectory); - get_options_mutable()->CacheDirectory = ddir_fname; // now owns the pointer. - check_private_dir(ddir_fname, CPD_CREATE, NULL); - - consdiff_cfg_t consdiff_cfg = { 300 }; - consdiffmgr_configure(&consdiff_cfg); - return (void *)1; // must return something non-null. -} -static int -consdiffmgr_test_teardown(const struct testcase_t *arg, void *ignore) -{ - (void)arg; - (void)ignore; - consdiffmgr_free_all(); - return 1; -} -static struct testcase_setup_t setup_diffmgr = { - consdiffmgr_test_setup, - consdiffmgr_test_teardown -}; - -// ============================== NS faking functions -// These functions are for making quick fake consensus objects and -// strings that are just good enough for consdiff and consdiffmgr. - -static networkstatus_t * -fake_ns_new(consensus_flavor_t flav, time_t valid_after) -{ - networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); - ns->type = NS_TYPE_CONSENSUS; - ns->flavor = flav; - ns->valid_after = valid_after; - return ns; -} - -static char * -fake_ns_body_new(consensus_flavor_t flav, time_t valid_after) -{ - const char *flavor_string = flav == FLAV_NS ? "" : " microdesc"; - char valid_after_string[ISO_TIME_LEN+1]; - - format_iso_time(valid_after_string, valid_after); - char *random_stuff = crypto_random_hostname(3, 25, "junk ", ""); - char *random_stuff2 = crypto_random_hostname(3, 10, "", ""); - - char *consensus; - tor_asprintf(&consensus, - "network-status-version 3%s\n" - "vote-status consensus\n" - "valid-after %s\n" - "r name ccccccccccccccccc etc\nsample\n" - "r name eeeeeeeeeeeeeeeee etc\nbar\n" - "%s\n" - "directory-signature hello-there\n" - "directory-signature %s\n", - flavor_string, - valid_after_string, - random_stuff, - random_stuff2); - tor_free(random_stuff); - tor_free(random_stuff2); - return consensus; -} - -// ============================== Cpuworker mocking code -// These mocking functions and types capture the cpuworker calls -// so we can inspect them and run them in the main thread. -static smartlist_t *fake_cpuworker_queue = NULL; -typedef struct fake_work_queue_ent_t { - enum workqueue_reply_t (*fn)(void *, void *); - void (*reply_fn)(void *); - void *arg; -} fake_work_queue_ent_t; -static struct workqueue_entry_s * -mock_cpuworker_queue_work(workqueue_priority_t prio, - enum workqueue_reply_t (*fn)(void *, void *), - void (*reply_fn)(void *), - void *arg) -{ - (void) prio; - - if (! fake_cpuworker_queue) - fake_cpuworker_queue = smartlist_new(); - - fake_work_queue_ent_t *ent = tor_malloc_zero(sizeof(*ent)); - ent->fn = fn; - ent->reply_fn = reply_fn; - ent->arg = arg; - smartlist_add(fake_cpuworker_queue, ent); - return (struct workqueue_entry_s *)ent; -} -static int -mock_cpuworker_run_work(void) -{ - if (! fake_cpuworker_queue) - return 0; - SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { - enum workqueue_reply_t r = ent->fn(NULL, ent->arg); - if (r != WQ_RPL_REPLY) - return -1; - }); - return 0; -} -static void -mock_cpuworker_handle_replies(void) -{ - if (! fake_cpuworker_queue) - return; - SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { - ent->reply_fn(ent->arg); - tor_free(ent); - }); - smartlist_free(fake_cpuworker_queue); - fake_cpuworker_queue = NULL; -} - -// ============================== Other helpers - -static consdiff_status_t -lookup_diff_from(consensus_cache_entry_t **out, - consensus_flavor_t flav, - const char *str1) -{ - uint8_t digest[DIGEST256_LEN]; - if (router_get_networkstatus_v3_sha3_as_signed(digest, str1)<0) { - TT_FAIL(("Unable to compute sha3-as-signed")); - return CONSDIFF_NOT_FOUND; - } - return consdiffmgr_find_diff_from(out, flav, - DIGEST_SHA3_256, digest, sizeof(digest), - NO_METHOD); -} - -static int -lookup_apply_and_verify_diff(consensus_flavor_t flav, - const char *str1, - const char *str2) -{ - consensus_cache_entry_t *ent = NULL; - consdiff_status_t status = lookup_diff_from(&ent, flav, str1); - if (ent == NULL || status != CONSDIFF_AVAILABLE) { - return -1; - } - - consensus_cache_entry_incref(ent); - size_t size; - char *diff_string = NULL; - int r = uncompress_or_copy(&diff_string, &size, ent); - consensus_cache_entry_decref(ent); - if (diff_string == NULL || r < 0) - return -1; - - char *applied = consensus_diff_apply(str1, diff_string); - tor_free(diff_string); - if (applied == NULL) - return -1; - - int match = !strcmp(applied, str2); - tor_free(applied); - return match ? 0 : -1; -} - -static void -cdm_reload(void) -{ - consdiffmgr_free_all(); - cdm_cache_get(); - consdiffmgr_rescan(); -} - -// ============================== Beginning of tests - -#if 0 -static int got_failure = 0; -static void -got_assertion_failure(void) -{ - ++got_failure; -} - -/* XXXX This test won't work, because there is currently no way to actually - * XXXX capture a real assertion failure. */ -static void -test_consdiffmgr_init_failure(void *arg) -{ - (void)arg; - // Capture assertions and bugs. - - /* As in ...test_setup, but do not create the datadir. The missing directory - * will cause a failure. */ - char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); - tor_free(get_options_mutable()->CacheDirectory); - get_options_mutable()->CacheDirectory = ddir_fname; // now owns the pointer. - - consdiff_cfg_t consdiff_cfg = { 7200, 300 }; - - tor_set_failed_assertion_callback(got_assertion_failure); - tor_capture_bugs_(1); - consdiffmgr_configure(&consdiff_cfg); // This should fail. - tt_int_op(got_failure, OP_EQ, 1); - const smartlist_t *bugs = tor_get_captured_bug_log_(); - tt_int_op(smartlist_len(bugs), OP_EQ, 1); - - done: - tor_end_capture_bugs_(); -} -#endif /* 0 */ - -static void -test_consdiffmgr_sha3_helper(void *arg) -{ - (void) arg; - consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier - config_line_t *lines = NULL; - char *mem_op_hex_tmp = NULL; - config_line_prepend(&lines, "good-sha", - "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DF00D"); - config_line_prepend(&lines, "short-sha", - "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DF0"); - config_line_prepend(&lines, "long-sha", - "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DF00DF00D"); - config_line_prepend(&lines, "not-sha", - "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DXXXX"); - consensus_cache_entry_t *ent = - consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); - - uint8_t buf[DIGEST256_LEN]; - tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, NULL, "good-sha")); - tt_int_op(0, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "good-sha")); - test_memeq_hex(buf, "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DF00D"); - - tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "missing-sha")); - tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "short-sha")); - tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "long-sha")); - tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "not-sha")); - - done: - consensus_cache_entry_decref(ent); - config_free_lines(lines); - tor_free(mem_op_hex_tmp); -} - -static void -test_consdiffmgr_add(void *arg) -{ - (void) arg; - time_t now = approx_time(); - - char *body = NULL; - - consensus_cache_entry_t *ent = NULL; - networkstatus_t *ns_tmp = fake_ns_new(FLAV_NS, now); - const char *dummy = "foo"; - int r = consdiffmgr_add_consensus(dummy, ns_tmp); - tt_int_op(r, OP_EQ, 0); - - /* If we add it again, it won't work */ - setup_capture_of_logs(LOG_INFO); - dummy = "bar"; - r = consdiffmgr_add_consensus(dummy, ns_tmp); - tt_int_op(r, OP_EQ, -1); - expect_single_log_msg_containing("We already have a copy of that " - "consensus"); - mock_clean_saved_logs(); - - /* But it will work fine if the flavor is different */ - dummy = "baz"; - ns_tmp->flavor = FLAV_MICRODESC; - r = consdiffmgr_add_consensus(dummy, ns_tmp); - tt_int_op(r, OP_EQ, 0); - - /* And it will work fine if the time is different */ - dummy = "quux"; - ns_tmp->flavor = FLAV_NS; - ns_tmp->valid_after = now - 60; - r = consdiffmgr_add_consensus(dummy, ns_tmp); - tt_int_op(r, OP_EQ, 0); - - /* If we add one a long long time ago, it will fail. */ - dummy = "xyzzy"; - ns_tmp->valid_after = 86400 * 100; /* A few months into 1970 */ - r = consdiffmgr_add_consensus(dummy, ns_tmp); - tt_int_op(r, OP_EQ, -1); - expect_log_msg_containing("it's too old."); - - /* Try looking up a consensuses. */ - ent = cdm_cache_lookup_consensus(FLAV_NS, now-60); - tt_assert(ent); - consensus_cache_entry_incref(ent); - size_t s; - r = uncompress_or_copy(&body, &s, ent); - tt_int_op(r, OP_EQ, 0); - tt_int_op(s, OP_EQ, 4); - tt_mem_op(body, OP_EQ, "quux", 4); - - /* Try looking up another entry, but fail */ - tt_ptr_op(cdm_cache_lookup_consensus(FLAV_MICRODESC, now - 60), OP_EQ, NULL); - tt_ptr_op(cdm_cache_lookup_consensus(FLAV_NS, now - 61), OP_EQ, NULL); - - done: - networkstatus_vote_free(ns_tmp); - teardown_capture_of_logs(); - consensus_cache_entry_decref(ent); - tor_free(body); -} - -static void -test_consdiffmgr_make_diffs(void *arg) -{ - (void)arg; - networkstatus_t *ns = NULL; - char *ns_body = NULL, *md_ns_body = NULL, *md_ns_body_2 = NULL; - char *applied = NULL, *diff_text = NULL; - time_t now = approx_time(); - int r; - consensus_cache_entry_t *diff = NULL; - uint8_t md_ns_sha3[DIGEST256_LEN]; - consdiff_status_t diff_status; - - MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); - - // Try rescan with no consensuses: shouldn't crash or queue work. - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); - - // Make two consensuses, 1 hour sec ago. - ns = fake_ns_new(FLAV_NS, now-3600); - ns_body = fake_ns_body_new(FLAV_NS, now-3600); - r = consdiffmgr_add_consensus(ns_body, ns); - networkstatus_vote_free(ns); - tor_free(ns_body); - tt_int_op(r, OP_EQ, 0); - - ns = fake_ns_new(FLAV_MICRODESC, now-3600); - md_ns_body = fake_ns_body_new(FLAV_MICRODESC, now-3600); - r = consdiffmgr_add_consensus(md_ns_body, ns); - router_get_networkstatus_v3_sha3_as_signed(md_ns_sha3, md_ns_body); - networkstatus_vote_free(ns); - tt_int_op(r, OP_EQ, 0); - - // No diffs will be generated. - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); - - // Add a MD consensus from 45 minutes ago. This should cause one diff - // worth of work to get queued. - ns = fake_ns_new(FLAV_MICRODESC, now-45*60); - md_ns_body_2 = fake_ns_body_new(FLAV_MICRODESC, now-45*60); - r = consdiffmgr_add_consensus(md_ns_body_2, ns); - networkstatus_vote_free(ns); - tt_int_op(r, OP_EQ, 0); - - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); - diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, - DIGEST_SHA3_256, - md_ns_sha3, DIGEST256_LEN, - NO_METHOD); - tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); - - // Now run that process and get the diff. - r = mock_cpuworker_run_work(); - tt_int_op(r, OP_EQ, 0); - mock_cpuworker_handle_replies(); - - // At this point we should be able to get that diff. - diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, - DIGEST_SHA3_256, - md_ns_sha3, DIGEST256_LEN, - NO_METHOD); - tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, diff_status); - tt_assert(diff); - - /* Make sure applying the diff actually works */ - const uint8_t *diff_body; - size_t diff_size; - r = consensus_cache_entry_get_body(diff, &diff_body, &diff_size); - tt_int_op(r, OP_EQ, 0); - diff_text = tor_memdup_nulterm(diff_body, diff_size); - applied = consensus_diff_apply(md_ns_body, diff_text); - tt_assert(applied); - tt_str_op(applied, OP_EQ, md_ns_body_2); - - /* Rescan again: no more work to do. */ - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); - - done: - tor_free(md_ns_body); - tor_free(md_ns_body_2); - tor_free(diff_text); - tor_free(applied); -} - -static void -test_consdiffmgr_diff_rules(void *arg) -{ - (void)arg; -#define N 6 - char *md_body[N], *ns_body[N]; - networkstatus_t *md_ns[N], *ns_ns[N]; - int i; - - MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); - - /* Create a bunch of consensus things at 15-second intervals. */ - time_t start = approx_time() - 120; - for (i = 0; i < N; ++i) { - time_t when = start + i * 15; - md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); - ns_body[i] = fake_ns_body_new(FLAV_NS, when); - md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); - ns_ns[i] = fake_ns_new(FLAV_NS, when); - } - - /* For the MD consensuses: add 4 of them, and make sure that - * diffs are created to one consensus (the most recent) only. */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[4], md_ns[4])); - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - tt_int_op(3, OP_EQ, smartlist_len(fake_cpuworker_queue)); - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - mock_cpuworker_handle_replies(); - tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); - - /* For the NS consensuses: add 3, generate, and add one older one and - * make sure that older one is the only one whose diff is generated */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[0], ns_ns[0])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[1], ns_ns[1])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[5], ns_ns[5])); - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - mock_cpuworker_handle_replies(); - - /* At this point, we should actually have working diffs! */ - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); - - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); - - /* Self-to-self diff won't be present */ - consensus_cache_entry_t *ent; - tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, - lookup_diff_from(&ent, FLAV_NS, ns_body[5])); - /* No diff from 2 has been added yet */ - tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, - lookup_diff_from(&ent, FLAV_NS, ns_body[2])); - /* No diff arriving at old things. */ - tt_int_op(-1, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); - /* No backwards diff */ - tt_int_op(-1, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[4], md_body[3])); - - /* Now, an update: add number 2 and make sure it's the only one whose diff - * is regenerated. */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[2], ns_ns[2])); - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - mock_cpuworker_handle_replies(); - - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); - - /* Finally: reload, and make sure that the information is still indexed */ - cdm_reload(); - - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); - - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); - - done: - for (i = 0; i < N; ++i) { - tor_free(md_body[i]); - tor_free(ns_body[i]); - networkstatus_vote_free(md_ns[i]); - networkstatus_vote_free(ns_ns[i]); - } - UNMOCK(cpuworker_queue_work); -#undef N -} - -static void -test_consdiffmgr_diff_failure(void *arg) -{ - (void)arg; - MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); - - /* We're going to make sure that if we have a bogus request where - * we can't actually compute a diff, the world must not end. */ - networkstatus_t *ns1 = NULL; - networkstatus_t *ns2 = NULL; - int r; - - ns1 = fake_ns_new(FLAV_NS, approx_time()-100); - ns2 = fake_ns_new(FLAV_NS, approx_time()-50); - r = consdiffmgr_add_consensus("foo bar baz\n", ns1); - tt_int_op(r, OP_EQ, 0); - // We refuse to compute a diff to or from a line holding only a single dot. - // We can add it here, though. - r = consdiffmgr_add_consensus("foo bar baz\n.\n.\n", ns2); - tt_int_op(r, OP_EQ, 0); - - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - setup_capture_of_logs(LOG_WARN); - tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - expect_single_log_msg_containing("one of the lines to be added is \".\"."); - mock_clean_saved_logs(); - mock_cpuworker_handle_replies(); - expect_single_log_msg_containing("Worker was unable to compute consensus " - "diff from "); - - /* Make sure the diff is not present */ - consensus_cache_entry_t *ent; - tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, - lookup_diff_from(&ent, FLAV_NS, "foo bar baz\n")); - - done: - teardown_capture_of_logs(); - UNMOCK(cpuworker_queue_work); - networkstatus_vote_free(ns1); - networkstatus_vote_free(ns2); -} - -static void -test_consdiffmgr_diff_pending(void *arg) -{ -#define N 3 - (void)arg; - char *md_body[N]; - networkstatus_t *md_ns[N]; - time_t start = approx_time() - 120; - int i; - for (i = 0; i < N; ++i) { - time_t when = start + i * 30; - md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); - md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); - } - - MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); - - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); - /* Make a diff */ - consdiffmgr_rescan(); - tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); - - /* Look it up. Is it pending? */ - consensus_cache_entry_t *ent = NULL; - consdiff_status_t diff_status; - diff_status = lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1]); - tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); - tt_ptr_op(ent, OP_EQ, NULL); - - /* Add another old consensus. only one new diff should launch! */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); - consdiffmgr_rescan(); - tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); - - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - mock_cpuworker_handle_replies(); - - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); - - done: - UNMOCK(cpuworker_queue_work); - for (i = 0; i < N; ++i) { - tor_free(md_body[i]); - networkstatus_vote_free(md_ns[i]); - } -#undef N -} - -static void -test_consdiffmgr_cleanup_old(void *arg) -{ - (void)arg; - config_line_t *labels = NULL; - consensus_cache_entry_t *ent = NULL; - consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier - - /* This item will be will be cleanable because it has a valid-after - * time far in the past. */ - config_line_prepend(&labels, "document-type", "confribble-blarg"); - config_line_prepend(&labels, "consensus-valid-after", - "1980-10-10T10:10:10"); - ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); - tt_assert(ent); - consensus_cache_entry_decref(ent); - - setup_capture_of_logs(LOG_DEBUG); - tt_int_op(1, OP_EQ, consdiffmgr_cleanup()); - expect_log_msg_containing("Deleting entry because its consensus-valid-" - "after value (1980-10-10T10:10:10) was too old"); - - done: - teardown_capture_of_logs(); - config_free_lines(labels); -} - -static void -test_consdiffmgr_cleanup_bad_valid_after(void *arg) -{ - /* This will seem cleanable, but isn't, because its valid-after time is - * misformed. */ - - (void)arg; - config_line_t *labels = NULL; - consensus_cache_entry_t *ent = NULL; - consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier - - config_line_prepend(&labels, "document-type", "consensus"); - config_line_prepend(&labels, "consensus-valid-after", - "whan that aprille with his shoures soote"); // (~1385?) - ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); - tt_assert(ent); - consensus_cache_entry_decref(ent); - - setup_capture_of_logs(LOG_DEBUG); - tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); - expect_log_msg_containing("Ignoring entry because its consensus-valid-" - "after value (\"whan that aprille with his " - "shoures soote\") was unparseable"); - - done: - teardown_capture_of_logs(); - config_free_lines(labels); -} - -static void -test_consdiffmgr_cleanup_no_valid_after(void *arg) -{ - (void)arg; - config_line_t *labels = NULL; - consensus_cache_entry_t *ent = NULL; - consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier - - /* This item will be will be uncleanable because it has no recognized - * valid-after. */ - config_line_prepend(&labels, "document-type", "consensus"); - config_line_prepend(&labels, "confrooble-voolid-oofter", - "2010-10-10T09:08:07"); - ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); - tt_assert(ent); - consensus_cache_entry_decref(ent); - - setup_capture_of_logs(LOG_DEBUG); - tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); - expect_log_msg_containing("Ignoring entry because it had no consensus-" - "valid-after label"); - - done: - teardown_capture_of_logs(); - config_free_lines(labels); -} - -static void -test_consdiffmgr_cleanup_old_diffs(void *arg) -{ - (void)arg; -#define N 4 - char *md_body[N]; - networkstatus_t *md_ns[N]; - int i; - consensus_cache_entry_t *hold_ent = NULL, *ent; - - /* Make sure that the cleanup function removes diffs to the not-most-recent - * consensus. */ - - MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); - - /* Create a bunch of consensus things at 15-second intervals. */ - time_t start = approx_time() - 120; - for (i = 0; i < N; ++i) { - time_t when = start + i * 15; - md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); - md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); - } - - /* add the first 3. */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); - /* Make diffs. */ - consdiffmgr_rescan(); - tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); - tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); - tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); - mock_cpuworker_handle_replies(); - tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); - - /* Nothing is deletable now */ - tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); - tt_int_op(0, OP_EQ, - lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); - - tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, - lookup_diff_from(&hold_ent, FLAV_MICRODESC, md_body[1])); - consensus_cache_entry_incref(hold_ent); // incref, so it is preserved. - - /* Now add an even-more-recent consensus; this should make all previous - * diffs deletable, and make delete */ - tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); - tt_int_op(2 * n_diff_compression_methods() + - (n_consensus_compression_methods() - 1) , OP_EQ, - consdiffmgr_cleanup()); - - tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); - /* This one is marked deletable but still in the hashtable */ - tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); - tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); - - /* Everything should be valid at this point */ - tt_int_op(0, OP_EQ, consdiffmgr_validate()); - - /* And if we recan NOW, we'll purge the hashtable of the entries, - * and launch attempts to generate new ones */ - consdiffmgr_rescan(); - tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); - tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); - tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, - lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); - - /* We're still holding on to this, though, so we can still map it! */ - const uint8_t *t1 = NULL; - size_t s; - int r = consensus_cache_entry_get_body(hold_ent, &t1, &s); - tt_int_op(r, OP_EQ, 0); - tt_assert(t1); - - done: - for (i = 0; i < N; ++i) { - tor_free(md_body[i]); - networkstatus_vote_free(md_ns[i]); - } - consensus_cache_entry_decref(hold_ent); - UNMOCK(cpuworker_queue_work); -#undef N -} - -static void -test_consdiffmgr_validate(void *arg) -{ - (void)arg; - config_line_t *lines = NULL; - consensus_cache_entry_t *ent = NULL; - consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier - smartlist_t *vals = smartlist_new(); - - /* Put these: objects in the cache: one with a good sha3, one with bad sha3, - * one with a wrong sha3, and one with no sha3. */ - config_line_prepend(&lines, "id", "wrong sha3"); - config_line_prepend(&lines, "sha3-digest", - "F00DF00DF00DF00DF00DF00DF00DF00D" - "F00DF00DF00DF00DF00DF00DF00DF00D"); - ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); - consensus_cache_entry_decref(ent); - config_free_lines(lines); - lines = NULL; - - config_line_prepend(&lines, "id", "bad sha3"); - config_line_prepend(&lines, "sha3-digest", - "now is the winter of our dicotheque"); - ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); - consensus_cache_entry_decref(ent); - config_free_lines(lines); - lines = NULL; - - config_line_prepend(&lines, "id", "no sha3"); - ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); - consensus_cache_entry_decref(ent); - config_free_lines(lines); - lines = NULL; - - config_line_prepend(&lines, "id", "good sha3"); - config_line_prepend(&lines, "sha3-digest", - "8d8b1998616cd6b4c4055da8d38728dc" - "93c758d4131a53c7d81aa6337dee1c05"); - ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); - consensus_cache_entry_decref(ent); - config_free_lines(lines); - lines = NULL; - - cdm_reload(); - cache = cdm_cache_get(); - tt_int_op(1, OP_EQ, consdiffmgr_validate()); - - consensus_cache_find_all(vals, cache, "id", "good sha3"); - tt_int_op(smartlist_len(vals), OP_EQ, 1); - smartlist_clear(vals); - - consensus_cache_find_all(vals, cache, "id", "no sha3"); - tt_int_op(smartlist_len(vals), OP_EQ, 1); - smartlist_clear(vals); - - consensus_cache_find_all(vals, cache, "id", "wrong sha3"); - tt_int_op(smartlist_len(vals), OP_EQ, 0); - consensus_cache_find_all(vals, cache, "id", "bad sha3"); - tt_int_op(smartlist_len(vals), OP_EQ, 0); - - done: - smartlist_free(vals); -} - -#define TEST(name) \ - { #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL } - -struct testcase_t consdiffmgr_tests[] = { -#if 0 - { "init_failure", test_consdiffmgr_init_failure, TT_FORK, NULL, NULL }, -#endif - TEST(sha3_helper), - TEST(add), - TEST(make_diffs), - TEST(diff_rules), - TEST(diff_failure), - TEST(diff_pending), - TEST(cleanup_old), - TEST(cleanup_bad_valid_after), - TEST(cleanup_no_valid_after), - TEST(cleanup_old_diffs), - TEST(validate), - - // XXXX Test: non-cacheing cases of replyfn(). - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_containers.c b/src/tor/src/test/test_containers.c deleted file mode 100644 index c4dba7375..000000000 --- a/src/tor/src/test/test_containers.c +++ /dev/null @@ -1,1297 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" -#include "fp_pair.h" -#include "test.h" - -/** Helper: return a tristate based on comparing the strings in *a and - * *b. */ -static int -compare_strs_(const void **a, const void **b) -{ - const char *s1 = *a, *s2 = *b; - return strcmp(s1, s2); -} - -/** Helper: return a tristate based on comparing the strings in a and - * *b. */ -static int -compare_strs_for_bsearch_(const void *a, const void **b) -{ - const char *s1 = a, *s2 = *b; - return strcmp(s1, s2); -} - -/** Helper: return a tristate based on comparing the strings in *a and - * *b, excluding a's first character, and ignoring case. */ -static int -cmp_without_first_(const void *a, const void **b) -{ - const char *s1 = a, *s2 = *b; - return strcasecmp(s1+1, s2); -} - -/** Run unit tests for basic dynamic-sized array functionality. */ -static void -test_container_smartlist_basic(void *arg) -{ - smartlist_t *sl; - char *v0 = tor_strdup("v0"); - char *v1 = tor_strdup("v1"); - char *v2 = tor_strdup("v2"); - char *v3 = tor_strdup("v3"); - char *v4 = tor_strdup("v4"); - char *v22 = tor_strdup("v22"); - char *v99 = tor_strdup("v99"); - char *v555 = tor_strdup("v555"); - - /* XXXX test sort_digests, uniq_strings, uniq_digests */ - - /* Test smartlist add, del_keeporder, insert, get. */ - (void)arg; - sl = smartlist_new(); - smartlist_add(sl, v1); - smartlist_add(sl, v2); - smartlist_add(sl, v3); - smartlist_add(sl, v4); - smartlist_del_keeporder(sl, 1); - smartlist_insert(sl, 1, v22); - smartlist_insert(sl, 0, v0); - smartlist_insert(sl, 5, v555); - tt_ptr_op(v0,OP_EQ, smartlist_get(sl,0)); - tt_ptr_op(v1,OP_EQ, smartlist_get(sl,1)); - tt_ptr_op(v22,OP_EQ, smartlist_get(sl,2)); - tt_ptr_op(v3,OP_EQ, smartlist_get(sl,3)); - tt_ptr_op(v4,OP_EQ, smartlist_get(sl,4)); - tt_ptr_op(v555,OP_EQ, smartlist_get(sl,5)); - /* Try deleting in the middle. */ - smartlist_del(sl, 1); - tt_ptr_op(v555,OP_EQ, smartlist_get(sl, 1)); - /* Try deleting at the end. */ - smartlist_del(sl, 4); - tt_int_op(4,OP_EQ, smartlist_len(sl)); - - /* test isin. */ - tt_assert(smartlist_contains(sl, v3)); - tt_assert(!smartlist_contains(sl, v99)); - - done: - smartlist_free(sl); - tor_free(v0); - tor_free(v1); - tor_free(v2); - tor_free(v3); - tor_free(v4); - tor_free(v22); - tor_free(v99); - tor_free(v555); -} - -/** Run unit tests for smartlist-of-strings functionality. */ -static void -test_container_smartlist_strings(void *arg) -{ - smartlist_t *sl = smartlist_new(); - char *cp=NULL, *cp_alloc=NULL; - size_t sz; - - /* Test split and join */ - (void)arg; - tt_int_op(0,OP_EQ, smartlist_len(sl)); - smartlist_split_string(sl, "abc", ":", 0, 0); - tt_int_op(1,OP_EQ, smartlist_len(sl)); - tt_str_op("abc",OP_EQ, smartlist_get(sl, 0)); - smartlist_split_string(sl, "a::bc::", "::", 0, 0); - tt_int_op(4,OP_EQ, smartlist_len(sl)); - tt_str_op("a",OP_EQ, smartlist_get(sl, 1)); - tt_str_op("bc",OP_EQ, smartlist_get(sl, 2)); - tt_str_op("",OP_EQ, smartlist_get(sl, 3)); - cp_alloc = smartlist_join_strings(sl, "", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "abcabc"); - tor_free(cp_alloc); - cp_alloc = smartlist_join_strings(sl, "!", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "abc!a!bc!"); - tor_free(cp_alloc); - cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXY"); - tor_free(cp_alloc); - cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); - tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXYXY"); - tor_free(cp_alloc); - cp_alloc = smartlist_join_strings(sl, "", 1, NULL); - tt_str_op(cp_alloc,OP_EQ, "abcabc"); - tor_free(cp_alloc); - - smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0); - tt_int_op(8,OP_EQ, smartlist_len(sl)); - tt_str_op("",OP_EQ, smartlist_get(sl, 4)); - tt_str_op("def",OP_EQ, smartlist_get(sl, 5)); - tt_str_op(" ",OP_EQ, smartlist_get(sl, 6)); - tt_str_op("ghijk",OP_EQ, smartlist_get(sl, 7)); - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0); - tt_int_op(3,OP_EQ, smartlist_len(sl)); - tt_str_op("a",OP_EQ, smartlist_get(sl,0)); - tt_str_op("bbd",OP_EQ, smartlist_get(sl,1)); - tt_str_op("cdef",OP_EQ, smartlist_get(sl,2)); - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE, 0); - tt_int_op(8,OP_EQ, smartlist_len(sl)); - tt_str_op("z",OP_EQ, smartlist_get(sl,3)); - tt_str_op("zhasd",OP_EQ, smartlist_get(sl,4)); - tt_str_op("",OP_EQ, smartlist_get(sl,5)); - tt_str_op("bnud",OP_EQ, smartlist_get(sl,6)); - tt_str_op("",OP_EQ, smartlist_get(sl,7)); - - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - smartlist_split_string(sl, " ab\tc \td ef ", NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(4,OP_EQ, smartlist_len(sl)); - tt_str_op("ab",OP_EQ, smartlist_get(sl,0)); - tt_str_op("c",OP_EQ, smartlist_get(sl,1)); - tt_str_op("d",OP_EQ, smartlist_get(sl,2)); - tt_str_op("ef",OP_EQ, smartlist_get(sl,3)); - smartlist_split_string(sl, "ghi\tj", NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(6,OP_EQ, smartlist_len(sl)); - tt_str_op("ghi",OP_EQ, smartlist_get(sl,4)); - tt_str_op("j",OP_EQ, smartlist_get(sl,5)); - - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, ""); - tor_free(cp_alloc); - cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); - tt_str_op(cp_alloc,OP_EQ, "XY"); - tor_free(cp_alloc); - - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(3,OP_EQ, smartlist_len(sl)); - tt_str_op("z",OP_EQ, smartlist_get(sl, 0)); - tt_str_op("zhasd",OP_EQ, smartlist_get(sl, 1)); - tt_str_op("bnud",OP_EQ, smartlist_get(sl, 2)); - smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - tt_int_op(5,OP_EQ, smartlist_len(sl)); - tt_str_op("z",OP_EQ, smartlist_get(sl, 3)); - tt_str_op("zhasd <> <> bnud<>",OP_EQ, smartlist_get(sl, 4)); - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - smartlist_split_string(sl, "abcd\n", "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(1,OP_EQ, smartlist_len(sl)); - tt_str_op("abcd",OP_EQ, smartlist_get(sl, 0)); - smartlist_split_string(sl, "efgh", "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(2,OP_EQ, smartlist_len(sl)); - tt_str_op("efgh",OP_EQ, smartlist_get(sl, 1)); - - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - /* Test swapping, shuffling, and sorting. */ - smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0); - tt_int_op(7,OP_EQ, smartlist_len(sl)); - smartlist_sort(sl, compare_strs_); - cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "and,arma,by,nickm,onion,router,the"); - tor_free(cp_alloc); - smartlist_swap(sl, 1, 5); - cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "and,router,by,nickm,onion,arma,the"); - tor_free(cp_alloc); - smartlist_shuffle(sl); - tt_int_op(7,OP_EQ, smartlist_len(sl)); - tt_assert(smartlist_contains_string(sl, "and")); - tt_assert(smartlist_contains_string(sl, "router")); - tt_assert(smartlist_contains_string(sl, "by")); - tt_assert(smartlist_contains_string(sl, "nickm")); - tt_assert(smartlist_contains_string(sl, "onion")); - tt_assert(smartlist_contains_string(sl, "arma")); - tt_assert(smartlist_contains_string(sl, "the")); - - /* Test bsearch. */ - smartlist_sort(sl, compare_strs_); - tt_str_op("nickm",OP_EQ, smartlist_bsearch(sl, "zNicKM", - cmp_without_first_)); - tt_str_op("and",OP_EQ, - smartlist_bsearch(sl, " AND", cmp_without_first_)); - tt_ptr_op(NULL,OP_EQ, smartlist_bsearch(sl, " ANz", cmp_without_first_)); - - /* Test bsearch_idx */ - { - int f; - smartlist_t *tmp = NULL; - - tt_int_op(0,OP_EQ,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 0); - tt_int_op(0,OP_EQ, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 1); - tt_int_op(1,OP_EQ, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 0); - tt_int_op(1,OP_EQ, - smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 1); - tt_int_op(2,OP_EQ, - smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 0); - tt_int_op(7,OP_EQ, - smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f)); - tt_int_op(f,OP_EQ, 0); - - /* Test trivial cases for list of length 0 or 1 */ - tmp = smartlist_new(); - tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "foo", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 0); - smartlist_insert(tmp, 0, (void *)("bar")); - tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 0); - tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "aaa", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 0); - tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "bar", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 1); - /* ... and one for length 2 */ - smartlist_insert(tmp, 1, (void *)("foo")); - tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 1); - tt_int_op(2,OP_EQ, smartlist_bsearch_idx(tmp, "goo", - compare_strs_for_bsearch_, &f)); - tt_int_op(f,OP_EQ, 0); - smartlist_free(tmp); - } - - /* Test reverse() and pop_last() */ - smartlist_reverse(sl); - cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "the,router,onion,nickm,by,arma,and"); - tor_free(cp_alloc); - cp_alloc = smartlist_pop_last(sl); - tt_str_op(cp_alloc,OP_EQ, "and"); - tor_free(cp_alloc); - tt_int_op(smartlist_len(sl),OP_EQ, 6); - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - cp_alloc = smartlist_pop_last(sl); - tt_ptr_op(cp_alloc,OP_EQ, NULL); - - /* Test uniq() */ - smartlist_split_string(sl, - "50,noon,radar,a,man,a,plan,a,canal,panama,radar,noon,50", - ",", 0, 0); - smartlist_sort(sl, compare_strs_); - smartlist_uniq(sl, compare_strs_, tor_free_); - cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "50,a,canal,man,noon,panama,plan,radar"); - tor_free(cp_alloc); - - /* Test contains_string, contains_string_case and contains_int_as_string */ - tt_assert(smartlist_contains_string(sl, "noon")); - tt_assert(!smartlist_contains_string(sl, "noonoon")); - tt_assert(smartlist_contains_string_case(sl, "nOOn")); - tt_assert(!smartlist_contains_string_case(sl, "nooNooN")); - tt_assert(smartlist_contains_int_as_string(sl, 50)); - tt_assert(!smartlist_contains_int_as_string(sl, 60)); - - /* Test smartlist_choose */ - { - int i; - int allsame = 1; - int allin = 1; - void *first = smartlist_choose(sl); - tt_assert(smartlist_contains(sl, first)); - for (i = 0; i < 100; ++i) { - void *second = smartlist_choose(sl); - if (second != first) - allsame = 0; - if (!smartlist_contains(sl, second)) - allin = 0; - } - tt_assert(!allsame); - tt_assert(allin); - } - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_clear(sl); - - /* Test string_remove and remove and join_strings2 */ - smartlist_split_string(sl, - "Some say the Earth will end in ice and some in fire", - " ", 0, 0); - cp = smartlist_get(sl, 4); - tt_str_op(cp,OP_EQ, "will"); - smartlist_add(sl, cp); - smartlist_remove(sl, cp); - tor_free(cp); - cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,OP_EQ, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); - tor_free(cp_alloc); - smartlist_string_remove(sl, "in"); - cp_alloc = smartlist_join_strings2(sl, "+XX", 1, 0, &sz); - tt_str_op(cp_alloc,OP_EQ, "Some+say+the+Earth+fire+end+some+ice+and"); - tt_int_op((int)sz,OP_EQ, 40); - - done: - - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); - tor_free(cp_alloc); -} - -/** Run unit tests for smartlist set manipulation functions. */ -static void -test_container_smartlist_overlap(void *arg) -{ - smartlist_t *sl = smartlist_new(); - smartlist_t *ints = smartlist_new(); - smartlist_t *odds = smartlist_new(); - smartlist_t *evens = smartlist_new(); - smartlist_t *primes = smartlist_new(); - int i; - (void)arg; - for (i=1; i < 10; i += 2) - smartlist_add(odds, (void*)(uintptr_t)i); - for (i=0; i < 10; i += 2) - smartlist_add(evens, (void*)(uintptr_t)i); - - /* add_all */ - smartlist_add_all(ints, odds); - smartlist_add_all(ints, evens); - tt_int_op(smartlist_len(ints),OP_EQ, 10); - - smartlist_add(primes, (void*)2); - smartlist_add(primes, (void*)3); - smartlist_add(primes, (void*)5); - smartlist_add(primes, (void*)7); - - /* overlap */ - tt_assert(smartlist_overlap(ints, odds)); - tt_assert(smartlist_overlap(odds, primes)); - tt_assert(smartlist_overlap(evens, primes)); - tt_assert(!smartlist_overlap(odds, evens)); - - /* intersect */ - smartlist_add_all(sl, odds); - smartlist_intersect(sl, primes); - tt_int_op(smartlist_len(sl),OP_EQ, 3); - tt_assert(smartlist_contains(sl, (void*)3)); - tt_assert(smartlist_contains(sl, (void*)5)); - tt_assert(smartlist_contains(sl, (void*)7)); - - /* subtract */ - smartlist_add_all(sl, primes); - smartlist_subtract(sl, odds); - tt_int_op(smartlist_len(sl),OP_EQ, 1); - tt_assert(smartlist_contains(sl, (void*)2)); - - done: - smartlist_free(odds); - smartlist_free(evens); - smartlist_free(ints); - smartlist_free(primes); - smartlist_free(sl); -} - -/** Run unit tests for smartlist-of-digests functions. */ -static void -test_container_smartlist_digests(void *arg) -{ - smartlist_t *sl = smartlist_new(); - - /* contains_digest */ - (void)arg; - smartlist_add(sl, tor_memdup("AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN)); - smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); - smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); - tt_int_op(0,OP_EQ, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA")); - tt_assert(smartlist_contains_digest(sl, "AAAAAAAAAAAAAAAAAAAA")); - tt_assert(smartlist_contains_digest(sl, "\00090AAB2AAAAaasdAAAAA")); - tt_int_op(0,OP_EQ, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA")); - - /* sort digests */ - smartlist_sort_digests(sl); - tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 1),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 2),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); - tt_int_op(3,OP_EQ, smartlist_len(sl)); - - /* uniq_digests */ - smartlist_uniq_digests(sl); - tt_int_op(2,OP_EQ, smartlist_len(sl)); - tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 1),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); - - done: - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); -} - -/** Run unit tests for concatenate-a-smartlist-of-strings functions. */ -static void -test_container_smartlist_join(void *arg) -{ - smartlist_t *sl = smartlist_new(); - smartlist_t *sl2 = smartlist_new(), *sl3 = smartlist_new(), - *sl4 = smartlist_new(); - char *joined=NULL; - /* unique, sorted. */ - (void)arg; - smartlist_split_string(sl, - "Abashments Ambush Anchorman Bacon Banks Borscht " - "Bunks Inhumane Insurance Knish Know Manners " - "Maraschinos Stamina Sunbonnets Unicorns Wombats", - " ", 0, 0); - /* non-unique, sorted. */ - smartlist_split_string(sl2, - "Ambush Anchorman Anchorman Anemias Anemias Bacon " - "Crossbowmen Inhumane Insurance Knish Know Manners " - "Manners Maraschinos Wombats Wombats Work", - " ", 0, 0); - SMARTLIST_FOREACH_JOIN(sl, char *, cp1, - sl2, char *, cp2, - strcmp(cp1,cp2), - smartlist_add(sl3, cp2)) { - tt_str_op(cp1,OP_EQ, cp2); - smartlist_add(sl4, cp1); - } SMARTLIST_FOREACH_JOIN_END(cp1, cp2); - - SMARTLIST_FOREACH(sl3, const char *, cp, - tt_assert(smartlist_contains(sl2, cp) && - !smartlist_contains_string(sl, cp))); - SMARTLIST_FOREACH(sl4, const char *, cp, - tt_assert(smartlist_contains(sl, cp) && - smartlist_contains_string(sl2, cp))); - joined = smartlist_join_strings(sl3, ",", 0, NULL); - tt_str_op(joined,OP_EQ, "Anemias,Anemias,Crossbowmen,Work"); - tor_free(joined); - joined = smartlist_join_strings(sl4, ",", 0, NULL); - tt_str_op(joined,OP_EQ, - "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance," - "Knish,Know,Manners,Manners,Maraschinos,Wombats,Wombats"); - tor_free(joined); - - done: - smartlist_free(sl4); - smartlist_free(sl3); - SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); - smartlist_free(sl2); - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); - tor_free(joined); -} - -static void -test_container_smartlist_pos(void *arg) -{ - (void) arg; - smartlist_t *sl = smartlist_new(); - - smartlist_add_strdup(sl, "This"); - smartlist_add_strdup(sl, "is"); - smartlist_add_strdup(sl, "a"); - smartlist_add_strdup(sl, "test"); - smartlist_add_strdup(sl, "for"); - smartlist_add_strdup(sl, "a"); - smartlist_add_strdup(sl, "function"); - - /* Test string_pos */ - tt_int_op(smartlist_string_pos(NULL, "Fred"), OP_EQ, -1); - tt_int_op(smartlist_string_pos(sl, "Fred"), OP_EQ, -1); - tt_int_op(smartlist_string_pos(sl, "This"), OP_EQ, 0); - tt_int_op(smartlist_string_pos(sl, "a"), OP_EQ, 2); - tt_int_op(smartlist_string_pos(sl, "function"), OP_EQ, 6); - - /* Test pos */ - tt_int_op(smartlist_pos(NULL, "Fred"), OP_EQ, -1); - tt_int_op(smartlist_pos(sl, "Fred"), OP_EQ, -1); - tt_int_op(smartlist_pos(sl, "This"), OP_EQ, -1); - tt_int_op(smartlist_pos(sl, "a"), OP_EQ, -1); - tt_int_op(smartlist_pos(sl, "function"), OP_EQ, -1); - tt_int_op(smartlist_pos(sl, smartlist_get(sl,0)), OP_EQ, 0); - tt_int_op(smartlist_pos(sl, smartlist_get(sl,2)), OP_EQ, 2); - tt_int_op(smartlist_pos(sl, smartlist_get(sl,5)), OP_EQ, 5); - tt_int_op(smartlist_pos(sl, smartlist_get(sl,6)), OP_EQ, 6); - - done: - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); -} - -static void -test_container_smartlist_ints_eq(void *arg) -{ - smartlist_t *sl1 = NULL, *sl2 = NULL; - int x; - (void)arg; - - tt_assert(smartlist_ints_eq(NULL, NULL)); - - sl1 = smartlist_new(); - tt_assert(!smartlist_ints_eq(sl1, NULL)); - tt_assert(!smartlist_ints_eq(NULL, sl1)); - - sl2 = smartlist_new(); - tt_assert(smartlist_ints_eq(sl1, sl2)); - - x = 5; - smartlist_add(sl1, tor_memdup(&x, sizeof(int))); - smartlist_add(sl2, tor_memdup(&x, sizeof(int))); - x = 90; - smartlist_add(sl1, tor_memdup(&x, sizeof(int))); - smartlist_add(sl2, tor_memdup(&x, sizeof(int))); - tt_assert(smartlist_ints_eq(sl1, sl2)); - - x = -50; - smartlist_add(sl1, tor_memdup(&x, sizeof(int))); - tt_assert(! smartlist_ints_eq(sl1, sl2)); - tt_assert(! smartlist_ints_eq(sl2, sl1)); - smartlist_add(sl2, tor_memdup(&x, sizeof(int))); - tt_assert(smartlist_ints_eq(sl1, sl2)); - - *(int*)smartlist_get(sl1, 1) = 101010; - tt_assert(! smartlist_ints_eq(sl2, sl1)); - *(int*)smartlist_get(sl2, 1) = 101010; - tt_assert(smartlist_ints_eq(sl1, sl2)); - - done: - if (sl1) - SMARTLIST_FOREACH(sl1, int *, ip, tor_free(ip)); - if (sl2) - SMARTLIST_FOREACH(sl2, int *, ip, tor_free(ip)); - smartlist_free(sl1); - smartlist_free(sl2); -} - -/** Run unit tests for bitarray code */ -static void -test_container_bitarray(void *arg) -{ - bitarray_t *ba = NULL; - int i, j, ok=1; - - (void)arg; - ba = bitarray_init_zero(1); - tt_assert(ba); - tt_assert(! bitarray_is_set(ba, 0)); - bitarray_set(ba, 0); - tt_assert(bitarray_is_set(ba, 0)); - bitarray_clear(ba, 0); - tt_assert(! bitarray_is_set(ba, 0)); - bitarray_free(ba); - - ba = bitarray_init_zero(1023); - for (i = 1; i < 64; ) { - for (j = 0; j < 1023; ++j) { - if (j % i) - bitarray_set(ba, j); - else - bitarray_clear(ba, j); - } - for (j = 0; j < 1023; ++j) { - if (!bool_eq(bitarray_is_set(ba, j), j%i)) - ok = 0; - } - tt_assert(ok); - if (i < 7) - ++i; - else if (i == 28) - i = 32; - else - i += 7; - } - - done: - if (ba) - bitarray_free(ba); -} - -/** Run unit tests for digest set code (implemented as a hashtable or as a - * bloom filter) */ -static void -test_container_digestset(void *arg) -{ - smartlist_t *included = smartlist_new(); - char d[DIGEST_LEN]; - int i; - int ok = 1; - int false_positives = 0; - digestset_t *set = NULL; - - (void)arg; - for (i = 0; i < 1000; ++i) { - crypto_rand(d, DIGEST_LEN); - smartlist_add(included, tor_memdup(d, DIGEST_LEN)); - } - set = digestset_new(1000); - SMARTLIST_FOREACH(included, const char *, cp, - if (digestset_contains(set, cp)) - ok = 0); - tt_assert(ok); - SMARTLIST_FOREACH(included, const char *, cp, - digestset_add(set, cp)); - SMARTLIST_FOREACH(included, const char *, cp, - if (!digestset_contains(set, cp)) - ok = 0); - tt_assert(ok); - for (i = 0; i < 1000; ++i) { - crypto_rand(d, DIGEST_LEN); - if (digestset_contains(set, d)) - ++false_positives; - } - tt_int_op(50, OP_GT, false_positives); /* Should be far lower. */ - - done: - if (set) - digestset_free(set); - SMARTLIST_FOREACH(included, char *, cp, tor_free(cp)); - smartlist_free(included); -} - -typedef struct pq_entry_t { - const char *val; - int idx; -} pq_entry_t; - -/** Helper: return a tristate based on comparing two pq_entry_t values. */ -static int -compare_strings_for_pqueue_(const void *p1, const void *p2) -{ - const pq_entry_t *e1=p1, *e2=p2; - return strcmp(e1->val, e2->val); -} - -/** Run unit tests for heap-based priority queue functions. */ -static void -test_container_pqueue(void *arg) -{ - smartlist_t *sl = smartlist_new(); - int (*cmp)(const void *, const void*); - const int offset = offsetof(pq_entry_t, idx); -#define ENTRY(s) pq_entry_t s = { #s, -1 } - ENTRY(cows); - ENTRY(zebras); - ENTRY(fish); - ENTRY(frogs); - ENTRY(apples); - ENTRY(squid); - ENTRY(daschunds); - ENTRY(eggplants); - ENTRY(weissbier); - ENTRY(lobsters); - ENTRY(roquefort); - ENTRY(chinchillas); - ENTRY(fireflies); - -#define OK() smartlist_pqueue_assert_ok(sl, cmp, offset) - - (void)arg; - - cmp = compare_strings_for_pqueue_; - smartlist_pqueue_add(sl, cmp, offset, &cows); - smartlist_pqueue_add(sl, cmp, offset, &zebras); - smartlist_pqueue_add(sl, cmp, offset, &fish); - smartlist_pqueue_add(sl, cmp, offset, &frogs); - smartlist_pqueue_add(sl, cmp, offset, &apples); - smartlist_pqueue_add(sl, cmp, offset, &squid); - smartlist_pqueue_add(sl, cmp, offset, &daschunds); - smartlist_pqueue_add(sl, cmp, offset, &eggplants); - smartlist_pqueue_add(sl, cmp, offset, &weissbier); - smartlist_pqueue_add(sl, cmp, offset, &lobsters); - smartlist_pqueue_add(sl, cmp, offset, &roquefort); - - OK(); - - tt_int_op(smartlist_len(sl),OP_EQ, 11); - tt_ptr_op(smartlist_get(sl, 0),OP_EQ, &apples); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &apples); - tt_int_op(smartlist_len(sl),OP_EQ, 10); - OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &cows); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &daschunds); - smartlist_pqueue_add(sl, cmp, offset, &chinchillas); - OK(); - smartlist_pqueue_add(sl, cmp, offset, &fireflies); - OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &chinchillas); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &eggplants); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fireflies); - OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &lobsters); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &roquefort); - OK(); - tt_int_op(smartlist_len(sl),OP_EQ, 3); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &weissbier); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &zebras); - tt_int_op(smartlist_len(sl),OP_EQ, 0); - OK(); - - /* Now test remove. */ - smartlist_pqueue_add(sl, cmp, offset, &cows); - smartlist_pqueue_add(sl, cmp, offset, &fish); - smartlist_pqueue_add(sl, cmp, offset, &frogs); - smartlist_pqueue_add(sl, cmp, offset, &apples); - smartlist_pqueue_add(sl, cmp, offset, &squid); - smartlist_pqueue_add(sl, cmp, offset, &zebras); - tt_int_op(smartlist_len(sl),OP_EQ, 6); - OK(); - smartlist_pqueue_remove(sl, cmp, offset, &zebras); - tt_int_op(smartlist_len(sl),OP_EQ, 5); - OK(); - smartlist_pqueue_remove(sl, cmp, offset, &cows); - tt_int_op(smartlist_len(sl),OP_EQ, 4); - OK(); - smartlist_pqueue_remove(sl, cmp, offset, &apples); - tt_int_op(smartlist_len(sl),OP_EQ, 3); - OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); - tt_int_op(smartlist_len(sl),OP_EQ, 0); - OK(); - -#undef OK - - done: - - smartlist_free(sl); -} - -/** Run unit tests for string-to-void* map functions */ -static void -test_container_strmap(void *arg) -{ - strmap_t *map; - strmap_iter_t *iter; - const char *k; - void *v; - char *visited = NULL; - smartlist_t *found_keys = NULL; - char *v1 = tor_strdup("v1"); - char *v99 = tor_strdup("v99"); - char *v100 = tor_strdup("v100"); - char *v101 = tor_strdup("v101"); - char *v102 = tor_strdup("v102"); - char *v103 = tor_strdup("v103"); - char *v104 = tor_strdup("v104"); - char *v105 = tor_strdup("v105"); - - (void)arg; - map = strmap_new(); - tt_assert(map); - tt_int_op(strmap_size(map),OP_EQ, 0); - tt_assert(strmap_isempty(map)); - v = strmap_set(map, "K1", v99); - tt_ptr_op(v,OP_EQ, NULL); - tt_assert(!strmap_isempty(map)); - v = strmap_set(map, "K2", v101); - tt_ptr_op(v,OP_EQ, NULL); - v = strmap_set(map, "K1", v100); - tt_ptr_op(v,OP_EQ, v99); - tt_ptr_op(strmap_get(map,"K1"),OP_EQ, v100); - tt_ptr_op(strmap_get(map,"K2"),OP_EQ, v101); - tt_ptr_op(strmap_get(map,"K-not-there"),OP_EQ, NULL); - strmap_assert_ok(map); - - v = strmap_remove(map,"K2"); - strmap_assert_ok(map); - tt_ptr_op(v,OP_EQ, v101); - tt_ptr_op(strmap_get(map,"K2"),OP_EQ, NULL); - tt_ptr_op(strmap_remove(map,"K2"),OP_EQ, NULL); - - strmap_set(map, "K2", v101); - strmap_set(map, "K3", v102); - strmap_set(map, "K4", v103); - tt_int_op(strmap_size(map),OP_EQ, 4); - strmap_assert_ok(map); - strmap_set(map, "K5", v104); - strmap_set(map, "K6", v105); - strmap_assert_ok(map); - - /* Test iterator. */ - iter = strmap_iter_init(map); - found_keys = smartlist_new(); - while (!strmap_iter_done(iter)) { - strmap_iter_get(iter,&k,&v); - smartlist_add_strdup(found_keys, k); - tt_ptr_op(v,OP_EQ, strmap_get(map, k)); - - if (!strcmp(k, "K2")) { - iter = strmap_iter_next_rmv(map,iter); - } else { - iter = strmap_iter_next(map,iter); - } - } - - /* Make sure we removed K2, but not the others. */ - tt_ptr_op(strmap_get(map, "K2"),OP_EQ, NULL); - tt_ptr_op(strmap_get(map, "K5"),OP_EQ, v104); - /* Make sure we visited everyone once */ - smartlist_sort_strings(found_keys); - visited = smartlist_join_strings(found_keys, ":", 0, NULL); - tt_str_op(visited,OP_EQ, "K1:K2:K3:K4:K5:K6"); - - strmap_assert_ok(map); - /* Clean up after ourselves. */ - strmap_free(map, NULL); - map = NULL; - - /* Now try some lc functions. */ - map = strmap_new(); - strmap_set_lc(map,"Ab.C", v1); - tt_ptr_op(strmap_get(map,"ab.c"),OP_EQ, v1); - strmap_assert_ok(map); - tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, v1); - tt_ptr_op(strmap_get(map,"AB.C"),OP_EQ, NULL); - tt_ptr_op(strmap_remove_lc(map,"aB.C"),OP_EQ, v1); - strmap_assert_ok(map); - tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, NULL); - - done: - if (map) - strmap_free(map,NULL); - if (found_keys) { - SMARTLIST_FOREACH(found_keys, char *, cp, tor_free(cp)); - smartlist_free(found_keys); - } - tor_free(visited); - tor_free(v1); - tor_free(v99); - tor_free(v100); - tor_free(v101); - tor_free(v102); - tor_free(v103); - tor_free(v104); - tor_free(v105); -} - -static void -test_container_smartlist_remove(void *arg) -{ - (void) arg; - int array[5]; - smartlist_t *sl = smartlist_new(); - int i,j; - - for (j=0; j < 2; ++j) - for (i=0; i < 5; ++i) - smartlist_add(sl, &array[i]); - - smartlist_remove(sl, &array[0]); - smartlist_remove(sl, &array[3]); - smartlist_remove(sl, &array[4]); - tt_assert(! smartlist_contains(sl, &array[0])); - tt_assert(smartlist_contains(sl, &array[1])); - tt_assert(smartlist_contains(sl, &array[2])); - tt_assert(! smartlist_contains(sl, &array[3])); - tt_assert(! smartlist_contains(sl, &array[4])); - tt_int_op(smartlist_len(sl), OP_EQ, 4); - - smartlist_clear(sl); - for (j=0; j < 2; ++j) - for (i=0; i < 5; ++i) - smartlist_add(sl, &array[i]); - - smartlist_remove_keeporder(sl, &array[0]); - smartlist_remove_keeporder(sl, &array[3]); - smartlist_remove_keeporder(sl, &array[4]); - tt_int_op(smartlist_len(sl), OP_EQ, 4); - tt_ptr_op(smartlist_get(sl, 0), OP_EQ, &array[1]); - tt_ptr_op(smartlist_get(sl, 1), OP_EQ, &array[2]); - tt_ptr_op(smartlist_get(sl, 2), OP_EQ, &array[1]); - tt_ptr_op(smartlist_get(sl, 3), OP_EQ, &array[2]); - - done: - smartlist_free(sl); -} - -/** Run unit tests for getting the median of a list. */ -static void -test_container_order_functions(void *arg) -{ - int lst[25], n = 0; - uint32_t lst_2[25]; - // int a=12,b=24,c=25,d=60,e=77; - -#define median() median_int(lst, n) - - (void)arg; - lst[n++] = 12; - tt_int_op(12,OP_EQ, median()); /* 12 */ - lst[n++] = 77; - //smartlist_shuffle(sl); - tt_int_op(12,OP_EQ, median()); /* 12, 77 */ - lst[n++] = 77; - //smartlist_shuffle(sl); - tt_int_op(77,OP_EQ, median()); /* 12, 77, 77 */ - lst[n++] = 24; - tt_int_op(24,OP_EQ, median()); /* 12,24,77,77 */ - lst[n++] = 60; - lst[n++] = 12; - lst[n++] = 25; - //smartlist_shuffle(sl); - tt_int_op(25,OP_EQ, median()); /* 12,12,24,25,60,77,77 */ -#undef median - -#define third_quartile() third_quartile_uint32(lst_2, n) - - n = 0; - lst_2[n++] = 1; - tt_int_op(1,OP_EQ, third_quartile()); /* ~1~ */ - lst_2[n++] = 2; - tt_int_op(2,OP_EQ, third_quartile()); /* 1, ~2~ */ - lst_2[n++] = 3; - lst_2[n++] = 4; - lst_2[n++] = 5; - tt_int_op(4,OP_EQ, third_quartile()); /* 1, 2, 3, ~4~, 5 */ - lst_2[n++] = 6; - lst_2[n++] = 7; - lst_2[n++] = 8; - lst_2[n++] = 9; - tt_int_op(7,OP_EQ, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */ - lst_2[n++] = 10; - lst_2[n++] = 11; - /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */ - tt_int_op(9,OP_EQ, third_quartile()); - -#undef third_quartile - - double dbls[] = { 1.0, 10.0, 100.0, 1e4, 1e5, 1e6 }; - tt_double_eq(1.0, median_double(dbls, 1)); - tt_double_eq(1.0, median_double(dbls, 2)); - tt_double_eq(10.0, median_double(dbls, 3)); - tt_double_eq(10.0, median_double(dbls, 4)); - tt_double_eq(100.0, median_double(dbls, 5)); - tt_double_eq(100.0, median_double(dbls, 6)); - - time_t times[] = { 5, 10, 20, 25, 15 }; - - tt_assert(5 == median_time(times, 1)); - tt_assert(5 == median_time(times, 2)); - tt_assert(10 == median_time(times, 3)); - tt_assert(10 == median_time(times, 4)); - tt_assert(15 == median_time(times, 5)); - - int32_t int32s[] = { -5, -10, -50, 100 }; - tt_int_op(-5, OP_EQ, median_int32(int32s, 1)); - tt_int_op(-10, OP_EQ, median_int32(int32s, 2)); - tt_int_op(-10, OP_EQ, median_int32(int32s, 3)); - tt_int_op(-10, OP_EQ, median_int32(int32s, 4)); - - long longs[] = { -30, 30, 100, -100, 7 }; - tt_int_op(7, OP_EQ, find_nth_long(longs, 5, 2)); - - done: - ; -} - -static void -test_container_di_map(void *arg) -{ - di_digest256_map_t *map = NULL; - const uint8_t key1[] = "In view of the fact that it was "; - const uint8_t key2[] = "superficially convincing, being "; - const uint8_t key3[] = "properly enciphered in a one-tim"; - const uint8_t key4[] = "e cipher scheduled for use today"; - char *v1 = tor_strdup(", it came close to causing a disaster..."); - char *v2 = tor_strdup("I regret to have to advise you that the mission"); - char *v3 = tor_strdup("was actually initiated..."); - /* -- John Brunner, _The Shockwave Rider_ */ - - (void)arg; - - /* Try searching on an empty map. */ - tt_ptr_op(NULL, OP_EQ, dimap_search(map, key1, NULL)); - tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); - dimap_free(map, NULL); - map = NULL; - - /* Add a single entry. */ - dimap_add_entry(&map, key1, v1); - tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); - tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); - - /* Now try it with three entries in the map. */ - dimap_add_entry(&map, key2, v2); - dimap_add_entry(&map, key3, v3); - tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); - tt_ptr_op(v2, OP_EQ, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, OP_EQ, dimap_search(map, key3, NULL)); - tt_ptr_op(NULL, OP_EQ, dimap_search(map, key4, NULL)); - tt_ptr_op(v1, OP_EQ, dimap_search(map, key4, v1)); - - done: - tor_free(v1); - tor_free(v2); - tor_free(v3); - dimap_free(map, NULL); -} - -/** Run unit tests for fp_pair-to-void* map functions */ -static void -test_container_fp_pair_map(void *arg) -{ - fp_pair_map_t *map; - fp_pair_t fp1, fp2, fp3, fp4, fp5, fp6; - void *v; - fp_pair_map_iter_t *iter; - fp_pair_t k; - char *v99 = tor_strdup("99"); - char *v100 = tor_strdup("v100"); - char *v101 = tor_strdup("v101"); - char *v102 = tor_strdup("v102"); - char *v103 = tor_strdup("v103"); - char *v104 = tor_strdup("v104"); - char *v105 = tor_strdup("v105"); - - (void)arg; - map = fp_pair_map_new(); - tt_assert(map); - tt_int_op(fp_pair_map_size(map),OP_EQ, 0); - tt_assert(fp_pair_map_isempty(map)); - - memset(fp1.first, 0x11, DIGEST_LEN); - memset(fp1.second, 0x12, DIGEST_LEN); - memset(fp2.first, 0x21, DIGEST_LEN); - memset(fp2.second, 0x22, DIGEST_LEN); - memset(fp3.first, 0x31, DIGEST_LEN); - memset(fp3.second, 0x32, DIGEST_LEN); - memset(fp4.first, 0x41, DIGEST_LEN); - memset(fp4.second, 0x42, DIGEST_LEN); - memset(fp5.first, 0x51, DIGEST_LEN); - memset(fp5.second, 0x52, DIGEST_LEN); - memset(fp6.first, 0x61, DIGEST_LEN); - memset(fp6.second, 0x62, DIGEST_LEN); - - v = fp_pair_map_set(map, &fp1, v99); - tt_ptr_op(v, OP_EQ, NULL); - tt_assert(!fp_pair_map_isempty(map)); - v = fp_pair_map_set(map, &fp2, v101); - tt_ptr_op(v, OP_EQ, NULL); - v = fp_pair_map_set(map, &fp1, v100); - tt_ptr_op(v, OP_EQ, v99); - tt_ptr_op(fp_pair_map_get(map, &fp1),OP_EQ, v100); - tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, v101); - tt_ptr_op(fp_pair_map_get(map, &fp3),OP_EQ, NULL); - fp_pair_map_assert_ok(map); - - v = fp_pair_map_remove(map, &fp2); - fp_pair_map_assert_ok(map); - tt_ptr_op(v,OP_EQ, v101); - tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); - tt_ptr_op(fp_pair_map_remove(map, &fp2),OP_EQ, NULL); - - fp_pair_map_set(map, &fp2, v101); - fp_pair_map_set(map, &fp3, v102); - fp_pair_map_set(map, &fp4, v103); - tt_int_op(fp_pair_map_size(map),OP_EQ, 4); - fp_pair_map_assert_ok(map); - fp_pair_map_set(map, &fp5, v104); - fp_pair_map_set_by_digests(map, fp6.first, fp6.second, v105); - fp_pair_map_assert_ok(map); - - /* Test iterator. */ - iter = fp_pair_map_iter_init(map); - while (!fp_pair_map_iter_done(iter)) { - fp_pair_map_iter_get(iter, &k, &v); - tt_ptr_op(v,OP_EQ, fp_pair_map_get(map, &k)); - - if (tor_memeq(&fp2, &k, sizeof(fp2))) { - iter = fp_pair_map_iter_next_rmv(map, iter); - } else { - iter = fp_pair_map_iter_next(map, iter); - } - } - - /* Make sure we removed fp2, but not the others. */ - tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); - tt_ptr_op(fp_pair_map_get_by_digests(map, fp5.first, fp5.second), - OP_EQ, v104); - - fp_pair_map_assert_ok(map); - /* Clean up after ourselves. */ - fp_pair_map_free(map, NULL); - map = NULL; - - done: - if (map) - fp_pair_map_free(map, NULL); - tor_free(v99); - tor_free(v100); - tor_free(v101); - tor_free(v102); - tor_free(v103); - tor_free(v104); - tor_free(v105); -} - -static void -test_container_smartlist_most_frequent(void *arg) -{ - (void) arg; - smartlist_t *sl = smartlist_new(); - - int count = -1; - const char *cp; - - cp = smartlist_get_most_frequent_string_(sl, &count); - tt_int_op(count, OP_EQ, 0); - tt_ptr_op(cp, OP_EQ, NULL); - - /* String must be sorted before we call get_most_frequent */ - smartlist_split_string(sl, "abc:def:ghi", ":", 0, 0); - - cp = smartlist_get_most_frequent_string_(sl, &count); - tt_int_op(count, OP_EQ, 1); - tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */ - - smartlist_split_string(sl, "def:ghi", ":", 0, 0); - smartlist_sort_strings(sl); - - cp = smartlist_get_most_frequent_string_(sl, &count); - tt_int_op(count, OP_EQ, 2); - tt_ptr_op(cp, OP_NE, NULL); - tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */ - - smartlist_split_string(sl, "def:abc:qwop", ":", 0, 0); - smartlist_sort_strings(sl); - - cp = smartlist_get_most_frequent_string_(sl, &count); - tt_int_op(count, OP_EQ, 3); - tt_ptr_op(cp, OP_NE, NULL); - tt_str_op(cp, OP_EQ, "def"); /* No tie */ - - done: - SMARTLIST_FOREACH(sl, char *, str, tor_free(str)); - smartlist_free(sl); -} - -static void -test_container_smartlist_sort_ptrs(void *arg) -{ - (void)arg; - int array[10]; - int *arrayptrs[11]; - smartlist_t *sl = smartlist_new(); - unsigned i=0, j; - - for (j = 0; j < ARRAY_LENGTH(array); ++j) { - smartlist_add(sl, &array[j]); - arrayptrs[i++] = &array[j]; - if (j == 5) { - smartlist_add(sl, &array[j]); - arrayptrs[i++] = &array[j]; - } - } - - for (i = 0; i < 10; ++i) { - smartlist_shuffle(sl); - smartlist_sort_pointers(sl); - for (j = 0; j < ARRAY_LENGTH(arrayptrs); ++j) { - tt_ptr_op(smartlist_get(sl, j), OP_EQ, arrayptrs[j]); - } - } - - done: - smartlist_free(sl); -} - -static void -test_container_smartlist_strings_eq(void *arg) -{ - (void)arg; - smartlist_t *sl1 = smartlist_new(); - smartlist_t *sl2 = smartlist_new(); -#define EQ_SHOULD_SAY(s1,s2,val) \ - do { \ - SMARTLIST_FOREACH(sl1, char *, cp, tor_free(cp)); \ - SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); \ - smartlist_clear(sl1); \ - smartlist_clear(sl2); \ - smartlist_split_string(sl1, (s1), ":", 0, 0); \ - smartlist_split_string(sl2, (s2), ":", 0, 0); \ - tt_int_op((val), OP_EQ, smartlist_strings_eq(sl1, sl2)); \ - } while (0) - - /* Both NULL, so equal */ - tt_int_op(1, OP_EQ, smartlist_strings_eq(NULL, NULL)); - - /* One NULL, not equal. */ - tt_int_op(0, OP_EQ, smartlist_strings_eq(NULL, sl1)); - tt_int_op(0, OP_EQ, smartlist_strings_eq(sl1, NULL)); - - /* Both empty, both equal. */ - EQ_SHOULD_SAY("", "", 1); - - /* One empty, not equal */ - EQ_SHOULD_SAY("", "ab", 0); - EQ_SHOULD_SAY("", "xy:z", 0); - EQ_SHOULD_SAY("abc", "", 0); - EQ_SHOULD_SAY("abc:cd", "", 0); - - /* Different lengths, not equal. */ - EQ_SHOULD_SAY("hello:world", "hello", 0); - EQ_SHOULD_SAY("hello", "hello:friends", 0); - - /* Same lengths, not equal */ - EQ_SHOULD_SAY("Hello:world", "goodbye:world", 0); - EQ_SHOULD_SAY("Hello:world", "Hello:stars", 0); - - /* Actually equal */ - EQ_SHOULD_SAY("ABC", "ABC", 1); - EQ_SHOULD_SAY(" ab : cd : e", " ab : cd : e", 1); - - done: - SMARTLIST_FOREACH(sl1, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(sl2, char *, cp, tor_free(cp)); - smartlist_free(sl1); - smartlist_free(sl2); -} - -#define CONTAINER_LEGACY(name) \ - { #name, test_container_ ## name , 0, NULL, NULL } - -#define CONTAINER(name, flags) \ - { #name, test_container_ ## name, (flags), NULL, NULL } - -struct testcase_t container_tests[] = { - CONTAINER_LEGACY(smartlist_basic), - CONTAINER_LEGACY(smartlist_strings), - CONTAINER_LEGACY(smartlist_overlap), - CONTAINER_LEGACY(smartlist_digests), - CONTAINER_LEGACY(smartlist_join), - CONTAINER_LEGACY(smartlist_pos), - CONTAINER(smartlist_remove, 0), - CONTAINER(smartlist_ints_eq, 0), - CONTAINER_LEGACY(bitarray), - CONTAINER_LEGACY(digestset), - CONTAINER_LEGACY(strmap), - CONTAINER_LEGACY(pqueue), - CONTAINER_LEGACY(order_functions), - CONTAINER(di_map, 0), - CONTAINER_LEGACY(fp_pair_map), - CONTAINER(smartlist_most_frequent, 0), - CONTAINER(smartlist_sort_ptrs, 0), - CONTAINER(smartlist_strings_eq, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_controller.c b/src/tor/src/test/test_controller.c deleted file mode 100644 index af19f63f6..000000000 --- a/src/tor/src/test/test_controller.c +++ /dev/null @@ -1,1485 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONTROL_PRIVATE -#include "or.h" -#include "bridges.h" -#include "control.h" -#include "entrynodes.h" -#include "hs_common.h" -#include "networkstatus.h" -#include "rendservice.h" -#include "routerlist.h" -#include "test.h" -#include "test_helpers.h" - -static void -test_add_onion_helper_keyarg_v3(void *arg) -{ - int ret, hs_version; - add_onion_secret_key_t pk; - char *key_new_blob = NULL; - char *err_msg = NULL; - const char *key_new_alg = NULL; - - (void) arg; - - memset(&pk, 0, sizeof(pk)); - - /* Test explicit ED25519-V3 key generation. */ - ret = add_onion_helper_keyarg("NEW:ED25519-V3", 0, &key_new_alg, - &key_new_blob, &pk, &hs_version, - &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); - tt_assert(pk.v3); - tt_str_op(key_new_alg, OP_EQ, "ED25519-V3"); - tt_assert(key_new_blob); - tt_ptr_op(err_msg, OP_EQ, NULL); - tor_free(pk.v3); pk.v3 = NULL; - tor_free(key_new_blob); - - /* Test discarding the private key. */ - ret = add_onion_helper_keyarg("NEW:ED25519-V3", 1, &key_new_alg, - &key_new_blob, &pk, &hs_version, - &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); - tt_assert(pk.v3); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_ptr_op(err_msg, OP_EQ, NULL); - tor_free(pk.v3); pk.v3 = NULL; - tor_free(key_new_blob); - - /* Test passing a key blob. */ - { - /* The base64 key and hex key are the same. Hex key is 64 bytes long. The - * sk has been generated randomly using python3. */ - const char *base64_sk = - "a9bT19PqGC9Y+BmOo1IQvCGjjwxMiaaxEXZ+FKMxpEQW" - "6AmSV5roThUGMRCaqQSCnR2jI1vL2QxHORzI4RxMmw=="; - const char *hex_sk = - "\x6b\xd6\xd3\xd7\xd3\xea\x18\x2f\x58\xf8\x19\x8e\xa3\x52\x10\xbc" - "\x21\xa3\x8f\x0c\x4c\x89\xa6\xb1\x11\x76\x7e\x14\xa3\x31\xa4\x44" - "\x16\xe8\x09\x92\x57\x9a\xe8\x4e\x15\x06\x31\x10\x9a\xa9\x04\x82" - "\x9d\x1d\xa3\x23\x5b\xcb\xd9\x0c\x47\x39\x1c\xc8\xe1\x1c\x4c\x9b"; - char *key_blob = NULL; - - tor_asprintf(&key_blob, "ED25519-V3:%s", base64_sk); - tt_assert(key_blob); - ret = add_onion_helper_keyarg(key_blob, 1, &key_new_alg, - &key_new_blob, &pk, &hs_version, - &err_msg); - tor_free(key_blob); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE); - tt_assert(pk.v3); - tt_mem_op(pk.v3, OP_EQ, hex_sk, 64); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_ptr_op(err_msg, OP_EQ, NULL); - tor_free(pk.v3); pk.v3 = NULL; - tor_free(key_new_blob); - } - - done: - tor_free(pk.v3); - tor_free(key_new_blob); - tor_free(err_msg); -} - -static void -test_add_onion_helper_keyarg_v2(void *arg) -{ - int ret, hs_version; - add_onion_secret_key_t pk; - crypto_pk_t *pk1 = NULL; - const char *key_new_alg = NULL; - char *key_new_blob = NULL; - char *err_msg = NULL; - char *encoded = NULL; - char *arg_str = NULL; - - (void) arg; - - memset(&pk, 0, sizeof(pk)); - - /* Test explicit RSA1024 key generation. */ - ret = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(pk.v2); - tt_str_op(key_new_alg, OP_EQ, "RSA1024"); - tt_assert(key_new_blob); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test "BEST" key generation (Assumes BEST = RSA1024). */ - crypto_pk_free(pk.v2); pk.v2 = NULL; - tor_free(key_new_blob); - ret = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(pk.v2); - tt_str_op(key_new_alg, OP_EQ, "RSA1024"); - tt_assert(key_new_blob); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test discarding the private key. */ - crypto_pk_free(pk.v2); pk.v2 = NULL; - tor_free(key_new_blob); - ret = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(pk.v2); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test generating a invalid key type. */ - crypto_pk_free(pk.v2); pk.v2 = NULL; - ret = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(!pk.v2); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_assert(err_msg); - - /* Test loading a RSA1024 key. */ - tor_free(err_msg); - pk1 = pk_generate(0); - tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded)); - tor_asprintf(&arg_str, "RSA1024:%s", encoded); - ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(pk.v2); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_int_op(crypto_pk_cmp_keys(pk1, pk.v2), OP_EQ, 0); - - /* Test loading a invalid key type. */ - tor_free(arg_str); - crypto_pk_free(pk1); pk1 = NULL; - crypto_pk_free(pk.v2); pk.v2 = NULL; - tor_asprintf(&arg_str, "RSA512:%s", encoded); - ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(!pk.v2); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_assert(err_msg); - - /* Test loading a invalid key. */ - tor_free(arg_str); - crypto_pk_free(pk.v2); pk.v2 = NULL; - tor_free(err_msg); - encoded[strlen(encoded)/2] = '\0'; - tor_asprintf(&arg_str, "RSA1024:%s", encoded); - ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob, - &pk, &hs_version, &err_msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO); - tt_assert(!pk.v2); - tt_ptr_op(key_new_alg, OP_EQ, NULL); - tt_ptr_op(key_new_blob, OP_EQ, NULL); - tt_assert(err_msg); - - done: - crypto_pk_free(pk1); - crypto_pk_free(pk.v2); - tor_free(key_new_blob); - tor_free(err_msg); - tor_free(encoded); - tor_free(arg_str); -} - -static void -test_getinfo_helper_onion(void *arg) -{ - (void)arg; - control_connection_t dummy; - /* Get results out */ - char *answer = NULL; - const char *errmsg = NULL; - char *service_id = NULL; - int rt = 0; - - dummy.ephemeral_onion_services = NULL; - - /* successfully get an empty answer */ - rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg); - tt_int_op(rt, OP_EQ, 0); - tt_str_op(answer, OP_EQ, ""); - tor_free(answer); - - /* successfully get an empty answer */ - rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg); - tt_int_op(rt, OP_EQ, 0); - tt_str_op(answer, OP_EQ, ""); - tor_free(answer); - - /* get an answer for one onion service */ - service_id = tor_strdup("dummy_onion_id"); - dummy.ephemeral_onion_services = smartlist_new(); - smartlist_add(dummy.ephemeral_onion_services, service_id); - rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg); - tt_int_op(rt, OP_EQ, 0); - tt_str_op(answer, OP_EQ, "dummy_onion_id"); - - done: - tor_free(answer); - tor_free(service_id); - smartlist_free(dummy.ephemeral_onion_services); -} - -static void -test_rend_service_parse_port_config(void *arg) -{ - const char *sep = ","; - rend_service_port_config_t *cfg = NULL; - char *err_msg = NULL; - - (void)arg; - - /* Test "VIRTPORT" only. */ - cfg = rend_service_parse_port_config("80", sep, &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test "VIRTPORT,TARGET" (Target is port). */ - rend_service_port_config_free(cfg); - cfg = rend_service_parse_port_config("80,8080", sep, &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */ - rend_service_port_config_free(cfg); - cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - - /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */ - rend_service_port_config_free(cfg); - cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - rend_service_port_config_free(cfg); - cfg = NULL; - - /* XXX: Someone should add tests for AF_UNIX targets if supported. */ - - /* Test empty config. */ - rend_service_port_config_free(cfg); - cfg = rend_service_parse_port_config("", sep, &err_msg); - tt_ptr_op(cfg, OP_EQ, NULL); - tt_assert(err_msg); - - /* Test invalid port. */ - tor_free(err_msg); - cfg = rend_service_parse_port_config("90001", sep, &err_msg); - tt_ptr_op(cfg, OP_EQ, NULL); - tt_assert(err_msg); - tor_free(err_msg); - - /* unix port */ - cfg = NULL; - - /* quoted unix port */ - tor_free(err_msg); - cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"", - " ", &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - rend_service_port_config_free(cfg); - cfg = NULL; - - /* quoted unix port */ - tor_free(err_msg); - cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"", - " ", &err_msg); - tt_assert(cfg); - tt_ptr_op(err_msg, OP_EQ, NULL); - rend_service_port_config_free(cfg); - cfg = NULL; - - /* quoted unix port, missing end quote */ - cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar", - " ", &err_msg); - tt_ptr_op(cfg, OP_EQ, NULL); - tt_str_op(err_msg, OP_EQ, "Couldn't process address " - "from hidden service configuration"); - tor_free(err_msg); - - /* bogus IP address */ - MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); - cfg = rend_service_parse_port_config("100 foo!!.example.com:9000", - " ", &err_msg); - UNMOCK(tor_addr_lookup); - tt_ptr_op(cfg, OP_EQ, NULL); - tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port " - "configuration."); - tor_free(err_msg); - - /* bogus port port */ - cfg = rend_service_parse_port_config("100 99999", - " ", &err_msg); - tt_ptr_op(cfg, OP_EQ, NULL); - tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" " - "in hidden service port configuration."); - tor_free(err_msg); - - done: - rend_service_port_config_free(cfg); - tor_free(err_msg); -} - -static void -test_add_onion_helper_clientauth(void *arg) -{ - rend_authorized_client_t *client = NULL; - char *err_msg = NULL; - int created = 0; - - (void)arg; - - /* Test "ClientName" only. */ - client = add_onion_helper_clientauth("alice", &created, &err_msg); - tt_assert(client); - tt_assert(created); - tt_ptr_op(err_msg, OP_EQ, NULL); - rend_authorized_client_free(client); - - /* Test "ClientName:Blob" */ - client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B", - &created, &err_msg); - tt_assert(client); - tt_assert(!created); - tt_ptr_op(err_msg, OP_EQ, NULL); - rend_authorized_client_free(client); - - /* Test invalid client names */ - client = add_onion_helper_clientauth("no*asterisks*allowed", &created, - &err_msg); - tt_ptr_op(client, OP_EQ, NULL); - tt_assert(err_msg); - tor_free(err_msg); - - /* Test invalid auth cookie */ - client = add_onion_helper_clientauth("alice:12345", &created, &err_msg); - tt_ptr_op(client, OP_EQ, NULL); - tt_assert(err_msg); - tor_free(err_msg); - - /* Test invalid syntax */ - client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created, - &err_msg); - tt_ptr_op(client, OP_EQ, NULL); - tt_assert(err_msg); - tor_free(err_msg); - - done: - rend_authorized_client_free(client); - tor_free(err_msg); -} - -/* Mocks and data/variables used for GETINFO download status tests */ - -static const download_status_t dl_status_default = - { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; -static download_status_t ns_dl_status[N_CONSENSUS_FLAVORS]; -static download_status_t ns_dl_status_bootstrap[N_CONSENSUS_FLAVORS]; -static download_status_t ns_dl_status_running[N_CONSENSUS_FLAVORS]; - -/* - * These should explore all the possible cases of download_status_to_string() - * in control.c - */ -static const download_status_t dls_sample_1 = - { 1467163900, 0, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 }; -static const char * dls_sample_1_str = - "next-attempt-at 2016-06-29 01:31:40\n" - "n-download-failures 0\n" - "n-download-attempts 0\n" - "schedule DL_SCHED_GENERIC\n" - "want-authority DL_WANT_ANY_DIRSERVER\n" - "increment-on DL_SCHED_INCREMENT_FAILURE\n" - "backoff DL_SCHED_DETERMINISTIC\n"; -static const download_status_t dls_sample_2 = - { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_DETERMINISTIC, 0, 0 }; -static const char * dls_sample_2_str = - "next-attempt-at 2016-06-29 01:40:00\n" - "n-download-failures 1\n" - "n-download-attempts 2\n" - "schedule DL_SCHED_CONSENSUS\n" - "want-authority DL_WANT_AUTHORITY\n" - "increment-on DL_SCHED_INCREMENT_FAILURE\n" - "backoff DL_SCHED_DETERMINISTIC\n"; -static const download_status_t dls_sample_3 = - { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_DETERMINISTIC, 0, 0 }; -static const char * dls_sample_3_str = - "next-attempt-at 2016-06-28 22:53:20\n" - "n-download-failures 12\n" - "n-download-attempts 25\n" - "schedule DL_SCHED_BRIDGE\n" - "want-authority DL_WANT_ANY_DIRSERVER\n" - "increment-on DL_SCHED_INCREMENT_ATTEMPT\n" - "backoff DL_SCHED_DETERMINISTIC\n"; -static const download_status_t dls_sample_4 = - { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; -static const char * dls_sample_4_str = - "next-attempt-at 2016-06-29 02:16:40\n" - "n-download-failures 3\n" - "n-download-attempts 0\n" - "schedule DL_SCHED_GENERIC\n" - "want-authority DL_WANT_ANY_DIRSERVER\n" - "increment-on DL_SCHED_INCREMENT_FAILURE\n" - "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" - "last-backoff-position 0\n" - "last-delay-used 0\n"; -static const download_status_t dls_sample_5 = - { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 1, 2112, }; -static const char * dls_sample_5_str = - "next-attempt-at 2016-06-29 01:43:20\n" - "n-download-failures 3\n" - "n-download-attempts 7\n" - "schedule DL_SCHED_CONSENSUS\n" - "want-authority DL_WANT_ANY_DIRSERVER\n" - "increment-on DL_SCHED_INCREMENT_FAILURE\n" - "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" - "last-backoff-position 1\n" - "last-delay-used 2112\n"; -static const download_status_t dls_sample_6 = - { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_ATTEMPT, DL_SCHED_RANDOM_EXPONENTIAL, 3, 432 }; -static const char * dls_sample_6_str = - "next-attempt-at 2016-06-29 01:36:40\n" - "n-download-failures 4\n" - "n-download-attempts 9\n" - "schedule DL_SCHED_CONSENSUS\n" - "want-authority DL_WANT_AUTHORITY\n" - "increment-on DL_SCHED_INCREMENT_ATTEMPT\n" - "backoff DL_SCHED_RANDOM_EXPONENTIAL\n" - "last-backoff-position 3\n" - "last-delay-used 432\n"; - -/* Simulated auth certs */ -static const char *auth_id_digest_1_str = - "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061"; -static download_status_t auth_def_cert_download_status_1; -static const char *auth_id_digest_2_str = - "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99"; -static download_status_t auth_def_cert_download_status_2; -/* Expected form of digest list returned for GETINFO downloads/cert/fps */ -static const char *auth_id_digest_expected_list = - "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n" - "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n"; - -/* Signing keys for simulated auth 1 */ -static const char *auth_1_sk_1_str = - "AA69566029B1F023BA09451B8F1B10952384EB58"; -static download_status_t auth_1_sk_1_dls; -static const char *auth_1_sk_2_str = - "710865C7F06B73C5292695A8C34F1C94F769FF72"; -static download_status_t auth_1_sk_2_dls; -/* - * Expected form of sk digest list for - * GETINFO downloads/cert//sks - */ -static const char *auth_1_sk_digest_expected_list = - "AA69566029B1F023BA09451B8F1B10952384EB58\n" - "710865C7F06B73C5292695A8C34F1C94F769FF72\n"; - -/* Signing keys for simulated auth 2 */ -static const char *auth_2_sk_1_str = - "4299047E00D070AD6703FE00BE7AA756DB061E62"; -static download_status_t auth_2_sk_1_dls; -static const char *auth_2_sk_2_str = - "9451B8F1B10952384EB58B5F230C0BB701626C9B"; -static download_status_t auth_2_sk_2_dls; -/* - * Expected form of sk digest list for - * GETINFO downloads/cert//sks - */ -static const char *auth_2_sk_digest_expected_list = - "4299047E00D070AD6703FE00BE7AA756DB061E62\n" - "9451B8F1B10952384EB58B5F230C0BB701626C9B\n"; - -/* Simulated router descriptor digests or bridge identity digests */ -static const char *descbr_digest_1_str = - "616408544C7345822696074A1A3DFA16AB381CBD"; -static download_status_t descbr_digest_1_dl; -static const char *descbr_digest_2_str = - "06E8067246967265DBCB6641631B530EFEC12DC3"; -static download_status_t descbr_digest_2_dl; -/* Expected form of digest list returned for GETINFO downloads/desc/descs */ -static const char *descbr_expected_list = - "616408544C7345822696074A1A3DFA16AB381CBD\n" - "06E8067246967265DBCB6641631B530EFEC12DC3\n"; -/* - * Flag to make all descbr queries fail, to simulate not being - * configured such that such queries make sense. - */ -static int disable_descbr = 0; - -static void -reset_mocked_dl_statuses(void) -{ - int i; - - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - memcpy(&(ns_dl_status[i]), &dl_status_default, - sizeof(download_status_t)); - memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default, - sizeof(download_status_t)); - memcpy(&(ns_dl_status_running[i]), &dl_status_default, - sizeof(download_status_t)); - } - - memcpy(&auth_def_cert_download_status_1, &dl_status_default, - sizeof(download_status_t)); - memcpy(&auth_def_cert_download_status_2, &dl_status_default, - sizeof(download_status_t)); - memcpy(&auth_1_sk_1_dls, &dl_status_default, - sizeof(download_status_t)); - memcpy(&auth_1_sk_2_dls, &dl_status_default, - sizeof(download_status_t)); - memcpy(&auth_2_sk_1_dls, &dl_status_default, - sizeof(download_status_t)); - memcpy(&auth_2_sk_2_dls, &dl_status_default, - sizeof(download_status_t)); - - memcpy(&descbr_digest_1_dl, &dl_status_default, - sizeof(download_status_t)); - memcpy(&descbr_digest_2_dl, &dl_status_default, - sizeof(download_status_t)); -} - -static download_status_t * -ns_dl_status_mock(consensus_flavor_t flavor) -{ - return &(ns_dl_status[flavor]); -} - -static download_status_t * -ns_dl_status_bootstrap_mock(consensus_flavor_t flavor) -{ - return &(ns_dl_status_bootstrap[flavor]); -} - -static download_status_t * -ns_dl_status_running_mock(consensus_flavor_t flavor) -{ - return &(ns_dl_status_running[flavor]); -} - -static void -setup_ns_mocks(void) -{ - MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock); - MOCK(networkstatus_get_dl_status_by_flavor_bootstrap, - ns_dl_status_bootstrap_mock); - MOCK(networkstatus_get_dl_status_by_flavor_running, - ns_dl_status_running_mock); - reset_mocked_dl_statuses(); -} - -static void -clear_ns_mocks(void) -{ - UNMOCK(networkstatus_get_dl_status_by_flavor); - UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap); - UNMOCK(networkstatus_get_dl_status_by_flavor_running); -} - -static smartlist_t * -cert_dl_status_auth_ids_mock(void) -{ - char digest[DIGEST_LEN], *tmp; - int len; - smartlist_t *list = NULL; - - /* Just pretend we have only the two hard-coded digests listed above */ - list = smartlist_new(); - len = base16_decode(digest, DIGEST_LEN, - auth_id_digest_1_str, strlen(auth_id_digest_1_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, digest, DIGEST_LEN); - smartlist_add(list, tmp); - len = base16_decode(digest, DIGEST_LEN, - auth_id_digest_2_str, strlen(auth_id_digest_2_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, digest, DIGEST_LEN); - smartlist_add(list, tmp); - - done: - return list; -} - -static download_status_t * -cert_dl_status_def_for_auth_mock(const char *digest) -{ - download_status_t *dl = NULL; - char digest_str[HEX_DIGEST_LEN+1]; - - tt_ptr_op(digest, OP_NE, NULL); - base16_encode(digest_str, HEX_DIGEST_LEN + 1, - digest, DIGEST_LEN); - digest_str[HEX_DIGEST_LEN] = '\0'; - - if (strcmp(digest_str, auth_id_digest_1_str) == 0) { - dl = &auth_def_cert_download_status_1; - } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) { - dl = &auth_def_cert_download_status_2; - } - - done: - return dl; -} - -static smartlist_t * -cert_dl_status_sks_for_auth_id_mock(const char *digest) -{ - smartlist_t *list = NULL; - char sk[DIGEST_LEN]; - char digest_str[HEX_DIGEST_LEN+1]; - char *tmp; - int len; - - tt_ptr_op(digest, OP_NE, NULL); - base16_encode(digest_str, HEX_DIGEST_LEN + 1, - digest, DIGEST_LEN); - digest_str[HEX_DIGEST_LEN] = '\0'; - - /* - * Build a list of two hard-coded digests, depending on what we - * were just passed. - */ - if (strcmp(digest_str, auth_id_digest_1_str) == 0) { - list = smartlist_new(); - len = base16_decode(sk, DIGEST_LEN, - auth_1_sk_1_str, strlen(auth_1_sk_1_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, sk, DIGEST_LEN); - smartlist_add(list, tmp); - len = base16_decode(sk, DIGEST_LEN, - auth_1_sk_2_str, strlen(auth_1_sk_2_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, sk, DIGEST_LEN); - smartlist_add(list, tmp); - } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) { - list = smartlist_new(); - len = base16_decode(sk, DIGEST_LEN, - auth_2_sk_1_str, strlen(auth_2_sk_1_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, sk, DIGEST_LEN); - smartlist_add(list, tmp); - len = base16_decode(sk, DIGEST_LEN, - auth_2_sk_2_str, strlen(auth_2_sk_2_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, sk, DIGEST_LEN); - smartlist_add(list, tmp); - } - - done: - return list; -} - -static download_status_t * -cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest) -{ - download_status_t *dl = NULL; - char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1]; - - /* - * Unpack the digests so we can compare them and figure out which - * dl status we want. - */ - - tt_ptr_op(fp_digest, OP_NE, NULL); - base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1, - fp_digest, DIGEST_LEN); - fp_digest_str[HEX_DIGEST_LEN] = '\0'; - tt_ptr_op(sk_digest, OP_NE, NULL); - base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1, - sk_digest, DIGEST_LEN); - sk_digest_str[HEX_DIGEST_LEN] = '\0'; - - if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) { - if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) { - dl = &auth_1_sk_1_dls; - } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) { - dl = &auth_1_sk_2_dls; - } - } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) { - if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) { - dl = &auth_2_sk_1_dls; - } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) { - dl = &auth_2_sk_2_dls; - } - } - - done: - return dl; -} - -static void -setup_cert_mocks(void) -{ - MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock); - MOCK(id_only_download_status_for_authority_id, - cert_dl_status_def_for_auth_mock); - MOCK(list_sk_digests_for_authority_id, - cert_dl_status_sks_for_auth_id_mock); - MOCK(download_status_for_authority_id_and_sk, - cert_dl_status_fp_sk_mock); - reset_mocked_dl_statuses(); -} - -static void -clear_cert_mocks(void) -{ - UNMOCK(list_authority_ids_with_downloads); - UNMOCK(id_only_download_status_for_authority_id); - UNMOCK(list_sk_digests_for_authority_id); - UNMOCK(download_status_for_authority_id_and_sk); -} - -static smartlist_t * -descbr_get_digests_mock(void) -{ - char digest[DIGEST_LEN], *tmp; - int len; - smartlist_t *list = NULL; - - if (!disable_descbr) { - /* Just pretend we have only the two hard-coded digests listed above */ - list = smartlist_new(); - len = base16_decode(digest, DIGEST_LEN, - descbr_digest_1_str, strlen(descbr_digest_1_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, digest, DIGEST_LEN); - smartlist_add(list, tmp); - len = base16_decode(digest, DIGEST_LEN, - descbr_digest_2_str, strlen(descbr_digest_2_str)); - tt_int_op(len, OP_EQ, DIGEST_LEN); - tmp = tor_malloc(DIGEST_LEN); - memcpy(tmp, digest, DIGEST_LEN); - smartlist_add(list, tmp); - } - - done: - return list; -} - -static download_status_t * -descbr_get_dl_by_digest_mock(const char *digest) -{ - download_status_t *dl = NULL; - char digest_str[HEX_DIGEST_LEN+1]; - - if (!disable_descbr) { - tt_ptr_op(digest, OP_NE, NULL); - base16_encode(digest_str, HEX_DIGEST_LEN + 1, - digest, DIGEST_LEN); - digest_str[HEX_DIGEST_LEN] = '\0'; - - if (strcmp(digest_str, descbr_digest_1_str) == 0) { - dl = &descbr_digest_1_dl; - } else if (strcmp(digest_str, descbr_digest_2_str) == 0) { - dl = &descbr_digest_2_dl; - } - } - - done: - return dl; -} - -static void -setup_desc_mocks(void) -{ - MOCK(router_get_descriptor_digests, - descbr_get_digests_mock); - MOCK(router_get_dl_status_by_descriptor_digest, - descbr_get_dl_by_digest_mock); - reset_mocked_dl_statuses(); -} - -static void -clear_desc_mocks(void) -{ - UNMOCK(router_get_descriptor_digests); - UNMOCK(router_get_dl_status_by_descriptor_digest); -} - -static void -setup_bridge_mocks(void) -{ - disable_descbr = 0; - - MOCK(list_bridge_identities, - descbr_get_digests_mock); - MOCK(get_bridge_dl_status_by_id, - descbr_get_dl_by_digest_mock); - reset_mocked_dl_statuses(); -} - -static void -clear_bridge_mocks(void) -{ - UNMOCK(list_bridge_identities); - UNMOCK(get_bridge_dl_status_by_id); - - disable_descbr = 0; -} - -static void -test_download_status_consensus(void *arg) -{ - /* We just need one of these to pass, it doesn't matter what's in it */ - control_connection_t dummy; - /* Get results out */ - char *answer = NULL; - const char *errmsg = NULL; - - (void)arg; - - /* Check that the unknown prefix case works; no mocks needed yet */ - getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_str_op(errmsg, OP_EQ, "Unknown download status query"); - - setup_ns_mocks(); - - /* - * Check returning serialized dlstatuses, and implicitly also test - * download_status_to_string(). - */ - - /* Case 1 default/FLAV_NS*/ - memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_1_str); - tor_free(answer); - errmsg = NULL; - - /* Case 2 default/FLAV_MICRODESC */ - memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_2_str); - tor_free(answer); - errmsg = NULL; - - /* Case 3 bootstrap/FLAV_NS */ - memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_3_str); - tor_free(answer); - errmsg = NULL; - - /* Case 4 bootstrap/FLAV_MICRODESC */ - memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, - "downloads/networkstatus/microdesc/bootstrap", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_4_str); - tor_free(answer); - errmsg = NULL; - - /* Case 5 running/FLAV_NS */ - memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, - "downloads/networkstatus/ns/running", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_5_str); - tor_free(answer); - errmsg = NULL; - - /* Case 6 running/FLAV_MICRODESC */ - memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6, - sizeof(download_status_t)); - getinfo_helper_downloads(&dummy, - "downloads/networkstatus/microdesc/running", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_6_str); - tor_free(answer); - errmsg = NULL; - - /* Now check the error case */ - getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "Unknown flavor"); - errmsg = NULL; - - done: - clear_ns_mocks(); - tor_free(answer); - - return; -} - -static void -test_download_status_cert(void *arg) -{ - /* We just need one of these to pass, it doesn't matter what's in it */ - control_connection_t dummy; - /* Get results out */ - char *question = NULL; - char *answer = NULL; - const char *errmsg = NULL; - - (void)arg; - - setup_cert_mocks(); - - /* - * Check returning serialized dlstatuses and digest lists, and implicitly - * also test download_status_to_string() and digest_list_to_string(). - */ - - /* Case 1 - list of authority identity fingerprints */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fps", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, auth_id_digest_expected_list); - tor_free(answer); - errmsg = NULL; - - /* Case 2 - download status for default cert for 1st auth id */ - memcpy(&auth_def_cert_download_status_1, &dls_sample_1, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_1_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 3 - download status for default cert for 2nd auth id */ - memcpy(&auth_def_cert_download_status_2, &dls_sample_2, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_2_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 4 - list of signing key digests for 1st auth id */ - tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 5 - list of signing key digests for 2nd auth id */ - tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 6 - download status for 1st auth id, 1st sk */ - memcpy(&auth_1_sk_1_dls, &dls_sample_3, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s/%s", - auth_id_digest_1_str, auth_1_sk_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_3_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 7 - download status for 1st auth id, 2nd sk */ - memcpy(&auth_1_sk_2_dls, &dls_sample_4, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s/%s", - auth_id_digest_1_str, auth_1_sk_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_4_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 8 - download status for 2nd auth id, 1st sk */ - memcpy(&auth_2_sk_1_dls, &dls_sample_5, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s/%s", - auth_id_digest_2_str, auth_2_sk_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_5_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 9 - download status for 2nd auth id, 2nd sk */ - memcpy(&auth_2_sk_2_dls, &dls_sample_6, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/cert/fp/%s/%s", - auth_id_digest_2_str, auth_2_sk_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_6_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Now check the error cases */ - - /* Case 1 - query is garbage after downloads/cert/ part */ - getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query"); - errmsg = NULL; - - /* - * Case 2 - looks like downloads/cert/fp/, but isn't even - * the right length for a digest. - */ - getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); - errmsg = NULL; - - /* - * Case 3 - looks like downloads/cert/fp/, and is digest-sized, - * but not parseable as one. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); - errmsg = NULL; - - /* - * Case 4 - downloads/cert/fp/, and is not a known authority - * identity digest - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "Failed to get download status for this authority identity digest"); - errmsg = NULL; - - /* - * Case 5 - looks like downloads/cert/fp//, but doesn't - * parse as a sensible digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest"); - errmsg = NULL; - - /* - * Case 6 - looks like downloads/cert/fp//, but doesn't - * parse as a sensible digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/82F52AF55D25/blah", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest"); - errmsg = NULL; - - /* - * Case 7 - downloads/cert/fp//sks, and is not a known authority - * digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "Failed to get list of signing key digests for this authority " - "identity digest"); - errmsg = NULL; - - /* - * Case 8 - looks like downloads/cert/fp//, but doesn't - * parse as a signing key digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/" - "82F52AF55D250115FE44D3GC81D49643241D56A1", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest"); - errmsg = NULL; - - /* - * Case 9 - looks like downloads/cert/fp//, but doesn't - * parse as a signing key digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/" - "82F52AF55D250115FE44D", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest"); - errmsg = NULL; - - /* - * Case 10 - downloads/cert/fp//, but isn't a known - * authority identity digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/" - "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "Failed to get download status for this identity/" - "signing key digest pair"); - errmsg = NULL; - - /* - * Case 11 - downloads/cert/fp//, but isn't a known - * signing key digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/" - "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "Failed to get download status for this identity/" - "signing key digest pair"); - errmsg = NULL; - - /* - * Case 12 - downloads/cert/fp//, but is on the list for - * a different authority identity digest. - */ - getinfo_helper_downloads(&dummy, - "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/" - "9451B8F1B10952384EB58B5F230C0BB701626C9B", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "Failed to get download status for this identity/" - "signing key digest pair"); - errmsg = NULL; - - done: - clear_cert_mocks(); - tor_free(answer); - - return; -} - -static void -test_download_status_desc(void *arg) -{ - /* We just need one of these to pass, it doesn't matter what's in it */ - control_connection_t dummy; - /* Get results out */ - char *question = NULL; - char *answer = NULL; - const char *errmsg = NULL; - - (void)arg; - - setup_desc_mocks(); - - /* - * Check returning serialized dlstatuses and digest lists, and implicitly - * also test download_status_to_string() and digest_list_to_string(). - */ - - /* Case 1 - list of router descriptor digests */ - getinfo_helper_downloads(&dummy, - "downloads/desc/descs", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, descbr_expected_list); - tor_free(answer); - errmsg = NULL; - - /* Case 2 - get download status for router descriptor 1 */ - memcpy(&descbr_digest_1_dl, &dls_sample_1, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_1_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 3 - get download status for router descriptor 1 */ - memcpy(&descbr_digest_2_dl, &dls_sample_2, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_2_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Now check the error cases */ - - /* Case 1 - non-digest-length garbage after downloads/desc */ - getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query"); - errmsg = NULL; - - /* Case 2 - nonparseable digest-shaped thing */ - getinfo_helper_downloads( - &dummy, - "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); - errmsg = NULL; - - /* Case 3 - digest we have no descriptor for */ - getinfo_helper_downloads( - &dummy, - "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "No such descriptor digest found"); - errmsg = NULL; - - /* Case 4 - microdescs only */ - disable_descbr = 1; - getinfo_helper_downloads(&dummy, - "downloads/desc/descs", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, - "We don't seem to have a networkstatus-flavored consensus"); - errmsg = NULL; - disable_descbr = 0; - - done: - clear_desc_mocks(); - tor_free(answer); - - return; -} - -static void -test_download_status_bridge(void *arg) -{ - /* We just need one of these to pass, it doesn't matter what's in it */ - control_connection_t dummy; - /* Get results out */ - char *question = NULL; - char *answer = NULL; - const char *errmsg = NULL; - - (void)arg; - - setup_bridge_mocks(); - - /* - * Check returning serialized dlstatuses and digest lists, and implicitly - * also test download_status_to_string() and digest_list_to_string(). - */ - - /* Case 1 - list of bridge identity digests */ - getinfo_helper_downloads(&dummy, - "downloads/bridge/bridges", - &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, descbr_expected_list); - tor_free(answer); - errmsg = NULL; - - /* Case 2 - get download status for bridge descriptor 1 */ - memcpy(&descbr_digest_1_dl, &dls_sample_3, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_3_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Case 3 - get download status for router descriptor 1 */ - memcpy(&descbr_digest_2_dl, &dls_sample_4, - sizeof(download_status_t)); - tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str); - tt_ptr_op(question, OP_NE, NULL); - getinfo_helper_downloads(&dummy, question, &answer, &errmsg); - tt_ptr_op(answer, OP_NE, NULL); - tt_ptr_op(errmsg, OP_EQ, NULL); - tt_str_op(answer, OP_EQ, dls_sample_4_str); - tor_free(question); - tor_free(answer); - errmsg = NULL; - - /* Now check the error cases */ - - /* Case 1 - non-digest-length garbage after downloads/bridge */ - getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query"); - errmsg = NULL; - - /* Case 2 - nonparseable digest-shaped thing */ - getinfo_helper_downloads( - &dummy, - "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "That didn't look like a digest"); - errmsg = NULL; - - /* Case 3 - digest we have no descriptor for */ - getinfo_helper_downloads( - &dummy, - "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found"); - errmsg = NULL; - - /* Case 4 - bridges disabled */ - disable_descbr = 1; - getinfo_helper_downloads(&dummy, - "downloads/bridge/bridges", - &answer, &errmsg); - tt_ptr_op(answer, OP_EQ, NULL); - tt_ptr_op(errmsg, OP_NE, NULL); - tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges"); - errmsg = NULL; - disable_descbr = 0; - - done: - clear_bridge_mocks(); - tor_free(answer); - - return; -} - -struct testcase_t controller_tests[] = { - { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0, - NULL, NULL }, - { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0, - NULL, NULL }, - { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL }, - { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0, - NULL, NULL }, - { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL, - NULL }, - { "download_status_consensus", test_download_status_consensus, 0, NULL, - NULL }, - { "download_status_cert", test_download_status_cert, 0, NULL, - NULL }, - { "download_status_desc", test_download_status_desc, 0, NULL, NULL }, - { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_controller_events.c b/src/tor/src/test/test_controller_events.c deleted file mode 100644 index 901ad7ab3..000000000 --- a/src/tor/src/test/test_controller_events.c +++ /dev/null @@ -1,406 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONNECTION_PRIVATE -#define TOR_CHANNEL_INTERNAL_ -#define CONTROL_PRIVATE -#include "or.h" -#include "channel.h" -#include "channeltls.h" -#include "connection.h" -#include "control.h" -#include "test.h" - -static void -help_test_bucket_note_empty(uint32_t expected_msec_since_midnight, - int tokens_before, size_t tokens_removed, - uint32_t msec_since_epoch) -{ - uint32_t timestamp_var = 0; - struct timeval tvnow; - tvnow.tv_sec = msec_since_epoch / 1000; - tvnow.tv_usec = (msec_since_epoch % 1000) * 1000; - connection_buckets_note_empty_ts(×tamp_var, tokens_before, - tokens_removed, &tvnow); - tt_int_op(expected_msec_since_midnight, OP_EQ, timestamp_var); - - done: - ; -} - -static void -test_cntev_bucket_note_empty(void *arg) -{ - (void)arg; - - /* Two cases with nothing to note, because bucket was empty before; - * 86442200 == 1970-01-02 00:00:42.200000 */ - help_test_bucket_note_empty(0, 0, 0, 86442200); - help_test_bucket_note_empty(0, -100, 100, 86442200); - - /* Nothing to note, because bucket has not been emptied. */ - help_test_bucket_note_empty(0, 101, 100, 86442200); - - /* Bucket was emptied, note 42200 msec since midnight. */ - help_test_bucket_note_empty(42200, 101, 101, 86442200); - help_test_bucket_note_empty(42200, 101, 102, 86442200); -} - -static void -test_cntev_bucket_millis_empty(void *arg) -{ - struct timeval tvnow; - (void)arg; - - /* 1970-01-02 00:00:42.200000 */ - tvnow.tv_sec = 86400 + 42; - tvnow.tv_usec = 200000; - - /* Bucket has not been refilled. */ - tt_int_op(0, OP_EQ, bucket_millis_empty(0, 42120, 0, 100, &tvnow)); - tt_int_op(0, OP_EQ, bucket_millis_empty(-10, 42120, -10, 100, &tvnow)); - - /* Bucket was not empty. */ - tt_int_op(0, OP_EQ, bucket_millis_empty(10, 42120, 20, 100, &tvnow)); - - /* Bucket has been emptied 80 msec ago and has just been refilled. */ - tt_int_op(80, OP_EQ, bucket_millis_empty(-20, 42120, -10, 100, &tvnow)); - tt_int_op(80, OP_EQ, bucket_millis_empty(-10, 42120, 0, 100, &tvnow)); - tt_int_op(80, OP_EQ, bucket_millis_empty(0, 42120, 10, 100, &tvnow)); - - /* Bucket has been emptied 180 msec ago, last refill was 100 msec ago - * which was insufficient to make it positive, so cap msec at 100. */ - tt_int_op(100, OP_EQ, bucket_millis_empty(0, 42020, 1, 100, &tvnow)); - - /* 1970-01-02 00:00:00:050000 */ - tvnow.tv_sec = 86400; - tvnow.tv_usec = 50000; - - /* Last emptied 30 msec before midnight, tvnow is 50 msec after - * midnight, that's 80 msec in total. */ - tt_int_op(80, OP_EQ, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow)); - - done: - ; -} - -static void -add_testing_cell_stats_entry(circuit_t *circ, uint8_t command, - unsigned int waiting_time, - unsigned int removed, unsigned int exitward) -{ - testing_cell_stats_entry_t *ent = tor_malloc_zero( - sizeof(testing_cell_stats_entry_t)); - ent->command = command; - ent->waiting_time = waiting_time; - ent->removed = removed; - ent->exitward = exitward; - if (!circ->testing_cell_stats) - circ->testing_cell_stats = smartlist_new(); - smartlist_add(circ->testing_cell_stats, ent); -} - -static void -test_cntev_sum_up_cell_stats(void *arg) -{ - or_circuit_t *or_circ; - circuit_t *circ; - cell_stats_t *cell_stats = NULL; - (void)arg; - - /* This circuit is fake. */ - or_circ = tor_malloc_zero(sizeof(or_circuit_t)); - or_circ->base_.magic = OR_CIRCUIT_MAGIC; - or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; - circ = TO_CIRCUIT(or_circ); - - /* A single RELAY cell was added to the appward queue. */ - cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); - add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 0); - sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(1, OP_EQ, cell_stats->added_cells_appward[CELL_RELAY]); - - /* A single RELAY cell was added to the exitward queue. */ - add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 1); - sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(1, OP_EQ, cell_stats->added_cells_exitward[CELL_RELAY]); - - /* A single RELAY cell was removed from the appward queue where it spent - * 20 msec. */ - add_testing_cell_stats_entry(circ, CELL_RELAY, 2, 1, 0); - sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(20, OP_EQ, cell_stats->total_time_appward[CELL_RELAY]); - tt_u64_op(1, OP_EQ, cell_stats->removed_cells_appward[CELL_RELAY]); - - /* A single RELAY cell was removed from the exitward queue where it - * spent 30 msec. */ - add_testing_cell_stats_entry(circ, CELL_RELAY, 3, 1, 1); - sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(30, OP_EQ, cell_stats->total_time_exitward[CELL_RELAY]); - tt_u64_op(1, OP_EQ, cell_stats->removed_cells_exitward[CELL_RELAY]); - - done: - tor_free(cell_stats); - tor_free(or_circ); -} - -static void -test_cntev_append_cell_stats(void *arg) -{ - smartlist_t *event_parts; - char *cp = NULL; - const char *key = "Z"; - uint64_t include_if_non_zero[CELL_COMMAND_MAX_ + 1], - number_to_include[CELL_COMMAND_MAX_ + 1]; - (void)arg; - - event_parts = smartlist_new(); - memset(include_if_non_zero, 0, - (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t)); - memset(number_to_include, 0, - (CELL_COMMAND_MAX_ + 1) * sizeof(uint64_t)); - - /* All array entries empty. */ - append_cell_stats_by_command(event_parts, key, - include_if_non_zero, - number_to_include); - tt_int_op(0, OP_EQ, smartlist_len(event_parts)); - - /* There's a RELAY cell to include, but the corresponding field in - * include_if_non_zero is still zero. */ - number_to_include[CELL_RELAY] = 1; - append_cell_stats_by_command(event_parts, key, - include_if_non_zero, - number_to_include); - tt_int_op(0, OP_EQ, smartlist_len(event_parts)); - - /* Now include single RELAY cell. */ - include_if_non_zero[CELL_RELAY] = 2; - append_cell_stats_by_command(event_parts, key, - include_if_non_zero, - number_to_include); - cp = smartlist_pop_last(event_parts); - tt_str_op("Z=relay:1", OP_EQ, cp); - tor_free(cp); - - /* Add four CREATE cells. */ - include_if_non_zero[CELL_CREATE] = 3; - number_to_include[CELL_CREATE] = 4; - append_cell_stats_by_command(event_parts, key, - include_if_non_zero, - number_to_include); - cp = smartlist_pop_last(event_parts); - tt_str_op("Z=create:4,relay:1", OP_EQ, cp); - - done: - tor_free(cp); - smartlist_free(event_parts); -} - -static void -test_cntev_format_cell_stats(void *arg) -{ - char *event_string = NULL; - origin_circuit_t *ocirc = NULL; - or_circuit_t *or_circ = NULL; - cell_stats_t *cell_stats = NULL; - channel_tls_t *n_chan=NULL, *p_chan=NULL; - (void)arg; - - n_chan = tor_malloc_zero(sizeof(channel_tls_t)); - n_chan->base_.global_identifier = 1; - - ocirc = tor_malloc_zero(sizeof(origin_circuit_t)); - ocirc->base_.magic = ORIGIN_CIRCUIT_MAGIC; - ocirc->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; - ocirc->global_identifier = 2; - ocirc->base_.n_circ_id = 3; - ocirc->base_.n_chan = &(n_chan->base_); - - /* Origin circuit was completely idle. */ - cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); - format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); - tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", OP_EQ, event_string); - tor_free(event_string); - - /* Origin circuit had 4 RELAY cells added to its exitward queue. */ - cell_stats->added_cells_exitward[CELL_RELAY] = 4; - format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); - tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4", - OP_EQ, event_string); - tor_free(event_string); - - /* Origin circuit also had 5 CREATE2 cells added to its exitward - * queue. */ - cell_stats->added_cells_exitward[CELL_CREATE2] = 5; - format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); - tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," - "create2:5", OP_EQ, event_string); - tor_free(event_string); - - /* Origin circuit also had 7 RELAY cells removed from its exitward queue - * which together spent 6 msec in the queue. */ - cell_stats->total_time_exitward[CELL_RELAY] = 6; - cell_stats->removed_cells_exitward[CELL_RELAY] = 7; - format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); - tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," - "create2:5 OutboundRemoved=relay:7 OutboundTime=relay:6", - OP_EQ, event_string); - tor_free(event_string); - - p_chan = tor_malloc_zero(sizeof(channel_tls_t)); - p_chan->base_.global_identifier = 2; - - or_circ = tor_malloc_zero(sizeof(or_circuit_t)); - or_circ->base_.magic = OR_CIRCUIT_MAGIC; - or_circ->base_.purpose = CIRCUIT_PURPOSE_OR; - or_circ->p_circ_id = 8; - or_circ->p_chan = &(p_chan->base_); - or_circ->base_.n_circ_id = 9; - or_circ->base_.n_chan = &(n_chan->base_); - - tor_free(cell_stats); - - /* OR circuit was idle. */ - cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); - format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); - tt_str_op("InboundQueue=8 InboundConn=2 OutboundQueue=9 OutboundConn=1", - OP_EQ, event_string); - tor_free(event_string); - - /* OR circuit had 3 RELAY cells added to its appward queue. */ - cell_stats->added_cells_appward[CELL_RELAY] = 3; - format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); - tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " - "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); - tor_free(event_string); - - /* OR circuit had 7 RELAY cells removed from its appward queue which - * together spent 6 msec in the queue. */ - cell_stats->total_time_appward[CELL_RELAY] = 6; - cell_stats->removed_cells_appward[CELL_RELAY] = 7; - format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); - tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " - "InboundRemoved=relay:7 InboundTime=relay:6 " - "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); - - done: - tor_free(cell_stats); - tor_free(event_string); - tor_free(or_circ); - tor_free(ocirc); - tor_free(p_chan); - tor_free(n_chan); -} - -static void -test_cntev_event_mask(void *arg) -{ - unsigned int test_event, selected_event; - (void)arg; - - /* Check that nothing is interesting when no events are set */ - control_testing_set_global_event_mask(EVENT_MASK_NONE_); - - /* Check that nothing is interesting between EVENT_MIN_ and EVENT_MAX_ */ - for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) - tt_assert(!control_event_is_interesting(test_event)); - - /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ - * This will break if control_event_is_interesting() checks its arguments */ - for (test_event = 0; test_event < EVENT_MIN_; test_event++) - tt_assert(!control_event_is_interesting(test_event)); - for (test_event = EVENT_MAX_ + 1; - test_event < EVENT_CAPACITY_; - test_event++) - tt_assert(!control_event_is_interesting(test_event)); - - /* Check that all valid events are interesting when all events are set */ - control_testing_set_global_event_mask(EVENT_MASK_ALL_); - - /* Check that everything is interesting between EVENT_MIN_ and EVENT_MAX_ */ - for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) - tt_assert(control_event_is_interesting(test_event)); - - /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ - * This will break if control_event_is_interesting() checks its arguments */ - for (test_event = 0; test_event < EVENT_MIN_; test_event++) - tt_assert(!control_event_is_interesting(test_event)); - for (test_event = EVENT_MAX_ + 1; - test_event < EVENT_CAPACITY_; - test_event++) - tt_assert(!control_event_is_interesting(test_event)); - - /* Check that only that event is interesting when a single event is set */ - for (selected_event = EVENT_MIN_; - selected_event <= EVENT_MAX_; - selected_event++) { - control_testing_set_global_event_mask(EVENT_MASK_(selected_event)); - - /* Check that only this event is interesting - * between EVENT_MIN_ and EVENT_MAX_ */ - for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) { - if (test_event == selected_event) { - tt_assert(control_event_is_interesting(test_event)); - } else { - tt_assert(!control_event_is_interesting(test_event)); - } - } - - /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ - * This will break if control_event_is_interesting checks its arguments */ - for (test_event = 0; test_event < EVENT_MIN_; test_event++) - tt_assert(!control_event_is_interesting(test_event)); - for (test_event = EVENT_MAX_ + 1; - test_event < EVENT_CAPACITY_; - test_event++) - tt_assert(!control_event_is_interesting(test_event)); - } - - /* Check that only that event is not-interesting - * when a single event is un-set */ - for (selected_event = EVENT_MIN_; - selected_event <= EVENT_MAX_; - selected_event++) { - control_testing_set_global_event_mask( - EVENT_MASK_ALL_ - & ~(EVENT_MASK_(selected_event)) - ); - - /* Check that only this event is not-interesting - * between EVENT_MIN_ and EVENT_MAX_ */ - for (test_event = EVENT_MIN_; test_event <= EVENT_MAX_; test_event++) { - if (test_event == selected_event) { - tt_assert(!control_event_is_interesting(test_event)); - } else { - tt_assert(control_event_is_interesting(test_event)); - } - } - - /* Check that nothing is interesting outside EVENT_MIN_ to EVENT_MAX_ - * This will break if control_event_is_interesting checks its arguments */ - for (test_event = 0; test_event < EVENT_MIN_; test_event++) - tt_assert(!control_event_is_interesting(test_event)); - for (test_event = EVENT_MAX_ + 1; - test_event < EVENT_CAPACITY_; - test_event++) - tt_assert(!control_event_is_interesting(test_event)); - } - - done: - ; -} - -#define TEST(name, flags) \ - { #name, test_cntev_ ## name, flags, 0, NULL } - -struct testcase_t controller_event_tests[] = { - TEST(bucket_note_empty, TT_FORK), - TEST(bucket_millis_empty, TT_FORK), - TEST(sum_up_cell_stats, TT_FORK), - TEST(append_cell_stats, TT_FORK), - TEST(format_cell_stats, TT_FORK), - TEST(event_mask, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_crypto.c b/src/tor/src/test/test_crypto.c deleted file mode 100644 index c8443fd3b..000000000 --- a/src/tor/src/test/test_crypto.c +++ /dev/null @@ -1,3028 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define CRYPTO_CURVE25519_PRIVATE -#define CRYPTO_PRIVATE -#include "or.h" -#include "test.h" -#include "aes.h" -#include "util.h" -#include "siphash.h" -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "ed25519_vectors.inc" - -/** Run unit tests for Diffie-Hellman functionality. */ -static void -test_crypto_dh(void *arg) -{ - crypto_dh_t *dh1 = crypto_dh_new(DH_TYPE_CIRCUIT); - crypto_dh_t *dh1_dup = NULL; - crypto_dh_t *dh2 = crypto_dh_new(DH_TYPE_CIRCUIT); - char p1[DH_BYTES]; - char p2[DH_BYTES]; - char s1[DH_BYTES]; - char s2[DH_BYTES]; - ssize_t s1len, s2len; - - (void)arg; - tt_int_op(crypto_dh_get_bytes(dh1),OP_EQ, DH_BYTES); - tt_int_op(crypto_dh_get_bytes(dh2),OP_EQ, DH_BYTES); - - memset(p1, 0, DH_BYTES); - memset(p2, 0, DH_BYTES); - tt_mem_op(p1,OP_EQ, p2, DH_BYTES); - - tt_int_op(-1, OP_EQ, crypto_dh_get_public(dh1, p1, 6)); /* too short */ - - tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); - tt_mem_op(p1,OP_NE, p2, DH_BYTES); - tt_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES)); - tt_mem_op(p1,OP_NE, p2, DH_BYTES); - - memset(s1, 0, DH_BYTES); - memset(s2, 0xFF, DH_BYTES); - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p2, DH_BYTES, s1, 50); - s2len = crypto_dh_compute_secret(LOG_WARN, dh2, p1, DH_BYTES, s2, 50); - tt_assert(s1len > 0); - tt_int_op(s1len,OP_EQ, s2len); - tt_mem_op(s1,OP_EQ, s2, s1len); - - /* test dh_dup; make sure it works the same. */ - dh1_dup = crypto_dh_dup(dh1); - s1len = crypto_dh_compute_secret(LOG_WARN, dh1_dup, p2, DH_BYTES, s1, 50); - tt_mem_op(s1,OP_EQ, s2, s1len); - - { - /* Now fabricate some bad values and make sure they get caught. */ - - /* 1 and 0 should both fail. */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x01", 1, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x00", 1, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - memset(p1, 0, DH_BYTES); /* 0 with padding. */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - p1[DH_BYTES-1] = 1; /* 1 with padding*/ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - /* 2 is okay, though weird. */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, "\x02", 1, s1, 50); - tt_int_op(50, OP_EQ, s1len); - - const char P[] = - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" - "49286651ECE65381FFFFFFFFFFFFFFFF"; - - /* p-1, p, and so on are not okay. */ - base16_decode(p1, sizeof(p1), P, strlen(P)); - - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - p1[DH_BYTES-1] = 0xFE; /* p-1 */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - p1[DH_BYTES-1] = 0xFD; /* p-2 works fine */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(50, OP_EQ, s1len); - - const char P_plus_one[] = - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" - "49286651ECE653820000000000000000"; - - base16_decode(p1, sizeof(p1), P_plus_one, strlen(P_plus_one)); - - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - p1[DH_BYTES-1] = 0x01; /* p+2 */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - p1[DH_BYTES-1] = 0xff; /* p+256 */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - - memset(p1, 0xff, DH_BYTES), /* 2^1024-1 */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p1, DH_BYTES, s1, 50); - tt_int_op(-1, OP_EQ, s1len); - } - - { - /* provoke an error in the openssl DH_compute_key function; make sure we - * survive. */ - tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); - - crypto_dh_free(dh2); - dh2= crypto_dh_new(DH_TYPE_CIRCUIT); /* no private key set */ - s1len = crypto_dh_compute_secret(LOG_WARN, dh2, - p1, DH_BYTES, - s1, 50); - tt_int_op(s1len, OP_EQ, -1); - } - - done: - crypto_dh_free(dh1); - crypto_dh_free(dh2); - crypto_dh_free(dh1_dup); -} - -static void -test_crypto_openssl_version(void *arg) -{ - (void)arg; - const char *version = crypto_openssl_get_version_str(); - const char *h_version = crypto_openssl_get_header_version_str(); - tt_assert(version); - tt_assert(h_version); - tt_assert(!strcmpstart(version, h_version)); /* "-fips" suffix, etc */ - tt_assert(!strstr(version, "OpenSSL")); - int a=-1,b=-1,c=-1; - if (!strcmpstart(version, "LibreSSL") || !strcmpstart(version, "BoringSSL")) - return; - int r = tor_sscanf(version, "%d.%d.%d", &a,&b,&c); - tt_int_op(r, OP_EQ, 3); - tt_int_op(a, OP_GE, 0); - tt_int_op(b, OP_GE, 0); - tt_int_op(c, OP_GE, 0); - - done: - ; -} - -/** Run unit tests for our random number generation function and its wrappers. - */ -static void -test_crypto_rng(void *arg) -{ - int i, j, allok; - char data1[100], data2[100]; - double d; - char *h=NULL; - - /* Try out RNG. */ - (void)arg; - tt_assert(! crypto_seed_rng()); - crypto_rand(data1, 100); - crypto_rand(data2, 100); - tt_mem_op(data1,OP_NE, data2,100); - allok = 1; - for (i = 0; i < 100; ++i) { - uint64_t big; - char *host; - j = crypto_rand_int(100); - if (j < 0 || j >= 100) - allok = 0; - big = crypto_rand_uint64(U64_LITERAL(1)<<40); - if (big >= (U64_LITERAL(1)<<40)) - allok = 0; - big = crypto_rand_uint64(U64_LITERAL(5)); - if (big >= 5) - allok = 0; - d = crypto_rand_double(); - tt_assert(d >= 0); - tt_assert(d < 1.0); - host = crypto_random_hostname(3,8,"www.",".onion"); - if (strcmpstart(host,"www.") || - strcmpend(host,".onion") || - strlen(host) < 13 || - strlen(host) > 18) - allok = 0; - tor_free(host); - } - - /* Make sure crypto_random_hostname clips its inputs properly. */ - h = crypto_random_hostname(20000, 9000, "www.", ".onion"); - tt_assert(! strcmpstart(h,"www.")); - tt_assert(! strcmpend(h,".onion")); - tt_int_op(63+4+6, OP_EQ, strlen(h)); - - tt_assert(allok); - done: - tor_free(h); -} - -static void -test_crypto_rng_range(void *arg) -{ - int got_smallest = 0, got_largest = 0; - int i; - - (void)arg; - for (i = 0; i < 1000; ++i) { - int x = crypto_rand_int_range(5,9); - tt_int_op(x, OP_GE, 5); - tt_int_op(x, OP_LT, 9); - if (x == 5) - got_smallest = 1; - if (x == 8) - got_largest = 1; - } - /* These fail with probability 1/10^603. */ - tt_assert(got_smallest); - tt_assert(got_largest); - - got_smallest = got_largest = 0; - const uint64_t ten_billion = 10 * ((uint64_t)1000000000000); - for (i = 0; i < 1000; ++i) { - uint64_t x = crypto_rand_uint64_range(ten_billion, ten_billion+10); - tt_u64_op(x, OP_GE, ten_billion); - tt_u64_op(x, OP_LT, ten_billion+10); - if (x == ten_billion) - got_smallest = 1; - if (x == ten_billion+9) - got_largest = 1; - } - - tt_assert(got_smallest); - tt_assert(got_largest); - - const time_t now = time(NULL); - for (i = 0; i < 2000; ++i) { - time_t x = crypto_rand_time_range(now, now+60); - tt_i64_op(x, OP_GE, now); - tt_i64_op(x, OP_LT, now+60); - if (x == now) - got_smallest = 1; - if (x == now+59) - got_largest = 1; - } - - tt_assert(got_smallest); - tt_assert(got_largest); - done: - ; -} - -static void -test_crypto_rng_strongest(void *arg) -{ - const char *how = arg; - int broken = 0; - - if (how == NULL) { - ; - } else if (!strcmp(how, "nosyscall")) { - break_strongest_rng_syscall = 1; - } else if (!strcmp(how, "nofallback")) { - break_strongest_rng_fallback = 1; - } else if (!strcmp(how, "broken")) { - broken = break_strongest_rng_syscall = break_strongest_rng_fallback = 1; - } - -#define N 128 - uint8_t combine_and[N]; - uint8_t combine_or[N]; - int i, j; - - memset(combine_and, 0xff, N); - memset(combine_or, 0, N); - - for (i = 0; i < 100; ++i) { /* 2^-100 chances just don't happen. */ - uint8_t output[N]; - memset(output, 0, N); - if (how == NULL) { - /* this one can't fail. */ - crypto_strongest_rand(output, sizeof(output)); - } else { - int r = crypto_strongest_rand_raw(output, sizeof(output)); - if (r == -1) { - if (broken) { - goto done; /* we're fine. */ - } - /* This function is allowed to break, but only if it always breaks. */ - tt_int_op(i, OP_EQ, 0); - tt_skip(); - } else { - tt_assert(! broken); - } - } - for (j = 0; j < N; ++j) { - combine_and[j] &= output[j]; - combine_or[j] |= output[j]; - } - } - - for (j = 0; j < N; ++j) { - tt_int_op(combine_and[j], OP_EQ, 0); - tt_int_op(combine_or[j], OP_EQ, 0xff); - } - done: - ; -#undef N -} - -/** Run unit tests for our AES128 functionality */ -static void -test_crypto_aes128(void *arg) -{ - char *data1 = NULL, *data2 = NULL, *data3 = NULL; - crypto_cipher_t *env1 = NULL, *env2 = NULL; - int i, j; - char *mem_op_hex_tmp=NULL; - char key[CIPHER_KEY_LEN]; - int use_evp = !strcmp(arg,"evp"); - evaluate_evp_for_aes(use_evp); - evaluate_ctr_for_aes(); - - data1 = tor_malloc(1024); - data2 = tor_malloc(1024); - data3 = tor_malloc(1024); - - /* Now, test encryption and decryption with stream cipher. */ - data1[0]='\0'; - for (i = 1023; i>0; i -= 35) - strncat(data1, "Now is the time for all good onions", i); - - memset(data2, 0, 1024); - memset(data3, 0, 1024); - crypto_rand(key, sizeof(key)); - env1 = crypto_cipher_new(key); - tt_ptr_op(env1, OP_NE, NULL); - env2 = crypto_cipher_new(key); - tt_ptr_op(env2, OP_NE, NULL); - - /* Try encrypting 512 chars. */ - crypto_cipher_encrypt(env1, data2, data1, 512); - crypto_cipher_decrypt(env2, data3, data2, 512); - tt_mem_op(data1,OP_EQ, data3, 512); - tt_mem_op(data1,OP_NE, data2, 512); - - /* Now encrypt 1 at a time, and get 1 at a time. */ - for (j = 512; j < 560; ++j) { - crypto_cipher_encrypt(env1, data2+j, data1+j, 1); - } - for (j = 512; j < 560; ++j) { - crypto_cipher_decrypt(env2, data3+j, data2+j, 1); - } - tt_mem_op(data1,OP_EQ, data3, 560); - /* Now encrypt 3 at a time, and get 5 at a time. */ - for (j = 560; j < 1024-5; j += 3) { - crypto_cipher_encrypt(env1, data2+j, data1+j, 3); - } - for (j = 560; j < 1024-5; j += 5) { - crypto_cipher_decrypt(env2, data3+j, data2+j, 5); - } - tt_mem_op(data1,OP_EQ, data3, 1024-5); - /* Now make sure that when we encrypt with different chunk sizes, we get - the same results. */ - crypto_cipher_free(env2); - env2 = NULL; - - memset(data3, 0, 1024); - env2 = crypto_cipher_new(key); - tt_ptr_op(env2, OP_NE, NULL); - for (j = 0; j < 1024-16; j += 17) { - crypto_cipher_encrypt(env2, data3+j, data1+j, 17); - } - for (j= 0; j < 1024-16; ++j) { - if (data2[j] != data3[j]) { - printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]); - } - } - tt_mem_op(data2,OP_EQ, data3, 1024-16); - crypto_cipher_free(env1); - env1 = NULL; - crypto_cipher_free(env2); - env2 = NULL; - - /* NIST test vector for aes. */ - /* IV starts at 0 */ - env1 = crypto_cipher_new("\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00"); - crypto_cipher_encrypt(env1, data1, - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", 16); - test_memeq_hex(data1, "0EDD33D3C621E546455BD8BA1418BEC8"); - - /* Now test rollover. All these values are originally from a python - * script. */ - crypto_cipher_free(env1); - env1 = crypto_cipher_new_with_iv( - "\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\xff"); - memset(data2, 0, 1024); - crypto_cipher_encrypt(env1, data1, data2, 32); - test_memeq_hex(data1, "335fe6da56f843199066c14a00a40231" - "cdd0b917dbc7186908a6bfb5ffd574d3"); - crypto_cipher_free(env1); - env1 = crypto_cipher_new_with_iv( - "\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff"); - memset(data2, 0, 1024); - crypto_cipher_encrypt(env1, data1, data2, 32); - test_memeq_hex(data1, "e627c6423fa2d77832a02b2794094b73" - "3e63c721df790d2c6469cc1953a3ffac"); - crypto_cipher_free(env1); - env1 = crypto_cipher_new_with_iv( - "\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff"); - memset(data2, 0, 1024); - crypto_cipher_encrypt(env1, data1, data2, 32); - test_memeq_hex(data1, "2aed2bff0de54f9328efd070bf48f70a" - "0EDD33D3C621E546455BD8BA1418BEC8"); - - /* Now check rollover on inplace cipher. */ - crypto_cipher_free(env1); - env1 = crypto_cipher_new_with_iv( - "\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff"); - crypto_cipher_crypt_inplace(env1, data2, 64); - test_memeq_hex(data2, "2aed2bff0de54f9328efd070bf48f70a" - "0EDD33D3C621E546455BD8BA1418BEC8" - "93e2c5243d6839eac58503919192f7ae" - "1908e67cafa08d508816659c2e693191"); - crypto_cipher_free(env1); - env1 = crypto_cipher_new_with_iv( - "\x80\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00", - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff"); - crypto_cipher_crypt_inplace(env1, data2, 64); - tt_assert(tor_mem_is_zero(data2, 64)); - - done: - tor_free(mem_op_hex_tmp); - if (env1) - crypto_cipher_free(env1); - if (env2) - crypto_cipher_free(env2); - tor_free(data1); - tor_free(data2); - tor_free(data3); -} - -static void -test_crypto_aes_ctr_testvec(void *arg) -{ - const char *bitstr = arg; - char *mem_op_hex_tmp=NULL; - crypto_cipher_t *c=NULL; - - /* from NIST SP800-38a, section F.5 */ - const char ctr16[] = "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; - const char plaintext16[] = - "6bc1bee22e409f96e93d7e117393172a" - "ae2d8a571e03ac9c9eb76fac45af8e51" - "30c81c46a35ce411e5fbc1191a0a52ef" - "f69f2445df4f9b17ad2b417be66c3710"; - const char *ciphertext16; - const char *key16; - int bits; - - if (!strcmp(bitstr, "128")) { - ciphertext16 = /* section F.5.1 */ - "874d6191b620e3261bef6864990db6ce" - "9806f66b7970fdff8617187bb9fffdff" - "5ae4df3edbd5d35e5b4f09020db03eab" - "1e031dda2fbe03d1792170a0f3009cee"; - key16 = "2b7e151628aed2a6abf7158809cf4f3c"; - bits = 128; - } else if (!strcmp(bitstr, "192")) { - ciphertext16 = /* section F.5.3 */ - "1abc932417521ca24f2b0459fe7e6e0b" - "090339ec0aa6faefd5ccc2c6f4ce8e94" - "1e36b26bd1ebc670d1bd1d665620abf7" - "4f78a7f6d29809585a97daec58c6b050"; - key16 = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"; - bits = 192; - } else if (!strcmp(bitstr, "256")) { - ciphertext16 = /* section F.5.5 */ - "601ec313775789a5b7a7f504bbf3d228" - "f443e3ca4d62b59aca84e990cacaf5c5" - "2b0930daa23de94ce87017ba2d84988d" - "dfc9c58db67aada613c2dd08457941a6"; - key16 = - "603deb1015ca71be2b73aef0857d7781" - "1f352c073b6108d72d9810a30914dff4"; - bits = 256; - } else { - tt_abort_msg("AES doesn't support this number of bits."); - } - - char key[32]; - char iv[16]; - char plaintext[16*4]; - memset(key, 0xf9, sizeof(key)); /* poison extra bytes */ - base16_decode(key, sizeof(key), key16, strlen(key16)); - base16_decode(iv, sizeof(iv), ctr16, strlen(ctr16)); - base16_decode(plaintext, sizeof(plaintext), - plaintext16, strlen(plaintext16)); - - c = crypto_cipher_new_with_iv_and_bits((uint8_t*)key, (uint8_t*)iv, bits); - crypto_cipher_crypt_inplace(c, plaintext, sizeof(plaintext)); - test_memeq_hex(plaintext, ciphertext16); - - done: - tor_free(mem_op_hex_tmp); - crypto_cipher_free(c); -} - -/** Run unit tests for our SHA-1 functionality */ -static void -test_crypto_sha(void *arg) -{ - crypto_digest_t *d1 = NULL, *d2 = NULL; - int i; -#define RFC_4231_MAX_KEY_SIZE 131 - char key[RFC_4231_MAX_KEY_SIZE]; - char digest[DIGEST256_LEN]; - char data[DIGEST512_LEN]; - char d_out1[DIGEST512_LEN], d_out2[DIGEST512_LEN]; - char *mem_op_hex_tmp=NULL; - - /* Test SHA-1 with a test vector from the specification. */ - (void)arg; - i = crypto_digest(data, "abc", 3); - test_memeq_hex(data, "A9993E364706816ABA3E25717850C26C9CD0D89D"); - tt_int_op(i, OP_EQ, 0); - - /* Test SHA-256 with a test vector from the specification. */ - i = crypto_digest256(data, "abc", 3, DIGEST_SHA256); - test_memeq_hex(data, "BA7816BF8F01CFEA414140DE5DAE2223B00361A3" - "96177A9CB410FF61F20015AD"); - tt_int_op(i, OP_EQ, 0); - - /* Test SHA-512 with a test vector from the specification. */ - i = crypto_digest512(data, "abc", 3, DIGEST_SHA512); - test_memeq_hex(data, "ddaf35a193617abacc417349ae20413112e6fa4e89a97" - "ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3" - "feebbd454d4423643ce80e2a9ac94fa54ca49f"); - tt_int_op(i, OP_EQ, 0); - - /* Test HMAC-SHA256 with test cases from wikipedia and RFC 4231 */ - - /* Case empty (wikipedia) */ - crypto_hmac_sha256(digest, "", 0, "", 0); - tt_str_op(hex_str(digest, 32),OP_EQ, - "B613679A0814D9EC772F95D778C35FC5FF1697C493715653C6C712144292C5AD"); - - /* Case quick-brown (wikipedia) */ - crypto_hmac_sha256(digest, "key", 3, - "The quick brown fox jumps over the lazy dog", 43); - tt_str_op(hex_str(digest, 32),OP_EQ, - "F7BC83F430538424B13298E6AA6FB143EF4D59A14946175997479DBC2D1A3CD8"); - - /* "Test Case 1" from RFC 4231 */ - memset(key, 0x0b, 20); - crypto_hmac_sha256(digest, key, 20, "Hi There", 8); - test_memeq_hex(digest, - "b0344c61d8db38535ca8afceaf0bf12b" - "881dc200c9833da726e9376c2e32cff7"); - - /* "Test Case 2" from RFC 4231 */ - memset(key, 0x0b, 20); - crypto_hmac_sha256(digest, "Jefe", 4, "what do ya want for nothing?", 28); - test_memeq_hex(digest, - "5bdcc146bf60754e6a042426089575c7" - "5a003f089d2739839dec58b964ec3843"); - - /* "Test case 3" from RFC 4231 */ - memset(key, 0xaa, 20); - memset(data, 0xdd, 50); - crypto_hmac_sha256(digest, key, 20, data, 50); - test_memeq_hex(digest, - "773ea91e36800e46854db8ebd09181a7" - "2959098b3ef8c122d9635514ced565fe"); - - /* "Test case 4" from RFC 4231 */ - base16_decode(key, 25, - "0102030405060708090a0b0c0d0e0f10111213141516171819", 50); - memset(data, 0xcd, 50); - crypto_hmac_sha256(digest, key, 25, data, 50); - test_memeq_hex(digest, - "82558a389a443c0ea4cc819899f2083a" - "85f0faa3e578f8077a2e3ff46729665b"); - - /* "Test case 5" from RFC 4231 */ - memset(key, 0x0c, 20); - crypto_hmac_sha256(digest, key, 20, "Test With Truncation", 20); - test_memeq_hex(digest, - "a3b6167473100ee06e0c796c2955552b"); - - /* "Test case 6" from RFC 4231 */ - memset(key, 0xaa, 131); - crypto_hmac_sha256(digest, key, 131, - "Test Using Larger Than Block-Size Key - Hash Key First", - 54); - test_memeq_hex(digest, - "60e431591ee0b67f0d8a26aacbf5b77f" - "8e0bc6213728c5140546040f0ee37f54"); - - /* "Test case 7" from RFC 4231 */ - memset(key, 0xaa, 131); - crypto_hmac_sha256(digest, key, 131, - "This is a test using a larger than block-size key and a " - "larger than block-size data. The key needs to be hashed " - "before being used by the HMAC algorithm.", 152); - test_memeq_hex(digest, - "9b09ffa71b942fcb27635fbcd5b0e944" - "bfdc63644f0713938a7f51535c3a35e2"); - - /* Incremental digest code. */ - d1 = crypto_digest_new(); - tt_assert(d1); - crypto_digest_add_bytes(d1, "abcdef", 6); - d2 = crypto_digest_dup(d1); - tt_assert(d2); - crypto_digest_add_bytes(d2, "ghijkl", 6); - crypto_digest_get_digest(d2, d_out1, DIGEST_LEN); - crypto_digest(d_out2, "abcdefghijkl", 12); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); - crypto_digest_assign(d2, d1); - crypto_digest_add_bytes(d2, "mno", 3); - crypto_digest_get_digest(d2, d_out1, DIGEST_LEN); - crypto_digest(d_out2, "abcdefmno", 9); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); - crypto_digest_get_digest(d1, d_out1, DIGEST_LEN); - crypto_digest(d_out2, "abcdef", 6); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); - crypto_digest_free(d1); - crypto_digest_free(d2); - - /* Incremental digest code with sha256 */ - d1 = crypto_digest256_new(DIGEST_SHA256); - tt_assert(d1); - crypto_digest_add_bytes(d1, "abcdef", 6); - d2 = crypto_digest_dup(d1); - tt_assert(d2); - crypto_digest_add_bytes(d2, "ghijkl", 6); - crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_assign(d2, d1); - crypto_digest_add_bytes(d2, "mno", 3); - crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_get_digest(d1, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_free(d1); - crypto_digest_free(d2); - - /* Incremental digest code with sha512 */ - d1 = crypto_digest512_new(DIGEST_SHA512); - tt_assert(d1); - crypto_digest_add_bytes(d1, "abcdef", 6); - d2 = crypto_digest_dup(d1); - tt_assert(d2); - crypto_digest_add_bytes(d2, "ghijkl", 6); - crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdefghijkl", 12, DIGEST_SHA512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - crypto_digest_assign(d2, d1); - crypto_digest_add_bytes(d2, "mno", 3); - crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdefmno", 9, DIGEST_SHA512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdef", 6, DIGEST_SHA512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - - done: - if (d1) - crypto_digest_free(d1); - if (d2) - crypto_digest_free(d2); - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_sha3(void *arg) -{ - crypto_digest_t *d1 = NULL, *d2 = NULL; - int i; - char data[DIGEST512_LEN]; - char d_out1[DIGEST512_LEN], d_out2[DIGEST512_LEN]; - char *mem_op_hex_tmp=NULL; - char *large = NULL; - - (void)arg; - - /* Test SHA3-[256,512] with a test vectors from the Keccak Code Package. - * - * NB: The code package's test vectors have length expressed in bits. - */ - - /* Len = 8, Msg = CC */ - const uint8_t keccak_kat_msg8[] = { 0xcc }; - i = crypto_digest256(data, (const char*)keccak_kat_msg8, 1, DIGEST_SHA3_256); - test_memeq_hex(data, "677035391CD3701293D385F037BA3279" - "6252BB7CE180B00B582DD9B20AAAD7F0"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, (const char*)keccak_kat_msg8, 1, DIGEST_SHA3_512); - test_memeq_hex(data, "3939FCC8B57B63612542DA31A834E5DC" - "C36E2EE0F652AC72E02624FA2E5ADEEC" - "C7DD6BB3580224B4D6138706FC6E8059" - "7B528051230B00621CC2B22999EAA205"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 24, Msg = 1F877C */ - const uint8_t keccak_kat_msg24[] = { 0x1f, 0x87, 0x7c }; - i = crypto_digest256(data, (const char*)keccak_kat_msg24, 3, - DIGEST_SHA3_256); - test_memeq_hex(data, "BC22345E4BD3F792A341CF18AC0789F1" - "C9C966712A501B19D1B6632CCD408EC5"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, (const char*)keccak_kat_msg24, 3, - DIGEST_SHA3_512); - test_memeq_hex(data, "CB20DCF54955F8091111688BECCEF48C" - "1A2F0D0608C3A575163751F002DB30F4" - "0F2F671834B22D208591CFAF1F5ECFE4" - "3C49863A53B3225BDFD7C6591BA7658B"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1080, Msg = B771D5CEF... ...C35AC81B5 (SHA3-256 rate - 1) */ - const uint8_t keccak_kat_msg1080[] = { - 0xB7, 0x71, 0xD5, 0xCE, 0xF5, 0xD1, 0xA4, 0x1A, 0x93, 0xD1, - 0x56, 0x43, 0xD7, 0x18, 0x1D, 0x2A, 0x2E, 0xF0, 0xA8, 0xE8, - 0x4D, 0x91, 0x81, 0x2F, 0x20, 0xED, 0x21, 0xF1, 0x47, 0xBE, - 0xF7, 0x32, 0xBF, 0x3A, 0x60, 0xEF, 0x40, 0x67, 0xC3, 0x73, - 0x4B, 0x85, 0xBC, 0x8C, 0xD4, 0x71, 0x78, 0x0F, 0x10, 0xDC, - 0x9E, 0x82, 0x91, 0xB5, 0x83, 0x39, 0xA6, 0x77, 0xB9, 0x60, - 0x21, 0x8F, 0x71, 0xE7, 0x93, 0xF2, 0x79, 0x7A, 0xEA, 0x34, - 0x94, 0x06, 0x51, 0x28, 0x29, 0x06, 0x5D, 0x37, 0xBB, 0x55, - 0xEA, 0x79, 0x6F, 0xA4, 0xF5, 0x6F, 0xD8, 0x89, 0x6B, 0x49, - 0xB2, 0xCD, 0x19, 0xB4, 0x32, 0x15, 0xAD, 0x96, 0x7C, 0x71, - 0x2B, 0x24, 0xE5, 0x03, 0x2D, 0x06, 0x52, 0x32, 0xE0, 0x2C, - 0x12, 0x74, 0x09, 0xD2, 0xED, 0x41, 0x46, 0xB9, 0xD7, 0x5D, - 0x76, 0x3D, 0x52, 0xDB, 0x98, 0xD9, 0x49, 0xD3, 0xB0, 0xFE, - 0xD6, 0xA8, 0x05, 0x2F, 0xBB, - }; - i = crypto_digest256(data, (const char*)keccak_kat_msg1080, 135, - DIGEST_SHA3_256); - test_memeq_hex(data, "A19EEE92BB2097B64E823D597798AA18" - "BE9B7C736B8059ABFD6779AC35AC81B5"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, (const char*)keccak_kat_msg1080, 135, - DIGEST_SHA3_512); - test_memeq_hex(data, "7575A1FB4FC9A8F9C0466BD5FCA496D1" - "CB78696773A212A5F62D02D14E3259D1" - "92A87EBA4407DD83893527331407B6DA" - "DAAD920DBC46489B677493CE5F20B595"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1088, Msg = B32D95B0... ...8E380C04 (SHA3-256 rate) */ - const uint8_t keccak_kat_msg1088[] = { - 0xB3, 0x2D, 0x95, 0xB0, 0xB9, 0xAA, 0xD2, 0xA8, 0x81, 0x6D, - 0xE6, 0xD0, 0x6D, 0x1F, 0x86, 0x00, 0x85, 0x05, 0xBD, 0x8C, - 0x14, 0x12, 0x4F, 0x6E, 0x9A, 0x16, 0x3B, 0x5A, 0x2A, 0xDE, - 0x55, 0xF8, 0x35, 0xD0, 0xEC, 0x38, 0x80, 0xEF, 0x50, 0x70, - 0x0D, 0x3B, 0x25, 0xE4, 0x2C, 0xC0, 0xAF, 0x05, 0x0C, 0xCD, - 0x1B, 0xE5, 0xE5, 0x55, 0xB2, 0x30, 0x87, 0xE0, 0x4D, 0x7B, - 0xF9, 0x81, 0x36, 0x22, 0x78, 0x0C, 0x73, 0x13, 0xA1, 0x95, - 0x4F, 0x87, 0x40, 0xB6, 0xEE, 0x2D, 0x3F, 0x71, 0xF7, 0x68, - 0xDD, 0x41, 0x7F, 0x52, 0x04, 0x82, 0xBD, 0x3A, 0x08, 0xD4, - 0xF2, 0x22, 0xB4, 0xEE, 0x9D, 0xBD, 0x01, 0x54, 0x47, 0xB3, - 0x35, 0x07, 0xDD, 0x50, 0xF3, 0xAB, 0x42, 0x47, 0xC5, 0xDE, - 0x9A, 0x8A, 0xBD, 0x62, 0xA8, 0xDE, 0xCE, 0xA0, 0x1E, 0x3B, - 0x87, 0xC8, 0xB9, 0x27, 0xF5, 0xB0, 0x8B, 0xEB, 0x37, 0x67, - 0x4C, 0x6F, 0x8E, 0x38, 0x0C, 0x04, - }; - i = crypto_digest256(data, (const char*)keccak_kat_msg1088, 136, - DIGEST_SHA3_256); - test_memeq_hex(data, "DF673F4105379FF6B755EEAB20CEB0DC" - "77B5286364FE16C59CC8A907AFF07732"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, (const char*)keccak_kat_msg1088, 136, - DIGEST_SHA3_512); - test_memeq_hex(data, "2E293765022D48996CE8EFF0BE54E87E" - "FB94A14C72DE5ACD10D0EB5ECE029CAD" - "FA3BA17A40B2FFA2163991B17786E51C" - "ABA79E5E0FFD34CF085E2A098BE8BACB"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1096, Msg = 04410E310... ...601016A0D (SHA3-256 rate + 1) */ - const uint8_t keccak_kat_msg1096[] = { - 0x04, 0x41, 0x0E, 0x31, 0x08, 0x2A, 0x47, 0x58, 0x4B, 0x40, - 0x6F, 0x05, 0x13, 0x98, 0xA6, 0xAB, 0xE7, 0x4E, 0x4D, 0xA5, - 0x9B, 0xB6, 0xF8, 0x5E, 0x6B, 0x49, 0xE8, 0xA1, 0xF7, 0xF2, - 0xCA, 0x00, 0xDF, 0xBA, 0x54, 0x62, 0xC2, 0xCD, 0x2B, 0xFD, - 0xE8, 0xB6, 0x4F, 0xB2, 0x1D, 0x70, 0xC0, 0x83, 0xF1, 0x13, - 0x18, 0xB5, 0x6A, 0x52, 0xD0, 0x3B, 0x81, 0xCA, 0xC5, 0xEE, - 0xC2, 0x9E, 0xB3, 0x1B, 0xD0, 0x07, 0x8B, 0x61, 0x56, 0x78, - 0x6D, 0xA3, 0xD6, 0xD8, 0xC3, 0x30, 0x98, 0xC5, 0xC4, 0x7B, - 0xB6, 0x7A, 0xC6, 0x4D, 0xB1, 0x41, 0x65, 0xAF, 0x65, 0xB4, - 0x45, 0x44, 0xD8, 0x06, 0xDD, 0xE5, 0xF4, 0x87, 0xD5, 0x37, - 0x3C, 0x7F, 0x97, 0x92, 0xC2, 0x99, 0xE9, 0x68, 0x6B, 0x7E, - 0x58, 0x21, 0xE7, 0xC8, 0xE2, 0x45, 0x83, 0x15, 0xB9, 0x96, - 0xB5, 0x67, 0x7D, 0x92, 0x6D, 0xAC, 0x57, 0xB3, 0xF2, 0x2D, - 0xA8, 0x73, 0xC6, 0x01, 0x01, 0x6A, 0x0D, - }; - i = crypto_digest256(data, (const char*)keccak_kat_msg1096, 137, - DIGEST_SHA3_256); - test_memeq_hex(data, "D52432CF3B6B4B949AA848E058DCD62D" - "735E0177279222E7AC0AF8504762FAA0"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, (const char*)keccak_kat_msg1096, 137, - DIGEST_SHA3_512); - test_memeq_hex(data, "BE8E14B6757FFE53C9B75F6DDE9A7B6C" - "40474041DE83D4A60645A826D7AF1ABE" - "1EEFCB7B74B62CA6A514E5F2697D585B" - "FECECE12931BBE1D4ED7EBF7B0BE660E"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1144, Msg = EA40E83C... ...66DFAFEC (SHA3-512 rate *2 - 1) */ - const uint8_t keccak_kat_msg1144[] = { - 0xEA, 0x40, 0xE8, 0x3C, 0xB1, 0x8B, 0x3A, 0x24, 0x2C, 0x1E, - 0xCC, 0x6C, 0xCD, 0x0B, 0x78, 0x53, 0xA4, 0x39, 0xDA, 0xB2, - 0xC5, 0x69, 0xCF, 0xC6, 0xDC, 0x38, 0xA1, 0x9F, 0x5C, 0x90, - 0xAC, 0xBF, 0x76, 0xAE, 0xF9, 0xEA, 0x37, 0x42, 0xFF, 0x3B, - 0x54, 0xEF, 0x7D, 0x36, 0xEB, 0x7C, 0xE4, 0xFF, 0x1C, 0x9A, - 0xB3, 0xBC, 0x11, 0x9C, 0xFF, 0x6B, 0xE9, 0x3C, 0x03, 0xE2, - 0x08, 0x78, 0x33, 0x35, 0xC0, 0xAB, 0x81, 0x37, 0xBE, 0x5B, - 0x10, 0xCD, 0xC6, 0x6F, 0xF3, 0xF8, 0x9A, 0x1B, 0xDD, 0xC6, - 0xA1, 0xEE, 0xD7, 0x4F, 0x50, 0x4C, 0xBE, 0x72, 0x90, 0x69, - 0x0B, 0xB2, 0x95, 0xA8, 0x72, 0xB9, 0xE3, 0xFE, 0x2C, 0xEE, - 0x9E, 0x6C, 0x67, 0xC4, 0x1D, 0xB8, 0xEF, 0xD7, 0xD8, 0x63, - 0xCF, 0x10, 0xF8, 0x40, 0xFE, 0x61, 0x8E, 0x79, 0x36, 0xDA, - 0x3D, 0xCA, 0x5C, 0xA6, 0xDF, 0x93, 0x3F, 0x24, 0xF6, 0x95, - 0x4B, 0xA0, 0x80, 0x1A, 0x12, 0x94, 0xCD, 0x8D, 0x7E, 0x66, - 0xDF, 0xAF, 0xEC, - }; - i = crypto_digest512(data, (const char*)keccak_kat_msg1144, 143, - DIGEST_SHA3_512); - test_memeq_hex(data, "3A8E938C45F3F177991296B24565D9A6" - "605516615D96A062C8BE53A0D6C5A648" - "7BE35D2A8F3CF6620D0C2DBA2C560D68" - "295F284BE7F82F3B92919033C9CE5D80"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest256(data, (const char*)keccak_kat_msg1144, 143, - DIGEST_SHA3_256); - test_memeq_hex(data, "E58A947E98D6DD7E932D2FE02D9992E6" - "118C0C2C606BDCDA06E7943D2C95E0E5"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1152, Msg = 157D5B7E... ...79EE00C63 (SHA3-512 rate * 2) */ - const uint8_t keccak_kat_msg1152[] = { - 0x15, 0x7D, 0x5B, 0x7E, 0x45, 0x07, 0xF6, 0x6D, 0x9A, 0x26, - 0x74, 0x76, 0xD3, 0x38, 0x31, 0xE7, 0xBB, 0x76, 0x8D, 0x4D, - 0x04, 0xCC, 0x34, 0x38, 0xDA, 0x12, 0xF9, 0x01, 0x02, 0x63, - 0xEA, 0x5F, 0xCA, 0xFB, 0xDE, 0x25, 0x79, 0xDB, 0x2F, 0x6B, - 0x58, 0xF9, 0x11, 0xD5, 0x93, 0xD5, 0xF7, 0x9F, 0xB0, 0x5F, - 0xE3, 0x59, 0x6E, 0x3F, 0xA8, 0x0F, 0xF2, 0xF7, 0x61, 0xD1, - 0xB0, 0xE5, 0x70, 0x80, 0x05, 0x5C, 0x11, 0x8C, 0x53, 0xE5, - 0x3C, 0xDB, 0x63, 0x05, 0x52, 0x61, 0xD7, 0xC9, 0xB2, 0xB3, - 0x9B, 0xD9, 0x0A, 0xCC, 0x32, 0x52, 0x0C, 0xBB, 0xDB, 0xDA, - 0x2C, 0x4F, 0xD8, 0x85, 0x6D, 0xBC, 0xEE, 0x17, 0x31, 0x32, - 0xA2, 0x67, 0x91, 0x98, 0xDA, 0xF8, 0x30, 0x07, 0xA9, 0xB5, - 0xC5, 0x15, 0x11, 0xAE, 0x49, 0x76, 0x6C, 0x79, 0x2A, 0x29, - 0x52, 0x03, 0x88, 0x44, 0x4E, 0xBE, 0xFE, 0x28, 0x25, 0x6F, - 0xB3, 0x3D, 0x42, 0x60, 0x43, 0x9C, 0xBA, 0x73, 0xA9, 0x47, - 0x9E, 0xE0, 0x0C, 0x63, - }; - i = crypto_digest512(data, (const char*)keccak_kat_msg1152, 144, - DIGEST_SHA3_512); - test_memeq_hex(data, "FE45289874879720CE2A844AE34BB735" - "22775DCB6019DCD22B8885994672A088" - "9C69E8115C641DC8B83E39F7311815A1" - "64DC46E0BA2FCA344D86D4BC2EF2532C"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest256(data, (const char*)keccak_kat_msg1152, 144, - DIGEST_SHA3_256); - test_memeq_hex(data, "A936FB9AF87FB67857B3EAD5C76226AD" - "84DA47678F3C2FFE5A39FDB5F7E63FFB"); - tt_int_op(i, OP_EQ, 0); - - /* Len = 1160, Msg = 836B34B5... ...11044C53 (SHA3-512 rate * 2 + 1) */ - const uint8_t keccak_kat_msg1160[] = { - 0x83, 0x6B, 0x34, 0xB5, 0x15, 0x47, 0x6F, 0x61, 0x3F, 0xE4, - 0x47, 0xA4, 0xE0, 0xC3, 0xF3, 0xB8, 0xF2, 0x09, 0x10, 0xAC, - 0x89, 0xA3, 0x97, 0x70, 0x55, 0xC9, 0x60, 0xD2, 0xD5, 0xD2, - 0xB7, 0x2B, 0xD8, 0xAC, 0xC7, 0x15, 0xA9, 0x03, 0x53, 0x21, - 0xB8, 0x67, 0x03, 0xA4, 0x11, 0xDD, 0xE0, 0x46, 0x6D, 0x58, - 0xA5, 0x97, 0x69, 0x67, 0x2A, 0xA6, 0x0A, 0xD5, 0x87, 0xB8, - 0x48, 0x1D, 0xE4, 0xBB, 0xA5, 0x52, 0xA1, 0x64, 0x57, 0x79, - 0x78, 0x95, 0x01, 0xEC, 0x53, 0xD5, 0x40, 0xB9, 0x04, 0x82, - 0x1F, 0x32, 0xB0, 0xBD, 0x18, 0x55, 0xB0, 0x4E, 0x48, 0x48, - 0xF9, 0xF8, 0xCF, 0xE9, 0xEB, 0xD8, 0x91, 0x1B, 0xE9, 0x57, - 0x81, 0xA7, 0x59, 0xD7, 0xAD, 0x97, 0x24, 0xA7, 0x10, 0x2D, - 0xBE, 0x57, 0x67, 0x76, 0xB7, 0xC6, 0x32, 0xBC, 0x39, 0xB9, - 0xB5, 0xE1, 0x90, 0x57, 0xE2, 0x26, 0x55, 0x2A, 0x59, 0x94, - 0xC1, 0xDB, 0xB3, 0xB5, 0xC7, 0x87, 0x1A, 0x11, 0xF5, 0x53, - 0x70, 0x11, 0x04, 0x4C, 0x53, - }; - i = crypto_digest512(data, (const char*)keccak_kat_msg1160, 145, - DIGEST_SHA3_512); - test_memeq_hex(data, "AFF61C6E11B98E55AC213B1A0BC7DE04" - "05221AC5EFB1229842E4614F4A029C9B" - "D14A0ED7FD99AF3681429F3F309FDB53" - "166AA9A3CD9F1F1223D04B4A9015E94A"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest256(data, (const char*)keccak_kat_msg1160, 145, - DIGEST_SHA3_256); - test_memeq_hex(data, "3A654B88F88086C2751EDAE6D3924814" - "3CF6235C6B0B7969342C45A35194B67E"); - tt_int_op(i, OP_EQ, 0); - - /* SHA3-[256,512] Empty case (wikipedia) */ - i = crypto_digest256(data, "", 0, DIGEST_SHA3_256); - test_memeq_hex(data, "a7ffc6f8bf1ed76651c14756a061d662" - "f580ff4de43b49fa82d80a4b80f8434a"); - tt_int_op(i, OP_EQ, 0); - i = crypto_digest512(data, "", 0, DIGEST_SHA3_512); - test_memeq_hex(data, "a69f73cca23a9ac5c8b567dc185a756e" - "97c982164fe25859e0d1dcc1475c80a6" - "15b2123af1f5f94c11e3e9402c3ac558" - "f500199d95b6d3e301758586281dcd26"); - tt_int_op(i, OP_EQ, 0); - - /* Incremental digest code with SHA3-256 */ - d1 = crypto_digest256_new(DIGEST_SHA3_256); - tt_assert(d1); - crypto_digest_add_bytes(d1, "abcdef", 6); - d2 = crypto_digest_dup(d1); - tt_assert(d2); - crypto_digest_add_bytes(d2, "ghijkl", 6); - crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA3_256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_assign(d2, d1); - crypto_digest_add_bytes(d2, "mno", 3); - crypto_digest_get_digest(d2, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA3_256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_get_digest(d1, d_out1, DIGEST256_LEN); - crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA3_256); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST256_LEN); - crypto_digest_free(d1); - crypto_digest_free(d2); - - /* Incremental digest code with SHA3-512 */ - d1 = crypto_digest512_new(DIGEST_SHA3_512); - tt_assert(d1); - crypto_digest_add_bytes(d1, "abcdef", 6); - d2 = crypto_digest_dup(d1); - tt_assert(d2); - crypto_digest_add_bytes(d2, "ghijkl", 6); - crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdefghijkl", 12, DIGEST_SHA3_512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - crypto_digest_assign(d2, d1); - crypto_digest_add_bytes(d2, "mno", 3); - crypto_digest_get_digest(d2, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdefmno", 9, DIGEST_SHA3_512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); - crypto_digest512(d_out2, "abcdef", 6, DIGEST_SHA3_512); - tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST512_LEN); - crypto_digest_free(d1); - - /* Attempt to exercise the incremental hashing code by creating a randomized - * 30 KiB buffer, and hashing rand[1, 5 * Rate] bytes at a time. SHA3-512 - * is used because it has a lowest rate of the family (the code is common, - * but the slower rate exercises more of it). - */ - const size_t bufsz = 30 * 1024; - size_t j = 0; - large = tor_malloc(bufsz); - crypto_rand(large, bufsz); - d1 = crypto_digest512_new(DIGEST_SHA3_512); /* Running digest. */ - while (j < bufsz) { - /* Pick how much data to add to the running digest. */ - size_t incr = (size_t)crypto_rand_int_range(1, 72 * 5); - incr = MIN(bufsz - j, incr); - - /* Add the data, and calculate the hash. */ - crypto_digest_add_bytes(d1, large + j, incr); - crypto_digest_get_digest(d1, d_out1, DIGEST512_LEN); - - /* One-shot hash the buffer up to the data that was just added, - * and ensure that the values match up. - * - * XXX/yawning: If this actually fails, it'll be rather difficult to - * reproduce. Improvements welcome. - */ - i = crypto_digest512(d_out2, large, j + incr, DIGEST_SHA3_512); - tt_int_op(i, OP_EQ, 0); - tt_mem_op(d_out1, OP_EQ, d_out2, DIGEST512_LEN); - - j += incr; - } - - done: - if (d1) - crypto_digest_free(d1); - if (d2) - crypto_digest_free(d2); - tor_free(large); - tor_free(mem_op_hex_tmp); -} - -/** Run unit tests for our XOF. */ -static void -test_crypto_sha3_xof(void *arg) -{ - uint8_t msg[255]; - uint8_t out[512]; - crypto_xof_t *xof; - char *mem_op_hex_tmp=NULL; - - (void)arg; - - /* SHAKE256 test vector (Len = 2040) from the Keccak Code Package. */ - base16_decode((char *)msg, 255, - "3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431" - "E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1" - "A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F" - "0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD457" - "4EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F114186" - "90A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED3" - "06FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565" - "CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D7" - "9DC266F6A5BE6BB0E4A92ECEEBAEB1", 510); - const char *squeezed_hex = - "8A5199B4A7E133E264A86202720655894D48CFF344A928CF8347F48379CE" - "F347DFC5BCFFAB99B27B1F89AA2735E23D30088FFA03B9EDB02B9635470A" - "B9F1038985D55F9CA774572DD006470EA65145469609F9FA0831BF1FFD84" - "2DC24ACADE27BD9816E3B5BF2876CB112232A0EB4475F1DFF9F5C713D9FF" - "D4CCB89AE5607FE35731DF06317949EEF646E9591CF3BE53ADD6B7DD2B60" - "96E2B3FB06E662EC8B2D77422DAAD9463CD155204ACDBD38E319613F39F9" - "9B6DFB35CA9365160066DB19835888C2241FF9A731A4ACBB5663727AAC34" - "A401247FBAA7499E7D5EE5B69D31025E63D04C35C798BCA1262D5673A9CF" - "0930B5AD89BD485599DC184528DA4790F088EBD170B635D9581632D2FF90" - "DB79665CED430089AF13C9F21F6D443A818064F17AEC9E9C5457001FA8DC" - "6AFBADBE3138F388D89D0E6F22F66671255B210754ED63D81DCE75CE8F18" - "9B534E6D6B3539AA51E837C42DF9DF59C71E6171CD4902FE1BDC73FB1775" - "B5C754A1ED4EA7F3105FC543EE0418DAD256F3F6118EA77114A16C15355B" - "42877A1DB2A7DF0E155AE1D8670ABCEC3450F4E2EEC9838F895423EF63D2" - "61138BAAF5D9F104CB5A957AEA06C0B9B8C78B0D441796DC0350DDEABB78" - "A33B6F1F9E68EDE3D1805C7B7E2CFD54E0FAD62F0D8CA67A775DC4546AF9" - "096F2EDB221DB42843D65327861282DC946A0BA01A11863AB2D1DFD16E39" - "73D4"; - - /* Test oneshot absorb/squeeze. */ - xof = crypto_xof_new(); - tt_assert(xof); - crypto_xof_add_bytes(xof, msg, sizeof(msg)); - crypto_xof_squeeze_bytes(xof, out, sizeof(out)); - test_memeq_hex(out, squeezed_hex); - crypto_xof_free(xof); - memset(out, 0, sizeof(out)); - - /* Test incremental absorb/squeeze. */ - xof = crypto_xof_new(); - tt_assert(xof); - for (size_t i = 0; i < sizeof(msg); i++) - crypto_xof_add_bytes(xof, msg + i, 1); - for (size_t i = 0; i < sizeof(out); i++) - crypto_xof_squeeze_bytes(xof, out + i, 1); - test_memeq_hex(out, squeezed_hex); - - done: - if (xof) - crypto_xof_free(xof); - tor_free(mem_op_hex_tmp); -} - -/* Test our MAC-SHA3 function. There are not actually any MAC-SHA3 test - * vectors out there for our H(len(k) || k || m) construction. Hence what we - * are gonna do is test our crypto_mac_sha3_256() function against manually - * doing H(len(k) || k||m). If in the future the Keccak group decides to - * standarize an MAC construction and make test vectors, we should - * incorporate them here. */ -static void -test_crypto_mac_sha3(void *arg) -{ - const char msg[] = "i am in a library somewhere using my computer"; - const char key[] = "i'm from the past talking to the future."; - - uint8_t hmac_test[DIGEST256_LEN]; - char hmac_manual[DIGEST256_LEN]; - - (void) arg; - - /* First let's use our nice HMAC-SHA3 function */ - crypto_mac_sha3_256(hmac_test, sizeof(hmac_test), - (uint8_t *) key, strlen(key), - (uint8_t *) msg, strlen(msg)); - - /* Now let's try a manual H(len(k) || k || m) construction */ - { - char *key_msg_concat = NULL, *all = NULL; - int result; - const uint64_t key_len_netorder = tor_htonll(strlen(key)); - size_t all_len; - - tor_asprintf(&key_msg_concat, "%s%s", key, msg); - all_len = sizeof(key_len_netorder) + strlen(key_msg_concat); - all = tor_malloc_zero(all_len); - memcpy(all, &key_len_netorder, sizeof(key_len_netorder)); - memcpy(all + sizeof(key_len_netorder), key_msg_concat, - strlen(key_msg_concat)); - - result = crypto_digest256(hmac_manual, all, all_len, DIGEST_SHA3_256); - tor_free(key_msg_concat); - tor_free(all); - tt_int_op(result, OP_EQ, 0); - } - - /* Now compare the two results */ - tt_mem_op(hmac_test, OP_EQ, hmac_manual, DIGEST256_LEN); - - done: ; -} - -/** Run unit tests for our public key crypto functions */ -static void -test_crypto_pk(void *arg) -{ - crypto_pk_t *pk1 = NULL, *pk2 = NULL; - char *encoded = NULL; - char data1[1024], data2[1024], data3[1024]; - size_t size; - int i, len; - - /* Public-key ciphers */ - (void)arg; - pk1 = pk_generate(0); - pk2 = crypto_pk_new(); - tt_assert(pk1 && pk2); - tt_assert(! crypto_pk_write_public_key_to_string(pk1, &encoded, &size)); - tt_assert(! crypto_pk_read_public_key_from_string(pk2, encoded, size)); - tt_int_op(0,OP_EQ, crypto_pk_cmp_keys(pk1, pk2)); - - /* comparison between keys and NULL */ - tt_int_op(crypto_pk_cmp_keys(NULL, pk1), OP_LT, 0); - tt_int_op(crypto_pk_cmp_keys(NULL, NULL), OP_EQ, 0); - tt_int_op(crypto_pk_cmp_keys(pk1, NULL), OP_GT, 0); - - tt_int_op(128,OP_EQ, crypto_pk_keysize(pk1)); - tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk1)); - tt_int_op(128,OP_EQ, crypto_pk_keysize(pk2)); - tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk2)); - - tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk2, data1, sizeof(data1), - "Hello whirled.", 15, - PK_PKCS1_OAEP_PADDING)); - tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk1, data2, sizeof(data1), - "Hello whirled.", 15, - PK_PKCS1_OAEP_PADDING)); - /* oaep padding should make encryption not match */ - tt_mem_op(data1,OP_NE, data2, 128); - tt_int_op(15,OP_EQ, - crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data1, 128, - PK_PKCS1_OAEP_PADDING,1)); - tt_str_op(data3,OP_EQ, "Hello whirled."); - memset(data3, 0, 1024); - tt_int_op(15,OP_EQ, - crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - tt_str_op(data3,OP_EQ, "Hello whirled."); - /* Can't decrypt with public key. */ - tt_int_op(-1,OP_EQ, - crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - /* Try again with bad padding */ - memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */ - tt_int_op(-1,OP_EQ, - crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, - PK_PKCS1_OAEP_PADDING,1)); - - /* File operations: save and load private key */ - tt_assert(! crypto_pk_write_private_key_to_filename(pk1, - get_fname("pkey1"))); - /* failing case for read: can't read. */ - tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")), - OP_LT, 0); - write_str_to_file(get_fname("xyzzy"), "foobar", 6); - /* Failing case for read: no key. */ - tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")), - OP_LT, 0); - tt_assert(! crypto_pk_read_private_key_from_filename(pk2, - get_fname("pkey1"))); - tt_int_op(15,OP_EQ, - crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data1, 128, - PK_PKCS1_OAEP_PADDING,1)); - - /* Now try signing. */ - strlcpy(data1, "Ossifrage", 1024); - tt_int_op(128,OP_EQ, - crypto_pk_private_sign(pk1, data2, sizeof(data2), data1, 10)); - tt_int_op(10,OP_EQ, - crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); - tt_str_op(data3,OP_EQ, "Ossifrage"); - /* Try signing digests. */ - tt_int_op(128,OP_EQ, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2), - data1, 10)); - tt_int_op(20,OP_EQ, - crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); - tt_int_op(0,OP_EQ, - crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); - tt_int_op(-1,OP_EQ, - crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); - - /*XXXX test failed signing*/ - - /* Try encoding */ - crypto_pk_free(pk2); - pk2 = NULL; - i = crypto_pk_asn1_encode(pk1, data1, 1024); - tt_int_op(i, OP_GT, 0); - pk2 = crypto_pk_asn1_decode(data1, i); - tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); - - /* Try with hybrid encryption wrappers. */ - crypto_rand(data1, 1024); - for (i = 85; i < 140; ++i) { - memset(data2,0,1024); - memset(data3,0,1024); - len = crypto_pk_obsolete_public_hybrid_encrypt(pk1,data2,sizeof(data2), - data1,i,PK_PKCS1_OAEP_PADDING,0); - tt_int_op(len, OP_GE, 0); - len = crypto_pk_obsolete_private_hybrid_decrypt(pk1,data3,sizeof(data3), - data2,len,PK_PKCS1_OAEP_PADDING,1); - tt_int_op(len,OP_EQ, i); - tt_mem_op(data1,OP_EQ, data3,i); - } - - /* Try copy_full */ - crypto_pk_free(pk2); - pk2 = crypto_pk_copy_full(pk1); - tt_ptr_op(pk2, OP_NE, NULL); - tt_ptr_op(pk1, OP_NE, pk2); - tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); - - done: - if (pk1) - crypto_pk_free(pk1); - if (pk2) - crypto_pk_free(pk2); - tor_free(encoded); -} - -static void -test_crypto_pk_fingerprints(void *arg) -{ - crypto_pk_t *pk = NULL; - char encoded[512]; - char d[DIGEST_LEN], d2[DIGEST_LEN]; - char fingerprint[FINGERPRINT_LEN+1]; - int n; - unsigned i; - char *mem_op_hex_tmp=NULL; - - (void)arg; - - pk = pk_generate(1); - tt_assert(pk); - n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded)); - tt_int_op(n, OP_GT, 0); - tt_int_op(n, OP_GT, 128); - tt_int_op(n, OP_LT, 256); - - /* Is digest as expected? */ - crypto_digest(d, encoded, n); - tt_int_op(0, OP_EQ, crypto_pk_get_digest(pk, d2)); - tt_mem_op(d,OP_EQ, d2, DIGEST_LEN); - - /* Is fingerprint right? */ - tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 0)); - tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); - test_memeq_hex(d, fingerprint); - - /* Are spaces right? */ - tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 1)); - for (i = 4; i < strlen(fingerprint); i += 5) { - tt_int_op(fingerprint[i], OP_EQ, ' '); - } - tor_strstrip(fingerprint, " "); - tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); - test_memeq_hex(d, fingerprint); - - /* Now hash again and check crypto_pk_get_hashed_fingerprint. */ - crypto_digest(d2, d, sizeof(d)); - tt_int_op(0, OP_EQ, crypto_pk_get_hashed_fingerprint(pk, fingerprint)); - tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); - test_memeq_hex(d2, fingerprint); - - done: - crypto_pk_free(pk); - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_pk_base64(void *arg) -{ - crypto_pk_t *pk1 = NULL; - crypto_pk_t *pk2 = NULL; - char *encoded = NULL; - - (void)arg; - - /* Test Base64 encoding a key. */ - pk1 = pk_generate(0); - tt_assert(pk1); - tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded)); - tt_assert(encoded); - - /* Test decoding a valid key. */ - pk2 = crypto_pk_base64_decode(encoded, strlen(encoded)); - tt_assert(pk2); - tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0); - crypto_pk_free(pk2); - - /* Test decoding a invalid key (not Base64). */ - static const char *invalid_b64 = "The key is in another castle!"; - pk2 = crypto_pk_base64_decode(invalid_b64, strlen(invalid_b64)); - tt_ptr_op(pk2, OP_EQ, NULL); - - /* Test decoding a truncated Base64 blob. */ - pk2 = crypto_pk_base64_decode(encoded, strlen(encoded)/2); - tt_ptr_op(pk2, OP_EQ, NULL); - - done: - crypto_pk_free(pk1); - crypto_pk_free(pk2); - tor_free(encoded); -} - -#ifdef HAVE_TRUNCATE -#define do_truncate truncate -#else -static int -do_truncate(const char *fname, size_t len) -{ - struct stat st; - char *bytes; - - bytes = read_file_to_str(fname, RFTS_BIN, &st); - if (!bytes) - return -1; - /* This cast isn't so great, but it should be safe given the actual files - * and lengths we're using. */ - if (st.st_size < (off_t)len) - len = MIN(len, (size_t)st.st_size); - - int r = write_bytes_to_file(fname, bytes, len, 1); - tor_free(bytes); - return r; -} -#endif /* defined(HAVE_TRUNCATE) */ - -/** Sanity check for crypto pk digests */ -static void -test_crypto_digests(void *arg) -{ - crypto_pk_t *k = NULL; - ssize_t r; - common_digests_t pkey_digests; - char digest[DIGEST_LEN]; - - (void)arg; - k = crypto_pk_new(); - tt_assert(k); - r = crypto_pk_read_private_key_from_string(k, AUTHORITY_SIGNKEY_3, -1); - tt_assert(!r); - - r = crypto_pk_get_digest(k, digest); - tt_assert(r == 0); - tt_mem_op(hex_str(digest, DIGEST_LEN),OP_EQ, - AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); - - r = crypto_pk_get_common_digests(k, &pkey_digests); - tt_int_op(r, OP_EQ, 0); - - tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),OP_EQ, - AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); - tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),OP_EQ, - AUTHORITY_SIGNKEY_A_DIGEST256, HEX_DIGEST256_LEN); - done: - crypto_pk_free(k); -} - -static void -test_crypto_digest_names(void *arg) -{ - static const struct { - int a; const char *n; - } names[] = { - { DIGEST_SHA1, "sha1" }, - { DIGEST_SHA256, "sha256" }, - { DIGEST_SHA512, "sha512" }, - { DIGEST_SHA3_256, "sha3-256" }, - { DIGEST_SHA3_512, "sha3-512" }, - { -1, NULL } - }; - (void)arg; - - int i; - for (i = 0; names[i].n; ++i) { - tt_str_op(names[i].n, OP_EQ,crypto_digest_algorithm_get_name(names[i].a)); - tt_int_op(names[i].a, - OP_EQ,crypto_digest_algorithm_parse_name(names[i].n)); - } - tt_int_op(-1, OP_EQ, - crypto_digest_algorithm_parse_name("TimeCubeHash-4444")); - done: - ; -} - -/** Run unit tests for misc crypto formatting functionality (base64, base32, - * fingerprints, etc) */ -static void -test_crypto_formats(void *arg) -{ - char *data1 = NULL, *data2 = NULL, *data3 = NULL; - int i, j, idx; - - (void)arg; - data1 = tor_malloc(1024); - data2 = tor_malloc(1024); - data3 = tor_malloc(1024); - tt_assert(data1 && data2 && data3); - - /* Base64 tests */ - memset(data1, 6, 1024); - for (idx = 0; idx < 10; ++idx) { - i = base64_encode(data2, 1024, data1, idx, 0); - tt_int_op(i, OP_GE, 0); - tt_int_op(i, OP_EQ, strlen(data2)); - j = base64_decode(data3, 1024, data2, i); - tt_int_op(j,OP_EQ, idx); - tt_mem_op(data3,OP_EQ, data1, idx); - - i = base64_encode_nopad(data2, 1024, (uint8_t*)data1, idx); - tt_int_op(i, OP_GE, 0); - tt_int_op(i, OP_EQ, strlen(data2)); - tt_assert(! strchr(data2, '=')); - j = base64_decode(data3, 1024, data2, i); - tt_int_op(j, OP_EQ, idx); - tt_mem_op(data3,OP_EQ, data1, idx); - } - - strlcpy(data1, "Test string that contains 35 chars.", 1024); - strlcat(data1, " 2nd string that contains 35 chars.", 1024); - - i = base64_encode(data2, 1024, data1, 71, 0); - tt_int_op(i, OP_GE, 0); - j = base64_decode(data3, 1024, data2, i); - tt_int_op(j,OP_EQ, 71); - tt_str_op(data3,OP_EQ, data1); - tt_int_op(data2[i], OP_EQ, '\0'); - - crypto_rand(data1, DIGEST_LEN); - memset(data2, 100, 1024); - digest_to_base64(data2, data1); - tt_int_op(BASE64_DIGEST_LEN,OP_EQ, strlen(data2)); - tt_int_op(100,OP_EQ, data2[BASE64_DIGEST_LEN+2]); - memset(data3, 99, 1024); - tt_int_op(digest_from_base64(data3, data2),OP_EQ, 0); - tt_mem_op(data1,OP_EQ, data3, DIGEST_LEN); - tt_int_op(99,OP_EQ, data3[DIGEST_LEN+1]); - - tt_int_op(digest_from_base64(data3, "###"), OP_LT, 0); - - /* Encoding SHA256 */ - crypto_rand(data2, DIGEST256_LEN); - memset(data2, 100, 1024); - digest256_to_base64(data2, data1); - tt_int_op(BASE64_DIGEST256_LEN,OP_EQ, strlen(data2)); - tt_int_op(100,OP_EQ, data2[BASE64_DIGEST256_LEN+2]); - memset(data3, 99, 1024); - tt_int_op(digest256_from_base64(data3, data2),OP_EQ, 0); - tt_mem_op(data1,OP_EQ, data3, DIGEST256_LEN); - tt_int_op(99,OP_EQ, data3[DIGEST256_LEN+1]); - - /* Base32 tests */ - strlcpy(data1, "5chrs", 1024); - /* bit pattern is: [35 63 68 72 73] -> - * [00110101 01100011 01101000 01110010 01110011] - * By 5s: [00110 10101 10001 10110 10000 11100 10011 10011] - */ - base32_encode(data2, 9, data1, 5); - tt_str_op(data2,OP_EQ, "gvrwq4tt"); - - strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024); - base32_encode(data2, 30, data1, 10); - tt_str_op(data2,OP_EQ, "772w2rfobvomsywe"); - - /* Base16 tests */ - strlcpy(data1, "6chrs\xff", 1024); - base16_encode(data2, 13, data1, 6); - tt_str_op(data2,OP_EQ, "3663687273FF"); - - strlcpy(data1, "f0d678affc000100", 1024); - i = base16_decode(data2, 8, data1, 16); - tt_int_op(i,OP_EQ, 8); - tt_mem_op(data2,OP_EQ, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); - - /* now try some failing base16 decodes */ - tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 15)); /* odd input len */ - tt_int_op(-1,OP_EQ, base16_decode(data2, 7, data1, 16)); /* dest too short */ - strlcpy(data1, "f0dz!8affc000100", 1024); - tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 16)); - - tor_free(data1); - tor_free(data2); - tor_free(data3); - - /* Add spaces to fingerprint */ - { - data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000"); - tt_int_op(strlen(data1),OP_EQ, 40); - data2 = tor_malloc(FINGERPRINT_LEN+1); - crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1); - tt_str_op(data2, OP_EQ, - "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); - tor_free(data1); - tor_free(data2); - } - - done: - tor_free(data1); - tor_free(data2); - tor_free(data3); -} - -/** Test AES-CTR encryption and decryption with IV. */ -static void -test_crypto_aes_iv(void *arg) -{ - char *plain, *encrypted1, *encrypted2, *decrypted1, *decrypted2; - char plain_1[1], plain_15[15], plain_16[16], plain_17[17]; - char key1[16], key2[16]; - ssize_t encrypted_size, decrypted_size; - - int use_evp = !strcmp(arg,"evp"); - evaluate_evp_for_aes(use_evp); - - plain = tor_malloc(4095); - encrypted1 = tor_malloc(4095 + 1 + 16); - encrypted2 = tor_malloc(4095 + 1 + 16); - decrypted1 = tor_malloc(4095 + 1); - decrypted2 = tor_malloc(4095 + 1); - - crypto_rand(plain, 4095); - crypto_rand(key1, 16); - crypto_rand(key2, 16); - crypto_rand(plain_1, 1); - crypto_rand(plain_15, 15); - crypto_rand(plain_16, 16); - crypto_rand(plain_17, 17); - key1[0] = key2[0] + 128; /* Make sure that contents are different. */ - /* Encrypt and decrypt with the same key. */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 4095, - plain, 4095); - - tt_int_op(encrypted_size,OP_EQ, 16 + 4095); - tt_assert(encrypted_size > 0); /* This is obviously true, since 4111 is - * greater than 0, but its truth is not - * obvious to all analysis tools. */ - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, - encrypted1, encrypted_size); - - tt_int_op(decrypted_size,OP_EQ, 4095); - tt_assert(decrypted_size > 0); - tt_mem_op(plain,OP_EQ, decrypted1, 4095); - /* Encrypt a second time (with a new random initialization vector). */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted2, 16 + 4095, - plain, 4095); - - tt_int_op(encrypted_size,OP_EQ, 16 + 4095); - tt_assert(encrypted_size > 0); - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted2, 4095, - encrypted2, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 4095); - tt_assert(decrypted_size > 0); - tt_mem_op(plain,OP_EQ, decrypted2, 4095); - tt_mem_op(encrypted1,OP_NE, encrypted2, encrypted_size); - /* Decrypt with the wrong key. */ - decrypted_size = crypto_cipher_decrypt_with_iv(key2, decrypted2, 4095, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 4095); - tt_mem_op(plain,OP_NE, decrypted2, decrypted_size); - /* Alter the initialization vector. */ - encrypted1[0] += 42; - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 4095); - tt_mem_op(plain,OP_NE, decrypted2, 4095); - /* Special length case: 1. */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 1, - plain_1, 1); - tt_int_op(encrypted_size,OP_EQ, 16 + 1); - tt_assert(encrypted_size > 0); - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 1, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 1); - tt_assert(decrypted_size > 0); - tt_mem_op(plain_1,OP_EQ, decrypted1, 1); - /* Special length case: 15. */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 15, - plain_15, 15); - tt_int_op(encrypted_size,OP_EQ, 16 + 15); - tt_assert(encrypted_size > 0); - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 15, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 15); - tt_assert(decrypted_size > 0); - tt_mem_op(plain_15,OP_EQ, decrypted1, 15); - /* Special length case: 16. */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 16, - plain_16, 16); - tt_int_op(encrypted_size,OP_EQ, 16 + 16); - tt_assert(encrypted_size > 0); - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 16, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 16); - tt_assert(decrypted_size > 0); - tt_mem_op(plain_16,OP_EQ, decrypted1, 16); - /* Special length case: 17. */ - encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 17, - plain_17, 17); - tt_int_op(encrypted_size,OP_EQ, 16 + 17); - tt_assert(encrypted_size > 0); - decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 17, - encrypted1, encrypted_size); - tt_int_op(decrypted_size,OP_EQ, 17); - tt_assert(decrypted_size > 0); - tt_mem_op(plain_17,OP_EQ, decrypted1, 17); - - done: - /* Free memory. */ - tor_free(plain); - tor_free(encrypted1); - tor_free(encrypted2); - tor_free(decrypted1); - tor_free(decrypted2); -} - -/** Test base32 decoding. */ -static void -test_crypto_base32_decode(void *arg) -{ - char plain[60], encoded[96 + 1], decoded[60]; - int res; - (void)arg; - crypto_rand(plain, 60); - /* Encode and decode a random string. */ - base32_encode(encoded, 96 + 1, plain, 60); - res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,OP_EQ, 0); - tt_mem_op(plain,OP_EQ, decoded, 60); - /* Encode, uppercase, and decode a random string. */ - base32_encode(encoded, 96 + 1, plain, 60); - tor_strupper(encoded); - res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,OP_EQ, 0); - tt_mem_op(plain,OP_EQ, decoded, 60); - /* Change encoded string and decode. */ - if (encoded[0] == 'A' || encoded[0] == 'a') - encoded[0] = 'B'; - else - encoded[0] = 'A'; - res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,OP_EQ, 0); - tt_mem_op(plain,OP_NE, decoded, 60); - /* Bad encodings. */ - encoded[0] = '!'; - res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(0, OP_GT, res); - - done: - ; -} - -static void -test_crypto_kdf_TAP(void *arg) -{ - uint8_t key_material[100]; - int r; - char *mem_op_hex_tmp = NULL; - - (void)arg; -#define EXPAND(s) \ - r = crypto_expand_key_material_TAP( \ - (const uint8_t*)(s), strlen(s), \ - key_material, 100) - - /* Test vectors generated with a little python script; feel free to write - * your own. */ - memset(key_material, 0, sizeof(key_material)); - EXPAND(""); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "5ba93c9db0cff93f52b521d7420e43f6eda2784fbf8b4530d8" - "d246dd74ac53a13471bba17941dff7c4ea21bb365bbeeaf5f2" - "c654883e56d11e43c44e9842926af7ca0a8cca12604f945414" - "f07b01e13da42c6cf1de3abfdea9b95f34687cbbe92b9a7383"); - - EXPAND("Tor"); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "776c6214fc647aaa5f683c737ee66ec44f03d0372e1cce6922" - "7950f236ddf1e329a7ce7c227903303f525a8c6662426e8034" - "870642a6dabbd41b5d97ec9bf2312ea729992f48f8ea2d0ba8" - "3f45dfda1a80bdc8b80de01b23e3e0ffae099b3e4ccf28dc28"); - - EXPAND("AN ALARMING ITEM TO FIND ON A MONTHLY AUTO-DEBIT NOTICE"); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "a340b5d126086c3ab29c2af4179196dbf95e1c72431419d331" - "4844bf8f6afb6098db952b95581fb6c33625709d6f4400b8e7" - "ace18a70579fad83c0982ef73f89395bcc39493ad53a685854" - "daf2ba9b78733b805d9a6824c907ee1dba5ac27a1e466d4d10"); - - done: - tor_free(mem_op_hex_tmp); - -#undef EXPAND -} - -static void -test_crypto_hkdf_sha256(void *arg) -{ - uint8_t key_material[100]; - const uint8_t salt[] = "ntor-curve25519-sha256-1:key_extract"; - const size_t salt_len = strlen((char*)salt); - const uint8_t m_expand[] = "ntor-curve25519-sha256-1:key_expand"; - const size_t m_expand_len = strlen((char*)m_expand); - int r; - char *mem_op_hex_tmp = NULL; - - (void)arg; - -#define EXPAND(s) \ - r = crypto_expand_key_material_rfc5869_sha256( \ - (const uint8_t*)(s), strlen(s), \ - salt, salt_len, \ - m_expand, m_expand_len, \ - key_material, 100) - - /* Test vectors generated with ntor_ref.py */ - memset(key_material, 0, sizeof(key_material)); - EXPAND(""); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "d3490ed48b12a48f9547861583573fe3f19aafe3f81dc7fc75" - "eeed96d741b3290f941576c1f9f0b2d463d1ec7ab2c6bf71cd" - "d7f826c6298c00dbfe6711635d7005f0269493edf6046cc7e7" - "dcf6abe0d20c77cf363e8ffe358927817a3d3e73712cee28d8"); - - EXPAND("Tor"); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "5521492a85139a8d9107a2d5c0d9c91610d0f95989975ebee6" - "c02a4f8d622a6cfdf9b7c7edd3832e2760ded1eac309b76f8d" - "66c4a3c4d6225429b3a016e3c3d45911152fc87bc2de9630c3" - "961be9fdb9f93197ea8e5977180801926d3321fa21513e59ac"); - - EXPAND("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT"); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(key_material, - "a2aa9b50da7e481d30463adb8f233ff06e9571a0ca6ab6df0f" - "b206fa34e5bc78d063fc291501beec53b36e5a0e434561200c" - "5f8bd13e0f88b3459600b4dc21d69363e2895321c06184879d" - "94b18f078411be70b767c7fc40679a9440a0c95ea83a23efbf"); - done: - tor_free(mem_op_hex_tmp); -#undef EXPAND -} - -static void -test_crypto_hkdf_sha256_testvecs(void *arg) -{ - (void) arg; - /* Test vectors from RFC5869, sections A.1 through A.3 */ - const struct { - const char *ikm16, *salt16, *info16; - int L; - const char *okm16; - } vecs[] = { - { /* from A.1 */ - "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", - "000102030405060708090a0b0c", - "f0f1f2f3f4f5f6f7f8f9", - 42, - "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf" - "34007208d5b887185865" - }, - { /* from A.2 */ - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f", - "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - 82, - "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c" - "59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71" - "cc30c58179ec3e87c14c01d5c1f3434f1d87" - }, - { /* from A.3 */ - "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", - "", - "", - 42, - "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d" - "9d201395faa4b61a96c8", - }, - { NULL, NULL, NULL, -1, NULL } - }; - - int i; - char *ikm = NULL; - char *salt = NULL; - char *info = NULL; - char *okm = NULL; - char *mem_op_hex_tmp = NULL; - - for (i = 0; vecs[i].ikm16; ++i) { - size_t ikm_len = strlen(vecs[i].ikm16)/2; - size_t salt_len = strlen(vecs[i].salt16)/2; - size_t info_len = strlen(vecs[i].info16)/2; - size_t okm_len = vecs[i].L; - - ikm = tor_malloc(ikm_len); - salt = tor_malloc(salt_len); - info = tor_malloc(info_len); - okm = tor_malloc(okm_len); - - base16_decode(ikm, ikm_len, vecs[i].ikm16, strlen(vecs[i].ikm16)); - base16_decode(salt, salt_len, vecs[i].salt16, strlen(vecs[i].salt16)); - base16_decode(info, info_len, vecs[i].info16, strlen(vecs[i].info16)); - - int r = crypto_expand_key_material_rfc5869_sha256( - (const uint8_t*)ikm, ikm_len, - (const uint8_t*)salt, salt_len, - (const uint8_t*)info, info_len, - (uint8_t*)okm, okm_len); - tt_int_op(r, OP_EQ, 0); - test_memeq_hex(okm, vecs[i].okm16); - tor_free(ikm); - tor_free(salt); - tor_free(info); - tor_free(okm); - } - done: - tor_free(ikm); - tor_free(salt); - tor_free(info); - tor_free(okm); - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_curve25519_impl(void *arg) -{ - /* adapted from curve25519_donna, which adapted it from test-curve25519 - version 20050915, by D. J. Bernstein, Public domain. */ - - const int randomize_high_bit = (arg != NULL); - -#ifdef SLOW_CURVE25519_TEST - const int loop_max=10000; - const char e1_expected[] = "4faf81190869fd742a33691b0e0824d5" - "7e0329f4dd2819f5f32d130f1296b500"; - const char e2k_expected[] = "05aec13f92286f3a781ccae98995a3b9" - "e0544770bc7de853b38f9100489e3e79"; - const char e1e2k_expected[] = "cd6e8269104eb5aaee886bd2071fba88" - "bd13861475516bc2cd2b6e005e805064"; -#else /* !(defined(SLOW_CURVE25519_TEST)) */ - const int loop_max=200; - const char e1_expected[] = "bc7112cde03f97ef7008cad1bdc56be3" - "c6a1037d74cceb3712e9206871dcf654"; - const char e2k_expected[] = "dd8fa254fb60bdb5142fe05b1f5de44d" - "8e3ee1a63c7d14274ea5d4c67f065467"; - const char e1e2k_expected[] = "7ddb98bd89025d2347776b33901b3e7e" - "c0ee98cb2257a4545c0cfb2ca3e1812b"; -#endif /* defined(SLOW_CURVE25519_TEST) */ - - unsigned char e1k[32]; - unsigned char e2k[32]; - unsigned char e1e2k[32]; - unsigned char e2e1k[32]; - unsigned char e1[32] = {3}; - unsigned char e2[32] = {5}; - unsigned char k[32] = {9}; - int loop, i; - - char *mem_op_hex_tmp = NULL; - - for (loop = 0; loop < loop_max; ++loop) { - curve25519_impl(e1k,e1,k); - curve25519_impl(e2e1k,e2,e1k); - curve25519_impl(e2k,e2,k); - if (randomize_high_bit) { - /* We require that the high bit of the public key be ignored. So if - * we're doing this variant test, we randomize the high bit of e2k, and - * make sure that the handshake still works out the same as it would - * otherwise. */ - uint8_t byte; - crypto_rand((char*)&byte, 1); - e2k[31] |= (byte & 0x80); - } - curve25519_impl(e1e2k,e1,e2k); - tt_mem_op(e1e2k,OP_EQ, e2e1k, 32); - if (loop == loop_max-1) { - break; - } - for (i = 0;i < 32;++i) e1[i] ^= e2k[i]; - for (i = 0;i < 32;++i) e2[i] ^= e1k[i]; - for (i = 0;i < 32;++i) k[i] ^= e1e2k[i]; - } - - test_memeq_hex(e1, e1_expected); - test_memeq_hex(e2k, e2k_expected); - test_memeq_hex(e1e2k, e1e2k_expected); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_curve25519_basepoint(void *arg) -{ - uint8_t secret[32]; - uint8_t public1[32]; - uint8_t public2[32]; - const int iters = 2048; - int i; - (void) arg; - - for (i = 0; i < iters; ++i) { - crypto_rand((char*)secret, 32); - curve25519_set_impl_params(1); /* Use optimization */ - curve25519_basepoint_impl(public1, secret); - curve25519_set_impl_params(0); /* Disable optimization */ - curve25519_basepoint_impl(public2, secret); - tt_mem_op(public1, OP_EQ, public2, 32); - } - - done: - ; -} - -static void -test_crypto_curve25519_testvec(void *arg) -{ - (void)arg; - char *mem_op_hex_tmp = NULL; - - /* From RFC 7748, section 6.1 */ - /* Alice's private key, a: */ - const char a16[] = - "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a"; - /* Alice's public key, X25519(a, 9): */ - const char a_pub16[] = - "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a"; - /* Bob's private key, b: */ - const char b16[] = - "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb"; - /* Bob's public key, X25519(b, 9): */ - const char b_pub16[] = - "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f"; - /* Their shared secret, K: */ - const char k16[] = - "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"; - - uint8_t a[32], b[32], a_pub[32], b_pub[32], k1[32], k2[32]; - base16_decode((char*)a, sizeof(a), a16, strlen(a16)); - base16_decode((char*)b, sizeof(b), b16, strlen(b16)); - curve25519_basepoint_impl(a_pub, a); - curve25519_basepoint_impl(b_pub, b); - curve25519_impl(k1, a, b_pub); - curve25519_impl(k2, b, a_pub); - - test_memeq_hex(a, a16); - test_memeq_hex(b, b16); - test_memeq_hex(a_pub, a_pub16); - test_memeq_hex(b_pub, b_pub16); - test_memeq_hex(k1, k16); - test_memeq_hex(k2, k16); - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_curve25519_wrappers(void *arg) -{ - curve25519_public_key_t pubkey1, pubkey2; - curve25519_secret_key_t seckey1, seckey2; - - uint8_t output1[CURVE25519_OUTPUT_LEN]; - uint8_t output2[CURVE25519_OUTPUT_LEN]; - (void)arg; - - /* Test a simple handshake, serializing and deserializing some stuff. */ - curve25519_secret_key_generate(&seckey1, 0); - curve25519_secret_key_generate(&seckey2, 1); - curve25519_public_key_generate(&pubkey1, &seckey1); - curve25519_public_key_generate(&pubkey2, &seckey2); - tt_assert(curve25519_public_key_is_ok(&pubkey1)); - tt_assert(curve25519_public_key_is_ok(&pubkey2)); - curve25519_handshake(output1, &seckey1, &pubkey2); - curve25519_handshake(output2, &seckey2, &pubkey1); - tt_mem_op(output1,OP_EQ, output2, sizeof(output1)); - - done: - ; -} - -static void -test_crypto_curve25519_encode(void *arg) -{ - curve25519_secret_key_t seckey; - curve25519_public_key_t key1, key2, key3; - char buf[64]; - - (void)arg; - - curve25519_secret_key_generate(&seckey, 0); - curve25519_public_key_generate(&key1, &seckey); - tt_int_op(0, OP_EQ, curve25519_public_to_base64(buf, &key1)); - tt_int_op(CURVE25519_BASE64_PADDED_LEN, OP_EQ, strlen(buf)); - - tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key2, buf)); - tt_mem_op(key1.public_key,OP_EQ, key2.public_key, CURVE25519_PUBKEY_LEN); - - buf[CURVE25519_BASE64_PADDED_LEN - 1] = '\0'; - tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, OP_EQ, strlen(buf)); - tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key3, buf)); - tt_mem_op(key1.public_key,OP_EQ, key3.public_key, CURVE25519_PUBKEY_LEN); - - /* Now try bogus parses. */ - strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=", sizeof(buf)); - tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); - - strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", sizeof(buf)); - tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); - - strlcpy(buf, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", sizeof(buf)); - tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); - - done: - ; -} - -static void -test_crypto_curve25519_persist(void *arg) -{ - curve25519_keypair_t keypair, keypair2; - char *fname = tor_strdup(get_fname("curve25519_keypair")); - char *tag = NULL; - char *content = NULL; - const char *cp; - struct stat st; - size_t taglen; - - (void)arg; - - tt_int_op(0,OP_EQ,curve25519_keypair_generate(&keypair, 0)); - - tt_int_op(0,OP_EQ, - curve25519_keypair_write_to_file(&keypair, fname, "testing")); - tt_int_op(0,OP_EQ,curve25519_keypair_read_from_file(&keypair2, &tag, fname)); - tt_str_op(tag,OP_EQ,"testing"); - tor_free(tag); - - tt_mem_op(keypair.pubkey.public_key,OP_EQ, - keypair2.pubkey.public_key, - CURVE25519_PUBKEY_LEN); - tt_mem_op(keypair.seckey.secret_key,OP_EQ, - keypair2.seckey.secret_key, - CURVE25519_SECKEY_LEN); - - content = read_file_to_str(fname, RFTS_BIN, &st); - tt_assert(content); - taglen = strlen("== c25519v1: testing =="); - tt_u64_op((uint64_t)st.st_size, OP_EQ, - 32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN); - tt_assert(fast_memeq(content, "== c25519v1: testing ==", taglen)); - tt_assert(tor_mem_is_zero(content+taglen, 32-taglen)); - cp = content + 32; - tt_mem_op(keypair.seckey.secret_key,OP_EQ, - cp, - CURVE25519_SECKEY_LEN); - cp += CURVE25519_SECKEY_LEN; - tt_mem_op(keypair.pubkey.public_key,OP_EQ, - cp, - CURVE25519_SECKEY_LEN); - - tor_free(fname); - fname = tor_strdup(get_fname("bogus_keypair")); - - tt_int_op(-1, OP_EQ, - curve25519_keypair_read_from_file(&keypair2, &tag, fname)); - tor_free(tag); - - content[69] ^= 0xff; - tt_int_op(0, OP_EQ, - write_bytes_to_file(fname, content, (size_t)st.st_size, 1)); - tt_int_op(-1, OP_EQ, - curve25519_keypair_read_from_file(&keypair2, &tag, fname)); - - done: - tor_free(fname); - tor_free(content); - tor_free(tag); -} - -static void -test_crypto_ed25519_simple(void *arg) -{ - ed25519_keypair_t kp1, kp2; - ed25519_public_key_t pub1, pub2; - ed25519_secret_key_t sec1, sec2; - ed25519_signature_t sig1, sig2; - const uint8_t msg[] = - "GNU will be able to run Unix programs, " - "but will not be identical to Unix."; - const uint8_t msg2[] = - "Microsoft Windows extends the features of the DOS operating system, " - "yet is compatible with most existing applications that run under DOS."; - size_t msg_len = strlen((const char*)msg); - size_t msg2_len = strlen((const char*)msg2); - - (void)arg; - - tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec1, 0)); - tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec2, 1)); - - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub1, &sec1)); - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec1)); - - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0); - tt_int_op(ed25519_validate_pubkey(&pub2), OP_EQ, 0); - - tt_mem_op(pub1.pubkey, OP_EQ, pub2.pubkey, sizeof(pub1.pubkey)); - tt_assert(ed25519_pubkey_eq(&pub1, &pub2)); - tt_assert(ed25519_pubkey_eq(&pub1, &pub1)); - - memcpy(&kp1.pubkey, &pub1, sizeof(pub1)); - memcpy(&kp1.seckey, &sec1, sizeof(sec1)); - tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp1)); - tt_int_op(0, OP_EQ, ed25519_sign(&sig2, msg, msg_len, &kp1)); - - /* Ed25519 signatures are deterministic */ - tt_mem_op(sig1.sig, OP_EQ, sig2.sig, sizeof(sig1.sig)); - - /* Basic signature is valid. */ - tt_int_op(0, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); - - /* Altered signature doesn't work. */ - sig1.sig[0] ^= 3; - tt_int_op(-1, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); - - /* Wrong public key doesn't work. */ - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec2)); - tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub2)); - tt_assert(! ed25519_pubkey_eq(&pub1, &pub2)); - - /* Wrong message doesn't work. */ - tt_int_op(0, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub1)); - tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len-1, &pub1)); - tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg2, msg2_len, &pub1)); - - /* Batch signature checking works with some bad. */ - tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp2, 0)); - tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp2)); - { - ed25519_checkable_t ch[] = { - { &pub1, sig2, msg, msg_len }, /*ok*/ - { &pub1, sig2, msg, msg_len-1 }, /*bad*/ - { &kp2.pubkey, sig2, msg2, msg2_len }, /*bad*/ - { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ - }; - int okay[4]; - tt_int_op(-2, OP_EQ, ed25519_checksig_batch(okay, ch, 4)); - tt_int_op(okay[0], OP_EQ, 1); - tt_int_op(okay[1], OP_EQ, 0); - tt_int_op(okay[2], OP_EQ, 0); - tt_int_op(okay[3], OP_EQ, 1); - tt_int_op(-2, OP_EQ, ed25519_checksig_batch(NULL, ch, 4)); - } - - /* Batch signature checking works with all good. */ - { - ed25519_checkable_t ch[] = { - { &pub1, sig2, msg, msg_len }, /*ok*/ - { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ - }; - int okay[2]; - tt_int_op(0, OP_EQ, ed25519_checksig_batch(okay, ch, 2)); - tt_int_op(okay[0], OP_EQ, 1); - tt_int_op(okay[1], OP_EQ, 1); - tt_int_op(0, OP_EQ, ed25519_checksig_batch(NULL, ch, 2)); - } - - /* Test the string-prefixed sign/checksig functions */ - { - ed25519_signature_t manual_sig; - char *prefixed_msg; - - /* Generate a signature with a prefixed msg. */ - tt_int_op(0, OP_EQ, ed25519_sign_prefixed(&sig1, msg, msg_len, - "always in the mood", - &kp1)); - - /* First, check that ed25519_sign_prefixed() returns the exact same sig as - if we had manually prefixed the msg ourselves. */ - tor_asprintf(&prefixed_msg, "%s%s", "always in the mood", msg); - tt_int_op(0, OP_EQ, ed25519_sign(&manual_sig, (uint8_t *)prefixed_msg, - strlen(prefixed_msg), &kp1)); - tor_free(prefixed_msg); - tt_assert(fast_memeq(sig1.sig, manual_sig.sig, sizeof(sig1.sig))); - - /* Test that prefixed checksig verifies it properly. */ - tt_int_op(0, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, - "always in the mood", - &pub1)); - - /* Test that checksig with wrong prefix fails. */ - tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, - "always in the moo", - &pub1)); - tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, - "always in the moon", - &pub1)); - tt_int_op(-1, OP_EQ, ed25519_checksig_prefixed(&sig1, msg, msg_len, - "always in the mood!", - &pub1)); - } - - done: - ; -} - -static void -test_crypto_ed25519_test_vectors(void *arg) -{ - char *mem_op_hex_tmp=NULL; - int i; - struct { - const char *sk; - const char *pk; - const char *sig; - const char *msg; - } items[] = { - /* These test vectors were generated with the "ref" implementation of - * ed25519 from SUPERCOP-20130419 */ - { "4c6574277320686f706520746865726520617265206e6f206275677320696e20", - "f3e0e493b30f56e501aeb868fc912fe0c8b76621efca47a78f6d75875193dd87", - "b5d7fd6fd3adf643647ce1fe87a2931dedd1a4e38e6c662bedd35cdd80bfac51" - "1b2c7d1ee6bd929ac213014e1a8dc5373854c7b25dbe15ec96bf6c94196fae06", - "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" - "204e554c2d7465726d696e617465642e" - }, - - { "74686520696d706c656d656e746174696f6e20776869636820617265206e6f74", - "407f0025a1e1351a4cb68e92f5c0ebaf66e7aaf93a4006a4d1a66e3ede1cfeac", - "02884fde1c3c5944d0ecf2d133726fc820c303aae695adceabf3a1e01e95bf28" - "da88c0966f5265e9c6f8edc77b3b96b5c91baec3ca993ccd21a3f64203600601", - "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" - "204e554c2d7465726d696e617465642e" - }, - { "6578706f73656420627920456e676c697368207465787420617320696e707574", - "61681cb5fbd69f9bc5a462a21a7ab319011237b940bc781cdc47fcbe327e7706", - "6a127d0414de7510125d4bc214994ffb9b8857a46330832d05d1355e882344ad" - "f4137e3ca1f13eb9cc75c887ef2309b98c57528b4acd9f6376c6898889603209", - "506c6561736520657863757365206d7920667269656e642e2048652069736e2774" - "204e554c2d7465726d696e617465642e" - }, - - /* These come from "sign.input" in ed25519's page */ - { "5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9", - "6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257", - "0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258" - "c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e", - "5a8d9d0a22357e6655f9c785" - }, - { "940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800", - "a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd", - "d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d" - "640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c", - "b87d3813e03f58cf19fd0b6395" - }, - { "9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738", - "cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291", - "6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0" - "671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06", - "55c7fa434f5ed8cdec2b7aeac173", - }, - { "d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300", - "fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5", - "f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f3550395" - "1fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00", - "0a688e79be24f866286d4646b5d81c" - }, - /* These come from draft-irtf-cfrg-eddsa-05 section 7.1 */ - { - "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", - "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", - "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e06522490155" - "5fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", - "" - }, - { - "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", - "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", - "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da" - "085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", - "72" - }, - { - "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", - "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", - "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350" - "aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03", - "08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98" - "fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d8" - "79de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d" - "658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc" - "1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4fe" - "ba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e" - "06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbef" - "efd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7" - "aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed1" - "85ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2" - "d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24" - "554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f270" - "88d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc" - "2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b07" - "07e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128ba" - "b27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51a" - "ddd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429e" - "c96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb7" - "51fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c" - "42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8" - "ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34df" - "f7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08" - "d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649" - "de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e4" - "88acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a3" - "2ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e" - "6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5f" - "b93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b5" - "0d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1" - "369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380d" - "b2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c" - "0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0" - }, - { - "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42", - "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", - "dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b589" - "09351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704", - "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" - "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" - }, - { NULL, NULL, NULL, NULL} - }; - - (void)arg; - - for (i = 0; items[i].pk; ++i) { - ed25519_keypair_t kp; - ed25519_signature_t sig; - uint8_t sk_seed[32]; - uint8_t *msg; - size_t msg_len; - base16_decode((char*)sk_seed, sizeof(sk_seed), - items[i].sk, 64); - ed25519_secret_key_from_seed(&kp.seckey, sk_seed); - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&kp.pubkey, &kp.seckey)); - test_memeq_hex(kp.pubkey.pubkey, items[i].pk); - - msg_len = strlen(items[i].msg) / 2; - msg = tor_malloc(msg_len); - base16_decode((char*)msg, msg_len, items[i].msg, strlen(items[i].msg)); - - tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, msg_len, &kp)); - test_memeq_hex(sig.sig, items[i].sig); - - tor_free(msg); - } - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_ed25519_encode(void *arg) -{ - char buf[ED25519_SIG_BASE64_LEN+1]; - ed25519_keypair_t kp; - ed25519_public_key_t pk; - ed25519_signature_t sig1, sig2; - char *mem_op_hex_tmp = NULL; - (void) arg; - - /* Test roundtrip. */ - tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, 0)); - tt_int_op(0, OP_EQ, ed25519_public_to_base64(buf, &kp.pubkey)); - tt_int_op(ED25519_BASE64_LEN, OP_EQ, strlen(buf)); - tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, buf)); - tt_mem_op(kp.pubkey.pubkey, OP_EQ, pk.pubkey, ED25519_PUBKEY_LEN); - - tt_int_op(0, OP_EQ, ed25519_sign(&sig1, (const uint8_t*)"ABC", 3, &kp)); - tt_int_op(0, OP_EQ, ed25519_signature_to_base64(buf, &sig1)); - tt_int_op(0, OP_EQ, ed25519_signature_from_base64(&sig2, buf)); - tt_mem_op(sig1.sig, OP_EQ, sig2.sig, ED25519_SIG_LEN); - - /* Test known value. */ - tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, - "lVIuIctLjbGZGU5wKMNXxXlSE3cW4kaqkqm04u6pxvM")); - test_memeq_hex(pk.pubkey, - "95522e21cb4b8db199194e7028c357c57952137716e246aa92a9b4e2eea9c6f3"); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_ed25519_convert(void *arg) -{ - const uint8_t msg[] = - "The eyes are not here / There are no eyes here."; - const int N = 30; - int i; - (void)arg; - - for (i = 0; i < N; ++i) { - curve25519_keypair_t curve25519_keypair; - ed25519_keypair_t ed25519_keypair; - ed25519_public_key_t ed25519_pubkey; - - int bit=0; - ed25519_signature_t sig; - - tt_int_op(0,OP_EQ,curve25519_keypair_generate(&curve25519_keypair, i&1)); - tt_int_op(0,OP_EQ,ed25519_keypair_from_curve25519_keypair( - &ed25519_keypair, &bit, &curve25519_keypair)); - tt_int_op(0,OP_EQ,ed25519_public_key_from_curve25519_public_key( - &ed25519_pubkey, &curve25519_keypair.pubkey, bit)); - tt_mem_op(ed25519_pubkey.pubkey, OP_EQ, ed25519_keypair.pubkey.pubkey, 32); - - tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair)); - tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), - &ed25519_pubkey)); - - tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, - &ed25519_pubkey)); - sig.sig[0] ^= 15; - tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), - &ed25519_pubkey)); - } - - done: - ; -} - -static void -test_crypto_ed25519_blinding(void *arg) -{ - const uint8_t msg[] = - "Eyes I dare not meet in dreams / In death's dream kingdom"; - - const int N = 30; - int i; - (void)arg; - - for (i = 0; i < N; ++i) { - uint8_t blinding[32]; - ed25519_keypair_t ed25519_keypair; - ed25519_keypair_t ed25519_keypair_blinded; - ed25519_public_key_t ed25519_pubkey_blinded; - - ed25519_signature_t sig; - - crypto_rand((char*) blinding, sizeof(blinding)); - - tt_int_op(0,OP_EQ,ed25519_keypair_generate(&ed25519_keypair, 0)); - tt_int_op(0,OP_EQ,ed25519_keypair_blind(&ed25519_keypair_blinded, - &ed25519_keypair, blinding)); - - tt_int_op(0,OP_EQ,ed25519_public_blind(&ed25519_pubkey_blinded, - &ed25519_keypair.pubkey, blinding)); - - tt_mem_op(ed25519_pubkey_blinded.pubkey, OP_EQ, - ed25519_keypair_blinded.pubkey.pubkey, 32); - - tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), - &ed25519_keypair_blinded)); - - tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), - &ed25519_pubkey_blinded)); - - tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, - &ed25519_pubkey_blinded)); - sig.sig[0] ^= 15; - tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), - &ed25519_pubkey_blinded)); - } - - done: - ; -} - -/** Test that our blinding functions will fail if we pass them bad pubkeys */ -static void -test_crypto_ed25519_blinding_fail(void *arg) -{ - int retval; - uint8_t param[32] = {2}; - ed25519_public_key_t pub; - ed25519_public_key_t pub_blinded; - - (void)arg; - - /* This point is not on the curve: the blind routines should fail */ - const char badkey[] = - "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0"; - retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey), - badkey, strlen(badkey)); - tt_int_op(retval, OP_EQ, sizeof(pub.pubkey)); - retval = ed25519_public_blind(&pub_blinded, &pub, param); - tt_int_op(retval, OP_EQ, -1); - - /* This point is legit: blind routines should be happy */ - const char goodkey[] = - "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794"; - retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey), - goodkey, strlen(goodkey)); - tt_int_op(retval, OP_EQ, sizeof(pub.pubkey)); - retval = ed25519_public_blind(&pub_blinded, &pub, param); - tt_int_op(retval, OP_EQ, 0); - - done: - ; -} - -static void -test_crypto_ed25519_testvectors(void *arg) -{ - unsigned i; - char *mem_op_hex_tmp = NULL; - (void)arg; - - for (i = 0; i < ARRAY_LENGTH(ED25519_SECRET_KEYS); ++i) { - uint8_t sk[32]; - ed25519_secret_key_t esk; - ed25519_public_key_t pk, blind_pk, pkfromcurve; - ed25519_keypair_t keypair, blind_keypair; - curve25519_keypair_t curvekp; - uint8_t blinding_param[32]; - ed25519_signature_t sig; - int sign; - - memset(&curvekp, 0xd0, sizeof(curvekp)); - -#define DECODE(p,s) base16_decode((char*)(p),sizeof(p),(s),strlen(s)) -#define EQ(a,h) test_memeq_hex((const char*)(a), (h)) - - tt_int_op(sizeof(sk), OP_EQ, DECODE(sk, ED25519_SECRET_KEYS[i])); - tt_int_op(sizeof(blinding_param), OP_EQ, DECODE(blinding_param, - ED25519_BLINDING_PARAMS[i])); - - tt_int_op(0, OP_EQ, ed25519_secret_key_from_seed(&esk, sk)); - EQ(esk.seckey, ED25519_EXPANDED_SECRET_KEYS[i]); - - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &esk)); - EQ(pk.pubkey, ED25519_PUBLIC_KEYS[i]); - - memcpy(&curvekp.seckey.secret_key, esk.seckey, 32); - curve25519_public_key_generate(&curvekp.pubkey, &curvekp.seckey); - - tt_int_op(0, OP_EQ, - ed25519_keypair_from_curve25519_keypair(&keypair, &sign, &curvekp)); - tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( - &pkfromcurve, &curvekp.pubkey, sign)); - tt_mem_op(keypair.pubkey.pubkey, OP_EQ, pkfromcurve.pubkey, 32); - EQ(curvekp.pubkey.public_key, ED25519_CURVE25519_PUBLIC_KEYS[i]); - - /* Self-signing */ - memcpy(&keypair.seckey, &esk, sizeof(esk)); - memcpy(&keypair.pubkey, &pk, sizeof(pk)); - - tt_int_op(0, OP_EQ, ed25519_sign(&sig, pk.pubkey, 32, &keypair)); - - EQ(sig.sig, ED25519_SELF_SIGNATURES[i]); - - /* Blinding */ - tt_int_op(0, OP_EQ, - ed25519_keypair_blind(&blind_keypair, &keypair, blinding_param)); - tt_int_op(0, OP_EQ, - ed25519_public_blind(&blind_pk, &pk, blinding_param)); - - EQ(blind_keypair.seckey.seckey, ED25519_BLINDED_SECRET_KEYS[i]); - EQ(blind_pk.pubkey, ED25519_BLINDED_PUBLIC_KEYS[i]); - - tt_mem_op(blind_pk.pubkey, OP_EQ, blind_keypair.pubkey.pubkey, 32); - -#undef DECODE -#undef EQ - } - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_ed25519_storage(void *arg) -{ - (void)arg; - ed25519_keypair_t *keypair = NULL; - ed25519_public_key_t pub; - ed25519_secret_key_t sec; - char *fname_1 = tor_strdup(get_fname("ed_seckey_1")); - char *fname_2 = tor_strdup(get_fname("ed_pubkey_2")); - char *contents = NULL; - char *tag = NULL; - - keypair = tor_malloc_zero(sizeof(ed25519_keypair_t)); - tt_int_op(0,OP_EQ,ed25519_keypair_generate(keypair, 0)); - tt_int_op(0,OP_EQ, - ed25519_seckey_write_to_file(&keypair->seckey, fname_1, "foo")); - tt_int_op(0,OP_EQ, - ed25519_pubkey_write_to_file(&keypair->pubkey, fname_2, "bar")); - - tt_int_op(-1, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_1)); - tt_ptr_op(tag, OP_EQ, NULL); - tt_int_op(-1, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_2)); - tt_ptr_op(tag, OP_EQ, NULL); - - tt_int_op(0, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_2)); - tt_str_op(tag, OP_EQ, "bar"); - tor_free(tag); - tt_int_op(0, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_1)); - tt_str_op(tag, OP_EQ, "foo"); - tor_free(tag); - - /* whitebox test: truncated keys. */ - tt_int_op(0, OP_EQ, do_truncate(fname_1, 40)); - tt_int_op(0, OP_EQ, do_truncate(fname_2, 40)); - tt_int_op(-1, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_2)); - tt_ptr_op(tag, OP_EQ, NULL); - tor_free(tag); - tt_int_op(-1, OP_EQ, ed25519_seckey_read_from_file(&sec, &tag, fname_1)); - tt_ptr_op(tag, OP_EQ, NULL); - - done: - tor_free(fname_1); - tor_free(fname_2); - tor_free(contents); - tor_free(tag); - ed25519_keypair_free(keypair); -} - -static void -test_crypto_siphash(void *arg) -{ - /* From the reference implementation, taking - k = 00 01 02 ... 0f - and in = 00; 00 01; 00 01 02; ... - */ - const uint8_t VECTORS[64][8] = - { - { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, }, - { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, }, - { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, }, - { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, }, - { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, }, - { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, }, - { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, }, - { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, }, - { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, }, - { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, }, - { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, }, - { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, }, - { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, }, - { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, }, - { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, }, - { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, }, - { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, }, - { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, }, - { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, }, - { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, }, - { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, }, - { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, }, - { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, }, - { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, }, - { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, }, - { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, }, - { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, }, - { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, }, - { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, }, - { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, }, - { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, }, - { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, }, - { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, }, - { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, }, - { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, }, - { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, }, - { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, }, - { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, }, - { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, }, - { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, }, - { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, }, - { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, }, - { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, }, - { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, }, - { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, }, - { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, }, - { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, }, - { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, }, - { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, }, - { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, }, - { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, }, - { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, }, - { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, }, - { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, }, - { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, }, - { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, }, - { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, }, - { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, }, - { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, }, - { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, }, - { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, }, - { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, }, - { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, }, - { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, } - }; - - const struct sipkey K = { U64_LITERAL(0x0706050403020100), - U64_LITERAL(0x0f0e0d0c0b0a0908) }; - uint8_t input[64]; - int i, j; - - (void)arg; - - for (i = 0; i < 64; ++i) - input[i] = i; - - for (i = 0; i < 64; ++i) { - uint64_t r = siphash24(input, i, &K); - for (j = 0; j < 8; ++j) { - tt_int_op( (r >> (j*8)) & 0xff, OP_EQ, VECTORS[i][j]); - } - } - - done: - ; -} - -/* We want the likelihood that the random buffer exhibits any regular pattern - * to be far less than the memory bit error rate in the int return value. - * Using 2048 bits provides a failure rate of 1/(3 * 10^616), and we call - * 3 functions, leading to an overall error rate of 1/10^616. - * This is comparable with the 1/10^603 failure rate of test_crypto_rng_range. - */ -#define FAILURE_MODE_BUFFER_SIZE (2048/8) - -/** Check crypto_rand for a failure mode where it does nothing to the buffer, - * or it sets the buffer to all zeroes. Return 0 when the check passes, - * or -1 when it fails. */ -static int -crypto_rand_check_failure_mode_zero(void) -{ - char buf[FAILURE_MODE_BUFFER_SIZE]; - - memset(buf, 0, FAILURE_MODE_BUFFER_SIZE); - crypto_rand(buf, FAILURE_MODE_BUFFER_SIZE); - - for (size_t i = 0; i < FAILURE_MODE_BUFFER_SIZE; i++) { - if (buf[i] != 0) { - return 0; - } - } - - return -1; -} - -/** Check crypto_rand for a failure mode where every int64_t in the buffer is - * the same. Return 0 when the check passes, or -1 when it fails. */ -static int -crypto_rand_check_failure_mode_identical(void) -{ - /* just in case the buffer size isn't a multiple of sizeof(int64_t) */ -#define FAILURE_MODE_BUFFER_SIZE_I64 \ - (FAILURE_MODE_BUFFER_SIZE/SIZEOF_INT64_T) -#define FAILURE_MODE_BUFFER_SIZE_I64_BYTES \ - (FAILURE_MODE_BUFFER_SIZE_I64*SIZEOF_INT64_T) - -#if FAILURE_MODE_BUFFER_SIZE_I64 < 2 -#error FAILURE_MODE_BUFFER_SIZE needs to be at least 2*SIZEOF_INT64_T -#endif - - int64_t buf[FAILURE_MODE_BUFFER_SIZE_I64]; - - memset(buf, 0, FAILURE_MODE_BUFFER_SIZE_I64_BYTES); - crypto_rand((char *)buf, FAILURE_MODE_BUFFER_SIZE_I64_BYTES); - - for (size_t i = 1; i < FAILURE_MODE_BUFFER_SIZE_I64; i++) { - if (buf[i] != buf[i-1]) { - return 0; - } - } - - return -1; -} - -/** Check crypto_rand for a failure mode where it increments the "random" - * value by 1 for every byte in the buffer. (This is OpenSSL's PREDICT mode.) - * Return 0 when the check passes, or -1 when it fails. */ -static int -crypto_rand_check_failure_mode_predict(void) -{ - unsigned char buf[FAILURE_MODE_BUFFER_SIZE]; - - memset(buf, 0, FAILURE_MODE_BUFFER_SIZE); - crypto_rand((char *)buf, FAILURE_MODE_BUFFER_SIZE); - - for (size_t i = 1; i < FAILURE_MODE_BUFFER_SIZE; i++) { - /* check if the last byte was incremented by 1, including integer - * wrapping */ - if (buf[i] - buf[i-1] != 1 && buf[i-1] - buf[i] != 255) { - return 0; - } - } - - return -1; -} - -#undef FAILURE_MODE_BUFFER_SIZE - -/** Test that our ed25519 validation function rejects evil public keys and - * accepts good ones. */ -static void -test_crypto_ed25519_validation(void *arg) -{ - (void) arg; - - int retval; - ed25519_public_key_t pub1; - - /* See https://lists.torproject.org/pipermail/tor-dev/2017-April/012230.html - for a list of points with torsion components in ed25519. */ - - { /* Point with torsion component (order 8l) */ - const char badkey[] = - "300ef2e64e588e1df55b48e4da0416ffb64cc85d5b00af6463d5cc6c2b1c185e"; - retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), - badkey, strlen(badkey)); - tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); - } - - { /* Point with torsion component (order 4l) */ - const char badkey[] = - "f43e3a046db8749164c6e69b193f1e942c7452e7d888736f40b98093d814d5e7"; - retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), - badkey, strlen(badkey)); - tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); - } - - { /* Point with torsion component (order 2l) */ - const char badkey[] = - "c9fff3af0471c28e33e98c2043e44f779d0427b1e37c521a6bddc011ed1869af"; - retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), - badkey, strlen(badkey)); - tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); - } - - { /* This point is not even on the curve */ - const char badkey[] = - "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0"; - retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), - badkey, strlen(badkey)); - tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1); - } - - { /* This one is a good key */ - const char goodkey[] = - "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794"; - retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey), - goodkey, strlen(goodkey)); - tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey)); - tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0); - } - - done: ; -} - -static void -test_crypto_failure_modes(void *arg) -{ - int rv = 0; - (void)arg; - - rv = crypto_early_init(); - tt_int_op(rv, OP_EQ, 0); - - /* Check random works */ - rv = crypto_rand_check_failure_mode_zero(); - tt_int_op(rv, OP_EQ, 0); - - rv = crypto_rand_check_failure_mode_identical(); - tt_int_op(rv, OP_EQ, 0); - - rv = crypto_rand_check_failure_mode_predict(); - tt_int_op(rv, OP_EQ, 0); - - done: - ; -} - -#define CRYPTO_LEGACY(name) \ - { #name, test_crypto_ ## name , 0, NULL, NULL } - -#define ED25519_TEST_ONE(name, fl, which) \ - { #name "/ed25519_" which, test_crypto_ed25519_ ## name, (fl), \ - &ed25519_test_setup, (void*)which } - -#define ED25519_TEST(name, fl) \ - ED25519_TEST_ONE(name, (fl), "donna"), \ - ED25519_TEST_ONE(name, (fl), "ref10") - -struct testcase_t crypto_tests[] = { - CRYPTO_LEGACY(formats), - CRYPTO_LEGACY(rng), - { "rng_range", test_crypto_rng_range, 0, NULL, NULL }, - { "rng_strongest", test_crypto_rng_strongest, TT_FORK, NULL, NULL }, - { "rng_strongest_nosyscall", test_crypto_rng_strongest, TT_FORK, - &passthrough_setup, (void*)"nosyscall" }, - { "rng_strongest_nofallback", test_crypto_rng_strongest, TT_FORK, - &passthrough_setup, (void*)"nofallback" }, - { "rng_strongest_broken", test_crypto_rng_strongest, TT_FORK, - &passthrough_setup, (void*)"broken" }, - { "openssl_version", test_crypto_openssl_version, TT_FORK, NULL, NULL }, - { "aes_AES", test_crypto_aes128, TT_FORK, &passthrough_setup, (void*)"aes" }, - { "aes_EVP", test_crypto_aes128, TT_FORK, &passthrough_setup, (void*)"evp" }, - { "aes128_ctr_testvec", test_crypto_aes_ctr_testvec, 0, - &passthrough_setup, (void*)"128" }, - { "aes192_ctr_testvec", test_crypto_aes_ctr_testvec, 0, - &passthrough_setup, (void*)"192" }, - { "aes256_ctr_testvec", test_crypto_aes_ctr_testvec, 0, - &passthrough_setup, (void*)"256" }, - CRYPTO_LEGACY(sha), - CRYPTO_LEGACY(pk), - { "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL }, - { "pk_base64", test_crypto_pk_base64, TT_FORK, NULL, NULL }, - CRYPTO_LEGACY(digests), - { "digest_names", test_crypto_digest_names, 0, NULL, NULL }, - { "sha3", test_crypto_sha3, TT_FORK, NULL, NULL}, - { "sha3_xof", test_crypto_sha3_xof, TT_FORK, NULL, NULL}, - { "mac_sha3", test_crypto_mac_sha3, TT_FORK, NULL, NULL}, - CRYPTO_LEGACY(dh), - { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &passthrough_setup, - (void*)"aes" }, - { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &passthrough_setup, - (void*)"evp" }, - CRYPTO_LEGACY(base32_decode), - { "kdf_TAP", test_crypto_kdf_TAP, 0, NULL, NULL }, - { "hkdf_sha256", test_crypto_hkdf_sha256, 0, NULL, NULL }, - { "hkdf_sha256_testvecs", test_crypto_hkdf_sha256_testvecs, 0, NULL, NULL }, - { "curve25519_impl", test_crypto_curve25519_impl, 0, NULL, NULL }, - { "curve25519_impl_hibit", test_crypto_curve25519_impl, 0, NULL, (void*)"y"}, - { "curve25516_testvec", test_crypto_curve25519_testvec, 0, NULL, NULL }, - { "curve25519_basepoint", - test_crypto_curve25519_basepoint, TT_FORK, NULL, NULL }, - { "curve25519_wrappers", test_crypto_curve25519_wrappers, 0, NULL, NULL }, - { "curve25519_encode", test_crypto_curve25519_encode, 0, NULL, NULL }, - { "curve25519_persist", test_crypto_curve25519_persist, 0, NULL, NULL }, - ED25519_TEST(simple, 0), - ED25519_TEST(test_vectors, 0), - ED25519_TEST(encode, 0), - ED25519_TEST(convert, 0), - ED25519_TEST(blinding, 0), - ED25519_TEST(blinding_fail, 0), - ED25519_TEST(testvectors, 0), - ED25519_TEST(validation, 0), - { "ed25519_storage", test_crypto_ed25519_storage, 0, NULL, NULL }, - { "siphash", test_crypto_siphash, 0, NULL, NULL }, - { "failure_modes", test_crypto_failure_modes, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_crypto_openssl.c b/src/tor/src/test/test_crypto_openssl.c deleted file mode 100644 index 090cb4242..000000000 --- a/src/tor/src/test/test_crypto_openssl.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CRYPTO_PRIVATE - -#include "crypto.h" -#include "util.h" -#include "util_format.h" -#include "compat.h" -#include "test.h" - -#include -#include -#include "compat_openssl.h" - -/* Test for rectifying openssl RAND engine. */ -static void -test_crypto_rng_engine(void *arg) -{ - (void)arg; - RAND_METHOD dummy_method; - memset(&dummy_method, 0, sizeof(dummy_method)); - - /* We should be a no-op if we're already on RAND_OpenSSL */ - tt_int_op(0, OP_EQ, crypto_force_rand_ssleay()); - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* We should correct the method if it's a dummy. */ - RAND_set_rand_method(&dummy_method); -#ifdef LIBRESSL_VERSION_NUMBER - /* On libressl, you can't override the RNG. */ - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - tt_int_op(0, OP_EQ, crypto_force_rand_ssleay()); -#else - tt_assert(RAND_get_rand_method() == &dummy_method); - tt_int_op(1, OP_EQ, crypto_force_rand_ssleay()); -#endif /* defined(LIBRESSL_VERSION_NUMBER) */ - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* Make sure we aren't calling dummy_method */ - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - - done: - ; -} - -#ifndef OPENSSL_1_1_API -#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) -#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) -#endif - -/** Encode src into dest with OpenSSL's EVP Encode interface, returning the - * length of the encoded data in bytes. - */ -static int -base64_encode_evp(char *dest, char *src, size_t srclen) -{ - const unsigned char *s = (unsigned char*)src; - EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); - int len, ret; - - EVP_EncodeInit(ctx); - EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); - EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); - EVP_ENCODE_CTX_free(ctx); - return ret+ len; -} - -static void -test_crypto_base64_encode_matches(void *arg) -{ - (void)arg; - int i, j; - char data1[1024]; - char data2[1024]; - char data3[1024]; - - for (i = 0; i < 256; i++) { - /* Test the multiline format Base64 encoder with 0 .. 256 bytes of - * output against OpenSSL. - */ - const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); - data1[i] = i; - j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); - tt_int_op(j, OP_EQ, enclen); - j = base64_encode_evp(data3, data1, i); - tt_int_op(j, OP_EQ, enclen); - tt_mem_op(data2, OP_EQ, data3, enclen); - tt_int_op(j, OP_EQ, strlen(data2)); - } - - done: - ; -} - -struct testcase_t crypto_openssl_tests[] = { - { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, - { "base64_encode_match", test_crypto_base64_encode_matches, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_crypto_slow.c b/src/tor/src/test/test_crypto_slow.c deleted file mode 100644 index 2afb71ff5..000000000 --- a/src/tor/src/test/test_crypto_slow.c +++ /dev/null @@ -1,617 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define CRYPTO_S2K_PRIVATE -#include "or.h" -#include "test.h" -#include "crypto_s2k.h" -#include "crypto_pwbox.h" - -#if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT) -#define HAVE_LIBSCRYPT -#include -#endif - -#include - -/** Run unit tests for our secret-to-key passphrase hashing functionality. */ -static void -test_crypto_s2k_rfc2440(void *arg) -{ - char buf[29]; - char buf2[29]; - char *buf3 = NULL; - int i; - - (void)arg; - memset(buf, 0, sizeof(buf)); - memset(buf2, 0, sizeof(buf2)); - buf3 = tor_malloc(65536); - memset(buf3, 0, 65536); - - secret_to_key_rfc2440(buf+9, 20, "", 0, buf); - crypto_digest(buf2+9, buf3, 1024); - tt_mem_op(buf,OP_EQ, buf2, 29); - - memcpy(buf,"vrbacrda",8); - memcpy(buf2,"vrbacrda",8); - buf[8] = 96; - buf2[8] = 96; - secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf); - for (i = 0; i < 65536; i += 16) { - memcpy(buf3+i, "vrbacrda12345678", 16); - } - crypto_digest(buf2+9, buf3, 65536); - tt_mem_op(buf,OP_EQ, buf2, 29); - - done: - tor_free(buf3); -} - -static void -run_s2k_tests(const unsigned flags, const unsigned type, - int speclen, const int keylen, int legacy) -{ - uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN]; - int r; - size_t sz; - const char pw1[] = "You can't come in here unless you say swordfish!"; - const char pw2[] = "Now, I give you one more guess."; - - r = secret_to_key_new(buf, sizeof(buf), &sz, - pw1, strlen(pw1), flags); - tt_int_op(r, OP_EQ, S2K_OKAY); - tt_int_op(buf[0], OP_EQ, type); - - tt_int_op(sz, OP_EQ, keylen + speclen); - - if (legacy) { - memmove(buf, buf+1, sz-1); - --sz; - --speclen; - } - - tt_int_op(S2K_OKAY, OP_EQ, - secret_to_key_check(buf, sz, pw1, strlen(pw1))); - - tt_int_op(S2K_BAD_SECRET, OP_EQ, - secret_to_key_check(buf, sz, pw2, strlen(pw2))); - - /* Move key to buf2, and clear it. */ - memset(buf3, 0, sizeof(buf3)); - memcpy(buf2, buf+speclen, keylen); - memset(buf+speclen, 0, sz - speclen); - - /* Derivekey should produce the same results. */ - tt_int_op(S2K_OKAY, OP_EQ, - secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1))); - - tt_mem_op(buf2, OP_EQ, buf3, keylen); - - /* Derivekey with a longer output should fill the output. */ - memset(buf2, 0, sizeof(buf2)); - tt_int_op(S2K_OKAY, OP_EQ, - secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen, - pw1, strlen(pw1))); - - tt_mem_op(buf2, OP_NE, buf3, sizeof(buf2)); - - memset(buf3, 0, sizeof(buf3)); - tt_int_op(S2K_OKAY, OP_EQ, - secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen, - pw1, strlen(pw1))); - tt_mem_op(buf2, OP_EQ, buf3, sizeof(buf3)); - tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen)); - - done: - ; -} - -static void -test_crypto_s2k_general(void *arg) -{ - const char *which = arg; - - if (!strcmp(which, "scrypt")) { - run_s2k_tests(0, 2, 19, 32, 0); - } else if (!strcmp(which, "scrypt-low")) { - run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0); - } else if (!strcmp(which, "pbkdf2")) { - run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0); - } else if (!strcmp(which, "rfc2440")) { - run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0); - } else if (!strcmp(which, "rfc2440-legacy")) { - run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1); - } else { - tt_fail(); - } -} - -#if defined(HAVE_LIBSCRYPT) && defined(HAVE_EVP_PBE_SCRYPT) -static void -test_libscrypt_eq_openssl(void *arg) -{ - uint8_t buf1[64]; - uint8_t buf2[64]; - - uint64_t N; - uint32_t r, p; - uint64_t maxmem = 0; // --> SCRYPT_MAX_MEM in OpenSSL. - - int libscrypt_retval, openssl_retval; - - size_t dk_len = 64; - - (void)arg; - - memset(buf1,0,64); - memset(buf2,0,64); - - /* NOTE: we're using N,r the way OpenSSL and libscrypt define them, - * not the way draft-josefsson-scrypt-kdf-00.txt define them. - */ - N = 16; - r = 1; - p = 1; - - libscrypt_retval = - libscrypt_scrypt((const uint8_t *)"", 0, (const uint8_t *)"", 0, - N, r, p, buf1, dk_len); - openssl_retval = - EVP_PBE_scrypt((const char *)"", 0, (const unsigned char *)"", 0, - N, r, p, maxmem, buf2, dk_len); - - tt_int_op(libscrypt_retval, OP_EQ, 0); - tt_int_op(openssl_retval, OP_EQ, 1); - - tt_mem_op(buf1, OP_EQ, buf2, 64); - - memset(buf1,0,64); - memset(buf2,0,64); - - N = 1024; - r = 8; - p = 16; - - libscrypt_retval = - libscrypt_scrypt((const uint8_t *)"password", strlen("password"), - (const uint8_t *)"NaCl", strlen("NaCl"), - N, r, p, buf1, dk_len); - openssl_retval = - EVP_PBE_scrypt((const char *)"password", strlen("password"), - (const unsigned char *)"NaCl", strlen("NaCl"), - N, r, p, maxmem, buf2, dk_len); - - tt_int_op(libscrypt_retval, OP_EQ, 0); - tt_int_op(openssl_retval, OP_EQ, 1); - - tt_mem_op(buf1, OP_EQ, buf2, 64); - - memset(buf1,0,64); - memset(buf2,0,64); - - N = 16384; - r = 8; - p = 1; - - libscrypt_retval = - libscrypt_scrypt((const uint8_t *)"pleaseletmein", - strlen("pleaseletmein"), - (const uint8_t *)"SodiumChloride", - strlen("SodiumChloride"), - N, r, p, buf1, dk_len); - openssl_retval = - EVP_PBE_scrypt((const char *)"pleaseletmein", - strlen("pleaseletmein"), - (const unsigned char *)"SodiumChloride", - strlen("SodiumChloride"), - N, r, p, maxmem, buf2, dk_len); - - tt_int_op(libscrypt_retval, OP_EQ, 0); - tt_int_op(openssl_retval, OP_EQ, 1); - - tt_mem_op(buf1, OP_EQ, buf2, 64); - - memset(buf1,0,64); - memset(buf2,0,64); - - N = 1048576; - maxmem = 2 * 1024 * 1024 * (uint64_t)1024; // 2 GB - - libscrypt_retval = - libscrypt_scrypt((const uint8_t *)"pleaseletmein", - strlen("pleaseletmein"), - (const uint8_t *)"SodiumChloride", - strlen("SodiumChloride"), - N, r, p, buf1, dk_len); - openssl_retval = - EVP_PBE_scrypt((const char *)"pleaseletmein", - strlen("pleaseletmein"), - (const unsigned char *)"SodiumChloride", - strlen("SodiumChloride"), - N, r, p, maxmem, buf2, dk_len); - - tt_int_op(libscrypt_retval, OP_EQ, 0); - tt_int_op(openssl_retval, OP_EQ, 1); - - tt_mem_op(buf1, OP_EQ, buf2, 64); - - done: - return; -} -#endif /* defined(HAVE_LIBSCRYPT) && defined(HAVE_EVP_PBE_SCRYPT) */ - -static void -test_crypto_s2k_errors(void *arg) -{ - uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN]; - size_t sz; - - (void)arg; - - /* Bogus specifiers: simple */ - tt_int_op(S2K_BAD_LEN, OP_EQ, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"", 0, "ABC", 3)); - tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"\x10", 1, "ABC", 3)); - tt_int_op(S2K_BAD_LEN, OP_EQ, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"\x01\x02", 2, "ABC", 3)); - - tt_int_op(S2K_BAD_LEN, OP_EQ, - secret_to_key_check((const uint8_t*)"", 0, "ABC", 3)); - tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, - secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3)); - tt_int_op(S2K_BAD_LEN, OP_EQ, - secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3)); - - /* too long gets "BAD_LEN" too */ - memset(buf, 0, sizeof(buf)); - buf[0] = 2; - tt_int_op(S2K_BAD_LEN, OP_EQ, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, sizeof(buf), "ABC", 3)); - - /* Truncated output */ -#ifdef HAVE_LIBSCRYPT - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, - "ABC", 3, 0)); - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, - "ABC", 3, S2K_FLAG_LOW_MEM)); -#endif /* defined(HAVE_LIBSCRYPT) */ - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 37, &sz, - "ABC", 3, S2K_FLAG_USE_PBKDF2)); - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 29, &sz, - "ABC", 3, S2K_FLAG_NO_SCRYPT)); - -#ifdef HAVE_LIBSCRYPT - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, 0)); - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, - S2K_FLAG_LOW_MEM)); -#endif - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 17, - S2K_FLAG_USE_PBKDF2)); - tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 9, - S2K_FLAG_NO_SCRYPT)); - - /* Now try using type-specific bogus specifiers. */ - - /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow - * int32_t. */ - memset(buf, 0, sizeof(buf)); - buf[0] = 1; /* pbkdf2 */ - buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */ - tt_int_op(S2K_BAD_PARAMS, OP_EQ, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, 18, "ABC", 3)); - -#ifdef HAVE_LIBSCRYPT - /* It's a bad scrypt buffer if N would overflow uint64 */ - memset(buf, 0, sizeof(buf)); - buf[0] = 2; /* scrypt */ - buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */ - tt_int_op(S2K_BAD_PARAMS, OP_EQ, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, 19, "ABC", 3)); -#endif /* defined(HAVE_LIBSCRYPT) */ - - done: - ; -} - -static void -test_crypto_scrypt_vectors(void *arg) -{ - char *mem_op_hex_tmp = NULL; - uint8_t spec[64], out[64]; - - (void)arg; -#ifndef HAVE_LIBSCRYPT - if (1) - tt_skip(); -#endif - - /* Test vectors from - http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11. - - Note that the names of 'r' and 'N' are switched in that section. Or - possibly in libscrypt. - */ - - base16_decode((char*)spec, sizeof(spec), - "0400", 4); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, OP_EQ, - secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2)); - test_memeq_hex(out, - "77d6576238657b203b19ca42c18a0497" - "f16b4844e3074ae8dfdffa3fede21442" - "fcd0069ded0948f8326a753a0fc81f17" - "e8d3e0fb2e0d3628cf35e20c38d18906"); - - base16_decode((char*)spec, sizeof(spec), - "4e61436c" "0A34", 12); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, OP_EQ, - secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2)); - test_memeq_hex(out, - "fdbabe1c9d3472007856e7190d01e9fe" - "7c6ad7cbc8237830e77376634b373162" - "2eaf30d92e22a3886ff109279d9830da" - "c727afb94a83ee6d8360cbdfa2cc0640"); - - base16_decode((char*)spec, sizeof(spec), - "536f6469756d43686c6f72696465" "0e30", 32); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, OP_EQ, - secret_to_key_compute_key(out, 64, spec, 16, - "pleaseletmein", 13, 2)); - test_memeq_hex(out, - "7023bdcb3afd7348461c06cd81fd38eb" - "fda8fbba904f8e3ea9b543f6545da1f2" - "d5432955613f0fcf62d49705242a9af9" - "e61e85dc0d651e40dfcf017b45575887"); - - base16_decode((char*)spec, sizeof(spec), - "536f6469756d43686c6f72696465" "1430", 32); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, OP_EQ, - secret_to_key_compute_key(out, 64, spec, 16, - "pleaseletmein", 13, 2)); - test_memeq_hex(out, - "2101cb9b6a511aaeaddbbe09cf70f881" - "ec568d574a2ffd4dabe5ee9820adaa47" - "8e56fd8f4ba5d09ffa1c6d927c40f4c3" - "37304049e8a952fbcbf45c6fa77a41a4"); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_pbkdf2_vectors(void *arg) -{ - char *mem_op_hex_tmp = NULL; - uint8_t spec[64], out[64]; - (void)arg; - - /* Test vectors from RFC6070, section 2 */ - base16_decode((char*)spec, sizeof(spec), - "73616c74" "00" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, OP_EQ, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6"); - - base16_decode((char*)spec, sizeof(spec), - "73616c74" "01" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, OP_EQ, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"); - - base16_decode((char*)spec, sizeof(spec), - "73616c74" "0C" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, OP_EQ, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1"); - - /* This is the very slow one here. When enabled, it accounts for roughly - * half the time spent in test-slow. */ - /* - base16_decode((char*)spec, sizeof(spec), - "73616c74" "18" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, OP_EQ, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"); - */ - - base16_decode((char*)spec, sizeof(spec), - "73616c7453414c5473616c7453414c5473616c745" - "3414c5473616c7453414c5473616c74" "0C" , 74); - memset(out, 0x00, sizeof(out)); - tt_int_op(25, OP_EQ, - secret_to_key_compute_key(out, 25, spec, 37, - "passwordPASSWORDpassword", 24, 1)); - test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"); - - base16_decode((char*)spec, sizeof(spec), - "7361006c74" "0c" , 12); - memset(out, 0x00, sizeof(out)); - tt_int_op(16, OP_EQ, - secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1)); - test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3"); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_pwbox(void *arg) -{ - uint8_t *boxed=NULL, *decoded=NULL; - size_t len, dlen; - unsigned i; - const char msg[] = "This bunny reminds you that you still have a " - "salamander in your sylladex. She is holding the bunny Dave got you. " - "It’s sort of uncanny how similar they are, aside from the knitted " - "enhancements. Seriously, what are the odds?? So weird."; - const char pw[] = "I'm a night owl and a wise bird too"; - - const unsigned flags[] = { 0, - S2K_FLAG_NO_SCRYPT, - S2K_FLAG_LOW_MEM, - S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM, - S2K_FLAG_USE_PBKDF2 }; - (void)arg; - - for (i = 0; i < ARRAY_LENGTH(flags); ++i) { - tt_int_op(0, OP_EQ, crypto_pwbox(&boxed, &len, - (const uint8_t*)msg, strlen(msg), - pw, strlen(pw), flags[i])); - tt_assert(boxed); - tt_assert(len > 128+32); - - tt_int_op(0, OP_EQ, crypto_unpwbox(&decoded, &dlen, boxed, len, - pw, strlen(pw))); - - tt_assert(decoded); - tt_uint_op(dlen, OP_EQ, strlen(msg)); - tt_mem_op(decoded, OP_EQ, msg, dlen); - - tor_free(decoded); - - tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw)-1)); - boxed[len-1] ^= 1; - tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw))); - boxed[0] = 255; - tt_int_op(UNPWBOX_CORRUPTED, OP_EQ, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw))); - - tor_free(boxed); - } - - done: - tor_free(boxed); - tor_free(decoded); -} - -static void -test_crypto_ed25519_fuzz_donna(void *arg) -{ - const unsigned iters = 1024; - uint8_t msg[1024]; - unsigned i; - (void)arg; - - tt_uint_op(iters, OP_EQ, sizeof(msg)); - crypto_rand((char*) msg, sizeof(msg)); - - /* Fuzz Ed25519-donna vs ref10, alternating the implementation used to - * generate keys/sign per iteration. - */ - for (i = 0; i < iters; ++i) { - const int use_donna = i & 1; - uint8_t blinding[32]; - curve25519_keypair_t ckp; - ed25519_keypair_t kp, kp_blind, kp_curve25519; - ed25519_public_key_t pk, pk_blind, pk_curve25519; - ed25519_signature_t sig, sig_blind; - int bit = 0; - - crypto_rand((char*) blinding, sizeof(blinding)); - - /* Impl. A: - * 1. Generate a keypair. - * 2. Blinded the keypair. - * 3. Sign a message (unblinded). - * 4. Sign a message (blinded). - * 5. Generate a curve25519 keypair, and convert it to Ed25519. - */ - ed25519_set_impl_params(use_donna); - tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, i&1)); - tt_int_op(0, OP_EQ, ed25519_keypair_blind(&kp_blind, &kp, blinding)); - tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, i, &kp)); - tt_int_op(0, OP_EQ, ed25519_sign(&sig_blind, msg, i, &kp_blind)); - - tt_int_op(0, OP_EQ, curve25519_keypair_generate(&ckp, i&1)); - tt_int_op(0, OP_EQ, ed25519_keypair_from_curve25519_keypair( - &kp_curve25519, &bit, &ckp)); - - /* Impl. B: - * 1. Validate the public key by rederiving it. - * 2. Validate the blinded public key by rederiving it. - * 3. Validate the unblinded signature (and test a invalid signature). - * 4. Validate the blinded signature. - * 5. Validate the public key (from Curve25519) by rederiving it. - */ - ed25519_set_impl_params(!use_donna); - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &kp.seckey)); - tt_mem_op(pk.pubkey, OP_EQ, kp.pubkey.pubkey, 32); - - tt_int_op(0, OP_EQ, ed25519_public_blind(&pk_blind, &kp.pubkey, blinding)); - tt_mem_op(pk_blind.pubkey, OP_EQ, kp_blind.pubkey.pubkey, 32); - - tt_int_op(0, OP_EQ, ed25519_checksig(&sig, msg, i, &pk)); - sig.sig[0] ^= 15; - tt_int_op(-1, OP_EQ, ed25519_checksig(&sig, msg, sizeof(msg), &pk)); - - tt_int_op(0, OP_EQ, ed25519_checksig(&sig_blind, msg, i, &pk_blind)); - - tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( - &pk_curve25519, &ckp.pubkey, bit)); - tt_mem_op(pk_curve25519.pubkey, OP_EQ, kp_curve25519.pubkey.pubkey, 32); - } - - done: - ; -} - -#define CRYPTO_LEGACY(name) \ - { #name, test_crypto_ ## name , 0, NULL, NULL } - -#define ED25519_TEST_ONE(name, fl, which) \ - { #name "/ed25519_" which, test_crypto_ed25519_ ## name, (fl), \ - &ed25519_test_setup, (void*)which } - -#define ED25519_TEST(name, fl) \ - ED25519_TEST_ONE(name, (fl), "donna"), \ - ED25519_TEST_ONE(name, (fl), "ref10") - -struct testcase_t slow_crypto_tests[] = { - CRYPTO_LEGACY(s2k_rfc2440), -#ifdef HAVE_LIBSCRYPT - { "s2k_scrypt", test_crypto_s2k_general, 0, &passthrough_setup, - (void*)"scrypt" }, - { "s2k_scrypt_low", test_crypto_s2k_general, 0, &passthrough_setup, - (void*)"scrypt-low" }, -#ifdef HAVE_EVP_PBE_SCRYPT - { "libscrypt_eq_openssl", test_libscrypt_eq_openssl, 0, NULL, NULL }, -#endif -#endif /* defined(HAVE_LIBSCRYPT) */ - { "s2k_pbkdf2", test_crypto_s2k_general, 0, &passthrough_setup, - (void*)"pbkdf2" }, - { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &passthrough_setup, - (void*)"rfc2440" }, - { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &passthrough_setup, - (void*)"rfc2440-legacy" }, - { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL }, - { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL }, - { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL }, - { "pwbox", test_crypto_pwbox, 0, NULL, NULL }, - ED25519_TEST(fuzz_donna, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_data.c b/src/tor/src/test/test_data.c deleted file mode 100644 index ce6c3394f..000000000 --- a/src/tor/src/test/test_data.c +++ /dev/null @@ -1,202 +0,0 @@ -/* Copyright 2001-2004 Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "test.h" - -/* Our unit test expect that the AUTHORITY_CERT_* public keys will sort - * in this order. */ -#define AUTHORITY_CERT_A AUTHORITY_CERT_3 -#define AUTHORITY_CERT_B AUTHORITY_CERT_1 -#define AUTHORITY_CERT_C AUTHORITY_CERT_2 - -#define AUTHORITY_SIGNKEY_A AUTHORITY_SIGNKEY_3 -#define AUTHORITY_SIGNKEY_B AUTHORITY_SIGNKEY_1 -#define AUTHORITY_SIGNKEY_C AUTHORITY_SIGNKEY_2 - -/** First of 3 example authority certificates for unit testing. */ -const char AUTHORITY_CERT_A[] = -"dir-key-certificate-version 3\n" -"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n" -"dir-key-published 2008-12-12 18:07:24\n" -"dir-key-expires 2009-12-12 18:07:24\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n" -"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n" -"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n" -"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n" -"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n" -"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n" -"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n" -"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n" -"btUa4c+cUTjHAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n" -"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n" -"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-crosscert\n" -"-----BEGIN ID SIGNATURE-----\n" -"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n" -"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n" -"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n" -"-----END ID SIGNATURE-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n" -"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n" -"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n" -"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n" -"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n" -"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n" -"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n" -"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n" -"-----END SIGNATURE-----\n"; - -/** The private signing key for AUTHORITY_CERT_1 */ -const char AUTHORITY_SIGNKEY_A[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQCz0lCJ8rhLujVdzY6M6ZWp4iBAc0FxI79cff/pqp8GQAaWFZrs\n" -"vQPJ8XqMmN7GRbJ2MDVvyGYwIBtt6RJnr7txfi+JsjI42mujkZdzIEWEOIJrhaqX\n" -"n6xnZssEQpXodiXq5EOFcTrqtdHZ/2myE8y8mmczMN9Cl1qeacSlzi7cRQIDAQAB\n" -"AoGASpzUkDinIbzU0eQt5ugxEnliOnvYRpK3nzAk1JbYPyan1PSIAPz4qn1JBTeV\n" -"EB3xS7r7ITO8uvFHkFZqLZ2sH1uE6e4sAytJGO+kyqnlkiDTPEXpcGe99j8PH1yj\n" -"xUOrHRlAYWjG8NEkQi+APA+HZkswE3L/viFwR2AARoE2ac0CQQDsOLdNJa+mqn6N\n" -"1L76nEl/YgXHtKUks+beOR3IgknKEjcsJJEUHyiu0wjbXZV6gTtyQvcAePglUUD1\n" -"R2OkOOADAkEAwuCxvHEAPeQbVt8fSvxw74vqew6LITP2Utb1dQK0E26IRPF36BsJ\n" -"buO/gqMZv6ALq+/KxpA/pUsApbgog9uUFwJAYvHCvbrKX1pM1iXFtP1fv86UMzlU\n" -"bxI34t8zvXftZonIuGG8rxv6E3hr3k7NvNmCx/KKuZTyA9eMCPFVKEV2dwJACn8j\n" -"06yagLrqphE6lEVop953cM1lvRIZcHjXm8fbfzhy6pO/C6d5KJnn1NeIKYQrXMV7\n" -"vJpEc1jI3iQ/Omr3XQJAEBIt5MlP2wlrX9om7B+32XBygUssY3cw/bXybZrtSU0/\n" -"Yx4lqK0ca5IkTp3HevwnlWaJgbaOTUspCVshzJBhDA==\n" -"-----END RSA PRIVATE KEY-----\n"; - -const char AUTHORITY_SIGNKEY_A_DIGEST[] = - "CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2"; -const char AUTHORITY_SIGNKEY_A_DIGEST256[] = - "AF7C5468DBE3BA54A052726038D7F15F3C4CA511B1952645B3D96D83A8DFB51C"; - -/** Second of 3 example authority certificates for unit testing. */ -const char AUTHORITY_CERT_B[] = -"dir-key-certificate-version 3\n" -"fingerprint AD011E25302925A9D39A80E0E32576442E956467\n" -"dir-key-published 2013-11-14 14:12:05\n" -"dir-key-expires 2014-11-14 14:12:05\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAyXYEMlGNRAixXdg65xf2WPkskYj2Wo8ysKMTls1JCXdIOAPvC2k2\n" -"+AC6i3x9JHzUgCjWr4Jd5PSi7ODGyFC543igYl4wzkxNTU2L+SQ+hMe9qbEuUNhH\n" -"sRR0xofdoH//3UuKj+HXEiMhhHbRWQGtWFuJqtGBruJqjZqIGOrp5nFjdlP0R98n\n" -"Rx5wWlPgdJzifkXjKouu4mV+KzLl7f0gAtngA9DkSjt1wzga5IlL/lxDciD0SyJU\n" -"tKMmls056omrZNbTnBxnY2pOlq9nx/zFrt/KQm1fTAQMjMBCf9KnDIV7NhaaHx7F\n" -"7Nk8L7Hha353SvR+bsOFpiu05/EMZFTTIhO3MhUxZiCVZ0hKXvW1xe0HoGC5wbB+\n" -"NyXu8oa4fIKLJ+WJ8Z60BNc0DcxJiQOf1eolGM/qrBul1lFZznds5/7182d+nF2W\n" -"+bEjSm0fgXIxPfSD/7hB0FvgtmB3TXybHGBfPZgX0sTzFB6LNtP0BHicRoMXKdLF\n" -"hM3tgIjEAsoZAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAJ567PZIGG/mYWEY4szYi/C5XXvf0BkquzKTHKrqVjysZEys9giz56Gv\n" -"B08kIRxsxYKEWkq60rv0xtTc1WyEMcDpV1WLU0KSTQSVXzLu7BT8jbTsWzGsxdTV\n" -"TdeyOirwHh8Cyyon5lppuMH5twUHrL5O7pWWbxjjrQjAHCn3gd+NAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-crosscert\n" -"-----BEGIN ID SIGNATURE-----\n" -"OC+gaukd4K7xJOsgTPbRhacf5mDUGxsu3ho/J1oJdtni4CK9WscVs6/Goj1o5Lot\n" -"H1nCAMaR96Jnqq5c63Aaj1sEXdeYHlu5cI7YHgtGI5MmtjiUNXUCWMjCwSQYwGKe\n" -"2YDYGAKAGt97n7XMKhJWGjAmv1TgmK3DvL1jt/aazL8=\n" -"-----END ID SIGNATURE-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"BddmCKsvS6VoFXIf9Aj9OZnfyVCx527517QtsQHN+NaVm20LzUkJ5MWGXYx4wgh3\n" -"ExsHvVQguiVfnonkQpEHHKg+TbldlkuDhIdlb9f7dL7V3HLCsEdmS1c3A+TEyrPH\n" -"i44p6QB5IMFAdgUMV/9ueKMh7pMoam6VNakMOd+Axx9BSJTrCRzcepjtM4Z0cPsj\n" -"nmDgZi0df1+ca1t+HnuWyt3trxlqoUxRcPZKz28kEFDJsgnRNvoHrIvNTuy9qY4x\n" -"rONnPuLr5kTO7VQVVZxgxt6WX3p6d8tj+WYHubydr2pG0dwu2vGDTy4qXvDIm/I4\n" -"Gyo6OAoPbYV8fl0584EgiEbAWcX/Pze8mXr9lmXbf73xbSBHqveAs0UfB+4sBI98\n" -"v4ax4NZkGs8cCIfugtAOLgZE0WCh/TQYnQ3PFcrUtj0RW+tM1z7S8P3UfEVBHVkJ\n" -"8SqSB+pbsY6PwMuy6TC3WujW7gmjVanbwkbW19El9l9jRzteFerz7grG/WQkshqF\n" - "-----END SIGNATURE-----\n"; - -/** The private signing key for AUTHORITY_CERT_2 */ -const char AUTHORITY_SIGNKEY_B[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQCeeuz2SBhv5mFhGOLM2IvwuV1739AZKrsykxyq6lY8rGRMrPYI\n" -"s+ehrwdPJCEcbMWChFpKutK79MbU3NVshDHA6VdVi1NCkk0ElV8y7uwU/I207Fsx\n" -"rMXU1U3Xsjoq8B4fAssqJ+ZaabjB+bcFB6y+Tu6Vlm8Y460IwBwp94HfjQIDAQAB\n" -"AoGAfHQ4ZmfTmPyoeGHcqdVcgBxxh3gJqdnezCavGqGQO3F+CqDBTbBKNLSI3uOW\n" -"hQX+TTK23Xy9RRFCm6MYj3F4x7OOrSHSFyhMmzRnAZi3zGbtQZn30XoqTwCmVevY\n" -"p5JbVvhP2BJcvdsyQhiIG23FRQ7MMHWtksAxmovTto1h/hkCQQDNCfMqSztgJZDn\n" -"JSf5ASHBOw8QzfZBeYi3hqfiDtAN1RxT1uQnEiFQFJqwCz5lCbcwVrfQbrrk5M+h\n" -"ooYrX7tTAkEAxd6Tl0N0WM3zCKz+3/Hoiyty6olnnpzNoPCg7LLBJcetABQi0KUv\n" -"swYWlKP3eOFZkiBzTqa9nBK7eYLKV3d9nwJAKNM3WI98Nguky3FJgTnpd6kDuevY\n" -"gXbqcuhb2xXp9Sceqc7axLDGc0R2/GBwvvttPzG1DcpOai7o7J0Iq/A2wwJAYuKI\n" -"/99GFdtWyc8q0OAkRui/1VY14p6aZQPcaG4s+KSBYLivbXYgEGfKgR4wXsi/6rcs\n" -"6PGLcKQr7N3gITYmIQJAaQn6djUWygCn1noKyWU+Sa7G5qqU2GWkLq9dMaRLm1/I\n" -"nqi+2K1mN15rra0QtFVqSH4JXr8h3KAGyU45voGM7A==\n" -"-----END RSA PRIVATE KEY-----\n"; - -/** Third of 3 example authority certificates for unit testing. */ -const char AUTHORITY_CERT_C[] = -"dir-key-certificate-version 3\n" -"fingerprint 628C2086EC29C9D26E638C5A8B2065BFBD35829B\n" -"dir-key-published 2013-11-14 14:12:18\n" -"dir-key-expires 2014-11-14 14:12:18\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAuzPA82lRVUAc1uZgfDehhK0rBU5xt+qhJXUSH0DxsuocYCLW//q+\n" -"7+L7q9SochqZK3R5+SxJaZRlVK4rAeIHsxXFxsnGvuqasGM3he80EV1RpVRkvLaO\n" -"2dDmHcfEjYBadft2DEq811yvqSRqbFXmK0hLucA6LI6NnEw9VNWlguaV6ACVLyKQ\n" -"iYVFz2JOJIAi0Zz57WZg7eHypUAGoyXjtYTJPsh6pUe/0NLFJVd3JHcJX+bNqU2a\n" -"QU37r+CQ9f3T+8fZGJQ/CXNnYUNHa0j+toOFuPEiZBBh8C4PE7FJWjidvhe9uI7T\n" -"Py41RZhy8e05MAQmUBNRKBHWPKHoy2zWZZxTkcfWFdJJz/dzsNrIjrqf2fYId9To\n" -"fDpHzYd/UjzZaaVYRVS/Oyf3pN8DKw8LMhEArS0X9pblPVkWWjmYMU6f0VR7pelc\n" -"gGYuML3gOiKdNbeMWgAv3HNRsVsuW0HZLrhXUGYzTRPJ/GxVCwA/NmYgMTNVWRwF\n" -"7M78YHpayyEPAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBANESf/hRRWCK3TLQyNb9Y42tYedCORUc8Rl+Q4wrvdz3R0TNr6rztE9N\n" -"u8v3Wbvjtiqm1xL1I5PaOObFQQj61QZxKiCm1yU4eFH15dNmcvBEy5BjEXVYiDgy\n" -"zKRyePzjHYQIZF3ZaQTABUplkXVpY0YvAurluhEy+dKEvZMwWFZTAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-crosscert\n" -"-----BEGIN ID SIGNATURE-----\n" -"NHNBya6Dt7Ww3qSGA0DBEl6pZFBzmYXM+QdqF+ESpdyYCQ54EYimaxl4VcXoGaxy\n" -"xk8/VOXPC6h7hVnTWDTsC86G6eXug1yzpd/uhQbcDJMH5q8/Yg5WXGOnGhMWNCBh\n" -"u2UmbtAjdjLrObQaB50FfOpuOV9kdG4SEzaPUBR2ayU=\n" -"-----END ID SIGNATURE-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"NocTkLl9iKglVo+yrpY0slsqgPviuScMyEfOJ3i65KeJb4Dr1huIs0Fip40zFD8D\n" -"cz/SYu09FbANuRwBJIRdVWZLLwVFLBj5F8U65iJRAPBw/O/xgSVBvWoOhBUZqmJA\n" -"Jp1IUutQHYFfnAOO9za4r8Ox6yPaOWF9Ks5gL0kU/fI8Bdi5E9p3e9fMtoM7hROg\n" -"oX1AoV/za3LcM0oMsGsdXQ7B8vRqY0eUX523kpRpF1fUDyvBUvvMsXdZDN6anCV6\n" -"NtSq2UaM/msTX1oQ8gzyD1gMXH0Ek26YMhd+6WZE6KUeb1x5HJgXtKtYzMLB6nQM\n" -"4Q/OA4NND/Veflofy6xx8uzXe8H+MoUHK9WiORtwqvBl0E9qk6SVCuo4ipR4Ybgk\n" -"PAFOXA58j80dlNYYEVgV8MXF1Y/g/thuXlf2dWiLAExdHTtE0AzC4quWshegaImC\n" -"4aziHeA43TRDszAXcJorREAM0AhSxp3aWDde4Jt46ODOJR8t+gHreks29eDttEIn\n" -"-----END SIGNATURE-----\n"; - -/** The private signing key for AUTHORITY_CERT_3 */ -const char AUTHORITY_SIGNKEY_C[] = -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQDREn/4UUVgit0y0MjW/WONrWHnQjkVHPEZfkOMK73c90dEza+q\n" -"87RPTbvL91m747YqptcS9SOT2jjmxUEI+tUGcSogptclOHhR9eXTZnLwRMuQYxF1\n" -"WIg4Msykcnj84x2ECGRd2WkEwAVKZZF1aWNGLwLq5boRMvnShL2TMFhWUwIDAQAB\n" -"AoGAU68L+eDN3C65CzX2rdcOmg7kOSSQpJrJBmM7tkdr3546sJeD0PFrIrMCkEmZ\n" -"aVNj/v545+WnL+8RB4280lNUIF4AMNaMZUL+4FAtwekqWua3QvvqgRMjCdG3/h/d\n" -"bOAUiiKKEimflTaIVHNVSCvOIntftOu3PhebctuabnZzg0ECQQD9i+FX7M9UXT1A\n" -"bVm+bRIJuQtG+u9jD3VxrvHsmh0QnOAL3oa/ofTCwoTJLZs8Qy0GeAoJNf28rY1q\n" -"AgNMEeEXAkEA0xhxNX2fDQ2yvKwPkPMrRycJVWry+KHvSZG2+XYh+V5sVGQ5H7Gu\n" -"krc6IzRZlIKQhEGktkw8ih0DEHQbAihiJQJBAKi/SnFcePjrPXL91Hb63MB/2dOZ\n" -"+21wwnexOe6A+8ssvajop8IvJlnhYMMMiX7oLrVZe0R6HLBQyge94zfjxm0CQGye\n" -"dRIrE34qAEBo4JGbLjesdHcJUwBwgqn+WoI+MPkZhvBdqa8PRF6l/TpEI5vxGt+S\n" -"z2gmDjia+QqsU4FmuikCQDDOs85uwNSKJFax9XMzd1qd1QwX20F8lvnOsWErXiDw\n" -"Fy2+rmIRHoSxn4D+rE5ivqkO99E9jAlz+uuQz/6WqwE=\n" -"-----END RSA PRIVATE KEY-----\n"; - diff --git a/src/tor/src/test/test_descriptors.inc b/src/tor/src/test/test_descriptors.inc deleted file mode 100644 index ecbccbd43..000000000 --- a/src/tor/src/test/test_descriptors.inc +++ /dev/null @@ -1,305 +0,0 @@ -const char TEST_DESCRIPTORS[] = -"@uploaded-at 2014-06-08 19:20:11\n" -"@source \"127.0.0.1\"\n" -"router test000a 127.0.0.1 5000 0 7000\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint C7E7 CCB8 179F 8CC3 7F5C 8A04 2B3A 180B 934B 14BA\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 67A152A4C7686FB07664F872620635F194D76D95\n" -"caches-extra-info\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAOuBUIEBARMkkka/TGyaQNgUEDLP0KG7sy6KNQTNOlZHUresPr/vlVjo\n" -"HPpLMfu9M2z18c51YX/muWwY9x4MyQooD56wI4+AqXQcJRwQfQlPn3Ay82uZViA9\n" -"DpBajRieLlKKkl145KjArpD7F5BVsqccvjErgFYXvhhjSrx7BVLnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAN6NLnSxWQnFXxqZi5D3b0BMgV6y9NJLGjYQVP+eWtPZWgqyv4zeYsqv\n" -"O9y6c5lvxyUxmNHfoAbe/s8f2Vf3/YaC17asAVSln4ktrr3e9iY74a9RMWHv1Gzk\n" -"3042nMcqj3PEhRN0PoLkcOZNjjmNbaqki6qy9bWWZDNTdo+uI44dAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"contact auth0@test.test\n" -"ntor-onion-key pK4bs08ERYN591jj7ca17Rn9Q02TIEfhnjR6hSq+fhU=\n" -"reject *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"rx88DuM3Y7tODlHNDDEVzKpwh3csaG1or+T4l2Xs1oq3iHHyPEtB6QTLYrC60trG\n" -"aAPsj3DEowGfjga1b248g2dtic8Ab+0exfjMm1RHXfDam5TXXZU3A0wMyoHjqHuf\n" -"eChGPgFNUvEc+5YtD27qEDcUjcinYztTs7/dzxBT4PE=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:11\n" -"@source \"127.0.0.1\"\n" -"router test001a 127.0.0.1 5001 0 7001\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint 35DA 711C FC62 F88B C243 DE32 DC0B C28A 3F62 2610\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 9E12278D6CF7608071FE98CE9DCEE48FA264518A\n" -"caches-extra-info\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAPbyUrorqoXMW4oezqd307ZGxgobqvQs2nb3TdQyWrwsHtJmS3utdrJS\n" -"xJUZPNHOQ2hrDWW1VvevYqRTGeXGZr9TDZ3+t/gVUttqYRhuzzgEKVAZSsTo5ctO\n" -"QNHnzJ6Xx/w/trhWqPTeJ7R0TCyAbWW7aE3KaKdwvZilRZp/oRUnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALwOJ7XZHBnjJEuwF3Os6eashNbTH9YnH8TBZBdKgu3iFJYqDslcMIPX\n" -"gWCJ9apPHyh1+/8OLRWeEYlwoZzgGi0rjm/+BNeOOmJbjfyjk97DuB9/2O5zr1BM\n" -"CvOHqQSzMD+vz1ebvfM039a2mO8lXruUFPZQaFVxk8371XP2khqhAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"contact auth1@test.test\n" -"ntor-onion-key t5bI1ksTdigOksMKRHUDwx/34ajEvDN1IpArOxIEWgk=\n" -"reject *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"KtMW7A/pzu+np6aKJSy6d7drIb4yjz8SPCo+oQNxj2IqNHJir2O2nWu69xy+K0c1\n" -"RL05KkcDaYzr5hC80FD1H+sTpGYD28SPkQkzPw+0pReSDl93pVXh0rU6Cdcm75FC\n" -"t0UZzDt4TsMuFB0ZYpM3phKcQPpiDG6aR0LskL/YUvY=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:11\n" -"@source \"127.0.0.1\"\n" -"router test004r 127.0.0.1 5004 0 7004\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:10\n" -"fingerprint CC6A 48BD 52BD 9A2C 6670 5863 AC31 AE17 6E63 8B02\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest B5CC249CEF394B5AFCA0C77FA7D5605615FA487C\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAMze36Hupy7HACcF3TMv5mJuZbx3d3cS0WYLl6vTeChBgpS5CEXq6zIu\n" -"d31YmtUcxH6fOjDOudhbnXuoh1nH4CP+LocVHAdlGG1giAm7u8yZudVvVJiIqFgQ\n" -"wVDcWx8LbGCi5P9J/ZPKAIVsSyS7xkOqHjz3VMo/uYLbQCFAwfkdAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAM/qGP365x6bH+ug7rKVy7V5lC9Ff2Jfk0wlTFIzzwn+DMSG6xDvulKe\n" -"wcIzgGNdQu7qlKlQUif3GPMr0KSS32cRsmoRQJcsm9+lGUK871NyZ8AyrHT+LhyF\n" -"cs718P0iN5yKF2FikNr727kEANCzvC1l9eP4qF5GGzsNtglbJ7bTAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"ntor-onion-key a9Pavqnx7DFhMWUO0d17qF9Py8+iie4FnxTHaTgfIXY=\n" -"reject *:25\n" -"reject *:119\n" -"reject *:135-139\n" -"reject *:445\n" -"reject *:563\n" -"reject *:1214\n" -"reject *:4661-4666\n" -"reject *:6346-6429\n" -"reject *:6699\n" -"reject *:6881-6999\n" -"accept *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"HVW7kjBgEt+Qdvcrq+NQE1F9B8uV9D38KA2Bp6cYHLWCxL6N4GS8JQqbOEtnqaj7\n" -"Vxrv7uy1Fzb15Zr+1sUVMxNv+LLRfr+JzfETMNYVkYDrNgr1cAAVEQzFWbIziond\n" -"xMFp64yjEW9/I+82lb5GBZEiKdEd4QqWMmQosoYMTM8=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:12\n" -"@source \"127.0.0.1\"\n" -"router test002a 127.0.0.1 5002 0 7002\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint 29C7 BBB6 C437 32D5 BDF1 5671 F5C5 F1FB 6E36 4B47\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 9BB181EA86E0130680C3CC04AD7DE4C341ADC2C7\n" -"caches-extra-info\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALNH19oF8Ajf+djlH/g7L+enFBf5Wwjmf3bPwNKWZ9G+B+Lg8SpfhZiw\n" -"rUqi7h21f45BV/dN05dK6leWD8rj1T9kuM9TKBOEZxIWeq7zbXihyu4XPxP4FNTS\n" -"+0G7BhdP4biALENmeyLhUCZaw5Ic/jFkHT4gV9S0iVZiEDwC9twXAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALeyQGMQBHgTxpO/i30uHjflTm9MNi3ZBNcOKpvBXWYgY42qTqOZ7Uam\n" -"c5pmZhTLrQ1W8XlGDw8Cl8ktZ0ylodLZyUNajBtJvSFWTb8iwdZsshW6Ahb8TyfI\n" -"Y7MwTlQ/7xw4mj1NEaui6bwGgEZUs18RTqhDrUc2Mcj1Yf61Rq+7AgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"contact auth2@test.test\n" -"ntor-onion-key ukR41RjtiZ69KO0SrFTvL0LoZK/ZTT01FQWmCXTCUlE=\n" -"reject *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"IY2s/RY4tdahrgfGG+vW7lOvpfofoxxSo7guGpSKGxVApiroCQtumoYifnnJ88G2\n" -"K4IbxwEO8pgO8fnz1mibblUWw2vdDNjCifc1wtXJUE+ONA0UcLRlfQ94GbL8h2PG\n" -"72z6i1+NN0QahXMk7MUbzI7bOXTJOiO8e2Zjk9vRnxI=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:12\n" -"@source \"127.0.0.1\"\n" -"router test006r 127.0.0.1 5006 0 7006\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint 829B 3FAA A42B 605A EB0B F380 8F32 8ED1 73E7 0D25\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 7ECB757002EB9B5838B13AE6F2357A5E585131B8\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALsNBChcLVndlS4HNXL3hxBJVgXctATz6yXcJt3bkDB5cjv7Q9fqN3Ue\n" -"j3SI1OUBx4YrLcSLD/hELHVilLrrfbaraAFfAsydlRLjTVcMRx5FFlDd0E7TAadc\n" -"71CkTipNnjwqz1mTRKkEFeepnh/JaFDidY9ER1rMBA5JRyBvqrD9AgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAPgipA8yLj1kqrMlAH7cK7IQEdmqmfNHGXdkYQ+TKtfLh0zeEIvvh9yh\n" -"k+vKHS+HVoHo3tecB9QjJyDyyJTiETXCupSOY+ebG648JADAvv8v1WiE+KBXtjpl\n" -"qgDTrDj5CwGuY6cvQdej5yg1UAVlMMZSg3thL3tCYtQbOq66lAlnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"ntor-onion-key q02F3AQsCX7+zXNpfTqBF8O8lusPhRJpQVxOnBvbOwc=\n" -"reject *:25\n" -"reject *:119\n" -"reject *:135-139\n" -"reject *:445\n" -"reject *:563\n" -"reject *:1214\n" -"reject *:4661-4666\n" -"reject *:6346-6429\n" -"reject *:6699\n" -"reject *:6881-6999\n" -"accept *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"L1fdgoN/eXgdzIIXO63W4yGoC9lRozMU+T0Fimhd/XFV8qxeUT83Vgf63vxLUHIb\n" -"D4a80Wj7Pm4y5a766qLGXxlz2FYjCdkp070UpgZneB+VifUlFd/bNAjsiYTstBKM\n" -"EI2L0mhl9d/7KK8vgtadHdX1z1u7QjyF6ccnzhfqeiY=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:12\n" -"@source \"127.0.0.1\"\n" -"router test003r 127.0.0.1 5003 0 7003\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint 71FD 3A35 F705 8020 D595 B711 D52A 9A0A 99BB B467\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 3796BE0A95B699595445DFD3453CA2074E75BCE8\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAL44ctIioIfCYFzMTYNfK5qFAPGGUpsAFmS8pThQEY/tJU14+frJDBrC\n" -"BkLvBs05Bw7xOUb0f2geiYGowBA6028smiq5HzTO7Kaga8vfV7AnANPX+n9cfHCr\n" -"/2cMnKkT/GZzpdk0WbUw5Kc/G1ATIPFQHA8gZAi1fsSIDDn3GRV5AgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALlPo5AI1mVTi+194yOSf40caoFlxSTfXt8KjGVa1dO/bpX7L3noOjYg\n" -"goU4Aqim7BHmBWQDE/tZNTrchFoLQFHi9N4pv/0ND3sY904pzqGpe3FeTuU8P9Jg\n" -"q2w3MeO3GwG8CJf4FOdSkgi8UKkJhOld4g4kViQbrFLXfdFvnT/zAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"ntor-onion-key qluYCRrsesOTkavCLnNK6H1ToywyDquCyYeP0h/qol4=\n" -"reject *:25\n" -"reject *:119\n" -"reject *:135-139\n" -"reject *:445\n" -"reject *:563\n" -"reject *:1214\n" -"reject *:4661-4666\n" -"reject *:6346-6429\n" -"reject *:6699\n" -"reject *:6881-6999\n" -"accept *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"d09K7rW/OpVzoUpfZXJuJW7a+P4pROCOZTgvDUIy/Nv+EAjcYqv95PlJ8cAMqnn3\n" -"1oQibRmmQwn0OmG5cB8NaZiueaVIRheGzHEM8rndpHn5oFXdFvV7KKjScvfuBbTk\n" -"RYME8XyawRaqsEZnwirDDlZuiZOjdQs8bbGsko3grJE=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:12\n" -"@source \"127.0.0.1\"\n" -"router test005r 127.0.0.1 5005 0 7005\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint EB6E 42ED E6BF 5EE0 19F5 EFC1 53AD 094C 1327 7B76\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest C031EE4E1AE826C1E3C4E21D81C961869E63F5D2\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAMd9Fm4KTSjFDzEABPZ1fwBCC2DNgee6nAmlde8FRbCVfcIHRiJyv9YG\n" -"h530yUJal3hBfiWwy/SBA4LDz1flNCEwJm81s3waj4T9c676dAOLPcnOcJM5SbaQ\n" -"hYPDrIZLEZHAk+IoM+avKYYocwCJXwx6WTtsedF0wJBZ9mQAJERJAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAKT7ldhV43S1CgoER/pU0Rigf0NzcSy25DQJrMRQnNmXnL03Dwuv/Iu7\n" -"dCjgg64odnvSkXHFhkbjGcg8aXikvfbMyZTbsD8NrrP6FS6pfgPgZD9W2TK7QdHI\n" -"QXwx1IYaaJK4nDUNfJhjrclydEdxmHbO1nLG1aS0ypn/G0EBpOSnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"ntor-onion-key umFmyRPA0dIsi0CFYCbGIPe2+OUkyslTkKKDEohjQQg=\n" -"reject *:25\n" -"reject *:119\n" -"reject *:135-139\n" -"reject *:445\n" -"reject *:563\n" -"reject *:1214\n" -"reject *:4661-4666\n" -"reject *:6346-6429\n" -"reject *:6699\n" -"reject *:6881-6999\n" -"accept *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"JiXEbqPgDPWEb9DzCYINRXfmvMIc/IRtvshS8Vmmn7DW67TrTLKCEAnisGo92gMA\n" -"bhxGb9G5Mxq/8YqGoqdI2Vp6tfKlz/9AmjHzFAo01y42gafXIdr1oUS2RimA8jfF\n" -"hwfQkbG0FYEsJrH3EUa8sMhcjsEaohK/kgklMR7OgQY=\n" -"-----END SIGNATURE-----\n" -"@uploaded-at 2014-06-08 19:20:12\n" -"@source \"127.0.0.1\"\n" -"router test007r 127.0.0.1 5007 0 7007\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint DABD 2AAF 8C9F 3B71 7839 9C08 DCD8 CD9D 341D 0002\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest F80104A0DFFB4EB429325D41D1F71E5BF8C6C726\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAL42fYAriR/JeB/9NpVq5Y5EEHca+ugIpaSdRfbopWDtFjXLEk2jmO5A\n" -"KoAGIkTKDr7e9101x63H+0Nh/7w3uYs/WqTXEH8/1sHwe+0PY2HL0S6qhlOo6X54\n" -"EfK0nDDBAWFOpyiAMHRk8JVikKb56+FVIhCJgi1RIbLIiUQK2/kxAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAKQj2U5hmB68V6NQBqD8DfIkJjovvM8t6nGfYpkT8ORsROnmgI5mjM38\n" -"cmh5GIjY9RgoOWolLmsWQ4SXtS0FvrPft1M61UMTSHzlrEeuod5KenV7vGlX2TxT\n" -"0DoA5TL9yY7CmxCk8CNRCtN/g7WocgIiP4KCIiEZ4VE6LIb6sxUnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"ntor-onion-key 1UBS8rTlL39u9YxRJWhz+GTG1dS15VRi4au1i5qZOyI=\n" -"reject *:25\n" -"reject *:119\n" -"reject *:135-139\n" -"reject *:445\n" -"reject *:563\n" -"reject *:1214\n" -"reject *:4661-4666\n" -"reject *:6346-6429\n" -"reject *:6699\n" -"reject *:6881-6999\n" -"accept *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"m7xHh+XPdLN+qcMLz1dBAEAmcdCFrtdseMHCc0FyAP2kXdayxqe3o2IOOHN++bTH\n" -"Y5iHsZembsIJJ+D/d0YEKWKh42TUWCXBu0Gbfc4OcNuR6PFlTWO2wk7rDT3HOiFr\n" -"pe3wJqZYkLxlBDamROAlMMRe71iag89H/4EulC18opw=\n" -"-----END SIGNATURE-----\n"; diff --git a/src/tor/src/test/test_dir.c b/src/tor/src/test/test_dir.c deleted file mode 100644 index 6092a5a4d..000000000 --- a/src/tor/src/test/test_dir.c +++ /dev/null @@ -1,6349 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include - -#define CONFIG_PRIVATE -#define CONTROL_PRIVATE -#define DIRSERV_PRIVATE -#define DIRVOTE_PRIVATE -#define ROUTER_PRIVATE -#define ROUTERLIST_PRIVATE -#define ROUTERPARSE_PRIVATE -#define HIBERNATE_PRIVATE -#define NETWORKSTATUS_PRIVATE -#define RELAY_PRIVATE - -#include "or.h" -#include "bridges.h" -#include "confparse.h" -#include "config.h" -#include "control.h" -#include "crypto_ed25519.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "entrynodes.h" -#include "hibernate.h" -#include "memarea.h" -#include "networkstatus.h" -#include "router.h" -#include "routerkeys.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "shared_random_state.h" -#include "test.h" -#include "test_dir_common.h" -#include "torcert.h" -#include "relay.h" -#include "log_test_helpers.h" - -#define NS_MODULE dir - -static void -test_dir_nicknames(void *arg) -{ - (void)arg; - tt_assert( is_legal_nickname("a")); - tt_assert(!is_legal_nickname("")); - tt_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */ - tt_assert(!is_legal_nickname("hyphen-")); /* bad char */ - tt_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */ - tt_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* valid */ - tt_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA")); - tt_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); - tt_assert( is_legal_nickname_or_hexdigest( - "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA~fred")); - /* too short */ - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* illegal char */ - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - /* hex part too long */ - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=fred")); - /* Bad nickname */ - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")); - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~")); - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~hyphen-")); - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~" - "abcdefghijklmnoppqrst")); - /* Bad extra char. */ - tt_assert(!is_legal_nickname_or_hexdigest( - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!")); - tt_assert(is_legal_nickname_or_hexdigest("xyzzy")); - tt_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs")); - tt_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst")); - done: - ; -} - -static smartlist_t *mocked_configured_ports = NULL; - -/** Returns mocked_configured_ports */ -static const smartlist_t * -mock_get_configured_ports(void) -{ - return mocked_configured_ports; -} - -/** Run unit tests for router descriptor generation logic. */ -static void -test_dir_formats(void *arg) -{ - char *buf = NULL; - char buf2[8192]; - char platform[256]; - char fingerprint[FINGERPRINT_LEN+1]; - char *pk1_str = NULL, *pk2_str = NULL, *cp; - size_t pk1_str_len, pk2_str_len; - routerinfo_t *r1=NULL, *r2=NULL; - crypto_pk_t *pk1 = NULL, *pk2 = NULL; - routerinfo_t *rp1 = NULL, *rp2 = NULL; - addr_policy_t *ex1, *ex2; - routerlist_t *dir1 = NULL, *dir2 = NULL; - uint8_t *rsa_cc = NULL; - or_options_t *options = get_options_mutable(); - const addr_policy_t *p; - time_t now = time(NULL); - port_cfg_t orport, dirport; - char cert_buf[256]; - - (void)arg; - pk1 = pk_generate(0); - pk2 = pk_generate(1); - - tt_assert(pk1 && pk2); - - hibernate_set_state_for_testing_(HIBERNATE_STATE_LIVE); - - get_platform_str(platform, sizeof(platform)); - r1 = tor_malloc_zero(sizeof(routerinfo_t)); - r1->addr = 0xc0a80001u; /* 192.168.0.1 */ - r1->cache_info.published_on = 0; - r1->or_port = 9000; - r1->dir_port = 9003; - r1->supports_tunnelled_dir_requests = 1; - tor_addr_parse(&r1->ipv6_addr, "1:2:3:4::"); - r1->ipv6_orport = 9999; - r1->onion_pkey = crypto_pk_dup_key(pk1); - /* Fake just enough of an ntor key to get by */ - curve25519_keypair_t r1_onion_keypair; - curve25519_keypair_generate(&r1_onion_keypair, 0); - r1->onion_curve25519_pkey = tor_memdup(&r1_onion_keypair.pubkey, - sizeof(curve25519_public_key_t)); - r1->identity_pkey = crypto_pk_dup_key(pk2); - r1->bandwidthrate = 1000; - r1->bandwidthburst = 5000; - r1->bandwidthcapacity = 10000; - r1->exit_policy = NULL; - r1->nickname = tor_strdup("Magri"); - r1->platform = tor_strdup(platform); - - ex1 = tor_malloc_zero(sizeof(addr_policy_t)); - ex2 = tor_malloc_zero(sizeof(addr_policy_t)); - ex1->policy_type = ADDR_POLICY_ACCEPT; - tor_addr_from_ipv4h(&ex1->addr, 0); - ex1->maskbits = 0; - ex1->prt_min = ex1->prt_max = 80; - ex2->policy_type = ADDR_POLICY_REJECT; - tor_addr_from_ipv4h(&ex2->addr, 18<<24); - ex2->maskbits = 8; - ex2->prt_min = ex2->prt_max = 24; - r2 = tor_malloc_zero(sizeof(routerinfo_t)); - r2->addr = 0x0a030201u; /* 10.3.2.1 */ - ed25519_keypair_t kp1, kp2; - ed25519_secret_key_from_seed(&kp1.seckey, - (const uint8_t*)"YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); - ed25519_public_key_generate(&kp1.pubkey, &kp1.seckey); - ed25519_secret_key_from_seed(&kp2.seckey, - (const uint8_t*)"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); - ed25519_public_key_generate(&kp2.pubkey, &kp2.seckey); - r2->cache_info.signing_key_cert = tor_cert_create(&kp1, - CERT_TYPE_ID_SIGNING, - &kp2.pubkey, - now, 86400, - CERT_FLAG_INCLUDE_SIGNING_KEY); - r2->platform = tor_strdup(platform); - r2->cache_info.published_on = 5; - r2->or_port = 9005; - r2->dir_port = 0; - r2->supports_tunnelled_dir_requests = 1; - r2->onion_pkey = crypto_pk_dup_key(pk2); - curve25519_keypair_t r2_onion_keypair; - curve25519_keypair_generate(&r2_onion_keypair, 0); - r2->onion_curve25519_pkey = tor_memdup(&r2_onion_keypair.pubkey, - sizeof(curve25519_public_key_t)); - r2->identity_pkey = crypto_pk_dup_key(pk1); - r2->bandwidthrate = r2->bandwidthburst = r2->bandwidthcapacity = 3000; - r2->exit_policy = smartlist_new(); - smartlist_add(r2->exit_policy, ex1); - smartlist_add(r2->exit_policy, ex2); - r2->nickname = tor_strdup("Fred"); - - tt_assert(!crypto_pk_write_public_key_to_string(pk1, &pk1_str, - &pk1_str_len)); - tt_assert(!crypto_pk_write_public_key_to_string(pk2 , &pk2_str, - &pk2_str_len)); - - /* XXXX+++ router_dump_to_string should really take this from ri.*/ - options->ContactInfo = tor_strdup("Magri White " - ""); - /* Skip reachability checks for DirPort and tunnelled-dir-server */ - options->AssumeReachable = 1; - - /* Fake just enough of an ORPort and DirPort to get by */ - MOCK(get_configured_ports, mock_get_configured_ports); - mocked_configured_ports = smartlist_new(); - - memset(&orport, 0, sizeof(orport)); - orport.type = CONN_TYPE_OR_LISTENER; - orport.addr.family = AF_INET; - orport.port = 9000; - smartlist_add(mocked_configured_ports, &orport); - - memset(&dirport, 0, sizeof(dirport)); - dirport.type = CONN_TYPE_DIR_LISTENER; - dirport.addr.family = AF_INET; - dirport.port = 9003; - smartlist_add(mocked_configured_ports, &dirport); - - buf = router_dump_router_to_string(r1, pk2, NULL, NULL, NULL); - - UNMOCK(get_configured_ports); - smartlist_free(mocked_configured_ports); - mocked_configured_ports = NULL; - - tor_free(options->ContactInfo); - tt_assert(buf); - - strlcpy(buf2, "router Magri 192.168.0.1 9000 0 9003\n" - "or-address [1:2:3:4::]:9999\n" - "platform Tor "VERSION" on ", sizeof(buf2)); - strlcat(buf2, get_uname(), sizeof(buf2)); - strlcat(buf2, "\n" - "published 1970-01-01 00:00:00\n" - "fingerprint ", sizeof(buf2)); - tt_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1)); - strlcat(buf2, fingerprint, sizeof(buf2)); - strlcat(buf2, "\nuptime 0\n" - /* XXX the "0" above is hard-coded, but even if we made it reflect - * uptime, that still wouldn't make it right, because the two - * descriptors might be made on different seconds... hm. */ - "bandwidth 1000 5000 10000\n" - "onion-key\n", sizeof(buf2)); - strlcat(buf2, pk1_str, sizeof(buf2)); - strlcat(buf2, "signing-key\n", sizeof(buf2)); - strlcat(buf2, pk2_str, sizeof(buf2)); - strlcat(buf2, "hidden-service-dir\n", sizeof(buf2)); - strlcat(buf2, "contact Magri White \n", - sizeof(buf2)); - strlcat(buf2, "ntor-onion-key ", sizeof(buf2)); - base64_encode(cert_buf, sizeof(cert_buf), - (const char*)r1_onion_keypair.pubkey.public_key, 32, - BASE64_ENCODE_MULTILINE); - strlcat(buf2, cert_buf, sizeof(buf2)); - strlcat(buf2, "reject *:*\n", sizeof(buf2)); - strlcat(buf2, "tunnelled-dir-server\nrouter-signature\n", sizeof(buf2)); - buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same - * twice */ - - tt_str_op(buf,OP_EQ, buf2); - tor_free(buf); - - buf = router_dump_router_to_string(r1, pk2, NULL, NULL, NULL); - tt_assert(buf); - cp = buf; - rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); - tt_assert(rp1); - tt_int_op(rp1->addr,OP_EQ, r1->addr); - tt_int_op(rp1->or_port,OP_EQ, r1->or_port); - tt_int_op(rp1->dir_port,OP_EQ, r1->dir_port); - tt_int_op(rp1->bandwidthrate,OP_EQ, r1->bandwidthrate); - tt_int_op(rp1->bandwidthburst,OP_EQ, r1->bandwidthburst); - tt_int_op(rp1->bandwidthcapacity,OP_EQ, r1->bandwidthcapacity); - tt_int_op(crypto_pk_cmp_keys(rp1->onion_pkey, pk1), OP_EQ, 0); - tt_int_op(crypto_pk_cmp_keys(rp1->identity_pkey, pk2), OP_EQ, 0); - tt_assert(rp1->supports_tunnelled_dir_requests); - //tt_assert(rp1->exit_policy == NULL); - tor_free(buf); - - strlcpy(buf2, - "router Fred 10.3.2.1 9005 0 0\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n", sizeof(buf2)); - base64_encode(cert_buf, sizeof(cert_buf), - (const char*)r2->cache_info.signing_key_cert->encoded, - r2->cache_info.signing_key_cert->encoded_len, - BASE64_ENCODE_MULTILINE); - strlcat(buf2, cert_buf, sizeof(buf2)); - strlcat(buf2, "-----END ED25519 CERT-----\n", sizeof(buf2)); - strlcat(buf2, "master-key-ed25519 ", sizeof(buf2)); - { - char k[ED25519_BASE64_LEN+1]; - tt_int_op(ed25519_public_to_base64(k, - &r2->cache_info.signing_key_cert->signing_key), - OP_GE, 0); - strlcat(buf2, k, sizeof(buf2)); - strlcat(buf2, "\n", sizeof(buf2)); - } - strlcat(buf2, "platform Tor "VERSION" on ", sizeof(buf2)); - strlcat(buf2, get_uname(), sizeof(buf2)); - strlcat(buf2, "\n" - "published 1970-01-01 00:00:05\n" - "fingerprint ", sizeof(buf2)); - tt_assert(!crypto_pk_get_fingerprint(pk1, fingerprint, 1)); - strlcat(buf2, fingerprint, sizeof(buf2)); - strlcat(buf2, "\nuptime 0\n" - "bandwidth 3000 3000 3000\n", sizeof(buf2)); - strlcat(buf2, "onion-key\n", sizeof(buf2)); - strlcat(buf2, pk2_str, sizeof(buf2)); - strlcat(buf2, "signing-key\n", sizeof(buf2)); - strlcat(buf2, pk1_str, sizeof(buf2)); - int rsa_cc_len; - rsa_cc = make_tap_onion_key_crosscert(pk2, - &kp1.pubkey, - pk1, - &rsa_cc_len); - tt_assert(rsa_cc); - base64_encode(cert_buf, sizeof(cert_buf), (char*)rsa_cc, rsa_cc_len, - BASE64_ENCODE_MULTILINE); - strlcat(buf2, "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n", sizeof(buf2)); - strlcat(buf2, cert_buf, sizeof(buf2)); - strlcat(buf2, "-----END CROSSCERT-----\n", sizeof(buf2)); - int ntor_cc_sign; - { - tor_cert_t *ntor_cc = NULL; - ntor_cc = make_ntor_onion_key_crosscert(&r2_onion_keypair, - &kp1.pubkey, - r2->cache_info.published_on, - get_onion_key_lifetime(), - &ntor_cc_sign); - tt_assert(ntor_cc); - base64_encode(cert_buf, sizeof(cert_buf), - (char*)ntor_cc->encoded, ntor_cc->encoded_len, - BASE64_ENCODE_MULTILINE); - tor_cert_free(ntor_cc); - } - tor_snprintf(buf2+strlen(buf2), sizeof(buf2)-strlen(buf2), - "ntor-onion-key-crosscert %d\n" - "-----BEGIN ED25519 CERT-----\n" - "%s" - "-----END ED25519 CERT-----\n", ntor_cc_sign, cert_buf); - - strlcat(buf2, "hidden-service-dir\n", sizeof(buf2)); - strlcat(buf2, "ntor-onion-key ", sizeof(buf2)); - base64_encode(cert_buf, sizeof(cert_buf), - (const char*)r2_onion_keypair.pubkey.public_key, 32, - BASE64_ENCODE_MULTILINE); - strlcat(buf2, cert_buf, sizeof(buf2)); - strlcat(buf2, "accept *:80\nreject 18.0.0.0/8:24\n", sizeof(buf2)); - strlcat(buf2, "tunnelled-dir-server\n", sizeof(buf2)); - strlcat(buf2, "router-sig-ed25519 ", sizeof(buf2)); - - /* Fake just enough of an ORPort to get by */ - MOCK(get_configured_ports, mock_get_configured_ports); - mocked_configured_ports = smartlist_new(); - - memset(&orport, 0, sizeof(orport)); - orport.type = CONN_TYPE_OR_LISTENER; - orport.addr.family = AF_INET; - orport.port = 9005; - smartlist_add(mocked_configured_ports, &orport); - - buf = router_dump_router_to_string(r2, pk1, pk2, &r2_onion_keypair, &kp2); - tt_assert(buf); - buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same - * twice */ - - tt_str_op(buf, OP_EQ, buf2); - tor_free(buf); - - buf = router_dump_router_to_string(r2, pk1, NULL, NULL, NULL); - - UNMOCK(get_configured_ports); - smartlist_free(mocked_configured_ports); - mocked_configured_ports = NULL; - - /* Reset for later */ - cp = buf; - rp2 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); - tt_assert(rp2); - tt_int_op(rp2->addr,OP_EQ, r2->addr); - tt_int_op(rp2->or_port,OP_EQ, r2->or_port); - tt_int_op(rp2->dir_port,OP_EQ, r2->dir_port); - tt_int_op(rp2->bandwidthrate,OP_EQ, r2->bandwidthrate); - tt_int_op(rp2->bandwidthburst,OP_EQ, r2->bandwidthburst); - tt_int_op(rp2->bandwidthcapacity,OP_EQ, r2->bandwidthcapacity); - tt_mem_op(rp2->onion_curve25519_pkey->public_key,OP_EQ, - r2->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN); - tt_int_op(crypto_pk_cmp_keys(rp2->onion_pkey, pk2), OP_EQ, 0); - tt_int_op(crypto_pk_cmp_keys(rp2->identity_pkey, pk1), OP_EQ, 0); - tt_assert(rp2->supports_tunnelled_dir_requests); - - tt_int_op(smartlist_len(rp2->exit_policy),OP_EQ, 2); - - p = smartlist_get(rp2->exit_policy, 0); - tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_ACCEPT); - tt_assert(tor_addr_is_null(&p->addr)); - tt_int_op(p->maskbits,OP_EQ, 0); - tt_int_op(p->prt_min,OP_EQ, 80); - tt_int_op(p->prt_max,OP_EQ, 80); - - p = smartlist_get(rp2->exit_policy, 1); - tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_REJECT); - tt_assert(tor_addr_eq(&p->addr, &ex2->addr)); - tt_int_op(p->maskbits,OP_EQ, 8); - tt_int_op(p->prt_min,OP_EQ, 24); - tt_int_op(p->prt_max,OP_EQ, 24); - -#if 0 - /* Okay, now for the directories. */ - { - fingerprint_list = smartlist_new(); - crypto_pk_get_fingerprint(pk2, buf, 1); - add_fingerprint_to_dir(buf, fingerprint_list, 0); - crypto_pk_get_fingerprint(pk1, buf, 1); - add_fingerprint_to_dir(buf, fingerprint_list, 0); - } - -#endif /* 0 */ - dirserv_free_fingerprint_list(); - - done: - if (r1) - routerinfo_free(r1); - if (r2) - routerinfo_free(r2); - if (rp2) - routerinfo_free(rp2); - - tor_free(rsa_cc); - tor_free(buf); - tor_free(pk1_str); - tor_free(pk2_str); - if (pk1) crypto_pk_free(pk1); - if (pk2) crypto_pk_free(pk2); - if (rp1) routerinfo_free(rp1); - tor_free(dir1); /* XXXX And more !*/ - tor_free(dir2); /* And more !*/ -} - -#include "failing_routerdescs.inc" - -static void -test_dir_routerinfo_parsing(void *arg) -{ - (void) arg; - - int again; - routerinfo_t *ri = NULL; - -#define CHECK_OK(s) \ - do { \ - routerinfo_free(ri); \ - ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, NULL); \ - tt_assert(ri); \ - } while (0) -#define CHECK_FAIL(s, againval) \ - do { \ - routerinfo_free(ri); \ - again = 999; \ - ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, &again); \ - tt_assert(ri == NULL); \ - tt_int_op(again, OP_EQ, (againval)); \ - } while (0) - - CHECK_OK(EX_RI_MINIMAL); - CHECK_OK(EX_RI_MAXIMAL); - - CHECK_OK(EX_RI_MINIMAL_ED); - - /* good annotations prepended */ - routerinfo_free(ri); - ri = router_parse_entry_from_string(EX_RI_MINIMAL, NULL, 0, 0, - "@purpose bridge\n", NULL); - tt_ptr_op(ri, OP_NE, NULL); - tt_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); - routerinfo_free(ri); - - /* bad annotations prepended. */ - ri = router_parse_entry_from_string(EX_RI_MINIMAL, - NULL, 0, 0, "@purpose\n", NULL); - tt_ptr_op(ri, OP_EQ, NULL); - - /* bad annotations on router. */ - ri = router_parse_entry_from_string("@purpose\nrouter x\n", NULL, 0, 1, - NULL, NULL); - tt_ptr_op(ri, OP_EQ, NULL); - - /* unwanted annotations on router. */ - ri = router_parse_entry_from_string("@purpose foo\nrouter x\n", NULL, 0, 0, - NULL, NULL); - tt_ptr_op(ri, OP_EQ, NULL); - - /* No signature. */ - ri = router_parse_entry_from_string("router x\n", NULL, 0, 0, - NULL, NULL); - tt_ptr_op(ri, OP_EQ, NULL); - - /* Not a router */ - routerinfo_free(ri); - ri = router_parse_entry_from_string("hello\n", NULL, 0, 0, NULL, NULL); - tt_ptr_op(ri, OP_EQ, NULL); - - CHECK_FAIL(EX_RI_BAD_SIG1, 1); - CHECK_FAIL(EX_RI_BAD_SIG2, 1); - CHECK_FAIL(EX_RI_BAD_TOKENS, 0); - CHECK_FAIL(EX_RI_BAD_PUBLISHED, 0); - CHECK_FAIL(EX_RI_NEG_BANDWIDTH, 0); - CHECK_FAIL(EX_RI_BAD_BANDWIDTH, 0); - CHECK_FAIL(EX_RI_BAD_BANDWIDTH2, 0); - CHECK_FAIL(EX_RI_BAD_ONIONKEY1, 0); - CHECK_FAIL(EX_RI_BAD_ONIONKEY2, 0); - CHECK_FAIL(EX_RI_BAD_PORTS, 0); - CHECK_FAIL(EX_RI_BAD_IP, 0); - CHECK_FAIL(EX_RI_BAD_DIRPORT, 0); - CHECK_FAIL(EX_RI_BAD_NAME2, 0); - CHECK_FAIL(EX_RI_BAD_UPTIME, 0); - - CHECK_FAIL(EX_RI_BAD_BANDWIDTH3, 0); - CHECK_FAIL(EX_RI_BAD_NTOR_KEY, 0); - CHECK_FAIL(EX_RI_BAD_FINGERPRINT, 0); - CHECK_FAIL(EX_RI_MISMATCHED_FINGERPRINT, 0); - CHECK_FAIL(EX_RI_BAD_HAS_ACCEPT6, 0); - CHECK_FAIL(EX_RI_BAD_NO_EXIT_POLICY, 0); - CHECK_FAIL(EX_RI_BAD_IPV6_EXIT_POLICY, 0); - CHECK_FAIL(EX_RI_BAD_FAMILY, 0); - CHECK_FAIL(EX_RI_ZERO_ORPORT, 0); - - CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT, 0); - CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT2, 0); - CHECK_FAIL(EX_RI_ED_MISSING_CROSSCERT_SIGN, 0); - CHECK_FAIL(EX_RI_ED_BAD_SIG1, 0); - CHECK_FAIL(EX_RI_ED_BAD_SIG2, 0); - CHECK_FAIL(EX_RI_ED_BAD_SIG3, 0); - CHECK_FAIL(EX_RI_ED_BAD_SIG4, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT1, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT3, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT4, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT5, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT6, 0); - CHECK_FAIL(EX_RI_ED_BAD_CROSSCERT7, 0); - CHECK_FAIL(EX_RI_ED_MISPLACED1, 0); - CHECK_FAIL(EX_RI_ED_MISPLACED2, 0); - CHECK_FAIL(EX_RI_ED_BAD_CERT1, 0); - CHECK_FAIL(EX_RI_ED_BAD_CERT2, 0); - CHECK_FAIL(EX_RI_ED_BAD_CERT3, 0); - - /* This is allowed; we just ignore it. */ - CHECK_OK(EX_RI_BAD_EI_DIGEST); - CHECK_OK(EX_RI_BAD_EI_DIGEST2); - -#undef CHECK_FAIL -#undef CHECK_OK - done: - routerinfo_free(ri); -} - -#include "example_extrainfo.inc" - -static void -routerinfo_free_wrapper_(void *arg) -{ - routerinfo_free_(arg); -} - -static void -test_dir_extrainfo_parsing(void *arg) -{ - (void) arg; - -#define CHECK_OK(s) \ - do { \ - extrainfo_free(ei); \ - ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, NULL); \ - tt_assert(ei); \ - } while (0) -#define CHECK_FAIL(s, againval) \ - do { \ - extrainfo_free(ei); \ - again = 999; \ - ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, &again); \ - tt_assert(ei == NULL); \ - tt_int_op(again, OP_EQ, (againval)); \ - } while (0) -#define ADD(name) \ - do { \ - ri = tor_malloc_zero(sizeof(routerinfo_t)); \ - crypto_pk_t *pk = ri->identity_pkey = crypto_pk_new(); \ - tt_assert(! crypto_pk_read_public_key_from_string(pk, \ - name##_KEY, strlen(name##_KEY))); \ - tt_int_op(20,OP_EQ,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \ - digestmap_set((digestmap_t*)map, d, ri); \ - ri = NULL; \ - } while (0) - - routerinfo_t *ri = NULL; - char d[20]; - struct digest_ri_map_t *map = NULL; - extrainfo_t *ei = NULL; - int again; - - CHECK_OK(EX_EI_MINIMAL); - tt_assert(ei->pending_sig); - CHECK_OK(EX_EI_MAXIMAL); - tt_assert(ei->pending_sig); - CHECK_OK(EX_EI_GOOD_ED_EI); - tt_assert(ei->pending_sig); - - map = (struct digest_ri_map_t *)digestmap_new(); - ADD(EX_EI_MINIMAL); - ADD(EX_EI_MAXIMAL); - ADD(EX_EI_GOOD_ED_EI); - ADD(EX_EI_BAD_FP); - ADD(EX_EI_BAD_NICKNAME); - ADD(EX_EI_BAD_TOKENS); - ADD(EX_EI_BAD_START); - ADD(EX_EI_BAD_PUBLISHED); - - ADD(EX_EI_ED_MISSING_SIG); - ADD(EX_EI_ED_MISSING_CERT); - ADD(EX_EI_ED_BAD_CERT1); - ADD(EX_EI_ED_BAD_CERT2); - ADD(EX_EI_ED_BAD_SIG1); - ADD(EX_EI_ED_BAD_SIG2); - ADD(EX_EI_ED_MISPLACED_CERT); - ADD(EX_EI_ED_MISPLACED_SIG); - - CHECK_OK(EX_EI_MINIMAL); - tt_ptr_op(ei->pending_sig, OP_EQ, NULL); - CHECK_OK(EX_EI_MAXIMAL); - tt_ptr_op(ei->pending_sig, OP_EQ, NULL); - CHECK_OK(EX_EI_GOOD_ED_EI); - tt_ptr_op(ei->pending_sig, OP_EQ, NULL); - - CHECK_FAIL(EX_EI_BAD_SIG1,1); - CHECK_FAIL(EX_EI_BAD_SIG2,1); - CHECK_FAIL(EX_EI_BAD_SIG3,1); - CHECK_FAIL(EX_EI_BAD_FP,0); - CHECK_FAIL(EX_EI_BAD_NICKNAME,0); - CHECK_FAIL(EX_EI_BAD_TOKENS,0); - CHECK_FAIL(EX_EI_BAD_START,0); - CHECK_FAIL(EX_EI_BAD_PUBLISHED,0); - - CHECK_FAIL(EX_EI_ED_MISSING_SIG,0); - CHECK_FAIL(EX_EI_ED_MISSING_CERT,0); - CHECK_FAIL(EX_EI_ED_BAD_CERT1,0); - CHECK_FAIL(EX_EI_ED_BAD_CERT2,0); - CHECK_FAIL(EX_EI_ED_BAD_SIG1,0); - CHECK_FAIL(EX_EI_ED_BAD_SIG2,0); - CHECK_FAIL(EX_EI_ED_MISPLACED_CERT,0); - CHECK_FAIL(EX_EI_ED_MISPLACED_SIG,0); - -#undef CHECK_OK -#undef CHECK_FAIL - - done: - escaped(NULL); - extrainfo_free(ei); - routerinfo_free(ri); - digestmap_free_((digestmap_t*)map, routerinfo_free_wrapper_); -} - -static void -test_dir_parse_router_list(void *arg) -{ - (void) arg; - smartlist_t *invalid = smartlist_new(); - smartlist_t *dest = smartlist_new(); - smartlist_t *chunks = smartlist_new(); - int dest_has_ri = 1; - char *list = NULL; - const char *cp; - digestmap_t *map = NULL; - char *mem_op_hex_tmp = NULL; - routerinfo_t *ri = NULL; - char d[DIGEST_LEN]; - - smartlist_add_strdup(chunks, EX_RI_MINIMAL); // ri 0 - smartlist_add_strdup(chunks, EX_RI_BAD_PORTS); // bad ri 0 - smartlist_add_strdup(chunks, EX_EI_MAXIMAL); // ei 0 - smartlist_add_strdup(chunks, EX_EI_BAD_SIG2); // bad ei -- - smartlist_add_strdup(chunks, EX_EI_BAD_NICKNAME);// bad ei 0 - smartlist_add_strdup(chunks, EX_RI_BAD_SIG1); // bad ri -- - smartlist_add_strdup(chunks, EX_EI_BAD_PUBLISHED); // bad ei 1 - smartlist_add_strdup(chunks, EX_RI_MAXIMAL); // ri 1 - smartlist_add_strdup(chunks, EX_RI_BAD_FAMILY); // bad ri 1 - smartlist_add_strdup(chunks, EX_EI_MINIMAL); // ei 1 - - list = smartlist_join_strings(chunks, "", 0, NULL); - - /* First, parse the routers. */ - cp = list; - tt_int_op(0,OP_EQ, - router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, - 0, 0, NULL, invalid)); - tt_int_op(2, OP_EQ, smartlist_len(dest)); - tt_ptr_op(cp, OP_EQ, list + strlen(list)); - - routerinfo_t *r = smartlist_get(dest, 0); - tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, - EX_RI_MINIMAL, strlen(EX_RI_MINIMAL)); - r = smartlist_get(dest, 1); - tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, - EX_RI_MAXIMAL, strlen(EX_RI_MAXIMAL)); - - tt_int_op(2, OP_EQ, smartlist_len(invalid)); - test_memeq_hex(smartlist_get(invalid, 0), - "ab9eeaa95e7d45740185b4e519c76ead756277a9"); - test_memeq_hex(smartlist_get(invalid, 1), - "9a651ee03b64325959e8f1b46f2b689b30750b4c"); - - /* Now tidy up */ - SMARTLIST_FOREACH(dest, routerinfo_t *, rinfo, routerinfo_free(rinfo)); - SMARTLIST_FOREACH(invalid, uint8_t *, dig, tor_free(dig)); - smartlist_clear(dest); - smartlist_clear(invalid); - - /* And check extrainfos. */ - dest_has_ri = 0; - map = (digestmap_t*)router_get_routerlist()->identity_map; - ADD(EX_EI_MINIMAL); - ADD(EX_EI_MAXIMAL); - ADD(EX_EI_BAD_NICKNAME); - ADD(EX_EI_BAD_PUBLISHED); - cp = list; - tt_int_op(0,OP_EQ, - router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, - 1, 0, NULL, invalid)); - tt_int_op(2, OP_EQ, smartlist_len(dest)); - extrainfo_t *e = smartlist_get(dest, 0); - tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, - EX_EI_MAXIMAL, strlen(EX_EI_MAXIMAL)); - e = smartlist_get(dest, 1); - tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, - EX_EI_MINIMAL, strlen(EX_EI_MINIMAL)); - - tt_int_op(2, OP_EQ, smartlist_len(invalid)); - test_memeq_hex(smartlist_get(invalid, 0), - "d5df4aa62ee9ffc9543d41150c9864908e0390af"); - test_memeq_hex(smartlist_get(invalid, 1), - "f61efd2a7f4531f3687a9043e0de90a862ec64ba"); - - done: - tor_free(list); - if (dest_has_ri) - SMARTLIST_FOREACH(dest, routerinfo_t *, rt, routerinfo_free(rt)); - else - SMARTLIST_FOREACH(dest, extrainfo_t *, ei, extrainfo_free(ei)); - smartlist_free(dest); - SMARTLIST_FOREACH(invalid, uint8_t *, dig, tor_free(dig)); - smartlist_free(invalid); - SMARTLIST_FOREACH(chunks, char *, chunk, tor_free(chunk)); - smartlist_free(chunks); - routerinfo_free(ri); - if (map) { - digestmap_free_((digestmap_t*)map, routerinfo_free_wrapper_); - router_get_routerlist()->identity_map = - (struct digest_ri_map_t*)digestmap_new(); - } - tor_free(mem_op_hex_tmp); - -#undef ADD -} - -static download_status_t dls_minimal; -static download_status_t dls_maximal; -static download_status_t dls_bad_fingerprint; -static download_status_t dls_bad_sig2; -static download_status_t dls_bad_ports; -static download_status_t dls_bad_tokens; - -static int mock_router_get_dl_status_unrecognized = 0; -static int mock_router_get_dl_status_calls = 0; - -static download_status_t * -mock_router_get_dl_status(const char *d) -{ - ++mock_router_get_dl_status_calls; - char hex[HEX_DIGEST_LEN+1]; - base16_encode(hex, sizeof(hex), d, DIGEST_LEN); - if (!strcmp(hex, "3E31D19A69EB719C00B02EC60D13356E3F7A3452")) { - return &dls_minimal; - } else if (!strcmp(hex, "581D8A368A0FA854ECDBFAB841D88B3F1B004038")) { - return &dls_maximal; - } else if (!strcmp(hex, "2578AE227C6116CDE29B3F0E95709B9872DEE5F1")) { - return &dls_bad_fingerprint; - } else if (!strcmp(hex, "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C")) { - return &dls_bad_sig2; - } else if (!strcmp(hex, "AB9EEAA95E7D45740185B4E519C76EAD756277A9")) { - return &dls_bad_ports; - } else if (!strcmp(hex, "A0CC2CEFAD59DBF19F468BFEE60E0868C804B422")) { - return &dls_bad_tokens; - } else { - ++mock_router_get_dl_status_unrecognized; - return NULL; - } -} - -static void -test_dir_load_routers(void *arg) -{ - (void) arg; - smartlist_t *chunks = smartlist_new(); - smartlist_t *wanted = smartlist_new(); - char buf[DIGEST_LEN]; - char *mem_op_hex_tmp = NULL; - char *list = NULL; - -#define ADD(str) \ - do { \ - tt_int_op(0,OP_EQ,router_get_router_hash(str, strlen(str), buf)); \ - smartlist_add_strdup(wanted, hex_str(buf, DIGEST_LEN)); \ - } while (0) - - MOCK(router_get_dl_status_by_descriptor_digest, mock_router_get_dl_status); - - update_approx_time(1412510400); - - smartlist_add_strdup(chunks, EX_RI_MINIMAL); - smartlist_add_strdup(chunks, EX_RI_BAD_FINGERPRINT); - smartlist_add_strdup(chunks, EX_RI_BAD_SIG2); - smartlist_add_strdup(chunks, EX_RI_MAXIMAL); - smartlist_add_strdup(chunks, EX_RI_BAD_PORTS); - smartlist_add_strdup(chunks, EX_RI_BAD_TOKENS); - - /* not ADDing MINIMIAL */ - ADD(EX_RI_MAXIMAL); - ADD(EX_RI_BAD_FINGERPRINT); - ADD(EX_RI_BAD_SIG2); - /* Not ADDing BAD_PORTS */ - ADD(EX_RI_BAD_TOKENS); - - list = smartlist_join_strings(chunks, "", 0, NULL); - tt_int_op(1, OP_EQ, - router_load_routers_from_string(list, NULL, SAVED_IN_JOURNAL, - wanted, 1, NULL)); - - /* The "maximal" router was added. */ - /* "minimal" was not. */ - tt_int_op(smartlist_len(router_get_routerlist()->routers),OP_EQ,1); - routerinfo_t *r = smartlist_get(router_get_routerlist()->routers, 0); - test_memeq_hex(r->cache_info.signed_descriptor_digest, - "581D8A368A0FA854ECDBFAB841D88B3F1B004038"); - tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); - tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); - - /* "Bad fingerprint" and "Bad tokens" should have gotten marked - * non-retriable. */ - tt_want_int_op(mock_router_get_dl_status_calls, OP_EQ, 2); - tt_want_int_op(mock_router_get_dl_status_unrecognized, OP_EQ, 0); - tt_int_op(dls_bad_fingerprint.n_download_failures, OP_EQ, 255); - tt_int_op(dls_bad_tokens.n_download_failures, OP_EQ, 255); - - /* bad_sig2 and bad ports" are retriable -- one since only the signature - * was bad, and one because we didn't ask for it. */ - tt_int_op(dls_bad_sig2.n_download_failures, OP_EQ, 0); - tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); - - /* Wanted still contains "BAD_SIG2" */ - tt_int_op(smartlist_len(wanted), OP_EQ, 1); - tt_str_op(smartlist_get(wanted, 0), OP_EQ, - "E0A3753CEFD54128EAB239F294954121DB23D2EF"); - -#undef ADD - - done: - tor_free(mem_op_hex_tmp); - UNMOCK(router_get_dl_status_by_descriptor_digest); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); - smartlist_free(wanted); - tor_free(list); -} - -static int mock_get_by_ei_dd_calls = 0; -static int mock_get_by_ei_dd_unrecognized = 0; - -static signed_descriptor_t sd_ei_minimal; -static signed_descriptor_t sd_ei_bad_nickname; -static signed_descriptor_t sd_ei_maximal; -static signed_descriptor_t sd_ei_bad_tokens; -static signed_descriptor_t sd_ei_bad_sig2; - -static signed_descriptor_t * -mock_get_by_ei_desc_digest(const char *d) -{ - - ++mock_get_by_ei_dd_calls; - char hex[HEX_DIGEST_LEN+1]; - base16_encode(hex, sizeof(hex), d, DIGEST_LEN); - - if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { - return &sd_ei_minimal; - } else if (!strcmp(hex, "47803B02A0E70E9E8BDA226CB1D74DE354D67DFF")) { - return &sd_ei_maximal; - } else if (!strcmp(hex, "D5DF4AA62EE9FFC9543D41150C9864908E0390AF")) { - return &sd_ei_bad_nickname; - } else if (!strcmp(hex, "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C")) { - return &sd_ei_bad_sig2; - } else if (!strcmp(hex, "9D90F8C42955BBC57D54FB05E54A3F083AF42E8B")) { - return &sd_ei_bad_tokens; - } else { - ++mock_get_by_ei_dd_unrecognized; - return NULL; - } -} - -static signed_descriptor_t * -mock_ei_get_by_ei_digest(const char *d) -{ - char hex[HEX_DIGEST_LEN+1]; - base16_encode(hex, sizeof(hex), d, DIGEST_LEN); - signed_descriptor_t *sd = &sd_ei_minimal; - - if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { - sd->signed_descriptor_body = (char *)EX_EI_MINIMAL; - sd->signed_descriptor_len = sizeof(EX_EI_MINIMAL); - sd->annotations_len = 0; - sd->saved_location = SAVED_NOWHERE; - return sd; - } - return NULL; -} - -static smartlist_t *mock_ei_insert_list = NULL; -static was_router_added_t -mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible) -{ - (void) rl; - (void) warn_if_incompatible; - smartlist_add(mock_ei_insert_list, ei); - return ROUTER_ADDED_SUCCESSFULLY; -} - -static void -test_dir_load_extrainfo(void *arg) -{ - (void) arg; - smartlist_t *chunks = smartlist_new(); - smartlist_t *wanted = smartlist_new(); - char buf[DIGEST_LEN]; - char *mem_op_hex_tmp = NULL; - char *list = NULL; - -#define ADD(str) \ - do { \ - tt_int_op(0,OP_EQ,router_get_extrainfo_hash(str, strlen(str), buf)); \ - smartlist_add_strdup(wanted, hex_str(buf, DIGEST_LEN)); \ - } while (0) - - mock_ei_insert_list = smartlist_new(); - MOCK(router_get_by_extrainfo_digest, mock_get_by_ei_desc_digest); - MOCK(extrainfo_insert, mock_ei_insert); - - smartlist_add_strdup(chunks, EX_EI_MINIMAL); - smartlist_add_strdup(chunks, EX_EI_BAD_NICKNAME); - smartlist_add_strdup(chunks, EX_EI_MAXIMAL); - smartlist_add_strdup(chunks, EX_EI_BAD_PUBLISHED); - smartlist_add_strdup(chunks, EX_EI_BAD_TOKENS); - - /* not ADDing MINIMIAL */ - ADD(EX_EI_MAXIMAL); - ADD(EX_EI_BAD_NICKNAME); - /* Not ADDing BAD_PUBLISHED */ - ADD(EX_EI_BAD_TOKENS); - ADD(EX_EI_BAD_SIG2); - - list = smartlist_join_strings(chunks, "", 0, NULL); - router_load_extrainfo_from_string(list, NULL, SAVED_IN_JOURNAL, wanted, 1); - - /* The "maximal" router was added. */ - /* "minimal" was also added, even though we didn't ask for it, since - * that's what we do with extrainfos. */ - tt_int_op(smartlist_len(mock_ei_insert_list),OP_EQ,2); - - extrainfo_t *e = smartlist_get(mock_ei_insert_list, 0); - test_memeq_hex(e->cache_info.signed_descriptor_digest, - "11E0EDF526950739F7769810FCACAB8C882FAEEE"); - - e = smartlist_get(mock_ei_insert_list, 1); - test_memeq_hex(e->cache_info.signed_descriptor_digest, - "47803B02A0E70E9E8BDA226CB1D74DE354D67DFF"); - tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); - tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); - - /* "Bad nickname" and "Bad tokens" should have gotten marked - * non-retriable. */ - tt_want_int_op(mock_get_by_ei_dd_calls, OP_EQ, 2); - tt_want_int_op(mock_get_by_ei_dd_unrecognized, OP_EQ, 0); - tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, OP_EQ, 255); - tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, OP_EQ, 255); - - /* bad_ports is retriable -- because we didn't ask for it. */ - tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); - - /* Wanted still contains "BAD_SIG2" */ - tt_int_op(smartlist_len(wanted), OP_EQ, 1); - tt_str_op(smartlist_get(wanted, 0), OP_EQ, - "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C"); - -#undef ADD - - done: - tor_free(mem_op_hex_tmp); - UNMOCK(router_get_by_extrainfo_digest); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); - smartlist_free(wanted); - tor_free(list); -} - -static void -test_dir_getinfo_extra(void *arg) -{ - int r; - char *answer = NULL; - const char *errmsg = NULL; - - (void)arg; - MOCK(extrainfo_get_by_descriptor_digest, mock_ei_get_by_ei_digest); - r = getinfo_helper_dir(NULL, "extra-info/digest/" - "11E0EDF526950739F7769810FCACAB8C882FAEEE", &answer, - &errmsg); - tt_int_op(0, OP_EQ, r); - tt_ptr_op(NULL, OP_EQ, errmsg); - tt_str_op(answer, OP_EQ, EX_EI_MINIMAL); - tor_free(answer); - - answer = NULL; - r = getinfo_helper_dir(NULL, "extra-info/digest/" - "NOTAVALIDHEXSTRINGNOTAVALIDHEXSTRINGNOTA", &answer, - &errmsg); - tt_int_op(0, OP_EQ, r); - /* getinfo_helper_dir() should maybe return an error here but doesn't */ - tt_ptr_op(NULL, OP_EQ, errmsg); - /* In any case, there should be no answer for an invalid hex string. */ - tt_ptr_op(NULL, OP_EQ, answer); - - done: - UNMOCK(extrainfo_get_by_descriptor_digest); -} - -static void -test_dir_versions(void *arg) -{ - tor_version_t ver1; - - /* Try out version parsing functionality */ - (void)arg; - tt_int_op(0,OP_EQ, tor_version_parse("0.3.4pre2-cvs", &ver1)); - tt_int_op(0,OP_EQ, ver1.major); - tt_int_op(3,OP_EQ, ver1.minor); - tt_int_op(4,OP_EQ, ver1.micro); - tt_int_op(VER_PRE,OP_EQ, ver1.status); - tt_int_op(2,OP_EQ, ver1.patchlevel); - tt_int_op(0,OP_EQ, tor_version_parse("0.3.4rc1", &ver1)); - tt_int_op(0,OP_EQ, ver1.major); - tt_int_op(3,OP_EQ, ver1.minor); - tt_int_op(4,OP_EQ, ver1.micro); - tt_int_op(VER_RC,OP_EQ, ver1.status); - tt_int_op(1,OP_EQ, ver1.patchlevel); - tt_int_op(0,OP_EQ, tor_version_parse("1.3.4", &ver1)); - tt_int_op(1,OP_EQ, ver1.major); - tt_int_op(3,OP_EQ, ver1.minor); - tt_int_op(4,OP_EQ, ver1.micro); - tt_int_op(VER_RELEASE,OP_EQ, ver1.status); - tt_int_op(0,OP_EQ, ver1.patchlevel); - tt_int_op(0,OP_EQ, tor_version_parse("1.3.4.999", &ver1)); - tt_int_op(1,OP_EQ, ver1.major); - tt_int_op(3,OP_EQ, ver1.minor); - tt_int_op(4,OP_EQ, ver1.micro); - tt_int_op(VER_RELEASE,OP_EQ, ver1.status); - tt_int_op(999,OP_EQ, ver1.patchlevel); - tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4-alpha", &ver1)); - tt_int_op(0,OP_EQ, ver1.major); - tt_int_op(1,OP_EQ, ver1.minor); - tt_int_op(2,OP_EQ, ver1.micro); - tt_int_op(4,OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE,OP_EQ, ver1.status); - tt_str_op("alpha",OP_EQ, ver1.status_tag); - tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4", &ver1)); - tt_int_op(0,OP_EQ, ver1.major); - tt_int_op(1,OP_EQ, ver1.minor); - tt_int_op(2,OP_EQ, ver1.micro); - tt_int_op(4,OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE,OP_EQ, ver1.status); - tt_str_op("",OP_EQ, ver1.status_tag); - - tt_int_op(0, OP_EQ, tor_version_parse("10.1", &ver1)); - tt_int_op(10, OP_EQ, ver1.major); - tt_int_op(1, OP_EQ, ver1.minor); - tt_int_op(0, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("5.99.999", &ver1)); - tt_int_op(5, OP_EQ, ver1.major); - tt_int_op(99, OP_EQ, ver1.minor); - tt_int_op(999, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("10.1-alpha", &ver1)); - tt_int_op(10, OP_EQ, ver1.major); - tt_int_op(1, OP_EQ, ver1.minor); - tt_int_op(0, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("alpha", OP_EQ, ver1.status_tag); - /* Go through the full set of status tags */ - tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1)); - tt_int_op(2, OP_EQ, ver1.major); - tt_int_op(1, OP_EQ, ver1.minor); - tt_int_op(700, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("alpha", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("1.6.8-alpha-dev", &ver1)); - tt_int_op(1, OP_EQ, ver1.major); - tt_int_op(6, OP_EQ, ver1.minor); - tt_int_op(8, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("alpha-dev", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.5-rc", &ver1)); - tt_int_op(0, OP_EQ, ver1.major); - tt_int_op(2, OP_EQ, ver1.minor); - tt_int_op(9, OP_EQ, ver1.micro); - tt_int_op(5, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("rc", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.6-rc-dev", &ver1)); - tt_int_op(0, OP_EQ, ver1.major); - tt_int_op(2, OP_EQ, ver1.minor); - tt_int_op(9, OP_EQ, ver1.micro); - tt_int_op(6, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("rc-dev", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.8", &ver1)); - tt_int_op(0, OP_EQ, ver1.major); - tt_int_op(2, OP_EQ, ver1.minor); - tt_int_op(9, OP_EQ, ver1.micro); - tt_int_op(8, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("", OP_EQ, ver1.status_tag); - tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.9-dev", &ver1)); - tt_int_op(0, OP_EQ, ver1.major); - tt_int_op(2, OP_EQ, ver1.minor); - tt_int_op(9, OP_EQ, ver1.micro); - tt_int_op(9, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("dev", OP_EQ, ver1.status_tag); - /* In #21450, we fixed an inconsistency in parsing versions > INT32_MAX - * between i386 and x86_64, as we used tor_parse_long, and then cast to int - */ - tt_int_op(0, OP_EQ, tor_version_parse("0.2147483647.0", &ver1)); - tt_int_op(0, OP_EQ, ver1.major); - tt_int_op(2147483647, OP_EQ, ver1.minor); - tt_int_op(0, OP_EQ, ver1.micro); - tt_int_op(0, OP_EQ, ver1.patchlevel); - tt_int_op(VER_RELEASE, OP_EQ, ver1.status); - tt_str_op("", OP_EQ, ver1.status_tag); - tt_int_op(-1, OP_EQ, tor_version_parse("0.2147483648.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.4294967295.0", &ver1)); - /* In #21278, we reject negative version components */ - tt_int_op(-1, OP_EQ, tor_version_parse("0.-1.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.-2147483648.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.-4294967295.0", &ver1)); - /* In #21507, we reject version components with non-numeric prefixes */ - tt_int_op(-1, OP_EQ, tor_version_parse("0.-0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("+1.0.0", &ver1)); - /* use the list in isspace() */ - tt_int_op(-1, OP_EQ, tor_version_parse("0.\t0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.\n0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.\v0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.\f0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0.\r0.0", &ver1)); - tt_int_op(-1, OP_EQ, tor_version_parse("0. 0.0", &ver1)); - -#define tt_versionstatus_op(vs1, op, vs2) \ - tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ - (val1_ op val2_),"%d",TT_EXIT_TEST_FUNCTION) -#define test_v_i_o(val, ver, lst) \ - tt_versionstatus_op(val, OP_EQ, tor_version_is_obsolete(ver, lst)) - - /* make sure tor_version_is_obsolete() works */ - test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2"); - test_v_i_o(VS_OLD, "0.0.1", "0.0.2, Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.1", "0.0.2,Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.1","0.0.3,BetterTor 0.0.1"); - test_v_i_o(VS_RECOMMENDED, "0.0.2", "Tor 0.0.2,Tor 0.0.3"); - test_v_i_o(VS_NEW_IN_SERIES, "0.0.2", "Tor 0.0.2pre1,Tor 0.0.3"); - test_v_i_o(VS_OLD, "0.0.2", "Tor 0.0.2.1,Tor 0.0.3"); - test_v_i_o(VS_NEW, "0.1.0", "Tor 0.0.2,Tor 0.0.3"); - test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); - test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); - test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); - test_v_i_o(VS_NEW, "0.2.9.9-dev", "0.2.9.9"); - /* Not on list, but newer than any in same series. */ - test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", - "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Series newer than any on list. */ - test_v_i_o(VS_NEW, "0.1.2.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Series older than any on list. */ - test_v_i_o(VS_OLD, "0.0.1.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* Not on list, not newer than any on same series. */ - test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1", - "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - /* On list, not newer than any on same series. */ - test_v_i_o(VS_UNRECOMMENDED, - "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." - "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", - "0.0.8rc2")); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." - "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2")); - - /* Now try svn revisions. */ - tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", - "Tor 0.2.1.0-dev (r99)")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.1.0-dev (r100) on Banana Jr", - "Tor 0.2.1.0-dev (r99) on Hal 9000")); - tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", - "Tor 0.2.1.0-dev on Colossus")); - tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", - "Tor 0.2.1.0-dev (r100)")); - tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", - "Tor 0.2.1.0-dev (r100) on AM")); - tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev", - "Tor 0.2.1.0-dev (r99)")); - tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1", - "Tor 0.2.1.0-dev (r99)")); - /* And git revisions */ - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-56788a2489127072)", - "Tor 0.2.9.9 (git-56788a2489127072)")); - /* a git revision is newer than no git revision */ - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-56788a2489127072)", - "Tor 0.2.9.9")); - /* a longer git revision is newer than a shorter git revision - * this should be true if they prefix-match, but if they don't, they are - * incomparable, because hashes aren't ordered (but we compare their bytes - * anyway) */ - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-56788a2489127072d513cf4baf35a8ff475f3c7b)", - "Tor 0.2.9.9 (git-56788a2489127072)")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-0102)", - "Tor 0.2.9.9 (git-03)")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-0102)", - "Tor 0.2.9.9 (git-00)")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-01)", - "Tor 0.2.9.9 (git-00)")); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.2.9.9 (git-00)", - "Tor 0.2.9.9 (git-01)")); - /* In #21278, we comapre without integer overflows. - * But since #21450 limits version components to [0, INT32_MAX], it is no - * longer possible to cause an integer overflow in tor_version_compare() */ - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.0.0.0", - "Tor 2147483647.0.0.0")); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 2147483647.0.0.0", - "Tor 0.0.0.0")); - /* These versions used to cause an overflow, now they don't parse - * (and authorities reject their descriptors), and log a BUG message */ - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.0.0.0", - "Tor 0.-2147483648.0.0")); - expect_single_log_msg_containing("unparseable"); - mock_clean_saved_logs(); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.2147483647.0.0", - "Tor 0.-1.0.0")); - expect_single_log_msg_containing("unparseable"); - mock_clean_saved_logs(); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.2147483647.0.0", - "Tor 0.-2147483648.0.0")); - expect_single_log_msg_containing("unparseable"); - mock_clean_saved_logs(); - tt_int_op(1,OP_EQ, tor_version_as_new_as( - "Tor 4294967295.0.0.0", - "Tor 0.0.0.0")); - expect_no_log_entry(); - tt_int_op(0,OP_EQ, tor_version_as_new_as( - "Tor 0.4294967295.0.0", - "Tor 0.-4294967295.0.0")); - expect_single_log_msg_containing("unparseable"); - mock_clean_saved_logs(); - teardown_capture_of_logs(); - - /* Now try git revisions */ - tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); - tt_int_op(0,OP_EQ, ver1.major); - tt_int_op(5,OP_EQ, ver1.minor); - tt_int_op(6,OP_EQ, ver1.micro); - tt_int_op(7,OP_EQ, ver1.patchlevel); - tt_int_op(3,OP_EQ, ver1.git_tag_len); - tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3); - /* reject bad hex digits */ - tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); - /* reject odd hex digit count */ - tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); - /* ignore "git " */ - tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); - /* standard length is 16 hex digits */ - tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-0010203040506070)", - &ver1)); - /* length limit is 40 hex digits */ - tt_int_op(0,OP_EQ, tor_version_parse( - "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f10111213)", - &ver1)); - tt_int_op(-1,OP_EQ, tor_version_parse( - "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f1011121314)", - &ver1)); - done: - teardown_capture_of_logs(); -} - -/** Run unit tests for directory fp_pair functions. */ -static void -test_dir_fp_pairs(void *arg) -{ - smartlist_t *sl = smartlist_new(); - fp_pair_t *pair; - - (void)arg; - dir_split_resource_into_fingerprint_pairs( - /* Two pairs, out of order, with one duplicate. */ - "73656372657420646174612E0000000000FFFFFF-" - "557365204145532d32353620696e73746561642e+" - "73656372657420646174612E0000000000FFFFFF-" - "557365204145532d32353620696e73746561642e+" - "48657861646563696d616c2069736e277420736f-" - "676f6f6420666f7220686964696e6720796f7572.z", sl); - - tt_int_op(smartlist_len(sl),OP_EQ, 2); - pair = smartlist_get(sl, 0); - tt_mem_op(pair->first,OP_EQ, "Hexadecimal isn't so", DIGEST_LEN); - tt_mem_op(pair->second,OP_EQ, "good for hiding your", DIGEST_LEN); - pair = smartlist_get(sl, 1); - tt_mem_op(pair->first,OP_EQ, "secret data.\0\0\0\0\0\xff\xff\xff", - DIGEST_LEN); - tt_mem_op(pair->second,OP_EQ, "Use AES-256 instead.", DIGEST_LEN); - - done: - SMARTLIST_FOREACH(sl, fp_pair_t *, pair_to_free, tor_free(pair_to_free)); - smartlist_free(sl); -} - -static void -test_dir_split_fps(void *testdata) -{ - smartlist_t *sl = smartlist_new(); - char *mem_op_hex_tmp = NULL; - (void)testdata; - - /* Some example hex fingerprints and their base64 equivalents */ -#define HEX1 "Fe0daff89127389bc67558691231234551193EEE" -#define HEX2 "Deadbeef99999991111119999911111111f00ba4" -#define HEX3 "b33ff00db33ff00db33ff00db33ff00db33ff00d" -#define HEX256_1 \ - "f3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf3f3f3f3fbbbf3f3f3f3fbbbbf" -#define HEX256_2 \ - "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccCCc" -#define HEX256_3 \ - "0123456789ABCdef0123456789ABCdef0123456789ABCdef0123456789ABCdef" -#define B64_1 "/g2v+JEnOJvGdVhpEjEjRVEZPu4" -#define B64_2 "3q2+75mZmZERERmZmRERERHwC6Q" -#define B64_256_1 "8/Pz8/u7vz8/Pz+7vz8/Pz+7u/Pz8/P7u/Pz8/P7u78" -#define B64_256_2 "zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMw" - - /* no flags set */ - dir_split_resource_into_fingerprints("A+C+B", sl, NULL, 0); - tt_int_op(smartlist_len(sl), OP_EQ, 3); - tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); - tt_str_op(smartlist_get(sl, 1), OP_EQ, "C"); - tt_str_op(smartlist_get(sl, 2), OP_EQ, "B"); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* uniq strings. */ - dir_split_resource_into_fingerprints("A+C+B+A+B+B", sl, NULL, DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), OP_EQ, 3); - tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); - tt_str_op(smartlist_get(sl, 1), OP_EQ, "B"); - tt_str_op(smartlist_get(sl, 2), OP_EQ, "C"); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode hex. */ - dir_split_resource_into_fingerprints(HEX1"+"HEX2, sl, NULL, DSR_HEX); - tt_int_op(smartlist_len(sl), OP_EQ, 2); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* decode hex and drop weirdness. */ - dir_split_resource_into_fingerprints(HEX1"+bogus+"HEX2"+"HEX256_1, - sl, NULL, DSR_HEX); - tt_int_op(smartlist_len(sl), OP_EQ, 2); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode long hex */ - dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX2"+"HEX256_3, - sl, NULL, DSR_HEX|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), OP_EQ, 3); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); - test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_3); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode hex and sort. */ - dir_split_resource_into_fingerprints(HEX1"+"HEX2"+"HEX3"+"HEX2, - sl, NULL, DSR_HEX|DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), OP_EQ, 3); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX3); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); - test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX1); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode long hex and sort */ - dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX256_3 - "+"HEX256_1, - sl, NULL, - DSR_HEX|DSR_DIGEST256|DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), OP_EQ, 3); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_3); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); - test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_1); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode base64 */ - dir_split_resource_into_fingerprints(B64_1"-"B64_2, sl, NULL, DSR_BASE64); - tt_int_op(smartlist_len(sl), OP_EQ, 2); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - /* Decode long base64 */ - dir_split_resource_into_fingerprints(B64_256_1"-"B64_256_2, - sl, NULL, DSR_BASE64|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), OP_EQ, 2); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); - test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - dir_split_resource_into_fingerprints(B64_256_1, - sl, NULL, DSR_BASE64|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), OP_EQ, 1); - test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_clear(sl); - - done: - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - tor_free(mem_op_hex_tmp); -} - -static void -test_dir_measured_bw_kb(void *arg) -{ - measured_bw_line_t mbwl; - int i; - const char *lines_pass[] = { - "node_id=$557365204145532d32353620696e73746561642e bw=1024\n", - "node_id=$557365204145532d32353620696e73746561642e\t bw=1024 \n", - " node_id=$557365204145532d32353620696e73746561642e bw=1024\n", - "\tnoise\tnode_id=$557365204145532d32353620696e73746561642e " - "bw=1024 junk=007\n", - "misc=junk node_id=$557365204145532d32353620696e73746561642e " - "bw=1024 junk=007\n", - "end" - }; - const char *lines_fail[] = { - /* Test possible python stupidity on input */ - "node_id=None bw=1024\n", - "node_id=$None bw=1024\n", - "node_id=$557365204145532d32353620696e73746561642e bw=None\n", - "node_id=$557365204145532d32353620696e73746561642e bw=1024.0\n", - "node_id=$557365204145532d32353620696e73746561642e bw=.1024\n", - "node_id=$557365204145532d32353620696e73746561642e bw=1.024\n", - "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=0\n", - "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=None\n", - "node_id=$557365204145532d32353620696e73746561642e bw=-1024\n", - /* Test incomplete writes due to race conditions, partial copies, etc */ - "node_i", - "node_i\n", - "node_id=", - "node_id=\n", - "node_id=$557365204145532d32353620696e73746561642e bw=", - "node_id=$557365204145532d32353620696e73746561642e bw=1024", - "node_id=$557365204145532d32353620696e73746561642e bw=\n", - "node_id=$557365204145532d32353620696e7374", - "node_id=$557365204145532d32353620696e7374\n", - "", - "\n", - " \n ", - " \n\n", - /* Test assorted noise */ - " node_id= ", - "node_id==$557365204145532d32353620696e73746561642e bw==1024\n", - "node_id=$55736520414552d32353620696e73746561642e bw=1024\n", - "node_id=557365204145532d32353620696e73746561642e bw=1024\n", - "node_id= $557365204145532d32353620696e73746561642e bw=0.23\n", - "end" - }; - - (void)arg; - for (i = 0; strcmp(lines_fail[i], "end"); i++) { - //fprintf(stderr, "Testing: %s\n", lines_fail[i]); - tt_int_op(measured_bw_line_parse(&mbwl, lines_fail[i]), OP_EQ, -1); - } - - for (i = 0; strcmp(lines_pass[i], "end"); i++) { - //fprintf(stderr, "Testing: %s %d\n", lines_pass[i], TOR_ISSPACE('\n')); - tt_int_op(measured_bw_line_parse(&mbwl, lines_pass[i]), OP_EQ, 0); - tt_assert(mbwl.bw_kb == 1024); - tt_assert(strcmp(mbwl.node_hex, - "557365204145532d32353620696e73746561642e") == 0); - } - - done: - return; -} - -#define MBWC_INIT_TIME 1000 - -/** Do the measured bandwidth cache unit test */ -static void -test_dir_measured_bw_kb_cache(void *arg) -{ - /* Initial fake time_t for testing */ - time_t curr = MBWC_INIT_TIME; - /* Some measured_bw_line_ts */ - measured_bw_line_t mbwl[3]; - /* For receiving output on cache queries */ - long bw; - time_t as_of; - - /* First, clear the cache and assert that it's empty */ - (void)arg; - dirserv_clear_measured_bw_cache(); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); - /* - * Set up test mbwls; none of the dirserv_cache_*() functions care about - * the node_hex field. - */ - memset(mbwl[0].node_id, 0x01, DIGEST_LEN); - mbwl[0].bw_kb = 20; - memset(mbwl[1].node_id, 0x02, DIGEST_LEN); - mbwl[1].bw_kb = 40; - memset(mbwl[2].node_id, 0x03, DIGEST_LEN); - mbwl[2].bw_kb = 80; - /* Try caching something */ - dirserv_cache_measured_bw(&(mbwl[0]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); - /* Okay, let's see if we can retrieve it */ - tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, &as_of)); - tt_int_op(bw,OP_EQ, 20); - tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); - /* Try retrieving it without some outputs */ - tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL, NULL)); - tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, NULL)); - tt_int_op(bw,OP_EQ, 20); - tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL,&as_of)); - tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); - /* Now expire it */ - curr += MAX_MEASUREMENT_AGE + 1; - dirserv_expire_measured_bw_cache(curr); - /* Check that the cache is empty */ - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); - /* Check that we can't retrieve it */ - tt_assert(!dirserv_query_measured_bw_cache_kb(mbwl[0].node_id, NULL,NULL)); - /* Try caching a few things now */ - dirserv_cache_measured_bw(&(mbwl[0]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); - curr += MAX_MEASUREMENT_AGE / 4; - dirserv_cache_measured_bw(&(mbwl[1]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); - curr += MAX_MEASUREMENT_AGE / 4; - dirserv_cache_measured_bw(&(mbwl[2]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); - curr += MAX_MEASUREMENT_AGE / 4 + 1; - /* Do an expire that's too soon to get any of them */ - dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); - /* Push the oldest one off the cliff */ - curr += MAX_MEASUREMENT_AGE / 4; - dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); - /* And another... */ - curr += MAX_MEASUREMENT_AGE / 4; - dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); - /* This should empty it out again */ - curr += MAX_MEASUREMENT_AGE / 4; - dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); - - done: - return; -} - -static char * -my_dirvote_compute_params(smartlist_t *votes, int method, - int total_authorities) -{ - smartlist_t *s = dirvote_compute_params(votes, method, total_authorities); - tor_assert(s); - char *res = smartlist_join_strings(s, " ", 0, NULL); - SMARTLIST_FOREACH(s, char *, cp, tor_free(cp)); - smartlist_free(s); - return res; -} - -#define dirvote_compute_params my_dirvote_compute_params - -static void -test_dir_param_voting(void *arg) -{ - networkstatus_t vote1, vote2, vote3, vote4; - smartlist_t *votes = smartlist_new(); - char *res = NULL; - - /* dirvote_compute_params only looks at the net_params field of the votes, - so that's all we need to set. - */ - (void)arg; - memset(&vote1, 0, sizeof(vote1)); - memset(&vote2, 0, sizeof(vote2)); - memset(&vote3, 0, sizeof(vote3)); - memset(&vote4, 0, sizeof(vote4)); - vote1.net_params = smartlist_new(); - vote2.net_params = smartlist_new(); - vote3.net_params = smartlist_new(); - vote4.net_params = smartlist_new(); - smartlist_split_string(vote1.net_params, - "ab=90 abcd=20 cw=50 x-yz=-99", NULL, 0, 0); - smartlist_split_string(vote2.net_params, - "ab=27 cw=5 x-yz=88", NULL, 0, 0); - smartlist_split_string(vote3.net_params, - "abcd=20 c=60 cw=500 x-yz=-9 zzzzz=101", NULL, 0, 0); - smartlist_split_string(vote4.net_params, - "ab=900 abcd=200 c=1 cw=51 x-yz=100", NULL, 0, 0); - tt_int_op(100,OP_EQ, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300)); - tt_int_op(222,OP_EQ, networkstatus_get_param(&vote4, "foobar", 222, 0, 300)); - tt_int_op(80,OP_EQ, networkstatus_get_param(&vote4, "ab", 12, 0, 80)); - tt_int_op(-8,OP_EQ, networkstatus_get_param(&vote4, "ab", -12, -100, -8)); - tt_int_op(0,OP_EQ, networkstatus_get_param(&vote4, "foobar", 0, -100, 8)); - - tt_int_op(100,OP_EQ, networkstatus_get_overridable_param( - &vote4, -1, "x-yz", 50, 0, 300)); - tt_int_op(30,OP_EQ, networkstatus_get_overridable_param( - &vote4, 30, "x-yz", 50, 0, 300)); - tt_int_op(0,OP_EQ, networkstatus_get_overridable_param( - &vote4, -101, "foobar", 0, -100, 8)); - tt_int_op(-99,OP_EQ, networkstatus_get_overridable_param( - &vote4, -99, "foobar", 0, -100, 8)); - - smartlist_add(votes, &vote1); - - /* Do the first tests without adding all the other votes, for - * networks without many dirauths. */ - - res = dirvote_compute_params(votes, 12, 2); - tt_str_op(res,OP_EQ, ""); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 1); - tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-99"); - tor_free(res); - - smartlist_add(votes, &vote2); - - res = dirvote_compute_params(votes, 12, 2); - tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 3); - tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 6); - tt_str_op(res,OP_EQ, ""); - tor_free(res); - - smartlist_add(votes, &vote3); - - res = dirvote_compute_params(votes, 12, 3); - tt_str_op(res,OP_EQ, "ab=27 abcd=20 cw=50 x-yz=-9"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 5); - tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 9); - tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); - tor_free(res); - - smartlist_add(votes, &vote4); - - res = dirvote_compute_params(votes, 12, 4); - tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 5); - tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); - tor_free(res); - - /* Test that the special-cased "at least three dirauths voted for - * this param" logic works as expected. */ - res = dirvote_compute_params(votes, 12, 6); - tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); - tor_free(res); - - res = dirvote_compute_params(votes, 12, 10); - tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); - tor_free(res); - - done: - tor_free(res); - SMARTLIST_FOREACH(vote1.net_params, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(vote2.net_params, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(vote3.net_params, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(vote4.net_params, char *, cp, tor_free(cp)); - smartlist_free(vote1.net_params); - smartlist_free(vote2.net_params); - smartlist_free(vote3.net_params); - smartlist_free(vote4.net_params); - smartlist_free(votes); - - return; -} - -static void -test_dir_param_voting_lookup(void *arg) -{ - (void)arg; - smartlist_t *lst = smartlist_new(); - - smartlist_split_string(lst, - "moomin=9 moomin=10 moomintroll=5 fred " - "jack= electricity=sdk opa=6z abc=9 abcd=99", - NULL, 0, 0); - - tt_int_op(1000, - OP_EQ, dirvote_get_intermediate_param_value(lst, "ab", 1000)); - tt_int_op(9, OP_EQ, dirvote_get_intermediate_param_value(lst, "abc", 1000)); - tt_int_op(99, OP_EQ, - dirvote_get_intermediate_param_value(lst, "abcd", 1000)); - - /* moomin appears twice. That's a bug. */ - tor_capture_bugs_(1); - tt_int_op(-100, OP_EQ, - dirvote_get_intermediate_param_value(lst, "moomin", -100)); - tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); - tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, - "n_found == 0"); - tor_end_capture_bugs_(); - /* There is no 'fred=', so that is treated as not existing. */ - tt_int_op(-100, OP_EQ, - dirvote_get_intermediate_param_value(lst, "fred", -100)); - /* jack is truncated */ - tor_capture_bugs_(1); - tt_int_op(-100, OP_EQ, - dirvote_get_intermediate_param_value(lst, "jack", -100)); - tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); - tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, - "!(! ok)"); - tor_end_capture_bugs_(); - /* electricity and opa aren't integers. */ - tor_capture_bugs_(1); - tt_int_op(-100, OP_EQ, - dirvote_get_intermediate_param_value(lst, "electricity", -100)); - tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); - tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, - "!(! ok)"); - tor_end_capture_bugs_(); - - tor_capture_bugs_(1); - tt_int_op(-100, OP_EQ, - dirvote_get_intermediate_param_value(lst, "opa", -100)); - tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); - tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, - "!(! ok)"); - tor_end_capture_bugs_(); - - done: - SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); - smartlist_free(lst); - tor_end_capture_bugs_(); -} - -#undef dirvote_compute_params - -/** Helper: Test that two networkstatus_voter_info_t do in fact represent the - * same voting authority, and that they do in fact have all the same - * information. */ -static void -test_same_voter(networkstatus_voter_info_t *v1, - networkstatus_voter_info_t *v2) -{ - tt_str_op(v1->nickname,OP_EQ, v2->nickname); - tt_mem_op(v1->identity_digest,OP_EQ, v2->identity_digest, DIGEST_LEN); - tt_str_op(v1->address,OP_EQ, v2->address); - tt_int_op(v1->addr,OP_EQ, v2->addr); - tt_int_op(v1->dir_port,OP_EQ, v2->dir_port); - tt_int_op(v1->or_port,OP_EQ, v2->or_port); - tt_str_op(v1->contact,OP_EQ, v2->contact); - tt_mem_op(v1->vote_digest,OP_EQ, v2->vote_digest, DIGEST_LEN); - done: - ; -} - -/** Helper: get a detached signatures document for one or two - * consensuses. */ -static char * -get_detached_sigs(networkstatus_t *ns, networkstatus_t *ns2) -{ - char *r; - smartlist_t *sl; - tor_assert(ns && ns->flavor == FLAV_NS); - sl = smartlist_new(); - smartlist_add(sl,ns); - if (ns2) - smartlist_add(sl,ns2); - r = networkstatus_get_detached_signatures(sl); - smartlist_free(sl); - return r; -} - -/** Apply tweaks to the vote list for each voter */ -static int -vote_tweaks_for_v3ns(networkstatus_t *v, int voter, time_t now) -{ - vote_routerstatus_t *vrs; - const char *msg = NULL; - - tt_assert(v); - (void)now; - - if (voter == 1) { - measured_bw_line_t mbw; - memset(mbw.node_id, 33, sizeof(mbw.node_id)); - mbw.bw_kb = 1024; - tt_int_op(measured_bw_line_apply(&mbw, v->routerstatus_list), OP_EQ, 1); - } else if (voter == 2 || voter == 3) { - /* Monkey around with the list a bit */ - vrs = smartlist_get(v->routerstatus_list, 2); - smartlist_del_keeporder(v->routerstatus_list, 2); - vote_routerstatus_free(vrs); - vrs = smartlist_get(v->routerstatus_list, 0); - vrs->status.is_fast = 1; - - if (voter == 3) { - vrs = smartlist_get(v->routerstatus_list, 0); - smartlist_del_keeporder(v->routerstatus_list, 0); - vote_routerstatus_free(vrs); - vrs = smartlist_get(v->routerstatus_list, 0); - memset(vrs->status.descriptor_digest, (int)'Z', DIGEST_LEN); - tt_assert(router_add_to_routerlist( - dir_common_generate_ri_from_rs(vrs), &msg,0,0) >= 0); - } - } - - done: - return 0; -} - -/** - * Test a parsed vote_routerstatus_t for v3_networkstatus test - */ -static void -test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now) -{ - routerstatus_t *rs; - tor_addr_t addr_ipv6; - - tt_assert(vrs); - rs = &(vrs->status); - tt_assert(rs); - - /* Split out by digests to test */ - if (tor_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3", - DIGEST_LEN) && - (voter == 1)) { - /* Check the first routerstatus. */ - tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); - tt_int_op(rs->published_on,OP_EQ, now-1500); - tt_str_op(rs->nickname,OP_EQ, "router2"); - tt_mem_op(rs->identity_digest,OP_EQ, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3", - DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_int_op(rs->addr,OP_EQ, 0x99008801); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 8000); - /* no flags except "running" (16) and "v2dir" (64) and "valid" (128) */ - tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(0xd0)); - } else if (tor_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5", - DIGEST_LEN) && - (voter == 1 || voter == 2)) { - tt_mem_op(rs->identity_digest,OP_EQ, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5", - DIGEST_LEN); - - if (voter == 1) { - /* Check the second routerstatus. */ - tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); - tt_int_op(rs->published_on,OP_EQ, now-1000); - tt_str_op(rs->nickname,OP_EQ, "router1"); - } - tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->addr,OP_EQ, 0x99009901); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 0); - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,OP_EQ, 4711); - if (voter == 1) { - /* all except "authority" (1) */ - tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(254)); - } else { - /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) */ - tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(974)); - } - } else if (tor_memeq(rs->identity_digest, - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", - DIGEST_LEN) && - (voter == 1 || voter == 2)) { - /* Check the measured bandwidth bits */ - tt_assert(vrs->has_measured_bw && - vrs->measured_bw_kb == 1024); - } else { - /* - * Didn't expect this, but the old unit test only checked some of them, - * so don't assert. - */ - /* tt_assert(0); */ - } - - done: - return; -} - -/** - * Test a consensus for v3_networkstatus_test - */ -static void -test_consensus_for_v3ns(networkstatus_t *con, time_t now) -{ - (void)now; - - tt_assert(con); - tt_ptr_op(con->cert, OP_EQ, NULL); - tt_int_op(2,OP_EQ, smartlist_len(con->routerstatus_list)); - /* There should be two listed routers: one with identity 3, one with - * identity 5. */ - - done: - return; -} - -/** - * Test a router list entry for v3_networkstatus test - */ -static void -test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now) -{ - tor_addr_t addr_ipv6; - - tt_assert(rs); - - /* There should be two listed routers: one with identity 3, one with - * identity 5. */ - /* This one showed up in 2 digests. */ - if (tor_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3", - DIGEST_LEN)) { - tt_mem_op(rs->identity_digest,OP_EQ, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_assert(!rs->is_authority); - tt_assert(!rs->is_exit); - tt_assert(!rs->is_fast); - tt_assert(!rs->is_possible_guard); - tt_assert(!rs->is_stable); - /* (If it wasn't running it wouldn't be here) */ - tt_assert(rs->is_flagged_running); - tt_assert(rs->is_valid); - tt_assert(!rs->is_named); - tt_assert(rs->is_v2_dir); - /* XXXX check version */ - } else if (tor_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5", - DIGEST_LEN)) { - /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ - tt_mem_op(rs->identity_digest,OP_EQ, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN); - tt_str_op(rs->nickname,OP_EQ, "router1"); - tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->published_on,OP_EQ, now-1000); - tt_int_op(rs->addr,OP_EQ, 0x99009901); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 0); - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,OP_EQ, 4711); - tt_assert(!rs->is_authority); - tt_assert(rs->is_exit); - tt_assert(rs->is_fast); - tt_assert(rs->is_possible_guard); - tt_assert(rs->is_stable); - tt_assert(rs->is_flagged_running); - tt_assert(rs->is_valid); - tt_assert(rs->is_v2_dir); - tt_assert(!rs->is_named); - /* XXXX check version */ - } else { - /* Weren't expecting this... */ - tt_abort(); - } - - done: - return; -} - -static void -test_dir_networkstatus_compute_bw_weights_v10(void *arg) -{ - (void) arg; - smartlist_t *chunks = smartlist_new(); - int64_t G, M, E, D, T, weight_scale; - int ret; - weight_scale = 10000; - - /* no case. one or more of the values is 0 */ - G = M = E = D = 0; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(smartlist_len(chunks), OP_EQ, 0); - - /* case 1 */ - /* XXX dir-spec not followed? See #20272. If it isn't closed, then this is - * testing current behavior, not spec. */ - G = E = 10; - M = D = 1; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_int_op(smartlist_len(chunks), OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=3333 " - "Wbe=3000 Wbg=3000 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=7000 " - "Weg=3333 Wem=7000 Wgb=10000 Wgd=3333 Wgg=7000 Wgm=7000 Wmb=10000 " - "Wmd=3333 Wme=3000 Wmg=3000 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 2a E scarce */ - M = 100; - G = 20; - E = D = 5; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " - "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " - "Wem=10000 Wgb=10000 Wgd=0 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 Wme=0 " - "Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 2a G scarce */ - M = 100; - E = 20; - G = D = 5; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " - "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=10000 Weg=0 Wem=10000 " - "Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 Wme=0 Wmg=0 " - "Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 2b1 (Wgg=1, Wmd=Wgd) */ - M = 10; - E = 30; - G = 10; - D = 100; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=4000 " - "Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=2000 Wee=10000 Weg=2000 " - "Wem=10000 Wgb=10000 Wgd=4000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=4000 " - "Wme=0 Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 2b2 */ - M = 60; - E = 30; - G = 10; - D = 100; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=666 Wbe=0 " - "Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3666 Wee=10000 Weg=3666 " - "Wem=10000 Wgb=10000 Wgd=5668 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=666 " - "Wme=0 Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 2b3 */ - /* XXX I can't get a combination of values that hits this case without error, - * so this just tests that it fails. See #20285. Also see #20284 as 2b3 does - * not follow dir-spec. */ - /* (E < T/3 && G < T/3) && (E+D>=G || G+D>=E) && (M > T/3) */ - M = 80; - E = 30; - G = 30; - D = 30; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 0); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 3a G scarce */ - M = 10; - E = 30; - G = 10; - D = 5; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 " - "Wbe=3333 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=6667 Weg=0 " - "Wem=6667 Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 " - "Wme=3333 Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 3a E scarce */ - M = 10; - E = 10; - G = 30; - D = 5; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " - "Wbg=3333 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " - "Wem=10000 Wgb=10000 Wgd=0 Wgg=6667 Wgm=6667 Wmb=10000 Wmd=0 Wme=0 " - "Wmg=3333 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 3bg */ - M = 10; - E = 30; - G = 10; - D = 10; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 " - "Wbe=3334 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=0 Wee=6666 Weg=0 " - "Wem=6666 Wgb=10000 Wgd=10000 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=0 " - "Wme=3334 Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case 3be */ - M = 10; - E = 10; - G = 30; - D = 10; - T = G + M + E + D; - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " - "Wbg=3334 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " - "Wem=10000 Wgb=10000 Wgd=0 Wgg=6666 Wgm=6666 Wmb=10000 Wmd=0 Wme=0 " - "Wmg=3334 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case from 21 Jul 2013 (3be) */ - G = 5483409; - M = 1455379; - E = 980834; - D = 3385803; - T = 11305425; - tt_i64_op(G+M+E+D, OP_EQ, T); - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_assert(ret); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=883 Wbe=0 " - "Wbg=3673 Wbm=10000 Wdb=10000 Web=10000 Wed=8233 Wee=10000 Weg=8233 " - "Wem=10000 Wgb=10000 Wgd=883 Wgg=6327 Wgm=6327 Wmb=10000 Wmd=883 Wme=0 " - "Wmg=3673 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case from 04 Oct 2016 (3a E scarce) */ - G=29322240; - M=4721546; - E=1522058; - D=9273571; - T=44839415; - tt_i64_op(G+M+E+D, OP_EQ, T); - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_assert(ret); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=0 Wbe=0 " - "Wbg=4194 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 " - "Wem=10000 Wgb=10000 Wgd=0 Wgg=5806 Wgm=5806 Wmb=10000 Wmd=0 Wme=0 " - "Wmg=4194 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* case from 04 Sep 2013 (2b1) */ - G=3091352; - M=1838837; - E=2109300; - D=2469369; - T=9508858; - tt_i64_op(G+M+E+D, OP_EQ, T); - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_assert(ret); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=317 " - "Wbe=5938 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=9366 Wee=4061 " - "Weg=9366 Wem=4061 Wgb=10000 Wgd=317 Wgg=10000 Wgm=10000 Wmb=10000 " - "Wmd=317 Wme=5938 Wmg=0 Wmm=10000\n"); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_clear(chunks); - - /* explicitly test initializing weights to 1*/ - G=1; - M=1; - E=1; - D=1; - T=4; - tt_i64_op(G+M+E+D, OP_EQ, T); - ret = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, T, - weight_scale); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "bandwidth-weights Wbd=3333 " - "Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=10000 Weg=3333 " - "Wem=10000 Wgb=10000 Wgd=3333 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=3333 " - "Wme=0 Wmg=0 Wmm=10000\n"); - tt_assert(ret); - - done: - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); -} - -static authority_cert_t *mock_cert; - -static authority_cert_t * -get_my_v3_authority_cert_m(void) -{ - tor_assert(mock_cert); - return mock_cert; -} - -/** Run a unit tests for generating and parsing networkstatuses, with - * the supply test fns. */ -static void -test_a_networkstatus( - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - int (*vote_tweaks)(networkstatus_t *v, int voter, time_t now), - void (*vrs_test)(vote_routerstatus_t *vrs, int voter, time_t now), - void (*consensus_test)(networkstatus_t *con, time_t now), - void (*rs_test)(routerstatus_t *rs, time_t now)) -{ - authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL; - crypto_pk_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL; - crypto_pk_t *sign_skey_leg1=NULL; - /* - * Sum the non-zero returns from vote_tweaks() we've seen; if vote_tweaks() - * returns non-zero, it changed net_params and we should skip the tests for - * that later as they will fail. - */ - int params_tweaked = 0; - - time_t now = time(NULL); - networkstatus_voter_info_t *voter; - document_signature_t *sig; - networkstatus_t *vote=NULL, *v1=NULL, *v2=NULL, *v3=NULL, *con=NULL, - *con_md=NULL; - vote_routerstatus_t *vrs; - routerstatus_t *rs; - int idx, n_rs, n_vrs; - char *consensus_text=NULL, *cp=NULL; - smartlist_t *votes = smartlist_new(); - - /* For generating the two other consensuses. */ - char *detached_text1=NULL, *detached_text2=NULL; - char *consensus_text2=NULL, *consensus_text3=NULL; - char *consensus_text_md2=NULL, *consensus_text_md3=NULL; - char *consensus_text_md=NULL; - networkstatus_t *con2=NULL, *con_md2=NULL, *con3=NULL, *con_md3=NULL; - ns_detached_signatures_t *dsig1=NULL, *dsig2=NULL; - - tt_assert(vrs_gen); - tt_assert(rs_test); - tt_assert(vrs_test); - - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - - /* Parse certificates and keys. */ - cert1 = mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - tt_assert(cert1); - cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); - tt_assert(cert2); - cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); - tt_assert(cert3); - sign_skey_1 = crypto_pk_new(); - sign_skey_2 = crypto_pk_new(); - sign_skey_3 = crypto_pk_new(); - sign_skey_leg1 = pk_generate(4); - dirvote_recalculate_timing(get_options(), now); - sr_state_init(0, 0); - - tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_1, - AUTHORITY_SIGNKEY_1, -1)); - tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_2, - AUTHORITY_SIGNKEY_2, -1)); - tt_assert(!crypto_pk_read_private_key_from_string(sign_skey_3, - AUTHORITY_SIGNKEY_3, -1)); - - tt_assert(!crypto_pk_cmp_keys(sign_skey_1, cert1->signing_key)); - tt_assert(!crypto_pk_cmp_keys(sign_skey_2, cert2->signing_key)); - - tt_assert(!dir_common_construct_vote_1(&vote, cert1, sign_skey_1, vrs_gen, - &v1, &n_vrs, now, 1)); - tt_assert(v1); - - /* Make sure the parsed thing was right. */ - tt_int_op(v1->type,OP_EQ, NS_TYPE_VOTE); - tt_int_op(v1->published,OP_EQ, vote->published); - tt_int_op(v1->valid_after,OP_EQ, vote->valid_after); - tt_int_op(v1->fresh_until,OP_EQ, vote->fresh_until); - tt_int_op(v1->valid_until,OP_EQ, vote->valid_until); - tt_int_op(v1->vote_seconds,OP_EQ, vote->vote_seconds); - tt_int_op(v1->dist_seconds,OP_EQ, vote->dist_seconds); - tt_str_op(v1->client_versions,OP_EQ, vote->client_versions); - tt_str_op(v1->server_versions,OP_EQ, vote->server_versions); - tt_assert(v1->voters && smartlist_len(v1->voters)); - voter = smartlist_get(v1->voters, 0); - tt_str_op(voter->nickname,OP_EQ, "Voter1"); - tt_str_op(voter->address,OP_EQ, "1.2.3.4"); - tt_int_op(voter->addr,OP_EQ, 0x01020304); - tt_int_op(voter->dir_port,OP_EQ, 80); - tt_int_op(voter->or_port,OP_EQ, 9000); - tt_str_op(voter->contact,OP_EQ, "voter@example.com"); - tt_assert(v1->cert); - tt_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key)); - cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL); - tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); - tor_free(cp); - tt_int_op(smartlist_len(v1->routerstatus_list),OP_EQ, n_vrs); - networkstatus_vote_free(vote); - vote = NULL; - - if (vote_tweaks) params_tweaked += vote_tweaks(v1, 1, now); - - /* Check the routerstatuses. */ - for (idx = 0; idx < n_vrs; ++idx) { - vrs = smartlist_get(v1->routerstatus_list, idx); - tt_assert(vrs); - vrs_test(vrs, 1, now); - } - - /* Generate second vote. It disagrees on some of the times, - * and doesn't list versions, and knows some crazy flags. - * Generate and parse v2. */ - tt_assert(!dir_common_construct_vote_2(&vote, cert2, sign_skey_2, vrs_gen, - &v2, &n_vrs, now, 1)); - tt_assert(v2); - - if (vote_tweaks) params_tweaked += vote_tweaks(v2, 2, now); - - /* Check that flags come out right.*/ - cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" - "Running:Stable:V2Dir:Valid"); - tor_free(cp); - - /* Check the routerstatuses. */ - n_vrs = smartlist_len(v2->routerstatus_list); - for (idx = 0; idx < n_vrs; ++idx) { - vrs = smartlist_get(v2->routerstatus_list, idx); - tt_assert(vrs); - vrs_test(vrs, 2, now); - } - networkstatus_vote_free(vote); - vote = NULL; - - /* Generate the third vote with a legacy id. */ - tt_assert(!dir_common_construct_vote_3(&vote, cert3, sign_skey_3, vrs_gen, - &v3, &n_vrs, now, 1)); - tt_assert(v3); - - if (vote_tweaks) params_tweaked += vote_tweaks(v3, 3, now); - - /* Compute a consensus as voter 3. */ - smartlist_add(votes, v3); - smartlist_add(votes, v1); - smartlist_add(votes, v2); - consensus_text = networkstatus_compute_consensus(votes, 3, - cert3->identity_key, - sign_skey_3, - "AAAAAAAAAAAAAAAAAAAA", - sign_skey_leg1, - FLAV_NS); - tt_assert(consensus_text); - con = networkstatus_parse_vote_from_string(consensus_text, NULL, - NS_TYPE_CONSENSUS); - tt_assert(con); - //log_notice(LD_GENERAL, "<<%s>>\n<<%s>>\n<<%s>>\n", - // v1_text, v2_text, v3_text); - consensus_text_md = networkstatus_compute_consensus(votes, 3, - cert3->identity_key, - sign_skey_3, - "AAAAAAAAAAAAAAAAAAAA", - sign_skey_leg1, - FLAV_MICRODESC); - tt_assert(consensus_text_md); - con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, - NS_TYPE_CONSENSUS); - tt_assert(con_md); - tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC); - - /* Check consensus contents. */ - tt_assert(con->type == NS_TYPE_CONSENSUS); - tt_int_op(con->published,OP_EQ, 0); /* this field only appears in votes. */ - tt_int_op(con->valid_after,OP_EQ, now+1000); - tt_int_op(con->fresh_until,OP_EQ, now+2003); /* median */ - tt_int_op(con->valid_until,OP_EQ, now+3000); - tt_int_op(con->vote_seconds,OP_EQ, 100); - tt_int_op(con->dist_seconds,OP_EQ, 250); /* median */ - tt_str_op(con->client_versions,OP_EQ, "0.1.2.14"); - tt_str_op(con->server_versions,OP_EQ, "0.1.2.15,0.1.2.16"); - cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" - "Running:Stable:V2Dir:Valid"); - tor_free(cp); - if (!params_tweaked) { - /* Skip this one if vote_tweaks() messed with the param lists */ - cp = smartlist_join_strings(con->net_params, ":", 0, NULL); - tt_str_op(cp,OP_EQ, "circuitwindow=80:foo=660"); - tor_free(cp); - } - - tt_int_op(4,OP_EQ, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ - /* The voter id digests should be in this order. */ - tt_assert(fast_memcmp(cert2->cache_info.identity_digest, - cert1->cache_info.identity_digest,DIGEST_LEN)<0); - tt_assert(fast_memcmp(cert1->cache_info.identity_digest, - cert3->cache_info.identity_digest,DIGEST_LEN)<0); - test_same_voter(smartlist_get(con->voters, 1), - smartlist_get(v2->voters, 0)); - test_same_voter(smartlist_get(con->voters, 2), - smartlist_get(v1->voters, 0)); - test_same_voter(smartlist_get(con->voters, 3), - smartlist_get(v3->voters, 0)); - - consensus_test(con, now); - - /* Check the routerstatuses. */ - n_rs = smartlist_len(con->routerstatus_list); - tt_assert(n_rs); - for (idx = 0; idx < n_rs; ++idx) { - rs = smartlist_get(con->routerstatus_list, idx); - tt_assert(rs); - rs_test(rs, now); - } - - n_rs = smartlist_len(con_md->routerstatus_list); - tt_assert(n_rs); - for (idx = 0; idx < n_rs; ++idx) { - rs = smartlist_get(con_md->routerstatus_list, idx); - tt_assert(rs); - } - - /* Check signatures. the first voter is a pseudo-entry with a legacy key. - * The second one hasn't signed. The fourth one has signed: validate it. */ - voter = smartlist_get(con->voters, 1); - tt_int_op(smartlist_len(voter->sigs),OP_EQ, 0); - - voter = smartlist_get(con->voters, 3); - tt_int_op(smartlist_len(voter->sigs),OP_EQ, 1); - sig = smartlist_get(voter->sigs, 0); - tt_assert(sig->signature); - tt_assert(!sig->good_signature); - tt_assert(!sig->bad_signature); - - tt_assert(!networkstatus_check_document_signature(con, sig, cert3)); - tt_assert(sig->signature); - tt_assert(sig->good_signature); - tt_assert(!sig->bad_signature); - - { - const char *msg=NULL; - /* Compute the other two signed consensuses. */ - smartlist_shuffle(votes); - consensus_text2 = networkstatus_compute_consensus(votes, 3, - cert2->identity_key, - sign_skey_2, NULL,NULL, - FLAV_NS); - consensus_text_md2 = networkstatus_compute_consensus(votes, 3, - cert2->identity_key, - sign_skey_2, NULL,NULL, - FLAV_MICRODESC); - smartlist_shuffle(votes); - consensus_text3 = networkstatus_compute_consensus(votes, 3, - cert1->identity_key, - sign_skey_1, NULL,NULL, - FLAV_NS); - consensus_text_md3 = networkstatus_compute_consensus(votes, 3, - cert1->identity_key, - sign_skey_1, NULL,NULL, - FLAV_MICRODESC); - tt_assert(consensus_text2); - tt_assert(consensus_text3); - tt_assert(consensus_text_md2); - tt_assert(consensus_text_md3); - con2 = networkstatus_parse_vote_from_string(consensus_text2, NULL, - NS_TYPE_CONSENSUS); - con3 = networkstatus_parse_vote_from_string(consensus_text3, NULL, - NS_TYPE_CONSENSUS); - con_md2 = networkstatus_parse_vote_from_string(consensus_text_md2, NULL, - NS_TYPE_CONSENSUS); - con_md3 = networkstatus_parse_vote_from_string(consensus_text_md3, NULL, - NS_TYPE_CONSENSUS); - tt_assert(con2); - tt_assert(con3); - tt_assert(con_md2); - tt_assert(con_md3); - - /* All three should have the same digest. */ - tt_mem_op(&con->digests,OP_EQ, &con2->digests, sizeof(common_digests_t)); - tt_mem_op(&con->digests,OP_EQ, &con3->digests, sizeof(common_digests_t)); - - tt_mem_op(&con_md->digests,OP_EQ, &con_md2->digests, - sizeof(common_digests_t)); - tt_mem_op(&con_md->digests,OP_EQ, &con_md3->digests, - sizeof(common_digests_t)); - - /* Extract a detached signature from con3. */ - detached_text1 = get_detached_sigs(con3, con_md3); - tt_assert(detached_text1); - /* Try to parse it. */ - dsig1 = networkstatus_parse_detached_signatures(detached_text1, NULL); - tt_assert(dsig1); - - /* Are parsed values as expected? */ - tt_int_op(dsig1->valid_after,OP_EQ, con3->valid_after); - tt_int_op(dsig1->fresh_until,OP_EQ, con3->fresh_until); - tt_int_op(dsig1->valid_until,OP_EQ, con3->valid_until); - { - common_digests_t *dsig_digests = strmap_get(dsig1->digests, "ns"); - tt_assert(dsig_digests); - tt_mem_op(dsig_digests->d[DIGEST_SHA1], OP_EQ, - con3->digests.d[DIGEST_SHA1], DIGEST_LEN); - dsig_digests = strmap_get(dsig1->digests, "microdesc"); - tt_assert(dsig_digests); - tt_mem_op(dsig_digests->d[DIGEST_SHA256],OP_EQ, - con_md3->digests.d[DIGEST_SHA256], - DIGEST256_LEN); - } - { - smartlist_t *dsig_signatures = strmap_get(dsig1->signatures, "ns"); - tt_assert(dsig_signatures); - tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); - sig = smartlist_get(dsig_signatures, 0); - tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, - DIGEST_LEN); - tt_int_op(sig->alg,OP_EQ, DIGEST_SHA1); - - dsig_signatures = strmap_get(dsig1->signatures, "microdesc"); - tt_assert(dsig_signatures); - tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); - sig = smartlist_get(dsig_signatures, 0); - tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, - DIGEST_LEN); - tt_int_op(sig->alg,OP_EQ, DIGEST_SHA256); - } - - /* Try adding it to con2. */ - detached_text2 = get_detached_sigs(con2,con_md2); - tt_int_op(1,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, - "test", LOG_INFO, &msg)); - tor_free(detached_text2); - tt_int_op(1,OP_EQ, - networkstatus_add_detached_signatures(con_md2, dsig1, "test", - LOG_INFO, &msg)); - tor_free(detached_text2); - detached_text2 = get_detached_sigs(con2,con_md2); - //printf("\n<%s>\n", detached_text2); - dsig2 = networkstatus_parse_detached_signatures(detached_text2, NULL); - tt_assert(dsig2); - /* - printf("\n"); - SMARTLIST_FOREACH(dsig2->signatures, networkstatus_voter_info_t *, vi, { - char hd[64]; - base16_encode(hd, sizeof(hd), vi->identity_digest, DIGEST_LEN); - printf("%s\n", hd); - }); - */ - tt_int_op(2,OP_EQ, - smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "ns"))); - tt_int_op(2,OP_EQ, - smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, - "microdesc"))); - - /* Try adding to con2 twice; verify that nothing changes. */ - tt_int_op(0,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, - "test", LOG_INFO, &msg)); - - /* Add to con. */ - tt_int_op(2,OP_EQ, networkstatus_add_detached_signatures(con, dsig2, - "test", LOG_INFO, &msg)); - /* Check signatures */ - voter = smartlist_get(con->voters, 1); - sig = smartlist_get(voter->sigs, 0); - tt_assert(sig); - tt_assert(!networkstatus_check_document_signature(con, sig, cert2)); - voter = smartlist_get(con->voters, 2); - sig = smartlist_get(voter->sigs, 0); - tt_assert(sig); - tt_assert(!networkstatus_check_document_signature(con, sig, cert1)); - } - - done: - tor_free(cp); - smartlist_free(votes); - tor_free(consensus_text); - tor_free(consensus_text_md); - - networkstatus_vote_free(vote); - networkstatus_vote_free(v1); - networkstatus_vote_free(v2); - networkstatus_vote_free(v3); - networkstatus_vote_free(con); - networkstatus_vote_free(con_md); - crypto_pk_free(sign_skey_1); - crypto_pk_free(sign_skey_2); - crypto_pk_free(sign_skey_3); - crypto_pk_free(sign_skey_leg1); - authority_cert_free(cert1); - authority_cert_free(cert2); - authority_cert_free(cert3); - - tor_free(consensus_text2); - tor_free(consensus_text3); - tor_free(consensus_text_md2); - tor_free(consensus_text_md3); - tor_free(detached_text1); - tor_free(detached_text2); - - networkstatus_vote_free(con2); - networkstatus_vote_free(con3); - networkstatus_vote_free(con_md2); - networkstatus_vote_free(con_md3); - ns_detached_signatures_free(dsig1); - ns_detached_signatures_free(dsig2); -} - -/** Run unit tests for generating and parsing V3 consensus networkstatus - * documents. */ -static void -test_dir_v3_networkstatus(void *arg) -{ - (void)arg; - test_a_networkstatus(dir_common_gen_routerstatus_for_v3ns, - vote_tweaks_for_v3ns, - test_vrs_for_v3ns, - test_consensus_for_v3ns, - test_routerstatus_for_v3ns); -} - -static void -test_dir_scale_bw(void *testdata) -{ - double v[8] = { 2.0/3, - 7.0, - 1.0, - 3.0, - 1.0/5, - 1.0/7, - 12.0, - 24.0 }; - double vals_dbl[8]; - uint64_t vals_u64[8]; - uint64_t total; - int i; - - (void) testdata; - - for (i=0; i<8; ++i) - vals_dbl[i] = v[i]; - - scale_array_elements_to_u64(vals_u64, vals_dbl, 8, &total); - - tt_int_op((int)total, OP_EQ, 48); - total = 0; - for (i=0; i<8; ++i) { - total += vals_u64[i]; - } - tt_assert(total >= (U64_LITERAL(1)<<60)); - tt_assert(total <= (U64_LITERAL(1)<<62)); - - for (i=0; i<8; ++i) { - /* vals[2].u64 is the scaled value of 1.0 */ - double ratio = ((double)vals_u64[i]) / vals_u64[2]; - tt_double_op(fabs(ratio - v[i]), OP_LT, .00001); - } - - /* test handling of no entries */ - total = 1; - scale_array_elements_to_u64(vals_u64, vals_dbl, 0, &total); - tt_assert(total == 0); - - /* make sure we don't read the array when we have no entries - * may require compiler flags to catch NULL dereferences */ - total = 1; - scale_array_elements_to_u64(NULL, NULL, 0, &total); - tt_assert(total == 0); - - scale_array_elements_to_u64(NULL, NULL, 0, NULL); - - /* test handling of zero totals */ - total = 1; - vals_dbl[0] = 0.0; - scale_array_elements_to_u64(vals_u64, vals_dbl, 1, &total); - tt_assert(total == 0); - tt_assert(vals_u64[0] == 0); - - vals_dbl[0] = 0.0; - vals_dbl[1] = 0.0; - scale_array_elements_to_u64(vals_u64, vals_dbl, 2, NULL); - tt_assert(vals_u64[0] == 0); - tt_assert(vals_u64[1] == 0); - - done: - ; -} - -static void -test_dir_random_weighted(void *testdata) -{ - int histogram[10]; - uint64_t vals[10] = {3,1,2,4,6,0,7,5,8,9}, total=0; - uint64_t inp_u64[10]; - int i, choice; - const int n = 50000; - double max_sq_error; - (void) testdata; - - /* Try a ten-element array with values from 0 through 10. The values are - * in a scrambled order to make sure we don't depend on order. */ - memset(histogram,0,sizeof(histogram)); - for (i=0; i<10; ++i) { - inp_u64[i] = vals[i]; - total += vals[i]; - } - tt_u64_op(total, OP_EQ, 45); - for (i=0; i max_sq_error) - max_sq_error = sq; - } - /* It should almost always be much much less than this. If you want to - * figure out the odds, please feel free. */ - tt_double_op(max_sq_error, OP_LT, .05); - - /* Now try a singleton; do we choose it? */ - for (i = 0; i < 100; ++i) { - choice = choose_array_element_by_weight(inp_u64, 1); - tt_int_op(choice, OP_EQ, 0); - } - - /* Now try an array of zeros. We should choose randomly. */ - memset(histogram,0,sizeof(histogram)); - for (i = 0; i < 5; ++i) - inp_u64[i] = 0; - for (i = 0; i < n; ++i) { - choice = choose_array_element_by_weight(inp_u64, 5); - tt_int_op(choice, OP_GE, 0); - tt_int_op(choice, OP_LT, 5); - histogram[choice]++; - } - /* Now see if we chose things about frequently enough. */ - max_sq_error = 0; - for (i=0; i<5; ++i) { - int expected = n/5; - double frac_diff = 0, sq; - TT_BLATHER((" %d : %5d vs %5d\n", (int)vals[i], histogram[i], expected)); - frac_diff = (histogram[i] - expected) / ((double)expected); - sq = frac_diff * frac_diff; - if (sq > max_sq_error) - max_sq_error = sq; - } - /* It should almost always be much much less than this. If you want to - * figure out the odds, please feel free. */ - tt_double_op(max_sq_error, OP_LT, .05); - done: - ; -} - -/* Function pointers for test_dir_clip_unmeasured_bw_kb() */ - -static uint32_t alternate_clip_bw = 0; - -/** - * Generate a routerstatus for clip_unmeasured_bw_kb test; based on the - * v3_networkstatus ones. - */ -static vote_routerstatus_t * -gen_routerstatus_for_umbw(int idx, time_t now) -{ - vote_routerstatus_t *vrs = NULL; - routerstatus_t *rs; - tor_addr_t addr_ipv6; - uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? - alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; - - switch (idx) { - case 0: - /* Generate the first routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.2.14"); - rs->published_on = now-1500; - strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); - memset(rs->identity_digest, 3, DIGEST_LEN); - memset(rs->descriptor_digest, 78, DIGEST_LEN); - rs->addr = 0x99008801; - rs->or_port = 443; - rs->dir_port = 8000; - /* all flags but running cleared */ - rs->is_flagged_running = 1; - /* - * This one has measured bandwidth below the clip cutoff, and - * so shouldn't be clipped; we'll have to test that it isn't - * later. - */ - vrs->has_measured_bw = 1; - rs->has_bandwidth = 1; - vrs->measured_bw_kb = rs->bandwidth_kb = max_unmeasured_bw_kb / 2; - break; - case 1: - /* Generate the second routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.2.0.5"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); - memset(rs->identity_digest, 5, DIGEST_LEN); - memset(rs->descriptor_digest, 77, DIGEST_LEN); - rs->addr = 0x99009901; - rs->or_port = 443; - rs->dir_port = 0; - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tor_addr_copy(&rs->ipv6_addr, &addr_ipv6); - rs->ipv6_orport = 4711; - rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = - rs->is_valid = rs->is_possible_guard = 1; - /* - * This one has measured bandwidth above the clip cutoff, and - * so shouldn't be clipped; we'll have to test that it isn't - * later. - */ - vrs->has_measured_bw = 1; - rs->has_bandwidth = 1; - vrs->measured_bw_kb = rs->bandwidth_kb = 2 * max_unmeasured_bw_kb; - break; - case 2: - /* Generate the third routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.0.3"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); - memset(rs->identity_digest, 0x33, DIGEST_LEN); - memset(rs->descriptor_digest, 79, DIGEST_LEN); - rs->addr = 0xAA009901; - rs->or_port = 400; - rs->dir_port = 9999; - rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_flagged_running = rs->is_valid = - rs->is_possible_guard = 1; - /* - * This one has unmeasured bandwidth above the clip cutoff, and - * so should be clipped; we'll have to test that it isn't - * later. - */ - vrs->has_measured_bw = 0; - rs->has_bandwidth = 1; - vrs->measured_bw_kb = 0; - rs->bandwidth_kb = 2 * max_unmeasured_bw_kb; - break; - case 3: - /* Generate a fourth routerstatus that is not running. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.6.3"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router4", sizeof(rs->nickname)); - memset(rs->identity_digest, 0x34, DIGEST_LEN); - memset(rs->descriptor_digest, 47, DIGEST_LEN); - rs->addr = 0xC0000203; - rs->or_port = 500; - rs->dir_port = 1999; - /* all flags but running cleared */ - rs->is_flagged_running = 1; - /* - * This one has unmeasured bandwidth below the clip cutoff, and - * so shouldn't be clipped; we'll have to test that it isn't - * later. - */ - vrs->has_measured_bw = 0; - rs->has_bandwidth = 1; - vrs->measured_bw_kb = 0; - rs->bandwidth_kb = max_unmeasured_bw_kb / 2; - break; - case 4: - /* No more for this test; return NULL */ - vrs = NULL; - break; - default: - /* Shouldn't happen */ - tt_abort(); - } - if (vrs) { - vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); - tor_asprintf(&vrs->microdesc->microdesc_hash_line, - "m 9,10,11,12,13,14,15,16,17 " - "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa%d\n", - idx); - } - - done: - return vrs; -} - -/** Apply tweaks to the vote list for each voter; for the umbw test this is - * just adding the right consensus methods to let clipping happen */ -static int -vote_tweaks_for_umbw(networkstatus_t *v, int voter, time_t now) -{ - char *maxbw_param = NULL; - int rv = 0; - - tt_assert(v); - (void)voter; - (void)now; - - tt_assert(v->supported_methods); - SMARTLIST_FOREACH(v->supported_methods, char *, c, tor_free(c)); - smartlist_clear(v->supported_methods); - /* Method 17 is MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB */ - smartlist_split_string(v->supported_methods, - "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17", - NULL, 0, -1); - /* If we're using a non-default clip bandwidth, add it to net_params */ - if (alternate_clip_bw > 0) { - tor_asprintf(&maxbw_param, "maxunmeasuredbw=%u", alternate_clip_bw); - tt_assert(maxbw_param); - if (maxbw_param) { - smartlist_add(v->net_params, maxbw_param); - rv = 1; - } - } - - done: - return rv; -} - -/** - * Test a parsed vote_routerstatus_t for umbw test. - */ -static void -test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) -{ - routerstatus_t *rs; - tor_addr_t addr_ipv6; - uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? - alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; - - (void)voter; - tt_assert(vrs); - rs = &(vrs->status); - tt_assert(rs); - - /* Split out by digests to test */ - if (tor_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN)) { - /* - * Check the first routerstatus - measured bandwidth below the clip - * cutoff. - */ - tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); - tt_int_op(rs->published_on,OP_EQ, now-1500); - tt_str_op(rs->nickname,OP_EQ, "router2"); - tt_mem_op(rs->identity_digest,OP_EQ, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_int_op(rs->addr,OP_EQ, 0x99008801); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 8000); - tt_assert(rs->has_bandwidth); - tt_assert(vrs->has_measured_bw); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); - tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb / 2); - } else if (tor_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN)) { - - /* - * Check the second routerstatus - measured bandwidth above the clip - * cutoff. - */ - tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); - tt_int_op(rs->published_on,OP_EQ, now-1000); - tt_str_op(rs->nickname,OP_EQ, "router1"); - tt_mem_op(rs->identity_digest,OP_EQ, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->addr,OP_EQ, 0x99009901); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 0); - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,OP_EQ, 4711); - tt_assert(rs->has_bandwidth); - tt_assert(vrs->has_measured_bw); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); - tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb * 2); - } else if (tor_memeq(rs->identity_digest, - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", - DIGEST_LEN)) { - /* - * Check the third routerstatus - unmeasured bandwidth above the clip - * cutoff; this one should be clipped later on in the consensus, but - * appears unclipped in the vote. - */ - tt_assert(rs->has_bandwidth); - tt_assert(!(vrs->has_measured_bw)); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); - tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); - } else if (tor_memeq(rs->identity_digest, - "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" - "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34", - DIGEST_LEN)) { - /* - * Check the fourth routerstatus - unmeasured bandwidth below the clip - * cutoff; this one should not be clipped. - */ - tt_assert(rs->has_bandwidth); - tt_assert(!(vrs->has_measured_bw)); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); - tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); - } else { - tt_abort(); - } - - done: - return; -} - -/** - * Test a consensus for v3_networkstatus_test - */ -static void -test_consensus_for_umbw(networkstatus_t *con, time_t now) -{ - (void)now; - - tt_assert(con); - tt_ptr_op(con->cert, OP_EQ, NULL); - // tt_assert(con->consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB); - tt_int_op(con->consensus_method, OP_GE, 16); - tt_int_op(4,OP_EQ, smartlist_len(con->routerstatus_list)); - /* There should be four listed routers; all voters saw the same in this */ - - done: - return; -} - -/** - * Test a router list entry for umbw test - */ -static void -test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) -{ - tor_addr_t addr_ipv6; - uint32_t max_unmeasured_bw_kb = (alternate_clip_bw > 0) ? - alternate_clip_bw : DEFAULT_MAX_UNMEASURED_BW_KB; - - tt_assert(rs); - - /* There should be four listed routers, as constructed above */ - if (tor_memeq(rs->identity_digest, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN)) { - tt_mem_op(rs->identity_digest,OP_EQ, - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" - "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", - DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_assert(!rs->is_authority); - tt_assert(!rs->is_exit); - tt_assert(!rs->is_fast); - tt_assert(!rs->is_possible_guard); - tt_assert(!rs->is_stable); - /* (If it wasn't running it wouldn't be here) */ - tt_assert(rs->is_flagged_running); - tt_assert(!rs->is_valid); - tt_assert(!rs->is_named); - /* This one should have measured bandwidth below the clip cutoff */ - tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); - tt_assert(!(rs->bw_is_unmeasured)); - } else if (tor_memeq(rs->identity_digest, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN)) { - /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ - tt_mem_op(rs->identity_digest,OP_EQ, - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" - "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", - DIGEST_LEN); - tt_str_op(rs->nickname,OP_EQ, "router1"); - tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->published_on,OP_EQ, now-1000); - tt_int_op(rs->addr,OP_EQ, 0x99009901); - tt_int_op(rs->or_port,OP_EQ, 443); - tt_int_op(rs->dir_port,OP_EQ, 0); - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,OP_EQ, 4711); - tt_assert(!rs->is_authority); - tt_assert(rs->is_exit); - tt_assert(rs->is_fast); - tt_assert(rs->is_possible_guard); - tt_assert(rs->is_stable); - tt_assert(rs->is_flagged_running); - tt_assert(rs->is_valid); - tt_assert(!rs->is_named); - /* This one should have measured bandwidth above the clip cutoff */ - tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); - tt_assert(!(rs->bw_is_unmeasured)); - } else if (tor_memeq(rs->identity_digest, - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" - "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", - DIGEST_LEN)) { - /* - * This one should have unmeasured bandwidth above the clip cutoff, - * and so should be clipped - */ - tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb); - tt_assert(rs->bw_is_unmeasured); - } else if (tor_memeq(rs->identity_digest, - "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" - "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34", - DIGEST_LEN)) { - /* - * This one should have unmeasured bandwidth below the clip cutoff, - * and so should not be clipped - */ - tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); - tt_assert(rs->bw_is_unmeasured); - } else { - /* Weren't expecting this... */ - tt_abort(); - } - - done: - return; -} - -/** - * Compute a consensus involving clipping unmeasured bandwidth with consensus - * method 17; this uses the same test_a_networkstatus() function that the - * v3_networkstatus test uses. - */ - -static void -test_dir_clip_unmeasured_bw_kb(void *arg) -{ - /* Run the test with the default clip bandwidth */ - (void)arg; - alternate_clip_bw = 0; - test_a_networkstatus(gen_routerstatus_for_umbw, - vote_tweaks_for_umbw, - test_vrs_for_umbw, - test_consensus_for_umbw, - test_routerstatus_for_umbw); -} - -/** - * This version of test_dir_clip_unmeasured_bw_kb() uses a non-default choice - * of clip bandwidth. - */ - -static void -test_dir_clip_unmeasured_bw_kb_alt(void *arg) -{ - /* - * Try a different one; this value is chosen so that the below-the-cutoff - * unmeasured nodes the test uses, at alternate_clip_bw / 2, will be above - * DEFAULT_MAX_UNMEASURED_BW_KB and if the consensus incorrectly uses that - * cutoff it will fail the test. - */ - (void)arg; - alternate_clip_bw = 3 * DEFAULT_MAX_UNMEASURED_BW_KB; - test_a_networkstatus(gen_routerstatus_for_umbw, - vote_tweaks_for_umbw, - test_vrs_for_umbw, - test_consensus_for_umbw, - test_routerstatus_for_umbw); -} - -static void -test_dir_fmt_control_ns(void *arg) -{ - char *s = NULL; - routerstatus_t rs; - (void)arg; - - memset(&rs, 0, sizeof(rs)); - rs.published_on = 1364925198; - strlcpy(rs.nickname, "TetsuoMilk", sizeof(rs.nickname)); - memcpy(rs.identity_digest, "Stately, plump Buck ", DIGEST_LEN); - memcpy(rs.descriptor_digest, "Mulligan came up fro", DIGEST_LEN); - rs.addr = 0x20304050; - rs.or_port = 9001; - rs.dir_port = 9002; - rs.is_exit = 1; - rs.is_fast = 1; - rs.is_flagged_running = 1; - rs.has_bandwidth = 1; - rs.is_v2_dir = 1; - rs.bandwidth_kb = 1000; - - s = networkstatus_getinfo_helper_single(&rs); - tt_assert(s); - tt_str_op(s, OP_EQ, - "r TetsuoMilk U3RhdGVseSwgcGx1bXAgQnVjayA " - "TXVsbGlnYW4gY2FtZSB1cCBmcm8 2013-04-02 17:53:18 " - "32.48.64.80 9001 9002\n" - "s Exit Fast Running V2Dir\n" - "w Bandwidth=1000\n"); - - done: - tor_free(s); -} - -static int mock_get_options_calls = 0; -static or_options_t *mock_options = NULL; - -static void -reset_options(or_options_t *options, int *get_options_calls) -{ - memset(options, 0, sizeof(or_options_t)); - options->TestingTorNetwork = 1; - - *get_options_calls = 0; -} - -static const or_options_t * -mock_get_options(void) -{ - ++mock_get_options_calls; - tor_assert(mock_options); - return mock_options; -} - -static void -reset_routerstatus(routerstatus_t *rs, - const char *hex_identity_digest, - uint32_t ipv4_addr) -{ - memset(rs, 0, sizeof(routerstatus_t)); - base16_decode(rs->identity_digest, sizeof(rs->identity_digest), - hex_identity_digest, HEX_DIGEST_LEN); - /* A zero address matches everything, so the address needs to be set. - * But the specific value is irrelevant. */ - rs->addr = ipv4_addr; -} - -#define ROUTER_A_ID_STR "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -#define ROUTER_A_IPV4 0xAA008801 -#define ROUTER_B_ID_STR "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" -#define ROUTER_B_IPV4 0xBB008801 - -#define ROUTERSET_ALL_STR "*" -#define ROUTERSET_A_STR ROUTER_A_ID_STR -#define ROUTERSET_NONE_STR "" - -/* - * Test that dirserv_set_routerstatus_testing sets router flags correctly - * Using "*" sets flags on A and B - * Using "A" sets flags on A - * Using "" sets flags on Neither - * If the router is not included: - * - if *Strict is set, the flag is set to 0, - * - otherwise, the flag is not modified. */ -static void -test_dir_dirserv_set_routerstatus_testing(void *arg) -{ - (void)arg; - - /* Init options */ - mock_options = tor_malloc(sizeof(or_options_t)); - reset_options(mock_options, &mock_get_options_calls); - - MOCK(get_options, mock_get_options); - - /* Init routersets */ - routerset_t *routerset_all = routerset_new(); - routerset_parse(routerset_all, ROUTERSET_ALL_STR, "All routers"); - - routerset_t *routerset_a = routerset_new(); - routerset_parse(routerset_a, ROUTERSET_A_STR, "Router A only"); - - routerset_t *routerset_none = routerset_new(); - /* Routersets are empty when provided by routerset_new(), - * so this is not strictly necessary */ - routerset_parse(routerset_none, ROUTERSET_NONE_STR, "No routers"); - - /* Init routerstatuses */ - routerstatus_t *rs_a = tor_malloc(sizeof(routerstatus_t)); - reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); - - routerstatus_t *rs_b = tor_malloc(sizeof(routerstatus_t)); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - /* Sanity check that routersets correspond to routerstatuses. - * Return values are {2, 3, 4} */ - - /* We want 3 ("*" means match all addresses) */ - tt_int_op(routerset_contains_routerstatus(routerset_all, rs_a, 0), OP_EQ, 3); - tt_int_op(routerset_contains_routerstatus(routerset_all, rs_b, 0), OP_EQ, 3); - - /* We want 4 (match id_digest [or nickname]) */ - tt_int_op(routerset_contains_routerstatus(routerset_a, rs_a, 0), OP_EQ, 4); - tt_int_op(routerset_contains_routerstatus(routerset_a, rs_b, 0), OP_EQ, 0); - - tt_int_op(routerset_contains_routerstatus(routerset_none, rs_a, 0), OP_EQ, - 0); - tt_int_op(routerset_contains_routerstatus(routerset_none, rs_b, 0), OP_EQ, - 0); - - /* Check that "*" sets flags on all routers: Exit - * Check the flags aren't being confused with each other */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_all; - mock_options->TestingDirAuthVoteExitIsStrict = 0; - - dirserv_set_routerstatus_testing(rs_a); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 2); - - tt_uint_op(rs_a->is_exit, OP_EQ, 1); - tt_uint_op(rs_b->is_exit, OP_EQ, 1); - /* Be paranoid - check no other flags are set */ - tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); - - /* Check that "*" sets flags on all routers: Guard & HSDir - * Cover the remaining flags in one test */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteGuard = routerset_all; - mock_options->TestingDirAuthVoteGuardIsStrict = 0; - mock_options->TestingDirAuthVoteHSDir = routerset_all; - mock_options->TestingDirAuthVoteHSDirIsStrict = 0; - - dirserv_set_routerstatus_testing(rs_a); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 2); - - tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); - tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); - /* Be paranoid - check exit isn't set */ - tt_uint_op(rs_a->is_exit, OP_EQ, 0); - tt_uint_op(rs_b->is_exit, OP_EQ, 0); - - /* Check routerset A sets all flags on router A, - * but leaves router B unmodified */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_a; - mock_options->TestingDirAuthVoteExitIsStrict = 0; - mock_options->TestingDirAuthVoteGuard = routerset_a; - mock_options->TestingDirAuthVoteGuardIsStrict = 0; - mock_options->TestingDirAuthVoteHSDir = routerset_a; - mock_options->TestingDirAuthVoteHSDirIsStrict = 0; - - dirserv_set_routerstatus_testing(rs_a); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 2); - - tt_uint_op(rs_a->is_exit, OP_EQ, 1); - tt_uint_op(rs_b->is_exit, OP_EQ, 0); - tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); - - /* Check routerset A unsets all flags on router B when Strict is set */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_a; - mock_options->TestingDirAuthVoteExitIsStrict = 1; - mock_options->TestingDirAuthVoteGuard = routerset_a; - mock_options->TestingDirAuthVoteGuardIsStrict = 1; - mock_options->TestingDirAuthVoteHSDir = routerset_a; - mock_options->TestingDirAuthVoteHSDirIsStrict = 1; - - rs_b->is_exit = 1; - rs_b->is_possible_guard = 1; - rs_b->is_hs_dir = 1; - - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - - tt_uint_op(rs_b->is_exit, OP_EQ, 0); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); - - /* Check routerset A doesn't modify flags on router B without Strict set */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_a; - mock_options->TestingDirAuthVoteExitIsStrict = 0; - mock_options->TestingDirAuthVoteGuard = routerset_a; - mock_options->TestingDirAuthVoteGuardIsStrict = 0; - mock_options->TestingDirAuthVoteHSDir = routerset_a; - mock_options->TestingDirAuthVoteHSDirIsStrict = 0; - - rs_b->is_exit = 1; - rs_b->is_possible_guard = 1; - rs_b->is_hs_dir = 1; - - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - - tt_uint_op(rs_b->is_exit, OP_EQ, 1); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); - - /* Check the empty routerset zeroes all flags - * on routers A & B with Strict set */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_none; - mock_options->TestingDirAuthVoteExitIsStrict = 1; - mock_options->TestingDirAuthVoteGuard = routerset_none; - mock_options->TestingDirAuthVoteGuardIsStrict = 1; - mock_options->TestingDirAuthVoteHSDir = routerset_none; - mock_options->TestingDirAuthVoteHSDirIsStrict = 1; - - rs_b->is_exit = 1; - rs_b->is_possible_guard = 1; - rs_b->is_hs_dir = 1; - - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - - tt_uint_op(rs_b->is_exit, OP_EQ, 0); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0); - - /* Check the empty routerset doesn't modify any flags - * on A or B without Strict set */ - reset_options(mock_options, &mock_get_options_calls); - reset_routerstatus(rs_a, ROUTER_A_ID_STR, ROUTER_A_IPV4); - reset_routerstatus(rs_b, ROUTER_B_ID_STR, ROUTER_B_IPV4); - - mock_options->TestingDirAuthVoteExit = routerset_none; - mock_options->TestingDirAuthVoteExitIsStrict = 0; - mock_options->TestingDirAuthVoteGuard = routerset_none; - mock_options->TestingDirAuthVoteGuardIsStrict = 0; - mock_options->TestingDirAuthVoteHSDir = routerset_none; - mock_options->TestingDirAuthVoteHSDirIsStrict = 0; - - rs_b->is_exit = 1; - rs_b->is_possible_guard = 1; - rs_b->is_hs_dir = 1; - - dirserv_set_routerstatus_testing(rs_a); - tt_int_op(mock_get_options_calls, OP_EQ, 1); - dirserv_set_routerstatus_testing(rs_b); - tt_int_op(mock_get_options_calls, OP_EQ, 2); - - tt_uint_op(rs_a->is_exit, OP_EQ, 0); - tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0); - tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0); - tt_uint_op(rs_b->is_exit, OP_EQ, 1); - tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1); - tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1); - - done: - tor_free(mock_options); - mock_options = NULL; - - UNMOCK(get_options); - - routerset_free(routerset_all); - routerset_free(routerset_a); - routerset_free(routerset_none); - - tor_free(rs_a); - tor_free(rs_b); -} - -static void -test_dir_http_handling(void *args) -{ - char *url = NULL; - (void)args; - - /* Parse http url tests: */ - /* Good headers */ - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1\r\n" - "Host: example.com\r\n" - "User-Agent: Mozilla/5.0 (Windows;" - " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),OP_EQ, 0); - tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); - tor_free(url); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),OP_EQ, 0); - tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); - tor_free(url); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url), - OP_EQ, 0); - tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); - tor_free(url); - - /* Should prepend '/tor/' to url if required */ - tt_int_op(parse_http_url("GET /a/b/c.txt HTTP/1.1\r\n" - "Host: example.com\r\n" - "User-Agent: Mozilla/5.0 (Windows;" - " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),OP_EQ, 0); - tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); - tor_free(url); - - /* Bad headers -- no HTTP/1.x*/ - tt_int_op(parse_http_url("GET /a/b/c.txt\r\n" - "Host: example.com\r\n" - "User-Agent: Mozilla/5.0 (Windows;" - " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - /* Bad headers */ - tt_int_op(parse_http_url("GET /a/b/c.txt\r\n" - "Host: example.com\r\n" - "User-Agent: Mozilla/5.0 (Windows;" - " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url), - OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),OP_EQ, -1); - tt_ptr_op(url, OP_EQ, NULL); - - done: - tor_free(url); -} - -static void -test_dir_purpose_needs_anonymity_returns_true_by_default(void *arg) -{ - (void)arg; - - tor_capture_bugs_(1); - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, 0, NULL)); - tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - expect_single_log_msg_containing("Called with dir_purpose=0"); - - tor_end_capture_bugs_(); - done: - tor_end_capture_bugs_(); - teardown_capture_of_logs(); -} - -static void -test_dir_purpose_needs_anonymity_returns_true_for_bridges(void *arg) -{ - (void)arg; - - tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, NULL)); - tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, - "foobar")); - tt_int_op(1, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2, - ROUTER_PURPOSE_BRIDGE, NULL)); - done: ; -} - -static void -test_dir_purpose_needs_anonymity_returns_false_for_own_bridge_desc(void *arg) -{ - (void)arg; - tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, - "authority.z")); - done: ; -} - -static void -test_dir_purpose_needs_anonymity_returns_true_for_sensitive_purpose(void *arg) -{ - (void)arg; - - tt_int_op(1, OP_EQ, purpose_needs_anonymity( - DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, NULL)); - tt_int_op(1, OP_EQ, purpose_needs_anonymity( - DIR_PURPOSE_UPLOAD_RENDDESC_V2, 0, NULL)); - tt_int_op(1, OP_EQ, purpose_needs_anonymity( - DIR_PURPOSE_FETCH_RENDDESC_V2, 0, NULL)); - done: ; -} - -static void -test_dir_purpose_needs_anonymity_ret_false_for_non_sensitive_conn(void *arg) -{ - (void)arg; - - tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_DIR, - ROUTER_PURPOSE_GENERAL, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_VOTE, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_SIGNATURES, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL)); - tt_int_op(0, OP_EQ, purpose_needs_anonymity( - DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_CONSENSUS, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_CERTIFICATE, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_EXTRAINFO, 0, NULL)); - tt_int_op(0, OP_EQ, - purpose_needs_anonymity(DIR_PURPOSE_FETCH_MICRODESC, 0, NULL)); - done: ; -} - -static void -test_dir_fetch_type(void *arg) -{ - (void)arg; - - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_EXTRAINFO, ROUTER_PURPOSE_BRIDGE, - NULL), OP_EQ, EXTRAINFO_DIRINFO | BRIDGE_DIRINFO); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_EXTRAINFO, ROUTER_PURPOSE_GENERAL, - NULL), OP_EQ, EXTRAINFO_DIRINFO | V3_DIRINFO); - - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE, - NULL), OP_EQ, BRIDGE_DIRINFO); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); - - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_STATUS_VOTE, - ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, - ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CERTIFICATE, - ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, V3_DIRINFO); - - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, - "microdesc"), OP_EQ, V3_DIRINFO|MICRODESC_DIRINFO); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, - NULL), OP_EQ, V3_DIRINFO); - - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_MICRODESC, ROUTER_PURPOSE_GENERAL, - NULL), OP_EQ, MICRODESC_DIRINFO); - - /* This will give a warning, because this function isn't supposed to be - * used for HS descriptors. */ - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(dir_fetch_type(DIR_PURPOSE_FETCH_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, NULL), OP_EQ, NO_DIRINFO); - expect_single_log_msg_containing("Unexpected purpose"); - done: - teardown_capture_of_logs(); -} - -static void -test_dir_packages(void *arg) -{ - smartlist_t *votes = smartlist_new(); - char *res = NULL; - (void)arg; - -#define BAD(s) \ - tt_int_op(0, OP_EQ, validate_recommended_package_line(s)); -#define GOOD(s) \ - tt_int_op(1, OP_EQ, validate_recommended_package_line(s)); - GOOD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " - "sha256=sssdlkfjdsklfjdskfljasdklfj"); - GOOD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " - "sha256=sssdlkfjdsklfjdskfljasdklfj blake2b=fred"); - BAD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " - "sha256=sssdlkfjdsklfjdskfljasdklfj="); - BAD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz " - "sha256=sssdlkfjdsklfjdskfljasdklfj blake2b"); - BAD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz "); - BAD("tor 0.2.6.3-alpha " - "http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz"); - BAD("tor 0.2.6.3-alpha "); - BAD("tor 0.2.6.3-alpha"); - BAD("tor "); - BAD("tor"); - BAD(""); - BAD("=foobar sha256=" - "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); - BAD("= = sha256=" - "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); - - BAD("sha512= sha256=" - "3c179f46ca77069a6a0bac70212a9b3b838b2f66129cb52d568837fc79d8fcc7"); - - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - smartlist_add(votes, tor_malloc_zero(sizeof(networkstatus_t))); - SMARTLIST_FOREACH(votes, networkstatus_t *, ns, - ns->package_lines = smartlist_new()); - -#define ADD(i, s) \ - smartlist_add(((networkstatus_t*)smartlist_get(votes, (i)))->package_lines, \ - (void*)(s)); - - /* Only one vote for this one. */ - ADD(4, "cisco 99z http://foobar.example.com/ sha256=blahblah"); - - /* Only two matching entries for this one, but 3 voters */ - ADD(1, "mystic 99y http://barfoo.example.com/ sha256=blahblah"); - ADD(3, "mystic 99y http://foobar.example.com/ sha256=blahblah"); - ADD(4, "mystic 99y http://foobar.example.com/ sha256=blahblah"); - - /* Only two matching entries for this one, but at least 4 voters */ - ADD(1, "mystic 99p http://barfoo.example.com/ sha256=ggggggg"); - ADD(3, "mystic 99p http://foobar.example.com/ sha256=blahblah"); - ADD(4, "mystic 99p http://foobar.example.com/ sha256=blahblah"); - ADD(5, "mystic 99p http://foobar.example.com/ sha256=ggggggg"); - - /* This one has only invalid votes. */ - ADD(0, "haffenreffer 1.2 http://foobar.example.com/ sha256"); - ADD(1, "haffenreffer 1.2 http://foobar.example.com/ "); - ADD(2, "haffenreffer 1.2 "); - ADD(3, "haffenreffer "); - ADD(4, "haffenreffer"); - - /* Three matching votes for this; it should actually go in! */ - ADD(2, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); - ADD(3, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); - ADD(4, "element 0.66.1 http://quux.example.com/ sha256=abcdef"); - ADD(1, "element 0.66.1 http://quum.example.com/ sha256=abcdef"); - ADD(0, "element 0.66.1 http://quux.example.com/ sha256=abcde"); - - /* Three votes for A, three votes for B */ - ADD(0, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); - ADD(1, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); - ADD(2, "clownshoes 22alpha1 http://quumble.example.com/ blake2=foob"); - ADD(3, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); - ADD(4, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); - ADD(5, "clownshoes 22alpha1 http://quumble.example.com/ blake2=fooz"); - - /* Three votes for A, two votes for B */ - ADD(1, "clownshoes 22alpha3 http://quumble.example.com/ blake2=foob"); - ADD(2, "clownshoes 22alpha3 http://quumble.example.com/ blake2=foob"); - ADD(3, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); - ADD(4, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); - ADD(5, "clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz"); - - /* Four votes for A, two for B. */ - ADD(0, "clownshoes 22alpha4 http://quumble.example.com/ blake2=foob"); - ADD(1, "clownshoes 22alpha4 http://quumble.example.com/ blake2=foob"); - ADD(2, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); - ADD(3, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); - ADD(4, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); - ADD(5, "clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa"); - - /* Five votes for A ... all from the same authority. Three for B. */ - ADD(0, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(1, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(3, "cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.1 http://example.com/ cubehash=ahooy"); - - /* As above but new replaces old: no two match. */ - ADD(0, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(1, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(1, "cbc 99.1.11.1.2 http://example.com/cbc/x cubehash=ahooy sha512=m"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/cbc/ cubehash=ahooy sha512=m"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); - ADD(2, "cbc 99.1.11.1.2 http://example.com/ cubehash=ahooy"); - - res = compute_consensus_package_lines(votes); - tt_assert(res); - tt_str_op(res, OP_EQ, - "package cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m\n" - "package clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz\n" - "package clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa\n" - "package element 0.66.1 http://quux.example.com/ sha256=abcdef\n" - "package mystic 99y http://foobar.example.com/ sha256=blahblah\n" - ); - -#undef ADD -#undef BAD -#undef GOOD - done: - SMARTLIST_FOREACH(votes, networkstatus_t *, ns, - { smartlist_free(ns->package_lines); tor_free(ns); }); - smartlist_free(votes); - tor_free(res); -} - -static void -test_dir_download_status_schedule(void *arg) -{ - (void)arg; - download_status_t dls_failure = { 0, 0, 0, DL_SCHED_GENERIC, - DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_FAILURE, - DL_SCHED_DETERMINISTIC, 0, 0 }; - download_status_t dls_attempt = { 0, 0, 0, DL_SCHED_CONSENSUS, - DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_ATTEMPT, - DL_SCHED_DETERMINISTIC, 0, 0 }; - download_status_t dls_bridge = { 0, 0, 0, DL_SCHED_BRIDGE, - DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_FAILURE, - DL_SCHED_DETERMINISTIC, 0, 0 }; - int increment = -1; - int expected_increment = -1; - time_t current_time = time(NULL); - int delay1 = -1; - int delay2 = -1; - smartlist_t *schedule = smartlist_new(); - - /* Make a dummy schedule */ - smartlist_add(schedule, (void *)&delay1); - smartlist_add(schedule, (void *)&delay2); - - /* check a range of values */ - delay1 = 1000; - increment = download_status_schedule_get_delay(&dls_failure, - schedule, - 0, INT_MAX, - TIME_MIN); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_failure.next_attempt_at == TIME_MIN + expected_increment); - - delay1 = INT_MAX; - increment = download_status_schedule_get_delay(&dls_failure, - schedule, - 0, INT_MAX, - -1); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_failure.next_attempt_at == TIME_MAX); - - delay1 = 0; - increment = download_status_schedule_get_delay(&dls_attempt, - schedule, - 0, INT_MAX, - 0); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_attempt.next_attempt_at == 0 + expected_increment); - - delay1 = 1000; - increment = download_status_schedule_get_delay(&dls_attempt, - schedule, - 0, INT_MAX, - 1); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_attempt.next_attempt_at == 1 + expected_increment); - - delay1 = INT_MAX; - increment = download_status_schedule_get_delay(&dls_bridge, - schedule, - 0, INT_MAX, - current_time); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_bridge.next_attempt_at == TIME_MAX); - - delay1 = 1; - increment = download_status_schedule_get_delay(&dls_bridge, - schedule, - 0, INT_MAX, - TIME_MAX); - expected_increment = delay1; - tt_assert(increment == expected_increment); - tt_assert(dls_bridge.next_attempt_at == TIME_MAX); - - /* see what happens when we reach the end */ - dls_attempt.n_download_attempts++; - dls_bridge.n_download_failures++; - - delay2 = 100; - increment = download_status_schedule_get_delay(&dls_attempt, - schedule, - 0, INT_MAX, - current_time); - expected_increment = delay2; - tt_assert(increment == expected_increment); - tt_assert(dls_attempt.next_attempt_at == current_time + delay2); - - delay2 = 1; - increment = download_status_schedule_get_delay(&dls_bridge, - schedule, - 0, INT_MAX, - current_time); - expected_increment = delay2; - tt_assert(increment == expected_increment); - tt_assert(dls_bridge.next_attempt_at == current_time + delay2); - - /* see what happens when we try to go off the end */ - dls_attempt.n_download_attempts++; - dls_bridge.n_download_failures++; - - delay2 = 5; - increment = download_status_schedule_get_delay(&dls_attempt, - schedule, - 0, INT_MAX, - current_time); - expected_increment = delay2; - tt_assert(increment == expected_increment); - tt_assert(dls_attempt.next_attempt_at == current_time + delay2); - - delay2 = 17; - increment = download_status_schedule_get_delay(&dls_bridge, - schedule, - 0, INT_MAX, - current_time); - expected_increment = delay2; - tt_assert(increment == expected_increment); - tt_assert(dls_bridge.next_attempt_at == current_time + delay2); - - /* see what happens when we reach IMPOSSIBLE_TO_DOWNLOAD */ - dls_attempt.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD; - dls_bridge.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; - - delay2 = 35; - increment = download_status_schedule_get_delay(&dls_attempt, - schedule, - 0, INT_MAX, - current_time); - expected_increment = INT_MAX; - tt_assert(increment == expected_increment); - tt_assert(dls_attempt.next_attempt_at == TIME_MAX); - - delay2 = 99; - increment = download_status_schedule_get_delay(&dls_bridge, - schedule, - 0, INT_MAX, - current_time); - expected_increment = INT_MAX; - tt_assert(increment == expected_increment); - tt_assert(dls_bridge.next_attempt_at == TIME_MAX); - - done: - /* the pointers in schedule are allocated on the stack */ - smartlist_free(schedule); -} - -static void -download_status_random_backoff_helper(int min_delay, int max_delay) -{ - download_status_t dls_random = - { 0, 0, 0, DL_SCHED_GENERIC, DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; - int increment = -1; - int old_increment = -1; - time_t current_time = time(NULL); - - /* Check the random backoff cases */ - int n_attempts = 0; - do { - increment = download_status_schedule_get_delay(&dls_random, - NULL, - min_delay, max_delay, - current_time); - - log_debug(LD_DIR, "Min: %d, Max: %d, Inc: %d, Old Inc: %d", - min_delay, max_delay, increment, old_increment); - - /* Regression test for 20534 and friends - * increment must always increase after the first */ - if (dls_random.last_backoff_position > 0 && max_delay > 0) { - /* Always increment the exponential backoff */ - tt_int_op(increment, OP_GE, 1); - } - - /* Test */ - tt_int_op(increment, OP_GE, min_delay); - tt_int_op(increment, OP_LE, max_delay); - - /* Advance */ - if (dls_random.n_download_attempts < IMPOSSIBLE_TO_DOWNLOAD - 1) { - ++(dls_random.n_download_attempts); - ++(dls_random.n_download_failures); - } - - /* Try another maybe */ - old_increment = increment; - } while (increment < max_delay && ++n_attempts < 1000); - - done: - return; -} - -static void -test_dir_download_status_random_backoff(void *arg) -{ - (void)arg; - - /* Do a standard test */ - download_status_random_backoff_helper(0, 1000000); - /* Regression test for 20534 and friends: - * try tighter bounds */ - download_status_random_backoff_helper(0, 100); - /* regression tests for 17750: initial delay */ - download_status_random_backoff_helper(10, 1000); - download_status_random_backoff_helper(20, 30); - - /* Pathological cases */ - download_status_random_backoff_helper(0, 0); - download_status_random_backoff_helper(1, 1); - download_status_random_backoff_helper(0, INT_MAX); - download_status_random_backoff_helper(INT_MAX/2, INT_MAX); -} - -static void -test_dir_download_status_random_backoff_ranges(void *arg) -{ - (void)arg; - int lo, hi; - next_random_exponential_delay_range(&lo, &hi, 0, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, 11); - - next_random_exponential_delay_range(&lo, &hi, 6, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, 6*3); - - next_random_exponential_delay_range(&lo, &hi, 13, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, 13 * 3); - - next_random_exponential_delay_range(&lo, &hi, 37, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, 111); - - next_random_exponential_delay_range(&lo, &hi, 123, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, 369); - - next_random_exponential_delay_range(&lo, &hi, INT_MAX-5, 10); - tt_int_op(lo, OP_EQ, 10); - tt_int_op(hi, OP_EQ, INT_MAX); - done: - ; -} - -static void -test_dir_download_status_increment(void *arg) -{ - (void)arg; - download_status_t dls_failure = { 0, 0, 0, DL_SCHED_GENERIC, - DL_WANT_AUTHORITY, - DL_SCHED_INCREMENT_FAILURE, - DL_SCHED_DETERMINISTIC, 0, 0 }; - download_status_t dls_attempt = { 0, 0, 0, DL_SCHED_BRIDGE, - DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_ATTEMPT, - DL_SCHED_DETERMINISTIC, 0, 0 }; - download_status_t dls_exp = { 0, 0, 0, DL_SCHED_GENERIC, - DL_WANT_ANY_DIRSERVER, - DL_SCHED_INCREMENT_ATTEMPT, - DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 }; - int no_delay = 0; - int delay0 = -1; - int delay1 = -1; - int delay2 = -1; - smartlist_t *schedule = smartlist_new(); - smartlist_t *schedule_no_initial_delay = smartlist_new(); - or_options_t test_options; - time_t next_at = TIME_MAX; - time_t current_time = time(NULL); - - /* Provide some values for the schedules */ - delay0 = 10; - delay1 = 99; - delay2 = 20; - - /* Make the schedules */ - smartlist_add(schedule, (void *)&delay0); - smartlist_add(schedule, (void *)&delay1); - smartlist_add(schedule, (void *)&delay2); - - smartlist_add(schedule_no_initial_delay, (void *)&no_delay); - smartlist_add(schedule_no_initial_delay, (void *)&delay1); - smartlist_add(schedule_no_initial_delay, (void *)&delay2); - - /* Put it in the options */ - mock_options = &test_options; - reset_options(mock_options, &mock_get_options_calls); - mock_options->TestingBridgeBootstrapDownloadSchedule = schedule; - mock_options->TestingClientDownloadSchedule = schedule; - - MOCK(get_options, mock_get_options); - - /* Check that the initial value of the schedule is the first value used, - * whether or not it was reset before being used */ - - /* regression test for 17750: no initial delay */ - mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay; - mock_get_options_calls = 0; - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_failure) - >= current_time + no_delay); - tt_assert(download_status_get_next_attempt_at(&dls_failure) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* regression test for 17750: initial delay */ - mock_options->TestingClientDownloadSchedule = schedule; - mock_get_options_calls = 0; - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_failure) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_failure) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* regression test for 17750: exponential, no initial delay */ - mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay; - mock_get_options_calls = 0; - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_exp) - >= current_time + no_delay); - tt_assert(download_status_get_next_attempt_at(&dls_exp) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* regression test for 17750: exponential, initial delay */ - mock_options->TestingClientDownloadSchedule = schedule; - mock_get_options_calls = 0; - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_exp) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_exp) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that a failure reset works */ - mock_get_options_calls = 0; - download_status_reset(&dls_failure); - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_failure) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_failure) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* avoid timing inconsistencies */ - dls_failure.next_attempt_at = current_time + delay0; - - /* check that a reset schedule becomes ready at the right time */ - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay0 - 1, 1), - OP_EQ, 0); - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay0, 1), - OP_EQ, 1); - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay0 + 1, 1), - OP_EQ, 1); - - /* Check that a failure increment works */ - mock_get_options_calls = 0; - next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, - current_time); - tt_assert(next_at == current_time + delay1); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 1); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 1); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* check that an incremented schedule becomes ready at the right time */ - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay1 - 1, 1), - OP_EQ, 0); - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay1, 1), - OP_EQ, 1); - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay1 + 1, 1), - OP_EQ, 1); - - /* check that a schedule isn't ready if it's had too many failures */ - tt_int_op(download_status_is_ready(&dls_failure, - current_time + delay1 + 10, 0), - OP_EQ, 0); - - /* Check that failure increments do happen on 503 for clients, and - * attempt increments do too. */ - mock_get_options_calls = 0; - next_at = download_status_increment_failure(&dls_failure, 503, "test", 0, - current_time); - tt_i64_op(next_at, OP_EQ, current_time + delay2); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 2); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 2); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that failure increments do happen on 503 for servers */ - mock_get_options_calls = 0; - next_at = download_status_increment_failure(&dls_failure, 503, "test", 1, - current_time); - tt_assert(next_at == current_time + delay2); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 3); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 3); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check what happens when we run off the end of the schedule */ - mock_get_options_calls = 0; - next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, - current_time); - tt_assert(next_at == current_time + delay2); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 4); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 4); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check what happens when we hit the failure limit */ - mock_get_options_calls = 0; - download_status_mark_impossible(&dls_failure); - next_at = download_status_increment_failure(&dls_failure, 404, "test", 0, - current_time); - tt_assert(next_at == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that a failure reset doesn't reset at the limit */ - mock_get_options_calls = 0; - download_status_reset(&dls_failure); - tt_assert(download_status_get_next_attempt_at(&dls_failure) - == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(mock_get_options_calls, OP_EQ, 0); - - /* Check that a failure reset resets just before the limit */ - mock_get_options_calls = 0; - dls_failure.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD - 1; - dls_failure.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD - 1; - download_status_reset(&dls_failure); - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_failure) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_failure) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that failure increments do happen on attempt-based schedules, - * but that the retry is set at the end of time */ - mock_options->UseBridges = 1; - mock_get_options_calls = 0; - next_at = download_status_increment_failure(&dls_attempt, 404, "test", 0, - current_time); - tt_assert(next_at == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 1); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that an attempt reset works */ - mock_get_options_calls = 0; - download_status_reset(&dls_attempt); - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_attempt) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_attempt) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* avoid timing inconsistencies */ - dls_attempt.next_attempt_at = current_time + delay0; - - /* check that a reset schedule becomes ready at the right time */ - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay0 - 1, 1), - OP_EQ, 0); - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay0, 1), - OP_EQ, 1); - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay0 + 1, 1), - OP_EQ, 1); - - /* Check that an attempt increment works */ - mock_get_options_calls = 0; - next_at = download_status_increment_attempt(&dls_attempt, "test", - current_time); - tt_assert(next_at == current_time + delay1); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 1); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* check that an incremented schedule becomes ready at the right time */ - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay1 - 1, 1), - OP_EQ, 0); - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay1, 1), - OP_EQ, 1); - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay1 + 1, 1), - OP_EQ, 1); - - /* check that a schedule isn't ready if it's had too many attempts */ - tt_int_op(download_status_is_ready(&dls_attempt, - current_time + delay1 + 10, 0), - OP_EQ, 0); - - /* Check what happens when we reach then run off the end of the schedule */ - mock_get_options_calls = 0; - next_at = download_status_increment_attempt(&dls_attempt, "test", - current_time); - tt_assert(next_at == current_time + delay2); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 2); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - mock_get_options_calls = 0; - next_at = download_status_increment_attempt(&dls_attempt, "test", - current_time); - tt_assert(next_at == current_time + delay2); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 3); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check what happens when we hit the attempt limit */ - mock_get_options_calls = 0; - download_status_mark_impossible(&dls_attempt); - next_at = download_status_increment_attempt(&dls_attempt, "test", - current_time); - tt_assert(next_at == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(mock_get_options_calls, OP_GE, 1); - - /* Check that an attempt reset doesn't reset at the limit */ - mock_get_options_calls = 0; - download_status_reset(&dls_attempt); - tt_assert(download_status_get_next_attempt_at(&dls_attempt) - == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, - IMPOSSIBLE_TO_DOWNLOAD); - tt_int_op(mock_get_options_calls, OP_EQ, 0); - - /* Check that an attempt reset resets just before the limit */ - mock_get_options_calls = 0; - dls_attempt.n_download_failures = IMPOSSIBLE_TO_DOWNLOAD - 1; - dls_attempt.n_download_attempts = IMPOSSIBLE_TO_DOWNLOAD - 1; - download_status_reset(&dls_attempt); - /* we really want to test that it's equal to time(NULL) + delay0, but that's - * an unrealiable test, because time(NULL) might change. */ - tt_assert(download_status_get_next_attempt_at(&dls_attempt) - >= current_time + delay0); - tt_assert(download_status_get_next_attempt_at(&dls_attempt) - != TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_GE, 1); - mock_options->UseBridges = 0; - - /* Check that attempt increments don't happen on failure-based schedules, - * and that the attempt is set at the end of time */ - mock_get_options_calls = 0; - setup_full_capture_of_logs(LOG_WARN); - next_at = download_status_increment_attempt(&dls_failure, "test", - current_time); - expect_single_log_msg_containing( - "Tried to launch an attempt-based connection on a failure-based " - "schedule."); - teardown_capture_of_logs(); - tt_assert(next_at == TIME_MAX); - tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0); - tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0); - tt_int_op(mock_get_options_calls, OP_EQ, 0); - - done: - /* the pointers in schedule are allocated on the stack */ - smartlist_free(schedule); - smartlist_free(schedule_no_initial_delay); - UNMOCK(get_options); - mock_options = NULL; - mock_get_options_calls = 0; - teardown_capture_of_logs(); -} - -static void -test_dir_authdir_type_to_string(void *data) -{ - (void)data; - char *res; - - tt_str_op(res = authdir_type_to_string(NO_DIRINFO), OP_EQ, - "[Not an authority]"); - tor_free(res); - - tt_str_op(res = authdir_type_to_string(EXTRAINFO_DIRINFO), OP_EQ, - "[Not an authority]"); - tor_free(res); - - tt_str_op(res = authdir_type_to_string(MICRODESC_DIRINFO), OP_EQ, - "[Not an authority]"); - tor_free(res); - - tt_str_op(res = authdir_type_to_string(V3_DIRINFO), OP_EQ, "V3"); - tor_free(res); - - tt_str_op(res = authdir_type_to_string(BRIDGE_DIRINFO), OP_EQ, "Bridge"); - tor_free(res); - - tt_str_op(res = authdir_type_to_string( - V3_DIRINFO | BRIDGE_DIRINFO | EXTRAINFO_DIRINFO), OP_EQ, - "V3, Bridge"); - done: - tor_free(res); -} - -static void -test_dir_conn_purpose_to_string(void *data) -{ - (void)data; - -#define EXPECT_CONN_PURPOSE(purpose, expected) \ - tt_str_op(dir_conn_purpose_to_string(purpose), OP_EQ, expected); - - EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_DIR, "server descriptor upload"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_VOTE, "server vote upload"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_SIGNATURES, - "consensus signature upload"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_SERVERDESC, "server descriptor fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_EXTRAINFO, "extra-info fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_CONSENSUS, - "consensus network-status fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_CERTIFICATE, "authority cert fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_STATUS_VOTE, "status vote fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, - "consensus signature fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_RENDDESC_V2, - "hidden-service v2 descriptor fetch"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_UPLOAD_RENDDESC_V2, - "hidden-service v2 descriptor upload"); - EXPECT_CONN_PURPOSE(DIR_PURPOSE_FETCH_MICRODESC, "microdescriptor fetch"); - - /* This will give a warning, because there is no purpose 1024. */ - setup_full_capture_of_logs(LOG_WARN); - EXPECT_CONN_PURPOSE(1024, "(unknown)"); - expect_single_log_msg_containing("Called with unknown purpose 1024"); - - done: - teardown_capture_of_logs(); -} - -NS_DECL(int, -public_server_mode, (const or_options_t *options)); - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - if (CALLED(public_server_mode)++ == 0) { - return 1; - } - - return 0; -} - -static void -test_dir_should_use_directory_guards(void *data) -{ - or_options_t *options; - char *errmsg = NULL; - (void)data; - - NS_MOCK(public_server_mode); - - options = options_new(); - options_init(options); - - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 1); - - options->UseEntryGuards = 1; - options->DownloadExtraInfo = 0; - options->FetchDirInfoEarly = 0; - options->FetchDirInfoExtraEarly = 0; - options->FetchUselessDescriptors = 0; - tt_int_op(should_use_directory_guards(options), OP_EQ, 1); - tt_int_op(CALLED(public_server_mode), OP_EQ, 2); - - options->UseEntryGuards = 0; - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 3); - options->UseEntryGuards = 1; - - options->DownloadExtraInfo = 1; - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 4); - options->DownloadExtraInfo = 0; - - options->FetchDirInfoEarly = 1; - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 5); - options->FetchDirInfoEarly = 0; - - options->FetchDirInfoExtraEarly = 1; - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 6); - options->FetchDirInfoExtraEarly = 0; - - options->FetchUselessDescriptors = 1; - tt_int_op(should_use_directory_guards(options), OP_EQ, 0); - tt_int_op(CALLED(public_server_mode), OP_EQ, 7); - options->FetchUselessDescriptors = 0; - - done: - NS_UNMOCK(public_server_mode); - or_options_free(options); - tor_free(errmsg); -} - -NS_DECL(void, -directory_initiate_request, (directory_request_t *req)); - -static void -test_dir_should_not_init_request_to_ourselves(void *data) -{ - char digest[DIGEST_LEN]; - dir_server_t *ourself = NULL; - crypto_pk_t *key = pk_generate(2); - (void) data; - - NS_MOCK(directory_initiate_request); - - clear_dir_servers(); - routerlist_free_all(); - - set_server_identity_key(key); - crypto_pk_get_digest(key, (char*) &digest); - ourself = trusted_dir_server_new("ourself", "127.0.0.1", 9059, 9060, - NULL, digest, - NULL, V3_DIRINFO, 1.0); - - tt_assert(ourself); - dir_server_add(ourself); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, - NULL); - - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); - - done: - NS_UNMOCK(directory_initiate_request); - clear_dir_servers(); - routerlist_free_all(); - crypto_pk_free(key); -} - -static void -test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) -{ - dir_server_t *ds = NULL; - dirinfo_type_t dirinfo_type = BRIDGE_DIRINFO | EXTRAINFO_DIRINFO \ - | MICRODESC_DIRINFO; - (void) data; - - NS_MOCK(directory_initiate_request); - - clear_dir_servers(); - routerlist_free_all(); - - ds = trusted_dir_server_new("ds", "10.0.0.1", 9059, 9060, NULL, - "12345678901234567890", NULL, dirinfo_type, 1.0); - tt_assert(ds); - dir_server_add(ds); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, - NULL); - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); - - done: - NS_UNMOCK(directory_initiate_request); - clear_dir_servers(); - routerlist_free_all(); -} - -static void -test_dir_should_init_request_to_dir_auths(void *data) -{ - dir_server_t *ds = NULL; - (void) data; - - NS_MOCK(directory_initiate_request); - - clear_dir_servers(); - routerlist_free_all(); - - ds = trusted_dir_server_new("ds", "10.0.0.1", 9059, 9060, NULL, - "12345678901234567890", NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 1); - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, - NULL); - tt_int_op(CALLED(directory_initiate_request), OP_EQ, 2); - - done: - NS_UNMOCK(directory_initiate_request); - clear_dir_servers(); - routerlist_free_all(); -} - -void -NS(directory_initiate_request)(directory_request_t *req) -{ - (void)req; - CALLED(directory_initiate_request)++; -} - -static void -test_dir_choose_compression_level(void* data) -{ - (void)data; - - /* It starts under_memory_pressure */ - tt_int_op(have_been_under_memory_pressure(), OP_EQ, 1); - - tt_assert(HIGH_COMPRESSION == choose_compression_level(-1)); - tt_assert(LOW_COMPRESSION == choose_compression_level(1024-1)); - tt_assert(MEDIUM_COMPRESSION == choose_compression_level(2048-1)); - tt_assert(HIGH_COMPRESSION == choose_compression_level(2048)); - - /* Reset under_memory_pressure timer */ - cell_queues_check_size(); - tt_int_op(have_been_under_memory_pressure(), OP_EQ, 0); - - tt_assert(HIGH_COMPRESSION == choose_compression_level(-1)); - tt_assert(HIGH_COMPRESSION == choose_compression_level(1024-1)); - tt_assert(HIGH_COMPRESSION == choose_compression_level(2048-1)); - tt_assert(HIGH_COMPRESSION == choose_compression_level(2048)); - - done: ; -} - -/* - * Mock check_private_dir(), and always succeed - no need to actually - * look at or create anything on the filesystem. - */ - -static int -mock_check_private_dir(const char *dirname, cpd_check_t check, - const char *effective_user) -{ - (void)dirname; - (void)check; - (void)effective_user; - - return 0; -} - -/* - * This really mocks options_get_datadir_fname2_suffix(), but for testing - * dump_desc(), we only care about get_datadir_fname(sub1), which is defined - * in config.h as: - * - * options_get_datadir_fname2_suffix(get_options(), sub1, NULL, NULL) - */ - -static char * -mock_get_datadir_fname(const or_options_t *options, - directory_root_t roottype, - const char *sub1, const char *sub2, - const char *suffix) -{ - (void) roottype; - char *rv = NULL; - - /* - * Assert we were called like get_datadir_fname2() or get_datadir_fname(), - * since that's all we implement here. - */ - tt_ptr_op(options, OP_NE, NULL); - tt_ptr_op(sub1, OP_NE, NULL); - /* - * No particular assertions about sub2, since we could be in the - * get_datadir_fname() or get_datadir_fname2() case. - */ - tt_ptr_op(suffix, OP_EQ, NULL); - - /* Just duplicate the basename and return it for this mock */ - if (sub2) { - /* If we have sub2, it's the basename, otherwise sub1 */ - rv = tor_strdup(sub2); - } else { - rv = tor_strdup(sub1); - } - - done: - return rv; -} - -static char *last_unlinked_path = NULL; -static int unlinked_count = 0; - -static void -mock_unlink_reset(void) -{ - tor_free(last_unlinked_path); - unlinked_count = 0; -} - -static int -mock_unlink(const char *path) -{ - tt_ptr_op(path, OP_NE, NULL); - - tor_free(last_unlinked_path); - last_unlinked_path = tor_strdup(path); - ++unlinked_count; - - done: - return 0; -} - -static char *last_write_str_path = NULL; -static uint8_t last_write_str_hash[DIGEST256_LEN]; -static int write_str_count = 0; - -static void -mock_write_str_to_file_reset(void) -{ - tor_free(last_write_str_path); - write_str_count = 0; -} - -static int -mock_write_str_to_file(const char *path, const char *str, int bin) -{ - size_t len; - uint8_t hash[DIGEST256_LEN]; - - (void)bin; - - tt_ptr_op(path, OP_NE, NULL); - tt_ptr_op(str, OP_NE, NULL); - - len = strlen(str); - crypto_digest256((char *)hash, str, len, DIGEST_SHA256); - - tor_free(last_write_str_path); - last_write_str_path = tor_strdup(path); - memcpy(last_write_str_hash, hash, sizeof(last_write_str_hash)); - ++write_str_count; - - done: - return 0; -} - -static void -test_dir_dump_unparseable_descriptors(void *data) -{ - /* - * These bogus descriptors look nothing at all like real bogus descriptors - * we might see, but we're only testing dump_desc() here, not the parser. - */ - const char *test_desc_type = "squamous"; - /* strlen(test_desc_1) = 583 bytes */ - const char *test_desc_1 = - "The most merciful thing in the world, I think, is the inability of the " - "human mind to correlate all its contents. We live on a placid island of" - " ignorance in the midst of black seas of infinity, and it was not meant" - " that we should voyage far. The sciences, each straining in its own dir" - "ection, have hitherto harmed us little; but some day the piecing togeth" - "er of dissociated knowledge will open up such terrifying vistas of real" - "ity, and of our frightful position therein, that we shall either go mad" - "from the revelation or flee from the light into the peace and safety of" - "a new dark age."; - uint8_t test_desc_1_hash[DIGEST256_LEN]; - char test_desc_1_hash_str[HEX_DIGEST256_LEN+1]; - /* strlen(test_desc_2) = 650 bytes */ - const char *test_desc_2 = - "I think their predominant colour was a greyish-green, though they had w" - "hite bellies. They were mostly shiny and slippery, but the ridges of th" - "eir backs were scaly. Their forms vaguely suggested the anthropoid, whi" - "le their heads were the heads of fish, with prodigious bulging eyes tha" - "t never closed. At the sides of their necks were palpitating gills, and" - "their long paws were webbed. They hopped irregularly, sometimes on two " - "legs and sometimes on four. I was somehow glad that they had no more th" - "an four limbs. Their croaking, baying voices, clearly wed tar articulat" - "e speech, held all the dark shades of expression which their staring fa" - "ces lacked."; - uint8_t test_desc_2_hash[DIGEST256_LEN]; - char test_desc_2_hash_str[HEX_DIGEST256_LEN+1]; - /* strlen(test_desc_3) = 700 bytes */ - const char *test_desc_3 = - "Without knowing what futurism is like, Johansen achieved something very" - "close to it when he spoke of the city; for instead of describing any de" - "finite structure or building, he dwells only on broad impressions of va" - "st angles and stone surfaces - surfaces too great to belong to anything" - "right or proper for this earth, and impious with horrible images and hi" - "eroglyphs. I mention his talk about angles because it suggests somethin" - "g Wilcox had told me of his awful dreams. He said that the geometry of " - "the dream-place he saw was abnormal, non-Euclidean, and loathsomely red" - "olent of spheres and dimensions apart from ours. Now an unlettered seam" - "an felt the same thing whilst gazing at the terrible reality."; - uint8_t test_desc_3_hash[DIGEST256_LEN]; - char test_desc_3_hash_str[HEX_DIGEST256_LEN+1]; - /* strlen(test_desc_3) = 604 bytes */ - const char *test_desc_4 = - "So we glanced back simultaneously, it would appear; though no doubt the" - "incipient motion of one prompted the imitation of the other. As we did " - "so we flashed both torches full strength at the momentarily thinned mis" - "t; either from sheer primitive anxiety to see all we could, or in a les" - "s primitive but equally unconscious effort to dazzle the entity before " - "we dimmed our light and dodged among the penguins of the labyrinth cent" - "er ahead. Unhappy act! Not Orpheus himself, or Lot's wife, paid much mo" - "re dearly for a backward glance. And again came that shocking, wide-ran" - "ged piping - \"Tekeli-li! Tekeli-li!\""; - uint8_t test_desc_4_hash[DIGEST256_LEN]; - char test_desc_4_hash_str[HEX_DIGEST256_LEN+1]; - (void)data; - - /* - * Set up options mock so we can force a tiny FIFO size and generate - * cleanups. - */ - mock_options = tor_malloc(sizeof(or_options_t)); - reset_options(mock_options, &mock_get_options_calls); - mock_options->MaxUnparseableDescSizeToLog = 1536; - MOCK(get_options, mock_get_options); - MOCK(check_private_dir, mock_check_private_dir); - MOCK(options_get_dir_fname2_suffix, - mock_get_datadir_fname); - - /* - * Set up unlink and write mocks - */ - MOCK(tor_unlink, mock_unlink); - mock_unlink_reset(); - MOCK(write_str_to_file, mock_write_str_to_file); - mock_write_str_to_file_reset(); - - /* - * Compute hashes we'll need to recognize which descriptor is which - */ - crypto_digest256((char *)test_desc_1_hash, test_desc_1, - strlen(test_desc_1), DIGEST_SHA256); - base16_encode(test_desc_1_hash_str, sizeof(test_desc_1_hash_str), - (const char *)test_desc_1_hash, - sizeof(test_desc_1_hash)); - crypto_digest256((char *)test_desc_2_hash, test_desc_2, - strlen(test_desc_2), DIGEST_SHA256); - base16_encode(test_desc_2_hash_str, sizeof(test_desc_2_hash_str), - (const char *)test_desc_2_hash, - sizeof(test_desc_2_hash)); - crypto_digest256((char *)test_desc_3_hash, test_desc_3, - strlen(test_desc_3), DIGEST_SHA256); - base16_encode(test_desc_3_hash_str, sizeof(test_desc_3_hash_str), - (const char *)test_desc_3_hash, - sizeof(test_desc_3_hash)); - crypto_digest256((char *)test_desc_4_hash, test_desc_4, - strlen(test_desc_4), DIGEST_SHA256); - base16_encode(test_desc_4_hash_str, sizeof(test_desc_4_hash_str), - (const char *)test_desc_4_hash, - sizeof(test_desc_4_hash)); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * (1) Fire off dump_desc() once; these descriptors should all be safely - * smaller than configured FIFO size. - */ - - dump_desc(test_desc_1, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (2) Fire off dump_desc() twice; this still should trigger no cleanup. - */ - - /* First time */ - dump_desc(test_desc_2, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_3, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_2) + strlen(test_desc_3)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (3) Three calls to dump_desc cause a FIFO cleanup - */ - - /* First time */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_1, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_4) + strlen(test_desc_1)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); - - /* Third time - we should unlink the dump of test_desc_4 here */ - dump_desc(test_desc_2, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_1) + strlen(test_desc_2)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 1); - tt_int_op(write_str_count, OP_EQ, 3); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (4) But repeating one (A B B) doesn't overflow and cleanup - */ - - /* First time */ - dump_desc(test_desc_3, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_3) + strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* Third time */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_3) + strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (5) Same for the (A B A) repetition - */ - - /* First time */ - dump_desc(test_desc_1, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_2, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_1) + strlen(test_desc_2)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); - - /* Third time */ - dump_desc(test_desc_1, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_1) + strlen(test_desc_2)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (6) (A B B C) triggering overflow on C causes A, not B to be unlinked - */ - - /* First time */ - dump_desc(test_desc_3, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_3) + strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* Third time */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_3) + strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* Fourth time - we should unlink the dump of test_desc_3 here */ - dump_desc(test_desc_1, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_4) + strlen(test_desc_1)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 1); - tt_int_op(write_str_count, OP_EQ, 3); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - /* - * (7) (A B A C) triggering overflow on C causes B, not A to be unlinked - */ - - /* First time */ - dump_desc(test_desc_2, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 1); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256); - - /* Second time */ - dump_desc(test_desc_3, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_2) + strlen(test_desc_3)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); - - /* Third time */ - dump_desc(test_desc_2, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_2) + strlen(test_desc_3)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 2); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256); - - /* Fourth time - we should unlink the dump of test_desc_3 here */ - dump_desc(test_desc_4, test_desc_type); - - /* - * Assert things about the FIFO state - */ - tt_u64_op(len_descs_dumped, OP_EQ, - strlen(test_desc_2) + strlen(test_desc_4)); - tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2); - - /* - * Assert things about the mocks - */ - tt_int_op(unlinked_count, OP_EQ, 1); - tt_int_op(write_str_count, OP_EQ, 3); - tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256); - - /* - * Reset the FIFO and check its state - */ - dump_desc_fifo_cleanup(); - tt_u64_op(len_descs_dumped, OP_EQ, 0); - tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - mock_write_str_to_file_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - tt_int_op(write_str_count, OP_EQ, 0); - - done: - - /* Clean up the fifo */ - dump_desc_fifo_cleanup(); - - /* Remove mocks */ - UNMOCK(tor_unlink); - mock_unlink_reset(); - UNMOCK(write_str_to_file); - mock_write_str_to_file_reset(); - UNMOCK(options_get_dir_fname2_suffix); - UNMOCK(check_private_dir); - UNMOCK(get_options); - tor_free(mock_options); - mock_options = NULL; - - return; -} - -/* Variables for reset_read_file_to_str_mock() */ - -static int enforce_expected_filename = 0; -static char *expected_filename = NULL; -static char *file_content = NULL; -static size_t file_content_len = 0; -static struct stat file_stat; -static int read_count = 0, read_call_count = 0; - -static void -reset_read_file_to_str_mock(void) -{ - tor_free(expected_filename); - tor_free(file_content); - file_content_len = 0; - memset(&file_stat, 0, sizeof(file_stat)); - read_count = 0; - read_call_count = 0; -} - -static char * -read_file_to_str_mock(const char *filename, int flags, - struct stat *stat_out) { - char *result = NULL; - - /* Insist we got a filename */ - tt_ptr_op(filename, OP_NE, NULL); - - /* We ignore flags */ - (void)flags; - - /* Bump the call count */ - ++read_call_count; - - if (enforce_expected_filename) { - tt_assert(expected_filename); - tt_str_op(filename, OP_EQ, expected_filename); - } - - if (expected_filename != NULL && - file_content != NULL && - strcmp(filename, expected_filename) == 0) { - /* You asked for it, you got it */ - - /* - * This is the same behavior as the real read_file_to_str(); - * if there's a NUL, the real size ends up in stat_out. - */ - result = tor_malloc(file_content_len + 1); - if (file_content_len > 0) { - memcpy(result, file_content, file_content_len); - } - result[file_content_len] = '\0'; - - /* Do we need to set up stat_out? */ - if (stat_out != NULL) { - memcpy(stat_out, &file_stat, sizeof(file_stat)); - /* We always return the correct length here */ - stat_out->st_size = file_content_len; - } - - /* Wooo, we have a return value - bump the counter */ - ++read_count; - } - /* else no match, return NULL */ - - done: - return result; -} - -/* This one tests dump_desc_populate_one_file() */ -static void -test_dir_populate_dump_desc_fifo(void *data) -{ - const char *dirname = "foo"; - const char *fname = NULL; - dumped_desc_t *ent; - - (void)data; - - /* - * Set up unlink and read_file_to_str mocks - */ - MOCK(tor_unlink, mock_unlink); - mock_unlink_reset(); - MOCK(read_file_to_str, read_file_to_str_mock); - reset_read_file_to_str_mock(); - - /* Check state of unlink mock */ - tt_int_op(unlinked_count, OP_EQ, 0); - - /* Some cases that should fail before trying to read the file */ - ent = dump_desc_populate_one_file(dirname, "bar"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 1); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - ent = dump_desc_populate_one_file(dirname, "unparseable-desc"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 2); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - ent = dump_desc_populate_one_file(dirname, "unparseable-desc.baz"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 3); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - ent = dump_desc_populate_one_file( - dirname, - "unparseable-desc.08AE85E90461F59E"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 4); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - ent = dump_desc_populate_one_file( - dirname, - "unparseable-desc.08AE85E90461F59EDF0981323F3A70D02B55AB54B44B04F" - "287D72F7B72F242E85C8CB0EDA8854A99"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 5); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - /* This is a correct-length digest but base16_decode() will fail */ - ent = dump_desc_populate_one_file( - dirname, - "unparseable-desc.68219B8BGE64B705A6FFC728C069DC596216D60A7D7520C" - "D5ECE250D912E686B"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 6); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 0); - - /* This one has a correctly formed filename and should try reading */ - - /* Read fails */ - ent = dump_desc_populate_one_file( - dirname, - "unparseable-desc.DF0981323F3A70D02B55AB54B44B04F287D72F7B72F242E" - "85C8CB0EDA8854A99"); - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 7); - tt_int_op(read_count, OP_EQ, 0); - tt_int_op(read_call_count, OP_EQ, 1); - - /* This read will succeed but the digest won't match the file content */ - fname = - "unparseable-desc." - "DF0981323F3A70D02B55AB54B44B04F287D72F7B72F242E85C8CB0EDA8854A99"; - enforce_expected_filename = 1; - tor_asprintf(&expected_filename, "%s%s%s", dirname, PATH_SEPARATOR, fname); - file_content = tor_strdup("hanc culpam maiorem an illam dicam?"); - file_content_len = strlen(file_content); - file_stat.st_mtime = 123456; - ent = dump_desc_populate_one_file(dirname, fname); - enforce_expected_filename = 0; - tt_ptr_op(ent, OP_EQ, NULL); - tt_int_op(unlinked_count, OP_EQ, 8); - tt_int_op(read_count, OP_EQ, 1); - tt_int_op(read_call_count, OP_EQ, 2); - tor_free(expected_filename); - tor_free(file_content); - - /* This one will match */ - fname = - "unparseable-desc." - "0786C7173447B7FB033FFCA2FC47C3CF71C30DD47CA8236D3FC7FF35853271C6"; - tor_asprintf(&expected_filename, "%s%s%s", dirname, PATH_SEPARATOR, fname); - file_content = tor_strdup("hanc culpam maiorem an illam dicam?"); - file_content_len = strlen(file_content); - file_stat.st_mtime = 789012; - ent = dump_desc_populate_one_file(dirname, fname); - tt_ptr_op(ent, OP_NE, NULL); - tt_int_op(unlinked_count, OP_EQ, 8); - tt_int_op(read_count, OP_EQ, 2); - tt_int_op(read_call_count, OP_EQ, 3); - tt_str_op(ent->filename, OP_EQ, expected_filename); - tt_int_op(ent->len, OP_EQ, file_content_len); - tt_int_op(ent->when, OP_EQ, file_stat.st_mtime); - tor_free(ent->filename); - tor_free(ent); - tor_free(expected_filename); - - /* - * Reset the mocks and check their state - */ - mock_unlink_reset(); - tt_int_op(unlinked_count, OP_EQ, 0); - reset_read_file_to_str_mock(); - tt_int_op(read_count, OP_EQ, 0); - - done: - - UNMOCK(tor_unlink); - mock_unlink_reset(); - UNMOCK(read_file_to_str); - reset_read_file_to_str_mock(); - - tor_free(file_content); - - return; -} - -static smartlist_t * -listdir_mock(const char *dname) -{ - smartlist_t *l; - - /* Ignore the name, always return this list */ - (void)dname; - - l = smartlist_new(); - smartlist_add_strdup(l, "foo"); - smartlist_add_strdup(l, "bar"); - smartlist_add_strdup(l, "baz"); - - return l; -} - -static dumped_desc_t * -pop_one_mock(const char *dirname, const char *f) -{ - dumped_desc_t *ent = NULL; - - if (dirname != NULL && strcmp(dirname, "d") == 0) { - if (f != NULL && strcmp(f, "foo") == 0) { - ent = tor_malloc_zero(sizeof(*ent)); - ent->filename = tor_strdup("d/foo"); - ent->len = 123; - ent->digest_sha256[0] = 1; - ent->when = 1024; - } else if (f != NULL && strcmp(f, "bar") == 0) { - ent = tor_malloc_zero(sizeof(*ent)); - ent->filename = tor_strdup("d/bar"); - ent->len = 456; - ent->digest_sha256[0] = 2; - /* - * Note that the timestamps are in a different order than - * listdir_mock() returns; we're testing the sort order. - */ - ent->when = 512; - } else if (f != NULL && strcmp(f, "baz") == 0) { - ent = tor_malloc_zero(sizeof(*ent)); - ent->filename = tor_strdup("d/baz"); - ent->len = 789; - ent->digest_sha256[0] = 3; - ent->when = 768; - } - } - - return ent; -} - -/* This one tests dump_desc_populate_fifo_from_directory() */ -static void -test_dir_populate_dump_desc_fifo_2(void *data) -{ - dumped_desc_t *ent = NULL; - - (void)data; - - /* Set up the mocks */ - MOCK(tor_listdir, listdir_mock); - MOCK(dump_desc_populate_one_file, pop_one_mock); - - /* Run dump_desc_populate_fifo_from_directory() */ - descs_dumped = NULL; - len_descs_dumped = 0; - dump_desc_populate_fifo_from_directory("d"); - tt_assert(descs_dumped != NULL); - tt_int_op(smartlist_len(descs_dumped), OP_EQ, 3); - tt_u64_op(len_descs_dumped, OP_EQ, 1368); - ent = smartlist_get(descs_dumped, 0); - tt_str_op(ent->filename, OP_EQ, "d/bar"); - tt_int_op(ent->len, OP_EQ, 456); - tt_int_op(ent->when, OP_EQ, 512); - ent = smartlist_get(descs_dumped, 1); - tt_str_op(ent->filename, OP_EQ, "d/baz"); - tt_int_op(ent->len, OP_EQ, 789); - tt_int_op(ent->when, OP_EQ, 768); - ent = smartlist_get(descs_dumped, 2); - tt_str_op(ent->filename, OP_EQ, "d/foo"); - tt_int_op(ent->len, OP_EQ, 123); - tt_int_op(ent->when, OP_EQ, 1024); - - done: - dump_desc_fifo_cleanup(); - - UNMOCK(dump_desc_populate_one_file); - UNMOCK(tor_listdir); - - return; -} - -static int mock_networkstatus_consensus_is_bootstrapping_value = 0; -static int -mock_networkstatus_consensus_is_bootstrapping(time_t now) -{ - (void)now; - return mock_networkstatus_consensus_is_bootstrapping_value; -} - -static int mock_networkstatus_consensus_can_use_extra_fallbacks_value = 0; -static int -mock_networkstatus_consensus_can_use_extra_fallbacks( - const or_options_t *options) -{ - (void)options; - return mock_networkstatus_consensus_can_use_extra_fallbacks_value; -} - -static int mock_num_bridges_usable_value = 0; -static int -mock_num_bridges_usable(int use_maybe_reachable) -{ - (void)use_maybe_reachable; - return mock_num_bridges_usable_value; -} - -/* data is a 3 character nul-terminated string. - * If data[0] is 'b', set bootstrapping, anything else means not bootstrapping - * If data[1] is 'f', set extra fallbacks, anything else means no extra - * If data[2] is 'f', set running bridges, anything else means no extra - * fallbacks. - */ -static void -test_dir_find_dl_schedule(void* data) -{ - const char *str = (const char *)data; - - tt_assert(strlen(data) == 3); - - if (str[0] == 'b') { - mock_networkstatus_consensus_is_bootstrapping_value = 1; - } else { - mock_networkstatus_consensus_is_bootstrapping_value = 0; - } - - if (str[1] == 'f') { - mock_networkstatus_consensus_can_use_extra_fallbacks_value = 1; - } else { - mock_networkstatus_consensus_can_use_extra_fallbacks_value = 0; - } - - if (str[2] == 'r') { - /* Any positive, non-zero value should work */ - mock_num_bridges_usable_value = 2; - } else { - mock_num_bridges_usable_value = 0; - } - - MOCK(networkstatus_consensus_is_bootstrapping, - mock_networkstatus_consensus_is_bootstrapping); - MOCK(networkstatus_consensus_can_use_extra_fallbacks, - mock_networkstatus_consensus_can_use_extra_fallbacks); - MOCK(num_bridges_usable, - mock_num_bridges_usable); - - download_status_t dls; - smartlist_t server, client, server_cons, client_cons; - smartlist_t client_boot_auth_only_cons, client_boot_auth_cons; - smartlist_t client_boot_fallback_cons, bridge, bridge_bootstrap; - - mock_options = tor_malloc(sizeof(or_options_t)); - reset_options(mock_options, &mock_get_options_calls); - MOCK(get_options, mock_get_options); - - mock_options->TestingServerDownloadSchedule = &server; - mock_options->TestingClientDownloadSchedule = &client; - mock_options->TestingServerConsensusDownloadSchedule = &server_cons; - mock_options->TestingClientConsensusDownloadSchedule = &client_cons; - mock_options->ClientBootstrapConsensusAuthorityOnlyDownloadSchedule = - &client_boot_auth_only_cons; - mock_options->ClientBootstrapConsensusAuthorityDownloadSchedule = - &client_boot_auth_cons; - mock_options->ClientBootstrapConsensusFallbackDownloadSchedule = - &client_boot_fallback_cons; - mock_options->TestingBridgeDownloadSchedule = &bridge; - mock_options->TestingBridgeBootstrapDownloadSchedule = &bridge_bootstrap; - - dls.schedule = DL_SCHED_GENERIC; - /* client */ - mock_options->ClientOnly = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &client); - mock_options->ClientOnly = 0; - - /* dir mode */ - mock_options->DirPort_set = 1; - mock_options->DirCache = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &server); - mock_options->DirPort_set = 0; - mock_options->DirCache = 0; - - dls.schedule = DL_SCHED_CONSENSUS; - /* public server mode */ - mock_options->ORPort_set = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &server_cons); - mock_options->ORPort_set = 0; - - /* client and bridge modes */ - if (networkstatus_consensus_is_bootstrapping(time(NULL))) { - if (networkstatus_consensus_can_use_extra_fallbacks(mock_options)) { - dls.want_authority = 1; - /* client */ - mock_options->ClientOnly = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_auth_cons); - mock_options->ClientOnly = 0; - - /* bridge relay */ - mock_options->ORPort_set = 1; - mock_options->BridgeRelay = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_auth_cons); - mock_options->ORPort_set = 0; - mock_options->BridgeRelay = 0; - - dls.want_authority = 0; - /* client */ - mock_options->ClientOnly = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_fallback_cons); - mock_options->ClientOnly = 0; - - /* bridge relay */ - mock_options->ORPort_set = 1; - mock_options->BridgeRelay = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_fallback_cons); - mock_options->ORPort_set = 0; - mock_options->BridgeRelay = 0; - - } else { - /* dls.want_authority is ignored */ - /* client */ - mock_options->ClientOnly = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_auth_only_cons); - mock_options->ClientOnly = 0; - - /* bridge relay */ - mock_options->ORPort_set = 1; - mock_options->BridgeRelay = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_boot_auth_only_cons); - mock_options->ORPort_set = 0; - mock_options->BridgeRelay = 0; - } - } else { - /* client */ - mock_options->ClientOnly = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_cons); - mock_options->ClientOnly = 0; - - /* bridge relay */ - mock_options->ORPort_set = 1; - mock_options->BridgeRelay = 1; - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, - &client_cons); - mock_options->ORPort_set = 0; - mock_options->BridgeRelay = 0; - } - - dls.schedule = DL_SCHED_BRIDGE; - /* client */ - mock_options->ClientOnly = 1; - mock_options->UseBridges = 1; - if (num_bridges_usable(0) > 0) { - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &bridge); - } else { - tt_ptr_op(find_dl_schedule(&dls, mock_options), OP_EQ, &bridge_bootstrap); - } - - done: - UNMOCK(networkstatus_consensus_is_bootstrapping); - UNMOCK(networkstatus_consensus_can_use_extra_fallbacks); - UNMOCK(num_bridges_usable); - UNMOCK(get_options); - tor_free(mock_options); - mock_options = NULL; -} - -static void -test_dir_assumed_flags(void *arg) -{ - (void)arg; - smartlist_t *tokens = smartlist_new(); - memarea_t *area = memarea_new(); - routerstatus_t *rs = NULL; - - /* First, we should always assume that the Running flag is set, even - * when it isn't listed, since the consensus method is always - * higher than 4. */ - const char *str1 = - "r example hereiswhereyouridentitygoes 2015-08-30 12:00:00 " - "192.168.0.1 9001 0\n" - "m thisoneislongerbecauseitisa256bitmddigest33\n" - "s Fast Guard Stable\n"; - - const char *cp = str1; - rs = routerstatus_parse_entry_from_string(area, &cp, tokens, NULL, NULL, - 23, FLAV_MICRODESC); - tt_assert(rs); - tt_assert(rs->is_flagged_running); - tt_assert(! rs->is_valid); - tt_assert(! rs->is_exit); - tt_assert(rs->is_fast); - routerstatus_free(rs); - - /* With method 24 or later, we can assume "valid" is set. */ - cp = str1; - rs = routerstatus_parse_entry_from_string(area, &cp, tokens, NULL, NULL, - 24, FLAV_MICRODESC); - tt_assert(rs); - tt_assert(rs->is_flagged_running); - tt_assert(rs->is_valid); - tt_assert(! rs->is_exit); - tt_assert(rs->is_fast); - - done: - smartlist_free(tokens); - memarea_drop_all(area); - routerstatus_free(rs); -} - -static void -test_dir_post_parsing(void *arg) -{ - (void) arg; - - /* Test the version parsing from an HS descriptor publish request. */ - { - const char *end; - const char *prefix = "/tor/hs/"; - int version = parse_hs_version_from_post("/tor/hs//publish", prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - version = parse_hs_version_from_post("/tor/hs/a/publish", prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - version = parse_hs_version_from_post("/tor/hs/3/publish", prefix, &end); - tt_int_op(version, OP_EQ, 3); - tt_str_op(end, OP_EQ, "/publish"); - version = parse_hs_version_from_post("/tor/hs/42/publish", prefix, &end); - tt_int_op(version, OP_EQ, 42); - tt_str_op(end, OP_EQ, "/publish"); - version = parse_hs_version_from_post("/tor/hs/18163/publish",prefix, &end); - tt_int_op(version, OP_EQ, 18163); - tt_str_op(end, OP_EQ, "/publish"); - version = parse_hs_version_from_post("JUNKJUNKJUNK", prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - version = parse_hs_version_from_post("/tor/hs/3/publish", "blah", &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - /* Missing the '/' at the end of the prefix. */ - version = parse_hs_version_from_post("/tor/hs/3/publish", "/tor/hs", &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - version = parse_hs_version_from_post("/random/blah/tor/hs/3/publish", - prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - version = parse_hs_version_from_post("/tor/hs/3/publish/random/junk", - prefix, &end); - tt_int_op(version, OP_EQ, 3); - tt_str_op(end, OP_EQ, "/publish/random/junk"); - version = parse_hs_version_from_post("/tor/hs/-1/publish", prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - /* INT_MAX */ - version = parse_hs_version_from_post("/tor/hs/2147483647/publish", - prefix, &end); - tt_int_op(version, OP_EQ, INT_MAX); - tt_str_op(end, OP_EQ, "/publish"); - /* INT_MAX + 1*/ - version = parse_hs_version_from_post("/tor/hs/2147483648/publish", - prefix, &end); - tt_int_op(version, OP_EQ, -1); - tt_ptr_op(end, OP_EQ, NULL); - } - - done: - ; -} - -static void -test_dir_platform_str(void *arg) -{ - char platform[256]; - (void)arg; - platform[0] = 0; - get_platform_str(platform, sizeof(platform)); - tt_int_op((int)strlen(platform), OP_GT, 0); - tt_assert(!strcmpstart(platform, "Tor ")); - - tor_version_t ver; - // make sure this is a tor version, a real actual tor version. - tt_int_op(tor_version_parse_platform(platform, &ver, 1), OP_EQ, 1); - - TT_BLATHER(("%d.%d.%d.%d", ver.major, ver.minor, ver.micro, ver.patchlevel)); - - // Handle an example version. - tt_int_op(tor_version_parse_platform( - "Tor 0.3.3.3 (foo) (git-xyzzy) on a potato", &ver, 1), OP_EQ, 1); - done: - ; -} - -static networkstatus_t *mock_networkstatus; - -static networkstatus_t * -mock_networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) -{ - (void)f; - return mock_networkstatus; -} - -static void -test_dir_networkstatus_consensus_has_ipv6(void *arg) -{ - (void)arg; - - int has_ipv6 = 0; - - /* Init options and networkstatus */ - or_options_t our_options; - mock_options = &our_options; - reset_options(mock_options, &mock_get_options_calls); - MOCK(get_options, mock_get_options); - - networkstatus_t our_networkstatus; - mock_networkstatus = &our_networkstatus; - memset(mock_networkstatus, 0, sizeof(*mock_networkstatus)); - MOCK(networkstatus_get_latest_consensus_by_flavor, - mock_networkstatus_get_latest_consensus_by_flavor); - - /* A live consensus */ - mock_networkstatus->valid_after = time(NULL) - 3600; - mock_networkstatus->valid_until = time(NULL) + 3600; - - /* Test the bounds for A lines in the NS consensus */ - mock_options->UseMicrodescriptors = 0; - - mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES + 1; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES + 20; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = MIN_METHOD_FOR_A_LINES - 1; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(!has_ipv6); - - /* Test the bounds for A lines in the microdesc consensus */ - mock_options->UseMicrodescriptors = 1; - - mock_networkstatus->consensus_method = - MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = - MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS + 1; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = - MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS + 20; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - mock_networkstatus->consensus_method = - MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS - 1; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(!has_ipv6); - - /* Test the edge cases */ - mock_options->UseMicrodescriptors = 1; - mock_networkstatus->consensus_method = - MIN_METHOD_FOR_A_LINES_IN_MICRODESC_CONSENSUS; - - /* Reasonably live */ - mock_networkstatus->valid_until = time(NULL) - 60; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(has_ipv6); - - /* Not reasonably live */ - mock_networkstatus->valid_after = time(NULL) - 24*60*60 - 3600; - mock_networkstatus->valid_until = time(NULL) - 24*60*60 - 60; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(!has_ipv6); - - /* NULL consensus */ - mock_networkstatus = NULL; - has_ipv6 = networkstatus_consensus_has_ipv6(get_options()); - tt_assert(!has_ipv6); - - done: - UNMOCK(get_options); - UNMOCK(networkstatus_get_latest_consensus_by_flavor); -} - -#define DIR_LEGACY(name) \ - { #name, test_dir_ ## name , TT_FORK, NULL, NULL } - -#define DIR(name,flags) \ - { #name, test_dir_##name, (flags), NULL, NULL } - -/* where arg is a string constant */ -#define DIR_ARG(name,flags,arg) \ - { #name "_" arg, test_dir_##name, (flags), &passthrough_setup, (void*) arg } - -struct testcase_t dir_tests[] = { - DIR_LEGACY(nicknames), - DIR_LEGACY(formats), - DIR(routerinfo_parsing, 0), - DIR(extrainfo_parsing, 0), - DIR(parse_router_list, TT_FORK), - DIR(load_routers, TT_FORK), - DIR(load_extrainfo, TT_FORK), - DIR(getinfo_extra, 0), - DIR_LEGACY(versions), - DIR_LEGACY(fp_pairs), - DIR(split_fps, 0), - DIR_LEGACY(measured_bw_kb), - DIR_LEGACY(measured_bw_kb_cache), - DIR_LEGACY(param_voting), - DIR(param_voting_lookup, 0), - DIR_LEGACY(v3_networkstatus), - DIR(random_weighted, 0), - DIR(scale_bw, 0), - DIR_LEGACY(clip_unmeasured_bw_kb), - DIR_LEGACY(clip_unmeasured_bw_kb_alt), - DIR(fmt_control_ns, 0), - DIR(dirserv_set_routerstatus_testing, 0), - DIR(http_handling, 0), - DIR(purpose_needs_anonymity_returns_true_for_bridges, 0), - DIR(purpose_needs_anonymity_returns_false_for_own_bridge_desc, 0), - DIR(purpose_needs_anonymity_returns_true_by_default, 0), - DIR(purpose_needs_anonymity_returns_true_for_sensitive_purpose, 0), - DIR(purpose_needs_anonymity_ret_false_for_non_sensitive_conn, 0), - DIR(post_parsing, 0), - DIR(fetch_type, 0), - DIR(packages, 0), - DIR(download_status_schedule, 0), - DIR(download_status_random_backoff, 0), - DIR(download_status_random_backoff_ranges, 0), - DIR(download_status_increment, TT_FORK), - DIR(authdir_type_to_string, 0), - DIR(conn_purpose_to_string, 0), - DIR(should_use_directory_guards, 0), - DIR(should_not_init_request_to_ourselves, TT_FORK), - DIR(should_not_init_request_to_dir_auths_without_v3_info, 0), - DIR(should_init_request_to_dir_auths, 0), - DIR(choose_compression_level, 0), - DIR(dump_unparseable_descriptors, 0), - DIR(populate_dump_desc_fifo, 0), - DIR(populate_dump_desc_fifo_2, 0), - DIR_ARG(find_dl_schedule, TT_FORK, "bfd"), - DIR_ARG(find_dl_schedule, TT_FORK, "bad"), - DIR_ARG(find_dl_schedule, TT_FORK, "cfd"), - DIR_ARG(find_dl_schedule, TT_FORK, "cad"), - DIR_ARG(find_dl_schedule, TT_FORK, "bfr"), - DIR_ARG(find_dl_schedule, TT_FORK, "bar"), - DIR_ARG(find_dl_schedule, TT_FORK, "cfr"), - DIR_ARG(find_dl_schedule, TT_FORK, "car"), - DIR(assumed_flags, 0), - DIR(networkstatus_compute_bw_weights_v10, 0), - DIR(platform_str, 0), - DIR(networkstatus_consensus_has_ipv6, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_dir_common.c b/src/tor/src/test/test_dir_common.c deleted file mode 100644 index fdf43533a..000000000 --- a/src/tor/src/test/test_dir_common.c +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define DIRVOTE_PRIVATE -#include "crypto.h" -#include "test.h" -#include "container.h" -#include "or.h" -#include "dirvote.h" -#include "nodelist.h" -#include "routerlist.h" -#include "test_dir_common.h" - -void dir_common_setup_vote(networkstatus_t **vote, time_t now); -networkstatus_t * dir_common_add_rs_and_parse(networkstatus_t *vote, - networkstatus_t **vote_out, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - crypto_pk_t *sign_skey, int *n_vrs, - time_t now, int clear_rl); - -/** Initialize and set auth certs and keys - * Returns 0 on success, -1 on failure. Clean up handled by caller. - */ -int -dir_common_authority_pk_init(authority_cert_t **cert1, - authority_cert_t **cert2, - authority_cert_t **cert3, - crypto_pk_t **sign_skey_1, - crypto_pk_t **sign_skey_2, - crypto_pk_t **sign_skey_3) -{ - /* Parse certificates and keys. */ - authority_cert_t *cert; - cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - tt_assert(cert); - tt_assert(cert->identity_key); - *cert1 = cert; - tt_assert(*cert1); - *cert2 = authority_cert_parse_from_string(AUTHORITY_CERT_2, NULL); - tt_assert(*cert2); - *cert3 = authority_cert_parse_from_string(AUTHORITY_CERT_3, NULL); - tt_assert(*cert3); - *sign_skey_1 = crypto_pk_new(); - *sign_skey_2 = crypto_pk_new(); - *sign_skey_3 = crypto_pk_new(); - - tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_1, - AUTHORITY_SIGNKEY_1, -1)); - tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_2, - AUTHORITY_SIGNKEY_2, -1)); - tt_assert(!crypto_pk_read_private_key_from_string(*sign_skey_3, - AUTHORITY_SIGNKEY_3, -1)); - - tt_assert(!crypto_pk_cmp_keys(*sign_skey_1, (*cert1)->signing_key)); - tt_assert(!crypto_pk_cmp_keys(*sign_skey_2, (*cert2)->signing_key)); - - return 0; - done: - return -1; -} - -/** - * Generate a routerstatus for v3_networkstatus test. - */ -vote_routerstatus_t * -dir_common_gen_routerstatus_for_v3ns(int idx, time_t now) -{ - vote_routerstatus_t *vrs=NULL; - routerstatus_t *rs = NULL; - tor_addr_t addr_ipv6; - char *method_list = NULL; - - switch (idx) { - case 0: - /* Generate the first routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.2.14"); - rs->published_on = now-1500; - strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); - memset(rs->identity_digest, TEST_DIR_ROUTER_ID_1, DIGEST_LEN); - memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_1, DIGEST_LEN); - rs->addr = 0x99008801; - rs->or_port = 443; - rs->dir_port = 8000; - /* all flags but running and v2dir cleared */ - rs->is_flagged_running = 1; - rs->is_v2_dir = 1; - rs->is_valid = 1; /* xxxxx */ - break; - case 1: - /* Generate the second routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.2.0.5"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router1", sizeof(rs->nickname)); - memset(rs->identity_digest, TEST_DIR_ROUTER_ID_2, DIGEST_LEN); - memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_2, DIGEST_LEN); - rs->addr = 0x99009901; - rs->or_port = 443; - rs->dir_port = 0; - tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); - tor_addr_copy(&rs->ipv6_addr, &addr_ipv6); - rs->ipv6_orport = 4711; - rs->is_exit = rs->is_stable = rs->is_fast = rs->is_flagged_running = - rs->is_valid = rs->is_possible_guard = rs->is_v2_dir = 1; - break; - case 2: - /* Generate the third routerstatus. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.0.3"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router3", sizeof(rs->nickname)); - memset(rs->identity_digest, TEST_DIR_ROUTER_ID_3, DIGEST_LEN); - memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_3, DIGEST_LEN); - rs->addr = 0xAA009901; - rs->or_port = 400; - rs->dir_port = 9999; - rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_flagged_running = rs->is_valid = rs->is_v2_dir = - rs->is_possible_guard = 1; - break; - case 3: - /* Generate a fourth routerstatus that is not running. */ - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - vrs->version = tor_strdup("0.1.6.3"); - rs->published_on = now-1000; - strlcpy(rs->nickname, "router4", sizeof(rs->nickname)); - memset(rs->identity_digest, TEST_DIR_ROUTER_ID_4, DIGEST_LEN); - memset(rs->descriptor_digest, TEST_DIR_ROUTER_DD_4, DIGEST_LEN); - rs->addr = 0xC0000203; - rs->or_port = 500; - rs->dir_port = 1999; - rs->is_v2_dir = 1; - /* Running flag (and others) cleared */ - break; - case 4: - /* No more for this test; return NULL */ - vrs = NULL; - break; - default: - /* Shouldn't happen */ - tt_abort(); - } - if (vrs) { - vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); - method_list = make_consensus_method_list(MIN_SUPPORTED_CONSENSUS_METHOD, - MAX_SUPPORTED_CONSENSUS_METHOD, - ","); - tor_asprintf(&vrs->microdesc->microdesc_hash_line, - "m %s " - "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa%d\n", - method_list, idx); - } - - done: - tor_free(method_list); - return vrs; -} - -/** Initialize networkstatus vote object attributes. */ -void -dir_common_setup_vote(networkstatus_t **vote, time_t now) -{ - *vote = tor_malloc_zero(sizeof(networkstatus_t)); - (*vote)->type = NS_TYPE_VOTE; - (*vote)->published = now; - (*vote)->supported_methods = smartlist_new(); - (*vote)->known_flags = smartlist_new(); - (*vote)->net_params = smartlist_new(); - (*vote)->routerstatus_list = smartlist_new(); - (*vote)->voters = smartlist_new(); -} - -/** Helper: Make a new routerinfo containing the right information for a - * given vote_routerstatus_t. */ -routerinfo_t * -dir_common_generate_ri_from_rs(const vote_routerstatus_t *vrs) -{ - routerinfo_t *r; - const routerstatus_t *rs = &vrs->status; - static time_t published = 0; - - r = tor_malloc_zero(sizeof(routerinfo_t)); - r->cert_expiration_time = TIME_MAX; - memcpy(r->cache_info.identity_digest, rs->identity_digest, DIGEST_LEN); - memcpy(r->cache_info.signed_descriptor_digest, rs->descriptor_digest, - DIGEST_LEN); - r->cache_info.do_not_cache = 1; - r->cache_info.routerlist_index = -1; - r->cache_info.signed_descriptor_body = - tor_strdup("123456789012345678901234567890123"); - r->cache_info.signed_descriptor_len = - strlen(r->cache_info.signed_descriptor_body); - r->exit_policy = smartlist_new(); - r->cache_info.published_on = ++published + time(NULL); - if (rs->has_bandwidth) { - /* - * Multiply by 1000 because the routerinfo_t and the routerstatus_t - * seem to use different units (*sigh*) and because we seem stuck on - * icky and perverse decimal kilobytes (*double sigh*) - see - * router_get_advertised_bandwidth_capped() of routerlist.c and - * routerstatus_format_entry() of dirserv.c. - */ - r->bandwidthrate = rs->bandwidth_kb * 1000; - r->bandwidthcapacity = rs->bandwidth_kb * 1000; - } - return r; -} - -/** Create routerstatuses and signed vote. - * Create routerstatuses using *vrs_gen* and add them to global routerlist. - * Next, create signed vote using *sign_skey* and *vote*, which should have - * predefined header fields. - * Setting *clear_rl* clears the global routerlist before adding the new - * routers. - * Return the signed vote, same as *vote_out*. Save the number of routers added - * in *n_vrs*. - */ -networkstatus_t * -dir_common_add_rs_and_parse(networkstatus_t *vote, networkstatus_t **vote_out, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - crypto_pk_t *sign_skey, int *n_vrs, time_t now, - int clear_rl) -{ - vote_routerstatus_t *vrs; - char *v_text=NULL; - const char *msg=NULL; - int idx; - was_router_added_t router_added = -1; - *vote_out = NULL; - - if (clear_rl) { - nodelist_free_all(); - routerlist_free_all(); - } - - idx = 0; - do { - vrs = vrs_gen(idx, now); - if (vrs) { - smartlist_add(vote->routerstatus_list, vrs); - router_added = - router_add_to_routerlist(dir_common_generate_ri_from_rs(vrs), - &msg,0,0); - tt_assert(router_added >= 0); - ++idx; - } - } while (vrs); - *n_vrs = idx; - - /* dump the vote and try to parse it. */ - v_text = format_networkstatus_vote(sign_skey, vote); - tt_assert(v_text); - *vote_out = networkstatus_parse_vote_from_string(v_text, NULL, NS_TYPE_VOTE); - - done: - if (v_text) - tor_free(v_text); - - return *vote_out; -} - -/** Create a fake *vote* where *cert* describes the signer, *sign_skey* - * is the signing key, and *vrs_gen* is the function we'll use to create the - * routers on which we're voting. - * We pass *vote_out*, *n_vrs*, and *clear_rl* directly to vrs_gen(). - * Return 0 on success, return -1 on failure. - */ -int -dir_common_construct_vote_1(networkstatus_t **vote, authority_cert_t *cert, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, - time_t now, int clear_rl) -{ - networkstatus_voter_info_t *voter; - - dir_common_setup_vote(vote, now); - (*vote)->valid_after = now+1000; - (*vote)->fresh_until = now+2000; - (*vote)->valid_until = now+3000; - (*vote)->vote_seconds = 100; - (*vote)->dist_seconds = 200; - smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1); - (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.15"); - (*vote)->server_versions = tor_strdup("0.1.2.14,0.1.2.15,0.1.2.16"); - smartlist_split_string((*vote)->known_flags, - "Authority Exit Fast Guard Running Stable V2Dir Valid", - 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - voter->nickname = tor_strdup("Voter1"); - voter->address = tor_strdup("1.2.3.4"); - voter->addr = 0x01020304; - voter->dir_port = 80; - voter->or_port = 9000; - voter->contact = tor_strdup("voter@example.com"); - crypto_pk_get_digest(cert->identity_key, voter->identity_digest); - /* - * Set up a vote; generate it; try to parse it. - */ - smartlist_add((*vote)->voters, voter); - (*vote)->cert = authority_cert_dup(cert); - smartlist_split_string((*vote)->net_params, "circuitwindow=101 foo=990", - NULL, 0, 0); - *n_vrs = 0; - /* add routerstatuses */ - if (!dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, - n_vrs, now, clear_rl)) - return -1; - - return 0; -} - -/** See dir_common_construct_vote_1. - * Produces a vote with slightly different values. - */ -int -dir_common_construct_vote_2(networkstatus_t **vote, authority_cert_t *cert, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, - time_t now, int clear_rl) -{ - networkstatus_voter_info_t *voter; - - dir_common_setup_vote(vote, now); - (*vote)->type = NS_TYPE_VOTE; - (*vote)->published += 1; - (*vote)->valid_after = now+1000; - (*vote)->fresh_until = now+3005; - (*vote)->valid_until = now+3000; - (*vote)->vote_seconds = 100; - (*vote)->dist_seconds = 300; - smartlist_split_string((*vote)->supported_methods, "1 2 3", NULL, 0, -1); - smartlist_split_string((*vote)->known_flags, - "Authority Exit Fast Guard MadeOfCheese MadeOfTin " - "Running Stable V2Dir Valid", 0, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - voter->nickname = tor_strdup("Voter2"); - voter->address = tor_strdup("2.3.4.5"); - voter->addr = 0x02030405; - voter->dir_port = 80; - voter->or_port = 9000; - voter->contact = tor_strdup("voter@example.com"); - crypto_pk_get_digest(cert->identity_key, voter->identity_digest); - /* - * Set up a vote; generate it; try to parse it. - */ - smartlist_add((*vote)->voters, voter); - (*vote)->cert = authority_cert_dup(cert); - if (! (*vote)->net_params) - (*vote)->net_params = smartlist_new(); - smartlist_split_string((*vote)->net_params, - "bar=2000000000 circuitwindow=20", - NULL, 0, 0); - /* add routerstatuses */ - /* dump the vote and try to parse it. */ - dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, - n_vrs, now, clear_rl); - - return 0; -} - -/** See dir_common_construct_vote_1. - * Produces a vote with slightly different values. Adds a legacy key. - */ -int -dir_common_construct_vote_3(networkstatus_t **vote, authority_cert_t *cert, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, - time_t now, int clear_rl) -{ - networkstatus_voter_info_t *voter; - - dir_common_setup_vote(vote, now); - (*vote)->valid_after = now+1000; - (*vote)->fresh_until = now+2003; - (*vote)->valid_until = now+3000; - (*vote)->vote_seconds = 100; - (*vote)->dist_seconds = 250; - smartlist_split_string((*vote)->supported_methods, "1 2 3 4", NULL, 0, -1); - (*vote)->client_versions = tor_strdup("0.1.2.14,0.1.2.17"); - (*vote)->server_versions = tor_strdup("0.1.2.10,0.1.2.15,0.1.2.16"); - smartlist_split_string((*vote)->known_flags, - "Authority Exit Fast Guard Running Stable V2Dir Valid", - 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - voter->nickname = tor_strdup("Voter2"); - voter->address = tor_strdup("3.4.5.6"); - voter->addr = 0x03040506; - voter->dir_port = 80; - voter->or_port = 9000; - voter->contact = tor_strdup("voter@example.com"); - crypto_pk_get_digest(cert->identity_key, voter->identity_digest); - memset(voter->legacy_id_digest, (int)'A', DIGEST_LEN); - /* - * Set up a vote; generate it; try to parse it. - */ - smartlist_add((*vote)->voters, voter); - (*vote)->cert = authority_cert_dup(cert); - smartlist_split_string((*vote)->net_params, "circuitwindow=80 foo=660", - NULL, 0, 0); - /* add routerstatuses */ - /* dump the vote and try to parse it. */ - dir_common_add_rs_and_parse(*vote, vote_out, vrs_gen, sign_skey, - n_vrs, now, clear_rl); - - return 0; -} - diff --git a/src/tor/src/test/test_dir_common.h b/src/tor/src/test/test_dir_common.h deleted file mode 100644 index 65b9cf643..000000000 --- a/src/tor/src/test/test_dir_common.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "networkstatus.h" -#include "routerparse.h" - -#define TEST_DIR_ROUTER_ID_1 3 -#define TEST_DIR_ROUTER_ID_2 5 -#define TEST_DIR_ROUTER_ID_3 33 -#define TEST_DIR_ROUTER_ID_4 34 - -#define TEST_DIR_ROUTER_DD_1 78 -#define TEST_DIR_ROUTER_DD_2 77 -#define TEST_DIR_ROUTER_DD_3 79 -#define TEST_DIR_ROUTER_DD_4 44 - -int dir_common_authority_pk_init(authority_cert_t **cert1, - authority_cert_t **cert2, - authority_cert_t **cert3, - crypto_pk_t **sign_skey_1, - crypto_pk_t **sign_skey_2, - crypto_pk_t **sign_skey_3); - -routerinfo_t * dir_common_generate_ri_from_rs(const vote_routerstatus_t *vrs); - -vote_routerstatus_t * dir_common_gen_routerstatus_for_v3ns(int idx, - time_t now); - -int dir_common_construct_vote_1(networkstatus_t **vote, - authority_cert_t *cert1, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, time_t now, - int clear_rl); - -int dir_common_construct_vote_2(networkstatus_t **vote, - authority_cert_t *cert2, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, time_t now, - int clear_rl); - -int dir_common_construct_vote_3(networkstatus_t **vote, - authority_cert_t *cert3, - crypto_pk_t *sign_skey, - vote_routerstatus_t * (*vrs_gen)(int idx, time_t now), - networkstatus_t **vote_out, int *n_vrs, time_t now, - int clear_rl); - diff --git a/src/tor/src/test/test_dir_handle_get.c b/src/tor/src/test/test_dir_handle_get.c deleted file mode 100644 index ca64dce5f..000000000 --- a/src/tor/src/test/test_dir_handle_get.c +++ /dev/null @@ -1,2634 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define RENDCOMMON_PRIVATE -#define GEOIP_PRIVATE -#define CONNECTION_PRIVATE -#define CONFIG_PRIVATE -#define RENDCACHE_PRIVATE - -#include "or.h" -#include "config.h" -#include "connection.h" -#include "consdiffmgr.h" -#include "directory.h" -#include "test.h" -#include "compress.h" -#include "connection.h" -#include "rendcommon.h" -#include "rendcache.h" -#include "router.h" -#include "routerlist.h" -#include "rend_test_helpers.h" -#include "microdesc.h" -#include "test_helpers.h" -#include "nodelist.h" -#include "entrynodes.h" -#include "routerparse.h" -#include "networkstatus.h" -#include "proto_http.h" -#include "geoip.h" -#include "dirserv.h" -#include "dirvote.h" -#include "log_test_helpers.h" - -#ifdef _WIN32 -/* For mkdir() */ -#include -#else -#include -#endif /* defined(_WIN32) */ - -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -DISABLE_GCC_WARNING(overlength-strings) -/* We allow huge string constants in the unit tests, but not in the code - * at large. */ -#endif -#include "vote_descriptors.inc" -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -ENABLE_GCC_WARNING(overlength-strings) -#endif - -#define NS_MODULE dir_handle_get - -#define NOT_FOUND "HTTP/1.0 404 Not found\r\n\r\n" -#define BAD_REQUEST "HTTP/1.0 400 Bad request\r\n\r\n" -#define SERVER_BUSY "HTTP/1.0 503 Directory busy, try again later\r\n\r\n" -#define TOO_OLD "HTTP/1.0 404 Consensus is too old\r\n\r\n" -#define NOT_ENOUGH_CONSENSUS_SIGNATURES "HTTP/1.0 404 " \ - "Consensus not signed by sufficient number of requested authorities\r\n\r\n" - -static dir_connection_t * -new_dir_conn(void) -{ - dir_connection_t *conn = dir_connection_new(AF_INET); - tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); - TO_CONN(conn)->address = tor_strdup("127.0.0.1"); - return conn; -} - -static void -test_dir_handle_get_bad_request(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(directory_handle_command_get(conn, "", NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(header, OP_EQ, BAD_REQUEST); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_v1_command_not_found(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - // no frontpage configured - tt_ptr_op(get_dirportfrontpage(), OP_EQ, NULL); - - /* V1 path */ - tt_int_op(directory_handle_command_get(conn, GET("/tor/"), NULL, 0), - OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static const char* -mock_get_dirportfrontpage(void) -{ - return "HELLO FROM FRONTPAGE"; -} - -static void -test_dir_handle_get_v1_command(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0, body_len = 0; - const char *exp_body = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - MOCK(get_dirportfrontpage, mock_get_dirportfrontpage); - - exp_body = get_dirportfrontpage(); - body_len = strlen(exp_body); - - conn = new_dir_conn(); - tt_int_op(directory_handle_command_get(conn, GET("/tor/"), NULL, 0), - OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, body_len+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/html\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 20\r\n")); - - tt_int_op(body_used, OP_EQ, strlen(body)); - tt_str_op(body, OP_EQ, exp_body); - - done: - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_dirportfrontpage); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); -} - -static void -test_dir_handle_get_not_found(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - /* Unrecognized path */ - tt_int_op(directory_handle_command_get(conn, GET("/anything"), NULL, 0), - OP_EQ, 0); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_robots_txt(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - tt_int_op(directory_handle_command_get(conn, GET("/tor/robots.txt"), - NULL, 0), OP_EQ, 0); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, 29, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 28\r\n")); - - tt_int_op(body_used, OP_EQ, strlen(body)); - tt_str_op(body, OP_EQ, "User-agent: *\r\nDisallow: /\r\n"); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); -} - -#define RENDEZVOUS2_GET(descid) GET("/tor/rendezvous2/" descid) -static void -test_dir_handle_get_rendezvous2_not_found_if_not_encrypted(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - // connection is not encrypted - tt_assert(!connection_dir_is_encrypted(conn)) - - tt_int_op(directory_handle_command_get(conn, RENDEZVOUS2_GET(), NULL, 0), - OP_EQ, 0); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_rendezvous2_on_encrypted_conn_with_invalid_desc_id( - void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - conn = new_dir_conn(); - - // connection is encrypted - TO_CONN(conn)->linked = 1; - tt_assert(connection_dir_is_encrypted(conn)); - - tt_int_op(directory_handle_command_get(conn, - RENDEZVOUS2_GET("invalid-desc-id"), NULL, 0), OP_EQ, 0); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(header, OP_EQ, BAD_REQUEST); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_rendezvous2_on_encrypted_conn_not_well_formed(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - conn = new_dir_conn(); - - // connection is encrypted - TO_CONN(conn)->linked = 1; - tt_assert(connection_dir_is_encrypted(conn)); - - //TODO: this cant be reached because rend_valid_descriptor_id() prevents this - //case to happen. This test is the same as - //test_dir_handle_get_rendezvous2_on_encrypted_conn_with_invalid_desc_id - //We should refactor to remove the case from the switch. - - const char *req = RENDEZVOUS2_GET("1bababababababababababababababab"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(header, OP_EQ, BAD_REQUEST); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_rendezvous2_not_found(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - conn = new_dir_conn(); - - rend_cache_init(); - - // connection is encrypted - TO_CONN(conn)->linked = 1; - tt_assert(connection_dir_is_encrypted(conn)); - - const char *req = RENDEZVOUS2_GET("3xqunszqnaolrrfmtzgaki7mxelgvkje"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - rend_cache_free_all(); -} - -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); - -static routerinfo_t *mock_routerinfo; - -static const routerinfo_t * -NS(router_get_my_routerinfo)(void) -{ - if (!mock_routerinfo) { - mock_routerinfo = tor_malloc_zero(sizeof(routerinfo_t)); - } - - return mock_routerinfo; -} - -static void -test_dir_handle_get_rendezvous2_on_encrypted_conn_success(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - char buff[30]; - char req[70]; - rend_encoded_v2_service_descriptor_t *desc_holder = NULL; - char *service_id = NULL; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - size_t body_len = 0; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - NS_MOCK(router_get_my_routerinfo); - - rend_cache_init(); - - /* create a valid rend service descriptor */ - #define RECENT_TIME -10 - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - - tt_int_op(rend_cache_store_v2_desc_as_dir(desc_holder->desc_str), - OP_EQ, 0); - - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - - conn = new_dir_conn(); - - // connection is encrypted - TO_CONN(conn)->linked = 1; - tt_assert(connection_dir_is_encrypted(conn)); - - tor_snprintf(req, sizeof(req), RENDEZVOUS2_GET("%s"), desc_id_base32); - - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - body_len = strlen(desc_holder->desc_str); - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, body_len+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Pragma: no-cache\r\n")); - tor_snprintf(buff, sizeof(buff), "Content-Length: %ld\r\n", (long) body_len); - tt_assert(strstr(header, buff)); - - tt_int_op(body_used, OP_EQ, strlen(body)); - tt_str_op(body, OP_EQ, desc_holder->desc_str); - - done: - UNMOCK(connection_write_to_buf_impl_); - NS_UNMOCK(router_get_my_routerinfo); - - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_cache_free_all(); -} - -#define MICRODESC_GET(digest) GET("/tor/micro/d/" digest) -static void -test_dir_handle_get_micro_d_not_found(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - #define B64_256_1 "8/Pz8/u7vz8/Pz+7vz8/Pz+7u/Pz8/P7u/Pz8/P7u78" - #define B64_256_2 "zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMw" - conn = new_dir_conn(); - - const char *req = MICRODESC_GET(B64_256_1 "-" B64_256_2); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static or_options_t *mock_options = NULL; -static void -init_mock_options(void) -{ - mock_options = tor_malloc(sizeof(or_options_t)); - memset(mock_options, 0, sizeof(or_options_t)); - mock_options->TestingTorNetwork = 1; - mock_options->DataDirectory = tor_strdup(get_fname_rnd("datadir_tmp")); - mock_options->CacheDirectory = tor_strdup(mock_options->DataDirectory); - check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL); -} - -static const or_options_t * -mock_get_options(void) -{ - tor_assert(mock_options); - return mock_options; -} - -static const char microdesc[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n" - "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n" - "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static void -test_dir_handle_get_micro_d(void *data) -{ - dir_connection_t *conn = NULL; - microdesc_cache_t *mc = NULL ; - smartlist_t *list = NULL; - char digest[DIGEST256_LEN]; - char digest_base64[128]; - char path[80]; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - (void) data; - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* SETUP */ - init_mock_options(); - - /* Add microdesc to cache */ - crypto_digest256(digest, microdesc, strlen(microdesc), DIGEST_SHA256); - base64_encode_nopad(digest_base64, sizeof(digest_base64), - (uint8_t *) digest, DIGEST256_LEN); - - mc = get_microdesc_cache(); - list = microdescs_add_to_cache(mc, microdesc, NULL, SAVED_NOWHERE, 0, - time(NULL), NULL); - tt_int_op(1, OP_EQ, smartlist_len(list)); - - /* Make the request */ - conn = new_dir_conn(); - - tor_snprintf(path, sizeof(path), MICRODESC_GET("%s"), digest_base64); - tt_int_op(directory_handle_command_get(conn, path, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(microdesc)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - - tt_int_op(body_used, OP_EQ, strlen(body)); - tt_str_op(body, OP_EQ, microdesc); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - smartlist_free(list); - microdesc_free_all(); -} - -static void -test_dir_handle_get_micro_d_server_busy(void *data) -{ - dir_connection_t *conn = NULL; - microdesc_cache_t *mc = NULL ; - smartlist_t *list = NULL; - char digest[DIGEST256_LEN]; - char digest_base64[128]; - char path[80]; - char *header = NULL; - (void) data; - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* SETUP */ - init_mock_options(); - - /* Add microdesc to cache */ - crypto_digest256(digest, microdesc, strlen(microdesc), DIGEST_SHA256); - base64_encode_nopad(digest_base64, sizeof(digest_base64), - (uint8_t *) digest, DIGEST256_LEN); - - mc = get_microdesc_cache(); - list = microdescs_add_to_cache(mc, microdesc, NULL, SAVED_NOWHERE, 0, - time(NULL), NULL); - tt_int_op(1, OP_EQ, smartlist_len(list)); - - //Make it busy - mock_options->CountPrivateBandwidth = 1; - - /* Make the request */ - conn = new_dir_conn(); - - tor_snprintf(path, sizeof(path), MICRODESC_GET("%s"), digest_base64); - tt_int_op(directory_handle_command_get(conn, path, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(SERVER_BUSY, OP_EQ, header); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - smartlist_free(list); - microdesc_free_all(); -} - -#define BRIDGES_PATH "/tor/networkstatus-bridges" -static void -test_dir_handle_get_networkstatus_bridges_not_found_without_auth(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* SETUP */ - init_mock_options(); - mock_options->BridgeAuthoritativeDir = 1; - mock_options->BridgePassword_AuthDigest_ = tor_strdup("digest"); - - conn = new_dir_conn(); - TO_CONN(conn)->linked = 1; - - const char *req = GET(BRIDGES_PATH); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_networkstatus_bridges(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* SETUP */ - init_mock_options(); - mock_options->BridgeAuthoritativeDir = 1; - mock_options->BridgePassword_AuthDigest_ = tor_malloc(DIGEST256_LEN); - crypto_digest256(mock_options->BridgePassword_AuthDigest_, - "abcdefghijklm12345", 18, DIGEST_SHA256); - - conn = new_dir_conn(); - TO_CONN(conn)->linked = 1; - - const char *req = "GET " BRIDGES_PATH " HTTP/1.0\r\n" - "Authorization: Basic abcdefghijklm12345\r\n\r\n"; - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 0\r\n")); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_networkstatus_bridges_not_found_wrong_auth(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* SETUP */ - init_mock_options(); - mock_options->BridgeAuthoritativeDir = 1; - mock_options->BridgePassword_AuthDigest_ = tor_malloc(DIGEST256_LEN); - crypto_digest256(mock_options->BridgePassword_AuthDigest_, - "abcdefghijklm12345", 18, DIGEST_SHA256); - - conn = new_dir_conn(); - TO_CONN(conn)->linked = 1; - - const char *req = "GET " BRIDGES_PATH " HTTP/1.0\r\n" - "Authorization: Basic NOTSAMEDIGEST\r\n\r\n"; - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -#define SERVER_DESC_GET(id) GET("/tor/server/" id) -static void -test_dir_handle_get_server_descriptors_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = SERVER_DESC_GET("invalid"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_str_op(NOT_FOUND, OP_EQ, header); - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - UNMOCK(connection_write_to_buf_impl_); - or_options_free(mock_options); mock_options = NULL; - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_server_descriptors_all(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - (void) data; - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - //TODO: change to router_get_my_extrainfo when testing "extra" path - NS_MOCK(router_get_my_routerinfo); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - // We are one of the routers - routerlist_t *our_routerlist = router_get_routerlist(); - tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); - mock_routerinfo = smartlist_get(our_routerlist->routers, 0); - set_server_identity_key(mock_routerinfo->identity_pkey); - mock_routerinfo->cache_info.published_on = time(NULL); - - /* Treat "all" requests as if they were unencrypted */ - mock_routerinfo->cache_info.send_unencrypted = 1; - - conn = new_dir_conn(); - - const char *req = SERVER_DESC_GET("all"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - //TODO: Is this a BUG? - //It requires strlen(signed_descriptor_len)+1 as body_len but returns a body - //which is smaller than that by annotation_len bytes - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, - 1024*1024, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - - //TODO: Is this a BUG? - //This is what should be expected: tt_int_op(body_used, OP_EQ, strlen(body)); - tt_int_op(body_used, OP_EQ, - mock_routerinfo->cache_info.signed_descriptor_len); - - tt_str_op(body, OP_EQ, mock_routerinfo->cache_info.signed_descriptor_body + - mock_routerinfo->cache_info.annotations_len); - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - NS_UNMOCK(router_get_my_routerinfo); - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - - routerlist_free_all(); - nodelist_free_all(); - entry_guards_free_all(); -} - -static char -TEST_DESCRIPTOR[] = -"@uploaded-at 2014-06-08 19:20:11\n" -"@source \"127.0.0.1\"\n" -"router test000a 127.0.0.1 5000 0 7000\n" -"platform Tor 0.2.5.3-alpha-dev on Linux\n" -"protocols Link 1 2 Circuit 1\n" -"published 2014-06-08 19:20:11\n" -"fingerprint C7E7 CCB8 179F 8CC3 7F5C 8A04 2B3A 180B 934B 14BA\n" -"uptime 0\n" -"bandwidth 1073741824 1073741824 0\n" -"extra-info-digest 67A152A4C7686FB07664F872620635F194D76D95\n" -"caches-extra-info\n" -"onion-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAOuBUIEBARMkkka/TGyaQNgUEDLP0KG7sy6KNQTNOlZHUresPr/vlVjo\n" -"HPpLMfu9M2z18c51YX/muWwY9x4MyQooD56wI4+AqXQcJRwQfQlPn3Ay82uZViA9\n" -"DpBajRieLlKKkl145KjArpD7F5BVsqccvjErgFYXvhhjSrx7BVLnAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBAN6NLnSxWQnFXxqZi5D3b0BMgV6y9NJLGjYQVP+eWtPZWgqyv4zeYsqv\n" -"O9y6c5lvxyUxmNHfoAbe/s8f2Vf3/YaC17asAVSln4ktrr3e9iY74a9RMWHv1Gzk\n" -"3042nMcqj3PEhRN0PoLkcOZNjjmNbaqki6qy9bWWZDNTdo+uI44dAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"hidden-service-dir\n" -"contact auth0@test.test\n" -"ntor-onion-key pK4bs08ERYN591jj7ca17Rn9Q02TIEfhnjR6hSq+fhU=\n" -"reject *:*\n" -"router-signature\n" -"-----BEGIN SIGNATURE-----\n" -"rx88DuM3Y7tODlHNDDEVzKpwh3csaG1or+T4l2Xs1oq3iHHyPEtB6QTLYrC60trG\n" -"aAPsj3DEowGfjga1b248g2dtic8Ab+0exfjMm1RHXfDam5TXXZU3A0wMyoHjqHuf\n" -"eChGPgFNUvEc+5YtD27qEDcUjcinYztTs7/dzxBT4PE=\n" -"-----END SIGNATURE-----\n"; - -static void -test_dir_handle_get_server_descriptors_authority(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - crypto_pk_t *identity_pkey = pk_generate(0); - (void) data; - - NS_MOCK(router_get_my_routerinfo); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* init mock */ - router_get_my_routerinfo(); - crypto_pk_get_digest(identity_pkey, - mock_routerinfo->cache_info.identity_digest); - - // the digest is mine (the channel is unnecrypted, so we must allow sending) - set_server_identity_key(identity_pkey); - mock_routerinfo->cache_info.send_unencrypted = 1; - - /* Setup descriptor */ - long annotation_len = strstr(TEST_DESCRIPTOR, "router ") - TEST_DESCRIPTOR; - mock_routerinfo->cache_info.signed_descriptor_body = - tor_strdup(TEST_DESCRIPTOR); - mock_routerinfo->cache_info.signed_descriptor_len = - strlen(TEST_DESCRIPTOR) - annotation_len; - mock_routerinfo->cache_info.annotations_len = annotation_len; - mock_routerinfo->cache_info.published_on = time(NULL); - - conn = new_dir_conn(); - - const char *req = SERVER_DESC_GET("authority"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - //TODO: Is this a BUG? - //It requires strlen(TEST_DESCRIPTOR)+1 as body_len but returns a body which - //is smaller than that by annotation_len bytes - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_DESCRIPTOR)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - - tt_int_op(body_used, OP_EQ, strlen(body)); - - tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - NS_UNMOCK(router_get_my_routerinfo); - UNMOCK(connection_write_to_buf_impl_); - tor_free(mock_routerinfo->cache_info.signed_descriptor_body); - tor_free(mock_routerinfo); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - crypto_pk_free(identity_pkey); -} - -static void -test_dir_handle_get_server_descriptors_fp(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - crypto_pk_t *identity_pkey = pk_generate(0); - (void) data; - - NS_MOCK(router_get_my_routerinfo); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* init mock */ - router_get_my_routerinfo(); - crypto_pk_get_digest(identity_pkey, - mock_routerinfo->cache_info.identity_digest); - - // the digest is mine (the channel is unnecrypted, so we must allow sending) - set_server_identity_key(identity_pkey); - mock_routerinfo->cache_info.send_unencrypted = 1; - - /* Setup descriptor */ - long annotation_len = strstr(TEST_DESCRIPTOR, "router ") - TEST_DESCRIPTOR; - mock_routerinfo->cache_info.signed_descriptor_body = - tor_strdup(TEST_DESCRIPTOR); - mock_routerinfo->cache_info.signed_descriptor_len = - strlen(TEST_DESCRIPTOR) - annotation_len; - mock_routerinfo->cache_info.annotations_len = annotation_len; - mock_routerinfo->cache_info.published_on = time(NULL); - - conn = new_dir_conn(); - - #define HEX1 "Fe0daff89127389bc67558691231234551193EEE" - #define HEX2 "Deadbeef99999991111119999911111111f00ba4" - const char *hex_digest = hex_str(mock_routerinfo->cache_info.identity_digest, - DIGEST_LEN); - - char req[155]; - tor_snprintf(req, sizeof(req), SERVER_DESC_GET("fp/%s+" HEX1 "+" HEX2), - hex_digest); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - //TODO: Is this a BUG? - //It requires strlen(TEST_DESCRIPTOR)+1 as body_len but returns a body which - //is smaller than that by annotation_len bytes - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_DESCRIPTOR)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - - tt_int_op(body_used, OP_EQ, strlen(body)); - - tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - NS_UNMOCK(router_get_my_routerinfo); - UNMOCK(connection_write_to_buf_impl_); - tor_free(mock_routerinfo->cache_info.signed_descriptor_body); - tor_free(mock_routerinfo); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - crypto_pk_free(identity_pkey); -} - -#define HEX1 "Fe0daff89127389bc67558691231234551193EEE" -#define HEX2 "Deadbeef99999991111119999911111111f00ba4" - -static void -test_dir_handle_get_server_descriptors_d(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - crypto_pk_t *identity_pkey = pk_generate(0); - (void) data; - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* Get one router's signed_descriptor_digest */ - routerlist_t *our_routerlist = router_get_routerlist(); - tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); - routerinfo_t *router = smartlist_get(our_routerlist->routers, 0); - const char *hex_digest = hex_str(router->cache_info.signed_descriptor_digest, - DIGEST_LEN); - - conn = new_dir_conn(); - - char req_header[155]; /* XXX Why 155? What kind of number is that?? */ - tor_snprintf(req_header, sizeof(req_header), - SERVER_DESC_GET("d/%s+" HEX1 "+" HEX2), hex_digest); - tt_int_op(directory_handle_command_get(conn, req_header, NULL, 0), OP_EQ, 0); - - //TODO: Is this a BUG? - //It requires strlen(signed_descriptor_len)+1 as body_len but returns a body - //which is smaller than that by annotation_len bytes - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, - router->cache_info.signed_descriptor_len+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - - //TODO: Is this a BUG? - //This is what should be expected: - //tt_int_op(body_used, OP_EQ, strlen(body)); - tt_int_op(body_used, OP_EQ, router->cache_info.signed_descriptor_len); - - tt_str_op(body, OP_EQ, router->cache_info.signed_descriptor_body + - router->cache_info.annotations_len); - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - UNMOCK(connection_write_to_buf_impl_); - tor_free(mock_routerinfo); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - crypto_pk_free(identity_pkey); - - routerlist_free_all(); - nodelist_free_all(); - entry_guards_free_all(); -} - -static void -test_dir_handle_get_server_descriptors_busy(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - crypto_pk_t *identity_pkey = pk_generate(0); - (void) data; - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - //Make it busy - MOCK(get_options, mock_get_options); - init_mock_options(); - mock_options->CountPrivateBandwidth = 1; - - /* Get one router's signed_descriptor_digest */ - routerlist_t *our_routerlist = router_get_routerlist(); - tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); - routerinfo_t *router = smartlist_get(our_routerlist->routers, 0); - const char *hex_digest = hex_str(router->cache_info.signed_descriptor_digest, - DIGEST_LEN); - - conn = new_dir_conn(); - - #define HEX1 "Fe0daff89127389bc67558691231234551193EEE" - #define HEX2 "Deadbeef99999991111119999911111111f00ba4" - char req_header[155]; /* XXX 155? Why 155? */ - tor_snprintf(req_header, sizeof(req_header), - SERVER_DESC_GET("d/%s+" HEX1 "+" HEX2), hex_digest); - tt_int_op(directory_handle_command_get(conn, req_header, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(SERVER_BUSY, OP_EQ, header); - - tt_ptr_op(conn->spool, OP_EQ, NULL); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - tor_free(mock_routerinfo); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - crypto_pk_free(identity_pkey); - - routerlist_free_all(); - nodelist_free_all(); - entry_guards_free_all(); -} - -static void -test_dir_handle_get_server_keys_bad_req(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(BAD_REQUEST, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_server_keys_all_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/all"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -#define TEST_CERTIFICATE AUTHORITY_CERT_3 -#define TEST_SIGNING_KEY AUTHORITY_SIGNKEY_A_DIGEST - -static const char TEST_CERT_IDENT_KEY[] = - "D867ACF56A9D229B35C25F0090BC9867E906BE69"; - -static void -test_dir_handle_get_server_keys_all(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - const char digest[DIGEST_LEN] = ""; - - dir_server_t *ds = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - clear_dir_servers(); - routerlist_free_all(); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/all"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 1883\r\n")); - - tt_str_op(TEST_CERTIFICATE, OP_EQ, body); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - - clear_dir_servers(); - routerlist_free_all(); -} - -static void -test_dir_handle_get_server_keys_authority_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/authority"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static authority_cert_t * mock_cert = NULL; - -static authority_cert_t * -get_my_v3_authority_cert_m(void) -{ - tor_assert(mock_cert); - return mock_cert; -} - -static void -test_dir_handle_get_server_keys_authority(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - (void) data; - - mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); - - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/authority"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 1883\r\n")); - - tt_str_op(TEST_CERTIFICATE, OP_EQ, body); - - done: - UNMOCK(get_my_v3_authority_cert); - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - authority_cert_free(mock_cert); mock_cert = NULL; -} - -static void -test_dir_handle_get_server_keys_fp_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/fp/somehex"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_server_keys_fp(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - dir_server_t *ds = NULL; - const char digest[DIGEST_LEN] = ""; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - clear_dir_servers(); - routerlist_free_all(); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - conn = new_dir_conn(); - char req[71]; - tor_snprintf(req, sizeof(req), - GET("/tor/keys/fp/%s"), TEST_CERT_IDENT_KEY); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 1883\r\n")); - - tt_str_op(TEST_CERTIFICATE, OP_EQ, body); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - clear_dir_servers(); - routerlist_free_all(); -} - -static void -test_dir_handle_get_server_keys_sk_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/sk/somehex"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_server_keys_sk(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - (void) data; - - mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - clear_dir_servers(); - routerlist_free_all(); - - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - conn = new_dir_conn(); - char req[71]; - tor_snprintf(req, sizeof(req), - GET("/tor/keys/sk/%s"), TEST_SIGNING_KEY); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 1883\r\n")); - - tt_str_op(TEST_CERTIFICATE, OP_EQ, body); - - done: - UNMOCK(get_my_v3_authority_cert); - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - authority_cert_free(mock_cert); mock_cert = NULL; - tor_free(header); - tor_free(body); -} - -static void -test_dir_handle_get_server_keys_fpsk_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - - const char *req = GET("/tor/keys/fp-sk/somehex"); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_server_keys_fpsk(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - dir_server_t *ds = NULL; - const char digest[DIGEST_LEN] = ""; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - clear_dir_servers(); - routerlist_free_all(); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - dir_server_add(ds); - - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - conn = new_dir_conn(); - - char req[115]; - tor_snprintf(req, sizeof(req), - GET("/tor/keys/fp-sk/%s-%s"), - TEST_CERT_IDENT_KEY, TEST_SIGNING_KEY); - - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(TEST_CERTIFICATE)+1, 0); - - tt_assert(header); - tt_assert(body); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 1883\r\n")); - - tt_str_op(TEST_CERTIFICATE, OP_EQ, body); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - - clear_dir_servers(); - routerlist_free_all(); -} - -static void -test_dir_handle_get_server_keys_busy(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - dir_server_t *ds = NULL; - const char digest[DIGEST_LEN] = ""; - (void) data; - - clear_dir_servers(); - routerlist_free_all(); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - dir_server_add(ds); - - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* setup busy server */ - init_mock_options(); - mock_options->CountPrivateBandwidth = 1; - - conn = new_dir_conn(); - char req[71]; - tor_snprintf(req, sizeof(req), GET("/tor/keys/fp/%s"), TEST_CERT_IDENT_KEY); - tt_int_op(directory_handle_command_get(conn, req, NULL, 0), OP_EQ, 0); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(SERVER_BUSY, OP_EQ, header); - - done: - UNMOCK(get_options); - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - or_options_free(mock_options); mock_options = NULL; - - clear_dir_servers(); - routerlist_free_all(); -} - -static networkstatus_t *mock_ns_val = NULL; -static networkstatus_t * -mock_ns_get_by_flavor(consensus_flavor_t f) -{ - (void)f; - return mock_ns_val; -} - -static void -test_dir_handle_get_status_vote_current_consensus_ns_not_enough_sigs(void* d) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *stats = NULL; - (void) d; - - /* init mock */ - mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); - mock_ns_val->flavor = FLAV_NS; - mock_ns_val->type = NS_TYPE_CONSENSUS; - mock_ns_val->voters = smartlist_new(); - mock_ns_val->valid_after = time(NULL) - 1800; - mock_ns_val->valid_until = time(NULL) - 60; - - #define NETWORK_STATUS "some network status string" - consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); - - /* init mock */ - init_mock_options(); - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); - - /* start gathering stats */ - mock_options->DirReqStatistics = 1; - geoip_dirreq_stats_init(time(NULL)); - - conn = new_dir_conn(); - - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/consensus-ns/" HEX1 "+" HEX2), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - - tt_assert(header); - tt_str_op(NOT_ENOUGH_CONSENSUS_SIGNATURES, OP_EQ, header); - - stats = geoip_format_dirreq_stats(time(NULL)); - tt_assert(stats); - tt_assert(strstr(stats, "not-enough-sigs=8")); - - done: - UNMOCK(networkstatus_get_latest_consensus_by_flavor); - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_options); - - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(stats); - smartlist_free(mock_ns_val->voters); - tor_free(mock_ns_val); - or_options_free(mock_options); mock_options = NULL; -} - -static void -test_dir_handle_get_status_vote_current_consensus_ns_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - char *stats = NULL; - (void) data; - - init_mock_options(); - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - /* start gathering stats */ - mock_options->DirReqStatistics = 1; - geoip_dirreq_stats_init(time(NULL)); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/consensus-ns"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - stats = geoip_format_dirreq_stats(time(NULL)); - tt_assert(stats); - tt_assert(strstr(stats, "not-found=8")); - - done: - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_options); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(stats); - or_options_free(mock_options); mock_options = NULL; -} - -static void -test_dir_handle_get_status_vote_current_consensus_too_old(void *data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void)data; - - mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); - mock_ns_val->type = NS_TYPE_CONSENSUS; - mock_ns_val->flavor = FLAV_MICRODESC; - mock_ns_val->valid_after = time(NULL) - (24 * 60 * 60 + 1800); - mock_ns_val->fresh_until = time(NULL) - (24 * 60 * 60 + 900); - mock_ns_val->valid_until = time(NULL) - (24 * 60 * 60 + 20); - - #define NETWORK_STATUS "some network status string" - consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); - - init_mock_options(); - - MOCK(get_options, mock_get_options); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); - - conn = new_dir_conn(); - - setup_capture_of_logs(LOG_WARN); - - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/consensus-microdesc"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(TOO_OLD, OP_EQ, header); - - expect_log_msg_containing("too old"); - - tor_free(header); - teardown_capture_of_logs(); - tor_free(mock_ns_val); - - mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); - mock_ns_val->type = NS_TYPE_CONSENSUS; - mock_ns_val->flavor = FLAV_NS; - mock_ns_val->valid_after = time(NULL) - (24 * 60 * 60 + 1800); - mock_ns_val->fresh_until = time(NULL) - (24 * 60 * 60 + 900); - mock_ns_val->valid_until = time(NULL) - (24 * 60 * 60 + 20); - - #define NETWORK_STATUS "some network status string" - consdiffmgr_add_consensus(NETWORK_STATUS, mock_ns_val); - - setup_capture_of_logs(LOG_WARN); - - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/consensus"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(TOO_OLD, OP_EQ, header); - - expect_no_log_entry(); - - done: - teardown_capture_of_logs(); - UNMOCK(networkstatus_get_latest_consensus_by_flavor); - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_options); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(mock_ns_val); - or_options_free(mock_options); mock_options = NULL; -} - -NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); - -int -NS(geoip_get_country_by_addr)(const tor_addr_t *addr) -{ - (void)addr; - CALLED(geoip_get_country_by_addr)++; - return 1; -} - -static void -status_vote_current_consensus_ns_test(char **header, char **body, - size_t *body_len) -{ - dir_connection_t *conn = NULL; - - #define NETWORK_STATUS "some network status string" -#if 0 - common_digests_t digests; - uint8_t sha3[DIGEST256_LEN]; - memset(&digests, 0x60, sizeof(digests)); - memset(sha3, 0x06, sizeof(sha3)); - dirserv_set_cached_consensus_networkstatus(NETWORK_STATUS, "ns", &digests, - sha3, - time(NULL)); -#endif /* 0 */ - networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); - ns->type = NS_TYPE_CONSENSUS; - ns->flavor = FLAV_NS; - ns->valid_after = time(NULL) - 1800; - ns->fresh_until = time(NULL) - 900; - ns->valid_until = time(NULL) - 60; - consdiffmgr_add_consensus(NETWORK_STATUS, ns); - networkstatus_vote_free(ns); - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - tt_assert(mock_options); - mock_options->DirReqStatistics = 1; - geoip_dirreq_stats_init(time(NULL)); - - /* init geoip database */ - geoip_parse_entry("10,50,AB", AF_INET); - tt_str_op("ab", OP_EQ, geoip_get_country_name(1)); - - conn = new_dir_conn(); - - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/consensus-ns"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, - body, body_len, strlen(NETWORK_STATUS)+7, 0); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); -} - -static void -test_dir_handle_get_status_vote_current_consensus_ns(void* data) -{ - char *header = NULL; - char *body = NULL, *comp_body = NULL; - size_t body_used = 0, comp_body_used = 0; - char *stats = NULL, *hist = NULL; - (void) data; - - dirserv_free_all(); - clear_geoip_db(); - - NS_MOCK(geoip_get_country_by_addr); - MOCK(get_options, mock_get_options); - - init_mock_options(); - - status_vote_current_consensus_ns_test(&header, &comp_body, &comp_body_used); - tt_assert(header); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Pragma: no-cache\r\n")); - - compress_method_t compression = detect_compression_method(comp_body, - comp_body_used); - tt_int_op(ZLIB_METHOD, OP_EQ, compression); - - tor_uncompress(&body, &body_used, comp_body, comp_body_used, - compression, 0, LOG_PROTOCOL_WARN); - - tt_str_op(NETWORK_STATUS, OP_EQ, body); - tt_int_op(strlen(NETWORK_STATUS), OP_EQ, body_used); - - stats = geoip_format_dirreq_stats(time(NULL)); - tt_assert(stats); - - tt_assert(strstr(stats, "ok=8")); - tt_assert(strstr(stats, "dirreq-v3-ips ab=8")); - tt_assert(strstr(stats, "dirreq-v3-reqs ab=8")); - tt_assert(strstr(stats, "dirreq-v3-direct-dl" - " complete=0,timeout=0,running=4")); - - hist = geoip_get_request_history(); - tt_assert(hist); - tt_str_op("ab=8", OP_EQ, hist); - - done: - NS_UNMOCK(geoip_get_country_by_addr); - UNMOCK(get_options); - tor_free(header); - tor_free(comp_body); - tor_free(body); - tor_free(stats); - tor_free(hist); - or_options_free(mock_options); mock_options = NULL; - - dirserv_free_all(); - clear_geoip_db(); -} - -static void -test_dir_handle_get_status_vote_current_consensus_ns_busy(void* data) -{ - char *header = NULL; - char *body = NULL; - size_t body_used = 0; - char *stats = NULL; - (void) data; - - dirserv_free_all(); - clear_geoip_db(); - - MOCK(get_options, mock_get_options); - - // Make it busy - init_mock_options(); - mock_options->CountPrivateBandwidth = 1; - - status_vote_current_consensus_ns_test(&header, &body, &body_used); - tt_assert(header); - - tt_str_op(SERVER_BUSY, OP_EQ, header); - - stats = geoip_format_dirreq_stats(time(NULL)); - tt_assert(stats); - tt_assert(strstr(stats, "busy=8")); - - done: - UNMOCK(get_options); - tor_free(header); - tor_free(body); - or_options_free(mock_options); mock_options = NULL; - - tor_free(stats); - dirserv_free_all(); - clear_geoip_db(); -} - -static void -test_dir_handle_get_status_vote_current_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/" HEX1), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -#define VOTE_DIGEST "312A4890D4D832597ABBD3089C782DBBFB81E48D" - -static void -status_vote_current_d_test(char **header, char **body, size_t *body_l) -{ - dir_connection_t *conn = NULL; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/d/" VOTE_DIGEST), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, - body, body_l, strlen(VOTE_BODY_V3)+1, 0); - tt_assert(header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); -} - -static void -status_vote_next_d_test(char **header, char **body, size_t *body_l) -{ - dir_connection_t *conn = NULL; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/d/" VOTE_DIGEST), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, - body, body_l, strlen(VOTE_BODY_V3)+1, 0); - tt_assert(header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); -} - -static void -test_dir_handle_get_status_vote_current_d_not_found(void* data) -{ - char *header = NULL; - (void) data; - - status_vote_current_d_test(&header, NULL, NULL); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - tor_free(header); -} - -static void -test_dir_handle_get_status_vote_next_d_not_found(void* data) -{ - char *header = NULL; - (void) data; - - status_vote_next_d_test(&header, NULL, NULL); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - tor_free(header); -} - -static void -test_dir_handle_get_status_vote_d(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used = 0; - dir_server_t *ds = NULL; - const char digest[DIGEST_LEN] = ""; - (void) data; - - clear_dir_servers(); - dirvote_free_all(); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - - init_mock_options(); - mock_options->AuthoritativeDir = 1; - mock_options->V3AuthoritativeDir = 1; - mock_options->TestingV3AuthVotingStartOffset = 0; - mock_options->TestingV3AuthInitialVotingInterval = 1; - mock_options->TestingV3AuthInitialVoteDelay = 1; - mock_options->TestingV3AuthInitialDistDelay = 1; - - time_t now = 1441223455 -1; - dirvote_recalculate_timing(mock_options, now); - - const char *msg_out = NULL; - int status_out = 0; - struct pending_vote_t *pv = dirvote_add_vote(VOTE_BODY_V3, &msg_out, - &status_out); - tt_assert(pv); - - status_vote_current_d_test(&header, &body, &body_used); - - tt_assert(header); - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 4135\r\n")); - - tt_str_op(VOTE_BODY_V3, OP_EQ, body); - - tor_free(header); - tor_free(body); - - status_vote_next_d_test(&header, &body, &body_used); - - tt_assert(header); - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 4135\r\n")); - - tt_str_op(VOTE_BODY_V3, OP_EQ, body); - - done: - tor_free(header); - tor_free(body); - or_options_free(mock_options); mock_options = NULL; - - clear_dir_servers(); - dirvote_free_all(); -} - -static void -test_dir_handle_get_status_vote_next_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/" HEX1), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -status_vote_next_consensus_test(char **header, char **body, size_t *body_used) -{ - dir_connection_t *conn = NULL; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/consensus"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, - body, body_used, 18, 0); - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); -} - -static void -test_dir_handle_get_status_vote_next_consensus_not_found(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used; - (void) data; - - status_vote_next_consensus_test(&header, &body, &body_used); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - tor_free(header); - tor_free(body); -} - -static void -test_dir_handle_get_status_vote_current_authority_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/authority"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -static void -test_dir_handle_get_status_vote_next_authority_not_found(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL; - (void) data; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/authority"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - NULL, NULL, 1, 0); - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - UNMOCK(connection_write_to_buf_impl_); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); -} - -NS_DECL(const char*, -dirvote_get_pending_consensus, (consensus_flavor_t flav)); - -const char* -NS(dirvote_get_pending_consensus)(consensus_flavor_t flav) -{ - (void)flav; - return "pending consensus"; -} - -static void -test_dir_handle_get_status_vote_next_consensus(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used = 0; - (void) data; - - NS_MOCK(dirvote_get_pending_consensus); - - status_vote_next_consensus_test(&header, &body, &body_used); - tt_assert(header); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 17\r\n")); - - tt_str_op("pending consensus", OP_EQ, body); - - done: - NS_UNMOCK(dirvote_get_pending_consensus); - tor_free(header); - tor_free(body); -} - -static void -test_dir_handle_get_status_vote_next_consensus_busy(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used = 0; - (void) data; - - MOCK(get_options, mock_get_options); - NS_MOCK(dirvote_get_pending_consensus); - - //Make it busy - init_mock_options(); - mock_options->CountPrivateBandwidth = 1; - - status_vote_next_consensus_test(&header, &body, &body_used); - - tt_assert(header); - tt_str_op(SERVER_BUSY, OP_EQ, header); - - done: - NS_UNMOCK(dirvote_get_pending_consensus); - UNMOCK(get_options); - tor_free(header); - tor_free(body); - or_options_free(mock_options); mock_options = NULL; -} - -static void -status_vote_next_consensus_signatures_test(char **header, char **body, - size_t *body_used) -{ - dir_connection_t *conn = NULL; - - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/consensus-signatures"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, header, MAX_HEADERS_SIZE, - body, body_used, 22, 0); - - done: - connection_free_minimal(TO_CONN(conn)); - UNMOCK(connection_write_to_buf_impl_); -} - -static void -test_dir_handle_get_status_vote_next_consensus_signatures_not_found(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used; - (void) data; - - status_vote_next_consensus_signatures_test(&header, &body, &body_used); - - tt_assert(header); - tt_str_op(NOT_FOUND, OP_EQ, header); - - done: - tor_free(header); - tor_free(body); -} - -NS_DECL(const char*, -dirvote_get_pending_detached_signatures, (void)); - -const char* -NS(dirvote_get_pending_detached_signatures)(void) -{ - return "pending detached sigs"; -} - -static void -test_dir_handle_get_status_vote_next_consensus_signatures(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used = 0; - (void) data; - - NS_MOCK(dirvote_get_pending_detached_signatures); - - status_vote_next_consensus_signatures_test(&header, &body, &body_used); - tt_assert(header); - - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 21\r\n")); - - tt_str_op("pending detached sigs", OP_EQ, body); - - done: - NS_UNMOCK(dirvote_get_pending_detached_signatures); - tor_free(header); - tor_free(body); -} - -static void -test_dir_handle_get_status_vote_next_consensus_signatures_busy(void* data) -{ - char *header = NULL, *body = NULL; - size_t body_used; - (void) data; - - NS_MOCK(dirvote_get_pending_detached_signatures); - MOCK(get_options, mock_get_options); - - //Make it busy - init_mock_options(); - mock_options->CountPrivateBandwidth = 1; - - status_vote_next_consensus_signatures_test(&header, &body, &body_used); - - tt_assert(header); - tt_str_op(SERVER_BUSY, OP_EQ, header); - - done: - UNMOCK(get_options); - NS_UNMOCK(dirvote_get_pending_detached_signatures); - tor_free(header); - tor_free(body); - or_options_free(mock_options); mock_options = NULL; -} - -static void -test_dir_handle_get_status_vote_next_authority(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL, *body = NULL; - const char *msg_out = NULL; - int status_out = 0; - size_t body_used = 0; - dir_server_t *ds = NULL; - const char digest[DIGEST_LEN] = ""; - (void) data; - - clear_dir_servers(); - routerlist_free_all(); - dirvote_free_all(); - - mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - init_mock_options(); - mock_options->AuthoritativeDir = 1; - mock_options->V3AuthoritativeDir = 1; - mock_options->TestingV3AuthVotingStartOffset = 0; - mock_options->TestingV3AuthInitialVotingInterval = 1; - mock_options->TestingV3AuthInitialVoteDelay = 1; - mock_options->TestingV3AuthInitialDistDelay = 1; - - time_t now = 1441223455 -1; - dirvote_recalculate_timing(mock_options, now); - - struct pending_vote_t *vote = dirvote_add_vote(VOTE_BODY_V3, &msg_out, - &status_out); - tt_assert(vote); - - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/next/authority"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(VOTE_BODY_V3)+1, 0); - - tt_assert(header); - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 4135\r\n")); - - tt_str_op(VOTE_BODY_V3, OP_EQ, body); - - done: - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_my_v3_authority_cert); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - authority_cert_free(mock_cert); mock_cert = NULL; - or_options_free(mock_options); mock_options = NULL; - - clear_dir_servers(); - routerlist_free_all(); - dirvote_free_all(); -} - -static void -test_dir_handle_get_status_vote_current_authority(void* data) -{ - dir_connection_t *conn = NULL; - char *header = NULL, *body = NULL; - const char *msg_out = NULL; - int status_out = 0; - size_t body_used = 0; - const char digest[DIGEST_LEN] = ""; - - dir_server_t *ds = NULL; - (void) data; - - clear_dir_servers(); - routerlist_free_all(); - dirvote_free_all(); - - mock_cert = authority_cert_parse_from_string(TEST_CERTIFICATE, NULL); - - /* create a trusted ds */ - ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, NULL, digest, - NULL, V3_DIRINFO, 1.0); - tt_assert(ds); - dir_server_add(ds); - - /* ds v3_identity_digest is the certificate's identity_key */ - base16_decode(ds->v3_identity_digest, DIGEST_LEN, - TEST_CERT_IDENT_KEY, HEX_DIGEST_LEN); - - tt_int_op(0, OP_EQ, trusted_dirs_load_certs_from_string(TEST_CERTIFICATE, - TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST, 1, NULL)); - - init_mock_options(); - mock_options->AuthoritativeDir = 1; - mock_options->V3AuthoritativeDir = 1; - mock_options->TestingV3AuthVotingStartOffset = 0; - mock_options->TestingV3AuthInitialVotingInterval = 1; - mock_options->TestingV3AuthInitialVoteDelay = 1; - mock_options->TestingV3AuthInitialDistDelay = 1; - - time_t now = 1441223455; - dirvote_recalculate_timing(mock_options, now-1); - - struct pending_vote_t *vote = dirvote_add_vote(VOTE_BODY_V3, &msg_out, - &status_out); - tt_assert(vote); - - // move the pending vote to previous vote - dirvote_act(mock_options, now+1); - - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); - - conn = new_dir_conn(); - tt_int_op(0, OP_EQ, directory_handle_command_get(conn, - GET("/tor/status-vote/current/authority"), NULL, 0)); - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, - &body, &body_used, strlen(VOTE_BODY_V3)+1, 0); - - tt_assert(header); - tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header); - tt_assert(strstr(header, "Content-Type: text/plain\r\n")); - tt_assert(strstr(header, "Content-Encoding: identity\r\n")); - tt_assert(strstr(header, "Content-Length: 4135\r\n")); - - tt_str_op(VOTE_BODY_V3, OP_EQ, body); - - done: - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(get_my_v3_authority_cert); - connection_free_minimal(TO_CONN(conn)); - tor_free(header); - tor_free(body); - authority_cert_free(mock_cert); mock_cert = NULL; - or_options_free(mock_options); mock_options = NULL; - - clear_dir_servers(); - routerlist_free_all(); - dirvote_free_all(); -} - -static void -test_dir_handle_get_parse_accept_encoding(void *arg) -{ - (void)arg; - const unsigned B_NONE = 1u << NO_METHOD; - const unsigned B_ZLIB = 1u << ZLIB_METHOD; - const unsigned B_GZIP = 1u << GZIP_METHOD; - const unsigned B_LZMA = 1u << LZMA_METHOD; - const unsigned B_ZSTD = 1u << ZSTD_METHOD; - - unsigned encodings; - - encodings = parse_accept_encoding_header(""); - tt_uint_op(B_NONE, OP_EQ, encodings); - - encodings = parse_accept_encoding_header(" "); - tt_uint_op(B_NONE, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("dewey, cheatham, and howe "); - tt_uint_op(B_NONE, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("dewey, cheatham, and gzip"); - tt_uint_op(B_NONE, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("dewey, cheatham, and, gzip"); - tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); - - encodings = parse_accept_encoding_header(" gzip"); - tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("gzip"); - tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("x-zstd, deflate, x-tor-lzma"); - tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA, OP_EQ, encodings); - - encodings = parse_accept_encoding_header( - "x-zstd, deflate, x-tor-lzma, gzip"); - tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); - - encodings = parse_accept_encoding_header("x-zstd,deflate,x-tor-lzma,gzip"); - tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); - - done: - ; -} - -#define DIR_HANDLE_CMD(name,flags) \ - { #name, test_dir_handle_get_##name, (flags), NULL, NULL } - -struct testcase_t dir_handle_get_tests[] = { - DIR_HANDLE_CMD(not_found, 0), - DIR_HANDLE_CMD(bad_request, 0), - DIR_HANDLE_CMD(v1_command_not_found, 0), - DIR_HANDLE_CMD(v1_command, 0), - DIR_HANDLE_CMD(robots_txt, 0), - DIR_HANDLE_CMD(rendezvous2_not_found_if_not_encrypted, 0), - DIR_HANDLE_CMD(rendezvous2_not_found, 0), - DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_with_invalid_desc_id, 0), - DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_not_well_formed, 0), - DIR_HANDLE_CMD(rendezvous2_on_encrypted_conn_success, 0), - DIR_HANDLE_CMD(micro_d_not_found, 0), - DIR_HANDLE_CMD(micro_d_server_busy, 0), - DIR_HANDLE_CMD(micro_d, 0), - DIR_HANDLE_CMD(networkstatus_bridges_not_found_without_auth, 0), - DIR_HANDLE_CMD(networkstatus_bridges_not_found_wrong_auth, 0), - DIR_HANDLE_CMD(networkstatus_bridges, 0), - DIR_HANDLE_CMD(server_descriptors_not_found, 0), - DIR_HANDLE_CMD(server_descriptors_busy, TT_FORK), - DIR_HANDLE_CMD(server_descriptors_all, TT_FORK), - DIR_HANDLE_CMD(server_descriptors_authority, TT_FORK), - DIR_HANDLE_CMD(server_descriptors_fp, TT_FORK), - DIR_HANDLE_CMD(server_descriptors_d, TT_FORK), - DIR_HANDLE_CMD(server_keys_bad_req, 0), - DIR_HANDLE_CMD(server_keys_busy, 0), - DIR_HANDLE_CMD(server_keys_all_not_found, 0), - DIR_HANDLE_CMD(server_keys_all, 0), - DIR_HANDLE_CMD(server_keys_authority_not_found, 0), - DIR_HANDLE_CMD(server_keys_authority, 0), - DIR_HANDLE_CMD(server_keys_fp_not_found, 0), - DIR_HANDLE_CMD(server_keys_fp, 0), - DIR_HANDLE_CMD(server_keys_sk_not_found, 0), - DIR_HANDLE_CMD(server_keys_sk, 0), - DIR_HANDLE_CMD(server_keys_fpsk_not_found, 0), - DIR_HANDLE_CMD(server_keys_fpsk, 0), - DIR_HANDLE_CMD(status_vote_current_not_found, 0), - DIR_HANDLE_CMD(status_vote_next_not_found, 0), - DIR_HANDLE_CMD(status_vote_current_authority_not_found, 0), - DIR_HANDLE_CMD(status_vote_current_authority, 0), - DIR_HANDLE_CMD(status_vote_next_authority_not_found, 0), - DIR_HANDLE_CMD(status_vote_next_authority, 0), - DIR_HANDLE_CMD(status_vote_current_consensus_ns_not_enough_sigs, TT_FORK), - DIR_HANDLE_CMD(status_vote_current_consensus_ns_not_found, TT_FORK), - DIR_HANDLE_CMD(status_vote_current_consensus_too_old, TT_FORK), - DIR_HANDLE_CMD(status_vote_current_consensus_ns_busy, TT_FORK), - DIR_HANDLE_CMD(status_vote_current_consensus_ns, TT_FORK), - DIR_HANDLE_CMD(status_vote_current_d_not_found, 0), - DIR_HANDLE_CMD(status_vote_next_d_not_found, 0), - DIR_HANDLE_CMD(status_vote_d, 0), - DIR_HANDLE_CMD(status_vote_next_consensus_not_found, 0), - DIR_HANDLE_CMD(status_vote_next_consensus_busy, 0), - DIR_HANDLE_CMD(status_vote_next_consensus, 0), - DIR_HANDLE_CMD(status_vote_next_consensus_signatures_not_found, 0), - DIR_HANDLE_CMD(status_vote_next_consensus_signatures_busy, 0), - DIR_HANDLE_CMD(status_vote_next_consensus_signatures, 0), - DIR_HANDLE_CMD(parse_accept_encoding, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_dns.c b/src/tor/src/test/test_dns.c deleted file mode 100644 index 1fee01d2c..000000000 --- a/src/tor/src/test/test_dns.c +++ /dev/null @@ -1,748 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "test.h" - -#define DNS_PRIVATE - -#include "dns.h" -#include "connection.h" -#include "router.h" - -#define NS_MODULE dns - -#define NS_SUBMODULE clip_ttl - -static void -NS(test_main)(void *arg) -{ - (void)arg; - - uint32_t ttl_mid = MIN_DNS_TTL_AT_EXIT / 2 + MAX_DNS_TTL_AT_EXIT / 2; - - tt_int_op(dns_clip_ttl(MIN_DNS_TTL_AT_EXIT - 1),OP_EQ,MIN_DNS_TTL_AT_EXIT); - tt_int_op(dns_clip_ttl(ttl_mid),OP_EQ,MAX_DNS_TTL_AT_EXIT); - tt_int_op(dns_clip_ttl(MAX_DNS_TTL_AT_EXIT + 1),OP_EQ,MAX_DNS_TTL_AT_EXIT); - - done: - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE resolve - -static int resolve_retval = 0; -static int resolve_made_conn_pending = 0; -static char *resolved_name = NULL; -static cached_resolve_t *cache_entry_mock = NULL; - -static int n_fake_impl = 0; - -NS_DECL(int, dns_resolve_impl, (edge_connection_t *exitconn, int is_resolve, - or_circuit_t *oncirc, char **hostname_out, - int *made_connection_pending_out, - cached_resolve_t **resolve_out)); - -/** This will be our configurable substitute for dns_resolve_impl in - * dns.c. It will return resolve_retval, - * and set resolve_made_conn_pending to - * made_connection_pending_out. It will set hostname_out - * to a duplicate of resolved_name and it will set resolve_out - * to cache_entry. Lastly, it will increment n_fake_implbase_.magic = OR_CIRCUIT_MAGIC; - - memset(fake_resolved,0,sizeof(cached_resolve_t)); - memset(exitconn,0,sizeof(edge_connection_t)); - memset(nextconn,0,sizeof(edge_connection_t)); - - NS_MOCK(dns_resolve_impl); - NS_MOCK(send_resolved_cell); - NS_MOCK(send_resolved_hostname_cell); - - /* - * CASE 1: dns_resolve_impl returns 1 and sets a hostname. purpose is - * EXIT_PURPOSE_RESOLVE. - * - * We want dns_resolve() to call send_resolved_hostname_cell() for a - * given exit connection (represented by edge_connection_t object) - * with a hostname it received from _impl. - */ - - prev_n_send_resolved_hostname_cell_replacement = - n_send_resolved_hostname_cell_replacement; - - exitconn->base_.purpose = EXIT_PURPOSE_RESOLVE; - exitconn->on_circuit = &(on_circuit->base_); - - resolve_retval = 1; - resolved_name = tor_strdup("www.torproject.org"); - - retval = dns_resolve(exitconn); - - tt_int_op(retval,OP_EQ,1); - tt_str_op(resolved_name,OP_EQ,last_resolved_hostname); - tt_assert(conn_for_resolved_cell == exitconn); - tt_int_op(n_send_resolved_hostname_cell_replacement,OP_EQ, - prev_n_send_resolved_hostname_cell_replacement + 1); - tt_assert(exitconn->on_circuit == NULL); - - tor_free(last_resolved_hostname); - // implies last_resolved_hostname = NULL; - - /* CASE 2: dns_resolve_impl returns 1, but does not set hostname. - * Instead, it yields cached_resolve_t object. - * - * We want dns_resolve to call send_resolved_cell on exitconn with - * RESOLVED_TYPE_AUTO and the cached_resolve_t object from _impl. - */ - - tor_free(resolved_name); - resolved_name = NULL; - - exitconn->on_circuit = &(on_circuit->base_); - - cache_entry_mock = fake_resolved; - - prev_n_send_resolved_cell_replacement = - n_send_resolved_cell_replacement; - - retval = dns_resolve(exitconn); - - tt_int_op(retval,OP_EQ,1); - tt_assert(conn_for_resolved_cell == exitconn); - tt_int_op(n_send_resolved_cell_replacement,OP_EQ, - prev_n_send_resolved_cell_replacement + 1); - tt_assert(last_resolved == fake_resolved); - tt_int_op(last_answer_type,OP_EQ,0xff); - tt_assert(exitconn->on_circuit == NULL); - - /* CASE 3: The purpose of exit connection is not EXIT_PURPOSE_RESOLVE - * and _impl returns 1. - * - * We want dns_resolve to prepend exitconn to n_streams linked list. - * We don't want it to send any cells about hostname being resolved. - */ - - exitconn->base_.purpose = EXIT_PURPOSE_CONNECT; - exitconn->on_circuit = &(on_circuit->base_); - - on_circuit->n_streams = nextconn; - - prev_n_send_resolved_cell_replacement = - n_send_resolved_cell_replacement; - - prev_n_send_resolved_hostname_cell_replacement = - n_send_resolved_hostname_cell_replacement; - - retval = dns_resolve(exitconn); - - tt_int_op(retval,OP_EQ,1); - tt_assert(on_circuit->n_streams == exitconn); - tt_assert(exitconn->next_stream == nextconn); - tt_int_op(prev_n_send_resolved_cell_replacement,OP_EQ, - n_send_resolved_cell_replacement); - tt_int_op(prev_n_send_resolved_hostname_cell_replacement,OP_EQ, - n_send_resolved_hostname_cell_replacement); - - /* CASE 4: _impl returns 0. - * - * We want dns_resolve() to set exitconn state to - * EXIT_CONN_STATE_RESOLVING and prepend exitconn to resolving_streams - * linked list. - */ - - exitconn->on_circuit = &(on_circuit->base_); - - resolve_retval = 0; - - exitconn->next_stream = NULL; - on_circuit->resolving_streams = nextconn; - - retval = dns_resolve(exitconn); - - tt_int_op(retval,OP_EQ,0); - tt_int_op(exitconn->base_.state,OP_EQ,EXIT_CONN_STATE_RESOLVING); - tt_assert(on_circuit->resolving_streams == exitconn); - tt_assert(exitconn->next_stream == nextconn); - - /* CASE 5: _impl returns -1 when purpose of exitconn is - * EXIT_PURPOSE_RESOLVE. We want dns_resolve to call send_resolved_cell - * on exitconn with type being RESOLVED_TYPE_ERROR. - */ - - NS_MOCK(dns_cancel_pending_resolve); - NS_MOCK(connection_free_); - - exitconn->on_circuit = &(on_circuit->base_); - exitconn->base_.purpose = EXIT_PURPOSE_RESOLVE; - - resolve_retval = -1; - - prev_n_send_resolved_cell_replacement = - n_send_resolved_cell_replacement; - - prev_n_connection_free = n_connection_free; - - retval = dns_resolve(exitconn); - - tt_int_op(retval,OP_EQ,-1); - tt_int_op(n_send_resolved_cell_replacement,OP_EQ, - prev_n_send_resolved_cell_replacement + 1); - tt_int_op(last_answer_type,OP_EQ,RESOLVED_TYPE_ERROR); - tt_int_op(n_dns_cancel_pending_resolve_replacement,OP_EQ,1); - tt_int_op(n_connection_free,OP_EQ,prev_n_connection_free + 1); - tt_assert(last_freed_conn == TO_CONN(exitconn)); - - done: - NS_UNMOCK(dns_resolve_impl); - NS_UNMOCK(send_resolved_cell); - NS_UNMOCK(send_resolved_hostname_cell); - NS_UNMOCK(dns_cancel_pending_resolve); - NS_UNMOCK(connection_free_); - tor_free(on_circuit); - tor_free(exitconn); - tor_free(nextconn); - tor_free(resolved_name); - tor_free(fake_resolved); - tor_free(last_resolved_hostname); - return; -} - -#undef NS_SUBMODULE - -/** Create an edge_connection_t instance that is considered a - * valid exit connection by asserts in dns_resolve_impl. - */ -static edge_connection_t * -create_valid_exitconn(void) -{ - edge_connection_t *exitconn = tor_malloc_zero(sizeof(edge_connection_t)); - TO_CONN(exitconn)->type = CONN_TYPE_EXIT; - TO_CONN(exitconn)->magic = EDGE_CONNECTION_MAGIC; - TO_CONN(exitconn)->purpose = EXIT_PURPOSE_RESOLVE; - TO_CONN(exitconn)->state = EXIT_CONN_STATE_RESOLVING; - exitconn->base_.s = TOR_INVALID_SOCKET; - - return exitconn; -} - -#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve) - -/* - * Given that exitconn->base_.address is IP address string, we - * want dns_resolve_impl() to parse it and store in - * exitconn->base_.addr. We expect dns_resolve_impl to return 1. - * Lastly, we want it to set the TTL value to default one for DNS queries. - */ - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending; - const tor_addr_t *resolved_addr; - tor_addr_t addr_to_compare; - - (void)arg; - - tor_addr_parse(&addr_to_compare, "8.8.8.8"); - - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - edge_connection_t *exitconn = create_valid_exitconn(); - - TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - resolved_addr = &(exitconn->base_.addr); - - tt_int_op(retval,OP_EQ,1); - tt_assert(tor_addr_eq(resolved_addr, (const tor_addr_t *)&addr_to_compare)); - tt_int_op(exitconn->address_ttl,OP_EQ,DEFAULT_DNS_TTL); - - done: - tor_free(on_circ); - tor_free(TO_CONN(exitconn)->address); - tor_free(exitconn); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, non_exit) - -/** Given that Tor instance is not configured as an exit node, we want - * dns_resolve_impl() to fail with return value -1. - */ -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 1; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - (void)arg; - - TO_CONN(exitconn)->address = tor_strdup("torproject.org"); - - NS_MOCK(router_my_exit_policy_is_reject_star); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,-1); - - done: - tor_free(TO_CONN(exitconn)->address); - tor_free(exitconn); - tor_free(on_circ); - NS_UNMOCK(router_my_exit_policy_is_reject_star); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_invalid_dest) - -/** Given that address is not a valid destination (as judged by - * address_is_invalid_destination() function), we want dns_resolve_impl() - * function to fail with return value -1. - */ - -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 0; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - (void)arg; - - NS_MOCK(router_my_exit_policy_is_reject_star); - - TO_CONN(exitconn)->address = tor_strdup("invalid#@!.org"); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,-1); - - done: - NS_UNMOCK(router_my_exit_policy_is_reject_star); - tor_free(TO_CONN(exitconn)->address); - tor_free(exitconn); - tor_free(on_circ); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, malformed_ptr) - -/** Given that address is a malformed PTR name, we want dns_resolve_impl to - * fail. - */ - -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 0; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - (void)arg; - - TO_CONN(exitconn)->address = tor_strdup("1.0.0.127.in-addr.arpa"); - - NS_MOCK(router_my_exit_policy_is_reject_star); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,-1); - - tor_free(TO_CONN(exitconn)->address); - - TO_CONN(exitconn)->address = - tor_strdup("z01234567890123456789.in-addr.arpa"); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,-1); - - done: - NS_UNMOCK(router_my_exit_policy_is_reject_star); - tor_free(TO_CONN(exitconn)->address); - tor_free(exitconn); - tor_free(on_circ); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_pending) - -/* Given that there is already a pending resolve for the given address, - * we want dns_resolve_impl to append our exit connection to list - * of pending connections for the pending DNS request and return 0. - */ - -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 0; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending = 0; - - pending_connection_t *pending_conn = NULL; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); - cache_entry->magic = CACHED_RESOLVE_MAGIC; - cache_entry->state = CACHE_STATE_PENDING; - cache_entry->minheap_idx = -1; - cache_entry->expire = time(NULL) + 60 * 60; - - (void)arg; - - TO_CONN(exitconn)->address = tor_strdup("torproject.org"); - - strlcpy(cache_entry->address, TO_CONN(exitconn)->address, - sizeof(cache_entry->address)); - - NS_MOCK(router_my_exit_policy_is_reject_star); - - dns_init(); - - dns_insert_cache_entry(cache_entry); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,0); - tt_int_op(made_pending,OP_EQ,1); - - pending_conn = cache_entry->pending_connections; - - tt_assert(pending_conn != NULL); - tt_assert(pending_conn->conn == exitconn); - - done: - NS_UNMOCK(router_my_exit_policy_is_reject_star); - tor_free(on_circ); - tor_free(TO_CONN(exitconn)->address); - tor_free(cache_entry->pending_connections); - tor_free(cache_entry); - tor_free(exitconn); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_cached) - -/* Given that a finished DNS resolve is available in our cache, we want - * dns_resolve_impl() return it to called via resolve_out and pass the - * handling to set_exitconn_info_from_resolve function. - */ -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 0; -} - -static edge_connection_t *last_exitconn = NULL; -static cached_resolve_t *last_resolve = NULL; - -static int -NS(set_exitconn_info_from_resolve)(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out) -{ - last_exitconn = exitconn; - last_resolve = (cached_resolve_t *)resolve; - - (void)hostname_out; - - return 0; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending = 0; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - cached_resolve_t *resolve_out = NULL; - - cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); - cache_entry->magic = CACHED_RESOLVE_MAGIC; - cache_entry->state = CACHE_STATE_CACHED; - cache_entry->minheap_idx = -1; - cache_entry->expire = time(NULL) + 60 * 60; - - (void)arg; - - TO_CONN(exitconn)->address = tor_strdup("torproject.org"); - - strlcpy(cache_entry->address, TO_CONN(exitconn)->address, - sizeof(cache_entry->address)); - - NS_MOCK(router_my_exit_policy_is_reject_star); - NS_MOCK(set_exitconn_info_from_resolve); - - dns_init(); - - dns_insert_cache_entry(cache_entry); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - &resolve_out); - - tt_int_op(retval,OP_EQ,0); - tt_int_op(made_pending,OP_EQ,0); - tt_assert(resolve_out == cache_entry); - - tt_assert(last_exitconn == exitconn); - tt_assert(last_resolve == cache_entry); - - done: - NS_UNMOCK(router_my_exit_policy_is_reject_star); - NS_UNMOCK(set_exitconn_info_from_resolve); - tor_free(on_circ); - tor_free(TO_CONN(exitconn)->address); - tor_free(cache_entry->pending_connections); - tor_free(cache_entry); - return; -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE ASPECT(resolve_impl, cache_miss) - -/* Given that there are neither pending nor pre-cached resolve for a given - * address, we want dns_resolve_impl() to create a new cached_resolve_t - * object, mark it as pending, insert it into the cache, attach the exit - * connection to list of pending connections and call launch_resolve() - * with the cached_resolve_t object it created. - */ -static int -NS(router_my_exit_policy_is_reject_star)(void) -{ - return 0; -} - -static cached_resolve_t *last_launched_resolve = NULL; - -static int -NS(launch_resolve)(cached_resolve_t *resolve) -{ - last_launched_resolve = resolve; - - return 0; -} - -static void -NS(test_main)(void *arg) -{ - int retval; - int made_pending = 0; - - pending_connection_t *pending_conn = NULL; - - edge_connection_t *exitconn = create_valid_exitconn(); - or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - - cached_resolve_t *cache_entry = NULL; - cached_resolve_t query; - - (void)arg; - - TO_CONN(exitconn)->address = tor_strdup("torproject.org"); - - strlcpy(query.address, TO_CONN(exitconn)->address, sizeof(query.address)); - - NS_MOCK(router_my_exit_policy_is_reject_star); - NS_MOCK(launch_resolve); - - dns_init(); - - retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, - NULL); - - tt_int_op(retval,OP_EQ,0); - tt_int_op(made_pending,OP_EQ,1); - - cache_entry = dns_get_cache_entry(&query); - - tt_assert(cache_entry); - - pending_conn = cache_entry->pending_connections; - - tt_assert(pending_conn != NULL); - tt_assert(pending_conn->conn == exitconn); - - tt_assert(last_launched_resolve == cache_entry); - tt_str_op(cache_entry->address,OP_EQ,TO_CONN(exitconn)->address); - - done: - NS_UNMOCK(router_my_exit_policy_is_reject_star); - NS_UNMOCK(launch_resolve); - tor_free(on_circ); - tor_free(TO_CONN(exitconn)->address); - if (cache_entry) - tor_free(cache_entry->pending_connections); - tor_free(cache_entry); - tor_free(exitconn); - return; -} - -#undef NS_SUBMODULE - -struct testcase_t dns_tests[] = { - TEST_CASE(clip_ttl), - TEST_CASE(resolve), - TEST_CASE_ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve), - TEST_CASE_ASPECT(resolve_impl, non_exit), - TEST_CASE_ASPECT(resolve_impl, addr_is_invalid_dest), - TEST_CASE_ASPECT(resolve_impl, malformed_ptr), - TEST_CASE_ASPECT(resolve_impl, cache_hit_pending), - TEST_CASE_ASPECT(resolve_impl, cache_hit_cached), - TEST_CASE_ASPECT(resolve_impl, cache_miss), - END_OF_TESTCASES -}; - -#undef NS_MODULE - diff --git a/src/tor/src/test/test_entryconn.c b/src/tor/src/test/test_entryconn.c deleted file mode 100644 index 9d8a072c7..000000000 --- a/src/tor/src/test/test_entryconn.c +++ /dev/null @@ -1,833 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CONNECTION_PRIVATE -#define CONNECTION_EDGE_PRIVATE - -#include "or.h" -#include "test.h" - -#include "addressmap.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "nodelist.h" - -#include "hs_cache.h" -#include "rendcache.h" - -static void * -entryconn_rewrite_setup(const struct testcase_t *tc) -{ - (void)tc; - entry_connection_t *ec = entry_connection_new(CONN_TYPE_AP, AF_INET); - addressmap_init(); - return ec; -} - -static int -entryconn_rewrite_teardown(const struct testcase_t *tc, void *arg) -{ - (void)tc; - entry_connection_t *ec = arg; - if (ec) - connection_free_minimal(ENTRY_TO_CONN(ec)); - addressmap_free_all(); - return 1; -} - -static struct testcase_setup_t test_rewrite_setup = { - entryconn_rewrite_setup, entryconn_rewrite_teardown -}; - -/* Simple rewrite: no changes needed */ -static void -test_entryconn_rewrite_basic(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - - tt_assert(ec->socks_request); - strlcpy(ec->socks_request->address, "www.TORproject.org", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_int_op(rr.automap, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.torproject.org"); - tt_str_op(ec->socks_request->address, OP_EQ, "www.torproject.org"); - tt_str_op(ec->original_dest_address, OP_EQ, "www.torproject.org"); - - done: - ; -} - -/* Rewrite but reject because of disallowed .exit */ -static void -test_entryconn_rewrite_bad_dotexit(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - - tt_assert(ec->socks_request); - strlcpy(ec->socks_request->address, "www.TORproject.org.foo.exit", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL); - - done: - ; -} - -/* Automap on resolve, connect to automapped address, resolve again and get - * same answer. (IPv4) */ -static void -test_entryconn_rewrite_automap_ipv4(void *arg) -{ - entry_connection_t *ec = arg; - entry_connection_t *ec2=NULL, *ec3=NULL; - rewrite_result_t rr; - char *msg = NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - get_options_mutable()->AutomapHostsOnResolve = 1; - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, "."); - parse_virtual_addr_network("127.202.0.0/16", AF_INET, 0, &msg); - - /* Automap this on resolve. */ - strlcpy(ec->socks_request->address, "WWW.MIT.EDU", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); - tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); - - tt_assert(!strcmpstart(ec->socks_request->address,"127.202.")); - - /* Connect to it and make sure we get the original address back. */ - strlcpy(ec2->socks_request->address, ec->socks_request->address, - sizeof(ec2->socks_request->address)); - - ec2->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); - tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); - tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); - - /* Resolve it again, make sure the answer is the same. */ - strlcpy(ec3->socks_request->address, "www.MIT.EDU", - sizeof(ec3->socks_request->address)); - ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec3, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); - tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); - - tt_str_op(ec3->socks_request->address, OP_EQ, - ec->socks_request->address); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); - connection_free_minimal(ENTRY_TO_CONN(ec3)); -} - -/* Automap on resolve, connect to automapped address, resolve again and get - * same answer. (IPv6) */ -static void -test_entryconn_rewrite_automap_ipv6(void *arg) -{ - (void)arg; - entry_connection_t *ec =NULL; - entry_connection_t *ec2=NULL, *ec3=NULL; - rewrite_result_t rr; - char *msg = NULL; - - ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); - ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET6); - - get_options_mutable()->AutomapHostsOnResolve = 1; - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, "."); - parse_virtual_addr_network("FE80::/32", AF_INET6, 0, &msg); - - /* Automap this on resolve. */ - strlcpy(ec->socks_request->address, "WWW.MIT.EDU", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); - tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); - - /* Yes, this [ should be here. */ - tt_assert(!strcmpstart(ec->socks_request->address,"[fe80:")); - - /* Connect to it and make sure we get the original address back. */ - strlcpy(ec2->socks_request->address, ec->socks_request->address, - sizeof(ec2->socks_request->address)); - - ec2->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); - tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); - tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); - - /* Resolve it again, make sure the answer is the same. */ - strlcpy(ec3->socks_request->address, "www.MIT.EDU", - sizeof(ec3->socks_request->address)); - ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec3, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); - tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); - - tt_str_op(ec3->socks_request->address, OP_EQ, - ec->socks_request->address); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec)); - connection_free_minimal(ENTRY_TO_CONN(ec2)); - connection_free_minimal(ENTRY_TO_CONN(ec3)); -} - -#if 0 -/* FFFF not actually supported. */ -/* automap on resolve, reverse lookup. */ -static void -test_entryconn_rewrite_automap_reverse(void *arg) -{ - entry_connection_t *ec = arg; - entry_connection_t *ec2=NULL; - rewrite_result_t rr; - char *msg = NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - get_options_mutable()->AutomapHostsOnResolve = 1; - get_options_mutable()->SafeLogging_ = SAFELOG_SCRUB_NONE; - smartlist_add(get_options_mutable()->AutomapHostsSuffixes, - tor_strdup(".bloom")); - parse_virtual_addr_network("127.80.0.0/16", AF_INET, 0, &msg); - - /* Automap this on resolve. */ - strlcpy(ec->socks_request->address, "www.poldy.BLOOM", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.poldy.bloom"); - tt_str_op(ec->original_dest_address, OP_EQ, "www.poldy.bloom"); - - tt_assert(!strcmpstart(ec->socks_request->address,"127.80.")); - - strlcpy(ec2->socks_request->address, ec->socks_request->address, - sizeof(ec2->socks_request->address)); - ec2->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, - END_STREAM_REASON_DONE|END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); -} -#endif /* 0 */ - -/* Rewrite because of cached DNS entry. */ -static void -test_entryconn_rewrite_cached_dns_ipv4(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - time_t expires = time(NULL) + 3600; - entry_connection_t *ec2=NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - addressmap_register("www.friendly.example.com", - tor_strdup("240.240.241.241"), - expires, - ADDRMAPSRC_DNS, - 0, 0); - - strlcpy(ec->socks_request->address, "www.friendly.example.com", - sizeof(ec->socks_request->address)); - strlcpy(ec2->socks_request->address, "www.friendly.example.com", - sizeof(ec2->socks_request->address)); - - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - ec2->socks_request->command = SOCKS_COMMAND_CONNECT; - - ec2->entry_cfg.use_cached_ipv4_answers = 1; /* only ec2 gets this flag */ - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); - tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); - - connection_ap_handshake_rewrite(ec2, &rr); - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, expires); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); - tt_str_op(ec2->socks_request->address, OP_EQ, "240.240.241.241"); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); -} - -/* Rewrite because of cached DNS entry. */ -static void -test_entryconn_rewrite_cached_dns_ipv6(void *arg) -{ - entry_connection_t *ec = NULL; - rewrite_result_t rr; - time_t expires = time(NULL) + 3600; - entry_connection_t *ec2=NULL; - - (void)arg; - - ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); - - addressmap_register("www.friendly.example.com", - tor_strdup("[::f00f]"), - expires, - ADDRMAPSRC_DNS, - 0, 0); - - strlcpy(ec->socks_request->address, "www.friendly.example.com", - sizeof(ec->socks_request->address)); - strlcpy(ec2->socks_request->address, "www.friendly.example.com", - sizeof(ec2->socks_request->address)); - - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - ec2->socks_request->command = SOCKS_COMMAND_CONNECT; - - ec2->entry_cfg.use_cached_ipv6_answers = 1; /* only ec2 gets this flag */ - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); - tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); - - connection_ap_handshake_rewrite(ec2, &rr); - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, expires); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); - tt_str_op(ec2->socks_request->address, OP_EQ, "[::f00f]"); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec)); - connection_free_minimal(ENTRY_TO_CONN(ec2)); -} - -/* Fail to connect to unmapped address in virtual range. */ -static void -test_entryconn_rewrite_unmapped_virtual(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - entry_connection_t *ec2 = NULL; - char *msg = NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); - - parse_virtual_addr_network("18.202.0.0/16", AF_INET, 0, &msg); - parse_virtual_addr_network("[ABCD::]/16", AF_INET6, 0, &msg); - - strlcpy(ec->socks_request->address, "18.202.5.5", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); - tt_int_op(rr.automap, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - - strlcpy(ec2->socks_request->address, "[ABCD:9::5314:9543]", - sizeof(ec2->socks_request->address)); - ec2->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); - tt_int_op(rr.automap, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); -} - -/* Rewrite because of mapaddress option */ -static void -test_entryconn_rewrite_mapaddress(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - - config_line_append(&get_options_mutable()->AddressMap, - "MapAddress", "meta metaobjects.example"); - config_register_addressmaps(get_options()); - - strlcpy(ec->socks_request->address, "meta", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_int_op(rr.automap, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(ec->socks_request->address, OP_EQ, "metaobjects.example"); - - done: - ; -} - -/* Reject reverse lookups of internal address. */ -static void -test_entryconn_rewrite_reject_internal_reverse(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - - strlcpy(ec->socks_request->address, "10.0.0.1", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - tt_int_op(rr.automap, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - - done: - ; -} - -/* Rewrite into .exit because of virtual address mapping. */ -static void -test_entryconn_rewrite_automap_exit(void *arg) -{ - entry_connection_t *ec = arg; - entry_connection_t *ec2=NULL; - rewrite_result_t rr; - char *msg = NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, - ".EXIT"); - parse_virtual_addr_network("127.1.0.0/16", AF_INET, 0, &msg); - - /* Try to automap this on resolve. */ - strlcpy(ec->socks_request->address, "website.example.exit", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec, &rr); - - /* Make sure it isn't allowed -- there is no longer an AllowDotExit - * option. */ - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 1); - tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); -} - -/* Rewrite into .exit because of mapaddress */ -static void -test_entryconn_rewrite_mapaddress_exit(void *arg) -{ - entry_connection_t *ec = arg; - rewrite_result_t rr; - - config_line_append(&get_options_mutable()->AddressMap, - "MapAddress", "*.example.com *.example.com.abc.exit"); - config_register_addressmaps(get_options()); - - /* Automap this on resolve. */ - strlcpy(ec->socks_request->address, "abc.example.com", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_TORRC); - tt_str_op(rr.orig_address, OP_EQ, "abc.example.com"); - tt_str_op(ec->socks_request->address, OP_EQ, "abc.example.com.abc.exit"); - done: - ; -} - -/* Map foo.onion to longthing.onion, and also automap. */ -static void -test_entryconn_rewrite_mapaddress_automap_onion(void *arg) -{ - entry_connection_t *ec = arg; - entry_connection_t *ec2 = NULL; - entry_connection_t *ec3 = NULL; - entry_connection_t *ec4 = NULL; - rewrite_result_t rr; - char *msg = NULL; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); - ec4 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - get_options_mutable()->AutomapHostsOnResolve = 1; - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, - ".onion"); - parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); - config_line_append(&get_options_mutable()->AddressMap, - "MapAddress", "foo.onion abcdefghijklmnop.onion"); - config_register_addressmaps(get_options()); - - /* Connect to foo.onion. */ - strlcpy(ec->socks_request->address, "foo.onion", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); - tt_str_op(ec->socks_request->address, OP_EQ, "abcdefghijklmnop.onion"); - - /* Okay, resolve foo.onion */ - strlcpy(ec2->socks_request->address, "foo.onion", - sizeof(ec2->socks_request->address)); - ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); - tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); - - /* Now connect */ - strlcpy(ec3->socks_request->address, ec2->socks_request->address, - sizeof(ec3->socks_request->address)); - ec3->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec3, &rr); - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_assert(!strcmpstart(ec3->socks_request->address, - "abcdefghijklmnop.onion")); - - /* Now resolve abcefghijklmnop.onion. */ - strlcpy(ec4->socks_request->address, "abcdefghijklmnop.onion", - sizeof(ec4->socks_request->address)); - ec4->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec4, &rr); - - tt_int_op(rr.automap, OP_EQ, 1); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "abcdefghijklmnop.onion"); - tt_assert(!strcmpstart(ec4->socks_request->address, "192.168.")); - /* XXXX doesn't work - tt_str_op(ec4->socks_request->address, OP_EQ, ec2->socks_request->address); - */ - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); - connection_free_minimal(ENTRY_TO_CONN(ec3)); - connection_free_minimal(ENTRY_TO_CONN(ec4)); -} - -static void -test_entryconn_rewrite_mapaddress_automap_onion_common(entry_connection_t *ec, - int map_to_onion, - int map_to_address) -{ - entry_connection_t *ec2 = NULL; - entry_connection_t *ec3 = NULL; - rewrite_result_t rr; - - ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); - ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); - - /* Connect to irc.example.com */ - strlcpy(ec->socks_request->address, "irc.example.com", - sizeof(ec->socks_request->address)); - ec->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec, &rr); - - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); - tt_str_op(ec->socks_request->address, OP_EQ, - map_to_onion ? "abcdefghijklmnop.onion" : "irc.example.com"); - - /* Okay, resolve irc.example.com */ - strlcpy(ec2->socks_request->address, "irc.example.com", - sizeof(ec2->socks_request->address)); - ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; - connection_ap_handshake_rewrite(ec2, &rr); - - tt_int_op(rr.automap, OP_EQ, map_to_onion && map_to_address); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); - tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); - tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); - if (map_to_onion && map_to_address) - tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); - - /* Now connect */ - strlcpy(ec3->socks_request->address, ec2->socks_request->address, - sizeof(ec3->socks_request->address)); - ec3->socks_request->command = SOCKS_COMMAND_CONNECT; - connection_ap_handshake_rewrite(ec3, &rr); - tt_int_op(rr.automap, OP_EQ, 0); - tt_int_op(rr.should_close, OP_EQ, 0); - tt_int_op(rr.end_reason, OP_EQ, 0); - if (map_to_onion) - tt_assert(!strcmpstart(ec3->socks_request->address, - "abcdefghijklmnop.onion")); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec2)); - connection_free_minimal(ENTRY_TO_CONN(ec3)); -} - -/* This time is the same, but we start with a mapping from a non-onion - * address. */ -static void -test_entryconn_rewrite_mapaddress_automap_onion2(void *arg) -{ - char *msg = NULL; - get_options_mutable()->AutomapHostsOnResolve = 1; - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, - ".onion"); - parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); - config_line_append(&get_options_mutable()->AddressMap, - "MapAddress", "irc.example.com abcdefghijklmnop.onion"); - config_register_addressmaps(get_options()); - - test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 1); -} - -/* Same as above, with automapped turned off */ -static void -test_entryconn_rewrite_mapaddress_automap_onion3(void *arg) -{ - config_line_append(&get_options_mutable()->AddressMap, - "MapAddress", "irc.example.com abcdefghijklmnop.onion"); - config_register_addressmaps(get_options()); - - test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 0); -} - -/* As above, with no mapping. */ -static void -test_entryconn_rewrite_mapaddress_automap_onion4(void *arg) -{ - char *msg = NULL; - get_options_mutable()->AutomapHostsOnResolve = 1; - smartlist_add_strdup(get_options_mutable()->AutomapHostsSuffixes, - ".onion"); - parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); - - test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1); -} - -/** Test that rewrite functions can handle v2 addresses */ -static void -test_entryconn_rewrite_onion_v2(void *arg) -{ - int retval; - entry_connection_t *conn = arg; - - (void) arg; - - rend_cache_init(); - - /* Make a SOCKS request */ - conn->socks_request->command = SOCKS_COMMAND_CONNECT; - strlcpy(conn->socks_request->address, - "pqeed46efnwmfuid.onion", - sizeof(conn->socks_request->address)); - - /* Make an onion connection using the SOCKS request */ - conn->entry_cfg.onion_traffic = 1; - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT; - tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); - - /* Handle SOCKS and rewrite! */ - retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); - tt_int_op(retval, OP_EQ, 0); - - /* Check connection state after rewrite */ - tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT); - /* check that the address got rewritten */ - tt_str_op(conn->socks_request->address, OP_EQ, - "pqeed46efnwmfuid"); - /* check that HS information got attached to the connection */ - tt_assert(ENTRY_TO_EDGE_CONN(conn)->rend_data); - tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident); - - done: - rend_cache_free_all(); - /* 'conn' is cleaned by handler */ -} - -/** Test that rewrite functions can handle v3 onion addresses */ -static void -test_entryconn_rewrite_onion_v3(void *arg) -{ - int retval; - entry_connection_t *conn = arg; - - (void) arg; - - hs_cache_init(); - - /* Make a SOCKS request */ - conn->socks_request->command = SOCKS_COMMAND_CONNECT; - strlcpy(conn->socks_request->address, - "git.25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion", - sizeof(conn->socks_request->address)); - - /* Make an onion connection using the SOCKS request */ - conn->entry_cfg.onion_traffic = 1; - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT; - tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); - tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident); - - /* Handle SOCKS and rewrite! */ - retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL); - tt_int_op(retval, OP_EQ, 0); - - /* Check connection state after rewrite. It should be in waiting for - * descriptor state. */ - tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT); - /* check that the address got rewritten */ - tt_str_op(conn->socks_request->address, OP_EQ, - "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); - /* check that HS information got attached to the connection */ - tt_assert(ENTRY_TO_EDGE_CONN(conn)->hs_ident); - tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data); - - done: - hs_free_all(); - /* 'conn' is cleaned by handler */ -} - -#define REWRITE(name) \ - { #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL } - -struct testcase_t entryconn_tests[] = { - REWRITE(rewrite_basic), - REWRITE(rewrite_bad_dotexit), - REWRITE(rewrite_automap_ipv4), - REWRITE(rewrite_automap_ipv6), - // REWRITE(rewrite_automap_reverse), - REWRITE(rewrite_cached_dns_ipv4), - REWRITE(rewrite_cached_dns_ipv6), - REWRITE(rewrite_unmapped_virtual), - REWRITE(rewrite_mapaddress), - REWRITE(rewrite_reject_internal_reverse), - REWRITE(rewrite_automap_exit), - REWRITE(rewrite_mapaddress_exit), - REWRITE(rewrite_mapaddress_automap_onion), - REWRITE(rewrite_mapaddress_automap_onion2), - REWRITE(rewrite_mapaddress_automap_onion3), - REWRITE(rewrite_mapaddress_automap_onion4), - REWRITE(rewrite_onion_v2), - REWRITE(rewrite_onion_v3), - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_entrynodes.c b/src/tor/src/test/test_entrynodes.c deleted file mode 100644 index 1cff3828c..000000000 --- a/src/tor/src/test/test_entrynodes.c +++ /dev/null @@ -1,2868 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CIRCUITLIST_PRIVATE -#define STATEFILE_PRIVATE -#define ENTRYNODES_PRIVATE -#define ROUTERLIST_PRIVATE -#define DIRECTORY_PRIVATE - -#include "or.h" -#include "test.h" - -#include "bridges.h" -#include "circuitlist.h" -#include "config.h" -#include "confparse.h" -#include "directory.h" -#include "entrynodes.h" -#include "nodelist.h" -#include "networkstatus.h" -#include "policies.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "statefile.h" -#include "util.h" - -#include "test_helpers.h" -#include "log_test_helpers.h" - -/* TODO: - * choose_random_entry() test with state set. - * - * parse_state() tests with more than one guards. - * - * More tests for set_from_config(): Multiple nodes, use fingerprints, - * use country codes. - */ - -/** Dummy Tor state used in unittests. */ -static or_state_t *dummy_state = NULL; -static or_state_t * -get_or_state_replacement(void) -{ - return dummy_state; -} - -static networkstatus_t *dummy_consensus = NULL; - -static smartlist_t *big_fake_net_nodes = NULL; - -static smartlist_t * -bfn_mock_nodelist_get_list(void) -{ - return big_fake_net_nodes; -} - -static networkstatus_t * -bfn_mock_networkstatus_get_live_consensus(time_t now) -{ - (void)now; - return dummy_consensus; -} - -static const node_t * -bfn_mock_node_get_by_id(const char *id) -{ - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, - if (fast_memeq(n->identity, id, 20)) - return n); - - return NULL; -} - -/* Unittest cleanup function: Cleanup the fake network. */ -static int -big_fake_network_cleanup(const struct testcase_t *testcase, void *ptr) -{ - (void) testcase; - (void) ptr; - - if (big_fake_net_nodes) { - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { - tor_free(n->rs); - tor_free(n->md); - tor_free(n); - }); - smartlist_free(big_fake_net_nodes); - } - - UNMOCK(nodelist_get_list); - UNMOCK(node_get_by_id); - UNMOCK(get_or_state); - UNMOCK(networkstatus_get_live_consensus); - or_state_free(dummy_state); - dummy_state = NULL; - tor_free(dummy_consensus); - - return 1; /* NOP */ -} - -/* Unittest setup function: Setup a fake network. */ -static void * -big_fake_network_setup(const struct testcase_t *testcase) -{ - int i; - - /* These are minimal node_t objects that only contain the aspects of node_t - * that we need for entrynodes.c. */ - const int N_NODES = 271; - - big_fake_net_nodes = smartlist_new(); - for (i = 0; i < N_NODES; ++i) { - node_t *n = tor_malloc_zero(sizeof(node_t)); - n->md = tor_malloc_zero(sizeof(microdesc_t)); - - crypto_rand(n->identity, sizeof(n->identity)); - n->rs = tor_malloc_zero(sizeof(routerstatus_t)); - - memcpy(n->rs->identity_digest, n->identity, DIGEST_LEN); - - n->is_running = n->is_valid = n->is_fast = n->is_stable = 1; - - /* Note: all these guards have the same address, so you'll need to - * disable EnforceDistinctSubnets when a restriction is applied. */ - n->rs->addr = 0x04020202; - n->rs->or_port = 1234; - n->rs->is_v2_dir = 1; - n->rs->has_bandwidth = 1; - n->rs->bandwidth_kb = 30; - - /* Make a random nickname for each node */ - { - char nickname_binary[8]; - crypto_rand(nickname_binary, sizeof(nickname_binary)); - base64_encode(n->rs->nickname, sizeof(n->rs->nickname), - nickname_binary, sizeof(nickname_binary), 0); - } - - /* Call half of the nodes a possible guard. */ - if (i % 2 == 0) { - n->is_possible_guard = 1; - n->rs->guardfraction_percentage = 100; - n->rs->has_guardfraction = 1; - } - - smartlist_add(big_fake_net_nodes, n); - } - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - dummy_consensus = tor_malloc_zero(sizeof(networkstatus_t)); - dummy_consensus->valid_after = approx_time() - 3600; - dummy_consensus->valid_until = approx_time() + 3600; - - MOCK(nodelist_get_list, bfn_mock_nodelist_get_list); - MOCK(node_get_by_id, bfn_mock_node_get_by_id); - MOCK(get_or_state, - get_or_state_replacement); - MOCK(networkstatus_get_live_consensus, - bfn_mock_networkstatus_get_live_consensus); - /* Return anything but NULL (it's interpreted as test fail) */ - return (void*)testcase; -} - -static time_t -mock_randomize_time_no_randomization(time_t a, time_t b) -{ - (void) b; - return a; -} - -static or_options_t mocked_options; - -static const or_options_t * -mock_get_options(void) -{ - return &mocked_options; -} - -#define TEST_IPV4_ADDR "123.45.67.89" -#define TEST_IPV6_ADDR "[1234:5678:90ab:cdef::]" - -static void -test_node_preferred_orport(void *arg) -{ - (void)arg; - tor_addr_t ipv4_addr; - const uint16_t ipv4_port = 4444; - tor_addr_t ipv6_addr; - const uint16_t ipv6_port = 6666; - routerinfo_t node_ri; - node_t node; - tor_addr_port_t ap; - - /* Setup options */ - memset(&mocked_options, 0, sizeof(mocked_options)); - /* We don't test ClientPreferIPv6ORPort here, because it's used in - * nodelist_set_consensus to setup node.ipv6_preferred, which we set - * directly. */ - MOCK(get_options, mock_get_options); - - /* Setup IP addresses */ - tor_addr_parse(&ipv4_addr, TEST_IPV4_ADDR); - tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); - - /* Setup node_ri */ - memset(&node_ri, 0, sizeof(node_ri)); - node_ri.addr = tor_addr_to_ipv4h(&ipv4_addr); - node_ri.or_port = ipv4_port; - tor_addr_copy(&node_ri.ipv6_addr, &ipv6_addr); - node_ri.ipv6_orport = ipv6_port; - - /* Setup node */ - memset(&node, 0, sizeof(node)); - node.ri = &node_ri; - - /* Check the preferred address is IPv4 if we're only using IPv4, regardless - * of whether we prefer it or not */ - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientUseIPv6 = 0; - node.ipv6_preferred = 0; - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); - tt_assert(ap.port == ipv4_port); - - node.ipv6_preferred = 1; - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); - tt_assert(ap.port == ipv4_port); - - /* Check the preferred address is IPv4 if we're using IPv4 and IPv6, but - * don't prefer the IPv6 address */ - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientUseIPv6 = 1; - node.ipv6_preferred = 0; - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv4_addr)); - tt_assert(ap.port == ipv4_port); - - /* Check the preferred address is IPv6 if we prefer it and - * ClientUseIPv6 is 1, regardless of ClientUseIPv4 */ - mocked_options.ClientUseIPv4 = 1; - mocked_options.ClientUseIPv6 = 1; - node.ipv6_preferred = 1; - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); - tt_assert(ap.port == ipv6_port); - - mocked_options.ClientUseIPv4 = 0; - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); - tt_assert(ap.port == ipv6_port); - - /* Check the preferred address is IPv6 if we don't prefer it, but - * ClientUseIPv4 is 0 */ - mocked_options.ClientUseIPv4 = 0; - mocked_options.ClientUseIPv6 = 1; - node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(&mocked_options); - node_get_pref_orport(&node, &ap); - tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr)); - tt_assert(ap.port == ipv6_port); - - done: - UNMOCK(get_options); -} - -static void -test_entry_guard_describe(void *arg) -{ - (void)arg; - entry_guard_t g; - memset(&g, 0, sizeof(g)); - strlcpy(g.nickname, "okefenokee", sizeof(g.nickname)); - memcpy(g.identity, "theforestprimeval---", DIGEST_LEN); - - tt_str_op(entry_guard_describe(&g), OP_EQ, - "okefenokee ($746865666F726573747072696D6576616C2D2D2D)"); - - done: - ; -} - -static void -test_entry_guard_randomize_time(void *arg) -{ - const time_t now = 1479153573; - const int delay = 86400; - const int N = 1000; - (void)arg; - - time_t t; - int i; - for (i = 0; i < N; ++i) { - t = randomize_time(now, delay); - tt_int_op(t, OP_LE, now); - tt_int_op(t, OP_GE, now-delay); - } - - /* now try the corner cases */ - for (i = 0; i < N; ++i) { - t = randomize_time(100, delay); - tt_int_op(t, OP_GE, 1); - tt_int_op(t, OP_LE, 100); - - t = randomize_time(0, delay); - tt_int_op(t, OP_EQ, 1); - } - - done: - ; -} - -static void -test_entry_guard_encode_for_state_minimal(void *arg) -{ - (void) arg; - entry_guard_t *eg = tor_malloc_zero(sizeof(entry_guard_t)); - - eg->selection_name = tor_strdup("wubwub"); - memcpy(eg->identity, "plurpyflurpyslurpydo", DIGEST_LEN); - eg->sampled_on_date = 1479081600; - eg->confirmed_idx = -1; - - char *s = NULL; - s = entry_guard_encode_for_state(eg); - - tt_str_op(s, OP_EQ, - "in=wubwub " - "rsa_id=706C75727079666C75727079736C75727079646F " - "sampled_on=2016-11-14T00:00:00 " - "listed=0"); - - done: - entry_guard_free(eg); - tor_free(s); -} - -static void -test_entry_guard_encode_for_state_maximal(void *arg) -{ - (void) arg; - entry_guard_t *eg = tor_malloc_zero(sizeof(entry_guard_t)); - - strlcpy(eg->nickname, "Fred", sizeof(eg->nickname)); - eg->selection_name = tor_strdup("default"); - memcpy(eg->identity, "plurpyflurpyslurpydo", DIGEST_LEN); - eg->bridge_addr = tor_malloc_zero(sizeof(tor_addr_port_t)); - tor_addr_from_ipv4h(&eg->bridge_addr->addr, 0x08080404); - eg->bridge_addr->port = 9999; - eg->sampled_on_date = 1479081600; - eg->sampled_by_version = tor_strdup("1.2.3"); - eg->unlisted_since_date = 1479081645; - eg->currently_listed = 1; - eg->confirmed_on_date = 1479081690; - eg->confirmed_idx = 333; - eg->extra_state_fields = tor_strdup("and the green grass grew all around"); - - char *s = NULL; - s = entry_guard_encode_for_state(eg); - - tt_str_op(s, OP_EQ, - "in=default " - "rsa_id=706C75727079666C75727079736C75727079646F " - "bridge_addr=8.8.4.4:9999 " - "nickname=Fred " - "sampled_on=2016-11-14T00:00:00 " - "sampled_by=1.2.3 " - "unlisted_since=2016-11-14T00:00:45 " - "listed=1 " - "confirmed_on=2016-11-14T00:01:30 " - "confirmed_idx=333 " - "and the green grass grew all around"); - - done: - entry_guard_free(eg); - tor_free(s); -} - -static void -test_entry_guard_parse_from_state_minimal(void *arg) -{ - (void)arg; - char *mem_op_hex_tmp = NULL; - entry_guard_t *eg = NULL; - time_t t = approx_time(); - - eg = entry_guard_parse_from_state( - "in=default_plus " - "rsa_id=596f75206d6179206e656564206120686f626279"); - tt_assert(eg); - - tt_str_op(eg->selection_name, OP_EQ, "default_plus"); - test_mem_op_hex(eg->identity, OP_EQ, - "596f75206d6179206e656564206120686f626279"); - tt_str_op(eg->nickname, OP_EQ, "$596F75206D6179206E656564206120686F626279"); - tt_ptr_op(eg->bridge_addr, OP_EQ, NULL); - tt_i64_op(eg->sampled_on_date, OP_GE, t); - tt_i64_op(eg->sampled_on_date, OP_LE, t+86400); - tt_i64_op(eg->unlisted_since_date, OP_EQ, 0); - tt_ptr_op(eg->sampled_by_version, OP_EQ, NULL); - tt_int_op(eg->currently_listed, OP_EQ, 0); - tt_i64_op(eg->confirmed_on_date, OP_EQ, 0); - tt_int_op(eg->confirmed_idx, OP_EQ, -1); - - tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); - tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - done: - entry_guard_free(eg); - tor_free(mem_op_hex_tmp); -} - -static void -test_entry_guard_parse_from_state_maximal(void *arg) -{ - (void)arg; - char *mem_op_hex_tmp = NULL; - entry_guard_t *eg = NULL; - - eg = entry_guard_parse_from_state( - "in=fred " - "rsa_id=706C75727079666C75727079736C75727079646F " - "bridge_addr=[1::3]:9999 " - "nickname=Fred " - "sampled_on=2016-11-14T00:00:00 " - "sampled_by=1.2.3 " - "unlisted_since=2016-11-14T00:00:45 " - "listed=1 " - "confirmed_on=2016-11-14T00:01:30 " - "confirmed_idx=333 " - "and the green grass grew all around " - "rsa_id=all,around"); - tt_assert(eg); - - test_mem_op_hex(eg->identity, OP_EQ, - "706C75727079666C75727079736C75727079646F"); - tt_str_op(fmt_addr(&eg->bridge_addr->addr), OP_EQ, "1::3"); - tt_int_op(eg->bridge_addr->port, OP_EQ, 9999); - tt_str_op(eg->nickname, OP_EQ, "Fred"); - tt_i64_op(eg->sampled_on_date, OP_EQ, 1479081600); - tt_i64_op(eg->unlisted_since_date, OP_EQ, 1479081645); - tt_str_op(eg->sampled_by_version, OP_EQ, "1.2.3"); - tt_int_op(eg->currently_listed, OP_EQ, 1); - tt_i64_op(eg->confirmed_on_date, OP_EQ, 1479081690); - tt_int_op(eg->confirmed_idx, OP_EQ, 333); - tt_str_op(eg->extra_state_fields, OP_EQ, - "and the green grass grew all around rsa_id=all,around"); - - tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); - tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - done: - entry_guard_free(eg); - tor_free(mem_op_hex_tmp); -} - -static void -test_entry_guard_parse_from_state_failure(void *arg) -{ - (void)arg; - entry_guard_t *eg = NULL; - - /* no selection */ - eg = entry_guard_parse_from_state( - "rsa_id=596f75206d6179206e656564206120686f626270"); - tt_ptr_op(eg, OP_EQ, NULL); - - /* no RSA ID. */ - eg = entry_guard_parse_from_state("in=default nickname=Fred"); - tt_ptr_op(eg, OP_EQ, NULL); - - /* Bad RSA ID: bad character. */ - eg = entry_guard_parse_from_state( - "in=default " - "rsa_id=596f75206d6179206e656564206120686f62627q"); - tt_ptr_op(eg, OP_EQ, NULL); - - /* Bad RSA ID: too long.*/ - eg = entry_guard_parse_from_state( - "in=default " - "rsa_id=596f75206d6179206e656564206120686f6262703"); - tt_ptr_op(eg, OP_EQ, NULL); - - /* Bad RSA ID: too short.*/ - eg = entry_guard_parse_from_state( - "in=default " - "rsa_id=596f75206d6179206e65656420612"); - tt_ptr_op(eg, OP_EQ, NULL); - - done: - entry_guard_free(eg); -} - -static void -test_entry_guard_parse_from_state_partial_failure(void *arg) -{ - (void)arg; - char *mem_op_hex_tmp = NULL; - entry_guard_t *eg = NULL; - time_t t = approx_time(); - - eg = entry_guard_parse_from_state( - "in=default " - "rsa_id=706C75727079666C75727079736C75727079646F " - "bridge_addr=1.2.3.3.4:5 " - "nickname=FredIsANodeWithAStrangeNicknameThatIsTooLong " - "sampled_on=2016-11-14T00:00:99 " - "sampled_by=1.2.3 stuff in the middle " - "unlisted_since=2016-xx-14T00:00:45 " - "listed=0 " - "confirmed_on=2016-11-14T00:01:30zz " - "confirmed_idx=idx " - "and the green grass grew all around " - "rsa_id=all,around"); - tt_assert(eg); - - test_mem_op_hex(eg->identity, OP_EQ, - "706C75727079666C75727079736C75727079646F"); - tt_str_op(eg->nickname, OP_EQ, "FredIsANodeWithAStrangeNicknameThatIsTooL"); - tt_ptr_op(eg->bridge_addr, OP_EQ, NULL); - tt_i64_op(eg->sampled_on_date, OP_EQ, t); - tt_i64_op(eg->unlisted_since_date, OP_EQ, 0); - tt_str_op(eg->sampled_by_version, OP_EQ, "1.2.3"); - tt_int_op(eg->currently_listed, OP_EQ, 0); - tt_i64_op(eg->confirmed_on_date, OP_EQ, 0); - tt_int_op(eg->confirmed_idx, OP_EQ, -1); - tt_str_op(eg->extra_state_fields, OP_EQ, - "stuff in the middle and the green grass grew all around " - "rsa_id=all,around"); - - tt_int_op(eg->last_tried_to_connect, OP_EQ, 0); - tt_int_op(eg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - done: - entry_guard_free(eg); - tor_free(mem_op_hex_tmp); -} - -static int -mock_entry_guard_is_listed(guard_selection_t *gs, const entry_guard_t *guard) -{ - (void)gs; - (void)guard; - return 1; -} - -static void -test_entry_guard_parse_from_state_full(void *arg) -{ - (void)arg; - /* Here's a state I made while testing. The identities and locations for - * the bridges are redacted. */ - const char STATE[] = - "Guard in=default rsa_id=214F44BD5B638E8C817D47FF7C97397790BF0345 " - "nickname=TotallyNinja sampled_on=2016-11-12T19:32:49 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1\n" - "Guard in=default rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " - "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " - "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " - "pb_successful_circuits_closed=2.000000\n" - "Guard in=default rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " - "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=4 " - "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " - "pb_successful_circuits_closed=5.000000\n" - "Guard in=wobblesome rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " - "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1\n" - "Guard in=default rsa_id=E9025AD60D86875D5F11548D536CC6AF60F0EF5E " - "nickname=maibrunn sampled_on=2016-11-25T22:36:38 " - "sampled_by=0.3.0.0-alpha-dev listed=1\n" - "Guard in=default rsa_id=DCD30B90BA3A792DA75DC54A327EF353FB84C38E " - "nickname=Unnamed sampled_on=2016-11-25T14:34:00 " - "sampled_by=0.3.0.0-alpha-dev listed=1\n" - "Guard in=bridges rsa_id=8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E " - "bridge_addr=24.1.1.1:443 sampled_on=2016-11-25T06:44:14 " - "sampled_by=0.3.0.0-alpha-dev listed=1 " - "confirmed_on=2016-11-29T10:36:06 confirmed_idx=0 " - "pb_circ_attempts=8.000000 pb_circ_successes=8.000000 " - "pb_successful_circuits_closed=13.000000\n" - "Guard in=bridges rsa_id=5800000000000000000000000000000000000000 " - "bridge_addr=37.218.246.143:28366 " - "sampled_on=2016-11-18T15:07:34 sampled_by=0.3.0.0-alpha-dev listed=1\n"; - - config_line_t *lines = NULL; - or_state_t *state = tor_malloc_zero(sizeof(or_state_t)); - int r = config_get_lines(STATE, &lines, 0); - char *msg = NULL; - smartlist_t *text = smartlist_new(); - char *joined = NULL; - - // So nodes aren't expired. This is Tue, 13 Dec 2016 09:37:14 GMT - update_approx_time(1481621834); - - MOCK(entry_guard_is_listed, mock_entry_guard_is_listed); - - dummy_state = state; - MOCK(get_or_state, - get_or_state_replacement); - - tt_int_op(r, OP_EQ, 0); - tt_assert(lines); - - state->Guard = lines; - - /* Try it first without setting the result. */ - r = entry_guards_parse_state(state, 0, &msg); - tt_int_op(r, OP_EQ, 0); - guard_selection_t *gs_br = - get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); - tt_ptr_op(gs_br, OP_EQ, NULL); - - r = entry_guards_parse_state(state, 1, &msg); - tt_int_op(r, OP_EQ, 0); - gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); - guard_selection_t *gs_df = - get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); - guard_selection_t *gs_wb = - get_guard_selection_by_name("wobblesome", GS_TYPE_NORMAL, 0); - - tt_assert(gs_br); - tt_assert(gs_df); - tt_assert(gs_wb); - - tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 5); - tt_int_op(smartlist_len(gs_br->sampled_entry_guards), OP_EQ, 2); - tt_int_op(smartlist_len(gs_wb->sampled_entry_guards), OP_EQ, 1); - - /* Try again; make sure it doesn't double-add the guards. */ - r = entry_guards_parse_state(state, 1, &msg); - tt_int_op(r, OP_EQ, 0); - gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0); - gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); - tt_assert(gs_br); - tt_assert(gs_df); - tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 5); - tt_int_op(smartlist_len(gs_br->sampled_entry_guards), OP_EQ, 2); - - /* Re-encode; it should be the same... almost. */ - { - /* (Make a guard nonpersistent first) */ - entry_guard_t *g = smartlist_get(gs_df->sampled_entry_guards, 0); - g->is_persistent = 0; - } - config_free_lines(lines); - lines = state->Guard = NULL; // to prevent double-free. - entry_guards_update_state(state); - tt_assert(state->Guard); - lines = state->Guard; - - config_line_t *ln; - for (ln = lines; ln; ln = ln->next) { - smartlist_add_asprintf(text, "%s %s\n",ln->key, ln->value); - } - joined = smartlist_join_strings(text, "", 0, NULL); - tt_str_op(joined, OP_EQ, - "Guard in=default rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " - "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " - "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " - "pb_successful_circuits_closed=2.000000\n" - "Guard in=default rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " - "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=1 " - "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " - "pb_successful_circuits_closed=5.000000\n" - "Guard in=default rsa_id=E9025AD60D86875D5F11548D536CC6AF60F0EF5E " - "nickname=maibrunn sampled_on=2016-11-25T22:36:38 " - "sampled_by=0.3.0.0-alpha-dev listed=1\n" - "Guard in=default rsa_id=DCD30B90BA3A792DA75DC54A327EF353FB84C38E " - "nickname=Unnamed sampled_on=2016-11-25T14:34:00 " - "sampled_by=0.3.0.0-alpha-dev listed=1\n" - "Guard in=wobblesome rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " - "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1\n" - "Guard in=bridges rsa_id=8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E " - "bridge_addr=24.1.1.1:443 sampled_on=2016-11-25T06:44:14 " - "sampled_by=0.3.0.0-alpha-dev listed=1 " - "confirmed_on=2016-11-29T10:36:06 confirmed_idx=0 " - "pb_circ_attempts=8.000000 pb_circ_successes=8.000000 " - "pb_successful_circuits_closed=13.000000\n" - "Guard in=bridges rsa_id=5800000000000000000000000000000000000000 " - "bridge_addr=37.218.246.143:28366 " - "sampled_on=2016-11-18T15:07:34 sampled_by=0.3.0.0-alpha-dev listed=1\n"); - - done: - config_free_lines(lines); - tor_free(state); - tor_free(msg); - UNMOCK(get_or_state); - UNMOCK(entry_guard_is_listed); - SMARTLIST_FOREACH(text, char *, cp, tor_free(cp)); - smartlist_free(text); - tor_free(joined); -} - -static void -test_entry_guard_parse_from_state_broken(void *arg) -{ - (void)arg; - /* Here's a variation on the previous state. Every line but the first is - * busted somehow. */ - const char STATE[] = - /* Okay. */ - "Guard in=default rsa_id=214F44BD5B638E8C817D47FF7C97397790BF0345 " - "nickname=TotallyNinja sampled_on=2016-11-12T19:32:49 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1\n" - /* No selection listed. */ - "Guard rsa_id=052900AB0EA3ED54BAB84AE8A99E74E8693CE2B2 " - "nickname=5OfNovember sampled_on=2016-11-20T04:32:05 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-22T08:13:28 confirmed_idx=0 " - "pb_circ_attempts=4.000000 pb_circ_successes=2.000000 " - "pb_successful_circuits_closed=2.000000\n" - /* Selection is "legacy"!! */ - "Guard in=legacy rsa_id=7B700C0C207EBD0002E00F499BE265519AC3C25A " - "nickname=dc6jgk11 sampled_on=2016-11-28T11:50:13 " - "sampled_by=0.3.0.0-alpha-dev " - "listed=1 confirmed_on=2016-11-24T08:45:30 confirmed_idx=4 " - "pb_circ_attempts=5.000000 pb_circ_successes=5.000000 " - "pb_successful_circuits_closed=5.000000\n"; - - config_line_t *lines = NULL; - or_state_t *state = tor_malloc_zero(sizeof(or_state_t)); - int r = config_get_lines(STATE, &lines, 0); - char *msg = NULL; - - dummy_state = state; - MOCK(get_or_state, - get_or_state_replacement); - - tt_int_op(r, OP_EQ, 0); - tt_assert(lines); - - state->Guard = lines; - - /* First, no-set case. we should get an error. */ - r = entry_guards_parse_state(state, 0, &msg); - tt_int_op(r, OP_LT, 0); - tt_ptr_op(msg, OP_NE, NULL); - /* And we shouldn't have made anything. */ - guard_selection_t *gs_df = - get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); - tt_ptr_op(gs_df, OP_EQ, NULL); - tor_free(msg); - - /* Now see about the set case (which shouldn't happen IRL) */ - r = entry_guards_parse_state(state, 1, &msg); - tt_int_op(r, OP_LT, 0); - tt_ptr_op(msg, OP_NE, NULL); - gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); - tt_ptr_op(gs_df, OP_NE, NULL); - tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 1); - - done: - config_free_lines(lines); - tor_free(state); - tor_free(msg); - UNMOCK(get_or_state); -} - -static void -test_entry_guard_get_guard_selection_by_name(void *arg) -{ - (void)arg; - guard_selection_t *gs1, *gs2, *gs3; - - gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0); - tt_ptr_op(gs1, OP_EQ, NULL); - gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1); - tt_ptr_op(gs1, OP_NE, NULL); - gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1); - tt_assert(gs2 == gs1); - gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0); - tt_assert(gs2 == gs1); - - gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0); - tt_ptr_op(gs2, OP_EQ, NULL); - gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 1); - tt_ptr_op(gs2, OP_NE, NULL); - tt_assert(gs2 != gs1); - gs3 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0); - tt_assert(gs3 == gs2); - - gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0); - tt_ptr_op(gs3, OP_EQ, NULL); - gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 1); - tt_ptr_op(gs3, OP_NE, NULL); - tt_assert(gs3 != gs2); - tt_assert(gs3 != gs1); - tt_assert(gs3 == get_guard_selection_info()); - - done: - entry_guards_free_all(); -} - -static void -test_entry_guard_choose_selection_initial(void *arg) -{ - /* Tests for picking our initial guard selection (based on having had - * no previous selection */ - (void)arg; - guard_selection_type_t type = GS_TYPE_INFER; - const char *name = choose_guard_selection(get_options(), - dummy_consensus, NULL, &type); - tt_str_op(name, OP_EQ, "default"); - tt_int_op(type, OP_EQ, GS_TYPE_NORMAL); - - /* If we're using bridges, we get the bridge selection. */ - get_options_mutable()->UseBridges = 1; - name = choose_guard_selection(get_options(), - dummy_consensus, NULL, &type); - tt_str_op(name, OP_EQ, "bridges"); - tt_int_op(type, OP_EQ, GS_TYPE_BRIDGE); - get_options_mutable()->UseBridges = 0; - - /* If we discard >99% of our guards, though, we should be in the restricted - * set. */ - tt_assert(get_options_mutable()->EntryNodes == NULL); - get_options_mutable()->EntryNodes = routerset_new(); - routerset_parse(get_options_mutable()->EntryNodes, "1.0.0.0/8", "foo"); - name = choose_guard_selection(get_options(), - dummy_consensus, NULL, &type); - tt_str_op(name, OP_EQ, "restricted"); - tt_int_op(type, OP_EQ, GS_TYPE_RESTRICTED); - - done: - ; -} - -static void -test_entry_guard_add_single_guard(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - - /* 1: Add a single guard to the sample. */ - node_t *n1 = smartlist_get(big_fake_net_nodes, 0); - time_t now = approx_time(); - tt_assert(n1->is_possible_guard == 1); - entry_guard_t *g1 = entry_guard_add_to_sample(gs, n1); - tt_assert(g1); - - /* Make sure its fields look right. */ - tt_mem_op(n1->identity, OP_EQ, g1->identity, DIGEST_LEN); - tt_i64_op(g1->sampled_on_date, OP_GE, now - 12*86400); - tt_i64_op(g1->sampled_on_date, OP_LE, now); - tt_str_op(g1->sampled_by_version, OP_EQ, VERSION); - tt_uint_op(g1->currently_listed, OP_EQ, 1); - tt_i64_op(g1->confirmed_on_date, OP_EQ, 0); - tt_int_op(g1->confirmed_idx, OP_EQ, -1); - tt_int_op(g1->last_tried_to_connect, OP_EQ, 0); - tt_uint_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - tt_i64_op(g1->failing_since, OP_EQ, 0); - tt_uint_op(g1->is_filtered_guard, OP_EQ, 1); - tt_uint_op(g1->is_usable_filtered_guard, OP_EQ, 1); - tt_uint_op(g1->is_primary, OP_EQ, 0); - tt_ptr_op(g1->extra_state_fields, OP_EQ, NULL); - - /* Make sure it got added. */ - tt_int_op(1, OP_EQ, smartlist_len(gs->sampled_entry_guards)); - tt_ptr_op(g1, OP_EQ, smartlist_get(gs->sampled_entry_guards, 0)); - tt_ptr_op(g1, OP_EQ, get_sampled_guard_with_id(gs, (uint8_t*)n1->identity)); - const uint8_t bad_id[20] = {0}; - tt_ptr_op(NULL, OP_EQ, get_sampled_guard_with_id(gs, bad_id)); - - done: - guard_selection_free(gs); -} - -static void -test_entry_guard_node_filter(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - bridge_line_t *bl = NULL; - - /* Initialize a bunch of node objects that are all guards. */ -#define NUM 7 - node_t *n[NUM]; - entry_guard_t *g[NUM]; - int i; - for (i=0; i < NUM; ++i) { - n[i] = smartlist_get(big_fake_net_nodes, i*2); // even ones are guards. - g[i] = entry_guard_add_to_sample(gs, n[i]); - - // everything starts out filtered-in - tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1); - tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1); - } - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM); - - /* Make sure refiltering doesn't hurt */ - entry_guards_update_filtered_sets(gs); - for (i = 0; i < NUM; ++i) { - tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1); - tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1); - } - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM); - - /* Now start doing things to make the guards get filtered out, 1 by 1. */ - - /* 0: Not listed. */ - g[0]->currently_listed = 0; - - /* 1: path bias says this guard is maybe eeeevil. */ - g[1]->pb.path_bias_disabled = 1; - - /* 2: Unreachable address. */ - n[2]->rs->addr = 0; - - /* 3: ExcludeNodes */ - n[3]->rs->addr = 0x90902020; - routerset_free(get_options_mutable()->ExcludeNodes); - get_options_mutable()->ExcludeNodes = routerset_new(); - routerset_parse(get_options_mutable()->ExcludeNodes, "144.144.0.0/16", ""); - - /* 4: Bridge. */ - get_options_mutable()->UseBridges = 1; - sweep_bridge_list(); - bl = tor_malloc_zero(sizeof(bridge_line_t)); - tor_addr_from_ipv4h(&bl->addr, n[4]->rs->addr); - bl->port = n[4]->rs->or_port; - memcpy(bl->digest, n[4]->identity, 20); - bridge_add_from_config(bl); - bl = NULL; // prevent free. - get_options_mutable()->UseBridges = 0; - - /* 5: Unreachable. This stays in the filter, but isn't in usable-filtered */ - g[5]->last_tried_to_connect = approx_time(); // prevent retry. - g[5]->is_reachable = GUARD_REACHABLE_NO; - - /* 6: no change. */ - - /* Now refilter and inspect. */ - entry_guards_update_filtered_sets(gs); - for (i = 0; i < NUM; ++i) { - tt_assert(g[i]->is_filtered_guard == (i == 5 || i == 6)); - tt_assert(g[i]->is_usable_filtered_guard == (i == 6)); - } - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 1); - - /* Now make sure we have no live consensus, and no nodes. Nothing should - * pass the filter any more. */ - tor_free(dummy_consensus); - dummy_consensus = NULL; - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, node, { - memset(node->identity, 0xff, 20); - }); - entry_guards_update_filtered_sets(gs); - for (i = 0; i < NUM; ++i) { - tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 0); - tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 0); - } - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 0); - - done: - guard_selection_free(gs); - tor_free(bl); -#undef NUM -} - -static void -test_entry_guard_expand_sample(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - digestmap_t *node_by_id = digestmap_new(); - - entry_guard_t *guard = entry_guards_expand_sample(gs); - tt_assert(guard); // the last guard returned. - - // Every sampled guard here should be filtered and reachable for now. - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - - /* Make sure we got the right number. */ - tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - - // Make sure everything we got was from our fake node list, and everything - // was unique. - SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, g) { - const node_t *n = bfn_mock_node_get_by_id(g->identity); - tt_assert(n); - tt_ptr_op(NULL, OP_EQ, digestmap_get(node_by_id, g->identity)); - digestmap_set(node_by_id, g->identity, (void*) n); - int idx = smartlist_pos(big_fake_net_nodes, n); - // The even ones are the guards; make sure we got guards. - tt_int_op(idx & 1, OP_EQ, 0); - } SMARTLIST_FOREACH_END(g); - - // Nothing became unusable/unfiltered, so a subsequent expand should - // make no changes. - guard = entry_guards_expand_sample(gs); - tt_ptr_op(guard, OP_EQ, NULL); // no guard was added. - tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - - // Make a few guards unreachable. - guard = smartlist_get(gs->sampled_entry_guards, 0); - guard->is_usable_filtered_guard = 0; - guard = smartlist_get(gs->sampled_entry_guards, 1); - guard->is_usable_filtered_guard = 0; - guard = smartlist_get(gs->sampled_entry_guards, 2); - guard->is_usable_filtered_guard = 0; - tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE - 3, OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - - // This time, expanding the sample will add some more guards. - guard = entry_guards_expand_sample(gs); - tt_assert(guard); // no guard was added. - tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, - num_reachable_filtered_guards(gs, NULL)+3); - - // Still idempotent. - guard = entry_guards_expand_sample(gs); - tt_ptr_op(guard, OP_EQ, NULL); // no guard was added. - tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ, - num_reachable_filtered_guards(gs, NULL)); - - // Now, do a nasty trick: tell the filter to exclude 31/32 of the guards. - // This will cause the sample size to get reeeeally huge, while the - // filtered sample size grows only slowly. - routerset_free(get_options_mutable()->ExcludeNodes); - get_options_mutable()->ExcludeNodes = routerset_new(); - routerset_parse(get_options_mutable()->ExcludeNodes, "144.144.0.0/16", ""); - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { - if (n_sl_idx % 64 != 0) { - n->rs->addr = 0x90903030; - } - }); - entry_guards_update_filtered_sets(gs); - - // Surely (p ~ 1-2**-60), one of our guards has been excluded. - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_LT, - DFLT_MIN_FILTERED_SAMPLE_SIZE); - - // Try to regenerate the guards. - guard = entry_guards_expand_sample(gs); - tt_assert(guard); // no guard was added. - - /* this time, it's possible that we didn't add enough sampled guards. */ - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_LE, - DFLT_MIN_FILTERED_SAMPLE_SIZE); - /* but we definitely didn't exceed the sample maximum. */ - const int n_guards = 271 / 2; - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_LE, - (int)(n_guards * .3)); - - done: - guard_selection_free(gs); - digestmap_free(node_by_id, NULL); -} - -static void -test_entry_guard_expand_sample_small_net(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - - /* Fun corner case: not enough guards to make up our whole sample size. */ - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, { - if (n_sl_idx >= 15) { - tor_free(n->rs); - tor_free(n->md); - tor_free(n); - SMARTLIST_DEL_CURRENT(big_fake_net_nodes, n); - } else { - n->rs->addr = 0; // make the filter reject this. - } - }); - - entry_guard_t *guard = entry_guards_expand_sample(gs); - tt_assert(guard); // the last guard returned -- some guard was added. - // half the nodes are guards, so we have 8 guards left. The set - // is small, so we sampled everything. - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, 8); - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 0); - done: - guard_selection_free(gs); -} - -static void -test_entry_guard_update_from_consensus_status(void *arg) -{ - /* Here we're going to have some nodes become un-guardy, and say we got a - * new consensus. This should cause those nodes to get detected as - * unreachable. */ - - (void)arg; - int i; - time_t start = approx_time(); - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - networkstatus_t *ns_tmp = NULL; - - /* Don't randomly backdate stuff; it will make correctness harder to check.*/ - MOCK(randomize_time, mock_randomize_time_no_randomization); - - /* First, sample some guards. */ - entry_guards_expand_sample(gs); - int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); - int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); - tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); - tt_i64_op(n_sampled_pre, OP_GT, 10); - - /* At this point, it should be a no-op to do this: */ - sampled_guards_update_from_consensus(gs); - - /* Now let's make some of our guards become unlisted. The easiest way to - * do that would be to take away their guard flag. */ - for (i = 0; i < 5; ++i) { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - n->is_possible_guard = 0; - } - - update_approx_time(start + 30); - { - /* try this with no live networkstatus. Nothing should happen! */ - ns_tmp = dummy_consensus; - dummy_consensus = NULL; - sampled_guards_update_from_consensus(gs); - tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); - tt_i64_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre); - /* put the networkstatus back. */ - dummy_consensus = ns_tmp; - ns_tmp = NULL; - } - - /* Now those guards should become unlisted, and drop off the filter, but - * stay in the sample. */ - update_approx_time(start + 60); - sampled_guards_update_from_consensus(gs); - - tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); - tt_i64_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre-5); - for (i = 0; i < 5; ++i) { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - tt_assert(! g->currently_listed); - tt_i64_op(g->unlisted_since_date, OP_EQ, start+60); - } - for (i = 5; i < n_sampled_pre; ++i) { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - tt_assert(g->currently_listed); - tt_i64_op(g->unlisted_since_date, OP_EQ, 0); - } - - /* Now re-list one, and remove one completely. */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - n->is_possible_guard = 1; - } - { - /* try removing the node, to make sure we don't crash on an absent node - */ - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 5); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - smartlist_remove(big_fake_net_nodes, n); - tor_free(n->rs); - tor_free(n->md); - tor_free(n); - } - update_approx_time(start + 300); - sampled_guards_update_from_consensus(gs); - - /* guards 1..5 are now unlisted; 0,6,7.. are listed. */ - tt_i64_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); - for (i = 1; i < 6; ++i) { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - tt_assert(! g->currently_listed); - if (i == 5) - tt_i64_op(g->unlisted_since_date, OP_EQ, start+300); - else - tt_i64_op(g->unlisted_since_date, OP_EQ, start+60); - } - for (i = 0; i < n_sampled_pre; i = (!i) ? 6 : i+1) { /* 0,6,7,8, ... */ - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - tt_assert(g->currently_listed); - tt_i64_op(g->unlisted_since_date, OP_EQ, 0); - } - - done: - tor_free(ns_tmp); /* in case we couldn't put it back */ - guard_selection_free(gs); - UNMOCK(randomize_time); -} - -static void -test_entry_guard_update_from_consensus_repair(void *arg) -{ - /* Here we'll make sure that our code to repair the unlisted-since - * times is correct. */ - - (void)arg; - int i; - time_t start = approx_time(); - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - - /* Don't randomly backdate stuff; it will make correctness harder to check.*/ - MOCK(randomize_time, mock_randomize_time_no_randomization); - - /* First, sample some guards. */ - entry_guards_expand_sample(gs); - int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); - int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); - tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); - tt_i64_op(n_sampled_pre, OP_GT, 10); - - /* Now corrupt the list a bit. Call some unlisted-since-never, and some - * listed-and-unlisted-since-a-time. */ - update_approx_time(start + 300); - for (i = 0; i < 3; ++i) { - /* these will get a date. */ - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - n->is_possible_guard = 0; - g->currently_listed = 0; - } - for (i = 3; i < 6; ++i) { - /* these will become listed. */ - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - g->unlisted_since_date = start+100; - } - setup_full_capture_of_logs(LOG_WARN); - sampled_guards_update_from_consensus(gs); - expect_log_msg_containing( - "was listed, but with unlisted_since_date set"); - expect_log_msg_containing( - "was unlisted, but with unlisted_since_date unset"); - teardown_capture_of_logs(); - - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre); - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_filtered_pre-3); - for (i = 3; i < n_sampled_pre; ++i) { - /* these will become listed. */ - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i); - if (i < 3) { - tt_assert(! g->currently_listed); - tt_i64_op(g->unlisted_since_date, OP_EQ, start+300); - } else { - tt_assert(g->currently_listed); - tt_i64_op(g->unlisted_since_date, OP_EQ, 0); - } - } - - done: - teardown_capture_of_logs(); - guard_selection_free(gs); - UNMOCK(randomize_time); -} - -static void -test_entry_guard_update_from_consensus_remove(void *arg) -{ - /* Now let's check the logic responsible for removing guards from the - * sample entirely. */ - - (void)arg; - //int i; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - smartlist_t *keep_ids = smartlist_new(); - smartlist_t *remove_ids = smartlist_new(); - - /* Don't randomly backdate stuff; it will make correctness harder to check.*/ - MOCK(randomize_time, mock_randomize_time_no_randomization); - - /* First, sample some guards. */ - entry_guards_expand_sample(gs); - int n_sampled_pre = smartlist_len(gs->sampled_entry_guards); - int n_filtered_pre = num_reachable_filtered_guards(gs, NULL); - tt_i64_op(n_sampled_pre, OP_EQ, n_filtered_pre); - tt_i64_op(n_sampled_pre, OP_GT, 10); - - const time_t one_day_ago = approx_time() - 1*24*60*60; - const time_t one_year_ago = approx_time() - 365*24*60*60; - const time_t two_years_ago = approx_time() - 2*365*24*60*60; - /* 0: unlisted for a day. (keep this) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - n->is_possible_guard = 0; - g->currently_listed = 0; - g->unlisted_since_date = one_day_ago; - smartlist_add(keep_ids, tor_memdup(g->identity, 20)); - } - /* 1: unlisted for a year. (remove this) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 1); - node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity); - n->is_possible_guard = 0; - g->currently_listed = 0; - g->unlisted_since_date = one_year_ago; - smartlist_add(remove_ids, tor_memdup(g->identity, 20)); - } - /* 2: added a day ago, never confirmed. (keep this) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 2); - g->sampled_on_date = one_day_ago; - smartlist_add(keep_ids, tor_memdup(g->identity, 20)); - } - /* 3: added a year ago, never confirmed. (remove this) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 3); - g->sampled_on_date = one_year_ago; - smartlist_add(remove_ids, tor_memdup(g->identity, 20)); - } - /* 4: added two year ago, confirmed yesterday, primary. (keep this.) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 4); - g->sampled_on_date = one_year_ago; - g->confirmed_on_date = one_day_ago; - g->confirmed_idx = 0; - g->is_primary = 1; - smartlist_add(gs->confirmed_entry_guards, g); - smartlist_add(gs->primary_entry_guards, g); - smartlist_add(keep_ids, tor_memdup(g->identity, 20)); - } - /* 5: added two years ago, confirmed a year ago, primary. (remove this) */ - { - entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 5); - g->sampled_on_date = two_years_ago; - g->confirmed_on_date = one_year_ago; - g->confirmed_idx = 1; - g->is_primary = 1; - smartlist_add(gs->confirmed_entry_guards, g); - smartlist_add(gs->primary_entry_guards, g); - smartlist_add(remove_ids, tor_memdup(g->identity, 20)); - } - - sampled_guards_update_from_consensus(gs); - - /* Did we remove the right ones? */ - SMARTLIST_FOREACH(keep_ids, uint8_t *, id, { - tt_assert(get_sampled_guard_with_id(gs, id) != NULL); - }); - SMARTLIST_FOREACH(remove_ids, uint8_t *, id, { - tt_want(get_sampled_guard_with_id(gs, id) == NULL); - }); - - /* Did we remove the right number? */ - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_sampled_pre - 3); - - done: - guard_selection_free(gs); - UNMOCK(randomize_time); - SMARTLIST_FOREACH(keep_ids, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(remove_ids, char *, cp, tor_free(cp)); - smartlist_free(keep_ids); - smartlist_free(remove_ids); -} - -static void -test_entry_guard_confirming_guards(void *arg) -{ - (void)arg; - /* Now let's check the logic responsible for manipulating the list - * of confirmed guards */ - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - MOCK(randomize_time, mock_randomize_time_no_randomization); - - /* Create the sample. */ - entry_guards_expand_sample(gs); - - /* Confirm a few guards. */ - time_t start = approx_time(); - entry_guard_t *g1 = smartlist_get(gs->sampled_entry_guards, 0); - entry_guard_t *g2 = smartlist_get(gs->sampled_entry_guards, 1); - entry_guard_t *g3 = smartlist_get(gs->sampled_entry_guards, 8); - make_guard_confirmed(gs, g2); - update_approx_time(start + 10); - make_guard_confirmed(gs, g1); - make_guard_confirmed(gs, g3); - - /* Were the correct dates and indices fed in? */ - tt_int_op(g1->confirmed_idx, OP_EQ, 1); - tt_int_op(g2->confirmed_idx, OP_EQ, 0); - tt_int_op(g3->confirmed_idx, OP_EQ, 2); - tt_i64_op(g1->confirmed_on_date, OP_EQ, start+10); - tt_i64_op(g2->confirmed_on_date, OP_EQ, start); - tt_i64_op(g3->confirmed_on_date, OP_EQ, start+10); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 0), OP_EQ, g2); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 1), OP_EQ, g1); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 2), OP_EQ, g3); - - /* Now make sure we can regenerate the confirmed_entry_guards list. */ - smartlist_clear(gs->confirmed_entry_guards); - g2->confirmed_idx = 0; - g1->confirmed_idx = 10; - g3->confirmed_idx = 100; - entry_guards_update_confirmed(gs); - tt_int_op(g1->confirmed_idx, OP_EQ, 1); - tt_int_op(g2->confirmed_idx, OP_EQ, 0); - tt_int_op(g3->confirmed_idx, OP_EQ, 2); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 0), OP_EQ, g2); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 1), OP_EQ, g1); - tt_ptr_op(smartlist_get(gs->confirmed_entry_guards, 2), OP_EQ, g3); - - /* Now make sure we can regenerate the confirmed_entry_guards list if - * the indices are messed up. */ - g1->confirmed_idx = g2->confirmed_idx = g3->confirmed_idx = 999; - smartlist_clear(gs->confirmed_entry_guards); - entry_guards_update_confirmed(gs); - tt_int_op(g1->confirmed_idx, OP_GE, 0); - tt_int_op(g2->confirmed_idx, OP_GE, 0); - tt_int_op(g3->confirmed_idx, OP_GE, 0); - tt_int_op(g1->confirmed_idx, OP_LE, 2); - tt_int_op(g2->confirmed_idx, OP_LE, 2); - tt_int_op(g3->confirmed_idx, OP_LE, 2); - g1 = smartlist_get(gs->confirmed_entry_guards, 0); - g2 = smartlist_get(gs->confirmed_entry_guards, 1); - g3 = smartlist_get(gs->confirmed_entry_guards, 2); - tt_int_op(g1->confirmed_idx, OP_EQ, 0); - tt_int_op(g2->confirmed_idx, OP_EQ, 1); - tt_int_op(g3->confirmed_idx, OP_EQ, 2); - tt_assert(g1 != g2); - tt_assert(g1 != g3); - tt_assert(g2 != g3); - - done: - UNMOCK(randomize_time); - guard_selection_free(gs); -} - -static void -test_entry_guard_sample_reachable_filtered(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - entry_guards_expand_sample(gs); - const int N = 10000; - bitarray_t *selected = NULL; - int i, j; - - /* We've got a sampled list now; let's make one non-usable-filtered; some - * confirmed, some primary, some pending. - */ - int n_guards = smartlist_len(gs->sampled_entry_guards); - tt_int_op(n_guards, OP_GT, 10); - entry_guard_t *g; - g = smartlist_get(gs->sampled_entry_guards, 0); - g->is_pending = 1; - g = smartlist_get(gs->sampled_entry_guards, 1); - make_guard_confirmed(gs, g); - g = smartlist_get(gs->sampled_entry_guards, 2); - g->is_primary = 1; - g = smartlist_get(gs->sampled_entry_guards, 3); - g->pb.path_bias_disabled = 1; - - entry_guards_update_filtered_sets(gs); - gs->primary_guards_up_to_date = 1; - tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, n_guards - 1); - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_guards); - - // +1 since the one we made disabled will make another one get added. - ++n_guards; - - /* Try a bunch of selections. */ - const struct { - int flag; int idx; - } tests[] = { - { 0, -1 }, - { SAMPLE_EXCLUDE_CONFIRMED, 1 }, - { SAMPLE_EXCLUDE_PRIMARY|SAMPLE_NO_UPDATE_PRIMARY, 2 }, - { SAMPLE_EXCLUDE_PENDING, 0 }, - { -1, -1}, - }; - - for (j = 0; tests[j].flag >= 0; ++j) { - selected = bitarray_init_zero(n_guards); - const int excluded_flags = tests[j].flag; - const int excluded_idx = tests[j].idx; - for (i = 0; i < N; ++i) { - g = sample_reachable_filtered_entry_guards(gs, NULL, excluded_flags); - tor_assert(g); - int pos = smartlist_pos(gs->sampled_entry_guards, g); - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, n_guards); - tt_int_op(pos, OP_GE, 0); - tt_int_op(pos, OP_LT, n_guards); - bitarray_set(selected, pos); - } - for (i = 0; i < n_guards; ++i) { - const int should_be_set = (i != excluded_idx && - i != 3); // filtered out. - tt_int_op(!!bitarray_is_set(selected, i), OP_EQ, should_be_set); - } - bitarray_free(selected); - selected = NULL; - } - - done: - guard_selection_free(gs); - bitarray_free(selected); -} - -static void -test_entry_guard_sample_reachable_filtered_empty(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - /* What if we try to sample from a set of 0? */ - SMARTLIST_FOREACH(big_fake_net_nodes, node_t *, n, - n->is_possible_guard = 0); - - entry_guard_t *g = sample_reachable_filtered_entry_guards(gs, NULL, 0); - tt_ptr_op(g, OP_EQ, NULL); - - done: - guard_selection_free(gs); -} - -static void -test_entry_guard_retry_unreachable(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - - entry_guards_expand_sample(gs); - /* Let's say that we have two guards, and they're down. - */ - time_t start = approx_time(); - entry_guard_t *g1 = smartlist_get(gs->sampled_entry_guards, 0); - entry_guard_t *g2 = smartlist_get(gs->sampled_entry_guards, 1); - entry_guard_t *g3 = smartlist_get(gs->sampled_entry_guards, 2); - g1->is_reachable = GUARD_REACHABLE_NO; - g2->is_reachable = GUARD_REACHABLE_NO; - g1->is_primary = 1; - g1->failing_since = g2->failing_since = start; - g1->last_tried_to_connect = g2->last_tried_to_connect = start; - - /* Wait 5 minutes. Nothing will get retried. */ - update_approx_time(start + 5 * 60); - entry_guard_consider_retry(g1); - entry_guard_consider_retry(g2); - entry_guard_consider_retry(g3); // just to make sure this doesn't crash. - tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - tt_int_op(g3->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - /* After 30 min, the primary one gets retried */ - update_approx_time(start + 35 * 60); - entry_guard_consider_retry(g1); - entry_guard_consider_retry(g2); - tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - - g1->is_reachable = GUARD_REACHABLE_NO; - g1->last_tried_to_connect = start + 55*60; - - /* After 1 hour, we'll retry the nonprimary one. */ - update_approx_time(start + 61 * 60); - entry_guard_consider_retry(g1); - entry_guard_consider_retry(g2); - tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - g2->is_reachable = GUARD_REACHABLE_NO; - g2->last_tried_to_connect = start + 61*60; - - /* And then the primary one again. */ - update_approx_time(start + 66 * 60); - entry_guard_consider_retry(g1); - entry_guard_consider_retry(g2); - tt_int_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - - done: - guard_selection_free(gs); -} - -static void -test_entry_guard_manage_primary(void *arg) -{ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - smartlist_t *prev_guards = smartlist_new(); - - /* If no guards are confirmed, we should pick a few reachable guards and - * call them all primary. But not confirmed.*/ - entry_guards_update_primary(gs); - int n_primary = smartlist_len(gs->primary_entry_guards); - tt_int_op(n_primary, OP_GE, 1); - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { - tt_assert(g->is_primary); - tt_assert(g->confirmed_idx == -1); - }); - - /* Calling it a second time should leave the guards unchanged. */ - smartlist_add_all(prev_guards, gs->primary_entry_guards); - entry_guards_update_primary(gs); - tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { - tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx)); - }); - - /* If we have one confirmed guard, that guards becomes the first primary - * guard, and the other primary guards get kept. */ - - /* find a non-primary guard... */ - entry_guard_t *confirmed = NULL; - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, g, { - if (! g->is_primary) { - confirmed = g; - break; - } - }); - tt_assert(confirmed); - /* make it confirmed. */ - make_guard_confirmed(gs, confirmed); - /* update the list... */ - smartlist_clear(prev_guards); - smartlist_add_all(prev_guards, gs->primary_entry_guards); - entry_guards_update_primary(gs); - - /* and see what's primary now! */ - tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); - tt_ptr_op(smartlist_get(gs->primary_entry_guards, 0), OP_EQ, confirmed); - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { - tt_assert(g->is_primary); - if (g_sl_idx == 0) - continue; - tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx - 1)); - }); - { - entry_guard_t *prev_last_guard = smartlist_get(prev_guards, n_primary-1); - tt_assert(! prev_last_guard->is_primary); - } - - /* Calling it a fourth time should leave the guards unchanged. */ - smartlist_clear(prev_guards); - smartlist_add_all(prev_guards, gs->primary_entry_guards); - entry_guards_update_primary(gs); - tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, n_primary); - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, g, { - tt_ptr_op(g, OP_EQ, smartlist_get(prev_guards, g_sl_idx)); - }); - - /* Do some dirinfo checks */ - { - /* Check that we have all required dirinfo for the primaries (that's done - * in big_fake_network_setup()) */ - char *dir_info_str = - guard_selection_get_err_str_if_dir_info_missing(gs, 0, 0, 0); - tt_assert(!dir_info_str); - - /* Now artificially remove the first primary's descriptor and re-check */ - entry_guard_t *first_primary; - first_primary = smartlist_get(gs->primary_entry_guards, 0); - /* Change the first primary's identity digest so that the mocked functions - * can't find its descriptor */ - memset(first_primary->identity, 9, sizeof(first_primary->identity)); - dir_info_str =guard_selection_get_err_str_if_dir_info_missing(gs, 1, 2, 3); - tt_str_op(dir_info_str, OP_EQ, - "We're missing descriptors for 1/2 of our primary entry guards " - "(total microdescriptors: 2/3)."); - tor_free(dir_info_str); - } - - done: - guard_selection_free(gs); - smartlist_free(prev_guards); -} - -static void -test_entry_guard_guard_preferred(void *arg) -{ - (void) arg; - entry_guard_t *g1 = tor_malloc_zero(sizeof(entry_guard_t)); - entry_guard_t *g2 = tor_malloc_zero(sizeof(entry_guard_t)); - - g1->confirmed_idx = g2->confirmed_idx = -1; - g1->last_tried_to_connect = approx_time(); - g2->last_tried_to_connect = approx_time(); - - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g1)); - - /* Neither is pending; priorities equal. */ - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - - /* If one is pending, the pending one has higher priority */ - g1->is_pending = 1; - tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - - /* If both are pending, and last_tried_to_connect is equal: - priorities equal */ - g2->is_pending = 1; - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - - /* One had a connection that startied earlier: it has higher priority. */ - g2->last_tried_to_connect -= 10; - tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - - /* Now, say that g1 is confirmed. It will get higher priority. */ - g1->confirmed_idx = 5; - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - - /* But if g2 was confirmed first, it will get priority */ - g2->confirmed_idx = 2; - tt_int_op(1, OP_EQ, entry_guard_has_higher_priority(g2, g1)); - tt_int_op(0, OP_EQ, entry_guard_has_higher_priority(g1, g2)); - - done: - tor_free(g1); - tor_free(g2); -} - -static void -test_entry_guard_select_for_circuit_no_confirmed(void *arg) -{ - /* Simpler cases: no gaurds are confirmed yet. */ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - entry_guard_restriction_t *rst = NULL; - - /* simple starting configuration */ - entry_guards_update_primary(gs); - unsigned state = 9999; - - entry_guard_t *g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, - NULL, &state); - - tt_assert(g); - tt_assert(g->is_primary); - tt_int_op(g->confirmed_idx, OP_EQ, -1); - tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending. - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); - - // If we do that again, we should get the same guard. - entry_guard_t *g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, - NULL, &state); - tt_ptr_op(g2, OP_EQ, g); - - // if we mark that guard down, we should get a different primary guard. - // auto-retry it. - g->is_reachable = GUARD_REACHABLE_NO; - g->failing_since = approx_time() - 10; - g->last_tried_to_connect = approx_time() - 10; - state = 9999; - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_ptr_op(g2, OP_NE, g); - tt_assert(g2); - tt_assert(g2->is_primary); - tt_int_op(g2->confirmed_idx, OP_EQ, -1); - tt_uint_op(g2->is_pending, OP_EQ, 0); // primary implies non-pending. - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); - - // If we say that the first primary guard was last tried a long time ago, we - // should get an automatic retry on it. - g->failing_since = approx_time() - 72*60*60; - g->last_tried_to_connect = approx_time() - 72*60*60; - state = 9999; - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_ptr_op(g2, OP_EQ, g); - tt_assert(g2); - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - // And if we mark ALL the primary guards down, we should get another guard - // at random. - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { - guard->is_reachable = GUARD_REACHABLE_NO; - guard->last_tried_to_connect = approx_time() - 5; - guard->failing_since = approx_time() - 30; - }); - state = 9999; - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_assert(g2); - tt_assert(!g2->is_primary); - tt_int_op(g2->confirmed_idx, OP_EQ, -1); - tt_uint_op(g2->is_pending, OP_EQ, 1); - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); - tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - - // As a bonus, maybe we should be retrying the primary guards. Let's say so. - mark_primary_guards_maybe_reachable(gs); - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { - tt_int_op(guard->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - tt_assert(guard->is_usable_filtered_guard == 1); - // no change to these fields. - tt_i64_op(guard->last_tried_to_connect, OP_EQ, approx_time() - 5); - tt_i64_op(guard->failing_since, OP_EQ, approx_time() - 30); - }); - - /* Let's try again and we should get the first primary guard again */ - g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_ptr_op(g, OP_EQ, smartlist_get(gs->primary_entry_guards, 0)); - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_ptr_op(g2, OP_EQ, g); - - /* But if we impose a restriction, we don't get the same guard */ - rst = guard_create_exit_restriction((uint8_t*)g->identity); - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); - tt_ptr_op(g2, OP_NE, g); - - done: - guard_selection_free(gs); - entry_guard_restriction_free(rst); -} - -static void -test_entry_guard_select_for_circuit_confirmed(void *arg) -{ - /* Case 2: if all the primary guards are down, and there are more confirmed - guards, we use a confirmed guard. */ - (void)arg; - int i; - entry_guard_restriction_t *rst = NULL; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - const int N_CONFIRMED = 10; - - /* slightly more complicated simple starting configuration */ - entry_guards_update_primary(gs); - for (i = 0; i < N_CONFIRMED; ++i) { - entry_guard_t *guard = smartlist_get(gs->sampled_entry_guards, i); - make_guard_confirmed(gs, guard); - } - entry_guards_update_primary(gs); // rebuild the primary list. - - unsigned state = 9999; - - // As above, this gives us a primary guard. - entry_guard_t *g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, - NULL, &state); - tt_assert(g); - tt_assert(g->is_primary); - tt_int_op(g->confirmed_idx, OP_EQ, 0); - tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending. - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); - tt_ptr_op(g, OP_EQ, smartlist_get(gs->primary_entry_guards, 0)); - - // But if we mark all the primary guards down... - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, guard, { - guard->last_tried_to_connect = approx_time(); - entry_guards_note_guard_failure(gs, guard); - }); - - // ... we should get a confirmed guard. - state = 9999; - g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_assert(g); - tt_assert(! g->is_primary); - tt_int_op(g->confirmed_idx, OP_EQ, smartlist_len(gs->primary_entry_guards)); - tt_assert(g->is_pending); - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time()); - - // And if we try again, we should get a different confirmed guard, since - // that one is pending. - state = 9999; - entry_guard_t *g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, - NULL, &state); - tt_assert(g2); - tt_assert(! g2->is_primary); - tt_ptr_op(g2, OP_NE, g); - tt_int_op(g2->confirmed_idx, OP_EQ, - smartlist_len(gs->primary_entry_guards)+1); - tt_assert(g2->is_pending); - tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time()); - - // If we say that the next confirmed guard in order is excluded, and - // we disable EnforceDistinctSubnets, we get the guard AFTER the - // one we excluded. - get_options_mutable()->EnforceDistinctSubnets = 0; - g = smartlist_get(gs->confirmed_entry_guards, - smartlist_len(gs->primary_entry_guards)+2); - rst = guard_create_exit_restriction((uint8_t*)g->identity); - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); - tt_ptr_op(g2, OP_NE, NULL); - tt_ptr_op(g2, OP_NE, g); - tt_int_op(g2->confirmed_idx, OP_EQ, - smartlist_len(gs->primary_entry_guards)+3); - - // If we make every confirmed guard become pending then we start poking - // other guards. - const int n_remaining_confirmed = - N_CONFIRMED - 3 - smartlist_len(gs->primary_entry_guards); - for (i = 0; i < n_remaining_confirmed; ++i) { - g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_int_op(g->confirmed_idx, OP_GE, 0); - tt_assert(g); - } - state = 9999; - g = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &state); - tt_assert(g); - tt_assert(g->is_pending); - tt_int_op(g->confirmed_idx, OP_EQ, -1); - - // If we EnforceDistinctSubnets and apply a restriction, we get - // nothing, since we put all of the nodes in the same /16. - // Regression test for bug 22753/TROVE-2017-006. - get_options_mutable()->EnforceDistinctSubnets = 1; - g = smartlist_get(gs->confirmed_entry_guards, 0); - memcpy(rst->exclude_id, g->identity, DIGEST_LEN); - g2 = select_entry_guard_for_circuit(gs, GUARD_USAGE_TRAFFIC, rst, &state); - tt_ptr_op(g2, OP_EQ, NULL); - - done: - guard_selection_free(gs); - entry_guard_restriction_free(rst); -} - -static void -test_entry_guard_select_for_circuit_highlevel_primary(void *arg) -{ - /* Play around with selecting primary guards for circuits and markign - * them up and down */ - (void)arg; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - - time_t start = approx_time(); - - const node_t *node = NULL; - circuit_guard_state_t *guard = NULL; - entry_guard_t *g; - guard_usable_t u; - /* - * Make sure that the pick-for-circuit API basically works. We'll get - * a primary guard, so it'll be usable on completion. - */ - int r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - - tt_int_op(r, OP_EQ, 0); - tt_assert(node); - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); - tt_int_op(g->is_primary, OP_EQ, 1); - tt_i64_op(g->last_tried_to_connect, OP_EQ, start); - tt_int_op(g->confirmed_idx, OP_EQ, -1); - - /* Call that circuit successful. */ - update_approx_time(start+15); - u = entry_guard_succeeded(&guard); - tt_int_op(u, OP_EQ, GUARD_USABLE_NOW); /* We can use it now. */ - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_YES); - tt_int_op(g->confirmed_idx, OP_EQ, 0); - - circuit_guard_state_free(guard); - guard = NULL; - node = NULL; - g = NULL; - - /* Try again. We'll also get a primary guard this time. (The same one, - in fact.) But this time, we'll say the connection has failed. */ - update_approx_time(start+35); - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_int_op(r, OP_EQ, 0); - tt_assert(node); - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - tt_i64_op(guard->state_set_at, OP_EQ, start+35); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); - tt_int_op(g->is_primary, OP_EQ, 1); - tt_i64_op(g->last_tried_to_connect, OP_EQ, start+35); - tt_int_op(g->confirmed_idx, OP_EQ, 0); // same one. - - /* It's failed! What will happen to our poor guard? */ - update_approx_time(start+45); - entry_guard_failed(&guard); - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_DEAD); - tt_i64_op(guard->state_set_at, OP_EQ, start+45); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - tt_i64_op(g->failing_since, OP_EQ, start+45); - tt_int_op(g->confirmed_idx, OP_EQ, 0); // still confirmed. - - circuit_guard_state_free(guard); - guard = NULL; - node = NULL; - entry_guard_t *g_prev = g; - g = NULL; - - /* Now try a third time. Since the other one is down, we'll get a different - * (still primary) guard. - */ - update_approx_time(start+60); - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_int_op(r, OP_EQ, 0); - tt_assert(node); - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_ptr_op(g, OP_NE, g_prev); - tt_mem_op(g->identity, OP_EQ, node->identity, DIGEST_LEN); - tt_mem_op(g->identity, OP_NE, g_prev->identity, DIGEST_LEN); - tt_int_op(g->is_primary, OP_EQ, 1); - tt_i64_op(g->last_tried_to_connect, OP_EQ, start+60); - tt_int_op(g->confirmed_idx, OP_EQ, -1); // not confirmd now. - - /* Call this one up; watch it get confirmed. */ - update_approx_time(start+90); - u = entry_guard_succeeded(&guard); - tt_int_op(u, OP_EQ, GUARD_USABLE_NOW); - tt_assert(guard); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_YES); - tt_int_op(g->confirmed_idx, OP_EQ, 1); - - done: - guard_selection_free(gs); - circuit_guard_state_free(guard); -} - -static void -test_entry_guard_select_for_circuit_highlevel_confirm_other(void *arg) -{ - (void) arg; - const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; - - /* At the start, we have no confirmed guards. We'll mark the primary guards - * down, then confirm something else. As soon as we do, it should become - * primary, and we should get it next time. */ - - time_t start = approx_time(); - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - circuit_guard_state_t *guard = NULL; - int i, r; - const node_t *node = NULL; - guard_usable_t u; - - /* Declare that we're on the internet. */ - entry_guards_note_internet_connectivity(gs); - - /* Primary guards are down! */ - for (i = 0; i < N_PRIMARY; ++i) { - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_assert(node); - tt_assert(guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - entry_guard_failed(&guard); - circuit_guard_state_free(guard); - guard = NULL; - node = NULL; - } - - /* Next guard should be non-primary. */ - node = NULL; - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_assert(node); - tt_assert(guard); - tt_int_op(r, OP_EQ, 0); - entry_guard_t *g = entry_guard_handle_get(guard->guard); - tt_assert(g); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - tt_int_op(g->confirmed_idx, OP_EQ, -1); - tt_int_op(g->is_primary, OP_EQ, 0); - tt_int_op(g->is_pending, OP_EQ, 1); - (void)start; - - u = entry_guard_succeeded(&guard); - /* We're on the internet (by fiat), so this guard will get called "confirmed" - * and should immediately become primary. - */ - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - tt_assert(u == GUARD_USABLE_NOW); - tt_int_op(g->confirmed_idx, OP_EQ, 0); - tt_int_op(g->is_primary, OP_EQ, 1); - tt_int_op(g->is_pending, OP_EQ, 0); - - done: - guard_selection_free(gs); - circuit_guard_state_free(guard); -} - -static void -test_entry_guard_select_for_circuit_highlevel_primary_retry(void *arg) -{ - (void) arg; - const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; - - /* At the start, we have no confirmed guards. We'll mark the primary guards - * down, then confirm something else. As soon as we do, it should become - * primary, and we should get it next time. */ - - time_t start = approx_time(); - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - circuit_guard_state_t *guard = NULL, *guard2 = NULL; - int i, r; - const node_t *node = NULL; - entry_guard_t *g; - guard_usable_t u; - - /* Declare that we're on the internet. */ - entry_guards_note_internet_connectivity(gs); - - /* Make primary guards confirmed (so they won't be superseded by a later - * guard), then mark them down. */ - for (i = 0; i < N_PRIMARY; ++i) { - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_assert(node); - tt_assert(guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - g = entry_guard_handle_get(guard->guard); - make_guard_confirmed(gs, g); - tt_int_op(g->is_primary, OP_EQ, 1); - entry_guard_failed(&guard); - circuit_guard_state_free(guard); - tt_int_op(g->is_reachable, OP_EQ, GUARD_REACHABLE_NO); - guard = NULL; - node = NULL; - } - - /* Get another guard that we might try. */ - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_assert(node); - tt_assert(guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - g = entry_guard_handle_get(guard->guard); - tt_int_op(g->is_primary, OP_EQ, 0); - - tt_assert(entry_guards_all_primary_guards_are_down(gs)); - - /* And an hour has passed ... */ - update_approx_time(start + 3600); - - /* Say that guard has succeeded! */ - u = entry_guard_succeeded(&guard); - tt_int_op(u, OP_EQ, GUARD_MAYBE_USABLE_LATER); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); - g = entry_guard_handle_get(guard->guard); - - /* The primary guards should have been marked up! */ - SMARTLIST_FOREACH(gs->primary_entry_guards, entry_guard_t *, pg, { - tt_int_op(pg->is_primary, OP_EQ, 1); - tt_ptr_op(g, OP_NE, pg); - tt_int_op(pg->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE); - }); - - /* Have a circuit to a primary guard succeed. */ - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard2); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard2->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - u = entry_guard_succeeded(&guard2); - tt_assert(u == GUARD_USABLE_NOW); - tt_int_op(guard2->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - - tt_assert(! entry_guards_all_primary_guards_are_down(gs)); - - done: - guard_selection_free(gs); - circuit_guard_state_free(guard); - circuit_guard_state_free(guard2); -} - -static void -test_entry_guard_select_and_cancel(void *arg) -{ - (void) arg; - const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; - int i,r; - const node_t *node = NULL; - circuit_guard_state_t *guard; - guard_selection_t *gs = guard_selection_new("default", GS_TYPE_NORMAL); - entry_guard_t *g; - - /* Once more, we mark all the primary guards down. */ - entry_guards_note_internet_connectivity(gs); - for (i = 0; i < N_PRIMARY; ++i) { - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION); - g = entry_guard_handle_get(guard->guard); - tt_int_op(g->is_primary, OP_EQ, 1); - tt_int_op(g->is_pending, OP_EQ, 0); - make_guard_confirmed(gs, g); - entry_guard_failed(&guard); - circuit_guard_state_free(guard); - guard = NULL; - node = NULL; - } - - tt_assert(entry_guards_all_primary_guards_are_down(gs)); - - /* Now get another guard we could try... */ - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_assert(node); - tt_assert(guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - g = entry_guard_handle_get(guard->guard); - tt_int_op(g->is_primary, OP_EQ, 0); - tt_int_op(g->is_pending, OP_EQ, 1); - - /* Whoops! We should never have asked for this guard. Cancel the request! */ - entry_guard_cancel(&guard); - tt_ptr_op(guard, OP_EQ, NULL); - tt_int_op(g->is_primary, OP_EQ, 0); - tt_int_op(g->is_pending, OP_EQ, 0); - - done: - guard_selection_free(gs); - circuit_guard_state_free(guard); -} - -static void -test_entry_guard_drop_guards(void *arg) -{ - (void) arg; - int r; - const node_t *node = NULL; - circuit_guard_state_t *guard; - guard_selection_t *gs = get_guard_selection_info(); - - // Pick a guard, to get things set up. - r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &guard); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_GE, - DFLT_MIN_FILTERED_SAMPLE_SIZE); - tt_ptr_op(gs, OP_EQ, get_guard_selection_info()); - - // Drop all the guards! (This is a bad idea....) - remove_all_entry_guards_for_guard_selection(gs); - gs = get_guard_selection_info(); - tt_int_op(smartlist_len(gs->sampled_entry_guards), OP_EQ, 0); - tt_int_op(smartlist_len(gs->primary_entry_guards), OP_EQ, 0); - tt_int_op(smartlist_len(gs->confirmed_entry_guards), OP_EQ, 0); - - done: - circuit_guard_state_free(guard); - guard_selection_free(gs); -} - -/* Unit test setup function: Create a fake network, and set everything up - * for testing the upgrade-a-waiting-circuit code. */ -typedef struct { - guard_selection_t *gs; - time_t start; - circuit_guard_state_t *guard1_state; - circuit_guard_state_t *guard2_state; - entry_guard_t *guard1; - entry_guard_t *guard2; - origin_circuit_t *circ1; - origin_circuit_t *circ2; - smartlist_t *all_origin_circuits; -} upgrade_circuits_data_t; -static void * -upgrade_circuits_setup(const struct testcase_t *testcase) -{ - upgrade_circuits_data_t *data = tor_malloc_zero(sizeof(*data)); - guard_selection_t *gs = data->gs = - guard_selection_new("default", GS_TYPE_NORMAL); - circuit_guard_state_t *guard; - const node_t *node; - entry_guard_t *g; - int i; - const int N_PRIMARY = DFLT_N_PRIMARY_GUARDS; - const char *argument = testcase->setup_data; - const int make_circ1_succeed = strstr(argument, "c1-done") != NULL; - const int make_circ2_succeed = strstr(argument, "c2-done") != NULL; - - big_fake_network_setup(testcase); - - /* We're going to set things up in a state where a circuit will be ready to - * be upgraded. Each test can make a single change (or not) that should - * block the upgrade. - */ - - /* First, make all the primary guards confirmed, and down. */ - data->start = approx_time(); - entry_guards_note_internet_connectivity(gs); - for (i = 0; i < N_PRIMARY; ++i) { - entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, &node, &guard); - g = entry_guard_handle_get(guard->guard); - make_guard_confirmed(gs, g); - entry_guard_failed(&guard); - circuit_guard_state_free(guard); - } - - /* Grab another couple of guards */ - data->all_origin_circuits = smartlist_new(); - - update_approx_time(data->start + 27); - entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &data->guard1_state); - origin_circuit_t *circ; - data->circ1 = circ = origin_circuit_new(); - circ->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; - circ->guard_state = data->guard1_state; - smartlist_add(data->all_origin_circuits, circ); - - update_approx_time(data->start + 30); - entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL, - &node, &data->guard2_state); - data->circ2 = circ = origin_circuit_new(); - circ->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; - circ->guard_state = data->guard2_state; - smartlist_add(data->all_origin_circuits, circ); - - data->guard1 = entry_guard_handle_get(data->guard1_state->guard); - data->guard2 = entry_guard_handle_get(data->guard2_state->guard); - tor_assert(data->guard1 != data->guard2); - tor_assert(data->guard1_state->state == - GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - tor_assert(data->guard2_state->state == - GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD); - - guard_usable_t r; - update_approx_time(data->start + 32); - if (make_circ1_succeed) { - r = entry_guard_succeeded(&data->guard1_state); - tor_assert(r == GUARD_MAYBE_USABLE_LATER); - tor_assert(data->guard1_state->state == - GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); - } - update_approx_time(data->start + 33); - if (make_circ2_succeed) { - r = entry_guard_succeeded(&data->guard2_state); - tor_assert(r == GUARD_MAYBE_USABLE_LATER); - tor_assert(data->guard2_state->state == - GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD); - } - - return data; -} -static int -upgrade_circuits_cleanup(const struct testcase_t *testcase, void *ptr) -{ - upgrade_circuits_data_t *data = ptr; - // circuit_guard_state_free(data->guard1_state); // held in circ1 - // circuit_guard_state_free(data->guard2_state); // held in circ2 - guard_selection_free(data->gs); - smartlist_free(data->all_origin_circuits); - circuit_free_(TO_CIRCUIT(data->circ1)); - circuit_free_(TO_CIRCUIT(data->circ2)); - tor_free(data); - return big_fake_network_cleanup(testcase, NULL); -} - -static void -test_entry_guard_upgrade_a_circuit(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* This is the easy case: we have no COMPLETED circuits, all the - * primary guards are down, we have two WAITING circuits: one will - * get upgraded to COMPLETED! (The one that started first.) - */ - - smartlist_t *result = smartlist_new(); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - - /* circ1 was started first, so we'll get told to ugrade it... */ - tt_ptr_op(oc, OP_EQ, data->circ1); - - /* And the guard state should be complete */ - tt_ptr_op(data->guard1_state, OP_NE, NULL); - tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - - done: - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_blocked_by_live_primary_guards(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* If any primary guards might be up, we can't upgrade any waiting - * circuits. - */ - mark_primary_guards_maybe_reachable(data->gs); - - smartlist_t *result = smartlist_new(); - int r; - setup_capture_of_logs(LOG_DEBUG); - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(result), OP_EQ, 0); - expect_log_msg_containing("not all primary guards were definitely down."); - - done: - teardown_capture_of_logs(); - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_blocked_by_lack_of_waiting_circuits(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* If no circuits are waiting, we can't upgrade anything. (The test - * setup in this case was told not to make any of the circuits "waiting".) - */ - smartlist_t *result = smartlist_new(); - int r; - setup_capture_of_logs(LOG_DEBUG); - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(result), OP_EQ, 0); - expect_log_msg_containing("Considered upgrading guard-stalled circuits, " - "but didn't find any."); - - done: - teardown_capture_of_logs(); - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_blocked_by_better_circ_complete(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* We'll run through the logic of upgrade_a_circuit below... - * and then try again to make sure that circ2 isn't also upgraded. - */ - - smartlist_t *result = smartlist_new(); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - tt_ptr_op(oc, OP_EQ, data->circ1); - tt_ptr_op(data->guard1_state, OP_NE, NULL); - tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - - /* Now, try again. Make sure that circ2 isn't upgraded. */ - smartlist_clear(result); - setup_capture_of_logs(LOG_DEBUG); - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(result), OP_EQ, 0); - expect_log_msg_containing("At least one complete circuit had higher " - "priority, so not upgrading."); - - done: - teardown_capture_of_logs(); - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_not_blocked_by_restricted_circ_complete(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* Once more, let circ1 become complete. But this time, we'll claim - * that circ2 was restricted to not use the same guard as circ1. */ - data->guard2_state->restrictions = - guard_create_exit_restriction((uint8_t*)data->guard1->identity); - - smartlist_t *result = smartlist_new(); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - tt_ptr_op(oc, OP_EQ, data->circ1); - tt_ptr_op(data->guard1_state, OP_NE, NULL); - tt_int_op(data->guard1_state->state, OP_EQ, GUARD_CIRC_STATE_COMPLETE); - - /* Now, we try again. Since circ2 has a restriction that circ1 doesn't obey, - * circ2 _is_ eligible for upgrade. */ - smartlist_clear(result); - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc2 = smartlist_get(result, 0); - tt_ptr_op(oc2, OP_EQ, data->circ2); - - done: - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_not_blocked_by_worse_circ_complete(void *arg) -{ - upgrade_circuits_data_t *data = arg; - smartlist_t *result = smartlist_new(); - /* here we manually make circ2 COMPLETE, and make sure that circ1 - * gets made complete anyway, since guard1 has higher priority - */ - update_approx_time(data->start + 300); - data->guard2_state->state = GUARD_CIRC_STATE_COMPLETE; - data->guard2_state->state_set_at = approx_time(); - update_approx_time(data->start + 301); - - /* Now, try again. Make sure that circ1 is approved. */ - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - tt_ptr_op(oc, OP_EQ, data->circ1); - - done: - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_blocked_by_better_circ_pending(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* circ2 is done, but circ1 is still pending. Since circ1 is better, - * we won't upgrade circ2. */ - - /* XXXX Prop271 -- this is a kludge. I'm making sure circ1 _is_ better, - * by messing with the guards' confirmed_idx */ - make_guard_confirmed(data->gs, data->guard1); - { - int tmp; - tmp = data->guard1->confirmed_idx; - data->guard1->confirmed_idx = data->guard2->confirmed_idx; - data->guard2->confirmed_idx = tmp; - } - - smartlist_t *result = smartlist_new(); - setup_capture_of_logs(LOG_DEBUG); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(result), OP_EQ, 0); - expect_log_msg_containing("but 1 pending circuit(s) had higher guard " - "priority, so not upgrading."); - - done: - teardown_capture_of_logs(); - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_not_blocked_by_restricted_circ_pending(void *arg) -{ - upgrade_circuits_data_t *data = arg; - /* circ2 is done, but circ1 is still pending. But when there is a - restriction on circ2 that circ1 can't satisfy, circ1 can't block - circ2. */ - - /* XXXX Prop271 -- this is a kludge. I'm making sure circ1 _is_ better, - * by messing with the guards' confirmed_idx */ - make_guard_confirmed(data->gs, data->guard1); - { - int tmp; - tmp = data->guard1->confirmed_idx; - data->guard1->confirmed_idx = data->guard2->confirmed_idx; - data->guard2->confirmed_idx = tmp; - } - - data->guard2_state->restrictions = - guard_create_exit_restriction((uint8_t*)data->guard1->identity); - - smartlist_t *result = smartlist_new(); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - tt_ptr_op(oc, OP_EQ, data->circ2); - - done: - smartlist_free(result); -} - -static void -test_entry_guard_upgrade_not_blocked_by_worse_circ_pending(void *arg) -{ - upgrade_circuits_data_t *data = arg; - - /* circ1 is done, but circ2 is still pending. Since circ1 is better, - * we will upgrade it. */ - smartlist_t *result = smartlist_new(); - int r; - r = entry_guards_upgrade_waiting_circuits(data->gs, - data->all_origin_circuits, - result); - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_len(result), OP_EQ, 1); - origin_circuit_t *oc = smartlist_get(result, 0); - tt_ptr_op(oc, OP_EQ, data->circ1); - - done: - smartlist_free(result); -} - -static void -test_enty_guard_should_expire_waiting(void *arg) -{ - (void)arg; - circuit_guard_state_t *fake_state = tor_malloc_zero(sizeof(*fake_state)); - /* We'll leave "guard" unset -- it won't matter here. */ - - /* No state? Can't expire. */ - tt_assert(! entry_guard_state_should_expire(NULL)); - - /* Let's try one that expires. */ - fake_state->state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD; - fake_state->state_set_at = - approx_time() - DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT - 1; - - tt_assert(entry_guard_state_should_expire(fake_state)); - - /* But it wouldn't expire if we changed the state. */ - fake_state->state = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD; - tt_assert(! entry_guard_state_should_expire(fake_state)); - - /* And it wouldn't have expired a few seconds ago. */ - fake_state->state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD; - fake_state->state_set_at = - approx_time() - DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT + 5; - tt_assert(! entry_guard_state_should_expire(fake_state)); - - done: - tor_free(fake_state); -} - -static void -mock_directory_initiate_request(directory_request_t *req) -{ - if (req->guard_state) { - circuit_guard_state_free(req->guard_state); - } -} - -static networkstatus_t *mock_ns_val = NULL; -static networkstatus_t * -mock_ns_get_by_flavor(consensus_flavor_t f) -{ - (void)f; - return mock_ns_val; -} - -/** Test that when we fetch microdescriptors we skip guards that have - * previously failed to serve us needed microdescriptors. */ -static void -test_entry_guard_outdated_dirserver_exclusion(void *arg) -{ - int retval; - response_handler_args_t *args = NULL; - dir_connection_t *conn = NULL; - (void) arg; - - /* Test prep: Make a new guard selection */ - guard_selection_t *gs = get_guard_selection_by_name("default", - GS_TYPE_NORMAL, 1); - - /* ... we want to use entry guards */ - or_options_t *options = get_options_mutable(); - options->UseEntryGuards = 1; - options->UseBridges = 0; - - /* ... prepare some md digests we want to download in the future */ - smartlist_t *digests = smartlist_new(); - const char *prose = "unhurried and wise, we perceive."; - for (int i = 0; i < 20; i++) { - smartlist_add(digests, (char*)prose); - } - - tt_int_op(smartlist_len(digests), OP_EQ, 20); - - /* ... now mock some functions */ - mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); - MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); - MOCK(directory_initiate_request, mock_directory_initiate_request); - - /* Test logic: - * 0. Create a proper guard set and primary guard list. - * 1. Pretend to fail microdescriptor fetches from all the primary guards. - * 2. Order another microdescriptor fetch and make sure that primary guards - * get skipped since they failed previous fetches. - */ - - { /* Setup primary guard list */ - int i; - entry_guards_update_primary(gs); - for (i = 0; i < DFLT_N_PRIMARY_GUARDS; ++i) { - entry_guard_t *guard = smartlist_get(gs->sampled_entry_guards, i); - make_guard_confirmed(gs, guard); - } - entry_guards_update_primary(gs); - } - - { - /* Fail microdesc fetches with all the primary guards */ - args = tor_malloc_zero(sizeof(response_handler_args_t)); - args->status_code = 404; - args->reason = NULL; - args->body = NULL; - args->body_len = 0; - - conn = tor_malloc_zero(sizeof(dir_connection_t)); - conn->requested_resource = tor_strdup("d/jlinblackorigami"); - conn->base_.purpose = DIR_PURPOSE_FETCH_MICRODESC; - - /* Pretend to fail fetches with all primary guards */ - SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards,const entry_guard_t *,g) { - memcpy(conn->identity_digest, g->identity, DIGEST_LEN); - - retval = handle_response_fetch_microdesc(conn, args); - tt_int_op(retval, OP_EQ, 0); - } SMARTLIST_FOREACH_END(g); - } - - { - /* Now order the final md download */ - setup_full_capture_of_logs(LOG_INFO); - initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC, - digests, 3, 7, 0); - - /* ... and check that because we failed to fetch microdescs from all our - * primaries, we didnt end up selecting a primary for fetching dir info */ - expect_log_msg_containing("No primary or confirmed guards available."); - teardown_capture_of_logs(); - } - - done: - smartlist_free(digests); - tor_free(args); - if (conn) { - tor_free(conn->requested_resource); - tor_free(conn); - } -} - -static const struct testcase_setup_t big_fake_network = { - big_fake_network_setup, big_fake_network_cleanup -}; - -static const struct testcase_setup_t upgrade_circuits = { - upgrade_circuits_setup, upgrade_circuits_cleanup -}; - -#define BFN_TEST(name) \ - { #name, test_entry_guard_ ## name, TT_FORK, &big_fake_network, NULL } - -#define UPGRADE_TEST(name, arg) \ - { #name, test_entry_guard_ ## name, TT_FORK, &upgrade_circuits, \ - (void*)(arg) } - -struct testcase_t entrynodes_tests[] = { - { "node_preferred_orport", - test_node_preferred_orport, - 0, NULL, NULL }, - { "entry_guard_describe", test_entry_guard_describe, 0, NULL, NULL }, - { "randomize_time", test_entry_guard_randomize_time, 0, NULL, NULL }, - { "encode_for_state_minimal", - test_entry_guard_encode_for_state_minimal, 0, NULL, NULL }, - { "encode_for_state_maximal", - test_entry_guard_encode_for_state_maximal, 0, NULL, NULL }, - { "parse_from_state_minimal", - test_entry_guard_parse_from_state_minimal, 0, NULL, NULL }, - { "parse_from_state_maximal", - test_entry_guard_parse_from_state_maximal, 0, NULL, NULL }, - { "parse_from_state_failure", - test_entry_guard_parse_from_state_failure, 0, NULL, NULL }, - { "parse_from_state_partial_failure", - test_entry_guard_parse_from_state_partial_failure, 0, NULL, NULL }, - { "parse_from_state_full", - test_entry_guard_parse_from_state_full, TT_FORK, NULL, NULL }, - { "parse_from_state_broken", - test_entry_guard_parse_from_state_broken, TT_FORK, NULL, NULL }, - { "get_guard_selection_by_name", - test_entry_guard_get_guard_selection_by_name, TT_FORK, NULL, NULL }, - BFN_TEST(choose_selection_initial), - BFN_TEST(add_single_guard), - BFN_TEST(node_filter), - BFN_TEST(expand_sample), - BFN_TEST(expand_sample_small_net), - BFN_TEST(update_from_consensus_status), - BFN_TEST(update_from_consensus_repair), - BFN_TEST(update_from_consensus_remove), - BFN_TEST(confirming_guards), - BFN_TEST(sample_reachable_filtered), - BFN_TEST(sample_reachable_filtered_empty), - BFN_TEST(retry_unreachable), - BFN_TEST(manage_primary), - { "guard_preferred", test_entry_guard_guard_preferred, TT_FORK, NULL, NULL }, - BFN_TEST(select_for_circuit_no_confirmed), - BFN_TEST(select_for_circuit_confirmed), - BFN_TEST(select_for_circuit_highlevel_primary), - BFN_TEST(select_for_circuit_highlevel_confirm_other), - BFN_TEST(select_for_circuit_highlevel_primary_retry), - BFN_TEST(select_and_cancel), - BFN_TEST(drop_guards), - BFN_TEST(outdated_dirserver_exclusion), - - UPGRADE_TEST(upgrade_a_circuit, "c1-done c2-done"), - UPGRADE_TEST(upgrade_blocked_by_live_primary_guards, "c1-done c2-done"), - UPGRADE_TEST(upgrade_blocked_by_lack_of_waiting_circuits, ""), - UPGRADE_TEST(upgrade_blocked_by_better_circ_complete, "c1-done c2-done"), - UPGRADE_TEST(upgrade_not_blocked_by_restricted_circ_complete, - "c1-done c2-done"), - UPGRADE_TEST(upgrade_not_blocked_by_worse_circ_complete, "c1-done c2-done"), - UPGRADE_TEST(upgrade_blocked_by_better_circ_pending, "c2-done"), - UPGRADE_TEST(upgrade_not_blocked_by_restricted_circ_pending, - "c2-done"), - UPGRADE_TEST(upgrade_not_blocked_by_worse_circ_pending, "c1-done"), - { "should_expire_waiting", test_enty_guard_should_expire_waiting, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_extorport.c b/src/tor/src/test/test_extorport.c deleted file mode 100644 index cadef257f..000000000 --- a/src/tor/src/test/test_extorport.c +++ /dev/null @@ -1,609 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONNECTION_PRIVATE -#define EXT_ORPORT_PRIVATE -#define MAIN_PRIVATE -#include "or.h" -#include "buffers.h" -#include "connection.h" -#include "connection_or.h" -#include "config.h" -#include "control.h" -#include "ext_orport.h" -#include "main.h" -#include "test.h" - -/* Test connection_or_remove_from_ext_or_id_map and - * connection_or_set_ext_or_identifier */ -static void -test_ext_or_id_map(void *arg) -{ - or_connection_t *c1 = NULL, *c2 = NULL, *c3 = NULL; - char *idp = NULL, *idp2 = NULL; - (void)arg; - - /* pre-initialization */ - tt_ptr_op(NULL, OP_EQ, - connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); - - c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - c3 = or_connection_new(CONN_TYPE_OR, AF_INET); - - tt_ptr_op(c1->ext_or_conn_id, OP_NE, NULL); - tt_ptr_op(c2->ext_or_conn_id, OP_NE, NULL); - tt_ptr_op(c3->ext_or_conn_id, OP_EQ, NULL); - - tt_ptr_op(c1, OP_EQ, connection_or_get_by_ext_or_id(c1->ext_or_conn_id)); - tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(c2->ext_or_conn_id)); - tt_ptr_op(NULL, OP_EQ, - connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); - - idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); - - /* Give c2 a new ID. */ - connection_or_set_ext_or_identifier(c2); - tt_mem_op(idp, OP_NE, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); - idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); - tt_assert(!tor_digest_is_zero(idp2)); - - tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); - tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(idp2)); - - /* Now remove it. */ - connection_or_remove_from_ext_or_id_map(c2); - tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); - tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp2)); - - done: - if (c1) - connection_free_minimal(TO_CONN(c1)); - if (c2) - connection_free_minimal(TO_CONN(c2)); - if (c3) - connection_free_minimal(TO_CONN(c3)); - tor_free(idp); - tor_free(idp2); - connection_or_clear_ext_or_id_map(); -} - -/* Simple connection_write_to_buf_impl_ replacement that unconditionally - * writes to outbuf. */ -static void -connection_write_to_buf_impl_replacement(const char *string, size_t len, - connection_t *conn, int compressed) -{ - (void) compressed; - - tor_assert(string); - tor_assert(conn); - buf_add(conn->outbuf, string, len); -} - -static char * -buf_get_contents(buf_t *buf, size_t *sz_out) -{ - char *out; - *sz_out = buf_datalen(buf); - if (*sz_out >= ULONG_MAX) - return NULL; /* C'mon, really? */ - out = tor_malloc(*sz_out + 1); - if (buf_get_bytes(buf, out, (unsigned long)*sz_out) != 0) { - tor_free(out); - return NULL; - } - out[*sz_out] = '\0'; /* Hopefully gratuitous. */ - return out; -} - -static void -test_ext_or_write_command(void *arg) -{ - or_connection_t *c1; - char *cp = NULL; - char *buf = NULL; - size_t sz; - - (void) arg; - MOCK(connection_write_to_buf_impl_, - connection_write_to_buf_impl_replacement); - - c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - tt_assert(c1); - - /* Length too long */ - tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000), - OP_LT, 0); - - /* Empty command */ - tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0), - OP_EQ, 0); - cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, OP_EQ, 4); - tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x00", 4); - tor_free(cp); - - /* Medium command. */ - tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, - "Wai\0Hello", 9), OP_EQ, 0); - cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, OP_EQ, 13); - tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x09Wai\x00Hello", 13); - tor_free(cp); - - /* Long command */ - buf = tor_malloc(65535); - memset(buf, 'x', 65535); - tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d, - buf, 65535), OP_EQ, 0); - cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, OP_EQ, 65539); - tt_mem_op(cp, OP_EQ, "\xf0\x0d\xff\xff", 4); - tt_mem_op(cp+4, OP_EQ, buf, 65535); - tor_free(cp); - - done: - if (c1) - connection_free_minimal(TO_CONN(c1)); - tor_free(cp); - tor_free(buf); - UNMOCK(connection_write_to_buf_impl_); -} - -static int -write_bytes_to_file_fail(const char *fname, const char *str, size_t len, - int bin) -{ - (void) fname; - (void) str; - (void) len; - (void) bin; - - return -1; -} - -static void -test_ext_or_init_auth(void *arg) -{ - or_options_t *options = get_options_mutable(); - const char *fn; - char *cp = NULL; - struct stat st; - char cookie0[32]; - (void)arg; - - /* Check default filename location */ - tor_free(options->DataDirectory); - options->DataDirectory = tor_strdup("foo"); - cp = get_ext_or_auth_cookie_file_name(); - tt_str_op(cp, OP_EQ, "foo"PATH_SEPARATOR"extended_orport_auth_cookie"); - tor_free(cp); - - /* Shouldn't be initialized already, or our tests will be a bit - * meaningless */ - ext_or_auth_cookie = tor_malloc_zero(32); - tt_assert(tor_mem_is_zero((char*)ext_or_auth_cookie, 32)); - - /* Now make sure we use a temporary file */ - fn = get_fname("ext_cookie_file"); - options->ExtORPortCookieAuthFile = tor_strdup(fn); - cp = get_ext_or_auth_cookie_file_name(); - tt_str_op(cp, OP_EQ, fn); - tor_free(cp); - - /* Test the initialization function with a broken - write_bytes_to_file(). See if the problem is handled properly. */ - MOCK(write_bytes_to_file, write_bytes_to_file_fail); - tt_int_op(-1, OP_EQ, init_ext_or_cookie_authentication(1)); - tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 0); - UNMOCK(write_bytes_to_file); - - /* Now do the actual initialization. */ - tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); - tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 1); - cp = read_file_to_str(fn, RFTS_BIN, &st); - tt_ptr_op(cp, OP_NE, NULL); - tt_u64_op((uint64_t)st.st_size, OP_EQ, 64); - tt_mem_op(cp,OP_EQ, "! Extended ORPort Auth Cookie !\x0a", 32); - tt_mem_op(cp+32,OP_EQ, ext_or_auth_cookie, 32); - memcpy(cookie0, ext_or_auth_cookie, 32); - tt_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32)); - - /* Operation should be idempotent. */ - tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); - tt_mem_op(cookie0,OP_EQ, ext_or_auth_cookie, 32); - - done: - tor_free(cp); - ext_orport_free_all(); -} - -static void -test_ext_or_cookie_auth(void *arg) -{ - char *reply=NULL, *reply2=NULL, *client_hash=NULL, *client_hash2=NULL; - size_t reply_len=0; - char hmac1[32], hmac2[32]; - - const char client_nonce[32] = - "Who is the third who walks alway"; - char server_hash_input[] = - "ExtORPort authentication server-to-client hash" - "Who is the third who walks alway" - "................................"; - char client_hash_input[] = - "ExtORPort authentication client-to-server hash" - "Who is the third who walks alway" - "................................"; - - (void)arg; - - tt_int_op(strlen(client_hash_input), OP_EQ, 46+32+32); - tt_int_op(strlen(server_hash_input), OP_EQ, 46+32+32); - - ext_or_auth_cookie = tor_malloc_zero(32); - memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32); - ext_or_auth_cookie_is_set = 1; - - /* For this authentication, the client sends 32 random bytes (ClientNonce) - * The server replies with 32 byte ServerHash and 32 byte ServerNonce, - * where ServerHash is: - * HMAC-SHA256(CookieString, - * "ExtORPort authentication server-to-client hash" | ClientNonce | - * ServerNonce)" - * The client must reply with 32-byte ClientHash, which we compute as: - * ClientHash is computed as: - * HMAC-SHA256(CookieString, - * "ExtORPort authentication client-to-server hash" | ClientNonce | - * ServerNonce) - */ - - /* Wrong length */ - tt_int_op(-1, OP_EQ, - handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply, - &reply_len)); - tt_int_op(-1, OP_EQ, - handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply, - &reply_len)); - - /* Now let's try this for real! */ - tt_int_op(0, OP_EQ, - handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, - &reply_len)); - tt_int_op(reply_len, OP_EQ, 64); - tt_ptr_op(reply, OP_NE, NULL); - tt_ptr_op(client_hash, OP_NE, NULL); - /* Fill in the server nonce into the hash inputs... */ - memcpy(server_hash_input+46+32, reply+32, 32); - memcpy(client_hash_input+46+32, reply+32, 32); - /* Check the HMACs are correct... */ - crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input, - 46+32+32); - crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, - 46+32+32); - tt_mem_op(hmac1,OP_EQ, reply, 32); - tt_mem_op(hmac2,OP_EQ, client_hash, 32); - - /* Now do it again and make sure that the results are *different* */ - tt_int_op(0, OP_EQ, - handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2, - &reply_len)); - tt_mem_op(reply2,OP_NE, reply, reply_len); - tt_mem_op(client_hash2,OP_NE, client_hash, 32); - /* But that this one checks out too. */ - memcpy(server_hash_input+46+32, reply2+32, 32); - memcpy(client_hash_input+46+32, reply2+32, 32); - /* Check the HMACs are correct... */ - crypto_hmac_sha256(hmac1, (char*)ext_or_auth_cookie, 32, server_hash_input, - 46+32+32); - crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, - 46+32+32); - tt_mem_op(hmac1,OP_EQ, reply2, 32); - tt_mem_op(hmac2,OP_EQ, client_hash2, 32); - - done: - tor_free(reply); - tor_free(client_hash); - tor_free(reply2); - tor_free(client_hash2); -} - -static void -crypto_rand_return_tse_str(char *to, size_t n) -{ - if (n != 32) { - TT_FAIL(("Asked for %d bytes, not 32", (int)n)); - return; - } - memcpy(to, "te road There is always another ", 32); -} - -static void -test_ext_or_cookie_auth_testvec(void *arg) -{ - char *reply=NULL, *client_hash=NULL; - size_t reply_len; - char *mem_op_hex_tmp=NULL; - - const char client_nonce[] = "But when I look ahead up the whi"; - (void)arg; - - ext_or_auth_cookie = tor_malloc_zero(32); - memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32); - ext_or_auth_cookie_is_set = 1; - - MOCK(crypto_rand, crypto_rand_return_tse_str); - - tt_int_op(0, OP_EQ, - handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, - &reply_len)); - tt_ptr_op(reply, OP_NE, NULL ); - tt_uint_op(reply_len, OP_EQ, 64); - tt_mem_op(reply+32,OP_EQ, "te road There is always another ", 32); - /* HMACSHA256("Gliding wrapt in a brown mantle," - * "ExtORPort authentication server-to-client hash" - * "But when I look ahead up the write road There is always another "); - */ - test_memeq_hex(reply, - "ec80ed6e546d3b36fdfc22fe1315416b" - "029f1ade7610d910878b62eeb7403821"); - /* HMACSHA256("Gliding wrapt in a brown mantle," - * "ExtORPort authentication client-to-server hash" - * "But when I look ahead up the write road There is always another "); - * (Both values computed using Python CLI.) - */ - test_memeq_hex(client_hash, - "ab391732dd2ed968cd40c087d1b1f25b" - "33b3cd77ff79bd80c2074bbf438119a2"); - - done: - UNMOCK(crypto_rand); - tor_free(reply); - tor_free(client_hash); - tor_free(mem_op_hex_tmp); -} - -static void -ignore_bootstrap_problem(const char *warn, int reason, - or_connection_t *conn) -{ - (void)warn; - (void)reason; - (void)conn; -} - -static int is_reading = 1; -static int handshake_start_called = 0; - -static void -note_read_stopped(connection_t *conn) -{ - (void)conn; - is_reading=0; -} -static void -note_read_started(connection_t *conn) -{ - (void)conn; - is_reading=1; -} -static int -handshake_start(or_connection_t *conn, int receiving) -{ - if (!conn || !receiving) - TT_FAIL(("Bad arguments to handshake_start")); - handshake_start_called = 1; - return 0; -} - -#define WRITE(s,n) \ - do { \ - buf_add(TO_CONN(conn)->inbuf, (s), (n)); \ - } while (0) -#define CONTAINS(s,n) \ - do { \ - tt_int_op((n), OP_LE, sizeof(b)); \ - tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), OP_EQ, (n)); \ - if ((n)) { \ - buf_get_bytes(TO_CONN(conn)->outbuf, b, (n)); \ - tt_mem_op(b, OP_EQ, (s), (n)); \ - } \ - } while (0) - -/* Helper: Do a successful Extended ORPort authentication handshake. */ -static void -do_ext_or_handshake(or_connection_t *conn) -{ - char b[256]; - - tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); - CONTAINS("\x01\x00", 2); - WRITE("\x01", 1); - WRITE("But when I look ahead up the whi", 32); - MOCK(crypto_rand, crypto_rand_return_tse_str); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - UNMOCK(crypto_rand); - tt_int_op(TO_CONN(conn)->state, OP_EQ, - EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH); - CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" - "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21" - "te road There is always another ", 64); - /* Send the right response this time. */ - WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b" - "\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2", - 32); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("\x01", 1); - tt_assert(! TO_CONN(conn)->marked_for_close); - tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); - - done: ; -} - -static void -test_ext_or_handshake(void *arg) -{ - or_connection_t *conn=NULL; - char b[256]; - - (void) arg; - MOCK(connection_write_to_buf_impl_, - connection_write_to_buf_impl_replacement); - /* Use same authenticators as for test_ext_or_cookie_auth_testvec */ - ext_or_auth_cookie = tor_malloc_zero(32); - memcpy(ext_or_auth_cookie, "Gliding wrapt in a brown mantle," , 32); - ext_or_auth_cookie_is_set = 1; - - init_connection_lists(); - - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); - /* The server starts by telling us about the one supported authtype. */ - CONTAINS("\x01\x00", 2); - /* Say the client hasn't responded yet. */ - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - /* Let's say the client replies badly. */ - WRITE("\x99", 1); - tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - tt_assert(TO_CONN(conn)->marked_for_close); - close_closeable_connections(); - conn = NULL; - - /* Okay, try again. */ - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); - CONTAINS("\x01\x00", 2); - /* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE - * sounds delicious. Let's have some of that!" */ - WRITE("\x01", 1); - /* Let's say that the client also sends part of a nonce. */ - WRITE("But when I look ", 16); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - tt_int_op(TO_CONN(conn)->state, OP_EQ, - EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE); - /* Pump it again. Nothing should happen. */ - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - /* send the rest of the nonce. */ - WRITE("ahead up the whi", 16); - MOCK(crypto_rand, crypto_rand_return_tse_str); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - UNMOCK(crypto_rand); - /* We should get the right reply from the server. */ - CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" - "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21" - "te road There is always another ", 64); - /* Send the wrong response. */ - WRITE("not with a bang but a whimper...", 32); - MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); - tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("\x00", 1); - tt_assert(TO_CONN(conn)->marked_for_close); - /* XXXX Hold-open-until-flushed. */ - close_closeable_connections(); - conn = NULL; - UNMOCK(control_event_bootstrap_prob_or); - - MOCK(connection_start_reading, note_read_started); - MOCK(connection_stop_reading, note_read_stopped); - MOCK(connection_tls_start_handshake, handshake_start); - - /* Okay, this time let's succeed. */ - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - do_ext_or_handshake(conn); - - /* Now let's run through some messages. */ - /* First let's send some junk and make sure it's ignored. */ - WRITE("\xff\xf0\x00\x03""ABC", 7); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - /* Now let's send a USERADDR command. */ - WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - tt_int_op(TO_CONN(conn)->port, OP_EQ, 5678); - tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), OP_EQ, 0x01020304); - /* Now let's send a TRANSPORT command. */ - WRITE("\x00\x02\x00\x07""rfc1149", 11); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - tt_ptr_op(NULL, OP_NE, conn->ext_or_transport); - tt_str_op("rfc1149", OP_EQ, conn->ext_or_transport); - tt_int_op(is_reading,OP_EQ,1); - tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); - /* DONE */ - WRITE("\x00\x00\x00\x00", 4); - tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); - tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_FLUSHING); - tt_int_op(is_reading,OP_EQ,0); - CONTAINS("\x10\x00\x00\x00", 4); - tt_int_op(handshake_start_called,OP_EQ,0); - tt_int_op(0, OP_EQ, connection_ext_or_finished_flushing(conn)); - tt_int_op(is_reading,OP_EQ,1); - tt_int_op(handshake_start_called,OP_EQ,1); - tt_int_op(TO_CONN(conn)->type, OP_EQ, CONN_TYPE_OR); - tt_int_op(TO_CONN(conn)->state, OP_EQ, 0); - close_closeable_connections(); - conn = NULL; - - /* Okay, this time let's succeed the handshake but fail the USERADDR - command. */ - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - do_ext_or_handshake(conn); - /* USERADDR command with an extra NUL byte */ - WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17); - MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); - tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - tt_assert(TO_CONN(conn)->marked_for_close); - close_closeable_connections(); - conn = NULL; - UNMOCK(control_event_bootstrap_prob_or); - - /* Now fail the TRANSPORT command. */ - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - do_ext_or_handshake(conn); - /* TRANSPORT command with an extra NUL byte */ - WRITE("\x00\x02\x00\x08""rfc1149\x00", 12); - MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); - tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - tt_assert(TO_CONN(conn)->marked_for_close); - close_closeable_connections(); - conn = NULL; - UNMOCK(control_event_bootstrap_prob_or); - - /* Now fail the TRANSPORT command. */ - conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - do_ext_or_handshake(conn); - /* TRANSPORT command with transport name with symbols (not a - C-identifier) */ - WRITE("\x00\x02\x00\x07""rf*1149", 11); - MOCK(control_event_bootstrap_prob_or, ignore_bootstrap_problem); - tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); - CONTAINS("", 0); - tt_assert(TO_CONN(conn)->marked_for_close); - close_closeable_connections(); - conn = NULL; - UNMOCK(control_event_bootstrap_prob_or); - - done: - UNMOCK(connection_write_to_buf_impl_); - UNMOCK(crypto_rand); - if (conn) - connection_free_minimal(TO_CONN(conn)); -#undef CONTAINS -#undef WRITE -} - -struct testcase_t extorport_tests[] = { - { "id_map", test_ext_or_id_map, TT_FORK, NULL, NULL }, - { "write_command", test_ext_or_write_command, TT_FORK, NULL, NULL }, - { "init_auth", test_ext_or_init_auth, TT_FORK, NULL, NULL }, - { "cookie_auth", test_ext_or_cookie_auth, TT_FORK, NULL, NULL }, - { "cookie_auth_testvec", test_ext_or_cookie_auth_testvec, TT_FORK, - NULL, NULL }, - { "handshake", test_ext_or_handshake, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_guardfraction.c b/src/tor/src/test/test_guardfraction.c deleted file mode 100644 index 51ca8f08e..000000000 --- a/src/tor/src/test/test_guardfraction.c +++ /dev/null @@ -1,423 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define DIRSERV_PRIVATE -#define ROUTERPARSE_PRIVATE -#define NETWORKSTATUS_PRIVATE - -#include "orconfig.h" -#include "or.h" -#include "config.h" -#include "dirserv.h" -#include "container.h" -#include "entrynodes.h" -#include "util.h" -#include "routerparse.h" -#include "networkstatus.h" - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" - -/** Generate a vote_routerstatus_t for a router with identity digest - * digest_in_hex. */ -static vote_routerstatus_t * -gen_vote_routerstatus_for_tests(const char *digest_in_hex, int is_guard) -{ - int retval; - vote_routerstatus_t *vrs = NULL; - routerstatus_t *rs; - - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - - { /* Useful information for tests */ - char digest_tmp[DIGEST_LEN]; - - /* Guard or not? */ - rs->is_possible_guard = is_guard; - - /* Fill in the fpr */ - tt_int_op(strlen(digest_in_hex), OP_EQ, HEX_DIGEST_LEN); - retval = base16_decode(digest_tmp, sizeof(digest_tmp), - digest_in_hex, HEX_DIGEST_LEN); - tt_int_op(retval, OP_EQ, sizeof(digest_tmp)); - memcpy(rs->identity_digest, digest_tmp, DIGEST_LEN); - } - - { /* Misc info (maybe not used in tests) */ - vrs->version = tor_strdup("0.1.2.14"); - strlcpy(rs->nickname, "router2", sizeof(rs->nickname)); - memset(rs->descriptor_digest, 78, DIGEST_LEN); - rs->addr = 0x99008801; - rs->or_port = 443; - rs->dir_port = 8000; - /* all flags but running cleared */ - rs->is_flagged_running = 1; - vrs->has_measured_bw = 1; - rs->has_bandwidth = 1; - } - - return vrs; - - done: - vote_routerstatus_free(vrs); - - return NULL; -} - -/** Make sure our parsers reject corrupted guardfraction files. */ -static void -test_parse_guardfraction_file_bad(void *arg) -{ - int retval; - char *guardfraction_bad = NULL; - const char *yesterday_date_str = get_yesterday_date_str(); - - (void) arg; - - /* Start parsing all those corrupted guardfraction files! */ - - /* Guardfraction file version is not a number! */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version nan\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" - "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, -1); - tor_free(guardfraction_bad); - - /* This one does not have a date! Parsing should fail. */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at not_date\n" - "n-inputs 420 3\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" - "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n"); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, -1); - tor_free(guardfraction_bad); - - /* This one has an incomplete n-inputs line, but parsing should - still continue. */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs biggie\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 100 420\n" - "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, 2); - tor_free(guardfraction_bad); - - /* This one does not have a fingerprint in the guard line! */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen not_a_fingerprint 100 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, 0); - tor_free(guardfraction_bad); - - /* This one does not even have an integer guardfraction value. */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 NaN 420\n" - "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, 1); - tor_free(guardfraction_bad); - - /* This one is not a percentage (not in [0, 100]) */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 666 420\n" - "guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, 1); - tor_free(guardfraction_bad); - - /* This one is not a percentage either (not in [0, 100]) */ - tor_asprintf(&guardfraction_bad, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777 -3 420\n", - yesterday_date_str); - - retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL); - tt_int_op(retval, OP_EQ, 0); - - done: - tor_free(guardfraction_bad); -} - -/** Make sure that our test guardfraction file gets parsed properly, and - * its information are applied properly to our routerstatuses. */ -static void -test_parse_guardfraction_file_good(void *arg) -{ - int retval; - vote_routerstatus_t *vrs_guard = NULL; - vote_routerstatus_t *vrs_dummy = NULL; - char *guardfraction_good = NULL; - const char *yesterday_date_str = get_yesterday_date_str(); - smartlist_t *routerstatuses = smartlist_new(); - - /* Some test values that we need to validate later */ - const char fpr_guard[] = "D0EDB47BEAD32D26D0A837F7D5357EC3AD3B8777"; - const char fpr_unlisted[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - const int guardfraction_value = 42; - - (void) arg; - - { - /* Populate the smartlist with some fake routerstatuses, so that - after parsing the guardfraction file we can check that their - elements got filled properly. */ - - /* This one is a guard */ - vrs_guard = gen_vote_routerstatus_for_tests(fpr_guard, 1); - tt_assert(vrs_guard); - smartlist_add(routerstatuses, vrs_guard); - - /* This one is a guard but it's not in the guardfraction file */ - vrs_dummy = gen_vote_routerstatus_for_tests(fpr_unlisted, 1); - tt_assert(vrs_dummy); - smartlist_add(routerstatuses, vrs_dummy); - } - - tor_asprintf(&guardfraction_good, - "guardfraction-file-version 1\n" - "written-at %s\n" - "n-inputs 420 3\n" - "guard-seen %s %d 420\n", - yesterday_date_str, - fpr_guard, guardfraction_value); - - /* Read the guardfraction file */ - retval = dirserv_read_guardfraction_file_from_str(guardfraction_good, - routerstatuses); - tt_int_op(retval, OP_EQ, 1); - - { /* Test that routerstatus fields got filled properly */ - - /* The guardfraction fields of the guard should be filled. */ - tt_assert(vrs_guard->status.has_guardfraction); - tt_int_op(vrs_guard->status.guardfraction_percentage, - OP_EQ, - guardfraction_value); - - /* The guard that was not in the guardfraction file should not have - been touched either. */ - tt_assert(!vrs_dummy->status.has_guardfraction); - } - - done: - vote_routerstatus_free(vrs_guard); - vote_routerstatus_free(vrs_dummy); - smartlist_free(routerstatuses); - tor_free(guardfraction_good); -} - -/** Make sure that the guardfraction bandwidths get calculated properly. */ -static void -test_get_guardfraction_bandwidth(void *arg) -{ - guardfraction_bandwidth_t gf_bw; - const int orig_bw = 1000; - - (void) arg; - - /* A guard with bandwidth 1000 and GuardFraction 0.25, should have - bandwidth 250 as a guard and bandwidth 750 as a non-guard. */ - guard_get_guardfraction_bandwidth(&gf_bw, - orig_bw, 25); - - tt_int_op(gf_bw.guard_bw, OP_EQ, 250); - tt_int_op(gf_bw.non_guard_bw, OP_EQ, 750); - - /* Also check the 'guard_bw + non_guard_bw == original_bw' - * invariant. */ - tt_int_op(gf_bw.non_guard_bw + gf_bw.guard_bw, OP_EQ, orig_bw); - - done: - ; -} - -/** Parse the GuardFraction element of the consensus, and make sure it - * gets parsed correctly. */ -static void -test_parse_guardfraction_consensus(void *arg) -{ - int retval; - or_options_t *options = get_options_mutable(); - - const char *guardfraction_str_good = "GuardFraction=66"; - routerstatus_t rs_good; - routerstatus_t rs_no_guard; - - const char *guardfraction_str_bad1 = "GuardFraction="; /* no value */ - routerstatus_t rs_bad1; - - const char *guardfraction_str_bad2 = "GuardFraction=166"; /* no percentage */ - routerstatus_t rs_bad2; - - (void) arg; - - /* GuardFraction use is currently disabled by default. So we need to - manually enable it. */ - options->UseGuardFraction = 1; - - { /* Properly formatted GuardFraction. Check that it gets applied - correctly. */ - memset(&rs_good, 0, sizeof(routerstatus_t)); - rs_good.is_possible_guard = 1; - - retval = routerstatus_parse_guardfraction(guardfraction_str_good, - NULL, NULL, - &rs_good); - tt_int_op(retval, OP_EQ, 0); - tt_assert(rs_good.has_guardfraction); - tt_int_op(rs_good.guardfraction_percentage, OP_EQ, 66); - } - - { /* Properly formatted GuardFraction but router is not a - guard. GuardFraction should not get applied. */ - memset(&rs_no_guard, 0, sizeof(routerstatus_t)); - tt_assert(!rs_no_guard.is_possible_guard); - - setup_full_capture_of_logs(LOG_WARN); - retval = routerstatus_parse_guardfraction(guardfraction_str_good, - NULL, NULL, - &rs_no_guard); - tt_int_op(retval, OP_EQ, 0); - tt_assert(!rs_no_guard.has_guardfraction); - expect_single_log_msg_containing("Got GuardFraction for non-guard . " - "This is not supposed to happen."); - teardown_capture_of_logs(); - } - - { /* Bad GuardFraction. Function should fail and not apply. */ - memset(&rs_bad1, 0, sizeof(routerstatus_t)); - rs_bad1.is_possible_guard = 1; - - retval = routerstatus_parse_guardfraction(guardfraction_str_bad1, - NULL, NULL, - &rs_bad1); - tt_int_op(retval, OP_EQ, -1); - tt_assert(!rs_bad1.has_guardfraction); - } - - { /* Bad GuardFraction. Function should fail and not apply. */ - memset(&rs_bad2, 0, sizeof(routerstatus_t)); - rs_bad2.is_possible_guard = 1; - - retval = routerstatus_parse_guardfraction(guardfraction_str_bad2, - NULL, NULL, - &rs_bad2); - tt_int_op(retval, OP_EQ, -1); - tt_assert(!rs_bad2.has_guardfraction); - } - - done: - teardown_capture_of_logs(); -} - -/** Make sure that we use GuardFraction information when we should, - * according to the torrc option and consensus parameter. */ -static void -test_should_apply_guardfraction(void *arg) -{ - networkstatus_t vote_enabled, vote_disabled, vote_missing; - or_options_t *options = get_options_mutable(); - - (void) arg; - - { /* Fill the votes for later */ - /* This one suggests enabled GuardFraction. */ - memset(&vote_enabled, 0, sizeof(vote_enabled)); - vote_enabled.net_params = smartlist_new(); - smartlist_split_string(vote_enabled.net_params, - "UseGuardFraction=1", NULL, 0, 0); - - /* This one suggests disabled GuardFraction. */ - memset(&vote_disabled, 0, sizeof(vote_disabled)); - vote_disabled.net_params = smartlist_new(); - smartlist_split_string(vote_disabled.net_params, - "UseGuardFraction=0", NULL, 0, 0); - - /* This one doesn't have GuardFraction at all. */ - memset(&vote_missing, 0, sizeof(vote_missing)); - vote_missing.net_params = smartlist_new(); - smartlist_split_string(vote_missing.net_params, - "leon=trout", NULL, 0, 0); - } - - /* If torrc option is set to yes, we should always use - * guardfraction.*/ - options->UseGuardFraction = 1; - tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 1); - - /* If torrc option is set to no, we should never use - * guardfraction.*/ - options->UseGuardFraction = 0; - tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 0); - - /* Now let's test torrc option set to auto. */ - options->UseGuardFraction = -1; - - /* If torrc option is set to auto, and consensus parameter is set to - * yes, we should use guardfraction. */ - tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 1); - - /* If torrc option is set to auto, and consensus parameter is set to - * no, we should use guardfraction. */ - tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 0); - - /* If torrc option is set to auto, and consensus parameter is not - * set, we should fallback to "no". */ - tt_int_op(should_apply_guardfraction(&vote_missing), OP_EQ, 0); - - done: - SMARTLIST_FOREACH(vote_enabled.net_params, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(vote_disabled.net_params, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(vote_missing.net_params, char *, cp, tor_free(cp)); - smartlist_free(vote_enabled.net_params); - smartlist_free(vote_disabled.net_params); - smartlist_free(vote_missing.net_params); -} - -struct testcase_t guardfraction_tests[] = { - { "parse_guardfraction_file_bad", test_parse_guardfraction_file_bad, - TT_FORK, NULL, NULL }, - { "parse_guardfraction_file_good", test_parse_guardfraction_file_good, - TT_FORK, NULL, NULL }, - { "parse_guardfraction_consensus", test_parse_guardfraction_consensus, - TT_FORK, NULL, NULL }, - { "get_guardfraction_bandwidth", test_get_guardfraction_bandwidth, - TT_FORK, NULL, NULL }, - { "should_apply_guardfraction", test_should_apply_guardfraction, - TT_FORK, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_handles.c b/src/tor/src/test/test_handles.c deleted file mode 100644 index eb1e1f1bb..000000000 --- a/src/tor/src/test/test_handles.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "test.h" - -#include "util.h" -#include "handles.h" - -typedef struct demo_t { - HANDLE_ENTRY(demo, demo_t); - int val; -} demo_t; - -HANDLE_DECL(demo, demo_t, static) -#define demo_handle_free(h) \ - FREE_AND_NULL(demo_handle_t, demo_handle_free_, (h)) -HANDLE_IMPL(demo, demo_t, static) - -static demo_t * -demo_new(int val) -{ - demo_t *d = tor_malloc_zero(sizeof(demo_t)); - d->val = val; - return d; -} - -static void -demo_free(demo_t *d) -{ - if (d == NULL) - return; - demo_handles_clear(d); - tor_free(d); -} - -static void -test_handle_basic(void *arg) -{ - (void) arg; - demo_t *d1 = NULL, *d2 = NULL; - demo_handle_t *wr1 = NULL, *wr2 = NULL, *wr3 = NULL, *wr4 = NULL; - - d1 = demo_new(9000); - d2 = demo_new(9009); - - wr1 = demo_handle_new(d1); - wr2 = demo_handle_new(d1); - wr3 = demo_handle_new(d1); - wr4 = demo_handle_new(d2); - - tt_assert(wr1); - tt_assert(wr2); - tt_assert(wr3); - tt_assert(wr4); - - tt_ptr_op(demo_handle_get(wr1), OP_EQ, d1); - tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1); - tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1); - tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); - - demo_handle_free(wr1); - wr1 = NULL; - tt_ptr_op(demo_handle_get(wr2), OP_EQ, d1); - tt_ptr_op(demo_handle_get(wr3), OP_EQ, d1); - tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); - - demo_free(d1); - d1 = NULL; - tt_ptr_op(demo_handle_get(wr2), OP_EQ, NULL); - tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL); - tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); - - demo_handle_free(wr2); - wr2 = NULL; - tt_ptr_op(demo_handle_get(wr3), OP_EQ, NULL); - tt_ptr_op(demo_handle_get(wr4), OP_EQ, d2); - - demo_handle_free(wr3); - wr3 = NULL; - done: - demo_handle_free(wr1); - demo_handle_free(wr2); - demo_handle_free(wr3); - demo_handle_free(wr4); - demo_free(d1); - demo_free(d2); -} - -#define HANDLE_TEST(name, flags) \ - { #name, test_handle_ ##name, (flags), NULL, NULL } - -struct testcase_t handle_tests[] = { - HANDLE_TEST(basic, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_helpers.c b/src/tor/src/test/test_helpers.c deleted file mode 100644 index 0da9cf64d..000000000 --- a/src/tor/src/test/test_helpers.c +++ /dev/null @@ -1,279 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_helpers.c - * \brief Some helper functions to avoid code duplication in unit tests. - */ - -#define ROUTERLIST_PRIVATE -#define CONFIG_PRIVATE -#define CONNECTION_PRIVATE -#define MAIN_PRIVATE - -#include "orconfig.h" -#include "or.h" - -#include "buffers.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "main.h" -#include "nodelist.h" -#include "relay.h" -#include "routerlist.h" - -#include "test.h" -#include "test_helpers.h" -#include "test_connection.h" - -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -DISABLE_GCC_WARNING(overlength-strings) -/* We allow huge string constants in the unit tests, but not in the code - * at large. */ -#endif -#include "test_descriptors.inc" -#include "or.h" -#include "circuitlist.h" -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -ENABLE_GCC_WARNING(overlength-strings) -#endif - -/* Return a statically allocated string representing yesterday's date - * in ISO format. We use it so that state file items are not found to - * be outdated. */ -const char * -get_yesterday_date_str(void) -{ - static char buf[ISO_TIME_LEN+1]; - - time_t yesterday = time(NULL) - 24*60*60; - format_iso_time(buf, yesterday); - return buf; -} - -/* NOP replacement for router_descriptor_is_older_than() */ -static int -router_descriptor_is_older_than_replacement(const routerinfo_t *router, - int seconds) -{ - (void) router; - (void) seconds; - return 0; -} - -/** Parse a file containing router descriptors and load them to our - routerlist. This function is used to setup an artificial network - so that we can conduct tests on it. */ -void -helper_setup_fake_routerlist(void) -{ - int retval; - routerlist_t *our_routerlist = NULL; - smartlist_t *our_nodelist = NULL; - - /* Read the file that contains our test descriptors. */ - - /* We need to mock this function otherwise the descriptors will not - accepted as they are too old. */ - MOCK(router_descriptor_is_older_than, - router_descriptor_is_older_than_replacement); - - /* Load all the test descriptors to the routerlist. */ - retval = router_load_routers_from_string(TEST_DESCRIPTORS, - NULL, SAVED_IN_JOURNAL, - NULL, 0, NULL); - tt_int_op(retval, OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); - - /* Sanity checking of routerlist and nodelist. */ - our_routerlist = router_get_routerlist(); - tt_int_op(smartlist_len(our_routerlist->routers), OP_EQ, - HELPER_NUMBER_OF_DESCRIPTORS); - routerlist_assert_ok(our_routerlist); - - our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS); - - /* Mark all routers as non-guards but up and running! */ - SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) { - node->is_running = 1; - node->is_valid = 1; - node->is_possible_guard = 0; - } SMARTLIST_FOREACH_END(node); - - done: - UNMOCK(router_descriptor_is_older_than); -} - -void -connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int compressed) -{ - (void) compressed; - - tor_assert(string); - tor_assert(conn); - - buf_add(conn->outbuf, string, len); -} - -/* Set up a fake origin circuit with the specified number of cells, - * Return a pointer to the newly-created dummy circuit */ -circuit_t * -dummy_origin_circuit_new(int n_cells) -{ - origin_circuit_t *circ = origin_circuit_new(); - int i; - cell_t cell; - - for (i=0; i < n_cells; ++i) { - crypto_rand((void*)&cell, sizeof(cell)); - cell_queue_append_packed_copy(TO_CIRCUIT(circ), - &TO_CIRCUIT(circ)->n_chan_cells, - 1, &cell, 1, 0); - } - - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_C_GENERAL; - return TO_CIRCUIT(circ); -} - -/** Mock-replacement. As tor_addr_lookup, but always fails on any - * address containing a !. This is necessary for running the unit tests - * on networks where DNS hijackers think it's helpful to give answers - * for things like 1.2.3.4.5 or "invalidstuff!!" - */ -int -mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, - uint16_t family, tor_addr_t *out) -{ - if (name && strchr(name, '!')) { - return -1; - } - return tor_addr_lookup__real(name, family, out); -} - -/*********** Helper funcs for making new connections/streams *****************/ - -/* Helper for test_conn_get_connection() */ -static int -fake_close_socket(evutil_socket_t sock) -{ - (void)sock; - return 0; -} - -static int mock_connection_connect_sockaddr_called = 0; -static int fake_socket_number = TEST_CONN_FD_INIT; - -/* Helper for test_conn_get_connection() */ -static int -mock_connection_connect_sockaddr(connection_t *conn, - const struct sockaddr *sa, - socklen_t sa_len, - const struct sockaddr *bindaddr, - socklen_t bindaddr_len, - int *socket_error) -{ - (void)sa_len; - (void)bindaddr; - (void)bindaddr_len; - - tor_assert(conn); - tor_assert(sa); - tor_assert(socket_error); - - mock_connection_connect_sockaddr_called++; - - conn->s = fake_socket_number++; - tt_assert(SOCKET_OK(conn->s)); - /* We really should call tor_libevent_initialize() here. Because we don't, - * we are relying on other parts of the code not checking if the_event_base - * (and therefore event->ev_base) is NULL. */ - tt_int_op(connection_add_connecting(conn), OP_EQ, 0); - - done: - /* Fake "connected" status */ - return 1; -} - -/** Create and return a new connection/stream */ -connection_t * -test_conn_get_connection(uint8_t state, uint8_t type, uint8_t purpose) -{ - connection_t *conn = NULL; - tor_addr_t addr; - int socket_err = 0; - int in_progress = 0; - - MOCK(connection_connect_sockaddr, - mock_connection_connect_sockaddr); - MOCK(tor_close_socket, fake_close_socket); - - init_connection_lists(); - - conn = connection_new(type, TEST_CONN_FAMILY); - tt_assert(conn); - - test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr); - tt_assert(!tor_addr_is_null(&addr)); - - tor_addr_copy_tight(&conn->addr, &addr); - conn->port = TEST_CONN_PORT; - mock_connection_connect_sockaddr_called = 0; - in_progress = connection_connect(conn, TEST_CONN_ADDRESS_PORT, &addr, - TEST_CONN_PORT, &socket_err); - tt_int_op(mock_connection_connect_sockaddr_called, OP_EQ, 1); - tt_assert(!socket_err); - tt_assert(in_progress == 0 || in_progress == 1); - - /* fake some of the attributes so the connection looks OK */ - conn->state = state; - conn->purpose = purpose; - assert_connection_ok(conn, time(NULL)); - - UNMOCK(connection_connect_sockaddr); - UNMOCK(tor_close_socket); - return conn; - - /* On failure */ - done: - UNMOCK(connection_connect_sockaddr); - UNMOCK(tor_close_socket); - return NULL; -} - -/* Helper function to parse a set of torrc options in a text format and return - * a newly allocated or_options_t object containing the configuration. On - * error, NULL is returned indicating that the conf couldn't be parsed - * properly. */ -or_options_t * -helper_parse_options(const char *conf) -{ - int ret = 0; - char *msg = NULL; - or_options_t *opt = NULL; - config_line_t *line = NULL; - - /* Kind of pointless to call this with a NULL value. */ - tt_assert(conf); - - opt = options_new(); - tt_assert(opt); - ret = config_get_lines(conf, &line, 1); - if (ret != 0) { - goto done; - } - ret = config_assign(&options_format, opt, line, 0, &msg); - if (ret != 0) { - goto done; - } - - done: - config_free_lines(line); - if (ret != 0) { - or_options_free(opt); - opt = NULL; - } - return opt; -} - diff --git a/src/tor/src/test/test_helpers.h b/src/tor/src/test/test_helpers.h deleted file mode 100644 index 9bc855325..000000000 --- a/src/tor/src/test/test_helpers.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TEST_HELPERS_H -#define TOR_TEST_HELPERS_H - -#include "or.h" - -const char *get_yesterday_date_str(void); - -circuit_t * dummy_origin_circuit_new(int num_cells); - -/* Number of descriptors contained in test_descriptors.txt. */ -#define HELPER_NUMBER_OF_DESCRIPTORS 8 - -void helper_setup_fake_routerlist(void); - -#define GET(path) "GET " path " HTTP/1.0\r\n\r\n" -void connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int compressed); - -int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, - uint16_t family, tor_addr_t *out); - -connection_t *test_conn_get_connection(uint8_t state, - uint8_t type, uint8_t purpose); -or_options_t *helper_parse_options(const char *conf); - -extern const char TEST_DESCRIPTORS[]; - -#endif /* !defined(TOR_TEST_HELPERS_H) */ - diff --git a/src/tor/src/test/test_hs.c b/src/tor/src/test/test_hs.c deleted file mode 100644 index 55c6218dd..000000000 --- a/src/tor/src/test/test_hs.c +++ /dev/null @@ -1,1054 +0,0 @@ -/* Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs.c - * \brief Unit tests for hidden service. - **/ - -#define CONTROL_PRIVATE -#define CIRCUITBUILD_PRIVATE -#define RENDCOMMON_PRIVATE -#define RENDSERVICE_PRIVATE -#define HS_SERVICE_PRIVATE - -#include "or.h" -#include "test.h" -#include "control.h" -#include "config.h" -#include "hs_common.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "routerset.h" -#include "circuitbuild.h" -#include "test_helpers.h" - -/* mock ID digest and longname for node that's in nodelist */ -#define HSDIR_EXIST_ID "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \ - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" -#define STR_HSDIR_EXIST_LONGNAME \ - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=TestDir" -/* mock ID digest and longname for node that's not in nodelist */ -#define HSDIR_NONE_EXIST_ID "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" \ - "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" -#define STR_HSDIR_NONE_EXIST_LONGNAME \ - "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - -/* DuckDuckGo descriptor as an example. This one has extra "\r" at the end so - * the control port is happy. */ -static const char *hs_desc_content_control = "\ -rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\r\n\ -version 2\r\n\ -permanent-key\r\n\ ------BEGIN RSA PUBLIC KEY-----\r\n\ -MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE\r\n\ -aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg\r\n\ -I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE=\r\n\ ------END RSA PUBLIC KEY-----\r\n\ -secret-id-part anmjoxxwiupreyajjt5yasimfmwcnxlf\r\n\ -publication-time 2015-03-11 19:00:00\r\n\ -protocol-versions 2,3\r\n\ -introduction-points\r\n\ ------BEGIN MESSAGE-----\r\n\ -aW50cm9kdWN0aW9uLXBvaW50IDd1bnd4cmg2dG5kNGh6eWt1Z3EzaGZzdHduc2ll\r\n\ -cmhyCmlwLWFkZHJlc3MgMTg4LjEzOC4xMjEuMTE4Cm9uaW9uLXBvcnQgOTAwMQpv\r\n\ -bmlvbi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dC\r\n\ -QUxGRVVyeVpDbk9ROEhURmV5cDVjMTRObWVqL1BhekFLTTBxRENTNElKUWh0Y3g1\r\n\ -NXpRSFdOVWIKQ2hHZ0JqR1RjV3ZGRnA0N3FkdGF6WUZhVXE2c0lQKzVqeWZ5b0Q4\r\n\ -UmJ1bzBwQmFWclJjMmNhYUptWWM0RDh6Vgpuby9sZnhzOVVaQnZ1cWY4eHIrMDB2\r\n\ -S0JJNmFSMlA2OE1WeDhrMExqcUpUU2RKOE9idm9yQWdNQkFBRT0KLS0tLS1FTkQg\r\n\ -UlNBIFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQ\r\n\ -VUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnJHb0ozeTlHNXQzN2F2ekI1cTlwN1hG\r\n\ -VUplRUVYMUNOaExnWmJXWGJhVk5OcXpoZFhyL0xTUQppM1Z6dW5OaUs3cndUVnE2\r\n\ -K2QyZ1lRckhMMmIvMXBBY3ZKWjJiNSs0bTRRc0NibFpjRENXTktRbHJnRWN5WXRJ\r\n\ -CkdscXJTbFFEaXA0ZnNrUFMvNDVkWTI0QmJsQ3NGU1k3RzVLVkxJck4zZFpGbmJr\r\n\ -NEZIS1hBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJv\r\n\ -ZHVjdGlvbi1wb2ludCBiNGM3enlxNXNheGZzN2prNXFibG1wN3I1b3pwdHRvagpp\r\n\ -cC1hZGRyZXNzIDEwOS4xNjkuNDUuMjI2Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1r\r\n\ -ZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU8xSXpw\r\n\ -WFFUTUY3RXZUb1NEUXpzVnZiRVFRQUQrcGZ6NzczMVRXZzVaUEJZY1EyUkRaeVp4\r\n\ -OEQKNUVQSU1FeUE1RE83cGd0ak5LaXJvYXJGMC8yempjMkRXTUlSaXZyU29YUWVZ\r\n\ -ZXlMM1pzKzFIajJhMDlCdkYxZAp6MEswblRFdVhoNVR5V3lyMHdsbGI1SFBnTlI0\r\n\ -MS9oYkprZzkwZitPVCtIeGhKL1duUml2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBV\r\n\ -QkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMg\r\n\ -S0VZLS0tLS0KTUlHSkFvR0JBSzNWZEJ2ajFtQllLL3JrcHNwcm9Ub0llNUtHVmth\r\n\ -QkxvMW1tK1I2YUVJek1VZFE1SjkwNGtyRwpCd3k5NC8rV0lGNFpGYXh5Z2phejl1\r\n\ -N2pKY1k3ZGJhd1pFeG1hYXFCRlRwL2h2ZG9rcHQ4a1ByRVk4OTJPRHJ1CmJORUox\r\n\ -N1FPSmVMTVZZZk5Kcjl4TWZCQ3JQai8zOGh2RUdrbWVRNmRVWElvbVFNaUJGOVRB\r\n\ -Z01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlv\r\n\ -bi1wb2ludCBhdjVtcWl0Y2Q3cjJkandsYmN0c2Jlc2R3eGt0ZWtvegppcC1hZGRy\r\n\ -ZXNzIDE0NC43Ni44LjczCm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF\r\n\ -R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTzVweVZzQmpZQmNmMXBE\r\n\ -dklHUlpmWXUzQ05nNldka0ZLMGlvdTBXTGZtejZRVDN0NWhzd3cyVwpjejlHMXhx\r\n\ -MmN0Nkd6VWkrNnVkTDlITTRVOUdHTi9BbW8wRG9GV1hKWHpBQkFXd2YyMVdsd1lW\r\n\ -eFJQMHRydi9WCkN6UDkzcHc5OG5vSmdGUGRUZ05iMjdKYmVUZENLVFBrTEtscXFt\r\n\ -b3NveUN2RitRa25vUS9BZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t\r\n\ -LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN\r\n\ -SUdKQW9HQkFMVjNKSmtWN3lTNU9jc1lHMHNFYzFQOTVRclFRR3ZzbGJ6Wi9zRGxl\r\n\ -RlpKYXFSOUYvYjRUVERNClNGcFMxcU1GbldkZDgxVmRGMEdYRmN2WVpLamRJdHU2\r\n\ -SndBaTRJeEhxeXZtdTRKdUxrcXNaTEFLaXRLVkx4eGsKeERlMjlDNzRWMmJrOTRJ\r\n\ -MEgybTNKS2tzTHVwc3VxWWRVUmhOVXN0SElKZmgyZmNIalF0bEFnTUJBQUU9Ci0t\r\n\ -LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg==\r\n\ ------END MESSAGE-----\r\n\ -signature\r\n\ ------BEGIN SIGNATURE-----\r\n\ -d4OuCE5OLAOnRB6cQN6WyMEmg/BHem144Vec+eYgeWoKwx3MxXFplUjFxgnMlmwN\r\n\ -PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\r\n\ -myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\r\n\ ------END SIGNATURE-----"; - -/* DuckDuckGo descriptor as an example. */ -static const char *hs_desc_content = "\ -rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\n\ -version 2\n\ -permanent-key\n\ ------BEGIN RSA PUBLIC KEY-----\n\ -MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE\n\ -aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg\n\ -I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE=\n\ ------END RSA PUBLIC KEY-----\n\ -secret-id-part anmjoxxwiupreyajjt5yasimfmwcnxlf\n\ -publication-time 2015-03-11 19:00:00\n\ -protocol-versions 2,3\n\ -introduction-points\n\ ------BEGIN MESSAGE-----\n\ -aW50cm9kdWN0aW9uLXBvaW50IDd1bnd4cmg2dG5kNGh6eWt1Z3EzaGZzdHduc2ll\n\ -cmhyCmlwLWFkZHJlc3MgMTg4LjEzOC4xMjEuMTE4Cm9uaW9uLXBvcnQgOTAwMQpv\n\ -bmlvbi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dC\n\ -QUxGRVVyeVpDbk9ROEhURmV5cDVjMTRObWVqL1BhekFLTTBxRENTNElKUWh0Y3g1\n\ -NXpRSFdOVWIKQ2hHZ0JqR1RjV3ZGRnA0N3FkdGF6WUZhVXE2c0lQKzVqeWZ5b0Q4\n\ -UmJ1bzBwQmFWclJjMmNhYUptWWM0RDh6Vgpuby9sZnhzOVVaQnZ1cWY4eHIrMDB2\n\ -S0JJNmFSMlA2OE1WeDhrMExqcUpUU2RKOE9idm9yQWdNQkFBRT0KLS0tLS1FTkQg\n\ -UlNBIFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQ\n\ -VUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnJHb0ozeTlHNXQzN2F2ekI1cTlwN1hG\n\ -VUplRUVYMUNOaExnWmJXWGJhVk5OcXpoZFhyL0xTUQppM1Z6dW5OaUs3cndUVnE2\n\ -K2QyZ1lRckhMMmIvMXBBY3ZKWjJiNSs0bTRRc0NibFpjRENXTktRbHJnRWN5WXRJ\n\ -CkdscXJTbFFEaXA0ZnNrUFMvNDVkWTI0QmJsQ3NGU1k3RzVLVkxJck4zZFpGbmJr\n\ -NEZIS1hBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJv\n\ -ZHVjdGlvbi1wb2ludCBiNGM3enlxNXNheGZzN2prNXFibG1wN3I1b3pwdHRvagpp\n\ -cC1hZGRyZXNzIDEwOS4xNjkuNDUuMjI2Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1r\n\ -ZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU8xSXpw\n\ -WFFUTUY3RXZUb1NEUXpzVnZiRVFRQUQrcGZ6NzczMVRXZzVaUEJZY1EyUkRaeVp4\n\ -OEQKNUVQSU1FeUE1RE83cGd0ak5LaXJvYXJGMC8yempjMkRXTUlSaXZyU29YUWVZ\n\ -ZXlMM1pzKzFIajJhMDlCdkYxZAp6MEswblRFdVhoNVR5V3lyMHdsbGI1SFBnTlI0\n\ -MS9oYkprZzkwZitPVCtIeGhKL1duUml2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBV\n\ -QkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMg\n\ -S0VZLS0tLS0KTUlHSkFvR0JBSzNWZEJ2ajFtQllLL3JrcHNwcm9Ub0llNUtHVmth\n\ -QkxvMW1tK1I2YUVJek1VZFE1SjkwNGtyRwpCd3k5NC8rV0lGNFpGYXh5Z2phejl1\n\ -N2pKY1k3ZGJhd1pFeG1hYXFCRlRwL2h2ZG9rcHQ4a1ByRVk4OTJPRHJ1CmJORUox\n\ -N1FPSmVMTVZZZk5Kcjl4TWZCQ3JQai8zOGh2RUdrbWVRNmRVWElvbVFNaUJGOVRB\n\ -Z01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlv\n\ -bi1wb2ludCBhdjVtcWl0Y2Q3cjJkandsYmN0c2Jlc2R3eGt0ZWtvegppcC1hZGRy\n\ -ZXNzIDE0NC43Ni44LjczCm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF\n\ -R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTzVweVZzQmpZQmNmMXBE\n\ -dklHUlpmWXUzQ05nNldka0ZLMGlvdTBXTGZtejZRVDN0NWhzd3cyVwpjejlHMXhx\n\ -MmN0Nkd6VWkrNnVkTDlITTRVOUdHTi9BbW8wRG9GV1hKWHpBQkFXd2YyMVdsd1lW\n\ -eFJQMHRydi9WCkN6UDkzcHc5OG5vSmdGUGRUZ05iMjdKYmVUZENLVFBrTEtscXFt\n\ -b3NveUN2RitRa25vUS9BZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t\n\ -LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN\n\ -SUdKQW9HQkFMVjNKSmtWN3lTNU9jc1lHMHNFYzFQOTVRclFRR3ZzbGJ6Wi9zRGxl\n\ -RlpKYXFSOUYvYjRUVERNClNGcFMxcU1GbldkZDgxVmRGMEdYRmN2WVpLamRJdHU2\n\ -SndBaTRJeEhxeXZtdTRKdUxrcXNaTEFLaXRLVkx4eGsKeERlMjlDNzRWMmJrOTRJ\n\ -MEgybTNKS2tzTHVwc3VxWWRVUmhOVXN0SElKZmgyZmNIalF0bEFnTUJBQUU9Ci0t\n\ -LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg==\n\ ------END MESSAGE-----\n\ -signature\n\ ------BEGIN SIGNATURE-----\n\ -d4OuCE5OLAOnRB6cQN6WyMEmg/BHem144Vec+eYgeWoKwx3MxXFplUjFxgnMlmwN\n\ -PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\n\ -myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\n\ ------END SIGNATURE-----"; - -/* Helper global variable for hidden service descriptor event test. - * It's used as a pointer to dynamically created message buffer in - * send_control_event_string_replacement function, which mocks - * send_control_event_string function. - * - * Always free it after use! */ -static char *received_msg = NULL; - -/** Mock function for send_control_event_string - */ -static void -queue_control_event_string_replacement(uint16_t event, char *msg) -{ - (void) event; - tor_free(received_msg); - received_msg = msg; -} - -/** Mock function for node_describe_longname_by_id, it returns either - * STR_HSDIR_EXIST_LONGNAME or STR_HSDIR_NONE_EXIST_LONGNAME - */ -static const char * -node_describe_longname_by_id_replacement(const char *id_digest) -{ - if (!strcmp(id_digest, HSDIR_EXIST_ID)) { - return STR_HSDIR_EXIST_LONGNAME; - } else { - return STR_HSDIR_NONE_EXIST_LONGNAME; - } -} - -/** Test that we can parse a hardcoded v2 HS desc. */ -static void -test_hs_parse_static_v2_desc(void *arg) -{ - int ret; - rend_encoded_v2_service_descriptor_t desc; - - (void) arg; - - /* Test an obviously not parseable string */ - desc.desc_str = tor_strdup("ceci n'est pas un HS descriptor"); - ret = rend_desc_v2_is_parsable(&desc); - tor_free(desc.desc_str); - tt_int_op(ret, OP_EQ, 0); - - /* Test an actual descriptor */ - desc.desc_str = tor_strdup(hs_desc_content); - ret = rend_desc_v2_is_parsable(&desc); - tor_free(desc.desc_str); - tt_int_op(ret, OP_EQ, 1); - - done: ; -} - -/** Make sure each hidden service descriptor async event generation - * - * function generates the message in expected format. - */ -static void -test_hs_desc_event(void *arg) -{ - #define STR_HS_ADDR "ajhb7kljbiru65qo" - #define STR_HS_CONTENT_DESC_ID "g5ojobzupf275beh5ra72uyhb3dkpxwg" - #define STR_DESC_ID_BASE32 "hba3gmcgpfivzfhx5rtfqkfdhv65yrj3" - - int ret; - rend_data_v2_t rend_query; - const char *expected_msg; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - - (void) arg; - MOCK(queue_control_event_string, - queue_control_event_string_replacement); - MOCK(node_describe_longname_by_id, - node_describe_longname_by_id_replacement); - - /* setup rend_query struct */ - memset(&rend_query, 0, sizeof(rend_query)); - rend_query.base_.version = 2; - strncpy(rend_query.onion_address, STR_HS_ADDR, - REND_SERVICE_ID_LEN_BASE32+1); - rend_query.auth_type = REND_NO_AUTH; - rend_query.base_.hsdirs_fp = smartlist_new(); - smartlist_add(rend_query.base_.hsdirs_fp, tor_memdup(HSDIR_EXIST_ID, - DIGEST_LEN)); - - /* Compute descriptor ID for replica 0, should be STR_DESC_ID_BASE32. */ - ret = rend_compute_v2_desc_id(rend_query.descriptor_id[0], - rend_query.onion_address, - NULL, 0, 0); - tt_int_op(ret, OP_EQ, 0); - base32_encode(desc_id_base32, sizeof(desc_id_base32), - rend_query.descriptor_id[0], DIGEST_LEN); - /* Make sure rend_compute_v2_desc_id works properly. */ - tt_mem_op(desc_id_base32, OP_EQ, STR_DESC_ID_BASE32, - sizeof(desc_id_base32)); - - /* test request event */ - control_event_hs_descriptor_requested(rend_query.onion_address, - rend_query.auth_type, HSDIR_EXIST_ID, - STR_DESC_ID_BASE32, NULL); - expected_msg = "650 HS_DESC REQUESTED "STR_HS_ADDR" NO_AUTH "\ - STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32 "\r\n"; - tt_assert(received_msg); - tt_str_op(received_msg,OP_EQ, expected_msg); - tor_free(received_msg); - - /* test received event */ - rend_query.auth_type = REND_BASIC_AUTH; - control_event_hsv2_descriptor_received(rend_query.onion_address, - &rend_query.base_, HSDIR_EXIST_ID); - expected_msg = "650 HS_DESC RECEIVED "STR_HS_ADDR" BASIC_AUTH "\ - STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32"\r\n"; - tt_assert(received_msg); - tt_str_op(received_msg,OP_EQ, expected_msg); - tor_free(received_msg); - - /* test failed event */ - rend_query.auth_type = REND_STEALTH_AUTH; - control_event_hsv2_descriptor_failed(&rend_query.base_, - HSDIR_NONE_EXIST_ID, - "QUERY_REJECTED"); - expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" STEALTH_AUTH "\ - STR_HSDIR_NONE_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n"; - tt_assert(received_msg); - tt_str_op(received_msg,OP_EQ, expected_msg); - tor_free(received_msg); - - /* test invalid auth type */ - rend_query.auth_type = 999; - control_event_hsv2_descriptor_failed(&rend_query.base_, - HSDIR_EXIST_ID, - "QUERY_REJECTED"); - expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" UNKNOWN "\ - STR_HSDIR_EXIST_LONGNAME " " STR_DESC_ID_BASE32\ - " REASON=QUERY_REJECTED\r\n"; - tt_assert(received_msg); - tt_str_op(received_msg,OP_EQ, expected_msg); - tor_free(received_msg); - - /* test no HSDir fingerprint type */ - rend_query.auth_type = REND_NO_AUTH; - control_event_hsv2_descriptor_failed(&rend_query.base_, NULL, - "QUERY_NO_HSDIR"); - expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" NO_AUTH " \ - "UNKNOWN REASON=QUERY_NO_HSDIR\r\n"; - tt_assert(received_msg); - tt_str_op(received_msg,OP_EQ, expected_msg); - tor_free(received_msg); - - /* Test invalid content with no HSDir fingerprint. */ - char *exp_msg; - control_event_hs_descriptor_content(rend_query.onion_address, - STR_HS_CONTENT_DESC_ID, NULL, NULL); - tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ - STR_HS_CONTENT_DESC_ID " UNKNOWN" \ - "\r\n\r\n.\r\n650 OK\r\n"); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, exp_msg); - tor_free(received_msg); - tor_free(exp_msg); - - /* test valid content. */ - control_event_hs_descriptor_content(rend_query.onion_address, - STR_HS_CONTENT_DESC_ID, HSDIR_EXIST_ID, - hs_desc_content_control); - tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ - STR_HS_CONTENT_DESC_ID " " STR_HSDIR_EXIST_LONGNAME\ - "\r\n%s\r\n.\r\n650 OK\r\n", hs_desc_content_control); - - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, exp_msg); - tor_free(received_msg); - tor_free(exp_msg); - SMARTLIST_FOREACH(rend_query.base_.hsdirs_fp, char *, d, tor_free(d)); - smartlist_free(rend_query.base_.hsdirs_fp); - - done: - UNMOCK(queue_control_event_string); - UNMOCK(node_describe_longname_by_id); - tor_free(received_msg); -} - -/* Make sure we always pick the right RP, given a well formatted - * Tor2webRendezvousPoints value. */ -static void -test_pick_tor2web_rendezvous_node(void *arg) -{ - or_options_t *options = get_options_mutable(); - const node_t *chosen_rp = NULL; - router_crn_flags_t flags = CRN_NEED_DESC; - int retval, i; - const char *tor2web_rendezvous_str = "test003r"; - - (void) arg; - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - /* Parse Tor2webRendezvousPoints as a routerset. */ - options->Tor2webRendezvousPoints = routerset_new(); - retval = routerset_parse(options->Tor2webRendezvousPoints, - tor2web_rendezvous_str, - "test_tor2web_rp"); - tt_int_op(retval, OP_GE, 0); - - /* Pick rendezvous point. Make sure the correct one is - picked. Repeat many times to make sure it works properly. */ - for (i = 0; i < 50 ; i++) { - chosen_rp = pick_tor2web_rendezvous_node(flags, options); - tt_assert(chosen_rp); - tt_str_op(chosen_rp->ri->nickname, OP_EQ, tor2web_rendezvous_str); - } - - done: - routerset_free(options->Tor2webRendezvousPoints); -} - -/* Make sure we never pick an RP if Tor2webRendezvousPoints doesn't - * correspond to an actual node. */ -static void -test_pick_bad_tor2web_rendezvous_node(void *arg) -{ - or_options_t *options = get_options_mutable(); - const node_t *chosen_rp = NULL; - router_crn_flags_t flags = CRN_NEED_DESC; - int retval, i; - const char *tor2web_rendezvous_str = "dummy"; - - (void) arg; - - /* Setup fake routerlist. */ - helper_setup_fake_routerlist(); - - /* Parse Tor2webRendezvousPoints as a routerset. */ - options->Tor2webRendezvousPoints = routerset_new(); - retval = routerset_parse(options->Tor2webRendezvousPoints, - tor2web_rendezvous_str, - "test_tor2web_rp"); - tt_int_op(retval, OP_GE, 0); - - /* Pick rendezvous point. Since Tor2webRendezvousPoints was set to a - dummy value, we shouldn't find any eligible RPs. */ - for (i = 0; i < 50 ; i++) { - chosen_rp = pick_tor2web_rendezvous_node(flags, options); - tt_ptr_op(chosen_rp, OP_EQ, NULL); - } - - done: - routerset_free(options->Tor2webRendezvousPoints); -} - -/* Make sure rend_data_t is valid at creation, destruction and when - * duplicated. */ -static void -test_hs_rend_data(void *arg) -{ - int rep; - rend_data_t *client = NULL, *client_dup = NULL; - /* Binary format of a descriptor ID. */ - char desc_id[DIGEST_LEN]; - char client_cookie[REND_DESC_COOKIE_LEN]; - time_t now = time(NULL); - rend_data_t *service_dup = NULL; - rend_data_t *service = NULL; - - (void)arg; - - base32_decode(desc_id, sizeof(desc_id), STR_DESC_ID_BASE32, - REND_DESC_ID_V2_LEN_BASE32); - memset(client_cookie, 'e', sizeof(client_cookie)); - - client = rend_data_client_create(STR_HS_ADDR, desc_id, client_cookie, - REND_NO_AUTH); - tt_assert(client); - rend_data_v2_t *client_v2 = TO_REND_DATA_V2(client); - tt_int_op(client_v2->auth_type, OP_EQ, REND_NO_AUTH); - tt_str_op(client_v2->onion_address, OP_EQ, STR_HS_ADDR); - tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id)); - tt_mem_op(client_v2->descriptor_cookie, OP_EQ, client_cookie, - sizeof(client_cookie)); - tt_assert(client->hsdirs_fp); - tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0); - for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { - int ret = rend_compute_v2_desc_id(desc_id, client_v2->onion_address, - client_v2->descriptor_cookie, now, rep); - /* That shouldn't never fail. */ - tt_int_op(ret, OP_EQ, 0); - tt_mem_op(client_v2->descriptor_id[rep], OP_EQ, desc_id, - sizeof(desc_id)); - } - /* The rest should be zeroed because this is a client request. */ - tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1); - tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1); - - /* Test dup(). */ - client_dup = rend_data_dup(client); - tt_assert(client_dup); - rend_data_v2_t *client_dup_v2 = TO_REND_DATA_V2(client_dup); - tt_int_op(client_dup_v2->auth_type, OP_EQ, client_v2->auth_type); - tt_str_op(client_dup_v2->onion_address, OP_EQ, client_v2->onion_address); - tt_mem_op(client_dup_v2->desc_id_fetch, OP_EQ, client_v2->desc_id_fetch, - sizeof(client_dup_v2->desc_id_fetch)); - tt_mem_op(client_dup_v2->descriptor_cookie, OP_EQ, - client_v2->descriptor_cookie, - sizeof(client_dup_v2->descriptor_cookie)); - - tt_assert(client_dup->hsdirs_fp); - tt_int_op(smartlist_len(client_dup->hsdirs_fp), OP_EQ, 0); - for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { - tt_mem_op(client_dup_v2->descriptor_id[rep], OP_EQ, - client_v2->descriptor_id[rep], DIGEST_LEN); - } - /* The rest should be zeroed because this is a client request. */ - tt_int_op(tor_digest_is_zero(client_dup_v2->rend_pk_digest), OP_EQ, 1); - tt_int_op(tor_digest_is_zero(client_dup->rend_cookie), OP_EQ, 1); - rend_data_free(client); - client = NULL; - rend_data_free(client_dup); - client_dup = NULL; - - /* Reset state. */ - base32_decode(desc_id, sizeof(desc_id), STR_DESC_ID_BASE32, - REND_DESC_ID_V2_LEN_BASE32); - memset(client_cookie, 'e', sizeof(client_cookie)); - - /* Try with different parameters here for which some content should be - * zeroed out. */ - client = rend_data_client_create(NULL, desc_id, NULL, REND_BASIC_AUTH); - tt_assert(client); - client_v2 = TO_REND_DATA_V2(client); - tt_int_op(client_v2->auth_type, OP_EQ, REND_BASIC_AUTH); - tt_int_op(strlen(client_v2->onion_address), OP_EQ, 0); - tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id)); - tt_int_op(tor_mem_is_zero(client_v2->descriptor_cookie, - sizeof(client_v2->descriptor_cookie)), OP_EQ, 1); - tt_assert(client->hsdirs_fp); - tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0); - for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { - tt_int_op(tor_digest_is_zero(client_v2->descriptor_id[rep]), OP_EQ, 1); - } - /* The rest should be zeroed because this is a client request. */ - tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1); - tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1); - rend_data_free(client); - client = NULL; - - /* Let's test the service object now. */ - char rend_pk_digest[DIGEST_LEN]; - uint8_t rend_cookie[DIGEST_LEN]; - memset(rend_pk_digest, 'f', sizeof(rend_pk_digest)); - memset(rend_cookie, 'g', sizeof(rend_cookie)); - - service = rend_data_service_create(STR_HS_ADDR, rend_pk_digest, - rend_cookie, REND_NO_AUTH); - tt_assert(service); - rend_data_v2_t *service_v2 = TO_REND_DATA_V2(service); - tt_int_op(service_v2->auth_type, OP_EQ, REND_NO_AUTH); - tt_str_op(service_v2->onion_address, OP_EQ, STR_HS_ADDR); - tt_mem_op(service_v2->rend_pk_digest, OP_EQ, rend_pk_digest, - sizeof(rend_pk_digest)); - tt_mem_op(service->rend_cookie, OP_EQ, rend_cookie, sizeof(rend_cookie)); - tt_assert(service->hsdirs_fp); - tt_int_op(smartlist_len(service->hsdirs_fp), OP_EQ, 0); - for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { - tt_int_op(tor_digest_is_zero(service_v2->descriptor_id[rep]), OP_EQ, 1); - } - /* The rest should be zeroed because this is a service request. */ - tt_int_op(tor_digest_is_zero(service_v2->descriptor_cookie), OP_EQ, 1); - tt_int_op(tor_digest_is_zero(service_v2->desc_id_fetch), OP_EQ, 1); - - /* Test dup(). */ - service_dup = rend_data_dup(service); - rend_data_v2_t *service_dup_v2 = TO_REND_DATA_V2(service_dup); - tt_assert(service_dup); - tt_int_op(service_dup_v2->auth_type, OP_EQ, service_v2->auth_type); - tt_str_op(service_dup_v2->onion_address, OP_EQ, service_v2->onion_address); - tt_mem_op(service_dup_v2->rend_pk_digest, OP_EQ, service_v2->rend_pk_digest, - sizeof(service_dup_v2->rend_pk_digest)); - tt_mem_op(service_dup->rend_cookie, OP_EQ, service->rend_cookie, - sizeof(service_dup->rend_cookie)); - tt_assert(service_dup->hsdirs_fp); - tt_int_op(smartlist_len(service_dup->hsdirs_fp), OP_EQ, 0); - for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) { - tt_assert(tor_digest_is_zero(service_dup_v2->descriptor_id[rep])); - } - /* The rest should be zeroed because this is a service request. */ - tt_int_op(tor_digest_is_zero(service_dup_v2->descriptor_cookie), OP_EQ, 1); - tt_int_op(tor_digest_is_zero(service_dup_v2->desc_id_fetch), OP_EQ, 1); - - done: - rend_data_free(service); - rend_data_free(service_dup); - rend_data_free(client); - rend_data_free(client_dup); -} - -/* Test encoding and decoding service authorization cookies */ -static void -test_hs_auth_cookies(void *arg) -{ -#define TEST_COOKIE_RAW ((const uint8_t *) "abcdefghijklmnop") -#define TEST_COOKIE_ENCODED "YWJjZGVmZ2hpamtsbW5vcA" -#define TEST_COOKIE_ENCODED_STEALTH "YWJjZGVmZ2hpamtsbW5vcB" -#define TEST_COOKIE_ENCODED_INVALID "YWJjZGVmZ2hpamtsbW5vcD" - - char *encoded_cookie; - uint8_t raw_cookie[REND_DESC_COOKIE_LEN]; - rend_auth_type_t auth_type; - char *err_msg; - int re; - - (void)arg; - - /* Test that encoding gives the expected result */ - encoded_cookie = rend_auth_encode_cookie(TEST_COOKIE_RAW, REND_BASIC_AUTH); - tt_str_op(encoded_cookie, OP_EQ, TEST_COOKIE_ENCODED); - tor_free(encoded_cookie); - - encoded_cookie = rend_auth_encode_cookie(TEST_COOKIE_RAW, REND_STEALTH_AUTH); - tt_str_op(encoded_cookie, OP_EQ, TEST_COOKIE_ENCODED_STEALTH); - tor_free(encoded_cookie); - - /* Decoding should give the original value */ - re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED, raw_cookie, &auth_type, - &err_msg); - tt_assert(!re); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); - tt_int_op(auth_type, OP_EQ, REND_BASIC_AUTH); - memset(raw_cookie, 0, sizeof(raw_cookie)); - - re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED_STEALTH, raw_cookie, - &auth_type, &err_msg); - tt_assert(!re); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); - tt_int_op(auth_type, OP_EQ, REND_STEALTH_AUTH); - memset(raw_cookie, 0, sizeof(raw_cookie)); - - /* Decoding with padding characters should also work */ - re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED "==", raw_cookie, NULL, - &err_msg); - tt_assert(!re); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN); - - /* Decoding with an unknown type should fail */ - re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED_INVALID, raw_cookie, - &auth_type, &err_msg); - tt_int_op(re, OP_LT, 0); - tt_assert(err_msg); - tor_free(err_msg); - - done: - return; -} - -static int mock_get_options_calls = 0; -static or_options_t *mock_options = NULL; - -static void -reset_options(or_options_t *options, int *get_options_calls) -{ - memset(options, 0, sizeof(or_options_t)); - options->TestingTorNetwork = 1; - - *get_options_calls = 0; -} - -static const or_options_t * -mock_get_options(void) -{ - ++mock_get_options_calls; - tor_assert(mock_options); - return mock_options; -} - -/* arg can't be 0 (the test fails) or 2 (the test is skipped) */ -#define CREATE_HS_DIR_NONE ((intptr_t)0x04) -#define CREATE_HS_DIR1 ((intptr_t)0x08) -#define CREATE_HS_DIR2 ((intptr_t)0x10) - -/* Test that single onion poisoning works. */ -static void -test_single_onion_poisoning(void *arg) -{ - or_options_t opt; - mock_options = &opt; - reset_options(mock_options, &mock_get_options_calls); - MOCK(get_options, mock_get_options); - - int ret = -1; - intptr_t create_dir_mask = (intptr_t)arg; - /* Get directories with a random suffix so we can repeat the tests */ - mock_options->DataDirectory = tor_strdup(get_fname_rnd("test_data_dir")); - rend_service_t *service_1 = tor_malloc_zero(sizeof(rend_service_t)); - char *dir1 = tor_strdup(get_fname_rnd("test_hs_dir1")); - rend_service_t *service_2 = tor_malloc_zero(sizeof(rend_service_t)); - char *dir2 = tor_strdup(get_fname_rnd("test_hs_dir2")); - smartlist_t *services = smartlist_new(); - char *poison_path = NULL; - char *err_msg = NULL; - - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - - /* Create the data directory, and, if the correct bit in arg is set, - * create a directory for that service. - * The data directory is required for the lockfile, which is used when - * loading keys. */ - ret = check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL); - tt_int_op(ret, OP_EQ, 0); - if (create_dir_mask & CREATE_HS_DIR1) { - ret = check_private_dir(dir1, CPD_CREATE, NULL); - tt_int_op(ret, OP_EQ, 0); - } - if (create_dir_mask & CREATE_HS_DIR2) { - ret = check_private_dir(dir2, CPD_CREATE, NULL); - tt_int_op(ret, OP_EQ, 0); - } - - service_1->directory = dir1; - service_2->directory = dir2; - /* The services own the directory pointers now */ - dir1 = dir2 = NULL; - /* Add port to service 1 */ - service_1->ports = smartlist_new(); - service_2->ports = smartlist_new(); - rend_service_port_config_t *port1 = rend_service_parse_port_config("80", " ", - &err_msg); - tt_assert(port1); - tt_ptr_op(err_msg, OP_EQ, NULL); - smartlist_add(service_1->ports, port1); - - rend_service_port_config_t *port2 = rend_service_parse_port_config("90", " ", - &err_msg); - /* Add port to service 2 */ - tt_assert(port2); - tt_ptr_op(err_msg, OP_EQ, NULL); - smartlist_add(service_2->ports, port2); - - /* No services, a service to verify, no problem! */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Either way, no problem. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Add the first service */ - ret = hs_check_service_private_dir(mock_options->User, service_1->directory, - service_1->dir_group_readable, 1); - tt_int_op(ret, OP_EQ, 0); - smartlist_add(services, service_1); - /* But don't add the second service yet. */ - - /* Service directories, but no previous keys, no problem! */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Either way, no problem. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Poison! Poison! Poison! - * This can only be done in HiddenServiceSingleHopMode. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - /* Poisoning twice is a no-op. */ - ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Poisoned service directories, but no previous keys, no problem! */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Either way, no problem. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Now add some keys, and we'll have a problem. */ - ret = rend_service_load_all_keys(services); - tt_int_op(ret, OP_EQ, 0); - - /* Poisoned service directories with previous keys are not allowed. */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_LT, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* But they are allowed if we're in non-anonymous mode. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Re-poisoning directories with existing keys is a no-op, because - * directories with existing keys are ignored. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - /* And it keeps the poison. */ - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Now add the second service: it has no key and no poison file */ - ret = hs_check_service_private_dir(mock_options->User, service_2->directory, - service_2->dir_group_readable, 1); - tt_int_op(ret, OP_EQ, 0); - smartlist_add(services, service_2); - - /* A new service, and an existing poisoned service. Not ok. */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_LT, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* But ok to add in non-anonymous mode. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Now remove the poisoning from the first service, and we have the opposite - * problem. */ - poison_path = rend_service_sos_poison_path(service_1); - tt_assert(poison_path); - ret = unlink(poison_path); - tt_int_op(ret, OP_EQ, 0); - - /* Unpoisoned service directories with previous keys are ok, as are empty - * directories. */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* But the existing unpoisoned key is not ok in non-anonymous mode, even if - * there is an empty service. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_LT, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Poisoning directories with existing keys is a no-op, because directories - * with existing keys are ignored. But the new directory should poison. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_poison_new_single_onion_dir(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - /* And the old directory remains unpoisoned. */ - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_LT, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* And the new directory should be ignored, because it has no key. */ - mock_options->HiddenServiceSingleHopMode = 0; - mock_options->HiddenServiceNonAnonymousMode = 0; - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - /* Re-poisoning directories without existing keys is a no-op. */ - mock_options->HiddenServiceSingleHopMode = 1; - mock_options->HiddenServiceNonAnonymousMode = 1; - ret = rend_service_poison_new_single_onion_dir(service_1, mock_options); - tt_int_op(ret, OP_EQ, 0); - ret = rend_service_poison_new_single_onion_dir(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - /* And the old directory remains unpoisoned. */ - ret = rend_service_verify_single_onion_poison(service_1, mock_options); - tt_int_op(ret, OP_LT, 0); - ret = rend_service_verify_single_onion_poison(service_2, mock_options); - tt_int_op(ret, OP_EQ, 0); - - done: - /* The test harness deletes the directories at exit */ - tor_free(poison_path); - tor_free(dir1); - tor_free(dir2); - smartlist_free(services); - rend_service_free(service_1); - rend_service_free(service_2); - UNMOCK(get_options); - tor_free(mock_options->DataDirectory); - tor_free(err_msg); -} - -static rend_service_t * -helper_create_rend_service(const char *path) -{ - rend_service_t *s = tor_malloc_zero(sizeof(rend_service_t)); - s->ports = smartlist_new(); - s->intro_nodes = smartlist_new(); - s->expiring_nodes = smartlist_new(); - if (path) { - s->directory = tor_strdup(path); - } - return s; -} - -static void -test_prune_services_on_reload(void *arg) -{ - smartlist_t *new = smartlist_new(), *old = smartlist_new(); - /* Non ephemeral service. */ - rend_service_t *s1 = helper_create_rend_service("SomePath"); - /* Create a non ephemeral service with the _same_ path as so we can test the - * transfer of introduction point between the same services on reload. */ - rend_service_t *s2 = helper_create_rend_service(s1->directory); - /* Ephemeral service (directory is NULL). */ - rend_service_t *e1 = helper_create_rend_service(NULL); - rend_service_t *e2 = helper_create_rend_service(NULL); - - (void) arg; - - { - /* Add both services to the old list. */ - smartlist_add(old, s1); - smartlist_add(old, e1); - /* Only put the non ephemeral in the new list. */ - smartlist_add(new, s1); - set_rend_service_list(old); - set_rend_rend_service_staging_list(new); - rend_service_prune_list_impl_(); - /* We expect that the ephemeral one is in the new list but removed from - * the old one. */ - tt_int_op(smartlist_len(old), OP_EQ, 1); - tt_assert(smartlist_get(old, 0) == s1); - tt_int_op(smartlist_len(new), OP_EQ, 2); - tt_assert(smartlist_get(new, 0) == s1); - tt_assert(smartlist_get(new, 1) == e1); - /* Cleanup for next test. */ - smartlist_clear(new); - smartlist_clear(old); - } - - { - /* This test will make sure that only the ephemeral service is kept if the - * new list is empty. The old list should contain only the non ephemeral - * one. */ - smartlist_add(old, s1); - smartlist_add(old, e1); - set_rend_service_list(old); - set_rend_rend_service_staging_list(new); - rend_service_prune_list_impl_(); - tt_int_op(smartlist_len(old), OP_EQ, 1); - tt_assert(smartlist_get(old, 0) == s1); - tt_int_op(smartlist_len(new), OP_EQ, 1); - tt_assert(smartlist_get(new, 0) == e1); - /* Cleanup for next test. */ - smartlist_clear(new); - smartlist_clear(old); - } - - { - /* This test makes sure that the new list stays the same even from the old - * list being completely different. */ - smartlist_add(new, s1); - smartlist_add(new, e1); - set_rend_service_list(old); - set_rend_rend_service_staging_list(new); - rend_service_prune_list_impl_(); - tt_int_op(smartlist_len(old), OP_EQ, 0); - tt_int_op(smartlist_len(new), OP_EQ, 2); - tt_assert(smartlist_get(new, 0) == s1); - tt_assert(smartlist_get(new, 1) == e1); - /* Cleanup for next test. */ - smartlist_clear(new); - } - - { - rend_intro_point_t ip1; - /* This IP should be found in the s2 service after pruning. */ - smartlist_add(s1->intro_nodes, &ip1); - /* Setup our list. */ - smartlist_add(old, s1); - smartlist_add(new, s2); - set_rend_service_list(old); - set_rend_rend_service_staging_list(new); - rend_service_prune_list_impl_(); - tt_int_op(smartlist_len(old), OP_EQ, 1); - /* Intro nodes have been moved to the s2 in theory so it must be empty. */ - tt_int_op(smartlist_len(s1->intro_nodes), OP_EQ, 0); - tt_int_op(smartlist_len(new), OP_EQ, 1); - rend_service_t *elem = smartlist_get(new, 0); - tt_assert(elem); - tt_assert(elem == s2); - tt_int_op(smartlist_len(elem->intro_nodes), OP_EQ, 1); - tt_assert(smartlist_get(elem->intro_nodes, 0) == &ip1); - smartlist_clear(s1->intro_nodes); - smartlist_clear(s2->intro_nodes); - /* Cleanup for next test. */ - smartlist_clear(new); - smartlist_clear(old); - } - - { - /* Test two ephemeral services. */ - smartlist_add(old, e1); - smartlist_add(old, e2); - set_rend_service_list(old); - set_rend_rend_service_staging_list(new); - rend_service_prune_list_impl_(); - /* Check if they've all been transfered. */ - tt_int_op(smartlist_len(old), OP_EQ, 0); - tt_int_op(smartlist_len(new), OP_EQ, 2); - } - - done: - rend_service_free(s1); - rend_service_free(s2); - rend_service_free(e1); - rend_service_free(e2); - smartlist_free(new); - smartlist_free(old); -} - -struct testcase_t hs_tests[] = { - { "hs_rend_data", test_hs_rend_data, TT_FORK, - NULL, NULL }, - { "hs_parse_static_v2_desc", test_hs_parse_static_v2_desc, TT_FORK, - NULL, NULL }, - { "hs_desc_event", test_hs_desc_event, TT_FORK, - NULL, NULL }, - { "pick_tor2web_rendezvous_node", test_pick_tor2web_rendezvous_node, TT_FORK, - NULL, NULL }, - { "pick_bad_tor2web_rendezvous_node", - test_pick_bad_tor2web_rendezvous_node, TT_FORK, - NULL, NULL }, - { "hs_auth_cookies", test_hs_auth_cookies, TT_FORK, - NULL, NULL }, - { "single_onion_poisoning_create_dir_none", test_single_onion_poisoning, - TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR_NONE) }, - { "single_onion_poisoning_create_dir1", test_single_onion_poisoning, - TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1) }, - { "single_onion_poisoning_create_dir2", test_single_onion_poisoning, - TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR2) }, - { "single_onion_poisoning_create_dir_both", test_single_onion_poisoning, - TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1 | CREATE_HS_DIR2) }, - { "prune_services_on_reload", test_prune_services_on_reload, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_cache.c b/src/tor/src/test/test_hs_cache.c deleted file mode 100644 index 458ce1a92..000000000 --- a/src/tor/src/test/test_hs_cache.c +++ /dev/null @@ -1,561 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_cache.c - * \brief Test hidden service caches. - */ - -#define CONNECTION_PRIVATE -#define DIRECTORY_PRIVATE -#define HS_CACHE_PRIVATE - -#include "ed25519_cert.h" -#include "hs_cache.h" -#include "rendcache.h" -#include "directory.h" -#include "networkstatus.h" -#include "connection.h" -#include "proto_http.h" - -#include "hs_test_helpers.h" -#include "test_helpers.h" -#include "test.h" - -/* Static variable used to encoded the HSDir query. */ -static char query_b64[256]; - -/* Build an HSDir query using a ed25519 public key. */ -static const char * -helper_get_hsdir_query(const hs_descriptor_t *desc) -{ - ed25519_public_to_base64(query_b64, &desc->plaintext_data.blinded_pubkey); - return query_b64; -} - -static void -init_test(void) -{ - /* Always needed. Initialize the subsystem. */ - hs_cache_init(); - /* We need the v2 cache since our OOM and cache cleanup does poke at it. */ - rend_cache_init(); -} - -static void -test_directory(void *arg) -{ - int ret; - size_t oom_size; - char *desc1_str = NULL; - const char *desc_out; - ed25519_keypair_t signing_kp1; - hs_descriptor_t *desc1 = NULL; - - (void) arg; - - init_test(); - /* Generate a valid descriptor with normal values. */ - ret = ed25519_keypair_generate(&signing_kp1, 0); - tt_int_op(ret, OP_EQ, 0); - desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1); - tt_assert(desc1); - ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); - tt_int_op(ret, OP_EQ, 0); - - /* Very first basic test, should be able to be stored, survive a - * clean, found with a lookup and then cleaned by our OOM. */ - { - ret = hs_cache_store_as_dir(desc1_str); - tt_int_op(ret, OP_EQ, 0); - /* Re-add, it should fail since we already have it. */ - ret = hs_cache_store_as_dir(desc1_str); - tt_int_op(ret, OP_EQ, -1); - /* Try to clean now which should be fine, there is at worst few seconds - * between the store and this call. */ - hs_cache_clean_as_dir(time(NULL)); - /* We should find it in our cache. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(desc_out, OP_EQ, desc1_str); - /* Tell our OOM to run and to at least remove a byte which will result in - * removing the descriptor from our cache. */ - oom_size = hs_cache_handle_oom(time(NULL), 1); - tt_int_op(oom_size, OP_GE, 1); - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); - tt_int_op(ret, OP_EQ, 0); - } - - /* Store two descriptors and remove the expiring one only. */ - { - ed25519_keypair_t signing_kp_zero; - ret = ed25519_keypair_generate(&signing_kp_zero, 0); - tt_int_op(ret, OP_EQ, 0); - hs_descriptor_t *desc_zero_lifetime; - desc_zero_lifetime = hs_helper_build_hs_desc_with_ip(&signing_kp_zero); - tt_assert(desc_zero_lifetime); - desc_zero_lifetime->plaintext_data.revision_counter = 1; - desc_zero_lifetime->plaintext_data.lifetime_sec = 0; - char *desc_zero_lifetime_str; - ret = hs_desc_encode_descriptor(desc_zero_lifetime, &signing_kp_zero, - &desc_zero_lifetime_str); - tt_int_op(ret, OP_EQ, 0); - - ret = hs_cache_store_as_dir(desc1_str); - tt_int_op(ret, OP_EQ, 0); - ret = hs_cache_store_as_dir(desc_zero_lifetime_str); - tt_int_op(ret, OP_EQ, 0); - /* This one should clear out our zero lifetime desc. */ - hs_cache_clean_as_dir(time(NULL)); - /* We should find desc1 in our cache. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(desc_out, OP_EQ, desc1_str); - /* We should NOT find our zero lifetime desc in our cache. */ - ret = hs_cache_lookup_as_dir(3, - helper_get_hsdir_query(desc_zero_lifetime), - NULL); - tt_int_op(ret, OP_EQ, 0); - /* Cleanup our entire cache. */ - oom_size = hs_cache_handle_oom(time(NULL), 1); - tt_int_op(oom_size, OP_GE, 1); - hs_descriptor_free(desc_zero_lifetime); - tor_free(desc_zero_lifetime_str); - } - - /* Throw junk at it. */ - { - ret = hs_cache_store_as_dir("blah"); - tt_int_op(ret, OP_EQ, -1); - /* Poor attempt at tricking the decoding. */ - ret = hs_cache_store_as_dir("hs-descriptor 3\nJUNK"); - tt_int_op(ret, OP_EQ, -1); - /* Undecodable base64 query. */ - ret = hs_cache_lookup_as_dir(3, "blah", NULL); - tt_int_op(ret, OP_EQ, -1); - /* Decodable base64 query but wrong ed25519 size. */ - ret = hs_cache_lookup_as_dir(3, "dW5pY29ybg==", NULL); - tt_int_op(ret, OP_EQ, -1); - } - - /* Test descriptor replacement with revision counter. */ - { - char *new_desc_str; - - /* Add a descriptor. */ - ret = hs_cache_store_as_dir(desc1_str); - tt_int_op(ret, OP_EQ, 0); - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); - tt_int_op(ret, OP_EQ, 1); - /* Bump revision counter. */ - desc1->plaintext_data.revision_counter++; - ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &new_desc_str); - tt_int_op(ret, OP_EQ, 0); - ret = hs_cache_store_as_dir(new_desc_str); - tt_int_op(ret, OP_EQ, 0); - /* Look it up, it should have been replaced. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), &desc_out); - tt_int_op(ret, OP_EQ, 1); - tt_str_op(desc_out, OP_EQ, new_desc_str); - tor_free(new_desc_str); - } - - done: - hs_descriptor_free(desc1); - tor_free(desc1_str); -} - -static void -test_clean_as_dir(void *arg) -{ - size_t ret; - char *desc1_str = NULL; - time_t now = time(NULL); - hs_descriptor_t *desc1 = NULL; - ed25519_keypair_t signing_kp1; - - (void) arg; - - init_test(); - - /* Generate a valid descriptor with values. */ - ret = ed25519_keypair_generate(&signing_kp1, 0); - tt_int_op(ret, OP_EQ, 0); - desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1); - tt_assert(desc1); - ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str); - tt_int_op(ret, OP_EQ, 0); - ret = hs_cache_store_as_dir(desc1_str); - tt_int_op(ret, OP_EQ, 0); - - /* With the lifetime being 3 hours, a cleanup shouldn't remove it. */ - ret = cache_clean_v3_as_dir(now, 0); - tt_int_op(ret, OP_EQ, 0); - /* Should be present after clean up. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); - tt_int_op(ret, OP_EQ, 1); - /* Set a cutoff 100 seconds in the past. It should not remove the entry - * since the entry is still recent enough. */ - ret = cache_clean_v3_as_dir(now, now - 100); - tt_int_op(ret, OP_EQ, 0); - /* Should be present after clean up. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); - tt_int_op(ret, OP_EQ, 1); - /* Set a cutoff of 100 seconds in the future. It should remove the entry - * that we've just added since it's not too old for the cutoff. */ - ret = cache_clean_v3_as_dir(now, now + 100); - tt_int_op(ret, OP_GT, 0); - /* Shouldn't be present after clean up. */ - ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL); - tt_int_op(ret, OP_EQ, 0); - - done: - hs_descriptor_free(desc1); - tor_free(desc1_str); -} - -/* Test helper: Fetch an HS descriptor from an HSDir (for the hidden service - with blinded_key. Return the received descriptor string. */ -static char * -helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key) -{ - int retval; - - char *received_desc = NULL; - char *hsdir_query_str = NULL; - - /* The dir conn we are going to simulate */ - dir_connection_t *conn = NULL; - - /* First extract the blinded public key that we are going to use in our - query, and then build the actual query string. */ - { - char hsdir_cache_key[ED25519_BASE64_LEN+1]; - - retval = ed25519_public_to_base64(hsdir_cache_key, - blinded_key); - tt_int_op(retval, OP_EQ, 0); - tor_asprintf(&hsdir_query_str, GET("/tor/hs/3/%s"), hsdir_cache_key); - } - - /* Simulate an HTTP GET request to the HSDir */ - conn = dir_connection_new(AF_INET); - tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); - TO_CONN(conn)->linked = 1;/* Pretend the conn is encrypted :) */ - retval = directory_handle_command_get(conn, hsdir_query_str, - NULL, 0); - tt_int_op(retval, OP_EQ, 0); - - /* Read the descriptor that the HSDir just served us */ - { - char *headers = NULL; - size_t body_used = 0; - - fetch_from_buf_http(TO_CONN(conn)->outbuf, &headers, MAX_HEADERS_SIZE, - &received_desc, &body_used, HS_DESC_MAX_LEN, 0); - tor_free(headers); - } - - done: - tor_free(hsdir_query_str); - if (conn) - connection_free_minimal(TO_CONN(conn)); - - return received_desc; -} - -/* Publish a descriptor to the HSDir, then fetch it. Check that the received - descriptor matches the published one. */ -static void -test_upload_and_download_hs_desc(void *arg) -{ - int retval; - hs_descriptor_t *published_desc = NULL; - - char *published_desc_str = NULL; - char *received_desc_str = NULL; - - (void) arg; - - /* Initialize HSDir cache subsystem */ - init_test(); - - /* Test a descriptor not found in the directory cache. */ - { - ed25519_public_key_t blinded_key; - memset(&blinded_key.pubkey, 'A', sizeof(blinded_key.pubkey)); - received_desc_str = helper_fetch_desc_from_hsdir(&blinded_key); - tt_int_op(strlen(received_desc_str), OP_EQ, 0); - tor_free(received_desc_str); - } - - /* Generate a valid descriptor with normal values. */ - { - ed25519_keypair_t signing_kp; - retval = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(retval, OP_EQ, 0); - published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - tt_assert(published_desc); - retval = hs_desc_encode_descriptor(published_desc, &signing_kp, - &published_desc_str); - tt_int_op(retval, OP_EQ, 0); - } - - /* Publish descriptor to the HSDir */ - { - retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); - tt_int_op(retval, OP_EQ, 200); - } - - /* Simulate a fetch of the previously published descriptor */ - { - const ed25519_public_key_t *blinded_key; - blinded_key = &published_desc->plaintext_data.blinded_pubkey; - received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); - } - - /* Verify we received the exact same descriptor we published earlier */ - tt_str_op(received_desc_str, OP_EQ, published_desc_str); - tor_free(received_desc_str); - - /* With a valid descriptor in the directory cache, try again an invalid. */ - { - ed25519_public_key_t blinded_key; - memset(&blinded_key.pubkey, 'A', sizeof(blinded_key.pubkey)); - received_desc_str = helper_fetch_desc_from_hsdir(&blinded_key); - tt_int_op(strlen(received_desc_str), OP_EQ, 0); - } - - done: - tor_free(received_desc_str); - tor_free(published_desc_str); - hs_descriptor_free(published_desc); -} - -/* Test that HSDirs reject outdated descriptors based on their revision - * counter. Also test that HSDirs correctly replace old descriptors with newer - * descriptors. */ -static void -test_hsdir_revision_counter_check(void *arg) -{ - int retval; - - ed25519_keypair_t signing_kp; - - hs_descriptor_t *published_desc = NULL; - char *published_desc_str = NULL; - - uint8_t subcredential[DIGEST256_LEN]; - char *received_desc_str = NULL; - hs_descriptor_t *received_desc = NULL; - - (void) arg; - - /* Initialize HSDir cache subsystem */ - init_test(); - - /* Generate a valid descriptor with normal values. */ - { - retval = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(retval, OP_EQ, 0); - published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - tt_assert(published_desc); - retval = hs_desc_encode_descriptor(published_desc, &signing_kp, - &published_desc_str); - tt_int_op(retval, OP_EQ, 0); - } - - /* Publish descriptor to the HSDir */ - { - retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); - tt_int_op(retval, OP_EQ, 200); - } - - /* Try publishing again with the same revision counter: Should fail. */ - { - retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); - tt_int_op(retval, OP_EQ, 400); - } - - /* Fetch the published descriptor and validate the revision counter. */ - { - const ed25519_public_key_t *blinded_key; - - blinded_key = &published_desc->plaintext_data.blinded_pubkey; - hs_get_subcredential(&signing_kp.pubkey, blinded_key, subcredential); - received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); - - retval = hs_desc_decode_descriptor(received_desc_str, - subcredential, &received_desc); - tt_int_op(retval, OP_EQ, 0); - tt_assert(received_desc); - - /* Check that the revision counter is correct */ - tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 42); - - hs_descriptor_free(received_desc); - received_desc = NULL; - tor_free(received_desc_str); - } - - /* Increment the revision counter and try again. Should work. */ - { - published_desc->plaintext_data.revision_counter = 1313; - tor_free(published_desc_str); - retval = hs_desc_encode_descriptor(published_desc, &signing_kp, - &published_desc_str); - tt_int_op(retval, OP_EQ, 0); - - retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str); - tt_int_op(retval, OP_EQ, 200); - } - - /* Again, fetch the published descriptor and perform the revision counter - validation. The revision counter must have changed. */ - { - const ed25519_public_key_t *blinded_key; - - blinded_key = &published_desc->plaintext_data.blinded_pubkey; - received_desc_str = helper_fetch_desc_from_hsdir(blinded_key); - - retval = hs_desc_decode_descriptor(received_desc_str, - subcredential, &received_desc); - tt_int_op(retval, OP_EQ, 0); - tt_assert(received_desc); - - /* Check that the revision counter is the latest */ - tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 1313); - } - - done: - hs_descriptor_free(published_desc); - hs_descriptor_free(received_desc); - tor_free(received_desc_str); - tor_free(published_desc_str); -} - -static networkstatus_t mock_ns; - -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - return &mock_ns; -} - -/** Test that we can store HS descriptors in the client HS cache. */ -static void -test_client_cache(void *arg) -{ - int retval; - ed25519_keypair_t signing_kp; - hs_descriptor_t *published_desc = NULL; - char *published_desc_str = NULL; - uint8_t wanted_subcredential[DIGEST256_LEN]; - response_handler_args_t *args = NULL; - dir_connection_t *conn = NULL; - - (void) arg; - - /* Initialize HSDir cache subsystem */ - init_test(); - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - /* Set consensus time */ - parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - parse_rfc1123_time("Sat, 26 Oct 1985 16:00:00 UTC", - &mock_ns.valid_until); - - /* Generate a valid descriptor with normal values. */ - { - retval = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(retval, OP_EQ, 0); - published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - tt_assert(published_desc); - retval = hs_desc_encode_descriptor(published_desc, &signing_kp, - &published_desc_str); - tt_int_op(retval, OP_EQ, 0); - memcpy(wanted_subcredential, published_desc->subcredential, DIGEST256_LEN); - tt_assert(!tor_mem_is_zero((char*)wanted_subcredential, DIGEST256_LEN)); - } - - /* Test handle_response_fetch_hsdesc_v3() */ - { - args = tor_malloc_zero(sizeof(response_handler_args_t)); - args->status_code = 200; - args->reason = NULL; - args->body = published_desc_str; - args->body_len = strlen(published_desc_str); - - conn = tor_malloc_zero(sizeof(dir_connection_t)); - conn->hs_ident = tor_malloc_zero(sizeof(hs_ident_dir_conn_t)); - ed25519_pubkey_copy(&conn->hs_ident->identity_pk, &signing_kp.pubkey); - } - - /* store the descriptor! */ - retval = handle_response_fetch_hsdesc_v3(conn, args); - tt_int_op(retval, == , 0); - - /* Progress time a bit and attempt to clean cache: our desc should not be - * cleaned since we still in the same TP. */ - { - parse_rfc1123_time("Sat, 27 Oct 1985 02:00:00 UTC", - &mock_ns.valid_after); - parse_rfc1123_time("Sat, 27 Oct 1985 03:00:00 UTC", - &mock_ns.fresh_until); - parse_rfc1123_time("Sat, 27 Oct 1985 05:00:00 UTC", - &mock_ns.valid_until); - - /* fetch the descriptor and make sure it's there */ - const hs_descriptor_t *cached_desc = NULL; - cached_desc = hs_cache_lookup_as_client(&signing_kp.pubkey); - tt_assert(cached_desc); - tt_mem_op(cached_desc->subcredential, OP_EQ, wanted_subcredential, - DIGEST256_LEN); - } - - /* Progress time to next TP and check that desc was cleaned */ - { - parse_rfc1123_time("Sat, 27 Oct 1985 12:00:00 UTC", - &mock_ns.valid_after); - parse_rfc1123_time("Sat, 27 Oct 1985 13:00:00 UTC", - &mock_ns.fresh_until); - parse_rfc1123_time("Sat, 27 Oct 1985 15:00:00 UTC", - &mock_ns.valid_until); - - const hs_descriptor_t *cached_desc = NULL; - cached_desc = hs_cache_lookup_as_client(&signing_kp.pubkey); - tt_assert(!cached_desc); - } - - done: - tor_free(args); - hs_descriptor_free(published_desc); - tor_free(published_desc_str); - if (conn) { - tor_free(conn->hs_ident); - tor_free(conn); - } -} - -struct testcase_t hs_cache[] = { - /* Encoding tests. */ - { "directory", test_directory, TT_FORK, - NULL, NULL }, - { "clean_as_dir", test_clean_as_dir, TT_FORK, - NULL, NULL }, - { "hsdir_revision_counter_check", test_hsdir_revision_counter_check, TT_FORK, - NULL, NULL }, - { "upload_and_download_hs_desc", test_upload_and_download_hs_desc, TT_FORK, - NULL, NULL }, - { "client_cache", test_client_cache, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_cell.c b/src/tor/src/test/test_hs_cell.c deleted file mode 100644 index 1b3c788a6..000000000 --- a/src/tor/src/test/test_hs_cell.c +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_cell.c - * \brief Test hidden service cell functionality. - */ - -#define HS_INTROPOINT_PRIVATE -#define HS_SERVICE_PRIVATE - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" - -#include "crypto_ed25519.h" -#include "hs_cell.h" -#include "hs_intropoint.h" -#include "hs_service.h" - -/* Trunnel. */ -#include "hs/cell_establish_intro.h" - -/** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we - * parse it from the receiver side. */ -static void -test_gen_establish_intro_cell(void *arg) -{ - (void) arg; - ssize_t ret; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t buf[RELAY_PAYLOAD_SIZE]; - trn_cell_establish_intro_t *cell_in = NULL; - - crypto_rand(circ_nonce, sizeof(circ_nonce)); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - attempt to parse it. */ - { - /* We only need the auth key pair here. */ - hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0); - /* Auth key pair is generated in the constructor so we are all set for - * using this IP object. */ - ret = hs_cell_build_establish_intro(circ_nonce, ip, buf); - service_intro_point_free(ip); - tt_u64_op(ret, OP_GT, 0); - } - - /* Check the contents of the cell */ - { - /* First byte is the auth key type: make sure its correct */ - tt_int_op(buf[0], OP_EQ, HS_INTRO_AUTH_KEY_TYPE_ED25519); - /* Next two bytes is auth key len */ - tt_int_op(ntohs(get_uint16(buf+1)), OP_EQ, ED25519_PUBKEY_LEN); - /* Skip to the number of extensions: no extensions */ - tt_int_op(buf[35], OP_EQ, 0); - /* Skip to the sig len. Make sure it's the size of an ed25519 sig */ - tt_int_op(ntohs(get_uint16(buf+35+1+32)), OP_EQ, ED25519_SIG_LEN); - } - - /* Parse it as the receiver */ - { - ret = trn_cell_establish_intro_parse(&cell_in, buf, sizeof(buf)); - tt_u64_op(ret, OP_GT, 0); - - ret = verify_establish_intro_cell(cell_in, - (const uint8_t *) circ_nonce, - sizeof(circ_nonce)); - tt_u64_op(ret, OP_EQ, 0); - } - - done: - trn_cell_establish_intro_free(cell_in); -} - -/* Mocked ed25519_sign_prefixed() function that always fails :) */ -static int -mock_ed25519_sign_prefixed(ed25519_signature_t *signature_out, - const uint8_t *msg, size_t msg_len, - const char *prefix_str, - const ed25519_keypair_t *keypair) { - (void) signature_out; - (void) msg; - (void) msg_len; - (void) prefix_str; - (void) keypair; - return -1; -} - -/** We simulate a failure to create an ESTABLISH_INTRO cell */ -static void -test_gen_establish_intro_cell_bad(void *arg) -{ - (void) arg; - ssize_t cell_len = 0; - trn_cell_establish_intro_t *cell = NULL; - char circ_nonce[DIGEST_LEN] = {0}; - hs_service_intro_point_t *ip = NULL; - - MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed); - - crypto_rand(circ_nonce, sizeof(circ_nonce)); - - setup_full_capture_of_logs(LOG_WARN); - /* Easiest way to make that function fail is to mock the - ed25519_sign_prefixed() function and make it fail. */ - cell = trn_cell_establish_intro_new(); - tt_assert(cell); - ip = service_intro_point_new(NULL, 0); - cell_len = hs_cell_build_establish_intro(circ_nonce, ip, NULL); - service_intro_point_free(ip); - expect_log_msg_containing("Unable to make signature for " - "ESTABLISH_INTRO cell."); - teardown_capture_of_logs(); - tt_i64_op(cell_len, OP_EQ, -1); - - done: - trn_cell_establish_intro_free(cell); - UNMOCK(ed25519_sign_prefixed); -} - -struct testcase_t hs_cell_tests[] = { - { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, - NULL, NULL }, - { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_client.c b/src/tor/src/test/test_hs_client.c deleted file mode 100644 index 7ee7210bc..000000000 --- a/src/tor/src/test/test_hs_client.c +++ /dev/null @@ -1,599 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_client.c - * \brief Test prop224 HS client functionality. - */ - -#define CRYPTO_PRIVATE -#define MAIN_PRIVATE -#define HS_CLIENT_PRIVATE -#define TOR_CHANNEL_INTERNAL_ -#define CIRCUITBUILD_PRIVATE -#define CIRCUITLIST_PRIVATE -#define CONNECTION_PRIVATE - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" -#include "rend_test_helpers.h" -#include "hs_test_helpers.h" - -#include "config.h" -#include "crypto.h" -#include "channeltls.h" -#include "main.h" -#include "nodelist.h" -#include "routerset.h" - -#include "hs_circuit.h" -#include "hs_client.h" -#include "hs_ident.h" -#include "hs_cache.h" -#include "circuitlist.h" -#include "circuitbuild.h" -#include "connection.h" -#include "connection_edge.h" -#include "networkstatus.h" - -static int -mock_connection_ap_handshake_send_begin(entry_connection_t *ap_conn) -{ - (void) ap_conn; - return 0; -} - -static networkstatus_t mock_ns; - -/* Always return NULL. */ -static networkstatus_t * -mock_networkstatus_get_live_consensus_false(time_t now) -{ - (void) now; - return NULL; -} - -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - return &mock_ns; -} - -/* Test helper function: Setup a circuit and a stream with the same hidden - * service destination, and put them in circ_out and - * conn_out. Make the stream wait for circuits to be established to the - * hidden service. */ -static int -helper_get_circ_and_stream_for_test(origin_circuit_t **circ_out, - connection_t **conn_out, - int is_legacy) -{ - int retval; - channel_tls_t *n_chan=NULL; - rend_data_t *conn_rend_data = NULL; - origin_circuit_t *or_circ = NULL; - connection_t *conn = NULL; - ed25519_public_key_t service_pk; - - /* Make a dummy connection stream and make it wait for our circuit */ - conn = test_conn_get_connection(AP_CONN_STATE_CIRCUIT_WAIT, - CONN_TYPE_AP /* ??? */, - 0); - if (is_legacy) { - /* Legacy: Setup rend_data of stream */ - char service_id[REND_SERVICE_ID_LEN_BASE32+1] = {0}; - TO_EDGE_CONN(conn)->rend_data = mock_rend_data(service_id); - conn_rend_data = TO_EDGE_CONN(conn)->rend_data; - } else { - /* prop224: Setup hs conn identifier on the stream */ - ed25519_secret_key_t sk; - tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0)); - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk)); - - /* Setup hs_conn_identifier of stream */ - TO_EDGE_CONN(conn)->hs_ident = hs_ident_edge_conn_new(&service_pk); - } - - /* Make it wait for circuit */ - connection_ap_mark_as_pending_circuit(TO_ENTRY_CONN(conn)); - - /* This is needed to silence a BUG warning from - connection_edge_update_circuit_isolation() */ - TO_ENTRY_CONN(conn)->original_dest_address = - tor_strdup(TO_ENTRY_CONN(conn)->socks_request->address); - - /****************************************************/ - - /* Now make dummy circuit */ - or_circ = origin_circuit_new(); - - or_circ->base_.purpose = CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED; - - or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - or_circ->build_state->is_internal = 1; - - if (is_legacy) { - /* Legacy: Setup rend data and final cpath */ - or_circ->build_state->pending_final_cpath = - tor_malloc_zero(sizeof(crypt_path_t)); - or_circ->build_state->pending_final_cpath->magic = CRYPT_PATH_MAGIC; - or_circ->build_state->pending_final_cpath->rend_dh_handshake_state = - crypto_dh_new(DH_TYPE_REND); - tt_assert( - or_circ->build_state->pending_final_cpath->rend_dh_handshake_state); - retval = crypto_dh_generate_public( - or_circ->build_state->pending_final_cpath->rend_dh_handshake_state); - tt_int_op(retval, OP_EQ, 0); - or_circ->rend_data = rend_data_dup(conn_rend_data); - } else { - /* prop224: Setup hs ident on the circuit */ - or_circ->hs_ident = hs_ident_circuit_new(&service_pk, - HS_IDENT_CIRCUIT_RENDEZVOUS); - } - - TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; - - /* fake n_chan */ - n_chan = tor_malloc_zero(sizeof(channel_tls_t)); - n_chan->base_.global_identifier = 1; - or_circ->base_.n_chan = &(n_chan->base_); - - *circ_out = or_circ; - *conn_out = conn; - - return 0; - - done: - /* something failed */ - return -1; -} - -/* Test: Ensure that setting up legacy e2e rendezvous circuits works - * correctly. */ -static void -test_e2e_rend_circuit_setup_legacy(void *arg) -{ - ssize_t retval; - origin_circuit_t *or_circ = NULL; - connection_t *conn = NULL; - - (void) arg; - - /** In this test we create a v2 legacy HS stream and a circuit with the same - * hidden service destination. We make the stream wait for circuits to be - * established to the hidden service, and then we complete the circuit using - * the hs_circuit_setup_e2e_rend_circ_legacy_client() function. We then - * check that the end-to-end cpath was setup correctly and that the stream - * was attached to the circuit as expected. */ - - MOCK(connection_ap_handshake_send_begin, - mock_connection_ap_handshake_send_begin); - - /* Setup */ - retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 1); - tt_int_op(retval, OP_EQ, 0); - tt_assert(or_circ); - tt_assert(conn); - - /* Check number of hops */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 0); - - /* Check that our stream is not attached on any circuits */ - tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL); - - /********************************************** */ - - /* Make a good RENDEZVOUS1 cell body because it needs to pass key exchange - * digest verification... */ - uint8_t rend_cell_body[DH_KEY_LEN+DIGEST_LEN] = {2}; - { - char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN]; - crypto_dh_t *dh_state = - or_circ->build_state->pending_final_cpath->rend_dh_handshake_state; - /* compute and overwrite digest of cell body with the right value */ - retval = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh_state, - (char*)rend_cell_body, DH_KEY_LEN, - keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN); - tt_int_op(retval, OP_GT, 0); - memcpy(rend_cell_body+DH_KEY_LEN, keys, DIGEST_LEN); - } - - /* Setup the circuit */ - retval = hs_circuit_setup_e2e_rend_circ_legacy_client(or_circ, - rend_cell_body); - tt_int_op(retval, OP_EQ, 0); - - /**********************************************/ - - /* See that a hop was added to the circuit's cpath */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 1); - - /* Check the digest algo */ - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), - OP_EQ, DIGEST_SHA1); - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), - OP_EQ, DIGEST_SHA1); - tt_assert(or_circ->cpath->f_crypto); - tt_assert(or_circ->cpath->b_crypto); - - /* Ensure that circ purpose was changed */ - tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED); - - /* Test that stream got attached */ - tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ)); - - done: - connection_free_minimal(conn); - if (or_circ) - tor_free(TO_CIRCUIT(or_circ)->n_chan); - circuit_free_(TO_CIRCUIT(or_circ)); -} - -/* Test: Ensure that setting up v3 rendezvous circuits works correctly. */ -static void -test_e2e_rend_circuit_setup(void *arg) -{ - uint8_t ntor_key_seed[DIGEST256_LEN] = {0}; - origin_circuit_t *or_circ = NULL; - int retval; - connection_t *conn = NULL; - - (void) arg; - - /** In this test we create a prop224 v3 HS stream and a circuit with the same - * hidden service destination. We make the stream wait for circuits to be - * established to the hidden service, and then we complete the circuit using - * the hs_circuit_setup_e2e_rend_circ() function. We then check that the - * end-to-end cpath was setup correctly and that the stream was attached to - * the circuit as expected. */ - - MOCK(connection_ap_handshake_send_begin, - mock_connection_ap_handshake_send_begin); - - /* Setup */ - retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 0); - tt_int_op(retval, OP_EQ, 0); - tt_assert(or_circ); - tt_assert(conn); - - /* Check number of hops: There should be no hops yet to this circ */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 0); - tt_ptr_op(or_circ->cpath, OP_EQ, NULL); - - /* Check that our stream is not attached on any circuits */ - tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL); - - /**********************************************/ - - /* Setup the circuit */ - retval = hs_circuit_setup_e2e_rend_circ(or_circ, - ntor_key_seed, sizeof(ntor_key_seed), - 0); - tt_int_op(retval, OP_EQ, 0); - - /**********************************************/ - - /* See that a hop was added to the circuit's cpath */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 1); - - /* Check that the crypt path has prop224 algorithm parameters */ - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), - OP_EQ, DIGEST_SHA3_256); - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), - OP_EQ, DIGEST_SHA3_256); - tt_assert(or_circ->cpath->f_crypto); - tt_assert(or_circ->cpath->b_crypto); - - /* Ensure that circ purpose was changed */ - tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED); - - /* Test that stream got attached */ - tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ)); - - done: - connection_free_minimal(conn); - if (or_circ) - tor_free(TO_CIRCUIT(or_circ)->n_chan); - circuit_free_(TO_CIRCUIT(or_circ)); -} - -/** Test client logic for picking intro points from a descriptor. Also test how - * ExcludeNodes and intro point failures affect picking intro points. */ -static void -test_client_pick_intro(void *arg) -{ - int ret; - ed25519_keypair_t service_kp; - hs_descriptor_t *desc = NULL; - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - (void) arg; - - hs_init(); - - /* Generate service keypair */ - tt_int_op(0, OP_EQ, ed25519_keypair_generate(&service_kp, 0)); - - /* Set time */ - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - - update_approx_time(mock_ns.fresh_until-10); - time_t now = approx_time(); - - /* Test logic: - * - * 1) Add our desc with intro points to the HS cache. - * - * 2) Mark all descriptor intro points except _the chosen one_ as - * failed. Then query the desc to get a random intro: check that we got - * _the chosen one_. Then fail the chosen one as well, and see that no - * intros are returned. - * - * 3) Then clean the intro state cache and get an intro point. - * - * 4) Try fetching an intro with the wrong service key: shouldn't work - * - * 5) Set StrictNodes and put all our intro points in ExcludeNodes: see that - * nothing is returned. - */ - - /* 1) Add desc to HS cache */ - { - char *encoded = NULL; - desc = hs_helper_build_hs_desc_with_ip(&service_kp); - ret = hs_desc_encode_descriptor(desc, &service_kp, &encoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(encoded); - - /* store it */ - hs_cache_store_as_client(encoded, &service_kp.pubkey); - - /* fetch it to make sure it works */ - const hs_descriptor_t *fetched_desc = - hs_cache_lookup_as_client(&service_kp.pubkey); - tt_assert(fetched_desc); - tt_mem_op(fetched_desc->subcredential, OP_EQ, desc->subcredential, - DIGEST256_LEN); - tt_assert(!tor_mem_is_zero((char*)fetched_desc->subcredential, - DIGEST256_LEN)); - tor_free(encoded); - } - - /* 2) Mark all intro points except _the chosen one_ as failed. Then query the - * desc and get a random intro: check that we got _the chosen one_. */ - { - /* Pick the chosen intro point and get its ei */ - hs_desc_intro_point_t *chosen_intro_point = - smartlist_get(desc->encrypted_data.intro_points, 0); - extend_info_t *chosen_intro_ei = - desc_intro_point_to_extend_info(chosen_intro_point); - tt_assert(chosen_intro_point); - tt_assert(chosen_intro_ei); - - /* Now mark all other intro points as failed */ - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - hs_desc_intro_point_t *, ip) { - /* Skip the chosen intro point */ - if (ip == chosen_intro_point) { - continue; - } - ed25519_public_key_t *intro_auth_key = &ip->auth_key_cert->signed_key; - hs_cache_client_intro_state_note(&service_kp.pubkey, - intro_auth_key, - INTRO_POINT_FAILURE_GENERIC); - } SMARTLIST_FOREACH_END(ip); - - /* Try to get a random intro: Should return the chosen one! */ - extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); - tor_assert(ip); - tt_assert(!tor_mem_is_zero((char*)ip->identity_digest, DIGEST_LEN)); - tt_mem_op(ip->identity_digest, OP_EQ, chosen_intro_ei->identity_digest, - DIGEST_LEN); - - extend_info_free(chosen_intro_ei); - extend_info_free(ip); - - /* Now also mark the chosen one as failed: See that we can't get any intro - points anymore. */ - hs_cache_client_intro_state_note(&service_kp.pubkey, - &chosen_intro_point->auth_key_cert->signed_key, - INTRO_POINT_FAILURE_TIMEOUT); - ip = client_get_random_intro(&service_kp.pubkey); - tor_assert(!ip); - } - - /* 3) Clean the intro state cache and get an intro point */ - { - /* Pretend we are 5 mins in the future and order a cleanup of the intro - * state. This should clean up the intro point failures and allow us to get - * an intro. */ - hs_cache_client_intro_state_clean(now + 5*60); - - /* Get an intro. It should work! */ - extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); - tor_assert(ip); - extend_info_free(ip); - } - - /* 4) Try fetching an intro with the wrong service key: shouldn't work */ - { - ed25519_keypair_t dummy_kp; - tt_int_op(0, OP_EQ, ed25519_keypair_generate(&dummy_kp, 0)); - extend_info_t *ip = client_get_random_intro(&dummy_kp.pubkey); - tor_assert(!ip); - } - - /* 5) Set StrictNodes and put all our intro points in ExcludeNodes: see that - * nothing is returned. */ - { - get_options_mutable()->ExcludeNodes = routerset_new(); - get_options_mutable()->StrictNodes = 1; - SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points, - hs_desc_intro_point_t *, ip) { - extend_info_t *intro_ei = desc_intro_point_to_extend_info(ip); - if (intro_ei) { - const char *ptr; - char ip_addr[TOR_ADDR_BUF_LEN]; - /* We need to decorate in case it is an IPv6 else routerset_parse() - * doesn't like it. */ - ptr = tor_addr_to_str(ip_addr, &intro_ei->addr, sizeof(ip_addr), 1); - tt_assert(ptr == ip_addr); - ret = routerset_parse(get_options_mutable()->ExcludeNodes, - ip_addr, ""); - tt_int_op(ret, OP_EQ, 0); - extend_info_free(intro_ei); - } - } SMARTLIST_FOREACH_END(ip); - - extend_info_t *ip = client_get_random_intro(&service_kp.pubkey); - tt_assert(!ip); - } - - done: - hs_descriptor_free(desc); -} - -static int -mock_router_have_minimum_dir_info_false(void) -{ - return 0; -} -static int -mock_router_have_minimum_dir_info_true(void) -{ - return 1; -} - -static hs_client_fetch_status_t -mock_fetch_v3_desc_error(const ed25519_public_key_t *key) -{ - (void) key; - return HS_CLIENT_FETCH_ERROR; -} - -static void -mock_connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, - int line, const char *file) -{ - (void) line; - (void) file; - conn->edge_.end_reason = endreason; -} - -static void -test_descriptor_fetch(void *arg) -{ - int ret; - entry_connection_t *ec = NULL; - ed25519_public_key_t service_pk; - ed25519_secret_key_t service_sk; - - (void) arg; - - hs_init(); - memset(&service_sk, 'A', sizeof(service_sk)); - ret = ed25519_public_key_generate(&service_pk, &service_sk); - tt_int_op(ret, OP_EQ, 0); - - /* Initialize this so get_voting_interval() doesn't freak out. */ - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - - ec = entry_connection_new(CONN_TYPE_AP, AF_INET); - tt_assert(ec); - ENTRY_TO_EDGE_CONN(ec)->hs_ident = hs_ident_edge_conn_new(&service_pk); - tt_assert(ENTRY_TO_EDGE_CONN(ec)->hs_ident); - TO_CONN(ENTRY_TO_EDGE_CONN(ec))->state = AP_CONN_STATE_RENDDESC_WAIT; - smartlist_add(get_connection_array(), &ec->edge_.base_); - - /* 1. FetchHidServDescriptors is false so we shouldn't be able to fetch. */ - get_options_mutable()->FetchHidServDescriptors = 0; - ret = hs_client_refetch_hsdesc(&service_pk); - tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_NOT_ALLOWED); - get_options_mutable()->FetchHidServDescriptors = 1; - - /* 2. We don't have a live consensus. */ - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus_false); - ret = hs_client_refetch_hsdesc(&service_pk); - UNMOCK(networkstatus_get_live_consensus); - tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_MISSING_INFO); - - /* From now on, return a live consensus. */ - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - /* 3. Not enough dir information. */ - MOCK(router_have_minimum_dir_info, - mock_router_have_minimum_dir_info_false); - ret = hs_client_refetch_hsdesc(&service_pk); - UNMOCK(router_have_minimum_dir_info); - tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_MISSING_INFO); - - /* From now on, we do have enough directory information. */ - MOCK(router_have_minimum_dir_info, - mock_router_have_minimum_dir_info_true); - - /* 4. We do have a pending directory request. */ - { - dir_connection_t *dir_conn = dir_connection_new(AF_INET); - dir_conn->hs_ident = tor_malloc_zero(sizeof(hs_ident_dir_conn_t)); - TO_CONN(dir_conn)->purpose = DIR_PURPOSE_FETCH_HSDESC; - ed25519_pubkey_copy(&dir_conn->hs_ident->identity_pk, &service_pk); - smartlist_add(get_connection_array(), TO_CONN(dir_conn)); - ret = hs_client_refetch_hsdesc(&service_pk); - smartlist_remove(get_connection_array(), TO_CONN(dir_conn)); - connection_free_minimal(TO_CONN(dir_conn)); - tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_PENDING); - } - - /* 5. We'll trigger an error on the fetch_desc_v3 and force to close all - * pending SOCKS request. */ - MOCK(router_have_minimum_dir_info, - mock_router_have_minimum_dir_info_true); - MOCK(fetch_v3_desc, mock_fetch_v3_desc_error); - MOCK(connection_mark_unattached_ap_, - mock_connection_mark_unattached_ap_); - ret = hs_client_refetch_hsdesc(&service_pk); - UNMOCK(fetch_v3_desc); - UNMOCK(connection_mark_unattached_ap_); - tt_int_op(ret, OP_EQ, HS_CLIENT_FETCH_ERROR); - /* The close waiting for descriptor function has been called. */ - tt_int_op(ec->edge_.end_reason, OP_EQ, END_STREAM_REASON_RESOLVEFAILED); - - done: - connection_free_minimal(ENTRY_TO_CONN(ec)); - UNMOCK(networkstatus_get_live_consensus); - UNMOCK(router_have_minimum_dir_info); - hs_free_all(); -} - -struct testcase_t hs_client_tests[] = { - { "e2e_rend_circuit_setup_legacy", test_e2e_rend_circuit_setup_legacy, - TT_FORK, NULL, NULL }, - { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup, - TT_FORK, NULL, NULL }, - { "client_pick_intro", test_client_pick_intro, - TT_FORK, NULL, NULL }, - { "descriptor_fetch", test_descriptor_fetch, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_common.c b/src/tor/src/test/test_hs_common.c deleted file mode 100644 index b9b76d15b..000000000 --- a/src/tor/src/test/test_hs_common.c +++ /dev/null @@ -1,1822 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_common.c - * \brief Test hidden service common functionalities. - */ - -#define HS_COMMON_PRIVATE -#define HS_CLIENT_PRIVATE -#define HS_SERVICE_PRIVATE -#define NODELIST_PRIVATE - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" -#include "hs_test_helpers.h" - -#include "connection_edge.h" -#include "hs_common.h" -#include "hs_client.h" -#include "hs_service.h" -#include "config.h" -#include "networkstatus.h" -#include "directory.h" -#include "dirvote.h" -#include "nodelist.h" -#include "routerlist.h" -#include "statefile.h" -#include "circuitlist.h" -#include "shared_random.h" -#include "util.h" - -/** Test the validation of HS v3 addresses */ -static void -test_validate_address(void *arg) -{ - int ret; - - (void) arg; - - /* Address too short and too long. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_address_is_valid("blah"); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg_containing("has an invalid length"); - teardown_capture_of_logs(); - - setup_full_capture_of_logs(LOG_WARN); - ret = hs_address_is_valid( - "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnadb"); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg_containing("has an invalid length"); - teardown_capture_of_logs(); - - /* Invalid checksum (taken from prop224) */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_address_is_valid( - "l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad"); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg_containing("invalid checksum"); - teardown_capture_of_logs(); - - setup_full_capture_of_logs(LOG_WARN); - ret = hs_address_is_valid( - "btojiu7nu5y5iwut64eufevogqdw4wmqzugnoluw232r4t3ecsfv37ad"); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg_containing("invalid checksum"); - teardown_capture_of_logs(); - - /* Non base32 decodable string. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_address_is_valid( - "????????????????????????????????????????????????????????"); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg_containing("can't be decoded"); - teardown_capture_of_logs(); - - /* Valid address. */ - ret = hs_address_is_valid( - "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); - tt_int_op(ret, OP_EQ, 1); - - done: - ; -} - -static int -mock_write_str_to_file(const char *path, const char *str, int bin) -{ - (void)bin; - tt_str_op(path, OP_EQ, "/double/five"PATH_SEPARATOR"squared"); - tt_str_op(str, OP_EQ, - "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion\n"); - - done: - return 0; -} - -/** Test building HS v3 onion addresses. Uses test vectors from the - * ./hs_build_address.py script. */ -static void -test_build_address(void *arg) -{ - int ret; - char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - ed25519_public_key_t pubkey; - /* hex-encoded ed25519 pubkey used in hs_build_address.py */ - char pubkey_hex[] = - "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; - hs_service_t *service = NULL; - - (void) arg; - - MOCK(write_str_to_file, mock_write_str_to_file); - - /* The following has been created with hs_build_address.py script that - * follows proposal 224 specification to build an onion address. */ - static const char *test_addr = - "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"; - - /* Let's try to build the same onion address as the script */ - base16_decode((char*)pubkey.pubkey, sizeof(pubkey.pubkey), - pubkey_hex, strlen(pubkey_hex)); - hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr); - tt_str_op(test_addr, OP_EQ, onion_addr); - /* Validate that address. */ - ret = hs_address_is_valid(onion_addr); - tt_int_op(ret, OP_EQ, 1); - - service = tor_malloc_zero(sizeof(hs_service_t)); - memcpy(service->onion_address, onion_addr, sizeof(service->onion_address)); - tor_asprintf(&service->config.directory_path, "/double/five"); - ret = write_address_to_file(service, "squared"); - tt_int_op(ret, OP_EQ, 0); - - done: - hs_service_free(service); -} - -/** Test that our HS time period calculation functions work properly */ -static void -test_time_period(void *arg) -{ - (void) arg; - uint64_t tn; - int retval; - time_t fake_time, correct_time, start_time; - - /* Let's do the example in prop224 section [TIME-PERIODS] */ - retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", - &fake_time); - tt_int_op(retval, OP_EQ, 0); - - /* Check that the time period number is right */ - tn = hs_get_time_period_num(fake_time); - tt_u64_op(tn, OP_EQ, 16903); - - /* Increase current time to 11:59:59 UTC and check that the time period - number is still the same */ - fake_time += 3599; - tn = hs_get_time_period_num(fake_time); - tt_u64_op(tn, OP_EQ, 16903); - - { /* Check start time of next time period */ - retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", - &correct_time); - tt_int_op(retval, OP_EQ, 0); - - start_time = hs_get_start_time_of_next_time_period(fake_time); - tt_int_op(start_time, OP_EQ, correct_time); - } - - /* Now take time to 12:00:00 UTC and check that the time period rotated */ - fake_time += 1; - tn = hs_get_time_period_num(fake_time); - tt_u64_op(tn, OP_EQ, 16904); - - /* Now also check our hs_get_next_time_period_num() function */ - tn = hs_get_next_time_period_num(fake_time); - tt_u64_op(tn, OP_EQ, 16905); - - { /* Check start time of next time period again */ - retval = parse_rfc1123_time("Wed, 14 Apr 2016 12:00:00 UTC", - &correct_time); - tt_int_op(retval, OP_EQ, 0); - - start_time = hs_get_start_time_of_next_time_period(fake_time); - tt_int_op(start_time, OP_EQ, correct_time); - } - - /* Now do another sanity check: The time period number at the start of the - * next time period, must be the same time period number as the one returned - * from hs_get_next_time_period_num() */ - { - time_t next_tp_start = hs_get_start_time_of_next_time_period(fake_time); - tt_u64_op(hs_get_time_period_num(next_tp_start), OP_EQ, - hs_get_next_time_period_num(fake_time)); - } - - done: - ; -} - -/** Test that we can correctly find the start time of the next time period */ -static void -test_start_time_of_next_time_period(void *arg) -{ - (void) arg; - int retval; - time_t fake_time; - char tbuf[ISO_TIME_LEN + 1]; - time_t next_tp_start_time; - - /* Do some basic tests */ - retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", - &fake_time); - tt_int_op(retval, OP_EQ, 0); - next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); - /* Compare it with the correct result */ - format_iso_time(tbuf, next_tp_start_time); - tt_str_op("2016-04-13 12:00:00", OP_EQ, tbuf); - - /* Another test with an edge-case time (start of TP) */ - retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", - &fake_time); - tt_int_op(retval, OP_EQ, 0); - next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); - format_iso_time(tbuf, next_tp_start_time); - tt_str_op("2016-04-14 12:00:00", OP_EQ, tbuf); - - { - /* Now pretend we are on a testing network and alter the voting schedule to - be every 10 seconds. This means that a time period has length 10*24 - seconds (4 minutes). It also means that we apply a rotational offset of - 120 seconds to the time period, so that it starts at 00:02:00 instead of - 00:00:00. */ - or_options_t *options = get_options_mutable(); - options->TestingTorNetwork = 1; - options->V3AuthVotingInterval = 10; - options->TestingV3AuthInitialVotingInterval = 10; - - retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:00:00 UTC", - &fake_time); - tt_int_op(retval, OP_EQ, 0); - next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); - /* Compare it with the correct result */ - format_iso_time(tbuf, next_tp_start_time); - tt_str_op("2016-04-13 00:02:00", OP_EQ, tbuf); - - retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:02:00 UTC", - &fake_time); - tt_int_op(retval, OP_EQ, 0); - next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time); - /* Compare it with the correct result */ - format_iso_time(tbuf, next_tp_start_time); - tt_str_op("2016-04-13 00:06:00", OP_EQ, tbuf); - } - - done: - ; -} - -/* Cleanup the global nodelist. It also frees the "md" in the node_t because - * we allocate the memory in helper_add_hsdir_to_networkstatus(). */ -static void -cleanup_nodelist(void) -{ - smartlist_t *nodelist = nodelist_get_list(); - SMARTLIST_FOREACH_BEGIN(nodelist, node_t *, node) { - tor_free(node->md); - node->md = NULL; - } SMARTLIST_FOREACH_END(node); - nodelist_free_all(); -} - -static void -helper_add_hsdir_to_networkstatus(networkstatus_t *ns, - int identity_idx, - const char *nickname, - int is_hsdir) -{ - routerstatus_t *rs = tor_malloc_zero(sizeof(routerstatus_t)); - routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t)); - uint8_t identity[DIGEST_LEN]; - tor_addr_t ipv4_addr; - - memset(identity, identity_idx, sizeof(identity)); - - memcpy(rs->identity_digest, identity, DIGEST_LEN); - rs->is_hs_dir = is_hsdir; - rs->supports_v3_hsdir = 1; - strlcpy(rs->nickname, nickname, sizeof(rs->nickname)); - tor_addr_parse(&ipv4_addr, "1.2.3.4"); - ri->addr = tor_addr_to_ipv4h(&ipv4_addr); - rs->addr = tor_addr_to_ipv4h(&ipv4_addr); - ri->nickname = tor_strdup(nickname); - ri->protocol_list = tor_strdup("HSDir=1-2 LinkAuth=3"); - memcpy(ri->cache_info.identity_digest, identity, DIGEST_LEN); - ri->cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); - /* Needed for the HSDir index computation. */ - memset(&ri->cache_info.signing_key_cert->signing_key, - identity_idx, ED25519_PUBKEY_LEN); - tt_assert(nodelist_set_routerinfo(ri, NULL)); - node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); - tt_assert(node); - node->rs = rs; - /* We need this to exist for node_has_descriptor() to return true. */ - node->md = tor_malloc_zero(sizeof(microdesc_t)); - /* Do this now the nodelist_set_routerinfo() function needs a "rs" to set - * the indexes which it doesn't have when it is called. */ - node_set_hsdir_index(node, ns); - node->ri = NULL; - smartlist_add(ns->routerstatus_list, rs); - - done: - routerinfo_free(ri); -} - -static networkstatus_t *mock_ns = NULL; - -static networkstatus_t * -mock_networkstatus_get_latest_consensus(void) -{ - time_t now = approx_time(); - - /* If initialized, return it */ - if (mock_ns) { - return mock_ns; - } - - /* Initialize fake consensus */ - mock_ns = tor_malloc_zero(sizeof(networkstatus_t)); - - /* This consensus is live */ - mock_ns->valid_after = now-1; - mock_ns->fresh_until = now+1; - mock_ns->valid_until = now+2; - /* Create routerstatus list */ - mock_ns->routerstatus_list = smartlist_new(); - mock_ns->type = NS_TYPE_CONSENSUS; - - return mock_ns; -} - -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - - tt_assert(mock_ns); - - done: - return mock_ns; -} - -/** Test the responsible HSDirs calculation function */ -static void -test_responsible_hsdirs(void *arg) -{ - time_t now = approx_time(); - smartlist_t *responsible_dirs = smartlist_new(); - networkstatus_t *ns = NULL; - int retval; - - (void) arg; - - hs_init(); - - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus); - - ns = networkstatus_get_latest_consensus(); - - { /* First router: HSdir */ - helper_add_hsdir_to_networkstatus(ns, 1, "igor", 1); - } - - { /* Second HSDir */ - helper_add_hsdir_to_networkstatus(ns, 2, "victor", 1); - } - - { /* Third relay but not HSDir */ - helper_add_hsdir_to_networkstatus(ns, 3, "spyro", 0); - } - - ed25519_keypair_t kp; - retval = ed25519_keypair_generate(&kp, 0); - tt_int_op(retval, OP_EQ , 0); - - uint64_t time_period_num = hs_get_time_period_num(now); - hs_get_responsible_hsdirs(&kp.pubkey, time_period_num, - 0, 0, responsible_dirs); - - /* Make sure that we only found 2 responsible HSDirs. - * The third relay was not an hsdir! */ - tt_int_op(smartlist_len(responsible_dirs), OP_EQ, 2); - - /** TODO: Build a bigger network and do more tests here */ - - done: - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_free(responsible_dirs); - smartlist_clear(ns->routerstatus_list); - networkstatus_vote_free(mock_ns); - cleanup_nodelist(); -} - -static void -mock_directory_initiate_request(directory_request_t *req) -{ - (void)req; - return; -} - -static int -mock_hs_desc_encode_descriptor(const hs_descriptor_t *desc, - const ed25519_keypair_t *signing_kp, - char **encoded_out) -{ - (void)desc; - (void)signing_kp; - - tor_asprintf(encoded_out, "lulu"); - return 0; -} - -static or_state_t dummy_state; - -/* Mock function to get fake or state (used for rev counters) */ -static or_state_t * -get_or_state_replacement(void) -{ - return &dummy_state; -} - -static int -mock_router_have_minimum_dir_info(void) -{ - return 1; -} - -/** Test that we correctly detect when the HSDir hash ring changes so that we - * reupload our descriptor. */ -static void -test_desc_reupload_logic(void *arg) -{ - networkstatus_t *ns = NULL; - - (void) arg; - - hs_init(); - - MOCK(router_have_minimum_dir_info, - mock_router_have_minimum_dir_info); - MOCK(get_or_state, - get_or_state_replacement); - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus); - MOCK(directory_initiate_request, - mock_directory_initiate_request); - MOCK(hs_desc_encode_descriptor, - mock_hs_desc_encode_descriptor); - - ns = networkstatus_get_latest_consensus(); - - /** Test logic: - * 1) Upload descriptor to HSDirs - * CHECK that previous_hsdirs list was populated. - * 2) Then call router_dir_info_changed() without an HSDir set change. - * CHECK that no reuplod occurs. - * 3) Now change the HSDir set, and call dir_info_changed() again. - * CHECK that reupload occurs. - * 4) Finally call service_desc_schedule_upload(). - * CHECK that previous_hsdirs list was cleared. - **/ - - /* Let's start by building our descriptor and service */ - hs_service_descriptor_t *desc = service_descriptor_new(); - hs_service_t *service = NULL; - /* hex-encoded ed25519 pubkey used in hs_build_address.py */ - char pubkey_hex[] = - "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; - char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - ed25519_public_key_t pubkey; - base16_decode((char*)pubkey.pubkey, sizeof(pubkey.pubkey), - pubkey_hex, strlen(pubkey_hex)); - hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr); - service = tor_malloc_zero(sizeof(hs_service_t)); - memcpy(service->onion_address, onion_addr, sizeof(service->onion_address)); - ed25519_secret_key_generate(&service->keys.identity_sk, 0); - ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk); - service->desc_current = desc; - /* Also add service to service map */ - hs_service_ht *service_map = get_hs_service_map(); - tt_assert(service_map); - tt_int_op(hs_service_get_num_services(), OP_EQ, 0); - register_service(service_map, service); - tt_int_op(hs_service_get_num_services(), OP_EQ, 1); - - /* Now let's create our hash ring: */ - { - helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); - helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); - helper_add_hsdir_to_networkstatus(ns, 3, "aaron", 1); - helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); - helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); - helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); - } - - /* Now let's upload our desc to all hsdirs */ - upload_descriptor_to_all(service, desc); - /* Check that previous hsdirs were populated */ - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); - - /* Poison next upload time so that we can see if it was changed by - * router_dir_info_changed(). No changes in hash ring so far, so the upload - * time should stay as is. */ - desc->next_upload_time = 42; - router_dir_info_changed(); - tt_int_op(desc->next_upload_time, OP_EQ, 42); - - /* Now change the HSDir hash ring by swapping nora for aaron. - * Start by clearing the hash ring */ - { - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(ns->routerstatus_list); - cleanup_nodelist(); - routerlist_free_all(); - } - - { /* Now add back all the nodes */ - helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); - helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); - helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); - helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); - helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); - helper_add_hsdir_to_networkstatus(ns, 7, "nora", 1); - } - - /* Now call service_desc_hsdirs_changed() and see that it detected the hash - ring change */ - time_t now = approx_time(); - tt_assert(now); - tt_int_op(service_desc_hsdirs_changed(service, desc), OP_EQ, 1); - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); - - /* Now order another upload and see that we keep having 6 prev hsdirs */ - upload_descriptor_to_all(service, desc); - /* Check that previous hsdirs were populated */ - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); - - /* Now restore the HSDir hash ring to its original state by swapping back - aaron for nora */ - /* First clear up the hash ring */ - { - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(ns->routerstatus_list); - cleanup_nodelist(); - routerlist_free_all(); - } - - { /* Now populate the hash ring again */ - helper_add_hsdir_to_networkstatus(ns, 1, "dingus", 1); - helper_add_hsdir_to_networkstatus(ns, 2, "clive", 1); - helper_add_hsdir_to_networkstatus(ns, 3, "aaron", 1); - helper_add_hsdir_to_networkstatus(ns, 4, "lizzie", 1); - helper_add_hsdir_to_networkstatus(ns, 5, "daewon", 1); - helper_add_hsdir_to_networkstatus(ns, 6, "clarke", 1); - } - - /* Check that our algorithm catches this change of hsdirs */ - tt_int_op(service_desc_hsdirs_changed(service, desc), OP_EQ, 1); - - /* Now pretend that the descriptor changed, and order a reupload to all - HSDirs. Make sure that the set of previous HSDirs was cleared. */ - service_desc_schedule_upload(desc, now, 1); - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 0); - - /* Now reupload again: see that the prev hsdir set got populated again. */ - upload_descriptor_to_all(service, desc); - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 6); - - done: - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(ns->routerstatus_list); - networkstatus_vote_free(ns); - cleanup_nodelist(); - hs_free_all(); -} - -/** Test disaster SRV computation and caching */ -static void -test_disaster_srv(void *arg) -{ - uint8_t *cached_disaster_srv_one = NULL; - uint8_t *cached_disaster_srv_two = NULL; - uint8_t srv_one[DIGEST256_LEN] = {0}; - uint8_t srv_two[DIGEST256_LEN] = {0}; - uint8_t srv_three[DIGEST256_LEN] = {0}; - uint8_t srv_four[DIGEST256_LEN] = {0}; - uint8_t srv_five[DIGEST256_LEN] = {0}; - - (void) arg; - - /* Get the cached SRVs: we gonna use them later for verification */ - cached_disaster_srv_one = get_first_cached_disaster_srv(); - cached_disaster_srv_two = get_second_cached_disaster_srv(); - - /* Compute some srvs */ - get_disaster_srv(1, srv_one); - get_disaster_srv(2, srv_two); - - /* Check that the cached ones where updated */ - tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN); - tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); - - /* Ask for an SRV that has already been computed */ - get_disaster_srv(2, srv_two); - /* and check that the cache entries have not changed */ - tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN); - tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); - - /* Ask for a new SRV */ - get_disaster_srv(3, srv_three); - tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN); - tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN); - - /* Ask for another SRV: none of the original SRVs should now be cached */ - get_disaster_srv(4, srv_four); - tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN); - tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN); - - /* Ask for yet another SRV */ - get_disaster_srv(5, srv_five); - tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_five, DIGEST256_LEN); - tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN); - - done: - ; -} - -/** Test our HS descriptor request tracker by making various requests and - * checking whether they get tracked properly. */ -static void -test_hid_serv_request_tracker(void *arg) -{ - (void) arg; - time_t retval; - routerstatus_t *hsdir = NULL, *hsdir2 = NULL, *hsdir3 = NULL; - time_t now = approx_time(); - - const char *req_key_str_first = - "vd4zb6zesaubtrjvdqcr2w7x7lhw2up4Xnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs"; - const char *req_key_str_second = - "g53o7iavcd62oihswhr24u6czmqws5kpXnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs"; - const char *req_key_str_small = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; - - /*************************** basic test *******************************/ - - /* Get request tracker and make sure it's empty */ - strmap_t *request_tracker = get_last_hid_serv_requests(); - tt_int_op(strmap_size(request_tracker),OP_EQ, 0); - - /* Let's register a hid serv request */ - hsdir = tor_malloc_zero(sizeof(routerstatus_t)); - memset(hsdir->identity_digest, 'Z', DIGEST_LEN); - retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, - now, 1); - tt_int_op(retval, OP_EQ, now); - tt_int_op(strmap_size(request_tracker),OP_EQ, 1); - - /* Let's lookup a non-existent hidserv request */ - retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_second, - now+1, 0); - tt_int_op(retval, OP_EQ, 0); - tt_int_op(strmap_size(request_tracker),OP_EQ, 1); - - /* Let's lookup a real hidserv request */ - retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, - now+2, 0); - tt_int_op(retval, OP_EQ, now); /* we got it */ - tt_int_op(strmap_size(request_tracker),OP_EQ, 1); - - /**********************************************************************/ - - /* Let's add another request for the same HS but on a different HSDir. */ - hsdir2 = tor_malloc_zero(sizeof(routerstatus_t)); - memset(hsdir2->identity_digest, 2, DIGEST_LEN); - retval = hs_lookup_last_hid_serv_request(hsdir2, req_key_str_first, - now+3, 1); - tt_int_op(retval, OP_EQ, now+3); - tt_int_op(strmap_size(request_tracker),OP_EQ, 2); - - /* Check that we can clean the first request based on time */ - hs_clean_last_hid_serv_requests(now+3+REND_HID_SERV_DIR_REQUERY_PERIOD); - tt_int_op(strmap_size(request_tracker),OP_EQ, 1); - /* Check that it doesn't exist anymore */ - retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first, - now+2, 0); - tt_int_op(retval, OP_EQ, 0); - - /* Now let's add a smaller req key str */ - hsdir3 = tor_malloc_zero(sizeof(routerstatus_t)); - memset(hsdir3->identity_digest, 3, DIGEST_LEN); - retval = hs_lookup_last_hid_serv_request(hsdir3, req_key_str_small, - now+4, 1); - tt_int_op(retval, OP_EQ, now+4); - tt_int_op(strmap_size(request_tracker),OP_EQ, 2); - - /*************************** deleting entries **************************/ - - /* Add another request with very short key */ - retval = hs_lookup_last_hid_serv_request(hsdir, "l", now, 1); - tt_int_op(retval, OP_EQ, now); - tt_int_op(strmap_size(request_tracker),OP_EQ, 3); - - /* Try deleting entries with a dummy key. Check that our previous requests - * are still there */ - tor_capture_bugs_(1); - hs_purge_hid_serv_from_last_hid_serv_requests("a"); - tt_int_op(strmap_size(request_tracker),OP_EQ, 3); - tor_end_capture_bugs_(); - - /* Try another dummy key. Check that requests are still there */ - { - char dummy[2000]; - memset(dummy, 'Z', 2000); - dummy[1999] = '\x00'; - hs_purge_hid_serv_from_last_hid_serv_requests(dummy); - tt_int_op(strmap_size(request_tracker),OP_EQ, 3); - } - - /* Another dummy key! */ - hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_second); - tt_int_op(strmap_size(request_tracker),OP_EQ, 3); - - /* Now actually delete a request! */ - hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_first); - tt_int_op(strmap_size(request_tracker),OP_EQ, 2); - - /* Purge it all! */ - hs_purge_last_hid_serv_requests(); - request_tracker = get_last_hid_serv_requests(); - tt_int_op(strmap_size(request_tracker),OP_EQ, 0); - - done: - tor_free(hsdir); - tor_free(hsdir2); - tor_free(hsdir3); -} - -static void -test_parse_extended_hostname(void *arg) -{ - (void) arg; - - char address1[] = "fooaddress.onion"; - char address2[] = "aaaaaaaaaaaaaaaa.onion"; - char address3[] = "fooaddress.exit"; - char address4[] = "www.torproject.org"; - char address5[] = "foo.abcdefghijklmnop.onion"; - char address6[] = "foo.bar.abcdefghijklmnop.onion"; - char address7[] = ".abcdefghijklmnop.onion"; - char address8[] = - "www.25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid.onion"; - - tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1)); - tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address2)); - tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa"); - tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3)); - tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4)); - tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address5)); - tt_str_op(address5,OP_EQ, "abcdefghijklmnop"); - tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address6)); - tt_str_op(address6,OP_EQ, "abcdefghijklmnop"); - tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7)); - tt_assert(ONION_V3_HOSTNAME == parse_extended_hostname(address8)); - tt_str_op(address8, OP_EQ, - "25njqamcweflpvkl73j4szahhihoc4xt3ktcgjnpaingr5yhkenl5sid"); - - done: ; -} - -static void -test_time_between_tp_and_srv(void *arg) -{ - int ret; - networkstatus_t ns; - (void) arg; - - /* This function should be returning true where "^" are: - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^^^^^^^^^^^^ ^^^^^^^^^^^^ | - * | | - * +------------------------------------------------------------------+ - */ - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 00:00:00 UTC", &ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 01:00:00 UTC", &ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), ns.valid_after); - ret = hs_in_period_between_tp_and_srv(&ns, 0); - tt_int_op(ret, OP_EQ, 0); - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 11:00:00 UTC", &ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), ns.valid_after); - ret = hs_in_period_between_tp_and_srv(&ns, 0); - tt_int_op(ret, OP_EQ, 0); - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC", &ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", &ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), ns.valid_after); - ret = hs_in_period_between_tp_and_srv(&ns, 0); - tt_int_op(ret, OP_EQ, 1); - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 23:00:00 UTC", &ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), ns.valid_after); - ret = hs_in_period_between_tp_and_srv(&ns, 0); - tt_int_op(ret, OP_EQ, 1); - - ret = parse_rfc1123_time("Sat, 27 Oct 1985 00:00:00 UTC", &ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 27 Oct 1985 01:00:00 UTC", &ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), ns.valid_after); - ret = hs_in_period_between_tp_and_srv(&ns, 0); - tt_int_op(ret, OP_EQ, 0); - - done: - ; -} - -/************ Reachability Test (it is huge) ****************/ - -/* Simulate different consensus for client and service. Used by the - * reachability test. The SRV and responsible HSDir list are used by all - * reachability tests so make them common to simplify setup and teardown. */ -static networkstatus_t *mock_service_ns = NULL; -static networkstatus_t *mock_client_ns = NULL; -static sr_srv_t current_srv, previous_srv; -static smartlist_t *service_responsible_hsdirs = NULL; -static smartlist_t *client_responsible_hsdirs = NULL; - -static networkstatus_t * -mock_networkstatus_get_live_consensus_service(time_t now) -{ - (void) now; - - if (mock_service_ns) { - return mock_service_ns; - } - - mock_service_ns = tor_malloc_zero(sizeof(networkstatus_t)); - mock_service_ns->routerstatus_list = smartlist_new(); - mock_service_ns->type = NS_TYPE_CONSENSUS; - - return mock_service_ns; -} - -static networkstatus_t * -mock_networkstatus_get_latest_consensus_service(void) -{ - return mock_networkstatus_get_live_consensus_service(0); -} - -static networkstatus_t * -mock_networkstatus_get_live_consensus_client(time_t now) -{ - (void) now; - - if (mock_client_ns) { - return mock_client_ns; - } - - mock_client_ns = tor_malloc_zero(sizeof(networkstatus_t)); - mock_client_ns->routerstatus_list = smartlist_new(); - mock_client_ns->type = NS_TYPE_CONSENSUS; - - return mock_client_ns; -} - -static networkstatus_t * -mock_networkstatus_get_latest_consensus_client(void) -{ - return mock_networkstatus_get_live_consensus_client(0); -} - -/* Mock function because we are not trying to test the close circuit that does - * an awful lot of checks on the circuit object. */ -static void -mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, - const char *file) -{ - (void) circ; - (void) reason; - (void) line; - (void) file; - return; -} - -/* Initialize a big HSDir V3 hash ring. */ -static void -helper_initialize_big_hash_ring(networkstatus_t *ns) -{ - int ret; - - /* Generate 250 hsdirs! :) */ - for (int counter = 1 ; counter < 251 ; counter++) { - /* Let's generate random nickname for each hsdir... */ - char nickname_binary[8]; - char nickname_str[13] = {0}; - crypto_rand(nickname_binary, sizeof(nickname_binary)); - ret = base64_encode(nickname_str, sizeof(nickname_str), - nickname_binary, sizeof(nickname_binary), 0); - tt_int_op(ret, OP_EQ, 12); - helper_add_hsdir_to_networkstatus(ns, counter, nickname_str, 1); - } - - /* Make sure we have 200 hsdirs in our list */ - tt_int_op(smartlist_len(ns->routerstatus_list), OP_EQ, 250); - - done: - ; -} - -/** Initialize service and publish its descriptor as needed. Return the newly - * allocated service object to the caller. */ -static hs_service_t * -helper_init_service(time_t now) -{ - int retval; - hs_service_t *service = hs_service_new(get_options()); - tt_assert(service); - service->config.version = HS_VERSION_THREE; - ed25519_secret_key_generate(&service->keys.identity_sk, 0); - ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk); - /* Register service to global map. */ - retval = register_service(get_hs_service_map(), service); - tt_int_op(retval, OP_EQ, 0); - - /* Initialize service descriptor */ - build_all_descriptors(now); - tt_assert(service->desc_current); - tt_assert(service->desc_next); - - done: - return service; -} - -/* Helper function to set the RFC 1123 time string into t. */ -static void -set_consensus_times(const char *time, time_t *t) -{ - tt_assert(time); - tt_assert(t); - - int ret = parse_rfc1123_time(time, t); - tt_int_op(ret, OP_EQ, 0); - - done: - return; -} - -/* Helper function to cleanup the mock consensus (client and service) */ -static void -cleanup_mock_ns(void) -{ - if (mock_service_ns) { - SMARTLIST_FOREACH(mock_service_ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(mock_service_ns->routerstatus_list); - mock_service_ns->sr_info.current_srv = NULL; - mock_service_ns->sr_info.previous_srv = NULL; - networkstatus_vote_free(mock_service_ns); - mock_service_ns = NULL; - } - - if (mock_client_ns) { - SMARTLIST_FOREACH(mock_client_ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(mock_client_ns->routerstatus_list); - mock_client_ns->sr_info.current_srv = NULL; - mock_client_ns->sr_info.previous_srv = NULL; - networkstatus_vote_free(mock_client_ns); - mock_client_ns = NULL; - } -} - -/* Helper function to setup a reachability test. Once called, the - * cleanup_reachability_test MUST be called at the end. */ -static void -setup_reachability_test(void) -{ - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - MOCK(get_or_state, get_or_state_replacement); - - hs_init(); - - /* Baseline to start with. */ - memset(¤t_srv, 0, sizeof(current_srv)); - memset(&previous_srv, 1, sizeof(previous_srv)); - - /* Initialize the consensuses. */ - mock_networkstatus_get_latest_consensus_service(); - mock_networkstatus_get_latest_consensus_client(); - - service_responsible_hsdirs = smartlist_new(); - client_responsible_hsdirs = smartlist_new(); -} - -/* Helper function to cleanup a reachability test initial setup. */ -static void -cleanup_reachability_test(void) -{ - smartlist_free(service_responsible_hsdirs); - service_responsible_hsdirs = NULL; - smartlist_free(client_responsible_hsdirs); - client_responsible_hsdirs = NULL; - hs_free_all(); - cleanup_mock_ns(); - UNMOCK(get_or_state); - UNMOCK(circuit_mark_for_close_); -} - -/* A reachability test always check if the resulting service and client - * responsible HSDir for the given parameters are equal. - * - * Return true iff the same exact nodes are in both list. */ -static int -are_responsible_hsdirs_equal(void) -{ - int count = 0; - tt_int_op(smartlist_len(client_responsible_hsdirs), OP_EQ, 6); - tt_int_op(smartlist_len(service_responsible_hsdirs), OP_EQ, 8); - - SMARTLIST_FOREACH_BEGIN(client_responsible_hsdirs, - const routerstatus_t *, c_rs) { - SMARTLIST_FOREACH_BEGIN(service_responsible_hsdirs, - const routerstatus_t *, s_rs) { - if (tor_memeq(c_rs->identity_digest, s_rs->identity_digest, - DIGEST_LEN)) { - count++; - break; - } - } SMARTLIST_FOREACH_END(s_rs); - } SMARTLIST_FOREACH_END(c_rs); - - done: - return (count == 6); -} - -/* Tor doesn't use such a function to get the previous HSDir, it is only used - * in node_set_hsdir_index(). We need it here so we can test the reachability - * scenario 6 that requires the previous time period to compute the list of - * responsible HSDir because of the client state timing. */ -static uint64_t -get_previous_time_period(time_t now) -{ - return hs_get_time_period_num(now) - 1; -} - -/* Configuration of a reachability test scenario. */ -typedef struct reachability_cfg_t { - /* Consensus timings to be set. They have to be compliant with - * RFC 1123 time format. */ - const char *service_valid_after; - const char *service_valid_until; - const char *client_valid_after; - const char *client_valid_until; - - /* SRVs that the service and client should use. */ - sr_srv_t *service_current_srv; - sr_srv_t *service_previous_srv; - sr_srv_t *client_current_srv; - sr_srv_t *client_previous_srv; - - /* A time period function for the service to use for this scenario. For a - * successful reachability test, the client always use the current time - * period thus why no client function. */ - uint64_t (*service_time_period_fn)(time_t); - - /* Is the client and service expected to be in a new time period. After - * setting the consensus time, the reachability test checks - * hs_in_period_between_tp_and_srv() and test the returned value against - * this. */ - unsigned int service_in_new_tp; - unsigned int client_in_new_tp; - - /* Some scenario requires a hint that the client, because of its consensus - * time, will request the "next" service descriptor so this indicates if it - * is the case or not. */ - unsigned int client_fetch_next_desc; -} reachability_cfg_t; - -/* Some defines to help with semantic while reading a configuration below. */ -#define NOT_IN_NEW_TP 0 -#define IN_NEW_TP 1 -#define DONT_NEED_NEXT_DESC 0 -#define NEED_NEXT_DESC 1 - -static reachability_cfg_t reachability_scenarios[] = { - /* Scenario 1 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 13:00 and client to 15:00, - * both are after TP#1 thus have access to SRV#1. Service and client should - * be using TP#1. - */ - - { "Sat, 26 Oct 1985 13:00:00 UTC", /* Service valid_after */ - "Sat, 26 Oct 1985 14:00:00 UTC", /* Service valid_until */ - "Sat, 26 Oct 1985 15:00:00 UTC", /* Client valid_after */ - "Sat, 26 Oct 1985 16:00:00 UTC", /* Client valid_until. */ - ¤t_srv, NULL, /* Service current and previous SRV */ - ¤t_srv, NULL, /* Client current and previous SRV */ - hs_get_time_period_num, /* Service time period function. */ - IN_NEW_TP, /* Is service in new TP? */ - IN_NEW_TP, /* Is client in new TP? */ - NEED_NEXT_DESC }, - - /* Scenario 2 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 23:00 and client to 01:00, - * which makes the client after the SRV#2 and the service just before. The - * service should only be using TP#1. The client should be using TP#1. - */ - - { "Sat, 26 Oct 1985 23:00:00 UTC", /* Service valid_after */ - "Sat, 27 Oct 1985 00:00:00 UTC", /* Service valid_until */ - "Sat, 27 Oct 1985 01:00:00 UTC", /* Client valid_after */ - "Sat, 27 Oct 1985 02:00:00 UTC", /* Client valid_until. */ - &previous_srv, NULL, /* Service current and previous SRV */ - ¤t_srv, &previous_srv, /* Client current and previous SRV */ - hs_get_time_period_num, /* Service time period function. */ - IN_NEW_TP, /* Is service in new TP? */ - NOT_IN_NEW_TP, /* Is client in new TP? */ - NEED_NEXT_DESC }, - - /* Scenario 3 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 03:00 and client to 05:00, - * which makes both after SRV#2. The service should be using TP#1 as its - * current time period. The client should be using TP#1. - */ - - { "Sat, 27 Oct 1985 03:00:00 UTC", /* Service valid_after */ - "Sat, 27 Oct 1985 04:00:00 UTC", /* Service valid_until */ - "Sat, 27 Oct 1985 05:00:00 UTC", /* Client valid_after */ - "Sat, 27 Oct 1985 06:00:00 UTC", /* Client valid_until. */ - ¤t_srv, &previous_srv, /* Service current and previous SRV */ - ¤t_srv, &previous_srv, /* Client current and previous SRV */ - hs_get_time_period_num, /* Service time period function. */ - NOT_IN_NEW_TP, /* Is service in new TP? */ - NOT_IN_NEW_TP, /* Is client in new TP? */ - DONT_NEED_NEXT_DESC }, - - /* Scenario 4 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 11:00 and client to 13:00, - * which makes the service before TP#2 and the client just after. The - * service should be using TP#1 as its current time period and TP#2 as the - * next. The client should be using TP#2 time period. - */ - - { "Sat, 27 Oct 1985 11:00:00 UTC", /* Service valid_after */ - "Sat, 27 Oct 1985 12:00:00 UTC", /* Service valid_until */ - "Sat, 27 Oct 1985 13:00:00 UTC", /* Client valid_after */ - "Sat, 27 Oct 1985 14:00:00 UTC", /* Client valid_until. */ - ¤t_srv, &previous_srv, /* Service current and previous SRV */ - ¤t_srv, &previous_srv, /* Client current and previous SRV */ - hs_get_next_time_period_num, /* Service time period function. */ - NOT_IN_NEW_TP, /* Is service in new TP? */ - IN_NEW_TP, /* Is client in new TP? */ - NEED_NEXT_DESC }, - - /* Scenario 5 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | C S | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 01:00 and client to 23:00, - * which makes the service after SRV#2 and the client just before. The - * service should be using TP#1 as its current time period and TP#2 as the - * next. The client should be using TP#1 time period. - */ - - { "Sat, 27 Oct 1985 01:00:00 UTC", /* Service valid_after */ - "Sat, 27 Oct 1985 02:00:00 UTC", /* Service valid_until */ - "Sat, 26 Oct 1985 23:00:00 UTC", /* Client valid_after */ - "Sat, 27 Oct 1985 00:00:00 UTC", /* Client valid_until. */ - ¤t_srv, &previous_srv, /* Service current and previous SRV */ - &previous_srv, NULL, /* Client current and previous SRV */ - hs_get_time_period_num, /* Service time period function. */ - NOT_IN_NEW_TP, /* Is service in new TP? */ - IN_NEW_TP, /* Is client in new TP? */ - DONT_NEED_NEXT_DESC }, - - /* Scenario 6 - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | C S | - * +------------------------------------------------------------------+ - * - * S: Service, C: Client - * - * Service consensus valid_after time is set to 13:00 and client to 11:00, - * which makes the service outside after TP#2 and the client just before. - * The service should be using TP#1 as its current time period and TP#2 as - * its next. The client should be using TP#1 time period. - */ - - { "Sat, 27 Oct 1985 13:00:00 UTC", /* Service valid_after */ - "Sat, 27 Oct 1985 14:00:00 UTC", /* Service valid_until */ - "Sat, 27 Oct 1985 11:00:00 UTC", /* Client valid_after */ - "Sat, 27 Oct 1985 12:00:00 UTC", /* Client valid_until. */ - ¤t_srv, &previous_srv, /* Service current and previous SRV */ - ¤t_srv, &previous_srv, /* Client current and previous SRV */ - get_previous_time_period, /* Service time period function. */ - IN_NEW_TP, /* Is service in new TP? */ - NOT_IN_NEW_TP, /* Is client in new TP? */ - DONT_NEED_NEXT_DESC }, - - /* End marker. */ - { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0} -}; - -/* Run a single reachability scenario. num_scenario is the corresponding - * scenario number from the documentation. It is used to log it in case of - * failure so we know which scenario fails. */ -static int -run_reachability_scenario(const reachability_cfg_t *cfg, int num_scenario) -{ - int ret = -1; - hs_service_t *service; - uint64_t service_tp, client_tp; - ed25519_public_key_t service_blinded_pk, client_blinded_pk; - - setup_reachability_test(); - - tt_assert(cfg); - - /* Set service consensus time. */ - set_consensus_times(cfg->service_valid_after, - &mock_service_ns->valid_after); - set_consensus_times(cfg->service_valid_until, - &mock_service_ns->valid_until); - set_consensus_times(cfg->service_valid_until, - &mock_service_ns->fresh_until); - dirvote_recalculate_timing(get_options(), mock_service_ns->valid_after); - /* Set client consensus time. */ - set_consensus_times(cfg->client_valid_after, - &mock_client_ns->valid_after); - set_consensus_times(cfg->client_valid_until, - &mock_client_ns->valid_until); - set_consensus_times(cfg->client_valid_until, - &mock_client_ns->fresh_until); - dirvote_recalculate_timing(get_options(), mock_client_ns->valid_after); - - /* New time period checks for this scenario. */ - tt_int_op(hs_in_period_between_tp_and_srv(mock_service_ns, 0), OP_EQ, - cfg->service_in_new_tp); - tt_int_op(hs_in_period_between_tp_and_srv(mock_client_ns, 0), OP_EQ, - cfg->client_in_new_tp); - - /* Set the SRVs for this scenario. */ - mock_client_ns->sr_info.current_srv = cfg->client_current_srv; - mock_client_ns->sr_info.previous_srv = cfg->client_previous_srv; - mock_service_ns->sr_info.current_srv = cfg->service_current_srv; - mock_service_ns->sr_info.previous_srv = cfg->service_previous_srv; - - /* Initialize a service to get keys. */ - service = helper_init_service(time(NULL)); - - /* - * === Client setup === - */ - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus_client); - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus_client); - - /* Make networkstatus_is_live() happy. */ - update_approx_time(mock_client_ns->valid_after); - /* Initialize a big hashring for this consensus with the hsdir index set. */ - helper_initialize_big_hash_ring(mock_client_ns); - - /* Client ONLY use the current time period. This is the whole point of these - * reachability test that is to make sure the client can always reach the - * service using only its current time period. */ - client_tp = hs_get_time_period_num(0); - - hs_build_blinded_pubkey(&service->keys.identity_pk, NULL, 0, - client_tp, &client_blinded_pk); - hs_get_responsible_hsdirs(&client_blinded_pk, client_tp, 0, 1, - client_responsible_hsdirs); - /* Cleanup the nodelist so we can let the service computes its own set of - * node with its own hashring. */ - cleanup_nodelist(); - tt_int_op(smartlist_len(client_responsible_hsdirs), OP_EQ, 6); - - UNMOCK(networkstatus_get_latest_consensus); - UNMOCK(networkstatus_get_live_consensus); - - /* - * === Service setup === - */ - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus_service); - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus_service); - - /* Make networkstatus_is_live() happy. */ - update_approx_time(mock_service_ns->valid_after); - /* Initialize a big hashring for this consensus with the hsdir index set. */ - helper_initialize_big_hash_ring(mock_service_ns); - - service_tp = cfg->service_time_period_fn(0); - - hs_build_blinded_pubkey(&service->keys.identity_pk, NULL, 0, - service_tp, &service_blinded_pk); - - /* A service builds two lists of responsible HSDir, for the current and the - * next descriptor. Depending on the scenario, the client timing indicate if - * it is fetching the current or the next descriptor so we use the - * "client_fetch_next_desc" to know which one the client is trying to get to - * confirm that the service computes the same hashring for the same blinded - * key and service time period function. */ - hs_get_responsible_hsdirs(&service_blinded_pk, service_tp, - cfg->client_fetch_next_desc, 0, - service_responsible_hsdirs); - cleanup_nodelist(); - tt_int_op(smartlist_len(service_responsible_hsdirs), OP_EQ, 8); - - UNMOCK(networkstatus_get_latest_consensus); - UNMOCK(networkstatus_get_live_consensus); - - /* Some testing of the values we just got from the client and service. */ - tt_mem_op(&client_blinded_pk, OP_EQ, &service_blinded_pk, - ED25519_PUBKEY_LEN); - tt_int_op(are_responsible_hsdirs_equal(), OP_EQ, 1); - - /* Everything went well. */ - ret = 0; - - done: - cleanup_reachability_test(); - if (ret == -1) { - /* Do this so we can know which scenario failed. */ - char msg[32]; - tor_snprintf(msg, sizeof(msg), "Scenario %d failed", num_scenario); - tt_fail_msg(msg); - } - return ret; -} - -static void -test_reachability(void *arg) -{ - (void) arg; - - /* NOTE: An important axiom to understand here is that SRV#N must only be - * used with TP#N value. For example, SRV#2 with TP#1 should NEVER be used - * together. The HSDir index computation is based on this axiom.*/ - - for (int i = 0; reachability_scenarios[i].service_valid_after; ++i) { - int ret = run_reachability_scenario(&reachability_scenarios[i], i + 1); - if (ret < 0) { - return; - } - } -} - -/** Pick an HSDir for service with onion_identity_pk as a client. Put - * its identity digest in hsdir_digest_out. */ -static void -helper_client_pick_hsdir(const ed25519_public_key_t *onion_identity_pk, - char *hsdir_digest_out) -{ - tt_assert(onion_identity_pk); - - routerstatus_t *client_hsdir = pick_hsdir_v3(onion_identity_pk); - tt_assert(client_hsdir); - digest_to_base64(hsdir_digest_out, client_hsdir->identity_digest); - - done: - ; -} - -static void -test_hs_indexes(void *arg) -{ - int ret; - uint64_t period_num = 42; - ed25519_public_key_t pubkey; - - (void) arg; - - /* Build the hs_index */ - { - uint8_t hs_index[DIGEST256_LEN]; - const char *b32_test_vector = - "37e5cbbd56a22823714f18f1623ece5983a0d64c78495a8cfab854245e5f9a8a"; - char test_vector[DIGEST256_LEN]; - ret = base16_decode(test_vector, sizeof(test_vector), b32_test_vector, - strlen(b32_test_vector)); - tt_int_op(ret, OP_EQ, sizeof(test_vector)); - /* Our test vector uses a public key set to 32 bytes of \x42. */ - memset(&pubkey, '\x42', sizeof(pubkey)); - hs_build_hs_index(1, &pubkey, period_num, hs_index); - tt_mem_op(hs_index, OP_EQ, test_vector, sizeof(hs_index)); - } - - /* Build the hsdir_index */ - { - uint8_t srv[DIGEST256_LEN]; - uint8_t hsdir_index[DIGEST256_LEN]; - const char *b32_test_vector = - "db475361014a09965e7e5e4d4a25b8f8d4b8f16cb1d8a7e95eed50249cc1a2d5"; - char test_vector[DIGEST256_LEN]; - ret = base16_decode(test_vector, sizeof(test_vector), b32_test_vector, - strlen(b32_test_vector)); - tt_int_op(ret, OP_EQ, sizeof(test_vector)); - /* Our test vector uses a public key set to 32 bytes of \x42. */ - memset(&pubkey, '\x42', sizeof(pubkey)); - memset(srv, '\x43', sizeof(srv)); - hs_build_hsdir_index(&pubkey, srv, period_num, hsdir_index); - tt_mem_op(hsdir_index, OP_EQ, test_vector, sizeof(hsdir_index)); - } - - done: - ; -} - -#define EARLY_IN_SRV_TO_TP 0 -#define LATE_IN_SRV_TO_TP 1 -#define EARLY_IN_TP_TO_SRV 2 -#define LATE_IN_TP_TO_SRV 3 - -/** Set the consensus and system time based on position. See the - * following diagram for details: - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|----------$===========| | - * | | - * | | - * +------------------------------------------------------------------+ - */ -static time_t -helper_set_consensus_and_system_time(networkstatus_t *ns, int position) -{ - time_t real_time = 0; - - /* The period between SRV#N and TP#N is from 00:00 to 12:00 UTC. Consensus - * valid_after is what matters here, the rest is just to specify the voting - * period correctly. */ - if (position == LATE_IN_SRV_TO_TP) { - parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", &ns->valid_after); - parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC", &ns->fresh_until); - parse_rfc1123_time("Wed, 13 Apr 2016 14:00:00 UTC", &ns->valid_until); - } else if (position == EARLY_IN_TP_TO_SRV) { - parse_rfc1123_time("Wed, 13 Apr 2016 13:00:00 UTC", &ns->valid_after); - parse_rfc1123_time("Wed, 13 Apr 2016 14:00:00 UTC", &ns->fresh_until); - parse_rfc1123_time("Wed, 13 Apr 2016 16:00:00 UTC", &ns->valid_until); - } else if (position == LATE_IN_TP_TO_SRV) { - parse_rfc1123_time("Wed, 13 Apr 2016 23:00:00 UTC", &ns->valid_after); - parse_rfc1123_time("Wed, 14 Apr 2016 00:00:00 UTC", &ns->fresh_until); - parse_rfc1123_time("Wed, 14 Apr 2016 02:00:00 UTC", &ns->valid_until); - } else if (position == EARLY_IN_SRV_TO_TP) { - parse_rfc1123_time("Wed, 14 Apr 2016 01:00:00 UTC", &ns->valid_after); - parse_rfc1123_time("Wed, 14 Apr 2016 02:00:00 UTC", &ns->fresh_until); - parse_rfc1123_time("Wed, 14 Apr 2016 04:00:00 UTC", &ns->valid_until); - } else { - tt_assert(0); - } - dirvote_recalculate_timing(get_options(), ns->valid_after); - - /* Set system time: pretend to be just 2 minutes before consensus expiry */ - real_time = ns->valid_until - 120; - update_approx_time(real_time); - - done: - return real_time; -} - -/** Helper function that carries out the actual test for - * test_client_service_sync() */ -static void -helper_test_hsdir_sync(networkstatus_t *ns, - int service_position, int client_position, - int client_fetches_next_desc) -{ - hs_service_descriptor_t *desc; - int retval; - - /** Test logic: - * 1) Initialize service time: consensus and system time. - * 1.1) Initialize service hash ring - * 2) Initialize service and publish descriptors. - * 3) Initialize client time: consensus and system time. - * 3.1) Initialize client hash ring - * 4) Try to fetch descriptor as client, and CHECK that the HSDir picked by - * the client was also picked by service. - */ - - /* 1) Initialize service time: consensus and real time */ - time_t now = helper_set_consensus_and_system_time(ns, service_position); - helper_initialize_big_hash_ring(ns); - - /* 2) Initialize service */ - hs_service_t *service = helper_init_service(now); - desc = client_fetches_next_desc ? service->desc_next : service->desc_current; - - /* Now let's upload our desc to all hsdirs */ - upload_descriptor_to_all(service, desc); - /* Cleanup right now so we don't memleak on error. */ - cleanup_nodelist(); - /* Check that previous hsdirs were populated */ - tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 8); - - /* 3) Initialize client time */ - helper_set_consensus_and_system_time(ns, client_position); - - cleanup_nodelist(); - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(ns->routerstatus_list); - helper_initialize_big_hash_ring(ns); - - /* 4) Pick 6 HSDirs as a client and check that they were also chosen by the - service. */ - for (int y = 0 ; y < 6 ; y++) { - char client_hsdir_b64_digest[BASE64_DIGEST_LEN+1] = {0}; - helper_client_pick_hsdir(&service->keys.identity_pk, - client_hsdir_b64_digest); - - /* CHECK: Go through the hsdirs chosen by the service and make sure that it - * contains the one picked by the client! */ - retval = smartlist_contains_string(desc->previous_hsdirs, - client_hsdir_b64_digest); - tt_int_op(retval, OP_EQ, 1); - } - - /* Finally, try to pick a 7th hsdir and see that NULL is returned since we - * exhausted all of them: */ - tt_assert(!pick_hsdir_v3(&service->keys.identity_pk)); - - done: - /* At the end: free all services and initialize the subsystem again, we will - * need it for next scenario. */ - cleanup_nodelist(); - hs_service_free_all(); - hs_service_init(); - SMARTLIST_FOREACH(ns->routerstatus_list, - routerstatus_t *, rs, routerstatus_free(rs)); - smartlist_clear(ns->routerstatus_list); -} - -/** This test ensures that client and service will pick the same HSDirs, under - * various timing scenarios: - * a) Scenario where both client and service are in the time segment between - * SRV#N and TP#N: - * b) Scenario where both client and service are in the time segment between - * TP#N and SRV#N+1. - * c) Scenario where service is between SRV#N and TP#N, but client is between - * TP#N and SRV#N+1. - * d) Scenario where service is between TP#N and SRV#N+1, but client is - * between SRV#N and TP#N. - * - * This test is important because it tests that upload_descriptor_to_all() is - * in synch with pick_hsdir_v3(). That's not the case for the - * test_reachability() test which only compares the responsible hsdir sets. - */ -static void -test_client_service_hsdir_set_sync(void *arg) -{ - networkstatus_t *ns = NULL; - - (void) arg; - - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus); - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - MOCK(get_or_state, - get_or_state_replacement); - MOCK(hs_desc_encode_descriptor, - mock_hs_desc_encode_descriptor); - MOCK(directory_initiate_request, - mock_directory_initiate_request); - - hs_init(); - - /* Initialize a big hash ring: we want it to be big so that client and - * service cannot accidentally select the same HSDirs */ - ns = networkstatus_get_latest_consensus(); - tt_assert(ns); - - /** Now test the various synch scenarios. See the helper function for more - details: */ - - /* a) Scenario where both client and service are in the time segment between - * SRV#N and TP#N. At this time the client fetches the first HS desc: - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, LATE_IN_SRV_TO_TP, LATE_IN_SRV_TO_TP, 0); - - /* b) Scenario where both client and service are in the time segment between - * TP#N and SRV#N+1. At this time the client fetches the second HS - * desc: - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, LATE_IN_TP_TO_SRV, LATE_IN_TP_TO_SRV, 1); - - /* c) Scenario where service is between SRV#N and TP#N, but client is - * between TP#N and SRV#N+1. Client is forward in time so it fetches the - * second HS desc. - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, LATE_IN_SRV_TO_TP, EARLY_IN_TP_TO_SRV, 1); - - /* d) Scenario where service is between TP#N and SRV#N+1, but client is - * between SRV#N and TP#N. Client is backwards in time so it fetches the - * first HS desc. - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | C S | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, EARLY_IN_TP_TO_SRV, LATE_IN_SRV_TO_TP, 0); - - /* e) Scenario where service is between SRV#N and TP#N, but client is - * between TP#N-1 and SRV#3. Client is backwards in time so it fetches - * the first HS desc. - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | C S | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, EARLY_IN_SRV_TO_TP, LATE_IN_TP_TO_SRV, 0); - - /* f) Scenario where service is between TP#N and SRV#N+1, but client is - * between SRV#N+1 and TP#N+1. Client is forward in time so it fetches - * the second HS desc. - * - * +------------------------------------------------------------------+ - * | | - * | 00:00 12:00 00:00 12:00 00:00 12:00 | - * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | - * | | - * | $==========|-----------$===========|-----------$===========| | - * | ^ ^ | - * | S C | - * +------------------------------------------------------------------+ - */ - helper_test_hsdir_sync(ns, LATE_IN_TP_TO_SRV, EARLY_IN_SRV_TO_TP, 1); - - done: - networkstatus_vote_free(ns); - nodelist_free_all(); - hs_free_all(); -} - -struct testcase_t hs_common_tests[] = { - { "build_address", test_build_address, TT_FORK, - NULL, NULL }, - { "validate_address", test_validate_address, TT_FORK, - NULL, NULL }, - { "time_period", test_time_period, TT_FORK, - NULL, NULL }, - { "start_time_of_next_time_period", test_start_time_of_next_time_period, - TT_FORK, NULL, NULL }, - { "responsible_hsdirs", test_responsible_hsdirs, TT_FORK, - NULL, NULL }, - { "desc_reupload_logic", test_desc_reupload_logic, TT_FORK, - NULL, NULL }, - { "disaster_srv", test_disaster_srv, TT_FORK, - NULL, NULL }, - { "hid_serv_request_tracker", test_hid_serv_request_tracker, TT_FORK, - NULL, NULL }, - { "parse_extended_hostname", test_parse_extended_hostname, TT_FORK, - NULL, NULL }, - { "time_between_tp_and_srv", test_time_between_tp_and_srv, TT_FORK, - NULL, NULL }, - { "reachability", test_reachability, TT_FORK, - NULL, NULL }, - { "client_service_hsdir_set_sync", test_client_service_hsdir_set_sync, - TT_FORK, NULL, NULL }, - { "hs_indexes", test_hs_indexes, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_config.c b/src/tor/src/test/test_hs_config.c deleted file mode 100644 index a76be301d..000000000 --- a/src/tor/src/test/test_hs_config.c +++ /dev/null @@ -1,487 +0,0 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_config.c - * \brief Test hidden service configuration functionality. - */ - -#define CONFIG_PRIVATE -#define HS_SERVICE_PRIVATE - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" - -#include "config.h" -#include "hs_common.h" -#include "hs_config.h" -#include "hs_service.h" -#include "rendservice.h" - -static int -helper_config_service(const char *conf, int validate_only) -{ - int ret = 0; - or_options_t *options = NULL; - tt_assert(conf); - options = helper_parse_options(conf); - tt_assert(options); - ret = hs_config_service_all(options, validate_only); - done: - or_options_free(options); - return ret; -} - -static void -test_invalid_service(void *arg) -{ - int ret; - - (void) arg; - - /* Try with a missing port configuration. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 1\n"; /* Wrong not supported version. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceVersion must be between 2 and 3"); - teardown_capture_of_logs(); - } - - /* Bad value of HiddenServiceAllowUnknownPorts. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServiceAllowUnknownPorts 2\n"; /* Should be 0 or 1. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceAllowUnknownPorts must be " - "between 0 and 1, not 2"); - teardown_capture_of_logs(); - } - - /* Bad value of HiddenServiceDirGroupReadable */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServiceDirGroupReadable 2\n"; /* Should be 0 or 1. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceDirGroupReadable must be " - "between 0 and 1, not 2"); - teardown_capture_of_logs(); - } - - /* Bad value of HiddenServiceMaxStreamsCloseCircuit */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServiceMaxStreamsCloseCircuit 2\n"; /* Should be 0 or 1. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceMaxStreamsCloseCircuit must " - "be between 0 and 1, not 2"); - teardown_capture_of_logs(); - } - - /* Too much max streams. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceMaxStreams 65536\n"; /* One too many. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceMaxStreams must be between " - "0 and 65535, not 65536"); - teardown_capture_of_logs(); - } - - /* Duplicate directory directive. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 81\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Another hidden service is already " - "configured for directory"); - teardown_capture_of_logs(); - } - - /* Bad port. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 65536\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Missing or invalid port"); - teardown_capture_of_logs(); - } - - /* Out of order directives. */ - { - const char *conf = - "HiddenServiceVersion 2\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServicePort 80\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceVersion with no preceding " - "HiddenServiceDir directive"); - teardown_capture_of_logs(); - } - - done: - ; -} - -static void -test_valid_service(void *arg) -{ - int ret; - - (void) arg; - - /* Mix of v2 and v3. Still valid. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 81\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 82\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - done: - ; -} - -static void -test_invalid_service_v2(void *arg) -{ - int validate_only = 1, ret; - - (void) arg; - - /* Try with a missing port configuration. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("with no ports configured."); - teardown_capture_of_logs(); - } - - /* Too many introduction points. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceNumIntroductionPoints 11\n"; /* One too many. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceNumIntroductionPoints should " - "be between 0 and 10, not 11"); - teardown_capture_of_logs(); - } - - /* Too little introduction points. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceNumIntroductionPoints -1\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceNumIntroductionPoints should " - "be between 0 and 10, not -1"); - teardown_capture_of_logs(); - } - - /* Bad authorized client type. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceAuthorizeClient blah alice,bob\n"; /* blah is no good. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceAuthorizeClient contains " - "unrecognized auth-type"); - teardown_capture_of_logs(); - } - - done: - ; -} - -static void -test_valid_service_v2(void *arg) -{ - int ret; - - (void) arg; - - /* Valid complex configuration. Basic client authorization. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServicePort 22 localhost:22\n" -#ifdef HAVE_SYS_UN_H - "HiddenServicePort 42 unix:/path/to/socket\n" -#endif - "HiddenServiceAuthorizeClient basic alice,bob,eve\n" - "HiddenServiceAllowUnknownPorts 1\n" - "HiddenServiceMaxStreams 42\n" - "HiddenServiceMaxStreamsCloseCircuit 0\n" - "HiddenServiceDirGroupReadable 1\n" - "HiddenServiceNumIntroductionPoints 7\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - /* Valid complex configuration. Stealth client authorization. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 65535\n" - "HiddenServicePort 22 1.1.1.1:22\n" -#ifdef HAVE_SYS_UN_H - "HiddenServicePort 9000 unix:/path/to/socket\n" -#endif - "HiddenServiceAuthorizeClient stealth charlie,romeo\n" - "HiddenServiceAllowUnknownPorts 0\n" - "HiddenServiceMaxStreams 42\n" - "HiddenServiceMaxStreamsCloseCircuit 0\n" - "HiddenServiceDirGroupReadable 1\n" - "HiddenServiceNumIntroductionPoints 8\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - done: - ; -} - -static void -test_invalid_service_v3(void *arg) -{ - int validate_only = 1, ret; - - (void) arg; - - /* Try with a missing port configuration. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 3\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("with no ports configured."); - teardown_capture_of_logs(); - } - - /* Too many introduction points. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 80\n" - "HiddenServiceNumIntroductionPoints 21\n"; /* One too many. */ - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceNumIntroductionPoints must " - "be between 3 and 20, not 21."); - teardown_capture_of_logs(); - } - - /* Too little introduction points. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 80\n" - "HiddenServiceNumIntroductionPoints 1\n"; - setup_full_capture_of_logs(LOG_WARN); - ret = helper_config_service(conf, validate_only); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("HiddenServiceNumIntroductionPoints must " - "be between 3 and 20, not 1."); - teardown_capture_of_logs(); - } - - done: - ; -} - -static void -test_valid_service_v3(void *arg) -{ - int ret; - - (void) arg; - - /* Valid complex configuration. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 80\n" - "HiddenServicePort 22 localhost:22\n" -#ifdef HAVE_SYS_UN_H - "HiddenServicePort 42 unix:/path/to/socket\n" -#endif - "HiddenServiceAllowUnknownPorts 1\n" - "HiddenServiceMaxStreams 42\n" - "HiddenServiceMaxStreamsCloseCircuit 0\n" - "HiddenServiceDirGroupReadable 1\n" - "HiddenServiceNumIntroductionPoints 7\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - /* Valid complex configuration. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 65535\n" - "HiddenServicePort 22 1.1.1.1:22\n" -#ifdef HAVE_SYS_UN_H - "HiddenServicePort 9000 unix:/path/to/socket\n" -#endif - "HiddenServiceAllowUnknownPorts 0\n" - "HiddenServiceMaxStreams 42\n" - "HiddenServiceMaxStreamsCloseCircuit 0\n" - "HiddenServiceDirGroupReadable 1\n" - "HiddenServiceNumIntroductionPoints 20\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - /* Mix of v2 and v3. Still valid. */ - { - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 80\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 81\n" - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n" - "HiddenServiceVersion 2\n" - "HiddenServicePort 82\n"; - ret = helper_config_service(conf, 1); - tt_int_op(ret, OP_EQ, 0); - } - - done: - ; -} - -static void -test_staging_service_v3(void *arg) -{ - int ret; - - (void) arg; - - /* We don't validate a service object, this is the service test that are in - * charge of doing so. We just check for the stable state after - * registration. */ - - hs_init(); - - /* Time for a valid v3 service that should get staged. */ - const char *conf = - "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n" - "HiddenServiceVersion 3\n" - "HiddenServicePort 65535\n" - "HiddenServicePort 22 1.1.1.1:22\n" -#ifdef HAVE_SYS_UN_H - "HiddenServicePort 9000 unix:/path/to/socket\n" -#endif - "HiddenServiceAllowUnknownPorts 0\n" - "HiddenServiceMaxStreams 42\n" - "HiddenServiceMaxStreamsCloseCircuit 0\n" - "HiddenServiceDirGroupReadable 1\n" - "HiddenServiceNumIntroductionPoints 20\n"; - ret = helper_config_service(conf, 0); - tt_int_op(ret, OP_EQ, 0); - /* Ok, we have a service in our map! Registration went well. */ - tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); - /* Make sure we don't have a magic v2 service out of this. */ - tt_int_op(rend_num_services(), OP_EQ, 0); - - done: - hs_free_all(); -} - -struct testcase_t hs_config_tests[] = { - /* Invalid service not specific to any version. */ - { "invalid_service", test_invalid_service, TT_FORK, - NULL, NULL }, - { "valid_service", test_valid_service, TT_FORK, - NULL, NULL }, - - /* Test case only for version 2. */ - { "invalid_service_v2", test_invalid_service_v2, TT_FORK, - NULL, NULL }, - { "valid_service_v2", test_valid_service_v2, TT_FORK, - NULL, NULL }, - - /* Test case only for version 3. */ - { "invalid_service_v3", test_invalid_service_v3, TT_FORK, - NULL, NULL }, - { "valid_service_v3", test_valid_service_v3, TT_FORK, - NULL, NULL }, - - /* Test service staging. */ - { "staging_service_v3", test_staging_service_v3, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_control.c b/src/tor/src/test/test_hs_control.c deleted file mode 100644 index 207a55de6..000000000 --- a/src/tor/src/test/test_hs_control.c +++ /dev/null @@ -1,199 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_control.c - * \brief Unit tests for hidden service control port event and command. - **/ - -#define CONTROL_PRIVATE -#define CIRCUITBUILD_PRIVATE -#define RENDCOMMON_PRIVATE -#define RENDSERVICE_PRIVATE -#define HS_SERVICE_PRIVATE - -#include "or.h" -#include "test.h" -#include "control.h" -#include "config.h" -#include "hs_common.h" -#include "hs_control.h" -#include "nodelist.h" -//#include "rendcommon.h" -//#include "rendservice.h" -//#include "routerset.h" -//#include "circuitbuild.h" -#include "test_helpers.h" - -/* mock ID digest and longname for node that's in nodelist */ -#define HSDIR_EXIST_ID \ - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" \ - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" -#define STR_HSDIR_EXIST_LONGNAME \ - "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=TestDir" -#define STR_HSDIR_NONE_EXIST_LONGNAME \ - "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - -/* Helper global variable for hidden service descriptor event test. - * It's used as a pointer to dynamically created message buffer in - * send_control_event_string_replacement function, which mocks - * send_control_event_string function. - * - * Always free it after use! */ -static char *received_msg = NULL; - -/** Mock function for send_control_event_string - */ -static void -queue_control_event_string_replacement(uint16_t event, char *msg) -{ - (void) event; - tor_free(received_msg); - received_msg = msg; -} - -/** Mock function for node_describe_longname_by_id, it returns either - * STR_HSDIR_EXIST_LONGNAME or STR_HSDIR_NONE_EXIST_LONGNAME - */ -static const char * -node_describe_longname_by_id_replacement(const char *id_digest) -{ - if (!strcmp(id_digest, HSDIR_EXIST_ID)) { - return STR_HSDIR_EXIST_LONGNAME; - } else { - return STR_HSDIR_NONE_EXIST_LONGNAME; - } -} - -/* HSDir fetch index is a series of 'D' */ -#define HSDIR_INDEX_FETCH_HEX \ - "4343434343434343434343434343434343434343434343434343434343434343" -#define HSDIR_INDEX_STORE_HEX \ - "4444444444444444444444444444444444444444444444444444444444444444" - -static const node_t * -mock_node_get_by_id(const char *digest) -{ - static node_t node; - memcpy(node.identity, digest, DIGEST_LEN); - node.hsdir_index = tor_malloc_zero(sizeof(hsdir_index_t)); - memset(node.hsdir_index->fetch, 'C', DIGEST256_LEN); - memset(node.hsdir_index->store_first, 'D', DIGEST256_LEN); - return &node; -} - -static void -test_hs_desc_event(void *arg) -{ - int ret; - char *expected_msg = NULL; - char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - ed25519_keypair_t identity_kp; - ed25519_public_key_t blinded_pk; - char base64_blinded_pk[ED25519_BASE64_LEN + 1]; - routerstatus_t hsdir_rs; - hs_ident_dir_conn_t ident; - - (void) arg; - MOCK(queue_control_event_string, - queue_control_event_string_replacement); - MOCK(node_describe_longname_by_id, - node_describe_longname_by_id_replacement); - MOCK(node_get_by_id, mock_node_get_by_id); - - /* Setup what we need for this test. */ - ed25519_keypair_generate(&identity_kp, 0); - hs_build_address(&identity_kp.pubkey, HS_VERSION_THREE, onion_address); - ret = hs_address_is_valid(onion_address); - tt_int_op(ret, OP_EQ, 1); - memset(&blinded_pk, 'B', sizeof(blinded_pk)); - memset(&hsdir_rs, 0, sizeof(hsdir_rs)); - memcpy(hsdir_rs.identity_digest, HSDIR_EXIST_ID, DIGEST_LEN); - ret = ed25519_public_to_base64(base64_blinded_pk, &blinded_pk); - tt_int_op(ret, OP_EQ, 0); - memcpy(&ident.identity_pk, &identity_kp.pubkey, - sizeof(ed25519_public_key_t)); - memcpy(&ident.blinded_pk, &blinded_pk, sizeof(blinded_pk)); - - /* HS_DESC REQUESTED ... */ - hs_control_desc_event_requested(&identity_kp.pubkey, base64_blinded_pk, - &hsdir_rs); - tor_asprintf(&expected_msg, "650 HS_DESC REQUESTED %s NO_AUTH " - STR_HSDIR_EXIST_LONGNAME " %s HSDIR_INDEX=" - HSDIR_INDEX_FETCH_HEX "\r\n", - onion_address, base64_blinded_pk); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - /* HS_DESC CREATED... */ - hs_control_desc_event_created(onion_address, &blinded_pk); - tor_asprintf(&expected_msg, "650 HS_DESC CREATED %s UNKNOWN " - "UNKNOWN %s\r\n", - onion_address, base64_blinded_pk); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - /* HS_DESC UPLOAD... */ - uint8_t hsdir_index_store[DIGEST256_LEN]; - memset(hsdir_index_store, 'D', sizeof(hsdir_index_store)); - hs_control_desc_event_upload(onion_address, HSDIR_EXIST_ID, - &blinded_pk, hsdir_index_store); - tor_asprintf(&expected_msg, "650 HS_DESC UPLOAD %s UNKNOWN " - STR_HSDIR_EXIST_LONGNAME " %s " - "HSDIR_INDEX=" HSDIR_INDEX_STORE_HEX "\r\n", - onion_address, base64_blinded_pk); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - /* HS_DESC FAILED... */ - hs_control_desc_event_failed(&ident, HSDIR_EXIST_ID, "BAD_DESC"); - tor_asprintf(&expected_msg, "650 HS_DESC FAILED %s NO_AUTH " - STR_HSDIR_EXIST_LONGNAME " %s " - "REASON=BAD_DESC\r\n", - onion_address, base64_blinded_pk); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - /* HS_DESC RECEIVED... */ - hs_control_desc_event_received(&ident, HSDIR_EXIST_ID); - tor_asprintf(&expected_msg, "650 HS_DESC RECEIVED %s NO_AUTH " - STR_HSDIR_EXIST_LONGNAME " %s\r\n", - onion_address, base64_blinded_pk); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - /* HS_DESC UPLOADED... */ - hs_control_desc_event_uploaded(&ident, HSDIR_EXIST_ID); - tor_asprintf(&expected_msg, "650 HS_DESC UPLOADED %s UNKNOWN " - STR_HSDIR_EXIST_LONGNAME "\r\n", - onion_address); - tt_assert(received_msg); - tt_str_op(received_msg, OP_EQ, expected_msg); - tor_free(received_msg); - tor_free(expected_msg); - - done: - UNMOCK(queue_control_event_string); - UNMOCK(node_describe_longname_by_id); - UNMOCK(node_get_by_id); - tor_free(received_msg); - tor_free(expected_msg); -} - -struct testcase_t hs_control_tests[] = { - { "hs_desc_event", test_hs_desc_event, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_descriptor.c b/src/tor/src/test/test_hs_descriptor.c deleted file mode 100644 index 9ec183db0..000000000 --- a/src/tor/src/test/test_hs_descriptor.c +++ /dev/null @@ -1,895 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_descriptor.c - * \brief Test hidden service descriptor encoding and decoding. - */ - -#define HS_DESCRIPTOR_PRIVATE - -#include "crypto_ed25519.h" -#include "ed25519_cert.h" -#include "or.h" -#include "hs_descriptor.h" -#include "test.h" -#include "torcert.h" - -#include "hs_test_helpers.h" -#include "test_helpers.h" -#include "log_test_helpers.h" - -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -DISABLE_GCC_WARNING(overlength-strings) -/* We allow huge string constants in the unit tests, but not in the code - * at large. */ -#endif -#include "test_hs_descriptor.inc" -ENABLE_GCC_WARNING(overlength-strings) - -/* Test certificate encoding put in a descriptor. */ -static void -test_cert_encoding(void *arg) -{ - int ret; - char *encoded = NULL; - time_t now = time(NULL); - ed25519_keypair_t kp; - ed25519_public_key_t signed_key; - ed25519_secret_key_t secret_key; - tor_cert_t *cert = NULL; - - (void) arg; - - ret = ed25519_keypair_generate(&kp, 0); - tt_int_op(ret, == , 0); - ret = ed25519_secret_key_generate(&secret_key, 0); - tt_int_op(ret, == , 0); - ret = ed25519_public_key_generate(&signed_key, &secret_key); - tt_int_op(ret, == , 0); - - cert = tor_cert_create(&kp, CERT_TYPE_SIGNING_AUTH, &signed_key, - now, 3600 * 2, CERT_FLAG_INCLUDE_SIGNING_KEY); - tt_assert(cert); - - /* Test the certificate encoding function. */ - ret = tor_cert_encode_ed22519(cert, &encoded); - tt_int_op(ret, OP_EQ, 0); - - /* Validated the certificate string. */ - { - char *end, *pos = encoded; - char *b64_cert, buf[256]; - size_t b64_cert_len; - tor_cert_t *parsed_cert; - - tt_int_op(strcmpstart(pos, "-----BEGIN ED25519 CERT-----\n"), OP_EQ, 0); - pos += strlen("-----BEGIN ED25519 CERT-----\n"); - - /* Isolate the base64 encoded certificate and try to decode it. */ - end = strstr(pos, "-----END ED25519 CERT-----"); - tt_assert(end); - b64_cert = pos; - b64_cert_len = end - pos; - ret = base64_decode(buf, sizeof(buf), b64_cert, b64_cert_len); - tt_int_op(ret, OP_GT, 0); - /* Parseable? */ - parsed_cert = tor_cert_parse((uint8_t *) buf, ret); - tt_assert(parsed_cert); - /* Signature is valid? */ - ret = tor_cert_checksig(parsed_cert, &kp.pubkey, now + 10); - tt_int_op(ret, OP_EQ, 0); - ret = tor_cert_eq(cert, parsed_cert); - tt_int_op(ret, OP_EQ, 1); - /* The cert did have the signing key? */ - ret= ed25519_pubkey_eq(&parsed_cert->signing_key, &kp.pubkey); - tt_int_op(ret, OP_EQ, 1); - tor_cert_free(parsed_cert); - - /* Get to the end part of the certificate. */ - pos += b64_cert_len; - tt_int_op(strcmpstart(pos, "-----END ED25519 CERT-----"), OP_EQ, 0); - pos += strlen("-----END ED25519 CERT-----"); - tt_str_op(pos, OP_EQ, ""); - } - - done: - tor_cert_free(cert); - tor_free(encoded); -} - -/* Test the descriptor padding. */ -static void -test_descriptor_padding(void *arg) -{ - char *plaintext; - size_t plaintext_len, padded_len; - uint8_t *padded_plaintext = NULL; - -/* Example: if l = 129, the ceiled division gives 2 and then multiplied by 128 - * to give 256. With l = 127, ceiled division gives 1 then times 128. */ -#define PADDING_EXPECTED_LEN(l) \ - CEIL_DIV(l, HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE) * \ - HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE - - (void) arg; - - { /* test #1: no padding */ - plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; - plaintext = tor_malloc(plaintext_len); - padded_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - tt_assert(padded_plaintext); - tor_free(plaintext); - /* Make sure our padding has been zeroed. */ - tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, - padded_len - plaintext_len), OP_EQ, 1); - tor_free(padded_plaintext); - /* Never never have a padded length smaller than the plaintext. */ - tt_int_op(padded_len, OP_GE, plaintext_len); - tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); - } - - { /* test #2: one byte padding? */ - plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE - 1; - plaintext = tor_malloc(plaintext_len); - padded_plaintext = NULL; - padded_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - tt_assert(padded_plaintext); - tor_free(plaintext); - /* Make sure our padding has been zeroed. */ - tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, - padded_len - plaintext_len), OP_EQ, 1); - tor_free(padded_plaintext); - /* Never never have a padded length smaller than the plaintext. */ - tt_int_op(padded_len, OP_GE, plaintext_len); - tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); - } - - { /* test #3: Lots more bytes of padding? */ - plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE + 1; - plaintext = tor_malloc(plaintext_len); - padded_plaintext = NULL; - padded_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - tt_assert(padded_plaintext); - tor_free(plaintext); - /* Make sure our padding has been zeroed. */ - tt_int_op(tor_mem_is_zero((char *) padded_plaintext + plaintext_len, - padded_len - plaintext_len), OP_EQ, 1); - tor_free(padded_plaintext); - /* Never never have a padded length smaller than the plaintext. */ - tt_int_op(padded_len, OP_GE, plaintext_len); - tt_int_op(padded_len, OP_EQ, PADDING_EXPECTED_LEN(plaintext_len)); - } - - done: - return; -} - -static void -test_link_specifier(void *arg) -{ - ssize_t ret; - hs_desc_link_specifier_t spec; - smartlist_t *link_specifiers = smartlist_new(); - - (void) arg; - - /* Always this port. */ - spec.u.ap.port = 42; - smartlist_add(link_specifiers, &spec); - - /* Test IPv4 for starter. */ - { - char *b64, buf[256]; - uint32_t ipv4; - link_specifier_t *ls; - - spec.type = LS_IPV4; - ret = tor_addr_parse(&spec.u.ap.addr, "1.2.3.4"); - tt_int_op(ret, OP_EQ, AF_INET); - b64 = encode_link_specifiers(link_specifiers); - tt_assert(b64); - - /* Decode it and validate the format. */ - ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); - tt_int_op(ret, OP_GT, 0); - /* First byte is the number of link specifier. */ - tt_int_op(get_uint8(buf), OP_EQ, 1); - ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); - tt_int_op(ret, OP_EQ, 8); - /* Should be 2 bytes for port and 4 bytes for IPv4. */ - tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 6); - ipv4 = link_specifier_get_un_ipv4_addr(ls); - tt_int_op(tor_addr_to_ipv4h(&spec.u.ap.addr), OP_EQ, ipv4); - tt_int_op(link_specifier_get_un_ipv4_port(ls), OP_EQ, spec.u.ap.port); - - link_specifier_free(ls); - tor_free(b64); - } - - /* Test IPv6. */ - { - char *b64, buf[256]; - uint8_t ipv6[16]; - link_specifier_t *ls; - - spec.type = LS_IPV6; - ret = tor_addr_parse(&spec.u.ap.addr, "[1:2:3:4::]"); - tt_int_op(ret, OP_EQ, AF_INET6); - b64 = encode_link_specifiers(link_specifiers); - tt_assert(b64); - - /* Decode it and validate the format. */ - ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); - tt_int_op(ret, OP_GT, 0); - /* First byte is the number of link specifier. */ - tt_int_op(get_uint8(buf), OP_EQ, 1); - ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); - tt_int_op(ret, OP_EQ, 20); - /* Should be 2 bytes for port and 16 bytes for IPv6. */ - tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 18); - for (unsigned int i = 0; i < sizeof(ipv6); i++) { - ipv6[i] = link_specifier_get_un_ipv6_addr(ls, i); - } - tt_mem_op(tor_addr_to_in6_addr8(&spec.u.ap.addr), OP_EQ, ipv6, - sizeof(ipv6)); - tt_int_op(link_specifier_get_un_ipv6_port(ls), OP_EQ, spec.u.ap.port); - - link_specifier_free(ls); - tor_free(b64); - } - - /* Test legacy. */ - { - char *b64, buf[256]; - uint8_t *id; - link_specifier_t *ls; - - spec.type = LS_LEGACY_ID; - memset(spec.u.legacy_id, 'Y', sizeof(spec.u.legacy_id)); - b64 = encode_link_specifiers(link_specifiers); - tt_assert(b64); - - /* Decode it and validate the format. */ - ret = base64_decode(buf, sizeof(buf), b64, strlen(b64)); - tt_int_op(ret, OP_GT, 0); - /* First byte is the number of link specifier. */ - tt_int_op(get_uint8(buf), OP_EQ, 1); - ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1); - /* 20 bytes digest + 1 byte type + 1 byte len. */ - tt_int_op(ret, OP_EQ, 22); - tt_int_op(link_specifier_getlen_un_legacy_id(ls), OP_EQ, DIGEST_LEN); - /* Digest length is 20 bytes. */ - tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, DIGEST_LEN); - id = link_specifier_getarray_un_legacy_id(ls); - tt_mem_op(spec.u.legacy_id, OP_EQ, id, DIGEST_LEN); - - link_specifier_free(ls); - tor_free(b64); - } - - done: - smartlist_free(link_specifiers); -} - -static void -test_encode_descriptor(void *arg) -{ - int ret; - char *encoded = NULL; - ed25519_keypair_t signing_kp; - hs_descriptor_t *desc = NULL; - - (void) arg; - - ret = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(ret, OP_EQ, 0); - desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(encoded); - - done: - hs_descriptor_free(desc); - tor_free(encoded); -} - -static void -test_decode_descriptor(void *arg) -{ - int ret; - char *encoded = NULL; - ed25519_keypair_t signing_kp; - hs_descriptor_t *desc = NULL; - hs_descriptor_t *decoded = NULL; - hs_descriptor_t *desc_no_ip = NULL; - uint8_t subcredential[DIGEST256_LEN]; - - (void) arg; - - ret = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(ret, OP_EQ, 0); - desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - - hs_helper_get_subcred_from_identity_keypair(&signing_kp, - subcredential); - - /* Give some bad stuff to the decoding function. */ - ret = hs_desc_decode_descriptor("hladfjlkjadf", subcredential, &decoded); - tt_int_op(ret, OP_EQ, -1); - - ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(encoded); - - ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(decoded); - - hs_helper_desc_equal(desc, decoded); - - /* Decode a descriptor with _no_ introduction points. */ - { - ed25519_keypair_t signing_kp_no_ip; - ret = ed25519_keypair_generate(&signing_kp_no_ip, 0); - tt_int_op(ret, OP_EQ, 0); - hs_helper_get_subcred_from_identity_keypair(&signing_kp_no_ip, - subcredential); - desc_no_ip = hs_helper_build_hs_desc_no_ip(&signing_kp_no_ip); - tt_assert(desc_no_ip); - tor_free(encoded); - ret = hs_desc_encode_descriptor(desc_no_ip, &signing_kp_no_ip, &encoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(encoded); - hs_descriptor_free(decoded); - ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded); - tt_int_op(ret, OP_EQ, 0); - tt_assert(decoded); - } - - done: - hs_descriptor_free(desc); - hs_descriptor_free(desc_no_ip); - hs_descriptor_free(decoded); - tor_free(encoded); -} - -static void -test_supported_version(void *arg) -{ - int ret; - - (void) arg; - - /* Unsupported. */ - ret = hs_desc_is_supported_version(42); - tt_int_op(ret, OP_EQ, 0); - /* To early. */ - ret = hs_desc_is_supported_version(HS_DESC_SUPPORTED_FORMAT_VERSION_MIN - 1); - tt_int_op(ret, OP_EQ, 0); - /* One too new. */ - ret = hs_desc_is_supported_version(HS_DESC_SUPPORTED_FORMAT_VERSION_MAX + 1); - tt_int_op(ret, OP_EQ, 0); - /* Valid version. */ - ret = hs_desc_is_supported_version(3); - tt_int_op(ret, OP_EQ, 1); - - done: - ; -} - -static void -test_encrypted_data_len(void *arg) -{ - int ret; - size_t value; - - (void) arg; - - /* No length, error. */ - ret = encrypted_data_length_is_valid(0); - tt_int_op(ret, OP_EQ, 0); - /* Valid value. */ - value = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN + 1; - ret = encrypted_data_length_is_valid(value); - tt_int_op(ret, OP_EQ, 1); - - done: - ; -} - -static void -test_decode_invalid_intro_point(void *arg) -{ - int ret; - char *encoded_ip = NULL; - size_t len_out; - hs_desc_intro_point_t *ip = NULL; - ed25519_keypair_t signing_kp; - hs_descriptor_t *desc = NULL; - - (void) arg; - - /* Seperate pieces of a valid encoded introduction point. */ - const char *intro_point = - "introduction-point AQIUMDI5OUYyNjhGQ0E5RDU1Q0QxNTc="; - const char *auth_key = - "auth-key\n" - "-----BEGIN ED25519 CERT-----\n" - "AQkACOhAAQW8ltYZMIWpyrfyE/b4Iyi8CNybCwYs6ADk7XfBaxsFAQAgBAD3/BE4\n" - "XojGE/N2bW/wgnS9r2qlrkydGyuCKIGayYx3haZ39LD4ZTmSMRxwmplMAqzG/XNP\n" - "0Kkpg4p2/VnLFJRdU1SMFo1lgQ4P0bqw7Tgx200fulZ4KUM5z5V7m+a/mgY=\n" - "-----END ED25519 CERT-----"; - const char *enc_key = - "enc-key ntor bpZKLsuhxP6woDQ3yVyjm5gUKSk7RjfAijT2qrzbQk0="; - const char *enc_key_cert = - "enc-key-cert\n" - "-----BEGIN ED25519 CERT-----\n" - "AQsACOhZAUpNvCZ1aJaaR49lS6MCdsVkhVGVrRqoj0Y2T4SzroAtAQAgBABFOcGg\n" - "lbTt1DF5nKTE/gU3Fr8ZtlCIOhu1A+F5LM7fqCUupfesg0KTHwyIZOYQbJuM5/he\n" - "/jDNyLy9woPJdjkxywaY2RPUxGjLYtMQV0E8PUxWyICV+7y52fTCYaKpYQw=\n" - "-----END ED25519 CERT-----"; - - /* Try to decode a junk string. */ - { - hs_descriptor_free(desc); - desc = NULL; - ret = ed25519_keypair_generate(&signing_kp, 0); - tt_int_op(ret, OP_EQ, 0); - desc = hs_helper_build_hs_desc_with_ip(&signing_kp); - const char *junk = "this is not a descriptor"; - ip = decode_introduction_point(desc, junk); - tt_ptr_op(ip, OP_EQ, NULL); - hs_desc_intro_point_free(ip); - ip = NULL; - } - - /* Invalid link specifiers. */ - { - smartlist_t *lines = smartlist_new(); - const char *bad_line = "introduction-point blah"; - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) auth_key); - smartlist_add(lines, (char *) enc_key); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - hs_desc_intro_point_free(ip); - ip = NULL; - } - - /* Invalid auth key type. */ - { - smartlist_t *lines = smartlist_new(); - /* Try to put a valid object that our tokenize function will be able to - * parse but that has nothing to do with the auth_key. */ - const char *bad_line = - "auth-key\n" - "-----BEGIN UNICORN CERT-----\n" - "MIGJAoGBAO4bATcW8kW4h6RQQAKEgg+aXCpF4JwbcO6vGZtzXTDB+HdPVQzwqkbh\n" - "XzFM6VGArhYw4m31wcP1Z7IwULir7UMnAFd7Zi62aYfU6l+Y1yAoZ1wzu1XBaAMK\n" - "ejpwQinW9nzJn7c2f69fVke3pkhxpNdUZ+vplSA/l9iY+y+v+415AgMBAAE=\n" - "-----END UNICORN CERT-----"; - /* Build intro point text. */ - smartlist_add(lines, (char *) intro_point); - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) enc_key); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - } - - /* Invalid enc-key. */ - { - smartlist_t *lines = smartlist_new(); - const char *bad_line = - "enc-key unicorn bpZKLsuhxP6woDQ3yVyjm5gUKSk7RjfAijT2qrzbQk0="; - /* Build intro point text. */ - smartlist_add(lines, (char *) intro_point); - smartlist_add(lines, (char *) auth_key); - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - } - - /* Invalid enc-key object. */ - { - smartlist_t *lines = smartlist_new(); - const char *bad_line = "enc-key ntor"; - /* Build intro point text. */ - smartlist_add(lines, (char *) intro_point); - smartlist_add(lines, (char *) auth_key); - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - } - - /* Invalid enc-key base64 curv25519 key. */ - { - smartlist_t *lines = smartlist_new(); - const char *bad_line = "enc-key ntor blah==="; - /* Build intro point text. */ - smartlist_add(lines, (char *) intro_point); - smartlist_add(lines, (char *) auth_key); - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - } - - /* Invalid enc-key invalid legacy. */ - { - smartlist_t *lines = smartlist_new(); - const char *bad_line = "legacy-key blah==="; - /* Build intro point text. */ - smartlist_add(lines, (char *) intro_point); - smartlist_add(lines, (char *) auth_key); - smartlist_add(lines, (char *) bad_line); - smartlist_add(lines, (char *) enc_key_cert); - encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out); - tt_assert(encoded_ip); - ip = decode_introduction_point(desc, encoded_ip); - tt_ptr_op(ip, OP_EQ, NULL); - tor_free(encoded_ip); - smartlist_free(lines); - } - - done: - hs_descriptor_free(desc); - hs_desc_intro_point_free(ip); -} - -/** Make sure we fail gracefully when decoding the bad desc from #23233. */ -static void -test_decode_bad_signature(void *arg) -{ - hs_desc_plaintext_data_t desc_plaintext; - int ret; - - (void) arg; - - /* Update approx time to dodge cert expiration */ - update_approx_time(1502661599); - - setup_full_capture_of_logs(LOG_WARN); - ret = hs_desc_decode_plaintext(HS_DESC_BAD_SIG, &desc_plaintext); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Malformed signature line. Rejecting."); - teardown_capture_of_logs(); - - done: - desc_plaintext_data_free_contents(&desc_plaintext); -} - -static void -test_decode_plaintext(void *arg) -{ - int ret; - hs_desc_plaintext_data_t desc_plaintext; - const char *bad_value = "unicorn"; - - (void) arg; - -#define template \ - "hs-descriptor %s\n" \ - "descriptor-lifetime %s\n" \ - "descriptor-signing-key-cert\n" \ - "-----BEGIN ED25519 CERT-----\n" \ - "AQgABjvPAQaG3g+dc6oV/oJV4ODAtkvx56uBnPtBT9mYVuHVOhn7AQAgBABUg3mQ\n" \ - "myBr4bu5LCr53wUEbW2EXui01CbUgU7pfo9LvJG3AcXRojj6HlfsUs9BkzYzYdjF\n" \ - "A69Apikgu0ewHYkFFASt7Il+gB3w6J8YstQJZT7dtbtl+doM7ug8B68Qdg8=\n" \ - "-----END ED25519 CERT-----\n" \ - "revision-counter %s\n" \ - "encrypted\n" \ - "-----BEGIN %s-----\n" \ - "UNICORN\n" \ - "-----END MESSAGE-----\n" \ - "signature m20WJH5agqvwhq7QeuEZ1mYyPWQDO+eJOZUjLhAiKu8DbL17DsDfJE6kXbWy" \ - "HimbNj2we0enV3cCOOAsmPOaAw\n" - - /* Invalid version. */ - { - char *plaintext; - tor_asprintf(&plaintext, template, bad_value, "180", "42", "MESSAGE"); - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Missing fields. */ - { - const char *plaintext = "hs-descriptor 3\n"; - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Max length. */ - { - size_t big = 64000; - /* Must always be bigger than HS_DESC_MAX_LEN. */ - tt_int_op(HS_DESC_MAX_LEN, OP_LT, big); - char *plaintext = tor_malloc_zero(big); - memset(plaintext, 'a', big); - plaintext[big - 1] = '\0'; - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Bad lifetime value. */ - { - char *plaintext; - tor_asprintf(&plaintext, template, "3", bad_value, "42", "MESSAGE"); - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Huge lifetime value. */ - { - char *plaintext; - tor_asprintf(&plaintext, template, "3", "7181615", "42", "MESSAGE"); - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Invalid encrypted section. */ - { - char *plaintext; - tor_asprintf(&plaintext, template, "3", "180", "42", bad_value); - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - /* Invalid revision counter. */ - { - char *plaintext; - tor_asprintf(&plaintext, template, "3", "180", bad_value, "MESSAGE"); - ret = hs_desc_decode_plaintext(plaintext, &desc_plaintext); - tor_free(plaintext); - tt_int_op(ret, OP_EQ, -1); - } - - done: - ; -} - -static void -test_validate_cert(void *arg) -{ - int ret; - time_t now = time(NULL); - ed25519_keypair_t kp; - tor_cert_t *cert = NULL; - - (void) arg; - - ret = ed25519_keypair_generate(&kp, 0); - tt_int_op(ret, OP_EQ, 0); - - /* Cert of type CERT_TYPE_AUTH_HS_IP_KEY. */ - cert = tor_cert_create(&kp, CERT_TYPE_AUTH_HS_IP_KEY, - &kp.pubkey, now, 3600, - CERT_FLAG_INCLUDE_SIGNING_KEY); - tt_assert(cert); - /* Test with empty certificate. */ - ret = cert_is_valid(NULL, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); - tt_int_op(ret, OP_EQ, 0); - /* Test with a bad type. */ - ret = cert_is_valid(cert, CERT_TYPE_SIGNING_HS_DESC, "unicorn"); - tt_int_op(ret, OP_EQ, 0); - /* Normal validation. */ - ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); - tt_int_op(ret, OP_EQ, 1); - /* Break signing key so signature verification will fails. */ - memset(&cert->signing_key, 0, sizeof(cert->signing_key)); - ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); - tt_int_op(ret, OP_EQ, 0); - tor_cert_free(cert); - - /* Try a cert without including the signing key. */ - cert = tor_cert_create(&kp, CERT_TYPE_AUTH_HS_IP_KEY, &kp.pubkey, now, - 3600, 0); - tt_assert(cert); - /* Test with a bad type. */ - ret = cert_is_valid(cert, CERT_TYPE_AUTH_HS_IP_KEY, "unicorn"); - tt_int_op(ret, OP_EQ, 0); - - done: - tor_cert_free(cert); -} - -static void -test_desc_signature(void *arg) -{ - int ret; - char *data = NULL, *desc = NULL; - char sig_b64[ED25519_SIG_BASE64_LEN + 1]; - ed25519_keypair_t kp; - ed25519_signature_t sig; - - (void) arg; - - ed25519_keypair_generate(&kp, 0); - /* Setup a phoony descriptor but with a valid signature token that is the - * signature is verifiable. */ - tor_asprintf(&data, "This is a signed descriptor\n"); - ret = ed25519_sign_prefixed(&sig, (const uint8_t *) data, strlen(data), - "Tor onion service descriptor sig v3", &kp); - tt_int_op(ret, OP_EQ, 0); - ret = ed25519_signature_to_base64(sig_b64, &sig); - tt_int_op(ret, OP_EQ, 0); - /* Build the descriptor that should be valid. */ - tor_asprintf(&desc, "%ssignature %s\n", data, sig_b64); - ret = desc_sig_is_valid(sig_b64, &kp.pubkey, desc, strlen(desc)); - tt_int_op(ret, OP_EQ, 1); - /* Junk signature. */ - ret = desc_sig_is_valid("JUNK", &kp.pubkey, desc, strlen(desc)); - tt_int_op(ret, OP_EQ, 0); - - done: - tor_free(desc); - tor_free(data); -} - -/* bad desc auth type */ -static const char bad_superencrypted_text1[] = "desc-auth-type scoobysnack\n" - "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" - "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" - "encrypted\n" - "-----BEGIN MESSAGE-----\n" - "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" - "BiYWQgYXQgYWxs\n" - "-----END MESSAGE-----\n"; - -/* bad ephemeral key */ -static const char bad_superencrypted_text2[] = "desc-auth-type x25519\n" - "desc-auth-ephemeral-key differentalphabet\n" - "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" - "encrypted\n" - "-----BEGIN MESSAGE-----\n" - "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" - "BiYWQgYXQgYWxs\n" - "-----END MESSAGE-----\n"; - -/* bad encrypted msg */ -static const char bad_superencrypted_text3[] = "desc-auth-type x25519\n" - "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" - "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" - "encrypted\n" - "-----BEGIN MESSAGE-----\n" - "SO SMALL NOT GOOD\n" - "-----END MESSAGE-----\n"; - -static const char correct_superencrypted_text[] = "desc-auth-type x25519\n" - "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" - "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" - "auth-client Od09Qu636Qo /PKLzqewAdS/+0+vZC+MvQ dpw4NFo13zDnuPz45rxrOg\n" - "auth-client JRr840iGYN0 8s8cxYqF7Lx23+NducC4Qg zAafl4wPLURkuEjJreZq1g\n" - "encrypted\n" - "-----BEGIN MESSAGE-----\n" - "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" - "BiYWQgYXQgYWxs\n" - "-----END MESSAGE-----\n"; - -static const char correct_encrypted_plaintext[] = "being on mountains, " - "thinking about computers, is not bad at all"; - -static void -test_parse_hs_desc_superencrypted(void *arg) -{ - (void) arg; - size_t retval; - uint8_t *encrypted_out = NULL; - - { - setup_full_capture_of_logs(LOG_WARN); - retval = decode_superencrypted(bad_superencrypted_text1, - strlen(bad_superencrypted_text1), - &encrypted_out); - tt_u64_op(retval, OP_EQ, 0); - tt_ptr_op(encrypted_out, OP_EQ, NULL); - expect_log_msg_containing("Unrecognized desc auth type"); - teardown_capture_of_logs(); - } - - { - setup_full_capture_of_logs(LOG_WARN); - retval = decode_superencrypted(bad_superencrypted_text2, - strlen(bad_superencrypted_text2), - &encrypted_out); - tt_u64_op(retval, OP_EQ, 0); - tt_ptr_op(encrypted_out, OP_EQ, NULL); - expect_log_msg_containing("Bogus desc auth key in HS desc"); - teardown_capture_of_logs(); - } - - { - setup_full_capture_of_logs(LOG_WARN); - retval = decode_superencrypted(bad_superencrypted_text3, - strlen(bad_superencrypted_text3), - &encrypted_out); - tt_u64_op(retval, OP_EQ, 0); - tt_ptr_op(encrypted_out, OP_EQ, NULL); - expect_log_msg_containing("Length of descriptor\'s encrypted data " - "is too small."); - teardown_capture_of_logs(); - } - - /* Now finally the good one */ - retval = decode_superencrypted(correct_superencrypted_text, - strlen(correct_superencrypted_text), - &encrypted_out); - - tt_u64_op(retval, OP_EQ, strlen(correct_encrypted_plaintext)); - tt_mem_op(encrypted_out, OP_EQ, correct_encrypted_plaintext, - strlen(correct_encrypted_plaintext)); - - done: - tor_free(encrypted_out); -} - -struct testcase_t hs_descriptor[] = { - /* Encoding tests. */ - { "cert_encoding", test_cert_encoding, TT_FORK, - NULL, NULL }, - { "link_specifier", test_link_specifier, TT_FORK, - NULL, NULL }, - { "encode_descriptor", test_encode_descriptor, TT_FORK, - NULL, NULL }, - { "descriptor_padding", test_descriptor_padding, TT_FORK, - NULL, NULL }, - - /* Decoding tests. */ - { "decode_descriptor", test_decode_descriptor, TT_FORK, - NULL, NULL }, - { "encrypted_data_len", test_encrypted_data_len, TT_FORK, - NULL, NULL }, - { "decode_invalid_intro_point", test_decode_invalid_intro_point, TT_FORK, - NULL, NULL }, - { "decode_plaintext", test_decode_plaintext, TT_FORK, - NULL, NULL }, - { "decode_bad_signature", test_decode_bad_signature, TT_FORK, - NULL, NULL }, - - /* Misc. */ - { "version", test_supported_version, TT_FORK, - NULL, NULL }, - { "validate_cert", test_validate_cert, TT_FORK, - NULL, NULL }, - { "desc_signature", test_desc_signature, TT_FORK, - NULL, NULL }, - - { "parse_hs_desc_superencrypted", test_parse_hs_desc_superencrypted, - TT_FORK, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_descriptor.inc b/src/tor/src/test/test_hs_descriptor.inc deleted file mode 100644 index 70a2c7c2f..000000000 --- a/src/tor/src/test/test_hs_descriptor.inc +++ /dev/null @@ -1,224 +0,0 @@ -static const char* HS_DESC_BAD_SIG = -"hs-descriptor 3\n" -"descriptor-lifetime 180\n" -"descriptor-signing-key-cert\n" -"-----BEGIN ED25519 CERT-----\n" -"AQgABl5+AQoPXRnCGEOxIup3AcjQXb8npNiUFm2Qv7A6JKk/K+EuAQAgBAD18iUD\n" -"nbkUblnUvTHzipq4bcr6aPyFVB42Ptobg4xr8s3VjHiJtjs9MDEdr6nXS7UlyhEl\n" -"78vsuFEvLp7cvAgGxYY1xGXdn5RdHMCdi8W9yZLKMQX9OuJckmp1C6q+cA4=\n" -"-----END ED25519 CERT-----\n" -"revision-counter 42\n" -"superencrypted\n" -"-----BEGIN MESSAGE-----\n" -"BxzghAOjM4De6Z6eGTvBrTP2SJDdQOYV/u9qtvlFsa2FRQWk20Adv3zJ/AI10CQO\n" -"mUP4DNXM8FWQYGTvmD7wGz2/cXGjKwBXg1qO7zF5eP/D/My1sXsIfCcb41mkheNt\n" -"xn1I5eKXcnghtd4lw7OkPVjSb/Z+VARUMmf+0qSNgmHLgEVnAoGJsn8W8B4qtIay\n" -"4h4PuV0jPPlqJx6jMFOOEW72uqnfmqeNvClENXXW60xhnaxsf0up62fuW8ktu6Wf\n" -"lnX/lvTstBFZZQ8/XI1+G+BPf8TZf7mxu0WYVg1s/KWYasYMSw46as59nkqdq2Ii\n" -"qJnqHX/R20mWBhgpLse6wO0aNpky/rozEnikaPqyO1DShf6a6jXY8ADBg7spnK2/\n" -"h7sf1+F1xfi2dy2WGxc1EUMP1kTVUmbft7kOo2nA7+3YZwQuSJHaN/66HrzU2x5z\n" -"ayRUJ8+qDtfpEf17xthc/Uh253blFK96IoJJiqBfI6xt3IqOdHJq0OOC9zBbF6Rj\n" -"vKMsaxmc/nc6uOB2WePYSgkZ0qs/dRKBJs6+Ahn1KdGkadyd8mDKL86Oe8lncHdB\n" -"m/6sQjhKqFgngkCDOIlEJyWizqfN84AGqD5Zyxq0rbsN+9KLsHFfEbCRjgqjO5nS\n" -"FYSFtuKgCZl2gaYEslL1pIEYE6BD2Whjn/HWTRyWiULJr6SuavgcbxeNEQDuVCC+\n" -"fm0X7Z+qERaMAMR0vTMJK/NzT4GifrDpgmgbxc+34CtNBF5TriM8aXTNZZlsW00k\n" -"d0XRxFbbbtiT5VOaEHbny7R3MdTVutEc9E/BhLBvjSSrGX7vrryh6Oj++nthIIzm\n" -"F4M7I11S0TyA+UE06qF1C8rKmhcqU9MWy1SiccJ9KOWhJ5xwlsXBIID7wVygUhVl\n" -"ovzfKkDDPfRoBch6NdVkxNJx3gb63CUmC2TzfwOMh973nntMVzqqw9A7jYkro9ln\n" -"217kHUwMk3e83UgFL4nn7NCf3Kj0zhJ4jSfAsuQpV6e7dhzrlNya0lqrUsY2zFXP\n" -"xv8wUtg6Vo1KewgVQas4oElkgFjDN8RJ7uBAwfuE/b9NnYJoQd76G8DHei/1PHbu\n" -"tbtwN9I5RHaTvEOfetsJFnIAkCG6O4CQpzwHu1DdvEP4s6/el10b/4awBJ4VwOVZ\n" -"YHSe4X0DStTV4Cu6aLh5OvrOmGbieRj6HdGQ6syYCaEBTuxbBUUpjIAfVlReAIph\n" -"6aOrY6HNcCmeVmL5qm4dKr2XXOREsnUFuMqmfQuQd9pN3zlmS+RqCgSJuFrguFpd\n" -"mjo6UxZvbjE7yJjtCih38HRe5BaigP5RDRkXmiXjqJ4koLJpyjQh19k3BYGcdxUC\n" -"RCcYXydbGF7qHlnoaX9HnX7y6ZRsyKQpt91PMTGOUsB4fS8NhsqPpl2gdp4poLNs\n" -"+hqjWZJ3uuLotXBcgM39Dtq9tqqu9vM12T80UAfWnVEHrBphmukh49EhEr2sx/la\n" -"kAzRoTbLyTdlGVei8hI7/RtZIaIcOkzlhcFI5zmBlydyrv6/79vzt6WI/w9GVGpM\n" -"OuSM0NS2CDJ7Iw412nz3CV1pEXB551ZBmbme6NHUe4EtEsDbgkP1Z201H4j51yVz\n" -"wNoIksE5Bh5XRKuu4We5f9KZb+AEG9kxKJ5DbJk2YGJEQFTyfv0H68pl9urstPXD\n" -"aMQF806COe2uhGm5gV/skvPVTeEvStE3K8DxZgcWNcTMVk8ZjrUHNfguVVToP8hT\n" -"Fl4Iqo3r+JZEAGXnAbTpxUVC2Xxspf3jsT5xhUfB/NOexZxrXWnQZ+pscsbow0ba\n" -"GATtakD3TF2WBqq5WscmOex+lrJcBCWVIzVWdwi5ngAtm1S7efkJlFUvmi4OuYnN\n" -"RyZfxVIpoer8f2/xPXvxkOWFminDy5sFEvlh2/pnymfKOUV+CKih9ZApt+izlRJn\n" -"+sMIOW6Jhf/WYyjeN6KQpwi6CDpclQJXA1SVoOVVL5A3lotLjs0x7ThIcBoxCZBq\n" -"rFBhBu1gJgJ8guMySAHssIvhHHwXJsYEwzWCVAg/zIUXy4PLwIkgHApl+vGcldGv\n" -"Br5HNCuqQ2pD9z2RvzNneB/LrYB214i+BP2piO5HbmeJBhby93blGXVfQewQT6aF\n" -"dBlK8/jQM0rvb+LkmvQm2ypOttRpX2kyQXooJHYTTusaUr4jVmgngCvGtgqAQVqD\n" -"HULXfHWvugZbAh6dXF7gKnnsyDOWwAgy4OJRi8i0jCaZ8aWSFRUjeGKT26dg/ayB\n" -"U4QfMb8vL8tMdXVBfQLGcBgvrzQYrY69//pV6bX3SbLfUfWXV9eqUVWVPqVyPEwa\n" -"Tz/aGVnGv/dY8h2cVnrgSXJGlOO+mCwSl+k9nk7VcEaKYuNlaOP3ZlKJvVj1LefM\n" -"FODh4qTDBo5NkyfKu5fcZcOqDMBeGWXZzltE7CmvY7fOpDNMsuAoXYWI7q9gK82F\n" -"w+nS0tVFCIWYa9DgGMv9GKTOk4Ia9elkbWypdRE/4oz4QxmHsArEsK4gDI+wmcp7\n" -"/NsAZeuy96r2YDIUam4uASKOiAqrEfCv6B6cYctdYwZbAEXdo4fkGrCIjNRZmZGv\n" -"kcZzHzIymnAmKRTkPt/LQ7Rx27Qd/Vt++B3zt2ORFuopqowOP0ocGZtkm0daK3Fc\n" -"YDXMwIpf6Z8PwvvsG1bQHcSR+cUZi7vK7+hj/LGhMPafHM7HmFUbAxpJYr5CvR6y\n" -"V1pZQYltT8xWayCeMHlLAAg10RgDkqCnY4dHnrY4GdwI2O7Wpxomni7qVHMjn+cN\n" -"UTrd7EeVw+dxAIYosuqG7ua7ee3VGoOs+XMLrscAqHahfGbyYC+j+6Tow4qwWBdU\n" -"/W3NJXnRWaHTXFHllpClnxggPRQx4yPtgTOmBBVl/O0T6i4Bv0ygsJeZAqC3VmAJ\n" -"QodQTzGf2jwqsZf4uHKQa0EKGQvTGjFVgAFNpHmAuzyqh0b1pq5JeXiFERGsKC3j\n" -"xcJilq1XeIx4SL38YNuCxi4pnyJyLnGGHpNjdjeFO5lvgCaKPegsPo4hpNpTvBJ1\n" -"D7+o3E5CqxzjRt9kQmtwBbuH/SQX2T0x8aQ6vhwjj8ftDfw+FbjpMR9zfU0Lf8V7\n" -"UjVGIl2yiVBGScBZu1nSD83PxjFy3XdFtBYoU5OrlXwBEYQs91jwK7UCiGtjI2Ao\n" -"ZGkJaBd4AqP6voyJiGnC3LWFcmeMyzfExgiclQwfhFqqf762TX5JwG6xGqtdcNKS\n" -"k54LlcI/RfvJw3ncSs9YsodZr6Jz5irpRTHX5WwCrX9mLukP96SXo29bIXEZAqEr\n" -"ZxEcF0zlYE+km5bRfRCRcVVrScugCshSNLOdQp6fOAtHCl7rdQ/8Rz7oHuqieLVi\n" -"UldRsAmpk9fIfRLphXj4j24jRP0VtL/LoJwakWTa0xO8K7eBAMVITI+HgFfN4wSO\n" -"Yh1B+bGD5WKxFsWSgBMmW+YLF5ZtxVmmbg7wK2dIpJs4pjg2YO/MTO7SifJ9kjcb\n" -"bCc74Tjs5mLLGGjGCIoXfda6WXbt2it40XhFk2zUAcPPsgjbctftkaWph7JSZpmZ\n" -"fVcPqKdhmA1U0LA2XEOMTxGyCAeseH6pJXZm9LdBozc1CwyWP8XEDHHJf35vfPKY\n" -"JDe2PanFepIOHaoRTgE7ZkGWKzOIKlS0Ucr1ezVfcxiFgQUNM+MYXXbUz51BVVq1\n" -"Dulg4VvX104nt/ULijcfa/TsE+uklEnkyk1mhavH337NQg38XF4cAngNlUF4nSW/\n" -"j0jizbAtaSx1f7q6xqPm3zPRlHrGQizHXLyl+SLzDUVPOXbPwcoeev97YeeyB6h5\n" -"NBbIK9hmekNDmYIwI0bmlrg6IXhC5pyvRe8sQlV+9wBY2liF0M1mq5onW3a55afp\n" -"+ynxXfQucb1HxZLXvRIGMBgWSQ7HfIPASqSE90Vu6qQCfkOW5PDqONr4BM65V4+g\n" -"AYsVEgaosgHw9CF7yKgkvmZpToOtGpCHVcdUeeY2/rrQnAQeSy19gj/baJ+OKl6Q\n" -"i1EGU8Yqo2r0d4XDFp/eKgC4sv57qp1PwkYQ/HKqoelJ09IAZL2sQWc05BGwt1A0\n" -"11qDIEdkZBjzK3qUnY3QlOuoZtALZrnPg56SlF1RGDOPqbcF+3opqsvzBoiikh4V\n" -"WV5OUYjRDMUDLQqf/OkuktdYf5N3RcbYP0XsAvY0ZWG3Gp068b3p8peCpkDzrF9p\n" -"bQ2ZvS304tN7+p0hif3+JyZy5/sxl17RxTeg5I3mo2+J0ptQDYwF/WadONO8r7uU\n" -"YlRltFtQfyMzyVzHON4NHGjZh7dDGtWp0MGeHRBHQsC8bEChhvWme19VXhgZoWpl\n" -"dUIZkSuvRwiURXjhKbZrEdJbVmr9FX6zoyOahv3VnmcEARoR+umxzvo3hGQPbHyH\n" -"jTsQtSBjs75/9fCxcYmBWkh3JHVDVsCbV+z+5KZpk3m50J4Y1hC8hvepC9CaBqOM\n" -"DjfyXh58x1yKiueEbcjSWsRuF7CjcrYnFUBHOs9U1j9WytCI3fhOWPMgR4UZpGuU\n" -"WlcR1BXg1wYxX273xOS/jYn9MLAVlbRpPTUMIH9VRP+sc8+XaxKpJSCl4C+vcwNY\n" -"1YdKD2QiuoBJ3fXGtqMVRtn9eZvatSJuY9CnRKRbf0hWmFD4D5RkiwE0WkdtwoHR\n" -"uEXJ47RlF0/JDU1fY1mXBkq3usvB4Absy78qL06vh45xkk9bHbdf+7Ao1RQKmqiB\n" -"NL5XnjBu+YX535WG7t7Su3mTCJXYHvn72ATxry8yhSLgWqt81STkRwc14HmrOGG8\n" -"Gw7bz7y5vikj/rnPyr7ry+QRgNNDDayAqenAu2vEAzWir0RQC/iZ9rc/r7YQWGgL\n" -"Xrd4TQ6rTZePARhwB3VomnLDDvLvi2oq/jPzLKSYM2a7qj/vBSbJ/NnNaDW5Ccew\n" -"RjMI1lIHeedqYTVAW/CKoSEPcFSAzi/Ija0gcWLgX5xsFDGIYBepAX0KS9426kMu\n" -"0r/V66zmPMusMilqRTx7KW+jZMVxXVc2zClcdmohMmtjsbqLkczprfSbdGswMv9Q\n" -"I1ktHJHIRD0vPeZXnvKZsRKZw3sKb0ltZi33ZxCJFQPeGGtM5aAFthj6awcXy6Tt\n" -"DPUQdCU/vh1zmGRAX17/Xb0irfvN+GhQLEl42pzhigJXc/rCG3a4Na8wT+xAIZVf\n" -"WUI7hMslx5wA+iB4lrAjCq0YIrjINI/lHYpotXUZGmz5wz0jOciTmXMSx9du4cpk\n" -"fIQJfR+fr5tG3fjHMgSP+p+RewHkd/7RUAmHC2k3cuk5pCJvUVJrhUIqsi1fa0LG\n" -"GA0UU6Nr9tpYdNr1WkbKQjxTg0D//AXe61jmUS5XUU4AQf6zQVfN0TMtmuYeacbK\n" -"4r6Z1CSIRbsgcnL1BN8GSd4KddkCqSk941aJUCoX+77ou4t0btVSB9FnLKipigtE\n" -"E/Rpmv+81lA4fLiIag62/pcJ3uppsZ9aaHdR10SMmuCjAVLYHqhJfrHHn32dyqLK\n" -"UI8kEZJ6GQzHLUXcGbbdnk1Qm6JwO8TeF/oQvh9y9py+oAyFy0qzP2UeUMUI2yRQ\n" -"mlWSy+wX1DbVDQ3UHwJjWp65CgyYXuW8eCB0AbyF0kF4KGf7/7Ae7tEGbmYSm5MA\n" -"71z+Azxtv5gRyRb787V2dyo0wcmbRlL7iUBVXNM/czQo31tAZIwLc+lKNp0SPH6g\n" -"gJ2yX/GeDSFNAeEVUZ/f4KZIa7QQsnGWrUr+agSnQFkySmIjWYjwC/abJwah0v0d\n" -"ulwr3tECaaXtoWVdYXa3utEclBz9umBwMJ9MQCm4Kx7dTYUWFT3bMM/ESTkGPcfm\n" -"m+C4FsqFBs80WY0ududu50vTDSdJt1RqZ7Sg6DNH6acBvWyXOpT5mPJKUjnSFwyG\n" -"oVLgv0aDDx7lLZdCkhyz/Ff5LNmBgQsjGllPszJ2gTZxZ5LD68S4kUirQG/qtzlS\n" -"PGfDOC79SMZGgsoAnr4wV3RUTxsTVFlxVHsBMB+EXOFHAr3wHTVxUGBbGzxBlQ9w\n" -"I/jlu8LIIexXAU75HS5KCGGfg0Z7BLqEzqpMKqcBQC7BD7GnCXrDSQ2DCXnl7bLN\n" -"lIrQ/z2Y8AgSdED46R40MqyyN6CPPNiOCjONHZ30fLEXuEgCp4R/+x0WWsWpjGk2\n" -"Ydkc03cx/X6moUYxB5HTqTodBmAQuWMX0rxFDrnR0SWghWjdWth9gjd+dvZ82tt1\n" -"UMUywDPhcYchtUi2lnqnYJm5p00GN9Mk14MC5ZC5qP57IJVqxu0ktOMpks+CLPnz\n" -"qp9OBpI4sIzd0y0aUJC2Gd+E9aAhlREIiicyBDmxLdk1i37QeeCralI3eubLNmE+\n" -"CjDjD8t8FUGPpKglSD3lfLTqbp2TUvyWfvJC6ulFPNsAbeLHTnPnpyPQmWxhMNGt\n" -"h67B9tbYww2TvNwqIgmB4+YIR4/pSs15TpAqvuUvjpmRwGklqgiSmrQrlIxCxux/\n" -"mfsaL3KE97wm8BsaMpMkjUL7ByTIFhFZ/gHPTxaFpbqTZ4G+lABLgp3bIsB9Dl/P\n" -"ovoqX+qL2Mq9T0GrVJGfRBuA5hISw63hx5zdsj2Cj3A3khHPqR+GRN/rVYUuOpLm\n" -"z3v5pU/74vZRmNMAIhyhmweSEPNtyVkgSdgbFErqvhxN0om2Cd/7cWh2g5BXHyUL\n" -"PBr7ZkgfsE9TnuDH7Z0JoBqXJki+MO6nqz73oH2Mm86yxcXp6O/ieKTollrUJ3yQ\n" -"P6hLcEbYPzUV99del7Va5Wi0nn0wbRXCGVQdwY+iWc7pT+VVlncyg0TvLXi0OtOt\n" -"O8xbT2DAzVXxMwOsKV9ZgS/0dtwzwICpnTzBI/47V8GYhHbOUNTBPZ52GaXMeWlX\n" -"cuRGb0+7OkKWuriyOQ5z5xaASCVfqgnOwSZYiAk0gcDoK+JHdr64/sMoJhH87R4i\n" -"2TO90whkScgiGR7A06Ba42bT1nJtI6pxvzdB2b4BDAs2Lr2OdcB3BY1dtzKjFkw/\n" -"qfIw3F55UQwcs84ZEFQDAB/tmfNHajblDFpXR4N5QvU/PdWVWJUub7oNyhIX6ruu\n" -"ln4H7lpTUHJZ7jkr1qpnvkztZtHGlpJ0QdUHgyMYER1xU58Hg77yzIW3EdAa2PyK\n" -"1t4udKbQKChShlShIMzwzj57ss/69QobrpYAHYi6IRMaMUGBfipGBACK3yeXsXz0\n" -"c3Q2J5vI6QbxNsiJ5t7Ry1IqotbJcU7HND/yVUAUbEg5CpEDOSeSOW/ulyLuFxEV\n" -"lRTwIO/68BoIoR7umlP23/1N5OYzaBHhH2nThILBovHeJRXnGXSgeFfwSj7LIYEV\n" -"c1MdDSg/HzoADPXyEPLzqFzHRHeNiqEolmOPnFh0hRzbMZ0W5TQPDGWJdF21g816\n" -"vA0WW4UQjLM+vnX9kKKLA1ut+9JWk1dGKsmWtdWUDfJjUP/L6dS4OYEl6O6+SjM9\n" -"GcyGvHTiC5OpJllYpvELP/NjtTf9or8Bmruuga/axeOuS5ocYLK/sGRlmO6Z96da\n" -"QSlyGWEQAnM2D1cDmdd4CetPslOVIcQ41+coWCi2xg3UjO/bFK1CA4R1rb4ekXfs\n" -"s5U2XChyHhUPgl57y1r0ILXRXWJTJ0/F9hhu4aYQVFeIV/IuzJbmTKKkAcCOH6ys\n" -"qnu2BXz8Pm2tU10JFfRcuZ8rHuUyUErA40ESsLijON98GMwL4Rat9ZSCNS5hlK7y\n" -"yRJdr0ITp8oTbduAoulgWOvtcw1L87QBVojWz3cbhXra+WITirYuGNbzfmZn1WQM\n" -"kukEZUEHSypGOrHr1XiuY4Rw/DBaJSLyZ+VybEOfXqXkDBh5s1ayypBvzrzFZCIn\n" -"PJxIVsvrkhrpEbTJ9d7zLWjhOa9ZWw8lAubllbGm+7qCfdHmGsfBtvJdzx6zhB1Y\n" -"otL/PCis2XVTBEDJeB8pGqKFOZjNz8PC5qP+ymtAfy2ktl/u4HsFlxV7CsEKGYPm\n" -"p3LqnhPUy5M5gin4E4uPPyzzD2kcM3way49FKWUKlblQU0SyWtHRmMB3vcVmyT85\n" -"BRULXF7jgog7XR/EMltwQyJI6GcUCrnWZu+G0BEwXG+CsgCzE7assDavc1NSGLZM\n" -"rmzXiFFyfk7CE6lW2Lm+oWaFwKdvpmNZJFGGX8ZHRE9ZvkFMnfw9MYf2W7xa0jf7\n" -"k3c6X5wMuk9mznVtq5itNFVXh1mT1ujeWOiiqyH5UhQQjj6O+ZXt4gqt/jT6dd1i\n" -"jRuhhxaUGOlhpVBW/ySXhZ+HgOy9aCJ/bgjRGaqGixogk4f4rcgigHruwTpOQuDn\n" -"xDZ3Xns70S40WtHSYN+Gbl9nIh4yl78aNnA4FVtTAuLlVKEKlMJi9OBFuP5TEczG\n" -"+0HTwL/VPSCI+8FUZBhlz3YwecYq6dY5mS46+luPW+5Wl+5jtzb8V9oxVnRx2hQq\n" -"B5HJsM5FOOhHDHMXoCsevj7N/ufK7cU7Wbr0DkgYRwvb0ZJB5WYgcaQ0W7aduhGb\n" -"MQsandhP8Ajb2cmLobi3mHHPbcEkvjT8JP9Sim5xtfF+oCMMB5ByA5bI2aIFybZm\n" -"jX9e/V8wNgtpDKDVKPjB3+9dj5gU1N5JsrjQwQDB0kVRMWdpJCtD4hZ2+T/QE3SI\n" -"f8Rdk8pj8qBzRPbnhW6qsoWZdjMRC8qixZqHw4jol09UF7Ab9hjEF5ZDTfNGXwy8\n" -"/hz8su+mr8hhrlCrOF2vBYUayAA96zhbDWfg3Pdxo9bTn3/DmyAngL4J5Gu679xK\n" -"rWN4j7uQG4bzTa8WJb09/lW49UzWvmrz0c6/yexk3T//xDD067FafdnP5pYs4Cvp\n" -"rCoHpXbKjxx99DJmb5iXW0JRLSpFSCbf1HPHbmzST3minSXap5FCWDJcSgExKIJp\n" -"DXZ9rk0LMnQA74MWC5gjjM+5t0AHKuNRhJbQSwYWTKqeApXho53T/COlfDlSs2tb\n" -"Vz1Ia5z7IOfu1QheE93huNAHT3Ob+mSmUq782SqFPr6uwud/l5uP3HpcuwugdlFm\n" -"Jw8uBBOQ53W4lLbYfQYTVgieClVhmYMu7Ye0xYZ5B2jf714sjZRMa0LCbsyj58xH\n" -"uzs8ddNN1fLMzb0JRBE8JWj5PbxhA/sTwMkD7SnEMBUTtP0obmuQ982aTfyvQCH/\n" -"ve8OUPtYf5XWNv18mpR+h+riMt1Y8Eb6BJzTMFNWagMJAe3JV6A6upHroNFo2FxY\n" -"1XPRM1Rt0zKo7GD+oXnixfpl1aG8yqZhYo1ZC9buaHwH6zvM+xoiGD0iujeDtpVy\n" -"Vp6cAqqaGmrNwcPVBLc7hNKrJnbFKyhjL5/xp9j6jQov1aWQ8HsaNvh0p2ljmlwb\n" -"daTYZcwLgSgPna7HhiqnOSAmXZ7St/qe/b9TqBtIVzwzmtevgMyG98QV0syFP5X6\n" -"2Jc1g9733sTZp7njq4Cu07JhpICpinhLWR3nkODJbjk/mpLcQZgtV6W749AUo8oT\n" -"jRVEJ8MpCo1h0bVDxsRnA3DrMneD88L8/b10aHs+bPm1HKbCmT+kJAFaUQNa8JvJ\n" -"pReN37qTWvZCte7vaPAIP5cboATMu/J4t3izpm+YJoJlWcIegGx3kQ+17P4MbgDl\n" -"S93U4sOLvTk9+MoyPo9yGWU/zHgzcQ6wCFdzWMDRswuh+/4TJ2+yg6maq3iBtj39\n" -"gNLMR+sRgGGvYisqE9bfvNQy5IWrABBKcSBTXeTM1DmW6jv3TI8DoCzCbpjqcIwT\n" -"u2J+7k8wJEHPcAwnBjlyWphVvwNwM0cXqOnlJZ/4z7OGgjiNEem7TMuvxk+YkiXK\n" -"OzftdTjeIpzBwsGRP8/teMBpjS95M7GloKtxO+muBVxXbmsq8GBRC9vtNJ2Ma/xP\n" -"bXvd+7caytD3ob6ZfOzCpi4ZS8uByEfIMxlgZ5Sn3jhgEkcIU+YW9b3teMZOuWdA\n" -"QpDCoMpXaHVyRqwVV59JjmftiBnNBEo1/QzRj2UxRi7fHMfmNxL5LRM4CHSLUSCq\n" -"Y3A3pkxvBHUzemhynSFvtCPa8GHiUpe9so0V/2hlgaENAVELPjMlWytaYufRllgy\n" -"tUnCd32C5PrrmYzMKnxKRPXLcxLgziruJGSks9vIspoPk0pWgkZm+M9fRpJKlWHF\n" -"yT9OOGBW2yynw/yvXssxJmdUDxVcWL4uS2bZc4s0Zc6RSL9uQPjZVX0JLj+cXfx4\n" -"93Gn5bDhMgm+CGM6j3RiAAD7tT5V0sytNFjXd1A4U1u8yj3wzhKqOtZpDmuGUlMn\n" -"EODu7I5KtWxOTPThy7TecI5r+F/6KL+2MOtRhj2PmlT/Xed6PaAmDkQeiXGps08x\n" -"u0JIpuB61axvT4PAsKZNUd4ExbzNxRDAARUMgY8krpmyKZyHVFIQ19uHM2lGl9/i\n" -"h3PKlLHYI8RsHutHElzq+F5tWd5AA99LVRZX4axAVIQNiqRg8IMSoCwUaCCbjUMz\n" -"sJCo2t36GYk5S2BRnfrCqYoZRHw+ENYN0tDEMhXq1OqjvNHW3TzL3DsUhM6EZU5n\n" -"cRR4ynUvPqqWFphLefRW10vCtaW9roJQZyFYf9kd8xgW/BhcDNbTTaQ1U6xCHgX+\n" -"78DKee/NvY1WIEBR8X0iVk5XlSJb14eRtxNawXFyebVdmC/DiMNgnTBncMbePnZi\n" -"KCl1r5xqo7tSIoJ6Z0l6qINd89T9fcg9mujTVwsfQ+5/kdEy0Iw7CQcTOGvMaoPX\n" -"IAJlWSVeZ8eu8kmsD1Z8ewoPufMKiY4cPRAK5bCDgsrK6bAExOlCwPnNNM8Ym1Hz\n" -"aYFeGs5sW468Qww+Nbl5xcNFKtwUKZ6EebRHjwttiyTgCdAhv9wL1u2WFydWWgkG\n" -"rwUbNpSLKls+pijCeJAscvxzbZz96iOaYrY8IyzGBFwfgFAESfnzBc8SQjZzMzoO\n" -"vmYIRon2m/5w5AZA2IjQ4VxXJDK6XExD/ZLsxNXzMnROD++hE+s8DvPlRPmN4egF\n" -"gAzJs/9t7IyE/dDf7gSSBqzEBbwduD8ozzYHwELUc4ERdRzjEdBM0azT61g7Yilr\n" -"iT5Hy+2iw/pNwiqVOYiAbj2lwcoMlFZmdxviD4IMXdsNVWsCAVJL0PqIh1UDDb3z\n" -"Urv3idBJeSBuuFr6AFS6kAgvrwV/pEGoBoHuyii/rZxVugGKeuMynKEvSHuFNuQU\n" -"qIHcNgqQR34v2Ut5pQ1R8s7K3Rae/AhE5GncJa6FJmB9TF8MYMu9PlSZV/eGv8UL\n" -"IDWQ7sY3NdhZini//xtwPqIw29yOeZ0X6Aqsek9tfh21UwKSpHb7T+PwXYmoB+23\n" -"p3FXkP/rv4AGRq1xJqFYzKJvwsXqTFuNFWP74yhTg6rC90w2p5TeH1rJMAnv4u0L\n" -"hGtG/NL+D1Tzdf00TYAjno5Ia5dQJDd/eO+Ygqnhl6hAqGtS6r9JhIEXw1nQD7SC\n" -"lj96ZuKdUWO8rpIiAtvHAsn++xvMVPm/S1SwA8oE049iVwS8/eNNiMKoSlTlYc7o\n" -"pusBZQrVF4We4HHYFjysBbcXlvoXDd8LkZ8Nh63VQPnoIGNKH2U6aXCnQcJ8dZqO\n" -"DNxL4uyM4A578FUUR6vxqt2asnLHQ0Z7pPE4uqtz/WgbiHI/i2oHS8oe1clsifCw\n" -"3ZY33kflqLftkTNka1oiftDb0OqFLjkS7/AUorqHazw53gM3gqJY5EXA3Px9+nhu\n" -"NzxSK/t41JoCfgQJHMkIWb3yUcO4OFZeGCeAxIJY95hv/brt6/WNielXjNaohYvc\n" -"lsSUHEJRHwVxQmWK0LS+g13HAgOI7cNt3MA8sSkzTneHGFgEvmrSyb0wCEmushC9\n" -"mjQThvaxfQk9douA/cR2bHr7axXqv9vjztmxUr0a30a7lvLMBQbJmFtJJylW+tJe\n" -"v/vKNOB+9mK793cttr2JFnMhwUKFKWiFDQJtxw/eLQWY4BJ19Rs2x4BJgmV+u1jB\n" -"zR8uvxuArG/cqVEJsoC6uuSzhAWSwdvumijO6yuyWF6nHY6aAcy8dyFQlDFHAd+/\n" -"J05Lrbzj4N9lcI7hPalh0uMdERGvtUdT8QRm5ebP1zogYEkZk/1GOU29dMawkAt/\n" -"SWhp2yWdjLt8f5HQKu72vUF/yyTfzfdqQqJwfthP7+vp+sHDO85AMF45uU9g3pxW\n" -"IbXSbZ4fFGC1/41db/2GOHFgaheMXj0SIWHqQE1jtihr3BBBO4b3Ccz5QCnrn48J\n" -"8L+QRdh4a/cAx4ty/oHEiXwpSBBSFRl5+y2NijC8GITA5dRjCRWP+Y0zuTrJ7j1a\n" -"h+3kGs1kxqskhaEuhXnXyknGLjXrU+ewRGhHzP23o5betVhX+c1XjVqmJNZ5OPn/\n" -"wrqx/XwoIl/3F5lMmGDG9mPtyg0E227nKl9Sy0Vbwx2tu1unjOlzSCa7lpoD4TIX\n" -"PBJ5+Zb0CE6HEt3V0ec1m4uUe/xObAnzyr4UbzdqLaMy8vTcF/qsncXyPBjwqdjR\n" -"ReDAtt99bAPY4roPKGt8dgKUPE0t/XoY+SlmUp75TkZDXrOIJXpEW0GpLPf53T+W\n" -"Ex3KtfLAnZzrw8+dIageY7IgoQ85h3sYE7uEI8QlcO/o4udqUzTp4Sn4sWvdTLrx\n" -"W7ImvK2rsU5ubVdsEaFKM7+7nxGn2JyMpIWFz0SbP34CkXHhrXxyRD+GhMIDHFxV\n" -"uBnZnjJsw+ooIm1rL4I7/VMWEwmVegreT6w9Gsmb5igw+zu9v2YBgTOhysA9XZd4\n" -"7O3VjqKkhTXcBqdpRWuz8gPQ+4rfwij28Gg2alG04Eh3G3868NOCFJhhaHVmwYR2\n" -"ygRm6N9eDW1bHhYSN75HSEb6aIebk+1AT4S1QtJaPSH0EduIXO++JYAs+jIFKy2c\n" -"jCVFlO/LbXl7iCdXurJHpSbMNmZFNUri6zEolENODLwke836jBOKiVrWzLnEMxHI\n" -"WDDTpLTYhR3C7sEprpEQm9SX2Eik3WxVb4ZTb7SZFU1y1d4tWnjGu3U1D+vO9wVq\n" -"Sss9lDipbkhQ9k4j1/Pqozaxvi8lYLbh3WEjK3Iwpr66Bk6Ai2oRg4b+7vzV4o+6\n" -"L47JPJhajdHac0CIlmupyA4eejECS6OpoLDf5Wr/616k3dxM//3kAWGUnXVw9GSo\n" -"UF5W8AaKlaGZ6EZk09NyGSFRjEs18z+g5ckviGF0EhZI7ZPWQQmlqWUsL9O0S4GO\n" -"ZZ9f0UhNmHEspcugbs7e1yfjwGVyxIBkrmxpkmfHE4Gb47UGlJevg2OvZOPT3wMH\n" -"vOds2BtqdT3tuss9k+7hsISGse7isEOb7TN5MHb6yyzqnCUZhp5m3Iag7TUkiyfU\n" -"jKH5R13tHqKUoJ2rofWoLO2H5xSfp/lqF9sLd4rJ+Pbjhiuvfwz5copYsuTNL4kB\n" -"SPUikHlTxSOgTBYNV77qxpsqOI3+iziCrSqHsxNdlaA1T3fiq6SeZBNdD822AYm9\n" -"L5hbcgpDPEEwT/n5kWNbRNueerJkJwboaOnT1ZX1601Pwj5QDi+YM1NYy5PsdWxb\n" -"bPGpQyZ+uf917q9gV7Ykr5cic10YD11khAghr0n6fYfb8Ijc22uP6m47KItDqQc1\n" -"eFym149F56B0yg5FR85Arg==\n" -"-----END MESSAGE-----\n" -" signature Of+jvQKzH9ot2NV5twlDO2CFbzLSB4absWTwG58TCHb+TWgQi3z6SZIoTnGGY/uicJgEkCN++bZZR49GiyHyCQ\n"; diff --git a/src/tor/src/test/test_hs_intropoint.c b/src/tor/src/test/test_hs_intropoint.c deleted file mode 100644 index 6a7962b21..000000000 --- a/src/tor/src/test/test_hs_intropoint.c +++ /dev/null @@ -1,921 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_service.c - * \brief Test hidden service functionality. - */ - -#define HS_SERVICE_PRIVATE -#define HS_INTROPOINT_PRIVATE -#define RENDSERVICE_PRIVATE -#define CIRCUITLIST_PRIVATE - -#include "test.h" -#include "log_test_helpers.h" -#include "crypto.h" -#include "log_test_helpers.h" - -#include "or.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "ht.h" -#include "relay.h" -#include "rendservice.h" - -#include "hs_cell.h" -#include "hs_circuitmap.h" -#include "hs_common.h" -#include "hs_intropoint.h" -#include "hs_service.h" - -/* Trunnel. */ -#include "hs/cell_establish_intro.h" -#include "hs/cell_introduce1.h" -#include "hs/cell_common.h" - -static size_t -new_establish_intro_cell(const char *circ_nonce, - trn_cell_establish_intro_t **cell_out) -{ - ssize_t cell_len = 0; - uint8_t buf[RELAY_PAYLOAD_SIZE] = {0}; - trn_cell_establish_intro_t *cell = NULL; - hs_service_intro_point_t *ip = NULL; - - /* Auth key pair is generated in the constructor so we are all set for - * using this IP object. */ - ip = service_intro_point_new(NULL, 0); - tt_assert(ip); - cell_len = hs_cell_build_establish_intro(circ_nonce, ip, buf); - tt_i64_op(cell_len, OP_GT, 0); - - cell_len = trn_cell_establish_intro_parse(&cell, buf, sizeof(buf)); - tt_i64_op(cell_len, OP_GT, 0); - tt_assert(cell); - *cell_out = cell; - - done: - service_intro_point_free(ip); - return cell_len; -} - -static ssize_t -new_establish_intro_encoded_cell(const char *circ_nonce, uint8_t *cell_out) -{ - ssize_t cell_len = 0; - hs_service_intro_point_t *ip = NULL; - - /* Auth key pair is generated in the constructor so we are all set for - * using this IP object. */ - ip = service_intro_point_new(NULL, 0); - tt_assert(ip); - cell_len = hs_cell_build_establish_intro(circ_nonce, ip, cell_out); - tt_i64_op(cell_len, OP_GT, 0); - - done: - service_intro_point_free(ip); - return cell_len; -} - -/* Mock function to avoid networking in unittests */ -static int -mock_send_intro_established_cell(or_circuit_t *circ) -{ - (void) circ; - return 0; -} - -static int -mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, - crypt_path_t *cpath_layer, - const char *filename, int lineno) -{ - (void) stream_id; - (void) circ; - (void) relay_command; - (void) payload; - (void) payload_len; - (void) cpath_layer; - (void) filename; - (void) lineno; - return 0; -} - -static or_circuit_t * -helper_create_intro_circuit(void) -{ - or_circuit_t *circ = or_circuit_new(0, NULL); - tt_assert(circ); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); - done: - return circ; -} - -static trn_cell_introduce1_t * -helper_create_introduce1_cell(void) -{ - trn_cell_introduce1_t *cell = NULL; - ed25519_keypair_t auth_key_kp; - - /* Generate the auth_key of the cell. */ - if (ed25519_keypair_generate(&auth_key_kp, 0) < 0) { - goto err; - } - - cell = trn_cell_introduce1_new(); - tt_assert(cell); - - /* Set the auth key. */ - { - size_t auth_key_len = sizeof(auth_key_kp.pubkey); - trn_cell_introduce1_set_auth_key_type(cell, - HS_INTRO_AUTH_KEY_TYPE_ED25519); - trn_cell_introduce1_set_auth_key_len(cell, auth_key_len); - trn_cell_introduce1_setlen_auth_key(cell, auth_key_len); - uint8_t *auth_key_ptr = trn_cell_introduce1_getarray_auth_key(cell); - memcpy(auth_key_ptr, auth_key_kp.pubkey.pubkey, auth_key_len); - } - - /* Set the cell extentions to none. */ - { - trn_cell_extension_t *ext = trn_cell_extension_new(); - trn_cell_extension_set_num(ext, 0); - trn_cell_introduce1_set_extensions(cell, ext); - } - - /* Set the encrypted section to some data. */ - { - size_t enc_len = 128; - trn_cell_introduce1_setlen_encrypted(cell, enc_len); - uint8_t *enc_ptr = trn_cell_introduce1_getarray_encrypted(cell); - memset(enc_ptr, 'a', enc_len); - } - - return cell; - err: - done: - trn_cell_introduce1_free(cell); - return NULL; -} - -/* Try sending an ESTABLISH_INTRO cell on a circuit that is already an intro - * point. Should fail. */ -static void -test_establish_intro_wrong_purpose(void *arg) -{ - int retval; - ssize_t cell_len = 0; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void)arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - memcpy(intro_circ->rend_circ_nonce, circ_nonce, DIGEST_LEN); - - /* Set a bad circuit purpose!! :) */ - circuit_change_purpose(TO_CIRCUIT(intro_circ), CIRCUIT_PURPOSE_INTRO_POINT); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - attempt to parse it. */ - cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); - tt_i64_op(cell_len, OP_GT, 0); - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); - expect_log_msg_containing("Rejecting ESTABLISH_INTRO on non-OR circuit."); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Prepare a circuit for accepting an ESTABLISH_INTRO cell */ -static void -helper_prepare_circ_for_intro(or_circuit_t *circ, const char *circ_nonce) -{ - /* Prepare the circuit for the incoming ESTABLISH_INTRO */ - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); - memcpy(circ->rend_circ_nonce, circ_nonce, DIGEST_LEN); -} - -/* Send an empty ESTABLISH_INTRO cell. Should fail. */ -static void -test_establish_intro_wrong_keytype(void *arg) -{ - int retval; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - char circ_nonce[DIGEST_LEN] = {0}; - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, (uint8_t *) "", 0); - expect_log_msg_containing("Empty ESTABLISH_INTRO cell."); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Send an ESTABLISH_INTRO cell with an unknown auth key type. Should fail. */ -static void -test_establish_intro_wrong_keytype2(void *arg) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - * attempt to parse it. */ - cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); - tt_i64_op(cell_len, OP_GT, 0); - - /* Mutate the auth key type! :) */ - cell_body[0] = 42; - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); - expect_log_msg_containing("Unrecognized AUTH_KEY_TYPE 42."); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Send a legit ESTABLISH_INTRO cell but with a wrong MAC. Should fail. */ -static void -test_establish_intro_wrong_mac(void *arg) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - ssize_t cell_len = 0; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - trn_cell_establish_intro_t *cell = NULL; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - * attempt to parse it. */ - cell_len = new_establish_intro_cell(circ_nonce, &cell); - tt_i64_op(cell_len, OP_GT, 0); - tt_assert(cell); - - /* Mangle one byte of the MAC. */ - uint8_t *handshake_ptr = - trn_cell_establish_intro_getarray_handshake_mac(cell); - handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++; - /* We need to resign the payload with that change. */ - { - ed25519_signature_t sig; - ed25519_keypair_t key_struct; - /* New keypair for the signature since we don't have access to the private - * key material generated earlier when creating the cell. */ - retval = ed25519_keypair_generate(&key_struct, 0); - tt_int_op(retval, OP_EQ, 0); - uint8_t *auth_key_ptr = - trn_cell_establish_intro_getarray_auth_key(cell); - memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN); - /* Encode payload so we can sign it. */ - cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), - cell); - tt_i64_op(cell_len, OP_GT, 0); - - retval = ed25519_sign_prefixed(&sig, cell_body, - cell_len - - (ED25519_SIG_LEN + sizeof(cell->sig_len)), - ESTABLISH_INTRO_SIG_PREFIX, &key_struct); - tt_int_op(retval, OP_EQ, 0); - /* And write the signature to the cell */ - uint8_t *sig_ptr = - trn_cell_establish_intro_getarray_sig(cell); - memcpy(sig_ptr, sig.sig, cell->sig_len); - /* Re-encode with the new signature. */ - cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), - cell); - tt_i64_op(cell_len, OP_GT, 0); - } - - /* Receive the cell. Should fail because our MAC is wrong. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); - expect_log_msg_containing("ESTABLISH_INTRO handshake_auth not as expected"); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - trn_cell_establish_intro_free(cell); - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Send a legit ESTABLISH_INTRO cell but with a wrong auth key length. Should - * fail. */ -static void -test_establish_intro_wrong_auth_key_len(void *arg) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - size_t bad_auth_key_len = ED25519_PUBKEY_LEN - 1; - trn_cell_establish_intro_t *cell = NULL; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - * attempt to parse it. */ - cell_len = new_establish_intro_cell(circ_nonce, &cell); - tt_i64_op(cell_len, OP_GT, 0); - tt_assert(cell); - - /* Mangle the auth key length. */ - trn_cell_establish_intro_set_auth_key_len(cell, bad_auth_key_len); - trn_cell_establish_intro_setlen_auth_key(cell, bad_auth_key_len); - /* Encode cell. */ - cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), - cell); - tt_int_op(cell_len, OP_GT, 0); - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); - expect_log_msg_containing("ESTABLISH_INTRO auth key length is invalid"); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - trn_cell_establish_intro_free(cell); - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Send a legit ESTABLISH_INTRO cell but with a wrong sig length. Should - * fail. */ -static void -test_establish_intro_wrong_sig_len(void *arg) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - size_t bad_sig_len = ED25519_SIG_LEN - 1; - trn_cell_establish_intro_t *cell = NULL; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - * attempt to parse it. */ - cell_len = new_establish_intro_cell(circ_nonce, &cell); - tt_i64_op(cell_len, OP_GT, 0); - tt_assert(cell); - - /* Mangle the signature length. */ - trn_cell_establish_intro_set_sig_len(cell, bad_sig_len); - trn_cell_establish_intro_setlen_sig(cell, bad_sig_len); - /* Encode cell. */ - cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), - cell); - tt_int_op(cell_len, OP_GT, 0); - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len); - expect_log_msg_containing("ESTABLISH_INTRO sig len is invalid"); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - trn_cell_establish_intro_free(cell); - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Send a legit ESTABLISH_INTRO cell but slightly change the signature. Should - * fail. */ -static void -test_establish_intro_wrong_sig(void *arg) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - or_circuit_t *intro_circ = or_circuit_new(0,NULL); - - (void) arg; - - /* Get the auth key of the intro point */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - attempt to parse it. */ - cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body); - tt_i64_op(cell_len, OP_GT, 0); - - /* Mutate the last byte (signature)! :) */ - cell_body[cell_len - 1]++; - - /* Receive the cell. Should fail. */ - setup_full_capture_of_logs(LOG_INFO); - retval = hs_intro_received_establish_intro(intro_circ, cell_body, - (size_t)cell_len); - expect_log_msg_containing("Failed to verify ESTABLISH_INTRO cell."); - teardown_capture_of_logs(); - tt_int_op(retval, OP_EQ, -1); - - done: - circuit_free_(TO_CIRCUIT(intro_circ)); -} - -/* Helper function: Send a well-formed v3 ESTABLISH_INTRO cell to - * intro_circ. Return the cell. */ -static trn_cell_establish_intro_t * -helper_establish_intro_v3(or_circuit_t *intro_circ) -{ - int retval; - char circ_nonce[DIGEST_LEN] = {0}; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - trn_cell_establish_intro_t *cell = NULL; - - tt_assert(intro_circ); - - /* Prepare the circuit for the incoming ESTABLISH_INTRO */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we - * attempt to parse it. */ - cell_len = new_establish_intro_cell(circ_nonce, &cell); - tt_i64_op(cell_len, OP_GT, 0); - tt_assert(cell); - cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body), - cell); - tt_int_op(cell_len, OP_GT, 0); - - /* Receive the cell */ - retval = hs_intro_received_establish_intro(intro_circ, cell_body, - (size_t) cell_len); - tt_int_op(retval, OP_EQ, 0); - - done: - return cell; -} - -/* Helper function: Send a well-formed v2 ESTABLISH_INTRO cell to - * intro_circ. Return the public key advertised in the cell. */ -static crypto_pk_t * -helper_establish_intro_v2(or_circuit_t *intro_circ) -{ - crypto_pk_t *key1 = NULL; - int retval; - uint8_t cell_body[RELAY_PAYLOAD_SIZE]; - ssize_t cell_len = 0; - char circ_nonce[DIGEST_LEN] = {0}; - - tt_assert(intro_circ); - - /* Prepare the circuit for the incoming ESTABLISH_INTRO */ - crypto_rand(circ_nonce, sizeof(circ_nonce)); - helper_prepare_circ_for_intro(intro_circ, circ_nonce); - - /* Send legacy establish_intro */ - key1 = pk_generate(0); - - /* Use old circ_nonce why not */ - cell_len = rend_service_encode_establish_intro_cell( - (char*)cell_body, - sizeof(cell_body), key1, - circ_nonce); - tt_int_op(cell_len, OP_GT, 0); - - /* Receive legacy establish_intro */ - retval = hs_intro_received_establish_intro(intro_circ, - cell_body, (size_t) cell_len); - tt_int_op(retval, OP_EQ, 0); - - done: - return key1; -} - -/* Helper function: test circuitmap free_all function outside of - * test_intro_point_registration to prevent Coverity from seeing a - * double free if the assertion hypothetically fails. - */ -static void -test_circuitmap_free_all(void) -{ - hs_circuitmap_ht *the_hs_circuitmap = NULL; - - the_hs_circuitmap = get_hs_circuitmap(); - tt_assert(the_hs_circuitmap); - hs_circuitmap_free_all(); - the_hs_circuitmap = get_hs_circuitmap(); - tt_ptr_op(the_hs_circuitmap, OP_EQ, NULL); - done: - ; -} - -/** Successfuly register a v2 intro point and a v3 intro point. Ensure that HS - * circuitmap is maintained properly. */ -static void -test_intro_point_registration(void *arg) -{ - int retval; - hs_circuitmap_ht *the_hs_circuitmap = NULL; - - or_circuit_t *intro_circ = NULL; - trn_cell_establish_intro_t *establish_intro_cell = NULL; - ed25519_public_key_t auth_key; - - crypto_pk_t *legacy_auth_key = NULL; - or_circuit_t *legacy_intro_circ = NULL; - - or_circuit_t *returned_intro_circ = NULL; - - (void) arg; - - MOCK(hs_intro_send_intro_established_cell, mock_send_intro_established_cell); - - hs_circuitmap_init(); - - /* Check that the circuitmap is currently empty */ - { - the_hs_circuitmap = get_hs_circuitmap(); - tt_assert(the_hs_circuitmap); - tt_int_op(0, OP_EQ, HT_SIZE(the_hs_circuitmap)); - /* Do a circuitmap query in any case */ - returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); - tt_ptr_op(returned_intro_circ, OP_EQ, NULL); - } - - /* Create a v3 intro point */ - { - intro_circ = or_circuit_new(0, NULL); - tt_assert(intro_circ); - establish_intro_cell = helper_establish_intro_v3(intro_circ); - - /* Check that the intro point was registered on the HS circuitmap */ - the_hs_circuitmap = get_hs_circuitmap(); - tt_assert(the_hs_circuitmap); - tt_int_op(1, OP_EQ, HT_SIZE(the_hs_circuitmap)); - get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, - establish_intro_cell); - returned_intro_circ = - hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); - tt_ptr_op(intro_circ, OP_EQ, returned_intro_circ); - } - - /* Create a v2 intro point */ - { - char key_digest[DIGEST_LEN]; - - legacy_intro_circ = or_circuit_new(1, NULL); - tt_assert(legacy_intro_circ); - legacy_auth_key = helper_establish_intro_v2(legacy_intro_circ); - tt_assert(legacy_auth_key); - - /* Check that the circuitmap now has two elements */ - the_hs_circuitmap = get_hs_circuitmap(); - tt_assert(the_hs_circuitmap); - tt_int_op(2, OP_EQ, HT_SIZE(the_hs_circuitmap)); - - /* Check that the new element is our legacy intro circuit. */ - retval = crypto_pk_get_digest(legacy_auth_key, key_digest); - tt_int_op(retval, OP_EQ, 0); - returned_intro_circ = - hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest); - tt_ptr_op(legacy_intro_circ, OP_EQ, returned_intro_circ); - } - - /* XXX Continue test and try to register a second v3 intro point with the - * same auth key. Make sure that old intro circuit gets closed. */ - - done: - crypto_pk_free(legacy_auth_key); - circuit_free_(TO_CIRCUIT(intro_circ)); - circuit_free_(TO_CIRCUIT(legacy_intro_circ)); - trn_cell_establish_intro_free(establish_intro_cell); - test_circuitmap_free_all(); - - UNMOCK(hs_intro_send_intro_established_cell); -} - -static void -test_introduce1_suitable_circuit(void *arg) -{ - int ret; - or_circuit_t *circ = NULL; - - (void) arg; - - /* Valid suitable circuit. */ - { - circ = or_circuit_new(0, NULL); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); - ret = circuit_is_suitable_for_introduce1(circ); - circuit_free_(TO_CIRCUIT(circ)); - tt_int_op(ret, OP_EQ, 1); - } - - /* Test if the circuit purpose safeguard works correctly. */ - { - circ = or_circuit_new(0, NULL); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); - ret = circuit_is_suitable_for_introduce1(circ); - circuit_free_(TO_CIRCUIT(circ)); - tt_int_op(ret, OP_EQ, 0); - } - - /* Test the non-edge circuit safeguard works correctly. */ - { - circ = or_circuit_new(0, NULL); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); - /* Bogus pointer, the check is against NULL on n_chan. */ - circ->base_.n_chan = (channel_t *) circ; - ret = circuit_is_suitable_for_introduce1(circ); - circuit_free_(TO_CIRCUIT(circ)); - tt_int_op(ret, OP_EQ, 0); - } - - /* Mangle the circuit a bit more so see if our only one INTRODUCE1 cell - * limit works correctly. */ - { - circ = or_circuit_new(0, NULL); - circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR); - circ->already_received_introduce1 = 1; - ret = circuit_is_suitable_for_introduce1(circ); - circuit_free_(TO_CIRCUIT(circ)); - tt_int_op(ret, OP_EQ, 0); - } - - done: - ; -} - -static void -test_introduce1_is_legacy(void *arg) -{ - int ret; - uint8_t request[256]; - - (void) arg; - - /* For a cell to be considered legacy, according to the specification, the - * first 20 bytes MUST BE non-zero else it's a v3 cell. */ - memset(request, 'a', DIGEST_LEN); - memset(request + DIGEST_LEN, 0, sizeof(request) - DIGEST_LEN); - ret = introduce1_cell_is_legacy(request); - tt_int_op(ret, OP_EQ, 1); - - /* This is a NON legacy cell. */ - memset(request, 0, DIGEST_LEN); - memset(request + DIGEST_LEN, 'a', sizeof(request) - DIGEST_LEN); - ret = introduce1_cell_is_legacy(request); - tt_int_op(ret, OP_EQ, 0); - - done: - ; -} - -static void -test_introduce1_validation(void *arg) -{ - int ret; - trn_cell_introduce1_t *cell = NULL; - - (void) arg; - - /* Create our decoy cell that we'll modify as we go to test the validation - * function of that parsed cell. */ - cell = helper_create_introduce1_cell(); - - /* It should NOT be a legacy cell which will trigger a BUG(). */ - memset(cell->legacy_key_id, 'a', sizeof(cell->legacy_key_id)); - tor_capture_bugs_(1); - ret = validate_introduce1_parsed_cell(cell); - tor_end_capture_bugs_(); - tt_int_op(ret, OP_EQ, -1); - /* Reset legacy ID and make sure it's correct. */ - memset(cell->legacy_key_id, 0, sizeof(cell->legacy_key_id)); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, 0); - - /* Non existing auth key type. */ - cell->auth_key_type = 42; - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, -1); - /* Reset is to correct value and make sure it's correct. */ - cell->auth_key_type = HS_INTRO_AUTH_KEY_TYPE_ED25519; - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, 0); - - /* Really bad key length. */ - cell->auth_key_len = 0; - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, -1); - cell->auth_key_len = UINT16_MAX; - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, -1); - /* Correct size, let's try that. */ - cell->auth_key_len = sizeof(ed25519_public_key_t); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, 0); - /* Set an invalid size of the auth key buffer. */ - trn_cell_introduce1_setlen_auth_key(cell, 3); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, -1); - /* Reset auth key buffer and make sure it works. */ - trn_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, 0); - - /* Empty encrypted section. */ - trn_cell_introduce1_setlen_encrypted(cell, 0); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, -1); - /* Reset it to some non zero bytes and validate. */ - trn_cell_introduce1_setlen_encrypted(cell, 1); - ret = validate_introduce1_parsed_cell(cell); - tt_int_op(ret, OP_EQ, 0); - - done: - trn_cell_introduce1_free(cell); -} - -static void -test_received_introduce1_handling(void *arg) -{ - int ret; - uint8_t *request = NULL, buf[128]; - trn_cell_introduce1_t *cell = NULL; - or_circuit_t *circ = NULL; - - (void) arg; - - MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); - - hs_circuitmap_init(); - - /* Too small request length. An INTRODUCE1 expect at the very least a - * DIGEST_LEN size. */ - { - memset(buf, 0, sizeof(buf)); - circ = helper_create_intro_circuit(); - ret = hs_intro_received_introduce1(circ, buf, DIGEST_LEN - 1); - tt_int_op(ret, OP_EQ, -1); - circuit_free_(TO_CIRCUIT(circ)); - } - - /* We have a unit test only for the suitability of a circuit to receive an - * INTRODUCE1 cell so from now on we'll only test the handling of a cell. */ - - /* Bad request. */ - { - circ = helper_create_intro_circuit(); - uint8_t test[2]; /* Too small request. */ - memset(test, 0, sizeof(test)); - ret = handle_introduce1(circ, test, sizeof(test)); - tor_free(circ->p_chan); - circuit_free_(TO_CIRCUIT(circ)); - tt_int_op(ret, OP_EQ, -1); - } - - /* Valid case. */ - { - cell = helper_create_introduce1_cell(); - ssize_t request_len = trn_cell_introduce1_encoded_len(cell); - tt_int_op((int)request_len, OP_GT, 0); - request = tor_malloc_zero(request_len); - ssize_t encoded_len = - trn_cell_introduce1_encode(request, request_len, cell); - tt_int_op((int)encoded_len, OP_GT, 0); - - circ = helper_create_intro_circuit(); - or_circuit_t *service_circ = helper_create_intro_circuit(); - circuit_change_purpose(TO_CIRCUIT(service_circ), - CIRCUIT_PURPOSE_INTRO_POINT); - /* Register the circuit in the map for the auth key of the cell. */ - ed25519_public_key_t auth_key; - const uint8_t *cell_auth_key = - trn_cell_introduce1_getconstarray_auth_key(cell); - memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN); - hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key); - ret = hs_intro_received_introduce1(circ, request, request_len); - circuit_free_(TO_CIRCUIT(circ)); - circuit_free_(TO_CIRCUIT(service_circ)); - tt_int_op(ret, OP_EQ, 0); - } - - /* Valid legacy cell. */ - { - tor_free(request); - trn_cell_introduce1_free(cell); - cell = helper_create_introduce1_cell(); - uint8_t *legacy_key_id = trn_cell_introduce1_getarray_legacy_key_id(cell); - memset(legacy_key_id, 'a', DIGEST_LEN); - /* Add an arbitrary amount of data for the payload of a v2 cell. */ - size_t request_len = trn_cell_introduce1_encoded_len(cell) + 256; - tt_size_op(request_len, OP_GT, 0); - request = tor_malloc_zero(request_len + 256); - ssize_t encoded_len = - trn_cell_introduce1_encode(request, request_len, cell); - tt_int_op((int)encoded_len, OP_GT, 0); - - circ = helper_create_intro_circuit(); - or_circuit_t *service_circ = helper_create_intro_circuit(); - circuit_change_purpose(TO_CIRCUIT(service_circ), - CIRCUIT_PURPOSE_INTRO_POINT); - /* Register the circuit in the map for the auth key of the cell. */ - uint8_t token[REND_TOKEN_LEN]; - memcpy(token, legacy_key_id, sizeof(token)); - hs_circuitmap_register_intro_circ_v2_relay_side(service_circ, token); - ret = hs_intro_received_introduce1(circ, request, request_len); - circuit_free_(TO_CIRCUIT(circ)); - circuit_free_(TO_CIRCUIT(service_circ)); - tt_int_op(ret, OP_EQ, 0); - } - - done: - trn_cell_introduce1_free(cell); - tor_free(request); - hs_circuitmap_free_all(); - UNMOCK(relay_send_command_from_edge_); -} - -struct testcase_t hs_intropoint_tests[] = { - { "intro_point_registration", - test_intro_point_registration, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_keytype", - test_establish_intro_wrong_keytype, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_keytype2", - test_establish_intro_wrong_keytype2, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_purpose", - test_establish_intro_wrong_purpose, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_sig", - test_establish_intro_wrong_sig, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_sig_len", - test_establish_intro_wrong_sig_len, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_auth_key_len", - test_establish_intro_wrong_auth_key_len, TT_FORK, NULL, NULL }, - - { "receive_establish_intro_wrong_mac", - test_establish_intro_wrong_mac, TT_FORK, NULL, NULL }, - - { "introduce1_suitable_circuit", - test_introduce1_suitable_circuit, TT_FORK, NULL, NULL }, - - { "introduce1_is_legacy", - test_introduce1_is_legacy, TT_FORK, NULL, NULL }, - - { "introduce1_validation", - test_introduce1_validation, TT_FORK, NULL, NULL }, - - { "received_introduce1_handling", - test_received_introduce1_handling, TT_FORK, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_ntor.c b/src/tor/src/test/test_hs_ntor.c deleted file mode 100644 index 8eee54d4b..000000000 --- a/src/tor/src/test/test_hs_ntor.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_ntor.c - * \brief Test hidden service ntor functionality. - */ - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" - -#include "hs_ntor.h" - -/* Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 - * cell, and verify the proper derivation of decryption keys on the other end. - * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify - * the proper verification on the other end. */ -static void -test_hs_ntor(void *arg) -{ - int retval; - - uint8_t subcredential[DIGEST256_LEN]; - - ed25519_keypair_t service_intro_auth_keypair; - curve25519_keypair_t service_intro_enc_keypair; - curve25519_keypair_t service_ephemeral_rend_keypair; - - curve25519_keypair_t client_ephemeral_enc_keypair; - - hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; - hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; - - hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; - hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; - - (void) arg; - - /* Generate fake data for this unittest */ - { - /* Generate fake subcredential */ - memset(subcredential, 'Z', DIGEST256_LEN); - - /* service */ - curve25519_keypair_generate(&service_intro_enc_keypair, 0); - ed25519_keypair_generate(&service_intro_auth_keypair, 0); - curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); - /* client */ - curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); - } - - /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ - retval = - hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, - &service_intro_enc_keypair.pubkey, - &client_ephemeral_enc_keypair, - subcredential, - &client_hs_ntor_intro_cell_keys); - tt_int_op(retval, OP_EQ, 0); - - /* Service: Simulate the decryption of the received INTRODUCE1 */ - retval = - hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, - &service_intro_enc_keypair, - &client_ephemeral_enc_keypair.pubkey, - subcredential, - &service_hs_ntor_intro_cell_keys); - tt_int_op(retval, OP_EQ, 0); - - /* Test that the INTRODUCE1 encryption/mac keys match! */ - tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, - service_hs_ntor_intro_cell_keys.enc_key, - CIPHER256_KEY_LEN); - tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, - service_hs_ntor_intro_cell_keys.mac_key, - DIGEST256_LEN); - - /* Service: Simulate creation of RENDEZVOUS1 key material. */ - retval = - hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, - &service_intro_enc_keypair, - &service_ephemeral_rend_keypair, - &client_ephemeral_enc_keypair.pubkey, - &service_hs_ntor_rend_cell_keys); - tt_int_op(retval, OP_EQ, 0); - - /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ - retval = - hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, - &client_ephemeral_enc_keypair, - &service_intro_enc_keypair.pubkey, - &service_ephemeral_rend_keypair.pubkey, - &client_hs_ntor_rend_cell_keys); - tt_int_op(retval, OP_EQ, 0); - - /* Test that the RENDEZVOUS1 key material match! */ - tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, - service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, - DIGEST256_LEN); - tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, - service_hs_ntor_rend_cell_keys.ntor_key_seed, - DIGEST256_LEN); - done: - ; -} - -struct testcase_t hs_ntor_tests[] = { - { "hs_ntor", test_hs_ntor, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_hs_ntor.sh b/src/tor/src/test/test_hs_ntor.sh deleted file mode 100644 index 8a0003d44..000000000 --- a/src/tor/src/test/test_hs_ntor.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# Validate Tor's ntor implementation. - -exitcode=0 - -# Run the python integration test sand return the exitcode of the python -# script. The python script might ask the testsuite to skip it if not all -# python dependencies are covered. -"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/hs_ntor_ref.py" || exitcode=$? - -exit ${exitcode} diff --git a/src/tor/src/test/test_hs_ntor_cl.c b/src/tor/src/test/test_hs_ntor_cl.c deleted file mode 100644 index ed1eda58e..000000000 --- a/src/tor/src/test/test_hs_ntor_cl.c +++ /dev/null @@ -1,255 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** This is a wrapper over the little-t-tor HS ntor functions. The wrapper is - * used by src/test/hs_ntor_ref.py to conduct the HS ntor integration - * tests. - * - * The logic of this wrapper is basically copied from src/test/test_ntor_cl.c - */ - -#include "orconfig.h" -#include -#include - -#define ONION_NTOR_PRIVATE -#include "or.h" -#include "util.h" -#include "compat.h" -#include "crypto.h" -#include "crypto_curve25519.h" -#include "hs_ntor.h" -#include "onion_ntor.h" - -#define N_ARGS(n) STMT_BEGIN { \ - if (argc < (n)) { \ - fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ - return 1; \ - } \ - } STMT_END -#define BASE16(idx, var, n) STMT_BEGIN { \ - const char *s = argv[(idx)]; \ - if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ - fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ - return 1; \ - } \ - } STMT_END -#define INT(idx, var) STMT_BEGIN { \ - var = atoi(argv[(idx)]); \ - if (var <= 0) { \ - fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ - } \ - } STMT_END - -/** The first part of the HS ntor protocol. The client-side computes all - necessary key material and sends the appropriate message to the service. */ -static int -client1(int argc, char **argv) -{ - int retval; - - /* Inputs */ - curve25519_public_key_t intro_enc_pubkey; - ed25519_public_key_t intro_auth_pubkey; - curve25519_keypair_t client_ephemeral_enc_keypair; - uint8_t subcredential[DIGEST256_LEN]; - - /* Output */ - hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; - - char buf[256]; - - N_ARGS(6); - BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); - BASE16(3, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); - BASE16(4, client_ephemeral_enc_keypair.seckey.secret_key, - CURVE25519_SECKEY_LEN); - BASE16(5, subcredential, DIGEST256_LEN); - - /* Generate keypair */ - curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, - &client_ephemeral_enc_keypair.seckey); - - retval = hs_ntor_client_get_introduce1_keys(&intro_auth_pubkey, - &intro_enc_pubkey, - &client_ephemeral_enc_keypair, - subcredential, - &hs_ntor_intro_cell_keys); - if (retval < 0) { - goto done; - } - - /* Send ENC_KEY */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_intro_cell_keys.enc_key, - sizeof(hs_ntor_intro_cell_keys.enc_key)); - printf("%s\n", buf); - /* Send MAC_KEY */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_intro_cell_keys.mac_key, - sizeof(hs_ntor_intro_cell_keys.mac_key)); - printf("%s\n", buf); - - done: - return retval; -} - -/** The second part of the HS ntor protocol. The service-side computes all - necessary key material and sends the appropriate message to the client */ -static int -server1(int argc, char **argv) -{ - int retval; - - /* Inputs */ - curve25519_keypair_t intro_enc_keypair; - ed25519_public_key_t intro_auth_pubkey; - curve25519_public_key_t client_ephemeral_enc_pubkey; - uint8_t subcredential[DIGEST256_LEN]; - - /* Output */ - hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; - hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; - curve25519_keypair_t service_ephemeral_rend_keypair; - - char buf[256]; - - N_ARGS(6); - BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); - BASE16(3, intro_enc_keypair.seckey.secret_key, CURVE25519_SECKEY_LEN); - BASE16(4, client_ephemeral_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); - BASE16(5, subcredential, DIGEST256_LEN); - - /* Generate keypair */ - curve25519_public_key_generate(&intro_enc_keypair.pubkey, - &intro_enc_keypair.seckey); - curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); - - /* Get INTRODUCE1 keys */ - retval = hs_ntor_service_get_introduce1_keys(&intro_auth_pubkey, - &intro_enc_keypair, - &client_ephemeral_enc_pubkey, - subcredential, - &hs_ntor_intro_cell_keys); - if (retval < 0) { - goto done; - } - - /* Get RENDEZVOUS1 keys */ - retval = hs_ntor_service_get_rendezvous1_keys(&intro_auth_pubkey, - &intro_enc_keypair, - &service_ephemeral_rend_keypair, - &client_ephemeral_enc_pubkey, - &hs_ntor_rend_cell_keys); - if (retval < 0) { - goto done; - } - - /* Send ENC_KEY */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_intro_cell_keys.enc_key, - sizeof(hs_ntor_intro_cell_keys.enc_key)); - printf("%s\n", buf); - /* Send MAC_KEY */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_intro_cell_keys.mac_key, - sizeof(hs_ntor_intro_cell_keys.mac_key)); - printf("%s\n", buf); - /* Send AUTH_MAC */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, - sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); - printf("%s\n", buf); - /* Send NTOR_KEY_SEED */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, - sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); - printf("%s\n", buf); - /* Send service ephemeral pubkey (Y) */ - base16_encode(buf, sizeof(buf), - (const char*)service_ephemeral_rend_keypair.pubkey.public_key, - sizeof(service_ephemeral_rend_keypair.pubkey.public_key)); - printf("%s\n", buf); - - done: - return retval; -} - -/** The final step of the ntor protocol, the client computes and returns the - * rendezvous key material. */ -static int -client2(int argc, char **argv) -{ - int retval; - - /* Inputs */ - curve25519_public_key_t intro_enc_pubkey; - ed25519_public_key_t intro_auth_pubkey; - curve25519_keypair_t client_ephemeral_enc_keypair; - curve25519_public_key_t service_ephemeral_rend_pubkey; - uint8_t subcredential[DIGEST256_LEN]; - - /* Output */ - hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; - - char buf[256]; - - N_ARGS(7); - BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); - BASE16(3, client_ephemeral_enc_keypair.seckey.secret_key, - CURVE25519_SECKEY_LEN); - BASE16(4, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); - BASE16(5, service_ephemeral_rend_pubkey.public_key, CURVE25519_PUBKEY_LEN); - BASE16(6, subcredential, DIGEST256_LEN); - - /* Generate keypair */ - curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, - &client_ephemeral_enc_keypair.seckey); - - /* Get RENDEZVOUS1 keys */ - retval = hs_ntor_client_get_rendezvous1_keys(&intro_auth_pubkey, - &client_ephemeral_enc_keypair, - &intro_enc_pubkey, - &service_ephemeral_rend_pubkey, - &hs_ntor_rend_cell_keys); - if (retval < 0) { - goto done; - } - - /* Send AUTH_MAC */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, - sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); - printf("%s\n", buf); - /* Send NTOR_KEY_SEED */ - base16_encode(buf, sizeof(buf), - (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, - sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); - printf("%s\n", buf); - - done: - return 1; -} - -/** Perform a different part of the protocol depdning on the argv used. */ -int -main(int argc, char **argv) -{ - if (argc < 2) { - fprintf(stderr, "I need arguments. Read source for more info.\n"); - return 1; - } - - curve25519_init(); - if (!strcmp(argv[1], "client1")) { - return client1(argc, argv); - } else if (!strcmp(argv[1], "server1")) { - return server1(argc, argv); - } else if (!strcmp(argv[1], "client2")) { - return client2(argc, argv); - } else { - fprintf(stderr, "What's a %s?\n", argv[1]); - return 1; - } -} - diff --git a/src/tor/src/test/test_hs_service.c b/src/tor/src/test/test_hs_service.c deleted file mode 100644 index 3e3a7d8e0..000000000 --- a/src/tor/src/test/test_hs_service.c +++ /dev/null @@ -1,1620 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_hs_service.c - * \brief Test hidden service functionality. - */ - -#define CIRCUITBUILD_PRIVATE -#define CIRCUITLIST_PRIVATE -#define CONFIG_PRIVATE -#define CONNECTION_PRIVATE -#define CRYPTO_PRIVATE -#define HS_COMMON_PRIVATE -#define HS_SERVICE_PRIVATE -#define HS_INTROPOINT_PRIVATE -#define HS_CIRCUIT_PRIVATE -#define MAIN_PRIVATE -#define NETWORKSTATUS_PRIVATE -#define STATEFILE_PRIVATE -#define TOR_CHANNEL_INTERNAL_ -#define HS_CLIENT_PRIVATE - -#include "test.h" -#include "test_helpers.h" -#include "log_test_helpers.h" -#include "rend_test_helpers.h" -#include "hs_test_helpers.h" - -#include "or.h" -#include "config.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "crypto.h" -#include "dirvote.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "relay.h" - -#include "hs_common.h" -#include "hs_config.h" -#include "hs_ident.h" -#include "hs_intropoint.h" -#include "hs_ntor.h" -#include "hs_circuit.h" -#include "hs_service.h" -#include "hs_client.h" -#include "main.h" -#include "rendservice.h" -#include "statefile.h" -#include "shared_random_state.h" - -/* Trunnel */ -#include "hs/cell_establish_intro.h" - -static networkstatus_t mock_ns; - -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - return &mock_ns; -} - -static or_state_t *dummy_state = NULL; - -/* Mock function to get fake or state (used for rev counters) */ -static or_state_t * -get_or_state_replacement(void) -{ - return dummy_state; -} - -/* Mock function because we are not trying to test the close circuit that does - * an awful lot of checks on the circuit object. */ -static void -mock_circuit_mark_for_close(circuit_t *circ, int reason, int line, - const char *file) -{ - (void) circ; - (void) reason; - (void) line; - (void) file; - return; -} - -static int -mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, - crypt_path_t *cpath_layer, - const char *filename, int lineno) -{ - (void) stream_id; - (void) circ; - (void) relay_command; - (void) payload; - (void) payload_len; - (void) cpath_layer; - (void) filename; - (void) lineno; - return 0; -} - -/* Helper: from a set of options in conf, configure a service which will add - * it to the staging list of the HS subsytem. */ -static int -helper_config_service(const char *conf) -{ - int ret = 0; - or_options_t *options = NULL; - tt_assert(conf); - options = helper_parse_options(conf); - tt_assert(options); - ret = hs_config_service_all(options, 0); - done: - or_options_free(options); - return ret; -} - -/* Test: Ensure that setting up rendezvous circuits works correctly. */ -static void -test_e2e_rend_circuit_setup(void *arg) -{ - ed25519_public_key_t service_pk; - origin_circuit_t *or_circ; - int retval; - - /** In this test we create a v3 prop224 service-side rendezvous circuit. - * We simulate an HS ntor key exchange with a client, and check that - * the circuit was setup correctly and is ready to accept rendezvous data */ - - (void) arg; - - /* Now make dummy circuit */ - { - or_circ = origin_circuit_new(); - - or_circ->base_.purpose = CIRCUIT_PURPOSE_S_CONNECT_REND; - - or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - or_circ->build_state->is_internal = 1; - - /* prop224: Setup hs conn identifier on the stream */ - ed25519_secret_key_t sk; - tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0)); - tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk)); - - or_circ->hs_ident = hs_ident_circuit_new(&service_pk, - HS_IDENT_CIRCUIT_RENDEZVOUS); - - TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN; - } - - /* Check number of hops */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 0); - - /* Setup the circuit: do the ntor key exchange */ - { - uint8_t ntor_key_seed[DIGEST256_LEN] = {2}; - retval = hs_circuit_setup_e2e_rend_circ(or_circ, - ntor_key_seed, sizeof(ntor_key_seed), - 1); - tt_int_op(retval, OP_EQ, 0); - } - - /* See that a hop was added to the circuit's cpath */ - retval = cpath_get_n_hops(&or_circ->cpath); - tt_int_op(retval, OP_EQ, 1); - - /* Check the digest algo */ - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest), - OP_EQ, DIGEST_SHA3_256); - tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest), - OP_EQ, DIGEST_SHA3_256); - tt_assert(or_circ->cpath->f_crypto); - tt_assert(or_circ->cpath->b_crypto); - - /* Ensure that circ purpose was changed */ - tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED); - - done: - circuit_free_(TO_CIRCUIT(or_circ)); -} - -/* Helper: Return a newly allocated and initialized origin circuit with - * purpose and flags. A default HS identifier is set to an ed25519 - * authentication key for introduction point. */ -static origin_circuit_t * -helper_create_origin_circuit(int purpose, int flags) -{ - origin_circuit_t *circ = NULL; - - circ = origin_circuit_init(purpose, flags); - tor_assert(circ); - circ->cpath = tor_malloc_zero(sizeof(crypt_path_t)); - circ->cpath->magic = CRYPT_PATH_MAGIC; - circ->cpath->state = CPATH_STATE_OPEN; - circ->cpath->package_window = circuit_initial_package_window(); - circ->cpath->deliver_window = CIRCWINDOW_START; - circ->cpath->prev = circ->cpath; - /* Random nonce. */ - crypto_rand(circ->cpath->prev->rend_circ_nonce, DIGEST_LEN); - /* Create a default HS identifier. */ - circ->hs_ident = tor_malloc_zero(sizeof(hs_ident_circuit_t)); - - return circ; -} - -/* Helper: Return a newly allocated service object with the identity keypair - * sets and the current descriptor. Then register it to the global map. - * Caller should us hs_free_all() to free this service or remove it from the - * global map before freeing. */ -static hs_service_t * -helper_create_service(void) -{ - /* Set a service for this circuit. */ - hs_service_t *service = hs_service_new(get_options()); - tor_assert(service); - service->config.version = HS_VERSION_THREE; - ed25519_secret_key_generate(&service->keys.identity_sk, 0); - ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk); - service->desc_current = service_descriptor_new(); - tt_assert(service->desc_current); - /* Register service to global map. */ - int ret = register_service(get_hs_service_map(), service); - tt_int_op(ret, OP_EQ, 0); - - done: - return service; -} - -/* Helper: Return a newly allocated service intro point with two link - * specifiers, one IPv4 and one legacy ID set to As. */ -static hs_service_intro_point_t * -helper_create_service_ip(void) -{ - hs_desc_link_specifier_t *ls; - hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0); - tor_assert(ip); - /* Add a first unused link specifier. */ - ls = tor_malloc_zero(sizeof(*ls)); - ls->type = LS_IPV4; - smartlist_add(ip->base.link_specifiers, ls); - /* Add a second link specifier used by a test. */ - ls = tor_malloc_zero(sizeof(*ls)); - ls->type = LS_LEGACY_ID; - memset(ls->u.legacy_id, 'A', sizeof(ls->u.legacy_id)); - smartlist_add(ip->base.link_specifiers, ls); - - return ip; -} - -static void -test_load_keys(void *arg) -{ - int ret; - char *conf = NULL; - char *hsdir_v2 = tor_strdup(get_fname("hs2")); - char *hsdir_v3 = tor_strdup(get_fname("hs3")); - char addr[HS_SERVICE_ADDR_LEN_BASE32 + 1]; - - (void) arg; - - /* We'll register two services, a v2 and a v3, then we'll load keys and - * validate that both are in a correct state. */ - - hs_init(); - -#define conf_fmt \ - "HiddenServiceDir %s\n" \ - "HiddenServiceVersion %d\n" \ - "HiddenServicePort 65535\n" - - /* v2 service. */ - tor_asprintf(&conf, conf_fmt, hsdir_v2, HS_VERSION_TWO); - ret = helper_config_service(conf); - tor_free(conf); - tt_int_op(ret, OP_EQ, 0); - /* This one should now be registered into the v2 list. */ - tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 0); - tt_int_op(rend_num_services(), OP_EQ, 1); - - /* v3 service. */ - tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE); - ret = helper_config_service(conf); - tor_free(conf); - tt_int_op(ret, OP_EQ, 0); - /* It's in staging? */ - tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); - - /* Load the keys for these. After that, the v3 service should be registered - * in the global map. */ - hs_service_load_all_keys(); - tt_int_op(get_hs_service_map_size(), OP_EQ, 1); - hs_service_t *s = get_first_service(); - tt_assert(s); - - /* Ok we have the service object. Validate few things. */ - tt_assert(!tor_mem_is_zero(s->onion_address, sizeof(s->onion_address))); - tt_int_op(hs_address_is_valid(s->onion_address), OP_EQ, 1); - tt_assert(!tor_mem_is_zero((char *) s->keys.identity_sk.seckey, - ED25519_SECKEY_LEN)); - tt_assert(!tor_mem_is_zero((char *) s->keys.identity_pk.pubkey, - ED25519_PUBKEY_LEN)); - /* Check onion address from identity key. */ - hs_build_address(&s->keys.identity_pk, s->config.version, addr); - tt_int_op(hs_address_is_valid(addr), OP_EQ, 1); - tt_str_op(addr, OP_EQ, s->onion_address); - - done: - tor_free(hsdir_v2); - tor_free(hsdir_v3); - hs_free_all(); -} - -static void -test_access_service(void *arg) -{ - int ret; - char *conf = NULL; - char *hsdir_v3 = tor_strdup(get_fname("hs3")); - hs_service_ht *global_map; - hs_service_t *s = NULL; - - (void) arg; - - /* We'll register two services, a v2 and a v3, then we'll load keys and - * validate that both are in a correct state. */ - - hs_init(); - -#define conf_fmt \ - "HiddenServiceDir %s\n" \ - "HiddenServiceVersion %d\n" \ - "HiddenServicePort 65535\n" - - /* v3 service. */ - tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE); - ret = helper_config_service(conf); - tor_free(conf); - tt_int_op(ret, OP_EQ, 0); - /* It's in staging? */ - tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1); - - /* Load the keys for these. After that, the v3 service should be registered - * in the global map. */ - hs_service_load_all_keys(); - tt_int_op(get_hs_service_map_size(), OP_EQ, 1); - s = get_first_service(); - tt_assert(s); - global_map = get_hs_service_map(); - tt_assert(global_map); - - /* From here, we'll try the service accessors. */ - hs_service_t *query = find_service(global_map, &s->keys.identity_pk); - tt_assert(query); - tt_mem_op(query, OP_EQ, s, sizeof(hs_service_t)); - /* Remove service, check if it actually works and then put it back. */ - remove_service(global_map, s); - tt_int_op(get_hs_service_map_size(), OP_EQ, 0); - query = find_service(global_map, &s->keys.identity_pk); - tt_ptr_op(query, OP_EQ, NULL); - - /* Register back the service in the map. */ - ret = register_service(global_map, s); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(get_hs_service_map_size(), OP_EQ, 1); - /* Twice should fail. */ - ret = register_service(global_map, s); - tt_int_op(ret, OP_EQ, -1); - /* Remove service from map so we don't double free on cleanup. */ - remove_service(global_map, s); - tt_int_op(get_hs_service_map_size(), OP_EQ, 0); - query = find_service(global_map, &s->keys.identity_pk); - tt_ptr_op(query, OP_EQ, NULL); - /* Let's try to remove twice for fun. */ - setup_full_capture_of_logs(LOG_WARN); - remove_service(global_map, s); - expect_log_msg_containing("Could not find service in the global map"); - teardown_capture_of_logs(); - - done: - hs_service_free(s); - tor_free(hsdir_v3); - hs_free_all(); -} - -/** Test that we can create intro point objects, index them and find them */ -static void -test_service_intro_point(void *arg) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - - (void) arg; - - /* Test simple creation of an object. */ - { - time_t now = time(NULL); - ip = helper_create_service_ip(); - tt_assert(ip); - /* Make sure the authentication keypair is not zeroes. */ - tt_int_op(tor_mem_is_zero((const char *) &ip->auth_key_kp, - sizeof(ed25519_keypair_t)), OP_EQ, 0); - /* The introduce2_max MUST be in that range. */ - tt_u64_op(ip->introduce2_max, OP_GE, - INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS); - tt_u64_op(ip->introduce2_max, OP_LE, - INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS); - /* Time to expire MUST also be in that range. We add 5 seconds because - * there could be a gap between setting now and the time taken in - * service_intro_point_new. On ARM, it can be surprisingly slow... */ - tt_u64_op(ip->time_to_expire, OP_GE, - now + INTRO_POINT_LIFETIME_MIN_SECONDS + 5); - tt_u64_op(ip->time_to_expire, OP_LE, - now + INTRO_POINT_LIFETIME_MAX_SECONDS + 5); - tt_assert(ip->replay_cache); - tt_assert(ip->base.link_specifiers); - /* By default, this is NOT a legacy object. */ - tt_int_op(ip->base.is_only_legacy, OP_EQ, 0); - } - - /* Test functions that uses a service intropoints map with that previously - * created object (non legacy). */ - { - ed25519_public_key_t garbage = { {0} }; - hs_service_intro_point_t *query; - - service = hs_service_new(get_options()); - tt_assert(service); - service->desc_current = service_descriptor_new(); - tt_assert(service->desc_current); - /* Add intropoint to descriptor map. */ - service_intro_point_add(service->desc_current->intro_points.map, ip); - query = service_intro_point_find(service, &ip->auth_key_kp.pubkey); - tt_mem_op(query, OP_EQ, ip, sizeof(hs_service_intro_point_t)); - query = service_intro_point_find(service, &garbage); - tt_ptr_op(query, OP_EQ, NULL); - - /* While at it, can I find the descriptor with the intro point? */ - hs_service_descriptor_t *desc_lookup = - service_desc_find_by_intro(service, ip); - tt_mem_op(service->desc_current, OP_EQ, desc_lookup, - sizeof(hs_service_descriptor_t)); - - /* Remove object from service descriptor and make sure it is out. */ - service_intro_point_remove(service, ip); - query = service_intro_point_find(service, &ip->auth_key_kp.pubkey); - tt_ptr_op(query, OP_EQ, NULL); - } - - done: - /* If the test succeed, this object is no longer referenced in the service - * so we can free it without use after free. Else, it might explode because - * it's still in the service descriptor map. */ - service_intro_point_free(ip); - hs_service_free(service); -} - -static node_t mock_node; -static const node_t * -mock_node_get_by_id(const char *digest) -{ - (void) digest; - memset(mock_node.identity, 'A', DIGEST_LEN); - /* Only return the matchin identity of As */ - if (!tor_memcmp(mock_node.identity, digest, DIGEST_LEN)) { - return &mock_node; - } - return NULL; -} - -static void -test_helper_functions(void *arg) -{ - int ret; - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL; - hs_ident_circuit_t ident; - - (void) arg; - - MOCK(node_get_by_id, mock_node_get_by_id); - - hs_service_init(); - - service = helper_create_service(); - - ip = helper_create_service_ip(); - /* Immediately add the intro point to the service so the free service at the - * end cleans it as well. */ - service_intro_point_add(service->desc_current->intro_points.map, ip); - - /* Setup the circuit identifier. */ - ed25519_pubkey_copy(&ident.intro_auth_pk, &ip->auth_key_kp.pubkey); - ed25519_pubkey_copy(&ident.identity_pk, &service->keys.identity_pk); - - /* Testing get_objects_from_ident(). */ - { - hs_service_t *s_lookup = NULL; - hs_service_intro_point_t *ip_lookup = NULL; - hs_service_descriptor_t *desc_lookup = NULL; - - get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup); - tt_mem_op(s_lookup, OP_EQ, service, sizeof(hs_service_t)); - tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t)); - tt_mem_op(desc_lookup, OP_EQ, service->desc_current, - sizeof(hs_service_descriptor_t)); - /* Reset */ - s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL; - - /* NULL parameter should work. */ - get_objects_from_ident(&ident, NULL, &ip_lookup, &desc_lookup); - tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t)); - tt_mem_op(desc_lookup, OP_EQ, service->desc_current, - sizeof(hs_service_descriptor_t)); - /* Reset. */ - s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL; - - /* Break the ident and we should find nothing. */ - memset(&ident, 0, sizeof(ident)); - get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup); - tt_ptr_op(s_lookup, OP_EQ, NULL); - tt_ptr_op(ip_lookup, OP_EQ, NULL); - tt_ptr_op(desc_lookup, OP_EQ, NULL); - } - - /* Testing get_node_from_intro_point() */ - { - const node_t *node = get_node_from_intro_point(ip); - tt_ptr_op(node, OP_EQ, &mock_node); - SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers, - hs_desc_link_specifier_t *, ls) { - if (ls->type == LS_LEGACY_ID) { - /* Change legacy id in link specifier which is not the mock node. */ - memset(ls->u.legacy_id, 'B', sizeof(ls->u.legacy_id)); - } - } SMARTLIST_FOREACH_END(ls); - node = get_node_from_intro_point(ip); - tt_ptr_op(node, OP_EQ, NULL); - } - - /* Testing can_service_launch_intro_circuit() */ - { - time_t now = time(NULL); - /* Put the start of the retry period back in time, we should be allowed. - * to launch intro circuit. */ - service->state.num_intro_circ_launched = 2; - service->state.intro_circ_retry_started_time = - (now - INTRO_CIRC_RETRY_PERIOD - 1); - ret = can_service_launch_intro_circuit(service, now); - tt_int_op(ret, OP_EQ, 1); - tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now); - tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0); - /* Call it again, we should still be allowed because we are under - * MAX_INTRO_CIRCS_PER_PERIOD which been set to 0 previously. */ - ret = can_service_launch_intro_circuit(service, now); - tt_int_op(ret, OP_EQ, 1); - tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now); - tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0); - /* Too many intro circuit launched means we are not allowed. */ - service->state.num_intro_circ_launched = 20; - ret = can_service_launch_intro_circuit(service, now); - tt_int_op(ret, OP_EQ, 0); - } - - /* Testing intro_point_should_expire(). */ - { - time_t now = time(NULL); - /* Just some basic test of the current state. */ - tt_u64_op(ip->introduce2_max, OP_GE, - INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS); - tt_u64_op(ip->introduce2_max, OP_LE, - INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS); - tt_u64_op(ip->time_to_expire, OP_GE, - now + INTRO_POINT_LIFETIME_MIN_SECONDS); - tt_u64_op(ip->time_to_expire, OP_LE, - now + INTRO_POINT_LIFETIME_MAX_SECONDS); - - /* This newly created IP from above shouldn't expire now. */ - ret = intro_point_should_expire(ip, now); - tt_int_op(ret, OP_EQ, 0); - /* Maximum number of INTRODUCE2 cell reached, it should expire. */ - ip->introduce2_count = INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS + 1; - ret = intro_point_should_expire(ip, now); - tt_int_op(ret, OP_EQ, 1); - ip->introduce2_count = 0; - /* It should expire if time to expire has been reached. */ - ip->time_to_expire = now - 1000; - ret = intro_point_should_expire(ip, now); - tt_int_op(ret, OP_EQ, 1); - } - - done: - /* This will free the service and all objects associated to it. */ - hs_service_free_all(); - UNMOCK(node_get_by_id); -} - -/** Test that we do the right operations when an intro circuit opens */ -static void -test_intro_circuit_opened(void *arg) -{ - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - hs_service_t *service; - origin_circuit_t *circ = NULL; - - (void) arg; - - hs_init(); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); - - circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, - flags); - - /* No service associated with this circuit. */ - setup_full_capture_of_logs(LOG_WARN); - hs_service_circuit_has_opened(circ); - expect_log_msg_containing("Unknown service identity key"); - teardown_capture_of_logs(); - - /* Set a service for this circuit. */ - { - service = helper_create_service(); - ed25519_pubkey_copy(&circ->hs_ident->identity_pk, - &service->keys.identity_pk); - - /* No intro point associated with this circuit. */ - setup_full_capture_of_logs(LOG_WARN); - hs_service_circuit_has_opened(circ); - expect_log_msg_containing("Unknown introduction point auth key"); - teardown_capture_of_logs(); - } - - /* Set an IP object now for this circuit. */ - { - hs_service_intro_point_t *ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - /* Update ident to contain the intro point auth key. */ - ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, - &ip->auth_key_kp.pubkey); - } - - /* This one should go all the way. */ - setup_full_capture_of_logs(LOG_INFO); - hs_service_circuit_has_opened(circ); - expect_log_msg_containing("Introduction circuit 0 established for service"); - teardown_capture_of_logs(); - - done: - circuit_free_(TO_CIRCUIT(circ)); - hs_free_all(); - UNMOCK(circuit_mark_for_close_); - UNMOCK(relay_send_command_from_edge_); -} - -/** Test the operations we do on a circuit after we learn that we successfuly - * established an intro point on it */ -static void -test_intro_established(void *arg) -{ - int ret; - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; - origin_circuit_t *circ = NULL; - hs_service_t *service; - hs_service_intro_point_t *ip = NULL; - - (void) arg; - - hs_init(); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - - circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, - flags); - tt_assert(circ); - - /* Test a wrong purpose. */ - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO; - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Received an INTRO_ESTABLISHED cell on a " - "non introduction circuit of purpose"); - teardown_capture_of_logs(); - - /* Back to normal. */ - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; - - /* No service associated to it. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Unknown service identity key"); - teardown_capture_of_logs(); - - /* Set a service for this circuit. */ - service = helper_create_service(); - ed25519_pubkey_copy(&circ->hs_ident->identity_pk, - &service->keys.identity_pk); - /* No introduction point associated to it. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Introduction circuit established without an " - "intro point object on circuit"); - teardown_capture_of_logs(); - - /* Set an IP object now for this circuit. */ - { - ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - /* Update ident to contain the intro point auth key. */ - ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, - &ip->auth_key_kp.pubkey); - } - - /* Send an empty payload. INTRO_ESTABLISHED cells are basically zeroes. */ - ret = hs_service_receive_intro_established(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, 0); - tt_u64_op(ip->circuit_established, OP_EQ, 1); - tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_INTRO); - - done: - if (circ) - circuit_free_(TO_CIRCUIT(circ)); - hs_free_all(); - UNMOCK(circuit_mark_for_close_); -} - -/** Check the operations we do on a rendezvous circuit after we learn it's - * open */ -static void -test_rdv_circuit_opened(void *arg) -{ - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - origin_circuit_t *circ = NULL; - hs_service_t *service; - - (void) arg; - - hs_init(); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge); - - circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_CONNECT_REND, flags); - crypto_rand((char *) circ->hs_ident->rendezvous_cookie, REND_COOKIE_LEN); - crypto_rand((char *) circ->hs_ident->rendezvous_handshake_info, - sizeof(circ->hs_ident->rendezvous_handshake_info)); - - /* No service associated with this circuit. */ - setup_full_capture_of_logs(LOG_WARN); - hs_service_circuit_has_opened(circ); - expect_log_msg_containing("Unknown service identity key"); - teardown_capture_of_logs(); - /* This should be set to a non zero timestamp. */ - tt_u64_op(TO_CIRCUIT(circ)->timestamp_dirty, OP_NE, 0); - - /* Set a service for this circuit. */ - service = helper_create_service(); - ed25519_pubkey_copy(&circ->hs_ident->identity_pk, - &service->keys.identity_pk); - /* Should be all good. */ - hs_service_circuit_has_opened(circ); - tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED); - - done: - circuit_free_(TO_CIRCUIT(circ)); - hs_free_all(); - UNMOCK(circuit_mark_for_close_); - UNMOCK(relay_send_command_from_edge_); -} - -static void -mock_assert_circuit_ok(const circuit_t *c) -{ - (void) c; - return; -} - -/** Test for the general mechanism for closing intro circs. - * Also a way to identify that #23603 has been fixed. */ -static void -test_closing_intro_circs(void *arg) -{ - hs_service_t *service = NULL; - hs_service_intro_point_t *ip = NULL, *entry = NULL; - origin_circuit_t *intro_circ = NULL, *tmp_circ; - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - - (void) arg; - - MOCK(assert_circuit_ok, mock_assert_circuit_ok); - - hs_init(); - - /* Initialize service */ - service = helper_create_service(); - /* Initialize intro point */ - ip = helper_create_service_ip(); - tt_assert(ip); - service_intro_point_add(service->desc_current->intro_points.map, ip); - - /* Initialize intro circuit */ - intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, flags); - intro_circ->hs_ident = hs_ident_circuit_new(&service->keys.identity_pk, - HS_IDENT_CIRCUIT_INTRO); - /* Register circuit in the circuitmap . */ - hs_circuitmap_register_intro_circ_v3_service_side(intro_circ, - &ip->auth_key_kp.pubkey); - tmp_circ = - hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); - tt_ptr_op(tmp_circ, OP_EQ, intro_circ); - - /* Pretend that intro point has failed too much */ - ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES+1; - - /* Now pretend we are freeing this intro circuit. We want to see that our - * destructor is not gonna kill our intro point structure since that's the - * job of the cleanup routine. */ - circuit_free_(TO_CIRCUIT(intro_circ)); - intro_circ = NULL; - entry = service_intro_point_find(service, &ip->auth_key_kp.pubkey); - tt_assert(entry); - /* The free should also remove the circuit from the circuitmap. */ - tmp_circ = - hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); - tt_assert(!tmp_circ); - - /* Now pretend that a new intro point circ was launched and opened. Check - * that the intro point will be established correctly. */ - intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, flags); - intro_circ->hs_ident = hs_ident_circuit_new(&service->keys.identity_pk, - HS_IDENT_CIRCUIT_INTRO); - ed25519_pubkey_copy(&intro_circ->hs_ident->intro_auth_pk, - &ip->auth_key_kp.pubkey); - /* Register circuit in the circuitmap . */ - hs_circuitmap_register_intro_circ_v3_service_side(intro_circ, - &ip->auth_key_kp.pubkey); - tmp_circ = - hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); - tt_ptr_op(tmp_circ, OP_EQ, intro_circ); - tt_int_op(TO_CIRCUIT(intro_circ)->marked_for_close, OP_EQ, 0); - circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_INTERNAL); - tt_int_op(TO_CIRCUIT(intro_circ)->marked_for_close, OP_NE, 0); - /* At this point, we should not be able to find it in the circuitmap. */ - tmp_circ = - hs_circuitmap_get_intro_circ_v3_service_side(&ip->auth_key_kp.pubkey); - tt_assert(!tmp_circ); - - done: - if (intro_circ) { - circuit_free_(TO_CIRCUIT(intro_circ)); - } - /* Frees the service object. */ - hs_free_all(); - UNMOCK(assert_circuit_ok); -} - -/** Test sending and receiving introduce2 cells */ -static void -test_introduce2(void *arg) -{ - int ret; - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - uint8_t payload[RELAY_PAYLOAD_SIZE] = {0}; - origin_circuit_t *circ = NULL; - hs_service_t *service; - hs_service_intro_point_t *ip = NULL; - - (void) arg; - - hs_init(); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - MOCK(get_or_state, - get_or_state_replacement); - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - - circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags); - tt_assert(circ); - - /* Test a wrong purpose. */ - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Received an INTRODUCE2 cell on a " - "non introduction circuit of purpose"); - teardown_capture_of_logs(); - - /* Back to normal. */ - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO; - - /* No service associated to it. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Unknown service identity key"); - teardown_capture_of_logs(); - - /* Set a service for this circuit. */ - service = helper_create_service(); - ed25519_pubkey_copy(&circ->hs_ident->identity_pk, - &service->keys.identity_pk); - /* No introduction point associated to it. */ - setup_full_capture_of_logs(LOG_WARN); - ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg_containing("Unknown introduction auth key when handling " - "an INTRODUCE2 cell on circuit"); - teardown_capture_of_logs(); - - /* Set an IP object now for this circuit. */ - { - ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - /* Update ident to contain the intro point auth key. */ - ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, - &ip->auth_key_kp.pubkey); - } - - /* This will fail because receiving an INTRODUCE2 cell implies a valid cell - * and then launching circuits so let's not do that and instead test that - * behaviour differently. */ - ret = hs_service_receive_introduce2(circ, payload, sizeof(payload)); - tt_int_op(ret, OP_EQ, -1); - tt_u64_op(ip->introduce2_count, OP_EQ, 0); - - done: - or_state_free(dummy_state); - dummy_state = NULL; - if (circ) - circuit_free_(TO_CIRCUIT(circ)); - hs_free_all(); - UNMOCK(circuit_mark_for_close_); -} - -/** Test basic hidden service housekeeping operations (maintaining intro - * points, etc) */ -static void -test_service_event(void *arg) -{ - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - time_t now = time(NULL); - hs_service_t *service; - origin_circuit_t *circ = NULL; - - (void) arg; - - hs_init(); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - - circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags); - - /* Set a service for this circuit. */ - service = helper_create_service(); - ed25519_pubkey_copy(&circ->hs_ident->identity_pk, - &service->keys.identity_pk); - - /* Currently this consists of cleaning invalid intro points. So adding IPs - * here that should get cleaned up. */ - { - hs_service_intro_point_t *ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - /* This run will remove the IP because we have no circuits nor node_t - * associated with it. */ - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 0); - /* We'll trigger a removal because we've reached our maximum amount of - * times we should retry a circuit. For this, we need to have a node_t - * that matches the identity of this IP. */ - routerinfo_t ri; - memset(&ri, 0, sizeof(ri)); - ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN); - /* This triggers a node_t creation. */ - tt_assert(nodelist_set_routerinfo(&ri, NULL)); - ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1; - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 0); - /* No removal but no circuit so this means the IP object will stay in the - * descriptor map so we can retry it. */ - ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - ip->circuit_established = 1; /* We'll test that, it MUST be 0 after. */ - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 1); - /* Remove the IP object at once for the next test. */ - ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1; - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 0); - /* Now, we'll create an IP with a registered circuit. The IP object - * shouldn't go away. */ - ip = helper_create_service_ip(); - service_intro_point_add(service->desc_current->intro_points.map, ip); - ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk, - &ip->auth_key_kp.pubkey); - hs_circuitmap_register_intro_circ_v3_service_side( - circ, &ip->auth_key_kp.pubkey); - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 1); - /* We'll mangle the IP object to expire. */ - ip->time_to_expire = now; - run_housekeeping_event(now); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 0); - } - - done: - hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); - circuit_free_(TO_CIRCUIT(circ)); - hs_free_all(); - UNMOCK(circuit_mark_for_close_); -} - -/** Test that we rotate descriptors correctly. */ -static void -test_rotate_descriptors(void *arg) -{ - int ret; - time_t next_rotation_time, now = time(NULL); - hs_service_t *service; - hs_service_descriptor_t *desc_next; - - (void) arg; - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - - hs_init(); - MOCK(get_or_state, get_or_state_replacement); - MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close); - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - /* Descriptor rotation happens with a consensus with a new SRV. */ - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), mock_ns.valid_after); - - /* Create a service with a default descriptor and state. It's added to the - * global map. */ - service = helper_create_service(); - service_descriptor_free(service->desc_current); - service->desc_current = NULL; - /* This triggers a build for both descriptors. The time now is only used in - * the descriptor certificate which is important to be now else the decoding - * will complain that the cert has expired if we use valid_after. */ - build_all_descriptors(now); - tt_assert(service->desc_current); - tt_assert(service->desc_next); - - /* Tweak our service next rotation time so we can use a custom time. */ - service->state.next_rotation_time = next_rotation_time = - mock_ns.valid_after + (11 * 60 * 60); - - /* Nothing should happen, we are not at a new SRV. Our next rotation time - * should be untouched. */ - rotate_all_descriptors(mock_ns.valid_after); - tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); - tt_assert(service->desc_current); - tt_assert(service->desc_next); - tt_u64_op(service->desc_current->time_period_num, OP_EQ, - hs_get_previous_time_period_num(0)); - tt_u64_op(service->desc_next->time_period_num, OP_EQ, - hs_get_time_period_num(0)); - /* Keep a reference so we can compare it after rotation to the current. */ - desc_next = service->desc_next; - - /* Going right after a new SRV. */ - ret = parse_rfc1123_time("Sat, 27 Oct 1985 01:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 27 Oct 1985 02:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), mock_ns.valid_after); - - /* Note down what to expect for the next rotation time which is 01:00 + 23h - * meaning 00:00:00. */ - next_rotation_time = mock_ns.valid_after + (23 * 60 * 60); - /* We should have our next rotation time modified, our current descriptor - * cleaned up and the next descriptor becoming the current. */ - rotate_all_descriptors(mock_ns.valid_after); - tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); - tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); - tt_assert(service->desc_next == NULL); - - /* A second time should do nothing. */ - rotate_all_descriptors(mock_ns.valid_after); - tt_u64_op(service->state.next_rotation_time, OP_EQ, next_rotation_time); - tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); - tt_assert(service->desc_next == NULL); - - build_all_descriptors(now); - tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next)); - tt_u64_op(service->desc_current->time_period_num, OP_EQ, - hs_get_time_period_num(0)); - tt_u64_op(service->desc_next->time_period_num, OP_EQ, - hs_get_next_time_period_num(0)); - tt_assert(service->desc_next); - - done: - hs_free_all(); - UNMOCK(get_or_state); - UNMOCK(circuit_mark_for_close_); - UNMOCK(networkstatus_get_live_consensus); -} - -/** Test building descriptors: picking intro points, setting up their link - * specifiers, etc. */ -static void -test_build_update_descriptors(void *arg) -{ - int ret; - time_t now = time(NULL); - node_t *node; - hs_service_t *service; - hs_service_intro_point_t *ip_cur, *ip_next; - routerinfo_t ri; - - (void) arg; - - hs_init(); - - MOCK(get_or_state, - get_or_state_replacement); - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 03:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 04:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), mock_ns.valid_after); - - /* Create a service without a current descriptor to trigger a build. */ - service = helper_create_service(); - tt_assert(service); - /* Unfortunately, the helper creates a dummy descriptor so get rid of it. */ - service_descriptor_free(service->desc_current); - service->desc_current = NULL; - - /* We have a fresh service so this should trigger a build for both - * descriptors for specific time period that we'll test. */ - build_all_descriptors(now); - /* Check *current* descriptor. */ - tt_assert(service->desc_current); - tt_assert(service->desc_current->desc); - tt_assert(service->desc_current->intro_points.map); - /* The current time period is the one expected when starting at 03:00. */ - tt_u64_op(service->desc_current->time_period_num, OP_EQ, - hs_get_time_period_num(0)); - /* This should be untouched, the update descriptor process changes it. */ - tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); - - /* Check *next* descriptor. */ - tt_assert(service->desc_next); - tt_assert(service->desc_next->desc); - tt_assert(service->desc_next->intro_points.map); - tt_assert(service->desc_current != service->desc_next); - tt_u64_op(service->desc_next->time_period_num, OP_EQ, - hs_get_next_time_period_num(0)); - /* This should be untouched, the update descriptor process changes it. */ - tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); - - /* Time to test the update of those descriptors. At first, we have no node - * in the routerlist so this will find NO suitable node for the IPs. */ - setup_full_capture_of_logs(LOG_INFO); - update_all_descriptors(now); - expect_log_msg_containing("Unable to find a suitable node to be an " - "introduction point for service"); - teardown_capture_of_logs(); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 0); - tt_int_op(digest256map_size(service->desc_next->intro_points.map), - OP_EQ, 0); - - /* Now, we'll setup a node_t. */ - { - tor_addr_t ipv4_addr; - curve25519_secret_key_t curve25519_secret_key; - - memset(&ri, 0, sizeof(routerinfo_t)); - - tor_addr_parse(&ipv4_addr, "127.0.0.1"); - ri.addr = tor_addr_to_ipv4h(&ipv4_addr); - ri.or_port = 1337; - ri.purpose = ROUTER_PURPOSE_GENERAL; - /* Ugly yes but we never free the "ri" object so this just makes things - * easier. */ - ri.protocol_list = (char *) "HSDir=1-2 LinkAuth=3"; - ret = curve25519_secret_key_generate(&curve25519_secret_key, 0); - tt_int_op(ret, OP_EQ, 0); - ri.onion_curve25519_pkey = - tor_malloc_zero(sizeof(curve25519_public_key_t)); - ri.onion_pkey = crypto_pk_new(); - curve25519_public_key_generate(ri.onion_curve25519_pkey, - &curve25519_secret_key); - memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN); - /* Setup ed25519 identity */ - ed25519_keypair_t kp1; - ed25519_keypair_generate(&kp1, 0); - ri.cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); - tt_assert(ri.cache_info.signing_key_cert); - ed25519_pubkey_copy(&ri.cache_info.signing_key_cert->signing_key, - &kp1.pubkey); - nodelist_set_routerinfo(&ri, NULL); - node = node_get_mutable_by_id(ri.cache_info.identity_digest); - tt_assert(node); - node->is_running = node->is_valid = node->is_fast = node->is_stable = 1; - } - - /* We expect to pick only one intro point from the node above. */ - setup_full_capture_of_logs(LOG_INFO); - update_all_descriptors(now); - tor_free(node->ri->onion_curve25519_pkey); /* Avoid memleak. */ - tor_free(node->ri->cache_info.signing_key_cert); - crypto_pk_free(node->ri->onion_pkey); - expect_log_msg_containing("just picked 1 intro points and wanted 3 for next " - "descriptor. It currently has 0 intro points. " - "Launching ESTABLISH_INTRO circuit shortly."); - teardown_capture_of_logs(); - tt_int_op(digest256map_size(service->desc_current->intro_points.map), - OP_EQ, 1); - tt_int_op(digest256map_size(service->desc_next->intro_points.map), - OP_EQ, 1); - /* Get the IP object. Because we don't have the auth key of the IP, we can't - * query it so get the first element in the map. */ - { - void *obj = NULL; - const uint8_t *key; - digest256map_iter_t *iter = - digest256map_iter_init(service->desc_current->intro_points.map); - digest256map_iter_get(iter, &key, &obj); - tt_assert(obj); - ip_cur = obj; - /* Get also the IP from the next descriptor. We'll make sure it's not the - * same object as in the current descriptor. */ - iter = digest256map_iter_init(service->desc_next->intro_points.map); - digest256map_iter_get(iter, &key, &obj); - tt_assert(obj); - ip_next = obj; - } - tt_mem_op(ip_cur, OP_NE, ip_next, sizeof(hs_desc_intro_point_t)); - - /* We won't test the service IP object because there is a specific test - * already for this but we'll make sure that the state is coherent.*/ - - /* Three link specifiers are mandatoy so make sure we do have them. */ - tt_int_op(smartlist_len(ip_cur->base.link_specifiers), OP_EQ, 3); - /* Make sure we have a valid encryption keypair generated when we pick an - * intro point in the update process. */ - tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.seckey.secret_key, - CURVE25519_SECKEY_LEN)); - tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.pubkey.public_key, - CURVE25519_PUBKEY_LEN)); - tt_u64_op(ip_cur->time_to_expire, OP_GE, now + - INTRO_POINT_LIFETIME_MIN_SECONDS); - tt_u64_op(ip_cur->time_to_expire, OP_LE, now + - INTRO_POINT_LIFETIME_MAX_SECONDS); - - /* Now, we will try to set up a service after a new time period has started - * and see if it behaves as expected. */ - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - - /* Create a service without a current descriptor to trigger a build. */ - service = helper_create_service(); - tt_assert(service); - /* Unfortunately, the helper creates a dummy descriptor so get rid of it. */ - service_descriptor_free(service->desc_current); - service->desc_current = NULL; - - /* We have a fresh service so this should trigger a build for both - * descriptors for specific time period that we'll test. */ - build_all_descriptors(now); - /* Check *current* descriptor. */ - tt_assert(service->desc_current); - tt_assert(service->desc_current->desc); - tt_assert(service->desc_current->intro_points.map); - /* This should be for the previous time period. */ - tt_u64_op(service->desc_current->time_period_num, OP_EQ, - hs_get_previous_time_period_num(0)); - /* This should be untouched, the update descriptor process changes it. */ - tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); - - /* Check *next* descriptor. */ - tt_assert(service->desc_next); - tt_assert(service->desc_next->desc); - tt_assert(service->desc_next->intro_points.map); - tt_assert(service->desc_current != service->desc_next); - tt_u64_op(service->desc_next->time_period_num, OP_EQ, - hs_get_time_period_num(0)); - /* This should be untouched, the update descriptor process changes it. */ - tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); - - /* Let's remove the next descriptor to simulate a rotation. */ - service_descriptor_free(service->desc_next); - service->desc_next = NULL; - - build_all_descriptors(now); - /* Check *next* descriptor. */ - tt_assert(service->desc_next); - tt_assert(service->desc_next->desc); - tt_assert(service->desc_next->intro_points.map); - tt_assert(service->desc_current != service->desc_next); - tt_u64_op(service->desc_next->time_period_num, OP_EQ, - hs_get_next_time_period_num(0)); - /* This should be untouched, the update descriptor process changes it. */ - tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0); - - done: - hs_free_all(); - nodelist_free_all(); -} - -static void -test_upload_descriptors(void *arg) -{ - int ret; - time_t now = time(NULL); - hs_service_t *service; - - (void) arg; - - hs_init(); - MOCK(get_or_state, - get_or_state_replacement); - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - - ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC", - &mock_ns.valid_after); - tt_int_op(ret, OP_EQ, 0); - ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC", - &mock_ns.fresh_until); - tt_int_op(ret, OP_EQ, 0); - - /* Create a service with no descriptor. It's added to the global map. */ - service = hs_service_new(get_options()); - tt_assert(service); - service->config.version = HS_VERSION_THREE; - ed25519_secret_key_generate(&service->keys.identity_sk, 0); - ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk); - /* Register service to global map. */ - ret = register_service(get_hs_service_map(), service); - tt_int_op(ret, OP_EQ, 0); - /* But first, build our descriptor. */ - build_all_descriptors(now); - - /* Nothing should happen because we have 0 introduction circuit established - * and we want (by default) 3 intro points. */ - run_upload_descriptor_event(now); - /* If no upload happened, this should be untouched. */ - tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0); - /* We'll simulate that we've opened our intro point circuit and that we only - * want one intro point. */ - service->config.num_intro_points = 1; - - /* Set our next upload time after now which will skip the upload. */ - service->desc_current->next_upload_time = now + 1000; - run_upload_descriptor_event(now); - /* If no upload happened, this should be untouched. */ - tt_u64_op(service->desc_current->next_upload_time, OP_EQ, now + 1000); - - done: - hs_free_all(); - UNMOCK(get_or_state); -} - -/** Test the functions that save and load HS revision counters to state. */ -static void -test_revision_counter_state(void *arg) -{ - char *state_line_one = NULL; - char *state_line_two = NULL; - - hs_service_descriptor_t *desc_one = service_descriptor_new(); - hs_service_descriptor_t *desc_two = service_descriptor_new(); - - (void) arg; - - /* Prepare both descriptors */ - desc_one->desc->plaintext_data.revision_counter = 42; - desc_two->desc->plaintext_data.revision_counter = 240; - memset(&desc_one->blinded_kp.pubkey.pubkey, 66, - sizeof(desc_one->blinded_kp.pubkey.pubkey)); - memset(&desc_two->blinded_kp.pubkey.pubkey, 240, - sizeof(desc_one->blinded_kp.pubkey.pubkey)); - - /* Turn the descriptor rev counters into state lines */ - state_line_one = encode_desc_rev_counter_for_state(desc_one); - tt_str_op(state_line_one, OP_EQ, - "QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI 42"); - - state_line_two = encode_desc_rev_counter_for_state(desc_two); - tt_str_op(state_line_two, OP_EQ, - "8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PA 240"); - - /* Now let's test our state parsing function: */ - int service_found; - uint64_t cached_rev_counter; - - /* First's try with wrong pubkey and check that no service was found */ - cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one, - &desc_two->blinded_kp.pubkey, - &service_found); - tt_int_op(service_found, OP_EQ, 0); - tt_u64_op(cached_rev_counter, OP_EQ, 0); - - /* Now let's try with the right pubkeys */ - cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one, - &desc_one->blinded_kp.pubkey, - &service_found); - tt_int_op(service_found, OP_EQ, 1); - tt_u64_op(cached_rev_counter, OP_EQ, 42); - - cached_rev_counter =check_state_line_for_service_rev_counter(state_line_two, - &desc_two->blinded_kp.pubkey, - &service_found); - tt_int_op(service_found, OP_EQ, 1); - tt_u64_op(cached_rev_counter, OP_EQ, 240); - - done: - tor_free(state_line_one); - tor_free(state_line_two); - service_descriptor_free(desc_one); - service_descriptor_free(desc_two); -} - -/** Global vars used by test_rendezvous1_parsing() */ -static char rend1_payload[RELAY_PAYLOAD_SIZE]; -static size_t rend1_payload_len = 0; - -/** Mock for relay_send_command_from_edge() to send a RENDEZVOUS1 cell. Instead - * of sending it to the network, instead save it to the global `rend1_payload` - * variable so that we can inspect it in the test_rendezvous1_parsing() - * test. */ -static int -mock_relay_send_rendezvous1(streamid_t stream_id, circuit_t *circ, - uint8_t relay_command, const char *payload, - size_t payload_len, - crypt_path_t *cpath_layer, - const char *filename, int lineno) -{ - (void) stream_id; - (void) circ; - (void) relay_command; - (void) cpath_layer; - (void) filename; - (void) lineno; - - memcpy(rend1_payload, payload, payload_len); - rend1_payload_len = payload_len; - - return 0; -} - -/** Send a RENDEZVOUS1 as a service, and parse it as a client. */ -static void -test_rendezvous1_parsing(void *arg) -{ - int retval; - static const char *test_addr = - "4acth47i6kxnvkewtm6q7ib2s3ufpo5sqbsnzjpbi7utijcltosqemad.onion"; - hs_service_t *service = NULL; - origin_circuit_t *service_circ = NULL; - origin_circuit_t *client_circ = NULL; - ed25519_keypair_t ip_auth_kp; - curve25519_keypair_t ephemeral_kp; - curve25519_keypair_t client_kp; - curve25519_keypair_t ip_enc_kp; - int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL; - - (void) arg; - - MOCK(relay_send_command_from_edge_, mock_relay_send_rendezvous1); - - { - /* Let's start by setting up the service that will start the rend */ - service = tor_malloc_zero(sizeof(hs_service_t)); - ed25519_secret_key_generate(&service->keys.identity_sk, 0); - ed25519_public_key_generate(&service->keys.identity_pk, - &service->keys.identity_sk); - memcpy(service->onion_address, test_addr, sizeof(service->onion_address)); - tt_assert(service); - } - - { - /* Now let's set up the service rendezvous circuit and its keys. */ - service_circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_CONNECT_REND, - flags); - tor_free(service_circ->hs_ident); - hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; - uint8_t rendezvous_cookie[HS_REND_COOKIE_LEN]; - curve25519_keypair_generate(&ip_enc_kp, 0); - curve25519_keypair_generate(&ephemeral_kp, 0); - curve25519_keypair_generate(&client_kp, 0); - ed25519_keypair_generate(&ip_auth_kp, 0); - retval = hs_ntor_service_get_rendezvous1_keys(&ip_auth_kp.pubkey, - &ip_enc_kp, - &ephemeral_kp, - &client_kp.pubkey, - &hs_ntor_rend_cell_keys); - tt_int_op(retval, OP_EQ, 0); - - memset(rendezvous_cookie, 2, sizeof(rendezvous_cookie)); - service_circ->hs_ident = - create_rp_circuit_identifier(service, rendezvous_cookie, - &ephemeral_kp.pubkey, - &hs_ntor_rend_cell_keys); - } - - /* Send out the RENDEZVOUS1 and make sure that our mock func worked */ - tt_assert(tor_mem_is_zero(rend1_payload, 32)); - hs_circ_service_rp_has_opened(service, service_circ); - tt_assert(!tor_mem_is_zero(rend1_payload, 32)); - tt_int_op(rend1_payload_len, OP_EQ, HS_LEGACY_RENDEZVOUS_CELL_SIZE); - - /******************************/ - - /** Now let's create the client rendezvous circuit */ - client_circ = - helper_create_origin_circuit(CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED, - flags); - /* fix up its circ ident */ - ed25519_pubkey_copy(&client_circ->hs_ident->intro_auth_pk, - &ip_auth_kp.pubkey); - memcpy(&client_circ->hs_ident->rendezvous_client_kp, - &client_kp, sizeof(client_circ->hs_ident->rendezvous_client_kp)); - memcpy(&client_circ->hs_ident->intro_enc_pk.public_key, - &ip_enc_kp.pubkey.public_key, - sizeof(client_circ->hs_ident->intro_enc_pk.public_key)); - - /* Now parse the rendezvous2 circuit and make sure it was fine. We are - * skipping 20 bytes off its payload, since that's the rendezvous cookie - * which is only present in REND1. */ - retval = handle_rendezvous2(client_circ, - (uint8_t*)rend1_payload+20, - rend1_payload_len-20); - tt_int_op(retval, OP_EQ, 0); - - /* TODO: We are only simulating client/service here. We could also simulate - * the rendezvous point by plugging in rend_mid_establish_rendezvous(). We - * would need an extra circuit and some more stuff but it's doable. */ - - done: - circuit_free_(TO_CIRCUIT(service_circ)); - circuit_free_(TO_CIRCUIT(client_circ)); - hs_service_free(service); - hs_free_all(); - UNMOCK(relay_send_command_from_edge_); -} - -struct testcase_t hs_service_tests[] = { - { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup, TT_FORK, - NULL, NULL }, - { "load_keys", test_load_keys, TT_FORK, - NULL, NULL }, - { "access_service", test_access_service, TT_FORK, - NULL, NULL }, - { "service_intro_point", test_service_intro_point, TT_FORK, - NULL, NULL }, - { "helper_functions", test_helper_functions, TT_FORK, - NULL, NULL }, - { "intro_circuit_opened", test_intro_circuit_opened, TT_FORK, - NULL, NULL }, - { "intro_established", test_intro_established, TT_FORK, - NULL, NULL }, - { "closing_intro_circs", test_closing_intro_circs, TT_FORK, - NULL, NULL }, - { "rdv_circuit_opened", test_rdv_circuit_opened, TT_FORK, - NULL, NULL }, - { "introduce2", test_introduce2, TT_FORK, - NULL, NULL }, - { "service_event", test_service_event, TT_FORK, - NULL, NULL }, - { "rotate_descriptors", test_rotate_descriptors, TT_FORK, - NULL, NULL }, - { "build_update_descriptors", test_build_update_descriptors, TT_FORK, - NULL, NULL }, - { "upload_descriptors", test_upload_descriptors, TT_FORK, - NULL, NULL }, - { "revision_counter_state", test_revision_counter_state, TT_FORK, - NULL, NULL }, - { "rendezvous1_parsing", test_rendezvous1_parsing, TT_FORK, - NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_introduce.c b/src/tor/src/test/test_introduce.c deleted file mode 100644 index d502bdddb..000000000 --- a/src/tor/src/test/test_introduce.c +++ /dev/null @@ -1,538 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "crypto.h" -#include "or.h" -#include "test.h" - -#define RENDSERVICE_PRIVATE -#include "rendservice.h" - -static uint8_t v0_test_plaintext[] = - /* 20 bytes of rendezvous point nickname */ - { 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - /* 20 bytes dummy rendezvous cookie */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 128 bytes dummy DH handshake data */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; - -static uint8_t v1_test_plaintext[] = - /* Version byte */ - { 0x01, - /* 42 bytes of dummy rendezvous point hex digest */ - 0x24, 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, - 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, - 0x37, 0x30, 0x38, 0x30, 0x39, 0x30, 0x41, 0x30, - 0x42, 0x30, 0x43, 0x30, 0x44, 0x30, 0x45, 0x30, - 0x46, 0x31, 0x30, 0x31, 0x31, 0x31, 0x32, 0x31, - 0x33, 0x00, - /* 20 bytes dummy rendezvous cookie */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 128 bytes dummy DH handshake data */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; - -static uint8_t v2_test_plaintext[] = - /* Version byte */ - { 0x02, - /* 4 bytes rendezvous point's IP address */ - 0xc0, 0xa8, 0x00, 0x01, - /* 2 bytes rendezvous point's OR port */ - 0x23, 0x5a, - /* 20 bytes dummy rendezvous point's identity digest */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 2 bytes length of onion key */ - 0x00, 0x8c, - /* Onion key (140 bytes taken from live test) */ - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, - 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, - 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, - 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, - 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, - 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, - 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, - 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, - 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, - 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, - 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, - 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, - 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, - 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, - 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, - 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, - 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, - 0x03, 0x01, 0x00, 0x01, - /* 20 bytes dummy rendezvous cookie */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 128 bytes dummy DH handshake data */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; - -static uint8_t v3_no_auth_test_plaintext[] = - /* Version byte */ - { 0x03, - /* Auth type (0 for no auth len/auth data) */ - 0x00, - /* Timestamp */ - 0x50, 0x0b, 0xb5, 0xaa, - /* 4 bytes rendezvous point's IP address */ - 0xc0, 0xa8, 0x00, 0x01, - /* 2 bytes rendezvous point's OR port */ - 0x23, 0x5a, - /* 20 bytes dummy rendezvous point's identity digest */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 2 bytes length of onion key */ - 0x00, 0x8c, - /* Onion key (140 bytes taken from live test) */ - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, - 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, - 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, - 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, - 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, - 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, - 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, - 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, - 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, - 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, - 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, - 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, - 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, - 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, - 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, - 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, - 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, - 0x03, 0x01, 0x00, 0x01, - /* 20 bytes dummy rendezvous cookie */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 128 bytes dummy DH handshake data */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; - -static uint8_t v3_basic_auth_test_plaintext[] = - /* Version byte */ - { 0x03, - /* Auth type (1 for REND_BASIC_AUTH) */ - 0x01, - /* Auth len (must be 16 bytes for REND_BASIC_AUTH) */ - 0x00, 0x10, - /* Auth data (a 16-byte dummy descriptor cookie) */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - /* Timestamp */ - 0x50, 0x0b, 0xb5, 0xaa, - /* 4 bytes rendezvous point's IP address */ - 0xc0, 0xa8, 0x00, 0x01, - /* 2 bytes rendezvous point's OR port */ - 0x23, 0x5a, - /* 20 bytes dummy rendezvous point's identity digest */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 2 bytes length of onion key */ - 0x00, 0x8c, - /* Onion key (140 bytes taken from live test) */ - 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xb1, - 0xcd, 0x46, 0xa9, 0x18, 0xd2, 0x0f, 0x01, 0xf8, - 0xb2, 0xad, 0xa4, 0x79, 0xb4, 0xbb, 0x4b, 0xf4, - 0x54, 0x1e, 0x3f, 0x03, 0x54, 0xcf, 0x7c, 0xb6, - 0xb5, 0xf0, 0xfe, 0xed, 0x4b, 0x7d, 0xd7, 0x61, - 0xdb, 0x6d, 0xd9, 0x19, 0xe2, 0x72, 0x04, 0xaa, - 0x3e, 0x89, 0x26, 0x14, 0x62, 0x9a, 0x6c, 0x11, - 0x0b, 0x35, 0x99, 0x2c, 0x9f, 0x2c, 0x64, 0xa1, - 0xd9, 0xe2, 0x88, 0xce, 0xf6, 0x54, 0xfe, 0x1d, - 0x37, 0x5e, 0x6d, 0x73, 0x95, 0x54, 0x90, 0xf0, - 0x7b, 0xfa, 0xd4, 0x44, 0xac, 0xb2, 0x23, 0x9f, - 0x75, 0x36, 0xe2, 0x78, 0x62, 0x82, 0x80, 0xa4, - 0x23, 0x22, 0xc9, 0xbf, 0xc4, 0x36, 0xd1, 0x31, - 0x33, 0x8e, 0x64, 0xb4, 0xa9, 0x74, 0xa1, 0xcb, - 0x42, 0x8d, 0x60, 0xc7, 0xbb, 0x8e, 0x6e, 0x0f, - 0x36, 0x74, 0x8e, 0xf4, 0x08, 0x99, 0x06, 0x92, - 0xb1, 0x3f, 0xb3, 0xdd, 0xed, 0xf7, 0xc9, 0x02, - 0x03, 0x01, 0x00, 0x01, - /* 20 bytes dummy rendezvous cookie */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, - /* 128 bytes dummy DH handshake data */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, - 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; - -static void do_decrypt_test(uint8_t *plaintext, size_t plaintext_len); -static void do_early_parse_test(uint8_t *plaintext, size_t plaintext_len); -static void do_late_parse_test(uint8_t *plaintext, size_t plaintext_len); -static void do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase); -static ssize_t make_intro_from_plaintext( - void *buf, size_t len, crypto_pk_t *key, void **cell_out); - -#define EARLY_PARSE_ONLY 1 -#define DECRYPT_ONLY 2 -#define ALL_PARSING 3 - -static void -do_early_parse_test(uint8_t *plaintext, size_t plaintext_len) -{ - do_parse_test(plaintext, plaintext_len, EARLY_PARSE_ONLY); -} - -static void -do_decrypt_test(uint8_t *plaintext, size_t plaintext_len) -{ - do_parse_test(plaintext, plaintext_len, DECRYPT_ONLY); -} - -static void -do_late_parse_test(uint8_t *plaintext, size_t plaintext_len) -{ - do_parse_test(plaintext, plaintext_len, ALL_PARSING); -} - -/** Test utility function: checks that the plaintext_len-byte string at - * plaintext is at least superficially parseable. - */ -static void -do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase) -{ - crypto_pk_t *k = NULL; - ssize_t r; - uint8_t *cell = NULL; - size_t cell_len; - rend_intro_cell_t *parsed_req = NULL; - char *err_msg = NULL; - char digest[DIGEST_LEN]; - - /* Get a key */ - k = crypto_pk_new(); - tt_assert(k); - r = crypto_pk_read_private_key_from_string(k, AUTHORITY_SIGNKEY_1, -1); - tt_assert(!r); - - /* Get digest for future comparison */ - r = crypto_pk_get_digest(k, digest); - tt_assert(r >= 0); - - /* Make a cell out of it */ - r = make_intro_from_plaintext( - plaintext, plaintext_len, - k, (void **)(&cell)); - tt_assert(r > 0); - tt_assert(cell); - cell_len = r; - - /* Do early parsing */ - parsed_req = rend_service_begin_parse_intro(cell, cell_len, 2, &err_msg); - tt_assert(parsed_req); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_mem_op(parsed_req->pk,OP_EQ, digest, DIGEST_LEN); - tt_assert(parsed_req->ciphertext); - tt_assert(parsed_req->ciphertext_len > 0); - - if (phase == EARLY_PARSE_ONLY) - goto done; - - /* Do decryption */ - r = rend_service_decrypt_intro(parsed_req, k, &err_msg); - tt_assert(!r); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_assert(parsed_req->plaintext); - tt_assert(parsed_req->plaintext_len > 0); - - if (phase == DECRYPT_ONLY) - goto done; - - /* Do late parsing */ - r = rend_service_parse_intro_plaintext(parsed_req, &err_msg); - tt_assert(!r); - tt_ptr_op(err_msg, OP_EQ, NULL); - tt_assert(parsed_req->parsed); - - done: - tor_free(cell); - crypto_pk_free(k); - rend_service_free_intro(parsed_req); - tor_free(err_msg); -} - -/** Given the plaintext of the encrypted part of an INTRODUCE1/2 and a key, - * construct the encrypted cell for testing. - */ - -static ssize_t -make_intro_from_plaintext( - void *buf, size_t len, crypto_pk_t *key, void **cell_out) -{ - char *cell = NULL; - ssize_t cell_len = -1, r; - /* Assemble key digest and ciphertext, then construct the cell */ - ssize_t ciphertext_size; - - if (!(buf && key && len > 0 && cell_out)) goto done; - - /* - * Figure out an upper bound on how big the ciphertext will be - * (see crypto_pk_obsolete_public_hybrid_encrypt()) - */ - ciphertext_size = PKCS1_OAEP_PADDING_OVERHEAD; - ciphertext_size += crypto_pk_keysize(key); - ciphertext_size += CIPHER_KEY_LEN; - ciphertext_size += len; - - /* - * Allocate space for the cell - */ - cell = tor_malloc(DIGEST_LEN + ciphertext_size); - - /* Compute key digest (will be first DIGEST_LEN octets of cell) */ - r = crypto_pk_get_digest(key, cell); - tt_assert(r >= 0); - - /* Do encryption */ - r = crypto_pk_obsolete_public_hybrid_encrypt( - key, cell + DIGEST_LEN, ciphertext_size, - buf, len, - PK_PKCS1_OAEP_PADDING, 0); - tt_assert(r >= 0); - - /* Figure out cell length */ - cell_len = DIGEST_LEN + r; - - /* Output the cell */ - *cell_out = cell; - - done: - return cell_len; -} - -/** Test v0 INTRODUCE2 parsing through decryption only - */ - -static void -test_introduce_decrypt_v0(void *arg) -{ - (void)arg; - do_decrypt_test(v0_test_plaintext, sizeof(v0_test_plaintext)); -} - -/** Test v1 INTRODUCE2 parsing through decryption only - */ - -static void -test_introduce_decrypt_v1(void *arg) -{ - (void)arg; - do_decrypt_test(v1_test_plaintext, sizeof(v1_test_plaintext)); -} - -/** Test v2 INTRODUCE2 parsing through decryption only - */ - -static void -test_introduce_decrypt_v2(void *arg) -{ - (void)arg; - do_decrypt_test(v2_test_plaintext, sizeof(v2_test_plaintext)); -} - -/** Test v3 INTRODUCE2 parsing through decryption only - */ - -static void -test_introduce_decrypt_v3(void *arg) -{ - (void)arg; - do_decrypt_test( - v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); - do_decrypt_test( - v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); -} - -/** Test v0 INTRODUCE2 parsing through early parsing only - */ - -static void -test_introduce_early_parse_v0(void *arg) -{ - (void)arg; - do_early_parse_test(v0_test_plaintext, sizeof(v0_test_plaintext)); -} - -/** Test v1 INTRODUCE2 parsing through early parsing only - */ - -static void -test_introduce_early_parse_v1(void *arg) -{ - (void)arg; - do_early_parse_test(v1_test_plaintext, sizeof(v1_test_plaintext)); -} - -/** Test v2 INTRODUCE2 parsing through early parsing only - */ - -static void -test_introduce_early_parse_v2(void *arg) -{ - (void)arg; - do_early_parse_test(v2_test_plaintext, sizeof(v2_test_plaintext)); -} - -/** Test v3 INTRODUCE2 parsing through early parsing only - */ - -static void -test_introduce_early_parse_v3(void *arg) -{ - (void)arg; - do_early_parse_test( - v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); - do_early_parse_test( - v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); -} - -/** Test v0 INTRODUCE2 parsing - */ - -static void -test_introduce_late_parse_v0(void *arg) -{ - (void)arg; - do_late_parse_test(v0_test_plaintext, sizeof(v0_test_plaintext)); -} - -/** Test v1 INTRODUCE2 parsing - */ - -static void -test_introduce_late_parse_v1(void *arg) -{ - (void)arg; - do_late_parse_test(v1_test_plaintext, sizeof(v1_test_plaintext)); -} - -/** Test v2 INTRODUCE2 parsing - */ - -static void -test_introduce_late_parse_v2(void *arg) -{ - (void)arg; - do_late_parse_test(v2_test_plaintext, sizeof(v2_test_plaintext)); -} - -/** Test v3 INTRODUCE2 parsing - */ - -static void -test_introduce_late_parse_v3(void *arg) -{ - (void)arg; - do_late_parse_test( - v3_no_auth_test_plaintext, sizeof(v3_no_auth_test_plaintext)); - do_late_parse_test( - v3_basic_auth_test_plaintext, sizeof(v3_basic_auth_test_plaintext)); -} - -#define INTRODUCE_LEGACY(name) \ - { #name, test_introduce_ ## name , 0, NULL, NULL } - -struct testcase_t introduce_tests[] = { - INTRODUCE_LEGACY(early_parse_v0), - INTRODUCE_LEGACY(early_parse_v1), - INTRODUCE_LEGACY(early_parse_v2), - INTRODUCE_LEGACY(early_parse_v3), - INTRODUCE_LEGACY(decrypt_v0), - INTRODUCE_LEGACY(decrypt_v1), - INTRODUCE_LEGACY(decrypt_v2), - INTRODUCE_LEGACY(decrypt_v3), - INTRODUCE_LEGACY(late_parse_v0), - INTRODUCE_LEGACY(late_parse_v1), - INTRODUCE_LEGACY(late_parse_v2), - INTRODUCE_LEGACY(late_parse_v3), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_key_expiration.sh b/src/tor/src/test/test_key_expiration.sh deleted file mode 100644 index 5511dbf18..000000000 --- a/src/tor/src/test/test_key_expiration.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh - -# Note: some of this code is lifted from zero_length_keys.sh and -# test_keygen.sh, and could be unified. - -umask 077 -set -e - -if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then - if [ "$TESTING_TOR_BINARY" = "" ] ; then - echo "Usage: ${0} PATH_TO_TOR [case-number]" - exit 1 - fi -fi - -if [ $# -ge 1 ]; then - TOR_BINARY="${1}" - shift -else - TOR_BINARY="${TESTING_TOR_BINARY}" -fi - -if [ $# -ge 1 ]; then - dflt=0 -else - dflt=1 -fi - -CASE1=$dflt -CASE2=$dflt -CASE3=$dflt - -if [ $# -ge 1 ]; then - eval "CASE${1}"=1 -fi - - -dump() { xxd -p "$1" | tr -d '\n '; } -die() { echo "$1" >&2 ; exit 5; } -check_dir() { [ -d "$1" ] || die "$1 did not exist"; } -check_file() { [ -e "$1" ] || die "$1 did not exist"; } -check_no_file() { [ -e "$1" ] && die "$1 was not supposed to exist" || true; } -check_files_eq() { cmp "$1" "$2" || die "$1 and $2 did not match: `dump $1` vs `dump $2`"; } -check_keys_eq() { check_files_eq "${SRC}/keys/${1}" "${ME}/keys/${1}"; } - -DATA_DIR=`mktemp -d -t tor_key_expiration_tests.XXXXXX` -if [ -z "$DATA_DIR" ]; then - echo "Failure: mktemp invocation returned empty string" >&2 - exit 3 -fi -if [ ! -d "$DATA_DIR" ]; then - echo "Failure: mktemp invocation result doesn't point to directory" >&2 - exit 3 -fi -trap "rm -rf '$DATA_DIR'" 0 - -# Use an absolute path for this or Tor will complain -DATA_DIR=`cd "${DATA_DIR}" && pwd` - -touch "${DATA_DIR}/empty_torrc" - -QUIETLY="--hush" -SILENTLY="--quiet" -TOR="${TOR_BINARY} --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f ${DATA_DIR}/empty_torrc --DataDirectory ${DATA_DIR}" - -##### SETUP -# -# Here we create a set of keys. - -# Step 1: Start Tor with --list-fingerprint --quiet. Make sure everything is there. -echo "Setup step #1" -${TOR} --list-fingerprint ${SILENTLY} > /dev/null - -check_dir "${DATA_DIR}/keys" -check_file "${DATA_DIR}/keys/ed25519_master_id_public_key" -check_file "${DATA_DIR}/keys/ed25519_master_id_secret_key" -check_file "${DATA_DIR}/keys/ed25519_signing_cert" -check_file "${DATA_DIR}/keys/ed25519_signing_secret_key" -check_file "${DATA_DIR}/keys/secret_id_key" -check_file "${DATA_DIR}/keys/secret_onion_key" -check_file "${DATA_DIR}/keys/secret_onion_key_ntor" - -##### TEST CASES - -echo "=== Starting key expiration tests." - -FN="${DATA_DIR}/stderr" - -if [ "$CASE1" = 1 ]; then - echo "==== Case 1: Test --key-expiration without argument and ensure usage" - echo " instructions are printed." - - ${TOR} ${QUIETLY} --key-expiration 2>"$FN" || true - grep "No valid argument to --key-expiration found!" "$FN" >/dev/null || \ - die "Tor didn't mention supported --key-expiration argmuents" - - echo "==== Case 1: ok" -fi - -if [ "$CASE2" = 1 ]; then - echo "==== Case 2: Start Tor with --key-expiration 'sign' and make sure it prints an expiration." - - ${TOR} ${QUIETLY} --key-expiration sign 2>"$FN" - grep "signing-cert-expiry:" "$FN" >/dev/null || \ - die "Tor didn't print an expiration" - - echo "==== Case 2: ok" -fi - -if [ "$CASE3" = 1 ]; then - echo "==== Case 3: Start Tor with --key-expiration 'sign', when there is no" - echo " signing key, and make sure that Tor generates a new key" - echo " and prints its certificate's expiration." - - mv "${DATA_DIR}/keys/ed25519_signing_cert" \ - "${DATA_DIR}/keys/ed25519_signing_cert.bak" - - ${TOR} --key-expiration sign > "$FN" 2>&1 - grep "It looks like I need to generate and sign a new medium-term signing key" "$FN" >/dev/null || \ - die "Tor didn't create a new signing key" - check_file "${DATA_DIR}/keys/ed25519_signing_cert" - grep "signing-cert-expiry:" "$FN" >/dev/null || \ - die "Tor didn't print an expiration" - - mv "${DATA_DIR}/keys/ed25519_signing_cert.bak" \ - "${DATA_DIR}/keys/ed25519_signing_cert" - - echo "==== Case 3: ok" -fi diff --git a/src/tor/src/test/test_keygen.sh b/src/tor/src/test/test_keygen.sh deleted file mode 100644 index b3d4d8e39..000000000 --- a/src/tor/src/test/test_keygen.sh +++ /dev/null @@ -1,477 +0,0 @@ -#!/bin/sh - -# Note: some of this code is lifted from zero_length_keys.sh, and could be -# unified. - -umask 077 -set -e - -if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then - if [ "$TESTING_TOR_BINARY" = "" ] ; then - echo "Usage: ${0} PATH_TO_TOR [case-number]" - exit 1 - fi -fi - -if [ $# -ge 1 ]; then - TOR_BINARY="${1}" - shift -else - TOR_BINARY="${TESTING_TOR_BINARY}" -fi - - - - if [ $# -ge 1 ]; then - dflt=0 - else - dflt=1 - fi - - CASE2A=$dflt - CASE2B=$dflt - CASE3A=$dflt - CASE3B=$dflt - CASE3C=$dflt - CASE4=$dflt - CASE5=$dflt - CASE6=$dflt - CASE7=$dflt - CASE8=$dflt - CASE9=$dflt - CASE10=$dflt - CASE11A=$dflt - CASE11B=$dflt - CASE11C=$dflt - CASE11D=$dflt - CASE11E=$dflt - CASE11F=$dflt - - if [ $# -ge 1 ]; then - eval "CASE${1}"=1 - fi - - -dump() { xxd -p "$1" | tr -d '\n '; } -die() { echo "$1" >&2 ; exit 5; } -check_dir() { [ -d "$1" ] || die "$1 did not exist"; } -check_file() { [ -e "$1" ] || die "$1 did not exist"; } -check_no_file() { [ -e "$1" ] && die "$1 was not supposed to exist" || true; } -check_files_eq() { cmp "$1" "$2" || die "$1 and $2 did not match: `dump $1` vs `dump $2`"; } -check_keys_eq() { check_files_eq "${SRC}/keys/${1}" "${ME}/keys/${1}"; } - -DATA_DIR=`mktemp -d -t tor_keygen_tests.XXXXXX` -if [ -z "$DATA_DIR" ]; then - echo "Failure: mktemp invocation returned empty string" >&2 - exit 3 -fi -if [ ! -d "$DATA_DIR" ]; then - echo "Failure: mktemp invocation result doesn't point to directory" >&2 - exit 3 -fi -trap "rm -rf '$DATA_DIR'" 0 - -# Use an absolute path for this or Tor will complain -DATA_DIR=`cd "${DATA_DIR}" && pwd` - -touch "${DATA_DIR}/empty_torrc" - -QUIETLY="--hush" -SILENTLY="--quiet" -TOR="${TOR_BINARY} ${QUIETLY} --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f ${DATA_DIR}/empty_torrc" - -##### SETUP -# -# Here we create three sets of keys: one using "tor", one using "tor -# --keygen", and one using "tor --keygen" and encryption. We'll be -# copying them into different keys directories in order to simulate -# different kinds of configuration problems/issues. - -# Step 1: Start Tor with --list-fingerprint --quiet. Make sure everything is there. -mkdir "${DATA_DIR}/orig" -${TOR} --DataDirectory "${DATA_DIR}/orig" --list-fingerprint ${SILENTLY} > /dev/null - -check_dir "${DATA_DIR}/orig/keys" -check_file "${DATA_DIR}/orig/keys/ed25519_master_id_public_key" -check_file "${DATA_DIR}/orig/keys/ed25519_master_id_secret_key" -check_file "${DATA_DIR}/orig/keys/ed25519_signing_cert" -check_file "${DATA_DIR}/orig/keys/ed25519_signing_secret_key" - -# Step 2: Start Tor with --keygen. Make sure everything is there. -mkdir "${DATA_DIR}/keygen" -${TOR} --DataDirectory "${DATA_DIR}/keygen" --keygen --no-passphrase 2>"${DATA_DIR}/keygen/stderr" -grep "Not encrypting the secret key" "${DATA_DIR}/keygen/stderr" >/dev/null || die "Tor didn't declare that there would be no encryption" - -check_dir "${DATA_DIR}/keygen/keys" -check_file "${DATA_DIR}/keygen/keys/ed25519_master_id_public_key" -check_file "${DATA_DIR}/keygen/keys/ed25519_master_id_secret_key" -check_file "${DATA_DIR}/keygen/keys/ed25519_signing_cert" -check_file "${DATA_DIR}/keygen/keys/ed25519_signing_secret_key" - -# Step 3: Start Tor with --keygen and a passphrase. -# Make sure everything is there. -mkdir "${DATA_DIR}/encrypted" -echo "passphrase" | ${TOR} --DataDirectory "${DATA_DIR}/encrypted" --keygen --passphrase-fd 0 - -check_dir "${DATA_DIR}/encrypted/keys" -check_file "${DATA_DIR}/encrypted/keys/ed25519_master_id_public_key" -check_file "${DATA_DIR}/encrypted/keys/ed25519_master_id_secret_key_encrypted" -check_file "${DATA_DIR}/encrypted/keys/ed25519_signing_cert" -check_file "${DATA_DIR}/encrypted/keys/ed25519_signing_secret_key" - - -echo "=== Starting keygen tests." - -# -# The "case X" numbers below come from s7r's email on -# https://lists.torproject.org/pipermail/tor-dev/2015-August/009204.html - - -# Case 2a: Missing secret key, public key exists, start tor. - -if [ "$CASE2A" = 1 ]; then - -ME="${DATA_DIR}/case2a" -SRC="${DATA_DIR}/orig" -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && die "Somehow succeeded when missing secret key, certs: `cat ${ME}/stdout`" || true -check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" - -grep "We needed to load a secret key.*but couldn't find it" "${ME}/stdout" >/dev/null || die "Tor didn't declare that it was missing a secret key" - -echo "==== Case 2A ok" -fi - -# Case 2b: Encrypted secret key, public key exists, start tor. - -if [ "$CASE2B" = 1 ]; then - -ME="${DATA_DIR}/case2b" -SRC="${DATA_DIR}/encrypted" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" -cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && dir "Somehow succeeded with encrypted secret key, missing certs" - -check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" -check_files_eq "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/ed25519_master_id_secret_key_encrypted" - -grep "We needed to load a secret key.*but it was encrypted.*--keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that it was missing a secret key and suggest --keygen." - -echo "==== Case 2B ok" - -fi - -# Case 3a: Start Tor with only master key. - -if [ "$CASE3A" = 1 ]; then - -ME="${DATA_DIR}/case3a" -SRC="${DATA_DIR}/orig" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Tor failed when starting with only master key" -check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" -check_files_eq "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/ed25519_master_id_secret_key" -check_file "${ME}/keys/ed25519_signing_cert" -check_file "${ME}/keys/ed25519_signing_secret_key" - -echo "==== Case 3A ok" - -fi - -# Case 3b: Call keygen with only unencrypted master key. - -if [ "$CASE3B" = 1 ]; then - -ME="${DATA_DIR}/case3b" -SRC="${DATA_DIR}/orig" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --keygen || die "Keygen failed with only master key" -check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" -check_files_eq "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/ed25519_master_id_secret_key" -check_file "${ME}/keys/ed25519_signing_cert" -check_file "${ME}/keys/ed25519_signing_secret_key" - -echo "==== Case 3B ok" - -fi - -# Case 3c: Call keygen with only encrypted master key. - -if [ "$CASE3C" = 1 ]; then - -ME="${DATA_DIR}/case3c" -SRC="${DATA_DIR}/encrypted" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_"* "${ME}/keys/" -echo "passphrase" | ${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd 0 || die "Keygen failed with only encrypted master key" -check_files_eq "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/ed25519_master_id_public_key" -check_files_eq "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/ed25519_master_id_secret_key_encrypted" -check_file "${ME}/keys/ed25519_signing_cert" -check_file "${ME}/keys/ed25519_signing_secret_key" - -echo "==== Case 3C ok" - -fi - -# Case 4: Make a new data directory with only an unencrypted secret key. -# Then start tor. The rest should become correct. - -if [ "$CASE4" = 1 ]; then - -ME="${DATA_DIR}/case4" -SRC="${DATA_DIR}/orig" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} > "${ME}/fp1" || die "Tor wouldn't start with only unencrypted secret key" -check_file "${ME}/keys/ed25519_master_id_public_key" -check_file "${ME}/keys/ed25519_signing_cert" -check_file "${ME}/keys/ed25519_signing_secret_key" -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} > "${ME}/fp2" || die "Tor wouldn't start again after starting once with only unencrypted secret key." - -check_files_eq "${ME}/fp1" "${ME}/fp2" - -echo "==== Case 4 ok" - -fi - -# Case 5: Make a new data directory with only an encrypted secret key. - -if [ "$CASE5" = 1 ]; then - -ME="${DATA_DIR}/case5" -SRC="${DATA_DIR}/encrypted" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint >"${ME}/stdout" && die "Tor started with only encrypted secret key!" -check_no_file "${ME}/keys/ed25519_master_id_public_key" -check_no_file "${ME}/keys/ed25519_master_id_public_key" - -grep "but not public key file" "${ME}/stdout" >/dev/null || die "Tor didn't declare it couldn't find a public key." - -echo "==== Case 5 ok" - -fi - -# Case 6: Make a new data directory with encrypted secret key and public key - -if [ "$CASE6" = 1 ]; then - -ME="${DATA_DIR}/case6" -SRC="${DATA_DIR}/encrypted" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_secret_key_encrypted" "${ME}/keys/" -cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" -${TOR} --DataDirectory "${ME}" --list-fingerprint > "${ME}/stdout" && die "Tor started with encrypted secret key and no certs" || true -check_no_file "${ME}/keys/ed25519_signing_cert" -check_no_file "${ME}/keys/ed25519_signing_secret_key" - -grep "but it was encrypted" "${ME}/stdout" >/dev/null || die "Tor didn't declare that the secret key was encrypted." - -echo "==== Case 6 ok" - -fi - -# Case 7: Make a new data directory with unencrypted secret key and -# certificates; missing master public. - -if [ "$CASE7" = 1 ]; then - -ME="${DATA_DIR}/case7" -SRC="${DATA_DIR}/keygen" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_secret_key" "${ME}/keys/" -cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" -cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" - -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with missing public key" -check_keys_eq ed25519_master_id_secret_key -check_keys_eq ed25519_master_id_public_key -check_keys_eq ed25519_signing_secret_key -check_keys_eq ed25519_signing_cert - -echo "==== Case 7 ok" - -fi - -# Case 8: offline master secret key. - -if [ "$CASE8" = 1 ]; then - -ME="${DATA_DIR}/case8" -SRC="${DATA_DIR}/keygen" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" -cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" -cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" - -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with offline secret key" -check_no_file "${ME}/keys/ed25519_master_id_secret_key" -check_keys_eq ed25519_master_id_public_key -check_keys_eq ed25519_signing_secret_key -check_keys_eq ed25519_signing_cert - -echo "==== Case 8 ok" - -fi - -# Case 9: signing cert and secret key provided; could infer master key. - -if [ "$CASE9" = 1 ]; then - -ME="${DATA_DIR}/case9" -SRC="${DATA_DIR}/keygen" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_signing_cert" "${ME}/keys/" -cp "${SRC}/keys/ed25519_signing_secret_key" "${ME}/keys/" - -${TOR} --DataDirectory "${ME}" --list-fingerprint ${SILENTLY} >/dev/null || die "Failed when starting with only signing material" -check_no_file "${ME}/keys/ed25519_master_id_secret_key" -check_file "${ME}/keys/ed25519_master_id_public_key" -check_keys_eq ed25519_signing_secret_key -check_keys_eq ed25519_signing_cert - -echo "==== Case 9 ok" - -fi - - -# Case 10: master key mismatch. - -if [ "$CASE10" = 1 ]; then - -ME="${DATA_DIR}/case10" -SRC="${DATA_DIR}/keygen" -OTHER="${DATA_DIR}/orig" - -mkdir -p "${ME}/keys" -cp "${SRC}/keys/ed25519_master_id_public_key" "${ME}/keys/" -cp "${OTHER}/keys/ed25519_master_id_secret_key" "${ME}/keys/" - -${TOR} --DataDirectory "${ME}" --list-fingerprint >"${ME}/stdout" && die "Successfully started with mismatched keys!?" || true - -grep "public_key does not match.*secret_key" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a key mismatch" - -echo "==== Case 10 ok" - -fi - -# Case 11a: -passphrase-fd without --keygen - -if [ "$CASE11A" = 1 ]; then - -ME="${DATA_DIR}/case11a" - -mkdir -p "${ME}/keys" - -${TOR} --DataDirectory "${ME}" --passphrase-fd 1 > "${ME}/stdout" && die "Successfully started with passphrase-fd but no keygen?" || true - -grep "passphrase-fd specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - -echo "==== Case 11A ok" - -fi - -# Case 11b: --no-passphrase without --keygen - -if [ "$CASE11B" = 1 ]; then - -ME="${DATA_DIR}/case11b" - -mkdir -p "${ME}/keys" - -${TOR} --DataDirectory "${ME}" --no-passphrase > "${ME}/stdout" && die "Successfully started with no-passphrase but no keygen?" || true - -grep "no-passphrase specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - -echo "==== Case 11B ok" - -fi - -# Case 11c: --newpass without --keygen - -if [ "$CASE11C" = 1 ]; then - -ME="${DATA_DIR}/case11C" - -mkdir -p "${ME}/keys" - -${TOR} --DataDirectory "${ME}" --newpass > "${ME}/stdout" && die "Successfully started with newpass but no keygen?" || true - -grep "newpass specified without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - -echo "==== Case 11C ok" - -fi - -######## --master-key does not work yet, but this will test the error case -######## when it does. -# -# Case 11d: --master-key without --keygen -# -if [ "$CASE11D" = 1 ]; then -# -# ME="${DATA_DIR}/case11d" -# -# mkdir -p "${ME}/keys" -# -# ${TOR} --DataDirectory "${ME}" --master-key "${ME}/foobar" > "${ME}/stdout" && die "Successfully started with master-key but no keygen?" || true -# -# cat "${ME}/stdout" -# -# grep "master-key without --keygen" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - - echo "==== Case 11D skipped" - -fi - - -# Case 11E: Silly passphrase-fd - -if [ "$CASE11E" = 1 ]; then - -ME="${DATA_DIR}/case11E" - -mkdir -p "${ME}/keys" - -${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd ewigeblumenkraft > "${ME}/stdout" && die "Successfully started with bogus passphrase-fd?" || true - -grep "Invalid --passphrase-fd value" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - -echo "==== Case 11E ok" - -fi - - -# Case 11F: --no-passphrase with --passphrase-fd - -if [ "$CASE11F" = 1 ]; then - -ME="${DATA_DIR}/case11F" - -mkdir -p "${ME}/keys" - -${TOR} --DataDirectory "${ME}" --keygen --passphrase-fd 1 --no-passphrase > "${ME}/stdout" && die "Successfully started with bogus passphrase-fd combination?" || true - -grep "no-passphrase specified with --passphrase-fd" "${ME}/stdout" >/dev/null || die "Tor didn't declare that there was a problem with the arguments." - -echo "==== Case 11F ok" - -fi - - -# Check cert-only. - diff --git a/src/tor/src/test/test_keypin.c b/src/tor/src/test/test_keypin.c deleted file mode 100644 index 79d7bac90..000000000 --- a/src/tor/src/test/test_keypin.c +++ /dev/null @@ -1,257 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define KEYPIN_PRIVATE -#include "or.h" -#include "keypin.h" -#include "util.h" - -#include "test.h" - -static void -test_keypin_parse_line(void *arg) -{ - (void)arg; - keypin_ent_t *ent = NULL; - - /* Good line */ - ent = keypin_parse_journal_line( - "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " - "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); - tt_assert(ent); - tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32); - tor_free(ent); ent = NULL; - - /* Good line with extra stuff we will ignore. */ - ent = keypin_parse_journal_line( - "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " - "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4helloworld"); - tt_assert(ent); - tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32); - tor_free(ent); ent = NULL; - - /* Bad line: no space in the middle. */ - ent = keypin_parse_journal_line( - "aGVyZSBpcyBhIGdvb2Qgc2hhMSE?" - "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); - tt_ptr_op(ent, OP_EQ, NULL); - - /* Bad line: bad base64 in RSA ID */ - ent = keypin_parse_journal_line( - "aGVyZSBpcyBhIGdv!2Qgc2hhMSE " - "VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4"); - tt_ptr_op(ent, OP_EQ, NULL); - - /* Bad line: bad base64 in Ed25519 */ - ent = keypin_parse_journal_line( - "aGVyZSBpcyBhIGdvb2Qgc2hhMSE " - "VGhpcyBlZDI1NTE5IHNjb2ZmcyB!dCB0aGUgc2hhMS4"); - tt_ptr_op(ent, OP_EQ, NULL); - - done: - tor_free(ent); -} - -static smartlist_t *mock_addent_got = NULL; -static void -mock_addent(keypin_ent_t *ent) -{ - smartlist_add(mock_addent_got, ent); - keypin_add_entry_to_map__real(ent); -} - -static void -test_keypin_parse_file(void *arg) -{ - (void)arg; - - mock_addent_got = smartlist_new(); - MOCK(keypin_add_entry_to_map, mock_addent); - - /* Simple, minimal, correct example. */ - const char data1[] = -"PT09PT09PT09PT09PT09PT09PT0 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0\n" -"TG9yYXggaXBzdW0gZ3J1dnZ1bHU cyB0aG5lZWQgYW1ldCwgc25lcmdlbGx5IG9uY2UtbGU\n" -"ciBsZXJraW0sIHNlZCBkbyBiYXI YmFsb290IHRlbXBvciBnbHVwcGl0dXMgdXQgbGFib3I\n" -"ZSBldCB0cnVmZnVsYSBtYWduYSA YWxpcXVhLiBVdCBlbmltIGFkIGdyaWNrbGUtZ3Jhc3M\n" -"dmVuaWFtLCBxdWlzIG1pZmYtbXU ZmZlcmVkIGdhLXp1bXBjbyBsYWJvcmlzIG5pc2kgdXQ\n" -"Y3J1ZmZ1bHVzIGV4IGVhIHNjaGw b3BwaXR5IGNvbnNlcXVhdC4gRHVpcyBhdXRlIHNuYXI\n" -"Z2dsZSBpbiBzd29tZWVzd2FucyA aW4gdm9sdXB0YXRlIGF4ZS1oYWNrZXIgZXNzZSByaXA\n" -"cHVsdXMgY3J1bW1paSBldSBtb28 ZiBudWxsYSBzbnV2di5QTFVHSFBMT1ZFUlhZWlpZLi4\n"; - - tt_int_op(0, OP_EQ, keypin_load_journal_impl(data1, strlen(data1))); - tt_int_op(8, OP_EQ, smartlist_len(mock_addent_got)); - keypin_ent_t *ent = smartlist_get(mock_addent_got, 2); - tt_mem_op(ent->rsa_id, OP_EQ, "r lerkim, sed do bar", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, "baloot tempor gluppitus ut labor", 32); - - /* More complex example: weird lines, bogus lines, - duplicate/conflicting lines */ - const char data2[] = - "PT09PT09PT09PT09PT09PT09PT0 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0\n" - "# This is a comment.\n" - " \n" - "QXQgdGhlIGVuZCBvZiB0aGUgeWU YXIgS3VycmVta2FybWVycnVrIHNhaWQgdG8gaGltLCA\n" - "IllvdSBoYXZlIG1hZGUgYSBnb28 ZCBiZWdpbm5pbmcuIiBCdXQgbm8gbW9yZS4gV2l6YXI\n" - "\n" - "ZHMgc3BlYWsgdHJ1dGgsIGFuZCA aXQgd2FzIHRydWUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" - "@reserved for a future extension \n" - "eSBvZiBOYW1lcyB0aGF0IEdlZCA aGFkIHRvaWxlZCbyB3aW4gdGhhdCB5ZWFyIHdhcyA\n" - "eSBvZiBOYW1lcyB0aGF0IEdlZCA aGFkIHRvaWxlZCbyB3aW4gdGhhdCB5ZWFyIHdhcy" - "A line too long\n" - "dGhlIG1lcmUgc3RhcnQgb2Ygd2g YXQgaGUgbXVzdCBnbyBvb!BsZWFybmluZy4uLi4uLi4\n" - "ZHMgc3BlYWsgdaJ1dGgsIGFuZCA aXQgd2FzIHRydWUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" - "ZHMgc3BlYWsgdHJ1dGgsIGFuZCA aXQgd2FzIHRydaUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n" - ; - - tt_int_op(0, OP_EQ, keypin_load_journal_impl(data2, strlen(data2))); - tt_int_op(13, OP_EQ, smartlist_len(mock_addent_got)); - ent = smartlist_get(mock_addent_got, 9); - tt_mem_op(ent->rsa_id, OP_EQ, "\"You have made a goo", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, "d beginning.\" But no more. Wizar", 32); - - ent = smartlist_get(mock_addent_got, 12); - tt_mem_op(ent->rsa_id, OP_EQ, "ds speak truth, and ", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, - "it was tru\xa5 that all the master\n", 32); - - /* File truncated before NL */ - const char data3[] = - "Tm8gZHJhZ29uIGNhbiByZXNpc3Q IHRoZSBmYXNjaW5hdGlvbiBvZiByaWRkbGluZyB0YWw"; - tt_int_op(0, OP_EQ, keypin_load_journal_impl(data3, strlen(data3))); - tt_int_op(14, OP_EQ, smartlist_len(mock_addent_got)); - ent = smartlist_get(mock_addent_got, 13); - tt_mem_op(ent->rsa_id, OP_EQ, "No dragon can resist", 20); - tt_mem_op(ent->ed25519_key, OP_EQ, " the fascination of riddling tal", 32); - - done: - keypin_clear(); - smartlist_free(mock_addent_got); -} - -#define ADD(a,b) keypin_check_and_add((const uint8_t*)(a),\ - (const uint8_t*)(b),0) -#define LONE_RSA(a) keypin_check_lone_rsa((const uint8_t*)(a)) - -static void -test_keypin_add_entry(void *arg) -{ - (void)arg; - keypin_clear(); - - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("ambassadors-at-large", - "bread-and-butter thing-in-itself")); - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("gentleman-adventurer", - "cloak-and-dagger what's-his-face")); - - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large", - "bread-and-butter thing-in-itself")); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large", - "bread-and-butter thing-in-itself")); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer", - "cloak-and-dagger what's-his-face")); - - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("Johnnies-come-lately", - "run-of-the-mill root-mean-square")); - - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("gentleman-adventurer", - "hypersentimental closefistedness")); - - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("disestablismentarian", - "cloak-and-dagger what's-his-face")); - - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer", - "cloak-and-dagger what's-his-face")); - - tt_int_op(KEYPIN_NOT_FOUND, OP_EQ, LONE_RSA("Llanfairpwllgwyngyll")); - tt_int_op(KEYPIN_MISMATCH, OP_EQ, LONE_RSA("Johnnies-come-lately")); - - done: - keypin_clear(); -} - -static void -test_keypin_journal(void *arg) -{ - (void)arg; - char *contents = NULL; - const char *fname = get_fname("keypin-journal"); - - tt_int_op(0, OP_EQ, keypin_load_journal(fname)); /* ENOENT is okay */ - update_approx_time(1217709000); - tt_int_op(0, OP_EQ, keypin_open_journal(fname)); - - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("king-of-the-herrings", - "good-for-nothing attorney-at-law")); - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("yellowish-red-yellow", - "salt-and-pepper high-muck-a-muck")); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", - "salt-and-pepper high-muck-a-muck")); - keypin_close_journal(); - keypin_clear(); - - tt_int_op(0, OP_EQ, keypin_load_journal(fname)); - update_approx_time(1231041600); - tt_int_op(0, OP_EQ, keypin_open_journal(fname)); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", - "salt-and-pepper high-muck-a-muck")); - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("theatre-in-the-round", - "holier-than-thou jack-in-the-box")); - tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("no-deposit-no-return", - "across-the-board will-o-the-wisp")); - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations", - "salt-and-pepper high-muck-a-muck")); - keypin_close_journal(); - keypin_clear(); - - tt_int_op(0, OP_EQ, keypin_load_journal(fname)); - update_approx_time(1412278354); - tt_int_op(0, OP_EQ, keypin_open_journal(fname)); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow", - "salt-and-pepper high-muck-a-muck")); - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations", - "salt-and-pepper high-muck-a-muck")); - tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("theatre-in-the-round", - "holier-than-thou jack-in-the-box")); - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("counterrevolutionary", - "holier-than-thou jack-in-the-box")); - tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("no-deposit-no-return", - "floccinaucinihilipilificationism")); - keypin_close_journal(); - - contents = read_file_to_str(fname, RFTS_BIN, NULL); - tt_assert(contents); - tt_str_op(contents,OP_EQ, - "\n" - "@opened-at 2008-08-02 20:30:00\n" - "a2luZy1vZi10aGUtaGVycmluZ3M Z29vZC1mb3Itbm90aGluZyBhdHRvcm5leS1hdC1sYXc\n" - "eWVsbG93aXNoLXJlZC15ZWxsb3c c2FsdC1hbmQtcGVwcGVyIGhpZ2gtbXVjay1hLW11Y2s\n" - "\n" - "@opened-at 2009-01-04 04:00:00\n" - "dGhlYXRyZS1pbi10aGUtcm91bmQ aG9saWVyLXRoYW4tdGhvdSBqYWNrLWluLXRoZS1ib3g\n" - "bm8tZGVwb3NpdC1uby1yZXR1cm4 YWNyb3NzLXRoZS1ib2FyZCB3aWxsLW8tdGhlLXdpc3A\n" - "\n" - "@opened-at 2014-10-02 19:32:34\n"); - - done: - tor_free(contents); - keypin_clear(); -} - -#undef ADD -#undef LONE_RSA - -#define TEST(name, flags) \ - { #name , test_keypin_ ## name, (flags), NULL, NULL } - -struct testcase_t keypin_tests[] = { - TEST( parse_line, 0 ), - TEST( parse_file, TT_FORK ), - TEST( add_entry, TT_FORK ), - TEST( journal, TT_FORK ), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_link_handshake.c b/src/tor/src/test/test_link_handshake.c deleted file mode 100644 index 6840072d7..000000000 --- a/src/tor/src/test/test_link_handshake.c +++ /dev/null @@ -1,1579 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#define CHANNELTLS_PRIVATE -#define CONNECTION_PRIVATE -#define TOR_CHANNEL_INTERNAL_ -#define TORTLS_PRIVATE - -#include "compat.h" - -#include "or.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "channeltls.h" -#include "link_handshake.h" -#include "router.h" -#include "routerkeys.h" -#include "scheduler.h" -#include "torcert.h" - -#include "test.h" -#include "log_test_helpers.h" - -static var_cell_t *mock_got_var_cell = NULL; - -static void -mock_write_var_cell(const var_cell_t *vc, or_connection_t *conn) -{ - (void)conn; - - var_cell_t *newcell = var_cell_new(vc->payload_len); - memcpy(newcell, vc, sizeof(var_cell_t)); - memcpy(newcell->payload, vc->payload, vc->payload_len); - - mock_got_var_cell = newcell; -} -static int -mock_tls_cert_matches_key(const tor_tls_t *tls, const tor_x509_cert_t *cert) -{ - (void) tls; - (void) cert; // XXXX look at this. - return 1; -} -static tor_tls_t *mock_peer_cert_expect_tortls = NULL; -static tor_x509_cert_t *mock_peer_cert = NULL; -static tor_x509_cert_t * -mock_get_peer_cert(tor_tls_t *tls) -{ - if (mock_peer_cert_expect_tortls && - mock_peer_cert_expect_tortls != tls) - return NULL; - return tor_x509_cert_dup(mock_peer_cert); -} - -static int mock_send_netinfo_called = 0; -static int -mock_send_netinfo(or_connection_t *conn) -{ - (void) conn; - ++mock_send_netinfo_called;// XXX check_this - return 0; -} - -static int mock_close_called = 0; -static void -mock_close_for_err(or_connection_t *orconn, int flush) -{ - (void)orconn; - (void)flush; - ++mock_close_called; -} - -static int mock_send_authenticate_called = 0; -static int mock_send_authenticate_called_with_type = 0; -static int -mock_send_authenticate(or_connection_t *conn, int type) -{ - (void) conn; - mock_send_authenticate_called_with_type = type; - ++mock_send_authenticate_called;// XXX check_this - return 0; -} -static int -mock_export_key_material(tor_tls_t *tls, uint8_t *secrets_out, - const uint8_t *context, - size_t context_len, - const char *label) -{ - (void) tls; - (void)secrets_out; - (void)context; - (void)context_len; - (void)label; - memcpy(secrets_out, "int getRandomNumber(){return 4;}", 32); - return 0; -} - -static tor_x509_cert_t *mock_own_cert = NULL; -static tor_x509_cert_t * -mock_get_own_cert(tor_tls_t *tls) -{ - (void)tls; - return tor_x509_cert_dup(mock_own_cert); -} - -/* Test good certs cells */ -static void -test_link_handshake_certs_ok(void *arg) -{ - or_connection_t *c1 = or_connection_new(CONN_TYPE_OR, AF_INET); - or_connection_t *c2 = or_connection_new(CONN_TYPE_OR, AF_INET); - var_cell_t *cell1 = NULL, *cell2 = NULL; - certs_cell_t *cc1 = NULL, *cc2 = NULL; - channel_tls_t *chan1 = NULL, *chan2 = NULL; - crypto_pk_t *key1 = NULL, *key2 = NULL; - const int with_ed = !strcmp((const char *)arg, "Ed25519"); - - tor_addr_from_ipv4h(&c1->base_.addr, 0x7f000001); - tor_addr_from_ipv4h(&c2->base_.addr, 0x7f000001); - - scheduler_init(); - - MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); - MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); - MOCK(connection_or_send_netinfo, mock_send_netinfo); - MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); - MOCK(tor_tls_get_own_cert, mock_get_own_cert); - - key1 = pk_generate(2); - key2 = pk_generate(3); - - /* We need to make sure that our TLS certificates are set up before we can - * actually generate a CERTS cell. - */ - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - key1, key2, 86400), OP_EQ, 0); - - if (with_ed) { - /* If we're making a CERTS cell for an ed handshake, let's make sure we - * have some Ed25519 certificates and keys. */ - init_mock_ed_keys(key2); - } else { - certs_cell_ed25519_disabled_for_testing = 1; - } - - /* c1 has started_here == 1 */ - { - const tor_x509_cert_t *link_cert = NULL; - tt_assert(!tor_tls_get_my_certs(1, &link_cert, NULL)); - mock_own_cert = tor_x509_cert_dup(link_cert); - } - - c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - c1->link_proto = 3; - tt_int_op(connection_init_or_handshake_state(c1, 1), OP_EQ, 0); - - /* c2 has started_here == 0 */ - c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - c2->link_proto = 3; - tt_int_op(connection_init_or_handshake_state(c2, 0), OP_EQ, 0); - - tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c1)); - tt_assert(mock_got_var_cell); - cell1 = mock_got_var_cell; - - tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c2)); - tt_assert(mock_got_var_cell); - cell2 = mock_got_var_cell; - - tt_int_op(cell1->command, OP_EQ, CELL_CERTS); - tt_int_op(cell1->payload_len, OP_GT, 1); - - tt_int_op(cell2->command, OP_EQ, CELL_CERTS); - tt_int_op(cell2->payload_len, OP_GT, 1); - - tt_int_op(cell1->payload_len, OP_EQ, - certs_cell_parse(&cc1, cell1->payload, cell1->payload_len)); - tt_int_op(cell2->payload_len, OP_EQ, - certs_cell_parse(&cc2, cell2->payload, cell2->payload_len)); - - if (with_ed) { - tt_int_op(5, OP_EQ, cc1->n_certs); - tt_int_op(5, OP_EQ, cc2->n_certs); - } else { - tt_int_op(2, OP_EQ, cc1->n_certs); - tt_int_op(2, OP_EQ, cc2->n_certs); - } - - tt_int_op(certs_cell_get_certs(cc1, 0)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_AUTH); - tt_int_op(certs_cell_get_certs(cc1, 1)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_ID); - - tt_int_op(certs_cell_get_certs(cc2, 0)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_LINK); - tt_int_op(certs_cell_get_certs(cc2, 1)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_ID); - - if (with_ed) { - tt_int_op(certs_cell_get_certs(cc1, 2)->cert_type, OP_EQ, - CERTTYPE_ED_ID_SIGN); - tt_int_op(certs_cell_get_certs(cc1, 3)->cert_type, OP_EQ, - CERTTYPE_ED_SIGN_AUTH); - tt_int_op(certs_cell_get_certs(cc1, 4)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_EDID); - - tt_int_op(certs_cell_get_certs(cc2, 2)->cert_type, OP_EQ, - CERTTYPE_ED_ID_SIGN); - tt_int_op(certs_cell_get_certs(cc2, 3)->cert_type, OP_EQ, - CERTTYPE_ED_SIGN_LINK); - tt_int_op(certs_cell_get_certs(cc2, 4)->cert_type, OP_EQ, - CERTTYPE_RSA1024_ID_EDID); - } - - chan1 = tor_malloc_zero(sizeof(*chan1)); - channel_tls_common_init(chan1); - c1->chan = chan1; - chan1->conn = c1; - c1->base_.address = tor_strdup("C1"); - c1->tls = tor_tls_new(-1, 0); - c1->link_proto = 4; - c1->base_.conn_array_index = -1; - crypto_pk_get_digest(key2, c1->identity_digest); - - if (with_ed) { - const tor_x509_cert_t *linkc, *idc; - tor_tls_get_my_certs(1, &linkc, &idc); - mock_peer_cert_expect_tortls = c1->tls; /* We should see this tls... */ - mock_peer_cert = tor_x509_cert_dup(linkc); /* and when we do, the peer's - * cert is this... */ - } - channel_tls_process_certs_cell(cell2, chan1); - mock_peer_cert_expect_tortls = NULL; - tor_x509_cert_free(mock_peer_cert); - mock_peer_cert = NULL; - - tor_assert(c1->handshake_state->authenticated); - - tt_assert(c1->handshake_state->received_certs_cell); - tt_ptr_op(c1->handshake_state->certs->auth_cert, OP_EQ, NULL); - tt_ptr_op(c1->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); - tt_assert(c1->handshake_state->certs->id_cert); - if (with_ed) { - tt_assert(c1->handshake_state->certs->ed_sign_link); - tt_assert(c1->handshake_state->certs->ed_rsa_crosscert); - tt_assert(c1->handshake_state->certs->ed_id_sign); - tt_assert(c1->handshake_state->authenticated_rsa); - tt_assert(c1->handshake_state->authenticated_ed25519); - } else { - tt_ptr_op(c1->handshake_state->certs->ed_sign_link, OP_EQ, NULL); - tt_ptr_op(c1->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); - tt_ptr_op(c1->handshake_state->certs->ed_id_sign, OP_EQ, NULL); - tt_assert(c1->handshake_state->authenticated_rsa); - tt_assert(! c1->handshake_state->authenticated_ed25519); - } - tt_assert(! tor_mem_is_zero( - (char*)c1->handshake_state->authenticated_rsa_peer_id, 20)); - - chan2 = tor_malloc_zero(sizeof(*chan2)); - channel_tls_common_init(chan2); - c2->chan = chan2; - chan2->conn = c2; - c2->base_.address = tor_strdup("C2"); - c2->tls = tor_tls_new(-1, 1); - c2->link_proto = 4; - c2->base_.conn_array_index = -1; - crypto_pk_get_digest(key1, c2->identity_digest); - - channel_tls_process_certs_cell(cell1, chan2); - - tt_assert(c2->handshake_state->received_certs_cell); - if (with_ed) { - tt_assert(c2->handshake_state->certs->ed_sign_auth); - tt_assert(c2->handshake_state->certs->ed_rsa_crosscert); - tt_assert(c2->handshake_state->certs->ed_id_sign); - } else { - tt_assert(c2->handshake_state->certs->auth_cert); - tt_ptr_op(c2->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); - tt_ptr_op(c2->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); - tt_ptr_op(c2->handshake_state->certs->ed_id_sign, OP_EQ, NULL); - } - tt_assert(c2->handshake_state->certs->id_cert); - tt_assert(tor_mem_is_zero( - (char*)c2->handshake_state->authenticated_rsa_peer_id, 20)); - /* no authentication has happened yet, since we haen't gotten an AUTH cell. - */ - tt_assert(! c2->handshake_state->authenticated); - tt_assert(! c2->handshake_state->authenticated_rsa); - tt_assert(! c2->handshake_state->authenticated_ed25519); - - done: - UNMOCK(tor_tls_cert_matches_key); - UNMOCK(connection_or_write_var_cell_to_buf); - UNMOCK(connection_or_send_netinfo); - UNMOCK(tor_tls_get_peer_cert); - UNMOCK(tor_tls_get_own_cert); - tor_x509_cert_free(mock_own_cert); - tor_x509_cert_free(mock_peer_cert); - mock_own_cert = mock_peer_cert = NULL; - memset(c1->identity_digest, 0, sizeof(c1->identity_digest)); - memset(c2->identity_digest, 0, sizeof(c2->identity_digest)); - connection_free_minimal(TO_CONN(c1)); - connection_free_minimal(TO_CONN(c2)); - tor_free(cell1); - tor_free(cell2); - certs_cell_free(cc1); - certs_cell_free(cc2); - if (chan1) - circuitmux_free(chan1->base_.cmux); - tor_free(chan1); - if (chan2) - circuitmux_free(chan2->base_.cmux); - tor_free(chan2); - crypto_pk_free(key1); - crypto_pk_free(key2); -} - -typedef struct certs_data_s { - int is_ed; - int is_link_cert; - or_connection_t *c; - channel_tls_t *chan; - certs_cell_t *ccell; - var_cell_t *cell; - crypto_pk_t *key1, *key2; -} certs_data_t; - -static int -recv_certs_cleanup(const struct testcase_t *test, void *obj) -{ - (void)test; - certs_data_t *d = obj; - UNMOCK(tor_tls_cert_matches_key); - UNMOCK(connection_or_send_netinfo); - UNMOCK(connection_or_close_for_error); - UNMOCK(tor_tls_get_peer_cert); - UNMOCK(tor_tls_get_own_cert); - - if (d) { - tor_free(d->cell); - certs_cell_free(d->ccell); - connection_or_clear_identity(d->c); - connection_free_minimal(TO_CONN(d->c)); - circuitmux_free(d->chan->base_.cmux); - tor_free(d->chan); - crypto_pk_free(d->key1); - crypto_pk_free(d->key2); - tor_free(d); - } - routerkeys_free_all(); - return 1; -} - -static void * -recv_certs_setup(const struct testcase_t *test) -{ - (void)test; - certs_data_t *d = tor_malloc_zero(sizeof(*d)); - certs_cell_cert_t *ccc1 = NULL; - certs_cell_cert_t *ccc2 = NULL; - ssize_t n; - int is_ed = d->is_ed = !strcmpstart(test->setup_data, "Ed25519"); - int is_rsa = !strcmpstart(test->setup_data, "RSA"); - int is_link = d->is_link_cert = !strcmpend(test->setup_data, "-Link"); - int is_auth = !strcmpend(test->setup_data, "-Auth"); - tor_assert(is_ed != is_rsa); - tor_assert(is_link != is_auth); - - d->c = or_connection_new(CONN_TYPE_OR, AF_INET); - d->chan = tor_malloc_zero(sizeof(*d->chan)); - d->c->chan = d->chan; - d->c->base_.address = tor_strdup("HaveAnAddress"); - tor_addr_from_ipv4h(&d->c->base_.addr, 0x801f0127); - d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - d->chan->conn = d->c; - tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0); - d->c->link_proto = 4; - - d->key1 = pk_generate(2); - d->key2 = pk_generate(3); - - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - d->key1, d->key2, 86400), OP_EQ, 0); - if (is_ed) { - init_mock_ed_keys(d->key2); - } else { - routerkeys_free_all(); - } - - d->ccell = certs_cell_new(); - ccc1 = certs_cell_cert_new(); - certs_cell_add_certs(d->ccell, ccc1); - ccc2 = certs_cell_cert_new(); - certs_cell_add_certs(d->ccell, ccc2); - d->ccell->n_certs = 2; - ccc1->cert_type = is_link ? 1 : 3; - ccc2->cert_type = 2; - - const tor_x509_cert_t *a,*b; - const uint8_t *enca, *encb; - size_t lena, lenb; - tor_tls_get_my_certs(is_link ? 1 : 0, &a, &b); - tor_x509_cert_get_der(a, &enca, &lena); - tor_x509_cert_get_der(b, &encb, &lenb); - certs_cell_cert_setlen_body(ccc1, lena); - ccc1->cert_len = lena; - certs_cell_cert_setlen_body(ccc2, lenb); - ccc2->cert_len = lenb; - - memcpy(certs_cell_cert_getarray_body(ccc1), enca, lena); - memcpy(certs_cell_cert_getarray_body(ccc2), encb, lenb); - - if (is_ed) { - certs_cell_cert_t *ccc3 = NULL; /* Id->Sign */ - certs_cell_cert_t *ccc4 = NULL; /* Sign->Link or Sign->Auth. */ - certs_cell_cert_t *ccc5 = NULL; /* RSAId->Ed Id. */ - const tor_cert_t *id_sign = get_master_signing_key_cert(); - const tor_cert_t *secondary = - is_link ? get_current_link_cert_cert() : get_current_auth_key_cert(); - const uint8_t *cc = NULL; - size_t cc_sz; - get_master_rsa_crosscert(&cc, &cc_sz); - - ccc3 = certs_cell_cert_new(); - ccc4 = certs_cell_cert_new(); - ccc5 = certs_cell_cert_new(); - certs_cell_add_certs(d->ccell, ccc3); - certs_cell_add_certs(d->ccell, ccc4); - certs_cell_add_certs(d->ccell, ccc5); - ccc3->cert_len = id_sign->encoded_len; - ccc4->cert_len = secondary->encoded_len; - ccc5->cert_len = cc_sz; - certs_cell_cert_setlen_body(ccc3, ccc3->cert_len); - certs_cell_cert_setlen_body(ccc4, ccc4->cert_len); - certs_cell_cert_setlen_body(ccc5, ccc5->cert_len); - memcpy(certs_cell_cert_getarray_body(ccc3), id_sign->encoded, - ccc3->cert_len); - memcpy(certs_cell_cert_getarray_body(ccc4), secondary->encoded, - ccc4->cert_len); - memcpy(certs_cell_cert_getarray_body(ccc5), cc, ccc5->cert_len); - ccc3->cert_type = 4; - ccc4->cert_type = is_link ? 5 : 6; - ccc5->cert_type = 7; - - d->ccell->n_certs = 5; - } - - d->cell = var_cell_new(4096); - d->cell->command = CELL_CERTS; - - n = certs_cell_encode(d->cell->payload, 4096, d->ccell); - tt_int_op(n, OP_GT, 0); - d->cell->payload_len = n; - - MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); - MOCK(connection_or_send_netinfo, mock_send_netinfo); - MOCK(connection_or_close_for_error, mock_close_for_err); - MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); - - if (is_link) { - /* Say that this is the peer's certificate */ - mock_peer_cert = tor_x509_cert_dup(a); - } - - tt_int_op(0, OP_EQ, d->c->handshake_state->received_certs_cell); - tt_int_op(0, OP_EQ, mock_send_authenticate_called); - tt_int_op(0, OP_EQ, mock_send_netinfo_called); - - return d; - done: - recv_certs_cleanup(test, d); - return NULL; -} - -static struct testcase_setup_t setup_recv_certs = { - .setup_fn = recv_certs_setup, - .cleanup_fn = recv_certs_cleanup -}; - -static void -test_link_handshake_recv_certs_ok(void *arg) -{ - certs_data_t *d = arg; - channel_tls_process_certs_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 1); - tt_int_op(d->c->handshake_state->authenticated_rsa, OP_EQ, 1); - tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1); - tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL); - tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL); - - if (d->is_ed) { - tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_NE, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_NE, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_NE, NULL); - tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 1); - } else { - tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_EQ, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_EQ, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); - tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL); - tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 0); - } - - done: - ; -} - -static void -test_link_handshake_recv_certs_ok_server(void *arg) -{ - certs_data_t *d = arg; - d->c->handshake_state->started_here = 0; - d->c->handshake_state->certs->started_here = 0; - channel_tls_process_certs_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 0); - tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1); - tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL); - tt_ptr_op(d->c->handshake_state->certs->link_cert, OP_EQ, NULL); - if (d->is_ed) { - tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_NE, NULL); - tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL); - } else { - tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL); - tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_NE, NULL); - } - - done: - ; -} - -#define CERTS_FAIL(name, code) \ - static void \ - test_link_handshake_recv_certs_ ## name(void *arg) \ - { \ - certs_data_t *d = arg; \ - const char *require_failure_message = NULL; \ - setup_capture_of_logs(LOG_INFO); \ - { code ; } \ - channel_tls_process_certs_cell(d->cell, d->chan); \ - tt_int_op(1, OP_EQ, mock_close_called); \ - tt_int_op(0, OP_EQ, mock_send_authenticate_called); \ - tt_int_op(0, OP_EQ, mock_send_netinfo_called); \ - tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_rsa); \ - tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519); \ - if (require_failure_message) { \ - expect_log_msg_containing(require_failure_message); \ - } \ - done: \ - teardown_capture_of_logs(); \ - } - -CERTS_FAIL(badstate, - require_failure_message = "We're not doing a v3 handshake!"; - d->c->base_.state = OR_CONN_STATE_CONNECTING;) -CERTS_FAIL(badproto, - require_failure_message = "not using link protocol >= 3"; - d->c->link_proto = 2) -CERTS_FAIL(duplicate, - require_failure_message = "We already got one"; - d->c->handshake_state->received_certs_cell = 1) -CERTS_FAIL(already_authenticated, - require_failure_message = "We're already authenticated!"; - d->c->handshake_state->authenticated = 1) -CERTS_FAIL(empty, - require_failure_message = "It had no body"; - d->cell->payload_len = 0) -CERTS_FAIL(bad_circid, - require_failure_message = "It had a nonzero circuit ID"; - d->cell->circ_id = 1) -CERTS_FAIL(truncated_1, - require_failure_message = "It couldn't be parsed"; - d->cell->payload[0] = 5) -CERTS_FAIL(truncated_2, - { - require_failure_message = "It couldn't be parsed"; - d->cell->payload_len = 4; - memcpy(d->cell->payload, "\x01\x01\x00\x05", 4); - }) -CERTS_FAIL(truncated_3, - { - require_failure_message = "It couldn't be parsed"; - d->cell->payload_len = 7; - memcpy(d->cell->payload, "\x01\x01\x00\x05""abc", 7); - }) -CERTS_FAIL(truncated_4, /* ed25519 */ - { - require_failure_message = "It couldn't be parsed"; - d->cell->payload_len -= 10; - }) -CERTS_FAIL(truncated_5, /* ed25519 */ - { - require_failure_message = "It couldn't be parsed"; - d->cell->payload_len -= 100; - }) - -#define REENCODE() do { \ - const char *msg = certs_cell_check(d->ccell); \ - if (msg) puts(msg); \ - ssize_t n = certs_cell_encode(d->cell->payload, 4096, d->ccell); \ - tt_int_op(n, OP_GT, 0); \ - d->cell->payload_len = n; \ - } while (0) - -CERTS_FAIL(truncated_6, /* ed25519 */ - { - /* truncate the link certificate */ - require_failure_message = "undecodable Ed certificate"; - certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 3), 7); - certs_cell_get_certs(d->ccell, 3)->cert_len = 7; - REENCODE(); - }) -CERTS_FAIL(truncated_7, /* ed25519 */ - { - /* truncate the crosscert */ - require_failure_message = "Unparseable or overlong crosscert"; - certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 4), 7); - certs_cell_get_certs(d->ccell, 4)->cert_len = 7; - REENCODE(); - }) -CERTS_FAIL(not_x509, - { - require_failure_message = "Received undecodable certificate"; - certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 0), 3); - certs_cell_get_certs(d->ccell, 0)->cert_len = 3; - REENCODE(); - }) -CERTS_FAIL(both_link, - { - require_failure_message = "Duplicate x509 certificate"; - certs_cell_get_certs(d->ccell, 0)->cert_type = 1; - certs_cell_get_certs(d->ccell, 1)->cert_type = 1; - REENCODE(); - }) -CERTS_FAIL(both_id_rsa, - { - require_failure_message = "Duplicate x509 certificate"; - certs_cell_get_certs(d->ccell, 0)->cert_type = 2; - certs_cell_get_certs(d->ccell, 1)->cert_type = 2; - REENCODE(); - }) -CERTS_FAIL(both_auth, - { - require_failure_message = "Duplicate x509 certificate"; - certs_cell_get_certs(d->ccell, 0)->cert_type = 3; - certs_cell_get_certs(d->ccell, 1)->cert_type = 3; - REENCODE(); - }) -CERTS_FAIL(duplicate_id, /* ed25519 */ - { - require_failure_message = "Duplicate Ed25519 certificate"; - certs_cell_get_certs(d->ccell, 2)->cert_type = 4; - certs_cell_get_certs(d->ccell, 3)->cert_type = 4; - REENCODE(); - }) -CERTS_FAIL(duplicate_link, /* ed25519 */ - { - require_failure_message = "Duplicate Ed25519 certificate"; - certs_cell_get_certs(d->ccell, 2)->cert_type = 5; - certs_cell_get_certs(d->ccell, 3)->cert_type = 5; - REENCODE(); - }) -CERTS_FAIL(duplicate_crosscert, /* ed25519 */ - { - require_failure_message = "Duplicate RSA->Ed25519 crosscert"; - certs_cell_get_certs(d->ccell, 2)->cert_type = 7; - certs_cell_get_certs(d->ccell, 3)->cert_type = 7; - REENCODE(); - }) -static void -test_link_handshake_recv_certs_missing_id(void *arg) /* ed25519 */ -{ - certs_data_t *d = arg; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_set_certs(d->ccell, 2, certs_cell_get_certs(d->ccell, 4)); - certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ - certs_cell_setlen_certs(d->ccell, 4); - d->ccell->n_certs = 4; - REENCODE(); - - /* This handshake succeeds, but since we have no ID cert, we will - * just do the RSA handshake. */ - channel_tls_process_certs_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519); - tt_int_op(1, OP_EQ, d->c->handshake_state->authenticated_rsa); - done: - ; -} -CERTS_FAIL(missing_signing_key, /* ed25519 */ - { - require_failure_message = "No Ed25519 signing key"; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 2); - tt_int_op(cert->cert_type, OP_EQ, CERTTYPE_ED_ID_SIGN); - /* replace this with a valid master->signing cert, but with no - * signing key. */ - const ed25519_keypair_t *mk = get_master_identity_keypair(); - const ed25519_keypair_t *sk = get_master_signing_keypair(); - tor_cert_t *bad_cert = tor_cert_create(mk, CERT_TYPE_ID_SIGNING, - &sk->pubkey, time(NULL), 86400, - 0 /* don't include signer */); - certs_cell_cert_setlen_body(cert, bad_cert->encoded_len); - memcpy(certs_cell_cert_getarray_body(cert), - bad_cert->encoded, bad_cert->encoded_len); - cert->cert_len = bad_cert->encoded_len; - tor_cert_free(bad_cert); - REENCODE(); - }) -CERTS_FAIL(missing_link, /* ed25519 */ - { - require_failure_message = "No Ed25519 link key"; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_set_certs(d->ccell, 3, certs_cell_get_certs(d->ccell, 4)); - certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ - certs_cell_setlen_certs(d->ccell, 4); - d->ccell->n_certs = 4; - REENCODE(); - }) -CERTS_FAIL(missing_auth, /* ed25519 */ - { - d->c->handshake_state->started_here = 0; - d->c->handshake_state->certs->started_here = 0; - require_failure_message = "No Ed25519 link authentication key"; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_set_certs(d->ccell, 3, certs_cell_get_certs(d->ccell, 4)); - certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ - certs_cell_setlen_certs(d->ccell, 4); - d->ccell->n_certs = 4; - REENCODE(); - }) -CERTS_FAIL(missing_crosscert, /* ed25519 */ - { - require_failure_message = "Missing RSA->Ed25519 crosscert"; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_setlen_certs(d->ccell, 4); - d->ccell->n_certs = 4; - REENCODE(); - }) -CERTS_FAIL(missing_rsa_id, /* ed25519 */ - { - require_failure_message = "Missing legacy RSA ID cert"; - tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5); - certs_cell_set_certs(d->ccell, 1, certs_cell_get_certs(d->ccell, 4)); - certs_cell_set0_certs(d->ccell, 4, NULL); /* prevent free */ - certs_cell_setlen_certs(d->ccell, 4); - d->ccell->n_certs = 4; - REENCODE(); - }) -CERTS_FAIL(link_mismatch, /* ed25519 */ - { - require_failure_message = "Link certificate does not match " - "TLS certificate"; - const tor_x509_cert_t *idc; - tor_tls_get_my_certs(1, NULL, &idc); - tor_x509_cert_free(mock_peer_cert); - /* Pretend that the peer cert was something else. */ - mock_peer_cert = tor_x509_cert_dup(idc); - /* No reencode needed. */ - }) -CERTS_FAIL(bad_ed_sig, /* ed25519 */ - { - require_failure_message = "At least one Ed25519 certificate was " - "badly signed"; - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 3); - uint8_t *body = certs_cell_cert_getarray_body(cert); - ssize_t body_len = certs_cell_cert_getlen_body(cert); - /* Frob a byte in the signature */ - body[body_len - 13] ^= 7; - REENCODE(); - }) -CERTS_FAIL(bad_crosscert, /*ed25519*/ - { - require_failure_message = "Invalid RSA->Ed25519 crosscert"; - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 4); - uint8_t *body = certs_cell_cert_getarray_body(cert); - ssize_t body_len = certs_cell_cert_getlen_body(cert); - /* Frob a byte in the signature */ - body[body_len - 13] ^= 7; - REENCODE(); - }) -CERTS_FAIL(bad_rsa_id_cert, /*ed25519*/ - { - require_failure_message = "legacy RSA ID certificate was not valid"; - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); - uint8_t *body = certs_cell_cert_getarray_body(cert); - ssize_t body_len = certs_cell_cert_getlen_body(cert); - /* Frob a byte in the signature */ - body[body_len - 13] ^= 7; - REENCODE(); - }) -CERTS_FAIL(expired_rsa_id, /* both */ - { - require_failure_message = "Certificate already expired"; - /* we're going to replace the identity cert with an expired one. */ - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); - const tor_x509_cert_t *idc; - tor_tls_get_my_certs(1, NULL, &idc); - tor_x509_cert_t *newc; - time_t new_end = time(NULL) - 86400 * 10; - newc = tor_x509_cert_replace_expiration(idc, new_end, d->key2); - certs_cell_cert_setlen_body(cert, newc->encoded_len); - memcpy(certs_cell_cert_getarray_body(cert), - newc->encoded, newc->encoded_len); - REENCODE(); - tor_x509_cert_free(newc); - }) -CERTS_FAIL(expired_ed_id, /* ed25519 */ - { - /* we're going to replace the Ed Id->sign cert with an expired one. */ - require_failure_message = "At least one certificate expired"; - /* We don't need to re-sign, since we check for expiration first. */ - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 2); - uint8_t *body = certs_cell_cert_getarray_body(cert); - /* The expiration field is bytes [2..5]. It is in HOURS since the - * epoch. */ - set_uint32(body+2, htonl(24)); /* Back to jan 2, 1970. */ - REENCODE(); - }) -CERTS_FAIL(expired_ed_link, /* ed25519 */ - { - /* we're going to replace the Ed Sign->link cert with an expired one. */ - require_failure_message = "At least one certificate expired"; - /* We don't need to re-sign, since we check for expiration first. */ - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 3); - uint8_t *body = certs_cell_cert_getarray_body(cert); - /* The expiration field is bytes [2..5]. It is in HOURS since the - * epoch. */ - set_uint32(body+2, htonl(24)); /* Back to jan 2, 1970. */ - REENCODE(); - }) -CERTS_FAIL(expired_crosscert, /* ed25519 */ - { - /* we're going to replace the Ed Sign->link cert with an expired one. */ - require_failure_message = "Crosscert is expired"; - /* We don't need to re-sign, since we check for expiration first. */ - certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 4); - uint8_t *body = certs_cell_cert_getarray_body(cert); - /* The expiration field is bytes [32..35]. once again, HOURS. */ - set_uint32(body+32, htonl(24)); /* Back to jan 2, 1970. */ - REENCODE(); - }) - -CERTS_FAIL(wrong_labels_1, - { - require_failure_message = "The link certificate was not valid"; - certs_cell_get_certs(d->ccell, 0)->cert_type = 2; - certs_cell_get_certs(d->ccell, 1)->cert_type = 1; - REENCODE(); - }) -CERTS_FAIL(wrong_labels_2, - { - const tor_x509_cert_t *a; - const tor_x509_cert_t *b; - const uint8_t *enca; - size_t lena; - require_failure_message = "The link certificate was not valid"; - tor_tls_get_my_certs(1, &a, &b); - tor_x509_cert_get_der(a, &enca, &lena); - certs_cell_cert_setlen_body(certs_cell_get_certs(d->ccell, 1), lena); - memcpy(certs_cell_cert_getarray_body(certs_cell_get_certs(d->ccell, 1)), - enca, lena); - certs_cell_get_certs(d->ccell, 1)->cert_len = lena; - REENCODE(); - }) -CERTS_FAIL(wrong_labels_3, - { - require_failure_message = - "The certs we wanted (ID, Link) were missing"; - certs_cell_get_certs(d->ccell, 0)->cert_type = 2; - certs_cell_get_certs(d->ccell, 1)->cert_type = 3; - REENCODE(); - }) -CERTS_FAIL(server_missing_certs, - { - require_failure_message = - "The certs we wanted (ID, Auth) were missing"; - d->c->handshake_state->started_here = 0; - d->c->handshake_state->certs->started_here = 0; - - }) -CERTS_FAIL(server_wrong_labels_1, - { - require_failure_message = - "The authentication certificate was not valid"; - d->c->handshake_state->started_here = 0; - d->c->handshake_state->certs->started_here = 0; - certs_cell_get_certs(d->ccell, 0)->cert_type = 2; - certs_cell_get_certs(d->ccell, 1)->cert_type = 3; - REENCODE(); - }) - -static void -test_link_handshake_send_authchallenge(void *arg) -{ - (void)arg; - - or_connection_t *c1 = or_connection_new(CONN_TYPE_OR, AF_INET); - var_cell_t *cell1=NULL, *cell2=NULL; - - crypto_pk_t *rsa0 = pk_generate(0), *rsa1 = pk_generate(1); - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - rsa0, rsa1, 86400), OP_EQ, 0); - init_mock_ed_keys(rsa0); - - MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); - - tt_int_op(connection_init_or_handshake_state(c1, 0), OP_EQ, 0); - c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - tt_ptr_op(mock_got_var_cell, OP_EQ, NULL); - tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1)); - cell1 = mock_got_var_cell; - tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1)); - cell2 = mock_got_var_cell; - tt_int_op(38, OP_EQ, cell1->payload_len); - tt_int_op(38, OP_EQ, cell2->payload_len); - tt_int_op(0, OP_EQ, cell1->circ_id); - tt_int_op(0, OP_EQ, cell2->circ_id); - tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell1->command); - tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell2->command); - - tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell1->payload + 32, 6); - tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell2->payload + 32, 6); - tt_mem_op(cell1->payload, OP_NE, cell2->payload, 32); - - done: - UNMOCK(connection_or_write_var_cell_to_buf); - connection_free_minimal(TO_CONN(c1)); - tor_free(cell1); - tor_free(cell2); - crypto_pk_free(rsa0); - crypto_pk_free(rsa1); -} - -typedef struct authchallenge_data_s { - or_connection_t *c; - channel_tls_t *chan; - var_cell_t *cell; -} authchallenge_data_t; - -static int -recv_authchallenge_cleanup(const struct testcase_t *test, void *obj) -{ - (void)test; - authchallenge_data_t *d = obj; - - UNMOCK(connection_or_send_netinfo); - UNMOCK(connection_or_close_for_error); - UNMOCK(connection_or_send_authenticate_cell); - - if (d) { - tor_free(d->cell); - connection_free_minimal(TO_CONN(d->c)); - circuitmux_free(d->chan->base_.cmux); - tor_free(d->chan); - tor_free(d); - } - return 1; -} - -static void * -recv_authchallenge_setup(const struct testcase_t *test) -{ - (void)test; - authchallenge_data_t *d = tor_malloc_zero(sizeof(*d)); - d->c = or_connection_new(CONN_TYPE_OR, AF_INET); - d->chan = tor_malloc_zero(sizeof(*d->chan)); - d->c->chan = d->chan; - d->c->base_.address = tor_strdup("HaveAnAddress"); - d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - d->chan->conn = d->c; - tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0); - d->c->link_proto = 4; - d->c->handshake_state->received_certs_cell = 1; - d->cell = var_cell_new(128); - d->cell->payload_len = 38; - d->cell->payload[33] = 2; /* 2 methods */ - d->cell->payload[35] = 7; /* This one isn't real */ - d->cell->payload[37] = 1; /* This is the old RSA one. */ - d->cell->command = CELL_AUTH_CHALLENGE; - - get_options_mutable()->ORPort_set = 1; - - MOCK(connection_or_close_for_error, mock_close_for_err); - MOCK(connection_or_send_netinfo, mock_send_netinfo); - MOCK(connection_or_send_authenticate_cell, mock_send_authenticate); - tt_int_op(0, OP_EQ, d->c->handshake_state->received_auth_challenge); - tt_int_op(0, OP_EQ, mock_send_authenticate_called); - tt_int_op(0, OP_EQ, mock_send_netinfo_called); - - return d; - done: - recv_authchallenge_cleanup(test, d); - return NULL; -} - -static struct testcase_setup_t setup_recv_authchallenge = { - .setup_fn = recv_authchallenge_setup, - .cleanup_fn = recv_authchallenge_cleanup -}; - -static void -test_link_handshake_recv_authchallenge_ok(void *arg) -{ - authchallenge_data_t *d = arg; - - channel_tls_process_auth_challenge_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); - tt_int_op(1, OP_EQ, mock_send_authenticate_called); - tt_int_op(1, OP_EQ, mock_send_netinfo_called); - tt_int_op(1, OP_EQ, mock_send_authenticate_called_with_type); /* RSA */ - done: - ; -} - -static void -test_link_handshake_recv_authchallenge_ok_ed25519(void *arg) -{ - authchallenge_data_t *d = arg; - - /* Add the ed25519 authentication mechanism here. */ - d->cell->payload[33] = 3; /* 3 types are supported now. */ - d->cell->payload[39] = 3; - d->cell->payload_len += 2; - channel_tls_process_auth_challenge_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); - tt_int_op(1, OP_EQ, mock_send_authenticate_called); - tt_int_op(1, OP_EQ, mock_send_netinfo_called); - tt_int_op(3, OP_EQ, mock_send_authenticate_called_with_type); /* Ed25519 */ - done: - ; -} - -static void -test_link_handshake_recv_authchallenge_ok_noserver(void *arg) -{ - authchallenge_data_t *d = arg; - get_options_mutable()->ORPort_set = 0; - - channel_tls_process_auth_challenge_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); - tt_int_op(0, OP_EQ, mock_send_authenticate_called); - tt_int_op(0, OP_EQ, mock_send_netinfo_called); - done: - ; -} - -static void -test_link_handshake_recv_authchallenge_ok_unrecognized(void *arg) -{ - authchallenge_data_t *d = arg; - d->cell->payload[37] = 99; - - channel_tls_process_auth_challenge_cell(d->cell, d->chan); - tt_int_op(0, OP_EQ, mock_close_called); - tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge); - tt_int_op(0, OP_EQ, mock_send_authenticate_called); - tt_int_op(1, OP_EQ, mock_send_netinfo_called); - done: - ; -} - -#define AUTHCHALLENGE_FAIL(name, code) \ - static void \ - test_link_handshake_recv_authchallenge_ ## name(void *arg) \ - { \ - authchallenge_data_t *d = arg; \ - const char *require_failure_message = NULL; \ - setup_capture_of_logs(LOG_INFO); \ - { code ; } \ - channel_tls_process_auth_challenge_cell(d->cell, d->chan); \ - tt_int_op(1, OP_EQ, mock_close_called); \ - tt_int_op(0, OP_EQ, mock_send_authenticate_called); \ - tt_int_op(0, OP_EQ, mock_send_netinfo_called); \ - if (require_failure_message) { \ - expect_log_msg_containing(require_failure_message); \ - } \ - done: \ - teardown_capture_of_logs(); \ - } - -AUTHCHALLENGE_FAIL(badstate, - require_failure_message = "We're not currently doing a " - "v3 handshake"; - d->c->base_.state = OR_CONN_STATE_CONNECTING) -AUTHCHALLENGE_FAIL(badproto, - require_failure_message = "not using link protocol >= 3"; - d->c->link_proto = 2) -AUTHCHALLENGE_FAIL(as_server, - require_failure_message = "We didn't originate this " - "connection"; - d->c->handshake_state->started_here = 0; - d->c->handshake_state->certs->started_here = 0;) -AUTHCHALLENGE_FAIL(duplicate, - require_failure_message = "We already received one"; - d->c->handshake_state->received_auth_challenge = 1) -AUTHCHALLENGE_FAIL(nocerts, - require_failure_message = "We haven't gotten a CERTS " - "cell yet"; - d->c->handshake_state->received_certs_cell = 0) -AUTHCHALLENGE_FAIL(tooshort, - require_failure_message = "It was not well-formed"; - d->cell->payload_len = 33) -AUTHCHALLENGE_FAIL(truncated, - require_failure_message = "It was not well-formed"; - d->cell->payload_len = 34) -AUTHCHALLENGE_FAIL(nonzero_circid, - require_failure_message = "It had a nonzero circuit ID"; - d->cell->circ_id = 1337) - -static int -mock_get_tlssecrets(tor_tls_t *tls, uint8_t *secrets_out) -{ - (void)tls; - memcpy(secrets_out, "int getRandomNumber(){return 4;}", 32); - return 0; -} - -static void -mock_set_circid_type(channel_t *chan, - crypto_pk_t *identity_rcvd, - int consider_identity) -{ - (void) chan; - (void) identity_rcvd; - (void) consider_identity; -} - -typedef struct authenticate_data_s { - int is_ed; - or_connection_t *c1, *c2; - channel_tls_t *chan2; - var_cell_t *cell; - crypto_pk_t *key1, *key2; -} authenticate_data_t; - -static int -authenticate_data_cleanup(const struct testcase_t *test, void *arg) -{ - (void) test; - UNMOCK(connection_or_write_var_cell_to_buf); - UNMOCK(tor_tls_get_peer_cert); - UNMOCK(tor_tls_get_own_cert); - UNMOCK(tor_tls_get_tlssecrets); - UNMOCK(connection_or_close_for_error); - UNMOCK(channel_set_circid_type); - UNMOCK(tor_tls_export_key_material); - authenticate_data_t *d = arg; - if (d) { - tor_free(d->cell); - connection_or_clear_identity(d->c1); - connection_or_clear_identity(d->c2); - connection_free_minimal(TO_CONN(d->c1)); - connection_free_minimal(TO_CONN(d->c2)); - circuitmux_free(d->chan2->base_.cmux); - tor_free(d->chan2); - crypto_pk_free(d->key1); - crypto_pk_free(d->key2); - tor_free(d); - } - tor_x509_cert_free(mock_peer_cert); - tor_x509_cert_free(mock_own_cert); - mock_peer_cert = NULL; - mock_own_cert = NULL; - - return 1; -} - -static void * -authenticate_data_setup(const struct testcase_t *test) -{ - authenticate_data_t *d = tor_malloc_zero(sizeof(*d)); - int is_ed = d->is_ed = (test->setup_data == (void*)3); - - scheduler_init(); - - MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell); - MOCK(tor_tls_get_peer_cert, mock_get_peer_cert); - MOCK(tor_tls_get_own_cert, mock_get_own_cert); - MOCK(tor_tls_get_tlssecrets, mock_get_tlssecrets); - MOCK(connection_or_close_for_error, mock_close_for_err); - MOCK(channel_set_circid_type, mock_set_circid_type); - MOCK(tor_tls_export_key_material, mock_export_key_material); - d->c1 = or_connection_new(CONN_TYPE_OR, AF_INET); - d->c2 = or_connection_new(CONN_TYPE_OR, AF_INET); - tor_addr_from_ipv4h(&d->c1->base_.addr, 0x01020304); - tor_addr_from_ipv4h(&d->c2->base_.addr, 0x05060708); - - d->key1 = pk_generate(2); - d->key2 = pk_generate(3); - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - d->key1, d->key2, 86400), OP_EQ, 0); - - init_mock_ed_keys(d->key2); - - d->c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - d->c1->link_proto = 3; - tt_int_op(connection_init_or_handshake_state(d->c1, 1), OP_EQ, 0); - - d->c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - d->c2->link_proto = 3; - tt_int_op(connection_init_or_handshake_state(d->c2, 0), OP_EQ, 0); - var_cell_t *cell = var_cell_new(16); - cell->command = CELL_CERTS; - or_handshake_state_record_var_cell(d->c1, d->c1->handshake_state, cell, 1); - or_handshake_state_record_var_cell(d->c2, d->c2->handshake_state, cell, 0); - memset(cell->payload, 0xf0, 16); - or_handshake_state_record_var_cell(d->c1, d->c1->handshake_state, cell, 0); - or_handshake_state_record_var_cell(d->c2, d->c2->handshake_state, cell, 1); - tor_free(cell); - - d->chan2 = tor_malloc_zero(sizeof(*d->chan2)); - channel_tls_common_init(d->chan2); - d->c2->chan = d->chan2; - d->chan2->conn = d->c2; - d->c2->base_.address = tor_strdup("C2"); - d->c2->tls = tor_tls_new(-1, 1); - d->c2->handshake_state->received_certs_cell = 1; - - const tor_x509_cert_t *id_cert=NULL, *link_cert=NULL, *auth_cert=NULL; - tt_assert(! tor_tls_get_my_certs(1, &link_cert, &id_cert)); - - const uint8_t *der; - size_t sz; - tor_x509_cert_get_der(id_cert, &der, &sz); - d->c1->handshake_state->certs->id_cert = tor_x509_cert_decode(der, sz); - d->c2->handshake_state->certs->id_cert = tor_x509_cert_decode(der, sz); - - if (is_ed) { - d->c1->handshake_state->certs->ed_id_sign = - tor_cert_dup(get_master_signing_key_cert()); - d->c2->handshake_state->certs->ed_id_sign = - tor_cert_dup(get_master_signing_key_cert()); - d->c2->handshake_state->certs->ed_sign_auth = - tor_cert_dup(get_current_auth_key_cert()); - } else { - tt_assert(! tor_tls_get_my_certs(0, &auth_cert, &id_cert)); - tor_x509_cert_get_der(auth_cert, &der, &sz); - d->c2->handshake_state->certs->auth_cert = tor_x509_cert_decode(der, sz); - } - - tor_x509_cert_get_der(link_cert, &der, &sz); - mock_peer_cert = tor_x509_cert_decode(der, sz); - tt_assert(mock_peer_cert); - - mock_own_cert = tor_x509_cert_decode(der, sz); - tt_assert(mock_own_cert); - - /* Make an authenticate cell ... */ - int authtype; - if (is_ed) - authtype = AUTHTYPE_ED25519_SHA256_RFC5705; - else - authtype = AUTHTYPE_RSA_SHA256_TLSSECRET; - tt_int_op(0, OP_EQ, connection_or_send_authenticate_cell(d->c1, authtype)); - - tt_assert(mock_got_var_cell); - d->cell = mock_got_var_cell; - mock_got_var_cell = NULL; - - return d; - done: - authenticate_data_cleanup(test, d); - return NULL; -} - -static struct testcase_setup_t setup_authenticate = { - .setup_fn = authenticate_data_setup, - .cleanup_fn = authenticate_data_cleanup -}; - -static void -test_link_handshake_auth_cell(void *arg) -{ - authenticate_data_t *d = arg; - auth1_t *auth1 = NULL; - crypto_pk_t *auth_pubkey = NULL; - - /* Is the cell well-formed on the outer layer? */ - tt_int_op(d->cell->command, OP_EQ, CELL_AUTHENTICATE); - tt_int_op(d->cell->payload[0], OP_EQ, 0); - if (d->is_ed) - tt_int_op(d->cell->payload[1], OP_EQ, 3); - else - tt_int_op(d->cell->payload[1], OP_EQ, 1); - tt_int_op(ntohs(get_uint16(d->cell->payload + 2)), OP_EQ, - d->cell->payload_len - 4); - - /* Check it out for plausibility... */ - auth_ctx_t ctx; - ctx.is_ed = d->is_ed; - tt_int_op(d->cell->payload_len-4, OP_EQ, auth1_parse(&auth1, - d->cell->payload+4, - d->cell->payload_len - 4, &ctx)); - tt_assert(auth1); - - if (d->is_ed) { - tt_mem_op(auth1->type, OP_EQ, "AUTH0003", 8); - } else { - tt_mem_op(auth1->type, OP_EQ, "AUTH0001", 8); - } - tt_mem_op(auth1->tlssecrets, OP_EQ, "int getRandomNumber(){return 4;}", 32); - - /* Is the signature okay? */ - const uint8_t *start = d->cell->payload+4, *end = auth1->end_of_signed; - if (d->is_ed) { - ed25519_signature_t sig; - tt_int_op(auth1_getlen_sig(auth1), OP_EQ, ED25519_SIG_LEN); - memcpy(&sig.sig, auth1_getarray_sig(auth1), ED25519_SIG_LEN); - tt_assert(!ed25519_checksig(&sig, start, end-start, - &get_current_auth_keypair()->pubkey)); - } else { - uint8_t sig[128]; - uint8_t digest[32]; - tt_int_op(auth1_getlen_sig(auth1), OP_GT, 120); - auth_pubkey = tor_tls_cert_get_key( - d->c2->handshake_state->certs->auth_cert); - int n = crypto_pk_public_checksig( - auth_pubkey, - (char*)sig, sizeof(sig), (char*)auth1_getarray_sig(auth1), - auth1_getlen_sig(auth1)); - tt_int_op(n, OP_EQ, 32); - crypto_digest256((char*)digest, - (const char*)start, end-start, DIGEST_SHA256); - tt_mem_op(sig, OP_EQ, digest, 32); - } - - /* Then feed it to c2. */ - tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); - channel_tls_process_authenticate_cell(d->cell, d->chan2); - tt_int_op(mock_close_called, OP_EQ, 0); - tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1); - if (d->is_ed) { - tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 1); - tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1); - } else { - tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 0); - tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1); - } - - done: - auth1_free(auth1); - crypto_pk_free(auth_pubkey); -} - -#define AUTHENTICATE_FAIL(name, code) \ - static void \ - test_link_handshake_auth_ ## name(void *arg) \ - { \ - authenticate_data_t *d = arg; \ - const char *require_failure_message = NULL; \ - setup_capture_of_logs(LOG_INFO); \ - { code ; } \ - tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \ - channel_tls_process_authenticate_cell(d->cell, d->chan2); \ - tt_int_op(mock_close_called, OP_EQ, 1); \ - tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \ - if (require_failure_message) { \ - expect_log_msg_containing(require_failure_message); \ - } \ - done: \ - teardown_capture_of_logs(); \ - } - -AUTHENTICATE_FAIL(badstate, - require_failure_message = "We're not doing a v3 handshake"; - d->c2->base_.state = OR_CONN_STATE_CONNECTING) -AUTHENTICATE_FAIL(badproto, - require_failure_message = "not using link protocol >= 3"; - d->c2->link_proto = 2) -AUTHENTICATE_FAIL(atclient, - require_failure_message = "We originated this connection"; - d->c2->handshake_state->started_here = 1; - d->c2->handshake_state->certs->started_here = 1;) -AUTHENTICATE_FAIL(duplicate, - require_failure_message = "We already got one"; - d->c2->handshake_state->received_authenticate = 1) -static void -test_link_handshake_auth_already_authenticated(void *arg) -{ - authenticate_data_t *d = arg; - setup_capture_of_logs(LOG_INFO); - d->c2->handshake_state->authenticated = 1; - channel_tls_process_authenticate_cell(d->cell, d->chan2); - tt_int_op(mock_close_called, OP_EQ, 1); - tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1); - expect_log_msg_containing("The peer is already authenticated"); - done: - teardown_capture_of_logs(); -} - -AUTHENTICATE_FAIL(nocerts, - require_failure_message = "We never got a certs cell"; - d->c2->handshake_state->received_certs_cell = 0) -AUTHENTICATE_FAIL(noidcert, - require_failure_message = "We never got an identity " - "certificate"; - tor_x509_cert_free(d->c2->handshake_state->certs->id_cert); - d->c2->handshake_state->certs->id_cert = NULL) -AUTHENTICATE_FAIL(noauthcert, - require_failure_message = "We never got an RSA " - "authentication certificate"; - tor_x509_cert_free(d->c2->handshake_state->certs->auth_cert); - d->c2->handshake_state->certs->auth_cert = NULL) -AUTHENTICATE_FAIL(tooshort, - require_failure_message = "Cell was way too short"; - d->cell->payload_len = 3) -AUTHENTICATE_FAIL(badtype, - require_failure_message = "Authenticator type was not " - "recognized"; - d->cell->payload[0] = 0xff) -AUTHENTICATE_FAIL(truncated_1, - require_failure_message = "Authenticator was truncated"; - d->cell->payload[2]++) -AUTHENTICATE_FAIL(truncated_2, - require_failure_message = "Authenticator was truncated"; - d->cell->payload[3]++) -AUTHENTICATE_FAIL(tooshort_1, - require_failure_message = "Authenticator was too short"; - tt_int_op(d->cell->payload_len, OP_GE, 260); - d->cell->payload[2] -= 1; - d->cell->payload_len -= 256;) -AUTHENTICATE_FAIL(badcontent, - require_failure_message = "Some field in the AUTHENTICATE " - "cell body was not as expected"; - d->cell->payload[10] ^= 0xff) -AUTHENTICATE_FAIL(badsig_1, - if (d->is_ed) - require_failure_message = "Ed25519 signature wasn't valid"; - else - require_failure_message = "RSA signature wasn't valid"; - d->cell->payload[d->cell->payload_len - 5] ^= 0xff) -AUTHENTICATE_FAIL(missing_ed_id, - { - tor_cert_free(d->c2->handshake_state->certs->ed_id_sign); - d->c2->handshake_state->certs->ed_id_sign = NULL; - require_failure_message = "Ed authenticate without Ed ID " - "cert from peer"; - }) -AUTHENTICATE_FAIL(missing_ed_auth, - { - tor_cert_free(d->c2->handshake_state->certs->ed_sign_auth); - d->c2->handshake_state->certs->ed_sign_auth = NULL; - require_failure_message = "We never got an Ed25519 " - "authentication certificate"; - }) - -#define TEST_RSA(name, flags) \ - { #name , test_link_handshake_ ## name, (flags), \ - &passthrough_setup, (void*)"RSA" } - -#define TEST_ED(name, flags) \ - { #name "_ed25519" , test_link_handshake_ ## name, (flags), \ - &passthrough_setup, (void*)"Ed25519" } - -#define TEST_RCV_AUTHCHALLENGE(name) \ - { "recv_authchallenge/" #name , \ - test_link_handshake_recv_authchallenge_ ## name, TT_FORK, \ - &setup_recv_authchallenge, NULL } - -#define TEST_RCV_CERTS(name) \ - { "recv_certs/" #name , \ - test_link_handshake_recv_certs_ ## name, TT_FORK, \ - &setup_recv_certs, (void*)"RSA-Link" } - -#define TEST_RCV_CERTS_RSA(name,type) \ - { "recv_certs/" #name , \ - test_link_handshake_recv_certs_ ## name, TT_FORK, \ - &setup_recv_certs, (void*)type } - -#define TEST_RCV_CERTS_ED(name, type) \ - { "recv_certs/" #name "_ed25519", \ - test_link_handshake_recv_certs_ ## name, TT_FORK, \ - &setup_recv_certs, (void*)type } - -#define TEST_AUTHENTICATE(name) \ - { "authenticate/" #name , test_link_handshake_auth_ ## name, TT_FORK, \ - &setup_authenticate, NULL } - -#define TEST_AUTHENTICATE_ED(name) \ - { "authenticate/" #name "_ed25519" , test_link_handshake_auth_ ## name, \ - TT_FORK, &setup_authenticate, (void*)3 } - -struct testcase_t link_handshake_tests[] = { - TEST_RSA(certs_ok, TT_FORK), - TEST_ED(certs_ok, TT_FORK), - - TEST_RCV_CERTS(ok), - TEST_RCV_CERTS_ED(ok, "Ed25519-Link"), - TEST_RCV_CERTS_RSA(ok_server, "RSA-Auth"), - TEST_RCV_CERTS_ED(ok_server, "Ed25519-Auth"), - TEST_RCV_CERTS(badstate), - TEST_RCV_CERTS(badproto), - TEST_RCV_CERTS(duplicate), - TEST_RCV_CERTS(already_authenticated), - TEST_RCV_CERTS(empty), - TEST_RCV_CERTS(bad_circid), - TEST_RCV_CERTS(truncated_1), - TEST_RCV_CERTS(truncated_2), - TEST_RCV_CERTS(truncated_3), - TEST_RCV_CERTS_ED(truncated_4, "Ed25519-Link"), - TEST_RCV_CERTS_ED(truncated_5, "Ed25519-Link"), - TEST_RCV_CERTS_ED(truncated_6, "Ed25519-Link"), - TEST_RCV_CERTS_ED(truncated_7, "Ed25519-Link"), - TEST_RCV_CERTS(not_x509), - TEST_RCV_CERTS(both_link), - TEST_RCV_CERTS(both_id_rsa), - TEST_RCV_CERTS(both_auth), - TEST_RCV_CERTS_ED(duplicate_id, "Ed25519-Link"), - TEST_RCV_CERTS_ED(duplicate_link, "Ed25519-Link"), - TEST_RCV_CERTS_ED(duplicate_crosscert, "Ed25519-Link"), - TEST_RCV_CERTS_ED(missing_crosscert, "Ed25519-Link"), - TEST_RCV_CERTS_ED(missing_id, "Ed25519-Link"), - TEST_RCV_CERTS_ED(missing_signing_key, "Ed25519-Link"), - TEST_RCV_CERTS_ED(missing_link, "Ed25519-Link"), - TEST_RCV_CERTS_ED(missing_auth, "Ed25519-Auth"), - TEST_RCV_CERTS_ED(missing_rsa_id, "Ed25519-Link"), - TEST_RCV_CERTS_ED(link_mismatch, "Ed25519-Link"), - TEST_RCV_CERTS_ED(bad_ed_sig, "Ed25519-Link"), - TEST_RCV_CERTS_ED(bad_rsa_id_cert, "Ed25519-Link"), - TEST_RCV_CERTS_ED(bad_crosscert, "Ed25519-Link"), - TEST_RCV_CERTS_RSA(expired_rsa_id, "RSA-Link"), - TEST_RCV_CERTS_ED(expired_rsa_id, "Ed25519-Link"), - TEST_RCV_CERTS_ED(expired_ed_id, "Ed25519-Link"), - TEST_RCV_CERTS_ED(expired_ed_link, "Ed25519-Link"), - TEST_RCV_CERTS_ED(expired_crosscert, "Ed25519-Link"), - TEST_RCV_CERTS(wrong_labels_1), - TEST_RCV_CERTS(wrong_labels_2), - TEST_RCV_CERTS(wrong_labels_3), - TEST_RCV_CERTS(server_missing_certs), - TEST_RCV_CERTS(server_wrong_labels_1), - - TEST_RSA(send_authchallenge, TT_FORK), - TEST_RCV_AUTHCHALLENGE(ok), - TEST_RCV_AUTHCHALLENGE(ok_ed25519), - TEST_RCV_AUTHCHALLENGE(ok_noserver), - TEST_RCV_AUTHCHALLENGE(ok_unrecognized), - TEST_RCV_AUTHCHALLENGE(badstate), - TEST_RCV_AUTHCHALLENGE(badproto), - TEST_RCV_AUTHCHALLENGE(as_server), - TEST_RCV_AUTHCHALLENGE(duplicate), - TEST_RCV_AUTHCHALLENGE(nocerts), - TEST_RCV_AUTHCHALLENGE(tooshort), - TEST_RCV_AUTHCHALLENGE(truncated), - TEST_RCV_AUTHCHALLENGE(nonzero_circid), - - TEST_AUTHENTICATE(cell), - TEST_AUTHENTICATE_ED(cell), - TEST_AUTHENTICATE(badstate), - TEST_AUTHENTICATE(badproto), - TEST_AUTHENTICATE(atclient), - TEST_AUTHENTICATE(duplicate), - TEST_AUTHENTICATE(already_authenticated), - TEST_AUTHENTICATE(nocerts), - TEST_AUTHENTICATE(noidcert), - TEST_AUTHENTICATE(noauthcert), - TEST_AUTHENTICATE(tooshort), - TEST_AUTHENTICATE(badtype), - TEST_AUTHENTICATE(truncated_1), - TEST_AUTHENTICATE(truncated_2), - TEST_AUTHENTICATE(tooshort_1), - TEST_AUTHENTICATE(badcontent), - TEST_AUTHENTICATE(badsig_1), - TEST_AUTHENTICATE_ED(badsig_1), - TEST_AUTHENTICATE_ED(missing_ed_id), - TEST_AUTHENTICATE_ED(missing_ed_auth), - //TEST_AUTHENTICATE(), - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_logging.c b/src/tor/src/test/test_logging.c deleted file mode 100644 index e373158e3..000000000 --- a/src/tor/src/test/test_logging.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" -#include "torlog.h" -#include "test.h" - -static void -dummy_cb_fn(int severity, uint32_t domain, const char *msg) -{ - (void)severity; (void)domain; (void)msg; -} - -static void -test_get_sigsafe_err_fds(void *arg) -{ - const int *fds; - int n; - log_severity_list_t include_bug, no_bug, no_bug2; - (void) arg; - init_logging(1); - - n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, OP_EQ, 1); - tt_int_op(fds[0], OP_EQ, STDERR_FILENO); - - set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug); - set_log_severity_config(LOG_WARN, LOG_ERR, &no_bug); - no_bug.masks[0] &= ~(LD_BUG|LD_GENERAL); - set_log_severity_config(LOG_INFO, LOG_NOTICE, &no_bug2); - - /* Add some logs; make sure the output is as expected. */ - mark_logs_temp(); - add_stream_log(&include_bug, "dummy-1", 3); - add_stream_log(&no_bug, "dummy-2", 4); - add_stream_log(&no_bug2, "dummy-3", 5); - add_callback_log(&include_bug, dummy_cb_fn); - close_temp_logs(); - tor_log_update_sigsafe_err_fds(); - - n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, OP_EQ, 2); - tt_int_op(fds[0], OP_EQ, STDERR_FILENO); - tt_int_op(fds[1], OP_EQ, 3); - - /* Allow STDOUT to replace STDERR. */ - add_stream_log(&include_bug, "dummy-4", STDOUT_FILENO); - tor_log_update_sigsafe_err_fds(); - n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, OP_EQ, 2); - tt_int_op(fds[0], OP_EQ, 3); - tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); - - /* But don't allow it to replace explicit STDERR. */ - add_stream_log(&include_bug, "dummy-5", STDERR_FILENO); - tor_log_update_sigsafe_err_fds(); - n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, OP_EQ, 3); - tt_int_op(fds[0], OP_EQ, STDERR_FILENO); - tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); - tt_int_op(fds[2], OP_EQ, 3); - - /* Don't overflow the array. */ - { - int i; - for (i=5; i<20; ++i) { - add_stream_log(&include_bug, "x-dummy", i); - } - } - tor_log_update_sigsafe_err_fds(); - n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, OP_EQ, 8); - - done: - ; -} - -static void -test_sigsafe_err(void *arg) -{ - const char *fn=get_fname("sigsafe_err_log"); - char *content=NULL; - log_severity_list_t include_bug; - smartlist_t *lines = smartlist_new(); - (void)arg; - - set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug); - - init_logging(1); - mark_logs_temp(); - add_file_log(&include_bug, fn, 0); - tor_log_update_sigsafe_err_fds(); - close_temp_logs(); - - close(STDERR_FILENO); - log_err(LD_BUG, "Say, this isn't too cool."); - tor_log_err_sigsafe("Minimal.\n", NULL); - - set_log_time_granularity(100*1000); - tor_log_err_sigsafe("Testing any ", - "attempt to manually log ", - "from a signal.\n", - NULL); - mark_logs_temp(); - close_temp_logs(); - close(STDERR_FILENO); - content = read_file_to_str(fn, 0, NULL); - - tt_ptr_op(content, OP_NE, NULL); - tor_split_lines(lines, content, (int)strlen(content)); - tt_int_op(smartlist_len(lines), OP_GE, 5); - - if (strstr(smartlist_get(lines, 0), "opening new log file")) - smartlist_del_keeporder(lines, 0); - tt_assert(strstr(smartlist_get(lines, 0), "Say, this isn't too cool")); - /* Next line is blank. */ - tt_assert(!strcmpstart(smartlist_get(lines, 1), "==============")); - tt_assert(!strcmpstart(smartlist_get(lines, 2), "Minimal.")); - /* Next line is blank. */ - tt_assert(!strcmpstart(smartlist_get(lines, 3), "==============")); - tt_str_op(smartlist_get(lines, 4), OP_EQ, - "Testing any attempt to manually log from a signal."); - - done: - tor_free(content); - smartlist_free(lines); -} - -static void -test_ratelim(void *arg) -{ - (void) arg; - ratelim_t ten_min = RATELIM_INIT(10*60); - - const time_t start = 1466091600; - time_t now = start; - /* Initially, we're ready. */ - - char *msg = NULL; - - msg = rate_limit_log(&ten_min, now); - tt_ptr_op(msg, OP_NE, NULL); - tt_str_op(msg, OP_EQ, ""); /* nothing was suppressed. */ - - tt_int_op(ten_min.last_allowed, OP_EQ, now); - tor_free(msg); - - int i; - for (i = 0; i < 9; ++i) { - now += 60; /* one minute has passed. */ - msg = rate_limit_log(&ten_min, now); - tt_ptr_op(msg, OP_EQ, NULL); - tt_int_op(ten_min.last_allowed, OP_EQ, start); - tt_int_op(ten_min.n_calls_since_last_time, OP_EQ, i + 1); - } - - now += 240; /* Okay, we can be done. */ - msg = rate_limit_log(&ten_min, now); - tt_ptr_op(msg, OP_NE, NULL); - tt_str_op(msg, OP_EQ, - " [9 similar message(s) suppressed in last 600 seconds]"); - done: - tor_free(msg); -} - -struct testcase_t logging_tests[] = { - { "sigsafe_err_fds", test_get_sigsafe_err_fds, TT_FORK, NULL, NULL }, - { "sigsafe_err", test_sigsafe_err, TT_FORK, NULL, NULL }, - { "ratelim", test_ratelim, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_microdesc.c b/src/tor/src/test/test_microdesc.c deleted file mode 100644 index 59b28f758..000000000 --- a/src/tor/src/test/test_microdesc.c +++ /dev/null @@ -1,857 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" - -#include "config.h" -#include "dirvote.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "routerlist.h" -#include "routerparse.h" -#include "torcert.h" - -#include "test.h" - -#ifdef _WIN32 -/* For mkdir() */ -#include -#else -#include -#endif /* defined(_WIN32) */ - -static const char test_md1[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n" - "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n" - "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char test_md2[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMIixIowh2DyPmDNMDwBX2DHcYcqdcH1zdIQJZkyV6c6rQHnvbcaDoSg\n" - "jgFSLJKpnGmh71FVRqep+yVB0zI1JY43kuEnXry2HbZCD9UDo3d3n7t015X5S7ON\n" - "bSSYtQGPwOr6Epf96IF6DoQxy4iDnPUAlejuhAG51s1y6/rZQ3zxAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n"; - -static const char test_md3[] = - "@last-listed 2009-06-22\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMH3340d4ENNGrqx7UxT+lB7x6DNUKOdPEOn4teceE11xlMyZ9TPv41c\n" - "qj2fRZzfxlc88G/tmiaHshmdtEpklZ740OFqaaJVj4LjPMKFNE+J7Xc1142BE9Ci\n" - "KgsbjGYe2RY261aADRWLetJ8T9QDMm+JngL4288hc8pq1uB/3TAbAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p accept 1-700,800-1000\n" - "family nodeX nodeY nodeZ\n"; - -static void -test_md_cache(void *data) -{ - or_options_t *options = NULL; - microdesc_cache_t *mc = NULL ; - smartlist_t *added = NULL, *wanted = NULL; - microdesc_t *md1, *md2, *md3; - char d1[DIGEST256_LEN], d2[DIGEST256_LEN], d3[DIGEST256_LEN]; - const char *test_md3_noannotation = strchr(test_md3, '\n')+1; - time_t time1, time2, time3; - char *fn = NULL, *s = NULL; - (void)data; - - options = get_options_mutable(); - tt_assert(options); - - time1 = time(NULL); - time2 = time(NULL) - 2*24*60*60; - time3 = time(NULL) - 15*24*60*60; - - /* Possibly, turn this into a test setup/cleanup pair */ - tor_free(options->CacheDirectory); - options->CacheDirectory = tor_strdup(get_fname("md_datadir_test")); -#ifdef _WIN32 - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); -#else - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); -#endif - - tt_assert(!strcmpstart(test_md3_noannotation, "onion-key")); - - crypto_digest256(d1, test_md1, strlen(test_md1), DIGEST_SHA256); - crypto_digest256(d2, test_md2, strlen(test_md1), DIGEST_SHA256); - crypto_digest256(d3, test_md3_noannotation, strlen(test_md3_noannotation), - DIGEST_SHA256); - - mc = get_microdesc_cache(); - - added = microdescs_add_to_cache(mc, test_md1, NULL, SAVED_NOWHERE, 0, - time1, NULL); - tt_int_op(1, OP_EQ, smartlist_len(added)); - md1 = smartlist_get(added, 0); - smartlist_free(added); - added = NULL; - - wanted = smartlist_new(); - added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, - time2, wanted); - /* Should fail, since we didn't list test_md2's digest in wanted */ - tt_int_op(0, OP_EQ, smartlist_len(added)); - smartlist_free(added); - added = NULL; - - smartlist_add(wanted, tor_memdup(d2, DIGEST256_LEN)); - smartlist_add(wanted, tor_memdup(d3, DIGEST256_LEN)); - added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, - time2, wanted); - /* Now it can work. md2 should have been added */ - tt_int_op(1, OP_EQ, smartlist_len(added)); - md2 = smartlist_get(added, 0); - /* And it should have gotten removed from 'wanted' */ - tt_int_op(smartlist_len(wanted), OP_EQ, 1); - tt_mem_op(smartlist_get(wanted, 0), OP_EQ, d3, DIGEST256_LEN); - smartlist_free(added); - added = NULL; - - added = microdescs_add_to_cache(mc, test_md3, NULL, - SAVED_NOWHERE, 0, -1, NULL); - /* Must fail, since SAVED_NOWHERE precludes annotations */ - tt_int_op(0, OP_EQ, smartlist_len(added)); - smartlist_free(added); - added = NULL; - - added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, - SAVED_NOWHERE, 0, time3, NULL); - /* Now it can work */ - tt_int_op(1, OP_EQ, smartlist_len(added)); - md3 = smartlist_get(added, 0); - smartlist_free(added); - added = NULL; - - /* Okay. We added 1...3. Let's poke them to see how they look, and make - * sure they're really in the journal. */ - tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(md3, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); - - tt_int_op(md1->last_listed, OP_EQ, time1); - tt_int_op(md2->last_listed, OP_EQ, time2); - tt_int_op(md3->last_listed, OP_EQ, time3); - - tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_JOURNAL); - tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_JOURNAL); - tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); - - tt_int_op(md1->bodylen, OP_EQ, strlen(test_md1)); - tt_int_op(md2->bodylen, OP_EQ, strlen(test_md2)); - tt_int_op(md3->bodylen, OP_EQ, strlen(test_md3_noannotation)); - tt_mem_op(md1->body, OP_EQ, test_md1, strlen(test_md1)); - tt_mem_op(md2->body, OP_EQ, test_md2, strlen(test_md2)); - tt_mem_op(md3->body, OP_EQ, test_md3_noannotation, - strlen(test_md3_noannotation)); - - tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs.new", - options->CacheDirectory); - s = read_file_to_str(fn, RFTS_BIN, NULL); - tt_assert(s); - tt_mem_op(md1->body, OP_EQ, s + md1->off, md1->bodylen); - tt_mem_op(md2->body, OP_EQ, s + md2->off, md2->bodylen); - tt_mem_op(md3->body, OP_EQ, s + md3->off, md3->bodylen); - - tt_ptr_op(md1->family, OP_EQ, NULL); - tt_ptr_op(md3->family, OP_NE, NULL); - tt_int_op(smartlist_len(md3->family), OP_EQ, 3); - tt_str_op(smartlist_get(md3->family, 0), OP_EQ, "nodeX"); - - /* Now rebuild the cache! */ - tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); - - tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); - tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); - tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); - - /* The journal should be empty now */ - tor_free(s); - s = read_file_to_str(fn, RFTS_BIN, NULL); - tt_str_op(s, OP_EQ, ""); - tor_free(s); - tor_free(fn); - - /* read the cache. */ - tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", - options->CacheDirectory); - s = read_file_to_str(fn, RFTS_BIN, NULL); - tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); - tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); - tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); - - /* Okay, now we are going to forget about the cache entirely, and reload it - * from the disk. */ - microdesc_free_all(); - mc = get_microdesc_cache(); - md1 = microdesc_cache_lookup_by_digest256(mc, d1); - md2 = microdesc_cache_lookup_by_digest256(mc, d2); - md3 = microdesc_cache_lookup_by_digest256(mc, d3); - tt_assert(md1); - tt_assert(md2); - tt_assert(md3); - tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); - tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); - tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); - - tt_int_op(md1->last_listed, OP_EQ, time1); - tt_int_op(md2->last_listed, OP_EQ, time2); - tt_int_op(md3->last_listed, OP_EQ, time3); - - /* Okay, now we are going to clear out everything older than a week old. - * In practice, that means md3 */ - microdesc_cache_clean(mc, time(NULL)-7*24*60*60, 1/*force*/); - tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); - md3 = NULL; /* it's history now! */ - - /* rebuild again, make sure it stays gone. */ - tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); - tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); - - /* Re-add md3, and make sure we can rebuild the cache. */ - added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, - SAVED_NOWHERE, 0, time3, NULL); - tt_int_op(1, OP_EQ, smartlist_len(added)); - md3 = smartlist_get(added, 0); - smartlist_free(added); - added = NULL; - tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); - tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); - tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); - - tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); - tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); - - done: - if (options) - tor_free(options->CacheDirectory); - microdesc_free_all(); - - smartlist_free(added); - if (wanted) - SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); - smartlist_free(wanted); - tor_free(s); - tor_free(fn); -} - -static const char truncated_md[] = - "@last-listed 2013-08-08 19:02:59\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM91vLFNaM+gGhnRIdz2Cm/Kl7Xz0cOobIdVzhS3cKUJfk867hCuTipS\n" - "NveLBzNopvgXKruAAzEj3cACxk6Q8lv5UWOGCD1UolkgsWSE62RBjap44g+oc9J1\n" - "RI9968xOTZw0VaBQg9giEILNXl0djoikQ+5tQRUvLDDa67gpa5Q1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "family @\n"; - -static void -test_md_cache_broken(void *data) -{ - or_options_t *options; - char *fn=NULL; - microdesc_cache_t *mc = NULL; - - (void)data; - - options = get_options_mutable(); - tt_assert(options); - tor_free(options->CacheDirectory); - options->CacheDirectory = tor_strdup(get_fname("md_datadir_test2")); - -#ifdef _WIN32 - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); -#else - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); -#endif - - tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", - options->CacheDirectory); - - write_str_to_file(fn, truncated_md, 1); - - mc = get_microdesc_cache(); - tt_assert(mc); - - done: - if (options) - tor_free(options->CacheDirectory); - tor_free(fn); - microdesc_free_all(); -} - -/* Generated by chutney. */ -static const char test_ri[] = - "router test005r 127.0.0.1 5005 0 7005\n" - "platform Tor 0.2.5.4-alpha-dev on Linux\n" - "protocols Link 1 2 Circuit 1\n" - "published 2014-05-06 22:57:55\n" - "fingerprint 09DE 3BA2 48C2 1C3F 3760 6CD3 8460 43A6 D5EC F59E\n" - "uptime 0\n" - "bandwidth 1073741824 1073741824 0\n" - "extra-info-digest 361F9428F9FA4DD854C03DDBCC159D0D9FA996C9\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" - "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" - "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANbGUC4802Ke6C3nOVxN0U0HhIRrs32cQFEL4v+UUMJPgjbistHBvOax\n" - "CWVR/sMXM2kKJeGThJ9ZUs2p9dDG4WHPUXgkMqzTTEeeFa7pQKU0brgbmLaJq0Pi\n" - "mxmqC5RkTHa5bQvq6QlSFprAEoovV27cWqBM9jVdV9hyc//6kwPzAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "hidden-service-dir\n" - "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" - "reject *:25\n" - "reject *:119\n" - "reject *:135-139\n" - "reject *:445\n" - "reject *:563\n" - "reject *:1214\n" - "reject *:4661-4666\n" - "reject *:6346-6429\n" - "reject *:6699\n" - "reject *:6881-6999\n" - "accept *:*\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "ImzX5PF2vRCrG1YzGToyjoxYhgh1vtHEDjmP+tIS/iil1DSnHZNpHSuHp0L1jE9S\n" - "yZyrtKaqpBE/aecAM3j4CWCn/ipnAAQkHcyRLin1bYvqBtRzyopVCRlUhF+uWrLq\n" - "t0xkIE39ss/EwmQr7iIgkdVH4oRIMsjYnFFJBG26nYY=\n" - "-----END SIGNATURE-----\n"; - -static const char test_ri2[] = - "router test001a 127.0.0.1 5001 0 7001\n" - "identity-ed25519\n" - "-----BEGIN ED25519 CERT-----\n" - "AQQABf/FAf5iDuKCZP2VxnAaQWdklilAh6kaEeFX4z8261Yx2T1/AQAgBADCp8vO\n" - "B8K1F9g2DzwuwvVCnPFLSK1qknVqPpNucHLH9DY7fuIYogBAdz4zHv1qC7RKaMNG\n" - "Jux/tMO2tzPcm62Ky5PjClMQplKUOnZNQ+RIpA3wYCIfUDy/cQnY7XWgNQ0=\n" - "-----END ED25519 CERT-----\n" - "platform Tor 0.2.6.0-alpha-dev on Darwin\n" - "protocols Link 1 2 Circuit 1\n" - "published 2014-10-08 12:58:04\n" - "fingerprint B7E2 7F10 4213 C36F 13E7 E982 9182 845E 4959 97A0\n" - "uptime 0\n" - "bandwidth 1073741824 1073741824 0\n" - "extra-info-digest 568F27331B6D8C73E7024F1EF5D097B90DFC7CDB\n" - "caches-extra-info\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" - "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" - "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "signing-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAN8+78KUVlgHXdMMkYJxcwh1Zv2y+Gb5eWUyltUaQRajhrT9ij2T5JZs\n" - "M0g85xTcuM3jNVVpV79+33hiTohdC6UZ+Bk4USQ7WBFzRbVFSXoVKLBJFkCOIexg\n" - "SMGNd5WEDtHWrXl58mizmPFu1eG6ZxHzt7RuLSol5cwBvawXPNkFAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "onion-key-crosscert\n" - "-----BEGIN CROSSCERT-----\n" - "ETFDzU49bvNfoZnKK1j6JeBP2gDirgj6bBCgWpUYs663OO9ypbZRO0JwWANssKl6\n" - "oaq9vKTsKGRsaNnqnz/JGMhehymakjjNtqg7crWwsahe8+7Pw9GKmW+YjFtcOkUf\n" - "KfOn2bmKBa1FoJb4yW3oXzHcdlLSRuCciKqPn+Hky5o=\n" - "-----END CROSSCERT-----\n" - "ntor-onion-key-crosscert 0\n" - "-----BEGIN ED25519 CERT-----\n" - "AQoABf2dAcKny84HwrUX2DYPPC7C9UKc8UtIrWqSdWo+k25wcsf0AFohutG+xI06\n" - "Ef21c5Zl1j8Hw6DzHDjYyJevXLFuOneaL3zcH2Ldn4sjrG3kc5UuVvRfTvV120UO\n" - "xk4f5s5LGwY=\n" - "-----END ED25519 CERT-----\n" - "hidden-service-dir\n" - "contact auth1@test.test\n" - "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" - "reject *:*\n" - "router-sig-ed25519 5aQXyTif7PExIuL2di37UvktmJECKnils2OWz2vDi" - "hFxi+5TTAAPxYkS5clhc/Pjvw34itfjGmTKFic/8httAQ\n" - "router-signature\n" - "-----BEGIN SIGNATURE-----\n" - "BaUB+aFPQbb3BwtdzKsKqV3+6cRlSqJF5bI3UTmwRoJk+Z5Pz+W5NWokNI0xArHM\n" - "T4T5FZCCP9350jXsUCIvzyIyktU6aVRCGFt76rFlo1OETpN8GWkMnQU0w18cxvgS\n" - "cf34GXHv61XReJF3AlzNHFpbrPOYmowmhrTULKyMqow=\n" - "-----END SIGNATURE-----\n"; - -static const char test_md_8[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" - "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" - "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"; - -static const char test_md_16[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" - "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" - "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" - "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"; - -static const char test_md_18[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n" - "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n" - "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n" - "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" - "id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4\n"; - -static const char test_md2_18[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" - "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" - "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" - "id rsa1024 t+J/EEITw28T5+mCkYKEXklZl6A\n"; - -static const char test_md2_21[] = - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n" - "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n" - "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n" - "id ed25519 wqfLzgfCtRfYNg88LsL1QpzxS0itapJ1aj6TbnByx/Q\n"; - -static void -test_md_generate(void *arg) -{ - routerinfo_t *ri; - microdesc_t *md = NULL; - (void)arg; - - ri = router_parse_entry_from_string(test_ri, NULL, 0, 0, NULL, NULL); - tt_assert(ri); - md = dirvote_create_microdescriptor(ri, 8); - tt_str_op(md->body, OP_EQ, test_md_8); - - /* XXXX test family lines. */ - /* XXXX test method 14 for A lines. */ - /* XXXX test method 15 for P6 lines. */ - - microdesc_free(md); - md = NULL; - md = dirvote_create_microdescriptor(ri, 16); - tt_str_op(md->body, OP_EQ, test_md_16); - - microdesc_free(md); - md = NULL; - md = dirvote_create_microdescriptor(ri, 18); - tt_str_op(md->body, OP_EQ, test_md_18); - - microdesc_free(md); - md = NULL; - md = dirvote_create_microdescriptor(ri, 21); - tt_str_op(md->body, OP_EQ, test_md_18); - - routerinfo_free(ri); - ri = router_parse_entry_from_string(test_ri2, NULL, 0, 0, NULL, NULL); - - microdesc_free(md); - md = NULL; - md = dirvote_create_microdescriptor(ri, 18); - tt_str_op(md->body, OP_EQ, test_md2_18); - - microdesc_free(md); - md = NULL; - md = dirvote_create_microdescriptor(ri, 21); - tt_str_op(md->body, OP_EQ, test_md2_21); - tt_assert(ed25519_pubkey_eq(md->ed25519_identity_pkey, - &ri->cache_info.signing_key_cert->signing_key)); - - done: - microdesc_free(md); - routerinfo_free(ri); -} - -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -DISABLE_GCC_WARNING(overlength-strings) -/* We allow huge string constants in the unit tests, but not in the code - * at large. */ -#endif -/* Taken at random from my ~/.tor/cached-microdescs file and then - * hand-munged */ -static const char MD_PARSE_TEST_DATA[] = - /* Good 0 */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANsKd1GRfOuSR1MkcwKqs6SVy4Gi/JXplt/bHDkIGm6Q96TeJ5uyVgUL\n" - "DBr/ij6+JqgVFeriuiMzHKREytzjdaTuKsKBFFpLwb+Ppcjr5nMIH/AR6/aHO8hW\n" - "T3B9lx5T6Kl7CqZ4yqXxYRHzn50EPTIZuz0y9se4J4gi9mLmL+pHAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p accept 20-23,43,53,79-81,88,110,143,194,220,443,464,531,543-544\n" - "id rsa1024 GEo59/iR1GWSIWZDzXTd5QxtqnU\n" - /* Bad 0: I've messed with the onion-key in the second one. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMr4o/pflVwscx11vC1AKEADlKEqnhpvCIjAEzNEenMhvGQHRlA0EXLC\n" - "7G7O5bhnCwEHqK8Pvg8cuX/fD8v08TF1EVPhwPa0UI6ab8KnPP2F!!!!!!b92DG7EQIk3q\n" - "d68Uxp7E9/t3v1WWZjzDqvEe0par6ul+DKW6HMlTGebFo5Q4e8R1AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key 761Dmm27via7lXygNHM3l+oJLrYU2Nye0Uz4pkpipyY=\n" - "p accept 53\n" - "id rsa1024 3Y4fwXhtgkdGDZ5ef5mtb6TJRQQ\n" - /* Good 1 */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANsMSjVi3EX8ZHfm/dvPF6KdVR66k1tVul7Jp+dDbDajBYNhgKRzVCxy\n" - "Yac1CBuQjOqK89tKap9PQBnhF087eDrfaZDqYTLwB2W2sBJncVej15WEPXPRBifo\n" - "iFZ8337kgczkaY+IOfSuhtbOUyDOoDpRJheIKBNq0ZiTqtLbbadVAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key ncfiHJjSgdDEW/gc6q6/7idac7j+x7ejQrRm6i75pGA=\n" - "p accept 443,6660-6669,6697,7000-7001\n" - "id rsa1024 XXuLzw3mfBELEq3veXoNhdehwD4\n" - /* Good 2 */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANQfBlrHrh9F/CAOytrNFgi0ikWMW/HZxuoszF9X+AQ+MudR8bcxxOGl\n" - "1RFwb74s8E3uuzrCkNFvSw9Ar1L02F2DOX0gLsxEGuYC4Ave9NUteGqSqDyEJQUJ\n" - "KlfxCPn2qC9nvNT7wR/Dg2WRvAEKnJmkpb57N3+WSAOPLjKOFEz3AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key AppBt6CSeb1kKid/36ototmFA24ddfW5JpjWPLuoJgs=\n" - "id rsa1024 6y60AEI9a1PUUlRPO0YQT9WzrjI\n" - /* Bad 1: Here I've messed with the ntor key */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAPjy2HacU3jDNO5nTOFGSwNa0qKCNn4yhtrDVcAJ5alIQeBWZZGJLZ0q\n" - "Cqylw1vYqxu8E09g+QXXFbAgBv1U9TICaATxrIJhIJzc8TJPhqJemp1kq0DvHLDx\n" - "mxwlkNnCD/P5NS+JYB3EjOlU9EnSKUWNU61+Co344m2JqhEau40vAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key 4i2Fp9JHTUr1uQs0pxD5j5spl4/RG56S2P0gQxU=\n" - "id rsa1024 nMRmNEGysA0NmlALVaUmI7D5jLU\n" - /* Good 3: I've added a weird token in this one. This shouldn't prevent - * it parsing */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKmosxudyNA/yJNz3S890VqV/ebylzoD11Sc0b/d5tyNNaNZjcYy5vRD\n" - "kwyxFRMbP2TLZQ1zRfNwY7IDnYjU2SbW0pxuM6M8WRtsmx/YOE3kHMVAFJNrTUqU\n" - "6D1zB3IiRDS5q5+NoRxwqo+hYUck60O3WTwEoqb+l3lvXeu7z9rFAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "flux-capacitor 1.21 GW\n" - "ntor-onion-key MWBoEkl+RlBiGX44XKIvTSqbznTNZStOmUYtcYRQQyY=\n" - "id rsa1024 R+A5O9qRvRac4FT3C4L2QnFyxsc\n" - /* Good 4: Here I've made the 'id rsa' token odd. It should still parse - * just fine. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAOh+WMkdNe/Pkjb8UjQyfLOlFgpuVFrxAIGnJsmWWx0yBE97DQxGyh2n\n" - "h8G5OJZHRarJQyCIf7vpZQAi0oP0OkGGaCaDQsM+D8TnqhnU++RWGnMqY/cXxPrL\n" - "MEq+n6aGiLmzkO7ah8yorZpoREk4GqLUIN89/tHHGOhJL3c4CPGjAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" - "id rsa1234 jlqAKFD2E7uMKv+8TmKSeo7NBho\n" - /* Good 5: Extra id type. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAMdgPPc5uaw4y/q+SUTN/I8Y+Gvdx9kKgWV4dmDGJ0mxsVZmo1v6+v3F\n" - "12M2f9m99G3WB8F8now29C+9XyEv8MBHj1lHRdUFHSQes3YTFvDNlgj+FjLqO5TJ\n" - "adOOmfu4DCUUtUEDyQKbNVL4EkMTXY73omTVsjcH3xxFjTx5wixhAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key AAVnWZcnDbxasdZwKqb4fL6O9sZV+XsRNHTpNd1YMz8=\n" - "id rsa1024 72EfBL11QuwX2vU8y+p9ExGfGEg\n" - "id expolding hedgehog 0+A5O9qRvRac4FT3C4L2QnFyxsc\n" - /* Good 6: I've given this a bogus policy. It should parse. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALNuufwhPMF8BooxYMNvhYJMPqUB8hQDt8wGmPKphJcD1sVD1i4gAZM2\n" - "HIo+zUBlljDrRWL5NzVzd1yxUJAiQxvXS5dRRFY3B70M7wTVpXw53xe0/BM5t1AX\n" - "n0MFk7Jl6XIKMlzRalZvmMvE/odtyWXkP4Nd1MyZ1QcIwrQ2iwyrAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p condone 1-10\n" - "ntor-onion-key 2/nMJ+L4dd/2GpMyTYjz3zC59MvQy4MIzJZhdzKHekg=\n" - "id rsa1024 FHyh10glEMA6MCmBb5R9Y+X/MhQ\n" - /* Good 7: I've given this one another sort of odd policy. Should parse. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAKcd3FmQ8iAADghyvX8eca0ePqtJ2w1IDdUdTlf5Y/8+OMdp//sD01yC\n" - "YmiX45LK5ge1O3AzcakYCO6fb3pyIqvXdvm24OjyYZELQ40cmKSLjdhcSf4Fr/N9\n" - "uR/CkknR9cEePu1wZ5WBIGmGdXI6s7t3LB+e7XFyBYAx6wMGlnX7AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "p accept frogs-mice\n" - "ntor-onion-key AMxvhaQ1Qg7jBJFoyHuPRgETvLbFmJ194hExV24FuAI=\n" - "family $D8CFEA0D996F5D1473D2063C041B7910DB23981E\n" - "id rsa1024 d0VVZC/cHh1P3y4MMbfKlQHFycc\n" - /* Good 8: This one has the ntor-onion-key without terminating =. That's - * allowed. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAL438YfjrJE2SPqkkXeQwICygu8KNO54Juj6sjqk5hgsiazIWMOBgbaX\n" - "LIRqPNGaiSq01xSqwjwCBCfwZYT/nSdDBqj1h9aoR8rnjxZjyQ+m3rWpdDqeCDMx\n" - "I3NgZ5w4bNX4poRb42lrV6NmQiFdjzpqszVbv5Lpn2CSKu32CwKVAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key UKL6Dnj2KwYsFlkCvOkXVatxvOPB4MaxqwPQQgZMTwI\n" - "id rsa1024 FPIXc6k++JnKCtSKWUxaR6oXEKs\n" - /* Good 9: Another totally normal one.*/ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBANNGIKRd8PFNXkJ2JPV1ohDMFNbJwKbwybeieaQFjtU9KWedHCbr+QD4\n" - "B6zNY5ysguNjHNnlq2f6D09+uhnfDBON8tAz0mPQH/6JqnOXm+EiUn+8bN0E8Nke\n" - "/i3GEgDeaxJJMNQcpsJvmmSmKFOlYy9Fy7ejAjTGqtAnqOte7BnTAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key gUsq3e5iYgsQQvyxINtLzBpHxmIt5rtuFlEbKfI4gFk=\n" - "id rsa1024 jv+LdatDzsMfEW6pLBeL/5uzwCc\n" - /* Bad 2: RSA key has bad exponent of 3. */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGHAoGBAMMTWtvPxYnUNJ5Y7B+XENcpxzPoGstrdiUszCBS+/42xvluLJ+JDSdR\n" - "qJaMD6ax8vKAeLS5C6O17MNdG2VldlPRbtgl41MXsOoUqEJ+nY9e3WG9Snjp47xC\n" - "zmWIfeduXSavIsb3a43/MLIz/9qO0TkgAAiuQr79JlwKhLdzCqTLAgED\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key NkRB4wTUFogiVp5jYmjGORe2ffb/y5Kk8Itw8jdzMjA=\n" - "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n" - "id rsa1024 fKvYjP7TAjCC1FzYee5bYAwYkoDg\n" - /* Bad 3: Bogus annotation */ - "@last-listed with strange aeons\n" - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBALcRBFNCZtpd2TFJysU77/fJMFzKisRQEBOtDGtTZ2Bg4aEGosssa0Id\n" - "YtUagRLYle08QVGvGB+EHBI5qf6Ah2yPH7k5QiN2a3Sq+nyh85dXKPazBGBBbM+C\n" - "DOfDauV02CAnADNMLJEf1voY3oBVvYyIsmHxn5i1R19ZYIiR8NX5AgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "ntor-onion-key m4xcFXMWMjCvZDXq8FT3XmS0EHYseGOeu+fV+6FYDlk=\n" - "p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544\n" - "id rsa1024 SSbfNE9vmaiwRKH+eqNAkiKQhds\n" - /* Good 10: Normal, with added ipv6 address and added other address */ - "onion-key\n" - "-----BEGIN RSA PUBLIC KEY-----\n" - "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n" - "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n" - "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n" - "-----END RSA PUBLIC KEY-----\n" - "a [::1:2:3:4]:9090\n" - "a 18.0.0.1:9999\n" - "ntor-onion-key k2yFqTU2vzMCQDEiE/j9UcEHxKrXMLpB3IL0or09sik=\n" - "id rsa1024 2A8wYpHxnkKJ92orocvIQBzeHlE\n" - "p6 allow 80\n" - ; -#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS -ENABLE_GCC_WARNING(overlength-strings) -#endif - -/** More tests for parsing different kinds of microdescriptors, and getting - * invalid digests trackd from them. */ -static void -test_md_parse(void *arg) -{ - (void) arg; - char *mem_op_hex_tmp = NULL; - smartlist_t *invalid = smartlist_new(); - - smartlist_t *mds = microdescs_parse_from_string(MD_PARSE_TEST_DATA, - NULL, 1, SAVED_NOWHERE, - invalid); - tt_int_op(smartlist_len(mds), OP_EQ, 11); - tt_int_op(smartlist_len(invalid), OP_EQ, 4); - - test_memeq_hex(smartlist_get(invalid,0), - "5d76bf1c6614e885614a1e0ad074e1ab" - "4ea14655ebeefb1736a71b5ed8a15a51"); - test_memeq_hex(smartlist_get(invalid,1), - "2fde0ee3343669c2444cd9d53cbd39c6" - "a7d1fc0513513e840ca7f6e68864b36c"); - test_memeq_hex(smartlist_get(invalid,2), - "20d1576c5ab11bbcff0dedb1db4a3cfc" - "c8bc8dd839d8cbfef92d00a1a7d7b294"); - test_memeq_hex(smartlist_get(invalid,3), - "074770f394c73dbde7b44412e9692add" - "691a478d4727f9804b77646c95420a96"); - - /* Spot-check the valid ones. */ - const microdesc_t *md = smartlist_get(mds, 5); - test_memeq_hex(md->digest, - "54bb6d733ddeb375d2456c79ae103961" - "da0cae29620375ac4cf13d54da4d92b3"); - tt_int_op(md->last_listed, OP_EQ, 0); - tt_int_op(md->saved_location, OP_EQ, SAVED_NOWHERE); - tt_int_op(md->no_save, OP_EQ, 0); - tt_uint_op(md->held_in_map, OP_EQ, 0); - tt_uint_op(md->held_by_nodes, OP_EQ, 0); - tt_assert(md->onion_curve25519_pkey); - - md = smartlist_get(mds, 6); - test_memeq_hex(md->digest, - "53f740bd222ab37f19f604b1d3759aa6" - "5eff1fbce9ac254bd0fa50d4af9b1bae"); - tt_assert(! md->exit_policy); - - md = smartlist_get(mds, 8); - test_memeq_hex(md->digest, - "a0a155562d8093d8fd0feb7b93b7226e" - "17f056c2142aab7a4ea8c5867a0376d5"); - tt_assert(md->onion_curve25519_pkey); - - md = smartlist_get(mds, 10); - test_memeq_hex(md->digest, - "409ebd87d23925a2732bd467a92813c9" - "21ca378fcb9ca193d354c51550b6d5e9"); - tt_assert(tor_addr_family(&md->ipv6_addr) == AF_INET6); - tt_int_op(md->ipv6_orport, OP_EQ, 9090); - - done: - SMARTLIST_FOREACH(mds, microdesc_t *, mdsc, microdesc_free(mdsc)); - smartlist_free(mds); - SMARTLIST_FOREACH(invalid, char *, cp, tor_free(cp)); - smartlist_free(invalid); - tor_free(mem_op_hex_tmp); -} - -static int mock_rgsbd_called = 0; -static routerstatus_t *mock_rgsbd_val_a = NULL; -static routerstatus_t *mock_rgsbd_val_b = NULL; -static routerstatus_t * -mock_router_get_status_by_digest(networkstatus_t *c, const char *d) -{ - (void) c; - ++mock_rgsbd_called; - - if (fast_memeq(d, "\x5d\x76", 2)) { - memcpy(mock_rgsbd_val_a->descriptor_digest, d, 32); - return mock_rgsbd_val_a; - } else if (fast_memeq(d, "\x20\xd1", 2)) { - memcpy(mock_rgsbd_val_b->descriptor_digest, d, 32); - return mock_rgsbd_val_b; - } else { - return NULL; - } -} - -static networkstatus_t *mock_ns_val = NULL; -static networkstatus_t * -mock_ns_get_by_flavor(consensus_flavor_t f) -{ - (void)f; - return mock_ns_val; -} - -static void -test_md_reject_cache(void *arg) -{ - (void) arg; - microdesc_cache_t *mc = NULL ; - smartlist_t *added = NULL, *wanted = smartlist_new(); - or_options_t *options = get_options_mutable(); - char buf[DIGEST256_LEN]; - - tor_free(options->CacheDirectory); - options->CacheDirectory = tor_strdup(get_fname("md_datadir_test_rej")); - mock_rgsbd_val_a = tor_malloc_zero(sizeof(routerstatus_t)); - mock_rgsbd_val_b = tor_malloc_zero(sizeof(routerstatus_t)); - mock_ns_val = tor_malloc_zero(sizeof(networkstatus_t)); - - mock_ns_val->valid_after = time(NULL) - 86400; - mock_ns_val->valid_until = time(NULL) + 86400; - mock_ns_val->flavor = FLAV_MICRODESC; - -#ifdef _WIN32 - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory)); -#else - tt_int_op(0, OP_EQ, mkdir(options->CacheDirectory, 0700)); -#endif - - MOCK(router_get_mutable_consensus_status_by_descriptor_digest, - mock_router_get_status_by_digest); - MOCK(networkstatus_get_latest_consensus_by_flavor, mock_ns_get_by_flavor); - - mc = get_microdesc_cache(); -#define ADD(hex) \ - do { \ - tt_int_op(sizeof(buf),OP_EQ,base16_decode(buf,sizeof(buf), \ - hex,strlen(hex)));\ - smartlist_add(wanted, tor_memdup(buf, DIGEST256_LEN)); \ - } while (0) - - /* invalid,0 */ - ADD("5d76bf1c6614e885614a1e0ad074e1ab4ea14655ebeefb1736a71b5ed8a15a51"); - /* invalid,2 */ - ADD("20d1576c5ab11bbcff0dedb1db4a3cfcc8bc8dd839d8cbfef92d00a1a7d7b294"); - /* valid, 6 */ - ADD("53f740bd222ab37f19f604b1d3759aa65eff1fbce9ac254bd0fa50d4af9b1bae"); - /* valid, 8 */ - ADD("a0a155562d8093d8fd0feb7b93b7226e17f056c2142aab7a4ea8c5867a0376d5"); - - added = microdescs_add_to_cache(mc, MD_PARSE_TEST_DATA, NULL, - SAVED_NOWHERE, 0, time(NULL), wanted); - - tt_int_op(smartlist_len(added), OP_EQ, 2); - tt_int_op(mock_rgsbd_called, OP_EQ, 2); - tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, OP_EQ, 255); - tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, OP_EQ, 255); - - done: - UNMOCK(networkstatus_get_latest_consensus_by_flavor); - UNMOCK(router_get_mutable_consensus_status_by_descriptor_digest); - tor_free(options->CacheDirectory); - microdesc_free_all(); - smartlist_free(added); - SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); - smartlist_free(wanted); - tor_free(mock_rgsbd_val_a); - tor_free(mock_rgsbd_val_b); - tor_free(mock_ns_val); -} - -static void -test_md_corrupt_desc(void *arg) -{ - char *cp = NULL; - smartlist_t *sl = NULL; - (void) arg; - - sl = microdescs_add_to_cache(get_microdesc_cache(), - "@last-listed 2015-06-22 10:00:00\n" - "onion-k\n", - NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL); - tt_int_op(smartlist_len(sl), OP_EQ, 0); - smartlist_free(sl); - - sl = microdescs_add_to_cache(get_microdesc_cache(), - "@last-listed 2015-06-22 10:00:00\n" - "wiggly\n", - NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL); - tt_int_op(smartlist_len(sl), OP_EQ, 0); - smartlist_free(sl); - - tor_asprintf(&cp, "%s\n%s", test_md1, "@foobar\nonion-wobble\n"); - - sl = microdescs_add_to_cache(get_microdesc_cache(), - cp, cp+strlen(cp), - SAVED_IN_JOURNAL, 0, time(NULL), NULL); - tt_int_op(smartlist_len(sl), OP_EQ, 0); - - done: - tor_free(cp); - smartlist_free(sl); -} - -struct testcase_t microdesc_tests[] = { - { "cache", test_md_cache, TT_FORK, NULL, NULL }, - { "broken_cache", test_md_cache_broken, TT_FORK, NULL, NULL }, - { "generate", test_md_generate, 0, NULL, NULL }, - { "parse", test_md_parse, 0, NULL, NULL }, - { "reject_cache", test_md_reject_cache, TT_FORK, NULL, NULL }, - { "corrupt_desc", test_md_corrupt_desc, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_nodelist.c b/src/tor/src/test/test_nodelist.c deleted file mode 100644 index a873003d7..000000000 --- a/src/tor/src/test/test_nodelist.c +++ /dev/null @@ -1,216 +0,0 @@ -/* Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_nodelist.c - * \brief Unit tests for nodelist related functions. - **/ - -#include "or.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "torcert.h" -#include "test.h" - -/** Test the case when node_get_by_id() returns NULL, - * node_get_verbose_nickname_by_id should return the base 16 encoding - * of the id. - */ -static void -test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg) -{ - char vname[MAX_VERBOSE_NICKNAME_LEN+1]; - const char ID[] = "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"; - (void) arg; - - /* make sure node_get_by_id returns NULL */ - tt_assert(!node_get_by_id(ID)); - node_get_verbose_nickname_by_id(ID, vname); - tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); - done: - return; -} - -/** For routers without named flag, get_verbose_nickname should return - * "Fingerprint~Nickname" - */ -static void -test_nodelist_node_get_verbose_nickname_not_named(void *arg) -{ - node_t mock_node; - routerstatus_t mock_rs; - - char vname[MAX_VERBOSE_NICKNAME_LEN+1]; - - (void) arg; - - memset(&mock_node, 0, sizeof(node_t)); - memset(&mock_rs, 0, sizeof(routerstatus_t)); - - /* verbose nickname should use ~ instead of = for unnamed routers */ - strlcpy(mock_rs.nickname, "TestOR", sizeof(mock_rs.nickname)); - mock_node.rs = &mock_rs; - memcpy(mock_node.identity, - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" - "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA", - DIGEST_LEN); - node_get_verbose_nickname(&mock_node, vname); - tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR"); - - done: - return; -} - -/** A node should be considered a directory server if it has an open dirport - * of it accepts tunnelled directory requests. - */ -static void -test_nodelist_node_is_dir(void *arg) -{ - (void)arg; - - routerstatus_t rs; - routerinfo_t ri; - node_t node; - memset(&node, 0, sizeof(node_t)); - memset(&rs, 0, sizeof(routerstatus_t)); - memset(&ri, 0, sizeof(routerinfo_t)); - - tt_assert(!node_is_dir(&node)); - - node.rs = &rs; - tt_assert(!node_is_dir(&node)); - - rs.is_v2_dir = 1; - tt_assert(node_is_dir(&node)); - - rs.is_v2_dir = 0; - rs.dir_port = 1; - tt_assert(! node_is_dir(&node)); - - node.rs = NULL; - tt_assert(!node_is_dir(&node)); - node.ri = &ri; - ri.supports_tunnelled_dir_requests = 1; - tt_assert(node_is_dir(&node)); - ri.supports_tunnelled_dir_requests = 0; - ri.dir_port = 1; - tt_assert(! node_is_dir(&node)); - - done: - return; -} - -static networkstatus_t *dummy_ns = NULL; -static networkstatus_t * -mock_networkstatus_get_latest_consensus(void) -{ - return dummy_ns; -} -static networkstatus_t * -mock_networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) -{ - tor_assert(f == FLAV_MICRODESC); - return dummy_ns; -} - -static void -test_nodelist_ed_id(void *arg) -{ - routerstatus_t *rs[4]; - microdesc_t *md[4]; - routerinfo_t *ri[4]; - networkstatus_t *ns; - int i; - (void)arg; - - ns = tor_malloc_zero(sizeof(networkstatus_t)); - ns->flavor = FLAV_MICRODESC; - ns->routerstatus_list = smartlist_new(); - dummy_ns = ns; - MOCK(networkstatus_get_latest_consensus, - mock_networkstatus_get_latest_consensus); - MOCK(networkstatus_get_latest_consensus_by_flavor, - mock_networkstatus_get_latest_consensus_by_flavor); - - /* Make a bunch of dummy objects that we can play around with. Only set the - necessary fields */ - - for (i = 0; i < 4; ++i) { - rs[i] = tor_malloc_zero(sizeof(*rs[i])); - md[i] = tor_malloc_zero(sizeof(*md[i])); - ri[i] = tor_malloc_zero(sizeof(*ri[i])); - - crypto_rand(md[i]->digest, sizeof(md[i]->digest)); - md[i]->ed25519_identity_pkey = tor_malloc(sizeof(ed25519_public_key_t)); - crypto_rand((char*)md[i]->ed25519_identity_pkey, - sizeof(ed25519_public_key_t)); - crypto_rand(rs[i]->identity_digest, sizeof(rs[i]->identity_digest)); - memcpy(ri[i]->cache_info.identity_digest, rs[i]->identity_digest, - DIGEST_LEN); - memcpy(rs[i]->descriptor_digest, md[i]->digest, DIGEST256_LEN); - ri[i]->cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t)); - memcpy(&ri[i]->cache_info.signing_key_cert->signing_key, - md[i]->ed25519_identity_pkey, sizeof(ed25519_public_key_t)); - - if (i != 3) - smartlist_add(ns->routerstatus_list, rs[i]); - } - - tt_int_op(0, OP_EQ, smartlist_len(nodelist_get_list())); - - nodelist_set_consensus(ns); - - tt_int_op(3, OP_EQ, smartlist_len(nodelist_get_list())); - - /* No Ed25519 info yet, so nothing has an ED id. */ - tt_ptr_op(NULL, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey)); - - /* Register the first one by md, then look it up. */ - node_t *n = nodelist_add_microdesc(md[0]); - tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey)); - - /* Register the second by ri, then look it up. */ - routerinfo_t *ri_old = NULL; - n = nodelist_set_routerinfo(ri[1], &ri_old); - tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey)); - tt_ptr_op(ri_old, OP_EQ, NULL); - - /* Register it by md too. */ - node_t *n2 = nodelist_add_microdesc(md[1]); - tt_ptr_op(n2, OP_EQ, n); - tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey)); - - /* Register the 4th by ri only -- we never put it into the networkstatus, - * so it has to be independent */ - n = nodelist_set_routerinfo(ri[3], &ri_old); - tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[3]->ed25519_identity_pkey)); - tt_ptr_op(ri_old, OP_EQ, NULL); - tt_int_op(4, OP_EQ, smartlist_len(nodelist_get_list())); - - done: - for (i = 0; i < 4; ++i) { - tor_free(rs[i]); - tor_free(md[i]->ed25519_identity_pkey); - tor_free(md[i]); - tor_free(ri[i]->cache_info.signing_key_cert); - tor_free(ri[i]); - } - smartlist_clear(ns->routerstatus_list); - networkstatus_vote_free(ns); - UNMOCK(networkstatus_get_latest_consensus); - UNMOCK(networkstatus_get_latest_consensus_by_flavor); -} - -#define NODE(name, flags) \ - { #name, test_nodelist_##name, (flags), NULL, NULL } - -struct testcase_t nodelist_tests[] = { - NODE(node_get_verbose_nickname_by_id_null_node, TT_FORK), - NODE(node_get_verbose_nickname_not_named, TT_FORK), - NODE(node_is_dir, TT_FORK), - NODE(ed_id, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_ntor.sh b/src/tor/src/test/test_ntor.sh deleted file mode 100644 index 5081dabc5..000000000 --- a/src/tor/src/test/test_ntor.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# Validate Tor's ntor implementation. - -exitcode=0 - -"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/ntor_ref.py" test-tor || exitcode=1 -"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/ntor_ref.py" self-test || exitcode=1 - -exit ${exitcode} diff --git a/src/tor/src/test/test_ntor_cl.c b/src/tor/src/test/test_ntor_cl.c deleted file mode 100644 index d0eea85d6..000000000 --- a/src/tor/src/test/test_ntor_cl.c +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include -#include - -#define ONION_NTOR_PRIVATE -#include "or.h" -#include "util.h" -#include "compat.h" -#include "crypto.h" -#include "crypto_curve25519.h" -#include "onion_ntor.h" - -#define N_ARGS(n) STMT_BEGIN { \ - if (argc < (n)) { \ - fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ - return 1; \ - } \ - } STMT_END -#define BASE16(idx, var, n) STMT_BEGIN { \ - const char *s = argv[(idx)]; \ - if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ - fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ - return 1; \ - } \ - } STMT_END -#define INT(idx, var) STMT_BEGIN { \ - var = atoi(argv[(idx)]); \ - if (var <= 0) { \ - fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ - } \ - } STMT_END - -static int -client1(int argc, char **argv) -{ - /* client1 nodeID B -> msg state */ - curve25519_public_key_t B; - uint8_t node_id[DIGEST_LEN]; - ntor_handshake_state_t *state = NULL; - uint8_t msg[NTOR_ONIONSKIN_LEN]; - - char buf[1024]; - - N_ARGS(4); - BASE16(2, node_id, DIGEST_LEN); - BASE16(3, B.public_key, CURVE25519_PUBKEY_LEN); - - if (onion_skin_ntor_create(node_id, &B, &state, msg)<0) { - fprintf(stderr, "handshake failed"); - return 2; - } - - base16_encode(buf, sizeof(buf), (const char*)msg, sizeof(msg)); - printf("%s\n", buf); - base16_encode(buf, sizeof(buf), (void*)state, sizeof(*state)); - printf("%s\n", buf); - - ntor_handshake_state_free(state); - return 0; -} - -static int -server1(int argc, char **argv) -{ - uint8_t msg_in[NTOR_ONIONSKIN_LEN]; - curve25519_keypair_t kp; - di_digest256_map_t *keymap=NULL; - uint8_t node_id[DIGEST_LEN]; - int keybytes; - - uint8_t msg_out[NTOR_REPLY_LEN]; - uint8_t *keys = NULL; - char *hexkeys = NULL; - int result = 0; - - char buf[256]; - - /* server1: b nodeID msg N -> msg keys */ - N_ARGS(6); - BASE16(2, kp.seckey.secret_key, CURVE25519_SECKEY_LEN); - BASE16(3, node_id, DIGEST_LEN); - BASE16(4, msg_in, NTOR_ONIONSKIN_LEN); - INT(5, keybytes); - - curve25519_public_key_generate(&kp.pubkey, &kp.seckey); - dimap_add_entry(&keymap, kp.pubkey.public_key, &kp); - - keys = tor_malloc(keybytes); - hexkeys = tor_malloc(keybytes*2+1); - if (onion_skin_ntor_server_handshake( - msg_in, keymap, NULL, node_id, msg_out, keys, - (size_t)keybytes)<0) { - fprintf(stderr, "handshake failed"); - result = 2; - goto done; - } - - base16_encode(buf, sizeof(buf), (const char*)msg_out, sizeof(msg_out)); - printf("%s\n", buf); - base16_encode(hexkeys, keybytes*2+1, (const char*)keys, keybytes); - printf("%s\n", hexkeys); - - done: - tor_free(keys); - tor_free(hexkeys); - dimap_free(keymap, NULL); - return result; -} - -static int -client2(int argc, char **argv) -{ - struct ntor_handshake_state_t state; - uint8_t msg[NTOR_REPLY_LEN]; - int keybytes; - uint8_t *keys; - char *hexkeys; - int result = 0; - - N_ARGS(5); - BASE16(2, (&state), sizeof(state)); - BASE16(3, msg, sizeof(msg)); - INT(4, keybytes); - - keys = tor_malloc(keybytes); - hexkeys = tor_malloc(keybytes*2+1); - if (onion_skin_ntor_client_handshake(&state, msg, keys, keybytes, NULL)<0) { - fprintf(stderr, "handshake failed"); - result = 2; - goto done; - } - - base16_encode(hexkeys, keybytes*2+1, (const char*)keys, keybytes); - printf("%s\n", hexkeys); - - done: - tor_free(keys); - tor_free(hexkeys); - return result; -} - -int -main(int argc, char **argv) -{ - /* - client1: nodeID B -> msg state - server1: b nodeID msg N -> msg keys - client2: state msg N -> keys - */ - if (argc < 2) { - fprintf(stderr, "I need arguments. Read source for more info.\n"); - return 1; - } - - curve25519_init(); - if (!strcmp(argv[1], "client1")) { - return client1(argc, argv); - } else if (!strcmp(argv[1], "server1")) { - return server1(argc, argv); - } else if (!strcmp(argv[1], "client2")) { - return client2(argc, argv); - } else { - fprintf(stderr, "What's a %s?\n", argv[1]); - return 1; - } -} - diff --git a/src/tor/src/test/test_oom.c b/src/tor/src/test/test_oom.c deleted file mode 100644 index c172fe60c..000000000 --- a/src/tor/src/test/test_oom.c +++ /dev/null @@ -1,356 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Unit tests for OOM handling logic */ - -#define RELAY_PRIVATE -#define BUFFERS_PRIVATE -#define CIRCUITLIST_PRIVATE -#define CONNECTION_PRIVATE -#include "or.h" -#include "buffers.h" -#include "circuitlist.h" -#include "compat_libevent.h" -#include "connection.h" -#include "config.h" -#include "relay.h" -#include "test.h" -#include "test_helpers.h" - -/* small replacement mock for circuit_mark_for_close_ to avoid doing all - * the other bookkeeping that comes with marking circuits. */ -static void -circuit_mark_for_close_dummy_(circuit_t *circ, int reason, int line, - const char *file) -{ - (void) reason; - if (circ->marked_for_close) { - TT_FAIL(("Circuit already marked for close at %s:%d, but we are marking " - "it again at %s:%d", - circ->marked_for_close_file, (int)circ->marked_for_close, - file, line)); - } - - circ->marked_for_close = line; - circ->marked_for_close_file = file; -} - -static circuit_t * -dummy_or_circuit_new(int n_p_cells, int n_n_cells) -{ - or_circuit_t *circ = or_circuit_new(0, NULL); - int i; - cell_t cell; - - for (i=0; i < n_p_cells; ++i) { - crypto_rand((void*)&cell, sizeof(cell)); - cell_queue_append_packed_copy(TO_CIRCUIT(circ), &circ->p_chan_cells, - 0, &cell, 1, 0); - } - - for (i=0; i < n_n_cells; ++i) { - crypto_rand((void*)&cell, sizeof(cell)); - cell_queue_append_packed_copy(TO_CIRCUIT(circ), - &TO_CIRCUIT(circ)->n_chan_cells, - 1, &cell, 1, 0); - } - - TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_OR; - return TO_CIRCUIT(circ); -} - -static void -add_bytes_to_buf(buf_t *buf, size_t n_bytes) -{ - char b[3000]; - - while (n_bytes) { - size_t this_add = n_bytes > sizeof(b) ? sizeof(b) : n_bytes; - crypto_rand(b, this_add); - buf_add(buf, b, this_add); - n_bytes -= this_add; - } -} - -static edge_connection_t * -dummy_edge_conn_new(circuit_t *circ, - int type, size_t in_bytes, size_t out_bytes) -{ - edge_connection_t *conn; - buf_t *inbuf, *outbuf; - - if (type == CONN_TYPE_EXIT) - conn = edge_connection_new(type, AF_INET); - else - conn = ENTRY_TO_EDGE_CONN(entry_connection_new(type, AF_INET)); - - inbuf = TO_CONN(conn)->inbuf; - outbuf = TO_CONN(conn)->outbuf; - - /* We add these bytes directly to the buffers, to avoid all the - * edge connection read/write machinery. */ - add_bytes_to_buf(inbuf, in_bytes); - add_bytes_to_buf(outbuf, out_bytes); - - conn->on_circuit = circ; - if (type == CONN_TYPE_EXIT) { - or_circuit_t *oc = TO_OR_CIRCUIT(circ); - conn->next_stream = oc->n_streams; - oc->n_streams = conn; - } else { - origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ); - conn->next_stream = oc->p_streams; - oc->p_streams = conn; - } - - return conn; -} - -/** Run unit tests for buffers.c */ -static void -test_oom_circbuf(void *arg) -{ - or_options_t *options = get_options_mutable(); - circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL; - uint64_t now_ns = 1389631048 * (uint64_t)1000000000; - const uint64_t start_ns = now_ns; - - (void) arg; - - monotime_enable_test_mocking(); - MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_); - - /* Far too low for real life. */ - options->MaxMemInQueues = 256*packed_cell_mem_cost(); - options->CellStatistics = 0; - - tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - /* Now we're going to fake up some circuits and get them added to the global - circuit list. */ - monotime_coarse_set_mock_time_nsec(now_ns); - c1 = dummy_origin_circuit_new(30); - - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - c2 = dummy_or_circuit_new(20, 20); - - tt_int_op(packed_cell_mem_cost(), OP_EQ, - sizeof(packed_cell_t)); - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 70); - tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ - - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - c3 = dummy_or_circuit_new(100, 85); - tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 255); - - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - /* Adding this cell will trigger our OOM handler. */ - c4 = dummy_or_circuit_new(2, 0); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 257); - - tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ - - tt_assert(c1->marked_for_close); - tt_assert(! c2->marked_for_close); - tt_assert(! c3->marked_for_close); - tt_assert(! c4->marked_for_close); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * (257 - 30)); - - circuit_free(c1); - - monotime_coarse_set_mock_time_nsec(start_ns); /* go back in time */ - c1 = dummy_or_circuit_new(90, 0); - - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - - tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ - - tt_assert(c1->marked_for_close); - tt_assert(! c2->marked_for_close); - tt_assert(! c3->marked_for_close); - tt_assert(! c4->marked_for_close); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * (257 - 30)); - - done: - circuit_free(c1); - circuit_free(c2); - circuit_free(c3); - circuit_free(c4); - - UNMOCK(circuit_mark_for_close_); - monotime_disable_test_mocking(); -} - -/** Run unit tests for buffers.c */ -static void -test_oom_streambuf(void *arg) -{ - or_options_t *options = get_options_mutable(); - circuit_t *c1 = NULL, *c2 = NULL, *c3 = NULL, *c4 = NULL, *c5 = NULL; - uint32_t tvts; - int i; - smartlist_t *edgeconns = smartlist_new(); - const uint64_t start_ns = 1389641159 * (uint64_t)1000000000; - uint64_t now_ns = start_ns; - - (void) arg; - monotime_enable_test_mocking(); - - MOCK(circuit_mark_for_close_, circuit_mark_for_close_dummy_); - - /* Far too low for real life. */ - options->MaxMemInQueues = 81*packed_cell_mem_cost() + 4096 * 34; - options->CellStatistics = 0; - - tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); - tt_int_op(buf_get_total_allocation(), OP_EQ, 0); - - monotime_coarse_set_mock_time_nsec(start_ns); - - /* Start all circuits with a bit of data queued in cells */ - - /* go halfway into the second. */ - monotime_coarse_set_mock_time_nsec(start_ns + 500 * 1000000); - c1 = dummy_or_circuit_new(10,10); - - monotime_coarse_set_mock_time_nsec(start_ns + 510 * 1000000); - c2 = dummy_origin_circuit_new(20); - monotime_coarse_set_mock_time_nsec(start_ns + 520 * 1000000); - c3 = dummy_or_circuit_new(20,20); - monotime_coarse_set_mock_time_nsec(start_ns + 530 * 1000000); - c4 = dummy_or_circuit_new(0,0); - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 80); - - now_ns = start_ns + 600 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - - /* Add some connections to c1...c4. */ - for (i = 0; i < 4; ++i) { - edge_connection_t *ec; - /* link it to a circuit */ - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - ec = dummy_edge_conn_new(c1, CONN_TYPE_EXIT, 1000, 1000); - tt_assert(ec); - smartlist_add(edgeconns, ec); - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - ec = dummy_edge_conn_new(c2, CONN_TYPE_AP, 1000, 1000); - tt_assert(ec); - smartlist_add(edgeconns, ec); - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); /* Yes, 4 twice*/ - tt_assert(ec); - smartlist_add(edgeconns, ec); - now_ns += 10 * 1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); - smartlist_add(edgeconns, ec); - tt_assert(ec); - } - - now_ns -= now_ns % 1000000000; - now_ns += 1000000000; - monotime_coarse_set_mock_time_nsec(now_ns); - tvts = monotime_coarse_get_stamp(); - -#define ts_is_approx(ts, val) do { \ - uint32_t x_ = (uint32_t) monotime_coarse_stamp_units_to_approx_msec(ts); \ - tt_int_op(x_, OP_GE, val - 5); \ - tt_int_op(x_, OP_LE, val + 5); \ - } while (0) - - ts_is_approx(circuit_max_queued_cell_age(c1, tvts), 500); - ts_is_approx(circuit_max_queued_cell_age(c2, tvts), 490); - ts_is_approx(circuit_max_queued_cell_age(c3, tvts), 480); - ts_is_approx(circuit_max_queued_cell_age(c4, tvts), 0); - - ts_is_approx(circuit_max_queued_data_age(c1, tvts), 390); - ts_is_approx(circuit_max_queued_data_age(c2, tvts), 380); - ts_is_approx(circuit_max_queued_data_age(c3, tvts), 0); - ts_is_approx(circuit_max_queued_data_age(c4, tvts), 370); - - ts_is_approx(circuit_max_queued_item_age(c1, tvts), 500); - ts_is_approx(circuit_max_queued_item_age(c2, tvts), 490); - ts_is_approx(circuit_max_queued_item_age(c3, tvts), 480); - ts_is_approx(circuit_max_queued_item_age(c4, tvts), 370); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 80); - tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*16*2); - - /* Now give c4 a very old buffer of modest size */ - { - edge_connection_t *ec; - now_ns -= 1000000000; - monotime_coarse_set_mock_time_nsec(now_ns); - ec = dummy_edge_conn_new(c4, CONN_TYPE_EXIT, 1000, 1000); - tt_assert(ec); - smartlist_add(edgeconns, ec); - } - tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); - ts_is_approx(circuit_max_queued_item_age(c4, tvts), 1000); - - tt_int_op(cell_queues_check_size(), OP_EQ, 0); - - /* And run over the limit. */ - now_ns += 800*1000000; - monotime_coarse_set_mock_time_nsec(now_ns); - c5 = dummy_or_circuit_new(0,5); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 85); - tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); - - tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ - - /* C4 should have died. */ - tt_assert(! c1->marked_for_close); - tt_assert(! c2->marked_for_close); - tt_assert(! c3->marked_for_close); - tt_assert(c4->marked_for_close); - tt_assert(! c5->marked_for_close); - - tt_int_op(cell_queues_get_total_allocation(), OP_EQ, - packed_cell_mem_cost() * 85); - tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*8*2); - - done: - circuit_free(c1); - circuit_free(c2); - circuit_free(c3); - circuit_free(c4); - circuit_free(c5); - - SMARTLIST_FOREACH(edgeconns, edge_connection_t *, ec, - connection_free_minimal(TO_CONN(ec))); - smartlist_free(edgeconns); - - UNMOCK(circuit_mark_for_close_); - monotime_disable_test_mocking(); -} - -struct testcase_t oom_tests[] = { - { "circbuf", test_oom_circbuf, TT_FORK, NULL, NULL }, - { "streambuf", test_oom_streambuf, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_oos.c b/src/tor/src/test/test_oos.c deleted file mode 100644 index e72fcf5de..000000000 --- a/src/tor/src/test/test_oos.c +++ /dev/null @@ -1,456 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Unit tests for OOS handler */ - -#define CONNECTION_PRIVATE - -#include "or.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "main.h" -#include "test.h" - -static or_options_t mock_options; - -static void -reset_options_mock(void) -{ - memset(&mock_options, 0, sizeof(or_options_t)); -} - -static const or_options_t * -mock_get_options(void) -{ - return &mock_options; -} - -static int moribund_calls = 0; -static int moribund_conns = 0; - -static int -mock_connection_count_moribund(void) -{ - ++moribund_calls; - - return moribund_conns; -} - -/* - * For unit test purposes it's sufficient to tell that - * kill_conn_list_for_oos() was called with an approximately - * sane argument; it's just the thing we returned from the - * mock for pick_oos_victims(). - */ - -static int kill_conn_list_calls = 0; -static int kill_conn_list_killed = 0; - -static void -kill_conn_list_mock(smartlist_t *conns) -{ - ++kill_conn_list_calls; - - tt_ptr_op(conns, OP_NE, NULL); - - kill_conn_list_killed += smartlist_len(conns); - - done: - return; -} - -static int pick_oos_mock_calls = 0; -static int pick_oos_mock_fail = 0; -static int pick_oos_mock_last_n = 0; - -static smartlist_t * -pick_oos_victims_mock(int n) -{ - smartlist_t *l = NULL; - int i; - - ++pick_oos_mock_calls; - - tt_int_op(n, OP_GT, 0); - - if (!pick_oos_mock_fail) { - /* - * connection_check_oos() just passes the list onto - * kill_conn_list_for_oos(); we don't need to simulate - * its content for this mock, just its existence, but - * we do need to check the parameter. - */ - l = smartlist_new(); - for (i = 0; i < n; ++i) smartlist_add(l, NULL); - } else { - l = NULL; - } - - pick_oos_mock_last_n = n; - - done: - return l; -} - -/** Unit test for the logic in connection_check_oos(), which is concerned - * with comparing thresholds and connection counts to decide if an OOS has - * occurred and if so, how many connections to try to kill, and then using - * pick_oos_victims() and kill_conn_list_for_oos() to carry out its grim - * duty. - */ -static void -test_oos_connection_check_oos(void *arg) -{ - (void)arg; - - /* Set up mocks */ - reset_options_mock(); - /* OOS handling is only sensitive to these fields */ - mock_options.ConnLimit = 32; - mock_options.ConnLimit_ = 64; - mock_options.ConnLimit_high_thresh = 60; - mock_options.ConnLimit_low_thresh = 50; - MOCK(get_options, mock_get_options); - moribund_calls = 0; - moribund_conns = 0; - MOCK(connection_count_moribund, mock_connection_count_moribund); - kill_conn_list_calls = 0; - kill_conn_list_killed = 0; - MOCK(kill_conn_list_for_oos, kill_conn_list_mock); - pick_oos_mock_calls = 0; - pick_oos_mock_fail = 0; - MOCK(pick_oos_victims, pick_oos_victims_mock); - - /* No OOS case */ - connection_check_oos(50, 0); - tt_int_op(moribund_calls, OP_EQ, 0); - tt_int_op(pick_oos_mock_calls, OP_EQ, 0); - tt_int_op(kill_conn_list_calls, OP_EQ, 0); - - /* OOS from socket count, nothing moribund */ - connection_check_oos(62, 0); - tt_int_op(moribund_calls, OP_EQ, 1); - tt_int_op(pick_oos_mock_calls, OP_EQ, 1); - /* 12 == 62 - ConnLimit_low_thresh */ - tt_int_op(pick_oos_mock_last_n, OP_EQ, 12); - tt_int_op(kill_conn_list_calls, OP_EQ, 1); - tt_int_op(kill_conn_list_killed, OP_EQ, 12); - - /* OOS from socket count, some are moribund */ - kill_conn_list_killed = 0; - moribund_conns = 5; - connection_check_oos(62, 0); - tt_int_op(moribund_calls, OP_EQ, 2); - tt_int_op(pick_oos_mock_calls, OP_EQ, 2); - /* 7 == 62 - ConnLimit_low_thresh - moribund_conns */ - tt_int_op(pick_oos_mock_last_n, OP_EQ, 7); - tt_int_op(kill_conn_list_calls, OP_EQ, 2); - tt_int_op(kill_conn_list_killed, OP_EQ, 7); - - /* OOS from socket count, but pick fails */ - kill_conn_list_killed = 0; - moribund_conns = 0; - pick_oos_mock_fail = 1; - connection_check_oos(62, 0); - tt_int_op(moribund_calls, OP_EQ, 3); - tt_int_op(pick_oos_mock_calls, OP_EQ, 3); - tt_int_op(kill_conn_list_calls, OP_EQ, 2); - tt_int_op(kill_conn_list_killed, OP_EQ, 0); - pick_oos_mock_fail = 0; - - /* - * OOS from socket count with so many moribund conns - * we have none to kill. - */ - kill_conn_list_killed = 0; - moribund_conns = 15; - connection_check_oos(62, 0); - tt_int_op(moribund_calls, OP_EQ, 4); - tt_int_op(pick_oos_mock_calls, OP_EQ, 3); - tt_int_op(kill_conn_list_calls, OP_EQ, 2); - - /* - * OOS from socket exhaustion; OOS handler will try to - * kill 1/10 (5) of the connections. - */ - kill_conn_list_killed = 0; - moribund_conns = 0; - connection_check_oos(50, 1); - tt_int_op(moribund_calls, OP_EQ, 5); - tt_int_op(pick_oos_mock_calls, OP_EQ, 4); - tt_int_op(kill_conn_list_calls, OP_EQ, 3); - tt_int_op(kill_conn_list_killed, OP_EQ, 5); - - /* OOS from socket exhaustion with moribund conns */ - kill_conn_list_killed = 0; - moribund_conns = 2; - connection_check_oos(50, 1); - tt_int_op(moribund_calls, OP_EQ, 6); - tt_int_op(pick_oos_mock_calls, OP_EQ, 5); - tt_int_op(kill_conn_list_calls, OP_EQ, 4); - tt_int_op(kill_conn_list_killed, OP_EQ, 3); - - /* OOS from socket exhaustion with many moribund conns */ - kill_conn_list_killed = 0; - moribund_conns = 7; - connection_check_oos(50, 1); - tt_int_op(moribund_calls, OP_EQ, 7); - tt_int_op(pick_oos_mock_calls, OP_EQ, 5); - tt_int_op(kill_conn_list_calls, OP_EQ, 4); - - /* OOS with both socket exhaustion and above-threshold */ - kill_conn_list_killed = 0; - moribund_conns = 0; - connection_check_oos(62, 1); - tt_int_op(moribund_calls, OP_EQ, 8); - tt_int_op(pick_oos_mock_calls, OP_EQ, 6); - tt_int_op(kill_conn_list_calls, OP_EQ, 5); - tt_int_op(kill_conn_list_killed, OP_EQ, 12); - - /* - * OOS with both socket exhaustion and above-threshold with some - * moribund conns - */ - kill_conn_list_killed = 0; - moribund_conns = 5; - connection_check_oos(62, 1); - tt_int_op(moribund_calls, OP_EQ, 9); - tt_int_op(pick_oos_mock_calls, OP_EQ, 7); - tt_int_op(kill_conn_list_calls, OP_EQ, 6); - tt_int_op(kill_conn_list_killed, OP_EQ, 7); - - /* - * OOS with both socket exhaustion and above-threshold with many - * moribund conns - */ - kill_conn_list_killed = 0; - moribund_conns = 15; - connection_check_oos(62, 1); - tt_int_op(moribund_calls, OP_EQ, 10); - tt_int_op(pick_oos_mock_calls, OP_EQ, 7); - tt_int_op(kill_conn_list_calls, OP_EQ, 6); - - done: - - UNMOCK(pick_oos_victims); - UNMOCK(kill_conn_list_for_oos); - UNMOCK(connection_count_moribund); - UNMOCK(get_options); - - return; -} - -static int cfe_calls = 0; - -static void -close_for_error_mock(or_connection_t *orconn, int flush) -{ - (void)flush; - - tt_ptr_op(orconn, OP_NE, NULL); - ++cfe_calls; - - done: - return; -} - -static int mark_calls = 0; - -static void -mark_for_close_oos_mock(connection_t *conn, - int line, const char *file) -{ - (void)line; - (void)file; - - tt_ptr_op(conn, OP_NE, NULL); - ++mark_calls; - - done: - return; -} - -static void -test_oos_kill_conn_list(void *arg) -{ - connection_t *c1, *c2; - or_connection_t *or_c1 = NULL; - dir_connection_t *dir_c2 = NULL; - smartlist_t *l = NULL; - (void)arg; - - /* Set up mocks */ - mark_calls = 0; - MOCK(connection_mark_for_close_internal_, mark_for_close_oos_mock); - cfe_calls = 0; - MOCK(connection_or_close_for_error, close_for_error_mock); - - /* Make fake conns */ - or_c1 = tor_malloc_zero(sizeof(*or_c1)); - or_c1->base_.magic = OR_CONNECTION_MAGIC; - or_c1->base_.type = CONN_TYPE_OR; - c1 = TO_CONN(or_c1); - dir_c2 = tor_malloc_zero(sizeof(*dir_c2)); - dir_c2->base_.magic = DIR_CONNECTION_MAGIC; - dir_c2->base_.type = CONN_TYPE_DIR; - dir_c2->base_.state = DIR_CONN_STATE_MIN_; - dir_c2->base_.purpose = DIR_PURPOSE_MIN_; - c2 = TO_CONN(dir_c2); - - tt_ptr_op(c1, OP_NE, NULL); - tt_ptr_op(c2, OP_NE, NULL); - - /* Make list */ - l = smartlist_new(); - smartlist_add(l, c1); - smartlist_add(l, c2); - - /* Run kill_conn_list_for_oos() */ - kill_conn_list_for_oos(l); - - /* Check call counters */ - tt_int_op(mark_calls, OP_EQ, 1); - tt_int_op(cfe_calls, OP_EQ, 1); - - done: - - UNMOCK(connection_or_close_for_error); - UNMOCK(connection_mark_for_close_internal_); - - if (l) smartlist_free(l); - tor_free(or_c1); - tor_free(dir_c2); - - return; -} - -static smartlist_t *conns_for_mock = NULL; - -static smartlist_t * -get_conns_mock(void) -{ - return conns_for_mock; -} - -/* - * For this mock, we pretend all conns have either zero or one circuits, - * depending on if this appears on the list of things to say have a circuit. - */ - -static smartlist_t *conns_with_circs = NULL; - -static int -get_num_circuits_mock(or_connection_t *conn) -{ - int circs = 0; - - tt_ptr_op(conn, OP_NE, NULL); - - if (conns_with_circs && - smartlist_contains(conns_with_circs, TO_CONN(conn))) { - circs = 1; - } - - done: - return circs; -} - -static void -test_oos_pick_oos_victims(void *arg) -{ - (void)arg; - or_connection_t *ortmp; - dir_connection_t *dirtmp; - smartlist_t *picked; - - /* Set up mocks */ - conns_for_mock = smartlist_new(); - MOCK(get_connection_array, get_conns_mock); - conns_with_circs = smartlist_new(); - MOCK(connection_or_get_num_circuits, get_num_circuits_mock); - - /* Make some fake connections */ - ortmp = tor_malloc_zero(sizeof(*ortmp)); - ortmp->base_.magic = OR_CONNECTION_MAGIC; - ortmp->base_.type = CONN_TYPE_OR; - smartlist_add(conns_for_mock, TO_CONN(ortmp)); - /* We'll pretend this one has a circuit too */ - smartlist_add(conns_with_circs, TO_CONN(ortmp)); - /* Next one */ - ortmp = tor_malloc_zero(sizeof(*ortmp)); - ortmp->base_.magic = OR_CONNECTION_MAGIC; - ortmp->base_.type = CONN_TYPE_OR; - smartlist_add(conns_for_mock, TO_CONN(ortmp)); - /* Next one is moribund */ - ortmp = tor_malloc_zero(sizeof(*ortmp)); - ortmp->base_.magic = OR_CONNECTION_MAGIC; - ortmp->base_.type = CONN_TYPE_OR; - ortmp->base_.marked_for_close = 1; - smartlist_add(conns_for_mock, TO_CONN(ortmp)); - /* Last one isn't an orconn */ - dirtmp = tor_malloc_zero(sizeof(*dirtmp)); - dirtmp->base_.magic = DIR_CONNECTION_MAGIC; - dirtmp->base_.type = CONN_TYPE_DIR; - smartlist_add(conns_for_mock, TO_CONN(dirtmp)); - - /* Try picking one */ - picked = pick_oos_victims(1); - /* It should be the one with circuits */ - tt_ptr_op(picked, OP_NE, NULL); - tt_int_op(smartlist_len(picked), OP_EQ, 1); - tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); - smartlist_free(picked); - - /* Try picking none */ - picked = pick_oos_victims(0); - /* We should get an empty list */ - tt_ptr_op(picked, OP_NE, NULL); - tt_int_op(smartlist_len(picked), OP_EQ, 0); - smartlist_free(picked); - - /* Try picking two */ - picked = pick_oos_victims(2); - /* We should get both active orconns */ - tt_ptr_op(picked, OP_NE, NULL); - tt_int_op(smartlist_len(picked), OP_EQ, 2); - tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); - tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 1))); - smartlist_free(picked); - - /* Try picking three - only two are eligible */ - picked = pick_oos_victims(3); - tt_int_op(smartlist_len(picked), OP_EQ, 2); - tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0))); - tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 1))); - smartlist_free(picked); - - done: - - /* Free leftover stuff */ - if (conns_with_circs) { - smartlist_free(conns_with_circs); - conns_with_circs = NULL; - } - - UNMOCK(connection_or_get_num_circuits); - - if (conns_for_mock) { - SMARTLIST_FOREACH(conns_for_mock, connection_t *, c, tor_free(c)); - smartlist_free(conns_for_mock); - conns_for_mock = NULL; - } - - UNMOCK(get_connection_array); - - return; -} - -struct testcase_t oos_tests[] = { - { "connection_check_oos", test_oos_connection_check_oos, - TT_FORK, NULL, NULL }, - { "kill_conn_list", test_oos_kill_conn_list, TT_FORK, NULL, NULL }, - { "pick_oos_victims", test_oos_pick_oos_victims, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_options.c b/src/tor/src/test/test_options.c deleted file mode 100644 index 62732cabf..000000000 --- a/src/tor/src/test/test_options.c +++ /dev/null @@ -1,4301 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CONFIG_PRIVATE -#include "or.h" -#include "confparse.h" -#include "config.h" -#include "test.h" -#include "geoip.h" - -#define ROUTERSET_PRIVATE -#include "routerset.h" -#include "main.h" -#include "log_test_helpers.h" - -#include "sandbox.h" -#include "memarea.h" -#include "policies.h" -#include "test_helpers.h" - -#define NS_MODULE test_options - -typedef struct { - int severity; - uint32_t domain; - char *msg; -} logmsg_t; - -static smartlist_t *messages = NULL; - -static void -log_cback(int severity, uint32_t domain, const char *msg) -{ - logmsg_t *x = tor_malloc(sizeof(*x)); - x->severity = severity; - x->domain = domain; - x->msg = tor_strdup(msg); - if (!messages) - messages = smartlist_new(); - smartlist_add(messages, x); -} - -static void -setup_log_callback(void) -{ - log_severity_list_t lst; - memset(&lst, 0, sizeof(lst)); - lst.masks[LOG_ERR - LOG_ERR] = ~0; - lst.masks[LOG_WARN - LOG_ERR] = ~0; - lst.masks[LOG_NOTICE - LOG_ERR] = ~0; - add_callback_log(&lst, log_cback); - mark_logs_temp(); -} - -static char * -dump_logs(void) -{ - smartlist_t *msgs; - char *out; - if (! messages) - return tor_strdup(""); - msgs = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, x) { - smartlist_add_asprintf(msgs, "[%s] %s", - log_level_to_string(x->severity), x->msg); - } SMARTLIST_FOREACH_END(x); - out = smartlist_join_strings(msgs, "", 0, NULL); - SMARTLIST_FOREACH(msgs, char *, cp, tor_free(cp)); - smartlist_free(msgs); - return out; -} - -static void -clear_log_messages(void) -{ - if (!messages) - return; - SMARTLIST_FOREACH(messages, logmsg_t *, m, - { tor_free(m->msg); tor_free(m); }); - smartlist_free(messages); - messages = NULL; -} - -#define setup_options(opt,dflt) \ - do { \ - opt = options_new(); \ - opt->command = CMD_RUN_TOR; \ - options_init(opt); \ - \ - dflt = config_dup(&options_format, opt); \ - clear_log_messages(); \ - } while (0) - -#define VALID_DIR_AUTH "DirAuthority dizum orport=443 v3ident=E8A9C45" \ - "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ - " 083C 538F 4403 8BBF A077 587D D755\n" -#define VALID_ALT_BRIDGE_AUTH \ - "AlternateBridgeAuthority dizum orport=443 v3ident=E8A9C45" \ - "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ - " 083C 538F 4403 8BBF A077 587D D755\n" -#define VALID_ALT_DIR_AUTH \ - "AlternateDirAuthority dizum orport=443 v3ident=E8A9C45" \ - "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ - " 083C 538F 4403 8BBF A077 587D D755\n" - -static int -test_options_checklog(const char *configuration, int expect_log_severity, - const char *expect_log) -{ - int found = 0, ret = -1; - char *actual_log = NULL; - - if (messages) { - SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) { - if (m->severity == expect_log_severity && - strstr(m->msg, expect_log)) { - found = 1; - break; - } - } SMARTLIST_FOREACH_END(m); - } - if (!found) { - actual_log = dump_logs(); - TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.", - log_level_to_string(expect_log_severity), expect_log, - configuration, actual_log)); - } - ret = 0; - - done: - tor_free(actual_log); - return ret; -} - -static int -test_options_checkmsgs(const char *configuration, - const char *expect_errmsg, - int expect_log_severity, - const char *expect_log, - char *msg) -{ - if (expect_errmsg && !msg) { - TT_DIE(("Expected error message <%s> from <%s>, but got none.", - expect_errmsg, configuration)); - } else if (expect_errmsg && !strstr(msg, expect_errmsg)) { - TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", - expect_errmsg, configuration, msg)); - } else if (!expect_errmsg && msg) { - TT_DIE(("Expected no error message from <%s> but got <%s>.", - configuration, msg)); - } - if (expect_log) { - return test_options_checklog(configuration, expect_log_severity, - expect_log); - } - return 0; - - done: - return -1; -} - -/* Which phases of config parsing/validation to check for messages/logs */ -enum { PH_GETLINES, PH_ASSIGN, PH_VALIDATE }; - -static void -test_options_validate_impl(const char *configuration, - const char *expect_errmsg, - int expect_log_severity, - const char *expect_log, - int phase) -{ - or_options_t *opt=NULL; - or_options_t *dflt; - config_line_t *cl=NULL; - char *msg=NULL; - int r; - - setup_options(opt, dflt); - - r = config_get_lines(configuration, &cl, 1); - if (phase == PH_GETLINES) { - if (test_options_checkmsgs(configuration, expect_errmsg, - expect_log_severity, - expect_log, msg)) - goto done; - } - if (r) - goto done; - - r = config_assign(&options_format, opt, cl, 0, &msg); - if (phase == PH_ASSIGN) { - if (test_options_checkmsgs(configuration, expect_errmsg, - expect_log_severity, - expect_log, msg)) - goto done; - } - tt_int_op((r == 0), OP_EQ, (msg == NULL)); - if (r) - goto done; - - r = options_validate(NULL, opt, dflt, 0, &msg); - if (phase == PH_VALIDATE) { - if (test_options_checkmsgs(configuration, expect_errmsg, - expect_log_severity, - expect_log, msg)) - goto done; - } - tt_int_op((r == 0), OP_EQ, (msg == NULL)); - - done: - escaped(NULL); - policies_free_all(); - config_free_lines(cl); - or_options_free(opt); - or_options_free(dflt); - tor_free(msg); - clear_log_messages(); -} - -#define WANT_ERR(config, msg, ph) \ - test_options_validate_impl((config), (msg), 0, NULL, (ph)) -#define WANT_LOG(config, severity, msg, ph) \ - test_options_validate_impl((config), NULL, (severity), (msg), (ph)) -#define WANT_ERR_LOG(config, msg, severity, logmsg, ph) \ - test_options_validate_impl((config), (msg), (severity), (logmsg), (ph)) -#define OK(config, ph) \ - test_options_validate_impl((config), NULL, 0, NULL, (ph)) - -static void -test_options_validate(void *arg) -{ - (void)arg; - setup_log_callback(); - sandbox_disable_getaddrinfo_cache(); - - WANT_ERR("ExtORPort 500000", "Invalid ExtORPort", PH_VALIDATE); - - WANT_ERR_LOG("ServerTransportOptions trebuchet", - "ServerTransportOptions did not parse", - LOG_WARN, "Too few arguments", PH_VALIDATE); - OK("ServerTransportOptions trebuchet sling=snappy", PH_VALIDATE); - OK("ServerTransportOptions trebuchet sling=", PH_VALIDATE); - WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy", - "ServerTransportOptions did not parse", - LOG_WARN, "\"slingsnappy\" is not a k=v", PH_VALIDATE); - - WANT_ERR("DirPort 8080\nDirCache 0", - "DirPort configured but DirCache disabled.", PH_VALIDATE); - WANT_ERR("BridgeRelay 1\nDirCache 0", - "We're a bridge but DirCache is disabled.", PH_VALIDATE); - - WANT_ERR_LOG("HeartbeatPeriod 21 snarks", - "Interval 'HeartbeatPeriod 21 snarks' is malformed or" - " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", - PH_ASSIGN); - WANT_ERR_LOG("LogTimeGranularity 21 snarks", - "Msec interval 'LogTimeGranularity 21 snarks' is malformed or" - " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", - PH_ASSIGN); - OK("HeartbeatPeriod 1 hour", PH_VALIDATE); - OK("LogTimeGranularity 100 milliseconds", PH_VALIDATE); - - WANT_LOG("ControlSocket \"string with trailing garbage\" bogus", LOG_WARN, - "Error while parsing configuration: " - "Excess data after quoted string", PH_GETLINES); - WANT_LOG("ControlSocket \"bogus escape \\@\"", LOG_WARN, - "Error while parsing configuration: " - "Invalid escape sequence in quoted string", PH_GETLINES); - - close_temp_logs(); - clear_log_messages(); - return; -} - -#define MEGABYTEIFY(mb) (U64_LITERAL(mb) << 20) -static void -test_have_enough_mem_for_dircache(void *arg) -{ - (void)arg; - or_options_t *opt=NULL; - or_options_t *dflt=NULL; - config_line_t *cl=NULL; - char *msg=NULL; - int r; - const char *configuration = "ORPort 8080\nDirCache 1", *expect_errmsg; - - setup_options(opt, dflt); - setup_log_callback(); - (void)dflt; - - r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, OP_EQ, 0); - - r = config_assign(&options_format, opt, cl, 0, &msg); - tt_int_op(r, OP_EQ, 0); - - /* 300 MB RAM available, DirCache enabled */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* 200 MB RAM available, DirCache enabled */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); - tt_int_op(r, OP_EQ, -1); - expect_errmsg = "Being a directory cache (default) with less than "; - if (!strstr(msg, expect_errmsg)) { - TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", - expect_errmsg, configuration, msg)); - } - tor_free(msg); - - config_free_lines(cl); cl = NULL; - configuration = "ORPort 8080\nDirCache 1\nBridgeRelay 1"; - r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, OP_EQ, 0); - - r = config_assign(&options_format, opt, cl, 0, &msg); - tt_int_op(r, OP_EQ, 0); - - /* 300 MB RAM available, DirCache enabled, Bridge */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* 200 MB RAM available, DirCache enabled, Bridge */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); - tt_int_op(r, OP_EQ, -1); - expect_errmsg = "Running a Bridge with less than "; - if (!strstr(msg, expect_errmsg)) { - TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", - expect_errmsg, configuration, msg)); - } - tor_free(msg); - - config_free_lines(cl); cl = NULL; - configuration = "ORPort 8080\nDirCache 0"; - r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, OP_EQ, 0); - - r = config_assign(&options_format, opt, cl, 0, &msg); - tt_int_op(r, OP_EQ, 0); - - /* 200 MB RAM available, DirCache disabled */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* 300 MB RAM available, DirCache disabled */ - r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg); - tt_int_op(r, OP_EQ, -1); - expect_errmsg = "DirCache is disabled and we are configured as a "; - if (!strstr(msg, expect_errmsg)) { - TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", - expect_errmsg, configuration, msg)); - } - tor_free(msg); - - clear_log_messages(); - - done: - if (msg) - tor_free(msg); - or_options_free(dflt); - or_options_free(opt); - config_free_lines(cl); - return; -} - -static const char *fixed_get_uname_result = NULL; - -static const char * -fixed_get_uname(void) -{ - return fixed_get_uname_result; -} - -#define TEST_OPTIONS_OLD_VALUES "TestingV3AuthInitialVotingInterval 1800\n" \ - "ClientBootstrapConsensusMaxDownloadTries 7\n" \ - "ClientBootstrapConsensusAuthorityOnlyMaxDownloadTries 4\n" \ - "ClientBootstrapConsensusMaxInProgressTries 3\n" \ - "TestingV3AuthInitialVoteDelay 300\n" \ - "TestingV3AuthInitialDistDelay 300\n" \ - "TestingClientMaxIntervalWithoutRequest 600\n" \ - "TestingDirConnectionMaxStall 600\n" \ - "TestingConsensusMaxDownloadTries 8\n" \ - "TestingDescriptorMaxDownloadTries 8\n" \ - "TestingMicrodescMaxDownloadTries 8\n" \ - "TestingCertMaxDownloadTries 8\n" - -#define TEST_OPTIONS_DEFAULT_VALUES TEST_OPTIONS_OLD_VALUES \ - "MaxClientCircuitsPending 1\n" \ - "RendPostPeriod 1000\n" \ - "KeepAlivePeriod 1\n" \ - "ConnLimit 1\n" \ - "V3AuthVotingInterval 300\n" \ - "V3AuthVoteDelay 20\n" \ - "V3AuthDistDelay 20\n" \ - "V3AuthNIntervalsValid 3\n" \ - "ClientUseIPv4 1\n" \ - "VirtualAddrNetworkIPv4 127.192.0.0/10\n" \ - "VirtualAddrNetworkIPv6 [FE80::]/10\n" \ - "UseEntryGuards 1\n" \ - "Schedulers Vanilla\n" \ - "ClientDNSRejectInternalAddresses 1\n" - -typedef struct { - or_options_t *old_opt; - or_options_t *opt; - or_options_t *def_opt; -} options_test_data_t; - -static void free_options_test_data(options_test_data_t *td); - -static options_test_data_t * -get_options_test_data(const char *conf) -{ - int rv = -1; - char *msg = NULL; - config_line_t *cl=NULL; - options_test_data_t *result = tor_malloc(sizeof(options_test_data_t)); - result->opt = options_new(); - result->old_opt = options_new(); - result->def_opt = options_new(); - - // XXX: Really, all of these options should be set to defaults - // with options_init(), but about a dozen tests break when I do that. - // Being kinda lame and just fixing the immedate breakage for now.. - result->opt->ConnectionPadding = -1; // default must be "auto" - - rv = config_get_lines(conf, &cl, 1); - tt_int_op(rv, OP_EQ, 0); - rv = config_assign(&options_format, result->opt, cl, 0, &msg); - if (msg) { - /* Display the parse error message by comparing it with an empty string */ - tt_str_op(msg, OP_EQ, ""); - } - tt_int_op(rv, OP_EQ, 0); - config_free_lines(cl); - result->opt->LogTimeGranularity = 1; - result->opt->TokenBucketRefillInterval = 1; - rv = config_get_lines(TEST_OPTIONS_OLD_VALUES, &cl, 1); - tt_int_op(rv, OP_EQ, 0); - rv = config_assign(&options_format, result->def_opt, cl, 0, &msg); - if (msg) { - /* Display the parse error message by comparing it with an empty string */ - tt_str_op(msg, OP_EQ, ""); - } - tt_int_op(rv, OP_EQ, 0); - - done: - config_free_lines(cl); - if (rv != 0) { - free_options_test_data(result); - result = NULL; - /* Callers expect a non-NULL result, so just die if we can't provide one. - */ - tor_assert(0); - } - return result; -} - -static void -free_options_test_data(options_test_data_t *td) -{ - if (!td) return; - or_options_free(td->old_opt); - or_options_free(td->opt); - or_options_free(td->def_opt); - tor_free(td); -} - -static void -test_options_validate__uname_for_server(void *ignored) -{ - (void)ignored; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "ORPort 127.0.0.1:5555"); - setup_capture_of_logs(LOG_WARN); - - MOCK(get_uname, fixed_get_uname); - fixed_get_uname_result = "Windows 95"; - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("Tor is running as a server, but you" - " are running Windows 95; this probably won't work. See https://www" - ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); - tor_free(msg); - - fixed_get_uname_result = "Windows 98"; - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("Tor is running as a server, but you" - " are running Windows 98; this probably won't work. See https://www" - ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); - tor_free(msg); - - fixed_get_uname_result = "Windows Me"; - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("Tor is running as a server, but you" - " are running Windows Me; this probably won't work. See https://www" - ".torproject.org/docs/faq.html#BestOSForRelay for details.\n"); - tor_free(msg); - - fixed_get_uname_result = "Windows 2000"; - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_no_log_entry(); - tor_free(msg); - - done: - UNMOCK(get_uname); - free_options_test_data(tdata); - tor_free(msg); - teardown_capture_of_logs(); -} - -static void -test_options_validate__outbound_addresses(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "OutboundBindAddress xxyy!!!sdfaf"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Multiple outbound bind addresses configured: " - "xxyy!!!sdfaf"); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__data_directory(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "DataDirectory longreallyl" - "ongLONGLONGlongreallylong" - "LONGLONGlongreallylongLON" - "GLONGlongreallylongLONGLO" - "NGlongreallylongLONGLONGl" - "ongreallylongLONGLONGlong" - "reallylongLONGLONGlongrea" - "llylongLONGLONGlongreally" - "longLONGLONGlongreallylon" - "gLONGLONGlongreallylongLO" - "NGLONGlongreallylongLONGL" - "ONGlongreallylongLONGLONG" - "longreallylongLONGLONGlon" - "greallylongLONGLONGlongre" - "allylongLONGLONGlongreall" - "ylongLONGLONGlongreallylo" - "ngLONGLONGlongreallylongL" - "ONGLONGlongreallylongLONG" - "LONG"); // 440 characters - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Invalid DataDirectory"); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__nickname(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "Nickname ThisNickNameIsABitTooLong"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Nickname 'ThisNickNameIsABitTooLong', nicknames must be between " - "1 and 19 characters inclusive, and must contain only the " - "characters [a-zA-Z0-9]."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("Nickname AMoreValidNick"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("DataDirectory /tmp/somewhere"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__contactinfo(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "ORPort 127.0.0.1:5555"); - setup_capture_of_logs(LOG_DEBUG); - tdata->opt->ContactInfo = NULL; - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg( - "Your ContactInfo config option is not" - " set. Please consider setting it, so we can contact you if your" - " server is misconfigured or something else goes wrong.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ORPort 127.0.0.1:5555\n" - "ContactInfo hella@example.org"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_no_log_msg( - "Your ContactInfo config option is not" - " set. Please consider setting it, so we can contact you if your" - " server is misconfigured or something else goes wrong.\n"); - tor_free(msg); - - done: - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__logs(void *ignored) -{ - (void)ignored; - int ret; - (void)ret; - char *msg; - int orig_quiet_level = quiet_level; - options_test_data_t *tdata = get_options_test_data(""); - tdata->opt->Logs = NULL; - tdata->opt->RunAsDaemon = 0; - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(tdata->opt->Logs->key, OP_EQ, "Log"); - tt_str_op(tdata->opt->Logs->value, OP_EQ, "notice stdout"); - tor_free(msg); - tt_int_op(ret, OP_EQ, -1); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - tdata->opt->Logs = NULL; - tdata->opt->RunAsDaemon = 0; - quiet_level = 1; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(tdata->opt->Logs->key, OP_EQ, "Log"); - tt_str_op(tdata->opt->Logs->value, OP_EQ, "warn stdout"); - tor_free(msg); - tt_int_op(ret, OP_EQ, -1); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - tdata->opt->Logs = NULL; - tdata->opt->RunAsDaemon = 0; - quiet_level = 2; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_assert(!tdata->opt->Logs); - tor_free(msg); - tt_int_op(ret, OP_EQ, -1); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - tdata->opt->Logs = NULL; - tdata->opt->RunAsDaemon = 0; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 1, &msg); - tt_assert(!tdata->opt->Logs); - tor_free(msg); - tt_int_op(ret, OP_EQ, -1); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - tdata->opt->Logs = NULL; - tdata->opt->RunAsDaemon = 1; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_assert(!tdata->opt->Logs); - tor_free(msg); - tt_int_op(ret, OP_EQ, -1); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - tdata->opt->RunAsDaemon = 0; - config_line_t *cl=NULL; - config_get_lines("Log foo", &cl, 1); - tdata->opt->Logs = cl; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op((intptr_t)tdata->opt->Logs, OP_EQ, (intptr_t)cl); - tt_int_op(ret, OP_EQ, -1); - - done: - quiet_level = orig_quiet_level; - free_options_test_data(tdata); - tor_free(msg); -} - -/* static config_line_t * */ -/* mock_config_line(const char *key, const char *val) */ -/* { */ -/* config_line_t *config_line = tor_malloc(sizeof(config_line_t)); */ -/* memset(config_line, 0, sizeof(config_line_t)); */ -/* config_line->key = tor_strdup(key); */ -/* config_line->value = tor_strdup(val); */ -/* return config_line; */ -/* } */ - -static void -test_options_validate__authdir(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_INFO); - options_test_data_t *tdata = get_options_test_data( - "AuthoritativeDirectory 1\n" - "Address this.should.not!exist!.example.org"); - - sandbox_disable_getaddrinfo_cache(); - - MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - UNMOCK(tor_addr_lookup); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Failed to resolve/guess local address. See logs for" - " details."); - expect_log_msg("Could not resolve local Address " - "'this.should.not!exist!.example.org'. Failing.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Authoritative directory servers must set " - "ContactInfo"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Authoritative directory servers must set ContactInfo"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "TestingTorNetwork 1\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" - "AuthoritativeDir is set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" - "AuthoritativeDir is set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "RecommendedVersions 1.2, 3.14\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(tdata->opt->RecommendedClientVersions->value, OP_EQ, "1.2, 3.14"); - tt_str_op(tdata->opt->RecommendedServerVersions->value, OP_EQ, "1.2, 3.14"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "RecommendedVersions 1.2, 3.14\n" - "RecommendedClientVersions 25\n" - "RecommendedServerVersions 4.18\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(tdata->opt->RecommendedClientVersions->value, OP_EQ, "25"); - tt_str_op(tdata->opt->RecommendedServerVersions->value, OP_EQ, "4.18"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "VersioningAuthoritativeDirectory 1\n" - "RecommendedVersions 1.2, 3.14\n" - "RecommendedClientVersions 25\n" - "RecommendedServerVersions 4.18\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" - "AuthoritativeDir is set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "VersioningAuthoritativeDirectory 1\n" - "RecommendedServerVersions 4.18\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, "Versioning authoritative dir servers must set " - "Recommended*Versions."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "VersioningAuthoritativeDirectory 1\n" - "RecommendedClientVersions 4.18\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, "Versioning authoritative dir servers must set " - "Recommended*Versions."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "UseEntryGuards 1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("Authoritative directory servers " - "can't set UseEntryGuards. Disabling.\n"); - tt_int_op(tdata->opt->UseEntryGuards, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "V3AuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("Authoritative directories always try" - " to download extra-info documents. Setting DownloadExtraInfo.\n"); - tt_int_op(tdata->opt->DownloadExtraInfo, OP_EQ, 1); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "DownloadExtraInfo 1\n" - "V3AuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_no_log_msg("Authoritative directories always try" - " to download extra-info documents. Setting DownloadExtraInfo.\n"); - tt_int_op(tdata->opt->DownloadExtraInfo, OP_EQ, 1); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, "AuthoritativeDir is set, but none of (Bridge/V3)" - "AuthoritativeDir is set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n" - "V3BandwidthsFile non-existant-file\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no DirPort set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n" - "V3BandwidthsFile non-existant-file\n"); - mock_clean_saved_logs(); - options_validate(NULL, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no DirPort set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n" - "GuardfractionFile non-existant-file\n"); - mock_clean_saved_logs(); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no DirPort set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n" - "GuardfractionFile non-existant-file\n"); - mock_clean_saved_logs(); - options_validate(NULL, tdata->opt, tdata->def_opt, 0, &msg); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no DirPort set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no DirPort set."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("AuthoritativeDirectory 1\n" - "Address 100.200.10.1\n" - "DirPort 999\n" - "BridgeAuthoritativeDir 1\n" - "ContactInfo hello@hello.com\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Running as authoritative directory, but no ORPort set."); - tor_free(msg); - - // TODO: This case can't be reached, since clientonly is used to - // check when parsing port lines as well. - /* free_options_test_data(tdata); */ - /* tdata = get_options_test_data("AuthoritativeDirectory 1\n" */ - /* "Address 100.200.10.1\n" */ - /* "DirPort 999\n" */ - /* "ORPort 888\n" */ - /* "ClientOnly 1\n" */ - /* "BridgeAuthoritativeDir 1\n" */ - /* "ContactInfo hello@hello.com\n" ); */ - /* mock_clean_saved_logs(); */ - /* ret = options_validate(tdata->old_opt, tdata->opt, */ - /* tdata->def_opt, 0, &msg); */ - /* tt_int_op(ret, OP_EQ, -1); */ - /* tt_str_op(msg, OP_EQ, "Running as authoritative directory, " */ - /* "but ClientOnly also set."); */ - - done: - teardown_capture_of_logs(); - // sandbox_free_getaddrinfo_cache(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__relay_with_hidden_services(void *ignored) -{ - (void)ignored; - char *msg; - setup_capture_of_logs(LOG_DEBUG); - options_test_data_t *tdata = get_options_test_data( - "ORPort 127.0.0.1:5555\n" - "HiddenServiceDir " - "/Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg( - "Tor is currently configured as a relay and a hidden service. " - "That's not very secure: you should probably run your hidden servi" - "ce in a separate Tor process, at least -- see " - "https://trac.torproject.org/8742\n"); - - done: - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -// TODO: it doesn't seem possible to hit the case of having no port lines at -// all, since there will be a default created for SocksPort -/* static void */ -/* test_options_validate__ports(void *ignored) */ -/* { */ -/* (void)ignored; */ -/* int ret; */ -/* char *msg; */ -/* setup_capture_of_logs(LOG_WARN); */ -/* options_test_data_t *tdata = get_options_test_data(""); */ -/* ret = options_validate(tdata->old_opt, tdata->opt, */ -/* tdata->def_opt, 0, &msg); */ -/* expect_log_msg("SocksPort, TransPort, NATDPort, DNSPort, and ORPort " */ -/* "are all undefined, and there aren't any hidden services " */ -/* "configured. " */ -/* " Tor will still run, but probably won't do anything.\n"); */ -/* done: */ -/* teardown_capture_of_logs(); */ -/* free_options_test_data(tdata); */ -/* tor_free(msg); */ -/* } */ - -static void -test_options_validate__transproxy(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata; - -#ifdef USE_TRANSPARENT - // Test default trans proxy - tdata = get_options_test_data("TransProxyType default\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_DEFAULT); - tor_free(msg); - - // Test pf-divert trans proxy - free_options_test_data(tdata); - tdata = get_options_test_data("TransProxyType pf-divert\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - -#if !defined(OpenBSD) && !defined( DARWIN ) - tt_str_op(msg, OP_EQ, - "pf-divert is a OpenBSD-specific and OS X/Darwin-specific feature."); -#else - tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_PF_DIVERT); - tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without " - "any valid TransPort."); -#endif /* !defined(OpenBSD) && !defined( DARWIN ) */ - tor_free(msg); - - // Test tproxy trans proxy - free_options_test_data(tdata); - tdata = get_options_test_data("TransProxyType tproxy\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - -#if !defined(__linux__) - tt_str_op(msg, OP_EQ, "TPROXY is a Linux-specific feature."); -#else - tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_TPROXY); - tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without any valid " - "TransPort."); -#endif /* !defined(__linux__) */ - tor_free(msg); - - // Test ipfw trans proxy - free_options_test_data(tdata); - tdata = get_options_test_data("TransProxyType ipfw\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - -#ifndef KERNEL_MAY_SUPPORT_IPFW - tt_str_op(msg, OP_EQ, "ipfw is a FreeBSD-specific and OS X/Darwin-specific " - "feature."); -#else - tt_int_op(tdata->opt->TransProxyType_parsed, OP_EQ, TPT_IPFW); - tt_str_op(msg, OP_EQ, "Cannot use TransProxyType without any valid " - "TransPort."); -#endif /* !defined(KERNEL_MAY_SUPPORT_IPFW) */ - tor_free(msg); - - // Test unknown trans proxy - free_options_test_data(tdata); - tdata = get_options_test_data("TransProxyType non-existant\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Unrecognized value for TransProxyType"); - tor_free(msg); - - // Test trans proxy success - free_options_test_data(tdata); - tdata = NULL; - -#if defined(__linux__) - tdata = get_options_test_data("TransProxyType tproxy\n" - "TransPort 127.0.0.1:123\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); -#elif defined(KERNEL_MAY_SUPPORT_IPFW) - tdata = get_options_test_data("TransProxyType ipfw\n" - "TransPort 127.0.0.1:123\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - tor_free(msg); -#elif defined(OpenBSD) - tdata = get_options_test_data("TransProxyType pf-divert\n" - "TransPort 127.0.0.1:123\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - tor_free(msg); -#elif defined(__NetBSD__) - tdata = get_options_test_data("TransProxyType default\n" - "TransPort 127.0.0.1:123\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - tor_free(msg); -#endif /* defined(__linux__) || ... */ - - // Assert that a test has run for some TransProxyType - tt_assert(tdata); - -#else /* !(defined(USE_TRANSPARENT)) */ - tdata = get_options_test_data("TransPort 127.0.0.1:555\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TransPort is disabled in this build."); - tor_free(msg); -#endif /* defined(USE_TRANSPARENT) */ - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -NS_DECL(country_t, geoip_get_country, (const char *country)); - -static country_t -NS(geoip_get_country)(const char *countrycode) -{ - (void)countrycode; - CALLED(geoip_get_country)++; - - return 1; -} - -static void -test_options_validate__exclude_nodes(void *ignored) -{ - (void)ignored; - - NS_MOCK(geoip_get_country); - - int ret; - char *msg; - setup_capture_of_logs(LOG_WARN); - options_test_data_t *tdata = get_options_test_data( - "ExcludeExitNodes {us}\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 1); - tt_str_op((char *) - (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), - OP_EQ, "{us}"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ExcludeNodes {cn}\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 1); - tt_str_op((char *) - (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), - OP_EQ, "{cn}"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ExcludeNodes {cn}\n" - "ExcludeExitNodes {us} {cn}\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(smartlist_len(tdata->opt->ExcludeExitNodesUnion_->list), OP_EQ, 2); - tt_str_op((char *) - (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 0)), - OP_EQ, "{us} {cn}"); - tt_str_op((char *) - (smartlist_get(tdata->opt->ExcludeExitNodesUnion_->list, 1)), - OP_EQ, "{cn}"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ExcludeNodes {cn}\n" - "StrictNodes 1\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg( - "You have asked to exclude certain relays from all positions " - "in your circuits. Expect hidden services and other Tor " - "features to be broken in unpredictable ways.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ExcludeNodes {cn}\n"); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_no_log_msg( - "You have asked to exclude certain relays from all positions " - "in your circuits. Expect hidden services and other Tor " - "features to be broken in unpredictable ways.\n"); - tor_free(msg); - - done: - NS_UNMOCK(geoip_get_country); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__node_families(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "NodeFamily flux, flax\n" - "NodeFamily somewhere\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(tdata->opt->NodeFamilySets); - tt_int_op(smartlist_len(tdata->opt->NodeFamilySets), OP_EQ, 2); - tt_str_op((char *)(smartlist_get( - ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 0))->list, 0)), - OP_EQ, "flux"); - tt_str_op((char *)(smartlist_get( - ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 0))->list, 1)), - OP_EQ, "flax"); - tt_str_op((char *)(smartlist_get( - ((routerset_t *)smartlist_get(tdata->opt->NodeFamilySets, 1))->list, 0)), - OP_EQ, "somewhere"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(""); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(!tdata->opt->NodeFamilySets); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("NodeFamily !flux\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(tdata->opt->NodeFamilySets); - tt_int_op(smartlist_len(tdata->opt->NodeFamilySets), OP_EQ, 0); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__token_bucket(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data(""); - - tdata->opt->TokenBucketRefillInterval = 0; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "TokenBucketRefillInterval must be between 1 and 1000 inclusive."); - tor_free(msg); - - tdata->opt->TokenBucketRefillInterval = 1001; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "TokenBucketRefillInterval must be between 1 and 1000 inclusive."); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__recommended_packages(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_WARN); - options_test_data_t *tdata = get_options_test_data( - "RecommendedPackages foo 1.2 http://foo.com sha1=123123123123\n" - "RecommendedPackages invalid-package-line\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_no_log_msg("Invalid RecommendedPackage line " - "invalid-package-line will be ignored\n"); - - done: - escaped(NULL); // This will free the leaking memory from the previous escaped - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__fetch_dir(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "FetchDirInfoExtraEarly 1\n" - "FetchDirInfoEarly 0\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "FetchDirInfoExtraEarly requires that you" - " also set FetchDirInfoEarly"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("FetchDirInfoExtraEarly 1\n" - "FetchDirInfoEarly 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_NE, "FetchDirInfoExtraEarly requires that you" - " also set FetchDirInfoEarly"); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__conn_limit(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "ConnLimit 0\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConnLimit must be greater than 0, but was set to 0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024, " - "but was set to 0"); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__paths_needed(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_WARN); - options_test_data_t *tdata = get_options_test_data( - "PathsNeededToBuildCircuits 0.1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.24 && - tdata->opt->PathsNeededToBuildCircuits < 0.26); - expect_log_msg("PathsNeededToBuildCircuits is too low. " - "Increasing to 0.25\n"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data("PathsNeededToBuildCircuits 0.99\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.94 && - tdata->opt->PathsNeededToBuildCircuits < 0.96); - expect_log_msg("PathsNeededToBuildCircuits is " - "too high. Decreasing to 0.95\n"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data("PathsNeededToBuildCircuits 0.91\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(tdata->opt->PathsNeededToBuildCircuits > 0.90 && - tdata->opt->PathsNeededToBuildCircuits < 0.92); - expect_no_log_entry(); - tor_free(msg); - - done: - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__max_client_circuits(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "MaxClientCircuitsPending 0\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024," - " but was set to 0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("MaxClientCircuitsPending 1025\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "MaxClientCircuitsPending must be between 1 and 1024," - " but was set to 1025"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__ports(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "FirewallPorts 65537\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Port '65537' out of range in FirewallPorts"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("FirewallPorts 1\n" - "LongLivedPorts 124444\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Port '124444' out of range in LongLivedPorts"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("FirewallPorts 1\n" - "LongLivedPorts 2\n" - "RejectPlaintextPorts 112233\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Port '112233' out of range in RejectPlaintextPorts"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("FirewallPorts 1\n" - "LongLivedPorts 2\n" - "RejectPlaintextPorts 3\n" - "WarnPlaintextPorts 65536\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Port '65536' out of range in WarnPlaintextPorts"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("FirewallPorts 1\n" - "LongLivedPorts 2\n" - "RejectPlaintextPorts 3\n" - "WarnPlaintextPorts 4\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__reachable_addresses(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_NOTICE); - options_test_data_t *tdata = get_options_test_data( - "FascistFirewall 1\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg("Converting FascistFirewall config " - "option to new format: \"ReachableDirAddresses *:80\"\n"); - tt_str_op(tdata->opt->ReachableDirAddresses->value, OP_EQ, "*:80"); - expect_log_msg("Converting FascistFirewall config " - "option to new format: \"ReachableORAddresses *:443\"\n"); - tt_str_op(tdata->opt->ReachableORAddresses->value, OP_EQ, "*:443"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data("FascistFirewall 1\n" - "ReachableDirAddresses *:81\n" - "ReachableORAddresses *:444\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - tdata->opt->FirewallPorts = smartlist_new(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_entry(); - tt_str_op(tdata->opt->ReachableDirAddresses->value, OP_EQ, "*:81"); - tt_str_op(tdata->opt->ReachableORAddresses->value, OP_EQ, "*:444"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data("FascistFirewall 1\n" - "FirewallPort 123\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg("Converting FascistFirewall and " - "FirewallPorts config options to new format: " - "\"ReachableAddresses *:123\"\n"); - tt_str_op(tdata->opt->ReachableAddresses->value, OP_EQ, "*:123"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data("FascistFirewall 1\n" - "ReachableAddresses *:82\n" - "ReachableAddresses *:83\n" - "ReachableAddresses reject *:*\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_entry(); - tt_str_op(tdata->opt->ReachableAddresses->value, OP_EQ, "*:82"); - tor_free(msg); - -#define SERVERS_REACHABLE_MSG "Servers must be able to freely connect to" \ - " the rest of the Internet, so they must not set Reachable*Addresses or" \ - " FascistFirewall or FirewallPorts or ClientUseIPv4 0." - - free_options_test_data(tdata); - tdata = get_options_test_data("ReachableAddresses *:82\n" - "ORPort 127.0.0.1:5555\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ReachableORAddresses *:82\n" - "ORPort 127.0.0.1:5555\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ReachableDirAddresses *:82\n" - "ORPort 127.0.0.1:5555\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("ClientUseIPv4 0\n" - "ORPort 127.0.0.1:5555\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, SERVERS_REACHABLE_MSG); - tor_free(msg); - - /* Test IPv4-only clients setting IPv6 preferences */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientUseIPv4 1\n" - "ClientUseIPv6 0\n" - "UseBridges 0\n" - "ClientPreferIPv6ORPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientUseIPv4 1\n" - "ClientUseIPv6 0\n" - "UseBridges 0\n" - "ClientPreferIPv6DirPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - /* Now test an IPv4/IPv6 client setting IPv6 preferences */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientUseIPv4 1\n" - "ClientUseIPv6 1\n" - "ClientPreferIPv6ORPort 1\n" - "ClientPreferIPv6DirPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* Now test an IPv6 client setting IPv6 preferences */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientUseIPv6 1\n" - "ClientPreferIPv6ORPort 1\n" - "ClientPreferIPv6DirPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* And an implicit (IPv4 disabled) IPv6 client setting IPv6 preferences */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientUseIPv4 0\n" - "ClientPreferIPv6ORPort 1\n" - "ClientPreferIPv6DirPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - /* And an implicit (bridge) client setting IPv6 preferences */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "UseBridges 1\n" - "Bridge 127.0.0.1:12345\n" - "ClientPreferIPv6ORPort 1\n" - "ClientPreferIPv6DirPort 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - done: - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__use_bridges(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "UseBridges 1\n" - "ClientUseIPv4 1\n" - "ORPort 127.0.0.1:5555\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Servers must be able to freely connect to the rest of" - " the Internet, so they must not set UseBridges."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("UseBridges 1\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_NE, "Servers must be able to freely connect to the rest of" - " the Internet, so they must not set UseBridges."); - tor_free(msg); - - NS_MOCK(geoip_get_country); - free_options_test_data(tdata); - tdata = get_options_test_data("UseBridges 1\n" - "EntryNodes {cn}\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "You cannot set both UseBridges and EntryNodes."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "UseBridges 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "If you set UseBridges, you must specify at least one bridge."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "UseBridges 1\n" - "Bridge 10.0.0.1\n" - "UseEntryGuards 0\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Setting UseBridges requires also setting UseEntryGuards."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "UseBridges 1\n" - "Bridge 10.0.0.1\n" - "Bridge !!!\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Bridge line did not parse. See logs for details."); - tor_free(msg); - - done: - NS_UNMOCK(geoip_get_country); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__entry_nodes(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - NS_MOCK(geoip_get_country); - options_test_data_t *tdata = get_options_test_data( - "EntryNodes {cn}\n" - "UseEntryGuards 0\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "If EntryNodes is set, UseEntryGuards must be enabled."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("EntryNodes {cn}\n" - "UseEntryGuards 1\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "KeepalivePeriod option must be positive."); - tor_free(msg); - - done: - NS_UNMOCK(geoip_get_country); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__safe_logging(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = get_options_test_data( - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_NONE); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("SafeLogging 0\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_NONE); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("SafeLogging Relay\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_RELAY); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("SafeLogging 1\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_int_op(tdata->opt->SafeLogging_, OP_EQ, SAFELOG_SCRUB_ALL); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("SafeLogging stuffy\n" - "MaxClientCircuitsPending 1\n" - "ConnLimit 1\n"); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Unrecognized value '\"stuffy\"' in SafeLogging"); - tor_free(msg); - - done: - escaped(NULL); // This will free the leaking memory from the previous escaped - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__publish_server_descriptor(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_WARN); - options_test_data_t *tdata = get_options_test_data( - "PublishServerDescriptor bridge\n" TEST_OPTIONS_DEFAULT_VALUES - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("PublishServerDescriptor humma\n" - TEST_OPTIONS_DEFAULT_VALUES); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Unrecognized value in PublishServerDescriptor"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("PublishServerDescriptor bridge, v3\n" - TEST_OPTIONS_DEFAULT_VALUES); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Bridges are not supposed to publish router " - "descriptors to the directory authorities. Please correct your " - "PublishServerDescriptor line."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("BridgeRelay 1\n" - "PublishServerDescriptor v3\n" - TEST_OPTIONS_DEFAULT_VALUES); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Bridges are not supposed to publish router " - "descriptors to the directory authorities. Please correct your " - "PublishServerDescriptor line."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("BridgeRelay 1\n" TEST_OPTIONS_DEFAULT_VALUES); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_NE, "Bridges are not supposed to publish router " - "descriptors to the directory authorities. Please correct your " - "PublishServerDescriptor line."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data("BridgeRelay 1\n" - "DirPort 999\n" TEST_OPTIONS_DEFAULT_VALUES); - - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - expect_log_msg("Can't set a DirPort on a bridge " - "relay; disabling DirPort\n"); - tt_assert(!tdata->opt->DirPort_lines); - tt_assert(!tdata->opt->DirPort_set); - - done: - teardown_capture_of_logs(); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__testing(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - -#define ENSURE_DEFAULT(varname, varval) \ - STMT_BEGIN \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ - #varname " " #varval "\n"); \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - tt_str_op(msg, OP_EQ, \ - #varname " may only be changed in testing Tor networks!"); \ - tt_int_op(ret, OP_EQ, -1); \ - tor_free(msg); \ - \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ - #varname " " #varval "\n" \ - VALID_DIR_AUTH \ - "TestingTorNetwork 1\n"); \ - \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - if (msg) { \ - tt_str_op(msg, OP_NE, \ - #varname " may only be changed in testing Tor networks!"); \ - tor_free(msg); \ - } \ - \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ - #varname " " #varval "\n" \ - "___UsingTestNetworkDefaults 1\n"); \ - \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - if (msg) { \ - tt_str_op(msg, OP_NE, \ - #varname " may only be changed in testing Tor networks!"); \ - tor_free(msg); \ - } \ - STMT_END - - ENSURE_DEFAULT(TestingV3AuthInitialVotingInterval, 3600); - ENSURE_DEFAULT(TestingV3AuthInitialVoteDelay, 3000); - ENSURE_DEFAULT(TestingV3AuthInitialDistDelay, 3000); - ENSURE_DEFAULT(TestingV3AuthVotingStartOffset, 3000); - ENSURE_DEFAULT(TestingAuthDirTimeToLearnReachability, 3000); - ENSURE_DEFAULT(TestingEstimatedDescriptorPropagationTime, 3000); - ENSURE_DEFAULT(TestingServerDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingClientDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingServerConsensusDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingClientConsensusDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingBridgeDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingBridgeBootstrapDownloadSchedule, 3000); - ENSURE_DEFAULT(TestingClientMaxIntervalWithoutRequest, 3000); - ENSURE_DEFAULT(TestingDirConnectionMaxStall, 3000); - ENSURE_DEFAULT(TestingConsensusMaxDownloadTries, 3000); - ENSURE_DEFAULT(TestingDescriptorMaxDownloadTries, 3000); - ENSURE_DEFAULT(TestingMicrodescMaxDownloadTries, 3000); - ENSURE_DEFAULT(TestingCertMaxDownloadTries, 3000); - ENSURE_DEFAULT(TestingAuthKeyLifetime, 3000); - ENSURE_DEFAULT(TestingLinkCertLifetime, 3000); - ENSURE_DEFAULT(TestingSigningKeySlop, 3000); - ENSURE_DEFAULT(TestingAuthKeySlop, 3000); - ENSURE_DEFAULT(TestingLinkKeySlop, 3000); - - done: - escaped(NULL); // This will free the leaking memory from the previous escaped - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__hidserv(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - setup_capture_of_logs(LOG_WARN); - - options_test_data_t *tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES); - tdata->opt->MinUptimeHidServDirectoryV2 = -1; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("MinUptimeHidServDirectoryV2 " - "option must be at least 0 seconds. Changing to 0.\n"); - tt_int_op(tdata->opt->MinUptimeHidServDirectoryV2, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RendPostPeriod 1\n" ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("RendPostPeriod option is too short;" - " raising to 600 seconds.\n"); - tt_int_op(tdata->opt->RendPostPeriod, OP_EQ, 600); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RendPostPeriod 302401\n" ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("RendPostPeriod is too large; " - "clipping to 302400s.\n"); - tt_int_op(tdata->opt->RendPostPeriod, OP_EQ, 302400); - tor_free(msg); - - done: - teardown_capture_of_logs(); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__path_bias(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - - options_test_data_t *tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "PathBiasNoticeRate 1.1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "PathBiasNoticeRate is too high. It must be between 0 and 1.0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PathBiasWarnRate 1.1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "PathBiasWarnRate is too high. It must be between 0 and 1.0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PathBiasExtremeRate 1.1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "PathBiasExtremeRate is too high. It must be between 0 and 1.0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PathBiasNoticeUseRate 1.1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "PathBiasNoticeUseRate is too high. It must be between 0 and 1.0"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PathBiasExtremeUseRate 1.1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "PathBiasExtremeUseRate is too high. It must be between 0 and 1.0"); - tor_free(msg); - - done: - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__bandwidth(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - -#define ENSURE_BANDWIDTH_PARAM(p) \ - STMT_BEGIN \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES #p " 3Gb\n"); \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - tt_int_op(ret, OP_EQ, -1); \ - tt_mem_op(msg, OP_EQ, #p " (3221225471) must be at most 2147483647", 40); \ - tor_free(msg); \ - STMT_END - - ENSURE_BANDWIDTH_PARAM(BandwidthRate); - ENSURE_BANDWIDTH_PARAM(BandwidthBurst); - ENSURE_BANDWIDTH_PARAM(MaxAdvertisedBandwidth); - ENSURE_BANDWIDTH_PARAM(RelayBandwidthRate); - ENSURE_BANDWIDTH_PARAM(RelayBandwidthBurst); - ENSURE_BANDWIDTH_PARAM(PerConnBWRate); - ENSURE_BANDWIDTH_PARAM(PerConnBWBurst); - ENSURE_BANDWIDTH_PARAM(AuthDirFastGuarantee); - ENSURE_BANDWIDTH_PARAM(AuthDirGuardBWGuarantee); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RelayBandwidthRate 1000\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_u64_op(tdata->opt->RelayBandwidthBurst, OP_EQ, 1000); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RelayBandwidthBurst 1001\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_u64_op(tdata->opt->RelayBandwidthRate, OP_EQ, 1001); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RelayBandwidthRate 1001\n" - "RelayBandwidthBurst 1000\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "RelayBandwidthBurst must be at least equal to " - "RelayBandwidthRate."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "BandwidthRate 1001\n" - "BandwidthBurst 1000\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "BandwidthBurst must be at least equal to BandwidthRate."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RelayBandwidthRate 1001\n" - "BandwidthRate 1000\n" - "BandwidthBurst 1000\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_u64_op(tdata->opt->BandwidthRate, OP_EQ, 1001); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "RelayBandwidthRate 1001\n" - "BandwidthRate 1000\n" - "RelayBandwidthBurst 1001\n" - "BandwidthBurst 1000\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_u64_op(tdata->opt->BandwidthBurst, OP_EQ, 1001); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "BandwidthRate is set to 1 bytes/second. For servers," - " it must be at least 76800."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76800\n" - "MaxAdvertisedBandwidth 30000\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "MaxAdvertisedBandwidth is set to 30000 bytes/second." - " For servers, it must be at least 38400."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76800\n" - "RelayBandwidthRate 1\n" - "MaxAdvertisedBandwidth 38400\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "RelayBandwidthRate is set to 1 bytes/second. For " - "servers, it must be at least 76800."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76800\n" - "BandwidthBurst 76800\n" - "RelayBandwidthRate 76800\n" - "MaxAdvertisedBandwidth 38400\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - done: - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__circuits(void *ignored) -{ - (void)ignored; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "MaxCircuitDirtiness 2592001\n"); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("MaxCircuitDirtiness option is too " - "high; setting to 30 days.\n"); - tt_int_op(tdata->opt->MaxCircuitDirtiness, OP_EQ, 2592000); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CircuitStreamTimeout 1\n"); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("CircuitStreamTimeout option is too" - " short; raising to 10 seconds.\n"); - tt_int_op(tdata->opt->CircuitStreamTimeout, OP_EQ, 10); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CircuitStreamTimeout 111\n"); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_no_log_msg("CircuitStreamTimeout option is too" - " short; raising to 10 seconds.\n"); - tt_int_op(tdata->opt->CircuitStreamTimeout, OP_EQ, 111); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HeartbeatPeriod 1\n"); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("HeartbeatPeriod option is too short;" - " raising to 1800 seconds.\n"); - tt_int_op(tdata->opt->HeartbeatPeriod, OP_EQ, 1800); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HeartbeatPeriod 1982\n"); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_no_log_msg("HeartbeatPeriod option is too short;" - " raising to 1800 seconds.\n"); - tt_int_op(tdata->opt->HeartbeatPeriod, OP_EQ, 1982); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CircuitBuildTimeout 1\n" - ); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_log_msg("CircuitBuildTimeout is shorter (1" - " seconds) than the recommended minimum (10 seconds), and " - "LearnCircuitBuildTimeout is disabled. If tor isn't working, " - "raise this value or enable LearnCircuitBuildTimeout.\n"); - tor_free(msg); - - free_options_test_data(tdata); - mock_clean_saved_logs(); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CircuitBuildTimeout 11\n" - ); - options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - expect_no_log_msg("CircuitBuildTimeout is shorter (1 " - "seconds) than the recommended minimum (10 seconds), and " - "LearnCircuitBuildTimeout is disabled. If tor isn't working, " - "raise this value or enable LearnCircuitBuildTimeout.\n"); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__port_forwarding(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PortForwarding 1\nSandbox 1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "PortForwarding is not compatible with Sandbox;" - " at most one can be set"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "PortForwarding 1\nSandbox 0\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - done: - free_options_test_data(tdata); - policies_free_all(); - tor_free(msg); -} - -static void -test_options_validate__tor2web(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Tor2webRendezvousPoints 1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Tor2webRendezvousPoints cannot be set without Tor2webMode."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Tor2webRendezvousPoints 1\nTor2webMode 1\n"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - done: - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__rend(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "UseEntryGuards 0\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("UseEntryGuards is disabled, but you" - " have configured one or more hidden services on this Tor " - "instance. Your hidden services will be very easy to locate using" - " a well-known attack -- see http://freehaven.net/anonbib/#hs-" - "attack06 for details.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "UseEntryGuards 1\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg("UseEntryGuards is disabled, but you" - " have configured one or more hidden services on this Tor " - "instance. Your hidden services will be very easy to locate using" - " a well-known attack -- see http://freehaven.net/anonbib/#hs-" - "attack06 for details.\n"); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Failed to configure rendezvous options. See logs for details."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HidServAuth failed\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Failed to configure client authorization for hidden " - "services. See logs for details."); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__single_onion(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - /* Test that HiddenServiceSingleHopMode must come with - * HiddenServiceNonAnonymousMode */ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 0\n" - "HiddenServiceSingleHopMode 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HiddenServiceSingleHopMode does not provide any " - "server anonymity. It must be used with " - "HiddenServiceNonAnonymousMode set to 1."); - tor_free(msg); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 0\n" - "HiddenServiceSingleHopMode 1\n" - "HiddenServiceNonAnonymousMode 0\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HiddenServiceSingleHopMode does not provide any " - "server anonymity. It must be used with " - "HiddenServiceNonAnonymousMode set to 1."); - tor_free(msg); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 0\n" - "HiddenServiceSingleHopMode 1\n" - "HiddenServiceNonAnonymousMode 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - free_options_test_data(tdata); - - /* Test that SOCKSPort must come with Tor2webMode if - * HiddenServiceSingleHopMode is 1 */ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 5000\n" - "HiddenServiceSingleHopMode 1\n" - "HiddenServiceNonAnonymousMode 1\n" - "Tor2webMode 0\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode is incompatible with " - "using Tor as an anonymous client. Please set " - "Socks/Trans/NATD/DNSPort to 0, or revert " - "HiddenServiceNonAnonymousMode to 0."); - tor_free(msg); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 0\n" - "HiddenServiceSingleHopMode 1\n" - "HiddenServiceNonAnonymousMode 1\n" - "Tor2webMode 0\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 5000\n" - "HiddenServiceSingleHopMode 0\n" - "Tor2webMode 0\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "SOCKSPort 5000\n" - "HiddenServiceSingleHopMode 1\n" - "HiddenServiceNonAnonymousMode 1\n" - "Tor2webMode 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - free_options_test_data(tdata); - - /* Test that a hidden service can't be run with Tor2web - * Use HiddenServiceNonAnonymousMode instead of Tor2webMode, because - * Tor2webMode requires a compilation #define */ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceNonAnonymousMode 1\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode does not provide any " - "server anonymity. It must be used with " - "HiddenServiceSingleHopMode set to 1."); - tor_free(msg); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceNonAnonymousMode 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HiddenServiceNonAnonymousMode does not provide any " - "server anonymity. It must be used with " - "HiddenServiceSingleHopMode set to 1."); - tor_free(msg); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceNonAnonymousMode 1\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - "HiddenServiceSingleHopMode 1\n" - "SOCKSPort 0\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_ptr_op(msg, OP_EQ, NULL); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__accounting(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccountingRule something_bad\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "AccountingRule must be 'sum', 'max', 'in', or 'out'"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccountingRule sum\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->AccountingRule, OP_EQ, ACCT_SUM); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccountingRule max\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->AccountingRule, OP_EQ, ACCT_MAX); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccountingStart fail\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Failed to parse accounting options. See logs for details."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccountingMax 10\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76800\n" - "BandwidthBurst 76800\n" - "MaxAdvertisedBandwidth 38400\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - "AccountingMax 10\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("Using accounting with a hidden " - "service and an ORPort is risky: your hidden service(s) and " - "your public address will all turn off at the same time, " - "which may alert observers that they are being run by the " - "same party.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - "AccountingMax 10\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg("Using accounting with a hidden " - "service and an ORPort is risky: your hidden service(s) and " - "your public address will all turn off at the same time, " - "which may alert observers that they are being run by the " - "same party.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/\n" - "HiddenServicePort 80 127.0.0.1:8080\n" - "HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service2/\n" - "HiddenServicePort 81 127.0.0.1:8081\n" - "AccountingMax 10\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("Using accounting with multiple " - "hidden services is risky: they will all turn off at the same" - " time, which may alert observers that they are being run by " - "the same party.\n"); - tor_free(msg); - - done: - teardown_capture_of_logs(); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__proxy(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - sandbox_disable_getaddrinfo_cache(); - setup_capture_of_logs(LOG_WARN); - MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 127.0.42.1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HTTPProxyPort, OP_EQ, 80); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 127.0.42.1:444\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HTTPProxyPort, OP_EQ, 444); - tor_free(msg); - - free_options_test_data(tdata); - - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy not_so_valid!\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HTTPProxy failed to parse or resolve. Please fix."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxyAuthenticator " - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreeonetwothreeonetwothree" - - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HTTPProxyAuthenticator is too long (>= 512 chars)."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxyAuthenticator validauth\n" - - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpsProxy 127.0.42.1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HTTPSProxyPort, OP_EQ, 443); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpsProxy 127.0.42.1:444\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HTTPSProxyPort, OP_EQ, 444); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpsProxy not_so_valid!\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HTTPSProxy failed to parse or resolve. Please fix."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpsProxyAuthenticator " - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreonetwothreonetwothreonetwothre" - "onetwothreonetwothreonetwothreonetwothreonetw" - "othreonetwothreeonetwothreeonetwothree" - - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "HTTPSProxyAuthenticator is too long (>= 512 chars)."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpsProxyAuthenticator validauth\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks4Proxy 127.0.42.1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->Socks4ProxyPort, OP_EQ, 1080); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks4Proxy 127.0.42.1:444\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->Socks4ProxyPort, OP_EQ, 444); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks4Proxy not_so_valid!\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Socks4Proxy failed to parse or resolve. Please fix."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5Proxy 127.0.42.1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->Socks5ProxyPort, OP_EQ, 1080); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5Proxy 127.0.42.1:444\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->Socks5ProxyPort, OP_EQ, 444); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5Proxy not_so_valid!\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Socks5Proxy failed to parse or resolve. Please fix."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks4Proxy 215.1.1.1\n" - "Socks5Proxy 215.1.1.2\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "You have configured more than one proxy type. " - "(Socks4Proxy|Socks5Proxy|HTTPSProxy)"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 215.1.1.1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("HTTPProxy configured, but no SOCKS " - "proxy or HTTPS proxy configured. Watch out: this configuration " - "will proxy unencrypted directory connections only.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 215.1.1.1\n" - "Socks4Proxy 215.1.1.1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg("HTTPProxy configured, but no SOCKS " - "proxy or HTTPS proxy configured. Watch out: this configuration " - "will proxy unencrypted directory connections only.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 215.1.1.1\n" - "Socks5Proxy 215.1.1.1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg("HTTPProxy configured, but no SOCKS " - "proxy or HTTPS proxy configured. Watch out: this configuration " - "will proxy unencrypted directory connections only.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HttpProxy 215.1.1.1\n" - "HttpsProxy 215.1.1.1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "HTTPProxy configured, but no SOCKS proxy or HTTPS proxy " - "configured. Watch out: this configuration will proxy " - "unencrypted directory connections only.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - ); - tdata->opt->Socks5ProxyUsername = tor_strdup(""); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Socks5ProxyUsername must be between 1 and 255 characters."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - ); - tdata->opt->Socks5ProxyUsername = - tor_strdup("ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789AB" - "CDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCD" - "EABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEA" - "BCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABC" - "DE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Socks5ProxyUsername must be between 1 and 255 characters."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5ProxyUsername hello_world\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Socks5ProxyPassword must be included with " - "Socks5ProxyUsername."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5ProxyUsername hello_world\n" - ); - tdata->opt->Socks5ProxyPassword = tor_strdup(""); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Socks5ProxyPassword must be between 1 and 255 characters."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5ProxyUsername hello_world\n" - ); - tdata->opt->Socks5ProxyPassword = - tor_strdup("ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789AB" - "CDEABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCD" - "EABCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEA" - "BCDE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789ABCDEABC" - "DE0123456789ABCDEABCDE0123456789ABCDEABCDE0123456789"); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Socks5ProxyPassword must be between 1 and 255 characters."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5ProxyUsername hello_world\n" - "Socks5ProxyPassword world_hello\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "Socks5ProxyPassword hello_world\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Socks5ProxyPassword must be included with " - "Socks5ProxyUsername."); - tor_free(msg); - - done: - teardown_capture_of_logs(); - free_options_test_data(tdata); - policies_free_all(); - // sandbox_free_getaddrinfo_cache(); - tor_free(msg); - UNMOCK(tor_addr_lookup); -} - -static void -test_options_validate__control(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HashedControlPassword something_incorrect\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Bad HashedControlPassword: wrong length or bad encoding"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "HashedControlPassword 16:872860B76453A77D60CA" - "2BB8C1A7042072093276A3D701AD684053EC4C\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "__HashedControlSessionPassword something_incorrect\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Bad HashedControlSessionPassword: wrong length or " - "bad encoding"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "__HashedControlSessionPassword 16:872860B7645" - "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" - "4C\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data( - TEST_OPTIONS_DEFAULT_VALUES - "__OwningControllerProcess something_incorrect\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Bad OwningControllerProcess: invalid PID"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "__OwningControllerProcess 123\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlPort 127.0.0.1:1234\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "ControlPort is open, but no authentication method has been " - "configured. This means that any program on your computer can " - "reconfigure your Tor. That's bad! You should upgrade your Tor" - " controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlPort 127.0.0.1:1234\n" - "HashedControlPassword 16:872860B76453A77D60CA" - "2BB8C1A7042072093276A3D701AD684053EC4C\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlPort is open, but no authentication method has been " - "configured. This means that any program on your computer can " - "reconfigure your Tor. That's bad! You should upgrade your Tor " - "controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlPort 127.0.0.1:1234\n" - "__HashedControlSessionPassword 16:872860B7645" - "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" - "4C\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlPort is open, but no authentication method has been " - "configured. This means that any program on your computer can " - "reconfigure your Tor. That's bad! You should upgrade your Tor " - "controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlPort 127.0.0.1:1234\n" - "CookieAuthentication 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlPort is open, but no authentication method has been " - "configured. This means that any program on your computer can " - "reconfigure your Tor. That's bad! You should upgrade your Tor " - "controller as soon as possible.\n"); - tor_free(msg); - -#ifdef HAVE_SYS_UN_H - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlSocket unix:/tmp WorldWritable\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "ControlSocket is world writable, but no authentication method has" - " been configured. This means that any program on your computer " - "can reconfigure your Tor. That's bad! You should upgrade your " - "Tor controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlSocket unix:/tmp WorldWritable\n" - "HashedControlPassword 16:872860B76453A77D60CA" - "2BB8C1A7042072093276A3D701AD684053EC4C\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlSocket is world writable, but no authentication method has" - " been configured. This means that any program on your computer " - "can reconfigure your Tor. That's bad! You should upgrade your " - "Tor controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlSocket unix:/tmp WorldWritable\n" - "__HashedControlSessionPassword 16:872860B7645" - "3A77D60CA2BB8C1A7042072093276A3D701AD684053EC" - "4C\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlSocket is world writable, but no authentication method has" - " been configured. This means that any program on your computer " - "can reconfigure your Tor. That's bad! You should upgrade your " - "Tor controller as soon as possible.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ControlSocket unix:/tmp WorldWritable\n" - "CookieAuthentication 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "ControlSocket is world writable, but no authentication method has" - " been configured. This means that any program on your computer " - "can reconfigure your Tor. That's bad! You should upgrade your " - "Tor controller as soon as possible.\n"); - tor_free(msg); -#endif /* defined(HAVE_SYS_UN_H) */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CookieAuthFileGroupReadable 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "CookieAuthFileGroupReadable is set, but will have no effect: you " - "must specify an explicit CookieAuthFile to have it " - "group-readable.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "CookieAuthFileGroupReadable 1\n" - "CookieAuthFile /tmp/somewhere\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "CookieAuthFileGroupReadable is set, but will have no effect: you " - "must specify an explicit CookieAuthFile to have it " - "group-readable.\n"); - tor_free(msg); - - done: - teardown_capture_of_logs(); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__families(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "MyFamily home\n" - "BridgeRelay 1\n" - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 51300\n" - "BandwidthBurst 51300\n" - "MaxAdvertisedBandwidth 25700\n" - "DirCache 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "Listing a family for a bridge relay is not supported: it can " - "reveal bridge fingerprints to censors. You should also make sure " - "you aren't listing this bridge's fingerprint in any other " - "MyFamily.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "MyFamily home\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "Listing a family for a bridge relay is not supported: it can " - "reveal bridge fingerprints to censors. You should also make sure " - "you aren't listing this bridge's fingerprint in any other " - "MyFamily.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "MyFamily !\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Invalid nickname '!' in MyFamily line"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "NodeFamily foo\n" - "NodeFamily !\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_assert(!msg); - tor_free(msg); - - done: - teardown_capture_of_logs(); - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__addr_policies(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ExitPolicy !!!\n" - "ExitRelay 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Error in ExitPolicy entry."); - tor_free(msg); - - done: - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__dir_auth(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_DIR_AUTH - VALID_ALT_DIR_AUTH - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Directory authority/fallback line did not parse. See logs for " - "details."); - expect_log_msg( - "You cannot set both DirAuthority and Alternate*Authority.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "TestingTorNetwork may only be configured in combination with a " - "non-default set of DirAuthority or both of AlternateDirAuthority " - "and AlternateBridgeAuthority configured."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingTorNetwork 1\n" - VALID_ALT_DIR_AUTH - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "TestingTorNetwork may only be configured in combination with a " - "non-default set of DirAuthority or both of AlternateDirAuthority " - "and AlternateBridgeAuthority configured."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingTorNetwork 1\n" - VALID_ALT_BRIDGE_AUTH - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingTorNetwork may only be configured in " - "combination with a non-default set of DirAuthority or both of " - "AlternateDirAuthority and AlternateBridgeAuthority configured."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_ALT_DIR_AUTH - VALID_ALT_BRIDGE_AUTH - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__transport(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_NOTICE); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientTransportPlugin !!\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Invalid client transport line. See logs for details."); - expect_log_msg( - "Too few arguments on ClientTransportPlugin line.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ClientTransportPlugin foo exec bar\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportPlugin !!\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Invalid server transport line. See logs for details."); - expect_log_msg( - "Too few arguments on ServerTransportPlugin line.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportPlugin foo exec bar\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "Tor is not configured as a relay but you specified a " - "ServerTransportPlugin line (\"foo exec bar\"). The " - "ServerTransportPlugin line will be ignored.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportPlugin foo exec bar\n" - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76900\n" - "BandwidthBurst 76900\n" - "MaxAdvertisedBandwidth 38500\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "Tor is not configured as a relay but you specified a " - "ServerTransportPlugin line (\"foo exec bar\"). The " - "ServerTransportPlugin line will be ignored.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportListenAddr foo 127.0.0.42:55\n" - "ServerTransportListenAddr !\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "ServerTransportListenAddr did not parse. See logs for details."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportListenAddr foo 127.0.0.42:55\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg( - "You need at least a single managed-proxy to specify a transport " - "listen address. The ServerTransportListenAddr line will be " - "ignored.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ServerTransportListenAddr foo 127.0.0.42:55\n" - "ServerTransportPlugin foo exec bar\n" - "ORPort 127.0.0.1:5555\n" - "BandwidthRate 76900\n" - "BandwidthBurst 76900\n" - "MaxAdvertisedBandwidth 38500\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "You need at least a single managed-proxy to specify a transport " - "listen address. The ServerTransportListenAddr line will be " - "ignored.\n"); - - done: - escaped(NULL); // This will free the leaking memory from the previous escaped - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__constrained_sockets(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ConstrainedSockets 1\n" - "ConstrainedSockSize 0\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " - "between 2048 and 262144 in 1024 byte increments."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ConstrainedSockets 1\n" - "ConstrainedSockSize 263168\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " - "between 2048 and 262144 in 1024 byte increments."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ConstrainedSockets 1\n" - "ConstrainedSockSize 2047\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "ConstrainedSockSize is invalid. Must be a value " - "between 2048 and 262144 in 1024 byte increments."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ConstrainedSockets 1\n" - "ConstrainedSockSize 2048\n" - "DirPort 999\n" - "DirCache 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("You have requested constrained " - "socket buffers while also serving directory entries via DirPort." - " It is strongly suggested that you disable serving directory" - " requests when system TCP buffer resources are scarce.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "ConstrainedSockets 1\n" - "ConstrainedSockSize 2048\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg( - "You have requested constrained socket buffers while also serving" - " directory entries via DirPort. It is strongly suggested that " - "you disable serving directory requests when system TCP buffer " - "resources are scarce.\n"); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__v3_auth(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 1000\n" - "V3AuthDistDelay 1000\n" - "V3AuthVotingInterval 1000\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "V3AuthVoteDelay plus V3AuthDistDelay must be less than half " - "V3AuthVotingInterval"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthVoteDelay is way too low."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 1\n" - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthVoteDelay is way too low."); - tor_free(msg); - - // TODO: we can't reach the case of v3authvotedelay lower - // than MIN_VOTE_SECONDS but not lower than MIN_VOTE_SECONDS_TESTING, - // since they are the same - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthDistDelay 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthDistDelay is way too low."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthDistDelay 1\n" - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthDistDelay is way too low."); - tor_free(msg); - - // TODO: we can't reach the case of v3authdistdelay lower than - // MIN_DIST_SECONDS but not lower than MIN_DIST_SECONDS_TESTING, - // since they are the same - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthNIntervalsValid 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthNIntervalsValid must be at least 2."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 49\n" - "V3AuthDistDelay 49\n" - "V3AuthVotingInterval 200\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely low."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 49\n" - "V3AuthDistDelay 49\n" - "V3AuthVotingInterval 200000\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely high."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 49\n" - "V3AuthDistDelay 49\n" - "V3AuthVotingInterval 1441\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("V3AuthVotingInterval does not divide" - " evenly into 24 hours.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 49\n" - "V3AuthDistDelay 49\n" - "V3AuthVotingInterval 1440\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_msg("V3AuthVotingInterval does not divide" - " evenly into 24 hours.\n"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "V3AuthVoteDelay 49\n" - "V3AuthDistDelay 49\n" - "V3AuthVotingInterval 299\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - mock_clean_saved_logs(); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - expect_log_msg("V3AuthVotingInterval is very low. " - "This may lead to failure to synchronise for a consensus.\n"); - tor_free(msg); - - // TODO: It is impossible to reach the case of testingtor network, with - // v3authvotinginterval too low - /* free_options_test_data(tdata); */ - /* tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES */ - /* "V3AuthVoteDelay 1\n" */ - /* "V3AuthDistDelay 1\n" */ - /* "V3AuthVotingInterval 9\n" */ - /* VALID_DIR_AUTH */ - /* "TestingTorNetwork 1\n" */ - /* ); */ - /* ret = options_validate(tdata->old_opt, tdata->opt, */ - /* tdata->def_opt, 0, &msg); */ - /* tt_int_op(ret, OP_EQ, -1); */ - /* tt_str_op(msg, OP_EQ, "V3AuthVotingInterval is insanely low."); */ - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingV3AuthInitialVoteDelay 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingV3AuthInitialVoteDelay is way too low."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingV3AuthInitialDistDelay 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingV3AuthInitialDistDelay is way too low."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - tdata->opt->TestingV3AuthVotingStartOffset = 100000; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingV3AuthVotingStartOffset is higher than the " - "voting interval."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - ); - tdata->opt->TestingV3AuthVotingStartOffset = -1; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "TestingV3AuthVotingStartOffset must be non-negative."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - "TestingV3AuthInitialVotingInterval 4\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingV3AuthInitialVotingInterval is insanely low."); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__virtual_addr(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "VirtualAddrNetworkIPv4 !!" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Error parsing VirtualAddressNetwork !!"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "VirtualAddrNetworkIPv6 !!" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "Error parsing VirtualAddressNetworkIPv6 !!"); - tor_free(msg); - - done: - escaped(NULL); // This will free the leaking memory from the previous escaped - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__testing_options(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - setup_capture_of_logs(LOG_WARN); - -#define TEST_TESTING_OPTION(name, low_val, high_val, err_low) \ - STMT_BEGIN \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ - VALID_DIR_AUTH \ - "TestingTorNetwork 1\n" \ - ); \ - tdata->opt-> name = low_val; \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - tt_int_op(ret, OP_EQ, -1); \ - tt_str_op(msg, OP_EQ, #name " " err_low); \ - tor_free(msg); \ - \ - free_options_test_data(tdata); \ - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES \ - VALID_DIR_AUTH \ - "TestingTorNetwork 1\n" \ - ); \ - tdata->opt-> name = high_val; \ - mock_clean_saved_logs(); \ - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg);\ - tt_int_op(ret, OP_EQ, 0); \ - expect_log_msg( #name " is insanely high.\n"); \ - tor_free(msg); \ - STMT_END - - TEST_TESTING_OPTION(TestingAuthDirTimeToLearnReachability, -1, 8000, - "must be non-negative."); - TEST_TESTING_OPTION(TestingEstimatedDescriptorPropagationTime, -1, 3601, - "must be non-negative."); - TEST_TESTING_OPTION(TestingClientMaxIntervalWithoutRequest, -1, 3601, - "is way too low."); - TEST_TESTING_OPTION(TestingDirConnectionMaxStall, 1, 3601, - "is way too low."); - // TODO: I think this points to a bug/regression in options_validate - TEST_TESTING_OPTION(TestingConsensusMaxDownloadTries, 1, 801, - "must be greater than 2."); - TEST_TESTING_OPTION(TestingDescriptorMaxDownloadTries, 1, 801, - "must be greater than 1."); - TEST_TESTING_OPTION(TestingMicrodescMaxDownloadTries, 1, 801, - "must be greater than 1."); - TEST_TESTING_OPTION(TestingCertMaxDownloadTries, 1, 801, - "must be greater than 1."); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableConnBwEvent 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingEnableConnBwEvent may only be changed in " - "testing Tor networks!"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableConnBwEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - "___UsingTestNetworkDefaults 0\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableConnBwEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 0\n" - "___UsingTestNetworkDefaults 1\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableCellStatsEvent 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingEnableCellStatsEvent may only be changed in " - "testing Tor networks!"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableCellStatsEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - "___UsingTestNetworkDefaults 0\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableCellStatsEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 0\n" - "___UsingTestNetworkDefaults 1\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableTbEmptyEvent 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, "TestingEnableTbEmptyEvent may only be changed " - "in testing Tor networks!"); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableTbEmptyEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 1\n" - "___UsingTestNetworkDefaults 0\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "TestingEnableTbEmptyEvent 1\n" - VALID_DIR_AUTH - "TestingTorNetwork 0\n" - "___UsingTestNetworkDefaults 1\n" - ); - - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_assert(!msg); - tor_free(msg); - - done: - policies_free_all(); - teardown_capture_of_logs(); - free_options_test_data(tdata); - tor_free(msg); -} - -static void -test_options_validate__accel(void *ignored) -{ - (void)ignored; - int ret; - char *msg; - options_test_data_t *tdata = NULL; - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccelName foo\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HardwareAccel, OP_EQ, 1); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccelName foo\n" - ); - tdata->opt->HardwareAccel = 2; - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tdata->opt->HardwareAccel, OP_EQ, 2); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccelDir 1\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, -1); - tt_str_op(msg, OP_EQ, - "Can't use hardware crypto accelerator dir without engine name."); - tor_free(msg); - - free_options_test_data(tdata); - tdata = get_options_test_data(TEST_OPTIONS_DEFAULT_VALUES - "AccelDir 1\n" - "AccelName something\n" - ); - ret = options_validate(tdata->old_opt, tdata->opt, tdata->def_opt, 0, &msg); - tt_int_op(ret, OP_EQ, 0); - tor_free(msg); - - done: - policies_free_all(); - free_options_test_data(tdata); - tor_free(msg); -} - -#define LOCAL_VALIDATE_TEST(name) \ - { "validate__" #name, test_options_validate__ ## name, TT_FORK, NULL, NULL } - -struct testcase_t options_tests[] = { - { "validate", test_options_validate, TT_FORK, NULL, NULL }, - { "mem_dircache", test_have_enough_mem_for_dircache, TT_FORK, NULL, NULL }, - LOCAL_VALIDATE_TEST(uname_for_server), - LOCAL_VALIDATE_TEST(outbound_addresses), - LOCAL_VALIDATE_TEST(data_directory), - LOCAL_VALIDATE_TEST(nickname), - LOCAL_VALIDATE_TEST(contactinfo), - LOCAL_VALIDATE_TEST(logs), - LOCAL_VALIDATE_TEST(authdir), - LOCAL_VALIDATE_TEST(relay_with_hidden_services), - LOCAL_VALIDATE_TEST(transproxy), - LOCAL_VALIDATE_TEST(exclude_nodes), - LOCAL_VALIDATE_TEST(node_families), - LOCAL_VALIDATE_TEST(token_bucket), - LOCAL_VALIDATE_TEST(recommended_packages), - LOCAL_VALIDATE_TEST(fetch_dir), - LOCAL_VALIDATE_TEST(conn_limit), - LOCAL_VALIDATE_TEST(paths_needed), - LOCAL_VALIDATE_TEST(max_client_circuits), - LOCAL_VALIDATE_TEST(ports), - LOCAL_VALIDATE_TEST(reachable_addresses), - LOCAL_VALIDATE_TEST(use_bridges), - LOCAL_VALIDATE_TEST(entry_nodes), - LOCAL_VALIDATE_TEST(safe_logging), - LOCAL_VALIDATE_TEST(publish_server_descriptor), - LOCAL_VALIDATE_TEST(testing), - LOCAL_VALIDATE_TEST(hidserv), - LOCAL_VALIDATE_TEST(path_bias), - LOCAL_VALIDATE_TEST(bandwidth), - LOCAL_VALIDATE_TEST(circuits), - LOCAL_VALIDATE_TEST(port_forwarding), - LOCAL_VALIDATE_TEST(tor2web), - LOCAL_VALIDATE_TEST(rend), - LOCAL_VALIDATE_TEST(single_onion), - LOCAL_VALIDATE_TEST(accounting), - LOCAL_VALIDATE_TEST(proxy), - LOCAL_VALIDATE_TEST(control), - LOCAL_VALIDATE_TEST(families), - LOCAL_VALIDATE_TEST(addr_policies), - LOCAL_VALIDATE_TEST(dir_auth), - LOCAL_VALIDATE_TEST(transport), - LOCAL_VALIDATE_TEST(constrained_sockets), - LOCAL_VALIDATE_TEST(v3_auth), - LOCAL_VALIDATE_TEST(virtual_addr), - LOCAL_VALIDATE_TEST(testing_options), - LOCAL_VALIDATE_TEST(accel), - END_OF_TESTCASES /* */ -}; - diff --git a/src/tor/src/test/test_policy.c b/src/tor/src/test/test_policy.c deleted file mode 100644 index f8aa8ac40..000000000 --- a/src/tor/src/test/test_policy.c +++ /dev/null @@ -1,2392 +0,0 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#define CONFIG_PRIVATE -#include "config.h" -#include "router.h" -#include "routerparse.h" -#define POLICIES_PRIVATE -#include "policies.h" -#include "test.h" - -/* Helper: assert that short_policy parses and writes back out as itself, - or as expected if that's provided. */ -static void -test_short_policy_parse(const char *input, - const char *expected) -{ - short_policy_t *short_policy = NULL; - char *out = NULL; - - if (expected == NULL) - expected = input; - - short_policy = parse_short_policy(input); - tt_assert(short_policy); - out = write_short_policy(short_policy); - tt_str_op(out, OP_EQ, expected); - - done: - tor_free(out); - short_policy_free(short_policy); -} - -/** Helper: Parse the exit policy string in policy_str with - * options, and make sure that policies_summarize() produces the string - * expected_summary from it when called with family. */ -static void -test_policy_summary_helper_family_flags(const char *policy_str, - const char *expected_summary, - sa_family_t family, - exit_policy_parser_cfg_t options) -{ - config_line_t line; - smartlist_t *policy = smartlist_new(); - char *summary = NULL; - char *summary_after = NULL; - int r; - short_policy_t *short_policy = NULL; - int success = 0; - - line.key = (char*)"foo"; - line.value = (char *)policy_str; - line.next = NULL; - - r = policies_parse_exit_policy(&line, &policy, - options, NULL); - tt_int_op(r,OP_EQ, 0); - - summary = policy_summarize(policy, family); - - tt_ptr_op(summary, OP_NE, NULL); - tt_str_op(summary,OP_EQ, expected_summary); - - short_policy = parse_short_policy(summary); - tt_assert(short_policy); - summary_after = write_short_policy(short_policy); - tt_str_op(summary,OP_EQ, summary_after); - - success = 1; - done: - /* If we don't print the flags on failure, it's very hard to diagnose bugs */ - if (!success) - TT_DECLARE("CTXT", ("\n IPv%d\n Options: %x\n Policy: %s", - family == AF_INET ? 4 : 6, options, policy_str)); - tor_free(summary_after); - tor_free(summary); - if (policy) - addr_policy_list_free(policy); - short_policy_free(short_policy); -} - -/** Like test_policy_summary_helper_family_flags, but tries all the different - * flag combinations */ -static void -test_policy_summary_helper_family(const char *policy_str, - const char *expected_summary, - sa_family_t family) -{ - for (exit_policy_parser_cfg_t opt = 0; - opt <= EXIT_POLICY_OPTION_ALL; - opt++) { - if (family == AF_INET6 && !(opt & EXIT_POLICY_IPV6_ENABLED)) - /* Skip the test: IPv6 addresses need IPv6 enabled */ - continue; - - if (opt & EXIT_POLICY_REJECT_LOCAL_INTERFACES) - /* Skip the test: local interfaces are machine-specific */ - continue; - - test_policy_summary_helper_family_flags(policy_str, expected_summary, - family, opt); - } -} - -/** Like test_policy_summary_helper_family, but uses expected_summary for - * both IPv4 and IPv6. */ -static void -test_policy_summary_helper(const char *policy_str, - const char *expected_summary) -{ - test_policy_summary_helper_family(policy_str, expected_summary, AF_INET); - test_policy_summary_helper_family(policy_str, expected_summary, AF_INET6); -} - -/** Like test_policy_summary_helper_family, but uses expected_summary4 for - * IPv4 and expected_summary6 for IPv6. */ -static void -test_policy_summary_helper6(const char *policy_str, - const char *expected_summary4, - const char *expected_summary6) -{ - test_policy_summary_helper_family(policy_str, expected_summary4, AF_INET); - test_policy_summary_helper_family(policy_str, expected_summary6, AF_INET6); -} - -/** Run unit tests for generating summary lines of exit policies */ -static void -test_policies_general(void *arg) -{ - int i; - smartlist_t *policy = NULL, *policy2 = NULL, *policy3 = NULL, - *policy4 = NULL, *policy5 = NULL, *policy6 = NULL, - *policy7 = NULL, *policy8 = NULL, *policy9 = NULL, - *policy10 = NULL, *policy11 = NULL, *policy12 = NULL; - addr_policy_t *p; - tor_addr_t tar, tar2; - smartlist_t *addr_list = NULL; - config_line_t line; - smartlist_t *sm = NULL; - char *policy_str = NULL; - short_policy_t *short_parsed = NULL; - int malformed_list = -1; - (void)arg; - - policy = smartlist_new(); - - p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type); - tor_addr_from_ipv4h(&tar, 0xc0a80000u); - tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT)); - tt_int_op(16,OP_EQ, p->maskbits); - tt_int_op(1,OP_EQ, p->prt_min); - tt_int_op(65535,OP_EQ, p->prt_max); - - smartlist_add(policy, p); - - tor_addr_from_ipv4h(&tar, 0x01020304u); - tt_assert(ADDR_POLICY_ACCEPTED == - compare_tor_addr_to_addr_policy(&tar, 2, policy)); - tor_addr_make_unspec(&tar); - tt_assert(ADDR_POLICY_PROBABLY_ACCEPTED == - compare_tor_addr_to_addr_policy(&tar, 2, policy)); - tor_addr_from_ipv4h(&tar, 0xc0a80102); - tt_assert(ADDR_POLICY_REJECTED == - compare_tor_addr_to_addr_policy(&tar, 2, policy)); - - tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy2, - EXIT_POLICY_IPV6_ENABLED | - EXIT_POLICY_REJECT_PRIVATE | - EXIT_POLICY_ADD_DEFAULT, NULL)); - - tt_assert(policy2); - - tor_addr_from_ipv4h(&tar, 0x0306090cu); - tor_addr_parse(&tar2, "[2000::1234]"); - addr_list = smartlist_new(); - smartlist_add(addr_list, &tar); - smartlist_add(addr_list, &tar2); - tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy12, - EXIT_POLICY_IPV6_ENABLED | - EXIT_POLICY_REJECT_PRIVATE | - EXIT_POLICY_ADD_DEFAULT, - addr_list)); - smartlist_free(addr_list); - addr_list = NULL; - - tt_assert(policy12); - - policy3 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("reject *:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy3, p); - p = router_parse_addr_policy_item_from_string("accept *:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy3, p); - - policy4 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("accept *:443", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy4, p); - p = router_parse_addr_policy_item_from_string("accept *:443", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy4, p); - - policy5 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", - -1, &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject *:1-65534", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("reject *:65535", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - p = router_parse_addr_policy_item_from_string("accept *:1-65535", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy5, p); - - policy6 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy6, p); - - policy7 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy7, p); - - tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy8, - EXIT_POLICY_IPV6_ENABLED | - EXIT_POLICY_REJECT_PRIVATE | - EXIT_POLICY_ADD_DEFAULT, - NULL)); - - tt_assert(policy8); - - tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy9, - EXIT_POLICY_REJECT_PRIVATE | - EXIT_POLICY_ADD_DEFAULT, - NULL)); - - tt_assert(policy9); - - /* accept6 * and reject6 * produce IPv6 wildcards only */ - policy10 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("accept6 *:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy10, p); - - policy11 = smartlist_new(); - p = router_parse_addr_policy_item_from_string("reject6 *:*", -1, - &malformed_list); - tt_ptr_op(p, OP_NE, NULL); - smartlist_add(policy11, p); - - tt_assert(!exit_policy_is_general_exit(policy)); - tt_assert(exit_policy_is_general_exit(policy2)); - tt_assert(!exit_policy_is_general_exit(NULL)); - tt_assert(!exit_policy_is_general_exit(policy3)); - tt_assert(!exit_policy_is_general_exit(policy4)); - tt_assert(!exit_policy_is_general_exit(policy5)); - tt_assert(!exit_policy_is_general_exit(policy6)); - tt_assert(!exit_policy_is_general_exit(policy7)); - tt_assert(exit_policy_is_general_exit(policy8)); - tt_assert(exit_policy_is_general_exit(policy9)); - tt_assert(!exit_policy_is_general_exit(policy10)); - tt_assert(!exit_policy_is_general_exit(policy11)); - - tt_assert(!addr_policies_eq(policy, policy2)); - tt_assert(!addr_policies_eq(policy, NULL)); - tt_assert(addr_policies_eq(policy2, policy2)); - tt_assert(addr_policies_eq(NULL, NULL)); - - tt_assert(!policy_is_reject_star(policy2, AF_INET, 1)); - tt_assert(policy_is_reject_star(policy, AF_INET, 1)); - tt_assert(policy_is_reject_star(policy10, AF_INET, 1)); - tt_assert(!policy_is_reject_star(policy10, AF_INET6, 1)); - tt_assert(policy_is_reject_star(policy11, AF_INET, 1)); - tt_assert(policy_is_reject_star(policy11, AF_INET6, 1)); - tt_assert(policy_is_reject_star(NULL, AF_INET, 1)); - tt_assert(policy_is_reject_star(NULL, AF_INET6, 1)); - tt_assert(!policy_is_reject_star(NULL, AF_INET, 0)); - tt_assert(!policy_is_reject_star(NULL, AF_INET6, 0)); - - addr_policy_list_free(policy); - policy = NULL; - - /* make sure assume_action works */ - malformed_list = 0; - p = router_parse_addr_policy_item_from_string("127.0.0.1", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("127.0.0.1:*", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("[::]", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("[::]:*", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("[face::b]", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("[b::aaaa]", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("*", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("*4", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("*6", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(p); - addr_policy_free(p); - tt_assert(!malformed_list); - - /* These are all ambiguous IPv6 addresses, it's good that we reject them */ - p = router_parse_addr_policy_item_from_string("acce::abcd", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - malformed_list = 0; - - p = router_parse_addr_policy_item_from_string("7:1234", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - malformed_list = 0; - - p = router_parse_addr_policy_item_from_string("::", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - malformed_list = 0; - - /* make sure compacting logic works. */ - policy = NULL; - line.key = (char*)"foo"; - line.value = (char*)"accept *:80,reject private:*,reject *:*"; - line.next = NULL; - tt_int_op(0, OP_EQ, policies_parse_exit_policy(&line,&policy, - EXIT_POLICY_IPV6_ENABLED | - EXIT_POLICY_ADD_DEFAULT, NULL)); - tt_assert(policy); - - //test_streq(policy->string, "accept *:80"); - //test_streq(policy->next->string, "reject *:*"); - tt_int_op(smartlist_len(policy),OP_EQ, 4); - - /* test policy summaries */ - /* check if we properly ignore private IP addresses */ - test_policy_summary_helper("reject 192.168.0.0/16:*," - "reject 0.0.0.0/8:*," - "reject 10.0.0.0/8:*," - "accept *:10-30," - "accept *:90," - "reject *:*", - "accept 10-30,90"); - /* check all accept policies, and proper counting of rejects */ - test_policy_summary_helper("reject 11.0.0.0/9:80," - "reject 12.0.0.0/9:80," - "reject 13.0.0.0/9:80," - "reject 14.0.0.0/9:80," - "accept *:*", "accept 1-65535"); - test_policy_summary_helper("reject 11.0.0.0/9:80," - "reject 12.0.0.0/9:80," - "reject 13.0.0.0/9:80," - "reject 14.0.0.0/9:80," - "reject 15.0.0.0:81," - "accept *:*", "accept 1-65535"); - test_policy_summary_helper6("reject 11.0.0.0/9:80," - "reject 12.0.0.0/9:80," - "reject 13.0.0.0/9:80," - "reject 14.0.0.0/9:80," - "reject 15.0.0.0:80," - "accept *:*", - "reject 80", - "accept 1-65535"); - /* no exits */ - test_policy_summary_helper("accept 11.0.0.0/9:80," - "reject *:*", - "reject 1-65535"); - /* port merging */ - test_policy_summary_helper("accept *:80," - "accept *:81," - "accept *:100-110," - "accept *:111," - "reject *:*", - "accept 80-81,100-111"); - /* border ports */ - test_policy_summary_helper("accept *:1," - "accept *:3," - "accept *:65535," - "reject *:*", - "accept 1,3,65535"); - /* holes */ - test_policy_summary_helper("accept *:1," - "accept *:3," - "accept *:5," - "accept *:7," - "reject *:*", - "accept 1,3,5,7"); - test_policy_summary_helper("reject *:1," - "reject *:3," - "reject *:5," - "reject *:7," - "accept *:*", - "reject 1,3,5,7"); - /* long policies */ - /* standard long policy on many exits */ - test_policy_summary_helper("accept *:20-23," - "accept *:43," - "accept *:53," - "accept *:79-81," - "accept *:88," - "accept *:110," - "accept *:143," - "accept *:194," - "accept *:220," - "accept *:389," - "accept *:443," - "accept *:464," - "accept *:531," - "accept *:543-544," - "accept *:554," - "accept *:563," - "accept *:636," - "accept *:706," - "accept *:749," - "accept *:873," - "accept *:902-904," - "accept *:981," - "accept *:989-995," - "accept *:1194," - "accept *:1220," - "accept *:1293," - "accept *:1500," - "accept *:1533," - "accept *:1677," - "accept *:1723," - "accept *:1755," - "accept *:1863," - "accept *:2082," - "accept *:2083," - "accept *:2086-2087," - "accept *:2095-2096," - "accept *:2102-2104," - "accept *:3128," - "accept *:3389," - "accept *:3690," - "accept *:4321," - "accept *:4643," - "accept *:5050," - "accept *:5190," - "accept *:5222-5223," - "accept *:5228," - "accept *:5900," - "accept *:6660-6669," - "accept *:6679," - "accept *:6697," - "accept *:8000," - "accept *:8008," - "accept *:8074," - "accept *:8080," - "accept *:8087-8088," - "accept *:8332-8333," - "accept *:8443," - "accept *:8888," - "accept *:9418," - "accept *:9999," - "accept *:10000," - "accept *:11371," - "accept *:12350," - "accept *:19294," - "accept *:19638," - "accept *:23456," - "accept *:33033," - "accept *:64738," - "reject *:*", - "accept 20-23,43,53,79-81,88,110,143,194,220,389," - "443,464,531,543-544,554,563,636,706,749,873," - "902-904,981,989-995,1194,1220,1293,1500,1533," - "1677,1723,1755,1863,2082-2083,2086-2087," - "2095-2096,2102-2104,3128,3389,3690,4321,4643," - "5050,5190,5222-5223,5228,5900,6660-6669,6679," - "6697,8000,8008,8074,8080,8087-8088,8332-8333," - "8443,8888,9418,9999-10000,11371,12350,19294," - "19638,23456,33033,64738"); - /* short policy with configured addresses */ - test_policy_summary_helper("reject 149.56.1.1:*," - "reject [2607:5300:1:1::1:0]:*," - "accept *:80," - "accept *:443," - "reject *:*", - "accept 80,443"); - /* short policy with configured and local interface addresses */ - test_policy_summary_helper("reject 149.56.1.0:*," - "reject 149.56.1.1:*," - "reject 149.56.1.2:*," - "reject 149.56.1.3:*," - "reject 149.56.1.4:*," - "reject 149.56.1.5:*," - "reject 149.56.1.6:*," - "reject 149.56.1.7:*," - "reject [2607:5300:1:1::1:0]:*," - "reject [2607:5300:1:1::1:1]:*," - "reject [2607:5300:1:1::1:2]:*," - "reject [2607:5300:1:1::1:3]:*," - "reject [2607:5300:1:1::2:0]:*," - "reject [2607:5300:1:1::2:1]:*," - "reject [2607:5300:1:1::2:2]:*," - "reject [2607:5300:1:1::2:3]:*," - "accept *:80," - "accept *:443," - "reject *:*", - "accept 80,443"); - /* short policy with configured netblocks */ - test_policy_summary_helper("reject 149.56.0.0/16," - "reject6 2607:5300::/32," - "reject6 2608:5300::/64," - "reject6 2609:5300::/96," - "accept *:80," - "accept *:443," - "reject *:*", - "accept 80,443"); - /* short policy with large netblocks that do not count as a rejection */ - test_policy_summary_helper("reject 148.0.0.0/7," - "reject6 2600::/16," - "accept *:80," - "accept *:443," - "reject *:*", - "accept 80,443"); - /* short policy with large netblocks that count as a rejection */ - test_policy_summary_helper("reject 148.0.0.0/6," - "reject6 2600::/15," - "accept *:80," - "accept *:443," - "reject *:*", - "reject 1-65535"); - /* short policy with huge netblocks that count as a rejection */ - test_policy_summary_helper("reject 128.0.0.0/1," - "reject6 8000::/1," - "accept *:80," - "accept *:443," - "reject *:*", - "reject 1-65535"); - /* short policy which blocks everything using netblocks */ - test_policy_summary_helper("reject 0.0.0.0/0," - "reject6 ::/0," - "accept *:80," - "accept *:443," - "reject *:*", - "reject 1-65535"); - /* short policy which has repeated redundant netblocks */ - test_policy_summary_helper("reject 0.0.0.0/0," - "reject 0.0.0.0/0," - "reject 0.0.0.0/0," - "reject 0.0.0.0/0," - "reject 0.0.0.0/0," - "reject6 ::/0," - "reject6 ::/0," - "reject6 ::/0," - "reject6 ::/0," - "reject6 ::/0," - "accept *:80," - "accept *:443," - "reject *:*", - "reject 1-65535"); - - /* longest possible policy - * (1-2,4-5,... is longer, but gets reduced to 3,6,... ) - * Going all the way to 65535 is incredibly slow, so we just go slightly - * more than the expected length */ - test_policy_summary_helper("accept *:1," - "accept *:3," - "accept *:5," - "accept *:7," - "accept *:9," - "accept *:11," - "accept *:13," - "accept *:15," - "accept *:17," - "accept *:19," - "accept *:21," - "accept *:23," - "accept *:25," - "accept *:27," - "accept *:29," - "accept *:31," - "accept *:33," - "accept *:35," - "accept *:37," - "accept *:39," - "accept *:41," - "accept *:43," - "accept *:45," - "accept *:47," - "accept *:49," - "accept *:51," - "accept *:53," - "accept *:55," - "accept *:57," - "accept *:59," - "accept *:61," - "accept *:63," - "accept *:65," - "accept *:67," - "accept *:69," - "accept *:71," - "accept *:73," - "accept *:75," - "accept *:77," - "accept *:79," - "accept *:81," - "accept *:83," - "accept *:85," - "accept *:87," - "accept *:89," - "accept *:91," - "accept *:93," - "accept *:95," - "accept *:97," - "accept *:99," - "accept *:101," - "accept *:103," - "accept *:105," - "accept *:107," - "accept *:109," - "accept *:111," - "accept *:113," - "accept *:115," - "accept *:117," - "accept *:119," - "accept *:121," - "accept *:123," - "accept *:125," - "accept *:127," - "accept *:129," - "accept *:131," - "accept *:133," - "accept *:135," - "accept *:137," - "accept *:139," - "accept *:141," - "accept *:143," - "accept *:145," - "accept *:147," - "accept *:149," - "accept *:151," - "accept *:153," - "accept *:155," - "accept *:157," - "accept *:159," - "accept *:161," - "accept *:163," - "accept *:165," - "accept *:167," - "accept *:169," - "accept *:171," - "accept *:173," - "accept *:175," - "accept *:177," - "accept *:179," - "accept *:181," - "accept *:183," - "accept *:185," - "accept *:187," - "accept *:189," - "accept *:191," - "accept *:193," - "accept *:195," - "accept *:197," - "accept *:199," - "accept *:201," - "accept *:203," - "accept *:205," - "accept *:207," - "accept *:209," - "accept *:211," - "accept *:213," - "accept *:215," - "accept *:217," - "accept *:219," - "accept *:221," - "accept *:223," - "accept *:225," - "accept *:227," - "accept *:229," - "accept *:231," - "accept *:233," - "accept *:235," - "accept *:237," - "accept *:239," - "accept *:241," - "accept *:243," - "accept *:245," - "accept *:247," - "accept *:249," - "accept *:251," - "accept *:253," - "accept *:255," - "accept *:257," - "accept *:259," - "accept *:261," - "accept *:263," - "accept *:265," - "accept *:267," - "accept *:269," - "accept *:271," - "accept *:273," - "accept *:275," - "accept *:277," - "accept *:279," - "accept *:281," - "accept *:283," - "accept *:285," - "accept *:287," - "accept *:289," - "accept *:291," - "accept *:293," - "accept *:295," - "accept *:297," - "accept *:299," - "accept *:301," - "accept *:303," - "accept *:305," - "accept *:307," - "accept *:309," - "accept *:311," - "accept *:313," - "accept *:315," - "accept *:317," - "accept *:319," - "accept *:321," - "accept *:323," - "accept *:325," - "accept *:327," - "accept *:329," - "accept *:331," - "accept *:333," - "accept *:335," - "accept *:337," - "accept *:339," - "accept *:341," - "accept *:343," - "accept *:345," - "accept *:347," - "accept *:349," - "accept *:351," - "accept *:353," - "accept *:355," - "accept *:357," - "accept *:359," - "accept *:361," - "accept *:363," - "accept *:365," - "accept *:367," - "accept *:369," - "accept *:371," - "accept *:373," - "accept *:375," - "accept *:377," - "accept *:379," - "accept *:381," - "accept *:383," - "accept *:385," - "accept *:387," - "accept *:389," - "accept *:391," - "accept *:393," - "accept *:395," - "accept *:397," - "accept *:399," - "accept *:401," - "accept *:403," - "accept *:405," - "accept *:407," - "accept *:409," - "accept *:411," - "accept *:413," - "accept *:415," - "accept *:417," - "accept *:419," - "accept *:421," - "accept *:423," - "accept *:425," - "accept *:427," - "accept *:429," - "accept *:431," - "accept *:433," - "accept *:435," - "accept *:437," - "accept *:439," - "accept *:441," - "accept *:443," - "accept *:445," - "accept *:447," - "accept *:449," - "accept *:451," - "accept *:453," - "accept *:455," - "accept *:457," - "accept *:459," - "accept *:461," - "accept *:463," - "accept *:465," - "accept *:467," - "accept *:469," - "accept *:471," - "accept *:473," - "accept *:475," - "accept *:477," - "accept *:479," - "accept *:481," - "accept *:483," - "accept *:485," - "accept *:487," - "accept *:489," - "accept *:491," - "accept *:493," - "accept *:495," - "accept *:497," - "accept *:499," - "accept *:501," - "accept *:503," - "accept *:505," - "accept *:507," - "accept *:509," - "accept *:511," - "accept *:513," - "accept *:515," - "accept *:517," - "accept *:519," - "accept *:521," - "accept *:523," - "accept *:525," - "accept *:527," - "accept *:529," - "reject *:*", - "accept 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29," - "31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61," - "63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93," - "95,97,99,101,103,105,107,109,111,113,115,117," - "119,121,123,125,127,129,131,133,135,137,139,141," - "143,145,147,149,151,153,155,157,159,161,163,165," - "167,169,171,173,175,177,179,181,183,185,187,189," - "191,193,195,197,199,201,203,205,207,209,211,213," - "215,217,219,221,223,225,227,229,231,233,235,237," - "239,241,243,245,247,249,251,253,255,257,259,261," - "263,265,267,269,271,273,275,277,279,281,283,285," - "287,289,291,293,295,297,299,301,303,305,307,309," - "311,313,315,317,319,321,323,325,327,329,331,333," - "335,337,339,341,343,345,347,349,351,353,355,357," - "359,361,363,365,367,369,371,373,375,377,379,381," - "383,385,387,389,391,393,395,397,399,401,403,405," - "407,409,411,413,415,417,419,421,423,425,427,429," - "431,433,435,437,439,441,443,445,447,449,451,453," - "455,457,459,461,463,465,467,469,471,473,475,477," - "479,481,483,485,487,489,491,493,495,497,499,501," - "503,505,507,509,511,513,515,517,519,521,523"); - - /* Short policies with unrecognized formats should get accepted. */ - test_short_policy_parse("accept fred,2,3-5", "accept 2,3-5"); - test_short_policy_parse("accept 2,fred,3", "accept 2,3"); - test_short_policy_parse("accept 2,fred,3,bob", "accept 2,3"); - test_short_policy_parse("accept 2,-3,500-600", "accept 2,500-600"); - /* Short policies with nil entries are accepted too. */ - test_short_policy_parse("accept 1,,3", "accept 1,3"); - test_short_policy_parse("accept 100-200,,", "accept 100-200"); - test_short_policy_parse("reject ,1-10,,,,30-40", "reject 1-10,30-40"); - - /* Try parsing various broken short policies */ -#define TT_BAD_SHORT_POLICY(s) \ - do { \ - tt_ptr_op(NULL, OP_EQ, (short_parsed = parse_short_policy((s)))); \ - } while (0) - TT_BAD_SHORT_POLICY("accept 200-199"); - TT_BAD_SHORT_POLICY(""); - TT_BAD_SHORT_POLICY("rejekt 1,2,3"); - TT_BAD_SHORT_POLICY("reject "); - TT_BAD_SHORT_POLICY("reject"); - TT_BAD_SHORT_POLICY("rej"); - TT_BAD_SHORT_POLICY("accept 2,3,100000"); - TT_BAD_SHORT_POLICY("accept 2,3x,4"); - TT_BAD_SHORT_POLICY("accept 2,3x,4"); - TT_BAD_SHORT_POLICY("accept 2-"); - TT_BAD_SHORT_POLICY("accept 2-x"); - TT_BAD_SHORT_POLICY("accept 1-,3"); - TT_BAD_SHORT_POLICY("accept 1-,3"); - - /* Make sure that IPv4 addresses are ignored in accept6/reject6 lines. */ - p = router_parse_addr_policy_item_from_string("accept6 1.2.3.4:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("reject6 2.4.6.0/24:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(!malformed_list); - - p = router_parse_addr_policy_item_from_string("accept6 *4:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(!malformed_list); - - /* Make sure malformed policies are detected as such. */ - p = router_parse_addr_policy_item_from_string("bad_token *4:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("accept6 **:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("accept */15:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("reject6 */:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("accept 127.0.0.1/33:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("accept6 [::1]/129:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("reject 8.8.8.8/-1:*", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("reject 8.8.4.4:10-5", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - p = router_parse_addr_policy_item_from_string("reject 1.2.3.4:-1", -1, - &malformed_list); - tt_ptr_op(p, OP_EQ, NULL); - tt_assert(malformed_list); - - /* Test a too-long policy. */ - { - char *policy_strng = NULL; - smartlist_t *chunks = smartlist_new(); - smartlist_add_strdup(chunks, "accept "); - for (i=1; i<10000; ++i) - smartlist_add_asprintf(chunks, "%d,", i); - smartlist_add_strdup(chunks, "20000"); - policy_strng = smartlist_join_strings(chunks, "", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, ch, tor_free(ch)); - smartlist_free(chunks); - short_parsed = parse_short_policy(policy_strng);/* shouldn't be accepted */ - tor_free(policy_strng); - tt_ptr_op(NULL, OP_EQ, short_parsed); - } - - /* truncation ports */ - sm = smartlist_new(); - for (i=1; i<2000; i+=2) { - char buf[POLICY_BUF_LEN]; - tor_snprintf(buf, sizeof(buf), "reject *:%d", i); - smartlist_add_strdup(sm, buf); - } - smartlist_add_strdup(sm, "accept *:*"); - policy_str = smartlist_join_strings(sm, ",", 0, NULL); - test_policy_summary_helper( policy_str, - "accept 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44," - "46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90," - "92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128," - "130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164," - "166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200," - "202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236," - "238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272," - "274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308," - "310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344," - "346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380," - "382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416," - "418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452," - "454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488," - "490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522"); - - done: - addr_policy_list_free(policy); - addr_policy_list_free(policy2); - addr_policy_list_free(policy3); - addr_policy_list_free(policy4); - addr_policy_list_free(policy5); - addr_policy_list_free(policy6); - addr_policy_list_free(policy7); - addr_policy_list_free(policy8); - addr_policy_list_free(policy9); - addr_policy_list_free(policy10); - addr_policy_list_free(policy11); - addr_policy_list_free(policy12); - tor_free(policy_str); - if (sm) { - SMARTLIST_FOREACH(sm, char *, s, tor_free(s)); - smartlist_free(sm); - } - short_policy_free(short_parsed); -} - -/** Helper: Check that policy_list contains address */ -static int -test_policy_has_address_helper(const smartlist_t *policy_list, - const tor_addr_t *addr) -{ - int found = 0; - - tt_assert(policy_list); - tt_assert(addr); - - SMARTLIST_FOREACH_BEGIN(policy_list, addr_policy_t*, p) { - if (tor_addr_eq(&p->addr, addr)) { - found = 1; - } - } SMARTLIST_FOREACH_END(p); - - return found; - - done: - return 0; -} - -#define TEST_IPV4_ADDR (0x01020304) -#define TEST_IPV6_ADDR ("2002::abcd") - -/** Run unit tests for rejecting the configured addresses on this exit relay - * using policies_parse_exit_policy_reject_private */ -static void -test_policies_reject_exit_address(void *arg) -{ - smartlist_t *policy = NULL; - tor_addr_t ipv4_addr, ipv6_addr; - smartlist_t *ipv4_list, *ipv6_list, *both_list, *dupl_list; - (void)arg; - - tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR); - tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); - - ipv4_list = smartlist_new(); - ipv6_list = smartlist_new(); - both_list = smartlist_new(); - dupl_list = smartlist_new(); - - smartlist_add(ipv4_list, &ipv4_addr); - smartlist_add(both_list, &ipv4_addr); - smartlist_add(dupl_list, &ipv4_addr); - smartlist_add(dupl_list, &ipv4_addr); - smartlist_add(dupl_list, &ipv4_addr); - - smartlist_add(ipv6_list, &ipv6_addr); - smartlist_add(both_list, &ipv6_addr); - smartlist_add(dupl_list, &ipv6_addr); - smartlist_add(dupl_list, &ipv6_addr); - - /* IPv4-Only Exits */ - - /* test that IPv4 addresses are rejected on an IPv4-only exit */ - policies_parse_exit_policy_reject_private(&policy, 0, ipv4_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* test that IPv6 addresses are NOT rejected on an IPv4-only exit - * (all IPv6 addresses are rejected by policies_parse_exit_policy_internal - * on IPv4-only exits, so policies_parse_exit_policy_reject_private doesn't - * need to do anything) */ - policies_parse_exit_policy_reject_private(&policy, 0, ipv6_list, 0, 0); - tt_ptr_op(policy, OP_EQ, NULL); - - /* test that only IPv4 addresses are rejected on an IPv4-only exit */ - policies_parse_exit_policy_reject_private(&policy, 0, both_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* Test that lists with duplicate entries produce the same results */ - policies_parse_exit_policy_reject_private(&policy, 0, dupl_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* IPv4/IPv6 Exits */ - - /* test that IPv4 addresses are rejected on an IPv4/IPv6 exit */ - policies_parse_exit_policy_reject_private(&policy, 1, ipv4_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* test that IPv6 addresses are rejected on an IPv4/IPv6 exit */ - policies_parse_exit_policy_reject_private(&policy, 1, ipv6_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* test that IPv4 and IPv6 addresses are rejected on an IPv4/IPv6 exit */ - policies_parse_exit_policy_reject_private(&policy, 1, both_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 2); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* Test that lists with duplicate entries produce the same results */ - policies_parse_exit_policy_reject_private(&policy, 1, dupl_list, 0, 0); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 2); - tt_assert(test_policy_has_address_helper(policy, &ipv4_addr)); - tt_assert(test_policy_has_address_helper(policy, &ipv6_addr)); - addr_policy_list_free(policy); - policy = NULL; - - done: - addr_policy_list_free(policy); - smartlist_free(ipv4_list); - smartlist_free(ipv6_list); - smartlist_free(both_list); - smartlist_free(dupl_list); -} - -static smartlist_t *test_configured_ports = NULL; - -/** Returns test_configured_ports */ -static const smartlist_t * -mock_get_configured_ports(void) -{ - return test_configured_ports; -} - -/** Run unit tests for rejecting publicly routable configured port addresses - * on this exit relay using policies_parse_exit_policy_reject_private */ -static void -test_policies_reject_port_address(void *arg) -{ - smartlist_t *policy = NULL; - port_cfg_t *ipv4_port = NULL; - port_cfg_t *ipv6_port = NULL; - (void)arg; - - test_configured_ports = smartlist_new(); - - ipv4_port = port_cfg_new(0); - tor_addr_from_ipv4h(&ipv4_port->addr, TEST_IPV4_ADDR); - smartlist_add(test_configured_ports, ipv4_port); - - ipv6_port = port_cfg_new(0); - tor_addr_parse(&ipv6_port->addr, TEST_IPV6_ADDR); - smartlist_add(test_configured_ports, ipv6_port); - - MOCK(get_configured_ports, mock_get_configured_ports); - - /* test that an IPv4 port is rejected on an IPv4-only exit, but an IPv6 port - * is NOT rejected (all IPv6 addresses are rejected by - * policies_parse_exit_policy_internal on IPv4-only exits, so - * policies_parse_exit_policy_reject_private doesn't need to do anything - * with IPv6 addresses on IPv4-only exits) */ - policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 1); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 1); - tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr)); - addr_policy_list_free(policy); - policy = NULL; - - /* test that IPv4 and IPv6 ports are rejected on an IPv4/IPv6 exit */ - policies_parse_exit_policy_reject_private(&policy, 1, NULL, 0, 1); - tt_assert(policy); - tt_int_op(smartlist_len(policy), OP_EQ, 2); - tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr)); - tt_assert(test_policy_has_address_helper(policy, &ipv6_port->addr)); - addr_policy_list_free(policy); - policy = NULL; - - done: - addr_policy_list_free(policy); - if (test_configured_ports) { - SMARTLIST_FOREACH(test_configured_ports, - port_cfg_t *, p, port_cfg_free(p)); - smartlist_free(test_configured_ports); - test_configured_ports = NULL; - } - UNMOCK(get_configured_ports); -} - -static smartlist_t *mock_ipv4_addrs = NULL; -static smartlist_t *mock_ipv6_addrs = NULL; - -/* mock get_interface_address6_list, returning a deep copy of the template - * address list ipv4_interface_address_list or ipv6_interface_address_list */ -static smartlist_t * -mock_get_interface_address6_list(int severity, - sa_family_t family, - int include_internal) -{ - (void)severity; - (void)include_internal; - smartlist_t *clone_list = smartlist_new(); - smartlist_t *template_list = NULL; - - if (family == AF_INET) { - template_list = mock_ipv4_addrs; - } else if (family == AF_INET6) { - template_list = mock_ipv6_addrs; - } else { - return NULL; - } - - tt_assert(template_list); - - SMARTLIST_FOREACH_BEGIN(template_list, tor_addr_t *, src_addr) { - tor_addr_t *dest_addr = tor_malloc(sizeof(tor_addr_t)); - memset(dest_addr, 0, sizeof(*dest_addr)); - tor_addr_copy_tight(dest_addr, src_addr); - smartlist_add(clone_list, dest_addr); - } SMARTLIST_FOREACH_END(src_addr); - - return clone_list; - - done: - interface_address6_list_free(clone_list); - return NULL; -} - -/** Run unit tests for rejecting publicly routable interface addresses on this - * exit relay using policies_parse_exit_policy_reject_private */ -static void -test_policies_reject_interface_address(void *arg) -{ - smartlist_t *policy = NULL; - smartlist_t *public_ipv4_addrs = - get_interface_address6_list(LOG_INFO, AF_INET, 0); - smartlist_t *public_ipv6_addrs = - get_interface_address6_list(LOG_INFO, AF_INET6, 0); - tor_addr_t ipv4_addr, ipv6_addr; - (void)arg; - - /* test that no addresses are rejected when none are supplied/requested */ - policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0); - tt_ptr_op(policy, OP_EQ, NULL); - - /* test that only IPv4 interface addresses are rejected on an IPv4-only exit - * (and allow for duplicates) - */ - policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0); - if (policy) { - tt_assert(smartlist_len(policy) <= smartlist_len(public_ipv4_addrs)); - addr_policy_list_free(policy); - policy = NULL; - } - - /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6 - * exit (and allow for duplicates) */ - policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0); - if (policy) { - tt_assert(smartlist_len(policy) <= (smartlist_len(public_ipv4_addrs) - + smartlist_len(public_ipv6_addrs))); - addr_policy_list_free(policy); - policy = NULL; - } - - /* Now do it all again, but mocked */ - tor_addr_from_ipv4h(&ipv4_addr, TEST_IPV4_ADDR); - mock_ipv4_addrs = smartlist_new(); - smartlist_add(mock_ipv4_addrs, (void *)&ipv4_addr); - - tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR); - mock_ipv6_addrs = smartlist_new(); - smartlist_add(mock_ipv6_addrs, (void *)&ipv6_addr); - - MOCK(get_interface_address6_list, mock_get_interface_address6_list); - - /* test that no addresses are rejected when none are supplied/requested */ - policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0); - tt_ptr_op(policy, OP_EQ, NULL); - - /* test that only IPv4 interface addresses are rejected on an IPv4-only exit - */ - policies_parse_exit_policy_reject_private(&policy, 0, NULL, 1, 0); - tt_assert(policy); - tt_assert(smartlist_len(policy) == smartlist_len(mock_ipv4_addrs)); - addr_policy_list_free(policy); - policy = NULL; - - /* test that IPv4 and IPv6 interface addresses are rejected on an IPv4/IPv6 - * exit */ - policies_parse_exit_policy_reject_private(&policy, 1, NULL, 1, 0); - tt_assert(policy); - tt_assert(smartlist_len(policy) == (smartlist_len(mock_ipv4_addrs) - + smartlist_len(mock_ipv6_addrs))); - addr_policy_list_free(policy); - policy = NULL; - - done: - addr_policy_list_free(policy); - interface_address6_list_free(public_ipv4_addrs); - interface_address6_list_free(public_ipv6_addrs); - - UNMOCK(get_interface_address6_list); - /* we don't use interface_address6_list_free on these lists because their - * address pointers are stack-based */ - smartlist_free(mock_ipv4_addrs); - smartlist_free(mock_ipv6_addrs); -} - -#undef TEST_IPV4_ADDR -#undef TEST_IPV6_ADDR - -static void -test_dump_exit_policy_to_string(void *arg) -{ - char *ep; - addr_policy_t *policy_entry; - int malformed_list = -1; - - routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t)); - - (void)arg; - - ri->policy_is_reject_star = 1; - ri->exit_policy = NULL; // expecting "reject *:*" - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("reject *:*",OP_EQ, ep); - - tor_free(ep); - - ri->exit_policy = smartlist_new(); - ri->policy_is_reject_star = 0; - - policy_entry = router_parse_addr_policy_item_from_string("accept *:*", -1, - &malformed_list); - - smartlist_add(ri->exit_policy,policy_entry); - - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("accept *:*",OP_EQ, ep); - - tor_free(ep); - - policy_entry = router_parse_addr_policy_item_from_string("reject *:25", -1, - &malformed_list); - - smartlist_add(ri->exit_policy,policy_entry); - - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("accept *:*\nreject *:25",OP_EQ, ep); - - tor_free(ep); - - policy_entry = - router_parse_addr_policy_item_from_string("reject 8.8.8.8:*", -1, - &malformed_list); - - smartlist_add(ri->exit_policy,policy_entry); - - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",OP_EQ, ep); - tor_free(ep); - - policy_entry = - router_parse_addr_policy_item_from_string("reject6 [FC00::]/7:*", -1, - &malformed_list); - - smartlist_add(ri->exit_policy,policy_entry); - - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" - "reject6 [fc00::]/7:*",OP_EQ, ep); - tor_free(ep); - - policy_entry = - router_parse_addr_policy_item_from_string("accept6 [c000::]/3:*", -1, - &malformed_list); - - smartlist_add(ri->exit_policy,policy_entry); - - ep = router_dump_exit_policy_to_string(ri,1,1); - - tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" - "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",OP_EQ, ep); - - done: - - if (ri->exit_policy) { - SMARTLIST_FOREACH(ri->exit_policy, addr_policy_t *, - entry, addr_policy_free(entry)); - smartlist_free(ri->exit_policy); - } - tor_free(ri); - tor_free(ep); -} - -static routerinfo_t *mock_desc_routerinfo = NULL; -static const routerinfo_t * -mock_router_get_my_routerinfo(void) -{ - return mock_desc_routerinfo; -} - -#define DEFAULT_POLICY_STRING "reject *:*" -#define TEST_IPV4_ADDR (0x02040608) -#define TEST_IPV6_ADDR ("2003::ef01") - -static or_options_t mock_options; - -static const or_options_t * -mock_get_options(void) -{ - return &mock_options; -} - -/** Run unit tests for generating summary lines of exit policies */ -static void -test_policies_getinfo_helper_policies(void *arg) -{ - (void)arg; - int rv = 0; - size_t ipv4_len = 0, ipv6_len = 0; - char *answer = NULL; - const char *errmsg = NULL; - routerinfo_t mock_my_routerinfo; - - memset(&mock_my_routerinfo, 0, sizeof(mock_my_routerinfo)); - - rv = getinfo_helper_policies(NULL, "exit-policy/default", &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/default", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tor_free(answer); - - memset(&mock_my_routerinfo, 0, sizeof(routerinfo_t)); - MOCK(router_get_my_routerinfo, mock_router_get_my_routerinfo); - mock_my_routerinfo.exit_policy = smartlist_new(); - mock_desc_routerinfo = &mock_my_routerinfo; - - memset(&mock_options, 0, sizeof(or_options_t)); - MOCK(get_options, mock_get_options); - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) == 0); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - ipv4_len = strlen(answer); - tt_assert(ipv4_len == 0 || ipv4_len == strlen(DEFAULT_POLICY_STRING)); - tt_assert(ipv4_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - ipv6_len = strlen(answer); - tt_assert(ipv6_len == 0 || ipv6_len == strlen(DEFAULT_POLICY_STRING)); - tt_assert(ipv6_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - /* It's either empty or it's the default */ - tt_assert(strlen(answer) == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING)); - tor_free(answer); - - mock_my_routerinfo.addr = TEST_IPV4_ADDR; - tor_addr_parse(&mock_my_routerinfo.ipv6_addr, TEST_IPV6_ADDR); - append_exit_policy_string(&mock_my_routerinfo.exit_policy, "accept *4:*"); - append_exit_policy_string(&mock_my_routerinfo.exit_policy, "reject *6:*"); - - mock_options.IPv6Exit = 1; - tor_addr_from_ipv4h( - &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][0], - TEST_IPV4_ADDR); - tor_addr_parse( - &mock_options.OutboundBindAddresses[OUTBOUND_ADDR_EXIT][1], - TEST_IPV6_ADDR); - - mock_options.ExitPolicyRejectPrivate = 1; - mock_options.ExitPolicyRejectLocalInterfaces = 1; - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tor_free(answer); - - mock_options.ExitPolicyRejectPrivate = 1; - mock_options.ExitPolicyRejectLocalInterfaces = 0; - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tor_free(answer); - - mock_options.ExitPolicyRejectPrivate = 0; - mock_options.ExitPolicyRejectLocalInterfaces = 1; - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tor_free(answer); - - mock_options.ExitPolicyRejectPrivate = 0; - mock_options.ExitPolicyRejectLocalInterfaces = 0; - - rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay", - &answer, &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) == 0); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - ipv4_len = strlen(answer); - tt_assert(ipv4_len > 0); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - ipv6_len = strlen(answer); - tt_assert(ipv6_len > 0); - tor_free(answer); - - rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer, - &errmsg); - tt_int_op(rv, OP_EQ, 0); - tt_ptr_op(answer, OP_NE, NULL); - tt_assert(strlen(answer) > 0); - tt_assert(strlen(answer) == ipv4_len + ipv6_len + 1); - tor_free(answer); - - done: - tor_free(answer); - UNMOCK(get_options); - UNMOCK(router_get_my_routerinfo); - addr_policy_list_free(mock_my_routerinfo.exit_policy); -} - -#undef DEFAULT_POLICY_STRING -#undef TEST_IPV4_ADDR -#undef TEST_IPV6_ADDR - -#define TEST_IPV4_ADDR_STR "1.2.3.4" -#define TEST_IPV6_ADDR_STR "[1002::4567]" -#define REJECT_IPv4_FINAL_STR "reject 0.0.0.0/0:*" -#define REJECT_IPv6_FINAL_STR "reject [::]/0:*" - -#define OTHER_IPV4_ADDR_STR "6.7.8.9" -#define OTHER_IPV6_ADDR_STR "[afff::]" - -/** Run unit tests for fascist_firewall_allows_address */ -static void -test_policies_fascist_firewall_allows_address(void *arg) -{ - (void)arg; - tor_addr_t ipv4_addr, ipv6_addr, r_ipv4_addr, r_ipv6_addr; - tor_addr_t n_ipv4_addr, n_ipv6_addr; - const uint16_t port = 1234; - smartlist_t *policy = NULL; - smartlist_t *e_policy = NULL; - addr_policy_t *item = NULL; - int malformed_list = 0; - - /* Setup the options and the items in the policies */ - memset(&mock_options, 0, sizeof(or_options_t)); - MOCK(get_options, mock_get_options); - - policy = smartlist_new(); - item = router_parse_addr_policy_item_from_string("accept " - TEST_IPV4_ADDR_STR ":*", - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(item); - tt_assert(!malformed_list); - smartlist_add(policy, item); - item = router_parse_addr_policy_item_from_string("accept " - TEST_IPV6_ADDR_STR, - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(item); - tt_assert(!malformed_list); - smartlist_add(policy, item); - /* Normally, policy_expand_unspec would do this for us */ - item = router_parse_addr_policy_item_from_string(REJECT_IPv4_FINAL_STR, - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(item); - tt_assert(!malformed_list); - smartlist_add(policy, item); - item = router_parse_addr_policy_item_from_string(REJECT_IPv6_FINAL_STR, - ADDR_POLICY_ACCEPT, - &malformed_list); - tt_assert(item); - tt_assert(!malformed_list); - smartlist_add(policy, item); - item = NULL; - - e_policy = smartlist_new(); - - /* - char *polstr = policy_dump_to_string(policy, 1, 1); - printf("%s\n", polstr); - tor_free(polstr); - */ - - /* Parse the addresses */ - tor_addr_parse(&ipv4_addr, TEST_IPV4_ADDR_STR); - tor_addr_parse(&ipv6_addr, TEST_IPV6_ADDR_STR); - tor_addr_parse(&r_ipv4_addr, OTHER_IPV4_ADDR_STR); - tor_addr_parse(&r_ipv6_addr, OTHER_IPV6_ADDR_STR); - tor_addr_make_null(&n_ipv4_addr, AF_INET); - tor_addr_make_null(&n_ipv6_addr, AF_INET6); - - /* Test the function's address matching with IPv4 and IPv6 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 0; - - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Preferring IPv4 */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0), - OP_EQ, 0); - - /* Preferring IPv6 */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1), - OP_EQ, 0); - - /* Test the function's address matching with UseBridges on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 1; - - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Preferring IPv4 */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0), - OP_EQ, 0); - - /* Preferring IPv6 */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1), - OP_EQ, 0); - - /* bridge clients always use IPv6, regardless of ClientUseIPv6 */ - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 0; - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Test the function's address matching with IPv4 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 0; - mock_options.UseBridges = 0; - - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Test the function's address matching with IPv6 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 0; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 0; - - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Test the function's address matching with ClientUseIPv4 0. - * This means "use IPv6" regardless of the other settings. */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 0; - mock_options.ClientUseIPv6 = 0; - mock_options.UseBridges = 0; - - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* Test the function's address matching for unusual inputs */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 1; - - /* NULL and tor_addr_is_null addresses are rejected */ - tt_int_op(fascist_firewall_allows_address(NULL, port, policy, 0, 0), OP_EQ, - 0); - tt_int_op(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0), - OP_EQ, 0); - - /* zero ports are rejected */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0), - OP_EQ, 0); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0), - OP_EQ, 0); - - /* NULL and empty policies accept everything */ - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0), - OP_EQ, 1); - tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0), - OP_EQ, 1); - - done: - addr_policy_free(item); - addr_policy_list_free(policy); - addr_policy_list_free(e_policy); - UNMOCK(get_options); -} - -#undef REJECT_IPv4_FINAL_STR -#undef REJECT_IPv6_FINAL_STR -#undef OTHER_IPV4_ADDR_STR -#undef OTHER_IPV6_ADDR_STR - -#define TEST_IPV4_OR_PORT 1234 -#define TEST_IPV4_DIR_PORT 2345 -#define TEST_IPV6_OR_PORT 61234 -#define TEST_IPV6_DIR_PORT 62345 - -/* Check that fascist_firewall_choose_address_rs() returns the expected - * results. */ -#define CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \ - expect_ap) \ - STMT_BEGIN \ - tor_addr_port_t chosen_rs_ap; \ - tor_addr_make_null(&chosen_rs_ap.addr, AF_INET); \ - chosen_rs_ap.port = 0; \ - tt_int_op(fascist_firewall_choose_address_rs(&(fake_rs), \ - (fw_connection), \ - (pref_only), \ - &chosen_rs_ap), \ - OP_EQ, (expect_rv)); \ - tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_rs_ap.addr)); \ - tt_int_op((expect_ap).port, OP_EQ, chosen_rs_ap.port); \ - STMT_END - -/* Check that fascist_firewall_choose_address_node() returns the expected - * results. */ -#define CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, \ - expect_rv, expect_ap) \ - STMT_BEGIN \ - tor_addr_port_t chosen_node_ap; \ - tor_addr_make_null(&chosen_node_ap.addr, AF_INET); \ - chosen_node_ap.port = 0; \ - tt_int_op(fascist_firewall_choose_address_node(&(fake_node), \ - (fw_connection), \ - (pref_only), \ - &chosen_node_ap), \ - OP_EQ, (expect_rv)); \ - tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_node_ap.addr)); \ - tt_int_op((expect_ap).port, OP_EQ, chosen_node_ap.port); \ - STMT_END - -/* Check that fascist_firewall_choose_address_rs and - * fascist_firewall_choose_address_node() both return the expected results. */ -#define CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, fw_connection, pref_only, \ - expect_rv, expect_ap) \ - STMT_BEGIN \ - CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \ - expect_ap); \ - CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, expect_rv, \ - expect_ap); \ - STMT_END - -/** Run unit tests for fascist_firewall_choose_address */ -static void -test_policies_fascist_firewall_choose_address(void *arg) -{ - (void)arg; - tor_addr_port_t ipv4_or_ap, ipv4_dir_ap, ipv6_or_ap, ipv6_dir_ap; - tor_addr_port_t n_ipv4_ap, n_ipv6_ap; - - /* Setup the options */ - memset(&mock_options, 0, sizeof(or_options_t)); - MOCK(get_options, mock_get_options); - - /* Parse the addresses */ - tor_addr_parse(&ipv4_or_ap.addr, TEST_IPV4_ADDR_STR); - ipv4_or_ap.port = TEST_IPV4_OR_PORT; - tor_addr_parse(&ipv4_dir_ap.addr, TEST_IPV4_ADDR_STR); - ipv4_dir_ap.port = TEST_IPV4_DIR_PORT; - - tor_addr_parse(&ipv6_or_ap.addr, TEST_IPV6_ADDR_STR); - ipv6_or_ap.port = TEST_IPV6_OR_PORT; - tor_addr_parse(&ipv6_dir_ap.addr, TEST_IPV6_ADDR_STR); - ipv6_dir_ap.port = TEST_IPV6_DIR_PORT; - - tor_addr_make_null(&n_ipv4_ap.addr, AF_INET); - n_ipv4_ap.port = 0; - tor_addr_make_null(&n_ipv6_ap.addr, AF_INET6); - n_ipv6_ap.port = 0; - - /* Sanity check fascist_firewall_choose_address with IPv4 and IPv6 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 0; - - /* Prefer IPv4 */ - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, - FIREWALL_OR_CONNECTION, 0, 0) - == &ipv4_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, - FIREWALL_OR_CONNECTION, 1, 0) - == &ipv4_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1, - FIREWALL_DIR_CONNECTION, 0, 0) - == &ipv4_dir_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1, - FIREWALL_DIR_CONNECTION, 1, 0) - == &ipv4_dir_ap); - - /* Prefer IPv6 */ - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, - FIREWALL_OR_CONNECTION, 0, 1) - == &ipv6_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, - FIREWALL_OR_CONNECTION, 1, 1) - == &ipv6_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0, - FIREWALL_DIR_CONNECTION, 0, 1) - == &ipv6_dir_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0, - FIREWALL_DIR_CONNECTION, 1, 1) - == &ipv6_dir_ap); - - /* Unusual inputs */ - - /* null preferred OR addresses */ - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &n_ipv6_ap, 0, - FIREWALL_OR_CONNECTION, 0, 1) - == &ipv4_or_ap); - tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_or_ap, 1, - FIREWALL_OR_CONNECTION, 0, 0) - == &ipv6_or_ap); - - /* null both OR addresses */ - tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0, - FIREWALL_OR_CONNECTION, 0, 1), - OP_EQ, NULL); - tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1, - FIREWALL_OR_CONNECTION, 0, 0), - OP_EQ, NULL); - - /* null preferred Dir addresses */ - tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &n_ipv6_ap, 0, - FIREWALL_DIR_CONNECTION, 0, 1) - == &ipv4_dir_ap); - tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_dir_ap, 1, - FIREWALL_DIR_CONNECTION, 0, 0) - == &ipv6_dir_ap); - - /* null both Dir addresses */ - tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0, - FIREWALL_DIR_CONNECTION, 0, 1), - OP_EQ, NULL); - tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1, - FIREWALL_DIR_CONNECTION, 0, 0), - OP_EQ, NULL); - - /* Prefer IPv4 but want IPv6 (contradictory) */ - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, - FIREWALL_OR_CONNECTION, 0, 0) - == &ipv4_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0, - FIREWALL_OR_CONNECTION, 1, 0) - == &ipv4_or_ap); - - /* Prefer IPv6 but want IPv4 (contradictory) */ - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, - FIREWALL_OR_CONNECTION, 0, 1) - == &ipv6_or_ap); - tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1, - FIREWALL_OR_CONNECTION, 1, 1) - == &ipv6_or_ap); - - /* Make a fake rs. There will be no corresponding node. - * This is what happens when there's no consensus and we're bootstrapping - * from authorities / fallbacks. */ - routerstatus_t fake_rs; - memset(&fake_rs, 0, sizeof(routerstatus_t)); - /* In a routerstatus, the OR and Dir addresses are the same */ - fake_rs.addr = tor_addr_to_ipv4h(&ipv4_or_ap.addr); - fake_rs.or_port = ipv4_or_ap.port; - fake_rs.dir_port = ipv4_dir_ap.port; - - tor_addr_copy(&fake_rs.ipv6_addr, &ipv6_or_ap.addr); - fake_rs.ipv6_orport = ipv6_or_ap.port; - /* In a routerstatus, the IPv4 and IPv6 DirPorts are the same.*/ - ipv6_dir_ap.port = TEST_IPV4_DIR_PORT; - - /* Make a fake node. Even though it contains the fake_rs, a lookup won't - * find the node from the rs, because they're not in the hash table. */ - node_t fake_node; - memset(&fake_node, 0, sizeof(node_t)); - fake_node.rs = &fake_rs; - - /* Choose an address with IPv4 and IPv6 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - mock_options.UseBridges = 0; - - /* Preferring IPv4 */ - mock_options.ClientPreferIPv6ORPort = 0; - mock_options.ClientPreferIPv6DirPort = 0; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Auto (Preferring IPv4) */ - mock_options.ClientPreferIPv6ORPort = -1; - mock_options.ClientPreferIPv6DirPort = -1; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Preferring IPv6 */ - mock_options.ClientPreferIPv6ORPort = 1; - mock_options.ClientPreferIPv6DirPort = 1; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv6_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv6_dir_ap); - - /* Preferring IPv4 OR / IPv6 Dir */ - mock_options.ClientPreferIPv6ORPort = 0; - mock_options.ClientPreferIPv6DirPort = 1; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv6_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv6_dir_ap); - - /* Preferring IPv6 OR / IPv4 Dir */ - mock_options.ClientPreferIPv6ORPort = 1; - mock_options.ClientPreferIPv6DirPort = 0; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Choose an address with UseBridges on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.UseBridges = 1; - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 1; - - /* Preferring IPv4 */ - mock_options.ClientPreferIPv6ORPort = 0; - mock_options.ClientPreferIPv6DirPort = 0; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Auto: - * - bridge clients prefer the configured bridge OR address from the node, - * (the configured address family sets node.ipv6_preferred) - * - other clients prefer IPv4 OR by default (see above), - * - all clients, including bridge clients, prefer IPv4 Dir by default. - */ - mock_options.ClientPreferIPv6ORPort = -1; - mock_options.ClientPreferIPv6DirPort = -1; - - /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge - * configured with an IPv4 address */ - fake_node.ipv6_preferred = 0; - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge - * configured with an IPv6 address */ - fake_node.ipv6_preferred = 1; - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* When a rs has no node, it defaults to IPv4 under auto. */ - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap); - - /* Preferring IPv6 */ - mock_options.ClientPreferIPv6ORPort = 1; - mock_options.ClientPreferIPv6DirPort = 1; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv6_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv6_dir_ap); - - /* In the default configuration (Auto / IPv6 off), bridge clients should - * use both IPv4 and IPv6, but only prefer IPv6 for bridges configured with - * an IPv6 address, regardless of ClientUseIPv6. (See above.) */ - mock_options.ClientUseIPv6 = 0; - mock_options.ClientPreferIPv6ORPort = -1; - mock_options.ClientPreferIPv6DirPort = -1; - /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge - * configured with an IPv4 address */ - fake_node.ipv6_preferred = 0; - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Simulate the initialisation of fake_node.ipv6_preferred with a bridge - * configured with an IPv6 address */ - fake_node.ipv6_preferred = 1; - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 0, 1, ipv6_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_OR_CONNECTION, 1, 1, ipv6_or_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_NODE(fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* When a rs has no node, it defaults to IPv4 under auto. */ - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 0, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_OR_CONNECTION, 1, 1, ipv4_or_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 0, 1, ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RS(fake_rs, FIREWALL_DIR_CONNECTION, 1, 1, ipv4_dir_ap); - - /* Choose an address with IPv4 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 1; - mock_options.ClientUseIPv6 = 0; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - /* Choose an address with IPv6 on */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 0; - mock_options.ClientUseIPv6 = 1; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv6_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv6_dir_ap); - - /* Choose an address with ClientUseIPv4 0. - * This means "use IPv6" regardless of the other settings. */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ClientUseIPv4 = 0; - mock_options.ClientUseIPv6 = 0; - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv6_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv6_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv6_dir_ap); - - /* Choose an address with ORPort_set 1 (server mode). - * This means "use IPv4" regardless of the other settings. */ - memset(&mock_options, 0, sizeof(or_options_t)); - mock_options.ORPort_set = 1; - mock_options.ClientUseIPv4 = 0; - mock_options.ClientUseIPv6 = 1; - mock_options.ClientPreferIPv6ORPort = 1; - mock_options.ClientPreferIPv6DirPort = 1; - - /* Simulate the initialisation of fake_node.ipv6_preferred */ - fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport( - &mock_options); - - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 1, 1, - ipv4_or_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 0, 1, - ipv4_dir_ap); - CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_DIR_CONNECTION, 1, 1, - ipv4_dir_ap); - - done: - UNMOCK(get_options); -} - -#undef TEST_IPV4_ADDR_STR -#undef TEST_IPV6_ADDR_STR -#undef TEST_IPV4_OR_PORT -#undef TEST_IPV4_DIR_PORT -#undef TEST_IPV6_OR_PORT -#undef TEST_IPV6_DIR_PORT - -#undef CHECK_CHOSEN_ADDR_RS -#undef CHECK_CHOSEN_ADDR_NODE -#undef CHECK_CHOSEN_ADDR_RN - -struct testcase_t policy_tests[] = { - { "router_dump_exit_policy_to_string", test_dump_exit_policy_to_string, 0, - NULL, NULL }, - { "general", test_policies_general, 0, NULL, NULL }, - { "getinfo_helper_policies", test_policies_getinfo_helper_policies, 0, NULL, - NULL }, - { "reject_exit_address", test_policies_reject_exit_address, 0, NULL, NULL }, - { "reject_interface_address", test_policies_reject_interface_address, 0, - NULL, NULL }, - { "reject_port_address", test_policies_reject_port_address, 0, NULL, NULL }, - { "fascist_firewall_allows_address", - test_policies_fascist_firewall_allows_address, 0, NULL, NULL }, - { "fascist_firewall_choose_address", - test_policies_fascist_firewall_choose_address, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_procmon.c b/src/tor/src/test/test_procmon.c deleted file mode 100644 index 5c52af869..000000000 --- a/src/tor/src/test/test_procmon.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define PROCMON_PRIVATE -#include "orconfig.h" -#include "or.h" -#include "test.h" - -#include "procmon.h" - -#include "log_test_helpers.h" - -#define NS_MODULE procmon - -struct event_base; - -static void -test_procmon_tor_process_monitor_new(void *ignored) -{ - (void)ignored; - tor_process_monitor_t *res; - const char *msg; - - res = tor_process_monitor_new(NULL, "probably invalid", 0, NULL, NULL, &msg); - tt_assert(!res); - tt_str_op(msg, OP_EQ, "invalid PID"); - - res = tor_process_monitor_new(NULL, "243443535345454", 0, NULL, NULL, &msg); - tt_assert(!res); - tt_str_op(msg, OP_EQ, "invalid PID"); - - res = tor_process_monitor_new(tor_libevent_get_base(), "43", 0, - NULL, NULL, &msg); - tt_assert(res); - tt_assert(!msg); - tor_process_monitor_free(res); - - res = tor_process_monitor_new(tor_libevent_get_base(), "44 hello", 0, - NULL, NULL, &msg); - tt_assert(res); - tt_assert(!msg); - tor_process_monitor_free(res); - - res = tor_process_monitor_new(tor_libevent_get_base(), "45:hello", 0, - NULL, NULL, &msg); - tt_assert(res); - tt_assert(!msg); - - done: - tor_process_monitor_free(res); -} - -struct testcase_t procmon_tests[] = { - { "tor_process_monitor_new", test_procmon_tor_process_monitor_new, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_proto_http.c b/src/tor/src/test/test_proto_http.c deleted file mode 100644 index 2f36fbccd..000000000 --- a/src/tor/src/test/test_proto_http.c +++ /dev/null @@ -1,213 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_proto_http.c - * \brief Tests for our HTTP protocol parser code - */ - -#include "or.h" -#include "test.h" -#include "buffers.h" -#include "proto_http.h" -#include "log_test_helpers.h" - -#define S(str) str, sizeof(str)-1 - -static void -test_proto_http_peek(void *arg) -{ - (void) arg; - const struct { - int is_http; - const char *message; - size_t len; - } cases[] = { - { 1, S("GET /index HTTP/1.0\r\n") }, - { 1, S("GET /index HTTP/1.1\r\n") }, - { 1, S("GET ") }, - { 0, S("GIT ") }, - { 0, S("GET") }, - { 0, S("get ") }, - { 0, S("GETAWAY") }, - }; - unsigned i; - buf_t *buf = buf_new(); - for (i = 0; i < ARRAY_LENGTH(cases); ++i) { - TT_BLATHER(("Trying case %u", i)); - buf_add(buf, cases[i].message, cases[i].len); - tt_int_op(cases[i].is_http, OP_EQ, peek_buf_has_http_command(buf)); - buf_clear(buf); - } - done: - buf_free(buf); -} - -static void -test_proto_http_valid(void *arg) -{ - (void) arg; - const struct { - const char *message; - size_t len; - const char *headers; - const char *body; - size_t bodylen; - int should_detect_truncated; - int bytes_left_over; - } cases[] = { - { S("GET /index.html HTTP/1.0\r\n\r\n"), - "GET /index.html HTTP/1.0\r\n\r\n", - S(""), - 1, 0, - }, - { S("PUT /tor/foo HTTP/1.1\r\n" - "Content-Length: 51\r\n\r\n" - "this is a test of the http parsing system . test te"), - "PUT /tor/foo HTTP/1.1\r\n" "Content-Length: 51\r\n\r\n", - S("this is a test of the http parsing system . test te"), - 1, 0, - }, - { S("PUT /tor/foo HTTP/1.1\r\n" - "Content-Length: 5\r\n\r\n" - "there are more than 5 characters in this body."), - "PUT /tor/foo HTTP/1.1\r\n" "Content-Length: 5\r\n\r\n", - S("there"), - 0, 41, - }, - { S("PUT /tor/bar HTTP/1.1\r\n\r\n" - "this is another \x00test"), - "PUT /tor/bar HTTP/1.1\r\n\r\n", - S("this is another \x00test"), - 0, 0, - } - }; - unsigned i; - buf_t *buf = buf_new(); - char *h = NULL, *b = NULL; - - for (i = 0; i < ARRAY_LENGTH(cases); ++i) { - TT_BLATHER(("Trying case %u", i)); - size_t bl = 0; - // truncate by 2 chars - buf_add(buf, cases[i].message, cases[i].len - 2); - - if (cases[i].should_detect_truncated) { - tt_int_op(0, OP_EQ, fetch_from_buf_http(buf, &h, 1024*16, - &b, &bl, 1024*16, 0)); - tt_ptr_op(h, OP_EQ, NULL); - tt_ptr_op(b, OP_EQ, NULL); - tt_u64_op(bl, OP_EQ, 0); - tt_int_op(buf_datalen(buf), OP_EQ, cases[i].len - 2); - } - - // add the rest. - buf_add(buf, cases[i].message+cases[i].len-2, 2); - tt_int_op(1, OP_EQ, fetch_from_buf_http(buf, &h, 1024*16, - &b, &bl, 1024*16, 0)); - tt_str_op(h, OP_EQ, cases[i].headers); - tt_u64_op(bl, OP_EQ, cases[i].bodylen); - tt_mem_op(b, OP_EQ, cases[i].body, bl); - tt_int_op(buf_datalen(buf), OP_EQ, cases[i].bytes_left_over); - - buf_clear(buf); - tor_free(h); - tor_free(b); - } - done: - tor_free(h); - tor_free(b); - buf_free(buf); -} - -static void -test_proto_http_invalid(void *arg) -{ - (void) arg; - const struct { - const char *message; - size_t len; - const char *expect; - } cases[] = { - /* Overlong headers, headers not finished. */ - { S("GET /index.xhml HTTP/1.0\r\n" - "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" - "X-My-headers-are-too-long: normal under other circumstances, but\r\n" - "X-My-headers-are-too-long: the 128-byte limit makes them bad\r\n"), - "headers too long." }, - /* Overlong finished headers. */ - { S("GET /index.xhml HTTP/1.0\r\n" - "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" - "X-My-headers-are-too-long: normal under other circumstances, but\r\n" - "X-My-headers-are-too-long: the 128-byte limit makes them bad\r\n" - "\r\n"), - "headers too long." }, - /* Exactly too long finished headers. */ - { S("GET /index.xhml HTTP/1.0\r\n" - "X-My-headers-are-too-long: yes indeed they are. They might be\r\n" - "X-My-headers-are-too-long: normal un\r\n\r\n"), - "headerlen 129 larger than 127. Failing." }, - /* Body too long, with content-length */ - { S("GET /index.html HTTP/1.0\r\n" - "Content-Length: 129\r\n\r\n" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxx"), - "bodylen 129 larger than 127" }, - /* Body too long, with content-length lying */ - { S("GET /index.html HTTP/1.0\r\n" - "Content-Length: 99999\r\n\r\n" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"), - "bodylen 138 larger than 127" }, - /* Body too long, no content-length. */ - { S("GET /index.html HTTP/1.0\r\n\r\n" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxz"), - "bodylen 139 larger than 127" }, - /* Content-Length is junk. */ - { S("GET /index.html HTTP/1.0\r\n" - "Content-Length: Cheese\r\n\r\n" - "foo"), - "Content-Length is bogus; maybe someone is trying to crash us." }, - }; - unsigned i; - buf_t *buf = buf_new(); - char *h = NULL, *b = NULL; - setup_capture_of_logs(LOG_DEBUG); - - for (i = 0; i < ARRAY_LENGTH(cases); ++i) { - TT_BLATHER(("Trying case %u", i)); - size_t bl = 0; - buf_add(buf, cases[i].message, cases[i].len); - - /* Use low body limits here so we can force over-sized object warnings */ - tt_int_op(-1, OP_EQ, fetch_from_buf_http(buf, &h, 128, - &b, &bl, 128, 0)); - tt_ptr_op(h, OP_EQ, NULL); - tt_ptr_op(b, OP_EQ, NULL); - tt_u64_op(bl, OP_EQ, 0); - expect_log_msg_containing(cases[i].expect); - - buf_clear(buf); - tor_free(h); - tor_free(b); - mock_clean_saved_logs(); - } - done: - tor_free(h); - tor_free(b); - buf_free(buf); - teardown_capture_of_logs(); -} - -struct testcase_t proto_http_tests[] = { - { "peek", test_proto_http_peek, 0, NULL, NULL }, - { "valid", test_proto_http_valid, 0, NULL, NULL }, - { "invalid", test_proto_http_invalid, 0, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_proto_misc.c b/src/tor/src/test/test_proto_misc.c deleted file mode 100644 index 263ca4744..000000000 --- a/src/tor/src/test/test_proto_misc.c +++ /dev/null @@ -1,263 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_proto_misc.c - * \brief Test our smaller buffer-based protocol functions - */ - -#include "or.h" -#include "test.h" -#include "buffers.h" -#include "connection_or.h" -#include "ext_orport.h" -#include "proto_cell.h" -#include "proto_control0.h" -#include "proto_ext_or.h" - -static void -test_proto_var_cell(void *arg) -{ - (void)arg; - char *mem_op_hex_tmp = NULL; - char tmp[1024]; - buf_t *buf = NULL; - var_cell_t *cell = NULL; - - buf = buf_new(); - memset(tmp, 0xf0, sizeof(tmp)); - - /* Short little commands will make us say "no cell yet." */ - tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - tt_ptr_op(cell, OP_EQ, NULL); - buf_add(buf, "\x01\x02\x02\0x2", 4); - tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - /* An incomplete fixed-length cell makes us say "no cell yet". */ - buf_add(buf, "\x03", 1); - tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - /* A complete fixed length-cell makes us say "not a variable-length cell" */ - buf_add(buf, tmp, 509); - tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - buf_clear(buf); - - /* An incomplete versions cell is a variable-length cell that isn't ready - * yet. */ - buf_add(buf, - "\x01\x02\x03\x04" /* circid */ - "\x07" /* VERSIONS */ - "\x00\x04" /* 4 bytes long */ - "\x00" /* incomplete */, 8); - tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - tt_ptr_op(cell, OP_EQ, NULL); - /* Complete it, and it's a variable-length cell. Leave a byte on the end for - * fun. */ - buf_add(buf, "\x09\x00\x25\ff", 4); - tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 4)); - tt_ptr_op(cell, OP_NE, NULL); - tt_int_op(cell->command, OP_EQ, CELL_VERSIONS); - tt_uint_op(cell->circ_id, OP_EQ, 0x01020304); - tt_int_op(cell->payload_len, OP_EQ, 4); - test_mem_op_hex(cell->payload, OP_EQ, "00090025"); - var_cell_free(cell); - cell = NULL; - tt_int_op(buf_datalen(buf), OP_EQ, 1); - buf_clear(buf); - - /* In link protocol 3 and earlier, circid fields were two bytes long. Let's - * ensure that gets handled correctly. */ - buf_add(buf, - "\x23\x45\x81\x00\x06" /* command 81; 6 bytes long */ - "coraje", 11); - tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 3)); - tt_ptr_op(cell, OP_NE, NULL); - tt_int_op(cell->command, OP_EQ, 129); - tt_uint_op(cell->circ_id, OP_EQ, 0x2345); - tt_int_op(cell->payload_len, OP_EQ, 6); - tt_mem_op(cell->payload, OP_EQ, "coraje", 6); - var_cell_free(cell); - cell = NULL; - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* In link protocol 2, only VERSIONS cells counted as variable-length */ - buf_add(buf, - "\x23\x45\x81\x00\x06" - "coraje", 11); /* As above */ - tt_int_op(0, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); - buf_clear(buf); - buf_add(buf, - "\x23\x45\x07\x00\x06" - "futuro", 11); - tt_int_op(1, OP_EQ, fetch_var_cell_from_buf(buf, &cell, 2)); - tt_ptr_op(cell, OP_NE, NULL); - tt_int_op(cell->command, OP_EQ, 7); - tt_uint_op(cell->circ_id, OP_EQ, 0x2345); - tt_int_op(cell->payload_len, OP_EQ, 6); - tt_mem_op(cell->payload, OP_EQ, "futuro", 6); - var_cell_free(cell); - cell = NULL; - - done: - buf_free(buf); - var_cell_free(cell); - tor_free(mem_op_hex_tmp); -} - -static void -test_proto_control0(void *arg) -{ - (void)arg; - buf_t *buf = buf_new(); - - /* The only remaining function for the v0 control protocol is the function - that detects whether the user has stumbled across an old controller - that's using it. The format was: - u16 length; - u16 command; - u8 body[length]; - */ - - /* Empty buffer -- nothing to do. */ - tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); - /* 3 chars in buf -- can't tell */ - buf_add(buf, "AUT", 3); - tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); - /* command in buf -- easy to tell */ - buf_add(buf, "HENTICATE ", 10); - tt_int_op(0, OP_EQ, peek_buf_has_control0_command(buf)); - - /* Control0 command header in buf: make sure we detect it. */ - buf_clear(buf); - buf_add(buf, "\x09\x05" "\x00\x05" "blah", 8); - tt_int_op(1, OP_EQ, peek_buf_has_control0_command(buf)); - - done: - buf_free(buf); -} - -static void -test_proto_ext_or_cmd(void *arg) -{ - ext_or_cmd_t *cmd = NULL; - buf_t *buf = buf_new(); - char *tmp = NULL; - (void) arg; - - /* Empty -- should give "not there. */ - tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_EQ, cmd); - - /* Three bytes: shouldn't work. */ - buf_add(buf, "\x00\x20\x00", 3); - tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_EQ, cmd); - tt_int_op(3, OP_EQ, buf_datalen(buf)); - - /* 0020 0000: That's a nil command. It should work. */ - buf_add(buf, "\x00", 1); - tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_NE, cmd); - tt_int_op(0x20, OP_EQ, cmd->cmd); - tt_int_op(0, OP_EQ, cmd->len); - tt_int_op(0, OP_EQ, buf_datalen(buf)); - ext_or_cmd_free(cmd); - cmd = NULL; - - /* Now try a length-6 command with one byte missing. */ - buf_add(buf, "\x10\x21\x00\x06""abcde", 9); - tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_EQ, cmd); - buf_add(buf, "f", 1); - tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_NE, cmd); - tt_int_op(0x1021, OP_EQ, cmd->cmd); - tt_int_op(6, OP_EQ, cmd->len); - tt_mem_op("abcdef", OP_EQ, cmd->body, 6); - tt_int_op(0, OP_EQ, buf_datalen(buf)); - ext_or_cmd_free(cmd); - cmd = NULL; - - /* Now try a length-10 command with 4 extra bytes. */ - buf_add(buf, "\xff\xff\x00\x0aloremipsum\x10\x00\xff\xff", 18); - tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_NE, cmd); - tt_int_op(0xffff, OP_EQ, cmd->cmd); - tt_int_op(10, OP_EQ, cmd->len); - tt_mem_op("loremipsum", OP_EQ, cmd->body, 10); - tt_int_op(4, OP_EQ, buf_datalen(buf)); - ext_or_cmd_free(cmd); - cmd = NULL; - - /* Finally, let's try a maximum-length command. We already have the header - * waiting. */ - tt_int_op(0, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tmp = tor_malloc_zero(65535); - buf_add(buf, tmp, 65535); - tt_int_op(1, OP_EQ, fetch_ext_or_command_from_buf(buf, &cmd)); - tt_ptr_op(NULL, OP_NE, cmd); - tt_int_op(0x1000, OP_EQ, cmd->cmd); - tt_int_op(0xffff, OP_EQ, cmd->len); - tt_mem_op(tmp, OP_EQ, cmd->body, 65535); - tt_int_op(0, OP_EQ, buf_datalen(buf)); - ext_or_cmd_free(cmd); - cmd = NULL; - - done: - ext_or_cmd_free(cmd); - buf_free(buf); - tor_free(tmp); -} - -static void -test_proto_line(void *arg) -{ - (void)arg; - char tmp[60]; - buf_t *buf = buf_new(); -#define S(str) str, sizeof(str)-1 - const struct { - const char *input; - size_t input_len; - size_t line_len; - const char *output; - int returnval; - } cases[] = { - { S("Hello world"), 0, NULL, 0 }, - { S("Hello world\n"), 12, "Hello world\n", 1 }, - { S("Hello world\nMore"), 12, "Hello world\n", 1 }, - { S("\n oh hello world\nMore"), 1, "\n", 1 }, - { S("Hello worpd\n\nMore"), 12, "Hello worpd\n", 1 }, - { S("------------------------------------------------------------\n"), 0, - NULL, -1 }, - }; - unsigned i; - for (i = 0; i < ARRAY_LENGTH(cases); ++i) { - buf_add(buf, cases[i].input, cases[i].input_len); - memset(tmp, 0xfe, sizeof(tmp)); - size_t sz = sizeof(tmp); - int rv = buf_get_line(buf, tmp, &sz); - tt_int_op(rv, OP_EQ, cases[i].returnval); - if (rv == 1) { - tt_int_op(sz, OP_LT, sizeof(tmp)); - tt_mem_op(cases[i].output, OP_EQ, tmp, sz+1); - tt_int_op(buf_datalen(buf), OP_EQ, cases[i].input_len - strlen(tmp)); - tt_int_op(sz, OP_EQ, cases[i].line_len); - } else { - tt_int_op(buf_datalen(buf), OP_EQ, cases[i].input_len); - // tt_int_op(sz, OP_EQ, sizeof(tmp)); - } - buf_clear(buf); - } - - done: - buf_free(buf); -} - -struct testcase_t proto_misc_tests[] = { - { "var_cell", test_proto_var_cell, 0, NULL, NULL }, - { "control0", test_proto_control0, 0, NULL, NULL }, - { "ext_or_cmd", test_proto_ext_or_cmd, TT_FORK, NULL, NULL }, - { "line", test_proto_line, 0, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_protover.c b/src/tor/src/test/test_protover.c deleted file mode 100644 index 686536211..000000000 --- a/src/tor/src/test/test_protover.c +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define PROTOVER_PRIVATE - -#include "orconfig.h" -#include "test.h" - -#include "protover.h" - -static void -test_protover_parse(void *arg) -{ - (void) arg; -#ifdef HAVE_RUST - /** This test is disabled on rust builds, because it only exists to test - * internal C functions. */ - tt_skip(); - done: - ; -#else - char *re_encoded = NULL; - - const char *orig = "Foo=1,3 Bar=3 Baz= Quux=9-12,14,15-16,900"; - smartlist_t *elts = parse_protocol_list(orig); - - tt_assert(elts); - tt_int_op(smartlist_len(elts), OP_EQ, 4); - - const proto_entry_t *e; - const proto_range_t *r; - e = smartlist_get(elts, 0); - tt_str_op(e->name, OP_EQ, "Foo"); - tt_int_op(smartlist_len(e->ranges), OP_EQ, 2); - { - r = smartlist_get(e->ranges, 0); - tt_int_op(r->low, OP_EQ, 1); - tt_int_op(r->high, OP_EQ, 1); - - r = smartlist_get(e->ranges, 1); - tt_int_op(r->low, OP_EQ, 3); - tt_int_op(r->high, OP_EQ, 3); - } - - e = smartlist_get(elts, 1); - tt_str_op(e->name, OP_EQ, "Bar"); - tt_int_op(smartlist_len(e->ranges), OP_EQ, 1); - { - r = smartlist_get(e->ranges, 0); - tt_int_op(r->low, OP_EQ, 3); - tt_int_op(r->high, OP_EQ, 3); - } - - e = smartlist_get(elts, 2); - tt_str_op(e->name, OP_EQ, "Baz"); - tt_int_op(smartlist_len(e->ranges), OP_EQ, 0); - - e = smartlist_get(elts, 3); - tt_str_op(e->name, OP_EQ, "Quux"); - tt_int_op(smartlist_len(e->ranges), OP_EQ, 4); - { - r = smartlist_get(e->ranges, 0); - tt_int_op(r->low, OP_EQ, 9); - tt_int_op(r->high, OP_EQ, 12); - - r = smartlist_get(e->ranges, 1); - tt_int_op(r->low, OP_EQ, 14); - tt_int_op(r->high, OP_EQ, 14); - - r = smartlist_get(e->ranges, 2); - tt_int_op(r->low, OP_EQ, 15); - tt_int_op(r->high, OP_EQ, 16); - - r = smartlist_get(e->ranges, 3); - tt_int_op(r->low, OP_EQ, 900); - tt_int_op(r->high, OP_EQ, 900); - } - - re_encoded = encode_protocol_list(elts); - tt_assert(re_encoded); - tt_str_op(re_encoded, OP_EQ, orig); - - done: - if (elts) - SMARTLIST_FOREACH(elts, proto_entry_t *, ent, proto_entry_free(ent)); - smartlist_free(elts); - tor_free(re_encoded); -#endif -} - -static void -test_protover_parse_fail(void *arg) -{ - (void)arg; -#ifdef HAVE_RUST - /** This test is disabled on rust builds, because it only exists to test - * internal C functions. */ - tt_skip(); -#else - smartlist_t *elts; - - /* random junk */ - elts = parse_protocol_list("!!3@*"); - tt_ptr_op(elts, OP_EQ, NULL); - - /* Missing equals sign in an entry */ - elts = parse_protocol_list("Link=4 Haprauxymatyve Desc=9"); - tt_ptr_op(elts, OP_EQ, NULL); - - /* Missing word. */ - elts = parse_protocol_list("Link=4 =3 Desc=9"); - tt_ptr_op(elts, OP_EQ, NULL); - - /* Broken numbers */ - elts = parse_protocol_list("Link=fred"); - tt_ptr_op(elts, OP_EQ, NULL); - elts = parse_protocol_list("Link=1,fred"); - tt_ptr_op(elts, OP_EQ, NULL); - elts = parse_protocol_list("Link=1,fred,3"); - tt_ptr_op(elts, OP_EQ, NULL); - - /* Broken range */ - elts = parse_protocol_list("Link=1,9-8,3"); - tt_ptr_op(elts, OP_EQ, NULL); -#endif - done: - ; -} - -static void -test_protover_vote(void *arg) -{ - (void) arg; - - smartlist_t *lst = smartlist_new(); - char *result = protover_compute_vote(lst, 1); - - tt_str_op(result, OP_EQ, ""); - tor_free(result); - - smartlist_add(lst, (void*) "Foo=1-10,500 Bar=1,3-7,8"); - result = protover_compute_vote(lst, 1); - tt_str_op(result, OP_EQ, "Bar=1,3-8 Foo=1-10,500"); - tor_free(result); - - smartlist_add(lst, (void*) "Quux=123-456,78 Bar=2-6,8 Foo=9"); - result = protover_compute_vote(lst, 1); - tt_str_op(result, OP_EQ, "Bar=1-8 Foo=1-10,500 Quux=78,123-456"); - tor_free(result); - - result = protover_compute_vote(lst, 2); - tt_str_op(result, OP_EQ, "Bar=3-6,8 Foo=9"); - tor_free(result); - - done: - tor_free(result); - smartlist_free(lst); -} - -static void -test_protover_all_supported(void *arg) -{ - (void)arg; - char *msg = NULL; - - tt_assert(protover_all_supported(NULL, &msg)); - tt_ptr_op(msg, OP_EQ, NULL); - - tt_assert(protover_all_supported("", &msg)); - tt_ptr_op(msg, OP_EQ, NULL); - - // Some things that we do support - tt_assert(protover_all_supported("Link=3-4", &msg)); - tt_ptr_op(msg, OP_EQ, NULL); - tt_assert(protover_all_supported("Link=3-4 Desc=2", &msg)); - tt_ptr_op(msg, OP_EQ, NULL); - - // Some things we don't support - tt_assert(! protover_all_supported("Wombat=9", &msg)); - tt_str_op(msg, OP_EQ, "Wombat=9"); - tor_free(msg); - tt_assert(! protover_all_supported("Link=999", &msg)); - tt_str_op(msg, OP_EQ, "Link=999"); - tor_free(msg); - - // Mix of things we support and things we don't - tt_assert(! protover_all_supported("Link=3-4 Wombat=9", &msg)); - tt_str_op(msg, OP_EQ, "Wombat=9"); - tor_free(msg); - tt_assert(! protover_all_supported("Link=3-999", &msg)); - tt_str_op(msg, OP_EQ, "Link=3-999"); - tor_free(msg); - - done: - tor_free(msg); -} - -static void -test_protover_list_supports_protocol_returns_true(void *arg) -{ - (void)arg; - - const char *protocols = "Link=1"; - int is_supported = protocol_list_supports_protocol(protocols, PRT_LINK, 1); - tt_int_op(is_supported, OP_EQ, 1); - - done: - ; -} - -static void -test_protover_list_supports_protocol_for_unsupported_returns_false(void *arg) -{ - (void)arg; - - const char *protocols = "Link=1"; - int is_supported = protocol_list_supports_protocol(protocols, PRT_LINK, 10); - tt_int_op(is_supported, OP_EQ, 0); - - done: - ; -} - -static void -test_protover_supports_version(void *arg) -{ - (void)arg; - - tt_assert(protocol_list_supports_protocol("Link=3-6", PRT_LINK, 3)); - tt_assert(protocol_list_supports_protocol("Link=3-6", PRT_LINK, 6)); - tt_assert(!protocol_list_supports_protocol("Link=3-6", PRT_LINK, 7)); - tt_assert(!protocol_list_supports_protocol("Link=3-6", PRT_LINKAUTH, 3)); - - tt_assert(!protocol_list_supports_protocol("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 2)); - tt_assert(protocol_list_supports_protocol("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 3)); - tt_assert(!protocol_list_supports_protocol("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 4)); - tt_assert(!protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 4)); - tt_assert(protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 3)); - tt_assert(protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", - PRT_LINKAUTH, 2)); - - tt_assert(!protocol_list_supports_protocol_or_later("Link=4-6 LinkAuth=3", - PRT_DESC, 2)); - done: - ; -} - -#define PV_TEST(name, flags) \ - { #name, test_protover_ ##name, (flags), NULL, NULL } - -struct testcase_t protover_tests[] = { - PV_TEST(parse, 0), - PV_TEST(parse_fail, 0), - PV_TEST(vote, 0), - PV_TEST(all_supported, 0), - PV_TEST(list_supports_protocol_for_unsupported_returns_false, 0), - PV_TEST(list_supports_protocol_returns_true, 0), - PV_TEST(supports_version, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_pt.c b/src/tor/src/test/test_pt.c deleted file mode 100644 index 07b6712ff..000000000 --- a/src/tor/src/test/test_pt.c +++ /dev/null @@ -1,547 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define PT_PRIVATE -#define UTIL_PRIVATE -#define STATEFILE_PRIVATE -#define CONTROL_PRIVATE -#include "or.h" -#include "config.h" -#include "confparse.h" -#include "control.h" -#include "transports.h" -#include "circuitbuild.h" -#include "util.h" -#include "statefile.h" -#include "test.h" - -static void -reset_mp(managed_proxy_t *mp) -{ - mp->conf_state = PT_PROTO_LAUNCHED; - SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t)); - smartlist_clear(mp->transports); -} - -static void -test_pt_parsing(void *arg) -{ - char line[200]; - transport_t *transport = NULL; - tor_addr_t test_addr; - - managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t)); - (void)arg; - mp->conf_state = PT_PROTO_INFANT; - mp->transports = smartlist_new(); - - /* incomplete cmethod */ - strlcpy(line,"CMETHOD trebuchet",sizeof(line)); - tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); - - reset_mp(mp); - - /* wrong proxy type */ - strlcpy(line,"CMETHOD trebuchet dog 127.0.0.1:1999",sizeof(line)); - tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); - - reset_mp(mp); - - /* wrong addrport */ - strlcpy(line,"CMETHOD trebuchet socks4 abcd",sizeof(line)); - tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0); - - reset_mp(mp); - - /* correct line */ - strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); - tt_int_op(parse_cmethod_line(line, mp), OP_EQ, 0); - tt_int_op(smartlist_len(mp->transports), OP_EQ, 1); - transport = smartlist_get(mp->transports, 0); - /* test registered address of transport */ - tor_addr_parse(&test_addr, "127.0.0.1"); - tt_assert(tor_addr_eq(&test_addr, &transport->addr)); - /* test registered port of transport */ - tt_uint_op(transport->port, OP_EQ, 1999); - /* test registered SOCKS version of transport */ - tt_int_op(transport->socks_version, OP_EQ, PROXY_SOCKS5); - /* test registered name of transport */ - tt_str_op(transport->name,OP_EQ, "trebuchet"); - - reset_mp(mp); - - /* incomplete smethod */ - strlcpy(line,"SMETHOD trebuchet",sizeof(line)); - tt_int_op(parse_smethod_line(line, mp), OP_LT, 0); - - reset_mp(mp); - - /* wrong addr type */ - strlcpy(line,"SMETHOD trebuchet abcd",sizeof(line)); - tt_int_op(parse_smethod_line(line, mp), OP_LT, 0); - - reset_mp(mp); - - /* cowwect */ - strlcpy(line,"SMETHOD trebuchy 127.0.0.2:2999",sizeof(line)); - tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0); - tt_int_op(smartlist_len(mp->transports), OP_EQ, 1); - transport = smartlist_get(mp->transports, 0); - /* test registered address of transport */ - tor_addr_parse(&test_addr, "127.0.0.2"); - tt_assert(tor_addr_eq(&test_addr, &transport->addr)); - /* test registered port of transport */ - tt_uint_op(transport->port, OP_EQ, 2999); - /* test registered name of transport */ - tt_str_op(transport->name,OP_EQ, "trebuchy"); - - reset_mp(mp); - - /* Include some arguments. Good ones. */ - strlcpy(line,"SMETHOD trebuchet 127.0.0.1:9999 " - "ARGS:counterweight=3,sling=snappy", - sizeof(line)); - tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0); - tt_int_op(1, OP_EQ, smartlist_len(mp->transports)); - { - const transport_t *transport_ = smartlist_get(mp->transports, 0); - tt_assert(transport_); - tt_str_op(transport_->name, OP_EQ, "trebuchet"); - tt_int_op(transport_->port, OP_EQ, 9999); - tt_str_op(fmt_addr(&transport_->addr), OP_EQ, "127.0.0.1"); - tt_str_op(transport_->extra_info_args, OP_EQ, - "counterweight=3,sling=snappy"); - } - reset_mp(mp); - - /* unsupported version */ - strlcpy(line,"VERSION 666",sizeof(line)); - tt_int_op(parse_version(line, mp), OP_LT, 0); - - /* incomplete VERSION */ - strlcpy(line,"VERSION ",sizeof(line)); - tt_int_op(parse_version(line, mp), OP_LT, 0); - - /* correct VERSION */ - strlcpy(line,"VERSION 1",sizeof(line)); - tt_int_op(parse_version(line, mp), OP_EQ, 0); - - done: - reset_mp(mp); - smartlist_free(mp->transports); - tor_free(mp); -} - -static void -test_pt_get_transport_options(void *arg) -{ - char **execve_args; - smartlist_t *transport_list = smartlist_new(); - managed_proxy_t *mp; - or_options_t *options = get_options_mutable(); - char *opt_str = NULL; - config_line_t *cl = NULL; - (void)arg; - - execve_args = tor_malloc(sizeof(char*)*2); - execve_args[0] = tor_strdup("cheeseshop"); - execve_args[1] = NULL; - - mp = managed_proxy_create(transport_list, execve_args, 1); - tt_ptr_op(mp, OP_NE, NULL); - opt_str = get_transport_options_for_server_proxy(mp); - tt_ptr_op(opt_str, OP_EQ, NULL); - - smartlist_add_strdup(mp->transports_to_launch, "gruyere"); - smartlist_add_strdup(mp->transports_to_launch, "roquefort"); - smartlist_add_strdup(mp->transports_to_launch, "stnectaire"); - - tt_assert(options); - - cl = tor_malloc_zero(sizeof(config_line_t)); - cl->value = tor_strdup("gruyere melty=10 hardness=se;ven"); - options->ServerTransportOptions = cl; - - cl = tor_malloc_zero(sizeof(config_line_t)); - cl->value = tor_strdup("stnectaire melty=4 hardness=three"); - cl->next = options->ServerTransportOptions; - options->ServerTransportOptions = cl; - - cl = tor_malloc_zero(sizeof(config_line_t)); - cl->value = tor_strdup("pepperjack melty=12 hardness=five"); - cl->next = options->ServerTransportOptions; - options->ServerTransportOptions = cl; - - opt_str = get_transport_options_for_server_proxy(mp); - tt_str_op(opt_str, OP_EQ, - "gruyere:melty=10;gruyere:hardness=se\\;ven;" - "stnectaire:melty=4;stnectaire:hardness=three"); - - done: - tor_free(opt_str); - config_free_lines(cl); - managed_proxy_destroy(mp, 0); - smartlist_free(transport_list); -} - -static void -test_pt_protocol(void *arg) -{ - char line[200]; - - managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t)); - (void)arg; - mp->conf_state = PT_PROTO_LAUNCHED; - mp->transports = smartlist_new(); - mp->argv = tor_calloc(2, sizeof(char *)); - mp->argv[0] = tor_strdup(""); - - /* various wrong protocol runs: */ - - strlcpy(line,"VERSION 1",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); - - strlcpy(line,"VERSION 1",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_BROKEN); - - reset_mp(mp); - - strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_BROKEN); - - reset_mp(mp); - - /* correct protocol run: */ - strlcpy(line,"VERSION 1",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); - - strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); - - strlcpy(line,"CMETHODS DONE",sizeof(line)); - handle_proxy_line(line, mp); - tt_assert(mp->conf_state == PT_PROTO_CONFIGURED); - - done: - reset_mp(mp); - smartlist_free(mp->transports); - tor_free(mp->argv[0]); - tor_free(mp->argv); - tor_free(mp); -} - -static void -test_pt_get_extrainfo_string(void *arg) -{ - managed_proxy_t *mp1 = NULL, *mp2 = NULL; - char **argv1, **argv2; - smartlist_t *t1 = smartlist_new(), *t2 = smartlist_new(); - int r; - char *s = NULL; - (void) arg; - - argv1 = tor_malloc_zero(sizeof(char*)*3); - argv1[0] = tor_strdup("ewige"); - argv1[1] = tor_strdup("Blumenkraft"); - argv1[2] = NULL; - argv2 = tor_malloc_zero(sizeof(char*)*4); - argv2[0] = tor_strdup("und"); - argv2[1] = tor_strdup("ewige"); - argv2[2] = tor_strdup("Schlangenkraft"); - argv2[3] = NULL; - - mp1 = managed_proxy_create(t1, argv1, 1); - mp2 = managed_proxy_create(t2, argv2, 1); - - r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1); - tt_int_op(r, OP_EQ, 0); - r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy", - mp2); - tt_int_op(r, OP_EQ, 0); - - /* Force these proxies to look "completed" or they won't generate output. */ - mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED; - - s = pt_get_extra_info_descriptor_string(); - tt_assert(s); - tt_str_op(s, OP_EQ, - "transport hagbard 127.0.0.1:5555\n" - "transport celine 127.0.0.1:1723 card=no-enemy\n"); - - done: - /* XXXX clean up better */ - smartlist_free(t1); - smartlist_free(t2); - tor_free(s); -} - -#ifdef _WIN32 -#define STDIN_HANDLE HANDLE* -#else -#define STDIN_HANDLE int -#endif - -static smartlist_t * -tor_get_lines_from_handle_replacement(STDIN_HANDLE handle, - enum stream_status *stream_status_out) -{ - static int times_called = 0; - smartlist_t *retval_sl = smartlist_new(); - - (void) handle; - (void) stream_status_out; - - /* Generate some dummy CMETHOD lines the first 5 times. The 6th - time, send 'CMETHODS DONE' to finish configuring the proxy. */ - if (times_called++ != 5) { - smartlist_add_asprintf(retval_sl, "SMETHOD mock%d 127.0.0.1:555%d", - times_called, times_called); - } else { - smartlist_add_strdup(retval_sl, "SMETHODS DONE"); - } - - return retval_sl; -} - -/* NOP mock */ -static void -tor_process_handle_destroy_replacement(process_handle_t *process_handle, - int also_terminate_process) -{ - (void) process_handle; - (void) also_terminate_process; -} - -static or_state_t *dummy_state = NULL; - -static or_state_t * -get_or_state_replacement(void) -{ - return dummy_state; -} - -static int controlevent_n = 0; -static uint16_t controlevent_event = 0; -static smartlist_t *controlevent_msgs = NULL; - -static void -queue_control_event_string_replacement(uint16_t event, char *msg) -{ - ++controlevent_n; - controlevent_event = event; - if (!controlevent_msgs) - controlevent_msgs = smartlist_new(); - smartlist_add(controlevent_msgs, msg); -} - -/* Test the configure_proxy() function. */ -static void -test_pt_configure_proxy(void *arg) -{ - int i, retval; - managed_proxy_t *mp = NULL; - (void) arg; - - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - - MOCK(tor_get_lines_from_handle, - tor_get_lines_from_handle_replacement); - MOCK(tor_process_handle_destroy, - tor_process_handle_destroy_replacement); - MOCK(get_or_state, - get_or_state_replacement); - MOCK(queue_control_event_string, - queue_control_event_string_replacement); - - control_testing_set_global_event_mask(EVENT_TRANSPORT_LAUNCHED); - - mp = tor_malloc_zero(sizeof(managed_proxy_t)); - mp->conf_state = PT_PROTO_ACCEPTING_METHODS; - mp->transports = smartlist_new(); - mp->transports_to_launch = smartlist_new(); - mp->process_handle = tor_malloc_zero(sizeof(process_handle_t)); - mp->argv = tor_malloc_zero(sizeof(char*)*2); - mp->argv[0] = tor_strdup(""); - mp->is_server = 1; - - /* Test the return value of configure_proxy() by calling it some - times while it is uninitialized and then finally finalizing its - configuration. */ - for (i = 0 ; i < 5 ; i++) { - retval = configure_proxy(mp); - /* retval should be zero because proxy hasn't finished configuring yet */ - tt_int_op(retval, OP_EQ, 0); - /* check the number of registered transports */ - tt_assert(smartlist_len(mp->transports) == i+1); - /* check that the mp is still waiting for transports */ - tt_assert(mp->conf_state == PT_PROTO_ACCEPTING_METHODS); - } - - /* this last configure_proxy() should finalize the proxy configuration. */ - retval = configure_proxy(mp); - /* retval should be 1 since the proxy finished configuring */ - tt_int_op(retval, OP_EQ, 1); - /* check the mp state */ - tt_assert(mp->conf_state == PT_PROTO_COMPLETED); - - tt_int_op(controlevent_n, OP_EQ, 5); - tt_int_op(controlevent_event, OP_EQ, EVENT_TRANSPORT_LAUNCHED); - tt_int_op(smartlist_len(controlevent_msgs), OP_EQ, 5); - smartlist_sort_strings(controlevent_msgs); - tt_str_op(smartlist_get(controlevent_msgs, 0), OP_EQ, - "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 1), OP_EQ, - "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 2), OP_EQ, - "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 3), OP_EQ, - "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 4), OP_EQ, - "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n"); - - { /* check that the transport info were saved properly in the tor state */ - config_line_t *transport_in_state = NULL; - smartlist_t *transport_info_sl = smartlist_new(); - char *name_of_transport = NULL; - char *bindaddr = NULL; - - /* Get the bindaddr for "mock1" and check it against the bindaddr - that the mocked tor_get_lines_from_handle() generated. */ - transport_in_state = get_transport_in_state_by_name("mock1"); - tt_assert(transport_in_state); - smartlist_split_string(transport_info_sl, transport_in_state->value, - NULL, 0, 0); - name_of_transport = smartlist_get(transport_info_sl, 0); - bindaddr = smartlist_get(transport_info_sl, 1); - tt_str_op(name_of_transport, OP_EQ, "mock1"); - tt_str_op(bindaddr, OP_EQ, "127.0.0.1:5551"); - - SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp)); - smartlist_free(transport_info_sl); - } - - done: - or_state_free(dummy_state); - UNMOCK(tor_get_lines_from_handle); - UNMOCK(tor_process_handle_destroy); - UNMOCK(get_or_state); - UNMOCK(queue_control_event_string); - if (controlevent_msgs) { - SMARTLIST_FOREACH(controlevent_msgs, char *, cp, tor_free(cp)); - smartlist_free(controlevent_msgs); - controlevent_msgs = NULL; - } - if (mp->transports) { - SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t)); - smartlist_free(mp->transports); - } - smartlist_free(mp->transports_to_launch); - tor_free(mp->process_handle); - tor_free(mp->argv[0]); - tor_free(mp->argv); - tor_free(mp); -} - -/* Test the get_pt_proxy_uri() function. */ -static void -test_get_pt_proxy_uri(void *arg) -{ - or_options_t *options = get_options_mutable(); - char *uri = NULL; - int ret; - (void) arg; - - /* Test with no proxy. */ - uri = get_pt_proxy_uri(); - tt_ptr_op(uri, OP_EQ, NULL); - - /* Test with a SOCKS4 proxy. */ - options->Socks4Proxy = tor_strdup("192.0.2.1:1080"); - ret = tor_addr_port_lookup(options->Socks4Proxy, - &options->Socks4ProxyAddr, - &options->Socks4ProxyPort); - tt_int_op(ret, OP_EQ, 0); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "socks4a://192.0.2.1:1080"); - tor_free(uri); - tor_free(options->Socks4Proxy); - - /* Test with a SOCKS5 proxy, no username/password. */ - options->Socks5Proxy = tor_strdup("192.0.2.1:1080"); - ret = tor_addr_port_lookup(options->Socks5Proxy, - &options->Socks5ProxyAddr, - &options->Socks5ProxyPort); - tt_int_op(ret, OP_EQ, 0); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "socks5://192.0.2.1:1080"); - tor_free(uri); - - /* Test with a SOCKS5 proxy, with username/password. */ - options->Socks5ProxyUsername = tor_strdup("hwest"); - options->Socks5ProxyPassword = tor_strdup("r34n1m470r"); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "socks5://hwest:r34n1m470r@192.0.2.1:1080"); - tor_free(uri); - tor_free(options->Socks5Proxy); - tor_free(options->Socks5ProxyUsername); - tor_free(options->Socks5ProxyPassword); - - /* Test with a HTTPS proxy, no authenticator. */ - options->HTTPSProxy = tor_strdup("192.0.2.1:80"); - ret = tor_addr_port_lookup(options->HTTPSProxy, - &options->HTTPSProxyAddr, - &options->HTTPSProxyPort); - tt_int_op(ret, OP_EQ, 0); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "http://192.0.2.1:80"); - tor_free(uri); - - /* Test with a HTTPS proxy, with authenticator. */ - options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r"); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "http://hwest:r34n1m470r@192.0.2.1:80"); - tor_free(uri); - tor_free(options->HTTPSProxy); - tor_free(options->HTTPSProxyAuthenticator); - - /* Token nod to the fact that IPv6 exists. */ - options->Socks4Proxy = tor_strdup("[2001:db8::1]:1080"); - ret = tor_addr_port_lookup(options->Socks4Proxy, - &options->Socks4ProxyAddr, - &options->Socks4ProxyPort); - tt_int_op(ret, OP_EQ, 0); - uri = get_pt_proxy_uri(); - tt_str_op(uri, OP_EQ, "socks4a://[2001:db8::1]:1080"); - tor_free(uri); - tor_free(options->Socks4Proxy); - - done: - if (uri) - tor_free(uri); -} - -#define PT_LEGACY(name) \ - { #name, test_pt_ ## name , 0, NULL, NULL } - -struct testcase_t pt_tests[] = { - PT_LEGACY(parsing), - PT_LEGACY(protocol), - { "get_transport_options", test_pt_get_transport_options, TT_FORK, - NULL, NULL }, - { "get_extrainfo_string", test_pt_get_extrainfo_string, TT_FORK, - NULL, NULL }, - { "configure_proxy",test_pt_configure_proxy, TT_FORK, - NULL, NULL }, - { "get_pt_proxy_uri", test_get_pt_proxy_uri, TT_FORK, - NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_pubsub.c b/src/tor/src/test/test_pubsub.c deleted file mode 100644 index 2f047d9f2..000000000 --- a/src/tor/src/test/test_pubsub.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_pubsub.c - * \brief Unit tests for publish-subscribe abstraction. - **/ - -#include "or.h" -#include "test.h" -#include "pubsub.h" - -DECLARE_PUBSUB_STRUCT_TYPES(foobar) -DECLARE_PUBSUB_TOPIC(foobar) -DECLARE_NOTIFY_PUBSUB_TOPIC(static, foobar) -IMPLEMENT_PUBSUB_TOPIC(static, foobar) - -struct foobar_event_data_t { - unsigned u; - const char *s; -}; - -struct foobar_subscriber_data_t { - const char *name; - long l; -}; - -static int -foobar_sub1(foobar_event_data_t *ev, foobar_subscriber_data_t *mine) -{ - ev->u += 10; - mine->l += 100; - return 0; -} - -static int -foobar_sub2(foobar_event_data_t *ev, foobar_subscriber_data_t *mine) -{ - ev->u += 5; - mine->l += 50; - return 0; -} - -static void -test_pubsub_basic(void *arg) -{ - (void)arg; - foobar_subscriber_data_t subdata1 = { "hi", 0 }; - foobar_subscriber_data_t subdata2 = { "wow", 0 }; - const foobar_subscriber_t *sub1; - const foobar_subscriber_t *sub2; - foobar_event_data_t ed = { 0, "x" }; - foobar_event_data_t ed2 = { 0, "y" }; - sub1 = foobar_subscribe(foobar_sub1, &subdata1, SUBSCRIBE_ATSTART, 100); - tt_assert(sub1); - - foobar_notify(&ed, 0); - tt_int_op(subdata1.l, OP_EQ, 100); - tt_int_op(subdata2.l, OP_EQ, 0); - tt_int_op(ed.u, OP_EQ, 10); - - sub2 = foobar_subscribe(foobar_sub2, &subdata2, 0, 5); - tt_assert(sub2); - - foobar_notify(&ed2, 0); - tt_int_op(subdata1.l, OP_EQ, 200); - tt_int_op(subdata2.l, OP_EQ, 50); - tt_int_op(ed2.u, OP_EQ, 15); - - foobar_unsubscribe(sub1); - - foobar_notify(&ed, 0); - tt_int_op(subdata1.l, OP_EQ, 200); - tt_int_op(subdata2.l, OP_EQ, 100); - tt_int_op(ed.u, OP_EQ, 15); - - done: - foobar_clear(); -} - -struct testcase_t pubsub_tests[] = { - { "pubsub_basic", test_pubsub_basic, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_relay.c b/src/tor/src/test/test_relay.c deleted file mode 100644 index 73c0ed558..000000000 --- a/src/tor/src/test/test_relay.c +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#define CIRCUITBUILD_PRIVATE -#include "circuitbuild.h" -#define RELAY_PRIVATE -#include "relay.h" -/* For init/free stuff */ -#include "scheduler.h" - -/* Test suite stuff */ -#include "test.h" -#include "fakechans.h" - -static or_circuit_t * new_fake_orcirc(channel_t *nchan, channel_t *pchan); - -static void test_relay_append_cell_to_circuit_queue(void *arg); - -static or_circuit_t * -new_fake_orcirc(channel_t *nchan, channel_t *pchan) -{ - or_circuit_t *orcirc = NULL; - circuit_t *circ = NULL; - - orcirc = tor_malloc_zero(sizeof(*orcirc)); - circ = &(orcirc->base_); - circ->magic = OR_CIRCUIT_MAGIC; - - circ->n_chan = nchan; - circ->n_circ_id = get_unique_circ_id_by_chan(nchan); - circ->n_mux = NULL; /* ?? */ - cell_queue_init(&(circ->n_chan_cells)); - circ->n_hop = NULL; - circ->streams_blocked_on_n_chan = 0; - circ->streams_blocked_on_p_chan = 0; - circ->n_delete_pending = 0; - circ->p_delete_pending = 0; - circ->received_destroy = 0; - circ->state = CIRCUIT_STATE_OPEN; - circ->purpose = CIRCUIT_PURPOSE_OR; - circ->package_window = CIRCWINDOW_START_MAX; - circ->deliver_window = CIRCWINDOW_START_MAX; - circ->n_chan_create_cell = NULL; - - orcirc->p_chan = pchan; - orcirc->p_circ_id = get_unique_circ_id_by_chan(pchan); - cell_queue_init(&(orcirc->p_chan_cells)); - - return orcirc; -} - -static void -test_relay_append_cell_to_circuit_queue(void *arg) -{ - channel_t *nchan = NULL, *pchan = NULL; - or_circuit_t *orcirc = NULL; - cell_t *cell = NULL; - int old_count, new_count; - - (void)arg; - - /* Make fake channels to be nchan and pchan for the circuit */ - nchan = new_fake_channel(); - tt_assert(nchan); - - pchan = new_fake_channel(); - tt_assert(pchan); - - /* Make a fake orcirc */ - orcirc = new_fake_orcirc(nchan, pchan); - tt_assert(orcirc); - circuitmux_attach_circuit(nchan->cmux, TO_CIRCUIT(orcirc), - CELL_DIRECTION_OUT); - circuitmux_attach_circuit(pchan->cmux, TO_CIRCUIT(orcirc), - CELL_DIRECTION_IN); - - /* Make a cell */ - cell = tor_malloc_zero(sizeof(cell_t)); - make_fake_cell(cell); - - MOCK(scheduler_channel_has_waiting_cells, - scheduler_channel_has_waiting_cells_mock); - - /* Append it */ - old_count = get_mock_scheduler_has_waiting_cells_count(); - append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), nchan, cell, - CELL_DIRECTION_OUT, 0); - new_count = get_mock_scheduler_has_waiting_cells_count(); - tt_int_op(new_count, OP_EQ, old_count + 1); - - /* Now try the reverse direction */ - old_count = get_mock_scheduler_has_waiting_cells_count(); - append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), pchan, cell, - CELL_DIRECTION_IN, 0); - new_count = get_mock_scheduler_has_waiting_cells_count(); - tt_int_op(new_count, OP_EQ, old_count + 1); - - UNMOCK(scheduler_channel_has_waiting_cells); - - /* Get rid of the fake channels */ - MOCK(scheduler_release_channel, scheduler_release_channel_mock); - channel_mark_for_close(nchan); - channel_mark_for_close(pchan); - UNMOCK(scheduler_release_channel); - - /* Shut down channels */ - channel_free_all(); - - done: - tor_free(cell); - if (orcirc) { - circuitmux_detach_circuit(nchan->cmux, TO_CIRCUIT(orcirc)); - circuitmux_detach_circuit(pchan->cmux, TO_CIRCUIT(orcirc)); - cell_queue_clear(&orcirc->base_.n_chan_cells); - cell_queue_clear(&orcirc->p_chan_cells); - } - tor_free(orcirc); - free_fake_channel(nchan); - free_fake_channel(pchan); - - return; -} - -struct testcase_t relay_tests[] = { - { "append_cell_to_circuit_queue", test_relay_append_cell_to_circuit_queue, - TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_relaycell.c b/src/tor/src/test/test_relaycell.c deleted file mode 100644 index eea1f5dc8..000000000 --- a/src/tor/src/test/test_relaycell.c +++ /dev/null @@ -1,249 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Unit tests for handling different kinds of relay cell */ - -#define RELAY_PRIVATE -#include "or.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "relay.h" -#include "test.h" - -static int srm_ncalls; -static entry_connection_t *srm_conn; -static int srm_atype; -static size_t srm_alen; -static int srm_answer_is_set; -static uint8_t srm_answer[512]; -static int srm_ttl; -static time_t srm_expires; - -/* Mock replacement for connection_ap_hannshake_socks_resolved() */ -static void -socks_resolved_mock(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const uint8_t *answer, - int ttl, - time_t expires) -{ - srm_ncalls++; - srm_conn = conn; - srm_atype = answer_type; - srm_alen = answer_len; - if (answer) { - memset(srm_answer, 0, sizeof(srm_answer)); - memcpy(srm_answer, answer, answer_len < 512 ? answer_len : 512); - srm_answer_is_set = 1; - } else { - srm_answer_is_set = 0; - } - srm_ttl = ttl; - srm_expires = expires; -} - -static int mum_ncalls; -static entry_connection_t *mum_conn; -static int mum_endreason; - -/* Mock replacement for connection_mark_unattached_ap_() */ -static void -mark_unattached_mock(entry_connection_t *conn, int endreason, - int line, const char *file) -{ - ++mum_ncalls; - mum_conn = conn; - mum_endreason = endreason; - (void) line; - (void) file; -} - -/* Tests for connection_edge_process_resolved_cell(). - - The point of ..process_resolved_cell() is to handle an incoming cell - on an entry connection, and call connection_mark_unattached_ap() and/or - connection_ap_handshake_socks_resolved(). - */ -static void -test_relaycell_resolved(void *arg) -{ - entry_connection_t *entryconn; - edge_connection_t *edgeconn; - cell_t cell; - relay_header_t rh; - int r; - or_options_t *options = get_options_mutable(); - -#define SET_CELL(s) do { \ - memset(&cell, 0, sizeof(cell)); \ - memset(&rh, 0, sizeof(rh)); \ - memcpy(cell.payload + RELAY_HEADER_SIZE, (s), sizeof((s))-1); \ - rh.length = sizeof((s))-1; \ - rh.command = RELAY_COMMAND_RESOLVED; \ - } while (0) -#define MOCK_RESET() do { \ - srm_ncalls = mum_ncalls = 0; \ - } while (0) -#define ASSERT_MARK_CALLED(reason) do { \ - tt_int_op(mum_ncalls, OP_EQ, 1); \ - tt_ptr_op(mum_conn, OP_EQ, entryconn); \ - tt_int_op(mum_endreason, OP_EQ, (reason)); \ - } while (0) -#define ASSERT_RESOLVED_CALLED(atype, answer, ttl, expires) do { \ - tt_int_op(srm_ncalls, OP_EQ, 1); \ - tt_ptr_op(srm_conn, OP_EQ, entryconn); \ - tt_int_op(srm_atype, OP_EQ, (atype)); \ - if ((answer) != NULL) { \ - tt_int_op(srm_alen, OP_EQ, sizeof(answer)-1); \ - tt_int_op(srm_alen, OP_LT, 512); \ - tt_int_op(srm_answer_is_set, OP_EQ, 1); \ - tt_mem_op(srm_answer, OP_EQ, answer, sizeof(answer)-1); \ - } else { \ - tt_int_op(srm_answer_is_set, OP_EQ, 0); \ - } \ - tt_int_op(srm_ttl, OP_EQ, ttl); \ - tt_i64_op(srm_expires, OP_EQ, expires); \ - } while (0) - - (void)arg; - - MOCK(connection_mark_unattached_ap_, mark_unattached_mock); - MOCK(connection_ap_handshake_socks_resolved, socks_resolved_mock); - - options->ClientDNSRejectInternalAddresses = 0; - - SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */ - "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00" - /* IPv4: 18.0.0.1, ttl 512 */ - "\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00" - /* IPv6: 2003::3, ttl 1024 */ - "\x06\x10" - "\x20\x02\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x03" - "\x00\x00\x04\x00"); - - entryconn = entry_connection_new(CONN_TYPE_AP, AF_INET); - edgeconn = ENTRY_TO_EDGE_CONN(entryconn); - - /* Try with connection in non-RESOLVE_WAIT state: cell gets ignored */ - MOCK_RESET(); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - tt_int_op(srm_ncalls, OP_EQ, 0); - tt_int_op(mum_ncalls, OP_EQ, 0); - - /* Now put it in the right state. */ - ENTRY_TO_CONN(entryconn)->state = AP_CONN_STATE_RESOLVE_WAIT; - entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; - entryconn->entry_cfg.ipv4_traffic = 1; - entryconn->entry_cfg.ipv6_traffic = 1; - entryconn->entry_cfg.prefer_ipv6 = 0; - - /* We prefer ipv4, so we should get the first ipv4 answer */ - MOCK_RESET(); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x7f\x00\x01\x02", 256, -1); - - /* But we may be discarding private answers. */ - MOCK_RESET(); - options->ClientDNSRejectInternalAddresses = 1; - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); - - /* now prefer ipv6, and get the first ipv6 answer */ - entryconn->entry_cfg.prefer_ipv6 = 1; - MOCK_RESET(); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV6, - "\x20\x02\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x03", - 1024, -1); - - /* With a cell that only has IPv4, we report IPv4 even if we prefer IPv6 */ - MOCK_RESET(); - SET_CELL("\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00"); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); - - /* But if we don't allow IPv4, we report nothing if the cell contains only - * ipv4 */ - MOCK_RESET(); - entryconn->entry_cfg.ipv4_traffic = 0; - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); - - /* If we wanted hostnames, we report nothing, since we only had IPs. */ - MOCK_RESET(); - entryconn->entry_cfg.ipv4_traffic = 1; - entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); - - /* A hostname cell is fine though. */ - MOCK_RESET(); - SET_CELL("\x00\x0fwww.example.com\x00\x01\x00\x00"); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_HOSTNAME, "www.example.com", 65536, -1); - - /* error on malformed cell */ - MOCK_RESET(); - entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; - SET_CELL("\x04\x04\x01\x02\x03\x04"); /* no ttl */ - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); - tt_int_op(srm_ncalls, OP_EQ, 0); - - /* error on all addresses private */ - MOCK_RESET(); - SET_CELL(/* IPv4: 127.0.1.2, ttl 256 */ - "\x04\x04\x7f\x00\x01\x02\x00\x00\x01\x00" - /* IPv4: 192.168.1.1, ttl 256 */ - "\x04\x04\xc0\xa8\x01\x01\x00\x00\x01\x00"); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, 0, TIME_MAX); - - /* Legit error code */ - MOCK_RESET(); - SET_CELL("\xf0\x15" "quiet and meaningless" "\x00\x00\x0f\xff"); - r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, OP_EQ, 0); - ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, -1, -1); - - done: - UNMOCK(connection_mark_unattached_ap_); - UNMOCK(connection_ap_handshake_socks_resolved); -} - -struct testcase_t relaycell_tests[] = { - { "resolved", test_relaycell_resolved, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_rendcache.c b/src/tor/src/test/test_rendcache.c deleted file mode 100644 index 9f6cfc4a2..000000000 --- a/src/tor/src/test/test_rendcache.c +++ /dev/null @@ -1,1242 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" - -#include "test.h" -#define RENDCACHE_PRIVATE -#include "rendcache.h" -#include "router.h" -#include "routerlist.h" -#include "config.h" -#include "hs_common.h" -#include "rend_test_helpers.h" -#include "log_test_helpers.h" - -#define NS_MODULE rend_cache - -static const int RECENT_TIME = -10; -static const int TIME_IN_THE_PAST = -(REND_CACHE_MAX_AGE + \ - REND_CACHE_MAX_SKEW + 60); -static const int TIME_IN_THE_FUTURE = REND_CACHE_MAX_SKEW + 60; - -static void -test_rend_cache_lookup_entry(void *data) -{ - int ret; - rend_data_t *mock_rend_query = NULL; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - rend_cache_entry_t *entry = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder = NULL; - char *service_id = NULL; - (void)data; - - rend_cache_init(); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - - ret = rend_cache_lookup_entry("abababababababab", 0, NULL); - tt_int_op(ret, OP_EQ, -ENOENT); - - ret = rend_cache_lookup_entry("invalid query", 2, NULL); - tt_int_op(ret, OP_EQ, -EINVAL); - - ret = rend_cache_lookup_entry("abababababababab", 2, NULL); - tt_int_op(ret, OP_EQ, -ENOENT); - - ret = rend_cache_lookup_entry("abababababababab", 4224, NULL); - tt_int_op(ret, OP_EQ, -ENOENT); - - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, - mock_rend_query, NULL); - - ret = rend_cache_lookup_entry(service_id, 2, NULL); - tt_int_op(ret, OP_EQ, 0); - - ret = rend_cache_lookup_entry(service_id, 2, &entry); - tt_int_op(ret, OP_EQ, 0); - tt_assert(entry); - tt_int_op(entry->len, OP_EQ, strlen(desc_holder->desc_str)); - tt_str_op(entry->desc, OP_EQ, desc_holder->desc_str); - - done: - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_cache_free_all(); - rend_data_free(mock_rend_query); -} - -static void -test_rend_cache_store_v2_desc_as_client(void *data) -{ - int ret; - rend_data_t *mock_rend_query; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - rend_cache_entry_t *entry = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder = NULL; - char *service_id = NULL; - char client_cookie[REND_DESC_COOKIE_LEN]; - (void)data; - - rend_cache_init(); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - - // Test success - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - &entry); - - tt_int_op(ret, OP_EQ, 0); - tt_assert(entry); - tt_int_op(entry->len, OP_EQ, strlen(desc_holder->desc_str)); - tt_str_op(entry->desc, OP_EQ, desc_holder->desc_str); - - // Test various failure modes - - // TODO: a too long desc_id_base32 argument crashes the function - /* ret = rend_cache_store_v2_desc_as_client( */ - /* desc_holder->desc_str, */ - /* "3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG", */ - /* &mock_rend_query, NULL); */ - /* tt_int_op(ret, OP_EQ, -1); */ - - // Test bad base32 failure - // This causes an assertion failure if we're running with assertions. - // But when building without asserts, we can test it. -#ifdef DISABLE_ASSERTS_IN_UNIT_TESTS - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - "!xqunszqnaolrrfmtzgaki7mxelgvkj", mock_rend_query, NULL); - tt_int_op(ret, OP_EQ, -1); -#endif - - // Test invalid descriptor - ret = rend_cache_store_v2_desc_as_client("invalid descriptor", - "3xqunszqnaolrrfmtzgaki7mxelgvkje", mock_rend_query, NULL); - tt_int_op(ret, OP_EQ, -1); - - // TODO: it doesn't seem to be possible to test invalid service ID condition. - // that means it is likely not possible to have that condition without - // earlier conditions failing first (such as signature checking of the desc) - - rend_cache_free_all(); - - // Test mismatch between service ID and onion address - rend_cache_init(); - strncpy(TO_REND_DATA_V2(mock_rend_query)->onion_address, "abc", - REND_SERVICE_ID_LEN_BASE32+1); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, - mock_rend_query, NULL); - tt_int_op(ret, OP_EQ, -1); - rend_cache_free_all(); - rend_data_free(mock_rend_query); - - // Test incorrect descriptor ID - rend_cache_init(); - mock_rend_query = mock_rend_data(service_id); - char orig = desc_id_base32[0]; - if (desc_id_base32[0] == 'a') - desc_id_base32[0] = 'b'; - else - desc_id_base32[0] = 'a'; - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, -1); - desc_id_base32[0] = orig; - rend_cache_free_all(); - - // Test too old descriptor - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3); - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, - mock_rend_query, NULL); - tt_int_op(ret, OP_EQ, -1); - rend_cache_free_all(); - - // Test too new descriptor (in the future) - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, -1); - rend_cache_free_all(); - - // Test when a descriptor is already in the cache - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - - rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, - mock_rend_query, NULL); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, 0); - - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - &entry); - tt_int_op(ret, OP_EQ, 0); - tt_assert(entry); - rend_cache_free_all(); - - // Test unsuccessful decrypting of introduction points - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - mock_rend_query = mock_rend_data(service_id); - TO_REND_DATA_V2(mock_rend_query)->auth_type = REND_BASIC_AUTH; - client_cookie[0] = 'A'; - memcpy(TO_REND_DATA_V2(mock_rend_query)->descriptor_cookie, client_cookie, - REND_DESC_COOKIE_LEN); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, 0); - rend_cache_free_all(); - - // Test successful run when we have REND_BASIC_AUTH but not cookie - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - mock_rend_query = mock_rend_data(service_id); - TO_REND_DATA_V2(mock_rend_query)->auth_type = REND_BASIC_AUTH; - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, 0); - - rend_cache_free_all(); - - // Test when we have no introduction points - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, 0); - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, -1); - rend_cache_free_all(); - - // Test when we have too many intro points - rend_cache_init(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_data_free(mock_rend_query); - - generate_desc(RECENT_TIME, &desc_holder, &service_id, MAX_INTRO_POINTS+1); - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, -1); - - done: - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_cache_free_all(); - rend_data_free(mock_rend_query); -} - -static void -test_rend_cache_store_v2_desc_as_client_with_different_time(void *data) -{ - int ret; - rend_data_t *mock_rend_query; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - rend_service_descriptor_t *generated = NULL; - smartlist_t *descs = smartlist_new(); - time_t t; - char *service_id = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder_newer; - rend_encoded_v2_service_descriptor_t *desc_holder_older; - - t = time(NULL); - rend_cache_init(); - - create_descriptor(&generated, &service_id, 3); - - generated->timestamp = t + RECENT_TIME; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - descs = smartlist_new(); - - generated->timestamp = (t + RECENT_TIME) - 20; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_older = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - (void)data; - - // Test when a descriptor is already in the cache and it is newer than the - // one we submit - mock_rend_query = mock_rend_data(service_id); - base32_encode(desc_id_base32, sizeof(desc_id_base32), - desc_holder_newer->desc_id, DIGEST_LEN); - rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, - desc_id_base32, mock_rend_query, NULL); - ret = rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, 0); - - rend_cache_free_all(); - - // Test when an old descriptor is in the cache and we submit a newer one - rend_cache_init(); - rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, - desc_id_base32, mock_rend_query, NULL); - ret = rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, - desc_id_base32, mock_rend_query, - NULL); - tt_int_op(ret, OP_EQ, 0); - - done: - rend_encoded_v2_service_descriptor_free(desc_holder_newer); - rend_encoded_v2_service_descriptor_free(desc_holder_older); - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - rend_service_descriptor_free(generated); - tor_free(service_id); - rend_cache_free_all(); - rend_data_free(mock_rend_query); -} - -#define NS_SUBMODULE lookup_v2_desc_as_dir -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); - -static routerinfo_t *mock_routerinfo; - -static const routerinfo_t * -NS(router_get_my_routerinfo)(void) -{ - if (!mock_routerinfo) { - mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); - } - - return mock_routerinfo; -} - -static void -test_rend_cache_lookup_v2_desc_as_dir(void *data) -{ - int ret; - char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - rend_encoded_v2_service_descriptor_t *desc_holder = NULL; - char *service_id = NULL; - const char *ret_desc = NULL; - - (void)data; - - NS_MOCK(router_get_my_routerinfo); - - rend_cache_init(); - - // Test invalid base32 - ret = rend_cache_lookup_v2_desc_as_dir("!bababababababab", NULL); - tt_int_op(ret, OP_EQ, -1); - - // Test non-existent descriptor but well formed - ret = rend_cache_lookup_v2_desc_as_dir("3xqunszqnaolrrfmtzgaki7mxelgvkje", - NULL); - tt_int_op(ret, OP_EQ, 0); - - // Test existing descriptor - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); - base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, - DIGEST_LEN); - ret = rend_cache_lookup_v2_desc_as_dir(desc_id_base32, &ret_desc); - tt_int_op(ret, OP_EQ, 1); - tt_assert(ret_desc); - - done: - NS_UNMOCK(router_get_my_routerinfo); - tor_free(mock_routerinfo); - rend_cache_free_all(); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); -} - -#undef NS_SUBMODULE - -#define NS_SUBMODULE store_v2_desc_as_dir -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); - -static const routerinfo_t * -NS(router_get_my_routerinfo)(void) -{ - return mock_routerinfo; -} - -static void -test_rend_cache_store_v2_desc_as_dir(void *data) -{ - (void)data; - int ret; - rend_encoded_v2_service_descriptor_t *desc_holder = NULL; - char *service_id = NULL; - - NS_MOCK(router_get_my_routerinfo); - - rend_cache_init(); - - // Test when we can't parse the descriptor - mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); - ret = rend_cache_store_v2_desc_as_dir("unparseable"); - tt_int_op(ret, OP_EQ, -1); - - // Test when we have an old descriptor - generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3); - ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); - tt_int_op(ret, OP_EQ, 0); - - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - - // Test when we have a descriptor in the future - generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); - ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); - tt_int_op(ret, OP_EQ, 0); - - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - - // Test when two descriptors - generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); - ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); - tt_int_op(ret, OP_EQ, 0); - - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - - // Test when asking for hidden service statistics HiddenServiceStatistics - rend_cache_purge(); - generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); - get_options_mutable()->HiddenServiceStatistics = 1; - ret = rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); - tt_int_op(ret, OP_EQ, 0); - - done: - NS_UNMOCK(router_get_my_routerinfo); - rend_encoded_v2_service_descriptor_free(desc_holder); - tor_free(service_id); - rend_cache_free_all(); - tor_free(mock_routerinfo); -} - -static void -test_rend_cache_store_v2_desc_as_dir_with_different_time(void *data) -{ - (void)data; - - int ret; - rend_service_descriptor_t *generated = NULL; - smartlist_t *descs = smartlist_new(); - time_t t; - char *service_id = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder_newer; - rend_encoded_v2_service_descriptor_t *desc_holder_older; - - NS_MOCK(router_get_my_routerinfo); - - rend_cache_init(); - - t = time(NULL); - - create_descriptor(&generated, &service_id, 3); - generated->timestamp = t + RECENT_TIME; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - descs = smartlist_new(); - - generated->timestamp = (t + RECENT_TIME) - 20; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_older = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - - // Test when we have a newer descriptor stored - mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); - rend_cache_store_v2_desc_as_dir(desc_holder_newer->desc_str); - ret = rend_cache_store_v2_desc_as_dir(desc_holder_older->desc_str); - tt_int_op(ret, OP_EQ, 0); - - // Test when we have an old descriptor stored - rend_cache_purge(); - rend_cache_store_v2_desc_as_dir(desc_holder_older->desc_str); - ret = rend_cache_store_v2_desc_as_dir(desc_holder_newer->desc_str); - tt_int_op(ret, OP_EQ, 0); - - done: - NS_UNMOCK(router_get_my_routerinfo); - rend_cache_free_all(); - rend_service_descriptor_free(generated); - tor_free(service_id); - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - rend_encoded_v2_service_descriptor_free(desc_holder_newer); - rend_encoded_v2_service_descriptor_free(desc_holder_older); - tor_free(mock_routerinfo); -} - -static void -test_rend_cache_store_v2_desc_as_dir_with_different_content(void *data) -{ - (void)data; - - int ret; - rend_service_descriptor_t *generated = NULL; - smartlist_t *descs = smartlist_new(); - time_t t; - char *service_id = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder_one = NULL; - rend_encoded_v2_service_descriptor_t *desc_holder_two = NULL; - - NS_MOCK(router_get_my_routerinfo); - - rend_cache_init(); - - t = time(NULL); - - create_descriptor(&generated, &service_id, 3); - generated->timestamp = t + RECENT_TIME; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_one = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - descs = smartlist_new(); - - generated->timestamp = t + RECENT_TIME; - generated->protocols = 41; - rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, - REND_NO_AUTH, NULL, NULL); - desc_holder_two = ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0)); - smartlist_set(descs, 0, NULL); - - // Test when we have another descriptor stored, with a different descriptor - mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); - rend_cache_store_v2_desc_as_dir(desc_holder_one->desc_str); - ret = rend_cache_store_v2_desc_as_dir(desc_holder_two->desc_str); - tt_int_op(ret, OP_EQ, 0); - - done: - NS_UNMOCK(router_get_my_routerinfo); - rend_cache_free_all(); - rend_service_descriptor_free(generated); - tor_free(service_id); - SMARTLIST_FOREACH(descs, rend_encoded_v2_service_descriptor_t *, d, - rend_encoded_v2_service_descriptor_free(d)); - smartlist_free(descs); - rend_encoded_v2_service_descriptor_free(desc_holder_one); - rend_encoded_v2_service_descriptor_free(desc_holder_two); -} - -#undef NS_SUBMODULE - -static void -test_rend_cache_init(void *data) -{ - (void)data; - - tt_assert_msg(!rend_cache, "rend_cache should be NULL when starting"); - tt_assert_msg(!rend_cache_v2_dir, "rend_cache_v2_dir should be NULL " - "when starting"); - tt_assert_msg(!rend_cache_failure, "rend_cache_failure should be NULL when " - "starting"); - - rend_cache_init(); - - tt_assert_msg(rend_cache, "rend_cache should not be NULL after initing"); - tt_assert_msg(rend_cache_v2_dir, "rend_cache_v2_dir should not be NULL " - "after initing"); - tt_assert_msg(rend_cache_failure, "rend_cache_failure should not be NULL " - "after initing"); - - tt_int_op(strmap_size(rend_cache), OP_EQ, 0); - tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_decrement_allocation(void *data) -{ - (void)data; - - // Test when the cache has enough allocations - rend_cache_total_allocation = 10; - rend_cache_decrement_allocation(3); - tt_int_op(rend_cache_total_allocation, OP_EQ, 7); - - // Test when there are not enough allocations - rend_cache_total_allocation = 1; - setup_full_capture_of_logs(LOG_WARN); - rend_cache_decrement_allocation(2); - tt_int_op(rend_cache_total_allocation, OP_EQ, 0); - expect_single_log_msg_containing( - "Underflow in rend_cache_decrement_allocation"); - teardown_capture_of_logs(); - - // And again - rend_cache_decrement_allocation(2); - tt_int_op(rend_cache_total_allocation, OP_EQ, 0); - - done: - teardown_capture_of_logs(); -} - -static void -test_rend_cache_increment_allocation(void *data) -{ - (void)data; - - // Test when the cache is not overflowing - rend_cache_total_allocation = 5; - rend_cache_increment_allocation(3); - tt_int_op(rend_cache_total_allocation, OP_EQ, 8); - - // Test when there are too many allocations - rend_cache_total_allocation = SIZE_MAX-1; - setup_full_capture_of_logs(LOG_WARN); - rend_cache_increment_allocation(2); - tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); - expect_single_log_msg_containing( - "Overflow in rend_cache_increment_allocation"); - teardown_capture_of_logs(); - - // And again - rend_cache_increment_allocation(2); - tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); - - done: - teardown_capture_of_logs(); -} - -static void -test_rend_cache_failure_intro_entry_new(void *data) -{ - time_t now; - rend_cache_failure_intro_t *entry; - rend_intro_point_failure_t failure; - - (void)data; - - failure = INTRO_POINT_FAILURE_TIMEOUT; - now = time(NULL); - entry = rend_cache_failure_intro_entry_new(failure); - - tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT); - tt_int_op(entry->created_ts, OP_GE, now-5); - tt_int_op(entry->created_ts, OP_LE, now+5); - - done: - tor_free(entry); -} - -static void -test_rend_cache_failure_intro_lookup(void *data) -{ - (void)data; - int ret; - rend_cache_failure_t *failure; - rend_cache_failure_intro_t *ip; - rend_cache_failure_intro_t *entry; - const char key_ip_one[DIGEST_LEN] = "ip1"; - const char key_ip_two[DIGEST_LEN] = "ip2"; - const char key_foo[DIGEST_LEN] = "foo1"; - - rend_cache_init(); - - failure = rend_cache_failure_entry_new(); - ip = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - digestmap_set(failure->intro_failures, key_ip_one, ip); - strmap_set_lc(rend_cache_failure, "foo1", failure); - - // Test not found - ret = cache_failure_intro_lookup((const uint8_t *) key_foo, "foo2", NULL); - tt_int_op(ret, OP_EQ, 0); - - // Test found with no intro failures in it - ret = cache_failure_intro_lookup((const uint8_t *) key_ip_two, "foo1", NULL); - tt_int_op(ret, OP_EQ, 0); - - // Test found - ret = cache_failure_intro_lookup((const uint8_t *) key_ip_one, "foo1", NULL); - tt_int_op(ret, OP_EQ, 1); - - // Test found and asking for entry - cache_failure_intro_lookup((const uint8_t *) key_ip_one, "foo1", &entry); - tt_assert(entry); - tt_assert(entry == ip); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_clean(void *data) -{ - rend_cache_entry_t *one, *two; - rend_service_descriptor_t *desc_one, *desc_two; - strmap_iter_t *iter = NULL; - const char *key; - void *val; - - (void)data; - - rend_cache_init(); - - // Test with empty rendcache - rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); - tt_int_op(strmap_size(rend_cache), OP_EQ, 0); - - // Test with two old entries - one = tor_malloc_zero(sizeof(rend_cache_entry_t)); - two = tor_malloc_zero(sizeof(rend_cache_entry_t)); - desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - desc_two = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - one->parsed = desc_one; - two->parsed = desc_two; - - desc_one->timestamp = time(NULL) + TIME_IN_THE_PAST; - desc_two->timestamp = (time(NULL) + TIME_IN_THE_PAST) - 10; - desc_one->pk = pk_generate(0); - desc_two->pk = pk_generate(1); - - strmap_set_lc(rend_cache, "foo1", one); - strmap_set_lc(rend_cache, "foo2", two); - - rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); - tt_int_op(strmap_size(rend_cache), OP_EQ, 0); - - // Test with one old entry and one newer entry - one = tor_malloc_zero(sizeof(rend_cache_entry_t)); - two = tor_malloc_zero(sizeof(rend_cache_entry_t)); - desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - desc_two = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - one->parsed = desc_one; - two->parsed = desc_two; - - desc_one->timestamp = (time(NULL) + TIME_IN_THE_PAST) - 10; - desc_two->timestamp = time(NULL) - 100; - desc_one->pk = pk_generate(0); - desc_two->pk = pk_generate(1); - - strmap_set_lc(rend_cache, "foo1", one); - strmap_set_lc(rend_cache, "foo2", two); - - rend_cache_clean(time(NULL), REND_CACHE_TYPE_CLIENT); - tt_int_op(strmap_size(rend_cache), OP_EQ, 1); - - iter = strmap_iter_init(rend_cache); - strmap_iter_get(iter, &key, &val); - tt_str_op(key, OP_EQ, "foo2"); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_failure_entry_new(void *data) -{ - rend_cache_failure_t *failure; - - (void)data; - - failure = rend_cache_failure_entry_new(); - tt_assert(failure); - tt_int_op(digestmap_size(failure->intro_failures), OP_EQ, 0); - - done: - rend_cache_failure_entry_free(failure); -} - -static void -test_rend_cache_failure_entry_free(void *data) -{ - (void)data; - - // Test that it can deal with a NULL argument - rend_cache_failure_entry_free_(NULL); - - /* done: */ - /* (void)0; */ -} - -static void -test_rend_cache_failure_clean(void *data) -{ - rend_cache_failure_t *failure; - rend_cache_failure_intro_t *ip_one, *ip_two; - - const char key_one[DIGEST_LEN] = "ip1"; - const char key_two[DIGEST_LEN] = "ip2"; - - (void)data; - - rend_cache_init(); - - // Test with empty failure cache - rend_cache_failure_clean(time(NULL)); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); - - // Test with one empty failure entry - failure = rend_cache_failure_entry_new(); - strmap_set_lc(rend_cache_failure, "foo1", failure); - rend_cache_failure_clean(time(NULL)); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); - - // Test with one new intro point - failure = rend_cache_failure_entry_new(); - ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - digestmap_set(failure->intro_failures, key_one, ip_one); - strmap_set_lc(rend_cache_failure, "foo1", failure); - rend_cache_failure_clean(time(NULL)); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 1); - - // Test with one old intro point - rend_cache_failure_purge(); - failure = rend_cache_failure_entry_new(); - ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - ip_one->created_ts = time(NULL) - 7*60; - digestmap_set(failure->intro_failures, key_one, ip_one); - strmap_set_lc(rend_cache_failure, "foo1", failure); - rend_cache_failure_clean(time(NULL)); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); - - // Test with one old intro point and one new one - rend_cache_failure_purge(); - failure = rend_cache_failure_entry_new(); - ip_one = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - ip_one->created_ts = time(NULL) - 7*60; - digestmap_set(failure->intro_failures, key_one, ip_one); - ip_two = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - ip_two->created_ts = time(NULL) - 2*60; - digestmap_set(failure->intro_failures, key_two, ip_two); - strmap_set_lc(rend_cache_failure, "foo1", failure); - rend_cache_failure_clean(time(NULL)); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 1); - tt_int_op(digestmap_size(failure->intro_failures), OP_EQ, 1); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_failure_remove(void *data) -{ - rend_service_descriptor_t *desc; - (void)data; - - rend_cache_init(); - - // Test that it deals well with a NULL desc - rend_cache_failure_remove(NULL); - - // Test a descriptor that isn't in the cache - desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - desc->pk = pk_generate(0); - rend_cache_failure_remove(desc); - - // There seems to not exist any way of getting rend_cache_failure_remove() - // to fail because of a problem with rend_get_service_id from here - rend_cache_free_all(); - - rend_service_descriptor_free(desc); - /* done: */ - /* (void)0; */ -} - -static void -test_rend_cache_free_all(void *data) -{ - rend_cache_failure_t *failure; - rend_cache_entry_t *one; - rend_service_descriptor_t *desc_one; - - (void)data; - - rend_cache_init(); - - failure = rend_cache_failure_entry_new(); - strmap_set_lc(rend_cache_failure, "foo1", failure); - - one = tor_malloc_zero(sizeof(rend_cache_entry_t)); - desc_one = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - one->parsed = desc_one; - desc_one->timestamp = time(NULL) + TIME_IN_THE_PAST; - desc_one->pk = pk_generate(0); - strmap_set_lc(rend_cache, "foo1", one); - - rend_cache_free_all(); - - tt_ptr_op(rend_cache, OP_EQ, NULL); - tt_ptr_op(rend_cache_v2_dir, OP_EQ, NULL); - tt_ptr_op(rend_cache_failure, OP_EQ, NULL); - tt_assert(!rend_cache_total_allocation); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_entry_free(void *data) -{ - (void)data; - rend_cache_entry_t *e; - - // Handles NULL correctly - rend_cache_entry_free_(NULL); - - // Handles NULL descriptor correctly - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - rend_cache_entry_free(e); - - // Handles non-NULL descriptor correctly - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - e->desc = tor_malloc(10); - rend_cache_entry_free(e); - - /* done: */ - /* (void)0; */ -} - -static void -test_rend_cache_purge(void *data) -{ - (void)data; - - // Deals with a NULL rend_cache - rend_cache_purge(); - tt_assert(rend_cache); - tt_assert(strmap_size(rend_cache) == 0); - - // Deals with existing rend_cache - rend_cache_free_all(); - rend_cache_init(); - tt_assert(rend_cache); - tt_assert(strmap_size(rend_cache) == 0); - - rend_cache_purge(); - tt_assert(rend_cache); - tt_assert(strmap_size(rend_cache) == 0); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_failure_intro_add(void *data) -{ - (void)data; - rend_cache_failure_t *fail_entry; - rend_cache_failure_intro_t *entry; - const char identity[DIGEST_LEN] = "foo1"; - - rend_cache_init(); - - // Adds non-existing entry - cache_failure_intro_add((const uint8_t *) identity, "foo2", - INTRO_POINT_FAILURE_TIMEOUT); - fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); - tt_assert(fail_entry); - tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); - entry = digestmap_get(fail_entry->intro_failures, identity); - tt_assert(entry); - - // Adds existing entry - cache_failure_intro_add((const uint8_t *) identity, "foo2", - INTRO_POINT_FAILURE_TIMEOUT); - fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); - tt_assert(fail_entry); - tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); - entry = digestmap_get(fail_entry->intro_failures, identity); - tt_assert(entry); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_intro_failure_note(void *data) -{ - (void)data; - rend_cache_failure_t *fail_entry; - rend_cache_failure_intro_t *entry; - const char key[DIGEST_LEN] = "foo1"; - - rend_cache_init(); - - // Test not found - rend_cache_intro_failure_note(INTRO_POINT_FAILURE_TIMEOUT, - (const uint8_t *) key, "foo2"); - fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); - tt_assert(fail_entry); - tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); - entry = digestmap_get(fail_entry->intro_failures, key); - tt_assert(entry); - tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT); - - // Test found - rend_cache_intro_failure_note(INTRO_POINT_FAILURE_UNREACHABLE, - (const uint8_t *) key, "foo2"); - tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_UNREACHABLE); - - done: - rend_cache_free_all(); -} - -#define NS_SUBMODULE clean_v2_descs_as_dir - -static void -test_rend_cache_clean_v2_descs_as_dir(void *data) -{ - rend_cache_entry_t *e; - time_t now, cutoff; - rend_service_descriptor_t *desc; - now = time(NULL); - cutoff = now - (REND_CACHE_MAX_AGE + REND_CACHE_MAX_SKEW); - const char key[DIGEST_LEN] = "abcde"; - - (void)data; - - rend_cache_init(); - - // Test running with an empty cache - rend_cache_clean_v2_descs_as_dir(cutoff); - tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); - - // Test with only one new entry - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - e->last_served = now; - desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); - desc->timestamp = now; - desc->pk = pk_generate(0); - e->parsed = desc; - digestmap_set(rend_cache_v2_dir, key, e); - - /* Set the cutoff to minus 10 seconds. */ - rend_cache_clean_v2_descs_as_dir(cutoff - 10); - tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 1); - - // Test with one old entry - desc->timestamp = cutoff - 1000; - rend_cache_clean_v2_descs_as_dir(cutoff); - tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); - - done: - rend_cache_free_all(); -} - -#undef NS_SUBMODULE - -static void -test_rend_cache_entry_allocation(void *data) -{ - (void)data; - - size_t ret; - rend_cache_entry_t *e = NULL; - - // Handles a null argument - ret = rend_cache_entry_allocation(NULL); - tt_int_op(ret, OP_EQ, 0); - - // Handles a non-null argument - e = tor_malloc_zero(sizeof(rend_cache_entry_t)); - ret = rend_cache_entry_allocation(e); - tt_int_op(ret, OP_GT, sizeof(rend_cache_entry_t)); - - done: - tor_free(e); -} - -static void -test_rend_cache_failure_intro_entry_free(void *data) -{ - (void)data; - rend_cache_failure_intro_t *entry; - - // Handles a null argument - rend_cache_failure_intro_entry_free_(NULL); - - // Handles a non-null argument - entry = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - rend_cache_failure_intro_entry_free(entry); -} - -static void -test_rend_cache_failure_purge(void *data) -{ - (void)data; - - // Handles a null failure cache - strmap_free(rend_cache_failure, rend_cache_failure_entry_free_void); - rend_cache_failure = NULL; - - rend_cache_failure_purge(); - - tt_ptr_op(rend_cache_failure, OP_NE, NULL); - tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); - - done: - rend_cache_free_all(); -} - -static void -test_rend_cache_validate_intro_point_failure(void *data) -{ - (void)data; - rend_service_descriptor_t *desc = NULL; - char *service_id = NULL; - rend_intro_point_t *intro = NULL; - const char *identity = NULL; - rend_cache_failure_t *failure; - rend_cache_failure_intro_t *ip; - - rend_cache_init(); - - create_descriptor(&desc, &service_id, 3); - desc->timestamp = time(NULL) + RECENT_TIME; - - intro = (rend_intro_point_t *)smartlist_get(desc->intro_nodes, 0); - identity = intro->extend_info->identity_digest; - - failure = rend_cache_failure_entry_new(); - ip = rend_cache_failure_intro_entry_new(INTRO_POINT_FAILURE_TIMEOUT); - digestmap_set(failure->intro_failures, identity, ip); - strmap_set_lc(rend_cache_failure, service_id, failure); - - // Test when we have an intro point in our cache - validate_intro_point_failure(desc, service_id); - tt_int_op(smartlist_len(desc->intro_nodes), OP_EQ, 2); - - done: - rend_cache_free_all(); - rend_service_descriptor_free(desc); - tor_free(service_id); -} - -struct testcase_t rend_cache_tests[] = { - { "init", test_rend_cache_init, 0, NULL, NULL }, - { "decrement_allocation", test_rend_cache_decrement_allocation, 0, - NULL, NULL }, - { "increment_allocation", test_rend_cache_increment_allocation, 0, - NULL, NULL }, - { "clean", test_rend_cache_clean, TT_FORK, NULL, NULL }, - { "clean_v2_descs_as_dir", test_rend_cache_clean_v2_descs_as_dir, 0, - NULL, NULL }, - { "entry_allocation", test_rend_cache_entry_allocation, 0, NULL, NULL }, - { "entry_free", test_rend_cache_entry_free, 0, NULL, NULL }, - { "failure_intro_entry_free", test_rend_cache_failure_intro_entry_free, 0, - NULL, NULL }, - { "free_all", test_rend_cache_free_all, 0, NULL, NULL }, - { "purge", test_rend_cache_purge, 0, NULL, NULL }, - { "failure_clean", test_rend_cache_failure_clean, 0, NULL, NULL }, - { "failure_entry_new", test_rend_cache_failure_entry_new, 0, NULL, NULL }, - { "failure_entry_free", test_rend_cache_failure_entry_free, 0, NULL, NULL }, - { "failure_intro_add", test_rend_cache_failure_intro_add, 0, NULL, NULL }, - { "failure_intro_entry_new", test_rend_cache_failure_intro_entry_new, 0, - NULL, NULL }, - { "failure_intro_lookup", test_rend_cache_failure_intro_lookup, 0, - NULL, NULL }, - { "failure_purge", test_rend_cache_failure_purge, 0, NULL, NULL }, - { "failure_remove", test_rend_cache_failure_remove, 0, NULL, NULL }, - { "intro_failure_note", test_rend_cache_intro_failure_note, 0, NULL, NULL }, - { "lookup", test_rend_cache_lookup_entry, 0, NULL, NULL }, - { "lookup_v2_desc_as_dir", test_rend_cache_lookup_v2_desc_as_dir, 0, - NULL, NULL }, - { "store_v2_desc_as_client", test_rend_cache_store_v2_desc_as_client, 0, - NULL, NULL }, - { "store_v2_desc_as_client_with_different_time", - test_rend_cache_store_v2_desc_as_client_with_different_time, 0, - NULL, NULL }, - { "store_v2_desc_as_dir", test_rend_cache_store_v2_desc_as_dir, 0, - NULL, NULL }, - { "store_v2_desc_as_dir_with_different_time", - test_rend_cache_store_v2_desc_as_dir_with_different_time, 0, NULL, NULL }, - { "store_v2_desc_as_dir_with_different_content", - test_rend_cache_store_v2_desc_as_dir_with_different_content, 0, - NULL, NULL }, - { "validate_intro_point_failure", - test_rend_cache_validate_intro_point_failure, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_replay.c b/src/tor/src/test/test_replay.c deleted file mode 100644 index d8dcc7370..000000000 --- a/src/tor/src/test/test_replay.c +++ /dev/null @@ -1,391 +0,0 @@ -/* Copyright (c) 2012-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define REPLAYCACHE_PRIVATE - -#include "orconfig.h" -#include "or.h" -#include "replaycache.h" -#include "test.h" - -static const char *test_buffer = - "Lorem ipsum dolor sit amet, consectetur adipisici elit, sed do eiusmod" - " tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim" - " veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea" - " commodo consequat. Duis aute irure dolor in reprehenderit in voluptate" - " velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint" - " occaecat cupidatat non proident, sunt in culpa qui officia deserunt" - " mollit anim id est laborum."; - -static const char *test_buffer_2 = - "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis" - " praesentium voluptatum deleniti atque corrupti quos dolores et quas" - " molestias excepturi sint occaecati cupiditate non provident, similique" - " sunt in culpa qui officia deserunt mollitia animi, id est laborum et" - " dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio." - " Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil" - " impedit quo minus id quod maxime placeat facere possimus, omnis voluptas" - " assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut" - " officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates" - " repudiandae sint et molestiae non recusandae. Itaque earum rerum hic" - " tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias" - " consequatur aut perferendis doloribus asperiores repellat."; - -static void -test_replaycache_alloc(void *arg) -{ - replaycache_t *r = NULL; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_badalloc(void *arg) -{ - replaycache_t *r = NULL; - - /* Negative horizon should fail */ - (void)arg; - r = replaycache_new(-600, 300); - tt_ptr_op(r, OP_EQ, NULL); - /* Negative interval should get adjusted to zero */ - r = replaycache_new(600, -300); - tt_ptr_op(r, OP_NE, NULL); - tt_int_op(r->scrub_interval,OP_EQ, 0); - replaycache_free(r); - /* Negative horizon and negative interval should still fail */ - r = replaycache_new(-600, -300); - tt_ptr_op(r, OP_EQ, NULL); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_free_null(void *arg) -{ - (void)arg; - replaycache_free_(NULL); - /* Assert that we're here without horrible death */ - tt_assert(1); - - done: - return; -} - -static void -test_replaycache_miss(void *arg) -{ - replaycache_t *r = NULL; - int result; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - result = - replaycache_add_and_test_internal(1200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - /* make sure a different buffer misses as well */ - result = - replaycache_add_and_test_internal(1200, NULL, test_buffer_2, - strlen(test_buffer_2), NULL); - tt_int_op(result,OP_EQ, 0); - - /* poke the bad-parameter error case too */ - result = - replaycache_add_and_test_internal(1200, NULL, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_hit(void *arg) -{ - replaycache_t *r = NULL; - int result; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - result = - replaycache_add_and_test_internal(1200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(1300, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 1); - - /* make sure a different buffer misses then hits as well */ - - result = - replaycache_add_and_test_internal(1200, r, test_buffer_2, - strlen(test_buffer_2), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(1300, r, test_buffer_2, - strlen(test_buffer_2), NULL); - tt_int_op(result,OP_EQ, 1); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_age(void *arg) -{ - replaycache_t *r = NULL; - int result; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - result = - replaycache_add_and_test_internal(1200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(1300, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 1); - - result = - replaycache_add_and_test_internal(3000, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_elapsed(void *arg) -{ - replaycache_t *r = NULL; - int result; - time_t elapsed; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - result = - replaycache_add_and_test_internal(1200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(1300, r, test_buffer, - strlen(test_buffer), &elapsed); - tt_int_op(result,OP_EQ, 1); - tt_int_op(elapsed,OP_EQ, 100); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_noexpire(void *arg) -{ - replaycache_t *r = NULL; - int result; - - (void)arg; - r = replaycache_new(0, 0); - tt_ptr_op(r, OP_NE, NULL); - - result = - replaycache_add_and_test_internal(1200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(1300, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 1); - - result = - replaycache_add_and_test_internal(3000, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 1); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_scrub(void *arg) -{ - replaycache_t *r = NULL; - int result; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - /* Set up like in test_replaycache_hit() */ - result = - replaycache_add_and_test_internal(100, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(200, r, test_buffer, - strlen(test_buffer), NULL); - tt_int_op(result,OP_EQ, 1); - - /* - * Poke a few replaycache_scrub_if_needed_internal() error cases that - * can't happen through replaycache_add_and_test_internal() - */ - - /* Null cache */ - replaycache_scrub_if_needed_internal(300, NULL); - /* Assert we're still here */ - tt_assert(1); - - /* Make sure we hit the aging-out case too */ - replaycache_scrub_if_needed_internal(1500, r); - /* Assert that we aged it */ - tt_int_op(digest256map_size(r->digests_seen),OP_EQ, 0); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_future(void *arg) -{ - replaycache_t *r = NULL; - int result; - time_t elapsed = 0; - - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - /* Set up like in test_replaycache_hit() */ - result = - replaycache_add_and_test_internal(100, r, test_buffer, - strlen(test_buffer), &elapsed); - tt_int_op(result,OP_EQ, 0); - /* elapsed should still be 0, since it wasn't written */ - tt_int_op(elapsed,OP_EQ, 0); - - result = - replaycache_add_and_test_internal(200, r, test_buffer, - strlen(test_buffer), &elapsed); - tt_int_op(result,OP_EQ, 1); - /* elapsed should be the time since the last hit */ - tt_int_op(elapsed,OP_EQ, 100); - - /* - * Now let's turn the clock back to get coverage on the cache entry from the - * future not-supposed-to-happen case. - */ - result = - replaycache_add_and_test_internal(150, r, test_buffer, - strlen(test_buffer), &elapsed); - /* We should still get a hit */ - tt_int_op(result,OP_EQ, 1); - /* ...but it shouldn't let us see a negative elapsed time */ - tt_int_op(elapsed,OP_EQ, 0); - - done: - if (r) replaycache_free(r); - - return; -} - -static void -test_replaycache_realtime(void *arg) -{ - replaycache_t *r = NULL; - /* - * Negative so we fail if replaycache_add_test_and_elapsed() doesn't - * write to elapsed. - */ - time_t elapsed = -1; - int result; - - /* Test the realtime as well as *_internal() entry points */ - (void)arg; - r = replaycache_new(600, 300); - tt_ptr_op(r, OP_NE, NULL); - - /* This should miss */ - result = - replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); - tt_int_op(result,OP_EQ, 0); - - /* This should hit */ - result = - replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); - tt_int_op(result,OP_EQ, 1); - - /* This should hit and return a small elapsed time */ - result = - replaycache_add_test_and_elapsed(r, test_buffer, - strlen(test_buffer), &elapsed); - tt_int_op(result,OP_EQ, 1); - tt_assert(elapsed >= 0); - tt_assert(elapsed <= 5); - - /* Scrub it to exercise that entry point too */ - replaycache_scrub_if_needed(r); - - done: - if (r) replaycache_free(r); - return; -} - -#define REPLAYCACHE_LEGACY(name) \ - { #name, test_replaycache_ ## name , 0, NULL, NULL } - -struct testcase_t replaycache_tests[] = { - REPLAYCACHE_LEGACY(alloc), - REPLAYCACHE_LEGACY(badalloc), - REPLAYCACHE_LEGACY(free_null), - REPLAYCACHE_LEGACY(miss), - REPLAYCACHE_LEGACY(hit), - REPLAYCACHE_LEGACY(age), - REPLAYCACHE_LEGACY(elapsed), - REPLAYCACHE_LEGACY(noexpire), - REPLAYCACHE_LEGACY(scrub), - REPLAYCACHE_LEGACY(future), - REPLAYCACHE_LEGACY(realtime), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_router.c b/src/tor/src/test/test_router.c deleted file mode 100644 index 4e96e2453..000000000 --- a/src/tor/src/test/test_router.c +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* Copyright (c) 2017, isis agora lovecruft */ -/* See LICENSE for licensing information */ - -/** - * \file test_router.c - * \brief Unittests for code in src/or/router.c - **/ - -#include "or.h" -#include "config.h" -#include "crypto_curve25519.h" -#include "crypto_ed25519.h" -#include "router.h" -#include "routerlist.h" - -/* Test suite stuff */ -#include "test.h" - -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); - -static routerinfo_t* mock_routerinfo; - -static const routerinfo_t* -NS(router_get_my_routerinfo)(void) -{ - crypto_pk_t* ident_key; - crypto_pk_t* tap_key; - time_t now; - - if (!mock_routerinfo) { - /* Mock the published timestamp, otherwise router_dump_router_to_string() - * will poop its pants. */ - time(&now); - - /* We'll need keys, or router_dump_router_to_string() would return NULL. */ - ident_key = pk_generate(0); - tap_key = pk_generate(0); - - tor_assert(ident_key != NULL); - tor_assert(tap_key != NULL); - - mock_routerinfo = tor_malloc_zero(sizeof(routerinfo_t)); - mock_routerinfo->nickname = tor_strdup("ConlonNancarrow"); - mock_routerinfo->addr = 123456789; - mock_routerinfo->or_port = 443; - mock_routerinfo->platform = tor_strdup("unittest"); - mock_routerinfo->cache_info.published_on = now; - mock_routerinfo->identity_pkey = crypto_pk_dup_key(ident_key); - mock_routerinfo->onion_pkey = crypto_pk_dup_key(tap_key); - mock_routerinfo->bandwidthrate = 9001; - mock_routerinfo->bandwidthburst = 9002; - } - - return mock_routerinfo; -} - -/* If no distribution option was set, then check_bridge_distribution_setting() - * should have set it to "any". */ -static void -test_router_dump_router_to_string_no_bridge_distribution_method(void *arg) -{ - const char* needle = "bridge-distribution-request any"; - or_options_t* options = get_options_mutable(); - routerinfo_t* router = NULL; - curve25519_keypair_t ntor_keypair; - ed25519_keypair_t signing_keypair; - char* desc = NULL; - char* found = NULL; - (void)arg; - - NS_MOCK(router_get_my_routerinfo); - - options->ORPort_set = 1; - options->BridgeRelay = 1; - - /* Generate keys which router_dump_router_to_string() expects to exist. */ - tt_int_op(0, ==, curve25519_keypair_generate(&ntor_keypair, 0)); - tt_int_op(0, ==, ed25519_keypair_generate(&signing_keypair, 0)); - - /* Set up part of our routerinfo_t so that we don't trigger any other - * assertions in router_dump_router_to_string(). */ - router = (routerinfo_t*)router_get_my_routerinfo(); - tt_ptr_op(router, !=, NULL); - - router->onion_curve25519_pkey = &ntor_keypair.pubkey; - - /* Generate our server descriptor and ensure that the substring - * "bridge-distribution-request any" occurs somewhere within it. */ - desc = router_dump_router_to_string(router, - router->identity_pkey, - router->onion_pkey, - &ntor_keypair, - &signing_keypair); - tt_ptr_op(desc, !=, NULL); - found = strstr(desc, needle); - tt_ptr_op(found, !=, NULL); - - done: - NS_UNMOCK(router_get_my_routerinfo); - - tor_free(desc); -} - -#define ROUTER_TEST(name, flags) \ - { #name, test_router_ ## name, flags, NULL, NULL } - -struct testcase_t router_tests[] = { - ROUTER_TEST(dump_router_to_string_no_bridge_distribution_method, TT_FORK), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_routerkeys.c b/src/tor/src/test/test_routerkeys.c deleted file mode 100644 index e4abcdb92..000000000 --- a/src/tor/src/test/test_routerkeys.c +++ /dev/null @@ -1,698 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define ROUTER_PRIVATE -#include "or.h" -#include "config.h" -#include "router.h" -#include "routerkeys.h" -#include "util.h" -#include "crypto.h" -#include "torcert.h" -#include "test.h" - -#ifdef _WIN32 -/* For mkdir() */ -#include -#endif - -static void -test_routerkeys_write_fingerprint(void *arg) -{ - crypto_pk_t *key = pk_generate(2); - or_options_t *options = get_options_mutable(); - const char *ddir = get_fname("write_fingerprint"); - char *cp = NULL, *cp2 = NULL; - char fp[FINGERPRINT_LEN+1]; - - (void)arg; - - tt_assert(key); - - options->ORPort_set = 1; /* So that we can get the server ID key */ - tor_free(options->DataDirectory); - options->DataDirectory = tor_strdup(ddir); - options->Nickname = tor_strdup("haflinger"); - set_server_identity_key(key); - set_client_identity_key(crypto_pk_dup_key(key)); - - tt_int_op(0, OP_EQ, check_private_dir(ddir, CPD_CREATE, NULL)); - tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),OP_EQ,0); - - /* Write fingerprint file */ - tt_int_op(0, OP_EQ, router_write_fingerprint(0)); - cp = read_file_to_str(get_fname("write_fingerprint/fingerprint"), - 0, NULL); - crypto_pk_get_fingerprint(key, fp, 0); - tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, OP_EQ, cp2); - tor_free(cp); - tor_free(cp2); - - /* Write hashed-fingerprint file */ - tt_int_op(0, OP_EQ, router_write_fingerprint(1)); - cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), - 0, NULL); - crypto_pk_get_hashed_fingerprint(key, fp); - tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, OP_EQ, cp2); - tor_free(cp); - tor_free(cp2); - - /* Replace outdated file */ - write_str_to_file(get_fname("write_fingerprint/hashed-fingerprint"), - "junk goes here", 0); - tt_int_op(0, OP_EQ, router_write_fingerprint(1)); - cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), - 0, NULL); - crypto_pk_get_hashed_fingerprint(key, fp); - tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, OP_EQ, cp2); - tor_free(cp); - tor_free(cp2); - - done: - crypto_pk_free(key); - set_client_identity_key(NULL); - tor_free(cp); - tor_free(cp2); -} - -static void -test_routerkeys_ed_certs(void *args) -{ - (void)args; - ed25519_keypair_t kp1, kp2; - tor_cert_t *cert[2] = {NULL, NULL}, *nocert = NULL; - tor_cert_t *parsed_cert[2] = {NULL, NULL}; - time_t now = 1412094534; - uint8_t *junk = NULL; - char *base64 = NULL; - - tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp1, 0)); - tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp2, 0)); - - for (int i = 0; i <= 1; ++i) { - uint32_t flags = i ? CERT_FLAG_INCLUDE_SIGNING_KEY : 0; - - cert[i] = tor_cert_create(&kp1, 5, &kp2.pubkey, now, 10000, flags); - tt_assert(cert[i]); - - tt_uint_op(cert[i]->sig_bad, OP_EQ, 0); - tt_uint_op(cert[i]->sig_ok, OP_EQ, 1); - tt_uint_op(cert[i]->cert_expired, OP_EQ, 0); - tt_uint_op(cert[i]->cert_valid, OP_EQ, 1); - tt_int_op(cert[i]->cert_type, OP_EQ, 5); - tt_mem_op(cert[i]->signed_key.pubkey, OP_EQ, &kp2.pubkey.pubkey, 32); - tt_mem_op(cert[i]->signing_key.pubkey, OP_EQ, &kp1.pubkey.pubkey, 32); - tt_int_op(cert[i]->signing_key_included, OP_EQ, i); - - tt_assert(cert[i]->encoded); - tt_int_op(cert[i]->encoded_len, OP_EQ, 104 + 36 * i); - tt_int_op(cert[i]->encoded[0], OP_EQ, 1); - tt_int_op(cert[i]->encoded[1], OP_EQ, 5); - - parsed_cert[i] = tor_cert_parse(cert[i]->encoded, cert[i]->encoded_len); - tt_assert(parsed_cert[i]); - tt_int_op(cert[i]->encoded_len, OP_EQ, parsed_cert[i]->encoded_len); - tt_mem_op(cert[i]->encoded, OP_EQ, parsed_cert[i]->encoded, - cert[i]->encoded_len); - tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); - tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 0); - tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0); - tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 0); - - /* Expired */ - tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now + 30000), - OP_LT, 0); - tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 1); - parsed_cert[i]->cert_expired = 0; - - /* Wrong key */ - tt_int_op(tor_cert_checksig(parsed_cert[i], &kp2.pubkey, now), OP_LT, 0); - tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 1); - parsed_cert[i]->sig_bad = 0; - - /* Missing key */ - int ok = tor_cert_checksig(parsed_cert[i], NULL, now); - tt_int_op(ok < 0, OP_EQ, i == 0); - tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); - tt_assert(parsed_cert[i]->sig_ok == (i != 0)); - tt_assert(parsed_cert[i]->cert_valid == (i != 0)); - parsed_cert[i]->sig_bad = 0; - parsed_cert[i]->sig_ok = 0; - parsed_cert[i]->cert_valid = 0; - - /* Right key */ - tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now), OP_EQ, 0); - tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0); - tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 1); - tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0); - tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 1); - } - - /* Now try some junky certs. */ - /* - Truncated */ - nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len-1); - tt_ptr_op(NULL, OP_EQ, nocert); - - /* - First byte modified */ - cert[0]->encoded[0] = 99; - nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len); - tt_ptr_op(NULL, OP_EQ, nocert); - cert[0]->encoded[0] = 1; - - /* - Extra byte at the end*/ - junk = tor_malloc_zero(cert[0]->encoded_len + 1); - memcpy(junk, cert[0]->encoded, cert[0]->encoded_len); - nocert = tor_cert_parse(junk, cert[0]->encoded_len+1); - tt_ptr_op(NULL, OP_EQ, nocert); - - /* - Multiple signing key instances */ - tor_free(junk); - junk = tor_malloc_zero(104 + 36 * 2); - junk[0] = 1; /* version */ - junk[1] = 5; /* cert type */ - junk[6] = 1; /* key type */ - junk[39] = 2; /* n_extensions */ - junk[41] = 32; /* extlen */ - junk[42] = 4; /* exttype */ - junk[77] = 32; /* extlen */ - junk[78] = 4; /* exttype */ - nocert = tor_cert_parse(junk, 104 + 36 * 2); - tt_ptr_op(NULL, OP_EQ, nocert); - - done: - tor_cert_free(cert[0]); - tor_cert_free(cert[1]); - tor_cert_free(parsed_cert[0]); - tor_cert_free(parsed_cert[1]); - tor_cert_free(nocert); - tor_free(junk); - tor_free(base64); -} - -static void -test_routerkeys_ed_key_create(void *arg) -{ - (void)arg; - tor_cert_t *cert = NULL; - ed25519_keypair_t *kp1 = NULL, *kp2 = NULL; - time_t now = time(NULL); - - /* This is a simple alias for 'make a new keypair' */ - kp1 = ed_key_new(NULL, 0, 0, 0, 0, &cert); - tt_assert(kp1); - - /* Create a new certificate signed by kp1. */ - kp2 = ed_key_new(kp1, INIT_ED_KEY_NEEDCERT, now, 3600, 4, &cert); - tt_assert(kp2); - tt_assert(cert); - tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, - sizeof(ed25519_public_key_t)); - tt_assert(! cert->signing_key_included); - - tt_int_op(cert->valid_until, OP_GE, now); - tt_int_op(cert->valid_until, OP_LE, now+7200); - - /* Create a new key-including certificate signed by kp1 */ - ed25519_keypair_free(kp2); - tor_cert_free(cert); - cert = NULL; kp2 = NULL; - kp2 = ed_key_new(kp1, (INIT_ED_KEY_NEEDCERT| - INIT_ED_KEY_INCLUDE_SIGNING_KEY_IN_CERT), - now, 3600, 4, &cert); - tt_assert(kp2); - tt_assert(cert); - tt_assert(cert->signing_key_included); - tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, - sizeof(ed25519_public_key_t)); - tt_mem_op(&cert->signing_key, OP_EQ, &kp1->pubkey, - sizeof(ed25519_public_key_t)); - - done: - ed25519_keypair_free(kp1); - ed25519_keypair_free(kp2); - tor_cert_free(cert); -} - -static void -test_routerkeys_ed_key_init_basic(void *arg) -{ - (void) arg; - - tor_cert_t *cert = NULL, *cert2 = NULL; - ed25519_keypair_t *kp1 = NULL, *kp2 = NULL, *kp3 = NULL; - time_t now = time(NULL); - char *fname1 = tor_strdup(get_fname("test_ed_key_1")); - char *fname2 = tor_strdup(get_fname("test_ed_key_2")); - struct stat st; - - unlink(fname1); - unlink(fname2); - - /* Fail to load a key that isn't there. */ - kp1 = ed_key_init_from_file(fname1, 0, LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp1 == NULL); - tt_assert(cert == NULL); - - /* Create the key if requested to do so. */ - kp1 = ed_key_init_from_file(fname1, INIT_ED_KEY_CREATE, LOG_INFO, - NULL, now, 0, 7, &cert); - tt_assert(kp1 != NULL); - tt_assert(cert == NULL); - tt_int_op(stat(get_fname("test_ed_key_1_cert"), &st), OP_LT, 0); - tt_int_op(stat(get_fname("test_ed_key_1_secret_key"), &st), OP_EQ, 0); - - /* Fail to load if we say we need a cert */ - kp2 = ed_key_init_from_file(fname1, INIT_ED_KEY_NEEDCERT, LOG_INFO, - NULL, now, 0, 7, &cert); - tt_assert(kp2 == NULL); - - /* Fail to load if we say the wrong key type */ - kp2 = ed_key_init_from_file(fname1, 0, LOG_INFO, - NULL, now, 0, 6, &cert); - tt_assert(kp2 == NULL); - - /* Load successfully if we're not picky, whether we say "create" or not. */ - kp2 = ed_key_init_from_file(fname1, INIT_ED_KEY_CREATE, LOG_INFO, - NULL, now, 0, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert == NULL); - tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1)); - ed25519_keypair_free(kp2); kp2 = NULL; - - kp2 = ed_key_init_from_file(fname1, 0, LOG_INFO, - NULL, now, 0, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert == NULL); - tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1)); - ed25519_keypair_free(kp2); kp2 = NULL; - - /* Now create a key with a cert. */ - kp2 = ed_key_init_from_file(fname2, (INIT_ED_KEY_CREATE| - INIT_ED_KEY_NEEDCERT), - LOG_INFO, kp1, now, 7200, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert != NULL); - tt_mem_op(kp1, OP_NE, kp2, sizeof(*kp1)); - tt_int_op(stat(get_fname("test_ed_key_2_cert"), &st), OP_EQ, 0); - tt_int_op(stat(get_fname("test_ed_key_2_secret_key"), &st), OP_EQ, 0); - - tt_assert(cert->cert_valid == 1); - tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, 32); - - /* Now verify we can load the cert... */ - kp3 = ed_key_init_from_file(fname2, (INIT_ED_KEY_CREATE| - INIT_ED_KEY_NEEDCERT), - LOG_INFO, kp1, now, 7200, 7, &cert2); - tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); - tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len); - ed25519_keypair_free(kp3); kp3 = NULL; - tor_cert_free(cert2); cert2 = NULL; - - /* ... even without create... */ - kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, - LOG_INFO, kp1, now, 7200, 7, &cert2); - tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); - tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len); - ed25519_keypair_free(kp3); kp3 = NULL; - tor_cert_free(cert2); cert2 = NULL; - - /* ... but that we don't crash or anything if we say we don't want it. */ - kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, - LOG_INFO, kp1, now, 7200, 7, NULL); - tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2)); - ed25519_keypair_free(kp3); kp3 = NULL; - - /* Fail if we're told the wrong signing key */ - kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT, - LOG_INFO, kp2, now, 7200, 7, &cert2); - tt_assert(kp3 == NULL); - tt_assert(cert2 == NULL); - - done: - ed25519_keypair_free(kp1); - ed25519_keypair_free(kp2); - ed25519_keypair_free(kp3); - tor_cert_free(cert); - tor_cert_free(cert2); - tor_free(fname1); - tor_free(fname2); -} - -static void -test_routerkeys_ed_key_init_split(void *arg) -{ - (void) arg; - - tor_cert_t *cert = NULL; - ed25519_keypair_t *kp1 = NULL, *kp2 = NULL; - time_t now = time(NULL); - char *fname1 = tor_strdup(get_fname("test_ed_key_3")); - char *fname2 = tor_strdup(get_fname("test_ed_key_4")); - struct stat st; - const uint32_t flags = INIT_ED_KEY_SPLIT|INIT_ED_KEY_MISSING_SECRET_OK; - - unlink(fname1); - unlink(fname2); - - /* Can't load key that isn't there. */ - kp1 = ed_key_init_from_file(fname1, flags, LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp1 == NULL); - tt_assert(cert == NULL); - - /* Create a split key */ - kp1 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, - LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp1 != NULL); - tt_assert(cert == NULL); - tt_int_op(stat(get_fname("test_ed_key_3_cert"), &st), OP_LT, 0); - tt_int_op(stat(get_fname("test_ed_key_3_secret_key"), &st), OP_EQ, 0); - tt_int_op(stat(get_fname("test_ed_key_3_public_key"), &st), OP_EQ, 0); - - /* Load it. */ - kp2 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, - LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert == NULL); - tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp2)); - ed25519_keypair_free(kp2); kp2 = NULL; - - /* Okay, try killing the secret key and loading it. */ - unlink(get_fname("test_ed_key_3_secret_key")); - kp2 = ed_key_init_from_file(fname1, flags, - LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert == NULL); - tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey)); - tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey, - sizeof(kp2->seckey.seckey))); - ed25519_keypair_free(kp2); kp2 = NULL; - - /* Even when we're told to "create", don't create if there's a public key */ - kp2 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE, - LOG_INFO, NULL, now, 0, 7, &cert); - tt_assert(kp2 != NULL); - tt_assert(cert == NULL); - tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey)); - tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey, - sizeof(kp2->seckey.seckey))); - ed25519_keypair_free(kp2); kp2 = NULL; - - /* Make sure we fail on a tag mismatch, though */ - kp2 = ed_key_init_from_file(fname1, flags, - LOG_INFO, NULL, now, 0, 99, &cert); - tt_assert(kp2 == NULL); - - done: - ed25519_keypair_free(kp1); - ed25519_keypair_free(kp2); - tor_cert_free(cert); - tor_free(fname1); - tor_free(fname2); -} - -static void -test_routerkeys_ed_keys_init_all(void *arg) -{ - (void)arg; - char *dir = tor_strdup(get_fname("test_ed_keys_init_all")); - char *keydir = tor_strdup(get_fname("test_ed_keys_init_all/KEYS")); - or_options_t *options = tor_malloc_zero(sizeof(or_options_t)); - time_t now = time(NULL); - ed25519_public_key_t id; - ed25519_keypair_t sign, auth; - tor_cert_t *link_cert = NULL; - - get_options_mutable()->ORPort_set = 1; - - crypto_pk_t *rsa = pk_generate(0); - - set_server_identity_key(rsa); - set_client_identity_key(rsa); - - router_initialize_tls_context(); - - options->SigningKeyLifetime = 30*86400; - options->TestingAuthKeyLifetime = 2*86400; - options->TestingLinkCertLifetime = 2*86400; - options->TestingSigningKeySlop = 2*86400; - options->TestingAuthKeySlop = 2*3600; - options->TestingLinkKeySlop = 2*3600; - -#ifdef _WIN32 - mkdir(dir); - mkdir(keydir); -#else - mkdir(dir, 0700); - mkdir(keydir, 0700); -#endif /* defined(_WIN32) */ - - options->DataDirectory = dir; - options->KeyDirectory = keydir; - - tt_int_op(1, OP_EQ, load_ed_keys(options, now)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); - tt_assert(get_master_identity_key()); - tt_assert(get_master_identity_key()); - tt_assert(get_master_signing_keypair()); - tt_assert(get_current_auth_keypair()); - tt_assert(get_master_signing_key_cert()); - tt_assert(get_current_link_cert_cert()); - tt_assert(get_current_auth_key_cert()); - memcpy(&id, get_master_identity_key(), sizeof(id)); - memcpy(&sign, get_master_signing_keypair(), sizeof(sign)); - memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); - link_cert = tor_cert_dup(get_current_link_cert_cert()); - - /* Call load_ed_keys again, but nothing has changed. */ - tt_int_op(0, OP_EQ, load_ed_keys(options, now)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); - tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); - tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); - tt_mem_op(&auth, OP_EQ, get_current_auth_keypair(), sizeof(auth)); - tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert())); - - /* Force a reload: we make new link/auth keys. */ - routerkeys_free_all(); - tt_int_op(1, OP_EQ, load_ed_keys(options, now)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); - tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); - tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); - tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert())); - tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); - tt_assert(get_master_signing_key_cert()); - tt_assert(get_current_link_cert_cert()); - tt_assert(get_current_auth_key_cert()); - tor_cert_free(link_cert); - link_cert = tor_cert_dup(get_current_link_cert_cert()); - memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); - - /* Force a link/auth-key regeneration by advancing time. */ - tt_int_op(0, OP_EQ, load_ed_keys(options, now+3*86400)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+3*86400, 0)); - tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); - tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); - tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); - tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); - tt_assert(get_master_signing_key_cert()); - tt_assert(get_current_link_cert_cert()); - tt_assert(get_current_auth_key_cert()); - tor_cert_free(link_cert); - link_cert = tor_cert_dup(get_current_link_cert_cert()); - memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); - - /* Force a signing-key regeneration by advancing time. */ - tt_int_op(1, OP_EQ, load_ed_keys(options, now+100*86400)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+100*86400, 0)); - tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); - tt_mem_op(&sign, OP_NE, get_master_signing_keypair(), sizeof(sign)); - tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); - tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); - tt_assert(get_master_signing_key_cert()); - tt_assert(get_current_link_cert_cert()); - tt_assert(get_current_auth_key_cert()); - memcpy(&sign, get_master_signing_keypair(), sizeof(sign)); - tor_cert_free(link_cert); - link_cert = tor_cert_dup(get_current_link_cert_cert()); - memcpy(&auth, get_current_auth_keypair(), sizeof(auth)); - - /* Demonstrate that we can start up with no secret identity key */ - routerkeys_free_all(); - unlink(get_fname("test_ed_keys_init_all/KEYS/" - "ed25519_master_id_secret_key")); - tt_int_op(1, OP_EQ, load_ed_keys(options, now)); - tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0)); - tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id)); - tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign)); - tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert())); - tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth)); - tt_assert(get_master_signing_key_cert()); - tt_assert(get_current_link_cert_cert()); - tt_assert(get_current_auth_key_cert()); - - /* But we're in trouble if we have no id key and our signing key has - expired. */ - log_global_min_severity_ = LOG_ERR; /* Suppress warnings. - * XXX (better way to do this)? */ - routerkeys_free_all(); - tt_int_op(-1, OP_EQ, load_ed_keys(options, now+200*86400)); - - done: - tor_free(dir); - tor_free(keydir); - tor_free(options); - tor_cert_free(link_cert); - routerkeys_free_all(); -} - -static void -test_routerkeys_cross_certify_ntor(void *args) -{ - (void) args; - - tor_cert_t *cert = NULL; - curve25519_keypair_t onion_keys; - ed25519_public_key_t master_key; - ed25519_public_key_t onion_check_key; - time_t now = time(NULL); - int sign; - - tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key, - "IamwritingthesetestsOnARainyAfternoonin2014")); - tt_int_op(0, OP_EQ, curve25519_keypair_generate(&onion_keys, 0)); - cert = make_ntor_onion_key_crosscert(&onion_keys, - &master_key, - now, 10000, - &sign); - tt_assert(cert); - tt_assert(sign == 0 || sign == 1); - tt_int_op(cert->cert_type, OP_EQ, CERT_TYPE_ONION_ID); - tt_int_op(1, OP_EQ, ed25519_pubkey_eq(&cert->signed_key, &master_key)); - tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( - &onion_check_key, &onion_keys.pubkey, sign)); - tt_int_op(0, OP_EQ, tor_cert_checksig(cert, &onion_check_key, now)); - - done: - tor_cert_free(cert); -} - -static void -test_routerkeys_cross_certify_tap(void *args) -{ - (void)args; - uint8_t *cc = NULL; - int cc_len; - ed25519_public_key_t master_key; - crypto_pk_t *onion_key = pk_generate(2), *id_key = pk_generate(1); - char digest[20]; - char buf[128]; - int n; - - tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key, - "IAlreadyWroteTestsForRouterdescsUsingTheseX")); - - cc = make_tap_onion_key_crosscert(onion_key, - &master_key, - id_key, &cc_len); - tt_assert(cc); - tt_assert(cc_len); - - n = crypto_pk_public_checksig(onion_key, buf, sizeof(buf), - (char*)cc, cc_len); - tt_int_op(n,OP_GT,0); - tt_int_op(n,OP_EQ,52); - - crypto_pk_get_digest(id_key, digest); - tt_mem_op(buf,OP_EQ,digest,20); - tt_mem_op(buf+20,OP_EQ,master_key.pubkey,32); - - tt_int_op(0, OP_EQ, check_tap_onion_key_crosscert(cc, cc_len, - onion_key, &master_key, (uint8_t*)digest)); - - done: - tor_free(cc); - crypto_pk_free(id_key); - crypto_pk_free(onion_key); -} - -static void -test_routerkeys_rsa_ed_crosscert(void *arg) -{ - (void)arg; - ed25519_public_key_t ed; - crypto_pk_t *rsa = pk_generate(2); - - uint8_t *cc = NULL; - ssize_t cc_len; - time_t expires_in = 1470846177; - - tt_int_op(0, OP_EQ, ed25519_public_from_base64(&ed, - "ThisStringCanContainAnythingSoNoKeyHereNowX")); - cc_len = tor_make_rsa_ed25519_crosscert(&ed, rsa, expires_in, &cc); - - tt_int_op(cc_len, OP_GT, 0); - tt_int_op(cc_len, OP_GT, 37); /* key, expires, siglen */ - tt_mem_op(cc, OP_EQ, ed.pubkey, 32); - time_t expires_out = 3600 * ntohl(get_uint32(cc+32)); - tt_int_op(expires_out, OP_GE, expires_in); - tt_int_op(expires_out, OP_LE, expires_in + 3600); - - tt_int_op(cc_len, OP_EQ, 37 + get_uint8(cc+36)); - - tt_int_op(0, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, - expires_in - 10)); - - /* Now try after it has expired */ - tt_int_op(-4, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, - expires_out + 1)); - - /* Truncated object */ - tt_int_op(-2, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len - 2, rsa, &ed, - expires_in - 10)); - - /* Key not as expected */ - cc[0] ^= 3; - tt_int_op(-3, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, - expires_in - 10)); - cc[0] ^= 3; - - /* Bad signature */ - cc[40] ^= 3; - tt_int_op(-5, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, - expires_in - 10)); - cc[40] ^= 3; - - /* Signature of wrong data */ - cc[0] ^= 3; - ed.pubkey[0] ^= 3; - tt_int_op(-6, OP_EQ, rsa_ed25519_crosscert_check(cc, cc_len, rsa, &ed, - expires_in - 10)); - cc[0] ^= 3; - ed.pubkey[0] ^= 3; - - done: - crypto_pk_free(rsa); - tor_free(cc); -} - -#define TEST(name, flags) \ - { #name , test_routerkeys_ ## name, (flags), NULL, NULL } - -struct testcase_t routerkeys_tests[] = { - TEST(write_fingerprint, TT_FORK), - TEST(ed_certs, TT_FORK), - TEST(ed_key_create, TT_FORK), - TEST(ed_key_init_basic, TT_FORK), - TEST(ed_key_init_split, TT_FORK), - TEST(ed_keys_init_all, TT_FORK), - TEST(cross_certify_ntor, 0), - TEST(cross_certify_tap, 0), - TEST(rsa_ed_crosscert, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_routerlist.c b/src/tor/src/test/test_routerlist.c deleted file mode 100644 index c19d66ef9..000000000 --- a/src/tor/src/test/test_routerlist.c +++ /dev/null @@ -1,615 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include -#include - -#define CONNECTION_PRIVATE -#define DIRECTORY_PRIVATE -#define DIRVOTE_PRIVATE -#define ENTRYNODES_PRIVATE -#define HIBERNATE_PRIVATE -#define NETWORKSTATUS_PRIVATE -#define ROUTERLIST_PRIVATE -#define TOR_UNIT_TESTING -#include "or.h" -#include "config.h" -#include "connection.h" -#include "container.h" -#include "control.h" -#include "directory.h" -#include "dirvote.h" -#include "entrynodes.h" -#include "hibernate.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerlist.h" -#include "routerset.h" -#include "routerparse.h" -#include "shared_random.h" -#include "statefile.h" -#include "test.h" -#include "test_dir_common.h" -#include "log_test_helpers.h" - -void construct_consensus(char **consensus_text_md); - -static authority_cert_t *mock_cert; - -static authority_cert_t * -get_my_v3_authority_cert_m(void) -{ - tor_assert(mock_cert); - return mock_cert; -} - -/* 4 digests + 3 sep + pre + post + NULL */ -static char output[4*BASE64_DIGEST256_LEN+3+2+2+1]; - -static void -mock_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, int pds_flags, - download_want_authority_t want_authority) -{ - (void)dir_purpose; - (void)router_purpose; - (void)pds_flags; - (void)want_authority; - tt_assert(resource); - strlcpy(output, resource, sizeof(output)); - done: - ; -} - -static void -test_routerlist_initiate_descriptor_downloads(void *arg) -{ - const char *prose = "unhurried and wise, we perceive."; - smartlist_t *digests = smartlist_new(); - (void)arg; - - for (int i = 0; i < 20; i++) { - smartlist_add(digests, (char*)prose); - } - - MOCK(directory_get_from_dirserver, mock_get_from_dirserver); - initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC, - digests, 3, 7, 0); - UNMOCK(directory_get_from_dirserver); - - tt_str_op(output, OP_EQ, "d/" - "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" - "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" - "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" - "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4" - ".z"); - - done: - smartlist_free(digests); -} - -static int count = 0; - -static void -mock_initiate_descriptor_downloads(const routerstatus_t *source, - int purpose, smartlist_t *digests, - int lo, int hi, int pds_flags) -{ - (void)source; - (void)purpose; - (void)digests; - (void)pds_flags; - (void)hi; - (void)lo; - count += 1; -} - -static void -test_routerlist_launch_descriptor_downloads(void *arg) -{ - smartlist_t *downloadable = smartlist_new(); - time_t now = time(NULL); - char *cp; - (void)arg; - - for (int i = 0; i < 100; i++) { - cp = tor_malloc(DIGEST256_LEN); - tt_assert(cp); - crypto_rand(cp, DIGEST256_LEN); - smartlist_add(downloadable, cp); - } - - MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads); - launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable, - NULL, now); - tt_int_op(3, OP_EQ, count); - UNMOCK(initiate_descriptor_downloads); - - done: - SMARTLIST_FOREACH(downloadable, char *, cp1, tor_free(cp1)); - smartlist_free(downloadable); -} - -void -construct_consensus(char **consensus_text_md) -{ - networkstatus_t *vote = NULL; - networkstatus_t *v1 = NULL, *v2 = NULL, *v3 = NULL; - networkstatus_voter_info_t *voter = NULL; - authority_cert_t *cert1=NULL, *cert2=NULL, *cert3=NULL; - crypto_pk_t *sign_skey_1=NULL, *sign_skey_2=NULL, *sign_skey_3=NULL; - crypto_pk_t *sign_skey_leg=NULL; - time_t now = time(NULL); - smartlist_t *votes = NULL; - int n_vrs; - - tt_assert(!dir_common_authority_pk_init(&cert1, &cert2, &cert3, - &sign_skey_1, &sign_skey_2, - &sign_skey_3)); - sign_skey_leg = pk_generate(4); - - dir_common_construct_vote_1(&vote, cert1, sign_skey_1, - &dir_common_gen_routerstatus_for_v3ns, - &v1, &n_vrs, now, 1); - networkstatus_vote_free(vote); - tt_assert(v1); - tt_int_op(n_vrs, OP_EQ, 4); - tt_int_op(smartlist_len(v1->routerstatus_list), OP_EQ, 4); - - dir_common_construct_vote_2(&vote, cert2, sign_skey_2, - &dir_common_gen_routerstatus_for_v3ns, - &v2, &n_vrs, now, 1); - networkstatus_vote_free(vote); - tt_assert(v2); - tt_int_op(n_vrs, OP_EQ, 4); - tt_int_op(smartlist_len(v2->routerstatus_list), OP_EQ, 4); - - dir_common_construct_vote_3(&vote, cert3, sign_skey_3, - &dir_common_gen_routerstatus_for_v3ns, - &v3, &n_vrs, now, 1); - - tt_assert(v3); - tt_int_op(n_vrs, OP_EQ, 4); - tt_int_op(smartlist_len(v3->routerstatus_list), OP_EQ, 4); - networkstatus_vote_free(vote); - votes = smartlist_new(); - smartlist_add(votes, v1); - smartlist_add(votes, v2); - smartlist_add(votes, v3); - - *consensus_text_md = networkstatus_compute_consensus(votes, 3, - cert1->identity_key, - sign_skey_1, - "AAAAAAAAAAAAAAAAAAAA", - sign_skey_leg, - FLAV_MICRODESC); - - tt_assert(*consensus_text_md); - - done: - tor_free(voter); - networkstatus_vote_free(v1); - networkstatus_vote_free(v2); - networkstatus_vote_free(v3); - smartlist_free(votes); - authority_cert_free(cert1); - authority_cert_free(cert2); - authority_cert_free(cert3); - crypto_pk_free(sign_skey_1); - crypto_pk_free(sign_skey_2); - crypto_pk_free(sign_skey_3); - crypto_pk_free(sign_skey_leg); -} - -static int mock_usable_consensus_flavor_value = FLAV_NS; - -static int -mock_usable_consensus_flavor(void) -{ - return mock_usable_consensus_flavor_value; -} - -static void -test_router_pick_directory_server_impl(void *arg) -{ - (void)arg; - - networkstatus_t *con_md = NULL; - char *consensus_text_md = NULL; - int flags = PDS_IGNORE_FASCISTFIREWALL|PDS_RETRY_IF_NO_SERVERS; - or_options_t *options = get_options_mutable(); - const routerstatus_t *rs = NULL; - options->UseMicrodescriptors = 1; - char *router1_id = NULL, *router2_id = NULL, *router3_id = NULL; - node_t *node_router1 = NULL, *node_router2 = NULL, *node_router3 = NULL; - config_line_t *policy_line = NULL; - time_t now = time(NULL); - int tmp_dirport1, tmp_dirport3; - - (void)arg; - - MOCK(usable_consensus_flavor, mock_usable_consensus_flavor); - - /* With no consensus, we must be bootstrapping, regardless of time or flavor - */ - mock_usable_consensus_flavor_value = FLAV_NS; - tt_assert(networkstatus_consensus_is_bootstrapping(now)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); - tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); - - mock_usable_consensus_flavor_value = FLAV_MICRODESC; - tt_assert(networkstatus_consensus_is_bootstrapping(now)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); - tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); - - /* Init SR subsystem. */ - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - sr_init(0); - UNMOCK(get_my_v3_authority_cert); - - /* No consensus available, fail early */ - rs = router_pick_directory_server_impl(V3_DIRINFO, (const int) 0, NULL); - tt_ptr_op(rs, OP_EQ, NULL); - - construct_consensus(&consensus_text_md); - tt_assert(consensus_text_md); - con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, - NS_TYPE_CONSENSUS); - tt_assert(con_md); - tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC); - tt_assert(con_md->routerstatus_list); - tt_int_op(smartlist_len(con_md->routerstatus_list), OP_EQ, 3); - tt_assert(!networkstatus_set_current_consensus_from_ns(con_md, - "microdesc")); - - /* If the consensus time or flavor doesn't match, we are still - * bootstrapping */ - mock_usable_consensus_flavor_value = FLAV_NS; - tt_assert(networkstatus_consensus_is_bootstrapping(now)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); - tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); - - /* With a valid consensus for the current time and flavor, we stop - * bootstrapping, even if we have no certificates */ - mock_usable_consensus_flavor_value = FLAV_MICRODESC; - tt_assert(!networkstatus_consensus_is_bootstrapping(now + 2000)); - tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_after)); - tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until)); - tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until - + 24*60*60)); - /* These times are outside the test validity period */ - tt_assert(networkstatus_consensus_is_bootstrapping(now)); - tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); - tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); - - nodelist_set_consensus(con_md); - nodelist_assert_ok(); - - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - /* We should not fail now we have a consensus and routerstatus_list - * and nodelist are populated. */ - tt_ptr_op(rs, OP_NE, NULL); - - /* Manipulate the nodes so we get the dir server we expect */ - router1_id = tor_malloc(DIGEST_LEN); - memset(router1_id, TEST_DIR_ROUTER_ID_1, DIGEST_LEN); - router2_id = tor_malloc(DIGEST_LEN); - memset(router2_id, TEST_DIR_ROUTER_ID_2, DIGEST_LEN); - router3_id = tor_malloc(DIGEST_LEN); - memset(router3_id, TEST_DIR_ROUTER_ID_3, DIGEST_LEN); - - node_router1 = node_get_mutable_by_id(router1_id); - node_router2 = node_get_mutable_by_id(router2_id); - node_router3 = node_get_mutable_by_id(router3_id); - - node_router1->is_possible_guard = 1; - - node_router1->is_running = 0; - node_router3->is_running = 0; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); - rs = NULL; - node_router1->is_running = 1; - node_router3->is_running = 1; - - node_router1->rs->is_v2_dir = 0; - node_router3->rs->is_v2_dir = 0; - tmp_dirport1 = node_router1->rs->dir_port; - tmp_dirport3 = node_router3->rs->dir_port; - node_router1->rs->dir_port = 0; - node_router3->rs->dir_port = 0; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); - rs = NULL; - node_router1->rs->is_v2_dir = 1; - node_router3->rs->is_v2_dir = 1; - node_router1->rs->dir_port = tmp_dirport1; - node_router3->rs->dir_port = tmp_dirport3; - - node_router1->is_valid = 0; - node_router3->is_valid = 0; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN)); - rs = NULL; - node_router1->is_valid = 1; - node_router3->is_valid = 1; - - /* Manipulate overloaded */ - - node_router2->rs->last_dir_503_at = now; - node_router3->rs->last_dir_503_at = now; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); - node_router2->rs->last_dir_503_at = 0; - node_router3->rs->last_dir_503_at = 0; - - /* Set a Fascist firewall */ - flags &= ~ PDS_IGNORE_FASCISTFIREWALL; - policy_line = tor_malloc_zero(sizeof(config_line_t)); - policy_line->key = tor_strdup("ReachableORAddresses"); - policy_line->value = tor_strdup("accept *:442, reject *:*"); - options->ReachableORAddresses = policy_line; - policies_parse_from_options(options); - - node_router1->rs->or_port = 444; - node_router2->rs->or_port = 443; - node_router3->rs->or_port = 442; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router3_id, DIGEST_LEN)); - node_router1->rs->or_port = 442; - node_router2->rs->or_port = 443; - node_router3->rs->or_port = 444; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); - - /* Fascist firewall and overloaded */ - node_router1->rs->or_port = 442; - node_router2->rs->or_port = 443; - node_router3->rs->or_port = 442; - node_router3->rs->last_dir_503_at = now; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); - node_router3->rs->last_dir_503_at = 0; - - /* Fascists against OR and Dir */ - policy_line = tor_malloc_zero(sizeof(config_line_t)); - policy_line->key = tor_strdup("ReachableAddresses"); - policy_line->value = tor_strdup("accept *:80, reject *:*"); - options->ReachableDirAddresses = policy_line; - policies_parse_from_options(options); - node_router1->rs->or_port = 442; - node_router2->rs->or_port = 441; - node_router3->rs->or_port = 443; - node_router1->rs->dir_port = 80; - node_router2->rs->dir_port = 80; - node_router3->rs->dir_port = 81; - node_router1->rs->last_dir_503_at = now; - rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL); - tt_ptr_op(rs, OP_NE, NULL); - tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN)); - node_router1->rs->last_dir_503_at = 0; - - done: - UNMOCK(usable_consensus_flavor); - - if (router1_id) - tor_free(router1_id); - if (router2_id) - tor_free(router2_id); - if (router3_id) - tor_free(router3_id); - if (options->ReachableORAddresses || - options->ReachableDirAddresses) - policies_free_all(); - tor_free(consensus_text_md); - networkstatus_vote_free(con_md); -} - -static or_state_t *dummy_state = NULL; -static or_state_t * -get_or_state_replacement(void) -{ - return dummy_state; -} - -static void -mock_directory_initiate_request(directory_request_t *req) -{ - (void)req; - return; -} - -static circuit_guard_state_t * -mock_circuit_guard_state_new(entry_guard_t *guard, unsigned state, - entry_guard_restriction_t *rst) -{ - (void) guard; - (void) state; - (void) rst; - return NULL; -} - -/** Test that we will use our directory guards to fetch mds even if we don't - * have any dirinfo (tests bug #23862). */ -static void -test_directory_guard_fetch_with_no_dirinfo(void *arg) -{ - int retval; - char *consensus_text_md = NULL; - or_options_t *options = get_options_mutable(); - - (void) arg; - - hibernate_set_state_for_testing_(HIBERNATE_STATE_LIVE); - - /* Initialize the SRV subsystem */ - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - sr_init(0); - UNMOCK(get_my_v3_authority_cert); - - /* Initialize the entry node configuration from the ticket */ - options->UseEntryGuards = 1; - options->StrictNodes = 1; - get_options_mutable()->EntryNodes = routerset_new(); - routerset_parse(get_options_mutable()->EntryNodes, - "2121212121212121212121212121212121212121", "foo"); - - /* Mock some functions */ - dummy_state = tor_malloc_zero(sizeof(or_state_t)); - MOCK(get_or_state, get_or_state_replacement); - MOCK(directory_initiate_request, mock_directory_initiate_request); - /* we need to mock this one to avoid memleaks */ - MOCK(circuit_guard_state_new, mock_circuit_guard_state_new); - - /* Call guards_update_all() to simulate loading our state file (see - * entry_guards_load_guards_from_state() and ticket #23989). */ - guards_update_all(); - - /* Test logic: Simulate the arrival of a new consensus when we have no - * dirinfo at all. Tor will need to fetch the mds from the consensus. Make - * sure that Tor will use the specified entry guard instead of relying on the - * fallback directories. */ - - /* Fixup the dirconn that will deliver the consensus */ - dir_connection_t *conn = dir_connection_new(AF_INET); - tor_addr_from_ipv4h(&conn->base_.addr, 0x7f000001); - conn->base_.port = 8800; - TO_CONN(conn)->address = tor_strdup("127.0.0.1"); - conn->base_.purpose = DIR_PURPOSE_FETCH_CONSENSUS; - conn->requested_resource = tor_strdup("ns"); - - /* Construct a consensus */ - construct_consensus(&consensus_text_md); - tt_assert(consensus_text_md); - - /* Place the consensus in the dirconn */ - response_handler_args_t args; - memset(&args, 0, sizeof(response_handler_args_t)); - args.status_code = 200; - args.body = consensus_text_md; - args.body_len = strlen(consensus_text_md); - - /* Update approx time so that the consensus is considered live */ - update_approx_time(time(NULL)+1010); - - setup_capture_of_logs(LOG_DEBUG); - - /* Now handle the consensus */ - retval = handle_response_fetch_consensus(conn, &args); - tt_int_op(retval, OP_EQ, 0); - - /* Make sure that our primary guard was chosen */ - expect_log_msg_containing("Selected primary guard router3"); - - done: - tor_free(consensus_text_md); - tor_free(dummy_state); - connection_free_minimal(TO_CONN(conn)); - entry_guards_free_all(); - teardown_capture_of_logs(); -} - -static connection_t *mocked_connection = NULL; - -/* Mock connection_get_by_type_addr_port_purpose by returning - * mocked_connection. */ -static connection_t * -mock_connection_get_by_type_addr_port_purpose(int type, - const tor_addr_t *addr, - uint16_t port, int purpose) -{ - (void)type; - (void)addr; - (void)port; - (void)purpose; - - return mocked_connection; -} - -#define TEST_ADDR_STR "127.0.0.1" -#define TEST_DIR_PORT 12345 - -static void -test_routerlist_router_is_already_dir_fetching(void *arg) -{ - (void)arg; - tor_addr_port_t test_ap, null_addr_ap, zero_port_ap; - - /* Setup */ - tor_addr_parse(&test_ap.addr, TEST_ADDR_STR); - test_ap.port = TEST_DIR_PORT; - tor_addr_make_null(&null_addr_ap.addr, AF_INET6); - null_addr_ap.port = TEST_DIR_PORT; - tor_addr_parse(&zero_port_ap.addr, TEST_ADDR_STR); - zero_port_ap.port = 0; - MOCK(connection_get_by_type_addr_port_purpose, - mock_connection_get_by_type_addr_port_purpose); - - /* Test that we never get 1 from a NULL connection */ - mocked_connection = NULL; - tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 0); - /* We always expect 0 in these cases */ - tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0); - - /* Test that we get 1 with a connection in the appropriate circumstances */ - mocked_connection = connection_new(CONN_TYPE_DIR, AF_INET); - tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 1); - tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 1); - tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 1); - - /* Test that we get 0 even with a connection in the appropriate - * circumstances */ - tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0); - tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0); - - done: - /* If a connection is never set up, connection_free chokes on it. */ - if (mocked_connection) { - buf_free(mocked_connection->inbuf); - buf_free(mocked_connection->outbuf); - } - tor_free(mocked_connection); - UNMOCK(connection_get_by_type_addr_port_purpose); -} - -#undef TEST_ADDR_STR -#undef TEST_DIR_PORT - -#define NODE(name, flags) \ - { #name, test_routerlist_##name, (flags), NULL, NULL } -#define ROUTER(name,flags) \ - { #name, test_router_##name, (flags), NULL, NULL } - -struct testcase_t routerlist_tests[] = { - NODE(initiate_descriptor_downloads, 0), - NODE(launch_descriptor_downloads, 0), - NODE(router_is_already_dir_fetching, TT_FORK), - ROUTER(pick_directory_server_impl, TT_FORK), - { "directory_guard_fetch_with_no_dirinfo", - test_directory_guard_fetch_with_no_dirinfo, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_routerset.c b/src/tor/src/test/test_routerset.c deleted file mode 100644 index c54132467..000000000 --- a/src/tor/src/test/test_routerset.c +++ /dev/null @@ -1,2224 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define ROUTERSET_PRIVATE - -#include "or.h" -#include "geoip.h" -#include "routerset.h" -#include "routerparse.h" -#include "policies.h" -#include "nodelist.h" -#include "test.h" - -#define NS_MODULE routerset - -#define NS_SUBMODULE routerset_new - -/* - * Functional (blackbox) test to determine that each member of the routerset - * is non-NULL - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *rs; - (void)arg; - - rs = routerset_new(); - - tt_ptr_op(rs, OP_NE, NULL); - tt_ptr_op(rs->list, OP_NE, NULL); - tt_ptr_op(rs->names, OP_NE, NULL); - tt_ptr_op(rs->digests, OP_NE, NULL); - tt_ptr_op(rs->policies, OP_NE, NULL); - tt_ptr_op(rs->country_names, OP_NE, NULL); - - done: - routerset_free(rs); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_get_countryname - -/* - * Functional test to strip the braces from a "{xx}" country code string. - */ - -static void -NS(test_main)(void *arg) -{ - const char *input; - char *name; - (void)arg; - - /* strlen(c) < 4 */ - input = "xxx"; - name = routerset_get_countryname(input); - tt_ptr_op(name, OP_EQ, NULL); - tor_free(name); - - /* c[0] != '{' */ - input = "xxx}"; - name = routerset_get_countryname(input); - tt_ptr_op(name, OP_EQ, NULL); - tor_free(name); - - /* c[3] != '}' */ - input = "{xxx"; - name = routerset_get_countryname(input); - tt_ptr_op(name, OP_EQ, NULL); - tor_free(name); - - /* tor_strlower */ - input = "{XX}"; - name = routerset_get_countryname(input); - tt_str_op(name, OP_EQ, "xx"); - tor_free(name); - - input = "{xx}"; - name = routerset_get_countryname(input); - tt_str_op(name, OP_EQ, "xx"); - done: - tor_free(name); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_refresh_counties, geoip_not_loaded) - -/* - * Structural (whitebox) test for routerset_refresh_counties, when the GeoIP DB - * is not loaded. - */ - -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); -NS_DECL(int, geoip_get_n_countries, (void)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - (void)arg; - - NS_MOCK(geoip_is_loaded); - NS_MOCK(geoip_get_n_countries); - - routerset_refresh_countries(set); - - tt_ptr_op(set->countries, OP_EQ, NULL); - tt_int_op(set->n_countries, OP_EQ, 0); - tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 0); - - done: - NS_UNMOCK(geoip_is_loaded); - NS_UNMOCK(geoip_get_n_countries); - routerset_free(set); -} - -static int -NS(geoip_is_loaded)(sa_family_t family) -{ - (void)family; - CALLED(geoip_is_loaded)++; - - return 0; -} - -static int -NS(geoip_get_n_countries)(void) -{ - CALLED(geoip_get_n_countries)++; - - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_refresh_counties, no_countries) - -/* - * Structural test for routerset_refresh_counties, when there are no countries. - */ - -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); -NS_DECL(int, geoip_get_n_countries, (void)); -NS_DECL(country_t, geoip_get_country, (const char *country)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - (void)arg; - - NS_MOCK(geoip_is_loaded); - NS_MOCK(geoip_get_n_countries); - NS_MOCK(geoip_get_country); - - routerset_refresh_countries(set); - - tt_ptr_op(set->countries, OP_NE, NULL); - tt_int_op(set->n_countries, OP_EQ, 1); - tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); - tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_country), OP_EQ, 0); - - done: - NS_UNMOCK(geoip_is_loaded); - NS_UNMOCK(geoip_get_n_countries); - NS_UNMOCK(geoip_get_country); - routerset_free(set); -} - -static int -NS(geoip_is_loaded)(sa_family_t family) -{ - (void)family; - CALLED(geoip_is_loaded)++; - - return 1; -} - -static int -NS(geoip_get_n_countries)(void) -{ - CALLED(geoip_get_n_countries)++; - - return 1; -} - -static country_t -NS(geoip_get_country)(const char *countrycode) -{ - (void)countrycode; - CALLED(geoip_get_country)++; - - return 1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_refresh_counties, one_valid_country) - -/* - * Structural test for routerset_refresh_counties, with one valid country. - */ - -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); -NS_DECL(int, geoip_get_n_countries, (void)); -NS_DECL(country_t, geoip_get_country, (const char *country)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - (void)arg; - - NS_MOCK(geoip_is_loaded); - NS_MOCK(geoip_get_n_countries); - NS_MOCK(geoip_get_country); - smartlist_add(set->country_names, tor_strndup("foo", 3)); - - routerset_refresh_countries(set); - - tt_ptr_op(set->countries, OP_NE, NULL); - tt_int_op(set->n_countries, OP_EQ, 2); - tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); - tt_int_op((unsigned int)(*set->countries), OP_NE, 0); - - done: - NS_UNMOCK(geoip_is_loaded); - NS_UNMOCK(geoip_get_n_countries); - NS_UNMOCK(geoip_get_country); - routerset_free(set); -} - -static int -NS(geoip_is_loaded)(sa_family_t family) -{ - (void)family; - CALLED(geoip_is_loaded)++; - - return 1; -} - -static int -NS(geoip_get_n_countries)(void) -{ - CALLED(geoip_get_n_countries)++; - - return 2; -} - -static country_t -NS(geoip_get_country)(const char *countrycode) -{ - (void)countrycode; - CALLED(geoip_get_country)++; - - return 1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_refresh_counties, one_invalid_country) - -/* - * Structural test for routerset_refresh_counties, with one invalid - * country code.. - */ - -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); -NS_DECL(int, geoip_get_n_countries, (void)); -NS_DECL(country_t, geoip_get_country, (const char *country)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - (void)arg; - - NS_MOCK(geoip_is_loaded); - NS_MOCK(geoip_get_n_countries); - NS_MOCK(geoip_get_country); - smartlist_add(set->country_names, tor_strndup("foo", 3)); - - routerset_refresh_countries(set); - - tt_ptr_op(set->countries, OP_NE, NULL); - tt_int_op(set->n_countries, OP_EQ, 2); - tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); - tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); - - done: - NS_UNMOCK(geoip_is_loaded); - NS_UNMOCK(geoip_get_n_countries); - NS_UNMOCK(geoip_get_country); - routerset_free(set); -} - -static int -NS(geoip_is_loaded)(sa_family_t family) -{ - (void)family; - CALLED(geoip_is_loaded)++; - - return 1; -} - -static int -NS(geoip_get_n_countries)(void) -{ - CALLED(geoip_get_n_countries)++; - - return 2; -} - -static country_t -NS(geoip_get_country)(const char *countrycode) -{ - (void)countrycode; - CALLED(geoip_get_country)++; - - return -1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, malformed) - -/* - * Functional test, with a malformed string to parse. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - const char *s = "_"; - int r; - (void)arg; - - r = routerset_parse(set, s, ""); - - tt_int_op(r, OP_EQ, -1); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, valid_hexdigest) - -/* - * Functional test for routerset_parse, that routerset_parse returns 0 - * on a valid hexdigest entry. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - set = routerset_new(); - s = "$0000000000000000000000000000000000000000"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(digestmap_isempty(set->digests), OP_NE, 1); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, valid_nickname) - -/* - * Functional test for routerset_parse, when given a valid nickname as input. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - set = routerset_new(); - s = "fred"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(strmap_isempty(set->names), OP_NE, 1); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, get_countryname) - -/* - * Functional test for routerset_parse, when given a valid countryname. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - set = routerset_new(); - s = "{cc}"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(set->country_names), OP_NE, 0); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, policy_wildcard) - -/* - * Structural test for routerset_parse, when given a valid wildcard policy. - */ - -NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, - (const char *s, int assume_action, int *malformed_list)); - -static addr_policy_t *NS(mock_addr_policy); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - NS_MOCK(router_parse_addr_policy_item_from_string); - NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); - - set = routerset_new(); - s = "*"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(set->policies), OP_NE, 0); - tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); - - done: - routerset_free(set); -} - -addr_policy_t * -NS(router_parse_addr_policy_item_from_string)(const char *s, - int assume_action, - int *malformed_list) -{ - (void)s; - (void)assume_action; - (void)malformed_list; - CALLED(router_parse_addr_policy_item_from_string)++; - - return NS(mock_addr_policy); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv4) - -/* - * Structural test for routerset_parse, when given a valid IPv4 address - * literal policy. - */ - -NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, - (const char *s, int assume_action, int *bogus)); - -static addr_policy_t *NS(mock_addr_policy); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - NS_MOCK(router_parse_addr_policy_item_from_string); - NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); - - set = routerset_new(); - s = "127.0.0.1"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(set->policies), OP_NE, 0); - tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); - - done: - routerset_free(set); -} - -addr_policy_t * -NS(router_parse_addr_policy_item_from_string)(const char *s, int assume_action, - int *bogus) -{ - (void)s; - (void)assume_action; - CALLED(router_parse_addr_policy_item_from_string)++; - *bogus = 0; - - return NS(mock_addr_policy); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_parse, policy_ipv6) - -/* - * Structural test for routerset_parse, when given a valid IPv6 address - * literal policy. - */ - -NS_DECL(addr_policy_t *, router_parse_addr_policy_item_from_string, - (const char *s, int assume_action, int *bad)); - -static addr_policy_t *NS(mock_addr_policy); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - const char *s; - int r; - (void)arg; - - NS_MOCK(router_parse_addr_policy_item_from_string); - NS(mock_addr_policy) = tor_malloc_zero(sizeof(addr_policy_t)); - - set = routerset_new(); - s = "::1"; - r = routerset_parse(set, s, ""); - tt_int_op(r, OP_EQ, 0); - tt_int_op(smartlist_len(set->policies), OP_NE, 0); - tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); - - done: - routerset_free(set); -} - -addr_policy_t * -NS(router_parse_addr_policy_item_from_string)(const char *s, - int assume_action, int *bad) -{ - (void)s; - (void)assume_action; - CALLED(router_parse_addr_policy_item_from_string)++; - *bad = 0; - - return NS(mock_addr_policy); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_union, source_bad) - -/* - * Structural test for routerset_union, when given a bad source argument. - */ - -NS_DECL(smartlist_t *, smartlist_new, (void)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set, *bad_set; - (void)arg; - - set = routerset_new(); - bad_set = routerset_new(); - smartlist_free(bad_set->list); - bad_set->list = NULL; - - NS_MOCK(smartlist_new); - - routerset_union(set, NULL); - tt_int_op(CALLED(smartlist_new), OP_EQ, 0); - - routerset_union(set, bad_set); - tt_int_op(CALLED(smartlist_new), OP_EQ, 0); - - done: - NS_UNMOCK(smartlist_new); - routerset_free(set); - - /* Just recreate list, so we can simply use routerset_free. */ - bad_set->list = smartlist_new(); - routerset_free(bad_set); -} - -static smartlist_t * -NS(smartlist_new)(void) -{ - CALLED(smartlist_new)++; - - return NULL; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_union, one) - -/* - * Functional test for routerset_union. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *src = routerset_new(); - routerset_t *tgt; - (void)arg; - - tgt = routerset_new(); - smartlist_add_strdup(src->list, "{xx}"); - routerset_union(tgt, src); - - tt_int_op(smartlist_len(tgt->list), OP_NE, 0); - - done: - routerset_free(src); - routerset_free(tgt); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_is_list - -/* - * Functional tests for routerset_is_list. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - addr_policy_t *policy; - int is_list; - (void)arg; - - /* len(set->country_names) == 0, len(set->policies) == 0 */ - set = routerset_new(); - is_list = routerset_is_list(set); - routerset_free(set); - set = NULL; - tt_int_op(is_list, OP_NE, 0); - - /* len(set->country_names) != 0, len(set->policies) == 0 */ - set = routerset_new(); - smartlist_add(set->country_names, tor_strndup("foo", 3)); - is_list = routerset_is_list(set); - routerset_free(set); - set = NULL; - tt_int_op(is_list, OP_EQ, 0); - - /* len(set->country_names) == 0, len(set->policies) != 0 */ - set = routerset_new(); - policy = tor_malloc_zero(sizeof(addr_policy_t)); - smartlist_add(set->policies, (void *)policy); - is_list = routerset_is_list(set); - routerset_free(set); - set = NULL; - tt_int_op(is_list, OP_EQ, 0); - - /* len(set->country_names) != 0, len(set->policies) != 0 */ - set = routerset_new(); - smartlist_add(set->country_names, tor_strndup("foo", 3)); - policy = tor_malloc_zero(sizeof(addr_policy_t)); - smartlist_add(set->policies, (void *)policy); - is_list = routerset_is_list(set); - routerset_free(set); - set = NULL; - tt_int_op(is_list, OP_EQ, 0); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_needs_geoip - -/* - * Functional tests for routerset_needs_geoip. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set; - int needs_geoip; - (void)arg; - - set = NULL; - needs_geoip = routerset_needs_geoip(set); - tt_int_op(needs_geoip, OP_EQ, 0); - - set = routerset_new(); - needs_geoip = routerset_needs_geoip(set); - routerset_free(set); - tt_int_op(needs_geoip, OP_EQ, 0); - set = NULL; - - set = routerset_new(); - smartlist_add(set->country_names, tor_strndup("xx", 2)); - needs_geoip = routerset_needs_geoip(set); - routerset_free(set); - set = NULL; - tt_int_op(needs_geoip, OP_NE, 0); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_is_empty - -/* - * Functional tests for routerset_is_empty. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = NULL; - int is_empty; - (void)arg; - - is_empty = routerset_is_empty(set); - tt_int_op(is_empty, OP_NE, 0); - - set = routerset_new(); - is_empty = routerset_is_empty(set); - routerset_free(set); - set = NULL; - tt_int_op(is_empty, OP_NE, 0); - - set = routerset_new(); - smartlist_add_strdup(set->list, "{xx}"); - is_empty = routerset_is_empty(set); - routerset_free(set); - set = NULL; - tt_int_op(is_empty, OP_EQ, 0); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, null_set_or_null_set_list) - -/* - * Functional test for routerset_contains, when given a NULL set or the - * set has a NULL list. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = NULL; - int contains; - (void)arg; - - contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); - - tt_int_op(contains, OP_EQ, 0); - - set = tor_malloc_zero(sizeof(routerset_t)); - set->list = NULL; - contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); - tor_free(set); - tt_int_op(contains, OP_EQ, 0); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_nickname) - -/* - * Functional test for routerset_contains, when given a valid routerset but a - * NULL nickname. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - char *nickname = NULL; - int contains; - (void)arg; - - contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_nickname) - -/* - * Functional test for routerset_contains, when given a valid routerset - * and the nickname is in the routerset. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - const char *nickname; - int contains; - (void)arg; - - nickname = "Foo"; /* This tests the lowercase comparison as well. */ - strmap_set_lc(set->names, nickname, (void *)1); - contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 4); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_nickname) - -/* - * Functional test for routerset_contains, when given a valid routerset - * and the nickname is not in the routerset. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains; - (void)arg; - - strmap_set_lc(set->names, "bar", (void *)1); - contains = routerset_contains(set, NULL, 0, "foo", NULL, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_digest) - -/* - * Functional test for routerset_contains, when given a valid routerset - * and the digest is contained in the routerset. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains; - uint8_t foo[20] = { 2, 3, 4 }; - (void)arg; - - digestmap_set(set->digests, (const char*)foo, (void *)1); - contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 4); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_digest) - -/* - * Functional test for routerset_contains, when given a valid routerset - * and the digest is not contained in the routerset. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains; - uint8_t bar[20] = { 9, 10, 11, 55 }; - uint8_t foo[20] = { 1, 2, 3, 4}; - (void)arg; - - digestmap_set(set->digests, (const char*)bar, (void *)1); - contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_digest) - -/* - * Functional test for routerset_contains, when given a valid routerset - * and the digest is NULL. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains; - uint8_t bar[20] = { 9, 10, 11, 55 }; - (void)arg; - - digestmap_set(set->digests, (const char*)bar, (void *)1); - contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_addr) - -/* - * Structural test for routerset_contains, when given a valid routerset - * and the address is rejected by policy. - */ - -NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); - -static tor_addr_t MOCK_TOR_ADDR; -#define MOCK_TOR_ADDR_PTR (&MOCK_TOR_ADDR) - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - tor_addr_t *addr = MOCK_TOR_ADDR_PTR; - int contains; - (void)arg; - - NS_MOCK(compare_tor_addr_to_addr_policy); - - contains = routerset_contains(set, addr, 0, NULL, NULL, 0); - routerset_free(set); - - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); - tt_int_op(contains, OP_EQ, 3); - - done: - ; -} - -addr_policy_result_t -NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - (void)port; - (void)policy; - CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - return ADDR_POLICY_REJECTED; - - done: - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_no_addr) - -/* - * Structural test for routerset_contains, when given a valid routerset - * and the address is not rejected by policy. - */ - -NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - tor_addr_t *addr = MOCK_TOR_ADDR_PTR; - int contains; - (void)arg; - - NS_MOCK(compare_tor_addr_to_addr_policy); - - contains = routerset_contains(set, addr, 0, NULL, NULL, 0); - routerset_free(set); - - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); - tt_int_op(contains, OP_EQ, 0); - - done: - ; -} - -addr_policy_result_t -NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - (void)port; - (void)policy; - CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - return ADDR_POLICY_ACCEPTED; - - done: - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, set_and_null_addr) - -/* - * Structural test for routerset_contains, when given a valid routerset - * and the address is NULL. - */ - -NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains; - (void)arg; - - NS_MOCK(compare_tor_addr_to_addr_policy); - - contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - - done: - ; -} - -addr_policy_result_t -NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - (void)port; - (void)policy; - CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - return ADDR_POLICY_ACCEPTED; - - done: - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, countries_no_geoip) - -/* - * Structural test for routerset_contains, when there is no matching country - * for the address. - */ - -NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); -NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains = 1; - (void)arg; - - NS_MOCK(compare_tor_addr_to_addr_policy); - NS_MOCK(geoip_get_country_by_addr); - - set->countries = bitarray_init_zero(1); - bitarray_set(set->countries, 1); - contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 0); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); - - done: - ; -} - -addr_policy_result_t -NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - (void)port; - (void)policy; - CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - done: - return ADDR_POLICY_ACCEPTED; -} - -int -NS(geoip_get_country_by_addr)(const tor_addr_t *addr) -{ - CALLED(geoip_get_country_by_addr)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - done: - return -1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains, countries_geoip) - -/* - * Structural test for routerset_contains, when there a matching country - * for the address. - */ - -NS_DECL(addr_policy_result_t, compare_tor_addr_to_addr_policy, - (const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)); -NS_DECL(int, geoip_get_country_by_addr, (const tor_addr_t *addr)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int contains = 1; - (void)arg; - - NS_MOCK(compare_tor_addr_to_addr_policy); - NS_MOCK(geoip_get_country_by_addr); - - set->n_countries = 2; - set->countries = bitarray_init_zero(1); - bitarray_set(set->countries, 1); - contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); - routerset_free(set); - - tt_int_op(contains, OP_EQ, 2); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); - tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); - - done: - ; -} - -addr_policy_result_t -NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, - const smartlist_t *policy) -{ - (void)port; - (void)policy; - CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - done: - return ADDR_POLICY_ACCEPTED; -} - -int -NS(geoip_get_country_by_addr)(const tor_addr_t *addr) -{ - CALLED(geoip_get_country_by_addr)++; - tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); - - done: - return 1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, only_flag_and_no_ccs) - -/* - * Functional test for routerset_add_unknown_ccs, where only_if_some_cc_set - * is set and there are no country names. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - routerset_t **setp = &set; - int r; - (void)arg; - - r = routerset_add_unknown_ccs(setp, 1); - - tt_int_op(r, OP_EQ, 0); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, creates_set) - -/* - * Functional test for routerset_add_unknown_ccs, where the set argument - * is created if passed in as NULL. - */ - -/* The mock is only used to stop the test from asserting erroneously. */ -NS_DECL(country_t, geoip_get_country, (const char *country)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = NULL; - routerset_t **setp = &set; - int r; - (void)arg; - - NS_MOCK(geoip_get_country); - - r = routerset_add_unknown_ccs(setp, 0); - - tt_ptr_op(*setp, OP_NE, NULL); - tt_int_op(r, OP_EQ, 0); - - done: - if (set != NULL) - routerset_free(set); -} - -country_t -NS(geoip_get_country)(const char *country) -{ - (void)country; - CALLED(geoip_get_country)++; - - return -1; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, add_unknown) - -/* - * Structural test for routerset_add_unknown_ccs, that the "{??}" - * country code is added to the list. - */ - -NS_DECL(country_t, geoip_get_country, (const char *country)); -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - routerset_t **setp = &set; - int r; - (void)arg; - - NS_MOCK(geoip_get_country); - NS_MOCK(geoip_is_loaded); - - r = routerset_add_unknown_ccs(setp, 0); - - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_contains_string(set->country_names, "??"), OP_EQ, 1); - tt_int_op(smartlist_contains_string(set->list, "{??}"), OP_EQ, 1); - - done: - if (set != NULL) - routerset_free(set); -} - -country_t -NS(geoip_get_country)(const char *country) -{ - int arg_is_qq, arg_is_a1; - - CALLED(geoip_get_country)++; - - arg_is_qq = !strcmp(country, "??"); - arg_is_a1 = !strcmp(country, "A1"); - - tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); - - if (arg_is_qq) - return 1; - - done: - return -1; -} - -int -NS(geoip_is_loaded)(sa_family_t family) -{ - CALLED(geoip_is_loaded)++; - - tt_int_op(family, OP_EQ, AF_INET); - - done: - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_add_unknown_ccs, add_a1) - -/* - * Structural test for routerset_add_unknown_ccs, that the "{a1}" - * country code is added to the list. - */ - -NS_DECL(country_t, geoip_get_country, (const char *country)); -NS_DECL(int, geoip_is_loaded, (sa_family_t family)); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - routerset_t **setp = &set; - int r; - (void)arg; - - NS_MOCK(geoip_get_country); - NS_MOCK(geoip_is_loaded); - - r = routerset_add_unknown_ccs(setp, 0); - - tt_int_op(r, OP_EQ, 1); - tt_int_op(smartlist_contains_string(set->country_names, "a1"), OP_EQ, 1); - tt_int_op(smartlist_contains_string(set->list, "{a1}"), OP_EQ, 1); - - done: - if (set != NULL) - routerset_free(set); -} - -country_t -NS(geoip_get_country)(const char *country) -{ - int arg_is_qq, arg_is_a1; - - CALLED(geoip_get_country)++; - - arg_is_qq = !strcmp(country, "??"); - arg_is_a1 = !strcmp(country, "A1"); - - tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); - - if (arg_is_a1) - return 1; - - done: - return -1; -} - -int -NS(geoip_is_loaded)(sa_family_t family) -{ - CALLED(geoip_is_loaded)++; - - tt_int_op(family, OP_EQ, AF_INET); - - done: - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_contains_extendinfo - -/* - * Functional test for routerset_contains_extendinfo. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - extend_info_t ei; - int r; - const char *nickname = "foo"; - (void)arg; - - memset(&ei, 0, sizeof(ei)); - strmap_set_lc(set->names, nickname, (void *)1); - strncpy(ei.nickname, nickname, sizeof(ei.nickname) - 1); - ei.nickname[sizeof(ei.nickname) - 1] = '\0'; - - r = routerset_contains_extendinfo(set, &ei); - - tt_int_op(r, OP_EQ, 4); - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_contains_router - -/* - * Functional test for routerset_contains_router. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - routerinfo_t ri; - country_t country = 1; - int r; - const char *nickname = "foo"; - (void)arg; - - memset(&ri, 0, sizeof(ri)); - strmap_set_lc(set->names, nickname, (void *)1); - ri.nickname = (char *)nickname; - - r = routerset_contains_router(set, &ri, country); - - tt_int_op(r, OP_EQ, 4); - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_contains_routerstatus - -/* - * Functional test for routerset_contains_routerstatus. - */ - -// XXX: This is a bit brief. It only populates and tests the nickname fields -// ie., enough to make the containment check succeed. Perhaps it should do -// a bit more or test a bit more. - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - routerstatus_t rs; - country_t country = 1; - int r; - const char *nickname = "foo"; - (void)arg; - - memset(&rs, 0, sizeof(rs)); - strmap_set_lc(set->names, nickname, (void *)1); - strncpy(rs.nickname, nickname, sizeof(rs.nickname) - 1); - rs.nickname[sizeof(rs.nickname) - 1] = '\0'; - - r = routerset_contains_routerstatus(set, &rs, country); - - tt_int_op(r, OP_EQ, 4); - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains_node, none) - -/* - * Functional test for routerset_contains_node, when the node has no - * routerset or routerinfo. - */ - -static node_t NS(mock_node); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int r; - (void)arg; - - NS(mock_node).ri = NULL; - NS(mock_node).rs = NULL; - - r = routerset_contains_node(set, &NS(mock_node)); - tt_int_op(r, OP_EQ, 0); - - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains_node, routerstatus) - -/* - * Functional test for routerset_contains_node, when the node has a - * routerset and no routerinfo. - */ - -static node_t NS(mock_node); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int r; - const char *nickname = "foo"; - routerstatus_t rs; - (void)arg; - - strmap_set_lc(set->names, nickname, (void *)1); - - strncpy(rs.nickname, nickname, sizeof(rs.nickname) - 1); - rs.nickname[sizeof(rs.nickname) - 1] = '\0'; - NS(mock_node).ri = NULL; - NS(mock_node).rs = &rs; - - r = routerset_contains_node(set, &NS(mock_node)); - - tt_int_op(r, OP_EQ, 4); - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_contains_node, routerinfo) - -/* - * Functional test for routerset_contains_node, when the node has no - * routerset and a routerinfo. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - int r; - const char *nickname = "foo"; - routerinfo_t ri; - node_t mock_node; - (void)arg; - - strmap_set_lc(set->names, nickname, (void *)1); - - ri.nickname = (char *)nickname; - mock_node.ri = &ri; - mock_node.rs = NULL; - - r = routerset_contains_node(set, &mock_node); - - tt_int_op(r, OP_EQ, 4); - done: - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, no_routerset) - -/* - * Functional test for routerset_get_all_nodes, when routerset is NULL or - * the routerset list is NULL. - */ - -static void -NS(test_main)(void *arg) -{ - smartlist_t *out = smartlist_new(); - routerset_t *set = NULL; - (void)arg; - - tt_int_op(smartlist_len(out), OP_EQ, 0); - routerset_get_all_nodes(out, NULL, NULL, 0); - - tt_int_op(smartlist_len(out), OP_EQ, 0); - - set = routerset_new(); - smartlist_free(set->list); - routerset_get_all_nodes(out, NULL, NULL, 0); - tt_int_op(smartlist_len(out), OP_EQ, 0); - - /* Just recreate list, so we can simply use routerset_free. */ - set->list = smartlist_new(); - - done: - routerset_free(set); - smartlist_free(out); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list_with_no_nodes) - -/* - * Structural test for routerset_get_all_nodes, when the routerset list - * is empty. - */ - -NS_DECL(const node_t *, node_get_by_nickname, - (const char *nickname, unsigned flags)); -static const char *NS(mock_nickname); - -static void -NS(test_main)(void *arg) -{ - smartlist_t *out = smartlist_new(); - routerset_t *set = routerset_new(); - int out_len; - (void)arg; - - NS_MOCK(node_get_by_nickname); - - NS(mock_nickname) = "foo"; - smartlist_add_strdup(set->list, NS(mock_nickname)); - - routerset_get_all_nodes(out, set, NULL, 0); - out_len = smartlist_len(out); - - smartlist_free(out); - routerset_free(set); - - tt_int_op(out_len, OP_EQ, 0); - tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); - - done: - ; -} - -const node_t * -NS(node_get_by_nickname)(const char *nickname, unsigned flags) -{ - CALLED(node_get_by_nickname)++; - tt_str_op(nickname, OP_EQ, NS(mock_nickname)); - tt_uint_op(flags, OP_EQ, 0); - - done: - return NULL; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list_flag_not_running) - -/* - * Structural test for routerset_get_all_nodes, with the running_only flag - * is set but the nodes are not running. - */ - -NS_DECL(const node_t *, node_get_by_nickname, - (const char *nickname, unsigned flags)); -static const char *NS(mock_nickname); -static node_t NS(mock_node); - -static void -NS(test_main)(void *arg) -{ - smartlist_t *out = smartlist_new(); - routerset_t *set = routerset_new(); - int out_len; - (void)arg; - - NS_MOCK(node_get_by_nickname); - - NS(mock_node).is_running = 0; - NS(mock_nickname) = "foo"; - smartlist_add_strdup(set->list, NS(mock_nickname)); - - routerset_get_all_nodes(out, set, NULL, 1); - out_len = smartlist_len(out); - - smartlist_free(out); - routerset_free(set); - - tt_int_op(out_len, OP_EQ, 0); - tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); - - done: - ; -} - -const node_t * -NS(node_get_by_nickname)(const char *nickname, unsigned flags) -{ - CALLED(node_get_by_nickname)++; - tt_str_op(nickname, OP_EQ, NS(mock_nickname)); - tt_int_op(flags, OP_EQ, 0); - - done: - return &NS(mock_node); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, list) - -/* - * Structural test for routerset_get_all_nodes. - */ - -NS_DECL(const node_t *, node_get_by_nickname, - (const char *nickname, unsigned flags)); -static char *NS(mock_nickname); -static node_t NS(mock_node); - -static void -NS(test_main)(void *arg) -{ - smartlist_t *out = smartlist_new(); - routerset_t *set = routerset_new(); - int out_len; - node_t *ent; - (void)arg; - - NS_MOCK(node_get_by_nickname); - - NS(mock_nickname) = tor_strdup("foo"); - smartlist_add(set->list, NS(mock_nickname)); - - routerset_get_all_nodes(out, set, NULL, 0); - out_len = smartlist_len(out); - ent = (node_t *)smartlist_get(out, 0); - - smartlist_free(out); - routerset_free(set); - - tt_int_op(out_len, OP_EQ, 1); - tt_ptr_op(ent, OP_EQ, &NS(mock_node)); - tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); - - done: - ; -} - -const node_t * -NS(node_get_by_nickname)(const char *nickname, unsigned flags) -{ - CALLED(node_get_by_nickname)++; - tt_str_op(nickname, OP_EQ, NS(mock_nickname)); - tt_int_op(flags, OP_EQ, 0); - - done: - return &NS(mock_node); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, nodelist_with_no_nodes) - -/* - * Structural test for routerset_get_all_nodes, when the nodelist has no nodes. - */ - -NS_DECL(smartlist_t *, nodelist_get_list, (void)); - -static smartlist_t *NS(mock_smartlist); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - smartlist_t *out = smartlist_new(); - int r; - (void)arg; - - NS_MOCK(nodelist_get_list); - - smartlist_add_strdup(set->country_names, "{xx}"); - NS(mock_smartlist) = smartlist_new(); - - routerset_get_all_nodes(out, set, NULL, 1); - r = smartlist_len(out); - routerset_free(set); - smartlist_free(out); - smartlist_free(NS(mock_smartlist)); - - tt_int_op(r, OP_EQ, 0); - tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); - - done: - ; -} - -smartlist_t * -NS(nodelist_get_list)(void) -{ - CALLED(nodelist_get_list)++; - - return NS(mock_smartlist); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_get_all_nodes, nodelist_flag_not_running) - -/* - * Structural test for routerset_get_all_nodes, with a non-list routerset - * the running_only flag is set, but the nodes are not running. - */ - -NS_DECL(smartlist_t *, nodelist_get_list, (void)); - -static smartlist_t *NS(mock_smartlist); -static node_t NS(mock_node); - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - smartlist_t *out = smartlist_new(); - int r; - (void)arg; - - NS_MOCK(nodelist_get_list); - - smartlist_add_strdup(set->country_names, "{xx}"); - NS(mock_smartlist) = smartlist_new(); - NS(mock_node).is_running = 0; - smartlist_add(NS(mock_smartlist), (void *)&NS(mock_node)); - - routerset_get_all_nodes(out, set, NULL, 1); - r = smartlist_len(out); - routerset_free(set); - smartlist_free(out); - smartlist_free(NS(mock_smartlist)); - - tt_int_op(r, OP_EQ, 0); - tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); - - done: - ; -} - -smartlist_t * -NS(nodelist_get_list)(void) -{ - CALLED(nodelist_get_list)++; - - return NS(mock_smartlist); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_subtract_nodes - -/* - * Functional test for routerset_subtract_nodes. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = routerset_new(); - smartlist_t *list = smartlist_new(); - const char *nickname = "foo"; - routerinfo_t ri; - node_t mock_node; - (void)arg; - - strmap_set_lc(set->names, nickname, (void *)1); - - ri.nickname = (char *)nickname; - mock_node.rs = NULL; - mock_node.ri = &ri; - smartlist_add(list, (void *)&mock_node); - - tt_int_op(smartlist_len(list), OP_NE, 0); - routerset_subtract_nodes(list, set); - - tt_int_op(smartlist_len(list), OP_EQ, 0); - done: - routerset_free(set); - smartlist_free(list); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_subtract_nodes, null_routerset) - -/* - * Functional test for routerset_subtract_nodes, with a NULL routerset. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = NULL; - smartlist_t *list = smartlist_new(); - const char *nickname = "foo"; - routerinfo_t ri; - node_t mock_node; - (void)arg; - - ri.nickname = (char *)nickname; - mock_node.ri = &ri; - smartlist_add(list, (void *)&mock_node); - - tt_int_op(smartlist_len(list), OP_NE, 0); - routerset_subtract_nodes(list, set); - - tt_int_op(smartlist_len(list), OP_NE, 0); - done: - routerset_free(set); - smartlist_free(list); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_to_string - -/* - * Functional test for routerset_to_string. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *set = NULL; - char *s = NULL; - (void)arg; - - set = NULL; - s = routerset_to_string(set); - tt_str_op(s, OP_EQ, ""); - tor_free(s); - - set = routerset_new(); - s = routerset_to_string(set); - tt_str_op(s, OP_EQ, ""); - tor_free(s); - routerset_free(set); set = NULL; - - set = routerset_new(); - smartlist_add(set->list, tor_strndup("a", 1)); - s = routerset_to_string(set); - tt_str_op(s, OP_EQ, "a"); - tor_free(s); - routerset_free(set); set = NULL; - - set = routerset_new(); - smartlist_add(set->list, tor_strndup("a", 1)); - smartlist_add(set->list, tor_strndup("b", 1)); - s = routerset_to_string(set); - tt_str_op(s, OP_EQ, "a,b"); - tor_free(s); - routerset_free(set); set = NULL; - - done: - tor_free(s); - routerset_free(set); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_equal, empty_empty) - -/* - * Functional test for routerset_equal, with both routersets empty. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *a = routerset_new(), *b = routerset_new(); - int r; - (void)arg; - - r = routerset_equal(a, b); - routerset_free(a); - routerset_free(b); - - tt_int_op(r, OP_EQ, 1); - - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_equal, empty_not_empty) - -/* - * Functional test for routerset_equal, with one routersets empty. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *a = routerset_new(), *b = routerset_new(); - int r; - (void)arg; - - smartlist_add_strdup(b->list, "{xx}"); - r = routerset_equal(a, b); - routerset_free(a); - routerset_free(b); - - tt_int_op(r, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_equal, differing_lengths) - -/* - * Functional test for routerset_equal, with the routersets having - * differing lengths. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *a = routerset_new(), *b = routerset_new(); - int r; - (void)arg; - - smartlist_add_strdup(a->list, "{aa}"); - smartlist_add_strdup(b->list, "{b1}"); - smartlist_add_strdup(b->list, "{b2}"); - r = routerset_equal(a, b); - routerset_free(a); - routerset_free(b); - - tt_int_op(r, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_equal, unequal) - -/* - * Functional test for routerset_equal, with the routersets being - * different. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *a = routerset_new(), *b = routerset_new(); - int r; - (void)arg; - - smartlist_add_strdup(a->list, "foo"); - smartlist_add_strdup(b->list, "bar"); - r = routerset_equal(a, b); - routerset_free(a); - routerset_free(b); - - tt_int_op(r, OP_EQ, 0); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_equal, equal) - -/* - * Functional test for routerset_equal, with the routersets being - * equal. - */ - -static void -NS(test_main)(void *arg) -{ - routerset_t *a = routerset_new(), *b = routerset_new(); - int r; - (void)arg; - - smartlist_add_strdup(a->list, "foo"); - smartlist_add_strdup(b->list, "foo"); - r = routerset_equal(a, b); - routerset_free(a); - routerset_free(b); - - tt_int_op(r, OP_EQ, 1); - done: - ; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(routerset_free, null_routerset) - -/* - * Structural test for routerset_free, where the routerset is NULL. - */ - -NS_DECL(void, smartlist_free_, (smartlist_t *sl)); - -static void -NS(test_main)(void *arg) -{ - (void)arg; - - NS_MOCK(smartlist_free_); - - routerset_free_(NULL); - - tt_int_op(CALLED(smartlist_free_), OP_EQ, 0); - - done: - ; -} - -void -NS(smartlist_free_)(smartlist_t *s) -{ - (void)s; - CALLED(smartlist_free_)++; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE routerset_free - -/* - * Structural test for routerset_free. - */ - -NS_DECL(void, smartlist_free_, (smartlist_t *sl)); -NS_DECL(void, strmap_free_,(strmap_t *map, void (*free_val)(void*))); -NS_DECL(void, digestmap_free_, (digestmap_t *map, void (*free_val)(void*))); - -static void -NS(test_main)(void *arg) -{ - routerset_t *routerset = routerset_new(); - (void)arg; - - NS_MOCK(smartlist_free_); - NS_MOCK(strmap_free_); - NS_MOCK(digestmap_free_); - - routerset_free(routerset); - - tt_int_op(CALLED(smartlist_free_), OP_NE, 0); - tt_int_op(CALLED(strmap_free_), OP_NE, 0); - tt_int_op(CALLED(digestmap_free_), OP_NE, 0); - - done: - ; -} - -void -NS(smartlist_free_)(smartlist_t *s) -{ - CALLED(smartlist_free_)++; - smartlist_free___real(s); -} - -void -NS(strmap_free_)(strmap_t *map, void (*free_val)(void*)) -{ - CALLED(strmap_free_)++; - strmap_free___real(map, free_val); -} - -void -NS(digestmap_free_)(digestmap_t *map, void (*free_val)(void*)) -{ - CALLED(digestmap_free_)++; - digestmap_free___real(map, free_val); -} - -#undef NS_SUBMODULE - -struct testcase_t routerset_tests[] = { - TEST_CASE(routerset_new), - TEST_CASE(routerset_get_countryname), - TEST_CASE(routerset_is_list), - TEST_CASE(routerset_needs_geoip), - TEST_CASE(routerset_is_empty), - TEST_CASE_ASPECT(routerset_contains, null_set_or_null_set_list), - TEST_CASE_ASPECT(routerset_contains, set_and_nickname), - TEST_CASE_ASPECT(routerset_contains, set_and_null_nickname), - TEST_CASE_ASPECT(routerset_contains, set_and_no_nickname), - TEST_CASE_ASPECT(routerset_contains, set_and_digest), - TEST_CASE_ASPECT(routerset_contains, set_and_no_digest), - TEST_CASE_ASPECT(routerset_contains, set_and_null_digest), - TEST_CASE_ASPECT(routerset_contains, set_and_addr), - TEST_CASE_ASPECT(routerset_contains, set_and_no_addr), - TEST_CASE_ASPECT(routerset_contains, set_and_null_addr), - TEST_CASE_ASPECT(routerset_contains, countries_no_geoip), - TEST_CASE_ASPECT(routerset_contains, countries_geoip), - TEST_CASE_ASPECT(routerset_add_unknown_ccs, only_flag_and_no_ccs), - TEST_CASE_ASPECT(routerset_add_unknown_ccs, creates_set), - TEST_CASE_ASPECT(routerset_add_unknown_ccs, add_unknown), - TEST_CASE_ASPECT(routerset_add_unknown_ccs, add_a1), - TEST_CASE(routerset_contains_extendinfo), - TEST_CASE(routerset_contains_router), - TEST_CASE(routerset_contains_routerstatus), - TEST_CASE_ASPECT(routerset_contains_node, none), - TEST_CASE_ASPECT(routerset_contains_node, routerinfo), - TEST_CASE_ASPECT(routerset_contains_node, routerstatus), - TEST_CASE_ASPECT(routerset_get_all_nodes, no_routerset), - TEST_CASE_ASPECT(routerset_get_all_nodes, list_with_no_nodes), - TEST_CASE_ASPECT(routerset_get_all_nodes, list_flag_not_running), - TEST_CASE_ASPECT(routerset_get_all_nodes, list), - TEST_CASE_ASPECT(routerset_get_all_nodes, nodelist_with_no_nodes), - TEST_CASE_ASPECT(routerset_get_all_nodes, nodelist_flag_not_running), - TEST_CASE_ASPECT(routerset_refresh_counties, geoip_not_loaded), - TEST_CASE_ASPECT(routerset_refresh_counties, no_countries), - TEST_CASE_ASPECT(routerset_refresh_counties, one_valid_country), - TEST_CASE_ASPECT(routerset_refresh_counties, one_invalid_country), - TEST_CASE_ASPECT(routerset_union, source_bad), - TEST_CASE_ASPECT(routerset_union, one), - TEST_CASE_ASPECT(routerset_parse, malformed), - TEST_CASE_ASPECT(routerset_parse, valid_hexdigest), - TEST_CASE_ASPECT(routerset_parse, valid_nickname), - TEST_CASE_ASPECT(routerset_parse, get_countryname), - TEST_CASE_ASPECT(routerset_parse, policy_wildcard), - TEST_CASE_ASPECT(routerset_parse, policy_ipv4), - TEST_CASE_ASPECT(routerset_parse, policy_ipv6), - TEST_CASE(routerset_subtract_nodes), - TEST_CASE_ASPECT(routerset_subtract_nodes, null_routerset), - TEST_CASE(routerset_to_string), - TEST_CASE_ASPECT(routerset_equal, empty_empty), - TEST_CASE_ASPECT(routerset_equal, empty_not_empty), - TEST_CASE_ASPECT(routerset_equal, differing_lengths), - TEST_CASE_ASPECT(routerset_equal, unequal), - TEST_CASE_ASPECT(routerset_equal, equal), - TEST_CASE_ASPECT(routerset_free, null_routerset), - TEST_CASE(routerset_free), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_rust.sh b/src/tor/src/test/test_rust.sh deleted file mode 100644 index 133f2bb94..000000000 --- a/src/tor/src/test/test_rust.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -# Test all Rust crates - -crates="protover tor_util smartlist tor_allocate" - -exitcode=0 - -set -e - -for crate in $crates; do - cd "${abs_top_builddir:-../../..}/src/rust" - CARGO_TARGET_DIR="${abs_top_builddir:-../../..}/src/rust/target" \ - CARGO_HOME="${abs_top_builddir:-../../..}/src/rust" \ - "${CARGO:-cargo}" test ${CARGO_ONLINE-"--frozen"} \ - --manifest-path "${abs_top_srcdir:-.}/src/rust/${crate}/Cargo.toml" \ - || exitcode=1 - cd - -done - -exit $exitcode diff --git a/src/tor/src/test/test_scheduler.c b/src/tor/src/test/test_scheduler.c deleted file mode 100644 index 0d8a9eaa1..000000000 --- a/src/tor/src/test/test_scheduler.c +++ /dev/null @@ -1,1072 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include -#include - -#define SCHEDULER_KIST_PRIVATE -#define TOR_CHANNEL_INTERNAL_ -#define CHANNEL_PRIVATE_ -#include "or.h" -#include "config.h" -#include "compat_libevent.h" -#include "channel.h" -#include "channeltls.h" -#include "connection.h" -#include "networkstatus.h" -#define SCHEDULER_PRIVATE_ -#include "scheduler.h" - -/* Test suite stuff */ -#include "test.h" -#include "fakechans.h" - -/* Shamelessly stolen from compat_libevent.c */ -#define V(major, minor, patch) \ - (((major) << 24) | ((minor) << 16) | ((patch) << 8)) - -/****************************************************************************** - * Statistical info - *****************************************************************************/ -static int scheduler_compare_channels_mock_ctr = 0; -static int scheduler_run_mock_ctr = 0; - -/****************************************************************************** - * Utility functions and things we need to mock - *****************************************************************************/ -static or_options_t mocked_options; -static const or_options_t * -mock_get_options(void) -{ - return &mocked_options; -} - -static void -cleanup_scheduler_options(void) -{ - if (mocked_options.SchedulerTypes_) { - SMARTLIST_FOREACH(mocked_options.SchedulerTypes_, int *, i, tor_free(i)); - smartlist_free(mocked_options.SchedulerTypes_); - mocked_options.SchedulerTypes_ = NULL; - } -} - -static void -set_scheduler_options(int val) -{ - int *type; - - if (mocked_options.SchedulerTypes_ == NULL) { - mocked_options.SchedulerTypes_ = smartlist_new(); - } - type = tor_malloc_zero(sizeof(int)); - *type = val; - smartlist_add(mocked_options.SchedulerTypes_, type); -} - -static void -clear_options(void) -{ - cleanup_scheduler_options(); - memset(&mocked_options, 0, sizeof(mocked_options)); -} - -static int32_t -mock_vanilla_networkstatus_get_param( - const networkstatus_t *ns, const char *param_name, int32_t default_val, - int32_t min_val, int32_t max_val) -{ - (void)ns; - (void)default_val; - (void)min_val; - (void)max_val; - // only support KISTSchedRunInterval right now - tor_assert(strcmp(param_name, "KISTSchedRunInterval")==0); - return 0; -} - -static int32_t -mock_kist_networkstatus_get_param( - const networkstatus_t *ns, const char *param_name, int32_t default_val, - int32_t min_val, int32_t max_val) -{ - (void)ns; - (void)default_val; - (void)min_val; - (void)max_val; - // only support KISTSchedRunInterval right now - tor_assert(strcmp(param_name, "KISTSchedRunInterval")==0); - return 12; -} - -/* Event base for scheduelr tests */ -static struct event_base *mock_event_base = NULL; -/* Setup for mock event stuff */ -static void mock_event_free_all(void); -static void mock_event_init(void); -static void -mock_event_free_all(void) -{ - tt_ptr_op(mock_event_base, OP_NE, NULL); - - if (mock_event_base) { - event_base_free(mock_event_base); - mock_event_base = NULL; - } - - tt_ptr_op(mock_event_base, OP_EQ, NULL); - - done: - return; -} - -static void -mock_event_init(void) -{ - struct event_config *cfg = NULL; - - tt_ptr_op(mock_event_base, OP_EQ, NULL); - - /* - * Really cut down from tor_libevent_initialize of - * src/common/compat_libevent.c to kill config dependencies - */ - - if (!mock_event_base) { - cfg = event_config_new(); -#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) - /* We can enable changelist support with epoll, since we don't give - * Libevent any dup'd fds. This lets us avoid some syscalls. */ - event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); -#endif - mock_event_base = event_base_new_with_config(cfg); - event_config_free(cfg); - } - - tt_ptr_op(mock_event_base, OP_NE, NULL); - - done: - return; -} - -static struct event_base * -tor_libevent_get_base_mock(void) -{ - return mock_event_base; -} - -static int -scheduler_compare_channels_mock(const void *c1_v, - const void *c2_v) -{ - uintptr_t p1, p2; - - p1 = (uintptr_t)(c1_v); - p2 = (uintptr_t)(c2_v); - - ++scheduler_compare_channels_mock_ctr; - - if (p1 == p2) return 0; - else if (p1 < p2) return 1; - else return -1; -} - -static void -scheduler_run_noop_mock(void) -{ - ++scheduler_run_mock_ctr; -} - -static circuitmux_t *mock_ccm_tgt_1 = NULL; -static circuitmux_t *mock_ccm_tgt_2 = NULL; -static circuitmux_t *mock_cgp_tgt_1 = NULL; -static circuitmux_policy_t *mock_cgp_val_1 = NULL; -static circuitmux_t *mock_cgp_tgt_2 = NULL; -static circuitmux_policy_t *mock_cgp_val_2 = NULL; - -static const circuitmux_policy_t * -circuitmux_get_policy_mock(circuitmux_t *cmux) -{ - const circuitmux_policy_t *result = NULL; - - tt_assert(cmux != NULL); - if (cmux) { - if (cmux == mock_cgp_tgt_1) result = mock_cgp_val_1; - else if (cmux == mock_cgp_tgt_2) result = mock_cgp_val_2; - else result = circuitmux_get_policy__real(cmux); - } - - done: - return result; -} - -static int -circuitmux_compare_muxes_mock(circuitmux_t *cmux_1, - circuitmux_t *cmux_2) -{ - int result = 0; - - tt_assert(cmux_1 != NULL); - tt_assert(cmux_2 != NULL); - - if (cmux_1 != cmux_2) { - if (cmux_1 == mock_ccm_tgt_1 && cmux_2 == mock_ccm_tgt_2) result = -1; - else if (cmux_1 == mock_ccm_tgt_2 && cmux_2 == mock_ccm_tgt_1) { - result = 1; - } else { - if (cmux_1 == mock_ccm_tgt_1 || cmux_1 == mock_ccm_tgt_2) result = -1; - else if (cmux_2 == mock_ccm_tgt_1 || cmux_2 == mock_ccm_tgt_2) { - result = 1; - } else { - result = circuitmux_compare_muxes__real(cmux_1, cmux_2); - } - } - } - /* else result = 0 always */ - - done: - return result; -} - -typedef struct { - const channel_t *chan; - ssize_t cells; -} flush_mock_channel_t; - -static smartlist_t *chans_for_flush_mock = NULL; - -static void -channel_flush_some_cells_mock_free_all(void) -{ - if (chans_for_flush_mock) { - SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, - flush_mock_channel_t *, - flush_mock_ch) { - SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); - tor_free(flush_mock_ch); - } SMARTLIST_FOREACH_END(flush_mock_ch); - - smartlist_free(chans_for_flush_mock); - chans_for_flush_mock = NULL; - } -} - -static void -channel_flush_some_cells_mock_set(channel_t *chan, ssize_t num_cells) -{ - int found = 0; - - if (!chan) return; - if (num_cells <= 0) return; - - if (!chans_for_flush_mock) { - chans_for_flush_mock = smartlist_new(); - } - - SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, - flush_mock_channel_t *, - flush_mock_ch) { - if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { - if (flush_mock_ch->chan == chan) { - /* Found it */ - flush_mock_ch->cells = num_cells; - found = 1; - break; - } - } else { - /* That shouldn't be there... */ - SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); - tor_free(flush_mock_ch); - } - } SMARTLIST_FOREACH_END(flush_mock_ch); - - if (! found) { - /* The loop didn't find it */ - flush_mock_channel_t *flush_mock_ch; - flush_mock_ch = tor_malloc_zero(sizeof(*flush_mock_ch)); - flush_mock_ch->chan = chan; - flush_mock_ch->cells = num_cells; - smartlist_add(chans_for_flush_mock, flush_mock_ch); - } -} - -static int -channel_more_to_flush_mock(channel_t *chan) -{ - tor_assert(chan); - - flush_mock_channel_t *found_mock_ch = NULL; - - SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, - flush_mock_channel_t *, - flush_mock_ch) { - if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { - if (flush_mock_ch->chan == chan) { - /* Found it */ - found_mock_ch = flush_mock_ch; - break; - } - } else { - /* That shouldn't be there... */ - SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); - tor_free(flush_mock_ch); - } - } SMARTLIST_FOREACH_END(flush_mock_ch); - - tor_assert(found_mock_ch); - - /* Check if any circuits would like to queue some */ - /* special for the mock: return the number of cells (instead of 1), or zero - * if nothing to flush */ - return (found_mock_ch->cells > 0 ? (int)found_mock_ch->cells : 0 ); -} - -static void -channel_write_to_kernel_mock(channel_t *chan) -{ - (void)chan; - //log_debug(LD_SCHED, "chan=%d writing to kernel", - // (int)chan->global_identifier); -} - -static int -channel_should_write_to_kernel_mock(outbuf_table_t *ot, channel_t *chan) -{ - (void)ot; - (void)chan; - return 1; - /* We could make this more complicated if we wanted. But I don't think doing - * so tests much of anything */ - //static int called_counter = 0; - //if (++called_counter >= 3) { - // called_counter -= 3; - // log_debug(LD_SCHED, "chan=%d should write to kernel", - // (int)chan->global_identifier); - // return 1; - //} - //return 0; -} - -static ssize_t -channel_flush_some_cells_mock(channel_t *chan, ssize_t num_cells) -{ - ssize_t flushed = 0, max; - char unlimited = 0; - flush_mock_channel_t *found = NULL; - - tt_ptr_op(chan, OP_NE, NULL); - if (chan) { - if (num_cells < 0) { - num_cells = 0; - unlimited = 1; - } - - /* Check if we have it */ - if (chans_for_flush_mock != NULL) { - SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, - flush_mock_channel_t *, - flush_mock_ch) { - if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { - if (flush_mock_ch->chan == chan) { - /* Found it */ - found = flush_mock_ch; - break; - } - } else { - /* That shouldn't be there... */ - SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); - tor_free(flush_mock_ch); - } - } SMARTLIST_FOREACH_END(flush_mock_ch); - - if (found) { - /* We found one */ - if (found->cells < 0) found->cells = 0; - - if (unlimited) max = found->cells; - else max = MIN(found->cells, num_cells); - - flushed += max; - found->cells -= max; - } - } - } - - done: - return flushed; -} - -static void -update_socket_info_impl_mock(socket_table_ent_t *ent) -{ - ent->cwnd = ent->unacked = ent->mss = ent->notsent = 0; - ent->limit = INT_MAX; -} - -static void -perform_channel_state_tests(int KISTSchedRunInterval, int sched_type) -{ - channel_t *ch1 = NULL, *ch2 = NULL; - int old_count; - - /* setup options so we're sure about what sched we are running */ - MOCK(get_options, mock_get_options); - clear_options(); - mocked_options.KISTSchedRunInterval = KISTSchedRunInterval; - set_scheduler_options(sched_type); - - /* Set up libevent and scheduler */ - mock_event_init(); - MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); - scheduler_init(); - /* - * Install the compare channels mock so we can test - * scheduler_touch_channel(). - */ - MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); - /* - * Disable scheduler_run so we can just check the state transitions - * without having to make everything it might call work too. - */ - ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock; - - tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); - - /* Set up a fake channel */ - ch1 = new_fake_channel(); - tt_assert(ch1); - - /* Start it off in OPENING */ - ch1->state = CHANNEL_STATE_OPENING; - /* Try to register it */ - channel_register(ch1); - tt_assert(ch1->registered); - - /* It should start off in SCHED_CHAN_IDLE */ - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); - - /* Now get another one */ - ch2 = new_fake_channel(); - tt_assert(ch2); - ch2->state = CHANNEL_STATE_OPENING; - channel_register(ch2); - tt_assert(ch2->registered); - - /* Send ch1 to SCHED_CHAN_WAITING_TO_WRITE */ - scheduler_channel_has_waiting_cells(ch1); - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); - - /* This should send it to SCHED_CHAN_PENDING */ - scheduler_channel_wants_writes(ch1); - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); - - /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ - scheduler_channel_wants_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - - /* Drop ch2 back to idle */ - scheduler_channel_doesnt_want_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); - - /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ - scheduler_channel_wants_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - - /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ - scheduler_channel_has_waiting_cells(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); - - /* This should send ch2 to SCHED_CHAN_WAITING_TO_WRITE */ - scheduler_channel_doesnt_want_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); - - /* ...and back to SCHED_CHAN_PENDING */ - scheduler_channel_wants_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); - - /* Now we exercise scheduler_touch_channel */ - old_count = scheduler_compare_channels_mock_ctr; - scheduler_touch_channel(ch1); - tt_assert(scheduler_compare_channels_mock_ctr > old_count); - - /* Close */ - channel_mark_for_close(ch1); - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING); - channel_mark_for_close(ch2); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); - channel_closed(ch1); - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED); - ch1 = NULL; - channel_closed(ch2); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED); - ch2 = NULL; - - /* Shut things down */ - - channel_free_all(); - scheduler_free_all(); - mock_event_free_all(); - - done: - tor_free(ch1); - tor_free(ch2); - - UNMOCK(scheduler_compare_channels); - UNMOCK(tor_libevent_get_base); - UNMOCK(get_options); - cleanup_scheduler_options(); - - return; -} - -static void -test_scheduler_compare_channels(void *arg) -{ - /* We don't actually need whole fake channels... */ - channel_t c1, c2; - /* ...and some dummy circuitmuxes too */ - circuitmux_t *cm1 = NULL, *cm2 = NULL; - int result; - - (void)arg; - - /* We can't actually see sizeof(circuitmux_t) from here */ - cm1 = tor_malloc_zero(sizeof(void *)); - cm2 = tor_malloc_zero(sizeof(void *)); - - c1.cmux = cm1; - c2.cmux = cm2; - - /* Configure circuitmux_get_policy() mock */ - mock_cgp_tgt_1 = cm1; - mock_cgp_tgt_2 = cm2; - - /* - * This is to test the different-policies case, which uses the policy - * cast to an uintptr_t as an arbitrary but definite thing to compare. - */ - mock_cgp_val_1 = tor_malloc_zero(16); - mock_cgp_val_2 = tor_malloc_zero(16); - if ( ((uintptr_t) mock_cgp_val_1) > ((uintptr_t) mock_cgp_val_2) ) { - void *tmp = mock_cgp_val_1; - mock_cgp_val_1 = mock_cgp_val_2; - mock_cgp_val_2 = tmp; - } - - MOCK(circuitmux_get_policy, circuitmux_get_policy_mock); - - /* Now set up circuitmux_compare_muxes() mock using cm1/cm2 */ - mock_ccm_tgt_1 = cm1; - mock_ccm_tgt_2 = cm2; - MOCK(circuitmux_compare_muxes, circuitmux_compare_muxes_mock); - - /* Equal-channel case */ - result = scheduler_compare_channels(&c1, &c1); - tt_int_op(result, OP_EQ, 0); - - /* Distinct channels, distinct policies */ - result = scheduler_compare_channels(&c1, &c2); - tt_int_op(result, OP_EQ, -1); - result = scheduler_compare_channels(&c2, &c1); - tt_int_op(result, OP_EQ, 1); - - /* Distinct channels, same policy */ - tor_free(mock_cgp_val_2); - mock_cgp_val_2 = mock_cgp_val_1; - result = scheduler_compare_channels(&c1, &c2); - tt_int_op(result, OP_EQ, -1); - result = scheduler_compare_channels(&c2, &c1); - tt_int_op(result, OP_EQ, 1); - - done: - - UNMOCK(circuitmux_compare_muxes); - mock_ccm_tgt_1 = NULL; - mock_ccm_tgt_2 = NULL; - - UNMOCK(circuitmux_get_policy); - mock_cgp_tgt_1 = NULL; - mock_cgp_tgt_2 = NULL; - - tor_free(cm1); - tor_free(cm2); - - if (mock_cgp_val_1 != mock_cgp_val_2) - tor_free(mock_cgp_val_1); - tor_free(mock_cgp_val_2); - mock_cgp_val_1 = NULL; - mock_cgp_val_2 = NULL; - - return; -} - -/****************************************************************************** - * The actual tests! - *****************************************************************************/ - -static void -test_scheduler_loop_vanilla(void *arg) -{ - (void)arg; - channel_t *ch1 = NULL, *ch2 = NULL; - void (*run_func_ptr)(void); - - /* setup options so we're sure about what sched we are running */ - MOCK(get_options, mock_get_options); - clear_options(); - set_scheduler_options(SCHEDULER_VANILLA); - mocked_options.KISTSchedRunInterval = 0; - - /* Set up libevent and scheduler */ - - mock_event_init(); - MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); - scheduler_init(); - /* - * Install the compare channels mock so we can test - * scheduler_touch_channel(). - */ - MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); - /* - * Disable scheduler_run so we can just check the state transitions - * without having to make everything it might call work too. - */ - run_func_ptr = the_scheduler->run; - ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock; - - tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); - - /* Set up a fake channel */ - ch1 = new_fake_channel(); - ch1->magic = TLS_CHAN_MAGIC; - tt_assert(ch1); - - /* Start it off in OPENING */ - ch1->state = CHANNEL_STATE_OPENING; - /* Try to register it */ - channel_register(ch1); - tt_assert(ch1->registered); - /* Finish opening it */ - channel_change_state_open(ch1); - - /* It should start off in SCHED_CHAN_IDLE */ - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); - - /* Now get another one */ - ch2 = new_fake_channel(); - ch2->magic = TLS_CHAN_MAGIC; - tt_assert(ch2); - ch2->state = CHANNEL_STATE_OPENING; - channel_register(ch2); - tt_assert(ch2->registered); - /* - * Don't open ch2; then channel_num_cells_writeable() will return - * zero and we'll get coverage of that exception case in scheduler_run() - */ - - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING); - - /* Send it to SCHED_CHAN_WAITING_TO_WRITE */ - scheduler_channel_has_waiting_cells(ch1); - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE); - - /* This should send it to SCHED_CHAN_PENDING */ - scheduler_channel_wants_writes(ch1); - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 1); - - /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ - scheduler_channel_wants_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - - /* Drop ch2 back to idle */ - scheduler_channel_doesnt_want_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); - - /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ - scheduler_channel_wants_writes(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - - /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ - scheduler_channel_has_waiting_cells(ch2); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); - - /* - * Now we've got two pending channels and need to fire off - * the scheduler run() that we kept. - */ - run_func_ptr(); - - /* - * Assert that they're still in the states we left and aren't still - * pending - */ - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING); - tt_assert(ch1->scheduler_state != SCHED_CHAN_PENDING); - tt_assert(ch2->scheduler_state != SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 0); - - /* Now, finish opening ch2, and get both back to pending */ - channel_change_state_open(ch2); - scheduler_channel_wants_writes(ch1); - scheduler_channel_wants_writes(ch2); - scheduler_channel_has_waiting_cells(ch1); - scheduler_channel_has_waiting_cells(ch2); - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPEN); - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(channels_pending), OP_EQ, 2); - - /* Now, set up the channel_flush_some_cells() mock */ - MOCK(channel_flush_some_cells, channel_flush_some_cells_mock); - /* - * 16 cells on ch1 means it'll completely drain into the 32 cells - * fakechan's num_cells_writeable() returns. - */ - channel_flush_some_cells_mock_set(ch1, 16); - /* - * This one should get sent back to pending, since num_cells_writeable() - * will still return non-zero. - */ - channel_flush_some_cells_mock_set(ch2, 48); - - /* - * And re-run the scheduler run() loop with non-zero returns from - * channel_flush_some_cells() this time. - */ - run_func_ptr(); - - /* - * ch1 should have gone to SCHED_CHAN_WAITING_FOR_CELLS, with 16 flushed - * and 32 writeable. - */ - tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - /* - * ...ch2 should also have gone to SCHED_CHAN_WAITING_FOR_CELLS, with - * channel_more_to_flush() returning false and channel_num_cells_writeable() - * > 0/ - */ - tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS); - - /* Close */ - channel_mark_for_close(ch1); - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING); - channel_mark_for_close(ch2); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING); - channel_closed(ch1); - tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED); - ch1 = NULL; - channel_closed(ch2); - tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED); - ch2 = NULL; - - /* Shut things down */ - channel_flush_some_cells_mock_free_all(); - channel_free_all(); - scheduler_free_all(); - mock_event_free_all(); - - done: - tor_free(ch1); - tor_free(ch2); - cleanup_scheduler_options(); - - UNMOCK(channel_flush_some_cells); - UNMOCK(scheduler_compare_channels); - UNMOCK(tor_libevent_get_base); - UNMOCK(get_options); -} - -static void -test_scheduler_loop_kist(void *arg) -{ - (void) arg; - -#ifndef HAVE_KIST_SUPPORT - return; -#endif - - channel_t *ch1 = new_fake_channel(), *ch2 = new_fake_channel(); - channel_t *ch3 = new_fake_channel(); - - /* setup options so we're sure about what sched we are running */ - MOCK(get_options, mock_get_options); - MOCK(channel_flush_some_cells, channel_flush_some_cells_mock); - MOCK(channel_more_to_flush, channel_more_to_flush_mock); - MOCK(channel_write_to_kernel, channel_write_to_kernel_mock); - MOCK(channel_should_write_to_kernel, channel_should_write_to_kernel_mock); - MOCK(update_socket_info_impl, update_socket_info_impl_mock); - clear_options(); - mocked_options.KISTSchedRunInterval = 11; - set_scheduler_options(SCHEDULER_KIST); - scheduler_init(); - - tt_assert(ch1); - ch1->magic = TLS_CHAN_MAGIC; - ch1->state = CHANNEL_STATE_OPENING; - channel_register(ch1); - tt_assert(ch1->registered); - channel_change_state_open(ch1); - scheduler_channel_has_waiting_cells(ch1); - scheduler_channel_wants_writes(ch1); - channel_flush_some_cells_mock_set(ch1, 5); - - tt_assert(ch2); - ch2->magic = TLS_CHAN_MAGIC; - ch2->state = CHANNEL_STATE_OPENING; - channel_register(ch2); - tt_assert(ch2->registered); - channel_change_state_open(ch2); - scheduler_channel_has_waiting_cells(ch2); - scheduler_channel_wants_writes(ch2); - channel_flush_some_cells_mock_set(ch2, 5); - - the_scheduler->run(); - - scheduler_channel_has_waiting_cells(ch1); - channel_flush_some_cells_mock_set(ch1, 5); - - the_scheduler->run(); - - scheduler_channel_has_waiting_cells(ch1); - channel_flush_some_cells_mock_set(ch1, 5); - scheduler_channel_has_waiting_cells(ch2); - channel_flush_some_cells_mock_set(ch2, 5); - - the_scheduler->run(); - - channel_flush_some_cells_mock_free_all(); - - /* We'll try to run this closed channel threw the scheduler loop and make - * sure it ends up in the right state. */ - tt_assert(ch3); - ch3->magic = TLS_CHAN_MAGIC; - ch3->state = CHANNEL_STATE_OPEN; - ch3->cmux = circuitmux_alloc(); - channel_register(ch3); - tt_assert(ch3->registered); - - ch3->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; - scheduler_channel_has_waiting_cells(ch3); - /* Should be in the pending list now waiting to be handled. */ - tt_int_op(ch3->scheduler_state, OP_EQ, SCHED_CHAN_PENDING); - tt_int_op(smartlist_len(get_channels_pending()), OP_EQ, 1); - /* By running the scheduler on a closed channel, it should end up in the - * IDLE state and not in the pending channel list. */ - ch3->state = CHANNEL_STATE_CLOSED; - the_scheduler->run(); - tt_int_op(ch3->scheduler_state, OP_EQ, SCHED_CHAN_IDLE); - tt_int_op(smartlist_len(get_channels_pending()), OP_EQ, 0); - - done: - /* Prep the channel so the free() function doesn't explode. */ - ch1->state = ch2->state = ch3->state = CHANNEL_STATE_CLOSED; - ch1->registered = ch2->registered = ch3->registered = 0; - channel_free(ch1); - channel_free(ch2); - channel_free(ch3); - UNMOCK(update_socket_info_impl); - UNMOCK(channel_should_write_to_kernel); - UNMOCK(channel_write_to_kernel); - UNMOCK(channel_more_to_flush); - UNMOCK(channel_flush_some_cells); - UNMOCK(get_options); - scheduler_free_all(); - return; -} - -static void -test_scheduler_channel_states(void *arg) -{ - (void)arg; - perform_channel_state_tests(-1, SCHEDULER_VANILLA); - perform_channel_state_tests(11, SCHEDULER_KIST_LITE); -#ifdef HAVE_KIST_SUPPORT - perform_channel_state_tests(11, SCHEDULER_KIST); -#endif -} - -static void -test_scheduler_initfree(void *arg) -{ - (void)arg; - - tt_ptr_op(channels_pending, ==, NULL); - tt_ptr_op(run_sched_ev, ==, NULL); - - mock_event_init(); - MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); - MOCK(get_options, mock_get_options); - set_scheduler_options(SCHEDULER_KIST); - set_scheduler_options(SCHEDULER_KIST_LITE); - set_scheduler_options(SCHEDULER_VANILLA); - - scheduler_init(); - - tt_ptr_op(channels_pending, !=, NULL); - tt_ptr_op(run_sched_ev, !=, NULL); - /* We have specified nothing in the torrc and there's no consensus so the - * KIST scheduler is what should be in use */ - tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); - tt_int_op(sched_run_interval, ==, 10); - - scheduler_free_all(); - - UNMOCK(tor_libevent_get_base); - mock_event_free_all(); - - tt_ptr_op(channels_pending, ==, NULL); - tt_ptr_op(run_sched_ev, ==, NULL); - - done: - UNMOCK(get_options); - cleanup_scheduler_options(); - return; -} - -static void -test_scheduler_can_use_kist(void *arg) -{ - (void)arg; - - int res_should, res_freq; - MOCK(get_options, mock_get_options); - - /* Test force enabling of KIST */ - clear_options(); - mocked_options.KISTSchedRunInterval = 1234; - res_should = scheduler_can_use_kist(); - res_freq = kist_scheduler_run_interval(NULL); -#ifdef HAVE_KIST_SUPPORT - tt_int_op(res_should, ==, 1); -#else /* HAVE_KIST_SUPPORT */ - tt_int_op(res_should, ==, 0); -#endif /* HAVE_KIST_SUPPORT */ - tt_int_op(res_freq, ==, 1234); - - /* Test defer to consensus, but no consensus available */ - clear_options(); - mocked_options.KISTSchedRunInterval = 0; - res_should = scheduler_can_use_kist(); - res_freq = kist_scheduler_run_interval(NULL); -#ifdef HAVE_KIST_SUPPORT - tt_int_op(res_should, ==, 1); -#else /* HAVE_KIST_SUPPORT */ - tt_int_op(res_should, ==, 0); -#endif /* HAVE_KIST_SUPPORT */ - tt_int_op(res_freq, ==, 10); - - /* Test defer to consensus, and kist consensus available */ - MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); - clear_options(); - mocked_options.KISTSchedRunInterval = 0; - res_should = scheduler_can_use_kist(); - res_freq = kist_scheduler_run_interval(NULL); -#ifdef HAVE_KIST_SUPPORT - tt_int_op(res_should, ==, 1); -#else /* HAVE_KIST_SUPPORT */ - tt_int_op(res_should, ==, 0); -#endif /* HAVE_KIST_SUPPORT */ - tt_int_op(res_freq, ==, 12); - UNMOCK(networkstatus_get_param); - - /* Test defer to consensus, and vanilla consensus available */ - MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); - clear_options(); - mocked_options.KISTSchedRunInterval = 0; - res_should = scheduler_can_use_kist(); - res_freq = kist_scheduler_run_interval(NULL); - tt_int_op(res_should, ==, 0); - tt_int_op(res_freq, ==, 0); - UNMOCK(networkstatus_get_param); - - done: - UNMOCK(get_options); - return; -} - -static void -test_scheduler_ns_changed(void *arg) -{ - (void) arg; - - /* - * Currently no scheduler implementations use the old/new consensuses passed - * in scheduler_notify_networkstatus_changed, so it is okay to pass NULL. - * - * "But then what does test actually exercise???" It tests that - * scheduler_notify_networkstatus_changed fetches the correct value from the - * consensus, and then switches the scheduler if necessasry. - */ - - MOCK(get_options, mock_get_options); - clear_options(); - set_scheduler_options(SCHEDULER_KIST); - set_scheduler_options(SCHEDULER_VANILLA); - - tt_ptr_op(the_scheduler, ==, NULL); - - /* Change from vanilla to kist via consensus */ - the_scheduler = get_vanilla_scheduler(); - MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); - scheduler_notify_networkstatus_changed(NULL, NULL); - UNMOCK(networkstatus_get_param); -#ifdef HAVE_KIST_SUPPORT - tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); -#else - tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); -#endif - - /* Change from kist to vanilla via consensus */ - the_scheduler = get_kist_scheduler(); - MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); - scheduler_notify_networkstatus_changed(NULL, NULL); - UNMOCK(networkstatus_get_param); - tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); - - /* Doesn't change when using KIST */ - the_scheduler = get_kist_scheduler(); - MOCK(networkstatus_get_param, mock_kist_networkstatus_get_param); - scheduler_notify_networkstatus_changed(NULL, NULL); - UNMOCK(networkstatus_get_param); -#ifdef HAVE_KIST_SUPPORT - tt_ptr_op(the_scheduler, ==, get_kist_scheduler()); -#else - tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); -#endif - - /* Doesn't change when using vanilla */ - the_scheduler = get_vanilla_scheduler(); - MOCK(networkstatus_get_param, mock_vanilla_networkstatus_get_param); - scheduler_notify_networkstatus_changed(NULL, NULL); - UNMOCK(networkstatus_get_param); - tt_ptr_op(the_scheduler, ==, get_vanilla_scheduler()); - - done: - UNMOCK(get_options); - cleanup_scheduler_options(); - return; -} - -struct testcase_t scheduler_tests[] = { - { "compare_channels", test_scheduler_compare_channels, - TT_FORK, NULL, NULL }, - { "channel_states", test_scheduler_channel_states, TT_FORK, NULL, NULL }, - { "initfree", test_scheduler_initfree, TT_FORK, NULL, NULL }, - { "loop_vanilla", test_scheduler_loop_vanilla, TT_FORK, NULL, NULL }, - { "loop_kist", test_scheduler_loop_kist, TT_FORK, NULL, NULL }, - { "ns_changed", test_scheduler_ns_changed, TT_FORK, NULL, NULL}, - { "should_use_kist", test_scheduler_can_use_kist, TT_FORK, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_shared_random.c b/src/tor/src/test/test_shared_random.c deleted file mode 100644 index 96494904e..000000000 --- a/src/tor/src/test/test_shared_random.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* Copyright (c) 2016-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define SHARED_RANDOM_PRIVATE -#define SHARED_RANDOM_STATE_PRIVATE -#define CONFIG_PRIVATE -#define DIRVOTE_PRIVATE - -#include "or.h" -#include "test.h" -#include "config.h" -#include "dirvote.h" -#include "shared_random.h" -#include "shared_random_state.h" -#include "routerkeys.h" -#include "routerlist.h" -#include "router.h" -#include "routerparse.h" -#include "networkstatus.h" -#include "log_test_helpers.h" - -static authority_cert_t *mock_cert; - -static authority_cert_t * -get_my_v3_authority_cert_m(void) -{ - tor_assert(mock_cert); - return mock_cert; -} - -static dir_server_t ds; - -static dir_server_t * -trusteddirserver_get_by_v3_auth_digest_m(const char *digest) -{ - (void) digest; - /* The shared random code only need to know if a valid pointer to a dir - * server object has been found so this is safe because it won't use the - * pointer at all never. */ - return &ds; -} - -/* Setup a minimal dirauth environment by initializing the SR state and - * making sure the options are set to be an authority directory. */ -static void -init_authority_state(void) -{ - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - - or_options_t *options = get_options_mutable(); - mock_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - tt_assert(mock_cert); - options->AuthoritativeDir = 1; - tt_int_op(load_ed_keys(options, time(NULL)), OP_GE, 0); - sr_state_init(0, 0); - /* It's possible a commit has been generated in our state depending on - * the phase we are currently in which uses "now" as the starting - * timestamp. Delete it before we do any testing below. */ - sr_state_delete_commits(); - - done: - UNMOCK(get_my_v3_authority_cert); -} - -static void -test_get_sr_protocol_phase(void *arg) -{ - time_t the_time; - sr_phase_t phase; - int retval; - - (void) arg; - - /* Initialize SR state */ - init_authority_state(); - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 23:59:00 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:00 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:01 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 11:59:00 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:00 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:01 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); - } - - { - retval = parse_rfc1123_time("Wed, 20 Apr 2015 13:00:00 UTC", &the_time); - tt_int_op(retval, OP_EQ, 0); - - phase = get_sr_protocol_phase(the_time); - tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL); - } - - done: - ; -} - -static networkstatus_t mock_consensus; - -/* Mock function to immediately return our local 'mock_consensus'. */ -static networkstatus_t * -mock_networkstatus_get_live_consensus(time_t now) -{ - (void) now; - return &mock_consensus; -} - -static void -test_get_state_valid_until_time(void *arg) -{ - time_t current_time; - time_t valid_until_time; - char tbuf[ISO_TIME_LEN + 1]; - int retval; - - (void) arg; - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", - &mock_consensus.fresh_until); - tt_int_op(retval, OP_EQ, 0); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - &mock_consensus.valid_after); - tt_int_op(retval, OP_EQ, 0); - - { - /* Get the valid until time if called at 00:00:01 */ - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - valid_until_time = get_state_valid_until_time(current_time); - - /* Compare it with the correct result */ - format_iso_time(tbuf, valid_until_time); - tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 19:22:00 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - valid_until_time = get_state_valid_until_time(current_time); - - format_iso_time(tbuf, valid_until_time); - tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:00 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - valid_until_time = get_state_valid_until_time(current_time); - - format_iso_time(tbuf, valid_until_time); - tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - valid_until_time = get_state_valid_until_time(current_time); - - format_iso_time(tbuf, valid_until_time); - tt_str_op("2015-04-21 00:00:00", OP_EQ, tbuf); - } - - done: - UNMOCK(networkstatus_get_live_consensus); -} - -/** Test the function that calculates the start time of the current SRV - * protocol run. */ -static void -test_get_start_time_of_current_run(void *arg) -{ - int retval; - char tbuf[ISO_TIME_LEN + 1]; - time_t current_time, run_start_time; - - (void) arg; - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", - &mock_consensus.fresh_until); - tt_int_op(retval, OP_EQ, 0); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - &mock_consensus.valid_after); - tt_int_op(retval, OP_EQ, 0); - - { - /* Get start time if called at 00:00:01 */ - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - run_start_time = - sr_state_get_start_time_of_current_protocol_run(current_time); - - /* Compare it with the correct result */ - format_iso_time(tbuf, run_start_time); - tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:59 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - run_start_time = - sr_state_get_start_time_of_current_protocol_run(current_time); - - /* Compare it with the correct result */ - format_iso_time(tbuf, run_start_time); - tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); - } - - { - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - run_start_time = - sr_state_get_start_time_of_current_protocol_run(current_time); - - /* Compare it with the correct result */ - format_iso_time(tbuf, run_start_time); - tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf); - } - - /* Next test is testing it without a consensus to use the testing voting - * interval . */ - UNMOCK(networkstatus_get_live_consensus); - - /* Now let's alter the voting schedule and check the correctness of the - * function. Voting interval of 10 seconds, means that an SRV protocol run - * takes 10 seconds * 24 rounds = 4 mins */ - { - or_options_t *options = get_options_mutable(); - options->V3AuthVotingInterval = 10; - options->TestingV3AuthInitialVotingInterval = 10; - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:15:32 UTC", - ¤t_time); - tt_int_op(retval, OP_EQ, 0); - dirvote_recalculate_timing(get_options(), current_time); - run_start_time = - sr_state_get_start_time_of_current_protocol_run(current_time); - - /* Compare it with the correct result */ - format_iso_time(tbuf, run_start_time); - tt_str_op("2015-04-20 00:12:00", OP_EQ, tbuf); - } - - done: - ; -} - -/** Do some rudimentary consistency checks between the functions that - * understand the shared random protocol schedule */ -static void -test_get_start_time_functions(void *arg) -{ - (void) arg; - int retval; - - MOCK(networkstatus_get_live_consensus, - mock_networkstatus_get_live_consensus); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 01:00:00 UTC", - &mock_consensus.fresh_until); - tt_int_op(retval, OP_EQ, 0); - - retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC", - &mock_consensus.valid_after); - tt_int_op(retval, OP_EQ, 0); - time_t now = mock_consensus.valid_after; - - dirvote_recalculate_timing(get_options(), now); - time_t start_time_of_protocol_run = - sr_state_get_start_time_of_current_protocol_run(now); - tt_assert(start_time_of_protocol_run); - - /* Check that the round start time of the beginning of the run, is itself */ - tt_int_op(get_start_time_of_current_round(), OP_EQ, - start_time_of_protocol_run); - - done: - UNMOCK(networkstatus_get_live_consensus); -} - -static void -test_get_sr_protocol_duration(void *arg) -{ - (void) arg; - - /* Check that by default an SR phase is 12 hours */ - tt_int_op(sr_state_get_phase_duration(), OP_EQ, 12*60*60); - tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 24*60*60); - - /* Now alter the voting interval and check that the SR phase is 2 mins long - * if voting happens every 10 seconds (10*12 seconds = 2 mins) */ - or_options_t *options = get_options_mutable(); - options->V3AuthVotingInterval = 10; - tt_int_op(sr_state_get_phase_duration(), OP_EQ, 2*60); - tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 4*60); - - done: ; -} - -/* In this test we are going to generate a sr_commit_t object and validate - * it. We first generate our values, and then we parse them as if they were - * received from the network. After we parse both the commit and the reveal, - * we verify that they indeed match. */ -static void -test_sr_commit(void *arg) -{ - authority_cert_t *auth_cert = NULL; - time_t now = time(NULL); - sr_commit_t *our_commit = NULL; - smartlist_t *args = smartlist_new(); - sr_commit_t *parsed_commit = NULL; - - (void) arg; - - { /* Setup a minimal dirauth environment for this test */ - or_options_t *options = get_options_mutable(); - - auth_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - tt_assert(auth_cert); - - options->AuthoritativeDir = 1; - tt_int_op(load_ed_keys(options, time(NULL)), OP_GE, 0); - } - - /* Generate our commit object and validate it has the appropriate field - * that we can then use to build a representation that we'll find in a - * vote coming from the network. */ - { - sr_commit_t test_commit; - our_commit = sr_generate_our_commit(now, auth_cert); - tt_assert(our_commit); - /* Default and only supported algorithm for now. */ - tt_assert(our_commit->alg == DIGEST_SHA3_256); - /* We should have a reveal value. */ - tt_assert(commit_has_reveal_value(our_commit)); - /* We should have a random value. */ - tt_assert(!tor_mem_is_zero((char *) our_commit->random_number, - sizeof(our_commit->random_number))); - /* Commit and reveal timestamp should be the same. */ - tt_u64_op(our_commit->commit_ts, OP_EQ, our_commit->reveal_ts); - /* We should have a hashed reveal. */ - tt_assert(!tor_mem_is_zero(our_commit->hashed_reveal, - sizeof(our_commit->hashed_reveal))); - /* Do we have a valid encoded commit and reveal. Note the following only - * tests if the generated values are correct. Their could be a bug in - * the decode function but we test them seperately. */ - tt_int_op(0, OP_EQ, reveal_decode(our_commit->encoded_reveal, - &test_commit)); - tt_int_op(0, OP_EQ, commit_decode(our_commit->encoded_commit, - &test_commit)); - tt_int_op(0, OP_EQ, verify_commit_and_reveal(our_commit)); - } - - /* Let's make sure our verify commit and reveal function works. We'll - * make it fail a bit with known failure case. */ - { - /* Copy our commit so we don't alter it for the rest of testing. */ - sr_commit_t test_commit; - memcpy(&test_commit, our_commit, sizeof(test_commit)); - - /* Timestamp MUST match. */ - test_commit.commit_ts = test_commit.reveal_ts - 42; - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit)); - expect_log_msg_containing("doesn't match reveal timestamp"); - teardown_capture_of_logs(); - memcpy(&test_commit, our_commit, sizeof(test_commit)); - tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit)); - - /* Hashed reveal must match the H(encoded_reveal). */ - memset(test_commit.hashed_reveal, 'X', - sizeof(test_commit.hashed_reveal)); - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit)); - expect_single_log_msg_containing("doesn't match the commit value"); - teardown_capture_of_logs(); - memcpy(&test_commit, our_commit, sizeof(test_commit)); - tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit)); - } - - /* We'll build a list of values from our commit that our parsing function - * takes from a vote line and see if we can parse it correctly. */ - { - smartlist_add_strdup(args, "1"); - smartlist_add_strdup(args, - crypto_digest_algorithm_get_name(our_commit->alg)); - smartlist_add_strdup(args, sr_commit_get_rsa_fpr(our_commit)); - smartlist_add_strdup(args, our_commit->encoded_commit); - smartlist_add_strdup(args, our_commit->encoded_reveal); - parsed_commit = sr_parse_commit(args); - tt_assert(parsed_commit); - /* That parsed commit should be _EXACTLY_ like our original commit (we - * have to explicitly set the valid flag though). */ - parsed_commit->valid = 1; - tt_mem_op(parsed_commit, OP_EQ, our_commit, sizeof(*parsed_commit)); - /* Cleanup */ - } - - done: - teardown_capture_of_logs(); - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - sr_commit_free(our_commit); - sr_commit_free(parsed_commit); - authority_cert_free(auth_cert); -} - -/* Test the encoding and decoding function for commit and reveal values. */ -static void -test_encoding(void *arg) -{ - (void) arg; - int ret; - /* Random number is 32 bytes. */ - char raw_rand[32]; - time_t ts = 1454333590; - char hashed_rand[DIGEST256_LEN], hashed_reveal[DIGEST256_LEN]; - sr_commit_t parsed_commit; - - /* Those values were generated by sr_commit_calc_ref.py where the random - * value is 32 'A' and timestamp is the one in ts. */ - static const char *encoded_reveal = - "AAAAAFavXpZJxbwTupvaJCTeIUCQmOPxAMblc7ChL5H2nZKuGchdaA=="; - static const char *encoded_commit = - "AAAAAFavXpbkBMzMQG7aNoaGLFNpm2Wkk1ozXhuWWqL//GynltxVAg=="; - - /* Set up our raw random bytes array. */ - memset(raw_rand, 'A', sizeof(raw_rand)); - /* Hash random number because we don't expose bytes of the RNG. */ - ret = crypto_digest256(hashed_rand, raw_rand, - sizeof(raw_rand), SR_DIGEST_ALG); - tt_int_op(0, OP_EQ, ret); - /* Hash reveal value. */ - tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, strlen(encoded_reveal)); - ret = crypto_digest256(hashed_reveal, encoded_reveal, - strlen(encoded_reveal), SR_DIGEST_ALG); - tt_int_op(0, OP_EQ, ret); - tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, strlen(encoded_commit)); - - /* Test our commit/reveal decode functions. */ - { - /* Test the reveal encoded value. */ - tt_int_op(0, OP_EQ, reveal_decode(encoded_reveal, &parsed_commit)); - tt_u64_op(ts, OP_EQ, parsed_commit.reveal_ts); - tt_mem_op(hashed_rand, OP_EQ, parsed_commit.random_number, - sizeof(hashed_rand)); - - /* Test the commit encoded value. */ - memset(&parsed_commit, 0, sizeof(parsed_commit)); - tt_int_op(0, OP_EQ, commit_decode(encoded_commit, &parsed_commit)); - tt_u64_op(ts, OP_EQ, parsed_commit.commit_ts); - tt_mem_op(encoded_commit, OP_EQ, parsed_commit.encoded_commit, - sizeof(parsed_commit.encoded_commit)); - tt_mem_op(hashed_reveal, OP_EQ, parsed_commit.hashed_reveal, - sizeof(hashed_reveal)); - } - - /* Test our commit/reveal encode functions. */ - { - /* Test the reveal encode. */ - char encoded[SR_REVEAL_BASE64_LEN + 1]; - parsed_commit.reveal_ts = ts; - memcpy(parsed_commit.random_number, hashed_rand, - sizeof(parsed_commit.random_number)); - ret = reveal_encode(&parsed_commit, encoded, sizeof(encoded)); - tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, ret); - tt_mem_op(encoded_reveal, OP_EQ, encoded, strlen(encoded_reveal)); - } - - { - /* Test the commit encode. */ - char encoded[SR_COMMIT_BASE64_LEN + 1]; - parsed_commit.commit_ts = ts; - memcpy(parsed_commit.hashed_reveal, hashed_reveal, - sizeof(parsed_commit.hashed_reveal)); - ret = commit_encode(&parsed_commit, encoded, sizeof(encoded)); - tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, ret); - tt_mem_op(encoded_commit, OP_EQ, encoded, strlen(encoded_commit)); - } - - done: - ; -} - -/** Setup some SRVs in our SR state. If also_current is set, then set - * both current and previous SRVs. - * Helper of test_vote() and test_sr_compute_srv(). */ -static void -test_sr_setup_srv(int also_current) -{ - sr_srv_t *srv = tor_malloc_zero(sizeof(sr_srv_t)); - srv->num_reveals = 42; - memcpy(srv->value, - "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", - sizeof(srv->value)); - - sr_state_set_previous_srv(srv); - - if (also_current) { - srv = tor_malloc_zero(sizeof(sr_srv_t)); - srv->num_reveals = 128; - memcpy(srv->value, - "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", - sizeof(srv->value)); - - sr_state_set_current_srv(srv); - } -} - -/* Test anything that has to do with SR protocol and vote. */ -static void -test_vote(void *arg) -{ - int ret; - time_t now = time(NULL); - sr_commit_t *our_commit = NULL; - - (void) arg; - - MOCK(trusteddirserver_get_by_v3_auth_digest, - trusteddirserver_get_by_v3_auth_digest_m); - - { /* Setup a minimal dirauth environment for this test */ - init_authority_state(); - /* Set ourself in reveal phase so we can parse the reveal value in the - * vote as well. */ - set_sr_phase(SR_PHASE_REVEAL); - } - - /* Generate our commit object and validate it has the appropriate field - * that we can then use to build a representation that we'll find in a - * vote coming from the network. */ - { - sr_commit_t *saved_commit; - our_commit = sr_generate_our_commit(now, mock_cert); - tt_assert(our_commit); - sr_state_add_commit(our_commit); - /* Make sure it's there. */ - saved_commit = sr_state_get_commit(our_commit->rsa_identity); - tt_assert(saved_commit); - } - - /* Also setup the SRVs */ - test_sr_setup_srv(1); - - { /* Now test the vote generation */ - smartlist_t *chunks = smartlist_new(); - smartlist_t *tokens = smartlist_new(); - /* Get our vote line and validate it. */ - char *lines = sr_get_string_for_vote(); - tt_assert(lines); - /* Split the lines. We expect 2 here. */ - ret = smartlist_split_string(chunks, lines, "\n", SPLIT_IGNORE_BLANK, 0); - tt_int_op(ret, OP_EQ, 4); - tt_str_op(smartlist_get(chunks, 0), OP_EQ, "shared-rand-participate"); - /* Get our commitment line and will validate it agains our commit. The - * format is as follow: - * "shared-rand-commitment" SP version SP algname SP identity - * SP COMMIT [SP REVEAL] NL - */ - char *commit_line = smartlist_get(chunks, 1); - tt_assert(commit_line); - ret = smartlist_split_string(tokens, commit_line, " ", 0, 0); - tt_int_op(ret, OP_EQ, 6); - tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-commit"); - tt_str_op(smartlist_get(tokens, 1), OP_EQ, "1"); - tt_str_op(smartlist_get(tokens, 2), OP_EQ, - crypto_digest_algorithm_get_name(DIGEST_SHA3_256)); - char digest[DIGEST_LEN]; - base16_decode(digest, sizeof(digest), smartlist_get(tokens, 3), - HEX_DIGEST_LEN); - tt_mem_op(digest, OP_EQ, our_commit->rsa_identity, sizeof(digest)); - tt_str_op(smartlist_get(tokens, 4), OP_EQ, our_commit->encoded_commit); - tt_str_op(smartlist_get(tokens, 5), OP_EQ, our_commit->encoded_reveal) -; - /* Finally, does this vote line creates a valid commit object? */ - smartlist_t *args = smartlist_new(); - smartlist_add(args, smartlist_get(tokens, 1)); - smartlist_add(args, smartlist_get(tokens, 2)); - smartlist_add(args, smartlist_get(tokens, 3)); - smartlist_add(args, smartlist_get(tokens, 4)); - smartlist_add(args, smartlist_get(tokens, 5)); - sr_commit_t *parsed_commit = sr_parse_commit(args); - tt_assert(parsed_commit); - /* Set valid flag explicitly here to compare since it's not set by - * simply parsing the commit. */ - parsed_commit->valid = 1; - tt_mem_op(parsed_commit, OP_EQ, our_commit, sizeof(*our_commit)); - - /* minor cleanup */ - SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); - smartlist_clear(tokens); - - /* Now test the previous SRV */ - char *prev_srv_line = smartlist_get(chunks, 2); - tt_assert(prev_srv_line); - ret = smartlist_split_string(tokens, prev_srv_line, " ", 0, 0); - tt_int_op(ret, OP_EQ, 3); - tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-previous-value"); - tt_str_op(smartlist_get(tokens, 1), OP_EQ, "42"); - tt_str_op(smartlist_get(tokens, 2), OP_EQ, - "WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo="); - - /* minor cleanup */ - SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); - smartlist_clear(tokens); - - /* Now test the current SRV */ - char *current_srv_line = smartlist_get(chunks, 3); - tt_assert(current_srv_line); - ret = smartlist_split_string(tokens, current_srv_line, " ", 0, 0); - tt_int_op(ret, OP_EQ, 3); - tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-current-value"); - tt_str_op(smartlist_get(tokens, 1), OP_EQ, "128"); - tt_str_op(smartlist_get(tokens, 2), OP_EQ, - "Tk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4="); - - /* Clean up */ - sr_commit_free(parsed_commit); - SMARTLIST_FOREACH(chunks, char *, s, tor_free(s)); - smartlist_free(chunks); - SMARTLIST_FOREACH(tokens, char *, s, tor_free(s)); - smartlist_free(tokens); - smartlist_clear(args); - smartlist_free(args); - tor_free(lines); - } - - done: - sr_commit_free(our_commit); - UNMOCK(trusteddirserver_get_by_v3_auth_digest); -} - -static const char *sr_state_str = "Version 1\n" - "TorVersion 0.2.9.0-alpha-dev\n" - "ValidAfter 2037-04-19 07:16:00\n" - "ValidUntil 2037-04-20 07:16:00\n" - "Commit 1 sha3-256 FA3CEC2C99DC68D3166B9B6E4FA21A4026C2AB1C " - "7M8GdubCAAdh7WUG0DiwRyxTYRKji7HATa7LLJEZ/UAAAAAAVmfUSg== " - "AAAAAFZn1EojfIheIw42bjK3VqkpYyjsQFSbv/dxNna3Q8hUEPKpOw==\n" - "Commit 1 sha3-256 41E89EDFBFBA44983E21F18F2230A4ECB5BFB543 " - "17aUsYuMeRjd2N1r8yNyg7aHqRa6gf4z7QPoxxAZbp0AAAAAVmfUSg==\n" - "Commit 1 sha3-256 36637026573A04110CF3E6B1D201FB9A98B88734 " - "DDDYtripvdOU+XPEUm5xpU64d9IURSds1xSwQsgeB8oAAAAAVmfUSg==\n" - "SharedRandPreviousValue 4 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=\n" - "SharedRandCurrentValue 3 8dWeW12KEzTGEiLGgO1UVJ7Z91CekoRcxt6Q9KhnOFI=\n"; - -/** Create an SR disk state, parse it and validate that the parsing went - * well. Yes! */ -static void -test_state_load_from_disk(void *arg) -{ - int ret; - char *dir = tor_strdup(get_fname("test_sr_state")); - char *sr_state_path = tor_strdup(get_fname("test_sr_state/sr_state")); - sr_state_t *the_sr_state = NULL; - - (void) arg; - - MOCK(trusteddirserver_get_by_v3_auth_digest, - trusteddirserver_get_by_v3_auth_digest_m); - - /* First try with a nonexistent path. */ - ret = disk_state_load_from_disk_impl("NONEXISTENTNONEXISTENT"); - tt_int_op(ret, OP_EQ, -ENOENT); - - /* Now create a mock state directory and state file */ -#ifdef _WIN32 - ret = mkdir(dir); -#else - ret = mkdir(dir, 0700); -#endif - tt_int_op(ret, OP_EQ, 0); - ret = write_str_to_file(sr_state_path, sr_state_str, 0); - tt_int_op(ret, OP_EQ, 0); - - /* Try to load the directory itself. Should fail. */ - ret = disk_state_load_from_disk_impl(dir); - tt_int_op(ret, OP_LT, 0); - - /* State should be non-existent at this point. */ - the_sr_state = get_sr_state(); - tt_ptr_op(the_sr_state, OP_EQ, NULL); - - /* Now try to load the correct file! */ - ret = disk_state_load_from_disk_impl(sr_state_path); - tt_int_op(ret, OP_EQ, 0); - - /* Check the content of the state */ - /* XXX check more deeply!!! */ - the_sr_state = get_sr_state(); - tt_assert(the_sr_state); - tt_assert(the_sr_state->version == 1); - tt_assert(digestmap_size(the_sr_state->commits) == 3); - tt_assert(the_sr_state->current_srv); - tt_assert(the_sr_state->current_srv->num_reveals == 3); - tt_assert(the_sr_state->previous_srv); - - /* XXX Now also try loading corrupted state files and make sure parsing - fails */ - - done: - tor_free(dir); - tor_free(sr_state_path); - UNMOCK(trusteddirserver_get_by_v3_auth_digest); -} - -/** Generate three specially crafted commits (based on the test - * vector at sr_srv_calc_ref.py). Helper of test_sr_compute_srv(). */ -static void -test_sr_setup_commits(void) -{ - time_t now = time(NULL); - sr_commit_t *commit_a, *commit_b, *commit_c, *commit_d; - sr_commit_t *place_holder = tor_malloc_zero(sizeof(*place_holder)); - authority_cert_t *auth_cert = NULL; - - { /* Setup a minimal dirauth environment for this test */ - or_options_t *options = get_options_mutable(); - - auth_cert = authority_cert_parse_from_string(AUTHORITY_CERT_1, NULL); - tt_assert(auth_cert); - - options->AuthoritativeDir = 1; - tt_int_op(0, OP_EQ, load_ed_keys(options, now)); - } - - /* Generate three dummy commits according to sr_srv_calc_ref.py . Then - register them to the SR state. Also register a fourth commit 'd' with no - reveal info, to make sure that it will get ignored during SRV - calculation. */ - - { /* Commit from auth 'a' */ - commit_a = sr_generate_our_commit(now, auth_cert); - tt_assert(commit_a); - - /* Do some surgery on the commit */ - memset(commit_a->rsa_identity, 'A', sizeof(commit_a->rsa_identity)); - base16_encode(commit_a->rsa_identity_hex, - sizeof(commit_a->rsa_identity_hex), commit_a->rsa_identity, - sizeof(commit_a->rsa_identity)); - strlcpy(commit_a->encoded_reveal, - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - sizeof(commit_a->encoded_reveal)); - memcpy(commit_a->hashed_reveal, - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - sizeof(commit_a->hashed_reveal)); - } - - { /* Commit from auth 'b' */ - commit_b = sr_generate_our_commit(now, auth_cert); - tt_assert(commit_b); - - /* Do some surgery on the commit */ - memset(commit_b->rsa_identity, 'B', sizeof(commit_b->rsa_identity)); - base16_encode(commit_b->rsa_identity_hex, - sizeof(commit_b->rsa_identity_hex), commit_b->rsa_identity, - sizeof(commit_b->rsa_identity)); - strlcpy(commit_b->encoded_reveal, - "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - sizeof(commit_b->encoded_reveal)); - memcpy(commit_b->hashed_reveal, - "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", - sizeof(commit_b->hashed_reveal)); - } - - { /* Commit from auth 'c' */ - commit_c = sr_generate_our_commit(now, auth_cert); - tt_assert(commit_c); - - /* Do some surgery on the commit */ - memset(commit_c->rsa_identity, 'C', sizeof(commit_c->rsa_identity)); - base16_encode(commit_c->rsa_identity_hex, - sizeof(commit_c->rsa_identity_hex), commit_c->rsa_identity, - sizeof(commit_c->rsa_identity)); - strlcpy(commit_c->encoded_reveal, - "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", - sizeof(commit_c->encoded_reveal)); - memcpy(commit_c->hashed_reveal, - "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", - sizeof(commit_c->hashed_reveal)); - } - - { /* Commit from auth 'd' */ - commit_d = sr_generate_our_commit(now, auth_cert); - tt_assert(commit_d); - - /* Do some surgery on the commit */ - memset(commit_d->rsa_identity, 'D', sizeof(commit_d->rsa_identity)); - base16_encode(commit_d->rsa_identity_hex, - sizeof(commit_d->rsa_identity_hex), commit_d->rsa_identity, - sizeof(commit_d->rsa_identity)); - strlcpy(commit_d->encoded_reveal, - "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", - sizeof(commit_d->encoded_reveal)); - memcpy(commit_d->hashed_reveal, - "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", - sizeof(commit_d->hashed_reveal)); - /* Clean up its reveal info */ - memcpy(place_holder, commit_d, sizeof(*place_holder)); - memset(commit_d->encoded_reveal, 0, sizeof(commit_d->encoded_reveal)); - tt_assert(!commit_has_reveal_value(commit_d)); - } - - /* Register commits to state (during commit phase) */ - set_sr_phase(SR_PHASE_COMMIT); - save_commit_to_state(commit_a); - save_commit_to_state(commit_b); - save_commit_to_state(commit_c); - save_commit_to_state(commit_d); - tt_int_op(digestmap_size(get_sr_state()->commits), OP_EQ, 4); - - /* Now during REVEAL phase save commit D by restoring its reveal. */ - set_sr_phase(SR_PHASE_REVEAL); - save_commit_to_state(place_holder); - tt_str_op(commit_d->encoded_reveal, OP_EQ, - "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"); - /* Go back to an empty encoded reveal value. */ - memset(commit_d->encoded_reveal, 0, sizeof(commit_d->encoded_reveal)); - memset(commit_d->random_number, 0, sizeof(commit_d->random_number)); - tt_assert(!commit_has_reveal_value(commit_d)); - - done: - authority_cert_free(auth_cert); -} - -/** Verify that the SRV generation procedure is proper by testing it against - * the test vector from ./sr_srv_calc_ref.py. */ -static void -test_sr_compute_srv(void *arg) -{ - (void) arg; - const sr_srv_t *current_srv = NULL; - -#define SRV_TEST_VECTOR \ - "2A9B1D6237DAB312A40F575DA85C147663E7ED3F80E9555395F15B515C74253D" - - MOCK(trusteddirserver_get_by_v3_auth_digest, - trusteddirserver_get_by_v3_auth_digest_m); - - init_authority_state(); - - /* Setup the commits for this unittest */ - test_sr_setup_commits(); - test_sr_setup_srv(0); - - /* Now switch to reveal phase */ - set_sr_phase(SR_PHASE_REVEAL); - - /* Compute the SRV */ - sr_compute_srv(); - - /* Check the result against the test vector */ - current_srv = sr_state_get_current_srv(); - tt_assert(current_srv); - tt_u64_op(current_srv->num_reveals, OP_EQ, 3); - tt_str_op(hex_str((char*)current_srv->value, 32), - OP_EQ, - SRV_TEST_VECTOR); - - done: - UNMOCK(trusteddirserver_get_by_v3_auth_digest); -} - -/** Return a minimal vote document with a current SRV value set to - * srv. */ -static networkstatus_t * -get_test_vote_with_curr_srv(const char *srv) -{ - networkstatus_t *vote = tor_malloc_zero(sizeof(networkstatus_t)); - - vote->type = NS_TYPE_VOTE; - vote->sr_info.participate = 1; - vote->sr_info.current_srv = tor_malloc_zero(sizeof(sr_srv_t)); - vote->sr_info.current_srv->num_reveals = 42; - memcpy(vote->sr_info.current_srv->value, - srv, - sizeof(vote->sr_info.current_srv->value)); - - return vote; -} - -/* Test the function that picks the right SRV given a bunch of votes. Make sure - * that the function returns an SRV iff the majority/agreement requirements are - * met. */ -static void -test_sr_get_majority_srv_from_votes(void *arg) -{ - sr_srv_t *chosen_srv; - smartlist_t *votes = smartlist_new(); - -#define SRV_1 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -#define SRV_2 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - - (void) arg; - - init_authority_state(); - /* Make sure our SRV is fresh so we can consider the super majority with - * the consensus params of number of agreements needed. */ - sr_state_set_fresh_srv(); - - /* The test relies on the dirauth list being initialized. */ - clear_dir_servers(); - add_default_trusted_dir_authorities(V3_DIRINFO); - - { /* Prepare voting environment with just a single vote. */ - networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); - smartlist_add(votes, vote); - } - - /* Since it's only one vote with an SRV, it should not achieve majority and - hence no SRV will be returned. */ - chosen_srv = get_majority_srv_from_votes(votes, 1); - tt_ptr_op(chosen_srv, OP_EQ, NULL); - - { /* Now put in 8 more votes. Let SRV_1 have majority. */ - int i; - /* Now 7 votes believe in SRV_1 */ - for (i = 0; i < 3; i++) { - networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); - smartlist_add(votes, vote); - } - /* and 2 votes believe in SRV_2 */ - for (i = 0; i < 2; i++) { - networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_2); - smartlist_add(votes, vote); - } - for (i = 0; i < 3; i++) { - networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1); - smartlist_add(votes, vote); - } - - tt_int_op(smartlist_len(votes), OP_EQ, 9); - } - - /* Now we achieve majority for SRV_1, but not the AuthDirNumSRVAgreements - requirement. So still not picking an SRV. */ - set_num_srv_agreements(8); - chosen_srv = get_majority_srv_from_votes(votes, 1); - tt_ptr_op(chosen_srv, OP_EQ, NULL); - - /* We will now lower the AuthDirNumSRVAgreements requirement by tweaking the - * consensus parameter and we will try again. This time it should work. */ - set_num_srv_agreements(7); - chosen_srv = get_majority_srv_from_votes(votes, 1); - tt_assert(chosen_srv); - tt_u64_op(chosen_srv->num_reveals, OP_EQ, 42); - tt_mem_op(chosen_srv->value, OP_EQ, SRV_1, sizeof(chosen_srv->value)); - - done: - SMARTLIST_FOREACH(votes, networkstatus_t *, vote, - networkstatus_vote_free(vote)); - smartlist_free(votes); -} - -static void -test_utils(void *arg) -{ - (void) arg; - - /* Testing srv_dup(). */ - { - sr_srv_t *srv = NULL, *dup_srv = NULL; - const char *srv_value = - "1BDB7C3E973936E4D13A49F37C859B3DC69C429334CF9412E3FEF6399C52D47A"; - srv = tor_malloc_zero(sizeof(*srv)); - srv->num_reveals = 42; - memcpy(srv->value, srv_value, sizeof(srv->value)); - dup_srv = srv_dup(srv); - tt_assert(dup_srv); - tt_u64_op(dup_srv->num_reveals, OP_EQ, srv->num_reveals); - tt_mem_op(dup_srv->value, OP_EQ, srv->value, sizeof(srv->value)); - tor_free(srv); - tor_free(dup_srv); - } - - /* Testing commitments_are_the_same(). Currently, the check is to test the - * value of the encoded commit so let's make sure that actually works. */ - { - /* Payload of 57 bytes that is the length of sr_commit_t->encoded_commit. - * 56 bytes of payload and a NUL terminated byte at the end ('\x00') - * which comes down to SR_COMMIT_BASE64_LEN + 1. */ - const char *payload = - "\x5d\xb9\x60\xb6\xcc\x51\x68\x52\x31\xd9\x88\x88\x71\x71\xe0\x30" - "\x59\x55\x7f\xcd\x61\xc0\x4b\x05\xb8\xcd\xc1\x48\xe9\xcd\x16\x1f" - "\x70\x15\x0c\xfc\xd3\x1a\x75\xd0\x93\x6c\xc4\xe0\x5c\xbe\xe2\x18" - "\xc7\xaf\x72\xb6\x7c\x9b\x52\x00"; - sr_commit_t commit1, commit2; - memcpy(commit1.encoded_commit, payload, sizeof(commit1.encoded_commit)); - memcpy(commit2.encoded_commit, payload, sizeof(commit2.encoded_commit)); - tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 1); - /* Let's corrupt one of them. */ - memset(commit1.encoded_commit, 'A', sizeof(commit1.encoded_commit)); - tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 0); - } - - /* Testing commit_is_authoritative(). */ - { - crypto_pk_t *k = crypto_pk_new(); - char digest[DIGEST_LEN]; - sr_commit_t commit; - - tt_assert(!crypto_pk_generate_key(k)); - - tt_int_op(0, OP_EQ, crypto_pk_get_digest(k, digest)); - memcpy(commit.rsa_identity, digest, sizeof(commit.rsa_identity)); - tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 1); - /* Change the pubkey. */ - memset(commit.rsa_identity, 0, sizeof(commit.rsa_identity)); - tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 0); - crypto_pk_free(k); - } - - /* Testing get_phase_str(). */ - { - tt_str_op(get_phase_str(SR_PHASE_REVEAL), OP_EQ, "reveal"); - tt_str_op(get_phase_str(SR_PHASE_COMMIT), OP_EQ, "commit"); - } - - /* Testing phase transition */ - { - init_authority_state(); - set_sr_phase(SR_PHASE_COMMIT); - tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 1); - tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 0); - set_sr_phase(SR_PHASE_REVEAL); - tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 0); - tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 1); - /* Junk. */ - tt_int_op(is_phase_transition(42), OP_EQ, 1); - } - - done: - return; -} - -static void -test_state_transition(void *arg) -{ - sr_state_t *state = NULL; - time_t now = time(NULL); - - (void) arg; - - { /* Setup a minimal dirauth environment for this test */ - init_authority_state(); - state = get_sr_state(); - tt_assert(state); - } - - /* Test our state reset for a new protocol run. */ - { - /* Add a commit to the state so we can test if the reset cleans the - * commits. Also, change all params that we expect to be updated. */ - sr_commit_t *commit = sr_generate_our_commit(now, mock_cert); - tt_assert(commit); - sr_state_add_commit(commit); - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - /* Let's test our delete feature. */ - sr_state_delete_commits(); - tt_int_op(digestmap_size(state->commits), OP_EQ, 0); - /* Add it back so we can continue the rest of the test because after - * deletiong our commit will be freed so generate a new one. */ - commit = sr_generate_our_commit(now, mock_cert); - tt_assert(commit); - sr_state_add_commit(commit); - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - state->n_reveal_rounds = 42; - state->n_commit_rounds = 43; - state->n_protocol_runs = 44; - reset_state_for_new_protocol_run(now); - tt_int_op(state->n_reveal_rounds, OP_EQ, 0); - tt_int_op(state->n_commit_rounds, OP_EQ, 0); - tt_u64_op(state->n_protocol_runs, OP_EQ, 45); - tt_int_op(digestmap_size(state->commits), OP_EQ, 0); - } - - /* Test SRV rotation in our state. */ - { - const sr_srv_t *cur, *prev; - test_sr_setup_srv(1); - cur = sr_state_get_current_srv(); - tt_assert(cur); - /* After, current srv should be the previous and then set to NULL. */ - state_rotate_srv(); - prev = sr_state_get_previous_srv(); - tt_assert(prev == cur); - tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL); - sr_state_clean_srvs(); - } - - /* New protocol run. */ - { - const sr_srv_t *cur; - /* Setup some new SRVs so we can confirm that a new protocol run - * actually makes them rotate and compute new ones. */ - test_sr_setup_srv(1); - cur = sr_state_get_current_srv(); - tt_assert(cur); - set_sr_phase(SR_PHASE_REVEAL); - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - new_protocol_run(now); - UNMOCK(get_my_v3_authority_cert); - /* Rotation happened. */ - tt_assert(sr_state_get_previous_srv() == cur); - /* We are going into COMMIT phase so we had to rotate our SRVs. Usually - * our current SRV would be NULL but a new protocol run should make us - * compute a new SRV. */ - tt_assert(sr_state_get_current_srv()); - /* Also, make sure we did change the current. */ - tt_assert(sr_state_get_current_srv() != cur); - /* We should have our commitment alone. */ - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - tt_int_op(state->n_reveal_rounds, OP_EQ, 0); - tt_int_op(state->n_commit_rounds, OP_EQ, 0); - /* 46 here since we were at 45 just before. */ - tt_u64_op(state->n_protocol_runs, OP_EQ, 46); - } - - /* Cleanup of SRVs. */ - { - sr_state_clean_srvs(); - tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL); - tt_ptr_op(sr_state_get_previous_srv(), OP_EQ, NULL); - } - - done: - return; -} - -static void -test_keep_commit(void *arg) -{ - char fp[FINGERPRINT_LEN + 1]; - sr_commit_t *commit = NULL, *dup_commit = NULL; - sr_state_t *state; - time_t now = time(NULL); - crypto_pk_t *k = NULL; - - (void) arg; - - MOCK(trusteddirserver_get_by_v3_auth_digest, - trusteddirserver_get_by_v3_auth_digest_m); - - { - k = pk_generate(1); - /* Setup a minimal dirauth environment for this test */ - /* Have a key that is not the one from our commit. */ - init_authority_state(); - state = get_sr_state(); - } - - crypto_rand((char*)fp, sizeof(fp)); - - /* Test this very important function that tells us if we should keep a - * commit or not in our state. Most of it depends on the phase and what's - * in the commit so we'll change the commit as we go. */ - commit = sr_generate_our_commit(now, mock_cert); - tt_assert(commit); - /* Set us in COMMIT phase for starter. */ - set_sr_phase(SR_PHASE_COMMIT); - /* We should never keep a commit from a non authoritative authority. */ - tt_int_op(should_keep_commit(commit, fp, SR_PHASE_COMMIT), OP_EQ, 0); - /* This should NOT be kept because it has a reveal value in it. */ - tt_assert(commit_has_reveal_value(commit)); - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_COMMIT), OP_EQ, 0); - /* Add it to the state which should return to not keep it. */ - sr_state_add_commit(commit); - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_COMMIT), OP_EQ, 0); - /* Remove it from state so we can continue our testing. */ - digestmap_remove(state->commits, commit->rsa_identity); - /* Let's remove our reveal value which should make it OK to keep it. */ - memset(commit->encoded_reveal, 0, sizeof(commit->encoded_reveal)); - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_COMMIT), OP_EQ, 1); - - /* Let's reset our commit and go into REVEAL phase. */ - sr_commit_free(commit); - commit = sr_generate_our_commit(now, mock_cert); - tt_assert(commit); - /* Dup the commit so we have one with and one without a reveal value. */ - dup_commit = tor_malloc_zero(sizeof(*dup_commit)); - memcpy(dup_commit, commit, sizeof(*dup_commit)); - memset(dup_commit->encoded_reveal, 0, sizeof(dup_commit->encoded_reveal)); - set_sr_phase(SR_PHASE_REVEAL); - /* We should never keep a commit from a non authoritative authority. */ - tt_int_op(should_keep_commit(commit, fp, SR_PHASE_REVEAL), OP_EQ, 0); - /* We shouldn't accept a commit that is not in our state. */ - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_REVEAL), OP_EQ, 0); - /* Important to add the commit _without_ the reveal here. */ - sr_state_add_commit(dup_commit); - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - /* Our commit should be valid that is authoritative, contains a reveal, be - * in the state and commitment and reveal values match. */ - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_REVEAL), OP_EQ, 1); - /* The commit shouldn't be kept if it's not verified that is no matchin - * hashed reveal. */ - { - /* Let's save the hash reveal so we can restore it. */ - sr_commit_t place_holder; - memcpy(place_holder.hashed_reveal, commit->hashed_reveal, - sizeof(place_holder.hashed_reveal)); - memset(commit->hashed_reveal, 0, sizeof(commit->hashed_reveal)); - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_REVEAL), OP_EQ, 0); - expect_log_msg_containing("doesn't match the commit value."); - expect_log_msg_containing("has an invalid reveal value."); - assert_log_predicate(mock_saved_log_n_entries() == 2, - "expected 2 log entries"); - teardown_capture_of_logs(); - memcpy(commit->hashed_reveal, place_holder.hashed_reveal, - sizeof(commit->hashed_reveal)); - } - /* We shouldn't keep a commit that has no reveal. */ - tt_int_op(should_keep_commit(dup_commit, dup_commit->rsa_identity, - SR_PHASE_REVEAL), OP_EQ, 0); - /* We must not keep a commit that is not the same from the commit phase. */ - memset(commit->encoded_commit, 0, sizeof(commit->encoded_commit)); - tt_int_op(should_keep_commit(commit, commit->rsa_identity, - SR_PHASE_REVEAL), OP_EQ, 0); - - done: - teardown_capture_of_logs(); - sr_commit_free(commit); - sr_commit_free(dup_commit); - crypto_pk_free(k); - UNMOCK(trusteddirserver_get_by_v3_auth_digest); -} - -static void -test_state_update(void *arg) -{ - time_t commit_phase_time = 1452076000; - time_t reveal_phase_time = 1452086800; - sr_state_t *state; - - (void) arg; - - { - init_authority_state(); - state = get_sr_state(); - set_sr_phase(SR_PHASE_COMMIT); - /* We'll cheat a bit here and reset the creation time of the state which - * will avoid us to compute a valid_after time that fits the commit - * phase. */ - state->valid_after = 0; - state->n_reveal_rounds = 0; - state->n_commit_rounds = 0; - state->n_protocol_runs = 0; - } - - /* We need to mock for the state update function call. */ - MOCK(get_my_v3_authority_cert, get_my_v3_authority_cert_m); - - /* We are in COMMIT phase here and we'll trigger a state update but no - * transition. */ - sr_state_update(commit_phase_time); - tt_int_op(state->valid_after, OP_EQ, commit_phase_time); - tt_int_op(state->n_commit_rounds, OP_EQ, 1); - tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT); - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - - /* We are still in the COMMIT phase here but we'll trigger a state - * transition to the REVEAL phase. */ - sr_state_update(reveal_phase_time); - tt_int_op(state->phase, OP_EQ, SR_PHASE_REVEAL); - tt_int_op(state->valid_after, OP_EQ, reveal_phase_time); - /* Only our commit should be in there. */ - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - tt_int_op(state->n_reveal_rounds, OP_EQ, 1); - - /* We can't update a state with a valid after _lower_ than the creation - * time so here it is. */ - sr_state_update(commit_phase_time); - tt_int_op(state->valid_after, OP_EQ, reveal_phase_time); - - /* Finally, let's go back in COMMIT phase so we can test the state update - * of a new protocol run. */ - state->valid_after = 0; - sr_state_update(commit_phase_time); - tt_int_op(state->valid_after, OP_EQ, commit_phase_time); - tt_int_op(state->n_commit_rounds, OP_EQ, 1); - tt_int_op(state->n_reveal_rounds, OP_EQ, 0); - tt_u64_op(state->n_protocol_runs, OP_EQ, 1); - tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT); - tt_int_op(digestmap_size(state->commits), OP_EQ, 1); - tt_assert(state->current_srv); - - done: - sr_state_free_all(); - UNMOCK(get_my_v3_authority_cert); -} - -struct testcase_t sr_tests[] = { - { "get_sr_protocol_phase", test_get_sr_protocol_phase, TT_FORK, - NULL, NULL }, - { "sr_commit", test_sr_commit, TT_FORK, - NULL, NULL }, - { "keep_commit", test_keep_commit, TT_FORK, - NULL, NULL }, - { "encoding", test_encoding, TT_FORK, - NULL, NULL }, - { "get_start_time_of_current_run", test_get_start_time_of_current_run, - TT_FORK, NULL, NULL }, - { "get_start_time_functions", test_get_start_time_functions, - TT_FORK, NULL, NULL }, - { "get_sr_protocol_duration", test_get_sr_protocol_duration, TT_FORK, - NULL, NULL }, - { "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK, - NULL, NULL }, - { "vote", test_vote, TT_FORK, - NULL, NULL }, - { "state_load_from_disk", test_state_load_from_disk, TT_FORK, - NULL, NULL }, - { "sr_compute_srv", test_sr_compute_srv, TT_FORK, NULL, NULL }, - { "sr_get_majority_srv_from_votes", test_sr_get_majority_srv_from_votes, - TT_FORK, NULL, NULL }, - { "utils", test_utils, TT_FORK, NULL, NULL }, - { "state_transition", test_state_transition, TT_FORK, NULL, NULL }, - { "state_update", test_state_update, TT_FORK, - NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_slow.c b/src/tor/src/test/test_slow.c deleted file mode 100644 index e64070249..000000000 --- a/src/tor/src/test/test_slow.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_slow.c - * \brief Slower unit tests for many pieces of the lower level Tor modules. - **/ - -#include "orconfig.h" - -#include -#ifdef HAVE_FCNTL_H -#include -#endif - -#include "or.h" -#include "test.h" - -struct testgroup_t testgroups[] = { - { "slow/crypto/", slow_crypto_tests }, - { "slow/util/", slow_util_tests }, - END_OF_GROUPS -}; - diff --git a/src/tor/src/test/test_socks.c b/src/tor/src/test/test_socks.c deleted file mode 100644 index 9ae7530e2..000000000 --- a/src/tor/src/test/test_socks.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "buffers.h" -#include "config.h" -#include "proto_socks.h" -#include "test.h" -#include "log_test_helpers.h" - -typedef struct socks_test_data_t { - socks_request_t *req; - buf_t *buf; -} socks_test_data_t; - -static void * -socks_test_setup(const struct testcase_t *testcase) -{ - socks_test_data_t *data = tor_malloc(sizeof(socks_test_data_t)); - (void)testcase; - data->buf = buf_new_with_capacity(256); - data->req = socks_request_new(); - config_register_addressmaps(get_options()); - return data; -} -static int -socks_test_cleanup(const struct testcase_t *testcase, void *ptr) -{ - socks_test_data_t *data = ptr; - (void)testcase; - buf_free(data->buf); - socks_request_free(data->req); - tor_free(data); - return 1; -} - -static const struct testcase_setup_t socks_setup = { - socks_test_setup, socks_test_cleanup -}; - -#define SOCKS_TEST_INIT() \ - socks_test_data_t *testdata = ptr; \ - buf_t *buf = testdata->buf; \ - socks_request_t *socks = testdata->req; -#define ADD_DATA(buf, s) \ - buf_add(buf, s, sizeof(s)-1) - -static void -socks_request_clear(socks_request_t *socks) -{ - tor_free(socks->username); - tor_free(socks->password); - memset(socks, 0, sizeof(socks_request_t)); -} - -/** Perform unsupported SOCKS 4 commands */ -static void -test_socks_4_unsupported_commands(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */ - ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - tt_int_op(4,OP_EQ, socks->socks_version); - tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ - - done: - ; -} - -/** Perform supported SOCKS 4 commands */ -static void -test_socks_4_supported_commands(void *ptr) -{ - SOCKS_TEST_INIT(); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */ - ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, 1); - tt_int_op(4,OP_EQ, socks->socks_version); - tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); - tt_str_op("2.2.2.3",OP_EQ, socks->address); - tt_int_op(4370,OP_EQ, socks->port); - tt_assert(socks->got_auth == 0); - tt_assert(! socks->username); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/ - ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), - OP_EQ, 1); - tt_int_op(4,OP_EQ, socks->socks_version); - tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); - tt_str_op("2.2.2.4",OP_EQ, socks->address); - tt_int_op(4370,OP_EQ, socks->port); - tt_assert(socks->got_auth == 1); - tt_assert(socks->username); - tt_int_op(2,OP_EQ, socks->usernamelen); - tt_mem_op("me",OP_EQ, socks->username, 2); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */ - ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, - get_options()->SafeSocks), - OP_EQ, 1); - tt_int_op(4,OP_EQ, socks->socks_version); - tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_str_op("torproject.org",OP_EQ, socks->address); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - done: - ; -} - -static void -test_socks_4_bad_arguments(void *ptr) -{ - SOCKS_TEST_INIT(); - setup_capture_of_logs(LOG_DEBUG); - - /* Try with 0 IPv4 address */ - ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x00\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Port or DestIP is zero."); - mock_clean_saved_logs(); - - /* Try with 0 port */ - ADD_DATA(buf, "\x04\x01\x00\x00\x01\x02\x03\x04\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Port or DestIP is zero."); - mock_clean_saved_logs(); - - /* Try with 2000-byte username (!) */ - ADD_DATA(buf, "\x04\x01\x00\x50\x01\x02\x03\x04"); - int i; - for (i = 0; i < 200; ++i) { - ADD_DATA(buf, "1234567890"); - } - ADD_DATA(buf, "\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), - OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("user name too long; rejecting."); - mock_clean_saved_logs(); - - /* Try with 2000-byte hostname */ - ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00"); - for (i = 0; i < 200; ++i) { - ADD_DATA(buf, "1234567890"); - } - ADD_DATA(buf, "\x00"); - { - const char *p; - size_t s; - buf_pullup(buf, 9999, &p, &s); - } - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), - OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Destaddr too long. Rejecting."); - mock_clean_saved_logs(); - - /* Try with 2000-byte hostname, not terminated. */ - ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00"); - for (i = 0; i < 200; ++i) { - ADD_DATA(buf, "1234567890"); - } - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), - OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Destaddr too long."); - mock_clean_saved_logs(); - - /* Socks4, bogus hostname */ - ADD_DATA(buf, "\x04\x01\x00\x50\x00\x00\x00\x01\x00" "---\x00" ); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Your application (using socks4 to port 80) " - "gave Tor a malformed hostname: "); - mock_clean_saved_logs(); - - done: - teardown_capture_of_logs(); -} - -/** Perform unsupported SOCKS 5 commands */ -static void -test_socks_5_unsupported_commands(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 5 Send unsupported BIND [02] command */ - ADD_DATA(buf, "\x05\x02\x00\x01"); - - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, 0); - tt_int_op(0,OP_EQ, buf_datalen(buf)); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - buf_clear(buf); - socks_request_clear(socks); - - /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */ - ADD_DATA(buf, "\x05\x02\x00\x01"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, 0); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - done: - ; -} - -/** Perform supported SOCKS 5 commands */ -static void -test_socks_5_supported_commands(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ - ADD_DATA(buf, "\x05\x01\x00"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, 0); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - - ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, 1); - tt_str_op("2.2.2.2",OP_EQ, socks->address); - tt_int_op(4369,OP_EQ, socks->port); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 5 Send CONNECT [01] to one of the ipv6 addresses for - torproject.org:80 */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\x01\x00\x04" - "\x20\x02\x41\xb8\x02\x02\x0d\xeb\x02\x13\x21\xff\xfe\x20\x14\x26" - "\x00\x50"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, 1); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - tt_str_op("[2002:41b8:202:deb:213:21ff:fe20:1426]",OP_EQ, socks->address); - tt_int_op(80,OP_EQ, socks->port); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, - get_options()->SafeSocks),OP_EQ, 1); - - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - tt_str_op("torproject.org",OP_EQ, socks->address); - tt_int_op(4369,OP_EQ, socks->port); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, 1); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - tt_str_op("torproject.org",OP_EQ, socks->address); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - socks_request_clear(socks); - - /* SOCKS 5 Should NOT reject RESOLVE [F0] request for IPv4 address - * string if SafeSocks is enabled. */ - - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\xF0\x00\x03\x07"); - ADD_DATA(buf, "8.8.8.8"); - ADD_DATA(buf, "\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), - OP_EQ, 1); - - tt_str_op("8.8.8.8", OP_EQ, socks->address); - tt_int_op(4369, OP_EQ, socks->port); - - tt_int_op(0, OP_EQ, buf_datalen(buf)); - - socks_request_clear(socks); - - /* SOCKS 5 should NOT reject RESOLVE [F0] reject for IPv6 address - * string if SafeSocks is enabled. */ - - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\xF0\x00\x03\x27"); - ADD_DATA(buf, "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); - ADD_DATA(buf, "\x01\x02"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), - OP_EQ, -1); - - tt_str_op("2001:0db8:85a3:0000:0000:8a2e:0370:7334", OP_EQ, socks->address); - tt_int_op(258, OP_EQ, socks->port); - - tt_int_op(0, OP_EQ, buf_datalen(buf)); - - socks_request_clear(socks); - - /* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, 1); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - tt_str_op("2.2.2.5",OP_EQ, socks->address); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - done: - ; -} - -/** Perform SOCKS 5 authentication */ -static void -test_socks_5_no_authenticate(void *ptr) -{ - SOCKS_TEST_INIT(); - - /*SOCKS 5 No Authentication */ - ADD_DATA(buf,"\x05\x01\x00"); - tt_assert(!fetch_from_buf_socks(buf, socks, - get_options()->TestSocks, - get_options()->SafeSocks)); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(SOCKS_NO_AUTH,OP_EQ, socks->reply[1]); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - /*SOCKS 5 Send username/password anyway - pretend to be broken */ - ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01"); - tt_assert(!fetch_from_buf_socks(buf, socks, - get_options()->TestSocks, - get_options()->SafeSocks)); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(1,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - - tt_int_op(2,OP_EQ, socks->usernamelen); - tt_int_op(2,OP_EQ, socks->passwordlen); - - tt_mem_op("\x01\x01",OP_EQ, socks->username, 2); - tt_mem_op("\x01\x01",OP_EQ, socks->password, 2); - - done: - ; -} - -/** Perform SOCKS 5 authentication */ -static void -test_socks_5_authenticate(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 5 Negotiate username/password authentication */ - ADD_DATA(buf, "\x05\x01\x02"); - - tt_assert(!fetch_from_buf_socks(buf, socks, - get_options()->TestSocks, - get_options()->SafeSocks)); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); - tt_int_op(5,OP_EQ, socks->socks_version); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - /* SOCKS 5 Send username/password */ - ADD_DATA(buf, "\x01\x02me\x08mypasswd"); - tt_assert(!fetch_from_buf_socks(buf, socks, - get_options()->TestSocks, - get_options()->SafeSocks)); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(1,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - - tt_int_op(2,OP_EQ, socks->usernamelen); - tt_int_op(8,OP_EQ, socks->passwordlen); - - tt_mem_op("me",OP_EQ, socks->username, 2); - tt_mem_op("mypasswd",OP_EQ, socks->password, 8); - - done: - ; -} - -/** Perform SOCKS 5 authentication and send data all in one go */ -static void -test_socks_5_authenticate_with_data(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 5 Negotiate username/password authentication */ - ADD_DATA(buf, "\x05\x01\x02"); - - tt_assert(!fetch_from_buf_socks(buf, socks, - get_options()->TestSocks, - get_options()->SafeSocks)); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); - tt_int_op(5,OP_EQ, socks->socks_version); - - tt_int_op(0,OP_EQ, buf_datalen(buf)); - - /* SOCKS 5 Send username/password */ - /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ - ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, 1); - tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(1,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - - tt_str_op("2.2.2.2",OP_EQ, socks->address); - tt_int_op(4369,OP_EQ, socks->port); - - tt_int_op(2,OP_EQ, socks->usernamelen); - tt_int_op(3,OP_EQ, socks->passwordlen); - tt_mem_op("me",OP_EQ, socks->username, 2); - tt_mem_op("you",OP_EQ, socks->password, 3); - - done: - ; -} - -/** Try to negotiate an unsupported authentication type */ -static void -test_socks_5_auth_unsupported_type(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* None of these authentication types are recognized. */ - ADD_DATA(buf, "\x05\x03\x99\x21\x10"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - tt_int_op(0,OP_EQ, socks->socks_version); - tt_int_op(2,OP_EQ, socks->replylen); - tt_int_op(5,OP_EQ, socks->reply[0]); - tt_int_op(0xff,OP_EQ, socks->reply[1]); - - done: - ; -} - -/** Try to negotiate an unsupported version of username/password auth. */ -static void -test_socks_5_auth_unsupported_version(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* Negotiate username/password */ - ADD_DATA(buf, "\x05\x01\x02"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, 0); - tt_int_op(0,OP_EQ, buf_datalen(buf)); /* buf should be drained */ - /* Now, suggest an unrecognized username/password version */ - ADD_DATA(buf, "\x02\x05" "hello" "\x05" "world"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - - done: - ; -} - -/** Perform SOCKS 5 authentication before method negotiated */ -static void -test_socks_5_auth_before_negotiation(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* SOCKS 5 Send username/password */ - ADD_DATA(buf, "\x01\x02me\x02me"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks), - OP_EQ, -1); - tt_int_op(0,OP_EQ, socks->socks_version); - tt_int_op(0,OP_EQ, socks->replylen); - tt_int_op(0,OP_EQ, socks->reply[0]); - tt_int_op(0,OP_EQ, socks->reply[1]); - - done: - ; -} - -/** Perform malformed SOCKS 5 commands */ -static void -test_socks_5_malformed_commands(void *ptr) -{ - SOCKS_TEST_INIT(); - - /* XXX: Stringified address length > MAX_SOCKS_ADDR_LEN will never happen */ - - /** SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369, with SafeSocks set - */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), - OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - buf_clear(buf); - socks_request_clear(socks); - - /* SOCKS 5 Send RESOLVE_PTR [F1] for FQDN torproject.org */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\xF1\x00\x03\x0Etorproject.org\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - buf_clear(buf); - socks_request_clear(socks); - - /* XXX: len + 1 > MAX_SOCKS_ADDR_LEN (FQDN request) will never happen */ - - /* SOCKS 5 Send CONNECT [01] to FQDN """"".com */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\x01\x00\x03\x09\"\"\"\"\".com\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_GENERAL_ERROR,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - buf_clear(buf); - socks_request_clear(socks); - - /* SOCKS 5 Send CONNECT [01] to address type 0x23 */ - ADD_DATA(buf, "\x05\x01\x00"); - ADD_DATA(buf, "\x05\x01\x00\x23\x02\x02\x02\x02\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),OP_EQ, -1); - - tt_int_op(5,OP_EQ,socks->socks_version); - tt_int_op(10,OP_EQ,socks->replylen); - tt_int_op(5,OP_EQ,socks->reply[0]); - tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); - tt_int_op(1,OP_EQ,socks->reply[3]); - - done: - ; -} - -static void -test_socks_5_bad_arguments(void *ptr) -{ - SOCKS_TEST_INIT(); - setup_capture_of_logs(LOG_DEBUG); - - /* Socks5, bogus hostname */ - ADD_DATA(buf, "\x05\x01\x00" "\x05\x01\x00\x03\x03" "---" "\x00\x50" ); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Your application (using socks5 to port 80) " - "gave Tor a malformed hostname: "); - mock_clean_saved_logs(); - socks_request_clear(socks); - - done: - teardown_capture_of_logs(); -} - -/** check for correct behavior when the socks command has not arrived. */ -static void -test_socks_truncated(void *ptr) -{ - const struct { - enum { NONE, AUTH, ALL } setup; - const char *body; - size_t len; - } commands[] = { - /* SOCKS4 */ - /* Connect, to an IP. */ - { NONE, "\x04\x01\x05\x05\x01\x02\x03\x04\x00", 9}, - /* Connect, to an IP, with authentication. */ - { NONE, "\x04\x01\x05\x05\x01\x02\x03\x04hello\x00", 14}, - /* SOCKS4A */ - /* Connect, to a hostname */ - { NONE, "\x04\x01\x09\x09\x00\x00\x00\x01\x00www.example.com\x00", 25}, - /* Connect, to a hostname, with authentication */ - { NONE, "\x04\x01\x09\x09\x00\x00\x00\x01hi\x00www.example.com\x00", 27}, - /* SOCKS5 */ - /* initial handshake */ - { NONE, "\x05\x00", 2 }, - /* no-auth handshake */ - { NONE, "\x05\x03\x99\x21\x10", 5 }, - /* SOCSK5, username-password, all empty. */ - { AUTH, "\x01\x00\x00", 3 }, - /* SOCSK5, username-password, 1 char each. */ - { AUTH, "\x01\x01x\x01y", 5 }, - /* SOCSK5, username-password, max length. */ - { AUTH, "\x01\xff" - "Ogni tempo ha il suo fascismo: se ne notano i segni premonitori " - "dovunque la concentrazione di potere nega al cittadino la " - "possibilit\xc3\xa0 e la capacit\xc3\xa0 di esprimere ed attuare la " - "sua volont\xc3\xa0. A questo si arriva in molti modi, non " - "necessariamente col terror" - "\xff" - "e dell'intimidazione poliziesca, ma anche negando o distorcendo " - "l'informazione, inquinando la giustizia, paralizzando la scuola, " - "diffondendo in molti modi sottili la nostalgia per un mondo in cui " - "regnava sovrano l'ordine, ed in cui la sicurezza dei pochi " - /* privilegiati riposava sul lavoro forzato e sul silenzio forzato dei - molti. -- Primo Levi */ , 513 }, - /* Socks5, IPv4 address */ - { ALL, "\x05\x01\x00\x01\x01\x02\x03\x04\x20\x20", 10 }, - /* Socks5, IPv6 address */ - { ALL, "\x05\x01\x00\x04" - "\x49\x20\x48\x41\x5a\x20\x45\x41\x53\x54\x45\x52\x20\x45\x47\x47" - "\x20\x20", 22 }, - /* Socks5, hostname, empty. */ - { ALL, "\x05\x01\x00\x03" "\x00" "\x00\x50", 7 }, - /* Socks5, hostname, moderate. */ - { ALL, "\x05\x01\x00\x03" "\x11" "onion.example.com" "\x00\x50", 24 }, - /* Socks5, hostname, maximum. */ - { ALL, "\x05\x01\x00\x03" "\xff" - "whatsoever.I.shall.see.or.hear.in.the.course.of.my.profession.as.well." - "as.outside.my.profession.in.my.intercourse.with.men.if.it.be.what." - "should.not.be.published.abroad.I.will.never.divulge.holding.such." - "things.to.be.holy.secrets.x.hippocratic.oath.wikipedia" - "\x00\x50", 262 }, - }; - unsigned i, j; - SOCKS_TEST_INIT(); - for (i = 0; i < ARRAY_LENGTH(commands); ++i) { - for (j = 0; j < commands[i].len; ++j) { - switch (commands[i].setup) { - default: /* Falls through */ - case NONE: - /* This test calls for no setup on the socks state. */ - break; - case AUTH: - /* This test calls for the socks state to be waiting for - * username/password authentication */ - ADD_DATA(buf, "\x05\x01\x02"); - tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); - tt_int_op(0, OP_EQ, buf_datalen(buf)); - break; - case ALL: - /* This test calls for the socks state to be waiting for - * the connection request */ - ADD_DATA(buf, "\x05\x01\x00"); - tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); - tt_int_op(0, OP_EQ, buf_datalen(buf)); - } - - TT_BLATHER(("Checking command %u, length %u, omitting char %u", i, j, - (unsigned)commands[i].body[j])); - buf_add(buf, commands[i].body, j); - /* This should return 0 meaning "not done yet" */ - tt_int_op(0, OP_EQ, fetch_from_buf_socks(buf, socks, 0, 0)); - tt_uint_op(j, OP_EQ, buf_datalen(buf)); /* Nothing was drained */ - buf_clear(buf); - socks_request_free(testdata->req); - socks = testdata->req = socks_request_new(); - } - } - done: - ; -} - -static void -test_socks_wrong_protocol(void *ptr) -{ - SOCKS_TEST_INIT(); - setup_capture_of_logs(LOG_DEBUG); - - /* HTTP request. */ - ADD_DATA(buf, "GET /index.html HTTP/1.0" ); - tt_int_op(fetch_from_buf_socks(buf, socks, 1, 0), OP_EQ, -1); - buf_clear(buf); - expect_log_msg_containing("Socks version 71 not recognized. " - "(This port is not an HTTP proxy;"); - mock_clean_saved_logs(); - socks_request_clear(socks); - - done: - teardown_capture_of_logs(); -} - -/* Check our client-side socks4 parsing (that is to say, our parsing of - * server responses). - */ -static void -test_socks_client_v4(void *arg) -{ - (void)arg; - buf_t *buf = buf_new(); - char *reason = NULL; - - /* Legit socks4 response, success */ - ADD_DATA(buf, "\x04\x5a\x20\x25\x01\x02\x03\x04"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, PROXY_SOCKS4_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Legit socks4 response, failure. */ - ADD_DATA(buf, "\x04\x5b\x20\x25\x01\x02\x03\x04"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, PROXY_SOCKS4_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_NE, NULL); - tt_str_op(reason, OP_EQ, "server rejected connection"); - - done: - buf_free(buf); - tor_free(reason); -} - -/* Check our client-side socks5 authentication-negotiation parsing (that is to - * say, our parsing of server responses). - */ -static void -test_socks_client_v5_auth(void *arg) -{ - (void)arg; - buf_t *buf = buf_new(); - char *reason = NULL; - - /* Legit socks5 responses, got a method we like. */ - ADD_DATA(buf, "\x05\x00"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Same, but we wanted something else. */ - ADD_DATA(buf, "\x05\x00"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Same, and they offered a password. */ - ADD_DATA(buf, "\x05\x02"); - tt_int_op(2, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* They rejected our method, or selected something we don't know. */ - ADD_DATA(buf, "\x05\xff"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, - &reason)); - tt_str_op(reason, OP_EQ, "server doesn't support any of our available " - "authentication methods"); - buf_clear(buf); - tor_free(reason); - ADD_DATA(buf, "\x05\xff"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, - &reason)); - tt_str_op(reason, OP_EQ, "server doesn't support any of our available " - "authentication methods"); - tor_free(reason); - buf_clear(buf); - - /* Now check for authentication responses: check success and failure. */ - ADD_DATA(buf, "\x01\x00"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - ADD_DATA(buf, "\x01\xf0"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, - &reason)); - tt_ptr_op(reason, OP_NE, NULL); - tt_str_op(reason, OP_EQ, "authentication failed"); - - done: - buf_free(buf); - tor_free(reason); -} - -/* Check our client-side socks5 connect parsing (that is to say, our parsing - * of server responses). - */ -static void -test_socks_client_v5_connect(void *arg) -{ - (void)arg; - buf_t *buf = buf_new(); - char *reason = NULL; - - /* Legit socks5 responses, success, ipv4. */ - ADD_DATA(buf, "\x05\x00\x00\x01\x01\x02\x03\x04\x00\x05"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Legit socks5 responses, success, ipv6. */ - ADD_DATA(buf, "\x05\x00\x00\x04" - "abcdefghijklmnop" - "\x00\x05"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Legit socks5 responses, success, hostname. */ - ADD_DATA(buf, "\x05\x00\x00\x03\x12" - "gopher.example.com" - "\x00\x05"); - tt_int_op(1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_EQ, NULL); - tt_int_op(buf_datalen(buf), OP_EQ, 0); - - /* Legit socks5 responses, failure, hostname. */ - ADD_DATA(buf, "\x05\x03\x00\x03\x12" - "gopher.example.com" - "\x00\x05"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_NE, NULL); - tt_str_op(reason, OP_EQ, "Network unreachable"); - tor_free(reason); - buf_clear(buf); - - /* Bogus socks5 responses: what is address type 0x17? */ - ADD_DATA(buf, "\x05\x03\x00\x17\x12 blah blah"); - tt_int_op(-1, OP_EQ, - fetch_from_buf_socks_client(buf, - PROXY_SOCKS5_WANT_CONNECT_OK, - &reason)); - tt_ptr_op(reason, OP_NE, NULL); - tt_str_op(reason, OP_EQ, "invalid response to connect request"); - buf_clear(buf); - - done: - buf_free(buf); - tor_free(reason); -} - -static void -test_socks_client_truncated(void *arg) -{ - (void)arg; - buf_t *buf = buf_new(); - char *reason = NULL; - -#define S(str) str, (sizeof(str)-1) - const struct { - int state; - const char *body; - size_t len; - } replies[] = { - { PROXY_SOCKS4_WANT_CONNECT_OK, S("\x04\x5a\x20\x25\x01\x02\x03\x04") }, - { PROXY_SOCKS4_WANT_CONNECT_OK, S("\x04\x5b\x20\x25\x01\x02\x03\x04") }, - { PROXY_SOCKS5_WANT_AUTH_METHOD_NONE, S("\x05\x00") }, - { PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929, S("\x05\x00") }, - { PROXY_SOCKS5_WANT_AUTH_RFC1929_OK, S("\x01\x00") }, - { PROXY_SOCKS5_WANT_CONNECT_OK, - S("\x05\x00\x00\x01\x01\x02\x03\x04\x00\x05") }, - { PROXY_SOCKS5_WANT_CONNECT_OK, - S("\x05\x00\x00\x04" "abcdefghijklmnop" "\x00\x05") }, - { PROXY_SOCKS5_WANT_CONNECT_OK, - S("\x05\x00\x00\x03\x12" "gopher.example.com" "\x00\x05") }, - { PROXY_SOCKS5_WANT_CONNECT_OK, - S("\x05\x03\x00\x03\x12" "gopher.example.com""\x00\x05") }, - { PROXY_SOCKS5_WANT_CONNECT_OK, - S("\x05\x03\x00\x17") }, - }; - unsigned i, j; - for (i = 0; i < ARRAY_LENGTH(replies); ++i) { - for (j = 0; j < replies[i].len; ++j) { - TT_BLATHER(("Checking command %u, length %u", i, j)); - buf_add(buf, replies[i].body, j); - /* This should return 0 meaning "not done yet" */ - tt_int_op(0, OP_EQ, - fetch_from_buf_socks_client(buf, replies[i].state, &reason)); - tt_uint_op(j, OP_EQ, buf_datalen(buf)); /* Nothing was drained */ - buf_clear(buf); - tt_ptr_op(reason, OP_EQ, NULL); - } - } - - done: - tor_free(reason); - buf_free(buf); -} - -#define SOCKSENT(name) \ - { #name, test_socks_##name, TT_FORK, &socks_setup, NULL } - -struct testcase_t socks_tests[] = { - SOCKSENT(4_unsupported_commands), - SOCKSENT(4_supported_commands), - SOCKSENT(4_bad_arguments), - - SOCKSENT(5_unsupported_commands), - SOCKSENT(5_supported_commands), - SOCKSENT(5_no_authenticate), - SOCKSENT(5_auth_unsupported_type), - SOCKSENT(5_auth_unsupported_version), - SOCKSENT(5_auth_before_negotiation), - SOCKSENT(5_authenticate), - SOCKSENT(5_authenticate_with_data), - SOCKSENT(5_malformed_commands), - SOCKSENT(5_bad_arguments), - - SOCKSENT(truncated), - - SOCKSENT(wrong_protocol), - - { "client/v4", test_socks_client_v4, TT_FORK, NULL, NULL }, - { "client/v5_auth", test_socks_client_v5_auth, TT_FORK, NULL, NULL }, - { "client/v5_connect", test_socks_client_v5_connect, TT_FORK, NULL, NULL }, - { "client/truncated", test_socks_client_truncated, TT_FORK, NULL, NULL }, - - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_status.c b/src/tor/src/test/test_status.c deleted file mode 100644 index 50ea203e4..000000000 --- a/src/tor/src/test/test_status.c +++ /dev/null @@ -1,1086 +0,0 @@ -/* Copyright (c) 2014-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define STATUS_PRIVATE -#define HIBERNATE_PRIVATE -#define LOG_PRIVATE -#define REPHIST_PRIVATE - -#include "orconfig.h" - -#include -#include - -#include "or.h" -#include "torlog.h" -#include "tor_queue.h" -#include "status.h" -#include "circuitlist.h" -#include "config.h" -#include "hibernate.h" -#include "rephist.h" -#include "relay.h" -#include "router.h" -#include "main.h" -#include "nodelist.h" -#include "statefile.h" -#include "test.h" - -#define NS_MODULE status - -#define NS_SUBMODULE count_circuits - -/* - * Test that count_circuits() is correctly counting the number of - * global circuits. - */ - -static smartlist_t * mock_global_circuitlist = NULL; - -NS_DECL(smartlist_t *, circuit_get_global_list, (void)); - -static void -NS(test_main)(void *arg) -{ - /* Choose origin_circuit_t wlog. */ - origin_circuit_t *mock_circuit1, *mock_circuit2; - int expected_circuits = 2, actual_circuits; - - (void)arg; - - mock_circuit1 = tor_malloc_zero(sizeof(origin_circuit_t)); - mock_circuit2 = tor_malloc_zero(sizeof(origin_circuit_t)); - mock_global_circuitlist = smartlist_new(); - smartlist_add(mock_global_circuitlist, TO_CIRCUIT(mock_circuit1)); - smartlist_add(mock_global_circuitlist, TO_CIRCUIT(mock_circuit2)); - - NS_MOCK(circuit_get_global_list); - - actual_circuits = count_circuits(); - - tt_assert(expected_circuits == actual_circuits); - - done: - tor_free(mock_circuit1); - tor_free(mock_circuit2); - smartlist_free(mock_global_circuitlist); - mock_global_circuitlist = NULL; - NS_UNMOCK(circuit_get_global_list); -} - -static smartlist_t * -NS(circuit_get_global_list)(void) -{ - return mock_global_circuitlist; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE secs_to_uptime - -/* - * Test that secs_to_uptime() is converting the number of seconds that - * Tor is up for into the appropriate string form containing hours and minutes. - */ - -static void -NS(test_main)(void *arg) -{ - const char *expected; - char *actual; - (void)arg; - - expected = "0:00 hours"; - actual = secs_to_uptime(0); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "0:00 hours"; - actual = secs_to_uptime(1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "0:01 hours"; - actual = secs_to_uptime(60); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "0:59 hours"; - actual = secs_to_uptime(60 * 59); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1:00 hours"; - actual = secs_to_uptime(60 * 60); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "23:59 hours"; - actual = secs_to_uptime(60 * 60 * 23 + 60 * 59); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1 day 0:00 hours"; - actual = secs_to_uptime(60 * 60 * 23 + 60 * 60); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1 day 0:00 hours"; - actual = secs_to_uptime(86400 + 1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1 day 0:01 hours"; - actual = secs_to_uptime(86400 + 60); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "10 days 0:00 hours"; - actual = secs_to_uptime(86400 * 10); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "10 days 0:00 hours"; - actual = secs_to_uptime(864000 + 1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "10 days 0:01 hours"; - actual = secs_to_uptime(864000 + 60); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - done: - if (actual != NULL) - tor_free(actual); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE bytes_to_usage - -/* - * Test that bytes_to_usage() is correctly converting the number of bytes that - * Tor has read/written into the appropriate string form containing kilobytes, - * megabytes, or gigabytes. - */ - -static void -NS(test_main)(void *arg) -{ - const char *expected; - char *actual; - (void)arg; - - expected = "0 kB"; - actual = bytes_to_usage(0); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "0 kB"; - actual = bytes_to_usage(1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1 kB"; - actual = bytes_to_usage(1024); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1023 kB"; - actual = bytes_to_usage((1 << 20) - 1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.00 MB"; - actual = bytes_to_usage((1 << 20)); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.00 MB"; - actual = bytes_to_usage((1 << 20) + 5242); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.01 MB"; - actual = bytes_to_usage((1 << 20) + 5243); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1024.00 MB"; - actual = bytes_to_usage((1 << 30) - 1); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.00 GB"; - actual = bytes_to_usage((1 << 30)); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.00 GB"; - actual = bytes_to_usage((1 << 30) + 5368709); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "1.01 GB"; - actual = bytes_to_usage((1 << 30) + 5368710); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - expected = "10.00 GB"; - actual = bytes_to_usage((U64_LITERAL(1) << 30) * 10L); - tt_str_op(actual, OP_EQ, expected); - tor_free(actual); - - done: - if (actual != NULL) - tor_free(actual); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, fails) - -/* - * Tests that log_heartbeat() fails when in the public server mode, - * not hibernating, and we couldn't get the current routerinfo. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(router_get_my_routerinfo); - - expected = -1; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - - done: - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(router_get_my_routerinfo); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 2.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 0; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 1; -} - -static const routerinfo_t * -NS(router_get_my_routerinfo)(void) -{ - return NULL; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, not_in_consensus) - -/* - * Tests that log_heartbeat() logs appropriately if we are not in the cached - * consensus. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); -NS_DECL(const node_t *, node_get_by_id, (const char *identity_digest)); -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap)); -NS_DECL(int, server_mode, (const or_options_t *options)); - -static routerinfo_t *mock_routerinfo; - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(router_get_my_routerinfo); - NS_MOCK(node_get_by_id); - NS_MOCK(logv); - NS_MOCK(server_mode); - - log_global_min_severity_ = LOG_DEBUG; - onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP] = 1; - onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_TAP] = 1; - onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR] = 1; - onion_handshakes_assigned[ONION_HANDSHAKE_TYPE_NTOR] = 1; - - expected = 0; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - tt_int_op(CALLED(logv), OP_EQ, 5); - - done: - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(router_get_my_routerinfo); - NS_UNMOCK(node_get_by_id); - NS_UNMOCK(logv); - NS_UNMOCK(server_mode); - tor_free(mock_routerinfo); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 1.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 0; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 1; -} - -static const routerinfo_t * -NS(router_get_my_routerinfo)(void) -{ - mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); - - return mock_routerinfo; -} - -static const node_t * -NS(node_get_by_id)(const char *identity_digest) -{ - (void)identity_digest; - - return NULL; -} - -static void -NS(logv)(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap) -{ - switch (CALLED(logv)) - { - case 0: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: It seems like we are not in the cached consensus."); - break; - case 1: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Tor's uptime is %s, with %d circuits open. " - "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ - break; - case 2: - tt_int_op(severity, OP_EQ, LOG_INFO); - break; - case 3: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "rep_hist_log_circuit_handshake_stats"), - OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Circuit handshake stats since last time: %d/%d TAP, %d/%d NTor."); - tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (TAP) */ - tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (TAP) */ - tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (NTOR) */ - tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (NTOR) */ - break; - case 4: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "rep_hist_log_link_protocol_counts"), - OP_NE, NULL); - break; - default: - tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args - break; - } - - done: - CALLED(logv)++; -} - -static int -NS(server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, simple) - -/* - * Tests that log_heartbeat() correctly logs heartbeat information - * normally. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(long, get_uptime, (void)); -NS_DECL(uint64_t, get_bytes_read, (void)); -NS_DECL(uint64_t, get_bytes_written, (void)); -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap)); -NS_DECL(int, server_mode, (const or_options_t *options)); - -static int NS(n_msgs) = 0; - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(get_uptime); - NS_MOCK(get_bytes_read); - NS_MOCK(get_bytes_written); - NS_MOCK(logv); - NS_MOCK(server_mode); - - log_global_min_severity_ = LOG_DEBUG; - - expected = 0; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - tt_int_op(NS(n_msgs), OP_EQ, 1); - - done: - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(get_uptime); - NS_UNMOCK(get_bytes_read); - NS_UNMOCK(get_bytes_written); - NS_UNMOCK(logv); - NS_UNMOCK(server_mode); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 1.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 1; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static long -NS(get_uptime)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_read)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_written)(void) -{ - return 0; -} - -static void -NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, - const char *suffix, const char *format, va_list ap) -{ - if (severity == LOG_INFO) - return; - ++NS(n_msgs); - - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Tor's uptime is %s, with %d circuits open. " - "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, " We are currently hibernating."); - - done: - ; -} - -static int -NS(server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, calls_log_accounting) - -/* - * Tests that log_heartbeat() correctly logs heartbeat information - * and accounting information when configured. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(long, get_uptime, (void)); -NS_DECL(uint64_t, get_bytes_read, (void)); -NS_DECL(uint64_t, get_bytes_written, (void)); -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap)); -NS_DECL(int, server_mode, (const or_options_t *options)); -NS_DECL(or_state_t *, get_or_state, (void)); -NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); -NS_DECL(time_t, accounting_get_end_time, (void)); - -static or_state_t * NS(mock_state) = NULL; -static or_options_t * NS(mock_options) = NULL; - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(get_uptime); - NS_MOCK(get_bytes_read); - NS_MOCK(get_bytes_written); - NS_MOCK(logv); - NS_MOCK(server_mode); - NS_MOCK(get_or_state); - NS_MOCK(accounting_is_enabled); - NS_MOCK(accounting_get_end_time); - - log_global_min_severity_ = LOG_DEBUG; - - expected = 0; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - tt_int_op(CALLED(logv), OP_EQ, 3); - - done: - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(get_uptime); - NS_UNMOCK(get_bytes_read); - NS_UNMOCK(get_bytes_written); - NS_UNMOCK(logv); - NS_UNMOCK(server_mode); - NS_UNMOCK(accounting_is_enabled); - NS_UNMOCK(accounting_get_end_time); - tor_free_(NS(mock_state)); - tor_free_(NS(mock_options)); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 1.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 0; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static long -NS(get_uptime)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_read)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_written)(void) -{ - return 0; -} - -static void -NS(logv)(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap) -{ - switch (CALLED(logv)) - { - case 0: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Tor's uptime is %s, with %d circuits open. " - "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ - break; - case 1: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_accounting"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Accounting enabled. Sent: %s, Received: %s, Used: %s / " - "%s, Rule: %s. The current accounting interval ends on %s, in %s."); - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_used */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */ - tt_str_op(va_arg(ap, char *), OP_EQ, "max"); /* acc_rule */ - /* format_local_iso_time uses local tz, so we can't just compare - * the string against a constant */ - char datetime[ISO_TIME_LEN+1]; - format_local_iso_time(datetime, 60); - tt_str_op(va_arg(ap, char *), OP_EQ, datetime); /* end_buf */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0:01 hours"); /* remaining */ - break; - case 2: - tt_int_op(severity, OP_EQ, LOG_INFO); - break; - default: - tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args - break; - } - - done: - CALLED(logv)++; -} - -static int -NS(server_mode)(const or_options_t *options) -{ - (void)options; - - return 1; -} - -static int -NS(accounting_is_enabled)(const or_options_t *options) -{ - (void)options; - - return 1; -} - -static time_t -NS(accounting_get_end_time)(void) -{ - return 60; -} - -static or_state_t * -NS(get_or_state)(void) -{ - NS(mock_state) = tor_malloc_zero(sizeof(or_state_t)); - NS(mock_state)->AccountingBytesReadInInterval = 0; - NS(mock_state)->AccountingBytesWrittenInInterval = 0; - - return NS(mock_state); -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, packaged_cell_fullness) - -/* - * Tests that log_heartbeat() correctly logs packaged cell - * fullness information. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(long, get_uptime, (void)); -NS_DECL(uint64_t, get_bytes_read, (void)); -NS_DECL(uint64_t, get_bytes_written, (void)); -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap)); -NS_DECL(int, server_mode, (const or_options_t *options)); -NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(get_uptime); - NS_MOCK(get_bytes_read); - NS_MOCK(get_bytes_written); - NS_MOCK(logv); - NS_MOCK(server_mode); - NS_MOCK(accounting_is_enabled); - log_global_min_severity_ = LOG_DEBUG; - - stats_n_data_bytes_packaged = RELAY_PAYLOAD_SIZE; - stats_n_data_cells_packaged = 2; - expected = 0; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - tt_int_op(CALLED(logv), OP_EQ, 2); - - done: - stats_n_data_bytes_packaged = 0; - stats_n_data_cells_packaged = 0; - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(get_uptime); - NS_UNMOCK(get_bytes_read); - NS_UNMOCK(get_bytes_written); - NS_UNMOCK(logv); - NS_UNMOCK(server_mode); - NS_UNMOCK(accounting_is_enabled); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 1.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 0; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static long -NS(get_uptime)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_read)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_written)(void) -{ - return 0; -} - -static void -NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, - const char *suffix, const char *format, va_list ap) -{ - switch (CALLED(logv)) - { - case 0: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Tor's uptime is %s, with %d circuits open. " - "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ - break; - case 1: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Average packaged cell fullness: %2.3f%%. " - "TLS write overhead: %.f%%"); - tt_double_op(fabs(va_arg(ap, double) - 50.0), OP_LE, DBL_EPSILON); - tt_double_op(fabs(va_arg(ap, double) - 0.0), OP_LE, DBL_EPSILON); - break; - default: - tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args - break; - } - - done: - CALLED(logv)++; -} - -static int -NS(server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static int -NS(accounting_is_enabled)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -#undef NS_SUBMODULE -#define NS_SUBMODULE ASPECT(log_heartbeat, tls_write_overhead) - -/* - * Tests that log_heartbeat() correctly logs the TLS write overhead information - * when the TLS write overhead ratio exceeds 1. - */ - -NS_DECL(double, tls_get_write_overhead_ratio, (void)); -NS_DECL(int, we_are_hibernating, (void)); -NS_DECL(int, public_server_mode, (const or_options_t *options)); -NS_DECL(long, get_uptime, (void)); -NS_DECL(uint64_t, get_bytes_read, (void)); -NS_DECL(uint64_t, get_bytes_written, (void)); -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap)); -NS_DECL(int, server_mode, (const or_options_t *options)); -NS_DECL(int, accounting_is_enabled, (const or_options_t *options)); - -static void -NS(test_main)(void *arg) -{ - int expected, actual; - (void)arg; - - NS_MOCK(tls_get_write_overhead_ratio); - NS_MOCK(we_are_hibernating); - NS_MOCK(public_server_mode); - NS_MOCK(get_uptime); - NS_MOCK(get_bytes_read); - NS_MOCK(get_bytes_written); - NS_MOCK(logv); - NS_MOCK(server_mode); - NS_MOCK(accounting_is_enabled); - stats_n_data_cells_packaged = 0; - log_global_min_severity_ = LOG_DEBUG; - - expected = 0; - actual = log_heartbeat(0); - - tt_int_op(actual, OP_EQ, expected); - tt_int_op(CALLED(logv), OP_EQ, 2); - - done: - NS_UNMOCK(tls_get_write_overhead_ratio); - NS_UNMOCK(we_are_hibernating); - NS_UNMOCK(public_server_mode); - NS_UNMOCK(get_uptime); - NS_UNMOCK(get_bytes_read); - NS_UNMOCK(get_bytes_written); - NS_UNMOCK(logv); - NS_UNMOCK(server_mode); - NS_UNMOCK(accounting_is_enabled); -} - -static double -NS(tls_get_write_overhead_ratio)(void) -{ - return 2.0; -} - -static int -NS(we_are_hibernating)(void) -{ - return 0; -} - -static int -NS(public_server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static long -NS(get_uptime)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_read)(void) -{ - return 0; -} - -static uint64_t -NS(get_bytes_written)(void) -{ - return 0; -} - -static void -NS(logv)(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, va_list ap) -{ - switch (CALLED(logv)) - { - case 0: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Heartbeat: Tor's uptime is %s, with %d circuits open. " - "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ - break; - case 1: - tt_int_op(severity, OP_EQ, LOG_NOTICE); - tt_int_op(domain, OP_EQ, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); - tt_ptr_op(suffix, OP_EQ, NULL); - tt_str_op(format, OP_EQ, - "Average packaged cell fullness: %2.3f%%. " - "TLS write overhead: %.f%%"); - tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1); - tt_double_op(fabs(va_arg(ap, double) - 100.0), OP_LE, DBL_EPSILON); - break; - default: - tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args - break; - } - - done: - CALLED(logv)++; -} - -static int -NS(server_mode)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -static int -NS(accounting_is_enabled)(const or_options_t *options) -{ - (void)options; - - return 0; -} - -#undef NS_SUBMODULE - -struct testcase_t status_tests[] = { - TEST_CASE(count_circuits), - TEST_CASE(secs_to_uptime), - TEST_CASE(bytes_to_usage), - TEST_CASE_ASPECT(log_heartbeat, fails), - TEST_CASE_ASPECT(log_heartbeat, simple), - TEST_CASE_ASPECT(log_heartbeat, not_in_consensus), - TEST_CASE_ASPECT(log_heartbeat, calls_log_accounting), - TEST_CASE_ASPECT(log_heartbeat, packaged_cell_fullness), - TEST_CASE_ASPECT(log_heartbeat, tls_write_overhead), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_storagedir.c b/src/tor/src/test/test_storagedir.c deleted file mode 100644 index a27074c21..000000000 --- a/src/tor/src/test/test_storagedir.c +++ /dev/null @@ -1,375 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "storagedir.h" -#include "test.h" - -#ifdef HAVE_UTIME_H -#include -#endif - -static void -test_storagedir_empty(void *arg) -{ - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - (void)arg; - - tt_int_op(FN_NOENT, OP_EQ, file_status(dirname)); - - d = storage_dir_new(dirname, 10); - tt_assert(d); - - tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); - - tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); - - storage_dir_free(d); - d = storage_dir_new(dirname, 10); - tt_assert(d); - - tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); - - tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); - - done: - storage_dir_free(d); - tor_free(dirname); -} - -static void -test_storagedir_basic(void *arg) -{ - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - uint8_t *junk = NULL, *bytes = NULL; - const size_t junklen = 1024; - char *fname1 = NULL, *fname2 = NULL; - const char hello_str[] = "then what are we but cold, alone ... ?"; - tor_mmap_t *mapping = NULL; - (void)arg; - - junk = tor_malloc(junklen); - crypto_rand((void*)junk, junklen); - - d = storage_dir_new(dirname, 10); - tt_assert(d); - tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); - - int r; - r = storage_dir_save_string_to_file(d, hello_str, 1, &fname1); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(fname1, OP_NE, NULL); - tt_u64_op(strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); - - r = storage_dir_save_bytes_to_file(d, junk, junklen, 1, &fname2); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(fname2, OP_NE, NULL); - - tt_str_op(fname1, OP_NE, fname2); - - tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); - tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); - tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); - - storage_dir_free(d); - d = storage_dir_new(dirname, 10); - tt_assert(d); - tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); - tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); - tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); - - size_t n; - bytes = storage_dir_read(d, fname2, 1, &n); - tt_assert(bytes); - tt_u64_op(n, OP_EQ, junklen); - tt_mem_op(bytes, OP_EQ, junk, junklen); - - mapping = storage_dir_map(d, fname1); - tt_assert(mapping); - tt_u64_op(mapping->size, OP_EQ, strlen(hello_str)); - tt_mem_op(mapping->data, OP_EQ, hello_str, strlen(hello_str)); - - done: - tor_free(dirname); - tor_free(junk); - tor_free(bytes); - tor_munmap_file(mapping); - storage_dir_free(d); - tor_free(fname1); - tor_free(fname2); -} - -static void -test_storagedir_deletion(void *arg) -{ - (void)arg; - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - char *fn1 = NULL, *fn2 = NULL; - char *bytes = NULL; - int r; - const char str1[] = "There are nine and sixty ways to disguise communiques"; - const char str2[] = "And rather more than one of them is right"; - - // Make sure the directory is there. */ - d = storage_dir_new(dirname, 10); - storage_dir_free(d); - d = NULL; - - tor_asprintf(&fn1, "%s/1007", dirname); - r = write_str_to_file(fn1, str1, 0); - tt_int_op(r, OP_EQ, 0); - - tor_asprintf(&fn2, "%s/1003.tmp", dirname); - r = write_str_to_file(fn2, str2, 0); - tt_int_op(r, OP_EQ, 0); - - // The tempfile should be deleted the next time we list the directory. - d = storage_dir_new(dirname, 10); - tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); - tt_int_op(FN_FILE, OP_EQ, file_status(fn1)); - tt_int_op(FN_NOENT, OP_EQ, file_status(fn2)); - - bytes = (char*) storage_dir_read(d, "1007", 1, NULL); - tt_str_op(bytes, OP_EQ, str1); - - // Should have no effect; file already gone. - storage_dir_remove_file(d, "1003.tmp"); - tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); - - // Actually remove a file. - storage_dir_remove_file(d, "1007"); - tt_int_op(FN_NOENT, OP_EQ, file_status(fn1)); - tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); - tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); - - done: - tor_free(dirname); - tor_free(fn1); - tor_free(fn2); - storage_dir_free(d); - tor_free(bytes); -} - -static void -test_storagedir_full(void *arg) -{ - (void)arg; - - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - const char str[] = "enemies of the peephole"; - int r; - - d = storage_dir_new(dirname, 3); - tt_assert(d); - - r = storage_dir_save_string_to_file(d, str, 1, NULL); - tt_int_op(r, OP_EQ, 0); - r = storage_dir_save_string_to_file(d, str, 1, NULL); - tt_int_op(r, OP_EQ, 0); - r = storage_dir_save_string_to_file(d, str, 1, NULL); - tt_int_op(r, OP_EQ, 0); - - // These should fail! - r = storage_dir_save_string_to_file(d, str, 1, NULL); - tt_int_op(r, OP_EQ, -1); - r = storage_dir_save_string_to_file(d, str, 1, NULL); - tt_int_op(r, OP_EQ, -1); - - tt_u64_op(strlen(str) * 3, OP_EQ, storage_dir_get_usage(d)); - - done: - tor_free(dirname); - storage_dir_free(d); -} - -static void -test_storagedir_cleaning(void *arg) -{ - (void)arg; - - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - const char str[] = - "On a mountain halfway between Reno and Rome / " - "We have a machine in a plexiglass dome / " - "Which listens and looks into everyone's home." - " -- Dr. Seuss"; - char *fns[8]; - int r, i; - - memset(fns, 0, sizeof(fns)); - d = storage_dir_new(dirname, 10); - tt_assert(d); - - for (i = 0; i < 8; ++i) { - r = storage_dir_save_string_to_file(d, str+i*2, 1, &fns[i]); - tt_int_op(r, OP_EQ, 0); - } - - /* Now we're going to make sure all the files have distinct mtimes. */ - time_t now = time(NULL); - struct utimbuf ub; - ub.actime = now; - ub.modtime = now - 1000; - for (i = 0; i < 8; ++i) { - char *f = NULL; - tor_asprintf(&f, "%s/%s", dirname, fns[i]); - r = utime(f, &ub); - tor_free(f); - tt_int_op(r, OP_EQ, 0); - ub.modtime += 5; - } - - const uint64_t usage_orig = storage_dir_get_usage(d); - /* No changes needed if we are already under target. */ - storage_dir_shrink(d, 1024*1024, 0); - tt_u64_op(usage_orig, OP_EQ, storage_dir_get_usage(d)); - - /* Get rid of at least one byte. This will delete fns[0]. */ - storage_dir_shrink(d, usage_orig - 1, 0); - tt_u64_op(usage_orig, OP_GT, storage_dir_get_usage(d)); - tt_u64_op(usage_orig - strlen(str), OP_EQ, storage_dir_get_usage(d)); - - /* Get rid of at least two files. This will delete fns[1] and fns[2]. */ - storage_dir_shrink(d, 1024*1024, 2); - tt_u64_op(usage_orig - strlen(str)*3 + 6, OP_EQ, storage_dir_get_usage(d)); - - /* Get rid of everything. */ - storage_dir_remove_all(d); - tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); - - done: - tor_free(dirname); - storage_dir_free(d); - for (i = 0; i < 8; ++i) { - tor_free(fns[i]); - } -} - -static void -test_storagedir_save_labeled(void *arg) -{ - (void)arg; - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - uint8_t *inp = tor_malloc_zero(8192); - config_line_t *labels = NULL; - char *fname = NULL; - uint8_t *saved = NULL; - - d = storage_dir_new(dirname, 10); - tt_assert(d); - - crypto_rand((char *)inp, 8192); - - config_line_append(&labels, "Foo", "bar baz"); - config_line_append(&labels, "quux", "quuzXxz"); - const char expected[] = - "Foo bar baz\n" - "quux quuzXxz\n"; - - int r = storage_dir_save_labeled_to_file(d, labels, inp, 8192, &fname); - tt_int_op(r, OP_EQ, 0); - - size_t n; - saved = storage_dir_read(d, fname, 1, &n); - tt_assert(memchr(saved, '\0', n)); - tt_str_op((char*)saved, OP_EQ, expected); /* NUL guarantees strcmp works */ - tt_mem_op(saved+strlen(expected)+1, OP_EQ, inp, 8192); - - done: - storage_dir_free(d); - tor_free(dirname); - tor_free(inp); - tor_free(fname); - config_free_lines(labels); - tor_free(saved); -} - -static void -test_storagedir_read_labeled(void *arg) -{ - (void)arg; - char *dirname = tor_strdup(get_fname_rnd("store_dir")); - storage_dir_t *d = NULL; - uint8_t *inp = tor_malloc_zero(8192); - config_line_t *labels = NULL, *labels2 = NULL; - char *fname = NULL; - tor_mmap_t *map = NULL; - uint8_t *as_read = NULL; - - d = storage_dir_new(dirname, 10); - tt_assert(d); - - tor_snprintf((char*)inp, 8192, - "Hello world\n" - "This is a test\n" - "Yadda yadda.\n"); - size_t bodylen = 8192 - strlen((char*)inp) - 1; - crypto_rand((char *)inp+strlen((char*)inp)+1, bodylen); - - int r = storage_dir_save_bytes_to_file(d, inp, 8192, 1, &fname); - tt_int_op(r, OP_EQ, 0); - - /* Try mapping */ - const uint8_t *datap = NULL; - size_t sz = 0; - map = storage_dir_map_labeled(d, fname, &labels, &datap, &sz); - tt_assert(map); - tt_assert(datap); - tt_u64_op(sz, OP_EQ, bodylen); - tt_mem_op(datap, OP_EQ, inp+strlen((char*)inp)+1, bodylen); - tt_assert(labels); - tt_str_op(labels->key, OP_EQ, "Hello"); - tt_str_op(labels->value, OP_EQ, "world"); - tt_assert(labels->next); - tt_str_op(labels->next->key, OP_EQ, "This"); - tt_str_op(labels->next->value, OP_EQ, "is a test"); - tt_assert(labels->next->next); - tt_str_op(labels->next->next->key, OP_EQ, "Yadda"); - tt_str_op(labels->next->next->value, OP_EQ, "yadda."); - tt_ptr_op(labels->next->next->next, OP_EQ, NULL); - - /* Try reading this time. */ - sz = 0; - as_read = storage_dir_read_labeled(d, fname, &labels2, &sz); - tt_assert(as_read); - tt_u64_op(sz, OP_EQ, bodylen); - tt_mem_op(as_read, OP_EQ, inp+strlen((char*)inp)+1, bodylen); - tt_assert(config_lines_eq(labels, labels2)); - - done: - storage_dir_free(d); - tor_free(dirname); - tor_free(inp); - tor_free(fname); - config_free_lines(labels); - config_free_lines(labels2); - tor_munmap_file(map); - tor_free(as_read); -} - -#define ENT(name) \ - { #name, test_storagedir_ ## name, TT_FORK, NULL, NULL } - -struct testcase_t storagedir_tests[] = { - ENT(empty), - ENT(basic), - ENT(deletion), - ENT(full), - ENT(cleaning), - ENT(save_labeled), - ENT(read_labeled), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_switch_id.c b/src/tor/src/test/test_switch_id.c deleted file mode 100644 index fe36d8c6e..000000000 --- a/src/tor/src/test/test_switch_id.c +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (c) 2015-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" - -#ifdef HAVE_SYS_CAPABILITY_H -#include -#endif - -#define TEST_BUILT_WITH_CAPS 0 -#define TEST_HAVE_CAPS 1 -#define TEST_ROOT_CAN_BIND_LOW 2 -#define TEST_SETUID 3 -#define TEST_SETUID_KEEPCAPS 4 -#define TEST_SETUID_STRICT 5 - -static const struct { - const char *name; - int test_id; -} which_test[] = { - { "built-with-caps", TEST_BUILT_WITH_CAPS }, - { "have-caps", TEST_HAVE_CAPS }, - { "root-bind-low", TEST_ROOT_CAN_BIND_LOW }, - { "setuid", TEST_SETUID }, - { "setuid-keepcaps", TEST_SETUID_KEEPCAPS }, - { "setuid-strict", TEST_SETUID_STRICT }, - { NULL, 0 } -}; - -#if !defined(_WIN32) -/* 0 on no, 1 on yes, -1 on failure. */ -static int -check_can_bind_low_ports(void) -{ - int port; - struct sockaddr_in sin; - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - - for (port = 600; port < 1024; ++port) { - sin.sin_port = htons(port); - tor_socket_t fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (! SOCKET_OK(fd)) { - perror("socket"); - return -1; - } - - int one = 1; - if (setsockopt(fd, SOL_SOCKET,SO_REUSEADDR, (void*)&one, - (socklen_t)sizeof(one))) { - perror("setsockopt"); - tor_close_socket_simple(fd); - return -1; - } - - int res = bind(fd, (struct sockaddr *)&sin, sizeof(sin)); - tor_close_socket_simple(fd); - - if (res == 0) { - /* bind was successful */ - return 1; - } else if (errno == EACCES || errno == EPERM) { - /* Got a permission-denied error. */ - return 0; - } else if (errno == EADDRINUSE) { - /* Huh; somebody is using that port. */ - } else { - perror("bind"); - } - } - - return -1; -} -#endif /* !defined(_WIN32) */ - -int -main(int argc, char **argv) -{ -#if defined(_WIN32) - (void) argc; - (void) argv; - (void) which_test; - - fprintf(stderr, "This test is not supported on your OS.\n"); - return 77; -#else /* !(defined(_WIN32)) */ - const char *username; - const char *testname; - if (argc != 3) { - fprintf(stderr, "I want 2 arguments: a username and a command.\n"); - return 1; - } - if (getuid() != 0) { - fprintf(stderr, "This test only works when it's run as root.\n"); - return 1; - } - username = argv[1]; - testname = argv[2]; - int test_id = -1; - int i; - for (i = 0; which_test[i].name; ++i) { - if (!strcmp(which_test[i].name, testname)) { - test_id = which_test[i].test_id; - break; - } - } - if (test_id == -1) { - fprintf(stderr, "Unrecognized test '%s'\n", testname); - return 1; - } - -#ifdef HAVE_LINUX_CAPABILITIES - const int have_cap_support = 1; -#else - const int have_cap_support = 0; -#endif - - int okay; - - init_logging(1); - log_severity_list_t sev; - memset(&sev, 0, sizeof(sev)); - set_log_severity_config(LOG_WARN, LOG_ERR, &sev); - add_stream_log(&sev, "", fileno(stderr)); - - switch (test_id) - { - case TEST_BUILT_WITH_CAPS: - /* Succeed if we were built with capability support. */ - okay = have_cap_support; - break; - case TEST_HAVE_CAPS: - /* Succeed if "capabilities work" == "we were built with capability - * support." */ - okay = have_cap_support == have_capability_support(); - break; - case TEST_ROOT_CAN_BIND_LOW: - /* Succeed if root can bind low ports. */ - okay = check_can_bind_low_ports() == 1; - break; - case TEST_SETUID: - /* Succeed if we can do a setuid with no capability retention, and doing - * so makes us lose the ability to bind low ports */ - case TEST_SETUID_KEEPCAPS: - /* Succeed if we can do a setuid with capability retention, and doing so - * does not make us lose the ability to bind low ports */ - { - int keepcaps = (test_id == TEST_SETUID_KEEPCAPS); - okay = switch_id(username, keepcaps ? SWITCH_ID_KEEP_BINDLOW : 0) == 0; - if (okay) { - okay = check_can_bind_low_ports() == keepcaps; - } - break; - } - case TEST_SETUID_STRICT: - /* Succeed if, after a setuid, we cannot setuid back, and we cannot - * re-grab any capabilities. */ - okay = switch_id(username, SWITCH_ID_KEEP_BINDLOW) == 0; - if (okay) { - /* We'd better not be able to setuid back! */ - if (setuid(0) == 0 || errno != EPERM) { - okay = 0; - } - } -#ifdef HAVE_LINUX_CAPABILITIES - if (okay) { - cap_t caps = cap_get_proc(); - const cap_value_t caplist[] = { - CAP_SETUID, - }; - cap_set_flag(caps, CAP_PERMITTED, 1, caplist, CAP_SET); - if (cap_set_proc(caps) == 0 || errno != EPERM) { - okay = 0; - } - cap_free(caps); - } -#endif /* defined(HAVE_LINUX_CAPABILITIES) */ - break; - default: - fprintf(stderr, "Unsupported test '%s'\n", testname); - okay = 0; - break; - } - - if (!okay) { - fprintf(stderr, "Test %s failed!\n", testname); - } - - return (okay ? 0 : 1); -#endif /* defined(_WIN32) */ -} - diff --git a/src/tor/src/test/test_switch_id.sh b/src/tor/src/test/test_switch_id.sh deleted file mode 100644 index 79c44f2eb..000000000 --- a/src/tor/src/test/test_switch_id.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -if test "`id -u`" != '0'; then - echo "This test only works when run as root. Skipping." >&2 - exit 77 -fi - -if test "`id -u nobody`" = ""; then - echo "This test requires that your system have a 'nobody' user. Sorry." >&2 - exit 1 -fi - -if test "$OVERRIDE_GCDA_PERMISSIONS_HACK" = "yes"; then - find src -type f -name '*gcda' -print0 | xargs -0 chmod 0666 -fi - -"${builddir:-.}/src/test/test-switch-id" nobody setuid || exit 1 -"${builddir:-.}/src/test/test-switch-id" nobody root-bind-low || exit 1 -"${builddir:-.}/src/test/test-switch-id" nobody setuid-strict || exit 1 -"${builddir:-.}/src/test/test-switch-id" nobody built-with-caps || exit 0 -# ... Go beyond this point only if we were built with capability support. - -"${builddir:-.}/src/test/test-switch-id" nobody have-caps || exit 1 -"${builddir:-.}/src/test/test-switch-id" nobody setuid-keepcaps || exit 1 - -if test "$OVERRIDE_GCDA_PERMISSIONS_HACK" = "yes"; then - find src -type f -name '*gcda' -print0 | xargs -0 chmod 0644 -fi - -echo "All okay" - -exit 0 diff --git a/src/tor/src/test/test_threads.c b/src/tor/src/test/test_threads.c deleted file mode 100644 index ed6d8f04a..000000000 --- a/src/tor/src/test/test_threads.c +++ /dev/null @@ -1,304 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" -#include "compat_threads.h" -#include "test.h" - -/** mutex for thread test to stop the threads hitting data at the same time. */ -static tor_mutex_t *thread_test_mutex_ = NULL; -/** mutexes for the thread test to make sure that the threads have to - * interleave somewhat. */ -static tor_mutex_t *thread_test_start1_ = NULL, - *thread_test_start2_ = NULL; -/** Shared strmap for the thread test. */ -static strmap_t *thread_test_strmap_ = NULL; -/** The name of thread1 for the thread test */ -static char *thread1_name_ = NULL; -/** The name of thread2 for the thread test */ -static char *thread2_name_ = NULL; - -static int thread_fns_failed = 0; - -static unsigned long thread_fn_tid1, thread_fn_tid2; - -static void thread_test_func_(void* _s) ATTR_NORETURN; - -/** How many iterations have the threads in the unit test run? */ -static tor_threadlocal_t count; - -/** Helper function for threading unit tests: This function runs in a - * subthread. It grabs its own mutex (start1 or start2) to make sure that it - * should start, then it repeatedly alters _test_thread_strmap protected by - * thread_test_mutex_. */ -static void -thread_test_func_(void* _s) -{ - char *s = _s; - int i; - tor_mutex_t *m; - char buf[64]; - char **cp; - int *mycount = tor_malloc_zero(sizeof(int)); - tor_threadlocal_set(&count, mycount); - if (!strcmp(s, "thread 1")) { - m = thread_test_start1_; - cp = &thread1_name_; - thread_fn_tid1 = tor_get_thread_id(); - } else { - m = thread_test_start2_; - cp = &thread2_name_; - thread_fn_tid2 = tor_get_thread_id(); - } - - tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); - *cp = tor_strdup(buf); - - tor_mutex_acquire(m); - - for (i=0; i<10000; ++i) { - tor_mutex_acquire(thread_test_mutex_); - strmap_set(thread_test_strmap_, "last to run", *cp); - tor_mutex_release(thread_test_mutex_); - int *tls_count = tor_threadlocal_get(&count); - tor_assert(tls_count == mycount); - ++*tls_count; - } - tor_mutex_acquire(thread_test_mutex_); - strmap_set(thread_test_strmap_, s, *cp); - if (in_main_thread()) - ++thread_fns_failed; - tor_mutex_release(thread_test_mutex_); - - tor_free(mycount); - - tor_mutex_release(m); - - spawn_exit(); -} - -/** Run unit tests for threading logic. */ -static void -test_threads_basic(void *arg) -{ - char *s1 = NULL, *s2 = NULL; - int done = 0, timedout = 0; - time_t started; - (void) arg; - tt_int_op(tor_threadlocal_init(&count), OP_EQ, 0); - - set_main_thread(); - - thread_test_mutex_ = tor_mutex_new(); - thread_test_start1_ = tor_mutex_new(); - thread_test_start2_ = tor_mutex_new(); - thread_test_strmap_ = strmap_new(); - s1 = tor_strdup("thread 1"); - s2 = tor_strdup("thread 2"); - tor_mutex_acquire(thread_test_start1_); - tor_mutex_acquire(thread_test_start2_); - spawn_func(thread_test_func_, s1); - spawn_func(thread_test_func_, s2); - tor_mutex_release(thread_test_start2_); - tor_mutex_release(thread_test_start1_); - started = time(NULL); - while (!done) { - tor_mutex_acquire(thread_test_mutex_); - strmap_assert_ok(thread_test_strmap_); - if (strmap_get(thread_test_strmap_, "thread 1") && - strmap_get(thread_test_strmap_, "thread 2")) { - done = 1; - } else if (time(NULL) > started + 150) { - timedout = done = 1; - } - tor_mutex_release(thread_test_mutex_); - /* Prevent the main thread from starving the worker threads. */ - tor_sleep_msec(10); - } - tor_mutex_acquire(thread_test_start1_); - tor_mutex_release(thread_test_start1_); - tor_mutex_acquire(thread_test_start2_); - tor_mutex_release(thread_test_start2_); - - tor_mutex_free(thread_test_mutex_); - - if (timedout) { - tt_assert(strmap_get(thread_test_strmap_, "thread 1")); - tt_assert(strmap_get(thread_test_strmap_, "thread 2")); - tt_assert(!timedout); - } - - /* different thread IDs. */ - tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"), - strmap_get(thread_test_strmap_, "thread 2"))); - tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"), - strmap_get(thread_test_strmap_, "last to run")) || - !strcmp(strmap_get(thread_test_strmap_, "thread 2"), - strmap_get(thread_test_strmap_, "last to run"))); - - tt_int_op(thread_fns_failed, OP_EQ, 0); - tt_int_op(thread_fn_tid1, OP_NE, thread_fn_tid2); - - done: - tor_free(s1); - tor_free(s2); - tor_free(thread1_name_); - tor_free(thread2_name_); - if (thread_test_strmap_) - strmap_free(thread_test_strmap_, NULL); - if (thread_test_start1_) - tor_mutex_free(thread_test_start1_); - if (thread_test_start2_) - tor_mutex_free(thread_test_start2_); -} - -typedef struct cv_testinfo_s { - tor_cond_t *cond; - tor_mutex_t *mutex; - int value; - int addend; - int shutdown; - int n_shutdown; - int n_wakeups; - int n_timeouts; - int n_threads; - const struct timeval *tv; -} cv_testinfo_t; - -static cv_testinfo_t * -cv_testinfo_new(void) -{ - cv_testinfo_t *i = tor_malloc_zero(sizeof(*i)); - i->cond = tor_cond_new(); - i->mutex = tor_mutex_new_nonrecursive(); - return i; -} - -static void -cv_testinfo_free(cv_testinfo_t *i) -{ - if (!i) - return; - tor_cond_free(i->cond); - tor_mutex_free(i->mutex); - tor_free(i); -} - -static void cv_test_thr_fn_(void *arg) ATTR_NORETURN; - -static void -cv_test_thr_fn_(void *arg) -{ - cv_testinfo_t *i = arg; - int tid, r; - - tor_mutex_acquire(i->mutex); - tid = i->n_threads++; - tor_mutex_release(i->mutex); - (void) tid; - - tor_mutex_acquire(i->mutex); - while (1) { - if (i->addend) { - i->value += i->addend; - i->addend = 0; - } - - if (i->shutdown) { - ++i->n_shutdown; - i->shutdown = 0; - tor_mutex_release(i->mutex); - spawn_exit(); - } - r = tor_cond_wait(i->cond, i->mutex, i->tv); - ++i->n_wakeups; - if (r == 1) { - ++i->n_timeouts; - tor_mutex_release(i->mutex); - spawn_exit(); - } - } -} - -static void -test_threads_conditionvar(void *arg) -{ - cv_testinfo_t *ti=NULL; - const struct timeval msec100 = { 0, 100*1000 }; - const int timeout = !strcmp(arg, "tv"); - - ti = cv_testinfo_new(); - if (timeout) { - ti->tv = &msec100; - } - spawn_func(cv_test_thr_fn_, ti); - spawn_func(cv_test_thr_fn_, ti); - spawn_func(cv_test_thr_fn_, ti); - spawn_func(cv_test_thr_fn_, ti); - - tor_mutex_acquire(ti->mutex); - ti->addend = 7; - ti->shutdown = 1; - tor_cond_signal_one(ti->cond); - tor_mutex_release(ti->mutex); - -#define SPIN() \ - while (1) { \ - tor_mutex_acquire(ti->mutex); \ - if (ti->addend == 0) { \ - break; \ - } \ - tor_mutex_release(ti->mutex); \ - } - - SPIN(); - - ti->addend = 30; - ti->shutdown = 1; - tor_cond_signal_all(ti->cond); - tor_mutex_release(ti->mutex); - SPIN(); - - ti->addend = 1000; - if (! timeout) ti->shutdown = 1; - tor_cond_signal_one(ti->cond); - tor_mutex_release(ti->mutex); - SPIN(); - ti->addend = 300; - if (! timeout) ti->shutdown = 1; - tor_cond_signal_all(ti->cond); - tor_mutex_release(ti->mutex); - - SPIN(); - tor_mutex_release(ti->mutex); - - tt_int_op(ti->value, OP_EQ, 1337); - if (!timeout) { - tt_int_op(ti->n_shutdown, OP_EQ, 4); - } else { - tor_sleep_msec(200); - tor_mutex_acquire(ti->mutex); - tt_int_op(ti->n_shutdown, OP_EQ, 2); - tt_int_op(ti->n_timeouts, OP_EQ, 2); - tor_mutex_release(ti->mutex); - } - - done: - cv_testinfo_free(ti); -} - -#define THREAD_TEST(name) \ - { #name, test_threads_##name, TT_FORK, NULL, NULL } - -struct testcase_t thread_tests[] = { - THREAD_TEST(basic), - { "conditionvar", test_threads_conditionvar, TT_FORK, - &passthrough_setup, (void*)"no-tv" }, - { "conditionvar_timeout", test_threads_conditionvar, TT_FORK, - &passthrough_setup, (void*)"tv" }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_tortls.c b/src/tor/src/test/test_tortls.c deleted file mode 100644 index 29f7cc9c3..000000000 --- a/src/tor/src/test/test_tortls.c +++ /dev/null @@ -1,2827 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define TORTLS_PRIVATE -#define TORTLS_OPENSSL_PRIVATE -#define LOG_PRIVATE -#include "orconfig.h" - -#ifdef _WIN32 -#include -#endif -#include - -#include "compat.h" - -/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in - * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ -DISABLE_GCC_WARNING(redundant-decls) - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -ENABLE_GCC_WARNING(redundant-decls) - -#include "or.h" -#include "torlog.h" -#include "config.h" -#include "tortls.h" - -#include "test.h" -#include "log_test_helpers.h" -#define NS_MODULE tortls - -#ifndef HAVE_SSL_STATE -#define OPENSSL_OPAQUE -#endif - -#if defined(OPENSSL_OPAQUE) && !defined(LIBRESSL_VERSION_NUMBER) -#define SSL_STATE_STR "before SSL initialization" -#else -#define SSL_STATE_STR "before/accept initialization" -#endif - -#ifndef OPENSSL_OPAQUE -static SSL_METHOD * -give_me_a_test_method(void) -{ - SSL_METHOD *method = tor_malloc_zero(sizeof(SSL_METHOD)); - memcpy(method, TLSv1_method(), sizeof(SSL_METHOD)); - return method; -} - -static int -fake_num_ciphers(void) -{ - return 0; -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_errno_to_tls_error(void *data) -{ - (void) data; - tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNRESET)),OP_EQ, - TOR_TLS_ERROR_CONNRESET); - tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ETIMEDOUT)),OP_EQ, - TOR_TLS_ERROR_TIMEOUT); - tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(EHOSTUNREACH)),OP_EQ, - TOR_TLS_ERROR_NO_ROUTE); - tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ENETUNREACH)),OP_EQ, - TOR_TLS_ERROR_NO_ROUTE); - tt_int_op(tor_errno_to_tls_error(SOCK_ERRNO(ECONNREFUSED)),OP_EQ, - TOR_TLS_ERROR_CONNREFUSED); - tt_int_op(tor_errno_to_tls_error(0),OP_EQ,TOR_TLS_ERROR_MISC); - done: - (void)1; -} - -static void -test_tortls_err_to_string(void *data) -{ - (void) data; - tt_str_op(tor_tls_err_to_string(1),OP_EQ,"[Not an error.]"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_MISC),OP_EQ,"misc error"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_IO),OP_EQ,"unexpected close"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNREFUSED),OP_EQ, - "connection refused"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_CONNRESET),OP_EQ, - "connection reset"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_NO_ROUTE),OP_EQ, - "host unreachable"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_ERROR_TIMEOUT),OP_EQ, - "connection timed out"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_CLOSE),OP_EQ,"closed"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTREAD),OP_EQ,"want to read"); - tt_str_op(tor_tls_err_to_string(TOR_TLS_WANTWRITE),OP_EQ,"want to write"); - tt_str_op(tor_tls_err_to_string(-100),OP_EQ,"(unknown error code)"); - done: - (void)1; -} - -static int -mock_tls_cert_matches_key(const tor_tls_t *tls, const tor_x509_cert_t *cert) -{ - (void) tls; - (void) cert; // XXXX look at this. - return 1; -} - -static void -test_tortls_tor_tls_new(void *data) -{ - (void) data; - MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); - crypto_pk_t *key1 = NULL, *key2 = NULL; - SSL_METHOD *method = NULL; - - key1 = pk_generate(2); - key2 = pk_generate(3); - - tor_tls_t *tls = NULL; - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - key1, key2, 86400), OP_EQ, 0); - tls = tor_tls_new(-1, 0); - tt_want(tls); - tor_tls_free(tls); tls = NULL; - - SSL_CTX_free(client_tls_context->ctx); - client_tls_context->ctx = NULL; - tls = tor_tls_new(-1, 0); - tt_ptr_op(tls, OP_EQ, NULL); - -#ifndef OPENSSL_OPAQUE - method = give_me_a_test_method(); - SSL_CTX *ctx = SSL_CTX_new(method); - method->num_ciphers = fake_num_ciphers; - client_tls_context->ctx = ctx; - tls = tor_tls_new(-1, 0); - tt_ptr_op(tls, OP_EQ, NULL); -#endif /* !defined(OPENSSL_OPAQUE) */ - - done: - UNMOCK(tor_tls_cert_matches_key); - crypto_pk_free(key1); - crypto_pk_free(key2); - tor_tls_free(tls); - tor_free(method); - tor_tls_free_all(); -} - -#define NS_MODULE tortls -NS_DECL(void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, - const char *format, va_list ap)); - -static void -NS(logv)(int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, - va_list ap) -{ - (void) severity; - (void) domain; - (void) funcname; - (void) suffix; - (void) format; - (void) ap; // XXXX look at this. - CALLED(logv)++; -} - -static void -test_tortls_tor_tls_get_error(void *data) -{ - (void) data; - MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key); - crypto_pk_t *key1 = NULL, *key2 = NULL; - key1 = pk_generate(2); - key2 = pk_generate(3); - - tor_tls_t *tls = NULL; - tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER, - key1, key2, 86400), OP_EQ, 0); - tls = tor_tls_new(-1, 0); - NS_MOCK(logv); - tt_int_op(CALLED(logv), OP_EQ, 0); - tor_tls_get_error(tls, 0, 0, - (const char *)"test", 0, 0); - tt_int_op(CALLED(logv), OP_EQ, 1); - - done: - UNMOCK(tor_tls_cert_matches_key); - NS_UNMOCK(logv); - crypto_pk_free(key1); - crypto_pk_free(key2); - tor_tls_free(tls); -} - -static void -test_tortls_get_state_description(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - char *buf; - SSL_CTX *ctx; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(SSLv23_method()); - - buf = tor_malloc_zero(1000); - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tor_tls_get_state_description(NULL, buf, 20); - tt_str_op(buf, OP_EQ, "(No SSL object)"); - - SSL_free(tls->ssl); - tls->ssl = NULL; - tor_tls_get_state_description(tls, buf, 20); - tt_str_op(buf, OP_EQ, "(No SSL object)"); - - tls->ssl = SSL_new(ctx); - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in HANDSHAKE"); - - tls->state = TOR_TLS_ST_OPEN; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in OPEN"); - - tls->state = TOR_TLS_ST_GOTCLOSE; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in GOTCLOSE"); - - tls->state = TOR_TLS_ST_SENTCLOSE; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in SENTCLOSE"); - - tls->state = TOR_TLS_ST_CLOSED; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in CLOSED"); - - tls->state = TOR_TLS_ST_RENEGOTIATE; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in RENEGOTIATE"); - - tls->state = TOR_TLS_ST_BUFFEREVENT; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR); - - tls->state = 7; - tor_tls_get_state_description(tls, buf, 200); - tt_str_op(buf, OP_EQ, SSL_STATE_STR " in unknown TLS state"); - - done: - SSL_CTX_free(ctx); - SSL_free(tls->ssl); - tor_free(buf); - tor_free(tls); -} - -static void -test_tortls_get_by_ssl(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - tor_tls_t *res; - SSL_CTX *ctx; - SSL *ssl; - - SSL_library_init(); - SSL_load_error_strings(); - tor_tls_allocate_tor_tls_object_ex_data_index(); - - ctx = SSL_CTX_new(SSLv23_method()); - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->magic = TOR_TLS_MAGIC; - - ssl = SSL_new(ctx); - - res = tor_tls_get_by_ssl(ssl); - tt_assert(!res); - - SSL_set_ex_data(ssl, tor_tls_object_ex_data_index, tls); - - res = tor_tls_get_by_ssl(ssl); - tt_assert(res == tls); - - done: - SSL_free(ssl); - SSL_CTX_free(ctx); - tor_free(tls); -} - -static void -test_tortls_allocate_tor_tls_object_ex_data_index(void *ignored) -{ - (void)ignored; - int first; - - tor_tls_allocate_tor_tls_object_ex_data_index(); - - first = tor_tls_object_ex_data_index; - tor_tls_allocate_tor_tls_object_ex_data_index(); - tt_int_op(first, OP_EQ, tor_tls_object_ex_data_index); - - done: - (void)0; -} - -static void -test_tortls_log_one_error(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - SSL_CTX *ctx; - SSL *ssl = NULL; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(SSLv23_method()); - tls = tor_malloc_zero(sizeof(tor_tls_t)); - setup_capture_of_logs(LOG_INFO); - - tor_tls_log_one_error(NULL, 0, LOG_WARN, 0, "something"); - expect_log_msg("TLS error while something: " - "(null) (in (null):(null):---)\n"); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); - expect_log_msg("TLS error: (null) " - "(in (null):(null):---)\n"); - - mock_clean_saved_logs(); - tls->address = tor_strdup("127.hello"); - tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); - expect_log_msg("TLS error with 127.hello: " - "(null) (in (null):(null):---)\n"); - tor_free(tls->address); - - mock_clean_saved_logs(); - tls->address = tor_strdup("127.hello"); - tor_tls_log_one_error(tls, 0, LOG_WARN, 0, "blarg"); - expect_log_msg("TLS error while blarg with " - "127.hello: (null) (in (null):(null):---)\n"); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, 3), LOG_WARN, 0, NULL); - expect_log_msg("TLS error with 127.hello: " - "BN lib (in unknown library:(null):---)\n"); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_HTTP_REQUEST), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_HTTPS_PROXY_REQUEST), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_RECORD_LENGTH_MISMATCH), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); - -#ifndef OPENSSL_1_1_API - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_RECORD_TOO_LARGE), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); -#endif /* !defined(OPENSSL_1_1_API) */ - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_UNKNOWN_PROTOCOL), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, ERR_PACK(1, 2, SSL_R_UNSUPPORTED_PROTOCOL), - LOG_WARN, 0, NULL); - expect_log_severity(LOG_INFO); - - tls->ssl = SSL_new(ctx); - - mock_clean_saved_logs(); - tor_tls_log_one_error(tls, 0, LOG_WARN, 0, NULL); - expect_log_msg("TLS error with 127.hello: (null)" - " (in (null):(null):" SSL_STATE_STR ")\n"); - - done: - teardown_capture_of_logs(); - SSL_free(ssl); - SSL_CTX_free(ctx); - if (tls && tls->ssl) - SSL_free(tls->ssl); - if (tls) - tor_free(tls->address); - tor_free(tls); -} - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_get_error(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - int ret; - SSL_CTX *ctx; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(SSLv23_method()); - setup_capture_of_logs(LOG_INFO); - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = SSL_new(ctx); - SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); - - ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_IO); - expect_log_msg("TLS error: unexpected close while" - " something (before/accept initialization)\n"); - - mock_clean_saved_logs(); - ret = tor_tls_get_error(tls, 2, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, 0); - expect_no_log_entry(); - - mock_clean_saved_logs(); - ret = tor_tls_get_error(tls, 0, 1, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, -11); - expect_no_log_entry(); - - mock_clean_saved_logs(); - ERR_clear_error(); - ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); - ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); - expect_log_msg("TLS error while something: (null)" - " (in bignum routines:(null):before/accept initialization)\n"); - - mock_clean_saved_logs(); - ERR_clear_error(); - tls->ssl->rwstate = SSL_READING; - SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_READ; - ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, TOR_TLS_WANTREAD); - expect_no_log_entry(); - - mock_clean_saved_logs(); - ERR_clear_error(); - tls->ssl->rwstate = SSL_READING; - SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_WRITE; - ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, TOR_TLS_WANTWRITE); - expect_no_log_entry(); - - mock_clean_saved_logs(); - ERR_clear_error(); - tls->ssl->rwstate = 0; - tls->ssl->shutdown = SSL_RECEIVED_SHUTDOWN; - tls->ssl->s3->warn_alert =SSL_AD_CLOSE_NOTIFY; - ret = tor_tls_get_error(tls, 0, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, TOR_TLS_CLOSE); - expect_log_entry(); - - mock_clean_saved_logs(); - ret = tor_tls_get_error(tls, 0, 2, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, -10); - expect_no_log_entry(); - - mock_clean_saved_logs(); - ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); - ret = tor_tls_get_error(tls, -1, 0, "something", LOG_WARN, 0); - tt_int_op(ret, OP_EQ, -9); - expect_log_msg("TLS error while something: (null) (in system library:" - "connect:before/accept initialization)\n"); - - done: - teardown_capture_of_logs(); - SSL_free(tls->ssl); - tor_free(tls); - SSL_CTX_free(ctx); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_always_accept_verify_cb(void *ignored) -{ - (void)ignored; - int ret; - - ret = always_accept_verify_cb(0, NULL); - tt_int_op(ret, OP_EQ, 1); - - done: - (void)0; -} - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_x509_cert_free(void *ignored) -{ - (void)ignored; - tor_x509_cert_t *cert; - - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - tor_x509_cert_free(cert); - - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - cert->cert = tor_malloc_zero(sizeof(X509)); - cert->encoded = tor_malloc_zero(1); - tor_x509_cert_free(cert); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_x509_cert_get_id_digests(void *ignored) -{ - (void)ignored; - tor_x509_cert_t *cert; - common_digests_t *d; - const common_digests_t *res; - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - d = tor_malloc_zero(sizeof(common_digests_t)); - d->d[0][0] = 42; - - res = tor_x509_cert_get_id_digests(cert); - tt_assert(!res); - - cert->pkey_digests_set = 1; - cert->pkey_digests = *d; - res = tor_x509_cert_get_id_digests(cert); - tt_int_op(res->d[0][0], OP_EQ, 42); - - done: - tor_free(cert); - tor_free(d); -} - -#ifndef OPENSSL_OPAQUE -static int -fixed_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) -{ - (void) a; (void) b; - return 1; -} - -static void -fake_x509_free(X509 *cert) -{ - if (cert) { - if (cert->cert_info) { - if (cert->cert_info->key) { - if (cert->cert_info->key->pkey) { - tor_free(cert->cert_info->key->pkey); - } - tor_free(cert->cert_info->key); - } - tor_free(cert->cert_info); - } - tor_free(cert); - } -} - -static void -test_tortls_cert_matches_key(void *ignored) -{ - (void)ignored; - int res; - tor_tls_t *tls; - tor_x509_cert_t *cert; - X509 *one = NULL, *two = NULL; - EVP_PKEY_ASN1_METHOD *meth = EVP_PKEY_asn1_new(999, 0, NULL, NULL); - EVP_PKEY_asn1_set_public(meth, NULL, NULL, fixed_pub_cmp, NULL, NULL, NULL); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - one = tor_malloc_zero(sizeof(X509)); - one->references = 1; - two = tor_malloc_zero(sizeof(X509)); - two->references = 1; - - res = tor_tls_cert_matches_key(tls, cert); - tt_int_op(res, OP_EQ, 0); - - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - tls->ssl->session->peer = one; - res = tor_tls_cert_matches_key(tls, cert); - tt_int_op(res, OP_EQ, 0); - - cert->cert = two; - res = tor_tls_cert_matches_key(tls, cert); - tt_int_op(res, OP_EQ, 0); - - one->cert_info = tor_malloc_zero(sizeof(X509_CINF)); - one->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); - one->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); - one->cert_info->key->pkey->references = 1; - one->cert_info->key->pkey->ameth = meth; - one->cert_info->key->pkey->type = 1; - - two->cert_info = tor_malloc_zero(sizeof(X509_CINF)); - two->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); - two->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); - two->cert_info->key->pkey->references = 1; - two->cert_info->key->pkey->ameth = meth; - two->cert_info->key->pkey->type = 2; - - res = tor_tls_cert_matches_key(tls, cert); - tt_int_op(res, OP_EQ, 0); - - one->cert_info->key->pkey->type = 1; - two->cert_info->key->pkey->type = 1; - res = tor_tls_cert_matches_key(tls, cert); - tt_int_op(res, OP_EQ, 1); - - done: - EVP_PKEY_asn1_free(meth); - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - tor_free(cert); - fake_x509_free(one); - fake_x509_free(two); -} - -static void -test_tortls_cert_get_key(void *ignored) -{ - (void)ignored; - tor_x509_cert_t *cert = NULL; - crypto_pk_t *res = NULL; - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - X509 *key = NULL; - key = tor_malloc_zero(sizeof(X509)); - key->references = 1; - - res = tor_tls_cert_get_key(cert); - tt_assert(!res); - - cert->cert = key; - key->cert_info = tor_malloc_zero(sizeof(X509_CINF)); - key->cert_info->key = tor_malloc_zero(sizeof(X509_PUBKEY)); - key->cert_info->key->pkey = tor_malloc_zero(sizeof(EVP_PKEY)); - key->cert_info->key->pkey->references = 1; - key->cert_info->key->pkey->type = 2; - res = tor_tls_cert_get_key(cert); - tt_assert(!res); - - done: - fake_x509_free(key); - tor_free(cert); - crypto_pk_free(res); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_get_my_client_auth_key(void *ignored) -{ - (void)ignored; - crypto_pk_t *ret; - crypto_pk_t *expected; - tor_tls_context_t *ctx; - RSA *k = RSA_new(); - - ctx = tor_malloc_zero(sizeof(tor_tls_context_t)); - expected = crypto_new_pk_from_rsa_(k); - ctx->auth_key = expected; - - client_tls_context = NULL; - ret = tor_tls_get_my_client_auth_key(); - tt_assert(!ret); - - client_tls_context = ctx; - ret = tor_tls_get_my_client_auth_key(); - tt_assert(ret == expected); - - done: - RSA_free(k); - tor_free(expected); - tor_free(ctx); -} - -static void -test_tortls_get_my_certs(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_context_t *ctx; - const tor_x509_cert_t *link_cert_out = NULL; - const tor_x509_cert_t *id_cert_out = NULL; - - ctx = tor_malloc_zero(sizeof(tor_tls_context_t)); - - client_tls_context = NULL; - ret = tor_tls_get_my_certs(0, NULL, NULL); - tt_int_op(ret, OP_EQ, -1); - - server_tls_context = NULL; - ret = tor_tls_get_my_certs(1, NULL, NULL); - tt_int_op(ret, OP_EQ, -1); - - client_tls_context = ctx; - ret = tor_tls_get_my_certs(0, NULL, NULL); - tt_int_op(ret, OP_EQ, 0); - - client_tls_context = ctx; - ret = tor_tls_get_my_certs(0, &link_cert_out, &id_cert_out); - tt_int_op(ret, OP_EQ, 0); - - server_tls_context = ctx; - ret = tor_tls_get_my_certs(1, &link_cert_out, &id_cert_out); - tt_int_op(ret, OP_EQ, 0); - - done: - (void)1; -} - -#ifndef HAVE_SSL_GET_CLIENT_CIPHERS -static SSL_CIPHER * -get_cipher_by_name(const char *name) -{ - int i; - const SSL_METHOD *method = SSLv23_method(); - int num = method->num_ciphers(); - - for (i = 0; i < num; ++i) { - const SSL_CIPHER *cipher = method->get_cipher(i); - const char *ciphername = SSL_CIPHER_get_name(cipher); - if (!strcmp(ciphername, name)) { - return (SSL_CIPHER *)cipher; - } - } - - return NULL; -} -#endif /* !defined(HAVE_SSL_GET_CLIENT_CIPHERS) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_get_ciphersuite_name(void *ignored) -{ - (void)ignored; - const char *ret; - tor_tls_t *ctx; - ctx = tor_malloc_zero(sizeof(tor_tls_t)); - ctx->ssl = tor_malloc_zero(sizeof(SSL)); - - ret = tor_tls_get_ciphersuite_name(ctx); - tt_str_op(ret, OP_EQ, "(NONE)"); - - done: - tor_free(ctx->ssl); - tor_free(ctx); -} - -static SSL_CIPHER * -get_cipher_by_id(uint16_t id) -{ - int i; - const SSL_METHOD *method = SSLv23_method(); - int num = method->num_ciphers(); - for (i = 0; i < num; ++i) { - const SSL_CIPHER *cipher = method->get_cipher(i); - if (id == (SSL_CIPHER_get_id(cipher) & 0xffff)) { - return (SSL_CIPHER *)cipher; - } - } - - return NULL; -} - -static void -test_tortls_classify_client_ciphers(void *ignored) -{ - (void)ignored; - int i; - int ret; - SSL_CTX *ctx; - SSL *ssl; - tor_tls_t *tls; - STACK_OF(SSL_CIPHER) *ciphers; - SSL_CIPHER *tmp_cipher; - - SSL_library_init(); - SSL_load_error_strings(); - tor_tls_allocate_tor_tls_object_ex_data_index(); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->magic = TOR_TLS_MAGIC; - - ctx = SSL_CTX_new(TLSv1_method()); - ssl = SSL_new(ctx); - tls->ssl = ssl; - - ciphers = sk_SSL_CIPHER_new_null(); - - ret = tor_tls_classify_client_ciphers(ssl, NULL); - tt_int_op(ret, OP_EQ, -1); - - SSL_set_ex_data(ssl, tor_tls_object_ex_data_index, tls); - tls->client_cipher_list_type = 42; - - ret = tor_tls_classify_client_ciphers(ssl, NULL); - tt_int_op(ret, OP_EQ, 42); - - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 1); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 1); - - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, SSL_get_ciphers(ssl)); - tt_int_op(ret, OP_EQ, 3); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); - - SSL_CIPHER *one = get_cipher_by_name(TLS1_TXT_DHE_RSA_WITH_AES_128_SHA), - *two = get_cipher_by_name(TLS1_TXT_DHE_RSA_WITH_AES_256_SHA), - *three = get_cipher_by_name(SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA), - *four = NULL; - sk_SSL_CIPHER_push(ciphers, one); - sk_SSL_CIPHER_push(ciphers, two); - sk_SSL_CIPHER_push(ciphers, three); - sk_SSL_CIPHER_push(ciphers, four); - - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 1); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 1); - - sk_SSL_CIPHER_zero(ciphers); - - one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); - one->id = 0x00ff; - two = get_cipher_by_name("ECDHE-RSA-AES128-GCM-SHA256"); - two->id = 0x0000; - sk_SSL_CIPHER_push(ciphers, one); - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 3); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); - - sk_SSL_CIPHER_push(ciphers, two); - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 3); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); - - one->id = 0xC00A; - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 3); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 3); - - sk_SSL_CIPHER_zero(ciphers); - for (i=0; v2_cipher_list[i]; i++) { - tmp_cipher = get_cipher_by_id(v2_cipher_list[i]); - tt_assert(tmp_cipher); - sk_SSL_CIPHER_push(ciphers, tmp_cipher); - } - tls->client_cipher_list_type = 0; - ret = tor_tls_classify_client_ciphers(ssl, ciphers); - tt_int_op(ret, OP_EQ, 2); - tt_int_op(tls->client_cipher_list_type, OP_EQ, 2); - - done: - sk_SSL_CIPHER_free(ciphers); - SSL_free(tls->ssl); - tor_free(tls); - SSL_CTX_free(ctx); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_client_is_using_v2_ciphers(void *ignored) -{ - (void)ignored; - -#ifdef HAVE_SSL_GET_CLIENT_CIPHERS - tt_skip(); - done: - (void)1; -#else - int ret; - SSL_CTX *ctx; - SSL *ssl; - SSL_SESSION *sess; - STACK_OF(SSL_CIPHER) *ciphers; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(TLSv1_method()); - ssl = SSL_new(ctx); - sess = SSL_SESSION_new(); - - ret = tor_tls_client_is_using_v2_ciphers(ssl); - tt_int_op(ret, OP_EQ, -1); - - ssl->session = sess; - ret = tor_tls_client_is_using_v2_ciphers(ssl); - tt_int_op(ret, OP_EQ, 0); - - ciphers = sk_SSL_CIPHER_new_null(); - SSL_CIPHER *one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); - one->id = 0x00ff; - sk_SSL_CIPHER_push(ciphers, one); - sess->ciphers = ciphers; - ret = tor_tls_client_is_using_v2_ciphers(ssl); - tt_int_op(ret, OP_EQ, 1); - done: - SSL_free(ssl); - SSL_CTX_free(ctx); -#endif /* defined(HAVE_SSL_GET_CLIENT_CIPHERS) */ -} - -#ifndef OPENSSL_OPAQUE -static X509 *fixed_try_to_extract_certs_from_tls_cert_out_result = NULL; -static X509 *fixed_try_to_extract_certs_from_tls_id_cert_out_result = NULL; - -static void -fixed_try_to_extract_certs_from_tls(int severity, tor_tls_t *tls, - X509 **cert_out, X509 **id_cert_out) -{ - (void) severity; - (void) tls; - *cert_out = fixed_try_to_extract_certs_from_tls_cert_out_result; - *id_cert_out = fixed_try_to_extract_certs_from_tls_id_cert_out_result; -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static const char* notCompletelyValidCertString = - "-----BEGIN CERTIFICATE-----\n" - "MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n" - "A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n" - "MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n" - "YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n" - "ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n" - "CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n" - "ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n" - "+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n" - "MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n" - "C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n" - "kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n" - "jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n" - "evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n" - "-----END CERTIFICATE-----\n"; -#endif /* !defined(OPENSSL_OPAQUE) */ - -static const char* validCertString = "-----BEGIN CERTIFICATE-----\n" - "MIIDpTCCAY0CAg3+MA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNVBAYTAlVTMREwDwYD\n" - "VQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIGA1UECgwLVG9yIFRl\n" - "c3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkwNjEzMzk1OVoXDTQz\n" - "MDEyMjEzMzk1OVowVjELMAkGA1UEBhMCVVMxEDAOBgNVBAcMB0NoaWNhZ28xFDAS\n" - "BgNVBAoMC1RvciBUZXN0aW5nMR8wHQYDVQQDDBZ0ZXN0aW5nLnRvcnByb2plY3Qu\n" - "b3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoT6uyVVhWyOF3wkHjjYbd\n" - "nKaykyRv4JVtKQdZ4OpEErmX1zw4MmyzpQNV6iR4bQnWiyLfzyVJMZDIC/WILBfX\n" - "w2Pza/yuLgUvDc3twMuhOACzOQVO8PrEF/aVv2+hbCCy2udXvKhnYn+CCXl3ozc8\n" - "XcKYvujTXDyvGWY3xwAjlQIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQCUvnhzQWuQ\n" - "MrN+pERkE+zcTI/9dGS90rUMMLgu8VDNqTa0TUQh8uO0EQ6uDvI8Js6e8tgwS0BR\n" - "UBahqb7ZHv+rejGCBr5OudqD+x4STiiuPNJVs86JTLN8SpM9CHjIBH5WCCN2KOy3\n" - "mevNoRcRRyYJzSFULCunIK6FGulszigMYGscrO4oiTkZiHPh9KvWT40IMiHfL+Lw\n" - "EtEWiLex6064LcA2YQ1AMuSZyCexks63lcfaFmQbkYOKqXa1oLkIRuDsOaSVjTfe\n" - "vec+X6jvf12cFTKS5WIeqkKF2Irt+dJoiHEGTe5RscUMN/f+gqHPzfFz5dR23sxo\n" - "g+HC6MZHlFkLAOx3wW6epPS8A/m1mw3zMPoTnb2U2YYt8T0dJMMlUn/7Y1sEAa+a\n" - "dSTMaeUf6VnJ//11m454EZl1to9Z7oJOgqmFffSrdD4BGIWe8f7hhW6L1Enmqe/J\n" - "BKL3wbzZh80O1W0bndAwhnEEhlzneFY84cbBo9pmVxpODHkUcStpr5Z7pBDrcL21\n" - "Ss/aB/1YrsVXhdvJdOGxl3Mnl9dUY57CympLGlT8f0pPS6GAKOelECOhFMHmJd8L\n" - "dj3XQSmKtYHevZ6IvuMXSlB/fJvSjSlkCuLo5+kJoaqPuRu+i/S1qxeRy3CBwmnE\n" - "LdSNdcX4N79GQJ996PA8+mUCQG7YRtK+WA==\n" - "-----END CERTIFICATE-----\n"; - -static const char* caCertString = "-----BEGIN CERTIFICATE-----\n" - "MIIFjzCCA3egAwIBAgIJAKd5WgyfPMYRMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV\n" - "BAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwHQ2hpY2FnbzEUMBIG\n" - "A1UECgwLVG9yIFRlc3RpbmcxFDASBgNVBAMMC1RvciBUZXN0aW5nMB4XDTE1MDkw\n" - "NjEzMzc0MVoXDTQzMDEyMjEzMzc0MVowXjELMAkGA1UEBhMCVVMxETAPBgNVBAgM\n" - "CElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRQwEgYDVQQKDAtUb3IgVGVzdGlu\n" - "ZzEUMBIGA1UEAwwLVG9yIFRlc3RpbmcwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\n" - "ggIKAoICAQCpLMUEiLW5leUgBZoEJms2V7lZRhIAjnJBhVMHD0e3UubNknmaQoxf\n" - "ARz3rvqOaRd0JlV+qM9qE0DjiYcCVP1cAfqAo9d83uS1vwY3YMVJzADlaIiHfyVW\n" - "uEgBy0vvkeUBqaua24dYlcwsemOiXYLu41yM1wkcGHW1AhBNHppY6cznb8TyLgNM\n" - "2x3SGUdzc5XMyAFx51faKGBA3wjs+Hg1PLY7d30nmCgEOBavpm5I1disM/0k+Mcy\n" - "YmAKEo/iHJX/rQzO4b9znP69juLlR8PDBUJEVIG/CYb6+uw8MjjUyiWXYoqfVmN2\n" - "hm/lH8b6rXw1a2Aa3VTeD0DxaWeacMYHY/i01fd5n7hCoDTRNdSw5KJ0L3Z0SKTu\n" - "0lzffKzDaIfyZGlpW5qdouACkWYzsaitQOePVE01PIdO30vUfzNTFDfy42ccx3Di\n" - "59UCu+IXB+eMtrBfsok0Qc63vtF1linJgjHW1z/8ujk8F7/qkOfODhk4l7wngc2A\n" - "EmwWFIFoGaiTEZHB9qteXr4unbXZ0AHpM02uGGwZEGohjFyebEb73M+J57WKKAFb\n" - "PqbLcGUksL1SHNBNAJcVLttX55sO4nbidOS/kA3m+F1R04MBTyQF9qA6YDDHqdI3\n" - "h/3pw0Z4fxVouTYT4/NfRnX4JTP4u+7Mpcoof28VME0qWqD1LnRhFQIDAQABo1Aw\n" - "TjAdBgNVHQ4EFgQUMoAgIXH7pZ3QMRwTjT+DM9Yo/v0wHwYDVR0jBBgwFoAUMoAg\n" - "IXH7pZ3QMRwTjT+DM9Yo/v0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\n" - "AgEAUJxacjXR9sT+Xs6ISFiUsyd0T6WVKMnV46xrYJHirGfx+krWHrjxMY+ZtxYD\n" - "DBDGlo11Qc4v6QrclNf5QUBfIiGQsP9Cm6hHcQ+Tpg9HHCgSqG1YNPwCPReCR4br\n" - "BLvLfrfkcBL2IWM0PdQdCze+59DBfipsULD2mEn9fjYRXQEwb2QWtQ9qRc20Yb/x\n" - "Q4b/+CvUodLkaq7B8MHz0BV8HHcBoph6DYaRmO/N+hPauIuSp6XyaGYcEefGKVKj\n" - "G2+fcsdyXsoijNdL8vNKwm4j2gVwCBnw16J00yfFoV46YcbfqEdJB2je0XSvwXqt\n" - "14AOTngxso2h9k9HLtrfpO1ZG/B5AcCMs1lzbZ2fp5DPHtjvvmvA2RJqgo3yjw4W\n" - "4DHAuTglYFlC3mDHNfNtcGP20JvepcQNzNP2UzwcpOc94hfKikOFw+gf9Vf1qd0y\n" - "h/Sk6OZHn2+JVUPiWHIQV98Vtoh4RmUZDJD+b55ia3fQGTGzt4z1XFzQYSva5sfs\n" - "wocS/papthqWldQU7x+3wofNd5CNU1x6WKXG/yw30IT/4F8ADJD6GeygNT8QJYvt\n" - "u/8lAkbOy6B9xGmSvr0Kk1oq9P2NshA6kalxp1Oz/DTNDdL4AeBXV3JmM6WWCjGn\n" - "Yy1RT69d0rwYc5u/vnqODz1IjvT90smsrkBumGt791FAFeg=\n" - "-----END CERTIFICATE-----\n"; - -static X509 * -read_cert_from(const char *str) -{ - BIO *bio = BIO_new(BIO_s_mem()); - BIO_write(bio, str, (int) strlen(str)); - X509 *res = PEM_read_bio_X509(bio, NULL, NULL, NULL); - BIO_free(bio); - return res; -} - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_verify(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - crypto_pk_t *k = NULL; - X509 *cert1 = NULL, *cert2 = NULL, *invalidCert = NULL, - *validCert = NULL, *caCert = NULL; - - cert1 = tor_malloc_zero(sizeof(X509)); - cert1->references = 10; - - cert2 = tor_malloc_zero(sizeof(X509)); - cert2->references = 10; - - validCert = read_cert_from(validCertString); - caCert = read_cert_from(caCertString); - invalidCert = read_cert_from(notCompletelyValidCertString); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - ret = tor_tls_verify(LOG_WARN, tls, &k); - tt_int_op(ret, OP_EQ, -1); - - MOCK(try_to_extract_certs_from_tls, fixed_try_to_extract_certs_from_tls); - - fixed_try_to_extract_certs_from_tls_cert_out_result = cert1; - ret = tor_tls_verify(LOG_WARN, tls, &k); - tt_int_op(ret, OP_EQ, -1); - - fixed_try_to_extract_certs_from_tls_id_cert_out_result = cert2; - ret = tor_tls_verify(LOG_WARN, tls, &k); - tt_int_op(ret, OP_EQ, -1); - - fixed_try_to_extract_certs_from_tls_cert_out_result = invalidCert; - fixed_try_to_extract_certs_from_tls_id_cert_out_result = invalidCert; - - ret = tor_tls_verify(LOG_WARN, tls, &k); - tt_int_op(ret, OP_EQ, -1); - - fixed_try_to_extract_certs_from_tls_cert_out_result = validCert; - fixed_try_to_extract_certs_from_tls_id_cert_out_result = caCert; - - ret = tor_tls_verify(LOG_WARN, tls, &k); - tt_int_op(ret, OP_EQ, 0); - tt_assert(k); - - done: - UNMOCK(try_to_extract_certs_from_tls); - tor_free(cert1); - tor_free(cert2); - tor_free(tls); - tor_free(k); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_check_lifetime(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - X509 *validCert = read_cert_from(validCertString); - time_t now = time(NULL); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, 0); - tt_int_op(ret, OP_EQ, -1); - - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - tls->ssl->session->peer = validCert; - ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, 0); - tt_int_op(ret, OP_EQ, 0); - - ASN1_STRING_free(validCert->cert_info->validity->notBefore); - validCert->cert_info->validity->notBefore = ASN1_TIME_set(NULL, now-10); - ASN1_STRING_free(validCert->cert_info->validity->notAfter); - validCert->cert_info->validity->notAfter = ASN1_TIME_set(NULL, now+60); - - ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), 0, -1000); - tt_int_op(ret, OP_EQ, -1); - - ret = tor_tls_check_lifetime(LOG_WARN, tls, time(NULL), -1000, 0); - tt_int_op(ret, OP_EQ, -1); - - done: - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - X509_free(validCert); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static int fixed_ssl_pending_result = 0; - -static int -fixed_ssl_pending(const SSL *ignored) -{ - (void)ignored; - return fixed_ssl_pending_result; -} - -static void -test_tortls_get_pending_bytes(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - SSL_METHOD *method; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - method = tor_malloc_zero(sizeof(SSL_METHOD)); - method->ssl_pending = fixed_ssl_pending; - tls->ssl->method = method; - - fixed_ssl_pending_result = 42; - ret = tor_tls_get_pending_bytes(tls); - tt_int_op(ret, OP_EQ, 42); - - done: - tor_free(method); - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_get_forced_write_size(void *ignored) -{ - (void)ignored; - long ret; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tls->wantwrite_n = 43; - ret = tor_tls_get_forced_write_size(tls); - tt_int_op(ret, OP_EQ, 43); - - done: - tor_free(tls); -} - -static void -test_tortls_get_write_overhead_ratio(void *ignored) -{ - (void)ignored; - double ret; - - total_bytes_written_over_tls = 0; - ret = tls_get_write_overhead_ratio(); - tt_double_op(fabs(ret - 1.0), OP_LT, 1E-12); - - total_bytes_written_by_tls = 10; - total_bytes_written_over_tls = 1; - ret = tls_get_write_overhead_ratio(); - tt_double_op(fabs(ret - 10.0), OP_LT, 1E-12); - - total_bytes_written_by_tls = 10; - total_bytes_written_over_tls = 2; - ret = tls_get_write_overhead_ratio(); - tt_double_op(fabs(ret - 5.0), OP_LT, 1E-12); - - done: - (void)0; -} - -static void -test_tortls_used_v1_handshake(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - // These tests assume both V2 handshake server and client are enabled - tls->wasV2Handshake = 0; - ret = tor_tls_used_v1_handshake(tls); - tt_int_op(ret, OP_EQ, 1); - - tls->wasV2Handshake = 1; - ret = tor_tls_used_v1_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - - done: - tor_free(tls); -} - -static void -test_tortls_get_num_server_handshakes(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tls->server_handshake_count = 3; - ret = tor_tls_get_num_server_handshakes(tls); - tt_int_op(ret, OP_EQ, 3); - - done: - tor_free(tls); -} - -static void -test_tortls_server_got_renegotiate(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tls->got_renegotiate = 1; - ret = tor_tls_server_got_renegotiate(tls); - tt_int_op(ret, OP_EQ, 1); - - done: - tor_free(tls); -} - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_SSL_SESSION_get_master_key(void *ignored) -{ - (void)ignored; - size_t ret; - tor_tls_t *tls; - uint8_t *out; - out = tor_malloc_zero(1); - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - tls->ssl->session->master_key_length = 1; - -#ifndef HAVE_SSL_SESSION_GET_MASTER_KEY - tls->ssl->session->master_key[0] = 43; - ret = SSL_SESSION_get_master_key(tls->ssl->session, out, 0); - tt_int_op(ret, OP_EQ, 1); - tt_int_op(out[0], OP_EQ, 0); - - ret = SSL_SESSION_get_master_key(tls->ssl->session, out, 1); - tt_int_op(ret, OP_EQ, 1); - tt_int_op(out[0], OP_EQ, 43); - - done: -#endif /* !defined(HAVE_SSL_SESSION_GET_MASTER_KEY) */ - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - tor_free(out); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_get_tlssecrets(void *ignored) -{ - (void)ignored; - int ret; - uint8_t *secret_out = tor_malloc_zero(DIGEST256_LEN); - tor_tls_t *tls; - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - tls->ssl->session->master_key_length = 1; - tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); - - ret = tor_tls_get_tlssecrets(tls, secret_out); - tt_int_op(ret, OP_EQ, 0); - - done: - tor_free(secret_out); - tor_free(tls->ssl->s3); - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_get_buffer_sizes(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - size_t rbuf_c=-1, rbuf_b=-1, wbuf_c=-1, wbuf_b=-1; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); - - tls->ssl->s3->rbuf.buf = NULL; - tls->ssl->s3->rbuf.len = 1; - tls->ssl->s3->rbuf.offset = 0; - tls->ssl->s3->rbuf.left = 42; - - tls->ssl->s3->wbuf.buf = NULL; - tls->ssl->s3->wbuf.len = 2; - tls->ssl->s3->wbuf.offset = 0; - tls->ssl->s3->wbuf.left = 43; - - ret = tor_tls_get_buffer_sizes(tls, &rbuf_c, &rbuf_b, &wbuf_c, &wbuf_b); -#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) - tt_int_op(ret, OP_EQ, -1); -#else - tt_int_op(ret, OP_EQ, 0); - tt_int_op(rbuf_c, OP_EQ, 0); - tt_int_op(wbuf_c, OP_EQ, 0); - tt_int_op(rbuf_b, OP_EQ, 42); - tt_int_op(wbuf_b, OP_EQ, 43); - - tls->ssl->s3->rbuf.buf = tor_malloc_zero(1); - tls->ssl->s3->wbuf.buf = tor_malloc_zero(1); - ret = tor_tls_get_buffer_sizes(tls, &rbuf_c, &rbuf_b, &wbuf_c, &wbuf_b); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(rbuf_c, OP_EQ, 1); - tt_int_op(wbuf_c, OP_EQ, 2); - -#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) */ - - done: - tor_free(tls->ssl->s3->rbuf.buf); - tor_free(tls->ssl->s3->wbuf.buf); - tor_free(tls->ssl->s3); - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_evaluate_ecgroup_for_tls(void *ignored) -{ - (void)ignored; - int ret; - - ret = evaluate_ecgroup_for_tls(NULL); - tt_int_op(ret, OP_EQ, 1); - - ret = evaluate_ecgroup_for_tls("foobar"); - tt_int_op(ret, OP_EQ, 0); - - ret = evaluate_ecgroup_for_tls("P256"); - tt_int_op(ret, OP_EQ, 1); - - ret = evaluate_ecgroup_for_tls("P224"); - // tt_int_op(ret, OP_EQ, 1); This varies between machines - tt_assert(ret == 0 || ret == 1); - - done: - (void)0; -} - -#ifndef OPENSSL_OPAQUE -typedef struct cert_pkey_st_local -{ - X509 *x509; - EVP_PKEY *privatekey; - const EVP_MD *digest; -} CERT_PKEY_local; - -typedef struct sess_cert_st_local -{ - STACK_OF(X509) *cert_chain; - int peer_cert_type; - CERT_PKEY_local *peer_key; - CERT_PKEY_local peer_pkeys[8]; - int references; -} SESS_CERT_local; - -static void -test_tortls_try_to_extract_certs_from_tls(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - X509 *cert = NULL, *id_cert = NULL, *c1 = NULL, *c2 = NULL; - SESS_CERT_local *sess = NULL; - - c1 = read_cert_from(validCertString); - c2 = read_cert_from(caCertString); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - sess = tor_malloc_zero(sizeof(SESS_CERT_local)); - tls->ssl->session->sess_cert = (void *)sess; - - try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); - tt_assert(!cert); - tt_assert(!id_cert); - - tls->ssl->session->peer = c1; - try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); - tt_assert(cert == c1); - tt_assert(!id_cert); - X509_free(cert); /* decrease refcnt */ - - sess->cert_chain = sk_X509_new_null(); - try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); - tt_assert(cert == c1); - tt_assert(!id_cert); - X509_free(cert); /* decrease refcnt */ - - sk_X509_push(sess->cert_chain, c1); - sk_X509_push(sess->cert_chain, c2); - - try_to_extract_certs_from_tls(LOG_WARN, tls, &cert, &id_cert); - tt_assert(cert == c1); - tt_assert(id_cert); - X509_free(cert); /* decrease refcnt */ - - done: - sk_X509_free(sess->cert_chain); - tor_free(sess); - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - X509_free(c1); - X509_free(c2); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_get_peer_cert(void *ignored) -{ - (void)ignored; - tor_x509_cert_t *ret; - tor_tls_t *tls; - X509 *cert = NULL; - - cert = read_cert_from(validCertString); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - - ret = tor_tls_get_peer_cert(tls); - tt_assert(!ret); - - tls->ssl->session->peer = cert; - ret = tor_tls_get_peer_cert(tls); - tt_assert(ret); - tt_assert(ret->cert == cert); - - done: - tor_x509_cert_free(ret); - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - X509_free(cert); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_peer_has_cert(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - X509 *cert = NULL; - - cert = read_cert_from(validCertString); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->session = tor_malloc_zero(sizeof(SSL_SESSION)); - - ret = tor_tls_peer_has_cert(tls); - tt_assert(!ret); - - tls->ssl->session->peer = cert; - ret = tor_tls_peer_has_cert(tls); - tt_assert(ret); - - done: - tor_free(tls->ssl->session); - tor_free(tls->ssl); - tor_free(tls); - X509_free(cert); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_is_server(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - int ret; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->isServer = 1; - ret = tor_tls_is_server(tls); - tt_int_op(ret, OP_EQ, 1); - - done: - tor_free(tls); -} - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_session_secret_cb(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - SSL_CTX *ctx; - STACK_OF(SSL_CIPHER) *ciphers = NULL; - SSL_CIPHER *one; - - SSL_library_init(); - SSL_load_error_strings(); - tor_tls_allocate_tor_tls_object_ex_data_index(); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tls->magic = TOR_TLS_MAGIC; - - ctx = SSL_CTX_new(TLSv1_method()); - tls->ssl = SSL_new(ctx); - SSL_set_ex_data(tls->ssl, tor_tls_object_ex_data_index, tls); - - SSL_set_session_secret_cb(tls->ssl, tor_tls_session_secret_cb, NULL); - - tor_tls_session_secret_cb(tls->ssl, NULL, NULL, NULL, NULL, NULL); - tt_assert(!tls->ssl->tls_session_secret_cb); - - one = get_cipher_by_name("ECDHE-RSA-AES256-GCM-SHA384"); - one->id = 0x00ff; - ciphers = sk_SSL_CIPHER_new_null(); - sk_SSL_CIPHER_push(ciphers, one); - - tls->client_cipher_list_type = 0; - tor_tls_session_secret_cb(tls->ssl, NULL, NULL, ciphers, NULL, NULL); - tt_assert(!tls->ssl->tls_session_secret_cb); - - done: - sk_SSL_CIPHER_free(ciphers); - SSL_free(tls->ssl); - SSL_CTX_free(ctx); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -/* TODO: It seems block_renegotiation and unblock_renegotiation and - * using different blags. This might not be correct */ -static void -test_tortls_block_renegotiation(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->s3 = tor_malloc_zero(sizeof(SSL3_STATE)); -#ifndef SUPPORT_UNSAFE_RENEGOTIATION_FLAG -#define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0 -#endif - - tls->ssl->s3->flags = SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; - - tor_tls_block_renegotiation(tls); - -#ifndef OPENSSL_1_1_API - tt_assert(!(tls->ssl->s3->flags & - SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); -#endif - - done: - tor_free(tls->ssl->s3); - tor_free(tls->ssl); - tor_free(tls); -} - -static void -test_tortls_unblock_renegotiation(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tor_tls_unblock_renegotiation(tls); - - tt_uint_op(SSL_get_options(tls->ssl) & - SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION, OP_EQ, - SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); - - done: - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_assert_renegotiation_unblocked(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tor_tls_unblock_renegotiation(tls); - tor_tls_assert_renegotiation_unblocked(tls); - /* No assertion here - this test will fail if tor_assert is turned on - * and things are bad. */ - - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static void -test_tortls_set_logged_address(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - - tor_tls_set_logged_address(tls, "foo bar"); - - tt_str_op(tls->address, OP_EQ, "foo bar"); - - tor_tls_set_logged_address(tls, "foo bar 2"); - tt_str_op(tls->address, OP_EQ, "foo bar 2"); - - done: - tor_free(tls->address); - tor_free(tls); -} - -#ifndef OPENSSL_OPAQUE -static void -example_cb(tor_tls_t *t, void *arg) -{ - (void)t; - (void)arg; -} - -static void -test_tortls_set_renegotiate_callback(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - const char *arg = "hello"; - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - - tor_tls_set_renegotiate_callback(tls, example_cb, (void*)arg); - tt_assert(tls->negotiated_callback == example_cb); - tt_assert(tls->callback_arg == arg); - tt_assert(!tls->got_renegotiate); - - /* Assumes V2_HANDSHAKE_SERVER */ - tt_assert(tls->ssl->info_callback == tor_tls_server_info_callback); - - tor_tls_set_renegotiate_callback(tls, NULL, (void*)arg); - tt_assert(tls->ssl->info_callback == tor_tls_debug_state_callback); - - done: - tor_free(tls->ssl); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static SSL_CIPHER *fixed_cipher1 = NULL; -static SSL_CIPHER *fixed_cipher2 = NULL; -static const SSL_CIPHER * -fake_get_cipher(unsigned ncipher) -{ - - switch (ncipher) { - case 1: - return fixed_cipher1; - case 2: - return fixed_cipher2; - default: - return NULL; - } -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_find_cipher_by_id(void *ignored) -{ - (void)ignored; - int ret; - SSL *ssl; - SSL_CTX *ctx; - const SSL_METHOD *m = TLSv1_method(); - SSL_METHOD *empty_method = tor_malloc_zero(sizeof(SSL_METHOD)); - - fixed_cipher1 = tor_malloc_zero(sizeof(SSL_CIPHER)); - fixed_cipher2 = tor_malloc_zero(sizeof(SSL_CIPHER)); - fixed_cipher2->id = 0xC00A; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(m); - ssl = SSL_new(ctx); - - ret = find_cipher_by_id(ssl, NULL, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - ret = find_cipher_by_id(ssl, m, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - ret = find_cipher_by_id(ssl, m, 0xFFFF); - tt_int_op(ret, OP_EQ, 0); - - ret = find_cipher_by_id(ssl, empty_method, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - ret = find_cipher_by_id(ssl, empty_method, 0xFFFF); -#ifdef HAVE_SSL_CIPHER_FIND - tt_int_op(ret, OP_EQ, 0); -#else - tt_int_op(ret, OP_EQ, 1); -#endif - - empty_method->get_cipher = fake_get_cipher; - ret = find_cipher_by_id(ssl, empty_method, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - empty_method->get_cipher = m->get_cipher; - empty_method->num_ciphers = m->num_ciphers; - ret = find_cipher_by_id(ssl, empty_method, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - empty_method->get_cipher = fake_get_cipher; - empty_method->num_ciphers = m->num_ciphers; - ret = find_cipher_by_id(ssl, empty_method, 0xC00A); - tt_int_op(ret, OP_EQ, 1); - - empty_method->num_ciphers = fake_num_ciphers; - ret = find_cipher_by_id(ssl, empty_method, 0xC00A); -#ifdef HAVE_SSL_CIPHER_FIND - tt_int_op(ret, OP_EQ, 1); -#else - tt_int_op(ret, OP_EQ, 0); -#endif - - done: - tor_free(empty_method); - SSL_free(ssl); - SSL_CTX_free(ctx); - tor_free(fixed_cipher1); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_debug_state_callback(void *ignored) -{ - (void)ignored; - SSL *ssl; - char *buf = tor_malloc_zero(1000); - int n; - - setup_capture_of_logs(LOG_DEBUG); - - ssl = tor_malloc_zero(sizeof(SSL)); - - tor_tls_debug_state_callback(ssl, 32, 45); - - n = tor_snprintf(buf, 1000, "SSL %p is now in state unknown" - " state [type=32,val=45].\n", ssl); - /* tor's snprintf returns -1 on error */ - tt_int_op(n, OP_NE, -1); - expect_log_msg(buf); - - done: - teardown_capture_of_logs(); - tor_free(buf); - tor_free(ssl); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_server_info_callback(void *ignored) -{ - (void)ignored; - tor_tls_t *tls; - SSL_CTX *ctx; - SSL *ssl; - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(TLSv1_method()); - ssl = SSL_new(ctx); - - tor_tls_allocate_tor_tls_object_ex_data_index(); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->magic = TOR_TLS_MAGIC; - tls->ssl = ssl; - - setup_full_capture_of_logs(LOG_WARN); - SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_A); - mock_clean_saved_logs(); - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - expect_single_log_msg("Couldn't look up the tls for an SSL*. How odd!\n"); - - SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_B); - mock_clean_saved_logs(); - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - expect_single_log_msg("Couldn't look up the tls for an SSL*. How odd!\n"); - - SSL_set_state(ssl, 99); - mock_clean_saved_logs(); - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - expect_no_log_entry(); - teardown_capture_of_logs(); - - SSL_set_ex_data(tls->ssl, tor_tls_object_ex_data_index, tls); - SSL_set_state(ssl, SSL3_ST_SW_SRVR_HELLO_B); - tls->negotiated_callback = 0; - tls->server_handshake_count = 120; - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - tt_int_op(tls->server_handshake_count, OP_EQ, 121); - - tls->server_handshake_count = 127; - tls->negotiated_callback = (void *)1; - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - tt_int_op(tls->server_handshake_count, OP_EQ, 127); - tt_int_op(tls->got_renegotiate, OP_EQ, 1); - - tls->ssl->session = SSL_SESSION_new(); - tls->wasV2Handshake = 0; - tor_tls_server_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 0); - tt_int_op(tls->wasV2Handshake, OP_EQ, 0); - - done: - teardown_capture_of_logs(); - SSL_free(ssl); - SSL_CTX_free(ctx); - tor_free(tls); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static int fixed_ssl_read_result_index; -static int fixed_ssl_read_result[5]; -static int fixed_ssl_shutdown_result; - -static int -fixed_ssl_read(SSL *s, void *buf, int len) -{ - (void)s; - (void)buf; - (void)len; - return fixed_ssl_read_result[fixed_ssl_read_result_index++]; -} - -static int -fixed_ssl_shutdown(SSL *s) -{ - (void)s; - return fixed_ssl_shutdown_result; -} - -#ifndef LIBRESSL_VERSION_NUMBER -static int fixed_ssl_state_to_set; -static tor_tls_t *fixed_tls; - -static int -setting_version_ssl_shutdown(SSL *s) -{ - s->version = SSL2_VERSION; - return fixed_ssl_shutdown_result; -} - -static int -setting_version_and_state_ssl_shutdown(SSL *s) -{ - fixed_tls->state = fixed_ssl_state_to_set; - s->version = SSL2_VERSION; - return fixed_ssl_shutdown_result; -} -#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ - -static int -dummy_handshake_func(SSL *s) -{ - (void)s; - return 1; -} - -static void -test_tortls_shutdown(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - SSL_METHOD *method = give_me_a_test_method(); - setup_capture_of_logs(LOG_WARN); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->ssl->method = method; - method->ssl_read = fixed_ssl_read; - method->ssl_shutdown = fixed_ssl_shutdown; - - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, -9); - - tls->state = TOR_TLS_ST_SENTCLOSE; - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = -1; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, -9); - -#ifndef LIBRESSL_VERSION_NUMBER - tls->ssl->handshake_func = dummy_handshake_func; - - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = 42; - fixed_ssl_read_result[2] = 0; - fixed_ssl_shutdown_result = 1; - ERR_clear_error(); - tls->ssl->version = SSL2_VERSION; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_DONE); - tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); - - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = 42; - fixed_ssl_read_result[2] = 0; - fixed_ssl_shutdown_result = 0; - ERR_clear_error(); - tls->ssl->version = 0; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_DONE); - tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); - - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = 42; - fixed_ssl_read_result[2] = 0; - fixed_ssl_shutdown_result = 0; - ERR_clear_error(); - tls->ssl->version = 0; - method->ssl_shutdown = setting_version_ssl_shutdown; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); - - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = 42; - fixed_ssl_read_result[2] = 0; - fixed_ssl_shutdown_result = 0; - fixed_tls = tls; - fixed_ssl_state_to_set = TOR_TLS_ST_GOTCLOSE; - ERR_clear_error(); - tls->ssl->version = 0; - method->ssl_shutdown = setting_version_and_state_ssl_shutdown; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); - - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 10; - fixed_ssl_read_result[1] = 42; - fixed_ssl_read_result[2] = 0; - fixed_ssl_read_result[3] = -1; - fixed_ssl_shutdown_result = 0; - fixed_tls = tls; - fixed_ssl_state_to_set = 0; - ERR_clear_error(); - tls->ssl->version = 0; - method->ssl_shutdown = setting_version_and_state_ssl_shutdown; - ret = tor_tls_shutdown(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); -#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ - - done: - teardown_capture_of_logs(); - tor_free(method); - tor_free(tls->ssl); - tor_free(tls); -} - -static int negotiated_callback_called; - -static void -negotiated_callback_setter(tor_tls_t *t, void *arg) -{ - (void)t; - (void)arg; - negotiated_callback_called++; -} - -static void -test_tortls_read(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - char buf[100]; - SSL_METHOD *method = give_me_a_test_method(); - setup_capture_of_logs(LOG_WARN); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->state = TOR_TLS_ST_OPEN; - - ret = tor_tls_read(tls, buf, 10); - tt_int_op(ret, OP_EQ, -9); - - /* These tests assume that V2_HANDSHAKE_SERVER is set */ - tls->ssl->handshake_func = dummy_handshake_func; - tls->ssl->method = method; - method->ssl_read = fixed_ssl_read; - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 42; - tls->state = TOR_TLS_ST_OPEN; - ERR_clear_error(); - ret = tor_tls_read(tls, buf, 10); - tt_int_op(ret, OP_EQ, 42); - - tls->state = TOR_TLS_ST_OPEN; - tls->got_renegotiate = 1; - fixed_ssl_read_result_index = 0; - ERR_clear_error(); - ret = tor_tls_read(tls, buf, 10); - tt_int_op(tls->got_renegotiate, OP_EQ, 0); - - tls->state = TOR_TLS_ST_OPEN; - tls->got_renegotiate = 1; - negotiated_callback_called = 0; - tls->negotiated_callback = negotiated_callback_setter; - fixed_ssl_read_result_index = 0; - ERR_clear_error(); - ret = tor_tls_read(tls, buf, 10); - tt_int_op(negotiated_callback_called, OP_EQ, 1); - -#ifndef LIBRESSL_VERSION_NUMBER - fixed_ssl_read_result_index = 0; - fixed_ssl_read_result[0] = 0; - tls->ssl->version = SSL2_VERSION; - ERR_clear_error(); - ret = tor_tls_read(tls, buf, 10); - tt_int_op(ret, OP_EQ, TOR_TLS_CLOSE); - tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_CLOSED); -#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ - // TODO: fill up - - done: - teardown_capture_of_logs(); - tor_free(tls->ssl); - tor_free(tls); - tor_free(method); -} - -static int fixed_ssl_write_result; - -static int -fixed_ssl_write(SSL *s, const void *buf, int len) -{ - (void)s; - (void)buf; - (void)len; - return fixed_ssl_write_result; -} - -static void -test_tortls_write(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - SSL_METHOD *method = give_me_a_test_method(); - char buf[100]; - setup_capture_of_logs(LOG_WARN); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = tor_malloc_zero(sizeof(SSL)); - tls->state = TOR_TLS_ST_OPEN; - - ret = tor_tls_write(tls, buf, 0); - tt_int_op(ret, OP_EQ, 0); - - ret = tor_tls_write(tls, buf, 10); - tt_int_op(ret, OP_EQ, -9); - - tls->ssl->method = method; - tls->wantwrite_n = 1; - ret = tor_tls_write(tls, buf, 10); - tt_int_op(tls->wantwrite_n, OP_EQ, 0); - - method->ssl_write = fixed_ssl_write; - tls->ssl->handshake_func = dummy_handshake_func; - fixed_ssl_write_result = 1; - ERR_clear_error(); - ret = tor_tls_write(tls, buf, 10); - tt_int_op(ret, OP_EQ, 1); - - fixed_ssl_write_result = -1; - ERR_clear_error(); - tls->ssl->rwstate = SSL_READING; - SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); - SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_READ; - ret = tor_tls_write(tls, buf, 10); - tt_int_op(ret, OP_EQ, TOR_TLS_WANTREAD); - - ERR_clear_error(); - tls->ssl->rwstate = SSL_READING; - SSL_set_bio(tls->ssl, BIO_new(BIO_s_mem()), NULL); - SSL_get_rbio(tls->ssl)->flags = BIO_FLAGS_WRITE; - ret = tor_tls_write(tls, buf, 10); - tt_int_op(ret, OP_EQ, TOR_TLS_WANTWRITE); - - done: - teardown_capture_of_logs(); - BIO_free(tls->ssl->rbio); - tor_free(tls->ssl); - tor_free(tls); - tor_free(method); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static int fixed_ssl_accept_result; -static int fixed_ssl_connect_result; - -static int -setting_error_ssl_accept(SSL *ssl) -{ - (void)ssl; - ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); - ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); - return fixed_ssl_accept_result; -} - -static int -setting_error_ssl_connect(SSL *ssl) -{ - (void)ssl; - ERR_put_error(ERR_LIB_BN, 2, -1, "somewhere.c", 99); - ERR_put_error(ERR_LIB_SYS, 2, -1, "somewhere.c", 99); - return fixed_ssl_connect_result; -} - -static int -fixed_ssl_accept(SSL *ssl) -{ - (void) ssl; - return fixed_ssl_accept_result; -} - -static void -test_tortls_handshake(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - SSL_CTX *ctx; - SSL_METHOD *method = give_me_a_test_method(); - setup_capture_of_logs(LOG_INFO); - - SSL_library_init(); - SSL_load_error_strings(); - - ctx = SSL_CTX_new(TLSv1_method()); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = SSL_new(ctx); - tls->state = TOR_TLS_ST_HANDSHAKE; - - ret = tor_tls_handshake(tls); - tt_int_op(ret, OP_EQ, -9); - - tls->isServer = 1; - tls->state = TOR_TLS_ST_HANDSHAKE; - ret = tor_tls_handshake(tls); - tt_int_op(ret, OP_EQ, -9); - - tls->ssl->method = method; - method->ssl_accept = fixed_ssl_accept; - fixed_ssl_accept_result = 2; - ERR_clear_error(); - tls->state = TOR_TLS_ST_HANDSHAKE; - ret = tor_tls_handshake(tls); - tt_int_op(tls->state, OP_EQ, TOR_TLS_ST_OPEN); - - method->ssl_accept = setting_error_ssl_accept; - fixed_ssl_accept_result = 1; - ERR_clear_error(); - mock_clean_saved_logs(); - tls->state = TOR_TLS_ST_HANDSHAKE; - ret = tor_tls_handshake(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); - expect_log_entry(); - /* This fails on jessie. Investigate why! */ -#if 0 - expect_log_msg("TLS error while handshaking: (null) (in bignum routines:" - "(null):SSLv3 write client hello B)\n"); - expect_log_msg("TLS error while handshaking: (null) (in system library:" - "connect:SSLv3 write client hello B)\n"); -#endif /* 0 */ - expect_log_severity(LOG_INFO); - - tls->isServer = 0; - method->ssl_connect = setting_error_ssl_connect; - fixed_ssl_connect_result = 1; - ERR_clear_error(); - mock_clean_saved_logs(); - tls->state = TOR_TLS_ST_HANDSHAKE; - ret = tor_tls_handshake(tls); - tt_int_op(ret, OP_EQ, TOR_TLS_ERROR_MISC); - expect_log_entry(); -#if 0 - /* See above */ - expect_log_msg("TLS error while handshaking: " - "(null) (in bignum routines:(null):SSLv3 write client hello B)\n"); - expect_log_msg("TLS error while handshaking: " - "(null) (in system library:connect:SSLv3 write client hello B)\n"); -#endif /* 0 */ - expect_log_severity(LOG_WARN); - - done: - teardown_capture_of_logs(); - SSL_free(tls->ssl); - SSL_CTX_free(ctx); - tor_free(tls); - tor_free(method); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -#ifndef OPENSSL_OPAQUE -static void -test_tortls_finish_handshake(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_t *tls; - SSL_CTX *ctx; - SSL_METHOD *method = give_me_a_test_method(); - SSL_library_init(); - SSL_load_error_strings(); - - X509 *c1 = read_cert_from(validCertString); - SESS_CERT_local *sess = NULL; - - ctx = SSL_CTX_new(method); - - tls = tor_malloc_zero(sizeof(tor_tls_t)); - tls->ssl = SSL_new(ctx); - tls->state = TOR_TLS_ST_OPEN; - - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - - tls->isServer = 1; - tls->wasV2Handshake = 0; - setup_full_capture_of_logs(LOG_WARN); - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tls->wasV2Handshake, OP_EQ, 1); - expect_single_log_msg_containing("For some reason, wasV2Handshake didn't " - "get set."); - teardown_capture_of_logs(); - - tls->wasV2Handshake = 1; - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tls->wasV2Handshake, OP_EQ, 1); - - tls->wasV2Handshake = 1; - tls->ssl->session = SSL_SESSION_new(); - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tls->wasV2Handshake, OP_EQ, 0); - - tls->isServer = 0; - - sess = tor_malloc_zero(sizeof(SESS_CERT_local)); - tls->ssl->session->sess_cert = (void *)sess; - sess->cert_chain = sk_X509_new_null(); - sk_X509_push(sess->cert_chain, c1); - tls->ssl->session->peer = c1; - tls->wasV2Handshake = 0; - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, 0); - tt_int_op(tls->wasV2Handshake, OP_EQ, 1); - - method->num_ciphers = fake_num_ciphers; - ret = tor_tls_finish_handshake(tls); - tt_int_op(ret, OP_EQ, -9); - - done: - if (sess) - sk_X509_free(sess->cert_chain); - if (tls->ssl && tls->ssl->session) { - tor_free(tls->ssl->session->sess_cert); - } - SSL_free(tls->ssl); - tor_free(tls); - SSL_CTX_free(ctx); - tor_free(method); - teardown_capture_of_logs(); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static int fixed_crypto_pk_new_result_index; -static crypto_pk_t *fixed_crypto_pk_new_result[5]; - -static crypto_pk_t * -fixed_crypto_pk_new(void) -{ - return fixed_crypto_pk_new_result[fixed_crypto_pk_new_result_index++]; -} - -#ifndef OPENSSL_OPAQUE -static int fixed_crypto_pk_generate_key_with_bits_result_index; -static int fixed_crypto_pk_generate_key_with_bits_result[5]; -static int fixed_tor_tls_create_certificate_result_index; -static X509 *fixed_tor_tls_create_certificate_result[5]; -static int fixed_tor_x509_cert_new_result_index; -static tor_x509_cert_t *fixed_tor_x509_cert_new_result[5]; - -static int -fixed_crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits) -{ - (void)env; - (void)bits; - return fixed_crypto_pk_generate_key_with_bits_result[ - fixed_crypto_pk_generate_key_with_bits_result_index++]; -} - -static X509 * -fixed_tor_tls_create_certificate(crypto_pk_t *rsa, - crypto_pk_t *rsa_sign, - const char *cname, - const char *cname_sign, - unsigned int cert_lifetime) -{ - (void)rsa; - (void)rsa_sign; - (void)cname; - (void)cname_sign; - (void)cert_lifetime; - return fixed_tor_tls_create_certificate_result[ - fixed_tor_tls_create_certificate_result_index++]; -} - -static tor_x509_cert_t * -fixed_tor_x509_cert_new(X509 *x509_cert) -{ - (void) x509_cert; - return fixed_tor_x509_cert_new_result[ - fixed_tor_x509_cert_new_result_index++]; -} - -static void -test_tortls_context_new(void *ignored) -{ - (void)ignored; - tor_tls_context_t *ret; - crypto_pk_t *pk1, *pk2, *pk3, *pk4, *pk5, *pk6, *pk7, *pk8, *pk9, *pk10, - *pk11, *pk12, *pk13, *pk14, *pk15, *pk16, *pk17, *pk18; - - pk1 = crypto_pk_new(); - pk2 = crypto_pk_new(); - pk3 = crypto_pk_new(); - pk4 = crypto_pk_new(); - pk5 = crypto_pk_new(); - pk6 = crypto_pk_new(); - pk7 = crypto_pk_new(); - pk8 = crypto_pk_new(); - pk9 = crypto_pk_new(); - pk10 = crypto_pk_new(); - pk11 = crypto_pk_new(); - pk12 = crypto_pk_new(); - pk13 = crypto_pk_new(); - pk14 = crypto_pk_new(); - pk15 = crypto_pk_new(); - pk16 = crypto_pk_new(); - pk17 = crypto_pk_new(); - pk18 = crypto_pk_new(); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = NULL; - MOCK(crypto_pk_new, fixed_crypto_pk_new); - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - /* note: we already override this in testing_common.c, so we - * run this unit test in a subprocess. */ - MOCK(crypto_pk_generate_key_with_bits, - fixed_crypto_pk_generate_key_with_bits); - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk1; - fixed_crypto_pk_new_result[1] = NULL; - fixed_crypto_pk_generate_key_with_bits_result[0] = -1; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk2; - fixed_crypto_pk_new_result[1] = NULL; - fixed_crypto_pk_generate_key_with_bits_result[0] = 0; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk3; - fixed_crypto_pk_new_result[1] = pk4; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result[0] = 0; - fixed_crypto_pk_generate_key_with_bits_result[1] = -1; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - MOCK(tor_tls_create_certificate, fixed_tor_tls_create_certificate); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk5; - fixed_crypto_pk_new_result[1] = pk6; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_crypto_pk_generate_key_with_bits_result[1] = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = NULL; - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk7; - fixed_crypto_pk_new_result[1] = pk8; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = NULL; - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk9; - fixed_crypto_pk_new_result[1] = pk10; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = NULL; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - MOCK(tor_x509_cert_new, fixed_tor_x509_cert_new); - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk11; - fixed_crypto_pk_new_result[1] = pk12; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - fixed_tor_x509_cert_new_result_index = 0; - fixed_tor_x509_cert_new_result[0] = NULL; - fixed_tor_x509_cert_new_result[1] = NULL; - fixed_tor_x509_cert_new_result[2] = NULL; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk13; - fixed_crypto_pk_new_result[1] = pk14; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - fixed_tor_x509_cert_new_result_index = 0; - fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - fixed_tor_x509_cert_new_result[1] = NULL; - fixed_tor_x509_cert_new_result[2] = NULL; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk15; - fixed_crypto_pk_new_result[1] = pk16; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - fixed_tor_x509_cert_new_result_index = 0; - fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - fixed_tor_x509_cert_new_result[1] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - fixed_tor_x509_cert_new_result[2] = NULL; - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = pk17; - fixed_crypto_pk_new_result[1] = pk18; - fixed_crypto_pk_new_result[2] = NULL; - fixed_crypto_pk_generate_key_with_bits_result_index = 0; - fixed_tor_tls_create_certificate_result_index = 0; - fixed_tor_tls_create_certificate_result[0] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[1] = tor_malloc_zero(sizeof(X509)); - fixed_tor_tls_create_certificate_result[2] = tor_malloc_zero(sizeof(X509)); - fixed_tor_x509_cert_new_result_index = 0; - fixed_tor_x509_cert_new_result[0] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - fixed_tor_x509_cert_new_result[1] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - fixed_tor_x509_cert_new_result[2] = tor_malloc_zero(sizeof(tor_x509_cert_t)); - ret = tor_tls_context_new(NULL, 0, 0, 0); - tt_assert(!ret); - - done: - UNMOCK(tor_x509_cert_new); - UNMOCK(tor_tls_create_certificate); - UNMOCK(crypto_pk_generate_key_with_bits); - UNMOCK(crypto_pk_new); -} -#endif /* !defined(OPENSSL_OPAQUE) */ - -static int fixed_crypto_pk_get_evp_pkey_result_index = 0; -static EVP_PKEY *fixed_crypto_pk_get_evp_pkey_result[5]; - -static EVP_PKEY * -fixed_crypto_pk_get_evp_pkey_(crypto_pk_t *env, int private) -{ - (void) env; - (void) private; - return fixed_crypto_pk_get_evp_pkey_result[ - fixed_crypto_pk_get_evp_pkey_result_index++]; -} - -static void -test_tortls_create_certificate(void *ignored) -{ - (void)ignored; - X509 *ret; - crypto_pk_t *pk1, *pk2; - - pk1 = crypto_pk_new(); - pk2 = crypto_pk_new(); - - MOCK(crypto_pk_get_evp_pkey_, fixed_crypto_pk_get_evp_pkey_); - fixed_crypto_pk_get_evp_pkey_result_index = 0; - fixed_crypto_pk_get_evp_pkey_result[0] = NULL; - ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); - tt_assert(!ret); - - fixed_crypto_pk_get_evp_pkey_result_index = 0; - fixed_crypto_pk_get_evp_pkey_result[0] = EVP_PKEY_new(); - fixed_crypto_pk_get_evp_pkey_result[1] = NULL; - ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); - tt_assert(!ret); - - fixed_crypto_pk_get_evp_pkey_result_index = 0; - fixed_crypto_pk_get_evp_pkey_result[0] = EVP_PKEY_new(); - fixed_crypto_pk_get_evp_pkey_result[1] = EVP_PKEY_new(); - ret = tor_tls_create_certificate(pk1, pk2, "hello", "hello2", 1); - tt_assert(!ret); - - done: - UNMOCK(crypto_pk_get_evp_pkey_); - crypto_pk_free(pk1); - crypto_pk_free(pk2); -} - -static void -test_tortls_cert_new(void *ignored) -{ - (void)ignored; - tor_x509_cert_t *ret; - X509 *cert = read_cert_from(validCertString); - - ret = tor_x509_cert_new(NULL); - tt_assert(!ret); - - ret = tor_x509_cert_new(cert); - tt_assert(ret); - tor_x509_cert_free(ret); - ret = NULL; - -#if 0 - cert = read_cert_from(validCertString); - /* XXX this doesn't do what you think: it alters a copy of the pubkey. */ - X509_get_pubkey(cert)->type = EVP_PKEY_DSA; - ret = tor_x509_cert_new(cert); - tt_assert(ret); -#endif /* 0 */ - -#ifndef OPENSSL_OPAQUE - cert = read_cert_from(validCertString); - X509_CINF_free(cert->cert_info); - cert->cert_info = NULL; - ret = tor_x509_cert_new(cert); - tt_assert(ret); -#endif /* !defined(OPENSSL_OPAQUE) */ - - done: - tor_x509_cert_free(ret); -} - -static void -test_tortls_cert_is_valid(void *ignored) -{ - (void)ignored; - int ret; - tor_x509_cert_t *cert = NULL, *scert = NULL; - - scert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 0); - - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 0); - tor_free(scert); - tor_free(cert); - - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 1); - -#ifndef OPENSSL_OPAQUE - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - ASN1_TIME_free(cert->cert->cert_info->validity->notAfter); - cert->cert->cert_info->validity->notAfter = - ASN1_TIME_set(NULL, time(NULL)-1000000); - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 0); - - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - X509_PUBKEY_free(cert->cert->cert_info->key); - cert->cert->cert_info->key = NULL; - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); - tt_int_op(ret, OP_EQ, 0); -#endif /* !defined(OPENSSL_OPAQUE) */ - -#if 0 - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - /* This doesn't actually change the key in the cert. XXXXXX */ - BN_one(EVP_PKEY_get1_RSA(X509_get_pubkey(cert->cert))->n); - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); - tt_int_op(ret, OP_EQ, 0); - - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - /* This doesn't actually change the key in the cert. XXXXXX */ - X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 1); - tt_int_op(ret, OP_EQ, 0); - - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - /* This doesn't actually change the key in the cert. XXXXXX */ - X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 1); - - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); - cert = tor_x509_cert_new(read_cert_from(validCertString)); - scert = tor_x509_cert_new(read_cert_from(caCertString)); - /* This doesn't actually change the key in the cert. XXXXXX */ - X509_get_pubkey(cert->cert)->type = EVP_PKEY_EC; - X509_get_pubkey(cert->cert)->ameth = NULL; - ret = tor_tls_cert_is_valid(LOG_WARN, cert, scert, time(NULL), 0); - tt_int_op(ret, OP_EQ, 0); -#endif /* 0 */ - - done: - tor_x509_cert_free(cert); - tor_x509_cert_free(scert); -} - -static void -test_tortls_context_init_one(void *ignored) -{ - (void)ignored; - int ret; - tor_tls_context_t *old = NULL; - - MOCK(crypto_pk_new, fixed_crypto_pk_new); - - fixed_crypto_pk_new_result_index = 0; - fixed_crypto_pk_new_result[0] = NULL; - ret = tor_tls_context_init_one(&old, NULL, 0, 0, 0); - tt_int_op(ret, OP_EQ, -1); - - done: - UNMOCK(crypto_pk_new); -} - -#define LOCAL_TEST_CASE(name, flags) \ - { #name, test_tortls_##name, (flags|TT_FORK), NULL, NULL } - -#ifdef OPENSSL_OPAQUE -#define INTRUSIVE_TEST_CASE(name, flags) \ - { #name, NULL, TT_SKIP, NULL, NULL } -#else -#define INTRUSIVE_TEST_CASE(name, flags) LOCAL_TEST_CASE(name, flags) -#endif /* defined(OPENSSL_OPAQUE) */ - -struct testcase_t tortls_tests[] = { - LOCAL_TEST_CASE(errno_to_tls_error, 0), - LOCAL_TEST_CASE(err_to_string, 0), - LOCAL_TEST_CASE(tor_tls_new, TT_FORK), - LOCAL_TEST_CASE(tor_tls_get_error, 0), - LOCAL_TEST_CASE(get_state_description, TT_FORK), - LOCAL_TEST_CASE(get_by_ssl, TT_FORK), - LOCAL_TEST_CASE(allocate_tor_tls_object_ex_data_index, TT_FORK), - LOCAL_TEST_CASE(log_one_error, TT_FORK), - INTRUSIVE_TEST_CASE(get_error, TT_FORK), - LOCAL_TEST_CASE(always_accept_verify_cb, 0), - INTRUSIVE_TEST_CASE(x509_cert_free, 0), - LOCAL_TEST_CASE(x509_cert_get_id_digests, 0), - INTRUSIVE_TEST_CASE(cert_matches_key, 0), - INTRUSIVE_TEST_CASE(cert_get_key, 0), - LOCAL_TEST_CASE(get_my_client_auth_key, TT_FORK), - LOCAL_TEST_CASE(get_my_certs, TT_FORK), - INTRUSIVE_TEST_CASE(get_ciphersuite_name, 0), - INTRUSIVE_TEST_CASE(classify_client_ciphers, 0), - LOCAL_TEST_CASE(client_is_using_v2_ciphers, 0), - INTRUSIVE_TEST_CASE(verify, 0), - INTRUSIVE_TEST_CASE(check_lifetime, 0), - INTRUSIVE_TEST_CASE(get_pending_bytes, 0), - LOCAL_TEST_CASE(get_forced_write_size, 0), - LOCAL_TEST_CASE(get_write_overhead_ratio, TT_FORK), - LOCAL_TEST_CASE(used_v1_handshake, TT_FORK), - LOCAL_TEST_CASE(get_num_server_handshakes, 0), - LOCAL_TEST_CASE(server_got_renegotiate, 0), - INTRUSIVE_TEST_CASE(SSL_SESSION_get_master_key, 0), - INTRUSIVE_TEST_CASE(get_tlssecrets, 0), - INTRUSIVE_TEST_CASE(get_buffer_sizes, 0), - LOCAL_TEST_CASE(evaluate_ecgroup_for_tls, 0), - INTRUSIVE_TEST_CASE(try_to_extract_certs_from_tls, 0), - INTRUSIVE_TEST_CASE(get_peer_cert, 0), - INTRUSIVE_TEST_CASE(peer_has_cert, 0), - INTRUSIVE_TEST_CASE(shutdown, 0), - INTRUSIVE_TEST_CASE(finish_handshake, 0), - INTRUSIVE_TEST_CASE(handshake, 0), - INTRUSIVE_TEST_CASE(write, 0), - INTRUSIVE_TEST_CASE(read, 0), - INTRUSIVE_TEST_CASE(server_info_callback, 0), - LOCAL_TEST_CASE(is_server, 0), - INTRUSIVE_TEST_CASE(assert_renegotiation_unblocked, 0), - INTRUSIVE_TEST_CASE(block_renegotiation, 0), - INTRUSIVE_TEST_CASE(unblock_renegotiation, 0), - INTRUSIVE_TEST_CASE(set_renegotiate_callback, 0), - LOCAL_TEST_CASE(set_logged_address, 0), - INTRUSIVE_TEST_CASE(find_cipher_by_id, 0), - INTRUSIVE_TEST_CASE(session_secret_cb, 0), - INTRUSIVE_TEST_CASE(debug_state_callback, 0), - INTRUSIVE_TEST_CASE(context_new, TT_FORK /* redundant */), - LOCAL_TEST_CASE(create_certificate, 0), - LOCAL_TEST_CASE(cert_new, 0), - LOCAL_TEST_CASE(cert_is_valid, 0), - LOCAL_TEST_CASE(context_init_one, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_util.c b/src/tor/src/test/test_util.c deleted file mode 100644 index 1fd41a348..000000000 --- a/src/tor/src/test/test_util.c +++ /dev/null @@ -1,6225 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define COMPAT_PRIVATE -#define COMPAT_TIME_PRIVATE -#define CONTROL_PRIVATE -#define UTIL_PRIVATE -#include "or.h" -#include "buffers.h" -#include "config.h" -#include "control.h" -#include "test.h" -#include "memarea.h" -#include "util_process.h" -#include "log_test_helpers.h" - -#ifdef HAVE_PWD_H -#include -#endif -#ifdef HAVE_SYS_UTIME_H -#include -#endif -#ifdef HAVE_UTIME_H -#include -#endif -#ifdef _WIN32 -#include -#endif -#include -#include -#include - -#define INFINITY_DBL ((double)INFINITY) -#define NAN_DBL ((double)NAN) - -/* XXXX this is a minimal wrapper to make the unit tests compile with the - * changed tor_timegm interface. */ -static time_t -tor_timegm_wrapper(const struct tm *tm) -{ - time_t t; - if (tor_timegm(tm, &t) < 0) - return -1; - return t; -} - -#define tor_timegm tor_timegm_wrapper - -static void -test_util_read_until_eof_impl(const char *fname, size_t file_len, - size_t read_limit) -{ - char *fifo_name = NULL; - char *test_str = NULL; - char *str = NULL; - size_t sz = 9999999; - int fd = -1; - int r; - - fifo_name = tor_strdup(get_fname(fname)); - test_str = tor_malloc(file_len); - crypto_rand(test_str, file_len); - - r = write_bytes_to_file(fifo_name, test_str, file_len, 1); - tt_int_op(r, OP_EQ, 0); - - fd = open(fifo_name, O_RDONLY|O_BINARY); - tt_int_op(fd, OP_GE, 0); - str = read_file_to_str_until_eof(fd, read_limit, &sz); - tt_ptr_op(str, OP_NE, NULL); - - if (read_limit < file_len) - tt_int_op(sz, OP_EQ, read_limit); - else - tt_int_op(sz, OP_EQ, file_len); - - tt_mem_op(test_str, OP_EQ, str, sz); - tt_int_op(str[sz], OP_EQ, '\0'); - - done: - unlink(fifo_name); - tor_free(fifo_name); - tor_free(test_str); - tor_free(str); - if (fd >= 0) - close(fd); -} - -static void -test_util_read_file_eof_tiny_limit(void *arg) -{ - (void)arg; - // purposely set limit shorter than what we wrote to the FIFO to - // test the maximum, and that it puts the NUL in the right spot - - test_util_read_until_eof_impl("tor_test_fifo_tiny", 5, 4); -} - -static void -test_util_read_file_eof_one_loop_a(void *arg) -{ - (void)arg; - test_util_read_until_eof_impl("tor_test_fifo_1ka", 1024, 1023); -} - -static void -test_util_read_file_eof_one_loop_b(void *arg) -{ - (void)arg; - test_util_read_until_eof_impl("tor_test_fifo_1kb", 1024, 1024); -} - -static void -test_util_read_file_eof_two_loops(void *arg) -{ - (void)arg; - // write more than 1024 bytes to the FIFO to test two passes through - // the loop in the method; if the re-alloc size is changed this - // should be updated as well. - - test_util_read_until_eof_impl("tor_test_fifo_2k", 2048, 10000); -} - -static void -test_util_read_file_eof_two_loops_b(void *arg) -{ - (void)arg; - - test_util_read_until_eof_impl("tor_test_fifo_2kb", 2048, 2048); -} - -static void -test_util_read_file_eof_zero_bytes(void *arg) -{ - (void)arg; - // zero-byte fifo - test_util_read_until_eof_impl("tor_test_fifo_empty", 0, 10000); -} - -/* Test the basic expected behaviour for write_chunks_to_file. - * NOTE: This will need to be updated if we ever change the tempfile location - * or extension */ -static void -test_util_write_chunks_to_file(void *arg) -{ - char *fname = NULL; - char *tempname = NULL; - char *str = NULL; - int r; - struct stat st; - - /* These should be two different sizes to ensure the data is different - * between the data file and the temp file's 'known string' */ - int temp_str_len = 1024; - int data_str_len = 512; - char *data_str = tor_malloc(data_str_len); - char *temp_str = tor_malloc(temp_str_len); - - smartlist_t *chunks = smartlist_new(); - sized_chunk_t c = {data_str, data_str_len/2}; - sized_chunk_t c2 = {data_str + data_str_len/2, data_str_len/2}; - (void)arg; - - crypto_rand(temp_str, temp_str_len); - crypto_rand(data_str, data_str_len); - - // Ensure it can write multiple chunks - - smartlist_add(chunks, &c); - smartlist_add(chunks, &c2); - - /* - * Check if it writes using a tempfile - */ - fname = tor_strdup(get_fname("write_chunks_with_tempfile")); - tor_asprintf(&tempname, "%s.tmp", fname); - - // write a known string to a file where the tempfile will be - r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); - tt_int_op(r, OP_EQ, 0); - - // call write_chunks_to_file - r = write_chunks_to_file(fname, chunks, 1, 0); - tt_int_op(r, OP_EQ, 0); - - // assert the file has been written (expected size) - str = read_file_to_str(fname, RFTS_BIN, &st); - tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); - tt_mem_op(data_str, OP_EQ, str, data_str_len); - tor_free(str); - - // assert that the tempfile is removed (should not leave artifacts) - str = read_file_to_str(tempname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); - tt_assert(str == NULL); - - // Remove old testfile for second test - r = unlink(fname); - tt_int_op(r, OP_EQ, 0); - tor_free(fname); - tor_free(tempname); - - /* - * Check if it skips using a tempfile with flags - */ - fname = tor_strdup(get_fname("write_chunks_with_no_tempfile")); - tor_asprintf(&tempname, "%s.tmp", fname); - - // write a known string to a file where the tempfile will be - r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); - tt_int_op(r, OP_EQ, 0); - - // call write_chunks_to_file with no_tempfile = true - r = write_chunks_to_file(fname, chunks, 1, 1); - tt_int_op(r, OP_EQ, 0); - - // assert the file has been written (expected size) - str = read_file_to_str(fname, RFTS_BIN, &st); - tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); - tt_mem_op(data_str, OP_EQ, str, data_str_len); - tor_free(str); - - // assert the tempfile still contains the known string - str = read_file_to_str(tempname, RFTS_BIN, &st); - tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, OP_EQ, temp_str_len); - tt_mem_op(temp_str, OP_EQ, str, temp_str_len); - - done: - unlink(fname); - unlink(tempname); - smartlist_free(chunks); - tor_free(fname); - tor_free(tempname); - tor_free(str); - tor_free(data_str); - tor_free(temp_str); -} - -#define _TFE(a, b, f) tt_int_op((a).f, OP_EQ, (b).f) -/** test the minimum set of struct tm fields needed for a unique epoch value - * this is also the set we use to test tor_timegm */ -#define TM_EQUAL(a, b) \ - TT_STMT_BEGIN \ - _TFE(a, b, tm_year); \ - _TFE(a, b, tm_mon ); \ - _TFE(a, b, tm_mday); \ - _TFE(a, b, tm_hour); \ - _TFE(a, b, tm_min ); \ - _TFE(a, b, tm_sec ); \ - TT_STMT_END - -static void -test_util_time(void *arg) -{ - struct timeval start, end; - struct tm a_time, b_time; - char timestr[128]; - time_t t_res; - int i; - struct timeval tv; - - /* Test tv_udiff and tv_mdiff */ - - (void)arg; - start.tv_sec = 5; - start.tv_usec = 5000; - - end.tv_sec = 5; - end.tv_usec = 5000; - - tt_int_op(0L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(0L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(0L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(0L,OP_EQ, tv_mdiff(&end, &start)); - - end.tv_usec = 7000; - - tt_int_op(2000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(2L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-2000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-2L,OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = 6; - - tt_int_op(1002000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(1002L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-1002000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-1002L,OP_EQ, tv_mdiff(&end, &start)); - - end.tv_usec = 0; - - tt_int_op(995000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(995L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-995000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-995L,OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = 4; - - tt_int_op(-1005000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(-1005L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(1005000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(1005L,OP_EQ, tv_mdiff(&end, &start)); - - /* Negative tv_sec values, these will break on platforms where tv_sec is - * unsigned */ - - end.tv_sec = -10; - - tt_int_op(-15005000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(-15005L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(15005000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(15005L,OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = -100; - - tt_int_op(89995000L,OP_EQ, tv_udiff(&start, &end)); - tt_int_op(89995L,OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-89995000L,OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-89995L,OP_EQ, tv_mdiff(&end, &start)); - - /* Test that tv_usec values round away from zero when converted to msec */ - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = 10; - end.tv_usec = 499; - - tt_int_op(10000499L, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(10000L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-10000499L, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-10000L, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = 10; - end.tv_usec = 500; - - tt_int_op(10000500L, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(10001L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-10000500L, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-10000L, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = 10; - end.tv_usec = 501; - - tt_int_op(10000501L, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(10001L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-10000501L, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-10001L, OP_EQ, tv_mdiff(&end, &start)); - - /* Overflow conditions */ - -#ifdef _WIN32 - /* Would you believe that tv_sec is a long on windows? Of course you would.*/ -#define TV_SEC_MAX LONG_MAX -#define TV_SEC_MIN LONG_MIN -#else - /* Some BSDs have struct timeval.tv_sec 64-bit, but time_t (and long) 32-bit - * Which means TIME_MAX is not actually the maximum value of tv_sec. - * But that's ok for the moment, because the code correctly performs 64-bit - * calculations internally, then catches the overflow. */ -#define TV_SEC_MAX TIME_MAX -#define TV_SEC_MIN TIME_MIN -#endif /* defined(_WIN32) */ - -/* Assume tv_usec is an unsigned integer until proven otherwise */ -#define TV_USEC_MAX UINT_MAX -#define TOR_USEC_PER_SEC 1000000 - - /* Overflows in the result type */ - - /* All comparisons work */ - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000 - 2; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000000 - 1; - end.tv_usec = 0; - - tt_int_op(end.tv_sec*1000000L, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(-end.tv_sec*1000000L, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); - - /* No comparisons work */ - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000 + 1; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000000 + 1; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(end.tv_sec*1000L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-end.tv_sec*1000L, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000; - end.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = 0; - start.tv_usec = 0; - end.tv_sec = LONG_MAX/1000000; - end.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op((end.tv_sec + 1)*1000L, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(-(end.tv_sec + 1)*1000L, OP_EQ, tv_mdiff(&end, &start)); - - /* Overflows on comparison to zero */ - - start.tv_sec = 0; - start.tv_usec = 0; - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = 0; - end.tv_usec = TV_USEC_MAX; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = TV_USEC_MAX; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = 0; - end.tv_usec = 0; - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = TV_USEC_MAX; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - /* overflows on comparison to maxima / minima */ - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = 0; - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = 0; - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - /* overflows on comparison to maxima / minima with extra usec */ - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = TOR_USEC_PER_SEC; - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - end.tv_sec = TV_SEC_MAX; - end.tv_usec = TOR_USEC_PER_SEC; - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = 0; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - start.tv_sec = TV_SEC_MIN; - start.tv_usec = TOR_USEC_PER_SEC; - - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&start, &end)); - tt_int_op(LONG_MAX, OP_EQ, tv_udiff(&end, &start)); - tt_int_op(LONG_MAX, OP_EQ, tv_mdiff(&end, &start)); - - /* Test tor_timegm & tor_gmtime_r */ - - /* The test values here are confirmed to be correct on a platform - * with a working timegm & gmtime_r. */ - - /* Start with known-zero a_time and b_time. - * This avoids passing uninitialised values to TM_EQUAL in a_time. - * Zeroing may not be needed for b_time, as long as tor_gmtime_r - * never reads the existing values in the structure. - * But we really don't want intermittently failing tests. */ - memset(&a_time, 0, sizeof(struct tm)); - memset(&b_time, 0, sizeof(struct tm)); - - a_time.tm_year = 2003-1900; - a_time.tm_mon = 7; - a_time.tm_mday = 30; - a_time.tm_hour = 6; - a_time.tm_min = 14; - a_time.tm_sec = 55; - t_res = 1062224095UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); - - a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */ - t_res = 1093846495UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); - - a_time.tm_mon = 1; /* Try a leap year, in feb. */ - a_time.tm_mday = 10; - t_res = 1076393695UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); - - a_time.tm_mon = 0; - t_res = 1073715295UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); - - /* This value is in range with 32 bit and 64 bit time_t */ - a_time.tm_year = 2037-1900; - t_res = 2115180895UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); - - /* This value is out of range with 32 bit time_t, but in range for 64 bit - * time_t */ - a_time.tm_year = 2039-1900; -#if SIZEOF_TIME_T == 4 - setup_full_capture_of_logs(LOG_WARN); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - expect_single_log_msg_containing("Result does not fit in tor_timegm"); - teardown_capture_of_logs(); -#elif SIZEOF_TIME_T == 8 - t_res = 2178252895UL; - tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); - tor_gmtime_r(&t_res, &b_time); - TM_EQUAL(a_time, b_time); -#endif /* SIZEOF_TIME_T == 4 || ... */ - - /* Test tor_timegm out of range */ - - /* The below tests will all cause a BUG message, so we capture, suppress, - * and detect. */ -#define CAPTURE() do { \ - setup_full_capture_of_logs(LOG_WARN); \ - } while (0) -#define CHECK_TIMEGM_WARNING(msg) do { \ - expect_single_log_msg_containing(msg); \ - teardown_capture_of_logs(); \ - } while (0) - -#define CHECK_TIMEGM_ARG_OUT_OF_RANGE(msg) \ - CHECK_TIMEGM_WARNING("Out-of-range argument to tor_timegm") - - /* year */ - - /* Wrong year < 1970 */ - a_time.tm_year = 1969-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = -1-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - -#if SIZEOF_INT == 4 || SIZEOF_INT == 8 - a_time.tm_year = -1*(1 << 16); - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* one of the smallest tm_year values my 64 bit system supports: - * t_res = -9223372036854775LL without clamping */ - a_time.tm_year = -292275055-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = INT32_MIN; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); -#endif /* SIZEOF_INT == 4 || SIZEOF_INT == 8 */ - -#if SIZEOF_INT == 8 - a_time.tm_year = -1*(1 << 48); - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* while unlikely, the system's gmtime(_r) could return - * a "correct" retrospective gregorian negative year value, - * which I'm pretty sure is: - * -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657 - * 730485 is the number of days in two millenia, including leap days */ - a_time.tm_year = -292277022657-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = INT64_MIN; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); -#endif /* SIZEOF_INT == 8 */ - - /* Wrong year >= INT32_MAX - 1900 */ -#if SIZEOF_INT == 4 || SIZEOF_INT == 8 - a_time.tm_year = INT32_MAX-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = INT32_MAX; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); -#endif /* SIZEOF_INT == 4 || SIZEOF_INT == 8 */ - -#if SIZEOF_INT == 8 - /* one of the largest tm_year values my 64 bit system supports */ - a_time.tm_year = 292278994-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* while unlikely, the system's gmtime(_r) could return - * a "correct" proleptic gregorian year value, - * which I'm pretty sure is: - * (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596 - * 730485 is the number of days in two millenia, including leap days */ - a_time.tm_year = 292277026596-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = INT64_MAX-1900; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = INT64_MAX; - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); -#endif /* SIZEOF_INT == 8 */ - - /* month */ - a_time.tm_year = 2007-1900; /* restore valid year */ - - a_time.tm_mon = 12; /* Wrong month, it's 0-based */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_mon = -1; /* Wrong month */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* day */ - a_time.tm_mon = 6; /* Try July */ - a_time.tm_mday = 32; /* Wrong day */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_mon = 5; /* Try June */ - a_time.tm_mday = 31; /* Wrong day */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = 2008-1900; /* Try a leap year */ - a_time.tm_mon = 1; /* in feb. */ - a_time.tm_mday = 30; /* Wrong day */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_year = 2011-1900; /* Try a non-leap year */ - a_time.tm_mon = 1; /* in feb. */ - a_time.tm_mday = 29; /* Wrong day */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_mday = 0; /* Wrong day, it's 1-based (to be different) */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* hour */ - a_time.tm_mday = 3; /* restore valid month day */ - - a_time.tm_hour = 24; /* Wrong hour, it's 0-based */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_hour = -1; /* Wrong hour */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* minute */ - a_time.tm_hour = 22; /* restore valid hour */ - - a_time.tm_min = 60; /* Wrong minute, it's 0-based */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_min = -1; /* Wrong minute */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* second */ - a_time.tm_min = 37; /* restore valid minute */ - - a_time.tm_sec = 61; /* Wrong second: 0-based with leap seconds */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - a_time.tm_sec = -1; /* Wrong second */ - CAPTURE(); - tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); - CHECK_TIMEGM_ARG_OUT_OF_RANGE(); - - /* Test tor_gmtime_r out of range */ - - /* time_t < 0 yields a year clamped to 1 or 1970, - * depending on whether the implementation of the system gmtime(_r) - * sets struct tm (1) or not (1970) */ - t_res = -1; - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (1970-1900) || - b_time.tm_year == (1969-1900)); - - if (sizeof(time_t) == 4 || sizeof(time_t) == 8) { - t_res = -1*(1 << 30); - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (1970-1900) || - b_time.tm_year == (1935-1900)); - - t_res = INT32_MIN; - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (1970-1900) || - b_time.tm_year == (1901-1900)); - } - -#if SIZEOF_TIME_T == 8 - { - /* one of the smallest tm_year values my 64 bit system supports: - * b_time.tm_year == (-292275055LL-1900LL) without clamping */ - t_res = -9223372036854775LL; - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (1970-1900) || - b_time.tm_year == (1-1900)); - - /* while unlikely, the system's gmtime(_r) could return - * a "correct" retrospective gregorian negative year value, - * which I'm pretty sure is: - * -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657 - * 730485 is the number of days in two millenia, including leap days - * (int64_t)b_time.tm_year == (-292277022657LL-1900LL) without clamping */ - t_res = INT64_MIN; - CAPTURE(); - tor_gmtime_r(&t_res, &b_time); - if (! (b_time.tm_year == (1970-1900) || - b_time.tm_year == (1-1900))) { - tt_int_op(b_time.tm_year, OP_EQ, 1970-1900); - } - if (b_time.tm_year != 1970-1900) { - CHECK_TIMEGM_WARNING("Rounding up to "); - } else { - teardown_capture_of_logs(); - } - } -#endif /* SIZEOF_TIME_T == 8 */ - - /* time_t >= INT_MAX yields a year clamped to 2037 or 9999, - * depending on whether the implementation of the system gmtime(_r) - * sets struct tm (9999) or not (2037) */ -#if SIZEOF_TIME_T == 4 || SIZEOF_TIME_T == 8 - { - t_res = 3*(1 << 29); - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (2021-1900)); - - t_res = INT32_MAX; - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (2037-1900) || - b_time.tm_year == (2038-1900)); - } -#endif /* SIZEOF_TIME_T == 4 || SIZEOF_TIME_T == 8 */ - -#if SIZEOF_TIME_T == 8 - { - /* one of the largest tm_year values my 64 bit system supports: - * b_time.tm_year == (292278994L-1900L) without clamping */ - t_res = 9223372036854775LL; - tor_gmtime_r(&t_res, &b_time); - tt_assert(b_time.tm_year == (2037-1900) || - b_time.tm_year == (9999-1900)); - - /* while unlikely, the system's gmtime(_r) could return - * a "correct" proleptic gregorian year value, - * which I'm pretty sure is: - * (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596 - * 730485 is the number of days in two millenia, including leap days - * (int64_t)b_time.tm_year == (292277026596L-1900L) without clamping */ - t_res = INT64_MAX; - CAPTURE(); - tor_gmtime_r(&t_res, &b_time); - CHECK_TIMEGM_WARNING("Rounding down to "); - - tt_assert(b_time.tm_year == (2037-1900) || - b_time.tm_year == (9999-1900)); - } -#endif /* SIZEOF_TIME_T == 8 */ - - /* Test {format,parse}_rfc1123_time */ - - format_rfc1123_time(timestr, 0); - tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",OP_EQ, timestr); - format_rfc1123_time(timestr, (time_t)1091580502UL); - tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",OP_EQ, timestr); - - t_res = 0; - i = parse_rfc1123_time(timestr, &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - - /* This value is in range with 32 bit and 64 bit time_t */ - format_rfc1123_time(timestr, (time_t)2080000000UL); - tt_str_op("Fri, 30 Nov 2035 01:46:40 GMT",OP_EQ, timestr); - - t_res = 0; - i = parse_rfc1123_time(timestr, &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)2080000000UL); - - /* This value is out of range with 32 bit time_t, but in range for 64 bit - * time_t */ - format_rfc1123_time(timestr, (time_t)2150000000UL); -#if SIZEOF_TIME_T == 4 -#if 0 - /* Wrapping around will have made it this. */ - /* On windows, at least, this is clipped to 1 Jan 1970. ??? */ - tt_str_op("Sat, 11 Jan 1902 23:45:04 GMT",OP_EQ, timestr); -#endif - /* Make sure that the right date doesn't parse. */ - strlcpy(timestr, "Wed, 17 Feb 2038 06:13:20 GMT", sizeof(timestr)); - - t_res = 0; - CAPTURE(); - i = parse_rfc1123_time(timestr, &t_res); - CHECK_TIMEGM_WARNING("does not fit in tor_timegm"); - tt_int_op(-1,OP_EQ, i); -#elif SIZEOF_TIME_T == 8 - tt_str_op("Wed, 17 Feb 2038 06:13:20 GMT",OP_EQ, timestr); - - t_res = 0; - i = parse_rfc1123_time(timestr, &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)2150000000UL); -#endif /* SIZEOF_TIME_T == 4 || ... */ - - /* The timezone doesn't matter */ - t_res = 0; - tt_int_op(0,OP_EQ, - parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res)); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 32 Mar 2011 00:00:00 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 2011 24:00:00 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 2011 23:60:00 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 2011 23:59:62 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 1969 23:59:59 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Ene 2011 23:59:59 GMT", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 2011 23:59:59 GM", &t_res)); - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 1900 23:59:59 GMT", &t_res)); - - /* Leap year. */ - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 29 Feb 2011 16:00:00 GMT", &t_res)); - tt_int_op(0,OP_EQ, - parse_rfc1123_time("Wed, 29 Feb 2012 16:00:00 GMT", &t_res)); - - /* Leap second plus one */ - tt_int_op(-1,OP_EQ, - parse_rfc1123_time("Wed, 30 Mar 2011 23:59:61 GMT", &t_res)); - - /* Test parse_iso_time */ - - t_res = 0; - i = parse_iso_time("", &t_res); - tt_int_op(-1,OP_EQ, i); - t_res = 0; - i = parse_iso_time("2004-08-32 00:48:22", &t_res); - tt_int_op(-1,OP_EQ, i); - t_res = 0; - i = parse_iso_time("1969-08-03 00:48:22", &t_res); - tt_int_op(-1,OP_EQ, i); - - t_res = 0; - i = parse_iso_time("2004-08-04 00:48:22", &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - t_res = 0; - i = parse_iso_time("2004-8-4 0:48:22", &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - - /* This value is in range with 32 bit and 64 bit time_t */ - t_res = 0; - i = parse_iso_time("2035-11-30 01:46:40", &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)2080000000UL); - - /* This value is out of range with 32 bit time_t, but in range for 64 bit - * time_t */ - t_res = 0; -#if SIZEOF_TIME_T == 4 - CAPTURE(); - i = parse_iso_time("2038-02-17 06:13:20", &t_res); - tt_int_op(-1,OP_EQ, i); - CHECK_TIMEGM_WARNING("does not fit in tor_timegm"); -#elif SIZEOF_TIME_T == 8 - i = parse_iso_time("2038-02-17 06:13:20", &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)2150000000UL); -#endif /* SIZEOF_TIME_T == 4 || ... */ - - tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-zz 99-99x99", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-32 00:00:00", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 24:00:00", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:60:00", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59:62", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("1969-03-30 23:59:59", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-00-30 23:59:59", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2147483647-08-29 14:00:00", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22.100", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22XYZ", &t_res)); - - /* but... that _is_ acceptable if we aren't being strict. */ - t_res = 0; - i = parse_iso_time_("2004-08-04 00:48:22XYZ", &t_res, 0, 0); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - - /* try nospace variant. */ - t_res = 0; - i = parse_iso_time_nospace("2004-08-04T00:48:22", &t_res); - tt_int_op(0,OP_EQ, i); - tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); - - tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04T00:48:22", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time_nospace("2004-08-04 00:48:22", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04x00:48:22", &t_res)); - tt_int_op(-1,OP_EQ, parse_iso_time_nospace("2004-08-04x00:48:22", &t_res)); - - /* Test tor_gettimeofday */ - - end.tv_sec = 4; - end.tv_usec = 999990; - start.tv_sec = 1; - start.tv_usec = 500; - - tor_gettimeofday(&start); - /* now make sure time works. */ - tor_gettimeofday(&end); - /* We might've timewarped a little. */ - tt_int_op(tv_udiff(&start, &end), OP_GE, -5000); - - /* Test format_iso_time */ - - tv.tv_sec = (time_t)1326296338UL; - tv.tv_usec = 3060; - format_iso_time(timestr, (time_t)tv.tv_sec); - tt_str_op("2012-01-11 15:38:58",OP_EQ, timestr); - /* The output of format_local_iso_time will vary by timezone, and setting - our timezone for testing purposes would be a nontrivial flaky pain. - Skip this test for now. - format_local_iso_time(timestr, tv.tv_sec); - test_streq("2012-01-11 10:38:58", timestr); - */ - format_iso_time_nospace(timestr, (time_t)tv.tv_sec); - tt_str_op("2012-01-11T15:38:58",OP_EQ, timestr); - tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_LEN); - format_iso_time_nospace_usec(timestr, &tv); - tt_str_op("2012-01-11T15:38:58.003060",OP_EQ, timestr); - tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_USEC_LEN); - - tv.tv_usec = 0; - /* This value is in range with 32 bit and 64 bit time_t */ - tv.tv_sec = (time_t)2080000000UL; - format_iso_time(timestr, (time_t)tv.tv_sec); - tt_str_op("2035-11-30 01:46:40",OP_EQ, timestr); - - /* This value is out of range with 32 bit time_t, but in range for 64 bit - * time_t */ - tv.tv_sec = (time_t)2150000000UL; - format_iso_time(timestr, (time_t)tv.tv_sec); -#if SIZEOF_TIME_T == 4 - /* format_iso_time should indicate failure on overflow, but it doesn't yet. - * Hopefully #18480 will improve the failure semantics in this case. - tt_str_op("2038-02-17 06:13:20",OP_EQ, timestr); - */ -#elif SIZEOF_TIME_T == 8 -#ifndef _WIN32 - /* This SHOULD work on windows too; see bug #18665 */ - tt_str_op("2038-02-17 06:13:20",OP_EQ, timestr); -#endif -#endif /* SIZEOF_TIME_T == 4 || ... */ - -#undef CAPTURE -#undef CHECK_TIMEGM_ARG_OUT_OF_RANGE - - done: - teardown_capture_of_logs(); -} - -static void -test_util_parse_http_time(void *arg) -{ - struct tm a_time; - char b[ISO_TIME_LEN+1]; - (void)arg; - -#define T(s) do { \ - format_iso_time(b, tor_timegm(&a_time)); \ - tt_str_op(b, OP_EQ, (s)); \ - b[0]='\0'; \ - } while (0) - - /* Test parse_http_time */ - - tt_int_op(-1,OP_EQ, - parse_http_time("", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Sunday, 32 Aug 2004 00:48:22 GMT", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Sunday, 3 Aug 1869 00:48:22 GMT", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Sunday, 32-Aug-94 00:48:22 GMT", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Sunday, 3-Ago-04 00:48:22", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Sunday, August the third", &a_time)); - tt_int_op(-1,OP_EQ, - parse_http_time("Wednesday,,04 Aug 1994 00:48:22 GMT", &a_time)); - - tt_int_op(0,OP_EQ, - parse_http_time("Wednesday, 04 Aug 1994 00:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, - parse_http_time("Wednesday, 4 Aug 1994 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, - parse_http_time("Miercoles, 4 Aug 1994 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, - parse_http_time("Wednesday, 04-Aug-94 00:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, - parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, - parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); - T("1994-08-04 00:48:22"); - tt_int_op(0,OP_EQ,parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time)); - tt_int_op((time_t)1325376000UL,OP_EQ, tor_timegm(&a_time)); - T("2012-01-01 00:00:00"); - tt_int_op(0,OP_EQ,parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time)); - tt_int_op((time_t)1356912000UL,OP_EQ, tor_timegm(&a_time)); - T("2012-12-31 00:00:00"); - - /* This value is in range with 32 bit and 64 bit time_t */ - tt_int_op(0,OP_EQ,parse_http_time("Fri, 30 Nov 2035 01:46:40 GMT", &a_time)); - tt_int_op((time_t)2080000000UL,OP_EQ, tor_timegm(&a_time)); - T("2035-11-30 01:46:40"); - - /* This value is out of range with 32 bit time_t, but in range for 64 bit - * time_t */ -#if SIZEOF_TIME_T == 4 - /* parse_http_time should indicate failure on overflow, but it doesn't yet. - * Hopefully #18480 will improve the failure semantics in this case. */ - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(0,OP_EQ,parse_http_time("Wed, 17 Feb 2038 06:13:20 GMT", &a_time)); - tt_int_op((time_t)-1,OP_EQ, tor_timegm(&a_time)); - expect_single_log_msg_containing("does not fit in tor_timegm"); - teardown_capture_of_logs(); -#elif SIZEOF_TIME_T == 8 - tt_int_op(0,OP_EQ,parse_http_time("Wed, 17 Feb 2038 06:13:20 GMT", &a_time)); - tt_int_op((time_t)2150000000UL,OP_EQ, tor_timegm(&a_time)); - T("2038-02-17 06:13:20"); -#endif /* SIZEOF_TIME_T == 4 || ... */ - - tt_int_op(-1,OP_EQ, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-03-32 00:00:00 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 24:00:00 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:60:00 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59:62 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("1969-03-30 23:59:59 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-00-30 23:59:59 GMT", &a_time)); - tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59", &a_time)); - -#undef T - done: - teardown_capture_of_logs(); -} - -static void -test_util_config_line(void *arg) -{ - char buf[1024]; - char *k=NULL, *v=NULL; - const char *str; - - /* Test parse_config_line_from_str */ - (void)arg; - strlcpy(buf, "k v\n" " key value with spaces \n" "keykey val\n" - "k2\n" - "k3 \n" "\n" " \n" "#comment\n" - "k4#a\n" "k5#abc\n" "k6 val #with comment\n" - "kseven \"a quoted 'string\"\n" - "k8 \"a \\x71uoted\\n\\\"str\\\\ing\\t\\001\\01\\1\\\"\"\n" - "k9 a line that\\\n spans two lines.\n\n" - "k10 more than\\\n one contin\\\nuation\n" - "k11 \\\ncontinuation at the start\n" - "k12 line with a\\\n#comment\n embedded\n" - "k13\\\ncontinuation at the very start\n" - "k14 a line that has a comment and # ends with a slash \\\n" - "k15 this should be the next new line\n" - "k16 a line that has a comment and # ends without a slash \n" - "k17 this should be the next new line\n" - , sizeof(buf)); - str = buf; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k"); - tt_str_op(v,OP_EQ, "v"); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "key value with")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "key"); - tt_str_op(v,OP_EQ, "value with spaces"); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "keykey")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "keykey"); - tt_str_op(v,OP_EQ, "val"); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "k2\n")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k2"); - tt_str_op(v,OP_EQ, ""); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "k3 \n")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k3"); - tt_str_op(v,OP_EQ, ""); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "#comment")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k4"); - tt_str_op(v,OP_EQ, ""); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "k5#abc")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k5"); - tt_str_op(v,OP_EQ, ""); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "k6")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k6"); - tt_str_op(v,OP_EQ, "val"); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "kseven")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "kseven"); - tt_str_op(v,OP_EQ, "a quoted \'string"); - tor_free(k); tor_free(v); - tt_assert(!strcmpstart(str, "k8 ")); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k8"); - tt_str_op(v,OP_EQ, "a quoted\n\"str\\ing\t\x01\x01\x01\""); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k9"); - tt_str_op(v,OP_EQ, "a line that spans two lines."); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k10"); - tt_str_op(v,OP_EQ, "more than one continuation"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k11"); - tt_str_op(v,OP_EQ, "continuation at the start"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k12"); - tt_str_op(v,OP_EQ, "line with a embedded"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k13"); - tt_str_op(v,OP_EQ, "continuation at the very start"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k14"); - tt_str_op(v,OP_EQ, "a line that has a comment and" ); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k15"); - tt_str_op(v,OP_EQ, "this should be the next new line"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k16"); - tt_str_op(v,OP_EQ, "a line that has a comment and" ); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k17"); - tt_str_op(v,OP_EQ, "this should be the next new line"); - tor_free(k); tor_free(v); - - tt_str_op(str,OP_EQ, ""); - - done: - tor_free(k); - tor_free(v); -} - -static void -test_util_config_line_quotes(void *arg) -{ - char buf1[1024]; - char buf2[128]; - char buf3[128]; - char buf4[128]; - char *k=NULL, *v=NULL; - const char *str; - - /* Test parse_config_line_from_str */ - (void)arg; - strlcpy(buf1, "kTrailingSpace \"quoted value\" \n" - "kTrailingGarbage \"quoted value\"trailing garbage\n" - , sizeof(buf1)); - strlcpy(buf2, "kTrailingSpaceAndGarbage \"quoted value\" trailing space+g\n" - , sizeof(buf2)); - strlcpy(buf3, "kMultilineTrailingSpace \"mline\\ \nvalue w/ trailing sp\"\n" - , sizeof(buf3)); - strlcpy(buf4, "kMultilineNoTrailingBackslash \"naked multiline\nvalue\"\n" - , sizeof(buf4)); - str = buf1; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "kTrailingSpace"); - tt_str_op(v,OP_EQ, "quoted value"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str = buf2; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str = buf3; - - const char *err = NULL; - str = parse_config_line_from_str_verbose(str, &k, &v, &err); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - tt_str_op(err, OP_EQ, "Invalid escape sequence in quoted string"); - - str = buf4; - - err = NULL; - str = parse_config_line_from_str_verbose(str, &k, &v, &err); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - tt_str_op(err, OP_EQ, "Invalid escape sequence in quoted string"); - - done: - tor_free(k); - tor_free(v); -} - -static void -test_util_config_line_comment_character(void *arg) -{ - char buf[1024]; - char *k=NULL, *v=NULL; - const char *str; - - /* Test parse_config_line_from_str */ - (void)arg; - strlcpy(buf, "k1 \"# in quotes\"\n" - "k2 some value # some comment\n" - "k3 /home/user/myTorNetwork#2\n" /* Testcase for #1323 */ - , sizeof(buf)); - str = buf; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k1"); - tt_str_op(v,OP_EQ, "# in quotes"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "k2"); - tt_str_op(v,OP_EQ, "some value"); - tor_free(k); tor_free(v); - - tt_str_op(str,OP_EQ, "k3 /home/user/myTorNetwork#2\n"); - -#if 0 - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - test_streq(k, "k3"); - test_streq(v, "/home/user/myTorNetwork#2"); - tor_free(k); tor_free(v); - - test_streq(str, ""); -#endif /* 0 */ - - done: - tor_free(k); - tor_free(v); -} - -static void -test_util_config_line_escaped_content(void *arg) -{ - char buf1[1024]; - char buf2[128]; - char buf3[128]; - char buf4[128]; - char buf5[128]; - char buf6[128]; - char *k=NULL, *v=NULL; - const char *str; - - /* Test parse_config_line_from_str */ - (void)arg; - strlcpy(buf1, "HexadecimalLower \"\\x2a\"\n" - "HexadecimalUpper \"\\x2A\"\n" - "HexadecimalUpperX \"\\X2A\"\n" - "Octal \"\\52\"\n" - "Newline \"\\n\"\n" - "Tab \"\\t\"\n" - "CarriageReturn \"\\r\"\n" - "DoubleQuote \"\\\"\"\n" - "SimpleQuote \"\\'\"\n" - "Backslash \"\\\\\"\n" - "Mix \"This is a \\\"star\\\":\\t\\'\\x2a\\'\\nAnd second line\"\n" - , sizeof(buf1)); - - strlcpy(buf2, "BrokenEscapedContent \"\\a\"\n" - , sizeof(buf2)); - - strlcpy(buf3, "BrokenEscapedContent \"\\x\"\n" - , sizeof(buf3)); - - strlcpy(buf4, "BrokenOctal \"\\8\"\n" - , sizeof(buf4)); - - strlcpy(buf5, "BrokenHex \"\\xg4\"\n" - , sizeof(buf5)); - - strlcpy(buf6, "BrokenEscape \"\\" - , sizeof(buf6)); - - str = buf1; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "HexadecimalLower"); - tt_str_op(v,OP_EQ, "*"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "HexadecimalUpper"); - tt_str_op(v,OP_EQ, "*"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "HexadecimalUpperX"); - tt_str_op(v,OP_EQ, "*"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "Octal"); - tt_str_op(v,OP_EQ, "*"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "Newline"); - tt_str_op(v,OP_EQ, "\n"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "Tab"); - tt_str_op(v,OP_EQ, "\t"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "CarriageReturn"); - tt_str_op(v,OP_EQ, "\r"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "DoubleQuote"); - tt_str_op(v,OP_EQ, "\""); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "SimpleQuote"); - tt_str_op(v,OP_EQ, "'"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "Backslash"); - tt_str_op(v,OP_EQ, "\\"); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_str_op(k,OP_EQ, "Mix"); - tt_str_op(v,OP_EQ, "This is a \"star\":\t'*'\nAnd second line"); - tor_free(k); tor_free(v); - tt_str_op(str,OP_EQ, ""); - - str = buf2; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str = buf3; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str = buf4; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - -#if 0 - str = buf5; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str, OP_EQ, NULL); - tor_free(k); tor_free(v); -#endif /* 0 */ - - str = buf6; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - /* more things to try. */ - /* Bad hex: */ - strlcpy(buf1, "Foo \"\\x9g\"\n", sizeof(buf1)); - strlcpy(buf2, "Foo \"\\xg0\"\n", sizeof(buf2)); - strlcpy(buf3, "Foo \"\\xf\"\n", sizeof(buf3)); - /* bad escape */ - strlcpy(buf4, "Foo \"\\q\"\n", sizeof(buf4)); - /* missing endquote */ - strlcpy(buf5, "Foo \"hello\n", sizeof(buf5)); - /* extra stuff */ - strlcpy(buf6, "Foo \"hello\" world\n", sizeof(buf6)); - - str=buf1; - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str=buf2; - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str=buf3; - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str=buf4; - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str=buf5; - - str = parse_config_line_from_str_verbose(str, &k, &v, NULL); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - - str=buf6; - const char *err = NULL; - str = parse_config_line_from_str_verbose(str, &k, &v, &err); - tt_ptr_op(str,OP_EQ, NULL); - tor_free(k); tor_free(v); - tt_str_op(err,OP_EQ, "Excess data after quoted string"); - - done: - tor_free(k); - tor_free(v); -} - -static void -test_util_config_line_crlf(void *arg) -{ - char *k=NULL, *v=NULL; - const char *err = NULL; - (void)arg; - const char *str = - "Hello world\r\n" - "Hello \"nice big world\"\r\n"; - - str = parse_config_line_from_str_verbose(str, &k, &v, &err); - tt_assert(str); - tt_str_op(k,OP_EQ,"Hello"); - tt_str_op(v,OP_EQ,"world"); - tt_ptr_op(err, OP_EQ, NULL); - tor_free(k); tor_free(v); - - str = parse_config_line_from_str_verbose(str, &k, &v, &err); - tt_assert(str); - tt_str_op(k,OP_EQ,"Hello"); - tt_str_op(v,OP_EQ,"nice big world"); - tt_ptr_op(err, OP_EQ, NULL); - tor_free(k); tor_free(v); - tt_str_op(str,OP_EQ, ""); - - done: - tor_free(k); tor_free(v); -} - -#ifndef _WIN32 -static void -test_util_expand_filename(void *arg) -{ - char *str; - - (void)arg; - setenv("HOME", "/home/itv", 1); /* For "internal test value" */ - - str = expand_filename(""); - tt_str_op("",OP_EQ, str); - tor_free(str); - - str = expand_filename("/normal/path"); - tt_str_op("/normal/path",OP_EQ, str); - tor_free(str); - - str = expand_filename("/normal/trailing/path/"); - tt_str_op("/normal/trailing/path/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~"); - tt_str_op("/home/itv/",OP_EQ, str); - tor_free(str); - - str = expand_filename("$HOME/nodice"); - tt_str_op("$HOME/nodice",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/"); - tt_str_op("/home/itv/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/foobarqux"); - tt_str_op("/home/itv/foobarqux",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/../../etc/passwd"); - tt_str_op("/home/itv/../../etc/passwd",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/trailing/"); - tt_str_op("/home/itv/trailing/",OP_EQ, str); - tor_free(str); - /* Ideally we'd test ~anotheruser, but that's shady to test (we'd - have to somehow inject/fake the get_user_homedir call) */ - - /* $HOME ending in a trailing slash */ - setenv("HOME", "/home/itv/", 1); - - str = expand_filename("~"); - tt_str_op("/home/itv/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/"); - tt_str_op("/home/itv/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/foo"); - tt_str_op("/home/itv/foo",OP_EQ, str); - tor_free(str); - - /* Try with empty $HOME */ - - setenv("HOME", "", 1); - - str = expand_filename("~"); - tt_str_op("/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/"); - tt_str_op("/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/foobar"); - tt_str_op("/foobar",OP_EQ, str); - tor_free(str); - - /* Try with $HOME unset */ - - unsetenv("HOME"); - - str = expand_filename("~"); - tt_str_op("/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/"); - tt_str_op("/",OP_EQ, str); - tor_free(str); - - str = expand_filename("~/foobar"); - tt_str_op("/foobar",OP_EQ, str); - tor_free(str); - - done: - tor_free(str); -} -#endif /* !defined(_WIN32) */ - -/** Test tor_escape_str_for_pt_args(). */ -static void -test_util_escape_string_socks(void *arg) -{ - char *escaped_string = NULL; - - /** Simple backslash escape. */ - (void)arg; - escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\"); - tt_assert(escaped_string); - tt_str_op(escaped_string,OP_EQ, "This is a backslash: \\\\"); - tor_free(escaped_string); - - /** Simple semicolon escape. */ - escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\"); - tt_assert(escaped_string); - tt_str_op(escaped_string,OP_EQ, "First rule:Do not use \\;"); - tor_free(escaped_string); - - /** Empty string. */ - escaped_string = tor_escape_str_for_pt_args("", ";\\"); - tt_assert(escaped_string); - tt_str_op(escaped_string,OP_EQ, ""); - tor_free(escaped_string); - - /** Escape all characters. */ - escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\"); - tt_assert(escaped_string); - tt_str_op(escaped_string,OP_EQ, "\\;\\\\\\;\\\\"); - tor_free(escaped_string); - - escaped_string = tor_escape_str_for_pt_args(";", ";\\"); - tt_assert(escaped_string); - tt_str_op(escaped_string,OP_EQ, "\\;"); - tor_free(escaped_string); - - done: - tor_free(escaped_string); -} - -static void -test_util_string_is_key_value(void *ptr) -{ - (void)ptr; - tt_assert(string_is_key_value(LOG_WARN, "key=value")); - tt_assert(string_is_key_value(LOG_WARN, "k=v")); - tt_assert(string_is_key_value(LOG_WARN, "key=")); - tt_assert(string_is_key_value(LOG_WARN, "x=")); - tt_assert(string_is_key_value(LOG_WARN, "xx=")); - tt_assert(!string_is_key_value(LOG_WARN, "=value")); - tt_assert(!string_is_key_value(LOG_WARN, "=x")); - tt_assert(!string_is_key_value(LOG_WARN, "=")); - - /* ??? */ - /* tt_assert(!string_is_key_value(LOG_WARN, "===")); */ - done: - ; -} - -/** Test basic string functionality. */ -static void -test_util_strmisc(void *arg) -{ - char buf[1024]; - char *cp_tmp = NULL; - - /* Test strl operations */ - (void)arg; - tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 0)); - tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 10)); - tt_str_op(buf,OP_EQ, "Hello"); - tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 6)); - tt_str_op(buf,OP_EQ, "Hello"); - tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 5)); - tt_str_op(buf,OP_EQ, "Hell"); - strlcpy(buf, "Hello", sizeof(buf)); - tt_int_op(10,OP_EQ, strlcat(buf, "Hello", 5)); - - /* Test strstrip() */ - strlcpy(buf, "Testing 1 2 3", sizeof(buf)); - tor_strstrip(buf, ",!"); - tt_str_op(buf,OP_EQ, "Testing 1 2 3"); - strlcpy(buf, "!Testing 1 2 3?", sizeof(buf)); - tor_strstrip(buf, "!? "); - tt_str_op(buf,OP_EQ, "Testing123"); - strlcpy(buf, "!!!Testing 1 2 3??", sizeof(buf)); - tor_strstrip(buf, "!? "); - tt_str_op(buf,OP_EQ, "Testing123"); - - /* Test snprintf */ - /* Returning -1 when there's not enough room in the output buffer */ - tt_int_op(-1,OP_EQ, tor_snprintf(buf, 0, "Foo")); - tt_int_op(-1,OP_EQ, tor_snprintf(buf, 2, "Foo")); - tt_int_op(-1,OP_EQ, tor_snprintf(buf, 3, "Foo")); - tt_int_op(-1,OP_NE, tor_snprintf(buf, 4, "Foo")); - /* Always NUL-terminate the output */ - tor_snprintf(buf, 5, "abcdef"); - tt_int_op(0,OP_EQ, buf[4]); - tor_snprintf(buf, 10, "abcdef"); - tt_int_op(0,OP_EQ, buf[6]); - /* uint64 */ - tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x", - U64_PRINTF_ARG(U64_LITERAL(12345678901))); - tt_str_op("x!12345678901!x",OP_EQ, buf); - - /* Test str{,case}cmpstart */ - tt_assert(strcmpstart("abcdef", "abcdef")==0); - tt_assert(strcmpstart("abcdef", "abc")==0); - tt_assert(strcmpstart("abcdef", "abd")<0); - tt_assert(strcmpstart("abcdef", "abb")>0); - tt_assert(strcmpstart("ab", "abb")<0); - tt_assert(strcmpstart("ab", "")==0); - tt_assert(strcmpstart("ab", "ab ")<0); - tt_assert(strcasecmpstart("abcdef", "abCdEF")==0); - tt_assert(strcasecmpstart("abcDeF", "abc")==0); - tt_assert(strcasecmpstart("abcdef", "Abd")<0); - tt_assert(strcasecmpstart("Abcdef", "abb")>0); - tt_assert(strcasecmpstart("ab", "Abb")<0); - tt_assert(strcasecmpstart("ab", "")==0); - tt_assert(strcasecmpstart("ab", "ab ")<0); - - /* Test str{,case}cmpend */ - tt_assert(strcmpend("abcdef", "abcdef")==0); - tt_assert(strcmpend("abcdef", "def")==0); - tt_assert(strcmpend("abcdef", "deg")<0); - tt_assert(strcmpend("abcdef", "dee")>0); - tt_assert(strcmpend("ab", "aab")>0); - tt_assert(strcasecmpend("AbcDEF", "abcdef")==0); - tt_assert(strcasecmpend("abcdef", "dEF")==0); - tt_assert(strcasecmpend("abcdef", "Deg")<0); - tt_assert(strcasecmpend("abcDef", "dee")>0); - tt_assert(strcasecmpend("AB", "abb")<0); - - /* Test digest_is_zero */ - memset(buf,0,20); - buf[20] = 'x'; - tt_assert(tor_digest_is_zero(buf)); - buf[19] = 'x'; - tt_assert(!tor_digest_is_zero(buf)); - - /* Test mem_is_zero */ - memset(buf,0,128); - buf[128] = 'x'; - tt_assert(tor_mem_is_zero(buf, 10)); - tt_assert(tor_mem_is_zero(buf, 20)); - tt_assert(tor_mem_is_zero(buf, 128)); - tt_assert(!tor_mem_is_zero(buf, 129)); - buf[60] = (char)255; - tt_assert(!tor_mem_is_zero(buf, 128)); - buf[0] = (char)1; - tt_assert(!tor_mem_is_zero(buf, 10)); - - /* Test 'escaped' */ - tt_ptr_op(escaped(NULL), OP_EQ, NULL); - tt_str_op("\"\"",OP_EQ, escaped("")); - tt_str_op("\"abcd\"",OP_EQ, escaped("abcd")); - tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",OP_EQ, escaped("\\ \n\r\t\"'")); - tt_str_op("\"unnecessary \\'backslashes\\'\"",OP_EQ, - escaped("unnecessary \'backslashes\'")); - /* Non-printable characters appear as octal */ - tt_str_op("\"z\\001abc\\277d\"",OP_EQ, escaped("z\001abc\277d")); - tt_str_op("\"z\\336\\255 ;foo\"",OP_EQ, escaped("z\xde\xad\x20;foo")); - - /* Other cases of esc_for_log{,_len} */ - cp_tmp = esc_for_log(NULL); - tt_str_op(cp_tmp, OP_EQ, "(null)"); - tor_free(cp_tmp); - cp_tmp = esc_for_log_len("abcdefg", 3); - tt_str_op(cp_tmp, OP_EQ, "\"abc\""); - tor_free(cp_tmp); - cp_tmp = esc_for_log_len("abcdefg", 100); - tt_str_op(cp_tmp, OP_EQ, "\"abcdefg\""); - tor_free(cp_tmp); - - /* Test strndup and memdup */ - { - const char *s = "abcdefghijklmnopqrstuvwxyz"; - cp_tmp = tor_strndup(s, 30); - tt_str_op(cp_tmp,OP_EQ, s); /* same string, */ - tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ - tor_free(cp_tmp); - - cp_tmp = tor_strndup(s, 5); - tt_str_op(cp_tmp,OP_EQ, "abcde"); - tor_free(cp_tmp); - - s = "a\0b\0c\0d\0e\0"; - cp_tmp = tor_memdup(s,10); - tt_mem_op(cp_tmp,OP_EQ, s, 10); /* same ram, */ - tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ - tor_free(cp_tmp); - } - - /* Test str-foo functions */ - cp_tmp = tor_strdup("abcdef"); - tt_assert(tor_strisnonupper(cp_tmp)); - cp_tmp[3] = 'D'; - tt_assert(!tor_strisnonupper(cp_tmp)); - tor_strupper(cp_tmp); - tt_str_op(cp_tmp,OP_EQ, "ABCDEF"); - tor_strlower(cp_tmp); - tt_str_op(cp_tmp,OP_EQ, "abcdef"); - tt_assert(tor_strisnonupper(cp_tmp)); - tt_assert(tor_strisprint(cp_tmp)); - cp_tmp[3] = 3; - tt_assert(!tor_strisprint(cp_tmp)); - tor_free(cp_tmp); - - /* Test memmem and memstr */ - { - const char *haystack = "abcde"; - tt_ptr_op(tor_memmem(haystack, 5, "ef", 2), OP_EQ, NULL); - tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),OP_EQ, haystack + 2); - tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),OP_EQ, haystack + 2); - tt_ptr_op(tor_memmem(haystack, 4, "cde", 3), OP_EQ, NULL); - haystack = "ababcad"; - tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),OP_EQ, haystack + 2); - tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),OP_EQ, haystack + 5); - tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),OP_EQ, haystack + 4); - tt_ptr_op(tor_memmem(haystack, 7, "dadad", 5), OP_EQ, NULL); - tt_ptr_op(tor_memmem(haystack, 7, "abcdefghij", 10), OP_EQ, NULL); - /* memstr */ - tt_ptr_op(tor_memstr(haystack, 7, "abc"),OP_EQ, haystack + 2); - tt_ptr_op(tor_memstr(haystack, 7, "cad"),OP_EQ, haystack + 4); - tt_ptr_op(tor_memstr(haystack, 6, "cad"), OP_EQ, NULL); - tt_ptr_op(tor_memstr(haystack, 7, "cadd"), OP_EQ, NULL); - tt_ptr_op(tor_memstr(haystack, 7, "fe"), OP_EQ, NULL); - tt_ptr_op(tor_memstr(haystack, 7, "ababcade"), OP_EQ, NULL); - } - - /* Test hex_str */ - { - char binary_data[68]; - size_t idx; - for (idx = 0; idx < sizeof(binary_data); ++idx) - binary_data[idx] = idx; - tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); - tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); - tt_str_op(hex_str(binary_data, 17),OP_EQ, - "000102030405060708090A0B0C0D0E0F10"); - tt_str_op(hex_str(binary_data, 32),OP_EQ, - "000102030405060708090A0B0C0D0E0F" - "101112131415161718191A1B1C1D1E1F"); - tt_str_op(hex_str(binary_data, 34),OP_EQ, - "000102030405060708090A0B0C0D0E0F" - "101112131415161718191A1B1C1D1E1F"); - /* Repeat these tests for shorter strings after longer strings - have been tried, to make sure we're correctly terminating strings */ - tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); - tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); - } - - /* Test strcmp_opt */ - tt_int_op(strcmp_opt("", "foo"), OP_LT, 0); - tt_int_op(strcmp_opt("", ""), OP_EQ, 0); - tt_int_op(strcmp_opt("foo", ""), OP_GT, 0); - - tt_int_op(strcmp_opt(NULL, ""), OP_LT, 0); - tt_int_op(strcmp_opt(NULL, NULL), OP_EQ, 0); - tt_int_op(strcmp_opt("", NULL), OP_GT, 0); - - tt_int_op(strcmp_opt(NULL, "foo"), OP_LT, 0); - tt_int_op(strcmp_opt("foo", NULL), OP_GT, 0); - - /* Test strcmp_len */ - tt_int_op(strcmp_len("foo", "bar", 3), OP_GT, 0); - tt_int_op(strcmp_len("foo", "bar", 2), OP_LT, 0); - tt_int_op(strcmp_len("foo2", "foo1", 4), OP_GT, 0); - tt_int_op(strcmp_len("foo2", "foo1", 3), OP_LT, 0); /* Really stop at len */ - tt_int_op(strcmp_len("foo2", "foo", 3), OP_EQ, 0); /* Really stop at len */ - tt_int_op(strcmp_len("blah", "", 4), OP_GT, 0); - tt_int_op(strcmp_len("blah", "", 0), OP_EQ, 0); - - done: - tor_free(cp_tmp); -} - -static void -test_util_parse_integer(void *arg) -{ - (void)arg; - int i; - char *cp; - - /* Test parse_long */ - /* Empty/zero input */ - tt_int_op(0L,OP_EQ, tor_parse_long("",10,0,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(0L,OP_EQ, tor_parse_long("0",10,0,100,&i,NULL)); - tt_int_op(1,OP_EQ, i); - /* Normal cases */ - tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,100,&i,NULL)); - tt_int_op(1,OP_EQ, i); - tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,10,&i,NULL)); - tt_int_op(1,OP_EQ, i); - tt_int_op(10L,OP_EQ, tor_parse_long("10",10,10,100,&i,NULL)); - tt_int_op(1,OP_EQ, i); - tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,100,&i,NULL)); - tt_int_op(1,OP_EQ, i); - tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,0,&i,NULL)); - tt_int_op(1,OP_EQ, i); - tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-50,0,&i,NULL)); - tt_int_op(1,OP_EQ, i); - /* Extra garbage */ - tt_int_op(0L,OP_EQ, tor_parse_long("10m",10,0,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(0L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(10L,OP_EQ, tor_parse_long("10m",10,0,100,&i,&cp)); - tt_int_op(1,OP_EQ, i); - tt_str_op(cp,OP_EQ, "m"); - tt_int_op(-50L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp)); - tt_int_op(1,OP_EQ, i); - tt_str_op(cp,OP_EQ, " plus garbage"); - /* Illogical min max */ - tor_capture_bugs_(1); - tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,4,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - tt_str_op("!(max < min)", OP_EQ, - smartlist_get(tor_get_captured_bug_log_(), 0)); - tor_end_capture_bugs_(); - tor_capture_bugs_(1); - tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,100,-100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - tt_str_op("!(max < min)", OP_EQ, - smartlist_get(tor_get_captured_bug_log_(), 0)); - tor_end_capture_bugs_(); - /* Out of bounds */ - tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,0,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - /* Base different than 10 */ - tt_int_op(2L,OP_EQ, tor_parse_long("10",2,0,100,NULL,NULL)); - tt_int_op(0L,OP_EQ, tor_parse_long("2",2,0,100,NULL,NULL)); - tt_int_op(68284L,OP_EQ, tor_parse_long("10abc",16,0,70000,NULL,NULL)); - tt_int_op(68284L,OP_EQ, tor_parse_long("10ABC",16,0,70000,NULL,NULL)); - tor_capture_bugs_(2); - tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL)); - tt_int_op(0,OP_EQ, tor_parse_long("10ABC",-1,0,70000,&i,NULL)); - tt_int_op(2, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - tor_end_capture_bugs_(); - tt_int_op(i,OP_EQ, 0); - - /* Test parse_ulong */ - tt_int_op(0UL,OP_EQ, tor_parse_ulong("",10,0,100,NULL,NULL)); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("0",10,0,100,NULL,NULL)); - tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,100,NULL,NULL)); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("10",10,50,100,NULL,NULL)); - tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,10,NULL,NULL)); - tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,10,100,NULL,NULL)); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("8",8,0,100,NULL,NULL)); - tt_int_op(50UL,OP_EQ, tor_parse_ulong("50",10,50,100,NULL,NULL)); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,NULL,NULL)); - tor_capture_bugs_(1); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("50",-1,50,100,&i,NULL)); - tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - tor_end_capture_bugs_(); - tt_int_op(0,OP_EQ, i); - tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,&i,NULL)); - tt_int_op(0,OP_EQ, i); - - /* Test parse_uint64 */ - tt_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp)); - tt_int_op(1,OP_EQ, i); - tt_str_op(cp,OP_EQ, " x"); - tt_assert(U64_LITERAL(12345678901) == - tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp)); - tt_int_op(1,OP_EQ, i); - tt_str_op(cp,OP_EQ, ""); - tt_assert(U64_LITERAL(0) == - tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp)); - tt_int_op(0,OP_EQ, i); - tor_capture_bugs_(1); - tt_assert(U64_LITERAL(0) == - tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp)); - tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_())); - tor_end_capture_bugs_(); - tt_int_op(0,OP_EQ, i); - - { - /* Test parse_double */ - double d = tor_parse_double("10", 0, (double)UINT64_MAX,&i,NULL); - tt_int_op(1,OP_EQ, i); - tt_assert(DBL_TO_U64(d) == 10); - d = tor_parse_double("0", 0, (double)UINT64_MAX,&i,NULL); - tt_int_op(1,OP_EQ, i); - tt_assert(DBL_TO_U64(d) == 0); - d = tor_parse_double(" ", 0, (double)UINT64_MAX,&i,NULL); - tt_double_op(fabs(d), OP_LT, 1e-10); - tt_int_op(0,OP_EQ, i); - d = tor_parse_double(".0a", 0, (double)UINT64_MAX,&i,NULL); - tt_double_op(fabs(d), OP_LT, 1e-10); - tt_int_op(0,OP_EQ, i); - d = tor_parse_double(".0a", 0, (double)UINT64_MAX,&i,&cp); - tt_double_op(fabs(d), OP_LT, 1e-10); - tt_int_op(1,OP_EQ, i); - d = tor_parse_double("-.0", 0, (double)UINT64_MAX,&i,NULL); - tt_int_op(1,OP_EQ, i); - tt_assert(DBL_TO_U64(d) == 0); - d = tor_parse_double("-10", -100.0, 100.0,&i,NULL); - tt_int_op(1,OP_EQ, i); - tt_double_op(fabs(d - -10.0),OP_LT, 1E-12); - } - - { - /* Test tor_parse_* where we overflow/underflow the underlying type. */ - /* This string should overflow 64-bit ints. */ -#define TOOBIG "100000000000000000000000000" - tt_int_op(0L, OP_EQ, - tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); - tt_int_op(i,OP_EQ, 0); - tt_int_op(0L,OP_EQ, - tor_parse_long("-"TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); - tt_int_op(i,OP_EQ, 0); - tt_int_op(0UL,OP_EQ, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL)); - tt_int_op(i,OP_EQ, 0); - tt_u64_op(U64_LITERAL(0), OP_EQ, tor_parse_uint64(TOOBIG, 10, - 0, UINT64_MAX, &i, NULL)); - tt_int_op(i,OP_EQ, 0); - } - done: - tor_end_capture_bugs_(); -} - -static void -test_util_pow2(void *arg) -{ - /* Test tor_log2(). */ - (void)arg; - tt_int_op(tor_log2(64),OP_EQ, 6); - tt_int_op(tor_log2(65),OP_EQ, 6); - tt_int_op(tor_log2(63),OP_EQ, 5); - /* incorrect mathematically, but as specified: */ - tt_int_op(tor_log2(0),OP_EQ, 0); - tt_int_op(tor_log2(1),OP_EQ, 0); - tt_int_op(tor_log2(2),OP_EQ, 1); - tt_int_op(tor_log2(3),OP_EQ, 1); - tt_int_op(tor_log2(4),OP_EQ, 2); - tt_int_op(tor_log2(5),OP_EQ, 2); - tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),OP_EQ, 55); - tt_int_op(tor_log2(UINT64_MAX),OP_EQ, 63); - - /* Test round_to_power_of_2 */ - tt_u64_op(round_to_power_of_2(120), OP_EQ, 128); - tt_u64_op(round_to_power_of_2(128), OP_EQ, 128); - tt_u64_op(round_to_power_of_2(130), OP_EQ, 128); - tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), OP_EQ, - U64_LITERAL(1)<<55); - tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), OP_EQ, - U64_LITERAL(1)<<63); - tt_u64_op(round_to_power_of_2(0), OP_EQ, 1); - tt_u64_op(round_to_power_of_2(1), OP_EQ, 1); - tt_u64_op(round_to_power_of_2(2), OP_EQ, 2); - tt_u64_op(round_to_power_of_2(3), OP_EQ, 2); - tt_u64_op(round_to_power_of_2(4), OP_EQ, 4); - tt_u64_op(round_to_power_of_2(5), OP_EQ, 4); - tt_u64_op(round_to_power_of_2(6), OP_EQ, 4); - tt_u64_op(round_to_power_of_2(7), OP_EQ, 8); - - done: - ; -} - -static void -test_util_compress_impl(compress_method_t method) -{ - char *buf1=NULL, *buf2=NULL, *buf3=NULL; - size_t len1, len2; - - tt_assert(tor_compress_supports_method(method)); - - if (method != NO_METHOD) { - tt_ptr_op(tor_compress_version_str(method), OP_NE, NULL); - tt_ptr_op(tor_compress_header_version_str(method), OP_NE, NULL); - } - - buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); - tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); - - tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method)); - tt_ptr_op(buf2, OP_NE, NULL); - if (method == NO_METHOD) { - // The identity transform doesn't actually compress, and it isn't - // detectable as "the identity transform." - tt_int_op(len1, OP_EQ, strlen(buf1)+1); - tt_int_op(detect_compression_method(buf2, len1), OP_EQ, UNKNOWN_METHOD); - } else { - tt_int_op(len1, OP_LT, strlen(buf1)); - tt_int_op(detect_compression_method(buf2, len1), OP_EQ, method); - } - - tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO)); - tt_ptr_op(buf3, OP_NE, NULL); - tt_int_op(strlen(buf1) + 1, OP_EQ, len2); - tt_str_op(buf1, OP_EQ, buf3); - tt_int_op(buf3[len2], OP_EQ, 0); - - /* Check whether we can uncompress concatenated, compressed strings. */ - tor_free(buf3); - buf2 = tor_reallocarray(buf2, len1, 2); - memcpy(buf2+len1, buf2, len1); - tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1*2, method, 1, LOG_INFO)); - tt_int_op((strlen(buf1)+1)*2, OP_EQ, len2); - tt_mem_op(buf3, OP_EQ, - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", - (strlen(buf1)+1)*2); - tt_int_op(buf3[len2], OP_EQ, 0); - - /* Check whether we can uncompress partial strings */ - - tor_free(buf1); - tor_free(buf2); - tor_free(buf3); - - size_t b1len = 1<<10; - if (method == ZSTD_METHOD) { - // zstd needs a big input before it starts generating output that it - // can partially decompress. - b1len = 1<<18; - } - buf1 = tor_malloc(b1len); - crypto_rand(buf1, b1len); - tt_assert(!tor_compress(&buf2, &len1, buf1, b1len, method)); - tt_int_op(len1, OP_GT, 16); - /* when we allow an incomplete output we should succeed.*/ - tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16, - method, 0, LOG_INFO)); - tt_int_op(len2, OP_GT, 5); - tt_int_op(len2, OP_LE, len1); - tt_assert(fast_memeq(buf1, buf3, len2)); - tt_int_op(buf3[len2], OP_EQ, 0); - - /* when we demand a complete output from a real compression method, this - * must fail. */ - tor_free(buf3); - if (method != NO_METHOD) { - tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16, - method, 1, LOG_INFO)); - tt_ptr_op(buf3, OP_EQ, NULL); - } - - done: - tor_free(buf1); - tor_free(buf2); - tor_free(buf3); -} - -static void -test_util_compress_stream_impl(compress_method_t method, - compression_level_t level) -{ - char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; - const char *ccp2; - size_t len1, len2; - - tor_compress_state_t *state = NULL; - state = tor_compress_new(1, method, level); - tt_assert(state); - cp1 = buf1 = tor_malloc(1024); - len1 = 1024; - ccp2 = "ABCDEFGHIJABCDEFGHIJ"; - len2 = 21; - tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 0), - OP_EQ, TOR_COMPRESS_OK); - tt_int_op(0, OP_EQ, len2); /* Make sure we compressed it all. */ - tt_assert(cp1 > buf1); - - len2 = 0; - cp2 = cp1; - tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 1), - OP_EQ, TOR_COMPRESS_DONE); - tt_int_op(0, OP_EQ, len2); - if (method == NO_METHOD) { - tt_ptr_op(cp1, OP_EQ, cp2); - } else { - tt_assert(cp1 > cp2); /* Make sure we really added something. */ - } - - tt_int_op(tor_compress_state_size(state), OP_GT, 0); - - tt_assert(!tor_uncompress(&buf3, &len2, buf1, 1024-len1, - method, 1, LOG_WARN)); - /* Make sure it compressed right. */ - tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ"); - tt_int_op(21, OP_EQ, len2); - - done: - if (state) - tor_compress_free(state); - tor_free(buf1); - tor_free(buf2); - tor_free(buf3); -} - -/** Run unit tests for compression functions */ -static void -test_util_compress(void *arg) -{ - const char *methodname = arg; - tt_assert(methodname); - - compress_method_t method = compression_method_get_by_name(methodname); - tt_int_op(method, OP_NE, UNKNOWN_METHOD); - - if (! tor_compress_supports_method(method)) { - tt_skip(); - } - - compression_level_t levels[] = { - BEST_COMPRESSION, - HIGH_COMPRESSION, - MEDIUM_COMPRESSION, - LOW_COMPRESSION - }; - - test_util_compress_impl(method); - - for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { - compression_level_t level = levels[l]; - test_util_compress_stream_impl(method, level); - } - done: - ; -} - -static void -test_util_decompress_concatenated_impl(compress_method_t method) -{ - char input[4096]; - char *c1 = NULL, *c2 = NULL, *c3 = NULL; - char *result = NULL; - size_t sz1, sz2, sz3, szr; - int r; - - crypto_rand(input, sizeof(input)); - - /* Compress the input in two chunks. */ - r = tor_compress(&c1, &sz1, input, 2048, method); - tt_int_op(r, OP_EQ, 0); - r = tor_compress(&c2, &sz2, input+2048, 2048, method); - tt_int_op(r, OP_EQ, 0); - - /* concatenate the chunks. */ - sz3 = sz1 + sz2; - c3 = tor_malloc(sz3); - memcpy(c3, c1, sz1); - memcpy(c3+sz1, c2, sz2); - - /* decompress the concatenated result */ - r = tor_uncompress(&result, &szr, c3, sz3, method, 0, LOG_WARN); - tt_int_op(r, OP_EQ, 0); - tt_int_op(szr, OP_EQ, sizeof(input)); - tt_mem_op(result, OP_EQ, input, sizeof(input)); - - done: - tor_free(c1); - tor_free(c2); - tor_free(c3); - tor_free(result); -} - -static void -test_util_decompress_concatenated(void *arg) -{ - const char *methodname = arg; - tt_assert(methodname); - - compress_method_t method = compression_method_get_by_name(methodname); - tt_int_op(method, OP_NE, UNKNOWN_METHOD); - if (! tor_compress_supports_method(method)) { - tt_skip(); - } - - test_util_decompress_concatenated_impl(method); - done: - ; -} - -static void -test_util_decompress_junk_impl(compress_method_t method) -{ - char input[4096]; - char *result = NULL, *result2 = NULL; - size_t szr, szr2, sz; - int r; - - /* This shouldn't be a compressed string according to any method. */ - strlcpy(input, "This shouldn't be a compressed string by any means.", - sizeof(input)); - sz = strlen(input); - setup_capture_of_logs(LOG_WARN); - r = tor_uncompress(&result, &szr, input, sz, method, 0, LOG_WARN); - tt_int_op(r, OP_EQ, -1); - tt_ptr_op(result, OP_EQ, NULL); - expect_log_msg_containing("Error while uncompressing data: bad input?"); - mock_clean_saved_logs(); - - /* Now try again, with a compressed object that starts out good and turns to - junk. */ - crypto_rand(input, sizeof(input)); - r = tor_compress(&result, &szr, input, sizeof(input), method); - tt_int_op(r, OP_EQ, 0); - crypto_rand(result+szr/2, szr-(szr/2)); // trash the 2nd half of the result - r = tor_uncompress(&result2, &szr2, result, szr, method, 0, LOG_WARN); - tt_int_op(r, OP_EQ, -1); - expect_log_msg_containing("Error while uncompressing data: bad input?"); - - done: - teardown_capture_of_logs(); - tor_free(result); - tor_free(result2); -} - -static void -test_util_decompress_junk(void *arg) -{ - const char *methodname = arg; - tt_assert(methodname); - - compress_method_t method = compression_method_get_by_name(methodname); - tt_int_op(method, OP_NE, UNKNOWN_METHOD); - if (! tor_compress_supports_method(method)) { - tt_skip(); - } - - test_util_decompress_junk_impl(method); - done: - ; -} - -/* mock replacement for tor_compress_is_compression_bomb that doesn't - * believe in compression bombs. */ -static int -mock_is_never_compression_bomb(size_t in, size_t out) -{ - (void)in; - (void) out; - return 0; -} - -static void -test_util_decompress_dos_impl(compress_method_t method) -{ - char *input; - char *result = NULL, *result2 = NULL; - size_t szr, szr2; - int r; - - const size_t big = 1024*1024; - /* one megabyte of 0s. */ - input = tor_malloc_zero(big); - - /* Compress it into "result": it should fail. */ - setup_full_capture_of_logs(LOG_WARN); - r = tor_compress(&result, &szr, input, big, method); - tt_int_op(r, OP_EQ, -1); - expect_log_msg_containing( - "other Tors would think this was a compression bomb"); - teardown_capture_of_logs(); - - /* Try again, but this time suppress compression-bomb detection */ - MOCK(tor_compress_is_compression_bomb, mock_is_never_compression_bomb); - r = tor_compress(&result, &szr, input, big, method); - UNMOCK(tor_compress_is_compression_bomb); - tt_int_op(r, OP_EQ, 0); - tt_ptr_op(result, OP_NE, NULL); - - /* We should refuse to uncomrpess it again, since it looks like a - * compression bomb. */ - setup_capture_of_logs(LOG_WARN); - r = tor_uncompress(&result2, &szr2, result, szr, method, 0, LOG_WARN); - tt_int_op(r, OP_EQ, -1); - expect_log_msg_containing("bomb; abandoning stream"); - - done: - teardown_capture_of_logs(); - tor_free(input); - tor_free(result); - tor_free(result2); -} - -static void -test_util_decompress_dos(void *arg) -{ - const char *methodname = arg; - tt_assert(methodname); - - compress_method_t method = compression_method_get_by_name(methodname); - tt_int_op(method, OP_NE, UNKNOWN_METHOD); - if (! tor_compress_supports_method(method)) { - tt_skip(); - } - - test_util_decompress_dos_impl(method); - done: - ; -} - -static void -test_util_gzip_compression_bomb(void *arg) -{ - /* A 'compression bomb' is a very small object that uncompresses to a huge - * one. Most compression formats support them, but they can be a DOS vector. - * In Tor we try not to generate them, and we don't accept them. - */ - (void) arg; - size_t one_million = 1<<20; - char *one_mb = tor_malloc_zero(one_million); - char *result = NULL; - size_t result_len = 0; - tor_compress_state_t *state = NULL; - - /* Make sure we can't produce a compression bomb */ - setup_full_capture_of_logs(LOG_WARN); - tt_int_op(-1, OP_EQ, tor_compress(&result, &result_len, - one_mb, one_million, - ZLIB_METHOD)); - expect_single_log_msg_containing( - "We compressed something and got an insanely high " - "compression factor; other Tors would think this " - "was a compression bomb."); - teardown_capture_of_logs(); - - /* Here's a compression bomb that we made manually. */ - const char compression_bomb[1039] = - { 0x78, 0xDA, 0xED, 0xC1, 0x31, 0x01, 0x00, 0x00, 0x00, 0xC2, - 0xA0, 0xF5, 0x4F, 0x6D, 0x08, 0x5F, 0xA0 /* .... */ }; - tt_int_op(-1, OP_EQ, tor_uncompress(&result, &result_len, - compression_bomb, 1039, - ZLIB_METHOD, 0, LOG_WARN)); - - /* Now try streaming that. */ - state = tor_compress_new(0, ZLIB_METHOD, HIGH_COMPRESSION); - tor_compress_output_t r; - const char *inp = compression_bomb; - size_t inlen = 1039; - do { - char *outp = one_mb; - size_t outleft = 4096; /* small on purpose */ - r = tor_compress_process(state, &outp, &outleft, &inp, &inlen, 0); - tt_int_op(inlen, OP_NE, 0); - } while (r == TOR_COMPRESS_BUFFER_FULL); - - tt_int_op(r, OP_EQ, TOR_COMPRESS_ERROR); - - done: - tor_free(one_mb); - tor_compress_free(state); -} - -/** Run unit tests for mmap() wrapper functionality. */ -static void -test_util_mmap(void *arg) -{ - char *fname1 = tor_strdup(get_fname("mapped_1")); - char *fname2 = tor_strdup(get_fname("mapped_2")); - char *fname3 = tor_strdup(get_fname("mapped_3")); - const size_t buflen = 17000; - char *buf = tor_malloc(17000); - tor_mmap_t *mapping = NULL; - - (void)arg; - crypto_rand(buf, buflen); - - mapping = tor_mmap_file(fname1); - tt_ptr_op(mapping, OP_EQ, NULL); - - write_str_to_file(fname1, "Short file.", 1); - - mapping = tor_mmap_file(fname1); - tt_assert(mapping); - tt_int_op(mapping->size,OP_EQ, strlen("Short file.")); - tt_str_op(mapping->data,OP_EQ, "Short file."); -#ifdef _WIN32 - tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); - mapping = NULL; - tt_assert(unlink(fname1) == 0); -#else - /* make sure we can unlink. */ - tt_assert(unlink(fname1) == 0); - tt_str_op(mapping->data,OP_EQ, "Short file."); - tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); - mapping = NULL; -#endif /* defined(_WIN32) */ - - /* Now a zero-length file. */ - write_str_to_file(fname1, "", 1); - mapping = tor_mmap_file(fname1); - tt_ptr_op(mapping,OP_EQ, NULL); - tt_int_op(ERANGE,OP_EQ, errno); - unlink(fname1); - - /* Make sure that we fail to map a no-longer-existent file. */ - mapping = tor_mmap_file(fname1); - tt_ptr_op(mapping, OP_EQ, NULL); - - /* Now try a big file that stretches across a few pages and isn't aligned */ - write_bytes_to_file(fname2, buf, buflen, 1); - mapping = tor_mmap_file(fname2); - tt_assert(mapping); - tt_int_op(mapping->size,OP_EQ, buflen); - tt_mem_op(mapping->data,OP_EQ, buf, buflen); - tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); - mapping = NULL; - - /* Now try a big aligned file. */ - write_bytes_to_file(fname3, buf, 16384, 1); - mapping = tor_mmap_file(fname3); - tt_assert(mapping); - tt_int_op(mapping->size,OP_EQ, 16384); - tt_mem_op(mapping->data,OP_EQ, buf, 16384); - tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); - mapping = NULL; - - done: - unlink(fname1); - unlink(fname2); - unlink(fname3); - - tor_free(fname1); - tor_free(fname2); - tor_free(fname3); - tor_free(buf); - - tor_munmap_file(mapping); -} - -/** Run unit tests for escaping/unescaping data for use by controllers. */ -static void -test_util_control_formats(void *arg) -{ - char *out = NULL; - const char *inp = - "..This is a test\r\n.of the emergency \n..system.\r\n\rZ.\r\n"; - size_t sz; - - (void)arg; - sz = read_escaped_data(inp, strlen(inp), &out); - tt_str_op(out,OP_EQ, - ".This is a test\nof the emergency \n.system.\n\rZ.\n"); - tt_int_op(sz,OP_EQ, strlen(out)); - - done: - tor_free(out); -} - -#define test_feq(value1,value2) do { \ - double v1 = (value1), v2=(value2); \ - double tf_diff = v1-v2; \ - double tf_tolerance = ((v1+v2)/2.0)/1e8; \ - if (tf_diff<0) tf_diff=-tf_diff; \ - if (tf_tolerance<0) tf_tolerance=-tf_tolerance; \ - if (tf_diff 1 year are reported in days (warn?) */ - - /* ignore exact spelling of "days(s)," etc., if present */ - format_time_interval(dbuf, sizeof(dbuf), 758635154); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 8780); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 11); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 59); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - - /* negative periods > 1 year are reported in days (warn?) */ - - format_time_interval(dbuf, sizeof(dbuf), -1427014922); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 16516); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 9); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 2); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - -#if SIZEOF_LONG == 4 || SIZEOF_LONG == 8 - - /* We can try INT32_MIN/MAX */ - /* Always ignore second(s) */ - - /* INT32_MAX */ - format_time_interval(dbuf, sizeof(dbuf), 2147483647); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 24855); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 3); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 14); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - /* and 7 seconds - ignored */ - - /* INT32_MIN: check that we get the absolute value of interval, - * which doesn't actually fit in int32_t. - * We expect INT32_MAX or INT32_MAX + 1 with 64 bit longs */ - format_time_interval(dbuf, sizeof(dbuf), -2147483647L - 1L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 24855); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 3); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 14); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - /* and 7 or 8 seconds - ignored */ - -#endif /* SIZEOF_LONG == 4 || SIZEOF_LONG == 8 */ - -#if SIZEOF_LONG == 8 - - /* We can try INT64_MIN/MAX */ - /* Always ignore second(s) */ - - /* INT64_MAX */ - format_time_interval(dbuf, sizeof(dbuf), 9223372036854775807L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 106751991167300L); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 15); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 30); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - /* and 7 seconds - ignored */ - - /* INT64_MIN: check that we get the absolute value of interval, - * which doesn't actually fit in int64_t. - * We expect INT64_MAX */ - format_time_interval(dbuf, sizeof(dbuf), - -9223372036854775807L - 1L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); - r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, - &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,OP_EQ, 6); - tt_int_op(day,OP_EQ, 106751991167300L); - tt_ci_char_op(label_d[0],OP_EQ, 'd'); - tt_int_op(hour,OP_EQ, 15); - tt_ci_char_op(label_h[0],OP_EQ, 'h'); - tt_int_op(min,OP_EQ, 30); - tt_ci_char_op(label_m[0],OP_EQ, 'm'); - /* and 7 or 8 seconds - ignored */ - -#endif /* SIZEOF_LONG == 8 */ - - done: - ; -} - -#undef tt_char_op -#undef tt_ci_char_op -#undef DBUF_SIZE -#undef T_ -#undef LABEL_SIZE -#undef L_ -#undef TL_ - -static void -test_util_path_is_relative(void *arg) -{ - /* OS-independent tests */ - (void)arg; - tt_int_op(1,OP_EQ, path_is_relative("")); - tt_int_op(1,OP_EQ, path_is_relative("dir")); - tt_int_op(1,OP_EQ, path_is_relative("dir/")); - tt_int_op(1,OP_EQ, path_is_relative("./dir")); - tt_int_op(1,OP_EQ, path_is_relative("../dir")); - - tt_int_op(0,OP_EQ, path_is_relative("/")); - tt_int_op(0,OP_EQ, path_is_relative("/dir")); - tt_int_op(0,OP_EQ, path_is_relative("/dir/")); - - /* Windows */ -#ifdef _WIN32 - /* I don't have Windows so I can't test this, hence the "#ifdef - 0". These are tests that look useful, so please try to get them - running and uncomment if it all works as it should */ - tt_int_op(1,OP_EQ, path_is_relative("dir")); - tt_int_op(1,OP_EQ, path_is_relative("dir\\")); - tt_int_op(1,OP_EQ, path_is_relative("dir\\a:")); - tt_int_op(1,OP_EQ, path_is_relative("dir\\a:\\")); - tt_int_op(1,OP_EQ, path_is_relative("http:\\dir")); - - tt_int_op(0,OP_EQ, path_is_relative("\\dir")); - tt_int_op(0,OP_EQ, path_is_relative("a:\\dir")); - tt_int_op(0,OP_EQ, path_is_relative("z:\\dir")); -#endif /* defined(_WIN32) */ - - done: - ; -} - -/** Run unittests for memory area allocator */ -static void -test_util_memarea(void *arg) -{ - memarea_t *area = memarea_new(); - char *p1, *p2, *p3, *p1_orig; - void *malloced_ptr = NULL; - int i; - -#ifdef DISABLE_MEMORY_SENTINELS - /* If memory sentinels are disabled, this whole module is just an alias for - malloc(), which is free to lay out memory most any way it wants. */ - if (1) - tt_skip(); -#endif /* defined(DISABLE_MEMORY_SENTINELS) */ - - (void)arg; - tt_assert(area); - - p1_orig = p1 = memarea_alloc(area,64); - p2 = memarea_alloc_zero(area,52); - p3 = memarea_alloc(area,11); - - tt_assert(memarea_owns_ptr(area, p1)); - tt_assert(memarea_owns_ptr(area, p2)); - tt_assert(memarea_owns_ptr(area, p3)); - /* Make sure we left enough space. */ - tt_assert(p1+64 <= p2); - tt_assert(p2+52 <= p3); - /* Make sure we aligned. */ - tt_int_op(((uintptr_t)p1) % sizeof(void*),OP_EQ, 0); - tt_int_op(((uintptr_t)p2) % sizeof(void*),OP_EQ, 0); - tt_int_op(((uintptr_t)p3) % sizeof(void*),OP_EQ, 0); - tt_assert(!memarea_owns_ptr(area, p3+8192)); - tt_assert(!memarea_owns_ptr(area, p3+30)); - tt_assert(tor_mem_is_zero(p2, 52)); - /* Make sure we don't overalign. */ - p1 = memarea_alloc(area, 1); - p2 = memarea_alloc(area, 1); - tt_ptr_op(p1+sizeof(void*),OP_EQ, p2); - { - malloced_ptr = tor_malloc(64); - tt_assert(!memarea_owns_ptr(area, malloced_ptr)); - tor_free(malloced_ptr); - } - - /* memarea_memdup */ - { - malloced_ptr = tor_malloc(64); - crypto_rand((char*)malloced_ptr, 64); - p1 = memarea_memdup(area, malloced_ptr, 64); - tt_assert(p1 != malloced_ptr); - tt_mem_op(p1,OP_EQ, malloced_ptr, 64); - tor_free(malloced_ptr); - } - - /* memarea_strdup. */ - p1 = memarea_strdup(area,""); - p2 = memarea_strdup(area, "abcd"); - tt_assert(p1); - tt_assert(p2); - tt_str_op(p1,OP_EQ, ""); - tt_str_op(p2,OP_EQ, "abcd"); - - /* memarea_strndup. */ - { - const char *s = "Ad ogni porta batte la morte e grida: il nome!"; - /* (From Turandot, act 3.) */ - size_t len = strlen(s); - p1 = memarea_strndup(area, s, 1000); - p2 = memarea_strndup(area, s, 10); - tt_str_op(p1,OP_EQ, s); - tt_assert(p2 >= p1 + len + 1); - tt_mem_op(s,OP_EQ, p2, 10); - tt_int_op(p2[10],OP_EQ, '\0'); - p3 = memarea_strndup(area, s, len); - tt_str_op(p3,OP_EQ, s); - p3 = memarea_strndup(area, s, len-1); - tt_mem_op(s,OP_EQ, p3, len-1); - tt_int_op(p3[len-1],OP_EQ, '\0'); - } - - memarea_clear(area); - p1 = memarea_alloc(area, 1); - tt_ptr_op(p1,OP_EQ, p1_orig); - memarea_clear(area); - size_t total = 0, initial_allocation, allocation2, dummy; - memarea_get_stats(area, &initial_allocation, &dummy); - - /* Check for running over an area's size. */ - for (i = 0; i < 4096; ++i) { - size_t n = crypto_rand_int(6); - p1 = memarea_alloc(area, n); - total += n; - tt_assert(memarea_owns_ptr(area, p1)); - } - memarea_assert_ok(area); - memarea_get_stats(area, &allocation2, &dummy); - /* Make sure we can allocate a too-big object. */ - p1 = memarea_alloc_zero(area, 9000); - p2 = memarea_alloc_zero(area, 16); - total += 9000; - total += 16; - tt_assert(memarea_owns_ptr(area, p1)); - tt_assert(memarea_owns_ptr(area, p2)); - - /* Now test stats... */ - size_t allocated = 0, used = 0; - memarea_get_stats(area, &allocated, &used); - tt_int_op(used, OP_LE, allocated); - tt_int_op(used, OP_GE, total); /* not EQ, because of alignment and headers*/ - tt_int_op(allocated, OP_GT, allocation2); - - tt_int_op(allocation2, OP_GT, initial_allocation); - - memarea_clear(area); - memarea_get_stats(area, &allocated, &used); - tt_int_op(used, OP_LT, 128); /* Not 0, because of header */ - tt_int_op(allocated, OP_EQ, initial_allocation); - - done: - memarea_drop_all(area); - tor_free(malloced_ptr); -} - -/** Run unit tests for utility functions to get file names relative to - * the data directory. */ -static void -test_util_datadir(void *arg) -{ - char buf[1024]; - char *f = NULL; - char *temp_dir = NULL; - - (void)arg; - temp_dir = get_datadir_fname(NULL); - f = get_datadir_fname("state"); - tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir); - tt_str_op(f,OP_EQ, buf); - tor_free(f); - f = get_datadir_fname2("cache", "thingy"); - tor_snprintf(buf, sizeof(buf), - "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir); - tt_str_op(f,OP_EQ, buf); - tor_free(f); - f = get_datadir_fname2_suffix("cache", "thingy", ".foo"); - tor_snprintf(buf, sizeof(buf), - "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir); - tt_str_op(f,OP_EQ, buf); - tor_free(f); - f = get_datadir_fname_suffix("cache", ".foo"); - tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo", - temp_dir); - tt_str_op(f,OP_EQ, buf); - - done: - tor_free(f); - tor_free(temp_dir); -} - -static void -test_util_strtok(void *arg) -{ - char buf[128]; - char buf2[128]; - int i; - char *cp1, *cp2; - - (void)arg; - for (i = 0; i < 3; i++) { - const char *pad1="", *pad2=""; - switch (i) { - case 0: - break; - case 1: - pad1 = " "; - pad2 = "!"; - break; - case 2: - pad1 = " "; - pad2 = ";!"; - break; - } - tor_snprintf(buf, sizeof(buf), "%s", pad1); - tor_snprintf(buf2, sizeof(buf2), "%s", pad2); - tt_ptr_op(tor_strtok_r_impl(buf, " ", &cp1), OP_EQ, NULL); - tt_ptr_op(tor_strtok_r_impl(buf2, ".!..;!", &cp2), OP_EQ, NULL); - - tor_snprintf(buf, sizeof(buf), - "%sGraved on the dark in gestures of descent%s", pad1, pad1); - tor_snprintf(buf2, sizeof(buf2), - "%sthey.seemed;;their!.own;most.perfect;monument%s",pad2,pad2); - /* -- "Year's End", Richard Wilbur */ - - tt_str_op("Graved",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); - tt_str_op("they",OP_EQ, tor_strtok_r_impl(buf2, ".!..;!", &cp2)); -#define S1() tor_strtok_r_impl(NULL, " ", &cp1) -#define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2) - tt_str_op("on",OP_EQ, S1()); - tt_str_op("the",OP_EQ, S1()); - tt_str_op("dark",OP_EQ, S1()); - tt_str_op("seemed",OP_EQ, S2()); - tt_str_op("their",OP_EQ, S2()); - tt_str_op("own",OP_EQ, S2()); - tt_str_op("in",OP_EQ, S1()); - tt_str_op("gestures",OP_EQ, S1()); - tt_str_op("of",OP_EQ, S1()); - tt_str_op("most",OP_EQ, S2()); - tt_str_op("perfect",OP_EQ, S2()); - tt_str_op("descent",OP_EQ, S1()); - tt_str_op("monument",OP_EQ, S2()); - tt_ptr_op(NULL,OP_EQ, S1()); - tt_ptr_op(NULL,OP_EQ, S2()); - } - - buf[0] = 0; - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); - - strlcpy(buf, "Howdy!", sizeof(buf)); - tt_str_op("Howdy",OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, "!", &cp1)); - - strlcpy(buf, " ", sizeof(buf)); - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); - strlcpy(buf, " ", sizeof(buf)); - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); - - strlcpy(buf, "something ", sizeof(buf)); - tt_str_op("something",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); - tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, ";", &cp1)); - done: - ; -} - -static void -test_util_find_str_at_start_of_line(void *ptr) -{ - const char *long_string = - "howdy world. how are you? i hope it's fine.\n" - "hello kitty\n" - "third line"; - char *line2 = strchr(long_string,'\n')+1; - char *line3 = strchr(line2,'\n')+1; - const char *short_string = "hello kitty\n" - "second line\n"; - char *short_line2 = strchr(short_string,'\n')+1; - - (void)ptr; - - tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "")); - tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(short_string, "nonsense")); - tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "nonsense")); - tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "\n")); - tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "how ")); - tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "kitty")); - tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "h")); - tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "how")); - tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "he")); - tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hell")); - tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hello k")); - tt_ptr_op(line2,OP_EQ, - find_str_at_start_of_line(long_string, "hello kitty\n")); - tt_ptr_op(line2,OP_EQ, - find_str_at_start_of_line(long_string, "hello kitty\nt")); - tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third")); - tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third line")); - tt_ptr_op(NULL, OP_EQ, - find_str_at_start_of_line(long_string, "third line\n")); - tt_ptr_op(short_line2,OP_EQ, find_str_at_start_of_line(short_string, - "second line\n")); - done: - ; -} - -static void -test_util_string_is_C_identifier(void *ptr) -{ - (void)ptr; - - tt_int_op(1,OP_EQ, string_is_C_identifier("string_is_C_identifier")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_string_is_C_identifier")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_")); - tt_int_op(1,OP_EQ, string_is_C_identifier("i")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_____")); - tt_int_op(1,OP_EQ, string_is_C_identifier("__00__")); - tt_int_op(1,OP_EQ, string_is_C_identifier("__init__")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_0string_is_C_identifier")); - tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); - - tt_int_op(0,OP_EQ, string_is_C_identifier("0_string_is_C_identifier")); - tt_int_op(0,OP_EQ, string_is_C_identifier("0")); - tt_int_op(0,OP_EQ, string_is_C_identifier("")); - tt_int_op(0,OP_EQ, string_is_C_identifier(";")); - tt_int_op(0,OP_EQ, string_is_C_identifier("i;")); - tt_int_op(0,OP_EQ, string_is_C_identifier("_;")); - tt_int_op(0,OP_EQ, string_is_C_identifier("í")); - tt_int_op(0,OP_EQ, string_is_C_identifier("ñ")); - - done: - ; -} - -static void -test_util_asprintf(void *ptr) -{ -#define LOREMIPSUM \ - "Lorem ipsum dolor sit amet, consectetur adipisicing elit" - char *cp=NULL, *cp2=NULL; - int r; - (void)ptr; - - /* simple string */ - r = tor_asprintf(&cp, "simple string 100%% safe"); - tt_assert(cp); - tt_str_op("simple string 100% safe",OP_EQ, cp); - tt_int_op(strlen(cp),OP_EQ, r); - tor_free(cp); - - /* empty string */ - r = tor_asprintf(&cp, "%s", ""); - tt_assert(cp); - tt_str_op("",OP_EQ, cp); - tt_int_op(strlen(cp),OP_EQ, r); - tor_free(cp); - - /* numbers (%i) */ - r = tor_asprintf(&cp, "I like numbers-%2i, %i, etc.", -1, 2); - tt_assert(cp); - tt_str_op("I like numbers--1, 2, etc.",OP_EQ, cp); - tt_int_op(strlen(cp),OP_EQ, r); - /* don't free cp; next test uses it. */ - - /* numbers (%d) */ - r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202); - tt_assert(cp2); - tt_int_op(strlen(cp2),OP_EQ, r); - tt_str_op("First=101, Second=202",OP_EQ, cp2); - tt_assert(cp != cp2); - tor_free(cp); - tor_free(cp2); - - /* Glass-box test: a string exactly 128 characters long. */ - r = tor_asprintf(&cp, "Lorem1: %sLorem2: %s", LOREMIPSUM, LOREMIPSUM); - tt_assert(cp); - tt_int_op(128,OP_EQ, r); - tt_int_op(cp[128], OP_EQ, '\0'); - tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,OP_EQ, cp); - tor_free(cp); - - /* String longer than 128 characters */ - r = tor_asprintf(&cp, "1: %s 2: %s 3: %s", - LOREMIPSUM, LOREMIPSUM, LOREMIPSUM); - tt_assert(cp); - tt_int_op(strlen(cp),OP_EQ, r); - tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,OP_EQ, cp); - - done: - tor_free(cp); - tor_free(cp2); -} - -static void -test_util_listdir(void *ptr) -{ - smartlist_t *dir_contents = NULL; - char *fname1=NULL, *fname2=NULL, *fname3=NULL, *dir1=NULL, *dirname=NULL; - int r; - (void)ptr; - - fname1 = tor_strdup(get_fname("hopscotch")); - fname2 = tor_strdup(get_fname("mumblety-peg")); - fname3 = tor_strdup(get_fname(".hidden-file")); - dir1 = tor_strdup(get_fname("some-directory")); - dirname = tor_strdup(get_fname(NULL)); - - tt_int_op(0,OP_EQ, write_str_to_file(fname1, "X\n", 0)); - tt_int_op(0,OP_EQ, write_str_to_file(fname2, "Y\n", 0)); - tt_int_op(0,OP_EQ, write_str_to_file(fname3, "Z\n", 0)); -#ifdef _WIN32 - r = mkdir(dir1); -#else - r = mkdir(dir1, 0700); -#endif - if (r) { - fprintf(stderr, "Can't create directory %s:", dir1); - perror(""); - exit(1); - } - - dir_contents = tor_listdir(dirname); - tt_assert(dir_contents); - /* make sure that each filename is listed. */ - tt_assert(smartlist_contains_string_case(dir_contents, "hopscotch")); - tt_assert(smartlist_contains_string_case(dir_contents, "mumblety-peg")); - tt_assert(smartlist_contains_string_case(dir_contents, ".hidden-file")); - tt_assert(smartlist_contains_string_case(dir_contents, "some-directory")); - - tt_assert(!smartlist_contains_string(dir_contents, ".")); - tt_assert(!smartlist_contains_string(dir_contents, "..")); - - done: - tor_free(fname1); - tor_free(fname2); - tor_free(fname3); - tor_free(dir1); - tor_free(dirname); - if (dir_contents) { - SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp)); - smartlist_free(dir_contents); - } -} - -static void -test_util_parent_dir(void *ptr) -{ - char *cp; - (void)ptr; - -#define T(output,expect_ok,input) \ - do { \ - int ok; \ - cp = tor_strdup(input); \ - ok = get_parent_directory(cp); \ - tt_int_op(expect_ok, OP_EQ, ok); \ - if (ok==0) \ - tt_str_op(output, OP_EQ, cp); \ - tor_free(cp); \ - } while (0); - - T("/home/wombat", 0, "/home/wombat/knish"); - T("/home/wombat", 0, "/home/wombat/knish/"); - T("/home/wombat", 0, "/home/wombat/knish///"); - T("./home/wombat", 0, "./home/wombat/knish/"); - T("/", 0, "/home"); - T("/", 0, "/home//"); - T(".", 0, "./wombat"); - T(".", 0, "./wombat/"); - T(".", 0, "./wombat//"); - T("wombat", 0, "wombat/foo"); - T("wombat/..", 0, "wombat/../foo"); - T("wombat/../", 0, "wombat/..//foo"); /* Is this correct? */ - T("wombat/.", 0, "wombat/./foo"); - T("wombat/./", 0, "wombat/.//foo"); /* Is this correct? */ - T("wombat", 0, "wombat/..//"); - T("wombat", 0, "wombat/foo/"); - T("wombat", 0, "wombat/.foo"); - T("wombat", 0, "wombat/.foo/"); - - T("wombat", -1, ""); - T("w", -1, ""); - T("wombat", 0, "wombat/knish"); - - T("/", 0, "/"); - T("/", 0, "////"); - - done: - tor_free(cp); -} - -static void -test_util_ftruncate(void *ptr) -{ - char *buf = NULL; - const char *fname; - int fd = -1; - const char *message = "Hello world"; - const char *message2 = "Hola mundo"; - struct stat st; - - (void) ptr; - - fname = get_fname("ftruncate"); - - fd = tor_open_cloexec(fname, O_WRONLY|O_CREAT, 0600); - tt_int_op(fd, OP_GE, 0); - - /* Make the file be there. */ - tt_int_op(strlen(message), OP_EQ, write_all(fd, message, strlen(message),0)); - tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message)); - tt_int_op(0, OP_EQ, fstat(fd, &st)); - tt_int_op((int)st.st_size, OP_EQ, strlen(message)); - - /* Truncate and see if it got truncated */ - tt_int_op(0, OP_EQ, tor_ftruncate(fd)); - tt_int_op((int)tor_fd_getpos(fd), OP_EQ, 0); - tt_int_op(0, OP_EQ, fstat(fd, &st)); - tt_int_op((int)st.st_size, OP_EQ, 0); - - /* Replace, and see if it got replaced */ - tt_int_op(strlen(message2), OP_EQ, - write_all(fd, message2, strlen(message2), 0)); - tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message2)); - tt_int_op(0, OP_EQ, fstat(fd, &st)); - tt_int_op((int)st.st_size, OP_EQ, strlen(message2)); - - close(fd); - fd = -1; - - buf = read_file_to_str(fname, 0, NULL); - tt_str_op(message2, OP_EQ, buf); - - done: - if (fd >= 0) - close(fd); - tor_free(buf); -} - -static void -test_util_num_cpus(void *arg) -{ - (void)arg; - int num = compute_num_cpus(); - if (num < 0) - tt_skip(); - - tt_int_op(num, OP_GE, 1); - tt_int_op(num, OP_LE, 16); - - done: - ; -} - -#ifdef _WIN32 -static void -test_util_load_win_lib(void *ptr) -{ - HANDLE h = load_windows_system_library(_T("advapi32.dll")); - (void) ptr; - - tt_assert(h); - done: - if (h) - FreeLibrary(h); -} -#endif /* defined(_WIN32) */ - -#ifndef _WIN32 -static void -clear_hex_errno(char *hex_errno) -{ - memset(hex_errno, '\0', HEX_ERRNO_SIZE + 1); -} - -static void -test_util_exit_status(void *ptr) -{ - /* Leave an extra byte for a \0 so we can do string comparison */ - char hex_errno[HEX_ERRNO_SIZE + 1]; - int n; - - (void)ptr; - - clear_hex_errno(hex_errno); - tt_str_op("",OP_EQ, hex_errno); - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0, 0, hex_errno); - tt_str_op("0/0\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - -#if SIZEOF_INT == 4 - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0, 0x7FFFFFFF, hex_errno); - tt_str_op("0/7FFFFFFF\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0xFF, -0x80000000, hex_errno); - tt_str_op("FF/-80000000\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); - -#elif SIZEOF_INT == 8 - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0, 0x7FFFFFFFFFFFFFFF, hex_errno); - tt_str_op("0/7FFFFFFFFFFFFFFF\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0xFF, -0x8000000000000000, hex_errno); - tt_str_op("FF/-8000000000000000\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); - -#endif /* SIZEOF_INT == 4 || ... */ - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0x7F, 0, hex_errno); - tt_str_op("7F/0\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - - clear_hex_errno(hex_errno); - n = format_helper_exit_status(0x08, -0x242, hex_errno); - tt_str_op("8/-242\n",OP_EQ, hex_errno); - tt_int_op(n,OP_EQ, strlen(hex_errno)); - - clear_hex_errno(hex_errno); - tt_str_op("",OP_EQ, hex_errno); - - done: - ; -} -#endif /* !defined(_WIN32) */ - -#ifndef _WIN32 -static void -test_util_string_from_pipe(void *ptr) -{ - int test_pipe[2] = {-1, -1}; - int retval = 0; - enum stream_status status = IO_STREAM_TERM; - ssize_t retlen; - char buf[4] = { 0 }; - - (void)ptr; - - errno = 0; - - /* Set up a pipe to test on */ - retval = pipe(test_pipe); - tt_int_op(retval, OP_EQ, 0); - - /* Send in a string. */ - retlen = write(test_pipe[1], "ABC", 3); - tt_int_op(retlen, OP_EQ, 3); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "ABC"); - errno = 0; - - /* Send in a string that contains a nul. */ - retlen = write(test_pipe[1], "AB\0", 3); - tt_int_op(retlen, OP_EQ, 3); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "AB"); - errno = 0; - - /* Send in a string that contains a nul only. */ - retlen = write(test_pipe[1], "\0", 1); - tt_int_op(retlen, OP_EQ, 1); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, ""); - errno = 0; - - /* Send in a string that contains a trailing newline. */ - retlen = write(test_pipe[1], "AB\n", 3); - tt_int_op(retlen, OP_EQ, 3); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "AB"); - errno = 0; - - /* Send in a string that contains a newline only. */ - retlen = write(test_pipe[1], "\n", 1); - tt_int_op(retlen, OP_EQ, 1); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, ""); - errno = 0; - - /* Send in a string and check that we nul terminate return values. */ - retlen = write(test_pipe[1], "AAA", 3); - tt_int_op(retlen, OP_EQ, 3); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "AAA"); - tt_mem_op(buf, OP_EQ, "AAA\0", sizeof(buf)); - errno = 0; - - retlen = write(test_pipe[1], "B", 1); - tt_int_op(retlen, OP_EQ, 1); - - memset(buf, '\xff', sizeof(buf)); - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "B"); - tt_mem_op(buf, OP_EQ, "B\0\xff\xff", sizeof(buf)); - errno = 0; - - /* Send in multiple lines. */ - retlen = write(test_pipe[1], "A\nB", 3); - tt_int_op(retlen, OP_EQ, 3); - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "A\nB"); - errno = 0; - - /* Send in a line and close */ - retlen = write(test_pipe[1], "AB", 2); - tt_int_op(retlen, OP_EQ, 2); - retval = close(test_pipe[1]); - tt_int_op(retval, OP_EQ, 0); - test_pipe[1] = -1; - - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_OKAY); - tt_str_op(buf, OP_EQ, "AB"); - errno = 0; - - /* Check for EOF */ - status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); - tt_int_op(errno, OP_EQ, 0); - tt_int_op(status, OP_EQ, IO_STREAM_CLOSED); - errno = 0; - - done: - if (test_pipe[0] != -1) - close(test_pipe[0]); - if (test_pipe[1] != -1) - close(test_pipe[1]); -} - -#endif /* !defined(_WIN32) */ - -/** - * Test for format_hex_number_sigsafe() - */ - -static void -test_util_format_hex_number(void *ptr) -{ - int i, len; - char buf[33]; - const struct { - const char *str; - unsigned int x; - } test_data[] = { - {"0", 0}, - {"1", 1}, - {"273A", 0x273a}, - {"FFFF", 0xffff}, - {"7FFFFFFF", 0x7fffffff}, - {"FFFFFFFF", 0xffffffff}, -#if UINT_MAX >= 0xffffffff - {"31BC421D", 0x31bc421d}, - {"FFFFFFFF", 0xffffffff}, -#endif - {NULL, 0} - }; - - (void)ptr; - - for (i = 0; test_data[i].str != NULL; ++i) { - len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf)); - tt_int_op(len,OP_NE, 0); - tt_int_op(len,OP_EQ, strlen(buf)); - tt_str_op(buf,OP_EQ, test_data[i].str); - } - - tt_int_op(4,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 5)); - tt_str_op(buf,OP_EQ, "FFFF"); - tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 4)); - tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0, buf, 1)); - - done: - return; -} - -/** - * Test for format_hex_number_sigsafe() - */ - -static void -test_util_format_dec_number(void *ptr) -{ - int i, len; - char buf[33]; - const struct { - const char *str; - unsigned int x; - } test_data[] = { - {"0", 0}, - {"1", 1}, - {"1234", 1234}, - {"12345678", 12345678}, - {"99999999", 99999999}, - {"100000000", 100000000}, - {"4294967295", 4294967295u}, -#if UINT_MAX > 0xffffffff - {"18446744073709551615", 18446744073709551615u }, -#endif - {NULL, 0} - }; - - (void)ptr; - - for (i = 0; test_data[i].str != NULL; ++i) { - len = format_dec_number_sigsafe(test_data[i].x, buf, sizeof(buf)); - tt_int_op(len,OP_NE, 0); - tt_int_op(len,OP_EQ, strlen(buf)); - tt_str_op(buf,OP_EQ, test_data[i].str); - - len = format_dec_number_sigsafe(test_data[i].x, buf, - (int)(strlen(test_data[i].str) + 1)); - tt_int_op(len,OP_EQ, strlen(buf)); - tt_str_op(buf,OP_EQ, test_data[i].str); - } - - tt_int_op(4,OP_EQ, format_dec_number_sigsafe(7331, buf, 5)); - tt_str_op(buf,OP_EQ, "7331"); - tt_int_op(0,OP_EQ, format_dec_number_sigsafe(7331, buf, 4)); - tt_int_op(1,OP_EQ, format_dec_number_sigsafe(0, buf, 2)); - tt_int_op(0,OP_EQ, format_dec_number_sigsafe(0, buf, 1)); - - done: - return; -} - -/** - * Test that we can properly format a Windows command line - */ -static void -test_util_join_win_cmdline(void *ptr) -{ - /* Based on some test cases from "Parsing C++ Command-Line Arguments" in - * MSDN but we don't exercise all quoting rules because tor_join_win_cmdline - * will try to only generate simple cases for the child process to parse; - * i.e. we never embed quoted strings in arguments. */ - - const char *argvs[][4] = { - {"a", "bb", "CCC", NULL}, // Normal - {NULL, NULL, NULL, NULL}, // Empty argument list - {"", NULL, NULL, NULL}, // Empty argument - {"\"a", "b\"b", "CCC\"", NULL}, // Quotes - {"a\tbc", "dd dd", "E", NULL}, // Whitespace - {"a\\\\\\b", "de fg", "H", NULL}, // Backslashes - {"a\\\"b", "\\c", "D\\", NULL}, // Backslashes before quote - {"a\\\\b c", "d", "E", NULL}, // Backslashes not before quote - { NULL } // Terminator - }; - - const char *cmdlines[] = { - "a bb CCC", - "", - "\"\"", - "\\\"a b\\\"b CCC\\\"", - "\"a\tbc\" \"dd dd\" E", - "a\\\\\\b \"de fg\" H", - "a\\\\\\\"b \\c D\\", - "\"a\\\\b c\" d E", - NULL // Terminator - }; - - int i; - char *joined_argv = NULL; - - (void)ptr; - - for (i=0; cmdlines[i]!=NULL; i++) { - log_info(LD_GENERAL, "Joining argvs[%d], expecting <%s>", i, cmdlines[i]); - joined_argv = tor_join_win_cmdline(argvs[i]); - tt_str_op(cmdlines[i],OP_EQ, joined_argv); - tor_free(joined_argv); - } - - done: - tor_free(joined_argv); -} - -#define MAX_SPLIT_LINE_COUNT 4 -struct split_lines_test_t { - const char *orig_line; // Line to be split (may contain \0's) - int orig_length; // Length of orig_line - const char *split_line[MAX_SPLIT_LINE_COUNT]; // Split lines -}; - -/** - * Test that we properly split a buffer into lines - */ -static void -test_util_split_lines(void *ptr) -{ - /* Test cases. orig_line of last test case must be NULL. - * The last element of split_line[i] must be NULL. */ - struct split_lines_test_t tests[] = { - {"", 0, {NULL}}, - {"foo", 3, {"foo", NULL}}, - {"\n\rfoo\n\rbar\r\n", 12, {"foo", "bar", NULL}}, - {"fo o\r\nb\tar", 10, {"fo o", "b.ar", NULL}}, - {"\x0f""f\0o\0\n\x01""b\0r\0\r", 12, {".f.o.", ".b.r.", NULL}}, - {"line 1\r\nline 2", 14, {"line 1", "line 2", NULL}}, - {"line 1\r\n\r\nline 2", 16, {"line 1", "line 2", NULL}}, - {"line 1\r\n\r\r\r\nline 2", 18, {"line 1", "line 2", NULL}}, - {"line 1\r\n\n\n\n\rline 2", 18, {"line 1", "line 2", NULL}}, - {"line 1\r\n\r\t\r\nline 3", 18, {"line 1", ".", "line 3", NULL}}, - {"\n\t\r\t\nline 3", 11, {".", ".", "line 3", NULL}}, - {NULL, 0, { NULL }} - }; - - int i, j; - char *orig_line=NULL; - smartlist_t *sl=NULL; - - (void)ptr; - - for (i=0; tests[i].orig_line; i++) { - sl = smartlist_new(); - /* Allocate space for string and trailing NULL */ - orig_line = tor_memdup(tests[i].orig_line, tests[i].orig_length + 1); - tor_split_lines(sl, orig_line, tests[i].orig_length); - - j = 0; - log_info(LD_GENERAL, "Splitting test %d of length %d", - i, tests[i].orig_length); - SMARTLIST_FOREACH_BEGIN(sl, const char *, line) { - /* Check we have not got too many lines */ - tt_int_op(MAX_SPLIT_LINE_COUNT, OP_GT, j); - /* Check that there actually should be a line here */ - tt_ptr_op(tests[i].split_line[j], OP_NE, NULL); - log_info(LD_GENERAL, "Line %d of test %d, should be <%s>", - j, i, tests[i].split_line[j]); - /* Check that the line is as expected */ - tt_str_op(line,OP_EQ, tests[i].split_line[j]); - j++; - } SMARTLIST_FOREACH_END(line); - /* Check that we didn't miss some lines */ - tt_ptr_op(NULL,OP_EQ, tests[i].split_line[j]); - tor_free(orig_line); - smartlist_free(sl); - sl = NULL; - } - - done: - tor_free(orig_line); - smartlist_free(sl); -} - -static void -test_util_di_ops(void *arg) -{ -#define LT -1 -#define GT 1 -#define EQ 0 - const struct { - const char *a; int want_sign; const char *b; - } examples[] = { - { "Foo", EQ, "Foo" }, - { "foo", GT, "bar", }, - { "foobar", EQ ,"foobar" }, - { "foobar", LT, "foobaw" }, - { "foobar", GT, "f00bar" }, - { "foobar", GT, "boobar" }, - { "", EQ, "" }, - { NULL, 0, NULL }, - }; - - int i; - - (void)arg; - for (i = 0; examples[i].a; ++i) { - size_t len = strlen(examples[i].a); - int eq1, eq2, neq1, neq2, cmp1, cmp2; - tt_int_op(len,OP_EQ, strlen(examples[i].b)); - /* We do all of the operations, with operands in both orders. */ - eq1 = tor_memeq(examples[i].a, examples[i].b, len); - eq2 = tor_memeq(examples[i].b, examples[i].a, len); - neq1 = tor_memneq(examples[i].a, examples[i].b, len); - neq2 = tor_memneq(examples[i].b, examples[i].a, len); - cmp1 = tor_memcmp(examples[i].a, examples[i].b, len); - cmp2 = tor_memcmp(examples[i].b, examples[i].a, len); - - /* Check for correctness of cmp1 */ - if (cmp1 < 0 && examples[i].want_sign != LT) - TT_DIE(("Assertion failed.")); - else if (cmp1 > 0 && examples[i].want_sign != GT) - TT_DIE(("Assertion failed.")); - else if (cmp1 == 0 && examples[i].want_sign != EQ) - TT_DIE(("Assertion failed.")); - - /* Check for consistency of everything else with cmp1 */ - tt_int_op(eq1,OP_EQ, eq2); - tt_int_op(neq1,OP_EQ, neq2); - tt_int_op(cmp1,OP_EQ, -cmp2); - tt_int_op(eq1,OP_EQ, cmp1 == 0); - tt_int_op(neq1,OP_EQ, !eq1); - } - - { - uint8_t zz = 0; - uint8_t ii = 0; - int z; - - /* exhaustively test tor_memeq and tor_memcmp - * against each possible single-byte numeric difference - * some arithmetic bugs only appear with certain bit patterns */ - for (z = 0; z < 256; z++) { - for (i = 0; i < 256; i++) { - ii = (uint8_t)i; - zz = (uint8_t)z; - tt_int_op(tor_memeq(&zz, &ii, 1),OP_EQ, zz == ii); - tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,OP_EQ, - zz > ii ? GT : EQ); - tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,OP_EQ, - ii < zz ? LT : EQ); - } - } - } - - tt_int_op(1, OP_EQ, safe_mem_is_zero("", 0)); - tt_int_op(1, OP_EQ, safe_mem_is_zero("", 1)); - tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 1)); - tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 2)); - tt_int_op(0, OP_EQ, safe_mem_is_zero("\0a", 2)); - tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0a", 2)); - tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8)); - tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8)); - tt_int_op(0, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9)); - - done: - ; -} - -static void -test_util_di_map(void *arg) -{ - (void)arg; - di_digest256_map_t *dimap = NULL; - uint8_t key1[] = "Robert Anton Wilson "; - uint8_t key2[] = "Martin Gardner, _Fads&fallacies"; - uint8_t key3[] = "Tom Lehrer, _Be Prepared_. "; - uint8_t key4[] = "Ursula Le Guin,_A Wizard of... "; - - char dflt_entry[] = "'You have made a good beginning', but no more"; - - tt_int_op(32, OP_EQ, sizeof(key1)); - tt_int_op(32, OP_EQ, sizeof(key2)); - tt_int_op(32, OP_EQ, sizeof(key3)); - - tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key1, dflt_entry)); - - char *str1 = tor_strdup("You are precisely as big as what you love" - " and precisely as small as what you allow" - " to annoy you."); - char *str2 = tor_strdup("Let us hope that Lysenko's success in Russia will" - " serve for many generations to come as another" - " reminder to the world of how quickly and easily" - " a science can be corrupted when ignorant" - " political leaders deem themselves competent" - " to arbitrate scientific disputes"); - char *str3 = tor_strdup("Don't write naughty words on walls " - "if you can't spell."); - - dimap_add_entry(&dimap, key1, str1); - dimap_add_entry(&dimap, key2, str2); - dimap_add_entry(&dimap, key3, str3); - - tt_ptr_op(str1, OP_EQ, dimap_search(dimap, key1, dflt_entry)); - tt_ptr_op(str3, OP_EQ, dimap_search(dimap, key3, dflt_entry)); - tt_ptr_op(str2, OP_EQ, dimap_search(dimap, key2, dflt_entry)); - tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key4, dflt_entry)); - - done: - dimap_free(dimap, tor_free_); -} - -/** - * Test counting high bits - */ -static void -test_util_n_bits_set(void *ptr) -{ - (void)ptr; - tt_int_op(0,OP_EQ, n_bits_set_u8(0)); - tt_int_op(1,OP_EQ, n_bits_set_u8(1)); - tt_int_op(3,OP_EQ, n_bits_set_u8(7)); - tt_int_op(1,OP_EQ, n_bits_set_u8(8)); - tt_int_op(2,OP_EQ, n_bits_set_u8(129)); - tt_int_op(8,OP_EQ, n_bits_set_u8(255)); - done: - ; -} - -/** - * Test LHS whitespace (and comment) eater - */ -static void -test_util_eat_whitespace(void *ptr) -{ - const char ws[] = { ' ', '\t', '\r' }; /* Except NL */ - char str[80]; - size_t i; - - (void)ptr; - - /* Try one leading ws */ - strlcpy(str, "fuubaar", sizeof(str)); - for (i = 0; i < sizeof(ws); ++i) { - str[0] = ws[i]; - tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - } - str[0] = '\n'; - tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Empty string */ - strlcpy(str, "", sizeof(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_eos(str, str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str)); - - /* Only ws */ - strlcpy(str, " \t\r\n", sizeof(str)); - tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),OP_EQ, - eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + strlen(str) - 1,OP_EQ, - eat_whitespace_no_nl(str)); - tt_ptr_op(str + strlen(str) - 1,OP_EQ, - eat_whitespace_eos_no_nl(str, str + strlen(str))); - - strlcpy(str, " \t\r ", sizeof(str)); - tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),OP_EQ, - eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + strlen(str),OP_EQ, - eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Multiple ws */ - strlcpy(str, "fuubaar", sizeof(str)); - for (i = 0; i < sizeof(ws); ++i) - str[i] = ws[i]; - tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + sizeof(ws),OP_EQ, - eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + sizeof(ws),OP_EQ, - eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Eat comment */ - strlcpy(str, "# Comment \n No Comment", sizeof(str)); - tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); - tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Eat comment & ws mix */ - strlcpy(str, " # \t Comment \n\t\nNo Comment", sizeof(str)); - tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); - tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Eat entire comment */ - strlcpy(str, "#Comment", sizeof(str)); - tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),OP_EQ, - eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - - /* Blank line, then comment */ - strlcpy(str, " \t\n # Comment", sizeof(str)); - tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),OP_EQ, - eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 2,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 2,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); - - done: - ; -} - -/** Return a newly allocated smartlist containing the lines of text in - * lines. The returned strings are heap-allocated, and must be - * freed by the caller. - * - * XXXX? Move to container.[hc] ? */ -static smartlist_t * -smartlist_new_from_text_lines(const char *lines) -{ - smartlist_t *sl = smartlist_new(); - char *last_line; - - smartlist_split_string(sl, lines, "\n", 0, 0); - - last_line = smartlist_pop_last(sl); - if (last_line != NULL && *last_line != '\0') { - smartlist_add(sl, last_line); - } else { - tor_free(last_line); - } - - return sl; -} - -/** Test smartlist_new_from_text_lines */ -static void -test_util_sl_new_from_text_lines(void *ptr) -{ - (void)ptr; - - { /* Normal usage */ - smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz\n"); - int sl_len = smartlist_len(sl); - - tt_want_int_op(sl_len, OP_EQ, 3); - - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); - if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); - if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); - - SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); - smartlist_free(sl); - } - - { /* No final newline */ - smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz"); - int sl_len = smartlist_len(sl); - - tt_want_int_op(sl_len, OP_EQ, 3); - - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); - if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); - if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); - - SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); - smartlist_free(sl); - } - - { /* No newlines */ - smartlist_t *sl = smartlist_new_from_text_lines("foo"); - int sl_len = smartlist_len(sl); - - tt_want_int_op(sl_len, OP_EQ, 1); - - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); - - SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); - smartlist_free(sl); - } - - { /* No text at all */ - smartlist_t *sl = smartlist_new_from_text_lines(""); - int sl_len = smartlist_len(sl); - - tt_want_int_op(sl_len, OP_EQ, 0); - - SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); - smartlist_free(sl); - } -} - -static void -test_util_envnames(void *ptr) -{ - (void) ptr; - - tt_assert(environment_variable_names_equal("abc", "abc")); - tt_assert(environment_variable_names_equal("abc", "abc=")); - tt_assert(environment_variable_names_equal("abc", "abc=def")); - tt_assert(environment_variable_names_equal("abc=def", "abc")); - tt_assert(environment_variable_names_equal("abc=def", "abc=ghi")); - - tt_assert(environment_variable_names_equal("abc", "abc")); - tt_assert(environment_variable_names_equal("abc", "abc=")); - tt_assert(environment_variable_names_equal("abc", "abc=def")); - tt_assert(environment_variable_names_equal("abc=def", "abc")); - tt_assert(environment_variable_names_equal("abc=def", "abc=ghi")); - - tt_assert(!environment_variable_names_equal("abc", "abcd")); - tt_assert(!environment_variable_names_equal("abc=", "abcd")); - tt_assert(!environment_variable_names_equal("abc=", "abcd")); - tt_assert(!environment_variable_names_equal("abc=", "def")); - tt_assert(!environment_variable_names_equal("abc=", "def=")); - tt_assert(!environment_variable_names_equal("abc=x", "def=x")); - - tt_assert(!environment_variable_names_equal("", "a=def")); - /* A bit surprising. */ - tt_assert(environment_variable_names_equal("", "=def")); - tt_assert(environment_variable_names_equal("=y", "=x")); - - done: - ; -} - -/** Test process_environment_make */ -static void -test_util_make_environment(void *ptr) -{ - const char *env_vars_string = - "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" - "HOME=/home/foozer\n"; - const char expected_windows_env_block[] = - "HOME=/home/foozer\000" - "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\000" - "\000"; - size_t expected_windows_env_block_len = - sizeof(expected_windows_env_block) - 1; - - smartlist_t *env_vars = smartlist_new_from_text_lines(env_vars_string); - smartlist_t *env_vars_sorted = smartlist_new(); - smartlist_t *env_vars_in_unixoid_env_block_sorted = smartlist_new(); - - process_environment_t *env; - - (void)ptr; - - env = process_environment_make(env_vars); - - /* Check that the Windows environment block is correct. */ - tt_want(tor_memeq(expected_windows_env_block, env->windows_environment_block, - expected_windows_env_block_len)); - - /* Now for the Unixoid environment block. We don't care which order - * these environment variables are in, so we sort both lists first. */ - - smartlist_add_all(env_vars_sorted, env_vars); - - { - char **v; - for (v = env->unixoid_environment_block; *v; ++v) { - smartlist_add(env_vars_in_unixoid_env_block_sorted, *v); - } - } - - smartlist_sort_strings(env_vars_sorted); - smartlist_sort_strings(env_vars_in_unixoid_env_block_sorted); - - tt_want_int_op(smartlist_len(env_vars_sorted), OP_EQ, - smartlist_len(env_vars_in_unixoid_env_block_sorted)); - { - int len = smartlist_len(env_vars_sorted); - int i; - - if (smartlist_len(env_vars_in_unixoid_env_block_sorted) < len) { - len = smartlist_len(env_vars_in_unixoid_env_block_sorted); - } - - for (i = 0; i < len; ++i) { - tt_want_str_op(smartlist_get(env_vars_sorted, i), OP_EQ, - smartlist_get(env_vars_in_unixoid_env_block_sorted, i)); - } - } - - /* Clean up. */ - smartlist_free(env_vars_in_unixoid_env_block_sorted); - smartlist_free(env_vars_sorted); - - SMARTLIST_FOREACH(env_vars, char *, x, tor_free(x)); - smartlist_free(env_vars); - - process_environment_free(env); -} - -/** Test set_environment_variable_in_smartlist */ -static void -test_util_set_env_var_in_sl(void *ptr) -{ - /* The environment variables in these strings are in arbitrary - * order; we sort the resulting lists before comparing them. - * - * (They *will not* end up in the order shown in - * expected_resulting_env_vars_string.) */ - - const char *base_env_vars_string = - "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" - "HOME=/home/foozer\n" - "TERM=xterm\n" - "SHELL=/bin/ksh\n" - "USER=foozer\n" - "LOGNAME=foozer\n" - "USERNAME=foozer\n" - "LANG=en_US.utf8\n" - ; - - const char *new_env_vars_string = - "TERM=putty\n" - "DISPLAY=:18.0\n" - ; - - const char *expected_resulting_env_vars_string = - "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin\n" - "HOME=/home/foozer\n" - "TERM=putty\n" - "SHELL=/bin/ksh\n" - "USER=foozer\n" - "LOGNAME=foozer\n" - "USERNAME=foozer\n" - "LANG=en_US.utf8\n" - "DISPLAY=:18.0\n" - ; - - smartlist_t *merged_env_vars = - smartlist_new_from_text_lines(base_env_vars_string); - smartlist_t *new_env_vars = - smartlist_new_from_text_lines(new_env_vars_string); - smartlist_t *expected_resulting_env_vars = - smartlist_new_from_text_lines(expected_resulting_env_vars_string); - - /* Elements of merged_env_vars are heap-allocated, and must be - * freed. Some of them are (or should) be freed by - * set_environment_variable_in_smartlist. - * - * Elements of new_env_vars are heap-allocated, but are copied into - * merged_env_vars, so they are not freed separately at the end of - * the function. - * - * Elements of expected_resulting_env_vars are heap-allocated, and - * must be freed. */ - - (void)ptr; - - SMARTLIST_FOREACH(new_env_vars, char *, env_var, - set_environment_variable_in_smartlist(merged_env_vars, - env_var, - tor_free_, - 1)); - - smartlist_sort_strings(merged_env_vars); - smartlist_sort_strings(expected_resulting_env_vars); - - tt_want_int_op(smartlist_len(merged_env_vars), OP_EQ, - smartlist_len(expected_resulting_env_vars)); - { - int len = smartlist_len(merged_env_vars); - int i; - - if (smartlist_len(expected_resulting_env_vars) < len) { - len = smartlist_len(expected_resulting_env_vars); - } - - for (i = 0; i < len; ++i) { - tt_want_str_op(smartlist_get(merged_env_vars, i), OP_EQ, - smartlist_get(expected_resulting_env_vars, i)); - } - } - - /* Clean up. */ - SMARTLIST_FOREACH(merged_env_vars, char *, x, tor_free(x)); - smartlist_free(merged_env_vars); - - smartlist_free(new_env_vars); - - SMARTLIST_FOREACH(expected_resulting_env_vars, char *, x, tor_free(x)); - smartlist_free(expected_resulting_env_vars); -} - -static void -test_util_weak_random(void *arg) -{ - int i, j, n[16]; - tor_weak_rng_t rng; - (void) arg; - - tor_init_weak_random(&rng, (unsigned)time(NULL)); - - for (i = 1; i <= 256; ++i) { - for (j=0;j<100;++j) { - int r = tor_weak_random_range(&rng, i); - tt_int_op(0, OP_LE, r); - tt_int_op(r, OP_LT, i); - } - } - - memset(n,0,sizeof(n)); - for (j=0;j<8192;++j) { - n[tor_weak_random_range(&rng, 16)]++; - } - - for (i=0;i<16;++i) - tt_int_op(n[i], OP_GT, 0); - done: - ; -} - -static void -test_util_mathlog(void *arg) -{ - double d; - (void) arg; - - d = tor_mathlog(2.718281828); - tt_double_op(fabs(d - 1.0), OP_LT, .000001); - d = tor_mathlog(10); - tt_double_op(fabs(d - 2.30258509), OP_LT, .000001); - done: - ; -} - -static void -test_util_fraction(void *arg) -{ - uint64_t a,b; - (void)arg; - - a = 99; b = 30; - simplify_fraction64(&a,&b); - tt_u64_op(a, OP_EQ, 33); - tt_u64_op(b, OP_EQ, 10); - - a = 3000000; b = 10000000; - simplify_fraction64(&a,&b); - tt_u64_op(a, OP_EQ, 3); - tt_u64_op(b, OP_EQ, 10); - - a = 0; b = 15; - simplify_fraction64(&a,&b); - tt_u64_op(a, OP_EQ, 0); - tt_u64_op(b, OP_EQ, 1); - - done: - ; -} - -static void -test_util_round_to_next_multiple_of(void *arg) -{ - (void)arg; - - tt_u64_op(round_uint64_to_next_multiple_of(0,1), OP_EQ, 0); - tt_u64_op(round_uint64_to_next_multiple_of(0,7), OP_EQ, 0); - - tt_u64_op(round_uint64_to_next_multiple_of(99,1), OP_EQ, 99); - tt_u64_op(round_uint64_to_next_multiple_of(99,7), OP_EQ, 105); - tt_u64_op(round_uint64_to_next_multiple_of(99,9), OP_EQ, 99); - - tt_u64_op(round_uint64_to_next_multiple_of(UINT64_MAX,2), OP_EQ, - UINT64_MAX); - - tt_int_op(round_uint32_to_next_multiple_of(0,1), OP_EQ, 0); - tt_int_op(round_uint32_to_next_multiple_of(0,7), OP_EQ, 0); - - tt_int_op(round_uint32_to_next_multiple_of(99,1), OP_EQ, 99); - tt_int_op(round_uint32_to_next_multiple_of(99,7), OP_EQ, 105); - tt_int_op(round_uint32_to_next_multiple_of(99,9), OP_EQ, 99); - - tt_int_op(round_uint32_to_next_multiple_of(UINT32_MAX,2), OP_EQ, - UINT32_MAX); - - tt_uint_op(round_to_next_multiple_of(0,1), OP_EQ, 0); - tt_uint_op(round_to_next_multiple_of(0,7), OP_EQ, 0); - - tt_uint_op(round_to_next_multiple_of(99,1), OP_EQ, 99); - tt_uint_op(round_to_next_multiple_of(99,7), OP_EQ, 105); - tt_uint_op(round_to_next_multiple_of(99,9), OP_EQ, 99); - - tt_uint_op(round_to_next_multiple_of(UINT_MAX,2), OP_EQ, - UINT_MAX); - done: - ; -} - -static void -test_util_laplace(void *arg) -{ - /* Sample values produced using Python's SciPy: - * - * >>> from scipy.stats import laplace - * >>> laplace.ppf([-0.01, 0.0, 0.01, 0.5, 0.51, 0.99, 1.0, 1.01], - ... loc = 24, scale = 24) - * array([ nan, -inf, -69.88855213, 24. , - * 24.48486498, 117.88855213, inf, nan]) - */ - const double mu = 24.0, b = 24.0; - const double delta_f = 15.0, epsilon = 0.3; /* b = 15.0 / 0.3 = 50.0 */ - (void)arg; - - tt_i64_op(INT64_MIN, OP_EQ, sample_laplace_distribution(mu, b, 0.0)); - tt_i64_op(-69, OP_EQ, sample_laplace_distribution(mu, b, 0.01)); - tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.5)); - tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.51)); - tt_i64_op(117, OP_EQ, sample_laplace_distribution(mu, b, 0.99)); - - /* >>> laplace.ppf([0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99], - * ... loc = 0, scale = 50) - * array([ -inf, -80.47189562, -34.65735903, 0. , - * 34.65735903, 80.47189562, 195.60115027]) - */ - tt_i64_op(INT64_MIN + 20, OP_EQ, - add_laplace_noise(20, 0.0, delta_f, epsilon)); - - tt_i64_op(-60, OP_EQ, add_laplace_noise(20, 0.1, delta_f, epsilon)); - tt_i64_op(-14, OP_EQ, add_laplace_noise(20, 0.25, delta_f, epsilon)); - tt_i64_op(20, OP_EQ, add_laplace_noise(20, 0.5, delta_f, epsilon)); - tt_i64_op(54, OP_EQ, add_laplace_noise(20, 0.75, delta_f, epsilon)); - tt_i64_op(100, OP_EQ, add_laplace_noise(20, 0.9, delta_f, epsilon)); - tt_i64_op(215, OP_EQ, add_laplace_noise(20, 0.99, delta_f, epsilon)); - - /* Test extreme values of signal with maximally negative values of noise - * 1.0000000000000002 is the smallest number > 1 - * 0.0000000000000002 is the double epsilon (error when calculating near 1) - * this is approximately 1/(2^52) - * per https://en.wikipedia.org/wiki/Double_precision - * (let's not descend into the world of subnormals) - * >>> laplace.ppf([0, 0.0000000000000002], loc = 0, scale = 1) - * array([ -inf, -35.45506713]) - */ - const double noscale_df = 1.0, noscale_eps = 1.0; - - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(0, 0.0, noscale_df, noscale_eps)); - - /* is it clipped to INT64_MIN? */ - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(-1, 0.0, noscale_df, noscale_eps)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(INT64_MIN, 0.0, - noscale_df, noscale_eps)); - /* ... even when scaled? */ - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(0, 0.0, delta_f, epsilon)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(0, 0.0, - DBL_MAX, 1)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(INT64_MIN, 0.0, - DBL_MAX, 1)); - - /* does it play nice with INT64_MAX? */ - tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ, - add_laplace_noise(INT64_MAX, 0.0, - noscale_df, noscale_eps)); - - /* do near-zero fractional values work? */ - const double min_dbl_error = 0.0000000000000002; - - tt_i64_op(-35, OP_EQ, - add_laplace_noise(0, min_dbl_error, - noscale_df, noscale_eps)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(INT64_MIN, min_dbl_error, - noscale_df, noscale_eps)); - tt_i64_op((-35 + INT64_MAX), OP_EQ, - add_laplace_noise(INT64_MAX, min_dbl_error, - noscale_df, noscale_eps)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(0, min_dbl_error, - DBL_MAX, 1)); - tt_i64_op((INT64_MAX + INT64_MIN), OP_EQ, - add_laplace_noise(INT64_MAX, min_dbl_error, - DBL_MAX, 1)); - tt_i64_op(INT64_MIN, OP_EQ, - add_laplace_noise(INT64_MIN, min_dbl_error, - DBL_MAX, 1)); - - /* does it play nice with INT64_MAX? */ - tt_i64_op((INT64_MAX - 35), OP_EQ, - add_laplace_noise(INT64_MAX, min_dbl_error, - noscale_df, noscale_eps)); - - /* Test extreme values of signal with maximally positive values of noise - * 1.0000000000000002 is the smallest number > 1 - * 0.9999999999999998 is the greatest number < 1 by calculation - * per https://en.wikipedia.org/wiki/Double_precision - * >>> laplace.ppf([1.0, 0.9999999999999998], loc = 0, scale = 1) - * array([inf, 35.35050621]) - * but the function rejects p == 1.0, so we just use max_dbl_lt_one - */ - const double max_dbl_lt_one = 0.9999999999999998; - - /* do near-one fractional values work? */ - tt_i64_op(35, OP_EQ, - add_laplace_noise(0, max_dbl_lt_one, noscale_df, noscale_eps)); - - /* is it clipped to INT64_MAX? */ - tt_i64_op(INT64_MAX, OP_EQ, - add_laplace_noise(INT64_MAX - 35, max_dbl_lt_one, - noscale_df, noscale_eps)); - tt_i64_op(INT64_MAX, OP_EQ, - add_laplace_noise(INT64_MAX - 34, max_dbl_lt_one, - noscale_df, noscale_eps)); - tt_i64_op(INT64_MAX, OP_EQ, - add_laplace_noise(INT64_MAX, max_dbl_lt_one, - noscale_df, noscale_eps)); - /* ... even when scaled? */ - tt_i64_op(INT64_MAX, OP_EQ, - add_laplace_noise(INT64_MAX, max_dbl_lt_one, - delta_f, epsilon)); - tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ, - add_laplace_noise(INT64_MIN, max_dbl_lt_one, - DBL_MAX, 1)); - tt_i64_op(INT64_MAX, OP_EQ, - add_laplace_noise(INT64_MAX, max_dbl_lt_one, - DBL_MAX, 1)); - /* does it play nice with INT64_MIN? */ - tt_i64_op((INT64_MIN + 35), OP_EQ, - add_laplace_noise(INT64_MIN, max_dbl_lt_one, - noscale_df, noscale_eps)); - - done: - ; -} - -static void -test_util_clamp_double_to_int64(void *arg) -{ - (void)arg; - - tt_i64_op(INT64_MIN, OP_EQ, clamp_double_to_int64(-INFINITY_DBL)); - tt_i64_op(INT64_MIN, OP_EQ, - clamp_double_to_int64(-1.0 * pow(2.0, 64.0) - 1.0)); - tt_i64_op(INT64_MIN, OP_EQ, - clamp_double_to_int64(-1.0 * pow(2.0, 63.0) - 1.0)); - tt_i64_op(((uint64_t) -1) << 53, OP_EQ, - clamp_double_to_int64(-1.0 * pow(2.0, 53.0))); - tt_i64_op((((uint64_t) -1) << 53) + 1, OP_EQ, - clamp_double_to_int64(-1.0 * pow(2.0, 53.0) + 1.0)); - tt_i64_op(-1, OP_EQ, clamp_double_to_int64(-1.0)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.9)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.1)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.0)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(NAN_DBL)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.1)); - tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.9)); - tt_i64_op(1, OP_EQ, clamp_double_to_int64(1.0)); - tt_i64_op((((int64_t) 1) << 53) - 1, OP_EQ, - clamp_double_to_int64(pow(2.0, 53.0) - 1.0)); - tt_i64_op(((int64_t) 1) << 53, OP_EQ, - clamp_double_to_int64(pow(2.0, 53.0))); - tt_i64_op(INT64_MAX, OP_EQ, - clamp_double_to_int64(pow(2.0, 63.0))); - tt_i64_op(INT64_MAX, OP_EQ, - clamp_double_to_int64(pow(2.0, 64.0))); - tt_i64_op(INT64_MAX, OP_EQ, clamp_double_to_int64(INFINITY_DBL)); - - done: - ; -} - -#ifdef FD_CLOEXEC -#define CAN_CHECK_CLOEXEC -static int -fd_is_cloexec(tor_socket_t fd) -{ - int flags = fcntl(fd, F_GETFD, 0); - return (flags & FD_CLOEXEC) == FD_CLOEXEC; -} -#endif /* defined(FD_CLOEXEC) */ - -#ifndef _WIN32 -#define CAN_CHECK_NONBLOCK -static int -fd_is_nonblocking(tor_socket_t fd) -{ - int flags = fcntl(fd, F_GETFL, 0); - return (flags & O_NONBLOCK) == O_NONBLOCK; -} -#endif /* !defined(_WIN32) */ - -#define ERRNO_IS_EPROTO(e) (e == SOCK_ERRNO(EPROTONOSUPPORT)) -#define SOCK_ERR_IS_EPROTO(s) ERRNO_IS_EPROTO(tor_socket_errno(s)) - -/* Test for tor_open_socket*, using IPv4 or IPv6 depending on arg. */ -static void -test_util_socket(void *arg) -{ - const int domain = !strcmp(arg, "4") ? AF_INET : AF_INET6; - tor_socket_t fd1 = TOR_INVALID_SOCKET; - tor_socket_t fd2 = TOR_INVALID_SOCKET; - tor_socket_t fd3 = TOR_INVALID_SOCKET; - tor_socket_t fd4 = TOR_INVALID_SOCKET; - int n = get_n_open_sockets(); - - TT_BLATHER(("Starting with %d open sockets.", n)); - - (void)arg; - - fd1 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 0, 0); - int err = tor_socket_errno(fd1); - if (fd1 < 0 && (err == SOCK_ERRNO(EPROTONOSUPPORT) || - err == SOCK_ERRNO(EAFNOSUPPORT))) { - /* Assume we're on an IPv4-only or IPv6-only system, and give up now. */ - goto done; - } - fd2 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 0, 1); - tt_assert(SOCKET_OK(fd1)); - tt_assert(SOCKET_OK(fd2)); - tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); - //fd3 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 1, 0); - //fd4 = tor_open_socket_with_extensions(domain, SOCK_STREAM, 0, 1, 1); - fd3 = tor_open_socket(domain, SOCK_STREAM, 0); - fd4 = tor_open_socket_nonblocking(domain, SOCK_STREAM, 0); - tt_assert(SOCKET_OK(fd3)); - tt_assert(SOCKET_OK(fd4)); - tt_int_op(get_n_open_sockets(), OP_EQ, n + 4); - -#ifdef CAN_CHECK_CLOEXEC - tt_int_op(fd_is_cloexec(fd1), OP_EQ, 0); - tt_int_op(fd_is_cloexec(fd2), OP_EQ, 0); - tt_int_op(fd_is_cloexec(fd3), OP_EQ, 1); - tt_int_op(fd_is_cloexec(fd4), OP_EQ, 1); -#endif /* defined(CAN_CHECK_CLOEXEC) */ -#ifdef CAN_CHECK_NONBLOCK - tt_int_op(fd_is_nonblocking(fd1), OP_EQ, 0); - tt_int_op(fd_is_nonblocking(fd2), OP_EQ, 1); - tt_int_op(fd_is_nonblocking(fd3), OP_EQ, 0); - tt_int_op(fd_is_nonblocking(fd4), OP_EQ, 1); -#endif /* defined(CAN_CHECK_NONBLOCK) */ - - tor_assert(tor_close_socket == tor_close_socket__real); - - /* we use close_socket__real here so that coverity can tell that we are - * really closing these sockets. */ - tor_close_socket__real(fd1); - tor_close_socket__real(fd2); - fd1 = fd2 = TOR_INVALID_SOCKET; - tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); - tor_close_socket__real(fd3); - tor_close_socket__real(fd4); - fd3 = fd4 = TOR_INVALID_SOCKET; - tt_int_op(get_n_open_sockets(), OP_EQ, n); - - done: - if (SOCKET_OK(fd1)) - tor_close_socket__real(fd1); - if (SOCKET_OK(fd2)) - tor_close_socket__real(fd2); - if (SOCKET_OK(fd3)) - tor_close_socket__real(fd3); - if (SOCKET_OK(fd4)) - tor_close_socket__real(fd4); -} - -#if 0 -static int -is_there_a_localhost(int family) -{ - tor_socket_t s; - s = tor_open_socket(family, SOCK_STREAM, IPPROTO_TCP); - tor_assert(SOCKET_OK(s)); - - int result = 0; - if (family == AF_INET) { - struct sockaddr_in s_in; - memset(&s_in, 0, sizeof(s_in)); - s_in.sin_family = AF_INET; - s_in.sin_addr.s_addr = htonl(0x7f000001); - s_in.sin_port = 0; - - if (bind(s, (void*)&s_in, sizeof(s_in)) == 0) { - result = 1; - } - } else if (family == AF_INET6) { - struct sockaddr_in6 sin6; - memset(&sin6, 0, sizeof(sin6)); - sin6.sin6_family = AF_INET6; - sin6.sin6_addr.s6_addr[15] = 1; - sin6.sin6_port = 0; - } - tor_close_socket(s); - - return result; -} -#endif /* 0 */ - -/* Test for socketpair and ersatz_socketpair(). We test them both, since - * the latter is a tolerably good way to exersize tor_accept_socket(). */ -static void -test_util_socketpair(void *arg) -{ - const int ersatz = !strcmp(arg, "1"); - int (*const tor_socketpair_fn)(int, int, int, tor_socket_t[2]) = - ersatz ? tor_ersatz_socketpair : tor_socketpair; - int n = get_n_open_sockets(); - tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET}; - const int family = AF_UNIX; - int socketpair_result = 0; - - socketpair_result = tor_socketpair_fn(family, SOCK_STREAM, 0, fds); - -#ifdef __FreeBSD__ - /* If there is no 127.0.0.1, tor_ersatz_socketpair will and must fail. - * Otherwise, we risk exposing a socketpair on a routable IP address. (Some - * BSD jails use a routable address for localhost. Fortunately, they have - * the real AF_UNIX socketpair.) */ - if (ersatz && socketpair_result < 0) { - /* In my testing, an IPv6-only FreeBSD jail without ::1 returned EINVAL. - * Assume we're on a machine without 127.0.0.1 or ::1 and give up now. */ - tt_skip(); - } -#endif /* defined(__FreeBSD__) */ - tt_int_op(0, OP_EQ, socketpair_result); - - tt_assert(SOCKET_OK(fds[0])); - tt_assert(SOCKET_OK(fds[1])); - tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); -#ifdef CAN_CHECK_CLOEXEC - tt_int_op(fd_is_cloexec(fds[0]), OP_EQ, 1); - tt_int_op(fd_is_cloexec(fds[1]), OP_EQ, 1); -#endif -#ifdef CAN_CHECK_NONBLOCK - tt_int_op(fd_is_nonblocking(fds[0]), OP_EQ, 0); - tt_int_op(fd_is_nonblocking(fds[1]), OP_EQ, 0); -#endif - - done: - if (SOCKET_OK(fds[0])) - tor_close_socket(fds[0]); - if (SOCKET_OK(fds[1])) - tor_close_socket(fds[1]); -} - -#undef SOCKET_EPROTO - -static void -test_util_max_mem(void *arg) -{ - size_t memory1, memory2; - int r, r2; - (void) arg; - - r = get_total_system_memory(&memory1); - r2 = get_total_system_memory(&memory2); - tt_int_op(r, OP_EQ, r2); - tt_uint_op(memory2, OP_EQ, memory1); - - TT_BLATHER(("System memory: "U64_FORMAT, U64_PRINTF_ARG(memory1))); - - if (r==0) { - /* You have at least a megabyte. */ - tt_uint_op(memory1, OP_GT, (1<<20)); - } else { - /* You do not have a petabyte. */ -#if SIZEOF_SIZE_T == SIZEOF_UINT64_T - tt_u64_op(memory1, OP_LT, (U64_LITERAL(1)<<50)); -#endif - } - - done: - ; -} - -static void -test_util_hostname_validation(void *arg) -{ - (void)arg; - - // Lets try valid hostnames first. - tt_assert(string_is_valid_hostname("torproject.org")); - tt_assert(string_is_valid_hostname("ocw.mit.edu")); - tt_assert(string_is_valid_hostname("i.4cdn.org")); - tt_assert(string_is_valid_hostname("stanford.edu")); - tt_assert(string_is_valid_hostname("multiple-words-with-hypens.jp")); - - // Subdomain name cannot start with '-' or '_'. - tt_assert(!string_is_valid_hostname("-torproject.org")); - tt_assert(!string_is_valid_hostname("subdomain.-domain.org")); - tt_assert(!string_is_valid_hostname("-subdomain.domain.org")); - tt_assert(!string_is_valid_hostname("___abc.org")); - - // Hostnames cannot contain non-alphanumeric characters. - tt_assert(!string_is_valid_hostname("%%domain.\\org.")); - tt_assert(!string_is_valid_hostname("***x.net")); - tt_assert(!string_is_valid_hostname("\xff\xffxyz.org")); - tt_assert(!string_is_valid_hostname("word1 word2.net")); - - // Test workaround for nytimes.com stupidity, technically invalid, - // but we allow it since they are big, even though they are failing to - // comply with a ~30 year old standard. - tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com")); - - // Firefox passes FQDNs with trailing '.'s directly to the SOCKS proxy, - // which is redundant since the spec states DOMAINNAME addresses are fully - // qualified. While unusual, this should be tollerated. - tt_assert(string_is_valid_hostname("core9_euw1.fabrik.nytimes.com.")); - tt_assert(!string_is_valid_hostname("..washingtonpost.is.better.com")); - tt_assert(!string_is_valid_hostname("so.is..ft.com")); - tt_assert(!string_is_valid_hostname("...")); - - // XXX: do we allow single-label DNS names? - // We shouldn't for SOCKS (spec says "contains a fully-qualified domain name" - // but only test pathologically malformed traling '.' cases for now. - tt_assert(!string_is_valid_hostname(".")); - tt_assert(!string_is_valid_hostname("..")); - - done: - return; -} - -static void -test_util_ipv4_validation(void *arg) -{ - (void)arg; - - tt_assert(string_is_valid_ipv4_address("192.168.0.1")); - tt_assert(string_is_valid_ipv4_address("8.8.8.8")); - - tt_assert(!string_is_valid_ipv4_address("abcd")); - tt_assert(!string_is_valid_ipv4_address("300.300.300.300")); - tt_assert(!string_is_valid_ipv4_address("8.8.")); - - done: - return; -} - -static void -test_util_writepid(void *arg) -{ - (void) arg; - - char *contents = NULL; - const char *fname = get_fname("tmp_pid"); - unsigned long pid; - char c; - - write_pidfile(fname); - - contents = read_file_to_str(fname, 0, NULL); - tt_assert(contents); - - int n = tor_sscanf(contents, "%lu\n%c", &pid, &c); - tt_int_op(n, OP_EQ, 1); - -#ifdef _WIN32 - tt_uint_op(pid, OP_EQ, _getpid()); -#else - tt_uint_op(pid, OP_EQ, getpid()); -#endif - - done: - tor_free(contents); -} - -static void -test_util_get_avail_disk_space(void *arg) -{ - (void) arg; - int64_t val; - - /* No answer for nonexistent directory */ - val = tor_get_avail_disk_space("/akljasdfklsajdklasjkldjsa"); - tt_i64_op(val, OP_EQ, -1); - - /* Try the current directory */ - val = tor_get_avail_disk_space("."); - -#if !defined(HAVE_STATVFS) && !defined(_WIN32) - tt_i64_op(val, OP_EQ, -1); /* You don't have an implementation for this */ -#else - tt_i64_op(val, OP_GT, 0); /* You have some space. */ - tt_i64_op(val, OP_LT, ((int64_t)1)<<56); /* You don't have a zebibyte */ -#endif /* !defined(HAVE_STATVFS) && !defined(_WIN32) */ - - done: - ; -} - -static void -test_util_touch_file(void *arg) -{ - (void) arg; - const char *fname = get_fname("touch"); - - const time_t now = time(NULL); - struct stat st; - write_bytes_to_file(fname, "abc", 3, 1); - tt_int_op(0, OP_EQ, stat(fname, &st)); - /* A subtle point: the filesystem time is not necessarily equal to the - * system clock time, since one can be using a monotonic clock, or coarse - * monotonic clock, or whatever. So we might wind up with an mtime a few - * microseconds ago. Let's just give it a lot of wiggle room. */ - tt_i64_op(st.st_mtime, OP_GE, now - 1); - - const time_t five_sec_ago = now - 5; - struct utimbuf u = { five_sec_ago, five_sec_ago }; - tt_int_op(0, OP_EQ, utime(fname, &u)); - tt_int_op(0, OP_EQ, stat(fname, &st)); - /* Let's hope that utime/stat give the same second as a round-trip? */ - tt_i64_op(st.st_mtime, OP_EQ, five_sec_ago); - - /* Finally we can touch the file */ - tt_int_op(0, OP_EQ, touch_file(fname)); - tt_int_op(0, OP_EQ, stat(fname, &st)); - tt_i64_op(st.st_mtime, OP_GE, now-1); - - done: - ; -} - -#ifndef _WIN32 -static void -test_util_pwdb(void *arg) -{ - (void) arg; - const struct passwd *me = NULL, *me2, *me3; - char *name = NULL; - char *dir = NULL; - - /* Uncached case. */ - /* Let's assume that we exist. */ - me = tor_getpwuid(getuid()); - tt_ptr_op(me, OP_NE, NULL); - name = tor_strdup(me->pw_name); - - /* Uncached case */ - me2 = tor_getpwnam(name); - tt_ptr_op(me2, OP_NE, NULL); - tt_int_op(me2->pw_uid, OP_EQ, getuid()); - - /* Cached case */ - me3 = tor_getpwuid(getuid()); - tt_ptr_op(me3, OP_NE, NULL); - tt_str_op(me3->pw_name, OP_EQ, name); - - me3 = tor_getpwnam(name); - tt_ptr_op(me3, OP_NE, NULL); - tt_int_op(me3->pw_uid, OP_EQ, getuid()); - - dir = get_user_homedir(name); - tt_ptr_op(dir, OP_NE, NULL); - - /* Try failing cases. First find a user that doesn't exist by name */ - char randbytes[4]; - char badname[9]; - int i, found=0; - for (i = 0; i < 100; ++i) { - crypto_rand(randbytes, sizeof(randbytes)); - base16_encode(badname, sizeof(badname), randbytes, sizeof(randbytes)); - if (tor_getpwnam(badname) == NULL) { - found = 1; - break; - } - } - tt_assert(found); - tor_free(dir); - - /* We should do a LOG_ERR */ - setup_full_capture_of_logs(LOG_ERR); - dir = get_user_homedir(badname); - tt_ptr_op(dir, OP_EQ, NULL); - expect_log_msg_containing("not found"); - tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1); - teardown_capture_of_logs(); - - /* Now try to find a user that doesn't exist by ID. */ - found = 0; - for (i = 0; i < 1000; ++i) { - uid_t u; - crypto_rand((char*)&u, sizeof(u)); - if (tor_getpwuid(u) == NULL) { - found = 1; - break; - } - } - tt_assert(found); - - done: - tor_free(name); - tor_free(dir); - teardown_capture_of_logs(); -} -#endif /* !defined(_WIN32) */ - -static void -test_util_calloc_check(void *arg) -{ - (void) arg; - /* Easy cases that are good. */ - tt_assert(size_mul_check(0,0)); - tt_assert(size_mul_check(0,100)); - tt_assert(size_mul_check(100,0)); - tt_assert(size_mul_check(100,100)); - - /* Harder cases that are still good. */ - tt_assert(size_mul_check(SIZE_MAX, 1)); - tt_assert(size_mul_check(1, SIZE_MAX)); - tt_assert(size_mul_check(SIZE_MAX / 10, 9)); - tt_assert(size_mul_check(11, SIZE_MAX / 12)); - const size_t sqrt_size_max_p1 = ((size_t)1) << (sizeof(size_t) * 4); - tt_assert(size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1 - 1)); - - /* Cases that overflow */ - tt_assert(! size_mul_check(SIZE_MAX, 2)); - tt_assert(! size_mul_check(2, SIZE_MAX)); - tt_assert(! size_mul_check(SIZE_MAX / 10, 11)); - tt_assert(! size_mul_check(11, SIZE_MAX / 10)); - tt_assert(! size_mul_check(SIZE_MAX / 8, 9)); - tt_assert(! size_mul_check(sqrt_size_max_p1, sqrt_size_max_p1)); - - done: - ; -} - -static void -test_util_monotonic_time(void *arg) -{ - (void)arg; - - monotime_t mt1, mt2; - monotime_coarse_t mtc1, mtc2; - uint64_t nsec1, nsec2, usec1, msec1; - uint64_t nsecc1, nsecc2, usecc1, msecc1; - uint32_t stamp1, stamp2; - - monotime_init(); - - monotime_get(&mt1); - monotime_coarse_get(&mtc1); - nsec1 = monotime_absolute_nsec(); - usec1 = monotime_absolute_usec(); - msec1 = monotime_absolute_msec(); - nsecc1 = monotime_coarse_absolute_nsec(); - usecc1 = monotime_coarse_absolute_usec(); - msecc1 = monotime_coarse_absolute_msec(); - stamp1 = monotime_coarse_to_stamp(&mtc1); - - tor_sleep_msec(200); - - monotime_get(&mt2); - monotime_coarse_get(&mtc2); - nsec2 = monotime_absolute_nsec(); - nsecc2 = monotime_coarse_absolute_nsec(); - stamp2 = monotime_coarse_to_stamp(&mtc2); - - /* We need to be a little careful here since we don't know the system load. - */ - tt_i64_op(monotime_diff_msec(&mt1, &mt2), OP_GE, 175); - tt_i64_op(monotime_diff_msec(&mt1, &mt2), OP_LT, 1000); - tt_i64_op(monotime_coarse_diff_msec(&mtc1, &mtc2), OP_GE, 125); - tt_i64_op(monotime_coarse_diff_msec(&mtc1, &mtc2), OP_LT, 1000); - tt_u64_op(nsec2-nsec1, OP_GE, 175000000); - tt_u64_op(nsec2-nsec1, OP_LT, 1000000000); - tt_u64_op(nsecc2-nsecc1, OP_GE, 125000000); - tt_u64_op(nsecc2-nsecc1, OP_LT, 1000000000); - - tt_u64_op(msec1, OP_GE, nsec1 / 1000000); - tt_u64_op(usec1, OP_GE, nsec1 / 1000); - tt_u64_op(msecc1, OP_GE, nsecc1 / 1000000); - tt_u64_op(usecc1, OP_GE, nsecc1 / 1000); - tt_u64_op(msec1, OP_LE, nsec1 / 1000000 + 1); - tt_u64_op(usec1, OP_LE, nsec1 / 1000 + 1000); - tt_u64_op(msecc1, OP_LE, nsecc1 / 1000000 + 1); - tt_u64_op(usecc1, OP_LE, nsecc1 / 1000 + 1000); - - uint64_t coarse_stamp_diff = - monotime_coarse_stamp_units_to_approx_msec(stamp2-stamp1); - tt_u64_op(coarse_stamp_diff, OP_GE, 120); - tt_u64_op(coarse_stamp_diff, OP_LE, 1200); - - done: - ; -} - -static void -test_util_monotonic_time_ratchet(void *arg) -{ - (void)arg; - monotime_init(); - monotime_reset_ratchets_for_testing(); - - /* win32, performance counter ratchet. */ - tt_i64_op(100, OP_EQ, ratchet_performance_counter(100)); - tt_i64_op(101, OP_EQ, ratchet_performance_counter(101)); - tt_i64_op(2000, OP_EQ, ratchet_performance_counter(2000)); - tt_i64_op(2000, OP_EQ, ratchet_performance_counter(100)); - tt_i64_op(2005, OP_EQ, ratchet_performance_counter(105)); - tt_i64_op(3005, OP_EQ, ratchet_performance_counter(1105)); - tt_i64_op(3005, OP_EQ, ratchet_performance_counter(1000)); - tt_i64_op(3010, OP_EQ, ratchet_performance_counter(1005)); - - /* win32, GetTickCounts32 ratchet-and-rollover-detector. */ - const int64_t R = ((int64_t)1) << 32; - tt_i64_op(5, OP_EQ, ratchet_coarse_performance_counter(5)); - tt_i64_op(1000, OP_EQ, ratchet_coarse_performance_counter(1000)); - tt_i64_op(5+R, OP_EQ, ratchet_coarse_performance_counter(5)); - tt_i64_op(10+R, OP_EQ, ratchet_coarse_performance_counter(10)); - tt_i64_op(4+R*2, OP_EQ, ratchet_coarse_performance_counter(4)); - - /* gettimeofday regular ratchet. */ - struct timeval tv_in = {0,0}, tv_out; - tv_in.tv_usec = 9000; - - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 9000); - tt_i64_op(tv_out.tv_sec, OP_EQ, 0); - - tv_in.tv_sec = 1337; - tv_in.tv_usec = 0; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 0); - tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); - - tv_in.tv_sec = 1336; - tv_in.tv_usec = 500000; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 0); - tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); - - tv_in.tv_sec = 1337; - tv_in.tv_usec = 0; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 500000); - tt_i64_op(tv_out.tv_sec, OP_EQ, 1337); - - tv_in.tv_sec = 1337; - tv_in.tv_usec = 600000; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 100000); - tt_i64_op(tv_out.tv_sec, OP_EQ, 1338); - - tv_in.tv_sec = 1000; - tv_in.tv_usec = 1000; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 100000); - tt_i64_op(tv_out.tv_sec, OP_EQ, 1338); - - tv_in.tv_sec = 2000; - tv_in.tv_usec = 2000; - ratchet_timeval(&tv_in, &tv_out); - tt_int_op(tv_out.tv_usec, OP_EQ, 101000); - tt_i64_op(tv_out.tv_sec, OP_EQ, 2338); - - done: - ; -} - -static void -test_util_monotonic_time_zero(void *arg) -{ - (void) arg; - monotime_t t1; - monotime_coarse_t ct1; - monotime_init(); - /* Check 1: The current time is not zero. */ - monotime_get(&t1); - monotime_coarse_get(&ct1); - tt_assert(!monotime_is_zero(&t1)); - tt_assert(!monotime_coarse_is_zero(&ct1)); - - /* Check 2: The _zero() makes the time zero. */ - monotime_zero(&t1); - monotime_coarse_zero(&ct1); - tt_assert(monotime_is_zero(&t1)); - tt_assert(monotime_coarse_is_zero(&ct1)); - done: - ; -} - -static void -test_util_monotonic_time_add_msec(void *arg) -{ - (void) arg; - monotime_t t1, t2; - monotime_coarse_t ct1, ct2; - monotime_init(); - - monotime_get(&t1); - monotime_coarse_get(&ct1); - - /* adding zero does nothing */ - monotime_add_msec(&t2, &t1, 0); - monotime_coarse_add_msec(&ct2, &ct1, 0); - tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 0); - tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 0); - - /* Add 1337 msec; see if the diff function agree */ - monotime_add_msec(&t2, &t1, 1337); - monotime_coarse_add_msec(&ct2, &ct1, 1337); - tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 1337); - tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 1337); - - /* Add 1337 msec twice more; make sure that any second rollover issues - * worked. */ - monotime_add_msec(&t2, &t2, 1337); - monotime_coarse_add_msec(&ct2, &ct2, 1337); - monotime_add_msec(&t2, &t2, 1337); - monotime_coarse_add_msec(&ct2, &ct2, 1337); - tt_i64_op(monotime_diff_msec(&t1, &t2), OP_EQ, 1337*3); - tt_i64_op(monotime_coarse_diff_msec(&ct1, &ct2), OP_EQ, 1337*3); - - done: - ; -} - -static void -test_util_htonll(void *arg) -{ - (void)arg; -#ifdef WORDS_BIGENDIAN - const uint64_t res_be = 0x8877665544332211; -#else - const uint64_t res_le = 0x1122334455667788; -#endif - - tt_u64_op(0, OP_EQ, tor_htonll(0)); - tt_u64_op(0, OP_EQ, tor_ntohll(0)); - tt_u64_op(UINT64_MAX, OP_EQ, tor_htonll(UINT64_MAX)); - tt_u64_op(UINT64_MAX, OP_EQ, tor_ntohll(UINT64_MAX)); - -#ifdef WORDS_BIGENDIAN - tt_u64_op(res_be, OP_EQ, tor_htonll(0x8877665544332211)); - tt_u64_op(res_be, OP_EQ, tor_ntohll(0x8877665544332211)); -#else - tt_u64_op(res_le, OP_EQ, tor_htonll(0x8877665544332211)); - tt_u64_op(res_le, OP_EQ, tor_ntohll(0x8877665544332211)); -#endif /* defined(WORDS_BIGENDIAN) */ - - done: - ; -} - -static void -test_util_get_unquoted_path(void *arg) -{ - (void)arg; - - char *r = NULL; - - r = get_unquoted_path("\""); // " - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("\"\"\""); // """ - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("\\\""); // \" - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("\\\"\\\""); // \"\" - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("A\\B\\C\""); // A\B\C" - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("\"A\\B\\C"); // "A\B\C - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("\"A\\B\"C\""); // "A\B"C" - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path("A\\B\"C"); // A\B"C - tt_ptr_op(r, OP_EQ, NULL); - tor_free(r); - - r = get_unquoted_path(""); - tt_str_op(r, OP_EQ, ""); - tor_free(r); - - r = get_unquoted_path("\"\""); // "" - tt_str_op(r, OP_EQ, ""); - tor_free(r); - - r = get_unquoted_path("A\\B\\C"); // A\B\C - tt_str_op(r, OP_EQ, "A\\B\\C"); // A\B\C - tor_free(r); - - r = get_unquoted_path("\"A\\B\\C\""); // "A\B\C" - tt_str_op(r, OP_EQ, "A\\B\\C"); // A\B\C - tor_free(r); - - r = get_unquoted_path("\"\\\""); // "\" - tt_str_op(r, OP_EQ, "\\"); // \ /* comment to prevent line continuation */ - tor_free(r); - - r = get_unquoted_path("\"\\\"\""); // "\"" - tt_str_op(r, OP_EQ, "\""); // " - tor_free(r); - - r = get_unquoted_path("\"A\\B\\C\\\"\""); // "A\B\C\"" - tt_str_op(r, OP_EQ, "A\\B\\C\""); // A\B\C" - tor_free(r); - - r = get_unquoted_path("A\\B\\\"C"); // A\B\"C - tt_str_op(r, OP_EQ, "A\\B\"C"); // A\B"C - tor_free(r); - - r = get_unquoted_path("\"A\\B\\\"C\""); // "A\B\"C" - tt_str_op(r, OP_EQ, "A\\B\"C"); // A\B"C - - done: - tor_free(r); -} - -#define UTIL_LEGACY(name) \ - { #name, test_util_ ## name , 0, NULL, NULL } - -#define UTIL_TEST(name, flags) \ - { #name, test_util_ ## name, flags, NULL, NULL } - -#define COMPRESS(name, identifier) \ - { "compress/" #name, test_util_compress, 0, &passthrough_setup, \ - (char*)(identifier) } - -#define COMPRESS_CONCAT(name, identifier) \ - { "compress_concat/" #name, test_util_decompress_concatenated, 0, \ - &passthrough_setup, \ - (char*)(identifier) } - -#define COMPRESS_JUNK(name, identifier) \ - { "compress_junk/" #name, test_util_decompress_junk, 0, \ - &passthrough_setup, \ - (char*)(identifier) } - -#define COMPRESS_DOS(name, identifier) \ - { "compress_dos/" #name, test_util_decompress_dos, 0, \ - &passthrough_setup, \ - (char*)(identifier) } - -#ifdef _WIN32 -#define UTIL_TEST_NO_WIN(n, f) { #n, NULL, TT_SKIP, NULL, NULL } -#define UTIL_TEST_WIN_ONLY(n, f) UTIL_TEST(n, (f)) -#define UTIL_LEGACY_NO_WIN(n) UTIL_TEST_NO_WIN(n, 0) -#else -#define UTIL_TEST_NO_WIN(n, f) UTIL_TEST(n, (f)) -#define UTIL_TEST_WIN_ONLY(n, f) { #n, NULL, TT_SKIP, NULL, NULL } -#define UTIL_LEGACY_NO_WIN(n) UTIL_LEGACY(n) -#endif /* defined(_WIN32) */ - -struct testcase_t util_tests[] = { - UTIL_LEGACY(time), - UTIL_TEST(parse_http_time, 0), - UTIL_LEGACY(config_line), - UTIL_LEGACY(config_line_quotes), - UTIL_LEGACY(config_line_comment_character), - UTIL_LEGACY(config_line_escaped_content), - UTIL_LEGACY(config_line_crlf), - UTIL_LEGACY_NO_WIN(expand_filename), - UTIL_LEGACY(escape_string_socks), - UTIL_LEGACY(string_is_key_value), - UTIL_LEGACY(strmisc), - UTIL_TEST(parse_integer, 0), - UTIL_LEGACY(pow2), - COMPRESS(zlib, "deflate"), - COMPRESS(gzip, "gzip"), - COMPRESS(lzma, "x-tor-lzma"), - COMPRESS(zstd, "x-zstd"), - COMPRESS(none, "identity"), - COMPRESS_CONCAT(zlib, "deflate"), - COMPRESS_CONCAT(gzip, "gzip"), - COMPRESS_CONCAT(lzma, "x-tor-lzma"), - COMPRESS_CONCAT(zstd, "x-zstd"), - COMPRESS_CONCAT(none, "identity"), - COMPRESS_JUNK(zlib, "deflate"), - COMPRESS_JUNK(gzip, "gzip"), - COMPRESS_JUNK(lzma, "x-tor-lzma"), - COMPRESS_DOS(zlib, "deflate"), - COMPRESS_DOS(gzip, "gzip"), - COMPRESS_DOS(lzma, "x-tor-lzma"), - COMPRESS_DOS(zstd, "x-zstd"), - UTIL_TEST(gzip_compression_bomb, TT_FORK), - UTIL_LEGACY(datadir), - UTIL_LEGACY(memarea), - UTIL_LEGACY(control_formats), - UTIL_LEGACY(mmap), - UTIL_TEST(sscanf, TT_FORK), - UTIL_LEGACY(format_time_interval), - UTIL_LEGACY(path_is_relative), - UTIL_LEGACY(strtok), - UTIL_LEGACY(di_ops), - UTIL_TEST(di_map, 0), - UTIL_TEST(round_to_next_multiple_of, 0), - UTIL_TEST(laplace, 0), - UTIL_TEST(clamp_double_to_int64, 0), - UTIL_TEST(find_str_at_start_of_line, 0), - UTIL_TEST(string_is_C_identifier, 0), - UTIL_TEST(asprintf, 0), - UTIL_TEST(listdir, 0), - UTIL_TEST(parent_dir, 0), - UTIL_TEST(ftruncate, 0), - UTIL_TEST(num_cpus, 0), - UTIL_TEST_WIN_ONLY(load_win_lib, 0), - UTIL_TEST_NO_WIN(exit_status, 0), - UTIL_TEST_NO_WIN(string_from_pipe, 0), - UTIL_TEST(format_hex_number, 0), - UTIL_TEST(format_dec_number, 0), - UTIL_TEST(join_win_cmdline, 0), - UTIL_TEST(split_lines, 0), - UTIL_TEST(n_bits_set, 0), - UTIL_TEST(eat_whitespace, 0), - UTIL_TEST(sl_new_from_text_lines, 0), - UTIL_TEST(envnames, 0), - UTIL_TEST(make_environment, 0), - UTIL_TEST(set_env_var_in_sl, 0), - UTIL_TEST(read_file_eof_tiny_limit, 0), - UTIL_TEST(read_file_eof_one_loop_a, 0), - UTIL_TEST(read_file_eof_one_loop_b, 0), - UTIL_TEST(read_file_eof_two_loops, 0), - UTIL_TEST(read_file_eof_two_loops_b, 0), - UTIL_TEST(read_file_eof_zero_bytes, 0), - UTIL_TEST(write_chunks_to_file, 0), - UTIL_TEST(mathlog, 0), - UTIL_TEST(fraction, 0), - UTIL_TEST(weak_random, 0), - { "socket_ipv4", test_util_socket, TT_FORK, &passthrough_setup, - (void*)"4" }, - { "socket_ipv6", test_util_socket, TT_FORK, - &passthrough_setup, (void*)"6" }, - { "socketpair", test_util_socketpair, TT_FORK, &passthrough_setup, - (void*)"0" }, - { "socketpair_ersatz", test_util_socketpair, TT_FORK, - &passthrough_setup, (void*)"1" }, - UTIL_TEST(max_mem, 0), - UTIL_TEST(hostname_validation, 0), - UTIL_TEST(ipv4_validation, 0), - UTIL_TEST(writepid, 0), - UTIL_TEST(get_avail_disk_space, 0), - UTIL_TEST(touch_file, 0), - UTIL_TEST_NO_WIN(pwdb, TT_FORK), - UTIL_TEST(calloc_check, 0), - UTIL_TEST(monotonic_time, 0), - UTIL_TEST(monotonic_time_ratchet, TT_FORK), - UTIL_TEST(monotonic_time_zero, 0), - UTIL_TEST(monotonic_time_add_msec, 0), - UTIL_TEST(htonll, 0), - UTIL_TEST(get_unquoted_path, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_util_format.c b/src/tor/src/test/test_util_format.c deleted file mode 100644 index 683d5fdac..000000000 --- a/src/tor/src/test/test_util_format.c +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" - -#include "test.h" - -#define UTIL_FORMAT_PRIVATE -#include "util_format.h" - -#define NS_MODULE util_format - -static void -test_util_format_unaligned_accessors(void *ignored) -{ - (void)ignored; - char buf[9] = "onionsoup"; // 6f6e696f6e736f7570 - - tt_u64_op(get_uint64(buf+1), OP_EQ, - tor_htonll(U64_LITERAL(0x6e696f6e736f7570))); - tt_uint_op(get_uint32(buf+1), OP_EQ, htonl(0x6e696f6e)); - tt_uint_op(get_uint16(buf+1), OP_EQ, htons(0x6e69)); - tt_uint_op(get_uint8(buf+1), OP_EQ, 0x6e); - - set_uint8(buf+7, 0x61); - tt_mem_op(buf, OP_EQ, "onionsoap", 9); - - set_uint16(buf+6, htons(0x746f)); - tt_mem_op(buf, OP_EQ, "onionstop", 9); - - set_uint32(buf+1, htonl(0x78696465)); - tt_mem_op(buf, OP_EQ, "oxidestop", 9); - - set_uint64(buf+1, tor_htonll(U64_LITERAL(0x6266757363617465))); - tt_mem_op(buf, OP_EQ, "obfuscate", 9); - done: - ; -} - -static void -test_util_format_base64_encode(void *ignored) -{ - (void)ignored; - int res; - int i; - char *src; - char *dst; - - src = tor_malloc_zero(256); - dst = tor_malloc_zero(1000); - - for (i=0;i<256;i++) { - src[i] = (char)i; - } - - res = base64_encode(NULL, 1, src, 1, 0); - tt_int_op(res, OP_EQ, -1); - - res = base64_encode(dst, 1, NULL, 1, 0); - tt_int_op(res, OP_EQ, -1); - - res = base64_encode(dst, 1, src, 10, 0); - tt_int_op(res, OP_EQ, -1); - - res = base64_encode(dst, SSIZE_MAX-1, src, 1, 0); - tt_int_op(res, OP_EQ, -1); - - res = base64_encode(dst, SSIZE_MAX-1, src, 10, 0); - tt_int_op(res, OP_EQ, -1); - - res = base64_encode(dst, 1000, src, 256, 0); - tt_int_op(res, OP_EQ, 344); - tt_str_op(dst, OP_EQ, "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh" - "8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH" - "SElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3" - "BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeY" - "mZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wM" - "HCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp" - "6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="); - - res = base64_encode(dst, 1000, src, 256, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 350); - tt_str_op(dst, OP_EQ, - "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\n" - "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\n" - "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n" - "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\n" - "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\n" - "8PHy8/T19vf4+fr7/P3+/w==\n"); - - res = base64_encode(dst, 1000, src+1, 255, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 346); - - for (i = 0;i<50;i++) { - src[i] = 0; - } - src[50] = (char)255; - src[51] = (char)255; - src[52] = (char)255; - src[53] = (char)255; - - res = base64_encode(dst, 1000, src, 54, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 74); - - res = base64_encode(dst, 1000, src+1, 53, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 74); - - res = base64_encode(dst, 1000, src+2, 52, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 74); - - res = base64_encode(dst, 1000, src+3, 51, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 70); - - res = base64_encode(dst, 1000, src+4, 50, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 70); - - res = base64_encode(dst, 1000, src+5, 49, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 70); - - res = base64_encode(dst, 1000, src+6, 48, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 65); - - res = base64_encode(dst, 1000, src+7, 47, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 65); - - res = base64_encode(dst, 1000, src+8, 46, BASE64_ENCODE_MULTILINE); - tt_int_op(res, OP_EQ, 65); - - done: - tor_free(src); - tor_free(dst); -} - -static void -test_util_format_base64_decode_oddsize(void *ignored) -{ - (void)ignored; - int res; - int i; - char *src; - char *dst, real_dst[7]; - char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; - char real_src[] = "ZXhhbXBsZQ"; - char expected40[] = "testing40characteroddsizebase64encoding!"; - char src40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ"; - char pad40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ=="; - - src = tor_malloc_zero(256); - dst = tor_malloc_zero(1000); - - for (i=0;i<256;i++) { - src[i] = (char)i; - } - - res = base64_decode(dst, 1, src, 5); - tt_int_op(res, OP_EQ, -1); - - const char *s = "SGVsbG8gd29ybGQ"; - res = base64_decode(dst, 1000, s, strlen(s)); - tt_int_op(res, OP_EQ, 11); - tt_mem_op(dst, OP_EQ, "Hello world", 11); - - s = "T3BhIG11bmRv"; - res = base64_decode(dst, 9, s, strlen(s)); - tt_int_op(res, OP_EQ, 9); - tt_mem_op(dst, OP_EQ, "Opa mundo", 9); - - res = base64_decode(real_dst, sizeof(real_dst), real_src, 10); - tt_int_op(res, OP_EQ, 7); - tt_mem_op(real_dst, OP_EQ, expected, 7); - - res = base64_decode(dst, 40, src40, strlen(src40)); - tt_int_op(res, OP_EQ, 40); - tt_mem_op(dst, OP_EQ, expected40, 40); - - res = base64_decode(dst, 40, pad40, strlen(pad40)); - tt_int_op(res, OP_EQ, 40); - tt_mem_op(dst, OP_EQ, expected40, 40); - - done: - tor_free(src); - tor_free(dst); -} - -static void -test_util_format_base64_decode(void *ignored) -{ - (void)ignored; - int res; - int i; - char *src; - char *dst, *real_dst; - uint8_t expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; - char real_src[] = "ZXhhbXBsZQ=="; - - src = tor_malloc_zero(256); - dst = tor_malloc_zero(1000); - real_dst = tor_malloc_zero(10); - - for (i=0;i<256;i++) { - src[i] = (char)i; - } - - res = base64_decode(dst, 1, src, 100); - tt_int_op(res, OP_EQ, -1); - - res = base64_decode(dst, 1, real_src, 10); - tt_int_op(res, OP_EQ, -1); - - const char *s = "T3BhIG11bmRv"; - res = base64_decode(dst, 9, s, strlen(s)); - tt_int_op(res, OP_EQ, 9); - tt_mem_op(dst, OP_EQ, "Opa mundo", 9); - - memset(dst, 0, 1000); - res = base64_decode(dst, 100, s, strlen(s)); - tt_int_op(res, OP_EQ, 9); - tt_mem_op(dst, OP_EQ, "Opa mundo", 9); - - s = "SGVsbG8gd29ybGQ="; - res = base64_decode(dst, 100, s, strlen(s)); - tt_int_op(res, OP_EQ, 11); - tt_mem_op(dst, OP_EQ, "Hello world", 11); - - res = base64_decode(real_dst, 10, real_src, 10); - tt_int_op(res, OP_EQ, 7); - tt_mem_op(real_dst, OP_EQ, expected, 7); - - done: - tor_free(src); - tor_free(dst); - tor_free(real_dst); -} - -static void -test_util_format_base16_decode(void *ignored) -{ - (void)ignored; - int res; - int i; - char *src; - char *dst, *real_dst; - char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; - char real_src[] = "6578616D706C65"; - - src = tor_malloc_zero(256); - dst = tor_malloc_zero(1000); - real_dst = tor_malloc_zero(10); - - for (i=0;i<256;i++) { - src[i] = (char)i; - } - - res = base16_decode(dst, 3, src, 3); - tt_int_op(res, OP_EQ, -1); - - res = base16_decode(dst, 1, src, 10); - tt_int_op(res, OP_EQ, -1); - - res = base16_decode(dst, ((size_t)INT_MAX)+1, src, 10); - tt_int_op(res, OP_EQ, -1); - - res = base16_decode(dst, 1000, "", 0); - tt_int_op(res, OP_EQ, 0); - - res = base16_decode(dst, 1000, "aabc", 4); - tt_int_op(res, OP_EQ, 2); - tt_mem_op(dst, OP_EQ, "\xaa\xbc", 2); - - res = base16_decode(dst, 1000, "aabcd", 6); - tt_int_op(res, OP_EQ, -1); - - res = base16_decode(dst, 1000, "axxx", 4); - tt_int_op(res, OP_EQ, -1); - - res = base16_decode(real_dst, 10, real_src, 14); - tt_int_op(res, OP_EQ, 7); - tt_mem_op(real_dst, OP_EQ, expected, 7); - - done: - tor_free(src); - tor_free(dst); - tor_free(real_dst); -} - -static void -test_util_format_base32_encode(void *arg) -{ - (void) arg; - size_t real_dstlen = 32; - char *dst = tor_malloc_zero(real_dstlen); - - /* Basic use case that doesn't require a source length correction. */ - { - /* Length of 10 bytes. */ - const char *src = "blahbleh12"; - size_t srclen = strlen(src); - /* Expected result encoded base32. This was created using python as - * such (and same goes for all test case.): - * - * b = bytes("blahbleh12", 'utf-8') - * base64.b32encode(b) - * (result in lower case) - */ - const char *expected = "mjwgc2dcnrswqmjs"; - - base32_encode(dst, base32_encoded_size(srclen), src, srclen); - tt_mem_op(expected, OP_EQ, dst, strlen(expected)); - /* Encode but to a larger size destination. */ - memset(dst, 0, real_dstlen); - base32_encode(dst, real_dstlen, src, srclen); - tt_mem_op(expected, OP_EQ, dst, strlen(expected)); - } - - /* Non multiple of 5 for the source buffer length. */ - { - /* Length of 8 bytes. */ - const char *expected = "mjwgc2dcnrswq"; - const char *src = "blahbleh"; - size_t srclen = strlen(src); - - memset(dst, 0, real_dstlen); - base32_encode(dst, base32_encoded_size(srclen), src, srclen); - tt_mem_op(expected, OP_EQ, dst, strlen(expected)); - } - - done: - tor_free(dst); -} - -static void -test_util_format_base32_decode(void *arg) -{ - (void) arg; - int ret; - size_t real_dstlen = 32; - char *dst = tor_malloc_zero(real_dstlen); - - /* Basic use case. */ - { - /* Length of 10 bytes. */ - const char *expected = "blahbleh12"; - /* Expected result encoded base32. */ - const char *src = "mjwgc2dcnrswqmjs"; - - ret = base32_decode(dst, strlen(expected), src, strlen(src)); - tt_int_op(ret, OP_EQ, 0); - tt_str_op(expected, OP_EQ, dst); - } - - /* Non multiple of 5 for the source buffer length. */ - { - /* Length of 8 bytes. */ - const char *expected = "blahbleh"; - const char *src = "mjwgc2dcnrswq"; - - ret = base32_decode(dst, strlen(expected), src, strlen(src)); - tt_int_op(ret, OP_EQ, 0); - tt_mem_op(expected, OP_EQ, dst, strlen(expected)); - } - - /* Invalid values. */ - { - /* Invalid character '#'. */ - ret = base32_decode(dst, real_dstlen, "#abcde", 6); - tt_int_op(ret, OP_EQ, -1); - /* Make sure the destination buffer has been zeroed even on error. */ - tt_int_op(tor_mem_is_zero(dst, real_dstlen), OP_EQ, 1); - } - - done: - tor_free(dst); -} - -static void -test_util_format_encoded_size(void *arg) -{ - (void)arg; - uint8_t inbuf[256]; - char outbuf[1024]; - unsigned i; - - crypto_rand((char *)inbuf, sizeof(inbuf)); - for (i = 0; i <= sizeof(inbuf); ++i) { - /* XXXX (Once the return values are consistent, check them too.) */ - - base32_encode(outbuf, sizeof(outbuf), (char *)inbuf, i); - /* The "+ 1" below is an API inconsistency. */ - tt_int_op(strlen(outbuf) + 1, OP_EQ, base32_encoded_size(i)); - - base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, 0); - tt_int_op(strlen(outbuf), OP_EQ, base64_encode_size(i, 0)); - base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, - BASE64_ENCODE_MULTILINE); - tt_int_op(strlen(outbuf), OP_EQ, - base64_encode_size(i, BASE64_ENCODE_MULTILINE)); - } - - done: - ; -} - -struct testcase_t util_format_tests[] = { - { "unaligned_accessors", test_util_format_unaligned_accessors, 0, - NULL, NULL }, - { "base64_encode", test_util_format_base64_encode, 0, NULL, NULL }, - { "base64_decode_oddsize", test_util_format_base64_decode_oddsize, 0, - NULL, NULL }, - { "base64_decode", test_util_format_base64_decode, 0, NULL, NULL }, - { "base16_decode", test_util_format_base16_decode, 0, NULL, NULL }, - { "base32_encode", test_util_format_base32_encode, 0, - NULL, NULL }, - { "base32_decode", test_util_format_base32_decode, 0, - NULL, NULL }, - { "encoded_size", test_util_format_encoded_size, 0, NULL, NULL }, - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_util_process.c b/src/tor/src/test/test_util_process.c deleted file mode 100644 index 68ce6cfd4..000000000 --- a/src/tor/src/test/test_util_process.c +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define UTIL_PROCESS_PRIVATE -#include "orconfig.h" -#include "or.h" - -#include "test.h" - -#include "util_process.h" - -#include "log_test_helpers.h" - -#ifndef _WIN32 -#define NS_MODULE util_process - -static void -temp_callback(int r, void *s) -{ - (void)r; - (void)s; -} - -static void -test_util_process_set_waitpid_callback(void *ignored) -{ - (void)ignored; - waitpid_callback_t *res1 = NULL, *res2 = NULL; - setup_full_capture_of_logs(LOG_WARN); - pid_t pid = (pid_t)42; - - res1 = set_waitpid_callback(pid, temp_callback, NULL); - tt_assert(res1); - - res2 = set_waitpid_callback(pid, temp_callback, NULL); - tt_assert(res2); - expect_single_log_msg( - "Replaced a waitpid monitor on pid 42. That should be " - "impossible.\n"); - - done: - teardown_capture_of_logs(); - clear_waitpid_callback(res1); - clear_waitpid_callback(res2); -} - -static void -test_util_process_clear_waitpid_callback(void *ignored) -{ - (void)ignored; - waitpid_callback_t *res; - setup_capture_of_logs(LOG_WARN); - pid_t pid = (pid_t)43; - - clear_waitpid_callback(NULL); - - res = set_waitpid_callback(pid, temp_callback, NULL); - clear_waitpid_callback(res); - expect_no_log_entry(); - -#if 0 - /* No. This is use-after-free. We don't _do_ that. XXXX */ - clear_waitpid_callback(res); - expect_log_msg("Couldn't remove waitpid monitor for pid 43.\n"); -#endif - - done: - teardown_capture_of_logs(); -} -#endif /* !defined(_WIN32) */ - -#ifndef _WIN32 -#define TEST(name) { #name, test_util_process_##name, 0, NULL, NULL } -#else -#define TEST(name) { #name, NULL, TT_SKIP, NULL, NULL } -#endif - -struct testcase_t util_process_tests[] = { - TEST(set_waitpid_callback), - TEST(clear_waitpid_callback), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_util_slow.c b/src/tor/src/test/test_util_slow.c deleted file mode 100644 index 2cd68cf11..000000000 --- a/src/tor/src/test/test_util_slow.c +++ /dev/null @@ -1,391 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#define UTIL_PRIVATE -#include "util.h" -#include "util_process.h" -#include "crypto.h" -#include "torlog.h" -#include "test.h" - -#ifndef BUILDDIR -#define BUILDDIR "." -#endif - -#ifdef _WIN32 -#define notify_pending_waitpid_callbacks() STMT_NIL -#define TEST_CHILD "test-child.exe" -#define EOL "\r\n" -#else -#define TEST_CHILD (BUILDDIR "/src/test/test-child") -#define EOL "\n" -#endif /* defined(_WIN32) */ - -#ifdef _WIN32 -/* I've assumed Windows doesn't have the gap between fork and exec - * that causes the race condition on unix-like platforms */ -#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2)) - -#else /* !(defined(_WIN32)) */ -/* work around a race condition of the timing of SIGCHLD handler updates - * to the process_handle's fields, and checks of those fields - * - * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to - * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */ -#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1) -#define IS_RUNNING_OR_NOTRUNNING(s) \ - ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING) -/* well, this is ugly */ -#define MATCH_PROCESS_STATUS(s1,s2) \ - ( (s1) == (s2) \ - ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ - && IS_RUNNING_OR_NOTRUNNING(s2)) \ - ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ - && IS_RUNNING_OR_NOTRUNNING(s1))) - -#endif /* defined(_WIN32) */ - -/** Helper function for testing tor_spawn_background */ -static void -run_util_spawn_background(const char *argv[], const char *expected_out, - const char *expected_err, int expected_exit, - int expected_status) -{ - int retval, exit_code; - ssize_t pos; - process_handle_t *process_handle=NULL; - char stdout_buf[100], stderr_buf[100]; - int status; - - /* Start the program */ -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - - notify_pending_waitpid_callbacks(); - - /* the race condition doesn't affect status, - * because status isn't updated by the SIGCHLD handler, - * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ - tt_assert(MATCH_PROCESS_STATUS(expected_status, status)); - if (status == PROCESS_STATUS_ERROR) { - tt_ptr_op(process_handle, OP_EQ, NULL); - return; - } - - tt_ptr_op(process_handle, OP_NE, NULL); - - /* When a spawned process forks, fails, then exits very quickly, - * (this typically occurs when exec fails) - * there is a race condition between the SIGCHLD handler - * updating the process_handle's fields, and this test - * checking the process status in those fields. - * The SIGCHLD update can occur before or after the code below executes. - * This causes intermittent failures in spawn_background_fail(), - * typically when the machine is under load. - * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */ - - /* the race condition affects the change in - * process_handle->status from RUNNING to NOTRUNNING */ - tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status)); - -#ifndef _WIN32 - notify_pending_waitpid_callbacks(); - /* the race condition affects the change in - * process_handle->waitpid_cb to NULL, - * so we skip the check if expected_status is ambiguous, - * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ - tt_assert(process_handle->waitpid_cb != NULL - || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING); -#endif /* !defined(_WIN32) */ - -#ifdef _WIN32 - tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE); - tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE); - tt_assert(process_handle->stdin_pipe != INVALID_HANDLE_VALUE); -#else - tt_assert(process_handle->stdout_pipe >= 0); - tt_assert(process_handle->stderr_pipe >= 0); - tt_assert(process_handle->stdin_pipe >= 0); -#endif /* defined(_WIN32) */ - - /* Check stdout */ - pos = tor_read_all_from_process_stdout(process_handle, stdout_buf, - sizeof(stdout_buf) - 1); - tt_assert(pos >= 0); - stdout_buf[pos] = '\0'; - tt_int_op(strlen(expected_out),OP_EQ, pos); - tt_str_op(expected_out,OP_EQ, stdout_buf); - - notify_pending_waitpid_callbacks(); - - /* Check it terminated correctly */ - retval = tor_get_exit_code(process_handle, 1, &exit_code); - tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); - tt_int_op(expected_exit,OP_EQ, exit_code); - // TODO: Make test-child exit with something other than 0 - -#ifndef _WIN32 - notify_pending_waitpid_callbacks(); - tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); -#endif - - /* Check stderr */ - pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, - sizeof(stderr_buf) - 1); - tt_assert(pos >= 0); - stderr_buf[pos] = '\0'; - tt_str_op(expected_err,OP_EQ, stderr_buf); - tt_int_op(strlen(expected_err),OP_EQ, pos); - - notify_pending_waitpid_callbacks(); - - done: - if (process_handle) - tor_process_handle_destroy(process_handle, 1); -} - -/** Check that we can launch a process and read the output */ -static void -test_util_spawn_background_ok(void *ptr) -{ - const char *argv[] = {TEST_CHILD, "--test", NULL}; - const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL; - const char *expected_err = "ERR"EOL; - - (void)ptr; - - run_util_spawn_background(argv, expected_out, expected_err, 0, - PROCESS_STATUS_RUNNING); -} - -/** Check that failing to find the executable works as expected */ -static void -test_util_spawn_background_fail(void *ptr) -{ - const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL}; - const char *expected_err = ""; - char expected_out[1024]; - char code[32]; -#ifdef _WIN32 - const int expected_status = PROCESS_STATUS_ERROR; -#else - /* TODO: Once we can signal failure to exec, set this to be - * PROCESS_STATUS_RUNNING_OR_ERROR */ - const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING; -#endif /* defined(_WIN32) */ - - memset(expected_out, 0xf0, sizeof(expected_out)); - memset(code, 0xf0, sizeof(code)); - - (void)ptr; - - tor_snprintf(code, sizeof(code), "%x/%x", - 9 /* CHILD_STATE_FAILEXEC */ , ENOENT); - tor_snprintf(expected_out, sizeof(expected_out), - "ERR: Failed to spawn background process - code %s\n", code); - - run_util_spawn_background(argv, expected_out, expected_err, 255, - expected_status); -} - -/** Test that reading from a handle returns a partial read rather than - * blocking */ -static void -test_util_spawn_background_partial_read_impl(int exit_early) -{ - const int expected_exit = 0; - const int expected_status = PROCESS_STATUS_RUNNING; - - int retval, exit_code; - ssize_t pos = -1; - process_handle_t *process_handle=NULL; - int status; - char stdout_buf[100], stderr_buf[100]; - - const char *argv[] = {TEST_CHILD, "--test", NULL}; - const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL, - "DONE" EOL, - NULL }; - const char *expected_err = "ERR" EOL; - -#ifndef _WIN32 - int eof = 0; -#endif - int expected_out_ctr; - - if (exit_early) { - argv[1] = "--hang"; - expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL; - } - - /* Start the program */ -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - tt_int_op(expected_status,OP_EQ, status); - tt_assert(process_handle); - tt_int_op(expected_status,OP_EQ, process_handle->status); - - /* Check stdout */ - for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) { -#ifdef _WIN32 - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, NULL); -#else - /* Check that we didn't read the end of file last time */ - tt_assert(!eof); - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, NULL, &eof); -#endif /* defined(_WIN32) */ - log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); - - /* We would have blocked, keep on trying */ - if (0 == pos) - continue; - - tt_assert(pos > 0); - stdout_buf[pos] = '\0'; - tt_str_op(expected_out[expected_out_ctr],OP_EQ, stdout_buf); - tt_int_op(strlen(expected_out[expected_out_ctr]),OP_EQ, pos); - expected_out_ctr++; - } - - if (exit_early) { - tor_process_handle_destroy(process_handle, 1); - process_handle = NULL; - goto done; - } - - /* The process should have exited without writing more */ -#ifdef _WIN32 - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, - process_handle); - tt_int_op(0,OP_EQ, pos); -#else /* !(defined(_WIN32)) */ - if (!eof) { - /* We should have got all the data, but maybe not the EOF flag */ - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, - process_handle, &eof); - tt_int_op(0,OP_EQ, pos); - tt_assert(eof); - } - /* Otherwise, we got the EOF on the last read */ -#endif /* defined(_WIN32) */ - - /* Check it terminated correctly */ - retval = tor_get_exit_code(process_handle, 1, &exit_code); - tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); - tt_int_op(expected_exit,OP_EQ, exit_code); - - // TODO: Make test-child exit with something other than 0 - - /* Check stderr */ - pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, - sizeof(stderr_buf) - 1); - tt_assert(pos >= 0); - stderr_buf[pos] = '\0'; - tt_str_op(expected_err,OP_EQ, stderr_buf); - tt_int_op(strlen(expected_err),OP_EQ, pos); - - done: - tor_process_handle_destroy(process_handle, 1); -} - -static void -test_util_spawn_background_partial_read(void *arg) -{ - (void)arg; - test_util_spawn_background_partial_read_impl(0); -} - -static void -test_util_spawn_background_exit_early(void *arg) -{ - (void)arg; - test_util_spawn_background_partial_read_impl(1); -} - -static void -test_util_spawn_background_waitpid_notify(void *arg) -{ - int retval, exit_code; - process_handle_t *process_handle=NULL; - int status; - int ms_timer; - - const char *argv[] = {TEST_CHILD, "--fast", NULL}; - - (void) arg; - -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - - tt_int_op(status, OP_EQ, PROCESS_STATUS_RUNNING); - tt_ptr_op(process_handle, OP_NE, NULL); - - /* We're not going to look at the stdout/stderr output this time. Instead, - * we're testing whether notify_pending_waitpid_calbacks() can report the - * process exit (on unix) and/or whether tor_get_exit_code() can notice it - * (on windows) */ - -#ifndef _WIN32 - ms_timer = 30*1000; - tt_ptr_op(process_handle->waitpid_cb, OP_NE, NULL); - while (process_handle->waitpid_cb && ms_timer > 0) { - tor_sleep_msec(100); - ms_timer -= 100; - notify_pending_waitpid_callbacks(); - } - tt_int_op(ms_timer, OP_GT, 0); - tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); -#endif /* !defined(_WIN32) */ - - ms_timer = 30*1000; - while (((retval = tor_get_exit_code(process_handle, 0, &exit_code)) - == PROCESS_EXIT_RUNNING) && ms_timer > 0) { - tor_sleep_msec(100); - ms_timer -= 100; - } - tt_int_op(ms_timer, OP_GT, 0); - - tt_int_op(retval, OP_EQ, PROCESS_EXIT_EXITED); - - done: - tor_process_handle_destroy(process_handle, 1); -} - -#undef TEST_CHILD -#undef EOL - -#undef MATCH_PROCESS_STATUS - -#ifndef _WIN32 -#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING -#undef IS_RUNNING_OR_NOTRUNNING -#endif - -#define UTIL_TEST(name, flags) \ - { #name, test_util_ ## name, flags, NULL, NULL } - -struct testcase_t slow_util_tests[] = { - UTIL_TEST(spawn_background_ok, 0), - UTIL_TEST(spawn_background_fail, 0), - UTIL_TEST(spawn_background_partial_read, 0), - UTIL_TEST(spawn_background_exit_early, 0), - UTIL_TEST(spawn_background_waitpid_notify, 0), - END_OF_TESTCASES -}; - diff --git a/src/tor/src/test/test_workqueue.c b/src/tor/src/test/test_workqueue.c deleted file mode 100644 index 2b0317371..000000000 --- a/src/tor/src/test/test_workqueue.c +++ /dev/null @@ -1,454 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "compat_threads.h" -#include "onion.h" -#include "workqueue.h" -#include "crypto.h" -#include "crypto_curve25519.h" -#include "compat_libevent.h" - -#include -#include - -#define MAX_INFLIGHT (1<<16) - -static int opt_verbose = 0; -static int opt_n_threads = 8; -static int opt_n_items = 10000; -static int opt_n_inflight = 1000; -static int opt_n_lowwater = 250; -static int opt_n_cancel = 0; -static int opt_ratio_rsa = 5; - -#ifdef TRACK_RESPONSES -tor_mutex_t bitmap_mutex; -int handled_len; -bitarray_t *handled; -#endif - -typedef struct state_s { - int magic; - int n_handled; - crypto_pk_t *rsa; - curve25519_secret_key_t ecdh; - int is_shutdown; -} state_t; - -typedef struct rsa_work_s { - int serial; - uint8_t msg[128]; - uint8_t msglen; -} rsa_work_t; - -typedef struct ecdh_work_s { - int serial; - union { - curve25519_public_key_t pk; - uint8_t msg[32]; - } u; -} ecdh_work_t; - -static void -mark_handled(int serial) -{ -#ifdef TRACK_RESPONSES - tor_mutex_acquire(&bitmap_mutex); - tor_assert(serial < handled_len); - tor_assert(! bitarray_is_set(handled, serial)); - bitarray_set(handled, serial); - tor_mutex_release(&bitmap_mutex); -#else /* !(defined(TRACK_RESPONSES)) */ - (void)serial; -#endif /* defined(TRACK_RESPONSES) */ -} - -static workqueue_reply_t -workqueue_do_rsa(void *state, void *work) -{ - rsa_work_t *rw = work; - state_t *st = state; - crypto_pk_t *rsa = st->rsa; - uint8_t sig[256]; - int len; - - tor_assert(st->magic == 13371337); - - len = crypto_pk_private_sign(rsa, (char*)sig, 256, - (char*)rw->msg, rw->msglen); - if (len < 0) { - rw->msglen = 0; - return WQ_RPL_ERROR; - } - - memset(rw->msg, 0, sizeof(rw->msg)); - rw->msglen = len; - memcpy(rw->msg, sig, len); - ++st->n_handled; - - mark_handled(rw->serial); - - return WQ_RPL_REPLY; -} - -static workqueue_reply_t -workqueue_do_shutdown(void *state, void *work) -{ - (void)state; - (void)work; - crypto_pk_free(((state_t*)state)->rsa); - tor_free(state); - return WQ_RPL_SHUTDOWN; -} - -static workqueue_reply_t -workqueue_do_ecdh(void *state, void *work) -{ - ecdh_work_t *ew = work; - uint8_t output[CURVE25519_OUTPUT_LEN]; - state_t *st = state; - - tor_assert(st->magic == 13371337); - - curve25519_handshake(output, &st->ecdh, &ew->u.pk); - memcpy(ew->u.msg, output, CURVE25519_OUTPUT_LEN); - ++st->n_handled; - mark_handled(ew->serial); - return WQ_RPL_REPLY; -} - -static workqueue_reply_t -workqueue_shutdown_error(void *state, void *work) -{ - (void)state; - (void)work; - return WQ_RPL_REPLY; -} - -static void * -new_state(void *arg) -{ - state_t *st; - (void)arg; - - st = tor_malloc(sizeof(*st)); - /* Every thread gets its own keys. not a problem for benchmarking */ - st->rsa = crypto_pk_new(); - if (crypto_pk_generate_key_with_bits(st->rsa, 1024) < 0) { - crypto_pk_free(st->rsa); - tor_free(st); - return NULL; - } - curve25519_secret_key_generate(&st->ecdh, 0); - st->magic = 13371337; - return st; -} - -static void -free_state(void *arg) -{ - state_t *st = arg; - crypto_pk_free(st->rsa); - tor_free(st); -} - -static tor_weak_rng_t weak_rng; -static int n_sent = 0; -static int rsa_sent = 0; -static int ecdh_sent = 0; -static int n_received = 0; -static int no_shutdown = 0; - -#ifdef TRACK_RESPONSES -bitarray_t *received; -#endif - -static void -handle_reply(void *arg) -{ -#ifdef TRACK_RESPONSES - rsa_work_t *rw = arg; /* Naughty cast, but only looking at serial. */ - tor_assert(! bitarray_is_set(received, rw->serial)); - bitarray_set(received,rw->serial); -#endif - - tor_free(arg); - ++n_received; -} - -/* This should never get called. */ -static void -handle_reply_shutdown(void *arg) -{ - (void)arg; - no_shutdown = 1; -} - -static workqueue_entry_t * -add_work(threadpool_t *tp) -{ - int add_rsa = - opt_ratio_rsa == 0 || - tor_weak_random_range(&weak_rng, opt_ratio_rsa) == 0; - - if (add_rsa) { - rsa_work_t *w = tor_malloc_zero(sizeof(*w)); - w->serial = n_sent++; - crypto_rand((char*)w->msg, 20); - w->msglen = 20; - ++rsa_sent; - return threadpool_queue_work_priority(tp, - WQ_PRI_MED, - workqueue_do_rsa, handle_reply, w); - } else { - ecdh_work_t *w = tor_malloc_zero(sizeof(*w)); - w->serial = n_sent++; - /* Not strictly right, but this is just for benchmarks. */ - crypto_rand((char*)w->u.pk.public_key, 32); - ++ecdh_sent; - return threadpool_queue_work(tp, workqueue_do_ecdh, handle_reply, w); - } -} - -static int n_failed_cancel = 0; -static int n_successful_cancel = 0; - -static int -add_n_work_items(threadpool_t *tp, int n) -{ - int n_queued = 0; - int n_try_cancel = 0, i; - workqueue_entry_t **to_cancel; - workqueue_entry_t *ent; - - to_cancel = tor_malloc(sizeof(workqueue_entry_t*) * opt_n_cancel); - - while (n_queued++ < n) { - ent = add_work(tp); - if (! ent) { - puts("Z"); - tor_event_base_loopexit(tor_libevent_get_base(), NULL); - return -1; - } - if (n_try_cancel < opt_n_cancel && - tor_weak_random_range(&weak_rng, n) < opt_n_cancel) { - to_cancel[n_try_cancel++] = ent; - } - } - - for (i = 0; i < n_try_cancel; ++i) { - void *work = workqueue_entry_cancel(to_cancel[i]); - if (! work) { - n_failed_cancel++; - } else { - n_successful_cancel++; - tor_free(work); - } - } - - tor_free(to_cancel); - return 0; -} - -static int shutting_down = 0; - -static void -replysock_readable_cb(tor_socket_t sock, short what, void *arg) -{ - threadpool_t *tp = arg; - replyqueue_t *rq = threadpool_get_replyqueue(tp); - - int old_r = n_received; - (void) sock; - (void) what; - - replyqueue_process(rq); - if (old_r == n_received) - return; - - if (opt_verbose) { - printf("%d / %d", n_received, n_sent); - if (opt_n_cancel) - printf(" (%d cancelled, %d uncancellable)", - n_successful_cancel, n_failed_cancel); - puts(""); - } -#ifdef TRACK_RESPONSES - tor_mutex_acquire(&bitmap_mutex); - for (i = 0; i < opt_n_items; ++i) { - if (bitarray_is_set(received, i)) - putc('o', stdout); - else if (bitarray_is_set(handled, i)) - putc('!', stdout); - else - putc('.', stdout); - } - puts(""); - tor_mutex_release(&bitmap_mutex); -#endif /* defined(TRACK_RESPONSES) */ - - if (n_sent - (n_received+n_successful_cancel) < opt_n_lowwater) { - int n_to_send = n_received + opt_n_inflight - n_sent; - if (n_to_send > opt_n_items - n_sent) - n_to_send = opt_n_items - n_sent; - add_n_work_items(tp, n_to_send); - } - - if (shutting_down == 0 && - n_received+n_successful_cancel == n_sent && - n_sent >= opt_n_items) { - shutting_down = 1; - threadpool_queue_update(tp, NULL, - workqueue_do_shutdown, NULL, NULL); - // Anything we add after starting the shutdown must not be executed. - threadpool_queue_work(tp, workqueue_shutdown_error, - handle_reply_shutdown, NULL); - { - struct timeval limit = { 2, 0 }; - tor_event_base_loopexit(tor_libevent_get_base(), &limit); - } - } -} - -static void -help(void) -{ - puts( - "Options:\n" - " -h Display this information\n" - " -v Be verbose\n" - " -N Run this many items of work\n" - " -T Use this many threads\n" - " -I Have no more than this many requests queued at once\n" - " -L Add items whenever fewer than this many are pending\n" - " -C Try to cancel N items of every batch that we add\n" - " -R Make one out of this many items be a slow (RSA) one\n" - " --no-{eventfd2,eventfd,pipe2,pipe,socketpair}\n" - " Disable one of the alert_socket backends."); -} - -int -main(int argc, char **argv) -{ - replyqueue_t *rq; - threadpool_t *tp; - int i; - tor_libevent_cfg evcfg; - struct event *ev; - uint32_t as_flags = 0; - - for (i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "-v")) { - opt_verbose = 1; - } else if (!strcmp(argv[i], "-T") && i+1 opt_n_inflight || opt_n_inflight > MAX_INFLIGHT || - opt_ratio_rsa < 0) { - help(); - return 1; - } - - if (opt_n_inflight > opt_n_items) { - opt_n_inflight = opt_n_items; - } - - init_logging(1); - network_init(); - if (crypto_global_init(1, NULL, NULL) < 0) { - printf("Couldn't initialize crypto subsystem; exiting.\n"); - return 1; - } - if (crypto_seed_rng() < 0) { - printf("Couldn't seed RNG; exiting.\n"); - return 1; - } - - rq = replyqueue_new(as_flags); - if (as_flags && rq == NULL) - return 77; // 77 means "skipped". - - tor_assert(rq); - tp = threadpool_new(opt_n_threads, - rq, new_state, free_state, NULL); - tor_assert(tp); - - crypto_seed_weak_rng(&weak_rng); - - memset(&evcfg, 0, sizeof(evcfg)); - tor_libevent_initialize(&evcfg); - - ev = tor_event_new(tor_libevent_get_base(), - replyqueue_get_socket(rq), EV_READ|EV_PERSIST, - replysock_readable_cb, tp); - - event_add(ev, NULL); - -#ifdef TRACK_RESPONSES - handled = bitarray_init_zero(opt_n_items); - received = bitarray_init_zero(opt_n_items); - tor_mutex_init(&bitmap_mutex); - handled_len = opt_n_items; -#endif /* defined(TRACK_RESPONSES) */ - - for (i = 0; i < opt_n_inflight; ++i) { - if (! add_work(tp)) { - puts("Couldn't add work."); - return 1; - } - } - - { - struct timeval limit = { 180, 0 }; - tor_event_base_loopexit(tor_libevent_get_base(), &limit); - } - - event_base_loop(tor_libevent_get_base(), 0); - - if (n_sent != opt_n_items || n_received+n_successful_cancel != n_sent) { - printf("%d vs %d\n", n_sent, opt_n_items); - printf("%d+%d vs %d\n", n_received, n_successful_cancel, n_sent); - puts("FAIL"); - return 1; - } else if (no_shutdown) { - puts("Accepted work after shutdown\n"); - puts("FAIL"); - } else { - puts("OK"); - return 0; - } -} - diff --git a/src/tor/src/test/test_workqueue_cancel.sh b/src/tor/src/test/test_workqueue_cancel.sh deleted file mode 100644 index f7c663171..000000000 --- a/src/tor/src/test/test_workqueue_cancel.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue -C 1 - diff --git a/src/tor/src/test/test_workqueue_efd.sh b/src/tor/src/test/test_workqueue_efd.sh deleted file mode 100644 index 4d8939681..000000000 --- a/src/tor/src/test/test_workqueue_efd.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue \ - --no-eventfd2 --no-pipe2 --no-pipe --no-socketpair diff --git a/src/tor/src/test/test_workqueue_efd2.sh b/src/tor/src/test/test_workqueue_efd2.sh deleted file mode 100644 index 7cfff45ff..000000000 --- a/src/tor/src/test/test_workqueue_efd2.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue \ - --no-eventfd --no-pipe2 --no-pipe --no-socketpair diff --git a/src/tor/src/test/test_workqueue_pipe.sh b/src/tor/src/test/test_workqueue_pipe.sh deleted file mode 100644 index afcef8785..000000000 --- a/src/tor/src/test/test_workqueue_pipe.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue \ - --no-eventfd2 --no-eventfd --no-pipe2 --no-socketpair diff --git a/src/tor/src/test/test_workqueue_pipe2.sh b/src/tor/src/test/test_workqueue_pipe2.sh deleted file mode 100644 index a20a1427e..000000000 --- a/src/tor/src/test/test_workqueue_pipe2.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue \ - --no-eventfd2 --no-eventfd --no-pipe --no-socketpair diff --git a/src/tor/src/test/test_workqueue_socketpair.sh b/src/tor/src/test/test_workqueue_socketpair.sh deleted file mode 100644 index 76af79746..000000000 --- a/src/tor/src/test/test_workqueue_socketpair.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${builddir:-.}/src/test/test_workqueue \ - --no-eventfd2 --no-eventfd --no-pipe2 --no-pipe diff --git a/src/tor/src/test/test_zero_length_keys.sh b/src/tor/src/test/test_zero_length_keys.sh deleted file mode 100644 index f85edb68d..000000000 --- a/src/tor/src/test/test_zero_length_keys.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# Check that tor regenerates keys when key files are zero-length - -exitcode=0 - -"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -z || exitcode=1 -"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -d || exitcode=1 -"${SHELL:-sh}" "${abs_top_srcdir:-.}/src/test/zero_length_keys.sh" "${builddir:-.}/src/or/tor" -e || exitcode=1 - -exit ${exitcode} diff --git a/src/tor/src/test/testing_common.c b/src/tor/src/test/testing_common.c deleted file mode 100644 index 142c68107..000000000 --- a/src/tor/src/test/testing_common.c +++ /dev/null @@ -1,330 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file test_common.c - * \brief Common pieces to implement unit tests. - **/ - -#include "orconfig.h" -#include "or.h" -#include "control.h" -#include "config.h" -#include "rephist.h" -#include "backtrace.h" -#include "test.h" -#include "channelpadding.h" - -#include -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef _WIN32 -/* For mkdir() */ -#include -#else -#include -#endif /* defined(_WIN32) */ - -#include "or.h" - -#ifdef USE_DMALLOC -#include -#include "main.h" -#endif - -/** Temporary directory (set up by setup_directory) under which we store all - * our files during testing. */ -static char temp_dir[256]; -#ifdef _WIN32 -#define pid_t int -#endif -static pid_t temp_dir_setup_in_pid = 0; - -/** Select and create the temporary directory we'll use to run our unit tests. - * Store it in temp_dir. Exit immediately if we can't create it. - * idempotent. */ -static void -setup_directory(void) -{ - static int is_setup = 0; - int r; - char rnd[256], rnd32[256]; - if (is_setup) return; - -/* Due to base32 limitation needs to be a multiple of 5. */ -#define RAND_PATH_BYTES 5 - crypto_rand(rnd, RAND_PATH_BYTES); - base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); - -#ifdef _WIN32 - { - char buf[MAX_PATH]; - const char *tmp = buf; - const char *extra_backslash = ""; - /* If this fails, we're probably screwed anyway */ - if (!GetTempPathA(sizeof(buf),buf)) - tmp = "c:\\windows\\temp\\"; - if (strcmpend(tmp, "\\")) { - /* According to MSDN, it should be impossible for GetTempPath to give us - * an answer that doesn't end with \. But let's make sure. */ - extra_backslash = "\\"; - } - tor_snprintf(temp_dir, sizeof(temp_dir), - "%s%stor_test_%d_%s", tmp, extra_backslash, - (int)getpid(), rnd32); - r = mkdir(temp_dir); - } -#else /* !(defined(_WIN32)) */ - tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s", - (int) getpid(), rnd32); - r = mkdir(temp_dir, 0700); - if (!r) { - /* undo sticky bit so tests don't get confused. */ - r = chown(temp_dir, getuid(), getgid()); - } -#endif /* defined(_WIN32) */ - if (r) { - fprintf(stderr, "Can't create directory %s:", temp_dir); - perror(""); - exit(1); - } - is_setup = 1; - temp_dir_setup_in_pid = getpid(); -} - -/** Return a filename relative to our testing temporary directory, based on - * name and suffix. If name is NULL, return the name of the testing temporary - * directory. */ -static const char * -get_fname_suffix(const char *name, const char *suffix) -{ - static char buf[1024]; - setup_directory(); - if (!name) - return temp_dir; - tor_snprintf(buf,sizeof(buf),"%s/%s%s%s",temp_dir,name,suffix ? "_" : "", - suffix ? suffix : ""); - return buf; -} - -/** Return a filename relative to our testing temporary directory. If name is - * NULL, return the name of the testing temporary directory. */ -const char * -get_fname(const char *name) -{ - return get_fname_suffix(name, NULL); -} - -/** Return a filename with a random suffix, relative to our testing temporary - * directory. If name is NULL, return the name of the testing temporary - * directory, without any suffix. */ -const char * -get_fname_rnd(const char *name) -{ - char rnd[256], rnd32[256]; - crypto_rand(rnd, RAND_PATH_BYTES); - base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); - return get_fname_suffix(name, rnd32); -} - -/* Remove a directory and all of its subdirectories */ -static void -rm_rf(const char *dir) -{ - struct stat st; - smartlist_t *elements; - - elements = tor_listdir(dir); - if (elements) { - SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) { - char *tmp = NULL; - tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp); - if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) { - rm_rf(tmp); - } else { - if (unlink(tmp)) { - fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno)); - } - } - tor_free(tmp); - } SMARTLIST_FOREACH_END(cp); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - } - if (rmdir(dir)) - fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno)); -} - -/** Remove all files stored under the temporary directory, and the directory - * itself. Called by atexit(). */ -static void -remove_directory(void) -{ - if (getpid() != temp_dir_setup_in_pid) { - /* Only clean out the tempdir when the main process is exiting. */ - return; - } - - rm_rf(temp_dir); -} - -static void * -passthrough_test_setup(const struct testcase_t *testcase) -{ - /* Make sure the passthrough doesn't unintentionally fail or skip tests */ - tor_assert(testcase->setup_data); - tor_assert(testcase->setup_data != (void*)TT_SKIP); - return testcase->setup_data; -} -static int -passthrough_test_cleanup(const struct testcase_t *testcase, void *ptr) -{ - (void)testcase; - (void)ptr; - return 1; -} - -static void * -ed25519_testcase_setup(const struct testcase_t *testcase) -{ - crypto_ed25519_testing_force_impl(testcase->setup_data); - return testcase->setup_data; -} -static int -ed25519_testcase_cleanup(const struct testcase_t *testcase, void *ptr) -{ - (void)testcase; - (void)ptr; - crypto_ed25519_testing_restore_impl(); - return 1; -} -const struct testcase_setup_t ed25519_test_setup = { - ed25519_testcase_setup, ed25519_testcase_cleanup -}; - -const struct testcase_setup_t passthrough_setup = { - passthrough_test_setup, passthrough_test_cleanup -}; - -static void -an_assertion_failed(void) -{ - tinytest_set_test_failed_(); -} - -/** Main entry point for unit test code: parse the command line, and run - * some unit tests. */ -int -main(int c, const char **v) -{ - or_options_t *options; - char *errmsg = NULL; - int i, i_out; - int loglevel = LOG_ERR; - int accel_crypto = 0; - - /* We must initialise logs before we call tor_assert() */ - init_logging(1); - -#ifdef USE_DMALLOC - { - int r = crypto_use_tor_alloc_functions(); - tor_assert(r == 0); - } -#endif /* defined(USE_DMALLOC) */ - - update_approx_time(time(NULL)); - options = options_new(); - tor_threads_init(); - tor_compress_init(); - - network_init(); - - monotime_init(); - - struct tor_libevent_cfg cfg; - memset(&cfg, 0, sizeof(cfg)); - tor_libevent_initialize(&cfg); - - control_initialize_event_queue(); - configure_backtrace_handler(get_version()); - - for (i_out = i = 1; i < c; ++i) { - if (!strcmp(v[i], "--warn")) { - loglevel = LOG_WARN; - } else if (!strcmp(v[i], "--notice")) { - loglevel = LOG_NOTICE; - } else if (!strcmp(v[i], "--info")) { - loglevel = LOG_INFO; - } else if (!strcmp(v[i], "--debug")) { - loglevel = LOG_DEBUG; - } else if (!strcmp(v[i], "--accel")) { - accel_crypto = 1; - } else { - v[i_out++] = v[i]; - } - } - c = i_out; - - { - log_severity_list_t s; - memset(&s, 0, sizeof(s)); - set_log_severity_config(loglevel, LOG_ERR, &s); - /* ALWAYS log bug warnings. */ - s.masks[LOG_WARN-LOG_ERR] |= LD_BUG; - add_stream_log(&s, "", fileno(stdout)); - } - - options->command = CMD_RUN_UNITTESTS; - if (crypto_global_init(accel_crypto, NULL, NULL)) { - printf("Can't initialize crypto subsystem; exiting.\n"); - return 1; - } - crypto_set_tls_dh_prime(); - if (crypto_seed_rng() < 0) { - printf("Couldn't seed RNG; exiting.\n"); - return 1; - } - rep_hist_init(); - setup_directory(); - options_init(options); - options->DataDirectory = tor_strdup(temp_dir); - tor_asprintf(&options->KeyDirectory, "%s"PATH_SEPARATOR"keys", - options->DataDirectory); - options->CacheDirectory = tor_strdup(temp_dir); - options->EntryStatistics = 1; - if (set_options(options, &errmsg) < 0) { - printf("Failed to set initial options: %s\n", errmsg); - tor_free(errmsg); - return 1; - } - - tor_set_failed_assertion_callback(an_assertion_failed); - - init_pregenerated_keys(); - - channelpadding_new_consensus_params(NULL); - - predicted_ports_init(); - - atexit(remove_directory); - - int have_failed = (tinytest_main(c, v, testgroups) != 0); - - free_pregenerated_keys(); -#ifdef USE_DMALLOC - tor_free_all(0); - dmalloc_log_unfreed(); -#endif - crypto_global_cleanup(); - - if (have_failed) - return 1; - else - return 0; -} - diff --git a/src/tor/src/test/testing_rsakeys.c b/src/tor/src/test/testing_rsakeys.c deleted file mode 100644 index 7a24c0ed1..000000000 --- a/src/tor/src/test/testing_rsakeys.c +++ /dev/null @@ -1,546 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "or.h" -#include "test.h" - -/** Define this if unit tests spend too much time generating public keys. - * This module is meant to save time by using a bunch of pregenerated RSA -keys among */ -#define USE_PREGENERATED_RSA_KEYS - -#ifdef USE_PREGENERATED_RSA_KEYS - -static const char *PREGEN_KEYS_1024[] = { -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQCZa39BCgq7KWBWFSjGYHhqmTCHvQ7WNEFAb9Mujb6Xn/Zy01fu\n" -"WIpVvqmAKeLNEziItUm/gB8GwAN+/ZLwL9pufjIp2Ar+yqVXKySioZQxuCgTP2wm\n" -"Ku0OfmAra1Xbtrkc2OCJllxkyNPrJ/kxfwjWR96UP0+VMbOlkBoEH1FtvwIDAQAB\n" -"AoGAUXoygeMIYe+OdwkTt48CRHKIwH3aRE5KHSOGPyIOB05vvvmYqD8jcHgqYqNc\n" -"DNdZXdkRin9LevU8phObFq4DTXp08XggUx4Kk4AdsFKubQtJ8gHm3xlSKbZXX2m/\n" -"ZF0GRaZtVDQ3TRGh+OBLILt/2jT+BaFKGAyJ7al76F2nprECQQDJyLlteLDFBmrd\n" -"0kAjNBE50S5YskBCQeQACROfyTKW8lG1J57UBeYjXvbrDFBR4alIS9DEexGai9Gz\n" -"wxpgKg2nAkEAwqQmPstjHxvqGQRi41uXO026MLxY7dhEqs1aSw3tuT8v17pW3OEa\n" -"Qxv7JINePZ3+sNN+Ic+3RXBR0QuD7lSSKQJAZjVSF21GvMXfY7SX4D0DbLHUNAE2\n" -"I1mUz5/JXOpgwazETmpfPS4vwELd93kpRhBz2rbsbFmaNRoVgmSU+5jRiQJAZ1bV\n" -"g2NilgKxEGU2x3U6Xt8Oqo9lO6omEvUCKnUTsNWuZf/l3FGbKuQxO5qPr3Ex5tny\n" -"zqrEqBZRKgbOHfxCuQJAbJY5C3Nm5koemr031r00MY2YD1b6+hyKZyPdZ21HpyY8\n" -"z1kWShL0POjYPX/BnKE1FkpklWcKBb7wkK7dvAKkEQ==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQCyqMM2TfFGV5tVBTVabxLVln8146nDavIdR6q78DCUMh8Zfzkk\n" -"h9Lbl1NX4RU+AmrCZMPq21/EjIRxRQyRdgPYJVLdp96eGeYnEzmMkqvXiswXvDg/\n" -"tXqsjyJeYsoHMQWDTpCLfjYo4K1ol1sg8VIs4wQeq5og6QSdmhBoz7MyqQIDAQAB\n" -"AoGBAIJekey7nZeV8Bxva4ptSRIg+v0I/2VBUiG5nUX9NIW/uV/yrXERx/VDjKaw\n" -"8b5JJzxpKWnk4RJc83xwRYaT1qMYHiQfybxEI0K9SjhtaThAjtXkQGtZgLJILl3t\n" -"yh3LPTh1ocwafsKjU6eGYAe/DYn9/QwYHbtyaimcigu4etp9AkEA2DgC+HndoP1i\n" -"np26Lx+4TG0vAfrVYGSLT9FXwf2iBV3oJvdKqu6wr8ipb1SbshRPcOQd31/mCh6+\n" -"2BR+d4ddcwJBANOHrlBbGZdHnoEu6kKbPwwkc31IZYqyfSpkqm0Lb2oWZ9SInKfc\n" -"cz0qpH91p610XUpYmycaJr4K+N8jgrz86HMCQQCoqGBg1Ca2OpCf66bctWB8dTqS\n" -"z8d7rlIhC8npr1+f0hWRt5pN5Wx7YgoQpq3gZgllpPtMT7DQOhVh1fKkaDnTAkA4\n" -"XuskPPLX7t0dvhvtviOSH9CrLXTp/mD+wC7uumJpmij3aaSd01DelxOZaAhUYDNQ\n" -"UcafKAf1E0V5aaQ4qwljAkA9NVN6CtpzzcLrstTKxrx5P1Ylt/0UYQDo1lIaqwrT\n" -"aOFbXmOungiC9+p/4U7RbX0MEzjFDHCWlaHASviGVgta\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQDDt2V63APj3JSqaRgofUzhtB+prm0wII4uHyxfOxnpYIELOW5z\n" -"3UHmkr+B4D+Nif5jIp0i6W4OS4S+YHewKsDsXvXKRIW78KzOt6Le4JI9rSarNjy5\n" -"aJKksWQRALLCmxP/BdolaBFqF3fIPD5+Zxu8ESgxhkEQI4p7awUp3E730QIDAQAB\n" -"AoGAZktfAR4p8lkCYydW9yK2ommQ+xEuBK+fYL/uYz/yxSYpjIJSFsEYhrlA21Mo\n" -"JIRxr8MRuoOjgFk8YnztUeimuHpslDlZDaCBzjRjBRFCMepZNG9xqSEL0u7C+SH6\n" -"KU5f2x2P6PneBj6WaHZM+6Lf2xHlOoeuaVSUfq2Pk2VBF9kCQQDtawWWNwP0+xea\n" -"oCAQpanaLzYPjlqZfHJQ1AAI5eSkdf1qmlypIHwOtjAEa6XuEO/Or8RNkNy4nQdw\n" -"qhcQ7PXDAkEA0wjT6Z+Lrt67FnwPgoSvl4Nukcqw4OWHbBKhaQPsO9+oc3PAXLdD\n" -"SclUUqDF6NX1yONTV1KrPdz4zElmEua+2wJABm4inZnp2oW+cuqpU6oY+pbSwQMb\n" -"AxMyyWukgJkxYx7q+SsrHU2K7p8Sl9wOh28f/5oVGAC3aayfGfcRXtz8HwJAIqeO\n" -"dQzYGU1GF7kjquEzHIRewd4xEZ1fkaW1j9MvFd3ygZL+gbsud41yJWd1WHjaNbTu\n" -"2KYgrLX+vT1IX844hQJAbg0V7iHlttQqXL7yN09jIjQLprqVhDZCUHS9s9Dxe7fz\n" -"Ac0ZZD0D6EVNmSmBB71q7kLUWX/W/10d447TLnnfew==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXgIBAAKBgQDhCAjPEockl4lqkvoIb5O3NJJG8NWD31c63e/cPWY6MX5nOM/q\n" -"avof2eWJxFOk0HQ2BRVwIgNex6kLxtsdw7XE0A5uZorTp9DbRCGMqUqHNhHH9ci2\n" -"mMPP9jptq3ieWg310bH4Tad8h3WE2npSCDBvxyV6EmuH2rlQW9ZlHNoiRQIDAQAB\n" -"AoGBAI4PgWggPTqng7PJF5mNvsYQpSutzE0VCL977nmuNUQVjMPjRLarVD4ZU+QW\n" -"EevhQQv9R5xjjJcgGqL5pchzjeKDm0/LA+AygnZoDMs2O68Neieqvr7cPqr5ALGs\n" -"WuZvSn+bRJTenvV9sUh2ii0/u3GQbL1v7GWDkIdD7itDbmRhAkEA8iijuEY+W67w\n" -"7JusjY2MQ2Cm6xxxR0YcnYPzT6UDm+Z7NNJwKscQ6AjayNmxmXGpbUdukzLzXf8y\n" -"fccI9t6iHQJBAO3kx9nZay0Ktl51QP5o2gwoqRIbnogGfR06KJOlzIPGR0aPn8cg\n" -"uKq2SiyjewEaSBM6S/4UlxYUmvc3VKnxCEkCQQDpTjg2YQ7RPGIIRA/iLV7Wx3bq\n" -"C/QjjCwjoi44LK6mdE9928WPoUzrkSRg4EQYpwZqL6kcDrmkdSuLPMipOGQNAkA3\n" -"KtzlujPOiDNuiEaAORSHyU4b8ue6p7aP9pK+Wq6oyGxzAo+NABuTCx78ZxT5Vnzs\n" -"aJKC44d+CV0+g0hQ+KJxAkEAqFYzNWIzTHX8DVDdK9BpUaBg1DFxIeP5Kk+/X3FF\n" -"5BafG08B6OiLf8qIGGsxLXNRjIE0GVp3Sy23FUKtUymP+A==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQDMDk01VwPxQq/BAwOBmfGUP/x5BQn+uxI0Aat6bdWuz/2CsjbS\n" -"CWD/YLCaPm+DpHp9RMwk4HONJaw4B2XOw3ELPx7y9DEgdC1wZ9wRkJmqr2IJZoZR\n" -"C7x43nNv+/IXTiRkkljCcMpoL1Tld+L2VbmWR29PdZwvspWRILkEZu1mNwIDAQAB\n" -"AoGANvFK3KfXSei4xfF3yjeXEmHAKx2uOUZJenNQpqBYPr+F9ODjXd5knZ59LqrM\n" -"/9cTnBMgHHXK5yBTpKppQSjikLeQ2BF04Ktff9oGqVcS9x/rKo0CREuxsEfawZOW\n" -"OzOWENp4YcDKGP1I/Ctr185QzStaWrXVQftxmYQ53T77ShECQQDnhabwtqW7rfe4\n" -"+MfkWEJ9Y2s6iMs3JWnwPOX9G9R39PiAD4vAghHJyHHttS9Ipxmvp0hThu0x7a4g\n" -"8BfUpqgjAkEA4aFAmzarWKigREAACVTYH2RHpXbuk05vF9WqfMPiEvQUd5a1q6vc\n" -"xkGZsE3v/TExLjPRZP4FeUNV5sD7THzA3QJBAJxPoRlNx3GCEAlDdfnWGPX9JI09\n" -"hC40RWUcSI7ttjJTI1+an1kWuBnLChhaRpU/tFjikTNLmmMmPHUihIRfDI8CQG7g\n" -"3WzpKr8A7vFbOilbxnF2yDaqAYfmTXW7DHMPl/OUetJh/5kDdhT/e9VGF5+nIvH/\n" -"iPFGW85Bpt8lCtmFnQkCQQDjpp9iy2qesE7KKX4Kv3++QfCJ2w3g7lwg4iyncoDd\n" -"JrM53p29HROM21R6eekvqeWIe9tEX754b+E/N60ZjpGm\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXgIBAAKBgQDdDn3H+Eu0AW5GKohqDBntw6ubnd3VaJwZGzZyga4J2kLg8peP\n" -"RAW6GDD6pcHzW+KZbFWHtRk70FSwvmyGcf+DY0r5tfyCHyDGmbJyPR0o6OVCgSFl\n" -"ccf4eDvbyszzMdlx3uL05ABIpCShoKtEUqvyIQla3Jon+QBwuVkizMzyVwIDAQAB\n" -"AoGACoKh4Fwh3VEkGRn0mnYw1Wk0Q5Xh8j+jDF6K3C7mQ3mpLGDca+dkDlEQIxq2\n" -"egeoYnsQJf+qT3m8TRsAtfO9nj7+7IX4BfCtdIi4RNcorbs5YMWtFyaywnM6SQjS\n" -"+1qf74aL4On9WRO2FtvnTMjFAAkiWNbQp7mWwTmB59i620ECQQDwde6/PwhUzvZh\n" -"dyslKJdna5RjkDQyDIuh0zD/tFZ0Iko7Luec8q6n52ev/n0OiTLGetUh8goePsPP\n" -"HVZHidNJAkEA61eMCmmu+GCAg2vJRtL5sDakAXsbP5M9Bf/QVHXtc4EVXHC6T2ld\n" -"bldOJriNbBThBuPNmlQbssn9FApkyWT4nwJBAIuHIv3+CUuMvBJaH8L0BsaP+g67\n" -"wk24Ud2Yujnl3rSMoR4uXV8IwqfS8quAs/gXTEs3QyzrUUuzh9NKZqIkK2ECQQCz\n" -"vivBEDKIlPvSZBJYO25kfXcJgoKvLb9fw5/TwjXXD/HGpnpFiI3JZnjT7gRlVhT/\n" -"9CDmC/MTvF3EXqPXhXy1AkEAo3a2me23Ljmub21jycSKaCk09dK85QTRRMe9c/hs\n" -"i+pcGi9ZZW0Mm7cyQo47oXjNurkkv0fEvXIobVTEXAGU7w==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQCv8R1IbfYnE3R3kNeezJ7m02XnyCBDDy0YfrQldQ+urdg1CFye\n" -"bO0iPniJb8fmV8NW7x6nUZTDznCg+igroKXtK/w0WYmJJiH4A7Oi5xNjAfRIPvJ/\n" -"J5GI8szS8rH8tp8pW1h8k/kNg2pnBjwQ2U9omhp95RGaHDQSRYzzH/fEFQIDAQAB\n" -"AoGAcy7+BcH/iZuB/xjzIIJDcUhqibCJ9n0D/+pLU85sYuZrCmUcBZe4M1gEn61v\n" -"iExilRJc1hthskL/l1POYql8lk+aqeeDuh38fWJj60TCV/sENiuXOsTmoFVA5pNn\n" -"lwlG8JlpBMsgr1fGqg1C/WLFfMmvXdKVGvpRqI06j7AYUa0CQQDfZ5rI+FhXBlxo\n" -"PR5CM1LB90DuHUMW+Kqoj0c9d2esXEQM7UqQ/9BiBQbL6Py7Z3VwCxibOqyz7+V7\n" -"2aGUMAKnAkEAyZy5Mu2tHs6YBBxPYam7huzMUYjddN7ixAZUyGwxQp9kTIF2NbSQ\n" -"yVDjKrco3s2lO4qj4pSumwVe3GGlsi6G4wJAOOS3pIqqZK84BUvbUtyjLMZ9AKbv\n" -"GQCG5ZpneB3ahyiQJAKiRL8BIJVLH87b3hYA8GHDCHUu2jwz4xCPd5+qbQJAV0TP\n" -"pYvb9AnZI25drhiaY7z8dA6aTYxs/A0Bhf/PEteLwtIHKRgP1BR/QG4n8slxTGSm\n" -"q91P9ypL9XkPECGzoQJBAIMvGEM7ZGevQHBjJ8HhU8IsgT4cYH/XEYb8jRy4F+Ui\n" -"jKxHPxLuFK4urAZunNUNrqhT0PxbB7hRjtHZrmFkrcc=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQDSpmV8ncLwc8gXzdFsZGPDtMO7C/IN9jKCIK13WIseMg1APlMt\n" -"PB5lMQ9fa3m9ZRU0L8HzRo+u/Xdos3yIBI38X2Avy0laGKnQxiOKaDT/5ZHeiBBh\n" -"nMZjP2WY5V1sgqNP9RD8enE6WaSvq1j0BM++mn9KEe//5+dWD8tboBKF4QIDAQAB\n" -"AoGBALgVoerdE1Z+WAY1XyaSNHz6o3H6ZnW9CTaex/jb7/dbVikmThnhx842qXCB\n" -"w8m3ZGhOs/edWkNaTde5wsI6+LhVGco/PWxN4v61jokxUU+5KvUvGacXhXIjzKwG\n" -"DrNCYmle62QCI1z4+TLQW/Lq+jw2Wzk70NWEvoP58gt5SJoBAkEA9wubRKRs49LW\n" -"5JNQZ9hjc+mAfP9YK/sMe4jkdloMMWXjSMlF3Z4mI9XQSpfbBqwWIBXsjU/15LIS\n" -"ftmujZsMKQJBANpJEZI7UFoRdSP7AlM0YJuXWnVGyn/K+VIeEso5AlZdKXCTpxqp\n" -"9blWq0UVC6jLesZ5UNPuBiAnrBaVwDA8YvkCQF+FQVfdK607TJO80g4VAP9EfcXX\n" -"BUScIUtytsN8NdKzzpnKGRWDnMOmXI87ABkoWLW3RGuvSyhOIhCiInfmR2ECQASc\n" -"FmroJcJBLCAeZOYs7P1cLOTdIdmhB7LcP7lVit8YCJAADj9Z536KfgNvdleSNH2M\n" -"glB3blmvfMrdTrm2DMECQQDj6GJ/Tc2rCsq534xknasVjrgtJMQFxmQCTVgBx9pc\n" -"gTflJAHAmNDvstacVqeObLCF2ZIvya8fSXGbDOJYeGDv\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQDGgUJAm7vf/3focNGwzv4TkzYF2XwpAirnb61dyxvfug1zKv2k\n" -"AUg3qACiurR7JrI+kAbmxEnNaKV7ts7uO763wP9KE8YAuFZsp7NFA295rEZhw38T\n" -"rUlWHMCeaZ3mqW2q8gA14C/ZJCG4gS91SIHLjNGsbHwr2Jvri2ItwIP8FQIDAQAB\n" -"AoGAONceb32oiHWQkkBr6uL6ogRPPdGO2fdC7c5uqCLWsnOGEmpHAsVTNoym0fIA\n" -"aBsmgv+e2klukKDccdZg3prA+z7lHcc2a4bIFguF6ei80hLIis/dds66fFXofCzy\n" -"DMlkncSbJwIvQHG9gblxp9qSKElZF7XjABZEImarfUlakGkCQQD//msGy5N0ZhMI\n" -"yGMXkwXRJXfmRrIrOqHx6u1eUp4OuqDW+hBz4KCHnWfuRJkNGQIammSf18jPasP5\n" -"YHyr/LifAkEAxoJ8R8Vusexo9ZjuU44qXCSvJQ26UBV7mn6TGEAn2DRK1RWKDaHv\n" -"j2vnRjt3CO9WPDQL7SB/1HNAy+dIMPyqywJBAIB6tESIz8zPniX+TJ18UKMTZwXP\n" -"3YQMvVKpUdDRLjq+OBMtFizSRD9MJOlUzGvibUfkzTPcHRDcyNbUMj4vbIkCQBx4\n" -"6sqAjvgGKKfRX52sbnb47AYsieSisC/gp8h6qzxfg7w8cqix6WJw36M7ND+b1Iqe\n" -"DHfeiXc3cLvOWJRuKTECQCEYkujtSjXWb26xaESFWGtUI/nEvCyqYPQAFBpaGzQ3\n" -"tiTDeKHzypesWYoTxOiNQWCQMLrFGuUbDpYOuDOVNjw=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQCcwSAfytnspSSDX/sKmCPOMnpuCYeWA4wbz1wLyb63a8/KXhhG\n" -"6o2W0kt3x1vnGZkeWwZOeBFUqwoc+xHhoNcZFsMOyqbqA3UMZW5cx27MsexRTQHs\n" -"Go1newu/E+8NNCohY51G7z1Hdo0L6mi/Tldh7puuGsMwKqNG/Vvo/GQDgwIDAQAB\n" -"AoGBAIUdpBAbjXDe1OET0vYuOMnUKA/l29RS8tpy/zGrg1/0GCM8QNWIPfEEaL4w\n" -"+CSKonMazYI5iE4kaZQuygKXOdFqKxX8nrGK2hR0DIEUHhhiqyGMUKrf4ELkAJzK\n" -"tHtcO64OFEU2EGa72wCmyk2MhqhLxWxA7E00x24uvW6pen6xAkEAzHhbzlRgLZ+K\n" -"QuXmQHEqkGaS2Ccf6c9TA5Bf5S2/5zBl+OqVyJJQH0yrbPYR6Nn1NeSv3R4IDJYg\n" -"fSZLaVzWHQJBAMRCU6QtTnZoQ97pLvXCSKRYKJF+CnE3zDFTyoJrpK0W1FSnb1EE\n" -"DWjjdSdMLynf/InX+VOaLk3Gxwjme4NKjh8CQQCg2b4/HplayrsVzY3I/D2jw02Z\n" -"xY2RfYusrhMCU284DBbsLn8OfiuRs9rXqOyF5ZDFiNXgeROT8zYzvcBtbp7xAkBU\n" -"ZET9IvJLXjhZISItUXbVHIeNUIqC9sBaMbKx9EGioF97a2gliT2O7cgRtuPM+ODq\n" -"ETHILlNc5G3vuNRBt4x3AkBV98Y1SZA3TQlUVTsjGraxkFTfU1IlomiOdOwTQ+xZ\n" -"x+JxhhgZwZ+kgI3PidEufFCTZJ3WO6Wk9gk18Bx7CLjm\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXgIBAAKBgQDq/K7wNW3fcTbaRTjNZlM4W0G7tKeO+X0bca4+9uin3ML3ogNJ\n" -"6qT/B0QAZB6Vyi9kKa3E8plQkjmPuX8Q27zj2QjEuDZ12RGFnikeOosUhOYiDh3Z\n" -"T9CHnr6stozzgk79Xd6VI7bqRcgRwbY0uc9QVr6vwddyIfSploSpVcgspQIDAQAB\n" -"AoGBAJfUpo/sZc6uzxtfCKGmkPTj+ef3hSBbUZuu60AhtxfnC06HrwpOg0eJAUYj\n" -"aqOsHMziJTYQ7kDiCjE0UMaqxDNS5hueumznq2xM2mSN0nYoktU00kpANVkW4VPA\n" -"33TB16DyqlKq2/21Rs1g8/8+IKkKDbRLTC//1WqNHASQVoGNAkEA/+z4hxTVXZkr\n" -"9hz29tAHKURlqzxUEKLnS0eL+XGJRNfGJ+65eXL+gFiIbTnpVeidL1+lKWkZyYzl\n" -"75cNRdUHhwJBAOsOJ9mUOqTbLW5tzh18ewZGOa1JcxhOvf2E1d56N8tDK6lvoqkF\n" -"oUUb8kIweDxPLCVLCl8qFrbjn619fxDInXMCQAfEZGKNIlCd5nSoumIRPDZnagKB\n" -"aTe8CfMB7+CZLoZVWiE6IIzsDYdNqI5QFKHT1nlqmLOiCfNRAGV+GxwEdB8CQQDE\n" -"sHu4HclU2fMSTOAE3H01qt3om2WsGXfyBI3SNQMrG3IVvkymkwd4BQKbUGPMU5Pl\n" -"QP3U1CtdruuXCUSijrzxAkEAoqYub6+0zM8fakSQZcZ01TG9Fuo2xVFDCQsvqR3m\n" -"ZhRT/oinIvOxSh4fQs40bmt1RBmc2L1Is6YB2NTVQEBZDQ==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQCrf0rPvHYaGYQrc1ciRwaONs8TUvSVmUU98HMYXoFEkBL4CAGH\n" -"4oNHFk8kXHEOsBED0eccSYegWhqKHSz7PbjmJaXloExWrtx5ea3Twf8VTgcfDWQP\n" -"0TzD3G1TYjAFPQ1/LAZCpQFmwpMmTGGxegUhOzkpEWXdLVEVc9Uw4C4L2QIDAQAB\n" -"AoGAZXAJZA5pHM7y6nBynYe9TOkGWru6h7H8zsImkcd0VoWRcrvpi+JjG+0KKsuy\n" -"46kop0XEmWq0mhgxknfnX0QG1MKTqGMIUGN4qCaezOabIpCOdA4d/pr/mWoNgOWw\n" -"9Kc/tNCrKxPKsQMAlWP6ktHN30XRSlHgAjSeUVUiNHztvTECQQDUNin2nyIvj8ZA\n" -"QAsFW9qW+TiTkeUK6yiZ9Gvgf20gwZRWOe5/xnMxVvtN6v7Av1ew/l4VhBoj/w5g\n" -"ydIZk+2LAkEAzuJwdt+ccllG19qmEcbo9XFafgi2PvlEjPJmT1rHV2ns/7HIMu27\n" -"PJY36GgExSfFco6VmicaoOt+RKg+5acgqwJBAKQxAEjcGWQ5VsgRhTVxO3DChX7Q\n" -"TColhrWPwwPhM/s7K92HVzwvvKL5TNmdr9xMb7n3Ja56FouxZVuH6/J0XT8CQAat\n" -"Mhnz/3WFQg8HRGLAe5YoMVZt64u+uaKe1ARtlo9QoNBjqWVTXL6IzocWjEjcjrey\n" -"uEtARdC5qNqIX3dD3H8CP3pVCPvpHOTxkUaktmLYowSA1HSfO9wkE6bMCHhkLwXF\n" -"yTIJ+N7c5u5YN1B6hhVqpKbdnSv+K0MQ0xbfwOWNMw==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQDGQmrKfO3WovoXkOTSh/shO9qjbX4izhg4pccVU3Tp45v/dgAE\n" -"uDUuaa/clToyH5AhOtuazO/asC3ZNajg1ia5VPzmQU3gtqiIZIEXFaOovPlOrXru\n" -"wyQnxaGORndJwfDXicG6bUwI+PDpNq8c4VOTujReeF0r74qMSc7TQLVlUQIDAQAB\n" -"AoGAakR/aTm9YibJVohbnl00xoOGlcLCsXU2lmaFZ3DsYdGWdD+TkvQJzW7ozJtQ\n" -"Lj2sy6L4wujGR7nXWW3hr2IaLpoc1UoyJpieAZM5os6bMN+N4MCqdcZMlazMtSWV\n" -"UDO7O7xQGFpcvvZmnfKCyluFaJ5K/tWxP+2TnS1/m0BDRIECQQD5DYvToA0eKBt+\n" -"7K4eEI8pzDot9NlcL21D86kNgpmuY4pifALU7GvXr299JpFFiYa2A1JVRfpQaoI3\n" -"hZzz0ze1AkEAy8opWJP+T2q4reD5Qq5UjjrHUXFID23KeJEjh5YF40/bHqyVpWVR\n" -"UMntNgAzs+13vRij48Zn6I8GRhStaQ3ArQJASPyFS8GN1paeaDXoWPs1WWR2cF1f\n" -"DbsAZHeVxVXOv+J//ZimI8wdVpodLCoPTLee+NxEVqUpVEPCYY8QjgwKOQJAATmj\n" -"6f5pxvxzQ8hYd0gpBfngfOLbdgxI7VSiDAyg2G8AeDy9YZMsW/n6zRpPNUO2NpLR\n" -"WWs18LX7aaxyJnGIuQJBAPPfy9pd4XEFsRBIIe3N23Gua1XkS/407RJtAGm73Vrt\n" -"QhtWh3i6D5gfpEApMoaE8aaQQ7H0z+0Uh1t8SWesy10=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICWwIBAAKBgQCc/M/X8etUqrxnmH3PyuAYLIPZhwNySch8qz9NB47izYjxzuBG\n" -"GSls6H7WeKIrB8UJY1gW8TLkdOLcrI/0hTANNHEPaueOE0xdABFj7tAaiiGPIM25\n" -"N0wc76me0ZAMYJrZTHk8JZK153y9wInYBwVZreXCVSVf11RuVwe+iFQa5QIDAQAB\n" -"AoGAQC4XJtivdhDLL6snHFF7pkZkrQTGgu3pOhakrXA+mTigGQOTqvTUe8LdP/9X\n" -"hTIK+tiTheWcAcxLhx5BSB0/VDKjYhS0ROpTc33Iq9KalOQaTJbBYGA4eagpQjwU\n" -"jGwr9u2sUsM9WI/Jg0VvLSKhfnNwYIUzLpK3BbWb2qAdh+0CQQDQ2s/8DlibFSBK\n" -"UsFK7lLpV8UgMk9CkaNM2BPzI8Hsjpp6s3pULVRd36m4YTSg15EEHv7bZ1N/+krX\n" -"mXb9xUULAkEAwGy5wHsUSjTK+kntkNXjlCU/+9R+HFpzg9Bwm/PqXTBwEWeU24hV\n" -"iRjPvqPtWFZrWi/nfcviuMaqtdliw1I1zwJAZ2mQxhtMYC2LuYFUWAe9YfClmJWQ\n" -"jUOTef8bka5I3RqW/t5TWc7AEWMnpDXtWx6hnUrDolt9Cschu7MvKeQ9lQJAL18U\n" -"46PpPNN+XNuyVoOxgRkihVasrUI/SeYYsuv7eHGiRUagyOLpW9T139LvbV3pE8zT\n" -"So7VA/Q0towL2lX01QJAGcoBNNouSpum9+5NvGQK1XXsZweawE+pFR2BE5XcjG+n\n" -"FnaLEUBX7nTxhTU2cSQET1PKRNp568a281NEna0nxw==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXAIBAAKBgQDFOqqGG/VtIScxayZYZ+BT+hcs5W1bD5qRxunbG9O36UVT18UE\n" -"CWw9HUf0Q5sDMGvVmBxwZ4GjbR5FDPfhIXaRCzobnejJXq/0k+O5NAVkcSPtJvhK\n" -"AaUqBrWA41vnjKOtJudTsZLfufKafzYwVonze7fXGyVsBRjVwHNS4iqq2QIDAQAB\n" -"AoGAJCoStI6R3RXUKvKb0GATuTJFZ50WBTmCPTK9FMkwdCuY47vPy2Ky7y3cUMTI\n" -"urf5PewrYs0H72CFyWGMXkKVi8aOYshsATEXMfGSqOcqXn+UDssRzvabZFlpnAUa\n" -"WDVt/iN092AdakXNna7/DxrLisDpq8HHJfjtlWGPfkXRg4ECQQDpHeKimTvwJcPc\n" -"iDa6Qb/n9gwLeRckfzhYtfX1luJYLIOHh+J9vjQN75thenBLQB/B6qlKtOn9ejxg\n" -"5z+3zIOpAkEA2JbxXVTCOA802p9khvHxDtLHdKi3w/BjjJiC7Mgqo69ZI+s3PB9E\n" -"F2HJA69kZqpGqvybWHDapjWsq7rcMlxrsQJBAME2yvR3y00VEAyGPc4M1vF8ZqlP\n" -"uRW/+ETWtEDUyU/JvU6lGt2bu2tdkEyv/cjxIiFIzP4litdT7B1pLc+6S9kCQBwE\n" -"usiWFGHoJbA6emiyl7qRLdg7kzo3uMkRWa6D3nA6WM+6t/SBHu/faH+fit91G5s2\n" -"/mmcf8yMmP/GNoIVTqECQFl4Pt6yGiz/YVoYSp35ljY5n3JB6T8o2pOmIrRLuPmT\n" -"6kgyygtJBAmx5nnQoeG8n08tl9QakWznKzkNJ0DIFKI=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQDCaOqJ0lsSAEBcnNB6X7BvVcEcol+evi/nJsPe0uT1SbtW50Ch\n" -"vYOHwK6aQR2C5x9VSs47cLynTL7tNt5d8oeryF3NpI8VTPLImDJCcvUZhS7p4bxn\n" -"JO+Wm+D/e3TWfyjreuWtdL+Mfimw2gzwWuBEtmj51GzQ89eYm7fh11SB6QIDAQAB\n" -"AoGAWaakMbZNxPlUtOCjyysBY/Y5vYira7rswD3CKak7aFn+CE9QIMYSN7IFUqEg\n" -"iNMoQd7jR8nvVX8wtJeO5+gF48W13C3n8FZSrW7c5N3bmfMIgo0xa/TGfeXHP98o\n" -"7vhH0I58j3ZZt0Q+3wTm7t7WPE/nJzgrCk30TqmoaEmstTkCQQDtV6YZ6juEK2Lp\n" -"LGUiqohcS/WJxvFrF5+LNpk86Xdgomf6FphZlkq42KYkvl7qibKDcfDqLKTbHHle\n" -"vQQeCgZ7AkEA0bFHi7F8o4iHtKleBvt4QCj1neA0q3CRDypCI5EqFSrNpxY4Krhh\n" -"WYSVX+xT00QYaCpKKWfYQztCw7Anylv96wJACl86Mwe5ch0zRV1bThiFvQLUyCCZ\n" -"jESMBFlueOr6/I4cXSF/puqaeVl+aTyoiTdbRcNE8/bffXPRGgLIm0d04QJBAJSY\n" -"lmTN789Lby99Xh6AkaSV4ghw26Ip8QHYJmph8npxjK69Niw/4Oy44cnKBVUPSmR2\n" -"o3tYFY7/Lb7S1D+4lOUCQQDbMQUGVsZT+ZjuOG1bAjIuXoAOfOd3mgH5VgQHjSgJ\n" -"ourZtlJ4OUpNrq9IfWqPkM+zSE8+0Dk8/9MS5ngBA/SJ\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIICXQIBAAKBgQDNbHjwg+7tVNr9erMLowXRnIcttp4pUJbr3B7Jo/u+kD/Yo3F3\n" -"4rIKhHpJl1uEHP1QmvAD+4ApFFI2hNG54xYI8dGflxL5HOs5xxyOPpkrwzQ8Qvnv\n" -"LPg7Gf6PAW9zF4McG4wK0TkrV28G6NhqcPs5VFY6UyvfZ0fEdWAeoWTIfQIDAQAB\n" -"AoGBAKOmkMp7MLLd8QAS6eSRYSdWHdLrMyES1MjduaFGBF4SKOr7en/Zl6ENXSaX\n" -"cA7V0XCPnjpt9/HCAKTyNupx4LCeFWiqdu8VGXhlzX8bdb896OSR2brKbxgRY5tF\n" -"36uL8akrZdrYgocykQCxmRARMB7/rHwDusiamjL6RUZ3+c45AkEA6UPTVmKZQRMr\n" -"A7Qgg5nXrXo9117Lpqf3FdZ1wdni9V59Ptf5xrx9oGZNZzctJPXSAH4M4cumSJrV\n" -"sZ1V8qE7AwJBAOFx+5luLrVKrdlG7MyOhTAdhKYUvKIvL4wvVSY6y+L2nNEx/cTx\n" -"KYbxGC+H1RJbkCS09rYir3VfDRWQ3W1c1n8CQH+X4hn2hO3blkPIW6CgniD+JKWR\n" -"7MOUTMtdK7yFemfM76VYbgAPSohabSxwOfllnSE30cQQqTw9tXYaIdE98BECQG+M\n" -"QWxSS0QillB6unIgVqBPCrJOcmNhK4qWZPBMiVNcqI0Nyj2nAeAl7MyfzfqOWY0A\n" -"CU5nbR+LD2NLUXRqSisCQQCN3IGv1WOWInmA5xhU6vCFDX5u48Dcji7VLJO/Nv/i\n" -"b/zHKAgjHk5Js7bi5ZWEGaUgA4Jt6cKmGdERheqTMKxx\n" -"-----END RSA PRIVATE KEY-----\n" -}; - -static const char *PREGEN_KEYS_2048[] = { -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIIEpAIBAAKCAQEAoksI1qIuIaFCqT4QbgDvOQCmr9Z9F0E7ku+U5Ep/5dWNANqB\n" -"bSzAOq0+cxiisfF+H4desoqiWDUwlOwXH74qD3ZsbChhvFUD78cQBWQkF+whLVHb\n" -"296QmF0LZqosqz9HMS9CdoMUc1brZb78Hb25QIOOjrg25KYHLZHaqcet1wfhHow6\n" -"Uehc6QTuWgOWFhJnfiXzYgen2o8lnLixxZozhk7Lm7Aix9ur2ckXdQ2Wgny4xw70\n" -"JW84Hapnd8oFUD98XXrExk4VFuIcA8qo7r7y18II6wx4Cw1suKru6bhW65cM/y51\n" -"KC4lB7VkvuoJCelRFdM1PfKZLv2tJP63oAqJrQIDAQABAoIBAQCWc38PEqw3avqU\n" -"UMAEaoNa0bq1Gd8/Nq8WqVnbRSFKHO2pk+cWIb1W6BITuwvgcGKesezdEV4s7apK\n" -"9I7/U1hEm2Ep50mrwRh0KZM1nD9Fmharn851Bt//D4qpMytT2caS1yADI8NKpZJ1\n" -"8VZh7+cT4qG+txHUaAIRgbw3VrBWvTIMu6SOSOZm+e3eOr5UU3du1KvjdJHJ2c2k\n" -"TceHvUdKxV7OYt+BBSN1oBOhs3ajUSRge1v3twRDg3cmbwG0DeXvwHNhGUTcF8IH\n" -"JO1RF5njbkFvyqdAi3ltjU41zYd4OMuPtrwzFOtxUjKT62Soz109HUXXE2CGKFPZ\n" -"PVi5/BIhAoGBANN1xqS5BgHszIB0nXbw5ImYpTRmyhO0KsTblBT9+8Q/B7BCK7bM\n" -"zl+dOPeyvEadSwE7RSMMt6CAlTakWIf3Quw/VZajvXy9C9/LHf52pEKXjxMFMPKE\n" -"aGLHpQnwMtDi8/H8AEAXxI3hpxB2KVR7sAYHWihSGjRJ6oPGvEmKEkb5AoGBAMR6\n" -"G2PKz0xk1vFrjfjSY+y13gH/t7xHaXUggjggUSGKaknQh2BDUllXjadeI0fi1eLW\n" -"r98ZImZZgntAgjaIZ4bAlooTDk4gRHaz9jI+z8lsRwOKnWdiigM7txiXZTMVwMqj\n" -"o5mMNGMA+A+ACkTViRHmkDI7S/9FqAvnbOqVwgFVAoGBALUcY6WDvwx5B3Jh7tgH\n" -"XIYpEh3+h8c2gYcX1g3gtvkPTwN8uToY0gz8eOVV1YHZiHsmi4GIi+HRH3usaRMT\n" -"COOVHzYlSc8Dj57+tdLTRL6wVl9hC9o647ju64DGlI9qQquYPZKniLZIdbFYsu9j\n" -"/JA9Tc/I+h6czFpPJccKlbrpAoGAAPWXrKUQ3g6f/g3IY66jTkSVEO1uuDyhBzFh\n" -"cWS3ALLsUe/yuUWa4VTMHEUZZwB0iucBdNVqlZVaTb/C4wFHgCDwmzv8leUScIHw\n" -"cc5ctV8R+bJzkk2o3tsrybLzi4xPpK2n3tgQaWtXyruVUUC5qpy1l4kylcyBRY2b\n" -"uomAqQECgYAiCNWtuWIDlRBcvtIB+kHguzcoFT3vTCCNhalTEn0zi/tbi+voQgVJ\n" -"SDJNptZv+6vRwQ/HfcQtljKIPO6hUZPYaFWRNhgbh7Ay85lRXYXQOottE8ayReBk\n" -"zZb0fl853Qah4DPsaOugAvhjjKeBmKg6bFWO1z6hj18I3UpDf2YnVQ==\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIIEpQIBAAKCAQEAssO0r37mSJNAkc/ISwXBsu9JjyLeWlsHPAhylQGkSAdp2rjz\n" -"E6AT0Eh3wrocNO31I4pvHReAuh1QedGY6T1cQwO/WAAhQtRCBQDK12qWRgfbC11y\n" -"Xu7zNYPd1Z7YIRy+FxhbL5f+lv3rEUv0HUG5c3CWhLtbANKg+jOieIDzA4Yp1s55\n" -"ynodQBUkTZrwQiT0P8yDSjiasf+clgJRfA1k2XK12KSAMRgyDuPTE4OtBxBvUM3L\n" -"Zvxs81PsmcOuAG4DLaFTg2a/QkCjt2VC1SYYuh/LVxpL41FFh3eMoK5g5deHkgRe\n" -"tlywKjAHIDJu/qgNzNgNW7ymwn2CfBvry9h0/wIDAQABAoIBAEMZ4wDdCWPEokAZ\n" -"Vn2Ss5qO53WrCPuxn42RPjFgZGIFJl7LfbKoK8fK6+lUIrJbf+DPXdX1tIQn7MVN\n" -"P7CNL8yX44MMyW9kbUOjgIBLqgyvdjFV6lBoMTKtRN+iuE31lATnR5Md4pqaxVnA\n" -"wOkaepoycM1x5j7w0SwZparF/HIdkYv0y/MysqT9ByupPA4Fqp/iRSrosHXahNtI\n" -"KZYj1TyERYtuDXq91P4dr/pWq3FmDNI8O3upblkL0YouvG/ZlFLdiNy77XbAyWcX\n" -"ps3YDddM+vECnXO3+sa3ZxgBYvXJdWrrIzM5A+jCkDRZQGsFAzK5I5/S7C2ljt6i\n" -"SmzqvMECgYEA16bGy2XTi6KBPb8aev/OBgK9XuGLwUqK1m15mS9Y2qPHmuc22qaZ\n" -"hw6zginPFrxAEtQWKanhZy4aVqlLkDPLwRnyeuMo1EZAc5B1gZ5ViSAKxBq99hA9\n" -"eqyakdb+IUQsEnRDxSc2gqUQ0EagksUyw5wGG5Q/CVEALmS/r1SU3KUCgYEA1DYf\n" -"6JYdzuRtule3vYeWXKf8sOJpdplgWV7tvLrKkQhdE564uwMCYB23HvYfwWqEdDYG\n" -"fsYg/ur/stk9MDZ3wZKffTEM8V3sX1t1JXnC3ogSAgMGhLZ3ILOLqkoO4BEZJnsS\n" -"dMdiNijlAtQkqs/BO/UVUAKysCtKP3v/+1775dMCgYEAvLjGFjApfnSbV/cK7IM6\n" -"wEXbhdIqZOCgOeEaXjVyM/zKbMRVW+oaR3hVHd8KzSG3jQKv1oxFpu9Qu3ByoWLC\n" -"uF3Ft0debs6ADuJoAyQWROeWpGGmxlUWCGpO5rxYL7KiQxAeUsXrTU+5NBvq4CbV\n" -"MxwyuCX3OGb7mp4upfiGQcUCgYEAuhVsDYv1P4LXJVvd5viKRV2ZG5KuYC1Ga5fu\n" -"aFxzXJI07At2eaa94oKsHR494mEBHNZzA5/BN0fiSHZuTWS1xqxH5oOokc6Gg2ez\n" -"ZdVLp88x20nD4YQPGkHW6tBeEuVrZG7vVC+yU0Ow7bYRISdkjqrusWZsQkbzqI+X\n" -"fFliEbkCgYEAu8x+47M1ordbI7NmbBGyiyP0r7nMRCZ+KEvGeCNYracWmsnCNnfV\n" -"zR2UzmwtSainw3Ho8Jv/rWDC8RIDauyBRYEi2VqOnUzT2ca0iymQyLeBCudAQuio\n" -"drOu4JU8RzZ3Ad6V3DNFnaqmX/7GA9Pa2GI8NJMyb8p1GAGv7Gi8nxc=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIIEowIBAAKCAQEAt01S8JuEwWy/Hzb90yO2O7oGWq3GfvfDpFOF4OQnwG3kQ/BP\n" -"4MoPDCYHdqb3iI9aD3vykZA6Q8zpdfGwjm4+bHrgRdiSmZWv8NvRwuQ5Ji9xbiGn\n" -"hA1XwqH9hvgFTiy6tRvirWSJ7kzH3Q/bEGpCbHUQkwMog4v6yCNKNrjlwjN++eCi\n" -"gFK/0RMOJMLOs8BD3zY+lKjd/pd8LBRujkMyUF5SryeRueAFjD2sq4OXq8DPABGt\n" -"zdR6vbTcsi4JwP1Q6y4x0/LIWEprzzewNU63I5E2zj0WnoRGAIM4aF+VuqcHjWUx\n" -"VWnyLZldSen6lScZ4xj4seitiDbSFvtFkDF6VwIDAQABAoIBAGTP9im2ntDyyjqU\n" -"uA0DuxomOZBtupniEouyFBOX5/UBe2WSKZxsBNKdp8UuFz3X+aRCeyprtF/NtyjT\n" -"AFOVdmebPPWtIxOtK9LAUyFo+7VwqmXzxHnwDLBS/2jXx7MzDozFBWpvvRx+xf1i\n" -"1wy0JEwaJj90oTeYKRkhr5NhJZwkX8zCNYaemBd3kHB3aGWGJasI1Y81UezeRKCn\n" -"hSbn2CrWalI7pyJ4lsavM11nIq1Eu2ZthJiNCMghbYrHoBHd+iVWiCYchP2rNEWV\n" -"sdHtaVHtQ9zdZ43bao3OzPu7lAjd6UAbxsuhUe+a2YdDz/+Up+6+BvQf1FCfYIjW\n" -"KFUdCoECgYEA4t5O+u0V9gkMUhKsevYb0zgc7O/mo8ivN+V++EpAtL0mhiwxeO8p\n" -"oef0szLyhdULQeLN9pJQDCeAbkGdwIe3L+AKU8o8BFGEWLFysZjMg9In/UTrp5MN\n" -"mMDy2SRKKu5BqsvdYH302xpZfHq1T2cMNDWE8lrZffduH06Cgq/XEtECgYEAztbj\n" -"bhFneADnrvk609VnOQvoQEjySeCQKFQFRRI6k/FguqMisL2IRXnMaWammosdeCAg\n" -"m7eZchnszHIst9cwZUKXUFqmAqeDuWSNdTI7uKZH6nT/A6IDlgdjaHsqhvpK0Ac9\n" -"ngycdHONitOZh0ZG74pdWjf828Dwzf+CuYjl9KcCgYEAmIvI6ZqvkJ8m5Kzfw1Jn\n" -"BVCOypbJK8oOX3R2Orea6KzjEYb3wQx3nwFcHX6danYFOskpmqlpH7MT/Y8rZsEa\n" -"4RsxdoPedTzm08iFiXtn0R9nejp0hlov402iPXXUVSedih3IflBTa1w9XaEY9wog\n" -"P57ZBSknYzcTmgNtaDiaUnECgYA5sWauhNw/dMEq5QmrnJK2LsQRakdqo+CR3x25\n" -"LmR4b5Nze51pfvRLrLV/kMpXwQXvQ8bUqFl8og6S2CXxAWzWUcSy/RXhF6h+RbXP\n" -"Qru1vWvB0fBvqvklF9p6giBSle3YKKzfMNVTBggs+OiR+uA+YHG5gHRfN2nzi5mC\n" -"9tRtcQKBgBnDSi4lRCjRe9pPnyAYaa4iyBUGhjPysScSLY9orel89+qmTBQ/Py6J\n" -"0+sefL4ZJaOsuaR2mSSPP/lbSkF9DMFs4tHbBqY+WkVNYLshAkauHwqv26HTVCSd\n" -"QKzeb7uZw9lNaRIzDvy/3wfCLvXfdDozPFrOUgkyaBN5pJSA/4sv\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIIEogIBAAKCAQEA9qtiDoJWqU/eSlpj381eG6UcDzfMguFh/q4e4s7QVdRYj5J0\n" -"Msv0PCkti8JHuvQUyncRpOPccBkhNbVjNbjIgw1pHaIZNdVotUDhP0kseRyJ6z3M\n" -"qbZ5qKn+0mHjVjPNItVDDe6tebYMT1BZpVyRrCOqY2v5z1ecLC+ReygmHgDpzg+L\n" -"0rWfIxGT10IPZ8pAlcdEn6xt5aEhi7mPCX/xwqfQChPIJz6zVLEC8UaPtvDBohPR\n" -"6NQTBTeZZAAtzrQ7+oNxfz1v6Fz6RwMei7Q+qOBnMiwpQmbcDBKABM2RnXSpD0LA\n" -"1GR7/+CiV1HQoShWVvEwrSIlM6jVAJo6iqF6WQIDAQABAoIBAHqwcdxPnfUm4aTP\n" -"4r9NcZKEhDlZgqJSoiA/0OL1BRC7xrTanmspoLhPrvTF1FG715+Aq8j9AQbMqQUC\n" -"zG7LEwiEIhV4K9vn4uXMeHy206UFud/E5EhBl695pmJUB/Q3XcAGnQyP+77++o50\n" -"o7IpIdeiAbzj1uP3aplbq5u7M4JV7fUZWA/368G4HolqFTxcAfBJ05GXlp97BBwY\n" -"AnY3/pNrKMz0NiPf3nsJHYWK18up0JCLPL3tomc94wuNZ66spIazHIL9aaKY0q3V\n" -"LkBrelndfYM1m4xRTnSOy6STu0qKTPOpX0C8XBLYs6uiXjRsChqSYwndCCeASaH3\n" -"LGNIcbUCgYEA/m4qvt8tdT4wEvnE+QUxEELmBtT4UFa3NnQISrzNlhNeI0Zd2xlp\n" -"SG0/pcw83mG2uX+V5xSaWL5LYfLBkvy83Y0yIWgYbbIkyyCOUZnTpwaDGU/FjWip\n" -"3TfXf5qpAgiez94sV+MsFpKfG05yxJh5u+3sIyGTVUAxp0HPx4LVgbMCgYEA+DD1\n" -"fu6ttpuV1UMrsFdjuk6gBvSbyJ9OilY2jT+yE7hSRc/yP3O9ikuR74tNlVrWTnO2\n" -"0kcYbyLJXE2cGUC2q5e4r8TDGiozNfQ7/OC2M3XaJ+xJk4zMf/8PuDDpWr+18ZXA\n" -"Pf+ibXWTFvZ6ZeUmpbrrfCrXdvmIZnwVuOI0FcMCgYAZn26emksxq3mb75tumJ9A\n" -"S/xuY7Q+Iv2Adl7/Z9QscPbiBowdLIn1yUrHn7Hhk2WbeMXX57NDjKZ6zr+/1cQP\n" -"a9DInHsZUP9zlWu/vAYcpAM/4VC71PaGWMFTEHhExCl6NZ2xnCcsfseXMGdOdSyN\n" -"SICnaRI1W6mkdnQ+W2a1EQKBgGEKA3KVr6XuPy8bDEHuaTe29irCCQbwAq1j+ABS\n" -"HzZGoyRYocbdYgZoda7LMJJs6c3SwHCHC66oU0KbtaTKAKImuDdBH2djiJJX4/yD\n" -"f7mvIpTpdfsS2gJRn7vMo/CvdFv4ySl0gfV6OwCHbmPYrLuv0dLCjWwfNI2dhoC7\n" -"MNIxAoGAIPSIG4BrShzbeX4c2L18iwIg+NlOcUbtl0Ccr1t6uLGI+ge/6I6T/5XH\n" -"DPKqYIf0IRYV8suxpfQNKiz/C0NPffA1d1M2hvuAg2v09o2cSwvdcQwdmakKZ5bl\n" -"sdCuYKdCIwomEUOz/4XgQrJl4XDUqxftJT6/egAjWvcIYvfNCsY=\n" -"-----END RSA PRIVATE KEY-----\n", - -"-----BEGIN RSA PRIVATE KEY-----\n" -"MIIEowIBAAKCAQEA1yHZMsgRLckL+v6rgpGq9qmxVBNDxeuul1V/QlFyOlcAk5n/\n" -"uduTalSqGQhc4NEePMxq6nFui4ucpkZOozmcEnhV0N9jld9IB9rLGt4erdg7RKl9\n" -"+gQ+zTn69j69U36E2I47H4dM69uxeSOyWP2Odxpw+biisa3o8mMz1zCmuj4GMDtG\n" -"DlnSpthFzgQR6N1pbvxLXrWg5F16GqFiJOD7kXDfy4/l6kB/mDs1T/3r8kav6DqR\n" -"c/t3aQZxgWGIpI7hc9Qgvp7coZRMey5dNOZEna3tqS8dn2tZlhkpYV5uyFUjmxjG\n" -"TERSULQ7hvUqW+eshGGsnxFtL7ANnTSc4xECowIDAQABAoIBAFhJJMhpQFuIySjd\n" -"AGeZ/g4x/3rgWQzNNp4WUR5XLEhy0eLA7ShJywp06kVRoEQGraEHxsyldldAGS5H\n" -"ZhgoGTufNKB+PHER646FpJpHE1IGjfQUloVW3qr8I1iQ0MOGBWCVpf+/V7rnMsLi\n" -"+lr421FXgYuJ0QKXuyRVv72M0q9U6i+ml3aVAhgW/19oFg+dW7YccX+9iVyD05Q5\n" -"KR64tX8xd4wrAqfAgYA3erbbE6GTyHYD5K54kIgfRr/+pIU4qc1L7XOCblnqc/rI\n" -"BilFysEC634r2MNe66uQvNui4oQTfBcFFlXg0zAmp7d5QE0ApOL6HpCsmbImm2uJ\n" -"sdFNYyECgYEA716kfEv7HfnF0P3pAP2AOuEsW6t8q0UtWvnHrwRQXQw8Yv90g7kD\n" -"pUV3/BjD9VQgsQZosbdSn5wbT4j7dypRdrzYk+8m/hBk4Q8M/tWoRGVOn46NudvK\n" -"/KX0A4ODLuulj8yAZVc7CM5Cdy4GCGJBVO+oVvBUAnHxfZziOyqBw9MCgYEA5hQg\n" -"HEORzdxvbbfAx1ggvH1Eg1lqRhmpI43PpRkaoqb8jLwXb2CyBeuv3RBft/X2Tr6F\n" -"mHpe0U1kN/5YEjii/Q/jUX8azIHaUNNSAjrriEeMQZOqFxmhCdiyeXuqg2fbFbhe\n" -"K3Q6/fsB1xj9OOSwyPMqm/M5U0LsoGjmg8TFE/ECgYAlImKUIdlwOgp1NJ7MF4eo\n" -"Gryd8AmkLFQv8+YFgb7R4I8RsJ2rva0SG6fUhScJTSbRL7RYNZ9swXP/L7oLL5Z5\n" -"vCxBLu22pmZv/7y9X/n9ulWrLRtRhQaFkV08mk9knQwPNeOJVTIEWLM49/vZmxyV\n" -"h6Ru8FOoGXMkUI1MLnj5HwKBgGJLkNhiacVYeuaWDa9c0EeXARFYvxWJ2wAMkvzG\n" -"9+ErlFQP+7ciyYvMAItidnJii8NilDLrfNzQwpNFf5zxQ3j4M7bapblfdMT5M10u\n" -"jPfhEWPm0VEjKvDI+p76HYQcd7YU2W6ZLqbZeRTLYUvQMFL5yGduBzyyJ+P0TR9Y\n" -"jpYRAoGBAM7vYGTprw4w2tTZPFICXVk1bQ0LO06oNRtwkiQTUT6UqPjWMFyvHnmN\n" -"11SVVBmRZ0RAk6e5eZLFX8WelJ4J4nSOGRcJheCtoEFlO7D1ewAUSbqWJ0pBqp2T\n" -"gV4oCS8LYe8zReVoYZJjuLwoHvxZzs/hUjc3SI2HRW2W/HQRPC25\n" -"-----END RSA PRIVATE KEY-----\n" -}; - -#define N_PREGEN_KEYS_1024 ARRAY_LENGTH(PREGEN_KEYS_1024) -static crypto_pk_t *pregen_keys_1024[N_PREGEN_KEYS_1024]; -static int next_key_idx_1024; -#define N_PREGEN_KEYS_2048 ARRAY_LENGTH(PREGEN_KEYS_2048) -static crypto_pk_t *pregen_keys_2048[N_PREGEN_KEYS_2048]; -static int next_key_idx_2048; -#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ - -/** Generate and return a new keypair for use in unit tests. If we're using - * the key cache optimization, we might reuse keys. "idx" is ignored. - * Our only guarantee is that we won't reuse a key till this function has been - * called several times. The order in which keys are returned is slightly - * randomized, so that tests that depend on a particular order will not be - * reliable. */ -static crypto_pk_t * -pk_generate_internal(int bits) -{ - tor_assert(bits == 2048 || bits == 1024); - -#ifdef USE_PREGENERATED_RSA_KEYS - int *idxp; - int n_pregen; - crypto_pk_t **pregen_array; - if (bits == 2048) { - idxp = &next_key_idx_2048; - n_pregen = N_PREGEN_KEYS_2048; - pregen_array = pregen_keys_2048; - } else { - idxp = &next_key_idx_1024; - n_pregen = N_PREGEN_KEYS_1024; - pregen_array = pregen_keys_1024; - } - /* Either skip 1 or 2 keys. */ - *idxp += crypto_rand_int_range(1,3); - *idxp %= n_pregen; - return crypto_pk_dup_key(pregen_array[*idxp]); -#else /* !(defined(USE_PREGENERATED_RSA_KEYS)) */ - crypto_pk_t *result; - int res; - result = crypto_pk_new(); - res = crypto_pk_generate_key_with_bits__real(result, bits); - tor_assert(!res); - return result; -#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ -} - -crypto_pk_t * -pk_generate(int idx) -{ - (void) idx; - return pk_generate_internal(1024); -} - -#ifdef USE_PREGENERATED_RSA_KEYS -static int -crypto_pk_generate_key_with_bits__get_cached(crypto_pk_t *env, int bits) -{ - if (bits == 1024 || bits == 2048) { - crypto_pk_t *newkey = pk_generate_internal(bits); - crypto_pk_assign_(env, newkey); - crypto_pk_free(newkey); - } else { - return crypto_pk_generate_key_with_bits__real(env, bits); - } - return 0; -} -#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ - -/** Free all storage used for the cached key optimization. */ -void -free_pregenerated_keys(void) -{ -#ifdef USE_PREGENERATED_RSA_KEYS - unsigned idx; - for (idx = 0; idx < N_PREGEN_KEYS_1024; ++idx) { - if (pregen_keys_1024[idx]) { - crypto_pk_free(pregen_keys_1024[idx]); - pregen_keys_1024[idx] = NULL; - } - } - for (idx = 0; idx < N_PREGEN_KEYS_2048; ++idx) { - if (pregen_keys_2048[idx]) { - crypto_pk_free(pregen_keys_2048[idx]); - pregen_keys_2048[idx] = NULL; - } - } -#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ -} - -void -init_pregenerated_keys(void) -{ -#ifdef USE_PREGENERATED_RSA_KEYS - const char *s; - crypto_pk_t *pk; - unsigned i; - for (i = 0; i < N_PREGEN_KEYS_1024; ++i) { - pk = pregen_keys_1024[i] = crypto_pk_new(); - s = PREGEN_KEYS_1024[i]; - int r = crypto_pk_read_private_key_from_string(pk, s, strlen(s)); - tor_assert(r == 0); - } - for (i = 0; i < N_PREGEN_KEYS_2048; ++i) { - pk = pregen_keys_2048[i] = crypto_pk_new(); - s = PREGEN_KEYS_2048[i]; - int r = crypto_pk_read_private_key_from_string(pk, s, strlen(s)); - tor_assert(r == 0); - } - - MOCK(crypto_pk_generate_key_with_bits, - crypto_pk_generate_key_with_bits__get_cached); -#endif /* defined(USE_PREGENERATED_RSA_KEYS) */ -} - diff --git a/src/tor/src/test/vote_descriptors.inc b/src/tor/src/test/vote_descriptors.inc deleted file mode 100644 index 895dc6c65..000000000 --- a/src/tor/src/test/vote_descriptors.inc +++ /dev/null @@ -1,94 +0,0 @@ -static const char* VOTE_BODY_V3 = -"network-status-version 3\n" -"vote-status vote\n" -"consensus-methods 13 14 15 16 17 18 19 20 21\n" -"published 2015-09-02 19:34:15\n" -"valid-after 2015-09-02 19:50:55\n" -"fresh-until 2015-09-02 20:07:38\n" -"valid-until 2015-09-02 20:24:15\n" -"voting-delay 100 250\n" -"client-versions 0.1.2.14,0.1.2.17\n" -"server-versions 0.1.2.10,0.1.2.15,0.1.2.16\n" -"known-flags Authority Exit Fast Guard MadeOfCheese MadeOfTin Running Stable V2Dir Valid\n" -"flag-thresholds stable-uptime=0 stable-mtbf=0 fast-speed=0 guard-wfu=0.000% guard-tk=0 guard-bw-inc-exits=0 guard-bw-exc-exits=0 enough-mtbf=0 ignoring-advertised-bws=0\n" -"params circuitwindow=80 foo=660\n" -"dir-source Voter3 D867ACF56A9D229B35C25F0090BC9867E906BE69 3.4.5.6 3.4.5.6 80 9000\n" -"contact voter@example.com\n" -"legacy-dir-key 4141414141414141414141414141414141414141\n" -"dir-key-certificate-version 3\n" -"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n" -"dir-key-published 2008-12-12 18:07:24\n" -"dir-key-expires 2009-12-12 18:07:24\n" -"dir-identity-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n" -"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n" -"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n" -"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n" -"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n" -"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n" -"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n" -"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n" -"btUa4c+cUTjHAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-signing-key\n" -"-----BEGIN RSA PUBLIC KEY-----\n" -"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n" -"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n" -"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n" -"-----END RSA PUBLIC KEY-----\n" -"dir-key-crosscert\n" -"-----BEGIN ID SIGNATURE-----\n" -"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n" -"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n" -"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n" -"-----END ID SIGNATURE-----\n" -"dir-key-certification\n" -"-----BEGIN SIGNATURE-----\n" -"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n" -"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n" -"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n" -"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n" -"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n" -"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n" -"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n" -"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n" -"-----END SIGNATURE-----\n" -"r router2 AwMDAwMDAwMDAwMDAwMDAwMDAwM Tk5OTk5OTk5OTk5OTk5OTk5OTk4 2015-09-02 19:09:15 153.0.136.1 443 8000\n" -"s Running V2Dir\n" -"v 0.1.2.14\n" -"w Bandwidth=30 Measured=30\n" -"p reject 1-65535\n" -"id ed25519 none\n" -"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa0\n" -"r router1 BQUFBQUFBQUFBQUFBQUFBQUFBQU TU1NTU1NTU1NTU1NTU1NTU1NTU0 2015-09-02 19:17:35 153.0.153.1 443 0\n" -"a [1:2:3::4]:4711\n" -"s Exit Fast Guard Running Stable Valid\n" -"v 0.2.0.5\n" -"w Bandwidth=120 Measured=120\n" -"p reject 1-65535\n" -"id ed25519 none\n" -"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa1\n" -"r router3 MzMzMzMzMzMzMzMzMzMzMzMzMzM T09PT09PT09PT09PT09PT09PT08 2015-09-02 19:17:35 170.0.153.1 400 9999\n" -"s Authority Exit Fast Guard Running Stable V2Dir Valid\n" -"v 0.1.0.3\n" -"w Bandwidth=120\n" -"p reject 1-65535\n" -"id ed25519 none\n" -"m 9,10,11,12,13,14,15,16,17 " -"sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa2\n" -"r router4 NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ Ly8vLy8vLy8vLy8vLy8vLy8vLy8 2015-09-02 19:17:35 192.0.2.3 500 1999\n" -"s Running V2Dir\n" -"v 0.1.6.3\n" -"w Bandwidth=30\n" -"p reject 1-65535\n" -"id ed25519 none\n" -"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa3\n" -"directory-footer\n" -"directory-signature D867ACF56A9D229B35C25F0090BC9867E906BE69 CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2\n" -"-----BEGIN SIGNATURE-----\n" -"AHiWcHe+T3XbnlQqvqSAk6RY3XmEy1+hM2u9Xk6BNi7BpQkEQM1f0vzRpgn5Dnf2\n" -"TXQWGUq9Z7jdSVnzWT3xqPA4zjw6eZkj+DKUtwq+oEDZGlf8eHTFmr0NAWfwZbk9\n" -"NAjbMTUXUP37N2XAZwkoCWwFCrrfMwXrL7OhZbj7ifo=\n" -"-----END SIGNATURE-----\n"; - diff --git a/src/tor/src/test/zero_length_keys.sh b/src/tor/src/test/zero_length_keys.sh deleted file mode 100644 index 3c61f8d46..000000000 --- a/src/tor/src/test/zero_length_keys.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh -# Check that tor regenerates keys when key files are zero-length -# Test for bug #13111 - Tor fails to start if onion keys are zero length -# -# Usage: -# ./zero_length_keys.sh PATH_TO_TOR -# Run all the tests below -# ./zero_length_keys.sh PATH_TO_TOR -z -# Check tor will launch and regenerate zero-length keys -# ./zero_length_keys.sh PATH_TO_TOR -d -# Check tor regenerates deleted keys (existing behaviour) -# ./zero_length_keys.sh PATH_TO_TOR -e -# Check tor does not overwrite existing keys (existing behaviour) -# -# Exit Statuses: -# 0: test succeeded - tor regenerated/kept the files -# 1: test failed - tor did not regenerate/keep the files -# 2: test failed - tor did not generate the key files on first run -# 3: a command failed - the test could not be completed -# - -if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then - echo "Usage: ${0} PATH_TO_TOR [-z|-d|-e]" - exit 1 -elif [ $# -eq 1 ]; then - echo "Testing that tor correctly handles zero-length keys" - "$0" "${1}" -z && "$0" "${1}" -d && "$0" "${1}" -e - exit $? -else #[$# -gt 1 ]; then - TOR_BINARY="${1}" - shift -fi - -DATA_DIR=`mktemp -d -t tor_zero_length_keys.XXXXXX` -if [ -z "$DATA_DIR" ]; then - echo "Failure: mktemp invocation returned empty string" >&2 - exit 3 -fi -if [ ! -d "$DATA_DIR" ]; then - echo "Failure: mktemp invocation result doesn't point to directory" >&2 - exit 3 -fi -trap "rm -rf '$DATA_DIR'" 0 - -touch "$DATA_DIR"/empty_torrc - -# DisableNetwork means that the ORPort won't actually be opened. -# 'ExitRelay 0' suppresses a warning. -TOR="${TOR_BINARY} --hush --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f $DATA_DIR/empty_torrc" - -if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && - [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then - echo "Failure: Previous tor keys present in tor data directory" >&2 - exit 3 -else - echo "Generating initial tor keys" - $TOR --DataDirectory "$DATA_DIR" --list-fingerprint - - # tor must successfully generate non-zero-length key files - if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && - [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then - true #echo "tor generated the initial key files" - else - echo "Failure: tor failed to generate the initial key files" - exit 2 - fi -fi - -#ls -lh "$DATA_DIR"/keys/ || exit 3 - -# backup and keep/delete/create zero-length files for the keys - -FILE_DESC="keeps existing" -# make a backup -cp -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old - -# delete keys for -d or -z -if [ "$1" != "-e" ]; then - FILE_DESC="regenerates deleted" - rm "$DATA_DIR"/keys/secret_id_key || exit 3 - rm "$DATA_DIR"/keys/secret_onion_key || exit 3 - rm "$DATA_DIR"/keys/secret_onion_key_ntor || exit 3 -fi - -# create empty files for -z -if [ "$1" = "-z" ]; then - FILE_DESC="regenerates zero-length" - touch "$DATA_DIR"/keys/secret_id_key || exit 3 - touch "$DATA_DIR"/keys/secret_onion_key || exit 3 - touch "$DATA_DIR"/keys/secret_onion_key_ntor || exit 3 -fi - -echo "Running tor again to check if it $FILE_DESC keys" -$TOR --DataDirectory "$DATA_DIR" --list-fingerprint - -#ls -lh "$DATA_DIR"/keys/ || exit 3 - -# tor must always have non-zero-length key files -if [ -s "$DATA_DIR"/keys/secret_id_key ] && [ -s "$DATA_DIR"/keys/secret_onion_key ] && - [ -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then - # check if the keys are different to the old ones - diff -q -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old > /dev/null - SAME_KEYS=$? - # if we're not testing existing keys, - # the current keys should be different to the old ones - if [ "$1" != "-e" ]; then - if [ $SAME_KEYS -ne 0 ]; then - echo "Success: test that tor $FILE_DESC key files: different keys" - exit 0 - else - echo "Failure: test that tor $FILE_DESC key files: same keys" - exit 1 - fi - else #[ "$1" == "-e" ]; then - if [ $SAME_KEYS -eq 0 ]; then - echo "Success: test that tor $FILE_DESC key files: same keys" - exit 0 - else - echo "Failure: test that tor $FILE_DESC key files: different keys" - exit 1 - fi - fi -else - echo "Failure: test that tor $FILE_DESC key files: no key files" - exit 1 -fi diff --git a/src/tor/src/tools/Makefile.nmake b/src/tor/src/tools/Makefile.nmake deleted file mode 100644 index fda1990e0..000000000 --- a/src/tor/src/tools/Makefile.nmake +++ /dev/null @@ -1,19 +0,0 @@ -all: tor-resolve.exe tor-gencert.exe - -CFLAGS = /I ..\win32 /I ..\..\..\build-alpha\include /I ..\common /I ..\or - -LIBS = ..\..\..\build-alpha\lib\libevent.lib \ - ..\..\..\build-alpha\lib\libcrypto.lib \ - ..\..\..\build-alpha\lib\libssl.lib \ - ..\..\..\build-alpha\lib\libz.lib \ - ws2_32.lib advapi32.lib shell32.lib \ - crypt32.lib gdi32.lib user32.lib - -tor-gencert.exe: tor-gencert.obj - $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib tor-gencert.obj - -tor-resolve.exe: tor-resolve.obj - $(CC) $(CFLAGS) $(LIBS) ..\common\*.lib tor-resolve.obj - -clean: - del *.obj *.lib *.exe diff --git a/src/tor/src/tools/include.am b/src/tor/src/tools/include.am deleted file mode 100644 index 92cc3f10a..000000000 --- a/src/tor/src/tools/include.am +++ /dev/null @@ -1,52 +0,0 @@ -bin_PROGRAMS+= src/tools/tor-resolve src/tools/tor-gencert - -if COVERAGE_ENABLED -noinst_PROGRAMS+= src/tools/tor-cov-resolve src/tools/tor-cov-gencert -endif - -src_tools_tor_resolve_SOURCES = src/tools/tor-resolve.c -src_tools_tor_resolve_LDFLAGS = -src_tools_tor_resolve_LDADD = src/common/libor.a \ - src/common/libor-ctime.a \ - $(rust_ldadd) \ - @TOR_LIB_MATH@ @TOR_LIB_WS32@ @TOR_LIB_USERENV@ - -if COVERAGE_ENABLED -src_tools_tor_cov_resolve_SOURCES = src/tools/tor-resolve.c -src_tools_tor_cov_resolve_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_tools_tor_cov_resolve_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_tools_tor_cov_resolve_LDADD = src/common/libor-testing.a \ - src/common/libor-ctime-testing.a \ - @TOR_LIB_MATH@ @TOR_LIB_WS32@ -endif - -src_tools_tor_gencert_SOURCES = src/tools/tor-gencert.c -src_tools_tor_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_tools_tor_gencert_LDADD = src/common/libor.a src/common/libor-crypto.a \ - src/common/libor-ctime.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - $(rust_ldadd) \ - @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ - -if COVERAGE_ENABLED -src_tools_tor_cov_gencert_SOURCES = src/tools/tor-gencert.c -src_tools_tor_cov_gencert_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_tools_tor_cov_gencert_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) -src_tools_tor_cov_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \ - src/common/libor-crypto-testing.a \ - src/common/libor-ctime-testing.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ -endif - -EXTRA_DIST += src/tools/tor-fw-helper/README - -if BUILD_LIBTORRUNNER -noinst_LIBRARIES += src/tools/libtorrunner.a -src_tools_libtorrunner_a_SOURCES = src/tools/tor_runner.c src/or/tor_api.c -endif diff --git a/src/tor/src/tools/tor-fw-helper/README b/src/tor/src/tools/tor-fw-helper/README deleted file mode 100644 index 6a1ecaa1e..000000000 --- a/src/tor/src/tools/tor-fw-helper/README +++ /dev/null @@ -1,10 +0,0 @@ - -We no longer recommend the use of this tool. Instead, please use the -pure-Go version of tor-fw-helper available at - https://gitweb.torproject.org/tor-fw-helper.git - -Why? - -The C code here was fine, but frankly: we don't trust the underlying -libraries. They don't seem to have been written with network security -in mind, and we have very little faith in their safety. diff --git a/src/tor/src/tools/tor-gencert.c b/src/tor/src/tools/tor-gencert.c deleted file mode 100644 index fb7465c0e..000000000 --- a/src/tor/src/tools/tor-gencert.c +++ /dev/null @@ -1,600 +0,0 @@ -/* Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include -#include - -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "compat.h" - -/* Some versions of OpenSSL declare X509_STORE_CTX_set_verify_cb twice in - * x509.h and x509_vfy.h. Suppress the GCC warning so we can build with - * -Wredundant-decl. */ -DISABLE_GCC_WARNING(redundant-decls) - -#include -#include -#include -#include -#include -#include - -ENABLE_GCC_WARNING(redundant-decls) - -#include -#if 0 -#include -#include -#include -#endif - -#include "compat.h" -#include "util.h" -#include "torlog.h" -#include "crypto.h" -#include "address.h" -#include "util_format.h" - -#define IDENTITY_KEY_BITS 3072 -#define SIGNING_KEY_BITS 2048 -#define DEFAULT_LIFETIME 12 - -/* These globals are set via command line options. */ -static char *identity_key_file = NULL; -static char *signing_key_file = NULL; -static char *certificate_file = NULL; -static int reuse_signing_key = 0; -static int verbose = 0; -static int make_new_id = 0; -static int months_lifetime = DEFAULT_LIFETIME; -static int passphrase_fd = -1; -static char *address = NULL; - -static char *passphrase = NULL; -static size_t passphrase_len = 0; - -static EVP_PKEY *identity_key = NULL; -static EVP_PKEY *signing_key = NULL; - -/** Write a usage message for tor-gencert to stderr. */ -static void -show_help(void) -{ - fprintf(stderr, "Syntax:\n" - "tor-gencert [-h|--help] [-v] [-r|--reuse] [--create-identity-key]\n" - " [-i identity_key_file] [-s signing_key_file] " - "[-c certificate_file]\n" - " [-m lifetime_in_months] [-a address:port] " - "[--passphrase-fd ]\n"); -} - -/* XXXX copied from crypto.c */ -static void -crypto_log_errors(int severity, const char *doing) -{ - unsigned long err; - const char *msg, *lib, *func; - while ((err = ERR_get_error()) != 0) { - msg = (const char*)ERR_reason_error_string(err); - lib = (const char*)ERR_lib_error_string(err); - func = (const char*)ERR_func_error_string(err); - if (!msg) msg = "(null)"; - if (!lib) lib = "(null)"; - if (!func) func = "(null)"; - if (doing) { - tor_log(severity, LD_CRYPTO, "crypto error while %s: %s (in %s:%s)", - doing, msg, lib, func); - } else { - tor_log(severity, LD_CRYPTO, "crypto error: %s (in %s:%s)", - msg, lib, func); - } - } -} - -/** Read the passphrase from the passphrase fd. */ -static int -load_passphrase(void) -{ - char *cp; - char buf[1024]; /* "Ought to be enough for anybody." */ - memset(buf, 0, sizeof(buf)); /* should be needless */ - ssize_t n = read_all(passphrase_fd, buf, sizeof(buf), 0); - if (n < 0) { - log_err(LD_GENERAL, "Couldn't read from passphrase fd: %s", - strerror(errno)); - return -1; - } - /* We'll take everything from the buffer except for optional terminating - * newline. */ - cp = memchr(buf, '\n', n); - if (cp == NULL) { - passphrase_len = n; - } else { - passphrase_len = cp-buf; - } - passphrase = tor_strndup(buf, passphrase_len); - memwipe(buf, 0, sizeof(buf)); - return 0; -} - -static void -clear_passphrase(void) -{ - if (passphrase) { - memwipe(passphrase, 0, passphrase_len); - tor_free(passphrase); - } -} - -/** Read the command line options from argc and argv, - * setting global option vars as needed. - */ -static int -parse_commandline(int argc, char **argv) -{ - int i; - log_severity_list_t s; - for (i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { - show_help(); - return 1; - } else if (!strcmp(argv[i], "-i")) { - if (i+1>=argc) { - fprintf(stderr, "No argument to -i\n"); - return 1; - } - if (identity_key_file) { - fprintf(stderr, "Duplicate values for -i\n"); - return -1; - } - identity_key_file = tor_strdup(argv[++i]); - } else if (!strcmp(argv[i], "-s")) { - if (i+1>=argc) { - fprintf(stderr, "No argument to -s\n"); - return 1; - } - if (signing_key_file) { - fprintf(stderr, "Duplicate values for -s\n"); - return -1; - } - signing_key_file = tor_strdup(argv[++i]); - } else if (!strcmp(argv[i], "-c")) { - if (i+1>=argc) { - fprintf(stderr, "No argument to -c\n"); - return 1; - } - if (certificate_file) { - fprintf(stderr, "Duplicate values for -c\n"); - return -1; - } - certificate_file = tor_strdup(argv[++i]); - } else if (!strcmp(argv[i], "-m")) { - if (i+1>=argc) { - fprintf(stderr, "No argument to -m\n"); - return 1; - } - months_lifetime = atoi(argv[++i]); - if (months_lifetime > 24 || months_lifetime < 0) { - fprintf(stderr, "Lifetime (in months) was out of range.\n"); - return 1; - } - } else if (!strcmp(argv[i], "-r") || !strcmp(argv[i], "--reuse")) { - reuse_signing_key = 1; - } else if (!strcmp(argv[i], "-v")) { - verbose = 1; - } else if (!strcmp(argv[i], "-a")) { - uint32_t addr; - uint16_t port; - char b[INET_NTOA_BUF_LEN]; - struct in_addr in; - if (i+1>=argc) { - fprintf(stderr, "No argument to -a\n"); - return 1; - } - if (addr_port_lookup(LOG_ERR, argv[++i], NULL, &addr, &port)<0) - return 1; - in.s_addr = htonl(addr); - tor_inet_ntoa(&in, b, sizeof(b)); - tor_asprintf(&address, "%s:%d", b, (int)port); - } else if (!strcmp(argv[i], "--create-identity-key")) { - make_new_id = 1; - } else if (!strcmp(argv[i], "--passphrase-fd")) { - if (i+1>=argc) { - fprintf(stderr, "No argument to --passphrase-fd\n"); - return 1; - } - passphrase_fd = atoi(argv[++i]); - } else { - fprintf(stderr, "Unrecognized option %s\n", argv[i]); - return 1; - } - } - - memwipe(&s, 0, sizeof(s)); - if (verbose) - set_log_severity_config(LOG_DEBUG, LOG_ERR, &s); - else - set_log_severity_config(LOG_WARN, LOG_ERR, &s); - add_stream_log(&s, "", fileno(stderr)); - - if (!identity_key_file) { - identity_key_file = tor_strdup("./authority_identity_key"); - log_info(LD_GENERAL, "No identity key file given; defaulting to %s", - identity_key_file); - } - if (!signing_key_file) { - signing_key_file = tor_strdup("./authority_signing_key"); - log_info(LD_GENERAL, "No signing key file given; defaulting to %s", - signing_key_file); - } - if (!certificate_file) { - certificate_file = tor_strdup("./authority_certificate"); - log_info(LD_GENERAL, "No signing key file given; defaulting to %s", - certificate_file); - } - if (passphrase_fd >= 0) { - if (load_passphrase()<0) - return 1; - } - return 0; -} - -static RSA * -generate_key(int bits) -{ - RSA *rsa = NULL; - crypto_pk_t *env = crypto_pk_new(); - if (crypto_pk_generate_key_with_bits(env,bits)<0) - goto done; - rsa = crypto_pk_get_rsa_(env); - rsa = RSAPrivateKey_dup(rsa); - done: - crypto_pk_free(env); - return rsa; -} - -/** Try to read the identity key from identity_key_file. If no such - * file exists and create_identity_key is set, make a new identity key and - * store it. Return 0 on success, nonzero on failure. - */ -static int -load_identity_key(void) -{ - file_status_t status = file_status(identity_key_file); - FILE *f; - - if (make_new_id) { - open_file_t *open_file = NULL; - RSA *key; - if (status != FN_NOENT) { - log_err(LD_GENERAL, "--create-identity-key was specified, but %s " - "already exists.", identity_key_file); - return 1; - } - log_notice(LD_GENERAL, "Generating %d-bit RSA identity key.", - IDENTITY_KEY_BITS); - if (!(key = generate_key(IDENTITY_KEY_BITS))) { - log_err(LD_GENERAL, "Couldn't generate identity key."); - crypto_log_errors(LOG_ERR, "Generating identity key"); - return 1; - } - identity_key = EVP_PKEY_new(); - if (!(EVP_PKEY_assign_RSA(identity_key, key))) { - log_err(LD_GENERAL, "Couldn't assign identity key."); - return 1; - } - - if (!(f = start_writing_to_stdio_file(identity_key_file, - OPEN_FLAGS_REPLACE | O_TEXT, 0400, - &open_file))) - return 1; - - /* Write the key to the file. If passphrase is not set, takes it from - * the terminal. */ - if (!PEM_write_PKCS8PrivateKey_nid(f, identity_key, - NID_pbe_WithSHA1And3_Key_TripleDES_CBC, - passphrase, (int)passphrase_len, - NULL, NULL)) { - log_err(LD_GENERAL, "Couldn't write identity key to %s", - identity_key_file); - crypto_log_errors(LOG_ERR, "Writing identity key"); - abort_writing_to_file(open_file); - return 1; - } - finish_writing_to_file(open_file); - } else { - if (status != FN_FILE) { - log_err(LD_GENERAL, - "No identity key found in %s. To specify a location " - "for an identity key, use -i. To generate a new identity key, " - "use --create-identity-key.", identity_key_file); - return 1; - } - - if (!(f = fopen(identity_key_file, "r"))) { - log_err(LD_GENERAL, "Couldn't open %s for reading: %s", - identity_key_file, strerror(errno)); - return 1; - } - - /* Read the key. If passphrase is not set, takes it from the terminal. */ - identity_key = PEM_read_PrivateKey(f, NULL, NULL, passphrase); - if (!identity_key) { - log_err(LD_GENERAL, "Couldn't read identity key from %s", - identity_key_file); - fclose(f); - return 1; - } - fclose(f); - } - return 0; -} - -/** Load a saved signing key from disk. Return 0 on success, nonzero on - * failure. */ -static int -load_signing_key(void) -{ - FILE *f; - if (!(f = fopen(signing_key_file, "r"))) { - log_err(LD_GENERAL, "Couldn't open %s for reading: %s", - signing_key_file, strerror(errno)); - return 1; - } - if (!(signing_key = PEM_read_PrivateKey(f, NULL, NULL, NULL))) { - log_err(LD_GENERAL, "Couldn't read siging key from %s", signing_key_file); - fclose(f); - return 1; - } - fclose(f); - return 0; -} - -/** Generate a new signing key and write it to disk. Return 0 on success, - * nonzero on failure. */ -static int -generate_signing_key(void) -{ - open_file_t *open_file; - FILE *f; - RSA *key; - log_notice(LD_GENERAL, "Generating %d-bit RSA signing key.", - SIGNING_KEY_BITS); - if (!(key = generate_key(SIGNING_KEY_BITS))) { - log_err(LD_GENERAL, "Couldn't generate signing key."); - crypto_log_errors(LOG_ERR, "Generating signing key"); - return 1; - } - signing_key = EVP_PKEY_new(); - if (!(EVP_PKEY_assign_RSA(signing_key, key))) { - log_err(LD_GENERAL, "Couldn't assign signing key."); - return 1; - } - - if (!(f = start_writing_to_stdio_file(signing_key_file, - OPEN_FLAGS_REPLACE | O_TEXT, 0600, - &open_file))) - return 1; - - /* Write signing key with no encryption. */ - if (!PEM_write_RSAPrivateKey(f, key, NULL, NULL, 0, NULL, NULL)) { - crypto_log_errors(LOG_WARN, "writing signing key"); - abort_writing_to_file(open_file); - return 1; - } - - finish_writing_to_file(open_file); - - return 0; -} - -/** Encode key in the format used in directory documents; return - * a newly allocated string holding the result or NULL on failure. */ -static char * -key_to_string(EVP_PKEY *key) -{ - BUF_MEM *buf; - BIO *b; - RSA *rsa = EVP_PKEY_get1_RSA(key); - char *result; - if (!rsa) - return NULL; - - b = BIO_new(BIO_s_mem()); - if (!PEM_write_bio_RSAPublicKey(b, rsa)) { - crypto_log_errors(LOG_WARN, "writing public key to string"); - RSA_free(rsa); - return NULL; - } - - BIO_get_mem_ptr(b, &buf); - result = tor_malloc(buf->length + 1); - memcpy(result, buf->data, buf->length); - result[buf->length] = 0; - - BIO_free(b); - - RSA_free(rsa); - return result; -} - -/** Set out to the hex-encoded fingerprint of pkey. */ -static int -get_fingerprint(EVP_PKEY *pkey, char *out) -{ - int r = -1; - crypto_pk_t *pk = crypto_new_pk_from_rsa_(EVP_PKEY_get1_RSA(pkey)); - if (pk) { - r = crypto_pk_get_fingerprint(pk, out, 0); - crypto_pk_free(pk); - } - return r; -} - -/** Set out to the hex-encoded fingerprint of pkey. */ -static int -get_digest(EVP_PKEY *pkey, char *out) -{ - int r = -1; - crypto_pk_t *pk = crypto_new_pk_from_rsa_(EVP_PKEY_get1_RSA(pkey)); - if (pk) { - r = crypto_pk_get_digest(pk, out); - crypto_pk_free(pk); - } - return r; -} - -/** Generate a new certificate for our loaded or generated keys, and write it - * to disk. Return 0 on success, nonzero on failure. */ -static int -generate_certificate(void) -{ - char buf[8192]; - time_t now = time(NULL); - struct tm tm; - char published[ISO_TIME_LEN+1]; - char expires[ISO_TIME_LEN+1]; - char id_digest[DIGEST_LEN]; - char fingerprint[FINGERPRINT_LEN+1]; - FILE *f; - size_t signed_len; - char digest[DIGEST_LEN]; - char signature[1024]; /* handles up to 8192-bit keys. */ - int r; - - if (get_fingerprint(identity_key, fingerprint) < 0) { - return -1; - } - if (get_digest(identity_key, id_digest)) { - return -1; - } - char *ident = key_to_string(identity_key); - char *signing = key_to_string(signing_key); - - tor_localtime_r(&now, &tm); - tm.tm_mon += months_lifetime; - - format_iso_time(published, now); - format_iso_time(expires, mktime(&tm)); - - tor_snprintf(buf, sizeof(buf), - "dir-key-certificate-version 3" - "%s%s" - "\nfingerprint %s\n" - "dir-key-published %s\n" - "dir-key-expires %s\n" - "dir-identity-key\n%s" - "dir-signing-key\n%s" - "dir-key-crosscert\n" - "-----BEGIN ID SIGNATURE-----\n", - address?"\ndir-address ":"", address?address:"", - fingerprint, published, expires, ident, signing - ); - tor_free(ident); - tor_free(signing); - - /* Append a cross-certification */ - RSA *rsa = EVP_PKEY_get1_RSA(signing_key); - r = RSA_private_encrypt(DIGEST_LEN, (unsigned char*)id_digest, - (unsigned char*)signature, - rsa, - RSA_PKCS1_PADDING); - RSA_free(rsa); - - signed_len = strlen(buf); - base64_encode(buf+signed_len, sizeof(buf)-signed_len, signature, r, - BASE64_ENCODE_MULTILINE); - - strlcat(buf, - "-----END ID SIGNATURE-----\n" - "dir-key-certification\n", sizeof(buf)); - - signed_len = strlen(buf); - SHA1((const unsigned char*)buf,signed_len,(unsigned char*)digest); - - rsa = EVP_PKEY_get1_RSA(identity_key); - r = RSA_private_encrypt(DIGEST_LEN, (unsigned char*)digest, - (unsigned char*)signature, - rsa, - RSA_PKCS1_PADDING); - RSA_free(rsa); - strlcat(buf, "-----BEGIN SIGNATURE-----\n", sizeof(buf)); - signed_len = strlen(buf); - base64_encode(buf+signed_len, sizeof(buf)-signed_len, signature, r, - BASE64_ENCODE_MULTILINE); - strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); - - if (!(f = fopen(certificate_file, "w"))) { - log_err(LD_GENERAL, "Couldn't open %s for writing: %s", - certificate_file, strerror(errno)); - return 1; - } - - if (fputs(buf, f) < 0) { - log_err(LD_GENERAL, "Couldn't write to %s: %s", - certificate_file, strerror(errno)); - fclose(f); - return 1; - } - fclose(f); - return 0; -} - -/** Entry point to tor-gencert */ -int -main(int argc, char **argv) -{ - int r = 1; - init_logging(1); - - /* Don't bother using acceleration. */ - if (crypto_global_init(0, NULL, NULL)) { - fprintf(stderr, "Couldn't initialize crypto library.\n"); - return 1; - } - if (crypto_seed_rng()) { - fprintf(stderr, "Couldn't seed RNG.\n"); - goto done; - } - /* Make sure that files are made private. */ - umask(0077); - - if (parse_commandline(argc, argv)) - goto done; - if (load_identity_key()) - goto done; - if (reuse_signing_key) { - if (load_signing_key()) - goto done; - } else { - if (generate_signing_key()) - goto done; - } - if (generate_certificate()) - goto done; - - r = 0; - done: - clear_passphrase(); - if (identity_key) - EVP_PKEY_free(identity_key); - if (signing_key) - EVP_PKEY_free(signing_key); - tor_free(address); - tor_free(identity_key_file); - tor_free(signing_key_file); - tor_free(certificate_file); - tor_free(address); - - crypto_global_cleanup(); - return r; -} - diff --git a/src/tor/src/tools/tor-resolve.c b/src/tor/src/tools/tor-resolve.c deleted file mode 100644 index 1e2409a13..000000000 --- a/src/tor/src/tools/tor-resolve.c +++ /dev/null @@ -1,452 +0,0 @@ -/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson - * Copyright (c) 2007-2017, The Tor Project, Inc. - */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" -#include "compat.h" -#include "util.h" -#include "address.h" -#include "torlog.h" -#include "sandbox.h" - -#include -#include -#include -#include -#include - -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_SYS_TYPES_H -#include /* Must be included before sys/stat.h for Ultrix */ -#endif -#ifdef HAVE_ERRNO_H -#include -#endif - -#ifdef _WIN32 -#include -#include -#endif - -#define RESPONSE_LEN_4 8 -#define log_sock_error(act, _s) \ - STMT_BEGIN log_fn(LOG_ERR, LD_NET, "Error while %s: %s", act, \ - tor_socket_strerror(tor_socket_errno(_s))); STMT_END - -static void usage(void) ATTR_NORETURN; - -/** Set *out to a newly allocated SOCKS4a resolve request with - * username and hostname as provided. Return the number - * of bytes in the request. */ -static ssize_t -build_socks_resolve_request(char **out, - const char *username, - const char *hostname, - int reverse, - int version) -{ - size_t len = 0; - tor_assert(out); - tor_assert(username); - tor_assert(hostname); - - if (version == 4) { - len = 8 + strlen(username) + 1 + strlen(hostname) + 1; - *out = tor_malloc(len); - (*out)[0] = 4; /* SOCKS version 4 */ - (*out)[1] = '\xF0'; /* Command: resolve. */ - set_uint16((*out)+2, htons(0)); /* port: 0. */ - set_uint32((*out)+4, htonl(0x00000001u)); /* addr: 0.0.0.1 */ - memcpy((*out)+8, username, strlen(username)+1); - memcpy((*out)+8+strlen(username)+1, hostname, strlen(hostname)+1); - } else if (version == 5) { - int is_ip_address; - tor_addr_t addr; - size_t addrlen; - int ipv6; - is_ip_address = tor_addr_parse(&addr, hostname) != -1; - if (!is_ip_address && reverse) { - log_err(LD_GENERAL, "Tried to do a reverse lookup on a non-IP!"); - return -1; - } - ipv6 = reverse && tor_addr_family(&addr) == AF_INET6; - addrlen = reverse ? (ipv6 ? 16 : 4) : 1 + strlen(hostname); - if (addrlen > UINT8_MAX) { - log_err(LD_GENERAL, "Hostname is too long!"); - return -1; - } - len = 6 + addrlen; - *out = tor_malloc(len); - (*out)[0] = 5; /* SOCKS version 5 */ - (*out)[1] = reverse ? '\xF1' : '\xF0'; /* RESOLVE_PTR or RESOLVE */ - (*out)[2] = 0; /* reserved. */ - if (reverse) { - (*out)[3] = ipv6 ? 4 : 1; - if (ipv6) - memcpy((*out)+4, tor_addr_to_in6_addr8(&addr), 16); - else - set_uint32((*out)+4, tor_addr_to_ipv4n(&addr)); - } else { - (*out)[3] = 3; - (*out)[4] = (char)(uint8_t)(addrlen - 1); - memcpy((*out)+5, hostname, addrlen - 1); - } - set_uint16((*out)+4+addrlen, 0); /* port */ - } else { - tor_assert(0); - } - - return len; -} - -static void -onion_warning(const char *hostname) -{ - log_warn(LD_NET, - "%s is a hidden service; those don't have IP addresses. " - "You can use the AutomapHostsOnResolve option to have Tor return a " - "fake address for hidden services. Or you can have your " - "application send the address to Tor directly; we recommend an " - "application that uses SOCKS 5 with hostnames.", - hostname); -} - -/** Given a len-byte SOCKS4a response in response, set - * *addr_out to the address it contains (in host order). - * Return 0 on success, -1 on error. - */ -static int -parse_socks4a_resolve_response(const char *hostname, - const char *response, size_t len, - tor_addr_t *addr_out) -{ - uint8_t status; - tor_assert(response); - tor_assert(addr_out); - - if (len < RESPONSE_LEN_4) { - log_warn(LD_PROTOCOL,"Truncated socks response."); - return -1; - } - if (((uint8_t)response[0])!=0) { /* version: 0 */ - log_warn(LD_PROTOCOL,"Nonzero version in socks response: bad format."); - return -1; - } - status = (uint8_t)response[1]; - if (get_uint16(response+2)!=0) { /* port: 0 */ - log_warn(LD_PROTOCOL,"Nonzero port in socks response: bad format."); - return -1; - } - if (status != 90) { - log_warn(LD_NET,"Got status response '%d': socks request failed.", status); - if (!strcasecmpend(hostname, ".onion")) { - onion_warning(hostname); - return -1; - } - return -1; - } - - tor_addr_from_ipv4n(addr_out, get_uint32(response+4)); - return 0; -} - -/* It would be nice to let someone know what SOCKS5 issue a user may have */ -static const char * -socks5_reason_to_string(char reason) -{ - switch (reason) { - case SOCKS5_SUCCEEDED: - return "succeeded"; - case SOCKS5_GENERAL_ERROR: - return "general error"; - case SOCKS5_NOT_ALLOWED: - return "not allowed"; - case SOCKS5_NET_UNREACHABLE: - return "network is unreachable"; - case SOCKS5_HOST_UNREACHABLE: - return "host is unreachable"; - case SOCKS5_CONNECTION_REFUSED: - return "connection refused"; - case SOCKS5_TTL_EXPIRED: - return "ttl expired"; - case SOCKS5_COMMAND_NOT_SUPPORTED: - return "command not supported"; - case SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED: - return "address type not supported"; - default: - return "unknown SOCKS5 code"; - } -} - -/** Send a resolve request for hostname to the Tor listening on - * sockshost:socksport. Store the resulting IPv4 - * address (in host order) into *result_addr. - */ -static int -do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, - int reverse, int version, - tor_addr_t *result_addr, char **result_hostname) -{ - int s = -1; - struct sockaddr_in socksaddr; - char *req = NULL; - ssize_t len = 0; - - tor_assert(hostname); - tor_assert(result_addr); - tor_assert(version == 4 || version == 5); - - tor_addr_make_unspec(result_addr); - *result_hostname = NULL; - - s = tor_open_socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); - if (s<0) { - log_sock_error("creating_socket", -1); - return -1; - } - - memset(&socksaddr, 0, sizeof(socksaddr)); - socksaddr.sin_family = AF_INET; - socksaddr.sin_port = htons(socksport); - socksaddr.sin_addr.s_addr = htonl(sockshost); - if (connect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) { - log_sock_error("connecting to SOCKS host", s); - goto err; - } - - if (version == 5) { - char method_buf[2]; - if (write_all(s, "\x05\x01\x00", 3, 1) != 3) { - log_err(LD_NET, "Error sending SOCKS5 method list."); - goto err; - } - if (read_all(s, method_buf, 2, 1) != 2) { - log_err(LD_NET, "Error reading SOCKS5 methods."); - goto err; - } - if (method_buf[0] != '\x05') { - log_err(LD_NET, "Unrecognized socks version: %u", - (unsigned)method_buf[0]); - goto err; - } - if (method_buf[1] != '\x00') { - log_err(LD_NET, "Unrecognized socks authentication method: %u", - (unsigned)method_buf[1]); - goto err; - } - } - - if ((len = build_socks_resolve_request(&req, "", hostname, reverse, - version))<0) { - log_err(LD_BUG,"Error generating SOCKS request"); - tor_assert(!req); - goto err; - } - if (write_all(s, req, len, 1) != len) { - log_sock_error("sending SOCKS request", s); - tor_free(req); - goto err; - } - tor_free(req); - - if (version == 4) { - char reply_buf[RESPONSE_LEN_4]; - if (read_all(s, reply_buf, RESPONSE_LEN_4, 1) != RESPONSE_LEN_4) { - log_err(LD_NET, "Error reading SOCKS4 response."); - goto err; - } - if (parse_socks4a_resolve_response(hostname, - reply_buf, RESPONSE_LEN_4, - result_addr)<0) { - goto err; - } - } else { - char reply_buf[16]; - if (read_all(s, reply_buf, 4, 1) != 4) { - log_err(LD_NET, "Error reading SOCKS5 response."); - goto err; - } - if (reply_buf[0] != 5) { - log_err(LD_NET, "Bad SOCKS5 reply version."); - goto err; - } - /* Give a user some useful feedback about SOCKS5 errors */ - if (reply_buf[1] != 0) { - log_warn(LD_NET,"Got SOCKS5 status response '%u': %s", - (unsigned)reply_buf[1], - socks5_reason_to_string(reply_buf[1])); - if (reply_buf[1] == 4 && !strcasecmpend(hostname, ".onion")) { - onion_warning(hostname); - } - goto err; - } - if (reply_buf[3] == 1) { - /* IPv4 address */ - if (read_all(s, reply_buf, 4, 1) != 4) { - log_err(LD_NET, "Error reading address in socks5 response."); - goto err; - } - tor_addr_from_ipv4n(result_addr, get_uint32(reply_buf)); - } else if (reply_buf[3] == 4) { - /* IPv6 address */ - if (read_all(s, reply_buf, 16, 1) != 16) { - log_err(LD_NET, "Error reading address in socks5 response."); - goto err; - } - tor_addr_from_ipv6_bytes(result_addr, reply_buf); - } else if (reply_buf[3] == 3) { - /* Domain name */ - size_t result_len; - if (read_all(s, reply_buf, 1, 1) != 1) { - log_err(LD_NET, "Error reading address_length in socks5 response."); - goto err; - } - result_len = *(uint8_t*)(reply_buf); - *result_hostname = tor_malloc(result_len+1); - if (read_all(s, *result_hostname, result_len, 1) != (int) result_len) { - log_err(LD_NET, "Error reading hostname in socks5 response."); - goto err; - } - (*result_hostname)[result_len] = '\0'; - } - } - - tor_close_socket(s); - return 0; - err: - tor_close_socket(s); - return -1; -} - -/** Print a usage message and exit. */ -static void -usage(void) -{ - puts("Syntax: tor-resolve [-4] [-5] [-v] [-x] [-p port] " - "hostname [sockshost[:socksport]]"); - exit(1); -} - -/** Entry point to tor-resolve */ -int -main(int argc, char **argv) -{ - uint32_t sockshost; - uint16_t socksport = 0, port_option = 0; - int isSocks4 = 0, isVerbose = 0, isReverse = 0; - char **arg; - int n_args; - tor_addr_t result; - char *result_hostname = NULL; - log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t)); - - init_logging(1); - sandbox_disable_getaddrinfo_cache(); - - arg = &argv[1]; - n_args = argc-1; - - if (!n_args) - usage(); - - if (!strcmp(arg[0],"--version")) { - printf("Tor version %s.\n",VERSION); - return 0; - } - while (n_args && *arg[0] == '-') { - if (!strcmp("-v", arg[0])) - isVerbose = 1; - else if (!strcmp("-4", arg[0])) - isSocks4 = 1; - else if (!strcmp("-5", arg[0])) - isSocks4 = 0; - else if (!strcmp("-x", arg[0])) - isReverse = 1; - else if (!strcmp("-p", arg[0])) { - int p; - if (n_args < 2) { - fprintf(stderr, "No arguments given to -p\n"); - usage(); - } - p = atoi(arg[1]); - if (p<1 || p > 65535) { - fprintf(stderr, "-p requires a number between 1 and 65535\n"); - usage(); - } - port_option = (uint16_t) p; - ++arg; /* skip the port */ - --n_args; - } else { - fprintf(stderr, "Unrecognized flag '%s'\n", arg[0]); - usage(); - } - ++arg; - --n_args; - } - - if (isSocks4 && isReverse) { - fprintf(stderr, "Reverse lookups not supported with SOCKS4a\n"); - usage(); - } - - if (isVerbose) - set_log_severity_config(LOG_DEBUG, LOG_ERR, s); - else - set_log_severity_config(LOG_WARN, LOG_ERR, s); - add_stream_log(s, "", fileno(stderr)); - - if (n_args == 1) { - log_debug(LD_CONFIG, "defaulting to localhost"); - sockshost = 0x7f000001u; /* localhost */ - if (port_option) { - log_debug(LD_CONFIG, "Using port %d", (int)port_option); - socksport = port_option; - } else { - log_debug(LD_CONFIG, "defaulting to port 9050"); - socksport = 9050; /* 9050 */ - } - } else if (n_args == 2) { - if (addr_port_lookup(LOG_WARN, arg[1], NULL, &sockshost, &socksport)<0) { - fprintf(stderr, "Couldn't parse/resolve address %s", arg[1]); - return 1; - } - if (socksport && port_option && socksport != port_option) { - log_warn(LD_CONFIG, "Conflicting ports; using %d, not %d", - (int)socksport, (int)port_option); - } else if (port_option) { - socksport = port_option; - } else if (!socksport) { - log_debug(LD_CONFIG, "defaulting to port 9050"); - socksport = 9050; - } - } else { - usage(); - } - - if (network_init()<0) { - log_err(LD_BUG,"Error initializing network; exiting."); - return 1; - } - - if (do_resolve(arg[0], sockshost, socksport, isReverse, - isSocks4 ? 4 : 5, &result, - &result_hostname)) - return 1; - - if (result_hostname) { - printf("%s\n", result_hostname); - } else { - printf("%s\n", fmt_addr(&result)); - } - return 0; -} - diff --git a/src/tor/src/tools/tor_runner.c b/src/tor/src/tools/tor_runner.c deleted file mode 100644 index 9ed2ee577..000000000 --- a/src/tor/src/tools/tor_runner.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * @file tor_runner.c - * @brief Experimental module to emulate tor_run_main() API with fork+exec - * - * The functions here are meant to allow the application developer to - * use the tor_run_main() API without having to care whether Tor is - * running in-process or out-of-process. For in-process usage, the - * developer can link Tor as a library and call tor_run_main(); for - * out-of-process usage, the developer can link this library instead. - * - * This interface is EXPERIMENTAL; please let us know if you would like - * to depend on it. We don't know yet whether it will be reliable in - * practice. - */ - -/* NOTE: This module is supposed to work without the standard Tor utility - * functions. Don't add more dependencies! - */ - -#include "tor_api.h" -#include "tor_api_internal.h" - -#include "orconfig.h" -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#include -#include - -#ifndef __GNUC__ -#define __attribute__(x) -#endif - -static void child(const tor_main_configuration_t *cfg) - __attribute__((noreturn)); - -int -tor_run_main(const tor_main_configuration_t *cfg) -{ - pid_t pid = fork(); - if (pid == 0) { - child(cfg); - exit(0); /* Unreachable */ - } - - pid_t stopped_pid; - int status = 0; - do { - stopped_pid = waitpid(pid, &status, 0); - } while (stopped_pid == -1); - - /* Note: these return values are not documented. No return value is - * documented! */ - - if (stopped_pid != pid) { - return -99999; - } - if (WIFSTOPPED(status)) { - return WEXITSTATUS(status); - } - if (WIFSIGNALED(status)) { - return -WTERMSIG(status); - } - - return -999988; -} - -/* circumlocution to avoid getting warned about calling calloc instead of - * tor_calloc. */ -#define real_calloc calloc - -static void -child(const tor_main_configuration_t *cfg) -{ - /* XXXX Close unused file descriptors. */ - - char **args = real_calloc(cfg->argc+1, sizeof(char *)); - memcpy(args, cfg->argv, cfg->argc * sizeof(char *)); - args[cfg->argc] = NULL; - - int rv = execv(BINDIR "/tor", args); - - if (rv < 0) { - exit(254); - } else { - abort(); /* Unreachable */ - } -} - diff --git a/src/tor/src/trace/debug.h b/src/tor/src/trace/debug.h deleted file mode 100644 index 3a1652543..000000000 --- a/src/tor/src/trace/debug.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TRACE_LOG_DEBUG_H -#define TOR_TRACE_LOG_DEBUG_H - -#include "torlog.h" - -/* Stringify pre-processor trick. */ -#define XSTR(d) STR(d) -#define STR(s) #s - -/* Send every event to a debug log level. This is useful to debug new trace - * events without implementing them for a specific event tracing framework. - * Note that the arguments are ignored since at this step we do not know the - * types and amount there is. */ - -/* Example on how to map a tracepoint to log_debug(). */ -#undef tor_trace -#define tor_trace(subsystem, name, args...) \ - log_debug(LD_GENERAL, "Trace event \"" XSTR(name) "\" from " \ - "\"" XSTR(subsystem) "\" hit. " \ - "(line "XSTR(__LINE__) ")") - -#endif /* TOR_TRACE_LOG_DEBUG_H */ diff --git a/src/tor/src/trace/events.h b/src/tor/src/trace/events.h deleted file mode 100644 index 1be1fd596..000000000 --- a/src/tor/src/trace/events.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file events.h - * \brief Header file for Tor event tracing. - **/ - -#ifndef TOR_TRACE_EVENTS_H -#define TOR_TRACE_EVENTS_H - -/* - * The following defines a generic event tracing function name that has to be - * used to trace events in the code base. - * - * That generic function is then defined by a event tracing framework. For - * instance, the "log debug" framework sends all trace events to log_debug() - * which is defined in src/trace/debug.h which can only be enabled at compile - * time (--enable-event-tracing-debug). - * - * By default, every trace events in the code base are replaced by a NOP. See - * doc/HACKING/Tracing.md for more information on how to use event tracing or - * add events. - */ - -#ifdef TOR_EVENT_TRACING_ENABLED -/* Map every trace event to a per subsystem macro. */ -#define tor_trace(subsystem, name, ...) \ - tor_trace_##subsystem(name, __VA_ARGS__) - -/* Enable event tracing for the debug framework where all trace events are - * mapped to a log_debug(). */ -#ifdef USE_EVENT_TRACING_DEBUG -#include "trace/debug.h" -#endif - -#else /* TOR_EVENT_TRACING_ENABLED */ - -/* Reaching this point, we NOP every event declaration because event tracing - * is not been enabled at compile time. */ -#define tor_trace(subsystem, name, args...) - -#endif /* TOR_EVENT_TRACING_ENABLED */ - -#endif /* TOR_TRACE_EVENTS_H */ diff --git a/src/tor/src/trace/include.am b/src/tor/src/trace/include.am deleted file mode 100644 index 3285b04de..000000000 --- a/src/tor/src/trace/include.am +++ /dev/null @@ -1,22 +0,0 @@ -# Include the src/ so we can use the trace/events.h statement when including -# any file in that directory. -AM_CPPFLAGS += -I$(srcdir)/src - -noinst_LIBRARIES += \ - src/trace/libor-trace.a -LIBOR_TRACE_A_SOURCES = \ - src/trace/trace.c - -TRACEHEADERS = \ - src/trace/trace.h \ - src/trace/events.h - -if USE_EVENT_TRACING_DEBUG -TRACEHEADERS += \ - src/trace/debug.h -endif - -# Library source files. -src_trace_libor_trace_a_SOURCES = $(LIBOR_TRACE_A_SOURCES) - -noinst_HEADERS+= $(TRACEHEADERS) diff --git a/src/tor/src/trace/trace.c b/src/tor/src/trace/trace.c deleted file mode 100644 index fcdb80091..000000000 --- a/src/tor/src/trace/trace.c +++ /dev/null @@ -1,11 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "trace.h" - -/** Initialize the tracing library. */ -void -tor_trace_init(void) -{ -} - diff --git a/src/tor/src/trace/trace.h b/src/tor/src/trace/trace.h deleted file mode 100644 index 28fcd8eea..000000000 --- a/src/tor/src/trace/trace.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Copyright (c) 2017, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_TRACE_TRACE_H -#define TOR_TRACE_TRACE_H - -void tor_trace_init(void); - -#endif // TOR_TRACE_TRACE_H - diff --git a/src/tor/src/trunnel/README b/src/tor/src/trunnel/README deleted file mode 100644 index e24aea076..000000000 --- a/src/tor/src/trunnel/README +++ /dev/null @@ -1,21 +0,0 @@ -This directory contains code for use with, and code made by, the -automatic code generation tool "Trunnel". - -Trunnel generates binary parsers and formatters for simple data -structures. It aims for human-readable, obviously-correct outputs over -maximum efficiency or flexibility. - -The .trunnel files are the inputs here; the .c and .h files are the outputs. - -To add a new structure: - - Add a new .trunnel file or expand an existing one to describe the format - of the structure. - - Regenerate the .c and .h files. To do this, you run - "scripts/codegen/run_trunnel.sh". You'll need trunnel installed. - - Add the .trunnel, .c, and .h files to include.am - -For the Trunnel source code, and more documentation about using Trunnel, -see https://gitweb.torproject.org/trunnel.git , especially - https://gitweb.torproject.org/trunnel.git/tree/README -and https://gitweb.torproject.org/trunnel.git/tree/doc/trunnel.md - diff --git a/src/tor/src/trunnel/channelpadding_negotiation.c b/src/tor/src/trunnel/channelpadding_negotiation.c deleted file mode 100644 index 59e6b3838..000000000 --- a/src/tor/src/trunnel/channelpadding_negotiation.c +++ /dev/null @@ -1,281 +0,0 @@ -/* channelpadding_negotiation.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "channelpadding_negotiation.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int channelpaddingnegotiation_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || channelpaddingnegotiation_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -channelpadding_negotiate_t * -channelpadding_negotiate_new(void) -{ - channelpadding_negotiate_t *val = trunnel_calloc(1, sizeof(channelpadding_negotiate_t)); - if (NULL == val) - return NULL; - val->command = CHANNELPADDING_COMMAND_START; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -channelpadding_negotiate_clear(channelpadding_negotiate_t *obj) -{ - (void) obj; -} - -void -channelpadding_negotiate_free(channelpadding_negotiate_t *obj) -{ - if (obj == NULL) - return; - channelpadding_negotiate_clear(obj); - trunnel_memwipe(obj, sizeof(channelpadding_negotiate_t)); - trunnel_free_(obj); -} - -uint8_t -channelpadding_negotiate_get_version(const channelpadding_negotiate_t *inp) -{ - return inp->version; -} -int -channelpadding_negotiate_set_version(channelpadding_negotiate_t *inp, uint8_t val) -{ - if (! ((val == 0))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->version = val; - return 0; -} -uint8_t -channelpadding_negotiate_get_command(const channelpadding_negotiate_t *inp) -{ - return inp->command; -} -int -channelpadding_negotiate_set_command(channelpadding_negotiate_t *inp, uint8_t val) -{ - if (! ((val == CHANNELPADDING_COMMAND_START || val == CHANNELPADDING_COMMAND_STOP))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->command = val; - return 0; -} -uint16_t -channelpadding_negotiate_get_ito_low_ms(const channelpadding_negotiate_t *inp) -{ - return inp->ito_low_ms; -} -int -channelpadding_negotiate_set_ito_low_ms(channelpadding_negotiate_t *inp, uint16_t val) -{ - inp->ito_low_ms = val; - return 0; -} -uint16_t -channelpadding_negotiate_get_ito_high_ms(const channelpadding_negotiate_t *inp) -{ - return inp->ito_high_ms; -} -int -channelpadding_negotiate_set_ito_high_ms(channelpadding_negotiate_t *inp, uint16_t val) -{ - inp->ito_high_ms = val; - return 0; -} -const char * -channelpadding_negotiate_check(const channelpadding_negotiate_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->version == 0)) - return "Integer out of bounds"; - if (! (obj->command == CHANNELPADDING_COMMAND_START || obj->command == CHANNELPADDING_COMMAND_STOP)) - return "Integer out of bounds"; - return NULL; -} - -ssize_t -channelpadding_negotiate_encoded_len(const channelpadding_negotiate_t *obj) -{ - ssize_t result = 0; - - if (NULL != channelpadding_negotiate_check(obj)) - return -1; - - - /* Length of u8 version IN [0] */ - result += 1; - - /* Length of u8 command IN [CHANNELPADDING_COMMAND_START, CHANNELPADDING_COMMAND_STOP] */ - result += 1; - - /* Length of u16 ito_low_ms */ - result += 2; - - /* Length of u16 ito_high_ms */ - result += 2; - return result; -} -int -channelpadding_negotiate_clear_errors(channelpadding_negotiate_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -channelpadding_negotiate_encode(uint8_t *output, const size_t avail, const channelpadding_negotiate_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = channelpadding_negotiate_encoded_len(obj); -#endif - - if (NULL != (msg = channelpadding_negotiate_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 version IN [0] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->version)); - written += 1; ptr += 1; - - /* Encode u8 command IN [CHANNELPADDING_COMMAND_START, CHANNELPADDING_COMMAND_STOP] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->command)); - written += 1; ptr += 1; - - /* Encode u16 ito_low_ms */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->ito_low_ms)); - written += 2; ptr += 2; - - /* Encode u16 ito_high_ms */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->ito_high_ms)); - written += 2; ptr += 2; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As channelpadding_negotiate_parse(), but do not allocate the - * output object. - */ -static ssize_t -channelpadding_negotiate_parse_into(channelpadding_negotiate_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 version IN [0] */ - CHECK_REMAINING(1, truncated); - obj->version = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->version == 0)) - goto fail; - - /* Parse u8 command IN [CHANNELPADDING_COMMAND_START, CHANNELPADDING_COMMAND_STOP] */ - CHECK_REMAINING(1, truncated); - obj->command = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->command == CHANNELPADDING_COMMAND_START || obj->command == CHANNELPADDING_COMMAND_STOP)) - goto fail; - - /* Parse u16 ito_low_ms */ - CHECK_REMAINING(2, truncated); - obj->ito_low_ms = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u16 ito_high_ms */ - CHECK_REMAINING(2, truncated); - obj->ito_high_ms = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - fail: - result = -1; - return result; -} - -ssize_t -channelpadding_negotiate_parse(channelpadding_negotiate_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = channelpadding_negotiate_new(); - if (NULL == *output) - return -1; - result = channelpadding_negotiate_parse_into(*output, input, len_in); - if (result < 0) { - channelpadding_negotiate_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/channelpadding_negotiation.h b/src/tor/src/trunnel/channelpadding_negotiation.h deleted file mode 100644 index fcfc232fe..000000000 --- a/src/tor/src/trunnel/channelpadding_negotiation.h +++ /dev/null @@ -1,98 +0,0 @@ -/* channelpadding_negotiation.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_CHANNELPADDING_NEGOTIATION_H -#define TRUNNEL_CHANNELPADDING_NEGOTIATION_H - -#include -#include "trunnel.h" - -#define CHANNELPADDING_COMMAND_STOP 1 -#define CHANNELPADDING_COMMAND_START 2 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CHANNELPADDING_NEGOTIATE) -struct channelpadding_negotiate_st { - uint8_t version; - uint8_t command; - uint16_t ito_low_ms; - uint16_t ito_high_ms; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct channelpadding_negotiate_st channelpadding_negotiate_t; -/** Return a newly allocated channelpadding_negotiate with all - * elements set to zero. - */ -channelpadding_negotiate_t *channelpadding_negotiate_new(void); -/** Release all storage held by the channelpadding_negotiate in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void channelpadding_negotiate_free(channelpadding_negotiate_t *victim); -/** Try to parse a channelpadding_negotiate from the buffer in - * 'input', using up to 'len_in' bytes from the input buffer. On - * success, return the number of bytes consumed and set *output to the - * newly allocated channelpadding_negotiate_t. On failure, return -2 - * if the input appears truncated, and -1 if the input is otherwise - * invalid. - */ -ssize_t channelpadding_negotiate_parse(channelpadding_negotiate_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * channelpadding_negotiate in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t channelpadding_negotiate_encoded_len(const channelpadding_negotiate_t *obj); -/** Try to encode the channelpadding_negotiate from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t channelpadding_negotiate_encode(uint8_t *output, size_t avail, const channelpadding_negotiate_t *input); -/** Check whether the internal state of the channelpadding_negotiate - * in 'obj' is consistent. Return NULL if it is, and a short message - * if it is not. - */ -const char *channelpadding_negotiate_check(const channelpadding_negotiate_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int channelpadding_negotiate_clear_errors(channelpadding_negotiate_t *obj); -/** Return the value of the version field of the - * channelpadding_negotiate_t in 'inp' - */ -uint8_t channelpadding_negotiate_get_version(const channelpadding_negotiate_t *inp); -/** Set the value of the version field of the - * channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int channelpadding_negotiate_set_version(channelpadding_negotiate_t *inp, uint8_t val); -/** Return the value of the command field of the - * channelpadding_negotiate_t in 'inp' - */ -uint8_t channelpadding_negotiate_get_command(const channelpadding_negotiate_t *inp); -/** Set the value of the command field of the - * channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int channelpadding_negotiate_set_command(channelpadding_negotiate_t *inp, uint8_t val); -/** Return the value of the ito_low_ms field of the - * channelpadding_negotiate_t in 'inp' - */ -uint16_t channelpadding_negotiate_get_ito_low_ms(const channelpadding_negotiate_t *inp); -/** Set the value of the ito_low_ms field of the - * channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int channelpadding_negotiate_set_ito_low_ms(channelpadding_negotiate_t *inp, uint16_t val); -/** Return the value of the ito_high_ms field of the - * channelpadding_negotiate_t in 'inp' - */ -uint16_t channelpadding_negotiate_get_ito_high_ms(const channelpadding_negotiate_t *inp); -/** Set the value of the ito_high_ms field of the - * channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int channelpadding_negotiate_set_ito_high_ms(channelpadding_negotiate_t *inp, uint16_t val); - - -#endif diff --git a/src/tor/src/trunnel/channelpadding_negotiation.trunnel b/src/tor/src/trunnel/channelpadding_negotiation.trunnel deleted file mode 100644 index 7f2d4795b..000000000 --- a/src/tor/src/trunnel/channelpadding_negotiation.trunnel +++ /dev/null @@ -1,17 +0,0 @@ -const CHANNELPADDING_COMMAND_STOP = 1; -const CHANNELPADDING_COMMAND_START = 2; - -/* This command tells the relay to alter its min and max netflow - timeout range values, and send padding at that rate (resuming - if stopped). */ -struct channelpadding_negotiate { - u8 version IN [0]; - u8 command IN [CHANNELPADDING_COMMAND_START, CHANNELPADDING_COMMAND_STOP]; - - /* Min must not be lower than the current consensus parameter - nf_ito_low. */ - u16 ito_low_ms; - - /* Max must not be lower than ito_low_ms */ - u16 ito_high_ms; -}; diff --git a/src/tor/src/trunnel/ed25519_cert.c b/src/tor/src/trunnel/ed25519_cert.c deleted file mode 100644 index 1276c7a50..000000000 --- a/src/tor/src/trunnel/ed25519_cert.c +++ /dev/null @@ -1,2713 +0,0 @@ -/* ed25519_cert.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "ed25519_cert.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int edcert_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || edcert_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -create2_cell_body_t * -create2_cell_body_new(void) -{ - create2_cell_body_t *val = trunnel_calloc(1, sizeof(create2_cell_body_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -create2_cell_body_clear(create2_cell_body_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->handshake_data); - TRUNNEL_DYNARRAY_CLEAR(&obj->handshake_data); -} - -void -create2_cell_body_free(create2_cell_body_t *obj) -{ - if (obj == NULL) - return; - create2_cell_body_clear(obj); - trunnel_memwipe(obj, sizeof(create2_cell_body_t)); - trunnel_free_(obj); -} - -uint16_t -create2_cell_body_get_handshake_type(const create2_cell_body_t *inp) -{ - return inp->handshake_type; -} -int -create2_cell_body_set_handshake_type(create2_cell_body_t *inp, uint16_t val) -{ - inp->handshake_type = val; - return 0; -} -uint16_t -create2_cell_body_get_handshake_len(const create2_cell_body_t *inp) -{ - return inp->handshake_len; -} -int -create2_cell_body_set_handshake_len(create2_cell_body_t *inp, uint16_t val) -{ - inp->handshake_len = val; - return 0; -} -size_t -create2_cell_body_getlen_handshake_data(const create2_cell_body_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->handshake_data); -} - -uint8_t -create2_cell_body_get_handshake_data(create2_cell_body_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->handshake_data, idx); -} - -uint8_t -create2_cell_body_getconst_handshake_data(const create2_cell_body_t *inp, size_t idx) -{ - return create2_cell_body_get_handshake_data((create2_cell_body_t*)inp, idx); -} -int -create2_cell_body_set_handshake_data(create2_cell_body_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->handshake_data, idx, elt); - return 0; -} -int -create2_cell_body_add_handshake_data(create2_cell_body_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->handshake_data.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->handshake_data, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -create2_cell_body_getarray_handshake_data(create2_cell_body_t *inp) -{ - return inp->handshake_data.elts_; -} -const uint8_t * -create2_cell_body_getconstarray_handshake_data(const create2_cell_body_t *inp) -{ - return (const uint8_t *)create2_cell_body_getarray_handshake_data((create2_cell_body_t*)inp); -} -int -create2_cell_body_setlen_handshake_data(create2_cell_body_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->handshake_data.allocated_, - &inp->handshake_data.n_, inp->handshake_data.elts_, newlen, - sizeof(inp->handshake_data.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->handshake_data.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -create2_cell_body_check(const create2_cell_body_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (TRUNNEL_DYNARRAY_LEN(&obj->handshake_data) != obj->handshake_len) - return "Length mismatch for handshake_data"; - return NULL; -} - -ssize_t -create2_cell_body_encoded_len(const create2_cell_body_t *obj) -{ - ssize_t result = 0; - - if (NULL != create2_cell_body_check(obj)) - return -1; - - - /* Length of u16 handshake_type */ - result += 2; - - /* Length of u16 handshake_len */ - result += 2; - - /* Length of u8 handshake_data[handshake_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->handshake_data); - return result; -} -int -create2_cell_body_clear_errors(create2_cell_body_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -create2_cell_body_encode(uint8_t *output, const size_t avail, const create2_cell_body_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = create2_cell_body_encoded_len(obj); -#endif - - if (NULL != (msg = create2_cell_body_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u16 handshake_type */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->handshake_type)); - written += 2; ptr += 2; - - /* Encode u16 handshake_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->handshake_len)); - written += 2; ptr += 2; - - /* Encode u8 handshake_data[handshake_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->handshake_data); - trunnel_assert(obj->handshake_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->handshake_data.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As create2_cell_body_parse(), but do not allocate the output - * object. - */ -static ssize_t -create2_cell_body_parse_into(create2_cell_body_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u16 handshake_type */ - CHECK_REMAINING(2, truncated); - obj->handshake_type = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u16 handshake_len */ - CHECK_REMAINING(2, truncated); - obj->handshake_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 handshake_data[handshake_len] */ - CHECK_REMAINING(obj->handshake_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->handshake_data, obj->handshake_len, {}); - obj->handshake_data.n_ = obj->handshake_len; - if (obj->handshake_len) - memcpy(obj->handshake_data.elts_, ptr, obj->handshake_len); - ptr += obj->handshake_len; remaining -= obj->handshake_len; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -create2_cell_body_parse(create2_cell_body_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = create2_cell_body_new(); - if (NULL == *output) - return -1; - result = create2_cell_body_parse_into(*output, input, len_in); - if (result < 0) { - create2_cell_body_free(*output); - *output = NULL; - } - return result; -} -ed25519_cert_extension_t * -ed25519_cert_extension_new(void) -{ - ed25519_cert_extension_t *val = trunnel_calloc(1, sizeof(ed25519_cert_extension_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -ed25519_cert_extension_clear(ed25519_cert_extension_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->un_unparsed); - TRUNNEL_DYNARRAY_CLEAR(&obj->un_unparsed); -} - -void -ed25519_cert_extension_free(ed25519_cert_extension_t *obj) -{ - if (obj == NULL) - return; - ed25519_cert_extension_clear(obj); - trunnel_memwipe(obj, sizeof(ed25519_cert_extension_t)); - trunnel_free_(obj); -} - -uint16_t -ed25519_cert_extension_get_ext_length(const ed25519_cert_extension_t *inp) -{ - return inp->ext_length; -} -int -ed25519_cert_extension_set_ext_length(ed25519_cert_extension_t *inp, uint16_t val) -{ - inp->ext_length = val; - return 0; -} -uint8_t -ed25519_cert_extension_get_ext_type(const ed25519_cert_extension_t *inp) -{ - return inp->ext_type; -} -int -ed25519_cert_extension_set_ext_type(ed25519_cert_extension_t *inp, uint8_t val) -{ - inp->ext_type = val; - return 0; -} -uint8_t -ed25519_cert_extension_get_ext_flags(const ed25519_cert_extension_t *inp) -{ - return inp->ext_flags; -} -int -ed25519_cert_extension_set_ext_flags(ed25519_cert_extension_t *inp, uint8_t val) -{ - inp->ext_flags = val; - return 0; -} -size_t -ed25519_cert_extension_getlen_un_signing_key(const ed25519_cert_extension_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -ed25519_cert_extension_get_un_signing_key(ed25519_cert_extension_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->un_signing_key[idx]; -} - -uint8_t -ed25519_cert_extension_getconst_un_signing_key(const ed25519_cert_extension_t *inp, size_t idx) -{ - return ed25519_cert_extension_get_un_signing_key((ed25519_cert_extension_t*)inp, idx); -} -int -ed25519_cert_extension_set_un_signing_key(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->un_signing_key[idx] = elt; - return 0; -} - -uint8_t * -ed25519_cert_extension_getarray_un_signing_key(ed25519_cert_extension_t *inp) -{ - return inp->un_signing_key; -} -const uint8_t * -ed25519_cert_extension_getconstarray_un_signing_key(const ed25519_cert_extension_t *inp) -{ - return (const uint8_t *)ed25519_cert_extension_getarray_un_signing_key((ed25519_cert_extension_t*)inp); -} -size_t -ed25519_cert_extension_getlen_un_unparsed(const ed25519_cert_extension_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->un_unparsed); -} - -uint8_t -ed25519_cert_extension_get_un_unparsed(ed25519_cert_extension_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->un_unparsed, idx); -} - -uint8_t -ed25519_cert_extension_getconst_un_unparsed(const ed25519_cert_extension_t *inp, size_t idx) -{ - return ed25519_cert_extension_get_un_unparsed((ed25519_cert_extension_t*)inp, idx); -} -int -ed25519_cert_extension_set_un_unparsed(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->un_unparsed, idx, elt); - return 0; -} -int -ed25519_cert_extension_add_un_unparsed(ed25519_cert_extension_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->un_unparsed, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -ed25519_cert_extension_getarray_un_unparsed(ed25519_cert_extension_t *inp) -{ - return inp->un_unparsed.elts_; -} -const uint8_t * -ed25519_cert_extension_getconstarray_un_unparsed(const ed25519_cert_extension_t *inp) -{ - return (const uint8_t *)ed25519_cert_extension_getarray_un_unparsed((ed25519_cert_extension_t*)inp); -} -int -ed25519_cert_extension_setlen_un_unparsed(ed25519_cert_extension_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->un_unparsed.allocated_, - &inp->un_unparsed.n_, inp->un_unparsed.elts_, newlen, - sizeof(inp->un_unparsed.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->un_unparsed.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -ed25519_cert_extension_check(const ed25519_cert_extension_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - switch (obj->ext_type) { - - case CERTEXT_SIGNED_WITH_KEY: - break; - - default: - break; - } - return NULL; -} - -ssize_t -ed25519_cert_extension_encoded_len(const ed25519_cert_extension_t *obj) -{ - ssize_t result = 0; - - if (NULL != ed25519_cert_extension_check(obj)) - return -1; - - - /* Length of u16 ext_length */ - result += 2; - - /* Length of u8 ext_type */ - result += 1; - - /* Length of u8 ext_flags */ - result += 1; - switch (obj->ext_type) { - - case CERTEXT_SIGNED_WITH_KEY: - - /* Length of u8 un_signing_key[32] */ - result += 32; - break; - - default: - - /* Length of u8 un_unparsed[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->un_unparsed); - break; - } - return result; -} -int -ed25519_cert_extension_clear_errors(ed25519_cert_extension_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -ed25519_cert_extension_encode(uint8_t *output, const size_t avail, const ed25519_cert_extension_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = ed25519_cert_extension_encoded_len(obj); -#endif - - uint8_t *backptr_ext_length = NULL; - - if (NULL != (msg = ed25519_cert_extension_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u16 ext_length */ - backptr_ext_length = ptr; - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->ext_length)); - written += 2; ptr += 2; - - /* Encode u8 ext_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->ext_type)); - written += 1; ptr += 1; - - /* Encode u8 ext_flags */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->ext_flags)); - written += 1; ptr += 1; - { - size_t written_before_union = written; - - /* Encode union un[ext_type] */ - trunnel_assert(written <= avail); - switch (obj->ext_type) { - - case CERTEXT_SIGNED_WITH_KEY: - - /* Encode u8 un_signing_key[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->un_signing_key, 32); - written += 32; ptr += 32; - break; - - default: - - /* Encode u8 un_unparsed[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->un_unparsed); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->un_unparsed.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - break; - } - /* Write the length field back to ext_length */ - trunnel_assert(written >= written_before_union); -#if UINT16_MAX < SIZE_MAX - if (written - written_before_union > UINT16_MAX) - goto check_failed; -#endif - trunnel_set_uint16(backptr_ext_length, trunnel_htons(written - written_before_union)); - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As ed25519_cert_extension_parse(), but do not allocate the output - * object. - */ -static ssize_t -ed25519_cert_extension_parse_into(ed25519_cert_extension_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u16 ext_length */ - CHECK_REMAINING(2, truncated); - obj->ext_length = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 ext_type */ - CHECK_REMAINING(1, truncated); - obj->ext_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 ext_flags */ - CHECK_REMAINING(1, truncated); - obj->ext_flags = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - { - size_t remaining_after; - CHECK_REMAINING(obj->ext_length, truncated); - remaining_after = remaining - obj->ext_length; - remaining = obj->ext_length; - - /* Parse union un[ext_type] */ - switch (obj->ext_type) { - - case CERTEXT_SIGNED_WITH_KEY: - - /* Parse u8 un_signing_key[32] */ - CHECK_REMAINING(32, fail); - memcpy(obj->un_signing_key, ptr, 32); - remaining -= 32; ptr += 32; - break; - - default: - - /* Parse u8 un_unparsed[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->un_unparsed, remaining, {}); - obj->un_unparsed.n_ = remaining; - if (remaining) - memcpy(obj->un_unparsed.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - break; - } - if (remaining != 0) - goto fail; - remaining = remaining_after; - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -ed25519_cert_extension_parse(ed25519_cert_extension_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = ed25519_cert_extension_new(); - if (NULL == *output) - return -1; - result = ed25519_cert_extension_parse_into(*output, input, len_in); - if (result < 0) { - ed25519_cert_extension_free(*output); - *output = NULL; - } - return result; -} -extend1_cell_body_t * -extend1_cell_body_new(void) -{ - extend1_cell_body_t *val = trunnel_calloc(1, sizeof(extend1_cell_body_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -extend1_cell_body_clear(extend1_cell_body_t *obj) -{ - (void) obj; -} - -void -extend1_cell_body_free(extend1_cell_body_t *obj) -{ - if (obj == NULL) - return; - extend1_cell_body_clear(obj); - trunnel_memwipe(obj, sizeof(extend1_cell_body_t)); - trunnel_free_(obj); -} - -uint32_t -extend1_cell_body_get_ipv4addr(const extend1_cell_body_t *inp) -{ - return inp->ipv4addr; -} -int -extend1_cell_body_set_ipv4addr(extend1_cell_body_t *inp, uint32_t val) -{ - inp->ipv4addr = val; - return 0; -} -uint16_t -extend1_cell_body_get_port(const extend1_cell_body_t *inp) -{ - return inp->port; -} -int -extend1_cell_body_set_port(extend1_cell_body_t *inp, uint16_t val) -{ - inp->port = val; - return 0; -} -size_t -extend1_cell_body_getlen_onionskin(const extend1_cell_body_t *inp) -{ - (void)inp; return 186; -} - -uint8_t -extend1_cell_body_get_onionskin(extend1_cell_body_t *inp, size_t idx) -{ - trunnel_assert(idx < 186); - return inp->onionskin[idx]; -} - -uint8_t -extend1_cell_body_getconst_onionskin(const extend1_cell_body_t *inp, size_t idx) -{ - return extend1_cell_body_get_onionskin((extend1_cell_body_t*)inp, idx); -} -int -extend1_cell_body_set_onionskin(extend1_cell_body_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 186); - inp->onionskin[idx] = elt; - return 0; -} - -uint8_t * -extend1_cell_body_getarray_onionskin(extend1_cell_body_t *inp) -{ - return inp->onionskin; -} -const uint8_t * -extend1_cell_body_getconstarray_onionskin(const extend1_cell_body_t *inp) -{ - return (const uint8_t *)extend1_cell_body_getarray_onionskin((extend1_cell_body_t*)inp); -} -size_t -extend1_cell_body_getlen_identity(const extend1_cell_body_t *inp) -{ - (void)inp; return 20; -} - -uint8_t -extend1_cell_body_get_identity(extend1_cell_body_t *inp, size_t idx) -{ - trunnel_assert(idx < 20); - return inp->identity[idx]; -} - -uint8_t -extend1_cell_body_getconst_identity(const extend1_cell_body_t *inp, size_t idx) -{ - return extend1_cell_body_get_identity((extend1_cell_body_t*)inp, idx); -} -int -extend1_cell_body_set_identity(extend1_cell_body_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 20); - inp->identity[idx] = elt; - return 0; -} - -uint8_t * -extend1_cell_body_getarray_identity(extend1_cell_body_t *inp) -{ - return inp->identity; -} -const uint8_t * -extend1_cell_body_getconstarray_identity(const extend1_cell_body_t *inp) -{ - return (const uint8_t *)extend1_cell_body_getarray_identity((extend1_cell_body_t*)inp); -} -const char * -extend1_cell_body_check(const extend1_cell_body_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - return NULL; -} - -ssize_t -extend1_cell_body_encoded_len(const extend1_cell_body_t *obj) -{ - ssize_t result = 0; - - if (NULL != extend1_cell_body_check(obj)) - return -1; - - - /* Length of u32 ipv4addr */ - result += 4; - - /* Length of u16 port */ - result += 2; - - /* Length of u8 onionskin[186] */ - result += 186; - - /* Length of u8 identity[20] */ - result += 20; - return result; -} -int -extend1_cell_body_clear_errors(extend1_cell_body_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -extend1_cell_body_encode(uint8_t *output, const size_t avail, const extend1_cell_body_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = extend1_cell_body_encoded_len(obj); -#endif - - if (NULL != (msg = extend1_cell_body_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u32 ipv4addr */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->ipv4addr)); - written += 4; ptr += 4; - - /* Encode u16 port */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->port)); - written += 2; ptr += 2; - - /* Encode u8 onionskin[186] */ - trunnel_assert(written <= avail); - if (avail - written < 186) - goto truncated; - memcpy(ptr, obj->onionskin, 186); - written += 186; ptr += 186; - - /* Encode u8 identity[20] */ - trunnel_assert(written <= avail); - if (avail - written < 20) - goto truncated; - memcpy(ptr, obj->identity, 20); - written += 20; ptr += 20; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As extend1_cell_body_parse(), but do not allocate the output - * object. - */ -static ssize_t -extend1_cell_body_parse_into(extend1_cell_body_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u32 ipv4addr */ - CHECK_REMAINING(4, truncated); - obj->ipv4addr = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - - /* Parse u16 port */ - CHECK_REMAINING(2, truncated); - obj->port = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 onionskin[186] */ - CHECK_REMAINING(186, truncated); - memcpy(obj->onionskin, ptr, 186); - remaining -= 186; ptr += 186; - - /* Parse u8 identity[20] */ - CHECK_REMAINING(20, truncated); - memcpy(obj->identity, ptr, 20); - remaining -= 20; ptr += 20; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; -} - -ssize_t -extend1_cell_body_parse(extend1_cell_body_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = extend1_cell_body_new(); - if (NULL == *output) - return -1; - result = extend1_cell_body_parse_into(*output, input, len_in); - if (result < 0) { - extend1_cell_body_free(*output); - *output = NULL; - } - return result; -} -link_specifier_t * -link_specifier_new(void) -{ - link_specifier_t *val = trunnel_calloc(1, sizeof(link_specifier_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -link_specifier_clear(link_specifier_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->un_unrecognized); - TRUNNEL_DYNARRAY_CLEAR(&obj->un_unrecognized); -} - -void -link_specifier_free(link_specifier_t *obj) -{ - if (obj == NULL) - return; - link_specifier_clear(obj); - trunnel_memwipe(obj, sizeof(link_specifier_t)); - trunnel_free_(obj); -} - -uint8_t -link_specifier_get_ls_type(const link_specifier_t *inp) -{ - return inp->ls_type; -} -int -link_specifier_set_ls_type(link_specifier_t *inp, uint8_t val) -{ - inp->ls_type = val; - return 0; -} -uint8_t -link_specifier_get_ls_len(const link_specifier_t *inp) -{ - return inp->ls_len; -} -int -link_specifier_set_ls_len(link_specifier_t *inp, uint8_t val) -{ - inp->ls_len = val; - return 0; -} -uint32_t -link_specifier_get_un_ipv4_addr(const link_specifier_t *inp) -{ - return inp->un_ipv4_addr; -} -int -link_specifier_set_un_ipv4_addr(link_specifier_t *inp, uint32_t val) -{ - inp->un_ipv4_addr = val; - return 0; -} -uint16_t -link_specifier_get_un_ipv4_port(const link_specifier_t *inp) -{ - return inp->un_ipv4_port; -} -int -link_specifier_set_un_ipv4_port(link_specifier_t *inp, uint16_t val) -{ - inp->un_ipv4_port = val; - return 0; -} -size_t -link_specifier_getlen_un_ipv6_addr(const link_specifier_t *inp) -{ - (void)inp; return 16; -} - -uint8_t -link_specifier_get_un_ipv6_addr(link_specifier_t *inp, size_t idx) -{ - trunnel_assert(idx < 16); - return inp->un_ipv6_addr[idx]; -} - -uint8_t -link_specifier_getconst_un_ipv6_addr(const link_specifier_t *inp, size_t idx) -{ - return link_specifier_get_un_ipv6_addr((link_specifier_t*)inp, idx); -} -int -link_specifier_set_un_ipv6_addr(link_specifier_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 16); - inp->un_ipv6_addr[idx] = elt; - return 0; -} - -uint8_t * -link_specifier_getarray_un_ipv6_addr(link_specifier_t *inp) -{ - return inp->un_ipv6_addr; -} -const uint8_t * -link_specifier_getconstarray_un_ipv6_addr(const link_specifier_t *inp) -{ - return (const uint8_t *)link_specifier_getarray_un_ipv6_addr((link_specifier_t*)inp); -} -uint16_t -link_specifier_get_un_ipv6_port(const link_specifier_t *inp) -{ - return inp->un_ipv6_port; -} -int -link_specifier_set_un_ipv6_port(link_specifier_t *inp, uint16_t val) -{ - inp->un_ipv6_port = val; - return 0; -} -size_t -link_specifier_getlen_un_legacy_id(const link_specifier_t *inp) -{ - (void)inp; return 20; -} - -uint8_t -link_specifier_get_un_legacy_id(link_specifier_t *inp, size_t idx) -{ - trunnel_assert(idx < 20); - return inp->un_legacy_id[idx]; -} - -uint8_t -link_specifier_getconst_un_legacy_id(const link_specifier_t *inp, size_t idx) -{ - return link_specifier_get_un_legacy_id((link_specifier_t*)inp, idx); -} -int -link_specifier_set_un_legacy_id(link_specifier_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 20); - inp->un_legacy_id[idx] = elt; - return 0; -} - -uint8_t * -link_specifier_getarray_un_legacy_id(link_specifier_t *inp) -{ - return inp->un_legacy_id; -} -const uint8_t * -link_specifier_getconstarray_un_legacy_id(const link_specifier_t *inp) -{ - return (const uint8_t *)link_specifier_getarray_un_legacy_id((link_specifier_t*)inp); -} -size_t -link_specifier_getlen_un_ed25519_id(const link_specifier_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -link_specifier_get_un_ed25519_id(link_specifier_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->un_ed25519_id[idx]; -} - -uint8_t -link_specifier_getconst_un_ed25519_id(const link_specifier_t *inp, size_t idx) -{ - return link_specifier_get_un_ed25519_id((link_specifier_t*)inp, idx); -} -int -link_specifier_set_un_ed25519_id(link_specifier_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->un_ed25519_id[idx] = elt; - return 0; -} - -uint8_t * -link_specifier_getarray_un_ed25519_id(link_specifier_t *inp) -{ - return inp->un_ed25519_id; -} -const uint8_t * -link_specifier_getconstarray_un_ed25519_id(const link_specifier_t *inp) -{ - return (const uint8_t *)link_specifier_getarray_un_ed25519_id((link_specifier_t*)inp); -} -size_t -link_specifier_getlen_un_unrecognized(const link_specifier_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->un_unrecognized); -} - -uint8_t -link_specifier_get_un_unrecognized(link_specifier_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->un_unrecognized, idx); -} - -uint8_t -link_specifier_getconst_un_unrecognized(const link_specifier_t *inp, size_t idx) -{ - return link_specifier_get_un_unrecognized((link_specifier_t*)inp, idx); -} -int -link_specifier_set_un_unrecognized(link_specifier_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->un_unrecognized, idx, elt); - return 0; -} -int -link_specifier_add_un_unrecognized(link_specifier_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->un_unrecognized, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -link_specifier_getarray_un_unrecognized(link_specifier_t *inp) -{ - return inp->un_unrecognized.elts_; -} -const uint8_t * -link_specifier_getconstarray_un_unrecognized(const link_specifier_t *inp) -{ - return (const uint8_t *)link_specifier_getarray_un_unrecognized((link_specifier_t*)inp); -} -int -link_specifier_setlen_un_unrecognized(link_specifier_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->un_unrecognized.allocated_, - &inp->un_unrecognized.n_, inp->un_unrecognized.elts_, newlen, - sizeof(inp->un_unrecognized.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->un_unrecognized.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -link_specifier_check(const link_specifier_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - switch (obj->ls_type) { - - case LS_IPV4: - break; - - case LS_IPV6: - break; - - case LS_LEGACY_ID: - break; - - case LS_ED25519_ID: - break; - - default: - break; - } - return NULL; -} - -ssize_t -link_specifier_encoded_len(const link_specifier_t *obj) -{ - ssize_t result = 0; - - if (NULL != link_specifier_check(obj)) - return -1; - - - /* Length of u8 ls_type */ - result += 1; - - /* Length of u8 ls_len */ - result += 1; - switch (obj->ls_type) { - - case LS_IPV4: - - /* Length of u32 un_ipv4_addr */ - result += 4; - - /* Length of u16 un_ipv4_port */ - result += 2; - break; - - case LS_IPV6: - - /* Length of u8 un_ipv6_addr[16] */ - result += 16; - - /* Length of u16 un_ipv6_port */ - result += 2; - break; - - case LS_LEGACY_ID: - - /* Length of u8 un_legacy_id[20] */ - result += 20; - break; - - case LS_ED25519_ID: - - /* Length of u8 un_ed25519_id[32] */ - result += 32; - break; - - default: - - /* Length of u8 un_unrecognized[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->un_unrecognized); - break; - } - return result; -} -int -link_specifier_clear_errors(link_specifier_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -link_specifier_encode(uint8_t *output, const size_t avail, const link_specifier_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = link_specifier_encoded_len(obj); -#endif - - uint8_t *backptr_ls_len = NULL; - - if (NULL != (msg = link_specifier_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 ls_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->ls_type)); - written += 1; ptr += 1; - - /* Encode u8 ls_len */ - backptr_ls_len = ptr; - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->ls_len)); - written += 1; ptr += 1; - { - size_t written_before_union = written; - - /* Encode union un[ls_type] */ - trunnel_assert(written <= avail); - switch (obj->ls_type) { - - case LS_IPV4: - - /* Encode u32 un_ipv4_addr */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->un_ipv4_addr)); - written += 4; ptr += 4; - - /* Encode u16 un_ipv4_port */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->un_ipv4_port)); - written += 2; ptr += 2; - break; - - case LS_IPV6: - - /* Encode u8 un_ipv6_addr[16] */ - trunnel_assert(written <= avail); - if (avail - written < 16) - goto truncated; - memcpy(ptr, obj->un_ipv6_addr, 16); - written += 16; ptr += 16; - - /* Encode u16 un_ipv6_port */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->un_ipv6_port)); - written += 2; ptr += 2; - break; - - case LS_LEGACY_ID: - - /* Encode u8 un_legacy_id[20] */ - trunnel_assert(written <= avail); - if (avail - written < 20) - goto truncated; - memcpy(ptr, obj->un_legacy_id, 20); - written += 20; ptr += 20; - break; - - case LS_ED25519_ID: - - /* Encode u8 un_ed25519_id[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->un_ed25519_id, 32); - written += 32; ptr += 32; - break; - - default: - - /* Encode u8 un_unrecognized[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->un_unrecognized); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->un_unrecognized.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - break; - } - /* Write the length field back to ls_len */ - trunnel_assert(written >= written_before_union); -#if UINT8_MAX < SIZE_MAX - if (written - written_before_union > UINT8_MAX) - goto check_failed; -#endif - trunnel_set_uint8(backptr_ls_len, (written - written_before_union)); - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As link_specifier_parse(), but do not allocate the output object. - */ -static ssize_t -link_specifier_parse_into(link_specifier_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 ls_type */ - CHECK_REMAINING(1, truncated); - obj->ls_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 ls_len */ - CHECK_REMAINING(1, truncated); - obj->ls_len = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - { - size_t remaining_after; - CHECK_REMAINING(obj->ls_len, truncated); - remaining_after = remaining - obj->ls_len; - remaining = obj->ls_len; - - /* Parse union un[ls_type] */ - switch (obj->ls_type) { - - case LS_IPV4: - - /* Parse u32 un_ipv4_addr */ - CHECK_REMAINING(4, fail); - obj->un_ipv4_addr = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - - /* Parse u16 un_ipv4_port */ - CHECK_REMAINING(2, fail); - obj->un_ipv4_port = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - break; - - case LS_IPV6: - - /* Parse u8 un_ipv6_addr[16] */ - CHECK_REMAINING(16, fail); - memcpy(obj->un_ipv6_addr, ptr, 16); - remaining -= 16; ptr += 16; - - /* Parse u16 un_ipv6_port */ - CHECK_REMAINING(2, fail); - obj->un_ipv6_port = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - break; - - case LS_LEGACY_ID: - - /* Parse u8 un_legacy_id[20] */ - CHECK_REMAINING(20, fail); - memcpy(obj->un_legacy_id, ptr, 20); - remaining -= 20; ptr += 20; - break; - - case LS_ED25519_ID: - - /* Parse u8 un_ed25519_id[32] */ - CHECK_REMAINING(32, fail); - memcpy(obj->un_ed25519_id, ptr, 32); - remaining -= 32; ptr += 32; - break; - - default: - - /* Parse u8 un_unrecognized[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->un_unrecognized, remaining, {}); - obj->un_unrecognized.n_ = remaining; - if (remaining) - memcpy(obj->un_unrecognized.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - break; - } - if (remaining != 0) - goto fail; - remaining = remaining_after; - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -link_specifier_parse(link_specifier_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = link_specifier_new(); - if (NULL == *output) - return -1; - result = link_specifier_parse_into(*output, input, len_in); - if (result < 0) { - link_specifier_free(*output); - *output = NULL; - } - return result; -} -ed25519_cert_t * -ed25519_cert_new(void) -{ - ed25519_cert_t *val = trunnel_calloc(1, sizeof(ed25519_cert_t)); - if (NULL == val) - return NULL; - val->version = 1; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -ed25519_cert_clear(ed25519_cert_t *obj) -{ - (void) obj; - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ext); ++idx) { - ed25519_cert_extension_free(TRUNNEL_DYNARRAY_GET(&obj->ext, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->ext); - TRUNNEL_DYNARRAY_CLEAR(&obj->ext); -} - -void -ed25519_cert_free(ed25519_cert_t *obj) -{ - if (obj == NULL) - return; - ed25519_cert_clear(obj); - trunnel_memwipe(obj, sizeof(ed25519_cert_t)); - trunnel_free_(obj); -} - -uint8_t -ed25519_cert_get_version(const ed25519_cert_t *inp) -{ - return inp->version; -} -int -ed25519_cert_set_version(ed25519_cert_t *inp, uint8_t val) -{ - if (! ((val == 1))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->version = val; - return 0; -} -uint8_t -ed25519_cert_get_cert_type(const ed25519_cert_t *inp) -{ - return inp->cert_type; -} -int -ed25519_cert_set_cert_type(ed25519_cert_t *inp, uint8_t val) -{ - inp->cert_type = val; - return 0; -} -uint32_t -ed25519_cert_get_exp_field(const ed25519_cert_t *inp) -{ - return inp->exp_field; -} -int -ed25519_cert_set_exp_field(ed25519_cert_t *inp, uint32_t val) -{ - inp->exp_field = val; - return 0; -} -uint8_t -ed25519_cert_get_cert_key_type(const ed25519_cert_t *inp) -{ - return inp->cert_key_type; -} -int -ed25519_cert_set_cert_key_type(ed25519_cert_t *inp, uint8_t val) -{ - inp->cert_key_type = val; - return 0; -} -size_t -ed25519_cert_getlen_certified_key(const ed25519_cert_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -ed25519_cert_get_certified_key(ed25519_cert_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->certified_key[idx]; -} - -uint8_t -ed25519_cert_getconst_certified_key(const ed25519_cert_t *inp, size_t idx) -{ - return ed25519_cert_get_certified_key((ed25519_cert_t*)inp, idx); -} -int -ed25519_cert_set_certified_key(ed25519_cert_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->certified_key[idx] = elt; - return 0; -} - -uint8_t * -ed25519_cert_getarray_certified_key(ed25519_cert_t *inp) -{ - return inp->certified_key; -} -const uint8_t * -ed25519_cert_getconstarray_certified_key(const ed25519_cert_t *inp) -{ - return (const uint8_t *)ed25519_cert_getarray_certified_key((ed25519_cert_t*)inp); -} -uint8_t -ed25519_cert_get_n_extensions(const ed25519_cert_t *inp) -{ - return inp->n_extensions; -} -int -ed25519_cert_set_n_extensions(ed25519_cert_t *inp, uint8_t val) -{ - inp->n_extensions = val; - return 0; -} -size_t -ed25519_cert_getlen_ext(const ed25519_cert_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->ext); -} - -struct ed25519_cert_extension_st * -ed25519_cert_get_ext(ed25519_cert_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->ext, idx); -} - - const struct ed25519_cert_extension_st * -ed25519_cert_getconst_ext(const ed25519_cert_t *inp, size_t idx) -{ - return ed25519_cert_get_ext((ed25519_cert_t*)inp, idx); -} -int -ed25519_cert_set_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt) -{ - ed25519_cert_extension_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->ext, idx); - if (oldval && oldval != elt) - ed25519_cert_extension_free(oldval); - return ed25519_cert_set0_ext(inp, idx, elt); -} -int -ed25519_cert_set0_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->ext, idx, elt); - return 0; -} -int -ed25519_cert_add_ext(ed25519_cert_t *inp, struct ed25519_cert_extension_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->ext.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct ed25519_cert_extension_st *, &inp->ext, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct ed25519_cert_extension_st * * -ed25519_cert_getarray_ext(ed25519_cert_t *inp) -{ - return inp->ext.elts_; -} -const struct ed25519_cert_extension_st * const * -ed25519_cert_getconstarray_ext(const ed25519_cert_t *inp) -{ - return (const struct ed25519_cert_extension_st * const *)ed25519_cert_getarray_ext((ed25519_cert_t*)inp); -} -int -ed25519_cert_setlen_ext(ed25519_cert_t *inp, size_t newlen) -{ - struct ed25519_cert_extension_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->ext.allocated_, - &inp->ext.n_, inp->ext.elts_, newlen, - sizeof(inp->ext.elts_[0]), (trunnel_free_fn_t) ed25519_cert_extension_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->ext.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -size_t -ed25519_cert_getlen_signature(const ed25519_cert_t *inp) -{ - (void)inp; return 64; -} - -uint8_t -ed25519_cert_get_signature(ed25519_cert_t *inp, size_t idx) -{ - trunnel_assert(idx < 64); - return inp->signature[idx]; -} - -uint8_t -ed25519_cert_getconst_signature(const ed25519_cert_t *inp, size_t idx) -{ - return ed25519_cert_get_signature((ed25519_cert_t*)inp, idx); -} -int -ed25519_cert_set_signature(ed25519_cert_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 64); - inp->signature[idx] = elt; - return 0; -} - -uint8_t * -ed25519_cert_getarray_signature(ed25519_cert_t *inp) -{ - return inp->signature; -} -const uint8_t * -ed25519_cert_getconstarray_signature(const ed25519_cert_t *inp) -{ - return (const uint8_t *)ed25519_cert_getarray_signature((ed25519_cert_t*)inp); -} -const char * -ed25519_cert_check(const ed25519_cert_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->version == 1)) - return "Integer out of bounds"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ext); ++idx) { - if (NULL != (msg = ed25519_cert_extension_check(TRUNNEL_DYNARRAY_GET(&obj->ext, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->ext) != obj->n_extensions) - return "Length mismatch for ext"; - return NULL; -} - -ssize_t -ed25519_cert_encoded_len(const ed25519_cert_t *obj) -{ - ssize_t result = 0; - - if (NULL != ed25519_cert_check(obj)) - return -1; - - - /* Length of u8 version IN [1] */ - result += 1; - - /* Length of u8 cert_type */ - result += 1; - - /* Length of u32 exp_field */ - result += 4; - - /* Length of u8 cert_key_type */ - result += 1; - - /* Length of u8 certified_key[32] */ - result += 32; - - /* Length of u8 n_extensions */ - result += 1; - - /* Length of struct ed25519_cert_extension ext[n_extensions] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ext); ++idx) { - result += ed25519_cert_extension_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->ext, idx)); - } - } - - /* Length of u8 signature[64] */ - result += 64; - return result; -} -int -ed25519_cert_clear_errors(ed25519_cert_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -ed25519_cert_encode(uint8_t *output, const size_t avail, const ed25519_cert_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = ed25519_cert_encoded_len(obj); -#endif - - if (NULL != (msg = ed25519_cert_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 version IN [1] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->version)); - written += 1; ptr += 1; - - /* Encode u8 cert_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->cert_type)); - written += 1; ptr += 1; - - /* Encode u32 exp_field */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->exp_field)); - written += 4; ptr += 4; - - /* Encode u8 cert_key_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->cert_key_type)); - written += 1; ptr += 1; - - /* Encode u8 certified_key[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->certified_key, 32); - written += 32; ptr += 32; - - /* Encode u8 n_extensions */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->n_extensions)); - written += 1; ptr += 1; - - /* Encode struct ed25519_cert_extension ext[n_extensions] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ext); ++idx) { - trunnel_assert(written <= avail); - result = ed25519_cert_extension_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->ext, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - /* Encode u8 signature[64] */ - trunnel_assert(written <= avail); - if (avail - written < 64) - goto truncated; - memcpy(ptr, obj->signature, 64); - written += 64; ptr += 64; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As ed25519_cert_parse(), but do not allocate the output object. - */ -static ssize_t -ed25519_cert_parse_into(ed25519_cert_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 version IN [1] */ - CHECK_REMAINING(1, truncated); - obj->version = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->version == 1)) - goto fail; - - /* Parse u8 cert_type */ - CHECK_REMAINING(1, truncated); - obj->cert_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u32 exp_field */ - CHECK_REMAINING(4, truncated); - obj->exp_field = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - - /* Parse u8 cert_key_type */ - CHECK_REMAINING(1, truncated); - obj->cert_key_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 certified_key[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->certified_key, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 n_extensions */ - CHECK_REMAINING(1, truncated); - obj->n_extensions = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct ed25519_cert_extension ext[n_extensions] */ - TRUNNEL_DYNARRAY_EXPAND(ed25519_cert_extension_t *, &obj->ext, obj->n_extensions, {}); - { - ed25519_cert_extension_t * elt; - unsigned idx; - for (idx = 0; idx < obj->n_extensions; ++idx) { - result = ed25519_cert_extension_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(ed25519_cert_extension_t *, &obj->ext, elt, {ed25519_cert_extension_free(elt);}); - } - } - - /* Parse u8 signature[64] */ - CHECK_REMAINING(64, truncated); - memcpy(obj->signature, ptr, 64); - remaining -= 64; ptr += 64; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -ed25519_cert_parse(ed25519_cert_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = ed25519_cert_new(); - if (NULL == *output) - return -1; - result = ed25519_cert_parse_into(*output, input, len_in); - if (result < 0) { - ed25519_cert_free(*output); - *output = NULL; - } - return result; -} -extend2_cell_body_t * -extend2_cell_body_new(void) -{ - extend2_cell_body_t *val = trunnel_calloc(1, sizeof(extend2_cell_body_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -extend2_cell_body_clear(extend2_cell_body_t *obj) -{ - (void) obj; - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ls); ++idx) { - link_specifier_free(TRUNNEL_DYNARRAY_GET(&obj->ls, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->ls); - TRUNNEL_DYNARRAY_CLEAR(&obj->ls); - create2_cell_body_free(obj->create2); - obj->create2 = NULL; -} - -void -extend2_cell_body_free(extend2_cell_body_t *obj) -{ - if (obj == NULL) - return; - extend2_cell_body_clear(obj); - trunnel_memwipe(obj, sizeof(extend2_cell_body_t)); - trunnel_free_(obj); -} - -uint8_t -extend2_cell_body_get_n_spec(const extend2_cell_body_t *inp) -{ - return inp->n_spec; -} -int -extend2_cell_body_set_n_spec(extend2_cell_body_t *inp, uint8_t val) -{ - inp->n_spec = val; - return 0; -} -size_t -extend2_cell_body_getlen_ls(const extend2_cell_body_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->ls); -} - -struct link_specifier_st * -extend2_cell_body_get_ls(extend2_cell_body_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->ls, idx); -} - - const struct link_specifier_st * -extend2_cell_body_getconst_ls(const extend2_cell_body_t *inp, size_t idx) -{ - return extend2_cell_body_get_ls((extend2_cell_body_t*)inp, idx); -} -int -extend2_cell_body_set_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt) -{ - link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->ls, idx); - if (oldval && oldval != elt) - link_specifier_free(oldval); - return extend2_cell_body_set0_ls(inp, idx, elt); -} -int -extend2_cell_body_set0_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->ls, idx, elt); - return 0; -} -int -extend2_cell_body_add_ls(extend2_cell_body_t *inp, struct link_specifier_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->ls.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct link_specifier_st *, &inp->ls, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct link_specifier_st * * -extend2_cell_body_getarray_ls(extend2_cell_body_t *inp) -{ - return inp->ls.elts_; -} -const struct link_specifier_st * const * -extend2_cell_body_getconstarray_ls(const extend2_cell_body_t *inp) -{ - return (const struct link_specifier_st * const *)extend2_cell_body_getarray_ls((extend2_cell_body_t*)inp); -} -int -extend2_cell_body_setlen_ls(extend2_cell_body_t *inp, size_t newlen) -{ - struct link_specifier_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->ls.allocated_, - &inp->ls.n_, inp->ls.elts_, newlen, - sizeof(inp->ls.elts_[0]), (trunnel_free_fn_t) link_specifier_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->ls.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -struct create2_cell_body_st * -extend2_cell_body_get_create2(extend2_cell_body_t *inp) -{ - return inp->create2; -} -const struct create2_cell_body_st * -extend2_cell_body_getconst_create2(const extend2_cell_body_t *inp) -{ - return extend2_cell_body_get_create2((extend2_cell_body_t*) inp); -} -int -extend2_cell_body_set_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val) -{ - if (inp->create2 && inp->create2 != val) - create2_cell_body_free(inp->create2); - return extend2_cell_body_set0_create2(inp, val); -} -int -extend2_cell_body_set0_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val) -{ - inp->create2 = val; - return 0; -} -const char * -extend2_cell_body_check(const extend2_cell_body_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ls); ++idx) { - if (NULL != (msg = link_specifier_check(TRUNNEL_DYNARRAY_GET(&obj->ls, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->ls) != obj->n_spec) - return "Length mismatch for ls"; - { - const char *msg; - if (NULL != (msg = create2_cell_body_check(obj->create2))) - return msg; - } - return NULL; -} - -ssize_t -extend2_cell_body_encoded_len(const extend2_cell_body_t *obj) -{ - ssize_t result = 0; - - if (NULL != extend2_cell_body_check(obj)) - return -1; - - - /* Length of u8 n_spec */ - result += 1; - - /* Length of struct link_specifier ls[n_spec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ls); ++idx) { - result += link_specifier_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->ls, idx)); - } - } - - /* Length of struct create2_cell_body create2 */ - result += create2_cell_body_encoded_len(obj->create2); - return result; -} -int -extend2_cell_body_clear_errors(extend2_cell_body_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -extend2_cell_body_encode(uint8_t *output, const size_t avail, const extend2_cell_body_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = extend2_cell_body_encoded_len(obj); -#endif - - if (NULL != (msg = extend2_cell_body_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 n_spec */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->n_spec)); - written += 1; ptr += 1; - - /* Encode struct link_specifier ls[n_spec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->ls); ++idx) { - trunnel_assert(written <= avail); - result = link_specifier_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->ls, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - /* Encode struct create2_cell_body create2 */ - trunnel_assert(written <= avail); - result = create2_cell_body_encode(ptr, avail - written, obj->create2); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As extend2_cell_body_parse(), but do not allocate the output - * object. - */ -static ssize_t -extend2_cell_body_parse_into(extend2_cell_body_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 n_spec */ - CHECK_REMAINING(1, truncated); - obj->n_spec = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct link_specifier ls[n_spec] */ - TRUNNEL_DYNARRAY_EXPAND(link_specifier_t *, &obj->ls, obj->n_spec, {}); - { - link_specifier_t * elt; - unsigned idx; - for (idx = 0; idx < obj->n_spec; ++idx) { - result = link_specifier_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(link_specifier_t *, &obj->ls, elt, {link_specifier_free(elt);}); - } - } - - /* Parse struct create2_cell_body create2 */ - result = create2_cell_body_parse(&obj->create2, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; -} - -ssize_t -extend2_cell_body_parse(extend2_cell_body_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = extend2_cell_body_new(); - if (NULL == *output) - return -1; - result = extend2_cell_body_parse_into(*output, input, len_in); - if (result < 0) { - extend2_cell_body_free(*output); - *output = NULL; - } - return result; -} -link_specifier_list_t * -link_specifier_list_new(void) -{ - link_specifier_list_t *val = trunnel_calloc(1, sizeof(link_specifier_list_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -link_specifier_list_clear(link_specifier_list_t *obj) -{ - (void) obj; - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->spec); ++idx) { - link_specifier_free(TRUNNEL_DYNARRAY_GET(&obj->spec, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->spec); - TRUNNEL_DYNARRAY_CLEAR(&obj->spec); -} - -void -link_specifier_list_free(link_specifier_list_t *obj) -{ - if (obj == NULL) - return; - link_specifier_list_clear(obj); - trunnel_memwipe(obj, sizeof(link_specifier_list_t)); - trunnel_free_(obj); -} - -uint8_t -link_specifier_list_get_n_spec(const link_specifier_list_t *inp) -{ - return inp->n_spec; -} -int -link_specifier_list_set_n_spec(link_specifier_list_t *inp, uint8_t val) -{ - inp->n_spec = val; - return 0; -} -size_t -link_specifier_list_getlen_spec(const link_specifier_list_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->spec); -} - -struct link_specifier_st * -link_specifier_list_get_spec(link_specifier_list_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->spec, idx); -} - - const struct link_specifier_st * -link_specifier_list_getconst_spec(const link_specifier_list_t *inp, size_t idx) -{ - return link_specifier_list_get_spec((link_specifier_list_t*)inp, idx); -} -int -link_specifier_list_set_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt) -{ - link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->spec, idx); - if (oldval && oldval != elt) - link_specifier_free(oldval); - return link_specifier_list_set0_spec(inp, idx, elt); -} -int -link_specifier_list_set0_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->spec, idx, elt); - return 0; -} -int -link_specifier_list_add_spec(link_specifier_list_t *inp, struct link_specifier_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->spec.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct link_specifier_st *, &inp->spec, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct link_specifier_st * * -link_specifier_list_getarray_spec(link_specifier_list_t *inp) -{ - return inp->spec.elts_; -} -const struct link_specifier_st * const * -link_specifier_list_getconstarray_spec(const link_specifier_list_t *inp) -{ - return (const struct link_specifier_st * const *)link_specifier_list_getarray_spec((link_specifier_list_t*)inp); -} -int -link_specifier_list_setlen_spec(link_specifier_list_t *inp, size_t newlen) -{ - struct link_specifier_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->spec.allocated_, - &inp->spec.n_, inp->spec.elts_, newlen, - sizeof(inp->spec.elts_[0]), (trunnel_free_fn_t) link_specifier_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->spec.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -link_specifier_list_check(const link_specifier_list_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->spec); ++idx) { - if (NULL != (msg = link_specifier_check(TRUNNEL_DYNARRAY_GET(&obj->spec, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->spec) != obj->n_spec) - return "Length mismatch for spec"; - return NULL; -} - -ssize_t -link_specifier_list_encoded_len(const link_specifier_list_t *obj) -{ - ssize_t result = 0; - - if (NULL != link_specifier_list_check(obj)) - return -1; - - - /* Length of u8 n_spec */ - result += 1; - - /* Length of struct link_specifier spec[n_spec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->spec); ++idx) { - result += link_specifier_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->spec, idx)); - } - } - return result; -} -int -link_specifier_list_clear_errors(link_specifier_list_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -link_specifier_list_encode(uint8_t *output, const size_t avail, const link_specifier_list_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = link_specifier_list_encoded_len(obj); -#endif - - if (NULL != (msg = link_specifier_list_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 n_spec */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->n_spec)); - written += 1; ptr += 1; - - /* Encode struct link_specifier spec[n_spec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->spec); ++idx) { - trunnel_assert(written <= avail); - result = link_specifier_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->spec, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As link_specifier_list_parse(), but do not allocate the output - * object. - */ -static ssize_t -link_specifier_list_parse_into(link_specifier_list_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 n_spec */ - CHECK_REMAINING(1, truncated); - obj->n_spec = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct link_specifier spec[n_spec] */ - TRUNNEL_DYNARRAY_EXPAND(link_specifier_t *, &obj->spec, obj->n_spec, {}); - { - link_specifier_t * elt; - unsigned idx; - for (idx = 0; idx < obj->n_spec; ++idx) { - result = link_specifier_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(link_specifier_t *, &obj->spec, elt, {link_specifier_free(elt);}); - } - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; -} - -ssize_t -link_specifier_list_parse(link_specifier_list_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = link_specifier_list_new(); - if (NULL == *output) - return -1; - result = link_specifier_list_parse_into(*output, input, len_in); - if (result < 0) { - link_specifier_list_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/ed25519_cert.h b/src/tor/src/trunnel/ed25519_cert.h deleted file mode 100644 index e086c6fce..000000000 --- a/src/tor/src/trunnel/ed25519_cert.h +++ /dev/null @@ -1,942 +0,0 @@ -/* ed25519_cert.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_ED25519_CERT_H -#define TRUNNEL_ED25519_CERT_H - -#include -#include "trunnel.h" - -#define CERTEXT_SIGNED_WITH_KEY 4 -#define CERTEXT_FLAG_AFFECTS_VALIDATION 1 -#define LS_IPV4 0 -#define LS_IPV6 1 -#define LS_LEGACY_ID 2 -#define LS_ED25519_ID 3 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CREATE2_CELL_BODY) -struct create2_cell_body_st { - uint16_t handshake_type; - uint16_t handshake_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) handshake_data; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct create2_cell_body_st create2_cell_body_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_ED25519_CERT_EXTENSION) -struct ed25519_cert_extension_st { - uint16_t ext_length; - uint8_t ext_type; - uint8_t ext_flags; - uint8_t un_signing_key[32]; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) un_unparsed; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct ed25519_cert_extension_st ed25519_cert_extension_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_EXTEND1_CELL_BODY) -struct extend1_cell_body_st { - uint32_t ipv4addr; - uint16_t port; - uint8_t onionskin[186]; - uint8_t identity[20]; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct extend1_cell_body_st extend1_cell_body_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_LINK_SPECIFIER) -struct link_specifier_st { - uint8_t ls_type; - uint8_t ls_len; - uint32_t un_ipv4_addr; - uint16_t un_ipv4_port; - uint8_t un_ipv6_addr[16]; - uint16_t un_ipv6_port; - uint8_t un_legacy_id[20]; - uint8_t un_ed25519_id[32]; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) un_unrecognized; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct link_specifier_st link_specifier_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_ED25519_CERT) -struct ed25519_cert_st { - uint8_t version; - uint8_t cert_type; - uint32_t exp_field; - uint8_t cert_key_type; - uint8_t certified_key[32]; - uint8_t n_extensions; - TRUNNEL_DYNARRAY_HEAD(, struct ed25519_cert_extension_st *) ext; - uint8_t signature[64]; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct ed25519_cert_st ed25519_cert_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_EXTEND2_CELL_BODY) -struct extend2_cell_body_st { - uint8_t n_spec; - TRUNNEL_DYNARRAY_HEAD(, struct link_specifier_st *) ls; - struct create2_cell_body_st *create2; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct extend2_cell_body_st extend2_cell_body_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_LINK_SPECIFIER_LIST) -struct link_specifier_list_st { - uint8_t n_spec; - TRUNNEL_DYNARRAY_HEAD(, struct link_specifier_st *) spec; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct link_specifier_list_st link_specifier_list_t; -/** Return a newly allocated create2_cell_body with all elements set - * to zero. - */ -create2_cell_body_t *create2_cell_body_new(void); -/** Release all storage held by the create2_cell_body in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void create2_cell_body_free(create2_cell_body_t *victim); -/** Try to parse a create2_cell_body from the buffer in 'input', using - * up to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * create2_cell_body_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t create2_cell_body_parse(create2_cell_body_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * create2_cell_body in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t create2_cell_body_encoded_len(const create2_cell_body_t *obj); -/** Try to encode the create2_cell_body from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t create2_cell_body_encode(uint8_t *output, size_t avail, const create2_cell_body_t *input); -/** Check whether the internal state of the create2_cell_body in 'obj' - * is consistent. Return NULL if it is, and a short message if it is - * not. - */ -const char *create2_cell_body_check(const create2_cell_body_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int create2_cell_body_clear_errors(create2_cell_body_t *obj); -/** Return the value of the handshake_type field of the - * create2_cell_body_t in 'inp' - */ -uint16_t create2_cell_body_get_handshake_type(const create2_cell_body_t *inp); -/** Set the value of the handshake_type field of the - * create2_cell_body_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int create2_cell_body_set_handshake_type(create2_cell_body_t *inp, uint16_t val); -/** Return the value of the handshake_len field of the - * create2_cell_body_t in 'inp' - */ -uint16_t create2_cell_body_get_handshake_len(const create2_cell_body_t *inp); -/** Set the value of the handshake_len field of the - * create2_cell_body_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int create2_cell_body_set_handshake_len(create2_cell_body_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the handshake_data - * field of the create2_cell_body_t in 'inp'. - */ -size_t create2_cell_body_getlen_handshake_data(const create2_cell_body_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * handshake_data of the create2_cell_body_t in 'inp'. - */ -uint8_t create2_cell_body_get_handshake_data(create2_cell_body_t *inp, size_t idx); -/** As create2_cell_body_get_handshake_data, but take and return a - * const pointer - */ -uint8_t create2_cell_body_getconst_handshake_data(const create2_cell_body_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * handshake_data of the create2_cell_body_t in 'inp', so that it will - * hold the value 'elt'. - */ -int create2_cell_body_set_handshake_data(create2_cell_body_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field - * handshake_data of the create2_cell_body_t in 'inp'. - */ -int create2_cell_body_add_handshake_data(create2_cell_body_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field handshake_data - * of 'inp'. - */ -uint8_t * create2_cell_body_getarray_handshake_data(create2_cell_body_t *inp); -/** As create2_cell_body_get_handshake_data, but take and return a - * const pointer - */ -const uint8_t * create2_cell_body_getconstarray_handshake_data(const create2_cell_body_t *inp); -/** Change the length of the variable-length array field - * handshake_data of 'inp' to 'newlen'.Fill extra elements with 0. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int create2_cell_body_setlen_handshake_data(create2_cell_body_t *inp, size_t newlen); -/** Return a newly allocated ed25519_cert_extension with all elements - * set to zero. - */ -ed25519_cert_extension_t *ed25519_cert_extension_new(void); -/** Release all storage held by the ed25519_cert_extension in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void ed25519_cert_extension_free(ed25519_cert_extension_t *victim); -/** Try to parse a ed25519_cert_extension from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated ed25519_cert_extension_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t ed25519_cert_extension_parse(ed25519_cert_extension_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * ed25519_cert_extension in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t ed25519_cert_extension_encoded_len(const ed25519_cert_extension_t *obj); -/** Try to encode the ed25519_cert_extension from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t ed25519_cert_extension_encode(uint8_t *output, size_t avail, const ed25519_cert_extension_t *input); -/** Check whether the internal state of the ed25519_cert_extension in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *ed25519_cert_extension_check(const ed25519_cert_extension_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int ed25519_cert_extension_clear_errors(ed25519_cert_extension_t *obj); -/** Return the value of the ext_length field of the - * ed25519_cert_extension_t in 'inp' - */ -uint16_t ed25519_cert_extension_get_ext_length(const ed25519_cert_extension_t *inp); -/** Set the value of the ext_length field of the - * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int ed25519_cert_extension_set_ext_length(ed25519_cert_extension_t *inp, uint16_t val); -/** Return the value of the ext_type field of the - * ed25519_cert_extension_t in 'inp' - */ -uint8_t ed25519_cert_extension_get_ext_type(const ed25519_cert_extension_t *inp); -/** Set the value of the ext_type field of the - * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int ed25519_cert_extension_set_ext_type(ed25519_cert_extension_t *inp, uint8_t val); -/** Return the value of the ext_flags field of the - * ed25519_cert_extension_t in 'inp' - */ -uint8_t ed25519_cert_extension_get_ext_flags(const ed25519_cert_extension_t *inp); -/** Set the value of the ext_flags field of the - * ed25519_cert_extension_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int ed25519_cert_extension_set_ext_flags(ed25519_cert_extension_t *inp, uint8_t val); -/** Return the (constant) length of the array holding the - * un_signing_key field of the ed25519_cert_extension_t in 'inp'. - */ -size_t ed25519_cert_extension_getlen_un_signing_key(const ed25519_cert_extension_t *inp); -/** Return the element at position 'idx' of the fixed array field - * un_signing_key of the ed25519_cert_extension_t in 'inp'. - */ -uint8_t ed25519_cert_extension_get_un_signing_key(ed25519_cert_extension_t *inp, size_t idx); -/** As ed25519_cert_extension_get_un_signing_key, but take and return - * a const pointer - */ -uint8_t ed25519_cert_extension_getconst_un_signing_key(const ed25519_cert_extension_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * un_signing_key of the ed25519_cert_extension_t in 'inp', so that it - * will hold the value 'elt'. - */ -int ed25519_cert_extension_set_un_signing_key(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field un_signing_key of - * 'inp'. - */ -uint8_t * ed25519_cert_extension_getarray_un_signing_key(ed25519_cert_extension_t *inp); -/** As ed25519_cert_extension_get_un_signing_key, but take and return - * a const pointer - */ -const uint8_t * ed25519_cert_extension_getconstarray_un_signing_key(const ed25519_cert_extension_t *inp); -/** Return the length of the dynamic array holding the un_unparsed - * field of the ed25519_cert_extension_t in 'inp'. - */ -size_t ed25519_cert_extension_getlen_un_unparsed(const ed25519_cert_extension_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * un_unparsed of the ed25519_cert_extension_t in 'inp'. - */ -uint8_t ed25519_cert_extension_get_un_unparsed(ed25519_cert_extension_t *inp, size_t idx); -/** As ed25519_cert_extension_get_un_unparsed, but take and return a - * const pointer - */ -uint8_t ed25519_cert_extension_getconst_un_unparsed(const ed25519_cert_extension_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * un_unparsed of the ed25519_cert_extension_t in 'inp', so that it - * will hold the value 'elt'. - */ -int ed25519_cert_extension_set_un_unparsed(ed25519_cert_extension_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field un_unparsed - * of the ed25519_cert_extension_t in 'inp'. - */ -int ed25519_cert_extension_add_un_unparsed(ed25519_cert_extension_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field un_unparsed of - * 'inp'. - */ -uint8_t * ed25519_cert_extension_getarray_un_unparsed(ed25519_cert_extension_t *inp); -/** As ed25519_cert_extension_get_un_unparsed, but take and return a - * const pointer - */ -const uint8_t * ed25519_cert_extension_getconstarray_un_unparsed(const ed25519_cert_extension_t *inp); -/** Change the length of the variable-length array field un_unparsed - * of 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on - * success; return -1 and set the error code on 'inp' on failure. - */ -int ed25519_cert_extension_setlen_un_unparsed(ed25519_cert_extension_t *inp, size_t newlen); -/** Return a newly allocated extend1_cell_body with all elements set - * to zero. - */ -extend1_cell_body_t *extend1_cell_body_new(void); -/** Release all storage held by the extend1_cell_body in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void extend1_cell_body_free(extend1_cell_body_t *victim); -/** Try to parse a extend1_cell_body from the buffer in 'input', using - * up to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * extend1_cell_body_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t extend1_cell_body_parse(extend1_cell_body_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * extend1_cell_body in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t extend1_cell_body_encoded_len(const extend1_cell_body_t *obj); -/** Try to encode the extend1_cell_body from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t extend1_cell_body_encode(uint8_t *output, size_t avail, const extend1_cell_body_t *input); -/** Check whether the internal state of the extend1_cell_body in 'obj' - * is consistent. Return NULL if it is, and a short message if it is - * not. - */ -const char *extend1_cell_body_check(const extend1_cell_body_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int extend1_cell_body_clear_errors(extend1_cell_body_t *obj); -/** Return the value of the ipv4addr field of the extend1_cell_body_t - * in 'inp' - */ -uint32_t extend1_cell_body_get_ipv4addr(const extend1_cell_body_t *inp); -/** Set the value of the ipv4addr field of the extend1_cell_body_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int extend1_cell_body_set_ipv4addr(extend1_cell_body_t *inp, uint32_t val); -/** Return the value of the port field of the extend1_cell_body_t in - * 'inp' - */ -uint16_t extend1_cell_body_get_port(const extend1_cell_body_t *inp); -/** Set the value of the port field of the extend1_cell_body_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int extend1_cell_body_set_port(extend1_cell_body_t *inp, uint16_t val); -/** Return the (constant) length of the array holding the onionskin - * field of the extend1_cell_body_t in 'inp'. - */ -size_t extend1_cell_body_getlen_onionskin(const extend1_cell_body_t *inp); -/** Return the element at position 'idx' of the fixed array field - * onionskin of the extend1_cell_body_t in 'inp'. - */ -uint8_t extend1_cell_body_get_onionskin(extend1_cell_body_t *inp, size_t idx); -/** As extend1_cell_body_get_onionskin, but take and return a const - * pointer - */ -uint8_t extend1_cell_body_getconst_onionskin(const extend1_cell_body_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * onionskin of the extend1_cell_body_t in 'inp', so that it will hold - * the value 'elt'. - */ -int extend1_cell_body_set_onionskin(extend1_cell_body_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 186-element array field onionskin of - * 'inp'. - */ -uint8_t * extend1_cell_body_getarray_onionskin(extend1_cell_body_t *inp); -/** As extend1_cell_body_get_onionskin, but take and return a const - * pointer - */ -const uint8_t * extend1_cell_body_getconstarray_onionskin(const extend1_cell_body_t *inp); -/** Return the (constant) length of the array holding the identity - * field of the extend1_cell_body_t in 'inp'. - */ -size_t extend1_cell_body_getlen_identity(const extend1_cell_body_t *inp); -/** Return the element at position 'idx' of the fixed array field - * identity of the extend1_cell_body_t in 'inp'. - */ -uint8_t extend1_cell_body_get_identity(extend1_cell_body_t *inp, size_t idx); -/** As extend1_cell_body_get_identity, but take and return a const - * pointer - */ -uint8_t extend1_cell_body_getconst_identity(const extend1_cell_body_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * identity of the extend1_cell_body_t in 'inp', so that it will hold - * the value 'elt'. - */ -int extend1_cell_body_set_identity(extend1_cell_body_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 20-element array field identity of 'inp'. - */ -uint8_t * extend1_cell_body_getarray_identity(extend1_cell_body_t *inp); -/** As extend1_cell_body_get_identity, but take and return a const - * pointer - */ -const uint8_t * extend1_cell_body_getconstarray_identity(const extend1_cell_body_t *inp); -/** Return a newly allocated link_specifier with all elements set to - * zero. - */ -link_specifier_t *link_specifier_new(void); -/** Release all storage held by the link_specifier in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void link_specifier_free(link_specifier_t *victim); -/** Try to parse a link_specifier from the buffer in 'input', using up - * to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * link_specifier_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t link_specifier_parse(link_specifier_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * link_specifier in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t link_specifier_encoded_len(const link_specifier_t *obj); -/** Try to encode the link_specifier from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input); -/** Check whether the internal state of the link_specifier in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. - */ -const char *link_specifier_check(const link_specifier_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int link_specifier_clear_errors(link_specifier_t *obj); -/** Return the value of the ls_type field of the link_specifier_t in - * 'inp' - */ -uint8_t link_specifier_get_ls_type(const link_specifier_t *inp); -/** Set the value of the ls_type field of the link_specifier_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int link_specifier_set_ls_type(link_specifier_t *inp, uint8_t val); -/** Return the value of the ls_len field of the link_specifier_t in - * 'inp' - */ -uint8_t link_specifier_get_ls_len(const link_specifier_t *inp); -/** Set the value of the ls_len field of the link_specifier_t in 'inp' - * to 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int link_specifier_set_ls_len(link_specifier_t *inp, uint8_t val); -/** Return the value of the un_ipv4_addr field of the link_specifier_t - * in 'inp' - */ -uint32_t link_specifier_get_un_ipv4_addr(const link_specifier_t *inp); -/** Set the value of the un_ipv4_addr field of the link_specifier_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int link_specifier_set_un_ipv4_addr(link_specifier_t *inp, uint32_t val); -/** Return the value of the un_ipv4_port field of the link_specifier_t - * in 'inp' - */ -uint16_t link_specifier_get_un_ipv4_port(const link_specifier_t *inp); -/** Set the value of the un_ipv4_port field of the link_specifier_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int link_specifier_set_un_ipv4_port(link_specifier_t *inp, uint16_t val); -/** Return the (constant) length of the array holding the un_ipv6_addr - * field of the link_specifier_t in 'inp'. - */ -size_t link_specifier_getlen_un_ipv6_addr(const link_specifier_t *inp); -/** Return the element at position 'idx' of the fixed array field - * un_ipv6_addr of the link_specifier_t in 'inp'. - */ -uint8_t link_specifier_get_un_ipv6_addr(link_specifier_t *inp, size_t idx); -/** As link_specifier_get_un_ipv6_addr, but take and return a const - * pointer - */ -uint8_t link_specifier_getconst_un_ipv6_addr(const link_specifier_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * un_ipv6_addr of the link_specifier_t in 'inp', so that it will hold - * the value 'elt'. - */ -int link_specifier_set_un_ipv6_addr(link_specifier_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 16-element array field un_ipv6_addr of - * 'inp'. - */ -uint8_t * link_specifier_getarray_un_ipv6_addr(link_specifier_t *inp); -/** As link_specifier_get_un_ipv6_addr, but take and return a const - * pointer - */ -const uint8_t * link_specifier_getconstarray_un_ipv6_addr(const link_specifier_t *inp); -/** Return the value of the un_ipv6_port field of the link_specifier_t - * in 'inp' - */ -uint16_t link_specifier_get_un_ipv6_port(const link_specifier_t *inp); -/** Set the value of the un_ipv6_port field of the link_specifier_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int link_specifier_set_un_ipv6_port(link_specifier_t *inp, uint16_t val); -/** Return the (constant) length of the array holding the un_legacy_id - * field of the link_specifier_t in 'inp'. - */ -size_t link_specifier_getlen_un_legacy_id(const link_specifier_t *inp); -/** Return the element at position 'idx' of the fixed array field - * un_legacy_id of the link_specifier_t in 'inp'. - */ -uint8_t link_specifier_get_un_legacy_id(link_specifier_t *inp, size_t idx); -/** As link_specifier_get_un_legacy_id, but take and return a const - * pointer - */ -uint8_t link_specifier_getconst_un_legacy_id(const link_specifier_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * un_legacy_id of the link_specifier_t in 'inp', so that it will hold - * the value 'elt'. - */ -int link_specifier_set_un_legacy_id(link_specifier_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 20-element array field un_legacy_id of - * 'inp'. - */ -uint8_t * link_specifier_getarray_un_legacy_id(link_specifier_t *inp); -/** As link_specifier_get_un_legacy_id, but take and return a const - * pointer - */ -const uint8_t * link_specifier_getconstarray_un_legacy_id(const link_specifier_t *inp); -/** Return the (constant) length of the array holding the - * un_ed25519_id field of the link_specifier_t in 'inp'. - */ -size_t link_specifier_getlen_un_ed25519_id(const link_specifier_t *inp); -/** Return the element at position 'idx' of the fixed array field - * un_ed25519_id of the link_specifier_t in 'inp'. - */ -uint8_t link_specifier_get_un_ed25519_id(link_specifier_t *inp, size_t idx); -/** As link_specifier_get_un_ed25519_id, but take and return a const - * pointer - */ -uint8_t link_specifier_getconst_un_ed25519_id(const link_specifier_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * un_ed25519_id of the link_specifier_t in 'inp', so that it will - * hold the value 'elt'. - */ -int link_specifier_set_un_ed25519_id(link_specifier_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field un_ed25519_id of - * 'inp'. - */ -uint8_t * link_specifier_getarray_un_ed25519_id(link_specifier_t *inp); -/** As link_specifier_get_un_ed25519_id, but take and return a const - * pointer - */ -const uint8_t * link_specifier_getconstarray_un_ed25519_id(const link_specifier_t *inp); -/** Return the length of the dynamic array holding the un_unrecognized - * field of the link_specifier_t in 'inp'. - */ -size_t link_specifier_getlen_un_unrecognized(const link_specifier_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * un_unrecognized of the link_specifier_t in 'inp'. - */ -uint8_t link_specifier_get_un_unrecognized(link_specifier_t *inp, size_t idx); -/** As link_specifier_get_un_unrecognized, but take and return a const - * pointer - */ -uint8_t link_specifier_getconst_un_unrecognized(const link_specifier_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * un_unrecognized of the link_specifier_t in 'inp', so that it will - * hold the value 'elt'. - */ -int link_specifier_set_un_unrecognized(link_specifier_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field - * un_unrecognized of the link_specifier_t in 'inp'. - */ -int link_specifier_add_un_unrecognized(link_specifier_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field - * un_unrecognized of 'inp'. - */ -uint8_t * link_specifier_getarray_un_unrecognized(link_specifier_t *inp); -/** As link_specifier_get_un_unrecognized, but take and return a const - * pointer - */ -const uint8_t * link_specifier_getconstarray_un_unrecognized(const link_specifier_t *inp); -/** Change the length of the variable-length array field - * un_unrecognized of 'inp' to 'newlen'.Fill extra elements with 0. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int link_specifier_setlen_un_unrecognized(link_specifier_t *inp, size_t newlen); -/** Return a newly allocated ed25519_cert with all elements set to - * zero. - */ -ed25519_cert_t *ed25519_cert_new(void); -/** Release all storage held by the ed25519_cert in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void ed25519_cert_free(ed25519_cert_t *victim); -/** Try to parse a ed25519_cert from the buffer in 'input', using up - * to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * ed25519_cert_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t ed25519_cert_parse(ed25519_cert_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * ed25519_cert in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t ed25519_cert_encoded_len(const ed25519_cert_t *obj); -/** Try to encode the ed25519_cert from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t ed25519_cert_encode(uint8_t *output, size_t avail, const ed25519_cert_t *input); -/** Check whether the internal state of the ed25519_cert in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. - */ -const char *ed25519_cert_check(const ed25519_cert_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int ed25519_cert_clear_errors(ed25519_cert_t *obj); -/** Return the value of the version field of the ed25519_cert_t in - * 'inp' - */ -uint8_t ed25519_cert_get_version(const ed25519_cert_t *inp); -/** Set the value of the version field of the ed25519_cert_t in 'inp' - * to 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int ed25519_cert_set_version(ed25519_cert_t *inp, uint8_t val); -/** Return the value of the cert_type field of the ed25519_cert_t in - * 'inp' - */ -uint8_t ed25519_cert_get_cert_type(const ed25519_cert_t *inp); -/** Set the value of the cert_type field of the ed25519_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int ed25519_cert_set_cert_type(ed25519_cert_t *inp, uint8_t val); -/** Return the value of the exp_field field of the ed25519_cert_t in - * 'inp' - */ -uint32_t ed25519_cert_get_exp_field(const ed25519_cert_t *inp); -/** Set the value of the exp_field field of the ed25519_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int ed25519_cert_set_exp_field(ed25519_cert_t *inp, uint32_t val); -/** Return the value of the cert_key_type field of the ed25519_cert_t - * in 'inp' - */ -uint8_t ed25519_cert_get_cert_key_type(const ed25519_cert_t *inp); -/** Set the value of the cert_key_type field of the ed25519_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int ed25519_cert_set_cert_key_type(ed25519_cert_t *inp, uint8_t val); -/** Return the (constant) length of the array holding the - * certified_key field of the ed25519_cert_t in 'inp'. - */ -size_t ed25519_cert_getlen_certified_key(const ed25519_cert_t *inp); -/** Return the element at position 'idx' of the fixed array field - * certified_key of the ed25519_cert_t in 'inp'. - */ -uint8_t ed25519_cert_get_certified_key(ed25519_cert_t *inp, size_t idx); -/** As ed25519_cert_get_certified_key, but take and return a const - * pointer - */ -uint8_t ed25519_cert_getconst_certified_key(const ed25519_cert_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * certified_key of the ed25519_cert_t in 'inp', so that it will hold - * the value 'elt'. - */ -int ed25519_cert_set_certified_key(ed25519_cert_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field certified_key of - * 'inp'. - */ -uint8_t * ed25519_cert_getarray_certified_key(ed25519_cert_t *inp); -/** As ed25519_cert_get_certified_key, but take and return a const - * pointer - */ -const uint8_t * ed25519_cert_getconstarray_certified_key(const ed25519_cert_t *inp); -/** Return the value of the n_extensions field of the ed25519_cert_t - * in 'inp' - */ -uint8_t ed25519_cert_get_n_extensions(const ed25519_cert_t *inp); -/** Set the value of the n_extensions field of the ed25519_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int ed25519_cert_set_n_extensions(ed25519_cert_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the ext field of - * the ed25519_cert_t in 'inp'. - */ -size_t ed25519_cert_getlen_ext(const ed25519_cert_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * ext of the ed25519_cert_t in 'inp'. - */ -struct ed25519_cert_extension_st * ed25519_cert_get_ext(ed25519_cert_t *inp, size_t idx); -/** As ed25519_cert_get_ext, but take and return a const pointer - */ - const struct ed25519_cert_extension_st * ed25519_cert_getconst_ext(const ed25519_cert_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * ext of the ed25519_cert_t in 'inp', so that it will hold the value - * 'elt'. Free the previous value, if any. - */ -int ed25519_cert_set_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt); -/** As ed25519_cert_set_ext, but does not free the previous value. - */ -int ed25519_cert_set0_ext(ed25519_cert_t *inp, size_t idx, struct ed25519_cert_extension_st * elt); -/** Append a new element 'elt' to the dynamic array field ext of the - * ed25519_cert_t in 'inp'. - */ -int ed25519_cert_add_ext(ed25519_cert_t *inp, struct ed25519_cert_extension_st * elt); -/** Return a pointer to the variable-length array field ext of 'inp'. - */ -struct ed25519_cert_extension_st * * ed25519_cert_getarray_ext(ed25519_cert_t *inp); -/** As ed25519_cert_get_ext, but take and return a const pointer - */ -const struct ed25519_cert_extension_st * const * ed25519_cert_getconstarray_ext(const ed25519_cert_t *inp); -/** Change the length of the variable-length array field ext of 'inp' - * to 'newlen'.Fill extra elements with NULL; free removed elements. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int ed25519_cert_setlen_ext(ed25519_cert_t *inp, size_t newlen); -/** Return the (constant) length of the array holding the signature - * field of the ed25519_cert_t in 'inp'. - */ -size_t ed25519_cert_getlen_signature(const ed25519_cert_t *inp); -/** Return the element at position 'idx' of the fixed array field - * signature of the ed25519_cert_t in 'inp'. - */ -uint8_t ed25519_cert_get_signature(ed25519_cert_t *inp, size_t idx); -/** As ed25519_cert_get_signature, but take and return a const pointer - */ -uint8_t ed25519_cert_getconst_signature(const ed25519_cert_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * signature of the ed25519_cert_t in 'inp', so that it will hold the - * value 'elt'. - */ -int ed25519_cert_set_signature(ed25519_cert_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 64-element array field signature of 'inp'. - */ -uint8_t * ed25519_cert_getarray_signature(ed25519_cert_t *inp); -/** As ed25519_cert_get_signature, but take and return a const pointer - */ -const uint8_t * ed25519_cert_getconstarray_signature(const ed25519_cert_t *inp); -/** Return a newly allocated extend2_cell_body with all elements set - * to zero. - */ -extend2_cell_body_t *extend2_cell_body_new(void); -/** Release all storage held by the extend2_cell_body in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void extend2_cell_body_free(extend2_cell_body_t *victim); -/** Try to parse a extend2_cell_body from the buffer in 'input', using - * up to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * extend2_cell_body_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t extend2_cell_body_parse(extend2_cell_body_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * extend2_cell_body in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t extend2_cell_body_encoded_len(const extend2_cell_body_t *obj); -/** Try to encode the extend2_cell_body from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t extend2_cell_body_encode(uint8_t *output, size_t avail, const extend2_cell_body_t *input); -/** Check whether the internal state of the extend2_cell_body in 'obj' - * is consistent. Return NULL if it is, and a short message if it is - * not. - */ -const char *extend2_cell_body_check(const extend2_cell_body_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int extend2_cell_body_clear_errors(extend2_cell_body_t *obj); -/** Return the value of the n_spec field of the extend2_cell_body_t in - * 'inp' - */ -uint8_t extend2_cell_body_get_n_spec(const extend2_cell_body_t *inp); -/** Set the value of the n_spec field of the extend2_cell_body_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int extend2_cell_body_set_n_spec(extend2_cell_body_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the ls field of the - * extend2_cell_body_t in 'inp'. - */ -size_t extend2_cell_body_getlen_ls(const extend2_cell_body_t *inp); -/** Return the element at position 'idx' of the dynamic array field ls - * of the extend2_cell_body_t in 'inp'. - */ -struct link_specifier_st * extend2_cell_body_get_ls(extend2_cell_body_t *inp, size_t idx); -/** As extend2_cell_body_get_ls, but take and return a const pointer - */ - const struct link_specifier_st * extend2_cell_body_getconst_ls(const extend2_cell_body_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field ls - * of the extend2_cell_body_t in 'inp', so that it will hold the value - * 'elt'. Free the previous value, if any. - */ -int extend2_cell_body_set_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt); -/** As extend2_cell_body_set_ls, but does not free the previous value. - */ -int extend2_cell_body_set0_ls(extend2_cell_body_t *inp, size_t idx, struct link_specifier_st * elt); -/** Append a new element 'elt' to the dynamic array field ls of the - * extend2_cell_body_t in 'inp'. - */ -int extend2_cell_body_add_ls(extend2_cell_body_t *inp, struct link_specifier_st * elt); -/** Return a pointer to the variable-length array field ls of 'inp'. - */ -struct link_specifier_st * * extend2_cell_body_getarray_ls(extend2_cell_body_t *inp); -/** As extend2_cell_body_get_ls, but take and return a const pointer - */ -const struct link_specifier_st * const * extend2_cell_body_getconstarray_ls(const extend2_cell_body_t *inp); -/** Change the length of the variable-length array field ls of 'inp' - * to 'newlen'.Fill extra elements with NULL; free removed elements. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int extend2_cell_body_setlen_ls(extend2_cell_body_t *inp, size_t newlen); -/** Return the value of the create2 field of the extend2_cell_body_t - * in 'inp' - */ -struct create2_cell_body_st * extend2_cell_body_get_create2(extend2_cell_body_t *inp); -/** As extend2_cell_body_get_create2, but take and return a const - * pointer - */ -const struct create2_cell_body_st * extend2_cell_body_getconst_create2(const extend2_cell_body_t *inp); -/** Set the value of the create2 field of the extend2_cell_body_t in - * 'inp' to 'val'. Free the old value if any. Steals the referenceto - * 'val'.Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int extend2_cell_body_set_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val); -/** As extend2_cell_body_set_create2, but does not free the previous - * value. - */ -int extend2_cell_body_set0_create2(extend2_cell_body_t *inp, struct create2_cell_body_st *val); -/** Return a newly allocated link_specifier_list with all elements set - * to zero. - */ -link_specifier_list_t *link_specifier_list_new(void); -/** Release all storage held by the link_specifier_list in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void link_specifier_list_free(link_specifier_list_t *victim); -/** Try to parse a link_specifier_list from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated link_specifier_list_t. On failure, return -2 if the input - * appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t link_specifier_list_parse(link_specifier_list_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * link_specifier_list in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t link_specifier_list_encoded_len(const link_specifier_list_t *obj); -/** Try to encode the link_specifier_list from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t link_specifier_list_encode(uint8_t *output, size_t avail, const link_specifier_list_t *input); -/** Check whether the internal state of the link_specifier_list in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *link_specifier_list_check(const link_specifier_list_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int link_specifier_list_clear_errors(link_specifier_list_t *obj); -/** Return the value of the n_spec field of the link_specifier_list_t - * in 'inp' - */ -uint8_t link_specifier_list_get_n_spec(const link_specifier_list_t *inp); -/** Set the value of the n_spec field of the link_specifier_list_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int link_specifier_list_set_n_spec(link_specifier_list_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the spec field of - * the link_specifier_list_t in 'inp'. - */ -size_t link_specifier_list_getlen_spec(const link_specifier_list_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * spec of the link_specifier_list_t in 'inp'. - */ -struct link_specifier_st * link_specifier_list_get_spec(link_specifier_list_t *inp, size_t idx); -/** As link_specifier_list_get_spec, but take and return a const - * pointer - */ - const struct link_specifier_st * link_specifier_list_getconst_spec(const link_specifier_list_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * spec of the link_specifier_list_t in 'inp', so that it will hold - * the value 'elt'. Free the previous value, if any. - */ -int link_specifier_list_set_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt); -/** As link_specifier_list_set_spec, but does not free the previous - * value. - */ -int link_specifier_list_set0_spec(link_specifier_list_t *inp, size_t idx, struct link_specifier_st * elt); -/** Append a new element 'elt' to the dynamic array field spec of the - * link_specifier_list_t in 'inp'. - */ -int link_specifier_list_add_spec(link_specifier_list_t *inp, struct link_specifier_st * elt); -/** Return a pointer to the variable-length array field spec of 'inp'. - */ -struct link_specifier_st * * link_specifier_list_getarray_spec(link_specifier_list_t *inp); -/** As link_specifier_list_get_spec, but take and return a const - * pointer - */ -const struct link_specifier_st * const * link_specifier_list_getconstarray_spec(const link_specifier_list_t *inp); -/** Change the length of the variable-length array field spec of 'inp' - * to 'newlen'.Fill extra elements with NULL; free removed elements. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int link_specifier_list_setlen_spec(link_specifier_list_t *inp, size_t newlen); - - -#endif diff --git a/src/tor/src/trunnel/ed25519_cert.trunnel b/src/tor/src/trunnel/ed25519_cert.trunnel deleted file mode 100644 index 8d6483d55..000000000 --- a/src/tor/src/trunnel/ed25519_cert.trunnel +++ /dev/null @@ -1,72 +0,0 @@ - -struct ed25519_cert { - u8 version IN [1]; - u8 cert_type; - u32 exp_field; - u8 cert_key_type; - u8 certified_key[32]; - u8 n_extensions; - struct ed25519_cert_extension ext[n_extensions]; - u8 signature[64]; -} - -const CERTEXT_SIGNED_WITH_KEY = 4; -const CERTEXT_FLAG_AFFECTS_VALIDATION = 1; - -struct ed25519_cert_extension { - u16 ext_length; - u8 ext_type; - u8 ext_flags; - union un[ext_type] with length ext_length { - CERTEXT_SIGNED_WITH_KEY : u8 signing_key[32]; - default: u8 unparsed[]; - }; -} - -const LS_IPV4 = 0x00; -const LS_IPV6 = 0x01; -const LS_LEGACY_ID = 0x02; -const LS_ED25519_ID = 0x03; - -// XXX hs_link_specifier_dup() violates the opaqueness of link_specifier_t by -// taking its sizeof(). If we ever want to turn on TRUNNEL_OPAQUE, or -// if we ever make link_specifier contain other types, we will -// need to refactor that function to do the copy by encoding and decoding the -// object. - -// amended from tor.trunnel -struct link_specifier { - u8 ls_type; - u8 ls_len; - union un[ls_type] with length ls_len { - LS_IPV4: u32 ipv4_addr; u16 ipv4_port; - LS_IPV6: u8 ipv6_addr[16]; u16 ipv6_port; - LS_LEGACY_ID: u8 legacy_id[20]; - LS_ED25519_ID: u8 ed25519_id[32]; - default: u8 unrecognized[]; - }; -} - -struct link_specifier_list { - u8 n_spec; - struct link_specifier spec[n_spec]; -} - -struct extend1_cell_body { - u32 ipv4addr; - u16 port; - u8 onionskin[186]; - u8 identity[20]; -} - -struct create2_cell_body { - u16 handshake_type; - u16 handshake_len; - u8 handshake_data[handshake_len]; -} - -struct extend2_cell_body { - u8 n_spec; - struct link_specifier ls[n_spec]; - struct create2_cell_body create2; -} diff --git a/src/tor/src/trunnel/hs/cell_common.c b/src/tor/src/trunnel/hs/cell_common.c deleted file mode 100644 index af223560c..000000000 --- a/src/tor/src/trunnel/hs/cell_common.c +++ /dev/null @@ -1,595 +0,0 @@ -/* cell_common.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "cell_common.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int cellcommon_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || cellcommon_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -trn_cell_extension_fields_t * -trn_cell_extension_fields_new(void) -{ - trn_cell_extension_fields_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_fields_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_extension_fields_clear(trn_cell_extension_fields_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->field); - TRUNNEL_DYNARRAY_CLEAR(&obj->field); -} - -void -trn_cell_extension_fields_free(trn_cell_extension_fields_t *obj) -{ - if (obj == NULL) - return; - trn_cell_extension_fields_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_extension_fields_t)); - trunnel_free_(obj); -} - -uint8_t -trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp) -{ - return inp->field_type; -} -int -trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val) -{ - inp->field_type = val; - return 0; -} -uint8_t -trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp) -{ - return inp->field_len; -} -int -trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val) -{ - inp->field_len = val; - return 0; -} -size_t -trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->field); -} - -uint8_t -trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->field, idx); -} - -uint8_t -trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx) -{ - return trn_cell_extension_fields_get_field((trn_cell_extension_fields_t*)inp, idx); -} -int -trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->field, idx, elt); - return 0; -} -int -trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->field.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->field, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp) -{ - return inp->field.elts_; -} -const uint8_t * -trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp) -{ - return (const uint8_t *)trn_cell_extension_fields_getarray_field((trn_cell_extension_fields_t*)inp); -} -int -trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->field.allocated_, - &inp->field.n_, inp->field.elts_, newlen, - sizeof(inp->field.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->field.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (TRUNNEL_DYNARRAY_LEN(&obj->field) != obj->field_len) - return "Length mismatch for field"; - return NULL; -} - -ssize_t -trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_extension_fields_check(obj)) - return -1; - - - /* Length of u8 field_type */ - result += 1; - - /* Length of u8 field_len */ - result += 1; - - /* Length of u8 field[field_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->field); - return result; -} -int -trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_extension_fields_encode(uint8_t *output, const size_t avail, const trn_cell_extension_fields_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_extension_fields_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_extension_fields_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 field_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->field_type)); - written += 1; ptr += 1; - - /* Encode u8 field_len */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->field_len)); - written += 1; ptr += 1; - - /* Encode u8 field[field_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->field); - trunnel_assert(obj->field_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->field.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_extension_fields_parse(), but do not allocate the - * output object. - */ -static ssize_t -trn_cell_extension_fields_parse_into(trn_cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 field_type */ - CHECK_REMAINING(1, truncated); - obj->field_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 field_len */ - CHECK_REMAINING(1, truncated); - obj->field_len = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 field[field_len] */ - CHECK_REMAINING(obj->field_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->field, obj->field_len, {}); - obj->field.n_ = obj->field_len; - if (obj->field_len) - memcpy(obj->field.elts_, ptr, obj->field_len); - ptr += obj->field_len; remaining -= obj->field_len; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_extension_fields_new(); - if (NULL == *output) - return -1; - result = trn_cell_extension_fields_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_extension_fields_free(*output); - *output = NULL; - } - return result; -} -trn_cell_extension_t * -trn_cell_extension_new(void) -{ - trn_cell_extension_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_extension_clear(trn_cell_extension_t *obj) -{ - (void) obj; - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - trn_cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->fields); - TRUNNEL_DYNARRAY_CLEAR(&obj->fields); -} - -void -trn_cell_extension_free(trn_cell_extension_t *obj) -{ - if (obj == NULL) - return; - trn_cell_extension_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_extension_t)); - trunnel_free_(obj); -} - -uint8_t -trn_cell_extension_get_num(const trn_cell_extension_t *inp) -{ - return inp->num; -} -int -trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val) -{ - inp->num = val; - return 0; -} -size_t -trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->fields); -} - -struct trn_cell_extension_fields_st * -trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->fields, idx); -} - - const struct trn_cell_extension_fields_st * -trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx) -{ - return trn_cell_extension_get_fields((trn_cell_extension_t*)inp, idx); -} -int -trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) -{ - trn_cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx); - if (oldval && oldval != elt) - trn_cell_extension_fields_free(oldval); - return trn_cell_extension_set0_fields(inp, idx, elt); -} -int -trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->fields, idx, elt); - return 0; -} -int -trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->fields.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct trn_cell_extension_fields_st *, &inp->fields, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct trn_cell_extension_fields_st * * -trn_cell_extension_getarray_fields(trn_cell_extension_t *inp) -{ - return inp->fields.elts_; -} -const struct trn_cell_extension_fields_st * const * -trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp) -{ - return (const struct trn_cell_extension_fields_st * const *)trn_cell_extension_getarray_fields((trn_cell_extension_t*)inp); -} -int -trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen) -{ - struct trn_cell_extension_fields_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->fields.allocated_, - &inp->fields.n_, inp->fields.elts_, newlen, - sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) trn_cell_extension_fields_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->fields.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_extension_check(const trn_cell_extension_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - if (NULL != (msg = trn_cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->fields) != obj->num) - return "Length mismatch for fields"; - return NULL; -} - -ssize_t -trn_cell_extension_encoded_len(const trn_cell_extension_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_extension_check(obj)) - return -1; - - - /* Length of u8 num */ - result += 1; - - /* Length of struct trn_cell_extension_fields fields[num] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - result += trn_cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); - } - } - return result; -} -int -trn_cell_extension_clear_errors(trn_cell_extension_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_extension_encode(uint8_t *output, const size_t avail, const trn_cell_extension_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_extension_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_extension_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 num */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->num)); - written += 1; ptr += 1; - - /* Encode struct trn_cell_extension_fields fields[num] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - trunnel_assert(written <= avail); - result = trn_cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_extension_parse(), but do not allocate the output - * object. - */ -static ssize_t -trn_cell_extension_parse_into(trn_cell_extension_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 num */ - CHECK_REMAINING(1, truncated); - obj->num = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct trn_cell_extension_fields fields[num] */ - TRUNNEL_DYNARRAY_EXPAND(trn_cell_extension_fields_t *, &obj->fields, obj->num, {}); - { - trn_cell_extension_fields_t * elt; - unsigned idx; - for (idx = 0; idx < obj->num; ++idx) { - result = trn_cell_extension_fields_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(trn_cell_extension_fields_t *, &obj->fields, elt, {trn_cell_extension_fields_free(elt);}); - } - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; -} - -ssize_t -trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_extension_new(); - if (NULL == *output) - return -1; - result = trn_cell_extension_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_extension_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/hs/cell_common.h b/src/tor/src/trunnel/hs/cell_common.h deleted file mode 100644 index e08eedfdb..000000000 --- a/src/tor/src/trunnel/hs/cell_common.h +++ /dev/null @@ -1,203 +0,0 @@ -/* cell_common.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_CELL_COMMON_H -#define TRUNNEL_CELL_COMMON_H - -#include -#include "trunnel.h" - -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION_FIELDS) -struct trn_cell_extension_fields_st { - uint8_t field_type; - uint8_t field_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) field; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_extension_fields_st trn_cell_extension_fields_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION) -struct trn_cell_extension_st { - uint8_t num; - TRUNNEL_DYNARRAY_HEAD(, struct trn_cell_extension_fields_st *) fields; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_extension_st trn_cell_extension_t; -/** Return a newly allocated trn_cell_extension_fields with all - * elements set to zero. - */ -trn_cell_extension_fields_t *trn_cell_extension_fields_new(void); -/** Release all storage held by the trn_cell_extension_fields in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void trn_cell_extension_fields_free(trn_cell_extension_fields_t *victim); -/** Try to parse a trn_cell_extension_fields from the buffer in - * 'input', using up to 'len_in' bytes from the input buffer. On - * success, return the number of bytes consumed and set *output to the - * newly allocated trn_cell_extension_fields_t. On failure, return -2 - * if the input appears truncated, and -1 if the input is otherwise - * invalid. - */ -ssize_t trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_extension_fields in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj); -/** Try to encode the trn_cell_extension_fields from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_extension_fields_encode(uint8_t *output, size_t avail, const trn_cell_extension_fields_t *input); -/** Check whether the internal state of the trn_cell_extension_fields - * in 'obj' is consistent. Return NULL if it is, and a short message - * if it is not. - */ -const char *trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj); -/** Return the value of the field_type field of the - * trn_cell_extension_fields_t in 'inp' - */ -uint8_t trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp); -/** Set the value of the field_type field of the - * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val); -/** Return the value of the field_len field of the - * trn_cell_extension_fields_t in 'inp' - */ -uint8_t trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp); -/** Set the value of the field_len field of the - * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the field field of - * the trn_cell_extension_fields_t in 'inp'. - */ -size_t trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * field of the trn_cell_extension_fields_t in 'inp'. - */ -uint8_t trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx); -/** As trn_cell_extension_fields_get_field, but take and return a - * const pointer - */ -uint8_t trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * field of the trn_cell_extension_fields_t in 'inp', so that it will - * hold the value 'elt'. - */ -int trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field field of the - * trn_cell_extension_fields_t in 'inp'. - */ -int trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field field of - * 'inp'. - */ -uint8_t * trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp); -/** As trn_cell_extension_fields_get_field, but take and return a - * const pointer - */ -const uint8_t * trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp); -/** Change the length of the variable-length array field field of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen); -/** Return a newly allocated trn_cell_extension with all elements set - * to zero. - */ -trn_cell_extension_t *trn_cell_extension_new(void); -/** Release all storage held by the trn_cell_extension in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void trn_cell_extension_free(trn_cell_extension_t *victim); -/** Try to parse a trn_cell_extension from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated trn_cell_extension_t. On failure, return -2 if the input - * appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_extension in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); -/** Try to encode the trn_cell_extension from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); -/** Check whether the internal state of the trn_cell_extension in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *trn_cell_extension_check(const trn_cell_extension_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); -/** Return the value of the num field of the trn_cell_extension_t in - * 'inp' - */ -uint8_t trn_cell_extension_get_num(const trn_cell_extension_t *inp); -/** Set the value of the num field of the trn_cell_extension_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the fields field of - * the trn_cell_extension_t in 'inp'. - */ -size_t trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * fields of the trn_cell_extension_t in 'inp'. - */ -struct trn_cell_extension_fields_st * trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx); -/** As trn_cell_extension_get_fields, but take and return a const - * pointer - */ - const struct trn_cell_extension_fields_st * trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * fields of the trn_cell_extension_t in 'inp', so that it will hold - * the value 'elt'. Free the previous value, if any. - */ -int trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); -/** As trn_cell_extension_set_fields, but does not free the previous - * value. - */ -int trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); -/** Append a new element 'elt' to the dynamic array field fields of - * the trn_cell_extension_t in 'inp'. - */ -int trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt); -/** Return a pointer to the variable-length array field fields of - * 'inp'. - */ -struct trn_cell_extension_fields_st * * trn_cell_extension_getarray_fields(trn_cell_extension_t *inp); -/** As trn_cell_extension_get_fields, but take and return a const - * pointer - */ -const struct trn_cell_extension_fields_st * const * trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp); -/** Change the length of the variable-length array field fields of - * 'inp' to 'newlen'.Fill extra elements with NULL; free removed - * elements. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen); - - -#endif diff --git a/src/tor/src/trunnel/hs/cell_common.trunnel b/src/tor/src/trunnel/hs/cell_common.trunnel deleted file mode 100644 index 1aa6999de..000000000 --- a/src/tor/src/trunnel/hs/cell_common.trunnel +++ /dev/null @@ -1,12 +0,0 @@ -/* This file contains common data structure that cells use. */ - -struct trn_cell_extension_fields { - u8 field_type; - u8 field_len; - u8 field[field_len]; -}; - -struct trn_cell_extension { - u8 num; - struct trn_cell_extension_fields fields[num]; -}; diff --git a/src/tor/src/trunnel/hs/cell_establish_intro.c b/src/tor/src/trunnel/hs/cell_establish_intro.c deleted file mode 100644 index ae3b7b1bc..000000000 --- a/src/tor/src/trunnel/hs/cell_establish_intro.c +++ /dev/null @@ -1,735 +0,0 @@ -/* cell_establish_intro.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "cell_establish_intro.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int cellestablishintro_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || cellestablishintro_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -typedef struct trn_cell_extension_st trn_cell_extension_t; -trn_cell_extension_t *trn_cell_extension_new(void); -void trn_cell_extension_free(trn_cell_extension_t *victim); -ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); -ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); -const char *trn_cell_extension_check(const trn_cell_extension_t *obj); -int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); -trn_cell_establish_intro_t * -trn_cell_establish_intro_new(void) -{ - trn_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(trn_cell_establish_intro_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_establish_intro_clear(trn_cell_establish_intro_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); - TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - trn_cell_extension_free(obj->extensions); - obj->extensions = NULL; - TRUNNEL_DYNARRAY_WIPE(&obj->sig); - TRUNNEL_DYNARRAY_CLEAR(&obj->sig); -} - -void -trn_cell_establish_intro_free(trn_cell_establish_intro_t *obj) -{ - if (obj == NULL) - return; - trn_cell_establish_intro_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_establish_intro_t)); - trunnel_free_(obj); -} - -const uint8_t * -trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp) -{ - return inp->start_cell; -} -uint8_t -trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp) -{ - return inp->auth_key_type; -} -int -trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val) -{ - if (! ((val == 0 || val == 1 || val == 2))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->auth_key_type = val; - return 0; -} -uint16_t -trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp) -{ - return inp->auth_key_len; -} -int -trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val) -{ - inp->auth_key_len = val; - return 0; -} -size_t -trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); -} - -uint8_t -trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); -} - -uint8_t -trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx) -{ - return trn_cell_establish_intro_get_auth_key((trn_cell_establish_intro_t*)inp, idx); -} -int -trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); - return 0; -} -int -trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->auth_key.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->auth_key, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp) -{ - return inp->auth_key.elts_; -} -const uint8_t * -trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp) -{ - return (const uint8_t *)trn_cell_establish_intro_getarray_auth_key((trn_cell_establish_intro_t*)inp); -} -int -trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->auth_key.allocated_, - &inp->auth_key.n_, inp->auth_key.elts_, newlen, - sizeof(inp->auth_key.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->auth_key.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -struct trn_cell_extension_st * -trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp) -{ - return inp->extensions; -} -const struct trn_cell_extension_st * -trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp) -{ - return trn_cell_establish_intro_get_extensions((trn_cell_establish_intro_t*) inp); -} -int -trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) -{ - if (inp->extensions && inp->extensions != val) - trn_cell_extension_free(inp->extensions); - return trn_cell_establish_intro_set0_extensions(inp, val); -} -int -trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) -{ - inp->extensions = val; - return 0; -} -const uint8_t * -trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp) -{ - return inp->end_mac_fields; -} -size_t -trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp) -{ - (void)inp; return TRUNNEL_SHA3_256_LEN; -} - -uint8_t -trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx) -{ - trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); - return inp->handshake_mac[idx]; -} - -uint8_t -trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx) -{ - return trn_cell_establish_intro_get_handshake_mac((trn_cell_establish_intro_t*)inp, idx); -} -int -trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); - inp->handshake_mac[idx] = elt; - return 0; -} - -uint8_t * -trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp) -{ - return inp->handshake_mac; -} -const uint8_t * -trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp) -{ - return (const uint8_t *)trn_cell_establish_intro_getarray_handshake_mac((trn_cell_establish_intro_t*)inp); -} -const uint8_t * -trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp) -{ - return inp->end_sig_fields; -} -uint16_t -trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp) -{ - return inp->sig_len; -} -int -trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val) -{ - inp->sig_len = val; - return 0; -} -size_t -trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->sig); -} - -uint8_t -trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->sig, idx); -} - -uint8_t -trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx) -{ - return trn_cell_establish_intro_get_sig((trn_cell_establish_intro_t*)inp, idx); -} -int -trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt); - return 0; -} -int -trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->sig.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->sig, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp) -{ - return inp->sig.elts_; -} -const uint8_t * -trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp) -{ - return (const uint8_t *)trn_cell_establish_intro_getarray_sig((trn_cell_establish_intro_t*)inp); -} -int -trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->sig.allocated_, - &inp->sig.n_, inp->sig.elts_, newlen, - sizeof(inp->sig.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->sig.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2)) - return "Integer out of bounds"; - if (TRUNNEL_DYNARRAY_LEN(&obj->auth_key) != obj->auth_key_len) - return "Length mismatch for auth_key"; - { - const char *msg; - if (NULL != (msg = trn_cell_extension_check(obj->extensions))) - return msg; - } - if (TRUNNEL_DYNARRAY_LEN(&obj->sig) != obj->sig_len) - return "Length mismatch for sig"; - return NULL; -} - -ssize_t -trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_establish_intro_check(obj)) - return -1; - - - /* Length of u8 auth_key_type IN [0, 1, 2] */ - result += 1; - - /* Length of u16 auth_key_len */ - result += 2; - - /* Length of u8 auth_key[auth_key_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - - /* Length of struct trn_cell_extension extensions */ - result += trn_cell_extension_encoded_len(obj->extensions); - - /* Length of u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */ - result += TRUNNEL_SHA3_256_LEN; - - /* Length of u16 sig_len */ - result += 2; - - /* Length of u8 sig[sig_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->sig); - return result; -} -int -trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_establish_intro_encode(uint8_t *output, const size_t avail, const trn_cell_establish_intro_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_establish_intro_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_establish_intro_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 auth_key_type IN [0, 1, 2] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->auth_key_type)); - written += 1; ptr += 1; - - /* Encode u16 auth_key_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->auth_key_len)); - written += 2; ptr += 2; - - /* Encode u8 auth_key[auth_key_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - trunnel_assert(obj->auth_key_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->auth_key.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - /* Encode struct trn_cell_extension extensions */ - trunnel_assert(written <= avail); - result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - /* Encode u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */ - trunnel_assert(written <= avail); - if (avail - written < TRUNNEL_SHA3_256_LEN) - goto truncated; - memcpy(ptr, obj->handshake_mac, TRUNNEL_SHA3_256_LEN); - written += TRUNNEL_SHA3_256_LEN; ptr += TRUNNEL_SHA3_256_LEN; - - /* Encode u16 sig_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->sig_len)); - written += 2; ptr += 2; - - /* Encode u8 sig[sig_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->sig); - trunnel_assert(obj->sig_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->sig.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_establish_intro_parse(), but do not allocate the - * output object. - */ -static ssize_t -trn_cell_establish_intro_parse_into(trn_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - obj->start_cell = ptr; - - /* Parse u8 auth_key_type IN [0, 1, 2] */ - CHECK_REMAINING(1, truncated); - obj->auth_key_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2)) - goto fail; - - /* Parse u16 auth_key_len */ - CHECK_REMAINING(2, truncated); - obj->auth_key_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 auth_key[auth_key_len] */ - CHECK_REMAINING(obj->auth_key_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->auth_key, obj->auth_key_len, {}); - obj->auth_key.n_ = obj->auth_key_len; - if (obj->auth_key_len) - memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); - ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - - /* Parse struct trn_cell_extension extensions */ - result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - obj->end_mac_fields = ptr; - - /* Parse u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */ - CHECK_REMAINING(TRUNNEL_SHA3_256_LEN, truncated); - memcpy(obj->handshake_mac, ptr, TRUNNEL_SHA3_256_LEN); - remaining -= TRUNNEL_SHA3_256_LEN; ptr += TRUNNEL_SHA3_256_LEN; - obj->end_sig_fields = ptr; - - /* Parse u16 sig_len */ - CHECK_REMAINING(2, truncated); - obj->sig_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 sig[sig_len] */ - CHECK_REMAINING(obj->sig_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->sig, obj->sig_len, {}); - obj->sig.n_ = obj->sig_len; - if (obj->sig_len) - memcpy(obj->sig.elts_, ptr, obj->sig_len); - ptr += obj->sig_len; remaining -= obj->sig_len; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_establish_intro_new(); - if (NULL == *output) - return -1; - result = trn_cell_establish_intro_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_establish_intro_free(*output); - *output = NULL; - } - return result; -} -trn_cell_intro_established_t * -trn_cell_intro_established_new(void) -{ - trn_cell_intro_established_t *val = trunnel_calloc(1, sizeof(trn_cell_intro_established_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_intro_established_clear(trn_cell_intro_established_t *obj) -{ - (void) obj; - trn_cell_extension_free(obj->extensions); - obj->extensions = NULL; -} - -void -trn_cell_intro_established_free(trn_cell_intro_established_t *obj) -{ - if (obj == NULL) - return; - trn_cell_intro_established_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_intro_established_t)); - trunnel_free_(obj); -} - -struct trn_cell_extension_st * -trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp) -{ - return inp->extensions; -} -const struct trn_cell_extension_st * -trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp) -{ - return trn_cell_intro_established_get_extensions((trn_cell_intro_established_t*) inp); -} -int -trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) -{ - if (inp->extensions && inp->extensions != val) - trn_cell_extension_free(inp->extensions); - return trn_cell_intro_established_set0_extensions(inp, val); -} -int -trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) -{ - inp->extensions = val; - return 0; -} -const char * -trn_cell_intro_established_check(const trn_cell_intro_established_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - if (NULL != (msg = trn_cell_extension_check(obj->extensions))) - return msg; - } - return NULL; -} - -ssize_t -trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_intro_established_check(obj)) - return -1; - - - /* Length of struct trn_cell_extension extensions */ - result += trn_cell_extension_encoded_len(obj->extensions); - return result; -} -int -trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_intro_established_encode(uint8_t *output, const size_t avail, const trn_cell_intro_established_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_intro_established_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_intro_established_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode struct trn_cell_extension extensions */ - trunnel_assert(written <= avail); - result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_intro_established_parse(), but do not allocate the - * output object. - */ -static ssize_t -trn_cell_intro_established_parse_into(trn_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse struct trn_cell_extension extensions */ - result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - relay_fail: - trunnel_assert(result < 0); - return result; -} - -ssize_t -trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_intro_established_new(); - if (NULL == *output) - return -1; - result = trn_cell_intro_established_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_intro_established_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/hs/cell_establish_intro.h b/src/tor/src/trunnel/hs/cell_establish_intro.h deleted file mode 100644 index ccaef5488..000000000 --- a/src/tor/src/trunnel/hs/cell_establish_intro.h +++ /dev/null @@ -1,276 +0,0 @@ -/* cell_establish_intro.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_CELL_ESTABLISH_INTRO_H -#define TRUNNEL_CELL_ESTABLISH_INTRO_H - -#include -#include "trunnel.h" - -struct trn_cell_extension_st; -#define TRUNNEL_SHA3_256_LEN 32 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_ESTABLISH_INTRO) -struct trn_cell_establish_intro_st { - const uint8_t *start_cell; - uint8_t auth_key_type; - uint16_t auth_key_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct trn_cell_extension_st *extensions; - const uint8_t *end_mac_fields; - uint8_t handshake_mac[TRUNNEL_SHA3_256_LEN]; - const uint8_t *end_sig_fields; - uint16_t sig_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) sig; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_establish_intro_st trn_cell_establish_intro_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRO_ESTABLISHED) -struct trn_cell_intro_established_st { - struct trn_cell_extension_st *extensions; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_intro_established_st trn_cell_intro_established_t; -/** Return a newly allocated trn_cell_establish_intro with all - * elements set to zero. - */ -trn_cell_establish_intro_t *trn_cell_establish_intro_new(void); -/** Release all storage held by the trn_cell_establish_intro in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void trn_cell_establish_intro_free(trn_cell_establish_intro_t *victim); -/** Try to parse a trn_cell_establish_intro from the buffer in - * 'input', using up to 'len_in' bytes from the input buffer. On - * success, return the number of bytes consumed and set *output to the - * newly allocated trn_cell_establish_intro_t. On failure, return -2 - * if the input appears truncated, and -1 if the input is otherwise - * invalid. - */ -ssize_t trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_establish_intro in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj); -/** Try to encode the trn_cell_establish_intro from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_establish_intro_encode(uint8_t *output, size_t avail, const trn_cell_establish_intro_t *input); -/** Check whether the internal state of the trn_cell_establish_intro - * in 'obj' is consistent. Return NULL if it is, and a short message - * if it is not. - */ -const char *trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj); -/** Return the position for start_cell when we parsed this object - */ -const uint8_t * trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp); -/** Return the value of the auth_key_type field of the - * trn_cell_establish_intro_t in 'inp' - */ -uint8_t trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp); -/** Set the value of the auth_key_type field of the - * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val); -/** Return the value of the auth_key_len field of the - * trn_cell_establish_intro_t in 'inp' - */ -uint16_t trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp); -/** Set the value of the auth_key_len field of the - * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the auth_key field - * of the trn_cell_establish_intro_t in 'inp'. - */ -size_t trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * auth_key of the trn_cell_establish_intro_t in 'inp'. - */ -uint8_t trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx); -/** As trn_cell_establish_intro_get_auth_key, but take and return a - * const pointer - */ -uint8_t trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * auth_key of the trn_cell_establish_intro_t in 'inp', so that it - * will hold the value 'elt'. - */ -int trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field auth_key of - * the trn_cell_establish_intro_t in 'inp'. - */ -int trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field auth_key of - * 'inp'. - */ -uint8_t * trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp); -/** As trn_cell_establish_intro_get_auth_key, but take and return a - * const pointer - */ -const uint8_t * trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp); -/** Change the length of the variable-length array field auth_key of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen); -/** Return the value of the extensions field of the - * trn_cell_establish_intro_t in 'inp' - */ -struct trn_cell_extension_st * trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp); -/** As trn_cell_establish_intro_get_extensions, but take and return a - * const pointer - */ -const struct trn_cell_extension_st * trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp); -/** Set the value of the extensions field of the - * trn_cell_establish_intro_t in 'inp' to 'val'. Free the old value if - * any. Steals the referenceto 'val'.Return 0 on success; return -1 - * and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); -/** As trn_cell_establish_intro_set_extensions, but does not free the - * previous value. - */ -int trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); -/** Return the position for end_mac_fields when we parsed this object - */ -const uint8_t * trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp); -/** Return the (constant) length of the array holding the - * handshake_mac field of the trn_cell_establish_intro_t in 'inp'. - */ -size_t trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp); -/** Return the element at position 'idx' of the fixed array field - * handshake_mac of the trn_cell_establish_intro_t in 'inp'. - */ -uint8_t trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx); -/** As trn_cell_establish_intro_get_handshake_mac, but take and return - * a const pointer - */ -uint8_t trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * handshake_mac of the trn_cell_establish_intro_t in 'inp', so that - * it will hold the value 'elt'. - */ -int trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the TRUNNEL_SHA3_256_LEN-element array field - * handshake_mac of 'inp'. - */ -uint8_t * trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp); -/** As trn_cell_establish_intro_get_handshake_mac, but take and return - * a const pointer - */ -const uint8_t * trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp); -/** Return the position for end_sig_fields when we parsed this object - */ -const uint8_t * trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp); -/** Return the value of the sig_len field of the - * trn_cell_establish_intro_t in 'inp' - */ -uint16_t trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp); -/** Set the value of the sig_len field of the - * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the sig field of - * the trn_cell_establish_intro_t in 'inp'. - */ -size_t trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * sig of the trn_cell_establish_intro_t in 'inp'. - */ -uint8_t trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx); -/** As trn_cell_establish_intro_get_sig, but take and return a const - * pointer - */ -uint8_t trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * sig of the trn_cell_establish_intro_t in 'inp', so that it will - * hold the value 'elt'. - */ -int trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field sig of the - * trn_cell_establish_intro_t in 'inp'. - */ -int trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field sig of 'inp'. - */ -uint8_t * trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp); -/** As trn_cell_establish_intro_get_sig, but take and return a const - * pointer - */ -const uint8_t * trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp); -/** Change the length of the variable-length array field sig of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen); -/** Return a newly allocated trn_cell_intro_established with all - * elements set to zero. - */ -trn_cell_intro_established_t *trn_cell_intro_established_new(void); -/** Release all storage held by the trn_cell_intro_established in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void trn_cell_intro_established_free(trn_cell_intro_established_t *victim); -/** Try to parse a trn_cell_intro_established from the buffer in - * 'input', using up to 'len_in' bytes from the input buffer. On - * success, return the number of bytes consumed and set *output to the - * newly allocated trn_cell_intro_established_t. On failure, return -2 - * if the input appears truncated, and -1 if the input is otherwise - * invalid. - */ -ssize_t trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_intro_established in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj); -/** Try to encode the trn_cell_intro_established from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_intro_established_encode(uint8_t *output, size_t avail, const trn_cell_intro_established_t *input); -/** Check whether the internal state of the trn_cell_intro_established - * in 'obj' is consistent. Return NULL if it is, and a short message - * if it is not. - */ -const char *trn_cell_intro_established_check(const trn_cell_intro_established_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj); -/** Return the value of the extensions field of the - * trn_cell_intro_established_t in 'inp' - */ -struct trn_cell_extension_st * trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp); -/** As trn_cell_intro_established_get_extensions, but take and return - * a const pointer - */ -const struct trn_cell_extension_st * trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp); -/** Set the value of the extensions field of the - * trn_cell_intro_established_t in 'inp' to 'val'. Free the old value - * if any. Steals the referenceto 'val'.Return 0 on success; return -1 - * and set the error code on 'inp' on failure. - */ -int trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); -/** As trn_cell_intro_established_set_extensions, but does not free - * the previous value. - */ -int trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); - - -#endif diff --git a/src/tor/src/trunnel/hs/cell_establish_intro.trunnel b/src/tor/src/trunnel/hs/cell_establish_intro.trunnel deleted file mode 100644 index 011ee62a1..000000000 --- a/src/tor/src/trunnel/hs/cell_establish_intro.trunnel +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This contains the definition of the ESTABLISH_INTRO and INTRO_ESTABLISHED - * cell for onion service version 3 and onward. The following format is - * specified in proposal 224 section 3.1. - */ - -extern struct trn_cell_extension; - -const TRUNNEL_SHA3_256_LEN = 32; - -/* ESTABLISH_INTRO payload. See details in section 3.1.1 */ -struct trn_cell_establish_intro { - /* Indicate the start of the handshake authentication data. */ - @ptr start_cell; - - /* Authentication key material. */ - u8 auth_key_type IN [0x00, 0x01, 0x02]; - u16 auth_key_len; - u8 auth_key[auth_key_len]; - - /* Extension(s). Reserved fields. */ - struct trn_cell_extension extensions; - @ptr end_mac_fields; - - /* Handshake MAC. */ - u8 handshake_mac[TRUNNEL_SHA3_256_LEN]; - - /* Signature */ - /* Indicate the end of the handshake authentication data. */ - @ptr end_sig_fields; - u16 sig_len; - u8 sig[sig_len]; -}; - -/* INTRO_ESTABLISHED payload which is an acknowledge of the ESTABLISH_INTRO - * cell. For legacy node, this payload is empty so the following only applies - * to version >= 3. */ -struct trn_cell_intro_established { - /* Extension(s). Reserved fields. */ - struct trn_cell_extension extensions; -}; diff --git a/src/tor/src/trunnel/hs/cell_introduce1.c b/src/tor/src/trunnel/hs/cell_introduce1.c deleted file mode 100644 index 358b355cd..000000000 --- a/src/tor/src/trunnel/hs/cell_introduce1.c +++ /dev/null @@ -1,1357 +0,0 @@ -/* cell_introduce1.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "cell_introduce1.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int cellintroduce_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || cellintroduce_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -typedef struct trn_cell_extension_st trn_cell_extension_t; -trn_cell_extension_t *trn_cell_extension_new(void); -void trn_cell_extension_free(trn_cell_extension_t *victim); -ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); -ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); -const char *trn_cell_extension_check(const trn_cell_extension_t *obj); -int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); -typedef struct link_specifier_st link_specifier_t; -link_specifier_t *link_specifier_new(void); -void link_specifier_free(link_specifier_t *victim); -ssize_t link_specifier_parse(link_specifier_t **output, const uint8_t *input, const size_t len_in); -ssize_t link_specifier_encoded_len(const link_specifier_t *obj); -ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input); -const char *link_specifier_check(const link_specifier_t *obj); -int link_specifier_clear_errors(link_specifier_t *obj); -trn_cell_introduce1_t * -trn_cell_introduce1_new(void) -{ - trn_cell_introduce1_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce1_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_introduce1_clear(trn_cell_introduce1_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); - TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - trn_cell_extension_free(obj->extensions); - obj->extensions = NULL; - TRUNNEL_DYNARRAY_WIPE(&obj->encrypted); - TRUNNEL_DYNARRAY_CLEAR(&obj->encrypted); -} - -void -trn_cell_introduce1_free(trn_cell_introduce1_t *obj) -{ - if (obj == NULL) - return; - trn_cell_introduce1_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_introduce1_t)); - trunnel_free_(obj); -} - -size_t -trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp) -{ - (void)inp; return TRUNNEL_SHA1_LEN; -} - -uint8_t -trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx) -{ - trunnel_assert(idx < TRUNNEL_SHA1_LEN); - return inp->legacy_key_id[idx]; -} - -uint8_t -trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx) -{ - return trn_cell_introduce1_get_legacy_key_id((trn_cell_introduce1_t*)inp, idx); -} -int -trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < TRUNNEL_SHA1_LEN); - inp->legacy_key_id[idx] = elt; - return 0; -} - -uint8_t * -trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp) -{ - return inp->legacy_key_id; -} -const uint8_t * -trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp) -{ - return (const uint8_t *)trn_cell_introduce1_getarray_legacy_key_id((trn_cell_introduce1_t*)inp); -} -uint8_t -trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp) -{ - return inp->auth_key_type; -} -int -trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val) -{ - if (! ((val == 0 || val == 1 || val == 2))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->auth_key_type = val; - return 0; -} -uint16_t -trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp) -{ - return inp->auth_key_len; -} -int -trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val) -{ - inp->auth_key_len = val; - return 0; -} -size_t -trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); -} - -uint8_t -trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); -} - -uint8_t -trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx) -{ - return trn_cell_introduce1_get_auth_key((trn_cell_introduce1_t*)inp, idx); -} -int -trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); - return 0; -} -int -trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->auth_key.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->auth_key, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp) -{ - return inp->auth_key.elts_; -} -const uint8_t * -trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp) -{ - return (const uint8_t *)trn_cell_introduce1_getarray_auth_key((trn_cell_introduce1_t*)inp); -} -int -trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->auth_key.allocated_, - &inp->auth_key.n_, inp->auth_key.elts_, newlen, - sizeof(inp->auth_key.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->auth_key.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -struct trn_cell_extension_st * -trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp) -{ - return inp->extensions; -} -const struct trn_cell_extension_st * -trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp) -{ - return trn_cell_introduce1_get_extensions((trn_cell_introduce1_t*) inp); -} -int -trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) -{ - if (inp->extensions && inp->extensions != val) - trn_cell_extension_free(inp->extensions); - return trn_cell_introduce1_set0_extensions(inp, val); -} -int -trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) -{ - inp->extensions = val; - return 0; -} -size_t -trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->encrypted); -} - -uint8_t -trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->encrypted, idx); -} - -uint8_t -trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx) -{ - return trn_cell_introduce1_get_encrypted((trn_cell_introduce1_t*)inp, idx); -} -int -trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->encrypted, idx, elt); - return 0; -} -int -trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->encrypted, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp) -{ - return inp->encrypted.elts_; -} -const uint8_t * -trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp) -{ - return (const uint8_t *)trn_cell_introduce1_getarray_encrypted((trn_cell_introduce1_t*)inp); -} -int -trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->encrypted.allocated_, - &inp->encrypted.n_, inp->encrypted.elts_, newlen, - sizeof(inp->encrypted.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->encrypted.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_introduce1_check(const trn_cell_introduce1_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2)) - return "Integer out of bounds"; - if (TRUNNEL_DYNARRAY_LEN(&obj->auth_key) != obj->auth_key_len) - return "Length mismatch for auth_key"; - { - const char *msg; - if (NULL != (msg = trn_cell_extension_check(obj->extensions))) - return msg; - } - return NULL; -} - -ssize_t -trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_introduce1_check(obj)) - return -1; - - - /* Length of u8 legacy_key_id[TRUNNEL_SHA1_LEN] */ - result += TRUNNEL_SHA1_LEN; - - /* Length of u8 auth_key_type IN [0, 1, 2] */ - result += 1; - - /* Length of u16 auth_key_len */ - result += 2; - - /* Length of u8 auth_key[auth_key_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - - /* Length of struct trn_cell_extension extensions */ - result += trn_cell_extension_encoded_len(obj->extensions); - - /* Length of u8 encrypted[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->encrypted); - return result; -} -int -trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_introduce1_encode(uint8_t *output, const size_t avail, const trn_cell_introduce1_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_introduce1_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_introduce1_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 legacy_key_id[TRUNNEL_SHA1_LEN] */ - trunnel_assert(written <= avail); - if (avail - written < TRUNNEL_SHA1_LEN) - goto truncated; - memcpy(ptr, obj->legacy_key_id, TRUNNEL_SHA1_LEN); - written += TRUNNEL_SHA1_LEN; ptr += TRUNNEL_SHA1_LEN; - - /* Encode u8 auth_key_type IN [0, 1, 2] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->auth_key_type)); - written += 1; ptr += 1; - - /* Encode u16 auth_key_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->auth_key_len)); - written += 2; ptr += 2; - - /* Encode u8 auth_key[auth_key_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - trunnel_assert(obj->auth_key_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->auth_key.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - /* Encode struct trn_cell_extension extensions */ - trunnel_assert(written <= avail); - result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - /* Encode u8 encrypted[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->encrypted); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->encrypted.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_introduce1_parse(), but do not allocate the output - * object. - */ -static ssize_t -trn_cell_introduce1_parse_into(trn_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 legacy_key_id[TRUNNEL_SHA1_LEN] */ - CHECK_REMAINING(TRUNNEL_SHA1_LEN, truncated); - memcpy(obj->legacy_key_id, ptr, TRUNNEL_SHA1_LEN); - remaining -= TRUNNEL_SHA1_LEN; ptr += TRUNNEL_SHA1_LEN; - - /* Parse u8 auth_key_type IN [0, 1, 2] */ - CHECK_REMAINING(1, truncated); - obj->auth_key_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->auth_key_type == 0 || obj->auth_key_type == 1 || obj->auth_key_type == 2)) - goto fail; - - /* Parse u16 auth_key_len */ - CHECK_REMAINING(2, truncated); - obj->auth_key_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 auth_key[auth_key_len] */ - CHECK_REMAINING(obj->auth_key_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->auth_key, obj->auth_key_len, {}); - obj->auth_key.n_ = obj->auth_key_len; - if (obj->auth_key_len) - memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); - ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - - /* Parse struct trn_cell_extension extensions */ - result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - - /* Parse u8 encrypted[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->encrypted, remaining, {}); - obj->encrypted.n_ = remaining; - if (remaining) - memcpy(obj->encrypted.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_introduce1_new(); - if (NULL == *output) - return -1; - result = trn_cell_introduce1_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_introduce1_free(*output); - *output = NULL; - } - return result; -} -trn_cell_introduce_ack_t * -trn_cell_introduce_ack_new(void) -{ - trn_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_ack_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_introduce_ack_clear(trn_cell_introduce_ack_t *obj) -{ - (void) obj; - trn_cell_extension_free(obj->extensions); - obj->extensions = NULL; -} - -void -trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *obj) -{ - if (obj == NULL) - return; - trn_cell_introduce_ack_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_introduce_ack_t)); - trunnel_free_(obj); -} - -uint16_t -trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp) -{ - return inp->status; -} -int -trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val) -{ - if (! ((val == 0 || val == 1 || val == 2))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->status = val; - return 0; -} -struct trn_cell_extension_st * -trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp) -{ - return inp->extensions; -} -const struct trn_cell_extension_st * -trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp) -{ - return trn_cell_introduce_ack_get_extensions((trn_cell_introduce_ack_t*) inp); -} -int -trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) -{ - if (inp->extensions && inp->extensions != val) - trn_cell_extension_free(inp->extensions); - return trn_cell_introduce_ack_set0_extensions(inp, val); -} -int -trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) -{ - inp->extensions = val; - return 0; -} -const char * -trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->status == 0 || obj->status == 1 || obj->status == 2)) - return "Integer out of bounds"; - { - const char *msg; - if (NULL != (msg = trn_cell_extension_check(obj->extensions))) - return msg; - } - return NULL; -} - -ssize_t -trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_introduce_ack_check(obj)) - return -1; - - - /* Length of u16 status IN [0, 1, 2] */ - result += 2; - - /* Length of struct trn_cell_extension extensions */ - result += trn_cell_extension_encoded_len(obj->extensions); - return result; -} -int -trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_ack_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_introduce_ack_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_introduce_ack_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u16 status IN [0, 1, 2] */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->status)); - written += 2; ptr += 2; - - /* Encode struct trn_cell_extension extensions */ - trunnel_assert(written <= avail); - result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_introduce_ack_parse(), but do not allocate the output - * object. - */ -static ssize_t -trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u16 status IN [0, 1, 2] */ - CHECK_REMAINING(2, truncated); - obj->status = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - if (! (obj->status == 0 || obj->status == 1 || obj->status == 2)) - goto fail; - - /* Parse struct trn_cell_extension extensions */ - result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - fail: - result = -1; - return result; -} - -ssize_t -trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_introduce_ack_new(); - if (NULL == *output) - return -1; - result = trn_cell_introduce_ack_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_introduce_ack_free(*output); - *output = NULL; - } - return result; -} -trn_cell_introduce_encrypted_t * -trn_cell_introduce_encrypted_new(void) -{ - trn_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_encrypted_t)); - if (NULL == val) - return NULL; - val->onion_key_type = 1; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_introduce_encrypted_clear(trn_cell_introduce_encrypted_t *obj) -{ - (void) obj; - trn_cell_extension_free(obj->extensions); - obj->extensions = NULL; - TRUNNEL_DYNARRAY_WIPE(&obj->onion_key); - TRUNNEL_DYNARRAY_CLEAR(&obj->onion_key); - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->nspecs); ++idx) { - link_specifier_free(TRUNNEL_DYNARRAY_GET(&obj->nspecs, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->nspecs); - TRUNNEL_DYNARRAY_CLEAR(&obj->nspecs); - TRUNNEL_DYNARRAY_WIPE(&obj->pad); - TRUNNEL_DYNARRAY_CLEAR(&obj->pad); -} - -void -trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *obj) -{ - if (obj == NULL) - return; - trn_cell_introduce_encrypted_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_introduce_encrypted_t)); - trunnel_free_(obj); -} - -size_t -trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp) -{ - (void)inp; return TRUNNEL_REND_COOKIE_LEN; -} - -uint8_t -trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); - return inp->rend_cookie[idx]; -} - -uint8_t -trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return trn_cell_introduce_encrypted_get_rend_cookie((trn_cell_introduce_encrypted_t*)inp, idx); -} -int -trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); - inp->rend_cookie[idx] = elt; - return 0; -} - -uint8_t * -trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp) -{ - return inp->rend_cookie; -} -const uint8_t * -trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp) -{ - return (const uint8_t *)trn_cell_introduce_encrypted_getarray_rend_cookie((trn_cell_introduce_encrypted_t*)inp); -} -struct trn_cell_extension_st * -trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp) -{ - return inp->extensions; -} -const struct trn_cell_extension_st * -trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp) -{ - return trn_cell_introduce_encrypted_get_extensions((trn_cell_introduce_encrypted_t*) inp); -} -int -trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) -{ - if (inp->extensions && inp->extensions != val) - trn_cell_extension_free(inp->extensions); - return trn_cell_introduce_encrypted_set0_extensions(inp, val); -} -int -trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) -{ - inp->extensions = val; - return 0; -} -uint8_t -trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp) -{ - return inp->onion_key_type; -} -int -trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val) -{ - if (! ((val == 1))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->onion_key_type = val; - return 0; -} -uint16_t -trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp) -{ - return inp->onion_key_len; -} -int -trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val) -{ - inp->onion_key_len = val; - return 0; -} -size_t -trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->onion_key); -} - -uint8_t -trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->onion_key, idx); -} - -uint8_t -trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return trn_cell_introduce_encrypted_get_onion_key((trn_cell_introduce_encrypted_t*)inp, idx); -} -int -trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->onion_key, idx, elt); - return 0; -} -int -trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->onion_key.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->onion_key, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp) -{ - return inp->onion_key.elts_; -} -const uint8_t * -trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp) -{ - return (const uint8_t *)trn_cell_introduce_encrypted_getarray_onion_key((trn_cell_introduce_encrypted_t*)inp); -} -int -trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->onion_key.allocated_, - &inp->onion_key.n_, inp->onion_key.elts_, newlen, - sizeof(inp->onion_key.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->onion_key.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -uint8_t -trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp) -{ - return inp->nspec; -} -int -trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val) -{ - inp->nspec = val; - return 0; -} -size_t -trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->nspecs); -} - -struct link_specifier_st * -trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); -} - - const struct link_specifier_st * -trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return trn_cell_introduce_encrypted_get_nspecs((trn_cell_introduce_encrypted_t*)inp, idx); -} -int -trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) -{ - link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); - if (oldval && oldval != elt) - link_specifier_free(oldval); - return trn_cell_introduce_encrypted_set0_nspecs(inp, idx, elt); -} -int -trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->nspecs, idx, elt); - return 0; -} -int -trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->nspecs.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct link_specifier_st *, &inp->nspecs, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct link_specifier_st * * -trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp) -{ - return inp->nspecs.elts_; -} -const struct link_specifier_st * const * -trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp) -{ - return (const struct link_specifier_st * const *)trn_cell_introduce_encrypted_getarray_nspecs((trn_cell_introduce_encrypted_t*)inp); -} -int -trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen) -{ - struct link_specifier_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->nspecs.allocated_, - &inp->nspecs.n_, inp->nspecs.elts_, newlen, - sizeof(inp->nspecs.elts_[0]), (trunnel_free_fn_t) link_specifier_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->nspecs.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -size_t -trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->pad); -} - -uint8_t -trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->pad, idx); -} - -uint8_t -trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx) -{ - return trn_cell_introduce_encrypted_get_pad((trn_cell_introduce_encrypted_t*)inp, idx); -} -int -trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->pad, idx, elt); - return 0; -} -int -trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->pad, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp) -{ - return inp->pad.elts_; -} -const uint8_t * -trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp) -{ - return (const uint8_t *)trn_cell_introduce_encrypted_getarray_pad((trn_cell_introduce_encrypted_t*)inp); -} -int -trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->pad.allocated_, - &inp->pad.n_, inp->pad.elts_, newlen, - sizeof(inp->pad.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->pad.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - if (NULL != (msg = trn_cell_extension_check(obj->extensions))) - return msg; - } - if (! (obj->onion_key_type == 1)) - return "Integer out of bounds"; - if (TRUNNEL_DYNARRAY_LEN(&obj->onion_key) != obj->onion_key_len) - return "Length mismatch for onion_key"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->nspecs); ++idx) { - if (NULL != (msg = link_specifier_check(TRUNNEL_DYNARRAY_GET(&obj->nspecs, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->nspecs) != obj->nspec) - return "Length mismatch for nspecs"; - return NULL; -} - -ssize_t -trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_introduce_encrypted_check(obj)) - return -1; - - - /* Length of u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */ - result += TRUNNEL_REND_COOKIE_LEN; - - /* Length of struct trn_cell_extension extensions */ - result += trn_cell_extension_encoded_len(obj->extensions); - - /* Length of u8 onion_key_type IN [1] */ - result += 1; - - /* Length of u16 onion_key_len */ - result += 2; - - /* Length of u8 onion_key[onion_key_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->onion_key); - - /* Length of u8 nspec */ - result += 1; - - /* Length of struct link_specifier nspecs[nspec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->nspecs); ++idx) { - result += link_specifier_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->nspecs, idx)); - } - } - - /* Length of u8 pad[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->pad); - return result; -} -int -trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_encrypted_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_introduce_encrypted_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_introduce_encrypted_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */ - trunnel_assert(written <= avail); - if (avail - written < TRUNNEL_REND_COOKIE_LEN) - goto truncated; - memcpy(ptr, obj->rend_cookie, TRUNNEL_REND_COOKIE_LEN); - written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - - /* Encode struct trn_cell_extension extensions */ - trunnel_assert(written <= avail); - result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - - /* Encode u8 onion_key_type IN [1] */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->onion_key_type)); - written += 1; ptr += 1; - - /* Encode u16 onion_key_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->onion_key_len)); - written += 2; ptr += 2; - - /* Encode u8 onion_key[onion_key_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->onion_key); - trunnel_assert(obj->onion_key_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->onion_key.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - /* Encode u8 nspec */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->nspec)); - written += 1; ptr += 1; - - /* Encode struct link_specifier nspecs[nspec] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->nspecs); ++idx) { - trunnel_assert(written <= avail); - result = link_specifier_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->nspecs, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - /* Encode u8 pad[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->pad); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->pad.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_introduce_encrypted_parse(), but do not allocate the - * output object. - */ -static ssize_t -trn_cell_introduce_encrypted_parse_into(trn_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */ - CHECK_REMAINING(TRUNNEL_REND_COOKIE_LEN, truncated); - memcpy(obj->rend_cookie, ptr, TRUNNEL_REND_COOKIE_LEN); - remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - - /* Parse struct trn_cell_extension extensions */ - result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - - /* Parse u8 onion_key_type IN [1] */ - CHECK_REMAINING(1, truncated); - obj->onion_key_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - if (! (obj->onion_key_type == 1)) - goto fail; - - /* Parse u16 onion_key_len */ - CHECK_REMAINING(2, truncated); - obj->onion_key_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 onion_key[onion_key_len] */ - CHECK_REMAINING(obj->onion_key_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->onion_key, obj->onion_key_len, {}); - obj->onion_key.n_ = obj->onion_key_len; - if (obj->onion_key_len) - memcpy(obj->onion_key.elts_, ptr, obj->onion_key_len); - ptr += obj->onion_key_len; remaining -= obj->onion_key_len; - - /* Parse u8 nspec */ - CHECK_REMAINING(1, truncated); - obj->nspec = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct link_specifier nspecs[nspec] */ - TRUNNEL_DYNARRAY_EXPAND(link_specifier_t *, &obj->nspecs, obj->nspec, {}); - { - link_specifier_t * elt; - unsigned idx; - for (idx = 0; idx < obj->nspec; ++idx) { - result = link_specifier_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(link_specifier_t *, &obj->nspecs, elt, {link_specifier_free(elt);}); - } - } - - /* Parse u8 pad[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->pad, remaining, {}); - obj->pad.n_ = remaining; - if (remaining) - memcpy(obj->pad.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_introduce_encrypted_new(); - if (NULL == *output) - return -1; - result = trn_cell_introduce_encrypted_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_introduce_encrypted_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/hs/cell_introduce1.h b/src/tor/src/trunnel/hs/cell_introduce1.h deleted file mode 100644 index fa218adc6..000000000 --- a/src/tor/src/trunnel/hs/cell_introduce1.h +++ /dev/null @@ -1,493 +0,0 @@ -/* cell_introduce1.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_CELL_INTRODUCE1_H -#define TRUNNEL_CELL_INTRODUCE1_H - -#include -#include "trunnel.h" - -struct trn_cell_extension_st; -struct link_specifier_st; -#define TRUNNEL_SHA1_LEN 20 -#define TRUNNEL_REND_COOKIE_LEN 20 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE1) -struct trn_cell_introduce1_st { - uint8_t legacy_key_id[TRUNNEL_SHA1_LEN]; - uint8_t auth_key_type; - uint16_t auth_key_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct trn_cell_extension_st *extensions; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) encrypted; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_introduce1_st trn_cell_introduce1_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ACK) -struct trn_cell_introduce_ack_st { - uint16_t status; - struct trn_cell_extension_st *extensions; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_introduce_ack_st trn_cell_introduce_ack_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ENCRYPTED) -struct trn_cell_introduce_encrypted_st { - uint8_t rend_cookie[TRUNNEL_REND_COOKIE_LEN]; - struct trn_cell_extension_st *extensions; - uint8_t onion_key_type; - uint16_t onion_key_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) onion_key; - uint8_t nspec; - TRUNNEL_DYNARRAY_HEAD(, struct link_specifier_st *) nspecs; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) pad; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_introduce_encrypted_st trn_cell_introduce_encrypted_t; -/** Return a newly allocated trn_cell_introduce1 with all elements set - * to zero. - */ -trn_cell_introduce1_t *trn_cell_introduce1_new(void); -/** Release all storage held by the trn_cell_introduce1 in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void trn_cell_introduce1_free(trn_cell_introduce1_t *victim); -/** Try to parse a trn_cell_introduce1 from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated trn_cell_introduce1_t. On failure, return -2 if the input - * appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_introduce1 in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj); -/** Try to encode the trn_cell_introduce1 from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_introduce1_encode(uint8_t *output, size_t avail, const trn_cell_introduce1_t *input); -/** Check whether the internal state of the trn_cell_introduce1 in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *trn_cell_introduce1_check(const trn_cell_introduce1_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj); -/** Return the (constant) length of the array holding the - * legacy_key_id field of the trn_cell_introduce1_t in 'inp'. - */ -size_t trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * legacy_key_id of the trn_cell_introduce1_t in 'inp'. - */ -uint8_t trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx); -/** As trn_cell_introduce1_get_legacy_key_id, but take and return a - * const pointer - */ -uint8_t trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * legacy_key_id of the trn_cell_introduce1_t in 'inp', so that it - * will hold the value 'elt'. - */ -int trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the TRUNNEL_SHA1_LEN-element array field - * legacy_key_id of 'inp'. - */ -uint8_t * trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp); -/** As trn_cell_introduce1_get_legacy_key_id, but take and return a - * const pointer - */ -const uint8_t * trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp); -/** Return the value of the auth_key_type field of the - * trn_cell_introduce1_t in 'inp' - */ -uint8_t trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp); -/** Set the value of the auth_key_type field of the - * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val); -/** Return the value of the auth_key_len field of the - * trn_cell_introduce1_t in 'inp' - */ -uint16_t trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp); -/** Set the value of the auth_key_len field of the - * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the auth_key field - * of the trn_cell_introduce1_t in 'inp'. - */ -size_t trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * auth_key of the trn_cell_introduce1_t in 'inp'. - */ -uint8_t trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx); -/** As trn_cell_introduce1_get_auth_key, but take and return a const - * pointer - */ -uint8_t trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * auth_key of the trn_cell_introduce1_t in 'inp', so that it will - * hold the value 'elt'. - */ -int trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field auth_key of - * the trn_cell_introduce1_t in 'inp'. - */ -int trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field auth_key of - * 'inp'. - */ -uint8_t * trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp); -/** As trn_cell_introduce1_get_auth_key, but take and return a const - * pointer - */ -const uint8_t * trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp); -/** Change the length of the variable-length array field auth_key of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen); -/** Return the value of the extensions field of the - * trn_cell_introduce1_t in 'inp' - */ -struct trn_cell_extension_st * trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp); -/** As trn_cell_introduce1_get_extensions, but take and return a const - * pointer - */ -const struct trn_cell_extension_st * trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp); -/** Set the value of the extensions field of the trn_cell_introduce1_t - * in 'inp' to 'val'. Free the old value if any. Steals the - * referenceto 'val'.Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); -/** As trn_cell_introduce1_set_extensions, but does not free the - * previous value. - */ -int trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); -/** Return the length of the dynamic array holding the encrypted field - * of the trn_cell_introduce1_t in 'inp'. - */ -size_t trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * encrypted of the trn_cell_introduce1_t in 'inp'. - */ -uint8_t trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx); -/** As trn_cell_introduce1_get_encrypted, but take and return a const - * pointer - */ -uint8_t trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * encrypted of the trn_cell_introduce1_t in 'inp', so that it will - * hold the value 'elt'. - */ -int trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field encrypted of - * the trn_cell_introduce1_t in 'inp'. - */ -int trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field encrypted of - * 'inp'. - */ -uint8_t * trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp); -/** As trn_cell_introduce1_get_encrypted, but take and return a const - * pointer - */ -const uint8_t * trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp); -/** Change the length of the variable-length array field encrypted of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen); -/** Return a newly allocated trn_cell_introduce_ack with all elements - * set to zero. - */ -trn_cell_introduce_ack_t *trn_cell_introduce_ack_new(void); -/** Release all storage held by the trn_cell_introduce_ack in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *victim); -/** Try to parse a trn_cell_introduce_ack from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated trn_cell_introduce_ack_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_introduce_ack in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj); -/** Try to encode the trn_cell_introduce_ack from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_introduce_ack_encode(uint8_t *output, size_t avail, const trn_cell_introduce_ack_t *input); -/** Check whether the internal state of the trn_cell_introduce_ack in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj); -/** Return the value of the status field of the - * trn_cell_introduce_ack_t in 'inp' - */ -uint16_t trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp); -/** Set the value of the status field of the trn_cell_introduce_ack_t - * in 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val); -/** Return the value of the extensions field of the - * trn_cell_introduce_ack_t in 'inp' - */ -struct trn_cell_extension_st * trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp); -/** As trn_cell_introduce_ack_get_extensions, but take and return a - * const pointer - */ -const struct trn_cell_extension_st * trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp); -/** Set the value of the extensions field of the - * trn_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if - * any. Steals the referenceto 'val'.Return 0 on success; return -1 - * and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); -/** As trn_cell_introduce_ack_set_extensions, but does not free the - * previous value. - */ -int trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); -/** Return a newly allocated trn_cell_introduce_encrypted with all - * elements set to zero. - */ -trn_cell_introduce_encrypted_t *trn_cell_introduce_encrypted_new(void); -/** Release all storage held by the trn_cell_introduce_encrypted in - * 'victim'. (Do nothing if 'victim' is NULL.) - */ -void trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *victim); -/** Try to parse a trn_cell_introduce_encrypted from the buffer in - * 'input', using up to 'len_in' bytes from the input buffer. On - * success, return the number of bytes consumed and set *output to the - * newly allocated trn_cell_introduce_encrypted_t. On failure, return - * -2 if the input appears truncated, and -1 if the input is otherwise - * invalid. - */ -ssize_t trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_introduce_encrypted in 'obj'. On failure, return a - * negative value. Note that this value may be an overestimate, and - * can even be an underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj); -/** Try to encode the trn_cell_introduce_encrypted from 'input' into - * the buffer at 'output', using up to 'avail' bytes of the output - * buffer. On success, return the number of bytes used. On failure, - * return -2 if the buffer was not long enough, and -1 if the input - * was invalid. - */ -ssize_t trn_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const trn_cell_introduce_encrypted_t *input); -/** Check whether the internal state of the - * trn_cell_introduce_encrypted in 'obj' is consistent. Return NULL if - * it is, and a short message if it is not. - */ -const char *trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj); -/** Return the (constant) length of the array holding the rend_cookie - * field of the trn_cell_introduce_encrypted_t in 'inp'. - */ -size_t trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp); -/** Return the element at position 'idx' of the fixed array field - * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp'. - */ -uint8_t trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx); -/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and - * return a const pointer - */ -uint8_t trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp', so that - * it will hold the value 'elt'. - */ -int trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array - * field rend_cookie of 'inp'. - */ -uint8_t * trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp); -/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and - * return a const pointer - */ -const uint8_t * trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp); -/** Return the value of the extensions field of the - * trn_cell_introduce_encrypted_t in 'inp' - */ -struct trn_cell_extension_st * trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp); -/** As trn_cell_introduce_encrypted_get_extensions, but take and - * return a const pointer - */ -const struct trn_cell_extension_st * trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp); -/** Set the value of the extensions field of the - * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old - * value if any. Steals the referenceto 'val'.Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); -/** As trn_cell_introduce_encrypted_set_extensions, but does not free - * the previous value. - */ -int trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); -/** Return the value of the onion_key_type field of the - * trn_cell_introduce_encrypted_t in 'inp' - */ -uint8_t trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp); -/** Set the value of the onion_key_type field of the - * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on - * success; return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val); -/** Return the value of the onion_key_len field of the - * trn_cell_introduce_encrypted_t in 'inp' - */ -uint16_t trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp); -/** Set the value of the onion_key_len field of the - * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on - * success; return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the onion_key field - * of the trn_cell_introduce_encrypted_t in 'inp'. - */ -size_t trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * onion_key of the trn_cell_introduce_encrypted_t in 'inp'. - */ -uint8_t trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx); -/** As trn_cell_introduce_encrypted_get_onion_key, but take and return - * a const pointer - */ -uint8_t trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * onion_key of the trn_cell_introduce_encrypted_t in 'inp', so that - * it will hold the value 'elt'. - */ -int trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field onion_key of - * the trn_cell_introduce_encrypted_t in 'inp'. - */ -int trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field onion_key of - * 'inp'. - */ -uint8_t * trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp); -/** As trn_cell_introduce_encrypted_get_onion_key, but take and return - * a const pointer - */ -const uint8_t * trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp); -/** Change the length of the variable-length array field onion_key of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen); -/** Return the value of the nspec field of the - * trn_cell_introduce_encrypted_t in 'inp' - */ -uint8_t trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp); -/** Set the value of the nspec field of the - * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on - * success; return -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the nspecs field of - * the trn_cell_introduce_encrypted_t in 'inp'. - */ -size_t trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * nspecs of the trn_cell_introduce_encrypted_t in 'inp'. - */ -struct link_specifier_st * trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx); -/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a - * const pointer - */ - const struct link_specifier_st * trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * nspecs of the trn_cell_introduce_encrypted_t in 'inp', so that it - * will hold the value 'elt'. Free the previous value, if any. - */ -int trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); -/** As trn_cell_introduce_encrypted_set_nspecs, but does not free the - * previous value. - */ -int trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); -/** Append a new element 'elt' to the dynamic array field nspecs of - * the trn_cell_introduce_encrypted_t in 'inp'. - */ -int trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt); -/** Return a pointer to the variable-length array field nspecs of - * 'inp'. - */ -struct link_specifier_st * * trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp); -/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a - * const pointer - */ -const struct link_specifier_st * const * trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp); -/** Change the length of the variable-length array field nspecs of - * 'inp' to 'newlen'.Fill extra elements with NULL; free removed - * elements. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen); -/** Return the length of the dynamic array holding the pad field of - * the trn_cell_introduce_encrypted_t in 'inp'. - */ -size_t trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * pad of the trn_cell_introduce_encrypted_t in 'inp'. - */ -uint8_t trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx); -/** As trn_cell_introduce_encrypted_get_pad, but take and return a - * const pointer - */ -uint8_t trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * pad of the trn_cell_introduce_encrypted_t in 'inp', so that it will - * hold the value 'elt'. - */ -int trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field pad of the - * trn_cell_introduce_encrypted_t in 'inp'. - */ -int trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field pad of 'inp'. - */ -uint8_t * trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp); -/** As trn_cell_introduce_encrypted_get_pad, but take and return a - * const pointer - */ -const uint8_t * trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp); -/** Change the length of the variable-length array field pad of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen); - - -#endif diff --git a/src/tor/src/trunnel/hs/cell_introduce1.trunnel b/src/tor/src/trunnel/hs/cell_introduce1.trunnel deleted file mode 100644 index 7577c1526..000000000 --- a/src/tor/src/trunnel/hs/cell_introduce1.trunnel +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This contains the definition of the INTRODUCE1 and INTRODUCE_ACK cell for - * onion service version 3 and onward. The following format is specified in - * proposal 224 section 3.2. - */ - -/* From cell_common.trunnel. */ -extern struct trn_cell_extension; -/* From ed25519_cert.trunnel. */ -extern struct link_specifier; - -const TRUNNEL_SHA1_LEN = 20; -const TRUNNEL_REND_COOKIE_LEN = 20; - -/* INTRODUCE1 payload. See details in section 3.2.1. */ -struct trn_cell_introduce1 { - /* Always zeroed. MUST be checked explicitely by the caller. */ - u8 legacy_key_id[TRUNNEL_SHA1_LEN]; - - /* Authentication key material. */ - u8 auth_key_type IN [0x00, 0x01, 0x02]; - u16 auth_key_len; - u8 auth_key[auth_key_len]; - - /* Extension(s). Reserved fields. */ - struct trn_cell_extension extensions; - - /* Variable length, up to the end of cell. */ - u8 encrypted[]; -}; - -/* INTRODUCE_ACK payload. See details in section 3.2.2. */ -struct trn_cell_introduce_ack { - /* Status of introduction. */ - u16 status IN [0x0000, 0x0001, 0x0002]; - - /* Extension(s). Reserved fields. */ - struct trn_cell_extension extensions; -}; - -/* Encrypted section of the INTRODUCE1/INTRODUCE2 cell. */ -struct trn_cell_introduce_encrypted { - /* Rendezvous cookie. */ - u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN]; - - /* Extension(s). Reserved fields. */ - struct trn_cell_extension extensions; - - /* Onion key material. */ - u8 onion_key_type IN [0x01]; - u16 onion_key_len; - u8 onion_key[onion_key_len]; - - /* Link specifiers(s) */ - u8 nspec; - struct link_specifier nspecs[nspec]; - - /* Optional padding. This might be empty or not. */ - u8 pad[]; -}; diff --git a/src/tor/src/trunnel/hs/cell_rendezvous.c b/src/tor/src/trunnel/hs/cell_rendezvous.c deleted file mode 100644 index 53cb60913..000000000 --- a/src/tor/src/trunnel/hs/cell_rendezvous.c +++ /dev/null @@ -1,470 +0,0 @@ -/* cell_rendezvous.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "cell_rendezvous.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int cellrendezvous_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || cellrendezvous_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -trn_cell_rendezvous1_t * -trn_cell_rendezvous1_new(void) -{ - trn_cell_rendezvous1_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous1_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_rendezvous1_clear(trn_cell_rendezvous1_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->handshake_info); - TRUNNEL_DYNARRAY_CLEAR(&obj->handshake_info); -} - -void -trn_cell_rendezvous1_free(trn_cell_rendezvous1_t *obj) -{ - if (obj == NULL) - return; - trn_cell_rendezvous1_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_rendezvous1_t)); - trunnel_free_(obj); -} - -size_t -trn_cell_rendezvous1_getlen_rendezvous_cookie(const trn_cell_rendezvous1_t *inp) -{ - (void)inp; return TRUNNEL_REND_COOKIE_LEN; -} - -uint8_t -trn_cell_rendezvous1_get_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx) -{ - trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); - return inp->rendezvous_cookie[idx]; -} - -uint8_t -trn_cell_rendezvous1_getconst_rendezvous_cookie(const trn_cell_rendezvous1_t *inp, size_t idx) -{ - return trn_cell_rendezvous1_get_rendezvous_cookie((trn_cell_rendezvous1_t*)inp, idx); -} -int -trn_cell_rendezvous1_set_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); - inp->rendezvous_cookie[idx] = elt; - return 0; -} - -uint8_t * -trn_cell_rendezvous1_getarray_rendezvous_cookie(trn_cell_rendezvous1_t *inp) -{ - return inp->rendezvous_cookie; -} -const uint8_t * -trn_cell_rendezvous1_getconstarray_rendezvous_cookie(const trn_cell_rendezvous1_t *inp) -{ - return (const uint8_t *)trn_cell_rendezvous1_getarray_rendezvous_cookie((trn_cell_rendezvous1_t*)inp); -} -size_t -trn_cell_rendezvous1_getlen_handshake_info(const trn_cell_rendezvous1_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->handshake_info); -} - -uint8_t -trn_cell_rendezvous1_get_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->handshake_info, idx); -} - -uint8_t -trn_cell_rendezvous1_getconst_handshake_info(const trn_cell_rendezvous1_t *inp, size_t idx) -{ - return trn_cell_rendezvous1_get_handshake_info((trn_cell_rendezvous1_t*)inp, idx); -} -int -trn_cell_rendezvous1_set_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->handshake_info, idx, elt); - return 0; -} -int -trn_cell_rendezvous1_add_handshake_info(trn_cell_rendezvous1_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->handshake_info, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -trn_cell_rendezvous1_getarray_handshake_info(trn_cell_rendezvous1_t *inp) -{ - return inp->handshake_info.elts_; -} -const uint8_t * -trn_cell_rendezvous1_getconstarray_handshake_info(const trn_cell_rendezvous1_t *inp) -{ - return (const uint8_t *)trn_cell_rendezvous1_getarray_handshake_info((trn_cell_rendezvous1_t*)inp); -} -int -trn_cell_rendezvous1_setlen_handshake_info(trn_cell_rendezvous1_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->handshake_info.allocated_, - &inp->handshake_info.n_, inp->handshake_info.elts_, newlen, - sizeof(inp->handshake_info.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->handshake_info.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -trn_cell_rendezvous1_check(const trn_cell_rendezvous1_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - return NULL; -} - -ssize_t -trn_cell_rendezvous1_encoded_len(const trn_cell_rendezvous1_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_rendezvous1_check(obj)) - return -1; - - - /* Length of u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */ - result += TRUNNEL_REND_COOKIE_LEN; - - /* Length of u8 handshake_info[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->handshake_info); - return result; -} -int -trn_cell_rendezvous1_clear_errors(trn_cell_rendezvous1_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_rendezvous1_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous1_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_rendezvous1_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_rendezvous1_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */ - trunnel_assert(written <= avail); - if (avail - written < TRUNNEL_REND_COOKIE_LEN) - goto truncated; - memcpy(ptr, obj->rendezvous_cookie, TRUNNEL_REND_COOKIE_LEN); - written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - - /* Encode u8 handshake_info[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->handshake_info); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->handshake_info.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_rendezvous1_parse(), but do not allocate the output - * object. - */ -static ssize_t -trn_cell_rendezvous1_parse_into(trn_cell_rendezvous1_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */ - CHECK_REMAINING(TRUNNEL_REND_COOKIE_LEN, truncated); - memcpy(obj->rendezvous_cookie, ptr, TRUNNEL_REND_COOKIE_LEN); - remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - - /* Parse u8 handshake_info[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->handshake_info, remaining, {}); - obj->handshake_info.n_ = remaining; - if (remaining) - memcpy(obj->handshake_info.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -trn_cell_rendezvous1_parse(trn_cell_rendezvous1_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_rendezvous1_new(); - if (NULL == *output) - return -1; - result = trn_cell_rendezvous1_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_rendezvous1_free(*output); - *output = NULL; - } - return result; -} -trn_cell_rendezvous2_t * -trn_cell_rendezvous2_new(void) -{ - trn_cell_rendezvous2_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous2_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -trn_cell_rendezvous2_clear(trn_cell_rendezvous2_t *obj) -{ - (void) obj; -} - -void -trn_cell_rendezvous2_free(trn_cell_rendezvous2_t *obj) -{ - if (obj == NULL) - return; - trn_cell_rendezvous2_clear(obj); - trunnel_memwipe(obj, sizeof(trn_cell_rendezvous2_t)); - trunnel_free_(obj); -} - -size_t -trn_cell_rendezvous2_getlen_handshake_info(const trn_cell_rendezvous2_t *inp) -{ - (void)inp; return TRUNNEL_HANDSHAKE_INFO_LEN; -} - -uint8_t -trn_cell_rendezvous2_get_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx) -{ - trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN); - return inp->handshake_info[idx]; -} - -uint8_t -trn_cell_rendezvous2_getconst_handshake_info(const trn_cell_rendezvous2_t *inp, size_t idx) -{ - return trn_cell_rendezvous2_get_handshake_info((trn_cell_rendezvous2_t*)inp, idx); -} -int -trn_cell_rendezvous2_set_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN); - inp->handshake_info[idx] = elt; - return 0; -} - -uint8_t * -trn_cell_rendezvous2_getarray_handshake_info(trn_cell_rendezvous2_t *inp) -{ - return inp->handshake_info; -} -const uint8_t * -trn_cell_rendezvous2_getconstarray_handshake_info(const trn_cell_rendezvous2_t *inp) -{ - return (const uint8_t *)trn_cell_rendezvous2_getarray_handshake_info((trn_cell_rendezvous2_t*)inp); -} -const char * -trn_cell_rendezvous2_check(const trn_cell_rendezvous2_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - return NULL; -} - -ssize_t -trn_cell_rendezvous2_encoded_len(const trn_cell_rendezvous2_t *obj) -{ - ssize_t result = 0; - - if (NULL != trn_cell_rendezvous2_check(obj)) - return -1; - - - /* Length of u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */ - result += TRUNNEL_HANDSHAKE_INFO_LEN; - return result; -} -int -trn_cell_rendezvous2_clear_errors(trn_cell_rendezvous2_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -trn_cell_rendezvous2_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous2_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = trn_cell_rendezvous2_encoded_len(obj); -#endif - - if (NULL != (msg = trn_cell_rendezvous2_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */ - trunnel_assert(written <= avail); - if (avail - written < TRUNNEL_HANDSHAKE_INFO_LEN) - goto truncated; - memcpy(ptr, obj->handshake_info, TRUNNEL_HANDSHAKE_INFO_LEN); - written += TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN; - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As trn_cell_rendezvous2_parse(), but do not allocate the output - * object. - */ -static ssize_t -trn_cell_rendezvous2_parse_into(trn_cell_rendezvous2_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */ - CHECK_REMAINING(TRUNNEL_HANDSHAKE_INFO_LEN, truncated); - memcpy(obj->handshake_info, ptr, TRUNNEL_HANDSHAKE_INFO_LEN); - remaining -= TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; -} - -ssize_t -trn_cell_rendezvous2_parse(trn_cell_rendezvous2_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = trn_cell_rendezvous2_new(); - if (NULL == *output) - return -1; - result = trn_cell_rendezvous2_parse_into(*output, input, len_in); - if (result < 0) { - trn_cell_rendezvous2_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/hs/cell_rendezvous.h b/src/tor/src/trunnel/hs/cell_rendezvous.h deleted file mode 100644 index 39e14da25..000000000 --- a/src/tor/src/trunnel/hs/cell_rendezvous.h +++ /dev/null @@ -1,187 +0,0 @@ -/* cell_rendezvous.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_CELL_RENDEZVOUS_H -#define TRUNNEL_CELL_RENDEZVOUS_H - -#include -#include "trunnel.h" - -#define TRUNNEL_REND_COOKIE_LEN 20 -#define TRUNNEL_HANDSHAKE_INFO_LEN 64 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_RENDEZVOUS1) -struct trn_cell_rendezvous1_st { - uint8_t rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN]; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) handshake_info; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_rendezvous1_st trn_cell_rendezvous1_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_RENDEZVOUS2) -struct trn_cell_rendezvous2_st { - uint8_t handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN]; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct trn_cell_rendezvous2_st trn_cell_rendezvous2_t; -/** Return a newly allocated trn_cell_rendezvous1 with all elements - * set to zero. - */ -trn_cell_rendezvous1_t *trn_cell_rendezvous1_new(void); -/** Release all storage held by the trn_cell_rendezvous1 in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void trn_cell_rendezvous1_free(trn_cell_rendezvous1_t *victim); -/** Try to parse a trn_cell_rendezvous1 from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated trn_cell_rendezvous1_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t trn_cell_rendezvous1_parse(trn_cell_rendezvous1_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_rendezvous1 in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_rendezvous1_encoded_len(const trn_cell_rendezvous1_t *obj); -/** Try to encode the trn_cell_rendezvous1 from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_rendezvous1_encode(uint8_t *output, size_t avail, const trn_cell_rendezvous1_t *input); -/** Check whether the internal state of the trn_cell_rendezvous1 in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *trn_cell_rendezvous1_check(const trn_cell_rendezvous1_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_rendezvous1_clear_errors(trn_cell_rendezvous1_t *obj); -/** Return the (constant) length of the array holding the - * rendezvous_cookie field of the trn_cell_rendezvous1_t in 'inp'. - */ -size_t trn_cell_rendezvous1_getlen_rendezvous_cookie(const trn_cell_rendezvous1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * rendezvous_cookie of the trn_cell_rendezvous1_t in 'inp'. - */ -uint8_t trn_cell_rendezvous1_get_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx); -/** As trn_cell_rendezvous1_get_rendezvous_cookie, but take and return - * a const pointer - */ -uint8_t trn_cell_rendezvous1_getconst_rendezvous_cookie(const trn_cell_rendezvous1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * rendezvous_cookie of the trn_cell_rendezvous1_t in 'inp', so that - * it will hold the value 'elt'. - */ -int trn_cell_rendezvous1_set_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array - * field rendezvous_cookie of 'inp'. - */ -uint8_t * trn_cell_rendezvous1_getarray_rendezvous_cookie(trn_cell_rendezvous1_t *inp); -/** As trn_cell_rendezvous1_get_rendezvous_cookie, but take and return - * a const pointer - */ -const uint8_t * trn_cell_rendezvous1_getconstarray_rendezvous_cookie(const trn_cell_rendezvous1_t *inp); -/** Return the length of the dynamic array holding the handshake_info - * field of the trn_cell_rendezvous1_t in 'inp'. - */ -size_t trn_cell_rendezvous1_getlen_handshake_info(const trn_cell_rendezvous1_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * handshake_info of the trn_cell_rendezvous1_t in 'inp'. - */ -uint8_t trn_cell_rendezvous1_get_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx); -/** As trn_cell_rendezvous1_get_handshake_info, but take and return a - * const pointer - */ -uint8_t trn_cell_rendezvous1_getconst_handshake_info(const trn_cell_rendezvous1_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * handshake_info of the trn_cell_rendezvous1_t in 'inp', so that it - * will hold the value 'elt'. - */ -int trn_cell_rendezvous1_set_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field - * handshake_info of the trn_cell_rendezvous1_t in 'inp'. - */ -int trn_cell_rendezvous1_add_handshake_info(trn_cell_rendezvous1_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field handshake_info - * of 'inp'. - */ -uint8_t * trn_cell_rendezvous1_getarray_handshake_info(trn_cell_rendezvous1_t *inp); -/** As trn_cell_rendezvous1_get_handshake_info, but take and return a - * const pointer - */ -const uint8_t * trn_cell_rendezvous1_getconstarray_handshake_info(const trn_cell_rendezvous1_t *inp); -/** Change the length of the variable-length array field - * handshake_info of 'inp' to 'newlen'.Fill extra elements with 0. - * Return 0 on success; return -1 and set the error code on 'inp' on - * failure. - */ -int trn_cell_rendezvous1_setlen_handshake_info(trn_cell_rendezvous1_t *inp, size_t newlen); -/** Return a newly allocated trn_cell_rendezvous2 with all elements - * set to zero. - */ -trn_cell_rendezvous2_t *trn_cell_rendezvous2_new(void); -/** Release all storage held by the trn_cell_rendezvous2 in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void trn_cell_rendezvous2_free(trn_cell_rendezvous2_t *victim); -/** Try to parse a trn_cell_rendezvous2 from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated trn_cell_rendezvous2_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t trn_cell_rendezvous2_parse(trn_cell_rendezvous2_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * trn_cell_rendezvous2 in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t trn_cell_rendezvous2_encoded_len(const trn_cell_rendezvous2_t *obj); -/** Try to encode the trn_cell_rendezvous2 from 'input' into the - * buffer at 'output', using up to 'avail' bytes of the output buffer. - * On success, return the number of bytes used. On failure, return -2 - * if the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t trn_cell_rendezvous2_encode(uint8_t *output, size_t avail, const trn_cell_rendezvous2_t *input); -/** Check whether the internal state of the trn_cell_rendezvous2 in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *trn_cell_rendezvous2_check(const trn_cell_rendezvous2_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int trn_cell_rendezvous2_clear_errors(trn_cell_rendezvous2_t *obj); -/** Return the (constant) length of the array holding the - * handshake_info field of the trn_cell_rendezvous2_t in 'inp'. - */ -size_t trn_cell_rendezvous2_getlen_handshake_info(const trn_cell_rendezvous2_t *inp); -/** Return the element at position 'idx' of the fixed array field - * handshake_info of the trn_cell_rendezvous2_t in 'inp'. - */ -uint8_t trn_cell_rendezvous2_get_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx); -/** As trn_cell_rendezvous2_get_handshake_info, but take and return a - * const pointer - */ -uint8_t trn_cell_rendezvous2_getconst_handshake_info(const trn_cell_rendezvous2_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * handshake_info of the trn_cell_rendezvous2_t in 'inp', so that it - * will hold the value 'elt'. - */ -int trn_cell_rendezvous2_set_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the TRUNNEL_HANDSHAKE_INFO_LEN-element array - * field handshake_info of 'inp'. - */ -uint8_t * trn_cell_rendezvous2_getarray_handshake_info(trn_cell_rendezvous2_t *inp); -/** As trn_cell_rendezvous2_get_handshake_info, but take and return a - * const pointer - */ -const uint8_t * trn_cell_rendezvous2_getconstarray_handshake_info(const trn_cell_rendezvous2_t *inp); - - -#endif diff --git a/src/tor/src/trunnel/hs/cell_rendezvous.trunnel b/src/tor/src/trunnel/hs/cell_rendezvous.trunnel deleted file mode 100644 index 2128b4d12..000000000 --- a/src/tor/src/trunnel/hs/cell_rendezvous.trunnel +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This contains the definition of the RENDEZVOUS1/2 cell for onion service - * version 3 and onward. The following format is specified in proposal 224 - * section 4.2. - */ - -/* Rendezvous cookie length. */ -const TRUNNEL_REND_COOKIE_LEN = 20; -/* The HANDSHAKE_INFO field layout is as follow: - * SERVER_PK [PK_PUBKEY_LEN bytes] - * AUTH [MAC_LEN bytes] - * This means, the size is 32 bytes + 32 bytes. */ -const TRUNNEL_HANDSHAKE_INFO_LEN = 64; - -/* RENDEZVOUS1 payload. See details in section 4.2. */ -struct trn_cell_rendezvous1 { - /* The RENDEZVOUS_COOKIE field. */ - u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN]; - - /* The HANDSHAKE_INFO field which has a variable length depending on the - * handshake type used. */ - u8 handshake_info[]; -}; - -/* RENDEZVOUS2 payload. See details in section 4.2. */ -struct trn_cell_rendezvous2 { - /* The HANDSHAKE_INFO field. */ - u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN]; -}; diff --git a/src/tor/src/trunnel/include.am b/src/tor/src/trunnel/include.am deleted file mode 100644 index ca79ff3a3..000000000 --- a/src/tor/src/trunnel/include.am +++ /dev/null @@ -1,52 +0,0 @@ -noinst_LIBRARIES += \ - src/trunnel/libor-trunnel.a - -if UNITTESTS_ENABLED -noinst_LIBRARIES += \ - src/trunnel/libor-trunnel-testing.a -endif - -AM_CPPFLAGS += -I$(srcdir)/src/ext/trunnel -I$(srcdir)/src/trunnel - -TRUNNELINPUTS = \ - src/trunnel/ed25519_cert.trunnel \ - src/trunnel/link_handshake.trunnel \ - src/trunnel/pwbox.trunnel \ - src/trunnel/channelpadding_negotiation.trunnel - -TRUNNELSOURCES = \ - src/ext/trunnel/trunnel.c \ - src/trunnel/ed25519_cert.c \ - src/trunnel/link_handshake.c \ - src/trunnel/pwbox.c \ - src/trunnel/hs/cell_common.c \ - src/trunnel/hs/cell_establish_intro.c \ - src/trunnel/hs/cell_introduce1.c \ - src/trunnel/hs/cell_rendezvous.c \ - src/trunnel/channelpadding_negotiation.c - -TRUNNELHEADERS = \ - src/ext/trunnel/trunnel.h \ - src/ext/trunnel/trunnel-impl.h \ - src/trunnel/trunnel-local.h \ - src/trunnel/ed25519_cert.h \ - src/trunnel/link_handshake.h \ - src/trunnel/pwbox.h \ - src/trunnel/hs/cell_common.h \ - src/trunnel/hs/cell_establish_intro.h \ - src/trunnel/hs/cell_introduce1.h \ - src/trunnel/hs/cell_rendezvous.h \ - src/trunnel/channelpadding_negotiation.h - -src_trunnel_libor_trunnel_a_SOURCES = $(TRUNNELSOURCES) -src_trunnel_libor_trunnel_a_CPPFLAGS = -DTRUNNEL_LOCAL_H $(AM_CPPFLAGS) - -src_trunnel_libor_trunnel_testing_a_SOURCES = $(TRUNNELSOURCES) -src_trunnel_libor_trunnel_testing_a_CPPFLAGS = -DTRUNNEL_LOCAL_H $(AM_CPPFLAGS) $(TEST_CPPFLAGS) -src_trunnel_libor_trunnel_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - -noinst_HEADERS+= $(TRUNNELHEADERS) - -EXTRA_DIST += \ - src/trunnel/README - diff --git a/src/tor/src/trunnel/link_handshake.c b/src/tor/src/trunnel/link_handshake.c deleted file mode 100644 index 03ead31c6..000000000 --- a/src/tor/src/trunnel/link_handshake.c +++ /dev/null @@ -1,2061 +0,0 @@ -/* link_handshake.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "link_handshake.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int linkhandshake_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || linkhandshake_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -auth_challenge_cell_t * -auth_challenge_cell_new(void) -{ - auth_challenge_cell_t *val = trunnel_calloc(1, sizeof(auth_challenge_cell_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -auth_challenge_cell_clear(auth_challenge_cell_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->methods); - TRUNNEL_DYNARRAY_CLEAR(&obj->methods); -} - -void -auth_challenge_cell_free(auth_challenge_cell_t *obj) -{ - if (obj == NULL) - return; - auth_challenge_cell_clear(obj); - trunnel_memwipe(obj, sizeof(auth_challenge_cell_t)); - trunnel_free_(obj); -} - -size_t -auth_challenge_cell_getlen_challenge(const auth_challenge_cell_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth_challenge_cell_get_challenge(auth_challenge_cell_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->challenge[idx]; -} - -uint8_t -auth_challenge_cell_getconst_challenge(const auth_challenge_cell_t *inp, size_t idx) -{ - return auth_challenge_cell_get_challenge((auth_challenge_cell_t*)inp, idx); -} -int -auth_challenge_cell_set_challenge(auth_challenge_cell_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->challenge[idx] = elt; - return 0; -} - -uint8_t * -auth_challenge_cell_getarray_challenge(auth_challenge_cell_t *inp) -{ - return inp->challenge; -} -const uint8_t * -auth_challenge_cell_getconstarray_challenge(const auth_challenge_cell_t *inp) -{ - return (const uint8_t *)auth_challenge_cell_getarray_challenge((auth_challenge_cell_t*)inp); -} -uint16_t -auth_challenge_cell_get_n_methods(const auth_challenge_cell_t *inp) -{ - return inp->n_methods; -} -int -auth_challenge_cell_set_n_methods(auth_challenge_cell_t *inp, uint16_t val) -{ - inp->n_methods = val; - return 0; -} -size_t -auth_challenge_cell_getlen_methods(const auth_challenge_cell_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->methods); -} - -uint16_t -auth_challenge_cell_get_methods(auth_challenge_cell_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->methods, idx); -} - -uint16_t -auth_challenge_cell_getconst_methods(const auth_challenge_cell_t *inp, size_t idx) -{ - return auth_challenge_cell_get_methods((auth_challenge_cell_t*)inp, idx); -} -int -auth_challenge_cell_set_methods(auth_challenge_cell_t *inp, size_t idx, uint16_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->methods, idx, elt); - return 0; -} -int -auth_challenge_cell_add_methods(auth_challenge_cell_t *inp, uint16_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->methods.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint16_t, &inp->methods, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint16_t * -auth_challenge_cell_getarray_methods(auth_challenge_cell_t *inp) -{ - return inp->methods.elts_; -} -const uint16_t * -auth_challenge_cell_getconstarray_methods(const auth_challenge_cell_t *inp) -{ - return (const uint16_t *)auth_challenge_cell_getarray_methods((auth_challenge_cell_t*)inp); -} -int -auth_challenge_cell_setlen_methods(auth_challenge_cell_t *inp, size_t newlen) -{ - uint16_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->methods.allocated_, - &inp->methods.n_, inp->methods.elts_, newlen, - sizeof(inp->methods.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->methods.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -auth_challenge_cell_check(const auth_challenge_cell_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (TRUNNEL_DYNARRAY_LEN(&obj->methods) != obj->n_methods) - return "Length mismatch for methods"; - return NULL; -} - -ssize_t -auth_challenge_cell_encoded_len(const auth_challenge_cell_t *obj) -{ - ssize_t result = 0; - - if (NULL != auth_challenge_cell_check(obj)) - return -1; - - - /* Length of u8 challenge[32] */ - result += 32; - - /* Length of u16 n_methods */ - result += 2; - - /* Length of u16 methods[n_methods] */ - result += 2 * TRUNNEL_DYNARRAY_LEN(&obj->methods); - return result; -} -int -auth_challenge_cell_clear_errors(auth_challenge_cell_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -auth_challenge_cell_encode(uint8_t *output, const size_t avail, const auth_challenge_cell_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = auth_challenge_cell_encoded_len(obj); -#endif - - if (NULL != (msg = auth_challenge_cell_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 challenge[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->challenge, 32); - written += 32; ptr += 32; - - /* Encode u16 n_methods */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->n_methods)); - written += 2; ptr += 2; - - /* Encode u16 methods[n_methods] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->methods); ++idx) { - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(TRUNNEL_DYNARRAY_GET(&obj->methods, idx))); - written += 2; ptr += 2; - } - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As auth_challenge_cell_parse(), but do not allocate the output - * object. - */ -static ssize_t -auth_challenge_cell_parse_into(auth_challenge_cell_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 challenge[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->challenge, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u16 n_methods */ - CHECK_REMAINING(2, truncated); - obj->n_methods = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u16 methods[n_methods] */ - TRUNNEL_DYNARRAY_EXPAND(uint16_t, &obj->methods, obj->n_methods, {}); - { - uint16_t elt; - unsigned idx; - for (idx = 0; idx < obj->n_methods; ++idx) { - CHECK_REMAINING(2, truncated); - elt = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - TRUNNEL_DYNARRAY_ADD(uint16_t, &obj->methods, elt, {}); - } - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -auth_challenge_cell_parse(auth_challenge_cell_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = auth_challenge_cell_new(); - if (NULL == *output) - return -1; - result = auth_challenge_cell_parse_into(*output, input, len_in); - if (result < 0) { - auth_challenge_cell_free(*output); - *output = NULL; - } - return result; -} -auth_ctx_t * -auth_ctx_new(void) -{ - auth_ctx_t *val = trunnel_calloc(1, sizeof(auth_ctx_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -auth_ctx_clear(auth_ctx_t *obj) -{ - (void) obj; -} - -void -auth_ctx_free(auth_ctx_t *obj) -{ - if (obj == NULL) - return; - auth_ctx_clear(obj); - trunnel_memwipe(obj, sizeof(auth_ctx_t)); - trunnel_free_(obj); -} - -uint8_t -auth_ctx_get_is_ed(const auth_ctx_t *inp) -{ - return inp->is_ed; -} -int -auth_ctx_set_is_ed(auth_ctx_t *inp, uint8_t val) -{ - inp->is_ed = val; - return 0; -} -certs_cell_cert_t * -certs_cell_cert_new(void) -{ - certs_cell_cert_t *val = trunnel_calloc(1, sizeof(certs_cell_cert_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -certs_cell_cert_clear(certs_cell_cert_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->body); - TRUNNEL_DYNARRAY_CLEAR(&obj->body); -} - -void -certs_cell_cert_free(certs_cell_cert_t *obj) -{ - if (obj == NULL) - return; - certs_cell_cert_clear(obj); - trunnel_memwipe(obj, sizeof(certs_cell_cert_t)); - trunnel_free_(obj); -} - -uint8_t -certs_cell_cert_get_cert_type(const certs_cell_cert_t *inp) -{ - return inp->cert_type; -} -int -certs_cell_cert_set_cert_type(certs_cell_cert_t *inp, uint8_t val) -{ - inp->cert_type = val; - return 0; -} -uint16_t -certs_cell_cert_get_cert_len(const certs_cell_cert_t *inp) -{ - return inp->cert_len; -} -int -certs_cell_cert_set_cert_len(certs_cell_cert_t *inp, uint16_t val) -{ - inp->cert_len = val; - return 0; -} -size_t -certs_cell_cert_getlen_body(const certs_cell_cert_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->body); -} - -uint8_t -certs_cell_cert_get_body(certs_cell_cert_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->body, idx); -} - -uint8_t -certs_cell_cert_getconst_body(const certs_cell_cert_t *inp, size_t idx) -{ - return certs_cell_cert_get_body((certs_cell_cert_t*)inp, idx); -} -int -certs_cell_cert_set_body(certs_cell_cert_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->body, idx, elt); - return 0; -} -int -certs_cell_cert_add_body(certs_cell_cert_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT16_MAX - if (inp->body.n_ == UINT16_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->body, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -certs_cell_cert_getarray_body(certs_cell_cert_t *inp) -{ - return inp->body.elts_; -} -const uint8_t * -certs_cell_cert_getconstarray_body(const certs_cell_cert_t *inp) -{ - return (const uint8_t *)certs_cell_cert_getarray_body((certs_cell_cert_t*)inp); -} -int -certs_cell_cert_setlen_body(certs_cell_cert_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT16_MAX < SIZE_MAX - if (newlen > UINT16_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->body.allocated_, - &inp->body.n_, inp->body.elts_, newlen, - sizeof(inp->body.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->body.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -certs_cell_cert_check(const certs_cell_cert_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (TRUNNEL_DYNARRAY_LEN(&obj->body) != obj->cert_len) - return "Length mismatch for body"; - return NULL; -} - -ssize_t -certs_cell_cert_encoded_len(const certs_cell_cert_t *obj) -{ - ssize_t result = 0; - - if (NULL != certs_cell_cert_check(obj)) - return -1; - - - /* Length of u8 cert_type */ - result += 1; - - /* Length of u16 cert_len */ - result += 2; - - /* Length of u8 body[cert_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->body); - return result; -} -int -certs_cell_cert_clear_errors(certs_cell_cert_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -certs_cell_cert_encode(uint8_t *output, const size_t avail, const certs_cell_cert_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = certs_cell_cert_encoded_len(obj); -#endif - - if (NULL != (msg = certs_cell_cert_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 cert_type */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->cert_type)); - written += 1; ptr += 1; - - /* Encode u16 cert_len */ - trunnel_assert(written <= avail); - if (avail - written < 2) - goto truncated; - trunnel_set_uint16(ptr, trunnel_htons(obj->cert_len)); - written += 2; ptr += 2; - - /* Encode u8 body[cert_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->body); - trunnel_assert(obj->cert_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->body.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As certs_cell_cert_parse(), but do not allocate the output object. - */ -static ssize_t -certs_cell_cert_parse_into(certs_cell_cert_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 cert_type */ - CHECK_REMAINING(1, truncated); - obj->cert_type = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u16 cert_len */ - CHECK_REMAINING(2, truncated); - obj->cert_len = trunnel_ntohs(trunnel_get_uint16(ptr)); - remaining -= 2; ptr += 2; - - /* Parse u8 body[cert_len] */ - CHECK_REMAINING(obj->cert_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->body, obj->cert_len, {}); - obj->body.n_ = obj->cert_len; - if (obj->cert_len) - memcpy(obj->body.elts_, ptr, obj->cert_len); - ptr += obj->cert_len; remaining -= obj->cert_len; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -certs_cell_cert_parse(certs_cell_cert_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = certs_cell_cert_new(); - if (NULL == *output) - return -1; - result = certs_cell_cert_parse_into(*output, input, len_in); - if (result < 0) { - certs_cell_cert_free(*output); - *output = NULL; - } - return result; -} -rsa_ed_crosscert_t * -rsa_ed_crosscert_new(void) -{ - rsa_ed_crosscert_t *val = trunnel_calloc(1, sizeof(rsa_ed_crosscert_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -rsa_ed_crosscert_clear(rsa_ed_crosscert_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->sig); - TRUNNEL_DYNARRAY_CLEAR(&obj->sig); -} - -void -rsa_ed_crosscert_free(rsa_ed_crosscert_t *obj) -{ - if (obj == NULL) - return; - rsa_ed_crosscert_clear(obj); - trunnel_memwipe(obj, sizeof(rsa_ed_crosscert_t)); - trunnel_free_(obj); -} - -size_t -rsa_ed_crosscert_getlen_ed_key(const rsa_ed_crosscert_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -rsa_ed_crosscert_get_ed_key(rsa_ed_crosscert_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->ed_key[idx]; -} - -uint8_t -rsa_ed_crosscert_getconst_ed_key(const rsa_ed_crosscert_t *inp, size_t idx) -{ - return rsa_ed_crosscert_get_ed_key((rsa_ed_crosscert_t*)inp, idx); -} -int -rsa_ed_crosscert_set_ed_key(rsa_ed_crosscert_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->ed_key[idx] = elt; - return 0; -} - -uint8_t * -rsa_ed_crosscert_getarray_ed_key(rsa_ed_crosscert_t *inp) -{ - return inp->ed_key; -} -const uint8_t * -rsa_ed_crosscert_getconstarray_ed_key(const rsa_ed_crosscert_t *inp) -{ - return (const uint8_t *)rsa_ed_crosscert_getarray_ed_key((rsa_ed_crosscert_t*)inp); -} -uint32_t -rsa_ed_crosscert_get_expiration(const rsa_ed_crosscert_t *inp) -{ - return inp->expiration; -} -int -rsa_ed_crosscert_set_expiration(rsa_ed_crosscert_t *inp, uint32_t val) -{ - inp->expiration = val; - return 0; -} -const uint8_t * -rsa_ed_crosscert_get_end_of_signed(const rsa_ed_crosscert_t *inp) -{ - return inp->end_of_signed; -} -uint8_t -rsa_ed_crosscert_get_sig_len(const rsa_ed_crosscert_t *inp) -{ - return inp->sig_len; -} -int -rsa_ed_crosscert_set_sig_len(rsa_ed_crosscert_t *inp, uint8_t val) -{ - inp->sig_len = val; - return 0; -} -size_t -rsa_ed_crosscert_getlen_sig(const rsa_ed_crosscert_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->sig); -} - -uint8_t -rsa_ed_crosscert_get_sig(rsa_ed_crosscert_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->sig, idx); -} - -uint8_t -rsa_ed_crosscert_getconst_sig(const rsa_ed_crosscert_t *inp, size_t idx) -{ - return rsa_ed_crosscert_get_sig((rsa_ed_crosscert_t*)inp, idx); -} -int -rsa_ed_crosscert_set_sig(rsa_ed_crosscert_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt); - return 0; -} -int -rsa_ed_crosscert_add_sig(rsa_ed_crosscert_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->sig.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->sig, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -rsa_ed_crosscert_getarray_sig(rsa_ed_crosscert_t *inp) -{ - return inp->sig.elts_; -} -const uint8_t * -rsa_ed_crosscert_getconstarray_sig(const rsa_ed_crosscert_t *inp) -{ - return (const uint8_t *)rsa_ed_crosscert_getarray_sig((rsa_ed_crosscert_t*)inp); -} -int -rsa_ed_crosscert_setlen_sig(rsa_ed_crosscert_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->sig.allocated_, - &inp->sig.n_, inp->sig.elts_, newlen, - sizeof(inp->sig.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->sig.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -rsa_ed_crosscert_check(const rsa_ed_crosscert_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (TRUNNEL_DYNARRAY_LEN(&obj->sig) != obj->sig_len) - return "Length mismatch for sig"; - return NULL; -} - -ssize_t -rsa_ed_crosscert_encoded_len(const rsa_ed_crosscert_t *obj) -{ - ssize_t result = 0; - - if (NULL != rsa_ed_crosscert_check(obj)) - return -1; - - - /* Length of u8 ed_key[32] */ - result += 32; - - /* Length of u32 expiration */ - result += 4; - - /* Length of u8 sig_len */ - result += 1; - - /* Length of u8 sig[sig_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->sig); - return result; -} -int -rsa_ed_crosscert_clear_errors(rsa_ed_crosscert_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -rsa_ed_crosscert_encode(uint8_t *output, const size_t avail, const rsa_ed_crosscert_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = rsa_ed_crosscert_encoded_len(obj); -#endif - - if (NULL != (msg = rsa_ed_crosscert_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 ed_key[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->ed_key, 32); - written += 32; ptr += 32; - - /* Encode u32 expiration */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->expiration)); - written += 4; ptr += 4; - - /* Encode u8 sig_len */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->sig_len)); - written += 1; ptr += 1; - - /* Encode u8 sig[sig_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->sig); - trunnel_assert(obj->sig_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->sig.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As rsa_ed_crosscert_parse(), but do not allocate the output - * object. - */ -static ssize_t -rsa_ed_crosscert_parse_into(rsa_ed_crosscert_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 ed_key[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->ed_key, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u32 expiration */ - CHECK_REMAINING(4, truncated); - obj->expiration = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - obj->end_of_signed = ptr; - - /* Parse u8 sig_len */ - CHECK_REMAINING(1, truncated); - obj->sig_len = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 sig[sig_len] */ - CHECK_REMAINING(obj->sig_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->sig, obj->sig_len, {}); - obj->sig.n_ = obj->sig_len; - if (obj->sig_len) - memcpy(obj->sig.elts_, ptr, obj->sig_len); - ptr += obj->sig_len; remaining -= obj->sig_len; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; -} - -ssize_t -rsa_ed_crosscert_parse(rsa_ed_crosscert_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = rsa_ed_crosscert_new(); - if (NULL == *output) - return -1; - result = rsa_ed_crosscert_parse_into(*output, input, len_in); - if (result < 0) { - rsa_ed_crosscert_free(*output); - *output = NULL; - } - return result; -} -auth1_t * -auth1_new(void) -{ - auth1_t *val = trunnel_calloc(1, sizeof(auth1_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -auth1_clear(auth1_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->sig); - TRUNNEL_DYNARRAY_CLEAR(&obj->sig); -} - -void -auth1_free(auth1_t *obj) -{ - if (obj == NULL) - return; - auth1_clear(obj); - trunnel_memwipe(obj, sizeof(auth1_t)); - trunnel_free_(obj); -} - -size_t -auth1_getlen_type(const auth1_t *inp) -{ - (void)inp; return 8; -} - -uint8_t -auth1_get_type(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 8); - return inp->type[idx]; -} - -uint8_t -auth1_getconst_type(const auth1_t *inp, size_t idx) -{ - return auth1_get_type((auth1_t*)inp, idx); -} -int -auth1_set_type(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 8); - inp->type[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_type(auth1_t *inp) -{ - return inp->type; -} -const uint8_t * -auth1_getconstarray_type(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_type((auth1_t*)inp); -} -size_t -auth1_getlen_cid(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_cid(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->cid[idx]; -} - -uint8_t -auth1_getconst_cid(const auth1_t *inp, size_t idx) -{ - return auth1_get_cid((auth1_t*)inp, idx); -} -int -auth1_set_cid(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->cid[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_cid(auth1_t *inp) -{ - return inp->cid; -} -const uint8_t * -auth1_getconstarray_cid(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_cid((auth1_t*)inp); -} -size_t -auth1_getlen_sid(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_sid(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->sid[idx]; -} - -uint8_t -auth1_getconst_sid(const auth1_t *inp, size_t idx) -{ - return auth1_get_sid((auth1_t*)inp, idx); -} -int -auth1_set_sid(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->sid[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_sid(auth1_t *inp) -{ - return inp->sid; -} -const uint8_t * -auth1_getconstarray_sid(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_sid((auth1_t*)inp); -} -size_t -auth1_getlen_u1_cid_ed(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_u1_cid_ed(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->u1_cid_ed[idx]; -} - -uint8_t -auth1_getconst_u1_cid_ed(const auth1_t *inp, size_t idx) -{ - return auth1_get_u1_cid_ed((auth1_t*)inp, idx); -} -int -auth1_set_u1_cid_ed(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->u1_cid_ed[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_u1_cid_ed(auth1_t *inp) -{ - return inp->u1_cid_ed; -} -const uint8_t * -auth1_getconstarray_u1_cid_ed(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_u1_cid_ed((auth1_t*)inp); -} -size_t -auth1_getlen_u1_sid_ed(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_u1_sid_ed(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->u1_sid_ed[idx]; -} - -uint8_t -auth1_getconst_u1_sid_ed(const auth1_t *inp, size_t idx) -{ - return auth1_get_u1_sid_ed((auth1_t*)inp, idx); -} -int -auth1_set_u1_sid_ed(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->u1_sid_ed[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_u1_sid_ed(auth1_t *inp) -{ - return inp->u1_sid_ed; -} -const uint8_t * -auth1_getconstarray_u1_sid_ed(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_u1_sid_ed((auth1_t*)inp); -} -size_t -auth1_getlen_slog(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_slog(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->slog[idx]; -} - -uint8_t -auth1_getconst_slog(const auth1_t *inp, size_t idx) -{ - return auth1_get_slog((auth1_t*)inp, idx); -} -int -auth1_set_slog(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->slog[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_slog(auth1_t *inp) -{ - return inp->slog; -} -const uint8_t * -auth1_getconstarray_slog(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_slog((auth1_t*)inp); -} -size_t -auth1_getlen_clog(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_clog(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->clog[idx]; -} - -uint8_t -auth1_getconst_clog(const auth1_t *inp, size_t idx) -{ - return auth1_get_clog((auth1_t*)inp, idx); -} -int -auth1_set_clog(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->clog[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_clog(auth1_t *inp) -{ - return inp->clog; -} -const uint8_t * -auth1_getconstarray_clog(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_clog((auth1_t*)inp); -} -size_t -auth1_getlen_scert(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_scert(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->scert[idx]; -} - -uint8_t -auth1_getconst_scert(const auth1_t *inp, size_t idx) -{ - return auth1_get_scert((auth1_t*)inp, idx); -} -int -auth1_set_scert(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->scert[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_scert(auth1_t *inp) -{ - return inp->scert; -} -const uint8_t * -auth1_getconstarray_scert(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_scert((auth1_t*)inp); -} -size_t -auth1_getlen_tlssecrets(const auth1_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -auth1_get_tlssecrets(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->tlssecrets[idx]; -} - -uint8_t -auth1_getconst_tlssecrets(const auth1_t *inp, size_t idx) -{ - return auth1_get_tlssecrets((auth1_t*)inp, idx); -} -int -auth1_set_tlssecrets(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->tlssecrets[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_tlssecrets(auth1_t *inp) -{ - return inp->tlssecrets; -} -const uint8_t * -auth1_getconstarray_tlssecrets(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_tlssecrets((auth1_t*)inp); -} -const uint8_t * -auth1_get_end_of_fixed_part(const auth1_t *inp) -{ - return inp->end_of_fixed_part; -} -size_t -auth1_getlen_rand(const auth1_t *inp) -{ - (void)inp; return 24; -} - -uint8_t -auth1_get_rand(auth1_t *inp, size_t idx) -{ - trunnel_assert(idx < 24); - return inp->rand[idx]; -} - -uint8_t -auth1_getconst_rand(const auth1_t *inp, size_t idx) -{ - return auth1_get_rand((auth1_t*)inp, idx); -} -int -auth1_set_rand(auth1_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 24); - inp->rand[idx] = elt; - return 0; -} - -uint8_t * -auth1_getarray_rand(auth1_t *inp) -{ - return inp->rand; -} -const uint8_t * -auth1_getconstarray_rand(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_rand((auth1_t*)inp); -} -const uint8_t * -auth1_get_end_of_signed(const auth1_t *inp) -{ - return inp->end_of_signed; -} -size_t -auth1_getlen_sig(const auth1_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->sig); -} - -uint8_t -auth1_get_sig(auth1_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->sig, idx); -} - -uint8_t -auth1_getconst_sig(const auth1_t *inp, size_t idx) -{ - return auth1_get_sig((auth1_t*)inp, idx); -} -int -auth1_set_sig(auth1_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt); - return 0; -} -int -auth1_add_sig(auth1_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->sig, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -auth1_getarray_sig(auth1_t *inp) -{ - return inp->sig.elts_; -} -const uint8_t * -auth1_getconstarray_sig(const auth1_t *inp) -{ - return (const uint8_t *)auth1_getarray_sig((auth1_t*)inp); -} -int -auth1_setlen_sig(auth1_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->sig.allocated_, - &inp->sig.n_, inp->sig.elts_, newlen, - sizeof(inp->sig.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->sig.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -auth1_check(const auth1_t *obj, const auth_ctx_t *auth_ctx_ctx) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (auth_ctx_ctx == NULL) - return "Context was NULL"; - switch (auth_ctx_ctx->is_ed) { - - case 0: - break; - - case 1: - break; - - default: - return "Bad tag for union"; - break; - } - return NULL; -} - -ssize_t -auth1_encoded_len(const auth1_t *obj, const auth_ctx_t *auth_ctx_ctx) -{ - ssize_t result = 0; - - if (NULL != auth1_check(obj, auth_ctx_ctx)) - return -1; - - - /* Length of u8 type[8] */ - result += 8; - - /* Length of u8 cid[32] */ - result += 32; - - /* Length of u8 sid[32] */ - result += 32; - switch (auth_ctx_ctx->is_ed) { - - case 0: - break; - - case 1: - - /* Length of u8 u1_cid_ed[32] */ - result += 32; - - /* Length of u8 u1_sid_ed[32] */ - result += 32; - break; - - default: - trunnel_assert(0); - break; - } - - /* Length of u8 slog[32] */ - result += 32; - - /* Length of u8 clog[32] */ - result += 32; - - /* Length of u8 scert[32] */ - result += 32; - - /* Length of u8 tlssecrets[32] */ - result += 32; - - /* Length of u8 rand[24] */ - result += 24; - - /* Length of u8 sig[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->sig); - return result; -} -int -auth1_clear_errors(auth1_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -auth1_encode(uint8_t *output, const size_t avail, const auth1_t *obj, const auth_ctx_t *auth_ctx_ctx) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = auth1_encoded_len(obj, auth_ctx_ctx); -#endif - - if (NULL != (msg = auth1_check(obj, auth_ctx_ctx))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 type[8] */ - trunnel_assert(written <= avail); - if (avail - written < 8) - goto truncated; - memcpy(ptr, obj->type, 8); - written += 8; ptr += 8; - - /* Encode u8 cid[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->cid, 32); - written += 32; ptr += 32; - - /* Encode u8 sid[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->sid, 32); - written += 32; ptr += 32; - - /* Encode union u1[auth_ctx.is_ed] */ - trunnel_assert(written <= avail); - switch (auth_ctx_ctx->is_ed) { - - case 0: - break; - - case 1: - - /* Encode u8 u1_cid_ed[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->u1_cid_ed, 32); - written += 32; ptr += 32; - - /* Encode u8 u1_sid_ed[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->u1_sid_ed, 32); - written += 32; ptr += 32; - break; - - default: - trunnel_assert(0); - break; - } - - /* Encode u8 slog[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->slog, 32); - written += 32; ptr += 32; - - /* Encode u8 clog[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->clog, 32); - written += 32; ptr += 32; - - /* Encode u8 scert[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->scert, 32); - written += 32; ptr += 32; - - /* Encode u8 tlssecrets[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - memcpy(ptr, obj->tlssecrets, 32); - written += 32; ptr += 32; - - /* Encode u8 rand[24] */ - trunnel_assert(written <= avail); - if (avail - written < 24) - goto truncated; - memcpy(ptr, obj->rand, 24); - written += 24; ptr += 24; - - /* Encode u8 sig[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->sig); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->sig.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As auth1_parse(), but do not allocate the output object. - */ -static ssize_t -auth1_parse_into(auth1_t *obj, const uint8_t *input, const size_t len_in, const auth_ctx_t *auth_ctx_ctx) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - if (auth_ctx_ctx == NULL) - return -1; - - /* Parse u8 type[8] */ - CHECK_REMAINING(8, truncated); - memcpy(obj->type, ptr, 8); - remaining -= 8; ptr += 8; - - /* Parse u8 cid[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->cid, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 sid[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->sid, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse union u1[auth_ctx.is_ed] */ - switch (auth_ctx_ctx->is_ed) { - - case 0: - break; - - case 1: - - /* Parse u8 u1_cid_ed[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->u1_cid_ed, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 u1_sid_ed[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->u1_sid_ed, ptr, 32); - remaining -= 32; ptr += 32; - break; - - default: - goto fail; - break; - } - - /* Parse u8 slog[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->slog, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 clog[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->clog, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 scert[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->scert, ptr, 32); - remaining -= 32; ptr += 32; - - /* Parse u8 tlssecrets[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->tlssecrets, ptr, 32); - remaining -= 32; ptr += 32; - obj->end_of_fixed_part = ptr; - - /* Parse u8 rand[24] */ - CHECK_REMAINING(24, truncated); - memcpy(obj->rand, ptr, 24); - remaining -= 24; ptr += 24; - obj->end_of_signed = ptr; - - /* Parse u8 sig[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->sig, remaining, {}); - obj->sig.n_ = remaining; - if (remaining) - memcpy(obj->sig.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -auth1_parse(auth1_t **output, const uint8_t *input, const size_t len_in, const auth_ctx_t *auth_ctx_ctx) -{ - ssize_t result; - *output = auth1_new(); - if (NULL == *output) - return -1; - result = auth1_parse_into(*output, input, len_in, auth_ctx_ctx); - if (result < 0) { - auth1_free(*output); - *output = NULL; - } - return result; -} -certs_cell_t * -certs_cell_new(void) -{ - certs_cell_t *val = trunnel_calloc(1, sizeof(certs_cell_t)); - if (NULL == val) - return NULL; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -certs_cell_clear(certs_cell_t *obj) -{ - (void) obj; - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->certs); ++idx) { - certs_cell_cert_free(TRUNNEL_DYNARRAY_GET(&obj->certs, idx)); - } - } - TRUNNEL_DYNARRAY_WIPE(&obj->certs); - TRUNNEL_DYNARRAY_CLEAR(&obj->certs); -} - -void -certs_cell_free(certs_cell_t *obj) -{ - if (obj == NULL) - return; - certs_cell_clear(obj); - trunnel_memwipe(obj, sizeof(certs_cell_t)); - trunnel_free_(obj); -} - -uint8_t -certs_cell_get_n_certs(const certs_cell_t *inp) -{ - return inp->n_certs; -} -int -certs_cell_set_n_certs(certs_cell_t *inp, uint8_t val) -{ - inp->n_certs = val; - return 0; -} -size_t -certs_cell_getlen_certs(const certs_cell_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->certs); -} - -struct certs_cell_cert_st * -certs_cell_get_certs(certs_cell_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->certs, idx); -} - - const struct certs_cell_cert_st * -certs_cell_getconst_certs(const certs_cell_t *inp, size_t idx) -{ - return certs_cell_get_certs((certs_cell_t*)inp, idx); -} -int -certs_cell_set_certs(certs_cell_t *inp, size_t idx, struct certs_cell_cert_st * elt) -{ - certs_cell_cert_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->certs, idx); - if (oldval && oldval != elt) - certs_cell_cert_free(oldval); - return certs_cell_set0_certs(inp, idx, elt); -} -int -certs_cell_set0_certs(certs_cell_t *inp, size_t idx, struct certs_cell_cert_st * elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->certs, idx, elt); - return 0; -} -int -certs_cell_add_certs(certs_cell_t *inp, struct certs_cell_cert_st * elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->certs.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(struct certs_cell_cert_st *, &inp->certs, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -struct certs_cell_cert_st * * -certs_cell_getarray_certs(certs_cell_t *inp) -{ - return inp->certs.elts_; -} -const struct certs_cell_cert_st * const * -certs_cell_getconstarray_certs(const certs_cell_t *inp) -{ - return (const struct certs_cell_cert_st * const *)certs_cell_getarray_certs((certs_cell_t*)inp); -} -int -certs_cell_setlen_certs(certs_cell_t *inp, size_t newlen) -{ - struct certs_cell_cert_st * *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->certs.allocated_, - &inp->certs.n_, inp->certs.elts_, newlen, - sizeof(inp->certs.elts_[0]), (trunnel_free_fn_t) certs_cell_cert_free, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->certs.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -const char * -certs_cell_check(const certs_cell_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - { - const char *msg; - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->certs); ++idx) { - if (NULL != (msg = certs_cell_cert_check(TRUNNEL_DYNARRAY_GET(&obj->certs, idx)))) - return msg; - } - } - if (TRUNNEL_DYNARRAY_LEN(&obj->certs) != obj->n_certs) - return "Length mismatch for certs"; - return NULL; -} - -ssize_t -certs_cell_encoded_len(const certs_cell_t *obj) -{ - ssize_t result = 0; - - if (NULL != certs_cell_check(obj)) - return -1; - - - /* Length of u8 n_certs */ - result += 1; - - /* Length of struct certs_cell_cert certs[n_certs] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->certs); ++idx) { - result += certs_cell_cert_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->certs, idx)); - } - } - return result; -} -int -certs_cell_clear_errors(certs_cell_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -certs_cell_encode(uint8_t *output, const size_t avail, const certs_cell_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = certs_cell_encoded_len(obj); -#endif - - if (NULL != (msg = certs_cell_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u8 n_certs */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->n_certs)); - written += 1; ptr += 1; - - /* Encode struct certs_cell_cert certs[n_certs] */ - { - - unsigned idx; - for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->certs); ++idx) { - trunnel_assert(written <= avail); - result = certs_cell_cert_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->certs, idx)); - if (result < 0) - goto fail; /* XXXXXXX !*/ - written += result; ptr += result; - } - } - - - trunnel_assert(ptr == output + written); -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As certs_cell_parse(), but do not allocate the output object. - */ -static ssize_t -certs_cell_parse_into(certs_cell_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u8 n_certs */ - CHECK_REMAINING(1, truncated); - obj->n_certs = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse struct certs_cell_cert certs[n_certs] */ - TRUNNEL_DYNARRAY_EXPAND(certs_cell_cert_t *, &obj->certs, obj->n_certs, {}); - { - certs_cell_cert_t * elt; - unsigned idx; - for (idx = 0; idx < obj->n_certs; ++idx) { - result = certs_cell_cert_parse(&elt, ptr, remaining); - if (result < 0) - goto relay_fail; - trunnel_assert((size_t)result <= remaining); - remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(certs_cell_cert_t *, &obj->certs, elt, {certs_cell_cert_free(elt);}); - } - } - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - relay_fail: - trunnel_assert(result < 0); - return result; - trunnel_alloc_failed: - return -1; -} - -ssize_t -certs_cell_parse(certs_cell_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = certs_cell_new(); - if (NULL == *output) - return -1; - result = certs_cell_parse_into(*output, input, len_in); - if (result < 0) { - certs_cell_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/link_handshake.h b/src/tor/src/trunnel/link_handshake.h deleted file mode 100644 index 6a23483ad..000000000 --- a/src/tor/src/trunnel/link_handshake.h +++ /dev/null @@ -1,762 +0,0 @@ -/* link_handshake.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_LINK_HANDSHAKE_H -#define TRUNNEL_LINK_HANDSHAKE_H - -#include -#include "trunnel.h" - -#define CERTTYPE_RSA1024_ID_LINK 1 -#define CERTTYPE_RSA1024_ID_ID 2 -#define CERTTYPE_RSA1024_ID_AUTH 3 -#define CERTTYPE_ED_ID_SIGN 4 -#define CERTTYPE_ED_SIGN_LINK 5 -#define CERTTYPE_ED_SIGN_AUTH 6 -#define CERTTYPE_RSA1024_ID_EDID 7 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_AUTH_CHALLENGE_CELL) -struct auth_challenge_cell_st { - uint8_t challenge[32]; - uint16_t n_methods; - TRUNNEL_DYNARRAY_HEAD(, uint16_t) methods; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct auth_challenge_cell_st auth_challenge_cell_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_AUTH_CTX) -struct auth_ctx_st { - uint8_t is_ed; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct auth_ctx_st auth_ctx_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CERTS_CELL_CERT) -struct certs_cell_cert_st { - uint8_t cert_type; - uint16_t cert_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) body; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct certs_cell_cert_st certs_cell_cert_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_RSA_ED_CROSSCERT) -struct rsa_ed_crosscert_st { - uint8_t ed_key[32]; - uint32_t expiration; - const uint8_t *end_of_signed; - uint8_t sig_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) sig; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct rsa_ed_crosscert_st rsa_ed_crosscert_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_AUTH1) -struct auth1_st { - uint8_t type[8]; - uint8_t cid[32]; - uint8_t sid[32]; - uint8_t u1_cid_ed[32]; - uint8_t u1_sid_ed[32]; - uint8_t slog[32]; - uint8_t clog[32]; - uint8_t scert[32]; - uint8_t tlssecrets[32]; - const uint8_t *end_of_fixed_part; - uint8_t rand[24]; - const uint8_t *end_of_signed; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) sig; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct auth1_st auth1_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CERTS_CELL) -struct certs_cell_st { - uint8_t n_certs; - TRUNNEL_DYNARRAY_HEAD(, struct certs_cell_cert_st *) certs; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct certs_cell_st certs_cell_t; -/** Return a newly allocated auth_challenge_cell with all elements set - * to zero. - */ -auth_challenge_cell_t *auth_challenge_cell_new(void); -/** Release all storage held by the auth_challenge_cell in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void auth_challenge_cell_free(auth_challenge_cell_t *victim); -/** Try to parse a auth_challenge_cell from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated auth_challenge_cell_t. On failure, return -2 if the input - * appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t auth_challenge_cell_parse(auth_challenge_cell_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * auth_challenge_cell in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t auth_challenge_cell_encoded_len(const auth_challenge_cell_t *obj); -/** Try to encode the auth_challenge_cell from 'input' into the buffer - * at 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t auth_challenge_cell_encode(uint8_t *output, size_t avail, const auth_challenge_cell_t *input); -/** Check whether the internal state of the auth_challenge_cell in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. - */ -const char *auth_challenge_cell_check(const auth_challenge_cell_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int auth_challenge_cell_clear_errors(auth_challenge_cell_t *obj); -/** Return the (constant) length of the array holding the challenge - * field of the auth_challenge_cell_t in 'inp'. - */ -size_t auth_challenge_cell_getlen_challenge(const auth_challenge_cell_t *inp); -/** Return the element at position 'idx' of the fixed array field - * challenge of the auth_challenge_cell_t in 'inp'. - */ -uint8_t auth_challenge_cell_get_challenge(auth_challenge_cell_t *inp, size_t idx); -/** As auth_challenge_cell_get_challenge, but take and return a const - * pointer - */ -uint8_t auth_challenge_cell_getconst_challenge(const auth_challenge_cell_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * challenge of the auth_challenge_cell_t in 'inp', so that it will - * hold the value 'elt'. - */ -int auth_challenge_cell_set_challenge(auth_challenge_cell_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field challenge of 'inp'. - */ -uint8_t * auth_challenge_cell_getarray_challenge(auth_challenge_cell_t *inp); -/** As auth_challenge_cell_get_challenge, but take and return a const - * pointer - */ -const uint8_t * auth_challenge_cell_getconstarray_challenge(const auth_challenge_cell_t *inp); -/** Return the value of the n_methods field of the - * auth_challenge_cell_t in 'inp' - */ -uint16_t auth_challenge_cell_get_n_methods(const auth_challenge_cell_t *inp); -/** Set the value of the n_methods field of the auth_challenge_cell_t - * in 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int auth_challenge_cell_set_n_methods(auth_challenge_cell_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the methods field - * of the auth_challenge_cell_t in 'inp'. - */ -size_t auth_challenge_cell_getlen_methods(const auth_challenge_cell_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * methods of the auth_challenge_cell_t in 'inp'. - */ -uint16_t auth_challenge_cell_get_methods(auth_challenge_cell_t *inp, size_t idx); -/** As auth_challenge_cell_get_methods, but take and return a const - * pointer - */ -uint16_t auth_challenge_cell_getconst_methods(const auth_challenge_cell_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * methods of the auth_challenge_cell_t in 'inp', so that it will hold - * the value 'elt'. - */ -int auth_challenge_cell_set_methods(auth_challenge_cell_t *inp, size_t idx, uint16_t elt); -/** Append a new element 'elt' to the dynamic array field methods of - * the auth_challenge_cell_t in 'inp'. - */ -int auth_challenge_cell_add_methods(auth_challenge_cell_t *inp, uint16_t elt); -/** Return a pointer to the variable-length array field methods of - * 'inp'. - */ -uint16_t * auth_challenge_cell_getarray_methods(auth_challenge_cell_t *inp); -/** As auth_challenge_cell_get_methods, but take and return a const - * pointer - */ -const uint16_t * auth_challenge_cell_getconstarray_methods(const auth_challenge_cell_t *inp); -/** Change the length of the variable-length array field methods of - * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; - * return -1 and set the error code on 'inp' on failure. - */ -int auth_challenge_cell_setlen_methods(auth_challenge_cell_t *inp, size_t newlen); -/** Return a newly allocated auth_ctx with all elements set to zero. - */ -auth_ctx_t *auth_ctx_new(void); -/** Release all storage held by the auth_ctx in 'victim'. (Do nothing - * if 'victim' is NULL.) - */ -void auth_ctx_free(auth_ctx_t *victim); -/** Return the value of the is_ed field of the auth_ctx_t in 'inp' - */ -uint8_t auth_ctx_get_is_ed(const auth_ctx_t *inp); -/** Set the value of the is_ed field of the auth_ctx_t in 'inp' to - * 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int auth_ctx_set_is_ed(auth_ctx_t *inp, uint8_t val); -/** Return a newly allocated certs_cell_cert with all elements set to - * zero. - */ -certs_cell_cert_t *certs_cell_cert_new(void); -/** Release all storage held by the certs_cell_cert in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void certs_cell_cert_free(certs_cell_cert_t *victim); -/** Try to parse a certs_cell_cert from the buffer in 'input', using - * up to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * certs_cell_cert_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t certs_cell_cert_parse(certs_cell_cert_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * certs_cell_cert in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t certs_cell_cert_encoded_len(const certs_cell_cert_t *obj); -/** Try to encode the certs_cell_cert from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t certs_cell_cert_encode(uint8_t *output, size_t avail, const certs_cell_cert_t *input); -/** Check whether the internal state of the certs_cell_cert in 'obj' - * is consistent. Return NULL if it is, and a short message if it is - * not. - */ -const char *certs_cell_cert_check(const certs_cell_cert_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int certs_cell_cert_clear_errors(certs_cell_cert_t *obj); -/** Return the value of the cert_type field of the certs_cell_cert_t - * in 'inp' - */ -uint8_t certs_cell_cert_get_cert_type(const certs_cell_cert_t *inp); -/** Set the value of the cert_type field of the certs_cell_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int certs_cell_cert_set_cert_type(certs_cell_cert_t *inp, uint8_t val); -/** Return the value of the cert_len field of the certs_cell_cert_t in - * 'inp' - */ -uint16_t certs_cell_cert_get_cert_len(const certs_cell_cert_t *inp); -/** Set the value of the cert_len field of the certs_cell_cert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int certs_cell_cert_set_cert_len(certs_cell_cert_t *inp, uint16_t val); -/** Return the length of the dynamic array holding the body field of - * the certs_cell_cert_t in 'inp'. - */ -size_t certs_cell_cert_getlen_body(const certs_cell_cert_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * body of the certs_cell_cert_t in 'inp'. - */ -uint8_t certs_cell_cert_get_body(certs_cell_cert_t *inp, size_t idx); -/** As certs_cell_cert_get_body, but take and return a const pointer - */ -uint8_t certs_cell_cert_getconst_body(const certs_cell_cert_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * body of the certs_cell_cert_t in 'inp', so that it will hold the - * value 'elt'. - */ -int certs_cell_cert_set_body(certs_cell_cert_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field body of the - * certs_cell_cert_t in 'inp'. - */ -int certs_cell_cert_add_body(certs_cell_cert_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field body of 'inp'. - */ -uint8_t * certs_cell_cert_getarray_body(certs_cell_cert_t *inp); -/** As certs_cell_cert_get_body, but take and return a const pointer - */ -const uint8_t * certs_cell_cert_getconstarray_body(const certs_cell_cert_t *inp); -/** Change the length of the variable-length array field body of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int certs_cell_cert_setlen_body(certs_cell_cert_t *inp, size_t newlen); -/** Return a newly allocated rsa_ed_crosscert with all elements set to - * zero. - */ -rsa_ed_crosscert_t *rsa_ed_crosscert_new(void); -/** Release all storage held by the rsa_ed_crosscert in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void rsa_ed_crosscert_free(rsa_ed_crosscert_t *victim); -/** Try to parse a rsa_ed_crosscert from the buffer in 'input', using - * up to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * rsa_ed_crosscert_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t rsa_ed_crosscert_parse(rsa_ed_crosscert_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * rsa_ed_crosscert in 'obj'. On failure, return a negative value. - * Note that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t rsa_ed_crosscert_encoded_len(const rsa_ed_crosscert_t *obj); -/** Try to encode the rsa_ed_crosscert from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t rsa_ed_crosscert_encode(uint8_t *output, size_t avail, const rsa_ed_crosscert_t *input); -/** Check whether the internal state of the rsa_ed_crosscert in 'obj' - * is consistent. Return NULL if it is, and a short message if it is - * not. - */ -const char *rsa_ed_crosscert_check(const rsa_ed_crosscert_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int rsa_ed_crosscert_clear_errors(rsa_ed_crosscert_t *obj); -/** Return the (constant) length of the array holding the ed_key field - * of the rsa_ed_crosscert_t in 'inp'. - */ -size_t rsa_ed_crosscert_getlen_ed_key(const rsa_ed_crosscert_t *inp); -/** Return the element at position 'idx' of the fixed array field - * ed_key of the rsa_ed_crosscert_t in 'inp'. - */ -uint8_t rsa_ed_crosscert_get_ed_key(rsa_ed_crosscert_t *inp, size_t idx); -/** As rsa_ed_crosscert_get_ed_key, but take and return a const - * pointer - */ -uint8_t rsa_ed_crosscert_getconst_ed_key(const rsa_ed_crosscert_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * ed_key of the rsa_ed_crosscert_t in 'inp', so that it will hold the - * value 'elt'. - */ -int rsa_ed_crosscert_set_ed_key(rsa_ed_crosscert_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field ed_key of 'inp'. - */ -uint8_t * rsa_ed_crosscert_getarray_ed_key(rsa_ed_crosscert_t *inp); -/** As rsa_ed_crosscert_get_ed_key, but take and return a const - * pointer - */ -const uint8_t * rsa_ed_crosscert_getconstarray_ed_key(const rsa_ed_crosscert_t *inp); -/** Return the value of the expiration field of the rsa_ed_crosscert_t - * in 'inp' - */ -uint32_t rsa_ed_crosscert_get_expiration(const rsa_ed_crosscert_t *inp); -/** Set the value of the expiration field of the rsa_ed_crosscert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int rsa_ed_crosscert_set_expiration(rsa_ed_crosscert_t *inp, uint32_t val); -/** Return the position for end_of_signed when we parsed this object - */ -const uint8_t * rsa_ed_crosscert_get_end_of_signed(const rsa_ed_crosscert_t *inp); -/** Return the value of the sig_len field of the rsa_ed_crosscert_t in - * 'inp' - */ -uint8_t rsa_ed_crosscert_get_sig_len(const rsa_ed_crosscert_t *inp); -/** Set the value of the sig_len field of the rsa_ed_crosscert_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int rsa_ed_crosscert_set_sig_len(rsa_ed_crosscert_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the sig field of - * the rsa_ed_crosscert_t in 'inp'. - */ -size_t rsa_ed_crosscert_getlen_sig(const rsa_ed_crosscert_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * sig of the rsa_ed_crosscert_t in 'inp'. - */ -uint8_t rsa_ed_crosscert_get_sig(rsa_ed_crosscert_t *inp, size_t idx); -/** As rsa_ed_crosscert_get_sig, but take and return a const pointer - */ -uint8_t rsa_ed_crosscert_getconst_sig(const rsa_ed_crosscert_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * sig of the rsa_ed_crosscert_t in 'inp', so that it will hold the - * value 'elt'. - */ -int rsa_ed_crosscert_set_sig(rsa_ed_crosscert_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field sig of the - * rsa_ed_crosscert_t in 'inp'. - */ -int rsa_ed_crosscert_add_sig(rsa_ed_crosscert_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field sig of 'inp'. - */ -uint8_t * rsa_ed_crosscert_getarray_sig(rsa_ed_crosscert_t *inp); -/** As rsa_ed_crosscert_get_sig, but take and return a const pointer - */ -const uint8_t * rsa_ed_crosscert_getconstarray_sig(const rsa_ed_crosscert_t *inp); -/** Change the length of the variable-length array field sig of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int rsa_ed_crosscert_setlen_sig(rsa_ed_crosscert_t *inp, size_t newlen); -/** Return a newly allocated auth1 with all elements set to zero. - */ -auth1_t *auth1_new(void); -/** Release all storage held by the auth1 in 'victim'. (Do nothing if - * 'victim' is NULL.) - */ -void auth1_free(auth1_t *victim); -/** Try to parse a auth1 from the buffer in 'input', using up to - * 'len_in' bytes from the input buffer. On success, return the number - * of bytes consumed and set *output to the newly allocated auth1_t. - * On failure, return -2 if the input appears truncated, and -1 if the - * input is otherwise invalid. - */ -ssize_t auth1_parse(auth1_t **output, const uint8_t *input, const size_t len_in, const auth_ctx_t *auth_ctx_ctx); -/** Return the number of bytes we expect to need to encode the auth1 - * in 'obj'. On failure, return a negative value. Note that this value - * may be an overestimate, and can even be an underestimate for - * certain unencodeable objects. - */ -ssize_t auth1_encoded_len(const auth1_t *obj, const auth_ctx_t *auth_ctx_ctx); -/** Try to encode the auth1 from 'input' into the buffer at 'output', - * using up to 'avail' bytes of the output buffer. On success, return - * the number of bytes used. On failure, return -2 if the buffer was - * not long enough, and -1 if the input was invalid. - */ -ssize_t auth1_encode(uint8_t *output, size_t avail, const auth1_t *input, const auth_ctx_t *auth_ctx_ctx); -/** Check whether the internal state of the auth1 in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. - */ -const char *auth1_check(const auth1_t *obj, const auth_ctx_t *auth_ctx_ctx); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int auth1_clear_errors(auth1_t *obj); -/** Return the (constant) length of the array holding the type field - * of the auth1_t in 'inp'. - */ -size_t auth1_getlen_type(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field type - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_type(auth1_t *inp, size_t idx); -/** As auth1_get_type, but take and return a const pointer - */ -uint8_t auth1_getconst_type(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field type - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_type(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 8-element array field type of 'inp'. - */ -uint8_t * auth1_getarray_type(auth1_t *inp); -/** As auth1_get_type, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_type(const auth1_t *inp); -/** Return the (constant) length of the array holding the cid field of - * the auth1_t in 'inp'. - */ -size_t auth1_getlen_cid(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field cid - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_cid(auth1_t *inp, size_t idx); -/** As auth1_get_cid, but take and return a const pointer - */ -uint8_t auth1_getconst_cid(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field cid - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_cid(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field cid of 'inp'. - */ -uint8_t * auth1_getarray_cid(auth1_t *inp); -/** As auth1_get_cid, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_cid(const auth1_t *inp); -/** Return the (constant) length of the array holding the sid field of - * the auth1_t in 'inp'. - */ -size_t auth1_getlen_sid(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field sid - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_sid(auth1_t *inp, size_t idx); -/** As auth1_get_sid, but take and return a const pointer - */ -uint8_t auth1_getconst_sid(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field sid - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_sid(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field sid of 'inp'. - */ -uint8_t * auth1_getarray_sid(auth1_t *inp); -/** As auth1_get_sid, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_sid(const auth1_t *inp); -/** Return the (constant) length of the array holding the u1_cid_ed - * field of the auth1_t in 'inp'. - */ -size_t auth1_getlen_u1_cid_ed(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * u1_cid_ed of the auth1_t in 'inp'. - */ -uint8_t auth1_get_u1_cid_ed(auth1_t *inp, size_t idx); -/** As auth1_get_u1_cid_ed, but take and return a const pointer - */ -uint8_t auth1_getconst_u1_cid_ed(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * u1_cid_ed of the auth1_t in 'inp', so that it will hold the value - * 'elt'. - */ -int auth1_set_u1_cid_ed(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field u1_cid_ed of 'inp'. - */ -uint8_t * auth1_getarray_u1_cid_ed(auth1_t *inp); -/** As auth1_get_u1_cid_ed, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_u1_cid_ed(const auth1_t *inp); -/** Return the (constant) length of the array holding the u1_sid_ed - * field of the auth1_t in 'inp'. - */ -size_t auth1_getlen_u1_sid_ed(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * u1_sid_ed of the auth1_t in 'inp'. - */ -uint8_t auth1_get_u1_sid_ed(auth1_t *inp, size_t idx); -/** As auth1_get_u1_sid_ed, but take and return a const pointer - */ -uint8_t auth1_getconst_u1_sid_ed(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * u1_sid_ed of the auth1_t in 'inp', so that it will hold the value - * 'elt'. - */ -int auth1_set_u1_sid_ed(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field u1_sid_ed of 'inp'. - */ -uint8_t * auth1_getarray_u1_sid_ed(auth1_t *inp); -/** As auth1_get_u1_sid_ed, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_u1_sid_ed(const auth1_t *inp); -/** Return the (constant) length of the array holding the slog field - * of the auth1_t in 'inp'. - */ -size_t auth1_getlen_slog(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field slog - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_slog(auth1_t *inp, size_t idx); -/** As auth1_get_slog, but take and return a const pointer - */ -uint8_t auth1_getconst_slog(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field slog - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_slog(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field slog of 'inp'. - */ -uint8_t * auth1_getarray_slog(auth1_t *inp); -/** As auth1_get_slog, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_slog(const auth1_t *inp); -/** Return the (constant) length of the array holding the clog field - * of the auth1_t in 'inp'. - */ -size_t auth1_getlen_clog(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field clog - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_clog(auth1_t *inp, size_t idx); -/** As auth1_get_clog, but take and return a const pointer - */ -uint8_t auth1_getconst_clog(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field clog - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_clog(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field clog of 'inp'. - */ -uint8_t * auth1_getarray_clog(auth1_t *inp); -/** As auth1_get_clog, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_clog(const auth1_t *inp); -/** Return the (constant) length of the array holding the scert field - * of the auth1_t in 'inp'. - */ -size_t auth1_getlen_scert(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * scert of the auth1_t in 'inp'. - */ -uint8_t auth1_get_scert(auth1_t *inp, size_t idx); -/** As auth1_get_scert, but take and return a const pointer - */ -uint8_t auth1_getconst_scert(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * scert of the auth1_t in 'inp', so that it will hold the value - * 'elt'. - */ -int auth1_set_scert(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field scert of 'inp'. - */ -uint8_t * auth1_getarray_scert(auth1_t *inp); -/** As auth1_get_scert, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_scert(const auth1_t *inp); -/** Return the (constant) length of the array holding the tlssecrets - * field of the auth1_t in 'inp'. - */ -size_t auth1_getlen_tlssecrets(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field - * tlssecrets of the auth1_t in 'inp'. - */ -uint8_t auth1_get_tlssecrets(auth1_t *inp, size_t idx); -/** As auth1_get_tlssecrets, but take and return a const pointer - */ -uint8_t auth1_getconst_tlssecrets(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field - * tlssecrets of the auth1_t in 'inp', so that it will hold the value - * 'elt'. - */ -int auth1_set_tlssecrets(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field tlssecrets of - * 'inp'. - */ -uint8_t * auth1_getarray_tlssecrets(auth1_t *inp); -/** As auth1_get_tlssecrets, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_tlssecrets(const auth1_t *inp); -/** Return the position for end_of_fixed_part when we parsed this - * object - */ -const uint8_t * auth1_get_end_of_fixed_part(const auth1_t *inp); -/** Return the (constant) length of the array holding the rand field - * of the auth1_t in 'inp'. - */ -size_t auth1_getlen_rand(const auth1_t *inp); -/** Return the element at position 'idx' of the fixed array field rand - * of the auth1_t in 'inp'. - */ -uint8_t auth1_get_rand(auth1_t *inp, size_t idx); -/** As auth1_get_rand, but take and return a const pointer - */ -uint8_t auth1_getconst_rand(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field rand - * of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_rand(auth1_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 24-element array field rand of 'inp'. - */ -uint8_t * auth1_getarray_rand(auth1_t *inp); -/** As auth1_get_rand, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_rand(const auth1_t *inp); -/** Return the position for end_of_signed when we parsed this object - */ -const uint8_t * auth1_get_end_of_signed(const auth1_t *inp); -/** Return the length of the dynamic array holding the sig field of - * the auth1_t in 'inp'. - */ -size_t auth1_getlen_sig(const auth1_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * sig of the auth1_t in 'inp'. - */ -uint8_t auth1_get_sig(auth1_t *inp, size_t idx); -/** As auth1_get_sig, but take and return a const pointer - */ -uint8_t auth1_getconst_sig(const auth1_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * sig of the auth1_t in 'inp', so that it will hold the value 'elt'. - */ -int auth1_set_sig(auth1_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field sig of the - * auth1_t in 'inp'. - */ -int auth1_add_sig(auth1_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field sig of 'inp'. - */ -uint8_t * auth1_getarray_sig(auth1_t *inp); -/** As auth1_get_sig, but take and return a const pointer - */ -const uint8_t * auth1_getconstarray_sig(const auth1_t *inp); -/** Change the length of the variable-length array field sig of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int auth1_setlen_sig(auth1_t *inp, size_t newlen); -/** Return a newly allocated certs_cell with all elements set to zero. - */ -certs_cell_t *certs_cell_new(void); -/** Release all storage held by the certs_cell in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void certs_cell_free(certs_cell_t *victim); -/** Try to parse a certs_cell from the buffer in 'input', using up to - * 'len_in' bytes from the input buffer. On success, return the number - * of bytes consumed and set *output to the newly allocated - * certs_cell_t. On failure, return -2 if the input appears truncated, - * and -1 if the input is otherwise invalid. - */ -ssize_t certs_cell_parse(certs_cell_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * certs_cell in 'obj'. On failure, return a negative value. Note that - * this value may be an overestimate, and can even be an underestimate - * for certain unencodeable objects. - */ -ssize_t certs_cell_encoded_len(const certs_cell_t *obj); -/** Try to encode the certs_cell from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t certs_cell_encode(uint8_t *output, size_t avail, const certs_cell_t *input); -/** Check whether the internal state of the certs_cell in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. - */ -const char *certs_cell_check(const certs_cell_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int certs_cell_clear_errors(certs_cell_t *obj); -/** Return the value of the n_certs field of the certs_cell_t in 'inp' - */ -uint8_t certs_cell_get_n_certs(const certs_cell_t *inp); -/** Set the value of the n_certs field of the certs_cell_t in 'inp' to - * 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int certs_cell_set_n_certs(certs_cell_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the certs field of - * the certs_cell_t in 'inp'. - */ -size_t certs_cell_getlen_certs(const certs_cell_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * certs of the certs_cell_t in 'inp'. - */ -struct certs_cell_cert_st * certs_cell_get_certs(certs_cell_t *inp, size_t idx); -/** As certs_cell_get_certs, but take and return a const pointer - */ - const struct certs_cell_cert_st * certs_cell_getconst_certs(const certs_cell_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * certs of the certs_cell_t in 'inp', so that it will hold the value - * 'elt'. Free the previous value, if any. - */ -int certs_cell_set_certs(certs_cell_t *inp, size_t idx, struct certs_cell_cert_st * elt); -/** As certs_cell_set_certs, but does not free the previous value. - */ -int certs_cell_set0_certs(certs_cell_t *inp, size_t idx, struct certs_cell_cert_st * elt); -/** Append a new element 'elt' to the dynamic array field certs of the - * certs_cell_t in 'inp'. - */ -int certs_cell_add_certs(certs_cell_t *inp, struct certs_cell_cert_st * elt); -/** Return a pointer to the variable-length array field certs of - * 'inp'. - */ -struct certs_cell_cert_st * * certs_cell_getarray_certs(certs_cell_t *inp); -/** As certs_cell_get_certs, but take and return a const pointer - */ -const struct certs_cell_cert_st * const * certs_cell_getconstarray_certs(const certs_cell_t *inp); -/** Change the length of the variable-length array field certs of - * 'inp' to 'newlen'.Fill extra elements with NULL; free removed - * elements. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. - */ -int certs_cell_setlen_certs(certs_cell_t *inp, size_t newlen); - - -#endif diff --git a/src/tor/src/trunnel/link_handshake.trunnel b/src/tor/src/trunnel/link_handshake.trunnel deleted file mode 100644 index b858e17c6..000000000 --- a/src/tor/src/trunnel/link_handshake.trunnel +++ /dev/null @@ -1,57 +0,0 @@ - -struct certs_cell { - u8 n_certs; - struct certs_cell_cert certs[n_certs]; -} - -const CERTTYPE_RSA1024_ID_LINK = 1; -const CERTTYPE_RSA1024_ID_ID = 2; -const CERTTYPE_RSA1024_ID_AUTH = 3; -const CERTTYPE_ED_ID_SIGN = 4; -const CERTTYPE_ED_SIGN_LINK = 5; -const CERTTYPE_ED_SIGN_AUTH = 6; -const CERTTYPE_RSA1024_ID_EDID = 7; - -struct certs_cell_cert { - u8 cert_type; - u16 cert_len; - u8 body[cert_len]; -} - -struct rsa_ed_crosscert { - u8 ed_key[32]; - u32 expiration; - @ptr end_of_signed; - u8 sig_len; - u8 sig[sig_len]; // mismatches spec. -} - -struct auth_challenge_cell { - u8 challenge[32]; - u16 n_methods; - u16 methods[n_methods]; -} - -context auth_ctx { - u8 is_ed; -} - -struct auth1 with context auth_ctx { - u8 type[8]; - u8 cid[32]; - u8 sid[32]; - union u1[auth_ctx.is_ed] { - 0 : ; - 1 : u8 cid_ed[32]; - u8 sid_ed[32]; - default: fail; - }; - u8 slog[32]; - u8 clog[32]; - u8 scert[32]; - u8 tlssecrets[32]; - @ptr end_of_fixed_part; - u8 rand[24]; - @ptr end_of_signed; - u8 sig[]; -} diff --git a/src/tor/src/trunnel/pwbox.c b/src/tor/src/trunnel/pwbox.c deleted file mode 100644 index c356515d3..000000000 --- a/src/tor/src/trunnel/pwbox.c +++ /dev/null @@ -1,559 +0,0 @@ -/* pwbox.c -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#include -#include "trunnel-impl.h" - -#include "pwbox.h" - -#define TRUNNEL_SET_ERROR_CODE(obj) \ - do { \ - (obj)->trunnel_error_code_ = 1; \ - } while (0) - -#if defined(__COVERITY__) || defined(__clang_analyzer__) -/* If we're running a static analysis tool, we don't want it to complain - * that some of our remaining-bytes checks are dead-code. */ -int pwbox_deadcode_dummy__ = 0; -#define OR_DEADCODE_DUMMY || pwbox_deadcode_dummy__ -#else -#define OR_DEADCODE_DUMMY -#endif - -#define CHECK_REMAINING(nbytes, label) \ - do { \ - if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \ - goto label; \ - } \ - } while (0) - -pwbox_encoded_t * -pwbox_encoded_new(void) -{ - pwbox_encoded_t *val = trunnel_calloc(1, sizeof(pwbox_encoded_t)); - if (NULL == val) - return NULL; - val->fixedbytes0 = PWBOX0_CONST0; - val->fixedbytes1 = PWBOX0_CONST1; - return val; -} - -/** Release all storage held inside 'obj', but do not free 'obj'. - */ -static void -pwbox_encoded_clear(pwbox_encoded_t *obj) -{ - (void) obj; - TRUNNEL_DYNARRAY_WIPE(&obj->skey_header); - TRUNNEL_DYNARRAY_CLEAR(&obj->skey_header); - TRUNNEL_DYNARRAY_WIPE(&obj->data); - TRUNNEL_DYNARRAY_CLEAR(&obj->data); -} - -void -pwbox_encoded_free(pwbox_encoded_t *obj) -{ - if (obj == NULL) - return; - pwbox_encoded_clear(obj); - trunnel_memwipe(obj, sizeof(pwbox_encoded_t)); - trunnel_free_(obj); -} - -uint32_t -pwbox_encoded_get_fixedbytes0(const pwbox_encoded_t *inp) -{ - return inp->fixedbytes0; -} -int -pwbox_encoded_set_fixedbytes0(pwbox_encoded_t *inp, uint32_t val) -{ - if (! ((val == PWBOX0_CONST0))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->fixedbytes0 = val; - return 0; -} -uint32_t -pwbox_encoded_get_fixedbytes1(const pwbox_encoded_t *inp) -{ - return inp->fixedbytes1; -} -int -pwbox_encoded_set_fixedbytes1(pwbox_encoded_t *inp, uint32_t val) -{ - if (! ((val == PWBOX0_CONST1))) { - TRUNNEL_SET_ERROR_CODE(inp); - return -1; - } - inp->fixedbytes1 = val; - return 0; -} -uint8_t -pwbox_encoded_get_header_len(const pwbox_encoded_t *inp) -{ - return inp->header_len; -} -int -pwbox_encoded_set_header_len(pwbox_encoded_t *inp, uint8_t val) -{ - inp->header_len = val; - return 0; -} -size_t -pwbox_encoded_getlen_skey_header(const pwbox_encoded_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->skey_header); -} - -uint8_t -pwbox_encoded_get_skey_header(pwbox_encoded_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->skey_header, idx); -} - -uint8_t -pwbox_encoded_getconst_skey_header(const pwbox_encoded_t *inp, size_t idx) -{ - return pwbox_encoded_get_skey_header((pwbox_encoded_t*)inp, idx); -} -int -pwbox_encoded_set_skey_header(pwbox_encoded_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->skey_header, idx, elt); - return 0; -} -int -pwbox_encoded_add_skey_header(pwbox_encoded_t *inp, uint8_t elt) -{ -#if SIZE_MAX >= UINT8_MAX - if (inp->skey_header.n_ == UINT8_MAX) - goto trunnel_alloc_failed; -#endif - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->skey_header, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -pwbox_encoded_getarray_skey_header(pwbox_encoded_t *inp) -{ - return inp->skey_header.elts_; -} -const uint8_t * -pwbox_encoded_getconstarray_skey_header(const pwbox_encoded_t *inp) -{ - return (const uint8_t *)pwbox_encoded_getarray_skey_header((pwbox_encoded_t*)inp); -} -int -pwbox_encoded_setlen_skey_header(pwbox_encoded_t *inp, size_t newlen) -{ - uint8_t *newptr; -#if UINT8_MAX < SIZE_MAX - if (newlen > UINT8_MAX) - goto trunnel_alloc_failed; -#endif - newptr = trunnel_dynarray_setlen(&inp->skey_header.allocated_, - &inp->skey_header.n_, inp->skey_header.elts_, newlen, - sizeof(inp->skey_header.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->skey_header.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -size_t -pwbox_encoded_getlen_iv(const pwbox_encoded_t *inp) -{ - (void)inp; return 16; -} - -uint8_t -pwbox_encoded_get_iv(pwbox_encoded_t *inp, size_t idx) -{ - trunnel_assert(idx < 16); - return inp->iv[idx]; -} - -uint8_t -pwbox_encoded_getconst_iv(const pwbox_encoded_t *inp, size_t idx) -{ - return pwbox_encoded_get_iv((pwbox_encoded_t*)inp, idx); -} -int -pwbox_encoded_set_iv(pwbox_encoded_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 16); - inp->iv[idx] = elt; - return 0; -} - -uint8_t * -pwbox_encoded_getarray_iv(pwbox_encoded_t *inp) -{ - return inp->iv; -} -const uint8_t * -pwbox_encoded_getconstarray_iv(const pwbox_encoded_t *inp) -{ - return (const uint8_t *)pwbox_encoded_getarray_iv((pwbox_encoded_t*)inp); -} -size_t -pwbox_encoded_getlen_data(const pwbox_encoded_t *inp) -{ - return TRUNNEL_DYNARRAY_LEN(&inp->data); -} - -uint8_t -pwbox_encoded_get_data(pwbox_encoded_t *inp, size_t idx) -{ - return TRUNNEL_DYNARRAY_GET(&inp->data, idx); -} - -uint8_t -pwbox_encoded_getconst_data(const pwbox_encoded_t *inp, size_t idx) -{ - return pwbox_encoded_get_data((pwbox_encoded_t*)inp, idx); -} -int -pwbox_encoded_set_data(pwbox_encoded_t *inp, size_t idx, uint8_t elt) -{ - TRUNNEL_DYNARRAY_SET(&inp->data, idx, elt); - return 0; -} -int -pwbox_encoded_add_data(pwbox_encoded_t *inp, uint8_t elt) -{ - TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->data, elt, {}); - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} - -uint8_t * -pwbox_encoded_getarray_data(pwbox_encoded_t *inp) -{ - return inp->data.elts_; -} -const uint8_t * -pwbox_encoded_getconstarray_data(const pwbox_encoded_t *inp) -{ - return (const uint8_t *)pwbox_encoded_getarray_data((pwbox_encoded_t*)inp); -} -int -pwbox_encoded_setlen_data(pwbox_encoded_t *inp, size_t newlen) -{ - uint8_t *newptr; - newptr = trunnel_dynarray_setlen(&inp->data.allocated_, - &inp->data.n_, inp->data.elts_, newlen, - sizeof(inp->data.elts_[0]), (trunnel_free_fn_t) NULL, - &inp->trunnel_error_code_); - if (newlen != 0 && newptr == NULL) - goto trunnel_alloc_failed; - inp->data.elts_ = newptr; - return 0; - trunnel_alloc_failed: - TRUNNEL_SET_ERROR_CODE(inp); - return -1; -} -size_t -pwbox_encoded_getlen_hmac(const pwbox_encoded_t *inp) -{ - (void)inp; return 32; -} - -uint8_t -pwbox_encoded_get_hmac(pwbox_encoded_t *inp, size_t idx) -{ - trunnel_assert(idx < 32); - return inp->hmac[idx]; -} - -uint8_t -pwbox_encoded_getconst_hmac(const pwbox_encoded_t *inp, size_t idx) -{ - return pwbox_encoded_get_hmac((pwbox_encoded_t*)inp, idx); -} -int -pwbox_encoded_set_hmac(pwbox_encoded_t *inp, size_t idx, uint8_t elt) -{ - trunnel_assert(idx < 32); - inp->hmac[idx] = elt; - return 0; -} - -uint8_t * -pwbox_encoded_getarray_hmac(pwbox_encoded_t *inp) -{ - return inp->hmac; -} -const uint8_t * -pwbox_encoded_getconstarray_hmac(const pwbox_encoded_t *inp) -{ - return (const uint8_t *)pwbox_encoded_getarray_hmac((pwbox_encoded_t*)inp); -} -const char * -pwbox_encoded_check(const pwbox_encoded_t *obj) -{ - if (obj == NULL) - return "Object was NULL"; - if (obj->trunnel_error_code_) - return "A set function failed on this object"; - if (! (obj->fixedbytes0 == PWBOX0_CONST0)) - return "Integer out of bounds"; - if (! (obj->fixedbytes1 == PWBOX0_CONST1)) - return "Integer out of bounds"; - if (TRUNNEL_DYNARRAY_LEN(&obj->skey_header) != obj->header_len) - return "Length mismatch for skey_header"; - return NULL; -} - -ssize_t -pwbox_encoded_encoded_len(const pwbox_encoded_t *obj) -{ - ssize_t result = 0; - - if (NULL != pwbox_encoded_check(obj)) - return -1; - - - /* Length of u32 fixedbytes0 IN [PWBOX0_CONST0] */ - result += 4; - - /* Length of u32 fixedbytes1 IN [PWBOX0_CONST1] */ - result += 4; - - /* Length of u8 header_len */ - result += 1; - - /* Length of u8 skey_header[header_len] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->skey_header); - - /* Length of u8 iv[16] */ - result += 16; - - /* Length of u8 data[] */ - result += TRUNNEL_DYNARRAY_LEN(&obj->data); - - /* Length of u8 hmac[32] */ - result += 32; - return result; -} -int -pwbox_encoded_clear_errors(pwbox_encoded_t *obj) -{ - int r = obj->trunnel_error_code_; - obj->trunnel_error_code_ = 0; - return r; -} -ssize_t -pwbox_encoded_encode(uint8_t *output, size_t avail, const pwbox_encoded_t *obj) -{ - ssize_t result = 0; - size_t written = 0; - uint8_t *ptr = output; - const char *msg; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = pwbox_encoded_encoded_len(obj); -#endif - int enforce_avail = 0; - const size_t avail_orig = avail; - - if (NULL != (msg = pwbox_encoded_check(obj))) - goto check_failed; - -#ifdef TRUNNEL_CHECK_ENCODED_LEN - trunnel_assert(encoded_len >= 0); -#endif - - /* Encode u32 fixedbytes0 IN [PWBOX0_CONST0] */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->fixedbytes0)); - written += 4; ptr += 4; - - /* Encode u32 fixedbytes1 IN [PWBOX0_CONST1] */ - trunnel_assert(written <= avail); - if (avail - written < 4) - goto truncated; - trunnel_set_uint32(ptr, trunnel_htonl(obj->fixedbytes1)); - written += 4; ptr += 4; - - /* Encode u8 header_len */ - trunnel_assert(written <= avail); - if (avail - written < 1) - goto truncated; - trunnel_set_uint8(ptr, (obj->header_len)); - written += 1; ptr += 1; - - /* Encode u8 skey_header[header_len] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->skey_header); - trunnel_assert(obj->header_len == elt_len); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->skey_header.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - - /* Encode u8 iv[16] */ - trunnel_assert(written <= avail); - if (avail - written < 16) - goto truncated; - memcpy(ptr, obj->iv, 16); - written += 16; ptr += 16; - { - - /* Encode u8 data[] */ - { - size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->data); - trunnel_assert(written <= avail); - if (avail - written < elt_len) - goto truncated; - if (elt_len) - memcpy(ptr, obj->data.elts_, elt_len); - written += elt_len; ptr += elt_len; - } - trunnel_assert(written <= avail); - if (avail - written < 32) - goto truncated; - avail = written + 32; - enforce_avail = 1; - } - - /* Encode u8 hmac[32] */ - trunnel_assert(written <= avail); - if (avail - written < 32) { - if (avail_orig - written < 32) - goto truncated; - else - goto check_failed; - } - memcpy(ptr, obj->hmac, 32); - written += 32; ptr += 32; - - - trunnel_assert(ptr == output + written); - if (enforce_avail && avail != written) - goto check_failed; -#ifdef TRUNNEL_CHECK_ENCODED_LEN - { - trunnel_assert(encoded_len >= 0); - trunnel_assert((size_t)encoded_len == written); - } - -#endif - - return written; - - truncated: - result = -2; - goto fail; - check_failed: - (void)msg; - result = -1; - goto fail; - fail: - trunnel_assert(result < 0); - return result; -} - -/** As pwbox_encoded_parse(), but do not allocate the output object. - */ -static ssize_t -pwbox_encoded_parse_into(pwbox_encoded_t *obj, const uint8_t *input, const size_t len_in) -{ - const uint8_t *ptr = input; - size_t remaining = len_in; - ssize_t result = 0; - (void)result; - - /* Parse u32 fixedbytes0 IN [PWBOX0_CONST0] */ - CHECK_REMAINING(4, truncated); - obj->fixedbytes0 = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - if (! (obj->fixedbytes0 == PWBOX0_CONST0)) - goto fail; - - /* Parse u32 fixedbytes1 IN [PWBOX0_CONST1] */ - CHECK_REMAINING(4, truncated); - obj->fixedbytes1 = trunnel_ntohl(trunnel_get_uint32(ptr)); - remaining -= 4; ptr += 4; - if (! (obj->fixedbytes1 == PWBOX0_CONST1)) - goto fail; - - /* Parse u8 header_len */ - CHECK_REMAINING(1, truncated); - obj->header_len = (trunnel_get_uint8(ptr)); - remaining -= 1; ptr += 1; - - /* Parse u8 skey_header[header_len] */ - CHECK_REMAINING(obj->header_len, truncated); - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->skey_header, obj->header_len, {}); - obj->skey_header.n_ = obj->header_len; - if (obj->header_len) - memcpy(obj->skey_header.elts_, ptr, obj->header_len); - ptr += obj->header_len; remaining -= obj->header_len; - - /* Parse u8 iv[16] */ - CHECK_REMAINING(16, truncated); - memcpy(obj->iv, ptr, 16); - remaining -= 16; ptr += 16; - { - size_t remaining_after; - CHECK_REMAINING(32, truncated); - remaining_after = 32; - remaining = remaining - 32; - - /* Parse u8 data[] */ - TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->data, remaining, {}); - obj->data.n_ = remaining; - if (remaining) - memcpy(obj->data.elts_, ptr, remaining); - ptr += remaining; remaining -= remaining; - if (remaining != 0) - goto fail; - remaining = remaining_after; - } - - /* Parse u8 hmac[32] */ - CHECK_REMAINING(32, truncated); - memcpy(obj->hmac, ptr, 32); - remaining -= 32; ptr += 32; - trunnel_assert(ptr + remaining == input + len_in); - return len_in - remaining; - - truncated: - return -2; - trunnel_alloc_failed: - return -1; - fail: - result = -1; - return result; -} - -ssize_t -pwbox_encoded_parse(pwbox_encoded_t **output, const uint8_t *input, const size_t len_in) -{ - ssize_t result; - *output = pwbox_encoded_new(); - if (NULL == *output) - return -1; - result = pwbox_encoded_parse_into(*output, input, len_in); - if (result < 0) { - pwbox_encoded_free(*output); - *output = NULL; - } - return result; -} diff --git a/src/tor/src/trunnel/pwbox.h b/src/tor/src/trunnel/pwbox.h deleted file mode 100644 index a9a421408..000000000 --- a/src/tor/src/trunnel/pwbox.h +++ /dev/null @@ -1,199 +0,0 @@ -/* pwbox.h -- generated by Trunnel v1.5.2. - * https://gitweb.torproject.org/trunnel.git - * You probably shouldn't edit this file. - */ -#ifndef TRUNNEL_PWBOX_H -#define TRUNNEL_PWBOX_H - -#include -#include "trunnel.h" - -#define PWBOX0_CONST0 1414484546 -#define PWBOX0_CONST1 1331179568 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_PWBOX_ENCODED) -struct pwbox_encoded_st { - uint32_t fixedbytes0; - uint32_t fixedbytes1; - uint8_t header_len; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) skey_header; - uint8_t iv[16]; - TRUNNEL_DYNARRAY_HEAD(, uint8_t) data; - uint8_t hmac[32]; - uint8_t trunnel_error_code_; -}; -#endif -typedef struct pwbox_encoded_st pwbox_encoded_t; -/** Return a newly allocated pwbox_encoded with all elements set to - * zero. - */ -pwbox_encoded_t *pwbox_encoded_new(void); -/** Release all storage held by the pwbox_encoded in 'victim'. (Do - * nothing if 'victim' is NULL.) - */ -void pwbox_encoded_free(pwbox_encoded_t *victim); -/** Try to parse a pwbox_encoded from the buffer in 'input', using up - * to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * pwbox_encoded_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. - */ -ssize_t pwbox_encoded_parse(pwbox_encoded_t **output, const uint8_t *input, const size_t len_in); -/** Return the number of bytes we expect to need to encode the - * pwbox_encoded in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an - * underestimate for certain unencodeable objects. - */ -ssize_t pwbox_encoded_encoded_len(const pwbox_encoded_t *obj); -/** Try to encode the pwbox_encoded from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On - * success, return the number of bytes used. On failure, return -2 if - * the buffer was not long enough, and -1 if the input was invalid. - */ -ssize_t pwbox_encoded_encode(uint8_t *output, size_t avail, const pwbox_encoded_t *input); -/** Check whether the internal state of the pwbox_encoded in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. - */ -const char *pwbox_encoded_check(const pwbox_encoded_t *obj); -/** Clear any errors that were set on the object 'obj' by its setter - * functions. Return true iff errors were cleared. - */ -int pwbox_encoded_clear_errors(pwbox_encoded_t *obj); -/** Return the value of the fixedbytes0 field of the pwbox_encoded_t - * in 'inp' - */ -uint32_t pwbox_encoded_get_fixedbytes0(const pwbox_encoded_t *inp); -/** Set the value of the fixedbytes0 field of the pwbox_encoded_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int pwbox_encoded_set_fixedbytes0(pwbox_encoded_t *inp, uint32_t val); -/** Return the value of the fixedbytes1 field of the pwbox_encoded_t - * in 'inp' - */ -uint32_t pwbox_encoded_get_fixedbytes1(const pwbox_encoded_t *inp); -/** Set the value of the fixedbytes1 field of the pwbox_encoded_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int pwbox_encoded_set_fixedbytes1(pwbox_encoded_t *inp, uint32_t val); -/** Return the value of the header_len field of the pwbox_encoded_t in - * 'inp' - */ -uint8_t pwbox_encoded_get_header_len(const pwbox_encoded_t *inp); -/** Set the value of the header_len field of the pwbox_encoded_t in - * 'inp' to 'val'. Return 0 on success; return -1 and set the error - * code on 'inp' on failure. - */ -int pwbox_encoded_set_header_len(pwbox_encoded_t *inp, uint8_t val); -/** Return the length of the dynamic array holding the skey_header - * field of the pwbox_encoded_t in 'inp'. - */ -size_t pwbox_encoded_getlen_skey_header(const pwbox_encoded_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * skey_header of the pwbox_encoded_t in 'inp'. - */ -uint8_t pwbox_encoded_get_skey_header(pwbox_encoded_t *inp, size_t idx); -/** As pwbox_encoded_get_skey_header, but take and return a const - * pointer - */ -uint8_t pwbox_encoded_getconst_skey_header(const pwbox_encoded_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * skey_header of the pwbox_encoded_t in 'inp', so that it will hold - * the value 'elt'. - */ -int pwbox_encoded_set_skey_header(pwbox_encoded_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field skey_header - * of the pwbox_encoded_t in 'inp'. - */ -int pwbox_encoded_add_skey_header(pwbox_encoded_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field skey_header of - * 'inp'. - */ -uint8_t * pwbox_encoded_getarray_skey_header(pwbox_encoded_t *inp); -/** As pwbox_encoded_get_skey_header, but take and return a const - * pointer - */ -const uint8_t * pwbox_encoded_getconstarray_skey_header(const pwbox_encoded_t *inp); -/** Change the length of the variable-length array field skey_header - * of 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on - * success; return -1 and set the error code on 'inp' on failure. - */ -int pwbox_encoded_setlen_skey_header(pwbox_encoded_t *inp, size_t newlen); -/** Return the (constant) length of the array holding the iv field of - * the pwbox_encoded_t in 'inp'. - */ -size_t pwbox_encoded_getlen_iv(const pwbox_encoded_t *inp); -/** Return the element at position 'idx' of the fixed array field iv - * of the pwbox_encoded_t in 'inp'. - */ -uint8_t pwbox_encoded_get_iv(pwbox_encoded_t *inp, size_t idx); -/** As pwbox_encoded_get_iv, but take and return a const pointer - */ -uint8_t pwbox_encoded_getconst_iv(const pwbox_encoded_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field iv - * of the pwbox_encoded_t in 'inp', so that it will hold the value - * 'elt'. - */ -int pwbox_encoded_set_iv(pwbox_encoded_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 16-element array field iv of 'inp'. - */ -uint8_t * pwbox_encoded_getarray_iv(pwbox_encoded_t *inp); -/** As pwbox_encoded_get_iv, but take and return a const pointer - */ -const uint8_t * pwbox_encoded_getconstarray_iv(const pwbox_encoded_t *inp); -/** Return the length of the dynamic array holding the data field of - * the pwbox_encoded_t in 'inp'. - */ -size_t pwbox_encoded_getlen_data(const pwbox_encoded_t *inp); -/** Return the element at position 'idx' of the dynamic array field - * data of the pwbox_encoded_t in 'inp'. - */ -uint8_t pwbox_encoded_get_data(pwbox_encoded_t *inp, size_t idx); -/** As pwbox_encoded_get_data, but take and return a const pointer - */ -uint8_t pwbox_encoded_getconst_data(const pwbox_encoded_t *inp, size_t idx); -/** Change the element at position 'idx' of the dynamic array field - * data of the pwbox_encoded_t in 'inp', so that it will hold the - * value 'elt'. - */ -int pwbox_encoded_set_data(pwbox_encoded_t *inp, size_t idx, uint8_t elt); -/** Append a new element 'elt' to the dynamic array field data of the - * pwbox_encoded_t in 'inp'. - */ -int pwbox_encoded_add_data(pwbox_encoded_t *inp, uint8_t elt); -/** Return a pointer to the variable-length array field data of 'inp'. - */ -uint8_t * pwbox_encoded_getarray_data(pwbox_encoded_t *inp); -/** As pwbox_encoded_get_data, but take and return a const pointer - */ -const uint8_t * pwbox_encoded_getconstarray_data(const pwbox_encoded_t *inp); -/** Change the length of the variable-length array field data of 'inp' - * to 'newlen'.Fill extra elements with 0. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. - */ -int pwbox_encoded_setlen_data(pwbox_encoded_t *inp, size_t newlen); -/** Return the (constant) length of the array holding the hmac field - * of the pwbox_encoded_t in 'inp'. - */ -size_t pwbox_encoded_getlen_hmac(const pwbox_encoded_t *inp); -/** Return the element at position 'idx' of the fixed array field hmac - * of the pwbox_encoded_t in 'inp'. - */ -uint8_t pwbox_encoded_get_hmac(pwbox_encoded_t *inp, size_t idx); -/** As pwbox_encoded_get_hmac, but take and return a const pointer - */ -uint8_t pwbox_encoded_getconst_hmac(const pwbox_encoded_t *inp, size_t idx); -/** Change the element at position 'idx' of the fixed array field hmac - * of the pwbox_encoded_t in 'inp', so that it will hold the value - * 'elt'. - */ -int pwbox_encoded_set_hmac(pwbox_encoded_t *inp, size_t idx, uint8_t elt); -/** Return a pointer to the 32-element array field hmac of 'inp'. - */ -uint8_t * pwbox_encoded_getarray_hmac(pwbox_encoded_t *inp); -/** As pwbox_encoded_get_hmac, but take and return a const pointer - */ -const uint8_t * pwbox_encoded_getconstarray_hmac(const pwbox_encoded_t *inp); - - -#endif diff --git a/src/tor/src/trunnel/pwbox.trunnel b/src/tor/src/trunnel/pwbox.trunnel deleted file mode 100644 index 10db74b4e..000000000 --- a/src/tor/src/trunnel/pwbox.trunnel +++ /dev/null @@ -1,14 +0,0 @@ - -const PWBOX0_CONST0 = 0x544f5242; // TORB -const PWBOX0_CONST1 = 0x4f583030; // OX00 - -struct pwbox_encoded { - u32 fixedbytes0 IN [PWBOX0_CONST0]; - u32 fixedbytes1 IN [PWBOX0_CONST1]; - u8 header_len; - u8 skey_header[header_len]; - u8 iv[16]; - u8 data[..-32]; - u8 hmac[32]; -}; - diff --git a/src/tor/src/trunnel/trunnel-local.h b/src/tor/src/trunnel/trunnel-local.h deleted file mode 100644 index b7c2ab98e..000000000 --- a/src/tor/src/trunnel/trunnel-local.h +++ /dev/null @@ -1,18 +0,0 @@ - -#ifndef TRUNNEL_LOCAL_H_INCLUDED -#define TRUNNEL_LOCAL_H_INCLUDED - -#include "util.h" -#include "compat.h" -#include "crypto.h" - -#define trunnel_malloc tor_malloc -#define trunnel_calloc tor_calloc -#define trunnel_strdup tor_strdup -#define trunnel_free_ tor_free_ -#define trunnel_realloc tor_realloc -#define trunnel_reallocarray tor_reallocarray -#define trunnel_assert tor_assert -#define trunnel_memwipe(mem, len) memwipe((mem), 0, (len)) - -#endif diff --git a/src/tor/src/win32/include.am b/src/tor/src/win32/include.am deleted file mode 100644 index dad59af3a..000000000 --- a/src/tor/src/win32/include.am +++ /dev/null @@ -1,3 +0,0 @@ - -EXTRA_DIST+= src/win32/orconfig.h - diff --git a/src/tor/src/or/statefile.c b/src/tor/statefile.c similarity index 85% rename from src/tor/src/or/statefile.c rename to src/tor/statefile.c index cc114f0a2..8ab04763d 100644 --- a/src/tor/src/or/statefile.c +++ b/src/tor/statefile.c @@ -1,45 +1,18 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/** - * \file statefile.c - * - * \brief Handles parsing and encoding the persistent 'state' file that carries - * miscellaneous persistent state between Tor invocations. - * - * This 'state' file is a typed key-value store that allows multiple - * entries for the same key. It follows the same metaformat as described - * in confparse.c, and uses the same code to read and write itself. - * - * The state file is most suitable for small values that don't change too - * frequently. For values that become very large, we typically use a separate - * file -- for example, see how we handle microdescriptors, by storing them in - * a separate file with a journal. - * - * The current state is accessed via get_or_state(), which returns a singleton - * or_state_t object. Functions that change it should call - * or_state_mark_dirty() to ensure that it will get written to disk. - * - * The or_state_save() function additionally calls various functioens - * throughout Tor that might want to flush more state to the the disk, - * including some in rephist.c, entrynodes.c, circuitstats.c, hibernate.c. - */ - #define STATEFILE_PRIVATE #include "or.h" #include "circuitstats.h" #include "config.h" #include "confparse.h" -#include "connection.h" -#include "control.h" #include "entrynodes.h" #include "hibernate.h" #include "rephist.h" #include "router.h" -#include "sandbox.h" #include "statefile.h" /** A list of state-file "abbreviations," for compatibility. */ @@ -54,14 +27,10 @@ static config_abbrev_t state_abbrevs_[] = { { NULL, NULL, 0, 0}, }; -/** dummy instance of or_state_t, used for type-checking its - * members with CONF_CHECK_VAR_TYPE. */ -DUMMY_TYPECHECK_INSTANCE(or_state_t); - /*XXXX these next two are duplicates or near-duplicates from config.c */ #define VAR(name,conftype,member,initvalue) \ - { name, CONFIG_TYPE_ ## conftype, offsetof(or_state_t, member), \ - initvalue CONF_TEST_MEMBERS(or_state_t, conftype, member) } + { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_state_t, member), \ + initvalue } /** As VAR, but the option name and member name are the same. */ #define V(member,conftype,initvalue) \ VAR(#member, conftype, member, initvalue) @@ -90,8 +59,6 @@ static config_var_t state_vars_[] = { VAR("TransportProxy", LINELIST_S, TransportProxies, NULL), V(TransportProxies, LINELIST_V, NULL), - V(HidServRevCounter, LINELIST, NULL), - V(BWHistoryReadEnds, ISOTIME, NULL), V(BWHistoryReadInterval, UINT, "900"), V(BWHistoryReadValues, CSV, ""), @@ -109,8 +76,6 @@ static config_var_t state_vars_[] = { V(BWHistoryDirWriteValues, CSV, ""), V(BWHistoryDirWriteMaxima, CSV, ""), - V(Guard, LINELIST, NULL), - V(TorVersion, STRING, NULL), V(LastRotatedOnionKey, ISOTIME, NULL), @@ -120,8 +85,7 @@ static config_var_t state_vars_[] = { V(CircuitBuildAbandonedCount, UINT, "0"), VAR("CircuitBuildTimeBin", LINELIST_S, BuildtimeHistogram, NULL), VAR("BuildtimeHistogram", LINELIST_V, BuildtimeHistogram, NULL), - - END_OF_CONFIG_VARS + { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; #undef VAR @@ -139,17 +103,15 @@ static int or_state_validate_cb(void *old_options, void *options, /** "Extra" variable in the state that receives lines we can't parse. This * lets us preserve options from versions of Tor newer than us. */ static config_var_t state_extra_var = { - "__extra", CONFIG_TYPE_LINELIST, offsetof(or_state_t, ExtraLines), NULL - CONF_TEST_MEMBERS(or_state_t, LINELIST, ExtraLines) + "__extra", CONFIG_TYPE_LINELIST, STRUCT_OFFSET(or_state_t, ExtraLines), NULL }; /** Configuration format for or_state_t. */ static const config_format_t state_format = { sizeof(or_state_t), OR_STATE_MAGIC, - offsetof(or_state_t, magic_), + STRUCT_OFFSET(or_state_t, magic_), state_abbrevs_, - NULL, state_vars_, or_state_validate_cb, &state_extra_var, @@ -298,7 +260,7 @@ or_state_set(or_state_t *new_state) static void or_state_save_broken(char *fname) { - int i, res; + int i; file_status_t status; char *fname2 = NULL; for (i = 0; i < 100; ++i) { @@ -312,18 +274,12 @@ or_state_save_broken(char *fname) log_warn(LD_BUG, "Unable to parse state in \"%s\"; too many saved bad " "state files to move aside. Discarding the old state file.", fname); - res = unlink(fname); - if (res != 0) { - log_warn(LD_FS, - "Also couldn't discard old state file \"%s\" because " - "unlink() failed: %s", - fname, strerror(errno)); - } + unlink(fname); } else { log_warn(LD_BUG, "Unable to parse state in \"%s\". Moving it aside " "to \"%s\". This could be a bug in Tor; please tell " "the developers.", fname, fname2); - if (tor_rename(fname, fname2) < 0) {//XXXX sandbox prohibits + if (rename(fname, fname2) < 0) { log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The " "OS gave an error of %s", strerror(errno)); } @@ -331,16 +287,6 @@ or_state_save_broken(char *fname) tor_free(fname2); } -STATIC or_state_t * -or_state_new(void) -{ - or_state_t *new_state = tor_malloc_zero(sizeof(or_state_t)); - new_state->magic_ = OR_STATE_MAGIC; - config_init(&state_format, new_state); - - return new_state; -} - /** Reload the persistent state from disk, generating a new state as needed. * Return 0 on success, less than 0 on failure. */ @@ -360,10 +306,7 @@ or_state_load(void) goto done; } break; - /* treat empty state files as if the file doesn't exist, and generate - * a new state file, overwriting the empty file in or_state_save() */ case FN_NOENT: - case FN_EMPTY: break; case FN_ERROR: case FN_DIR: @@ -371,14 +314,16 @@ or_state_load(void) log_warn(LD_GENERAL,"State file \"%s\" is not a file? Failing.", fname); goto done; } - new_state = or_state_new(); + new_state = tor_malloc_zero(sizeof(or_state_t)); + new_state->magic_ = OR_STATE_MAGIC; + config_init(&state_format, new_state); if (contents) { config_line_t *lines=NULL; int assign_retval; if (config_get_lines(contents, &lines, 0)<0) goto done; assign_retval = config_assign(&state_format, new_state, - lines, 0, &errmsg); + lines, 0, 0, &errmsg); config_free_lines(lines); if (assign_retval<0) badstate = 1; @@ -406,20 +351,11 @@ or_state_load(void) tor_free(contents); config_free(&state_format, new_state); - new_state = or_state_new(); + new_state = tor_malloc_zero(sizeof(or_state_t)); + new_state->magic_ = OR_STATE_MAGIC; + config_init(&state_format, new_state); } else if (contents) { log_info(LD_GENERAL, "Loaded state from \"%s\"", fname); - /* Warn the user if their clock has been set backwards, - * they could be tricked into using old consensuses */ - time_t apparent_skew = time(NULL) - new_state->LastWritten; - if (apparent_skew < 0) { - /* Initialize bootstrap event reporting because we might call - * clock_skew_warning() before the bootstrap state is - * initialized, causing an assertion failure. */ - control_event_bootstrap(BOOTSTRAP_STATUS_STARTING, 0); - clock_skew_warning(NULL, (long)apparent_skew, 1, LD_GENERAL, - "local state file", fname); - } } else { log_info(LD_GENERAL, "Initialized state"); } @@ -671,6 +607,8 @@ save_transport_to_state(const char *transport, *next = line = tor_malloc_zero(sizeof(config_line_t)); line->key = tor_strdup("TransportProxy"); tor_asprintf(&line->value, "%s %s", transport, fmt_addrport(addr, port)); + + next = &(line->next); } if (!get_options()->AvoidDiskWrites) @@ -680,19 +618,10 @@ save_transport_to_state(const char *transport, tor_free(transport_addrport); } -STATIC void -or_state_free_(or_state_t *state) -{ - if (!state) - return; - - config_free(&state_format, state); -} - void or_state_free_all(void) { - or_state_free(global_state); + config_free(&state_format, global_state); global_state = NULL; } diff --git a/src/tor/src/or/statefile.h b/src/tor/statefile.h similarity index 74% rename from src/tor/src/or/statefile.h rename to src/tor/statefile.h index b4cc4d1dc..c1413ff95 100644 --- a/src/tor/src/or/statefile.h +++ b/src/tor/statefile.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATEFILE_H @@ -20,10 +20,7 @@ void or_state_free_all(void); #ifdef STATEFILE_PRIVATE STATIC config_line_t *get_transport_in_state_by_name(const char *transport); -STATIC void or_state_free_(or_state_t *state); -#define or_state_free(st) FREE_AND_NULL(or_state_t, or_state_free_, (st)) -STATIC or_state_t *or_state_new(void); #endif -#endif /* !defined(TOR_STATEFILE_H) */ +#endif diff --git a/src/tor/src/or/status.c b/src/tor/status.c similarity index 57% rename from src/tor/src/or/status.c rename to src/tor/status.c index 1a8885e83..3473045f4 100644 --- a/src/tor/src/or/status.c +++ b/src/tor/status.c @@ -1,46 +1,42 @@ -/* Copyright (c) 2010-2017, The Tor Project, Inc. */ +/* Copyright (c) 2010-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file status.c - * \brief Collect status information and log heartbeat messages. - * - * This module is responsible for implementing the heartbeat log messages, - * which periodically inform users and operators about basic facts to - * do with their Tor instance. The log_heartbeat() function, invoked from - * main.c, is the principle entry point. It collects data from elsewhere - * in Tor, and logs it in a human-readable format. + * \brief Keep status information and log the heartbeat messages. **/ -#define STATUS_PRIVATE - #include "or.h" -#include "circuituse.h" #include "config.h" #include "status.h" #include "nodelist.h" #include "relay.h" #include "router.h" #include "circuitlist.h" -#include "main.h" +#include "onion_main.h" #include "rephist.h" #include "hibernate.h" #include "rephist.h" #include "statefile.h" static void log_accounting(const time_t now, const or_options_t *options); -#include "geoip.h" /** Return the total number of circuits. */ -STATIC int +static int count_circuits(void) { - return smartlist_len(circuit_get_global_list()); + circuit_t *circ; + int nr=0; + + TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) + nr++; + + return nr; } /** Take seconds secs and return a newly allocated human-readable * uptime string */ -STATIC char * +static char * secs_to_uptime(long secs) { long int days = secs / 86400; @@ -67,7 +63,7 @@ secs_to_uptime(long secs) /** Take bytes and returns a newly allocated human-readable usage * string. */ -STATIC char * +static char * bytes_to_usage(uint64_t bytes) { char *bw_string = NULL; @@ -99,6 +95,7 @@ log_heartbeat(time_t now) const int hibernating = we_are_hibernating(); const or_options_t *options = get_options(); + (void)now; if (public_server_mode(options) && !hibernating) { /* Let's check if we are in the current cached consensus. */ @@ -116,60 +113,25 @@ log_heartbeat(time_t now) log_fn(LOG_NOTICE, LD_HEARTBEAT, "Heartbeat: Tor's uptime is %s, with %d " "circuits open. I've sent %s and received %s.%s", - uptime, count_circuits(), bw_sent, bw_rcvd, + uptime, count_circuits(),bw_sent,bw_rcvd, hibernating?" We are currently hibernating.":""); if (server_mode(options) && accounting_is_enabled(options) && !hibernating) { log_accounting(now, options); } - double fullness_pct = 100; - if (stats_n_data_cells_packaged && !hibernating) { - fullness_pct = - 100*(U64_TO_DBL(stats_n_data_bytes_packaged) / - U64_TO_DBL(stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)); - } - const double overhead_pct = ( r - 1.0 ) * 100.0; - -#define FULLNESS_PCT_THRESHOLD 80 -#define TLS_OVERHEAD_THRESHOLD 15 - - const int severity = (fullness_pct < FULLNESS_PCT_THRESHOLD || - overhead_pct > TLS_OVERHEAD_THRESHOLD) - ? LOG_NOTICE : LOG_INFO; - - log_fn(severity, LD_HEARTBEAT, - "Average packaged cell fullness: %2.3f%%. " - "TLS write overhead: %.f%%", fullness_pct, overhead_pct); - - if (public_server_mode(options)) { - rep_hist_log_circuit_handshake_stats(now); - rep_hist_log_link_protocol_counts(); - } - - circuit_log_ancient_one_hop_circuits(1800); + if (stats_n_data_cells_packaged && !hibernating) + log_notice(LD_HEARTBEAT, "Average packaged cell fullness: %2.3f%%", + 100*(U64_TO_DBL(stats_n_data_bytes_packaged) / + U64_TO_DBL(stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)) ); - if (options->BridgeRelay) { - char *msg = NULL; - msg = format_client_stats_heartbeat(now); - if (msg) - log_notice(LD_HEARTBEAT, "%s", msg); - tor_free(msg); + if (r > 1.0) { + double overhead = ( r - 1.0 ) * 100.0; + log_notice(LD_HEARTBEAT, "TLS write overhead: %.f%%", overhead); } - if (options->MainloopStats) { - const uint64_t main_loop_success_count = get_main_loop_success_count(); - const uint64_t main_loop_error_count = get_main_loop_error_count(); - const uint64_t main_loop_idle_count = get_main_loop_idle_count(); - - log_fn(LOG_NOTICE, LD_HEARTBEAT, "Main event loop statistics: " - U64_FORMAT " succesful returns, " - U64_FORMAT " erroneous returns, and " - U64_FORMAT " idle returns.", - U64_PRINTF_ARG(main_loop_success_count), - U64_PRINTF_ARG(main_loop_error_count), - U64_PRINTF_ARG(main_loop_idle_count)); - } + if (public_server_mode(options)) + rep_hist_log_circuit_handshake_stats(now); tor_free(uptime); tor_free(bw_sent); @@ -184,38 +146,20 @@ log_accounting(const time_t now, const or_options_t *options) or_state_t *state = get_or_state(); char *acc_rcvd = bytes_to_usage(state->AccountingBytesReadInInterval); char *acc_sent = bytes_to_usage(state->AccountingBytesWrittenInInterval); - char *acc_used = bytes_to_usage(get_accounting_bytes()); - uint64_t acc_bytes = options->AccountingMax; - char *acc_max; + char *acc_max = bytes_to_usage(options->AccountingMax); time_t interval_end = accounting_get_end_time(); char end_buf[ISO_TIME_LEN + 1]; char *remaining = NULL; - acc_max = bytes_to_usage(acc_bytes); format_local_iso_time(end_buf, interval_end); remaining = secs_to_uptime(interval_end - now); - const char *acc_rule; - switch (options->AccountingRule) { - case ACCT_MAX: acc_rule = "max"; - break; - case ACCT_SUM: acc_rule = "sum"; - break; - case ACCT_OUT: acc_rule = "out"; - break; - case ACCT_IN: acc_rule = "in"; - break; - default: acc_rule = "max"; - break; - } - log_notice(LD_HEARTBEAT, "Heartbeat: Accounting enabled. " - "Sent: %s, Received: %s, Used: %s / %s, Rule: %s. The " + "Sent: %s / %s, Received: %s / %s. The " "current accounting interval ends on %s, in %s.", - acc_sent, acc_rcvd, acc_used, acc_max, acc_rule, end_buf, remaining); + acc_sent, acc_max, acc_rcvd, acc_max, end_buf, remaining); tor_free(acc_rcvd); tor_free(acc_sent); - tor_free(acc_used); tor_free(acc_max); tor_free(remaining); } diff --git a/src/tor/status.h b/src/tor/status.h new file mode 100644 index 000000000..7c3b969c8 --- /dev/null +++ b/src/tor/status.h @@ -0,0 +1,10 @@ +/* Copyright (c) 2010-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_STATUS_H +#define TOR_STATUS_H + +int log_heartbeat(time_t now); + +#endif + diff --git a/src/tor/src/ext/strlcat.c b/src/tor/strlcat.c similarity index 100% rename from src/tor/src/ext/strlcat.c rename to src/tor/strlcat.c diff --git a/src/tor/src/ext/strlcpy.c b/src/tor/strlcpy.c similarity index 100% rename from src/tor/src/ext/strlcpy.c rename to src/tor/strlcpy.c diff --git a/src/tor/src/common/testsupport.h b/src/tor/testsupport.h similarity index 74% rename from src/tor/src/common/testsupport.h rename to src/tor/testsupport.h index a3f2ff91e..4a4f50b69 100644 --- a/src/tor/src/common/testsupport.h +++ b/src/tor/testsupport.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Tor Project, Inc. */ +/* Copyright (c) 2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TESTSUPPORT_H @@ -6,11 +6,9 @@ #ifdef TOR_UNIT_TESTS #define STATIC -#define EXTERN(type, name) extern type name; #else #define STATIC static -#define EXTERN(type, name) -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /** Quick and dirty macros to implement test mocking. * @@ -22,8 +20,8 @@ * * and implement it as: * - * MOCK_IMPL(void, - * writebuf,(size_t n, char *buf)) + * MOCK_IMPL(void + * writebuf,(size_t n, char *buf) * { * ... * } @@ -62,12 +60,6 @@ #define MOCK_IMPL(rv, funcname, arglist) \ rv(*funcname) arglist = funcname ##__real; \ rv funcname ##__real arglist -#define MOCK_DECL_ATTR(rv, funcname, arglist, attr) \ - rv funcname ##__real arglist attr; \ - extern rv(*funcname) arglist -#define MOCK_IMPL(rv, funcname, arglist) \ - rv(*funcname) arglist = funcname ##__real; \ - rv funcname ##__real arglist #define MOCK(func, replacement) \ do { \ (func) = (replacement); \ @@ -76,15 +68,13 @@ do { \ func = func ##__real; \ } while (0) -#else /* !(defined(TOR_UNIT_TESTS)) */ +#else #define MOCK_DECL(rv, funcname, arglist) \ rv funcname arglist -#define MOCK_DECL_ATTR(rv, funcname, arglist, attr) \ - rv funcname arglist attr #define MOCK_IMPL(rv, funcname, arglist) \ rv funcname arglist -#endif /* defined(TOR_UNIT_TESTS) */ +#endif /** @} */ -#endif /* !defined(TOR_TESTSUPPORT_H) */ +#endif diff --git a/src/tor/src/ext/tinytest.h b/src/tor/tinytest.h similarity index 87% rename from src/tor/src/ext/tinytest.h rename to src/tor/tinytest.h index ed07b26bc..bcac9f079 100644 --- a/src/tor/src/ext/tinytest.h +++ b/src/tor/tinytest.h @@ -32,10 +32,8 @@ #define TT_SKIP (1<<1) /** Internal runtime flag for a test we've decided to run. */ #define TT_ENABLED_ (1<<2) -/** Flag for a test that's off by default. */ -#define TT_OFF_BY_DEFAULT (1<<3) /** If you add your own flags, make them start at this point. */ -#define TT_FIRST_USER_FLAG (1<<4) +#define TT_FIRST_USER_FLAG (1<<3) typedef void (*testcase_fn)(void *); @@ -66,12 +64,6 @@ struct testgroup_t { }; #define END_OF_GROUPS { NULL, NULL} -struct testlist_alias_t { - const char *name; - const char **tests; -}; -#define END_OF_ALIASES { NULL, NULL } - /** Implementation: called from a test to indicate failure, before logging. */ void tinytest_set_test_failed_(void); /** Implementation: called from a test to indicate that we're skipping. */ @@ -80,19 +72,14 @@ void tinytest_set_test_skipped_(void); int tinytest_get_verbosity_(void); /** Implementation: Set a flag on tests matching a name; returns number * of tests that matched. */ -int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long); -/** Implementation: Put a chunk of memory into hex. */ -char *tinytest_format_hex_(const void *, unsigned long); +int tinytest_set_flag_(struct testgroup_t *, const char *, unsigned long); /** Set all tests in 'groups' matching the name 'named' to be skipped. */ #define tinytest_skip(groups, named) \ - tinytest_set_flag_(groups, named, 1, TT_SKIP) + tinytest_set_flag_(groups, named, TT_SKIP) /** Run a single testcase in a single group. */ int testcase_run_one(const struct testgroup_t *,const struct testcase_t *); - -void tinytest_set_aliases(const struct testlist_alias_t *aliases); - /** Run a set of testcases from an END_OF_GROUPS-terminated array of groups, as selected from the command line. */ int tinytest_main(int argc, const char **argv, struct testgroup_t *groups); diff --git a/src/tor/src/ext/tinytest_macros.h b/src/tor/tinytest_macros.h similarity index 86% rename from src/tor/src/ext/tinytest_macros.h rename to src/tor/tinytest_macros.h index c3728d1fd..9ff69b1d5 100644 --- a/src/tor/src/ext/tinytest_macros.h +++ b/src/tor/tinytest_macros.h @@ -113,8 +113,8 @@ #define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \ setup_block,cleanup_block,die_on_fail) \ TT_STMT_BEGIN \ - type val1_ = (a); \ - type val2_ = (b); \ + type val1_ = (type)(a); \ + type val2_ = (type)(b); \ int tt_status_ = (test); \ if (!tt_status_ || tinytest_get_verbosity_()>1) { \ printf_type print_; \ @@ -144,10 +144,6 @@ tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ {print_=value_;},{},die_on_fail) -#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail) \ - tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \ - {print_=value_?value_:"";},{},die_on_fail) - /* Helper: assert that a op b, when cast to type. Format the values with * printf format fmt on failure. */ #define tt_assert_op_type(a,op,b,type,fmt) \ @@ -163,23 +159,12 @@ (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION) #define tt_ptr_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \ + tt_assert_test_type(a,b,#a" "#op" "#b,void*, \ (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION) #define tt_str_op(a,op,b) \ - tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *, \ - (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>", \ - TT_EXIT_TEST_FUNCTION) - -#define tt_mem_op(expr1, op, expr2, len) \ - tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \ - const void *, \ - (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \ - char *, "%s", \ - { print_ = tinytest_format_hex_(value_, (len)); }, \ - { if (print_) free(print_); }, \ - TT_EXIT_TEST_FUNCTION \ - ); + tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \ + (strcmp(val1_,val2_) op 0),"<%s>",TT_EXIT_TEST_FUNCTION) #define tt_want_int_op(a,op,b) \ tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0) @@ -189,7 +174,7 @@ (val1_ op val2_),"%lu",(void)0) #define tt_want_ptr_op(a,op,b) \ - tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \ + tt_assert_test_type(a,b,#a" "#op" "#b,void*, \ (val1_ op val2_),"%p",(void)0) #define tt_want_str_op(a,op,b) \ diff --git a/src/tor/src/common/compat.h b/src/tor/tor_compat.h similarity index 75% rename from src/tor/src/common/compat.h rename to src/tor/tor_compat.h index 0aabee68c..8e700a9a1 100644 --- a/src/tor/src/common/compat.h +++ b/src/tor/tor_compat.h @@ -1,18 +1,26 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_H #define TOR_COMPAT_H #include "orconfig.h" +#include "torint.h" +#include "testsupport.h" #ifdef _WIN32 +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) && (_MSC_VER < 1300) +#include +#else #include #include #endif -#include "torint.h" -#include "testsupport.h" +#endif #ifdef HAVE_SYS_PARAM_H #include #endif @@ -28,6 +36,9 @@ #ifdef HAVE_STRING_H #include #endif +#if defined(HAVE_PTHREAD_H) && !defined(_WIN32) +#include +#endif #include #ifdef HAVE_SYS_RESOURCE_H #include @@ -42,20 +53,24 @@ #include #endif -#include "compat_time.h" - -#if defined(__has_feature) -# if __has_feature(address_sanitizer) -/* Some of the fancy glibc strcmp() macros include references to memory that - * clang rejects because it is off the end of a less-than-3. Clang hates this, - * even though those references never actually happen. */ -# undef strcmp -#endif /* __has_feature(address_sanitizer) */ -#endif /* defined(__has_feature) */ - #include #include +#if defined (WINCE) +#include +#include +#include +#include +/* this is not exported as W .... */ +#define SHGetPathFromIDListW SHGetPathFromIDList +/* wcecompat has vasprintf */ +#define HAVE_VASPRINTF +/* no service here */ +#ifdef NT_SERVICE +#undef NT_SERVICE +#endif +#endif // WINCE + #ifndef NULL_REP_IS_ZERO_BYTES #error "It seems your platform does not represent NULL as zero. We can't cope." #endif @@ -76,61 +91,30 @@ __attribute__ ((format(printf, formatIdx, firstArg))) #else #define CHECK_PRINTF(formatIdx, firstArg) -#endif /* defined(__GNUC__) */ +#endif #ifdef __GNUC__ #define CHECK_SCANF(formatIdx, firstArg) \ __attribute__ ((format(scanf, formatIdx, firstArg))) #else #define CHECK_SCANF(formatIdx, firstArg) -#endif /* defined(__GNUC__) */ - -/* What GCC do we have? */ -#ifdef __GNUC__ -#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -#else -#define GCC_VERSION 0 #endif -/* Temporarily enable and disable warnings. */ -#ifdef __GNUC__ -# define PRAGMA_STRINGIFY_(s) #s -# define PRAGMA_JOIN_STRINGIFY_(a,b) PRAGMA_STRINGIFY_(a ## b) -/* Support for macro-generated pragmas (c99) */ -# define PRAGMA_(x) _Pragma (#x) -# ifdef __clang__ -# define PRAGMA_DIAGNOSTIC_(x) PRAGMA_(clang diagnostic x) -# else -# define PRAGMA_DIAGNOSTIC_(x) PRAGMA_(GCC diagnostic x) -# endif -# if defined(__clang__) || GCC_VERSION >= 406 -/* we have push/pop support */ -# define DISABLE_GCC_WARNING(warningopt) \ - PRAGMA_DIAGNOSTIC_(push) \ - PRAGMA_DIAGNOSTIC_(ignored PRAGMA_JOIN_STRINGIFY_(-W,warningopt)) -# define ENABLE_GCC_WARNING(warningopt) \ - PRAGMA_DIAGNOSTIC_(pop) -#else /* !(defined(__clang__) || GCC_VERSION >= 406) */ -/* older version of gcc: no push/pop support. */ -# define DISABLE_GCC_WARNING(warningopt) \ - PRAGMA_DIAGNOSTIC_(ignored PRAGMA_JOIN_STRINGIFY_(-W,warningopt)) -# define ENABLE_GCC_WARNING(warningopt) \ - PRAGMA_DIAGNOSTIC_(warning PRAGMA_JOIN_STRINGIFY_(-W,warningopt)) -#endif /* defined(__clang__) || GCC_VERSION >= 406 */ -#else /* !(defined(__GNUC__)) */ -/* not gcc at all */ -# define DISABLE_GCC_WARNING(warning) -# define ENABLE_GCC_WARNING(warning) -#endif /* defined(__GNUC__) */ - /* inline is __inline on windows. */ #ifdef _WIN32 -#define inline __inline +#define INLINE __inline +#else +#define INLINE inline #endif /* Try to get a reasonable __func__ substitute in place. */ #if defined(_MSC_VER) - +/* MSVC compilers before VC7 don't have __func__ at all; later ones call it + * __FUNCTION__. */ +#if _MSC_VER < 1300 +#define __func__ "???" +#else #define __func__ __FUNCTION__ +#endif #else /* For platforms where autoconf works, make sure __func__ is defined @@ -142,12 +126,22 @@ #define __func__ __FUNC__ #else #define __func__ "???" -#endif /* defined(HAVE_MACRO__FUNCTION__) || ... */ -#endif /* !defined(HAVE_MACRO__func__) */ -#endif /* defined(_MSC_VER) */ +#endif +#endif /* ifndef MAVE_MACRO__func__ */ +#endif /* if not windows */ +#if defined(_MSC_VER) && (_MSC_VER < 1300) +/* MSVC versions before 7 apparently don't believe that you can cast uint64_t + * to double and really mean it. */ +extern INLINE double U64_TO_DBL(uint64_t x) { + int64_t i = (int64_t) x; + return (i < 0) ? ((double) INT64_MAX) : (double) i; +} +#define DBL_TO_U64(x) ((uint64_t)(int64_t) (x)) +#else #define U64_TO_DBL(x) ((double) (x)) #define DBL_TO_U64(x) ((uint64_t) (x)) +#endif #ifdef ENUM_VALS_ARE_SIGNED #define ENUM_BF(t) unsigned @@ -157,7 +151,7 @@ * problems), but if enumerated types are unsigned, we must use unsigned, * so that the loss of precision doesn't make large values negative. */ #define ENUM_BF(t) t -#endif /* defined(ENUM_VALS_ARE_SIGNED) */ +#endif /* GCC has several useful attributes. */ #if defined(__GNUC__) && __GNUC__ >= 3 @@ -165,7 +159,6 @@ #define ATTR_CONST __attribute__((const)) #define ATTR_MALLOC __attribute__((malloc)) #define ATTR_NORETURN __attribute__((noreturn)) -#define ATTR_WUR __attribute__((warn_unused_result)) /* Alas, nonnull is not at present a good idea for us. We'd like to get * warnings when we pass NULL where we shouldn't (which nonnull does, albeit * spottily), but we don't want to tell the compiler to make optimizations @@ -176,7 +169,6 @@ * * #define ATTR_NONNULL(x) __attribute__((nonnull x)) */ #define ATTR_NONNULL(x) -#define ATTR_UNUSED __attribute__ ((unused)) /** Macro: Evaluates to exp and hints the compiler that the value * of exp will probably be true. @@ -194,17 +186,15 @@ * taken. This can generate slightly better code with some CPUs. */ #define PREDICT_UNLIKELY(exp) __builtin_expect(!!(exp), 0) -#else /* !(defined(__GNUC__) && __GNUC__ >= 3) */ +#else #define ATTR_NORETURN #define ATTR_CONST #define ATTR_MALLOC #define ATTR_NORETURN #define ATTR_NONNULL(x) -#define ATTR_UNUSED -#define ATTR_WUR #define PREDICT_LIKELY(exp) (exp) #define PREDICT_UNLIKELY(exp) (exp) -#endif /* defined(__GNUC__) && __GNUC__ >= 3 */ +#endif /** Expands to a syntactically valid empty statement. */ #define STMT_NIL (void)0 @@ -224,16 +214,7 @@ #else #define STMT_BEGIN do { #define STMT_END } while (0) -#endif /* defined(__GNUC__) || ... */ - -/* Some tools (like coccinelle) don't like to see operators as macro - * arguments. */ -#define OP_LT < -#define OP_GT > -#define OP_GE >= -#define OP_LE <= -#define OP_EQ == -#define OP_NE != +#endif /* ===== String compatibility */ #ifdef _WIN32 @@ -241,18 +222,6 @@ #define strncasecmp _strnicmp #define strcasecmp _stricmp #endif - -#if defined __APPLE__ -/* On OSX 10.9 and later, the overlap-checking code for strlcat would - * appear to have a severe bug that can sometimes cause aborts in Tor. - * Instead, use the non-checking variants. This is sad. - * - * See https://trac.torproject.org/projects/tor/ticket/15205 - */ -#undef strlcat -#undef strlcpy -#endif /* defined __APPLE__ */ - #ifndef HAVE_STRLCAT size_t strlcat(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2)); #endif @@ -272,28 +241,24 @@ size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2)); #define I64_PRINTF_ARG(a) (a) #define I64_SCANF_ARG(a) (a) #define I64_LITERAL(n) (n ## i64) -#else /* !(defined(_MSC_VER)) */ +#else #define U64_PRINTF_ARG(a) ((long long unsigned int)(a)) #define U64_SCANF_ARG(a) ((long long unsigned int*)(a)) #define U64_LITERAL(n) (n ## llu) #define I64_PRINTF_ARG(a) ((long long signed int)(a)) #define I64_SCANF_ARG(a) ((long long signed int*)(a)) #define I64_LITERAL(n) (n ## ll) -#endif /* defined(_MSC_VER) */ - -#if defined(__MINGW32__) || defined(__MINGW64__) -#define MINGW_ANY #endif -#if defined(_MSC_VER) || defined(MINGW_ANY) +#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) /** The formatting string used to put a uint64_t value in a printf() or * scanf() function. See also U64_PRINTF_ARG and U64_SCANF_ARG. */ #define U64_FORMAT "%I64u" #define I64_FORMAT "%I64d" -#else /* !(defined(_MSC_VER) || defined(MINGW_ANY)) */ +#else #define U64_FORMAT "%llu" #define I64_FORMAT "%lld" -#endif /* defined(_MSC_VER) || defined(MINGW_ANY) */ +#endif #if (SIZEOF_INTPTR_T == SIZEOF_INT) #define INTPTR_T_FORMAT "%d" @@ -306,7 +271,7 @@ size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2)); #define INTPTR_PRINTF_ARG(x) I64_PRINTF_ARG(x) #else #error Unknown: SIZEOF_INTPTR_T -#endif /* (SIZEOF_INTPTR_T == SIZEOF_INT) || ... */ +#endif /** Represents an mmaped file. Allocated via tor_mmap_file; freed with * tor_munmap_file. */ @@ -320,12 +285,12 @@ typedef struct tor_mmap_t { * size, rounded up to the nearest page.) */ #elif defined _WIN32 HANDLE mmap_handle; -#endif /* defined(HAVE_SYS_MMAN_H) || ... */ +#endif } tor_mmap_t; tor_mmap_t *tor_mmap_file(const char *filename) ATTR_NONNULL((1)); -int tor_munmap_file(tor_mmap_t *handle) ATTR_NONNULL((1)); +void tor_munmap_file(tor_mmap_t *handle) ATTR_NONNULL((1)); int tor_snprintf(char *str, size_t size, const char *format, ...) CHECK_PRINTF(3,4) ATTR_NONNULL((1,3)); @@ -341,7 +306,7 @@ const void *tor_memmem(const void *haystack, size_t hlen, const void *needle, size_t nlen) ATTR_NONNULL((1,3)); static const void *tor_memstr(const void *haystack, size_t hlen, const char *needle) ATTR_NONNULL((1,3)); -static inline const void * +static INLINE const void * tor_memstr(const void *haystack, size_t hlen, const char *needle) { return tor_memmem(haystack, hlen, needle, strlen(needle)); @@ -352,9 +317,9 @@ tor_memstr(const void *haystack, size_t hlen, const char *needle) #define DECLARE_CTYPE_FN(name) \ static int TOR_##name(char c); \ extern const uint32_t TOR_##name##_TABLE[]; \ - static inline int TOR_##name(char c) { \ + static INLINE int TOR_##name(char c) { \ uint8_t u = c; \ - return !!(TOR_##name##_TABLE[(u >> 5) & 7] & (1u << (u & 31))); \ + return !!(TOR_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \ } DECLARE_CTYPE_FN(ISALPHA) DECLARE_CTYPE_FN(ISALNUM) @@ -364,8 +329,8 @@ DECLARE_CTYPE_FN(ISXDIGIT) DECLARE_CTYPE_FN(ISPRINT) DECLARE_CTYPE_FN(ISLOWER) DECLARE_CTYPE_FN(ISUPPER) -extern const uint8_t TOR_TOUPPER_TABLE[]; -extern const uint8_t TOR_TOLOWER_TABLE[]; +extern const char TOR_TOUPPER_TABLE[]; +extern const char TOR_TOLOWER_TABLE[]; #define TOR_TOLOWER(c) (TOR_TOLOWER_TABLE[(uint8_t)c]) #define TOR_TOUPPER(c) (TOR_TOUPPER_TABLE[(uint8_t)c]) @@ -382,9 +347,18 @@ const char *tor_fix_source_file(const char *fname); #else #define SHORT_FILE__ (__FILE__) #define tor_fix_source_file(s) (s) -#endif /* defined(_WIN32) */ +#endif /* ===== Time compatibility */ +#if !defined(HAVE_GETTIMEOFDAY) && !defined(HAVE_STRUCT_TIMEVAL_TV_SEC) +/** Implementation of timeval for platforms that don't have it. */ +struct timeval { + time_t tv_sec; + unsigned int tv_usec; +}; +#endif + +void tor_gettimeofday(struct timeval *timeval); struct tm *tor_localtime_r(const time_t *timep, struct tm *result); struct tm *tor_gmtime_r(const time_t *timep, struct tm *result); @@ -401,7 +375,7 @@ struct tm *tor_gmtime_r(const time_t *timep, struct tm *result); (tvout)->tv_sec++; \ } \ } while (0) -#endif /* !defined(timeradd) */ +#endif #ifndef timersub /** Replacement for timersub on platforms that do not have it: sets tvout to @@ -415,13 +389,13 @@ struct tm *tor_gmtime_r(const time_t *timep, struct tm *result); (tvout)->tv_sec--; \ } \ } while (0) -#endif /* !defined(timersub) */ +#endif #ifndef timercmp -/** Replacement for timercmp on platforms that do not have it: returns true +/** Replacement for timersub on platforms that do not have it: returns true * iff the relational operator "op" makes the expression tv1 op tv2 true. * - * Note that while this definition should work for all boolean operators, some + * Note that while this definition should work for all boolean opeators, some * platforms' native timercmp definitions do not support >=, <=, or ==. So * don't use those. */ @@ -429,12 +403,11 @@ struct tm *tor_gmtime_r(const time_t *timep, struct tm *result); (((tv1)->tv_sec == (tv2)->tv_sec) ? \ ((tv1)->tv_usec op (tv2)->tv_usec) : \ ((tv1)->tv_sec op (tv2)->tv_sec)) -#endif /* !defined(timercmp) */ +#endif /* ===== File compatibility */ int tor_open_cloexec(const char *path, int flags, unsigned mode); FILE *tor_fopen_cloexec(const char *path, const char *mode); -int tor_rename(const char *path_old, const char *path_new); int replace_file(const char *from, const char *to); int touch_file(const char *fname); @@ -447,9 +420,6 @@ void tor_lockfile_unlock(tor_lockfile_t *lockfile); off_t tor_fd_getpos(int fd); int tor_fd_setpos(int fd, off_t pos); int tor_fd_seekend(int fd); -int tor_ftruncate(int fd); - -int64_t tor_get_avail_disk_space(const char *path); #ifdef _WIN32 #define PATH_SEPARATOR "\\" @@ -465,13 +435,13 @@ typedef int socklen_t; #ifdef _WIN32 /* XXX Actually, this should arguably be SOCKET; we use intptr_t here so that - * any inadvertent checks for the socket being <= 0 or > 0 will probably + * any inadvertant checks for the socket being <= 0 or > 0 will probably * still work. */ #define tor_socket_t intptr_t #define TOR_SOCKET_T_FORMAT INTPTR_T_FORMAT #define SOCKET_OK(s) ((SOCKET)(s) != INVALID_SOCKET) #define TOR_INVALID_SOCKET INVALID_SOCKET -#else /* !(defined(_WIN32)) */ +#else /** Type used for a network socket. */ #define tor_socket_t int #define TOR_SOCKET_T_FORMAT "%d" @@ -479,16 +449,14 @@ typedef int socklen_t; #define SOCKET_OK(s) ((s) >= 0) /** Error/uninitialized value for a tor_socket_t. */ #define TOR_INVALID_SOCKET (-1) -#endif /* defined(_WIN32) */ +#endif int tor_close_socket_simple(tor_socket_t s); -MOCK_DECL(int, tor_close_socket, (tor_socket_t s)); -void tor_take_socket_ownership(tor_socket_t s); +int tor_close_socket(tor_socket_t s); tor_socket_t tor_open_socket_with_extensions( int domain, int type, int protocol, int cloexec, int nonblock); -MOCK_DECL(tor_socket_t, -tor_open_socket,(int domain, int type, int protocol)); +tor_socket_t tor_open_socket(int domain, int type, int protocol); tor_socket_t tor_open_socket_nonblocking(int domain, int type, int protocol); tor_socket_t tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len); @@ -499,15 +467,8 @@ tor_socket_t tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len, int cloexec, int nonblock); -MOCK_DECL(tor_socket_t, -tor_connect_socket,(tor_socket_t socket,const struct sockaddr *address, - socklen_t address_len)); int get_n_open_sockets(void); -MOCK_DECL(int, -tor_getsockname,(tor_socket_t socket, struct sockaddr *address, - socklen_t *address_len)); - #define tor_socket_send(s, buf, len, flags) send(s, buf, len, flags) #define tor_socket_recv(s, buf, len, flags) recv(s, buf, len, flags) @@ -527,19 +488,19 @@ struct in6_addr #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32 }; -#endif /* !defined(HAVE_STRUCT_IN6_ADDR) */ +#endif /** @{ */ /** Many BSD variants seem not to define these. */ -#if defined(__APPLE__) || defined(__darwin__) || \ - defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +#if defined(__APPLE__) || defined(__darwin__) || defined(__FreeBSD__) \ + || defined(__NetBSD__) || defined(__OpenBSD__) #ifndef s6_addr16 #define s6_addr16 __u6_addr.__u6_addr16 #endif #ifndef s6_addr32 #define s6_addr32 __u6_addr.__u6_addr32 #endif -#endif /* defined(__APPLE__) || defined(__darwin__) || ... */ +#endif /** @} */ #ifndef HAVE_SA_FAMILY_T @@ -571,13 +532,12 @@ struct sockaddr_in6 { struct in6_addr sin6_addr; // uint32_t sin6_scope_id; }; -#endif /* !defined(HAVE_STRUCT_SOCKADDR_IN6) */ +#endif -MOCK_DECL(int,tor_gethostname,(char *name, size_t namelen)); int tor_inet_aton(const char *cp, struct in_addr *addr) ATTR_NONNULL((1,2)); const char *tor_inet_ntop(int af, const void *src, char *dst, size_t len); int tor_inet_pton(int af, const char *src, void *dst); -MOCK_DECL(int,tor_lookup_hostname,(const char *name, uint32_t *addr)); +int tor_lookup_hostname(const char *name, uint32_t *addr) ATTR_NONNULL((1,2)); int set_socket_nonblocking(tor_socket_t socket); int tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]); int network_init(void); @@ -604,33 +564,29 @@ int network_init(void); #define ERRNO_IS_ACCEPT_EAGAIN(e) ERRNO_IS_EAGAIN(e) /** Return true if e is EMFILE or another error indicating that a call to * accept() has failed because we're out of fds or something. */ -#define ERRNO_IS_RESOURCE_LIMIT(e) \ +#define ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e) \ ((e) == WSAEMFILE || (e) == WSAENOBUFS) /** Return true if e is EADDRINUSE or the local equivalent. */ #define ERRNO_IS_EADDRINUSE(e) ((e) == WSAEADDRINUSE) -/** Return true if e is EINTR or the local equivalent */ -#define ERRNO_IS_EINTR(e) ((e) == WSAEINTR || 0) int tor_socket_errno(tor_socket_t sock); const char *tor_socket_strerror(int e); -#else /* !(defined(_WIN32)) */ +#else #define SOCK_ERRNO(e) e #if EAGAIN == EWOULDBLOCK -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN || 0) +#define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN) #else #define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN || (e) == EWOULDBLOCK) -#endif /* EAGAIN == EWOULDBLOCK */ -#define ERRNO_IS_EINTR(e) ((e) == EINTR || 0) -#define ERRNO_IS_EINPROGRESS(e) ((e) == EINPROGRESS || 0) -#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS || 0) +#endif +#define ERRNO_IS_EINPROGRESS(e) ((e) == EINPROGRESS) +#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS) #define ERRNO_IS_ACCEPT_EAGAIN(e) \ (ERRNO_IS_EAGAIN(e) || (e) == ECONNABORTED) -#define ERRNO_IS_RESOURCE_LIMIT(e) \ +#define ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e) \ ((e) == EMFILE || (e) == ENFILE || (e) == ENOBUFS || (e) == ENOMEM) -#define ERRNO_IS_EADDRINUSE(e) (((e) == EADDRINUSE) || 0) +#define ERRNO_IS_EADDRINUSE(e) ((e) == EADDRINUSE) #define tor_socket_errno(sock) (errno) #define tor_socket_strerror(e) strerror(e) -#endif /* defined(_WIN32) */ +#endif /** Specified SOCKS5 status codes. */ typedef enum { @@ -646,7 +602,7 @@ typedef enum { } socks5_reply_status_t; /* ===== OS compatibility */ -MOCK_DECL(const char *, get_uname, (void)); +const char *get_uname(void); uint16_t get_uint16(const void *cp) ATTR_NONNULL((1)); uint32_t get_uint32(const void *cp) ATTR_NONNULL((1)); @@ -658,7 +614,7 @@ void set_uint64(void *cp, uint64_t v) ATTR_NONNULL((1)); /* These uint8 variants are defined to make the code more uniform. */ #define get_uint8(cp) (*(const uint8_t*)(cp)) static void set_uint8(void *cp, uint8_t v); -static inline void +static INLINE void set_uint8(void *cp, uint8_t v) { *(uint8_t*)cp = v; @@ -667,41 +623,89 @@ set_uint8(void *cp, uint8_t v) #if !defined(HAVE_RLIM_T) typedef unsigned long rlim_t; #endif -int get_max_sockets(void); int set_max_file_descriptors(rlim_t limit, int *max); int tor_disable_debugger_attach(void); - -#if defined(HAVE_SYS_CAPABILITY_H) && defined(HAVE_CAP_SET_PROC) -#define HAVE_LINUX_CAPABILITIES -#endif - -int have_capability_support(void); - -/** Flag for switch_id; see switch_id() for documentation */ -#define SWITCH_ID_KEEP_BINDLOW (1<<0) -/** Flag for switch_id; see switch_id() for documentation */ -#define SWITCH_ID_WARN_IF_NO_CAPS (1<<1) -int switch_id(const char *user, unsigned flags); +int switch_id(const char *user); #ifdef HAVE_PWD_H char *get_user_homedir(const char *username); #endif -#ifndef _WIN32 -const struct passwd *tor_getpwnam(const char *username); -const struct passwd *tor_getpwuid(uid_t uid); -#endif - int get_parent_directory(char *fname); char *make_path_absolute(char *fname); char **get_environment(void); -int get_total_system_memory(size_t *mem_out); +int spawn_func(void (*func)(void *), void *data); +void spawn_exit(void) ATTR_NORETURN; + +#if defined(ENABLE_THREADS) && defined(_WIN32) +#define USE_WIN32_THREADS +#define TOR_IS_MULTITHREADED 1 +#elif (defined(ENABLE_THREADS) && defined(HAVE_PTHREAD_H) && \ + defined(HAVE_PTHREAD_CREATE)) +#define USE_PTHREADS +#define TOR_IS_MULTITHREADED 1 +#else +#undef TOR_IS_MULTITHREADED +#endif int compute_num_cpus(void); +/* Because we use threads instead of processes on most platforms (Windows, + * Linux, etc), we need locking for them. On platforms with poor thread + * support or broken gethostbyname_r, these functions are no-ops. */ + +/** A generic lock structure for multithreaded builds. */ +typedef struct tor_mutex_t { +#if defined(USE_WIN32_THREADS) + /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */ + CRITICAL_SECTION mutex; +#elif defined(USE_PTHREADS) + /** Pthreads-only: with pthreads, we implement locks with + * pthread_mutex_t. */ + pthread_mutex_t mutex; +#else + /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */ + int _unused; +#endif +} tor_mutex_t; + int tor_mlockall(void); +#ifdef TOR_IS_MULTITHREADED +tor_mutex_t *tor_mutex_new(void); +void tor_mutex_init(tor_mutex_t *m); +void tor_mutex_acquire(tor_mutex_t *m); +void tor_mutex_release(tor_mutex_t *m); +void tor_mutex_free(tor_mutex_t *m); +void tor_mutex_uninit(tor_mutex_t *m); +unsigned long tor_get_thread_id(void); +void tor_threads_init(void); +#else +#define tor_mutex_new() ((tor_mutex_t*)tor_malloc(sizeof(int))) +#define tor_mutex_init(m) STMT_NIL +#define tor_mutex_acquire(m) STMT_VOID(m) +#define tor_mutex_release(m) STMT_NIL +#define tor_mutex_free(m) STMT_BEGIN tor_free(m); STMT_END +#define tor_mutex_uninit(m) STMT_NIL +#define tor_get_thread_id() (1UL) +#define tor_threads_init() STMT_NIL +#endif + +void set_main_thread(void); +int in_main_thread(void); + +#ifdef TOR_IS_MULTITHREADED +#if 0 +typedef struct tor_cond_t tor_cond_t; +tor_cond_t *tor_cond_new(void); +void tor_cond_free(tor_cond_t *cond); +int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex); +void tor_cond_signal_one(tor_cond_t *cond); +void tor_cond_signal_all(tor_cond_t *cond); +#endif +#endif + /** Macros for MIN/MAX. Never use these when the arguments could have * side-effects. * {With GCC extensions we could probably define a safer MIN/MAX. But @@ -733,7 +737,7 @@ char *format_win32_error(DWORD err); #define VER_SUITE_SINGLEUSERTS 0x00000100 #endif -#endif /* defined(_WIN32) */ +#endif #ifdef COMPAT_PRIVATE #if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS) @@ -741,12 +745,7 @@ char *format_win32_error(DWORD err); STATIC int tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2]); #endif -#endif /* defined(COMPAT_PRIVATE) */ - -ssize_t tor_getpass(const char *prompt, char *output, size_t buflen); - -/* This needs some of the declarations above so we include it here. */ -#include "compat_threads.h" +#endif -#endif /* !defined(TOR_COMPAT_H) */ +#endif diff --git a/src/tor/src/ext/tor_queue.h b/src/tor/tor_queue.h similarity index 95% rename from src/tor/src/ext/tor_queue.h rename to src/tor/tor_queue.h index a6530c2b9..f05e48c18 100644 --- a/src/tor/src/ext/tor_queue.h +++ b/src/tor/tor_queue.h @@ -109,8 +109,7 @@ struct { \ */ #define TOR_SLIST_FIRST(head) ((head)->slh_first) #define TOR_SLIST_END(head) NULL -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define TOR_SLIST_EMPTY(head) ((SLIST_FIRST(head) == TOR_SLIST_END(head)) || 0) +#define TOR_SLIST_EMPTY(head) (SLIST_FIRST(head) == TOR_SLIST_END(head)) #define TOR_SLIST_NEXT(elm, field) ((elm)->field.sle_next) #define TOR_SLIST_FOREACH(var, head, field) \ @@ -182,11 +181,9 @@ struct { \ /* * List access methods */ -#define TOR_LIST_FIRST(head) ((head)->lh_first) -#define TOR_LIST_END(head) NULL -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define TOR_LIST_EMPTY(head) \ - ((TOR_LIST_FIRST(head) == TOR_LIST_END(head)) || 0) +#define TOR_LIST_FIRST(head) ((head)->lh_first) +#define TOR_LIST_END(head) NULL +#define TOR_LIST_EMPTY(head) (TOR_LIST_FIRST(head) == TOR_LIST_END(head)) #define TOR_LIST_NEXT(elm, field) ((elm)->field.le_next) #define TOR_LIST_FOREACH(var, head, field) \ @@ -268,10 +265,8 @@ struct { \ * Simple queue access methods. */ #define TOR_SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define TOR_SIMPLEQ_END(head) NULL -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ -#define TOR_SIMPLEQ_EMPTY(head) \ - ((TOR_SIMPLEQ_FIRST(head) == TOR_SIMPLEQ_END(head)) || 0) +#define TOR_SIMPLEQ_END(head) NULL +#define TOR_SIMPLEQ_EMPTY(head) (TOR_SIMPLEQ_FIRST(head) == TOR_SIMPLEQ_END(head)) #define TOR_SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) #define TOR_SIMPLEQ_FOREACH(var, head, field) \ @@ -350,9 +345,8 @@ struct { \ /* XXX */ #define TOR_TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ #define TOR_TAILQ_EMPTY(head) \ - ((TOR_TAILQ_FIRST(head) == TOR_TAILQ_END(head)) || 0) + (TOR_TAILQ_FIRST(head) == TOR_TAILQ_END(head)) #define TOR_TAILQ_FOREACH(var, head, field) \ for((var) = TOR_TAILQ_FIRST(head); \ @@ -468,9 +462,8 @@ struct { \ #define TOR_CIRCLEQ_END(head) ((void *)(head)) #define TOR_CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) #define TOR_CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) -/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */ #define TOR_CIRCLEQ_EMPTY(head) \ - ((TOR_CIRCLEQ_FIRST(head) == TOR_CIRCLEQ_END(head)) || 0) + (TOR_CIRCLEQ_FIRST(head) == TOR_CIRCLEQ_END(head)) #define TOR_CIRCLEQ_FOREACH(var, head, field) \ for((var) = TOR_CIRCLEQ_FIRST(head); \ diff --git a/src/tor/src/common/util.c b/src/tor/tor_util.c similarity index 73% rename from src/tor/src/common/util.c rename to src/tor/tor_util.c index 67e97811c..1aa26f66a 100644 --- a/src/tor/src/common/util.c +++ b/src/tor/tor_util.c @@ -1,20 +1,24 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** - * \file util.c + * \file tor_util.c * \brief Common functions for strings, IO, network, data structures, * process control. **/ +/* This is required on rh7 to make strptime not complain. + */ +#define _GNU_SOURCE + #include "orconfig.h" #ifdef HAVE_FCNTL_H #include #endif #define UTIL_PRIVATE -#include "util.h" +#include "tor_util.h" #include "torlog.h" #include "crypto.h" #include "torint.h" @@ -22,8 +26,6 @@ #include "address.h" #include "sandbox.h" #include "backtrace.h" -#include "util_process.h" -#include "util_format.h" #ifdef _WIN32 #include @@ -31,11 +33,11 @@ #include #include #include -#else /* !(defined(_WIN32)) */ +#else #include #include #include -#endif /* defined(_WIN32) */ +#endif /* math.h needs this on Linux */ #ifndef _USE_ISOC99_ @@ -79,26 +81,36 @@ #include #endif #ifdef HAVE_MALLOC_H -#if !defined(OpenBSD) && !defined(__FreeBSD__) +#if !defined(OPENBSD) && !defined(__FreeBSD__) /* OpenBSD has a malloc.h, but for our purposes, it only exists in order to * scold us for being so stupid as to autodetect its presence. To be fair, * they've done this since 1996, when autoconf was only 5 years old. */ #include -#endif /* !defined(OpenBSD) && !defined(__FreeBSD__) */ -#endif /* defined(HAVE_MALLOC_H) */ +#endif +#endif #ifdef HAVE_MALLOC_NP_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif -#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) -#include -#endif -#ifdef __clang_analyzer__ -#undef MALLOC_ZERO_WORKS -#endif +/* ===== + * Assertion helper. + * ===== */ +/** Helper for tor_assert: report the assertion failure. */ +void +tor_assertion_failed_(const char *fname, unsigned int line, + const char *func, const char *expr) +{ + char buf[256]; + log_err(LD_BUG, "%s:%u: %s: Assertion %s failed; aborting.", + fname, line, func, expr); + tor_snprintf(buf, sizeof(buf), + "Assertion %s failed in %s at %s:%u", + expr, func, fname, line); + log_backtrace(LOG_ERR, LD_BUG, buf); +} /* ===== * Memory management @@ -116,12 +128,12 @@ dmalloc_strndup(file, line, (string), -1, xalloc_b) #else #error "No dmalloc_strdup or equivalent" -#endif /* defined(HAVE_DMALLOC_STRDUP) || ... */ + #endif -#else /* !(defined(USE_DMALLOC)) */ +#else /* not using dmalloc */ #define DMALLOC_FN_ARGS -#endif /* defined(USE_DMALLOC) */ +#endif /** Allocate a chunk of size bytes of memory, and return a pointer to * result. On error, log and terminate the process. (Same as malloc(size), @@ -142,22 +154,20 @@ tor_malloc_(size_t size DMALLOC_PARAMS) if (size==0) { size=1; } -#endif /* !defined(MALLOC_ZERO_WORKS) */ +#endif #ifdef USE_DMALLOC result = dmalloc_malloc(file, line, size, DMALLOC_FUNC_MALLOC, 0, 0); #else - result = raw_malloc(size); + result = malloc(size); #endif if (PREDICT_UNLIKELY(result == NULL)) { - /* LCOV_EXCL_START */ log_err(LD_MM,"Out of memory on malloc(). Dying."); /* If these functions die within a worker process, they won't call * spawn_exit, but that's ok, since the parent will run out of memory soon * anyway. */ - exit(1); // exit ok: alloc failed. - /* LCOV_EXCL_STOP */ + exit(1); } return result; } @@ -180,41 +190,33 @@ tor_malloc_zero_(size_t size DMALLOC_PARAMS) return result; } -/* The square root of SIZE_MAX + 1. If a is less than this, and b is less - * than this, then a*b is less than SIZE_MAX. (For example, if size_t is - * 32 bits, then SIZE_MAX is 0xffffffff and this value is 0x10000. If a and - * b are less than this, then their product is at most (65535*65535) == - * 0xfffe0001. */ -#define SQRT_SIZE_MAX_P1 (((size_t)1) << (sizeof(size_t)*4)) - -/** Return non-zero if and only if the product of the arguments is exact, - * and cannot overflow. */ -int -size_mul_check(const size_t x, const size_t y) -{ - /* This first check is equivalent to - (x < SQRT_SIZE_MAX_P1 && y < SQRT_SIZE_MAX_P1) - - Rationale: if either one of x or y is >= SQRT_SIZE_MAX_P1, then it - will have some bit set in its most significant half. - */ - return ((x|y) < SQRT_SIZE_MAX_P1 || - y == 0 || - x <= SIZE_MAX / y); -} - /** Allocate a chunk of nmemb*size bytes of memory, fill * the memory with zero bytes, and return a pointer to the result. * Log and terminate the process on error. (Same as * calloc(nmemb,size), but never returns NULL.) - * The second argument (size) should preferably be non-zero - * and a compile-time constant. + * + * XXXX This implementation probably asserts in cases where it could + * work, because it only tries dividing SIZE_MAX by size (according to + * the calloc(3) man page, the size of an element of the nmemb-element + * array to be allocated), not by nmemb (which could in theory be + * smaller than size). Don't do that then. */ void * tor_calloc_(size_t nmemb, size_t size DMALLOC_PARAMS) { - tor_assert(size_mul_check(nmemb, size)); - return tor_malloc_zero_((nmemb * size) DMALLOC_FN_ARGS); + /* You may ask yourself, "wouldn't it be smart to use calloc instead of + * malloc+memset? Perhaps libc's calloc knows some nifty optimization trick + * we don't!" Indeed it does, but its optimizations are only a big win when + * we're allocating something very big (it knows if it just got the memory + * from the OS in a pre-zeroed state). We don't want to use tor_malloc_zero + * for big stuff, so we don't bother with calloc. */ + void *result; + size_t max_nmemb = (size == 0) ? SIZE_MAX : SIZE_MAX/size; + + tor_assert(nmemb < max_nmemb); + + result = tor_malloc_zero_((nmemb * size) DMALLOC_FN_ARGS); + return result; } /** Change the size of the memory block pointed to by ptr to size @@ -228,42 +230,19 @@ tor_realloc_(void *ptr, size_t size DMALLOC_PARAMS) tor_assert(size < SIZE_T_CEILING); -#ifndef MALLOC_ZERO_WORKS - /* Some libc mallocs don't work when size==0. Override them. */ - if (size==0) { - size=1; - } -#endif /* !defined(MALLOC_ZERO_WORKS) */ - #ifdef USE_DMALLOC result = dmalloc_realloc(file, line, ptr, size, DMALLOC_FUNC_REALLOC, 0); #else - result = raw_realloc(ptr, size); + result = realloc(ptr, size); #endif if (PREDICT_UNLIKELY(result == NULL)) { - /* LCOV_EXCL_START */ log_err(LD_MM,"Out of memory on realloc(). Dying."); - exit(1); // exit ok: alloc failed. - /* LCOV_EXCL_STOP */ + exit(1); } return result; } -/** - * Try to realloc ptr so that it takes up sz1 * sz2 bytes. Check for - * overflow. Unlike other allocation functions, return NULL on overflow. - */ -void * -tor_reallocarray_(void *ptr, size_t sz1, size_t sz2 DMALLOC_PARAMS) -{ - /* XXXX we can make this return 0, but we would need to check all the - * reallocarray users. */ - tor_assert(size_mul_check(sz1, sz2)); - - return tor_realloc(ptr, (sz1 * sz2) DMALLOC_FN_ARGS); -} - /** Return a newly allocated copy of the NUL-terminated string s. On * error, log and terminate. (Like strdup(s), but never returns * NULL.) @@ -271,21 +250,19 @@ tor_reallocarray_(void *ptr, size_t sz1, size_t sz2 DMALLOC_PARAMS) char * tor_strdup_(const char *s DMALLOC_PARAMS) { - char *duplicate; + char *dup; tor_assert(s); #ifdef USE_DMALLOC - duplicate = dmalloc_strdup(file, line, s, 0); + dup = dmalloc_strdup(file, line, s, 0); #else - duplicate = raw_strdup(s); + dup = strdup(s); #endif - if (PREDICT_UNLIKELY(duplicate == NULL)) { - /* LCOV_EXCL_START */ + if (PREDICT_UNLIKELY(dup == NULL)) { log_err(LD_MM,"Out of memory on strdup(). Dying."); - exit(1); // exit ok: alloc failed. - /* LCOV_EXCL_STOP */ + exit(1); } - return duplicate; + return dup; } /** Allocate and return a new string containing the first n @@ -297,17 +274,17 @@ tor_strdup_(const char *s DMALLOC_PARAMS) char * tor_strndup_(const char *s, size_t n DMALLOC_PARAMS) { - char *duplicate; + char *dup; tor_assert(s); tor_assert(n < SIZE_T_CEILING); - duplicate = tor_malloc_((n+1) DMALLOC_FN_ARGS); + dup = tor_malloc_((n+1) DMALLOC_FN_ARGS); /* Performance note: Ordinarily we prefer strlcpy to strncpy. But * this function gets called a whole lot, and platform strncpy is * much faster than strlcpy when strlen(s) is much longer than n. */ - strncpy(duplicate, s, n); - duplicate[n]='\0'; - return duplicate; + strncpy(dup, s, n); + dup[n]='\0'; + return dup; } /** Allocate a chunk of len bytes, with the same contents as the @@ -315,26 +292,26 @@ tor_strndup_(const char *s, size_t n DMALLOC_PARAMS) void * tor_memdup_(const void *mem, size_t len DMALLOC_PARAMS) { - char *duplicate; + char *dup; tor_assert(len < SIZE_T_CEILING); tor_assert(mem); - duplicate = tor_malloc_(len DMALLOC_FN_ARGS); - memcpy(duplicate, mem, len); - return duplicate; + dup = tor_malloc_(len DMALLOC_FN_ARGS); + memcpy(dup, mem, len); + return dup; } /** As tor_memdup(), but add an extra 0 byte at the end of the resulting * memory. */ void * -tor_memdup_nulterm_(const void *mem, size_t len DMALLOC_PARAMS) +tor_memdup_nulterm(const void *mem, size_t len DMALLOC_PARAMS) { - char *duplicate; + char *dup; tor_assert(len < SIZE_T_CEILING+1); tor_assert(mem); - duplicate = tor_malloc_(len+1 DMALLOC_FN_ARGS); - memcpy(duplicate, mem, len); - duplicate[len] = '\0'; - return duplicate; + dup = tor_malloc_(len+1 DMALLOC_FN_ARGS); + memcpy(dup, mem, len); + dup[len] = '\0'; + return dup; } /** Helper for places that need to take a function pointer to the right @@ -345,7 +322,6 @@ tor_free_(void *mem) tor_free(mem); } -DISABLE_GCC_WARNING(aggregate-return) /** Call the platform malloc info function, and dump the results to the log at * level severity. If no such function exists, do nothing. */ void @@ -362,18 +338,17 @@ tor_log_mallinfo(int severity) mi.arena, mi.ordblks, mi.smblks, mi.hblks, mi.hblkhd, mi.usmblks, mi.fsmblks, mi.uordblks, mi.fordblks, mi.keepcost); -#else /* !(defined(HAVE_MALLINFO)) */ +#else (void)severity; -#endif /* defined(HAVE_MALLINFO) */ +#endif #ifdef USE_DMALLOC dmalloc_log_changed(0, /* Since the program started. */ 1, /* Log info about non-freed pointers. */ 0, /* Do not log info about freed pointers. */ 0 /* Do not log individual pointers. */ ); -#endif /* defined(USE_DMALLOC) */ +#endif } -ENABLE_GCC_WARNING(aggregate-return) /* ===== * Math @@ -401,7 +376,7 @@ tor_lround(double d) return (long)rint(d); #else return (long)(d > 0 ? d + 0.5 : ceil(d - 0.5)); -#endif /* defined(HAVE_LROUND) || ... */ +#endif } /** Return the 64-bit integer closest to d. We define this wrapper here so @@ -416,7 +391,7 @@ tor_llround(double d) return (int64_t)rint(d); #else return (int64_t)(d > 0 ? d + 0.5 : ceil(d - 0.5)); -#endif /* defined(HAVE_LLROUND) || ... */ +#endif } /** Returns floor(log2(u64)). If u64 is 0, (incorrectly) returns 0. */ @@ -445,7 +420,7 @@ tor_log2(uint64_t u64) r += 2; } if (u64 >= (U64_LITERAL(1)<<1)) { - // u64 >>= 1; // not using this any more. + u64 >>= 1; r += 1; } return r; @@ -476,125 +451,35 @@ round_to_power_of_2(uint64_t u64) } /** Return the lowest x such that x is at least number, and x modulo - * divisor == 0. If no such x can be expressed as an unsigned, return - * UINT_MAX. Asserts if divisor is zero. */ + * divisor == 0. */ unsigned round_to_next_multiple_of(unsigned number, unsigned divisor) { - tor_assert(divisor > 0); - if (UINT_MAX - divisor + 1 < number) - return UINT_MAX; number += divisor - 1; number -= number % divisor; return number; } /** Return the lowest x such that x is at least number, and x modulo - * divisor == 0. If no such x can be expressed as a uint32_t, return - * UINT32_MAX. Asserts if divisor is zero. */ + * divisor == 0. */ uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor) { - tor_assert(divisor > 0); - if (UINT32_MAX - divisor + 1 < number) - return UINT32_MAX; - number += divisor - 1; number -= number % divisor; return number; } /** Return the lowest x such that x is at least number, and x modulo - * divisor == 0. If no such x can be expressed as a uint64_t, return - * UINT64_MAX. Asserts if divisor is zero. */ + * divisor == 0. */ uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor) { - tor_assert(divisor > 0); - if (UINT64_MAX - divisor + 1 < number) - return UINT64_MAX; number += divisor - 1; number -= number % divisor; return number; } -/** Transform a random value p from the uniform distribution in - * [0.0, 1.0[ into a Laplace distributed value with location parameter - * mu and scale parameter b. Truncate the final result - * to be an integer in [INT64_MIN, INT64_MAX]. */ -int64_t -sample_laplace_distribution(double mu, double b, double p) -{ - double result; - tor_assert(p >= 0.0 && p < 1.0); - - /* This is the "inverse cumulative distribution function" from: - * http://en.wikipedia.org/wiki/Laplace_distribution */ - if (p <= 0.0) { - /* Avoid taking log(0.0) == -INFINITY, as some processors or compiler - * options can cause the program to trap. */ - return INT64_MIN; - } - - result = mu - b * (p > 0.5 ? 1.0 : -1.0) - * tor_mathlog(1.0 - 2.0 * fabs(p - 0.5)); - - return clamp_double_to_int64(result); -} - -/** Add random noise between INT64_MIN and INT64_MAX coming from a Laplace - * distribution with mu = 0 and b = delta_f/epsilon to - * signal based on the provided random value in [0.0, 1.0[. - * The epsilon value must be between ]0.0, 1.0]. delta_f must be greater - * than 0. */ -int64_t -add_laplace_noise(int64_t signal_, double random_, double delta_f, - double epsilon) -{ - int64_t noise; - - /* epsilon MUST be between ]0.0, 1.0] */ - tor_assert(epsilon > 0.0 && epsilon <= 1.0); - /* delta_f MUST be greater than 0. */ - tor_assert(delta_f > 0.0); - - /* Just add noise, no further signal */ - noise = sample_laplace_distribution(0.0, - delta_f / epsilon, - random_); - - /* Clip (signal + noise) to [INT64_MIN, INT64_MAX] */ - if (noise > 0 && INT64_MAX - noise < signal_) - return INT64_MAX; - else if (noise < 0 && INT64_MIN - noise > signal_) - return INT64_MIN; - else - return signal_ + noise; -} - -/* Helper: return greatest common divisor of a,b */ -static uint64_t -gcd64(uint64_t a, uint64_t b) -{ - while (b) { - uint64_t t = b; - b = a % b; - a = t; - } - return a; -} - -/* Given a fraction *numer / *denom, simplify it. - * Requires that the denominator is greater than 0. */ -void -simplify_fraction64(uint64_t *numer, uint64_t *denom) -{ - tor_assert(denom); - uint64_t gcd = gcd64(*numer, *denom); - *numer /= gcd; - *denom /= gcd; -} - /** Return the number of bits set in v. */ int n_bits_set_u8(uint8_t v) @@ -630,12 +515,12 @@ n_bits_set_u8(uint8_t v) void tor_strstrip(char *s, const char *strip) { - char *readp = s; - while (*readp) { - if (strchr(strip, *readp)) { - ++readp; + char *read = s; + while (*read) { + if (strchr(strip, *read)) { + ++read; } else { - *s++ = *readp++; + *s++ = *read++; } } *s = '\0'; @@ -704,19 +589,6 @@ tor_strisnonupper(const char *s) return 1; } -/** Return true iff every character in s is whitespace space; else - * return false. */ -int -tor_strisspace(const char *s) -{ - while (*s) { - if (!TOR_ISSPACE(*s)) - return 0; - s++; - } - return 1; -} - /** As strcmp, except that either string may be NULL. The NULL string is * considered to be before any non-NULL string. */ int @@ -811,6 +683,16 @@ fast_memcmpstart(const void *mem, size_t memlen, return fast_memcmp(mem, prefix, plen); } +/** Given a nul-terminated string s, set every character before the nul + * to zero. */ +void +tor_strclear(char *s) +{ + while (*s) { + *s++ = '\0'; + } +} + /** Return a pointer to the first char of s that is not whitespace and * not a comment, or to the terminating NUL if no such character exists. */ @@ -1016,8 +898,8 @@ tor_digest_is_zero(const char *digest) return tor_memeq(digest, ZERO_DIGEST, DIGEST_LEN); } -/** Return true if string is a valid 'key=[value]' string. - * "value" is optional, to indicate the empty string. Log at logging +/** Return true if string is a valid '=[]' string. + * is optional, to indicate the empty string. Log at logging * severity if something ugly happens. */ int string_is_key_value(int severity, const char *string) @@ -1049,77 +931,6 @@ string_is_key_value(int severity, const char *string) return 1; } -/** Return true if string represents a valid IPv4 adddress in - * 'a.b.c.d' form. - */ -int -string_is_valid_ipv4_address(const char *string) -{ - struct in_addr addr; - - return (tor_inet_pton(AF_INET,string,&addr) == 1); -} - -/** Return true if string represents a valid IPv6 address in - * a form that inet_pton() can parse. - */ -int -string_is_valid_ipv6_address(const char *string) -{ - struct in6_addr addr; - - return (tor_inet_pton(AF_INET6,string,&addr) == 1); -} - -/** Return true iff string matches a pattern of DNS names - * that we allow Tor clients to connect to. - * - * Note: This allows certain technically invalid characters ('_') to cope - * with misconfigured zones that have been encountered in the wild. - */ -int -string_is_valid_hostname(const char *string) -{ - int result = 1; - smartlist_t *components; - - components = smartlist_new(); - - smartlist_split_string(components,string,".",0,0); - - SMARTLIST_FOREACH_BEGIN(components, char *, c) { - if ((c[0] == '-') || (*c == '_')) { - result = 0; - break; - } - - /* Allow a single terminating '.' used rarely to indicate domains - * are FQDNs rather than relative. */ - if ((c_sl_idx > 0) && (c_sl_idx + 1 == c_sl_len) && !*c) { - continue; - } - - do { - if ((*c >= 'a' && *c <= 'z') || - (*c >= 'A' && *c <= 'Z') || - (*c >= '0' && *c <= '9') || - (*c == '-') || (*c == '_')) - c++; - else - result = 0; - } while (result && *c); - - } SMARTLIST_FOREACH_END(c); - - SMARTLIST_FOREACH_BEGIN(components, char *, c) { - tor_free(c); - } SMARTLIST_FOREACH_END(c); - - smartlist_free(components); - - return result; -} - /** Return true iff the DIGEST256_LEN bytes in digest are all zero. */ int tor_digest256_is_zero(const char *digest) @@ -1139,9 +950,6 @@ tor_digest256_is_zero(const char *digest) /* Were there unexpected unconverted characters? */ \ if (!next && *endptr) \ goto err; \ - /* Illogical (max, min) inputs? */ \ - if (BUG(max < min)) \ - goto err; \ /* Is r within limits? */ \ if (r < min || r > max) \ goto err; \ @@ -1172,7 +980,7 @@ tor_parse_long(const char *s, int base, long min, long max, char *endptr; long r; - if (BUG(base < 0)) { + if (base < 0) { if (ok) *ok = 0; return 0; @@ -1191,7 +999,7 @@ tor_parse_ulong(const char *s, int base, unsigned long min, char *endptr; unsigned long r; - if (BUG(base < 0)) { + if (base < 0) { if (ok) *ok = 0; return 0; @@ -1223,7 +1031,7 @@ tor_parse_uint64(const char *s, int base, uint64_t min, char *endptr; uint64_t r; - if (BUG(base < 0)) { + if (base < 0) { if (ok) *ok = 0; return 0; @@ -1233,16 +1041,106 @@ tor_parse_uint64(const char *s, int base, uint64_t min, #ifdef HAVE_STRTOULL r = (uint64_t)strtoull(s, &endptr, base); #elif defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER < 1300 + tor_assert(base <= 10); + r = (uint64_t)_atoi64(s); + endptr = (char*)s; + while (TOR_ISSPACE(*endptr)) endptr++; + while (TOR_ISDIGIT(*endptr)) endptr++; +#else r = (uint64_t)_strtoui64(s, &endptr, base); +#endif #elif SIZEOF_LONG == 8 r = (uint64_t)strtoul(s, &endptr, base); #else #error "I don't know how to parse 64-bit numbers." -#endif /* defined(HAVE_STRTOULL) || ... */ +#endif CHECK_STRTOX_RESULT(); } +/** Encode the srclen bytes at src in a NUL-terminated, + * uppercase hexadecimal string; store it in the destlen-byte buffer + * dest. + */ +void +base16_encode(char *dest, size_t destlen, const char *src, size_t srclen) +{ + const char *end; + char *cp; + + tor_assert(destlen >= srclen*2+1); + tor_assert(destlen < SIZE_T_CEILING); + + cp = dest; + end = src+srclen; + while (src> 4 ]; + *cp++ = "0123456789ABCDEF"[ (*(const uint8_t*)src) & 0xf ]; + ++src; + } + *cp = '\0'; +} + +/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ +static INLINE int +hex_decode_digit_(char c) +{ + switch (c) { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + case 'A': case 'a': return 10; + case 'B': case 'b': return 11; + case 'C': case 'c': return 12; + case 'D': case 'd': return 13; + case 'E': case 'e': return 14; + case 'F': case 'f': return 15; + default: + return -1; + } +} + +/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */ +int +hex_decode_digit(char c) +{ + return hex_decode_digit_(c); +} + +/** Given a hexadecimal string of srclen bytes in src, decode it + * and store the result in the destlen-byte buffer at dest. + * Return 0 on success, -1 on failure. */ +int +base16_decode(char *dest, size_t destlen, const char *src, size_t srclen) +{ + const char *end; + + int v1,v2; + if ((srclen % 2) != 0) + return -1; + if (destlen < srclen/2 || destlen > SIZE_T_CEILING) + return -1; + end = src+srclen; + while (srcs, * surrounded by quotes and using standard C escapes. * @@ -1284,14 +1182,9 @@ esc_for_log(const char *s) } } - tor_assert(len <= SSIZE_MAX); - result = outp = tor_malloc(len); *outp++ = '\"'; for (cp = s; *cp; ++cp) { - /* This assertion should always succeed, since we will write at least - * one char here, and two chars for closing quote and nul later */ - tor_assert((outp-result) < (ssize_t)len-2); switch (*cp) { case '\\': case '\"': @@ -1315,7 +1208,6 @@ esc_for_log(const char *s) if (TOR_ISPRINT(*cp) && ((uint8_t)*cp)<127) { *outp++ = *cp; } else { - tor_assert((outp-result) < (ssize_t)len-4); tor_snprintf(outp, 5, "\\%03o", (int)(uint8_t) *cp); outp += 4; } @@ -1323,27 +1215,12 @@ esc_for_log(const char *s) } } - tor_assert((outp-result) <= (ssize_t)len-2); *outp++ = '\"'; *outp++ = 0; return result; } -/** Similar to esc_for_log. Allocate and return a new string representing - * the first n characters in chars, surround by quotes and using - * standard C escapes. If a NUL character is encountered in chars, - * the resulting string will be terminated there. - */ -char * -esc_for_log_len(const char *chars, size_t n) -{ - char *string = tor_strndup(chars, n); - char *string_escaped = esc_for_log(string); - tor_free(string); - return string_escaped; -} - /** Allocate and return a new string representing the contents of s, * surrounded by quotes and using standard C escapes. * @@ -1406,138 +1283,42 @@ tor_escape_str_for_pt_args(const char *string, const char *chars_to_escape) * Time * ===== */ -#define TOR_USEC_PER_SEC 1000000 - -/** Return the difference between start->tv_sec and end->tv_sec. - * Returns INT64_MAX on overflow and underflow. - */ -static int64_t -tv_secdiff_impl(const struct timeval *start, const struct timeval *end) -{ - const int64_t s = (int64_t)start->tv_sec; - const int64_t e = (int64_t)end->tv_sec; - - /* This may not be the most efficient way of implemeting this check, - * but it's easy to see that it's correct and doesn't overflow */ - - if (s > 0 && e < INT64_MIN + s) { - /* s is positive: equivalent to e - s < INT64_MIN, but without any - * overflow */ - return INT64_MAX; - } else if (s < 0 && e > INT64_MAX + s) { - /* s is negative: equivalent to e - s > INT64_MAX, but without any - * overflow */ - return INT64_MAX; - } - - return e - s; -} - /** Return the number of microseconds elapsed between *start and *end. - * Returns LONG_MAX on overflow and underflow. */ long tv_udiff(const struct timeval *start, const struct timeval *end) { - /* Sanity check tv_usec */ - if (start->tv_usec > TOR_USEC_PER_SEC || start->tv_usec < 0) { - log_warn(LD_GENERAL, "comparing times on microsecond detail with bad " - "start tv_usec: " I64_FORMAT " microseconds", - I64_PRINTF_ARG(start->tv_usec)); - return LONG_MAX; - } + long udiff; + long secdiff = end->tv_sec - start->tv_sec; - if (end->tv_usec > TOR_USEC_PER_SEC || end->tv_usec < 0) { - log_warn(LD_GENERAL, "comparing times on microsecond detail with bad " - "end tv_usec: " I64_FORMAT " microseconds", - I64_PRINTF_ARG(end->tv_usec)); - return LONG_MAX; - } - - /* Some BSDs have struct timeval.tv_sec 64-bit, but time_t (and long) 32-bit - */ - int64_t udiff; - const int64_t secdiff = tv_secdiff_impl(start, end); - - /* end->tv_usec - start->tv_usec can be up to 1 second either way */ - if (secdiff > (int64_t)(LONG_MAX/1000000 - 1) || - secdiff < (int64_t)(LONG_MIN/1000000 + 1)) { + if (labs(secdiff+1) > LONG_MAX/1000000) { log_warn(LD_GENERAL, "comparing times on microsecond detail too far " - "apart: " I64_FORMAT " seconds", I64_PRINTF_ARG(secdiff)); - return LONG_MAX; - } - - /* we'll never get an overflow here, because we check that both usecs are - * between 0 and TV_USEC_PER_SEC. */ - udiff = secdiff*1000000 + ((int64_t)end->tv_usec - (int64_t)start->tv_usec); - - /* Some compilers are smart enough to work out this is a no-op on L64 */ -#if SIZEOF_LONG < 8 - if (udiff > (int64_t)LONG_MAX || udiff < (int64_t)LONG_MIN) { + "apart: %ld seconds", secdiff); return LONG_MAX; } -#endif - return (long)udiff; + udiff = secdiff*1000000L + (end->tv_usec - start->tv_usec); + return udiff; } /** Return the number of milliseconds elapsed between *start and *end. - * If the tv_usec difference is 500, rounds away from zero. - * Returns LONG_MAX on overflow and underflow. */ long tv_mdiff(const struct timeval *start, const struct timeval *end) { - /* Sanity check tv_usec */ - if (start->tv_usec > TOR_USEC_PER_SEC || start->tv_usec < 0) { - log_warn(LD_GENERAL, "comparing times on millisecond detail with bad " - "start tv_usec: " I64_FORMAT " microseconds", - I64_PRINTF_ARG(start->tv_usec)); - return LONG_MAX; - } - - if (end->tv_usec > TOR_USEC_PER_SEC || end->tv_usec < 0) { - log_warn(LD_GENERAL, "comparing times on millisecond detail with bad " - "end tv_usec: " I64_FORMAT " microseconds", - I64_PRINTF_ARG(end->tv_usec)); - return LONG_MAX; - } + long mdiff; + long secdiff = end->tv_sec - start->tv_sec; - /* Some BSDs have struct timeval.tv_sec 64-bit, but time_t (and long) 32-bit - */ - int64_t mdiff; - const int64_t secdiff = tv_secdiff_impl(start, end); - - /* end->tv_usec - start->tv_usec can be up to 1 second either way, but the - * mdiff calculation may add another temporary second for rounding. - * Whether this actually causes overflow depends on the compiler's constant - * folding and order of operations. */ - if (secdiff > (int64_t)(LONG_MAX/1000 - 2) || - secdiff < (int64_t)(LONG_MIN/1000 + 1)) { + if (labs(secdiff+1) > LONG_MAX/1000) { log_warn(LD_GENERAL, "comparing times on millisecond detail too far " - "apart: " I64_FORMAT " seconds", I64_PRINTF_ARG(secdiff)); + "apart: %ld seconds", secdiff); return LONG_MAX; } /* Subtract and round */ - mdiff = secdiff*1000 + - /* We add a million usec here to ensure that the result is positive, - * so that the round-towards-zero behavior of the division will give - * the right result for rounding to the nearest msec. Later we subtract - * 1000 in order to get the correct result. - * We'll never get an overflow here, because we check that both usecs are - * between 0 and TV_USEC_PER_SEC. */ - ((int64_t)end->tv_usec - (int64_t)start->tv_usec + 500 + 1000000) / 1000 - - 1000; - - /* Some compilers are smart enough to work out this is a no-op on L64 */ -#if SIZEOF_LONG < 8 - if (mdiff > (int64_t)LONG_MAX || mdiff < (int64_t)LONG_MIN) { - return LONG_MAX; - } -#endif - - return (long)mdiff; + mdiff = secdiff*1000L + + ((long)end->tv_usec - (long)start->tv_usec + 500L) / 1000L; + return mdiff; } /** @@ -1556,15 +1337,13 @@ tv_to_msec(const struct timeval *tv) #define IS_LEAPYEAR(y) (!(y % 4) && ((y % 100) || !(y % 400))) /** Helper: Return the number of leap-days between Jan 1, y1 and Jan 1, y2. */ static int -n_leapdays(int year1, int year2) +n_leapdays(int y1, int y2) { - --year1; - --year2; - return (year2/4 - year1/4) - (year2/100 - year1/100) - + (year2/400 - year1/400); + --y1; + --y2; + return (y2/4 - y1/4) - (y2/100 - y1/100) + (y2/400 - y1/400); } -/** Number of days per month in non-leap year; used by tor_timegm and - * parse_rfc1123_time. */ +/** Number of days per month in non-leap year; used by tor_timegm. */ static const int days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; @@ -1576,44 +1355,12 @@ tor_timegm(const struct tm *tm, time_t *time_out) { /* This is a pretty ironclad timegm implementation, snarfed from Python2.2. * It's way more brute-force than fiddling with tzset(). - * - * We use int64_t rather than time_t to avoid overflow on multiplication on - * platforms with 32-bit time_t. Since year is clipped to INT32_MAX, and - * since 365 * 24 * 60 * 60 is approximately 31 million, it's not possible - * for INT32_MAX years to overflow int64_t when converted to seconds. */ - int64_t year, days, hours, minutes, seconds; - int i, invalid_year, dpm; - - /* Initialize time_out to 0 for now, to avoid bad usage in case this function - fails and the caller ignores the return value. */ - tor_assert(time_out); - *time_out = 0; - - /* avoid int overflow on addition */ - if (tm->tm_year < INT32_MAX-1900) { - year = tm->tm_year + 1900; - } else { - /* clamp year */ - year = INT32_MAX; - } - invalid_year = (year < 1970 || tm->tm_year >= INT32_MAX-1900); - - if (tm->tm_mon >= 0 && tm->tm_mon <= 11) { - dpm = days_per_month[tm->tm_mon]; - if (tm->tm_mon == 1 && !invalid_year && IS_LEAPYEAR(tm->tm_year)) { - dpm = 29; - } - } else { - /* invalid month - default to 0 days per month */ - dpm = 0; - } - - if (invalid_year || - tm->tm_mon < 0 || tm->tm_mon > 11 || - tm->tm_mday < 1 || tm->tm_mday > dpm || - tm->tm_hour < 0 || tm->tm_hour > 23 || - tm->tm_min < 0 || tm->tm_min > 59 || - tm->tm_sec < 0 || tm->tm_sec > 60) { + */ + time_t year, days, hours, minutes, seconds; + int i; + year = tm->tm_year + 1900; + if (year < 1970 || tm->tm_mon < 0 || tm->tm_mon > 11 || + tm->tm_year >= INT32_MAX-1900) { log_warn(LD_BUG, "Out-of-range argument to tor_timegm"); return -1; } @@ -1627,17 +1374,7 @@ tor_timegm(const struct tm *tm, time_t *time_out) minutes = hours*60 + tm->tm_min; seconds = minutes*60 + tm->tm_sec; - /* Check that "seconds" will fit in a time_t. On platforms where time_t is - * 32-bit, this check will fail for dates in and after 2038. - * - * We already know that "seconds" can't be negative because "year" >= 1970 */ -#if SIZEOF_TIME_T < 8 - if (seconds < TIME_MIN || seconds > TIME_MAX) { - log_warn(LD_BUG, "Result does not fit in tor_timegm"); - return -1; - } -#endif /* SIZEOF_TIME_T < 8 */ - *time_out = (time_t)seconds; + *time_out = seconds; return 0; } @@ -1687,9 +1424,8 @@ parse_rfc1123_time(const char *buf, time_t *t) struct tm tm; char month[4]; char weekday[4]; - int i, m, invalid_year; + int i, m; unsigned tm_mday, tm_year, tm_hour, tm_min, tm_sec; - unsigned dpm; if (strlen(buf) != RFC1123_TIME_LEN) return -1; @@ -1702,6 +1438,18 @@ parse_rfc1123_time(const char *buf, time_t *t) tor_free(esc); return -1; } + if (tm_mday < 1 || tm_mday > 31 || tm_hour > 23 || tm_min > 59 || + tm_sec > 60 || tm_year >= INT32_MAX || tm_year < 1970) { + char *esc = esc_for_log(buf); + log_warn(LD_GENERAL, "Got invalid RFC1123 time %s", esc); + tor_free(esc); + return -1; + } + tm.tm_mday = (int)tm_mday; + tm.tm_year = (int)tm_year; + tm.tm_hour = (int)tm_hour; + tm.tm_min = (int)tm_min; + tm.tm_sec = (int)tm_sec; m = -1; for (i = 0; i < 12; ++i) { @@ -1718,37 +1466,12 @@ parse_rfc1123_time(const char *buf, time_t *t) } tm.tm_mon = m; - invalid_year = (tm_year >= INT32_MAX || tm_year < 1970); - tor_assert(m >= 0 && m <= 11); - dpm = days_per_month[m]; - if (m == 1 && !invalid_year && IS_LEAPYEAR(tm_year)) { - dpm = 29; - } - - if (invalid_year || tm_mday < 1 || tm_mday > dpm || - tm_hour > 23 || tm_min > 59 || tm_sec > 60) { - char *esc = esc_for_log(buf); - log_warn(LD_GENERAL, "Got invalid RFC1123 time %s", esc); - tor_free(esc); - return -1; - } - tm.tm_mday = (int)tm_mday; - tm.tm_year = (int)tm_year; - tm.tm_hour = (int)tm_hour; - tm.tm_min = (int)tm_min; - tm.tm_sec = (int)tm_sec; - if (tm.tm_year < 1970) { - /* LCOV_EXCL_START - * XXXX I think this is dead code; we already checked for - * invalid_year above. */ - tor_assert_nonfatal_unreached(); char *esc = esc_for_log(buf); log_warn(LD_GENERAL, "Got invalid RFC1123 time %s. (Before 1970)", esc); tor_free(esc); return -1; - /* LCOV_EXCL_STOP */ } tm.tm_year -= 1900; @@ -1793,33 +1516,21 @@ void format_iso_time_nospace_usec(char *buf, const struct timeval *tv) { tor_assert(tv); - format_iso_time_nospace(buf, (time_t)tv->tv_sec); + format_iso_time_nospace(buf, tv->tv_sec); tor_snprintf(buf+ISO_TIME_LEN, 8, ".%06d", (int)tv->tv_usec); } /** Given an ISO-formatted UTC time value (after the epoch) in cp, * parse it and store its value in *t. Return 0 on success, -1 on - * failure. Ignore extraneous stuff in cp after the end of the time - * string, unless strict is set. If nospace is set, - * expect the YYYY-MM-DDTHH:MM:SS format. */ + * failure. Ignore extraneous stuff in cp separated by whitespace from + * the end of the time string. */ int -parse_iso_time_(const char *cp, time_t *t, int strict, int nospace) +parse_iso_time(const char *cp, time_t *t) { struct tm st_tm; unsigned int year=0, month=0, day=0, hour=0, minute=0, second=0; - int n_fields; - char extra_char, separator_char; - n_fields = tor_sscanf(cp, "%u-%2u-%2u%c%2u:%2u:%2u%c", - &year, &month, &day, - &separator_char, - &hour, &minute, &second, &extra_char); - if (strict ? (n_fields != 7) : (n_fields < 7)) { - char *esc = esc_for_log(cp); - log_warn(LD_GENERAL, "ISO time %s was unparseable", esc); - tor_free(esc); - return -1; - } - if (separator_char != (nospace ? 'T' : ' ')) { + if (tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u", &year, &month, + &day, &hour, &minute, &second) < 6) { char *esc = esc_for_log(cp); log_warn(LD_GENERAL, "ISO time %s was unparseable", esc); tor_free(esc); @@ -1838,41 +1549,16 @@ parse_iso_time_(const char *cp, time_t *t, int strict, int nospace) st_tm.tm_hour = hour; st_tm.tm_min = minute; st_tm.tm_sec = second; - st_tm.tm_wday = 0; /* Should be ignored. */ if (st_tm.tm_year < 70) { - /* LCOV_EXCL_START - * XXXX I think this is dead code; we already checked for - * year < 1970 above. */ - tor_assert_nonfatal_unreached(); char *esc = esc_for_log(cp); log_warn(LD_GENERAL, "Got invalid ISO time %s. (Before 1970)", esc); tor_free(esc); return -1; - /* LCOV_EXCL_STOP */ } return tor_timegm(&st_tm, t); } -/** Given an ISO-formatted UTC time value (after the epoch) in cp, - * parse it and store its value in *t. Return 0 on success, -1 on - * failure. Reject the string if any characters are present after the time. - */ -int -parse_iso_time(const char *cp, time_t *t) -{ - return parse_iso_time_(cp, t, 1, 0); -} - -/** - * As parse_iso_time, but parses a time encoded by format_iso_time_nospace(). - */ -int -parse_iso_time_nospace(const char *cp, time_t *t) -{ - return parse_iso_time_(cp, t, 1, 1); -} - /** Given a date in one of the three formats allowed by HTTP (ugh), * parse it into tm. Return 0 on success, negative on failure. */ int @@ -1920,7 +1606,6 @@ parse_http_time(const char *date, struct tm *tm) tm->tm_hour = (int)tm_hour; tm->tm_min = (int)tm_min; tm->tm_sec = (int)tm_sec; - tm->tm_wday = 0; /* Leave this unset. */ month[3] = '\0'; /* Okay, now decode the month. */ @@ -1945,18 +1630,14 @@ parse_http_time(const char *date, struct tm *tm) /** Given an interval in seconds, try to write it to the * out_len-byte buffer in out in a human-readable form. - * Returns a non-negative integer on success, -1 on failure. + * Return 0 on success, -1 on failure. */ int format_time_interval(char *out, size_t out_len, long interval) { /* We only report seconds if there's no hours. */ long sec = 0, min = 0, hour = 0, day = 0; - - /* -LONG_MIN is LONG_MAX + 1, which causes signed overflow */ - if (interval < -LONG_MAX) - interval = LONG_MAX; - else if (interval < 0) + if (interval < 0) interval = -interval; if (interval >= 86400) { @@ -2014,7 +1695,7 @@ update_approx_time(time_t now) { cached_approx_time = now; } -#endif /* !defined(TIME_IS_FAST) */ +#endif /* ===== * Rate limiting @@ -2022,9 +1703,7 @@ update_approx_time(time_t now) /** If the rate-limiter lim is ready at now, return the number * of calls to rate_limit_is_ready (including this one!) since the last time - * rate_limit_is_ready returned nonzero. Otherwise return 0. - * If the call number hits RATELIM_TOOMANY limit, drop a warning - * about this event and stop counting. */ + * rate_limit_is_ready returned nonzero. Otherwise return 0. */ static int rate_limit_is_ready(ratelim_t *lim, time_t now) { @@ -2034,10 +1713,7 @@ rate_limit_is_ready(ratelim_t *lim, time_t now) lim->n_calls_since_last_time = 0; return res; } else { - if (lim->n_calls_since_last_time <= RATELIM_TOOMANY) { - ++lim->n_calls_since_last_time; - } - + ++lim->n_calls_since_last_time; return 0; } } @@ -2054,12 +1730,9 @@ rate_limit_log(ratelim_t *lim, time_t now) return tor_strdup(""); } else { char *cp=NULL; - const char *opt_over = (n >= RATELIM_TOOMANY) ? "over " : ""; - /* XXXX this is not exactly correct: the messages could have occurred - * any time between the old value of lim->allowed and now. */ tor_asprintf(&cp, - " [%s%d similar message(s) suppressed in last %d seconds]", - opt_over, n-1, lim->rate); + " [%d similar message(s) suppressed in last %d seconds]", + n-1, lim->rate); return cp; } } else { @@ -2080,7 +1753,7 @@ write_all(tor_socket_t fd, const char *buf, size_t count, int isSocket) { size_t written = 0; ssize_t result; - tor_assert(count < SSIZE_MAX); + tor_assert(count < SSIZE_T_MAX); while (written != count) { if (isSocket) @@ -2105,12 +1778,10 @@ read_all(tor_socket_t fd, char *buf, size_t count, int isSocket) size_t numread = 0; ssize_t result; - if (count > SIZE_T_CEILING || count > SSIZE_MAX) { - errno = EINVAL; + if (count > SIZE_T_CEILING || count > SSIZE_T_MAX) return -1; - } - while (numread < count) { + while (numread != count) { if (isSocket) result = tor_socket_recv(fd, buf+numread, count-numread, 0); else @@ -2143,42 +1814,22 @@ clean_name_for_stat(char *name) return; name[len-1]='\0'; } -#else /* !(defined(_WIN32)) */ +#else (void)name; -#endif /* defined(_WIN32) */ -} - -/** Wrapper for unlink() to make it mockable for the test suite; returns 0 - * if unlinking the file succeeded, -1 and sets errno if unlinking fails. - */ - -MOCK_IMPL(int, -tor_unlink,(const char *pathname)) -{ - return unlink(pathname); +#endif } -/** Return: - * FN_ERROR if filename can't be read, is NULL, or is zero-length, - * FN_NOENT if it doesn't exist, - * FN_FILE if it is a non-empty regular file, or a FIFO on unix-like systems, - * FN_EMPTY for zero-byte regular files, - * FN_DIR if it's a directory, and - * FN_ERROR for any other file type. - * On FN_ERROR and FN_NOENT, sets errno. (errno is not set when FN_ERROR - * is returned due to an unhandled file type.) */ +/** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't + * exist, FN_FILE if it is a regular file, or FN_DIR if it's a + * directory. On FN_ERROR, sets errno. */ file_status_t file_status(const char *fname) { struct stat st; char *f; int r; - if (!fname || strlen(fname) == 0) { - return FN_ERROR; - } f = tor_strdup(fname); clean_name_for_stat(f); - log_debug(LD_FS, "stat()ing %s", f); r = stat(sandbox_intern_string(f), &st); tor_free(f); if (r) { @@ -2187,152 +1838,88 @@ file_status(const char *fname) } return FN_ERROR; } - if (st.st_mode & S_IFDIR) { + if (st.st_mode & S_IFDIR) return FN_DIR; - } else if (st.st_mode & S_IFREG) { - if (st.st_size > 0) { - return FN_FILE; - } else if (st.st_size == 0) { - return FN_EMPTY; - } else { - return FN_ERROR; - } + else if (st.st_mode & S_IFREG) + return FN_FILE; #ifndef _WIN32 - } else if (st.st_mode & S_IFIFO) { + else if (st.st_mode & S_IFIFO) return FN_FILE; #endif - } else { + else return FN_ERROR; - } } -/** Check whether dirname exists and is private. If yes return 0. - * If dirname does not exist: - * - if check&CPD_CREATE, try to create it and return 0 on success. - * - if check&CPD_CHECK, and we think we can create it, return 0. - * - if check&CPD_CHECK is false, and the directory exists, return 0. - * - otherwise, return -1. - * If CPD_GROUP_OK is set, then it's okay if the directory +/** Check whether dirname exists and is private. If yes return 0. If + * it does not exist, and check&CPD_CREATE is set, try to create it + * and return 0 on success. If it does not exist, and + * check&CPD_CHECK, and we think we can create it, return 0. Else + * return -1. If CPD_GROUP_OK is set, then it's okay if the directory * is group-readable, but in all cases we create the directory mode 0700. - * If CPD_GROUP_READ is set, existing directory behaves as CPD_GROUP_OK and - * if the directory is created it will use mode 0750 with group read - * permission. Group read privileges also assume execute permission - * as norm for directories. If CPD_CHECK_MODE_ONLY is set, then we don't - * alter the directory permissions if they are too permissive: - * we just return -1. + * If CPD_CHECK_MODE_ONLY is set, then we don't alter the directory permissions + * if they are too permissive: we just return -1. * When effective_user is not NULL, check permissions against the given user * and its primary group. */ -MOCK_IMPL(int, -check_private_dir,(const char *dirname, cpd_check_t check, - const char *effective_user)) +int +check_private_dir(const char *dirname, cpd_check_t check, + const char *effective_user) { int r; struct stat st; - - tor_assert(dirname); - + char *f; #ifndef _WIN32 - int fd; - const struct passwd *pw = NULL; + int mask; + struct passwd *pw = NULL; uid_t running_uid; gid_t running_gid; +#else + (void)effective_user; +#endif - /* - * Goal is to harden the implementation by removing any - * potential for race between stat() and chmod(). - * chmod() accepts filename as argument. If an attacker can move - * the file between stat() and chmod(), a potential race exists. - * - * Several suggestions taken from: - * https://developer.apple.com/library/mac/documentation/ - * Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html - */ - - /* Open directory. - * O_NOFOLLOW to ensure that it does not follow symbolic links */ - fd = open(sandbox_intern_string(dirname), O_NOFOLLOW); - - /* Was there an error? Maybe the directory does not exist? */ - if (fd == -1) { - + tor_assert(dirname); + f = tor_strdup(dirname); + clean_name_for_stat(f); + r = stat(sandbox_intern_string(f), &st); + tor_free(f); + if (r) { if (errno != ENOENT) { - /* Other directory error */ log_warn(LD_FS, "Directory %s cannot be read: %s", dirname, strerror(errno)); return -1; } - - /* Received ENOENT: Directory does not exist */ - - /* Should we create the directory? */ if (check & CPD_CREATE) { log_info(LD_GENERAL, "Creating directory %s", dirname); - if (check & CPD_GROUP_READ) { - r = mkdir(dirname, 0750); - } else { - r = mkdir(dirname, 0700); - } - - /* check for mkdir() error */ +#if defined (_WIN32) && !defined (WINCE) + r = mkdir(dirname); +#else + r = mkdir(dirname, 0700); +#endif if (r) { log_warn(LD_FS, "Error creating directory %s: %s", dirname, strerror(errno)); return -1; } - - /* we just created the directory. try to open it again. - * permissions on the directory will be checked again below.*/ - fd = open(sandbox_intern_string(dirname), O_NOFOLLOW); - - if (fd == -1) { - log_warn(LD_FS, "Could not reopen recently created directory %s: %s", - dirname, - strerror(errno)); - return -1; - } else { - close(fd); - } - } else if (!(check & CPD_CHECK)) { log_warn(LD_FS, "Directory %s does not exist.", dirname); return -1; } - /* XXXX In the case where check==CPD_CHECK, we should look at the * parent directory a little harder. */ return 0; } - - tor_assert(fd >= 0); - - //f = tor_strdup(dirname); - //clean_name_for_stat(f); - log_debug(LD_FS, "stat()ing %s", dirname); - //r = stat(sandbox_intern_string(f), &st); - r = fstat(fd, &st); - if (r == -1) { - log_warn(LD_FS, "fstat() on directory %s failed.", dirname); - close(fd); - return -1; - } - //tor_free(f); - - /* check that dirname is a directory */ if (!(st.st_mode & S_IFDIR)) { log_warn(LD_FS, "%s is not a directory", dirname); - close(fd); return -1; } - +#ifndef _WIN32 if (effective_user) { /* Look up the user and group information. * If we have a problem, bail out. */ - pw = tor_getpwnam(effective_user); + pw = getpwnam(effective_user); if (pw == NULL) { log_warn(LD_CONFIG, "Error setting configured user: %s not found", effective_user); - close(fd); return -1; } running_uid = pw->pw_uid; @@ -2341,33 +1928,25 @@ check_private_dir,(const char *dirname, cpd_check_t check, running_uid = getuid(); running_gid = getgid(); } + if (st.st_uid != running_uid) { - char *process_ownername = NULL, *file_ownername = NULL; + struct passwd *pw = NULL; + char *process_ownername = NULL; - { - const struct passwd *pw_running = tor_getpwuid(running_uid); - process_ownername = pw_running ? tor_strdup(pw_running->pw_name) : - tor_strdup(""); - } + pw = getpwuid(running_uid); + process_ownername = pw ? tor_strdup(pw->pw_name) : tor_strdup(""); - { - const struct passwd *pw_stat = tor_getpwuid(st.st_uid); - file_ownername = pw_stat ? tor_strdup(pw_stat->pw_name) : - tor_strdup(""); - } + pw = getpwuid(st.st_uid); log_warn(LD_FS, "%s is not owned by this user (%s, %d) but by " "%s (%d). Perhaps you are running Tor as the wrong user?", - dirname, process_ownername, (int)running_uid, - file_ownername, (int)st.st_uid); + dirname, process_ownername, (int)running_uid, + pw ? pw->pw_name : "", (int)st.st_uid); tor_free(process_ownername); - tor_free(file_ownername); - close(fd); return -1; } - if ( (check & (CPD_GROUP_OK|CPD_GROUP_READ)) - && (st.st_gid != running_gid) && (st.st_gid != 0)) { + if ((check & CPD_GROUP_OK) && st.st_gid != running_gid) { struct group *gr; char *process_groupname = NULL; gr = getgrgid(running_gid); @@ -2380,80 +1959,33 @@ check_private_dir,(const char *dirname, cpd_check_t check, gr ? gr->gr_name : "", (int)st.st_gid); tor_free(process_groupname); - close(fd); return -1; } - unsigned unwanted_bits = 0; - if (check & (CPD_GROUP_OK|CPD_GROUP_READ)) { - unwanted_bits = 0027; + if (check & CPD_GROUP_OK) { + mask = 0027; } else { - unwanted_bits = 0077; + mask = 0077; } - unsigned check_bits_filter = ~0; - if (check & CPD_RELAX_DIRMODE_CHECK) { - check_bits_filter = 0022; - } - if ((st.st_mode & unwanted_bits & check_bits_filter) != 0) { + if (st.st_mode & mask) { unsigned new_mode; if (check & CPD_CHECK_MODE_ONLY) { log_warn(LD_FS, "Permissions on directory %s are too permissive.", dirname); - close(fd); return -1; } log_warn(LD_FS, "Fixing permissions on directory %s", dirname); new_mode = st.st_mode; new_mode |= 0700; /* Owner should have rwx */ - if (check & CPD_GROUP_READ) { - new_mode |= 0050; /* Group should have rx */ - } - new_mode &= ~unwanted_bits; /* Clear the bits that we didn't want set...*/ - if (fchmod(fd, new_mode)) { + new_mode &= ~mask; /* Clear the other bits that we didn't want set...*/ + if (chmod(dirname, new_mode)) { log_warn(LD_FS, "Could not chmod directory %s: %s", dirname, - strerror(errno)); - close(fd); - return -1; - } else { - close(fd); - return 0; - } - } - close(fd); -#else /* !(!defined(_WIN32)) */ - /* Win32 case: we can't open() a directory. */ - (void)effective_user; - - char *f = tor_strdup(dirname); - clean_name_for_stat(f); - log_debug(LD_FS, "stat()ing %s", f); - r = stat(sandbox_intern_string(f), &st); - tor_free(f); - if (r) { - if (errno != ENOENT) { - log_warn(LD_FS, "Directory %s cannot be read: %s", dirname, - strerror(errno)); - return -1; - } - if (check & CPD_CREATE) { - log_info(LD_GENERAL, "Creating directory %s", dirname); - r = mkdir(dirname); - if (r) { - log_warn(LD_FS, "Error creating directory %s: %s", dirname, - strerror(errno)); - return -1; - } - } else if (!(check & CPD_CHECK)) { - log_warn(LD_FS, "Directory %s does not exist.", dirname); + strerror(errno)); return -1; + } else { + return 0; } - return 0; - } - if (!(st.st_mode & S_IFDIR)) { - log_warn(LD_FS, "%s is not a directory", dirname); - return -1; } - -#endif /* !defined(_WIN32) */ +#endif return 0; } @@ -2464,16 +1996,15 @@ check_private_dir,(const char *dirname, cpd_check_t check, * function, and all other functions in util.c that create files, create them * with mode 0600. */ -MOCK_IMPL(int, -write_str_to_file,(const char *fname, const char *str, int bin)) +int +write_str_to_file(const char *fname, const char *str, int bin) { #ifdef _WIN32 if (!bin && strchr(str, '\r')) { log_warn(LD_BUG, - "We're writing a text string that already contains a CR to %s", - escaped(fname)); + "We're writing a text string that already contains a CR."); } -#endif /* defined(_WIN32) */ +#endif return write_bytes_to_file(fname, str, strlen(str), bin); } @@ -2610,7 +2141,6 @@ static int finish_writing_to_file_impl(open_file_t *file_data, int abort_write) { int r = 0; - tor_assert(file_data && file_data->filename); if (file_data->stdio_file) { if (fclose(file_data->stdio_file)) { @@ -2626,20 +2156,13 @@ finish_writing_to_file_impl(open_file_t *file_data, int abort_write) if (file_data->rename_on_close) { tor_assert(file_data->tempname && file_data->filename); - if (!abort_write) { + if (abort_write) { + unlink(file_data->tempname); + } else { tor_assert(strcmp(file_data->filename, file_data->tempname)); if (replace_file(file_data->tempname, file_data->filename)) { log_warn(LD_FS, "Error replacing \"%s\": %s", file_data->filename, strerror(errno)); - abort_write = r = -1; - } - } - if (abort_write) { - int res = unlink(file_data->tempname); - if (res != 0) { - /* We couldn't unlink and we'll leave a mess behind */ - log_warn(LD_FS, "Failed to unlink %s: %s", - file_data->tempname, strerror(errno)); r = -1; } } @@ -2778,10 +2301,8 @@ read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) char *string = NULL; size_t string_max = 0; - if (max_bytes_to_read+1 >= SIZE_T_CEILING) { - errno = EINVAL; + if (max_bytes_to_read+1 >= SIZE_T_CEILING) return NULL; - } do { /* XXXX This "add 1K" approach is a little goofy; if we care about @@ -2793,16 +2314,13 @@ read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) string = tor_realloc(string, string_max); r = read(fd, string + pos, string_max - pos - 1); if (r < 0) { - int save_errno = errno; tor_free(string); - errno = save_errno; return NULL; } pos += r; } while (r > 0 && pos < max_bytes_to_read); - tor_assert(pos < string_max); *sz_out = pos; string[pos] = '\0'; return string; @@ -2825,8 +2343,8 @@ read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) * the call to stat and the call to read_all: the resulting string will * be truncated. */ -MOCK_IMPL(char *, -read_file_to_str, (const char *filename, int flags, struct stat *stat_out)) +char * +read_file_to_str(const char *filename, int flags, struct stat *stat_out) { int fd; /* router file */ struct stat statbuf; @@ -2863,21 +2381,17 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out)) if (S_ISFIFO(statbuf.st_mode)) { size_t sz = 0; string = read_file_to_str_until_eof(fd, FIFO_READ_MAX, &sz); - int save_errno = errno; if (string && stat_out) { statbuf.st_size = sz; memcpy(stat_out, &statbuf, sizeof(struct stat)); } close(fd); - if (!string) - errno = save_errno; return string; } -#endif /* !defined(_WIN32) */ +#endif if ((uint64_t)(statbuf.st_size)+1 >= SIZE_T_CEILING) { close(fd); - errno = EINVAL; return NULL; } @@ -2906,7 +2420,7 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out)) if (!bin) { statbuf.st_size = (size_t) r; } else -#endif /* defined(_WIN32) || defined(__CYGWIN__) */ +#endif if (r != statbuf.st_size) { /* Unless we're using text mode on win32, we'd better have an exact * match for size. */ @@ -2934,7 +2448,7 @@ read_file_to_str, (const char *filename, int flags, struct stat *stat_out)) * provided), and return a pointer to the position in s immediately * after the string. On failure, return NULL. */ -const char * +static const char * unescape_string(const char *s, char **result, size_t *size_out) { const char *cp; @@ -2980,13 +2494,10 @@ unescape_string(const char *s, char **result, size_t *size_out) *out = '\0'; if (size_out) *size_out = out - *result; return cp+1; - - /* LCOV_EXCL_START -- we caught this in parse_config_from_line. */ case '\0': tor_fragile_assert(); tor_free(*result); return NULL; - /* LCOV_EXCL_STOP */ case '\\': switch (cp[1]) { @@ -3000,12 +2511,8 @@ unescape_string(const char *s, char **result, size_t *size_out) x1 = hex_decode_digit(cp[2]); x2 = hex_decode_digit(cp[3]); if (x1 == -1 || x2 == -1) { - /* LCOV_EXCL_START */ - /* we caught this above in the initial loop. */ - tor_assert_nonfatal_unreached(); - tor_free(*result); - return NULL; - /* LCOV_EXCL_STOP */ + tor_free(*result); + return NULL; } *out++ = ((x1<<4) + x2); @@ -3030,13 +2537,8 @@ unescape_string(const char *s, char **result, size_t *size_out) *out++ = cp[1]; cp += 2; break; - - /* LCOV_EXCL_START */ default: - /* we caught this above in the initial loop. */ - tor_assert_nonfatal_unreached(); tor_free(*result); return NULL; - /* LCOV_EXCL_STOP */ } break; default: @@ -3045,39 +2547,162 @@ unescape_string(const char *s, char **result, size_t *size_out) } } -/** Removes enclosing quotes from path and unescapes quotes between the - * enclosing quotes. Backslashes are not unescaped. Return the unquoted - * path on sucess or 0 if path is not quoted correctly. */ -char * -get_unquoted_path(const char *path) -{ - size_t len = strlen(path); +/** Given a string containing part of a configuration file or similar format, + * advance past comments and whitespace and try to parse a single line. If we + * parse a line successfully, set *key_out to a new string holding the + * key portion and *value_out to a new string holding the value portion + * of the line, and return a pointer to the start of the next line. If we run + * out of data, return a pointer to the end of the string. If we encounter an + * error, return NULL and set *err_out (if provided) to an error + * message. + */ +const char * +parse_config_line_from_str_verbose(const char *line, char **key_out, + char **value_out, + const char **err_out) +{ + /* I believe the file format here is supposed to be: + FILE = (EMPTYLINE | LINE)* (EMPTYLASTLINE | LASTLINE)? + + EMPTYLASTLINE = SPACE* | COMMENT + EMPTYLINE = EMPTYLASTLINE NL + SPACE = ' ' | '\r' | '\t' + COMMENT = '#' NOT-NL* + NOT-NL = Any character except '\n' + NL = '\n' + + LASTLINE = SPACE* KEY SPACE* VALUES + LINE = LASTLINE NL + KEY = KEYCHAR+ + KEYCHAR = Any character except ' ', '\r', '\n', '\t', '#', "\" + + VALUES = QUOTEDVALUE | NORMALVALUE + QUOTEDVALUE = QUOTE QVCHAR* QUOTE EOLSPACE? + QUOTE = '"' + QVCHAR = KEYCHAR | ESC ('n' | 't' | 'r' | '"' | ESC |'\'' | OCTAL | HEX) + ESC = "\\" + OCTAL = ODIGIT (ODIGIT ODIGIT?)? + HEX = ('x' | 'X') HEXDIGIT HEXDIGIT + ODIGIT = '0' .. '7' + HEXDIGIT = '0'..'9' | 'a' .. 'f' | 'A' .. 'F' + EOLSPACE = SPACE* COMMENT? + + NORMALVALUE = (VALCHAR | ESC ESC_IGNORE | CONTINUATION)* EOLSPACE? + VALCHAR = Any character except ESC, '#', and '\n' + ESC_IGNORE = Any character except '#' or '\n' + CONTINUATION = ESC NL ( COMMENT NL )* + */ - if (len == 0) { - return tor_strdup(""); + const char *key, *val, *cp; + int continuation = 0; + + tor_assert(key_out); + tor_assert(value_out); + + *key_out = *value_out = NULL; + key = val = NULL; + /* Skip until the first keyword. */ + while (1) { + while (TOR_ISSPACE(*line)) + ++line; + if (*line == '#') { + while (*line && *line != '\n') + ++line; + } else { + break; + } } - int has_start_quote = (path[0] == '\"'); - int has_end_quote = (len > 0 && path[len-1] == '\"'); - if (has_start_quote != has_end_quote || (len == 1 && has_start_quote)) { - return NULL; + if (!*line) { /* End of string? */ + *key_out = *value_out = NULL; + return line; } - char *unquoted_path = tor_malloc(len - has_start_quote - has_end_quote + 1); - char *s = unquoted_path; - size_t i; - for (i = has_start_quote; i < len - has_end_quote; i++) { - if (path[i] == '\"' && (i > 0 && path[i-1] == '\\')) { - *(s-1) = path[i]; - } else if (path[i] != '\"') { - *s++ = path[i]; - } else { /* unescaped quote */ - tor_free(unquoted_path); + /* Skip until the next space or \ followed by newline. */ + key = line; + while (*line && !TOR_ISSPACE(*line) && *line != '#' && + ! (line[0] == '\\' && line[1] == '\n')) + ++line; + *key_out = tor_strndup(key, line-key); + + /* Skip until the value. */ + while (*line == ' ' || *line == '\t') + ++line; + + val = line; + + /* Find the end of the line. */ + if (*line == '\"') { // XXX No continuation handling is done here + if (!(line = unescape_string(line, value_out, NULL))) { + if (err_out) + *err_out = "Invalid escape sequence in quoted string"; + return NULL; + } + while (*line == ' ' || *line == '\t') + ++line; + if (*line && *line != '#' && *line != '\n') { + if (err_out) + *err_out = "Excess data after quoted string"; return NULL; } + } else { + /* Look for the end of the line. */ + while (*line && *line != '\n' && (*line != '#' || continuation)) { + if (*line == '\\' && line[1] == '\n') { + continuation = 1; + line += 2; + } else if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + if (*line == '\n') + ++line; + } else { + ++line; + } + } + + if (*line == '\n') { + cp = line++; + } else { + cp = line; + } + /* Now back cp up to be the last nonspace character */ + while (cp>val && TOR_ISSPACE(*(cp-1))) + --cp; + + tor_assert(cp >= val); + + /* Now copy out and decode the value. */ + *value_out = tor_strndup(val, cp-val); + if (continuation) { + char *v_out, *v_in; + v_out = v_in = *value_out; + while (*v_in) { + if (*v_in == '#') { + do { + ++v_in; + } while (*v_in && *v_in != '\n'); + if (*v_in == '\n') + ++v_in; + } else if (v_in[0] == '\\' && v_in[1] == '\n') { + v_in += 2; + } else { + *v_out++ = *v_in++; + } + } + *v_out = '\0'; + } } - *s = '\0'; - return unquoted_path; + + if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + } + while (TOR_ISSPACE(*line)) ++line; + + return line; } /** Expand any homedir prefix on filename; return a newly allocated @@ -3087,12 +2712,8 @@ expand_filename(const char *filename) { tor_assert(filename); #ifdef _WIN32 - /* Might consider using GetFullPathName() as described here: - * http://etutorials.org/Programming/secure+programming/ - * Chapter+3.+Input+Validation/3.7+Validating+Filenames+and+Paths/ - */ return tor_strdup(filename); -#else /* !(defined(_WIN32)) */ +#else if (*filename == '~') { char *home, *result=NULL; const char *rest; @@ -3122,10 +2743,10 @@ expand_filename(const char *filename) } tor_free(username); rest = slash ? (slash+1) : ""; -#else /* !(defined(HAVE_PWD_H)) */ - log_warn(LD_CONFIG, "Couldn't expand homedir on system without pwd.h"); +#else + log_warn(LD_CONFIG, "Couldn't expend homedir on system without pwd.h"); return tor_strdup(filename); -#endif /* defined(HAVE_PWD_H) */ +#endif } tor_assert(home); /* Remove trailing slash. */ @@ -3138,7 +2759,7 @@ expand_filename(const char *filename) } else { return tor_strdup(filename); } -#endif /* defined(_WIN32) */ +#endif } #define MAX_SCANF_WIDTH 9999 @@ -3158,7 +2779,7 @@ digit_to_num(char d) * success, store the result in out, advance bufp to the next * character, and return 0. On failure, return -1. */ static int -scan_unsigned(const char **bufp, unsigned long *out, int width, unsigned base) +scan_unsigned(const char **bufp, unsigned long *out, int width, int base) { unsigned long result = 0; int scanned_so_far = 0; @@ -3171,15 +2792,11 @@ scan_unsigned(const char **bufp, unsigned long *out, int width, unsigned base) while (**bufp && (hex?TOR_ISXDIGIT(**bufp):TOR_ISDIGIT(**bufp)) && scanned_so_far < width) { - unsigned digit = hex?hex_decode_digit(*(*bufp)++):digit_to_num(*(*bufp)++); - // Check for overflow beforehand, without actually causing any overflow - // This preserves functionality on compilers that don't wrap overflow - // (i.e. that trap or optimise away overflow) - // result * base + digit > ULONG_MAX - // result * base > ULONG_MAX - digit - if (result > (ULONG_MAX - digit)/base) - return -1; /* Processing this digit would overflow */ - result = result * base + digit; + int digit = hex?hex_decode_digit(*(*bufp)++):digit_to_num(*(*bufp)++); + unsigned long new_result = result * base + digit; + if (new_result < result) + return -1; /* over/underflow. */ + result = new_result; ++scanned_so_far; } @@ -3214,18 +2831,10 @@ scan_signed(const char **bufp, long *out, int width) if (scan_unsigned(bufp, &result, width, 10) < 0) return -1; - if (neg && result > 0) { + if (neg) { if (result > ((unsigned long)LONG_MAX) + 1) return -1; /* Underflow */ - else if (result == ((unsigned long)LONG_MAX) + 1) - *out = LONG_MIN; - else { - /* We once had a far more clever no-overflow conversion here, but - * some versions of GCC apparently ran it into the ground. Now - * we just check for LONG_MIN explicitly. - */ - *out = -(long)result; - } + *out = -(long)result; } else { if (result > LONG_MAX) return -1; /* Overflow */ @@ -3371,10 +2980,8 @@ tor_vsscanf(const char *buf, const char *pattern, va_list ap) *out = lng; } else { int *out = va_arg(ap, int *); -#if LONG_MAX > INT_MAX if (lng < INT_MIN || lng > INT_MAX) return n_matched; -#endif *out = (int)lng; } ++pattern; @@ -3419,7 +3026,7 @@ tor_vsscanf(const char *buf, const char *pattern, va_list ap) /** Minimal sscanf replacement: parse buf according to pattern * and store the results in the corresponding argument fields. Differs from * sscanf in that: - *
      • It only handles %u, %lu, %x, %lx, %[NUM]s, %d, %ld, %lf, and %c. + *
        • It only handles %u, %lu, %x, %lx, %s, %d, %ld, %lf, and %c. *
        • It only handles decimal inputs for %lf. (12.3, not 1.23e1) *
        • It does not handle arbitrarily long widths. *
        • Numbers do not consume any space characters. @@ -3466,22 +3073,11 @@ smartlist_add_vasprintf(struct smartlist_t *sl, const char *pattern, smartlist_add(sl, str); } -/** Append a copy of string to sl */ -void -smartlist_add_strdup(struct smartlist_t *sl, const char *string) -{ - char *copy; - - copy = tor_strdup(string); - - smartlist_add(sl, copy); -} - /** Return a new list containing the filenames in the directory dirname. * Return NULL on error or if dirname is not a directory. */ -MOCK_IMPL(smartlist_t *, -tor_listdir, (const char *dirname)) +smartlist_t * +tor_listdir(const char *dirname) { smartlist_t *result; #ifdef _WIN32 @@ -3507,10 +3103,10 @@ tor_listdir, (const char *dirname)) name[sizeof(name)-1] = '\0'; #else strlcpy(name,findData.cFileName,sizeof(name)); -#endif /* defined(UNICODE) */ +#endif if (strcmp(name, ".") && strcmp(name, "..")) { - smartlist_add_strdup(result, name); + smartlist_add(result, tor_strdup(name)); } if (!FindNextFile(handle, &findData)) { DWORD err; @@ -3524,7 +3120,7 @@ tor_listdir, (const char *dirname)) } FindClose(handle); tor_free(pattern); -#else /* !(defined(_WIN32)) */ +#else const char *prot_dname = sandbox_intern_string(dirname); DIR *d; struct dirent *de; @@ -3536,10 +3132,10 @@ tor_listdir, (const char *dirname)) if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue; - smartlist_add_strdup(result, de->d_name); + smartlist_add(result, tor_strdup(de->d_name)); } closedir(d); -#endif /* defined(_WIN32) */ +#endif return result; } @@ -3555,7 +3151,7 @@ path_is_relative(const char *filename) else if (filename && strlen(filename)>3 && TOR_ISALPHA(filename[0]) && filename[1] == ':' && filename[2] == '\\') return 0; -#endif /* defined(_WIN32) */ +#endif else return 1; } @@ -3588,17 +3184,13 @@ start_daemon(void) start_daemon_called = 1; if (pipe(daemon_filedes)) { - /* LCOV_EXCL_START */ log_err(LD_GENERAL,"pipe failed; exiting. Error was %s", strerror(errno)); - exit(1); // exit ok: during daemonize, pipe failed. - /* LCOV_EXCL_STOP */ + exit(1); } pid = fork(); if (pid < 0) { - /* LCOV_EXCL_START */ log_err(LD_GENERAL,"fork failed. Exiting."); - exit(1); // exit ok: during daemonize, fork failed - /* LCOV_EXCL_STOP */ + exit(1); } if (pid) { /* Parent */ int ok; @@ -3612,13 +3204,13 @@ start_daemon(void) } fflush(stdout); if (ok == 1) - exit(0); // exit ok: during daemonize, daemonizing. + exit(0); else - exit(1); /* child reported error. exit ok: daemonize failed. */ + exit(1); /* child reported error */ } else { /* Child */ close(daemon_filedes[0]); /* we only write */ - (void) setsid(); /* Detach from controlling terminal */ + pid = setsid(); /* Detach from controlling terminal */ /* * Fork one more time, so the parent (the session group leader) can exit. * This means that we, as a non-session group leader, can never regain a @@ -3626,7 +3218,7 @@ start_daemon(void) * _Advanced Programming in the Unix Environment_. */ if (fork() != 0) { - exit(0); // exit ok: during daemonize, fork failed (2) + exit(0); } set_main_thread(); /* We are now the main thread. */ @@ -3655,15 +3247,13 @@ finish_daemon(const char *desired_cwd) /* Don't hold the wrong FS mounted */ if (chdir(desired_cwd) < 0) { log_err(LD_GENERAL,"chdir to \"%s\" failed. Exiting.",desired_cwd); - exit(1); // exit ok: during daemonize, chdir failed. + exit(1); } nullfd = tor_open_cloexec("/dev/null", O_RDWR, 0); if (nullfd < 0) { - /* LCOV_EXCL_START */ log_err(LD_GENERAL,"/dev/null can't be opened. Exiting."); - exit(1); // exit ok: during daemonize, couldn't open /dev/null - /* LCOV_EXCL_STOP */ + exit(1); } /* close fds linking to invoking terminal, but * close usual incoming fds, but redirect them somewhere @@ -3672,10 +3262,8 @@ finish_daemon(const char *desired_cwd) if (dup2(nullfd,0) < 0 || dup2(nullfd,1) < 0 || dup2(nullfd,2) < 0) { - /* LCOV_EXCL_START */ log_err(LD_GENERAL,"dup2 failed. Exiting."); - exit(1); // exit ok: during daemonize, dup2 failed. - /* LCOV_EXCL_STOP */ + exit(1); } if (nullfd > 2) close(nullfd); @@ -3685,7 +3273,7 @@ finish_daemon(const char *desired_cwd) } close(daemon_filedes[1]); } -#else /* !(!defined(_WIN32)) */ +#else /* defined(_WIN32) */ void start_daemon(void) @@ -3696,32 +3284,25 @@ finish_daemon(const char *cp) { (void)cp; } -#endif /* !defined(_WIN32) */ +#endif /** Write the current process ID, followed by NL, into filename. - * Return 0 on success, -1 on failure. */ -int -write_pidfile(const char *filename) +void +write_pidfile(char *filename) { FILE *pidfile; if ((pidfile = fopen(filename, "w")) == NULL) { log_warn(LD_FS, "Unable to open \"%s\" for writing: %s", filename, strerror(errno)); - return -1; } else { #ifdef _WIN32 - int pid = (int)_getpid(); + fprintf(pidfile, "%d\n", (int)_getpid()); #else - int pid = (int)getpid(); + fprintf(pidfile, "%d\n", (int)getpid()); #endif - int rv = 0; - if (fprintf(pidfile, "%d\n", pid) < 0) - rv = -1; - if (fclose(pidfile) < 0) - rv = -1; - return rv; + fclose(pidfile); } } @@ -3738,7 +3319,7 @@ load_windows_system_library(const TCHAR *library_name) _tcscat(path, library_name); return LoadLibrary(path); } -#endif /* defined(_WIN32) */ +#endif /** Format a single argument for being put on a Windows command line. * Returns a newly allocated string */ @@ -3786,9 +3367,8 @@ format_win_cmdline_argument(const char *arg) smartlist_add(arg_chars, (void*)&backslash); /* Allocate space for argument, quotes (if needed), and terminator */ - const size_t formatted_arg_len = smartlist_len(arg_chars) + - (need_quotes ? 2 : 0) + 1; - formatted_arg = tor_malloc_zero(formatted_arg_len); + formatted_arg = tor_malloc(sizeof(char) * + (smartlist_len(arg_chars) + (need_quotes?2:0) + 1)); /* Add leading quote */ i=0; @@ -3796,9 +3376,9 @@ format_win_cmdline_argument(const char *arg) formatted_arg[i++] = '"'; /* Add characters */ - SMARTLIST_FOREACH(arg_chars, char*, ch, + SMARTLIST_FOREACH(arg_chars, char*, c, { - formatted_arg[i++] = *ch; + formatted_arg[i++] = *c; }); /* Add trailing quote */ @@ -3870,7 +3450,7 @@ format_number_sigsafe(unsigned long x, char *buf, int buf_len, cp = buf + len; *cp = '\0'; do { - unsigned digit = (unsigned) (x % radix); + unsigned digit = x % radix; tor_assert(cp > buf); --cp; *cp = "0123456789ABCDEF"[digit]; @@ -3879,7 +3459,7 @@ format_number_sigsafe(unsigned long x, char *buf, int buf_len, /* NOT tor_assert; see above. */ if (cp != buf) { - abort(); // LCOV_EXCL_LINE + abort(); } return len; @@ -3953,13 +3533,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, /* Convert errno to be unsigned for hex conversion */ if (saved_errno < 0) { - // Avoid overflow on the cast to unsigned int when result is INT_MIN - // by adding 1 to the signed int negative value, - // then, after it has been negated and cast to unsigned, - // adding the original 1 back (the double-addition is intentional). - // Otherwise, the cast to signed could cause a temporary int - // to equal INT_MAX + 1, which is undefined. - unsigned_errno = ((unsigned int) -(saved_errno + 1)) + 1; + unsigned_errno = (unsigned int) -saved_errno; } else { unsigned_errno = (unsigned int) saved_errno; } @@ -4033,38 +3607,36 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, done: return res; } -#endif /* !defined(_WIN32) */ +#endif /* Maximum number of file descriptors, if we cannot get it via sysconf() */ #define DEFAULT_MAX_FD 256 -/** Terminate the process of process_handle, if that process has not - * already exited. - * - * Return 0 if we succeeded in terminating the process (or if the process - * already exited), and -1 if we tried to kill the process but failed. - * - * Based on code originally borrowed from Python's os.kill. */ +/** Terminate the process of process_handle. + * Code borrowed from Python's os.kill. */ int tor_terminate_process(process_handle_t *process_handle) { #ifdef _WIN32 if (tor_get_exit_code(process_handle, 0, NULL) == PROCESS_EXIT_RUNNING) { - HANDLE handle = process_handle->pid.hProcess; + HANDLE handle; + /* If the signal is outside of what GenerateConsoleCtrlEvent can use, + attempt to open and terminate the process. */ + handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, + process_handle->pid.dwProcessId); + if (!handle) + return -1; if (!TerminateProcess(handle, 0)) return -1; else return 0; } -#else /* !(defined(_WIN32)) */ - if (process_handle->waitpid_cb) { - /* We haven't got a waitpid yet, so we can just kill off the process. */ - return kill(process_handle->pid, SIGTERM); - } -#endif /* defined(_WIN32) */ +#else /* Unix */ + return kill(process_handle->pid, SIGTERM); +#endif - return 0; /* We didn't need to kill the process, so report success */ + return -1; } /** Return the Process ID of process_handle. */ @@ -4084,14 +3656,14 @@ tor_process_get_stdout_pipe(process_handle_t *process_handle) { return process_handle->stdout_pipe; } -#else /* !(defined(_WIN32)) */ +#else /* DOCDOC tor_process_get_stdout_pipe */ -int +FILE * tor_process_get_stdout_pipe(process_handle_t *process_handle) { - return process_handle->stdout_pipe; + return process_handle->stdout_handle; } -#endif /* defined(_WIN32) */ +#endif /* DOCDOC process_handle_new */ static process_handle_t * @@ -4100,35 +3672,16 @@ process_handle_new(void) process_handle_t *out = tor_malloc_zero(sizeof(process_handle_t)); #ifdef _WIN32 - out->stdin_pipe = INVALID_HANDLE_VALUE; out->stdout_pipe = INVALID_HANDLE_VALUE; out->stderr_pipe = INVALID_HANDLE_VALUE; #else - out->stdin_pipe = -1; out->stdout_pipe = -1; out->stderr_pipe = -1; -#endif /* defined(_WIN32) */ +#endif return out; } -#ifndef _WIN32 -/** Invoked when a process that we've launched via tor_spawn_background() has - * been found to have terminated. - */ -static void -process_handle_waitpid_cb(int status, void *arg) -{ - process_handle_t *process_handle = arg; - - process_handle->waitpid_exit_status = status; - clear_waitpid_callback(process_handle->waitpid_cb); - if (process_handle->status == PROCESS_STATUS_RUNNING) - process_handle->status = PROCESS_STATUS_NOTRUNNING; - process_handle->waitpid_cb = 0; -} -#endif /* !defined(_WIN32) */ - /** * @name child-process states * @@ -4144,25 +3697,11 @@ process_handle_waitpid_cb(int status, void *arg) #define CHILD_STATE_FORK 3 #define CHILD_STATE_DUPOUT 4 #define CHILD_STATE_DUPERR 5 -#define CHILD_STATE_DUPIN 6 +#define CHILD_STATE_REDIRECT 6 #define CHILD_STATE_CLOSEFD 7 #define CHILD_STATE_EXEC 8 #define CHILD_STATE_FAILEXEC 9 /** @} */ -/** - * Boolean. If true, then Tor may call execve or CreateProcess via - * tor_spawn_background. - **/ -static int may_spawn_background_process = 1; -/** - * Turn off may_spawn_background_process, so that all future calls to - * tor_spawn_background are guaranteed to fail. - **/ -void -tor_disable_spawning_background_processes(void) -{ - may_spawn_background_process = 0; -} /** Start a program in the background. If filename contains a '/', then * it will be treated as an absolute or relative path. Otherwise, on * non-Windows systems, the system path will be searched for filename. @@ -4187,19 +3726,11 @@ tor_spawn_background(const char *const filename, const char **argv, process_environment_t *env, process_handle_t **process_handle_out) { - if (BUG(may_spawn_background_process == 0)) { - /* We should never reach this point if we're forbidden to spawn - * processes. Instead we should have caught the attempt earlier. */ - return PROCESS_STATUS_ERROR; - } - #ifdef _WIN32 HANDLE stdout_pipe_read = NULL; HANDLE stdout_pipe_write = NULL; HANDLE stderr_pipe_read = NULL; HANDLE stderr_pipe_write = NULL; - HANDLE stdin_pipe_read = NULL; - HANDLE stdin_pipe_write = NULL; process_handle_t *process_handle; int status; @@ -4245,20 +3776,6 @@ tor_spawn_background(const char *const filename, const char **argv, return status; } - /* Set up pipe for stdin */ - if (!CreatePipe(&stdin_pipe_read, &stdin_pipe_write, &saAttr, 0)) { - log_warn(LD_GENERAL, - "Failed to create pipe for stdin communication with child process: %s", - format_win32_error(GetLastError())); - return status; - } - if (!SetHandleInformation(stdin_pipe_write, HANDLE_FLAG_INHERIT, 0)) { - log_warn(LD_GENERAL, - "Failed to configure pipe for stdin communication with child " - "process: %s", format_win32_error(GetLastError())); - return status; - } - /* Create the child process */ /* Windows expects argv to be a whitespace delimited string, so join argv up @@ -4273,7 +3790,7 @@ tor_spawn_background(const char *const filename, const char **argv, siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.hStdError = stderr_pipe_write; siStartInfo.hStdOutput = stdout_pipe_write; - siStartInfo.hStdInput = stdin_pipe_read; + siStartInfo.hStdInput = NULL; siStartInfo.dwFlags |= STARTF_USESTDHANDLES; /* Create the child process */ @@ -4303,19 +3820,18 @@ tor_spawn_background(const char *const filename, const char **argv, /* TODO: Close hProcess and hThread in process_handle->pid? */ process_handle->stdout_pipe = stdout_pipe_read; process_handle->stderr_pipe = stderr_pipe_read; - process_handle->stdin_pipe = stdin_pipe_write; status = process_handle->status = PROCESS_STATUS_RUNNING; } /* TODO: Close pipes on exit */ *process_handle_out = process_handle; return status; -#else /* !(defined(_WIN32)) */ +#else // _WIN32 pid_t pid; int stdout_pipe[2]; int stderr_pipe[2]; - int stdin_pipe[2]; int fd, retval; + ssize_t nbytes; process_handle_t *process_handle; int status; @@ -4336,9 +3852,9 @@ tor_spawn_background(const char *const filename, const char **argv, and we are not allowed to use unsafe functions between fork and exec */ error_message_length = strlen(error_message); - // child_state = CHILD_STATE_PIPE; + child_state = CHILD_STATE_PIPE; - /* Set up pipe for redirecting stdout, stderr, and stdin of child */ + /* Set up pipe for redirecting stdout and stderr of child */ retval = pipe(stdout_pipe); if (-1 == retval) { log_warn(LD_GENERAL, @@ -4359,21 +3875,7 @@ tor_spawn_background(const char *const filename, const char **argv, return status; } - retval = pipe(stdin_pipe); - if (-1 == retval) { - log_warn(LD_GENERAL, - "Failed to set up pipe for stdin communication with child process: %s", - strerror(errno)); - - close(stdout_pipe[0]); - close(stdout_pipe[1]); - close(stderr_pipe[0]); - close(stderr_pipe[1]); - - return status; - } - - // child_state = CHILD_STATE_MAXFD; + child_state = CHILD_STATE_MAXFD; #ifdef _SC_OPEN_MAX if (-1 == max_fd) { @@ -4384,25 +3886,16 @@ tor_spawn_background(const char *const filename, const char **argv, "Cannot find maximum file descriptor, assuming %d", max_fd); } } -#else /* !(defined(_SC_OPEN_MAX)) */ +#else max_fd = DEFAULT_MAX_FD; -#endif /* defined(_SC_OPEN_MAX) */ +#endif - // child_state = CHILD_STATE_FORK; + child_state = CHILD_STATE_FORK; pid = fork(); if (0 == pid) { /* In child */ -#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) - /* Attempt to have the kernel issue a SIGTERM if the parent - * goes away. Certain attributes of the binary being execve()ed - * will clear this during the execve() call, but it's better - * than nothing. - */ - prctl(PR_SET_PDEATHSIG, SIGTERM); -#endif /* defined(HAVE_SYS_PRCTL_H) && defined(__linux__) */ - child_state = CHILD_STATE_DUPOUT; /* Link child stdout to the write end of the pipe */ @@ -4417,21 +3910,22 @@ tor_spawn_background(const char *const filename, const char **argv, if (-1 == retval) goto error; - child_state = CHILD_STATE_DUPIN; + child_state = CHILD_STATE_REDIRECT; - /* Link child stdin to the read end of the pipe */ - retval = dup2(stdin_pipe[0], STDIN_FILENO); - if (-1 == retval) + /* Link stdin to /dev/null */ + fd = open("/dev/null", O_RDONLY); /* NOT cloexec, obviously. */ + if (fd != -1) + dup2(fd, STDIN_FILENO); + else goto error; - // child_state = CHILD_STATE_CLOSEFD; + child_state = CHILD_STATE_CLOSEFD; close(stderr_pipe[0]); close(stderr_pipe[1]); close(stdout_pipe[0]); close(stdout_pipe[1]); - close(stdin_pipe[0]); - close(stdin_pipe[1]); + close(fd); /* Close all other fds, including the read end of the pipe */ /* XXX: We should now be doing enough FD_CLOEXEC setting to make @@ -4440,17 +3934,15 @@ tor_spawn_background(const char *const filename, const char **argv, close(fd); } - // child_state = CHILD_STATE_EXEC; + child_state = CHILD_STATE_EXEC; /* Call the requested program. We need the cast because execvp doesn't define argv as const, even though it does not modify the arguments */ if (env) execve(filename, (char *const *) argv, env->unixoid_environment_block); - else { - static char *new_env[] = { NULL }; - execve(filename, (char *const *) argv, new_env); - } + else + execvp(filename, (char *const *) argv); /* If we got here, the exec or open(/dev/null) failed */ @@ -4459,8 +3951,7 @@ tor_spawn_background(const char *const filename, const char **argv, error: { /* XXX: are we leaking fds from the pipe? */ - int n, err=0; - ssize_t nbytes; + int n; n = format_helper_exit_status(child_state, errno, hex_errno); @@ -4469,24 +3960,21 @@ tor_spawn_background(const char *const filename, const char **argv, value, but there is nothing we can do if it fails */ /* TODO: Don't use STDOUT, use a pipe set up just for this purpose */ nbytes = write(STDOUT_FILENO, error_message, error_message_length); - err = (nbytes < 0); nbytes = write(STDOUT_FILENO, hex_errno, n); - err += (nbytes < 0); } - - _exit(err?254:255); // exit ok: in child. } + (void) nbytes; + + _exit(255); /* Never reached, but avoids compiler warning */ - return status; // LCOV_EXCL_LINE + return status; } /* In parent */ if (-1 == pid) { log_warn(LD_GENERAL, "Failed to fork child process: %s", strerror(errno)); - close(stdin_pipe[0]); - close(stdin_pipe[1]); close(stdout_pipe[0]); close(stdout_pipe[1]); close(stderr_pipe[0]); @@ -4510,10 +3998,6 @@ tor_spawn_background(const char *const filename, const char **argv, strerror(errno)); } - process_handle->waitpid_cb = set_waitpid_callback(pid, - process_handle_waitpid_cb, - process_handle); - process_handle->stderr_pipe = stderr_pipe[0]; retval = close(stderr_pipe[1]); @@ -4523,28 +4007,17 @@ tor_spawn_background(const char *const filename, const char **argv, strerror(errno)); } - /* Return write end of the stdin pipe to caller, and close the read end */ - process_handle->stdin_pipe = stdin_pipe[1]; - retval = close(stdin_pipe[0]); - - if (-1 == retval) { - log_warn(LD_GENERAL, - "Failed to close read end of stdin pipe in parent process: %s", - strerror(errno)); - } - status = process_handle->status = PROCESS_STATUS_RUNNING; - /* Set stdin/stdout/stderr pipes to be non-blocking */ - if (fcntl(process_handle->stdout_pipe, F_SETFL, O_NONBLOCK) < 0 || - fcntl(process_handle->stderr_pipe, F_SETFL, O_NONBLOCK) < 0 || - fcntl(process_handle->stdin_pipe, F_SETFL, O_NONBLOCK) < 0) { - log_warn(LD_GENERAL, "Failed to set stderror/stdout/stdin pipes " - "nonblocking in parent process: %s", strerror(errno)); - } + /* Set stdout/stderr pipes to be non-blocking */ + fcntl(process_handle->stdout_pipe, F_SETFL, O_NONBLOCK); + fcntl(process_handle->stderr_pipe, F_SETFL, O_NONBLOCK); + /* Open the buffered IO streams */ + process_handle->stdout_handle = fdopen(process_handle->stdout_pipe, "r"); + process_handle->stderr_handle = fdopen(process_handle->stderr_pipe, "r"); *process_handle_out = process_handle; - return status; -#endif /* defined(_WIN32) */ + return process_handle->status; +#endif // _WIN32 } /** Destroy all resources allocated by the process handle in @@ -4583,16 +4056,13 @@ tor_process_handle_destroy,(process_handle_t *process_handle, if (process_handle->stderr_pipe) CloseHandle(process_handle->stderr_pipe); +#else + if (process_handle->stdout_handle) + fclose(process_handle->stdout_handle); - if (process_handle->stdin_pipe) - CloseHandle(process_handle->stdin_pipe); -#else /* !(defined(_WIN32)) */ - close(process_handle->stdout_pipe); - close(process_handle->stderr_pipe); - close(process_handle->stdin_pipe); - - clear_waitpid_callback(process_handle->waitpid_cb); -#endif /* defined(_WIN32) */ + if (process_handle->stderr_handle) + fclose(process_handle->stderr_handle); +#endif memset(process_handle, 0x0f, sizeof(process_handle_t)); tor_free(process_handle); @@ -4606,10 +4076,10 @@ tor_process_handle_destroy,(process_handle_t *process_handle, * PROCESS_EXIT_EXITED if the process did exit. If there is a failure, * PROCESS_EXIT_ERROR will be returned and the contents of exit_code (if * non-NULL) will be undefined. N.B. Under *nix operating systems, this will - * probably not work in Tor, because waitpid() is called in main.c to reap any + * probably not work in Tor, because waitpid() is called in onion_main.c to reap any * terminated child processes.*/ int -tor_get_exit_code(process_handle_t *process_handle, +tor_get_exit_code(const process_handle_t *process_handle, int block, int *exit_code) { #ifdef _WIN32 @@ -4645,42 +4115,29 @@ tor_get_exit_code(process_handle_t *process_handle, return PROCESS_EXIT_ERROR; } } -#else /* !(defined(_WIN32)) */ +#else int stat_loc; int retval; - if (process_handle->waitpid_cb) { - /* We haven't processed a SIGCHLD yet. */ - retval = waitpid(process_handle->pid, &stat_loc, block?0:WNOHANG); - if (retval == process_handle->pid) { - clear_waitpid_callback(process_handle->waitpid_cb); - process_handle->waitpid_cb = NULL; - process_handle->waitpid_exit_status = stat_loc; - } - } else { - /* We already got a SIGCHLD for this process, and handled it. */ - retval = process_handle->pid; - stat_loc = process_handle->waitpid_exit_status; - } - + retval = waitpid(process_handle->pid, &stat_loc, block?0:WNOHANG); if (!block && 0 == retval) { /* Process has not exited */ return PROCESS_EXIT_RUNNING; } else if (retval != process_handle->pid) { log_warn(LD_GENERAL, "waitpid() failed for PID %d: %s", - (int)process_handle->pid, strerror(errno)); + process_handle->pid, strerror(errno)); return PROCESS_EXIT_ERROR; } if (!WIFEXITED(stat_loc)) { log_warn(LD_GENERAL, "Process %d did not exit normally", - (int)process_handle->pid); + process_handle->pid); return PROCESS_EXIT_ERROR; } if (exit_code != NULL) *exit_code = WEXITSTATUS(stat_loc); -#endif /* defined(_WIN32) */ +#endif // _WIN32 return PROCESS_EXIT_EXITED; } @@ -4688,7 +4145,7 @@ tor_get_exit_code(process_handle_t *process_handle, /** Helper: return the number of characters in s preceding the first * occurrence of ch. If ch does not occur in s, return * the length of s. Should be equivalent to strspn(s, "ch"). */ -static inline size_t +static INLINE size_t str_num_before(const char *s, char ch) { const char *cp = strchr(s, ch); @@ -4713,7 +4170,7 @@ environment_variable_names_equal(const char *s1, const char *s2) /** Free env (assuming it was produced by * process_environment_make). */ void -process_environment_free_(process_environment_t *env) +process_environment_free(process_environment_t *env) { if (env == NULL) return; @@ -4826,7 +4283,7 @@ get_current_process_environment_variables(void) char **environ_tmp; /* Not const char ** ? Really? */ for (environ_tmp = get_environment(); *environ_tmp; ++environ_tmp) { - smartlist_add_strdup(sl, *environ_tmp); + smartlist_add(sl, tor_strdup(*environ_tmp)); } return sl; @@ -4872,10 +4329,10 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, DWORD byte_count; BOOL process_exited = FALSE; - if (count > SIZE_T_CEILING || count > SSIZE_MAX) + if (count > SIZE_T_CEILING || count > SSIZE_T_MAX) return -1; - while (numread < count) { + while (numread != count) { /* Check if there is anything to read */ retval = PeekNamedPipe(h, NULL, 0, NULL, &byte_count, NULL); if (!retval) { @@ -4920,52 +4377,58 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, } return (ssize_t)numread; } -#else /* !(defined(_WIN32)) */ -/** Read from a handle fd into buf, up to count bytes. If +#else +/** Read from a handle h into buf, up to count bytes. If * process is NULL, the function will return immediately if there is * nothing more to read. Otherwise data will be read until end of file, or * count bytes are read. Returns the number of bytes read, or -1 on * error. Sets eof to true if eof is not NULL and the end of the * file has been reached. */ ssize_t -tor_read_all_handle(int fd, char *buf, size_t count, +tor_read_all_handle(FILE *h, char *buf, size_t count, const process_handle_t *process, int *eof) { size_t numread = 0; - ssize_t result; + char *retval; if (eof) *eof = 0; - if (count > SIZE_T_CEILING || count > SSIZE_MAX) + if (count > SIZE_T_CEILING || count > SSIZE_T_MAX) return -1; - while (numread < count) { - result = read(fd, buf+numread, count-numread); - - if (result == 0) { - log_debug(LD_GENERAL, "read() reached end of file"); - if (eof) - *eof = 1; - break; - } else if (result < 0 && errno == EAGAIN) { - if (process) - continue; - else + while (numread != count) { + /* Use fgets because that is what we use in log_from_pipe() */ + retval = fgets(buf+numread, (int)(count-numread), h); + if (NULL == retval) { + if (feof(h)) { + log_debug(LD_GENERAL, "fgets() reached end of file"); + if (eof) + *eof = 1; break; - } else if (result < 0) { - log_warn(LD_GENERAL, "read() failed: %s", strerror(errno)); - return -1; + } else { + if (EAGAIN == errno) { + if (process) + continue; + else + break; + } else { + log_warn(LD_GENERAL, "fgets() from handle failed: %s", + strerror(errno)); + return -1; + } + } } - - numread += result; + tor_assert(retval != NULL); + tor_assert(strlen(retval) + numread <= count); + numread += strlen(retval); } - log_debug(LD_GENERAL, "read() read %d bytes from handle", (int)numread); + log_debug(LD_GENERAL, "fgets() read %d bytes from handle", (int)numread); return (ssize_t)numread; } -#endif /* defined(_WIN32) */ +#endif /** Read from stdout of a process until the process exits. */ ssize_t @@ -4976,9 +4439,9 @@ tor_read_all_from_process_stdout(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stdout_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stdout_pipe, buf, count, + return tor_read_all_handle(process_handle->stdout_handle, buf, count, process_handle, NULL); -#endif /* defined(_WIN32) */ +#endif } /** Read from stdout of a process until the process exits. */ @@ -4990,9 +4453,9 @@ tor_read_all_from_process_stderr(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stderr_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stderr_pipe, buf, count, + return tor_read_all_handle(process_handle->stderr_handle, buf, count, process_handle, NULL); -#endif /* defined(_WIN32) */ +#endif } /** Split buf into lines, and add to smartlist. The buffer buf will be @@ -5067,30 +4530,6 @@ stream_status_to_string(enum stream_status stream_status) } } -/* DOCDOC */ -static void -log_portfw_spawn_error_message(const char *buf, - const char *executable, int *child_status) -{ - /* Parse error message */ - int retval, child_state, saved_errno; - retval = tor_sscanf(buf, SPAWN_ERROR_MESSAGE "%x/%x", - &child_state, &saved_errno); - if (retval == 2) { - log_warn(LD_GENERAL, - "Failed to start child process \"%s\" in state %d: %s", - executable, child_state, strerror(saved_errno)); - if (child_status) - *child_status = 1; - } else { - /* Failed to parse message from child process, log it as a - warning */ - log_warn(LD_GENERAL, - "Unexpected message from port forwarding helper \"%s\": %s", - executable, buf); - } -} - #ifdef _WIN32 /** Return a smartlist containing lines outputted from @@ -5181,13 +4620,14 @@ log_from_handle(HANDLE *pipe, int severity) return 0; } -#else /* !(defined(_WIN32)) */ +#else /** Return a smartlist containing lines outputted from - * fd. Return NULL on error, and set + * handle. Return NULL on error, and set * stream_status_out appropriately. */ MOCK_IMPL(smartlist_t *, -tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out)) +tor_get_lines_from_handle, (FILE *handle, + enum stream_status *stream_status_out)) { enum stream_status stream_status; char stdout_buf[400]; @@ -5196,13 +4636,13 @@ tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out)) while (1) { memset(stdout_buf, 0, sizeof(stdout_buf)); - stream_status = get_string_from_pipe(fd, + stream_status = get_string_from_pipe(handle, stdout_buf, sizeof(stdout_buf) - 1); if (stream_status != IO_STREAM_OKAY) goto done; if (!lines) lines = smartlist_new(); - smartlist_split_string(lines, stdout_buf, "\n", 0, 0); + smartlist_add(lines, tor_strdup(stdout_buf)); } done: @@ -5210,20 +4650,20 @@ tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out)) return lines; } -/** Read from fd, and send lines to log at the specified log level. +/** Read from stream, and send lines to log at the specified log level. * Returns 1 if stream is closed normally, -1 if there is a error reading, and * 0 otherwise. Handles lines from tor-fw-helper and * tor_spawn_background() specially. */ static int -log_from_pipe(int fd, int severity, const char *executable, +log_from_pipe(FILE *stream, int severity, const char *executable, int *child_status) { char buf[256]; enum stream_status r; for (;;) { - r = get_string_from_pipe(fd, buf, sizeof(buf) - 1); + r = get_string_from_pipe(stream, buf, sizeof(buf) - 1); if (r == IO_STREAM_CLOSED) { return 1; @@ -5237,7 +4677,23 @@ log_from_pipe(int fd, int severity, const char *executable, /* Check if buf starts with SPAWN_ERROR_MESSAGE */ if (strcmpstart(buf, SPAWN_ERROR_MESSAGE) == 0) { - log_portfw_spawn_error_message(buf, executable, child_status); + /* Parse error message */ + int retval, child_state, saved_errno; + retval = tor_sscanf(buf, SPAWN_ERROR_MESSAGE "%x/%x", + &child_state, &saved_errno); + if (retval == 2) { + log_warn(LD_GENERAL, + "Failed to start child process \"%s\" in state %d: %s", + executable, child_state, strerror(saved_errno)); + if (child_status) + *child_status = 1; + } else { + /* Failed to parse message from child process, log it as a + warning */ + log_warn(LD_GENERAL, + "Unexpected message from port forwarding helper \"%s\": %s", + executable, buf); + } } else { log_fn(severity, LD_GENERAL, "Port forwarding helper says: %s", buf); } @@ -5246,9 +4702,9 @@ log_from_pipe(int fd, int severity, const char *executable, /* We should never get here */ return -1; } -#endif /* defined(_WIN32) */ +#endif -/** Reads from fd and stores input in buf_out making +/** Reads from stream and stores input in buf_out making * sure it's below count bytes. * If the string has a trailing newline, we strip it off. * @@ -5264,34 +4720,58 @@ log_from_pipe(int fd, int severity, const char *executable, * IO_STREAM_OKAY: If everything went okay and we got a string * in buf_out. */ enum stream_status -get_string_from_pipe(int fd, char *buf_out, size_t count) +get_string_from_pipe(FILE *stream, char *buf_out, size_t count) { - ssize_t ret; + char *retval; + size_t len; tor_assert(count <= INT_MAX); - ret = read(fd, buf_out, count); + retval = fgets(buf_out, (int)count, stream); + + if (!retval) { + if (feof(stream)) { + /* Program has closed stream (probably it exited) */ + /* TODO: check error */ + return IO_STREAM_CLOSED; + } else { + if (EAGAIN == errno) { + /* Nothing more to read, try again next time */ + return IO_STREAM_EAGAIN; + } else { + /* There was a problem, abandon this child process */ + return IO_STREAM_TERM; + } + } + } else { + len = strlen(buf_out); + if (len == 0) { + /* this probably means we got a NUL at the start of the string. */ + return IO_STREAM_EAGAIN; + } - if (ret == 0) - return IO_STREAM_CLOSED; - else if (ret < 0 && errno == EAGAIN) - return IO_STREAM_EAGAIN; - else if (ret < 0) - return IO_STREAM_TERM; + if (buf_out[len - 1] == '\n') { + /* Remove the trailing newline */ + buf_out[len - 1] = '\0'; + } else { + /* No newline; check whether we overflowed the buffer */ + if (!feof(stream)) + log_info(LD_GENERAL, + "Line from stream was truncated: %s", buf_out); + /* TODO: What to do with this error? */ + } - if (buf_out[ret - 1] == '\n') { - /* Remove the trailing newline */ - buf_out[ret - 1] = '\0'; - } else - buf_out[ret] = '\0'; + return IO_STREAM_OKAY; + } - return IO_STREAM_OKAY; + /* We should never get here */ + return IO_STREAM_TERM; } /** Parse a line from tor-fw-helper and issue an appropriate * log message to our user. */ static void -handle_fw_helper_line(const char *executable, const char *line) +handle_fw_helper_line(const char *line) { smartlist_t *tokens = smartlist_new(); char *message = NULL; @@ -5302,19 +4782,6 @@ handle_fw_helper_line(const char *executable, const char *line) int port = 0; int success = 0; - if (strcmpstart(line, SPAWN_ERROR_MESSAGE) == 0) { - /* We need to check for SPAWN_ERROR_MESSAGE again here, since it's - * possible that it got sent after we tried to read it in log_from_pipe. - * - * XXX Ideally, we should be using one of stdout/stderr for the real - * output, and one for the output of the startup code. We used to do that - * before cd05f35d2c. - */ - int child_status; - log_portfw_spawn_error_message(line, executable, &child_status); - goto done; - } - smartlist_split_string(tokens, line, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); @@ -5394,8 +4861,7 @@ handle_fw_helper_line(const char *executable, const char *line) /** Read what tor-fw-helper has to say in its stdout and handle it * appropriately */ static int -handle_fw_helper_output(const char *executable, - process_handle_t *process_handle) +handle_fw_helper_output(process_handle_t *process_handle) { smartlist_t *fw_helper_output = NULL; enum stream_status stream_status = 0; @@ -5410,7 +4876,7 @@ handle_fw_helper_output(const char *executable, /* Handle the lines we got: */ SMARTLIST_FOREACH_BEGIN(fw_helper_output, char *, line) { - handle_fw_helper_line(executable, line); + handle_fw_helper_line(line); tor_free(line); } SMARTLIST_FOREACH_END(line); @@ -5476,7 +4942,7 @@ tor_check_port_forwarding(const char *filename, for each smartlist element (one for "-p" and one for the ports), and one for the final NULL. */ args_n = 1 + 2*smartlist_len(ports_to_forward) + 1; - argv = tor_calloc(args_n, sizeof(char *)); + argv = tor_malloc_zero(sizeof(char*)*args_n); argv[argv_index++] = filename; SMARTLIST_FOREACH_BEGIN(ports_to_forward, const char *, port) { @@ -5498,7 +4964,7 @@ tor_check_port_forwarding(const char *filename, status = tor_spawn_background(NULL, argv, NULL, &child_handle); #else status = tor_spawn_background(filename, argv, NULL, &child_handle); -#endif /* defined(_WIN32) */ +#endif tor_free_((void*)argv); argv=NULL; @@ -5522,10 +4988,10 @@ tor_check_port_forwarding(const char *filename, #ifdef _WIN32 stderr_status = log_from_handle(child_handle->stderr_pipe, LOG_INFO); #else - stderr_status = log_from_pipe(child_handle->stderr_pipe, + stderr_status = log_from_pipe(child_handle->stderr_handle, LOG_INFO, filename, &retval); -#endif /* defined(_WIN32) */ - if (handle_fw_helper_output(filename, child_handle) < 0) { +#endif + if (handle_fw_helper_output(child_handle) < 0) { log_warn(LD_GENERAL, "Failed to handle fw helper output."); stdout_status = -1; retval = -1; @@ -5549,13 +5015,13 @@ tor_check_port_forwarding(const char *filename, * between log_from_handle and tor_get_exit_code? */ retval = 1; } -#else /* !(defined(_WIN32)) */ +#else else if (1 == stdout_status || 1 == stderr_status) /* stdout or stderr was closed, the process probably - * exited. It will be reaped by waitpid() in main.c */ + * exited. It will be reaped by waitpid() in onion_main.c */ /* TODO: Do something with the process return value */ retval = 1; -#endif /* defined(_WIN32) */ +#endif else /* Both are fine */ retval = 0; @@ -5618,88 +5084,3 @@ tor_weak_random_range(tor_weak_rng_t *rng, int32_t top) return result; } -/** Cast a given double value to a int64_t. Return 0 if number is NaN. - * Returns either INT64_MIN or INT64_MAX if number is outside of the int64_t - * range. */ -int64_t -clamp_double_to_int64(double number) -{ - int exponent; - -#if defined(MINGW_ANY) && GCC_VERSION >= 409 -/* - Mingw's math.h uses gcc's __builtin_choose_expr() facility to declare - isnan, isfinite, and signbit. But as implemented in at least some - versions of gcc, __builtin_choose_expr() can generate type warnings - even from branches that are not taken. So, suppress those warnings. -*/ -#define PROBLEMATIC_FLOAT_CONVERSION_WARNING -DISABLE_GCC_WARNING(float-conversion) -#endif /* defined(MINGW_ANY) && GCC_VERSION >= 409 */ - -/* - With clang 4.0 we apparently run into "double promotion" warnings here, - since clang thinks we're promoting a double to a long double. - */ -#if defined(__clang__) -#if __has_warning("-Wdouble-promotion") -#define PROBLEMATIC_DOUBLE_PROMOTION_WARNING -DISABLE_GCC_WARNING(double-promotion) -#endif -#endif /* defined(__clang__) */ - - /* NaN is a special case that can't be used with the logic below. */ - if (isnan(number)) { - return 0; - } - - /* Time to validate if result can overflows a int64_t value. Fun with - * float! Find that exponent exp such that - * number == x * 2^exp - * for some x with abs(x) in [0.5, 1.0). Note that this implies that the - * magnitude of number is strictly less than 2^exp. - * - * If number is infinite, the call to frexp is legal but the contents of - * are exponent unspecified. */ - frexp(number, &exponent); - - /* If the magnitude of number is strictly less than 2^63, the truncated - * version of number is guaranteed to be representable. The only - * representable integer for which this is not the case is INT64_MIN, but - * it is covered by the logic below. */ - if (isfinite(number) && exponent <= 63) { - return (int64_t)number; - } - - /* Handle infinities and finite numbers with magnitude >= 2^63. */ - return signbit(number) ? INT64_MIN : INT64_MAX; - -#ifdef PROBLEMATIC_DOUBLE_PROMOTION_WARNING -ENABLE_GCC_WARNING(double-promotion) -#endif -#ifdef PROBLEMATIC_FLOAT_CONVERSION_WARNING -ENABLE_GCC_WARNING(float-conversion) -#endif -} - -/** Return a uint64_t value from a in network byte order. */ -uint64_t -tor_htonll(uint64_t a) -{ -#ifdef WORDS_BIGENDIAN - /* Big endian. */ - return a; -#else /* WORDS_BIGENDIAN */ - /* Little endian. The worst... */ - return htonl((uint32_t)(a>>32)) | - (((uint64_t)htonl((uint32_t)a))<<32); -#endif /* defined(WORDS_BIGENDIAN) */ -} - -/** Return a uint64_t value from a in host byte order. */ -uint64_t -tor_ntohll(uint64_t a) -{ - return tor_htonll(a); -} - diff --git a/src/tor/src/common/util.h b/src/tor/tor_util.h similarity index 77% rename from src/tor/src/common/util.h rename to src/tor/tor_util.h index 8dc64ce9f..8bc6ae7f5 100644 --- a/src/tor/src/common/util.h +++ b/src/tor/tor_util.h @@ -1,10 +1,10 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** - * \file util.h + * \file tor_util.h * \brief Headers for util.c **/ @@ -13,7 +13,7 @@ #include "orconfig.h" #include "torint.h" -#include "compat.h" +#include "tor_compat.h" #include "di_ops.h" #include "testsupport.h" #include @@ -22,7 +22,6 @@ /* for the correct alias to struct stat */ #include #endif -#include "util_bug.h" #ifndef O_BINARY #define O_BINARY 0 @@ -30,10 +29,33 @@ #ifndef O_TEXT #define O_TEXT 0 #endif -#ifndef O_NOFOLLOW -#define O_NOFOLLOW 0 + +/* Replace assert() with a variant that sends failures to the log before + * calling assert() normally. + */ +#ifdef NDEBUG +/* Nobody should ever want to build with NDEBUG set. 99% of our asserts will + * be outside the critical path anyway, so it's silly to disable bug-checking + * throughout the entire program just because a few asserts are slowing you + * down. Profile, optimize the critical path, and keep debugging on. + * + * And I'm not just saying that because some of our asserts check + * security-critical properties. + */ +#error "Sorry; we don't support building with NDEBUG." #endif +/** Like assert(3), but send assertion failures to the log as well as to + * stderr. */ +#define tor_assert(expr) STMT_BEGIN \ + if (PREDICT_UNLIKELY(!(expr))) { \ + tor_assertion_failed_(SHORT_FILE__, __LINE__, __func__, #expr); \ + abort(); \ + } STMT_END + +void tor_assertion_failed_(const char *fname, unsigned int line, + const char *func, const char *expr); + /* If we're building with dmalloc, we want all of our memory allocation * functions to take an extra file/line pair of arguments. If not, not. * We define DMALLOC_PARAMS to the extra parameters to insert in the @@ -45,14 +67,18 @@ #else #define DMALLOC_PARAMS #define DMALLOC_ARGS -#endif /* defined(USE_DMALLOC) */ +#endif + +/** Define this if you want Tor to crash when any problem comes up, + * so you can get a coredump and track things down. */ +// #define tor_fragile_assert() tor_assert(0) +#define tor_fragile_assert() /* Memory management */ void *tor_malloc_(size_t size DMALLOC_PARAMS) ATTR_MALLOC; void *tor_malloc_zero_(size_t size DMALLOC_PARAMS) ATTR_MALLOC; void *tor_calloc_(size_t nmemb, size_t size DMALLOC_PARAMS) ATTR_MALLOC; void *tor_realloc_(void *ptr, size_t size DMALLOC_PARAMS); -void *tor_reallocarray_(void *ptr, size_t size1, size_t size2 DMALLOC_PARAMS); char *tor_strdup_(const char *s DMALLOC_PARAMS) ATTR_MALLOC ATTR_NONNULL((1)); char *tor_strndup_(const char *s, size_t n DMALLOC_PARAMS) ATTR_MALLOC ATTR_NONNULL((1)); @@ -61,8 +87,6 @@ void *tor_memdup_(const void *mem, size_t len DMALLOC_PARAMS) void *tor_memdup_nulterm_(const void *mem, size_t len DMALLOC_PARAMS) ATTR_MALLOC ATTR_NONNULL((1)); void tor_free_(void *mem); -uint64_t tor_htonll(uint64_t a); -uint64_t tor_ntohll(uint64_t a); #ifdef USE_DMALLOC extern int dmalloc_free(const char *file, const int line, void *pnt, const int func_id); @@ -72,7 +96,7 @@ extern int dmalloc_free(const char *file, const int line, void *pnt, (p)=NULL; \ } \ STMT_END -#else /* !(defined(USE_DMALLOC)) */ +#else /** Release memory allocated by tor_malloc, tor_realloc, tor_strdup, etc. * Unlike the free() function, tor_free() will still work on NULL pointers, * and it sets the pointer value to NULL after freeing it. @@ -80,61 +104,38 @@ extern int dmalloc_free(const char *file, const int line, void *pnt, * This is a macro. If you need a function pointer to release memory from * tor_malloc(), use tor_free_(). */ -#ifdef __GNUC__ -#define tor_free(p) STMT_BEGIN \ - typeof(&(p)) tor_free__tmpvar = &(p); \ - if (PREDICT_LIKELY((*tor_free__tmpvar)!=NULL)) { \ - raw_free(*tor_free__tmpvar); \ - *tor_free__tmpvar=NULL; \ - } \ - STMT_END -#else #define tor_free(p) STMT_BEGIN \ if (PREDICT_LIKELY((p)!=NULL)) { \ - raw_free(p); \ + free(p); \ (p)=NULL; \ } \ STMT_END #endif -#endif /* defined(USE_DMALLOC) */ #define tor_malloc(size) tor_malloc_(size DMALLOC_ARGS) #define tor_malloc_zero(size) tor_malloc_zero_(size DMALLOC_ARGS) #define tor_calloc(nmemb,size) tor_calloc_(nmemb, size DMALLOC_ARGS) #define tor_realloc(ptr, size) tor_realloc_(ptr, size DMALLOC_ARGS) -#define tor_reallocarray(ptr, sz1, sz2) \ - tor_reallocarray_((ptr), (sz1), (sz2) DMALLOC_ARGS) #define tor_strdup(s) tor_strdup_(s DMALLOC_ARGS) #define tor_strndup(s, n) tor_strndup_(s, n DMALLOC_ARGS) #define tor_memdup(s, n) tor_memdup_(s, n DMALLOC_ARGS) #define tor_memdup_nulterm(s, n) tor_memdup_nulterm_(s, n DMALLOC_ARGS) -/* Aliases for the underlying system malloc/realloc/free. Only use - * them to indicate "I really want the underlying system function, I know - * what I'm doing." */ -#define raw_malloc malloc -#define raw_realloc realloc -#define raw_free free -#define raw_strdup strdup - void tor_log_mallinfo(int severity); -/* Helper macro: free a variable of type 'typename' using freefn, and - * set the variable to NULL. - */ -#define FREE_AND_NULL(typename, freefn, var) \ - do { \ - /* only evaluate (var) once. */ \ - typename **tmp__free__ptr ## freefn = &(var); \ - freefn(*tmp__free__ptr ## freefn); \ - (*tmp__free__ptr ## freefn) = NULL; \ - } while (0) +/** Return the offset of member within the type tp, in bytes */ +#if defined(__GNUC__) && __GNUC__ > 3 +#define STRUCT_OFFSET(tp, member) __builtin_offsetof(tp, member) +#else + #define STRUCT_OFFSET(tp, member) \ + ((off_t) (((char*)&((tp*)0)->member)-(char*)0)) +#endif /** Macro: yield a pointer to the field at position off within the * structure st. Example: *
            *   struct a { int foo; int bar; } x;
          - *   off_t bar_offset = offsetof(struct a, bar);
          + *   off_t bar_offset = STRUCT_OFFSET(struct a, bar);
            *   int *bar_p = STRUCT_VAR_P(&x, bar_offset);
            *   *bar_p = 3;
            * 
          @@ -151,7 +152,7 @@ void tor_log_mallinfo(int severity); *
*/ #define SUBTYPE_P(p, subtype, basemember) \ - ((void*) ( ((char*)(p)) - offsetof(subtype, basemember) )) + ((void*) ( ((char*)(p)) - STRUCT_OFFSET(subtype, basemember) )) /* Logic */ /** Macro: true if two values have the same boolean value. */ @@ -168,17 +169,12 @@ uint64_t round_to_power_of_2(uint64_t u64); unsigned round_to_next_multiple_of(unsigned number, unsigned divisor); uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor); uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor); -int64_t sample_laplace_distribution(double mu, double b, double p); -int64_t add_laplace_noise(int64_t signal, double random, double delta_f, - double epsilon); int n_bits_set_u8(uint8_t v); -int64_t clamp_double_to_int64(double number); -void simplify_fraction64(uint64_t *numer, uint64_t *denom); /* Compute the CEIL of a divided by b, for nonnegative a - * and positive b. Works on integer types only. Not defined if a+(b-1) - * can overflow. */ -#define CEIL_DIV(a,b) (((a)+((b)-1))/(b)) + * and positive b. Works on integer types only. Not defined if a+b can + * overflow. */ +#define CEIL_DIV(a,b) (((a)+(b)-1)/(b)) /* Return v if it's between min and max. Otherwise * return min if v is smaller than min, or max if @@ -199,7 +195,6 @@ void tor_strlower(char *s) ATTR_NONNULL((1)); void tor_strupper(char *s) ATTR_NONNULL((1)); int tor_strisprint(const char *s) ATTR_NONNULL((1)); int tor_strisnonupper(const char *s) ATTR_NONNULL((1)); -int tor_strisspace(const char *s); int strcmp_opt(const char *s1, const char *s2); int strcmpstart(const char *s1, const char *s2) ATTR_NONNULL((1,2)); int strcmp_len(const char *s1, const char *s2, size_t len) ATTR_NONNULL((1,2)); @@ -207,6 +202,7 @@ int strcasecmpstart(const char *s1, const char *s2) ATTR_NONNULL((1,2)); int strcmpend(const char *s1, const char *s2) ATTR_NONNULL((1,2)); int strcasecmpend(const char *s1, const char *s2) ATTR_NONNULL((1,2)); int fast_memcmpstart(const void *mem, size_t memlen, const char *prefix); +void tor_strclear(char *s); void tor_strstrip(char *s, const char *strip) ATTR_NONNULL((1,2)); long tor_parse_long(const char *s, int base, long min, @@ -228,15 +224,11 @@ const char *find_str_at_start_of_line(const char *haystack, const char *needle); int string_is_C_identifier(const char *string); int string_is_key_value(int severity, const char *string); -int string_is_valid_hostname(const char *string); -int string_is_valid_ipv4_address(const char *string); -int string_is_valid_ipv6_address(const char *string); int tor_mem_is_zero(const char *mem, size_t len); int tor_digest_is_zero(const char *digest); int tor_digest256_is_zero(const char *digest); char *esc_for_log(const char *string) ATTR_MALLOC; -char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC; const char *escaped(const char *string); char *tor_escape_str_for_pt_args(const char *string, @@ -253,7 +245,10 @@ void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern, ...) void smartlist_add_vasprintf(struct smartlist_t *sl, const char *pattern, va_list args) CHECK_PRINTF(2, 0); -void smartlist_add_strdup(struct smartlist_t *sl, const char *string); + +int hex_decode_digit(char c); +void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen); +int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen); /* Time helpers */ long tv_udiff(const struct timeval *start, const struct timeval *end); @@ -269,9 +264,7 @@ void format_local_iso_time(char *buf, time_t t); void format_iso_time(char *buf, time_t t); void format_iso_time_nospace(char *buf, time_t t); void format_iso_time_nospace_usec(char *buf, const struct timeval *tv); -int parse_iso_time_(const char *cp, time_t *t, int strict, int nospace); int parse_iso_time(const char *buf, time_t *t); -int parse_iso_time_nospace(const char *cp, time_t *t); int parse_http_time(const char *buf, struct tm *tm); int format_time_interval(char *out, size_t out_len, long interval); @@ -282,7 +275,7 @@ int format_time_interval(char *out, size_t out_len, long interval); #else time_t approx_time(void); void update_approx_time(time_t now); -#endif /* defined(TIME_IS_FAST) */ +#endif /* Rate-limiter */ @@ -317,7 +310,6 @@ typedef struct ratelim_t { } ratelim_t; #define RATELIM_INIT(r) { (r), 0, 0 } -#define RATELIM_TOOMANY (16*1000*1000) char *rate_limit_log(ratelim_t *lim, time_t now); @@ -335,29 +327,23 @@ enum stream_status { const char *stream_status_to_string(enum stream_status stream_status); -enum stream_status get_string_from_pipe(int fd, char *buf, size_t count); - -MOCK_DECL(int,tor_unlink,(const char *pathname)); +enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count); /** Return values from file_status(); see that function's documentation * for details. */ -typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR, FN_EMPTY } file_status_t; +typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR } file_status_t; file_status_t file_status(const char *filename); /** Possible behaviors for check_private_dir() on encountering a nonexistent * directory; see that function's documentation for details. */ typedef unsigned int cpd_check_t; -#define CPD_NONE 0 -#define CPD_CREATE (1u << 0) -#define CPD_CHECK (1u << 1) -#define CPD_GROUP_OK (1u << 2) -#define CPD_GROUP_READ (1u << 3) -#define CPD_CHECK_MODE_ONLY (1u << 4) -#define CPD_RELAX_DIRMODE_CHECK (1u << 5) -MOCK_DECL(int, check_private_dir, - (const char *dirname, cpd_check_t check, - const char *effective_user)); - +#define CPD_NONE 0 +#define CPD_CREATE 1 +#define CPD_CHECK 2 +#define CPD_GROUP_OK 4 +#define CPD_CHECK_MODE_ONLY 8 +int check_private_dir(const char *dirname, cpd_check_t check, + const char *effective_user); #define OPEN_FLAGS_REPLACE (O_WRONLY|O_CREAT|O_TRUNC) #define OPEN_FLAGS_APPEND (O_WRONLY|O_CREAT|O_APPEND) #define OPEN_FLAGS_DONT_REPLACE (O_CREAT|O_EXCL|O_APPEND|O_WRONLY) @@ -369,8 +355,7 @@ FILE *start_writing_to_stdio_file(const char *fname, int open_flags, int mode, FILE *fdopen_file(open_file_t *file_data); int finish_writing_to_file(open_file_t *file_data); int abort_writing_to_file(open_file_t *file_data); -MOCK_DECL(int, -write_str_to_file,(const char *fname, const char *str, int bin)); +int write_str_to_file(const char *fname, const char *str, int bin); MOCK_DECL(int, write_bytes_to_file,(const char *fname, const char *str, size_t len, int bin)); @@ -395,30 +380,30 @@ int write_bytes_to_new_file(const char *fname, const char *str, size_t len, #ifndef _WIN32 struct stat; #endif -MOCK_DECL_ATTR(char *, read_file_to_str, - (const char *filename, int flags, struct stat *stat_out), - ATTR_MALLOC); +char *read_file_to_str(const char *filename, int flags, struct stat *stat_out) + ATTR_MALLOC; char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) ATTR_MALLOC; -const char *unescape_string(const char *s, char **result, size_t *size_out); -char *get_unquoted_path(const char *path); +const char *parse_config_line_from_str_verbose(const char *line, + char **key_out, char **value_out, + const char **err_out); +#define parse_config_line_from_str(line,key_out,value_out) \ + parse_config_line_from_str_verbose((line),(key_out),(value_out),NULL) char *expand_filename(const char *filename); -MOCK_DECL(struct smartlist_t *, tor_listdir, (const char *dirname)); +struct smartlist_t *tor_listdir(const char *dirname); int path_is_relative(const char *filename); /* Process helpers */ void start_daemon(void); void finish_daemon(const char *desired_cwd); -int write_pidfile(const char *filename); +void write_pidfile(char *filename); /* Port forwarding */ void tor_check_port_forwarding(const char *filename, struct smartlist_t *ports_to_forward, time_t now); -void tor_disable_spawning_background_processes(void); - typedef struct process_handle_t process_handle_t; typedef struct process_environment_t process_environment_t; int tor_spawn_background(const char *const filename, const char **argv, @@ -444,9 +429,7 @@ struct process_environment_t { }; process_environment_t *process_environment_make(struct smartlist_t *env_vars); -void process_environment_free_(process_environment_t *env); -#define process_environment_free(env) \ - FREE_AND_NULL(process_environment_t, process_environment_free_, (env)) +void process_environment_free(process_environment_t *env); struct smartlist_t *get_current_process_environment_variables(void); @@ -463,47 +446,40 @@ void set_environment_variable_in_smartlist(struct smartlist_t *env_vars, #define PROCESS_STATUS_ERROR -1 #ifdef UTIL_PRIVATE -struct waitpid_callback_t; /** Structure to represent the state of a process with which Tor is * communicating. The contents of this structure are private to util.c */ struct process_handle_t { /** One of the PROCESS_STATUS_* values */ int status; #ifdef _WIN32 - HANDLE stdin_pipe; HANDLE stdout_pipe; HANDLE stderr_pipe; PROCESS_INFORMATION pid; -#else /* !(defined(_WIN32)) */ - int stdin_pipe; +#else int stdout_pipe; int stderr_pipe; + FILE *stdout_handle; + FILE *stderr_handle; pid_t pid; - /** If the process has not given us a SIGCHLD yet, this has the - * waitpid_callback_t that gets invoked once it has. Otherwise this - * contains NULL. */ - struct waitpid_callback_t *waitpid_cb; - /** The exit status reported by waitpid. */ - int waitpid_exit_status; -#endif /* defined(_WIN32) */ +#endif // _WIN32 }; -#endif /* defined(UTIL_PRIVATE) */ +#endif /* Return values of tor_get_exit_code() */ #define PROCESS_EXIT_RUNNING 1 #define PROCESS_EXIT_EXITED 0 #define PROCESS_EXIT_ERROR -1 -int tor_get_exit_code(process_handle_t *process_handle, +int tor_get_exit_code(const process_handle_t *process_handle, int block, int *exit_code); int tor_split_lines(struct smartlist_t *sl, char *buf, int len); #ifdef _WIN32 ssize_t tor_read_all_handle(HANDLE h, char *buf, size_t count, const process_handle_t *process); #else -ssize_t tor_read_all_handle(int fd, char *buf, size_t count, +ssize_t tor_read_all_handle(FILE *h, char *buf, size_t count, const process_handle_t *process, int *eof); -#endif /* defined(_WIN32) */ +#endif ssize_t tor_read_all_from_process_stdout( const process_handle_t *process_handle, char *buf, size_t count); ssize_t tor_read_all_from_process_stderr( @@ -514,7 +490,7 @@ int tor_process_get_pid(process_handle_t *process_handle); #ifdef _WIN32 HANDLE tor_process_get_stdout_pipe(process_handle_t *process_handle); #else -int tor_process_get_stdout_pipe(process_handle_t *process_handle); +FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle); #endif #ifdef _WIN32 @@ -523,9 +499,9 @@ tor_get_lines_from_handle,(HANDLE *handle, enum stream_status *stream_status)); #else MOCK_DECL(struct smartlist_t *, -tor_get_lines_from_handle,(int fd, +tor_get_lines_from_handle,(FILE *handle, enum stream_status *stream_status)); -#endif /* defined(_WIN32) */ +#endif int tor_terminate_process(process_handle_t *process_handle); @@ -562,13 +538,13 @@ STATIC int format_helper_exit_status(unsigned char child_state, leading minus) and newline (no null) */ #define HEX_ERRNO_SIZE (sizeof(char) * 2 + 1 + \ 1 + sizeof(int) * 2 + 1) -#endif /* !defined(_WIN32) */ +#endif -#endif /* defined(UTIL_PRIVATE) */ +#endif -int size_mul_check(const size_t x, const size_t y); +const char *libor_get_digests(void); -#define ARRAY_LENGTH(x) ((sizeof(x)) / sizeof(x[0])) +#define ARRAY_LENGTH(x) (sizeof(x)) / sizeof(x[0]) -#endif /* !defined(TOR_UTIL_H) */ +#endif diff --git a/src/tor/torgzip.c b/src/tor/torgzip.c new file mode 100644 index 000000000..6c2f4d4ed --- /dev/null +++ b/src/tor/torgzip.c @@ -0,0 +1,527 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file torgzip.c + * \brief A simple in-memory gzip implementation. + **/ + +#include "orconfig.h" + +#include +#include +#include +#include +#include "torint.h" + +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#include "tor_util.h" +#include "torlog.h" +#include "torgzip.h" + +/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of + saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory + that nobody will care if the compile outputs a no-such-identifier warning. + + Sorry, but we like -Werror over here, so I guess we need to define these. + I hope that zlib 1.2.6 doesn't break these too. +*/ +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE 0 +#endif +#ifndef _LFS64_LARGEFILE +#define _LFS64_LARGEFILE 0 +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 0 +#endif +#ifndef off64_t +#define off64_t int64_t +#endif + +#include + +/** Set to 1 if zlib is a version that supports gzip; set to 0 if it doesn't; + * set to -1 if we haven't checked yet. */ +static int gzip_is_supported = -1; + +/** Return true iff we support gzip-based compression. Otherwise, we need to + * use zlib. */ +int +is_gzip_supported(void) +{ + if (gzip_is_supported >= 0) + return gzip_is_supported; + + if (!strcmpstart(ZLIB_VERSION, "0.") || + !strcmpstart(ZLIB_VERSION, "1.0") || + !strcmpstart(ZLIB_VERSION, "1.1")) + gzip_is_supported = 0; + else + gzip_is_supported = 1; + + return gzip_is_supported; +} + +/** Return a string representation of the version of the currently running + * version of zlib. */ +const char * +tor_zlib_get_version_str(void) +{ + return zlibVersion(); +} + +/** Return a string representation of the version of the version of zlib +* used at compilation. */ +const char * +tor_zlib_get_header_version_str(void) +{ + return ZLIB_VERSION; +} + +/** Return the 'bits' value to tell zlib to use method.*/ +static INLINE int +method_bits(compress_method_t method) +{ + /* Bits+16 means "use gzip" in zlib >= 1.2 */ + return method == GZIP_METHOD ? 15+16 : 15; +} + +/** @{ */ +/* These macros define the maximum allowable compression factor. Anything of + * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to + * have an uncompression factor (uncompressed size:compressed size ratio) of + * any greater than MAX_UNCOMPRESSION_FACTOR. + * + * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to + * be small to limit the attack multiplier, but we also want it to be large + * enough so that no legitimate document --even ones we might invent in the + * future -- ever compresses by a factor of greater than + * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably + * large range of possible values. IMO, anything over 8 is probably safe; IMO + * anything under 50 is probably sufficient. + */ +#define MAX_UNCOMPRESSION_FACTOR 25 +#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) +/** @} */ + +/** Return true if uncompressing an input of size in_size to an input + * of size at least size_out looks like a compression bomb. */ +static int +is_compression_bomb(size_t size_in, size_t size_out) +{ + if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) + return 0; + + return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); +} + +/** Given in_len bytes at in, compress them into a newly + * allocated buffer, using the method described in method. Store the + * compressed string in *out, and its length in *out_len. + * Return 0 on success, -1 on failure. + */ +int +tor_gzip_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method) +{ + struct z_stream_s *stream = NULL; + size_t out_size, old_size; + off_t offset; + + tor_assert(out); + tor_assert(out_len); + tor_assert(in); + tor_assert(in_len < UINT_MAX); + + *out = NULL; + + if (method == GZIP_METHOD && !is_gzip_supported()) { + /* Old zlib version don't support gzip in deflateInit2 */ + log_warn(LD_BUG, "Gzip not supported with zlib %s", ZLIB_VERSION); + goto err; + } + + stream = tor_malloc_zero(sizeof(struct z_stream_s)); + stream->zalloc = Z_NULL; + stream->zfree = Z_NULL; + stream->opaque = NULL; + stream->next_in = (unsigned char*) in; + stream->avail_in = (unsigned int)in_len; + + if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED, + method_bits(method), + 8, Z_DEFAULT_STRATEGY) != Z_OK) { + log_warn(LD_GENERAL, "Error from deflateInit2: %s", + stream->msg?stream->msg:""); + goto err; + } + + /* Guess 50% compression. */ + out_size = in_len / 2; + if (out_size < 1024) out_size = 1024; + *out = tor_malloc(out_size); + stream->next_out = (unsigned char*)*out; + stream->avail_out = (unsigned int)out_size; + + while (1) { + switch (deflate(stream, Z_FINISH)) + { + case Z_STREAM_END: + goto done; + case Z_OK: + /* In case zlib doesn't work as I think .... */ + if (stream->avail_out >= stream->avail_in+16) + break; + case Z_BUF_ERROR: + offset = stream->next_out - ((unsigned char*)*out); + old_size = out_size; + out_size *= 2; + if (out_size < old_size) { + log_warn(LD_GENERAL, "Size overflow in compression."); + goto err; + } + *out = tor_realloc(*out, out_size); + stream->next_out = (unsigned char*)(*out + offset); + if (out_size - offset > UINT_MAX) { + log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " + "uncompressing."); + goto err; + } + stream->avail_out = (unsigned int)(out_size - offset); + break; + default: + log_warn(LD_GENERAL, "Gzip compression didn't finish: %s", + stream->msg ? stream->msg : ""); + goto err; + } + } + done: + *out_len = stream->total_out; +#ifdef OPENBSD + /* "Hey Rocky! Watch me change an unsigned field to a signed field in a + * third-party API!" + * "Oh, that trick will just make people do unsafe casts to the unsigned + * type in their cross-platform code!" + * "Don't be foolish. I'm _sure_ they'll have the good sense to make sure + * the newly unsigned field isn't negative." */ + tor_assert(stream->total_out >= 0); +#endif + if (((size_t)stream->total_out) > out_size + 4097) { + /* If we're wasting more than 4k, don't. */ + *out = tor_realloc(*out, stream->total_out + 1); + } + if (deflateEnd(stream)!=Z_OK) { + log_warn(LD_BUG, "Error freeing gzip structures"); + goto err; + } + tor_free(stream); + + if (is_compression_bomb(*out_len, in_len)) { + log_warn(LD_BUG, "We compressed something and got an insanely high " + "compression factor; other Tors would think this was a zlib bomb."); + goto err; + } + + return 0; + err: + if (stream) { + deflateEnd(stream); + tor_free(stream); + } + tor_free(*out); + return -1; +} + +/** Given zero or more zlib-compressed or gzip-compressed strings of + * total length + * in_len bytes at in, uncompress them into a newly allocated + * buffer, using the method described in method. Store the uncompressed + * string in *out, and its length in *out_len. Return 0 on + * success, -1 on failure. + * + * If complete_only is true, we consider a truncated input as a + * failure; otherwise we decompress as much as we can. Warn about truncated + * or corrupt inputs at protocol_warn_level. + */ +int +tor_gzip_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level) +{ + struct z_stream_s *stream = NULL; + size_t out_size, old_size; + off_t offset; + int r; + + tor_assert(out); + tor_assert(out_len); + tor_assert(in); + tor_assert(in_len < UINT_MAX); + + if (method == GZIP_METHOD && !is_gzip_supported()) { + /* Old zlib version don't support gzip in inflateInit2 */ + log_warn(LD_BUG, "Gzip not supported with zlib %s", ZLIB_VERSION); + return -1; + } + + *out = NULL; + + stream = tor_malloc_zero(sizeof(struct z_stream_s)); + stream->zalloc = Z_NULL; + stream->zfree = Z_NULL; + stream->opaque = NULL; + stream->next_in = (unsigned char*) in; + stream->avail_in = (unsigned int)in_len; + + if (inflateInit2(stream, + method_bits(method)) != Z_OK) { + log_warn(LD_GENERAL, "Error from inflateInit2: %s", + stream->msg?stream->msg:""); + goto err; + } + + out_size = in_len * 2; /* guess 50% compression. */ + if (out_size < 1024) out_size = 1024; + if (out_size >= SIZE_T_CEILING || out_size > UINT_MAX) + goto err; + + *out = tor_malloc(out_size); + stream->next_out = (unsigned char*)*out; + stream->avail_out = (unsigned int)out_size; + + while (1) { + switch (inflate(stream, complete_only ? Z_FINISH : Z_SYNC_FLUSH)) + { + case Z_STREAM_END: + if (stream->avail_in == 0) + goto done; + /* There may be more compressed data here. */ + if ((r = inflateEnd(stream)) != Z_OK) { + log_warn(LD_BUG, "Error freeing gzip structures"); + goto err; + } + if (inflateInit2(stream, method_bits(method)) != Z_OK) { + log_warn(LD_GENERAL, "Error from second inflateInit2: %s", + stream->msg?stream->msg:""); + goto err; + } + break; + case Z_OK: + if (!complete_only && stream->avail_in == 0) + goto done; + /* In case zlib doesn't work as I think.... */ + if (stream->avail_out >= stream->avail_in+16) + break; + case Z_BUF_ERROR: + if (stream->avail_out > 0) { + log_fn(protocol_warn_level, LD_PROTOCOL, + "possible truncated or corrupt zlib data"); + goto err; + } + offset = stream->next_out - (unsigned char*)*out; + old_size = out_size; + out_size *= 2; + if (out_size < old_size) { + log_warn(LD_GENERAL, "Size overflow in uncompression."); + goto err; + } + if (is_compression_bomb(in_len, out_size)) { + log_warn(LD_GENERAL, "Input looks like a possible zlib bomb; " + "not proceeding."); + goto err; + } + if (out_size >= SIZE_T_CEILING) { + log_warn(LD_BUG, "Hit SIZE_T_CEILING limit while uncompressing."); + goto err; + } + *out = tor_realloc(*out, out_size); + stream->next_out = (unsigned char*)(*out + offset); + if (out_size - offset > UINT_MAX) { + log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " + "uncompressing."); + goto err; + } + stream->avail_out = (unsigned int)(out_size - offset); + break; + default: + log_warn(LD_GENERAL, "Gzip decompression returned an error: %s", + stream->msg ? stream->msg : ""); + goto err; + } + } + done: + *out_len = stream->next_out - (unsigned char*)*out; + r = inflateEnd(stream); + tor_free(stream); + if (r != Z_OK) { + log_warn(LD_BUG, "Error freeing gzip structures"); + goto err; + } + + /* NUL-terminate output. */ + if (out_size == *out_len) + *out = tor_realloc(*out, out_size + 1); + (*out)[*out_len] = '\0'; + + return 0; + err: + if (stream) { + inflateEnd(stream); + tor_free(stream); + } + if (*out) { + tor_free(*out); + } + return -1; +} + +/** Try to tell whether the in_len-byte string in in is likely + * to be compressed or not. If it is, return the likeliest compression method. + * Otherwise, return UNKNOWN_METHOD. + */ +compress_method_t +detect_compression_method(const char *in, size_t in_len) +{ + if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { + return GZIP_METHOD; + } else if (in_len > 2 && (in[0] & 0x0f) == 8 && + (ntohs(get_uint16(in)) % 31) == 0) { + return ZLIB_METHOD; + } else { + return UNKNOWN_METHOD; + } +} + +/** Internal state for an incremental zlib compression/decompression. The + * body of this struct is not exposed. */ +struct tor_zlib_state_t { + struct z_stream_s stream; /**< The zlib stream */ + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect zlib bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect zlib bombs. */ + size_t output_so_far; +}; + +/** Construct and return a tor_zlib_state_t object using method. If + * compress, it's for compression; otherwise it's for + * decompression. */ +tor_zlib_state_t * +tor_zlib_new(int compress, compress_method_t method) +{ + tor_zlib_state_t *out; + + if (method == GZIP_METHOD && !is_gzip_supported()) { + /* Old zlib version don't support gzip in inflateInit2 */ + log_warn(LD_BUG, "Gzip not supported with zlib %s", ZLIB_VERSION); + return NULL; + } + + out = tor_malloc_zero(sizeof(tor_zlib_state_t)); + out->stream.zalloc = Z_NULL; + out->stream.zfree = Z_NULL; + out->stream.opaque = NULL; + out->compress = compress; + if (compress) { + if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, + method_bits(method), 8, Z_DEFAULT_STRATEGY) != Z_OK) + goto err; + } else { + if (inflateInit2(&out->stream, method_bits(method)) != Z_OK) + goto err; + } + return out; + + err: + tor_free(out); + return NULL; +} + +/** Compress/decompress some bytes using state. Read up to + * *in_len bytes from *in, and write up to *out_len bytes + * to *out, adjusting the values as we go. If finish is true, + * we've reached the end of the input. + * + * Return TOR_ZLIB_DONE if we've finished the entire compression/decompression. + * Return TOR_ZLIB_OK if we're processed everything from the input. + * Return TOR_ZLIB_BUF_FULL if we're out of space on out. + * Return TOR_ZLIB_ERR if the stream is corrupt. + */ +tor_zlib_output_t +tor_zlib_process(tor_zlib_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + int err; + tor_assert(*in_len <= UINT_MAX); + tor_assert(*out_len <= UINT_MAX); + state->stream.next_in = (unsigned char*) *in; + state->stream.avail_in = (unsigned int)*in_len; + state->stream.next_out = (unsigned char*) *out; + state->stream.avail_out = (unsigned int)*out_len; + + if (state->compress) { + err = deflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); + } else { + err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); + } + + state->input_so_far += state->stream.next_in - ((unsigned char*)*in); + state->output_so_far += state->stream.next_out - ((unsigned char*)*out); + + *out = (char*) state->stream.next_out; + *out_len = state->stream.avail_out; + *in = (const char *) state->stream.next_in; + *in_len = state->stream.avail_in; + + if (! state->compress && + is_compression_bomb(state->input_so_far, state->output_so_far)) { + log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); + return TOR_ZLIB_ERR; + } + + switch (err) + { + case Z_STREAM_END: + return TOR_ZLIB_DONE; + case Z_BUF_ERROR: + if (state->stream.avail_in == 0) + return TOR_ZLIB_OK; + return TOR_ZLIB_BUF_FULL; + case Z_OK: + if (state->stream.avail_out == 0 || finish) + return TOR_ZLIB_BUF_FULL; + return TOR_ZLIB_OK; + default: + log_warn(LD_GENERAL, "Gzip returned an error: %s", + state->stream.msg ? state->stream.msg : ""); + return TOR_ZLIB_ERR; + } +} + +/** Deallocate state. */ +void +tor_zlib_free(tor_zlib_state_t *state) +{ + if (!state) + return; + + if (state->compress) + deflateEnd(&state->stream); + else + inflateEnd(&state->stream); + + tor_free(state); +} + diff --git a/src/tor/torgzip.h b/src/tor/torgzip.h new file mode 100644 index 000000000..5db03fe6e --- /dev/null +++ b/src/tor/torgzip.h @@ -0,0 +1,59 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file torgzip.h + * \brief Headers for torgzip.h + **/ + +#ifndef TOR_TORGZIP_H +#define TOR_TORGZIP_H + +/** Enumeration of what kind of compression to use. Only ZLIB_METHOD is + * guaranteed to be supported by the compress/uncompress functions here; + * GZIP_METHOD may be supported if we built against zlib version 1.2 or later + * and is_gzip_supported() returns true. */ +typedef enum { + NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3 +} compress_method_t; + +int +tor_gzip_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method); +int +tor_gzip_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level); + +int is_gzip_supported(void); + +const char * +tor_zlib_get_version_str(void); + +const char * +tor_zlib_get_header_version_str(void); + +compress_method_t detect_compression_method(const char *in, size_t in_len); + +/** Return values from tor_zlib_process; see that function's documentation for + * details. */ +typedef enum { + TOR_ZLIB_OK, TOR_ZLIB_DONE, TOR_ZLIB_BUF_FULL, TOR_ZLIB_ERR +} tor_zlib_output_t; +/** Internal state for an incremental zlib compression/decompression. */ +typedef struct tor_zlib_state_t tor_zlib_state_t; +tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method); + +tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); +void tor_zlib_free(tor_zlib_state_t *state); + +#endif + diff --git a/src/tor/src/common/torint.h b/src/tor/torint.h similarity index 77% rename from src/tor/src/common/torint.h rename to src/tor/torint.h index bc81c114f..b3d3632a6 100644 --- a/src/tor/src/common/torint.h +++ b/src/tor/torint.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -34,8 +34,8 @@ does the same thing (but doesn't defined __FreeBSD__). */ #include -#endif /* !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) */ -#endif /* defined(HAVE_MACHINE_LIMITS_H) */ +#endif +#endif #ifdef HAVE_INTTYPES_H #include #endif @@ -80,7 +80,7 @@ typedef signed char int8_t; typedef unsigned char uint8_t; #define HAVE_UINT8_T #endif -#endif /* (SIZEOF_CHAR == 1) */ +#endif #if (SIZEOF_SHORT == 2) #ifndef HAVE_INT16_T @@ -91,7 +91,7 @@ typedef signed short int16_t; typedef unsigned short uint16_t; #define HAVE_UINT16_T #endif -#endif /* (SIZEOF_SHORT == 2) */ +#endif #if (SIZEOF_INT == 2) #ifndef HAVE_INT16_T @@ -129,7 +129,7 @@ typedef unsigned int uint32_t; #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif -#endif /* (SIZEOF_INT == 2) || ... */ +#endif #if (SIZEOF_LONG == 4) #ifndef HAVE_INT32_T @@ -142,7 +142,7 @@ typedef unsigned long uint32_t; #ifndef UINT32_MAX #define UINT32_MAX 0xfffffffful #endif -#endif /* !defined(HAVE_UINT32_T) */ +#endif #elif (SIZEOF_LONG == 8) #ifndef HAVE_INT64_T typedef signed long int64_t; @@ -155,7 +155,7 @@ typedef unsigned long uint64_t; #ifndef UINT64_MAX #define UINT64_MAX 0xfffffffffffffffful #endif -#endif /* (SIZEOF_LONG == 4) || ... */ +#endif #if (SIZEOF_LONG_LONG == 8) #ifndef HAVE_INT64_T @@ -172,7 +172,7 @@ typedef unsigned long long uint64_t; #ifndef INT64_MAX #define INT64_MAX 0x7fffffffffffffffll #endif -#endif /* (SIZEOF_LONG_LONG == 8) */ +#endif #if (SIZEOF___INT64 == 8) #ifndef HAVE_INT64_T @@ -184,15 +184,11 @@ typedef unsigned __int64 uint64_t; #define HAVE_UINT64_T #endif #ifndef UINT64_MAX -#define UINT64_MAX 0xffffffffffffffffui64 +#define UINT64_MAX 0xffffffffffffffffull #endif #ifndef INT64_MAX #define INT64_MAX 0x7fffffffffffffffi64 #endif -#endif /* (SIZEOF___INT64 == 8) */ - -#ifndef INT64_MIN -#define INT64_MIN ((- INT64_MAX) - 1) #endif #ifndef SIZE_MAX @@ -202,18 +198,22 @@ typedef unsigned __int64 uint64_t; #define SIZE_MAX UINT32_MAX #else #error "Can't define SIZE_MAX" -#endif /* SIZEOF_SIZE_T == 8 || ... */ -#endif /* !defined(SIZE_MAX) */ +#endif +#endif +// Probably should define HAVE_SSIZE_T elsewhere +// and remove the test for WIN32 #ifndef HAVE_SSIZE_T #if SIZEOF_SIZE_T == 8 typedef int64_t ssize_t; #elif SIZEOF_SIZE_T == 4 +#ifndef WIN32 typedef int32_t ssize_t; +#endif #else #error "Can't define ssize_t." -#endif /* SIZEOF_SIZE_T == 8 || ... */ -#endif /* !defined(HAVE_SSIZE_T) */ +#endif +#endif #if (SIZEOF_VOID_P > 4 && SIZEOF_VOID_P <= 8) #ifndef HAVE_INTPTR_T @@ -235,7 +235,7 @@ typedef uint32_t uintptr_t; #endif #else #error "void * is either >8 bytes or <= 2. In either case, I am confused." -#endif /* (SIZEOF_VOID_P > 4 && SIZEOF_VOID_P <= 8) || ... */ +#endif #ifndef HAVE_INT8_T #error "Missing type int8_t" @@ -275,8 +275,8 @@ typedef uint32_t uintptr_t; #define LONG_MAX 0x7fffffffffffffffL #else #error "Can't define LONG_MAX" -#endif /* (SIZEOF_LONG == 4) || ... */ -#endif /* !defined(LONG_MAX) */ +#endif +#endif #ifndef INT_MAX #if (SIZEOF_INT == 4) @@ -285,8 +285,8 @@ typedef uint32_t uintptr_t; #define INT_MAX 0x7fffffffffffffffL #else #error "Can't define INT_MAX" -#endif /* (SIZEOF_INT == 4) || ... */ -#endif /* !defined(INT_MAX) */ +#endif +#endif #ifndef UINT_MAX #if (SIZEOF_INT == 2) @@ -297,8 +297,8 @@ typedef uint32_t uintptr_t; #define UINT_MAX 0xffffffffffffffffu #else #error "Can't define UINT_MAX" -#endif /* (SIZEOF_INT == 2) || ... */ -#endif /* !defined(UINT_MAX) */ +#endif +#endif #ifndef SHORT_MAX #if (SIZEOF_SHORT == 2) @@ -307,11 +307,13 @@ typedef uint32_t uintptr_t; #define SHORT_MAX 0x7fffffff #else #error "Can't define SHORT_MAX" -#endif /* (SIZEOF_SHORT == 2) || ... */ -#endif /* !defined(SHORT_MAX) */ +#endif +#endif #ifndef TIME_MAX +#ifdef TIME_T_IS_SIGNED + #if (SIZEOF_TIME_T == SIZEOF_INT) #define TIME_MAX ((time_t)INT_MAX) #elif (SIZEOF_TIME_T == SIZEOF_LONG) @@ -319,49 +321,45 @@ typedef uint32_t uintptr_t; #elif (SIZEOF_TIME_T == 8) #define TIME_MAX ((time_t)INT64_MAX) #else -#error "Can't define TIME_MAX" -#endif /* (SIZEOF_TIME_T == SIZEOF_INT) || ... */ - -#endif /* !defined(TIME_MAX) */ - -#ifndef TIME_MIN +#error "Can't define (signed) TIME_MAX" +#endif -#if (SIZEOF_TIME_T == SIZEOF_INT) -#define TIME_MIN ((time_t)INT_MIN) -#elif (SIZEOF_TIME_T == SIZEOF_LONG) -#define TIME_MIN ((time_t)LONG_MIN) +#else +/* Unsigned case */ +#if (SIZEOF_TIME_T == 4) +#define TIME_MAX ((time_t)UINT32_MAX) #elif (SIZEOF_TIME_T == 8) -#define TIME_MIN ((time_t)INT64_MIN) +#define TIME_MAX ((time_t)UINT64_MAX) #else -#error "Can't define TIME_MIN" -#endif /* (SIZEOF_TIME_T == SIZEOF_INT) || ... */ - -#endif /* !defined(TIME_MIN) */ +#error "Can't define (unsigned) TIME_MAX" +#endif +#endif /* time_t_is_signed */ +#endif /* ifndef(TIME_MAX) */ -#ifndef SIZE_MAX +#ifndef SIZE_T_MAX #if (SIZEOF_SIZE_T == 4) -#define SIZE_MAX UINT32_MAX +#define SIZE_T_MAX UINT32_MAX #elif (SIZEOF_SIZE_T == 8) -#define SIZE_MAX UINT64_MAX +#define SIZE_T_MAX UINT64_MAX #else -#error "Can't define SIZE_MAX" -#endif /* (SIZEOF_SIZE_T == 4) || ... */ -#endif /* !defined(SIZE_MAX) */ +#error "Can't define SIZE_T_MAX" +#endif +#endif -#ifndef SSIZE_MAX +#ifndef SSIZE_T_MAX #if (SIZEOF_SIZE_T == 4) -#define SSIZE_MAX INT32_MAX +#define SSIZE_T_MAX INT32_MAX #elif (SIZEOF_SIZE_T == 8) -#define SSIZE_MAX INT64_MAX +#define SSIZE_T_MAX INT64_MAX #else -#error "Can't define SSIZE_MAX" -#endif /* (SIZEOF_SIZE_T == 4) || ... */ -#endif /* !defined(SSIZE_MAX) */ +#error "Can't define SSIZE_T_MAX" +#endif +#endif /** Any ssize_t larger than this amount is likely to be an underflow. */ -#define SSIZE_T_CEILING ((ssize_t)(SSIZE_MAX-16)) +#define SSIZE_T_CEILING ((ssize_t)(SSIZE_T_MAX-16)) /** Any size_t larger than this amount is likely to be an underflow. */ -#define SIZE_T_CEILING ((size_t)(SSIZE_MAX-16)) +#define SIZE_T_CEILING ((size_t)(SSIZE_T_MAX-16)) -#endif /* !defined(TOR_TORINT_H) */ +#endif /* __TORINT_H */ diff --git a/src/tor/src/common/torlog.h b/src/tor/torlog.h similarity index 66% rename from src/tor/src/common/torlog.h rename to src/tor/torlog.h index b7d033adb..2c08102b9 100644 --- a/src/tor/src/common/torlog.h +++ b/src/tor/torlog.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,8 +12,7 @@ #ifndef TOR_TORLOG_H -#include "compat.h" -#include "testsupport.h" +#include "tor_compat.h" #ifdef HAVE_SYSLOG_H #include @@ -22,7 +21,7 @@ #error "Your syslog.h thinks high numbers are more important. " \ "We aren't prepared to deal with that." #endif -#else /* !(defined(HAVE_SYSLOG_H)) */ +#else /* Note: Syslog's logging code refers to priorities, with 0 being the most * important. Thus, all our comparisons needed to be reversed when we added * syslog support. @@ -48,7 +47,7 @@ /** Error-level severity: for messages that only appear when something has gone * very wrong, and the Tor process can no longer proceed. */ #define LOG_ERR 3 -#endif /* defined(HAVE_SYSLOG_H) */ +#endif /* Logging domains */ @@ -97,14 +96,8 @@ #define LD_HEARTBEAT (1u<<20) /** Abstract channel_t code */ #define LD_CHANNEL (1u<<21) -/** Scheduler */ -#define LD_SCHED (1u<<22) -/** Guard nodes */ -#define LD_GUARD (1u<<23) -/** Generation and application of consensus diffs. */ -#define LD_CONSDIFF (1u<<24) /** Number of logging domains in the code. */ -#define N_LOGGING_DOMAINS 25 +#define N_LOGGING_DOMAINS 22 /** This log message is not safe to send to a callback-based logger * immediately. Used as a flag, not a log domain. */ @@ -113,11 +106,6 @@ * would. Used as a flag, not a log domain. */ #define LD_NOFUNCNAME (1u<<30) -#ifdef TOR_UNIT_TESTS -/** This log message should not be intercepted by mock_saving_logv */ -#define LD_NO_MOCK (1u<<29) -#endif - /** Mask of zero or more log domains, OR'd together. */ typedef uint32_t log_domain_mask_t; @@ -132,7 +120,7 @@ typedef struct log_severity_list_t { /** Callback type used for add_callback_log. */ typedef void (*log_callback)(int severity, uint32_t domain, const char *msg); -void init_logging(int disable_startup_queue); +void init_logging(void); int parse_log_level(const char *level); const char *log_level_to_string(int level); int parse_log_severity_config(const char **cfg, @@ -141,16 +129,10 @@ void set_log_severity_config(int minSeverity, int maxSeverity, log_severity_list_t *severity_out); void add_stream_log(const log_severity_list_t *severity, const char *name, int fd); -int add_file_log(const log_severity_list_t *severity, const char *filename, - const int truncate); +int add_file_log(const log_severity_list_t *severity, const char *filename); #ifdef HAVE_SYSLOG_H -int add_syslog_log(const log_severity_list_t *severity, - const char* syslog_identity_tag); -#endif // HAVE_SYSLOG_H. -#ifdef HAVE_ANDROID_LOG_H -int add_android_log(const log_severity_list_t *severity, - const char *android_identity_tag); -#endif // HAVE_ANDROID_LOG_H. +int add_syslog_log(const log_severity_list_t *severity); +#endif int add_callback_log(const log_severity_list_t *severity, log_callback cb); void logs_set_domain_logging(int enabled); int get_min_log_level(void); @@ -163,10 +145,8 @@ void mark_logs_temp(void); void change_callback_log_severity(int loglevelMin, int loglevelMax, log_callback cb); void flush_pending_log_callbacks(void); -void flush_log_messages_from_startup(void); void log_set_application_name(const char *name); void set_log_time_granularity(int granularity_msec); -void truncate_logs(void); void tor_log(int severity, log_domain_mask_t domain, const char *format, ...) CHECK_PRINTF(3,4); @@ -175,9 +155,7 @@ void tor_log_err_sigsafe(const char *m, ...); int tor_log_get_sigsafe_err_fds(const int **out); void tor_log_update_sigsafe_err_fds(void); -struct smartlist_t; -void tor_log_get_logfile_names(struct smartlist_t *out); - +#if defined(__GNUC__) || defined(RUNNING_DOXYGEN) extern int log_global_min_severity_; void log_fn_(int severity, log_domain_mask_t domain, @@ -188,70 +166,68 @@ void log_fn_ratelim_(struct ratelim_t *ratelim, int severity, log_domain_mask_t domain, const char *funcname, const char *format, ...) CHECK_PRINTF(5,6); - -#if defined(__GNUC__) && __GNUC__ <= 3 - -/* These are the GCC varidaic macros, so that older versions of GCC don't - * break. */ - /** Log a message at level severity, using a pretty-printed version * of the current function name. */ #define log_fn(severity, domain, args...) \ - log_fn_(severity, domain, __FUNCTION__, args) + log_fn_(severity, domain, __PRETTY_FUNCTION__, args) /** As log_fn, but use ratelim (an instance of ratelim_t) to control * the frequency at which messages can appear. */ #define log_fn_ratelim(ratelim, severity, domain, args...) \ - log_fn_ratelim_(ratelim, severity, domain, __FUNCTION__, args) + log_fn_ratelim_(ratelim, severity, domain, __PRETTY_FUNCTION__, args) #define log_debug(domain, args...) \ STMT_BEGIN \ if (PREDICT_UNLIKELY(log_global_min_severity_ == LOG_DEBUG)) \ - log_fn_(LOG_DEBUG, domain, __FUNCTION__, args); \ + log_fn_(LOG_DEBUG, domain, __PRETTY_FUNCTION__, args); \ STMT_END #define log_info(domain, args...) \ - log_fn_(LOG_INFO, domain, __FUNCTION__, args) + log_fn_(LOG_INFO, domain, __PRETTY_FUNCTION__, args) #define log_notice(domain, args...) \ - log_fn_(LOG_NOTICE, domain, __FUNCTION__, args) + log_fn_(LOG_NOTICE, domain, __PRETTY_FUNCTION__, args) #define log_warn(domain, args...) \ - log_fn_(LOG_WARN, domain, __FUNCTION__, args) + log_fn_(LOG_WARN, domain, __PRETTY_FUNCTION__, args) #define log_err(domain, args...) \ - log_fn_(LOG_ERR, domain, __FUNCTION__, args) - -#else /* !(defined(__GNUC__) && __GNUC__ <= 3) */ - -/* Here are the c99 variadic macros, to work with non-GCC compilers */ + log_fn_(LOG_ERR, domain, __PRETTY_FUNCTION__, args) -#define log_debug(domain, args, ...) \ - STMT_BEGIN \ - if (PREDICT_UNLIKELY(log_global_min_severity_ == LOG_DEBUG)) \ - log_fn_(LOG_DEBUG, domain, __FUNCTION__, args, ##__VA_ARGS__); \ - STMT_END -#define log_info(domain, args,...) \ - log_fn_(LOG_INFO, domain, __FUNCTION__, args, ##__VA_ARGS__) -#define log_notice(domain, args,...) \ - log_fn_(LOG_NOTICE, domain, __FUNCTION__, args, ##__VA_ARGS__) -#define log_warn(domain, args,...) \ - log_fn_(LOG_WARN, domain, __FUNCTION__, args, ##__VA_ARGS__) -#define log_err(domain, args,...) \ - log_fn_(LOG_ERR, domain, __FUNCTION__, args, ##__VA_ARGS__) -/** Log a message at level severity, using a pretty-printed version - * of the current function name. */ -#define log_fn(severity, domain, args,...) \ - log_fn_(severity, domain, __FUNCTION__, args, ##__VA_ARGS__) -/** As log_fn, but use ratelim (an instance of ratelim_t) to control - * the frequency at which messages can appear. - */ -#define log_fn_ratelim(ratelim, severity, domain, args,...) \ - log_fn_ratelim_(ratelim, severity, domain, __FUNCTION__, \ - args, ##__VA_ARGS__) -#endif /* defined(__GNUC__) && __GNUC__ <= 3 */ +#else /* ! defined(__GNUC__) */ -#ifdef LOG_PRIVATE -MOCK_DECL(STATIC void, logv, (int severity, log_domain_mask_t domain, - const char *funcname, const char *suffix, const char *format, - va_list ap) CHECK_PRINTF(5,0)); +void log_fn_(int severity, log_domain_mask_t domain, const char *format, ...); +struct ratelim_t; +void log_fn_ratelim_(struct ratelim_t *ratelim, int severity, + log_domain_mask_t domain, const char *format, ...); +void log_debug_(log_domain_mask_t domain, const char *format, ...); +void log_info_(log_domain_mask_t domain, const char *format, ...); +void log_notice_(log_domain_mask_t domain, const char *format, ...); +void log_warn_(log_domain_mask_t domain, const char *format, ...); +void log_err_(log_domain_mask_t domain, const char *format, ...); + +#if defined(_MSC_VER) && _MSC_VER < 1300 +/* MSVC 6 and earlier don't have __func__, or even __LINE__. */ +#define log_fn log_fn_ +#define log_fn_ratelim log_fn_ratelim_ +#define log_debug log_debug_ +#define log_info log_info_ +#define log_notice log_notice_ +#define log_warn log_warn_ +#define log_err log_err_ +#else +/* We don't have GCC's varargs macros, so use a global variable to pass the + * function name to log_fn */ +extern const char *log_fn_function_name_; +/* We abuse the comma operator here, since we can't use the standard + * do {...} while (0) trick to wrap this macro, since the macro can't take + * arguments. */ +#define log_fn (log_fn_function_name_=__func__),log_fn_ +#define log_fn_ratelim (log_fn_function_name_=__func__),log_fn_ratelim_ +#define log_debug (log_fn_function_name_=__func__),log_debug_ +#define log_info (log_fn_function_name_=__func__),log_info_ +#define log_notice (log_fn_function_name_=__func__),log_notice_ +#define log_warn (log_fn_function_name_=__func__),log_warn_ +#define log_err (log_fn_function_name_=__func__),log_err_ #endif +#endif /* !GNUC */ + # define TOR_TORLOG_H -#endif /* !defined(TOR_TORLOG_H) */ +#endif diff --git a/src/tor/src/common/tortls.c b/src/tor/tortls.c similarity index 67% rename from src/tor/src/common/tortls.c rename to src/tor/tortls.c index 86a876780..9c5118a3b 100644 --- a/src/tor/src/common/tortls.c +++ b/src/tor/tortls.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,50 +16,53 @@ #include "orconfig.h" -#define TORTLS_PRIVATE -#define TORTLS_OPENSSL_PRIVATE +#if defined (WINCE) +#include +#endif #include #ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include "*/ - #include - #include + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #if defined(_MSC_VER) && (_MSC_VER < 1300) + #include + #else + #include + #include + #endif #endif - -#include "compat.h" - -/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in - * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ -DISABLE_GCC_WARNING(redundant-decls) - -#include -#include "crypto.h" - -#ifdef OPENSSL_NO_EC -#error "We require OpenSSL with ECC support" -#endif - #include #include #include #include #include #include -#include -#include +#include -ENABLE_GCC_WARNING(redundant-decls) +#ifdef USE_BUFFEREVENTS +#include +#include +#include +#include "compat_libevent.h" +#endif -#define TORTLS_PRIVATE +#include "crypto.h" #include "tortls.h" -#include "util.h" +#include "tor_util.h" #include "torlog.h" #include "container.h" #include -#define X509_get_notBefore_const(cert) \ - ((const ASN1_TIME*) X509_get_notBefore((X509 *)cert)) -#define X509_get_notAfter_const(cert) \ - ((const ASN1_TIME*) X509_get_notAfter((X509 *)cert)) +#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(0,9,8) +#error "We require OpenSSL >= 0.9.8" +#endif + +/* Enable the "v2" TLS handshake. + */ +#define V2_HANDSHAKE_SERVER +#define V2_HANDSHAKE_CLIENT /* Copied from or.h */ #define LEGAL_NICKNAME_CHARACTERS \ @@ -70,13 +73,15 @@ ENABLE_GCC_WARNING(redundant-decls) #define ADDR(tls) (((tls) && (tls)->address) ? tls->address : "peer") -#if OPENSSL_VERSION_NUMBER < OPENSSL_V(1,0,0,'f') -/* This is a version of OpenSSL before 1.0.0f. It does not have +#if (OPENSSL_VERSION_NUMBER < OPENSSL_V(0,9,8,'s') || \ + (OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(0,9,9) && \ + OPENSSL_VERSION_NUMBER < OPENSSL_V(1,0,0,'f'))) +/* This is a version of OpenSSL before 0.9.8s/1.0.0f. It does not have * the CVE-2011-4576 fix, and as such it can't use RELEASE_BUFFERS and * SSL3 safely at the same time. */ #define DISABLE_SSL3_HANDSHAKE -#endif /* OPENSSL_VERSION_NUMBER < OPENSSL_V(1,0,0,'f') */ +#endif /* We redefine these so that we can run correctly even if the vendor gives us * a version of OpenSSL that does not match its header files. (Apple: I am @@ -89,6 +94,36 @@ ENABLE_GCC_WARNING(redundant-decls) #define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0010 #endif +/** Does the run-time openssl version look like we need + * SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */ +static int use_unsafe_renegotiation_op = 0; +/** Does the run-time openssl version look like we need + * SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */ +static int use_unsafe_renegotiation_flag = 0; + +/** Structure that we use for a single certificate. */ +struct tor_cert_t { + X509 *cert; + uint8_t *encoded; + size_t encoded_len; + unsigned pkey_digests_set : 1; + digests_t cert_digests; + digests_t pkey_digests; +}; + +/** Holds a SSL_CTX object and related state used to configure TLS + * connections. + */ +typedef struct tor_tls_context_t { + int refcnt; + SSL_CTX *ctx; + tor_cert_t *my_link_cert; + tor_cert_t *my_id_cert; + tor_cert_t *my_auth_cert; + crypto_pk_t *link_key; + crypto_pk_t *auth_key; +} tor_tls_context_t; + /** Return values for tor_tls_classify_client_ciphers. * * @{ @@ -107,12 +142,69 @@ ENABLE_GCC_WARNING(redundant-decls) #define CIPHERS_UNRESTRICTED 3 /** @} */ +#define TOR_TLS_MAGIC 0x71571571 + +typedef enum { + TOR_TLS_ST_HANDSHAKE, TOR_TLS_ST_OPEN, TOR_TLS_ST_GOTCLOSE, + TOR_TLS_ST_SENTCLOSE, TOR_TLS_ST_CLOSED, TOR_TLS_ST_RENEGOTIATE, + TOR_TLS_ST_BUFFEREVENT +} tor_tls_state_t; + +/** Holds a SSL object and its associated data. Members are only + * accessed from within tortls.c. + */ +struct tor_tls_t { + uint32_t magic; + tor_tls_context_t *context; /** A link to the context object for this tls. */ + SSL *ssl; /**< An OpenSSL SSL object. */ + int socket; /**< The underlying file descriptor for this TLS connection. */ + char *address; /**< An address to log when describing this connection. */ + ENUM_BF(tor_tls_state_t) state : 3; /**< The current SSL state, + * depending on which operations + * have completed successfully. */ + unsigned int isServer:1; /**< True iff this is a server-side connection */ + unsigned int wasV2Handshake:1; /**< True iff the original handshake for + * this connection used the updated version + * of the connection protocol (client sends + * different cipher list, server sends only + * one certificate). */ + /** True iff we should call negotiated_callback when we're done reading. */ + unsigned int got_renegotiate:1; + /** Return value from tor_tls_classify_client_ciphers, or 0 if we haven't + * called that function yet. */ + int8_t client_cipher_list_type; + /** Incremented every time we start the server side of a handshake. */ + uint8_t server_handshake_count; + size_t wantwrite_n; /**< 0 normally, >0 if we returned wantwrite last + * time. */ + /** Last values retrieved from BIO_number_read()/write(); see + * tor_tls_get_n_raw_bytes() for usage. + */ + unsigned long last_write_count; + unsigned long last_read_count; + /** If set, a callback to invoke whenever the client tries to renegotiate + * the handshake. */ + void (*negotiated_callback)(tor_tls_t *tls, void *arg); + /** Argument to pass to negotiated_callback. */ + void *callback_arg; +}; + +#ifdef V2_HANDSHAKE_CLIENT +/** An array of fake SSL_CIPHER objects that we use in order to trick OpenSSL + * in client mode into advertising the ciphers we want. See + * rectify_client_ciphers() for details. */ +static SSL_CIPHER *CLIENT_CIPHER_DUMMIES = NULL; +/** A stack of SSL_CIPHER objects, some real, some fake. + * See rectify_client_ciphers() for details. */ +static STACK_OF(SSL_CIPHER) *CLIENT_CIPHER_STACK = NULL; +#endif + /** The ex_data index in which we store a pointer to an SSL object's * corresponding tor_tls_t object. */ -STATIC int tor_tls_object_ex_data_index = -1; +static int tor_tls_object_ex_data_index = -1; /** Helper: Allocate tor_tls_object_ex_data_index. */ -STATIC void +static void tor_tls_allocate_tor_tls_object_ex_data_index(void) { if (tor_tls_object_ex_data_index == -1) { @@ -124,7 +216,7 @@ tor_tls_allocate_tor_tls_object_ex_data_index(void) /** Helper: given a SSL* pointer, return the tor_tls_t object using that * pointer. */ -STATIC tor_tls_t * +static INLINE tor_tls_t * tor_tls_get_by_ssl(const SSL *ssl) { tor_tls_t *result = SSL_get_ex_data(ssl, tor_tls_object_ex_data_index); @@ -135,17 +227,30 @@ tor_tls_get_by_ssl(const SSL *ssl) static void tor_tls_context_decref(tor_tls_context_t *ctx); static void tor_tls_context_incref(tor_tls_context_t *ctx); - +static X509* tor_tls_create_certificate(crypto_pk_t *rsa, + crypto_pk_t *rsa_sign, + const char *cname, + const char *cname_sign, + unsigned int cert_lifetime); + +static int tor_tls_context_init_one(tor_tls_context_t **ppcontext, + crypto_pk_t *identity, + unsigned int key_lifetime, + unsigned int flags, + int is_client); +static tor_tls_context_t *tor_tls_context_new(crypto_pk_t *identity, + unsigned int key_lifetime, + unsigned int flags, + int is_client); static int check_cert_lifetime_internal(int severity, const X509 *cert, - time_t now, int past_tolerance, int future_tolerance); /** Global TLS contexts. We keep them here because nobody else needs * to touch them. * * @{ */ -STATIC tor_tls_context_t *server_tls_context = NULL; -STATIC tor_tls_context_t *client_tls_context = NULL; +static tor_tls_context_t *server_tls_context = NULL; +static tor_tls_context_t *client_tls_context = NULL; /**@}*/ /** True iff tor_tls_init() has been called. */ @@ -210,9 +315,7 @@ tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, case SSL_R_HTTP_REQUEST: case SSL_R_HTTPS_PROXY_REQUEST: case SSL_R_RECORD_LENGTH_MISMATCH: -#ifndef OPENSSL_1_1_API case SSL_R_RECORD_TOO_LARGE: -#endif case SSL_R_UNKNOWN_PROTOCOL: case SSL_R_UNSUPPORTED_PROTOCOL: severity = LOG_INFO; @@ -241,7 +344,7 @@ tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, /** Log all pending tls errors at level severity in log domain * domain. Use doing to describe our current activities. */ -STATIC void +static void tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing) { unsigned long err; @@ -253,7 +356,7 @@ tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing) /** Convert an errno (or a WSAerrno on windows) into a TOR_TLS_* error * code. */ -STATIC int +static int tor_errno_to_tls_error(int e) { switch (e) { @@ -304,7 +407,7 @@ tor_tls_err_to_string(int err) * If an error has occurred, log it at level severity and describe the * current action as doing. */ -STATIC int +static int tor_tls_get_error(tor_tls_t *tls, int r, int extra, const char *doing, int severity, int domain) { @@ -352,17 +455,66 @@ tor_tls_get_error(tor_tls_t *tls, int r, int extra, static void tor_tls_init(void) { - check_no_tls_errors(); - if (!tls_library_is_initialized) { + long version; SSL_library_init(); SSL_load_error_strings(); + version = SSLeay(); + + /* OpenSSL 0.9.8l introduced SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION + * here, but without thinking too hard about it: it turns out that the + * flag in question needed to be set at the last minute, and that it + * conflicted with an existing flag number that had already been added + * in the OpenSSL 1.0.0 betas. OpenSSL 0.9.8m thoughtfully replaced + * the flag with an option and (it seems) broke anything that used + * SSL3_FLAGS_* for the purpose. So we need to know how to do both, + * and we mustn't use the SSL3_FLAGS option with anything besides + * OpenSSL 0.9.8l. + * + * No, we can't just set flag 0x0010 everywhere. It breaks Tor with + * OpenSSL 1.0.0beta3 and later. On the other hand, we might be able to + * set option 0x00040000L everywhere. + * + * No, we can't simply detect whether the flag or the option is present + * in the headers at build-time: some vendors (notably Apple) like to + * leave their headers out of sync with their libraries. + * + * Yes, it _is_ almost as if the OpenSSL developers decided that no + * program should be allowed to use renegotiation unless it first passed + * a test of intelligence and determination. + */ + if (version > OPENSSL_V(0,9,8,'k') && version <= OPENSSL_V(0,9,8,'l')) { + log_info(LD_GENERAL, "OpenSSL %s looks like version 0.9.8l, but " + "some vendors have backported renegotiation code from " + "0.9.8m without updating the version number. " + "I will try SSL3_FLAGS and SSL_OP to enable renegotation.", + SSLeay_version(SSLEAY_VERSION)); + use_unsafe_renegotiation_flag = 1; + use_unsafe_renegotiation_op = 1; + } else if (version > OPENSSL_V(0,9,8,'l')) { + log_info(LD_GENERAL, "OpenSSL %s looks like version 0.9.8m or later; " + "I will try SSL_OP to enable renegotiation", + SSLeay_version(SSLEAY_VERSION)); + use_unsafe_renegotiation_op = 1; + } else if (version <= OPENSSL_V(0,9,8,'k')) { + log_info(LD_GENERAL, "OpenSSL %s [%lx] looks like it's older than " + "0.9.8l, but some vendors have backported 0.9.8l's " + "renegotiation code to earlier versions, and some have " + "backported the code from 0.9.8m or 0.9.8n. I'll set both " + "SSL3_FLAGS and SSL_OP just to be safe.", + SSLeay_version(SSLEAY_VERSION), version); + use_unsafe_renegotiation_flag = 1; + use_unsafe_renegotiation_op = 1; + } else { + /* this is dead code, yes? */ + log_info(LD_GENERAL, "OpenSSL %s has version %lx", + SSLeay_version(SSLEAY_VERSION), version); + } + #if (SIZEOF_VOID_P >= 8 && \ + !defined(OPENSSL_NO_EC) && \ OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,1)) - long version = OpenSSL_version_num(); - - /* LCOV_EXCL_START : we can't test these lines on the same machine */ if (version >= OPENSSL_V_SERIES(1,0,1)) { /* Warn if we could *almost* be running with much faster ECDH. If we're built for a 64-bit target, using OpenSSL 1.0.1, but we @@ -389,8 +541,7 @@ tor_tls_init(void) "support (using the enable-ec_nistp_64_gcc_128 option " "when configuring it) would make ECDH much faster."); } - /* LCOV_EXCL_STOP */ -#endif /* (SIZEOF_VOID_P >= 8 && ... */ +#endif tor_tls_allocate_tor_tls_object_ex_data_index(); @@ -402,8 +553,6 @@ tor_tls_init(void) void tor_tls_free_all(void) { - check_no_tls_errors(); - if (server_tls_context) { tor_tls_context_t *ctx = server_tls_context; server_tls_context = NULL; @@ -414,13 +563,19 @@ tor_tls_free_all(void) client_tls_context = NULL; tor_tls_context_decref(ctx); } +#ifdef V2_HANDSHAKE_CLIENT + if (CLIENT_CIPHER_DUMMIES) + tor_free(CLIENT_CIPHER_DUMMIES); + if (CLIENT_CIPHER_STACK) + sk_SSL_CIPHER_free(CLIENT_CIPHER_STACK); +#endif } /** We need to give OpenSSL a callback to verify certificates. This is * it: We always accept peer certs and complete the handshake. We * don't validate them until later. */ -STATIC int +static int always_accept_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx) { @@ -435,21 +590,16 @@ tor_x509_name_new(const char *cname) { int nid; X509_NAME *name; - /* LCOV_EXCL_BR_START : these branches will only fail on OOM errors */ if (!(name = X509_NAME_new())) return NULL; if ((nid = OBJ_txt2nid("commonName")) == NID_undef) goto error; if (!(X509_NAME_add_entry_by_NID(name, nid, MBSTRING_ASC, (unsigned char*)cname, -1, -1, 0))) goto error; - /* LCOV_EXCL_BR_STOP */ return name; - - /* LCOV_EXCL_START : these lines will only execute on out of memory errors*/ error: X509_NAME_free(name); return NULL; - /* LCOV_EXCL_STOP */ } /** Generate and sign an X509 certificate with the public key rsa, @@ -460,12 +610,12 @@ tor_x509_name_new(const char *cname) * * Return a certificate on success, NULL on failure. */ -MOCK_IMPL(STATIC X509 *, -tor_tls_create_certificate,(crypto_pk_t *rsa, - crypto_pk_t *rsa_sign, - const char *cname, - const char *cname_sign, - unsigned int cert_lifetime)) +static X509 * +tor_tls_create_certificate(crypto_pk_t *rsa, + crypto_pk_t *rsa_sign, + const char *cname, + const char *cname_sign, + unsigned int cert_lifetime) { /* OpenSSL generates self-signed certificates with random 64-bit serial * numbers, so let's do that too. */ @@ -484,26 +634,8 @@ tor_tls_create_certificate,(crypto_pk_t *rsa, * than having it start right now. Don't choose quite uniformly, since * then we might pick a time where we're about to expire. Lastly, be * sure to start on a day boundary. */ - time_t now = time(NULL); - /* Our certificate lifetime will be cert_lifetime no matter what, but if we - * start cert_lifetime in the past, we'll have 0 real lifetime. instead we - * start up to (cert_lifetime - min_real_lifetime - start_granularity) in - * the past. */ - const time_t min_real_lifetime = 24*3600; - const time_t start_granularity = 24*3600; - time_t earliest_start_time; - /* Don't actually start in the future! */ - if (cert_lifetime <= min_real_lifetime + start_granularity) { - earliest_start_time = now - 1; - } else { - earliest_start_time = now + min_real_lifetime + start_granularity - - cert_lifetime; - } - start_time = crypto_rand_time_range(earliest_start_time, now); - /* Round the start time back to the start of a day. */ - start_time -= start_time % start_granularity; - - end_time = start_time + cert_lifetime; + start_time = time(NULL) - crypto_rand_int(cert_lifetime) + 2*24*3600; + start_time -= start_time % (24*3600); tor_assert(rsa); tor_assert(cname); @@ -519,7 +651,8 @@ tor_tls_create_certificate,(crypto_pk_t *rsa, goto error; { /* our serial number is 8 random bytes. */ - crypto_rand((char *)serial_tmp, sizeof(serial_tmp)); + if (crypto_rand((char *)serial_tmp, sizeof(serial_tmp)) < 0) + goto error; if (!(serial_number = BN_bin2bn(serial_tmp, sizeof(serial_tmp), NULL))) goto error; if (!(BN_to_ASN1_INTEGER(serial_number, X509_get_serialNumber(x509)))) @@ -537,12 +670,12 @@ tor_tls_create_certificate,(crypto_pk_t *rsa, if (!X509_time_adj(X509_get_notBefore(x509),0,&start_time)) goto error; + end_time = start_time + cert_lifetime; if (!X509_time_adj(X509_get_notAfter(x509),0,&end_time)) goto error; if (!X509_set_pubkey(x509, pkey)) goto error; - - if (!X509_sign(x509, sign_pkey, EVP_sha256())) + if (!X509_sign(x509, sign_pkey, EVP_sha1())) goto error; goto done; @@ -572,72 +705,50 @@ tor_tls_create_certificate,(crypto_pk_t *rsa, * claiming extra unsupported ciphers in order to avoid fingerprinting. */ #define SERVER_CIPHER_LIST \ (TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" \ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) + TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ + SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) /** List of ciphers that servers should select from when we actually have * our choice of what cipher to use. */ -static const char UNRESTRICTED_SERVER_CIPHER_LIST[] = - /* This list is autogenerated with the gen_server_ciphers.py script; - * don't hand-edit it. */ +const char UNRESTRICTED_SERVER_CIPHER_LIST[] = +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CHC_SHA + TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA ":" +#endif #ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ":" #endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ":" -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 - TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 ":" -#endif #ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 ":" #endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA - TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA ":" -#endif #ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA ":" #endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 - TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 ":" -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 - TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 ":" -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_CCM - TLS1_TXT_DHE_RSA_WITH_AES_256_CCM ":" -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_CCM - TLS1_TXT_DHE_RSA_WITH_AES_128_CCM ":" -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 - TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 ":" -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 ":" -#endif - /* Required */ - TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" - /* Required */ - TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" -#ifdef TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 - TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 ":" +#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 #endif -#ifdef TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 - TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 +//#if TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA +// TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA ":" +//#endif + /* These next two are mandatory. */ + TLS1_TXT_DHE_RSA_WITH_AES_256_SHA ":" + TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" +#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA + TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA ":" #endif - ; + SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA; /* Note: to set up your own private testing network with link crypto * disabled, set your Tors' cipher list to * (SSL3_TXT_RSA_NULL_SHA). If you do this, you won't be able to communicate * with any of the "real" Tors, though. */ +#ifdef V2_HANDSHAKE_CLIENT #define CIPHER(id, name) name ":" #define XCIPHER(id, name) /** List of ciphers that clients should advertise, omitting items that * our OpenSSL doesn't know about. */ static const char CLIENT_CIPHER_LIST[] = -#include "ciphers.inc" +#include "./ciphers.inc" /* Tell it not to use SSLv2 ciphers, so that it can select an SSLv3 version * of any cipher we say. */ "!SSLv2" @@ -645,9 +756,32 @@ static const char CLIENT_CIPHER_LIST[] = #undef CIPHER #undef XCIPHER +/** Holds a cipher that we want to advertise, and its 2-byte ID. */ +typedef struct cipher_info_t { unsigned id; const char *name; } cipher_info_t; +/** A list of all the ciphers that clients should advertise, including items + * that OpenSSL might not know about. */ +static const cipher_info_t CLIENT_CIPHER_INFO_LIST[] = { +#define CIPHER(id, name) { id, name }, +#define XCIPHER(id, name) { id, #name }, +#include "./ciphers.inc" +#undef CIPHER +#undef XCIPHER +}; + +/** The length of CLIENT_CIPHER_INFO_LIST and CLIENT_CIPHER_DUMMIES. */ +static const int N_CLIENT_CIPHERS = + sizeof(CLIENT_CIPHER_INFO_LIST)/sizeof(CLIENT_CIPHER_INFO_LIST[0]); +#endif + +#ifndef V2_HANDSHAKE_CLIENT +#undef CLIENT_CIPHER_LIST +#define CLIENT_CIPHER_LIST (TLS1_TXT_DHE_RSA_WITH_AES_128_SHA ":" \ + SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) +#endif + /** Free all storage held in cert */ void -tor_x509_cert_free_(tor_x509_cert_t *cert) +tor_cert_free(tor_cert_t *cert) { if (! cert) return; @@ -655,20 +789,18 @@ tor_x509_cert_free_(tor_x509_cert_t *cert) X509_free(cert->cert); tor_free(cert->encoded); memwipe(cert, 0x03, sizeof(*cert)); - /* LCOV_EXCL_BR_START since cert will never be NULL here */ tor_free(cert); - /* LCOV_EXCL_BR_STOP */ } /** - * Allocate a new tor_x509_cert_t to hold the certificate "x509_cert". + * Allocate a new tor_cert_t to hold the certificate "x509_cert". * * Steals a reference to x509_cert. */ -MOCK_IMPL(STATIC tor_x509_cert_t *, -tor_x509_cert_new,(X509 *x509_cert)) +static tor_cert_t * +tor_cert_new(X509 *x509_cert) { - tor_x509_cert_t *cert; + tor_cert_t *cert; EVP_PKEY *pkey; RSA *rsa; int length; @@ -678,9 +810,12 @@ tor_x509_cert_new,(X509 *x509_cert)) return NULL; length = i2d_X509(x509_cert, &buf); - cert = tor_malloc_zero(sizeof(tor_x509_cert_t)); + cert = tor_malloc_zero(sizeof(tor_cert_t)); if (length <= 0 || buf == NULL) { - goto err; + tor_free(cert); + log_err(LD_CRYPTO, "Couldn't get length of encoded x509 certificate"); + X509_free(x509_cert); + return NULL; } cert->encoded_len = (size_t) length; cert->encoded = tor_malloc(length); @@ -689,85 +824,60 @@ tor_x509_cert_new,(X509 *x509_cert)) cert->cert = x509_cert; - crypto_common_digests(&cert->cert_digests, + crypto_digest_all(&cert->cert_digests, (char*)cert->encoded, cert->encoded_len); if ((pkey = X509_get_pubkey(x509_cert)) && (rsa = EVP_PKEY_get1_RSA(pkey))) { crypto_pk_t *pk = crypto_new_pk_from_rsa_(rsa); - if (crypto_pk_get_common_digests(pk, &cert->pkey_digests) < 0) { - crypto_pk_free(pk); - EVP_PKEY_free(pkey); - goto err; - } - + crypto_pk_get_all_digests(pk, &cert->pkey_digests); cert->pkey_digests_set = 1; crypto_pk_free(pk); EVP_PKEY_free(pkey); } return cert; - err: - /* LCOV_EXCL_START for the same reason as the exclusion above */ - tor_free(cert); - log_err(LD_CRYPTO, "Couldn't wrap encoded X509 certificate."); - X509_free(x509_cert); - return NULL; - /* LCOV_EXCL_STOP */ -} - -/** Return a new copy of cert. */ -tor_x509_cert_t * -tor_x509_cert_dup(const tor_x509_cert_t *cert) -{ - tor_assert(cert); - X509 *x509 = cert->cert; - return tor_x509_cert_new(X509_dup(x509)); } /** Read a DER-encoded X509 cert, of length exactly certificate_len, - * from a certificate. Return a newly allocated tor_x509_cert_t on - * success and NULL on failure. */ -tor_x509_cert_t * -tor_x509_cert_decode(const uint8_t *certificate, size_t certificate_len) + * from a certificate. Return a newly allocated tor_cert_t on success + * and NULL on failure. */ +tor_cert_t * +tor_cert_decode(const uint8_t *certificate, size_t certificate_len) { X509 *x509; const unsigned char *cp = (const unsigned char *)certificate; - tor_x509_cert_t *newcert; + tor_cert_t *newcert; tor_assert(certificate); - check_no_tls_errors(); if (certificate_len > INT_MAX) - goto err; + return NULL; x509 = d2i_X509(NULL, &cp, (int)certificate_len); if (!x509) - goto err; /* Couldn't decode */ + return NULL; /* Couldn't decode */ if (cp - certificate != (int)certificate_len) { X509_free(x509); - goto err; /* Didn't use all the bytes */ + return NULL; /* Didn't use all the bytes */ } - newcert = tor_x509_cert_new(x509); + newcert = tor_cert_new(x509); if (!newcert) { - goto err; + return NULL; } if (newcert->encoded_len != certificate_len || fast_memneq(newcert->encoded, certificate, certificate_len)) { /* Cert wasn't in DER */ - tor_x509_cert_free(newcert); - goto err; + tor_cert_free(newcert); + return NULL; } return newcert; - err: - tls_log_errors(NULL, LOG_INFO, LD_CRYPTO, "decoding a certificate"); - return NULL; } /** Set *encoded_out and *size_out to cert's encoded DER * representation and length, respectively. */ void -tor_x509_cert_get_der(const tor_x509_cert_t *cert, +tor_cert_get_der(const tor_cert_t *cert, const uint8_t **encoded_out, size_t *size_out) { tor_assert(cert); @@ -779,8 +889,8 @@ tor_x509_cert_get_der(const tor_x509_cert_t *cert, /** Return a set of digests for the public key in cert, or NULL if this * cert's public key is not one we know how to take the digest of. */ -const common_digests_t * -tor_x509_cert_get_id_digests(const tor_x509_cert_t *cert) +const digests_t * +tor_cert_get_id_digests(const tor_cert_t *cert) { if (cert->pkey_digests_set) return &cert->pkey_digests; @@ -789,8 +899,8 @@ tor_x509_cert_get_id_digests(const tor_x509_cert_t *cert) } /** Return a set of digests for the public key in cert. */ -const common_digests_t * -tor_x509_cert_get_cert_digests(const tor_x509_cert_t *cert) +const digests_t * +tor_cert_get_cert_digests(const tor_cert_t *cert) { return &cert->cert_digests; } @@ -803,26 +913,24 @@ tor_tls_context_decref(tor_tls_context_t *ctx) tor_assert(ctx); if (--ctx->refcnt == 0) { SSL_CTX_free(ctx->ctx); - tor_x509_cert_free(ctx->my_link_cert); - tor_x509_cert_free(ctx->my_id_cert); - tor_x509_cert_free(ctx->my_auth_cert); + tor_cert_free(ctx->my_link_cert); + tor_cert_free(ctx->my_id_cert); + tor_cert_free(ctx->my_auth_cert); crypto_pk_free(ctx->link_key); crypto_pk_free(ctx->auth_key); - /* LCOV_EXCL_BR_START since ctx will never be NULL here */ tor_free(ctx); - /* LCOV_EXCL_BR_STOP */ } } /** Set *link_cert_out and *id_cert_out to the link certificate * and ID certificate that we're currently using for our V3 in-protocol * handshake's certificate chain. If server is true, provide the certs - * that we use in server mode (auth, ID); otherwise, provide the certs that we - * use in client mode. (link, ID) */ + * that we use in server mode; otherwise, provide the certs that we use in + * client mode. */ int tor_tls_get_my_certs(int server, - const tor_x509_cert_t **link_cert_out, - const tor_x509_cert_t **id_cert_out) + const tor_cert_t **link_cert_out, + const tor_cert_t **id_cert_out) { tor_tls_context_t *ctx = server ? server_tls_context : client_tls_context; if (! ctx) @@ -848,10 +956,10 @@ tor_tls_get_my_client_auth_key(void) /** * Return a newly allocated copy of the public key that a certificate - * certifies. Watch out! This returns NULL if the cert's key is not RSA. + * certifies. Return NULL if the cert's key is not RSA. */ crypto_pk_t * -tor_tls_cert_get_key(tor_x509_cert_t *cert) +tor_tls_cert_get_key(tor_cert_t *cert) { crypto_pk_t *result = NULL; EVP_PKEY *pkey = X509_get_pubkey(cert->cert); @@ -871,8 +979,8 @@ tor_tls_cert_get_key(tor_x509_cert_t *cert) /** Return true iff the other side of tls has authenticated to us, and * the key certified in cert is the same as the key they used to do it. */ -MOCK_IMPL(int, -tor_tls_cert_matches_key,(const tor_tls_t *tls, const tor_x509_cert_t *cert)) +int +tor_tls_cert_matches_key(const tor_tls_t *tls, const tor_cert_t *cert) { X509 *peercert = SSL_get_peer_certificate(tls->ssl); EVP_PKEY *link_key = NULL, *cert_key = NULL; @@ -901,47 +1009,37 @@ tor_tls_cert_matches_key,(const tor_tls_t *tls, const tor_x509_cert_t *cert)) * we couldn't check it. */ int tor_tls_cert_is_valid(int severity, - const tor_x509_cert_t *cert, - const tor_x509_cert_t *signing_cert, - time_t now, + const tor_cert_t *cert, + const tor_cert_t *signing_cert, int check_rsa_1024) { - check_no_tls_errors(); EVP_PKEY *cert_key; - int r, key_ok = 0; - - if (!signing_cert || !cert) - goto bad; - EVP_PKEY *signing_key = X509_get_pubkey(signing_cert->cert); + int r, key_ok = 0; if (!signing_key) - goto bad; + return 0; r = X509_verify(cert->cert, signing_key); EVP_PKEY_free(signing_key); if (r <= 0) - goto bad; + return 0; /* okay, the signature checked out right. Now let's check the check the * lifetime. */ - if (check_cert_lifetime_internal(severity, cert->cert, now, + if (check_cert_lifetime_internal(severity, cert->cert, 48*60*60, 30*24*60*60) < 0) - goto bad; + return 0; cert_key = X509_get_pubkey(cert->cert); if (check_rsa_1024 && cert_key) { RSA *rsa = EVP_PKEY_get1_RSA(cert_key); -#ifdef OPENSSL_1_1_API - if (rsa && RSA_bits(rsa) == 1024) -#else if (rsa && BN_num_bits(rsa->n) == 1024) -#endif key_ok = 1; if (rsa) RSA_free(rsa); } else if (cert_key) { int min_bits = 1024; #ifdef EVP_PKEY_EC - if (EVP_PKEY_base_id(cert_key) == EVP_PKEY_EC) + if (EVP_PKEY_type(cert_key->type) == EVP_PKEY_EC) min_bits = 128; #endif if (EVP_PKEY_bits(cert_key) >= min_bits) @@ -949,14 +1047,11 @@ tor_tls_cert_is_valid(int severity, } EVP_PKEY_free(cert_key); if (!key_ok) - goto bad; + return 0; /* XXXX compare DNs or anything? */ return 1; - bad: - tls_log_errors(NULL, LOG_INFO, LD_CRYPTO, "checking a certificate"); - return 0; } /** Increase the reference count of ctx. */ @@ -983,7 +1078,6 @@ tor_tls_context_init(unsigned flags, int rv1 = 0; int rv2 = 0; const int is_public_server = flags & TOR_TLS_CTX_IS_PUBLIC_SERVER; - check_no_tls_errors(); if (is_public_server) { tor_tls_context_t *new_ctx; @@ -1028,7 +1122,6 @@ tor_tls_context_init(unsigned flags, 1); } - tls_log_errors(NULL, LOG_WARN, LD_CRYPTO, "constructing a TLS context"); return MIN(rv1, rv2); } @@ -1038,7 +1131,7 @@ tor_tls_context_init(unsigned flags, * it generates new certificates; all new connections will use * the new SSL context. */ -STATIC int +static int tor_tls_context_init_one(tor_tls_context_t **ppcontext, crypto_pk_t *identity, unsigned int key_lifetime, @@ -1065,16 +1158,11 @@ tor_tls_context_init_one(tor_tls_context_t **ppcontext, return ((new_ctx != NULL) ? 0 : -1); } -/** The group we should use for ecdhe when none was selected. */ -#define NID_tor_default_ecdhe_group NID_X9_62_prime256v1 - -#define RSA_LINK_KEY_BITS 2048 - /** Create a new TLS context for use with Tor TLS handshakes. * identity should be set to the identity key used to sign the * certificate. */ -STATIC tor_tls_context_t * +static tor_tls_context_t * tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, unsigned flags, int is_client) { @@ -1095,7 +1183,7 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, /* Generate short-term RSA key for use with TLS. */ if (!(rsa = crypto_pk_new())) goto error; - if (crypto_pk_generate_key_with_bits(rsa, RSA_LINK_KEY_BITS)<0) + if (crypto_pk_generate_key(rsa)<0) goto error; if (!is_client) { /* Generate short-term RSA key for use in the in-protocol ("v3") @@ -1122,9 +1210,9 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, result = tor_malloc_zero(sizeof(tor_tls_context_t)); result->refcnt = 1; if (!is_client) { - result->my_link_cert = tor_x509_cert_new(X509_dup(cert)); - result->my_id_cert = tor_x509_cert_new(X509_dup(idcert)); - result->my_auth_cert = tor_x509_cert_new(X509_dup(authcert)); + result->my_link_cert = tor_cert_new(X509_dup(cert)); + result->my_id_cert = tor_cert_new(X509_dup(idcert)); + result->my_auth_cert = tor_cert_new(X509_dup(authcert)); if (!result->my_link_cert || !result->my_id_cert || !result->my_auth_cert) goto error; result->link_key = crypto_pk_dup_key(rsa); @@ -1138,22 +1226,29 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, * with existing Tors. */ if (!(result->ctx = SSL_CTX_new(TLSv1_method()))) goto error; -#endif /* 0 */ +#endif - /* Tell OpenSSL to use TLS 1.0 or later but not SSL2 or SSL3. */ -#ifdef HAVE_TLS_METHOD - if (!(result->ctx = SSL_CTX_new(TLS_method()))) - goto error; -#else + /* Tell OpenSSL to use SSL3 or TLS1 but not SSL2. */ if (!(result->ctx = SSL_CTX_new(SSLv23_method()))) goto error; -#endif /* defined(HAVE_TLS_METHOD) */ SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv2); - SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv3); - /* Prefer the server's ordering of ciphers: the client's ordering has - * historically been chosen for fingerprinting resistance. */ - SSL_CTX_set_options(result->ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); + /* Disable TLS1.1 and TLS1.2 if they exist. We need to do this to + * workaround a bug present in all OpenSSL 1.0.1 versions (as of 1 + * June 2012), wherein renegotiating while using one of these TLS + * protocols will cause the client to send a TLS 1.0 ServerHello + * rather than a ServerHello written with the appropriate protocol + * version. Once some version of OpenSSL does TLS1.1 and TLS1.2 + * renegotiation properly, we can turn them back on when built with + * that version. */ +#if OPENSSL_VERSION_NUMBER < OPENSSL_V(1,0,1,'e') +#ifdef SSL_OP_NO_TLSv1_2 + SSL_CTX_set_options(result->ctx, SSL_OP_NO_TLSv1_2); +#endif +#ifdef SSL_OP_NO_TLSv1_1 + SSL_CTX_set_options(result->ctx, SSL_OP_NO_TLSv1_1); +#endif +#endif /* Disable TLS tickets if they're supported. We never want to use them; * using them can make our perfect forward secrecy a little worse, *and* @@ -1171,6 +1266,23 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, } #endif + if ( +#ifdef DISABLE_SSL3_HANDSHAKE + 1 || +#endif + SSLeay() < OPENSSL_V(0,9,8,'s') || + (SSLeay() >= OPENSSL_V_SERIES(0,9,9) && + SSLeay() < OPENSSL_V(1,0,0,'f'))) { + /* And not SSL3 if it's subject to CVE-2011-4576. */ + log_info(LD_NET, "Disabling SSLv3 because this OpenSSL version " + "might otherwise be vulnerable to CVE-2011-4576 " + "(compile-time version %08lx (%s); " + "runtime version %08lx (%s))", + (unsigned long)OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT, + (unsigned long)SSLeay(), SSLeay_version(SSLEAY_VERSION)); + SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv3); + } + SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_DH_USE); SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_ECDH_USE); @@ -1181,24 +1293,14 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, /* Yes, we know what we are doing here. No, we do not treat a renegotiation * as authenticating any earlier-received data. */ - { + if (use_unsafe_renegotiation_op) { SSL_CTX_set_options(result->ctx, SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); } - - /* Don't actually allow compression; it uses RAM and time, it makes TLS - * vulnerable to CRIME-style attacks, and most of the data we transmit over - * TLS is encrypted (and therefore uncompressible) anyway. */ -#ifdef SSL_OP_NO_COMPRESSION - SSL_CTX_set_options(result->ctx, SSL_OP_NO_COMPRESSION); -#endif -#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(1,1,0) -#ifndef OPENSSL_NO_COMP + /* Don't actually allow compression; it uses ram and time, but the data + * we transmit is all encrypted anyway. */ if (result->ctx->comp_methods) result->ctx->comp_methods = NULL; -#endif -#endif /* OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(1,1,0) */ - #ifdef SSL_MODE_RELEASE_BUFFERS SSL_CTX_set_mode(result->ctx, SSL_MODE_RELEASE_BUFFERS); #endif @@ -1233,6 +1335,8 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, SSL_CTX_set_tmp_dh(result->ctx, crypto_dh_get_dh_(dh)); crypto_dh_free(dh); } +#if (!defined(OPENSSL_NO_EC) && \ + OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0)) if (! is_client) { int nid; EC_KEY *ec_key; @@ -1241,13 +1345,16 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, else if (flags & TOR_TLS_CTX_USE_ECDHE_P256) nid = NID_X9_62_prime256v1; else - nid = NID_tor_default_ecdhe_group; + nid = NID_X9_62_prime256v1; /* Use P-256 for ECDHE. */ ec_key = EC_KEY_new_by_curve_name(nid); if (ec_key != NULL) /*XXXX Handle errors? */ SSL_CTX_set_tmp_ecdh(result->ctx, ec_key); EC_KEY_free(ec_key); } +#else + (void)flags; +#endif SSL_CTX_set_verify(result->ctx, SSL_VERIFY_PEER, always_accept_verify_cb); /* let us realloc bufs that we're writing from */ @@ -1284,13 +1391,11 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, } /** Invoked when a TLS state changes: log the change at severity 'debug' */ -STATIC void +static void tor_tls_debug_state_callback(const SSL *ssl, int type, int val) { - /* LCOV_EXCL_START since this depends on whether debug is captured or not */ log_debug(LD_HANDSHAKE, "SSL %p is now in state %s [type=%d,val=%d].", ssl, SSL_state_string_long(ssl), type, val); - /* LCOV_EXCL_STOP */ } /* Return the name of the negotiated ciphersuite in use on tls */ @@ -1300,11 +1405,13 @@ tor_tls_get_ciphersuite_name(tor_tls_t *tls) return SSL_get_cipher(tls->ssl); } +#ifdef V2_HANDSHAKE_SERVER + /* Here's the old V2 cipher list we sent from 0.2.1.1-alpha up to * 0.2.3.17-beta. If a client is using this list, we can't believe the ciphers * that it claims to support. We'll prune this list to remove the ciphers * *we* don't recognize. */ -STATIC uint16_t v2_cipher_list[] = { +static uint16_t v2_cipher_list[] = { 0xc00a, /* TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA */ 0xc014, /* TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA */ 0x0039, /* TLS1_TXT_DHE_RSA_WITH_AES_256_SHA */ @@ -1338,80 +1445,24 @@ STATIC uint16_t v2_cipher_list[] = { /** Have we removed the unrecognized ciphers from v2_cipher_list yet? */ static int v2_cipher_list_pruned = 0; -/** Return 0 if m does not support the cipher with ID cipher; - * return 1 if it does support it, or if we have no way to tell. */ -STATIC int -find_cipher_by_id(const SSL *ssl, const SSL_METHOD *m, uint16_t cipher) -{ - const SSL_CIPHER *c; -#ifdef HAVE_SSL_CIPHER_FIND - (void) m; - { - unsigned char cipherid[3]; - tor_assert(ssl); - set_uint16(cipherid, htons(cipher)); - cipherid[2] = 0; /* If ssl23_get_cipher_by_char finds no cipher starting - * with a two-byte 'cipherid', it may look for a v2 - * cipher with the appropriate 3 bytes. */ - c = SSL_CIPHER_find((SSL*)ssl, cipherid); - if (c) - tor_assert((SSL_CIPHER_get_id(c) & 0xffff) == cipher); - return c != NULL; - } -#else /* !(defined(HAVE_SSL_CIPHER_FIND)) */ - -# if defined(HAVE_STRUCT_SSL_METHOD_ST_GET_CIPHER_BY_CHAR) - if (m && m->get_cipher_by_char) { - unsigned char cipherid[3]; - set_uint16(cipherid, htons(cipher)); - cipherid[2] = 0; /* If ssl23_get_cipher_by_char finds no cipher starting - * with a two-byte 'cipherid', it may look for a v2 - * cipher with the appropriate 3 bytes. */ - c = m->get_cipher_by_char(cipherid); - if (c) - tor_assert((c->id & 0xffff) == cipher); - return c != NULL; - } -#endif /* defined(HAVE_STRUCT_SSL_METHOD_ST_GET_CIPHER_BY_CHAR) */ -# ifndef OPENSSL_1_1_API - if (m && m->get_cipher && m->num_ciphers) { - /* It would seem that some of the "let's-clean-up-openssl" forks have - * removed the get_cipher_by_char function. Okay, so now you get a - * quadratic search. - */ - int i; - for (i = 0; i < m->num_ciphers(); ++i) { - c = m->get_cipher(i); - if (c && (c->id & 0xffff) == cipher) { - return 1; - } - } - return 0; - } -#endif /* !defined(OPENSSL_1_1_API) */ - (void) ssl; - (void) m; - (void) cipher; - return 1; /* No way to search */ -#endif /* defined(HAVE_SSL_CIPHER_FIND) */ -} - /** Remove from v2_cipher_list every cipher that we don't support, so that * comparing v2_cipher_list to a client's cipher list will give a sensible * result. */ static void -prune_v2_cipher_list(const SSL *ssl) +prune_v2_cipher_list(void) { uint16_t *inp, *outp; -#ifdef HAVE_TLS_METHOD - const SSL_METHOD *m = TLS_method(); -#else const SSL_METHOD *m = SSLv23_method(); -#endif inp = outp = v2_cipher_list; while (*inp) { - if (find_cipher_by_id(ssl, m, *inp)) { + unsigned char cipherid[2]; + const SSL_CIPHER *cipher; + /* Is there no better way to do this? */ + set_uint16(cipherid, htons(*inp)); + cipher = m->get_cipher_by_char(cipherid); + if (cipher) { + tor_assert((cipher->id & 0xffff) == *inp); *outp++ = *inp++; } else { inp++; @@ -1426,14 +1477,14 @@ prune_v2_cipher_list(const SSL *ssl) * client it is. Return one of CIPHERS_ERR, CIPHERS_V1, CIPHERS_V2, * CIPHERS_UNRESTRICTED. **/ -STATIC int +static int tor_tls_classify_client_ciphers(const SSL *ssl, STACK_OF(SSL_CIPHER) *peer_ciphers) { int i, res; tor_tls_t *tor_tls; if (PREDICT_UNLIKELY(!v2_cipher_list_pruned)) - prune_v2_cipher_list(ssl); + prune_v2_cipher_list(); tor_tls = tor_tls_get_by_ssl(ssl); if (tor_tls && tor_tls->client_cipher_list_type) @@ -1449,7 +1500,7 @@ tor_tls_classify_client_ciphers(const SSL *ssl, /* Now we need to see if there are any ciphers whose presence means we're * dealing with an updated Tor. */ for (i = 0; i < sk_SSL_CIPHER_num(peer_ciphers); ++i) { - const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); + SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); const char *ciphername = SSL_CIPHER_get_name(cipher); if (strcmp(ciphername, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) && strcmp(ciphername, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) && @@ -1466,8 +1517,8 @@ tor_tls_classify_client_ciphers(const SSL *ssl, { const uint16_t *v2_cipher = v2_cipher_list; for (i = 0; i < sk_SSL_CIPHER_num(peer_ciphers); ++i) { - const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); - uint16_t id = SSL_CIPHER_get_id(cipher) & 0xffff; + SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); + uint16_t id = cipher->id & 0xffff; if (id == 0x00ff) /* extended renegotiation indicator. */ continue; if (!id || id != *v2_cipher) { @@ -1488,7 +1539,7 @@ tor_tls_classify_client_ciphers(const SSL *ssl, smartlist_t *elts = smartlist_new(); char *s; for (i = 0; i < sk_SSL_CIPHER_num(peer_ciphers); ++i) { - const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); + SSL_CIPHER *cipher = sk_SSL_CIPHER_value(peer_ciphers, i); const char *ciphername = SSL_CIPHER_get_name(cipher); smartlist_add(elts, (char*)ciphername); } @@ -1508,22 +1559,16 @@ tor_tls_classify_client_ciphers(const SSL *ssl, /** Return true iff the cipher list suggested by the client for ssl is * a list that indicates that the client knows how to do the v2 TLS connection * handshake. */ -STATIC int +static int tor_tls_client_is_using_v2_ciphers(const SSL *ssl) { - STACK_OF(SSL_CIPHER) *ciphers; -#ifdef HAVE_SSL_GET_CLIENT_CIPHERS - ciphers = SSL_get_client_ciphers(ssl); -#else SSL_SESSION *session; if (!(session = SSL_get_session((SSL *)ssl))) { log_info(LD_NET, "No session on TLS?"); return CIPHERS_ERR; } - ciphers = session->ciphers; -#endif /* defined(HAVE_SSL_GET_CLIENT_CIPHERS) */ - return tor_tls_classify_client_ciphers(ssl, ciphers) >= CIPHERS_V2; + return tor_tls_classify_client_ciphers(ssl, session->ciphers) >= CIPHERS_V2; } /** Invoked when we're accepting a connection on ssl, and the connection @@ -1532,24 +1577,20 @@ tor_tls_client_is_using_v2_ciphers(const SSL *ssl) * do not send or request extra certificates in v2 handshakes. *
  • To detect renegotiation
  • */ -STATIC void +static void tor_tls_server_info_callback(const SSL *ssl, int type, int val) { tor_tls_t *tls; (void) val; - IF_BUG_ONCE(ssl == NULL) { - return; // LCOV_EXCL_LINE - } - tor_tls_debug_state_callback(ssl, type, val); if (type != SSL_CB_ACCEPT_LOOP) return; - - OSSL_HANDSHAKE_STATE ssl_state = SSL_get_state(ssl); - if (! STATE_IS_SW_SERVER_HELLO(ssl_state)) + if ((ssl->state != SSL3_ST_SW_SRVR_HELLO_A) && + (ssl->state != SSL3_ST_SW_SRVR_HELLO_B)) return; + tls = tor_tls_get_by_ssl(ssl); if (tls) { /* Check whether we're watching for renegotiates. If so, this is one! */ @@ -1578,14 +1619,18 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val) if (tls) { tls->wasV2Handshake = 1; +#ifdef USE_BUFFEREVENTS + if (use_unsafe_renegotiation_flag) + tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; +#endif } else { - /* LCOV_EXCL_START this line is not reachable */ log_warn(LD_BUG, "Couldn't look up the tls for an SSL*. How odd!"); - /* LCOV_EXCL_STOP */ } } } +#endif +#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0) /** Callback to get invoked on a server after we've read the list of ciphers * the client supports, but before we pick our own ciphersuite. * @@ -1598,11 +1643,10 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val) * authentication on the fly. But as long as we return 0, we won't actually be * setting up a shared secret, and all will be fine. */ -STATIC int +static int tor_tls_session_secret_cb(SSL *ssl, void *secret, int *secret_len, STACK_OF(SSL_CIPHER) *peer_ciphers, - CONST_IF_OPENSSL_1_1_API SSL_CIPHER **cipher, - void *arg) + SSL_CIPHER **cipher, void *arg) { (void) secret; (void) secret_len; @@ -1624,6 +1668,128 @@ tor_tls_setup_session_secret_cb(tor_tls_t *tls) { SSL_set_session_secret_cb(tls->ssl, tor_tls_session_secret_cb, NULL); } +#else +#define tor_tls_setup_session_secret_cb(tls) STMT_NIL +#endif + +/** Explain which ciphers we're missing. */ +static void +log_unsupported_ciphers(smartlist_t *unsupported) +{ + char *joined; + + log_notice(LD_NET, "We weren't able to find support for all of the " + "TLS ciphersuites that we wanted to advertise. This won't " + "hurt security, but it might make your Tor (if run as a client) " + "more easy for censors to block."); + + if (SSLeay() < 0x10000000L) { + log_notice(LD_NET, "To correct this, use a more recent OpenSSL, " + "built without disabling any secure ciphers or features."); + } else { + log_notice(LD_NET, "To correct this, use a version of OpenSSL " + "built with none of its ciphers disabled."); + } + + joined = smartlist_join_strings(unsupported, ":", 0, NULL); + log_info(LD_NET, "The unsupported ciphers were: %s", joined); + tor_free(joined); +} + +/** Replace *ciphers with a new list of SSL ciphersuites: specifically, + * a list designed to mimic a common web browser. We might not be able to do + * that if OpenSSL doesn't support all the ciphers we want. Some of the + * ciphers in the list won't actually be implemented by OpenSSL: that's okay + * so long as the server doesn't select them. + * + * [If the server does select a bogus cipher, we won't crash or + * anything; we'll just fail later when we try to look up the cipher in + * ssl->cipher_list_by_id.] + */ +static void +rectify_client_ciphers(STACK_OF(SSL_CIPHER) **ciphers) +{ +#ifdef V2_HANDSHAKE_CLIENT + if (PREDICT_UNLIKELY(!CLIENT_CIPHER_STACK)) { + /* We need to set CLIENT_CIPHER_STACK to an array of the ciphers + * we want to use/advertise. */ + int i = 0, j = 0; + smartlist_t *unsupported = smartlist_new(); + + /* First, create a dummy SSL_CIPHER for every cipher. */ + CLIENT_CIPHER_DUMMIES = + tor_malloc_zero(sizeof(SSL_CIPHER)*N_CLIENT_CIPHERS); + for (i=0; i < N_CLIENT_CIPHERS; ++i) { + CLIENT_CIPHER_DUMMIES[i].valid = 1; + /* The "3<<24" here signifies that the cipher is supposed to work with + * SSL3 and TLS1. */ + CLIENT_CIPHER_DUMMIES[i].id = CLIENT_CIPHER_INFO_LIST[i].id | (3<<24); + CLIENT_CIPHER_DUMMIES[i].name = CLIENT_CIPHER_INFO_LIST[i].name; + } + + CLIENT_CIPHER_STACK = sk_SSL_CIPHER_new_null(); + tor_assert(CLIENT_CIPHER_STACK); + + log_debug(LD_NET, "List was: %s", CLIENT_CIPHER_LIST); + for (j = 0; j < sk_SSL_CIPHER_num(*ciphers); ++j) { + SSL_CIPHER *cipher = sk_SSL_CIPHER_value(*ciphers, j); + log_debug(LD_NET, "Cipher %d: %lx %s", j, cipher->id, cipher->name); + } + + /* Then copy as many ciphers as we can from the good list, inserting + * dummies as needed. Let j be an index into list of ciphers we have + * (*ciphers) and let i be an index into the ciphers we want + * (CLIENT_INFO_CIPHER_LIST). We are building a list of ciphers in + * CLIENT_CIPHER_STACK. + */ + for (i = j = 0; i < N_CLIENT_CIPHERS; ) { + SSL_CIPHER *cipher = NULL; + if (j < sk_SSL_CIPHER_num(*ciphers)) + cipher = sk_SSL_CIPHER_value(*ciphers, j); + if (cipher && ((cipher->id >> 24) & 0xff) != 3) { + /* Skip over non-v3 ciphers entirely. (This should no longer be + * needed, thanks to saying !SSLv2 above.) */ + log_debug(LD_NET, "Skipping v%d cipher %s", + (int)((cipher->id>>24) & 0xff), + cipher->name); + ++j; + } else if (cipher && + (cipher->id & 0xffff) == CLIENT_CIPHER_INFO_LIST[i].id) { + /* "cipher" is the cipher we expect. Put it on the list. */ + log_debug(LD_NET, "Found cipher %s", cipher->name); + sk_SSL_CIPHER_push(CLIENT_CIPHER_STACK, cipher); + ++j; + ++i; + } else if (!strcmp(CLIENT_CIPHER_DUMMIES[i].name, + "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA")) { + /* We found bogus cipher 0xfeff, which OpenSSL doesn't support and + * never has. For this one, we need a dummy. */ + log_debug(LD_NET, "Inserting fake %s", CLIENT_CIPHER_DUMMIES[i].name); + sk_SSL_CIPHER_push(CLIENT_CIPHER_STACK, &CLIENT_CIPHER_DUMMIES[i]); + ++i; + } else { + /* OpenSSL doesn't have this one. */ + log_debug(LD_NET, "Completely omitting unsupported cipher %s", + CLIENT_CIPHER_INFO_LIST[i].name); + smartlist_add(unsupported, (char*) CLIENT_CIPHER_INFO_LIST[i].name); + ++i; + } + } + + if (smartlist_len(unsupported)) + log_unsupported_ciphers(unsupported); + + smartlist_free(unsupported); + } + + sk_SSL_CIPHER_free(*ciphers); + *ciphers = sk_SSL_CIPHER_dup(CLIENT_CIPHER_STACK); + tor_assert(*ciphers); + +#else + (void)ciphers; +#endif +} /** Create a new TLS object from a file descriptor, and a flag to * determine whether it is functioning as a server. @@ -1637,12 +1803,11 @@ tor_tls_new(int sock, int isServer) client_tls_context; result->magic = TOR_TLS_MAGIC; - check_no_tls_errors(); tor_assert(context); /* make sure somebody made it first */ if (!(result->ssl = SSL_new(context->ctx))) { tls_log_errors(NULL, LOG_WARN, LD_NET, "creating SSL object"); tor_free(result); - goto err; + return NULL; } #ifdef SSL_set_tlsext_host_name @@ -1652,7 +1817,7 @@ tor_tls_new(int sock, int isServer) SSL_set_tlsext_host_name(result->ssl, fake_hostname); tor_free(fake_hostname); } -#endif /* defined(SSL_set_tlsext_host_name) */ +#endif if (!SSL_set_cipher_list(result->ssl, isServer ? SERVER_CIPHER_LIST : CLIENT_CIPHER_LIST)) { @@ -1662,8 +1827,10 @@ tor_tls_new(int sock, int isServer) #endif SSL_free(result->ssl); tor_free(result); - goto err; + return NULL; } + if (!isServer) + rectify_client_ciphers(&result->ssl->cipher_list); result->socket = sock; bio = BIO_new_socket(sock, BIO_NOCLOSE); if (! bio) { @@ -1673,7 +1840,7 @@ tor_tls_new(int sock, int isServer) #endif SSL_free(result->ssl); tor_free(result); - goto err; + return NULL; } { int set_worked = @@ -1689,25 +1856,24 @@ tor_tls_new(int sock, int isServer) result->state = TOR_TLS_ST_HANDSHAKE; result->isServer = isServer; result->wantwrite_n = 0; - result->last_write_count = (unsigned long) BIO_number_written(bio); - result->last_read_count = (unsigned long) BIO_number_read(bio); + result->last_write_count = BIO_number_written(bio); + result->last_read_count = BIO_number_read(bio); if (result->last_write_count || result->last_read_count) { log_warn(LD_NET, "Newly created BIO has read count %lu, write count %lu", result->last_read_count, result->last_write_count); } +#ifdef V2_HANDSHAKE_SERVER if (isServer) { SSL_set_info_callback(result->ssl, tor_tls_server_info_callback); - } else { + } else +#endif + { SSL_set_info_callback(result->ssl, tor_tls_debug_state_callback); } if (isServer) tor_tls_setup_session_secret_cb(result); - goto done; - err: - result = NULL; - done: /* Not expected to get called. */ tls_log_errors(NULL, LOG_WARN, LD_NET, "creating tor_tls_t object"); return result; @@ -1736,11 +1902,13 @@ tor_tls_set_renegotiate_callback(tor_tls_t *tls, tls->negotiated_callback = cb; tls->callback_arg = arg; tls->got_renegotiate = 0; +#ifdef V2_HANDSHAKE_SERVER if (cb) { SSL_set_info_callback(tls->ssl, tor_tls_server_info_callback); } else { SSL_set_info_callback(tls->ssl, tor_tls_debug_state_callback); } +#endif } /** If this version of openssl requires it, turn on renegotiation on @@ -1751,8 +1919,13 @@ tor_tls_unblock_renegotiation(tor_tls_t *tls) { /* Yes, we know what we are doing here. No, we do not treat a renegotiation * as authenticating any earlier-received data. */ - SSL_set_options(tls->ssl, - SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + if (use_unsafe_renegotiation_flag) { + tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; + } + if (use_unsafe_renegotiation_op) { + SSL_set_options(tls->ssl, + SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + } } /** If this version of openssl supports it, turn off renegotiation on @@ -1762,24 +1935,21 @@ tor_tls_unblock_renegotiation(tor_tls_t *tls) void tor_tls_block_renegotiation(tor_tls_t *tls) { -#ifdef SUPPORT_UNSAFE_RENEGOTIATION_FLAG tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; -#else - (void) tls; -#endif } /** Assert that the flags that allow legacy renegotiation are still set */ void tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls) { -#if defined(SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION) && \ - SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION != 0 - long options = SSL_get_options(tls->ssl); - tor_assert(0 != (options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); -#else - (void) tls; -#endif /* defined(SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION) && ... */ + if (use_unsafe_renegotiation_flag) { + tor_assert(0 != (tls->ssl->s3->flags & + SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); + } + if (use_unsafe_renegotiation_op) { + long options = SSL_get_options(tls->ssl); + tor_assert(0 != (options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)); + } } /** Return whether this tls initiated the connect (client) or @@ -1795,7 +1965,7 @@ tor_tls_is_server(tor_tls_t *tls) * underlying file descriptor. */ void -tor_tls_free_(tor_tls_t *tls) +tor_tls_free(tor_tls_t *tls) { if (!tls) return; @@ -1822,8 +1992,8 @@ tor_tls_free_(tor_tls_t *tls) * number of characters read. On failure, returns TOR_TLS_ERROR, * TOR_TLS_CLOSE, TOR_TLS_WANTREAD, or TOR_TLS_WANTWRITE. */ -MOCK_IMPL(int, -tor_tls_read,(tor_tls_t *tls, char *cp, size_t len)) +int +tor_tls_read(tor_tls_t *tls, char *cp, size_t len) { int r, err; tor_assert(tls); @@ -1832,6 +2002,7 @@ tor_tls_read,(tor_tls_t *tls, char *cp, size_t len)) tor_assert(lenssl, cp, (int)len); if (r > 0) { +#ifdef V2_HANDSHAKE_SERVER if (tls->got_renegotiate) { /* Renegotiation happened! */ log_info(LD_NET, "Got a TLS renegotiation from %s", ADDR(tls)); @@ -1839,6 +2010,7 @@ tor_tls_read,(tor_tls_t *tls, char *cp, size_t len)) tls->negotiated_callback(tls, tls->callback_arg); tls->got_renegotiate = 0; } +#endif return r; } err = tor_tls_get_error(tls, r, CATCH_ZERO, "reading", LOG_DEBUG, LD_NET); @@ -1855,10 +2027,10 @@ tor_tls_read,(tor_tls_t *tls, char *cp, size_t len)) /** Total number of bytes that we've used TLS to send. Used to track TLS * overhead. */ -STATIC uint64_t total_bytes_written_over_tls = 0; +static uint64_t total_bytes_written_over_tls = 0; /** Total number of bytes that TLS has put on the network for us. Used to * track TLS overhead. */ -STATIC uint64_t total_bytes_written_by_tls = 0; +static uint64_t total_bytes_written_by_tls = 0; /** Underlying function for TLS writing. Write up to n * characters from cp onto tls. On success, returns the @@ -1903,14 +2075,12 @@ int tor_tls_handshake(tor_tls_t *tls) { int r; + int oldstate; tor_assert(tls); tor_assert(tls->ssl); tor_assert(tls->state == TOR_TLS_ST_HANDSHAKE); - check_no_tls_errors(); - - OSSL_HANDSHAKE_STATE oldstate = SSL_get_state(tls->ssl); - + oldstate = tls->ssl->state; if (tls->isServer) { log_debug(LD_HANDSHAKE, "About to call SSL_accept on %p (%s)", tls, SSL_state_string_long(tls->ssl)); @@ -1920,10 +2090,7 @@ tor_tls_handshake(tor_tls_t *tls) SSL_state_string_long(tls->ssl)); r = SSL_connect(tls->ssl); } - - OSSL_HANDSHAKE_STATE newstate = SSL_get_state(tls->ssl); - - if (oldstate != newstate) + if (oldstate != tls->ssl->state) log_debug(LD_HANDSHAKE, "After call, %p was in state %s", tls, SSL_state_string_long(tls->ssl)); /* We need to call this here and not earlier, since OpenSSL has a penchant @@ -1954,11 +2121,12 @@ int tor_tls_finish_handshake(tor_tls_t *tls) { int r = TOR_TLS_DONE; - check_no_tls_errors(); if (tls->isServer) { SSL_set_info_callback(tls->ssl, NULL); SSL_set_verify(tls->ssl, SSL_VERIFY_PEER, always_accept_verify_cb); - SSL_clear_mode(tls->ssl, SSL_MODE_NO_AUTO_CHAIN); + /* There doesn't seem to be a clear OpenSSL API to clear mode flags. */ + tls->ssl->mode &= ~SSL_MODE_NO_AUTO_CHAIN; +#ifdef V2_HANDSHAKE_SERVER if (tor_tls_client_is_using_v2_ciphers(tls->ssl)) { /* This check is redundant, but back when we did it in the callback, * we might have not been able to look up the tor_tls_t if the code @@ -1973,19 +2141,78 @@ tor_tls_finish_handshake(tor_tls_t *tls) } else { tls->wasV2Handshake = 0; } +#endif } else { - /* Client-side */ - tls->wasV2Handshake = 1; - /* XXXX this can move, probably? -NM */ +#ifdef V2_HANDSHAKE_CLIENT + /* If we got no ID cert, we're a v2 handshake. */ + X509 *cert = SSL_get_peer_certificate(tls->ssl); + STACK_OF(X509) *chain = SSL_get_peer_cert_chain(tls->ssl); + int n_certs = sk_X509_num(chain); + if (n_certs > 1 || (n_certs == 1 && cert != sk_X509_value(chain, 0))) { + log_debug(LD_HANDSHAKE, "Server sent back multiple certificates; it " + "looks like a v1 handshake on %p", tls); + tls->wasV2Handshake = 0; + } else { + log_debug(LD_HANDSHAKE, + "Server sent back a single certificate; looks like " + "a v2 handshake on %p.", tls); + tls->wasV2Handshake = 1; + } + if (cert) + X509_free(cert); +#endif if (SSL_set_cipher_list(tls->ssl, SERVER_CIPHER_LIST) == 0) { tls_log_errors(NULL, LOG_WARN, LD_HANDSHAKE, "re-setting ciphers"); r = TOR_TLS_ERROR_MISC; } } - tls_log_errors(NULL, LOG_WARN, LD_NET, "finishing the handshake"); return r; } +#ifdef USE_BUFFEREVENTS +/** Put tls, which must be a client connection, into renegotiation + * mode. */ +int +tor_tls_start_renegotiating(tor_tls_t *tls) +{ + int r = SSL_renegotiate(tls->ssl); + if (r <= 0) { + return tor_tls_get_error(tls, r, 0, "renegotiating", LOG_WARN, + LD_HANDSHAKE); + } + return 0; +} +#endif + +/** Client only: Renegotiate a TLS session. When finished, returns + * TOR_TLS_DONE. On failure, returns TOR_TLS_ERROR, TOR_TLS_WANTREAD, or + * TOR_TLS_WANTWRITE. + */ +int +tor_tls_renegotiate(tor_tls_t *tls) +{ + int r; + tor_assert(tls); + /* We could do server-initiated renegotiation too, but that would be tricky. + * Instead of "SSL_renegotiate, then SSL_do_handshake until done" */ + tor_assert(!tls->isServer); + if (tls->state != TOR_TLS_ST_RENEGOTIATE) { + int r = SSL_renegotiate(tls->ssl); + if (r <= 0) { + return tor_tls_get_error(tls, r, 0, "renegotiating", LOG_WARN, + LD_HANDSHAKE); + } + tls->state = TOR_TLS_ST_RENEGOTIATE; + } + r = SSL_do_handshake(tls->ssl); + if (r == 1) { + tls->state = TOR_TLS_ST_OPEN; + return TOR_TLS_DONE; + } else + return tor_tls_get_error(tls, r, 0, "renegotiating handshake", LOG_INFO, + LD_HANDSHAKE); +} + /** Shut down an open tls connection tls. When finished, returns * TOR_TLS_DONE. On failure, returns TOR_TLS_ERROR, TOR_TLS_WANTREAD, * or TOR_TLS_WANTWRITE. @@ -1997,7 +2224,6 @@ tor_tls_shutdown(tor_tls_t *tls) char buf[128]; tor_assert(tls); tor_assert(tls->ssl); - check_no_tls_errors(); while (1) { if (tls->state == TOR_TLS_ST_SENTCLOSE) { @@ -2063,48 +2289,28 @@ tor_tls_peer_has_cert(tor_tls_t *tls) return 1; } -/** Return a newly allocated copy of the peer certificate, or NULL if there - * isn't one. */ -MOCK_IMPL(tor_x509_cert_t *, -tor_tls_get_peer_cert,(tor_tls_t *tls)) +/** Return the peer certificate, or NULL if there isn't one. */ +tor_cert_t * +tor_tls_get_peer_cert(tor_tls_t *tls) { X509 *cert; cert = SSL_get_peer_certificate(tls->ssl); tls_log_errors(tls, LOG_WARN, LD_HANDSHAKE, "getting peer certificate"); if (!cert) return NULL; - return tor_x509_cert_new(cert); -} - -/** Return a newly allocated copy of the cerficate we used on the connection, - * or NULL if somehow we didn't use one. */ -MOCK_IMPL(tor_x509_cert_t *, -tor_tls_get_own_cert,(tor_tls_t *tls)) -{ - X509 *cert = SSL_get_certificate(tls->ssl); - tls_log_errors(tls, LOG_WARN, LD_HANDSHAKE, - "getting own-connection certificate"); - if (!cert) - return NULL; - /* Fun inconsistency: SSL_get_peer_certificate increments the reference - * count, but SSL_get_certificate does not. */ - X509 *duplicate = X509_dup(cert); - if (BUG(duplicate == NULL)) - return NULL; - return tor_x509_cert_new(duplicate); + return tor_cert_new(cert); } /** Warn that a certificate lifetime extends through a certain range. */ static void -log_cert_lifetime(int severity, const X509 *cert, const char *problem, - time_t now) +log_cert_lifetime(int severity, const X509 *cert, const char *problem) { BIO *bio = NULL; BUF_MEM *buf; char *s1=NULL, *s2=NULL; char mytime[33]; + time_t now = time(NULL); struct tm tm; - size_t n; if (problem) tor_log(severity, LD_GENERAL, @@ -2115,7 +2321,7 @@ log_cert_lifetime(int severity, const X509 *cert, const char *problem, if (!(bio = BIO_new(BIO_s_mem()))) { log_warn(LD_GENERAL, "Couldn't allocate BIO!"); goto end; } - if (!(ASN1_TIME_print(bio, X509_get_notBefore_const(cert)))) { + if (!(ASN1_TIME_print(bio, X509_get_notBefore(cert)))) { tls_log_errors(NULL, LOG_WARN, LD_NET, "printing certificate lifetime"); goto end; } @@ -2123,24 +2329,18 @@ log_cert_lifetime(int severity, const X509 *cert, const char *problem, s1 = tor_strndup(buf->data, buf->length); (void)BIO_reset(bio); - if (!(ASN1_TIME_print(bio, X509_get_notAfter_const(cert)))) { + if (!(ASN1_TIME_print(bio, X509_get_notAfter(cert)))) { tls_log_errors(NULL, LOG_WARN, LD_NET, "printing certificate lifetime"); goto end; } BIO_get_mem_ptr(bio, &buf); s2 = tor_strndup(buf->data, buf->length); - n = strftime(mytime, 32, "%b %d %H:%M:%S %Y UTC", tor_gmtime_r(&now, &tm)); - if (n > 0) { - tor_log(severity, LD_GENERAL, - "(certificate lifetime runs from %s through %s. Your time is %s.)", - s1,s2,mytime); - } else { - tor_log(severity, LD_GENERAL, - "(certificate lifetime runs from %s through %s. " - "Couldn't get your time.)", - s1, s2); - } + strftime(mytime, 32, "%b %d %H:%M:%S %Y UTC", tor_gmtime_r(&now, &tm)); + + tor_log(severity, LD_GENERAL, + "(certificate lifetime runs from %s through %s. Your time is %s.)", + s1,s2,mytime); end: /* Not expected to get invoked */ @@ -2158,14 +2358,15 @@ log_cert_lifetime(int severity, const X509 *cert, const char *problem, * * Note that a reference is added to cert_out, so it needs to be * freed. id_cert_out doesn't. */ -MOCK_IMPL(STATIC void, -try_to_extract_certs_from_tls,(int severity, tor_tls_t *tls, - X509 **cert_out, X509 **id_cert_out)) +static void +try_to_extract_certs_from_tls(int severity, tor_tls_t *tls, + X509 **cert_out, X509 **id_cert_out) { X509 *cert = NULL, *id_cert = NULL; STACK_OF(X509) *chain = NULL; int num_in_chain, i; *cert_out = *id_cert_out = NULL; + if (!(cert = SSL_get_peer_certificate(tls->ssl))) return; *cert_out = cert; @@ -2203,7 +2404,6 @@ tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_t **identity_key) RSA *rsa; int r = -1; - check_no_tls_errors(); *identity_key = NULL; try_to_extract_certs_from_tls(severity, tls, &cert, &id_cert); @@ -2250,7 +2450,6 @@ tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_t **identity_key) */ int tor_tls_check_lifetime(int severity, tor_tls_t *tls, - time_t now, int past_tolerance, int future_tolerance) { X509 *cert; @@ -2259,7 +2458,7 @@ tor_tls_check_lifetime(int severity, tor_tls_t *tls, if (!(cert = SSL_get_peer_certificate(tls->ssl))) goto done; - if (check_cert_lifetime_internal(severity, cert, now, + if (check_cert_lifetime_internal(severity, cert, past_tolerance, future_tolerance) < 0) goto done; @@ -2275,48 +2474,30 @@ tor_tls_check_lifetime(int severity, tor_tls_t *tls, /** Helper: check whether cert is expired give or take * past_tolerance seconds, or not-yet-valid give or take - * future_tolerance seconds. (Relative to the current time - * now.) If it is live, return 0. If it is not live, log a message - * and return -1. */ + * future_tolerance seconds. If it is live, return 0. If it is not + * live, log a message and return -1. */ static int check_cert_lifetime_internal(int severity, const X509 *cert, - time_t now, int past_tolerance, int future_tolerance) { - time_t t; + time_t now, t; + + now = time(NULL); t = now + future_tolerance; - if (X509_cmp_time(X509_get_notBefore_const(cert), &t) > 0) { - log_cert_lifetime(severity, cert, "not yet valid", now); + if (X509_cmp_time(X509_get_notBefore(cert), &t) > 0) { + log_cert_lifetime(severity, cert, "not yet valid"); return -1; } t = now - past_tolerance; - if (X509_cmp_time(X509_get_notAfter_const(cert), &t) < 0) { - log_cert_lifetime(severity, cert, "already expired", now); + if (X509_cmp_time(X509_get_notAfter(cert), &t) < 0) { + log_cert_lifetime(severity, cert, "already expired"); return -1; } return 0; } -#ifdef TOR_UNIT_TESTS -/* Testing only: return a new x509 cert with the same contents as inp, - but with the expiration time new_expiration_time, signed with - signing_key. */ -STATIC tor_x509_cert_t * -tor_x509_cert_replace_expiration(const tor_x509_cert_t *inp, - time_t new_expiration_time, - crypto_pk_t *signing_key) -{ - X509 *newc = X509_dup(inp->cert); - X509_time_adj(X509_get_notAfter(newc), 0, &new_expiration_time); - EVP_PKEY *pk = crypto_pk_get_evp_pkey_(signing_key, 1); - tor_assert(X509_sign(newc, pk, EVP_sha256())); - EVP_PKEY_free(pk); - return tor_x509_cert_new(newc); -} -#endif /* defined(TOR_UNIT_TESTS) */ - /** Return the number of bytes available for reading from tls. */ int @@ -2342,7 +2523,7 @@ tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written) { BIO *wbio, *tmpbio; unsigned long r, w; - r = (unsigned long) BIO_number_read(SSL_get_rbio(tls->ssl)); + r = BIO_number_read(SSL_get_rbio(tls->ssl)); /* We want the number of bytes actually for real written. Unfortunately, * sometimes OpenSSL replaces the wbio on tls->ssl with a buffering bio, * which makes the answer turn out wrong. Let's cope with that. Note @@ -2351,19 +2532,9 @@ tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written) * save the original BIO for tls->ssl in the tor_tls_t structure, but * that would be tempting fate. */ wbio = SSL_get_wbio(tls->ssl); -#if OPENSSL_VERSION_NUMBER >= OPENSSL_VER(1,1,0,0,5) - /* BIO structure is opaque as of OpenSSL 1.1.0-pre5-dev. Again, not - * supposed to use this form of the version macro, but the OpenSSL developers - * introduced major API changes in the pre-release stage. - */ - if (BIO_method_type(wbio) == BIO_TYPE_BUFFER && - (tmpbio = BIO_next(wbio)) != NULL) - wbio = tmpbio; -#else /* !(OPENSSL_VERSION_NUMBER >= OPENSSL_VER(1,1,0,0,5)) */ if (wbio->method == BIO_f_buffer() && (tmpbio = BIO_next(wbio)) != NULL) wbio = tmpbio; -#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_VER(1,1,0,0,5) */ - w = (unsigned long) BIO_number_written(wbio); + w = BIO_number_written(wbio); /* We are ok with letting these unsigned ints go "negative" here: * If we wrapped around, this should still give us the right answer, unless @@ -2384,8 +2555,8 @@ tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written) /** Return a ratio of the bytes that TLS has sent to the bytes that we've told * it to send. Used to track whether our TLS records are getting too tiny. */ -MOCK_IMPL(double, -tls_get_write_overhead_ratio,(void)) +double +tls_get_write_overhead_ratio(void) { if (total_bytes_written_over_tls == 0) return 1.0; @@ -2411,7 +2582,102 @@ check_no_tls_errors_(const char *fname, int line) int tor_tls_used_v1_handshake(tor_tls_t *tls) { - return ! tls->wasV2Handshake; + if (tls->isServer) { +#ifdef V2_HANDSHAKE_SERVER + return ! tls->wasV2Handshake; +#endif + } else { +#ifdef V2_HANDSHAKE_CLIENT + return ! tls->wasV2Handshake; +#endif + } + return 1; +} + +/** Return true iff name is a DN of a kind that could only + * occur in a v3-handshake-indicating certificate */ +static int +dn_indicates_v3_cert(X509_NAME *name) +{ +#ifdef DISABLE_V3_LINKPROTO_CLIENTSIDE + (void)name; + return 0; +#else + X509_NAME_ENTRY *entry; + int n_entries; + ASN1_OBJECT *obj; + ASN1_STRING *str; + unsigned char *s; + int len, r; + + n_entries = X509_NAME_entry_count(name); + if (n_entries != 1) + return 1; /* More than one entry in the DN. */ + entry = X509_NAME_get_entry(name, 0); + + obj = X509_NAME_ENTRY_get_object(entry); + if (OBJ_obj2nid(obj) != OBJ_txt2nid("commonName")) + return 1; /* The entry isn't a commonName. */ + + str = X509_NAME_ENTRY_get_data(entry); + len = ASN1_STRING_to_UTF8(&s, str); + if (len < 0) + return 0; + r = fast_memneq(s + len - 4, ".net", 4); + OPENSSL_free(s); + return r; +#endif +} + +/** Return true iff the peer certificate we're received on tls + * indicates that this connection should use the v3 (in-protocol) + * authentication handshake. + * + * Only the connection initiator should use this, and only once the initial + * handshake is done; the responder detects a v1 handshake by cipher types, + * and a v3/v2 handshake by Versions cell vs renegotiation. + */ +int +tor_tls_received_v3_certificate(tor_tls_t *tls) +{ + X509 *cert = SSL_get_peer_certificate(tls->ssl); + EVP_PKEY *key = NULL; + X509_NAME *issuer_name, *subject_name; + int is_v3 = 0; + + if (!cert) { + log_warn(LD_BUG, "Called on a connection with no peer certificate"); + goto done; + } + + subject_name = X509_get_subject_name(cert); + issuer_name = X509_get_issuer_name(cert); + + if (X509_name_cmp(subject_name, issuer_name) == 0) { + is_v3 = 1; /* purportedly self signed */ + goto done; + } + + if (dn_indicates_v3_cert(subject_name) || + dn_indicates_v3_cert(issuer_name)) { + is_v3 = 1; /* DN is fancy */ + goto done; + } + + key = X509_get_pubkey(cert); + if (EVP_PKEY_bits(key) != 1024 || + EVP_PKEY_type(key->type) != EVP_PKEY_RSA) { + is_v3 = 1; /* Key is fancy */ + goto done; + } + + done: + if (key) + EVP_PKEY_free(key); + if (cert) + X509_free(cert); + + return is_v3; } /** Return the number of server handshakes that we've noticed doing on @@ -2430,154 +2696,46 @@ tor_tls_server_got_renegotiate(tor_tls_t *tls) return tls->got_renegotiate; } -#ifndef HAVE_SSL_GET_CLIENT_RANDOM -static size_t -SSL_get_client_random(SSL *s, uint8_t *out, size_t len) -{ - if (len == 0) - return SSL3_RANDOM_SIZE; - tor_assert(len == SSL3_RANDOM_SIZE); - tor_assert(s->s3); - memcpy(out, s->s3->client_random, len); - return len; -} -#endif /* !defined(HAVE_SSL_GET_CLIENT_RANDOM) */ - -#ifndef HAVE_SSL_GET_SERVER_RANDOM -static size_t -SSL_get_server_random(SSL *s, uint8_t *out, size_t len) -{ - if (len == 0) - return SSL3_RANDOM_SIZE; - tor_assert(len == SSL3_RANDOM_SIZE); - tor_assert(s->s3); - memcpy(out, s->s3->server_random, len); - return len; -} -#endif /* !defined(HAVE_SSL_GET_SERVER_RANDOM) */ - -#ifndef HAVE_SSL_SESSION_GET_MASTER_KEY -STATIC size_t -SSL_SESSION_get_master_key(SSL_SESSION *s, uint8_t *out, size_t len) -{ - tor_assert(s); - if (len == 0) - return s->master_key_length; - tor_assert(len == (size_t)s->master_key_length); - tor_assert(out); - memcpy(out, s->master_key, len); - return len; -} -#endif /* !defined(HAVE_SSL_SESSION_GET_MASTER_KEY) */ - /** Set the DIGEST256_LEN buffer at secrets_out to the value used in * the v3 handshake to prove that the client knows the TLS secrets for the * connection tls. Return 0 on success, -1 on failure. */ -MOCK_IMPL(int, -tor_tls_get_tlssecrets,(tor_tls_t *tls, uint8_t *secrets_out)) +int +tor_tls_get_tlssecrets(tor_tls_t *tls, uint8_t *secrets_out) { #define TLSSECRET_MAGIC "Tor V3 handshake TLS cross-certification" - uint8_t buf[128]; + char buf[128]; size_t len; tor_assert(tls); - - SSL *const ssl = tls->ssl; - SSL_SESSION *const session = SSL_get_session(ssl); - - tor_assert(ssl); - tor_assert(session); - - const size_t server_random_len = SSL_get_server_random(ssl, NULL, 0); - const size_t client_random_len = SSL_get_client_random(ssl, NULL, 0); - const size_t master_key_len = SSL_SESSION_get_master_key(session, NULL, 0); - - tor_assert(server_random_len); - tor_assert(client_random_len); - tor_assert(master_key_len); - - len = client_random_len + server_random_len + strlen(TLSSECRET_MAGIC) + 1; - tor_assert(len <= sizeof(buf)); - - { - size_t r = SSL_get_client_random(ssl, buf, client_random_len); - tor_assert(r == client_random_len); - } - - { - size_t r = SSL_get_server_random(ssl, - buf+client_random_len, - server_random_len); - tor_assert(r == server_random_len); - } - - uint8_t *master_key = tor_malloc_zero(master_key_len); - { - size_t r = SSL_SESSION_get_master_key(session, master_key, master_key_len); - tor_assert(r == master_key_len); - } - - uint8_t *nextbuf = buf + client_random_len + server_random_len; - memcpy(nextbuf, TLSSECRET_MAGIC, strlen(TLSSECRET_MAGIC) + 1); - + tor_assert(tls->ssl); + tor_assert(tls->ssl->s3); + tor_assert(tls->ssl->session); /* The value is an HMAC, using the TLS master key as the HMAC key, of client_random | server_random | TLSSECRET_MAGIC */ + memcpy(buf + 0, tls->ssl->s3->client_random, 32); + memcpy(buf + 32, tls->ssl->s3->server_random, 32); + memcpy(buf + 64, TLSSECRET_MAGIC, strlen(TLSSECRET_MAGIC) + 1); + len = 64 + strlen(TLSSECRET_MAGIC) + 1; crypto_hmac_sha256((char*)secrets_out, - (char*)master_key, - master_key_len, - (char*)buf, len); + (char*)tls->ssl->session->master_key, + tls->ssl->session->master_key_length, + buf, len); memwipe(buf, 0, sizeof(buf)); - memwipe(master_key, 0, master_key_len); - tor_free(master_key); - return 0; } -/** Using the RFC5705 key material exporting construction, and the - * provided context (context_len bytes long) and - * label (a NUL-terminated string), compute a 32-byte secret in - * secrets_out that only the parties to this TLS session can - * compute. Return 0 on success and -1 on failure. - */ -MOCK_IMPL(int, -tor_tls_export_key_material,(tor_tls_t *tls, uint8_t *secrets_out, - const uint8_t *context, - size_t context_len, - const char *label)) -{ - tor_assert(tls); - tor_assert(tls->ssl); - - int r = SSL_export_keying_material(tls->ssl, - secrets_out, DIGEST256_LEN, - label, strlen(label), - context, context_len, 1); - return (r == 1) ? 0 : -1; -} - /** Examine the amount of memory used and available for buffers in tls. * Set *rbuf_capacity to the amount of storage allocated for the read * buffer and *rbuf_bytes to the amount actually used. * Set *wbuf_capacity to the amount of storage allocated for the write - * buffer and *wbuf_bytes to the amount actually used. - * - * Return 0 on success, -1 on failure.*/ -int + * buffer and *wbuf_bytes to the amount actually used. */ +void tor_tls_get_buffer_sizes(tor_tls_t *tls, size_t *rbuf_capacity, size_t *rbuf_bytes, size_t *wbuf_capacity, size_t *wbuf_bytes) { -#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) - (void)tls; - (void)rbuf_capacity; - (void)rbuf_bytes; - (void)wbuf_capacity; - (void)wbuf_bytes; - - return -1; -#else /* !(OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0)) */ if (tls->ssl->s3->rbuf.buf) *rbuf_capacity = tls->ssl->s3->rbuf.len; else @@ -2588,33 +2746,77 @@ tor_tls_get_buffer_sizes(tor_tls_t *tls, *wbuf_capacity = 0; *rbuf_bytes = tls->ssl->s3->rbuf.left; *wbuf_bytes = tls->ssl->s3->wbuf.left; - return 0; -#endif /* OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) */ } -/** Check whether the ECC group requested is supported by the current OpenSSL - * library instance. Return 1 if the group is supported, and 0 if not. +#ifdef USE_BUFFEREVENTS +/** Construct and return an TLS-encrypting bufferevent to send data over + * socket, which must match the socket of the underlying bufferevent + * bufev_in. The TLS object tls is used for encryption. + * + * This function will either create a filtering bufferevent that wraps around + * bufev_in, or it will free bufev_in and return a new bufferevent that + * uses the tls to talk to the network directly. Do not use + * bufev_in after calling this function. + * + * The connection will start out doing a server handshake if receiving + * is strue, and a client handshake otherwise. + * + * Returns NULL on failure. */ -int -evaluate_ecgroup_for_tls(const char *ecgroup) -{ - EC_KEY *ec_key; - int nid; - int ret; - - if (!ecgroup) - nid = NID_tor_default_ecdhe_group; - else if (!strcasecmp(ecgroup, "P256")) - nid = NID_X9_62_prime256v1; - else if (!strcasecmp(ecgroup, "P224")) - nid = NID_secp224r1; - else - return 0; +struct bufferevent * +tor_tls_init_bufferevent(tor_tls_t *tls, struct bufferevent *bufev_in, + evutil_socket_t socket, int receiving, + int filter) +{ + struct bufferevent *out; + const enum bufferevent_ssl_state state = receiving ? + BUFFEREVENT_SSL_ACCEPTING : BUFFEREVENT_SSL_CONNECTING; + + if (filter || tor_libevent_using_iocp_bufferevents()) { + /* Grab an extra reference to the SSL, since BEV_OPT_CLOSE_ON_FREE + means that the SSL will get freed too. + + This increment makes our SSL usage not-threadsafe, BTW. We should + see if we're allowed to use CRYPTO_add from outside openssl. */ + tls->ssl->references += 1; + out = bufferevent_openssl_filter_new(tor_libevent_get_base(), + bufev_in, + tls->ssl, + state, + BEV_OPT_DEFER_CALLBACKS| + BEV_OPT_CLOSE_ON_FREE); + /* Tell the underlying bufferevent when to accept more data from the SSL + filter (only when it's got less than 32K to write), and when to notify + the SSL filter that it could write more (when it drops under 24K). */ + bufferevent_setwatermark(bufev_in, EV_WRITE, 24*1024, 32*1024); + } else { + if (bufev_in) { + evutil_socket_t s = bufferevent_getfd(bufev_in); + tor_assert(s == -1 || s == socket); + tor_assert(evbuffer_get_length(bufferevent_get_input(bufev_in)) == 0); + tor_assert(evbuffer_get_length(bufferevent_get_output(bufev_in)) == 0); + tor_assert(BIO_number_read(SSL_get_rbio(tls->ssl)) == 0); + tor_assert(BIO_number_written(SSL_get_rbio(tls->ssl)) == 0); + bufferevent_free(bufev_in); + } - ec_key = EC_KEY_new_by_curve_name(nid); - ret = (ec_key != NULL); - EC_KEY_free(ec_key); + /* Current versions (as of 2.0.x) of Libevent need to defer + * bufferevent_openssl callbacks, or else our callback functions will + * get called reentrantly, which is bad for us. + */ + out = bufferevent_openssl_socket_new(tor_libevent_get_base(), + socket, + tls->ssl, + state, + BEV_OPT_DEFER_CALLBACKS); + } + tls->state = TOR_TLS_ST_BUFFEREVENT; - return ret; + /* Unblock _after_ creating the bufferevent, since accept/connect tend to + * clear flags. */ + tor_tls_unblock_renegotiation(tls); + + return out; } +#endif diff --git a/src/tor/tortls.h b/src/tor/tortls.h new file mode 100644 index 000000000..df9184ebd --- /dev/null +++ b/src/tor/tortls.h @@ -0,0 +1,142 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TORTLS_H +#define TOR_TORTLS_H + +/** + * \file tortls.h + * \brief Headers for tortls.c + **/ + +#include "crypto.h" +#include "tor_compat.h" + +/* Opaque structure to hold a TLS connection. */ +typedef struct tor_tls_t tor_tls_t; + +/* Opaque structure to hold an X509 certificate. */ +typedef struct tor_cert_t tor_cert_t; + +/* Possible return values for most tor_tls_* functions. */ +#define MIN_TOR_TLS_ERROR_VAL_ -9 +#define TOR_TLS_ERROR_MISC -9 +/* Rename to unexpected close or something. XXXX */ +#define TOR_TLS_ERROR_IO -8 +#define TOR_TLS_ERROR_CONNREFUSED -7 +#define TOR_TLS_ERROR_CONNRESET -6 +#define TOR_TLS_ERROR_NO_ROUTE -5 +#define TOR_TLS_ERROR_TIMEOUT -4 +#define TOR_TLS_CLOSE -3 +#define TOR_TLS_WANTREAD -2 +#define TOR_TLS_WANTWRITE -1 +#define TOR_TLS_DONE 0 + +/** Collection of case statements for all TLS errors that are not due to + * underlying IO failure. */ +#define CASE_TOR_TLS_ERROR_ANY_NONIO \ + case TOR_TLS_ERROR_MISC: \ + case TOR_TLS_ERROR_CONNREFUSED: \ + case TOR_TLS_ERROR_CONNRESET: \ + case TOR_TLS_ERROR_NO_ROUTE: \ + case TOR_TLS_ERROR_TIMEOUT + +/** Use this macro in a switch statement to catch _any_ TLS error. That way, + * if more errors are added, your switches will still work. */ +#define CASE_TOR_TLS_ERROR_ANY \ + CASE_TOR_TLS_ERROR_ANY_NONIO: \ + case TOR_TLS_ERROR_IO + +#define TOR_TLS_IS_ERROR(rv) ((rv) < TOR_TLS_CLOSE) +const char *tor_tls_err_to_string(int err); +void tor_tls_get_state_description(tor_tls_t *tls, char *buf, size_t sz); + +void tor_tls_free_all(void); + +#define TOR_TLS_CTX_IS_PUBLIC_SERVER (1u<<0) +#define TOR_TLS_CTX_USE_ECDHE_P256 (1u<<1) +#define TOR_TLS_CTX_USE_ECDHE_P224 (1u<<2) + +int tor_tls_context_init(unsigned flags, + crypto_pk_t *client_identity, + crypto_pk_t *server_identity, + unsigned int key_lifetime); +tor_tls_t *tor_tls_new(int sock, int is_server); +void tor_tls_set_logged_address(tor_tls_t *tls, const char *address); +void tor_tls_set_renegotiate_callback(tor_tls_t *tls, + void (*cb)(tor_tls_t *, void *arg), + void *arg); +int tor_tls_is_server(tor_tls_t *tls); +void tor_tls_free(tor_tls_t *tls); +int tor_tls_peer_has_cert(tor_tls_t *tls); +tor_cert_t *tor_tls_get_peer_cert(tor_tls_t *tls); +int tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_t **identity); +int tor_tls_check_lifetime(int severity, + tor_tls_t *tls, int past_tolerance, + int future_tolerance); +int tor_tls_read(tor_tls_t *tls, char *cp, size_t len); +int tor_tls_write(tor_tls_t *tls, const char *cp, size_t n); +int tor_tls_handshake(tor_tls_t *tls); +int tor_tls_finish_handshake(tor_tls_t *tls); +int tor_tls_renegotiate(tor_tls_t *tls); +void tor_tls_unblock_renegotiation(tor_tls_t *tls); +void tor_tls_block_renegotiation(tor_tls_t *tls); +void tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls); +int tor_tls_shutdown(tor_tls_t *tls); +int tor_tls_get_pending_bytes(tor_tls_t *tls); +size_t tor_tls_get_forced_write_size(tor_tls_t *tls); + +void tor_tls_get_n_raw_bytes(tor_tls_t *tls, + size_t *n_read, size_t *n_written); + +void tor_tls_get_buffer_sizes(tor_tls_t *tls, + size_t *rbuf_capacity, size_t *rbuf_bytes, + size_t *wbuf_capacity, size_t *wbuf_bytes); + +double tls_get_write_overhead_ratio(void); + +int tor_tls_used_v1_handshake(tor_tls_t *tls); +int tor_tls_received_v3_certificate(tor_tls_t *tls); +int tor_tls_get_num_server_handshakes(tor_tls_t *tls); +int tor_tls_server_got_renegotiate(tor_tls_t *tls); +int tor_tls_get_tlssecrets(tor_tls_t *tls, uint8_t *secrets_out); + +/* Log and abort if there are unhandled TLS errors in OpenSSL's error stack. + */ +#define check_no_tls_errors() check_no_tls_errors_(__FILE__,__LINE__) + +void check_no_tls_errors_(const char *fname, int line); +void tor_tls_log_one_error(tor_tls_t *tls, unsigned long err, + int severity, int domain, const char *doing); + +#ifdef USE_BUFFEREVENTS +int tor_tls_start_renegotiating(tor_tls_t *tls); +struct bufferevent *tor_tls_init_bufferevent(tor_tls_t *tls, + struct bufferevent *bufev_in, + evutil_socket_t socket, int receiving, + int filter); +#endif + +void tor_cert_free(tor_cert_t *cert); +tor_cert_t *tor_cert_decode(const uint8_t *certificate, + size_t certificate_len); +void tor_cert_get_der(const tor_cert_t *cert, + const uint8_t **encoded_out, size_t *size_out); +const digests_t *tor_cert_get_id_digests(const tor_cert_t *cert); +const digests_t *tor_cert_get_cert_digests(const tor_cert_t *cert); +int tor_tls_get_my_certs(int server, + const tor_cert_t **link_cert_out, + const tor_cert_t **id_cert_out); +crypto_pk_t *tor_tls_get_my_client_auth_key(void); +crypto_pk_t *tor_tls_cert_get_key(tor_cert_t *cert); +int tor_tls_cert_matches_key(const tor_tls_t *tls, const tor_cert_t *cert); +int tor_tls_cert_is_valid(int severity, + const tor_cert_t *cert, + const tor_cert_t *signing_cert, + int check_rsa_1024); +const char *tor_tls_get_ciphersuite_name(tor_tls_t *tls); + +#endif + diff --git a/src/tor/src/or/transports.c b/src/tor/transports.c similarity index 86% rename from src/tor/src/or/transports.c rename to src/tor/transports.c index 1e6307b7d..90323c284 100644 --- a/src/tor/src/or/transports.c +++ b/src/tor/transports.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2017, The Tor Project, Inc. */ +/* Copyright (c) 2011-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -51,37 +51,35 @@ * logic, because of race conditions that can cause dangling * pointers. ] * - * In even more detail, this is what happens when a config read - * (like a SIGHUP or a SETCONF) occurs: + * In even more detail, this is what happens when a SIGHUP + * occurs: * * We immediately destroy all unconfigured proxies (We shouldn't have - * unconfigured proxies in the first place, except when the config - * read happens immediately after tor is launched.). + * unconfigured proxies in the first place, except when SIGHUP rings + * immediately after tor is launched.). * * We mark all managed proxies and transports to signify that they * must be removed if they don't contribute by the new torrc * (we mark using the marked_for_removal element). * We also mark all managed proxies to signify that they might need to * be restarted so that they end up supporting all the transports the - * new torrc wants them to support - * (we mark using the was_around_before_config_read element). + * new torrc wants them to support (using the got_hup element). * We also clear their transports_to_launch list so that we can * put there the transports we need to launch according to the new * torrc. * * We then start parsing torrc again. * - * Everytime we encounter a transport line using a managed proxy that - * was around before the config read, we cleanse that proxy from the - * removal mark. We also toggle the check_if_restarts_needed - * flag, so that on the next pt_configure_remaining_proxies - * tick, we investigate whether we need to restart the proxy so that - * it also spawns the new transports. If the post-config-read - * transports_to_launch list is identical to the pre-config-read - * one, it means that no changes were introduced to this proxy during - * the config read and no restart has to take place. + * Everytime we encounter a transport line using a known pre-SIGHUP + * managed proxy, we cleanse that proxy from the removal mark. + * We also mark it as unconfigured so that on the next scheduled + * events tick, we investigate whether we need to restart the proxy + * so that it also spawns the new transports. + * If the post-SIGHUP transports_to_launch list is identical to + * the pre-SIGHUP one, it means that no changes were introduced to + * this proxy during the SIGHUP and no restart has to take place. * - * During the post-config-read torrc parsing, we unmark all transports + * During the post-SIGHUP torrc parsing, we unmark all transports * spawned by managed proxies that we find in our torrc. * We do that so that if we don't need to restart a managed proxy, we * can continue using its old transports normally. @@ -91,13 +89,13 @@ #define PT_PRIVATE #include "or.h" -#include "bridges.h" #include "config.h" #include "circuitbuild.h" #include "transports.h" -#include "util.h" +#include "tor_util.h" #include "router.h" #include "statefile.h" +#include "entrynodes.h" #include "connection_or.h" #include "ext_orport.h" #include "control.h" @@ -105,13 +103,15 @@ static process_environment_t * create_managed_proxy_environment(const managed_proxy_t *mp); -static inline int proxy_configuration_finished(const managed_proxy_t *mp); +static INLINE int proxy_configuration_finished(const managed_proxy_t *mp); static void handle_finished_proxy(managed_proxy_t *mp); static void parse_method_error(const char *line, int is_server_method); #define parse_server_method_error(l) parse_method_error(l, 1) #define parse_client_method_error(l) parse_method_error(l, 0) +static INLINE void free_execve_args(char **arg); + /** Managed proxy protocol strings */ #define PROTO_ENV_ERROR "ENV-ERROR" #define PROTO_NEG_SUCCESS "VERSION" @@ -122,8 +122,6 @@ static void parse_method_error(const char *line, int is_server_method); #define PROTO_SMETHOD_ERROR "SMETHOD-ERROR" #define PROTO_CMETHODS_DONE "CMETHODS DONE" #define PROTO_SMETHODS_DONE "SMETHODS DONE" -#define PROTO_PROXY_DONE "PROXY DONE" -#define PROTO_PROXY_ERROR "PROXY-ERROR" /** The first and only supported - at the moment - configuration protocol version. */ @@ -154,7 +152,7 @@ transport_new(const tor_addr_t *addr, uint16_t port, /** Free the pluggable transport struct transport. */ void -transport_free_(transport_t *transport) +transport_free(transport_t *transport) { if (!transport) return; @@ -324,9 +322,9 @@ transport_add(transport_t *t) /** Remember a new pluggable transport proxy at addr:port. * name is set to the name of the protocol this proxy uses. * socks_ver is set to the SOCKS version of the proxy. */ -MOCK_IMPL(int, -transport_add_from_config, (const tor_addr_t *addr, uint16_t port, - const char *name, int socks_ver)) +int +transport_add_from_config(const tor_addr_t *addr, uint16_t port, + const char *name, int socks_ver) { transport_t *t = transport_new(addr, port, name, socks_ver, NULL); @@ -430,7 +428,7 @@ add_transport_to_proxy(const char *transport, managed_proxy_t *mp) { tor_assert(mp->transports_to_launch); if (!smartlist_contains_string(mp->transports_to_launch, transport)) - smartlist_add_strdup(mp->transports_to_launch, transport); + smartlist_add(mp->transports_to_launch, tor_strdup(transport)); } /** Called when a SIGHUP occurs. Returns true if managed proxy @@ -439,17 +437,6 @@ add_transport_to_proxy(const char *transport, managed_proxy_t *mp) static int proxy_needs_restart(const managed_proxy_t *mp) { - int ret = 1; - char* proxy_uri; - - /* If the PT proxy config has changed, then all existing pluggable transports - * should be restarted. - */ - - proxy_uri = get_pt_proxy_uri(); - if (strcmp_opt(proxy_uri, mp->proxy_uri) != 0) - goto needs_restart; - /* mp->transport_to_launch is populated with the names of the transports that must be launched *after* the SIGHUP. mp->transports is populated with the transports that were @@ -470,16 +457,17 @@ proxy_needs_restart(const managed_proxy_t *mp) } SMARTLIST_FOREACH_END(t); - ret = 0; + return 0; + needs_restart: - tor_free(proxy_uri); - return ret; + return 1; } /** Managed proxy mp must be restarted. Do all the necessary * preparations and then flag its state so that it will be relaunched * in the next tick. */ static void + proxy_prepare_for_restart(managed_proxy_t *mp) { transport_t *t_tmp = NULL; @@ -503,11 +491,6 @@ proxy_prepare_for_restart(managed_proxy_t *mp) SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t)); smartlist_clear(mp->transports); - /* Reset the proxy's HTTPS/SOCKS proxy */ - tor_free(mp->proxy_uri); - mp->proxy_uri = get_pt_proxy_uri(); - mp->proxy_supported = 0; - /* flag it as an infant proxy so that it gets launched on next tick */ mp->conf_state = PT_PROTO_INFANT; unconfigured_proxies_n++; @@ -527,12 +510,12 @@ launch_managed_proxy(managed_proxy_t *mp) (const char **)mp->argv, env, &mp->process_handle); -#else /* !(defined(_WIN32)) */ +#else retval = tor_spawn_background(mp->argv[0], (const char **)mp->argv, env, &mp->process_handle); -#endif /* defined(_WIN32) */ +#endif process_environment_free(env); @@ -551,7 +534,8 @@ launch_managed_proxy(managed_proxy_t *mp) } /** Check if any of the managed proxies we are currently trying to - * configure has anything new to say. */ + * configure have anything new to say. This is called from + * run_scheduled_events(). */ void pt_configure_remaining_proxies(void) { @@ -571,12 +555,11 @@ pt_configure_remaining_proxies(void) tor_assert(mp->conf_state != PT_PROTO_BROKEN && mp->conf_state != PT_PROTO_FAILED_LAUNCH); - if (mp->was_around_before_config_read) { - /* This proxy is marked by a config read. Check whether we need - to restart it. */ - - mp->was_around_before_config_read = 0; + if (mp->got_hup) { + mp->got_hup = 0; + /* This proxy is marked by a SIGHUP. Check whether we need to + restart it. */ if (proxy_needs_restart(mp)) { log_info(LD_GENERAL, "Preparing managed proxy '%s' for restart.", mp->argv[0]); @@ -712,7 +695,7 @@ register_client_proxy(const managed_proxy_t *mp) } /** Register the transports of managed proxy mp. */ -static inline void +static INLINE void register_proxy(const managed_proxy_t *mp) { if (mp->is_server) @@ -742,54 +725,12 @@ managed_proxy_destroy(managed_proxy_t *mp, /* free the argv */ free_execve_args(mp->argv); - /* free the outgoing proxy URI */ - tor_free(mp->proxy_uri); - tor_process_handle_destroy(mp->process_handle, also_terminate_process); mp->process_handle = NULL; tor_free(mp); } -/** Convert the tor proxy options to a URI suitable for TOR_PT_PROXY. - * Return a newly allocated string containing the URI, or NULL if no - * proxy is set. */ -STATIC char * -get_pt_proxy_uri(void) -{ - const or_options_t *options = get_options(); - char *uri = NULL; - - if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) { - char addr[TOR_ADDR_BUF_LEN+1]; - - if (options->Socks4Proxy) { - tor_addr_to_str(addr, &options->Socks4ProxyAddr, sizeof(addr), 1); - tor_asprintf(&uri, "socks4a://%s:%d", addr, options->Socks4ProxyPort); - } else if (options->Socks5Proxy) { - tor_addr_to_str(addr, &options->Socks5ProxyAddr, sizeof(addr), 1); - if (!options->Socks5ProxyUsername && !options->Socks5ProxyPassword) { - tor_asprintf(&uri, "socks5://%s:%d", addr, options->Socks5ProxyPort); - } else { - tor_asprintf(&uri, "socks5://%s:%s@%s:%d", - options->Socks5ProxyUsername, - options->Socks5ProxyPassword, - addr, options->Socks5ProxyPort); - } - } else if (options->HTTPSProxy) { - tor_addr_to_str(addr, &options->HTTPSProxyAddr, sizeof(addr), 1); - if (!options->HTTPSProxyAuthenticator) { - tor_asprintf(&uri, "http://%s:%d", addr, options->HTTPSProxyPort); - } else { - tor_asprintf(&uri, "http://%s@%s:%d", options->HTTPSProxyAuthenticator, - addr, options->HTTPSProxyPort); - } - } - } - - return uri; -} - /** Handle a configured or broken managed proxy mp. */ static void handle_finished_proxy(managed_proxy_t *mp) @@ -802,13 +743,6 @@ handle_finished_proxy(managed_proxy_t *mp) managed_proxy_destroy(mp, 0); /* destroy it but don't terminate */ break; case PT_PROTO_CONFIGURED: /* if configured correctly: */ - if (mp->proxy_uri && !mp->proxy_supported) { - log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the " - "specified outgoing proxy and will be terminated.", - mp->argv[0]); - managed_proxy_destroy(mp, 1); /* annihilate it. */ - break; - } register_proxy(mp); /* register its transports */ mp->conf_state = PT_PROTO_COMPLETED; /* and mark it as completed. */ break; @@ -827,7 +761,7 @@ handle_finished_proxy(managed_proxy_t *mp) /** Return true if the configuration of the managed proxy mp is finished. */ -static inline int +static INLINE int proxy_configuration_finished(const managed_proxy_t *mp) { return (mp->conf_state == PT_PROTO_CONFIGURED || @@ -926,22 +860,6 @@ handle_proxy_line(const char *line, managed_proxy_t *mp) goto err; return; - } else if (!strcmpstart(line, PROTO_PROXY_DONE)) { - if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS) - goto err; - - if (mp->proxy_uri) { - mp->proxy_supported = 1; - return; - } - - /* No proxy was configured, this should log */ - } else if (!strcmpstart(line, PROTO_PROXY_ERROR)) { - if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS) - goto err; - - parse_proxy_error(line); - goto err; } else if (!strcmpstart(line, SPAWN_ERROR_MESSAGE)) { /* managed proxy launch failed: parse error message to learn why. */ int retval, child_state, saved_errno; @@ -1094,10 +1012,12 @@ parse_smethod_line(const char *line, managed_proxy_t *mp) transport = transport_new(&tor_addr, port, method_name, PROXY_NONE, args_string); + if (!transport) + goto err; smartlist_add(mp->transports, transport); - /* For now, notify the user so that they know where the server + /* For now, notify the user so that he knows where the server transport is listening. */ log_info(LD_CONFIG, "Server transport %s at %s:%d.", method_name, address, (int)port); @@ -1184,6 +1104,8 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp) } transport = transport_new(&tor_addr, port, method_name, socks_ver, NULL); + if (!transport) + goto err; smartlist_add(mp->transports, transport); @@ -1204,21 +1126,6 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp) return r; } -/** Parses an PROXY-ERROR line and warns the user accordingly. */ -STATIC void -parse_proxy_error(const char *line) -{ - /* (Length of the protocol string) plus (a space) and (the first char of - the error message) */ - if (strlen(line) < (strlen(PROTO_PROXY_ERROR) + 2)) - log_notice(LD_CONFIG, "Managed proxy sent us an %s without an error " - "message.", PROTO_PROXY_ERROR); - - log_warn(LD_CONFIG, "Managed proxy failed to configure the " - "pluggable transport's outgoing proxy. (%s)", - line+strlen(PROTO_PROXY_ERROR)+1); -} - /** Return a newly allocated string that tor should place in * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server * manged proxy in mp. Return NULL if no such options are found. */ @@ -1265,7 +1172,7 @@ get_transport_options_for_server_proxy(const managed_proxy_t *mp) /** Return the string that tor should place in TOR_PT_SERVER_BINDADDR * while configuring the server managed proxy in mp. The - * string is stored in the heap, and it's the responsibility of + * string is stored in the heap, and it's the the responsibility of * the caller to deallocate it after its use. */ static char * get_bindaddr_for_server_proxy(const managed_proxy_t *mp) @@ -1317,7 +1224,7 @@ create_managed_proxy_environment(const managed_proxy_t *mp) tor_free(state_tmp); } - smartlist_add_strdup(envs, "TOR_PT_MANAGED_TRANSPORT_VER=1"); + smartlist_add(envs, tor_strdup("TOR_PT_MANAGED_TRANSPORT_VER=1")); { char *transports_to_launch = @@ -1336,10 +1243,8 @@ create_managed_proxy_environment(const managed_proxy_t *mp) { char *orport_tmp = get_first_listener_addrport_string(CONN_TYPE_OR_LISTENER); - if (orport_tmp) { - smartlist_add_asprintf(envs, "TOR_PT_ORPORT=%s", orport_tmp); - tor_free(orport_tmp); - } + smartlist_add_asprintf(envs, "TOR_PT_ORPORT=%s", orport_tmp); + tor_free(orport_tmp); } { @@ -1358,7 +1263,7 @@ create_managed_proxy_environment(const managed_proxy_t *mp) } } - /* XXXX Remove the '=' here once versions of obfsproxy which + /* XXX024 Remove the '=' here once versions of obfsproxy which * assert that this env var exists are sufficiently dead. * * (If we remove this line entirely, some joker will stick this @@ -1370,10 +1275,8 @@ create_managed_proxy_environment(const managed_proxy_t *mp) get_first_listener_addrport_string(CONN_TYPE_EXT_OR_LISTENER); char *cookie_file_loc = get_ext_or_auth_cookie_file_name(); - if (ext_or_addrport_tmp) { - smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=%s", - ext_or_addrport_tmp); - } + smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=%s", + ext_or_addrport_tmp); smartlist_add_asprintf(envs, "TOR_PT_AUTH_COOKIE_FILE=%s", cookie_file_loc); @@ -1383,19 +1286,6 @@ create_managed_proxy_environment(const managed_proxy_t *mp) } else { smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT="); } - - /* All new versions of tor will keep stdin open, so PTs can use it - * as a reliable termination detection mechanism. - */ - smartlist_add_asprintf(envs, "TOR_PT_EXIT_ON_STDIN_CLOSE=1"); - } else { - /* If ClientTransportPlugin has a HTTPS/SOCKS proxy configured, set the - * TOR_PT_PROXY line. - */ - - if (mp->proxy_uri) { - smartlist_add_asprintf(envs, "TOR_PT_PROXY=%s", mp->proxy_uri); - } } SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) { @@ -1420,7 +1310,7 @@ create_managed_proxy_environment(const managed_proxy_t *mp) * * Requires that proxy_argv have at least one element. */ STATIC managed_proxy_t * -managed_proxy_create(const smartlist_t *with_transport_list, +managed_proxy_create(const smartlist_t *transport_list, char **proxy_argv, int is_server) { managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t)); @@ -1428,10 +1318,9 @@ managed_proxy_create(const smartlist_t *with_transport_list, mp->is_server = is_server; mp->argv = proxy_argv; mp->transports = smartlist_new(); - mp->proxy_uri = get_pt_proxy_uri(); mp->transports_to_launch = smartlist_new(); - SMARTLIST_FOREACH(with_transport_list, const char *, transport, + SMARTLIST_FOREACH(transport_list, const char *, transport, add_transport_to_proxy(transport, mp)); /* register the managed proxy */ @@ -1454,9 +1343,9 @@ managed_proxy_create(const smartlist_t *with_transport_list, * Requires that proxy_argv be a NULL-terminated array of command-line * elements, containing at least one element. **/ -MOCK_IMPL(void, -pt_kickstart_proxy, (const smartlist_t *with_transport_list, - char **proxy_argv, int is_server)) +void +pt_kickstart_proxy(const smartlist_t *transport_list, + char **proxy_argv, int is_server) { managed_proxy_t *mp=NULL; transport_t *old_transport = NULL; @@ -1468,31 +1357,30 @@ pt_kickstart_proxy, (const smartlist_t *with_transport_list, mp = get_managed_proxy_by_argv_and_type(proxy_argv, is_server); if (!mp) { /* we haven't seen this proxy before */ - managed_proxy_create(with_transport_list, proxy_argv, is_server); + managed_proxy_create(transport_list, proxy_argv, is_server); } else { /* known proxy. add its transport to its transport list */ - if (mp->was_around_before_config_read) { - /* If this managed proxy was around even before we read the - config this time, it means that it was already enabled before - and is not useless and should be kept. If it's marked for - removal, unmark it and make sure that we check whether it - needs to be restarted. */ + if (mp->got_hup) { + /* If the managed proxy we found is marked by a SIGHUP, it means + that it's not useless and should be kept. If it's marked for + removal, unmark it and increase the unconfigured proxies so + that we try to restart it if we need to. Afterwards, check if + a transport_t for 'transport' used to exist before the SIGHUP + and make sure it doesn't get deleted because we might reuse + it. */ if (mp->marked_for_removal) { mp->marked_for_removal = 0; check_if_restarts_needed = 1; } - /* For each new transport, check if the managed proxy used to - support it before the SIGHUP. If that was the case, make sure - it doesn't get removed because we might reuse it. */ - SMARTLIST_FOREACH_BEGIN(with_transport_list, const char *, transport) { + SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport) { old_transport = transport_get_by_name(transport); if (old_transport) old_transport->marked_for_removal = 0; } SMARTLIST_FOREACH_END(transport); } - SMARTLIST_FOREACH(with_transport_list, const char *, transport, + SMARTLIST_FOREACH(transport_list, const char *, transport, add_transport_to_proxy(transport, mp)); free_execve_args(proxy_argv); } @@ -1500,7 +1388,7 @@ pt_kickstart_proxy, (const smartlist_t *with_transport_list, /** Frees the array of pointers in arg used as arguments to execve(2). */ -STATIC void +static INLINE void free_execve_args(char **arg) { char **tmp = arg; @@ -1533,10 +1421,8 @@ pt_prepare_proxy_list_for_config_read(void) tor_assert(mp->conf_state == PT_PROTO_COMPLETED); - /* Mark all proxies for removal, and also note that they have been - here before the config read. */ mp->marked_for_removal = 1; - mp->was_around_before_config_read = 1; + mp->got_hup = 1; SMARTLIST_FOREACH(mp->transports_to_launch, char *, t, tor_free(t)); smartlist_clear(mp->transports_to_launch); } SMARTLIST_FOREACH_END(mp); @@ -1606,7 +1492,7 @@ pt_get_extra_info_descriptor_string(void) uint32_t external_ip_address = 0; if (tor_addr_is_null(&t->addr) && router_pick_published_address(get_options(), - &external_ip_address, 0) >= 0) { + &external_ip_address) >= 0) { tor_addr_t addr; tor_addr_from_ipv4h(&addr, external_ip_address); addrport = fmt_addrport(&addr, t->port); diff --git a/src/tor/src/or/transports.h b/src/tor/transports.h similarity index 82% rename from src/tor/src/or/transports.h rename to src/tor/transports.h index 1b2786472..7b524f207 100644 --- a/src/tor/src/or/transports.h +++ b/src/tor/transports.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2017, The Tor Project, Inc. */ + * Copyright (c) 2007-2013, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,17 +32,14 @@ typedef struct transport_t { void mark_transport_list(void); void sweep_transport_list(void); -MOCK_DECL(int, transport_add_from_config, - (const tor_addr_t *addr, uint16_t port, - const char *name, int socks_ver)); -void transport_free_(transport_t *transport); -#define transport_free(tr) FREE_AND_NULL(transport_t, transport_free_, (tr)) +int transport_add_from_config(const tor_addr_t *addr, uint16_t port, + const char *name, int socks_ver); +void transport_free(transport_t *transport); transport_t *transport_get_by_name(const char *name); -MOCK_DECL(void, pt_kickstart_proxy, - (const smartlist_t *transport_list, char **proxy_argv, - int is_server)); +void pt_kickstart_proxy(const smartlist_t *transport_list, char **proxy_argv, + int is_server); #define pt_kickstart_client_proxy(tl, pa) \ pt_kickstart_proxy(tl, pa, 0) @@ -84,9 +81,6 @@ typedef struct { char **argv; /* the cli arguments of this proxy */ int conf_protocol; /* the configuration protocol version used */ - char *proxy_uri; /* the outgoing proxy in TOR_PT_PROXY URI format */ - unsigned int proxy_supported : 1; /* the proxy honors TOR_PT_PROXY */ - int is_server; /* is it a server proxy? */ /* A pointer to the process handle of this managed proxy. */ @@ -103,7 +97,7 @@ typedef struct { * this flag to signify that this proxy might need to be restarted * so that it can listen for other transports according to the new * torrc. */ - unsigned int was_around_before_config_read : 1; + unsigned int got_hup : 1; /* transports to-be-launched by this proxy */ smartlist_t *transports_to_launch; @@ -118,7 +112,6 @@ STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp); STATIC int parse_version(const char *line, managed_proxy_t *mp); STATIC void parse_env_error(const char *line); -STATIC void parse_proxy_error(const char *line); STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp); STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp); @@ -130,11 +123,7 @@ STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list, STATIC int configure_proxy(managed_proxy_t *mp); -STATIC char* get_pt_proxy_uri(void); - -STATIC void free_execve_args(char **arg); - -#endif /* defined(PT_PRIVATE) */ +#endif -#endif /* !defined(TOR_TRANSPORTS_H) */ +#endif diff --git a/src/tor/util_codedigest.c b/src/tor/util_codedigest.c new file mode 100644 index 000000000..f81b1c8ea --- /dev/null +++ b/src/tor/util_codedigest.c @@ -0,0 +1,13 @@ + +#include "tor_util.h" + +/** Return a string describing the digest of the source files in src/common/ + */ +const char * +libor_get_digests(void) +{ + return "" +#include "common_sha1.i" + ; +} + From a0da447f3b539a55d03ab1626d0fdb7c346dc979 Mon Sep 17 00:00:00 2001 From: sunerok Date: Sun, 31 Dec 2017 02:39:24 -0500 Subject: [PATCH 02/54] updates to tor --- src/net.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/net.cpp b/src/net.cpp index 12516e86c..8b09492b8 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -28,7 +28,9 @@ using namespace std; using namespace boost; -extern "C" { int tor_main(int argc, char *argv[]); } +extern "C" { + int tor_main(int argc, char *argv[]); +} static const int MAX_OUTBOUND_CONNECTIONS = 16; @@ -53,6 +55,7 @@ struct LocalServiceInfo { // Global state variables // bool fClient = false; +bool fDiscover = true; bool fUseUPnP = false; uint64 nLocalServices = (fClient ? 0 : NODE_NETWORK); static CCriticalSection cs_mapLocalHost; From a2599d1ea65ec3c7e4401249d7d0728d7268f2ba Mon Sep 17 00:00:00 2001 From: sunerok Date: Tue, 2 Jan 2018 02:57:24 -0500 Subject: [PATCH 03/54] tor source --- src/Makefile.am | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index c4cfcd9e8..1154781d3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -210,6 +210,83 @@ libbitcoin_common_a_SOURCES = \ Sponge.c \ sph_sha2big.c \ xxhash/xxhash.c \ + tor/anonymize.cpp \ + tor/address.c \ + tor/addressmap.c \ + tor/aes.c \ + tor/backtrace.c \ + tor/buffers.c \ + tor/channel.c \ + tor/channeltls.c \ + tor/circpathbias.c \ + tor/circuitbuild.c \ + tor/circuitlist.c \ + tor/circuitmux.c \ + tor/circuitmux_ewma.c \ + tor/circuitstats.c \ + tor/circuituse.c \ + tor/command.c \ + tor/compat.c \ + tor/compat_libevent.c \ + tor/config.c \ + tor/config_codedigest.c \ + tor/confparse.c \ + tor/connection.c \ + tor/connection_edge.c \ + tor/connection_or.c \ + tor/container.c \ + tor/control.c \ + tor/cpuworker.c \ + tor/crypto.c \ + tor/crypto_curve25519.c \ + tor/crypto_format.c \ + tor/curve25519-donna.c \ + tor/di_ops.c \ + tor/directory.c \ + tor/dirserv.c \ + tor/dirvote.c \ + tor/dns.c \ + tor/dnsserv.c \ + tor/entrynodes.c \ + tor/ext_orport.c \ + tor/fp_pair.c \ + tor/geoip.c \ + tor/hibernate.c \ + tor/log.c \ + tor/memarea.c \ + tor/mempool.c \ + tor/microdesc.c \ + tor/networkstatus.c \ + tor/nodelist.c \ + tor/onion.c \ + tor/onion_fast.c \ + tor/onion_main.c \ + tor/onion_ntor.c \ + tor/onion_tap.c \ + tor/policies.c \ + tor/procmon.c \ + tor/reasons.c \ + tor/relay.c \ + tor/rendclient.c \ + tor/rendcommon.c \ + tor/rendmid.c \ + tor/rendservice.c \ + tor/rephist.c \ + tor/replaycache.c \ + tor/router.c \ + tor/routerlist.c \ + tor/routerparse.c \ + tor/routerset.c \ + tor/sandbox.c \ + tor/statefile.c \ + tor/status.c \ + tor/strlcat.c \ + tor/strlcpy.c \ + tor/tor_util.c \ + tor/torgzip.c \ + tor/tortls.c \ + tor/transports.c \ + tor/util_codedigest.c \ $(BITCOIN_CORE_H) # util: shared between all executables. From 93268ccf32f08f11de67a4c36dd40aee9ffa9ebb Mon Sep 17 00:00:00 2001 From: sunerok Date: Tue, 2 Jan 2018 22:22:13 -0500 Subject: [PATCH 04/54] fix deps --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/README.md b/README.md index 937638d78..dc4f92133 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,82 @@ You can also check out this [Linux Wallet Video Tutorial](https://www.youtube.co ## Developer Notes +<<<<<<< HEAD Can be found [here](./doc/dev-notes.md) +======= +```shell +sudo rm -Rf ~/VERGE #(if you already have it) +sudo apt-get -y install git && cd ~ && git clone https://github.com/vergecurrency/VERGE && cd VERGE && sh go.sh +``` + +The _slightly_ longer version: + +1. Install the dependencies. **Note**: If you are on debian, you will also need to `apt-get install libcanberra-gtk-module`. + + ```shell + sudo add-apt-repository ppa:bitcoin/bitcoin + sudo apt-get update + sudo apt-get install \ + libdb4.8-dev libdb4.8++-dev build-essential \ + libtool autotools-dev automake pkg-config libssl-dev libevent-dev \ + bsdmainutils git libboost-all-dev libminiupnpc-dev libqt5gui5 \ + libqt5core5a libqt5dbus5 libevent-dev qttools5-dev \ + qttools5-dev-tools libprotobuf-dev protobuf-compiler libqrencode-dev + ``` + +2. Clone the git repository and compile the daemon and gui wallet: + + ```shell + git clone https://github.com/vergecurrency/verge && cd verge && ./autogen.sh && ./configure && make + ``` + +> **Note**: If you get a "memory exhausted" error, make a swap file. (https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04) + + +### Mac OS X Wallet + +> **Note:** This has only been confirmed to work on OS X Sierra (10.12) and OS X High Sierra (10.13) with XCode 9.2 and `Apple LLVM version 9.0.0 (clang-900.0.39.2)`. + +1. Ensure you have mysql and boost installed. + + ```shell + brew install mysql boost + ``` + +2. Ensure you have python 2.7 installed and in your path (OS X comes with this by default) + + ```shell + python --version + ``` + +3. Export the required environment variables + + ```shell + export VERGE_PLATFORM='mac' + export CXX=clang++ + export CC=clang + ``` + +4. Run your build commands + + ```shell + ./building/common.sh + ./building/mac/requirements.sh + ./building/mac/build.sh + ``` + +5. Grab a :coffee: and wait it out + +6. Create the `.dmg` file + + ```shell + ./building/mac/dist.sh + ``` + +### Windows Wallet + +TODO. Take a look as [building/windows](./building/windows). +>>>>>>> fix deps ## Docker Images From 58f29bbbbabbcb028022f15d7ff0bc743d58c7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pi=C4=85tek?= Date: Wed, 3 Jan 2018 06:49:56 +0100 Subject: [PATCH 05/54] remove tor --- src/tor/LICENSE | 174 - src/tor/address.c | 1692 --------- src/tor/address.h | 232 -- src/tor/addressmap.c | 1078 ------ src/tor/addressmap.h | 62 - src/tor/aes.c | 522 --- src/tor/aes.h | 29 - src/tor/anonymize.cpp | 60 - src/tor/anonymize.h | 36 - src/tor/backtrace.c | 205 -- src/tor/backtrace.h | 12 - src/tor/buffers.c | 2584 -------------- src/tor/buffers.h | 106 - src/tor/channel.c | 4191 ---------------------- src/tor/channel.h | 489 --- src/tor/channeltls.c | 2074 ----------- src/tor/channeltls.h | 57 - src/tor/ciphers.inc | 182 - src/tor/circpathbias.c | 1538 -------- src/tor/circpathbias.h | 29 - src/tor/circuitbuild.c | 2200 ------------ src/tor/circuitbuild.h | 62 - src/tor/circuitlist.c | 1878 ---------- src/tor/circuitlist.h | 82 - src/tor/circuitmux.c | 1898 ---------- src/tor/circuitmux.h | 147 - src/tor/circuitmux_ewma.c | 684 ---- src/tor/circuitmux_ewma.h | 29 - src/tor/circuitstats.c | 1644 --------- src/tor/circuitstats.h | 98 - src/tor/circuituse.c | 2326 ------------ src/tor/circuituse.h | 61 - src/tor/command.c | 589 --- src/tor/command.h | 31 - src/tor/common_sha1.i | 26 - src/tor/compat.c | 3254 ----------------- src/tor/compat_libevent.c | 663 ---- src/tor/compat_libevent.h | 96 - src/tor/config.c | 6704 ----------------------------------- src/tor/config.h | 144 - src/tor/config_codedigest.c | 13 - src/tor/confparse.c | 1316 ------- src/tor/confparse.h | 137 - src/tor/connection.c | 4850 ------------------------- src/tor/connection.h | 231 -- src/tor/connection_edge.c | 3119 ---------------- src/tor/connection_edge.h | 143 - src/tor/connection_or.c | 2452 ------------- src/tor/connection_or.h | 100 - src/tor/container.c | 1557 -------- src/tor/container.h | 681 ---- src/tor/control.c | 5110 -------------------------- src/tor/control.h | 205 -- src/tor/cpuworker.c | 718 ---- src/tor/cpuworker.h | 31 - src/tor/crypto.c | 3154 ---------------- src/tor/crypto.h | 302 -- src/tor/crypto_curve25519.c | 191 - src/tor/crypto_curve25519.h | 74 - src/tor/crypto_format.c | 45 - src/tor/curve25519-donna.c | 732 ---- src/tor/di_ops.c | 222 -- src/tor/di_ops.h | 47 - src/tor/directory.c | 3894 -------------------- src/tor/directory.h | 127 - src/tor/dirserv.c | 3780 -------------------- src/tor/dirserv.h | 138 - src/tor/dirvote.c | 3778 -------------------- src/tor/dirvote.h | 148 - src/tor/dns.c | 2203 ------------ src/tor/dns.h | 32 - src/tor/dnsserv.c | 374 -- src/tor/dnsserv.h | 27 - src/tor/entrynodes.c | 2334 ------------ src/tor/entrynodes.h | 133 - src/tor/eventdns.h | 337 -- src/tor/eventdns_tor.h | 25 - src/tor/ext_orport.c | 648 ---- src/tor/ext_orport.h | 42 - src/tor/fp_pair.c | 308 -- src/tor/fp_pair.h | 45 - src/tor/geoip.c | 1684 --------- src/tor/geoip.h | 69 - src/tor/hibernate.c | 1031 ------ src/tor/hibernate.h | 55 - src/tor/ht.h | 490 --- src/tor/log.c | 1316 ------- src/tor/memarea.c | 328 -- src/tor/memarea.h | 25 - src/tor/mempool.c | 628 ---- src/tor/mempool.h | 65 - src/tor/microdesc.c | 833 ----- src/tor/microdesc.h | 56 - src/tor/networkstatus.c | 1871 ---------- src/tor/networkstatus.h | 104 - src/tor/nodelist.c | 1557 -------- src/tor/nodelist.h | 86 - src/tor/ntmain.h | 30 - src/tor/onion.c | 1183 ------ src/tor/onion.h | 122 - src/tor/onion_fast.c | 123 - src/tor/onion_fast.h | 38 - src/tor/onion_main.c | 2908 --------------- src/tor/onion_main.h | 86 - src/tor/onion_ntor.c | 295 -- src/tor/onion_ntor.h | 63 - src/tor/onion_tap.c | 218 -- src/tor/onion_tap.h | 37 - src/tor/or.h | 5044 -------------------------- src/tor/or_sha1.i | 167 - src/tor/orconfig.h | 12 - src/tor/orconfig_apple.h | 623 ---- src/tor/orconfig_linux.h | 621 ---- src/tor/orconfig_win32.h | 259 -- src/tor/policies.c | 1758 --------- src/tor/policies.h | 77 - src/tor/procmon.c | 356 -- src/tor/procmon.h | 33 - src/tor/reasons.c | 439 --- src/tor/reasons.h | 31 - src/tor/relay.c | 2870 --------------- src/tor/relay.h | 91 - src/tor/rendclient.c | 1362 ------- src/tor/rendclient.h | 57 - src/tor/rendcommon.c | 1487 -------- src/tor/rendcommon.h | 66 - src/tor/rendmid.c | 340 -- src/tor/rendmid.h | 25 - src/tor/rendservice.c | 3396 ------------------ src/tor/rendservice.h | 108 - src/tor/rephist.c | 3057 ---------------- src/tor/rephist.h | 106 - src/tor/replaycache.c | 204 -- src/tor/replaycache.h | 66 - src/tor/router.c | 3060 ---------------- src/tor/router.h | 154 - src/tor/routerlist.c | 5145 --------------------------- src/tor/routerlist.h | 217 -- src/tor/routerparse.c | 4925 ------------------------- src/tor/routerparse.h | 86 - src/tor/routerset.c | 466 --- src/tor/routerset.h | 49 - src/tor/sandbox.c | 1510 -------- src/tor/sandbox.h | 247 -- src/tor/statefile.c | 627 ---- src/tor/statefile.h | 26 - src/tor/status.c | 166 - src/tor/status.h | 10 - src/tor/strlcat.c | 70 - src/tor/strlcpy.c | 60 - src/tor/testsupport.h | 80 - src/tor/tinytest.h | 87 - src/tor/tinytest_macros.h | 184 - src/tor/tor_compat.h | 751 ---- src/tor/tor_queue.h | 568 --- src/tor/tor_util.c | 5086 -------------------------- src/tor/tor_util.h | 550 --- src/tor/torgzip.c | 527 --- src/tor/torgzip.h | 59 - src/tor/torint.h | 365 -- src/tor/torlog.h | 233 -- src/tor/tortls.c | 2822 --------------- src/tor/tortls.h | 142 - src/tor/transports.c | 1625 --------- src/tor/transports.h | 129 - src/tor/util_codedigest.c | 13 - 166 files changed, 149766 deletions(-) delete mode 100644 src/tor/LICENSE delete mode 100644 src/tor/address.c delete mode 100644 src/tor/address.h delete mode 100644 src/tor/addressmap.c delete mode 100644 src/tor/addressmap.h delete mode 100644 src/tor/aes.c delete mode 100644 src/tor/aes.h delete mode 100644 src/tor/anonymize.cpp delete mode 100644 src/tor/anonymize.h delete mode 100644 src/tor/backtrace.c delete mode 100644 src/tor/backtrace.h delete mode 100644 src/tor/buffers.c delete mode 100644 src/tor/buffers.h delete mode 100644 src/tor/channel.c delete mode 100644 src/tor/channel.h delete mode 100644 src/tor/channeltls.c delete mode 100644 src/tor/channeltls.h delete mode 100644 src/tor/ciphers.inc delete mode 100644 src/tor/circpathbias.c delete mode 100644 src/tor/circpathbias.h delete mode 100644 src/tor/circuitbuild.c delete mode 100644 src/tor/circuitbuild.h delete mode 100644 src/tor/circuitlist.c delete mode 100644 src/tor/circuitlist.h delete mode 100644 src/tor/circuitmux.c delete mode 100644 src/tor/circuitmux.h delete mode 100644 src/tor/circuitmux_ewma.c delete mode 100644 src/tor/circuitmux_ewma.h delete mode 100644 src/tor/circuitstats.c delete mode 100644 src/tor/circuitstats.h delete mode 100644 src/tor/circuituse.c delete mode 100644 src/tor/circuituse.h delete mode 100644 src/tor/command.c delete mode 100644 src/tor/command.h delete mode 100644 src/tor/common_sha1.i delete mode 100644 src/tor/compat.c delete mode 100644 src/tor/compat_libevent.c delete mode 100644 src/tor/compat_libevent.h delete mode 100644 src/tor/config.c delete mode 100644 src/tor/config.h delete mode 100644 src/tor/config_codedigest.c delete mode 100644 src/tor/confparse.c delete mode 100644 src/tor/confparse.h delete mode 100644 src/tor/connection.c delete mode 100644 src/tor/connection.h delete mode 100644 src/tor/connection_edge.c delete mode 100644 src/tor/connection_edge.h delete mode 100644 src/tor/connection_or.c delete mode 100644 src/tor/connection_or.h delete mode 100644 src/tor/container.c delete mode 100644 src/tor/container.h delete mode 100644 src/tor/control.c delete mode 100644 src/tor/control.h delete mode 100644 src/tor/cpuworker.c delete mode 100644 src/tor/cpuworker.h delete mode 100644 src/tor/crypto.c delete mode 100644 src/tor/crypto.h delete mode 100644 src/tor/crypto_curve25519.c delete mode 100644 src/tor/crypto_curve25519.h delete mode 100644 src/tor/crypto_format.c delete mode 100644 src/tor/curve25519-donna.c delete mode 100644 src/tor/di_ops.c delete mode 100644 src/tor/di_ops.h delete mode 100644 src/tor/directory.c delete mode 100644 src/tor/directory.h delete mode 100644 src/tor/dirserv.c delete mode 100644 src/tor/dirserv.h delete mode 100644 src/tor/dirvote.c delete mode 100644 src/tor/dirvote.h delete mode 100644 src/tor/dns.c delete mode 100644 src/tor/dns.h delete mode 100644 src/tor/dnsserv.c delete mode 100644 src/tor/dnsserv.h delete mode 100644 src/tor/entrynodes.c delete mode 100644 src/tor/entrynodes.h delete mode 100644 src/tor/eventdns.h delete mode 100644 src/tor/eventdns_tor.h delete mode 100644 src/tor/ext_orport.c delete mode 100644 src/tor/ext_orport.h delete mode 100644 src/tor/fp_pair.c delete mode 100644 src/tor/fp_pair.h delete mode 100644 src/tor/geoip.c delete mode 100644 src/tor/geoip.h delete mode 100644 src/tor/hibernate.c delete mode 100644 src/tor/hibernate.h delete mode 100644 src/tor/ht.h delete mode 100644 src/tor/log.c delete mode 100644 src/tor/memarea.c delete mode 100644 src/tor/memarea.h delete mode 100644 src/tor/mempool.c delete mode 100644 src/tor/mempool.h delete mode 100644 src/tor/microdesc.c delete mode 100644 src/tor/microdesc.h delete mode 100644 src/tor/networkstatus.c delete mode 100644 src/tor/networkstatus.h delete mode 100644 src/tor/nodelist.c delete mode 100644 src/tor/nodelist.h delete mode 100644 src/tor/ntmain.h delete mode 100644 src/tor/onion.c delete mode 100644 src/tor/onion.h delete mode 100644 src/tor/onion_fast.c delete mode 100644 src/tor/onion_fast.h delete mode 100644 src/tor/onion_main.c delete mode 100644 src/tor/onion_main.h delete mode 100644 src/tor/onion_ntor.c delete mode 100644 src/tor/onion_ntor.h delete mode 100644 src/tor/onion_tap.c delete mode 100644 src/tor/onion_tap.h delete mode 100644 src/tor/or.h delete mode 100644 src/tor/or_sha1.i delete mode 100644 src/tor/orconfig.h delete mode 100644 src/tor/orconfig_apple.h delete mode 100644 src/tor/orconfig_linux.h delete mode 100644 src/tor/orconfig_win32.h delete mode 100644 src/tor/policies.c delete mode 100644 src/tor/policies.h delete mode 100644 src/tor/procmon.c delete mode 100644 src/tor/procmon.h delete mode 100644 src/tor/reasons.c delete mode 100644 src/tor/reasons.h delete mode 100644 src/tor/relay.c delete mode 100644 src/tor/relay.h delete mode 100644 src/tor/rendclient.c delete mode 100644 src/tor/rendclient.h delete mode 100644 src/tor/rendcommon.c delete mode 100644 src/tor/rendcommon.h delete mode 100644 src/tor/rendmid.c delete mode 100644 src/tor/rendmid.h delete mode 100644 src/tor/rendservice.c delete mode 100644 src/tor/rendservice.h delete mode 100644 src/tor/rephist.c delete mode 100644 src/tor/rephist.h delete mode 100644 src/tor/replaycache.c delete mode 100644 src/tor/replaycache.h delete mode 100644 src/tor/router.c delete mode 100644 src/tor/router.h delete mode 100644 src/tor/routerlist.c delete mode 100644 src/tor/routerlist.h delete mode 100644 src/tor/routerparse.c delete mode 100644 src/tor/routerparse.h delete mode 100644 src/tor/routerset.c delete mode 100644 src/tor/routerset.h delete mode 100644 src/tor/sandbox.c delete mode 100644 src/tor/sandbox.h delete mode 100644 src/tor/statefile.c delete mode 100644 src/tor/statefile.h delete mode 100644 src/tor/status.c delete mode 100644 src/tor/status.h delete mode 100644 src/tor/strlcat.c delete mode 100644 src/tor/strlcpy.c delete mode 100644 src/tor/testsupport.h delete mode 100644 src/tor/tinytest.h delete mode 100644 src/tor/tinytest_macros.h delete mode 100644 src/tor/tor_compat.h delete mode 100644 src/tor/tor_queue.h delete mode 100644 src/tor/tor_util.c delete mode 100644 src/tor/tor_util.h delete mode 100644 src/tor/torgzip.c delete mode 100644 src/tor/torgzip.h delete mode 100644 src/tor/torint.h delete mode 100644 src/tor/torlog.h delete mode 100644 src/tor/tortls.c delete mode 100644 src/tor/tortls.h delete mode 100644 src/tor/transports.c delete mode 100644 src/tor/transports.h delete mode 100644 src/tor/util_codedigest.c diff --git a/src/tor/LICENSE b/src/tor/LICENSE deleted file mode 100644 index 8a6fccaf4..000000000 --- a/src/tor/LICENSE +++ /dev/null @@ -1,174 +0,0 @@ - This file contains the license for Tor, - a free software project to provide anonymity on the Internet. - - It also lists the licenses for other components used by Tor. - - For more information about Tor, see https://www.torproject.org/. - - If you got this file as a part of a larger bundle, - there may be other license terms that you should be aware of. - -=============================================================================== -Tor is distributed under this license: - -Copyright (c) 2001-2004, Roger Dingledine -Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -Copyright (c) 2007-2013, The Tor Project, Inc. - -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 names of the copyright owners 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. -=============================================================================== -src/ext/strlcat.c and src/ext/strlcpy.c by Todd C. Miller are licensed -under the following license: - - * Copyright (c) 1998 Todd C. Miller - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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. -=============================================================================== -src/ext/tor_queue.h is licensed under the following license: - - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - -=============================================================================== -src/config/geoip is licensed under the following license: - -OPEN DATA LICENSE (GeoLite Country and GeoLite City databases) - -Copyright (c) 2008 MaxMind, Inc. All Rights Reserved. - -All advertising materials and documentation mentioning features or use of -this database must display the following acknowledgment: -"This product includes GeoLite data created by MaxMind, available from -http://maxmind.com/" - -Redistribution and use with or without modification, are permitted provided -that the following conditions are met: -1. Redistributions must retain the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. -2. All advertising materials and documentation mentioning features or use of -this database must display the following acknowledgement: -"This product includes GeoLite data created by MaxMind, available from -http://maxmind.com/" -3. "MaxMind" may not be used to endorse or promote products derived from this -database without specific prior written permission. - -THIS DATABASE IS PROVIDED BY MAXMIND, INC ``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 MAXMIND 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 -DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -=============================================================================== -m4/pc_from_ucontext.m4 is available under the following license. Note that -it is *not* built into the Tor license. - -Copyright (c) 2005, Google Inc. -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. - -=============================================================================== -If you got Tor as a static binary with OpenSSL included, then you should know: - "This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit (http://www.openssl.org/)" -=============================================================================== diff --git a/src/tor/address.c b/src/tor/address.c deleted file mode 100644 index c30d2ab63..000000000 --- a/src/tor/address.c +++ /dev/null @@ -1,1692 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file address.c - * \brief Functions to use and manipulate the tor_addr_t structure. - **/ - -#include "orconfig.h" -#include "tor_compat.h" -#include "tor_util.h" -#include "address.h" -#include "torlog.h" -#include "container.h" -#include "sandbox.h" - -#ifdef _WIN32 -#include -#include -#include -/* For access to structs needed by GetAdaptersAddresses */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#include -#endif - -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_ERRNO_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include /* FreeBSD needs this to know what version it is */ -#endif -#ifdef HAVE_SYS_UN_H -#include -#endif -#ifdef HAVE_IFADDRS_H -#include -#endif -#ifdef HAVE_SYS_IOCTL_H -#include -#endif -#ifdef HAVE_NET_IF_H -#include -#endif -#include -#include -#include -#include -#include - -/* tor_addr_is_null() and maybe other functions rely on AF_UNSPEC being 0 to - * work correctly. Bail out here if we've found a platform where AF_UNSPEC - * isn't 0. */ -#if AF_UNSPEC != 0 -#error We rely on AF_UNSPEC being 0. Let us know about your platform, please! -#endif - -/** Convert the tor_addr_t in a, with port in port, into a - * sockaddr object in *sa_out of object size len. If not enough - * room is available in sa_out, or on error, return 0. On success, return - * the length of the sockaddr. - * - * Interface note: ordinarily, we return -1 for error. We can't do that here, - * since socklen_t is unsigned on some platforms. - **/ -socklen_t -tor_addr_to_sockaddr(const tor_addr_t *a, - uint16_t port, - struct sockaddr *sa_out, - socklen_t len) -{ - sa_family_t family = tor_addr_family(a); - if (family == AF_INET) { - struct sockaddr_in *sin; - if (len < (int)sizeof(struct sockaddr_in)) - return 0; - sin = (struct sockaddr_in *)sa_out; - memset(sin, 0, sizeof(struct sockaddr_in)); -#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN - sin->sin_len = sizeof(struct sockaddr_in); -#endif - sin->sin_family = AF_INET; - sin->sin_port = htons(port); - sin->sin_addr.s_addr = tor_addr_to_ipv4n(a); - return sizeof(struct sockaddr_in); - } else if (family == AF_INET6) { - struct sockaddr_in6 *sin6; - if (len < (int)sizeof(struct sockaddr_in6)) - return 0; - sin6 = (struct sockaddr_in6 *)sa_out; - memset(sin6, 0, sizeof(struct sockaddr_in6)); -#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN - sin6->sin6_len = sizeof(struct sockaddr_in6); -#endif - sin6->sin6_family = AF_INET6; - sin6->sin6_port = htons(port); - memcpy(&sin6->sin6_addr, tor_addr_to_in6(a), sizeof(struct in6_addr)); - return sizeof(struct sockaddr_in6); - } else { - return 0; - } -} - -/** Set the tor_addr_t in a to contain the socket address contained in - * sa. */ -int -tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, - uint16_t *port_out) -{ - tor_assert(a); - tor_assert(sa); - if (sa->sa_family == AF_INET) { - struct sockaddr_in *sin = (struct sockaddr_in *) sa; - tor_addr_from_ipv4n(a, sin->sin_addr.s_addr); - if (port_out) - *port_out = ntohs(sin->sin_port); - } else if (sa->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; - tor_addr_from_in6(a, &sin6->sin6_addr); - if (port_out) - *port_out = ntohs(sin6->sin6_port); - } else { - tor_addr_make_unspec(a); - return -1; - } - return 0; -} - -/** Return a newly allocated string holding the address described in - * sa. AF_UNIX, AF_UNSPEC, AF_INET, and AF_INET6 are supported. */ -char * -tor_sockaddr_to_str(const struct sockaddr *sa) -{ - char address[TOR_ADDR_BUF_LEN]; - char *result; - tor_addr_t addr; - uint16_t port; -#ifdef HAVE_SYS_UN_H - if (sa->sa_family == AF_UNIX) { - struct sockaddr_un *s_un = (struct sockaddr_un *)sa; - tor_asprintf(&result, "unix:%s", s_un->sun_path); - return result; - } -#endif - if (sa->sa_family == AF_UNSPEC) - return tor_strdup("unspec"); - - if (tor_addr_from_sockaddr(&addr, sa, &port) < 0) - return NULL; - if (! tor_addr_to_str(address, &addr, sizeof(address), 1)) - return NULL; - tor_asprintf(&result, "%s:%d", address, (int)port); - return result; -} - -/** Set address a to the unspecified address. This address belongs to - * no family. */ -void -tor_addr_make_unspec(tor_addr_t *a) -{ - memset(a, 0, sizeof(*a)); - a->family = AF_UNSPEC; -} - -/** Set address a
    to the null address in address family family. - * The null address for AF_INET is 0.0.0.0. The null address for AF_INET6 is - * [::]. AF_UNSPEC is all null. */ -void -tor_addr_make_null(tor_addr_t *a, sa_family_t family) -{ - memset(a, 0, sizeof(*a)); - a->family = family; -} - -/** Similar behavior to Unix gethostbyname: resolve name, and set - * *addr to the proper IP address and family. The family - * argument (which must be AF_INET, AF_INET6, or AF_UNSPEC) declares a - * preferred family, though another one may be returned if only one - * family is implemented for this address. - * - * Return 0 on success, -1 on failure; 1 on transient failure. - */ -int -tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr) -{ - /* Perhaps eventually this should be replaced by a tor_getaddrinfo or - * something. - */ - struct in_addr iaddr; - struct in6_addr iaddr6; - tor_assert(name); - tor_assert(addr); - tor_assert(family == AF_INET || family == AF_INET6 || family == AF_UNSPEC); - if (!*name) { - /* Empty address is an error. */ - return -1; - } else if (tor_inet_pton(AF_INET, name, &iaddr)) { - /* It's an IPv4 IP. */ - if (family == AF_INET6) - return -1; - tor_addr_from_in(addr, &iaddr); - return 0; - } else if (tor_inet_pton(AF_INET6, name, &iaddr6)) { - if (family == AF_INET) - return -1; - tor_addr_from_in6(addr, &iaddr6); - return 0; - } else { -#ifdef HAVE_GETADDRINFO - int err; - struct addrinfo *res=NULL, *res_p; - struct addrinfo *best=NULL; - struct addrinfo hints; - int result = -1; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = family; - hints.ai_socktype = SOCK_STREAM; - err = sandbox_getaddrinfo(name, NULL, &hints, &res); - if (!err) { - best = NULL; - for (res_p = res; res_p; res_p = res_p->ai_next) { - if (family == AF_UNSPEC) { - if (res_p->ai_family == AF_INET) { - best = res_p; - break; - } else if (res_p->ai_family == AF_INET6 && !best) { - best = res_p; - } - } else if (family == res_p->ai_family) { - best = res_p; - break; - } - } - if (!best) - best = res; - if (best->ai_family == AF_INET) { - tor_addr_from_in(addr, - &((struct sockaddr_in*)best->ai_addr)->sin_addr); - result = 0; - } else if (best->ai_family == AF_INET6) { - tor_addr_from_in6(addr, - &((struct sockaddr_in6*)best->ai_addr)->sin6_addr); - result = 0; - } - freeaddrinfo(res); - return result; - } - return (err == EAI_AGAIN) ? 1 : -1; -#else - struct hostent *ent; - int err; -#ifdef HAVE_GETHOSTBYNAME_R_6_ARG - char buf[2048]; - struct hostent hostent; - int r; - r = gethostbyname_r(name, &hostent, buf, sizeof(buf), &ent, &err); -#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) - char buf[2048]; - struct hostent hostent; - ent = gethostbyname_r(name, &hostent, buf, sizeof(buf), &err); -#elif defined(HAVE_GETHOSTBYNAME_R_3_ARG) - struct hostent_data data; - struct hostent hent; - memset(&data, 0, sizeof(data)); - err = gethostbyname_r(name, &hent, &data); - ent = err ? NULL : &hent; -#else - ent = gethostbyname(name); -#ifdef _WIN32 - err = WSAGetLastError(); -#else - err = h_errno; -#endif -#endif /* endif HAVE_GETHOSTBYNAME_R_6_ARG. */ - if (ent) { - if (ent->h_addrtype == AF_INET) { - tor_addr_from_in(addr, (struct in_addr*) ent->h_addr); - } else if (ent->h_addrtype == AF_INET6) { - tor_addr_from_in6(addr, (struct in6_addr*) ent->h_addr); - } else { - tor_assert(0); /* gethostbyname() returned a bizarre addrtype */ - } - return 0; - } -#ifdef _WIN32 - return (err == WSATRY_AGAIN) ? 1 : -1; -#else - return (err == TRY_AGAIN) ? 1 : -1; -#endif -#endif - } -} - -/** Return true iff ip is an IP reserved to localhost or local networks - * in RFC1918 or RFC4193 or RFC4291. (fec0::/10, deprecated by RFC3879, is - * also treated as internal for now.) - */ -int -tor_addr_is_internal_(const tor_addr_t *addr, int for_listening, - const char *filename, int lineno) -{ - uint32_t iph4 = 0; - uint32_t iph6[4]; - sa_family_t v_family; - v_family = tor_addr_family(addr); - - if (v_family == AF_INET) { - iph4 = tor_addr_to_ipv4h(addr); - } else if (v_family == AF_INET6) { - if (tor_addr_is_v4(addr)) { /* v4-mapped */ - v_family = AF_INET; - iph4 = ntohl(tor_addr_to_in6_addr32(addr)[3]); - } - } - - if (v_family == AF_INET6) { - const uint32_t *a32 = tor_addr_to_in6_addr32(addr); - iph6[0] = ntohl(a32[0]); - iph6[1] = ntohl(a32[1]); - iph6[2] = ntohl(a32[2]); - iph6[3] = ntohl(a32[3]); - if (for_listening && !iph6[0] && !iph6[1] && !iph6[2] && !iph6[3]) /* :: */ - return 0; - - if (((iph6[0] & 0xfe000000) == 0xfc000000) || /* fc00/7 - RFC4193 */ - ((iph6[0] & 0xffc00000) == 0xfe800000) || /* fe80/10 - RFC4291 */ - ((iph6[0] & 0xffc00000) == 0xfec00000)) /* fec0/10 D- RFC3879 */ - return 1; - - if (!iph6[0] && !iph6[1] && !iph6[2] && - ((iph6[3] & 0xfffffffe) == 0x00000000)) /* ::/127 */ - return 1; - - return 0; - } else if (v_family == AF_INET) { - if (for_listening && !iph4) /* special case for binding to 0.0.0.0 */ - return 0; - if (((iph4 & 0xff000000) == 0x0a000000) || /* 10/8 */ - ((iph4 & 0xff000000) == 0x00000000) || /* 0/8 */ - ((iph4 & 0xff000000) == 0x7f000000) || /* 127/8 */ - ((iph4 & 0xffff0000) == 0xa9fe0000) || /* 169.254/16 */ - ((iph4 & 0xfff00000) == 0xac100000) || /* 172.16/12 */ - ((iph4 & 0xffff0000) == 0xc0a80000)) /* 192.168/16 */ - return 1; - return 0; - } - - /* unknown address family... assume it's not safe for external use */ - /* rather than tor_assert(0) */ - log_warn(LD_BUG, "tor_addr_is_internal() called from %s:%d with a " - "non-IP address of type %d", filename, lineno, (int)v_family); - tor_fragile_assert(); - return 1; -} - -/** Convert a tor_addr_t addr into a string, and store it in - * dest of size len. Returns a pointer to dest on success, - * or NULL on failure. If decorate, surround IPv6 addresses with - * brackets. - */ -const char * -tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate) -{ - const char *ptr; - tor_assert(addr && dest); - - switch (tor_addr_family(addr)) { - case AF_INET: - /* Shortest addr x.x.x.x + \0 */ - if (len < 8) - return NULL; - ptr = tor_inet_ntop(AF_INET, &addr->addr.in_addr, dest, len); - break; - case AF_INET6: - /* Shortest addr [ :: ] + \0 */ - if (len < (3 + (decorate ? 2 : 0))) - return NULL; - - if (decorate) - ptr = tor_inet_ntop(AF_INET6, &addr->addr.in6_addr, dest+1, len-2); - else - ptr = tor_inet_ntop(AF_INET6, &addr->addr.in6_addr, dest, len); - - if (ptr && decorate) { - *dest = '['; - memcpy(dest+strlen(dest), "]", 2); - tor_assert(ptr == dest+1); - ptr = dest; - } - break; - default: - return NULL; - } - return ptr; -} - -/** Parse an .in-addr.arpa or .ip6.arpa address from address. Return 0 - * if this is not an .in-addr.arpa address or an .ip6.arpa address. Return -1 - * if this is an ill-formed .in-addr.arpa address or an .ip6.arpa address. - * Also return -1 if family is not AF_UNSPEC, and the parsed address - * family does not match family. On success, return 1, and store the - * result, if any, into result, if provided. - * - * If accept_regular is set and the address is in neither recognized - * reverse lookup hostname format, try parsing the address as a regular - * IPv4 or IPv6 address too. - */ -int -tor_addr_parse_PTR_name(tor_addr_t *result, const char *address, - int family, int accept_regular) -{ - if (!strcasecmpend(address, ".in-addr.arpa")) { - /* We have an in-addr.arpa address. */ - char buf[INET_NTOA_BUF_LEN]; - size_t len; - struct in_addr inaddr; - if (family == AF_INET6) - return -1; - - len = strlen(address) - strlen(".in-addr.arpa"); - if (len >= INET_NTOA_BUF_LEN) - return -1; /* Too long. */ - - memcpy(buf, address, len); - buf[len] = '\0'; - if (tor_inet_aton(buf, &inaddr) == 0) - return -1; /* malformed. */ - - /* reverse the bytes */ - inaddr.s_addr = (uint32_t) - (((inaddr.s_addr & 0x000000ff) << 24) - |((inaddr.s_addr & 0x0000ff00) << 8) - |((inaddr.s_addr & 0x00ff0000) >> 8) - |((inaddr.s_addr & 0xff000000) >> 24)); - - if (result) { - tor_addr_from_in(result, &inaddr); - } - return 1; - } - - if (!strcasecmpend(address, ".ip6.arpa")) { - const char *cp; - int i; - int n0, n1; - struct in6_addr in6; - - if (family == AF_INET) - return -1; - - cp = address; - for (i = 0; i < 16; ++i) { - n0 = hex_decode_digit(*cp++); /* The low-order nybble appears first. */ - if (*cp++ != '.') return -1; /* Then a dot. */ - n1 = hex_decode_digit(*cp++); /* The high-order nybble appears first. */ - if (*cp++ != '.') return -1; /* Then another dot. */ - if (n0<0 || n1 < 0) /* Both nybbles must be hex. */ - return -1; - - /* We don't check the length of the string in here. But that's okay, - * since we already know that the string ends with ".ip6.arpa", and - * there is no way to frameshift .ip6.arpa so it fits into the pattern - * of hexdigit, period, hexdigit, period that we enforce above. - */ - - /* Assign from low-byte to high-byte. */ - in6.s6_addr[15-i] = n0 | (n1 << 4); - } - if (strcasecmp(cp, "ip6.arpa")) - return -1; - - if (result) { - tor_addr_from_in6(result, &in6); - } - return 1; - } - - if (accept_regular) { - tor_addr_t tmp; - int r = tor_addr_parse(&tmp, address); - if (r < 0) - return 0; - if (r != family && family != AF_UNSPEC) - return -1; - - if (result) - memcpy(result, &tmp, sizeof(tor_addr_t)); - - return 1; - } - - return 0; -} - -/** Convert addr to an in-addr.arpa name or a .ip6.arpa name, - * and store the result in the outlen-byte buffer at - * out. Return the number of chars written to out, not - * including the trailing \0, on success. Returns -1 on failure. */ -int -tor_addr_to_PTR_name(char *out, size_t outlen, - const tor_addr_t *addr) -{ - tor_assert(out); - tor_assert(addr); - - if (addr->family == AF_INET) { - uint32_t a = tor_addr_to_ipv4h(addr); - - return tor_snprintf(out, outlen, "%d.%d.%d.%d.in-addr.arpa", - (int)(uint8_t)((a )&0xff), - (int)(uint8_t)((a>>8 )&0xff), - (int)(uint8_t)((a>>16)&0xff), - (int)(uint8_t)((a>>24)&0xff)); - } else if (addr->family == AF_INET6) { - int i; - char *cp = out; - const uint8_t *bytes = tor_addr_to_in6_addr8(addr); - if (outlen < REVERSE_LOOKUP_NAME_BUF_LEN) - return -1; - for (i = 15; i >= 0; --i) { - uint8_t byte = bytes[i]; - *cp++ = "0123456789abcdef"[byte & 0x0f]; - *cp++ = '.'; - *cp++ = "0123456789abcdef"[byte >> 4]; - *cp++ = '.'; - } - memcpy(cp, "ip6.arpa", 9); /* 8 characters plus NUL */ - return 32 * 2 + 8; - } - return -1; -} - -/** Parse a string s containing an IPv4/IPv6 address, and possibly - * a mask and port or port range. Store the parsed address in - * addr_out, a mask (if any) in mask_out, and port(s) (if any) - * in port_min_out and port_max_out. - * - * The syntax is: - * Address OptMask OptPortRange - * Address ::= IPv4Address / "[" IPv6Address "]" / "*" - * OptMask ::= "/" Integer / - * OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer / - * - * - If mask, minport, or maxport are NULL, we do not want these - * options to be set; treat them as an error if present. - * - If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6). - * - If the string has one port, it is placed in both min and max port - * variables. - * - If the string has no port(s), port_(min|max)_out are set to 1 and 65535. - * - * Return an address family on success, or -1 if an invalid address string is - * provided. - * - * If 'flags & TAPMP_EXTENDED_STAR' is false, then the wildcard address '*' - * yield an IPv4 wildcard. - * - * If 'flags & TAPMP_EXTENDED_STAR' is true, then the wildcard address '*' - * yields an AF_UNSPEC wildcard address, and the following change is made - * in the grammar above: - * Address ::= IPv4Address / "[" IPv6Address "]" / "*" / "*4" / "*6" - * with the new "*4" and "*6" productions creating a wildcard to match - * IPv4 or IPv6 addresses. - * - */ -int -tor_addr_parse_mask_ports(const char *s, - unsigned flags, - tor_addr_t *addr_out, - maskbits_t *maskbits_out, - uint16_t *port_min_out, uint16_t *port_max_out) -{ - char *base = NULL, *address, *mask = NULL, *port = NULL, *rbracket = NULL; - char *endptr; - int any_flag=0, v4map=0; - sa_family_t family; - struct in6_addr in6_tmp; - struct in_addr in_tmp; - - tor_assert(s); - tor_assert(addr_out); - - /** Longest possible length for an address, mask, and port-range combination. - * Includes IP, [], /mask, :, ports */ -#define MAX_ADDRESS_LENGTH (TOR_ADDR_BUF_LEN+2+(1+INET_NTOA_BUF_LEN)+12+1) - - if (strlen(s) > MAX_ADDRESS_LENGTH) { - log_warn(LD_GENERAL, "Impossibly long IP %s; rejecting", escaped(s)); - goto err; - } - base = tor_strdup(s); - - /* Break 'base' into separate strings. */ - address = base; - if (*address == '[') { /* Probably IPv6 */ - address++; - rbracket = strchr(address, ']'); - if (!rbracket) { - log_warn(LD_GENERAL, - "No closing IPv6 bracket in address pattern; rejecting."); - goto err; - } - } - mask = strchr((rbracket?rbracket:address),'/'); - port = strchr((mask?mask:(rbracket?rbracket:address)), ':'); - if (port) - *port++ = '\0'; - if (mask) - *mask++ = '\0'; - if (rbracket) - *rbracket = '\0'; - if (port && mask) - tor_assert(port > mask); - if (mask && rbracket) - tor_assert(mask > rbracket); - - /* Now "address" is the a.b.c.d|'*'|abcd::1 part... - * "mask" is the Mask|Maskbits part... - * and "port" is the *|port|min-max part. - */ - - /* Process the address portion */ - memset(addr_out, 0, sizeof(tor_addr_t)); - - if (!strcmp(address, "*")) { - if (flags & TAPMP_EXTENDED_STAR) { - family = AF_UNSPEC; - tor_addr_make_unspec(addr_out); - } else { - family = AF_INET; - tor_addr_from_ipv4h(addr_out, 0); - } - any_flag = 1; - } else if (!strcmp(address, "*4") && (flags & TAPMP_EXTENDED_STAR)) { - family = AF_INET; - tor_addr_from_ipv4h(addr_out, 0); - any_flag = 1; - } else if (!strcmp(address, "*6") && (flags & TAPMP_EXTENDED_STAR)) { - static char nil_bytes[16] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; - family = AF_INET6; - tor_addr_from_ipv6_bytes(addr_out, nil_bytes); - any_flag = 1; - } else if (tor_inet_pton(AF_INET6, address, &in6_tmp) > 0) { - family = AF_INET6; - tor_addr_from_in6(addr_out, &in6_tmp); - } else if (tor_inet_pton(AF_INET, address, &in_tmp) > 0) { - family = AF_INET; - tor_addr_from_in(addr_out, &in_tmp); - } else { - log_warn(LD_GENERAL, "Malformed IP %s in address pattern; rejecting.", - escaped(address)); - goto err; - } - - v4map = tor_addr_is_v4(addr_out); - - /* Parse mask */ - if (maskbits_out) { - int bits = 0; - struct in_addr v4mask; - - if (mask) { /* the caller (tried to) specify a mask */ - bits = (int) strtol(mask, &endptr, 10); - if (!*endptr) { /* strtol converted everything, so it was an integer */ - if ((bits<0 || bits>128) || - (family == AF_INET && bits > 32)) { - log_warn(LD_GENERAL, - "Bad number of mask bits (%d) on address range; rejecting.", - bits); - goto err; - } - } else { /* mask might still be an address-style mask */ - if (tor_inet_pton(AF_INET, mask, &v4mask) > 0) { - bits = addr_mask_get_bits(ntohl(v4mask.s_addr)); - if (bits < 0) { - log_warn(LD_GENERAL, - "IPv4-style mask %s is not a prefix address; rejecting.", - escaped(mask)); - goto err; - } - } else { /* Not IPv4; we don't do address-style IPv6 masks. */ - log_warn(LD_GENERAL, - "Malformed mask on address range %s; rejecting.", - escaped(s)); - goto err; - } - } - if (family == AF_INET6 && v4map) { - if (bits > 32 && bits < 96) { /* Crazy */ - log_warn(LD_GENERAL, - "Bad mask bits %d for V4-mapped V6 address; rejecting.", - bits); - goto err; - } - /* XXXX_IP6 is this really what we want? */ - bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */ - } - } else { /* pick an appropriate mask, as none was given */ - if (any_flag) - bits = 0; /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */ - else if (tor_addr_family(addr_out) == AF_INET) - bits = 32; - else if (tor_addr_family(addr_out) == AF_INET6) - bits = 128; - } - *maskbits_out = (maskbits_t) bits; - } else { - if (mask) { - log_warn(LD_GENERAL, - "Unexpected mask in address %s; rejecting", escaped(s)); - goto err; - } - } - - /* Parse port(s) */ - if (port_min_out) { - uint16_t port2; - if (!port_max_out) /* caller specified one port; fake the second one */ - port_max_out = &port2; - - if (parse_port_range(port, port_min_out, port_max_out) < 0) { - goto err; - } else if ((*port_min_out != *port_max_out) && port_max_out == &port2) { - log_warn(LD_GENERAL, - "Wanted one port from address range, but there are two."); - - port_max_out = NULL; /* caller specified one port, so set this back */ - goto err; - } - } else { - if (port) { - log_warn(LD_GENERAL, - "Unexpected ports in address %s; rejecting", escaped(s)); - goto err; - } - } - - tor_free(base); - return tor_addr_family(addr_out); - err: - tor_free(base); - return -1; -} - -/** Determine whether an address is IPv4, either native or IPv4-mapped IPv6. - * Note that this is about representation only, as any decent stack will - * reject IPv4-mapped addresses received on the wire (and won't use them - * on the wire either). - */ -int -tor_addr_is_v4(const tor_addr_t *addr) -{ - tor_assert(addr); - - if (tor_addr_family(addr) == AF_INET) - return 1; - - if (tor_addr_family(addr) == AF_INET6) { - /* First two don't need to be ordered */ - uint32_t *a32 = tor_addr_to_in6_addr32(addr); - if (a32[0] == 0 && a32[1] == 0 && ntohl(a32[2]) == 0x0000ffffu) - return 1; - } - - return 0; /* Not IPv4 - unknown family or a full-blood IPv6 address */ -} - -/** Determine whether an address addr is null, either all zeroes or - * belonging to family AF_UNSPEC. - */ -int -tor_addr_is_null(const tor_addr_t *addr) -{ - tor_assert(addr); - - switch (tor_addr_family(addr)) { - case AF_INET6: { - uint32_t *a32 = tor_addr_to_in6_addr32(addr); - return (a32[0] == 0) && (a32[1] == 0) && (a32[2] == 0) && (a32[3] == 0); - } - case AF_INET: - return (tor_addr_to_ipv4n(addr) == 0); - case AF_UNSPEC: - return 1; - default: - log_warn(LD_BUG, "Called with unknown address family %d", - (int)tor_addr_family(addr)); - return 0; - } - //return 1; -} - -/** Return true iff addr is a loopback address */ -int -tor_addr_is_loopback(const tor_addr_t *addr) -{ - tor_assert(addr); - switch (tor_addr_family(addr)) { - case AF_INET6: { - /* ::1 */ - uint32_t *a32 = tor_addr_to_in6_addr32(addr); - return (a32[0] == 0) && (a32[1] == 0) && (a32[2] == 0) && - (ntohl(a32[3]) == 1); - } - case AF_INET: - /* 127.0.0.1 */ - return (tor_addr_to_ipv4h(addr) & 0xff000000) == 0x7f000000; - case AF_UNSPEC: - return 0; - default: - tor_fragile_assert(); - return 0; - } -} - -/** Set dest to equal the IPv4 address in v4addr (given in - * network order). */ -void -tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr) -{ - tor_assert(dest); - memset(dest, 0, sizeof(tor_addr_t)); - dest->family = AF_INET; - dest->addr.in_addr.s_addr = v4addr; -} - -/** Set dest to equal the IPv6 address in the 16 bytes at - * ipv6_bytes. */ -void -tor_addr_from_ipv6_bytes(tor_addr_t *dest, const char *ipv6_bytes) -{ - tor_assert(dest); - tor_assert(ipv6_bytes); - memset(dest, 0, sizeof(tor_addr_t)); - dest->family = AF_INET6; - memcpy(dest->addr.in6_addr.s6_addr, ipv6_bytes, 16); -} - -/** Set dest equal to the IPv6 address in the in6_addr in6. */ -void -tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6) -{ - tor_addr_from_ipv6_bytes(dest, (const char*)in6->s6_addr); -} - -/** Copy a tor_addr_t from src to dest. - */ -void -tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src) -{ - if (src == dest) - return; - tor_assert(src); - tor_assert(dest); - memcpy(dest, src, sizeof(tor_addr_t)); -} - -/** Given two addresses addr1 and addr2, return 0 if the two - * addresses are equivalent under the mask mbits, less than 0 if addr1 - * precedes addr2, and greater than 0 otherwise. - * - * Different address families (IPv4 vs IPv6) are always considered unequal if - * how is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are - * considered equivalent to their IPv4 equivalents. - */ -int -tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2, - tor_addr_comparison_t how) -{ - return tor_addr_compare_masked(addr1, addr2, 128, how); -} - -/** As tor_addr_compare(), but only looks at the first mask bits of - * the address. - * - * Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32. - * - * The mask is interpreted relative to addr1, so that if a is - * \::ffff:1.2.3.4, and b is 3.4.5.6, - * tor_addr_compare_masked(a,b,100,CMP_SEMANTIC) is the same as - * -tor_addr_compare_masked(b,a,4,CMP_SEMANTIC). - * - * We guarantee that the ordering from tor_addr_compare_masked is a total - * order on addresses, but not that it is any particular order, or that it - * will be the same from one version to the next. - */ -int -tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, - maskbits_t mbits, tor_addr_comparison_t how) -{ - /** Helper: Evaluates to -1 if a is less than b, 0 if a equals b, or 1 if a - * is greater than b. May evaluate a and b more than once. */ -#define TRISTATE(a,b) (((a)<(b))?-1: (((a)==(b))?0:1)) - sa_family_t family1, family2, v_family1, v_family2; - - tor_assert(addr1 && addr2); - - v_family1 = family1 = tor_addr_family(addr1); - v_family2 = family2 = tor_addr_family(addr2); - - if (family1==family2) { - /* When the families are the same, there's only one way to do the - * comparison: exactly. */ - int r; - switch (family1) { - case AF_UNSPEC: - return 0; /* All unspecified addresses are equal */ - case AF_INET: { - uint32_t a1 = tor_addr_to_ipv4h(addr1); - uint32_t a2 = tor_addr_to_ipv4h(addr2); - if (mbits <= 0) - return 0; - if (mbits > 32) - mbits = 32; - a1 >>= (32-mbits); - a2 >>= (32-mbits); - r = TRISTATE(a1, a2); - return r; - } - case AF_INET6: { - const uint8_t *a1 = tor_addr_to_in6_addr8(addr1); - const uint8_t *a2 = tor_addr_to_in6_addr8(addr2); - const int bytes = mbits >> 3; - const int leftover_bits = mbits & 7; - if (bytes && (r = tor_memcmp(a1, a2, bytes))) { - return r; - } else if (leftover_bits) { - uint8_t b1 = a1[bytes] >> (8-leftover_bits); - uint8_t b2 = a2[bytes] >> (8-leftover_bits); - return TRISTATE(b1, b2); - } else { - return 0; - } - } - default: - tor_fragile_assert(); - return 0; - } - } else if (how == CMP_EXACT) { - /* Unequal families and an exact comparison? Stop now! */ - return TRISTATE(family1, family2); - } - - if (mbits == 0) - return 0; - - if (family1 == AF_INET6 && tor_addr_is_v4(addr1)) - v_family1 = AF_INET; - if (family2 == AF_INET6 && tor_addr_is_v4(addr2)) - v_family2 = AF_INET; - if (v_family1 == v_family2) { - /* One or both addresses are a mapped ipv4 address. */ - uint32_t a1, a2; - if (family1 == AF_INET6) { - a1 = tor_addr_to_mapped_ipv4h(addr1); - if (mbits <= 96) - return 0; - mbits -= 96; /* We just decided that the first 96 bits of a1 "match". */ - } else { - a1 = tor_addr_to_ipv4h(addr1); - } - if (family2 == AF_INET6) { - a2 = tor_addr_to_mapped_ipv4h(addr2); - } else { - a2 = tor_addr_to_ipv4h(addr2); - } - if (mbits <= 0) return 0; - if (mbits > 32) mbits = 32; - a1 >>= (32-mbits); - a2 >>= (32-mbits); - return TRISTATE(a1, a2); - } else { - /* Unequal families, and semantic comparison, and no semantic family - * matches. */ - return TRISTATE(family1, family2); - } -} - -/** Return a hash code based on the address addr */ -unsigned int -tor_addr_hash(const tor_addr_t *addr) -{ - switch (tor_addr_family(addr)) { - case AF_INET: - return tor_addr_to_ipv4h(addr); - case AF_UNSPEC: - return 0x4e4d5342; - case AF_INET6: { - const uint32_t *u = tor_addr_to_in6_addr32(addr); - return u[0] + u[1] + u[2] + u[3]; - } - default: - tor_fragile_assert(); - return 0; - } -} - -/** Return a newly allocated string with a representation of addr. */ -char * -tor_dup_addr(const tor_addr_t *addr) -{ - char buf[TOR_ADDR_BUF_LEN]; - if (tor_addr_to_str(buf, addr, sizeof(buf), 0)) { - return tor_strdup(buf); - } else { - return tor_strdup(""); - } -} - -/** Return a string representing the address addr. This string - * is statically allocated, and must not be freed. Each call to - * fmt_addr_impl invalidates the last result of the function. - * This function is not thread-safe. If decorate is set, add - * brackets to IPv6 addresses. - * - * It's better to use the wrapper macros of this function: - * fmt_addr() and fmt_and_decorate_addr(). - */ -const char * -fmt_addr_impl(const tor_addr_t *addr, int decorate) -{ - static char buf[TOR_ADDR_BUF_LEN]; - if (!addr) return ""; - if (tor_addr_to_str(buf, addr, sizeof(buf), decorate)) - return buf; - else - return "???"; -} - -/** Return a string representing the pair addr and port. - * This calls fmt_and_decorate_addr internally, so IPv6 addresses will - * have brackets, and the caveats of fmt_addr_impl apply. - */ -const char * -fmt_addrport(const tor_addr_t *addr, uint16_t port) -{ - /* Add space for a colon and up to 5 digits. */ - static char buf[TOR_ADDR_BUF_LEN + 6]; - tor_snprintf(buf, sizeof(buf), "%s:%u", fmt_and_decorate_addr(addr), port); - return buf; -} - -/** Like fmt_addr(), but takes addr as a host-order IPv4 - * addresses. Also not thread-safe, also clobbers its return buffer on - * repeated calls. */ -const char * -fmt_addr32(uint32_t addr) -{ - static char buf[INET_NTOA_BUF_LEN]; - struct in_addr in; - in.s_addr = htonl(addr); - tor_inet_ntoa(&in, buf, sizeof(buf)); - return buf; -} - -/** Convert the string in src to a tor_addr_t addr. The string - * may be an IPv4 address, an IPv6 address, or an IPv6 address surrounded by - * square brackets. - * - * Return an address family on success, or -1 if an invalid address string is - * provided. */ -int -tor_addr_parse(tor_addr_t *addr, const char *src) -{ - char *tmp = NULL; /* Holds substring if we got a dotted quad. */ - int result; - struct in_addr in_tmp; - struct in6_addr in6_tmp; - tor_assert(addr && src); - if (src[0] == '[' && src[1]) - src = tmp = tor_strndup(src+1, strlen(src)-2); - - if (tor_inet_pton(AF_INET6, src, &in6_tmp) > 0) { - result = AF_INET6; - tor_addr_from_in6(addr, &in6_tmp); - } else if (tor_inet_pton(AF_INET, src, &in_tmp) > 0) { - result = AF_INET; - tor_addr_from_in(addr, &in_tmp); - } else { - result = -1; - } - - tor_free(tmp); - return result; -} - -/** Parse an address or address-port combination from s, resolve the - * address as needed, and put the result in addr_out and (optionally) - * port_out. Return 0 on success, negative on failure. */ -int -tor_addr_port_lookup(const char *s, tor_addr_t *addr_out, uint16_t *port_out) -{ - const char *port; - tor_addr_t addr; - uint16_t portval; - char *tmp = NULL; - - tor_assert(s); - tor_assert(addr_out); - - s = eat_whitespace(s); - - if (*s == '[') { - port = strstr(s, "]"); - if (!port) - goto err; - tmp = tor_strndup(s+1, port-(s+1)); - port = port+1; - if (*port == ':') - port++; - else - port = NULL; - } else { - port = strchr(s, ':'); - if (port) - tmp = tor_strndup(s, port-s); - else - tmp = tor_strdup(s); - if (port) - ++port; - } - - if (tor_addr_lookup(tmp, AF_UNSPEC, &addr) != 0) - goto err; - tor_free(tmp); - - if (port) { - portval = (int) tor_parse_long(port, 10, 1, 65535, NULL, NULL); - if (!portval) - goto err; - } else { - portval = 0; - } - - if (port_out) - *port_out = portval; - tor_addr_copy(addr_out, &addr); - - return 0; - err: - tor_free(tmp); - return -1; -} - -#ifdef _WIN32 -typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)( - ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG); -#endif - -/** Try to ask our network interfaces what addresses they are bound to. - * Return a new smartlist of tor_addr_t on success, and NULL on failure. - * (An empty smartlist indicates that we successfully learned that we have no - * addresses.) Log failure messages at severity. */ -static smartlist_t * -get_interface_addresses_raw(int severity) -{ -#if defined(HAVE_GETIFADDRS) - /* Most free Unixy systems provide getifaddrs, which gives us a linked list - * of struct ifaddrs. */ - struct ifaddrs *ifa = NULL; - const struct ifaddrs *i; - smartlist_t *result; - if (getifaddrs(&ifa) < 0) { - log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s", - strerror(errno)); - return NULL; - } - - result = smartlist_new(); - for (i = ifa; i; i = i->ifa_next) { - tor_addr_t tmp; - if ((i->ifa_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING)) - continue; - if (!i->ifa_addr) - continue; - if (i->ifa_addr->sa_family != AF_INET && - i->ifa_addr->sa_family != AF_INET6) - continue; - if (tor_addr_from_sockaddr(&tmp, i->ifa_addr, NULL) < 0) - continue; - smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); - } - - freeifaddrs(ifa); - return result; -#elif defined(_WIN32) - /* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a - "GetAdaptersInfo", but that's deprecated; let's just try - GetAdaptersAddresses and fall back to connect+getsockname. - */ - HANDLE lib = load_windows_system_library(TEXT("iphlpapi.dll")); - smartlist_t *result = NULL; - GetAdaptersAddresses_fn_t fn; - ULONG size, res; - IP_ADAPTER_ADDRESSES *addresses = NULL, *address; - - (void) severity; - -#define FLAGS (GAA_FLAG_SKIP_ANYCAST | \ - GAA_FLAG_SKIP_MULTICAST | \ - GAA_FLAG_SKIP_DNS_SERVER) - - if (!lib) { - log_fn(severity, LD_NET, "Unable to load iphlpapi.dll"); - goto done; - } - - if (!(fn = (GetAdaptersAddresses_fn_t) - GetProcAddress(lib, "GetAdaptersAddresses"))) { - log_fn(severity, LD_NET, "Unable to obtain pointer to " - "GetAdaptersAddresses"); - goto done; - } - - /* Guess how much space we need. */ - size = 15*1024; - addresses = tor_malloc(size); - res = fn(AF_UNSPEC, FLAGS, NULL, addresses, &size); - if (res == ERROR_BUFFER_OVERFLOW) { - /* we didn't guess that we needed enough space; try again */ - tor_free(addresses); - addresses = tor_malloc(size); - res = fn(AF_UNSPEC, FLAGS, NULL, addresses, &size); - } - if (res != NO_ERROR) { - log_fn(severity, LD_NET, "GetAdaptersAddresses failed (result: %lu)", res); - goto done; - } - - result = smartlist_new(); - for (address = addresses; address; address = address->Next) { - IP_ADAPTER_UNICAST_ADDRESS *a; - for (a = address->FirstUnicastAddress; a; a = a->Next) { - /* Yes, it's a linked list inside a linked list */ - struct sockaddr *sa = a->Address.lpSockaddr; - tor_addr_t tmp; - if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) - continue; - if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0) - continue; - smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); - } - } - - done: - if (lib) - FreeLibrary(lib); - tor_free(addresses); - return result; -#elif defined(SIOCGIFCONF) && defined(HAVE_IOCTL) - /* Some older unixy systems make us use ioctl(SIOCGIFCONF) */ - struct ifconf ifc; - int fd, i, sz, n; - smartlist_t *result = NULL; - /* This interface, AFAICT, only supports AF_INET addresses */ - fd = socket(AF_INET, SOCK_DGRAM, 0); - if (fd < 0) { - tor_log(severity, LD_NET, "socket failed: %s", strerror(errno)); - goto done; - } - /* Guess how much space we need. */ - ifc.ifc_len = sz = 15*1024; - ifc.ifc_ifcu.ifcu_req = tor_malloc(sz); - if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) { - tor_log(severity, LD_NET, "ioctl failed: %s", strerror(errno)); - close(fd); - goto done; - } - close(fd); - result = smartlist_new(); - if (ifc.ifc_len < sz) - sz = ifc.ifc_len; - n = sz / sizeof(struct ifreq); - for (i = 0; i < n ; ++i) { - struct ifreq *r = &ifc.ifc_ifcu.ifcu_req[i]; - struct sockaddr *sa = &r->ifr_addr; - tor_addr_t tmp; - if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) - continue; /* should be impossible */ - if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0) - continue; - smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); - } - done: - tor_free(ifc.ifc_ifcu.ifcu_req); - return result; -#else - (void) severity; - return NULL; -#endif -} - -/** Return true iff a is a multicast address. */ -static int -tor_addr_is_multicast(const tor_addr_t *a) -{ - sa_family_t family = tor_addr_family(a); - if (family == AF_INET) { - uint32_t ipv4h = tor_addr_to_ipv4h(a); - if ((ipv4h >> 24) == 0xe0) - return 1; /* Multicast */ - } else if (family == AF_INET6) { - const uint8_t *a32 = tor_addr_to_in6_addr8(a); - if (a32[0] == 0xff) - return 1; - } - return 0; -} - -/** Set *addr to the IP address (if any) of whatever interface - * connects to the Internet. This address should only be used in checking - * whether our address has changed. Return 0 on success, -1 on failure. - */ -int -get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr) -{ - /* XXX really, this function should yield a smartlist of addresses. */ - smartlist_t *addrs; - int sock=-1, r=-1; - struct sockaddr_storage my_addr, target_addr; - socklen_t addr_len; - tor_assert(addr); - - /* Try to do this the smart way if possible. */ - if ((addrs = get_interface_addresses_raw(severity))) { - int rv = -1; - SMARTLIST_FOREACH_BEGIN(addrs, tor_addr_t *, a) { - if (family != AF_UNSPEC && family != tor_addr_family(a)) - continue; - if (tor_addr_is_loopback(a) || - tor_addr_is_multicast(a)) - continue; - - tor_addr_copy(addr, a); - rv = 0; - - /* If we found a non-internal address, declare success. Otherwise, - * keep looking. */ - if (!tor_addr_is_internal(a, 0)) - break; - } SMARTLIST_FOREACH_END(a); - - SMARTLIST_FOREACH(addrs, tor_addr_t *, a, tor_free(a)); - smartlist_free(addrs); - return rv; - } - - /* Okay, the smart way is out. */ - memset(addr, 0, sizeof(tor_addr_t)); - memset(&target_addr, 0, sizeof(target_addr)); - /* Don't worry: no packets are sent. We just need to use a real address - * on the actual Internet. */ - if (family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&target_addr; - /* Use the "discard" service port */ - sin6->sin6_port = htons(9); - sock = tor_open_socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP); - addr_len = (socklen_t)sizeof(struct sockaddr_in6); - sin6->sin6_family = AF_INET6; - S6_ADDR16(sin6->sin6_addr)[0] = htons(0x2002); /* 2002:: */ - } else if (family == AF_INET) { - struct sockaddr_in *sin = (struct sockaddr_in*)&target_addr; - /* Use the "discard" service port */ - sin->sin_port = htons(9); - sock = tor_open_socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); - addr_len = (socklen_t)sizeof(struct sockaddr_in); - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = htonl(0x12000001); /* 18.0.0.1 */ - } else { - return -1; - } - if (sock < 0) { - int e = tor_socket_errno(-1); - log_fn(severity, LD_NET, "unable to create socket: %s", - tor_socket_strerror(e)); - goto err; - } - - if (connect(sock,(struct sockaddr *)&target_addr, addr_len) < 0) { - int e = tor_socket_errno(sock); - log_fn(severity, LD_NET, "connect() failed: %s", tor_socket_strerror(e)); - goto err; - } - - if (getsockname(sock,(struct sockaddr*)&my_addr, &addr_len)) { - int e = tor_socket_errno(sock); - log_fn(severity, LD_NET, "getsockname() to determine interface failed: %s", - tor_socket_strerror(e)); - goto err; - } - - tor_addr_from_sockaddr(addr, (struct sockaddr*)&my_addr, NULL); - r=0; - err: - if (sock >= 0) - tor_close_socket(sock); - return r; -} - -/* ====== - * IPv4 helpers - * XXXX024 IPv6 deprecate some of these. - */ - -/** Return true iff ip (in host order) is an IP reserved to localhost, - * or reserved for local networks by RFC 1918. - */ -int -is_internal_IP(uint32_t ip, int for_listening) -{ - tor_addr_t myaddr; - myaddr.family = AF_INET; - myaddr.addr.in_addr.s_addr = htonl(ip); - - return tor_addr_is_internal(&myaddr, for_listening); -} - -/** Given an address of the form "ip:port", try to divide it into its - * ip and port portions, setting *address_out to a newly - * allocated string holding the address portion and *port_out - * to the port. - * - * Don't do DNS lookups and don't allow domain names in the field. - * Don't accept addrport of the form "" or ":0". - * - * Return 0 on success, -1 on failure. */ -int -tor_addr_port_parse(int severity, const char *addrport, - tor_addr_t *address_out, uint16_t *port_out) -{ - int retval = -1; - int r; - char *addr_tmp = NULL; - - tor_assert(addrport); - tor_assert(address_out); - tor_assert(port_out); - - r = tor_addr_port_split(severity, addrport, &addr_tmp, port_out); - if (r < 0) - goto done; - - if (!*port_out) - goto done; - - /* make sure that address_out is an IP address */ - if (tor_addr_parse(address_out, addr_tmp) < 0) - goto done; - - retval = 0; - - done: - tor_free(addr_tmp); - return retval; -} - -/** Given an address of the form "host[:port]", try to divide it into its host - * ane port portions, setting *address_out to a newly allocated string - * holding the address portion and *port_out to the port (or 0 if no - * port is given). Return 0 on success, -1 on failure. */ -int -tor_addr_port_split(int severity, const char *addrport, - char **address_out, uint16_t *port_out) -{ - tor_assert(addrport); - tor_assert(address_out); - tor_assert(port_out); - return addr_port_lookup(severity, addrport, address_out, NULL, port_out); -} - -/** Parse a string of the form "host[:port]" from addrport. If - * address is provided, set *address to a copy of the - * host portion of the string. If addr is provided, try to - * resolve the host portion of the string and store it into - * *addr (in host byte order). If port_out is provided, - * store the port number into *port_out, or 0 if no port is given. - * If port_out is NULL, then there must be no port number in - * addrport. - * Return 0 on success, -1 on failure. - */ -int -addr_port_lookup(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out) -{ - const char *colon; - char *address_ = NULL; - int port_; - int ok = 1; - - tor_assert(addrport); - - colon = strrchr(addrport, ':'); - if (colon) { - address_ = tor_strndup(addrport, colon-addrport); - port_ = (int) tor_parse_long(colon+1,10,1,65535,NULL,NULL); - if (!port_) { - log_fn(severity, LD_GENERAL, "Port %s out of range", escaped(colon+1)); - ok = 0; - } - if (!port_out) { - char *esc_addrport = esc_for_log(addrport); - log_fn(severity, LD_GENERAL, - "Port %s given on %s when not required", - escaped(colon+1), esc_addrport); - tor_free(esc_addrport); - ok = 0; - } - } else { - address_ = tor_strdup(addrport); - port_ = 0; - } - - if (addr) { - /* There's an addr pointer, so we need to resolve the hostname. */ - if (tor_lookup_hostname(address_,addr)) { - log_fn(severity, LD_NET, "Couldn't look up %s", escaped(address_)); - ok = 0; - *addr = 0; - } - } - - if (address && ok) { - *address = address_; - } else { - if (address) - *address = NULL; - tor_free(address_); - } - if (port_out) - *port_out = ok ? ((uint16_t) port_) : 0; - - return ok ? 0 : -1; -} - -/** If mask is an address mask for a bit-prefix, return the number of - * bits. Otherwise, return -1. */ -int -addr_mask_get_bits(uint32_t mask) -{ - int i; - if (mask == 0) - return 0; - if (mask == 0xFFFFFFFFu) - return 32; - for (i=0; i<=32; ++i) { - if (mask == (uint32_t) ~((1u<<(32-i))-1)) { - return i; - } - } - return -1; -} - -/** Parse a string s in the format of (*|port(-maxport)?)?, setting the - * various *out pointers as appropriate. Return 0 on success, -1 on failure. - */ -int -parse_port_range(const char *port, uint16_t *port_min_out, - uint16_t *port_max_out) -{ - int port_min, port_max, ok; - tor_assert(port_min_out); - tor_assert(port_max_out); - - if (!port || *port == '\0' || strcmp(port, "*") == 0) { - port_min = 1; - port_max = 65535; - } else { - char *endptr = NULL; - port_min = (int)tor_parse_long(port, 10, 0, 65535, &ok, &endptr); - if (!ok) { - log_warn(LD_GENERAL, - "Malformed port %s on address range; rejecting.", - escaped(port)); - return -1; - } else if (endptr && *endptr == '-') { - port = endptr+1; - endptr = NULL; - port_max = (int)tor_parse_long(port, 10, 1, 65535, &ok, &endptr); - if (!ok) { - log_warn(LD_GENERAL, - "Malformed port %s on address range; rejecting.", - escaped(port)); - return -1; - } - } else { - port_max = port_min; - } - if (port_min > port_max) { - log_warn(LD_GENERAL, "Insane port range on address policy; rejecting."); - return -1; - } - } - - if (port_min < 1) - port_min = 1; - if (port_max > 65535) - port_max = 65535; - - *port_min_out = (uint16_t) port_min; - *port_max_out = (uint16_t) port_max; - - return 0; -} - -/** Given an IPv4 in_addr struct *in (in network order, as usual), - * write it as a string into the buf_len-byte buffer in - * buf. - */ -int -tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len) -{ - uint32_t a = ntohl(in->s_addr); - return tor_snprintf(buf, buf_len, "%d.%d.%d.%d", - (int)(uint8_t)((a>>24)&0xff), - (int)(uint8_t)((a>>16)&0xff), - (int)(uint8_t)((a>>8 )&0xff), - (int)(uint8_t)((a )&0xff)); -} - -/** Given a host-order addr, call tor_inet_ntop() on it - * and return a strdup of the resulting address. - */ -char * -tor_dup_ip(uint32_t addr) -{ - char buf[TOR_ADDR_BUF_LEN]; - struct in_addr in; - - in.s_addr = htonl(addr); - tor_inet_ntop(AF_INET, &in, buf, sizeof(buf)); - return tor_strdup(buf); -} - -/** - * Set *addr to the host-order IPv4 address (if any) of whatever - * interface connects to the Internet. This address should only be used in - * checking whether our address has changed. Return 0 on success, -1 on - * failure. - */ -int -get_interface_address(int severity, uint32_t *addr) -{ - tor_addr_t local_addr; - int r; - - r = get_interface_address6(severity, AF_INET, &local_addr); - if (r>=0) - *addr = tor_addr_to_ipv4h(&local_addr); - return r; -} - -/** Return true if we can tell that name is a canonical name for the - * loopback address. */ -int -tor_addr_hostname_is_local(const char *name) -{ - return !strcasecmp(name, "localhost") || - !strcasecmp(name, "local") || - !strcasecmpend(name, ".local"); -} - -/** Return a newly allocated tor_addr_port_t with addr and - port filled in. */ -tor_addr_port_t * -tor_addr_port_new(const tor_addr_t *addr, uint16_t port) -{ - tor_addr_port_t *ap = tor_malloc_zero(sizeof(tor_addr_port_t)); - if (addr) - tor_addr_copy(&ap->addr, addr); - ap->port = port; - return ap; -} - diff --git a/src/tor/address.h b/src/tor/address.h deleted file mode 100644 index 87909a32a..000000000 --- a/src/tor/address.h +++ /dev/null @@ -1,232 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file address.h - * \brief Headers for address.h - **/ - -#ifndef TOR_ADDRESS_H -#define TOR_ADDRESS_H - -#include "orconfig.h" -#include "torint.h" -#include "tor_compat.h" - -/** The number of bits from an address to consider while doing a masked - * comparison. */ -typedef uint8_t maskbits_t; - -struct in_addr; -/** Holds an IPv4 or IPv6 address. (Uses less memory than struct - * sockaddr_storage.) */ -typedef struct tor_addr_t -{ - sa_family_t family; - union { - uint32_t dummy_; /* This field is here so we have something to initialize - * with a reliable cross-platform type. */ - struct in_addr in_addr; - struct in6_addr in6_addr; - } addr; -} tor_addr_t; - -/** Holds an IP address and a TCP/UDP port. */ -typedef struct tor_addr_port_t -{ - tor_addr_t addr; - uint16_t port; -} tor_addr_port_t; - -#define TOR_ADDR_NULL {AF_UNSPEC, {0}} - -static INLINE const struct in6_addr *tor_addr_to_in6(const tor_addr_t *a); -static INLINE uint32_t tor_addr_to_ipv4n(const tor_addr_t *a); -static INLINE uint32_t tor_addr_to_ipv4h(const tor_addr_t *a); -static INLINE uint32_t tor_addr_to_mapped_ipv4h(const tor_addr_t *a); -static INLINE sa_family_t tor_addr_family(const tor_addr_t *a); -static INLINE const struct in_addr *tor_addr_to_in(const tor_addr_t *a); -static INLINE int tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u); - -socklen_t tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port, - struct sockaddr *sa_out, socklen_t len); -int tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, - uint16_t *port_out); -void tor_addr_make_unspec(tor_addr_t *a); -void tor_addr_make_null(tor_addr_t *a, sa_family_t family); -char *tor_sockaddr_to_str(const struct sockaddr *sa); - -/** Return an in6_addr* equivalent to a, or NULL if a is not - * an IPv6 address. */ -static INLINE const struct in6_addr * -tor_addr_to_in6(const tor_addr_t *a) -{ - return a->family == AF_INET6 ? &a->addr.in6_addr : NULL; -} - -/** Given an IPv6 address x, yield it as an array of uint8_t. - * - * Requires that x is actually an IPv6 address. - */ -#define tor_addr_to_in6_addr8(x) tor_addr_to_in6(x)->s6_addr -/** Given an IPv6 address x, yield it as an array of uint16_t. - * - * Requires that x is actually an IPv6 address. - */ -#define tor_addr_to_in6_addr16(x) S6_ADDR16(*tor_addr_to_in6(x)) -/** Given an IPv6 address x, yield it as an array of uint32_t. - * - * Requires that x is actually an IPv6 address. - */ -#define tor_addr_to_in6_addr32(x) S6_ADDR32(*tor_addr_to_in6(x)) - -/** Return an IPv4 address in network order for a, or 0 if - * a is not an IPv4 address. */ -static INLINE uint32_t -tor_addr_to_ipv4n(const tor_addr_t *a) -{ - return a->family == AF_INET ? a->addr.in_addr.s_addr : 0; -} -/** Return an IPv4 address in host order for a, or 0 if - * a is not an IPv4 address. */ -static INLINE uint32_t -tor_addr_to_ipv4h(const tor_addr_t *a) -{ - return ntohl(tor_addr_to_ipv4n(a)); -} -/** Given an IPv6 address, return its mapped IPv4 address in host order, or - * 0 if a is not an IPv6 address. - * - * (Does not check whether the address is really a mapped address */ -static INLINE uint32_t -tor_addr_to_mapped_ipv4h(const tor_addr_t *a) -{ - return a->family == AF_INET6 ? ntohl(tor_addr_to_in6_addr32(a)[3]) : 0; -} -/** Return the address family of a. Possible values are: - * AF_INET6, AF_INET, AF_UNSPEC. */ -static INLINE sa_family_t -tor_addr_family(const tor_addr_t *a) -{ - return a->family; -} -/** Return an in_addr* equivalent to a, or NULL if a is not - * an IPv4 address. */ -static INLINE const struct in_addr * -tor_addr_to_in(const tor_addr_t *a) -{ - return a->family == AF_INET ? &a->addr.in_addr : NULL; -} -/** Return true iff a is an IPv4 address equal to the host-ordered - * address in u. */ -static INLINE int -tor_addr_eq_ipv4h(const tor_addr_t *a, uint32_t u) -{ - return a->family == AF_INET ? (tor_addr_to_ipv4h(a) == u) : 0; -} - -/** Length of a buffer that you need to allocate to be sure you can encode - * any tor_addr_t. - * - * This allows enough space for - * "[ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255]", - * plus a terminating NUL. - */ -#define TOR_ADDR_BUF_LEN 48 - -int tor_addr_lookup(const char *name, uint16_t family, tor_addr_t *addr_out); -char *tor_dup_addr(const tor_addr_t *addr) ATTR_MALLOC; - -/** Wrapper function of fmt_addr_impl(). It does not decorate IPv6 - * addresses. */ -#define fmt_addr(a) fmt_addr_impl((a), 0) -/** Wrapper function of fmt_addr_impl(). It decorates IPv6 - * addresses. */ -#define fmt_and_decorate_addr(a) fmt_addr_impl((a), 1) -const char *fmt_addr_impl(const tor_addr_t *addr, int decorate); -const char *fmt_addrport(const tor_addr_t *addr, uint16_t port); -const char * fmt_addr32(uint32_t addr); -int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr); - -/** Flag to specify how to do a comparison between addresses. In an "exact" - * comparison, addresses are equivalent only if they are in the same family - * with the same value. In a "semantic" comparison, IPv4 addresses match all - * IPv6 encodings of those addresses. */ -typedef enum { - CMP_EXACT, - CMP_SEMANTIC, -} tor_addr_comparison_t; - -int tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2, - tor_addr_comparison_t how); -int tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, - maskbits_t mask, tor_addr_comparison_t how); -/** Return true iff a and b are the same address. The comparison is done - * "exactly". */ -#define tor_addr_eq(a,b) (0==tor_addr_compare((a),(b),CMP_EXACT)) - -unsigned int tor_addr_hash(const tor_addr_t *addr); -int tor_addr_is_v4(const tor_addr_t *addr); -int tor_addr_is_internal_(const tor_addr_t *ip, int for_listening, - const char *filename, int lineno); -#define tor_addr_is_internal(addr, for_listening) \ - tor_addr_is_internal_((addr), (for_listening), SHORT_FILE__, __LINE__) - -/** Longest length that can be required for a reverse lookup name. */ -/* 32 nybbles, 32 dots, 8 characters of "ip6.arpa", 1 NUL: 73 characters. */ -#define REVERSE_LOOKUP_NAME_BUF_LEN 73 -int tor_addr_to_PTR_name(char *out, size_t outlen, - const tor_addr_t *addr); -int tor_addr_parse_PTR_name(tor_addr_t *result, const char *address, - int family, int accept_regular); - -int tor_addr_port_lookup(const char *s, tor_addr_t *addr_out, - uint16_t *port_out); -#define TAPMP_EXTENDED_STAR 1 -int tor_addr_parse_mask_ports(const char *s, unsigned flags, - tor_addr_t *addr_out, maskbits_t *mask_out, - uint16_t *port_min_out, uint16_t *port_max_out); -const char * tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, - int decorate); -int tor_addr_parse(tor_addr_t *addr, const char *src); -void tor_addr_copy(tor_addr_t *dest, const tor_addr_t *src); -void tor_addr_from_ipv4n(tor_addr_t *dest, uint32_t v4addr); -/** Set dest to the IPv4 address encoded in v4addr in host - * order. */ -#define tor_addr_from_ipv4h(dest, v4addr) \ - tor_addr_from_ipv4n((dest), htonl(v4addr)) -void tor_addr_from_ipv6_bytes(tor_addr_t *dest, const char *bytes); -/** Set dest to the IPv4 address incoded in in. */ -#define tor_addr_from_in(dest, in) \ - tor_addr_from_ipv4n((dest), (in)->s_addr); -void tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6); -int tor_addr_is_null(const tor_addr_t *addr); -int tor_addr_is_loopback(const tor_addr_t *addr); - -int tor_addr_port_split(int severity, const char *addrport, - char **address_out, uint16_t *port_out); - -int tor_addr_port_parse(int severity, const char *addrport, - tor_addr_t *address_out, uint16_t *port_out); - -int tor_addr_hostname_is_local(const char *name); - -/* IPv4 helpers */ -int is_internal_IP(uint32_t ip, int for_listening); -int addr_port_lookup(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out); -int parse_port_range(const char *port, uint16_t *port_min_out, - uint16_t *port_max_out); -int addr_mask_get_bits(uint32_t mask); -/** Length of a buffer to allocate to hold the results of tor_inet_ntoa.*/ -#define INET_NTOA_BUF_LEN 16 -int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len); -char *tor_dup_ip(uint32_t addr) ATTR_MALLOC; -int get_interface_address(int severity, uint32_t *addr); - -tor_addr_port_t *tor_addr_port_new(const tor_addr_t *addr, uint16_t port); - -#endif - diff --git a/src/tor/addressmap.c b/src/tor/addressmap.c deleted file mode 100644 index 9bc79bd84..000000000 --- a/src/tor/addressmap.c +++ /dev/null @@ -1,1078 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define ADDRESSMAP_PRIVATE - -#include "or.h" -#include "addressmap.h" -#include "circuituse.h" -#include "config.h" -#include "connection_edge.h" -#include "control.h" -#include "dns.h" -#include "routerset.h" -#include "nodelist.h" - -/** A client-side struct to remember requests to rewrite addresses - * to new addresses. These structs are stored in the hash table - * "addressmap" below. - * - * There are 5 ways to set an address mapping: - * - A MapAddress command from the controller [permanent] - * - An AddressMap directive in the torrc [permanent] - * - When a TrackHostExits torrc directive is triggered [temporary] - * - When a DNS resolve succeeds [temporary] - * - When a DNS resolve fails [temporary] - * - * When an addressmap request is made but one is already registered, - * the new one is replaced only if the currently registered one has - * no "new_address" (that is, it's in the process of DNS resolve), - * or if the new one is permanent (expires==0 or 1). - * - * (We overload the 'expires' field, using "0" for mappings set via - * the configuration file, "1" for mappings set from the control - * interface, and other values for DNS and TrackHostExit mappings that can - * expire.) - * - * A mapping may be 'wildcarded'. If "src_wildcard" is true, then - * any address that ends with a . followed by the key for this entry will - * get remapped by it. If "dst_wildcard" is also true, then only the - * matching suffix of such addresses will get replaced by new_address. - */ -typedef struct { - char *new_address; - time_t expires; - ENUM_BF(addressmap_entry_source_t) source:3; - unsigned src_wildcard:1; - unsigned dst_wildcard:1; - short num_resolve_failures; -} addressmap_entry_t; - -/** Entry for mapping addresses to which virtual address we mapped them to. */ -typedef struct { - char *ipv4_address; - char *ipv6_address; - char *hostname_address; -} virtaddress_entry_t; - -/** A hash table to store client-side address rewrite instructions. */ -static strmap_t *addressmap=NULL; - -/** - * Table mapping addresses to which virtual address, if any, we - * assigned them to. - * - * We maintain the following invariant: if [A,B] is in - * virtaddress_reversemap, then B must be a virtual address, and [A,B] - * must be in addressmap. We do not require that the converse hold: - * if it fails, then we could end up mapping two virtual addresses to - * the same address, which is no disaster. - **/ -static strmap_t *virtaddress_reversemap=NULL; - -/** Initialize addressmap. */ -void -addressmap_init(void) -{ - addressmap = strmap_new(); - virtaddress_reversemap = strmap_new(); -} - -/** Free the memory associated with the addressmap entry _ent. */ -static void -addressmap_ent_free(void *_ent) -{ - addressmap_entry_t *ent; - if (!_ent) - return; - - ent = _ent; - tor_free(ent->new_address); - tor_free(ent); -} - -/** Free storage held by a virtaddress_entry_t* entry in ent. */ -static void -addressmap_virtaddress_ent_free(void *_ent) -{ - virtaddress_entry_t *ent; - if (!_ent) - return; - - ent = _ent; - tor_free(ent->ipv4_address); - tor_free(ent->hostname_address); - tor_free(ent); -} - -/** Free storage held by a virtaddress_entry_t* entry in ent. */ -static void -addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent) -{ - if (ent && ent->new_address && - address_is_in_virtual_range(ent->new_address)) { - virtaddress_entry_t *ve = - strmap_get(virtaddress_reversemap, ent->new_address); - /*log_fn(LOG_NOTICE,"remove reverse mapping for %s",ent->new_address);*/ - if (ve) { - if (!strcmp(address, ve->ipv4_address)) - tor_free(ve->ipv4_address); - if (!strcmp(address, ve->hostname_address)) - tor_free(ve->hostname_address); - if (!ve->ipv4_address && !ve->hostname_address) { - tor_free(ve); - strmap_remove(virtaddress_reversemap, ent->new_address); - } - } - } -} - -/** Remove ent (which must be mapped to by address) from the - * client address maps. */ -static void -addressmap_ent_remove(const char *address, addressmap_entry_t *ent) -{ - addressmap_virtaddress_remove(address, ent); - addressmap_ent_free(ent); -} - -/** Unregister all TrackHostExits mappings from any address to - * *.exitname.exit. */ -void -clear_trackexithost_mappings(const char *exitname) -{ - char *suffix = NULL; - if (!addressmap || !exitname) - return; - tor_asprintf(&suffix, ".%s.exit", exitname); - tor_strlower(suffix); - - STRMAP_FOREACH_MODIFY(addressmap, address, addressmap_entry_t *, ent) { - if (ent->source == ADDRMAPSRC_TRACKEXIT && - !strcmpend(ent->new_address, suffix)) { - addressmap_ent_remove(address, ent); - MAP_DEL_CURRENT(address); - } - } STRMAP_FOREACH_END; - - tor_free(suffix); -} - -/** Remove all TRACKEXIT mappings from the addressmap for which the target - * host is unknown or no longer allowed, or for which the source address - * is no longer in trackexithosts. */ -void -addressmap_clear_excluded_trackexithosts(const or_options_t *options) -{ - const routerset_t *allow_nodes = options->ExitNodes; - const routerset_t *exclude_nodes = options->ExcludeExitNodesUnion_; - - if (!addressmap) - return; - if (routerset_is_empty(allow_nodes)) - allow_nodes = NULL; - if (allow_nodes == NULL && routerset_is_empty(exclude_nodes)) - return; - - STRMAP_FOREACH_MODIFY(addressmap, address, addressmap_entry_t *, ent) { - size_t len; - const char *target = ent->new_address, *dot; - char *nodename; - const node_t *node; - - if (!target) { - /* DNS resolving in progress */ - continue; - } else if (strcmpend(target, ".exit")) { - /* Not a .exit mapping */ - continue; - } else if (ent->source != ADDRMAPSRC_TRACKEXIT) { - /* Not a trackexit mapping. */ - continue; - } - len = strlen(target); - if (len < 6) - continue; /* malformed. */ - dot = target + len - 6; /* dot now points to just before .exit */ - while (dot > target && *dot != '.') - dot--; - if (*dot == '.') dot++; - nodename = tor_strndup(dot, len-5-(dot-target));; - node = node_get_by_nickname(nodename, 0); - tor_free(nodename); - if (!node || - (allow_nodes && !routerset_contains_node(allow_nodes, node)) || - routerset_contains_node(exclude_nodes, node) || - !hostname_in_track_host_exits(options, address)) { - /* We don't know this one, or we want to be rid of it. */ - addressmap_ent_remove(address, ent); - MAP_DEL_CURRENT(address); - } - } STRMAP_FOREACH_END; -} - -/** Return true iff address is one that we are configured to - * automap on resolve according to options. */ -int -addressmap_address_should_automap(const char *address, - const or_options_t *options) -{ - const smartlist_t *suffix_list = options->AutomapHostsSuffixes; - - if (!suffix_list) - return 0; - - SMARTLIST_FOREACH_BEGIN(suffix_list, const char *, suffix) { - if (!strcasecmpend(address, suffix)) - return 1; - } SMARTLIST_FOREACH_END(suffix); - return 0; -} - -/** Remove all AUTOMAP mappings from the addressmap for which the - * source address no longer matches AutomapHostsSuffixes, which is - * no longer allowed by AutomapHostsOnResolve, or for which the - * target address is no longer in the virtual network. */ -void -addressmap_clear_invalid_automaps(const or_options_t *options) -{ - int clear_all = !options->AutomapHostsOnResolve; - const smartlist_t *suffixes = options->AutomapHostsSuffixes; - - if (!addressmap) - return; - - if (!suffixes) - clear_all = 1; /* This should be impossible, but let's be sure. */ - - STRMAP_FOREACH_MODIFY(addressmap, src_address, addressmap_entry_t *, ent) { - int remove = clear_all; - if (ent->source != ADDRMAPSRC_AUTOMAP) - continue; /* not an automap mapping. */ - - if (!remove) { - remove = ! addressmap_address_should_automap(src_address, options); - } - - if (!remove && ! address_is_in_virtual_range(ent->new_address)) - remove = 1; - - if (remove) { - addressmap_ent_remove(src_address, ent); - MAP_DEL_CURRENT(src_address); - } - } STRMAP_FOREACH_END; -} - -/** Remove all entries from the addressmap that were set via the - * configuration file or the command line. */ -void -addressmap_clear_configured(void) -{ - addressmap_get_mappings(NULL, 0, 0, 0); -} - -/** Remove all entries from the addressmap that are set to expire, ever. */ -void -addressmap_clear_transient(void) -{ - addressmap_get_mappings(NULL, 2, TIME_MAX, 0); -} - -/** Clean out entries from the addressmap cache that were - * added long enough ago that they are no longer valid. - */ -void -addressmap_clean(time_t now) -{ - addressmap_get_mappings(NULL, 2, now, 0); -} - -/** Free all the elements in the addressmap, and free the addressmap - * itself. */ -void -addressmap_free_all(void) -{ - strmap_free(addressmap, addressmap_ent_free); - addressmap = NULL; - - strmap_free(virtaddress_reversemap, addressmap_virtaddress_ent_free); - virtaddress_reversemap = NULL; -} - -/** Try to find a match for AddressMap expressions that use - * wildcard notation such as '*.c.d *.e.f' (so 'a.c.d' will map to 'a.e.f') or - * '*.c.d a.b.c' (so 'a.c.d' will map to a.b.c). - * Return the matching entry in AddressMap or NULL if no match is found. - * For expressions such as '*.c.d *.e.f', truncate address 'a.c.d' - * to 'a' before we return the matching AddressMap entry. - * - * This function does not handle the case where a pattern of the form "*.c.d" - * matches the address c.d -- that's done by the main addressmap_rewrite - * function. - */ -static addressmap_entry_t * -addressmap_match_superdomains(char *address) -{ - addressmap_entry_t *val; - char *cp; - - cp = address; - while ((cp = strchr(cp, '.'))) { - /* cp now points to a suffix of address that begins with a . */ - val = strmap_get_lc(addressmap, cp+1); - if (val && val->src_wildcard) { - if (val->dst_wildcard) - *cp = '\0'; - return val; - } - ++cp; - } - return NULL; -} - -/** Look at address, and rewrite it until it doesn't want any - * more rewrites; but don't get into an infinite loop. - * Don't write more than maxlen chars into address. Return true if the - * address changed; false otherwise. Set *expires_out to the - * expiry time of the result, or to time_max if the result does - * not expire. - * - * If exit_source_out is non-null, we set it as follows. If we the - * address starts out as a non-exit address, and we remap it to an .exit - * address at any point, then set *exit_source_out to the - * address_entry_source_t of the first such rule. Set *exit_source_out - * to ADDRMAPSRC_NONE if there is no such rewrite, or if the original address - * was a .exit. - */ -int -addressmap_rewrite(char *address, size_t maxlen, - unsigned flags, - time_t *expires_out, - addressmap_entry_source_t *exit_source_out) -{ - addressmap_entry_t *ent; - int rewrites; - time_t expires = TIME_MAX; - addressmap_entry_source_t exit_source = ADDRMAPSRC_NONE; - char *addr_orig = tor_strdup(address); - char *log_addr_orig = NULL; - - for (rewrites = 0; rewrites < 16; rewrites++) { - int exact_match = 0; - log_addr_orig = tor_strdup(escaped_safe_str_client(address)); - - ent = strmap_get(addressmap, address); - - if (!ent || !ent->new_address) { - ent = addressmap_match_superdomains(address); - } else { - if (ent->src_wildcard && !ent->dst_wildcard && - !strcasecmp(address, ent->new_address)) { - /* This is a rule like *.example.com example.com, and we just got - * "example.com" */ - goto done; - } - - exact_match = 1; - } - - if (!ent || !ent->new_address) { - goto done; - } - - if (ent && ent->source == ADDRMAPSRC_DNS) { - sa_family_t f; - tor_addr_t tmp; - f = tor_addr_parse(&tmp, ent->new_address); - if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS)) - goto done; - else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS)) - goto done; - } - - if (ent->dst_wildcard && !exact_match) { - strlcat(address, ".", maxlen); - strlcat(address, ent->new_address, maxlen); - } else { - strlcpy(address, ent->new_address, maxlen); - } - - if (!strcmpend(address, ".exit") && - strcmpend(addr_orig, ".exit") && - exit_source == ADDRMAPSRC_NONE) { - exit_source = ent->source; - } - - log_info(LD_APP, "Addressmap: rewriting %s to %s", - log_addr_orig, escaped_safe_str_client(address)); - if (ent->expires > 1 && ent->expires < expires) - expires = ent->expires; - - tor_free(log_addr_orig); - } - log_warn(LD_CONFIG, - "Loop detected: we've rewritten %s 16 times! Using it as-is.", - escaped_safe_str_client(address)); - /* it's fine to rewrite a rewrite, but don't loop forever */ - - done: - tor_free(addr_orig); - tor_free(log_addr_orig); - if (exit_source_out) - *exit_source_out = exit_source; - if (expires_out) - *expires_out = TIME_MAX; - return (rewrites > 0); -} - -/** If we have a cached reverse DNS entry for the address stored in the - * maxlen-byte buffer address (typically, a dotted quad) then - * rewrite to the cached value and return 1. Otherwise return 0. Set - * *expires_out to the expiry time of the result, or to time_max - * if the result does not expire. */ -int -addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags, - time_t *expires_out) -{ - char *s, *cp; - addressmap_entry_t *ent; - int r = 0; - { - sa_family_t f; - tor_addr_t tmp; - f = tor_addr_parse(&tmp, address); - if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS)) - return 0; - else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS)) - return 0; - } - - tor_asprintf(&s, "REVERSE[%s]", address); - ent = strmap_get(addressmap, s); - if (ent) { - cp = tor_strdup(escaped_safe_str_client(ent->new_address)); - log_info(LD_APP, "Rewrote reverse lookup %s -> %s", - escaped_safe_str_client(s), cp); - tor_free(cp); - strlcpy(address, ent->new_address, maxlen); - r = 1; - } - - if (expires_out) - *expires_out = (ent && ent->expires > 1) ? ent->expires : TIME_MAX; - - tor_free(s); - return r; -} - -/** Return 1 if address is already registered, else return 0. If address - * is already registered, and update_expires is non-zero, then update - * the expiry time on the mapping with update_expires if it is a - * mapping created by TrackHostExits. */ -int -addressmap_have_mapping(const char *address, int update_expiry) -{ - addressmap_entry_t *ent; - if (!(ent=strmap_get_lc(addressmap, address))) - return 0; - if (update_expiry && ent->source==ADDRMAPSRC_TRACKEXIT) - ent->expires=time(NULL) + update_expiry; - return 1; -} - -/** Register a request to map address to new_address, - * which will expire on expires (or 0 if never expires from - * config file, 1 if never expires from controller, 2 if never expires - * (virtual address mapping) from the controller.) - * - * new_address should be a newly dup'ed string, which we'll use or - * free as appropriate. We will leave address alone. - * - * If wildcard_addr is true, then the mapping will match any address - * equal to address, or any address ending with a period followed by - * address. If wildcard_addr and wildcard_new_addr are - * both true, the mapping will rewrite addresses that end with - * ".address" into ones that end with ".new_address." - * - * If new_address is NULL, or new_address is equal to - * address and wildcard_addr is equal to - * wildcard_new_addr, remove any mappings that exist from - * address. - * - * - * It is an error to set wildcard_new_addr if wildcard_addr is - * not set. */ -void -addressmap_register(const char *address, char *new_address, time_t expires, - addressmap_entry_source_t source, - const int wildcard_addr, - const int wildcard_new_addr) -{ - addressmap_entry_t *ent; - - if (wildcard_new_addr) - tor_assert(wildcard_addr); - - ent = strmap_get(addressmap, address); - if (!new_address || (!strcasecmp(address,new_address) && - wildcard_addr == wildcard_new_addr)) { - /* Remove the mapping, if any. */ - tor_free(new_address); - if (ent) { - addressmap_ent_remove(address,ent); - strmap_remove(addressmap, address); - } - return; - } - if (!ent) { /* make a new one and register it */ - ent = tor_malloc_zero(sizeof(addressmap_entry_t)); - strmap_set(addressmap, address, ent); - } else if (ent->new_address) { /* we need to clean up the old mapping. */ - if (expires > 1) { - log_info(LD_APP,"Temporary addressmap ('%s' to '%s') not performed, " - "since it's already mapped to '%s'", - safe_str_client(address), - safe_str_client(new_address), - safe_str_client(ent->new_address)); - tor_free(new_address); - return; - } - if (address_is_in_virtual_range(ent->new_address) && - expires != 2) { - /* XXX This isn't the perfect test; we want to avoid removing - * mappings set from the control interface _as virtual mapping */ - addressmap_virtaddress_remove(address, ent); - } - tor_free(ent->new_address); - } /* else { we have an in-progress resolve with no mapping. } */ - - ent->new_address = new_address; - ent->expires = expires==2 ? 1 : expires; - ent->num_resolve_failures = 0; - ent->source = source; - ent->src_wildcard = wildcard_addr ? 1 : 0; - ent->dst_wildcard = wildcard_new_addr ? 1 : 0; - - log_info(LD_CONFIG, "Addressmap: (re)mapped '%s' to '%s'", - safe_str_client(address), - safe_str_client(ent->new_address)); - control_event_address_mapped(address, ent->new_address, expires, NULL, 1); -} - -/** An attempt to resolve address failed at some OR. - * Increment the number of resolve failures we have on record - * for it, and then return that number. - */ -int -client_dns_incr_failures(const char *address) -{ - addressmap_entry_t *ent = strmap_get(addressmap, address); - if (!ent) { - ent = tor_malloc_zero(sizeof(addressmap_entry_t)); - ent->expires = time(NULL) + MAX_DNS_ENTRY_AGE; - strmap_set(addressmap,address,ent); - } - if (ent->num_resolve_failures < SHORT_MAX) - ++ent->num_resolve_failures; /* don't overflow */ - log_info(LD_APP, "Address %s now has %d resolve failures.", - safe_str_client(address), - ent->num_resolve_failures); - return ent->num_resolve_failures; -} - -/** If address is in the client DNS addressmap, reset - * the number of resolve failures we have on record for it. - * This is used when we fail a stream because it won't resolve: - * otherwise future attempts on that address will only try once. - */ -void -client_dns_clear_failures(const char *address) -{ - addressmap_entry_t *ent = strmap_get(addressmap, address); - if (ent) - ent->num_resolve_failures = 0; -} - -/** Record the fact that address resolved to name. - * We can now use this in subsequent streams via addressmap_rewrite() - * so we can more correctly choose an exit that will allow address. - * - * If exitname is defined, then append the addresses with - * ".exitname.exit" before registering the mapping. - * - * If ttl is nonnegative, the mapping will be valid for - * ttlseconds; otherwise, we use the default. - */ -static void -client_dns_set_addressmap_impl(entry_connection_t *for_conn, - const char *address, const char *name, - const char *exitname, - int ttl) -{ - char *extendedaddress=NULL, *extendedval=NULL; - (void)for_conn; - - tor_assert(address); - tor_assert(name); - - if (ttl<0) - ttl = DEFAULT_DNS_TTL; - else - ttl = dns_clip_ttl(ttl); - - if (exitname) { - /* XXXX fails to ever get attempts to get an exit address of - * google.com.digest[=~]nickname.exit; we need a syntax for this that - * won't make strict RFC952-compliant applications (like us) barf. */ - tor_asprintf(&extendedaddress, - "%s.%s.exit", address, exitname); - tor_asprintf(&extendedval, - "%s.%s.exit", name, exitname); - } else { - tor_asprintf(&extendedaddress, - "%s", address); - tor_asprintf(&extendedval, - "%s", name); - } - addressmap_register(extendedaddress, extendedval, - time(NULL) + ttl, ADDRMAPSRC_DNS, 0, 0); - tor_free(extendedaddress); -} - -/** Record the fact that address resolved to val. - * We can now use this in subsequent streams via addressmap_rewrite() - * so we can more correctly choose an exit that will allow address. - * - * If exitname is defined, then append the addresses with - * ".exitname.exit" before registering the mapping. - * - * If ttl is nonnegative, the mapping will be valid for - * ttlseconds; otherwise, we use the default. - */ -void -client_dns_set_addressmap(entry_connection_t *for_conn, - const char *address, - const tor_addr_t *val, - const char *exitname, - int ttl) -{ - tor_addr_t addr_tmp; - char valbuf[TOR_ADDR_BUF_LEN]; - - tor_assert(address); - tor_assert(val); - - if (tor_addr_parse(&addr_tmp, address) >= 0) - return; /* If address was an IP address already, don't add a mapping. */ - - if (tor_addr_family(val) == AF_INET) { - if (! for_conn->cache_ipv4_answers) - return; - } else if (tor_addr_family(val) == AF_INET6) { - if (! for_conn->cache_ipv6_answers) - return; - } - - if (! tor_addr_to_str(valbuf, val, sizeof(valbuf), 1)) - return; - - client_dns_set_addressmap_impl(for_conn, address, valbuf, exitname, ttl); -} - -/** Add a cache entry noting that address (ordinarily a dotted quad) - * resolved via a RESOLVE_PTR request to the hostname v. - * - * If exitname is defined, then append the addresses with - * ".exitname.exit" before registering the mapping. - * - * If ttl is nonnegative, the mapping will be valid for - * ttlseconds; otherwise, we use the default. - */ -void -client_dns_set_reverse_addressmap(entry_connection_t *for_conn, - const char *address, const char *v, - const char *exitname, - int ttl) -{ - char *s = NULL; - { - tor_addr_t tmp_addr; - sa_family_t f = tor_addr_parse(&tmp_addr, address); - if ((f == AF_INET && ! for_conn->cache_ipv4_answers) || - (f == AF_INET6 && ! for_conn->cache_ipv6_answers)) - return; - } - tor_asprintf(&s, "REVERSE[%s]", address); - client_dns_set_addressmap_impl(for_conn, s, v, exitname, ttl); - tor_free(s); -} - -/* By default, we hand out 127.192.0.1 through 127.254.254.254. - * These addresses should map to localhost, so even if the - * application accidentally tried to connect to them directly (not - * via Tor), it wouldn't get too far astray. - * - * These options are configured by parse_virtual_addr_network(). - */ - -static virtual_addr_conf_t virtaddr_conf_ipv4; -static virtual_addr_conf_t virtaddr_conf_ipv6; - -/** Read a netmask of the form 127.192.0.0/10 from "val", and check whether - * it's a valid set of virtual addresses to hand out in response to MAPADDRESS - * requests. Return 0 on success; set *msg (if provided) to a newly allocated - * string and return -1 on failure. If validate_only is false, sets the - * actual virtual address range to the parsed value. */ -int -parse_virtual_addr_network(const char *val, sa_family_t family, - int validate_only, - char **msg) -{ - const int ipv6 = (family == AF_INET6); - tor_addr_t addr; - maskbits_t bits; - const int max_bits = ipv6 ? 40 : 16; - virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4; - - if (tor_addr_parse_mask_ports(val, 0, &addr, &bits, NULL, NULL) < 0) { - if (msg) - tor_asprintf(msg, "Error parsing VirtualAddressNetwork%s %s", - ipv6?"IPv6":"", val); - return -1; - } - if (tor_addr_family(&addr) != family) { - if (msg) - tor_asprintf(msg, "Incorrect address type for VirtualAddressNetwork%s", - ipv6?"IPv6":""); - return -1; - } -#if 0 - if (port_min != 1 || port_max != 65535) { - if (msg) - tor_asprintf(msg, "Can't specify ports on VirtualAddressNetwork%s", - ipv6?"IPv6":""); - return -1; - } -#endif - - if (bits > max_bits) { - if (msg) - tor_asprintf(msg, "VirtualAddressNetwork%s expects a /%d " - "network or larger",ipv6?"IPv6":"", max_bits); - return -1; - } - - if (validate_only) - return 0; - - tor_addr_copy(&conf->addr, &addr); - conf->bits = bits; - - return 0; -} - -/** - * Return true iff addr is likely to have been returned by - * client_dns_get_unused_address. - **/ -int -address_is_in_virtual_range(const char *address) -{ - tor_addr_t addr; - tor_assert(address); - if (!strcasecmpend(address, ".virtual")) { - return 1; - } else if (tor_addr_parse(&addr, address) >= 0) { - const virtual_addr_conf_t *conf = (tor_addr_family(&addr) == AF_INET6) ? - &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4; - if (tor_addr_compare_masked(&addr, &conf->addr, conf->bits, CMP_EXACT)==0) - return 1; - } - return 0; -} - -/** Return a random address conforming to the virtual address configuration - * in conf. - */ -STATIC void -get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out) -{ - uint8_t tmp[4]; - const uint8_t *addr_bytes; - uint8_t bytes[16]; - const int ipv6 = tor_addr_family(&conf->addr) == AF_INET6; - const int total_bytes = ipv6 ? 16 : 4; - - tor_assert(conf->bits <= total_bytes * 8); - - /* Set addr_bytes to the bytes of the virtual network, in host order */ - if (ipv6) { - addr_bytes = tor_addr_to_in6_addr8(&conf->addr); - } else { - set_uint32(tmp, tor_addr_to_ipv4n(&conf->addr)); - addr_bytes = tmp; - } - - /* Get an appropriate number of random bytes. */ - crypto_rand((char*)bytes, total_bytes); - - /* Now replace the first "conf->bits" bits of 'bytes' with addr_bytes*/ - if (conf->bits >= 8) - memcpy(bytes, addr_bytes, conf->bits / 8); - if (conf->bits & 7) { - uint8_t mask = 0xff >> (conf->bits & 7); - bytes[conf->bits/8] &= mask; - bytes[conf->bits/8] |= addr_bytes[conf->bits/8] & ~mask; - } - - if (ipv6) - tor_addr_from_ipv6_bytes(addr_out, (char*) bytes); - else - tor_addr_from_ipv4n(addr_out, get_uint32(bytes)); - - tor_assert(tor_addr_compare_masked(addr_out, &conf->addr, - conf->bits, CMP_EXACT)==0); -} - -/** Return a newly allocated string holding an address of type - * (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped, - * and that is very unlikely to be the address of any real host. - * - * May return NULL if we have run out of virtual addresses. - */ -static char * -addressmap_get_virtual_address(int type) -{ - char buf[64]; - tor_assert(addressmap); - - if (type == RESOLVED_TYPE_HOSTNAME) { - char rand[10]; - do { - crypto_rand(rand, sizeof(rand)); - base32_encode(buf,sizeof(buf),rand,sizeof(rand)); - strlcat(buf, ".virtual", sizeof(buf)); - } while (strmap_get(addressmap, buf)); - return tor_strdup(buf); - } else if (type == RESOLVED_TYPE_IPV4 || type == RESOLVED_TYPE_IPV6) { - const int ipv6 = (type == RESOLVED_TYPE_IPV6); - const virtual_addr_conf_t *conf = ipv6 ? - &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4; - - /* Don't try more than 1000 times. This gives us P < 1e-9 for - * failing to get a good address so long as the address space is - * less than ~97.95% full. That's always going to be true under - * sensible circumstances for an IPv6 /10, and it's going to be - * true for an IPv4 /10 as long as we've handed out less than - * 4.08 million addresses. */ - uint32_t attempts = 1000; - - tor_addr_t addr; - - while (attempts--) { - get_random_virtual_addr(conf, &addr); - - if (!ipv6) { - /* Don't hand out any .0 or .255 address. */ - const uint32_t a = tor_addr_to_ipv4h(&addr); - if ((a & 0xff) == 0 || (a & 0xff) == 0xff) - continue; - } - - tor_addr_to_str(buf, &addr, sizeof(buf), 1); - if (!strmap_get(addressmap, buf)) { - /* XXXX This code is to make sure I didn't add an undecorated version - * by mistake. I hope it's needless. */ - char tmp[TOR_ADDR_BUF_LEN]; - tor_addr_to_str(buf, &addr, sizeof(tmp), 0); - if (strmap_get(addressmap, tmp)) { - log_warn(LD_BUG, "%s wasn't in the addressmap, but %s was.", - buf, tmp); - continue; - } - - return tor_strdup(buf); - } - } - log_warn(LD_CONFIG, "Ran out of virtual addresses!"); - return NULL; - } else { - log_warn(LD_BUG, "Called with unsupported address type (%d)", type); - return NULL; - } -} - -/** A controller has requested that we map some address of type - * type to the address new_address. Choose an address - * that is unlikely to be used, and map it, and return it in a newly - * allocated string. If another address of the same type is already - * mapped to new_address, try to return a copy of that address. - * - * The string in new_address may be freed or inserted into a map - * as appropriate. May return NULL if are out of virtual addresses. - **/ -const char * -addressmap_register_virtual_address(int type, char *new_address) -{ - char **addrp; - virtaddress_entry_t *vent; - int vent_needs_to_be_added = 0; - - tor_assert(new_address); - tor_assert(addressmap); - tor_assert(virtaddress_reversemap); - - vent = strmap_get(virtaddress_reversemap, new_address); - if (!vent) { - vent = tor_malloc_zero(sizeof(virtaddress_entry_t)); - vent_needs_to_be_added = 1; - } - - if (type == RESOLVED_TYPE_IPV4) - addrp = &vent->ipv4_address; - else if (type == RESOLVED_TYPE_IPV6) - addrp = &vent->ipv6_address; - else - addrp = &vent->hostname_address; - - if (*addrp) { - addressmap_entry_t *ent = strmap_get(addressmap, *addrp); - if (ent && ent->new_address && - !strcasecmp(new_address, ent->new_address)) { - tor_free(new_address); - tor_assert(!vent_needs_to_be_added); - return tor_strdup(*addrp); - } else { - log_warn(LD_BUG, - "Internal confusion: I thought that '%s' was mapped to by " - "'%s', but '%s' really maps to '%s'. This is a harmless bug.", - safe_str_client(new_address), - safe_str_client(*addrp), - safe_str_client(*addrp), - ent?safe_str_client(ent->new_address):"(nothing)"); - } - } - - tor_free(*addrp); - *addrp = addressmap_get_virtual_address(type); - if (!*addrp) { - tor_free(vent); - tor_free(new_address); - return NULL; - } - log_info(LD_APP, "Registering map from %s to %s", *addrp, new_address); - if (vent_needs_to_be_added) - strmap_set(virtaddress_reversemap, new_address, vent); - addressmap_register(*addrp, new_address, 2, ADDRMAPSRC_AUTOMAP, 0, 0); - -#if 0 - { - /* Try to catch possible bugs */ - addressmap_entry_t *ent; - ent = strmap_get(addressmap, *addrp); - tor_assert(ent); - tor_assert(!strcasecmp(ent->new_address,new_address)); - vent = strmap_get(virtaddress_reversemap, new_address); - tor_assert(vent); - tor_assert(!strcasecmp(*addrp, - (type == RESOLVED_TYPE_IPV4) ? - vent->ipv4_address : vent->hostname_address)); - log_info(LD_APP, "Map from %s to %s okay.", - safe_str_client(*addrp), - safe_str_client(new_address)); - } -#endif - - return *addrp; -} - -/** Return 1 if address has funny characters in it like colons. Return - * 0 if it's fine, or if we're configured to allow it anyway. client - * should be true if we're using this address as a client; false if we're - * using it as a server. - */ -int -address_is_invalid_destination(const char *address, int client) -{ - if (client) { - if (get_options()->AllowNonRFC953Hostnames) - return 0; - } else { - if (get_options()->ServerDNSAllowNonRFC953Hostnames) - return 0; - } - - /* It might be an IPv6 address! */ - { - tor_addr_t a; - if (tor_addr_parse(&a, address) >= 0) - return 0; - } - - while (*address) { - if (TOR_ISALNUM(*address) || - *address == '-' || - *address == '.' || - *address == '_') /* Underscore is not allowed, but Windows does it - * sometimes, just to thumb its nose at the IETF. */ - ++address; - else - return 1; - } - return 0; -} - -/** Iterate over all address mappings which have expiry times between - * min_expires and max_expires, inclusive. If sl is provided, add an - * "old-addr new-addr expiry" string to sl for each mapping, omitting - * the expiry time if want_expiry is false. If sl is NULL, remove the - * mappings. - */ -void -addressmap_get_mappings(smartlist_t *sl, time_t min_expires, - time_t max_expires, int want_expiry) -{ - strmap_iter_t *iter; - const char *key; - void *val_; - addressmap_entry_t *val; - - if (!addressmap) - addressmap_init(); - - for (iter = strmap_iter_init(addressmap); !strmap_iter_done(iter); ) { - strmap_iter_get(iter, &key, &val_); - val = val_; - if (val->expires >= min_expires && val->expires <= max_expires) { - if (!sl) { - iter = strmap_iter_next_rmv(addressmap,iter); - addressmap_ent_remove(key, val); - continue; - } else if (val->new_address) { - const char *src_wc = val->src_wildcard ? "*." : ""; - const char *dst_wc = val->dst_wildcard ? "*." : ""; - if (want_expiry) { - if (val->expires < 3 || val->expires == TIME_MAX) - smartlist_add_asprintf(sl, "%s%s %s%s NEVER", - src_wc, key, dst_wc, val->new_address); - else { - char time[ISO_TIME_LEN+1]; - format_iso_time(time, val->expires); - smartlist_add_asprintf(sl, "%s%s %s%s \"%s\"", - src_wc, key, dst_wc, val->new_address, - time); - } - } else { - smartlist_add_asprintf(sl, "%s%s %s%s", - src_wc, key, dst_wc, val->new_address); - } - } - } - iter = strmap_iter_next(addressmap,iter); - } -} - diff --git a/src/tor/addressmap.h b/src/tor/addressmap.h deleted file mode 100644 index 417832b31..000000000 --- a/src/tor/addressmap.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_ADDRESSMAP_H -#define TOR_ADDRESSMAP_H - -#include "testsupport.h" - -void addressmap_init(void); -void addressmap_clear_excluded_trackexithosts(const or_options_t *options); -void addressmap_clear_invalid_automaps(const or_options_t *options); -void addressmap_clean(time_t now); -void addressmap_clear_configured(void); -void addressmap_clear_transient(void); -void addressmap_free_all(void); -#define AMR_FLAG_USE_IPV4_DNS (1u<<0) -#define AMR_FLAG_USE_IPV6_DNS (1u<<1) -int addressmap_rewrite(char *address, size_t maxlen, unsigned flags, - time_t *expires_out, - addressmap_entry_source_t *exit_source_out); -int addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags, - time_t *expires_out); -int addressmap_have_mapping(const char *address, int update_timeout); - -void addressmap_register(const char *address, char *new_address, - time_t expires, addressmap_entry_source_t source, - const int address_wildcard, - const int new_address_wildcard); -int parse_virtual_addr_network(const char *val, - sa_family_t family, int validate_only, - char **msg); -int client_dns_incr_failures(const char *address); -void client_dns_clear_failures(const char *address); -void client_dns_set_addressmap(entry_connection_t *for_conn, - const char *address, const tor_addr_t *val, - const char *exitname, int ttl); -const char *addressmap_register_virtual_address(int type, char *new_address); -void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, - time_t max_expires, int want_expiry); -int address_is_in_virtual_range(const char *addr); -void clear_trackexithost_mappings(const char *exitname); -void client_dns_set_reverse_addressmap(entry_connection_t *for_conn, - const char *address, const char *v, - const char *exitname, int ttl); -int addressmap_address_should_automap(const char *address, - const or_options_t *options); - -#ifdef ADDRESSMAP_PRIVATE -typedef struct virtual_addr_conf_t { - tor_addr_t addr; - maskbits_t bits; -} virtual_addr_conf_t; - -STATIC void get_random_virtual_addr(const virtual_addr_conf_t *conf, - tor_addr_t *addr_out); -#endif - -#endif - diff --git a/src/tor/aes.c b/src/tor/aes.c deleted file mode 100644 index e4cfe9156..000000000 --- a/src/tor/aes.c +++ /dev/null @@ -1,522 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file aes.c - * \brief Implements a counter-mode stream cipher on top of AES. - **/ - -#include "orconfig.h" - -#ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include "*/ - #ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0501 - #endif - #define WIN32_LEAN_AND_MEAN - #if defined(_MSC_VER) && (_MSC_VER < 1300) - #include - #else - #include - #include - #endif -#endif - -#include -#include -#include -#include -#include -#include -#include -#include "crypto.h" -#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,0,0) -/* See comments about which counter mode implementation to use below. */ -#include -#define CAN_USE_OPENSSL_CTR -#endif -#include "tor_compat.h" -#include "aes.h" -#include "tor_util.h" -#include "torlog.h" -#include "di_ops.h" - -#ifdef ANDROID -/* Android's OpenSSL seems to have removed all of its Engine support. */ -#define DISABLE_ENGINES -#endif - -/* We have five strategies for implementing AES counter mode. - * - * Best with x86 and x86_64: Use EVP_aes_ctr128() and EVP_EncryptUpdate(). - * This is possible with OpenSSL 1.0.1, where the counter-mode implementation - * can use bit-sliced or vectorized AES or AESNI as appropriate. - * - * Otherwise: Pick the best possible AES block implementation that OpenSSL - * gives us, and the best possible counter-mode implementation, and combine - * them. - */ -#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,0,1) && \ - (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ - defined(__x86_64) || defined(__x86_64__) || \ - defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__)) \ - -#define USE_EVP_AES_CTR - -#endif - -/* We have 2 strategies for getting the AES block cipher: Via OpenSSL's - * AES_encrypt function, or via OpenSSL's EVP_EncryptUpdate function. - * - * If there's any hardware acceleration in play, we want to be using EVP_* so - * we can get it. Otherwise, we'll want AES_*, which seems to be about 5% - * faster than indirecting through the EVP layer. - */ - -/* We have 2 strategies for getting a plug-in counter mode: use our own, or - * use OpenSSL's. - * - * Here we have a counter mode that's faster than the one shipping with - * OpenSSL pre-1.0 (by about 10%!). But OpenSSL 1.0.0 added a counter mode - * implementation faster than the one here (by about 7%). So we pick which - * one to used based on the Openssl version above. (OpenSSL 1.0.0a fixed a - * critical bug in that counter mode implementation, so we need to test to - * make sure that we have a fixed version.) - */ - -#ifdef USE_EVP_AES_CTR - -struct aes_cnt_cipher { - EVP_CIPHER_CTX evp; -}; - -aes_cnt_cipher_t * -aes_new_cipher(const char *key, const char *iv) -{ - aes_cnt_cipher_t *cipher; - cipher = tor_malloc_zero(sizeof(aes_cnt_cipher_t)); - EVP_EncryptInit(&cipher->evp, EVP_aes_128_ctr(), - (const unsigned char*)key, (const unsigned char *)iv); - return cipher; -} -void -aes_cipher_free(aes_cnt_cipher_t *cipher) -{ - if (!cipher) - return; - EVP_CIPHER_CTX_cleanup(&cipher->evp); - memwipe(cipher, 0, sizeof(aes_cnt_cipher_t)); - tor_free(cipher); -} -void -aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len, - char *output) -{ - int outl; - - tor_assert(len < INT_MAX); - - EVP_EncryptUpdate(&cipher->evp, (unsigned char*)output, - &outl, (const unsigned char *)input, (int)len); -} -void -aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len) -{ - int outl; - - tor_assert(len < INT_MAX); - - EVP_EncryptUpdate(&cipher->evp, (unsigned char*)data, - &outl, (unsigned char*)data, (int)len); -} -int -evaluate_evp_for_aes(int force_val) -{ - (void) force_val; - log_info(LD_CRYPTO, "This version of OpenSSL has a known-good EVP " - "counter-mode implementation. Using it."); - return 0; -} -int -evaluate_ctr_for_aes(void) -{ - return 0; -} -#else - -/*======================================================================*/ -/* Interface to AES code, and counter implementation */ - -/** Implements an AES counter-mode cipher. */ -struct aes_cnt_cipher { -/** This next element (however it's defined) is the AES key. */ - union { - EVP_CIPHER_CTX evp; - AES_KEY aes; - } key; - -#if !defined(WORDS_BIGENDIAN) -#define USING_COUNTER_VARS - /** These four values, together, implement a 128-bit counter, with - * counter0 as the low-order word and counter3 as the high-order word. */ - uint32_t counter3; - uint32_t counter2; - uint32_t counter1; - uint32_t counter0; -#endif - - union { - /** The counter, in big-endian order, as bytes. */ - uint8_t buf[16]; - /** The counter, in big-endian order, as big-endian words. Note that - * on big-endian platforms, this is redundant with counter3...0, - * so we just use these values instead. */ - uint32_t buf32[4]; - } ctr_buf; - - /** The encrypted value of ctr_buf. */ - uint8_t buf[16]; - /** Our current stream position within buf. */ - unsigned int pos; - - /** True iff we're using the evp implementation of this cipher. */ - uint8_t using_evp; -}; - -/** True iff we should prefer the EVP implementation for AES, either because - * we're testing it or because we have hardware acceleration configured */ -static int should_use_EVP = 0; - -#ifdef CAN_USE_OPENSSL_CTR -/** True iff we have tested the counter-mode implementation and found that it - * doesn't have the counter-mode bug from OpenSSL 1.0.0. */ -static int should_use_openssl_CTR = 0; -#endif - -/** Check whether we should use the EVP interface for AES. If force_val - * is nonnegative, we use use EVP iff it is true. Otherwise, we use EVP - * if there is an engine enabled for aes-ecb. */ -int -evaluate_evp_for_aes(int force_val) -{ - ENGINE *e; - - if (force_val >= 0) { - should_use_EVP = force_val; - return 0; - } -#ifdef DISABLE_ENGINES - should_use_EVP = 0; -#else - e = ENGINE_get_cipher_engine(NID_aes_128_ecb); - - if (e) { - log_info(LD_CRYPTO, "AES engine \"%s\" found; using EVP_* functions.", - ENGINE_get_name(e)); - should_use_EVP = 1; - } else { - log_info(LD_CRYPTO, "No AES engine found; using AES_* functions."); - should_use_EVP = 0; - } -#endif - - return 0; -} - -/** Test the OpenSSL counter mode implementation to see whether it has the - * counter-mode bug from OpenSSL 1.0.0. If the implementation works, then - * we will use it for future encryption/decryption operations. - * - * We can't just look at the OpenSSL version, since some distributions update - * their OpenSSL packages without changing the version number. - **/ -int -evaluate_ctr_for_aes(void) -{ -#ifdef CAN_USE_OPENSSL_CTR - /* Result of encrypting an all-zero block with an all-zero 128-bit AES key. - * This should be the same as encrypting an all-zero block with an all-zero - * 128-bit AES key in counter mode, starting at position 0 of the stream. - */ - static const unsigned char encrypt_zero[] = - "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b\x88\x4c\xfa\x59\xca\x34\x2b\x2e"; - unsigned char zero[16]; - unsigned char output[16]; - unsigned char ivec[16]; - unsigned char ivec_tmp[16]; - unsigned int pos, i; - AES_KEY key; - memset(zero, 0, sizeof(zero)); - memset(ivec, 0, sizeof(ivec)); - AES_set_encrypt_key(zero, 128, &key); - - pos = 0; - /* Encrypting a block one byte at a time should make the error manifest - * itself for known bogus openssl versions. */ - for (i=0; i<16; ++i) - AES_ctr128_encrypt(&zero[i], &output[i], 1, &key, ivec, ivec_tmp, &pos); - - if (fast_memneq(output, encrypt_zero, 16)) { - /* Counter mode is buggy */ - log_notice(LD_CRYPTO, "This OpenSSL has a buggy version of counter mode; " - "not using it."); - } else { - /* Counter mode is okay */ - log_info(LD_CRYPTO, "This OpenSSL has a good implementation of counter " - "mode; using it."); - should_use_openssl_CTR = 1; - } -#else - log_info(LD_CRYPTO, "This version of OpenSSL has a slow implementation of " - "counter mode; not using it."); -#endif - return 0; -} - -#if !defined(USING_COUNTER_VARS) -#define COUNTER(c, n) ((c)->ctr_buf.buf32[3-(n)]) -#else -#define COUNTER(c, n) ((c)->counter ## n) -#endif - -/** - * Helper function: set cipher's internal buffer to the encrypted - * value of the current counter. - */ -static INLINE void -aes_fill_buf_(aes_cnt_cipher_t *cipher) -{ - /* We don't currently use OpenSSL's counter mode implementation because: - * 1) some versions have known bugs - * 2) its attitude towards IVs is not our own - * 3) changing the counter position was not trivial, last time I looked. - * None of these issues are insurmountable in principle. - */ - - if (cipher->using_evp) { - int outl=16, inl=16; - EVP_EncryptUpdate(&cipher->key.evp, cipher->buf, &outl, - cipher->ctr_buf.buf, inl); - } else { - AES_encrypt(cipher->ctr_buf.buf, cipher->buf, &cipher->key.aes); - } -} - -static void aes_set_key(aes_cnt_cipher_t *cipher, const char *key, - int key_bits); -static void aes_set_iv(aes_cnt_cipher_t *cipher, const char *iv); - -/** - * Return a newly allocated counter-mode AES128 cipher implementation, - * using the 128-bit key key and the 128-bit IV iv. - */ -aes_cnt_cipher_t* -aes_new_cipher(const char *key, const char *iv) -{ - aes_cnt_cipher_t* result = tor_malloc_zero(sizeof(aes_cnt_cipher_t)); - - aes_set_key(result, key, 128); - aes_set_iv(result, iv); - - return result; -} - -/** Set the key of cipher to key, which is - * key_bits bits long (must be 128, 192, or 256). Also resets - * the counter to 0. - */ -static void -aes_set_key(aes_cnt_cipher_t *cipher, const char *key, int key_bits) -{ - if (should_use_EVP) { - const EVP_CIPHER *c; - switch (key_bits) { - case 128: c = EVP_aes_128_ecb(); break; - case 192: c = EVP_aes_192_ecb(); break; - case 256: c = EVP_aes_256_ecb(); break; - default: tor_assert(0); - } - EVP_EncryptInit(&cipher->key.evp, c, (const unsigned char*)key, NULL); - cipher->using_evp = 1; - } else { - AES_set_encrypt_key((const unsigned char *)key, key_bits,&cipher->key.aes); - cipher->using_evp = 0; - } - -#ifdef USING_COUNTER_VARS - cipher->counter0 = 0; - cipher->counter1 = 0; - cipher->counter2 = 0; - cipher->counter3 = 0; -#endif - - memset(cipher->ctr_buf.buf, 0, sizeof(cipher->ctr_buf.buf)); - - cipher->pos = 0; - -#ifdef CAN_USE_OPENSSL_CTR - if (should_use_openssl_CTR) - memset(cipher->buf, 0, sizeof(cipher->buf)); - else -#endif - aes_fill_buf_(cipher); -} - -/** Release storage held by cipher - */ -void -aes_cipher_free(aes_cnt_cipher_t *cipher) -{ - if (!cipher) - return; - if (cipher->using_evp) { - EVP_CIPHER_CTX_cleanup(&cipher->key.evp); - } - memwipe(cipher, 0, sizeof(aes_cnt_cipher_t)); - tor_free(cipher); -} - -#if defined(USING_COUNTER_VARS) -#define UPDATE_CTR_BUF(c, n) STMT_BEGIN \ - (c)->ctr_buf.buf32[3-(n)] = htonl((c)->counter ## n); \ - STMT_END -#else -#define UPDATE_CTR_BUF(c, n) -#endif - -#ifdef CAN_USE_OPENSSL_CTR -/* Helper function to use EVP with openssl's counter-mode wrapper. */ -static void -evp_block128_fn(const uint8_t in[16], - uint8_t out[16], - const void *key) -{ - EVP_CIPHER_CTX *ctx = (void*)key; - int inl=16, outl=16; - EVP_EncryptUpdate(ctx, out, &outl, in, inl); -} -#endif - -/** Encrypt len bytes from input, storing the result in - * output. Uses the key in cipher, and advances the counter - * by len bytes as it encrypts. - */ -void -aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len, - char *output) -{ -#ifdef CAN_USE_OPENSSL_CTR - if (should_use_openssl_CTR) { - if (cipher->using_evp) { - /* In openssl 1.0.0, there's an if'd out EVP_aes_128_ctr in evp.h. If - * it weren't disabled, it might be better just to use that. - */ - CRYPTO_ctr128_encrypt((const unsigned char *)input, - (unsigned char *)output, - len, - &cipher->key.evp, - cipher->ctr_buf.buf, - cipher->buf, - &cipher->pos, - evp_block128_fn); - } else { - AES_ctr128_encrypt((const unsigned char *)input, - (unsigned char *)output, - len, - &cipher->key.aes, - cipher->ctr_buf.buf, - cipher->buf, - &cipher->pos); - } - return; - } else -#endif - { - int c = cipher->pos; - if (PREDICT_UNLIKELY(!len)) return; - - while (1) { - do { - if (len-- == 0) { cipher->pos = c; return; } - *(output++) = *(input++) ^ cipher->buf[c]; - } while (++c != 16); - cipher->pos = c = 0; - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 0))) { - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 1))) { - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 2))) { - ++COUNTER(cipher, 3); - UPDATE_CTR_BUF(cipher, 3); - } - UPDATE_CTR_BUF(cipher, 2); - } - UPDATE_CTR_BUF(cipher, 1); - } - UPDATE_CTR_BUF(cipher, 0); - aes_fill_buf_(cipher); - } - } -} - -/** Encrypt len bytes from input, storing the results in place. - * Uses the key in cipher, and advances the counter by len bytes - * as it encrypts. - */ -void -aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len) -{ -#ifdef CAN_USE_OPENSSL_CTR - if (should_use_openssl_CTR) { - aes_crypt(cipher, data, len, data); - return; - } else -#endif - { - int c = cipher->pos; - if (PREDICT_UNLIKELY(!len)) return; - - while (1) { - do { - if (len-- == 0) { cipher->pos = c; return; } - *(data++) ^= cipher->buf[c]; - } while (++c != 16); - cipher->pos = c = 0; - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 0))) { - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 1))) { - if (PREDICT_UNLIKELY(! ++COUNTER(cipher, 2))) { - ++COUNTER(cipher, 3); - UPDATE_CTR_BUF(cipher, 3); - } - UPDATE_CTR_BUF(cipher, 2); - } - UPDATE_CTR_BUF(cipher, 1); - } - UPDATE_CTR_BUF(cipher, 0); - aes_fill_buf_(cipher); - } - } -} - -/** Reset the 128-bit counter of cipher to the 16-bit big-endian value - * in iv. */ -static void -aes_set_iv(aes_cnt_cipher_t *cipher, const char *iv) -{ -#ifdef USING_COUNTER_VARS - cipher->counter3 = ntohl(get_uint32(iv)); - cipher->counter2 = ntohl(get_uint32(iv+4)); - cipher->counter1 = ntohl(get_uint32(iv+8)); - cipher->counter0 = ntohl(get_uint32(iv+12)); -#endif - cipher->pos = 0; - memcpy(cipher->ctr_buf.buf, iv, 16); - -#ifdef CAN_USE_OPENSSL_CTR - if (!should_use_openssl_CTR) -#endif - aes_fill_buf_(cipher); -} - -#endif - diff --git a/src/tor/aes.h b/src/tor/aes.h deleted file mode 100644 index 8ff28a762..000000000 --- a/src/tor/aes.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Implements a minimal interface to counter-mode AES. */ - -#ifndef TOR_AES_H -#define TOR_AES_H - -/** - * \file aes.h - * \brief Headers for aes.c - */ - -struct aes_cnt_cipher; -typedef struct aes_cnt_cipher aes_cnt_cipher_t; - -aes_cnt_cipher_t* aes_new_cipher(const char *key, const char *iv); -void aes_cipher_free(aes_cnt_cipher_t *cipher); -void aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len, - char *output); -void aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len); - -int evaluate_evp_for_aes(int force_value); -int evaluate_ctr_for_aes(void); - -#endif - diff --git a/src/tor/anonymize.cpp b/src/tor/anonymize.cpp deleted file mode 100644 index 77dae9567..000000000 --- a/src/tor/anonymize.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (c) 2009-2010 Satoshi Nakamoto - Copyright (c) 2009-2012 The Bitcoin developers - Copyright (c) 2013-2014 The StealthCoin/StealthSend Developers */ -/* Copyright (c) 2014, BritCoin Developers */ -/* See LICENSE for licensing information */ - -#include "anonymize.h" -#include "util.h" - -#include -#include -#include -#include -#include - -char const* anonymize_tor_data_directory( -) { - static std::string const retrieved = ( - GetDefaultDataDir( - ) / "tor" - ).string( - ); - return retrieved.c_str( - ); -} - -char const* anonymize_service_directory( -) { - static std::string const retrieved = ( - GetDefaultDataDir( - ) / "onion" - ).string( - ); - return retrieved.c_str( - ); -} - -int check_interrupted( -) { - return boost::this_thread::interruption_requested( - ) ? 1 : 0; -} - -static boost::mutex initializing; - -static std::auto_ptr > uninitialized( - new boost::unique_lock( - initializing - ) -); - -void set_initialized( -) { - uninitialized.reset(); -} - -void wait_initialized( -) { - boost::unique_lock checking(initializing); -} diff --git a/src/tor/anonymize.h b/src/tor/anonymize.h deleted file mode 100644 index 2c5573cce..000000000 --- a/src/tor/anonymize.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2014, BritCoin Developers */ -/* See LICENSE for licensing information */ - -/** - * \file anonymize.h - * \brief Headers for anonymize.cpp - **/ - -#ifndef TOR_ANONYMIZE_H -#define TOR_ANONYMIZE_H - -#ifdef __cplusplus -extern "C" { -#endif - - char const* anonymize_tor_data_directory( - ); - - char const* anonymize_service_directory( - ); - - int check_interrupted( - ); - - void set_initialized( - ); - - void wait_initialized( - ); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src/tor/backtrace.c b/src/tor/backtrace.c deleted file mode 100644 index e1452b067..000000000 --- a/src/tor/backtrace.c +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (c) 2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define __USE_GNU -#define _GNU_SOURCE 1 - -#include "orconfig.h" -#include "backtrace.h" -#include "tor_compat.h" -#include "tor_util.h" -#include "torlog.h" - -#ifdef HAVE_EXECINFO_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SIGNAL_H -#include -#endif - -#ifdef HAVE_CYGWIN_SIGNAL_H -#include -#elif defined(HAVE_SYS_UCONTEXT_H) -#include -#elif defined(HAVE_UCONTEXT_H) -#include -#endif - -#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ - defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION) -#define USE_BACKTRACE -#endif - -#if !defined(USE_BACKTRACE) -#define NO_BACKTRACE_IMPL -#endif - -/** Version of Tor to report in backtrace messages. */ -static char *bt_version = NULL; - -#ifdef USE_BACKTRACE -/** Largest stack depth to try to dump. */ -#define MAX_DEPTH 256 -/** Static allocation of stack to dump. This is static so we avoid stack - * pressure. */ -static void *cb_buf[MAX_DEPTH]; - -/** Change a stacktrace in stack of depth depth so that it will - * log the correct function from which a signal was received with context - * ctx. (When we get a signal, the current function will not have - * called any other function, and will therefore have not pushed its address - * onto the stack. Fortunately, we usually have the program counter in the - * ucontext_t structure. - */ -static void -clean_backtrace(void **stack, int depth, const ucontext_t *ctx) -{ -#ifdef PC_FROM_UCONTEXT -#if defined(__linux__) - const int n = 1; -#elif defined(__darwin__) || defined(__APPLE__) || defined(__OpenBSD__) \ - || defined(__FreeBSD__) - const int n = 2; -#else - const int n = 1; -#endif - if (depth <= n) - return; - - stack[n] = (void*) ctx->PC_FROM_UCONTEXT; -#else - (void) depth; - (void) ctx; -#endif -} - -/** Log a message msg at severity in domain, and follow - * that with a backtrace log. */ -void -log_backtrace(int severity, int domain, const char *msg) -{ - int depth = backtrace(cb_buf, MAX_DEPTH); - char **symbols = backtrace_symbols(cb_buf, depth); - int i; - tor_log(severity, domain, "%s. Stack trace:", msg); - if (!symbols) { - tor_log(severity, domain, " Unable to generate backtrace."); - return; - } - for (i=0; i < depth; ++i) { - tor_log(severity, domain, " %s", symbols[i]); - } - free(symbols); -} - -static void crash_handler(int sig, siginfo_t *si, void *ctx_) - __attribute__((noreturn)); - -/** Signal handler: write a crash message with a stack trace, and die. */ -static void -crash_handler(int sig, siginfo_t *si, void *ctx_) -{ - char buf[40]; - int depth; - ucontext_t *ctx = (ucontext_t *) ctx_; - int n_fds, i; - const int *fds = NULL; - - (void) si; - - depth = backtrace(cb_buf, MAX_DEPTH); - /* Clean up the top stack frame so we get the real function - * name for the most recently failing function. */ - clean_backtrace(cb_buf, depth, ctx); - - format_dec_number_sigsafe((unsigned)sig, buf, sizeof(buf)); - - tor_log_err_sigsafe(bt_version, " died: Caught signal ", buf, "\n", - NULL); - - n_fds = tor_log_get_sigsafe_err_fds(&fds); - for (i=0; i < n_fds; ++i) - backtrace_symbols_fd(cb_buf, depth, fds[i]); - - abort(); -} - -/** Install signal handlers as needed so that when we crash, we produce a - * useful stack trace. Return 0 on success, -1 on failure. */ -static int -install_bt_handler(void) -{ - int trap_signals[] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS, SIGSYS, - SIGIO, -1 }; - int i, rv=0; - - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_sigaction = crash_handler; - sa.sa_flags = SA_SIGINFO; - sigfillset(&sa.sa_mask); - - for (i = 0; trap_signals[i] >= 0; ++i) { - if (sigaction(trap_signals[i], &sa, NULL) == -1) { - log_warn(LD_BUG, "Sigaction failed: %s", strerror(errno)); - rv = -1; - } - } - return rv; -} - -/** Uninstall crash handlers. */ -static void -remove_bt_handler(void) -{ - /* We don't need to actually free anything at exit here. */ -} -#endif - -#ifdef NO_BACKTRACE_IMPL -void -log_backtrace(int severity, int domain, const char *msg) -{ - tor_log(severity, domain, "%s. (Stack trace not available)", msg); -} - -static int -install_bt_handler(void) -{ - return 0; -} - -static void -remove_bt_handler(void) -{ -} -#endif - -/** Set up code to handle generating error messages on crashes. */ -int -configure_backtrace_handler(const char *tor_version) -{ - tor_free(bt_version); - if (!tor_version) - tor_version = ""; - tor_asprintf(&bt_version, "Tor %s", tor_version); - - return install_bt_handler(); -} - -/** Perform end-of-process cleanup for code that generates error messages on - * crashes. */ -void -clean_up_backtrace_handler(void) -{ - remove_bt_handler(); - - tor_free(bt_version); -} - diff --git a/src/tor/backtrace.h b/src/tor/backtrace.h deleted file mode 100644 index 765436fee..000000000 --- a/src/tor/backtrace.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_BACKTRACE_H -#define TOR_BACKTRACE_H - -void log_backtrace(int severity, int domain, const char *msg); -int configure_backtrace_handler(const char *tor_version); -void clean_up_backtrace_handler(void); - -#endif - diff --git a/src/tor/buffers.c b/src/tor/buffers.c deleted file mode 100644 index 40083e7d5..000000000 --- a/src/tor/buffers.c +++ /dev/null @@ -1,2584 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file buffers.c - * \brief Implements a generic interface buffer. Buffers are - * fairly opaque string holders that can read to or flush from: - * memory, file descriptors, or TLS connections. - **/ -#define BUFFERS_PRIVATE -#include "or.h" -#include "addressmap.h" -#include "buffers.h" -#include "config.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "reasons.h" -#include "ext_orport.h" -#include "tor_util.h" -#include "torlog.h" -#ifdef HAVE_UNISTD_H -#include -#endif - -//#define PARANOIA - -#ifdef PARANOIA -/** Helper: If PARANOIA is defined, assert that the buffer in local variable - * buf is well-formed. */ -#define check() STMT_BEGIN assert_buf_ok(buf); STMT_END -#else -#define check() STMT_NIL -#endif - -/* Implementation notes: - * - * After flirting with memmove, and dallying with ring-buffers, we're finally - * getting up to speed with the 1970s and implementing buffers as a linked - * list of small chunks. Each buffer has such a list; data is removed from - * the head of the list, and added at the tail. The list is singly linked, - * and the buffer keeps a pointer to the head and the tail. - * - * Every chunk, except the tail, contains at least one byte of data. Data in - * each chunk is contiguous. - * - * When you need to treat the first N characters on a buffer as a contiguous - * string, use the buf_pullup function to make them so. Don't do this more - * than necessary. - * - * The major free Unix kernels have handled buffers like this since, like, - * forever. - */ - -static int parse_socks(const char *data, size_t datalen, socks_request_t *req, - int log_sockstype, int safe_socks, ssize_t *drain_out, - size_t *want_length_out); -static int parse_socks_client(const uint8_t *data, size_t datalen, - int state, char **reason, - ssize_t *drain_out); - -/* Chunk manipulation functions */ - -/** A single chunk on a buffer or in a freelist. */ -typedef struct chunk_t { - struct chunk_t *next; /**< The next chunk on the buffer or freelist. */ - size_t datalen; /**< The number of bytes stored in this chunk */ - size_t memlen; /**< The number of usable bytes of storage in mem. */ - char *data; /**< A pointer to the first byte of data stored in mem. */ - char mem[FLEXIBLE_ARRAY_MEMBER]; /**< The actual memory used for storage in - * this chunk. */ -} chunk_t; - -#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0]) - -/** Return the number of bytes needed to allocate a chunk to hold - * memlen bytes. */ -#define CHUNK_ALLOC_SIZE(memlen) (CHUNK_HEADER_LEN + (memlen)) -/** Return the number of usable bytes in a chunk allocated with - * malloc(memlen). */ -#define CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - CHUNK_HEADER_LEN) - -/** Return the next character in chunk onto which data can be appended. - * If the chunk is full, this might be off the end of chunk->mem. */ -static INLINE char * -CHUNK_WRITE_PTR(chunk_t *chunk) -{ - return chunk->data + chunk->datalen; -} - -/** Return the number of bytes that can be written onto chunk without - * running out of space. */ -static INLINE size_t -CHUNK_REMAINING_CAPACITY(const chunk_t *chunk) -{ - return (chunk->mem + chunk->memlen) - (chunk->data + chunk->datalen); -} - -/** Move all bytes stored in chunk to the front of chunk->mem, - * to free up space at the end. */ -static INLINE void -chunk_repack(chunk_t *chunk) -{ - if (chunk->datalen && chunk->data != &chunk->mem[0]) { - memmove(chunk->mem, chunk->data, chunk->datalen); - } - chunk->data = &chunk->mem[0]; -} - -#if defined(ENABLE_BUF_FREELISTS) || defined(RUNNING_DOXYGEN) -/** A freelist of chunks. */ -typedef struct chunk_freelist_t { - size_t alloc_size; /**< What size chunks does this freelist hold? */ - int max_length; /**< Never allow more than this number of chunks in the - * freelist. */ - int slack; /**< When trimming the freelist, leave this number of extra - * chunks beyond lowest_length.*/ - int cur_length; /**< How many chunks on the freelist now? */ - int lowest_length; /**< What's the smallest value of cur_length since the - * last time we cleaned this freelist? */ - uint64_t n_alloc; - uint64_t n_free; - uint64_t n_hit; - chunk_t *head; /**< First chunk on the freelist. */ -} chunk_freelist_t; - -/** Macro to help define freelists. */ -#define FL(a,m,s) { a, m, s, 0, 0, 0, 0, 0, NULL } - -/** Static array of freelists, sorted by alloc_len, terminated by an entry - * with alloc_size of 0. */ -static chunk_freelist_t freelists[] = { - FL(4096, 256, 8), FL(8192, 128, 4), FL(16384, 64, 4), FL(32768, 32, 2), - FL(0, 0, 0) -}; -#undef FL -/** How many times have we looked for a chunk of a size that no freelist - * could help with? */ -static uint64_t n_freelist_miss = 0; - -static void assert_freelist_ok(chunk_freelist_t *fl); - -/** Return the freelist to hold chunks of size alloc, or NULL if - * no freelist exists for that size. */ -static INLINE chunk_freelist_t * -get_freelist(size_t alloc) -{ - int i; - for (i=0; (freelists[i].alloc_size <= alloc && - freelists[i].alloc_size); ++i ) { - if (freelists[i].alloc_size == alloc) { - return &freelists[i]; - } - } - return NULL; -} - -/** Deallocate a chunk or put it on a freelist */ -static void -chunk_free_unchecked(chunk_t *chunk) -{ - size_t alloc; - chunk_freelist_t *freelist; - - alloc = CHUNK_ALLOC_SIZE(chunk->memlen); - freelist = get_freelist(alloc); - if (freelist && freelist->cur_length < freelist->max_length) { - chunk->next = freelist->head; - freelist->head = chunk; - ++freelist->cur_length; - } else { - if (freelist) - ++freelist->n_free; - tor_free(chunk); - } -} - -/** Allocate a new chunk with a given allocation size, or get one from the - * freelist. Note that a chunk with allocation size A can actually hold only - * CHUNK_SIZE_WITH_ALLOC(A) bytes in its mem field. */ -static INLINE chunk_t * -chunk_new_with_alloc_size(size_t alloc) -{ - chunk_t *ch; - chunk_freelist_t *freelist; - tor_assert(alloc >= sizeof(chunk_t)); - freelist = get_freelist(alloc); - if (freelist && freelist->head) { - ch = freelist->head; - freelist->head = ch->next; - if (--freelist->cur_length < freelist->lowest_length) - freelist->lowest_length = freelist->cur_length; - ++freelist->n_hit; - } else { - if (freelist) - ++freelist->n_alloc; - else - ++n_freelist_miss; - ch = tor_malloc(alloc); - } - ch->next = NULL; - ch->datalen = 0; - ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc); - ch->data = &ch->mem[0]; - return ch; -} -#else -static void -chunk_free_unchecked(chunk_t *chunk) -{ - tor_free(chunk); -} -static INLINE chunk_t * -chunk_new_with_alloc_size(size_t alloc) -{ - chunk_t *ch; - ch = tor_malloc(alloc); - ch->next = NULL; - ch->datalen = 0; - ch->memlen = CHUNK_SIZE_WITH_ALLOC(alloc); - ch->data = &ch->mem[0]; - return ch; -} -#endif - -/** Expand chunk until it can hold sz bytes, and return a - * new pointer to chunk. Old pointers are no longer valid. */ -static INLINE chunk_t * -chunk_grow(chunk_t *chunk, size_t sz) -{ - off_t offset; - tor_assert(sz > chunk->memlen); - offset = chunk->data - chunk->mem; - chunk = tor_realloc(chunk, CHUNK_ALLOC_SIZE(sz)); - chunk->memlen = sz; - chunk->data = chunk->mem + offset; - return chunk; -} - -/** If a read onto the end of a chunk would be smaller than this number, then - * just start a new chunk. */ -#define MIN_READ_LEN 8 -/** Every chunk should take up at least this many bytes. */ -#define MIN_CHUNK_ALLOC 256 -/** No chunk should take up more than this many bytes. */ -#define MAX_CHUNK_ALLOC 65536 - -/** Return the allocation size we'd like to use to hold target - * bytes. */ -static INLINE size_t -preferred_chunk_size(size_t target) -{ - size_t sz = MIN_CHUNK_ALLOC; - while (CHUNK_SIZE_WITH_ALLOC(sz) < target) { - sz <<= 1; - } - return sz; -} - -/** Remove from the freelists most chunks that have not been used since the - * last call to buf_shrink_freelists(). */ -void -buf_shrink_freelists(int free_all) -{ -#ifdef ENABLE_BUF_FREELISTS - int i; - disable_control_logging(); - for (i = 0; freelists[i].alloc_size; ++i) { - int slack = freelists[i].slack; - assert_freelist_ok(&freelists[i]); - if (free_all || freelists[i].lowest_length > slack) { - int n_to_free = free_all ? freelists[i].cur_length : - (freelists[i].lowest_length - slack); - int n_to_skip = freelists[i].cur_length - n_to_free; - int orig_length = freelists[i].cur_length; - int orig_n_to_free = n_to_free, n_freed=0; - int orig_n_to_skip = n_to_skip; - int new_length = n_to_skip; - chunk_t **chp = &freelists[i].head; - chunk_t *chunk; - while (n_to_skip) { - if (! (*chp)->next) { - log_warn(LD_BUG, "I wanted to skip %d chunks in the freelist for " - "%d-byte chunks, but only found %d. (Length %d)", - orig_n_to_skip, (int)freelists[i].alloc_size, - orig_n_to_skip-n_to_skip, freelists[i].cur_length); - assert_freelist_ok(&freelists[i]); - goto done; - } - // tor_assert((*chp)->next); - chp = &(*chp)->next; - --n_to_skip; - } - chunk = *chp; - *chp = NULL; - while (chunk) { - chunk_t *next = chunk->next; - tor_free(chunk); - chunk = next; - --n_to_free; - ++n_freed; - ++freelists[i].n_free; - } - if (n_to_free) { - log_warn(LD_BUG, "Freelist length for %d-byte chunks may have been " - "messed up somehow.", (int)freelists[i].alloc_size); - log_warn(LD_BUG, "There were %d chunks at the start. I decided to " - "keep %d. I wanted to free %d. I freed %d. I somehow think " - "I have %d left to free.", - freelists[i].cur_length, n_to_skip, orig_n_to_free, - n_freed, n_to_free); - } - // tor_assert(!n_to_free); - freelists[i].cur_length = new_length; - log_info(LD_MM, "Cleaned freelist for %d-byte chunks: original " - "length %d, kept %d, dropped %d.", - (int)freelists[i].alloc_size, orig_length, - orig_n_to_skip, orig_n_to_free); - } - freelists[i].lowest_length = freelists[i].cur_length; - assert_freelist_ok(&freelists[i]); - } - done: - enable_control_logging(); -#else - (void) free_all; -#endif -} - -/** Describe the current status of the freelists at log level severity. - */ -void -buf_dump_freelist_sizes(int severity) -{ -#ifdef ENABLE_BUF_FREELISTS - int i; - tor_log(severity, LD_MM, "====== Buffer freelists:"); - for (i = 0; freelists[i].alloc_size; ++i) { - uint64_t total = ((uint64_t)freelists[i].cur_length) * - freelists[i].alloc_size; - tor_log(severity, LD_MM, - U64_FORMAT" bytes in %d %d-byte chunks ["U64_FORMAT - " misses; "U64_FORMAT" frees; "U64_FORMAT" hits]", - U64_PRINTF_ARG(total), - freelists[i].cur_length, (int)freelists[i].alloc_size, - U64_PRINTF_ARG(freelists[i].n_alloc), - U64_PRINTF_ARG(freelists[i].n_free), - U64_PRINTF_ARG(freelists[i].n_hit)); - } - tor_log(severity, LD_MM, U64_FORMAT" allocations in non-freelist sizes", - U64_PRINTF_ARG(n_freelist_miss)); -#else - (void)severity; -#endif -} - -/** Magic value for buf_t.magic, to catch pointer errors. */ -#define BUFFER_MAGIC 0xB0FFF312u -/** A resizeable buffer, optimized for reading and writing. */ -struct buf_t { - uint32_t magic; /**< Magic cookie for debugging: Must be set to - * BUFFER_MAGIC. */ - size_t datalen; /**< How many bytes is this buffer holding right now? */ - size_t default_chunk_size; /**< Don't allocate any chunks smaller than - * this for this buffer. */ - chunk_t *head; /**< First chunk in the list, or NULL for none. */ - chunk_t *tail; /**< Last chunk in the list, or NULL for none. */ -}; - -/** Collapse data from the first N chunks from buf into buf->head, - * growing it as necessary, until buf->head has the first bytes bytes - * of data from the buffer, or until buf->head has all the data in buf. - * - * If nulterminate is true, ensure that there is a 0 byte in - * buf->head->mem right after all the data. */ -static void -buf_pullup(buf_t *buf, size_t bytes, int nulterminate) -{ - chunk_t *dest, *src; - size_t capacity; - if (!buf->head) - return; - - check(); - if (buf->datalen < bytes) - bytes = buf->datalen; - - if (nulterminate) { - capacity = bytes + 1; - if (buf->head->datalen >= bytes && CHUNK_REMAINING_CAPACITY(buf->head)) { - *CHUNK_WRITE_PTR(buf->head) = '\0'; - return; - } - } else { - capacity = bytes; - if (buf->head->datalen >= bytes) - return; - } - - if (buf->head->memlen >= capacity) { - /* We don't need to grow the first chunk, but we might need to repack it.*/ - size_t needed = capacity - buf->head->datalen; - if (CHUNK_REMAINING_CAPACITY(buf->head) < needed) - chunk_repack(buf->head); - tor_assert(CHUNK_REMAINING_CAPACITY(buf->head) >= needed); - } else { - chunk_t *newhead; - size_t newsize; - /* We need to grow the chunk. */ - chunk_repack(buf->head); - newsize = CHUNK_SIZE_WITH_ALLOC(preferred_chunk_size(capacity)); - newhead = chunk_grow(buf->head, newsize); - tor_assert(newhead->memlen >= capacity); - if (newhead != buf->head) { - if (buf->tail == buf->head) - buf->tail = newhead; - buf->head = newhead; - } - } - - dest = buf->head; - while (dest->datalen < bytes) { - size_t n = bytes - dest->datalen; - src = dest->next; - tor_assert(src); - if (n > src->datalen) { - memcpy(CHUNK_WRITE_PTR(dest), src->data, src->datalen); - dest->datalen += src->datalen; - dest->next = src->next; - if (buf->tail == src) - buf->tail = dest; - chunk_free_unchecked(src); - } else { - memcpy(CHUNK_WRITE_PTR(dest), src->data, n); - dest->datalen += n; - src->data += n; - src->datalen -= n; - tor_assert(dest->datalen == bytes); - } - } - - if (nulterminate) { - tor_assert(CHUNK_REMAINING_CAPACITY(buf->head)); - *CHUNK_WRITE_PTR(buf->head) = '\0'; - } - - check(); -} - -/** Resize buf so it won't hold extra memory that we haven't been - * using lately. - */ -void -buf_shrink(buf_t *buf) -{ - (void)buf; -} - -/** Remove the first n bytes from buf. */ -static INLINE void -buf_remove_from_front(buf_t *buf, size_t n) -{ - tor_assert(buf->datalen >= n); - while (n) { - tor_assert(buf->head); - if (buf->head->datalen > n) { - buf->head->datalen -= n; - buf->head->data += n; - buf->datalen -= n; - return; - } else { - chunk_t *victim = buf->head; - n -= victim->datalen; - buf->datalen -= victim->datalen; - buf->head = victim->next; - if (buf->tail == victim) - buf->tail = NULL; - chunk_free_unchecked(victim); - } - } - check(); -} - -/** Create and return a new buf with default chunk capacity size. - */ -buf_t * -buf_new_with_capacity(size_t size) -{ - buf_t *b = buf_new(); - b->default_chunk_size = preferred_chunk_size(size); - return b; -} - -/** Allocate and return a new buffer with default capacity. */ -buf_t * -buf_new(void) -{ - buf_t *buf = tor_malloc_zero(sizeof(buf_t)); - buf->magic = BUFFER_MAGIC; - buf->default_chunk_size = 4096; - return buf; -} - -/** Remove all data from buf. */ -void -buf_clear(buf_t *buf) -{ - chunk_t *chunk, *next; - buf->datalen = 0; - for (chunk = buf->head; chunk; chunk = next) { - next = chunk->next; - chunk_free_unchecked(chunk); - } - buf->head = buf->tail = NULL; -} - -/** Return the number of bytes stored in buf */ -size_t -buf_datalen(const buf_t *buf) -{ - return buf->datalen; -} - -/** Return the total length of all chunks used in buf. */ -size_t -buf_allocation(const buf_t *buf) -{ - size_t total = 0; - const chunk_t *chunk; - for (chunk = buf->head; chunk; chunk = chunk->next) { - total += chunk->memlen; - } - return total; -} - -/** Return the number of bytes that can be added to buf without - * performing any additional allocation. */ -size_t -buf_slack(const buf_t *buf) -{ - if (!buf->tail) - return 0; - else - return CHUNK_REMAINING_CAPACITY(buf->tail); -} - -/** Release storage held by buf. */ -void -buf_free(buf_t *buf) -{ - if (!buf) - return; - - buf_clear(buf); - buf->magic = 0xdeadbeef; - tor_free(buf); -} - -/** Return a new copy of in_chunk */ -static chunk_t * -chunk_copy(const chunk_t *in_chunk) -{ - chunk_t *newch = tor_memdup(in_chunk, CHUNK_ALLOC_SIZE(in_chunk->memlen)); - newch->next = NULL; - if (in_chunk->data) { - off_t offset = in_chunk->data - in_chunk->mem; - newch->data = newch->mem + offset; - } - return newch; -} - -/** Return a new copy of buf */ -buf_t * -buf_copy(const buf_t *buf) -{ - chunk_t *ch; - buf_t *out = buf_new(); - out->default_chunk_size = buf->default_chunk_size; - for (ch = buf->head; ch; ch = ch->next) { - chunk_t *newch = chunk_copy(ch); - if (out->tail) { - out->tail->next = newch; - out->tail = newch; - } else { - out->head = out->tail = newch; - } - } - out->datalen = buf->datalen; - return out; -} - -/** Append a new chunk with enough capacity to hold capacity bytes to - * the tail of buf. If capped, don't allocate a chunk bigger - * than MAX_CHUNK_ALLOC. */ -static chunk_t * -buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped) -{ - chunk_t *chunk; - if (CHUNK_ALLOC_SIZE(capacity) < buf->default_chunk_size) { - chunk = chunk_new_with_alloc_size(buf->default_chunk_size); - } else if (capped && CHUNK_ALLOC_SIZE(capacity) > MAX_CHUNK_ALLOC) { - chunk = chunk_new_with_alloc_size(MAX_CHUNK_ALLOC); - } else { - chunk = chunk_new_with_alloc_size(preferred_chunk_size(capacity)); - } - if (buf->tail) { - tor_assert(buf->head); - buf->tail->next = chunk; - buf->tail = chunk; - } else { - tor_assert(!buf->head); - buf->head = buf->tail = chunk; - } - check(); - return chunk; -} - -/** Read up to at_most bytes from the socket fd into - * chunk (which must be on buf). If we get an EOF, set - * *reached_eof to 1. Return -1 on error, 0 on eof or blocking, - * and the number of bytes read otherwise. */ -static INLINE int -read_to_chunk(buf_t *buf, chunk_t *chunk, tor_socket_t fd, size_t at_most, - int *reached_eof, int *socket_error) -{ - ssize_t read_result; - if (at_most > CHUNK_REMAINING_CAPACITY(chunk)) - at_most = CHUNK_REMAINING_CAPACITY(chunk); - read_result = tor_socket_recv(fd, CHUNK_WRITE_PTR(chunk), at_most, 0); - - if (read_result < 0) { - int e = tor_socket_errno(fd); - if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ -#ifdef _WIN32 - if (e == WSAENOBUFS) - log_warn(LD_NET,"recv() failed: WSAENOBUFS. Not enough ram?"); -#endif - *socket_error = e; - return -1; - } - return 0; /* would block. */ - } else if (read_result == 0) { - log_debug(LD_NET,"Encountered eof on fd %d", (int)fd); - *reached_eof = 1; - return 0; - } else { /* actually got bytes. */ - buf->datalen += read_result; - chunk->datalen += read_result; - log_debug(LD_NET,"Read %ld bytes. %d on inbuf.", (long)read_result, - (int)buf->datalen); - tor_assert(read_result < INT_MAX); - return (int)read_result; - } -} - -/** As read_to_chunk(), but return (negative) error code on error, blocking, - * or TLS, and the number of bytes read otherwise. */ -static INLINE int -read_to_chunk_tls(buf_t *buf, chunk_t *chunk, tor_tls_t *tls, - size_t at_most) -{ - int read_result; - - tor_assert(CHUNK_REMAINING_CAPACITY(chunk) >= at_most); - read_result = tor_tls_read(tls, CHUNK_WRITE_PTR(chunk), at_most); - if (read_result < 0) - return read_result; - buf->datalen += read_result; - chunk->datalen += read_result; - return read_result; -} - -/** Read from socket s, writing onto end of buf. Read at most - * at_most bytes, growing the buffer as necessary. If recv() returns 0 - * (because of EOF), set *reached_eof to 1 and return 0. Return -1 on - * error; else return the number of bytes read. - */ -/* XXXX024 indicate "read blocked" somehow? */ -int -read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof, - int *socket_error) -{ - /* XXXX024 It's stupid to overload the return values for these functions: - * "error status" and "number of bytes read" are not mutually exclusive. - */ - int r = 0; - size_t total_read = 0; - - check(); - tor_assert(reached_eof); - tor_assert(SOCKET_OK(s)); - - while (at_most > total_read) { - size_t readlen = at_most - total_read; - chunk_t *chunk; - if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) { - chunk = buf_add_chunk_with_capacity(buf, at_most, 1); - if (readlen > chunk->memlen) - readlen = chunk->memlen; - } else { - size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail); - chunk = buf->tail; - if (cap < readlen) - readlen = cap; - } - - r = read_to_chunk(buf, chunk, s, readlen, reached_eof, socket_error); - check(); - if (r < 0) - return r; /* Error */ - tor_assert(total_read+r < INT_MAX); - total_read += r; - if ((size_t)r < readlen) { /* eof, block, or no more to read. */ - break; - } - } - return (int)total_read; -} - -/** As read_to_buf, but reads from a TLS connection, and returns a TLS - * status value rather than the number of bytes read. - * - * Using TLS on OR connections complicates matters in two ways. - * - * First, a TLS stream has its own read buffer independent of the - * connection's read buffer. (TLS needs to read an entire frame from - * the network before it can decrypt any data. Thus, trying to read 1 - * byte from TLS can require that several KB be read from the network - * and decrypted. The extra data is stored in TLS's decrypt buffer.) - * Because the data hasn't been read by Tor (it's still inside the TLS), - * this means that sometimes a connection "has stuff to read" even when - * poll() didn't return POLLIN. The tor_tls_get_pending_bytes function is - * used in connection.c to detect TLS objects with non-empty internal - * buffers and read from them again. - * - * Second, the TLS stream's events do not correspond directly to network - * events: sometimes, before a TLS stream can read, the network must be - * ready to write -- or vice versa. - */ -int -read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf) -{ - int r = 0; - size_t total_read = 0; - - check_no_tls_errors(); - - check(); - - while (at_most > total_read) { - size_t readlen = at_most - total_read; - chunk_t *chunk; - if (!buf->tail || CHUNK_REMAINING_CAPACITY(buf->tail) < MIN_READ_LEN) { - chunk = buf_add_chunk_with_capacity(buf, at_most, 1); - if (readlen > chunk->memlen) - readlen = chunk->memlen; - } else { - size_t cap = CHUNK_REMAINING_CAPACITY(buf->tail); - chunk = buf->tail; - if (cap < readlen) - readlen = cap; - } - - r = read_to_chunk_tls(buf, chunk, tls, readlen); - check(); - if (r < 0) - return r; /* Error */ - tor_assert(total_read+r < INT_MAX); - total_read += r; - if ((size_t)r < readlen) /* eof, block, or no more to read. */ - break; - } - return (int)total_read; -} - -/** Helper for flush_buf(): try to write sz bytes from chunk - * chunk of buffer buf onto socket s. On success, deduct - * the bytes written from *buf_flushlen. Return the number of bytes - * written on success, 0 on blocking, -1 on failure. - */ -static INLINE int -flush_chunk(tor_socket_t s, buf_t *buf, chunk_t *chunk, size_t sz, - size_t *buf_flushlen) -{ - ssize_t write_result; - - if (sz > chunk->datalen) - sz = chunk->datalen; - write_result = tor_socket_send(s, chunk->data, sz, 0); - - if (write_result < 0) { - int e = tor_socket_errno(s); - if (!ERRNO_IS_EAGAIN(e)) { /* it's a real error */ -#ifdef _WIN32 - if (e == WSAENOBUFS) - log_warn(LD_NET,"write() failed: WSAENOBUFS. Not enough ram?"); -#endif - return -1; - } - log_debug(LD_NET,"write() would block, returning."); - return 0; - } else { - *buf_flushlen -= write_result; - buf_remove_from_front(buf, write_result); - tor_assert(write_result < INT_MAX); - return (int)write_result; - } -} - -/** Helper for flush_buf_tls(): try to write sz bytes from chunk - * chunk of buffer buf onto socket s. (Tries to write - * more if there is a forced pending write size.) On success, deduct the - * bytes written from *buf_flushlen. Return the number of bytes - * written on success, and a TOR_TLS error code on failure or blocking. - */ -static INLINE int -flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk, - size_t sz, size_t *buf_flushlen) -{ - int r; - size_t forced; - char *data; - - forced = tor_tls_get_forced_write_size(tls); - if (forced > sz) - sz = forced; - if (chunk) { - data = chunk->data; - tor_assert(sz <= chunk->datalen); - } else { - data = NULL; - tor_assert(sz == 0); - } - r = tor_tls_write(tls, data, sz); - if (r < 0) - return r; - if (*buf_flushlen > (size_t)r) - *buf_flushlen -= r; - else - *buf_flushlen = 0; - buf_remove_from_front(buf, r); - log_debug(LD_NET,"flushed %d bytes, %d ready to flush, %d remain.", - r,(int)*buf_flushlen,(int)buf->datalen); - return r; -} - -/** Write data from buf to the socket s. Write at most - * sz bytes, decrement *buf_flushlen by - * the number of bytes actually written, and remove the written bytes - * from the buffer. Return the number of bytes written on success, - * -1 on failure. Return 0 if write() would block. - */ -int -flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen) -{ - /* XXXX024 It's stupid to overload the return values for these functions: - * "error status" and "number of bytes flushed" are not mutually exclusive. - */ - int r; - size_t flushed = 0; - tor_assert(buf_flushlen); - tor_assert(SOCKET_OK(s)); - tor_assert(*buf_flushlen <= buf->datalen); - tor_assert(sz <= *buf_flushlen); - - check(); - while (sz) { - size_t flushlen0; - tor_assert(buf->head); - if (buf->head->datalen >= sz) - flushlen0 = sz; - else - flushlen0 = buf->head->datalen; - - r = flush_chunk(s, buf, buf->head, flushlen0, buf_flushlen); - check(); - if (r < 0) - return r; - flushed += r; - sz -= r; - if (r == 0 || (size_t)r < flushlen0) /* can't flush any more now. */ - break; - } - tor_assert(flushed < INT_MAX); - return (int)flushed; -} - -/** As flush_buf(), but writes data to a TLS connection. Can write more than - * flushlen bytes. - */ -int -flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t flushlen, - size_t *buf_flushlen) -{ - int r; - size_t flushed = 0; - ssize_t sz; - tor_assert(buf_flushlen); - tor_assert(*buf_flushlen <= buf->datalen); - tor_assert(flushlen <= *buf_flushlen); - sz = (ssize_t) flushlen; - - /* we want to let tls write even if flushlen is zero, because it might - * have a partial record pending */ - check_no_tls_errors(); - - check(); - do { - size_t flushlen0; - if (buf->head) { - if ((ssize_t)buf->head->datalen >= sz) - flushlen0 = sz; - else - flushlen0 = buf->head->datalen; - } else { - flushlen0 = 0; - } - - r = flush_chunk_tls(tls, buf, buf->head, flushlen0, buf_flushlen); - check(); - if (r < 0) - return r; - flushed += r; - sz -= r; - if (r == 0) /* Can't flush any more now. */ - break; - } while (sz > 0); - tor_assert(flushed < INT_MAX); - return (int)flushed; -} - -/** Append string_len bytes from string to the end of - * buf. - * - * Return the new length of the buffer on success, -1 on failure. - */ -int -write_to_buf(const char *string, size_t string_len, buf_t *buf) -{ - if (!string_len) - return (int)buf->datalen; - check(); - - while (string_len) { - size_t copy; - if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail)) - buf_add_chunk_with_capacity(buf, string_len, 1); - - copy = CHUNK_REMAINING_CAPACITY(buf->tail); - if (copy > string_len) - copy = string_len; - memcpy(CHUNK_WRITE_PTR(buf->tail), string, copy); - string_len -= copy; - string += copy; - buf->datalen += copy; - buf->tail->datalen += copy; - } - - check(); - tor_assert(buf->datalen < INT_MAX); - return (int)buf->datalen; -} - -/** Helper: copy the first string_len bytes from buf - * onto string. - */ -static INLINE void -peek_from_buf(char *string, size_t string_len, const buf_t *buf) -{ - chunk_t *chunk; - - tor_assert(string); - /* make sure we don't ask for too much */ - tor_assert(string_len <= buf->datalen); - /* assert_buf_ok(buf); */ - - chunk = buf->head; - while (string_len) { - size_t copy = string_len; - tor_assert(chunk); - if (chunk->datalen < copy) - copy = chunk->datalen; - memcpy(string, chunk->data, copy); - string_len -= copy; - string += copy; - chunk = chunk->next; - } -} - -/** Remove string_len bytes from the front of buf, and store - * them into string. Return the new buffer size. string_len - * must be \<= the number of bytes on the buffer. - */ -int -fetch_from_buf(char *string, size_t string_len, buf_t *buf) -{ - /* There must be string_len bytes in buf; write them onto string, - * then memmove buf back (that is, remove them from buf). - * - * Return the number of bytes still on the buffer. */ - - check(); - peek_from_buf(string, string_len, buf); - buf_remove_from_front(buf, string_len); - check(); - tor_assert(buf->datalen < INT_MAX); - return (int)buf->datalen; -} - -/** True iff the cell command command is one that implies a - * variable-length cell in Tor link protocol linkproto. */ -static INLINE int -cell_command_is_var_length(uint8_t command, int linkproto) -{ - /* If linkproto is v2 (2), CELL_VERSIONS is the only variable-length cells - * work as implemented here. If it's 1, there are no variable-length cells. - * Tor does not support other versions right now, and so can't negotiate - * them. - */ - switch (linkproto) { - case 1: - /* Link protocol version 1 has no variable-length cells. */ - return 0; - case 2: - /* In link protocol version 2, VERSIONS is the only variable-length cell */ - return command == CELL_VERSIONS; - case 0: - case 3: - default: - /* In link protocol version 3 and later, and in version "unknown", - * commands 128 and higher indicate variable-length. VERSIONS is - * grandfathered in. */ - return command == CELL_VERSIONS || command >= 128; - } -} - -/** Check buf for a variable-length cell according to the rules of link - * protocol version linkproto. If one is found, pull it off the buffer - * and assign a newly allocated var_cell_t to *out, and return 1. - * Return 0 if whatever is on the start of buf_t is not a variable-length - * cell. Return 1 and set *out to NULL if there seems to be the start - * of a variable-length cell on buf, but the whole thing isn't there - * yet. */ -int -fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto) -{ - char hdr[VAR_CELL_MAX_HEADER_SIZE]; - var_cell_t *result; - uint8_t command; - uint16_t length; - const int wide_circ_ids = linkproto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS; - const int circ_id_len = get_circ_id_size(wide_circ_ids); - const unsigned header_len = get_var_cell_header_size(wide_circ_ids); - check(); - *out = NULL; - if (buf->datalen < header_len) - return 0; - peek_from_buf(hdr, header_len, buf); - - command = get_uint8(hdr + circ_id_len); - if (!(cell_command_is_var_length(command, linkproto))) - return 0; - - length = ntohs(get_uint16(hdr + circ_id_len + 1)); - if (buf->datalen < (size_t)(header_len+length)) - return 1; - result = var_cell_new(length); - result->command = command; - if (wide_circ_ids) - result->circ_id = ntohl(get_uint32(hdr)); - else - result->circ_id = ntohs(get_uint16(hdr)); - - buf_remove_from_front(buf, header_len); - peek_from_buf((char*) result->payload, length, buf); - buf_remove_from_front(buf, length); - check(); - - *out = result; - return 1; -} - -#ifdef USE_BUFFEREVENTS -/** Try to read n bytes from buf at pos (which may be - * NULL for the start of the buffer), copying the data only if necessary. Set - * *data_out to a pointer to the desired bytes. Set free_out - * to 1 if we needed to malloc *data because the original bytes were - * noncontiguous; 0 otherwise. Return the number of bytes actually available - * at *data_out. - */ -static ssize_t -inspect_evbuffer(struct evbuffer *buf, char **data_out, size_t n, - int *free_out, struct evbuffer_ptr *pos) -{ - int n_vecs, i; - - if (evbuffer_get_length(buf) < n) - n = evbuffer_get_length(buf); - if (n == 0) - return 0; - n_vecs = evbuffer_peek(buf, n, pos, NULL, 0); - tor_assert(n_vecs > 0); - if (n_vecs == 1) { - struct evbuffer_iovec v; - i = evbuffer_peek(buf, n, pos, &v, 1); - tor_assert(i == 1); - *data_out = v.iov_base; - *free_out = 0; - return v.iov_len; - } else { - ev_ssize_t copied; - *data_out = tor_malloc(n); - *free_out = 1; - copied = evbuffer_copyout(buf, *data_out, n); - tor_assert(copied >= 0 && (size_t)copied == n); - return copied; - } -} - -/** As fetch_var_cell_from_buf, buf works on an evbuffer. */ -int -fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out, - int linkproto) -{ - char *hdr = NULL; - int free_hdr = 0; - size_t n; - size_t buf_len; - uint8_t command; - uint16_t cell_length; - var_cell_t *cell; - int result = 0; - const int wide_circ_ids = linkproto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS; - const int circ_id_len = get_circ_id_size(wide_circ_ids); - const unsigned header_len = get_var_cell_header_size(wide_circ_ids); - - *out = NULL; - buf_len = evbuffer_get_length(buf); - if (buf_len < header_len) - return 0; - - n = inspect_evbuffer(buf, &hdr, header_len, &free_hdr, NULL); - tor_assert(n >= header_len); - - command = get_uint8(hdr + circ_id_len); - if (!(cell_command_is_var_length(command, linkproto))) { - goto done; - } - - cell_length = ntohs(get_uint16(hdr + circ_id_len + 1)); - if (buf_len < (size_t)(header_len+cell_length)) { - result = 1; /* Not all here yet. */ - goto done; - } - - cell = var_cell_new(cell_length); - cell->command = command; - if (wide_circ_ids) - cell->circ_id = ntohl(get_uint32(hdr)); - else - cell->circ_id = ntohs(get_uint16(hdr)); - evbuffer_drain(buf, header_len); - evbuffer_remove(buf, cell->payload, cell_length); - *out = cell; - result = 1; - - done: - if (free_hdr && hdr) - tor_free(hdr); - return result; -} -#endif - -/** Move up to *buf_flushlen bytes from buf_in to - * buf_out, and modify *buf_flushlen appropriately. - * Return the number of bytes actually copied. - */ -int -move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) -{ - /* We can do way better here, but this doesn't turn up in any profiles. */ - char b[4096]; - size_t cp, len; - len = *buf_flushlen; - if (len > buf_in->datalen) - len = buf_in->datalen; - - cp = len; /* Remember the number of bytes we intend to copy. */ - tor_assert(cp < INT_MAX); - while (len) { - /* This isn't the most efficient implementation one could imagine, since - * it does two copies instead of 1, but I kinda doubt that this will be - * critical path. */ - size_t n = len > sizeof(b) ? sizeof(b) : len; - fetch_from_buf(b, n, buf_in); - write_to_buf(b, n, buf_out); - len -= n; - } - *buf_flushlen -= cp; - return (int)cp; -} - -/** Internal structure: represents a position in a buffer. */ -typedef struct buf_pos_t { - const chunk_t *chunk; /**< Which chunk are we pointing to? */ - int pos;/**< Which character inside the chunk's data are we pointing to? */ - size_t chunk_pos; /**< Total length of all previous chunks. */ -} buf_pos_t; - -/** Initialize out to point to the first character of buf.*/ -static void -buf_pos_init(const buf_t *buf, buf_pos_t *out) -{ - out->chunk = buf->head; - out->pos = 0; - out->chunk_pos = 0; -} - -/** Advance out to the first appearance of ch at the current - * position of out, or later. Return -1 if no instances are found; - * otherwise returns the absolute position of the character. */ -static off_t -buf_find_pos_of_char(char ch, buf_pos_t *out) -{ - const chunk_t *chunk; - int pos; - tor_assert(out); - if (out->chunk) { - if (out->chunk->datalen) { - tor_assert(out->pos < (off_t)out->chunk->datalen); - } else { - tor_assert(out->pos == 0); - } - } - pos = out->pos; - for (chunk = out->chunk; chunk; chunk = chunk->next) { - char *cp = memchr(chunk->data+pos, ch, chunk->datalen - pos); - if (cp) { - out->chunk = chunk; - tor_assert(cp - chunk->data < INT_MAX); - out->pos = (int)(cp - chunk->data); - return out->chunk_pos + out->pos; - } else { - out->chunk_pos += chunk->datalen; - pos = 0; - } - } - return -1; -} - -/** Advance pos by a single character, if there are any more characters - * in the buffer. Returns 0 on success, -1 on failure. */ -static INLINE int -buf_pos_inc(buf_pos_t *pos) -{ - ++pos->pos; - if (pos->pos == (off_t)pos->chunk->datalen) { - if (!pos->chunk->next) - return -1; - pos->chunk_pos += pos->chunk->datalen; - pos->chunk = pos->chunk->next; - pos->pos = 0; - } - return 0; -} - -/** Return true iff the n-character string in s appears - * (verbatim) at pos. */ -static int -buf_matches_at_pos(const buf_pos_t *pos, const char *s, size_t n) -{ - buf_pos_t p; - if (!n) - return 1; - - memcpy(&p, pos, sizeof(p)); - - while (1) { - char ch = p.chunk->data[p.pos]; - if (ch != *s) - return 0; - ++s; - /* If we're out of characters that don't match, we match. Check this - * _before_ we test incrementing pos, in case we're at the end of the - * string. */ - if (--n == 0) - return 1; - if (buf_pos_inc(&p)<0) - return 0; - } -} - -/** Return the first position in buf at which the n-character - * string s occurs, or -1 if it does not occur. */ -STATIC int -buf_find_string_offset(const buf_t *buf, const char *s, size_t n) -{ - buf_pos_t pos; - buf_pos_init(buf, &pos); - while (buf_find_pos_of_char(*s, &pos) >= 0) { - if (buf_matches_at_pos(&pos, s, n)) { - tor_assert(pos.chunk_pos + pos.pos < INT_MAX); - return (int)(pos.chunk_pos + pos.pos); - } else { - if (buf_pos_inc(&pos)<0) - return -1; - } - } - return -1; -} - -/** There is a (possibly incomplete) http statement on buf, of the - * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain NULs.) - * If a) the headers include a Content-Length field and all bytes in - * the body are present, or b) there's no Content-Length field and - * all headers are present, then: - * - * - strdup headers into *headers_out, and NUL-terminate it. - * - memdup body into *body_out, and NUL-terminate it. - * - Then remove them from buf, and return 1. - * - * - If headers or body is NULL, discard that part of the buf. - * - If a headers or body doesn't fit in the arg, return -1. - * (We ensure that the headers or body don't exceed max len, - * _even if_ we're planning to discard them.) - * - If force_complete is true, then succeed even if not all of the - * content has arrived. - * - * Else, change nothing and return 0. - */ -int -fetch_from_buf_http(buf_t *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete) -{ - char *headers, *p; - size_t headerlen, bodylen, contentlen; - int crlf_offset; - - check(); - if (!buf->head) - return 0; - - crlf_offset = buf_find_string_offset(buf, "\r\n\r\n", 4); - if (crlf_offset > (int)max_headerlen || - (crlf_offset < 0 && buf->datalen > max_headerlen)) { - log_debug(LD_HTTP,"headers too long."); - return -1; - } else if (crlf_offset < 0) { - log_debug(LD_HTTP,"headers not all here yet."); - return 0; - } - /* Okay, we have a full header. Make sure it all appears in the first - * chunk. */ - if ((int)buf->head->datalen < crlf_offset + 4) - buf_pullup(buf, crlf_offset+4, 0); - headerlen = crlf_offset + 4; - - headers = buf->head->data; - bodylen = buf->datalen - headerlen; - log_debug(LD_HTTP,"headerlen %d, bodylen %d.", (int)headerlen, (int)bodylen); - - if (max_headerlen <= headerlen) { - log_warn(LD_HTTP,"headerlen %d larger than %d. Failing.", - (int)headerlen, (int)max_headerlen-1); - return -1; - } - if (max_bodylen <= bodylen) { - log_warn(LD_HTTP,"bodylen %d larger than %d. Failing.", - (int)bodylen, (int)max_bodylen-1); - return -1; - } - -#define CONTENT_LENGTH "\r\nContent-Length: " - p = (char*) tor_memstr(headers, headerlen, CONTENT_LENGTH); - if (p) { - int i; - i = atoi(p+strlen(CONTENT_LENGTH)); - if (i < 0) { - log_warn(LD_PROTOCOL, "Content-Length is less than zero; it looks like " - "someone is trying to crash us."); - return -1; - } - contentlen = i; - /* if content-length is malformed, then our body length is 0. fine. */ - log_debug(LD_HTTP,"Got a contentlen of %d.",(int)contentlen); - if (bodylen < contentlen) { - if (!force_complete) { - log_debug(LD_HTTP,"body not all here yet."); - return 0; /* not all there yet */ - } - } - if (bodylen > contentlen) { - bodylen = contentlen; - log_debug(LD_HTTP,"bodylen reduced to %d.",(int)bodylen); - } - } - /* all happy. copy into the appropriate places, and return 1 */ - if (headers_out) { - *headers_out = tor_malloc(headerlen+1); - fetch_from_buf(*headers_out, headerlen, buf); - (*headers_out)[headerlen] = 0; /* NUL terminate it */ - } - if (body_out) { - tor_assert(body_used); - *body_used = bodylen; - *body_out = tor_malloc(bodylen+1); - fetch_from_buf(*body_out, bodylen, buf); - (*body_out)[bodylen] = 0; /* NUL terminate it */ - } - check(); - return 1; -} - -#ifdef USE_BUFFEREVENTS -/** As fetch_from_buf_http, buf works on an evbuffer. */ -int -fetch_from_evbuffer_http(struct evbuffer *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete) -{ - struct evbuffer_ptr crlf, content_length; - size_t headerlen, bodylen, contentlen; - - /* Find the first \r\n\r\n in the buffer */ - crlf = evbuffer_search(buf, "\r\n\r\n", 4, NULL); - if (crlf.pos < 0) { - /* We didn't find one. */ - if (evbuffer_get_length(buf) > max_headerlen) - return -1; /* Headers too long. */ - return 0; /* Headers not here yet. */ - } else if (crlf.pos > (int)max_headerlen) { - return -1; /* Headers too long. */ - } - - headerlen = crlf.pos + 4; /* Skip over the \r\n\r\n */ - bodylen = evbuffer_get_length(buf) - headerlen; - if (bodylen > max_bodylen) - return -1; /* body too long */ - - /* Look for the first occurrence of CONTENT_LENGTH insize buf before the - * crlfcrlf */ - content_length = evbuffer_search_range(buf, CONTENT_LENGTH, - strlen(CONTENT_LENGTH), NULL, &crlf); - - if (content_length.pos >= 0) { - /* We found a content_length: parse it and figure out if the body is here - * yet. */ - struct evbuffer_ptr eol; - char *data = NULL; - int free_data = 0; - int n, i; - n = evbuffer_ptr_set(buf, &content_length, strlen(CONTENT_LENGTH), - EVBUFFER_PTR_ADD); - tor_assert(n == 0); - eol = evbuffer_search_eol(buf, &content_length, NULL, EVBUFFER_EOL_CRLF); - tor_assert(eol.pos > content_length.pos); - tor_assert(eol.pos <= crlf.pos); - inspect_evbuffer(buf, &data, eol.pos - content_length.pos, &free_data, - &content_length); - - i = atoi(data); - if (free_data) - tor_free(data); - if (i < 0) { - log_warn(LD_PROTOCOL, "Content-Length is less than zero; it looks like " - "someone is trying to crash us."); - return -1; - } - contentlen = i; - /* if content-length is malformed, then our body length is 0. fine. */ - log_debug(LD_HTTP,"Got a contentlen of %d.",(int)contentlen); - if (bodylen < contentlen) { - if (!force_complete) { - log_debug(LD_HTTP,"body not all here yet."); - return 0; /* not all there yet */ - } - } - if (bodylen > contentlen) { - bodylen = contentlen; - log_debug(LD_HTTP,"bodylen reduced to %d.",(int)bodylen); - } - } - - if (headers_out) { - *headers_out = tor_malloc(headerlen+1); - evbuffer_remove(buf, *headers_out, headerlen); - (*headers_out)[headerlen] = '\0'; - } - if (body_out) { - tor_assert(headers_out); - tor_assert(body_used); - *body_used = bodylen; - *body_out = tor_malloc(bodylen+1); - evbuffer_remove(buf, *body_out, bodylen); - (*body_out)[bodylen] = '\0'; - } - return 1; -} -#endif - -/** - * Wait this many seconds before warning the user about using SOCKS unsafely - * again (requires that WarnUnsafeSocks is turned on). */ -#define SOCKS_WARN_INTERVAL 5 - -/** Warn that the user application has made an unsafe socks request using - * protocol socks_protocol on port port. Don't warn more than - * once per SOCKS_WARN_INTERVAL, unless safe_socks is set. */ -static void -log_unsafe_socks_warning(int socks_protocol, const char *address, - uint16_t port, int safe_socks) -{ - static ratelim_t socks_ratelim = RATELIM_INIT(SOCKS_WARN_INTERVAL); - - const or_options_t *options = get_options(); - if (! options->WarnUnsafeSocks) - return; - if (safe_socks) { - log_fn_ratelim(&socks_ratelim, LOG_WARN, LD_APP, - "Your application (using socks%d to port %d) is giving " - "Tor only an IP address. Applications that do DNS resolves " - "themselves may leak information. Consider using Socks4A " - "(e.g. via privoxy or socat) instead. For more information, " - "please see https://wiki.torproject.org/TheOnionRouter/" - "TorFAQ#SOCKSAndDNS.%s", - socks_protocol, - (int)port, - safe_socks ? " Rejecting." : ""); - } - control_event_client_status(LOG_WARN, - "DANGEROUS_SOCKS PROTOCOL=SOCKS%d ADDRESS=%s:%d", - socks_protocol, address, (int)port); -} - -/** Do not attempt to parse socks messages longer than this. This value is - * actually significantly higher than the longest possible socks message. */ -#define MAX_SOCKS_MESSAGE_LEN 512 - -/** Return a new socks_request_t. */ -socks_request_t * -socks_request_new(void) -{ - return tor_malloc_zero(sizeof(socks_request_t)); -} - -/** Free all storage held in the socks_request_t req. */ -void -socks_request_free(socks_request_t *req) -{ - if (!req) - return; - if (req->username) { - memwipe(req->username, 0x10, req->usernamelen); - tor_free(req->username); - } - if (req->password) { - memwipe(req->password, 0x04, req->passwordlen); - tor_free(req->password); - } - memwipe(req, 0xCC, sizeof(socks_request_t)); - tor_free(req); -} - -/** There is a (possibly incomplete) socks handshake on buf, of one - * of the forms - * - socks4: "socksheader username\\0" - * - socks4a: "socksheader username\\0 destaddr\\0" - * - socks5 phase one: "version #methods methods" - * - socks5 phase two: "version command 0 addresstype..." - * If it's a complete and valid handshake, and destaddr fits in - * MAX_SOCKS_ADDR_LEN bytes, then pull the handshake off the buf, - * assign to req, and return 1. - * - * If it's invalid or too big, return -1. - * - * Else it's not all there yet, leave buf alone and return 0. - * - * If you want to specify the socks reply, write it into req->reply - * and set req->replylen, else leave req->replylen alone. - * - * If log_sockstype is non-zero, then do a notice-level log of whether - * the connection is possibly leaking DNS requests locally or not. - * - * If safe_socks is true, then reject unsafe socks protocols. - * - * If returning 0 or -1, req->address and req->port are - * undefined. - */ -int -fetch_from_buf_socks(buf_t *buf, socks_request_t *req, - int log_sockstype, int safe_socks) -{ - int res; - ssize_t n_drain; - size_t want_length = 128; - - if (buf->datalen < 2) /* version and another byte */ - return 0; - - do { - n_drain = 0; - buf_pullup(buf, want_length, 0); - tor_assert(buf->head && buf->head->datalen >= 2); - want_length = 0; - - res = parse_socks(buf->head->data, buf->head->datalen, req, log_sockstype, - safe_socks, &n_drain, &want_length); - - if (n_drain < 0) - buf_clear(buf); - else if (n_drain > 0) - buf_remove_from_front(buf, n_drain); - - } while (res == 0 && buf->head && want_length < buf->datalen && - buf->datalen >= 2); - - return res; -} - -#ifdef USE_BUFFEREVENTS -/* As fetch_from_buf_socks(), but targets an evbuffer instead. */ -int -fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req, - int log_sockstype, int safe_socks) -{ - char *data; - ssize_t n_drain; - size_t datalen, buflen, want_length; - int res; - - buflen = evbuffer_get_length(buf); - if (buflen < 2) - return 0; - - { - /* See if we can find the socks request in the first chunk of the buffer. - */ - struct evbuffer_iovec v; - int i; - n_drain = 0; - i = evbuffer_peek(buf, -1, NULL, &v, 1); - tor_assert(i == 1); - data = v.iov_base; - datalen = v.iov_len; - want_length = 0; - - res = parse_socks(data, datalen, req, log_sockstype, - safe_socks, &n_drain, &want_length); - - if (n_drain < 0) - evbuffer_drain(buf, evbuffer_get_length(buf)); - else if (n_drain > 0) - evbuffer_drain(buf, n_drain); - - if (res) - return res; - } - - /* Okay, the first chunk of the buffer didn't have a complete socks request. - * That means that either we don't have a whole socks request at all, or - * it's gotten split up. We're going to try passing parse_socks() bigger - * and bigger chunks until either it says "Okay, I got it", or it says it - * will need more data than we currently have. */ - - /* Loop while we have more data that we haven't given parse_socks() yet. */ - do { - int free_data = 0; - const size_t last_wanted = want_length; - n_drain = 0; - data = NULL; - datalen = inspect_evbuffer(buf, &data, want_length, &free_data, NULL); - - want_length = 0; - res = parse_socks(data, datalen, req, log_sockstype, - safe_socks, &n_drain, &want_length); - - if (free_data) - tor_free(data); - - if (n_drain < 0) - evbuffer_drain(buf, evbuffer_get_length(buf)); - else if (n_drain > 0) - evbuffer_drain(buf, n_drain); - - if (res == 0 && n_drain == 0 && want_length <= last_wanted) { - /* If we drained nothing, and we didn't ask for more than last time, - * then we probably wanted more data than the buffer actually had, - * and we're finding out that we're not satisified with it. It's - * time to break until we have more data. */ - break; - } - - buflen = evbuffer_get_length(buf); - } while (res == 0 && want_length <= buflen && buflen >= 2); - - return res; -} -#endif - -/** The size of the header of an Extended ORPort message: 2 bytes for - * COMMAND, 2 bytes for BODYLEN */ -#define EXT_OR_CMD_HEADER_SIZE 4 - -/** Read buf, which should contain an Extended ORPort message - * from a transport proxy. If well-formed, create and populate - * out with the Extended ORport message. Return 0 if the - * buffer was incomplete, 1 if it was well-formed and -1 if we - * encountered an error while parsing it. */ -int -fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out) -{ - char hdr[EXT_OR_CMD_HEADER_SIZE]; - uint16_t len; - - check(); - if (buf->datalen < EXT_OR_CMD_HEADER_SIZE) - return 0; - peek_from_buf(hdr, sizeof(hdr), buf); - len = ntohs(get_uint16(hdr+2)); - if (buf->datalen < (unsigned)len + EXT_OR_CMD_HEADER_SIZE) - return 0; - *out = ext_or_cmd_new(len); - (*out)->cmd = ntohs(get_uint16(hdr)); - (*out)->len = len; - buf_remove_from_front(buf, EXT_OR_CMD_HEADER_SIZE); - fetch_from_buf((*out)->body, len, buf); - return 1; -} - -#ifdef USE_BUFFEREVENTS -/** Read buf, which should contain an Extended ORPort message - * from a transport proxy. If well-formed, create and populate - * out with the Extended ORport message. Return 0 if the - * buffer was incomplete, 1 if it was well-formed and -1 if we - * encountered an error while parsing it. */ -int -fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, ext_or_cmd_t **out) -{ - char hdr[EXT_OR_CMD_HEADER_SIZE]; - uint16_t len; - size_t buf_len = evbuffer_get_length(buf); - - if (buf_len < EXT_OR_CMD_HEADER_SIZE) - return 0; - evbuffer_copyout(buf, hdr, EXT_OR_CMD_HEADER_SIZE); - len = ntohs(get_uint16(hdr+2)); - if (buf_len < (unsigned)len + EXT_OR_CMD_HEADER_SIZE) - return 0; - *out = ext_or_cmd_new(len); - (*out)->cmd = ntohs(get_uint16(hdr)); - (*out)->len = len; - evbuffer_drain(buf, EXT_OR_CMD_HEADER_SIZE); - evbuffer_remove(buf, (*out)->body, len); - return 1; -} -#endif - -/** Implementation helper to implement fetch_from_*_socks. Instead of looking - * at a buffer's contents, we look at the datalen bytes of data in - * data. Instead of removing data from the buffer, we set - * drain_out to the amount of data that should be removed (or -1 if the - * buffer should be cleared). Instead of pulling more data into the first - * chunk of the buffer, we set *want_length_out to the number of bytes - * we'd like to see in the input buffer, if they're available. */ -static int -parse_socks(const char *data, size_t datalen, socks_request_t *req, - int log_sockstype, int safe_socks, ssize_t *drain_out, - size_t *want_length_out) -{ - unsigned int len; - char tmpbuf[TOR_ADDR_BUF_LEN+1]; - tor_addr_t destaddr; - uint32_t destip; - uint8_t socksver; - char *next, *startaddr; - unsigned char usernamelen, passlen; - struct in_addr in; - - if (datalen < 2) { - /* We always need at least 2 bytes. */ - *want_length_out = 2; - return 0; - } - - if (req->socks_version == 5 && !req->got_auth) { - /* See if we have received authentication. Strictly speaking, we should - also check whether we actually negotiated username/password - authentication. But some broken clients will send us authentication - even if we negotiated SOCKS_NO_AUTH. */ - if (*data == 1) { /* username/pass version 1 */ - /* Format is: authversion [1 byte] == 1 - usernamelen [1 byte] - username [usernamelen bytes] - passlen [1 byte] - password [passlen bytes] */ - usernamelen = (unsigned char)*(data + 1); - if (datalen < 2u + usernamelen + 1u) { - *want_length_out = 2u + usernamelen + 1u; - return 0; - } - passlen = (unsigned char)*(data + 2u + usernamelen); - if (datalen < 2u + usernamelen + 1u + passlen) { - *want_length_out = 2u + usernamelen + 1u + passlen; - return 0; - } - req->replylen = 2; /* 2 bytes of response */ - req->reply[0] = 1; /* authversion == 1 */ - req->reply[1] = 0; /* authentication successful */ - log_debug(LD_APP, - "socks5: Accepted username/password without checking."); - if (usernamelen) { - req->username = tor_memdup(data+2u, usernamelen); - req->usernamelen = usernamelen; - } - if (passlen) { - req->password = tor_memdup(data+3u+usernamelen, passlen); - req->passwordlen = passlen; - } - *drain_out = 2u + usernamelen + 1u + passlen; - req->got_auth = 1; - *want_length_out = 7; /* Minimal socks5 sommand. */ - return 0; - } else if (req->auth_type == SOCKS_USER_PASS) { - /* unknown version byte */ - log_warn(LD_APP, "Socks5 username/password version %d not recognized; " - "rejecting.", (int)*data); - return -1; - } - } - - socksver = *data; - - switch (socksver) { /* which version of socks? */ - case 5: /* socks5 */ - - if (req->socks_version != 5) { /* we need to negotiate a method */ - unsigned char nummethods = (unsigned char)*(data+1); - int have_user_pass, have_no_auth; - int r=0; - tor_assert(!req->socks_version); - if (datalen < 2u+nummethods) { - *want_length_out = 2u+nummethods; - return 0; - } - if (!nummethods) - return -1; - req->replylen = 2; /* 2 bytes of response */ - req->reply[0] = 5; /* socks5 reply */ - have_user_pass = (memchr(data+2, SOCKS_USER_PASS, nummethods) !=NULL); - have_no_auth = (memchr(data+2, SOCKS_NO_AUTH, nummethods) !=NULL); - if (have_user_pass && !(have_no_auth && req->socks_prefer_no_auth)) { - req->auth_type = SOCKS_USER_PASS; - req->reply[1] = SOCKS_USER_PASS; /* tell client to use "user/pass" - auth method */ - req->socks_version = 5; /* remember we've already negotiated auth */ - log_debug(LD_APP,"socks5: accepted method 2 (username/password)"); - r=0; - } else if (have_no_auth) { - req->reply[1] = SOCKS_NO_AUTH; /* tell client to use "none" auth - method */ - req->socks_version = 5; /* remember we've already negotiated auth */ - log_debug(LD_APP,"socks5: accepted method 0 (no authentication)"); - r=0; - } else { - log_warn(LD_APP, - "socks5: offered methods don't include 'no auth' or " - "username/password. Rejecting."); - req->reply[1] = '\xFF'; /* reject all methods */ - r=-1; - } - /* Remove packet from buf. Some SOCKS clients will have sent extra - * junk at this point; let's hope it's an authentication message. */ - *drain_out = 2u + nummethods; - - return r; - } - if (req->auth_type != SOCKS_NO_AUTH && !req->got_auth) { - log_warn(LD_APP, - "socks5: negotiated authentication, but none provided"); - return -1; - } - /* we know the method; read in the request */ - log_debug(LD_APP,"socks5: checking request"); - if (datalen < 7) {/* basic info plus >=1 for addr plus 2 for port */ - *want_length_out = 7; - return 0; /* not yet */ - } - req->command = (unsigned char) *(data+1); - if (req->command != SOCKS_COMMAND_CONNECT && - req->command != SOCKS_COMMAND_RESOLVE && - req->command != SOCKS_COMMAND_RESOLVE_PTR) { - /* not a connect or resolve or a resolve_ptr? we don't support it. */ - log_warn(LD_APP,"socks5: command %d not recognized. Rejecting.", - req->command); - return -1; - } - switch (*(data+3)) { /* address type */ - case 1: /* IPv4 address */ - case 4: /* IPv6 address */ { - const int is_v6 = *(data+3) == 4; - const unsigned addrlen = is_v6 ? 16 : 4; - log_debug(LD_APP,"socks5: ipv4 address type"); - if (datalen < 6+addrlen) {/* ip/port there? */ - *want_length_out = 6+addrlen; - return 0; /* not yet */ - } - - if (is_v6) - tor_addr_from_ipv6_bytes(&destaddr, data+4); - else - tor_addr_from_ipv4n(&destaddr, get_uint32(data+4)); - - tor_addr_to_str(tmpbuf, &destaddr, sizeof(tmpbuf), 1); - - if (strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN) { - log_warn(LD_APP, - "socks5 IP takes %d bytes, which doesn't fit in %d. " - "Rejecting.", - (int)strlen(tmpbuf)+1,(int)MAX_SOCKS_ADDR_LEN); - return -1; - } - strlcpy(req->address,tmpbuf,sizeof(req->address)); - req->port = ntohs(get_uint16(data+4+addrlen)); - *drain_out = 6+addrlen; - if (req->command != SOCKS_COMMAND_RESOLVE_PTR && - !addressmap_have_mapping(req->address,0)) { - log_unsafe_socks_warning(5, req->address, req->port, safe_socks); - if (safe_socks) - return -1; - } - return 1; - } - case 3: /* fqdn */ - log_debug(LD_APP,"socks5: fqdn address type"); - if (req->command == SOCKS_COMMAND_RESOLVE_PTR) { - log_warn(LD_APP, "socks5 received RESOLVE_PTR command with " - "hostname type. Rejecting."); - return -1; - } - len = (unsigned char)*(data+4); - if (datalen < 7+len) { /* addr/port there? */ - *want_length_out = 7+len; - return 0; /* not yet */ - } - if (len+1 > MAX_SOCKS_ADDR_LEN) { - log_warn(LD_APP, - "socks5 hostname is %d bytes, which doesn't fit in " - "%d. Rejecting.", len+1,MAX_SOCKS_ADDR_LEN); - return -1; - } - memcpy(req->address,data+5,len); - req->address[len] = 0; - req->port = ntohs(get_uint16(data+5+len)); - *drain_out = 5+len+2; - if (!tor_strisprint(req->address) || strchr(req->address,'\"')) { - log_warn(LD_PROTOCOL, - "Your application (using socks5 to port %d) gave Tor " - "a malformed hostname: %s. Rejecting the connection.", - req->port, escaped(req->address)); - return -1; - } - if (log_sockstype) - log_notice(LD_APP, - "Your application (using socks5 to port %d) instructed " - "Tor to take care of the DNS resolution itself if " - "necessary. This is good.", req->port); - return 1; - default: /* unsupported */ - log_warn(LD_APP,"socks5: unsupported address type %d. Rejecting.", - (int) *(data+3)); - return -1; - } - tor_assert(0); - case 4: { /* socks4 */ - enum {socks4, socks4a} socks4_prot = socks4a; - const char *authstart, *authend; - /* http://ss5.sourceforge.net/socks4.protocol.txt */ - /* http://ss5.sourceforge.net/socks4A.protocol.txt */ - - req->socks_version = 4; - if (datalen < SOCKS4_NETWORK_LEN) {/* basic info available? */ - *want_length_out = SOCKS4_NETWORK_LEN; - return 0; /* not yet */ - } - // buf_pullup(buf, 1280, 0); - req->command = (unsigned char) *(data+1); - if (req->command != SOCKS_COMMAND_CONNECT && - req->command != SOCKS_COMMAND_RESOLVE) { - /* not a connect or resolve? we don't support it. (No resolve_ptr with - * socks4.) */ - log_warn(LD_APP,"socks4: command %d not recognized. Rejecting.", - req->command); - return -1; - } - - req->port = ntohs(get_uint16(data+2)); - destip = ntohl(get_uint32(data+4)); - if ((!req->port && req->command!=SOCKS_COMMAND_RESOLVE) || !destip) { - log_warn(LD_APP,"socks4: Port or DestIP is zero. Rejecting."); - return -1; - } - if (destip >> 8) { - log_debug(LD_APP,"socks4: destip not in form 0.0.0.x."); - in.s_addr = htonl(destip); - tor_inet_ntoa(&in,tmpbuf,sizeof(tmpbuf)); - if (strlen(tmpbuf)+1 > MAX_SOCKS_ADDR_LEN) { - log_debug(LD_APP,"socks4 addr (%d bytes) too long. Rejecting.", - (int)strlen(tmpbuf)); - return -1; - } - log_debug(LD_APP, - "socks4: successfully read destip (%s)", - safe_str_client(tmpbuf)); - socks4_prot = socks4; - } - - authstart = data + SOCKS4_NETWORK_LEN; - next = memchr(authstart, 0, - datalen-SOCKS4_NETWORK_LEN); - if (!next) { - if (datalen >= 1024) { - log_debug(LD_APP, "Socks4 user name too long; rejecting."); - return -1; - } - log_debug(LD_APP,"socks4: Username not here yet."); - *want_length_out = datalen+1024; /* More than we need, but safe */ - return 0; - } - authend = next; - tor_assert(next < data+datalen); - - startaddr = NULL; - if (socks4_prot != socks4a && - !addressmap_have_mapping(tmpbuf,0)) { - log_unsafe_socks_warning(4, tmpbuf, req->port, safe_socks); - - if (safe_socks) - return -1; - } - if (socks4_prot == socks4a) { - if (next+1 == data+datalen) { - log_debug(LD_APP,"socks4: No part of destaddr here yet."); - *want_length_out = datalen + 1024; /* More than we need, but safe */ - return 0; - } - startaddr = next+1; - next = memchr(startaddr, 0, data + datalen - startaddr); - if (!next) { - if (datalen >= 1024) { - log_debug(LD_APP,"socks4: Destaddr too long."); - return -1; - } - log_debug(LD_APP,"socks4: Destaddr not all here yet."); - *want_length_out = datalen + 1024; /* More than we need, but safe */ - return 0; - } - if (MAX_SOCKS_ADDR_LEN <= next-startaddr) { - log_warn(LD_APP,"socks4: Destaddr too long. Rejecting."); - return -1; - } - // tor_assert(next < buf->cur+buf->datalen); - - if (log_sockstype) - log_notice(LD_APP, - "Your application (using socks4a to port %d) instructed " - "Tor to take care of the DNS resolution itself if " - "necessary. This is good.", req->port); - } - log_debug(LD_APP,"socks4: Everything is here. Success."); - strlcpy(req->address, startaddr ? startaddr : tmpbuf, - sizeof(req->address)); - if (!tor_strisprint(req->address) || strchr(req->address,'\"')) { - log_warn(LD_PROTOCOL, - "Your application (using socks4 to port %d) gave Tor " - "a malformed hostname: %s. Rejecting the connection.", - req->port, escaped(req->address)); - return -1; - } - if (authend != authstart) { - req->got_auth = 1; - req->usernamelen = authend - authstart; - req->username = tor_memdup(authstart, authend - authstart); - } - /* next points to the final \0 on inbuf */ - *drain_out = next - data + 1; - return 1; - } - case 'G': /* get */ - case 'H': /* head */ - case 'P': /* put/post */ - case 'C': /* connect */ - strlcpy((char*)req->reply, -"HTTP/1.0 501 Tor is not an HTTP Proxy\r\n" -"Content-Type: text/html; charset=iso-8859-1\r\n\r\n" -"\n" -"\n" -"Tor is not an HTTP Proxy\n" -"\n" -"\n" -"

    Tor is not an HTTP Proxy

    \n" -"

    \n" -"It appears you have configured your web browser to use Tor as an HTTP proxy." -"\n" -"This is not correct: Tor is a SOCKS proxy, not an HTTP proxy.\n" -"Please configure your client accordingly.\n" -"

    \n" -"

    \n" -"See " - "https://www.torproject.org/documentation.html for more " - "information.\n" -"\n" -"

    \n" -"\n" -"\n" - , MAX_SOCKS_REPLY_LEN); - req->replylen = strlen((char*)req->reply)+1; - /* fall through */ - default: /* version is not socks4 or socks5 */ - log_warn(LD_APP, - "Socks version %d not recognized. (Tor is not an http proxy.)", - *(data)); - { - /* Tell the controller the first 8 bytes. */ - char *tmp = tor_strndup(data, datalen < 8 ? datalen : 8); - control_event_client_status(LOG_WARN, - "SOCKS_UNKNOWN_PROTOCOL DATA=\"%s\"", - escaped(tmp)); - tor_free(tmp); - } - return -1; - } -} - -/** Inspect a reply from SOCKS server stored in buf according - * to state, removing the protocol data upon success. Return 0 on - * incomplete response, 1 on success and -1 on error, in which case - * reason is set to a descriptive message (free() when finished - * with it). - * - * As a special case, 2 is returned when user/pass is required - * during SOCKS5 handshake and user/pass is configured. - */ -int -fetch_from_buf_socks_client(buf_t *buf, int state, char **reason) -{ - ssize_t drain = 0; - int r; - if (buf->datalen < 2) - return 0; - - buf_pullup(buf, MAX_SOCKS_MESSAGE_LEN, 0); - tor_assert(buf->head && buf->head->datalen >= 2); - - r = parse_socks_client((uint8_t*)buf->head->data, buf->head->datalen, - state, reason, &drain); - if (drain > 0) - buf_remove_from_front(buf, drain); - else if (drain < 0) - buf_clear(buf); - - return r; -} - -#ifdef USE_BUFFEREVENTS -/** As fetch_from_buf_socks_client, buf works on an evbuffer */ -int -fetch_from_evbuffer_socks_client(struct evbuffer *buf, int state, - char **reason) -{ - ssize_t drain = 0; - uint8_t *data; - size_t datalen; - int r; - - /* Linearize the SOCKS response in the buffer, up to 128 bytes. - * (parse_socks_client shouldn't need to see anything beyond that.) */ - datalen = evbuffer_get_length(buf); - if (datalen > MAX_SOCKS_MESSAGE_LEN) - datalen = MAX_SOCKS_MESSAGE_LEN; - data = evbuffer_pullup(buf, datalen); - - r = parse_socks_client(data, datalen, state, reason, &drain); - if (drain > 0) - evbuffer_drain(buf, drain); - else if (drain < 0) - evbuffer_drain(buf, evbuffer_get_length(buf)); - - return r; -} -#endif - -/** Implementation logic for fetch_from_*_socks_client. */ -static int -parse_socks_client(const uint8_t *data, size_t datalen, - int state, char **reason, - ssize_t *drain_out) -{ - unsigned int addrlen; - *drain_out = 0; - if (datalen < 2) - return 0; - - switch (state) { - case PROXY_SOCKS4_WANT_CONNECT_OK: - /* Wait for the complete response */ - if (datalen < 8) - return 0; - - if (data[1] != 0x5a) { - *reason = tor_strdup(socks4_response_code_to_string(data[1])); - return -1; - } - - /* Success */ - *drain_out = 8; - return 1; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: - /* we don't have any credentials */ - if (data[1] != 0x00) { - *reason = tor_strdup("server doesn't support any of our " - "available authentication methods"); - return -1; - } - - log_info(LD_NET, "SOCKS 5 client: continuing without authentication"); - *drain_out = -1; - return 1; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: - /* we have a username and password. return 1 if we can proceed without - * providing authentication, or 2 otherwise. */ - switch (data[1]) { - case 0x00: - log_info(LD_NET, "SOCKS 5 client: we have auth details but server " - "doesn't require authentication."); - *drain_out = -1; - return 1; - case 0x02: - log_info(LD_NET, "SOCKS 5 client: need authentication."); - *drain_out = -1; - return 2; - /* fall through */ - } - - *reason = tor_strdup("server doesn't support any of our available " - "authentication methods"); - return -1; - - case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: - /* handle server reply to rfc1929 authentication */ - if (data[1] != 0x00) { - *reason = tor_strdup("authentication failed"); - return -1; - } - - log_info(LD_NET, "SOCKS 5 client: authentication successful."); - *drain_out = -1; - return 1; - - case PROXY_SOCKS5_WANT_CONNECT_OK: - /* response is variable length. BND.ADDR, etc, isn't needed - * (don't bother with buf_pullup()), but make sure to eat all - * the data used */ - - /* wait for address type field to arrive */ - if (datalen < 4) - return 0; - - switch (data[3]) { - case 0x01: /* ip4 */ - addrlen = 4; - break; - case 0x04: /* ip6 */ - addrlen = 16; - break; - case 0x03: /* fqdn (can this happen here?) */ - if (datalen < 5) - return 0; - addrlen = 1 + data[4]; - break; - default: - *reason = tor_strdup("invalid response to connect request"); - return -1; - } - - /* wait for address and port */ - if (datalen < 6 + addrlen) - return 0; - - if (data[1] != 0x00) { - *reason = tor_strdup(socks5_response_code_to_string(data[1])); - return -1; - } - - *drain_out = 6 + addrlen; - return 1; - } - - /* shouldn't get here... */ - tor_assert(0); - - return -1; -} - -/** Return 1 iff buf looks more like it has an (obsolete) v0 controller - * command on it than any valid v1 controller command. */ -int -peek_buf_has_control0_command(buf_t *buf) -{ - if (buf->datalen >= 4) { - char header[4]; - uint16_t cmd; - peek_from_buf(header, sizeof(header), buf); - cmd = ntohs(get_uint16(header+2)); - if (cmd <= 0x14) - return 1; /* This is definitely not a v1 control command. */ - } - return 0; -} - -#ifdef USE_BUFFEREVENTS -int -peek_evbuffer_has_control0_command(struct evbuffer *buf) -{ - int result = 0; - if (evbuffer_get_length(buf) >= 4) { - int free_out = 0; - char *data = NULL; - size_t n = inspect_evbuffer(buf, &data, 4, &free_out, NULL); - uint16_t cmd; - tor_assert(n >= 4); - cmd = ntohs(get_uint16(data+2)); - if (cmd <= 0x14) - result = 1; - if (free_out) - tor_free(data); - } - return result; -} -#endif - -/** Return the index within buf at which ch first appears, - * or -1 if ch does not appear on buf. */ -static off_t -buf_find_offset_of_char(buf_t *buf, char ch) -{ - chunk_t *chunk; - off_t offset = 0; - for (chunk = buf->head; chunk; chunk = chunk->next) { - char *cp = memchr(chunk->data, ch, chunk->datalen); - if (cp) - return offset + (cp - chunk->data); - else - offset += chunk->datalen; - } - return -1; -} - -/** Try to read a single LF-terminated line from buf, and write it - * (including the LF), NUL-terminated, into the *data_len byte buffer - * at data_out. Set *data_len to the number of bytes in the - * line, not counting the terminating NUL. Return 1 if we read a whole line, - * return 0 if we don't have a whole line yet, and return -1 if the line - * length exceeds *data_len. - */ -int -fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len) -{ - size_t sz; - off_t offset; - - if (!buf->head) - return 0; - - offset = buf_find_offset_of_char(buf, '\n'); - if (offset < 0) - return 0; - sz = (size_t) offset; - if (sz+2 > *data_len) { - *data_len = sz + 2; - return -1; - } - fetch_from_buf(data_out, sz+1, buf); - data_out[sz+1] = '\0'; - *data_len = sz+1; - return 1; -} - -/** Compress on uncompress the data_len bytes in data using the - * zlib state state, appending the result to buf. If - * done is true, flush the data in the state and finish the - * compression/uncompression. Return -1 on failure, 0 on success. */ -int -write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, - int done) -{ - char *next; - size_t old_avail, avail; - int over = 0; - do { - int need_new_chunk = 0; - if (!buf->tail || ! CHUNK_REMAINING_CAPACITY(buf->tail)) { - size_t cap = data_len / 4; - buf_add_chunk_with_capacity(buf, cap, 1); - } - next = CHUNK_WRITE_PTR(buf->tail); - avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail); - switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { - case TOR_ZLIB_DONE: - over = 1; - break; - case TOR_ZLIB_ERR: - return -1; - case TOR_ZLIB_OK: - if (data_len == 0) - over = 1; - break; - case TOR_ZLIB_BUF_FULL: - if (avail) { - /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk - * automatically, whether were going to or not. */ - need_new_chunk = 1; - } - break; - } - buf->datalen += old_avail - avail; - buf->tail->datalen += old_avail - avail; - if (need_new_chunk) { - buf_add_chunk_with_capacity(buf, data_len/4, 1); - } - - } while (!over); - check(); - return 0; -} - -#ifdef USE_BUFFEREVENTS -int -write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, - int done) -{ - char *next; - size_t old_avail, avail; - int over = 0, n; - struct evbuffer_iovec vec[1]; - do { - { - size_t cap = data_len / 4; - if (cap < 128) - cap = 128; - /* XXXX NM this strategy is fragmentation-prone. We should really have - * two iovecs, and write first into the one, and then into the - * second if the first gets full. */ - n = evbuffer_reserve_space(buf, cap, vec, 1); - tor_assert(n == 1); - } - - next = vec[0].iov_base; - avail = old_avail = vec[0].iov_len; - - switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { - case TOR_ZLIB_DONE: - over = 1; - break; - case TOR_ZLIB_ERR: - return -1; - case TOR_ZLIB_OK: - if (data_len == 0) - over = 1; - break; - case TOR_ZLIB_BUF_FULL: - if (avail) { - /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk - * automatically, whether were going to or not. */ - } - break; - } - - /* XXXX possible infinite loop on BUF_FULL. */ - vec[0].iov_len = old_avail - avail; - evbuffer_commit_space(buf, vec, 1); - - } while (!over); - check(); - return 0; -} -#endif - -/** Set *output to contain a copy of the data in *input */ -int -generic_buffer_set_to_copy(generic_buffer_t **output, - const generic_buffer_t *input) -{ -#ifdef USE_BUFFEREVENTS - struct evbuffer_ptr ptr; - size_t remaining = evbuffer_get_length(input); - if (*output) { - evbuffer_drain(*output, evbuffer_get_length(*output)); - } else { - if (!(*output = evbuffer_new())) - return -1; - } - evbuffer_ptr_set((struct evbuffer*)input, &ptr, 0, EVBUFFER_PTR_SET); - while (remaining) { - struct evbuffer_iovec v[4]; - int n_used, i; - n_used = evbuffer_peek((struct evbuffer*)input, -1, &ptr, v, 4); - if (n_used < 0) - return -1; - for (i=0;ibuf is corrupted. - */ -void -assert_buf_ok(buf_t *buf) -{ - tor_assert(buf); - tor_assert(buf->magic == BUFFER_MAGIC); - - if (! buf->head) { - tor_assert(!buf->tail); - tor_assert(buf->datalen == 0); - } else { - chunk_t *ch; - size_t total = 0; - tor_assert(buf->tail); - for (ch = buf->head; ch; ch = ch->next) { - total += ch->datalen; - tor_assert(ch->datalen <= ch->memlen); - tor_assert(ch->data >= &ch->mem[0]); - tor_assert(ch->data < &ch->mem[0]+ch->memlen); - tor_assert(ch->data+ch->datalen <= &ch->mem[0] + ch->memlen); - if (!ch->next) - tor_assert(ch == buf->tail); - } - tor_assert(buf->datalen == total); - } -} - -#ifdef ENABLE_BUF_FREELISTS -/** Log an error and exit if fl is corrupted. - */ -static void -assert_freelist_ok(chunk_freelist_t *fl) -{ - chunk_t *ch; - int n; - tor_assert(fl->alloc_size > 0); - n = 0; - for (ch = fl->head; ch; ch = ch->next) { - tor_assert(CHUNK_ALLOC_SIZE(ch->memlen) == fl->alloc_size); - ++n; - } - tor_assert(n == fl->cur_length); - tor_assert(n >= fl->lowest_length); - tor_assert(n <= fl->max_length); -} -#endif - diff --git a/src/tor/buffers.h b/src/tor/buffers.h deleted file mode 100644 index 48b118520..000000000 --- a/src/tor/buffers.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file buffers.h - * \brief Header file for buffers.c. - **/ - -#ifndef TOR_BUFFERS_H -#define TOR_BUFFERS_H - -#include "testsupport.h" - -buf_t *buf_new(void); -buf_t *buf_new_with_capacity(size_t size); -void buf_free(buf_t *buf); -void buf_clear(buf_t *buf); -buf_t *buf_copy(const buf_t *buf); -void buf_shrink(buf_t *buf); -void buf_shrink_freelists(int free_all); -void buf_dump_freelist_sizes(int severity); - -size_t buf_datalen(const buf_t *buf); -size_t buf_allocation(const buf_t *buf); -size_t buf_slack(const buf_t *buf); - -int read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof, - int *socket_error); -int read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf); - -int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen); -int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen); - -int write_to_buf(const char *string, size_t string_len, buf_t *buf); -int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, int done); -int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); -int fetch_from_buf(char *string, size_t string_len, buf_t *buf); -int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto); -int fetch_from_buf_http(buf_t *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete); -socks_request_t *socks_request_new(void); -void socks_request_free(socks_request_t *req); -int fetch_from_buf_socks(buf_t *buf, socks_request_t *req, - int log_sockstype, int safe_socks); -int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason); -int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len); - -int peek_buf_has_control0_command(buf_t *buf); - -int fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out); - -#ifdef USE_BUFFEREVENTS -int fetch_var_cell_from_evbuffer(struct evbuffer *buf, var_cell_t **out, - int linkproto); -int fetch_from_evbuffer_socks(struct evbuffer *buf, socks_request_t *req, - int log_sockstype, int safe_socks); -int fetch_from_evbuffer_socks_client(struct evbuffer *buf, int state, - char **reason); -int fetch_from_evbuffer_http(struct evbuffer *buf, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, size_t max_bodylen, - int force_complete); -int peek_evbuffer_has_control0_command(struct evbuffer *buf); -int write_to_evbuffer_zlib(struct evbuffer *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, - int done); -int fetch_ext_or_command_from_evbuffer(struct evbuffer *buf, - ext_or_cmd_t **out); -#endif - -#ifdef USE_BUFFEREVENTS -#define generic_buffer_new() evbuffer_new() -#define generic_buffer_len(b) evbuffer_get_length((b)) -#define generic_buffer_add(b,dat,len) evbuffer_add((b),(dat),(len)) -#define generic_buffer_get(b,buf,buflen) evbuffer_remove((b),(buf),(buflen)) -#define generic_buffer_clear(b) evbuffer_drain((b), evbuffer_get_length((b))) -#define generic_buffer_free(b) evbuffer_free((b)) -#define generic_buffer_fetch_ext_or_cmd(b, out) \ - fetch_ext_or_command_from_evbuffer((b), (out)) -#else -#define generic_buffer_new() buf_new() -#define generic_buffer_len(b) buf_datalen((b)) -#define generic_buffer_add(b,dat,len) write_to_buf((dat),(len),(b)) -#define generic_buffer_get(b,buf,buflen) fetch_from_buf((buf),(buflen),(b)) -#define generic_buffer_clear(b) buf_clear((b)) -#define generic_buffer_free(b) buf_free((b)) -#define generic_buffer_fetch_ext_or_cmd(b, out) \ - fetch_ext_or_command_from_buf((b), (out)) -#endif -int generic_buffer_set_to_copy(generic_buffer_t **output, - const generic_buffer_t *input); - -void assert_buf_ok(buf_t *buf); - -#ifdef BUFFERS_PRIVATE -STATIC int buf_find_string_offset(const buf_t *buf, const char *s, size_t n); -#endif - -#endif - diff --git a/src/tor/channel.c b/src/tor/channel.c deleted file mode 100644 index 62796d936..000000000 --- a/src/tor/channel.c +++ /dev/null @@ -1,4191 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file channel.c - * \brief OR-to-OR channel abstraction layer - **/ - -/* - * Define this so channel.h gives us things only channel_t subclasses - * should touch. - */ - -#define TOR_CHANNEL_INTERNAL_ - -#include "or.h" -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "connection_or.h" /* For var_cell_free() */ -#include "circuitmux.h" -#include "entrynodes.h" -#include "geoip.h" -#include "nodelist.h" -#include "relay.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" - -/* Cell queue structure */ - -typedef struct cell_queue_entry_s cell_queue_entry_t; -struct cell_queue_entry_s { - TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next; - enum { - CELL_QUEUE_FIXED, - CELL_QUEUE_VAR, - CELL_QUEUE_PACKED - } type; - union { - struct { - cell_t *cell; - } fixed; - struct { - var_cell_t *var_cell; - } var; - struct { - packed_cell_t *packed_cell; - } packed; - } u; -}; - -/* Global lists of channels */ - -/* All channel_t instances */ -static smartlist_t *all_channels = NULL; - -/* All channel_t instances not in ERROR or CLOSED states */ -static smartlist_t *active_channels = NULL; - -/* All channel_t instances in ERROR or CLOSED states */ -static smartlist_t *finished_channels = NULL; - -/* All channel_listener_t instances */ -static smartlist_t *all_listeners = NULL; - -/* All channel_listener_t instances in LISTENING state */ -static smartlist_t *active_listeners = NULL; - -/* All channel_listener_t instances in LISTENING state */ -static smartlist_t *finished_listeners = NULL; - -/* Counter for ID numbers */ -static uint64_t n_channels_allocated = 0; - -/* Digest->channel map - * - * Similar to the one used in connection_or.c, this maps from the identity - * digest of a remote endpoint to a channel_t to that endpoint. Channels - * should be placed here when registered and removed when they close or error. - * If more than one channel exists, follow the next_with_same_id pointer - * as a linked list. - */ -HT_HEAD(channel_idmap, channel_idmap_entry_s) channel_identity_map = - HT_INITIALIZER(); - -typedef struct channel_idmap_entry_s { - HT_ENTRY(channel_idmap_entry_s) node; - uint8_t digest[DIGEST_LEN]; - TOR_LIST_HEAD(channel_list_s, channel_s) channel_list; -} channel_idmap_entry_t; - -static INLINE unsigned -channel_idmap_hash(const channel_idmap_entry_t *ent) -{ - const unsigned *a = (const unsigned *)ent->digest; -#if SIZEOF_INT == 4 - return a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4]; -#elif SIZEOF_INT == 8 - return a[0] ^ a[1]; -#endif -} - -static INLINE int -channel_idmap_eq(const channel_idmap_entry_t *a, - const channel_idmap_entry_t *b) -{ - return tor_memeq(a->digest, b->digest, DIGEST_LEN); -} - -HT_PROTOTYPE(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, - channel_idmap_eq); -HT_GENERATE(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, - channel_idmap_eq, 0.5, tor_malloc, tor_realloc, tor_free_); - -static cell_queue_entry_t * cell_queue_entry_dup(cell_queue_entry_t *q); -static void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off); -static int cell_queue_entry_is_padding(cell_queue_entry_t *q); -static cell_queue_entry_t * -cell_queue_entry_new_fixed(cell_t *cell); -static cell_queue_entry_t * -cell_queue_entry_new_var(var_cell_t *var_cell); -static int is_destroy_cell(channel_t *chan, - const cell_queue_entry_t *q, circid_t *circid_out); - -/* Functions to maintain the digest map */ -static void channel_add_to_digest_map(channel_t *chan); -static void channel_remove_from_digest_map(channel_t *chan); - -/* - * Flush cells from just the outgoing queue without trying to get them - * from circuits; used internall by channel_flush_some_cells(). - */ -static ssize_t -channel_flush_some_cells_from_outgoing_queue(channel_t *chan, - ssize_t num_cells); -static void channel_force_free(channel_t *chan); -static void -channel_free_list(smartlist_t *channels, int mark_for_close); -static void -channel_listener_free_list(smartlist_t *channels, int mark_for_close); -static void channel_listener_force_free(channel_listener_t *chan_l); -static void -channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q); - -/*********************************** - * Channel state utility functions * - **********************************/ - -/** - * Indicate whether a given channel state is valid - */ - -int -channel_state_is_valid(channel_state_t state) -{ - int is_valid; - - switch (state) { - case CHANNEL_STATE_CLOSED: - case CHANNEL_STATE_CLOSING: - case CHANNEL_STATE_ERROR: - case CHANNEL_STATE_MAINT: - case CHANNEL_STATE_OPENING: - case CHANNEL_STATE_OPEN: - is_valid = 1; - break; - case CHANNEL_STATE_LAST: - default: - is_valid = 0; - } - - return is_valid; -} - -/** - * Indicate whether a given channel listener state is valid - */ - -int -channel_listener_state_is_valid(channel_listener_state_t state) -{ - int is_valid; - - switch (state) { - case CHANNEL_LISTENER_STATE_CLOSED: - case CHANNEL_LISTENER_STATE_LISTENING: - case CHANNEL_LISTENER_STATE_CLOSING: - case CHANNEL_LISTENER_STATE_ERROR: - is_valid = 1; - break; - case CHANNEL_LISTENER_STATE_LAST: - default: - is_valid = 0; - } - - return is_valid; -} - -/** - * Indicate whether a channel state transition is valid - * - * This function takes two channel states and indicates whether a - * transition between them is permitted (see the state definitions and - * transition table in or.h at the channel_state_t typedef). - */ - -int -channel_state_can_transition(channel_state_t from, channel_state_t to) -{ - int is_valid; - - switch (from) { - case CHANNEL_STATE_CLOSED: - is_valid = (to == CHANNEL_STATE_OPENING); - break; - case CHANNEL_STATE_CLOSING: - is_valid = (to == CHANNEL_STATE_CLOSED || - to == CHANNEL_STATE_ERROR); - break; - case CHANNEL_STATE_ERROR: - is_valid = 0; - break; - case CHANNEL_STATE_MAINT: - is_valid = (to == CHANNEL_STATE_CLOSING || - to == CHANNEL_STATE_ERROR || - to == CHANNEL_STATE_OPEN); - break; - case CHANNEL_STATE_OPENING: - is_valid = (to == CHANNEL_STATE_CLOSING || - to == CHANNEL_STATE_ERROR || - to == CHANNEL_STATE_OPEN); - break; - case CHANNEL_STATE_OPEN: - is_valid = (to == CHANNEL_STATE_CLOSING || - to == CHANNEL_STATE_ERROR || - to == CHANNEL_STATE_MAINT); - break; - case CHANNEL_STATE_LAST: - default: - is_valid = 0; - } - - return is_valid; -} - -/** - * Indicate whether a channel listener state transition is valid - * - * This function takes two channel listener states and indicates whether a - * transition between them is permitted (see the state definitions and - * transition table in or.h at the channel_listener_state_t typedef). - */ - -int -channel_listener_state_can_transition(channel_listener_state_t from, - channel_listener_state_t to) -{ - int is_valid; - - switch (from) { - case CHANNEL_LISTENER_STATE_CLOSED: - is_valid = (to == CHANNEL_LISTENER_STATE_LISTENING); - break; - case CHANNEL_LISTENER_STATE_CLOSING: - is_valid = (to == CHANNEL_LISTENER_STATE_CLOSED || - to == CHANNEL_LISTENER_STATE_ERROR); - break; - case CHANNEL_LISTENER_STATE_ERROR: - is_valid = 0; - break; - case CHANNEL_LISTENER_STATE_LISTENING: - is_valid = (to == CHANNEL_LISTENER_STATE_CLOSING || - to == CHANNEL_LISTENER_STATE_ERROR); - break; - case CHANNEL_LISTENER_STATE_LAST: - default: - is_valid = 0; - } - - return is_valid; -} - -/** - * Return a human-readable description for a channel state - */ - -const char * -channel_state_to_string(channel_state_t state) -{ - const char *descr; - - switch (state) { - case CHANNEL_STATE_CLOSED: - descr = "closed"; - break; - case CHANNEL_STATE_CLOSING: - descr = "closing"; - break; - case CHANNEL_STATE_ERROR: - descr = "channel error"; - break; - case CHANNEL_STATE_MAINT: - descr = "temporarily suspended for maintenance"; - break; - case CHANNEL_STATE_OPENING: - descr = "opening"; - break; - case CHANNEL_STATE_OPEN: - descr = "open"; - break; - case CHANNEL_STATE_LAST: - default: - descr = "unknown or invalid channel state"; - } - - return descr; -} - -/** - * Return a human-readable description for a channel listenier state - */ - -const char * -channel_listener_state_to_string(channel_listener_state_t state) -{ - const char *descr; - - switch (state) { - case CHANNEL_LISTENER_STATE_CLOSED: - descr = "closed"; - break; - case CHANNEL_LISTENER_STATE_CLOSING: - descr = "closing"; - break; - case CHANNEL_LISTENER_STATE_ERROR: - descr = "channel listener error"; - break; - case CHANNEL_LISTENER_STATE_LISTENING: - descr = "listening"; - break; - case CHANNEL_LISTENER_STATE_LAST: - default: - descr = "unknown or invalid channel listener state"; - } - - return descr; -} - -/*************************************** - * Channel registration/unregistration * - ***************************************/ - -/** - * Register a channel - * - * This function registers a newly created channel in the global lists/maps - * of active channels. - */ - -void -channel_register(channel_t *chan) -{ - tor_assert(chan); - - /* No-op if already registered */ - if (chan->registered) return; - - log_debug(LD_CHANNEL, - "Registering channel %p (ID " U64_FORMAT ") " - "in state %s (%d) with digest %s", - chan, U64_PRINTF_ARG(chan->global_identifier), - channel_state_to_string(chan->state), chan->state, - hex_str(chan->identity_digest, DIGEST_LEN)); - - /* Make sure we have all_channels, then add it */ - if (!all_channels) all_channels = smartlist_new(); - smartlist_add(all_channels, chan); - - /* Is it finished? */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) { - /* Put it in the finished list, creating it if necessary */ - if (!finished_channels) finished_channels = smartlist_new(); - smartlist_add(finished_channels, chan); - } else { - /* Put it in the active list, creating it if necessary */ - if (!active_channels) active_channels = smartlist_new(); - smartlist_add(active_channels, chan); - - if (chan->state != CHANNEL_STATE_CLOSING) { - /* It should have a digest set */ - if (!tor_digest_is_zero(chan->identity_digest)) { - /* Yeah, we're good, add it to the map */ - channel_add_to_digest_map(chan); - } else { - log_info(LD_CHANNEL, - "Channel %p (global ID " U64_FORMAT ") " - "in state %s (%d) registered with no identity digest", - chan, U64_PRINTF_ARG(chan->global_identifier), - channel_state_to_string(chan->state), chan->state); - } - } - } - - /* Mark it as registered */ - chan->registered = 1; -} - -/** - * Unregister a channel - * - * This function removes a channel from the global lists and maps and is used - * when freeing a closed/errored channel. - */ - -void -channel_unregister(channel_t *chan) -{ - tor_assert(chan); - - /* No-op if not registered */ - if (!(chan->registered)) return; - - /* Is it finished? */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) { - /* Get it out of the finished list */ - if (finished_channels) smartlist_remove(finished_channels, chan); - } else { - /* Get it out of the active list */ - if (active_channels) smartlist_remove(active_channels, chan); - } - - /* Get it out of all_channels */ - if (all_channels) smartlist_remove(all_channels, chan); - - /* Mark it as unregistered */ - chan->registered = 0; - - /* Should it be in the digest map? */ - if (!tor_digest_is_zero(chan->identity_digest) && - !(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { - /* Remove it */ - channel_remove_from_digest_map(chan); - } -} - -/** - * Register a channel listener - * - * This function registers a newly created channel listner in the global - * lists/maps of active channel listeners. - */ - -void -channel_listener_register(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - /* No-op if already registered */ - if (chan_l->registered) return; - - log_debug(LD_CHANNEL, - "Registering channel listener %p (ID " U64_FORMAT ") " - "in state %s (%d)", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier), - channel_listener_state_to_string(chan_l->state), - chan_l->state); - - /* Make sure we have all_channels, then add it */ - if (!all_listeners) all_listeners = smartlist_new(); - smartlist_add(all_listeners, chan_l); - - /* Is it finished? */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) { - /* Put it in the finished list, creating it if necessary */ - if (!finished_listeners) finished_listeners = smartlist_new(); - smartlist_add(finished_listeners, chan_l); - } else { - /* Put it in the active list, creating it if necessary */ - if (!active_listeners) active_listeners = smartlist_new(); - smartlist_add(active_listeners, chan_l); - } - - /* Mark it as registered */ - chan_l->registered = 1; -} - -/** - * Unregister a channel listener - * - * This function removes a channel listener from the global lists and maps - * and is used when freeing a closed/errored channel listener. - */ - -void -channel_listener_unregister(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - /* No-op if not registered */ - if (!(chan_l->registered)) return; - - /* Is it finished? */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) { - /* Get it out of the finished list */ - if (finished_listeners) smartlist_remove(finished_listeners, chan_l); - } else { - /* Get it out of the active list */ - if (active_listeners) smartlist_remove(active_listeners, chan_l); - } - - /* Get it out of all_channels */ - if (all_listeners) smartlist_remove(all_listeners, chan_l); - - /* Mark it as unregistered */ - chan_l->registered = 0; -} - -/********************************* - * Channel digest map maintenance - *********************************/ - -/** - * Add a channel to the digest map - * - * This function adds a channel to the digest map and inserts it into the - * correct linked list if channels with that remote endpoint identity digest - * already exist. - */ - -static void -channel_add_to_digest_map(channel_t *chan) -{ - channel_idmap_entry_t *ent, search; - - tor_assert(chan); - - /* Assert that the state makes sense */ - tor_assert(!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)); - - /* Assert that there is a digest */ - tor_assert(!tor_digest_is_zero(chan->identity_digest)); - - memcpy(search.digest, chan->identity_digest, DIGEST_LEN); - ent = HT_FIND(channel_idmap, &channel_identity_map, &search); - if (! ent) { - ent = tor_malloc(sizeof(channel_idmap_entry_t)); - memcpy(ent->digest, chan->identity_digest, DIGEST_LEN); - TOR_LIST_INIT(&ent->channel_list); - HT_INSERT(channel_idmap, &channel_identity_map, ent); - } - TOR_LIST_INSERT_HEAD(&ent->channel_list, chan, next_with_same_id); - - log_debug(LD_CHANNEL, - "Added channel %p (global ID " U64_FORMAT ") " - "to identity map in state %s (%d) with digest %s", - chan, U64_PRINTF_ARG(chan->global_identifier), - channel_state_to_string(chan->state), chan->state, - hex_str(chan->identity_digest, DIGEST_LEN)); -} - -/** - * Remove a channel from the digest map - * - * This function removes a channel from the digest map and the linked list of - * channels for that digest if more than one exists. - */ - -static void -channel_remove_from_digest_map(channel_t *chan) -{ - channel_idmap_entry_t *ent, search; - - tor_assert(chan); - - /* Assert that there is a digest */ - tor_assert(!tor_digest_is_zero(chan->identity_digest)); - -#if 0 - /* Make sure we have a map */ - if (!channel_identity_map) { - /* - * No identity map, so we can't find it by definition. This - * case is similar to digestmap_get() failing below. - */ - log_warn(LD_BUG, - "Trying to remove channel %p (global ID " U64_FORMAT ") " - "with digest %s from identity map, but didn't have any identity " - "map", - chan, U64_PRINTF_ARG(chan->global_identifier), - hex_str(chan->identity_digest, DIGEST_LEN)); - /* Clear out its next/prev pointers */ - if (chan->next_with_same_id) { - chan->next_with_same_id->prev_with_same_id = chan->prev_with_same_id; - } - if (chan->prev_with_same_id) { - chan->prev_with_same_id->next_with_same_id = chan->next_with_same_id; - } - chan->next_with_same_id = NULL; - chan->prev_with_same_id = NULL; - - return; - } -#endif - - /* Pull it out of its list, wherever that list is */ - TOR_LIST_REMOVE(chan, next_with_same_id); - - memcpy(search.digest, chan->identity_digest, DIGEST_LEN); - ent = HT_FIND(channel_idmap, &channel_identity_map, &search); - - /* Look for it in the map */ - if (ent) { - /* Okay, it's here */ - - if (TOR_LIST_EMPTY(&ent->channel_list)) { - HT_REMOVE(channel_idmap, &channel_identity_map, ent); - tor_free(ent); - } - - log_debug(LD_CHANNEL, - "Removed channel %p (global ID " U64_FORMAT ") from " - "identity map in state %s (%d) with digest %s", - chan, U64_PRINTF_ARG(chan->global_identifier), - channel_state_to_string(chan->state), chan->state, - hex_str(chan->identity_digest, DIGEST_LEN)); - } else { - /* Shouldn't happen */ - log_warn(LD_BUG, - "Trying to remove channel %p (global ID " U64_FORMAT ") with " - "digest %s from identity map, but couldn't find any with " - "that digest", - chan, U64_PRINTF_ARG(chan->global_identifier), - hex_str(chan->identity_digest, DIGEST_LEN)); - } -} - -/**************************** - * Channel lookup functions * - ***************************/ - -/** - * Find channel by global ID - * - * This function searches for a channel by the global_identifier assigned - * at initialization time. This identifier is unique for the lifetime of the - * Tor process. - */ - -channel_t * -channel_find_by_global_id(uint64_t global_identifier) -{ - channel_t *rv = NULL; - - if (all_channels && smartlist_len(all_channels) > 0) { - SMARTLIST_FOREACH_BEGIN(all_channels, channel_t *, curr) { - if (curr->global_identifier == global_identifier) { - rv = curr; - break; - } - } SMARTLIST_FOREACH_END(curr); - } - - return rv; -} - -/** - * Find channel by digest of the remote endpoint - * - * This function looks up a channel by the digest of its remote endpoint in - * the channel digest map. It's possible that more than one channel to a - * given endpoint exists. Use channel_next_with_digest() to walk the list. - */ - -channel_t * -channel_find_by_remote_digest(const char *identity_digest) -{ - channel_t *rv = NULL; - channel_idmap_entry_t *ent, search; - - tor_assert(identity_digest); - - memcpy(search.digest, identity_digest, DIGEST_LEN); - ent = HT_FIND(channel_idmap, &channel_identity_map, &search); - if (ent) { - rv = TOR_LIST_FIRST(&ent->channel_list); - } - - return rv; -} - -/** - * Get next channel with digest - * - * This function takes a channel and finds the next channel in the list - * with the same digest. - */ - -channel_t * -channel_next_with_digest(channel_t *chan) -{ - tor_assert(chan); - - return TOR_LIST_NEXT(chan, next_with_same_id); -} - -/** - * Initialize a channel - * - * This function should be called by subclasses to set up some per-channel - * variables. I.e., this is the superclass constructor. Before this, the - * channel should be allocated with tor_malloc_zero(). - */ - -void -channel_init(channel_t *chan) -{ - tor_assert(chan); - - /* Assign an ID and bump the counter */ - chan->global_identifier = n_channels_allocated++; - - /* Init timestamp */ - chan->timestamp_last_added_nonpadding = time(NULL); - - /* Init next_circ_id */ - chan->next_circ_id = crypto_rand_int(1 << 15); - - /* Initialize queues. */ - TOR_SIMPLEQ_INIT(&chan->incoming_queue); - TOR_SIMPLEQ_INIT(&chan->outgoing_queue); - - /* Initialize list entries. */ - memset(&chan->next_with_same_id, 0, sizeof(chan->next_with_same_id)); - - /* Timestamp it */ - channel_timestamp_created(chan); - - /* It hasn't been open yet. */ - chan->has_been_open = 0; -} - -/** - * Initialize a channel listener - * - * This function should be called by subclasses to set up some per-channel - * variables. I.e., this is the superclass constructor. Before this, the - * channel listener should be allocated with tor_malloc_zero(). - */ - -void -channel_init_listener(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - /* Assign an ID and bump the counter */ - chan_l->global_identifier = n_channels_allocated++; - - /* Timestamp it */ - channel_listener_timestamp_created(chan_l); -} - -/** - * Free a channel; nothing outside of channel.c and subclasses should call - * this - it frees channels after they have closed and been unregistered. - */ - -void -channel_free(channel_t *chan) -{ - if (!chan) return; - - /* It must be closed or errored */ - tor_assert(chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - /* It must be deregistered */ - tor_assert(!(chan->registered)); - - log_debug(LD_CHANNEL, - "Freeing channel " U64_FORMAT " at %p", - U64_PRINTF_ARG(chan->global_identifier), chan); - - /* - * Get rid of cmux policy before we do anything, so cmux policies don't - * see channels in weird half-freed states. - */ - if (chan->cmux) { - circuitmux_set_policy(chan->cmux, NULL); - } - - /* Call a free method if there is one */ - if (chan->free) chan->free(chan); - - channel_clear_remote_end(chan); - - /* Get rid of cmux */ - if (chan->cmux) { - circuitmux_detach_all_circuits(chan->cmux); - circuitmux_mark_destroyed_circids_usable(chan->cmux, chan); - circuitmux_free(chan->cmux); - chan->cmux = NULL; - } - - /* We're in CLOSED or ERROR, so the cell queue is already empty */ - - tor_free(chan); -} - -/** - * Free a channel listener; nothing outside of channel.c and subclasses - * should call this - it frees channel listeners after they have closed and - * been unregistered. - */ - -void -channel_listener_free(channel_listener_t *chan_l) -{ - if (!chan_l) return; - - log_debug(LD_CHANNEL, - "Freeing channel_listener_t " U64_FORMAT " at %p", - U64_PRINTF_ARG(chan_l->global_identifier), - chan_l); - - /* It must be closed or errored */ - tor_assert(chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR); - /* It must be deregistered */ - tor_assert(!(chan_l->registered)); - - /* Call a free method if there is one */ - if (chan_l->free) chan_l->free(chan_l); - - /* - * We're in CLOSED or ERROR, so the incoming channel queue is already - * empty. - */ - - tor_free(chan_l); -} - -/** - * Free a channel and skip the state/registration asserts; this internal- - * use-only function should be called only from channel_free_all() when - * shutting down the Tor process. - */ - -static void -channel_force_free(channel_t *chan) -{ - cell_queue_entry_t *cell, *cell_tmp; - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Force-freeing channel " U64_FORMAT " at %p", - U64_PRINTF_ARG(chan->global_identifier), chan); - - /* - * Get rid of cmux policy before we do anything, so cmux policies don't - * see channels in weird half-freed states. - */ - if (chan->cmux) { - circuitmux_set_policy(chan->cmux, NULL); - } - - /* Call a free method if there is one */ - if (chan->free) chan->free(chan); - - channel_clear_remote_end(chan); - - /* Get rid of cmux */ - if (chan->cmux) { - circuitmux_free(chan->cmux); - chan->cmux = NULL; - } - - /* We might still have a cell queue; kill it */ - TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->incoming_queue, next, cell_tmp) { - cell_queue_entry_free(cell, 0); - } - TOR_SIMPLEQ_INIT(&chan->incoming_queue); - - /* Outgoing cell queue is similar, but we can have to free packed cells */ - TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->outgoing_queue, next, cell_tmp) { - cell_queue_entry_free(cell, 0); - } - TOR_SIMPLEQ_INIT(&chan->outgoing_queue); - - tor_free(chan); -} - -/** - * Free a channel listener and skip the state/reigstration asserts; this - * internal-use-only function should be called only from channel_free_all() - * when shutting down the Tor process. - */ - -static void -channel_listener_force_free(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - log_debug(LD_CHANNEL, - "Force-freeing channel_listener_t " U64_FORMAT " at %p", - U64_PRINTF_ARG(chan_l->global_identifier), - chan_l); - - /* Call a free method if there is one */ - if (chan_l->free) chan_l->free(chan_l); - - /* - * The incoming list just gets emptied and freed; we request close on - * any channels we find there, but since we got called while shutting - * down they will get deregistered and freed elsewhere anyway. - */ - if (chan_l->incoming_list) { - SMARTLIST_FOREACH_BEGIN(chan_l->incoming_list, - channel_t *, qchan) { - channel_mark_for_close(qchan); - } SMARTLIST_FOREACH_END(qchan); - - smartlist_free(chan_l->incoming_list); - chan_l->incoming_list = NULL; - } - - tor_free(chan_l); -} - -/** - * Return the current registered listener for a channel listener - * - * This function returns a function pointer to the current registered - * handler for new incoming channels on a channel listener. - */ - -channel_listener_fn_ptr -channel_listener_get_listener_fn(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - if (chan_l->state == CHANNEL_LISTENER_STATE_LISTENING) - return chan_l->listener; - - return NULL; -} - -/** - * Set the listener for a channel listener - * - * This function sets the handler for new incoming channels on a channel - * listener. - */ - -void -channel_listener_set_listener_fn(channel_listener_t *chan_l, - channel_listener_fn_ptr listener) -{ - tor_assert(chan_l); - tor_assert(chan_l->state == CHANNEL_LISTENER_STATE_LISTENING); - - log_debug(LD_CHANNEL, - "Setting listener callback for channel listener %p " - "(global ID " U64_FORMAT ") to %p", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier), - listener); - - chan_l->listener = listener; - if (chan_l->listener) channel_listener_process_incoming(chan_l); -} - -/** - * Return the fixed-length cell handler for a channel - * - * This function gets the handler for incoming fixed-length cells installed - * on a channel. - */ - -channel_cell_handler_fn_ptr -channel_get_cell_handler(channel_t *chan) -{ - tor_assert(chan); - - if (chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT) - return chan->cell_handler; - - return NULL; -} - -/** - * Return the variable-length cell handler for a channel - * - * This function gets the handler for incoming variable-length cells - * installed on a channel. - */ - -channel_var_cell_handler_fn_ptr -channel_get_var_cell_handler(channel_t *chan) -{ - tor_assert(chan); - - if (chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT) - return chan->var_cell_handler; - - return NULL; -} - -/** - * Set both cell handlers for a channel - * - * This function sets both the fixed-length and variable length cell handlers - * for a channel and processes any incoming cells that had been blocked in the - * queue because none were available. - */ - -void -channel_set_cell_handlers(channel_t *chan, - channel_cell_handler_fn_ptr cell_handler, - channel_var_cell_handler_fn_ptr - var_cell_handler) -{ - int try_again = 0; - - tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT); - - log_debug(LD_CHANNEL, - "Setting cell_handler callback for channel %p to %p", - chan, cell_handler); - log_debug(LD_CHANNEL, - "Setting var_cell_handler callback for channel %p to %p", - chan, var_cell_handler); - - /* Should we try the queue? */ - if (cell_handler && - cell_handler != chan->cell_handler) try_again = 1; - if (var_cell_handler && - var_cell_handler != chan->var_cell_handler) try_again = 1; - - /* Change them */ - chan->cell_handler = cell_handler; - chan->var_cell_handler = var_cell_handler; - - /* Re-run the queue if we have one and there's any reason to */ - if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue) && - try_again && - (chan->cell_handler || - chan->var_cell_handler)) channel_process_cells(chan); -} - -/* - * On closing channels - * - * There are three functions that close channels, for use in - * different circumstances: - * - * - Use channel_mark_for_close() for most cases - * - Use channel_close_from_lower_layer() if you are connection_or.c - * and the other end closes the underlying connection. - * - Use channel_close_for_error() if you are connection_or.c and - * some sort of error has occurred. - */ - -/** - * Mark a channel for closure - * - * This function tries to close a channel_t; it will go into the CLOSING - * state, and eventually the lower layer should put it into the CLOSED or - * ERROR state. Then, channel_run_cleanup() will eventually free it. - */ - -void -channel_mark_for_close(channel_t *chan) -{ - tor_assert(chan != NULL); - tor_assert(chan->close != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel %p (global ID " U64_FORMAT ") " - "by request", - chan, U64_PRINTF_ARG(chan->global_identifier)); - - /* Note closing by request from above */ - chan->reason_for_closing = CHANNEL_CLOSE_REQUESTED; - - /* Change state to CLOSING */ - channel_change_state(chan, CHANNEL_STATE_CLOSING); - - /* Tell the lower layer */ - chan->close(chan); - - /* - * It's up to the lower layer to change state to CLOSED or ERROR when we're - * ready; we'll try to free channels that are in the finished list from - * channel_run_cleanup(). The lower layer should do this by calling - * channel_closed(). - */ -} - -/** - * Mark a channel listener for closure - * - * This function tries to close a channel_listener_t; it will go into the - * CLOSING state, and eventually the lower layer should put it into the CLOSED - * or ERROR state. Then, channel_run_cleanup() will eventually free it. - */ - -void -channel_listener_mark_for_close(channel_listener_t *chan_l) -{ - tor_assert(chan_l != NULL); - tor_assert(chan_l->close != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || - chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel listener %p (global ID " U64_FORMAT ") " - "by request", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); - - /* Note closing by request from above */ - chan_l->reason_for_closing = CHANNEL_LISTENER_CLOSE_REQUESTED; - - /* Change state to CLOSING */ - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); - - /* Tell the lower layer */ - chan_l->close(chan_l); - - /* - * It's up to the lower layer to change state to CLOSED or ERROR when we're - * ready; we'll try to free channels that are in the finished list from - * channel_run_cleanup(). The lower layer should do this by calling - * channel_listener_closed(). - */ -} - -/** - * Close a channel from the lower layer - * - * Notify the channel code that the channel is being closed due to a non-error - * condition in the lower layer. This does not call the close() method, since - * the lower layer already knows. - */ - -void -channel_close_from_lower_layer(channel_t *chan) -{ - tor_assert(chan != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel %p (global ID " U64_FORMAT ") " - "due to lower-layer event", - chan, U64_PRINTF_ARG(chan->global_identifier)); - - /* Note closing by event from below */ - chan->reason_for_closing = CHANNEL_CLOSE_FROM_BELOW; - - /* Change state to CLOSING */ - channel_change_state(chan, CHANNEL_STATE_CLOSING); -} - -/** - * Close a channel listener from the lower layer - * - * Notify the channel code that the channel listener is being closed due to a - * non-error condition in the lower layer. This does not call the close() - * method, since the lower layer already knows. - */ - -void -channel_listener_close_from_lower_layer(channel_listener_t *chan_l) -{ - tor_assert(chan_l != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || - chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel listener %p (global ID " U64_FORMAT ") " - "due to lower-layer event", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); - - /* Note closing by event from below */ - chan_l->reason_for_closing = CHANNEL_LISTENER_CLOSE_FROM_BELOW; - - /* Change state to CLOSING */ - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); -} - -/** - * Notify that the channel is being closed due to an error condition - * - * This function is called by the lower layer implementing the transport - * when a channel must be closed due to an error condition. This does not - * call the channel's close method, since the lower layer already knows. - */ - -void -channel_close_for_error(channel_t *chan) -{ - tor_assert(chan != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel %p due to lower-layer error", - chan); - - /* Note closing by event from below */ - chan->reason_for_closing = CHANNEL_CLOSE_FOR_ERROR; - - /* Change state to CLOSING */ - channel_change_state(chan, CHANNEL_STATE_CLOSING); -} - -/** - * Notify that the channel listener is being closed due to an error condition - * - * This function is called by the lower layer implementing the transport - * when a channel listener must be closed due to an error condition. This - * does not call the channel listener's close method, since the lower layer - * already knows. - */ - -void -channel_listener_close_for_error(channel_listener_t *chan_l) -{ - tor_assert(chan_l != NULL); - - /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || - chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; - - log_debug(LD_CHANNEL, - "Closing channel listener %p (global ID " U64_FORMAT ") " - "due to lower-layer error", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); - - /* Note closing by event from below */ - chan_l->reason_for_closing = CHANNEL_LISTENER_CLOSE_FOR_ERROR; - - /* Change state to CLOSING */ - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); -} - -/** - * Notify that the lower layer is finished closing the channel - * - * This function should be called by the lower layer when a channel - * is finished closing and it should be regarded as inactive and - * freed by the channel code. - */ - -void -channel_closed(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - - /* No-op if already inactive */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; - - /* Inform any pending (not attached) circs that they should - * give up. */ - if (! chan->has_been_open) - circuit_n_chan_done(chan, 0); - - /* Now close all the attached circuits on it. */ - circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED); - - if (chan->reason_for_closing != CHANNEL_CLOSE_FOR_ERROR) { - channel_change_state(chan, CHANNEL_STATE_CLOSED); - } else { - channel_change_state(chan, CHANNEL_STATE_ERROR); - } -} - -/** - * Notify that the lower layer is finished closing the channel listener - * - * This function should be called by the lower layer when a channel listener - * is finished closing and it should be regarded as inactive and - * freed by the channel code. - */ - -void -channel_listener_closed(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - tor_assert(chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || - chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR); - - /* No-op if already inactive */ - if (chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR) return; - - if (chan_l->reason_for_closing != CHANNEL_LISTENER_CLOSE_FOR_ERROR) { - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSED); - } else { - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_ERROR); - } -} - -/** - * Clear the identity_digest of a channel - * - * This function clears the identity digest of the remote endpoint for a - * channel; this is intended for use by the lower layer. - */ - -void -channel_clear_identity_digest(channel_t *chan) -{ - int state_not_in_map; - - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Clearing remote endpoint digest on channel %p with " - "global ID " U64_FORMAT, - chan, U64_PRINTF_ARG(chan->global_identifier)); - - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - - if (!state_not_in_map && chan->registered && - !tor_digest_is_zero(chan->identity_digest)) - /* if it's registered get it out of the digest map */ - channel_remove_from_digest_map(chan); - - memset(chan->identity_digest, 0, - sizeof(chan->identity_digest)); -} - -/** - * Set the identity_digest of a channel - * - * This function sets the identity digest of the remote endpoint for a - * channel; this is intended for use by the lower layer. - */ - -void -channel_set_identity_digest(channel_t *chan, - const char *identity_digest) -{ - int was_in_digest_map, should_be_in_digest_map, state_not_in_map; - - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Setting remote endpoint digest on channel %p with " - "global ID " U64_FORMAT " to digest %s", - chan, U64_PRINTF_ARG(chan->global_identifier), - identity_digest ? - hex_str(identity_digest, DIGEST_LEN) : "(null)"); - - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - was_in_digest_map = - !state_not_in_map && - chan->registered && - !tor_digest_is_zero(chan->identity_digest); - should_be_in_digest_map = - !state_not_in_map && - chan->registered && - (identity_digest && - !tor_digest_is_zero(identity_digest)); - - if (was_in_digest_map) - /* We should always remove it; we'll add it back if we're writing - * in a new digest. - */ - channel_remove_from_digest_map(chan); - - if (identity_digest) { - memcpy(chan->identity_digest, - identity_digest, - sizeof(chan->identity_digest)); - } else { - memset(chan->identity_digest, 0, - sizeof(chan->identity_digest)); - } - - /* Put it in the digest map if we should */ - if (should_be_in_digest_map) - channel_add_to_digest_map(chan); -} - -/** - * Clear the remote end metadata (identity_digest/nickname) of a channel - * - * This function clears all the remote end info from a channel; this is - * intended for use by the lower layer. - */ - -void -channel_clear_remote_end(channel_t *chan) -{ - int state_not_in_map; - - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Clearing remote endpoint identity on channel %p with " - "global ID " U64_FORMAT, - chan, U64_PRINTF_ARG(chan->global_identifier)); - - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - - if (!state_not_in_map && chan->registered && - !tor_digest_is_zero(chan->identity_digest)) - /* if it's registered get it out of the digest map */ - channel_remove_from_digest_map(chan); - - memset(chan->identity_digest, 0, - sizeof(chan->identity_digest)); - tor_free(chan->nickname); -} - -/** - * Set the remote end metadata (identity_digest/nickname) of a channel - * - * This function sets new remote end info on a channel; this is intended - * for use by the lower layer. - */ - -void -channel_set_remote_end(channel_t *chan, - const char *identity_digest, - const char *nickname) -{ - int was_in_digest_map, should_be_in_digest_map, state_not_in_map; - - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Setting remote endpoint identity on channel %p with " - "global ID " U64_FORMAT " to nickname %s, digest %s", - chan, U64_PRINTF_ARG(chan->global_identifier), - nickname ? nickname : "(null)", - identity_digest ? - hex_str(identity_digest, DIGEST_LEN) : "(null)"); - - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); - was_in_digest_map = - !state_not_in_map && - chan->registered && - !tor_digest_is_zero(chan->identity_digest); - should_be_in_digest_map = - !state_not_in_map && - chan->registered && - (identity_digest && - !tor_digest_is_zero(identity_digest)); - - if (was_in_digest_map) - /* We should always remove it; we'll add it back if we're writing - * in a new digest. - */ - channel_remove_from_digest_map(chan); - - if (identity_digest) { - memcpy(chan->identity_digest, - identity_digest, - sizeof(chan->identity_digest)); - - } else { - memset(chan->identity_digest, 0, - sizeof(chan->identity_digest)); - } - - tor_free(chan->nickname); - if (nickname) - chan->nickname = tor_strdup(nickname); - - /* Put it in the digest map if we should */ - if (should_be_in_digest_map) - channel_add_to_digest_map(chan); -} - -/** - * Duplicate a cell queue entry; this is a shallow copy intended for use - * in channel_write_cell_queue_entry(). - */ - -static cell_queue_entry_t * -cell_queue_entry_dup(cell_queue_entry_t *q) -{ - cell_queue_entry_t *rv = NULL; - - tor_assert(q); - - rv = tor_malloc(sizeof(*rv)); - memcpy(rv, q, sizeof(*rv)); - - return rv; -} - -/** - * Free a cell_queue_entry_t; the handed_off parameter indicates whether - * the contents were passed to the lower layer (it is responsible for - * them) or not (we should free). - */ - -static void -cell_queue_entry_free(cell_queue_entry_t *q, int handed_off) -{ - if (!q) return; - - if (!handed_off) { - /* - * If we handed it off, the recipient becomes responsible (or - * with packed cells the channel_t subclass calls packed_cell - * free after writing out its contents; see, e.g., - * channel_tls_write_packed_cell_method(). Otherwise, we have - * to take care of it here if possible. - */ - switch (q->type) { - case CELL_QUEUE_FIXED: - if (q->u.fixed.cell) { - /* - * There doesn't seem to be a cell_free() function anywhere in the - * pre-channel code; just use tor_free() - */ - tor_free(q->u.fixed.cell); - } - break; - case CELL_QUEUE_PACKED: - if (q->u.packed.packed_cell) { - packed_cell_free(q->u.packed.packed_cell); - } - break; - case CELL_QUEUE_VAR: - if (q->u.var.var_cell) { - /* - * This one's in connection_or.c; it'd be nice to figure out the - * whole flow of cells from one end to the other and factor the - * cell memory management functions like this out of the specific - * TLS lower layer. - */ - var_cell_free(q->u.var.var_cell); - } - break; - default: - /* - * Nothing we can do if we don't know the type; this will - * have been warned about elsewhere. - */ - break; - } - } - tor_free(q); -} - -/** - * Check whether a cell queue entry is padding; this is a helper function - * for channel_write_cell_queue_entry() - */ - -static int -cell_queue_entry_is_padding(cell_queue_entry_t *q) -{ - tor_assert(q); - - if (q->type == CELL_QUEUE_FIXED) { - if (q->u.fixed.cell) { - if (q->u.fixed.cell->command == CELL_PADDING || - q->u.fixed.cell->command == CELL_VPADDING) { - return 1; - } - } - } else if (q->type == CELL_QUEUE_VAR) { - if (q->u.var.var_cell) { - if (q->u.var.var_cell->command == CELL_PADDING || - q->u.var.var_cell->command == CELL_VPADDING) { - return 1; - } - } - } - - return 0; -} - -/** - * Allocate a new cell queue entry for a fixed-size cell - */ - -static cell_queue_entry_t * -cell_queue_entry_new_fixed(cell_t *cell) -{ - cell_queue_entry_t *q = NULL; - - tor_assert(cell); - - q = tor_malloc(sizeof(*q)); - q->type = CELL_QUEUE_FIXED; - q->u.fixed.cell = cell; - - return q; -} - -/** - * Allocate a new cell queue entry for a variable-size cell - */ - -static cell_queue_entry_t * -cell_queue_entry_new_var(var_cell_t *var_cell) -{ - cell_queue_entry_t *q = NULL; - - tor_assert(var_cell); - - q = tor_malloc(sizeof(*q)); - q->type = CELL_QUEUE_VAR; - q->u.var.var_cell = var_cell; - - return q; -} - -/** - * Write to a channel based on a cell_queue_entry_t - * - * Given a cell_queue_entry_t filled out by the caller, try to send the cell - * and queue it if we can't. - */ - -static void -channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) -{ - int result = 0, sent = 0; - cell_queue_entry_t *tmp = NULL; - - tor_assert(chan); - tor_assert(q); - - /* Assert that the state makes sense for a cell write */ - tor_assert(chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT); - - /* Increment the timestamp unless it's padding */ - if (!cell_queue_entry_is_padding(q)) { - chan->timestamp_last_added_nonpadding = approx_time(); - } - - { - circid_t circ_id; - if (is_destroy_cell(chan, q, &circ_id)) { - channel_note_destroy_not_pending(chan, circ_id); - } - } - - /* Can we send it right out? If so, try */ - if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) && - chan->state == CHANNEL_STATE_OPEN) { - /* Pick the right write function for this cell type and save the result */ - switch (q->type) { - case CELL_QUEUE_FIXED: - tor_assert(chan->write_cell); - tor_assert(q->u.fixed.cell); - result = chan->write_cell(chan, q->u.fixed.cell); - break; - case CELL_QUEUE_PACKED: - tor_assert(chan->write_packed_cell); - tor_assert(q->u.packed.packed_cell); - result = chan->write_packed_cell(chan, q->u.packed.packed_cell); - break; - case CELL_QUEUE_VAR: - tor_assert(chan->write_var_cell); - tor_assert(q->u.var.var_cell); - result = chan->write_var_cell(chan, q->u.var.var_cell); - break; - default: - tor_assert(1); - } - - /* Check if we got it out */ - if (result > 0) { - sent = 1; - /* Timestamp for transmission */ - channel_timestamp_xmit(chan); - /* If we're here the queue is empty, so it's drained too */ - channel_timestamp_drained(chan); - /* Update the counter */ - ++(chan->n_cells_xmitted); - } - } - - if (!sent) { - /* Not sent, queue it */ - /* - * We have to copy the queue entry passed in, since the caller probably - * used the stack. - */ - tmp = cell_queue_entry_dup(q); - TOR_SIMPLEQ_INSERT_TAIL(&chan->outgoing_queue, tmp, next); - /* Try to process the queue? */ - if (chan->state == CHANNEL_STATE_OPEN) channel_flush_cells(chan); - } -} - -/** - * Write a cell to a channel - * - * Write a fixed-length cell to a channel using the write_cell() method. - * This is equivalent to the pre-channels connection_or_write_cell_to_buf(); - * it is called by the transport-independent code to deliver a cell to a - * channel for transmission. - */ - -void -channel_write_cell(channel_t *chan, cell_t *cell) -{ - cell_queue_entry_t q; - - tor_assert(chan); - tor_assert(cell); - - if (chan->state == CHANNEL_STATE_CLOSING) { - log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with " - "global ID "U64_FORMAT, cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - tor_free(cell); - return; - } - - log_debug(LD_CHANNEL, - "Writing cell_t %p to channel %p with global ID " - U64_FORMAT, - cell, chan, U64_PRINTF_ARG(chan->global_identifier)); - - q.type = CELL_QUEUE_FIXED; - q.u.fixed.cell = cell; - channel_write_cell_queue_entry(chan, &q); -} - -/** - * Write a packed cell to a channel - * - * Write a packed cell to a channel using the write_cell() method. This is - * called by the transport-independent code to deliver a packed cell to a - * channel for transmission. - */ - -void -channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell) -{ - cell_queue_entry_t q; - - tor_assert(chan); - tor_assert(packed_cell); - - if (chan->state == CHANNEL_STATE_CLOSING) { - log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p " - "with global ID "U64_FORMAT, packed_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - packed_cell_free(packed_cell); - return; - } - - log_debug(LD_CHANNEL, - "Writing packed_cell_t %p to channel %p with global ID " - U64_FORMAT, - packed_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - - q.type = CELL_QUEUE_PACKED; - q.u.packed.packed_cell = packed_cell; - channel_write_cell_queue_entry(chan, &q); -} - -/** - * Write a variable-length cell to a channel - * - * Write a variable-length cell to a channel using the write_cell() method. - * This is equivalent to the pre-channels - * connection_or_write_var_cell_to_buf(); it's called by the transport- - * independent code to deliver a var_cell to a channel for transmission. - */ - -void -channel_write_var_cell(channel_t *chan, var_cell_t *var_cell) -{ - cell_queue_entry_t q; - - tor_assert(chan); - tor_assert(var_cell); - - if (chan->state == CHANNEL_STATE_CLOSING) { - log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p " - "with global ID "U64_FORMAT, var_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - var_cell_free(var_cell); - return; - } - - log_debug(LD_CHANNEL, - "Writing var_cell_t %p to channel %p with global ID " - U64_FORMAT, - var_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - - q.type = CELL_QUEUE_VAR; - q.u.var.var_cell = var_cell; - channel_write_cell_queue_entry(chan, &q); -} - -/** - * Change channel state - * - * This internal and subclass use only function is used to change channel - * state, performing all transition validity checks and whatever actions - * are appropriate to the state transition in question. - */ - -void -channel_change_state(channel_t *chan, channel_state_t to_state) -{ - channel_state_t from_state; - unsigned char was_active, is_active; - unsigned char was_in_id_map, is_in_id_map; - - tor_assert(chan); - from_state = chan->state; - - tor_assert(channel_state_is_valid(from_state)); - tor_assert(channel_state_is_valid(to_state)); - tor_assert(channel_state_can_transition(chan->state, to_state)); - - /* Check for no-op transitions */ - if (from_state == to_state) { - log_debug(LD_CHANNEL, - "Got no-op transition from \"%s\" to itself on channel %p" - "(global ID " U64_FORMAT ")", - channel_state_to_string(to_state), - chan, U64_PRINTF_ARG(chan->global_identifier)); - return; - } - - /* If we're going to a closing or closed state, we must have a reason set */ - if (to_state == CHANNEL_STATE_CLOSING || - to_state == CHANNEL_STATE_CLOSED || - to_state == CHANNEL_STATE_ERROR) { - tor_assert(chan->reason_for_closing != CHANNEL_NOT_CLOSING); - } - - /* - * We need to maintain the queues here for some transitions: - * when we enter CHANNEL_STATE_OPEN (especially from CHANNEL_STATE_MAINT) - * we may have a backlog of cells to transmit, so drain the queues in - * that case, and when going to CHANNEL_STATE_CLOSED the subclass - * should have made sure to finish sending things (or gone to - * CHANNEL_STATE_ERROR if not possible), so we assert for that here. - */ - - log_debug(LD_CHANNEL, - "Changing state of channel %p (global ID " U64_FORMAT - ") from \"%s\" to \"%s\"", - chan, - U64_PRINTF_ARG(chan->global_identifier), - channel_state_to_string(chan->state), - channel_state_to_string(to_state)); - - chan->state = to_state; - - /* Need to add to the right lists if the channel is registered */ - if (chan->registered) { - was_active = !(from_state == CHANNEL_STATE_CLOSED || - from_state == CHANNEL_STATE_ERROR); - is_active = !(to_state == CHANNEL_STATE_CLOSED || - to_state == CHANNEL_STATE_ERROR); - - /* Need to take off active list and put on finished list? */ - if (was_active && !is_active) { - if (active_channels) smartlist_remove(active_channels, chan); - if (!finished_channels) finished_channels = smartlist_new(); - smartlist_add(finished_channels, chan); - } - /* Need to put on active list? */ - else if (!was_active && is_active) { - if (finished_channels) smartlist_remove(finished_channels, chan); - if (!active_channels) active_channels = smartlist_new(); - smartlist_add(active_channels, chan); - } - - if (!tor_digest_is_zero(chan->identity_digest)) { - /* Now we need to handle the identity map */ - was_in_id_map = !(from_state == CHANNEL_STATE_CLOSING || - from_state == CHANNEL_STATE_CLOSED || - from_state == CHANNEL_STATE_ERROR); - is_in_id_map = !(to_state == CHANNEL_STATE_CLOSING || - to_state == CHANNEL_STATE_CLOSED || - to_state == CHANNEL_STATE_ERROR); - - if (!was_in_id_map && is_in_id_map) channel_add_to_digest_map(chan); - else if (was_in_id_map && !is_in_id_map) - channel_remove_from_digest_map(chan); - } - } - - /* Tell circuits if we opened and stuff */ - if (to_state == CHANNEL_STATE_OPEN) { - channel_do_open_actions(chan); - chan->has_been_open = 1; - - /* Check for queued cells to process */ - if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) - channel_process_cells(chan); - if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) - channel_flush_cells(chan); - } else if (to_state == CHANNEL_STATE_CLOSED || - to_state == CHANNEL_STATE_ERROR) { - /* Assert that all queues are empty */ - tor_assert(TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)); - tor_assert(TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)); - } -} - -/** - * Change channel listener state - * - * This internal and subclass use only function is used to change channel - * listener state, performing all transition validity checks and whatever - * actions are appropriate to the state transition in question. - */ - -void -channel_listener_change_state(channel_listener_t *chan_l, - channel_listener_state_t to_state) -{ - channel_listener_state_t from_state; - unsigned char was_active, is_active; - - tor_assert(chan_l); - from_state = chan_l->state; - - tor_assert(channel_listener_state_is_valid(from_state)); - tor_assert(channel_listener_state_is_valid(to_state)); - tor_assert(channel_listener_state_can_transition(chan_l->state, to_state)); - - /* Check for no-op transitions */ - if (from_state == to_state) { - log_debug(LD_CHANNEL, - "Got no-op transition from \"%s\" to itself on channel " - "listener %p (global ID " U64_FORMAT ")", - channel_listener_state_to_string(to_state), - chan_l, U64_PRINTF_ARG(chan_l->global_identifier)); - return; - } - - /* If we're going to a closing or closed state, we must have a reason set */ - if (to_state == CHANNEL_LISTENER_STATE_CLOSING || - to_state == CHANNEL_LISTENER_STATE_CLOSED || - to_state == CHANNEL_LISTENER_STATE_ERROR) { - tor_assert(chan_l->reason_for_closing != CHANNEL_LISTENER_NOT_CLOSING); - } - - /* - * We need to maintain the queues here for some transitions: - * when we enter CHANNEL_STATE_OPEN (especially from CHANNEL_STATE_MAINT) - * we may have a backlog of cells to transmit, so drain the queues in - * that case, and when going to CHANNEL_STATE_CLOSED the subclass - * should have made sure to finish sending things (or gone to - * CHANNEL_STATE_ERROR if not possible), so we assert for that here. - */ - - log_debug(LD_CHANNEL, - "Changing state of channel listener %p (global ID " U64_FORMAT - "from \"%s\" to \"%s\"", - chan_l, U64_PRINTF_ARG(chan_l->global_identifier), - channel_listener_state_to_string(chan_l->state), - channel_listener_state_to_string(to_state)); - - chan_l->state = to_state; - - /* Need to add to the right lists if the channel listener is registered */ - if (chan_l->registered) { - was_active = !(from_state == CHANNEL_LISTENER_STATE_CLOSED || - from_state == CHANNEL_LISTENER_STATE_ERROR); - is_active = !(to_state == CHANNEL_LISTENER_STATE_CLOSED || - to_state == CHANNEL_LISTENER_STATE_ERROR); - - /* Need to take off active list and put on finished list? */ - if (was_active && !is_active) { - if (active_listeners) smartlist_remove(active_listeners, chan_l); - if (!finished_listeners) finished_listeners = smartlist_new(); - smartlist_add(finished_listeners, chan_l); - } - /* Need to put on active list? */ - else if (!was_active && is_active) { - if (finished_listeners) smartlist_remove(finished_listeners, chan_l); - if (!active_listeners) active_listeners = smartlist_new(); - smartlist_add(active_listeners, chan_l); - } - } - - if (to_state == CHANNEL_LISTENER_STATE_CLOSED || - to_state == CHANNEL_LISTENER_STATE_ERROR) { - /* Assert that the queue is empty */ - tor_assert(!(chan_l->incoming_list) || - smartlist_len(chan_l->incoming_list) == 0); - } -} - -/** - * Try to flush cells to the lower layer - * - * this is called by the lower layer to indicate that it wants more cells; - * it will try to write up to num_cells cells from the channel's cell queue or - * from circuits active on that channel, or as many as it has available if - * num_cells == -1. - */ - -#define MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED 256 - -ssize_t -channel_flush_some_cells(channel_t *chan, ssize_t num_cells) -{ - unsigned int unlimited = 0; - ssize_t flushed = 0; - int num_cells_from_circs, clamped_num_cells; - - tor_assert(chan); - - if (num_cells < 0) unlimited = 1; - if (!unlimited && num_cells <= flushed) goto done; - - /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ - if (chan->state == CHANNEL_STATE_OPEN) { - /* Try to flush as much as we can that's already queued */ - flushed += channel_flush_some_cells_from_outgoing_queue(chan, - (unlimited ? -1 : num_cells - flushed)); - if (!unlimited && num_cells <= flushed) goto done; - - if (circuitmux_num_cells(chan->cmux) > 0) { - /* Calculate number of cells, including clamp */ - if (unlimited) { - clamped_num_cells = MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED; - } else { - if (num_cells - flushed > - MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED) { - clamped_num_cells = MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED; - } else { - clamped_num_cells = (int)(num_cells - flushed); - } - } - /* Try to get more cells from any active circuits */ - num_cells_from_circs = channel_flush_from_first_active_circuit( - chan, clamped_num_cells); - - /* If it claims we got some, process the queue again */ - if (num_cells_from_circs > 0) { - flushed += channel_flush_some_cells_from_outgoing_queue(chan, - (unlimited ? -1 : num_cells - flushed)); - } - } - } - - done: - return flushed; -} - -/** - * Flush cells from just the channel's outgoing cell queue - * - * This gets called from channel_flush_some_cells() above to flush cells - * just from the queue without trying for active_circuits. - */ - -static ssize_t -channel_flush_some_cells_from_outgoing_queue(channel_t *chan, - ssize_t num_cells) -{ - unsigned int unlimited = 0; - ssize_t flushed = 0; - cell_queue_entry_t *q = NULL; - - tor_assert(chan); - tor_assert(chan->write_cell); - tor_assert(chan->write_packed_cell); - tor_assert(chan->write_var_cell); - - if (num_cells < 0) unlimited = 1; - if (!unlimited && num_cells <= flushed) return 0; - - /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ - if (chan->state == CHANNEL_STATE_OPEN) { - while ((unlimited || num_cells > flushed) && - NULL != (q = TOR_SIMPLEQ_FIRST(&chan->outgoing_queue))) { - - if (1) { - /* - * Okay, we have a good queue entry, try to give it to the lower - * layer. - */ - switch (q->type) { - case CELL_QUEUE_FIXED: - if (q->u.fixed.cell) { - if (chan->write_cell(chan, - q->u.fixed.cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_FIXED " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; - } - break; - case CELL_QUEUE_PACKED: - if (q->u.packed.packed_cell) { - if (chan->write_packed_cell(chan, - q->u.packed.packed_cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_PACKED " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; - } - break; - case CELL_QUEUE_VAR: - if (q->u.var.var_cell) { - if (chan->write_var_cell(chan, - q->u.var.var_cell)) { - ++flushed; - channel_timestamp_xmit(chan); - ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; - } - /* Else couldn't write it; leave it on the queue */ - } else { - /* This shouldn't happen */ - log_info(LD_CHANNEL, - "Saw broken cell queue entry of type CELL_QUEUE_VAR " - "with no cell on channel %p " - "(global ID " U64_FORMAT ").", - chan, U64_PRINTF_ARG(chan->global_identifier)); - /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; - } - break; - default: - /* Unknown type, log and free it */ - log_info(LD_CHANNEL, - "Saw an unknown cell queue entry type %d on channel %p " - "(global ID " U64_FORMAT "; ignoring it." - " Someone should fix this.", - q->type, chan, U64_PRINTF_ARG(chan->global_identifier)); - cell_queue_entry_free(q, 0); - q = NULL; - } - - /* if q got NULLed out, we used it and should remove the queue entry */ - if (!q) TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); - /* No cell removed from list, so we can't go on any further */ - else break; - } - } - } - - /* Did we drain the queue? */ - if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) { - channel_timestamp_drained(chan); - } - - return flushed; -} - -/** - * Flush as many cells as we possibly can from the queue - * - * This tries to flush as many cells from the queue as the lower layer - * will take. It just calls channel_flush_some_cells_from_outgoing_queue() - * in unlimited mode. - */ - -void -channel_flush_cells(channel_t *chan) -{ - channel_flush_some_cells_from_outgoing_queue(chan, -1); -} - -/** - * Check if any cells are available - * - * This gets used from the lower layer to check if any more cells are - * available. - */ - -int -channel_more_to_flush(channel_t *chan) -{ - tor_assert(chan); - - /* Check if we have any queued */ - if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) - return 1; - - /* Check if any circuits would like to queue some */ - if (circuitmux_num_cells(chan->cmux) > 0) return 1; - - /* Else no */ - return 0; -} - -/** - * Notify the channel we're done flushing the output in the lower layer - * - * Connection.c will call this when we've flushed the output; there's some - * dirreq-related maintenance to do. - */ - -void -channel_notify_flushed(channel_t *chan) -{ - tor_assert(chan); - - if (chan->dirreq_id != 0) - geoip_change_dirreq_state(chan->dirreq_id, - DIRREQ_TUNNELED, - DIRREQ_CHANNEL_BUFFER_FLUSHED); -} - -/** - * Process the queue of incoming channels on a listener - * - * Use a listener's registered callback to process as many entries in the - * queue of incoming channels as possible. - */ - -void -channel_listener_process_incoming(channel_listener_t *listener) -{ - tor_assert(listener); - - /* - * CHANNEL_LISTENER_STATE_CLOSING permitted because we drain the queue - * while closing a listener. - */ - tor_assert(listener->state == CHANNEL_LISTENER_STATE_LISTENING || - listener->state == CHANNEL_LISTENER_STATE_CLOSING); - tor_assert(listener->listener); - - log_debug(LD_CHANNEL, - "Processing queue of incoming connections for channel " - "listener %p (global ID " U64_FORMAT ")", - listener, U64_PRINTF_ARG(listener->global_identifier)); - - if (!(listener->incoming_list)) return; - - SMARTLIST_FOREACH_BEGIN(listener->incoming_list, - channel_t *, chan) { - tor_assert(chan); - - log_debug(LD_CHANNEL, - "Handling incoming channel %p (" U64_FORMAT ") " - "for listener %p (" U64_FORMAT ")", - chan, - U64_PRINTF_ARG(chan->global_identifier), - listener, - U64_PRINTF_ARG(listener->global_identifier)); - /* Make sure this is set correctly */ - channel_mark_incoming(chan); - listener->listener(listener, chan); - } SMARTLIST_FOREACH_END(chan); - - smartlist_free(listener->incoming_list); - listener->incoming_list = NULL; -} - -/** - * Take actions required when a channel becomes open - * - * Handle actions we should do when we know a channel is open; a lot of - * this comes from the old connection_or_set_state_open() of connection_or.c. - * - * Because of this mechanism, future channel_t subclasses should take care - * not to change a channel to from CHANNEL_STATE_OPENING to CHANNEL_STATE_OPEN - * until there is positive confirmation that the network is operational. - * In particular, anything UDP-based should not make this transition until a - * packet is received from the other side. - */ - -void -channel_do_open_actions(channel_t *chan) -{ - tor_addr_t remote_addr; - int started_here, not_using = 0; - time_t now = time(NULL); - - tor_assert(chan); - - started_here = channel_is_outgoing(chan); - - if (started_here) { - circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - rep_hist_note_connect_succeeded(chan->identity_digest, now); - if (entry_guard_register_connect_status( - chan->identity_digest, 1, 0, now) < 0) { - /* Close any circuits pending on this channel. We leave it in state - * 'open' though, because it didn't actually *fail* -- we just - * chose not to use it. */ - log_debug(LD_OR, - "New entry guard was reachable, but closing this " - "connection so we can retry the earlier entry guards."); - circuit_n_chan_done(chan, 0); - not_using = 1; - } - router_set_status(chan->identity_digest, 1); - } else { - /* only report it to the geoip module if it's not a known router */ - if (!router_get_by_id_digest(chan->identity_digest)) { - if (channel_get_addr_if_possible(chan, &remote_addr)) { - char *transport_name = NULL; - if (chan->get_transport_name(chan, &transport_name) < 0) - transport_name = NULL; - - geoip_note_client_seen(GEOIP_CLIENT_CONNECT, - &remote_addr, transport_name, - now); - tor_free(transport_name); - } - /* Otherwise the underlying transport can't tell us this, so skip it */ - } - } - - if (!not_using) circuit_n_chan_done(chan, 1); -} - -/** - * Queue an incoming channel on a listener - * - * Internal and subclass use only function to queue an incoming channel from - * a listener. A subclass of channel_listener_t should call this when a new - * incoming channel is created. - */ - -void -channel_listener_queue_incoming(channel_listener_t *listener, - channel_t *incoming) -{ - int need_to_queue = 0; - - tor_assert(listener); - tor_assert(listener->state == CHANNEL_LISTENER_STATE_LISTENING); - tor_assert(incoming); - - log_debug(LD_CHANNEL, - "Queueing incoming channel %p (global ID " U64_FORMAT ") on " - "channel listener %p (global ID " U64_FORMAT ")", - incoming, U64_PRINTF_ARG(incoming->global_identifier), - listener, U64_PRINTF_ARG(listener->global_identifier)); - - /* Do we need to queue it, or can we just call the listener right away? */ - if (!(listener->listener)) need_to_queue = 1; - if (listener->incoming_list && - (smartlist_len(listener->incoming_list) > 0)) - need_to_queue = 1; - - /* If we need to queue and have no queue, create one */ - if (need_to_queue && !(listener->incoming_list)) { - listener->incoming_list = smartlist_new(); - } - - /* Bump the counter and timestamp it */ - channel_listener_timestamp_active(listener); - channel_listener_timestamp_accepted(listener); - ++(listener->n_accepted); - - /* If we don't need to queue, process it right away */ - if (!need_to_queue) { - tor_assert(listener->listener); - listener->listener(listener, incoming); - } - /* - * Otherwise, we need to queue; queue and then process the queue if - * we can. - */ - else { - tor_assert(listener->incoming_list); - smartlist_add(listener->incoming_list, incoming); - if (listener->listener) channel_listener_process_incoming(listener); - } -} - -/** - * Process queued incoming cells - * - * Process as many queued cells as we can from the incoming - * cell queue. - */ - -void -channel_process_cells(channel_t *chan) -{ - cell_queue_entry_t *q; - tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_MAINT || - chan->state == CHANNEL_STATE_OPEN); - - log_debug(LD_CHANNEL, - "Processing as many incoming cells as we can for channel %p", - chan); - - /* Nothing we can do if we have no registered cell handlers */ - if (!(chan->cell_handler || - chan->var_cell_handler)) return; - /* Nothing we can do if we have no cells */ - if (TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) return; - - /* - * Process cells until we're done or find one we have no current handler - * for. - */ - while (NULL != (q = TOR_SIMPLEQ_FIRST(&chan->incoming_queue))) { - tor_assert(q); - tor_assert(q->type == CELL_QUEUE_FIXED || - q->type == CELL_QUEUE_VAR); - - if (q->type == CELL_QUEUE_FIXED && - chan->cell_handler) { - /* Handle a fixed-length cell */ - TOR_SIMPLEQ_REMOVE_HEAD(&chan->incoming_queue, next); - tor_assert(q->u.fixed.cell); - log_debug(LD_CHANNEL, - "Processing incoming cell_t %p for channel %p (global ID " - U64_FORMAT ")", - q->u.fixed.cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - chan->cell_handler(chan, q->u.fixed.cell); - tor_free(q); - } else if (q->type == CELL_QUEUE_VAR && - chan->var_cell_handler) { - /* Handle a variable-length cell */ - TOR_SIMPLEQ_REMOVE_HEAD(&chan->incoming_queue, next); - tor_assert(q->u.var.var_cell); - log_debug(LD_CHANNEL, - "Processing incoming var_cell_t %p for channel %p (global ID " - U64_FORMAT ")", - q->u.var.var_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - chan->var_cell_handler(chan, q->u.var.var_cell); - tor_free(q); - } else { - /* Can't handle this one */ - break; - } - } -} - -/** - * Queue incoming cell - * - * This should be called by a channel_t subclass to queue an incoming fixed- - * length cell for processing, and process it if possible. - */ - -void -channel_queue_cell(channel_t *chan, cell_t *cell) -{ - int need_to_queue = 0; - cell_queue_entry_t *q; - - tor_assert(chan); - tor_assert(cell); - tor_assert(chan->state == CHANNEL_STATE_OPEN); - - /* Do we need to queue it, or can we just call the handler right away? */ - if (!(chan->cell_handler)) need_to_queue = 1; - if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) - need_to_queue = 1; - - /* Timestamp for receiving */ - channel_timestamp_recv(chan); - - /* Update the counter */ - ++(chan->n_cells_recved); - - /* If we don't need to queue we can just call cell_handler */ - if (!need_to_queue) { - tor_assert(chan->cell_handler); - log_debug(LD_CHANNEL, - "Directly handling incoming cell_t %p for channel %p " - "(global ID " U64_FORMAT ")", - cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - chan->cell_handler(chan, cell); - } else { - /* Otherwise queue it and then process the queue if possible. */ - q = cell_queue_entry_new_fixed(cell); - log_debug(LD_CHANNEL, - "Queueing incoming cell_t %p for channel %p " - "(global ID " U64_FORMAT ")", - cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - TOR_SIMPLEQ_INSERT_TAIL(&chan->incoming_queue, q, next); - if (chan->cell_handler || - chan->var_cell_handler) { - channel_process_cells(chan); - } - } -} - -/** - * Queue incoming variable-length cell - * - * This should be called by a channel_t subclass to queue an incoming - * variable-length cell for processing, and process it if possible. - */ - -void -channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell) -{ - int need_to_queue = 0; - cell_queue_entry_t *q; - - tor_assert(chan); - tor_assert(var_cell); - tor_assert(chan->state == CHANNEL_STATE_OPEN); - - /* Do we need to queue it, or can we just call the handler right away? */ - if (!(chan->var_cell_handler)) need_to_queue = 1; - if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue)) - need_to_queue = 1; - - /* Timestamp for receiving */ - channel_timestamp_recv(chan); - - /* Update the counter */ - ++(chan->n_cells_recved); - - /* If we don't need to queue we can just call cell_handler */ - if (!need_to_queue) { - tor_assert(chan->var_cell_handler); - log_debug(LD_CHANNEL, - "Directly handling incoming var_cell_t %p for channel %p " - "(global ID " U64_FORMAT ")", - var_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - chan->var_cell_handler(chan, var_cell); - } else { - /* Otherwise queue it and then process the queue if possible. */ - q = cell_queue_entry_new_var(var_cell); - log_debug(LD_CHANNEL, - "Queueing incoming var_cell_t %p for channel %p " - "(global ID " U64_FORMAT ")", - var_cell, chan, - U64_PRINTF_ARG(chan->global_identifier)); - TOR_SIMPLEQ_INSERT_TAIL(&chan->incoming_queue, q, next); - if (chan->cell_handler || - chan->var_cell_handler) { - channel_process_cells(chan); - } - } -} - -/** If packed_cell on chan is a destroy cell, then set - * *circid_out to its circuit ID, and return true. Otherwise, return - * false. */ -/* XXXX Move this function. */ -int -packed_cell_is_destroy(channel_t *chan, - const packed_cell_t *packed_cell, - circid_t *circid_out) -{ - if (chan->wide_circ_ids) { - if (packed_cell->body[4] == CELL_DESTROY) { - *circid_out = ntohl(get_uint32(packed_cell->body)); - return 1; - } - } else { - if (packed_cell->body[2] == CELL_DESTROY) { - *circid_out = ntohs(get_uint16(packed_cell->body)); - return 1; - } - } - return 0; -} - -/** DOCDOC */ -static int -is_destroy_cell(channel_t *chan, - const cell_queue_entry_t *q, circid_t *circid_out) -{ - *circid_out = 0; - switch (q->type) { - case CELL_QUEUE_FIXED: - if (q->u.fixed.cell->command == CELL_DESTROY) { - *circid_out = q->u.fixed.cell->circ_id; - return 1; - } - break; - case CELL_QUEUE_VAR: - if (q->u.var.var_cell->command == CELL_DESTROY) { - *circid_out = q->u.var.var_cell->circ_id; - return 1; - } - break; - case CELL_QUEUE_PACKED: - return packed_cell_is_destroy(chan, q->u.packed.packed_cell, circid_out); - } - return 0; -} - -/** - * Send destroy cell on a channel - * - * Write a destroy cell with circ ID circ_id and reason reason - * onto channel chan. Don't perform range-checking on reason: - * we may want to propagate reasons from other cells. - */ - -int -channel_send_destroy(circid_t circ_id, channel_t *chan, int reason) -{ - tor_assert(chan); - - /* Check to make sure we can send on this channel first */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) && - chan->cmux) { - channel_note_destroy_pending(chan, circ_id); - circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason); - log_debug(LD_OR, - "Sending destroy (circID %u) on channel %p " - "(global ID " U64_FORMAT ")", - (unsigned)circ_id, chan, - U64_PRINTF_ARG(chan->global_identifier)); - } else { - log_warn(LD_BUG, - "Someone called channel_send_destroy() for circID %u " - "on a channel " U64_FORMAT " at %p in state %s (%d)", - (unsigned)circ_id, U64_PRINTF_ARG(chan->global_identifier), - chan, channel_state_to_string(chan->state), - chan->state); - } - - return 0; -} - -/** - * Dump channel statistics to the log - * - * This is called from dumpstats() in onion_main.c and spams the log with - * statistics on channels. - */ - -void -channel_dumpstats(int severity) -{ - if (all_channels && smartlist_len(all_channels) > 0) { - tor_log(severity, LD_GENERAL, - "Dumping statistics about %d channels:", - smartlist_len(all_channels)); - tor_log(severity, LD_GENERAL, - "%d are active, and %d are done and waiting for cleanup", - (active_channels != NULL) ? - smartlist_len(active_channels) : 0, - (finished_channels != NULL) ? - smartlist_len(finished_channels) : 0); - - SMARTLIST_FOREACH(all_channels, channel_t *, chan, - channel_dump_statistics(chan, severity)); - - tor_log(severity, LD_GENERAL, - "Done spamming about channels now"); - } else { - tor_log(severity, LD_GENERAL, - "No channels to dump"); - } -} - -/** - * Dump channel listener statistics to the log - * - * This is called from dumpstats() in onion_main.c and spams the log with - * statistics on channel listeners. - */ - -void -channel_listener_dumpstats(int severity) -{ - if (all_listeners && smartlist_len(all_listeners) > 0) { - tor_log(severity, LD_GENERAL, - "Dumping statistics about %d channel listeners:", - smartlist_len(all_listeners)); - tor_log(severity, LD_GENERAL, - "%d are active and %d are done and waiting for cleanup", - (active_listeners != NULL) ? - smartlist_len(active_listeners) : 0, - (finished_listeners != NULL) ? - smartlist_len(finished_listeners) : 0); - - SMARTLIST_FOREACH(all_listeners, channel_listener_t *, chan_l, - channel_listener_dump_statistics(chan_l, severity)); - - tor_log(severity, LD_GENERAL, - "Done spamming about channel listeners now"); - } else { - tor_log(severity, LD_GENERAL, - "No channel listeners to dump"); - } -} - -/** - * Set the cmux policy on all active channels - */ - -void -channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol) -{ - if (!active_channels) return; - - SMARTLIST_FOREACH_BEGIN(active_channels, channel_t *, curr) { - if (curr->cmux) { - circuitmux_set_policy(curr->cmux, pol); - } - } SMARTLIST_FOREACH_END(curr); -} - -/** - * Clean up channels - * - * This gets called periodically from run_scheduled_events() in onion_main.c; - * it cleans up after closed channels. - */ - -void -channel_run_cleanup(void) -{ - channel_t *tmp = NULL; - - /* Check if we need to do anything */ - if (!finished_channels || smartlist_len(finished_channels) == 0) return; - - /* Iterate through finished_channels and get rid of them */ - SMARTLIST_FOREACH_BEGIN(finished_channels, channel_t *, curr) { - tmp = curr; - /* Remove it from the list */ - SMARTLIST_DEL_CURRENT(finished_channels, curr); - /* Also unregister it */ - channel_unregister(tmp); - /* ... and free it */ - channel_free(tmp); - } SMARTLIST_FOREACH_END(curr); -} - -/** - * Clean up channel listeners - * - * This gets called periodically from run_scheduled_events() in onion_main.c; - * it cleans up after closed channel listeners. - */ - -void -channel_listener_run_cleanup(void) -{ - channel_listener_t *tmp = NULL; - - /* Check if we need to do anything */ - if (!finished_listeners || smartlist_len(finished_listeners) == 0) return; - - /* Iterate through finished_channels and get rid of them */ - SMARTLIST_FOREACH_BEGIN(finished_listeners, channel_listener_t *, curr) { - tmp = curr; - /* Remove it from the list */ - SMARTLIST_DEL_CURRENT(finished_listeners, curr); - /* Also unregister it */ - channel_listener_unregister(tmp); - /* ... and free it */ - channel_listener_free(tmp); - } SMARTLIST_FOREACH_END(curr); -} - -/** - * Free a list of channels for channel_free_all() - */ - -static void -channel_free_list(smartlist_t *channels, int mark_for_close) -{ - if (!channels) return; - - SMARTLIST_FOREACH_BEGIN(channels, channel_t *, curr) { - /* Deregister and free it */ - tor_assert(curr); - log_debug(LD_CHANNEL, - "Cleaning up channel %p (global ID " U64_FORMAT ") " - "in state %s (%d)", - curr, U64_PRINTF_ARG(curr->global_identifier), - channel_state_to_string(curr->state), curr->state); - /* Detach circuits early so they can find the channel */ - if (curr->cmux) { - circuitmux_detach_all_circuits(curr->cmux); - } - channel_unregister(curr); - if (mark_for_close) { - if (!(curr->state == CHANNEL_STATE_CLOSING || - curr->state == CHANNEL_STATE_CLOSED || - curr->state == CHANNEL_STATE_ERROR)) { - channel_mark_for_close(curr); - } - channel_force_free(curr); - } else channel_free(curr); - } SMARTLIST_FOREACH_END(curr); -} - -/** - * Free a list of channel listeners for channel_free_all() - */ - -static void -channel_listener_free_list(smartlist_t *listeners, int mark_for_close) -{ - if (!listeners) return; - - SMARTLIST_FOREACH_BEGIN(listeners, channel_listener_t *, curr) { - /* Deregister and free it */ - tor_assert(curr); - log_debug(LD_CHANNEL, - "Cleaning up channel listener %p (global ID " U64_FORMAT ") " - "in state %s (%d)", - curr, U64_PRINTF_ARG(curr->global_identifier), - channel_listener_state_to_string(curr->state), curr->state); - channel_listener_unregister(curr); - if (mark_for_close) { - if (!(curr->state == CHANNEL_LISTENER_STATE_CLOSING || - curr->state == CHANNEL_LISTENER_STATE_CLOSED || - curr->state == CHANNEL_LISTENER_STATE_ERROR)) { - channel_listener_mark_for_close(curr); - } - channel_listener_force_free(curr); - } else channel_listener_free(curr); - } SMARTLIST_FOREACH_END(curr); -} - -/** - * Close all channels and free everything - * - * This gets called from tor_free_all() in onion_main.c to clean up on exit. - * It will close all registered channels and free associated storage, - * then free the all_channels, active_channels, listening_channels and - * finished_channels lists and also channel_identity_map. - */ - -void -channel_free_all(void) -{ - log_debug(LD_CHANNEL, - "Shutting down channels..."); - - /* First, let's go for finished channels */ - if (finished_channels) { - channel_free_list(finished_channels, 0); - smartlist_free(finished_channels); - finished_channels = NULL; - } - - /* Now the finished listeners */ - if (finished_listeners) { - channel_listener_free_list(finished_listeners, 0); - smartlist_free(finished_listeners); - finished_listeners = NULL; - } - - /* Now all active channels */ - if (active_channels) { - channel_free_list(active_channels, 1); - smartlist_free(active_channels); - active_channels = NULL; - } - - /* Now all active listeners */ - if (active_listeners) { - channel_listener_free_list(active_listeners, 1); - smartlist_free(active_listeners); - active_listeners = NULL; - } - - /* Now all channels, in case any are left over */ - if (all_channels) { - channel_free_list(all_channels, 1); - smartlist_free(all_channels); - all_channels = NULL; - } - - /* Now all listeners, in case any are left over */ - if (all_listeners) { - channel_listener_free_list(all_listeners, 1); - smartlist_free(all_listeners); - all_listeners = NULL; - } - - /* Now free channel_identity_map */ - log_debug(LD_CHANNEL, - "Freeing channel_identity_map"); - /* Geez, anything still left over just won't die ... let it leak then */ - HT_CLEAR(channel_idmap, &channel_identity_map); - - log_debug(LD_CHANNEL, - "Done cleaning up after channels"); -} - -/** - * Connect to a given addr/port/digest - * - * This sets up a new outgoing channel; in the future if multiple - * channel_t subclasses are available, this is where the selection policy - * should go. It may also be desirable to fold port into tor_addr_t - * or make a new type including a tor_addr_t and port, so we have a - * single abstract object encapsulating all the protocol details of - * how to contact an OR. - */ - -channel_t * -channel_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest) -{ - return channel_tls_connect(addr, port, id_digest); -} - -/** - * Decide which of two channels to prefer for extending a circuit - * - * This function is called while extending a circuit and returns true iff - * a is 'better' than b. The most important criterion here is that a - * canonical channel is always better than a non-canonical one, but the - * number of circuits and the age are used as tie-breakers. - * - * This is based on the former connection_or_is_better() of connection_or.c - */ - -int -channel_is_better(time_t now, channel_t *a, channel_t *b, - int forgive_new_connections) -{ - int a_grace, b_grace; - int a_is_canonical, b_is_canonical; - int a_has_circs, b_has_circs; - - /* - * Do not definitively deprecate a new channel with no circuits on it - * until this much time has passed. - */ -#define NEW_CHAN_GRACE_PERIOD (15*60) - - tor_assert(a); - tor_assert(b); - - /* Check if one is canonical and the other isn't first */ - a_is_canonical = channel_is_canonical(a); - b_is_canonical = channel_is_canonical(b); - - if (a_is_canonical && !b_is_canonical) return 1; - if (!a_is_canonical && b_is_canonical) return 0; - - /* - * Okay, if we're here they tied on canonicity. Next we check if - * they have any circuits, and if one does and the other doesn't, - * we prefer the one that does, unless we are forgiving and the - * one that has no circuits is in its grace period. - */ - - a_has_circs = (channel_num_circuits(a) > 0); - b_has_circs = (channel_num_circuits(b) > 0); - a_grace = (forgive_new_connections && - (now < channel_when_created(a) + NEW_CHAN_GRACE_PERIOD)); - b_grace = (forgive_new_connections && - (now < channel_when_created(b) + NEW_CHAN_GRACE_PERIOD)); - - if (a_has_circs && !b_has_circs && !b_grace) return 1; - if (!a_has_circs && b_has_circs && !a_grace) return 0; - - /* They tied on circuits too; just prefer whichever is newer */ - - if (channel_when_created(a) > channel_when_created(b)) return 1; - else return 0; -} - -/** - * Get a channel to extend a circuit - * - * Pick a suitable channel to extend a circuit to given the desired digest - * the address we believe is correct for that digest; this tries to see - * if we already have one for the requested endpoint, but if there is no good - * channel, set *msg_out to a message describing the channel's state - * and our next action, and set *launch_out to a boolean indicated whether - * the caller should try to launch a new channel with channel_connect(). - */ - -channel_t * -channel_get_for_extend(const char *digest, - const tor_addr_t *target_addr, - const char **msg_out, - int *launch_out) -{ - channel_t *chan, *best = NULL; - int n_inprogress_goodaddr = 0, n_old = 0; - int n_noncanonical = 0, n_possible = 0; - time_t now = approx_time(); - - tor_assert(msg_out); - tor_assert(launch_out); - - chan = channel_find_by_remote_digest(digest); - - /* Walk the list, unrefing the old one and refing the new at each - * iteration. - */ - for (; chan; chan = channel_next_with_digest(chan)) { - tor_assert(tor_memeq(chan->identity_digest, - digest, DIGEST_LEN)); - - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) - continue; - - /* Never return a channel on which the other end appears to be - * a client. */ - if (channel_is_client(chan)) { - continue; - } - - /* Never return a non-open connection. */ - if (chan->state != CHANNEL_STATE_OPEN) { - /* If the address matches, don't launch a new connection for this - * circuit. */ - if (channel_matches_target_addr_for_extend(chan, target_addr)) - ++n_inprogress_goodaddr; - continue; - } - - /* Never return a connection that shouldn't be used for circs. */ - if (channel_is_bad_for_new_circs(chan)) { - ++n_old; - continue; - } - - /* Never return a non-canonical connection using a recent link protocol - * if the address is not what we wanted. - * - * The channel_is_canonical_is_reliable() function asks the lower layer - * if we should trust channel_is_canonical(). The below is from the - * comments of the old circuit_or_get_for_extend() and applies when - * the lower-layer transport is channel_tls_t. - * - * (For old link protocols, we can't rely on is_canonical getting - * set properly if we're talking to the right address, since we might - * have an out-of-date descriptor, and we will get no NETINFO cell to - * tell us about the right address.) - */ - if (!channel_is_canonical(chan) && - channel_is_canonical_is_reliable(chan) && - !channel_matches_target_addr_for_extend(chan, target_addr)) { - ++n_noncanonical; - continue; - } - - ++n_possible; - - if (!best) { - best = chan; /* If we have no 'best' so far, this one is good enough. */ - continue; - } - - if (channel_is_better(now, chan, best, 0)) - best = chan; - } - - if (best) { - *msg_out = "Connection is fine; using it."; - *launch_out = 0; - return best; - } else if (n_inprogress_goodaddr) { - *msg_out = "Connection in progress; waiting."; - *launch_out = 0; - return NULL; - } else if (n_old || n_noncanonical) { - *msg_out = "Connections all too old, or too non-canonical. " - " Launching a new one."; - *launch_out = 1; - return NULL; - } else { - *msg_out = "Not connected. Connecting."; - *launch_out = 1; - return NULL; - } -} - -/** - * Describe the transport subclass for a channel - * - * Invoke a method to get a string description of the lower-layer - * transport for this channel. - */ - -const char * -channel_describe_transport(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->describe_transport); - - return chan->describe_transport(chan); -} - -/** - * Describe the transport subclass for a channel listener - * - * Invoke a method to get a string description of the lower-layer - * transport for this channel listener. - */ - -const char * -channel_listener_describe_transport(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - tor_assert(chan_l->describe_transport); - - return chan_l->describe_transport(chan_l); -} - -/** - * Return the number of entries in queue - */ -static int -chan_cell_queue_len(const chan_cell_queue_t *queue) -{ - int r = 0; - cell_queue_entry_t *cell; - TOR_SIMPLEQ_FOREACH(cell, queue, next) - ++r; - return r; -} - -/** - * Dump channel statistics - * - * Dump statistics for one channel to the log - */ - -void -channel_dump_statistics(channel_t *chan, int severity) -{ - double avg, interval, age; - time_t now = time(NULL); - tor_addr_t remote_addr; - int have_remote_addr; - char *remote_addr_str; - - tor_assert(chan); - - age = (double)(now - chan->timestamp_created); - - tor_log(severity, LD_GENERAL, - "Channel " U64_FORMAT " (at %p) with transport %s is in state " - "%s (%d)", - U64_PRINTF_ARG(chan->global_identifier), chan, - channel_describe_transport(chan), - channel_state_to_string(chan->state), chan->state); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " was created at " U64_FORMAT - " (" U64_FORMAT " seconds ago) " - "and last active at " U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->timestamp_created), - U64_PRINTF_ARG(now - chan->timestamp_created), - U64_PRINTF_ARG(chan->timestamp_active), - U64_PRINTF_ARG(now - chan->timestamp_active)); - - /* Handle digest and nickname */ - if (!tor_digest_is_zero(chan->identity_digest)) { - if (chan->nickname) { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " says it is connected " - "to an OR with digest %s and nickname %s", - U64_PRINTF_ARG(chan->global_identifier), - hex_str(chan->identity_digest, DIGEST_LEN), - chan->nickname); - } else { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " says it is connected " - "to an OR with digest %s and no known nickname", - U64_PRINTF_ARG(chan->global_identifier), - hex_str(chan->identity_digest, DIGEST_LEN)); - } - } else { - if (chan->nickname) { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " does not know the digest" - " of the OR it is connected to, but reports its nickname is %s", - U64_PRINTF_ARG(chan->global_identifier), - chan->nickname); - } else { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " does not know the digest" - " or the nickname of the OR it is connected to", - U64_PRINTF_ARG(chan->global_identifier)); - } - } - - /* Handle remote address and descriptions */ - have_remote_addr = channel_get_addr_if_possible(chan, &remote_addr); - if (have_remote_addr) { - char *actual = tor_strdup(channel_get_actual_remote_descr(chan)); - remote_addr_str = tor_dup_addr(&remote_addr); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " says its remote address" - " is %s, and gives a canonical description of \"%s\" and an " - "actual description of \"%s\"", - U64_PRINTF_ARG(chan->global_identifier), - remote_addr_str, - channel_get_canonical_remote_descr(chan), - actual); - tor_free(remote_addr_str); - tor_free(actual); - } else { - char *actual = tor_strdup(channel_get_actual_remote_descr(chan)); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " does not know its remote " - "address, but gives a canonical description of \"%s\" and an " - "actual description of \"%s\"", - U64_PRINTF_ARG(chan->global_identifier), - channel_get_canonical_remote_descr(chan), - actual); - tor_free(actual); - } - - /* Handle marks */ - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has these marks: %s %s %s " - "%s %s %s", - U64_PRINTF_ARG(chan->global_identifier), - channel_is_bad_for_new_circs(chan) ? - "bad_for_new_circs" : "!bad_for_new_circs", - channel_is_canonical(chan) ? - "canonical" : "!canonical", - channel_is_canonical_is_reliable(chan) ? - "is_canonical_is_reliable" : - "!is_canonical_is_reliable", - channel_is_client(chan) ? - "client" : "!client", - channel_is_local(chan) ? - "local" : "!local", - channel_is_incoming(chan) ? - "incoming" : "outgoing"); - - /* Describe queues */ - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has %d queued incoming cells" - " and %d queued outgoing cells", - U64_PRINTF_ARG(chan->global_identifier), - chan_cell_queue_len(&chan->incoming_queue), - chan_cell_queue_len(&chan->outgoing_queue)); - - /* Describe circuits */ - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has %d active circuits out of" - " %d in total", - U64_PRINTF_ARG(chan->global_identifier), - (chan->cmux != NULL) ? - circuitmux_num_active_circuits(chan->cmux) : 0, - (chan->cmux != NULL) ? - circuitmux_num_circuits(chan->cmux) : 0); - - /* Describe timestamps */ - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " was last used by a " - "client at " U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->timestamp_client), - U64_PRINTF_ARG(now - chan->timestamp_client)); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " was last drained at " - U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->timestamp_drained), - U64_PRINTF_ARG(now - chan->timestamp_drained)); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " last received a cell " - "at " U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->timestamp_recv), - U64_PRINTF_ARG(now - chan->timestamp_recv)); - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " last trasmitted a cell " - "at " U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->timestamp_xmit), - U64_PRINTF_ARG(now - chan->timestamp_xmit)); - - /* Describe counters and rates */ - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has received " - U64_FORMAT " cells and transmitted " U64_FORMAT, - U64_PRINTF_ARG(chan->global_identifier), - U64_PRINTF_ARG(chan->n_cells_recved), - U64_PRINTF_ARG(chan->n_cells_xmitted)); - if (now > chan->timestamp_created && - chan->timestamp_created > 0) { - if (chan->n_cells_recved > 0) { - avg = (double)(chan->n_cells_recved) / age; - if (avg >= 1.0) { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "cells received per second", - U64_PRINTF_ARG(chan->global_identifier), avg); - } else if (avg >= 0.0) { - interval = 1.0 / avg; - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "seconds between received cells", - U64_PRINTF_ARG(chan->global_identifier), interval); - } - } - if (chan->n_cells_xmitted > 0) { - avg = (double)(chan->n_cells_xmitted) / age; - if (avg >= 1.0) { - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "cells transmitted per second", - U64_PRINTF_ARG(chan->global_identifier), avg); - } else if (avg >= 0.0) { - interval = 1.0 / avg; - tor_log(severity, LD_GENERAL, - " * Channel " U64_FORMAT " has averaged %f " - "seconds between transmitted cells", - U64_PRINTF_ARG(chan->global_identifier), interval); - } - } - } - - /* Dump anything the lower layer has to say */ - channel_dump_transport_statistics(chan, severity); -} - -/** - * Dump channel listener statistics - * - * Dump statistics for one channel listener to the log - */ - -void -channel_listener_dump_statistics(channel_listener_t *chan_l, int severity) -{ - double avg, interval, age; - time_t now = time(NULL); - - tor_assert(chan_l); - - age = (double)(now - chan_l->timestamp_created); - - tor_log(severity, LD_GENERAL, - "Channel listener " U64_FORMAT " (at %p) with transport %s is in " - "state %s (%d)", - U64_PRINTF_ARG(chan_l->global_identifier), chan_l, - channel_listener_describe_transport(chan_l), - channel_listener_state_to_string(chan_l->state), chan_l->state); - tor_log(severity, LD_GENERAL, - " * Channel listener " U64_FORMAT " was created at " U64_FORMAT - " (" U64_FORMAT " seconds ago) " - "and last active at " U64_FORMAT " (" U64_FORMAT " seconds ago)", - U64_PRINTF_ARG(chan_l->global_identifier), - U64_PRINTF_ARG(chan_l->timestamp_created), - U64_PRINTF_ARG(now - chan_l->timestamp_created), - U64_PRINTF_ARG(chan_l->timestamp_active), - U64_PRINTF_ARG(now - chan_l->timestamp_active)); - - tor_log(severity, LD_GENERAL, - " * Channel listener " U64_FORMAT " last accepted an incoming " - "channel at " U64_FORMAT " (" U64_FORMAT " seconds ago) " - "and has accepted " U64_FORMAT " channels in total", - U64_PRINTF_ARG(chan_l->global_identifier), - U64_PRINTF_ARG(chan_l->timestamp_accepted), - U64_PRINTF_ARG(now - chan_l->timestamp_accepted), - U64_PRINTF_ARG(chan_l->n_accepted)); - - /* - * If it's sensible to do so, get the rate of incoming channels on this - * listener - */ - if (now > chan_l->timestamp_created && - chan_l->timestamp_created > 0 && - chan_l->n_accepted > 0) { - avg = (double)(chan_l->n_accepted) / age; - if (avg >= 1.0) { - tor_log(severity, LD_GENERAL, - " * Channel listener " U64_FORMAT " has averaged %f incoming " - "channels per second", - U64_PRINTF_ARG(chan_l->global_identifier), avg); - } else if (avg >= 0.0) { - interval = 1.0 / avg; - tor_log(severity, LD_GENERAL, - " * Channel listener " U64_FORMAT " has averaged %f seconds " - "between incoming channels", - U64_PRINTF_ARG(chan_l->global_identifier), interval); - } - } - - /* Dump anything the lower layer has to say */ - channel_listener_dump_transport_statistics(chan_l, severity); -} - -/** - * Invoke transport-specific stats dump for channel - * - * If there is a lower-layer statistics dump method, invoke it - */ - -void -channel_dump_transport_statistics(channel_t *chan, int severity) -{ - tor_assert(chan); - - if (chan->dumpstats) chan->dumpstats(chan, severity); -} - -/** - * Invoke transport-specific stats dump for channel listener - * - * If there is a lower-layer statistics dump method, invoke it - */ - -void -channel_listener_dump_transport_statistics(channel_listener_t *chan_l, - int severity) -{ - tor_assert(chan_l); - - if (chan_l->dumpstats) chan_l->dumpstats(chan_l, severity); -} - -/** - * Return text description of the remote endpoint - * - * This function return a test provided by the lower layer of the remote - * endpoint for this channel; it should specify the actual address connected - * to/from. - * - * Subsequent calls to channel_get_{actual,canonical}_remote_{address,descr} - * may invalidate the return value from this function. - */ -const char * -channel_get_actual_remote_descr(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->get_remote_descr); - - /* Param 1 indicates the actual description */ - return chan->get_remote_descr(chan, GRD_FLAG_ORIGINAL); -} - -/** - * Return the text address of the remote endpoint. - * - * Subsequent calls to channel_get_{actual,canonical}_remote_{address,descr} - * may invalidate the return value from this function. - */ -const char * -channel_get_actual_remote_address(channel_t *chan) -{ - /* Param 1 indicates the actual description */ - return chan->get_remote_descr(chan, GRD_FLAG_ORIGINAL|GRD_FLAG_ADDR_ONLY); -} - -/** - * Return text description of the remote endpoint canonical address - * - * This function return a test provided by the lower layer of the remote - * endpoint for this channel; it should use the known canonical address for - * this OR's identity digest if possible. - * - * Subsequent calls to channel_get_{actual,canonical}_remote_{address,descr} - * may invalidate the return value from this function. - */ -const char * -channel_get_canonical_remote_descr(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->get_remote_descr); - - /* Param 0 indicates the canonicalized description */ - return chan->get_remote_descr(chan, 0); -} - -/** - * Get remote address if possible. - * - * Write the remote address out to a tor_addr_t if the underlying transport - * supports this operation, and return 1. Return 0 if the underlying transport - * doesn't let us do this. - */ -int -channel_get_addr_if_possible(channel_t *chan, tor_addr_t *addr_out) -{ - tor_assert(chan); - tor_assert(addr_out); - - if (chan->get_remote_addr) - return chan->get_remote_addr(chan, addr_out); - /* Else no support, method not implemented */ - else return 0; -} - -/** - * Check if there are outgoing queue writes on this channel - * - * Indicate if either we have queued cells, or if not, whether the underlying - * lower-layer transport thinks it has an output queue. - */ - -int -channel_has_queued_writes(channel_t *chan) -{ - int has_writes = 0; - - tor_assert(chan); - tor_assert(chan->has_queued_writes); - - if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue)) { - has_writes = 1; - } else { - /* Check with the lower layer */ - has_writes = chan->has_queued_writes(chan); - } - - return has_writes; -} - -/** - * Check the is_bad_for_new_circs flag - * - * This function returns the is_bad_for_new_circs flag of the specified - * channel. - */ - -int -channel_is_bad_for_new_circs(channel_t *chan) -{ - tor_assert(chan); - - return chan->is_bad_for_new_circs; -} - -/** - * Mark a channel as bad for new circuits - * - * Set the is_bad_for_new_circs_flag on chan. - */ - -void -channel_mark_bad_for_new_circs(channel_t *chan) -{ - tor_assert(chan); - - chan->is_bad_for_new_circs = 1; -} - -/** - * Get the client flag - * - * This returns the client flag of a channel, which will be set if - * command_process_create_cell() in command.c thinks this is a connection - * from a client. - */ - -int -channel_is_client(channel_t *chan) -{ - tor_assert(chan); - - return chan->is_client; -} - -/** - * Set the client flag - * - * Mark a channel as being from a client - */ - -void -channel_mark_client(channel_t *chan) -{ - tor_assert(chan); - - chan->is_client = 1; -} - -/** - * Get the canonical flag for a channel - * - * This returns the is_canonical for a channel; this flag is determined by - * the lower layer and can't be set in a transport-independent way. - */ - -int -channel_is_canonical(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->is_canonical); - - return chan->is_canonical(chan, 0); -} - -/** - * Test if the canonical flag is reliable - * - * This function asks if the lower layer thinks it's safe to trust the - * result of channel_is_canonical() - */ - -int -channel_is_canonical_is_reliable(channel_t *chan) -{ - tor_assert(chan); - tor_assert(chan->is_canonical); - - return chan->is_canonical(chan, 1); -} - -/** - * Test incoming flag - * - * This function gets the incoming flag; this is set when a listener spawns - * a channel. If this returns true the channel was remotely initiated. - */ - -int -channel_is_incoming(channel_t *chan) -{ - tor_assert(chan); - - return chan->is_incoming; -} - -/** - * Set the incoming flag - * - * This function is called when a channel arrives on a listening channel - * to mark it as incoming. - */ - -void -channel_mark_incoming(channel_t *chan) -{ - tor_assert(chan); - - chan->is_incoming = 1; -} - -/** - * Test local flag - * - * This function gets the local flag; the lower layer should set this when - * setting up the channel if is_local_addr() is true for all of the - * destinations it will communicate with on behalf of this channel. It's - * used to decide whether to declare the network reachable when seeing incoming - * traffic on the channel. - */ - -int -channel_is_local(channel_t *chan) -{ - tor_assert(chan); - - return chan->is_local; -} - -/** - * Set the local flag - * - * This internal-only function should be called by the lower layer if the - * channel is to a local address. See channel_is_local() above or the - * description of the is_local bit in channel.h - */ - -void -channel_mark_local(channel_t *chan) -{ - tor_assert(chan); - - chan->is_local = 1; -} - -/** - * Test outgoing flag - * - * This function gets the outgoing flag; this is the inverse of the incoming - * bit set when a listener spawns a channel. If this returns true the channel - * was locally initiated. - */ - -int -channel_is_outgoing(channel_t *chan) -{ - tor_assert(chan); - - return !(chan->is_incoming); -} - -/** - * Mark a channel as outgoing - * - * This function clears the incoming flag and thus marks a channel as - * outgoing. - */ - -void -channel_mark_outgoing(channel_t *chan) -{ - tor_assert(chan); - - chan->is_incoming = 0; -} - -/********************* - * Timestamp updates * - ********************/ - -/** - * Update the created timestamp for a channel - * - * This updates the channel's created timestamp and should only be called - * from channel_init(). - */ - -void -channel_timestamp_created(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_created = now; -} - -/** - * Update the created timestamp for a channel listener - * - * This updates the channel listener's created timestamp and should only be - * called from channel_init_listener(). - */ - -void -channel_listener_timestamp_created(channel_listener_t *chan_l) -{ - time_t now = time(NULL); - - tor_assert(chan_l); - - chan_l->timestamp_created = now; -} - -/** - * Update the last active timestamp for a channel - * - * This function updates the channel's last active timestamp; it should be - * called by the lower layer whenever there is activity on the channel which - * does not lead to a cell being transmitted or received; the active timestamp - * is also updated from channel_timestamp_recv() and channel_timestamp_xmit(), - * but it should be updated for things like the v3 handshake and stuff that - * produce activity only visible to the lower layer. - */ - -void -channel_timestamp_active(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_active = now; -} - -/** - * Update the last active timestamp for a channel listener - */ - -void -channel_listener_timestamp_active(channel_listener_t *chan_l) -{ - time_t now = time(NULL); - - tor_assert(chan_l); - - chan_l->timestamp_active = now; -} - -/** - * Update the last accepted timestamp. - * - * This function updates the channel listener's last accepted timestamp; it - * should be called whenever a new incoming channel is accepted on a - * listener. - */ - -void -channel_listener_timestamp_accepted(channel_listener_t *chan_l) -{ - time_t now = time(NULL); - - tor_assert(chan_l); - - chan_l->timestamp_active = now; - chan_l->timestamp_accepted = now; -} - -/** - * Update client timestamp - * - * This function is called by relay.c to timestamp a channel that appears to - * be used as a client. - */ - -void -channel_timestamp_client(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_client = now; -} - -/** - * Update the last drained timestamp - * - * This is called whenever we transmit a cell which leaves the outgoing cell - * queue completely empty. It also updates the xmit time and the active time. - */ - -void -channel_timestamp_drained(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_active = now; - chan->timestamp_drained = now; - chan->timestamp_xmit = now; -} - -/** - * Update the recv timestamp - * - * This is called whenever we get an incoming cell from the lower layer. - * This also updates the active timestamp. - */ - -void -channel_timestamp_recv(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_active = now; - chan->timestamp_recv = now; -} - -/** - * Update the xmit timestamp - * This is called whenever we pass an outgoing cell to the lower layer. This - * also updates the active timestamp. - */ - -void -channel_timestamp_xmit(channel_t *chan) -{ - time_t now = time(NULL); - - tor_assert(chan); - - chan->timestamp_active = now; - chan->timestamp_xmit = now; -} - -/*************************************************************** - * Timestamp queries - see above for definitions of timestamps * - **************************************************************/ - -/** - * Query created timestamp for a channel - */ - -time_t -channel_when_created(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_created; -} - -/** - * Query created timestamp for a channel listener - */ - -time_t -channel_listener_when_created(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - return chan_l->timestamp_created; -} - -/** - * Query last active timestamp for a channel - */ - -time_t -channel_when_last_active(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_active; -} - -/** - * Query last active timestamp for a channel listener - */ - -time_t -channel_listener_when_last_active(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - return chan_l->timestamp_active; -} - -/** - * Query last accepted timestamp for a channel listener - */ - -time_t -channel_listener_when_last_accepted(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - return chan_l->timestamp_accepted; -} - -/** - * Query client timestamp - */ - -time_t -channel_when_last_client(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_client; -} - -/** - * Query drained timestamp - */ - -time_t -channel_when_last_drained(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_drained; -} - -/** - * Query recv timestamp - */ - -time_t -channel_when_last_recv(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_recv; -} - -/** - * Query xmit timestamp - */ - -time_t -channel_when_last_xmit(channel_t *chan) -{ - tor_assert(chan); - - return chan->timestamp_xmit; -} - -/** - * Query accepted counter - */ - -uint64_t -channel_listener_count_accepted(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - return chan_l->n_accepted; -} - -/** - * Query received cell counter - */ - -uint64_t -channel_count_recved(channel_t *chan) -{ - tor_assert(chan); - - return chan->n_cells_recved; -} - -/** - * Query transmitted cell counter - */ - -uint64_t -channel_count_xmitted(channel_t *chan) -{ - tor_assert(chan); - - return chan->n_cells_xmitted; -} - -/** - * Check if a channel matches an extend_info_t - * - * This function calls the lower layer and asks if this channel matches a - * given extend_info_t. - */ - -int -channel_matches_extend_info(channel_t *chan, extend_info_t *extend_info) -{ - tor_assert(chan); - tor_assert(chan->matches_extend_info); - tor_assert(extend_info); - - return chan->matches_extend_info(chan, extend_info); -} - -/** - * Check if a channel matches a given target address; return true iff we do. - * - * This function calls into the lower layer and asks if this channel thinks - * it matches a given target address for circuit extension purposes. - */ - -int -channel_matches_target_addr_for_extend(channel_t *chan, - const tor_addr_t *target) -{ - tor_assert(chan); - tor_assert(chan->matches_target); - tor_assert(target); - - return chan->matches_target(chan, target); -} - -/** - * Return the total number of circuits used by a channel - * - * @param chan Channel to query - * @return Number of circuits using this as n_chan or p_chan - */ - -unsigned int -channel_num_circuits(channel_t *chan) -{ - tor_assert(chan); - - return chan->num_n_circuits + - chan->num_p_circuits; -} - -/** - * Set up circuit ID generation - * - * This is called when setting up a channel and replaces the old - * connection_or_set_circid_type() - */ -void -channel_set_circid_type(channel_t *chan, - crypto_pk_t *identity_rcvd, - int consider_identity) -{ - int started_here; - crypto_pk_t *our_identity; - - tor_assert(chan); - - started_here = channel_is_outgoing(chan); - - if (! consider_identity) { - if (started_here) - chan->circ_id_type = CIRC_ID_TYPE_HIGHER; - else - chan->circ_id_type = CIRC_ID_TYPE_LOWER; - return; - } - - our_identity = started_here ? - get_tlsclient_identity_key() : get_server_identity_key(); - - if (identity_rcvd) { - if (crypto_pk_cmp_keys(our_identity, identity_rcvd) < 0) { - chan->circ_id_type = CIRC_ID_TYPE_LOWER; - } else { - chan->circ_id_type = CIRC_ID_TYPE_HIGHER; - } - } else { - chan->circ_id_type = CIRC_ID_TYPE_NEITHER; - } -} - diff --git a/src/tor/channel.h b/src/tor/channel.h deleted file mode 100644 index a9ade3ff1..000000000 --- a/src/tor/channel.h +++ /dev/null @@ -1,489 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file channel.h - * \brief Header file for channel.c - **/ - -#ifndef TOR_CHANNEL_H -#define TOR_CHANNEL_H - -#include "or.h" -#include "circuitmux.h" - -/* Channel handler function pointer typedefs */ -typedef void (*channel_listener_fn_ptr)(channel_listener_t *, channel_t *); -typedef void (*channel_cell_handler_fn_ptr)(channel_t *, cell_t *); -typedef void (*channel_var_cell_handler_fn_ptr)(channel_t *, var_cell_t *); - -struct cell_queue_entry_s; -TOR_SIMPLEQ_HEAD(chan_cell_queue, cell_queue_entry_s) incoming_queue; -typedef struct chan_cell_queue chan_cell_queue_t; - -/* - * Channel struct; see the channel_t typedef in or.h. A channel is an - * abstract interface for the OR-to-OR connection, similar to connection_or_t, - * but without the strong coupling to the underlying TLS implementation. They - * are constructed by calling a protocol-specific function to open a channel - * to a particular node, and once constructed support the abstract operations - * defined below. - */ - -struct channel_s { - /* Magic number for type-checking cast macros */ - uint32_t magic; - - /* Current channel state */ - channel_state_t state; - - /* Globally unique ID number for a channel over the lifetime of a Tor - * process. - */ - uint64_t global_identifier; - - /* Should we expect to see this channel in the channel lists? */ - unsigned char registered:1; - - /** has this channel ever been open? */ - unsigned int has_been_open:1; - - /** Why did we close? - */ - enum { - CHANNEL_NOT_CLOSING = 0, - CHANNEL_CLOSE_REQUESTED, - CHANNEL_CLOSE_FROM_BELOW, - CHANNEL_CLOSE_FOR_ERROR - } reason_for_closing; - - /* Timestamps for both cell channels and listeners */ - time_t timestamp_created; /* Channel created */ - time_t timestamp_active; /* Any activity */ - - /* Methods implemented by the lower layer */ - - /* Free a channel */ - void (*free)(channel_t *); - /* Close an open channel */ - void (*close)(channel_t *); - /* Describe the transport subclass for this channel */ - const char * (*describe_transport)(channel_t *); - /* Optional method to dump transport-specific statistics on the channel */ - void (*dumpstats)(channel_t *, int); - - /* Registered handlers for incoming cells */ - channel_cell_handler_fn_ptr cell_handler; - channel_var_cell_handler_fn_ptr var_cell_handler; - - /* Methods implemented by the lower layer */ - - /* - * Ask the underlying transport what the remote endpoint address is, in - * a tor_addr_t. This is optional and subclasses may leave this NULL. - * If they implement it, they should write the address out to the - * provided tor_addr_t *, and return 1 if successful or 0 if no address - * available. - */ - int (*get_remote_addr)(channel_t *, tor_addr_t *); - int (*get_transport_name)(channel_t *chan, char **transport_out); - -#define GRD_FLAG_ORIGINAL 1 -#define GRD_FLAG_ADDR_ONLY 2 - /* - * Get a text description of the remote endpoint; canonicalized if the flag - * GRD_FLAG_ORIGINAL is not set, or the one we originally connected - * to/received from if it is. If GRD_FLAG_ADDR_ONLY is set, we return only - * the original address. - */ - const char * (*get_remote_descr)(channel_t *, int); - /* Check if the lower layer has queued writes */ - int (*has_queued_writes)(channel_t *); - /* - * If the second param is zero, ask the lower layer if this is - * 'canonical', for a transport-specific definition of canonical; if - * it is 1, ask if the answer to the preceding query is safe to rely - * on. - */ - int (*is_canonical)(channel_t *, int); - /* Check if this channel matches a specified extend_info_t */ - int (*matches_extend_info)(channel_t *, extend_info_t *); - /* Check if this channel matches a target address when extending */ - int (*matches_target)(channel_t *, const tor_addr_t *); - /* Write a cell to an open channel */ - int (*write_cell)(channel_t *, cell_t *); - /* Write a packed cell to an open channel */ - int (*write_packed_cell)(channel_t *, packed_cell_t *); - /* Write a variable-length cell to an open channel */ - int (*write_var_cell)(channel_t *, var_cell_t *); - - /* - * Hash of the public RSA key for the other side's identity key, or - * zeroes if the other side hasn't shown us a valid identity key. - */ - char identity_digest[DIGEST_LEN]; - /* Nickname of the OR on the other side, or NULL if none. */ - char *nickname; - - /* - * Linked list of channels with the same identity digest, for the - * digest->channel map - */ - TOR_LIST_ENTRY(channel_s) next_with_same_id; - - /* List of incoming cells to handle */ - chan_cell_queue_t incoming_queue; - - /* List of queued outgoing cells */ - chan_cell_queue_t outgoing_queue; - - /* Circuit mux for circuits sending on this channel */ - circuitmux_t *cmux; - - /* Circuit ID generation stuff for use by circuitbuild.c */ - - /* - * When we send CREATE cells along this connection, which half of the - * space should we use? - */ - ENUM_BF(circ_id_type_t) circ_id_type:2; - /** DOCDOC*/ - unsigned wide_circ_ids:1; - /* - * Which circ_id do we try to use next on this connection? This is - * always in the range 0..1<<15-1. - */ - circid_t next_circ_id; - - /* For how many circuits are we n_chan? What about p_chan? */ - unsigned int num_n_circuits, num_p_circuits; - - /* - * True iff this channel shouldn't get any new circs attached to it, - * because the connection is too old, or because there's a better one. - * More generally, this flag is used to note an unhealthy connection; - * for example, if a bad connection fails we shouldn't assume that the - * router itself has a problem. - */ - unsigned int is_bad_for_new_circs:1; - - /** True iff we have decided that the other end of this connection - * is a client. Channels with this flag set should never be used - * to satisfy an EXTEND request. */ - unsigned int is_client:1; - - /** Set if the channel was initiated remotely (came from a listener) */ - unsigned int is_incoming:1; - - /** Set by lower layer if this is local; i.e., everything it communicates - * with for this channel returns true for is_local_addr(). This is used - * to decide whether to declare reachability when we receive something on - * this channel in circuitbuild.c - */ - unsigned int is_local:1; - - /** Channel timestamps for cell channels */ - time_t timestamp_client; /* Client used this, according to relay.c */ - time_t timestamp_drained; /* Output queue empty */ - time_t timestamp_recv; /* Cell received from lower layer */ - time_t timestamp_xmit; /* Cell sent to lower layer */ - - /* Timestamp for relay.c */ - time_t timestamp_last_added_nonpadding; - - /** Unique ID for measuring direct network status requests;vtunneled ones - * come over a circuit_t, which has a dirreq_id field as well, but is a - * distinct namespace. */ - uint64_t dirreq_id; - - /** Channel counters for cell channels */ - uint64_t n_cells_recved; - uint64_t n_cells_xmitted; -}; - -struct channel_listener_s { - /* Current channel listener state */ - channel_listener_state_t state; - - /* Globally unique ID number for a channel over the lifetime of a Tor - * process. - */ - uint64_t global_identifier; - - /* Should we expect to see this channel in the channel lists? */ - unsigned char registered:1; - - /** Why did we close? - */ - enum { - CHANNEL_LISTENER_NOT_CLOSING = 0, - CHANNEL_LISTENER_CLOSE_REQUESTED, - CHANNEL_LISTENER_CLOSE_FROM_BELOW, - CHANNEL_LISTENER_CLOSE_FOR_ERROR - } reason_for_closing; - - /* Timestamps for both cell channels and listeners */ - time_t timestamp_created; /* Channel created */ - time_t timestamp_active; /* Any activity */ - - /* Methods implemented by the lower layer */ - - /* Free a channel */ - void (*free)(channel_listener_t *); - /* Close an open channel */ - void (*close)(channel_listener_t *); - /* Describe the transport subclass for this channel */ - const char * (*describe_transport)(channel_listener_t *); - /* Optional method to dump transport-specific statistics on the channel */ - void (*dumpstats)(channel_listener_t *, int); - - /* Registered listen handler to call on incoming connection */ - channel_listener_fn_ptr listener; - - /* List of pending incoming connections */ - smartlist_t *incoming_list; - - /* Timestamps for listeners */ - time_t timestamp_accepted; - - /* Counters for listeners */ - uint64_t n_accepted; -}; - -/* Channel state manipulations */ - -int channel_state_is_valid(channel_state_t state); -int channel_listener_state_is_valid(channel_listener_state_t state); - -int channel_state_can_transition(channel_state_t from, channel_state_t to); -int channel_listener_state_can_transition(channel_listener_state_t from, - channel_listener_state_t to); - -const char * channel_state_to_string(channel_state_t state); -const char * -channel_listener_state_to_string(channel_listener_state_t state); - -/* Abstract channel operations */ - -void channel_mark_for_close(channel_t *chan); -void channel_write_cell(channel_t *chan, cell_t *cell); -void channel_write_packed_cell(channel_t *chan, packed_cell_t *cell); -void channel_write_var_cell(channel_t *chan, var_cell_t *cell); - -void channel_listener_mark_for_close(channel_listener_t *chan_l); - -/* Channel callback registrations */ - -/* Listener callback */ -channel_listener_fn_ptr -channel_listener_get_listener_fn(channel_listener_t *chan); - -void channel_listener_set_listener_fn(channel_listener_t *chan, - channel_listener_fn_ptr listener); - -/* Incoming cell callbacks */ -channel_cell_handler_fn_ptr channel_get_cell_handler(channel_t *chan); - -channel_var_cell_handler_fn_ptr -channel_get_var_cell_handler(channel_t *chan); - -void channel_set_cell_handlers(channel_t *chan, - channel_cell_handler_fn_ptr cell_handler, - channel_var_cell_handler_fn_ptr - var_cell_handler); - -/* Clean up closed channels and channel listeners periodically; these are - * called from run_scheduled_events() in onion_main.c. - */ -void channel_run_cleanup(void); -void channel_listener_run_cleanup(void); - -/* Close all channels and deallocate everything */ -void channel_free_all(void); - -/* Dump some statistics in the log */ -void channel_dumpstats(int severity); -void channel_listener_dumpstats(int severity); - -/* Set the cmux policy on all active channels */ -void channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol); - -#ifdef TOR_CHANNEL_INTERNAL_ - -/* Channel operations for subclasses and internal use only */ - -/* Initialize a newly allocated channel - do this first in subclass - * constructors. - */ - -void channel_init(channel_t *chan); -void channel_init_listener(channel_listener_t *chan); - -/* Channel registration/unregistration */ -void channel_register(channel_t *chan); -void channel_unregister(channel_t *chan); - -/* Channel listener registration/unregistration */ -void channel_listener_register(channel_listener_t *chan_l); -void channel_listener_unregister(channel_listener_t *chan_l); - -/* Close from below */ -void channel_close_from_lower_layer(channel_t *chan); -void channel_close_for_error(channel_t *chan); -void channel_closed(channel_t *chan); - -void channel_listener_close_from_lower_layer(channel_listener_t *chan_l); -void channel_listener_close_for_error(channel_listener_t *chan_l); -void channel_listener_closed(channel_listener_t *chan_l); - -/* Free a channel */ -void channel_free(channel_t *chan); -void channel_listener_free(channel_listener_t *chan_l); - -/* State/metadata setters */ - -void channel_change_state(channel_t *chan, channel_state_t to_state); -void channel_clear_identity_digest(channel_t *chan); -void channel_clear_remote_end(channel_t *chan); -void channel_mark_local(channel_t *chan); -void channel_mark_incoming(channel_t *chan); -void channel_mark_outgoing(channel_t *chan); -void channel_set_identity_digest(channel_t *chan, - const char *identity_digest); -void channel_set_remote_end(channel_t *chan, - const char *identity_digest, - const char *nickname); - -void channel_listener_change_state(channel_listener_t *chan_l, - channel_listener_state_t to_state); - -/* Timestamp updates */ -void channel_timestamp_created(channel_t *chan); -void channel_timestamp_active(channel_t *chan); -void channel_timestamp_drained(channel_t *chan); -void channel_timestamp_recv(channel_t *chan); -void channel_timestamp_xmit(channel_t *chan); - -void channel_listener_timestamp_created(channel_listener_t *chan_l); -void channel_listener_timestamp_active(channel_listener_t *chan_l); -void channel_listener_timestamp_accepted(channel_listener_t *chan_l); - -/* Incoming channel handling */ -void channel_listener_process_incoming(channel_listener_t *listener); -void channel_listener_queue_incoming(channel_listener_t *listener, - channel_t *incoming); - -/* Incoming cell handling */ -void channel_process_cells(channel_t *chan); -void channel_queue_cell(channel_t *chan, cell_t *cell); -void channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell); - -/* Outgoing cell handling */ -void channel_flush_cells(channel_t *chan); - -/* Request from lower layer for more cells if available */ -ssize_t channel_flush_some_cells(channel_t *chan, ssize_t num_cells); - -/* Query if data available on this channel */ -int channel_more_to_flush(channel_t *chan); - -/* Notify flushed outgoing for dirreq handling */ -void channel_notify_flushed(channel_t *chan); - -/* Handle stuff we need to do on open like notifying circuits */ -void channel_do_open_actions(channel_t *chan); - -#endif - -/* Helper functions to perform operations on channels */ - -int channel_send_destroy(circid_t circ_id, channel_t *chan, - int reason); - -/* - * Outside abstract interfaces that should eventually get turned into - * something transport/address format independent. - */ - -channel_t * channel_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest); - -channel_t * channel_get_for_extend(const char *digest, - const tor_addr_t *target_addr, - const char **msg_out, - int *launch_out); - -/* Ask which of two channels is better for circuit-extension purposes */ -int channel_is_better(time_t now, - channel_t *a, channel_t *b, - int forgive_new_connections); - -/** Channel lookups - */ - -channel_t * channel_find_by_global_id(uint64_t global_identifier); -channel_t * channel_find_by_remote_digest(const char *identity_digest); - -/** For things returned by channel_find_by_remote_digest(), walk the list. - */ -channel_t * channel_next_with_digest(channel_t *chan); - -/* - * Metadata queries/updates - */ - -const char * channel_describe_transport(channel_t *chan); -void channel_dump_statistics(channel_t *chan, int severity); -void channel_dump_transport_statistics(channel_t *chan, int severity); -const char * channel_get_actual_remote_descr(channel_t *chan); -const char * channel_get_actual_remote_address(channel_t *chan); -int channel_get_addr_if_possible(channel_t *chan, tor_addr_t *addr_out); -const char * channel_get_canonical_remote_descr(channel_t *chan); -int channel_has_queued_writes(channel_t *chan); -int channel_is_bad_for_new_circs(channel_t *chan); -void channel_mark_bad_for_new_circs(channel_t *chan); -int channel_is_canonical(channel_t *chan); -int channel_is_canonical_is_reliable(channel_t *chan); -int channel_is_client(channel_t *chan); -int channel_is_local(channel_t *chan); -int channel_is_incoming(channel_t *chan); -int channel_is_outgoing(channel_t *chan); -void channel_mark_client(channel_t *chan); -int channel_matches_extend_info(channel_t *chan, extend_info_t *extend_info); -int channel_matches_target_addr_for_extend(channel_t *chan, - const tor_addr_t *target); -unsigned int channel_num_circuits(channel_t *chan); -void channel_set_circid_type(channel_t *chan, crypto_pk_t *identity_rcvd, - int consider_identity); -void channel_timestamp_client(channel_t *chan); - -const char * channel_listener_describe_transport(channel_listener_t *chan_l); -void channel_listener_dump_statistics(channel_listener_t *chan_l, - int severity); -void channel_listener_dump_transport_statistics(channel_listener_t *chan_l, - int severity); - -/* Timestamp queries */ -time_t channel_when_created(channel_t *chan); -time_t channel_when_last_active(channel_t *chan); -time_t channel_when_last_client(channel_t *chan); -time_t channel_when_last_drained(channel_t *chan); -time_t channel_when_last_recv(channel_t *chan); -time_t channel_when_last_xmit(channel_t *chan); - -time_t channel_listener_when_created(channel_listener_t *chan_l); -time_t channel_listener_when_last_active(channel_listener_t *chan_l); -time_t channel_listener_when_last_accepted(channel_listener_t *chan_l); - -/* Counter queries */ -uint64_t channel_count_recved(channel_t *chan); -uint64_t channel_count_xmitted(channel_t *chan); - -uint64_t channel_listener_count_accepted(channel_listener_t *chan_l); - -int packed_cell_is_destroy(channel_t *chan, - const packed_cell_t *packed_cell, - circid_t *circid_out); - -#endif - diff --git a/src/tor/channeltls.c b/src/tor/channeltls.c deleted file mode 100644 index 959ec4744..000000000 --- a/src/tor/channeltls.c +++ /dev/null @@ -1,2074 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file channeltls.c - * \brief channel_t concrete subclass using or_connection_t - **/ - -/* - * Define this so channel.h gives us things only channel_t subclasses - * should touch. - */ - -#define TOR_CHANNEL_INTERNAL_ - -#include "or.h" -#include "channel.h" -#include "channeltls.h" -#include "circuitmux.h" -#include "circuitmux_ewma.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "control.h" -#include "relay.h" -#include "router.h" -#include "routerlist.h" - -/** How many CELL_PADDING cells have we received, ever? */ -uint64_t stats_n_padding_cells_processed = 0; -/** How many CELL_VERSIONS cells have we received, ever? */ -uint64_t stats_n_versions_cells_processed = 0; -/** How many CELL_NETINFO cells have we received, ever? */ -uint64_t stats_n_netinfo_cells_processed = 0; -/** How many CELL_VPADDING cells have we received, ever? */ -uint64_t stats_n_vpadding_cells_processed = 0; -/** How many CELL_CERTS cells have we received, ever? */ -uint64_t stats_n_certs_cells_processed = 0; -/** How many CELL_AUTH_CHALLENGE cells have we received, ever? */ -uint64_t stats_n_auth_challenge_cells_processed = 0; -/** How many CELL_AUTHENTICATE cells have we received, ever? */ -uint64_t stats_n_authenticate_cells_processed = 0; -/** How many CELL_AUTHORIZE cells have we received, ever? */ -uint64_t stats_n_authorize_cells_processed = 0; - -/** Active listener, if any */ -channel_listener_t *channel_tls_listener = NULL; - -/* Utility function declarations */ -static void channel_tls_common_init(channel_tls_t *tlschan); - -/* channel_tls_t method declarations */ - -static void channel_tls_close_method(channel_t *chan); -static const char * channel_tls_describe_transport_method(channel_t *chan); -static void channel_tls_free_method(channel_t *chan); -static int -channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out); -static int -channel_tls_get_transport_name_method(channel_t *chan, char **transport_out); -static const char * -channel_tls_get_remote_descr_method(channel_t *chan, int flags); -static int channel_tls_has_queued_writes_method(channel_t *chan); -static int channel_tls_is_canonical_method(channel_t *chan, int req); -static int -channel_tls_matches_extend_info_method(channel_t *chan, - extend_info_t *extend_info); -static int channel_tls_matches_target_method(channel_t *chan, - const tor_addr_t *target); -static int channel_tls_write_cell_method(channel_t *chan, - cell_t *cell); -static int channel_tls_write_packed_cell_method(channel_t *chan, - packed_cell_t *packed_cell); -static int channel_tls_write_var_cell_method(channel_t *chan, - var_cell_t *var_cell); - -/* channel_listener_tls_t method declarations */ - -static void channel_tls_listener_close_method(channel_listener_t *chan_l); -static const char * -channel_tls_listener_describe_transport_method(channel_listener_t *chan_l); - -/** Handle incoming cells for the handshake stuff here rather than - * passing them on up. */ - -static void channel_tls_process_versions_cell(var_cell_t *cell, - channel_tls_t *tlschan); -static void channel_tls_process_netinfo_cell(cell_t *cell, - channel_tls_t *tlschan); -static void channel_tls_process_certs_cell(var_cell_t *cell, - channel_tls_t *tlschan); -static void channel_tls_process_auth_challenge_cell(var_cell_t *cell, - channel_tls_t *tlschan); -static void channel_tls_process_authenticate_cell(var_cell_t *cell, - channel_tls_t *tlschan); -static int command_allowed_before_handshake(uint8_t command); -static int enter_v3_handshake_with_cell(var_cell_t *cell, - channel_tls_t *tlschan); - -/** - * Do parts of channel_tls_t initialization common to channel_tls_connect() - * and channel_tls_handle_incoming(). - */ - -static void -channel_tls_common_init(channel_tls_t *tlschan) -{ - channel_t *chan; - - tor_assert(tlschan); - - chan = &(tlschan->base_); - channel_init(chan); - chan->magic = TLS_CHAN_MAGIC; - chan->state = CHANNEL_STATE_OPENING; - chan->close = channel_tls_close_method; - chan->describe_transport = channel_tls_describe_transport_method; - chan->free = channel_tls_free_method; - chan->get_remote_addr = channel_tls_get_remote_addr_method; - chan->get_remote_descr = channel_tls_get_remote_descr_method; - chan->get_transport_name = channel_tls_get_transport_name_method; - chan->has_queued_writes = channel_tls_has_queued_writes_method; - chan->is_canonical = channel_tls_is_canonical_method; - chan->matches_extend_info = channel_tls_matches_extend_info_method; - chan->matches_target = channel_tls_matches_target_method; - chan->write_cell = channel_tls_write_cell_method; - chan->write_packed_cell = channel_tls_write_packed_cell_method; - chan->write_var_cell = channel_tls_write_var_cell_method; - - chan->cmux = circuitmux_alloc(); - if (cell_ewma_enabled()) { - circuitmux_set_policy(chan->cmux, &ewma_policy); - } -} - -/** - * Start a new TLS channel - * - * Launch a new OR connection to addr:port and expect to - * handshake with an OR with identity digest id_digest, and wrap - * it in a channel_tls_t. - */ - -channel_t * -channel_tls_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest) -{ - channel_tls_t *tlschan = tor_malloc_zero(sizeof(*tlschan)); - channel_t *chan = &(tlschan->base_); - - channel_tls_common_init(tlschan); - - log_debug(LD_CHANNEL, - "In channel_tls_connect() for channel %p " - "(global id " U64_FORMAT ")", - tlschan, - U64_PRINTF_ARG(chan->global_identifier)); - - if (is_local_addr(addr)) channel_mark_local(chan); - channel_mark_outgoing(chan); - - /* Set up or_connection stuff */ - tlschan->conn = connection_or_connect(addr, port, id_digest, tlschan); - /* connection_or_connect() will fill in tlschan->conn */ - if (!(tlschan->conn)) { - chan->reason_for_closing = CHANNEL_CLOSE_FOR_ERROR; - channel_change_state(chan, CHANNEL_STATE_ERROR); - goto err; - } - - log_debug(LD_CHANNEL, - "Got orconn %p for channel with global id " U64_FORMAT, - tlschan->conn, U64_PRINTF_ARG(chan->global_identifier)); - - goto done; - - err: - circuitmux_free(chan->cmux); - tor_free(tlschan); - chan = NULL; - - done: - /* If we got one, we should register it */ - if (chan) channel_register(chan); - - return chan; -} - -/** - * Return the current channel_tls_t listener - * - * Returns the current channel listener for incoming TLS connections, or - * NULL if none has been established - */ - -channel_listener_t * -channel_tls_get_listener(void) -{ - return channel_tls_listener; -} - -/** - * Start a channel_tls_t listener if necessary - * - * Return the current channel_tls_t listener, or start one if we haven't yet, - * and return that. - */ - -channel_listener_t * -channel_tls_start_listener(void) -{ - channel_listener_t *listener; - - if (!channel_tls_listener) { - listener = tor_malloc_zero(sizeof(*listener)); - channel_init_listener(listener); - listener->state = CHANNEL_LISTENER_STATE_LISTENING; - listener->close = channel_tls_listener_close_method; - listener->describe_transport = - channel_tls_listener_describe_transport_method; - - channel_tls_listener = listener; - - log_debug(LD_CHANNEL, - "Starting TLS channel listener %p with global id " U64_FORMAT, - listener, U64_PRINTF_ARG(listener->global_identifier)); - - channel_listener_register(listener); - } else listener = channel_tls_listener; - - return listener; -} - -/** - * Free everything on shutdown - * - * Not much to do here, since channel_free_all() takes care of a lot, but let's - * get rid of the listener. - */ - -void -channel_tls_free_all(void) -{ - channel_listener_t *old_listener = NULL; - - log_debug(LD_CHANNEL, - "Shutting down TLS channels..."); - - if (channel_tls_listener) { - /* - * When we close it, channel_tls_listener will get nulled out, so save - * a pointer so we can free it. - */ - old_listener = channel_tls_listener; - log_debug(LD_CHANNEL, - "Closing channel_tls_listener with ID " U64_FORMAT - " at %p.", - U64_PRINTF_ARG(old_listener->global_identifier), - old_listener); - channel_listener_unregister(old_listener); - channel_listener_mark_for_close(old_listener); - channel_listener_free(old_listener); - tor_assert(channel_tls_listener == NULL); - } - - log_debug(LD_CHANNEL, - "Done shutting down TLS channels"); -} - -/** - * Create a new channel around an incoming or_connection_t - */ - -channel_t * -channel_tls_handle_incoming(or_connection_t *orconn) -{ - channel_tls_t *tlschan = tor_malloc_zero(sizeof(*tlschan)); - channel_t *chan = &(tlschan->base_); - - tor_assert(orconn); - tor_assert(!(orconn->chan)); - - channel_tls_common_init(tlschan); - - /* Link the channel and orconn to each other */ - tlschan->conn = orconn; - orconn->chan = tlschan; - - if (is_local_addr(&(TO_CONN(orconn)->addr))) channel_mark_local(chan); - channel_mark_incoming(chan); - - /* Register it */ - channel_register(chan); - - return chan; -} - -/********* - * Casts * - ********/ - -/** - * Cast a channel_tls_t to a channel_t. - */ - -channel_t * -channel_tls_to_base(channel_tls_t *tlschan) -{ - if (!tlschan) return NULL; - - return &(tlschan->base_); -} - -/** - * Cast a channel_t to a channel_tls_t, with appropriate type-checking - * asserts. - */ - -channel_tls_t * -channel_tls_from_base(channel_t *chan) -{ - if (!chan) return NULL; - - tor_assert(chan->magic == TLS_CHAN_MAGIC); - - return (channel_tls_t *)(chan); -} - -/******************************************** - * Method implementations for channel_tls_t * - *******************************************/ - -/** - * Close a channel_tls_t - * - * This implements the close method for channel_tls_t - */ - -static void -channel_tls_close_method(channel_t *chan) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - - if (tlschan->conn) connection_or_close_normally(tlschan->conn, 1); - else { - /* Weird - we'll have to change the state ourselves, I guess */ - log_info(LD_CHANNEL, - "Tried to close channel_tls_t %p with NULL conn", - tlschan); - channel_change_state(chan, CHANNEL_STATE_ERROR); - } -} - -/** - * Describe the transport for a channel_tls_t - * - * This returns the string "TLS channel on connection " to the upper - * layer. - */ - -static const char * -channel_tls_describe_transport_method(channel_t *chan) -{ - static char *buf = NULL; - uint64_t id; - channel_tls_t *tlschan; - const char *rv = NULL; - - tor_assert(chan); - - tlschan = BASE_CHAN_TO_TLS(chan); - - if (tlschan->conn) { - id = TO_CONN(tlschan->conn)->global_identifier; - - if (buf) tor_free(buf); - tor_asprintf(&buf, - "TLS channel (connection " U64_FORMAT ")", - U64_PRINTF_ARG(id)); - - rv = buf; - } else { - rv = "TLS channel (no connection)"; - } - - return rv; -} - -/** - * Free a channel_tls_t - * - * This is called by the generic channel layer when freeing a channel_tls_t; - * this happens either on a channel which has already reached - * CHANNEL_STATE_CLOSED or CHANNEL_STATE_ERROR from channel_run_cleanup() or - * on shutdown from channel_free_all(). In the latter case we might still - * have an orconn active (which connection_free_all() will get to later), - * so we should null out its channel pointer now. - */ - -static void -channel_tls_free_method(channel_t *chan) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - - if (tlschan->conn) { - tlschan->conn->chan = NULL; - tlschan->conn = NULL; - } -} - -/** - * Get the remote address of a channel_tls_t - * - * This implements the get_remote_addr method for channel_tls_t; copy the - * remote endpoint of the channel to addr_out and return 1 (always - * succeeds for this transport). - */ - -static int -channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out) -{ - int rv = 0; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(addr_out); - - if (tlschan->conn) { - tor_addr_copy(addr_out, &(TO_CONN(tlschan->conn)->addr)); - rv = 1; - } else tor_addr_make_unspec(addr_out); - - return rv; -} - -/** - * Get the name of the pluggable transport used by a channel_tls_t. - * - * This implements the get_transport_name for channel_tls_t. If the - * channel uses a pluggable transport, copy its name to - * transport_out and return 0. If the channel did not use a - * pluggable transport, return -1. */ - -static int -channel_tls_get_transport_name_method(channel_t *chan, char **transport_out) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(transport_out); - tor_assert(tlschan->conn); - - if (!tlschan->conn->ext_or_transport) - return -1; - - *transport_out = tor_strdup(tlschan->conn->ext_or_transport); - return 0; -} - -/** - * Get endpoint description of a channel_tls_t - * - * This implements the get_remote_descr method for channel_tls_t; it returns - * a text description of the remote endpoint of the channel suitable for use - * in log messages. The req parameter is 0 for the canonical address or 1 for - * the actual address seen. - */ - -static const char * -channel_tls_get_remote_descr_method(channel_t *chan, int flags) -{ -#define MAX_DESCR_LEN 32 - - static char buf[MAX_DESCR_LEN + 1]; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - connection_t *conn; - const char *answer = NULL; - char *addr_str; - - tor_assert(tlschan); - - if (tlschan->conn) { - conn = TO_CONN(tlschan->conn); - switch (flags) { - case 0: - /* Canonical address with port*/ - tor_snprintf(buf, MAX_DESCR_LEN + 1, - "%s:%u", conn->address, conn->port); - answer = buf; - break; - case GRD_FLAG_ORIGINAL: - /* Actual address with port */ - addr_str = tor_dup_addr(&(tlschan->conn->real_addr)); - tor_snprintf(buf, MAX_DESCR_LEN + 1, - "%s:%u", addr_str, conn->port); - tor_free(addr_str); - answer = buf; - break; - case GRD_FLAG_ADDR_ONLY: - /* Canonical address, no port */ - strlcpy(buf, conn->address, sizeof(buf)); - answer = buf; - break; - case GRD_FLAG_ORIGINAL|GRD_FLAG_ADDR_ONLY: - /* Actual address, no port */ - addr_str = tor_dup_addr(&(tlschan->conn->real_addr)); - strlcpy(buf, addr_str, sizeof(buf)); - tor_free(addr_str); - answer = buf; - break; - default: - /* Something's broken in channel.c */ - tor_assert(1); - } - } else { - strlcpy(buf, "(No connection)", sizeof(buf)); - answer = buf; - } - - return answer; -} - -/** - * Tell the upper layer if we have queued writes - * - * This implements the has_queued_writes method for channel_tls t_; it returns - * 1 iff we have queued writes on the outbuf of the underlying or_connection_t. - */ - -static int -channel_tls_has_queued_writes_method(channel_t *chan) -{ - size_t outbuf_len; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - if (!(tlschan->conn)) { - log_info(LD_CHANNEL, - "something called has_queued_writes on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - } - - outbuf_len = (tlschan->conn != NULL) ? - connection_get_outbuf_len(TO_CONN(tlschan->conn)) : - 0; - - return (outbuf_len > 0); -} - -/** - * Tell the upper layer if we're canonical - * - * This implements the is_canonical method for channel_tls_t; if req is zero, - * it returns whether this is a canonical channel, and if it is one it returns - * whether that can be relied upon. - */ - -static int -channel_tls_is_canonical_method(channel_t *chan, int req) -{ - int answer = 0; - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - - if (tlschan->conn) { - switch (req) { - case 0: - answer = tlschan->conn->is_canonical; - break; - case 1: - /* - * Is the is_canonical bit reliable? In protocols version 2 and up - * we get the canonical address from a NETINFO cell, but in older - * versions it might be based on an obsolete descriptor. - */ - answer = (tlschan->conn->link_proto >= 2); - break; - default: - /* This shouldn't happen; channel.c is broken if it does */ - tor_assert(1); - } - } - /* else return 0 for tlschan->conn == NULL */ - - return answer; -} - -/** - * Check if we match an extend_info_t - * - * This implements the matches_extend_info method for channel_tls_t; the upper - * layer wants to know if this channel matches an extend_info_t. - */ - -static int -channel_tls_matches_extend_info_method(channel_t *chan, - extend_info_t *extend_info) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(extend_info); - - /* Never match if we have no conn */ - if (!(tlschan->conn)) { - log_info(LD_CHANNEL, - "something called matches_extend_info on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - return 0; - } - - return (tor_addr_eq(&(extend_info->addr), - &(TO_CONN(tlschan->conn)->addr)) && - (extend_info->port == TO_CONN(tlschan->conn)->port)); -} - -/** - * Check if we match a target address; return true iff we do. - * - * This implements the matches_target method for channel_tls t_; the upper - * layer wants to know if this channel matches a target address when extending - * a circuit. - */ - -static int -channel_tls_matches_target_method(channel_t *chan, - const tor_addr_t *target) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - - tor_assert(tlschan); - tor_assert(target); - - /* Never match if we have no conn */ - if (!(tlschan->conn)) { - log_info(LD_CHANNEL, - "something called matches_target on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - return 0; - } - - return tor_addr_eq(&(tlschan->conn->real_addr), target); -} - -/** - * Write a cell to a channel_tls_t - * - * This implements the write_cell method for channel_tls_t; given a - * channel_tls_t and a cell_t, transmit the cell_t. - */ - -static int -channel_tls_write_cell_method(channel_t *chan, cell_t *cell) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - int written = 0; - - tor_assert(tlschan); - tor_assert(cell); - - if (tlschan->conn) { - connection_or_write_cell_to_buf(cell, tlschan->conn); - ++written; - } else { - log_info(LD_CHANNEL, - "something called write_cell on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - } - - return written; -} - -/** - * Write a packed cell to a channel_tls_t - * - * This implements the write_packed_cell method for channel_tls_t; given a - * channel_tls_t and a packed_cell_t, transmit the packed_cell_t. - */ - -static int -channel_tls_write_packed_cell_method(channel_t *chan, - packed_cell_t *packed_cell) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - size_t cell_network_size = get_cell_network_size(chan->wide_circ_ids); - int written = 0; - - tor_assert(tlschan); - tor_assert(packed_cell); - - if (tlschan->conn) { - connection_write_to_buf(packed_cell->body, cell_network_size, - TO_CONN(tlschan->conn)); - - /* This is where the cell is finished; used to be done from relay.c */ - packed_cell_free(packed_cell); - ++written; - } else { - log_info(LD_CHANNEL, - "something called write_packed_cell on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - } - - return written; -} - -/** - * Write a variable-length cell to a channel_tls_t - * - * This implements the write_var_cell method for channel_tls_t; given a - * channel_tls_t and a var_cell_t, transmit the var_cell_t. - */ - -static int -channel_tls_write_var_cell_method(channel_t *chan, var_cell_t *var_cell) -{ - channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); - int written = 0; - - tor_assert(tlschan); - tor_assert(var_cell); - - if (tlschan->conn) { - connection_or_write_var_cell_to_buf(var_cell, tlschan->conn); - ++written; - } else { - log_info(LD_CHANNEL, - "something called write_var_cell on a tlschan " - "(%p with ID " U64_FORMAT " but no conn", - chan, U64_PRINTF_ARG(chan->global_identifier)); - } - - return written; -} - -/************************************************* - * Method implementations for channel_listener_t * - ************************************************/ - -/** - * Close a channel_listener_t - * - * This implements the close method for channel_listener_t - */ - -static void -channel_tls_listener_close_method(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - /* - * Listeners we just go ahead and change state through to CLOSED, but - * make sure to check if they're channel_tls_listener to NULL it out. - */ - if (chan_l == channel_tls_listener) - channel_tls_listener = NULL; - - if (!(chan_l->state == CHANNEL_LISTENER_STATE_CLOSING || - chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR)) { - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSING); - } - - if (chan_l->incoming_list) { - SMARTLIST_FOREACH_BEGIN(chan_l->incoming_list, - channel_t *, ichan) { - channel_mark_for_close(ichan); - } SMARTLIST_FOREACH_END(ichan); - - smartlist_free(chan_l->incoming_list); - chan_l->incoming_list = NULL; - } - - if (!(chan_l->state == CHANNEL_LISTENER_STATE_CLOSED || - chan_l->state == CHANNEL_LISTENER_STATE_ERROR)) { - channel_listener_change_state(chan_l, CHANNEL_LISTENER_STATE_CLOSED); - } -} - -/** - * Describe the transport for a channel_listener_t - * - * This returns the string "TLS channel (listening)" to the upper - * layer. - */ - -static const char * -channel_tls_listener_describe_transport_method(channel_listener_t *chan_l) -{ - tor_assert(chan_l); - - return "TLS channel (listening)"; -} - -/******************************************************* - * Functions for handling events on an or_connection_t * - ******************************************************/ - -/** - * Handle an orconn state change - * - * This function will be called by connection_or.c when the or_connection_t - * associated with this channel_tls_t changes state. - */ - -void -channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, - or_connection_t *conn, - uint8_t old_state, - uint8_t state) -{ - channel_t *base_chan; - - tor_assert(chan); - tor_assert(conn); - tor_assert(conn->chan == chan); - tor_assert(chan->conn == conn); - /* -Werror appeasement */ - tor_assert(old_state == old_state); - - base_chan = TLS_CHAN_TO_BASE(chan); - - /* Make sure the base connection state makes sense - shouldn't be error, - * closed or listening. */ - - tor_assert(base_chan->state == CHANNEL_STATE_OPENING || - base_chan->state == CHANNEL_STATE_OPEN || - base_chan->state == CHANNEL_STATE_MAINT || - base_chan->state == CHANNEL_STATE_CLOSING); - - /* Did we just go to state open? */ - if (state == OR_CONN_STATE_OPEN) { - /* - * We can go to CHANNEL_STATE_OPEN from CHANNEL_STATE_OPENING or - * CHANNEL_STATE_MAINT on this. - */ - channel_change_state(base_chan, CHANNEL_STATE_OPEN); - } else { - /* - * Not open, so from CHANNEL_STATE_OPEN we go to CHANNEL_STATE_MAINT, - * otherwise no change. - */ - if (base_chan->state == CHANNEL_STATE_OPEN) { - channel_change_state(base_chan, CHANNEL_STATE_MAINT); - } - } -} - -/** - * Flush cells from a channel_tls_t - * - * Try to flush up to about num_cells cells, and return how many we flushed. - */ - -ssize_t -channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells) -{ - ssize_t flushed = 0; - - tor_assert(chan); - - if (flushed >= num_cells) goto done; - - /* - * If channel_tls_t ever buffers anything below the channel_t layer, flush - * that first here. - */ - - flushed += channel_flush_some_cells(TLS_CHAN_TO_BASE(chan), - num_cells - flushed); - - /* - * If channel_tls_t ever buffers anything below the channel_t layer, check - * how much we actually got and push it on down here. - */ - - done: - return flushed; -} - -/** - * Check if a channel_tls_t has anything to flush - * - * Return true if there is any more to flush on this channel (cells in queue - * or active circuits). - */ - -int -channel_tls_more_to_flush(channel_tls_t *chan) -{ - tor_assert(chan); - - /* - * If channel_tls_t ever buffers anything below channel_t, the - * check for that should go here first. - */ - - return channel_more_to_flush(TLS_CHAN_TO_BASE(chan)); -} - -#ifdef KEEP_TIMING_STATS - -/** - * Timing states wrapper - * - * This is a wrapper function around the actual function that processes the - * cell that just arrived on chan. Increment *time - * by the number of microseconds used by the call to *func(cell, chan). - */ - -static void -channel_tls_time_process_cell(cell_t *cell, channel_tls_t *chan, int *time, - void (*func)(cell_t *, channel_tls_t *)) -{ - struct timeval start, end; - long time_passed; - - tor_gettimeofday(&start); - - (*func)(cell, chan); - - tor_gettimeofday(&end); - time_passed = tv_udiff(&start, &end) ; - - if (time_passed > 10000) { /* more than 10ms */ - log_debug(LD_OR,"That call just took %ld ms.",time_passed/1000); - } - - if (time_passed < 0) { - log_info(LD_GENERAL,"That call took us back in time!"); - time_passed = 0; - } - - *time += time_passed; -} -#endif - -/** - * Handle an incoming cell on a channel_tls_t - * - * This is called from connection_or.c to handle an arriving cell; it checks - * for cell types specific to the handshake for this transport protocol and - * handles them, and queues all other cells to the channel_t layer, which - * eventually will hand them off to command.c. - */ - -void -channel_tls_handle_cell(cell_t *cell, or_connection_t *conn) -{ - channel_tls_t *chan; - int handshaking; - -#ifdef KEEP_TIMING_STATS -#define PROCESS_CELL(tp, cl, cn) STMT_BEGIN { \ - ++num ## tp; \ - channel_tls_time_process_cell(cl, cn, & tp ## time , \ - channel_tls_process_ ## tp ## _cell); \ - } STMT_END -#else -#define PROCESS_CELL(tp, cl, cn) channel_tls_process_ ## tp ## _cell(cl, cn) -#endif - - tor_assert(cell); - tor_assert(conn); - - chan = conn->chan; - - if (!chan) { - log_warn(LD_CHANNEL, - "Got a cell_t on an OR connection with no channel"); - return; - } - - handshaking = (TO_CONN(conn)->state != OR_CONN_STATE_OPEN); - - if (conn->base_.marked_for_close) - return; - - /* Reject all but VERSIONS and NETINFO when handshaking. */ - /* (VERSIONS should actually be impossible; it's variable-length.) */ - if (handshaking && cell->command != CELL_VERSIONS && - cell->command != CELL_NETINFO) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received unexpected cell command %d in chan state %s / " - "conn state %s; closing the connection.", - (int)cell->command, - channel_state_to_string(TLS_CHAN_TO_BASE(chan)->state), - conn_state_to_string(CONN_TYPE_OR, TO_CONN(conn)->state)); - connection_or_close_for_error(conn, 0); - return; - } - - if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) - or_handshake_state_record_cell(conn, conn->handshake_state, cell, 1); - - switch (cell->command) { - case CELL_PADDING: - ++stats_n_padding_cells_processed; - /* do nothing */ - break; - case CELL_VERSIONS: - tor_fragile_assert(); - break; - case CELL_NETINFO: - ++stats_n_netinfo_cells_processed; - PROCESS_CELL(netinfo, cell, chan); - break; - case CELL_CREATE: - case CELL_CREATE_FAST: - case CELL_CREATED: - case CELL_CREATED_FAST: - case CELL_RELAY: - case CELL_RELAY_EARLY: - case CELL_DESTROY: - case CELL_CREATE2: - case CELL_CREATED2: - /* - * These are all transport independent and we pass them up through the - * channel_t mechanism. They are ultimately handled in command.c. - */ - channel_queue_cell(TLS_CHAN_TO_BASE(chan), cell); - break; - default: - log_fn(LOG_INFO, LD_PROTOCOL, - "Cell of unknown type (%d) received in channeltls.c. " - "Dropping.", - cell->command); - break; - } -} - -/** - * Handle an incoming variable-length cell on a channel_tls_t - * - * Process a var_cell that was just received on conn. Keep - * internal statistics about how many of each cell we've processed so far - * this second, and the total number of microseconds it took to - * process each type of cell. All the var_cell commands are handshake- - * related and live below the channel_t layer, so no variable-length - * cells ever get delivered in the current implementation, but I've left - * the mechanism in place for future use. - */ - -void -channel_tls_handle_var_cell(var_cell_t *var_cell, or_connection_t *conn) -{ - channel_tls_t *chan; - -#ifdef KEEP_TIMING_STATS - /* how many of each cell have we seen so far this second? needs better - * name. */ - static int num_versions = 0, num_certs = 0; - static time_t current_second = 0; /* from previous calls to time */ - time_t now = time(NULL); - - if (current_second == 0) current_second = now; - if (now > current_second) { /* the second has rolled over */ - /* print stats */ - log_info(LD_OR, - "At end of second: %d versions (%d ms), %d certs (%d ms)", - num_versions, versions_time / ((now - current_second) * 1000), - num_certs, certs_time / ((now - current_second) * 1000)); - - num_versions = num_certs = 0; - versions_time = certs_time = 0; - - /* remember which second it is, for next time */ - current_second = now; - } -#endif - - tor_assert(var_cell); - tor_assert(conn); - - chan = conn->chan; - - if (!chan) { - log_warn(LD_CHANNEL, - "Got a var_cell_t on an OR connection with no channel"); - return; - } - - if (TO_CONN(conn)->marked_for_close) - return; - - switch (TO_CONN(conn)->state) { - case OR_CONN_STATE_OR_HANDSHAKING_V2: - if (var_cell->command != CELL_VERSIONS) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received a cell with command %d in unexpected " - "orconn state \"%s\" [%d], channel state \"%s\" [%d]; " - "closing the connection.", - (int)(var_cell->command), - conn_state_to_string(CONN_TYPE_OR, TO_CONN(conn)->state), - TO_CONN(conn)->state, - channel_state_to_string(TLS_CHAN_TO_BASE(chan)->state), - (int)(TLS_CHAN_TO_BASE(chan)->state)); - /* - * The code in connection_or.c will tell channel_t to close for - * error; it will go to CHANNEL_STATE_CLOSING, and then to - * CHANNEL_STATE_ERROR when conn is closed. - */ - connection_or_close_for_error(conn, 0); - return; - } - break; - case OR_CONN_STATE_TLS_HANDSHAKING: - /* If we're using bufferevents, it's entirely possible for us to - * notice "hey, data arrived!" before we notice "hey, the handshake - * finished!" And we need to be accepting both at once to handle both - * the v2 and v3 handshakes. */ - - /* fall through */ - case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: - if (!(command_allowed_before_handshake(var_cell->command))) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received a cell with command %d in unexpected " - "orconn state \"%s\" [%d], channel state \"%s\" [%d]; " - "closing the connection.", - (int)(var_cell->command), - conn_state_to_string(CONN_TYPE_OR, TO_CONN(conn)->state), - (int)(TO_CONN(conn)->state), - channel_state_to_string(TLS_CHAN_TO_BASE(chan)->state), - (int)(TLS_CHAN_TO_BASE(chan)->state)); - /* see above comment about CHANNEL_STATE_ERROR */ - connection_or_close_for_error(conn, 0); - return; - } else { - if (enter_v3_handshake_with_cell(var_cell, chan) < 0) - return; - } - break; - case OR_CONN_STATE_OR_HANDSHAKING_V3: - if (var_cell->command != CELL_AUTHENTICATE) - or_handshake_state_record_var_cell(conn, conn->handshake_state, - var_cell, 1); - break; /* Everything is allowed */ - case OR_CONN_STATE_OPEN: - if (conn->link_proto < 3) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received a variable-length cell with command %d in orconn " - "state %s [%d], channel state %s [%d] with link protocol %d; " - "ignoring it.", - (int)(var_cell->command), - conn_state_to_string(CONN_TYPE_OR, TO_CONN(conn)->state), - (int)(TO_CONN(conn)->state), - channel_state_to_string(TLS_CHAN_TO_BASE(chan)->state), - (int)(TLS_CHAN_TO_BASE(chan)->state), - (int)(conn->link_proto)); - return; - } - break; - default: - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received var-length cell with command %d in unexpected " - "orconn state \"%s\" [%d], channel state \"%s\" [%d]; " - "ignoring it.", - (int)(var_cell->command), - conn_state_to_string(CONN_TYPE_OR, TO_CONN(conn)->state), - (int)(TO_CONN(conn)->state), - channel_state_to_string(TLS_CHAN_TO_BASE(chan)->state), - (int)(TLS_CHAN_TO_BASE(chan)->state)); - return; - } - - /* Now handle the cell */ - - switch (var_cell->command) { - case CELL_VERSIONS: - ++stats_n_versions_cells_processed; - PROCESS_CELL(versions, var_cell, chan); - break; - case CELL_VPADDING: - ++stats_n_vpadding_cells_processed; - /* Do nothing */ - break; - case CELL_CERTS: - ++stats_n_certs_cells_processed; - PROCESS_CELL(certs, var_cell, chan); - break; - case CELL_AUTH_CHALLENGE: - ++stats_n_auth_challenge_cells_processed; - PROCESS_CELL(auth_challenge, var_cell, chan); - break; - case CELL_AUTHENTICATE: - ++stats_n_authenticate_cells_processed; - PROCESS_CELL(authenticate, var_cell, chan); - break; - case CELL_AUTHORIZE: - ++stats_n_authorize_cells_processed; - /* Ignored so far. */ - break; - default: - log_fn(LOG_INFO, LD_PROTOCOL, - "Variable-length cell of unknown type (%d) received.", - (int)(var_cell->command)); - break; - } -} - -/** - * Check if this cell type is allowed before the handshake is finished - * - * Return true if command is a cell command that's allowed to start a - * V3 handshake. - */ - -static int -command_allowed_before_handshake(uint8_t command) -{ - switch (command) { - case CELL_VERSIONS: - case CELL_VPADDING: - case CELL_AUTHORIZE: - return 1; - default: - return 0; - } -} - -/** - * Start a V3 handshake on an incoming connection - * - * Called when we as a server receive an appropriate cell while waiting - * either for a cell or a TLS handshake. Set the connection's state to - * "handshaking_v3', initializes the or_handshake_state field as needed, - * and add the cell to the hash of incoming cells.) - */ - -static int -enter_v3_handshake_with_cell(var_cell_t *cell, channel_tls_t *chan) -{ - int started_here = 0; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - - started_here = connection_or_nonopen_was_started_here(chan->conn); - - tor_assert(TO_CONN(chan->conn)->state == OR_CONN_STATE_TLS_HANDSHAKING || - TO_CONN(chan->conn)->state == - OR_CONN_STATE_TLS_SERVER_RENEGOTIATING); - - if (started_here) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a cell while TLS-handshaking, not in " - "OR_HANDSHAKING_V3, on a connection we originated."); - } - connection_or_block_renegotiation(chan->conn); - chan->conn->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3; - if (connection_init_or_handshake_state(chan->conn, started_here) < 0) { - connection_or_close_for_error(chan->conn, 0); - return -1; - } - or_handshake_state_record_var_cell(chan->conn, - chan->conn->handshake_state, cell, 1); - return 0; -} - -/** - * Process a 'versions' cell. - * - * This function is called to handle an incoming VERSIONS cell; the current - * link protocol version must be 0 to indicate that no version has yet been - * negotiated. We compare the versions in the cell to the list of versions - * we support, pick the highest version we have in common, and continue the - * negotiation from there. - */ - -static void -channel_tls_process_versions_cell(var_cell_t *cell, channel_tls_t *chan) -{ - int highest_supported_version = 0; - const uint8_t *cp, *end; - int started_here = 0; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - - if ((cell->payload_len % 2) == 1) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a VERSION cell with odd payload length %d; " - "closing connection.",cell->payload_len); - connection_or_close_for_error(chan->conn, 0); - return; - } - - started_here = connection_or_nonopen_was_started_here(chan->conn); - - if (chan->conn->link_proto != 0 || - (chan->conn->handshake_state && - chan->conn->handshake_state->received_versions)) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a VERSIONS cell on a connection with its version " - "already set to %d; dropping", - (int)(chan->conn->link_proto)); - return; - } - switch (chan->conn->base_.state) - { - case OR_CONN_STATE_OR_HANDSHAKING_V2: - case OR_CONN_STATE_OR_HANDSHAKING_V3: - break; - case OR_CONN_STATE_TLS_HANDSHAKING: - case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: - default: - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "VERSIONS cell while in unexpected state"); - return; - } - - tor_assert(chan->conn->handshake_state); - end = cell->payload + cell->payload_len; - for (cp = cell->payload; cp+1 < end; cp += 2) { - uint16_t v = ntohs(get_uint16(cp)); - if (is_or_protocol_version_known(v) && v > highest_supported_version) - highest_supported_version = v; - } - if (!highest_supported_version) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Couldn't find a version in common between my version list and the " - "list in the VERSIONS cell; closing connection."); - connection_or_close_for_error(chan->conn, 0); - return; - } else if (highest_supported_version == 1) { - /* Negotiating version 1 makes no sense, since version 1 has no VERSIONS - * cells. */ - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Used version negotiation protocol to negotiate a v1 connection. " - "That's crazily non-compliant. Closing connection."); - connection_or_close_for_error(chan->conn, 0); - return; - } else if (highest_supported_version < 3 && - chan->conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Negotiated link protocol 2 or lower after doing a v3 TLS " - "handshake. Closing connection."); - connection_or_close_for_error(chan->conn, 0); - return; - } else if (highest_supported_version != 2 && - chan->conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V2) { - /* XXXX This should eventually be a log_protocol_warn */ - log_fn(LOG_WARN, LD_OR, - "Negotiated link with non-2 protocol after doing a v2 TLS " - "handshake with %s. Closing connection.", - fmt_addr(&chan->conn->base_.addr)); - connection_or_close_for_error(chan->conn, 0); - return; - } - - chan->conn->link_proto = highest_supported_version; - chan->conn->handshake_state->received_versions = 1; - - if (chan->conn->link_proto == 2) { - log_info(LD_OR, - "Negotiated version %d with %s:%d; sending NETINFO.", - highest_supported_version, - safe_str_client(chan->conn->base_.address), - chan->conn->base_.port); - - if (connection_or_send_netinfo(chan->conn) < 0) { - connection_or_close_for_error(chan->conn, 0); - return; - } - } else { - const int send_versions = !started_here; - /* If we want to authenticate, send a CERTS cell */ - const int send_certs = !started_here || public_server_mode(get_options()); - /* If we're a host that got a connection, ask for authentication. */ - const int send_chall = !started_here; - /* If our certs cell will authenticate us, we can send a netinfo cell - * right now. */ - const int send_netinfo = !started_here; - const int send_any = - send_versions || send_certs || send_chall || send_netinfo; - tor_assert(chan->conn->link_proto >= 3); - - log_info(LD_OR, - "Negotiated version %d with %s:%d; %s%s%s%s%s", - highest_supported_version, - safe_str_client(chan->conn->base_.address), - chan->conn->base_.port, - send_any ? "Sending cells:" : "Waiting for CERTS cell", - send_versions ? " VERSIONS" : "", - send_certs ? " CERTS" : "", - send_chall ? " AUTH_CHALLENGE" : "", - send_netinfo ? " NETINFO" : ""); - -#ifdef DISABLE_V3_LINKPROTO_SERVERSIDE - if (1) { - connection_or_close_normally(chan->conn, 1); - return; - } -#endif - - if (send_versions) { - if (connection_or_send_versions(chan->conn, 1) < 0) { - log_warn(LD_OR, "Couldn't send versions cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - } - - /* We set this after sending the verions cell. */ - /*XXXXX symbolic const.*/ - chan->base_.wide_circ_ids = - chan->conn->link_proto >= MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS; - chan->conn->wide_circ_ids = chan->base_.wide_circ_ids; - - if (send_certs) { - if (connection_or_send_certs_cell(chan->conn) < 0) { - log_warn(LD_OR, "Couldn't send certs cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - } - if (send_chall) { - if (connection_or_send_auth_challenge_cell(chan->conn) < 0) { - log_warn(LD_OR, "Couldn't send auth_challenge cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - } - if (send_netinfo) { - if (connection_or_send_netinfo(chan->conn) < 0) { - log_warn(LD_OR, "Couldn't send netinfo cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - } - } -} - -/** - * Process a 'netinfo' cell - * - * This function is called to handle an incoming NETINFO cell; read and act - * on its contents, and set the connection state to "open". - */ - -static void -channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) -{ - time_t timestamp; - uint8_t my_addr_type; - uint8_t my_addr_len; - const uint8_t *my_addr_ptr; - const uint8_t *cp, *end; - uint8_t n_other_addrs; - time_t now = time(NULL); - - long apparent_skew = 0; - tor_addr_t my_apparent_addr = TOR_ADDR_NULL; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - - if (chan->conn->link_proto < 2) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a NETINFO cell on %s connection; dropping.", - chan->conn->link_proto == 0 ? "non-versioned" : "a v1"); - return; - } - if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V2 && - chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received a NETINFO cell on non-handshaking connection; dropping."); - return; - } - tor_assert(chan->conn->handshake_state && - chan->conn->handshake_state->received_versions); - - if (chan->conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) { - tor_assert(chan->conn->link_proto >= 3); - if (chan->conn->handshake_state->started_here) { - if (!(chan->conn->handshake_state->authenticated)) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Got a NETINFO cell from server, " - "but no authentication. Closing the connection."); - connection_or_close_for_error(chan->conn, 0); - return; - } - } else { - /* we're the server. If the client never authenticated, we have - some housekeeping to do.*/ - if (!(chan->conn->handshake_state->authenticated)) { - tor_assert(tor_digest_is_zero( - (const char*)(chan->conn->handshake_state-> - authenticated_peer_id))); - channel_set_circid_type(TLS_CHAN_TO_BASE(chan), NULL, - chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); - - connection_or_init_conn_from_address(chan->conn, - &(chan->conn->base_.addr), - chan->conn->base_.port, - (const char*)(chan->conn->handshake_state-> - authenticated_peer_id), - 0); - } - } - } - - /* Decode the cell. */ - timestamp = ntohl(get_uint32(cell->payload)); - if (labs(now - chan->conn->handshake_state->sent_versions_at) < 180) { - apparent_skew = now - timestamp; - } - - my_addr_type = (uint8_t) cell->payload[4]; - my_addr_len = (uint8_t) cell->payload[5]; - my_addr_ptr = (uint8_t*) cell->payload + 6; - end = cell->payload + CELL_PAYLOAD_SIZE; - cp = cell->payload + 6 + my_addr_len; - - /* We used to check: - * if (my_addr_len >= CELL_PAYLOAD_SIZE - 6) { - * - * This is actually never going to happen, since my_addr_len is at most 255, - * and CELL_PAYLOAD_LEN - 6 is 503. So we know that cp is < end. */ - - if (my_addr_type == RESOLVED_TYPE_IPV4 && my_addr_len == 4) { - tor_addr_from_ipv4n(&my_apparent_addr, get_uint32(my_addr_ptr)); - } else if (my_addr_type == RESOLVED_TYPE_IPV6 && my_addr_len == 16) { - tor_addr_from_ipv6_bytes(&my_apparent_addr, (const char *) my_addr_ptr); - } - - n_other_addrs = (uint8_t) *cp++; - while (n_other_addrs && cp < end-2) { - /* Consider all the other addresses; if any matches, this connection is - * "canonical." */ - tor_addr_t addr; - const uint8_t *next = - decode_address_from_payload(&addr, cp, (int)(end-cp)); - if (next == NULL) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Bad address in netinfo cell; closing connection."); - connection_or_close_for_error(chan->conn, 0); - return; - } - if (tor_addr_eq(&addr, &(chan->conn->real_addr))) { - chan->conn->is_canonical = 1; - break; - } - cp = next; - --n_other_addrs; - } - - /* Act on apparent skew. */ - /** Warn when we get a netinfo skew with at least this value. */ -#define NETINFO_NOTICE_SKEW 3600 - if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && - router_get_by_id_digest(chan->conn->identity_digest)) { - char dbuf[64]; - int severity; - /*XXXX be smarter about when everybody says we are skewed. */ - if (router_digest_is_trusted_dir(chan->conn->identity_digest)) - severity = LOG_WARN; - else - severity = LOG_INFO; - format_time_interval(dbuf, sizeof(dbuf), apparent_skew); - log_fn(severity, LD_GENERAL, - "Received NETINFO cell with skewed time from " - "server at %s:%d. It seems that our clock is %s by %s, or " - "that theirs is %s. Tor requires an accurate clock to work: " - "please check your time and date settings.", - chan->conn->base_.address, - (int)(chan->conn->base_.port), - apparent_skew > 0 ? "ahead" : "behind", - dbuf, - apparent_skew > 0 ? "behind" : "ahead"); - if (severity == LOG_WARN) /* only tell the controller if an authority */ - control_event_general_status(LOG_WARN, - "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", - apparent_skew, - chan->conn->base_.address, - chan->conn->base_.port); - } - - /* XXX maybe act on my_apparent_addr, if the source is sufficiently - * trustworthy. */ - - if (! chan->conn->handshake_state->sent_netinfo) { - /* If we were prepared to authenticate, but we never got an AUTH_CHALLENGE - * cell, then we would not previously have sent a NETINFO cell. Do so - * now. */ - if (connection_or_send_netinfo(chan->conn) < 0) { - connection_or_close_for_error(chan->conn, 0); - return; - } - } - - if (connection_or_set_state_open(chan->conn) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Got good NETINFO cell from %s:%d; but " - "was unable to make the OR connection become open.", - safe_str_client(chan->conn->base_.address), - chan->conn->base_.port); - connection_or_close_for_error(chan->conn, 0); - } else { - log_info(LD_OR, - "Got good NETINFO cell from %s:%d; OR connection is now " - "open, using protocol version %d. Its ID digest is %s. " - "Our address is apparently %s.", - safe_str_client(chan->conn->base_.address), - chan->conn->base_.port, - (int)(chan->conn->link_proto), - hex_str(TLS_CHAN_TO_BASE(chan)->identity_digest, - DIGEST_LEN), - tor_addr_is_null(&my_apparent_addr) ? - "" : fmt_and_decorate_addr(&my_apparent_addr)); - } - assert_connection_ok(TO_CONN(chan->conn),time(NULL)); -} - -/** - * Process a CERTS cell from a channel. - * - * This function is called to process an incoming CERTS cell on a - * channel_tls_t: - * - * If the other side should not have sent us a CERTS cell, or the cell is - * malformed, or it is supposed to authenticate the TLS key but it doesn't, - * then mark the connection. - * - * If the cell has a good cert chain and we're doing a v3 handshake, then - * store the certificates in or_handshake_state. If this is the client side - * of the connection, we then authenticate the server or mark the connection. - * If it's the server side, wait for an AUTHENTICATE cell. - */ - -static void -channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan) -{ - tor_cert_t *link_cert = NULL; - tor_cert_t *id_cert = NULL; - tor_cert_t *auth_cert = NULL; - uint8_t *ptr; - int n_certs, i; - int send_netinfo = 0; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - -#define ERR(s) \ - do { \ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, \ - "Received a bad CERTS cell from %s:%d: %s", \ - safe_str(chan->conn->base_.address), \ - chan->conn->base_.port, (s)); \ - connection_or_close_for_error(chan->conn, 0); \ - goto err; \ - } while (0) - - if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) - ERR("We're not doing a v3 handshake!"); - if (chan->conn->link_proto < 3) - ERR("We're not using link protocol >= 3"); - if (chan->conn->handshake_state->received_certs_cell) - ERR("We already got one"); - if (chan->conn->handshake_state->authenticated) { - /* Should be unreachable, but let's make sure. */ - ERR("We're already authenticated!"); - } - if (cell->payload_len < 1) - ERR("It had no body"); - if (cell->circ_id) - ERR("It had a nonzero circuit ID"); - - n_certs = cell->payload[0]; - ptr = cell->payload + 1; - for (i = 0; i < n_certs; ++i) { - uint8_t cert_type; - uint16_t cert_len; - if (ptr + 3 > cell->payload + cell->payload_len) { - goto truncated; - } - cert_type = *ptr; - cert_len = ntohs(get_uint16(ptr+1)); - if (ptr + 3 + cert_len > cell->payload + cell->payload_len) { - goto truncated; - } - if (cert_type == OR_CERT_TYPE_TLS_LINK || - cert_type == OR_CERT_TYPE_ID_1024 || - cert_type == OR_CERT_TYPE_AUTH_1024) { - tor_cert_t *cert = tor_cert_decode(ptr + 3, cert_len); - if (!cert) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received undecodable certificate in CERTS cell from %s:%d", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - } else { - if (cert_type == OR_CERT_TYPE_TLS_LINK) { - if (link_cert) { - tor_cert_free(cert); - ERR("Too many TLS_LINK certificates"); - } - link_cert = cert; - } else if (cert_type == OR_CERT_TYPE_ID_1024) { - if (id_cert) { - tor_cert_free(cert); - ERR("Too many ID_1024 certificates"); - } - id_cert = cert; - } else if (cert_type == OR_CERT_TYPE_AUTH_1024) { - if (auth_cert) { - tor_cert_free(cert); - ERR("Too many AUTH_1024 certificates"); - } - auth_cert = cert; - } else { - tor_cert_free(cert); - } - } - } - ptr += 3 + cert_len; - continue; - - truncated: - ERR("It ends in the middle of a certificate"); - } - - if (chan->conn->handshake_state->started_here) { - int severity; - if (! (id_cert && link_cert)) - ERR("The certs we wanted were missing"); - /* Okay. We should be able to check the certificates now. */ - if (! tor_tls_cert_matches_key(chan->conn->tls, link_cert)) { - ERR("The link certificate didn't match the TLS public key"); - } - /* Note that this warns more loudly about time and validity if we were - * _trying_ to connect to an authority, not necessarily if we _did_ connect - * to one. */ - if (router_digest_is_trusted_dir( - TLS_CHAN_TO_BASE(chan)->identity_digest)) - severity = LOG_WARN; - else - severity = LOG_PROTOCOL_WARN; - - if (! tor_tls_cert_is_valid(severity, link_cert, id_cert, 0)) - ERR("The link certificate was not valid"); - if (! tor_tls_cert_is_valid(severity, id_cert, id_cert, 1)) - ERR("The ID certificate was not valid"); - - chan->conn->handshake_state->authenticated = 1; - { - const digests_t *id_digests = tor_cert_get_id_digests(id_cert); - crypto_pk_t *identity_rcvd; - if (!id_digests) - ERR("Couldn't compute digests for key in ID cert"); - - identity_rcvd = tor_tls_cert_get_key(id_cert); - if (!identity_rcvd) - ERR("Internal error: Couldn't get RSA key from ID cert."); - memcpy(chan->conn->handshake_state->authenticated_peer_id, - id_digests->d[DIGEST_SHA1], DIGEST_LEN); - channel_set_circid_type(TLS_CHAN_TO_BASE(chan), identity_rcvd, - chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); - crypto_pk_free(identity_rcvd); - } - - if (connection_or_client_learned_peer_id(chan->conn, - chan->conn->handshake_state->authenticated_peer_id) < 0) - ERR("Problem setting or checking peer id"); - - log_info(LD_OR, - "Got some good certificates from %s:%d: Authenticated it.", - safe_str(chan->conn->base_.address), chan->conn->base_.port); - - chan->conn->handshake_state->id_cert = id_cert; - id_cert = NULL; - - if (!public_server_mode(get_options())) { - /* If we initiated the connection and we are not a public server, we - * aren't planning to authenticate at all. At this point we know who we - * are talking to, so we can just send a netinfo now. */ - send_netinfo = 1; - } - } else { - if (! (id_cert && auth_cert)) - ERR("The certs we wanted were missing"); - - /* Remember these certificates so we can check an AUTHENTICATE cell */ - if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, auth_cert, id_cert, 1)) - ERR("The authentication certificate was not valid"); - if (! tor_tls_cert_is_valid(LOG_PROTOCOL_WARN, id_cert, id_cert, 1)) - ERR("The ID certificate was not valid"); - - log_info(LD_OR, - "Got some good certificates from %s:%d: " - "Waiting for AUTHENTICATE.", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - /* XXXX check more stuff? */ - - chan->conn->handshake_state->id_cert = id_cert; - chan->conn->handshake_state->auth_cert = auth_cert; - id_cert = auth_cert = NULL; - } - - chan->conn->handshake_state->received_certs_cell = 1; - - if (send_netinfo) { - if (connection_or_send_netinfo(chan->conn) < 0) { - log_warn(LD_OR, "Couldn't send netinfo cell"); - connection_or_close_for_error(chan->conn, 0); - goto err; - } - } - - err: - tor_cert_free(id_cert); - tor_cert_free(link_cert); - tor_cert_free(auth_cert); -#undef ERR -} - -/** - * Process an AUTH_CHALLENGE cell from a channel_tls_t - * - * This function is called to handle an incoming AUTH_CHALLENGE cell on a - * channel_tls_t; if we weren't supposed to get one (for example, because we're - * not the originator of the channel), or it's ill-formed, or we aren't doing - * a v3 handshake, mark the channel. If the cell is well-formed but we don't - * want to authenticate, just drop it. If the cell is well-formed *and* we - * want to authenticate, send an AUTHENTICATE cell and then a NETINFO cell. - */ - -static void -channel_tls_process_auth_challenge_cell(var_cell_t *cell, channel_tls_t *chan) -{ - int n_types, i, use_type = -1; - uint8_t *cp; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - -#define ERR(s) \ - do { \ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, \ - "Received a bad AUTH_CHALLENGE cell from %s:%d: %s", \ - safe_str(chan->conn->base_.address), \ - chan->conn->base_.port, (s)); \ - connection_or_close_for_error(chan->conn, 0); \ - return; \ - } while (0) - - if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) - ERR("We're not currently doing a v3 handshake"); - if (chan->conn->link_proto < 3) - ERR("We're not using link protocol >= 3"); - if (!(chan->conn->handshake_state->started_here)) - ERR("We didn't originate this connection"); - if (chan->conn->handshake_state->received_auth_challenge) - ERR("We already received one"); - if (!(chan->conn->handshake_state->received_certs_cell)) - ERR("We haven't gotten a CERTS cell yet"); - if (cell->payload_len < OR_AUTH_CHALLENGE_LEN + 2) - ERR("It was too short"); - if (cell->circ_id) - ERR("It had a nonzero circuit ID"); - - n_types = ntohs(get_uint16(cell->payload + OR_AUTH_CHALLENGE_LEN)); - if (cell->payload_len < OR_AUTH_CHALLENGE_LEN + 2 + 2*n_types) - ERR("It looks truncated"); - - /* Now see if there is an authentication type we can use */ - cp = cell->payload+OR_AUTH_CHALLENGE_LEN + 2; - for (i = 0; i < n_types; ++i, cp += 2) { - uint16_t authtype = ntohs(get_uint16(cp)); - if (authtype == AUTHTYPE_RSA_SHA256_TLSSECRET) - use_type = authtype; - } - - chan->conn->handshake_state->received_auth_challenge = 1; - - if (! public_server_mode(get_options())) { - /* If we're not a public server then we don't want to authenticate on a - connection we originated, and we already sent a NETINFO cell when we - got the CERTS cell. We have nothing more to do. */ - return; - } - - if (use_type >= 0) { - log_info(LD_OR, - "Got an AUTH_CHALLENGE cell from %s:%d: Sending " - "authentication", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - - if (connection_or_send_authenticate_cell(chan->conn, use_type) < 0) { - log_warn(LD_OR, - "Couldn't send authenticate cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - } else { - log_info(LD_OR, - "Got an AUTH_CHALLENGE cell from %s:%d, but we don't " - "know any of its authentication types. Not authenticating.", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - } - - if (connection_or_send_netinfo(chan->conn) < 0) { - log_warn(LD_OR, "Couldn't send netinfo cell"); - connection_or_close_for_error(chan->conn, 0); - return; - } - -#undef ERR -} - -/** - * Process an AUTHENTICATE cell from a channel_tls_t - * - * If it's ill-formed or we weren't supposed to get one or we're not doing a - * v3 handshake, then mark the connection. If it does not authenticate the - * other side of the connection successfully (because it isn't signed right, - * we didn't get a CERTS cell, etc) mark the connection. Otherwise, accept - * the identity of the router on the other side of the connection. - */ - -static void -channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan) -{ - uint8_t expected[V3_AUTH_FIXED_PART_LEN]; - const uint8_t *auth; - int authlen; - - tor_assert(cell); - tor_assert(chan); - tor_assert(chan->conn); - -#define ERR(s) \ - do { \ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, \ - "Received a bad AUTHENTICATE cell from %s:%d: %s", \ - safe_str(chan->conn->base_.address), \ - chan->conn->base_.port, (s)); \ - connection_or_close_for_error(chan->conn, 0); \ - return; \ - } while (0) - - if (chan->conn->base_.state != OR_CONN_STATE_OR_HANDSHAKING_V3) - ERR("We're not doing a v3 handshake"); - if (chan->conn->link_proto < 3) - ERR("We're not using link protocol >= 3"); - if (chan->conn->handshake_state->started_here) - ERR("We originated this connection"); - if (chan->conn->handshake_state->received_authenticate) - ERR("We already got one!"); - if (chan->conn->handshake_state->authenticated) { - /* Should be impossible given other checks */ - ERR("The peer is already authenticated"); - } - if (!(chan->conn->handshake_state->received_certs_cell)) - ERR("We never got a certs cell"); - if (chan->conn->handshake_state->auth_cert == NULL) - ERR("We never got an authentication certificate"); - if (chan->conn->handshake_state->id_cert == NULL) - ERR("We never got an identity certificate"); - if (cell->payload_len < 4) - ERR("Cell was way too short"); - - auth = cell->payload; - { - uint16_t type = ntohs(get_uint16(auth)); - uint16_t len = ntohs(get_uint16(auth+2)); - if (4 + len > cell->payload_len) - ERR("Authenticator was truncated"); - - if (type != AUTHTYPE_RSA_SHA256_TLSSECRET) - ERR("Authenticator type was not recognized"); - - auth += 4; - authlen = len; - } - - if (authlen < V3_AUTH_BODY_LEN + 1) - ERR("Authenticator was too short"); - - if (connection_or_compute_authenticate_cell_body( - chan->conn, expected, sizeof(expected), NULL, 1) < 0) - ERR("Couldn't compute expected AUTHENTICATE cell body"); - - if (tor_memneq(expected, auth, sizeof(expected))) - ERR("Some field in the AUTHENTICATE cell body was not as expected"); - - { - crypto_pk_t *pk = tor_tls_cert_get_key( - chan->conn->handshake_state->auth_cert); - char d[DIGEST256_LEN]; - char *signed_data; - size_t keysize; - int signed_len; - - if (!pk) - ERR("Internal error: couldn't get RSA key from AUTH cert."); - crypto_digest256(d, (char*)auth, V3_AUTH_BODY_LEN, DIGEST_SHA256); - - keysize = crypto_pk_keysize(pk); - signed_data = tor_malloc(keysize); - signed_len = crypto_pk_public_checksig(pk, signed_data, keysize, - (char*)auth + V3_AUTH_BODY_LEN, - authlen - V3_AUTH_BODY_LEN); - crypto_pk_free(pk); - if (signed_len < 0) { - tor_free(signed_data); - ERR("Signature wasn't valid"); - } - if (signed_len < DIGEST256_LEN) { - tor_free(signed_data); - ERR("Not enough data was signed"); - } - /* Note that we deliberately allow *more* than DIGEST256_LEN bytes here, - * in case they're later used to hold a SHA3 digest or something. */ - if (tor_memneq(signed_data, d, DIGEST256_LEN)) { - tor_free(signed_data); - ERR("Signature did not match data to be signed."); - } - tor_free(signed_data); - } - - /* Okay, we are authenticated. */ - chan->conn->handshake_state->received_authenticate = 1; - chan->conn->handshake_state->authenticated = 1; - chan->conn->handshake_state->digest_received_data = 0; - { - crypto_pk_t *identity_rcvd = - tor_tls_cert_get_key(chan->conn->handshake_state->id_cert); - const digests_t *id_digests = - tor_cert_get_id_digests(chan->conn->handshake_state->id_cert); - - /* This must exist; we checked key type when reading the cert. */ - tor_assert(id_digests); - - memcpy(chan->conn->handshake_state->authenticated_peer_id, - id_digests->d[DIGEST_SHA1], DIGEST_LEN); - - channel_set_circid_type(TLS_CHAN_TO_BASE(chan), identity_rcvd, - chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); - crypto_pk_free(identity_rcvd); - - connection_or_init_conn_from_address(chan->conn, - &(chan->conn->base_.addr), - chan->conn->base_.port, - (const char*)(chan->conn->handshake_state-> - authenticated_peer_id), - 0); - - log_info(LD_OR, - "Got an AUTHENTICATE cell from %s:%d: Looks good.", - safe_str(chan->conn->base_.address), - chan->conn->base_.port); - } - -#undef ERR -} - diff --git a/src/tor/channeltls.h b/src/tor/channeltls.h deleted file mode 100644 index b4a7e2bea..000000000 --- a/src/tor/channeltls.h +++ /dev/null @@ -1,57 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file channeltls.h - * \brief Header file for channeltls.c - **/ - -#ifndef TOR_CHANNELTLS_H -#define TOR_CHANNELTLS_H - -#include "or.h" -#include "channel.h" - -#define BASE_CHAN_TO_TLS(c) (channel_tls_from_base((c))) -#define TLS_CHAN_TO_BASE(c) (channel_tls_to_base((c))) - -#define TLS_CHAN_MAGIC 0x8a192427U - -#ifdef TOR_CHANNEL_INTERNAL_ - -struct channel_tls_s { - /* Base channel_t struct */ - channel_t base_; - /* or_connection_t pointer */ - or_connection_t *conn; -}; - -#endif /* TOR_CHANNEL_INTERNAL_ */ - -channel_t * channel_tls_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest); -channel_listener_t * channel_tls_get_listener(void); -channel_listener_t * channel_tls_start_listener(void); -channel_t * channel_tls_handle_incoming(or_connection_t *orconn); - -/* Casts */ - -channel_t * channel_tls_to_base(channel_tls_t *tlschan); -channel_tls_t * channel_tls_from_base(channel_t *chan); - -/* Things for connection_or.c to call back into */ -ssize_t channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells); -int channel_tls_more_to_flush(channel_tls_t *chan); -void channel_tls_handle_cell(cell_t *cell, or_connection_t *conn); -void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, - or_connection_t *conn, - uint8_t old_state, - uint8_t state); -void channel_tls_handle_var_cell(var_cell_t *var_cell, - or_connection_t *conn); - -/* Cleanup at shutdown */ -void channel_tls_free_all(void); - -#endif - diff --git a/src/tor/ciphers.inc b/src/tor/ciphers.inc deleted file mode 100644 index 137d78b11..000000000 --- a/src/tor/ciphers.inc +++ /dev/null @@ -1,182 +0,0 @@ -/* This is an include file used to define the list of ciphers clients should - * advertise. Before including it, you should define the CIPHER and XCIPHER - * macros. - * - * This file was automatically generated by get_mozilla_ciphers.py. - */ -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - CIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc00a, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA - CIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc014, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - CIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA) -#else - XCIPHER(0x0088, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA - CIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA) -#else - XCIPHER(0x0087, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA - CIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) -#else - XCIPHER(0x0039, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA) -#endif -#ifdef TLS1_TXT_DHE_DSS_WITH_AES_256_SHA - CIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) -#else - XCIPHER(0x0038, TLS1_TXT_DHE_DSS_WITH_AES_256_SHA) -#endif -#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA - CIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc00f, TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA - CIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) -#else - XCIPHER(0xc005, TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA - CIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) -#else - XCIPHER(0x0084, TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_AES_256_SHA - CIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) -#else - XCIPHER(0x0035, TLS1_TXT_RSA_WITH_AES_256_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA - CIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) -#else - XCIPHER(0xc007, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - CIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc009, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA - CIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) -#else - XCIPHER(0xc011, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA - CIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc013, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - CIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA) -#else - XCIPHER(0x0045, TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA - CIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA) -#else - XCIPHER(0x0044, TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA - CIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) -#else - XCIPHER(0x0033, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA) -#endif -#ifdef TLS1_TXT_DHE_DSS_WITH_AES_128_SHA - CIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) -#else - XCIPHER(0x0032, TLS1_TXT_DHE_DSS_WITH_AES_128_SHA) -#endif -#ifdef TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA - CIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) -#else - XCIPHER(0xc00c, TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA) -#endif -#ifdef TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA - CIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc00e, TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA - CIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) -#else - XCIPHER(0xc002, TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA) -#endif -#ifdef TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA - CIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) -#else - XCIPHER(0xc004, TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_SEED_SHA - CIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA) -#else - XCIPHER(0x0096, TLS1_TXT_RSA_WITH_SEED_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA - CIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) -#else - XCIPHER(0x0041, TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA) -#endif -#ifdef SSL3_TXT_RSA_RC4_128_MD5 - CIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) -#else - XCIPHER(0x0004, SSL3_TXT_RSA_RC4_128_MD5) -#endif -#ifdef SSL3_TXT_RSA_RC4_128_SHA - CIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) -#else - XCIPHER(0x0005, SSL3_TXT_RSA_RC4_128_SHA) -#endif -#ifdef TLS1_TXT_RSA_WITH_AES_128_SHA - CIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) -#else - XCIPHER(0x002f, TLS1_TXT_RSA_WITH_AES_128_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA - CIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) -#else - XCIPHER(0xc008, TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA) -#endif -#ifdef TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA - CIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) -#else - XCIPHER(0xc012, TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA) -#endif -#ifdef SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA - CIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) -#else - XCIPHER(0x0016, SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA) -#endif -#ifdef SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA - CIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) -#else - XCIPHER(0x0013, SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA) -#endif -#ifdef TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA - CIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) -#else - XCIPHER(0xc00d, TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA) -#endif -#ifdef TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA - CIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) -#else - XCIPHER(0xc003, TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA) -#endif -/* No openssl macro found for 0xfeff */ -#ifdef SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA - CIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) -#else - XCIPHER(0xfeff, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA) -#endif -#ifdef SSL3_TXT_RSA_DES_192_CBC3_SHA - CIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) -#else - XCIPHER(0x000a, SSL3_TXT_RSA_DES_192_CBC3_SHA) -#endif diff --git a/src/tor/circpathbias.c b/src/tor/circpathbias.c deleted file mode 100644 index 51a75cf50..000000000 --- a/src/tor/circpathbias.c +++ /dev/null @@ -1,1538 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "channel.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "circuitstats.h" -#include "connection_edge.h" -#include "config.h" -#include "entrynodes.h" -#include "networkstatus.h" -#include "relay.h" - -static void pathbias_count_successful_close(origin_circuit_t *circ); -static void pathbias_count_collapse(origin_circuit_t *circ); -static void pathbias_count_use_failed(origin_circuit_t *circ); -static void pathbias_measure_use_rate(entry_guard_t *guard); -static void pathbias_measure_close_rate(entry_guard_t *guard); -static void pathbias_scale_use_rates(entry_guard_t *guard); -static void pathbias_scale_close_rates(entry_guard_t *guard); -static int entry_guard_inc_circ_attempt_count(entry_guard_t *guard); - -/** Increment the number of times we successfully extended a circuit to - * guard, first checking if the failure rate is high enough that - * we should eliminate the guard. Return -1 if the guard looks no good; - * return 0 if the guard looks fine. - */ -static int -entry_guard_inc_circ_attempt_count(entry_guard_t *guard) -{ - entry_guards_changed(); - - pathbias_measure_close_rate(guard); - - if (guard->path_bias_disabled) - return -1; - - pathbias_scale_close_rates(guard); - guard->circ_attempts++; - - log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)", - guard->circ_successes, guard->circ_attempts, guard->nickname, - hex_str(guard->identity, DIGEST_LEN)); - return 0; -} - -/** The minimum number of circuit attempts before we start - * thinking about warning about path bias and dropping guards */ -static int -pathbias_get_min_circs(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_MIN_CIRC 150 - if (options->PathBiasCircThreshold >= 5) - return options->PathBiasCircThreshold; - else - return networkstatus_get_param(NULL, "pb_mincircs", - DFLT_PATH_BIAS_MIN_CIRC, - 5, INT32_MAX); -} - -/** The circuit success rate below which we issue a notice */ -static double -pathbias_get_notice_rate(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_NOTICE_PCT 70 - if (options->PathBiasNoticeRate >= 0.0) - return options->PathBiasNoticeRate; - else - return networkstatus_get_param(NULL, "pb_noticepct", - DFLT_PATH_BIAS_NOTICE_PCT, 0, 100)/100.0; -} - -/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ -/** The circuit success rate below which we issue a warn */ -static double -pathbias_get_warn_rate(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_WARN_PCT 50 - if (options->PathBiasWarnRate >= 0.0) - return options->PathBiasWarnRate; - else - return networkstatus_get_param(NULL, "pb_warnpct", - DFLT_PATH_BIAS_WARN_PCT, 0, 100)/100.0; -} - -/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ -/** - * The extreme rate is the rate at which we would drop the guard, - * if pb_dropguard is also set. Otherwise we just warn. - */ -double -pathbias_get_extreme_rate(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_EXTREME_PCT 30 - if (options->PathBiasExtremeRate >= 0.0) - return options->PathBiasExtremeRate; - else - return networkstatus_get_param(NULL, "pb_extremepct", - DFLT_PATH_BIAS_EXTREME_PCT, 0, 100)/100.0; -} - -/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ -/** - * If 1, we actually disable use of guards that fall below - * the extreme_pct. - */ -int -pathbias_get_dropguards(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_DROP_GUARDS 0 - if (options->PathBiasDropGuards >= 0) - return options->PathBiasDropGuards; - else - return networkstatus_get_param(NULL, "pb_dropguards", - DFLT_PATH_BIAS_DROP_GUARDS, 0, 1); -} - -/** - * This is the number of circuits at which we scale our - * counts by mult_factor/scale_factor. Note, this count is - * not exact, as we only perform the scaling in the event - * of no integer truncation. - */ -static int -pathbias_get_scale_threshold(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_SCALE_THRESHOLD 300 - if (options->PathBiasScaleThreshold >= 10) - return options->PathBiasScaleThreshold; - else - return networkstatus_get_param(NULL, "pb_scalecircs", - DFLT_PATH_BIAS_SCALE_THRESHOLD, 10, - INT32_MAX); -} - -/** - * Compute the path bias scaling ratio from the consensus - * parameters pb_multfactor/pb_scalefactor. - * - * Returns a value in (0, 1.0] which we multiply our pathbias - * counts with to scale them down. - */ -static double -pathbias_get_scale_ratio(const or_options_t *options) -{ - /* - * The scale factor is the denominator for our scaling - * of circuit counts for our path bias window. - * - * Note that our use of doubles for the path bias state - * file means that powers of 2 work best here. - */ - int denominator = networkstatus_get_param(NULL, "pb_scalefactor", - 2, 2, INT32_MAX); - (void) options; - /** - * The mult factor is the numerator for our scaling - * of circuit counts for our path bias window. It - * allows us to scale by fractions. - */ - return networkstatus_get_param(NULL, "pb_multfactor", - 1, 1, denominator)/((double)denominator); -} - -/** The minimum number of circuit usage attempts before we start - * thinking about warning about path use bias and dropping guards */ -static int -pathbias_get_min_use(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_MIN_USE 20 - if (options->PathBiasUseThreshold >= 3) - return options->PathBiasUseThreshold; - else - return networkstatus_get_param(NULL, "pb_minuse", - DFLT_PATH_BIAS_MIN_USE, - 3, INT32_MAX); -} - -/** The circuit use success rate below which we issue a notice */ -static double -pathbias_get_notice_use_rate(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_NOTICE_USE_PCT 80 - if (options->PathBiasNoticeUseRate >= 0.0) - return options->PathBiasNoticeUseRate; - else - return networkstatus_get_param(NULL, "pb_noticeusepct", - DFLT_PATH_BIAS_NOTICE_USE_PCT, - 0, 100)/100.0; -} - -/** - * The extreme use rate is the rate at which we would drop the guard, - * if pb_dropguard is also set. Otherwise we just warn. - */ -double -pathbias_get_extreme_use_rate(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_EXTREME_USE_PCT 60 - if (options->PathBiasExtremeUseRate >= 0.0) - return options->PathBiasExtremeUseRate; - else - return networkstatus_get_param(NULL, "pb_extremeusepct", - DFLT_PATH_BIAS_EXTREME_USE_PCT, - 0, 100)/100.0; -} - -/** - * This is the number of circuits at which we scale our - * use counts by mult_factor/scale_factor. Note, this count is - * not exact, as we only perform the scaling in the event - * of no integer truncation. - */ -static int -pathbias_get_scale_use_threshold(const or_options_t *options) -{ -#define DFLT_PATH_BIAS_SCALE_USE_THRESHOLD 100 - if (options->PathBiasScaleUseThreshold >= 10) - return options->PathBiasScaleUseThreshold; - else - return networkstatus_get_param(NULL, "pb_scaleuse", - DFLT_PATH_BIAS_SCALE_USE_THRESHOLD, - 10, INT32_MAX); -} - -/** - * Convert a Guard's path state to string. - */ -const char * -pathbias_state_to_string(path_state_t state) -{ - switch (state) { - case PATH_STATE_NEW_CIRC: - return "new"; - case PATH_STATE_BUILD_ATTEMPTED: - return "build attempted"; - case PATH_STATE_BUILD_SUCCEEDED: - return "build succeeded"; - case PATH_STATE_USE_ATTEMPTED: - return "use attempted"; - case PATH_STATE_USE_SUCCEEDED: - return "use succeeded"; - case PATH_STATE_USE_FAILED: - return "use failed"; - case PATH_STATE_ALREADY_COUNTED: - return "already counted"; - } - - return "unknown"; -} - -/** - * This function decides if a circuit has progressed far enough to count - * as a circuit "attempt". As long as end-to-end tagging is possible, - * we assume the adversary will use it over hop-to-hop failure. Therefore, - * we only need to account bias for the last hop. This should make us - * much more resilient to ambient circuit failure, and also make that - * failure easier to measure (we only need to measure Exit failure rates). - */ -static int -pathbias_is_new_circ_attempt(origin_circuit_t *circ) -{ -#define N2N_TAGGING_IS_POSSIBLE -#ifdef N2N_TAGGING_IS_POSSIBLE - /* cpath is a circular list. We want circs with more than one hop, - * and the second hop must be waiting for keys still (it's just - * about to get them). */ - return circ->cpath && - circ->cpath->next != circ->cpath && - circ->cpath->next->state == CPATH_STATE_AWAITING_KEYS; -#else - /* If tagging attacks are no longer possible, we probably want to - * count bias from the first hop. However, one could argue that - * timing-based tagging is still more useful than per-hop failure. - * In which case, we'd never want to use this. - */ - return circ->cpath && - circ->cpath->state == CPATH_STATE_AWAITING_KEYS; -#endif -} - -/** - * Decide if the path bias code should count a circuit. - * - * @returns 1 if we should count it, 0 otherwise. - */ -static int -pathbias_should_count(origin_circuit_t *circ) -{ -#define PATHBIAS_COUNT_INTERVAL (600) - static ratelim_t count_limit = - RATELIM_INIT(PATHBIAS_COUNT_INTERVAL); - char *rate_msg = NULL; - - /* We can't do path bias accounting without entry guards. - * Testing and controller circuits also have no guards. - * - * We also don't count server-side rends, because their - * endpoint could be chosen maliciously. - * Similarly, we can't count client-side intro attempts, - * because clients can be manipulated into connecting to - * malicious intro points. */ - if (get_options()->UseEntryGuards == 0 || - circ->base_.purpose == CIRCUIT_PURPOSE_TESTING || - circ->base_.purpose == CIRCUIT_PURPOSE_CONTROLLER || - circ->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND || - circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED || - (circ->base_.purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && - circ->base_.purpose <= CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) { - - /* Check to see if the shouldcount result has changed due to a - * unexpected purpose change that would affect our results. - * - * The reason we check the path state too here is because for the - * cannibalized versions of these purposes, we count them as successful - * before their purpose change. - */ - if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED - && circ->path_state != PATH_STATE_ALREADY_COUNTED) { - log_info(LD_BUG, - "Circuit %d is now being ignored despite being counted " - "in the past. Purpose is %s, path state is %s", - circ->global_identifier, - circuit_purpose_to_string(circ->base_.purpose), - pathbias_state_to_string(circ->path_state)); - } - circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED; - return 0; - } - - /* Completely ignore one hop circuits */ - if (circ->build_state->onehop_tunnel || - circ->build_state->desired_path_len == 1) { - /* Check for inconsistency */ - if (circ->build_state->desired_path_len != 1 || - !circ->build_state->onehop_tunnel) { - if ((rate_msg = rate_limit_log(&count_limit, approx_time()))) { - log_info(LD_BUG, - "One-hop circuit has length %d. Path state is %s. " - "Circuit is a %s currently %s.%s", - circ->build_state->desired_path_len, - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - tor_fragile_assert(); - } - - /* Check to see if the shouldcount result has changed due to a - * unexpected change that would affect our results */ - if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_COUNTED) { - log_info(LD_BUG, - "One-hop circuit %d is now being ignored despite being counted " - "in the past. Purpose is %s, path state is %s", - circ->global_identifier, - circuit_purpose_to_string(circ->base_.purpose), - pathbias_state_to_string(circ->path_state)); - } - circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED; - return 0; - } - - /* Check to see if the shouldcount result has changed due to a - * unexpected purpose change that would affect our results */ - if (circ->pathbias_shouldcount == PATHBIAS_SHOULDCOUNT_IGNORED) { - log_info(LD_BUG, - "Circuit %d is now being counted despite being ignored " - "in the past. Purpose is %s, path state is %s", - circ->global_identifier, - circuit_purpose_to_string(circ->base_.purpose), - pathbias_state_to_string(circ->path_state)); - } - circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_COUNTED; - - return 1; -} - -/** - * Check our circuit state to see if this is a successful circuit attempt. - * If so, record it in the current guard's path bias circ_attempt count. - * - * Also check for several potential error cases for bug #6475. - */ -int -pathbias_count_build_attempt(origin_circuit_t *circ) -{ -#define CIRC_ATTEMPT_NOTICE_INTERVAL (600) - static ratelim_t circ_attempt_notice_limit = - RATELIM_INIT(CIRC_ATTEMPT_NOTICE_INTERVAL); - char *rate_msg = NULL; - - if (!pathbias_should_count(circ)) { - return 0; - } - - if (pathbias_is_new_circ_attempt(circ)) { - /* Help track down the real cause of bug #6475: */ - if (circ->has_opened && circ->path_state != PATH_STATE_BUILD_ATTEMPTED) { - if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit, - approx_time()))) { - log_info(LD_BUG, - "Opened circuit is in strange path state %s. " - "Circuit is a %s currently %s.%s", - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - - /* Don't re-count cannibalized circs.. */ - if (!circ->has_opened) { - entry_guard_t *guard = NULL; - - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } else if (circ->base_.n_chan) { - guard = - entry_guard_get_by_id_digest(circ->base_.n_chan->identity_digest); - } - - if (guard) { - if (circ->path_state == PATH_STATE_NEW_CIRC) { - circ->path_state = PATH_STATE_BUILD_ATTEMPTED; - - if (entry_guard_inc_circ_attempt_count(guard) < 0) { - /* Bogus guard; we already warned. */ - return -END_CIRC_REASON_TORPROTOCOL; - } - } else { - if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit, - approx_time()))) { - log_info(LD_BUG, - "Unopened circuit has strange path state %s. " - "Circuit is a %s currently %s.%s", - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - } else { - if ((rate_msg = rate_limit_log(&circ_attempt_notice_limit, - approx_time()))) { - log_info(LD_CIRC, - "Unopened circuit has no known guard. " - "Circuit is a %s currently %s.%s", - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - } - } - - return 0; -} - -/** - * Check our circuit state to see if this is a successful circuit - * completion. If so, record it in the current guard's path bias - * success count. - * - * Also check for several potential error cases for bug #6475. - */ -void -pathbias_count_build_success(origin_circuit_t *circ) -{ -#define SUCCESS_NOTICE_INTERVAL (600) - static ratelim_t success_notice_limit = - RATELIM_INIT(SUCCESS_NOTICE_INTERVAL); - char *rate_msg = NULL; - entry_guard_t *guard = NULL; - - if (!pathbias_should_count(circ)) { - return; - } - - /* Don't count cannibalized/reused circs for path bias - * "build" success, since they get counted under "use" success. */ - if (!circ->has_opened) { - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } - - if (guard) { - if (circ->path_state == PATH_STATE_BUILD_ATTEMPTED) { - circ->path_state = PATH_STATE_BUILD_SUCCEEDED; - guard->circ_successes++; - entry_guards_changed(); - - log_info(LD_CIRC, "Got success count %f/%f for guard %s ($%s)", - guard->circ_successes, guard->circ_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - } else { - if ((rate_msg = rate_limit_log(&success_notice_limit, - approx_time()))) { - log_info(LD_BUG, - "Succeeded circuit is in strange path state %s. " - "Circuit is a %s currently %s.%s", - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - - if (guard->circ_attempts < guard->circ_successes) { - log_notice(LD_BUG, "Unexpectedly high successes counts (%f/%f) " - "for guard %s ($%s)", - guard->circ_successes, guard->circ_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - } - /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to - * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here. - * No need to log that case. */ - } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - if ((rate_msg = rate_limit_log(&success_notice_limit, - approx_time()))) { - log_info(LD_CIRC, - "Completed circuit has no known guard. " - "Circuit is a %s currently %s.%s", - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - } else { - if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) { - if ((rate_msg = rate_limit_log(&success_notice_limit, - approx_time()))) { - log_info(LD_BUG, - "Opened circuit is in strange path state %s. " - "Circuit is a %s currently %s.%s", - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state), - rate_msg); - tor_free(rate_msg); - } - } - } -} - -/** - * Record an attempt to use a circuit. Changes the circuit's - * path state and update its guard's usage counter. - * - * Used for path bias usage accounting. - */ -void -pathbias_count_use_attempt(origin_circuit_t *circ) -{ - entry_guard_t *guard; - - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->path_state < PATH_STATE_BUILD_SUCCEEDED) { - log_notice(LD_BUG, - "Used circuit is in strange path state %s. " - "Circuit is a %s currently %s.", - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } else if (circ->path_state < PATH_STATE_USE_ATTEMPTED) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - if (guard) { - pathbias_measure_use_rate(guard); - pathbias_scale_use_rates(guard); - guard->use_attempts++; - entry_guards_changed(); - - log_debug(LD_CIRC, - "Marked circuit %d (%f/%f) as used for guard %s ($%s).", - circ->global_identifier, - guard->use_successes, guard->use_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - } - - circ->path_state = PATH_STATE_USE_ATTEMPTED; - } else { - /* Harmless but educational log message */ - log_info(LD_CIRC, - "Used circuit %d is already in path state %s. " - "Circuit is a %s currently %s.", - circ->global_identifier, - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } - - return; -} - -/** - * Check the circuit's path state is appropriate and mark it as - * successfully used. Used for path bias usage accounting. - * - * We don't actually increment the guard's counters until - * pathbias_check_close(), because the circuit can still transition - * back to PATH_STATE_USE_ATTEMPTED if a stream fails later (this - * is done so we can probe the circuit for liveness at close). - */ -void -pathbias_mark_use_success(origin_circuit_t *circ) -{ - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->path_state < PATH_STATE_USE_ATTEMPTED) { - log_notice(LD_BUG, - "Used circuit %d is in strange path state %s. " - "Circuit is a %s currently %s.", - circ->global_identifier, - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - - pathbias_count_use_attempt(circ); - } - - /* We don't do any accounting at the guard until actual circuit close */ - circ->path_state = PATH_STATE_USE_SUCCEEDED; - - return; -} - -/** - * If a stream ever detatches from a circuit in a retriable way, - * we need to mark this circuit as still needing either another - * successful stream, or in need of a probe. - * - * An adversary could let the first stream request succeed (ie the - * resolve), but then tag and timeout the remainder (via cell - * dropping), forcing them on new circuits. - * - * Rolling back the state will cause us to probe such circuits, which - * should lead to probe failures in the event of such tagging due to - * either unrecognized cells coming in while we wait for the probe, - * or the cipher state getting out of sync in the case of dropped cells. - */ -void -pathbias_mark_use_rollback(origin_circuit_t *circ) -{ - if (circ->path_state == PATH_STATE_USE_SUCCEEDED) { - log_info(LD_CIRC, - "Rolling back pathbias use state to 'attempted' for detached " - "circuit %d", circ->global_identifier); - circ->path_state = PATH_STATE_USE_ATTEMPTED; - } -} - -/** - * Actually count a circuit success towards a guard's usage counters - * if the path state is appropriate. - */ -static void -pathbias_count_use_success(origin_circuit_t *circ) -{ - entry_guard_t *guard; - - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->path_state != PATH_STATE_USE_SUCCEEDED) { - log_notice(LD_BUG, - "Successfully used circuit %d is in strange path state %s. " - "Circuit is a %s currently %s.", - circ->global_identifier, - pathbias_state_to_string(circ->path_state), - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } else { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - if (guard) { - guard->use_successes++; - entry_guards_changed(); - - if (guard->use_attempts < guard->use_successes) { - log_notice(LD_BUG, "Unexpectedly high use successes counts (%f/%f) " - "for guard %s=%s", - guard->use_successes, guard->use_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - } - - log_debug(LD_CIRC, - "Marked circuit %d (%f/%f) as used successfully for guard " - "%s ($%s).", - circ->global_identifier, guard->use_successes, - guard->use_attempts, guard->nickname, - hex_str(guard->identity, DIGEST_LEN)); - } - } - - return; -} - -/** - * Send a probe down a circuit that the client attempted to use, - * but for which the stream timed out/failed. The probe is a - * RELAY_BEGIN cell with a 0.a.b.c destination address, which - * the exit will reject and reply back, echoing that address. - * - * The reason for such probes is because it is possible to bias - * a user's paths simply by causing timeouts, and these timeouts - * are not possible to differentiate from unresponsive servers. - * - * The probe is sent at the end of the circuit lifetime for two - * reasons: to prevent cryptographic taggers from being able to - * drop cells to cause timeouts, and to prevent easy recognition - * of probes before any real client traffic happens. - * - * Returns -1 if we couldn't probe, 0 otherwise. - */ -static int -pathbias_send_usable_probe(circuit_t *circ) -{ - /* Based on connection_ap_handshake_send_begin() */ - char payload[CELL_PAYLOAD_SIZE]; - int payload_len; - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - crypt_path_t *cpath_layer = NULL; - char *probe_nonce = NULL; - - tor_assert(ocirc); - - cpath_layer = ocirc->cpath->prev; - - if (cpath_layer->state != CPATH_STATE_OPEN) { - /* This can happen for cannibalized circuits. Their - * last hop isn't yet open */ - log_info(LD_CIRC, - "Got pathbias probe request for unopened circuit %d. " - "Opened %d, len %d", ocirc->global_identifier, - ocirc->has_opened, ocirc->build_state->desired_path_len); - return -1; - } - - /* We already went down this road. */ - if (circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING && - ocirc->pathbias_probe_id) { - log_info(LD_CIRC, - "Got pathbias probe request for circuit %d with " - "outstanding probe", ocirc->global_identifier); - return -1; - } - - /* Can't probe if the channel isn't open */ - if (circ->n_chan == NULL || - (circ->n_chan->state != CHANNEL_STATE_OPEN - && circ->n_chan->state != CHANNEL_STATE_MAINT)) { - log_info(LD_CIRC, - "Skipping pathbias probe for circuit %d: Channel is not open.", - ocirc->global_identifier); - return -1; - } - - circuit_change_purpose(circ, CIRCUIT_PURPOSE_PATH_BIAS_TESTING); - - /* Update timestamp for when circuit_expire_building() should kill us */ - tor_gettimeofday(&circ->timestamp_began); - - /* Generate a random address for the nonce */ - crypto_rand((char*)ô->pathbias_probe_nonce, - sizeof(ocirc->pathbias_probe_nonce)); - ocirc->pathbias_probe_nonce &= 0x00ffffff; - probe_nonce = tor_dup_ip(ocirc->pathbias_probe_nonce); - - tor_snprintf(payload,RELAY_PAYLOAD_SIZE, "%s:25", probe_nonce); - payload_len = (int)strlen(payload)+1; - - // XXX: need this? Can we assume ipv4 will always be supported? - // If not, how do we tell? - //if (payload_len <= RELAY_PAYLOAD_SIZE - 4 && edge_conn->begincell_flags) { - // set_uint32(payload + payload_len, htonl(edge_conn->begincell_flags)); - // payload_len += 4; - //} - - /* Generate+Store stream id, make sure it's non-zero */ - ocirc->pathbias_probe_id = get_unique_stream_id_by_circ(ocirc); - - if (ocirc->pathbias_probe_id==0) { - log_warn(LD_CIRC, - "Ran out of stream IDs on circuit %u during " - "pathbias probe attempt.", ocirc->global_identifier); - tor_free(probe_nonce); - return -1; - } - - log_info(LD_CIRC, - "Sending pathbias testing cell to %s:25 on stream %d for circ %d.", - probe_nonce, ocirc->pathbias_probe_id, ocirc->global_identifier); - tor_free(probe_nonce); - - /* Send a test relay cell */ - if (relay_send_command_from_edge(ocirc->pathbias_probe_id, circ, - RELAY_COMMAND_BEGIN, payload, - payload_len, cpath_layer) < 0) { - log_notice(LD_CIRC, - "Failed to send pathbias probe cell on circuit %d.", - ocirc->global_identifier); - return -1; - } - - /* Mark it freshly dirty so it doesn't get expired in the meantime */ - circ->timestamp_dirty = time(NULL); - - return 0; -} - -/** - * Check the response to a pathbias probe, to ensure the - * cell is recognized and the nonce and other probe - * characteristics are as expected. - * - * If the response is valid, return 0. Otherwise return < 0. - */ -int -pathbias_check_probe_response(circuit_t *circ, const cell_t *cell) -{ - /* Based on connection_edge_process_relay_cell() */ - relay_header_t rh; - int reason; - uint32_t ipv4_host; - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - - tor_assert(cell); - tor_assert(ocirc); - tor_assert(circ->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING); - - relay_header_unpack(&rh, cell->payload); - - reason = rh.length > 0 ? - get_uint8(cell->payload+RELAY_HEADER_SIZE) : END_STREAM_REASON_MISC; - - if (rh.command == RELAY_COMMAND_END && - reason == END_STREAM_REASON_EXITPOLICY && - ocirc->pathbias_probe_id == rh.stream_id) { - - /* Check length+extract host: It is in network order after the reason code. - * See connection_edge_end(). */ - if (rh.length < 9) { /* reason+ipv4+dns_ttl */ - log_notice(LD_PROTOCOL, - "Short path bias probe response length field (%d).", rh.length); - return - END_CIRC_REASON_TORPROTOCOL; - } - - ipv4_host = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+1)); - - /* Check nonce */ - if (ipv4_host == ocirc->pathbias_probe_nonce) { - pathbias_mark_use_success(ocirc); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - log_info(LD_CIRC, - "Got valid path bias probe back for circ %d, stream %d.", - ocirc->global_identifier, ocirc->pathbias_probe_id); - return 0; - } else { - log_notice(LD_CIRC, - "Got strange probe value 0x%x vs 0x%x back for circ %d, " - "stream %d.", ipv4_host, ocirc->pathbias_probe_nonce, - ocirc->global_identifier, ocirc->pathbias_probe_id); - return -1; - } - } - log_info(LD_CIRC, - "Got another cell back back on pathbias probe circuit %d: " - "Command: %d, Reason: %d, Stream-id: %d", - ocirc->global_identifier, rh.command, reason, rh.stream_id); - return -1; -} - -/** - * Check if a circuit was used and/or closed successfully. - * - * If we attempted to use the circuit to carry a stream but failed - * for whatever reason, or if the circuit mysteriously died before - * we could attach any streams, record these two cases. - * - * If we *have* successfully used the circuit, or it appears to - * have been closed by us locally, count it as a success. - * - * Returns 0 if we're done making decisions with the circ, - * or -1 if we want to probe it first. - */ -int -pathbias_check_close(origin_circuit_t *ocirc, int reason) -{ - circuit_t *circ = ô->base_; - - if (!pathbias_should_count(ocirc)) { - return 0; - } - - switch (ocirc->path_state) { - /* If the circuit was closed after building, but before use, we need - * to ensure we were the ones who tried to close it (and not a remote - * actor). */ - case PATH_STATE_BUILD_SUCCEEDED: - if (reason & END_CIRC_REASON_FLAG_REMOTE) { - /* Remote circ close reasons on an unused circuit all could be bias */ - log_info(LD_CIRC, - "Circuit %d remote-closed without successful use for reason %d. " - "Circuit purpose %d currently %d,%s. Len %d.", - ocirc->global_identifier, - reason, circ->purpose, ocirc->has_opened, - circuit_state_to_string(circ->state), - ocirc->build_state->desired_path_len); - pathbias_count_collapse(ocirc); - } else if ((reason & ~END_CIRC_REASON_FLAG_REMOTE) - == END_CIRC_REASON_CHANNEL_CLOSED && - circ->n_chan && - circ->n_chan->reason_for_closing - != CHANNEL_CLOSE_REQUESTED) { - /* If we didn't close the channel ourselves, it could be bias */ - /* XXX: Only count bias if the network is live? - * What about clock jumps/suspends? */ - log_info(LD_CIRC, - "Circuit %d's channel closed without successful use for reason " - "%d, channel reason %d. Circuit purpose %d currently %d,%s. Len " - "%d.", ocirc->global_identifier, - reason, circ->n_chan->reason_for_closing, - circ->purpose, ocirc->has_opened, - circuit_state_to_string(circ->state), - ocirc->build_state->desired_path_len); - pathbias_count_collapse(ocirc); - } else { - pathbias_count_successful_close(ocirc); - } - break; - - /* If we tried to use a circuit but failed, we should probe it to ensure - * it has not been tampered with. */ - case PATH_STATE_USE_ATTEMPTED: - /* XXX: Only probe and/or count failure if the network is live? - * What about clock jumps/suspends? */ - if (pathbias_send_usable_probe(circ) == 0) - return -1; - else - pathbias_count_use_failed(ocirc); - - /* Any circuit where there were attempted streams but no successful - * streams could be bias */ - log_info(LD_CIRC, - "Circuit %d closed without successful use for reason %d. " - "Circuit purpose %d currently %d,%s. Len %d.", - ocirc->global_identifier, - reason, circ->purpose, ocirc->has_opened, - circuit_state_to_string(circ->state), - ocirc->build_state->desired_path_len); - break; - - case PATH_STATE_USE_SUCCEEDED: - pathbias_count_successful_close(ocirc); - pathbias_count_use_success(ocirc); - break; - - case PATH_STATE_USE_FAILED: - pathbias_count_use_failed(ocirc); - break; - - case PATH_STATE_NEW_CIRC: - case PATH_STATE_BUILD_ATTEMPTED: - case PATH_STATE_ALREADY_COUNTED: - default: - // Other states are uninteresting. No stats to count. - break; - } - - ocirc->path_state = PATH_STATE_ALREADY_COUNTED; - - return 0; -} - -/** - * Count a successfully closed circuit. - */ -static void -pathbias_count_successful_close(origin_circuit_t *circ) -{ - entry_guard_t *guard = NULL; - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } - - if (guard) { - /* In the long run: circuit_success ~= successful_circuit_close + - * circ_failure + stream_failure */ - guard->successful_circuits_closed++; - entry_guards_changed(); - } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to - * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here. - * No need to log that case. */ - log_info(LD_CIRC, - "Successfully closed circuit has no known guard. " - "Circuit is a %s currently %s", - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } -} - -/** - * Count a circuit that fails after it is built, but before it can - * carry any traffic. - * - * This is needed because there are ways to destroy a - * circuit after it has successfully completed. Right now, this is - * used for purely informational/debugging purposes. - */ -static void -pathbias_count_collapse(origin_circuit_t *circ) -{ - entry_guard_t *guard = NULL; - - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } - - if (guard) { - guard->collapsed_circuits++; - entry_guards_changed(); - } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to - * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here. - * No need to log that case. */ - log_info(LD_CIRC, - "Destroyed circuit has no known guard. " - "Circuit is a %s currently %s", - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } -} - -/** - * Count a known failed circuit (because we could not probe it). - * - * This counter is informational. - */ -static void -pathbias_count_use_failed(origin_circuit_t *circ) -{ - entry_guard_t *guard = NULL; - if (!pathbias_should_count(circ)) { - return; - } - - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } - - if (guard) { - guard->unusable_circuits++; - entry_guards_changed(); - } else if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - /* In rare cases, CIRCUIT_PURPOSE_TESTING can get converted to - * CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT and have no guards here. - * No need to log that case. */ - /* XXX note cut-and-paste code in this function compared to nearby - * functions. Would be nice to refactor. -RD */ - log_info(LD_CIRC, - "Stream-failing circuit has no known guard. " - "Circuit is a %s currently %s", - circuit_purpose_to_string(circ->base_.purpose), - circuit_state_to_string(circ->base_.state)); - } -} - -/** - * Count timeouts for path bias log messages. - * - * These counts are purely informational. - */ -void -pathbias_count_timeout(origin_circuit_t *circ) -{ - entry_guard_t *guard = NULL; - - if (!pathbias_should_count(circ)) { - return; - } - - /* For hidden service circs, they can actually be used - * successfully and then time out later (because - * the other side declines to use them). */ - if (circ->path_state == PATH_STATE_USE_SUCCEEDED) { - return; - } - - if (circ->cpath && circ->cpath->extend_info) { - guard = entry_guard_get_by_id_digest( - circ->cpath->extend_info->identity_digest); - } - - if (guard) { - guard->timeouts++; - entry_guards_changed(); - } -} - -/** - * Helper function to count all of the currently opened circuits - * for a guard that are in a given path state range. The state - * range is inclusive on both ends. - */ -static int -pathbias_count_circs_in_states(entry_guard_t *guard, - path_state_t from, - path_state_t to) -{ - circuit_t *circ; - int open_circuits = 0; - - /* Count currently open circuits. Give them the benefit of the doubt. */ - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - origin_circuit_t *ocirc = NULL; - if (!CIRCUIT_IS_ORIGIN(circ) || /* didn't originate here */ - circ->marked_for_close) /* already counted */ - continue; - - ocirc = TO_ORIGIN_CIRCUIT(circ); - - if (!ocirc->cpath || !ocirc->cpath->extend_info) - continue; - - if (ocirc->path_state >= from && - ocirc->path_state <= to && - pathbias_should_count(ocirc) && - fast_memeq(guard->identity, - ocirc->cpath->extend_info->identity_digest, - DIGEST_LEN)) { - log_debug(LD_CIRC, "Found opened circuit %d in path_state %s", - ocirc->global_identifier, - pathbias_state_to_string(ocirc->path_state)); - open_circuits++; - } - } - - return open_circuits; -} - -/** - * Return the number of circuits counted as successfully closed for - * this guard. - * - * Also add in the currently open circuits to give them the benefit - * of the doubt. - */ -double -pathbias_get_close_success_count(entry_guard_t *guard) -{ - return guard->successful_circuits_closed + - pathbias_count_circs_in_states(guard, - PATH_STATE_BUILD_SUCCEEDED, - PATH_STATE_USE_SUCCEEDED); -} - -/** - * Return the number of circuits counted as successfully used - * this guard. - * - * Also add in the currently open circuits that we are attempting - * to use to give them the benefit of the doubt. - */ -double -pathbias_get_use_success_count(entry_guard_t *guard) -{ - return guard->use_successes + - pathbias_count_circs_in_states(guard, - PATH_STATE_USE_ATTEMPTED, - PATH_STATE_USE_SUCCEEDED); -} - -/** - * Check the path bias use rate against our consensus parameter limits. - * - * Emits a log message if the use success rates are too low. - * - * If pathbias_get_dropguards() is set, we also disable the use of - * very failure prone guards. - */ -static void -pathbias_measure_use_rate(entry_guard_t *guard) -{ - const or_options_t *options = get_options(); - - if (guard->use_attempts > pathbias_get_min_use(options)) { - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (pathbias_get_use_success_count(guard)/guard->use_attempts - < pathbias_get_extreme_use_rate(options)) { - /* Dropping is currently disabled by default. */ - if (pathbias_get_dropguards(options)) { - if (!guard->path_bias_disabled) { - log_warn(LD_CIRC, - "Your Guard %s ($%s) is failing to carry an extremely large " - "amount of stream on its circuits. " - "To avoid potential route manipulation attacks, Tor has " - "disabled use of this guard. " - "Use counts are %ld/%ld. Success counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - guard->path_bias_disabled = 1; - guard->bad_since = approx_time(); - entry_guards_changed(); - return; - } - } else if (!guard->path_bias_use_extreme) { - guard->path_bias_use_extreme = 1; - log_warn(LD_CIRC, - "Your Guard %s ($%s) is failing to carry an extremely large " - "amount of streams on its circuits. " - "This could indicate a route manipulation attack, network " - "overload, bad local network connectivity, or a bug. " - "Use counts are %ld/%ld. Success counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - } - } else if (pathbias_get_use_success_count(guard)/guard->use_attempts - < pathbias_get_notice_use_rate(options)) { - if (!guard->path_bias_use_noticed) { - guard->path_bias_use_noticed = 1; - log_notice(LD_CIRC, - "Your Guard %s ($%s) is failing to carry more streams on its " - "circuits than usual. " - "Most likely this means the Tor network is overloaded " - "or your network connection is poor. " - "Use counts are %ld/%ld. Success counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - } - } - } -} - -/** - * Check the path bias circuit close status rates against our consensus - * parameter limits. - * - * Emits a log message if the use success rates are too low. - * - * If pathbias_get_dropguards() is set, we also disable the use of - * very failure prone guards. - * - * XXX: This function shares similar log messages and checks to - * pathbias_measure_use_rate(). It may be possible to combine them - * eventually, especially if we can ever remove the need for 3 - * levels of closure warns (if the overall circuit failure rate - * goes down with ntor). One way to do so would be to multiply - * the build rate with the use rate to get an idea of the total - * fraction of the total network paths the user is able to use. - * See ticket #8159. - */ -static void -pathbias_measure_close_rate(entry_guard_t *guard) -{ - const or_options_t *options = get_options(); - - if (guard->circ_attempts > pathbias_get_min_circs(options)) { - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (pathbias_get_close_success_count(guard)/guard->circ_attempts - < pathbias_get_extreme_rate(options)) { - /* Dropping is currently disabled by default. */ - if (pathbias_get_dropguards(options)) { - if (!guard->path_bias_disabled) { - log_warn(LD_CIRC, - "Your Guard %s ($%s) is failing an extremely large " - "amount of circuits. " - "To avoid potential route manipulation attacks, Tor has " - "disabled use of this guard. " - "Success counts are %ld/%ld. Use counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - guard->path_bias_disabled = 1; - guard->bad_since = approx_time(); - entry_guards_changed(); - return; - } - } else if (!guard->path_bias_extreme) { - guard->path_bias_extreme = 1; - log_warn(LD_CIRC, - "Your Guard %s ($%s) is failing an extremely large " - "amount of circuits. " - "This could indicate a route manipulation attack, " - "extreme network overload, or a bug. " - "Success counts are %ld/%ld. Use counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - } - } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts - < pathbias_get_warn_rate(options)) { - if (!guard->path_bias_warned) { - guard->path_bias_warned = 1; - log_warn(LD_CIRC, - "Your Guard %s ($%s) is failing a very large " - "amount of circuits. " - "Most likely this means the Tor network is " - "overloaded, but it could also mean an attack against " - "you or potentially the guard itself. " - "Success counts are %ld/%ld. Use counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - } - } else if (pathbias_get_close_success_count(guard)/guard->circ_attempts - < pathbias_get_notice_rate(options)) { - if (!guard->path_bias_noticed) { - guard->path_bias_noticed = 1; - log_notice(LD_CIRC, - "Your Guard %s ($%s) is failing more circuits than " - "usual. " - "Most likely this means the Tor network is overloaded. " - "Success counts are %ld/%ld. Use counts are %ld/%ld. " - "%ld circuits completed, %ld were unusable, %ld collapsed, " - "and %ld timed out. " - "For reference, your timeout cutoff is %ld seconds.", - guard->nickname, hex_str(guard->identity, DIGEST_LEN), - tor_lround(pathbias_get_close_success_count(guard)), - tor_lround(guard->circ_attempts), - tor_lround(pathbias_get_use_success_count(guard)), - tor_lround(guard->use_attempts), - tor_lround(guard->circ_successes), - tor_lround(guard->unusable_circuits), - tor_lround(guard->collapsed_circuits), - tor_lround(guard->timeouts), - tor_lround(get_circuit_build_close_time_ms()/1000)); - } - } - } -} - -/** - * This function scales the path bias use rates if we have - * more data than the scaling threshold. This allows us to - * be more sensitive to recent measurements. - * - * XXX: The attempt count transfer stuff here might be done - * better by keeping separate pending counters that get - * transfered at circuit close. See ticket #8160. - */ -static void -pathbias_scale_close_rates(entry_guard_t *guard) -{ - const or_options_t *options = get_options(); - - /* If we get a ton of circuits, just scale everything down */ - if (guard->circ_attempts > pathbias_get_scale_threshold(options)) { - double scale_ratio = pathbias_get_scale_ratio(options); - int opened_attempts = pathbias_count_circs_in_states(guard, - PATH_STATE_BUILD_ATTEMPTED, PATH_STATE_BUILD_ATTEMPTED); - int opened_built = pathbias_count_circs_in_states(guard, - PATH_STATE_BUILD_SUCCEEDED, - PATH_STATE_USE_FAILED); - /* Verify that the counts are sane before and after scaling */ - int counts_are_sane = (guard->circ_attempts >= guard->circ_successes); - - guard->circ_attempts -= (opened_attempts+opened_built); - guard->circ_successes -= opened_built; - - guard->circ_attempts *= scale_ratio; - guard->circ_successes *= scale_ratio; - guard->timeouts *= scale_ratio; - guard->successful_circuits_closed *= scale_ratio; - guard->collapsed_circuits *= scale_ratio; - guard->unusable_circuits *= scale_ratio; - - guard->circ_attempts += (opened_attempts+opened_built); - guard->circ_successes += opened_built; - - entry_guards_changed(); - - log_info(LD_CIRC, - "Scaled pathbias counts to (%f,%f)/%f (%d/%d open) for guard " - "%s ($%s)", - guard->circ_successes, guard->successful_circuits_closed, - guard->circ_attempts, opened_built, opened_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - - /* Have the counts just become invalid by this scaling attempt? */ - if (counts_are_sane && guard->circ_attempts < guard->circ_successes) { - log_notice(LD_BUG, - "Scaling has mangled pathbias counts to %f/%f (%d/%d open) " - "for guard %s ($%s)", - guard->circ_successes, guard->circ_attempts, opened_built, - opened_attempts, guard->nickname, - hex_str(guard->identity, DIGEST_LEN)); - } - } -} - -/** - * This function scales the path bias circuit close rates if we have - * more data than the scaling threshold. This allows us to be more - * sensitive to recent measurements. - * - * XXX: The attempt count transfer stuff here might be done - * better by keeping separate pending counters that get - * transfered at circuit close. See ticket #8160. - */ -void -pathbias_scale_use_rates(entry_guard_t *guard) -{ - const or_options_t *options = get_options(); - - /* If we get a ton of circuits, just scale everything down */ - if (guard->use_attempts > pathbias_get_scale_use_threshold(options)) { - double scale_ratio = pathbias_get_scale_ratio(options); - int opened_attempts = pathbias_count_circs_in_states(guard, - PATH_STATE_USE_ATTEMPTED, PATH_STATE_USE_SUCCEEDED); - /* Verify that the counts are sane before and after scaling */ - int counts_are_sane = (guard->use_attempts >= guard->use_successes); - - guard->use_attempts -= opened_attempts; - - guard->use_attempts *= scale_ratio; - guard->use_successes *= scale_ratio; - - guard->use_attempts += opened_attempts; - - log_info(LD_CIRC, - "Scaled pathbias use counts to %f/%f (%d open) for guard %s ($%s)", - guard->use_successes, guard->use_attempts, opened_attempts, - guard->nickname, hex_str(guard->identity, DIGEST_LEN)); - - /* Have the counts just become invalid by this scaling attempt? */ - if (counts_are_sane && guard->use_attempts < guard->use_successes) { - log_notice(LD_BUG, - "Scaling has mangled pathbias usage counts to %f/%f " - "(%d open) for guard %s ($%s)", - guard->circ_successes, guard->circ_attempts, - opened_attempts, guard->nickname, - hex_str(guard->identity, DIGEST_LEN)); - } - - entry_guards_changed(); - } -} - diff --git a/src/tor/circpathbias.h b/src/tor/circpathbias.h deleted file mode 100644 index c95d801a4..000000000 --- a/src/tor/circpathbias.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitbuild.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_CIRCPATHBIAS_H -#define TOR_CIRCPATHBIAS_H - -double pathbias_get_extreme_rate(const or_options_t *options); -double pathbias_get_extreme_use_rate(const or_options_t *options); -int pathbias_get_dropguards(const or_options_t *options); -void pathbias_count_timeout(origin_circuit_t *circ); -void pathbias_count_build_success(origin_circuit_t *circ); -int pathbias_count_build_attempt(origin_circuit_t *circ); -int pathbias_check_close(origin_circuit_t *circ, int reason); -int pathbias_check_probe_response(circuit_t *circ, const cell_t *cell); -void pathbias_count_use_attempt(origin_circuit_t *circ); -void pathbias_mark_use_success(origin_circuit_t *circ); -void pathbias_mark_use_rollback(origin_circuit_t *circ); -const char *pathbias_state_to_string(path_state_t state); - -#endif - diff --git a/src/tor/circuitbuild.c b/src/tor/circuitbuild.c deleted file mode 100644 index aeeea47c2..000000000 --- a/src/tor/circuitbuild.c +++ /dev/null @@ -1,2200 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitbuild.c - * \brief The actual details of building circuits. - **/ - -#include "or.h" -#include "channel.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "circuituse.h" -#include "command.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "directory.h" -#include "entrynodes.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "onion.h" -#include "onion_tap.h" -#include "onion_fast.h" -#include "policies.h" -#include "transports.h" -#include "relay.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "crypto.h" - -#ifndef MIN -#define MIN(a,b) ((a)<(b)?(a):(b)) -#endif - -static channel_t * channel_connect_for_circuit(const tor_addr_t *addr, - uint16_t port, - const char *id_digest); -static int circuit_deliver_create_cell(circuit_t *circ, - const create_cell_t *create_cell, - int relayed); -static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit); -static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath); -static int onion_extend_cpath(origin_circuit_t *circ); -static int count_acceptable_nodes(smartlist_t *routers); -static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); -#ifdef CURVE25519_ENABLED -static int circuits_can_use_ntor(void); -#endif - -/** This function tries to get a channel to the specified endpoint, - * and then calls command_setup_channel() to give it the right - * callbacks. - */ -static channel_t * -channel_connect_for_circuit(const tor_addr_t *addr, uint16_t port, - const char *id_digest) -{ - channel_t *chan; - - chan = channel_connect(addr, port, id_digest); - if (chan) command_setup_channel(chan); - - return chan; -} - -/** Iterate over values of circ_id, starting from conn-\>next_circ_id, - * and with the high bit specified by conn-\>circ_id_type, until we get - * a circ_id that is not in use by any other circuit on that conn. - * - * Return it, or 0 if can't get a unique circ_id. - */ -static circid_t -get_unique_circ_id_by_chan(channel_t *chan) -{ - circid_t test_circ_id; - circid_t attempts=0; - circid_t high_bit, max_range; - - tor_assert(chan); - - if (chan->circ_id_type == CIRC_ID_TYPE_NEITHER) { - log_warn(LD_BUG, - "Trying to pick a circuit ID for a connection from " - "a client with no identity."); - return 0; - } - max_range = (chan->wide_circ_ids) ? (1u<<31) : (1u<<15); - high_bit = (chan->circ_id_type == CIRC_ID_TYPE_HIGHER) ? max_range : 0; - do { - /* Sequentially iterate over test_circ_id=1...max_range until we find a - * circID such that (high_bit|test_circ_id) is not already used. */ - test_circ_id = chan->next_circ_id++; - if (test_circ_id == 0 || test_circ_id >= max_range) { - test_circ_id = 1; - chan->next_circ_id = 2; - } - if (++attempts > max_range) { - /* Make sure we don't loop forever if all circ_id's are used. This - * matters because it's an external DoS opportunity. - */ - log_warn(LD_CIRC,"No unused circ IDs. Failing."); - return 0; - } - test_circ_id |= high_bit; - } while (circuit_id_in_use_on_channel(test_circ_id, chan)); - return test_circ_id; -} - -/** If verbose is false, allocate and return a comma-separated list of - * the currently built elements of circ. If verbose is true, also - * list information about link status in a more verbose format using spaces. - * If verbose_names is false, give nicknames for Named routers and hex - * digests for others; if verbose_names is true, use $DIGEST=Name style - * names. - */ -static char * -circuit_list_path_impl(origin_circuit_t *circ, int verbose, int verbose_names) -{ - crypt_path_t *hop; - smartlist_t *elements; - const char *states[] = {"closed", "waiting for keys", "open"}; - char *s; - - elements = smartlist_new(); - - if (verbose) { - const char *nickname = build_state_get_exit_nickname(circ->build_state); - smartlist_add_asprintf(elements, "%s%s circ (length %d%s%s):", - circ->build_state->is_internal ? "internal" : "exit", - circ->build_state->need_uptime ? " (high-uptime)" : "", - circ->build_state->desired_path_len, - circ->base_.state == CIRCUIT_STATE_OPEN ? "" : ", last hop ", - circ->base_.state == CIRCUIT_STATE_OPEN ? "" : - (nickname?nickname:"*unnamed*")); - } - - hop = circ->cpath; - do { - char *elt; - const char *id; - const node_t *node; - if (!hop) - break; - if (!verbose && hop->state != CPATH_STATE_OPEN) - break; - if (!hop->extend_info) - break; - id = hop->extend_info->identity_digest; - if (verbose_names) { - elt = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1); - if ((node = node_get_by_id(id))) { - node_get_verbose_nickname(node, elt); - } else if (is_legal_nickname(hop->extend_info->nickname)) { - elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); - elt[HEX_DIGEST_LEN+1]= '~'; - strlcpy(elt+HEX_DIGEST_LEN+2, - hop->extend_info->nickname, MAX_NICKNAME_LEN+1); - } else { - elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); - } - } else { /* ! verbose_names */ - node = node_get_by_id(id); - if (node && node_is_named(node)) { - elt = tor_strdup(node_get_nickname(node)); - } else { - elt = tor_malloc(HEX_DIGEST_LEN+2); - elt[0] = '$'; - base16_encode(elt+1, HEX_DIGEST_LEN+1, id, DIGEST_LEN); - } - } - tor_assert(elt); - if (verbose) { - tor_assert(hop->state <= 2); - smartlist_add_asprintf(elements,"%s(%s)",elt,states[hop->state]); - tor_free(elt); - } else { - smartlist_add(elements, elt); - } - hop = hop->next; - } while (hop != circ->cpath); - - s = smartlist_join_strings(elements, verbose?" ":",", 0, NULL); - SMARTLIST_FOREACH(elements, char*, cp, tor_free(cp)); - smartlist_free(elements); - return s; -} - -/** If verbose is false, allocate and return a comma-separated - * list of the currently built elements of circ. If - * verbose is true, also list information about link status in - * a more verbose format using spaces. - */ -char * -circuit_list_path(origin_circuit_t *circ, int verbose) -{ - return circuit_list_path_impl(circ, verbose, 0); -} - -/** Allocate and return a comma-separated list of the currently built elements - * of circ, giving each as a verbose nickname. - */ -char * -circuit_list_path_for_controller(origin_circuit_t *circ) -{ - return circuit_list_path_impl(circ, 0, 1); -} - -/** Log, at severity severity, the nicknames of each router in - * circ's cpath. Also log the length of the cpath, and the intended - * exit point. - */ -void -circuit_log_path(int severity, unsigned int domain, origin_circuit_t *circ) -{ - char *s = circuit_list_path(circ,1); - tor_log(severity,domain,"%s",s); - tor_free(s); -} - -/** Tell the rep(utation)hist(ory) module about the status of the links - * in circ. Hops that have become OPEN are marked as successfully - * extended; the _first_ hop that isn't open (if any) is marked as - * unable to extend. - */ -/* XXXX Someday we should learn from OR circuits too. */ -void -circuit_rep_hist_note_result(origin_circuit_t *circ) -{ - crypt_path_t *hop; - const char *prev_digest = NULL; - hop = circ->cpath; - if (!hop) /* circuit hasn't started building yet. */ - return; - if (server_mode(get_options())) { - const routerinfo_t *me = router_get_my_routerinfo(); - if (!me) - return; - prev_digest = me->cache_info.identity_digest; - } - do { - const node_t *node = node_get_by_id(hop->extend_info->identity_digest); - if (node) { /* Why do we check this? We know the identity. -NM XXXX */ - if (prev_digest) { - if (hop->state == CPATH_STATE_OPEN) - rep_hist_note_extend_succeeded(prev_digest, node->identity); - else { - rep_hist_note_extend_failed(prev_digest, node->identity); - break; - } - } - prev_digest = node->identity; - } else { - prev_digest = NULL; - } - hop=hop->next; - } while (hop!=circ->cpath); -} - -#ifdef CURVE25519_ENABLED -/** Return 1 iff at least one node in circ's cpath supports ntor. */ -static int -circuit_cpath_supports_ntor(const origin_circuit_t *circ) -{ - crypt_path_t *head = circ->cpath, *cpath = circ->cpath; - - cpath = head; - do { - if (cpath->extend_info && - !tor_mem_is_zero( - (const char*)cpath->extend_info->curve25519_onion_key.public_key, - CURVE25519_PUBKEY_LEN)) - return 1; - - cpath = cpath->next; - } while (cpath != head); - - return 0; -} -#else -#define circuit_cpath_supports_ntor(circ) 0 -#endif - -/** Pick all the entries in our cpath. Stop and return 0 when we're - * happy, or return -1 if an error occurs. */ -static int -onion_populate_cpath(origin_circuit_t *circ) -{ - int n_tries = 0; -#ifdef CURVE25519_ENABLED - const int using_ntor = circuits_can_use_ntor(); -#else - const int using_ntor = 0; -#endif - -#define MAX_POPULATE_ATTEMPTS 32 - - while (1) { - int r = onion_extend_cpath(circ); - if (r < 0) { - log_info(LD_CIRC,"Generating cpath hop failed."); - return -1; - } - if (r == 1) { - /* This circuit doesn't need/shouldn't be forced to have an ntor hop */ - if (circ->build_state->desired_path_len <= 1 || ! using_ntor) - return 0; - - /* This circuit has an ntor hop. great! */ - if (circuit_cpath_supports_ntor(circ)) - return 0; - - /* No node in the circuit supports ntor. Have we already tried too many - * times? */ - if (++n_tries >= MAX_POPULATE_ATTEMPTS) - break; - - /* Clear the path and retry */ - circuit_clear_cpath(circ); - } - } - log_warn(LD_CIRC, "I tried for %d times, but I couldn't build a %d-hop " - "circuit with at least one node that supports ntor.", - MAX_POPULATE_ATTEMPTS, - circ->build_state->desired_path_len); - - return -1; -} - -/** Create and return a new origin circuit. Initialize its purpose and - * build-state based on our arguments. The flags argument is a - * bitfield of CIRCLAUNCH_* flags. */ -origin_circuit_t * -origin_circuit_init(uint8_t purpose, int flags) -{ - /* sets circ->p_circ_id and circ->p_chan */ - origin_circuit_t *circ = origin_circuit_new(); - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_CHAN_WAIT); - circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t)); - circ->build_state->onehop_tunnel = - ((flags & CIRCLAUNCH_ONEHOP_TUNNEL) ? 1 : 0); - circ->build_state->need_uptime = - ((flags & CIRCLAUNCH_NEED_UPTIME) ? 1 : 0); - circ->build_state->need_capacity = - ((flags & CIRCLAUNCH_NEED_CAPACITY) ? 1 : 0); - circ->build_state->is_internal = - ((flags & CIRCLAUNCH_IS_INTERNAL) ? 1 : 0); - circ->base_.purpose = purpose; - return circ; -} - -/** Build a new circuit for purpose. If exit - * is defined, then use that as your exit router, else choose a suitable - * exit node. - * - * Also launch a connection to the first OR in the chosen path, if - * it's not open already. - */ -origin_circuit_t * -circuit_establish_circuit(uint8_t purpose, extend_info_t *exit, int flags) -{ - origin_circuit_t *circ; - int err_reason = 0; - - circ = origin_circuit_init(purpose, flags); - - if (onion_pick_cpath_exit(circ, exit) < 0 || - onion_populate_cpath(circ) < 0) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOPATH); - return NULL; - } - - control_event_circuit_status(circ, CIRC_EVENT_LAUNCHED, 0); - - if ((err_reason = circuit_handle_first_hop(circ)) < 0) { - circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason); - return NULL; - } - return circ; -} - -/** Start establishing the first hop of our circuit. Figure out what - * OR we should connect to, and if necessary start the connection to - * it. If we're already connected, then send the 'create' cell. - * Return 0 for ok, -reason if circ should be marked-for-close. */ -int -circuit_handle_first_hop(origin_circuit_t *circ) -{ - crypt_path_t *firsthop; - channel_t *n_chan; - int err_reason = 0; - const char *msg = NULL; - int should_launch = 0; - - firsthop = onion_next_hop_in_cpath(circ->cpath); - tor_assert(firsthop); - tor_assert(firsthop->extend_info); - - /* now see if we're already connected to the first OR in 'route' */ - log_debug(LD_CIRC,"Looking for firsthop '%s'", - fmt_addrport(&firsthop->extend_info->addr, - firsthop->extend_info->port)); - - n_chan = channel_get_for_extend(firsthop->extend_info->identity_digest, - &firsthop->extend_info->addr, - &msg, - &should_launch); - - if (!n_chan) { - /* not currently connected in a useful way. */ - log_info(LD_CIRC, "Next router is %s: %s", - safe_str_client(extend_info_describe(firsthop->extend_info)), - msg?msg:"???"); - circ->base_.n_hop = extend_info_dup(firsthop->extend_info); - - if (should_launch) { - if (circ->build_state->onehop_tunnel) - control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DIR, 0); - n_chan = channel_connect_for_circuit( - &firsthop->extend_info->addr, - firsthop->extend_info->port, - firsthop->extend_info->identity_digest); - if (!n_chan) { /* connect failed, forget the whole thing */ - log_info(LD_CIRC,"connect to firsthop failed. Closing."); - return -END_CIRC_REASON_CONNECTFAILED; - } - } - - log_debug(LD_CIRC,"connecting in progress (or finished). Good."); - /* return success. The onion/circuit/etc will be taken care of - * automatically (may already have been) whenever n_chan reaches - * OR_CONN_STATE_OPEN. - */ - return 0; - } else { /* it's already open. use it. */ - tor_assert(!circ->base_.n_hop); - circ->base_.n_chan = n_chan; - log_debug(LD_CIRC,"Conn open. Delivering first onion skin."); - if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) { - log_info(LD_CIRC,"circuit_send_next_onion_skin failed."); - return err_reason; - } - } - return 0; -} - -/** Find any circuits that are waiting on or_conn to become - * open and get them to send their create cells forward. - * - * Status is 1 if connect succeeded, or 0 if connect failed. - */ -void -circuit_n_chan_done(channel_t *chan, int status) -{ - smartlist_t *pending_circs; - int err_reason = 0; - - tor_assert(chan); - - log_debug(LD_CIRC,"chan to %s/%s, status=%d", - chan->nickname ? chan->nickname : "NULL", - channel_get_canonical_remote_descr(chan), status); - - pending_circs = smartlist_new(); - circuit_get_all_pending_on_channel(pending_circs, chan); - - SMARTLIST_FOREACH_BEGIN(pending_circs, circuit_t *, circ) - { - /* These checks are redundant wrt get_all_pending_on_or_conn, but I'm - * leaving them in in case it's possible for the status of a circuit to - * change as we're going down the list. */ - if (circ->marked_for_close || circ->n_chan || !circ->n_hop || - circ->state != CIRCUIT_STATE_CHAN_WAIT) - continue; - - if (tor_digest_is_zero(circ->n_hop->identity_digest)) { - /* Look at addr/port. This is an unkeyed connection. */ - if (!channel_matches_extend_info(chan, circ->n_hop)) - continue; - } else { - /* We expected a key. See if it's the right one. */ - if (tor_memneq(chan->identity_digest, - circ->n_hop->identity_digest, DIGEST_LEN)) - continue; - } - if (!status) { /* chan failed; close circ */ - log_info(LD_CIRC,"Channel failed; closing circ."); - circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED); - continue; - } - log_debug(LD_CIRC, "Found circ, sending create cell."); - /* circuit_deliver_create_cell will set n_circ_id and add us to - * chan_circuid_circuit_map, so we don't need to call - * set_circid_chan here. */ - circ->n_chan = chan; - extend_info_free(circ->n_hop); - circ->n_hop = NULL; - - if (CIRCUIT_IS_ORIGIN(circ)) { - if ((err_reason = - circuit_send_next_onion_skin(TO_ORIGIN_CIRCUIT(circ))) < 0) { - log_info(LD_CIRC, - "send_next_onion_skin failed; circuit marked for closing."); - circuit_mark_for_close(circ, -err_reason); - continue; - /* XXX could this be bad, eg if next_onion_skin failed because conn - * died? */ - } - } else { - /* pull the create cell out of circ->n_chan_create_cell, and send it */ - tor_assert(circ->n_chan_create_cell); - if (circuit_deliver_create_cell(circ, circ->n_chan_create_cell, 1)<0) { - circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT); - continue; - } - tor_free(circ->n_chan_create_cell); - circuit_set_state(circ, CIRCUIT_STATE_OPEN); - } - } - SMARTLIST_FOREACH_END(circ); - - smartlist_free(pending_circs); -} - -/** Find a new circid that isn't currently in use on the circ->n_chan - * for the outgoing - * circuit circ, and deliver the cell create_cell to this - * circuit. If relayed is true, this is a create cell somebody - * gave us via an EXTEND cell, so we shouldn't worry if we don't understand - * it. Return -1 if we failed to find a suitable circid, else return 0. - */ -static int -circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, - int relayed) -{ - cell_t cell; - circid_t id; - int r; - - tor_assert(circ); - tor_assert(circ->n_chan); - tor_assert(create_cell); - tor_assert(create_cell->cell_type == CELL_CREATE || - create_cell->cell_type == CELL_CREATE_FAST || - create_cell->cell_type == CELL_CREATE2); - - id = get_unique_circ_id_by_chan(circ->n_chan); - if (!id) { - log_warn(LD_CIRC,"failed to get unique circID."); - return -1; - } - log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id); - circuit_set_n_circid_chan(circ, id, circ->n_chan); - - memset(&cell, 0, sizeof(cell_t)); - r = relayed ? create_cell_format_relayed(&cell, create_cell) - : create_cell_format(&cell, create_cell); - if (r < 0) { - log_warn(LD_CIRC,"Couldn't format create cell"); - return -1; - } - cell.circ_id = circ->n_circ_id; - - append_cell_to_circuit_queue(circ, circ->n_chan, &cell, - CELL_DIRECTION_OUT, 0); - - if (CIRCUIT_IS_ORIGIN(circ)) { - /* Update began timestamp for circuits starting their first hop */ - if (TO_ORIGIN_CIRCUIT(circ)->cpath->state == CPATH_STATE_CLOSED) { - if (circ->n_chan->state != CHANNEL_STATE_OPEN) { - log_warn(LD_CIRC, - "Got first hop for a circuit without an opened channel. " - "State: %s.", channel_state_to_string(circ->n_chan->state)); - tor_fragile_assert(); - } - - tor_gettimeofday(&circ->timestamp_began); - } - - /* mark it so it gets better rate limiting treatment. */ - channel_timestamp_client(circ->n_chan); - } - - return 0; -} - -/** We've decided to start our reachability testing. If all - * is set, log this to the user. Return 1 if we did, or 0 if - * we chose not to log anything. */ -int -inform_testing_reachability(void) -{ - char dirbuf[128]; - const routerinfo_t *me = router_get_my_routerinfo(); - if (!me) - return 0; - control_event_server_status(LOG_NOTICE, - "CHECKING_REACHABILITY ORADDRESS=%s:%d", - me->address, me->or_port); - if (me->dir_port) { - tor_snprintf(dirbuf, sizeof(dirbuf), " and DirPort %s:%d", - me->address, me->dir_port); - control_event_server_status(LOG_NOTICE, - "CHECKING_REACHABILITY DIRADDRESS=%s:%d", - me->address, me->dir_port); - } - log_notice(LD_OR, "Now checking whether ORPort %s:%d%s %s reachable... " - "(this may take up to %d minutes -- look for log " - "messages indicating success)", - me->address, me->or_port, - me->dir_port ? dirbuf : "", - me->dir_port ? "are" : "is", - TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT/60); - - return 1; -} - -/** Return true iff we should send a create_fast cell to start building a given - * circuit */ -static INLINE int -should_use_create_fast_for_circuit(origin_circuit_t *circ) -{ - const or_options_t *options = get_options(); - tor_assert(circ->cpath); - tor_assert(circ->cpath->extend_info); - - if (!circ->cpath->extend_info->onion_key) - return 1; /* our hand is forced: only a create_fast will work. */ - if (public_server_mode(options)) { - /* We're a server, and we know an onion key. We can choose. - * Prefer to blend our circuit into the other circuits we are - * creating on behalf of others. */ - return 0; - } - if (options->FastFirstHopPK == -1) { - /* option is "auto", so look at the consensus. */ - return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1); - } - - return options->FastFirstHopPK; -} - -/** Return true if circ is the type of circuit we want to count - * timeouts from. In particular, we want it to have not completed yet - * (already completing indicates we cannibalized it), and we want it to - * have exactly three hops. - */ -int -circuit_timeout_want_to_count_circ(origin_circuit_t *circ) -{ - return !circ->has_opened - && circ->build_state->desired_path_len == DEFAULT_ROUTE_LEN; -} - -#ifdef CURVE25519_ENABLED -/** Return true if the ntor handshake is enabled in the configuration, or if - * it's been set to "auto" in the configuration and it's enabled in the - * consensus. */ -static int -circuits_can_use_ntor(void) -{ - const or_options_t *options = get_options(); - if (options->UseNTorHandshake != -1) - return options->UseNTorHandshake; - return networkstatus_get_param(NULL, "UseNTorHandshake", 0, 0, 1); -} -#endif - -/** Decide whether to use a TAP or ntor handshake for connecting to ei - * directly, and set *cell_type_out and *handshake_type_out - * accordingly. */ -static void -circuit_pick_create_handshake(uint8_t *cell_type_out, - uint16_t *handshake_type_out, - const extend_info_t *ei) -{ -#ifdef CURVE25519_ENABLED - if (!tor_mem_is_zero((const char*)ei->curve25519_onion_key.public_key, - CURVE25519_PUBKEY_LEN) && - circuits_can_use_ntor()) { - *cell_type_out = CELL_CREATE2; - *handshake_type_out = ONION_HANDSHAKE_TYPE_NTOR; - return; - } -#else - (void) ei; -#endif - - *cell_type_out = CELL_CREATE; - *handshake_type_out = ONION_HANDSHAKE_TYPE_TAP; -} - -/** Decide whether to use a TAP or ntor handshake for connecting to ei - * directly, and set *handshake_type_out accordingly. Decide whether, - * in extending through node to do so, we should use an EXTEND2 or an - * EXTEND cell to do so, and set *cell_type_out and - * *create_cell_type_out accordingly. */ -static void -circuit_pick_extend_handshake(uint8_t *cell_type_out, - uint8_t *create_cell_type_out, - uint16_t *handshake_type_out, - const node_t *node_prev, - const extend_info_t *ei) -{ - uint8_t t; - circuit_pick_create_handshake(&t, handshake_type_out, ei); - /* XXXX024 The check for whether the node has a curve25519 key is a bad - * proxy for whether it can do extend2 cells; once a version that - * handles extend2 cells is out, remove it. */ - if (node_prev && - *handshake_type_out != ONION_HANDSHAKE_TYPE_TAP && - (node_has_curve25519_onion_key(node_prev) || - (node_prev->rs && node_prev->rs->version_supports_extend2_cells))) { - *cell_type_out = RELAY_COMMAND_EXTEND2; - *create_cell_type_out = CELL_CREATE2; - } else { - *cell_type_out = RELAY_COMMAND_EXTEND; - *create_cell_type_out = CELL_CREATE; - } -} - -/** This is the backbone function for building circuits. - * - * If circ's first hop is closed, then we need to build a create - * cell and send it forward. - * - * Otherwise, we need to build a relay extend cell and send it - * forward. - * - * Return -reason if we want to tear down circ, else return 0. - */ -int -circuit_send_next_onion_skin(origin_circuit_t *circ) -{ - crypt_path_t *hop; - const node_t *node; - - tor_assert(circ); - - if (circ->cpath->state == CPATH_STATE_CLOSED) { - /* This is the first hop. */ - create_cell_t cc; - int fast; - int len; - log_debug(LD_CIRC,"First skin; sending create cell."); - memset(&cc, 0, sizeof(cc)); - if (circ->build_state->onehop_tunnel) - control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0); - else - control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0); - - node = node_get_by_id(circ->base_.n_chan->identity_digest); - fast = should_use_create_fast_for_circuit(circ); - if (!fast) { - /* We are an OR and we know the right onion key: we should - * send a create cell. - */ - circuit_pick_create_handshake(&cc.cell_type, &cc.handshake_type, - circ->cpath->extend_info); - note_request("cell: create", 1); - } else { - /* We are not an OR, and we're building the first hop of a circuit to a - * new OR: we can be speedy and use CREATE_FAST to save an RSA operation - * and a DH operation. */ - cc.cell_type = CELL_CREATE_FAST; - cc.handshake_type = ONION_HANDSHAKE_TYPE_FAST; - note_request("cell: create fast", 1); - } - - len = onion_skin_create(cc.handshake_type, - circ->cpath->extend_info, - &circ->cpath->handshake_state, - cc.onionskin); - if (len < 0) { - log_warn(LD_CIRC,"onion_skin_create (first hop) failed."); - return - END_CIRC_REASON_INTERNAL; - } - cc.handshake_len = len; - - if (circuit_deliver_create_cell(TO_CIRCUIT(circ), &cc, 0) < 0) - return - END_CIRC_REASON_RESOURCELIMIT; - - circ->cpath->state = CPATH_STATE_AWAITING_KEYS; - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); - log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'", - fast ? "CREATE_FAST" : "CREATE", - node ? node_describe(node) : ""); - } else { - extend_cell_t ec; - int len; - tor_assert(circ->cpath->state == CPATH_STATE_OPEN); - tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING); - log_debug(LD_CIRC,"starting to send subsequent skin."); - hop = onion_next_hop_in_cpath(circ->cpath); - memset(&ec, 0, sizeof(ec)); - if (!hop) { - /* done building the circuit. whew. */ - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); - if (circuit_timeout_want_to_count_circ(circ)) { - struct timeval end; - long timediff; - tor_gettimeofday(&end); - timediff = tv_mdiff(&circ->base_.timestamp_began, &end); - - /* - * If the circuit build time is much greater than we would have cut - * it off at, we probably had a suspend event along this codepath, - * and we should discard the value. - */ - if (timediff < 0 || - timediff > 2*get_circuit_build_close_time_ms()+1000) { - log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. " - "Assuming clock jump. Purpose %d (%s)", timediff, - circ->base_.purpose, - circuit_purpose_to_string(circ->base_.purpose)); - } else if (!circuit_build_times_disabled()) { - /* Only count circuit times if the network is live */ - if (circuit_build_times_network_check_live( - get_circuit_build_times())) { - circuit_build_times_add_time(get_circuit_build_times_mutable(), - (build_time_t)timediff); - circuit_build_times_set_timeout(get_circuit_build_times_mutable()); - } - - if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - circuit_build_times_network_circ_success( - get_circuit_build_times_mutable()); - } - } - } - log_info(LD_CIRC,"circuit built!"); - circuit_reset_failure_count(0); - - if (circ->build_state->onehop_tunnel || circ->has_opened) { - control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0); - } - - pathbias_count_build_success(circ); - circuit_rep_hist_note_result(circ); - circuit_has_opened(circ); /* do other actions as necessary */ - - if (!can_complete_circuit && !circ->build_state->onehop_tunnel) { - const or_options_t *options = get_options(); - can_complete_circuit=1; - /* FFFF Log a count of known routers here */ - log_notice(LD_GENERAL, - "Tor has successfully opened a circuit. " - "Looks like client functionality is working."); - control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0); - control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED"); - clear_broken_connection_map(1); - if (server_mode(options) && !check_whether_orport_reachable()) { - inform_testing_reachability(); - consider_testing_reachability(1, 1); - } - } - - /* We're done with measurement circuits here. Just close them */ - if (circ->base_.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); - } - return 0; - } - - if (tor_addr_family(&hop->extend_info->addr) != AF_INET) { - log_warn(LD_BUG, "Trying to extend to a non-IPv4 address."); - return - END_CIRC_REASON_INTERNAL; - } - - { - const node_t *prev_node; - prev_node = node_get_by_id(hop->prev->extend_info->identity_digest); - circuit_pick_extend_handshake(&ec.cell_type, - &ec.create_cell.cell_type, - &ec.create_cell.handshake_type, - prev_node, - hop->extend_info); - } - - tor_addr_copy(&ec.orport_ipv4.addr, &hop->extend_info->addr); - ec.orport_ipv4.port = hop->extend_info->port; - tor_addr_make_unspec(&ec.orport_ipv6.addr); - memcpy(ec.node_id, hop->extend_info->identity_digest, DIGEST_LEN); - - len = onion_skin_create(ec.create_cell.handshake_type, - hop->extend_info, - &hop->handshake_state, - ec.create_cell.onionskin); - if (len < 0) { - log_warn(LD_CIRC,"onion_skin_create failed."); - return - END_CIRC_REASON_INTERNAL; - } - ec.create_cell.handshake_len = len; - - log_info(LD_CIRC,"Sending extend relay cell."); - note_request("cell: extend", 1); - { - uint8_t command = 0; - uint16_t payload_len=0; - uint8_t payload[RELAY_PAYLOAD_SIZE]; - if (extend_cell_format(&command, &payload_len, payload, &ec)<0) { - log_warn(LD_CIRC,"Couldn't format extend cell"); - return -END_CIRC_REASON_INTERNAL; - } - - /* send it to hop->prev, because it will transfer - * it to a create cell and then send to hop */ - if (relay_send_command_from_edge(0, TO_CIRCUIT(circ), - command, - (char*)payload, payload_len, - hop->prev) < 0) - return 0; /* circuit is closed */ - } - hop->state = CPATH_STATE_AWAITING_KEYS; - } - return 0; -} - -/** Our clock just jumped by seconds_elapsed. Assume - * something has also gone wrong with our network: notify the user, - * and abandon all not-yet-used circuits. */ -void -circuit_note_clock_jumped(int seconds_elapsed) -{ - int severity = server_mode(get_options()) ? LOG_WARN : LOG_NOTICE; - tor_log(severity, LD_GENERAL, "Your system clock just jumped %d seconds %s; " - "assuming established circuits no longer work.", - seconds_elapsed >=0 ? seconds_elapsed : -seconds_elapsed, - seconds_elapsed >=0 ? "forward" : "backward"); - control_event_general_status(LOG_WARN, "CLOCK_JUMPED TIME=%d", - seconds_elapsed); - can_complete_circuit=0; /* so it'll log when it works again */ - control_event_client_status(severity, "CIRCUIT_NOT_ESTABLISHED REASON=%s", - "CLOCK_JUMPED"); - circuit_mark_all_unused_circs(); - circuit_mark_all_dirty_circs_as_unusable(); -} - -/** Take the 'extend' cell, pull out addr/port plus the onion - * skin and identity digest for the next hop. If we're already connected, - * pass the onion skin to the next hop using a create cell; otherwise - * launch a new OR connection, and circ will notice when the - * connection succeeds or fails. - * - * Return -1 if we want to warn and tear down the circuit, else return 0. - */ -int -circuit_extend(cell_t *cell, circuit_t *circ) -{ - channel_t *n_chan; - relay_header_t rh; - extend_cell_t ec; - const char *msg = NULL; - int should_launch = 0; - - if (circ->n_chan) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "n_chan already set. Bug/attack. Closing."); - return -1; - } - if (circ->n_hop) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "conn to next hop already launched. Bug/attack. Closing."); - return -1; - } - - if (!server_mode(get_options())) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Got an extend cell, but running as a client. Closing."); - return -1; - } - - relay_header_unpack(&rh, cell->payload); - - if (extend_cell_parse(&ec, rh.command, - cell->payload+RELAY_HEADER_SIZE, - rh.length) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Can't parse extend cell. Closing circuit."); - return -1; - } - - if (!ec.orport_ipv4.port || tor_addr_is_null(&ec.orport_ipv4.addr)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to extend to zero destination port or addr."); - return -1; - } - - if (tor_addr_is_internal(&ec.orport_ipv4.addr, 0) && - !get_options()->ExtendAllowPrivateAddresses) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to extend to a private address"); - return -1; - } - - /* Check if they asked us for 0000..0000. We support using - * an empty fingerprint for the first hop (e.g. for a bridge relay), - * but we don't want to let people send us extend cells for empty - * fingerprints -- a) because it opens the user up to a mitm attack, - * and b) because it lets an attacker force the relay to hold open a - * new TLS connection for each extend request. */ - if (tor_digest_is_zero((const char*)ec.node_id)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to extend without specifying an id_digest."); - return -1; - } - - /* Next, check if we're being asked to connect to the hop that the - * extend cell came from. There isn't any reason for that, and it can - * assist circular-path attacks. */ - if (tor_memeq(ec.node_id, - TO_OR_CIRCUIT(circ)->p_chan->identity_digest, - DIGEST_LEN)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Client asked me to extend back to the previous hop."); - return -1; - } - - n_chan = channel_get_for_extend((const char*)ec.node_id, - &ec.orport_ipv4.addr, - &msg, - &should_launch); - - if (!n_chan) { - log_debug(LD_CIRC|LD_OR,"Next router (%s): %s", - fmt_addrport(&ec.orport_ipv4.addr,ec.orport_ipv4.port), - msg?msg:"????"); - - circ->n_hop = extend_info_new(NULL /*nickname*/, - (const char*)ec.node_id, - NULL /*onion_key*/, - NULL /*curve25519_key*/, - &ec.orport_ipv4.addr, - ec.orport_ipv4.port); - - circ->n_chan_create_cell = tor_memdup(&ec.create_cell, - sizeof(ec.create_cell)); - - circuit_set_state(circ, CIRCUIT_STATE_CHAN_WAIT); - - if (should_launch) { - /* we should try to open a connection */ - n_chan = channel_connect_for_circuit(&ec.orport_ipv4.addr, - ec.orport_ipv4.port, - (const char*)ec.node_id); - if (!n_chan) { - log_info(LD_CIRC,"Launching n_chan failed. Closing circuit."); - circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); - return 0; - } - log_debug(LD_CIRC,"connecting in progress (or finished). Good."); - } - /* return success. The onion/circuit/etc will be taken care of - * automatically (may already have been) whenever n_chan reaches - * OR_CONN_STATE_OPEN. - */ - return 0; - } - - tor_assert(!circ->n_hop); /* Connection is already established. */ - circ->n_chan = n_chan; - log_debug(LD_CIRC, - "n_chan is %s", - channel_get_canonical_remote_descr(n_chan)); - - if (circuit_deliver_create_cell(circ, &ec.create_cell, 1) < 0) - return -1; - - return 0; -} - -/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in - * key_data. key_data must contain CPATH_KEY_MATERIAL bytes, which are - * used as follows: - * - 20 to initialize f_digest - * - 20 to initialize b_digest - * - 16 to key f_crypto - * - 16 to key b_crypto - * - * (If 'reverse' is true, then f_XX and b_XX are swapped.) - */ -int -circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, - int reverse) -{ - crypto_digest_t *tmp_digest; - crypto_cipher_t *tmp_crypto; - - tor_assert(cpath); - tor_assert(key_data); - tor_assert(!(cpath->f_crypto || cpath->b_crypto || - cpath->f_digest || cpath->b_digest)); - - cpath->f_digest = crypto_digest_new(); - crypto_digest_add_bytes(cpath->f_digest, key_data, DIGEST_LEN); - cpath->b_digest = crypto_digest_new(); - crypto_digest_add_bytes(cpath->b_digest, key_data+DIGEST_LEN, DIGEST_LEN); - - if (!(cpath->f_crypto = - crypto_cipher_new(key_data+(2*DIGEST_LEN)))) { - log_warn(LD_BUG,"Forward cipher initialization failed."); - return -1; - } - if (!(cpath->b_crypto = - crypto_cipher_new(key_data+(2*DIGEST_LEN)+CIPHER_KEY_LEN))) { - log_warn(LD_BUG,"Backward cipher initialization failed."); - return -1; - } - - if (reverse) { - tmp_digest = cpath->f_digest; - cpath->f_digest = cpath->b_digest; - cpath->b_digest = tmp_digest; - tmp_crypto = cpath->f_crypto; - cpath->f_crypto = cpath->b_crypto; - cpath->b_crypto = tmp_crypto; - } - - return 0; -} - -/** A "created" cell reply came back to us on circuit circ. - * (The body of reply varies depending on what sort of handshake - * this is.) - * - * Calculate the appropriate keys and digests, make sure KH is - * correct, and initialize this hop of the cpath. - * - * Return - reason if we want to mark circ for close, else return 0. - */ -int -circuit_finish_handshake(origin_circuit_t *circ, - const created_cell_t *reply) -{ - char keys[CPATH_KEY_MATERIAL_LEN]; - crypt_path_t *hop; - int rv; - - if ((rv = pathbias_count_build_attempt(circ)) < 0) - return rv; - - if (circ->cpath->state == CPATH_STATE_AWAITING_KEYS) { - hop = circ->cpath; - } else { - hop = onion_next_hop_in_cpath(circ->cpath); - if (!hop) { /* got an extended when we're all done? */ - log_warn(LD_PROTOCOL,"got extended when circ already built? Closing."); - return - END_CIRC_REASON_TORPROTOCOL; - } - } - tor_assert(hop->state == CPATH_STATE_AWAITING_KEYS); - - { - if (onion_skin_client_handshake(hop->handshake_state.tag, - &hop->handshake_state, - reply->reply, reply->handshake_len, - (uint8_t*)keys, sizeof(keys), - (uint8_t*)hop->rend_circ_nonce) < 0) { - log_warn(LD_CIRC,"onion_skin_client_handshake failed."); - return -END_CIRC_REASON_TORPROTOCOL; - } - } - - onion_handshake_state_release(&hop->handshake_state); - - if (circuit_init_cpath_crypto(hop, keys, 0)<0) { - return -END_CIRC_REASON_TORPROTOCOL; - } - - hop->state = CPATH_STATE_OPEN; - log_info(LD_CIRC,"Finished building circuit hop:"); - circuit_log_path(LOG_INFO,LD_CIRC,circ); - control_event_circuit_status(circ, CIRC_EVENT_EXTENDED, 0); - - return 0; -} - -/** We received a relay truncated cell on circ. - * - * Since we don't send truncates currently, getting a truncated - * means that a connection broke or an extend failed. For now, - * just give up: force circ to close, and return 0. - */ -int -circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, int reason) -{ -// crypt_path_t *victim; -// connection_t *stream; - - tor_assert(circ); - tor_assert(layer); - - /* XXX Since we don't send truncates currently, getting a truncated - * means that a connection broke or an extend failed. For now, - * just give up. - */ - circuit_mark_for_close(TO_CIRCUIT(circ), - END_CIRC_REASON_FLAG_REMOTE|reason); - return 0; - -#if 0 - while (layer->next != circ->cpath) { - /* we need to clear out layer->next */ - victim = layer->next; - log_debug(LD_CIRC, "Killing a layer of the cpath."); - - for (stream = circ->p_streams; stream; stream=stream->next_stream) { - if (stream->cpath_layer == victim) { - log_info(LD_APP, "Marking stream %d for close because of truncate.", - stream->stream_id); - /* no need to send 'end' relay cells, - * because the other side's already dead - */ - connection_mark_unattached_ap(stream, END_STREAM_REASON_DESTROY); - } - } - - layer->next = victim->next; - circuit_free_cpath_node(victim); - } - - log_info(LD_CIRC, "finished"); - return 0; -#endif -} - -/** Given a response payload and keys, initialize, then send a created - * cell back. - */ -int -onionskin_answer(or_circuit_t *circ, - const created_cell_t *created_cell, - const char *keys, - const uint8_t *rend_circ_nonce) -{ - cell_t cell; - crypt_path_t *tmp_cpath; - - if (created_cell_format(&cell, created_cell) < 0) { - log_warn(LD_BUG,"couldn't format created cell (type=%d, len=%d)", - (int)created_cell->cell_type, (int)created_cell->handshake_len); - return -1; - } - cell.circ_id = circ->p_circ_id; - - tmp_cpath = tor_malloc_zero(sizeof(crypt_path_t)); - tmp_cpath->magic = CRYPT_PATH_MAGIC; - - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); - - log_debug(LD_CIRC,"init digest forward 0x%.8x, backward 0x%.8x.", - (unsigned int)get_uint32(keys), - (unsigned int)get_uint32(keys+20)); - if (circuit_init_cpath_crypto(tmp_cpath, keys, 0)<0) { - log_warn(LD_BUG,"Circuit initialization failed"); - tor_free(tmp_cpath); - return -1; - } - circ->n_digest = tmp_cpath->f_digest; - circ->n_crypto = tmp_cpath->f_crypto; - circ->p_digest = tmp_cpath->b_digest; - circ->p_crypto = tmp_cpath->b_crypto; - tmp_cpath->magic = 0; - tor_free(tmp_cpath); - - memcpy(circ->rend_circ_nonce, rend_circ_nonce, DIGEST_LEN); - - circ->is_first_hop = (created_cell->cell_type == CELL_CREATED_FAST); - - append_cell_to_circuit_queue(TO_CIRCUIT(circ), - circ->p_chan, &cell, CELL_DIRECTION_IN, 0); - log_debug(LD_CIRC,"Finished sending '%s' cell.", - circ->is_first_hop ? "created_fast" : "created"); - - if (!channel_is_local(circ->p_chan) && - !channel_is_outgoing(circ->p_chan)) { - /* record that we could process create cells from a non-local conn - * that we didn't initiate; presumably this means that create cells - * can reach us too. */ - router_orport_found_reachable(); - } - - return 0; -} - -/** Choose a length for a circuit of purpose purpose: three + the - * number of endpoints that would give something away about our destination. - * - * If the routerlist nodes doesn't have enough routers - * to handle the desired path length, return -1. - */ -static int -new_route_len(uint8_t purpose, extend_info_t *exit, smartlist_t *nodes) -{ - int num_acceptable_routers; - int routelen; - - tor_assert(nodes); - - routelen = DEFAULT_ROUTE_LEN; - if (exit && - purpose != CIRCUIT_PURPOSE_TESTING && - purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) - routelen++; - - num_acceptable_routers = count_acceptable_nodes(nodes); - - log_debug(LD_CIRC,"Chosen route length %d (%d/%d routers suitable).", - routelen, num_acceptable_routers, smartlist_len(nodes)); - - if (num_acceptable_routers < routelen) { - log_info(LD_CIRC, - "Not enough acceptable routers (%d/%d). Discarding this circuit.", - num_acceptable_routers, routelen); - return -1; - } - - return routelen; -} - -/** Return a newly allocated list of uint16_t * for each predicted port not - * handled by a current circuit. */ -static smartlist_t * -circuit_get_unhandled_ports(time_t now) -{ - smartlist_t *dest = rep_hist_get_predicted_ports(now); - circuit_remove_handled_ports(dest); - return dest; -} - -/** Return 1 if we already have circuits present or on the way for - * all anticipated ports. Return 0 if we should make more. - * - * If we're returning 0, set need_uptime and need_capacity to - * indicate any requirements that the unhandled ports have. - */ -int -circuit_all_predicted_ports_handled(time_t now, int *need_uptime, - int *need_capacity) -{ - int i, enough; - uint16_t *port; - smartlist_t *sl = circuit_get_unhandled_ports(now); - smartlist_t *LongLivedServices = get_options()->LongLivedPorts; - tor_assert(need_uptime); - tor_assert(need_capacity); - // Always predict need_capacity - *need_capacity = 1; - enough = (smartlist_len(sl) == 0); - for (i = 0; i < smartlist_len(sl); ++i) { - port = smartlist_get(sl, i); - if (smartlist_contains_int_as_string(LongLivedServices, *port)) - *need_uptime = 1; - tor_free(port); - } - smartlist_free(sl); - return enough; -} - -/** Return 1 if node can handle one or more of the ports in - * needed_ports, else return 0. - */ -static int -node_handles_some_port(const node_t *node, smartlist_t *needed_ports) -{ /* XXXX MOVE */ - int i; - uint16_t port; - - for (i = 0; i < smartlist_len(needed_ports); ++i) { - addr_policy_result_t r; - /* alignment issues aren't a worry for this dereference, since - needed_ports is explicitly a smartlist of uint16_t's */ - port = *(uint16_t *)smartlist_get(needed_ports, i); - tor_assert(port); - if (node) - r = compare_tor_addr_to_node_policy(NULL, port, node); - else - continue; - if (r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED) - return 1; - } - return 0; -} - -/** Return true iff conn needs another general circuit to be - * built. */ -static int -ap_stream_wants_exit_attention(connection_t *conn) -{ - entry_connection_t *entry; - if (conn->type != CONN_TYPE_AP) - return 0; - entry = TO_ENTRY_CONN(conn); - - if (conn->state == AP_CONN_STATE_CIRCUIT_WAIT && - !conn->marked_for_close && - !(entry->want_onehop) && /* ignore one-hop streams */ - !(entry->use_begindir) && /* ignore targeted dir fetches */ - !(entry->chosen_exit_name) && /* ignore defined streams */ - !connection_edge_is_rendezvous_stream(TO_EDGE_CONN(conn)) && - !circuit_stream_is_being_handled(TO_ENTRY_CONN(conn), 0, - MIN_CIRCUITS_HANDLING_STREAM)) - return 1; - return 0; -} - -/** Return a pointer to a suitable router to be the exit node for the - * general-purpose circuit we're about to build. - * - * Look through the connection array, and choose a router that maximizes - * the number of pending streams that can exit from this router. - * - * Return NULL if we can't find any suitable routers. - */ -static const node_t * -choose_good_exit_server_general(int need_uptime, int need_capacity) -{ - int *n_supported; - int n_pending_connections = 0; - smartlist_t *connections; - int best_support = -1; - int n_best_support=0; - const or_options_t *options = get_options(); - const smartlist_t *the_nodes; - const node_t *node=NULL; - - connections = get_connection_array(); - - /* Count how many connections are waiting for a circuit to be built. - * We use this for log messages now, but in the future we may depend on it. - */ - SMARTLIST_FOREACH(connections, connection_t *, conn, - { - if (ap_stream_wants_exit_attention(conn)) - ++n_pending_connections; - }); -// log_fn(LOG_DEBUG, "Choosing exit node; %d connections are pending", -// n_pending_connections); - /* Now we count, for each of the routers in the directory, how many - * of the pending connections could possibly exit from that - * router (n_supported[i]). (We can't be sure about cases where we - * don't know the IP address of the pending connection.) - * - * -1 means "Don't use this router at all." - */ - the_nodes = nodelist_get_list(); - n_supported = tor_malloc(sizeof(int)*smartlist_len(the_nodes)); - SMARTLIST_FOREACH_BEGIN(the_nodes, const node_t *, node) { - const int i = node_sl_idx; - if (router_digest_is_me(node->identity)) { - n_supported[i] = -1; -// log_fn(LOG_DEBUG,"Skipping node %s -- it's me.", router->nickname); - /* XXX there's probably a reverse predecessor attack here, but - * it's slow. should we take this out? -RD - */ - continue; - } - if (!node_has_descriptor(node)) { - n_supported[i] = -1; - continue; - } - if (!node->is_running || node->is_bad_exit) { - n_supported[i] = -1; - continue; /* skip routers that are known to be down or bad exits */ - } - if (node_get_purpose(node) != ROUTER_PURPOSE_GENERAL) { - /* never pick a non-general node as a random exit. */ - n_supported[i] = -1; - continue; - } - if (routerset_contains_node(options->ExcludeExitNodesUnion_, node)) { - n_supported[i] = -1; - continue; /* user asked us not to use it, no matter what */ - } - if (options->ExitNodes && - !routerset_contains_node(options->ExitNodes, node)) { - n_supported[i] = -1; - continue; /* not one of our chosen exit nodes */ - } - - if (node_is_unreliable(node, need_uptime, need_capacity, 0)) { - n_supported[i] = -1; - continue; /* skip routers that are not suitable. Don't worry if - * this makes us reject all the possible routers: if so, - * we'll retry later in this function with need_update and - * need_capacity set to 0. */ - } - if (!(node->is_valid || options->AllowInvalid_ & ALLOW_INVALID_EXIT)) { - /* if it's invalid and we don't want it */ - n_supported[i] = -1; -// log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- invalid router.", -// router->nickname, i); - continue; /* skip invalid routers */ - } - if (options->ExcludeSingleHopRelays && - node_allows_single_hop_exits(node)) { - n_supported[i] = -1; - continue; - } - if (node_exit_policy_rejects_all(node)) { - n_supported[i] = -1; -// log_fn(LOG_DEBUG,"Skipping node %s (index %d) -- it rejects all.", -// router->nickname, i); - continue; /* skip routers that reject all */ - } - n_supported[i] = 0; - /* iterate over connections */ - SMARTLIST_FOREACH_BEGIN(connections, connection_t *, conn) { - if (!ap_stream_wants_exit_attention(conn)) - continue; /* Skip everything but APs in CIRCUIT_WAIT */ - if (connection_ap_can_use_exit(TO_ENTRY_CONN(conn), node)) { - ++n_supported[i]; -// log_fn(LOG_DEBUG,"%s is supported. n_supported[%d] now %d.", -// router->nickname, i, n_supported[i]); - } else { -// log_fn(LOG_DEBUG,"%s (index %d) would reject this stream.", -// router->nickname, i); - } - } SMARTLIST_FOREACH_END(conn); - if (n_pending_connections > 0 && n_supported[i] == 0) { - /* Leave best_support at -1 if that's where it is, so we can - * distinguish it later. */ - continue; - } - if (n_supported[i] > best_support) { - /* If this router is better than previous ones, remember its index - * and goodness, and start counting how many routers are this good. */ - best_support = n_supported[i]; n_best_support=1; -// log_fn(LOG_DEBUG,"%s is new best supported option so far.", -// router->nickname); - } else if (n_supported[i] == best_support) { - /* If this router is _as good_ as the best one, just increment the - * count of equally good routers.*/ - ++n_best_support; - } - } SMARTLIST_FOREACH_END(node); - log_info(LD_CIRC, - "Found %d servers that might support %d/%d pending connections.", - n_best_support, best_support >= 0 ? best_support : 0, - n_pending_connections); - - /* If any routers definitely support any pending connections, choose one - * at random. */ - if (best_support > 0) { - smartlist_t *supporting = smartlist_new(); - - SMARTLIST_FOREACH(the_nodes, const node_t *, node, { - if (n_supported[node_sl_idx] == best_support) - smartlist_add(supporting, (void*)node); - }); - - node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); - smartlist_free(supporting); - } else { - /* Either there are no pending connections, or no routers even seem to - * possibly support any of them. Choose a router at random that satisfies - * at least one predicted exit port. */ - - int attempt; - smartlist_t *needed_ports, *supporting; - - if (best_support == -1) { - if (need_uptime || need_capacity) { - log_info(LD_CIRC, - "We couldn't find any live%s%s routers; falling back " - "to list of all routers.", - need_capacity?", fast":"", - need_uptime?", stable":""); - tor_free(n_supported); - return choose_good_exit_server_general(0, 0); - } - log_notice(LD_CIRC, "All routers are down or won't exit%s -- " - "choosing a doomed exit at random.", - options->ExcludeExitNodesUnion_ ? " or are Excluded" : ""); - } - supporting = smartlist_new(); - needed_ports = circuit_get_unhandled_ports(time(NULL)); - for (attempt = 0; attempt < 2; attempt++) { - /* try once to pick only from routers that satisfy a needed port, - * then if there are none, pick from any that support exiting. */ - SMARTLIST_FOREACH_BEGIN(the_nodes, const node_t *, node) { - if (n_supported[node_sl_idx] != -1 && - (attempt || node_handles_some_port(node, needed_ports))) { -// log_fn(LOG_DEBUG,"Try %d: '%s' is a possibility.", -// try, router->nickname); - smartlist_add(supporting, (void*)node); - } - } SMARTLIST_FOREACH_END(node); - - node = node_sl_choose_by_bandwidth(supporting, WEIGHT_FOR_EXIT); - if (node) - break; - smartlist_clear(supporting); - /* If we reach this point, we can't actually support any unhandled - * predicted ports, so clear all the remaining ones. */ - if (smartlist_len(needed_ports)) - rep_hist_remove_predicted_ports(needed_ports); - } - SMARTLIST_FOREACH(needed_ports, uint16_t *, cp, tor_free(cp)); - smartlist_free(needed_ports); - smartlist_free(supporting); - } - - tor_free(n_supported); - if (node) { - log_info(LD_CIRC, "Chose exit server '%s'", node_describe(node)); - return node; - } - if (options->ExitNodes) { - log_warn(LD_CIRC, - "No specified %sexit routers seem to be running: " - "can't choose an exit.", - options->ExcludeExitNodesUnion_ ? "non-excluded " : ""); - } - return NULL; -} - -/** Return a pointer to a suitable router to be the exit node for the - * circuit of purpose purpose that we're about to build (or NULL - * if no router is suitable). - * - * For general-purpose circuits, pass it off to - * choose_good_exit_server_general() - * - * For client-side rendezvous circuits, choose a random node, weighted - * toward the preferences in 'options'. - */ -static const node_t * -choose_good_exit_server(uint8_t purpose, - int need_uptime, int need_capacity, int is_internal) -{ - const or_options_t *options = get_options(); - router_crn_flags_t flags = CRN_NEED_DESC; - if (need_uptime) - flags |= CRN_NEED_UPTIME; - if (need_capacity) - flags |= CRN_NEED_CAPACITY; - - switch (purpose) { - case CIRCUIT_PURPOSE_C_GENERAL: - if (options->AllowInvalid_ & ALLOW_INVALID_MIDDLE) - flags |= CRN_ALLOW_INVALID; - if (is_internal) /* pick it like a middle hop */ - return router_choose_random_node(NULL, options->ExcludeNodes, flags); - else - return choose_good_exit_server_general(need_uptime,need_capacity); - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - if (options->AllowInvalid_ & ALLOW_INVALID_RENDEZVOUS) - flags |= CRN_ALLOW_INVALID; - return router_choose_random_node(NULL, options->ExcludeNodes, flags); - } - log_warn(LD_BUG,"Unhandled purpose %d", purpose); - tor_fragile_assert(); - return NULL; -} - -/** Log a warning if the user specified an exit for the circuit that - * has been excluded from use by ExcludeNodes or ExcludeExitNodes. */ -static void -warn_if_last_router_excluded(origin_circuit_t *circ, const extend_info_t *exit) -{ - const or_options_t *options = get_options(); - routerset_t *rs = options->ExcludeNodes; - const char *description; - uint8_t purpose = circ->base_.purpose; - - if (circ->build_state->onehop_tunnel) - return; - - switch (purpose) - { - default: - case CIRCUIT_PURPOSE_OR: - case CIRCUIT_PURPOSE_INTRO_POINT: - case CIRCUIT_PURPOSE_REND_POINT_WAITING: - case CIRCUIT_PURPOSE_REND_ESTABLISHED: - log_warn(LD_BUG, "Called on non-origin circuit (purpose %d, %s)", - (int)purpose, - circuit_purpose_to_string(purpose)); - return; - case CIRCUIT_PURPOSE_C_GENERAL: - if (circ->build_state->is_internal) - return; - description = "requested exit node"; - rs = options->ExcludeExitNodesUnion_; - break; - case CIRCUIT_PURPOSE_C_INTRODUCING: - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - case CIRCUIT_PURPOSE_S_CONNECT_REND: - case CIRCUIT_PURPOSE_S_REND_JOINED: - case CIRCUIT_PURPOSE_TESTING: - return; - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - case CIRCUIT_PURPOSE_C_REND_READY: - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - case CIRCUIT_PURPOSE_C_REND_JOINED: - description = "chosen rendezvous point"; - break; - case CIRCUIT_PURPOSE_CONTROLLER: - rs = options->ExcludeExitNodesUnion_; - description = "controller-selected circuit target"; - break; - } - - if (routerset_contains_extendinfo(rs, exit)) { - /* We should never get here if StrictNodes is set to 1. */ - if (options->StrictNodes) { - log_warn(LD_BUG, "Using %s '%s' which is listed in ExcludeNodes%s, " - "even though StrictNodes is set. Please report. " - "(Circuit purpose: %s)", - description, extend_info_describe(exit), - rs==options->ExcludeNodes?"":" or ExcludeExitNodes", - circuit_purpose_to_string(purpose)); - } else { - log_warn(LD_CIRC, "Using %s '%s' which is listed in " - "ExcludeNodes%s, because no better options were available. To " - "prevent this (and possibly break your Tor functionality), " - "set the StrictNodes configuration option. " - "(Circuit purpose: %s)", - description, extend_info_describe(exit), - rs==options->ExcludeNodes?"":" or ExcludeExitNodes", - circuit_purpose_to_string(purpose)); - } - circuit_log_path(LOG_WARN, LD_CIRC, circ); - } - - return; -} - -/** Decide a suitable length for circ's cpath, and pick an exit - * router (or use exit if provided). Store these in the - * cpath. Return 0 if ok, -1 if circuit should be closed. */ -static int -onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) -{ - cpath_build_state_t *state = circ->build_state; - - if (state->onehop_tunnel) { - log_debug(LD_CIRC, "Launching a one-hop circuit for dir tunnel."); - state->desired_path_len = 1; - } else { - int r = new_route_len(circ->base_.purpose, exit, nodelist_get_list()); - if (r < 1) /* must be at least 1 */ - return -1; - state->desired_path_len = r; - } - - if (exit) { /* the circuit-builder pre-requested one */ - warn_if_last_router_excluded(circ, exit); - log_info(LD_CIRC,"Using requested exit node '%s'", - extend_info_describe(exit)); - exit = extend_info_dup(exit); - } else { /* we have to decide one */ - const node_t *node = - choose_good_exit_server(circ->base_.purpose, state->need_uptime, - state->need_capacity, state->is_internal); - if (!node) { - log_warn(LD_CIRC,"failed to choose an exit server"); - return -1; - } - exit = extend_info_from_node(node, 0); - tor_assert(exit); - } - state->chosen_exit = exit; - return 0; -} - -/** Give circ a new exit destination to exit, and add a - * hop to the cpath reflecting this. Don't send the next extend cell -- - * the caller will do this if it wants to. - */ -int -circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit) -{ - cpath_build_state_t *state; - tor_assert(exit); - tor_assert(circ); - - state = circ->build_state; - tor_assert(state); - extend_info_free(state->chosen_exit); - state->chosen_exit = extend_info_dup(exit); - - ++circ->build_state->desired_path_len; - onion_append_hop(&circ->cpath, exit); - return 0; -} - -/** Take an open circ, and add a new hop at the end, based on - * info. Set its state back to CIRCUIT_STATE_BUILDING, and then - * send the next extend cell to begin connecting to that hop. - */ -int -circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit) -{ - int err_reason = 0; - warn_if_last_router_excluded(circ, exit); - - tor_gettimeofday(&circ->base_.timestamp_began); - - circuit_append_new_exit(circ, exit); - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); - if ((err_reason = circuit_send_next_onion_skin(circ))<0) { - log_warn(LD_CIRC, "Couldn't extend circuit to new point %s.", - extend_info_describe(exit)); - circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason); - return -1; - } - - // XXX: Should cannibalized circuits be dirty or not? Not easy to say.. - - return 0; -} - -/** Return the number of routers in routers that are currently up - * and available for building circuits through. - */ -static int -count_acceptable_nodes(smartlist_t *nodes) -{ - int num=0; - - SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) { - // log_debug(LD_CIRC, -// "Contemplating whether router %d (%s) is a new option.", -// i, r->nickname); - if (! node->is_running) -// log_debug(LD_CIRC,"Nope, the directory says %d is not running.",i); - continue; - if (! node->is_valid) -// log_debug(LD_CIRC,"Nope, the directory says %d is not valid.",i); - continue; - if (! node_has_descriptor(node)) - continue; - /* XXX This clause makes us count incorrectly: if AllowInvalidRouters - * allows this node in some places, then we're getting an inaccurate - * count. For now, be conservative and don't count it. But later we - * should try to be smarter. */ - ++num; - } SMARTLIST_FOREACH_END(node); - -// log_debug(LD_CIRC,"I like %d. num_acceptable_routers now %d.",i, num); - - return num; -} - -/** Add new_hop to the end of the doubly-linked-list head_ptr. - * This function is used to extend cpath by another hop. - */ -void -onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop) -{ - if (*head_ptr) { - new_hop->next = (*head_ptr); - new_hop->prev = (*head_ptr)->prev; - (*head_ptr)->prev->next = new_hop; - (*head_ptr)->prev = new_hop; - } else { - *head_ptr = new_hop; - new_hop->prev = new_hop->next = new_hop; - } -} - -/** A helper function used by onion_extend_cpath(). Use purpose - * and state and the cpath head (currently populated only - * to length cur_len to decide a suitable middle hop for a - * circuit. In particular, make sure we don't pick the exit node or its - * family, and make sure we don't duplicate any previous nodes or their - * families. */ -static const node_t * -choose_good_middle_server(uint8_t purpose, - cpath_build_state_t *state, - crypt_path_t *head, - int cur_len) -{ - int i; - const node_t *r, *choice; - crypt_path_t *cpath; - smartlist_t *excluded; - const or_options_t *options = get_options(); - router_crn_flags_t flags = CRN_NEED_DESC; - tor_assert(CIRCUIT_PURPOSE_MIN_ <= purpose && - purpose <= CIRCUIT_PURPOSE_MAX_); - - log_debug(LD_CIRC, "Contemplating intermediate hop: random choice."); - excluded = smartlist_new(); - if ((r = build_state_get_exit_node(state))) { - nodelist_add_node_and_family(excluded, r); - } - for (i = 0, cpath = head; i < cur_len; ++i, cpath=cpath->next) { - if ((r = node_get_by_id(cpath->extend_info->identity_digest))) { - nodelist_add_node_and_family(excluded, r); - } - } - - if (state->need_uptime) - flags |= CRN_NEED_UPTIME; - if (state->need_capacity) - flags |= CRN_NEED_CAPACITY; - if (options->AllowInvalid_ & ALLOW_INVALID_MIDDLE) - flags |= CRN_ALLOW_INVALID; - choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); - smartlist_free(excluded); - return choice; -} - -/** Pick a good entry server for the circuit to be built according to - * state. Don't reuse a chosen exit (if any), don't use this - * router (if we're an OR), and respect firewall settings; if we're - * configured to use entry guards, return one. - * - * If state is NULL, we're choosing a router to serve as an entry - * guard, not for any particular circuit. - */ -/* XXXX024 I'd like to have this be static again, but entrynodes.c needs it. */ -const node_t * -choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state) -{ - const node_t *choice; - smartlist_t *excluded; - const or_options_t *options = get_options(); - router_crn_flags_t flags = CRN_NEED_GUARD|CRN_NEED_DESC; - const node_t *node; - - if (state && options->UseEntryGuards && - (purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) { - /* This request is for an entry server to use for a regular circuit, - * and we use entry guard nodes. Just return one of the guard nodes. */ - return choose_random_entry(state); - } - - excluded = smartlist_new(); - - if (state && (node = build_state_get_exit_node(state))) { - /* Exclude the exit node from the state, if we have one. Also exclude its - * family. */ - nodelist_add_node_and_family(excluded, node); - } - if (firewall_is_fascist_or()) { - /* Exclude all ORs that we can't reach through our firewall */ - smartlist_t *nodes = nodelist_get_list(); - SMARTLIST_FOREACH(nodes, const node_t *, node, { - if (!fascist_firewall_allows_node(node)) - smartlist_add(excluded, (void*)node); - }); - } - /* and exclude current entry guards and their families, if applicable */ - /*XXXX025 use the using_as_guard flag to accomplish this.*/ - if (options->UseEntryGuards) { - SMARTLIST_FOREACH(get_entry_guards(), const entry_guard_t *, entry, - { - if ((node = node_get_by_id(entry->identity))) { - nodelist_add_node_and_family(excluded, node); - } - }); - } - - if (state) { - if (state->need_uptime) - flags |= CRN_NEED_UPTIME; - if (state->need_capacity) - flags |= CRN_NEED_CAPACITY; - } - if (options->AllowInvalid_ & ALLOW_INVALID_ENTRY) - flags |= CRN_ALLOW_INVALID; - - choice = router_choose_random_node(excluded, options->ExcludeNodes, flags); - smartlist_free(excluded); - return choice; -} - -/** Return the first non-open hop in cpath, or return NULL if all - * hops are open. */ -static crypt_path_t * -onion_next_hop_in_cpath(crypt_path_t *cpath) -{ - crypt_path_t *hop = cpath; - do { - if (hop->state != CPATH_STATE_OPEN) - return hop; - hop = hop->next; - } while (hop != cpath); - return NULL; -} - -/** Choose a suitable next hop in the cpath head_ptr, - * based on state. Append the hop info to head_ptr. - * - * Return 1 if the path is complete, 0 if we successfully added a hop, - * and -1 on error. - */ -static int -onion_extend_cpath(origin_circuit_t *circ) -{ - uint8_t purpose = circ->base_.purpose; - cpath_build_state_t *state = circ->build_state; - int cur_len = circuit_get_cpath_len(circ); - extend_info_t *info = NULL; - - if (cur_len >= state->desired_path_len) { - log_debug(LD_CIRC, "Path is complete: %d steps long", - state->desired_path_len); - return 1; - } - - log_debug(LD_CIRC, "Path is %d long; we want %d", cur_len, - state->desired_path_len); - - if (cur_len == state->desired_path_len - 1) { /* Picking last node */ - info = extend_info_dup(state->chosen_exit); - } else if (cur_len == 0) { /* picking first node */ - const node_t *r = choose_good_entry_server(purpose, state); - if (r) { - /* If we're a client, use the preferred address rather than the - primary address, for potentially connecting to an IPv6 OR - port. */ - info = extend_info_from_node(r, server_mode(get_options()) == 0); - tor_assert(info); - } - } else { - const node_t *r = - choose_good_middle_server(purpose, state, circ->cpath, cur_len); - if (r) { - info = extend_info_from_node(r, 0); - tor_assert(info); - } - } - - if (!info) { - log_warn(LD_CIRC,"Failed to find node for hop %d of our path. Discarding " - "this circuit.", cur_len); - return -1; - } - - log_debug(LD_CIRC,"Chose router %s for hop %d (exit is %s)", - extend_info_describe(info), - cur_len+1, build_state_get_exit_nickname(state)); - - onion_append_hop(&circ->cpath, info); - extend_info_free(info); - return 0; -} - -/** Create a new hop, annotate it with information about its - * corresponding router choice, and append it to the - * end of the cpath head_ptr. */ -static int -onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice) -{ - crypt_path_t *hop = tor_malloc_zero(sizeof(crypt_path_t)); - - /* link hop into the cpath, at the end. */ - onion_append_to_cpath(head_ptr, hop); - - hop->magic = CRYPT_PATH_MAGIC; - hop->state = CPATH_STATE_CLOSED; - - hop->extend_info = extend_info_dup(choice); - - hop->package_window = circuit_initial_package_window(); - hop->deliver_window = CIRCWINDOW_START; - - return 0; -} - -/** Allocate a new extend_info object based on the various arguments. */ -extend_info_t * -extend_info_new(const char *nickname, const char *digest, - crypto_pk_t *onion_key, - const curve25519_public_key_t *curve25519_key, - const tor_addr_t *addr, uint16_t port) -{ - extend_info_t *info = tor_malloc_zero(sizeof(extend_info_t)); - memcpy(info->identity_digest, digest, DIGEST_LEN); - if (nickname) - strlcpy(info->nickname, nickname, sizeof(info->nickname)); - if (onion_key) - info->onion_key = crypto_pk_dup_key(onion_key); -#ifdef CURVE25519_ENABLED - if (curve25519_key) - memcpy(&info->curve25519_onion_key, curve25519_key, - sizeof(curve25519_public_key_t)); -#else - (void)curve25519_key; -#endif - tor_addr_copy(&info->addr, addr); - info->port = port; - return info; -} - -/** Allocate and return a new extend_info that can be used to build a - * circuit to or through the node node. Use the primary address - * of the node (i.e. its IPv4 address) unless - * for_direct_connect is true, in which case the preferred - * address is used instead. May return NULL if there is not enough - * info about node to extend to it--for example, if there is no - * routerinfo_t or microdesc_t. - **/ -extend_info_t * -extend_info_from_node(const node_t *node, int for_direct_connect) -{ - tor_addr_port_t ap; - - if (node->ri == NULL && (node->rs == NULL || node->md == NULL)) - return NULL; - - if (for_direct_connect) - node_get_pref_orport(node, &ap); - else - node_get_prim_orport(node, &ap); - - log_debug(LD_CIRC, "using %s for %s", - fmt_addrport(&ap.addr, ap.port), - node->ri ? node->ri->nickname : node->rs->nickname); - - if (node->ri) - return extend_info_new(node->ri->nickname, - node->identity, - node->ri->onion_pkey, - node->ri->onion_curve25519_pkey, - &ap.addr, - ap.port); - else if (node->rs && node->md) - return extend_info_new(node->rs->nickname, - node->identity, - node->md->onion_pkey, - node->md->onion_curve25519_pkey, - &ap.addr, - ap.port); - else - return NULL; -} - -/** Release storage held by an extend_info_t struct. */ -void -extend_info_free(extend_info_t *info) -{ - if (!info) - return; - crypto_pk_free(info->onion_key); - tor_free(info); -} - -/** Allocate and return a new extend_info_t with the same contents as - * info. */ -extend_info_t * -extend_info_dup(extend_info_t *info) -{ - extend_info_t *newinfo; - tor_assert(info); - newinfo = tor_malloc(sizeof(extend_info_t)); - memcpy(newinfo, info, sizeof(extend_info_t)); - if (info->onion_key) - newinfo->onion_key = crypto_pk_dup_key(info->onion_key); - else - newinfo->onion_key = NULL; - return newinfo; -} - -/** Return the routerinfo_t for the chosen exit router in state. - * If there is no chosen exit, or if we don't know the routerinfo_t for - * the chosen exit, return NULL. - */ -const node_t * -build_state_get_exit_node(cpath_build_state_t *state) -{ - if (!state || !state->chosen_exit) - return NULL; - return node_get_by_id(state->chosen_exit->identity_digest); -} - -/** Return the nickname for the chosen exit router in state. If - * there is no chosen exit, or if we don't know the routerinfo_t for the - * chosen exit, return NULL. - */ -const char * -build_state_get_exit_nickname(cpath_build_state_t *state) -{ - if (!state || !state->chosen_exit) - return NULL; - return state->chosen_exit->nickname; -} - diff --git a/src/tor/circuitbuild.h b/src/tor/circuitbuild.h deleted file mode 100644 index ebcb22c45..000000000 --- a/src/tor/circuitbuild.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitbuild.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_CIRCUITBUILD_H -#define TOR_CIRCUITBUILD_H - -char *circuit_list_path(origin_circuit_t *circ, int verbose); -char *circuit_list_path_for_controller(origin_circuit_t *circ); -void circuit_log_path(int severity, unsigned int domain, - origin_circuit_t *circ); -void circuit_rep_hist_note_result(origin_circuit_t *circ); -origin_circuit_t *origin_circuit_init(uint8_t purpose, int flags); -origin_circuit_t *circuit_establish_circuit(uint8_t purpose, - extend_info_t *exit, - int flags); -int circuit_handle_first_hop(origin_circuit_t *circ); -void circuit_n_chan_done(channel_t *chan, int status); -int inform_testing_reachability(void); -int circuit_timeout_want_to_count_circ(origin_circuit_t *circ); -int circuit_send_next_onion_skin(origin_circuit_t *circ); -void circuit_note_clock_jumped(int seconds_elapsed); -int circuit_extend(cell_t *cell, circuit_t *circ); -int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data, - int reverse); -struct created_cell_t; -int circuit_finish_handshake(origin_circuit_t *circ, - const struct created_cell_t *created_cell); -int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, - int reason); -int onionskin_answer(or_circuit_t *circ, - const struct created_cell_t *created_cell, - const char *keys, - const uint8_t *rend_circ_nonce); -int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, - int *need_capacity); - -int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *info); -int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *info); -void onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop); -extend_info_t *extend_info_new(const char *nickname, const char *digest, - crypto_pk_t *onion_key, - const curve25519_public_key_t *curve25519_key, - const tor_addr_t *addr, uint16_t port); -extend_info_t *extend_info_from_node(const node_t *r, int for_direct_connect); -extend_info_t *extend_info_dup(extend_info_t *info); -void extend_info_free(extend_info_t *info); -const node_t *build_state_get_exit_node(cpath_build_state_t *state); -const char *build_state_get_exit_nickname(cpath_build_state_t *state); - -const node_t *choose_good_entry_server(uint8_t purpose, - cpath_build_state_t *state); - -#endif - diff --git a/src/tor/circuitlist.c b/src/tor/circuitlist.c deleted file mode 100644 index 947489636..000000000 --- a/src/tor/circuitlist.c +++ /dev/null @@ -1,1878 +0,0 @@ -/* Copyright 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitlist.c - * \brief Manage the global circuit list. - **/ -#define CIRCUITLIST_PRIVATE -#include "or.h" -#include "channel.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "circuitstats.h" -#include "connection.h" -#include "config.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "onion.h" -#include "onion_fast.h" -#include "policies.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rephist.h" -#include "routerlist.h" -#include "routerset.h" -#include "ht.h" - -/********* START VARIABLES **********/ - -/** A global list of all circuits at this hop. */ -struct global_circuitlist_s global_circuitlist = - TOR_LIST_HEAD_INITIALIZER(global_circuitlist); - -/** A list of all the circuits in CIRCUIT_STATE_CHAN_WAIT. */ -static smartlist_t *circuits_pending_chans = NULL; - -static void circuit_free_cpath_node(crypt_path_t *victim); -static void cpath_ref_decref(crypt_path_reference_t *cpath_ref); - -/********* END VARIABLES ************/ - -/** A map from channel and circuit ID to circuit. (Lookup performance is - * very important here, since we need to do it every time a cell arrives.) */ -typedef struct chan_circid_circuit_map_t { - HT_ENTRY(chan_circid_circuit_map_t) node; - channel_t *chan; - circid_t circ_id; - circuit_t *circuit; -} chan_circid_circuit_map_t; - -/** Helper for hash tables: compare the channel and circuit ID for a and - * b, and return less than, equal to, or greater than zero appropriately. - */ -static INLINE int -chan_circid_entries_eq_(chan_circid_circuit_map_t *a, - chan_circid_circuit_map_t *b) -{ - return a->chan == b->chan && a->circ_id == b->circ_id; -} - -/** Helper: return a hash based on circuit ID and the pointer value of - * chan in a. */ -static INLINE unsigned int -chan_circid_entry_hash_(chan_circid_circuit_map_t *a) -{ - return ((unsigned)a->circ_id) ^ (unsigned)(uintptr_t)(a->chan); -} - -/** Map from [chan,circid] to circuit. */ -static HT_HEAD(chan_circid_map, chan_circid_circuit_map_t) - chan_circid_map = HT_INITIALIZER(); -HT_PROTOTYPE(chan_circid_map, chan_circid_circuit_map_t, node, - chan_circid_entry_hash_, chan_circid_entries_eq_) -HT_GENERATE(chan_circid_map, chan_circid_circuit_map_t, node, - chan_circid_entry_hash_, chan_circid_entries_eq_, 0.6, - malloc, realloc, free) - -/** The most recently returned entry from circuit_get_by_circid_chan; - * used to improve performance when many cells arrive in a row from the - * same circuit. - */ -chan_circid_circuit_map_t *_last_circid_chan_ent = NULL; - -/** Implementation helper for circuit_set_{p,n}_circid_channel: A circuit ID - * and/or channel for circ has just changed from old_chan, old_id - * to chan, id. Adjust the chan,circid map as appropriate, removing - * the old entry (if any) and adding a new one. */ -static void -circuit_set_circid_chan_helper(circuit_t *circ, int direction, - circid_t id, - channel_t *chan) -{ - chan_circid_circuit_map_t search; - chan_circid_circuit_map_t *found; - channel_t *old_chan, **chan_ptr; - circid_t old_id, *circid_ptr; - int make_active, attached = 0; - - if (direction == CELL_DIRECTION_OUT) { - chan_ptr = &circ->n_chan; - circid_ptr = &circ->n_circ_id; - make_active = circ->n_chan_cells.n > 0; - } else { - or_circuit_t *c = TO_OR_CIRCUIT(circ); - chan_ptr = &c->p_chan; - circid_ptr = &c->p_circ_id; - make_active = c->p_chan_cells.n > 0; - } - old_chan = *chan_ptr; - old_id = *circid_ptr; - - if (id == old_id && chan == old_chan) - return; - - if (_last_circid_chan_ent && - ((old_id == _last_circid_chan_ent->circ_id && - old_chan == _last_circid_chan_ent->chan) || - (id == _last_circid_chan_ent->circ_id && - chan == _last_circid_chan_ent->chan))) { - _last_circid_chan_ent = NULL; - } - - if (old_chan) { - /* - * If we're changing channels or ID and had an old channel and a non - * zero old ID and weren't marked for close (i.e., we should have been - * attached), detach the circuit. ID changes require this because - * circuitmux hashes on (channel_id, circuit_id). - */ - if (old_id != 0 && (old_chan != chan || old_id != id) && - !(circ->marked_for_close)) { - tor_assert(old_chan->cmux); - circuitmux_detach_circuit(old_chan->cmux, circ); - } - - /* we may need to remove it from the conn-circid map */ - search.circ_id = old_id; - search.chan = old_chan; - found = HT_REMOVE(chan_circid_map, &chan_circid_map, &search); - if (found) { - tor_free(found); - if (direction == CELL_DIRECTION_OUT) { - /* One fewer circuits use old_chan as n_chan */ - --(old_chan->num_n_circuits); - } else { - /* One fewer circuits use old_chan as p_chan */ - --(old_chan->num_p_circuits); - } - } - } - - /* Change the values only after we have possibly made the circuit inactive - * on the previous chan. */ - *chan_ptr = chan; - *circid_ptr = id; - - if (chan == NULL) - return; - - /* now add the new one to the conn-circid map */ - search.circ_id = id; - search.chan = chan; - found = HT_FIND(chan_circid_map, &chan_circid_map, &search); - if (found) { - found->circuit = circ; - } else { - found = tor_malloc_zero(sizeof(chan_circid_circuit_map_t)); - found->circ_id = id; - found->chan = chan; - found->circuit = circ; - HT_INSERT(chan_circid_map, &chan_circid_map, found); - } - - /* - * Attach to the circuitmux if we're changing channels or IDs and - * have a new channel and ID to use and the circuit is not marked for - * close. - */ - if (chan && id != 0 && (old_chan != chan || old_id != id) && - !(circ->marked_for_close)) { - tor_assert(chan->cmux); - circuitmux_attach_circuit(chan->cmux, circ, direction); - attached = 1; - } - - /* - * This is a no-op if we have no cells, but if we do it marks us active to - * the circuitmux - */ - if (make_active && attached) - update_circuit_on_cmux(circ, direction); - - /* Adjust circuit counts on new channel */ - if (direction == CELL_DIRECTION_OUT) { - ++chan->num_n_circuits; - } else { - ++chan->num_p_circuits; - } -} - -/** Mark that circuit id id shouldn't be used on channel chan, - * even if there is no circuit on the channel. We use this to keep the - * circuit id from getting re-used while we have queued but not yet sent - * a destroy cell. */ -void -channel_mark_circid_unusable(channel_t *chan, circid_t id) -{ - chan_circid_circuit_map_t search; - chan_circid_circuit_map_t *ent; - - /* See if there's an entry there. That wouldn't be good. */ - memset(&search, 0, sizeof(search)); - search.chan = chan; - search.circ_id = id; - ent = HT_FIND(chan_circid_map, &chan_circid_map, &search); - - if (ent && ent->circuit) { - /* we have a problem. */ - log_warn(LD_BUG, "Tried to mark %u unusable on %p, but there was already " - "a circuit there.", (unsigned)id, chan); - } else if (ent) { - /* It's already marked. */ - } else { - ent = tor_malloc_zero(sizeof(chan_circid_circuit_map_t)); - ent->chan = chan; - ent->circ_id = id; - /* leave circuit at NULL */ - HT_INSERT(chan_circid_map, &chan_circid_map, ent); - } -} - -/** Mark that a circuit id id can be used again on chan. - * We use this to re-enable the circuit ID after we've sent a destroy cell. - */ -void -channel_mark_circid_usable(channel_t *chan, circid_t id) -{ - chan_circid_circuit_map_t search; - chan_circid_circuit_map_t *ent; - - /* See if there's an entry there. That wouldn't be good. */ - memset(&search, 0, sizeof(search)); - search.chan = chan; - search.circ_id = id; - ent = HT_REMOVE(chan_circid_map, &chan_circid_map, &search); - if (ent && ent->circuit) { - log_warn(LD_BUG, "Tried to mark %u usable on %p, but there was already " - "a circuit there.", (unsigned)id, chan); - return; - } - if (_last_circid_chan_ent == ent) - _last_circid_chan_ent = NULL; - tor_free(ent); -} - -/** Called to indicate that a DESTROY is pending on chan with - * circuit ID id, but hasn't been sent yet. */ -void -channel_note_destroy_pending(channel_t *chan, circid_t id) -{ - circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan); - if (circ) { - if (circ->n_chan == chan && circ->n_circ_id == id) { - circ->n_delete_pending = 1; - } else { - or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); - if (orcirc->p_chan == chan && orcirc->p_circ_id == id) { - circ->p_delete_pending = 1; - } - } - return; - } - channel_mark_circid_unusable(chan, id); -} - -/** Called to indicate that a DESTROY is no longer pending on chan with - * circuit ID id -- typically, because it has been sent. */ -void -channel_note_destroy_not_pending(channel_t *chan, circid_t id) -{ - circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan); - if (circ) { - if (circ->n_chan == chan && circ->n_circ_id == id) { - circ->n_delete_pending = 0; - } else { - or_circuit_t *orcirc = TO_OR_CIRCUIT(circ); - if (orcirc->p_chan == chan && orcirc->p_circ_id == id) { - circ->p_delete_pending = 0; - } - } - /* XXXX this shouldn't happen; log a bug here. */ - return; - } - channel_mark_circid_usable(chan, id); -} - -/** Set the p_conn field of a circuit circ, along - * with the corresponding circuit ID, and add the circuit as appropriate - * to the (chan,id)-\>circuit map. */ -void -circuit_set_p_circid_chan(or_circuit_t *or_circ, circid_t id, - channel_t *chan) -{ - circuit_t *circ = TO_CIRCUIT(or_circ); - channel_t *old_chan = or_circ->p_chan; - circid_t old_id = or_circ->p_circ_id; - - circuit_set_circid_chan_helper(circ, CELL_DIRECTION_IN, id, chan); - - if (chan) - tor_assert(bool_eq(or_circ->p_chan_cells.n, - or_circ->next_active_on_p_chan)); - - if (circ->p_delete_pending && old_chan) { - channel_mark_circid_unusable(old_chan, old_id); - circ->p_delete_pending = 0; - } -} - -/** Set the n_conn field of a circuit circ, along - * with the corresponding circuit ID, and add the circuit as appropriate - * to the (chan,id)-\>circuit map. */ -void -circuit_set_n_circid_chan(circuit_t *circ, circid_t id, - channel_t *chan) -{ - channel_t *old_chan = circ->n_chan; - circid_t old_id = circ->n_circ_id; - - circuit_set_circid_chan_helper(circ, CELL_DIRECTION_OUT, id, chan); - - if (chan) - tor_assert(bool_eq(circ->n_chan_cells.n, circ->next_active_on_n_chan)); - - if (circ->n_delete_pending && old_chan) { - channel_mark_circid_unusable(old_chan, old_id); - circ->n_delete_pending = 0; - } -} - -/** Change the state of circ to state, adding it to or removing - * it from lists as appropriate. */ -void -circuit_set_state(circuit_t *circ, uint8_t state) -{ - tor_assert(circ); - if (state == circ->state) - return; - if (!circuits_pending_chans) - circuits_pending_chans = smartlist_new(); - if (circ->state == CIRCUIT_STATE_CHAN_WAIT) { - /* remove from waiting-circuit list. */ - smartlist_remove(circuits_pending_chans, circ); - } - if (state == CIRCUIT_STATE_CHAN_WAIT) { - /* add to waiting-circuit list. */ - smartlist_add(circuits_pending_chans, circ); - } - if (state == CIRCUIT_STATE_OPEN) - tor_assert(!circ->n_chan_create_cell); - circ->state = state; -} - -/** Append to out all circuits in state CHAN_WAIT waiting for - * the given connection. */ -void -circuit_get_all_pending_on_channel(smartlist_t *out, channel_t *chan) -{ - tor_assert(out); - tor_assert(chan); - - if (!circuits_pending_chans) - return; - - SMARTLIST_FOREACH_BEGIN(circuits_pending_chans, circuit_t *, circ) { - if (circ->marked_for_close) - continue; - if (!circ->n_hop) - continue; - tor_assert(circ->state == CIRCUIT_STATE_CHAN_WAIT); - if (tor_digest_is_zero(circ->n_hop->identity_digest)) { - /* Look at addr/port. This is an unkeyed connection. */ - if (!channel_matches_extend_info(chan, circ->n_hop)) - continue; - } else { - /* We expected a key. See if it's the right one. */ - if (tor_memneq(chan->identity_digest, - circ->n_hop->identity_digest, DIGEST_LEN)) - continue; - } - smartlist_add(out, circ); - } SMARTLIST_FOREACH_END(circ); -} - -/** Return the number of circuits in state CHAN_WAIT, waiting for the given - * channel. */ -int -circuit_count_pending_on_channel(channel_t *chan) -{ - int cnt; - smartlist_t *sl = smartlist_new(); - - tor_assert(chan); - - circuit_get_all_pending_on_channel(sl, chan); - cnt = smartlist_len(sl); - smartlist_free(sl); - log_debug(LD_CIRC,"or_conn to %s at %s, %d pending circs", - chan->nickname ? chan->nickname : "NULL", - channel_get_canonical_remote_descr(chan), - cnt); - return cnt; -} - -/** Detach from the global circuit list, and deallocate, all - * circuits that have been marked for close. - */ -void -circuit_close_all_marked(void) -{ - circuit_t *circ, *tmp; - TOR_LIST_FOREACH_SAFE(circ, &global_circuitlist, head, tmp) - if (circ->marked_for_close) - circuit_free(circ); -} - -/** Return the head of the global linked list of circuits. */ -struct global_circuitlist_s * -circuit_get_global_list(void) -{ - return &global_circuitlist; -} - -/** Function to make circ-\>state human-readable */ -const char * -circuit_state_to_string(int state) -{ - static char buf[64]; - switch (state) { - case CIRCUIT_STATE_BUILDING: return "doing handshakes"; - case CIRCUIT_STATE_ONIONSKIN_PENDING: return "processing the onion"; - case CIRCUIT_STATE_CHAN_WAIT: return "connecting to server"; - case CIRCUIT_STATE_OPEN: return "open"; - default: - log_warn(LD_BUG, "Unknown circuit state %d", state); - tor_snprintf(buf, sizeof(buf), "unknown state [%d]", state); - return buf; - } -} - -/** Map a circuit purpose to a string suitable to be displayed to a - * controller. */ -const char * -circuit_purpose_to_controller_string(uint8_t purpose) -{ - static char buf[32]; - switch (purpose) { - case CIRCUIT_PURPOSE_OR: - case CIRCUIT_PURPOSE_INTRO_POINT: - case CIRCUIT_PURPOSE_REND_POINT_WAITING: - case CIRCUIT_PURPOSE_REND_ESTABLISHED: - return "SERVER"; /* A controller should never see these, actually. */ - - case CIRCUIT_PURPOSE_C_GENERAL: - return "GENERAL"; - case CIRCUIT_PURPOSE_C_INTRODUCING: - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: - return "HS_CLIENT_INTRO"; - - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - case CIRCUIT_PURPOSE_C_REND_READY: - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - case CIRCUIT_PURPOSE_C_REND_JOINED: - return "HS_CLIENT_REND"; - - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - case CIRCUIT_PURPOSE_S_INTRO: - return "HS_SERVICE_INTRO"; - - case CIRCUIT_PURPOSE_S_CONNECT_REND: - case CIRCUIT_PURPOSE_S_REND_JOINED: - return "HS_SERVICE_REND"; - - case CIRCUIT_PURPOSE_TESTING: - return "TESTING"; - case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: - return "MEASURE_TIMEOUT"; - case CIRCUIT_PURPOSE_CONTROLLER: - return "CONTROLLER"; - case CIRCUIT_PURPOSE_PATH_BIAS_TESTING: - return "PATH_BIAS_TESTING"; - - default: - tor_snprintf(buf, sizeof(buf), "UNKNOWN_%d", (int)purpose); - return buf; - } -} - -/** Return a string specifying the state of the hidden-service circuit - * purpose purpose, or NULL if purpose is not a - * hidden-service-related circuit purpose. */ -const char * -circuit_purpose_to_controller_hs_state_string(uint8_t purpose) -{ - switch (purpose) - { - default: - log_fn(LOG_WARN, LD_BUG, - "Unrecognized circuit purpose: %d", - (int)purpose); - tor_fragile_assert(); - /* fall through */ - - case CIRCUIT_PURPOSE_OR: - case CIRCUIT_PURPOSE_C_GENERAL: - case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: - case CIRCUIT_PURPOSE_TESTING: - case CIRCUIT_PURPOSE_CONTROLLER: - case CIRCUIT_PURPOSE_PATH_BIAS_TESTING: - return NULL; - - case CIRCUIT_PURPOSE_INTRO_POINT: - return "OR_HSSI_ESTABLISHED"; - case CIRCUIT_PURPOSE_REND_POINT_WAITING: - return "OR_HSCR_ESTABLISHED"; - case CIRCUIT_PURPOSE_REND_ESTABLISHED: - return "OR_HS_R_JOINED"; - - case CIRCUIT_PURPOSE_C_INTRODUCING: - return "HSCI_CONNECTING"; - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - return "HSCI_INTRO_SENT"; - case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: - return "HSCI_DONE"; - - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - return "HSCR_CONNECTING"; - case CIRCUIT_PURPOSE_C_REND_READY: - return "HSCR_ESTABLISHED_IDLE"; - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - return "HSCR_ESTABLISHED_WAITING"; - case CIRCUIT_PURPOSE_C_REND_JOINED: - return "HSCR_JOINED"; - - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - return "HSSI_CONNECTING"; - case CIRCUIT_PURPOSE_S_INTRO: - return "HSSI_ESTABLISHED"; - - case CIRCUIT_PURPOSE_S_CONNECT_REND: - return "HSSR_CONNECTING"; - case CIRCUIT_PURPOSE_S_REND_JOINED: - return "HSSR_JOINED"; - } -} - -/** Return a human-readable string for the circuit purpose purpose. */ -const char * -circuit_purpose_to_string(uint8_t purpose) -{ - static char buf[32]; - - switch (purpose) - { - case CIRCUIT_PURPOSE_OR: - return "Circuit at relay"; - case CIRCUIT_PURPOSE_INTRO_POINT: - return "Acting as intro point"; - case CIRCUIT_PURPOSE_REND_POINT_WAITING: - return "Acting as rendevous (pending)"; - case CIRCUIT_PURPOSE_REND_ESTABLISHED: - return "Acting as rendevous (established)"; - case CIRCUIT_PURPOSE_C_GENERAL: - return "General-purpose client"; - case CIRCUIT_PURPOSE_C_INTRODUCING: - return "Hidden service client: Connecting to intro point"; - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - return "Hidden service client: Waiting for ack from intro point"; - case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: - return "Hidden service client: Received ack from intro point"; - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - return "Hidden service client: Establishing rendezvous point"; - case CIRCUIT_PURPOSE_C_REND_READY: - return "Hidden service client: Pending rendezvous point"; - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - return "Hidden service client: Pending rendezvous point (ack received)"; - case CIRCUIT_PURPOSE_C_REND_JOINED: - return "Hidden service client: Active rendezvous point"; - case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: - return "Measuring circuit timeout"; - - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - return "Hidden service: Establishing introduction point"; - case CIRCUIT_PURPOSE_S_INTRO: - return "Hidden service: Introduction point"; - case CIRCUIT_PURPOSE_S_CONNECT_REND: - return "Hidden service: Connecting to rendezvous point"; - case CIRCUIT_PURPOSE_S_REND_JOINED: - return "Hidden service: Active rendezvous point"; - - case CIRCUIT_PURPOSE_TESTING: - return "Testing circuit"; - - case CIRCUIT_PURPOSE_CONTROLLER: - return "Circuit made by controller"; - - case CIRCUIT_PURPOSE_PATH_BIAS_TESTING: - return "Path-bias testing circuit"; - - default: - tor_snprintf(buf, sizeof(buf), "UNKNOWN_%d", (int)purpose); - return buf; - } -} - -/** Pick a reasonable package_window to start out for our circuits. - * Originally this was hard-coded at 1000, but now the consensus votes - * on the answer. See proposal 168. */ -int32_t -circuit_initial_package_window(void) -{ - int32_t num = networkstatus_get_param(NULL, "circwindow", CIRCWINDOW_START, - CIRCWINDOW_START_MIN, - CIRCWINDOW_START_MAX); - /* If the consensus tells us a negative number, we'd assert. */ - if (num < 0) - num = CIRCWINDOW_START; - return num; -} - -/** Initialize the common elements in a circuit_t, and add it to the global - * list. */ -static void -init_circuit_base(circuit_t *circ) -{ - tor_gettimeofday(&circ->timestamp_created); - - // Gets reset when we send CREATE_FAST. - // circuit_expire_building() expects these to be equal - // until the orconn is built. - circ->timestamp_began = circ->timestamp_created; - - circ->package_window = circuit_initial_package_window(); - circ->deliver_window = CIRCWINDOW_START; - cell_queue_init(&circ->n_chan_cells); - - TOR_LIST_INSERT_HEAD(&global_circuitlist, circ, head); -} - -/** Allocate space for a new circuit, initializing with p_circ_id - * and p_conn. Add it to the global circuit list. - */ -origin_circuit_t * -origin_circuit_new(void) -{ - origin_circuit_t *circ; - /* never zero, since a global ID of 0 is treated specially by the - * controller */ - static uint32_t n_circuits_allocated = 1; - - circ = tor_malloc_zero(sizeof(origin_circuit_t)); - circ->base_.magic = ORIGIN_CIRCUIT_MAGIC; - - circ->next_stream_id = crypto_rand_int(1<<16); - circ->global_identifier = n_circuits_allocated++; - circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT; - circ->remaining_relay_early_cells -= crypto_rand_int(2); - - init_circuit_base(TO_CIRCUIT(circ)); - - circuit_build_times_update_last_circ(get_circuit_build_times_mutable()); - - return circ; -} - -/** Allocate a new or_circuit_t, connected to p_conn as - * p_circ_id. If p_conn is NULL, the circuit is unattached. */ -or_circuit_t * -or_circuit_new(circid_t p_circ_id, channel_t *p_chan) -{ - /* CircIDs */ - or_circuit_t *circ; - - circ = tor_malloc_zero(sizeof(or_circuit_t)); - circ->base_.magic = OR_CIRCUIT_MAGIC; - - if (p_chan) - circuit_set_p_circid_chan(circ, p_circ_id, p_chan); - - circ->remaining_relay_early_cells = MAX_RELAY_EARLY_CELLS_PER_CIRCUIT; - cell_queue_init(&circ->p_chan_cells); - - init_circuit_base(TO_CIRCUIT(circ)); - - return circ; -} - -/** Deallocate space associated with circ. - */ -STATIC void -circuit_free(circuit_t *circ) -{ - void *mem; - size_t memlen; - if (!circ) - return; - - if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - mem = ocirc; - memlen = sizeof(origin_circuit_t); - tor_assert(circ->magic == ORIGIN_CIRCUIT_MAGIC); - if (ocirc->build_state) { - extend_info_free(ocirc->build_state->chosen_exit); - circuit_free_cpath_node(ocirc->build_state->pending_final_cpath); - cpath_ref_decref(ocirc->build_state->service_pending_final_cpath_ref); - } - tor_free(ocirc->build_state); - - circuit_clear_cpath(ocirc); - - crypto_pk_free(ocirc->intro_key); - rend_data_free(ocirc->rend_data); - - tor_free(ocirc->dest_address); - if (ocirc->socks_username) { - memwipe(ocirc->socks_username, 0x12, ocirc->socks_username_len); - tor_free(ocirc->socks_username); - } - if (ocirc->socks_password) { - memwipe(ocirc->socks_password, 0x06, ocirc->socks_password_len); - tor_free(ocirc->socks_password); - } - addr_policy_list_free(ocirc->prepend_policy); - } else { - or_circuit_t *ocirc = TO_OR_CIRCUIT(circ); - /* Remember cell statistics for this circuit before deallocating. */ - if (get_options()->CellStatistics) - rep_hist_buffer_stats_add_circ(circ, time(NULL)); - mem = ocirc; - memlen = sizeof(or_circuit_t); - tor_assert(circ->magic == OR_CIRCUIT_MAGIC); - - crypto_cipher_free(ocirc->p_crypto); - crypto_digest_free(ocirc->p_digest); - crypto_cipher_free(ocirc->n_crypto); - crypto_digest_free(ocirc->n_digest); - - if (ocirc->rend_splice) { - or_circuit_t *other = ocirc->rend_splice; - tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC); - other->rend_splice = NULL; - } - - /* remove from map. */ - circuit_set_p_circid_chan(ocirc, 0, NULL); - - /* Clear cell queue _after_ removing it from the map. Otherwise our - * "active" checks will be violated. */ - cell_queue_clear(ô->p_chan_cells); - } - - extend_info_free(circ->n_hop); - tor_free(circ->n_chan_create_cell); - - TOR_LIST_REMOVE(circ, head); - - /* Remove from map. */ - circuit_set_n_circid_chan(circ, 0, NULL); - - /* Clear cell queue _after_ removing it from the map. Otherwise our - * "active" checks will be violated. */ - cell_queue_clear(&circ->n_chan_cells); - - memwipe(mem, 0xAA, memlen); /* poison memory */ - tor_free(mem); -} - -/** Deallocate the linked list circ->cpath, and remove the cpath from - * circ. */ -void -circuit_clear_cpath(origin_circuit_t *circ) -{ - crypt_path_t *victim, *head, *cpath; - - head = cpath = circ->cpath; - - if (!cpath) - return; - - /* it's a circular list, so we have to notice when we've - * gone through it once. */ - while (cpath->next && cpath->next != head) { - victim = cpath; - cpath = victim->next; - circuit_free_cpath_node(victim); - } - - circuit_free_cpath_node(cpath); - - circ->cpath = NULL; -} - -/** Release all storage held by circuits. */ -void -circuit_free_all(void) -{ - circuit_t *tmp, *tmp2; - - TOR_LIST_FOREACH_SAFE(tmp, &global_circuitlist, head, tmp2) { - if (! CIRCUIT_IS_ORIGIN(tmp)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(tmp); - while (or_circ->resolving_streams) { - edge_connection_t *next_conn; - next_conn = or_circ->resolving_streams->next_stream; - connection_free(TO_CONN(or_circ->resolving_streams)); - or_circ->resolving_streams = next_conn; - } - } - circuit_free(tmp); - } - - smartlist_free(circuits_pending_chans); - circuits_pending_chans = NULL; - - HT_CLEAR(chan_circid_map, &chan_circid_map); -} - -/** Deallocate space associated with the cpath node victim. */ -static void -circuit_free_cpath_node(crypt_path_t *victim) -{ - if (!victim) - return; - - crypto_cipher_free(victim->f_crypto); - crypto_cipher_free(victim->b_crypto); - crypto_digest_free(victim->f_digest); - crypto_digest_free(victim->b_digest); - onion_handshake_state_release(&victim->handshake_state); - crypto_dh_free(victim->rend_dh_handshake_state); - extend_info_free(victim->extend_info); - - memwipe(victim, 0xBB, sizeof(crypt_path_t)); /* poison memory */ - tor_free(victim); -} - -/** Release a crypt_path_reference_t*, which may be NULL. */ -static void -cpath_ref_decref(crypt_path_reference_t *cpath_ref) -{ - if (cpath_ref != NULL) { - if (--(cpath_ref->refcount) == 0) { - circuit_free_cpath_node(cpath_ref->cpath); - tor_free(cpath_ref); - } - } -} - -/** A helper function for circuit_dump_by_conn() below. Log a bunch - * of information about circuit circ. - */ -static void -circuit_dump_conn_details(int severity, - circuit_t *circ, - int conn_array_index, - const char *type, - circid_t this_circid, - circid_t other_circid) -{ - tor_log(severity, LD_CIRC, "Conn %d has %s circuit: circID %u " - "(other side %u), state %d (%s), born %ld:", - conn_array_index, type, (unsigned)this_circid, (unsigned)other_circid, - circ->state, circuit_state_to_string(circ->state), - (long)circ->timestamp_began.tv_sec); - if (CIRCUIT_IS_ORIGIN(circ)) { /* circ starts at this node */ - circuit_log_path(severity, LD_CIRC, TO_ORIGIN_CIRCUIT(circ)); - } -} - -/** Log, at severity severity, information about each circuit - * that is connected to conn. - */ -void -circuit_dump_by_conn(connection_t *conn, int severity) -{ - circuit_t *circ; - edge_connection_t *tmpconn; - - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0; - - if (circ->marked_for_close) { - continue; - } - - if (!CIRCUIT_IS_ORIGIN(circ)) { - p_circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - } - - if (CIRCUIT_IS_ORIGIN(circ)) { - for (tmpconn=TO_ORIGIN_CIRCUIT(circ)->p_streams; tmpconn; - tmpconn=tmpconn->next_stream) { - if (TO_CONN(tmpconn) == conn) { - circuit_dump_conn_details(severity, circ, conn->conn_array_index, - "App-ward", p_circ_id, n_circ_id); - } - } - } - - if (! CIRCUIT_IS_ORIGIN(circ)) { - for (tmpconn=TO_OR_CIRCUIT(circ)->n_streams; tmpconn; - tmpconn=tmpconn->next_stream) { - if (TO_CONN(tmpconn) == conn) { - circuit_dump_conn_details(severity, circ, conn->conn_array_index, - "Exit-ward", n_circ_id, p_circ_id); - } - } - } - } -} - -/** A helper function for circuit_dump_by_chan() below. Log a bunch - * of information about circuit circ. - */ -static void -circuit_dump_chan_details(int severity, - circuit_t *circ, - channel_t *chan, - const char *type, - circid_t this_circid, - circid_t other_circid) -{ - tor_log(severity, LD_CIRC, "Conn %p has %s circuit: circID %u " - "(other side %u), state %d (%s), born %ld:", - chan, type, (unsigned)this_circid, (unsigned)other_circid, circ->state, - circuit_state_to_string(circ->state), - (long)circ->timestamp_began.tv_sec); - if (CIRCUIT_IS_ORIGIN(circ)) { /* circ starts at this node */ - circuit_log_path(severity, LD_CIRC, TO_ORIGIN_CIRCUIT(circ)); - } -} - -/** Log, at severity severity, information about each circuit - * that is connected to chan. - */ -void -circuit_dump_by_chan(channel_t *chan, int severity) -{ - circuit_t *circ; - - tor_assert(chan); - - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - circid_t n_circ_id = circ->n_circ_id, p_circ_id = 0; - - if (circ->marked_for_close) { - continue; - } - - if (!CIRCUIT_IS_ORIGIN(circ)) { - p_circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - } - - if (! CIRCUIT_IS_ORIGIN(circ) && TO_OR_CIRCUIT(circ)->p_chan && - TO_OR_CIRCUIT(circ)->p_chan == chan) { - circuit_dump_chan_details(severity, circ, chan, "App-ward", - p_circ_id, n_circ_id); - } - - if (circ->n_chan && circ->n_chan == chan) { - circuit_dump_chan_details(severity, circ, chan, "Exit-ward", - n_circ_id, p_circ_id); - } - - if (!circ->n_chan && circ->n_hop && - channel_matches_extend_info(chan, circ->n_hop) && - tor_memeq(chan->identity_digest, - circ->n_hop->identity_digest, DIGEST_LEN)) { - circuit_dump_chan_details(severity, circ, chan, - (circ->state == CIRCUIT_STATE_OPEN && - !CIRCUIT_IS_ORIGIN(circ)) ? - "Endpoint" : "Pending", - n_circ_id, p_circ_id); - } - } -} - -/** Return the circuit whose global ID is id, or NULL if no - * such circuit exists. */ -origin_circuit_t * -circuit_get_by_global_id(uint32_t id) -{ - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (CIRCUIT_IS_ORIGIN(circ) && - TO_ORIGIN_CIRCUIT(circ)->global_identifier == id) { - if (circ->marked_for_close) - return NULL; - else - return TO_ORIGIN_CIRCUIT(circ); - } - } - return NULL; -} - -/** Return a circ such that: - * - circ-\>n_circ_id or circ-\>p_circ_id is equal to circ_id, and - * - circ is attached to chan, either as p_chan or n_chan. - * Return NULL if no such circuit exists. - * - * If found_entry_out is provided, set it to true if we have a - * placeholder entry for circid/chan, and leave it unset otherwise. - */ -static INLINE circuit_t * -circuit_get_by_circid_channel_impl(circid_t circ_id, channel_t *chan, - int *found_entry_out) -{ - chan_circid_circuit_map_t search; - chan_circid_circuit_map_t *found; - - if (_last_circid_chan_ent && - circ_id == _last_circid_chan_ent->circ_id && - chan == _last_circid_chan_ent->chan) { - found = _last_circid_chan_ent; - } else { - search.circ_id = circ_id; - search.chan = chan; - found = HT_FIND(chan_circid_map, &chan_circid_map, &search); - _last_circid_chan_ent = found; - } - if (found && found->circuit) { - log_debug(LD_CIRC, - "circuit_get_by_circid_channel_impl() returning circuit %p for" - " circ_id %u, channel ID " U64_FORMAT " (%p)", - found->circuit, (unsigned)circ_id, - U64_PRINTF_ARG(chan->global_identifier), chan); - if (found_entry_out) - *found_entry_out = 1; - return found->circuit; - } - - log_debug(LD_CIRC, - "circuit_get_by_circid_channel_impl() found %s for" - " circ_id %u, channel ID " U64_FORMAT " (%p)", - found ? "placeholder" : "nothing", - (unsigned)circ_id, - U64_PRINTF_ARG(chan->global_identifier), chan); - - if (found_entry_out) - *found_entry_out = found ? 1 : 0; - - return NULL; - /* The rest of this checks for bugs. Disabled by default. */ - /* We comment it out because coverity complains otherwise. - { - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (! CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (or_circ->p_chan == chan && or_circ->p_circ_id == circ_id) { - log_warn(LD_BUG, - "circuit matches p_chan, but not in hash table (Bug!)"); - return circ; - } - } - if (circ->n_chan == chan && circ->n_circ_id == circ_id) { - log_warn(LD_BUG, - "circuit matches n_chan, but not in hash table (Bug!)"); - return circ; - } - } - return NULL; - } */ -} - -/** Return a circ such that: - * - circ-\>n_circ_id or circ-\>p_circ_id is equal to circ_id, and - * - circ is attached to chan, either as p_chan or n_chan. - * - circ is not marked for close. - * Return NULL if no such circuit exists. - */ -circuit_t * -circuit_get_by_circid_channel(circid_t circ_id, channel_t *chan) -{ - circuit_t *circ = circuit_get_by_circid_channel_impl(circ_id, chan, NULL); - if (!circ || circ->marked_for_close) - return NULL; - else - return circ; -} - -/** Return a circ such that: - * - circ-\>n_circ_id or circ-\>p_circ_id is equal to circ_id, and - * - circ is attached to chan, either as p_chan or n_chan. - * Return NULL if no such circuit exists. - */ -circuit_t * -circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, - channel_t *chan) -{ - return circuit_get_by_circid_channel_impl(circ_id, chan, NULL); -} - -/** Return true iff the circuit ID circ_id is currently used by a - * circuit, marked or not, on chan. */ -int -circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan) -{ - int found = 0; - return circuit_get_by_circid_channel_impl(circ_id, chan, &found) != NULL - || found; -} - -/** Return the circuit that a given edge connection is using. */ -circuit_t * -circuit_get_by_edge_conn(edge_connection_t *conn) -{ - circuit_t *circ; - - circ = conn->on_circuit; - tor_assert(!circ || - (CIRCUIT_IS_ORIGIN(circ) ? circ->magic == ORIGIN_CIRCUIT_MAGIC - : circ->magic == OR_CIRCUIT_MAGIC)); - - return circ; -} - -/** For each circuit that has chan as n_chan or p_chan, unlink the - * circuit from the chan,circid map, and mark it for close if it hasn't - * been marked already. - */ -void -circuit_unlink_all_from_channel(channel_t *chan, int reason) -{ - circuit_t *circ; - - channel_unlink_all_circuits(chan); - - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - int mark = 0; - if (circ->n_chan == chan) { - circuit_set_n_circid_chan(circ, 0, NULL); - mark = 1; - - /* If we didn't request this closure, pass the remote - * bit to mark_for_close. */ - if (chan->reason_for_closing != CHANNEL_CLOSE_REQUESTED) - reason |= END_CIRC_REASON_FLAG_REMOTE; - } - if (! CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (or_circ->p_chan == chan) { - circuit_set_p_circid_chan(or_circ, 0, NULL); - mark = 1; - } - } - if (mark && !circ->marked_for_close) - circuit_mark_for_close(circ, reason); - } -} - -/** Return a circ such that - * - circ-\>rend_data-\>onion_address is equal to - * rend_data-\>onion_address, - * - circ-\>rend_data-\>rend_cookie is equal to - * rend_data-\>rend_cookie, and - * - circ-\>purpose is equal to CIRCUIT_PURPOSE_C_REND_READY. - * - * Return NULL if no such circuit exists. - */ -origin_circuit_t * -circuit_get_ready_rend_circ_by_rend_data(const rend_data_t *rend_data) -{ - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (!circ->marked_for_close && - circ->purpose == CIRCUIT_PURPOSE_C_REND_READY) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - if (ocirc->rend_data && - !rend_cmp_service_ids(rend_data->onion_address, - ocirc->rend_data->onion_address) && - tor_memeq(ocirc->rend_data->rend_cookie, - rend_data->rend_cookie, - REND_COOKIE_LEN)) - return ocirc; - } - } - return NULL; -} - -/** Return the first circuit originating here in global_circuitlist after - * start whose purpose is purpose, and where - * digest (if set) matches the rend_pk_digest field. Return NULL if no - * circuit is found. If start is NULL, begin at the start of the list. - */ -origin_circuit_t * -circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, - const char *digest, uint8_t purpose) -{ - circuit_t *circ; - tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(purpose)); - if (start == NULL) - circ = TOR_LIST_FIRST(&global_circuitlist); - else - circ = TOR_LIST_NEXT(TO_CIRCUIT(start), head); - - for ( ; circ; circ = TOR_LIST_NEXT(circ, head)) { - if (circ->marked_for_close) - continue; - if (circ->purpose != purpose) - continue; - if (!digest) - return TO_ORIGIN_CIRCUIT(circ); - else if (TO_ORIGIN_CIRCUIT(circ)->rend_data && - tor_memeq(TO_ORIGIN_CIRCUIT(circ)->rend_data->rend_pk_digest, - digest, DIGEST_LEN)) - return TO_ORIGIN_CIRCUIT(circ); - } - return NULL; -} - -/** Return the first OR circuit in the global list whose purpose is - * purpose, and whose rend_token is the len-byte - * token. */ -static or_circuit_t * -circuit_get_by_rend_token_and_purpose(uint8_t purpose, const char *token, - size_t len) -{ - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (! circ->marked_for_close && - circ->purpose == purpose && - tor_memeq(TO_OR_CIRCUIT(circ)->rend_token, token, len)) - return TO_OR_CIRCUIT(circ); - } - return NULL; -} - -/** Return the circuit waiting for a rendezvous with the provided cookie. - * Return NULL if no such circuit is found. - */ -or_circuit_t * -circuit_get_rendezvous(const char *cookie) -{ - return circuit_get_by_rend_token_and_purpose( - CIRCUIT_PURPOSE_REND_POINT_WAITING, - cookie, REND_COOKIE_LEN); -} - -/** Return the circuit waiting for intro cells of the given digest. - * Return NULL if no such circuit is found. - */ -or_circuit_t * -circuit_get_intro_point(const char *digest) -{ - return circuit_get_by_rend_token_and_purpose( - CIRCUIT_PURPOSE_INTRO_POINT, digest, - DIGEST_LEN); -} - -/** Return a circuit that is open, is CIRCUIT_PURPOSE_C_GENERAL, - * has a timestamp_dirty value of 0, has flags matching the CIRCLAUNCH_* - * flags in flags, and if info is defined, does not already use info - * as any of its hops; or NULL if no circuit fits this description. - * - * The purpose argument (currently ignored) refers to the purpose of - * the circuit we want to create, not the purpose of the circuit we want to - * cannibalize. - * - * If !CIRCLAUNCH_NEED_UPTIME, prefer returning non-uptime circuits. - */ -origin_circuit_t * -circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, - int flags) -{ - circuit_t *circ_; - origin_circuit_t *best=NULL; - int need_uptime = (flags & CIRCLAUNCH_NEED_UPTIME) != 0; - int need_capacity = (flags & CIRCLAUNCH_NEED_CAPACITY) != 0; - int internal = (flags & CIRCLAUNCH_IS_INTERNAL) != 0; - const or_options_t *options = get_options(); - - /* Make sure we're not trying to create a onehop circ by - * cannibalization. */ - tor_assert(!(flags & CIRCLAUNCH_ONEHOP_TUNNEL)); - - log_debug(LD_CIRC, - "Hunting for a circ to cannibalize: purpose %d, uptime %d, " - "capacity %d, internal %d", - purpose, need_uptime, need_capacity, internal); - - TOR_LIST_FOREACH(circ_, &global_circuitlist, head) { - if (CIRCUIT_IS_ORIGIN(circ_) && - circ_->state == CIRCUIT_STATE_OPEN && - !circ_->marked_for_close && - circ_->purpose == CIRCUIT_PURPOSE_C_GENERAL && - !circ_->timestamp_dirty) { - origin_circuit_t *circ = TO_ORIGIN_CIRCUIT(circ_); - if ((!need_uptime || circ->build_state->need_uptime) && - (!need_capacity || circ->build_state->need_capacity) && - (internal == circ->build_state->is_internal) && - !circ->unusable_for_new_conns && - circ->remaining_relay_early_cells && - circ->build_state->desired_path_len == DEFAULT_ROUTE_LEN && - !circ->build_state->onehop_tunnel && - !circ->isolation_values_set) { - if (info) { - /* need to make sure we don't duplicate hops */ - crypt_path_t *hop = circ->cpath; - const node_t *ri1 = node_get_by_id(info->identity_digest); - do { - const node_t *ri2; - if (tor_memeq(hop->extend_info->identity_digest, - info->identity_digest, DIGEST_LEN)) - goto next; - if (ri1 && - (ri2 = node_get_by_id(hop->extend_info->identity_digest)) - && nodes_in_same_family(ri1, ri2)) - goto next; - hop=hop->next; - } while (hop!=circ->cpath); - } - if (options->ExcludeNodes) { - /* Make sure no existing nodes in the circuit are excluded for - * general use. (This may be possible if StrictNodes is 0, and we - * thought we needed to use an otherwise excluded node for, say, a - * directory operation.) */ - crypt_path_t *hop = circ->cpath; - do { - if (routerset_contains_extendinfo(options->ExcludeNodes, - hop->extend_info)) - goto next; - hop = hop->next; - } while (hop != circ->cpath); - } - if (!best || (best->build_state->need_uptime && !need_uptime)) - best = circ; - next: ; - } - } - } - return best; -} - -/** Return the number of hops in circuit's path. */ -int -circuit_get_cpath_len(origin_circuit_t *circ) -{ - int n = 0; - if (circ && circ->cpath) { - crypt_path_t *cpath, *cpath_next = NULL; - for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { - cpath_next = cpath->next; - ++n; - } - } - return n; -} - -/** Return the hopnumth hop in circ->cpath, or NULL if there - * aren't that many hops in the list. */ -crypt_path_t * -circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum) -{ - if (circ && circ->cpath && hopnum > 0) { - crypt_path_t *cpath, *cpath_next = NULL; - for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { - cpath_next = cpath->next; - if (--hopnum <= 0) - return cpath; - } - } - return NULL; -} - -/** Go through the circuitlist; mark-for-close each circuit that starts - * at us but has not yet been used. */ -void -circuit_mark_all_unused_circs(void) -{ - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (CIRCUIT_IS_ORIGIN(circ) && - !circ->marked_for_close && - !circ->timestamp_dirty) - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } -} - -/** Go through the circuitlist; for each circuit that starts at us - * and is dirty, frob its timestamp_dirty so we won't use it for any - * new streams. - * - * This is useful for letting the user change pseudonyms, so new - * streams will not be linkable to old streams. - */ -void -circuit_mark_all_dirty_circs_as_unusable(void) -{ - circuit_t *circ; - TOR_LIST_FOREACH(circ, &global_circuitlist, head) { - if (CIRCUIT_IS_ORIGIN(circ) && - !circ->marked_for_close && - circ->timestamp_dirty) { - mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ)); - } - } -} - -/** Mark circ to be closed next time we call - * circuit_close_all_marked(). Do any cleanup needed: - * - If state is onionskin_pending, remove circ from the onion_pending - * list. - * - If circ isn't open yet: call circuit_build_failed() if we're - * the origin, and in either case call circuit_rep_hist_note_result() - * to note stats. - * - If purpose is C_INTRODUCE_ACK_WAIT, report the intro point - * failure we just had to the hidden service client module. - * - If purpose is C_INTRODUCING and reason isn't TIMEOUT, - * report to the hidden service client module that the intro point - * we just tried may be unreachable. - * - Send appropriate destroys and edge_destroys for conns and - * streams attached to circ. - * - If circ->rend_splice is set (we are the midpoint of a joined - * rendezvous stream), then mark the other circuit to close as well. - */ -void -circuit_mark_for_close_(circuit_t *circ, int reason, int line, - const char *file) -{ - int orig_reason = reason; /* Passed to the controller */ - assert_circuit_ok(circ); - tor_assert(line); - tor_assert(file); - - if (circ->marked_for_close) { - log_warn(LD_BUG, - "Duplicate call to circuit_mark_for_close at %s:%d" - " (first at %s:%d)", file, line, - circ->marked_for_close_file, circ->marked_for_close); - return; - } - if (reason == END_CIRC_AT_ORIGIN) { - if (!CIRCUIT_IS_ORIGIN(circ)) { - log_warn(LD_BUG, "Specified 'at-origin' non-reason for ending circuit, " - "but circuit was not at origin. (called %s:%d, purpose=%d)", - file, line, circ->purpose); - } - reason = END_CIRC_REASON_NONE; - } - - if (CIRCUIT_IS_ORIGIN(circ)) { - if (pathbias_check_close(TO_ORIGIN_CIRCUIT(circ), reason) == -1) { - /* Don't close it yet, we need to test it first */ - return; - } - - /* We don't send reasons when closing circuits at the origin. */ - reason = END_CIRC_REASON_NONE; - } - - if (reason & END_CIRC_REASON_FLAG_REMOTE) - reason &= ~END_CIRC_REASON_FLAG_REMOTE; - - if (reason < END_CIRC_REASON_MIN_ || reason > END_CIRC_REASON_MAX_) { - if (!(orig_reason & END_CIRC_REASON_FLAG_REMOTE)) - log_warn(LD_BUG, "Reason %d out of range at %s:%d", reason, file, line); - reason = END_CIRC_REASON_NONE; - } - - if (circ->state == CIRCUIT_STATE_ONIONSKIN_PENDING) { - onion_pending_remove(TO_OR_CIRCUIT(circ)); - } - /* If the circuit ever became OPEN, we sent it to the reputation history - * module then. If it isn't OPEN, we send it there now to remember which - * links worked and which didn't. - */ - if (circ->state != CIRCUIT_STATE_OPEN) { - if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - circuit_build_failed(ocirc); /* take actions if necessary */ - circuit_rep_hist_note_result(ocirc); - } - } - if (circ->state == CIRCUIT_STATE_CHAN_WAIT) { - if (circuits_pending_chans) - smartlist_remove(circuits_pending_chans, circ); - } - if (CIRCUIT_IS_ORIGIN(circ)) { - control_event_circuit_status(TO_ORIGIN_CIRCUIT(circ), - (circ->state == CIRCUIT_STATE_OPEN)?CIRC_EVENT_CLOSED:CIRC_EVENT_FAILED, - orig_reason); - } - if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - int timed_out = (reason == END_CIRC_REASON_TIMEOUT); - tor_assert(circ->state == CIRCUIT_STATE_OPEN); - tor_assert(ocirc->build_state->chosen_exit); - tor_assert(ocirc->rend_data); - /* treat this like getting a nack from it */ - log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", - safe_str_client(ocirc->rend_data->onion_address), - safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), - timed_out ? "Recording timeout." : "Removing from descriptor."); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - timed_out ? - INTRO_POINT_FAILURE_TIMEOUT : - INTRO_POINT_FAILURE_GENERIC); - } else if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && - reason != END_CIRC_REASON_TIMEOUT) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - if (ocirc->build_state->chosen_exit && ocirc->rend_data) { - log_info(LD_REND, "Failed intro circ %s to %s " - "(building circuit to intro point). " - "Marking intro point as possibly unreachable.", - safe_str_client(ocirc->rend_data->onion_address), - safe_str_client(build_state_get_exit_nickname(ocirc->build_state))); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - INTRO_POINT_FAILURE_UNREACHABLE); - } - } - if (circ->n_chan) { - circuit_clear_cell_queue(circ, circ->n_chan); - /* Only send destroy if the channel isn't closing anyway */ - if (!(circ->n_chan->state == CHANNEL_STATE_CLOSING || - circ->n_chan->state == CHANNEL_STATE_CLOSED || - circ->n_chan->state == CHANNEL_STATE_ERROR)) { - channel_send_destroy(circ->n_circ_id, circ->n_chan, reason); - } - circuitmux_detach_circuit(circ->n_chan->cmux, circ); - } - - if (! CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - edge_connection_t *conn; - for (conn=or_circ->n_streams; conn; conn=conn->next_stream) - connection_edge_destroy(or_circ->p_circ_id, conn); - or_circ->n_streams = NULL; - - while (or_circ->resolving_streams) { - conn = or_circ->resolving_streams; - or_circ->resolving_streams = conn->next_stream; - if (!conn->base_.marked_for_close) { - /* The client will see a DESTROY, and infer that the connections - * are closing because the circuit is getting torn down. No need - * to send an end cell. */ - conn->edge_has_sent_end = 1; - conn->end_reason = END_STREAM_REASON_DESTROY; - conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; - connection_mark_for_close(TO_CONN(conn)); - } - conn->on_circuit = NULL; - } - - if (or_circ->p_chan) { - circuit_clear_cell_queue(circ, or_circ->p_chan); - /* Only send destroy if the channel isn't closing anyway */ - if (!(or_circ->p_chan->state == CHANNEL_STATE_CLOSING || - or_circ->p_chan->state == CHANNEL_STATE_CLOSED || - or_circ->p_chan->state == CHANNEL_STATE_ERROR)) { - channel_send_destroy(or_circ->p_circ_id, or_circ->p_chan, reason); - } - circuitmux_detach_circuit(or_circ->p_chan->cmux, circ); - } - } else { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - edge_connection_t *conn; - for (conn=ocirc->p_streams; conn; conn=conn->next_stream) - connection_edge_destroy(circ->n_circ_id, conn); - ocirc->p_streams = NULL; - } - - circ->marked_for_close = line; - circ->marked_for_close_file = file; - - if (!CIRCUIT_IS_ORIGIN(circ)) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (or_circ->rend_splice) { - if (!or_circ->rend_splice->base_.marked_for_close) { - /* do this after marking this circuit, to avoid infinite recursion. */ - circuit_mark_for_close(TO_CIRCUIT(or_circ->rend_splice), reason); - } - or_circ->rend_splice = NULL; - } - } -} - -/** Given a marked circuit circ, aggressively free its cell queues to - * recover memory. */ -static void -marked_circuit_free_cells(circuit_t *circ) -{ - if (!circ->marked_for_close) { - log_warn(LD_BUG, "Called on non-marked circuit"); - return; - } - cell_queue_clear(&circ->n_chan_cells); - if (! CIRCUIT_IS_ORIGIN(circ)) - cell_queue_clear(& TO_OR_CIRCUIT(circ)->p_chan_cells); -} - -/** Return the number of cells used by the circuit c's cell queues. */ -STATIC size_t -n_cells_in_circ_queues(const circuit_t *c) -{ - size_t n = c->n_chan_cells.n; - if (! CIRCUIT_IS_ORIGIN(c)) { - circuit_t *cc = (circuit_t *) c; - n += TO_OR_CIRCUIT(cc)->p_chan_cells.n; - } - return n; -} - -/** - * Return the age of the oldest cell queued on c, in milliseconds. - * Return 0 if there are no cells queued on c. Requires that now be - * the current time in milliseconds since the epoch, truncated. - * - * This function will return incorrect results if the oldest cell queued on - * the circuit is older than 2**32 msec (about 49 days) old. - */ -static uint32_t -circuit_max_queued_cell_age(const circuit_t *c, uint32_t now) -{ - uint32_t age = 0; - packed_cell_t *cell; - - if (NULL != (cell = TOR_SIMPLEQ_FIRST(&c->n_chan_cells.head))) - age = now - cell->inserted_time; - - if (! CIRCUIT_IS_ORIGIN(c)) { - const or_circuit_t *orcirc = TO_OR_CIRCUIT((circuit_t*)c); - if (NULL != (cell = TOR_SIMPLEQ_FIRST(&orcirc->p_chan_cells.head))) { - uint32_t age2 = now - cell->inserted_time; - if (age2 > age) - return age2; - } - } - return age; -} - -/** Temporary variable for circuits_compare_by_oldest_queued_cell_ This is a - * kludge to work around the fact that qsort doesn't provide a way for - * comparison functions to take an extra argument. */ -static uint32_t circcomp_now_tmp; - -/** Helper to sort a list of circuit_t by age of oldest cell, in descending - * order. Requires that circcomp_now_tmp is set correctly. */ -static int -circuits_compare_by_oldest_queued_cell_(const void **a_, const void **b_) -{ - const circuit_t *a = *a_; - const circuit_t *b = *b_; - uint32_t age_a = circuit_max_queued_cell_age(a, circcomp_now_tmp); - uint32_t age_b = circuit_max_queued_cell_age(b, circcomp_now_tmp); - - if (age_a < age_b) - return 1; - else if (age_a == age_b) - return 0; - else - return -1; -} - -#define FRACTION_OF_CELLS_TO_RETAIN_ON_OOM 0.90 - -/** We're out of memory for cells, having allocated current_allocation - * bytes' worth. Kill the 'worst' circuits until we're under - * FRACTION_OF_CIRCS_TO_RETAIN_ON_OOM of our maximum usage. */ -void -circuits_handle_oom(size_t current_allocation) -{ - /* Let's hope there's enough slack space for this allocation here... */ - smartlist_t *circlist = smartlist_new(); - circuit_t *circ; - size_t n_cells_removed=0, n_cells_to_remove; - int n_circuits_killed=0; - struct timeval now; - log_notice(LD_GENERAL, "We're low on memory. Killing circuits with " - "over-long queues. (This behavior is controlled by " - "MaxMemInCellQueues.)"); - - { - size_t mem_target = (size_t)(get_options()->MaxMemInCellQueues * - FRACTION_OF_CELLS_TO_RETAIN_ON_OOM); - size_t mem_to_recover; - if (current_allocation <= mem_target) - return; - mem_to_recover = current_allocation - mem_target; - n_cells_to_remove = CEIL_DIV(mem_to_recover, packed_cell_mem_cost()); - } - - /* This algorithm itself assumes that you've got enough memory slack - * to actually run it. */ - TOR_LIST_FOREACH(circ, &global_circuitlist, head) - smartlist_add(circlist, circ); - - /* Set circcomp_now_tmp so that the sort can work. */ - tor_gettimeofday_cached(&now); - circcomp_now_tmp = (uint32_t)tv_to_msec(&now); - - /* This is O(n log n); there are faster algorithms we could use instead. - * Let's hope this doesn't happen enough to be in the critical path. */ - smartlist_sort(circlist, circuits_compare_by_oldest_queued_cell_); - - /* Okay, now the worst circuits are at the front of the list. Let's mark - * them, and reclaim their storage aggressively. */ - SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) { - size_t n = n_cells_in_circ_queues(circ); - if (! circ->marked_for_close) { - circuit_mark_for_close(circ, END_CIRC_REASON_RESOURCELIMIT); - } - marked_circuit_free_cells(circ); - - ++n_circuits_killed; - n_cells_removed += n; - if (n_cells_removed >= n_cells_to_remove) - break; - } SMARTLIST_FOREACH_END(circ); - - clean_cell_pool(); /* In case this helps. */ - - log_notice(LD_GENERAL, "Removed "U64_FORMAT" bytes by killing %d circuits.", - U64_PRINTF_ARG(n_cells_removed * packed_cell_mem_cost()), - n_circuits_killed); - - smartlist_free(circlist); -} - -/** Verify that cpath layer cp has all of its invariants - * correct. Trigger an assert if anything is invalid. - */ -void -assert_cpath_layer_ok(const crypt_path_t *cp) -{ -// tor_assert(cp->addr); /* these are zero for rendezvous extra-hops */ -// tor_assert(cp->port); - tor_assert(cp); - tor_assert(cp->magic == CRYPT_PATH_MAGIC); - switch (cp->state) - { - case CPATH_STATE_OPEN: - tor_assert(cp->f_crypto); - tor_assert(cp->b_crypto); - /* fall through */ - case CPATH_STATE_CLOSED: - /*XXXX Assert that there's no handshake_state either. */ - tor_assert(!cp->rend_dh_handshake_state); - break; - case CPATH_STATE_AWAITING_KEYS: - /* tor_assert(cp->dh_handshake_state); */ - break; - default: - log_fn(LOG_ERR, LD_BUG, "Unexpected state %d", cp->state); - tor_assert(0); - } - tor_assert(cp->package_window >= 0); - tor_assert(cp->deliver_window >= 0); -} - -/** Verify that cpath cp has all of its invariants - * correct. Trigger an assert if anything is invalid. - */ -static void -assert_cpath_ok(const crypt_path_t *cp) -{ - const crypt_path_t *start = cp; - - do { - assert_cpath_layer_ok(cp); - /* layers must be in sequence of: "open* awaiting? closed*" */ - if (cp != start) { - if (cp->state == CPATH_STATE_AWAITING_KEYS) { - tor_assert(cp->prev->state == CPATH_STATE_OPEN); - } else if (cp->state == CPATH_STATE_OPEN) { - tor_assert(cp->prev->state == CPATH_STATE_OPEN); - } - } - cp = cp->next; - tor_assert(cp); - } while (cp != start); -} - -/** Verify that circuit c has all of its invariants - * correct. Trigger an assert if anything is invalid. - */ -void -assert_circuit_ok(const circuit_t *c) -{ - edge_connection_t *conn; - const or_circuit_t *or_circ = NULL; - const origin_circuit_t *origin_circ = NULL; - - tor_assert(c); - tor_assert(c->magic == ORIGIN_CIRCUIT_MAGIC || c->magic == OR_CIRCUIT_MAGIC); - tor_assert(c->purpose >= CIRCUIT_PURPOSE_MIN_ && - c->purpose <= CIRCUIT_PURPOSE_MAX_); - - { - /* Having a separate variable for this pleases GCC 4.2 in ways I hope I - * never understand. -NM. */ - circuit_t *nonconst_circ = (circuit_t*) c; - if (CIRCUIT_IS_ORIGIN(c)) - origin_circ = TO_ORIGIN_CIRCUIT(nonconst_circ); - else - or_circ = TO_OR_CIRCUIT(nonconst_circ); - } - - if (c->n_chan) { - tor_assert(!c->n_hop); - - if (c->n_circ_id) { - /* We use the _impl variant here to make sure we don't fail on marked - * circuits, which would not be returned by the regular function. */ - circuit_t *c2 = circuit_get_by_circid_channel_impl(c->n_circ_id, - c->n_chan, NULL); - tor_assert(c == c2); - } - } - if (or_circ && or_circ->p_chan) { - if (or_circ->p_circ_id) { - /* ibid */ - circuit_t *c2 = - circuit_get_by_circid_channel_impl(or_circ->p_circ_id, - or_circ->p_chan, NULL); - tor_assert(c == c2); - } - } - if (or_circ) - for (conn = or_circ->n_streams; conn; conn = conn->next_stream) - tor_assert(conn->base_.type == CONN_TYPE_EXIT); - - tor_assert(c->deliver_window >= 0); - tor_assert(c->package_window >= 0); - if (c->state == CIRCUIT_STATE_OPEN) { - tor_assert(!c->n_chan_create_cell); - if (or_circ) { - tor_assert(or_circ->n_crypto); - tor_assert(or_circ->p_crypto); - tor_assert(or_circ->n_digest); - tor_assert(or_circ->p_digest); - } - } - if (c->state == CIRCUIT_STATE_CHAN_WAIT && !c->marked_for_close) { - tor_assert(circuits_pending_chans && - smartlist_contains(circuits_pending_chans, c)); - } else { - tor_assert(!circuits_pending_chans || - !smartlist_contains(circuits_pending_chans, c)); - } - if (origin_circ && origin_circ->cpath) { - assert_cpath_ok(origin_circ->cpath); - } - if (c->purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED) { - tor_assert(or_circ); - if (!c->marked_for_close) { - tor_assert(or_circ->rend_splice); - tor_assert(or_circ->rend_splice->rend_splice == or_circ); - } - tor_assert(or_circ->rend_splice != or_circ); - } else { - tor_assert(!or_circ || !or_circ->rend_splice); - } -} - diff --git a/src/tor/circuitlist.h b/src/tor/circuitlist.h deleted file mode 100644 index 1c8cf7de2..000000000 --- a/src/tor/circuitlist.h +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitlist.h - * \brief Header file for circuitlist.c. - **/ - -#ifndef TOR_CIRCUITLIST_H -#define TOR_CIRCUITLIST_H - -#include "testsupport.h" - -TOR_LIST_HEAD(global_circuitlist_s, circuit_t); - -struct global_circuitlist_s* circuit_get_global_list(void); -const char *circuit_state_to_string(int state); -const char *circuit_purpose_to_controller_string(uint8_t purpose); -const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose); -const char *circuit_purpose_to_string(uint8_t purpose); -void circuit_dump_by_conn(connection_t *conn, int severity); -void circuit_dump_by_chan(channel_t *chan, int severity); -void circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id, - channel_t *chan); -void circuit_set_n_circid_chan(circuit_t *circ, circid_t id, - channel_t *chan); -void channel_mark_circid_unusable(channel_t *chan, circid_t id); -void channel_mark_circid_usable(channel_t *chan, circid_t id); -void circuit_set_state(circuit_t *circ, uint8_t state); -void circuit_close_all_marked(void); -int32_t circuit_initial_package_window(void); -origin_circuit_t *origin_circuit_new(void); -or_circuit_t *or_circuit_new(circid_t p_circ_id, channel_t *p_chan); -circuit_t *circuit_get_by_circid_channel(circid_t circ_id, - channel_t *chan); -circuit_t * -circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, - channel_t *chan); -int circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan); -circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn); -void circuit_unlink_all_from_channel(channel_t *chan, int reason); -origin_circuit_t *circuit_get_by_global_id(uint32_t id); -origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data( - const rend_data_t *rend_data); -origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start, - const char *digest, uint8_t purpose); -or_circuit_t *circuit_get_rendezvous(const char *cookie); -or_circuit_t *circuit_get_intro_point(const char *digest); -origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose, - extend_info_t *info, int flags); -void circuit_mark_all_unused_circs(void); -void circuit_mark_all_dirty_circs_as_unusable(void); -void circuit_mark_for_close_(circuit_t *circ, int reason, - int line, const char *file); -int circuit_get_cpath_len(origin_circuit_t *circ); -void circuit_clear_cpath(origin_circuit_t *circ); -crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum); -void circuit_get_all_pending_on_channel(smartlist_t *out, - channel_t *chan); -int circuit_count_pending_on_channel(channel_t *chan); - -#define circuit_mark_for_close(c, reason) \ - circuit_mark_for_close_((c), (reason), __LINE__, SHORT_FILE__) - -void assert_cpath_layer_ok(const crypt_path_t *cp); -void assert_circuit_ok(const circuit_t *c); -void circuit_free_all(void); -void circuits_handle_oom(size_t current_allocation); - -void channel_note_destroy_pending(channel_t *chan, circid_t id); -void channel_note_destroy_not_pending(channel_t *chan, circid_t id); - -#ifdef CIRCUITLIST_PRIVATE -STATIC void circuit_free(circuit_t *circ); -STATIC size_t n_cells_in_circ_queues(const circuit_t *c); -#endif - -#endif - diff --git a/src/tor/circuitmux.c b/src/tor/circuitmux.c deleted file mode 100644 index f2af94393..000000000 --- a/src/tor/circuitmux.c +++ /dev/null @@ -1,1898 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitmux.c - * \brief Circuit mux/cell selection abstraction - **/ - -#include "or.h" -#include "channel.h" -#include "circuitlist.h" -#include "circuitmux.h" -#include "relay.h" - -/* - * Private typedefs for circuitmux.c - */ - -/* - * Map of muxinfos for circuitmux_t to use; struct is defined below (name - * of struct must match HT_HEAD line). - */ -typedef struct chanid_circid_muxinfo_map chanid_circid_muxinfo_map_t; - -/* - * Hash table entry (yeah, calling it chanid_circid_muxinfo_s seems to - * break the hash table code). - */ -typedef struct chanid_circid_muxinfo_t chanid_circid_muxinfo_t; - -/* - * Anything the mux wants to store per-circuit in the map; right now just - * a count of queued cells. - */ - -typedef struct circuit_muxinfo_s circuit_muxinfo_t; - -/* - * Structures for circuitmux.c - */ - -/* - * A circuitmux is a collection of circuits; it tracks which subset - * of the attached circuits are 'active' (i.e., have cells available - * to transmit) and how many cells on each. It expoes three distinct - * interfaces to other components: - * - * To channels, which each have a circuitmux_t, the supported operations - * are: - * - * circuitmux_get_first_active_circuit(): - * - * Pick one of the circuitmux's active circuits to send cells from. - * - * circuitmux_notify_xmit_cells(): - * - * Notify the circuitmux that cells have been sent on a circuit. - * - * To circuits, the exposed operations are: - * - * circuitmux_attach_circuit(): - * - * Attach a circuit to the circuitmux; this will allocate any policy- - * specific data wanted for this circuit and add it to the active - * circuits list if it has queued cells. - * - * circuitmux_detach_circuit(): - * - * Detach a circuit from the circuitmux, freeing associated structures. - * - * circuitmux_clear_num_cells(): - * - * Clear the circuitmux's cell counter for this circuit. - * - * circuitmux_set_num_cells(): - * - * Set the circuitmux's cell counter for this circuit. - * - * See circuitmux.h for the circuitmux_policy_t data structure, which contains - * a table of function pointers implementing a circuit selection policy, and - * circuitmux_ewma.c for an example of a circuitmux policy. Circuitmux - * policies can be manipulated with: - * - * circuitmux_get_policy(): - * - * Return the current policy for a circuitmux_t, if any. - * - * circuitmux_clear_policy(): - * - * Remove a policy installed on a circuitmux_t, freeing all associated - * data. The circuitmux will revert to the built-in round-robin behavior. - * - * circuitmux_set_policy(): - * - * Install a policy on a circuitmux_t; the appropriate callbacks will be - * made to attach all existing circuits to the new policy. - * - */ - -struct circuitmux_s { - /* Keep count of attached, active circuits */ - unsigned int n_circuits, n_active_circuits; - - /* Total number of queued cells on all circuits */ - unsigned int n_cells; - - /* - * Map from (channel ID, circuit ID) pairs to circuit_muxinfo_t - */ - chanid_circid_muxinfo_map_t *chanid_circid_map; - - /* - * Double-linked ring of circuits with queued cells waiting for room to - * free up on this connection's outbuf. Every time we pull cells from - * a circuit, we advance this pointer to the next circuit in the ring. - */ - struct circuit_t *active_circuits_head, *active_circuits_tail; - - /** List of queued destroy cells */ - cell_queue_t destroy_cell_queue; - /** Boolean: True iff the last cell to circuitmux_get_first_active_circuit - * returned the destroy queue. Used to force alternation between - * destroy/non-destroy cells. - * - * XXXX There is no reason to think that alternating is a particularly good - * approach -- it's just designed to prevent destroys from starving other - * cells completely. - */ - unsigned int last_cell_was_destroy : 1; - /** Destroy counter: increment this when a destroy gets queued, decrement - * when we unqueue it, so we can test to make sure they don't starve. - */ - int64_t destroy_ctr; - - /* - * Circuitmux policy; if this is non-NULL, it can override the built- - * in round-robin active circuits behavior. This is how EWMA works in - * the new circuitmux_t world. - */ - const circuitmux_policy_t *policy; - - /* Policy-specific data */ - circuitmux_policy_data_t *policy_data; -}; - -/* - * This struct holds whatever we want to store per attached circuit on a - * circuitmux_t; right now, just the count of queued cells and the direction. - */ - -struct circuit_muxinfo_s { - /* Count of cells on this circuit at last update */ - unsigned int cell_count; - /* Direction of flow */ - cell_direction_t direction; - /* Policy-specific data */ - circuitmux_policy_circ_data_t *policy_data; - /* Mark bit for consistency checker */ - unsigned int mark:1; -}; - -/* - * A map from channel ID and circuit ID to a circuit_muxinfo_t for that - * circuit. - */ - -struct chanid_circid_muxinfo_t { - HT_ENTRY(chanid_circid_muxinfo_t) node; - uint64_t chan_id; - circid_t circ_id; - circuit_muxinfo_t muxinfo; -}; - -/* - * Internal-use #defines - */ - -#ifdef CMUX_PARANOIA -#define circuitmux_assert_okay_paranoid(cmux) \ - circuitmux_assert_okay(cmux) -#else -#define circuitmux_assert_okay_paranoid(cmux) -#endif - -/* - * Static function declarations - */ - -static INLINE int -chanid_circid_entries_eq(chanid_circid_muxinfo_t *a, - chanid_circid_muxinfo_t *b); -static INLINE unsigned int -chanid_circid_entry_hash(chanid_circid_muxinfo_t *a); -static chanid_circid_muxinfo_t * -circuitmux_find_map_entry(circuitmux_t *cmux, circuit_t *circ); -static void -circuitmux_make_circuit_active(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction); -static void -circuitmux_make_circuit_inactive(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction); -static INLINE void -circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction); -static INLINE circuit_t ** -circuitmux_next_active_circ_p(circuitmux_t *cmux, circuit_t *circ); -static INLINE circuit_t ** -circuitmux_prev_active_circ_p(circuitmux_t *cmux, circuit_t *circ); -static void circuitmux_assert_okay_pass_one(circuitmux_t *cmux); -static void circuitmux_assert_okay_pass_two(circuitmux_t *cmux); -static void circuitmux_assert_okay_pass_three(circuitmux_t *cmux); - -/* Static global variables */ - -/** Count the destroy balance to debug destroy queue logic */ -static int64_t global_destroy_ctr = 0; - -/* Function definitions */ - -/** - * Linked list helpers - */ - -/** - * Move an active circuit to the tail of the cmux's active circuits list; - * used by circuitmux_notify_xmit_cells(). - */ - -static INLINE void -circuitmux_move_active_circ_to_tail(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction) -{ - circuit_t **next_p = NULL, **prev_p = NULL; - circuit_t **next_prev = NULL, **prev_next = NULL; - circuit_t **tail_next = NULL; - or_circuit_t *or_circ = NULL; - - tor_assert(cmux); - tor_assert(circ); - - circuitmux_assert_okay_paranoid(cmux); - - /* Figure out our next_p and prev_p for this cmux/direction */ - if (direction) { - if (direction == CELL_DIRECTION_OUT) { - tor_assert(circ->n_mux == cmux); - next_p = &(circ->next_active_on_n_chan); - prev_p = &(circ->prev_active_on_n_chan); - } else { - or_circ = TO_OR_CIRCUIT(circ); - tor_assert(or_circ->p_mux == cmux); - next_p = &(or_circ->next_active_on_p_chan); - prev_p = &(or_circ->prev_active_on_p_chan); - } - } else { - if (circ->n_mux == cmux) { - next_p = &(circ->next_active_on_n_chan); - prev_p = &(circ->prev_active_on_n_chan); - direction = CELL_DIRECTION_OUT; - } else { - or_circ = TO_OR_CIRCUIT(circ); - tor_assert(or_circ->p_mux == cmux); - next_p = &(or_circ->next_active_on_p_chan); - prev_p = &(or_circ->prev_active_on_p_chan); - direction = CELL_DIRECTION_IN; - } - } - tor_assert(next_p); - tor_assert(prev_p); - - /* Check if this really is an active circuit */ - if ((*next_p == NULL && *prev_p == NULL) && - !(circ == cmux->active_circuits_head || - circ == cmux->active_circuits_tail)) { - /* Not active, no-op */ - return; - } - - /* Check if this is already the tail */ - if (circ == cmux->active_circuits_tail) return; - - /* Okay, we have to move it; figure out next_prev and prev_next */ - if (*next_p) next_prev = circuitmux_prev_active_circ_p(cmux, *next_p); - if (*prev_p) prev_next = circuitmux_next_active_circ_p(cmux, *prev_p); - /* Adjust the previous node's next pointer, if any */ - if (prev_next) *prev_next = *next_p; - /* Otherwise, we were the head */ - else cmux->active_circuits_head = *next_p; - /* Adjust the next node's previous pointer, if any */ - if (next_prev) *next_prev = *prev_p; - /* We're out of the list; now re-attach at the tail */ - /* Adjust our next and prev pointers */ - *next_p = NULL; - *prev_p = cmux->active_circuits_tail; - /* Set the next pointer of the tail, or the head if none */ - if (cmux->active_circuits_tail) { - tail_next = circuitmux_next_active_circ_p(cmux, - cmux->active_circuits_tail); - *tail_next = circ; - } else { - cmux->active_circuits_head = circ; - } - /* Set the tail to this circuit */ - cmux->active_circuits_tail = circ; - - circuitmux_assert_okay_paranoid(cmux); -} - -static INLINE circuit_t ** -circuitmux_next_active_circ_p(circuitmux_t *cmux, circuit_t *circ) -{ - tor_assert(cmux); - tor_assert(circ); - - if (circ->n_mux == cmux) return &(circ->next_active_on_n_chan); - else { - tor_assert(TO_OR_CIRCUIT(circ)->p_mux == cmux); - return &(TO_OR_CIRCUIT(circ)->next_active_on_p_chan); - } -} - -static INLINE circuit_t ** -circuitmux_prev_active_circ_p(circuitmux_t *cmux, circuit_t *circ) -{ - tor_assert(cmux); - tor_assert(circ); - - if (circ->n_mux == cmux) return &(circ->prev_active_on_n_chan); - else { - tor_assert(TO_OR_CIRCUIT(circ)->p_mux == cmux); - return &(TO_OR_CIRCUIT(circ)->prev_active_on_p_chan); - } -} - -/** - * Helper for chanid_circid_cell_count_map_t hash table: compare the channel - * ID and circuit ID for a and b, and return less than, equal to, or greater - * than zero appropriately. - */ - -static INLINE int -chanid_circid_entries_eq(chanid_circid_muxinfo_t *a, - chanid_circid_muxinfo_t *b) -{ - return a->chan_id == b->chan_id && a->circ_id == b->circ_id; -} - -/** - * Helper: return a hash based on circuit ID and channel ID in a. - */ - -static INLINE unsigned int -chanid_circid_entry_hash(chanid_circid_muxinfo_t *a) -{ - return (((unsigned int)(a->circ_id) << 8) ^ - ((unsigned int)((a->chan_id >> 32) & 0xffffffff)) ^ - ((unsigned int)(a->chan_id & 0xffffffff))); -} - -/* Declare the struct chanid_circid_muxinfo_map type */ -HT_HEAD(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t); - -/* Emit a bunch of hash table stuff */ -HT_PROTOTYPE(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, - chanid_circid_entry_hash, chanid_circid_entries_eq); -HT_GENERATE(chanid_circid_muxinfo_map, chanid_circid_muxinfo_t, node, - chanid_circid_entry_hash, chanid_circid_entries_eq, 0.6, - malloc, realloc, free); - -/* - * Circuitmux alloc/free functions - */ - -/** - * Allocate a new circuitmux_t - */ - -circuitmux_t * -circuitmux_alloc(void) -{ - circuitmux_t *rv = NULL; - - rv = tor_malloc_zero(sizeof(*rv)); - rv->chanid_circid_map = tor_malloc_zero(sizeof(*( rv->chanid_circid_map))); - HT_INIT(chanid_circid_muxinfo_map, rv->chanid_circid_map); - cell_queue_init(&rv->destroy_cell_queue); - - return rv; -} - -/** - * Detach all circuits from a circuitmux (use before circuitmux_free()) - */ - -void -circuitmux_detach_all_circuits(circuitmux_t *cmux) -{ - chanid_circid_muxinfo_t **i = NULL, *to_remove; - channel_t *chan = NULL; - circuit_t *circ = NULL; - - tor_assert(cmux); - /* - * Don't circuitmux_assert_okay_paranoid() here; this gets called when - * channels are being freed and have already been unregistered, so - * the channel ID lookups it does will fail. - */ - - i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); - while (i) { - to_remove = *i; - if (to_remove) { - /* Find a channel and circuit */ - chan = channel_find_by_global_id(to_remove->chan_id); - if (chan) { - circ = - circuit_get_by_circid_channel_even_if_marked(to_remove->circ_id, - chan); - if (circ) { - /* Clear the circuit's mux for this direction */ - if (to_remove->muxinfo.direction == CELL_DIRECTION_OUT) { - /* - * Update active_circuits et al.; this does policy notifies, so - * comes before freeing policy data - */ - - if (to_remove->muxinfo.cell_count > 0) { - circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_OUT); - } - - /* Clear n_mux */ - circ->n_mux = NULL; - } else if (circ->magic == OR_CIRCUIT_MAGIC) { - /* - * Update active_circuits et al.; this does policy notifies, so - * comes before freeing policy data - */ - - if (to_remove->muxinfo.cell_count > 0) { - circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_IN); - } - - /* - * It has a sensible p_chan and direction == CELL_DIRECTION_IN, - * so clear p_mux. - */ - TO_OR_CIRCUIT(circ)->p_mux = NULL; - } else { - /* Complain and move on */ - log_warn(LD_CIRC, - "Circuit %u/channel " U64_FORMAT " had direction == " - "CELL_DIRECTION_IN, but isn't an or_circuit_t", - (unsigned)to_remove->circ_id, - U64_PRINTF_ARG(to_remove->chan_id)); - } - - /* Free policy-specific data if we have it */ - if (to_remove->muxinfo.policy_data) { - /* - * If we have policy data, assert that we have the means to - * free it - */ - tor_assert(cmux->policy); - tor_assert(cmux->policy->free_circ_data); - /* Call free_circ_data() */ - cmux->policy->free_circ_data(cmux, - cmux->policy_data, - circ, - to_remove->muxinfo.policy_data); - to_remove->muxinfo.policy_data = NULL; - } - } else { - /* Complain and move on */ - log_warn(LD_CIRC, - "Couldn't find circuit %u (for channel " U64_FORMAT ")", - (unsigned)to_remove->circ_id, - U64_PRINTF_ARG(to_remove->chan_id)); - } - } else { - /* Complain and move on */ - log_warn(LD_CIRC, - "Couldn't find channel " U64_FORMAT " (for circuit id %u)", - U64_PRINTF_ARG(to_remove->chan_id), - (unsigned)to_remove->circ_id); - } - - /* Assert that we don't have un-freed policy data for this circuit */ - tor_assert(to_remove->muxinfo.policy_data == NULL); - } - - i = HT_NEXT_RMV(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i); - - /* Free it */ - tor_free(to_remove); - } - - cmux->n_circuits = 0; - cmux->n_active_circuits = 0; - cmux->n_cells = 0; -} - -/** Reclaim all circuit IDs currently marked as unusable on chan because - * of pending destroy cells in cmux. - * - * This function must be called AFTER circuits are unlinked from the (channel, - * circuid-id) map with circuit_unlink_all_from_channel(), but before calling - * circuitmux_free(). - */ -void -circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan) -{ - packed_cell_t *cell; - int n_bad = 0; - TOR_SIMPLEQ_FOREACH(cell, &cmux->destroy_cell_queue.head, next) { - circid_t circid = 0; - if (packed_cell_is_destroy(chan, cell, &circid)) { - channel_mark_circid_usable(chan, circid); - } else { - ++n_bad; - } - } - if (n_bad) - log_warn(LD_BUG, "%d cell(s) on destroy queue did not look like a " - "DESTROY cell.", n_bad); -} - -/** - * Free a circuitmux_t; the circuits must be detached first with - * circuitmux_detach_all_circuits(). - */ - -void -circuitmux_free(circuitmux_t *cmux) -{ - if (!cmux) return; - - tor_assert(cmux->n_circuits == 0); - tor_assert(cmux->n_active_circuits == 0); - - /* - * Free policy-specific data if we have any; we don't - * need to do circuitmux_set_policy(cmux, NULL) to cover - * the circuits because they would have been handled in - * circuitmux_detach_all_circuits() before this was - * called. - */ - if (cmux->policy && cmux->policy->free_cmux_data) { - if (cmux->policy_data) { - cmux->policy->free_cmux_data(cmux, cmux->policy_data); - cmux->policy_data = NULL; - } - } else tor_assert(cmux->policy_data == NULL); - - if (cmux->chanid_circid_map) { - HT_CLEAR(chanid_circid_muxinfo_map, cmux->chanid_circid_map); - tor_free(cmux->chanid_circid_map); - } - - /* - * We're throwing away some destroys; log the counter and - * adjust the global counter by the queue size. - */ - if (cmux->destroy_cell_queue.n > 0) { - cmux->destroy_ctr -= cmux->destroy_cell_queue.n; - global_destroy_ctr -= cmux->destroy_cell_queue.n; - log_debug(LD_CIRC, - "Freeing cmux at %p with %u queued destroys; the last cmux " - "destroy balance was "I64_FORMAT", global is "I64_FORMAT, - cmux, cmux->destroy_cell_queue.n, - I64_PRINTF_ARG(cmux->destroy_ctr), - I64_PRINTF_ARG(global_destroy_ctr)); - } else { - log_debug(LD_CIRC, - "Freeing cmux at %p with no queued destroys, the cmux destroy " - "balance was "I64_FORMAT", global is "I64_FORMAT, - cmux, - I64_PRINTF_ARG(cmux->destroy_ctr), - I64_PRINTF_ARG(global_destroy_ctr)); - } - - cell_queue_clear(&cmux->destroy_cell_queue); - - tor_free(cmux); -} - -/* - * Circuitmux policy control functions - */ - -/** - * Remove any policy installed on cmux; all policy data will be freed and - * cmux behavior will revert to the built-in round-robin active_circuits - * mechanism. - */ - -void -circuitmux_clear_policy(circuitmux_t *cmux) -{ - tor_assert(cmux); - - /* Internally, this is just setting policy to NULL */ - if (cmux->policy) { - circuitmux_set_policy(cmux, NULL); - } -} - -/** - * Return the policy currently installed on a circuitmux_t - */ - -const circuitmux_policy_t * -circuitmux_get_policy(circuitmux_t *cmux) -{ - tor_assert(cmux); - - return cmux->policy; -} - -/** - * Set policy; allocate for new policy, detach all circuits from old policy - * if any, attach them to new policy, and free old policy data. - */ - -void -circuitmux_set_policy(circuitmux_t *cmux, - const circuitmux_policy_t *pol) -{ - const circuitmux_policy_t *old_pol = NULL, *new_pol = NULL; - circuitmux_policy_data_t *old_pol_data = NULL, *new_pol_data = NULL; - chanid_circid_muxinfo_t **i = NULL; - channel_t *chan = NULL; - uint64_t last_chan_id_searched = 0; - circuit_t *circ = NULL; - - tor_assert(cmux); - - /* Set up variables */ - old_pol = cmux->policy; - old_pol_data = cmux->policy_data; - new_pol = pol; - - /* Check if this is the trivial case */ - if (old_pol == new_pol) return; - - /* Allocate data for new policy, if any */ - if (new_pol && new_pol->alloc_cmux_data) { - /* - * If alloc_cmux_data is not null, then we expect to get some policy - * data. Assert that we also have free_cmux_data so we can free it - * when the time comes, and allocate it. - */ - tor_assert(new_pol->free_cmux_data); - new_pol_data = new_pol->alloc_cmux_data(cmux); - tor_assert(new_pol_data); - } - - /* Install new policy and new policy data on cmux */ - cmux->policy = new_pol; - cmux->policy_data = new_pol_data; - - /* Iterate over all circuits, attaching/detaching each one */ - i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); - while (i) { - /* Assert that this entry isn't NULL */ - tor_assert(*i); - - /* - * Get the channel; since normal case is all circuits on the mux share a - * channel, we cache last_chan_id_searched - */ - if (!chan || last_chan_id_searched != (*i)->chan_id) { - chan = channel_find_by_global_id((*i)->chan_id); - last_chan_id_searched = (*i)->chan_id; - } - tor_assert(chan); - - /* Get the circuit */ - circ = circuit_get_by_circid_channel_even_if_marked((*i)->circ_id, chan); - tor_assert(circ); - - /* Need to tell old policy it becomes inactive (i.e., it is active) ? */ - if (old_pol && old_pol->notify_circ_inactive && - (*i)->muxinfo.cell_count > 0) { - old_pol->notify_circ_inactive(cmux, old_pol_data, circ, - (*i)->muxinfo.policy_data); - } - - /* Need to free old policy data? */ - if ((*i)->muxinfo.policy_data) { - /* Assert that we have the means to free it if we have policy data */ - tor_assert(old_pol); - tor_assert(old_pol->free_circ_data); - /* Free it */ - old_pol->free_circ_data(cmux, old_pol_data, circ, - (*i)->muxinfo.policy_data); - (*i)->muxinfo.policy_data = NULL; - } - - /* Need to allocate new policy data? */ - if (new_pol && new_pol->alloc_circ_data) { - /* - * If alloc_circ_data is not null, we expect to get some per-circuit - * policy data. Assert that we also have free_circ_data so we can - * free it when the time comes, and allocate it. - */ - tor_assert(new_pol->free_circ_data); - (*i)->muxinfo.policy_data = - new_pol->alloc_circ_data(cmux, new_pol_data, circ, - (*i)->muxinfo.direction, - (*i)->muxinfo.cell_count); - } - - /* Need to make active on new policy? */ - if (new_pol && new_pol->notify_circ_active && - (*i)->muxinfo.cell_count > 0) { - new_pol->notify_circ_active(cmux, new_pol_data, circ, - (*i)->muxinfo.policy_data); - } - - /* Advance to next circuit map entry */ - i = HT_NEXT(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i); - } - - /* Free data for old policy, if any */ - if (old_pol_data) { - /* - * If we had old policy data, we should have an old policy and a free - * function for it. - */ - tor_assert(old_pol); - tor_assert(old_pol->free_cmux_data); - old_pol->free_cmux_data(cmux, old_pol_data); - old_pol_data = NULL; - } -} - -/* - * Circuitmux/circuit attachment status inquiry functions - */ - -/** - * Query the direction of an attached circuit - */ - -cell_direction_t -circuitmux_attached_circuit_direction(circuitmux_t *cmux, circuit_t *circ) -{ - chanid_circid_muxinfo_t *hashent = NULL; - - /* Try to find a map entry */ - hashent = circuitmux_find_map_entry(cmux, circ); - - /* - * This function should only be called on attached circuits; assert that - * we had a map entry. - */ - tor_assert(hashent); - - /* Return the direction from the map entry */ - return hashent->muxinfo.direction; -} - -/** - * Find an entry in the cmux's map for this circuit or return NULL if there - * is none. - */ - -static chanid_circid_muxinfo_t * -circuitmux_find_map_entry(circuitmux_t *cmux, circuit_t *circ) -{ - chanid_circid_muxinfo_t search, *hashent = NULL; - - /* Sanity-check parameters */ - tor_assert(cmux); - tor_assert(cmux->chanid_circid_map); - tor_assert(circ); - - /* Check if we have n_chan */ - if (circ->n_chan) { - /* Okay, let's see if it's attached for n_chan/n_circ_id */ - search.chan_id = circ->n_chan->global_identifier; - search.circ_id = circ->n_circ_id; - - /* Query */ - hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - &search); - } - - /* Found something? */ - if (hashent) { - /* - * Assert that the direction makes sense for a hashent we found by - * n_chan/n_circ_id before we return it. - */ - tor_assert(hashent->muxinfo.direction == CELL_DIRECTION_OUT); - } else { - /* Not there, have we got a p_chan/p_circ_id to try? */ - if (circ->magic == OR_CIRCUIT_MAGIC) { - search.circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - /* Check for p_chan */ - if (TO_OR_CIRCUIT(circ)->p_chan) { - search.chan_id = TO_OR_CIRCUIT(circ)->p_chan->global_identifier; - /* Okay, search for that */ - hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - &search); - /* Find anything? */ - if (hashent) { - /* Assert that the direction makes sense before we return it */ - tor_assert(hashent->muxinfo.direction == CELL_DIRECTION_IN); - } - } - } - } - - /* Okay, hashent is it if it was there */ - return hashent; -} - -/** - * Query whether a circuit is attached to a circuitmux - */ - -int -circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ) -{ - chanid_circid_muxinfo_t *hashent = NULL; - - /* Look if it's in the circuit map */ - hashent = circuitmux_find_map_entry(cmux, circ); - - return (hashent != NULL); -} - -/** - * Query whether a circuit is active on a circuitmux - */ - -int -circuitmux_is_circuit_active(circuitmux_t *cmux, circuit_t *circ) -{ - chanid_circid_muxinfo_t *hashent = NULL; - int is_active = 0; - - tor_assert(cmux); - tor_assert(circ); - - /* Look if it's in the circuit map */ - hashent = circuitmux_find_map_entry(cmux, circ); - if (hashent) { - /* Check the number of cells on this circuit */ - is_active = (hashent->muxinfo.cell_count > 0); - } - /* else not attached, so not active */ - - return is_active; -} - -/** - * Query number of available cells for a circuit on a circuitmux - */ - -unsigned int -circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ) -{ - chanid_circid_muxinfo_t *hashent = NULL; - unsigned int n_cells = 0; - - tor_assert(cmux); - tor_assert(circ); - - /* Look if it's in the circuit map */ - hashent = circuitmux_find_map_entry(cmux, circ); - if (hashent) { - /* Just get the cell count for this circuit */ - n_cells = hashent->muxinfo.cell_count; - } - /* else not attached, so 0 cells */ - - return n_cells; -} - -/** - * Query total number of available cells on a circuitmux - */ - -unsigned int -circuitmux_num_cells(circuitmux_t *cmux) -{ - tor_assert(cmux); - - return cmux->n_cells + cmux->destroy_cell_queue.n; -} - -/** - * Query total number of circuits active on a circuitmux - */ - -unsigned int -circuitmux_num_active_circuits(circuitmux_t *cmux) -{ - tor_assert(cmux); - - return cmux->n_active_circuits; -} - -/** - * Query total number of circuits attached to a circuitmux - */ - -unsigned int -circuitmux_num_circuits(circuitmux_t *cmux) -{ - tor_assert(cmux); - - return cmux->n_circuits; -} - -/* - * Functions for circuit code to call to update circuit status - */ - -/** - * Attach a circuit to a circuitmux, for the specified direction. - */ - -MOCK_IMPL(void, -circuitmux_attach_circuit,(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction)) -{ - channel_t *chan = NULL; - uint64_t channel_id; - circid_t circ_id; - chanid_circid_muxinfo_t search, *hashent = NULL; - unsigned int cell_count; - - tor_assert(cmux); - tor_assert(circ); - tor_assert(direction == CELL_DIRECTION_IN || - direction == CELL_DIRECTION_OUT); - circuitmux_assert_okay_paranoid(cmux); - - /* - * Figure out which channel we're using, and get the circuit's current - * cell count and circuit ID; assert that the circuit is not already - * attached to another mux. - */ - if (direction == CELL_DIRECTION_OUT) { - /* It's n_chan */ - chan = circ->n_chan; - cell_count = circ->n_chan_cells.n; - circ_id = circ->n_circ_id; - } else { - /* We want p_chan */ - chan = TO_OR_CIRCUIT(circ)->p_chan; - cell_count = TO_OR_CIRCUIT(circ)->p_chan_cells.n; - circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - } - /* Assert that we did get a channel */ - tor_assert(chan); - /* Assert that the circuit ID is sensible */ - tor_assert(circ_id != 0); - - /* Get the channel ID */ - channel_id = chan->global_identifier; - - /* See if we already have this one */ - search.chan_id = channel_id; - search.circ_id = circ_id; - hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - &search); - - if (hashent) { - /* - * This circuit was already attached to this cmux; make sure the - * directions match and update the cell count and active circuit count. - */ - log_info(LD_CIRC, - "Circuit %u on channel " U64_FORMAT " was already attached to " - "cmux %p (trying to attach to %p)", - (unsigned)circ_id, U64_PRINTF_ARG(channel_id), - ((direction == CELL_DIRECTION_OUT) ? - circ->n_mux : TO_OR_CIRCUIT(circ)->p_mux), - cmux); - - /* - * The mux pointer on this circuit and the direction in result should - * match; otherwise assert. - */ - if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == cmux); - else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == cmux); - tor_assert(hashent->muxinfo.direction == direction); - - /* - * Looks okay; just update the cell count and active circuits if we must - */ - if (hashent->muxinfo.cell_count > 0 && cell_count == 0) { - --(cmux->n_active_circuits); - circuitmux_make_circuit_inactive(cmux, circ, direction); - } else if (hashent->muxinfo.cell_count == 0 && cell_count > 0) { - ++(cmux->n_active_circuits); - circuitmux_make_circuit_active(cmux, circ, direction); - } - cmux->n_cells -= hashent->muxinfo.cell_count; - cmux->n_cells += cell_count; - hashent->muxinfo.cell_count = cell_count; - } else { - /* - * New circuit; add an entry and update the circuit/active circuit - * counts. - */ - log_debug(LD_CIRC, - "Attaching circuit %u on channel " U64_FORMAT " to cmux %p", - (unsigned)circ_id, U64_PRINTF_ARG(channel_id), cmux); - - /* - * Assert that the circuit doesn't already have a mux for this - * direction. - */ - if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == NULL); - else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == NULL); - - /* Insert it in the map */ - hashent = tor_malloc_zero(sizeof(*hashent)); - hashent->chan_id = channel_id; - hashent->circ_id = circ_id; - hashent->muxinfo.cell_count = cell_count; - hashent->muxinfo.direction = direction; - /* Allocate policy specific circuit data if we need it */ - if (cmux->policy && cmux->policy->alloc_circ_data) { - /* Assert that we have the means to free policy-specific data */ - tor_assert(cmux->policy->free_circ_data); - /* Allocate it */ - hashent->muxinfo.policy_data = - cmux->policy->alloc_circ_data(cmux, - cmux->policy_data, - circ, - direction, - cell_count); - /* If we wanted policy data, it's an error not to get any */ - tor_assert(hashent->muxinfo.policy_data); - } - HT_INSERT(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - hashent); - - /* Set the circuit's mux for this direction */ - if (direction == CELL_DIRECTION_OUT) circ->n_mux = cmux; - else TO_OR_CIRCUIT(circ)->p_mux = cmux; - - /* Make sure the next/prev pointers are NULL */ - if (direction == CELL_DIRECTION_OUT) { - circ->next_active_on_n_chan = NULL; - circ->prev_active_on_n_chan = NULL; - } else { - TO_OR_CIRCUIT(circ)->next_active_on_p_chan = NULL; - TO_OR_CIRCUIT(circ)->prev_active_on_p_chan = NULL; - } - - /* Update counters */ - ++(cmux->n_circuits); - if (cell_count > 0) { - ++(cmux->n_active_circuits); - circuitmux_make_circuit_active(cmux, circ, direction); - } - cmux->n_cells += cell_count; - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/** - * Detach a circuit from a circuitmux and update all counters as needed; - * no-op if not attached. - */ - -MOCK_IMPL(void, -circuitmux_detach_circuit,(circuitmux_t *cmux, circuit_t *circ)) -{ - chanid_circid_muxinfo_t search, *hashent = NULL; - /* - * Use this to keep track of whether we found it for n_chan or - * p_chan for consistency checking. - */ - cell_direction_t last_searched_direction; - - tor_assert(cmux); - tor_assert(cmux->chanid_circid_map); - tor_assert(circ); - circuitmux_assert_okay_paranoid(cmux); - - /* See if we have it for n_chan/n_circ_id */ - if (circ->n_chan) { - search.chan_id = circ->n_chan->global_identifier; - search.circ_id = circ->n_circ_id; - hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - &search); - last_searched_direction = CELL_DIRECTION_OUT; - } - - /* Got one? If not, see if it's an or_circuit_t and try p_chan/p_circ_id */ - if (!hashent) { - if (circ->magic == OR_CIRCUIT_MAGIC) { - search.circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - if (TO_OR_CIRCUIT(circ)->p_chan) { - search.chan_id = TO_OR_CIRCUIT(circ)->p_chan->global_identifier; - hashent = HT_FIND(chanid_circid_muxinfo_map, - cmux->chanid_circid_map, - &search); - last_searched_direction = CELL_DIRECTION_IN; - } - } - } - - /* - * If hashent isn't NULL, we have a circuit to detach; don't remove it from - * the map until later of circuitmux_make_circuit_inactive() breaks. - */ - if (hashent) { - /* Update counters */ - --(cmux->n_circuits); - if (hashent->muxinfo.cell_count > 0) { - --(cmux->n_active_circuits); - /* This does policy notifies, so comes before freeing policy data */ - circuitmux_make_circuit_inactive(cmux, circ, last_searched_direction); - } - cmux->n_cells -= hashent->muxinfo.cell_count; - - /* Free policy-specific data if we have it */ - if (hashent->muxinfo.policy_data) { - /* If we have policy data, assert that we have the means to free it */ - tor_assert(cmux->policy); - tor_assert(cmux->policy->free_circ_data); - /* Call free_circ_data() */ - cmux->policy->free_circ_data(cmux, - cmux->policy_data, - circ, - hashent->muxinfo.policy_data); - hashent->muxinfo.policy_data = NULL; - } - - /* Consistency check: the direction must match the direction searched */ - tor_assert(last_searched_direction == hashent->muxinfo.direction); - /* Clear the circuit's mux for this direction */ - if (last_searched_direction == CELL_DIRECTION_OUT) circ->n_mux = NULL; - else TO_OR_CIRCUIT(circ)->p_mux = NULL; - - /* Now remove it from the map */ - HT_REMOVE(chanid_circid_muxinfo_map, cmux->chanid_circid_map, hashent); - - /* Free the hash entry */ - tor_free(hashent); - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/** - * Make a circuit active; update active list and policy-specific info, but - * we don't mess with the counters or hash table here. - */ - -static void -circuitmux_make_circuit_active(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction) -{ - circuit_t **next_active = NULL, **prev_active = NULL, **next_prev = NULL; - circuitmux_t *circuit_cmux = NULL; - chanid_circid_muxinfo_t *hashent = NULL; - channel_t *chan = NULL; - circid_t circ_id; - int already_active; - - tor_assert(cmux); - tor_assert(circ); - tor_assert(direction == CELL_DIRECTION_OUT || - direction == CELL_DIRECTION_IN); - /* - * Don't circuitmux_assert_okay_paranoid(cmux) here because the cell count - * already got changed and we have to update the list for it to be consistent - * again. - */ - - /* Get the right set of active list links for this direction */ - if (direction == CELL_DIRECTION_OUT) { - next_active = &(circ->next_active_on_n_chan); - prev_active = &(circ->prev_active_on_n_chan); - circuit_cmux = circ->n_mux; - chan = circ->n_chan; - circ_id = circ->n_circ_id; - } else { - next_active = &(TO_OR_CIRCUIT(circ)->next_active_on_p_chan); - prev_active = &(TO_OR_CIRCUIT(circ)->prev_active_on_p_chan); - circuit_cmux = TO_OR_CIRCUIT(circ)->p_mux; - chan = TO_OR_CIRCUIT(circ)->p_chan; - circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - } - - /* Assert that it is attached to this mux and a channel */ - tor_assert(cmux == circuit_cmux); - tor_assert(chan != NULL); - - /* - * Check if the circuit really was inactive; if it's active, at least one - * of the next_active and prev_active pointers will not be NULL, or this - * circuit will be either the head or tail of the list for this cmux. - */ - already_active = (*prev_active != NULL || *next_active != NULL || - cmux->active_circuits_head == circ || - cmux->active_circuits_tail == circ); - - /* If we're already active, log a warning and finish */ - if (already_active) { - log_warn(LD_CIRC, - "Circuit %u on channel " U64_FORMAT " was already active", - (unsigned)circ_id, U64_PRINTF_ARG(chan->global_identifier)); - return; - } - - /* - * This is going at the head of the list; if the old head is not NULL, - * then its prev pointer should point to this. - */ - *next_active = cmux->active_circuits_head; /* Next is old head */ - *prev_active = NULL; /* Prev is NULL (this will be the head) */ - if (cmux->active_circuits_head) { - /* The list had an old head; update its prev pointer */ - next_prev = - circuitmux_prev_active_circ_p(cmux, cmux->active_circuits_head); - tor_assert(next_prev); - *next_prev = circ; - } else { - /* The list was empty; this becomes the tail as well */ - cmux->active_circuits_tail = circ; - } - /* This becomes the new head of the list */ - cmux->active_circuits_head = circ; - - /* Policy-specific notification */ - if (cmux->policy && - cmux->policy->notify_circ_active) { - /* Okay, we need to check the circuit for policy data now */ - hashent = circuitmux_find_map_entry(cmux, circ); - /* We should have found something */ - tor_assert(hashent); - /* Notify */ - cmux->policy->notify_circ_active(cmux, cmux->policy_data, - circ, hashent->muxinfo.policy_data); - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/** - * Make a circuit inactive; update active list and policy-specific info, but - * we don't mess with the counters or hash table here. - */ - -static void -circuitmux_make_circuit_inactive(circuitmux_t *cmux, circuit_t *circ, - cell_direction_t direction) -{ - circuit_t **next_active = NULL, **prev_active = NULL; - circuit_t **next_prev = NULL, **prev_next = NULL; - circuitmux_t *circuit_cmux = NULL; - chanid_circid_muxinfo_t *hashent = NULL; - channel_t *chan = NULL; - circid_t circ_id; - int already_inactive; - - tor_assert(cmux); - tor_assert(circ); - tor_assert(direction == CELL_DIRECTION_OUT || - direction == CELL_DIRECTION_IN); - /* - * Don't circuitmux_assert_okay_paranoid(cmux) here because the cell count - * already got changed and we have to update the list for it to be consistent - * again. - */ - - /* Get the right set of active list links for this direction */ - if (direction == CELL_DIRECTION_OUT) { - next_active = &(circ->next_active_on_n_chan); - prev_active = &(circ->prev_active_on_n_chan); - circuit_cmux = circ->n_mux; - chan = circ->n_chan; - circ_id = circ->n_circ_id; - } else { - next_active = &(TO_OR_CIRCUIT(circ)->next_active_on_p_chan); - prev_active = &(TO_OR_CIRCUIT(circ)->prev_active_on_p_chan); - circuit_cmux = TO_OR_CIRCUIT(circ)->p_mux; - chan = TO_OR_CIRCUIT(circ)->p_chan; - circ_id = TO_OR_CIRCUIT(circ)->p_circ_id; - } - - /* Assert that it is attached to this mux and a channel */ - tor_assert(cmux == circuit_cmux); - tor_assert(chan != NULL); - - /* - * Check if the circuit really was active; if it's inactive, the - * next_active and prev_active pointers will be NULL and this circuit - * will not be the head or tail of the list for this cmux. - */ - already_inactive = (*prev_active == NULL && *next_active == NULL && - cmux->active_circuits_head != circ && - cmux->active_circuits_tail != circ); - - /* If we're already inactive, log a warning and finish */ - if (already_inactive) { - log_warn(LD_CIRC, - "Circuit %d on channel " U64_FORMAT " was already inactive", - (unsigned)circ_id, U64_PRINTF_ARG(chan->global_identifier)); - return; - } - - /* Remove from the list; first get next_prev and prev_next */ - if (*next_active) { - /* - * If there's a next circuit, its previous circuit becomes this - * circuit's previous circuit. - */ - next_prev = circuitmux_prev_active_circ_p(cmux, *next_active); - } else { - /* Else, the tail becomes this circuit's previous circuit */ - next_prev = &(cmux->active_circuits_tail); - } - - /* Got next_prev, now prev_next */ - if (*prev_active) { - /* - * If there's a previous circuit, its next circuit becomes this circuit's - * next circuit. - */ - prev_next = circuitmux_next_active_circ_p(cmux, *prev_active); - } else { - /* Else, the head becomes this circuit's next circuit */ - prev_next = &(cmux->active_circuits_head); - } - - /* Assert that we got sensible values for the next/prev pointers */ - tor_assert(next_prev != NULL); - tor_assert(prev_next != NULL); - - /* Update the next/prev pointers - this removes circ from the list */ - *next_prev = *prev_active; - *prev_next = *next_active; - - /* Now null out prev_active/next_active */ - *prev_active = NULL; - *next_active = NULL; - - /* Policy-specific notification */ - if (cmux->policy && - cmux->policy->notify_circ_inactive) { - /* Okay, we need to check the circuit for policy data now */ - hashent = circuitmux_find_map_entry(cmux, circ); - /* We should have found something */ - tor_assert(hashent); - /* Notify */ - cmux->policy->notify_circ_inactive(cmux, cmux->policy_data, - circ, hashent->muxinfo.policy_data); - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/** - * Clear the cell counter for a circuit on a circuitmux - */ - -void -circuitmux_clear_num_cells(circuitmux_t *cmux, circuit_t *circ) -{ - /* This is the same as setting the cell count to zero */ - circuitmux_set_num_cells(cmux, circ, 0); -} - -/** - * Set the cell counter for a circuit on a circuitmux - */ - -void -circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ, - unsigned int n_cells) -{ - chanid_circid_muxinfo_t *hashent = NULL; - - tor_assert(cmux); - tor_assert(circ); - - circuitmux_assert_okay_paranoid(cmux); - - /* Search for this circuit's entry */ - hashent = circuitmux_find_map_entry(cmux, circ); - /* Assert that we found one */ - tor_assert(hashent); - - /* Update cmux cell counter */ - cmux->n_cells -= hashent->muxinfo.cell_count; - cmux->n_cells += n_cells; - - /* Do we need to notify a cmux policy? */ - if (cmux->policy && cmux->policy->notify_set_n_cells) { - /* Call notify_set_n_cells */ - cmux->policy->notify_set_n_cells(cmux, - cmux->policy_data, - circ, - hashent->muxinfo.policy_data, - n_cells); - } - - /* - * Update cmux active circuit counter: is the old cell count > 0 and the - * new cell count == 0 ? - */ - if (hashent->muxinfo.cell_count > 0 && n_cells == 0) { - --(cmux->n_active_circuits); - hashent->muxinfo.cell_count = n_cells; - circuitmux_make_circuit_inactive(cmux, circ, hashent->muxinfo.direction); - /* Is the old cell count == 0 and the new cell count > 0 ? */ - } else if (hashent->muxinfo.cell_count == 0 && n_cells > 0) { - ++(cmux->n_active_circuits); - hashent->muxinfo.cell_count = n_cells; - circuitmux_make_circuit_active(cmux, circ, hashent->muxinfo.direction); - } else { - /* - * Update the entry cell count like this so we can put a - * circuitmux_assert_okay_paranoid inside make_circuit_(in)active() too. - */ - hashent->muxinfo.cell_count = n_cells; - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/* - * Functions for channel code to call to get a circuit to transmit from or - * notify that cells have been transmitted. - */ - -/** - * Pick a circuit to send from, using the active circuits list or a - * circuitmux policy if one is available. This is called from channel.c. - * - * If we would rather send a destroy cell, return NULL and set - * *destroy_queue_out to the destroy queue. - * - * If we have nothing to send, set *destroy_queue_out to NULL and - * return NULL. - */ - -circuit_t * -circuitmux_get_first_active_circuit(circuitmux_t *cmux, - cell_queue_t **destroy_queue_out) -{ - circuit_t *circ = NULL; - - tor_assert(cmux); - tor_assert(destroy_queue_out); - - *destroy_queue_out = NULL; - - if (cmux->destroy_cell_queue.n && - (!cmux->last_cell_was_destroy || cmux->n_active_circuits == 0)) { - /* We have destroy cells to send, and either we just sent a relay cell, - * or we have no relay cells to send. */ - - /* XXXX We should let the cmux policy have some say in this eventually. */ - /* XXXX Alternating is not a terribly brilliant approach here. */ - *destroy_queue_out = &cmux->destroy_cell_queue; - - cmux->last_cell_was_destroy = 1; - } else if (cmux->n_active_circuits > 0) { - /* We also must have a cell available for this to be the case */ - tor_assert(cmux->n_cells > 0); - /* Do we have a policy-provided circuit selector? */ - if (cmux->policy && cmux->policy->pick_active_circuit) { - circ = cmux->policy->pick_active_circuit(cmux, cmux->policy_data); - } - /* Fall back on the head of the active circuits list */ - if (!circ) { - tor_assert(cmux->active_circuits_head); - circ = cmux->active_circuits_head; - } - cmux->last_cell_was_destroy = 0; - } else { - tor_assert(cmux->n_cells == 0); - tor_assert(cmux->destroy_cell_queue.n == 0); - } - - return circ; -} - -/** - * Notify the circuitmux that cells have been sent on a circuit; this - * is called from channel.c. - */ - -void -circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ, - unsigned int n_cells) -{ - chanid_circid_muxinfo_t *hashent = NULL; - int becomes_inactive = 0; - - tor_assert(cmux); - tor_assert(circ); - circuitmux_assert_okay_paranoid(cmux); - - if (n_cells == 0) return; - - /* - * To handle this, we have to: - * - * 1.) Adjust the circuit's cell counter in the cmux hash table - * 2.) Move the circuit to the tail of the active_circuits linked list - * for this cmux, or make the circuit inactive if the cell count - * went to zero. - * 3.) Call cmux->policy->notify_xmit_cells(), if any - */ - - /* Find the hash entry */ - hashent = circuitmux_find_map_entry(cmux, circ); - /* Assert that we found one */ - tor_assert(hashent); - - /* Adjust the cell counter and assert that we had that many cells to send */ - tor_assert(n_cells <= hashent->muxinfo.cell_count); - hashent->muxinfo.cell_count -= n_cells; - /* Do we need to make the circuit inactive? */ - if (hashent->muxinfo.cell_count == 0) becomes_inactive = 1; - /* Adjust the mux cell counter */ - cmux->n_cells -= n_cells; - - /* If we aren't making it inactive later, move it to the tail of the list */ - if (!becomes_inactive) { - circuitmux_move_active_circ_to_tail(cmux, circ, - hashent->muxinfo.direction); - } - - /* - * We call notify_xmit_cells() before making the circuit inactive if needed, - * so the policy can always count on this coming in on an active circuit. - */ - if (cmux->policy && cmux->policy->notify_xmit_cells) { - cmux->policy->notify_xmit_cells(cmux, cmux->policy_data, circ, - hashent->muxinfo.policy_data, - n_cells); - } - - /* - * Now make the circuit inactive if needed; this will call the policy's - * notify_circ_inactive() if present. - */ - if (becomes_inactive) { - --(cmux->n_active_circuits); - circuitmux_make_circuit_inactive(cmux, circ, hashent->muxinfo.direction); - } - - circuitmux_assert_okay_paranoid(cmux); -} - -/** - * Notify the circuitmux that a destroy was sent, so we can update - * the counter. - */ - -void -circuitmux_notify_xmit_destroy(circuitmux_t *cmux) -{ - tor_assert(cmux); - - --(cmux->destroy_ctr); - --(global_destroy_ctr); - log_debug(LD_CIRC, - "Cmux at %p sent a destroy, cmux counter is now "I64_FORMAT", " - "global counter is now "I64_FORMAT, - cmux, - I64_PRINTF_ARG(cmux->destroy_ctr), - I64_PRINTF_ARG(global_destroy_ctr)); -} - -/* - * Circuitmux consistency checking assertions - */ - -/** - * Check that circuitmux data structures are consistent and fail with an - * assert if not. - */ - -void -circuitmux_assert_okay(circuitmux_t *cmux) -{ - tor_assert(cmux); - - /* - * Pass 1: iterate the hash table; for each entry: - * a) Check that the circuit has this cmux for n_mux or p_mux - * b) If the cell_count is > 0, set the mark bit; otherwise clear it - * c) Also check activeness (cell_count > 0 should be active) - * d) Count the number of circuits, active circuits and queued cells - * and at the end check that they match the counters in the cmux. - * - * Pass 2: iterate the active circuits list; for each entry, - * make sure the circuit is attached to this mux and appears - * in the hash table. Make sure the mark bit is 1, and clear - * it in the hash table entry. Consistency-check the linked - * list pointers. - * - * Pass 3: iterate the hash table again; assert if any active circuits - * (mark bit set to 1) are discovered that weren't cleared in pass 2 - * (don't appear in the linked list). - */ - - circuitmux_assert_okay_pass_one(cmux); - circuitmux_assert_okay_pass_two(cmux); - circuitmux_assert_okay_pass_three(cmux); -} - -/** - * Do the first pass of circuitmux_assert_okay(); see the comment in that - * function. - */ - -static void -circuitmux_assert_okay_pass_one(circuitmux_t *cmux) -{ - chanid_circid_muxinfo_t **i = NULL; - uint64_t chan_id; - channel_t *chan; - circid_t circ_id; - circuit_t *circ; - or_circuit_t *or_circ; - unsigned int circ_is_active; - circuit_t **next_p, **prev_p; - unsigned int n_circuits, n_active_circuits, n_cells; - - tor_assert(cmux); - tor_assert(cmux->chanid_circid_map); - - /* Reset the counters */ - n_circuits = n_active_circuits = n_cells = 0; - /* Start iterating the hash table */ - i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); - while (i) { - /* Assert that the hash table entry isn't null */ - tor_assert(*i); - - /* Get the channel and circuit id */ - chan_id = (*i)->chan_id; - circ_id = (*i)->circ_id; - - /* Find the channel and circuit, assert that they exist */ - chan = channel_find_by_global_id(chan_id); - tor_assert(chan); - circ = circuit_get_by_circid_channel_even_if_marked(circ_id, chan); - tor_assert(circ); - /* Clear the circ_is_active bit to start */ - circ_is_active = 0; - - /* Assert that we know which direction this is going */ - tor_assert((*i)->muxinfo.direction == CELL_DIRECTION_OUT || - (*i)->muxinfo.direction == CELL_DIRECTION_IN); - - if ((*i)->muxinfo.direction == CELL_DIRECTION_OUT) { - /* We should be n_mux on this circuit */ - tor_assert(cmux == circ->n_mux); - tor_assert(chan == circ->n_chan); - /* Get next and prev for next test */ - next_p = &(circ->next_active_on_n_chan); - prev_p = &(circ->prev_active_on_n_chan); - } else { - /* This should be an or_circuit_t and we should be p_mux */ - or_circ = TO_OR_CIRCUIT(circ); - tor_assert(cmux == or_circ->p_mux); - tor_assert(chan == or_circ->p_chan); - /* Get next and prev for next test */ - next_p = &(or_circ->next_active_on_p_chan); - prev_p = &(or_circ->prev_active_on_p_chan); - } - - /* - * Should this circuit be active? I.e., does the mux know about > 0 - * cells on it? - */ - circ_is_active = ((*i)->muxinfo.cell_count > 0); - - /* It should be in the linked list iff it's active */ - if (circ_is_active) { - /* Either we have a next link or we are the tail */ - tor_assert(*next_p || (circ == cmux->active_circuits_tail)); - /* Either we have a prev link or we are the head */ - tor_assert(*prev_p || (circ == cmux->active_circuits_head)); - /* Increment the active circuits counter */ - ++n_active_circuits; - } else { - /* Shouldn't be in list, so no next or prev link */ - tor_assert(!(*next_p)); - tor_assert(!(*prev_p)); - /* And can't be head or tail */ - tor_assert(circ != cmux->active_circuits_head); - tor_assert(circ != cmux->active_circuits_tail); - } - - /* Increment the circuits counter */ - ++n_circuits; - /* Adjust the cell counter */ - n_cells += (*i)->muxinfo.cell_count; - - /* Set the mark bit to circ_is_active */ - (*i)->muxinfo.mark = circ_is_active; - - /* Advance to the next entry */ - i = HT_NEXT(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i); - } - - /* Now check the counters */ - tor_assert(n_cells == cmux->n_cells); - tor_assert(n_circuits == cmux->n_circuits); - tor_assert(n_active_circuits == cmux->n_active_circuits); -} - -/** - * Do the second pass of circuitmux_assert_okay(); see the comment in that - * function. - */ - -static void -circuitmux_assert_okay_pass_two(circuitmux_t *cmux) -{ - circuit_t *curr_circ, *prev_circ = NULL, *next_circ; - or_circuit_t *curr_or_circ; - uint64_t curr_chan_id; - circid_t curr_circ_id; - circuit_t **next_p, **prev_p; - channel_t *chan; - unsigned int n_active_circuits = 0; - cell_direction_t direction; - chanid_circid_muxinfo_t search, *hashent = NULL; - - tor_assert(cmux); - tor_assert(cmux->chanid_circid_map); - - /* - * Walk the linked list of active circuits in cmux; keep track of the - * previous circuit seen for consistency checking purposes. Count them - * to make sure the number in the linked list matches - * cmux->n_active_circuits. - */ - curr_circ = cmux->active_circuits_head; - while (curr_circ) { - /* Reset some things */ - chan = NULL; - curr_or_circ = NULL; - next_circ = NULL; - next_p = prev_p = NULL; - direction = 0; - - /* Figure out if this is n_mux or p_mux */ - if (cmux == curr_circ->n_mux) { - /* Get next_p and prev_p */ - next_p = &(curr_circ->next_active_on_n_chan); - prev_p = &(curr_circ->prev_active_on_n_chan); - /* Get the channel */ - chan = curr_circ->n_chan; - /* Get the circuit id */ - curr_circ_id = curr_circ->n_circ_id; - /* Remember the direction */ - direction = CELL_DIRECTION_OUT; - } else { - /* We must be p_mux and this must be an or_circuit_t */ - curr_or_circ = TO_OR_CIRCUIT(curr_circ); - tor_assert(cmux == curr_or_circ->p_mux); - /* Get next_p and prev_p */ - next_p = &(curr_or_circ->next_active_on_p_chan); - prev_p = &(curr_or_circ->prev_active_on_p_chan); - /* Get the channel */ - chan = curr_or_circ->p_chan; - /* Get the circuit id */ - curr_circ_id = curr_or_circ->p_circ_id; - /* Remember the direction */ - direction = CELL_DIRECTION_IN; - } - - /* Assert that we got a channel and get the channel ID */ - tor_assert(chan); - curr_chan_id = chan->global_identifier; - - /* Assert that prev_p points to last circuit we saw */ - tor_assert(*prev_p == prev_circ); - /* If that's NULL, assert that we are the head */ - if (!(*prev_p)) tor_assert(curr_circ == cmux->active_circuits_head); - - /* Get the next circuit */ - next_circ = *next_p; - /* If it's NULL, assert that we are the tail */ - if (!(*next_p)) tor_assert(curr_circ == cmux->active_circuits_tail); - - /* Now find the hash table entry for this circuit */ - search.chan_id = curr_chan_id; - search.circ_id = curr_circ_id; - hashent = HT_FIND(chanid_circid_muxinfo_map, cmux->chanid_circid_map, - &search); - - /* Assert that we have one */ - tor_assert(hashent); - - /* Assert that the direction matches */ - tor_assert(direction == hashent->muxinfo.direction); - - /* Assert that the hash entry got marked in pass one */ - tor_assert(hashent->muxinfo.mark); - - /* Clear the mark */ - hashent->muxinfo.mark = 0; - - /* Increment the counter */ - ++n_active_circuits; - - /* Advance to the next active circuit and update prev_circ */ - prev_circ = curr_circ; - curr_circ = next_circ; - } - - /* Assert that the counter matches the cmux */ - tor_assert(n_active_circuits == cmux->n_active_circuits); -} - -/** - * Do the third pass of circuitmux_assert_okay(); see the comment in that - * function. - */ - -static void -circuitmux_assert_okay_pass_three(circuitmux_t *cmux) -{ - chanid_circid_muxinfo_t **i = NULL; - - tor_assert(cmux); - tor_assert(cmux->chanid_circid_map); - - /* Start iterating the hash table */ - i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); - - /* Advance through each entry */ - while (i) { - /* Assert that it isn't null */ - tor_assert(*i); - - /* - * Assert that this entry is not marked - i.e., that either we didn't - * think it should be active in pass one or we saw it in the active - * circuits linked list. - */ - tor_assert(!((*i)->muxinfo.mark)); - - /* Advance to the next entry */ - i = HT_NEXT(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i); - } -} - -/*DOCDOC */ -void -circuitmux_append_destroy_cell(channel_t *chan, - circuitmux_t *cmux, - circid_t circ_id, - uint8_t reason) -{ - cell_t cell; - memset(&cell, 0, sizeof(cell_t)); - cell.circ_id = circ_id; - cell.command = CELL_DESTROY; - cell.payload[0] = (uint8_t) reason; - - cell_queue_append_packed_copy(NULL, &cmux->destroy_cell_queue, 0, &cell, - chan->wide_circ_ids, 0); - - /* Destroy entering the queue, update counters */ - ++(cmux->destroy_ctr); - ++global_destroy_ctr; - log_debug(LD_CIRC, - "Cmux at %p queued a destroy for circ %u, cmux counter is now " - I64_FORMAT", global counter is now "I64_FORMAT, - cmux, circ_id, - I64_PRINTF_ARG(cmux->destroy_ctr), - I64_PRINTF_ARG(global_destroy_ctr)); - - /* XXXX Duplicate code from append_cell_to_circuit_queue */ - if (!channel_has_queued_writes(chan)) { - /* There is no data at all waiting to be sent on the outbuf. Add a - * cell, so that we can notice when it gets flushed, flushed_some can - * get called, and we can start putting more data onto the buffer then. - */ - log_debug(LD_GENERAL, "Primed a buffer."); - channel_flush_from_first_active_circuit(chan, 1); - } -} - diff --git a/src/tor/circuitmux.h b/src/tor/circuitmux.h deleted file mode 100644 index ee2f5d153..000000000 --- a/src/tor/circuitmux.h +++ /dev/null @@ -1,147 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitmux.h - * \brief Header file for circuitmux.c - **/ - -#ifndef TOR_CIRCUITMUX_H -#define TOR_CIRCUITMUX_H - -#include "or.h" -#include "testsupport.h" - -typedef struct circuitmux_policy_s circuitmux_policy_t; -typedef struct circuitmux_policy_data_s circuitmux_policy_data_t; -typedef struct circuitmux_policy_circ_data_s circuitmux_policy_circ_data_t; - -struct circuitmux_policy_s { - /* Allocate cmux-wide policy-specific data */ - circuitmux_policy_data_t * (*alloc_cmux_data)(circuitmux_t *cmux); - /* Free cmux-wide policy-specific data */ - void (*free_cmux_data)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data); - /* Allocate circuit policy-specific data for a newly attached circuit */ - circuitmux_policy_circ_data_t * - (*alloc_circ_data)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - cell_direction_t direction, - unsigned int cell_count); - /* Free circuit policy-specific data */ - void (*free_circ_data)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); - /* Notify that a circuit has become active/inactive */ - void (*notify_circ_active)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); - void (*notify_circ_inactive)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); - /* Notify of arriving/transmitted cells on a circuit */ - void (*notify_set_n_cells)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data, - unsigned int n_cells); - void (*notify_xmit_cells)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data, - unsigned int n_cells); - /* Choose a circuit */ - circuit_t * (*pick_active_circuit)(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data); -}; - -/* - * Circuitmux policy implementations can subclass this to store circuitmux- - * wide data; it just has the magic number in the base struct. - */ - -struct circuitmux_policy_data_s { - uint32_t magic; -}; - -/* - * Circuitmux policy implementations can subclass this to store circuit- - * specific data; it just has the magic number in the base struct. - */ - -struct circuitmux_policy_circ_data_s { - uint32_t magic; -}; - -/* - * Upcast #defines for the above types - */ - -/** - * Convert a circuitmux_policy_data_t subtype to a circuitmux_policy_data_t. - */ - -#define TO_CMUX_POL_DATA(x) (&((x)->base_)) - -/** - * Convert a circuitmux_policy_circ_data_t subtype to a - * circuitmux_policy_circ_data_t. - */ - -#define TO_CMUX_POL_CIRC_DATA(x) (&((x)->base_)) - -/* Consistency check */ -void circuitmux_assert_okay(circuitmux_t *cmux); - -/* Create/destroy */ -circuitmux_t * circuitmux_alloc(void); -void circuitmux_detach_all_circuits(circuitmux_t *cmux); -void circuitmux_free(circuitmux_t *cmux); - -/* Policy control */ -void circuitmux_clear_policy(circuitmux_t *cmux); -const circuitmux_policy_t * circuitmux_get_policy(circuitmux_t *cmux); -void circuitmux_set_policy(circuitmux_t *cmux, - const circuitmux_policy_t *pol); - -/* Status inquiries */ -cell_direction_t circuitmux_attached_circuit_direction( - circuitmux_t *cmux, - circuit_t *circ); -int circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ); -int circuitmux_is_circuit_active(circuitmux_t *cmux, circuit_t *circ); -unsigned int circuitmux_num_cells_for_circuit(circuitmux_t *cmux, - circuit_t *circ); -unsigned int circuitmux_num_cells(circuitmux_t *cmux); -unsigned int circuitmux_num_circuits(circuitmux_t *cmux); -unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux); - -/* Channel interface */ -circuit_t * circuitmux_get_first_active_circuit(circuitmux_t *cmux, - cell_queue_t **destroy_queue_out); -void circuitmux_notify_xmit_cells(circuitmux_t *cmux, circuit_t *circ, - unsigned int n_cells); -void circuitmux_notify_xmit_destroy(circuitmux_t *cmux); - -/* Circuit interface */ -MOCK_DECL(void, circuitmux_attach_circuit, (circuitmux_t *cmux, - circuit_t *circ, - cell_direction_t direction)); -MOCK_DECL(void, circuitmux_detach_circuit, - (circuitmux_t *cmux, circuit_t *circ)); -void circuitmux_clear_num_cells(circuitmux_t *cmux, circuit_t *circ); -void circuitmux_set_num_cells(circuitmux_t *cmux, circuit_t *circ, - unsigned int n_cells); - -void circuitmux_append_destroy_cell(channel_t *chan, - circuitmux_t *cmux, circid_t circ_id, - uint8_t reason); -void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, - channel_t *chan); - -#endif /* TOR_CIRCUITMUX_H */ - diff --git a/src/tor/circuitmux_ewma.c b/src/tor/circuitmux_ewma.c deleted file mode 100644 index 3f37d7b9a..000000000 --- a/src/tor/circuitmux_ewma.c +++ /dev/null @@ -1,684 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitmux_ewma.c - * \brief EWMA circuit selection as a circuitmux_t policy - **/ - -#define TOR_CIRCUITMUX_EWMA_C_ - -#include - -#include "or.h" -#include "circuitmux.h" -#include "circuitmux_ewma.h" -#include "networkstatus.h" - -/*** EWMA parameter #defines ***/ - -/** How long does a tick last (seconds)? */ -#define EWMA_TICK_LEN 10 - -/** The default per-tick scale factor, if it hasn't been overridden by a - * consensus or a configuration setting. zero means "disabled". */ -#define EWMA_DEFAULT_HALFLIFE 0.0 - -/*** Some useful constant #defines ***/ - -/*DOCDOC*/ -#define EPSILON 0.00001 -/*DOCDOC*/ -#define LOG_ONEHALF -0.69314718055994529 - -/*** EWMA structures ***/ - -typedef struct cell_ewma_s cell_ewma_t; -typedef struct ewma_policy_data_s ewma_policy_data_t; -typedef struct ewma_policy_circ_data_s ewma_policy_circ_data_t; - -/** - * The cell_ewma_t structure keeps track of how many cells a circuit has - * transferred recently. It keeps an EWMA (exponentially weighted moving - * average) of the number of cells flushed from the circuit queue onto a - * connection in channel_flush_from_first_active_circuit(). - */ - -struct cell_ewma_s { - /** The last 'tick' at which we recalibrated cell_count. - * - * A cell sent at exactly the start of this tick has weight 1.0. Cells sent - * since the start of this tick have weight greater than 1.0; ones sent - * earlier have less weight. */ - unsigned int last_adjusted_tick; - /** The EWMA of the cell count. */ - double cell_count; - /** True iff this is the cell count for a circuit's previous - * channel. */ - unsigned int is_for_p_chan : 1; - /** The position of the circuit within the OR connection's priority - * queue. */ - int heap_index; -}; - -struct ewma_policy_data_s { - circuitmux_policy_data_t base_; - - /** - * Priority queue of cell_ewma_t for circuits with queued cells waiting - * for room to free up on the channel that owns this circuitmux. Kept - * in heap order according to EWMA. This was formerly in channel_t, and - * in or_connection_t before that. - */ - smartlist_t *active_circuit_pqueue; - - /** - * The tick on which the cell_ewma_ts in active_circuit_pqueue last had - * their ewma values rescaled. This was formerly in channel_t, and in - * or_connection_t before that. - */ - unsigned int active_circuit_pqueue_last_recalibrated; -}; - -struct ewma_policy_circ_data_s { - circuitmux_policy_circ_data_t base_; - - /** - * The EWMA count for the number of cells flushed from this circuit - * onto this circuitmux. Used to determine which circuit to flush - * from next. This was formerly in circuit_t and or_circuit_t. - */ - cell_ewma_t cell_ewma; - - /** - * Pointer back to the circuit_t this is for; since we're separating - * out circuit selection policy like this, we can't attach cell_ewma_t - * to the circuit_t any more, so we can't use SUBTYPE_P directly to a - * circuit_t like before; instead get it here. - */ - circuit_t *circ; -}; - -#define EWMA_POL_DATA_MAGIC 0x2fd8b16aU -#define EWMA_POL_CIRC_DATA_MAGIC 0x761e7747U - -/*** Downcasts for the above types ***/ - -static ewma_policy_data_t * -TO_EWMA_POL_DATA(circuitmux_policy_data_t *); - -static ewma_policy_circ_data_t * -TO_EWMA_POL_CIRC_DATA(circuitmux_policy_circ_data_t *); - -/** - * Downcast a circuitmux_policy_data_t to an ewma_policy_data_t and assert - * if the cast is impossible. - */ - -static INLINE ewma_policy_data_t * -TO_EWMA_POL_DATA(circuitmux_policy_data_t *pol) -{ - if (!pol) return NULL; - else { - tor_assert(pol->magic == EWMA_POL_DATA_MAGIC); - return DOWNCAST(ewma_policy_data_t, pol); - } -} - -/** - * Downcast a circuitmux_policy_circ_data_t to an ewma_policy_circ_data_t - * and assert if the cast is impossible. - */ - -static INLINE ewma_policy_circ_data_t * -TO_EWMA_POL_CIRC_DATA(circuitmux_policy_circ_data_t *pol) -{ - if (!pol) return NULL; - else { - tor_assert(pol->magic == EWMA_POL_CIRC_DATA_MAGIC); - return DOWNCAST(ewma_policy_circ_data_t, pol); - } -} - -/*** Static declarations for circuitmux_ewma.c ***/ - -static void add_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma); -static int compare_cell_ewma_counts(const void *p1, const void *p2); -static unsigned cell_ewma_tick_from_timeval(const struct timeval *now, - double *remainder_out); -static circuit_t * cell_ewma_to_circuit(cell_ewma_t *ewma); -static INLINE double get_scale_factor(unsigned from_tick, unsigned to_tick); -static cell_ewma_t * pop_first_cell_ewma(ewma_policy_data_t *pol); -static void remove_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma); -static void scale_single_cell_ewma(cell_ewma_t *ewma, unsigned cur_tick); -static void scale_active_circuits(ewma_policy_data_t *pol, - unsigned cur_tick); - -/*** Circuitmux policy methods ***/ - -static circuitmux_policy_data_t * ewma_alloc_cmux_data(circuitmux_t *cmux); -static void ewma_free_cmux_data(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data); -static circuitmux_policy_circ_data_t * -ewma_alloc_circ_data(circuitmux_t *cmux, circuitmux_policy_data_t *pol_data, - circuit_t *circ, cell_direction_t direction, - unsigned int cell_count); -static void -ewma_free_circ_data(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); -static void -ewma_notify_circ_active(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); -static void -ewma_notify_circ_inactive(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data); -static void -ewma_notify_xmit_cells(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data, - unsigned int n_cells); -static circuit_t * -ewma_pick_active_circuit(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data); - -/*** EWMA global variables ***/ - -/** The per-tick scale factor to be used when computing cell-count EWMA - * values. (A cell sent N ticks before the start of the current tick - * has value ewma_scale_factor ** N.) - */ -static double ewma_scale_factor = 0.1; -/* DOCDOC ewma_enabled */ -static int ewma_enabled = 0; - -/*** EWMA circuitmux_policy_t method table ***/ - -circuitmux_policy_t ewma_policy = { - /*.alloc_cmux_data =*/ ewma_alloc_cmux_data, - /*.free_cmux_data =*/ ewma_free_cmux_data, - /*.alloc_circ_data =*/ ewma_alloc_circ_data, - /*.free_circ_data =*/ ewma_free_circ_data, - /*.notify_circ_active =*/ ewma_notify_circ_active, - /*.notify_circ_inactive =*/ ewma_notify_circ_inactive, - /*.notify_set_n_cells =*/ NULL, /* EWMA doesn't need this */ - /*.notify_xmit_cells =*/ ewma_notify_xmit_cells, - /*.pick_active_circuit =*/ ewma_pick_active_circuit -}; - -/*** EWMA method implementations using the below EWMA helper functions ***/ - -/** - * Allocate an ewma_policy_data_t and upcast it to a circuitmux_policy_data_t; - * this is called when setting the policy on a circuitmux_t to ewma_policy. - */ - -static circuitmux_policy_data_t * -ewma_alloc_cmux_data(circuitmux_t *cmux) -{ - ewma_policy_data_t *pol = NULL; - - tor_assert(cmux); - - pol = tor_malloc_zero(sizeof(*pol)); - pol->base_.magic = EWMA_POL_DATA_MAGIC; - pol->active_circuit_pqueue = smartlist_new(); - pol->active_circuit_pqueue_last_recalibrated = cell_ewma_get_tick(); - - return TO_CMUX_POL_DATA(pol); -} - -/** - * Free an ewma_policy_data_t allocated with ewma_alloc_cmux_data() - */ - -static void -ewma_free_cmux_data(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data) -{ - ewma_policy_data_t *pol = NULL; - - tor_assert(cmux); - if (!pol_data) return; - - pol = TO_EWMA_POL_DATA(pol_data); - - smartlist_free(pol->active_circuit_pqueue); - tor_free(pol); -} - -/** - * Allocate an ewma_policy_circ_data_t and upcast it to a - * circuitmux_policy_data_t; this is called when attaching a circuit to a - * circuitmux_t with ewma_policy. - */ - -static circuitmux_policy_circ_data_t * -ewma_alloc_circ_data(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - cell_direction_t direction, - unsigned int cell_count) -{ - ewma_policy_circ_data_t *cdata = NULL; - - tor_assert(cmux); - tor_assert(pol_data); - tor_assert(circ); - tor_assert(direction == CELL_DIRECTION_OUT || - direction == CELL_DIRECTION_IN); - /* Shut the compiler up */ - tor_assert(cell_count == cell_count); - - cdata = tor_malloc_zero(sizeof(*cdata)); - cdata->base_.magic = EWMA_POL_CIRC_DATA_MAGIC; - cdata->circ = circ; - - /* - * Initialize the cell_ewma_t structure (formerly in - * init_circuit_base()) - */ - cdata->cell_ewma.last_adjusted_tick = cell_ewma_get_tick(); - cdata->cell_ewma.cell_count = 0.0; - cdata->cell_ewma.heap_index = -1; - if (direction == CELL_DIRECTION_IN) { - cdata->cell_ewma.is_for_p_chan = 1; - } else { - cdata->cell_ewma.is_for_p_chan = 0; - } - - return TO_CMUX_POL_CIRC_DATA(cdata); -} - -/** - * Free an ewma_policy_circ_data_t allocated with ewma_alloc_circ_data() - */ - -static void -ewma_free_circ_data(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data) - -{ - ewma_policy_circ_data_t *cdata = NULL; - - tor_assert(cmux); - tor_assert(circ); - tor_assert(pol_data); - - if (!pol_circ_data) return; - - cdata = TO_EWMA_POL_CIRC_DATA(pol_circ_data); - - tor_free(cdata); -} - -/** - * Handle circuit activation; this inserts the circuit's cell_ewma into - * the active_circuits_pqueue. - */ - -static void -ewma_notify_circ_active(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data) -{ - ewma_policy_data_t *pol = NULL; - ewma_policy_circ_data_t *cdata = NULL; - - tor_assert(cmux); - tor_assert(pol_data); - tor_assert(circ); - tor_assert(pol_circ_data); - - pol = TO_EWMA_POL_DATA(pol_data); - cdata = TO_EWMA_POL_CIRC_DATA(pol_circ_data); - - add_cell_ewma(pol, &(cdata->cell_ewma)); -} - -/** - * Handle circuit deactivation; this removes the circuit's cell_ewma from - * the active_circuits_pqueue. - */ - -static void -ewma_notify_circ_inactive(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data) -{ - ewma_policy_data_t *pol = NULL; - ewma_policy_circ_data_t *cdata = NULL; - - tor_assert(cmux); - tor_assert(pol_data); - tor_assert(circ); - tor_assert(pol_circ_data); - - pol = TO_EWMA_POL_DATA(pol_data); - cdata = TO_EWMA_POL_CIRC_DATA(pol_circ_data); - - remove_cell_ewma(pol, &(cdata->cell_ewma)); -} - -/** - * Update cell_ewma for this circuit after we've sent some cells, and - * remove/reinsert it in the queue. This used to be done (brokenly, - * see bug 6816) in channel_flush_from_first_active_circuit(). - */ - -static void -ewma_notify_xmit_cells(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data, - circuit_t *circ, - circuitmux_policy_circ_data_t *pol_circ_data, - unsigned int n_cells) -{ - ewma_policy_data_t *pol = NULL; - ewma_policy_circ_data_t *cdata = NULL; - unsigned int tick; - double fractional_tick, ewma_increment; - /* The current (hi-res) time */ - struct timeval now_hires; - cell_ewma_t *cell_ewma, *tmp; - - tor_assert(cmux); - tor_assert(pol_data); - tor_assert(circ); - tor_assert(pol_circ_data); - tor_assert(n_cells > 0); - - pol = TO_EWMA_POL_DATA(pol_data); - cdata = TO_EWMA_POL_CIRC_DATA(pol_circ_data); - - /* Rescale the EWMAs if needed */ - tor_gettimeofday_cached(&now_hires); - tick = cell_ewma_tick_from_timeval(&now_hires, &fractional_tick); - - if (tick != pol->active_circuit_pqueue_last_recalibrated) { - scale_active_circuits(pol, tick); - } - - /* How much do we adjust the cell count in cell_ewma by? */ - ewma_increment = - ((double)(n_cells)) * pow(ewma_scale_factor, -fractional_tick); - - /* Do the adjustment */ - cell_ewma = &(cdata->cell_ewma); - cell_ewma->cell_count += ewma_increment; - - /* - * Since we just sent on this circuit, it should be at the head of - * the queue. Pop the head, assert that it matches, then re-add. - */ - tmp = pop_first_cell_ewma(pol); - tor_assert(tmp == cell_ewma); - add_cell_ewma(pol, cell_ewma); -} - -/** - * Pick the preferred circuit to send from; this will be the one with - * the lowest EWMA value in the priority queue. This used to be done - * in channel_flush_from_first_active_circuit(). - */ - -static circuit_t * -ewma_pick_active_circuit(circuitmux_t *cmux, - circuitmux_policy_data_t *pol_data) -{ - ewma_policy_data_t *pol = NULL; - circuit_t *circ = NULL; - cell_ewma_t *cell_ewma = NULL; - - tor_assert(cmux); - tor_assert(pol_data); - - pol = TO_EWMA_POL_DATA(pol_data); - - if (smartlist_len(pol->active_circuit_pqueue) > 0) { - /* Get the head of the queue */ - cell_ewma = smartlist_get(pol->active_circuit_pqueue, 0); - circ = cell_ewma_to_circuit(cell_ewma); - } - - return circ; -} - -/** Helper for sorting cell_ewma_t values in their priority queue. */ -static int -compare_cell_ewma_counts(const void *p1, const void *p2) -{ - const cell_ewma_t *e1 = p1, *e2 = p2; - - if (e1->cell_count < e2->cell_count) - return -1; - else if (e1->cell_count > e2->cell_count) - return 1; - else - return 0; -} - -/** Given a cell_ewma_t, return a pointer to the circuit containing it. */ -static circuit_t * -cell_ewma_to_circuit(cell_ewma_t *ewma) -{ - ewma_policy_circ_data_t *cdata = NULL; - - tor_assert(ewma); - cdata = SUBTYPE_P(ewma, ewma_policy_circ_data_t, cell_ewma); - tor_assert(cdata); - - return cdata->circ; -} - -/* ==== Functions for scaling cell_ewma_t ==== - - When choosing which cells to relay first, we favor circuits that have been - quiet recently. This gives better latency on connections that aren't - pushing lots of data, and makes the network feel more interactive. - - Conceptually, we take an exponentially weighted mean average of the number - of cells a circuit has sent, and allow active circuits (those with cells to - relay) to send cells in reverse order of their exponentially-weighted mean - average (EWMA) cell count. [That is, a cell sent N seconds ago 'counts' - F^N times as much as a cell sent now, for 0now, compute the cell_ewma tick in which it occurs - * and the fraction of the tick that has elapsed between the start of the tick - * and now. Return the former and store the latter in - * *remainder_out. - * - * These tick values are not meant to be shared between Tor instances, or used - * for other purposes. */ - -static unsigned -cell_ewma_tick_from_timeval(const struct timeval *now, - double *remainder_out) -{ - unsigned res = (unsigned) (now->tv_sec / EWMA_TICK_LEN); - /* rem */ - double rem = (now->tv_sec % EWMA_TICK_LEN) + - ((double)(now->tv_usec)) / 1.0e6; - *remainder_out = rem / EWMA_TICK_LEN; - return res; -} - -/** Tell the caller whether ewma_enabled is set */ -int -cell_ewma_enabled(void) -{ - return ewma_enabled; -} - -/** Compute and return the current cell_ewma tick. */ -unsigned int -cell_ewma_get_tick(void) -{ - return ((unsigned)approx_time() / EWMA_TICK_LEN); -} - -/** Adjust the global cell scale factor based on options */ -void -cell_ewma_set_scale_factor(const or_options_t *options, - const networkstatus_t *consensus) -{ - int32_t halflife_ms; - double halflife; - const char *source; - if (options && options->CircuitPriorityHalflife >= -EPSILON) { - halflife = options->CircuitPriorityHalflife; - source = "CircuitPriorityHalflife in configuration"; - } else if (consensus && (halflife_ms = networkstatus_get_param( - consensus, "CircuitPriorityHalflifeMsec", - -1, -1, INT32_MAX)) >= 0) { - halflife = ((double)halflife_ms)/1000.0; - source = "CircuitPriorityHalflifeMsec in consensus"; - } else { - halflife = EWMA_DEFAULT_HALFLIFE; - source = "Default value"; - } - - if (halflife <= EPSILON) { - /* The cell EWMA algorithm is disabled. */ - ewma_scale_factor = 0.1; - ewma_enabled = 0; - log_info(LD_OR, - "Disabled cell_ewma algorithm because of value in %s", - source); - } else { - /* convert halflife into halflife-per-tick. */ - halflife /= EWMA_TICK_LEN; - /* compute per-tick scale factor. */ - ewma_scale_factor = exp( LOG_ONEHALF / halflife ); - ewma_enabled = 1; - log_info(LD_OR, - "Enabled cell_ewma algorithm because of value in %s; " - "scale factor is %f per %d seconds", - source, ewma_scale_factor, EWMA_TICK_LEN); - } -} - -/** Return the multiplier necessary to convert the value of a cell sent in - * 'from_tick' to one sent in 'to_tick'. */ -static INLINE double -get_scale_factor(unsigned from_tick, unsigned to_tick) -{ - /* This math can wrap around, but that's okay: unsigned overflow is - well-defined */ - int diff = (int)(to_tick - from_tick); - return pow(ewma_scale_factor, diff); -} - -/** Adjust the cell count of ewma so that it is scaled with respect to - * cur_tick */ -static void -scale_single_cell_ewma(cell_ewma_t *ewma, unsigned cur_tick) -{ - double factor = get_scale_factor(ewma->last_adjusted_tick, cur_tick); - ewma->cell_count *= factor; - ewma->last_adjusted_tick = cur_tick; -} - -/** Adjust the cell count of every active circuit on chan so - * that they are scaled with respect to cur_tick */ -static void -scale_active_circuits(ewma_policy_data_t *pol, unsigned cur_tick) -{ - double factor; - - tor_assert(pol); - tor_assert(pol->active_circuit_pqueue); - - factor = - get_scale_factor( - pol->active_circuit_pqueue_last_recalibrated, - cur_tick); - /** Ordinarily it isn't okay to change the value of an element in a heap, - * but it's okay here, since we are preserving the order. */ - SMARTLIST_FOREACH_BEGIN( - pol->active_circuit_pqueue, - cell_ewma_t *, e) { - tor_assert(e->last_adjusted_tick == - pol->active_circuit_pqueue_last_recalibrated); - e->cell_count *= factor; - e->last_adjusted_tick = cur_tick; - } SMARTLIST_FOREACH_END(e); - pol->active_circuit_pqueue_last_recalibrated = cur_tick; -} - -/** Rescale ewma to the same scale as pol, and add it to - * pol's priority queue of active circuits */ -static void -add_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma) -{ - tor_assert(pol); - tor_assert(pol->active_circuit_pqueue); - tor_assert(ewma); - tor_assert(ewma->heap_index == -1); - - scale_single_cell_ewma( - ewma, - pol->active_circuit_pqueue_last_recalibrated); - - smartlist_pqueue_add(pol->active_circuit_pqueue, - compare_cell_ewma_counts, - STRUCT_OFFSET(cell_ewma_t, heap_index), - ewma); -} - -/** Remove ewma from pol's priority queue of active circuits */ -static void -remove_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma) -{ - tor_assert(pol); - tor_assert(pol->active_circuit_pqueue); - tor_assert(ewma); - tor_assert(ewma->heap_index != -1); - - smartlist_pqueue_remove(pol->active_circuit_pqueue, - compare_cell_ewma_counts, - STRUCT_OFFSET(cell_ewma_t, heap_index), - ewma); -} - -/** Remove and return the first cell_ewma_t from pol's priority queue of - * active circuits. Requires that the priority queue is nonempty. */ -static cell_ewma_t * -pop_first_cell_ewma(ewma_policy_data_t *pol) -{ - tor_assert(pol); - tor_assert(pol->active_circuit_pqueue); - - return smartlist_pqueue_pop(pol->active_circuit_pqueue, - compare_cell_ewma_counts, - STRUCT_OFFSET(cell_ewma_t, heap_index)); -} - diff --git a/src/tor/circuitmux_ewma.h b/src/tor/circuitmux_ewma.h deleted file mode 100644 index a512745c7..000000000 --- a/src/tor/circuitmux_ewma.h +++ /dev/null @@ -1,29 +0,0 @@ -/* * Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitmux_ewma.h - * \brief Header file for circuitmux_ewma.c - **/ - -#ifndef TOR_CIRCUITMUX_EWMA_H -#define TOR_CIRCUITMUX_EWMA_H - -#include "or.h" -#include "circuitmux.h" - -/* Everything but circuitmux_ewma.c should see this extern */ -#ifndef TOR_CIRCUITMUX_EWMA_C_ - -extern circuitmux_policy_t ewma_policy; - -#endif /* !(TOR_CIRCUITMUX_EWMA_C_) */ - -/* Externally visible EWMA functions */ -int cell_ewma_enabled(void); -unsigned int cell_ewma_get_tick(void); -void cell_ewma_set_scale_factor(const or_options_t *options, - const networkstatus_t *consensus); - -#endif /* TOR_CIRCUITMUX_EWMA_H */ - diff --git a/src/tor/circuitstats.c b/src/tor/circuitstats.c deleted file mode 100644 index eaefc9edd..000000000 --- a/src/tor/circuitstats.c +++ /dev/null @@ -1,1644 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define CIRCUITSTATS_PRIVATE - -#include "or.h" -#include "circuitbuild.h" -#include "circuitstats.h" -#include "config.h" -#include "confparse.h" -#include "control.h" -#include "networkstatus.h" -#include "statefile.h" - -#undef log -#include - -static void cbt_control_event_buildtimeout_set( - const circuit_build_times_t *cbt, - buildtimeout_set_event_t type); - -#define CBT_BIN_TO_MS(bin) ((bin)*CBT_BIN_WIDTH + (CBT_BIN_WIDTH/2)) - -/** Global list of circuit build times */ -// XXXX: Add this as a member for entry_guard_t instead of global? -// Then we could do per-guard statistics, as guards are likely to -// vary in their own latency. The downside of this is that guards -// can change frequently, so we'd be building a lot more circuits -// most likely. -static circuit_build_times_t circ_times; - -#ifdef TOR_UNIT_TESTS -/** If set, we're running the unit tests: we should avoid clobbering - * our state file or accessing get_options() or get_or_state() */ -static int unit_tests = 0; -#else -#define unit_tests 0 -#endif - -/** Return a pointer to the data structure describing our current circuit - * build time history and computations. */ -const circuit_build_times_t * -get_circuit_build_times(void) -{ - return &circ_times; -} - -/** As get_circuit_build_times, but return a mutable pointer. */ -circuit_build_times_t * -get_circuit_build_times_mutable(void) -{ - return &circ_times; -} - -/** Return the time to wait before actually closing an under-construction, in - * milliseconds. */ -double -get_circuit_build_close_time_ms(void) -{ - return circ_times.close_ms; -} - -/** Return the time to wait before giving up on an under-construction circuit, - * in milliseconds. */ -double -get_circuit_build_timeout_ms(void) -{ - return circ_times.timeout_ms; -} - -/** - * This function decides if CBT learning should be disabled. It returns - * true if one or more of the following four conditions are met: - * - * 1. If the cbtdisabled consensus parameter is set. - * 2. If the torrc option LearnCircuitBuildTimeout is false. - * 3. If we are a directory authority - * 4. If we fail to write circuit build time history to our state file. - */ -int -circuit_build_times_disabled(void) -{ - if (unit_tests) { - return 0; - } else { - int consensus_disabled = networkstatus_get_param(NULL, "cbtdisabled", - 0, 0, 1); - int config_disabled = !get_options()->LearnCircuitBuildTimeout; - int dirauth_disabled = get_options()->AuthoritativeDir; - int state_disabled = did_last_state_file_write_fail() ? 1 : 0; - - if (consensus_disabled || config_disabled || dirauth_disabled || - state_disabled) { - log_debug(LD_CIRC, - "CircuitBuildTime learning is disabled. " - "Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d", - consensus_disabled, config_disabled, dirauth_disabled, - state_disabled); - return 1; - } else { - log_debug(LD_CIRC, - "CircuitBuildTime learning is not disabled. " - "Consensus=%d, Config=%d, AuthDir=%d, StateFile=%d", - consensus_disabled, config_disabled, dirauth_disabled, - state_disabled); - return 0; - } - } -} - -/** - * Retrieve and bounds-check the cbtmaxtimeouts consensus paramter. - * - * Effect: When this many timeouts happen in the last 'cbtrecentcount' - * circuit attempts, the client should discard all of its history and - * begin learning a fresh timeout value. - */ -static int32_t -circuit_build_times_max_timeouts(void) -{ - int32_t cbt_maxtimeouts; - - cbt_maxtimeouts = networkstatus_get_param(NULL, "cbtmaxtimeouts", - CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT, - CBT_MIN_MAX_RECENT_TIMEOUT_COUNT, - CBT_MAX_MAX_RECENT_TIMEOUT_COUNT); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_max_timeouts() called, cbtmaxtimeouts is" - " %d", - cbt_maxtimeouts); - } - - return cbt_maxtimeouts; -} - -/** - * Retrieve and bounds-check the cbtnummodes consensus paramter. - * - * Effect: This value governs how many modes to use in the weighted - * average calculation of Pareto parameter Xm. A value of 3 introduces - * some bias (2-5% of CDF) under ideal conditions, but allows for better - * performance in the event that a client chooses guard nodes of radically - * different performance characteristics. - */ -static int32_t -circuit_build_times_default_num_xm_modes(void) -{ - int32_t num = networkstatus_get_param(NULL, "cbtnummodes", - CBT_DEFAULT_NUM_XM_MODES, - CBT_MIN_NUM_XM_MODES, - CBT_MAX_NUM_XM_MODES); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_default_num_xm_modes() called, cbtnummodes" - " is %d", - num); - } - - return num; -} - -/** - * Retrieve and bounds-check the cbtmincircs consensus paramter. - * - * Effect: This is the minimum number of circuits to build before - * computing a timeout. - */ -static int32_t -circuit_build_times_min_circs_to_observe(void) -{ - int32_t num = networkstatus_get_param(NULL, "cbtmincircs", - CBT_DEFAULT_MIN_CIRCUITS_TO_OBSERVE, - CBT_MIN_MIN_CIRCUITS_TO_OBSERVE, - CBT_MAX_MIN_CIRCUITS_TO_OBSERVE); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_min_circs_to_observe() called, cbtmincircs" - " is %d", - num); - } - - return num; -} - -/** Return true iff cbt has recorded enough build times that we - * want to start acting on the timeout it implies. */ -int -circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt) -{ - return cbt->total_build_times >= circuit_build_times_min_circs_to_observe(); -} - -/** - * Retrieve and bounds-check the cbtquantile consensus paramter. - * - * Effect: This is the position on the quantile curve to use to set the - * timeout value. It is a percent (10-99). - */ -double -circuit_build_times_quantile_cutoff(void) -{ - int32_t num = networkstatus_get_param(NULL, "cbtquantile", - CBT_DEFAULT_QUANTILE_CUTOFF, - CBT_MIN_QUANTILE_CUTOFF, - CBT_MAX_QUANTILE_CUTOFF); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_quantile_cutoff() called, cbtquantile" - " is %d", - num); - } - - return num/100.0; -} - -/** - * Retrieve and bounds-check the cbtclosequantile consensus paramter. - * - * Effect: This is the position on the quantile curve to use to set the - * timeout value to use to actually close circuits. It is a percent - * (0-99). - */ -static double -circuit_build_times_close_quantile(void) -{ - int32_t param; - /* Cast is safe - circuit_build_times_quantile_cutoff() is capped */ - int32_t min = (int)tor_lround(100*circuit_build_times_quantile_cutoff()); - param = networkstatus_get_param(NULL, "cbtclosequantile", - CBT_DEFAULT_CLOSE_QUANTILE, - CBT_MIN_CLOSE_QUANTILE, - CBT_MAX_CLOSE_QUANTILE); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_close_quantile() called, cbtclosequantile" - " is %d", param); - } - - if (param < min) { - log_warn(LD_DIR, "Consensus parameter cbtclosequantile is " - "too small, raising to %d", min); - param = min; - } - return param / 100.0; -} - -/** - * Retrieve and bounds-check the cbttestfreq consensus paramter. - * - * Effect: Describes how often in seconds to build a test circuit to - * gather timeout values. Only applies if less than 'cbtmincircs' - * have been recorded. - */ -static int32_t -circuit_build_times_test_frequency(void) -{ - int32_t num = networkstatus_get_param(NULL, "cbttestfreq", - CBT_DEFAULT_TEST_FREQUENCY, - CBT_MIN_TEST_FREQUENCY, - CBT_MAX_TEST_FREQUENCY); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_test_frequency() called, cbttestfreq is %d", - num); - } - - return num; -} - -/** - * Retrieve and bounds-check the cbtmintimeout consensus parameter. - * - * Effect: This is the minimum allowed timeout value in milliseconds. - * The minimum is to prevent rounding to 0 (we only check once - * per second). - */ -static int32_t -circuit_build_times_min_timeout(void) -{ - int32_t num = networkstatus_get_param(NULL, "cbtmintimeout", - CBT_DEFAULT_TIMEOUT_MIN_VALUE, - CBT_MIN_TIMEOUT_MIN_VALUE, - CBT_MAX_TIMEOUT_MIN_VALUE); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_min_timeout() called, cbtmintimeout is %d", - num); - } - - return num; -} - -/** - * Retrieve and bounds-check the cbtinitialtimeout consensus paramter. - * - * Effect: This is the timeout value to use before computing a timeout, - * in milliseconds. - */ -int32_t -circuit_build_times_initial_timeout(void) -{ - int32_t min = circuit_build_times_min_timeout(); - int32_t param = networkstatus_get_param(NULL, "cbtinitialtimeout", - CBT_DEFAULT_TIMEOUT_INITIAL_VALUE, - CBT_MIN_TIMEOUT_INITIAL_VALUE, - CBT_MAX_TIMEOUT_INITIAL_VALUE); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_initial_timeout() called, " - "cbtinitialtimeout is %d", - param); - } - - if (param < min) { - log_warn(LD_DIR, "Consensus parameter cbtinitialtimeout is too small, " - "raising to %d", min); - param = min; - } - return param; -} - -/** - * Retrieve and bounds-check the cbtrecentcount consensus paramter. - * - * Effect: This is the number of circuit build times to keep track of - * for deciding if we hit cbtmaxtimeouts and need to reset our state - * and learn a new timeout. - */ -static int32_t -circuit_build_times_recent_circuit_count(networkstatus_t *ns) -{ - int32_t num; - num = networkstatus_get_param(ns, "cbtrecentcount", - CBT_DEFAULT_RECENT_CIRCUITS, - CBT_MIN_RECENT_CIRCUITS, - CBT_MAX_RECENT_CIRCUITS); - - if (!(get_options()->LearnCircuitBuildTimeout)) { - log_debug(LD_BUG, - "circuit_build_times_recent_circuit_count() called, " - "cbtrecentcount is %d", - num); - } - - return num; -} - -/** - * This function is called when we get a consensus update. - * - * It checks to see if we have changed any consensus parameters - * that require reallocation or discard of previous stats. - */ -void -circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, - networkstatus_t *ns) -{ - int32_t num; - - /* - * First check if we're doing adaptive timeouts at all; nothing to - * update if we aren't. - */ - - if (!circuit_build_times_disabled()) { - num = circuit_build_times_recent_circuit_count(ns); - - if (num > 0) { - if (num != cbt->liveness.num_recent_circs) { - int8_t *recent_circs; - log_notice(LD_CIRC, "The Tor Directory Consensus has changed how many " - "circuits we must track to detect network failures from %d " - "to %d.", cbt->liveness.num_recent_circs, num); - - tor_assert(cbt->liveness.timeouts_after_firsthop || - cbt->liveness.num_recent_circs == 0); - - /* - * Technically this is a circular array that we are reallocating - * and memcopying. However, since it only consists of either 1s - * or 0s, and is only used in a statistical test to determine when - * we should discard our history after a sufficient number of 1's - * have been reached, it is fine if order is not preserved or - * elements are lost. - * - * cbtrecentcount should only be changing in cases of severe network - * distress anyway, so memory correctness here is paramount over - * doing acrobatics to preserve the array. - */ - recent_circs = tor_malloc_zero(sizeof(int8_t)*num); - if (cbt->liveness.timeouts_after_firsthop && - cbt->liveness.num_recent_circs > 0) { - memcpy(recent_circs, cbt->liveness.timeouts_after_firsthop, - sizeof(int8_t)*MIN(num, cbt->liveness.num_recent_circs)); - } - - // Adjust the index if it needs it. - if (num < cbt->liveness.num_recent_circs) { - cbt->liveness.after_firsthop_idx = MIN(num-1, - cbt->liveness.after_firsthop_idx); - } - - tor_free(cbt->liveness.timeouts_after_firsthop); - cbt->liveness.timeouts_after_firsthop = recent_circs; - cbt->liveness.num_recent_circs = num; - } - /* else no change, nothing to do */ - } else { /* num == 0 */ - /* - * Weird. This probably shouldn't happen, so log a warning, but try - * to do something sensible anyway. - */ - - log_warn(LD_CIRC, - "The cbtrecentcircs consensus parameter came back zero! " - "This disables adaptive timeouts since we can't keep track of " - "any recent circuits."); - - circuit_build_times_free_timeouts(cbt); - } - } else { - /* - * Adaptive timeouts are disabled; this might be because of the - * LearnCircuitBuildTimes config parameter, and hence permanent, or - * the cbtdisabled consensus parameter, so it may be a new condition. - * Treat it like getting num == 0 above and free the circuit history - * if we have any. - */ - - circuit_build_times_free_timeouts(cbt); - } -} - -/** - * Return the initial default or configured timeout in milliseconds - */ -static double -circuit_build_times_get_initial_timeout(void) -{ - double timeout; - - /* - * Check if we have LearnCircuitBuildTimeout, and if we don't, - * always use CircuitBuildTimeout, no questions asked. - */ - if (!unit_tests && get_options()->CircuitBuildTimeout) { - timeout = get_options()->CircuitBuildTimeout*1000; - if (get_options()->LearnCircuitBuildTimeout && - timeout < circuit_build_times_min_timeout()) { - log_warn(LD_CIRC, "Config CircuitBuildTimeout too low. Setting to %ds", - circuit_build_times_min_timeout()/1000); - timeout = circuit_build_times_min_timeout(); - } - } else { - timeout = circuit_build_times_initial_timeout(); - } - - return timeout; -} - -/** - * Reset the build time state. - * - * Leave estimated parameters, timeout and network liveness intact - * for future use. - */ -STATIC void -circuit_build_times_reset(circuit_build_times_t *cbt) -{ - memset(cbt->circuit_build_times, 0, sizeof(cbt->circuit_build_times)); - cbt->total_build_times = 0; - cbt->build_times_idx = 0; - cbt->have_computed_timeout = 0; -} - -/** - * Initialize the buildtimes structure for first use. - * - * Sets the initial timeout values based on either the config setting, - * the consensus param, or the default (CBT_DEFAULT_TIMEOUT_INITIAL_VALUE). - */ -void -circuit_build_times_init(circuit_build_times_t *cbt) -{ - memset(cbt, 0, sizeof(*cbt)); - /* - * Check if we really are using adaptive timeouts, and don't keep - * track of this stuff if not. - */ - if (!circuit_build_times_disabled()) { - cbt->liveness.num_recent_circs = - circuit_build_times_recent_circuit_count(NULL); - cbt->liveness.timeouts_after_firsthop = - tor_malloc_zero(sizeof(int8_t)*cbt->liveness.num_recent_circs); - } else { - cbt->liveness.num_recent_circs = 0; - cbt->liveness.timeouts_after_firsthop = NULL; - } - cbt->close_ms = cbt->timeout_ms = circuit_build_times_get_initial_timeout(); - cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET); -} - -/** - * Free the saved timeouts, if the cbtdisabled consensus parameter got turned - * on or something. - */ - -void -circuit_build_times_free_timeouts(circuit_build_times_t *cbt) -{ - if (!cbt) return; - - if (cbt->liveness.timeouts_after_firsthop) { - tor_free(cbt->liveness.timeouts_after_firsthop); - } - - cbt->liveness.num_recent_circs = 0; -} - -#if 0 -/** - * Rewind our build time history by n positions. - */ -static void -circuit_build_times_rewind_history(circuit_build_times_t *cbt, int n) -{ - int i = 0; - - cbt->build_times_idx -= n; - cbt->build_times_idx %= CBT_NCIRCUITS_TO_OBSERVE; - - for (i = 0; i < n; i++) { - cbt->circuit_build_times[(i+cbt->build_times_idx) - %CBT_NCIRCUITS_TO_OBSERVE]=0; - } - - if (cbt->total_build_times > n) { - cbt->total_build_times -= n; - } else { - cbt->total_build_times = 0; - } - - log_info(LD_CIRC, - "Rewound history by %d places. Current index: %d. " - "Total: %d", n, cbt->build_times_idx, cbt->total_build_times); -} -#endif - -/** - * Add a new build time value time to the set of build times. Time - * units are milliseconds. - * - * circuit_build_times cbt is a circular array, so loop around when - * array is full. - */ -int -circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time) -{ - if (time <= 0 || time > CBT_BUILD_TIME_MAX) { - log_warn(LD_BUG, "Circuit build time is too large (%u)." - "This is probably a bug.", time); - tor_fragile_assert(); - return -1; - } - - log_debug(LD_CIRC, "Adding circuit build time %u", time); - - cbt->circuit_build_times[cbt->build_times_idx] = time; - cbt->build_times_idx = (cbt->build_times_idx + 1) % CBT_NCIRCUITS_TO_OBSERVE; - if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) - cbt->total_build_times++; - - if ((cbt->total_build_times % CBT_SAVE_STATE_EVERY) == 0) { - /* Save state every n circuit builds */ - if (!unit_tests && !get_options()->AvoidDiskWrites) - or_state_mark_dirty(get_or_state(), 0); - } - - return 0; -} - -/** - * Return maximum circuit build time - */ -static build_time_t -circuit_build_times_max(const circuit_build_times_t *cbt) -{ - int i = 0; - build_time_t max_build_time = 0; - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] > max_build_time - && cbt->circuit_build_times[i] != CBT_BUILD_ABANDONED) - max_build_time = cbt->circuit_build_times[i]; - } - return max_build_time; -} - -#if 0 -/** Return minimum circuit build time */ -build_time_t -circuit_build_times_min(circuit_build_times_t *cbt) -{ - int i = 0; - build_time_t min_build_time = CBT_BUILD_TIME_MAX; - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] && /* 0 <-> uninitialized */ - cbt->circuit_build_times[i] < min_build_time) - min_build_time = cbt->circuit_build_times[i]; - } - if (min_build_time == CBT_BUILD_TIME_MAX) { - log_warn(LD_CIRC, "No build times less than CBT_BUILD_TIME_MAX!"); - } - return min_build_time; -} -#endif - -/** - * Calculate and return a histogram for the set of build times. - * - * Returns an allocated array of histrogram bins representing - * the frequency of index*CBT_BIN_WIDTH millisecond - * build times. Also outputs the number of bins in nbins. - * - * The return value must be freed by the caller. - */ -static uint32_t * -circuit_build_times_create_histogram(const circuit_build_times_t *cbt, - build_time_t *nbins) -{ - uint32_t *histogram; - build_time_t max_build_time = circuit_build_times_max(cbt); - int i, c; - - *nbins = 1 + (max_build_time / CBT_BIN_WIDTH); - histogram = tor_malloc_zero(*nbins * sizeof(build_time_t)); - - // calculate histogram - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] == 0 - || cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) - continue; /* 0 <-> uninitialized */ - - c = (cbt->circuit_build_times[i] / CBT_BIN_WIDTH); - histogram[c]++; - } - - return histogram; -} - -/** - * Return the Pareto start-of-curve parameter Xm. - * - * Because we are not a true Pareto curve, we compute this as the - * weighted average of the N most frequent build time bins. N is either - * 1 if we don't have enough circuit build time data collected, or - * determined by the consensus parameter cbtnummodes (default 3). - */ -static build_time_t -circuit_build_times_get_xm(circuit_build_times_t *cbt) -{ - build_time_t i, nbins; - build_time_t *nth_max_bin; - int32_t bin_counts=0; - build_time_t ret = 0; - uint32_t *histogram = circuit_build_times_create_histogram(cbt, &nbins); - int n=0; - int num_modes = circuit_build_times_default_num_xm_modes(); - - tor_assert(nbins > 0); - tor_assert(num_modes > 0); - - // Only use one mode if < 1000 buildtimes. Not enough data - // for multiple. - if (cbt->total_build_times < CBT_NCIRCUITS_TO_OBSERVE) - num_modes = 1; - - nth_max_bin = (build_time_t*)tor_malloc_zero(num_modes*sizeof(build_time_t)); - - /* Determine the N most common build times */ - for (i = 0; i < nbins; i++) { - if (histogram[i] >= histogram[nth_max_bin[0]]) { - nth_max_bin[0] = i; - } - - for (n = 1; n < num_modes; n++) { - if (histogram[i] >= histogram[nth_max_bin[n]] && - (!histogram[nth_max_bin[n-1]] - || histogram[i] < histogram[nth_max_bin[n-1]])) { - nth_max_bin[n] = i; - } - } - } - - for (n = 0; n < num_modes; n++) { - bin_counts += histogram[nth_max_bin[n]]; - ret += CBT_BIN_TO_MS(nth_max_bin[n])*histogram[nth_max_bin[n]]; - log_info(LD_CIRC, "Xm mode #%d: %u %u", n, CBT_BIN_TO_MS(nth_max_bin[n]), - histogram[nth_max_bin[n]]); - } - - /* The following assert is safe, because we don't get called when we - * haven't observed at least CBT_MIN_MIN_CIRCUITS_TO_OBSERVE circuits. */ - tor_assert(bin_counts > 0); - - ret /= bin_counts; - tor_free(histogram); - tor_free(nth_max_bin); - - return ret; -} - -/** - * Output a histogram of current circuit build times to - * the or_state_t state structure. - */ -void -circuit_build_times_update_state(const circuit_build_times_t *cbt, - or_state_t *state) -{ - uint32_t *histogram; - build_time_t i = 0; - build_time_t nbins = 0; - config_line_t **next, *line; - - histogram = circuit_build_times_create_histogram(cbt, &nbins); - // write to state - config_free_lines(state->BuildtimeHistogram); - next = &state->BuildtimeHistogram; - *next = NULL; - - state->TotalBuildTimes = cbt->total_build_times; - state->CircuitBuildAbandonedCount = 0; - - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) - state->CircuitBuildAbandonedCount++; - } - - for (i = 0; i < nbins; i++) { - // compress the histogram by skipping the blanks - if (histogram[i] == 0) continue; - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("CircuitBuildTimeBin"); - tor_asprintf(&line->value, "%d %d", - CBT_BIN_TO_MS(i), histogram[i]); - next = &(line->next); - } - - if (!unit_tests) { - if (!get_options()->AvoidDiskWrites) - or_state_mark_dirty(get_or_state(), 0); - } - - tor_free(histogram); -} - -/** - * Shuffle the build times array. - * - * Adapted from http://en.wikipedia.org/wiki/Fisher-Yates_shuffle - */ -static void -circuit_build_times_shuffle_and_store_array(circuit_build_times_t *cbt, - build_time_t *raw_times, - uint32_t num_times) -{ - uint32_t n = num_times; - if (num_times > CBT_NCIRCUITS_TO_OBSERVE) { - log_notice(LD_CIRC, "The number of circuit times that this Tor version " - "uses to calculate build times is less than the number stored " - "in your state file. Decreasing the circuit time history from " - "%lu to %d.", (unsigned long)num_times, - CBT_NCIRCUITS_TO_OBSERVE); - } - - if (n > INT_MAX-1) { - log_warn(LD_CIRC, "For some insane reasons, you had %lu circuit build " - "observations in your state file. That's far too many; probably " - "there's a bug here.", (unsigned long)n); - n = INT_MAX-1; - } - - /* This code can only be run on a compact array */ - while (n-- > 1) { - int k = crypto_rand_int(n + 1); /* 0 <= k <= n. */ - build_time_t tmp = raw_times[k]; - raw_times[k] = raw_times[n]; - raw_times[n] = tmp; - } - - /* Since the times are now shuffled, take a random CBT_NCIRCUITS_TO_OBSERVE - * subset (ie the first CBT_NCIRCUITS_TO_OBSERVE values) */ - for (n = 0; n < MIN(num_times, CBT_NCIRCUITS_TO_OBSERVE); n++) { - circuit_build_times_add_time(cbt, raw_times[n]); - } -} - -/** - * Filter old synthetic timeouts that were created before the - * new right-censored Pareto calculation was deployed. - * - * Once all clients before 0.2.1.13-alpha are gone, this code - * will be unused. - */ -static int -circuit_build_times_filter_timeouts(circuit_build_times_t *cbt) -{ - int num_filtered=0, i=0; - double timeout_rate = 0; - build_time_t max_timeout = 0; - - timeout_rate = circuit_build_times_timeout_rate(cbt); - max_timeout = (build_time_t)cbt->close_ms; - - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] > max_timeout) { - build_time_t replaced = cbt->circuit_build_times[i]; - num_filtered++; - cbt->circuit_build_times[i] = CBT_BUILD_ABANDONED; - - log_debug(LD_CIRC, "Replaced timeout %d with %d", replaced, - cbt->circuit_build_times[i]); - } - } - - log_info(LD_CIRC, - "We had %d timeouts out of %d build times, " - "and filtered %d above the max of %u", - (int)(cbt->total_build_times*timeout_rate), - cbt->total_build_times, num_filtered, max_timeout); - - return num_filtered; -} - -/** - * Load histogram from state, shuffling the resulting array - * after we do so. Use this result to estimate parameters and - * calculate the timeout. - * - * Return -1 on error. - */ -int -circuit_build_times_parse_state(circuit_build_times_t *cbt, - or_state_t *state) -{ - int tot_values = 0; - uint32_t loaded_cnt = 0, N = 0; - config_line_t *line; - unsigned int i; - build_time_t *loaded_times; - int err = 0; - circuit_build_times_init(cbt); - - if (circuit_build_times_disabled()) { - return 0; - } - - /* build_time_t 0 means uninitialized */ - loaded_times = tor_malloc_zero(sizeof(build_time_t)*state->TotalBuildTimes); - - for (line = state->BuildtimeHistogram; line; line = line->next) { - smartlist_t *args = smartlist_new(); - smartlist_split_string(args, line->value, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args) < 2) { - log_warn(LD_GENERAL, "Unable to parse circuit build times: " - "Too few arguments to CircuitBuildTime"); - err = 1; - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - break; - } else { - const char *ms_str = smartlist_get(args,0); - const char *count_str = smartlist_get(args,1); - uint32_t count, k; - build_time_t ms; - int ok; - ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0, - CBT_BUILD_TIME_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_GENERAL, "Unable to parse circuit build times: " - "Unparsable bin number"); - err = 1; - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - break; - } - count = (uint32_t)tor_parse_ulong(count_str, 0, 0, - UINT32_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_GENERAL, "Unable to parse circuit build times: " - "Unparsable bin count"); - err = 1; - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - break; - } - - if (loaded_cnt+count+state->CircuitBuildAbandonedCount - > state->TotalBuildTimes) { - log_warn(LD_CIRC, - "Too many build times in state file. " - "Stopping short before %d", - loaded_cnt+count); - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - break; - } - - for (k = 0; k < count; k++) { - loaded_times[loaded_cnt++] = ms; - } - N++; - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - } - } - - log_info(LD_CIRC, - "Adding %d timeouts.", state->CircuitBuildAbandonedCount); - for (i=0; i < state->CircuitBuildAbandonedCount; i++) { - loaded_times[loaded_cnt++] = CBT_BUILD_ABANDONED; - } - - if (loaded_cnt != state->TotalBuildTimes) { - log_warn(LD_CIRC, - "Corrupt state file? Build times count mismatch. " - "Read %d times, but file says %d", loaded_cnt, - state->TotalBuildTimes); - err = 1; - circuit_build_times_reset(cbt); - goto done; - } - - circuit_build_times_shuffle_and_store_array(cbt, loaded_times, loaded_cnt); - - /* Verify that we didn't overwrite any indexes */ - for (i=0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (!cbt->circuit_build_times[i]) - break; - tot_values++; - } - log_info(LD_CIRC, - "Loaded %d/%d values from %d lines in circuit time histogram", - tot_values, cbt->total_build_times, N); - - if (cbt->total_build_times != tot_values - || cbt->total_build_times > CBT_NCIRCUITS_TO_OBSERVE) { - log_warn(LD_CIRC, - "Corrupt state file? Shuffled build times mismatch. " - "Read %d times, but file says %d", tot_values, - state->TotalBuildTimes); - err = 1; - circuit_build_times_reset(cbt); - goto done; - } - - circuit_build_times_set_timeout(cbt); - - if (!state->CircuitBuildAbandonedCount && cbt->total_build_times) { - circuit_build_times_filter_timeouts(cbt); - } - - done: - tor_free(loaded_times); - return err ? -1 : 0; -} - -/** - * Estimates the Xm and Alpha parameters using - * http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation - * - * The notable difference is that we use mode instead of min to estimate Xm. - * This is because our distribution is frechet-like. We claim this is - * an acceptable approximation because we are only concerned with the - * accuracy of the CDF of the tail. - */ -STATIC int -circuit_build_times_update_alpha(circuit_build_times_t *cbt) -{ - build_time_t *x=cbt->circuit_build_times; - double a = 0; - int n=0,i=0,abandoned_count=0; - build_time_t max_time=0; - - /* http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation */ - /* We sort of cheat here and make our samples slightly more pareto-like - * and less frechet-like. */ - cbt->Xm = circuit_build_times_get_xm(cbt); - - tor_assert(cbt->Xm > 0); - - for (i=0; i< CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (!x[i]) { - continue; - } - - if (x[i] < cbt->Xm) { - a += tor_mathlog(cbt->Xm); - } else if (x[i] == CBT_BUILD_ABANDONED) { - abandoned_count++; - } else { - a += tor_mathlog(x[i]); - if (x[i] > max_time) - max_time = x[i]; - } - n++; - } - - /* - * We are erring and asserting here because this can only happen - * in codepaths other than startup. The startup state parsing code - * performs this same check, and resets state if it hits it. If we - * hit it at runtime, something serious has gone wrong. - */ - if (n!=cbt->total_build_times) { - log_err(LD_CIRC, "Discrepancy in build times count: %d vs %d", n, - cbt->total_build_times); - } - tor_assert(n==cbt->total_build_times); - - if (max_time <= 0) { - /* This can happen if Xm is actually the *maximum* value in the set. - * It can also happen if we've abandoned every single circuit somehow. - * In either case, tell the caller not to compute a new build timeout. */ - log_warn(LD_BUG, - "Could not determine largest build time (%d). " - "Xm is %dms and we've abandoned %d out of %d circuits.", max_time, - cbt->Xm, abandoned_count, n); - return 0; - } - - a += abandoned_count*tor_mathlog(max_time); - - a -= n*tor_mathlog(cbt->Xm); - // Estimator comes from Eq #4 in: - // "Bayesian estimation based on trimmed samples from Pareto populations" - // by Arturo J. Fernández. We are right-censored only. - a = (n-abandoned_count)/a; - - cbt->alpha = a; - - return 1; -} - -/** - * This is the Pareto Quantile Function. It calculates the point x - * in the distribution such that F(x) = quantile (ie quantile*100% - * of the mass of the density function is below x on the curve). - * - * We use it to calculate the timeout and also to generate synthetic - * values of time for circuits that timeout before completion. - * - * See http://en.wikipedia.org/wiki/Quantile_function, - * http://en.wikipedia.org/wiki/Inverse_transform_sampling and - * http://en.wikipedia.org/wiki/Pareto_distribution#Generating_a_ - * random_sample_from_Pareto_distribution - * That's right. I'll cite wikipedia all day long. - * - * Return value is in milliseconds. - */ -STATIC double -circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, - double quantile) -{ - double ret; - tor_assert(quantile >= 0); - tor_assert(1.0-quantile > 0); - tor_assert(cbt->Xm > 0); - - ret = cbt->Xm/pow(1.0-quantile,1.0/cbt->alpha); - if (ret > INT32_MAX) { - ret = INT32_MAX; - } - tor_assert(ret > 0); - return ret; -} - -#ifdef TOR_UNIT_TESTS -/** Pareto CDF */ -double -circuit_build_times_cdf(circuit_build_times_t *cbt, double x) -{ - double ret; - tor_assert(cbt->Xm > 0); - ret = 1.0-pow(cbt->Xm/x,cbt->alpha); - tor_assert(0 <= ret && ret <= 1.0); - return ret; -} -#endif - -#ifdef TOR_UNIT_TESTS -/** - * Generate a synthetic time using our distribution parameters. - * - * The return value will be within the [q_lo, q_hi) quantile points - * on the CDF. - */ -build_time_t -circuit_build_times_generate_sample(circuit_build_times_t *cbt, - double q_lo, double q_hi) -{ - double randval = crypto_rand_double(); - build_time_t ret; - double u; - - /* Generate between [q_lo, q_hi) */ - /*XXXX This is what nextafter is supposed to be for; we should use it on the - * platforms that support it. */ - q_hi -= 1.0/(INT32_MAX); - - tor_assert(q_lo >= 0); - tor_assert(q_hi < 1); - tor_assert(q_lo < q_hi); - - u = q_lo + (q_hi-q_lo)*randval; - - tor_assert(0 <= u && u < 1.0); - /* circuit_build_times_calculate_timeout returns <= INT32_MAX */ - ret = (build_time_t) - tor_lround(circuit_build_times_calculate_timeout(cbt, u)); - tor_assert(ret > 0); - return ret; -} -#endif - -#ifdef TOR_UNIT_TESTS -/** - * Estimate an initial alpha parameter by solving the quantile - * function with a quantile point and a specific timeout value. - */ -void -circuit_build_times_initial_alpha(circuit_build_times_t *cbt, - double quantile, double timeout_ms) -{ - // Q(u) = Xm/((1-u)^(1/a)) - // Q(0.8) = Xm/((1-0.8))^(1/a)) = CircBuildTimeout - // CircBuildTimeout = Xm/((1-0.8))^(1/a)) - // CircBuildTimeout = Xm*((1-0.8))^(-1/a)) - // ln(CircBuildTimeout) = ln(Xm)+ln(((1-0.8)))*(-1/a) - // -ln(1-0.8)/(ln(CircBuildTimeout)-ln(Xm))=a - tor_assert(quantile >= 0); - tor_assert(cbt->Xm > 0); - cbt->alpha = tor_mathlog(1.0-quantile)/ - (tor_mathlog(cbt->Xm)-tor_mathlog(timeout_ms)); - tor_assert(cbt->alpha > 0); -} -#endif - -/** - * Returns true if we need circuits to be built - */ -int -circuit_build_times_needs_circuits(const circuit_build_times_t *cbt) -{ - /* Return true if < MIN_CIRCUITS_TO_OBSERVE */ - return !circuit_build_times_enough_to_compute(cbt); -} - -/** - * Returns true if we should build a timeout test circuit - * right now. - */ -int -circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt) -{ - return circuit_build_times_needs_circuits(cbt) && - approx_time()-cbt->last_circ_at > circuit_build_times_test_frequency(); -} - -/** - * Called to indicate that the network showed some signs of liveness, - * i.e. we received a cell. - * - * This is used by circuit_build_times_network_check_live() to decide - * if we should record the circuit build timeout or not. - * - * This function is called every time we receive a cell. Avoid - * syscalls, events, and other high-intensity work. - */ -void -circuit_build_times_network_is_live(circuit_build_times_t *cbt) -{ - time_t now = approx_time(); - if (cbt->liveness.nonlive_timeouts > 0) { - log_notice(LD_CIRC, - "Tor now sees network activity. Restoring circuit build " - "timeout recording. Network was down for %d seconds " - "during %d circuit attempts.", - (int)(now - cbt->liveness.network_last_live), - cbt->liveness.nonlive_timeouts); - } - cbt->liveness.network_last_live = now; - cbt->liveness.nonlive_timeouts = 0; -} - -/** - * Called to indicate that we completed a circuit. Because this circuit - * succeeded, it doesn't count as a timeout-after-the-first-hop. - * - * This is used by circuit_build_times_network_check_changed() to determine - * if we had too many recent timeouts and need to reset our learned timeout - * to something higher. - */ -void -circuit_build_times_network_circ_success(circuit_build_times_t *cbt) -{ - /* Check for NULLness because we might not be using adaptive timeouts */ - if (cbt->liveness.timeouts_after_firsthop && - cbt->liveness.num_recent_circs > 0) { - cbt->liveness.timeouts_after_firsthop[cbt->liveness.after_firsthop_idx] - = 0; - cbt->liveness.after_firsthop_idx++; - cbt->liveness.after_firsthop_idx %= cbt->liveness.num_recent_circs; - } -} - -/** - * A circuit just timed out. If it failed after the first hop, record it - * in our history for later deciding if the network speed has changed. - * - * This is used by circuit_build_times_network_check_changed() to determine - * if we had too many recent timeouts and need to reset our learned timeout - * to something higher. - */ -static void -circuit_build_times_network_timeout(circuit_build_times_t *cbt, - int did_onehop) -{ - /* Check for NULLness because we might not be using adaptive timeouts */ - if (cbt->liveness.timeouts_after_firsthop && - cbt->liveness.num_recent_circs > 0) { - if (did_onehop) { - cbt->liveness.timeouts_after_firsthop[cbt->liveness.after_firsthop_idx] - = 1; - cbt->liveness.after_firsthop_idx++; - cbt->liveness.after_firsthop_idx %= cbt->liveness.num_recent_circs; - } - } -} - -/** - * A circuit was just forcibly closed. If there has been no recent network - * activity at all, but this circuit was launched back when we thought the - * network was live, increment the number of "nonlive" circuit timeouts. - * - * This is used by circuit_build_times_network_check_live() to decide - * if we should record the circuit build timeout or not. - */ -static void -circuit_build_times_network_close(circuit_build_times_t *cbt, - int did_onehop, time_t start_time) -{ - time_t now = time(NULL); - /* - * Check if this is a timeout that was for a circuit that spent its - * entire existence during a time where we have had no network activity. - */ - if (cbt->liveness.network_last_live < start_time) { - if (did_onehop) { - char last_live_buf[ISO_TIME_LEN+1]; - char start_time_buf[ISO_TIME_LEN+1]; - char now_buf[ISO_TIME_LEN+1]; - format_local_iso_time(last_live_buf, cbt->liveness.network_last_live); - format_local_iso_time(start_time_buf, start_time); - format_local_iso_time(now_buf, now); - log_notice(LD_CIRC, - "A circuit somehow completed a hop while the network was " - "not live. The network was last live at %s, but the circuit " - "launched at %s. It's now %s. This could mean your clock " - "changed.", last_live_buf, start_time_buf, now_buf); - } - cbt->liveness.nonlive_timeouts++; - if (cbt->liveness.nonlive_timeouts == 1) { - log_notice(LD_CIRC, - "Tor has not observed any network activity for the past %d " - "seconds. Disabling circuit build timeout recording.", - (int)(now - cbt->liveness.network_last_live)); - } else { - log_info(LD_CIRC, - "Got non-live timeout. Current count is: %d", - cbt->liveness.nonlive_timeouts); - } - } -} - -/** - * When the network is not live, we do not record circuit build times. - * - * The network is considered not live if there has been at least one - * circuit build that began and ended (had its close_ms measurement - * period expire) since we last received a cell. - * - * Also has the side effect of rewinding the circuit time history - * in the case of recent liveness changes. - */ -int -circuit_build_times_network_check_live(const circuit_build_times_t *cbt) -{ - if (cbt->liveness.nonlive_timeouts > 0) { - return 0; - } - - return 1; -} - -/** - * Returns true if we have seen more than MAX_RECENT_TIMEOUT_COUNT of - * the past RECENT_CIRCUITS time out after the first hop. Used to detect - * if the network connection has changed significantly, and if so, - * resets our circuit build timeout to the default. - * - * Also resets the entire timeout history in this case and causes us - * to restart the process of building test circuits and estimating a - * new timeout. - */ -STATIC int -circuit_build_times_network_check_changed(circuit_build_times_t *cbt) -{ - int total_build_times = cbt->total_build_times; - int timeout_count=0; - int i; - - if (cbt->liveness.timeouts_after_firsthop && - cbt->liveness.num_recent_circs > 0) { - /* how many of our recent circuits made it to the first hop but then - * timed out? */ - for (i = 0; i < cbt->liveness.num_recent_circs; i++) { - timeout_count += cbt->liveness.timeouts_after_firsthop[i]; - } - } - - /* If 80% of our recent circuits are timing out after the first hop, - * we need to re-estimate a new initial alpha and timeout. */ - if (timeout_count < circuit_build_times_max_timeouts()) { - return 0; - } - - circuit_build_times_reset(cbt); - if (cbt->liveness.timeouts_after_firsthop && - cbt->liveness.num_recent_circs > 0) { - memset(cbt->liveness.timeouts_after_firsthop, 0, - sizeof(*cbt->liveness.timeouts_after_firsthop)* - cbt->liveness.num_recent_circs); - } - cbt->liveness.after_firsthop_idx = 0; - - /* Check to see if this has happened before. If so, double the timeout - * to give people on abysmally bad network connections a shot at access */ - if (cbt->timeout_ms >= circuit_build_times_get_initial_timeout()) { - if (cbt->timeout_ms > INT32_MAX/2 || cbt->close_ms > INT32_MAX/2) { - log_warn(LD_CIRC, "Insanely large circuit build timeout value. " - "(timeout = %fmsec, close = %fmsec)", - cbt->timeout_ms, cbt->close_ms); - } else { - cbt->timeout_ms *= 2; - cbt->close_ms *= 2; - } - } else { - cbt->close_ms = cbt->timeout_ms - = circuit_build_times_get_initial_timeout(); - } - - cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET); - - log_notice(LD_CIRC, - "Your network connection speed appears to have changed. Resetting " - "timeout to %lds after %d timeouts and %d buildtimes.", - tor_lround(cbt->timeout_ms/1000), timeout_count, - total_build_times); - - return 1; -} - -/** - * Count the number of timeouts in a set of cbt data. - */ -double -circuit_build_times_timeout_rate(const circuit_build_times_t *cbt) -{ - int i=0,timeouts=0; - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] >= cbt->timeout_ms) { - timeouts++; - } - } - - if (!cbt->total_build_times) - return 0; - - return ((double)timeouts)/cbt->total_build_times; -} - -/** - * Count the number of closed circuits in a set of cbt data. - */ -double -circuit_build_times_close_rate(const circuit_build_times_t *cbt) -{ - int i=0,closed=0; - for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) { - if (cbt->circuit_build_times[i] == CBT_BUILD_ABANDONED) { - closed++; - } - } - - if (!cbt->total_build_times) - return 0; - - return ((double)closed)/cbt->total_build_times; -} - -/** - * Store a timeout as a synthetic value. - * - * Returns true if the store was successful and we should possibly - * update our timeout estimate. - */ -int -circuit_build_times_count_close(circuit_build_times_t *cbt, - int did_onehop, - time_t start_time) -{ - if (circuit_build_times_disabled()) { - cbt->close_ms = cbt->timeout_ms - = circuit_build_times_get_initial_timeout(); - return 0; - } - - /* Record this force-close to help determine if the network is dead */ - circuit_build_times_network_close(cbt, did_onehop, start_time); - - /* Only count timeouts if network is live.. */ - if (!circuit_build_times_network_check_live(cbt)) { - return 0; - } - - circuit_build_times_add_time(cbt, CBT_BUILD_ABANDONED); - return 1; -} - -/** - * Update timeout counts to determine if we need to expire - * our build time history due to excessive timeouts. - * - * We do not record any actual time values at this stage; - * we are only interested in recording the fact that a timeout - * happened. We record the time values via - * circuit_build_times_count_close() and circuit_build_times_add_time(). - */ -void -circuit_build_times_count_timeout(circuit_build_times_t *cbt, - int did_onehop) -{ - if (circuit_build_times_disabled()) { - cbt->close_ms = cbt->timeout_ms - = circuit_build_times_get_initial_timeout(); - return; - } - - /* Register the fact that a timeout just occurred. */ - circuit_build_times_network_timeout(cbt, did_onehop); - - /* If there are a ton of timeouts, we should reset - * the circuit build timeout. */ - circuit_build_times_network_check_changed(cbt); -} - -/** - * Estimate a new timeout based on history and set our timeout - * variable accordingly. - */ -static int -circuit_build_times_set_timeout_worker(circuit_build_times_t *cbt) -{ - build_time_t max_time; - if (!circuit_build_times_enough_to_compute(cbt)) - return 0; - - if (!circuit_build_times_update_alpha(cbt)) - return 0; - - cbt->timeout_ms = circuit_build_times_calculate_timeout(cbt, - circuit_build_times_quantile_cutoff()); - - cbt->close_ms = circuit_build_times_calculate_timeout(cbt, - circuit_build_times_close_quantile()); - - max_time = circuit_build_times_max(cbt); - - if (cbt->timeout_ms > max_time) { - log_info(LD_CIRC, - "Circuit build timeout of %dms is beyond the maximum build " - "time we have ever observed. Capping it to %dms.", - (int)cbt->timeout_ms, max_time); - cbt->timeout_ms = max_time; - } - - if (max_time < INT32_MAX/2 && cbt->close_ms > 2*max_time) { - log_info(LD_CIRC, - "Circuit build measurement period of %dms is more than twice " - "the maximum build time we have ever observed. Capping it to " - "%dms.", (int)cbt->close_ms, 2*max_time); - cbt->close_ms = 2*max_time; - } - - /* Sometimes really fast guard nodes give us such a steep curve - * that this ends up being not that much greater than timeout_ms. - * Make it be at least 1 min to handle this case. */ - cbt->close_ms = MAX(cbt->close_ms, circuit_build_times_initial_timeout()); - - cbt->have_computed_timeout = 1; - return 1; -} - -/** - * Exposed function to compute a new timeout. Dispatches events and - * also filters out extremely high timeout values. - */ -void -circuit_build_times_set_timeout(circuit_build_times_t *cbt) -{ - long prev_timeout = tor_lround(cbt->timeout_ms/1000); - double timeout_rate; - - /* - * Just return if we aren't using adaptive timeouts - */ - if (circuit_build_times_disabled()) - return; - - if (!circuit_build_times_set_timeout_worker(cbt)) - return; - - if (cbt->timeout_ms < circuit_build_times_min_timeout()) { - log_info(LD_CIRC, "Set buildtimeout to low value %fms. Setting to %dms", - cbt->timeout_ms, circuit_build_times_min_timeout()); - cbt->timeout_ms = circuit_build_times_min_timeout(); - if (cbt->close_ms < cbt->timeout_ms) { - /* This shouldn't happen because of MAX() in timeout_worker above, - * but doing it just in case */ - cbt->close_ms = circuit_build_times_initial_timeout(); - } - } - - cbt_control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED); - - timeout_rate = circuit_build_times_timeout_rate(cbt); - - if (prev_timeout > tor_lround(cbt->timeout_ms/1000)) { - log_info(LD_CIRC, - "Based on %d circuit times, it looks like we don't need to " - "wait so long for circuits to finish. We will now assume a " - "circuit is too slow to use after waiting %ld seconds.", - cbt->total_build_times, - tor_lround(cbt->timeout_ms/1000)); - log_info(LD_CIRC, - "Circuit timeout data: %fms, %fms, Xm: %d, a: %f, r: %f", - cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, - timeout_rate); - } else if (prev_timeout < tor_lround(cbt->timeout_ms/1000)) { - log_info(LD_CIRC, - "Based on %d circuit times, it looks like we need to wait " - "longer for circuits to finish. We will now assume a " - "circuit is too slow to use after waiting %ld seconds.", - cbt->total_build_times, - tor_lround(cbt->timeout_ms/1000)); - log_info(LD_CIRC, - "Circuit timeout data: %fms, %fms, Xm: %d, a: %f, r: %f", - cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, - timeout_rate); - } else { - log_info(LD_CIRC, - "Set circuit build timeout to %lds (%fms, %fms, Xm: %d, a: %f," - " r: %f) based on %d circuit times", - tor_lround(cbt->timeout_ms/1000), - cbt->timeout_ms, cbt->close_ms, cbt->Xm, cbt->alpha, timeout_rate, - cbt->total_build_times); - } -} - -#ifdef TOR_UNIT_TESTS -/** Make a note that we're running unit tests (rather than running Tor - * itself), so we avoid clobbering our state file. */ -void -circuitbuild_running_unit_tests(void) -{ - unit_tests = 1; -} -#endif - -void -circuit_build_times_update_last_circ(circuit_build_times_t *cbt) -{ - cbt->last_circ_at = approx_time(); -} - -static void -cbt_control_event_buildtimeout_set(const circuit_build_times_t *cbt, - buildtimeout_set_event_t type) -{ - char *args = NULL; - double qnt; - - switch (type) { - case BUILDTIMEOUT_SET_EVENT_RESET: - case BUILDTIMEOUT_SET_EVENT_SUSPENDED: - case BUILDTIMEOUT_SET_EVENT_DISCARD: - qnt = 1.0; - break; - case BUILDTIMEOUT_SET_EVENT_COMPUTED: - case BUILDTIMEOUT_SET_EVENT_RESUME: - default: - qnt = circuit_build_times_quantile_cutoff(); - break; - } - - tor_asprintf(&args, "TOTAL_TIMES=%lu " - "TIMEOUT_MS=%lu XM=%lu ALPHA=%f CUTOFF_QUANTILE=%f " - "TIMEOUT_RATE=%f CLOSE_MS=%lu CLOSE_RATE=%f", - (unsigned long)cbt->total_build_times, - (unsigned long)cbt->timeout_ms, - (unsigned long)cbt->Xm, cbt->alpha, qnt, - circuit_build_times_timeout_rate(cbt), - (unsigned long)cbt->close_ms, - circuit_build_times_close_rate(cbt)); - - control_event_buildtimeout_set(type, args); - - tor_free(args); -} - diff --git a/src/tor/circuitstats.h b/src/tor/circuitstats.h deleted file mode 100644 index 3343310b8..000000000 --- a/src/tor/circuitstats.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuitstats.h - * \brief Header file for circuitstats.c - **/ - -#ifndef TOR_CIRCUITSTATS_H -#define TOR_CIRCUITSTATS_H - -const circuit_build_times_t *get_circuit_build_times(void); -circuit_build_times_t *get_circuit_build_times_mutable(void); -double get_circuit_build_close_time_ms(void); -double get_circuit_build_timeout_ms(void); - -int circuit_build_times_disabled(void); -int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt); -void circuit_build_times_update_state(const circuit_build_times_t *cbt, - or_state_t *state); -int circuit_build_times_parse_state(circuit_build_times_t *cbt, - or_state_t *state); -void circuit_build_times_count_timeout(circuit_build_times_t *cbt, - int did_onehop); -int circuit_build_times_count_close(circuit_build_times_t *cbt, - int did_onehop, time_t start_time); -void circuit_build_times_set_timeout(circuit_build_times_t *cbt); -int circuit_build_times_add_time(circuit_build_times_t *cbt, - build_time_t time); -int circuit_build_times_needs_circuits(const circuit_build_times_t *cbt); - -int circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt); -void circuit_build_times_init(circuit_build_times_t *cbt); -void circuit_build_times_free_timeouts(circuit_build_times_t *cbt); -void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt, - networkstatus_t *ns); -double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt); -double circuit_build_times_close_rate(const circuit_build_times_t *cbt); - -void circuit_build_times_update_last_circ(circuit_build_times_t *cbt); - -#ifdef CIRCUITSTATS_PRIVATE -STATIC double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt, - double quantile); -STATIC int circuit_build_times_update_alpha(circuit_build_times_t *cbt); -STATIC void circuit_build_times_reset(circuit_build_times_t *cbt); - -/* Network liveness functions */ -STATIC int circuit_build_times_network_check_changed( - circuit_build_times_t *cbt); -#endif - -#ifdef TOR_UNIT_TESTS -build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt, - double q_lo, double q_hi); -double circuit_build_times_cdf(circuit_build_times_t *cbt, double x); -void circuit_build_times_initial_alpha(circuit_build_times_t *cbt, - double quantile, double time_ms); -void circuitbuild_running_unit_tests(void); -#endif - -/* Network liveness functions */ -void circuit_build_times_network_is_live(circuit_build_times_t *cbt); -int circuit_build_times_network_check_live(const circuit_build_times_t *cbt); -void circuit_build_times_network_circ_success(circuit_build_times_t *cbt); - -#ifdef CIRCUITSTATS_PRIVATE -/** Structure for circuit build times history */ -struct circuit_build_times_s { - /** The circular array of recorded build times in milliseconds */ - build_time_t circuit_build_times[CBT_NCIRCUITS_TO_OBSERVE]; - /** Current index in the circuit_build_times circular array */ - int build_times_idx; - /** Total number of build times accumulated. Max CBT_NCIRCUITS_TO_OBSERVE */ - int total_build_times; - /** Information about the state of our local network connection */ - network_liveness_t liveness; - /** Last time we built a circuit. Used to decide to build new test circs */ - time_t last_circ_at; - /** "Minimum" value of our pareto distribution (actually mode) */ - build_time_t Xm; - /** alpha exponent for pareto dist. */ - double alpha; - /** Have we computed a timeout? */ - int have_computed_timeout; - /** The exact value for that timeout in milliseconds. Stored as a double - * to maintain precision from calculations to and from quantile value. */ - double timeout_ms; - /** How long we wait before actually closing the circuit. */ - double close_ms; -}; -#endif - -#endif - diff --git a/src/tor/circuituse.c b/src/tor/circuituse.c deleted file mode 100644 index 8b82de0f9..000000000 --- a/src/tor/circuituse.c +++ /dev/null @@ -1,2326 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuituse.c - * \brief Launch the right sort of circuits and attach streams to them. - **/ - -#include "or.h" -#include "addressmap.h" -#include "channel.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "circuituse.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "control.h" -#include "entrynodes.h" -#include "nodelist.h" -#include "networkstatus.h" -#include "policies.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" - -static void circuit_expire_old_circuits_clientside(void); -static void circuit_increment_failure_count(void); - -/** Return 1 if circ could be returned by circuit_get_best(). - * Else return 0. - */ -static int -circuit_is_acceptable(const origin_circuit_t *origin_circ, - const entry_connection_t *conn, - int must_be_open, uint8_t purpose, - int need_uptime, int need_internal, - time_t now) -{ - const circuit_t *circ = TO_CIRCUIT(origin_circ); - const node_t *exitnode; - cpath_build_state_t *build_state; - tor_assert(circ); - tor_assert(conn); - tor_assert(conn->socks_request); - - if (must_be_open && (circ->state != CIRCUIT_STATE_OPEN || !circ->n_chan)) - return 0; /* ignore non-open circs */ - if (circ->marked_for_close) - return 0; - - /* if this circ isn't our purpose, skip. */ - if (purpose == CIRCUIT_PURPOSE_C_REND_JOINED && !must_be_open) { - if (circ->purpose != CIRCUIT_PURPOSE_C_ESTABLISH_REND && - circ->purpose != CIRCUIT_PURPOSE_C_REND_READY && - circ->purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED && - circ->purpose != CIRCUIT_PURPOSE_C_REND_JOINED) - return 0; - } else if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && - !must_be_open) { - if (circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCING && - circ->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) - return 0; - } else { - if (purpose != circ->purpose) - return 0; - } - - /* If this is a timed-out hidden service circuit, skip it. */ - if (origin_circ->hs_circ_has_timed_out) { - return 0; - } - - if (purpose == CIRCUIT_PURPOSE_C_GENERAL || - purpose == CIRCUIT_PURPOSE_C_REND_JOINED) { - if (circ->timestamp_dirty && - circ->timestamp_dirty+get_options()->MaxCircuitDirtiness <= now) - return 0; - } - - if (origin_circ->unusable_for_new_conns) - return 0; - - /* decide if this circ is suitable for this conn */ - - /* for rend circs, circ->cpath->prev is not the last router in the - * circuit, it's the magical extra bob hop. so just check the nickname - * of the one we meant to finish at. - */ - build_state = origin_circ->build_state; - exitnode = build_state_get_exit_node(build_state); - - if (need_uptime && !build_state->need_uptime) - return 0; - if (need_internal != build_state->is_internal) - return 0; - - if (purpose == CIRCUIT_PURPOSE_C_GENERAL) { - tor_addr_t addr; - const int family = tor_addr_parse(&addr, conn->socks_request->address); - if (!exitnode && !build_state->onehop_tunnel) { - log_debug(LD_CIRC,"Not considering circuit with unknown router."); - return 0; /* this circuit is screwed and doesn't know it yet, - * or is a rendezvous circuit. */ - } - if (build_state->onehop_tunnel) { - if (!conn->want_onehop) { - log_debug(LD_CIRC,"Skipping one-hop circuit."); - return 0; - } - tor_assert(conn->chosen_exit_name); - if (build_state->chosen_exit) { - char digest[DIGEST_LEN]; - if (hexdigest_to_digest(conn->chosen_exit_name, digest) < 0) - return 0; /* broken digest, we don't want it */ - if (tor_memneq(digest, build_state->chosen_exit->identity_digest, - DIGEST_LEN)) - return 0; /* this is a circuit to somewhere else */ - if (tor_digest_is_zero(digest)) { - /* we don't know the digest; have to compare addr:port */ - if (family < 0 || - !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || - build_state->chosen_exit->port != conn->socks_request->port) - return 0; - } - } - } else { - if (conn->want_onehop) { - /* don't use three-hop circuits -- that could hurt our anonymity. */ - return 0; - } - } - if (origin_circ->prepend_policy && family != -1) { - int r = compare_tor_addr_to_addr_policy(&addr, - conn->socks_request->port, - origin_circ->prepend_policy); - if (r == ADDR_POLICY_REJECTED) - return 0; - } - if (exitnode && !connection_ap_can_use_exit(conn, exitnode)) { - /* can't exit from this router */ - return 0; - } - } else { /* not general */ - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - if ((edge_conn->rend_data && !origin_circ->rend_data) || - (!edge_conn->rend_data && origin_circ->rend_data) || - (edge_conn->rend_data && origin_circ->rend_data && - rend_cmp_service_ids(edge_conn->rend_data->onion_address, - origin_circ->rend_data->onion_address))) { - /* this circ is not for this conn */ - return 0; - } - } - - if (!connection_edge_compatible_with_circuit(conn, origin_circ)) { - /* conn needs to be isolated from other conns that have already used - * origin_circ */ - return 0; - } - - return 1; -} - -/** Return 1 if circuit a is better than circuit b for - * conn, and return 0 otherwise. Used by circuit_get_best. - */ -static int -circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob, - const entry_connection_t *conn) -{ - const circuit_t *a = TO_CIRCUIT(oa); - const circuit_t *b = TO_CIRCUIT(ob); - const uint8_t purpose = ENTRY_TO_CONN(conn)->purpose; - int a_bits, b_bits; - - /* If one of the circuits was allowed to live due to relaxing its timeout, - * it is definitely worse (it's probably a much slower path). */ - if (oa->relaxed_timeout && !ob->relaxed_timeout) - return 0; /* ob is better. It's not relaxed. */ - if (!oa->relaxed_timeout && ob->relaxed_timeout) - return 1; /* oa is better. It's not relaxed. */ - - switch (purpose) { - case CIRCUIT_PURPOSE_C_GENERAL: - /* if it's used but less dirty it's best; - * else if it's more recently created it's best - */ - if (b->timestamp_dirty) { - if (a->timestamp_dirty && - a->timestamp_dirty > b->timestamp_dirty) - return 1; - } else { - if (a->timestamp_dirty || - timercmp(&a->timestamp_began, &b->timestamp_began, >)) - return 1; - if (ob->build_state->is_internal) - /* XXX023 what the heck is this internal thing doing here. I - * think we can get rid of it. circuit_is_acceptable() already - * makes sure that is_internal is exactly what we need it to - * be. -RD */ - return 1; - } - break; - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - /* the closer it is to ack_wait the better it is */ - if (a->purpose > b->purpose) - return 1; - break; - case CIRCUIT_PURPOSE_C_REND_JOINED: - /* the closer it is to rend_joined the better it is */ - if (a->purpose > b->purpose) - return 1; - break; - } - - /* XXXX023 Maybe this check should get a higher priority to avoid - * using up circuits too rapidly. */ - - a_bits = connection_edge_update_circuit_isolation(conn, - (origin_circuit_t*)oa, 1); - b_bits = connection_edge_update_circuit_isolation(conn, - (origin_circuit_t*)ob, 1); - /* if x_bits < 0, then we have not used x for anything; better not to dirty - * a connection if we can help it. */ - if (a_bits < 0) { - return 0; - } else if (b_bits < 0) { - return 1; - } - a_bits &= ~ oa->isolation_flags_mixed; - a_bits &= ~ ob->isolation_flags_mixed; - if (n_bits_set_u8(a_bits) < n_bits_set_u8(b_bits)) { - /* The fewer new restrictions we need to make on a circuit for stream - * isolation, the better. */ - return 1; - } - - return 0; -} - -/** Find the best circ that conn can use, preferably one which is - * dirty. Circ must not be too old. - * - * Conn must be defined. - * - * If must_be_open, ignore circs not in CIRCUIT_STATE_OPEN. - * - * circ_purpose specifies what sort of circuit we must have. - * It can be C_GENERAL, C_INTRODUCE_ACK_WAIT, or C_REND_JOINED. - * - * If it's REND_JOINED and must_be_open==0, then return the closest - * rendezvous-purposed circuit that you can find. - * - * If it's INTRODUCE_ACK_WAIT and must_be_open==0, then return the - * closest introduce-purposed circuit that you can find. - */ -static origin_circuit_t * -circuit_get_best(const entry_connection_t *conn, - int must_be_open, uint8_t purpose, - int need_uptime, int need_internal) -{ - circuit_t *circ; - origin_circuit_t *best=NULL; - struct timeval now; - int intro_going_on_but_too_old = 0; - - tor_assert(conn); - - tor_assert(purpose == CIRCUIT_PURPOSE_C_GENERAL || - purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT || - purpose == CIRCUIT_PURPOSE_C_REND_JOINED); - - tor_gettimeofday(&now); - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - origin_circuit_t *origin_circ; - if (!CIRCUIT_IS_ORIGIN(circ)) - continue; - origin_circ = TO_ORIGIN_CIRCUIT(circ); - - /* Log an info message if we're going to launch a new intro circ in - * parallel */ - if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT && - !must_be_open && origin_circ->hs_circ_has_timed_out) { - intro_going_on_but_too_old = 1; - continue; - } - - if (!circuit_is_acceptable(origin_circ,conn,must_be_open,purpose, - need_uptime,need_internal,now.tv_sec)) - continue; - - /* now this is an acceptable circ to hand back. but that doesn't - * mean it's the *best* circ to hand back. try to decide. - */ - if (!best || circuit_is_better(origin_circ,best,conn)) - best = origin_circ; - } - - if (!best && intro_going_on_but_too_old) - log_info(LD_REND|LD_CIRC, "There is an intro circuit being created " - "right now, but it has already taken quite a while. Starting " - "one in parallel."); - - return best; -} - -/** Return the number of not-yet-open general-purpose origin circuits. */ -static int -count_pending_general_client_circuits(void) -{ - const circuit_t *circ; - - int count = 0; - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (circ->marked_for_close || - circ->state == CIRCUIT_STATE_OPEN || - circ->purpose != CIRCUIT_PURPOSE_C_GENERAL || - !CIRCUIT_IS_ORIGIN(circ)) - continue; - - ++count; - } - - return count; -} - -#if 0 -/** Check whether, according to the policies in options, the - * circuit circ makes sense. */ -/* XXXX currently only checks Exclude{Exit}Nodes; it should check more. - * Also, it doesn't have the right definition of an exit circuit. Also, - * it's never called. */ -int -circuit_conforms_to_options(const origin_circuit_t *circ, - const or_options_t *options) -{ - const crypt_path_t *cpath, *cpath_next = NULL; - - /* first check if it includes any excluded nodes */ - for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { - cpath_next = cpath->next; - if (routerset_contains_extendinfo(options->ExcludeNodes, - cpath->extend_info)) - return 0; - } - - /* then consider the final hop */ - if (routerset_contains_extendinfo(options->ExcludeExitNodes, - circ->cpath->prev->extend_info)) - return 0; - - return 1; -} -#endif - -/** Close all circuits that start at us, aren't open, and were born - * at least CircuitBuildTimeout seconds ago. - */ -void -circuit_expire_building(void) -{ - circuit_t *victim, *next_circ; - /* circ_times.timeout_ms and circ_times.close_ms are from - * circuit_build_times_get_initial_timeout() if we haven't computed - * custom timeouts yet */ - struct timeval general_cutoff, begindir_cutoff, fourhop_cutoff, - close_cutoff, extremely_old_cutoff, hs_extremely_old_cutoff, - cannibalized_cutoff, c_intro_cutoff, s_intro_cutoff, stream_cutoff; - const or_options_t *options = get_options(); - struct timeval now; - cpath_build_state_t *build_state; - int any_opened_circs = 0; - - tor_gettimeofday(&now); - - /* Check to see if we have any opened circuits. If we don't, - * we want to be more lenient with timeouts, in case the - * user has relocated and/or changed network connections. - * See bug #3443. */ - TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) { - if (!CIRCUIT_IS_ORIGIN(next_circ) || /* didn't originate here */ - next_circ->marked_for_close) { /* don't mess with marked circs */ - continue; - } - - if (TO_ORIGIN_CIRCUIT(next_circ)->has_opened && - next_circ->state == CIRCUIT_STATE_OPEN && - TO_ORIGIN_CIRCUIT(next_circ)->build_state && - TO_ORIGIN_CIRCUIT(next_circ)->build_state->desired_path_len - == DEFAULT_ROUTE_LEN) { - any_opened_circs = 1; - break; - } - } - -#define SET_CUTOFF(target, msec) do { \ - long ms = tor_lround(msec); \ - struct timeval diff; \ - diff.tv_sec = ms / 1000; \ - diff.tv_usec = (int)((ms % 1000) * 1000); \ - timersub(&now, &diff, &target); \ - } while (0) - - /** - * Because circuit build timeout is calculated only based on 3 hop - * general purpose circuit construction, we need to scale the timeout - * to make it properly apply to longer circuits, and circuits of - * certain usage types. The following diagram illustrates how we - * derive the scaling below. In short, we calculate the number - * of times our telescoping-based circuit construction causes cells - * to traverse each link for the circuit purpose types in question, - * and then assume each link is equivalent. - * - * OP --a--> A --b--> B --c--> C - * OP --a--> A --b--> B --c--> C --d--> D - * - * Let h = a = b = c = d - * - * Three hops (general_cutoff) - * RTTs = 3a + 2b + c - * RTTs = 6h - * Cannibalized: - * RTTs = a+b+c+d - * RTTs = 4h - * Four hops: - * RTTs = 4a + 3b + 2c + d - * RTTs = 10h - * Client INTRODUCE1+ACK: // XXX: correct? - * RTTs = 5a + 4b + 3c + 2d - * RTTs = 14h - * Server intro: - * RTTs = 4a + 3b + 2c - * RTTs = 9h - */ - SET_CUTOFF(general_cutoff, get_circuit_build_timeout_ms()); - SET_CUTOFF(begindir_cutoff, get_circuit_build_timeout_ms()); - - /* > 3hop circs seem to have a 1.0 second delay on their cannibalized - * 4th hop. */ - SET_CUTOFF(fourhop_cutoff, get_circuit_build_timeout_ms() * (10/6.0) + 1000); - - /* CIRCUIT_PURPOSE_C_ESTABLISH_REND behaves more like a RELAY cell. - * Use the stream cutoff (more or less). */ - SET_CUTOFF(stream_cutoff, MAX(options->CircuitStreamTimeout,15)*1000 + 1000); - - /* Be lenient with cannibalized circs. They already survived the official - * CBT, and they're usually not performance-critical. */ - SET_CUTOFF(cannibalized_cutoff, - MAX(get_circuit_build_close_time_ms()*(4/6.0), - options->CircuitStreamTimeout * 1000) + 1000); - - /* Intro circs have an extra round trip (and are also 4 hops long) */ - SET_CUTOFF(c_intro_cutoff, get_circuit_build_timeout_ms() * (14/6.0) + 1000); - - /* Server intro circs have an extra round trip */ - SET_CUTOFF(s_intro_cutoff, get_circuit_build_timeout_ms() * (9/6.0) + 1000); - - SET_CUTOFF(close_cutoff, get_circuit_build_close_time_ms()); - SET_CUTOFF(extremely_old_cutoff, get_circuit_build_close_time_ms()*2 + 1000); - - SET_CUTOFF(hs_extremely_old_cutoff, - MAX(get_circuit_build_close_time_ms()*2 + 1000, - options->SocksTimeout * 1000)); - - TOR_LIST_FOREACH(next_circ, circuit_get_global_list(), head) { - struct timeval cutoff; - victim = next_circ; - if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */ - victim->marked_for_close) /* don't mess with marked circs */ - continue; - - /* If we haven't yet started the first hop, it means we don't have - * any orconns available, and thus have not started counting time yet - * for this circuit. See circuit_deliver_create_cell() and uses of - * timestamp_began. - * - * Continue to wait in this case. The ORConn should timeout - * independently and kill us then. - */ - if (TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_CLOSED) { - continue; - } - - build_state = TO_ORIGIN_CIRCUIT(victim)->build_state; - if (build_state && build_state->onehop_tunnel) - cutoff = begindir_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) - cutoff = close_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING || - victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) - cutoff = c_intro_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) - cutoff = s_intro_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND) - cutoff = stream_cutoff; - else if (victim->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING) - cutoff = close_cutoff; - else if (TO_ORIGIN_CIRCUIT(victim)->has_opened && - victim->state != CIRCUIT_STATE_OPEN) - cutoff = cannibalized_cutoff; - else if (build_state && build_state->desired_path_len >= 4) - cutoff = fourhop_cutoff; - else - cutoff = general_cutoff; - - if (TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) - cutoff = hs_extremely_old_cutoff; - - if (timercmp(&victim->timestamp_began, &cutoff, >)) - continue; /* it's still young, leave it alone */ - - /* We need to double-check the opened state here because - * we don't want to consider opened 1-hop dircon circuits for - * deciding when to relax the timeout, but we *do* want to relax - * those circuits too if nothing else is opened *and* they still - * aren't either. */ - if (!any_opened_circs && victim->state != CIRCUIT_STATE_OPEN) { - /* It's still young enough that we wouldn't close it, right? */ - if (timercmp(&victim->timestamp_began, &close_cutoff, >)) { - if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) { - int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath->state - == CPATH_STATE_OPEN; - log_info(LD_CIRC, - "No circuits are opened. Relaxing timeout for circuit %d " - "(a %s %d-hop circuit in state %s with channel state %s). " - "%d guards are live.", - TO_ORIGIN_CIRCUIT(victim)->global_identifier, - circuit_purpose_to_string(victim->purpose), - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len, - circuit_state_to_string(victim->state), - channel_state_to_string(victim->n_chan->state), - num_live_entry_guards(0)); - - /* We count the timeout here for CBT, because technically this - * was a timeout, and the timeout value needs to reset if we - * see enough of them. Note this means we also need to avoid - * double-counting below, too. */ - circuit_build_times_count_timeout(get_circuit_build_times_mutable(), - first_hop_succeeded); - TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout = 1; - } - continue; - } else { - static ratelim_t relax_timeout_limit = RATELIM_INIT(3600); - const double build_close_ms = get_circuit_build_close_time_ms(); - log_fn_ratelim(&relax_timeout_limit, LOG_NOTICE, LD_CIRC, - "No circuits are opened. Relaxed timeout for circuit %d " - "(a %s %d-hop circuit in state %s with channel state %s) to " - "%ldms. However, it appears the circuit has timed out " - "anyway. %d guards are live.", - TO_ORIGIN_CIRCUIT(victim)->global_identifier, - circuit_purpose_to_string(victim->purpose), - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len, - circuit_state_to_string(victim->state), - channel_state_to_string(victim->n_chan->state), - (long)build_close_ms, - num_live_entry_guards(0)); - } - } - -#if 0 - /* some debug logs, to help track bugs */ - if (victim->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && - victim->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) { - if (!victim->timestamp_dirty) - log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d)." - "(clean).", - victim->state == CIRCUIT_STATE_OPEN ? "" : "non", - victim->purpose, victim->build_state->chosen_exit_name, - victim->n_circ_id); - else - log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d). " - "%d secs since dirty.", - victim->state == CIRCUIT_STATE_OPEN ? "" : "non", - victim->purpose, victim->build_state->chosen_exit_name, - victim->n_circ_id, - (int)(now - victim->timestamp_dirty)); - } -#endif - - /* if circ is !open, or if it's open but purpose is a non-finished - * intro or rend, then mark it for close */ - if (victim->state == CIRCUIT_STATE_OPEN) { - switch (victim->purpose) { - default: /* most open circuits can be left alone. */ - continue; /* yes, continue inside a switch refers to the nearest - * enclosing loop. C is smart. */ - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - break; /* too old, need to die */ - case CIRCUIT_PURPOSE_C_REND_READY: - /* it's a rend_ready circ -- has it already picked a query? */ - /* c_rend_ready circs measure age since timestamp_dirty, - * because that's set when they switch purposes - */ - if (TO_ORIGIN_CIRCUIT(victim)->rend_data || - victim->timestamp_dirty > cutoff.tv_sec) - continue; - break; - case CIRCUIT_PURPOSE_PATH_BIAS_TESTING: - /* Open path bias testing circuits are given a long - * time to complete the test, but not forever */ - TO_ORIGIN_CIRCUIT(victim)->path_state = PATH_STATE_USE_FAILED; - break; - case CIRCUIT_PURPOSE_C_INTRODUCING: - /* We keep old introducing circuits around for - * a while in parallel, and they can end up "opened". - * We decide below if we're going to mark them timed - * out and eventually close them. - */ - break; - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - /* rend and intro circs become dirty each time they - * make an introduction attempt. so timestamp_dirty - * will reflect the time since the last attempt. - */ - if (victim->timestamp_dirty > cutoff.tv_sec) - continue; - break; - } - } else { /* circuit not open, consider recording failure as timeout */ - int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath && - TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_OPEN; - - if (TO_ORIGIN_CIRCUIT(victim)->p_streams != NULL) { - log_warn(LD_BUG, "Circuit %d (purpose %d, %s) has timed out, " - "yet has attached streams!", - TO_ORIGIN_CIRCUIT(victim)->global_identifier, - victim->purpose, - circuit_purpose_to_string(victim->purpose)); - tor_fragile_assert(); - continue; - } - - if (circuit_timeout_want_to_count_circ(TO_ORIGIN_CIRCUIT(victim)) && - circuit_build_times_enough_to_compute(get_circuit_build_times())) { - /* Circuits are allowed to last longer for measurement. - * Switch their purpose and wait. */ - if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) { - control_event_circuit_status(TO_ORIGIN_CIRCUIT(victim), - CIRC_EVENT_FAILED, - END_CIRC_REASON_TIMEOUT); - circuit_change_purpose(victim, CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT); - /* Record this failure to check for too many timeouts - * in a row. This function does not record a time value yet - * (we do that later); it only counts the fact that we did - * have a timeout. We also want to avoid double-counting - * already "relaxed" circuits, which are counted above. */ - if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) { - circuit_build_times_count_timeout( - get_circuit_build_times_mutable(), - first_hop_succeeded); - } - continue; - } - - /* - * If the circuit build time is much greater than we would have cut - * it off at, we probably had a suspend event along this codepath, - * and we should discard the value. - */ - if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, <)) { - log_notice(LD_CIRC, - "Extremely large value for circuit build timeout: %lds. " - "Assuming clock jump. Purpose %d (%s)", - (long)(now.tv_sec - victim->timestamp_began.tv_sec), - victim->purpose, - circuit_purpose_to_string(victim->purpose)); - } else if (circuit_build_times_count_close( - get_circuit_build_times_mutable(), - first_hop_succeeded, - victim->timestamp_created.tv_sec)) { - circuit_build_times_set_timeout(get_circuit_build_times_mutable()); - } - } - } - - /* If this is a hidden service client circuit which is far enough - * along in connecting to its destination, and we haven't already - * flagged it as 'timed out', and the user has not told us to - * close such circs immediately on timeout, flag it as 'timed out' - * so we'll launch another intro or rend circ, but don't mark it - * for close yet. - * - * (Circs flagged as 'timed out' are given a much longer timeout - * period above, so we won't close them in the next call to - * circuit_expire_building.) */ - if (!(options->CloseHSClientCircuitsImmediatelyOnTimeout) && - !(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out)) { - switch (victim->purpose) { - case CIRCUIT_PURPOSE_C_REND_READY: - /* We only want to spare a rend circ if it has been specified in - * an INTRODUCE1 cell sent to a hidden service. A circ's - * pending_final_cpath field is non-NULL iff it is a rend circ - * and we have tried to send an INTRODUCE1 cell specifying it. - * Thus, if the pending_final_cpath field *is* NULL, then we - * want to not spare it. */ - if (TO_ORIGIN_CIRCUIT(victim)->build_state->pending_final_cpath == - NULL) - break; - /* fallthrough! */ - case CIRCUIT_PURPOSE_C_INTRODUCING: - /* connection_ap_handshake_attach_circuit() will relaunch for us */ - case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: - case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: - /* If we have reached this line, we want to spare the circ for now. */ - log_info(LD_CIRC,"Marking circ %u (state %d:%s, purpose %d) " - "as timed-out HS circ", - (unsigned)victim->n_circ_id, - victim->state, circuit_state_to_string(victim->state), - victim->purpose); - TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out = 1; - continue; - default: - break; - } - } - - /* If this is a service-side rendezvous circuit which is far - * enough along in connecting to its destination, consider sparing - * it. */ - if (!(options->CloseHSServiceRendCircuitsImmediatelyOnTimeout) && - !(TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) && - victim->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { - log_info(LD_CIRC,"Marking circ %u (state %d:%s, purpose %d) " - "as timed-out HS circ; relaunching rendezvous attempt.", - (unsigned)victim->n_circ_id, - victim->state, circuit_state_to_string(victim->state), - victim->purpose); - TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out = 1; - rend_service_relaunch_rendezvous(TO_ORIGIN_CIRCUIT(victim)); - continue; - } - - if (victim->n_chan) - log_info(LD_CIRC, - "Abandoning circ %u %s:%u (state %d,%d:%s, purpose %d, " - "len %d)", TO_ORIGIN_CIRCUIT(victim)->global_identifier, - channel_get_canonical_remote_descr(victim->n_chan), - (unsigned)victim->n_circ_id, - TO_ORIGIN_CIRCUIT(victim)->has_opened, - victim->state, circuit_state_to_string(victim->state), - victim->purpose, - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len); - else - log_info(LD_CIRC, - "Abandoning circ %u %u (state %d,%d:%s, purpose %d, len %d)", - TO_ORIGIN_CIRCUIT(victim)->global_identifier, - (unsigned)victim->n_circ_id, - TO_ORIGIN_CIRCUIT(victim)->has_opened, - victim->state, - circuit_state_to_string(victim->state), victim->purpose, - TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len); - - circuit_log_path(LOG_INFO,LD_CIRC,TO_ORIGIN_CIRCUIT(victim)); - if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) - circuit_mark_for_close(victim, END_CIRC_REASON_MEASUREMENT_EXPIRED); - else - circuit_mark_for_close(victim, END_CIRC_REASON_TIMEOUT); - - pathbias_count_timeout(TO_ORIGIN_CIRCUIT(victim)); - } -} - -/** Remove any elements in needed_ports that are handled by an - * open or in-progress circuit. - */ -void -circuit_remove_handled_ports(smartlist_t *needed_ports) -{ - int i; - uint16_t *port; - - for (i = 0; i < smartlist_len(needed_ports); ++i) { - port = smartlist_get(needed_ports, i); - tor_assert(*port); - if (circuit_stream_is_being_handled(NULL, *port, - MIN_CIRCUITS_HANDLING_STREAM)) { -// log_debug(LD_CIRC,"Port %d is already being handled; removing.", port); - smartlist_del(needed_ports, i--); - tor_free(port); - } else { - log_debug(LD_CIRC,"Port %d is not handled.", *port); - } - } -} - -/** Return 1 if at least min general-purpose non-internal circuits - * will have an acceptable exit node for exit stream conn if it - * is defined, else for "*:port". - * Else return 0. - */ -int -circuit_stream_is_being_handled(entry_connection_t *conn, - uint16_t port, int min) -{ - circuit_t *circ; - const node_t *exitnode; - int num=0; - time_t now = time(NULL); - int need_uptime = smartlist_contains_int_as_string( - get_options()->LongLivedPorts, - conn ? conn->socks_request->port : port); - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (CIRCUIT_IS_ORIGIN(circ) && - !circ->marked_for_close && - circ->purpose == CIRCUIT_PURPOSE_C_GENERAL && - (!circ->timestamp_dirty || - circ->timestamp_dirty + get_options()->MaxCircuitDirtiness > now)) { - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - cpath_build_state_t *build_state = origin_circ->build_state; - if (build_state->is_internal || build_state->onehop_tunnel) - continue; - if (origin_circ->unusable_for_new_conns) - continue; - - exitnode = build_state_get_exit_node(build_state); - if (exitnode && (!need_uptime || build_state->need_uptime)) { - int ok; - if (conn) { - ok = connection_ap_can_use_exit(conn, exitnode); - } else { - addr_policy_result_t r; - r = compare_tor_addr_to_node_policy(NULL, port, exitnode); - ok = r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED; - } - if (ok) { - if (++num >= min) - return 1; - } - } - } - } - return 0; -} - -/** Don't keep more than this many unused open circuits around. */ -#define MAX_UNUSED_OPEN_CIRCUITS 14 - -/** Figure out how many circuits we have open that are clean. Make - * sure it's enough for all the upcoming behaviors we predict we'll have. - * But put an upper bound on the total number of circuits. - */ -static void -circuit_predict_and_launch_new(void) -{ - circuit_t *circ; - int num=0, num_internal=0, num_uptime_internal=0; - int hidserv_needs_uptime=0, hidserv_needs_capacity=1; - int port_needs_uptime=0, port_needs_capacity=1; - time_t now = time(NULL); - int flags = 0; - - /* First, count how many of each type of circuit we have already. */ - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - cpath_build_state_t *build_state; - origin_circuit_t *origin_circ; - if (!CIRCUIT_IS_ORIGIN(circ)) - continue; - if (circ->marked_for_close) - continue; /* don't mess with marked circs */ - if (circ->timestamp_dirty) - continue; /* only count clean circs */ - if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL) - continue; /* only pay attention to general-purpose circs */ - origin_circ = TO_ORIGIN_CIRCUIT(circ); - if (origin_circ->unusable_for_new_conns) - continue; - build_state = origin_circ->build_state; - if (build_state->onehop_tunnel) - continue; - num++; - if (build_state->is_internal) - num_internal++; - if (build_state->need_uptime && build_state->is_internal) - num_uptime_internal++; - } - - /* If that's enough, then stop now. */ - if (num >= MAX_UNUSED_OPEN_CIRCUITS) - return; /* we already have many, making more probably will hurt */ - - /* Second, see if we need any more exit circuits. */ - /* check if we know of a port that's been requested recently - * and no circuit is currently available that can handle it. */ - if (!circuit_all_predicted_ports_handled(now, &port_needs_uptime, - &port_needs_capacity)) { - if (port_needs_uptime) - flags |= CIRCLAUNCH_NEED_UPTIME; - if (port_needs_capacity) - flags |= CIRCLAUNCH_NEED_CAPACITY; - log_info(LD_CIRC, - "Have %d clean circs (%d internal), need another exit circ.", - num, num_internal); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; - } - - /* Third, see if we need any more hidden service (server) circuits. */ - if (num_rend_services() && num_uptime_internal < 3) { - flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME | - CIRCLAUNCH_IS_INTERNAL); - log_info(LD_CIRC, - "Have %d clean circs (%d internal), need another internal " - "circ for my hidden service.", - num, num_internal); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; - } - - /* Fourth, see if we need any more hidden service (client) circuits. */ - if (rep_hist_get_predicted_internal(now, &hidserv_needs_uptime, - &hidserv_needs_capacity) && - ((num_uptime_internal<2 && hidserv_needs_uptime) || - num_internal<2)) { - if (hidserv_needs_uptime) - flags |= CIRCLAUNCH_NEED_UPTIME; - if (hidserv_needs_capacity) - flags |= CIRCLAUNCH_NEED_CAPACITY; - flags |= CIRCLAUNCH_IS_INTERNAL; - log_info(LD_CIRC, - "Have %d clean circs (%d uptime-internal, %d internal), need" - " another hidden service circ.", - num, num_uptime_internal, num_internal); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; - } - - /* Finally, check to see if we still need more circuits to learn - * a good build timeout. But if we're close to our max number we - * want, don't do another -- we want to leave a few slots open so - * we can still build circuits preemptively as needed. */ - if (num < MAX_UNUSED_OPEN_CIRCUITS-2 && - ! circuit_build_times_disabled() && - circuit_build_times_needs_circuits_now(get_circuit_build_times())) { - flags = CIRCLAUNCH_NEED_CAPACITY; - log_info(LD_CIRC, - "Have %d clean circs need another buildtime test circ.", num); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; - } -} - -/** Build a new test circuit every 5 minutes */ -#define TESTING_CIRCUIT_INTERVAL 300 - -/** This function is called once a second, if router_have_min_dir_info() is - * true. Its job is to make sure all services we offer have enough circuits - * available. Some services just want enough circuits for current tasks, - * whereas others want a minimum set of idle circuits hanging around. - */ -void -circuit_build_needed_circs(time_t now) -{ - static time_t time_to_new_circuit = 0; - const or_options_t *options = get_options(); - - /* launch a new circ for any pending streams that need one */ - connection_ap_attach_pending(); - - /* make sure any hidden services have enough intro points */ - rend_services_introduce(); - - if (time_to_new_circuit < now) { - circuit_reset_failure_count(1); - time_to_new_circuit = now + options->NewCircuitPeriod; - if (proxy_mode(get_options())) - addressmap_clean(now); - circuit_expire_old_circuits_clientside(); - -#if 0 /* disable for now, until predict-and-launch-new can cull leftovers */ - circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL); - if (get_options()->RunTesting && - circ && - circ->timestamp_began.tv_sec + TESTING_CIRCUIT_INTERVAL < now) { - log_fn(LOG_INFO,"Creating a new testing circuit."); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, 0); - } -#endif - } - if (!options->DisablePredictedCircuits) - circuit_predict_and_launch_new(); -} - -/** If the stream conn is a member of any of the linked - * lists of circ, then remove it from the list. - */ -void -circuit_detach_stream(circuit_t *circ, edge_connection_t *conn) -{ - edge_connection_t *prevconn; - - tor_assert(circ); - tor_assert(conn); - - if (conn->base_.type == CONN_TYPE_AP) { - entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn); - entry_conn->may_use_optimistic_data = 0; - } - conn->cpath_layer = NULL; /* don't keep a stale pointer */ - conn->on_circuit = NULL; - - if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - if (conn == origin_circ->p_streams) { - origin_circ->p_streams = conn->next_stream; - return; - } - - for (prevconn = origin_circ->p_streams; - prevconn && prevconn->next_stream && prevconn->next_stream != conn; - prevconn = prevconn->next_stream) - ; - if (prevconn && prevconn->next_stream) { - prevconn->next_stream = conn->next_stream; - return; - } - } else { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (conn == or_circ->n_streams) { - or_circ->n_streams = conn->next_stream; - return; - } - if (conn == or_circ->resolving_streams) { - or_circ->resolving_streams = conn->next_stream; - return; - } - - for (prevconn = or_circ->n_streams; - prevconn && prevconn->next_stream && prevconn->next_stream != conn; - prevconn = prevconn->next_stream) - ; - if (prevconn && prevconn->next_stream) { - prevconn->next_stream = conn->next_stream; - return; - } - - for (prevconn = or_circ->resolving_streams; - prevconn && prevconn->next_stream && prevconn->next_stream != conn; - prevconn = prevconn->next_stream) - ; - if (prevconn && prevconn->next_stream) { - prevconn->next_stream = conn->next_stream; - return; - } - } - - log_warn(LD_BUG,"Edge connection not in circuit's list."); - /* Don't give an error here; it's harmless. */ - tor_fragile_assert(); -} - -/** If we haven't yet decided on a good timeout value for circuit - * building, we close idles circuits aggressively so we can get more - * data points. */ -#define IDLE_TIMEOUT_WHILE_LEARNING (10*60) - -/** Find each circuit that has been unused for too long, or dirty - * for too long and has no streams on it: mark it for close. - */ -static void -circuit_expire_old_circuits_clientside(void) -{ - circuit_t *circ; - struct timeval cutoff, now; - - tor_gettimeofday(&now); - cutoff = now; - - if (! circuit_build_times_disabled() && - circuit_build_times_needs_circuits(get_circuit_build_times())) { - /* Circuits should be shorter lived if we need more of them - * for learning a good build timeout */ - cutoff.tv_sec -= IDLE_TIMEOUT_WHILE_LEARNING; - } else { - cutoff.tv_sec -= get_options()->CircuitIdleTimeout; - } - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ)) - continue; - /* If the circuit has been dirty for too long, and there are no streams - * on it, mark it for close. - */ - if (circ->timestamp_dirty && - circ->timestamp_dirty + get_options()->MaxCircuitDirtiness < - now.tv_sec && - !TO_ORIGIN_CIRCUIT(circ)->p_streams /* nothing attached */ ) { - log_debug(LD_CIRC, "Closing n_circ_id %u (dirty %ld sec ago, " - "purpose %d)", - (unsigned)circ->n_circ_id, - (long)(now.tv_sec - circ->timestamp_dirty), - circ->purpose); - /* Don't do this magic for testing circuits. Their death is governed - * by circuit_expire_building */ - if (circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) { - if (timercmp(&circ->timestamp_began, &cutoff, <)) { - if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL || - circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT || - circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || - circ->purpose == CIRCUIT_PURPOSE_TESTING || - (circ->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && - circ->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) || - circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) { - log_debug(LD_CIRC, - "Closing circuit that has been unused for %ld msec.", - tv_mdiff(&circ->timestamp_began, &now)); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) { - /* Server-side rend joined circuits can end up really old, because - * they are reused by clients for longer than normal. The client - * controls their lifespan. (They never become dirty, because - * connection_exit_begin_conn() never marks anything as dirty.) - * Similarly, server-side intro circuits last a long time. */ - if (circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED && - circ->purpose != CIRCUIT_PURPOSE_S_INTRO) { - log_notice(LD_CIRC, - "Ancient non-dirty circuit %d is still around after " - "%ld milliseconds. Purpose: %d (%s)", - TO_ORIGIN_CIRCUIT(circ)->global_identifier, - tv_mdiff(&circ->timestamp_began, &now), - circ->purpose, - circuit_purpose_to_string(circ->purpose)); - TO_ORIGIN_CIRCUIT(circ)->is_ancient = 1; - } - } - } - } - } -} - -/** How long do we wait before killing circuits with the properties - * described below? - * - * Probably we could choose a number here as low as 5 to 10 seconds, - * since these circs are used for begindir, and a) generally you either - * ask another begindir question right after or you don't for a long time, - * b) clients at least through 0.2.1.x choose from the whole set of - * directory mirrors at each choice, and c) re-establishing a one-hop - * circuit via create-fast is a light operation assuming the TLS conn is - * still there. - * - * I expect "b" to go away one day when we move to using directory - * guards, but I think "a" and "c" are good enough reasons that a low - * number is safe even then. - */ -#define IDLE_ONE_HOP_CIRC_TIMEOUT 60 - -/** Find each non-origin circuit that has been unused for too long, - * has no streams on it, used a create_fast, and ends here: mark it - * for close. - */ -void -circuit_expire_old_circuits_serverside(time_t now) -{ - circuit_t *circ; - or_circuit_t *or_circ; - time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT; - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ)) - continue; - or_circ = TO_OR_CIRCUIT(circ); - /* If the circuit has been idle for too long, and there are no streams - * on it, and it ends here, and it used a create_fast, mark it for close. - */ - if (or_circ->is_first_hop && !circ->n_chan && - !or_circ->n_streams && !or_circ->resolving_streams && - or_circ->p_chan && - channel_when_last_xmit(or_circ->p_chan) <= cutoff) { - log_info(LD_CIRC, "Closing circ_id %u (empty %d secs ago)", - (unsigned)or_circ->p_circ_id, - (int)(now - channel_when_last_xmit(or_circ->p_chan))); - circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); - } - } -} - -/** Number of testing circuits we want open before testing our bandwidth. */ -#define NUM_PARALLEL_TESTING_CIRCS 4 - -/** True iff we've ever had enough testing circuits open to test our - * bandwidth. */ -static int have_performed_bandwidth_test = 0; - -/** Reset have_performed_bandwidth_test, so we'll start building - * testing circuits again so we can exercise our bandwidth. */ -void -reset_bandwidth_test(void) -{ - have_performed_bandwidth_test = 0; -} - -/** Return 1 if we've already exercised our bandwidth, or if we - * have fewer than NUM_PARALLEL_TESTING_CIRCS testing circuits - * established or on the way. Else return 0. - */ -int -circuit_enough_testing_circs(void) -{ - circuit_t *circ; - int num = 0; - - if (have_performed_bandwidth_test) - return 1; - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) && - circ->purpose == CIRCUIT_PURPOSE_TESTING && - circ->state == CIRCUIT_STATE_OPEN) - num++; - } - return num >= NUM_PARALLEL_TESTING_CIRCS; -} - -/** A testing circuit has completed. Take whatever stats we want. - * Noticing reachability is taken care of in onionskin_answer(), - * so there's no need to record anything here. But if we still want - * to do the bandwidth test, and we now have enough testing circuits - * open, do it. - */ -static void -circuit_testing_opened(origin_circuit_t *circ) -{ - if (have_performed_bandwidth_test || - !check_whether_orport_reachable()) { - /* either we've already done everything we want with testing circuits, - * or this testing circuit became open due to a fluke, e.g. we picked - * a last hop where we already had the connection open due to an - * outgoing local circuit. */ - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_AT_ORIGIN); - } else if (circuit_enough_testing_circs()) { - router_perform_bandwidth_test(NUM_PARALLEL_TESTING_CIRCS, time(NULL)); - have_performed_bandwidth_test = 1; - } else - consider_testing_reachability(1, 0); -} - -/** A testing circuit has failed to build. Take whatever stats we want. */ -static void -circuit_testing_failed(origin_circuit_t *circ, int at_last_hop) -{ - if (server_mode(get_options()) && check_whether_orport_reachable()) - return; - - log_info(LD_GENERAL, - "Our testing circuit (to see if your ORPort is reachable) " - "has failed. I'll try again later."); - - /* These aren't used yet. */ - (void)circ; - (void)at_last_hop; -} - -/** The circuit circ has just become open. Take the next - * step: for rendezvous circuits, we pass circ to the appropriate - * function in rendclient or rendservice. For general circuits, we - * call connection_ap_attach_pending, which looks for pending streams - * that could use circ. - */ -void -circuit_has_opened(origin_circuit_t *circ) -{ - control_event_circuit_status(circ, CIRC_EVENT_BUILT, 0); - - /* Remember that this circuit has finished building. Now if we start - * it building again later (e.g. by extending it), we will know not - * to consider its build time. */ - circ->has_opened = 1; - - switch (TO_CIRCUIT(circ)->purpose) { - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - rend_client_rendcirc_has_opened(circ); - /* Start building an intro circ if we don't have one yet. */ - connection_ap_attach_pending(); - /* This isn't a call to circuit_try_attaching_streams because a - * circuit in _C_ESTABLISH_REND state isn't connected to its - * hidden service yet, thus we can't attach streams to it yet, - * thus circuit_try_attaching_streams would always clear the - * circuit's isolation state. circuit_try_attaching_streams is - * called later, when the rend circ enters _C_REND_JOINED - * state. */ - break; - case CIRCUIT_PURPOSE_C_INTRODUCING: - rend_client_introcirc_has_opened(circ); - break; - case CIRCUIT_PURPOSE_C_GENERAL: - /* Tell any AP connections that have been waiting for a new - * circuit that one is ready. */ - circuit_try_attaching_streams(circ); - break; - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* at Bob, waiting for introductions */ - rend_service_intro_has_opened(circ); - break; - case CIRCUIT_PURPOSE_S_CONNECT_REND: - /* at Bob, connecting to rend point */ - rend_service_rendezvous_has_opened(circ); - break; - case CIRCUIT_PURPOSE_TESTING: - circuit_testing_opened(circ); - break; - /* default: - * This won't happen in normal operation, but might happen if the - * controller did it. Just let it slide. */ - } -} - -/** If the stream-isolation state of circ can be cleared, clear - * it. Return non-zero iff circ's isolation state was cleared. */ -static int -circuit_try_clearing_isolation_state(origin_circuit_t *circ) -{ - if (/* The circuit may have become non-open if it was cannibalized.*/ - circ->base_.state == CIRCUIT_STATE_OPEN && - /* If !isolation_values_set, there is nothing to clear. */ - circ->isolation_values_set && - /* It's not legal to clear a circuit's isolation info if it's ever had - * streams attached */ - !circ->isolation_any_streams_attached) { - /* If we have any isolation information set on this circuit, and - * we didn't manage to attach any streams to it, then we can - * and should clear it and try again. */ - circuit_clear_isolation(circ); - return 1; - } else { - return 0; - } -} - -/** Called when a circuit becomes ready for streams to be attached to - * it. */ -void -circuit_try_attaching_streams(origin_circuit_t *circ) -{ - /* Attach streams to this circuit if we can. */ - connection_ap_attach_pending(); - - /* The call to circuit_try_clearing_isolation_state here will do - * nothing and return 0 if we didn't attach any streams to circ - * above. */ - if (circuit_try_clearing_isolation_state(circ)) { - /* Maybe *now* we can attach some streams to this circuit. */ - connection_ap_attach_pending(); - } -} - -/** Called whenever a circuit could not be successfully built. - */ -void -circuit_build_failed(origin_circuit_t *circ) -{ - channel_t *n_chan = NULL; - /* we should examine circ and see if it failed because of - * the last hop or an earlier hop. then use this info below. - */ - int failed_at_last_hop = 0; - /* If the last hop isn't open, and the second-to-last is, we failed - * at the last hop. */ - if (circ->cpath && - circ->cpath->prev->state != CPATH_STATE_OPEN && - circ->cpath->prev->prev->state == CPATH_STATE_OPEN) { - failed_at_last_hop = 1; - } - if (circ->cpath && - circ->cpath->state != CPATH_STATE_OPEN && - ! circ->base_.received_destroy) { - /* We failed at the first hop for some reason other than a DESTROY cell. - * If there's an OR connection to blame, blame it. Also, avoid this relay - * for a while, and fail any one-hop directory fetches destined for it. */ - const char *n_chan_id = circ->cpath->extend_info->identity_digest; - int already_marked = 0; - if (circ->base_.n_chan) { - n_chan = circ->base_.n_chan; - - if (n_chan->is_bad_for_new_circs) { - /* We only want to blame this router when a fresh healthy - * connection fails. So don't mark this router as newly failed, - * since maybe this was just an old circuit attempt that's - * finally timing out now. Also, there's no need to blow away - * circuits/streams/etc, since the failure of an unhealthy conn - * doesn't tell us much about whether a healthy conn would - * succeed. */ - already_marked = 1; - } - log_info(LD_OR, - "Our circuit failed to get a response from the first hop " - "(%s). I'm going to try to rotate to a better connection.", - channel_get_canonical_remote_descr(n_chan)); - n_chan->is_bad_for_new_circs = 1; - } else { - log_info(LD_OR, - "Our circuit died before the first hop with no connection"); - } - if (n_chan_id && !already_marked) { - entry_guard_register_connect_status(n_chan_id, 0, 1, time(NULL)); - /* if there are any one-hop streams waiting on this circuit, fail - * them now so they can retry elsewhere. */ - connection_ap_fail_onehop(n_chan_id, circ->build_state); - } - } - - switch (circ->base_.purpose) { - case CIRCUIT_PURPOSE_C_GENERAL: - /* If we never built the circuit, note it as a failure. */ - circuit_increment_failure_count(); - if (failed_at_last_hop) { - /* Make sure any streams that demand our last hop as their exit - * know that it's unlikely to happen. */ - circuit_discard_optional_exit_enclaves(circ->cpath->prev->extend_info); - } - break; - case CIRCUIT_PURPOSE_TESTING: - circuit_testing_failed(circ, failed_at_last_hop); - break; - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* at Bob, waiting for introductions */ - if (circ->base_.state != CIRCUIT_STATE_OPEN) { - circuit_increment_failure_count(); - } - /* no need to care here, because bob will rebuild intro - * points periodically. */ - break; - case CIRCUIT_PURPOSE_C_INTRODUCING: - /* at Alice, connecting to intro point */ - /* Don't increment failure count, since Bob may have picked - * the introduction point maliciously */ - /* Alice will pick a new intro point when this one dies, if - * the stream in question still cares. No need to act here. */ - break; - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - /* at Alice, waiting for Bob */ - circuit_increment_failure_count(); - /* Alice will pick a new rend point when this one dies, if - * the stream in question still cares. No need to act here. */ - break; - case CIRCUIT_PURPOSE_S_CONNECT_REND: - /* at Bob, connecting to rend point */ - /* Don't increment failure count, since Alice may have picked - * the rendezvous point maliciously */ - log_info(LD_REND, - "Couldn't connect to Alice's chosen rend point %s " - "(%s hop failed).", - escaped(build_state_get_exit_nickname(circ->build_state)), - failed_at_last_hop?"last":"non-last"); - rend_service_relaunch_rendezvous(circ); - break; - /* default: - * This won't happen in normal operation, but might happen if the - * controller did it. Just let it slide. */ - } -} - -/** Number of consecutive failures so far; should only be touched by - * circuit_launch_new and circuit_*_failure_count. - */ -static int n_circuit_failures = 0; -/** Before the last time we called circuit_reset_failure_count(), were - * there a lot of failures? */ -static int did_circs_fail_last_period = 0; - -/** Don't retry launching a new circuit if we try this many times with no - * success. */ -#define MAX_CIRCUIT_FAILURES 5 - -/** Launch a new circuit; see circuit_launch_by_extend_info() for - * details on arguments. */ -origin_circuit_t * -circuit_launch(uint8_t purpose, int flags) -{ - return circuit_launch_by_extend_info(purpose, NULL, flags); -} - -/** Launch a new circuit with purpose purpose and exit node - * extend_info (or NULL to select a random exit node). If flags - * contains CIRCLAUNCH_NEED_UPTIME, choose among routers with high uptime. If - * CIRCLAUNCH_NEED_CAPACITY is set, choose among routers with high bandwidth. - * If CIRCLAUNCH_IS_INTERNAL is true, the last hop need not be an exit node. - * If CIRCLAUNCH_ONEHOP_TUNNEL is set, the circuit will have only one hop. - * Return the newly allocated circuit on success, or NULL on failure. */ -origin_circuit_t * -circuit_launch_by_extend_info(uint8_t purpose, - extend_info_t *extend_info, - int flags) -{ - origin_circuit_t *circ; - int onehop_tunnel = (flags & CIRCLAUNCH_ONEHOP_TUNNEL) != 0; - - if (!onehop_tunnel && !router_have_minimum_dir_info()) { - log_debug(LD_CIRC,"Haven't fetched enough directory info yet; canceling " - "circuit launch."); - return NULL; - } - - if ((extend_info || purpose != CIRCUIT_PURPOSE_C_GENERAL) && - purpose != CIRCUIT_PURPOSE_TESTING && !onehop_tunnel) { - /* see if there are appropriate circs available to cannibalize. */ - /* XXX if we're planning to add a hop, perhaps we want to look for - * internal circs rather than exit circs? -RD */ - circ = circuit_find_to_cannibalize(purpose, extend_info, flags); - if (circ) { - uint8_t old_purpose = circ->base_.purpose; - struct timeval old_timestamp_began; - - log_info(LD_CIRC,"Cannibalizing circ '%s' for purpose %d (%s)", - build_state_get_exit_nickname(circ->build_state), purpose, - circuit_purpose_to_string(purpose)); - - if ((purpose == CIRCUIT_PURPOSE_S_CONNECT_REND || - purpose == CIRCUIT_PURPOSE_C_INTRODUCING) && - circ->path_state == PATH_STATE_BUILD_SUCCEEDED) { - /* Path bias: Cannibalized rends pre-emptively count as a - * successfully built but unused closed circuit. We don't - * wait until the extend (or the close) because the rend - * point could be malicious. - * - * Same deal goes for client side introductions. Clients - * can be manipulated to connect repeatedly to them - * (especially web clients). - * - * If we decide to probe the initial portion of these circs, - * (up to the adversary's final hop), we need to remove this, - * or somehow mark the circuit with a special path state. - */ - - /* This must be called before the purpose change */ - pathbias_check_close(circ, END_CIRC_REASON_FINISHED); - } - - circuit_change_purpose(TO_CIRCUIT(circ), purpose); - /* Reset the start date of this circ, else expire_building - * will see it and think it's been trying to build since it - * began. - * - * Technically, the code should reset this when the - * create cell is finally sent, but we're close enough - * here. */ - tor_gettimeofday(&circ->base_.timestamp_began); - - control_event_circuit_cannibalized(circ, old_purpose, - &old_timestamp_began); - - switch (purpose) { - case CIRCUIT_PURPOSE_C_ESTABLISH_REND: - case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: - /* it's ready right now */ - break; - case CIRCUIT_PURPOSE_C_INTRODUCING: - case CIRCUIT_PURPOSE_S_CONNECT_REND: - case CIRCUIT_PURPOSE_C_GENERAL: - /* need to add a new hop */ - tor_assert(extend_info); - if (circuit_extend_to_new_exit(circ, extend_info) < 0) - return NULL; - break; - default: - log_warn(LD_BUG, - "unexpected purpose %d when cannibalizing a circ.", - purpose); - tor_fragile_assert(); - return NULL; - } - return circ; - } - } - - if (did_circs_fail_last_period && - n_circuit_failures > MAX_CIRCUIT_FAILURES) { - /* too many failed circs in a row. don't try. */ -// log_fn(LOG_INFO,"%d failures so far, not trying.",n_circuit_failures); - return NULL; - } - - /* try a circ. if it fails, circuit_mark_for_close will increment - * n_circuit_failures */ - return circuit_establish_circuit(purpose, extend_info, flags); -} - -/** Record another failure at opening a general circuit. When we have - * too many, we'll stop trying for the remainder of this minute. - */ -static void -circuit_increment_failure_count(void) -{ - ++n_circuit_failures; - log_debug(LD_CIRC,"n_circuit_failures now %d.",n_circuit_failures); -} - -/** Reset the failure count for opening general circuits. This means - * we will try MAX_CIRCUIT_FAILURES times more (if necessary) before - * stopping again. - */ -void -circuit_reset_failure_count(int timeout) -{ - if (timeout && n_circuit_failures > MAX_CIRCUIT_FAILURES) - did_circs_fail_last_period = 1; - else - did_circs_fail_last_period = 0; - n_circuit_failures = 0; -} - -/** Find an open circ that we're happy to use for conn and return 1. If - * there isn't one, and there isn't one on the way, launch one and return - * 0. If it will never work, return -1. - * - * Write the found or in-progress or launched circ into *circp. - */ -static int -circuit_get_open_circ_or_launch(entry_connection_t *conn, - uint8_t desired_circuit_purpose, - origin_circuit_t **circp) -{ - origin_circuit_t *circ; - int check_exit_policy; - int need_uptime, need_internal; - int want_onehop; - const or_options_t *options = get_options(); - - tor_assert(conn); - tor_assert(circp); - tor_assert(ENTRY_TO_CONN(conn)->state == AP_CONN_STATE_CIRCUIT_WAIT); - check_exit_policy = - conn->socks_request->command == SOCKS_COMMAND_CONNECT && - !conn->use_begindir && - !connection_edge_is_rendezvous_stream(ENTRY_TO_EDGE_CONN(conn)); - want_onehop = conn->want_onehop; - - need_uptime = !conn->want_onehop && !conn->use_begindir && - smartlist_contains_int_as_string(options->LongLivedPorts, - conn->socks_request->port); - - if (desired_circuit_purpose != CIRCUIT_PURPOSE_C_GENERAL) - need_internal = 1; - else if (conn->use_begindir || conn->want_onehop) - need_internal = 1; - else - need_internal = 0; - - circ = circuit_get_best(conn, 1, desired_circuit_purpose, - need_uptime, need_internal); - - if (circ) { - *circp = circ; - return 1; /* we're happy */ - } - - if (!want_onehop && !router_have_minimum_dir_info()) { - if (!connection_get_by_type(CONN_TYPE_DIR)) { - int severity = LOG_NOTICE; - /* FFFF if this is a tunneled directory fetch, don't yell - * as loudly. the user doesn't even know it's happening. */ - if (entry_list_is_constrained(options) && - entries_known_but_down(options)) { - log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't used client functionality " - "lately. Optimistically trying known %s again.", - options->UseBridges ? "bridges" : "entrynodes"); - entries_retry_all(options); - } else if (!options->UseBridges || any_bridge_descriptors_known()) { - log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't used client functionality " - "lately. Optimistically trying directory fetches again."); - routerlist_retry_directory_downloads(time(NULL)); - } - } - /* the stream will be dealt with when router_have_minimum_dir_info becomes - * 1, or when all directory attempts fail and directory_all_unreachable() - * kills it. - */ - return 0; - } - - /* Do we need to check exit policy? */ - if (check_exit_policy) { - if (!conn->chosen_exit_name) { - struct in_addr in; - tor_addr_t addr, *addrp=NULL; - if (tor_inet_aton(conn->socks_request->address, &in)) { - tor_addr_from_in(&addr, &in); - addrp = &addr; - } - if (router_exit_policy_all_nodes_reject(addrp, - conn->socks_request->port, - need_uptime)) { - log_notice(LD_APP, - "No Tor server allows exit to %s:%d. Rejecting.", - safe_str_client(conn->socks_request->address), - conn->socks_request->port); - return -1; - } - } else { - /* XXXX024 Duplicates checks in connection_ap_handshake_attach_circuit: - * refactor into a single function? */ - const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); - int opt = conn->chosen_exit_optional; - if (node && !connection_ap_can_use_exit(conn, node)) { - log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, - "Requested exit point '%s' is excluded or " - "would refuse request. %s.", - conn->chosen_exit_name, opt ? "Trying others" : "Closing"); - if (opt) { - conn->chosen_exit_optional = 0; - tor_free(conn->chosen_exit_name); - /* Try again. */ - return circuit_get_open_circ_or_launch(conn, - desired_circuit_purpose, - circp); - } - return -1; - } - } - } - - /* is one already on the way? */ - circ = circuit_get_best(conn, 0, desired_circuit_purpose, - need_uptime, need_internal); - if (circ) - log_debug(LD_CIRC, "one on the way!"); - if (!circ) { - extend_info_t *extend_info=NULL; - uint8_t new_circ_purpose; - const int n_pending = count_pending_general_client_circuits(); - - if (n_pending >= options->MaxClientCircuitsPending) { - static ratelim_t delay_limit = RATELIM_INIT(10*60); - char *m; - if ((m = rate_limit_log(&delay_limit, approx_time()))) { - log_notice(LD_APP, "We'd like to launch a circuit to handle a " - "connection, but we already have %d general-purpose client " - "circuits pending. Waiting until some finish.%s", - n_pending, m); - tor_free(m); - } - return 0; - } - - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { - /* need to pick an intro point */ - rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data; - tor_assert(rend_data); - extend_info = rend_client_get_random_intro(rend_data); - if (!extend_info) { - log_info(LD_REND, - "No intro points for '%s': re-fetching service descriptor.", - safe_str_client(rend_data->onion_address)); - rend_client_refetch_v2_renddesc(rend_data); - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_RENDDESC_WAIT; - return 0; - } - log_info(LD_REND,"Chose %s as intro point for '%s'.", - extend_info_describe(extend_info), - safe_str_client(rend_data->onion_address)); - } - - /* If we have specified a particular exit node for our - * connection, then be sure to open a circuit to that exit node. - */ - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL) { - if (conn->chosen_exit_name) { - const node_t *r; - int opt = conn->chosen_exit_optional; - r = node_get_by_nickname(conn->chosen_exit_name, 1); - if (r && node_has_descriptor(r)) { - /* We might want to connect to an IPv6 bridge for loading - descriptors so we use the preferred address rather than - the primary. */ - extend_info = extend_info_from_node(r, conn->want_onehop ? 1 : 0); - } else { - log_debug(LD_DIR, "considering %d, %s", - want_onehop, conn->chosen_exit_name); - if (want_onehop && conn->chosen_exit_name[0] == '$') { - /* We're asking for a one-hop circuit to a router that - * we don't have a routerinfo about. Make up an extend_info. */ - char digest[DIGEST_LEN]; - char *hexdigest = conn->chosen_exit_name+1; - tor_addr_t addr; - if (strlen(hexdigest) < HEX_DIGEST_LEN || - base16_decode(digest,DIGEST_LEN,hexdigest,HEX_DIGEST_LEN)<0) { - log_info(LD_DIR, "Broken exit digest on tunnel conn. Closing."); - return -1; - } - if (tor_addr_parse(&addr, conn->socks_request->address) < 0) { - log_info(LD_DIR, "Broken address %s on tunnel conn. Closing.", - escaped_safe_str_client(conn->socks_request->address)); - return -1; - } - extend_info = extend_info_new(conn->chosen_exit_name+1, - digest, NULL, NULL, &addr, - conn->socks_request->port); - } else { - /* We will need an onion key for the router, and we - * don't have one. Refuse or relax requirements. */ - log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, - "Requested exit point '%s' is not known. %s.", - conn->chosen_exit_name, opt ? "Trying others" : "Closing"); - if (opt) { - conn->chosen_exit_optional = 0; - tor_free(conn->chosen_exit_name); - /* Try again with no requested exit */ - return circuit_get_open_circ_or_launch(conn, - desired_circuit_purpose, - circp); - } - return -1; - } - } - } - } - - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_REND_JOINED) - new_circ_purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND; - else if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) - new_circ_purpose = CIRCUIT_PURPOSE_C_INTRODUCING; - else - new_circ_purpose = desired_circuit_purpose; - - if (options->Tor2webMode && - (new_circ_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND || - new_circ_purpose == CIRCUIT_PURPOSE_C_INTRODUCING)) { - want_onehop = 1; - } - - { - int flags = CIRCLAUNCH_NEED_CAPACITY; - if (want_onehop) flags |= CIRCLAUNCH_ONEHOP_TUNNEL; - if (need_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; - if (need_internal) flags |= CIRCLAUNCH_IS_INTERNAL; - circ = circuit_launch_by_extend_info(new_circ_purpose, extend_info, - flags); - } - - extend_info_free(extend_info); - - if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL) { - /* We just caused a circuit to get built because of this stream. - * If this stream has caused a _lot_ of circuits to be built, that's - * a bad sign: we should tell the user. */ - if (conn->num_circuits_launched < NUM_CIRCUITS_LAUNCHED_THRESHOLD && - ++conn->num_circuits_launched == NUM_CIRCUITS_LAUNCHED_THRESHOLD) - log_info(LD_CIRC, "The application request to %s:%d has launched " - "%d circuits without finding one it likes.", - escaped_safe_str_client(conn->socks_request->address), - conn->socks_request->port, - conn->num_circuits_launched); - } else { - /* help predict this next time */ - rep_hist_note_used_internal(time(NULL), need_uptime, 1); - if (circ) { - /* write the service_id into circ */ - circ->rend_data = rend_data_dup(ENTRY_TO_EDGE_CONN(conn)->rend_data); - if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && - circ->base_.state == CIRCUIT_STATE_OPEN) - rend_client_rendcirc_has_opened(circ); - } - } - } /* endif (!circ) */ - if (circ) { - /* Mark the circuit with the isolation fields for this connection. - * When the circuit arrives, we'll clear these flags: this is - * just some internal bookkeeping to make sure that we have - * launched enough circuits. - */ - connection_edge_update_circuit_isolation(conn, circ, 0); - } else { - log_info(LD_APP, - "No safe circuit (purpose %d) ready for edge " - "connection; delaying.", - desired_circuit_purpose); - } - *circp = circ; - return 0; -} - -/** Return true iff crypt_path is one of the crypt_paths for - * circ. */ -static int -cpath_is_on_circuit(origin_circuit_t *circ, crypt_path_t *crypt_path) -{ - crypt_path_t *cpath, *cpath_next = NULL; - for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { - cpath_next = cpath->next; - if (crypt_path == cpath) - return 1; - } - return 0; -} - -/** Return true iff client-side optimistic data is supported. */ -static int -optimistic_data_enabled(void) -{ - const or_options_t *options = get_options(); - if (options->OptimisticData < 0) { - /* XXX023 consider having auto default to 1 rather than 0 before - * the 0.2.3 branch goes stable. See bug 3617. -RD */ - const int32_t enabled = - networkstatus_get_param(NULL, "UseOptimisticData", 0, 0, 1); - return (int)enabled; - } - return options->OptimisticData; -} - -/** Attach the AP stream apconn to circ's linked list of - * p_streams. Also set apconn's cpath_layer to cpath, or to the last - * hop in circ's cpath if cpath is NULL. - */ -static void -link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, - crypt_path_t *cpath) -{ - const node_t *exitnode; - - /* add it into the linked list of streams on this circuit */ - log_debug(LD_APP|LD_CIRC, "attaching new conn to circ. n_circ_id %u.", - (unsigned)circ->base_.n_circ_id); - /* reset it, so we can measure circ timeouts */ - ENTRY_TO_CONN(apconn)->timestamp_lastread = time(NULL); - ENTRY_TO_EDGE_CONN(apconn)->next_stream = circ->p_streams; - ENTRY_TO_EDGE_CONN(apconn)->on_circuit = TO_CIRCUIT(circ); - /* assert_connection_ok(conn, time(NULL)); */ - circ->p_streams = ENTRY_TO_EDGE_CONN(apconn); - - if (connection_edge_is_rendezvous_stream(ENTRY_TO_EDGE_CONN(apconn))) { - /* We are attaching a stream to a rendezvous circuit. That means - * that an attempt to connect to a hidden service just - * succeeded. Tell rendclient.c. */ - rend_client_note_connection_attempt_ended( - ENTRY_TO_EDGE_CONN(apconn)->rend_data->onion_address); - } - - if (cpath) { /* we were given one; use it */ - tor_assert(cpath_is_on_circuit(circ, cpath)); - } else { - /* use the last hop in the circuit */ - tor_assert(circ->cpath); - tor_assert(circ->cpath->prev); - tor_assert(circ->cpath->prev->state == CPATH_STATE_OPEN); - cpath = circ->cpath->prev; - } - ENTRY_TO_EDGE_CONN(apconn)->cpath_layer = cpath; - - circ->isolation_any_streams_attached = 1; - connection_edge_update_circuit_isolation(apconn, circ, 0); - - /* See if we can use optimistic data on this circuit */ - if (cpath->extend_info && - (exitnode = node_get_by_id(cpath->extend_info->identity_digest)) && - exitnode->rs) { - /* Okay; we know what exit node this is. */ - if (optimistic_data_enabled() && - circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL && - exitnode->rs->version_supports_optimistic_data) - apconn->may_use_optimistic_data = 1; - else - apconn->may_use_optimistic_data = 0; - log_info(LD_APP, "Looks like completed circuit to %s %s allow " - "optimistic data for connection to %s", - safe_str_client(node_describe(exitnode)), - apconn->may_use_optimistic_data ? "does" : "doesn't", - safe_str_client(apconn->socks_request->address)); - } -} - -/** Return true iff address is matched by one of the entries in - * TrackHostExits. */ -int -hostname_in_track_host_exits(const or_options_t *options, const char *address) -{ - if (!options->TrackHostExits) - return 0; - SMARTLIST_FOREACH_BEGIN(options->TrackHostExits, const char *, cp) { - if (cp[0] == '.') { /* match end */ - if (cp[1] == '\0' || - !strcasecmpend(address, cp) || - !strcasecmp(address, &cp[1])) - return 1; - } else if (strcasecmp(cp, address) == 0) { - return 1; - } - } SMARTLIST_FOREACH_END(cp); - return 0; -} - -/** If an exit wasn't explicitly specified for conn, consider saving - * the exit that we *did* choose for use by future connections to - * conn's destination. - */ -static void -consider_recording_trackhost(const entry_connection_t *conn, - const origin_circuit_t *circ) -{ - const or_options_t *options = get_options(); - char *new_address = NULL; - char fp[HEX_DIGEST_LEN+1]; - - /* Search the addressmap for this conn's destination. */ - /* If he's not in the address map.. */ - if (!options->TrackHostExits || - addressmap_have_mapping(conn->socks_request->address, - options->TrackHostExitsExpire)) - return; /* nothing to track, or already mapped */ - - if (!hostname_in_track_host_exits(options, conn->socks_request->address) || - !circ->build_state->chosen_exit) - return; - - /* write down the fingerprint of the chosen exit, not the nickname, - * because the chosen exit might not be named. */ - base16_encode(fp, sizeof(fp), - circ->build_state->chosen_exit->identity_digest, DIGEST_LEN); - - /* Add this exit/hostname pair to the addressmap. */ - tor_asprintf(&new_address, "%s.%s.exit", - conn->socks_request->address, fp); - - addressmap_register(conn->socks_request->address, new_address, - time(NULL) + options->TrackHostExitsExpire, - ADDRMAPSRC_TRACKEXIT, 0, 0); -} - -/** Attempt to attach the connection conn to circ, and send a - * begin or resolve cell as appropriate. Return values are as for - * connection_ap_handshake_attach_circuit. The stream will exit from the hop - * indicated by cpath, or from the last hop in circ's cpath if - * cpath is NULL. */ -int -connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) -{ - connection_t *base_conn = ENTRY_TO_CONN(conn); - tor_assert(conn); - tor_assert(base_conn->state == AP_CONN_STATE_CIRCUIT_WAIT || - base_conn->state == AP_CONN_STATE_CONTROLLER_WAIT); - tor_assert(conn->socks_request); - tor_assert(circ); - tor_assert(circ->base_.state == CIRCUIT_STATE_OPEN); - - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - - if (!circ->base_.timestamp_dirty) - circ->base_.timestamp_dirty = time(NULL); - - pathbias_count_use_attempt(circ); - - link_apconn_to_circ(conn, circ, cpath); - tor_assert(conn->socks_request); - if (conn->socks_request->command == SOCKS_COMMAND_CONNECT) { - if (!conn->use_begindir) - consider_recording_trackhost(conn, circ); - if (connection_ap_handshake_send_begin(conn) < 0) - return -1; - } else { - if (connection_ap_handshake_send_resolve(conn) < 0) - return -1; - } - - return 1; -} - -/** Try to find a safe live circuit for CONN_TYPE_AP connection conn. If - * we don't find one: if conn cannot be handled by any known nodes, - * warn and return -1 (conn needs to die, and is maybe already marked); - * else launch new circuit (if necessary) and return 0. - * Otherwise, associate conn with a safe live circuit, do the - * right next step, and return 1. - */ -/* XXXX this function should mark for close whenever it returns -1; - * its callers shouldn't have to worry about that. */ -int -connection_ap_handshake_attach_circuit(entry_connection_t *conn) -{ - connection_t *base_conn = ENTRY_TO_CONN(conn); - int retval; - int conn_age; - int want_onehop; - - tor_assert(conn); - tor_assert(base_conn->state == AP_CONN_STATE_CIRCUIT_WAIT); - tor_assert(conn->socks_request); - want_onehop = conn->want_onehop; - - conn_age = (int)(time(NULL) - base_conn->timestamp_created); - - if (conn_age >= get_options()->SocksTimeout) { - int severity = (tor_addr_is_null(&base_conn->addr) && !base_conn->port) ? - LOG_INFO : LOG_NOTICE; - log_fn(severity, LD_APP, - "Tried for %d seconds to get a connection to %s:%d. Giving up.", - conn_age, safe_str_client(conn->socks_request->address), - conn->socks_request->port); - return -1; - } - - if (!connection_edge_is_rendezvous_stream(ENTRY_TO_EDGE_CONN(conn))) { - /* we're a general conn */ - origin_circuit_t *circ=NULL; - - if (conn->chosen_exit_name) { - const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 1); - int opt = conn->chosen_exit_optional; - if (!node && !want_onehop) { - /* We ran into this warning when trying to extend a circuit to a - * hidden service directory for which we didn't have a router - * descriptor. See flyspray task 767 for more details. We should - * keep this in mind when deciding to use BEGIN_DIR cells for other - * directory requests as well. -KL*/ - log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, - "Requested exit point '%s' is not known. %s.", - conn->chosen_exit_name, opt ? "Trying others" : "Closing"); - if (opt) { - conn->chosen_exit_optional = 0; - tor_free(conn->chosen_exit_name); - return 0; - } - return -1; - } - if (node && !connection_ap_can_use_exit(conn, node)) { - log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP, - "Requested exit point '%s' is excluded or " - "would refuse request. %s.", - conn->chosen_exit_name, opt ? "Trying others" : "Closing"); - if (opt) { - conn->chosen_exit_optional = 0; - tor_free(conn->chosen_exit_name); - return 0; - } - return -1; - } - } - - /* find the circuit that we should use, if there is one. */ - retval = circuit_get_open_circ_or_launch( - conn, CIRCUIT_PURPOSE_C_GENERAL, &circ); - if (retval < 1) // XXX023 if we totally fail, this still returns 0 -RD - return retval; - - log_debug(LD_APP|LD_CIRC, - "Attaching apconn to circ %u (stream %d sec old).", - (unsigned)circ->base_.n_circ_id, conn_age); - /* print the circ's path, so people can figure out which circs are - * sucking. */ - circuit_log_path(LOG_INFO,LD_APP|LD_CIRC,circ); - - /* We have found a suitable circuit for our conn. Hurray. */ - return connection_ap_handshake_attach_chosen_circuit(conn, circ, NULL); - - } else { /* we're a rendezvous conn */ - origin_circuit_t *rendcirc=NULL, *introcirc=NULL; - - tor_assert(!ENTRY_TO_EDGE_CONN(conn)->cpath_layer); - - /* start by finding a rendezvous circuit for us */ - - retval = circuit_get_open_circ_or_launch( - conn, CIRCUIT_PURPOSE_C_REND_JOINED, &rendcirc); - if (retval < 0) return -1; /* failed */ - - if (retval > 0) { - tor_assert(rendcirc); - /* one is already established, attach */ - log_info(LD_REND, - "rend joined circ %d already here. attaching. " - "(stream %d sec old)", - (unsigned)rendcirc->base_.n_circ_id, conn_age); - /* Mark rendezvous circuits as 'newly dirty' every time you use - * them, since the process of rebuilding a rendezvous circ is so - * expensive. There is a tradeoff between linkability and - * feasibility, at this point. - */ - rendcirc->base_.timestamp_dirty = time(NULL); - - /* We've also attempted to use them. If they fail, we need to - * probe them for path bias */ - pathbias_count_use_attempt(rendcirc); - - link_apconn_to_circ(conn, rendcirc, NULL); - if (connection_ap_handshake_send_begin(conn) < 0) - return 0; /* already marked, let them fade away */ - return 1; - } - - if (rendcirc && (rendcirc->base_.purpose == - CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED)) { - log_info(LD_REND, - "pending-join circ %u already here, with intro ack. " - "Stalling. (stream %d sec old)", - (unsigned)rendcirc->base_.n_circ_id, conn_age); - return 0; - } - - /* it's on its way. find an intro circ. */ - retval = circuit_get_open_circ_or_launch( - conn, CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, &introcirc); - if (retval < 0) return -1; /* failed */ - - if (retval > 0) { - /* one has already sent the intro. keep waiting. */ - tor_assert(introcirc); - log_info(LD_REND, "Intro circ %u present and awaiting ack (rend %u). " - "Stalling. (stream %d sec old)", - (unsigned)introcirc->base_.n_circ_id, - rendcirc ? (unsigned)rendcirc->base_.n_circ_id : 0, - conn_age); - return 0; - } - - /* now rendcirc and introcirc are each either undefined or not finished */ - - if (rendcirc && introcirc && - rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY) { - log_info(LD_REND, - "ready rend circ %u already here (no intro-ack yet on " - "intro %u). (stream %d sec old)", - (unsigned)rendcirc->base_.n_circ_id, - (unsigned)introcirc->base_.n_circ_id, conn_age); - - tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING); - if (introcirc->base_.state == CIRCUIT_STATE_OPEN) { - log_info(LD_REND,"found open intro circ %u (rend %u); sending " - "introduction. (stream %d sec old)", - (unsigned)introcirc->base_.n_circ_id, - (unsigned)rendcirc->base_.n_circ_id, - conn_age); - switch (rend_client_send_introduction(introcirc, rendcirc)) { - case 0: /* success */ - rendcirc->base_.timestamp_dirty = time(NULL); - introcirc->base_.timestamp_dirty = time(NULL); - - pathbias_count_use_attempt(introcirc); - pathbias_count_use_attempt(rendcirc); - - assert_circuit_ok(TO_CIRCUIT(rendcirc)); - assert_circuit_ok(TO_CIRCUIT(introcirc)); - return 0; - case -1: /* transient error */ - return 0; - case -2: /* permanent error */ - return -1; - default: /* oops */ - tor_fragile_assert(); - return -1; - } - } - } - - log_info(LD_REND, "Intro (%u) and rend (%u) circs are not both ready. " - "Stalling conn. (%d sec old)", - introcirc ? (unsigned)introcirc->base_.n_circ_id : 0, - rendcirc ? (unsigned)rendcirc->base_.n_circ_id : 0, conn_age); - return 0; - } -} - -/** Change circ's purpose to new_purpose. */ -void -circuit_change_purpose(circuit_t *circ, uint8_t new_purpose) -{ - uint8_t old_purpose; - /* Don't allow an OR circ to become an origin circ or vice versa. */ - tor_assert(!!(CIRCUIT_IS_ORIGIN(circ)) == - !!(CIRCUIT_PURPOSE_IS_ORIGIN(new_purpose))); - - if (circ->purpose == new_purpose) return; - - if (CIRCUIT_IS_ORIGIN(circ)) { - char old_purpose_desc[80] = ""; - - strncpy(old_purpose_desc, circuit_purpose_to_string(circ->purpose), 80-1); - old_purpose_desc[80-1] = '\0'; - - log_debug(LD_CIRC, - "changing purpose of origin circ %d " - "from \"%s\" (%d) to \"%s\" (%d)", - TO_ORIGIN_CIRCUIT(circ)->global_identifier, - old_purpose_desc, - circ->purpose, - circuit_purpose_to_string(new_purpose), - new_purpose); - } - - old_purpose = circ->purpose; - circ->purpose = new_purpose; - - if (CIRCUIT_IS_ORIGIN(circ)) { - control_event_circuit_purpose_changed(TO_ORIGIN_CIRCUIT(circ), - old_purpose); - } -} - -/** Mark circ so that no more connections can be attached to it. */ -void -mark_circuit_unusable_for_new_conns(origin_circuit_t *circ) -{ - const or_options_t *options = get_options(); - tor_assert(circ); - - /* XXXX025 This is a kludge; we're only keeping it around in case there's - * something that doesn't check unusable_for_new_conns, and to avoid - * deeper refactoring of our expiration logic. */ - if (! circ->base_.timestamp_dirty) - circ->base_.timestamp_dirty = approx_time(); - if (options->MaxCircuitDirtiness >= circ->base_.timestamp_dirty) - circ->base_.timestamp_dirty = 1; /* prevent underflow */ - else - circ->base_.timestamp_dirty -= options->MaxCircuitDirtiness; - - circ->unusable_for_new_conns = 1; -} - diff --git a/src/tor/circuituse.h b/src/tor/circuituse.h deleted file mode 100644 index 11e5a6416..000000000 --- a/src/tor/circuituse.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file circuituse.h - * \brief Header file for circuituse.c. - **/ - -#ifndef TOR_CIRCUITUSE_H -#define TOR_CIRCUITUSE_H - -void circuit_expire_building(void); -void circuit_remove_handled_ports(smartlist_t *needed_ports); -int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port, - int min); -#if 0 -int circuit_conforms_to_options(const origin_circuit_t *circ, - const or_options_t *options); -#endif -void circuit_build_needed_circs(time_t now); -void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); - -void circuit_expire_old_circuits_serverside(time_t now); - -void reset_bandwidth_test(void); -int circuit_enough_testing_circs(void); - -void circuit_has_opened(origin_circuit_t *circ); -void circuit_try_attaching_streams(origin_circuit_t *circ); -void circuit_build_failed(origin_circuit_t *circ); - -/** Flag to set when a circuit should have only a single hop. */ -#define CIRCLAUNCH_ONEHOP_TUNNEL (1<<0) -/** Flag to set when a circuit needs to be built of high-uptime nodes */ -#define CIRCLAUNCH_NEED_UPTIME (1<<1) -/** Flag to set when a circuit needs to be built of high-capacity nodes */ -#define CIRCLAUNCH_NEED_CAPACITY (1<<2) -/** Flag to set when the last hop of a circuit doesn't need to be an - * exit node. */ -#define CIRCLAUNCH_IS_INTERNAL (1<<3) -origin_circuit_t *circuit_launch_by_extend_info(uint8_t purpose, - extend_info_t *info, - int flags); -origin_circuit_t *circuit_launch(uint8_t purpose, int flags); -void circuit_reset_failure_count(int timeout); -int connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath); -int connection_ap_handshake_attach_circuit(entry_connection_t *conn); - -void circuit_change_purpose(circuit_t *circ, uint8_t new_purpose); - -int hostname_in_track_host_exits(const or_options_t *options, - const char *address); -void mark_circuit_unusable_for_new_conns(origin_circuit_t *circ); - -#endif - diff --git a/src/tor/command.c b/src/tor/command.c deleted file mode 100644 index 9b3ff16f2..000000000 --- a/src/tor/command.c +++ /dev/null @@ -1,589 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file command.c - * \brief Functions for processing incoming cells. - **/ - -/* In-points to command.c: - * - * - command_process_cell(), called from - * incoming cell handlers of channel_t instances; - * callbacks registered in command_setup_channel(), - * called when channels are created in circuitbuild.c - */ -#include "or.h" -#include "channel.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "command.h" -#include "connection.h" -#include "connection_or.h" -#include "config.h" -#include "control.h" -#include "cpuworker.h" -#include "hibernate.h" -#include "nodelist.h" -#include "onion.h" -#include "rephist.h" -#include "relay.h" -#include "router.h" -#include "routerlist.h" - -/** How many CELL_CREATE cells have we received, ever? */ -uint64_t stats_n_create_cells_processed = 0; -/** How many CELL_CREATED cells have we received, ever? */ -uint64_t stats_n_created_cells_processed = 0; -/** How many CELL_RELAY cells have we received, ever? */ -uint64_t stats_n_relay_cells_processed = 0; -/** How many CELL_DESTROY cells have we received, ever? */ -uint64_t stats_n_destroy_cells_processed = 0; - -/* Handle an incoming channel */ -static void command_handle_incoming_channel(channel_listener_t *listener, - channel_t *chan); - -/* These are the main functions for processing cells */ -static void command_process_create_cell(cell_t *cell, channel_t *chan); -static void command_process_created_cell(cell_t *cell, channel_t *chan); -static void command_process_relay_cell(cell_t *cell, channel_t *chan); -static void command_process_destroy_cell(cell_t *cell, channel_t *chan); - -/** Convert the cell command into a lower-case, human-readable - * string. */ -const char * -cell_command_to_string(uint8_t command) -{ - switch (command) { - case CELL_PADDING: return "padding"; - case CELL_CREATE: return "create"; - case CELL_CREATED: return "created"; - case CELL_RELAY: return "relay"; - case CELL_DESTROY: return "destroy"; - case CELL_CREATE_FAST: return "create_fast"; - case CELL_CREATED_FAST: return "created_fast"; - case CELL_VERSIONS: return "versions"; - case CELL_NETINFO: return "netinfo"; - case CELL_RELAY_EARLY: return "relay_early"; - case CELL_CREATE2: return "create2"; - case CELL_CREATED2: return "created2"; - case CELL_VPADDING: return "vpadding"; - case CELL_CERTS: return "certs"; - case CELL_AUTH_CHALLENGE: return "auth_challenge"; - case CELL_AUTHENTICATE: return "authenticate"; - case CELL_AUTHORIZE: return "authorize"; - default: return "unrecognized"; - } -} - -#ifdef KEEP_TIMING_STATS -/** This is a wrapper function around the actual function that processes the - * cell that just arrived on conn. Increment *time - * by the number of microseconds used by the call to *func(cell, conn). - */ -static void -command_time_process_cell(cell_t *cell, channel_t *chan, int *time, - void (*func)(cell_t *, channel_t *)) -{ - struct timeval start, end; - long time_passed; - - tor_gettimeofday(&start); - - (*func)(cell, chan); - - tor_gettimeofday(&end); - time_passed = tv_udiff(&start, &end) ; - - if (time_passed > 10000) { /* more than 10ms */ - log_debug(LD_OR,"That call just took %ld ms.",time_passed/1000); - } - if (time_passed < 0) { - log_info(LD_GENERAL,"That call took us back in time!"); - time_passed = 0; - } - *time += time_passed; -} -#endif - -/** Process a cell that was just received on chan. Keep internal - * statistics about how many of each cell we've processed so far - * this second, and the total number of microseconds it took to - * process each type of cell. - */ -void -command_process_cell(channel_t *chan, cell_t *cell) -{ -#ifdef KEEP_TIMING_STATS - /* how many of each cell have we seen so far this second? needs better - * name. */ - static int num_create=0, num_created=0, num_relay=0, num_destroy=0; - /* how long has it taken to process each type of cell? */ - static int create_time=0, created_time=0, relay_time=0, destroy_time=0; - static time_t current_second = 0; /* from previous calls to time */ - - time_t now = time(NULL); - - if (now > current_second) { /* the second has rolled over */ - /* print stats */ - log_info(LD_OR, - "At end of second: %d creates (%d ms), %d createds (%d ms), " - "%d relays (%d ms), %d destroys (%d ms)", - num_create, create_time/1000, - num_created, created_time/1000, - num_relay, relay_time/1000, - num_destroy, destroy_time/1000); - - /* zero out stats */ - num_create = num_created = num_relay = num_destroy = 0; - create_time = created_time = relay_time = destroy_time = 0; - - /* remember which second it is, for next time */ - current_second = now; - } -#endif - -#ifdef KEEP_TIMING_STATS -#define PROCESS_CELL(tp, cl, cn) STMT_BEGIN { \ - ++num ## tp; \ - command_time_process_cell(cl, cn, & tp ## time , \ - command_process_ ## tp ## _cell); \ - } STMT_END -#else -#define PROCESS_CELL(tp, cl, cn) command_process_ ## tp ## _cell(cl, cn) -#endif - - switch (cell->command) { - case CELL_CREATE: - case CELL_CREATE_FAST: - case CELL_CREATE2: - ++stats_n_create_cells_processed; - PROCESS_CELL(create, cell, chan); - break; - case CELL_CREATED: - case CELL_CREATED_FAST: - case CELL_CREATED2: - ++stats_n_created_cells_processed; - PROCESS_CELL(created, cell, chan); - break; - case CELL_RELAY: - case CELL_RELAY_EARLY: - ++stats_n_relay_cells_processed; - PROCESS_CELL(relay, cell, chan); - break; - case CELL_DESTROY: - ++stats_n_destroy_cells_processed; - PROCESS_CELL(destroy, cell, chan); - break; - default: - log_fn(LOG_INFO, LD_PROTOCOL, - "Cell of unknown or unexpected type (%d) received. " - "Dropping.", - cell->command); - break; - } -} - -/** Process an incoming var_cell from a channel; in the current protocol all - * the var_cells are handshake-related and handled below the channel layer, - * so this just logs a warning and drops the cell. - */ - -void -command_process_var_cell(channel_t *chan, var_cell_t *var_cell) -{ - tor_assert(chan); - tor_assert(var_cell); - - log_info(LD_PROTOCOL, - "Received unexpected var_cell above the channel layer of type %d" - "; dropping it.", - var_cell->command); -} - -/** Process a 'create' cell that just arrived from chan. Make a - * new circuit with the p_circ_id specified in cell. Put the circuit in state - * onionskin_pending, and pass the onionskin to the cpuworker. Circ will get - * picked up again when the cpuworker finishes decrypting it. - */ -static void -command_process_create_cell(cell_t *cell, channel_t *chan) -{ - or_circuit_t *circ; - const or_options_t *options = get_options(); - int id_is_high; - create_cell_t *create_cell; - - tor_assert(cell); - tor_assert(chan); - - log_debug(LD_OR, - "Got a CREATE cell for circ_id %u on channel " U64_FORMAT - " (%p)", - (unsigned)cell->circ_id, - U64_PRINTF_ARG(chan->global_identifier), chan); - - if (we_are_hibernating()) { - log_info(LD_OR, - "Received create cell but we're shutting down. Sending back " - "destroy."); - channel_send_destroy(cell->circ_id, chan, - END_CIRC_REASON_HIBERNATING); - return; - } - - if (!server_mode(options) || - (!public_server_mode(options) && channel_is_outgoing(chan))) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received create cell (type %d) from %s, but we're connected " - "to it as a client. " - "Sending back a destroy.", - (int)cell->command, channel_get_canonical_remote_descr(chan)); - channel_send_destroy(cell->circ_id, chan, - END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (cell->circ_id == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received a create cell (type %d) from %s with zero circID; " - " ignoring.", (int)cell->command, - channel_get_actual_remote_descr(chan)); - return; - } - - /* If the high bit of the circuit ID is not as expected, close the - * circ. */ - if (chan->wide_circ_ids) - id_is_high = cell->circ_id & (1u<<31); - else - id_is_high = cell->circ_id & (1u<<15); - if ((id_is_high && - chan->circ_id_type == CIRC_ID_TYPE_HIGHER) || - (!id_is_high && - chan->circ_id_type == CIRC_ID_TYPE_LOWER)) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received create cell with unexpected circ_id %u. Closing.", - (unsigned)cell->circ_id); - channel_send_destroy(cell->circ_id, chan, - END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (circuit_id_in_use_on_channel(cell->circ_id, chan)) { - const node_t *node = node_get_by_id(chan->identity_digest); - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Received CREATE cell (circID %u) for known circ. " - "Dropping (age %d).", - (unsigned)cell->circ_id, - (int)(time(NULL) - channel_when_created(chan))); - if (node) { - char *p = esc_for_log(node_get_platform(node)); - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Details: router %s, platform %s.", - node_describe(node), p); - tor_free(p); - } - return; - } - - circ = or_circuit_new(cell->circ_id, chan); - circ->base_.purpose = CIRCUIT_PURPOSE_OR; - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_ONIONSKIN_PENDING); - create_cell = tor_malloc_zero(sizeof(create_cell_t)); - if (create_cell_parse(create_cell, cell) < 0) { - tor_free(create_cell); - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Bogus/unrecognized create cell; closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (create_cell->handshake_type != ONION_HANDSHAKE_TYPE_FAST) { - /* hand it off to the cpuworkers, and then return. */ - if (connection_or_digest_is_known_relay(chan->identity_digest)) - rep_hist_note_circuit_handshake_requested(create_cell->handshake_type); - if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) { - log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); - return; - } - log_debug(LD_OR,"success: handed off onionskin."); - } else { - /* This is a CREATE_FAST cell; we can handle it immediately without using - * a CPU worker. */ - uint8_t keys[CPATH_KEY_MATERIAL_LEN]; - uint8_t rend_circ_nonce[DIGEST_LEN]; - int len; - created_cell_t created_cell; - - /* Make sure we never try to use the OR connection on which we - * received this cell to satisfy an EXTEND request, */ - channel_mark_client(chan); - - memset(&created_cell, 0, sizeof(created_cell)); - len = onion_skin_server_handshake(ONION_HANDSHAKE_TYPE_FAST, - create_cell->onionskin, - create_cell->handshake_len, - NULL, - created_cell.reply, - keys, CPATH_KEY_MATERIAL_LEN, - rend_circ_nonce); - tor_free(create_cell); - if (len < 0) { - log_warn(LD_OR,"Failed to generate key material. Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - tor_free(create_cell); - return; - } - created_cell.cell_type = CELL_CREATED_FAST; - created_cell.handshake_len = len; - - if (onionskin_answer(circ, &created_cell, - (const char *)keys, rend_circ_nonce)<0) { - log_warn(LD_OR,"Failed to reply to CREATE_FAST cell. Closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); - return; - } - memwipe(keys, 0, sizeof(keys)); - } -} - -/** Process a 'created' cell that just arrived from chan. - * Find the circuit - * that it's intended for. If we're not the origin of the circuit, package - * the 'created' cell in an 'extended' relay cell and pass it back. If we - * are the origin of the circuit, send it to circuit_finish_handshake() to - * finish processing keys, and then call circuit_send_next_onion_skin() to - * extend to the next hop in the circuit if necessary. - */ -static void -command_process_created_cell(cell_t *cell, channel_t *chan) -{ - circuit_t *circ; - extended_cell_t extended_cell; - - circ = circuit_get_by_circid_channel(cell->circ_id, chan); - - if (!circ) { - log_info(LD_OR, - "(circID %u) unknown circ (probably got a destroy earlier). " - "Dropping.", (unsigned)cell->circ_id); - return; - } - - if (circ->n_circ_id != cell->circ_id) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, - "got created cell from Tor client? Closing."); - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (created_cell_parse(&extended_cell.created_cell, cell) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, "Unparseable created cell."); - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (CIRCUIT_IS_ORIGIN(circ)) { /* we're the OP. Handshake this. */ - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - int err_reason = 0; - log_debug(LD_OR,"at OP. Finishing handshake."); - if ((err_reason = circuit_finish_handshake(origin_circ, - &extended_cell.created_cell)) < 0) { - log_warn(LD_OR,"circuit_finish_handshake failed."); - circuit_mark_for_close(circ, -err_reason); - return; - } - log_debug(LD_OR,"Moving to next skin."); - if ((err_reason = circuit_send_next_onion_skin(origin_circ)) < 0) { - log_info(LD_OR,"circuit_send_next_onion_skin failed."); - /* XXX push this circuit_close lower */ - circuit_mark_for_close(circ, -err_reason); - return; - } - } else { /* pack it into an extended relay cell, and send it. */ - uint8_t command=0; - uint16_t len=0; - uint8_t payload[RELAY_PAYLOAD_SIZE]; - log_debug(LD_OR, - "Converting created cell to extended relay cell, sending."); - memset(payload, 0, sizeof(payload)); - if (extended_cell.created_cell.cell_type == CELL_CREATED2) - extended_cell.cell_type = RELAY_COMMAND_EXTENDED2; - else - extended_cell.cell_type = RELAY_COMMAND_EXTENDED; - if (extended_cell_format(&command, &len, payload, &extended_cell) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, "Can't format extended cell."); - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; - } - - relay_send_command_from_edge(0, circ, command, - (const char*)payload, len, NULL); - } -} - -/** Process a 'relay' or 'relay_early' cell that just arrived from - * conn. Make sure it came in with a recognized circ_id. Pass it on to - * circuit_receive_relay_cell() for actual processing. - */ -static void -command_process_relay_cell(cell_t *cell, channel_t *chan) -{ - circuit_t *circ; - int reason, direction; - - circ = circuit_get_by_circid_channel(cell->circ_id, chan); - - if (!circ) { - log_debug(LD_OR, - "unknown circuit %u on connection from %s. Dropping.", - (unsigned)cell->circ_id, - channel_get_canonical_remote_descr(chan)); - return; - } - - if (circ->state == CIRCUIT_STATE_ONIONSKIN_PENDING) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL,"circuit in create_wait. Closing."); - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; - } - - if (CIRCUIT_IS_ORIGIN(circ)) { - /* if we're a relay and treating connections with recent local - * traffic better, then this is one of them. */ - channel_timestamp_client(chan); - } - - if (!CIRCUIT_IS_ORIGIN(circ) && - cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) - direction = CELL_DIRECTION_OUT; - else - direction = CELL_DIRECTION_IN; - - /* If we have a relay_early cell, make sure that it's outbound, and we've - * gotten no more than MAX_RELAY_EARLY_CELLS_PER_CIRCUIT of them. */ - if (cell->command == CELL_RELAY_EARLY) { - if (direction == CELL_DIRECTION_IN) { - /* Allow an unlimited number of inbound relay_early cells, - * for hidden service compatibility. There isn't any way to make - * a long circuit through inbound relay_early cells anyway. See - * bug 1038. -RD */ - } else { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - if (or_circ->remaining_relay_early_cells == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_OR, - "Received too many RELAY_EARLY cells on circ %u from %s." - " Closing circuit.", - (unsigned)cell->circ_id, - safe_str(channel_get_canonical_remote_descr(chan))); - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - return; - } - --or_circ->remaining_relay_early_cells; - } - } - - if ((reason = circuit_receive_relay_cell(cell, circ, direction)) < 0) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL,"circuit_receive_relay_cell " - "(%s) failed. Closing.", - direction==CELL_DIRECTION_OUT?"forward":"backward"); - circuit_mark_for_close(circ, -reason); - } -} - -/** Process a 'destroy' cell that just arrived from - * chan. Find the circ that it refers to (if any). - * - * If the circ is in state - * onionskin_pending, then call onion_pending_remove() to remove it - * from the pending onion list (note that if it's already being - * processed by the cpuworker, it won't be in the list anymore; but - * when the cpuworker returns it, the circuit will be gone, and the - * cpuworker response will be dropped). - * - * Then mark the circuit for close (which marks all edges for close, - * and passes the destroy cell onward if necessary). - */ -static void -command_process_destroy_cell(cell_t *cell, channel_t *chan) -{ - circuit_t *circ; - int reason; - - circ = circuit_get_by_circid_channel(cell->circ_id, chan); - if (!circ) { - log_info(LD_OR,"unknown circuit %u on connection from %s. Dropping.", - (unsigned)cell->circ_id, - channel_get_canonical_remote_descr(chan)); - return; - } - log_debug(LD_OR,"Received for circID %u.",(unsigned)cell->circ_id); - - reason = (uint8_t)cell->payload[0]; - circ->received_destroy = 1; - - if (!CIRCUIT_IS_ORIGIN(circ) && - cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) { - /* the destroy came from behind */ - circuit_set_p_circid_chan(TO_OR_CIRCUIT(circ), 0, NULL); - circuit_mark_for_close(circ, reason|END_CIRC_REASON_FLAG_REMOTE); - } else { /* the destroy came from ahead */ - circuit_set_n_circid_chan(circ, 0, NULL); - if (CIRCUIT_IS_ORIGIN(circ)) { - circuit_mark_for_close(circ, reason|END_CIRC_REASON_FLAG_REMOTE); - } else { - char payload[1]; - log_debug(LD_OR, "Delivering 'truncated' back."); - payload[0] = (char)reason; - relay_send_command_from_edge(0, circ, RELAY_COMMAND_TRUNCATED, - payload, sizeof(payload), NULL); - } - } -} - -/** Callback to handle a new channel; call command_setup_channel() to give - * it the right cell handlers. - */ - -static void -command_handle_incoming_channel(channel_listener_t *listener, channel_t *chan) -{ - tor_assert(listener); - tor_assert(chan); - - command_setup_channel(chan); -} - -/** Given a channel, install the right handlers to process incoming - * cells on it. - */ - -void -command_setup_channel(channel_t *chan) -{ - tor_assert(chan); - - channel_set_cell_handlers(chan, - command_process_cell, - command_process_var_cell); -} - -/** Given a listener, install the right handler to process incoming - * channels on it. - */ - -void -command_setup_listener(channel_listener_t *listener) -{ - tor_assert(listener); - tor_assert(listener->state == CHANNEL_LISTENER_STATE_LISTENING); - - channel_listener_set_listener_fn(listener, command_handle_incoming_channel); -} - diff --git a/src/tor/command.h b/src/tor/command.h deleted file mode 100644 index adea6adea..000000000 --- a/src/tor/command.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file command.h - * \brief Header file for command.c. - **/ - -#ifndef TOR_COMMAND_H -#define TOR_COMMAND_H - -#include "channel.h" - -void command_process_cell(channel_t *chan, cell_t *cell); -void command_process_var_cell(channel_t *chan, var_cell_t *cell); -void command_setup_channel(channel_t *chan); -void command_setup_listener(channel_listener_t *chan_l); - -const char *cell_command_to_string(uint8_t command); - -extern uint64_t stats_n_padding_cells_processed; -extern uint64_t stats_n_create_cells_processed; -extern uint64_t stats_n_created_cells_processed; -extern uint64_t stats_n_relay_cells_processed; -extern uint64_t stats_n_destroy_cells_processed; - -#endif - diff --git a/src/tor/common_sha1.i b/src/tor/common_sha1.i deleted file mode 100644 index 80ea224a2..000000000 --- a/src/tor/common_sha1.i +++ /dev/null @@ -1,26 +0,0 @@ -"10e0ec8ee3318e6a5ebbedc35d45ad4ec2fe5bb2 src/common/aes.c\n" -"7fdacbf7fc104d4e118ce06cf823b2f3cb145291 src/common/crypto.c\n" -"401d6c1243b8d99ad8f64dba232e234e60a59eb7 src/common/crypto_format.c\n" -"64a20b8425300b0bf2373a4fe4eb74b47c4baf50 src/common/torgzip.c\n" -"f0e8fd88f7198ad4adbd5c28e4af909b2d553b5a src/common/tortls.c\n" -"05dc726d9d47888cc75a1c3bd31c8214dc2cb581 src/common/crypto_curve25519.c\n" -"d233965a57506745525c7a78ff2911d59f5e3743 src/common/address.h\n" -"ac6a50ceb318ed6907b5804034b98172ffc5ff83 src/common/backtrace.h\n" -"947ef902f15f556f176b1115f09d9966e377347d src/common/aes.h\n" -"6fb51902eea04b5c33a99a754845958fec43d912 src/common/ciphers.inc\n" -"4618a9860688c2cb12d37d8172317324c10f0a92 src/common/tor_compat.h\n" -"e427c754391f1282a98cbbb387bae2ae403cbde7 src/common/compat_libevent.h\n" -"faaa0bcfcc0cbc61f6d092b9b36e56cb89b090b7 src/common/container.h\n" -"7196fde86ec70bd579e8fcd546817d285d936b18 src/common/crypto.h\n" -"1260154e3b65f2586a54986deffec6963a4c7204 src/common/crypto_curve25519.h\n" -"9ed1bb165e8d0532cae5bfd17e27d037d2a05bf4 src/common/di_ops.h\n" -"697be45dc2e1ae6537b34dc72abf6394952a1b87 src/common/memarea.h\n" -"0b594bada47b6e23358fa924cffbf24e01180d60 src/common/mempool.h\n" -"2cd7af59a82d4e1ca2873d2801c44176605a545a src/common/procmon.h\n" -"ed8b5d4225ceaf11e29fe635a091e2b2f3fe3ae8 src/common/sandbox.h\n" -"ddfdca2f5d52acc27214a3c91c0ca73c81b526eb src/common/testsupport.h\n" -"13108dc9184a7ece65685e0724e7e8770acd576f src/common/torgzip.h\n" -"8d71f0488728c324a5aabfd92d209350973b490a src/common/torint.h\n" -"b86f76bfdfdc3bd841233c662761e857cb830c88 src/common/torlog.h\n" -"27209a8a0e9b8c61bbbb2d50241a2a4b4595ce19 src/common/tortls.h\n" -"e5cb074466d9f59f1988e8964fed1476c238ff14 src/common/tor_util.h\n" diff --git a/src/tor/compat.c b/src/tor/compat.c deleted file mode 100644 index 541f8d2a9..000000000 --- a/src/tor/compat.c +++ /dev/null @@ -1,3254 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat.c - * \brief Wrappers to make calls more portable. This code defines - * functions such as tor_malloc, tor_snprintf, get/set various data types, - * renaming, setting socket options, switching user IDs. It is basically - * where the non-portable items are conditionally included depending on - * the platform. - **/ - -/* This is required on rh7 to make strptime not complain. - * We also need it to make memmem get defined (where available) - */ -/* XXXX024 We should just use AC_USE_SYSTEM_EXTENSIONS in our autoconf, - * and get this (and other important stuff!) automatically. Once we do that, - * make sure to also change the extern char **environ detection in - * configure.ac, because whether that is declared or not depends on whether - * we have _GNU_SOURCE defined! Maybe that means that once we take this out, - * we can also take out the configure check. */ -#define _GNU_SOURCE - -#define COMPAT_PRIVATE -#include "tor_compat.h" - -#ifdef _WIN32 -#include -#include -#include -#endif - -#ifdef HAVE_UNAME -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_FCNTL_H -#include -#endif -#ifdef HAVE_PWD_H -#include -#endif -#ifdef HAVE_GRP_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_ERRNO_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_CRT_EXTERNS_H -#include -#endif - -#ifndef HAVE_GETTIMEOFDAY -#ifdef HAVE_FTIME -#include -#endif -#endif - -/* Includes for the process attaching prevention */ -#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) -#include -#elif defined(__APPLE__) -#include -#include -#endif - -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include /* FreeBSD needs this to know what version it is */ -#endif -#include -#include -#include -#ifdef HAVE_SIGNAL_H -#include -#endif -#ifdef HAVE_UTIME_H -#include -#endif -#ifdef HAVE_SYS_UTIME_H -#include -#endif -#ifdef HAVE_SYS_MMAN_H -#include -#endif -#ifdef HAVE_SYS_SYSLIMITS_H -#include -#endif -#ifdef HAVE_SYS_FILE_H -#include -#endif -#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__) -/* Only use the linux prctl; the IRIX prctl is totally different */ -#include -#endif - -#include "torlog.h" -#include "tor_util.h" -#include "container.h" -#include "address.h" -#include "sandbox.h" - -/* Inline the strl functions if the platform doesn't have them. */ -#ifndef HAVE_STRLCPY -#include "strlcpy.c" -#endif -#ifndef HAVE_STRLCAT -#include "strlcat.c" -#endif - -/** As open(path, flags, mode), but return an fd with the close-on-exec mode - * set. */ -int -tor_open_cloexec(const char *path, int flags, unsigned mode) -{ - int fd; -#ifdef O_CLOEXEC - path = sandbox_intern_string(path); - fd = open(path, flags|O_CLOEXEC, mode); - if (fd >= 0) - return fd; - /* If we got an error, see if it is EINVAL. EINVAL might indicate that, - * even though we were built on a system with O_CLOEXEC support, we - * are running on one without. */ - if (errno != EINVAL) - return -1; -#endif - - fd = open(path, flags, mode); -#ifdef FD_CLOEXEC - if (fd >= 0) { - if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) { - log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno)); - close(fd); - return -1; - } - } -#endif - return fd; -} - -/** As fopen(path,mode), but ensures that the O_CLOEXEC bit is set on the - * underlying file handle. */ -FILE * -tor_fopen_cloexec(const char *path, const char *mode) -{ - FILE *result = fopen(path, mode); -#ifdef FD_CLOEXEC - if (result != NULL) { - if (fcntl(fileno(result), F_SETFD, FD_CLOEXEC) == -1) { - log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno)); - fclose(result); - return NULL; - } - } -#endif - return result; -} - -#if defined(HAVE_SYS_MMAN_H) || defined(RUNNING_DOXYGEN) -/** Try to create a memory mapping for filename and return it. On - * failure, return NULL. Sets errno properly, using ERANGE to mean - * "empty file". */ -tor_mmap_t * -tor_mmap_file(const char *filename) -{ - int fd; /* router file */ - char *string; - int page_size; - tor_mmap_t *res; - size_t size, filesize; - - tor_assert(filename); - - fd = tor_open_cloexec(filename, O_RDONLY, 0); - if (fd<0) { - int save_errno = errno; - int severity = (errno == ENOENT) ? LOG_INFO : LOG_WARN; - log_fn(severity, LD_FS,"Could not open \"%s\" for mmap(): %s",filename, - strerror(errno)); - errno = save_errno; - return NULL; - } - - /* XXXX why not just do fstat here? */ - size = filesize = (size_t) lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - /* ensure page alignment */ - page_size = getpagesize(); - size += (size%page_size) ? page_size-(size%page_size) : 0; - - if (!size) { - /* Zero-length file. If we call mmap on it, it will succeed but - * return NULL, and bad things will happen. So just fail. */ - log_info(LD_FS,"File \"%s\" is empty. Ignoring.",filename); - errno = ERANGE; - close(fd); - return NULL; - } - - string = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0); - close(fd); - if (string == MAP_FAILED) { - int save_errno = errno; - log_warn(LD_FS,"Could not mmap file \"%s\": %s", filename, - strerror(errno)); - errno = save_errno; - return NULL; - } - - res = tor_malloc_zero(sizeof(tor_mmap_t)); - res->data = string; - res->size = filesize; - res->mapping_size = size; - - return res; -} -/** Release storage held for a memory mapping. */ -void -tor_munmap_file(tor_mmap_t *handle) -{ - munmap((char*)handle->data, handle->mapping_size); - tor_free(handle); -} -#elif defined(_WIN32) -tor_mmap_t * -tor_mmap_file(const char *filename) -{ - TCHAR tfilename[MAX_PATH]= {0}; - tor_mmap_t *res = tor_malloc_zero(sizeof(tor_mmap_t)); - int empty = 0; - HANDLE file_handle = INVALID_HANDLE_VALUE; - DWORD size_low, size_high; - uint64_t real_size; - res->mmap_handle = NULL; -#ifdef UNICODE - mbstowcs(tfilename,filename,MAX_PATH); -#else - strlcpy(tfilename,filename,MAX_PATH); -#endif - file_handle = CreateFile(tfilename, - GENERIC_READ, FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - 0); - - if (file_handle == INVALID_HANDLE_VALUE) - goto win_err; - - size_low = GetFileSize(file_handle, &size_high); - - if (size_low == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) { - log_warn(LD_FS,"Error getting size of \"%s\".",filename); - goto win_err; - } - if (size_low == 0 && size_high == 0) { - log_info(LD_FS,"File \"%s\" is empty. Ignoring.",filename); - empty = 1; - goto err; - } - real_size = (((uint64_t)size_high)<<32) | size_low; - if (real_size > SIZE_MAX) { - log_warn(LD_FS,"File \"%s\" is too big to map; not trying.",filename); - goto err; - } - res->size = real_size; - - res->mmap_handle = CreateFileMapping(file_handle, - NULL, - PAGE_READONLY, - size_high, - size_low, - NULL); - if (res->mmap_handle == NULL) - goto win_err; - res->data = (char*) MapViewOfFile(res->mmap_handle, - FILE_MAP_READ, - 0, 0, 0); - if (!res->data) - goto win_err; - - CloseHandle(file_handle); - return res; - win_err: { - DWORD e = GetLastError(); - int severity = (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) ? - LOG_INFO : LOG_WARN; - char *msg = format_win32_error(e); - log_fn(severity, LD_FS, "Couldn't mmap file \"%s\": %s", filename, msg); - tor_free(msg); - if (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) - errno = ENOENT; - else - errno = EINVAL; - } - err: - if (empty) - errno = ERANGE; - if (file_handle != INVALID_HANDLE_VALUE) - CloseHandle(file_handle); - tor_munmap_file(res); - return NULL; -} -void -tor_munmap_file(tor_mmap_t *handle) -{ - if (handle->data) - /* This is an ugly cast, but without it, "data" in struct tor_mmap_t would - have to be redefined as non-const. */ - UnmapViewOfFile( (LPVOID) handle->data); - - if (handle->mmap_handle != NULL) - CloseHandle(handle->mmap_handle); - tor_free(handle); -} -#else -tor_mmap_t * -tor_mmap_file(const char *filename) -{ - struct stat st; - char *res = read_file_to_str(filename, RFTS_BIN|RFTS_IGNORE_MISSING, &st); - tor_mmap_t *handle; - if (! res) - return NULL; - handle = tor_malloc_zero(sizeof(tor_mmap_t)); - handle->data = res; - handle->size = st.st_size; - return handle; -} -void -tor_munmap_file(tor_mmap_t *handle) -{ - char *d = (char*)handle->data; - tor_free(d); - memwipe(handle, 0, sizeof(tor_mmap_t)); - tor_free(handle); -} -#endif - -/** Replacement for snprintf. Differs from platform snprintf in two - * ways: First, always NUL-terminates its output. Second, always - * returns -1 if the result is truncated. (Note that this return - * behavior does not conform to C99; it just happens to be - * easier to emulate "return -1" with conformant implementations than - * it is to emulate "return number that would be written" with - * non-conformant implementations.) */ -int -tor_snprintf(char *str, size_t size, const char *format, ...) -{ - va_list ap; - int r; - va_start(ap,format); - r = tor_vsnprintf(str,size,format,ap); - va_end(ap); - return r; -} - -/** Replacement for vsnprintf; behavior differs as tor_snprintf differs from - * snprintf. - */ -int -tor_vsnprintf(char *str, size_t size, const char *format, va_list args) -{ - int r; - if (size == 0) - return -1; /* no place for the NUL */ - if (size > SIZE_T_CEILING) - return -1; -#ifdef _WIN32 - r = _vsnprintf(str, size, format, args); -#else - r = vsnprintf(str, size, format, args); -#endif - str[size-1] = '\0'; - if (r < 0 || r >= (ssize_t)size) - return -1; - return r; -} - -/** - * Portable asprintf implementation. Does a printf() into a newly malloc'd - * string. Sets *strp to this string, and returns its length (not - * including the terminating NUL character). - * - * You can treat this function as if its implementation were something like -
    -     char buf[_INFINITY_];
    -     tor_snprintf(buf, sizeof(buf), fmt, args);
    -     *strp = tor_strdup(buf);
    -     return strlen(*strp):
    -   
    - * Where _INFINITY_ is an imaginary constant so big that any string can fit - * into it. - */ -int -tor_asprintf(char **strp, const char *fmt, ...) -{ - int r; - va_list args; - va_start(args, fmt); - r = tor_vasprintf(strp, fmt, args); - va_end(args); - if (!*strp || r < 0) { - log_err(LD_BUG, "Internal error in asprintf"); - tor_assert(0); - } - return r; -} - -/** - * Portable vasprintf implementation. Does a printf() into a newly malloc'd - * string. Differs from regular vasprintf in the same ways that - * tor_asprintf() differs from regular asprintf. - */ -int -tor_vasprintf(char **strp, const char *fmt, va_list args) -{ - /* use a temporary variable in case *strp is in args. */ - char *strp_tmp=NULL; -#ifdef HAVE_VASPRINTF - /* If the platform gives us one, use it. */ - int r = vasprintf(&strp_tmp, fmt, args); - if (r < 0) - *strp = NULL; - else - *strp = strp_tmp; - return r; -#elif defined(HAVE__VSCPRINTF) - /* On Windows, _vsnprintf won't tell us the length of the string if it - * overflows, so we need to use _vcsprintf to tell how much to allocate */ - int len, r; - len = _vscprintf(fmt, args); - if (len < 0) { - *strp = NULL; - return -1; - } - strp_tmp = tor_malloc(len + 1); - r = _vsnprintf(strp_tmp, len+1, fmt, args); - if (r != len) { - tor_free(strp_tmp); - *strp = NULL; - return -1; - } - *strp = strp_tmp; - return len; -#else - /* Everywhere else, we have a decent vsnprintf that tells us how many - * characters we need. We give it a try on a short buffer first, since - * it might be nice to avoid the second vsnprintf call. - */ - char buf[128]; - int len, r; - va_list tmp_args; - va_copy(tmp_args, args); - len = vsnprintf(buf, sizeof(buf), fmt, tmp_args); - va_end(tmp_args); - if (len < (int)sizeof(buf)) { - *strp = tor_strdup(buf); - return len; - } - strp_tmp = tor_malloc(len+1); - r = vsnprintf(strp_tmp, len+1, fmt, args); - if (r != len) { - tor_free(strp_tmp); - *strp = NULL; - return -1; - } - *strp = strp_tmp; - return len; -#endif -} - -/** Given hlen bytes at haystack and nlen bytes at - * needle, return a pointer to the first occurrence of the needle - * within the haystack, or NULL if there is no such occurrence. - * - * This function is not timing-safe. - * - * Requires that nlen be greater than zero. - */ -const void * -tor_memmem(const void *_haystack, size_t hlen, - const void *_needle, size_t nlen) -{ -#if defined(HAVE_MEMMEM) && (!defined(__GNUC__) || __GNUC__ >= 2) && !defined(__APPLE__) - tor_assert(nlen); - return memmem(_haystack, hlen, _needle, nlen); -#else - /* This isn't as fast as the GLIBC implementation, but it doesn't need to - * be. */ - const char *p, *end; - const char *haystack = (const char*)_haystack; - const char *needle = (const char*)_needle; - char first; - tor_assert(nlen); - - p = haystack; - end = haystack + hlen; - first = *(const char*)needle; - while ((p = memchr(p, first, end-p))) { - if (p+nlen > end) - return NULL; - if (fast_memeq(p, needle, nlen)) - return p; - ++p; - } - return NULL; -#endif -} - -/** - * Tables to implement ctypes-replacement TOR_IS*() functions. Each table - * has 256 bits to look up whether a character is in some set or not. This - * fails on non-ASCII platforms, but it is hard to find a platform whose - * character set is not a superset of ASCII nowadays. */ - -/**@{*/ -const uint32_t TOR_ISALPHA_TABLE[8] = - { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; -const uint32_t TOR_ISALNUM_TABLE[8] = - { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; -const uint32_t TOR_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 }; -const uint32_t TOR_ISXDIGIT_TABLE[8] = - { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 }; -const uint32_t TOR_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 }; -const uint32_t TOR_ISPRINT_TABLE[8] = - { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 }; -const uint32_t TOR_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 }; -const uint32_t TOR_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; - -/** Upper-casing and lowercasing tables to map characters to upper/lowercase - * equivalents. Used by tor_toupper() and tor_tolower(). */ -/**@{*/ -const char TOR_TOUPPER_TABLE[256] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, - 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, - 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, - 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, - 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, - 96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, - 80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, -}; -const char TOR_TOLOWER_TABLE[256] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, - 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, - 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, - 64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95, - 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, -}; -/**@}*/ - -/** Helper for tor_strtok_r_impl: Advances cp past all characters in - * sep, and returns its new value. */ -static char * -strtok_helper(char *cp, const char *sep) -{ - if (sep[1]) { - while (*cp && strchr(sep, *cp)) - ++cp; - } else { - while (*cp && *cp == *sep) - ++cp; - } - return cp; -} - -/** Implementation of strtok_r for platforms whose coders haven't figured out - * how to write one. Hey guys! You can use this code here for free! */ -char * -tor_strtok_r_impl(char *str, const char *sep, char **lasts) -{ - char *cp, *start; - tor_assert(*sep); - if (str) { - str = strtok_helper(str, sep); - if (!*str) - return NULL; - start = cp = *lasts = str; - } else if (!*lasts || !**lasts) { - return NULL; - } else { - start = cp = *lasts; - } - - if (sep[1]) { - while (*cp && !strchr(sep, *cp)) - ++cp; - } else { - cp = strchr(cp, *sep); - } - - if (!cp || !*cp) { - *lasts = NULL; - } else { - *cp++ = '\0'; - *lasts = strtok_helper(cp, sep); - } - return start; -} - -#ifdef _WIN32 -/** Take a filename and return a pointer to its final element. This - * function is called on __FILE__ to fix a MSVC nit where __FILE__ - * contains the full path to the file. This is bad, because it - * confuses users to find the home directory of the person who - * compiled the binary in their warning messages. - */ -const char * -tor_fix_source_file(const char *fname) -{ - const char *cp1, *cp2, *r; - cp1 = strrchr(fname, '/'); - cp2 = strrchr(fname, '\\'); - if (cp1 && cp2) { - r = (cp1cp. Equivalent to - * *(uint16_t*)(cp), but will not cause segfaults on platforms that forbid - * unaligned memory access. - */ -uint16_t -get_uint16(const void *cp) -{ - uint16_t v; - memcpy(&v,cp,2); - return v; -} -/** - * Read a 32-bit value beginning at cp. Equivalent to - * *(uint32_t*)(cp), but will not cause segfaults on platforms that forbid - * unaligned memory access. - */ -uint32_t -get_uint32(const void *cp) -{ - uint32_t v; - memcpy(&v,cp,4); - return v; -} -/** - * Read a 64-bit value beginning at cp. Equivalent to - * *(uint64_t*)(cp), but will not cause segfaults on platforms that forbid - * unaligned memory access. - */ -uint64_t -get_uint64(const void *cp) -{ - uint64_t v; - memcpy(&v,cp,8); - return v; -} - -/** - * Set a 16-bit value beginning at cp to v. Equivalent to - * *(uint16_t*)(cp) = v, but will not cause segfaults on platforms that forbid - * unaligned memory access. */ -void -set_uint16(void *cp, uint16_t v) -{ - memcpy(cp,&v,2); -} -/** - * Set a 32-bit value beginning at cp to v. Equivalent to - * *(uint32_t*)(cp) = v, but will not cause segfaults on platforms that forbid - * unaligned memory access. */ -void -set_uint32(void *cp, uint32_t v) -{ - memcpy(cp,&v,4); -} -/** - * Set a 64-bit value beginning at cp to v. Equivalent to - * *(uint64_t*)(cp) = v, but will not cause segfaults on platforms that forbid - * unaligned memory access. */ -void -set_uint64(void *cp, uint64_t v) -{ - memcpy(cp,&v,8); -} - -/** - * Rename the file from to the file to. On Unix, this is - * the same as rename(2). On windows, this removes to first if - * it already exists. - * Returns 0 on success. Returns -1 and sets errno on failure. - */ -int -replace_file(const char *from, const char *to) -{ -#ifndef _WIN32 - return rename(from,to); -#else - switch (file_status(to)) - { - case FN_NOENT: - break; - case FN_FILE: - if (unlink(to)) return -1; - break; - case FN_ERROR: - return -1; - case FN_DIR: - errno = EISDIR; - return -1; - } - return rename(from,to); -#endif -} - -/** Change fname's modification time to now. */ -int -touch_file(const char *fname) -{ - if (utime(fname, NULL)!=0) - return -1; - return 0; -} - -/** Represents a lockfile on which we hold the lock. */ -struct tor_lockfile_t { - /** Name of the file */ - char *filename; - /** File descriptor used to hold the file open */ - int fd; -}; - -/** Try to get a lock on the lockfile filename, creating it as - * necessary. If someone else has the lock and blocking is true, - * wait until the lock is available. Otherwise return immediately whether - * we succeeded or not. - * - * Set *locked_out to true if somebody else had the lock, and to false - * otherwise. - * - * Return a tor_lockfile_t on success, NULL on failure. - * - * (Implementation note: because we need to fall back to fcntl on some - * platforms, these locks are per-process, not per-thread. If you want - * to do in-process locking, use tor_mutex_t like a normal person. - * On Windows, when blocking is true, the maximum time that - * is actually waited is 10 seconds, after which NULL is returned - * and locked_out is set to 1.) - */ -tor_lockfile_t * -tor_lockfile_lock(const char *filename, int blocking, int *locked_out) -{ - tor_lockfile_t *result; - int fd; - *locked_out = 0; - - log_info(LD_FS, "Locking \"%s\"", filename); - fd = tor_open_cloexec(filename, O_RDWR|O_CREAT|O_TRUNC, 0600); - if (fd < 0) { - log_warn(LD_FS,"Couldn't open \"%s\" for locking: %s", filename, - strerror(errno)); - return NULL; - } - -#ifdef _WIN32 - _lseek(fd, 0, SEEK_SET); - if (_locking(fd, blocking ? _LK_LOCK : _LK_NBLCK, 1) < 0) { - if (errno != EACCES && errno != EDEADLOCK) - log_warn(LD_FS,"Couldn't lock \"%s\": %s", filename, strerror(errno)); - else - *locked_out = 1; - close(fd); - return NULL; - } -#elif defined(HAVE_FLOCK) - if (flock(fd, LOCK_EX|(blocking ? 0 : LOCK_NB)) < 0) { - if (errno != EWOULDBLOCK) - log_warn(LD_FS,"Couldn't lock \"%s\": %s", filename, strerror(errno)); - else - *locked_out = 1; - close(fd); - return NULL; - } -#else - { - struct flock lock; - memset(&lock, 0, sizeof(lock)); - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - if (fcntl(fd, blocking ? F_SETLKW : F_SETLK, &lock) < 0) { - if (errno != EACCES && errno != EAGAIN) - log_warn(LD_FS, "Couldn't lock \"%s\": %s", filename, strerror(errno)); - else - *locked_out = 1; - close(fd); - return NULL; - } - } -#endif - - result = tor_malloc(sizeof(tor_lockfile_t)); - result->filename = tor_strdup(filename); - result->fd = fd; - return result; -} - -/** Release the lock held as lockfile. */ -void -tor_lockfile_unlock(tor_lockfile_t *lockfile) -{ - tor_assert(lockfile); - - log_info(LD_FS, "Unlocking \"%s\"", lockfile->filename); -#ifdef _WIN32 - _lseek(lockfile->fd, 0, SEEK_SET); - if (_locking(lockfile->fd, _LK_UNLCK, 1) < 0) { - log_warn(LD_FS,"Error unlocking \"%s\": %s", lockfile->filename, - strerror(errno)); - } -#elif defined(HAVE_FLOCK) - if (flock(lockfile->fd, LOCK_UN) < 0) { - log_warn(LD_FS, "Error unlocking \"%s\": %s", lockfile->filename, - strerror(errno)); - } -#else - /* Closing the lockfile is sufficient. */ -#endif - - close(lockfile->fd); - lockfile->fd = -1; - tor_free(lockfile->filename); - tor_free(lockfile); -} - -/** @{ */ -/** Some old versions of Unix didn't define constants for these values, - * and instead expect you to say 0, 1, or 2. */ -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif -#ifndef SEEK_END -#define SEEK_END 2 -#endif -/** @} */ - -/** Return the position of fd with respect to the start of the file. */ -off_t -tor_fd_getpos(int fd) -{ -#ifdef _WIN32 - return (off_t) _lseek(fd, 0, SEEK_CUR); -#else - return (off_t) lseek(fd, 0, SEEK_CUR); -#endif -} - -/** Move fd to the end of the file. Return -1 on error, 0 on success. */ -int -tor_fd_seekend(int fd) -{ -#ifdef _WIN32 - return _lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; -#else - return lseek(fd, 0, SEEK_END) < 0 ? -1 : 0; -#endif -} - -/** Move fd to position pos in the file. Return -1 on error, 0 - * on success. */ -int -tor_fd_setpos(int fd, off_t pos) -{ -#ifdef _WIN32 - return _lseek(fd, pos, SEEK_SET) < 0 ? -1 : 0; -#else - return lseek(fd, pos, SEEK_SET) < 0 ? -1 : 0; -#endif -} - -#undef DEBUG_SOCKET_COUNTING -#ifdef DEBUG_SOCKET_COUNTING -/** A bitarray of all fds that should be passed to tor_socket_close(). Only - * used if DEBUG_SOCKET_COUNTING is defined. */ -static bitarray_t *open_sockets = NULL; -/** The size of open_sockets, in bits. */ -static int max_socket = -1; -#endif - -/** Count of number of sockets currently open. (Undercounts sockets opened by - * eventdns and libevent.) */ -static int n_sockets_open = 0; - -/** Mutex to protect open_sockets, max_socket, and n_sockets_open. */ -static tor_mutex_t *socket_accounting_mutex = NULL; - -/** Helper: acquire the socket accounting lock. */ -static INLINE void -socket_accounting_lock(void) -{ - if (PREDICT_UNLIKELY(!socket_accounting_mutex)) - socket_accounting_mutex = tor_mutex_new(); - tor_mutex_acquire(socket_accounting_mutex); -} - -/** Helper: release the socket accounting lock. */ -static INLINE void -socket_accounting_unlock(void) -{ - tor_mutex_release(socket_accounting_mutex); -} - -/** As close(), but guaranteed to work for sockets across platforms (including - * Windows, where close()ing a socket doesn't work. Returns 0 on success and - * the socket error code on failure. */ -int -tor_close_socket_simple(tor_socket_t s) -{ - int r = 0; - - /* On Windows, you have to call close() on fds returned by open(), - * and closesocket() on fds returned by socket(). On Unix, everything - * gets close()'d. We abstract this difference by always using - * tor_close_socket to close sockets, and always using close() on - * files. - */ - #if defined(_WIN32) - r = closesocket(s); - #else - r = close(s); - #endif - - if (r != 0) { - int err = tor_socket_errno(-1); - log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err)); - return err; - } - - return r; -} - -/** As tor_close_socket_simple(), but keeps track of the number - * of open sockets. Returns 0 on success, -1 on failure. */ -int -tor_close_socket(tor_socket_t s) -{ - int r = tor_close_socket_simple(s); - - socket_accounting_lock(); -#ifdef DEBUG_SOCKET_COUNTING - if (s > max_socket || ! bitarray_is_set(open_sockets, s)) { - log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_" - "socket(), or that was already closed or something.", s); - } else { - tor_assert(open_sockets && s <= max_socket); - bitarray_clear(open_sockets, s); - } -#endif - if (r == 0) { - --n_sockets_open; - } else { -#ifdef _WIN32 - if (r != WSAENOTSOCK) - --n_sockets_open; -#else - if (r != EBADF) - --n_sockets_open; -#endif - r = -1; - } - - if (n_sockets_open < 0) - log_warn(LD_BUG, "Our socket count is below zero: %d. Please submit a " - "bug report.", n_sockets_open); - socket_accounting_unlock(); - return r; -} - -/** @{ */ -#ifdef DEBUG_SOCKET_COUNTING -/** Helper: if DEBUG_SOCKET_COUNTING is enabled, remember that s is - * now an open socket. */ -static INLINE void -mark_socket_open(tor_socket_t s) -{ - /* XXXX This bitarray business will NOT work on windows: sockets aren't - small ints there. */ - if (s > max_socket) { - if (max_socket == -1) { - open_sockets = bitarray_init_zero(s+128); - max_socket = s+128; - } else { - open_sockets = bitarray_expand(open_sockets, max_socket, s+128); - max_socket = s+128; - } - } - if (bitarray_is_set(open_sockets, s)) { - log_warn(LD_BUG, "I thought that %d was already open, but socket() just " - "gave it to me!", s); - } - bitarray_set(open_sockets, s); -} -#else -#define mark_socket_open(s) STMT_NIL -#endif -/** @} */ - -/** As socket(), but counts the number of open sockets. */ -tor_socket_t -tor_open_socket(int domain, int type, int protocol) -{ - return tor_open_socket_with_extensions(domain, type, protocol, 1, 0); -} - -/** As socket(), but creates a nonblocking socket and - * counts the number of open sockets. */ -tor_socket_t -tor_open_socket_nonblocking(int domain, int type, int protocol) -{ - return tor_open_socket_with_extensions(domain, type, protocol, 1, 1); -} - -/** As socket(), but counts the number of open sockets and handles - * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. - * cloexec and nonblock should be either 0 or 1 to indicate - * if the corresponding extension should be used.*/ -tor_socket_t -tor_open_socket_with_extensions(int domain, int type, int protocol, - int cloexec, int nonblock) -{ - tor_socket_t s; -#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) - int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | - (nonblock ? SOCK_NONBLOCK : 0); - s = socket(domain, type|ext_flags, protocol); - if (SOCKET_OK(s)) - goto socket_ok; - /* If we got an error, see if it is EINVAL. EINVAL might indicate that, - * even though we were built on a system with SOCK_CLOEXEC and SOCK_NONBLOCK - * support, we are running on one without. */ - if (errno != EINVAL) - return s; -#endif /* SOCK_CLOEXEC && SOCK_NONBLOCK */ - - s = socket(domain, type, protocol); - if (! SOCKET_OK(s)) - return s; - -#if defined(FD_CLOEXEC) - if (cloexec) { - if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { - log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno)); - tor_close_socket_simple(s); - return TOR_INVALID_SOCKET; - } - } -#else - (void)cloexec; -#endif - - if (nonblock) { - if (set_socket_nonblocking(s) == -1) { - tor_close_socket_simple(s); - return TOR_INVALID_SOCKET; - } - } - - goto socket_ok; /* So that socket_ok will not be unused. */ - - socket_ok: - socket_accounting_lock(); - ++n_sockets_open; - mark_socket_open(s); - socket_accounting_unlock(); - return s; -} - -/** As accept(), but counts the number of open sockets. */ -tor_socket_t -tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len) -{ - return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 0); -} - -/** As accept(), but returns a nonblocking socket and - * counts the number of open sockets. */ -tor_socket_t -tor_accept_socket_nonblocking(tor_socket_t sockfd, struct sockaddr *addr, - socklen_t *len) -{ - return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 1); -} - -/** As accept(), but counts the number of open sockets and handles - * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. - * cloexec and nonblock should be either 0 or 1 to indicate - * if the corresponding extension should be used.*/ -tor_socket_t -tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, - socklen_t *len, int cloexec, int nonblock) -{ - tor_socket_t s; -#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) - int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | - (nonblock ? SOCK_NONBLOCK : 0); - s = accept4(sockfd, addr, len, ext_flags); - if (SOCKET_OK(s)) - goto socket_ok; - /* If we got an error, see if it is ENOSYS. ENOSYS indicates that, - * even though we were built on a system with accept4 support, we - * are running on one without. Also, check for EINVAL, which indicates that - * we are missing SOCK_CLOEXEC/SOCK_NONBLOCK support. */ - if (errno != EINVAL && errno != ENOSYS) - return s; -#endif - - s = accept(sockfd, addr, len); - if (!SOCKET_OK(s)) - return s; - -#if defined(FD_CLOEXEC) - if (cloexec) { - if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { - log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno)); - tor_close_socket_simple(s); - return TOR_INVALID_SOCKET; - } - } -#else - (void)cloexec; -#endif - - if (nonblock) { - if (set_socket_nonblocking(s) == -1) { - tor_close_socket_simple(s); - return TOR_INVALID_SOCKET; - } - } - - goto socket_ok; /* So that socket_ok will not be unused. */ - - socket_ok: - socket_accounting_lock(); - ++n_sockets_open; - mark_socket_open(s); - socket_accounting_unlock(); - return s; -} - -/** Return the number of sockets we currently have opened. */ -int -get_n_open_sockets(void) -{ - int n; - socket_accounting_lock(); - n = n_sockets_open; - socket_accounting_unlock(); - return n; -} - -/** Turn socket into a nonblocking socket. Return 0 on success, -1 - * on failure. - */ -int -set_socket_nonblocking(tor_socket_t socket) -{ -#if defined(_WIN32) - unsigned long nonblocking = 1; - ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking); -#else - int flags; - - flags = fcntl(socket, F_GETFL, 0); - if (flags == -1) { - log_warn(LD_NET, "Couldn't get file status flags: %s", strerror(errno)); - return -1; - } - flags |= O_NONBLOCK; - if (fcntl(socket, F_SETFL, flags) == -1) { - log_warn(LD_NET, "Couldn't set file status flags: %s", strerror(errno)); - return -1; - } -#endif - - return 0; -} - -/** - * Allocate a pair of connected sockets. (Like socketpair(family, - * type,protocol,fd), but works on systems that don't have - * socketpair.) - * - * Currently, only (AF_UNIX, SOCK_STREAM, 0) sockets are supported. - * - * Note that on systems without socketpair, this call will fail if - * localhost is inaccessible (for example, if the networking - * stack is down). And even if it succeeds, the socket pair will not - * be able to read while localhost is down later (the socket pair may - * even close, depending on OS-specific timeouts). - * - * Returns 0 on success and -errno on failure; do not rely on the value - * of errno or WSAGetLastError(). - **/ -/* It would be nicer just to set errno, but that won't work for windows. */ -int -tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) -{ -//don't use win32 socketpairs (they are always bad) -#if defined(HAVE_SOCKETPAIR) && !defined(_WIN32) - int r; - -#ifdef SOCK_CLOEXEC - r = socketpair(family, type|SOCK_CLOEXEC, protocol, fd); - if (r == 0) - goto sockets_ok; - /* If we got an error, see if it is EINVAL. EINVAL might indicate that, - * even though we were built on a system with SOCK_CLOEXEC support, we - * are running on one without. */ - if (errno != EINVAL) - return -errno; -#endif - - r = socketpair(family, type, protocol, fd); - if (r < 0) - return -errno; - -#if defined(FD_CLOEXEC) - if (SOCKET_OK(fd[0])) { - r = fcntl(fd[0], F_SETFD, FD_CLOEXEC); - if (r == -1) { - close(fd[0]); - close(fd[1]); - return -errno; - } - } - if (SOCKET_OK(fd[1])) { - r = fcntl(fd[1], F_SETFD, FD_CLOEXEC); - if (r == -1) { - close(fd[0]); - close(fd[1]); - return -errno; - } - } -#endif - goto sockets_ok; /* So that sockets_ok will not be unused. */ - - sockets_ok: - socket_accounting_lock(); - if (SOCKET_OK(fd[0])) { - ++n_sockets_open; - mark_socket_open(fd[0]); - } - if (SOCKET_OK(fd[1])) { - ++n_sockets_open; - mark_socket_open(fd[1]); - } - socket_accounting_unlock(); - - return 0; -#else - return tor_ersatz_socketpair(family, type, protocol, fd); -#endif -} - -#ifdef NEED_ERSATZ_SOCKETPAIR -/** - * Helper used to implement socketpair on systems that lack it, by - * making a direct connection to localhost. - */ -STATIC int -tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) -{ - /* This socketpair does not work when localhost is down. So - * it's really not the same thing at all. But it's close enough - * for now, and really, when localhost is down sometimes, we - * have other problems too. - */ - tor_socket_t listener = TOR_INVALID_SOCKET; - tor_socket_t connector = TOR_INVALID_SOCKET; - tor_socket_t acceptor = TOR_INVALID_SOCKET; - struct sockaddr_in listen_addr; - struct sockaddr_in connect_addr; - socklen_t size; - int saved_errno = -1; - - if (protocol -#ifdef AF_UNIX - || family != AF_UNIX -#endif - ) { -#ifdef _WIN32 - return -WSAEAFNOSUPPORT; -#else - return -EAFNOSUPPORT; -#endif - } - if (!fd) { - return -EINVAL; - } - - listener = tor_open_socket(AF_INET, type, 0); - if (!SOCKET_OK(listener)) - return -tor_socket_errno(-1); - memset(&listen_addr, 0, sizeof(listen_addr)); - listen_addr.sin_family = AF_INET; - listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - listen_addr.sin_port = 0; /* kernel chooses port. */ - if (bind(listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr)) - == -1) - goto tidy_up_and_fail; - if (listen(listener, 1) == -1) - goto tidy_up_and_fail; - - connector = tor_open_socket(AF_INET, type, 0); - if (!SOCKET_OK(connector)) - goto tidy_up_and_fail; - /* We want to find out the port number to connect to. */ - size = sizeof(connect_addr); - if (getsockname(listener, (struct sockaddr *) &connect_addr, &size) == -1) - goto tidy_up_and_fail; - if (size != sizeof (connect_addr)) - goto abort_tidy_up_and_fail; - if (connect(connector, (struct sockaddr *) &connect_addr, - sizeof(connect_addr)) == -1) - goto tidy_up_and_fail; - - size = sizeof(listen_addr); - acceptor = tor_accept_socket(listener, - (struct sockaddr *) &listen_addr, &size); - if (!SOCKET_OK(acceptor)) - goto tidy_up_and_fail; - if (size != sizeof(listen_addr)) - goto abort_tidy_up_and_fail; - /* Now check we are talking to ourself by matching port and host on the - two sockets. */ - if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1) - goto tidy_up_and_fail; - if (size != sizeof (connect_addr) - || listen_addr.sin_family != connect_addr.sin_family - || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr - || listen_addr.sin_port != connect_addr.sin_port) { - goto abort_tidy_up_and_fail; - } - tor_close_socket(listener); - fd[0] = connector; - fd[1] = acceptor; - - return 0; - - abort_tidy_up_and_fail: -#ifdef _WIN32 - saved_errno = WSAECONNABORTED; -#else - saved_errno = ECONNABORTED; /* I hope this is portable and appropriate. */ -#endif - tidy_up_and_fail: - if (saved_errno < 0) - saved_errno = errno; - if (SOCKET_OK(listener)) - tor_close_socket(listener); - if (SOCKET_OK(connector)) - tor_close_socket(connector); - if (SOCKET_OK(acceptor)) - tor_close_socket(acceptor); - return -saved_errno; -} -#endif - -/** Number of extra file descriptors to keep in reserve beyond those that we - * tell Tor it's allowed to use. */ -#define ULIMIT_BUFFER 32 /* keep 32 extra fd's beyond ConnLimit_ */ - -/** Learn the maximum allowed number of file descriptors, and tell the system - * we want to use up to that number. (Some systems have a low soft limit, and - * let us set it higher.) - * - * We compute this by finding the largest number that we can use. - * If we can't find a number greater than or equal to limit, - * then we fail: return -1. - * - * If limit is 0, then do not adjust the current maximum. - * - * Otherwise, return 0 and store the maximum we found inside max_out.*/ -int -set_max_file_descriptors(rlim_t limit, int *max_out) -{ - /* Define some maximum connections values for systems where we cannot - * automatically determine a limit. Re Cygwin, see - * http://archives.seul.org/or/talk/Aug-2006/msg00210.html - * For an iPhone, 9999 should work. For Windows and all other unknown - * systems we use 15000 as the default. */ -#ifndef HAVE_GETRLIMIT -#if defined(CYGWIN) || defined(__CYGWIN__) - const char *platform = "Cygwin"; - const unsigned long MAX_CONNECTIONS = 3200; -#elif defined(_WIN32) - const char *platform = "Windows"; - const unsigned long MAX_CONNECTIONS = 15000; -#else - const char *platform = "unknown platforms with no getrlimit()"; - const unsigned long MAX_CONNECTIONS = 15000; -#endif - log_fn(LOG_INFO, LD_NET, - "This platform is missing getrlimit(). Proceeding."); - if (limit > MAX_CONNECTIONS) { - log_warn(LD_CONFIG, - "We do not support more than %lu file descriptors " - "on %s. Tried to raise to %lu.", - (unsigned long)MAX_CONNECTIONS, platform, (unsigned long)limit); - return -1; - } - limit = MAX_CONNECTIONS; -#else /* HAVE_GETRLIMIT */ - struct rlimit rlim; - - if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { - log_warn(LD_NET, "Could not get maximum number of file descriptors: %s", - strerror(errno)); - return -1; - } - if (limit == 0) { - /* If limit == 0, return the maximum value without setting it. */ - limit = rlim.rlim_max; - if (limit > INT_MAX) - limit = INT_MAX; - *max_out = (int)limit - ULIMIT_BUFFER; - return 0; - } - if (rlim.rlim_max < limit) { - log_warn(LD_CONFIG,"We need %lu file descriptors available, and we're " - "limited to %lu. Please change your ulimit -n.", - (unsigned long)limit, (unsigned long)rlim.rlim_max); - return -1; - } - - if (rlim.rlim_max > rlim.rlim_cur) { - log_info(LD_NET,"Raising max file descriptors from %lu to %lu.", - (unsigned long)rlim.rlim_cur, (unsigned long)rlim.rlim_max); - } - rlim.rlim_cur = rlim.rlim_max; - - if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) { - int bad = 1; -#ifdef OPEN_MAX - if (errno == EINVAL && OPEN_MAX < rlim.rlim_cur) { - /* On some platforms, OPEN_MAX is the real limit, and getrlimit() is - * full of nasty lies. I'm looking at you, OSX 10.5.... */ - rlim.rlim_cur = OPEN_MAX; - if (setrlimit(RLIMIT_NOFILE, &rlim) == 0) { - if (rlim.rlim_cur < (rlim_t)limit) { - log_warn(LD_CONFIG, "We are limited to %lu file descriptors by " - "OPEN_MAX, and ConnLimit is %lu. Changing ConnLimit; sorry.", - (unsigned long)OPEN_MAX, (unsigned long)limit); - } else { - log_info(LD_CONFIG, "Dropped connection limit to OPEN_MAX (%lu); " - "Apparently, %lu was too high and rlimit lied to us.", - (unsigned long)OPEN_MAX, (unsigned long)rlim.rlim_max); - } - bad = 0; - } - } -#endif /* OPEN_MAX */ - if (bad) { - log_warn(LD_CONFIG,"Couldn't set maximum number of file descriptors: %s", - strerror(errno)); - return -1; - } - } - /* leave some overhead for logs, etc, */ - limit = rlim.rlim_cur; -#endif /* HAVE_GETRLIMIT */ - - if (limit < ULIMIT_BUFFER) { - log_warn(LD_CONFIG, - "ConnLimit must be at least %d. Failing.", ULIMIT_BUFFER); - return -1; - } - if (limit > INT_MAX) - limit = INT_MAX; - tor_assert(max_out); - *max_out = (int)limit - ULIMIT_BUFFER; - return 0; -} - -#ifndef _WIN32 -/** Log details of current user and group credentials. Return 0 on - * success. Logs and return -1 on failure. - */ -static int -log_credential_status(void) -{ -/** Log level to use when describing non-error UID/GID status. */ -#define CREDENTIAL_LOG_LEVEL LOG_INFO - /* Real, effective and saved UIDs */ - uid_t ruid, euid, suid; - /* Read, effective and saved GIDs */ - gid_t rgid, egid, sgid; - /* Supplementary groups */ - gid_t *sup_gids = NULL; - int sup_gids_size; - /* Number of supplementary groups */ - int ngids; - - /* log UIDs */ -#ifdef HAVE_GETRESUID - if (getresuid(&ruid, &euid, &suid) != 0 ) { - log_warn(LD_GENERAL, "Error getting changed UIDs: %s", strerror(errno)); - return -1; - } else { - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, - "UID is %u (real), %u (effective), %u (saved)", - (unsigned)ruid, (unsigned)euid, (unsigned)suid); - } -#else - /* getresuid is not present on MacOS X, so we can't get the saved (E)UID */ - ruid = getuid(); - euid = geteuid(); - (void)suid; - - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, - "UID is %u (real), %u (effective), unknown (saved)", - (unsigned)ruid, (unsigned)euid); -#endif - - /* log GIDs */ -#ifdef HAVE_GETRESGID - if (getresgid(&rgid, &egid, &sgid) != 0 ) { - log_warn(LD_GENERAL, "Error getting changed GIDs: %s", strerror(errno)); - return -1; - } else { - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, - "GID is %u (real), %u (effective), %u (saved)", - (unsigned)rgid, (unsigned)egid, (unsigned)sgid); - } -#else - /* getresgid is not present on MacOS X, so we can't get the saved (E)GID */ - rgid = getgid(); - egid = getegid(); - (void)sgid; - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, - "GID is %u (real), %u (effective), unknown (saved)", - (unsigned)rgid, (unsigned)egid); -#endif - - /* log supplementary groups */ - sup_gids_size = 64; - sup_gids = tor_malloc(sizeof(gid_t) * 64); - while ((ngids = getgroups(sup_gids_size, sup_gids)) < 0 && - errno == EINVAL && - sup_gids_size < NGROUPS_MAX) { - sup_gids_size *= 2; - sup_gids = tor_realloc(sup_gids, sizeof(gid_t) * sup_gids_size); - } - - if (ngids < 0) { - log_warn(LD_GENERAL, "Error getting supplementary GIDs: %s", - strerror(errno)); - tor_free(sup_gids); - return -1; - } else { - int i, retval = 0; - char *s = NULL; - smartlist_t *elts = smartlist_new(); - - for (i = 0; iuser and switch to their - * primary group. Return 0 on success. On failure, log and return -1. - */ -int -switch_id(const char *user) -{ -#ifndef _WIN32 - struct passwd *pw = NULL; - uid_t old_uid; - gid_t old_gid; - static int have_already_switched_id = 0; - - tor_assert(user); - - if (have_already_switched_id) - return 0; - - /* Log the initial credential state */ - if (log_credential_status()) - return -1; - - log_fn(CREDENTIAL_LOG_LEVEL, LD_GENERAL, "Changing user and groups"); - - /* Get old UID/GID to check if we changed correctly */ - old_uid = getuid(); - old_gid = getgid(); - - /* Lookup the user and group information, if we have a problem, bail out. */ - pw = getpwnam(user); - if (pw == NULL) { - log_warn(LD_CONFIG, "Error setting configured user: %s not found", user); - return -1; - } - - /* Properly switch egid,gid,euid,uid here or bail out */ - if (setgroups(1, &pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting groups to gid %d: \"%s\".", - (int)pw->pw_gid, strerror(errno)); - if (old_uid == pw->pw_uid) { - log_warn(LD_GENERAL, "Tor is already running as %s. You do not need " - "the \"User\" option if you are already running as the user " - "you want to be. (If you did not set the User option in your " - "torrc, check whether it was specified on the command line " - "by a startup script.)", user); - } else { - log_warn(LD_GENERAL, "If you set the \"User\" option, you must start Tor" - " as root."); - } - return -1; - } - - if (setegid(pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting egid to %d: %s", - (int)pw->pw_gid, strerror(errno)); - return -1; - } - - if (setgid(pw->pw_gid)) { - log_warn(LD_GENERAL, "Error setting gid to %d: %s", - (int)pw->pw_gid, strerror(errno)); - return -1; - } - - if (setuid(pw->pw_uid)) { - log_warn(LD_GENERAL, "Error setting configured uid to %s (%d): %s", - user, (int)pw->pw_uid, strerror(errno)); - return -1; - } - - if (seteuid(pw->pw_uid)) { - log_warn(LD_GENERAL, "Error setting configured euid to %s (%d): %s", - user, (int)pw->pw_uid, strerror(errno)); - return -1; - } - - /* This is how OpenBSD rolls: - if (setgroups(1, &pw->pw_gid) || setegid(pw->pw_gid) || - setgid(pw->pw_gid) || setuid(pw->pw_uid) || seteuid(pw->pw_uid)) { - setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) { - log_warn(LD_GENERAL, "Error setting configured UID/GID: %s", - strerror(errno)); - return -1; - } - */ - - /* We've properly switched egid, gid, euid, uid, and supplementary groups if - * we're here. */ - -#if !defined(CYGWIN) && !defined(__CYGWIN__) - /* If we tried to drop privilege to a group/user other than root, attempt to - * restore root (E)(U|G)ID, and abort if the operation succeeds */ - - /* Only check for privilege dropping if we were asked to be non-root */ - if (pw->pw_uid) { - /* Try changing GID/EGID */ - if (pw->pw_gid != old_gid && - (setgid(old_gid) != -1 || setegid(old_gid) != -1)) { - log_warn(LD_GENERAL, "Was able to restore group credentials even after " - "switching GID: this means that the setgid code didn't work."); - return -1; - } - - /* Try changing UID/EUID */ - if (pw->pw_uid != old_uid && - (setuid(old_uid) != -1 || seteuid(old_uid) != -1)) { - log_warn(LD_GENERAL, "Was able to restore user credentials even after " - "switching UID: this means that the setuid code didn't work."); - return -1; - } - } -#endif - - /* Check what really happened */ - if (log_credential_status()) { - return -1; - } - - have_already_switched_id = 1; /* mark success so we never try again */ - -#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && defined(HAVE_PRCTL) -#ifdef PR_SET_DUMPABLE - if (pw->pw_uid) { - /* Re-enable core dumps if we're not running as root. */ - log_info(LD_CONFIG, "Re-enabling coredumps"); - if (prctl(PR_SET_DUMPABLE, 1)) { - log_warn(LD_CONFIG, "Unable to re-enable coredumps: %s",strerror(errno)); - } - } -#endif -#endif - return 0; - -#else - (void)user; - - log_warn(LD_CONFIG, - "User specified but switching users is unsupported on your OS."); - return -1; -#endif -} - -/* We only use the linux prctl for now. There is no Win32 support; this may - * also work on various BSD systems and Mac OS X - send testing feedback! - * - * On recent Gnu/Linux kernels it is possible to create a system-wide policy - * that will prevent non-root processes from attaching to other processes - * unless they are the parent process; thus gdb can attach to programs that - * they execute but they cannot attach to other processes running as the same - * user. The system wide policy may be set with the sysctl - * kernel.yama.ptrace_scope or by inspecting - * /proc/sys/kernel/yama/ptrace_scope and it is 1 by default on Ubuntu 11.04. - * - * This ptrace scope will be ignored on Gnu/Linux for users with - * CAP_SYS_PTRACE and so it is very likely that root will still be able to - * attach to the Tor process. - */ -/** Attempt to disable debugger attachment: return 1 on success, -1 on - * failure, and 0 if we don't know how to try on this platform. */ -int -tor_disable_debugger_attach(void) -{ - int r, attempted; - r = -1; - attempted = 0; - log_debug(LD_CONFIG, - "Attemping to disable debugger attachment to Tor for " - "unprivileged users."); -#if defined(__linux__) && defined(HAVE_SYS_PRCTL_H) && defined(HAVE_PRCTL) -#ifdef PR_SET_DUMPABLE - attempted = 1; - r = prctl(PR_SET_DUMPABLE, 0); -#endif -#endif -#if defined(__APPLE__) && defined(PT_DENY_ATTACH) - if (r < 0) { - attempted = 1; - r = ptrace(PT_DENY_ATTACH, 0, 0, 0); - } -#endif - - // XXX: TODO - Mac OS X has dtrace and this may be disabled. - // XXX: TODO - Windows probably has something similar - if (r == 0 && attempted) { - log_debug(LD_CONFIG,"Debugger attachment disabled for " - "unprivileged users."); - return 1; - } else if (attempted) { - log_warn(LD_CONFIG, "Unable to disable debugger attaching: %s", - strerror(errno)); - } - return r; -} - -#ifdef HAVE_PWD_H -/** Allocate and return a string containing the home directory for the - * user username. Only works on posix-like systems. */ -char * -get_user_homedir(const char *username) -{ - struct passwd *pw; - tor_assert(username); - - if (!(pw = getpwnam(username))) { - log_err(LD_CONFIG,"User \"%s\" not found.", username); - return NULL; - } - return tor_strdup(pw->pw_dir); -} -#endif - -/** Modify fname to contain the name of its parent directory. Doesn't - * actually examine the filesystem; does a purely syntactic modification. - * - * The parent of the root director is considered to be iteself. - * - * Path separators are the forward slash (/) everywhere and additionally - * the backslash (\) on Win32. - * - * Cuts off any number of trailing path separators but otherwise ignores - * them for purposes of finding the parent directory. - * - * Returns 0 if a parent directory was successfully found, -1 otherwise (fname - * did not have any path separators or only had them at the end). - * */ -int -get_parent_directory(char *fname) -{ - char *cp; - int at_end = 1; - tor_assert(fname); -#ifdef _WIN32 - /* If we start with, say, c:, then don't consider that the start of the path - */ - if (fname[0] && fname[1] == ':') { - fname += 2; - } -#endif - /* Now we want to remove all path-separators at the end of the string, - * and to remove the end of the string starting with the path separator - * before the last non-path-separator. In perl, this would be - * s#[/]*$##; s#/[^/]*$##; - * on a unixy platform. - */ - cp = fname + strlen(fname); - at_end = 1; - while (--cp >= fname) { - int is_sep = (*cp == '/' -#ifdef _WIN32 - || *cp == '\\' -#endif - ); - if (is_sep) { - if (cp == fname) { - /* This is the first separator in the file name; don't remove it! */ - cp[1] = '\0'; - return 0; - } - *cp = '\0'; - if (! at_end) - return 0; - } else { - at_end = 0; - } - } - return -1; -} - -#ifndef _WIN32 -/** Return a newly allocated string containing the output of getcwd(). Return - * NULL on failure. (We can't just use getcwd() into a PATH_MAX buffer, since - * Hurd hasn't got a PATH_MAX.) - */ -static char * -alloc_getcwd(void) -{ - int saved_errno = errno; -/* We use this as a starting path length. Not too large seems sane. */ -#define START_PATH_LENGTH 128 -/* Nobody has a maxpath longer than this, as far as I know. And if they - * do, they shouldn't. */ -#define MAX_SANE_PATH_LENGTH 4096 - size_t path_length = START_PATH_LENGTH; - char *path = tor_malloc(path_length); - - errno = 0; - while (getcwd(path, path_length) == NULL) { - if (errno == ERANGE && path_length < MAX_SANE_PATH_LENGTH) { - path_length*=2; - path = tor_realloc(path, path_length); - } else { - tor_free(path); - path = NULL; - break; - } - } - errno = saved_errno; - return path; -} -#endif - -/** Expand possibly relative path fname to an absolute path. - * Return a newly allocated string, possibly equal to fname. */ -char * -make_path_absolute(char *fname) -{ -#ifdef _WIN32 - char *absfname_malloced = _fullpath(NULL, fname, 1); - - /* We don't want to assume that tor_free can free a string allocated - * with malloc. On failure, return fname (it's better than nothing). */ - char *absfname = tor_strdup(absfname_malloced ? absfname_malloced : fname); - if (absfname_malloced) free(absfname_malloced); - - return absfname; -#else - char *absfname = NULL, *path = NULL; - - tor_assert(fname); - - if (fname[0] == '/') { - absfname = tor_strdup(fname); - } else { - path = alloc_getcwd(); - if (path) { - tor_asprintf(&absfname, "%s/%s", path, fname); - tor_free(path); - } else { - /* If getcwd failed, the best we can do here is keep using the - * relative path. (Perhaps / isn't readable by this UID/GID.) */ - log_warn(LD_GENERAL, "Unable to find current working directory: %s", - strerror(errno)); - absfname = tor_strdup(fname); - } - } - return absfname; -#endif -} - -#ifndef HAVE__NSGETENVIRON -#ifndef HAVE_EXTERN_ENVIRON_DECLARED -/* Some platforms declare environ under some circumstances, others don't. */ -#ifndef RUNNING_DOXYGEN -extern char **environ; -#endif -#endif -#endif - -/** Return the current environment. This is a portable replacement for - * 'environ'. */ -char ** -get_environment(void) -{ -#ifdef HAVE__NSGETENVIRON - /* This is for compatibility between OSX versions. Otherwise (for example) - * when we do a mostly-static build on OSX 10.7, the resulting binary won't - * work on OSX 10.6. */ - return *_NSGetEnviron(); -#else - return environ; -#endif -} - -/** Set *addr to the IP address (in dotted-quad notation) stored in c. - * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), - * but works on Windows and Solaris.) - */ -int -tor_inet_aton(const char *str, struct in_addr* addr) -{ - unsigned a,b,c,d; - char more; - if (tor_sscanf(str, "%3u.%3u.%3u.%3u%c", &a,&b,&c,&d,&more) != 4) - return 0; - if (a > 255) return 0; - if (b > 255) return 0; - if (c > 255) return 0; - if (d > 255) return 0; - addr->s_addr = htonl((a<<24) | (b<<16) | (c<<8) | d); - return 1; -} - -/** Given af==AF_INET and src a struct in_addr, or - * af==AF_INET6 and src a struct in6_addr, try to format the - * address and store it in the len-byte buffer dst. Returns - * dst on success, NULL on failure. - * - * (Like inet_ntop(af,src,dst,len), but works on platforms that don't have it: - * Tor sometimes needs to format ipv6 addresses even on platforms without ipv6 - * support.) */ -const char * -tor_inet_ntop(int af, const void *src, char *dst, size_t len) -{ - if (af == AF_INET) { - if (tor_inet_ntoa(src, dst, len) < 0) - return NULL; - else - return dst; - } else if (af == AF_INET6) { - const struct in6_addr *addr = src; - char buf[64], *cp; - int longestGapLen = 0, longestGapPos = -1, i, - curGapPos = -1, curGapLen = 0; - uint16_t words[8]; - for (i = 0; i < 8; ++i) { - words[i] = (((uint16_t)addr->s6_addr[2*i])<<8) + addr->s6_addr[2*i+1]; - } - if (words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && - words[4] == 0 && ((words[5] == 0 && words[6] && words[7]) || - (words[5] == 0xffff))) { - /* This is an IPv4 address. */ - if (words[5] == 0) { - tor_snprintf(buf, sizeof(buf), "::%d.%d.%d.%d", - addr->s6_addr[12], addr->s6_addr[13], - addr->s6_addr[14], addr->s6_addr[15]); - } else { - tor_snprintf(buf, sizeof(buf), "::%x:%d.%d.%d.%d", words[5], - addr->s6_addr[12], addr->s6_addr[13], - addr->s6_addr[14], addr->s6_addr[15]); - } - if ((strlen(buf) + 1) > len) /* +1 for \0 */ - return NULL; - strlcpy(dst, buf, len); - return dst; - } - i = 0; - while (i < 8) { - if (words[i] == 0) { - curGapPos = i++; - curGapLen = 1; - while (i<8 && words[i] == 0) { - ++i; ++curGapLen; - } - if (curGapLen > longestGapLen) { - longestGapPos = curGapPos; - longestGapLen = curGapLen; - } - } else { - ++i; - } - } - if (longestGapLen<=1) - longestGapPos = -1; - - cp = buf; - for (i = 0; i < 8; ++i) { - if (words[i] == 0 && longestGapPos == i) { - if (i == 0) - *cp++ = ':'; - *cp++ = ':'; - while (i < 8 && words[i] == 0) - ++i; - --i; /* to compensate for loop increment. */ - } else { - tor_snprintf(cp, sizeof(buf)-(cp-buf), "%x", (unsigned)words[i]); - cp += strlen(cp); - if (i != 7) - *cp++ = ':'; - } - } - *cp = '\0'; - if ((strlen(buf) + 1) > len) /* +1 for \0 */ - return NULL; - strlcpy(dst, buf, len); - return dst; - } else { - return NULL; - } -} - -/** Given af==AF_INET or af==AF_INET6, and a string src - * encoding an IPv4 address or IPv6 address correspondingly, try to parse the - * address and store the result in dst (which must have space for a - * struct in_addr or a struct in6_addr, as appropriate). Return 1 on success, - * 0 on a bad parse, and -1 on a bad af. - * - * (Like inet_pton(af,src,dst) but works on platforms that don't have it: Tor - * sometimes needs to format ipv6 addresses even on platforms without ipv6 - * support.) */ -int -tor_inet_pton(int af, const char *src, void *dst) -{ - if (af == AF_INET) { - return tor_inet_aton(src, dst); - } else if (af == AF_INET6) { - struct in6_addr *out = dst; - uint16_t words[8]; - int gapPos = -1, i, setWords=0; - const char *dot = strchr(src, '.'); - const char *eow; /* end of words. */ - if (dot == src) - return 0; - else if (!dot) - eow = src+strlen(src); - else { - unsigned byte1,byte2,byte3,byte4; - char more; - for (eow = dot-1; eow >= src && TOR_ISDIGIT(*eow); --eow) - ; - ++eow; - - /* We use "scanf" because some platform inet_aton()s are too lax - * about IPv4 addresses of the form "1.2.3" */ - if (tor_sscanf(eow, "%3u.%3u.%3u.%3u%c", - &byte1,&byte2,&byte3,&byte4,&more) != 4) - return 0; - - if (byte1 > 255 || byte2 > 255 || byte3 > 255 || byte4 > 255) - return 0; - - words[6] = (byte1<<8) | byte2; - words[7] = (byte3<<8) | byte4; - setWords += 2; - } - - i = 0; - while (src < eow) { - if (i > 7) - return 0; - if (TOR_ISXDIGIT(*src)) { - char *next; - ssize_t len; - long r = strtol(src, &next, 16); - tor_assert(next != NULL); - tor_assert(next != src); - - len = *next == '\0' ? eow - src : next - src; - if (len > 4) - return 0; - if (len > 1 && !TOR_ISXDIGIT(src[1])) - return 0; /* 0x is not valid */ - - tor_assert(r >= 0); - tor_assert(r < 65536); - words[i++] = (uint16_t)r; - setWords++; - src = next; - if (*src != ':' && src != eow) - return 0; - ++src; - } else if (*src == ':' && i > 0 && gapPos == -1) { - gapPos = i; - ++src; - } else if (*src == ':' && i == 0 && src+1 < eow && src[1] == ':' && - gapPos == -1) { - gapPos = i; - src += 2; - } else { - return 0; - } - } - - if (setWords > 8 || - (setWords == 8 && gapPos != -1) || - (setWords < 8 && gapPos == -1)) - return 0; - - if (gapPos >= 0) { - int nToMove = setWords - (dot ? 2 : 0) - gapPos; - int gapLen = 8 - setWords; - tor_assert(nToMove >= 0); - memmove(&words[gapPos+gapLen], &words[gapPos], - sizeof(uint16_t)*nToMove); - memset(&words[gapPos], 0, sizeof(uint16_t)*gapLen); - } - for (i = 0; i < 8; ++i) { - out->s6_addr[2*i ] = words[i] >> 8; - out->s6_addr[2*i+1] = words[i] & 0xff; - } - - return 1; - } else { - return -1; - } -} - -/** Similar behavior to Unix gethostbyname: resolve name, and set - * *addr to the proper IP address, in host byte order. Returns 0 - * on success, -1 on failure; 1 on transient failure. - * - * (This function exists because standard windows gethostbyname - * doesn't treat raw IP addresses properly.) - */ -int -tor_lookup_hostname(const char *name, uint32_t *addr) -{ - tor_addr_t myaddr; - int ret; - - if ((ret = tor_addr_lookup(name, AF_INET, &myaddr))) - return ret; - - if (tor_addr_family(&myaddr) == AF_INET) { - *addr = tor_addr_to_ipv4h(&myaddr); - return ret; - } - - return -1; -} - -/** Hold the result of our call to uname. */ -static char uname_result[256]; -/** True iff uname_result is set. */ -static int uname_result_is_set = 0; - -/** Return a pointer to a description of our platform. - */ -const char * -get_uname(void) -{ -#ifdef HAVE_UNAME - struct utsname u; -#endif - if (!uname_result_is_set) { -#ifdef HAVE_UNAME - if (uname(&u) != -1) { - /* (Linux says 0 is success, Solaris says 1 is success) */ - strlcpy(uname_result, u.sysname, sizeof(uname_result)); - } else -#endif - { -#ifdef _WIN32 - OSVERSIONINFOEX info; - int i; - const char *plat = NULL; - static struct { - unsigned major; unsigned minor; const char *version; - } win_version_table[] = { - { 6, 2, "Windows 8" }, - { 6, 1, "Windows 7" }, - { 6, 0, "Windows Vista" }, - { 5, 2, "Windows Server 2003" }, - { 5, 1, "Windows XP" }, - { 5, 0, "Windows 2000" }, - /* { 4, 0, "Windows NT 4.0" }, */ - { 4, 90, "Windows Me" }, - { 4, 10, "Windows 98" }, - /* { 4, 0, "Windows 95" } */ - { 3, 51, "Windows NT 3.51" }, - { 0, 0, NULL } - }; - memset(&info, 0, sizeof(info)); - info.dwOSVersionInfoSize = sizeof(info); - if (! GetVersionEx((LPOSVERSIONINFO)&info)) { - strlcpy(uname_result, "Bizarre version of Windows where GetVersionEx" - " doesn't work.", sizeof(uname_result)); - uname_result_is_set = 1; - return uname_result; - } - if (info.dwMajorVersion == 4 && info.dwMinorVersion == 0) { - if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) - plat = "Windows NT 4.0"; - else - plat = "Windows 95"; - } else { - for (i=0; win_version_table[i].major>0; ++i) { - if (win_version_table[i].major == info.dwMajorVersion && - win_version_table[i].minor == info.dwMinorVersion) { - plat = win_version_table[i].version; - break; - } - } - } - if (plat) { - strlcpy(uname_result, plat, sizeof(uname_result)); - } else { - if (info.dwMajorVersion > 6 || - (info.dwMajorVersion==6 && info.dwMinorVersion>2)) - tor_snprintf(uname_result, sizeof(uname_result), - "Very recent version of Windows [major=%d,minor=%d]", - (int)info.dwMajorVersion,(int)info.dwMinorVersion); - else - tor_snprintf(uname_result, sizeof(uname_result), - "Unrecognized version of Windows [major=%d,minor=%d]", - (int)info.dwMajorVersion,(int)info.dwMinorVersion); - } -#if !defined (WINCE) -#ifdef VER_NT_SERVER - if (info.wProductType == VER_NT_SERVER || - info.wProductType == VER_NT_DOMAIN_CONTROLLER) { - strlcat(uname_result, " [server]", sizeof(uname_result)); - } -#endif -#endif -#else - strlcpy(uname_result, "Unknown platform", sizeof(uname_result)); -#endif - } - uname_result_is_set = 1; - } - return uname_result; -} - -/* - * Process control - */ - -#if defined(USE_PTHREADS) -/** Wraps a void (*)(void*) function and its argument so we can - * invoke them in a way pthreads would expect. - */ -typedef struct tor_pthread_data_t { - void (*func)(void *); - void *data; -} tor_pthread_data_t; -/** Given a tor_pthread_data_t _data, call _data->func(d->data) - * and free _data. Used to make sure we can call functions the way pthread - * expects. */ -static void * -tor_pthread_helper_fn(void *_data) -{ - tor_pthread_data_t *data = _data; - void (*func)(void*); - void *arg; - /* mask signals to worker threads to avoid SIGPIPE, etc */ - sigset_t sigs; - /* We're in a subthread; don't handle any signals here. */ - sigfillset(&sigs); - pthread_sigmask(SIG_SETMASK, &sigs, NULL); - - func = data->func; - arg = data->data; - tor_free(_data); - func(arg); - return NULL; -} -#endif - -/** Minimalist interface to run a void function in the background. On - * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. - * func should not return, but rather should call spawn_exit. - * - * NOTE: if data is used, it should not be allocated on the stack, - * since in a multithreaded environment, there is no way to be sure that - * the caller's stack will still be around when the called function is - * running. - */ -int -spawn_func(void (*func)(void *), void *data) -{ -#if defined(USE_WIN32_THREADS) - int rv; - rv = (int)_beginthread(func, 0, data); - if (rv == (int)-1) - return -1; - return 0; -#elif defined(USE_PTHREADS) - pthread_t thread; - tor_pthread_data_t *d; - d = tor_malloc(sizeof(tor_pthread_data_t)); - d->data = data; - d->func = func; - if (pthread_create(&thread,NULL,tor_pthread_helper_fn,d)) - return -1; - if (pthread_detach(thread)) - return -1; - return 0; -#else - pid_t pid; - pid = fork(); - if (pid<0) - return -1; - if (pid==0) { - /* Child */ - func(data); - tor_assert(0); /* Should never reach here. */ - return 0; /* suppress "control-reaches-end-of-non-void" warning. */ - } else { - /* Parent */ - return 0; - } -#endif -} - -/** End the current thread/process. - */ -void -spawn_exit(void) -{ -#if defined(USE_WIN32_THREADS) - _endthread(); - //we should never get here. my compiler thinks that _endthread returns, this - //is an attempt to fool it. - tor_assert(0); - _exit(0); -#elif defined(USE_PTHREADS) - pthread_exit(NULL); -#else - /* http://www.erlenstar.demon.co.uk/unix/faq_2.html says we should - * call _exit, not exit, from child processes. */ - _exit(0); -#endif -} - -/** Implementation logic for compute_num_cpus(). */ -static int -compute_num_cpus_impl(void) -{ -#ifdef _WIN32 - SYSTEM_INFO info; - memset(&info, 0, sizeof(info)); - GetSystemInfo(&info); - if (info.dwNumberOfProcessors >= 1 && info.dwNumberOfProcessors < INT_MAX) - return (int)info.dwNumberOfProcessors; - else - return -1; -#elif defined(HAVE_SYSCONF) -#ifdef _SC_NPROCESSORS_CONF - long cpus_conf = sysconf(_SC_NPROCESSORS_CONF); -#else - long cpus_conf = -1; -#endif -#ifdef _SC_NPROCESSORS_ONLN - long cpus_onln = sysconf(_SC_NPROCESSORS_ONLN); -#else - long cpus_onln = -1; -#endif - long cpus = -1; - - if (cpus_conf > 0 && cpus_onln < 0) { - cpus = cpus_conf; - } else if (cpus_onln > 0 && cpus_conf < 0) { - cpus = cpus_onln; - } else if (cpus_onln > 0 && cpus_conf > 0) { - if (cpus_onln < cpus_conf) { - log_notice(LD_GENERAL, "I think we have %ld CPUS, but only %ld of them " - "are available. Telling Tor to only use %ld. You can over" - "ride this with the NumCPUs option", - cpus_conf, cpus_onln, cpus_onln); - } - cpus = cpus_onln; - } - - if (cpus >= 1 && cpus < INT_MAX) - return (int)cpus; - else - return -1; -#else - return -1; -#endif -} - -#define MAX_DETECTABLE_CPUS 16 - -/** Return how many CPUs we are running with. We assume that nobody is - * using hot-swappable CPUs, so we don't recompute this after the first - * time. Return -1 if we don't know how to tell the number of CPUs on this - * system. - */ -int -compute_num_cpus(void) -{ - static int num_cpus = -2; - if (num_cpus == -2) { - num_cpus = compute_num_cpus_impl(); - tor_assert(num_cpus != -2); - if (num_cpus > MAX_DETECTABLE_CPUS) - log_notice(LD_GENERAL, "Wow! I detected that you have %d CPUs. I " - "will not autodetect any more than %d, though. If you " - "want to configure more, set NumCPUs in your torrc", - num_cpus, MAX_DETECTABLE_CPUS); - } - return num_cpus; -} - -/** Set *timeval to the current time of day. On error, log and terminate. - * (Same as gettimeofday(timeval,NULL), but never returns -1.) - */ -void -tor_gettimeofday(struct timeval *timeval) -{ -#ifdef _WIN32 - /* Epoch bias copied from perl: number of units between windows epoch and - * Unix epoch. */ -#define EPOCH_BIAS U64_LITERAL(116444736000000000) -#define UNITS_PER_SEC U64_LITERAL(10000000) -#define USEC_PER_SEC U64_LITERAL(1000000) -#define UNITS_PER_USEC U64_LITERAL(10) - union { - uint64_t ft_64; - FILETIME ft_ft; - } ft; -#if defined (WINCE) - /* wince do not have GetSystemTimeAsFileTime */ - SYSTEMTIME stime; - GetSystemTime(&stime); - SystemTimeToFileTime(&stime,&ft.ft_ft); -#else - /* number of 100-nsec units since Jan 1, 1601 */ - GetSystemTimeAsFileTime(&ft.ft_ft); -#endif - if (ft.ft_64 < EPOCH_BIAS) { - log_err(LD_GENERAL,"System time is before 1970; failing."); - exit(1); - } - ft.ft_64 -= EPOCH_BIAS; - timeval->tv_sec = (unsigned) (ft.ft_64 / UNITS_PER_SEC); - timeval->tv_usec = (unsigned) ((ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC); -#elif defined(HAVE_GETTIMEOFDAY) - if (gettimeofday(timeval, NULL)) { - log_err(LD_GENERAL,"gettimeofday failed."); - /* If gettimeofday dies, we have either given a bad timezone (we didn't), - or segfaulted.*/ - exit(1); - } -#elif defined(HAVE_FTIME) - struct timeb tb; - ftime(&tb); - timeval->tv_sec = tb.time; - timeval->tv_usec = tb.millitm * 1000; -#else -#error "No way to get time." -#endif - return; -} - -#if defined(TOR_IS_MULTITHREADED) && !defined(_WIN32) -/** Defined iff we need to add locks when defining fake versions of reentrant - * versions of time-related functions. */ -#define TIME_FNS_NEED_LOCKS -#endif - -/** Helper: Deal with confused or out-of-bounds values from localtime_r and - * friends. (On some platforms, they can give out-of-bounds values or can - * return NULL.) If islocal, this is a localtime result; otherwise - * it's from gmtime. The function returned r, when given timep - * as its input. If we need to store new results, store them in - * resultbuf. */ -static struct tm * -correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, - struct tm *r) -{ - const char *outcome; - - if (PREDICT_LIKELY(r)) { - if (r->tm_year > 8099) { /* We can't strftime dates after 9999 CE. */ - r->tm_year = 8099; - r->tm_mon = 11; - r->tm_mday = 31; - r->tm_yday = 365; - r->tm_hour = 23; - r->tm_min = 59; - r->tm_sec = 59; - } - return r; - } - - /* If we get here, gmtime or localtime returned NULL. It might have done - * this because of overrun or underrun, or it might have done it because of - * some other weird issue. */ - if (timep) { - if (*timep < 0) { - r = resultbuf; - r->tm_year = 70; /* 1970 CE */ - r->tm_mon = 0; - r->tm_mday = 1; - r->tm_yday = 1; - r->tm_hour = 0; - r->tm_min = 0 ; - r->tm_sec = 0; - outcome = "Rounding up to 1970"; - goto done; - } else if (*timep >= INT32_MAX) { - /* Rounding down to INT32_MAX isn't so great, but keep in mind that we - * only do it if gmtime/localtime tells us NULL. */ - r = resultbuf; - r->tm_year = 137; /* 2037 CE */ - r->tm_mon = 11; - r->tm_mday = 31; - r->tm_yday = 365; - r->tm_hour = 23; - r->tm_min = 59; - r->tm_sec = 59; - outcome = "Rounding down to 2037"; - goto done; - } - } - - /* If we get here, then gmtime/localtime failed without getting an extreme - * value for *timep */ - - tor_fragile_assert(); - r = resultbuf; - memset(resultbuf, 0, sizeof(struct tm)); - outcome="can't recover"; - done: - log_warn(LD_BUG, "%s("I64_FORMAT") failed with error %s: %s", - islocal?"localtime":"gmtime", - timep?I64_PRINTF_ARG(*timep):0, - strerror(errno), - outcome); - return r; -} - -/** @{ */ -/** As localtime_r, but defined for platforms that don't have it: - * - * Convert *timep to a struct tm in local time, and store the value in - * *result. Return the result on success, or NULL on failure. - */ -#ifdef HAVE_LOCALTIME_R -struct tm * -tor_localtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - r = localtime_r(timep, result); - return correct_tm(1, timep, result, r); -} -#elif defined(TIME_FNS_NEED_LOCKS) -struct tm * -tor_localtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - static tor_mutex_t *m=NULL; - if (!m) { m=tor_mutex_new(); } - tor_assert(result); - tor_mutex_acquire(m); - r = localtime(timep); - if (r) - memcpy(result, r, sizeof(struct tm)); - tor_mutex_release(m); - return correct_tm(1, timep, result, r); -} -#else -struct tm * -tor_localtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - tor_assert(result); - r = localtime(timep); - if (r) - memcpy(result, r, sizeof(struct tm)); - return correct_tm(1, timep, result, r); -} -#endif -/** @} */ - -/** @{ */ -/** As gmtimee_r, but defined for platforms that don't have it: - * - * Convert *timep to a struct tm in UTC, and store the value in - * *result. Return the result on success, or NULL on failure. - */ -#ifdef HAVE_GMTIME_R -struct tm * -tor_gmtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - r = gmtime_r(timep, result); - return correct_tm(0, timep, result, r); -} -#elif defined(TIME_FNS_NEED_LOCKS) -struct tm * -tor_gmtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - static tor_mutex_t *m=NULL; - if (!m) { m=tor_mutex_new(); } - tor_assert(result); - tor_mutex_acquire(m); - r = gmtime(timep); - if (r) - memcpy(result, r, sizeof(struct tm)); - tor_mutex_release(m); - return correct_tm(0, timep, result, r); -} -#else -struct tm * -tor_gmtime_r(const time_t *timep, struct tm *result) -{ - struct tm *r; - tor_assert(result); - r = gmtime(timep); - if (r) - memcpy(result, r, sizeof(struct tm)); - return correct_tm(0, timep, result, r); -} -#endif - -#if defined(USE_WIN32_THREADS) -void -tor_mutex_init(tor_mutex_t *m) -{ - InitializeCriticalSection(&m->mutex); -} -void -tor_mutex_uninit(tor_mutex_t *m) -{ - DeleteCriticalSection(&m->mutex); -} -void -tor_mutex_acquire(tor_mutex_t *m) -{ - tor_assert(m); - EnterCriticalSection(&m->mutex); -} -void -tor_mutex_release(tor_mutex_t *m) -{ - LeaveCriticalSection(&m->mutex); -} -unsigned long -tor_get_thread_id(void) -{ - return (unsigned long)GetCurrentThreadId(); -} -#elif defined(USE_PTHREADS) -/** A mutex attribute that we're going to use to tell pthreads that we want - * "reentrant" mutexes (i.e., once we can re-lock if we're already holding - * them.) */ -static pthread_mutexattr_t attr_reentrant; -/** True iff we've called tor_threads_init() */ -static int threads_initialized = 0; -/** Initialize mutex so it can be locked. Every mutex must be set - * up with tor_mutex_init() or tor_mutex_new(); not both. */ -void -tor_mutex_init(tor_mutex_t *mutex) -{ - int err; - if (PREDICT_UNLIKELY(!threads_initialized)) - tor_threads_init(); - err = pthread_mutex_init(&mutex->mutex, &attr_reentrant); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d creating a mutex.", err); - tor_fragile_assert(); - } -} -/** Wait until m is free, then acquire it. */ -void -tor_mutex_acquire(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_lock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d locking a mutex.", err); - tor_fragile_assert(); - } -} -/** Release the lock m so another thread can have it. */ -void -tor_mutex_release(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_unlock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d unlocking a mutex.", err); - tor_fragile_assert(); - } -} -/** Clean up the mutex m so that it no longer uses any system - * resources. Does not free m. This function must only be called on - * mutexes from tor_mutex_init(). */ -void -tor_mutex_uninit(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_destroy(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d destroying a mutex.", err); - tor_fragile_assert(); - } -} -/** Return an integer representing this thread. */ -unsigned long -tor_get_thread_id(void) -{ - union { - pthread_t thr; - unsigned long id; - } r; - r.thr = pthread_self(); - return r.id; -} -#endif - -#ifdef TOR_IS_MULTITHREADED -/** Return a newly allocated, ready-for-use mutex. */ -tor_mutex_t * -tor_mutex_new(void) -{ - tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); - tor_mutex_init(m); - return m; -} -/** Release all storage and system resources held by m. */ -void -tor_mutex_free(tor_mutex_t *m) -{ - if (!m) - return; - tor_mutex_uninit(m); - tor_free(m); -} -#endif - -/* Conditions. */ -#ifdef USE_PTHREADS -#if 0 -/** Cross-platform condition implementation. */ -struct tor_cond_t { - pthread_cond_t cond; -}; -/** Return a newly allocated condition, with nobody waiting on it. */ -tor_cond_t * -tor_cond_new(void) -{ - tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); - if (pthread_cond_init(&cond->cond, NULL)) { - tor_free(cond); - return NULL; - } - return cond; -} -/** Release all resources held by cond. */ -void -tor_cond_free(tor_cond_t *cond) -{ - if (!cond) - return; - if (pthread_cond_destroy(&cond->cond)) { - log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); - return; - } - tor_free(cond); -} -/** Wait until one of the tor_cond_signal functions is called on cond. - * All waiters on the condition must wait holding the same mutex. - * Returns 0 on success, negative on failure. */ -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) -{ - return pthread_cond_wait(&cond->cond, &mutex->mutex) ? -1 : 0; -} -/** Wake up one of the waiters on cond. */ -void -tor_cond_signal_one(tor_cond_t *cond) -{ - pthread_cond_signal(&cond->cond); -} -/** Wake up all of the waiters on cond. */ -void -tor_cond_signal_all(tor_cond_t *cond) -{ - pthread_cond_broadcast(&cond->cond); -} -#endif -/** Set up common structures for use by threading. */ -void -tor_threads_init(void) -{ - if (!threads_initialized) { - pthread_mutexattr_init(&attr_reentrant); - pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); - threads_initialized = 1; - set_main_thread(); - } -} -#elif defined(USE_WIN32_THREADS) -#if 0 -static DWORD cond_event_tls_index; -struct tor_cond_t { - CRITICAL_SECTION mutex; - smartlist_t *events; -}; -tor_cond_t * -tor_cond_new(void) -{ - tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); - InitializeCriticalSection(&cond->mutex); - cond->events = smartlist_new(); - return cond; -} -void -tor_cond_free(tor_cond_t *cond) -{ - if (!cond) - return; - DeleteCriticalSection(&cond->mutex); - /* XXXX notify? */ - smartlist_free(cond->events); - tor_free(cond); -} -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) -{ - HANDLE event; - int r; - tor_assert(cond); - tor_assert(mutex); - event = TlsGetValue(cond_event_tls_index); - if (!event) { - event = CreateEvent(0, FALSE, FALSE, NULL); - TlsSetValue(cond_event_tls_index, event); - } - EnterCriticalSection(&cond->mutex); - - tor_assert(WaitForSingleObject(event, 0) == WAIT_TIMEOUT); - tor_assert(!smartlist_contains(cond->events, event)); - smartlist_add(cond->events, event); - - LeaveCriticalSection(&cond->mutex); - - tor_mutex_release(mutex); - r = WaitForSingleObject(event, INFINITE); - tor_mutex_acquire(mutex); - - switch (r) { - case WAIT_OBJECT_0: /* we got the mutex normally. */ - break; - case WAIT_ABANDONED: /* holding thread exited. */ - case WAIT_TIMEOUT: /* Should never happen. */ - tor_assert(0); - break; - case WAIT_FAILED: - log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError()); - } - return 0; -} -void -tor_cond_signal_one(tor_cond_t *cond) -{ - HANDLE event; - tor_assert(cond); - - EnterCriticalSection(&cond->mutex); - - if ((event = smartlist_pop_last(cond->events))) - SetEvent(event); - - LeaveCriticalSection(&cond->mutex); -} -void -tor_cond_signal_all(tor_cond_t *cond) -{ - tor_assert(cond); - - EnterCriticalSection(&cond->mutex); - SMARTLIST_FOREACH(cond->events, HANDLE, event, SetEvent(event)); - smartlist_clear(cond->events); - LeaveCriticalSection(&cond->mutex); -} -#endif -void -tor_threads_init(void) -{ -#if 0 - cond_event_tls_index = TlsAlloc(); -#endif - set_main_thread(); -} -#endif - -#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) -/** Attempt to raise the current and max rlimit to infinity for our process. - * This only needs to be done once and can probably only be done when we have - * not already dropped privileges. - */ -static int -tor_set_max_memlock(void) -{ - /* Future consideration for Windows is probably SetProcessWorkingSetSize - * This is similar to setting the memory rlimit of RLIMIT_MEMLOCK - * http://msdn.microsoft.com/en-us/library/ms686234(VS.85).aspx - */ - - struct rlimit limit; - - /* RLIM_INFINITY is -1 on some platforms. */ - limit.rlim_cur = RLIM_INFINITY; - limit.rlim_max = RLIM_INFINITY; - - if (setrlimit(RLIMIT_MEMLOCK, &limit) == -1) { - if (errno == EPERM) { - log_warn(LD_GENERAL, "You appear to lack permissions to change memory " - "limits. Are you root?"); - } - log_warn(LD_GENERAL, "Unable to raise RLIMIT_MEMLOCK: %s", - strerror(errno)); - return -1; - } - - return 0; -} -#endif - -/** Attempt to lock all current and all future memory pages. - * This should only be called once and while we're privileged. - * Like mlockall() we return 0 when we're successful and -1 when we're not. - * Unlike mlockall() we return 1 if we've already attempted to lock memory. - */ -int -tor_mlockall(void) -{ - static int memory_lock_attempted = 0; - - if (memory_lock_attempted) { - return 1; - } - - memory_lock_attempted = 1; - - /* - * Future consideration for Windows may be VirtualLock - * VirtualLock appears to implement mlock() but not mlockall() - * - * http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx - */ - -#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) - if (tor_set_max_memlock() == 0) { - log_debug(LD_GENERAL, "RLIMIT_MEMLOCK is now set to RLIM_INFINITY."); - } - - if (mlockall(MCL_CURRENT|MCL_FUTURE) == 0) { - log_info(LD_GENERAL, "Insecure OS paging is effectively disabled."); - return 0; - } else { - if (errno == ENOSYS) { - /* Apple - it's 2009! I'm looking at you. Grrr. */ - log_notice(LD_GENERAL, "It appears that mlockall() is not available on " - "your platform."); - } else if (errno == EPERM) { - log_notice(LD_GENERAL, "It appears that you lack the permissions to " - "lock memory. Are you root?"); - } - log_notice(LD_GENERAL, "Unable to lock all current and future memory " - "pages: %s", strerror(errno)); - return -1; - } -#else - log_warn(LD_GENERAL, "Unable to lock memory pages. mlockall() unsupported?"); - return -1; -#endif -} - -/** Identity of the "main" thread */ -static unsigned long main_thread_id = -1; - -/** Start considering the current thread to be the 'main thread'. This has - * no effect on anything besides in_main_thread(). */ -void -set_main_thread(void) -{ - main_thread_id = tor_get_thread_id(); -} -/** Return true iff called from the main thread. */ -int -in_main_thread(void) -{ - return main_thread_id == tor_get_thread_id(); -} - -/** - * On Windows, WSAEWOULDBLOCK is not always correct: when you see it, - * you need to ask the socket for its actual errno. Also, you need to - * get your errors from WSAGetLastError, not errno. (If you supply a - * socket of -1, we check WSAGetLastError, but don't correct - * WSAEWOULDBLOCKs.) - * - * The upshot of all of this is that when a socket call fails, you - * should call tor_socket_errno at most once on the failing - * socket to get the error. - */ -#if defined(_WIN32) -int -tor_socket_errno(tor_socket_t sock) -{ - int optval, optvallen=sizeof(optval); - int err = WSAGetLastError(); - if (err == WSAEWOULDBLOCK && SOCKET_OK(sock)) { - if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&optval, &optvallen)) - return err; - if (optval) - return optval; - } - return err; -} -#endif - -#if defined(_WIN32) -#define E(code, s) { code, (s " [" #code " ]") } -struct { int code; const char *msg; } windows_socket_errors[] = { - E(WSAEINTR, "Interrupted function call"), - E(WSAEACCES, "Permission denied"), - E(WSAEFAULT, "Bad address"), - E(WSAEINVAL, "Invalid argument"), - E(WSAEMFILE, "Too many open files"), - E(WSAEWOULDBLOCK, "Resource temporarily unavailable"), - E(WSAEINPROGRESS, "Operation now in progress"), - E(WSAEALREADY, "Operation already in progress"), - E(WSAENOTSOCK, "Socket operation on nonsocket"), - E(WSAEDESTADDRREQ, "Destination address required"), - E(WSAEMSGSIZE, "Message too long"), - E(WSAEPROTOTYPE, "Protocol wrong for socket"), - E(WSAENOPROTOOPT, "Bad protocol option"), - E(WSAEPROTONOSUPPORT, "Protocol not supported"), - E(WSAESOCKTNOSUPPORT, "Socket type not supported"), - /* What's the difference between NOTSUPP and NOSUPPORT? :) */ - E(WSAEOPNOTSUPP, "Operation not supported"), - E(WSAEPFNOSUPPORT, "Protocol family not supported"), - E(WSAEAFNOSUPPORT, "Address family not supported by protocol family"), - E(WSAEADDRINUSE, "Address already in use"), - E(WSAEADDRNOTAVAIL, "Cannot assign requested address"), - E(WSAENETDOWN, "Network is down"), - E(WSAENETUNREACH, "Network is unreachable"), - E(WSAENETRESET, "Network dropped connection on reset"), - E(WSAECONNABORTED, "Software caused connection abort"), - E(WSAECONNRESET, "Connection reset by peer"), - E(WSAENOBUFS, "No buffer space available"), - E(WSAEISCONN, "Socket is already connected"), - E(WSAENOTCONN, "Socket is not connected"), - E(WSAESHUTDOWN, "Cannot send after socket shutdown"), - E(WSAETIMEDOUT, "Connection timed out"), - E(WSAECONNREFUSED, "Connection refused"), - E(WSAEHOSTDOWN, "Host is down"), - E(WSAEHOSTUNREACH, "No route to host"), - E(WSAEPROCLIM, "Too many processes"), - /* Yes, some of these start with WSA, not WSAE. No, I don't know why. */ - E(WSASYSNOTREADY, "Network subsystem is unavailable"), - E(WSAVERNOTSUPPORTED, "Winsock.dll out of range"), - E(WSANOTINITIALISED, "Successful WSAStartup not yet performed"), - E(WSAEDISCON, "Graceful shutdown now in progress"), -#ifdef WSATYPE_NOT_FOUND - E(WSATYPE_NOT_FOUND, "Class type not found"), -#endif - E(WSAHOST_NOT_FOUND, "Host not found"), - E(WSATRY_AGAIN, "Nonauthoritative host not found"), - E(WSANO_RECOVERY, "This is a nonrecoverable error"), - E(WSANO_DATA, "Valid name, no data record of requested type)"), - - /* There are some more error codes whose numeric values are marked - * OS dependent. They start with WSA_, apparently for the same - * reason that practitioners of some craft traditions deliberately - * introduce imperfections into their baskets and rugs "to allow the - * evil spirits to escape." If we catch them, then our binaries - * might not report consistent results across versions of Windows. - * Thus, I'm going to let them all fall through. - */ - { -1, NULL }, -}; -/** There does not seem to be a strerror equivalent for Winsock errors. - * Naturally, we have to roll our own. - */ -const char * -tor_socket_strerror(int e) -{ - int i; - for (i=0; windows_socket_errors[i].code >= 0; ++i) { - if (e == windows_socket_errors[i].code) - return windows_socket_errors[i].msg; - } - return strerror(e); -} -#endif - -/** Called before we make any calls to network-related functions. - * (Some operating systems require their network libraries to be - * initialized.) */ -int -network_init(void) -{ -#ifdef _WIN32 - /* This silly exercise is necessary before windows will allow - * gethostbyname to work. */ - WSADATA WSAData; - int r; - r = WSAStartup(0x101,&WSAData); - if (r) { - log_warn(LD_NET,"Error initializing windows network layer: code was %d",r); - return -1; - } - if (sizeof(SOCKET) != sizeof(tor_socket_t)) { - log_warn(LD_BUG,"The tor_socket_t type does not match SOCKET in size; Tor " - "might not work. (Sizes are %d and %d respectively.)", - (int)sizeof(tor_socket_t), (int)sizeof(SOCKET)); - } - /* WSAData.iMaxSockets might show the max sockets we're allowed to use. - * We might use it to complain if we're trying to be a server but have - * too few sockets available. */ -#endif - return 0; -} - -#ifdef _WIN32 -/** Return a newly allocated string describing the windows system error code - * err. Note that error codes are different from errno. Error codes - * come from GetLastError() when a winapi call fails. errno is set only when - * ANSI functions fail. Whee. */ -char * -format_win32_error(DWORD err) -{ - TCHAR *str = NULL; - char *result; - DWORD n; - - /* Somebody once decided that this interface was better than strerror(). */ - n = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPVOID)&str, - 0, NULL); - - if (str && n) { -#ifdef UNICODE - size_t len; - if (n > 128*1024) - len = (128 * 1024) * 2 + 1; /* This shouldn't be possible, but let's - * make sure. */ - else - len = n * 2 + 1; - result = tor_malloc(len); - wcstombs(result,str,len); - result[len-1] = '\0'; -#else - result = tor_strdup(str); -#endif - } else { - result = tor_strdup(""); - } - if (str) { - LocalFree(str); /* LocalFree != free() */ - } - return result; -} -#endif - diff --git a/src/tor/compat_libevent.c b/src/tor/compat_libevent.c deleted file mode 100644 index 58ec08cf1..000000000 --- a/src/tor/compat_libevent.c +++ /dev/null @@ -1,663 +0,0 @@ -/* Copyright (c) 2009-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file compat_libevent.c - * \brief Wrappers to handle porting between different versions of libevent. - * - * In an ideal world, we'd just use Libevent 2.0 from now on. But as of June - * 2012, Libevent 1.4 is still all over, and some poor souls are stuck on - * Libevent 1.3e. */ - -#include "orconfig.h" -#include "tor_compat.h" -#include "compat_libevent.h" - -#include "tor_util.h" -#include "torlog.h" - -#ifdef HAVE_EVENT2_EVENT_H -#include -#include -#ifdef USE_BUFFEREVENTS -#include -#endif -#else -#include -#endif - -/** A number representing a version of Libevent. - - This is a 4-byte number, with the first three bytes representing the - major, minor, and patchlevel respectively of the library. The fourth - byte is unused. - - This is equivalent to the format of LIBEVENT_VERSION_NUMBER on Libevent - 2.0.1 or later. For versions of Libevent before 1.4.0, which followed the - format of "1.0, 1.0a, 1.0b", we define 1.0 to be equivalent to 1.0.0, 1.0a - to be equivalent to 1.0.1, and so on. -*/ -typedef uint32_t le_version_t; - -/** @{ */ -/** Macros: returns the number of a libevent version as a le_version_t */ -#define V(major, minor, patch) \ - (((major) << 24) | ((minor) << 16) | ((patch) << 8)) -#define V_OLD(major, minor, patch) \ - V((major), (minor), (patch)-'a'+1) -/** @} */ - -/** Represetns a version of libevent so old we can't figure out what version - * it is. */ -#define LE_OLD V(0,0,0) -/** Represents a version of libevent so weird we can't figure out what version - * it is. */ -#define LE_OTHER V(0,0,99) - -#if 0 -static le_version_t tor_get_libevent_version(const char **v_out); -#endif - -#if defined(HAVE_EVENT_SET_LOG_CALLBACK) || defined(RUNNING_DOXYGEN) -/** A string which, if it appears in a libevent log, should be ignored. */ -static const char *suppress_msg = NULL; -/** Callback function passed to event_set_log() so we can intercept - * log messages from libevent. */ -static void -libevent_logging_callback(int severity, const char *msg) -{ - char buf[1024]; - size_t n; - if (suppress_msg && strstr(msg, suppress_msg)) - return; - n = strlcpy(buf, msg, sizeof(buf)); - if (n && n < sizeof(buf) && buf[n-1] == '\n') { - buf[n-1] = '\0'; - } - switch (severity) { - case _EVENT_LOG_DEBUG: - log_debug(LD_NOCB|LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_MSG: - log_info(LD_NOCB|LD_NET, "Message from libevent: %s", buf); - break; - case _EVENT_LOG_WARN: - log_warn(LD_NOCB|LD_GENERAL, "Warning from libevent: %s", buf); - break; - case _EVENT_LOG_ERR: - log_err(LD_NOCB|LD_GENERAL, "Error from libevent: %s", buf); - break; - default: - log_warn(LD_NOCB|LD_GENERAL, "Message [%d] from libevent: %s", - severity, buf); - break; - } -} -/** Set hook to intercept log messages from libevent. */ -void -configure_libevent_logging(void) -{ - event_set_log_callback(libevent_logging_callback); -} -/** Ignore any libevent log message that contains msg. */ -void -suppress_libevent_log_msg(const char *msg) -{ - suppress_msg = msg; -} -#else -void -configure_libevent_logging(void) -{ -} -void -suppress_libevent_log_msg(const char *msg) -{ - (void)msg; -} -#endif - -#ifndef HAVE_EVENT2_EVENT_H -/** Work-alike replacement for event_new() on pre-Libevent-2.0 systems. */ -struct event * -tor_event_new(struct event_base *base, int sock, short what, - void (*cb)(int, short, void *), void *arg) -{ - struct event *e = tor_malloc_zero(sizeof(struct event)); - event_set(e, sock, what, cb, arg); - if (! base) - base = tor_libevent_get_base(); - event_base_set(base, e); - return e; -} -/** Work-alike replacement for evtimer_new() on pre-Libevent-2.0 systems. */ -struct event * -tor_evtimer_new(struct event_base *base, - void (*cb)(int, short, void *), void *arg) -{ - return tor_event_new(base, -1, 0, cb, arg); -} -/** Work-alike replacement for evsignal_new() on pre-Libevent-2.0 systems. */ -struct event * -tor_evsignal_new(struct event_base * base, int sig, - void (*cb)(int, short, void *), void *arg) -{ - return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg); -} -/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */ -void -tor_event_free(struct event *ev) -{ - event_del(ev); - tor_free(ev); -} -#endif - -/** Global event base for use by the main thread. */ -struct event_base *the_event_base = NULL; - -/* This is what passes for version detection on OSX. We set - * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before - * 10.4.0 (aka 1040). */ -#ifdef __APPLE__ -#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ -#define MACOSX_KQUEUE_IS_BROKEN \ - (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040) -#else -#define MACOSX_KQUEUE_IS_BROKEN 0 -#endif -#endif - -#ifdef USE_BUFFEREVENTS -static int using_iocp_bufferevents = 0; -static void tor_libevent_set_tick_timeout(int msec_per_tick); - -int -tor_libevent_using_iocp_bufferevents(void) -{ - return using_iocp_bufferevents; -} -#endif - -/** Initialize the Libevent library and set up the event base. */ -void -tor_libevent_initialize(tor_libevent_cfg *torcfg) -{ - tor_assert(the_event_base == NULL); - /* some paths below don't use torcfg, so avoid unused variable warnings */ - (void)torcfg; - -#ifdef HAVE_EVENT2_EVENT_H - { - int attempts = 0; - int using_threads; - struct event_config *cfg; - - retry: - ++attempts; - using_threads = 0; - cfg = event_config_new(); - tor_assert(cfg); - -#if defined(_WIN32) && defined(USE_BUFFEREVENTS) - if (! torcfg->disable_iocp) { - evthread_use_windows_threads(); - event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP); - using_iocp_bufferevents = 1; - using_threads = 1; - } else { - using_iocp_bufferevents = 0; - } -#endif - - if (!using_threads) { - /* Telling Libevent not to try to turn locking on can avoid a needless - * socketpair() attempt. */ - event_config_set_flag(cfg, EVENT_BASE_FLAG_NOLOCK); - } - -#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,0,7) - if (torcfg->num_cpus > 0) - event_config_set_num_cpus_hint(cfg, torcfg->num_cpus); -#endif - -#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) - /* We can enable changelist support with epoll, since we don't give - * Libevent any dup'd fds. This lets us avoid some syscalls. */ - event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); -#endif - - the_event_base = event_base_new_with_config(cfg); - - event_config_free(cfg); - - if (using_threads && the_event_base == NULL && attempts < 2) { - /* This could be a socketpair() failure, which can happen sometimes on - * windows boxes with obnoxious firewall rules. Downgrade and try - * again. */ -#if defined(_WIN32) && defined(USE_BUFFEREVENTS) - if (torcfg->disable_iocp == 0) { - log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again " - "with IOCP disabled."); - } else -#endif - { - log_warn(LD_GENERAL, "Unable to initialize Libevent. Trying again."); - } - - torcfg->disable_iocp = 1; - goto retry; - } - } -#else - the_event_base = event_init(); -#endif - - if (!the_event_base) { - log_err(LD_GENERAL, "Unable to initialize Libevent: cannot continue."); - exit(1); - } - -#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD) - /* Making this a NOTICE for now so we can link bugs to a libevent versions - * or methods better. */ - log_info(LD_GENERAL, - "Initialized libevent version %s using method %s. Good.", - event_get_version(), tor_libevent_get_method()); -#else - log_notice(LD_GENERAL, - "Initialized old libevent (version 1.0b or earlier)."); - log_warn(LD_GENERAL, - "You have a *VERY* old version of libevent. It is likely to be buggy; " - "please build Tor with a more recent version."); -#endif - -#ifdef USE_BUFFEREVENTS - tor_libevent_set_tick_timeout(torcfg->msec_per_tick); -#endif -} - -/** Return the current Libevent event base that we're set up to use. */ -struct event_base * -tor_libevent_get_base(void) -{ - return the_event_base; -} - -#ifndef HAVE_EVENT_BASE_LOOPEXIT -/** Replacement for event_base_loopexit on some very old versions of Libevent - * that we are not yet brave enough to deprecate. */ -int -tor_event_base_loopexit(struct event_base *base, struct timeval *tv) -{ - tor_assert(base == the_event_base); - return event_loopexit(tv); -} -#endif - -/** Return the name of the Libevent backend we're using. */ -const char * -tor_libevent_get_method(void) -{ -#ifdef HAVE_EVENT2_EVENT_H - return event_base_get_method(the_event_base); -#elif defined(HAVE_EVENT_GET_METHOD) - return event_get_method(); -#else - return ""; -#endif -} - -/** Return the le_version_t for the version of libevent specified in the - * string v. If the version is very new or uses an unrecognized - * version, format, return LE_OTHER. */ -static le_version_t -tor_decode_libevent_version(const char *v) -{ - unsigned major, minor, patchlevel; - char c, e, extra; - int fields; - - /* Try the new preferred "1.4.11-stable" format. - * Also accept "1.4.14b-stable". */ - fields = tor_sscanf(v, "%u.%u.%u%c%c", &major, &minor, &patchlevel, &c, &e); - if (fields == 3 || - ((fields == 4 || fields == 5 ) && (c == '-' || c == '_')) || - (fields == 5 && TOR_ISALPHA(c) && (e == '-' || e == '_'))) { - return V(major,minor,patchlevel); - } - - /* Try the old "1.3e" format. */ - fields = tor_sscanf(v, "%u.%u%c%c", &major, &minor, &c, &extra); - if (fields == 3 && TOR_ISALPHA(c)) { - return V_OLD(major, minor, c); - } else if (fields == 2) { - return V(major, minor, 0); - } - - return LE_OTHER; -} - -/** Return an integer representing the binary interface of a Libevent library. - * Two different versions with different numbers are sure not to be binary - * compatible. Two different versions with the same numbers have a decent - * chance of binary compatibility.*/ -static int -le_versions_compatibility(le_version_t v) -{ - if (v == LE_OTHER) - return 0; - if (v < V_OLD(1,0,'c')) - return 1; - else if (v < V(1,4,0)) - return 2; - else if (v < V(1,4,99)) - return 3; - else if (v < V(2,0,1)) - return 4; - else /* Everything 2.0 and later should be compatible. */ - return 5; -} - -#if 0 -/** Return the version number of the currently running version of Libevent. - * See le_version_t for info on the format. - */ -static le_version_t -tor_get_libevent_version(const char **v_out) -{ - const char *v; - le_version_t r; -#if defined(HAVE_EVENT_GET_VERSION_NUMBER) - v = event_get_version(); - r = event_get_version_number(); -#elif defined (HAVE_EVENT_GET_VERSION) - v = event_get_version(); - r = tor_decode_libevent_version(v); -#else - v = "pre-1.0c"; - r = LE_OLD; -#endif - if (v_out) - *v_out = v; - return r; -} -#endif - -/** Return a string representation of the version of the currently running - * version of Libevent. */ -const char * -tor_libevent_get_version_str(void) -{ -#ifdef HAVE_EVENT_GET_VERSION - return event_get_version(); -#else - return "pre-1.0c"; -#endif -} - -/** - * Compare the current Libevent method and version to a list of versions - * which are known not to work. Warn the user as appropriate. - */ -void -tor_check_libevent_version(const char *m, int server, - const char **badness_out) -{ - (void) m; - (void) server; - *badness_out = NULL; -} - -#if defined(LIBEVENT_VERSION) -#define HEADER_VERSION LIBEVENT_VERSION -#elif defined(_EVENT_VERSION) -#define HEADER_VERSION _EVENT_VERSION -#endif - -/** Return a string representation of the version of Libevent that was used -* at compilation time. */ -const char * -tor_libevent_get_header_version_str(void) -{ - return HEADER_VERSION; -} - -/** See whether the headers we were built against differ from the library we - * linked against so much that we're likely to crash. If so, warn the - * user. */ -void -tor_check_libevent_header_compatibility(void) -{ - (void) le_versions_compatibility; - (void) tor_decode_libevent_version; - - /* In libevent versions before 2.0, it's hard to keep binary compatibility - * between upgrades, and unpleasant to detect when the version we compiled - * against is unlike the version we have linked against. Here's how. */ -#if defined(HEADER_VERSION) && defined(HAVE_EVENT_GET_VERSION) - /* We have a header-file version and a function-call version. Easy. */ - if (strcmp(HEADER_VERSION, event_get_version())) { - le_version_t v1, v2; - int compat1 = -1, compat2 = -1; - int verybad; - v1 = tor_decode_libevent_version(HEADER_VERSION); - v2 = tor_decode_libevent_version(event_get_version()); - compat1 = le_versions_compatibility(v1); - compat2 = le_versions_compatibility(v2); - - verybad = compat1 != compat2; - - tor_log(verybad ? LOG_WARN : LOG_NOTICE, - LD_GENERAL, "We were compiled with headers from version %s " - "of Libevent, but we're using a Libevent library that says it's " - "version %s.", HEADER_VERSION, event_get_version()); - if (verybad) - log_warn(LD_GENERAL, "This will almost certainly make Tor crash."); - else - log_info(LD_GENERAL, "I think these versions are binary-compatible."); - } -#elif defined(HAVE_EVENT_GET_VERSION) - /* event_get_version but no _EVENT_VERSION. We might be in 1.4.0-beta or - earlier, where that's normal. To see whether we were compiled with an - earlier version, let's see whether the struct event defines MIN_HEAP_IDX. - */ -#ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX - /* The header files are 1.4.0-beta or later. If the version is not - * 1.4.0-beta, we are incompatible. */ - { - if (strcmp(event_get_version(), "1.4.0-beta")) { - log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " - "Libevent 1.4.0-beta header files, whereas you have linked " - "against Libevent %s. This will probably make Tor crash.", - event_get_version()); - } - } -#else - /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or - later, we're probably fine. */ - { - const char *v = event_get_version(); - if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') { - log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have " - "Libevent header file from 1.3e or earlier, whereas you have " - "linked against Libevent %s. This will probably make Tor " - "crash.", event_get_version()); - } - } -#endif - -#elif defined(HEADER_VERSION) -#warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd." -#else - /* Your libevent is ancient. */ -#endif -} - -/* - If possible, we're going to try to use Libevent's periodic timer support, - since it does a pretty good job of making sure that periodic events get - called exactly M seconds apart, rather than starting each one exactly M - seconds after the time that the last one was run. - */ -#ifdef HAVE_EVENT2_EVENT_H -#define HAVE_PERIODIC -#define PERIODIC_FLAGS EV_PERSIST -#else -#define PERIODIC_FLAGS 0 -#endif - -/** Represents a timer that's run every N microseconds by Libevent. */ -struct periodic_timer_t { - /** Underlying event used to implement this periodic event. */ - struct event *ev; - /** The callback we'll be invoking whenever the event triggers */ - void (*cb)(struct periodic_timer_t *, void *); - /** User-supplied data for the callback */ - void *data; -#ifndef HAVE_PERIODIC - /** If Libevent doesn't know how to invoke events every N microseconds, - * we'll need to remember the timeout interval here. */ - struct timeval tv; -#endif -}; - -/** Libevent callback to implement a periodic event. */ -static void -periodic_timer_cb(evutil_socket_t fd, short what, void *arg) -{ - periodic_timer_t *timer = arg; - (void) what; - (void) fd; -#ifndef HAVE_PERIODIC - /** reschedule the event as needed. */ - event_add(timer->ev, &timer->tv); -#endif - timer->cb(timer, timer->data); -} - -/** Create and schedule a new timer that will run every tv in - * the event loop of base. When the timer fires, it will - * run the timer in cb with the user-supplied data in data. */ -periodic_timer_t * -periodic_timer_new(struct event_base *base, - const struct timeval *tv, - void (*cb)(periodic_timer_t *timer, void *data), - void *data) -{ - periodic_timer_t *timer; - tor_assert(base); - tor_assert(tv); - tor_assert(cb); - timer = tor_malloc_zero(sizeof(periodic_timer_t)); - if (!(timer->ev = tor_event_new(base, -1, PERIODIC_FLAGS, - periodic_timer_cb, timer))) { - tor_free(timer); - return NULL; - } - timer->cb = cb; - timer->data = data; -#ifndef HAVE_PERIODIC - memcpy(&timer->tv, tv, sizeof(struct timeval)); -#endif - event_add(timer->ev, (struct timeval *)tv); /*drop const for old libevent*/ - return timer; -} - -/** Stop and free a periodic timer */ -void -periodic_timer_free(periodic_timer_t *timer) -{ - if (!timer) - return; - tor_event_free(timer->ev); - tor_free(timer); -} - -#ifdef USE_BUFFEREVENTS -static const struct timeval *one_tick = NULL; -/** - * Return a special timeout to be passed whenever libevent's O(1) timeout - * implementation should be used. Only use this when the timer is supposed - * to fire after msec_per_tick ticks have elapsed. -*/ -const struct timeval * -tor_libevent_get_one_tick_timeout(void) -{ - tor_assert(one_tick); - return one_tick; -} - -/** Initialize the common timeout that we'll use to refill the buckets every - * time a tick elapses. */ -static void -tor_libevent_set_tick_timeout(int msec_per_tick) -{ - struct event_base *base = tor_libevent_get_base(); - struct timeval tv; - - tor_assert(! one_tick); - tv.tv_sec = msec_per_tick / 1000; - tv.tv_usec = (msec_per_tick % 1000) * 1000; - one_tick = event_base_init_common_timeout(base, &tv); -} - -static struct bufferevent * -tor_get_root_bufferevent(struct bufferevent *bev) -{ - struct bufferevent *u; - while ((u = bufferevent_get_underlying(bev)) != NULL) - bev = u; - return bev; -} - -int -tor_set_bufferevent_rate_limit(struct bufferevent *bev, - struct ev_token_bucket_cfg *cfg) -{ - return bufferevent_set_rate_limit(tor_get_root_bufferevent(bev), cfg); -} - -int -tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev, - struct bufferevent_rate_limit_group *g) -{ - return bufferevent_add_to_rate_limit_group(tor_get_root_bufferevent(bev), g); -} -#endif - -#if defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER >= V(2,1,1) -void -tor_gettimeofday_cached(struct timeval *tv) -{ - event_base_gettimeofday_cached(the_event_base, tv); -} -void -tor_gettimeofday_cache_clear(void) -{ - event_base_update_cache_time(the_event_base); -} -#else -/** Cache the current hi-res time; the cache gets reset when libevent - * calls us. */ -static struct timeval cached_time_hires = {0, 0}; - -/** Return a fairly recent view of the current time. */ -void -tor_gettimeofday_cached(struct timeval *tv) -{ - if (cached_time_hires.tv_sec == 0) { - tor_gettimeofday(&cached_time_hires); - } - *tv = cached_time_hires; -} - -/** Reset the cached view of the current time, so that the next time we try - * to learn it, we will get an up-to-date value. */ -void -tor_gettimeofday_cache_clear(void) -{ - cached_time_hires.tv_sec = 0; -} -#endif - diff --git a/src/tor/compat_libevent.h b/src/tor/compat_libevent.h deleted file mode 100644 index fda873359..000000000 --- a/src/tor/compat_libevent.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 2009-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_COMPAT_LIBEVENT_H -#define TOR_COMPAT_LIBEVENT_H - -#include "orconfig.h" - -struct event; -struct event_base; -#ifdef USE_BUFFEREVENTS -struct bufferevent; -struct ev_token_bucket_cfg; -struct bufferevent_rate_limit_group; -#endif - -#ifdef HAVE_EVENT2_EVENT_H -#include -#elif !defined(EVUTIL_SOCKET_DEFINED) -#define EVUTIL_SOCKET_DEFINED -#define evutil_socket_t int -#endif - -void configure_libevent_logging(void); -void suppress_libevent_log_msg(const char *msg); - -#ifdef HAVE_EVENT2_EVENT_H -#define tor_event_new event_new -#define tor_evtimer_new evtimer_new -#define tor_evsignal_new evsignal_new -#define tor_event_free event_free -#define tor_evdns_add_server_port(sock, tcp, cb, data) \ - evdns_add_server_port_with_base(tor_libevent_get_base(), \ - (sock),(tcp),(cb),(data)); - -#else -struct event *tor_event_new(struct event_base * base, evutil_socket_t sock, - short what, void (*cb)(evutil_socket_t, short, void *), void *arg); -struct event *tor_evtimer_new(struct event_base * base, - void (*cb)(evutil_socket_t, short, void *), void *arg); -struct event *tor_evsignal_new(struct event_base * base, int sig, - void (*cb)(evutil_socket_t, short, void *), void *arg); -void tor_event_free(struct event *ev); -#define tor_evdns_add_server_port evdns_add_server_port -#endif - -typedef struct periodic_timer_t periodic_timer_t; - -periodic_timer_t *periodic_timer_new(struct event_base *base, - const struct timeval *tv, - void (*cb)(periodic_timer_t *timer, void *data), - void *data); -void periodic_timer_free(periodic_timer_t *); - -#ifdef HAVE_EVENT_BASE_LOOPEXIT -#define tor_event_base_loopexit event_base_loopexit -#else -struct timeval; -int tor_event_base_loopexit(struct event_base *base, struct timeval *tv); -#endif - -/** Defines a configuration for using libevent with Tor: passed as an argument - * to tor_libevent_initialize() to describe how we want to set up. */ -typedef struct tor_libevent_cfg { - /** Flag: if true, disable IOCP (assuming that it could be enabled). */ - int disable_iocp; - /** How many CPUs should we use (relevant only with IOCP). */ - int num_cpus; - /** How many milliseconds should we allow between updating bandwidth limits? - * (relevant only with bufferevents). */ - int msec_per_tick; -} tor_libevent_cfg; - -void tor_libevent_initialize(tor_libevent_cfg *cfg); -struct event_base *tor_libevent_get_base(void); -const char *tor_libevent_get_method(void); -void tor_check_libevent_version(const char *m, int server, - const char **badness_out); -void tor_check_libevent_header_compatibility(void); -const char *tor_libevent_get_version_str(void); -const char *tor_libevent_get_header_version_str(void); - -#ifdef USE_BUFFEREVENTS -const struct timeval *tor_libevent_get_one_tick_timeout(void); -int tor_libevent_using_iocp_bufferevents(void); -int tor_set_bufferevent_rate_limit(struct bufferevent *bev, - struct ev_token_bucket_cfg *cfg); -int tor_add_bufferevent_to_rate_limit_group(struct bufferevent *bev, - struct bufferevent_rate_limit_group *g); -#endif - -void tor_gettimeofday_cached(struct timeval *tv); -void tor_gettimeofday_cache_clear(void); - -#endif - diff --git a/src/tor/config.c b/src/tor/config.c deleted file mode 100644 index 60e35fd1c..000000000 --- a/src/tor/config.c +++ /dev/null @@ -1,6704 +0,0 @@ - /* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file config.c - * \brief Code to parse and interpret configuration files. - **/ - -#define CONFIG_PRIVATE -#include "or.h" -#include "addressmap.h" -#include "channel.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitmux.h" -#include "circuitmux_ewma.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "confparse.h" -#include "cpuworker.h" -#include "dirserv.h" -#include "dirvote.h" -#include "dns.h" -#include "entrynodes.h" -#include "geoip.h" -#include "hibernate.h" -#include "onion_main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "relay.h" -#include "rendclient.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "sandbox.h" -#include "tor_util.h" -#include "routerlist.h" -#include "routerset.h" -#include "statefile.h" -#include "transports.h" -#include "ext_orport.h" -#include "torgzip.h" -#include "anonymize.h" -#ifdef _WIN32 -#include -#endif - -#include "procmon.h" - -/* From onion_main.c */ -extern int quiet_level; - -/** A list of abbreviations and aliases to map command-line options, obsolete - * option names, or alternative option names, to their current values. */ -static config_abbrev_t option_abbrevs_[] = { - PLURAL(AuthDirBadDirCC), - PLURAL(AuthDirBadExitCC), - PLURAL(AuthDirInvalidCC), - PLURAL(AuthDirRejectCC), - PLURAL(ExitNode), - PLURAL(EntryNode), - PLURAL(ExcludeNode), - PLURAL(FirewallPort), - PLURAL(LongLivedPort), - PLURAL(HiddenServiceNode), - PLURAL(HiddenServiceExcludeNode), - PLURAL(NumCPU), - PLURAL(RendNode), - PLURAL(RendExcludeNode), - PLURAL(StrictEntryNode), - PLURAL(StrictExitNode), - PLURAL(StrictNode), - { "l", "Log", 1, 0}, - { "AllowUnverifiedNodes", "AllowInvalidNodes", 0, 0}, - { "AutomapHostSuffixes", "AutomapHostsSuffixes", 0, 0}, - { "AutomapHostOnResolve", "AutomapHostsOnResolve", 0, 0}, - { "BandwidthRateBytes", "BandwidthRate", 0, 0}, - { "BandwidthBurstBytes", "BandwidthBurst", 0, 0}, - { "DirFetchPostPeriod", "StatusFetchPeriod", 0, 0}, - { "DirServer", "DirAuthority", 0, 0}, /* XXXX024 later, make this warn? */ - { "MaxConn", "ConnLimit", 0, 1}, - { "ORBindAddress", "ORListenAddress", 0, 0}, - { "DirBindAddress", "DirListenAddress", 0, 0}, - { "SocksBindAddress", "SocksListenAddress", 0, 0}, - { "UseHelperNodes", "UseEntryGuards", 0, 0}, - { "NumHelperNodes", "NumEntryGuards", 0, 0}, - { "UseEntryNodes", "UseEntryGuards", 0, 0}, - { "NumEntryNodes", "NumEntryGuards", 0, 0}, - { "ResolvConf", "ServerDNSResolvConfFile", 0, 1}, - { "SearchDomains", "ServerDNSSearchDomains", 0, 1}, - { "ServerDNSAllowBrokenResolvConf", "ServerDNSAllowBrokenConfig", 0, 0}, - { "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0}, - { "BridgeAuthoritativeDirectory", "BridgeAuthoritativeDir", 0, 0}, - { "HashedControlPassword", "__HashedControlSessionPassword", 1, 0}, - { "StrictEntryNodes", "StrictNodes", 0, 1}, - { "StrictExitNodes", "StrictNodes", 0, 1}, - { "VirtualAddrNetwork", "VirtualAddrNetworkIPv4", 0, 0}, - { "_UseFilteringSSLBufferevents", "UseFilteringSSLBufferevents", 0, 1}, - { NULL, NULL, 0, 0}, -}; - -/** An entry for config_vars: "The option name has type - * CONFIG_TYPE_conftype, and corresponds to - * or_options_t.member" - */ -#define VAR(name,conftype,member,initvalue) \ - { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_options_t, member), \ - initvalue } -/** As VAR, but the option name and member name are the same. */ -#define V(member,conftype,initvalue) \ - VAR(#member, conftype, member, initvalue) -/** An entry for config_vars: "The option name is obsolete." */ -#define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL } - -#define VPORT(member,conftype,initvalue) \ - VAR(#member, conftype, member ## _lines, initvalue) - -/** Array of configuration options. Until we disallow nonstandard - * abbreviations, order is significant, since the first matching option will - * be chosen first. - */ -static config_var_t option_vars_[] = { - OBSOLETE("AccountingMaxKB"), - V(AccountingMax, MEMUNIT, "0 bytes"), - V(AccountingStart, STRING, NULL), - V(Address, STRING, NULL), - V(AllowDotExit, BOOL, "0"), - V(AllowInvalidNodes, CSV, "middle,rendezvous"), - V(AllowNonRFC953Hostnames, BOOL, "0"), - V(AllowSingleHopCircuits, BOOL, "0"), - V(AllowSingleHopExits, BOOL, "0"), - V(AlternateBridgeAuthority, LINELIST, NULL), - V(AlternateDirAuthority, LINELIST, NULL), - V(AlternateHSAuthority, LINELIST, NULL), - V(AssumeReachable, BOOL, "0"), - V(AuthDirBadDir, LINELIST, NULL), - V(AuthDirBadDirCCs, CSV, ""), - V(AuthDirBadExit, LINELIST, NULL), - V(AuthDirBadExitCCs, CSV, ""), - V(AuthDirInvalid, LINELIST, NULL), - V(AuthDirInvalidCCs, CSV, ""), - V(AuthDirFastGuarantee, MEMUNIT, "100 KB"), - V(AuthDirGuardBWGuarantee, MEMUNIT, "250 KB"), - V(AuthDirReject, LINELIST, NULL), - V(AuthDirRejectCCs, CSV, ""), - V(AuthDirRejectUnlisted, BOOL, "0"), - V(AuthDirListBadDirs, BOOL, "0"), - V(AuthDirListBadExits, BOOL, "0"), - V(AuthDirMaxServersPerAddr, UINT, "2"), - V(AuthDirMaxServersPerAuthAddr,UINT, "5"), - V(AuthDirHasIPv6Connectivity, BOOL, "0"), - VAR("AuthoritativeDirectory", BOOL, AuthoritativeDir, "0"), - V(AutomapHostsOnResolve, BOOL, "0"), - V(AutomapHostsSuffixes, CSV, ".onion,.exit"), - V(AvoidDiskWrites, BOOL, "0"), - V(BandwidthBurst, MEMUNIT, "1 GB"), - V(BandwidthRate, MEMUNIT, "1 GB"), - V(BridgeAuthoritativeDir, BOOL, "0"), - VAR("Bridge", LINELIST, Bridges, NULL), - V(BridgePassword, STRING, NULL), - V(BridgeRecordUsageByCountry, BOOL, "1"), - V(BridgeRelay, BOOL, "0"), - V(CellStatistics, BOOL, "0"), - V(LearnCircuitBuildTimeout, BOOL, "1"), - V(CircuitBuildTimeout, INTERVAL, "0"), - V(CircuitIdleTimeout, INTERVAL, "1 hour"), - V(CircuitStreamTimeout, INTERVAL, "0"), - V(CircuitPriorityHalflife, DOUBLE, "-100.0"), /*negative:'Use default'*/ - V(ClientDNSRejectInternalAddresses, BOOL,"1"), - V(ClientOnly, BOOL, "0"), - V(ClientPreferIPv6ORPort, BOOL, "0"), - V(ClientRejectInternalAddresses, BOOL, "1"), - V(ClientTransportPlugin, LINELIST, NULL), - V(ClientUseIPv6, BOOL, "0"), - V(ConsensusParams, STRING, NULL), - V(ConnLimit, UINT, "1000"), - V(ConnDirectionStatistics, BOOL, "0"), - V(ConstrainedSockets, BOOL, "0"), - V(ConstrainedSockSize, MEMUNIT, "8192"), - V(ContactInfo, STRING, NULL), - V(ControlListenAddress, LINELIST, NULL), - VPORT(ControlPort, LINELIST, NULL), - V(ControlPortFileGroupReadable,BOOL, "0"), - V(ControlPortWriteToFile, FILENAME, NULL), - V(ControlSocket, LINELIST, NULL), - V(ControlSocketsGroupWritable, BOOL, "0"), - V(CookieAuthentication, BOOL, "0"), - V(CookieAuthFileGroupReadable, BOOL, "0"), - V(CookieAuthFile, STRING, NULL), - V(CountPrivateBandwidth, BOOL, "0"), - V(DataDirectory, FILENAME, NULL), - OBSOLETE("DebugLogFile"), - V(DisableNetwork, BOOL, "0"), - V(DirAllowPrivateAddresses, BOOL, "0"), - V(TestingAuthDirTimeToLearnReachability, INTERVAL, "30 minutes"), - V(DirListenAddress, LINELIST, NULL), - OBSOLETE("DirFetchPeriod"), - V(DirPolicy, LINELIST, NULL), - VPORT(DirPort, LINELIST, NULL), - V(DirPortFrontPage, FILENAME, NULL), - OBSOLETE("DirPostPeriod"), - OBSOLETE("DirRecordUsageByCountry"), - OBSOLETE("DirRecordUsageGranularity"), - OBSOLETE("DirRecordUsageRetainIPs"), - OBSOLETE("DirRecordUsageSaveInterval"), - V(DirReqStatistics, BOOL, "1"), - VAR("DirAuthority", LINELIST, DirAuthorities, NULL), - V(DirAuthorityFallbackRate, DOUBLE, "1.0"), - V(DisableAllSwap, BOOL, "0"), - V(DisableDebuggerAttachment, BOOL, "1"), - V(DisableIOCP, BOOL, "1"), - OBSOLETE("DisableV2DirectoryInfo_"), - V(DynamicDHGroups, BOOL, "0"), - VPORT(DNSPort, LINELIST, NULL), - V(DNSListenAddress, LINELIST, NULL), - V(DownloadExtraInfo, BOOL, "0"), - V(TestingEnableConnBwEvent, BOOL, "0"), - V(TestingEnableCellStatsEvent, BOOL, "0"), - V(TestingEnableTbEmptyEvent, BOOL, "0"), - V(EnforceDistinctSubnets, BOOL, "1"), - V(EntryNodes, ROUTERSET, NULL), - V(EntryStatistics, BOOL, "0"), - V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"), - V(ExcludeNodes, ROUTERSET, NULL), - V(ExcludeExitNodes, ROUTERSET, NULL), - V(ExcludeSingleHopRelays, BOOL, "1"), - V(ExitNodes, ROUTERSET, NULL), - V(ExitPolicy, LINELIST, NULL), - V(ExitPolicyRejectPrivate, BOOL, "1"), - V(ExitPortStatistics, BOOL, "0"), - V(ExtendAllowPrivateAddresses, BOOL, "0"), - VPORT(ExtORPort, LINELIST, NULL), - V(ExtraInfoStatistics, BOOL, "1"), - V(FallbackDir, LINELIST, NULL), - - OBSOLETE("FallbackNetworkstatusFile"), - V(FascistFirewall, BOOL, "0"), - V(FirewallPorts, CSV, ""), - V(FastFirstHopPK, AUTOBOOL, "auto"), - V(FetchDirInfoEarly, BOOL, "0"), - V(FetchDirInfoExtraEarly, BOOL, "0"), - V(FetchServerDescriptors, BOOL, "1"), - V(FetchHidServDescriptors, BOOL, "1"), - V(FetchUselessDescriptors, BOOL, "0"), - OBSOLETE("FetchV2Networkstatus"), - V(GeoIPExcludeUnknown, AUTOBOOL, "auto"), -#ifdef _WIN32 - V(GeoIPFile, FILENAME, ""), - V(GeoIPv6File, FILENAME, ""), -#else - V(GeoIPFile, FILENAME, - "/usr/share" PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip"), - V(GeoIPv6File, FILENAME, - "/usr/share" PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip6"), -#endif - OBSOLETE("GiveGuardFlagTo_CVE_2011_2768_VulnerableRelays"), - OBSOLETE("Group"), - V(GuardLifetime, INTERVAL, "0 minutes"), - V(HardwareAccel, BOOL, "0"), - V(HeartbeatPeriod, INTERVAL, "6 hours"), - V(AccelName, STRING, NULL), - V(AccelDir, FILENAME, NULL), - V(HashedControlPassword, LINELIST, NULL), - V(HidServDirectoryV2, BOOL, "1"), - VAR("HiddenServiceDir", LINELIST_S, RendConfigLines, NULL), - OBSOLETE("HiddenServiceExcludeNodes"), - OBSOLETE("HiddenServiceNodes"), - VAR("HiddenServiceOptions",LINELIST_V, RendConfigLines, NULL), - VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL), - VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL), - V(HidServAuth, LINELIST, NULL), - V(HSAuthoritativeDir, BOOL, "0"), - OBSOLETE("HSAuthorityRecordStats"), - V(CloseHSClientCircuitsImmediatelyOnTimeout, BOOL, "0"), - V(CloseHSServiceRendCircuitsImmediatelyOnTimeout, BOOL, "0"), - V(HTTPProxy, STRING, NULL), - V(HTTPProxyAuthenticator, STRING, NULL), - V(HTTPSProxy, STRING, NULL), - V(HTTPSProxyAuthenticator, STRING, NULL), - V(IPv6Exit, BOOL, "0"), - VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL), - V(ServerTransportListenAddr, LINELIST, NULL), - V(ServerTransportOptions, LINELIST, NULL), - V(Socks4Proxy, STRING, NULL), - V(Socks5Proxy, STRING, NULL), - V(Socks5ProxyUsername, STRING, NULL), - V(Socks5ProxyPassword, STRING, NULL), - OBSOLETE("IgnoreVersion"), - V(KeepalivePeriod, INTERVAL, "5 minutes"), - VAR("Log", LINELIST, Logs, NULL), - V(LogMessageDomains, BOOL, "0"), - OBSOLETE("LinkPadding"), - OBSOLETE("LogLevel"), - OBSOLETE("LogFile"), - V(LogTimeGranularity, MSEC_INTERVAL, "1 second"), - V(LongLivedPorts, CSV, - "21,22,706,1863,5050,5190,5222,5223,6523,6667,6697,8300"), - VAR("MapAddress", LINELIST, AddressMap, NULL), - V(MaxAdvertisedBandwidth, MEMUNIT, "1 GB"), - V(MaxCircuitDirtiness, INTERVAL, "10 minutes"), - V(MaxClientCircuitsPending, UINT, "32"), - V(MaxMemInCellQueues, MEMUNIT, "8 GB"), - OBSOLETE("MaxOnionsPending"), - V(MaxOnionQueueDelay, MSEC_INTERVAL, "1750 msec"), - V(MinMeasuredBWsForAuthToIgnoreAdvertised, INT, "500"), - OBSOLETE("MonthlyAccountingStart"), - V(MyFamily, STRING, NULL), - V(NewCircuitPeriod, INTERVAL, "30 seconds"), - VAR("NamingAuthoritativeDirectory",BOOL, NamingAuthoritativeDir, "0"), - V(NATDListenAddress, LINELIST, NULL), - VPORT(NATDPort, LINELIST, NULL), - V(Nickname, STRING, NULL), - V(WarnUnsafeSocks, BOOL, "1"), - OBSOLETE("NoPublish"), - VAR("NodeFamily", LINELIST, NodeFamilies, NULL), - V(NumCPUs, UINT, "0"), - V(NumDirectoryGuards, UINT, "0"), - V(NumEntryGuards, UINT, "3"), - V(ORListenAddress, LINELIST, NULL), - VPORT(ORPort, LINELIST, NULL), - V(OutboundBindAddress, LINELIST, NULL), - - OBSOLETE("PathBiasDisableRate"), - V(PathBiasCircThreshold, INT, "-1"), - V(PathBiasNoticeRate, DOUBLE, "-1"), - V(PathBiasWarnRate, DOUBLE, "-1"), - V(PathBiasExtremeRate, DOUBLE, "-1"), - V(PathBiasScaleThreshold, INT, "-1"), - OBSOLETE("PathBiasScaleFactor"), - OBSOLETE("PathBiasMultFactor"), - V(PathBiasDropGuards, AUTOBOOL, "0"), - OBSOLETE("PathBiasUseCloseCounts"), - - V(PathBiasUseThreshold, INT, "-1"), - V(PathBiasNoticeUseRate, DOUBLE, "-1"), - V(PathBiasExtremeUseRate, DOUBLE, "-1"), - V(PathBiasScaleUseThreshold, INT, "-1"), - - V(PathsNeededToBuildCircuits, DOUBLE, "-1"), - OBSOLETE("PathlenCoinWeight"), - V(PerConnBWBurst, MEMUNIT, "0"), - V(PerConnBWRate, MEMUNIT, "0"), - V(PidFile, STRING, NULL), - V(TestingTorNetwork, BOOL, "0"), - V(TestingMinExitFlagThreshold, MEMUNIT, "0"), - V(TestingMinFastFlagThreshold, MEMUNIT, "0"), - V(OptimisticData, AUTOBOOL, "auto"), - V(PortForwarding, BOOL, "0"), - V(PortForwardingHelper, FILENAME, "tor-fw-helper"), - V(PreferTunneledDirConns, BOOL, "1"), - V(ProtocolWarnings, BOOL, "0"), - V(PublishServerDescriptor, CSV, "1"), - V(PublishHidServDescriptors, BOOL, "1"), - V(ReachableAddresses, LINELIST, NULL), - V(ReachableDirAddresses, LINELIST, NULL), - V(ReachableORAddresses, LINELIST, NULL), - V(RecommendedVersions, LINELIST, NULL), - V(RecommendedClientVersions, LINELIST, NULL), - V(RecommendedServerVersions, LINELIST, NULL), - OBSOLETE("RedirectExit"), - V(RefuseUnknownExits, AUTOBOOL, "auto"), - V(RejectPlaintextPorts, CSV, ""), - V(RelayBandwidthBurst, MEMUNIT, "0"), - V(RelayBandwidthRate, MEMUNIT, "0"), - OBSOLETE("RendExcludeNodes"), - OBSOLETE("RendNodes"), - V(RendPostPeriod, INTERVAL, "1 hour"), - V(RephistTrackTime, INTERVAL, "24 hours"), - OBSOLETE("RouterFile"), - V(RunAsDaemon, BOOL, "0"), -// V(RunTesting, BOOL, "0"), - OBSOLETE("RunTesting"), // currently unused - V(Sandbox, BOOL, "0"), - V(SafeLogging, STRING, "1"), - V(SafeSocks, BOOL, "0"), - V(ServerDNSAllowBrokenConfig, BOOL, "1"), - V(ServerDNSAllowNonRFC953Hostnames, BOOL,"0"), - V(ServerDNSDetectHijacking, BOOL, "1"), - V(ServerDNSRandomizeCase, BOOL, "1"), - V(ServerDNSResolvConfFile, STRING, NULL), - V(ServerDNSSearchDomains, BOOL, "0"), - V(ServerDNSTestAddresses, CSV, - "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"), - V(ShutdownWaitLength, INTERVAL, "30 seconds"), - V(SocksListenAddress, LINELIST, NULL), - V(SocksPolicy, LINELIST, NULL), - VPORT(SocksPort, LINELIST, NULL), - V(SocksTimeout, INTERVAL, "2 minutes"), - V(SSLKeyLifetime, INTERVAL, "0"), - OBSOLETE("StatusFetchPeriod"), - V(StrictNodes, BOOL, "0"), - V(Support022HiddenServices, AUTOBOOL, "auto"), - OBSOLETE("SysLog"), - V(TestSocks, BOOL, "0"), - OBSOLETE("TestVia"), - V(TokenBucketRefillInterval, MSEC_INTERVAL, "100 msec"), - V(Tor2webMode, BOOL, "0"), - V(TLSECGroup, STRING, NULL), - V(TrackHostExits, CSV, NULL), - V(TrackHostExitsExpire, INTERVAL, "30 minutes"), - OBSOLETE("TrafficShaping"), - V(TransListenAddress, LINELIST, NULL), - VPORT(TransPort, LINELIST, NULL), - V(TransProxyType, STRING, "default"), - V(TunnelDirConns, BOOL, "1"), - V(UpdateBridgesFromAuthority, BOOL, "0"), - V(UseBridges, BOOL, "0"), - V(UseEntryGuards, BOOL, "1"), - V(UseEntryGuardsAsDirGuards, BOOL, "1"), - V(UseMicrodescriptors, AUTOBOOL, "auto"), - V(UseNTorHandshake, AUTOBOOL, "1"), - V(User, STRING, NULL), - V(UserspaceIOCPBuffers, BOOL, "0"), - VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir, "0"), - OBSOLETE("V2AuthoritativeDirectory"), - VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir, "0"), - V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"), - V(TestingV3AuthInitialVoteDelay, INTERVAL, "5 minutes"), - V(TestingV3AuthInitialDistDelay, INTERVAL, "5 minutes"), - V(TestingV3AuthVotingStartOffset, INTERVAL, "0"), - V(V3AuthVotingInterval, INTERVAL, "1 hour"), - V(V3AuthVoteDelay, INTERVAL, "5 minutes"), - V(V3AuthDistDelay, INTERVAL, "5 minutes"), - V(V3AuthNIntervalsValid, UINT, "3"), - V(V3AuthUseLegacyKey, BOOL, "0"), - V(V3BandwidthsFile, FILENAME, NULL), - VAR("VersioningAuthoritativeDirectory",BOOL,VersioningAuthoritativeDir, "0"), - V(VirtualAddrNetworkIPv4, STRING, "127.192.0.0/10"), - V(VirtualAddrNetworkIPv6, STRING, "[FE80::]/10"), - V(WarnPlaintextPorts, CSV, "23,109,110,143"), - V(UseFilteringSSLBufferevents, BOOL, "0"), - VAR("__ReloadTorrcOnSIGHUP", BOOL, ReloadTorrcOnSIGHUP, "1"), - VAR("__AllDirActionsPrivate", BOOL, AllDirActionsPrivate, "0"), - VAR("__DisablePredictedCircuits",BOOL,DisablePredictedCircuits, "0"), - VAR("__LeaveStreamsUnattached",BOOL, LeaveStreamsUnattached, "0"), - VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword, - NULL), - VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL), - V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"), - V(VoteOnHidServDirectoriesV2, BOOL, "1"), - V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, " - "300, 900, 2147483647"), - V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 60, 300, 600, " - "2147483647"), - V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, " - "300, 600, 1800, 1800, 1800, 1800, " - "1800, 3600, 7200"), - V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 60, " - "300, 600, 1800, 3600, 3600, 3600, " - "10800, 21600, 43200"), - V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "3600, 900, 900, 3600"), - V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "10 minutes"), - V(TestingDirConnectionMaxStall, INTERVAL, "5 minutes"), - V(TestingConsensusMaxDownloadTries, UINT, "8"), - V(TestingDescriptorMaxDownloadTries, UINT, "8"), - V(TestingMicrodescMaxDownloadTries, UINT, "8"), - V(TestingCertMaxDownloadTries, UINT, "8"), - V(TestingDirAuthVoteGuard, ROUTERSET, NULL), - VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"), - - { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } -}; - -/** Override default values with these if the user sets the TestingTorNetwork - * option. */ -static const config_var_t testing_tor_network_defaults[] = { - V(ServerDNSAllowBrokenConfig, BOOL, "1"), - V(DirAllowPrivateAddresses, BOOL, "1"), - V(EnforceDistinctSubnets, BOOL, "0"), - V(AssumeReachable, BOOL, "1"), - V(AuthDirMaxServersPerAddr, UINT, "0"), - V(AuthDirMaxServersPerAuthAddr,UINT, "0"), - V(ClientDNSRejectInternalAddresses, BOOL,"0"), - V(ClientRejectInternalAddresses, BOOL, "0"), - V(CountPrivateBandwidth, BOOL, "1"), - V(ExitPolicyRejectPrivate, BOOL, "0"), - V(ExtendAllowPrivateAddresses, BOOL, "1"), - V(V3AuthVotingInterval, INTERVAL, "5 minutes"), - V(V3AuthVoteDelay, INTERVAL, "20 seconds"), - V(V3AuthDistDelay, INTERVAL, "20 seconds"), - V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"), - V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"), - V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"), - V(TestingV3AuthVotingStartOffset, INTERVAL, "0"), - V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"), - V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"), - V(MinUptimeHidServDirectoryV2, INTERVAL, "0 minutes"), - V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 5, 10, 15, " - "20, 30, 60"), - V(TestingClientDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, 15, 20, " - "30, 60"), - V(TestingServerConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, " - "15, 20, 30, 60"), - V(TestingClientConsensusDownloadSchedule, CSV_INTERVAL, "0, 0, 5, 10, " - "15, 20, 30, 60"), - V(TestingBridgeDownloadSchedule, CSV_INTERVAL, "60, 30, 30, 60"), - V(TestingClientMaxIntervalWithoutRequest, INTERVAL, "5 seconds"), - V(TestingDirConnectionMaxStall, INTERVAL, "30 seconds"), - V(TestingConsensusMaxDownloadTries, UINT, "80"), - V(TestingDescriptorMaxDownloadTries, UINT, "80"), - V(TestingMicrodescMaxDownloadTries, UINT, "80"), - V(TestingCertMaxDownloadTries, UINT, "80"), - V(TestingEnableConnBwEvent, BOOL, "1"), - V(TestingEnableCellStatsEvent, BOOL, "1"), - V(TestingEnableTbEmptyEvent, BOOL, "1"), - VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"), - - { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } -}; - -#undef VAR -#undef V -#undef OBSOLETE - -#ifdef _WIN32 -static char *get_windows_conf_root(void); -#endif -static int options_act_reversible(const or_options_t *old_options, char **msg); -static int options_act(const or_options_t *old_options); -static int options_transition_allowed(const or_options_t *old, - const or_options_t *new, - char **msg); -static int options_transition_affects_workers( - const or_options_t *old_options, const or_options_t *new_options); -static int options_transition_affects_descriptor( - const or_options_t *old_options, const or_options_t *new_options); -static int check_nickname_list(char **lst, const char *name, char **msg); - -static int parse_client_transport_line(const char *line, int validate_only); - -static int parse_server_transport_line(const char *line, int validate_only); -static char *get_bindaddr_from_transport_listen_line(const char *line, - const char *transport); -static int parse_dir_authority_line(const char *line, - dirinfo_type_t required_type, - int validate_only); -static int parse_dir_fallback_line(const char *line, - int validate_only); -static void port_cfg_free(port_cfg_t *port); -static int parse_ports(or_options_t *options, int validate_only, - char **msg_out, int *n_ports_out); -static int check_server_ports(const smartlist_t *ports, - const or_options_t *options); - -static int validate_data_directory(or_options_t *options); -static int write_configuration_file(const char *fname, - const or_options_t *options); -static int options_init_logs(or_options_t *options, int validate_only); - -static void init_libevent(const or_options_t *options); -static int opt_streq(const char *s1, const char *s2); -static int parse_outbound_addresses(or_options_t *options, int validate_only, - char **msg); -static void config_maybe_load_geoip_files_(const or_options_t *options, - const or_options_t *old_options); -static int options_validate_cb(void *old_options, void *options, - void *default_options, - int from_setconf, char **msg); - -/** Magic value for or_options_t. */ -#define OR_OPTIONS_MAGIC 9090909 - -/** Configuration format for or_options_t. */ -STATIC config_format_t options_format = { - sizeof(or_options_t), - OR_OPTIONS_MAGIC, - STRUCT_OFFSET(or_options_t, magic_), - option_abbrevs_, - option_vars_, - options_validate_cb, - NULL -}; - -/* - * Functions to read and write the global options pointer. - */ - -/** Command-line and config-file options. */ -static or_options_t *global_options = NULL; -/** The fallback options_t object; this is where we look for options not - * in torrc before we fall back to Tor's defaults. */ -static or_options_t *global_default_options = NULL; -/** Name of most recently read torrc file. */ -static char *torrc_fname = NULL; -/** Name of the most recently read torrc-defaults file.*/ -static char *torrc_defaults_fname; -/** Configuration options set by command line. */ -static config_line_t *global_cmdline_options = NULL; -/** Non-configuration options set by the command line */ -static config_line_t *global_cmdline_only_options = NULL; -/** Boolean: Have we parsed the command line? */ -static int have_parsed_cmdline = 0; -/** Contents of most recently read DirPortFrontPage file. */ -static char *global_dirfrontpagecontents = NULL; -/** List of port_cfg_t for all configured ports. */ -static smartlist_t *configured_ports = NULL; - -/** Return the contents of our frontpage string, or NULL if not configured. */ -const char * -get_dirportfrontpage(void) -{ - return global_dirfrontpagecontents; -} - -/** Return the currently configured options. */ -or_options_t * -get_options_mutable(void) -{ - tor_assert(global_options); - return global_options; -} - -/** Returns the currently configured options */ -const or_options_t * -get_options(void) -{ - return get_options_mutable(); -} - -/** Change the current global options to contain new_val instead of - * their current value; take action based on the new value; free the old value - * as necessary. Returns 0 on success, -1 on failure. - */ -int -set_options(or_options_t *new_val, char **msg) -{ - int i; - smartlist_t *elements; - config_line_t *line; - or_options_t *old_options = global_options; - global_options = new_val; - /* Note that we pass the *old* options below, for comparison. It - * pulls the new options directly out of global_options. */ - if (options_act_reversible(old_options, msg)<0) { - tor_assert(*msg); - global_options = old_options; - return -1; - } - if (options_act(old_options) < 0) { /* acting on the options failed. die. */ - log_err(LD_BUG, - "Acting on config options left us in a broken state. Dying."); - exit(1); - } - /* Issues a CONF_CHANGED event to notify controller of the change. If Tor is - * just starting up then the old_options will be undefined. */ - if (old_options && old_options != global_options) { - elements = smartlist_new(); - for (i=0; options_format.vars[i].name; ++i) { - const config_var_t *var = &options_format.vars[i]; - const char *var_name = var->name; - if (var->type == CONFIG_TYPE_LINELIST_S || - var->type == CONFIG_TYPE_OBSOLETE) { - continue; - } - if (!config_is_same(&options_format, new_val, old_options, var_name)) { - line = config_get_assigned_option(&options_format, new_val, - var_name, 1); - - if (line) { - config_line_t *next; - for (; line; line = next) { - next = line->next; - smartlist_add(elements, line->key); - smartlist_add(elements, line->value); - tor_free(line); - } - } else { - smartlist_add(elements, tor_strdup(options_format.vars[i].name)); - smartlist_add(elements, NULL); - } - } - } - control_event_conf_changed(elements); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - } - - if (old_options != global_options) - config_free(&options_format, old_options); - - return 0; -} - -extern const char tor_git_revision[]; /* from tor_main.c */ - -/** The version of this Tor process, as parsed. */ -static char *the_tor_version = NULL; -/** A shorter version of this Tor process's version, for export in our router - * descriptor. (Does not include the git version, if any.) */ -static char *the_short_tor_version = NULL; - -/** Return the current Tor version. */ -const char * -get_version(void) -{ - if (the_tor_version == NULL) { - if (strlen(tor_git_revision)) { - tor_asprintf(&the_tor_version, "%s (git-%s)", get_short_version(), - tor_git_revision); - } else { - the_tor_version = tor_strdup(get_short_version()); - } - } - return the_tor_version; -} - -/** Return the current Tor version, without any git tag. */ -const char * -get_short_version(void) -{ - - if (the_short_tor_version == NULL) { -#ifdef TOR_BUILD_TAG - tor_asprintf(&the_short_tor_version, "%s (%s)", VERSION, TOR_BUILD_TAG); -#else - the_short_tor_version = tor_strdup(VERSION); -#endif - } - return the_short_tor_version; -} - -/** Release additional memory allocated in options - */ -STATIC void -or_options_free(or_options_t *options) -{ - if (!options) - return; - - routerset_free(options->ExcludeExitNodesUnion_); - if (options->NodeFamilySets) { - SMARTLIST_FOREACH(options->NodeFamilySets, routerset_t *, - rs, routerset_free(rs)); - smartlist_free(options->NodeFamilySets); - } - tor_free(options->BridgePassword_AuthDigest_); - tor_free(options->command_arg); - config_free(&options_format, options); -} - -/** Release all memory and resources held by global configuration structures. - */ -void -config_free_all(void) -{ - or_options_free(global_options); - global_options = NULL; - or_options_free(global_default_options); - global_default_options = NULL; - - config_free_lines(global_cmdline_options); - global_cmdline_options = NULL; - - config_free_lines(global_cmdline_only_options); - global_cmdline_only_options = NULL; - - if (configured_ports) { - SMARTLIST_FOREACH(configured_ports, - port_cfg_t *, p, port_cfg_free(p)); - smartlist_free(configured_ports); - configured_ports = NULL; - } - - tor_free(torrc_fname); - tor_free(torrc_defaults_fname); - tor_free(the_tor_version); - tor_free(global_dirfrontpagecontents); - - tor_free(the_short_tor_version); - tor_free(the_tor_version); -} - -/** Make address -- a piece of information related to our operation as - * a client -- safe to log according to the settings in options->SafeLogging, - * and return it. - * - * (We return "[scrubbed]" if SafeLogging is "1", and address otherwise.) - */ -const char * -safe_str_client(const char *address) -{ - tor_assert(address); - if (get_options()->SafeLogging_ == SAFELOG_SCRUB_ALL) - return "[scrubbed]"; - else - return address; -} - -/** Make address -- a piece of information of unspecified sensitivity - * -- safe to log according to the settings in options->SafeLogging, and - * return it. - * - * (We return "[scrubbed]" if SafeLogging is anything besides "0", and address - * otherwise.) - */ -const char * -safe_str(const char *address) -{ - tor_assert(address); - if (get_options()->SafeLogging_ != SAFELOG_SCRUB_NONE) - return "[scrubbed]"; - else - return address; -} - -/** Equivalent to escaped(safe_str_client(address)). See reentrancy note on - * escaped(): don't use this outside the main thread, or twice in the same - * log statement. */ -const char * -escaped_safe_str_client(const char *address) -{ - if (get_options()->SafeLogging_ == SAFELOG_SCRUB_ALL) - return "[scrubbed]"; - else - return escaped(address); -} - -/** Equivalent to escaped(safe_str(address)). See reentrancy note on - * escaped(): don't use this outside the main thread, or twice in the same - * log statement. */ -const char * -escaped_safe_str(const char *address) -{ - if (get_options()->SafeLogging_ != SAFELOG_SCRUB_NONE) - return "[scrubbed]"; - else - return escaped(address); -} - -/** Add the default directory authorities directly into the trusted dir list, - * but only add them insofar as they share bits with type. */ -static void -add_default_trusted_dir_authorities(dirinfo_type_t type) -{ - int i; - const char *authorities[] = { - "moria1 orport=9101 " - "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " - "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", - "tor26 v1 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " - "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", - "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " - "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755", - "Tonga orport=443 bridge 82.94.251.203:80 " - "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D", - "turtles orport=9090 " - "v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 " - "76.73.17.194:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B", - "gabelmoo orport=443 " - "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 " - "212.112.245.170:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281", - "dannenberg orport=443 " - "v3ident=585769C78764D58426B8B52B6651A5A71137189A " - "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", - "urras orport=80 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C " - "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417", - "maatuska orport=80 " - "v3ident=49015F787433103580E3B66A1707A00E60F2D15B " - "171.25.193.9:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810", - "Faravahar orport=443 " - "v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 " - "154.35.32.5:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC", - NULL - }; - for (i=0; authorities[i]; i++) { - if (parse_dir_authority_line(authorities[i], type, 0)<0) { - log_err(LD_BUG, "Couldn't parse internal DirAuthority line %s", - authorities[i]); - } - } -} - -/** Add the default fallback directory servers into the fallback directory - * server list. */ -static void -add_default_fallback_dir_servers(void) -{ - int i; - const char *fallback[] = { - NULL - }; - for (i=0; fallback[i]; i++) { - if (parse_dir_fallback_line(fallback[i], 0)<0) { - log_err(LD_BUG, "Couldn't parse internal FallbackDir line %s", - fallback[i]); - } - } -} - -/** Look at all the config options for using alternate directory - * authorities, and make sure none of them are broken. Also, warn the - * user if we changed any dangerous ones. - */ -static int -validate_dir_servers(or_options_t *options, or_options_t *old_options) -{ - config_line_t *cl; - - if (options->DirAuthorities && - (options->AlternateDirAuthority || options->AlternateBridgeAuthority || - options->AlternateHSAuthority)) { - log_warn(LD_CONFIG, - "You cannot set both DirAuthority and Alternate*Authority."); - return -1; - } - - /* do we want to complain to the user about being partitionable? */ - if ((options->DirAuthorities && - (!old_options || - !config_lines_eq(options->DirAuthorities, - old_options->DirAuthorities))) || - (options->AlternateDirAuthority && - (!old_options || - !config_lines_eq(options->AlternateDirAuthority, - old_options->AlternateDirAuthority)))) { - log_warn(LD_CONFIG, - "You have used DirAuthority or AlternateDirAuthority to " - "specify alternate directory authorities in " - "your configuration. This is potentially dangerous: it can " - "make you look different from all other Tor users, and hurt " - "your anonymity. Even if you've specified the same " - "authorities as Tor uses by default, the defaults could " - "change in the future. Be sure you know what you're doing."); - } - - /* Now go through the four ways you can configure an alternate - * set of directory authorities, and make sure none are broken. */ - for (cl = options->DirAuthorities; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) - return -1; - for (cl = options->AlternateBridgeAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) - return -1; - for (cl = options->AlternateDirAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) - return -1; - for (cl = options->AlternateHSAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 1)<0) - return -1; - for (cl = options->FallbackDir; cl; cl = cl->next) - if (parse_dir_fallback_line(cl->value, 1)<0) - return -1; - return 0; -} - -/** Look at all the config options and assign new dir authorities - * as appropriate. - */ -static int -consider_adding_dir_servers(const or_options_t *options, - const or_options_t *old_options) -{ - config_line_t *cl; - int need_to_update = - !smartlist_len(router_get_trusted_dir_servers()) || - !smartlist_len(router_get_fallback_dir_servers()) || !old_options || - !config_lines_eq(options->DirAuthorities, old_options->DirAuthorities) || - !config_lines_eq(options->FallbackDir, old_options->FallbackDir) || - !config_lines_eq(options->AlternateBridgeAuthority, - old_options->AlternateBridgeAuthority) || - !config_lines_eq(options->AlternateDirAuthority, - old_options->AlternateDirAuthority) || - !config_lines_eq(options->AlternateHSAuthority, - old_options->AlternateHSAuthority); - - if (!need_to_update) - return 0; /* all done */ - - /* Start from a clean slate. */ - clear_dir_servers(); - - if (!options->DirAuthorities) { - /* then we may want some of the defaults */ - dirinfo_type_t type = NO_DIRINFO; - if (!options->AlternateBridgeAuthority) - type |= BRIDGE_DIRINFO; - if (!options->AlternateDirAuthority) - type |= V1_DIRINFO | V3_DIRINFO | EXTRAINFO_DIRINFO | - MICRODESC_DIRINFO; - if (!options->AlternateHSAuthority) - type |= HIDSERV_DIRINFO; - add_default_trusted_dir_authorities(type); - } - if (!options->FallbackDir) - add_default_fallback_dir_servers(); - - for (cl = options->DirAuthorities; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) - return -1; - for (cl = options->AlternateBridgeAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) - return -1; - for (cl = options->AlternateDirAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) - return -1; - for (cl = options->AlternateHSAuthority; cl; cl = cl->next) - if (parse_dir_authority_line(cl->value, NO_DIRINFO, 0)<0) - return -1; - for (cl = options->FallbackDir; cl; cl = cl->next) - if (parse_dir_fallback_line(cl->value, 0)<0) - return -1; - return 0; -} - -/** Fetch the active option list, and take actions based on it. All of the - * things we do should survive being done repeatedly. If present, - * old_options contains the previous value of the options. - * - * Return 0 if all goes well, return -1 if things went badly. - */ -static int -options_act_reversible(const or_options_t *old_options, char **msg) -{ - smartlist_t *new_listeners = smartlist_new(); - smartlist_t *replaced_listeners = smartlist_new(); - static int libevent_initialized = 0; - or_options_t *options = get_options_mutable(); - int running_tor = options->command == CMD_RUN_TOR; - int set_conn_limit = 0; - int r = -1; - int logs_marked = 0; - int old_min_log_level = get_min_log_level(); - - /* Daemonize _first_, since we only want to open most of this stuff in - * the subprocess. Libevent bases can't be reliably inherited across - * processes. */ - if (running_tor && options->RunAsDaemon) { - /* No need to roll back, since you can't change the value. */ - start_daemon(); - } - -#ifndef HAVE_SYS_UN_H - if (options->ControlSocket || options->ControlSocketsGroupWritable) { - *msg = tor_strdup("Unix domain sockets (ControlSocket) not supported " - "on this OS/with this build."); - goto rollback; - } -#else - if (options->ControlSocketsGroupWritable && !options->ControlSocket) { - *msg = tor_strdup("Setting ControlSocketGroupWritable without setting" - "a ControlSocket makes no sense."); - goto rollback; - } -#endif - - if (running_tor) { - int n_ports=0; - /* We need to set the connection limit before we can open the listeners. */ - if (set_max_file_descriptors((unsigned)options->ConnLimit, - &options->ConnLimit_) < 0) { - *msg = tor_strdup("Problem with ConnLimit value. See logs for details."); - goto rollback; - } - set_conn_limit = 1; - - /* Set up libevent. (We need to do this before we can register the - * listeners as listeners.) */ - if (running_tor && !libevent_initialized) { - init_libevent(options); - libevent_initialized = 1; - } - - /* Adjust the port configuration so we can launch listeners. */ - if (parse_ports(options, 0, msg, &n_ports)) { - if (!*msg) - *msg = tor_strdup("Unexpected problem parsing port config"); - goto rollback; - } - - /* Set the hibernation state appropriately.*/ - consider_hibernation(time(NULL)); - - /* Launch the listeners. (We do this before we setuid, so we can bind to - * ports under 1024.) We don't want to rebind if we're hibernating. If - * networking is disabled, this will close all but the control listeners, - * but disable those. */ - if (!we_are_hibernating()) { - if (retry_all_listeners(replaced_listeners, new_listeners, - options->DisableNetwork) < 0) { - *msg = tor_strdup("Failed to bind one of the listener ports."); - goto rollback; - } - } - if (options->DisableNetwork) { - /* Aggressively close non-controller stuff, NOW */ - log_notice(LD_NET, "DisableNetwork is set. Tor will not make or accept " - "non-control network connections. Shutting down all existing " - "connections."); - connection_mark_all_noncontrol_connections(); - } - } - -#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) - /* Open /dev/pf before dropping privileges. */ - if (options->TransPort_set) { - if (get_pf_socket() < 0) { - *msg = tor_strdup("Unable to open /dev/pf for transparent proxy."); - goto rollback; - } - } -#endif - - /* Attempt to lock all current and future memory with mlockall() only once */ - if (options->DisableAllSwap) { - if (tor_mlockall() == -1) { - *msg = tor_strdup("DisableAllSwap failure. Do you have proper " - "permissions?"); - goto done; - } - } - - /* Setuid/setgid as appropriate */ - if (options->User) { - if (switch_id(options->User) != 0) { - /* No need to roll back, since you can't change the value. */ - *msg = tor_strdup("Problem with User value. See logs for details."); - goto done; - } - } - - /* Ensure data directory is private; create if possible. */ - if (check_private_dir(options->DataDirectory, - running_tor ? CPD_CREATE : CPD_CHECK, - options->User)<0) { - tor_asprintf(msg, - "Couldn't access/create private data directory \"%s\"", - options->DataDirectory); - goto done; - /* No need to roll back, since you can't change the value. */ - } - - /* Bail out at this point if we're not going to be a client or server: - * we don't run Tor itself. */ - if (!running_tor) - goto commit; - - mark_logs_temp(); /* Close current logs once new logs are open. */ - logs_marked = 1; - if (options_init_logs(options, 0)<0) { /* Configure the tor_log(s) */ - *msg = tor_strdup("Failed to init Log options. See logs for details."); - goto rollback; - } - - commit: - r = 0; - if (logs_marked) { - log_severity_list_t *severity = - tor_malloc_zero(sizeof(log_severity_list_t)); - close_temp_logs(); - add_callback_log(severity, control_event_logmsg); - control_adjust_event_log_severity(); - tor_free(severity); - tor_log_update_sigsafe_err_fds(); - } - if (get_min_log_level() >= LOG_INFO && - get_min_log_level() != old_min_log_level) { - log_warn(LD_GENERAL, "Your log may contain sensitive information: you're " - "logging more than \"notice\". Please log safely. Don't log " - "unless it serves an important reason, and overwrite the log " - "afterwards."); - } - - SMARTLIST_FOREACH(replaced_listeners, connection_t *, conn, - { - log_notice(LD_NET, "Closing old %s on %s:%d", - conn_type_to_string(conn->type), conn->address, conn->port); - connection_close_immediate(conn); - connection_mark_for_close(conn); - }); - goto done; - - rollback: - r = -1; - tor_assert(*msg); - - if (logs_marked) { - rollback_log_changes(); - control_adjust_event_log_severity(); - } - - if (set_conn_limit && old_options) - set_max_file_descriptors((unsigned)old_options->ConnLimit, - &options->ConnLimit_); - - SMARTLIST_FOREACH(new_listeners, connection_t *, conn, - { - log_notice(LD_NET, "Closing partially-constructed %s on %s:%d", - conn_type_to_string(conn->type), conn->address, conn->port); - connection_close_immediate(conn); - connection_mark_for_close(conn); - }); - - done: - smartlist_free(new_listeners); - smartlist_free(replaced_listeners); - return r; -} - -/** If we need to have a GEOIP ip-to-country map to run with our configured - * options, return 1 and set *reason_out to a description of why. */ -int -options_need_geoip_info(const or_options_t *options, const char **reason_out) -{ - int bridge_usage = - options->BridgeRelay && options->BridgeRecordUsageByCountry; - int routerset_usage = - routerset_needs_geoip(options->EntryNodes) || - routerset_needs_geoip(options->ExitNodes) || - routerset_needs_geoip(options->ExcludeExitNodes) || - routerset_needs_geoip(options->ExcludeNodes); - - if (routerset_usage && reason_out) { - *reason_out = "We've been configured to use (or avoid) nodes in certain " - "countries, and we need GEOIP information to figure out which ones they " - "are."; - } else if (bridge_usage && reason_out) { - *reason_out = "We've been configured to see which countries can access " - "us as a bridge, and we need GEOIP information to tell which countries " - "clients are in."; - } - return bridge_usage || routerset_usage; -} - -/** Return the bandwidthrate that we are going to report to the authorities - * based on the config options. */ -uint32_t -get_effective_bwrate(const or_options_t *options) -{ - uint64_t bw = options->BandwidthRate; - if (bw > options->MaxAdvertisedBandwidth) - bw = options->MaxAdvertisedBandwidth; - if (options->RelayBandwidthRate > 0 && bw > options->RelayBandwidthRate) - bw = options->RelayBandwidthRate; - /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */ - return (uint32_t)bw; -} - -/** Return the bandwidthburst that we are going to report to the authorities - * based on the config options. */ -uint32_t -get_effective_bwburst(const or_options_t *options) -{ - uint64_t bw = options->BandwidthBurst; - if (options->RelayBandwidthBurst > 0 && bw > options->RelayBandwidthBurst) - bw = options->RelayBandwidthBurst; - /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */ - return (uint32_t)bw; -} - -/** Return True if any changes from old_options to - * new_options needs us to refresh our TLS context. */ -static int -options_transition_requires_fresh_tls_context(const or_options_t *old_options, - const or_options_t *new_options) -{ - tor_assert(new_options); - - if (!old_options) - return 0; - - if ((old_options->DynamicDHGroups != new_options->DynamicDHGroups)) { - return 1; - } - - if (!opt_streq(old_options->TLSECGroup, new_options->TLSECGroup)) - return 1; - - return 0; -} - -/** Fetch the active option list, and take actions based on it. All of the - * things we do should survive being done repeatedly. If present, - * old_options contains the previous value of the options. - * - * Return 0 if all goes well, return -1 if it's time to die. - * - * Note: We haven't moved all the "act on new configuration" logic - * here yet. Some is still in do_hup() and other places. - */ -static int -options_act(const or_options_t *old_options) -{ - config_line_t *cl; - or_options_t *options = get_options_mutable(); - int running_tor = options->command == CMD_RUN_TOR; - char *msg=NULL; - const int transition_affects_workers = - old_options && options_transition_affects_workers(old_options, options); - int old_ewma_enabled; - - /* disable ptrace and later, other basic debugging techniques */ - { - /* Remember if we already disabled debugger attachment */ - static int disabled_debugger_attach = 0; - /* Remember if we already warned about being configured not to disable - * debugger attachment */ - static int warned_debugger_attach = 0; - /* Don't disable debugger attachment when we're running the unit tests. */ - if (options->DisableDebuggerAttachment && !disabled_debugger_attach && - running_tor) { - int ok = tor_disable_debugger_attach(); - if (warned_debugger_attach && ok == 1) { - log_notice(LD_CONFIG, "Disabled attaching debuggers for unprivileged " - "users."); - } - disabled_debugger_attach = (ok == 1); - } else if (!options->DisableDebuggerAttachment && - !warned_debugger_attach) { - log_notice(LD_CONFIG, "Not disabling debugger attaching for " - "unprivileged users."); - warned_debugger_attach = 1; - } - } - - /* Write control ports to disk as appropriate */ - control_ports_write_to_file(); - - if (running_tor && !have_lockfile()) { - if (try_locking(options, 1) < 0) - return -1; - } - - if (consider_adding_dir_servers(options, old_options) < 0) - return -1; - -#ifdef NON_ANONYMOUS_MODE_ENABLED - log_warn(LD_GENERAL, "This copy of Tor was compiled to run in a " - "non-anonymous mode. It will provide NO ANONYMITY."); -#endif - -#ifdef ENABLE_TOR2WEB_MODE - if (!options->Tor2webMode) { - log_err(LD_CONFIG, "This copy of Tor was compiled to run in " - "'tor2web mode'. It can only be run with the Tor2webMode torrc " - "option enabled."); - return -1; - } -#else - if (options->Tor2webMode) { - log_err(LD_CONFIG, "This copy of Tor was not compiled to run in " - "'tor2web mode'. It cannot be run with the Tor2webMode torrc " - "option enabled. To enable Tor2webMode recompile with the " - "--enable-tor2webmode option."); - return -1; - } -#endif - - if (options->SafeLogging_ != SAFELOG_SCRUB_ALL && - (!old_options || old_options->SafeLogging_ != options->SafeLogging_)) { - log_warn(LD_GENERAL, "Your log may contain sensitive information - you " - "disabled SafeLogging. Please log safely. Don't log unless it " - "serves an important reason. Overwrite the log afterwards."); - } - - if (options->Bridges) { - mark_bridge_list(); - for (cl = options->Bridges; cl; cl = cl->next) { - bridge_line_t *bridge_line = parse_bridge_line(cl->value); - if (!bridge_line) { - log_warn(LD_BUG, - "Previously validated Bridge line could not be added!"); - return -1; - } - bridge_add_from_config(bridge_line); - } - sweep_bridge_list(); - } - - if (running_tor && rend_config_services(options, 0)<0) { - log_warn(LD_BUG, - "Previously validated hidden services line could not be added!"); - return -1; - } - - if (running_tor && rend_parse_service_authorization(options, 0) < 0) { - log_warn(LD_BUG, "Previously validated client authorization for " - "hidden services could not be added!"); - return -1; - } - - /* Load state */ - if (! or_state_loaded() && running_tor) { - if (or_state_load()) - return -1; - rep_hist_load_mtbf_data(time(NULL)); - } - - mark_transport_list(); - pt_prepare_proxy_list_for_config_read(); - if (options->ClientTransportPlugin) { - for (cl = options->ClientTransportPlugin; cl; cl = cl->next) { - if (parse_client_transport_line(cl->value, 0)<0) { - log_warn(LD_BUG, - "Previously validated ClientTransportPlugin line " - "could not be added!"); - return -1; - } - } - } - - if (options->ServerTransportPlugin && server_mode(options)) { - for (cl = options->ServerTransportPlugin; cl; cl = cl->next) { - if (parse_server_transport_line(cl->value, 0)<0) { - log_warn(LD_BUG, - "Previously validated ServerTransportPlugin line " - "could not be added!"); - return -1; - } - } - } - sweep_transport_list(); - sweep_proxy_list(); - - /* Bail out at this point if we're not going to be a client or server: - * we want to not fork, and to log stuff to stderr. */ - if (!running_tor) - return 0; - - /* Finish backgrounding the process */ - if (options->RunAsDaemon) { - /* We may be calling this for the n'th time (on SIGHUP), but it's safe. */ - finish_daemon(options->DataDirectory); - } - - /* If needed, generate a new TLS DH prime according to the current torrc. */ - if (server_mode(options) && options->DynamicDHGroups) { - char *keydir = get_datadir_fname("keys"); - if (check_private_dir(keydir, CPD_CREATE, options->User)) { - tor_free(keydir); - return -1; - } - tor_free(keydir); - - if (!old_options || !old_options->DynamicDHGroups) { - char *fname = get_datadir_fname2("keys", "dynamic_dh_params"); - crypto_set_tls_dh_prime(fname); - tor_free(fname); - } - } else { /* clients don't need a dynamic DH prime. */ - crypto_set_tls_dh_prime(NULL); - } - - /* We want to reinit keys as needed before we do much of anything else: - keys are important, and other things can depend on them. */ - if (transition_affects_workers || - (options->V3AuthoritativeDir && (!old_options || - !old_options->V3AuthoritativeDir))) { - if (init_keys() < 0) { - log_warn(LD_BUG,"Error initializing keys; exiting"); - return -1; - } - } else if (old_options && - options_transition_requires_fresh_tls_context(old_options, - options)) { - if (router_initialize_tls_context() < 0) { - log_warn(LD_BUG,"Error initializing TLS context."); - return -1; - } - } - - /* Write our PID to the PID file. If we do not have write permissions we - * will log a warning */ - if (options->PidFile) - write_pidfile(options->PidFile); - - /* Register addressmap directives */ - config_register_addressmaps(options); - parse_virtual_addr_network(options->VirtualAddrNetworkIPv4, AF_INET,0,NULL); - parse_virtual_addr_network(options->VirtualAddrNetworkIPv6, AF_INET6,0,NULL); - - /* Update address policies. */ - if (policies_parse_from_options(options) < 0) { - /* This should be impossible, but let's be sure. */ - log_warn(LD_BUG,"Error parsing already-validated policy options."); - return -1; - } - - if (init_control_cookie_authentication(options->CookieAuthentication) < 0) { - log_warn(LD_CONFIG,"Error creating control cookie authentication file."); - return -1; - } - - /* If we have an ExtORPort, initialize its auth cookie. */ - if (init_ext_or_cookie_authentication(!!options->ExtORPort_lines) < 0) { - log_warn(LD_CONFIG,"Error creating Extended ORPort cookie file."); - return -1; - } - - monitor_owning_controller_process(options->OwningControllerProcess); - - /* reload keys as needed for rendezvous services. */ - if (rend_service_load_all_keys()<0) { - log_warn(LD_GENERAL,"Error loading rendezvous service keys"); - return -1; - } - - /* Set up accounting */ - if (accounting_parse_options(options, 0)<0) { - log_warn(LD_CONFIG,"Error in accounting options"); - return -1; - } - if (accounting_is_enabled(options)) - configure_accounting(time(NULL)); - -#ifdef USE_BUFFEREVENTS - /* If we're using the bufferevents implementation and our rate limits - * changed, we need to tell the rate-limiting system about it. */ - if (!old_options || - old_options->BandwidthRate != options->BandwidthRate || - old_options->BandwidthBurst != options->BandwidthBurst || - old_options->RelayBandwidthRate != options->RelayBandwidthRate || - old_options->RelayBandwidthBurst != options->RelayBandwidthBurst) - connection_bucket_init(); -#endif - - old_ewma_enabled = cell_ewma_enabled(); - /* Change the cell EWMA settings */ - cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus()); - /* If we just enabled ewma, set the cmux policy on all active channels */ - if (cell_ewma_enabled() && !old_ewma_enabled) { - channel_set_cmux_policy_everywhere(&ewma_policy); - } else if (!cell_ewma_enabled() && old_ewma_enabled) { - /* Turn it off everywhere */ - channel_set_cmux_policy_everywhere(NULL); - } - - /* Update the BridgePassword's hashed version as needed. We store this as a - * digest so that we can do side-channel-proof comparisons on it. - */ - if (options->BridgePassword) { - char *http_authenticator; - http_authenticator = alloc_http_authenticator(options->BridgePassword); - if (!http_authenticator) { - log_warn(LD_BUG, "Unable to allocate HTTP authenticator. Not setting " - "BridgePassword."); - return -1; - } - options->BridgePassword_AuthDigest_ = tor_malloc(DIGEST256_LEN); - crypto_digest256(options->BridgePassword_AuthDigest_, - http_authenticator, strlen(http_authenticator), - DIGEST_SHA256); - tor_free(http_authenticator); - } - - if (parse_outbound_addresses(options, 0, &msg) < 0) { - log_warn(LD_BUG, "Failed parsing oubound bind addresses: %s", msg); - tor_free(msg); - return -1; - } - - /* Check for transitions that need action. */ - if (old_options) { - int revise_trackexithosts = 0; - int revise_automap_entries = 0; - if ((options->UseEntryGuards && !old_options->UseEntryGuards) || - options->UseBridges != old_options->UseBridges || - (options->UseBridges && - !config_lines_eq(options->Bridges, old_options->Bridges)) || - !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes) || - !routerset_equal(old_options->ExcludeExitNodes, - options->ExcludeExitNodes) || - !routerset_equal(old_options->EntryNodes, options->EntryNodes) || - !routerset_equal(old_options->ExitNodes, options->ExitNodes) || - options->StrictNodes != old_options->StrictNodes) { - log_info(LD_CIRC, - "Changed to using entry guards or bridges, or changed " - "preferred or excluded node lists. " - "Abandoning previous circuits."); - circuit_mark_all_unused_circs(); - circuit_mark_all_dirty_circs_as_unusable(); - revise_trackexithosts = 1; - } - - if (!smartlist_strings_eq(old_options->TrackHostExits, - options->TrackHostExits)) - revise_trackexithosts = 1; - - if (revise_trackexithosts) - addressmap_clear_excluded_trackexithosts(options); - - if (!options->AutomapHostsOnResolve) { - if (old_options->AutomapHostsOnResolve) - revise_automap_entries = 1; - } else { - if (!smartlist_strings_eq(old_options->AutomapHostsSuffixes, - options->AutomapHostsSuffixes)) - revise_automap_entries = 1; - else if (!opt_streq(old_options->VirtualAddrNetworkIPv4, - options->VirtualAddrNetworkIPv4) || - !opt_streq(old_options->VirtualAddrNetworkIPv6, - options->VirtualAddrNetworkIPv6)) - revise_automap_entries = 1; - } - - if (revise_automap_entries) - addressmap_clear_invalid_automaps(options); - -/* How long should we delay counting bridge stats after becoming a bridge? - * We use this so we don't count people who used our bridge thinking it is - * a relay. If you change this, don't forget to change the log message - * below. It's 4 hours (the time it takes to stop being used by clients) - * plus some extra time for clock skew. */ -#define RELAY_BRIDGE_STATS_DELAY (6 * 60 * 60) - - if (! bool_eq(options->BridgeRelay, old_options->BridgeRelay)) { - int was_relay = 0; - if (options->BridgeRelay) { - time_t int_start = time(NULL); - if (config_lines_eq(old_options->ORPort_lines,options->ORPort_lines)) { - int_start += RELAY_BRIDGE_STATS_DELAY; - was_relay = 1; - } - geoip_bridge_stats_init(int_start); - log_info(LD_CONFIG, "We are acting as a bridge now. Starting new " - "GeoIP stats interval%s.", was_relay ? " in 6 " - "hours from now" : ""); - } else { - geoip_bridge_stats_term(); - log_info(LD_GENERAL, "We are no longer acting as a bridge. " - "Forgetting GeoIP stats."); - } - } - - if (transition_affects_workers) { - log_info(LD_GENERAL, - "Worker-related options changed. Rotating workers."); - - if (server_mode(options) && !server_mode(old_options)) { - ip_address_changed(0); - if (can_complete_circuit || !any_predicted_circuits(time(NULL))) - inform_testing_reachability(); - } - cpuworkers_rotate(); - if (dns_reset()) - return -1; - } else { - if (dns_reset()) - return -1; - } - - if (options->PerConnBWRate != old_options->PerConnBWRate || - options->PerConnBWBurst != old_options->PerConnBWBurst) - connection_or_update_token_buckets(get_connection_array(), options); - } - - config_maybe_load_geoip_files_(options, old_options); - - if (geoip_is_loaded(AF_INET) && options->GeoIPExcludeUnknown) { - /* ExcludeUnknown is true or "auto" */ - const int is_auto = options->GeoIPExcludeUnknown == -1; - int changed; - - changed = routerset_add_unknown_ccs(&options->ExcludeNodes, is_auto); - changed += routerset_add_unknown_ccs(&options->ExcludeExitNodes, is_auto); - - if (changed) - routerset_add_unknown_ccs(&options->ExcludeExitNodesUnion_, is_auto); - } - - if (options->CellStatistics || options->DirReqStatistics || - options->EntryStatistics || options->ExitPortStatistics || - options->ConnDirectionStatistics || - options->BridgeAuthoritativeDir) { - time_t now = time(NULL); - int print_notice = 0; - - /* If we aren't acting as a server, we can't collect stats anyway. */ - if (!server_mode(options)) { - options->CellStatistics = 0; - options->DirReqStatistics = 0; - options->EntryStatistics = 0; - options->ExitPortStatistics = 0; - } - - if ((!old_options || !old_options->CellStatistics) && - options->CellStatistics) { - rep_hist_buffer_stats_init(now); - print_notice = 1; - } - if ((!old_options || !old_options->DirReqStatistics) && - options->DirReqStatistics) { - if (geoip_is_loaded(AF_INET)) { - geoip_dirreq_stats_init(now); - print_notice = 1; - } else { - options->DirReqStatistics = 0; - /* Don't warn Tor clients, they don't use statistics */ - if (options->ORPort_set) - log_notice(LD_CONFIG, "Configured to measure directory request " - "statistics, but no GeoIP database found. " - "Please specify a GeoIP database using the " - "GeoIPFile option."); - } - } - if ((!old_options || !old_options->EntryStatistics) && - options->EntryStatistics && !should_record_bridge_info(options)) { - if (geoip_is_loaded(AF_INET) || geoip_is_loaded(AF_INET6)) { - geoip_entry_stats_init(now); - print_notice = 1; - } else { - options->EntryStatistics = 0; - log_notice(LD_CONFIG, "Configured to measure entry node " - "statistics, but no GeoIP database found. " - "Please specify a GeoIP database using the " - "GeoIPFile option."); - } - } - if ((!old_options || !old_options->ExitPortStatistics) && - options->ExitPortStatistics) { - rep_hist_exit_stats_init(now); - print_notice = 1; - } - if ((!old_options || !old_options->ConnDirectionStatistics) && - options->ConnDirectionStatistics) { - rep_hist_conn_stats_init(now); - } - if ((!old_options || !old_options->BridgeAuthoritativeDir) && - options->BridgeAuthoritativeDir) { - rep_hist_desc_stats_init(now); - print_notice = 1; - } - if (print_notice) - log_notice(LD_CONFIG, "Configured to measure statistics. Look for " - "the *-stats files that will first be written to the " - "data directory in 24 hours from now."); - } - - if (old_options && old_options->CellStatistics && - !options->CellStatistics) - rep_hist_buffer_stats_term(); - if (old_options && old_options->DirReqStatistics && - !options->DirReqStatistics) - geoip_dirreq_stats_term(); - if (old_options && old_options->EntryStatistics && - !options->EntryStatistics) - geoip_entry_stats_term(); - if (old_options && old_options->ExitPortStatistics && - !options->ExitPortStatistics) - rep_hist_exit_stats_term(); - if (old_options && old_options->ConnDirectionStatistics && - !options->ConnDirectionStatistics) - rep_hist_conn_stats_term(); - if (old_options && old_options->BridgeAuthoritativeDir && - !options->BridgeAuthoritativeDir) - rep_hist_desc_stats_term(); - - /* Check if we need to parse and add the EntryNodes config option. */ - if (options->EntryNodes && - (!old_options || - !routerset_equal(old_options->EntryNodes,options->EntryNodes) || - !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes))) - entry_nodes_should_be_added(); - - /* Since our options changed, we might need to regenerate and upload our - * server descriptor. - */ - if (!old_options || - options_transition_affects_descriptor(old_options, options)) - mark_my_descriptor_dirty("config change"); - - /* We may need to reschedule some directory stuff if our status changed. */ - if (old_options) { - if (authdir_mode_v3(options) && !authdir_mode_v3(old_options)) - dirvote_recalculate_timing(options, time(NULL)); - if (!bool_eq(directory_fetches_dir_info_early(options), - directory_fetches_dir_info_early(old_options)) || - !bool_eq(directory_fetches_dir_info_later(options), - directory_fetches_dir_info_later(old_options))) { - /* Make sure update_router_have_min_dir_info gets called. */ - router_dir_info_changed(); - /* We might need to download a new consensus status later or sooner than - * we had expected. */ - update_consensus_networkstatus_fetch_time(time(NULL)); - } - } - - /* Load the webpage we're going to serve every time someone asks for '/' on - our DirPort. */ - tor_free(global_dirfrontpagecontents); - if (options->DirPortFrontPage) { - global_dirfrontpagecontents = - read_file_to_str(options->DirPortFrontPage, 0, NULL); - if (!global_dirfrontpagecontents) { - log_warn(LD_CONFIG, - "DirPortFrontPage file '%s' not found. Continuing anyway.", - options->DirPortFrontPage); - } - } - - return 0; -} - -static const struct { - const char *name; - int takes_argument; -} CMDLINE_ONLY_OPTIONS[] = { - { "-f", 1 }, - { "--allow-missing-torrc", 0 }, - { "--defaults-torrc", 1 }, - { "--hash-password", 1 }, - { "--dump-config", 1 }, - { "--list-fingerprint", 0 }, - { "--verify-config", 0 }, - { "--ignore-missing-torrc", 0 }, - { "--quiet", 0 }, - { "--hush", 0 }, - { "--version", 0 }, - { "--library-versions", 0 }, - { "-h", 0 }, - { "--help", 0 }, - { "--list-torrc-options", 0 }, - { "--digests", 0 }, - { "--nt-service", 0 }, - { "-nt-service", 0 }, - { NULL, 0 }, -}; - -/** Helper: Read a list of configuration options from the command line. If - * successful, or if ignore_errors is set, put them in *result, put the - * commandline-only options in *cmdline_result, and return 0; - * otherwise, return -1 and leave *result and cmdline_result - * alone. */ -int -config_parse_commandline(int argc, char **argv, int ignore_errors, - config_line_t **result, - config_line_t **cmdline_result) -{ - config_line_t *param = NULL; - - config_line_t *front = NULL; - config_line_t **new = &front; - - config_line_t *front_cmdline = NULL; - config_line_t **new_cmdline = &front_cmdline; - - char *s, *arg; - int i = 1; - - while (i < argc) { - unsigned command = CONFIG_LINE_NORMAL; - int want_arg = 1; - int is_cmdline = 0; - int j; - - for (j = 0; CMDLINE_ONLY_OPTIONS[j].name != NULL; ++j) { - if (!strcmp(argv[i], CMDLINE_ONLY_OPTIONS[j].name)) { - is_cmdline = 1; - want_arg = CMDLINE_ONLY_OPTIONS[j].takes_argument; - break; - } - } - - s = argv[i]; - - /* Each keyword may be prefixed with one or two dashes. */ - if (*s == '-') - s++; - if (*s == '-') - s++; - /* Figure out the command, if any. */ - if (*s == '+') { - s++; - command = CONFIG_LINE_APPEND; - } else if (*s == '/') { - s++; - command = CONFIG_LINE_CLEAR; - /* A 'clear' command has no argument. */ - want_arg = 0; - } - - if (want_arg && i == argc-1) { - if (ignore_errors) { - arg = strdup(""); - } else { - log_warn(LD_CONFIG,"Command-line option '%s' with no value. Failing.", - argv[i]); - config_free_lines(front); - config_free_lines(front_cmdline); - return -1; - } - } else { - arg = want_arg ? tor_strdup(argv[i+1]) : strdup(""); - } - - param = tor_malloc_zero(sizeof(config_line_t)); - param->key = is_cmdline ? tor_strdup(argv[i]) : tor_strdup(s); - param->value = arg; - param->command = command; - param->next = NULL; - log_debug(LD_CONFIG, "command line: parsed keyword '%s', value '%s'", - param->key, param->value); - - if (is_cmdline) { - *new_cmdline = param; - new_cmdline = &((*new_cmdline)->next); - } else { - *new = param; - new = &((*new)->next); - } - - i += want_arg ? 2 : 1; - } - *cmdline_result = front_cmdline; - *result = front; - return 0; -} - -/** Return true iff key is a valid configuration option. */ -int -option_is_recognized(const char *key) -{ - const config_var_t *var = config_find_option(&options_format, key); - return (var != NULL); -} - -/** Return the canonical name of a configuration option, or NULL - * if no such option exists. */ -const char * -option_get_canonical_name(const char *key) -{ - const config_var_t *var = config_find_option(&options_format, key); - return var ? var->name : NULL; -} - -/** Return a canonical list of the options assigned for key. - */ -config_line_t * -option_get_assignment(const or_options_t *options, const char *key) -{ - return config_get_assigned_option(&options_format, options, key, 1); -} - -/** Try assigning list to the global options. You do this by duping - * options, assigning list to the new one, then validating it. If it's - * ok, then throw out the old one and stick with the new one. Else, - * revert to old and return failure. Return SETOPT_OK on success, or - * a setopt_err_t on failure. - * - * If not success, point *msg to a newly allocated string describing - * what went wrong. - */ -setopt_err_t -options_trial_assign(config_line_t *list, int use_defaults, - int clear_first, char **msg) -{ - int r; - or_options_t *trial_options = config_dup(&options_format, get_options()); - - if ((r=config_assign(&options_format, trial_options, - list, use_defaults, clear_first, msg)) < 0) { - config_free(&options_format, trial_options); - return r; - } - - if (options_validate(get_options_mutable(), trial_options, - global_default_options, 1, msg) < 0) { - config_free(&options_format, trial_options); - return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */ - } - - if (options_transition_allowed(get_options(), trial_options, msg) < 0) { - config_free(&options_format, trial_options); - return SETOPT_ERR_TRANSITION; - } - - if (set_options(trial_options, msg)<0) { - config_free(&options_format, trial_options); - return SETOPT_ERR_SETTING; - } - - /* we liked it. put it in place. */ - return SETOPT_OK; -} - -/** Print a usage message for tor. */ -static void -print_usage(void) -{ - printf( -"Copyright (c) 2001-2004, Roger Dingledine\n" -"Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2013, The Tor Project, Inc.\n\n" -"tor -f [args]\n" -"See man page for options, or https://www.torproject.org/ for " -"documentation.\n"); -} - -/** Print all non-obsolete torrc options. */ -static void -list_torrc_options(void) -{ - int i; - smartlist_t *lines = smartlist_new(); - for (i = 0; option_vars_[i].name; ++i) { - const config_var_t *var = &option_vars_[i]; - if (var->type == CONFIG_TYPE_OBSOLETE || - var->type == CONFIG_TYPE_LINELIST_V) - continue; - printf("%s\n", var->name); - } - smartlist_free(lines); -} - -/** Last value actually set by resolve_my_address. */ -static uint32_t last_resolved_addr = 0; - -/** Accessor for last_resolved_addr from outside this file. */ -uint32_t -get_last_resolved_addr(void) -{ - return last_resolved_addr; -} - -/** - * Use options-\>Address to guess our public IP address. - * - * Return 0 if all is well, or -1 if we can't find a suitable - * public IP address. - * - * If we are returning 0: - * - Put our public IP address (in host order) into *addr_out. - * - If method_out is non-NULL, set *method_out to a static - * string describing how we arrived at our answer. - * - If hostname_out is non-NULL, and we resolved a hostname to - * get our address, set *hostname_out to a newly allocated string - * holding that hostname. (If we didn't get our address by resolving a - * hostname, set *hostname_out to NULL.) - * - * XXXX ipv6 - */ -int -resolve_my_address(int warn_severity, const or_options_t *options, - uint32_t *addr_out, - const char **method_out, char **hostname_out) -{ - struct in_addr in; - uint32_t addr; /* host order */ - char hostname[256]; - const char *method_used; - const char *hostname_used; - int explicit_ip=1; - int explicit_hostname=1; - int from_interface=0; - char *addr_string = NULL; - const char *address = options->Address; - int notice_severity = warn_severity <= LOG_NOTICE ? - LOG_NOTICE : warn_severity; - - tor_assert(addr_out); - - /* - * Step one: Fill in 'hostname' to be our best guess. - */ - - if (address && *address) { - strlcpy(hostname, address, sizeof(hostname)); - } else { /* then we need to guess our address */ - explicit_ip = 0; /* it's implicit */ - explicit_hostname = 0; /* it's implicit */ - - if (gethostname(hostname, sizeof(hostname)) < 0) { - log_fn(warn_severity, LD_NET,"Error obtaining local hostname"); - return -1; - } - log_debug(LD_CONFIG, "Guessed local host name as '%s'", hostname); - } - - /* - * Step two: Now that we know 'hostname', parse it or resolve it. If - * it doesn't parse or resolve, look at the interface address. Set 'addr' - * to be our (host-order) 32-bit answer. - */ - - if (tor_inet_aton(hostname, &in) == 0) { - /* then we have to resolve it */ - explicit_ip = 0; - if (tor_lookup_hostname(hostname, &addr)) { /* failed to resolve */ - uint32_t interface_ip; /* host order */ - - if (explicit_hostname) { - log_fn(warn_severity, LD_CONFIG, - "Could not resolve local Address '%s'. Failing.", hostname); - return -1; - } - log_fn(notice_severity, LD_CONFIG, - "Could not resolve guessed local hostname '%s'. " - "Trying something else.", hostname); - if (get_interface_address(warn_severity, &interface_ip)) { - log_fn(warn_severity, LD_CONFIG, - "Could not get local interface IP address. Failing."); - return -1; - } - from_interface = 1; - addr = interface_ip; - log_fn(notice_severity, LD_CONFIG, "Learned IP address '%s' for " - "local interface. Using that.", fmt_addr32(addr)); - strlcpy(hostname, "", sizeof(hostname)); - } else { /* resolved hostname into addr */ - if (!explicit_hostname && - is_internal_IP(addr, 0)) { - uint32_t interface_ip; - - log_fn(notice_severity, LD_CONFIG, "Guessed local hostname '%s' " - "resolves to a private IP address (%s). Trying something " - "else.", hostname, fmt_addr32(addr)); - - if (get_interface_address(warn_severity, &interface_ip)) { - log_fn(warn_severity, LD_CONFIG, - "Could not get local interface IP address. Too bad."); - } else if (is_internal_IP(interface_ip, 0)) { - log_fn(notice_severity, LD_CONFIG, - "Interface IP address '%s' is a private address too. " - "Ignoring.", fmt_addr32(interface_ip)); - } else { - from_interface = 1; - addr = interface_ip; - log_fn(notice_severity, LD_CONFIG, - "Learned IP address '%s' for local interface." - " Using that.", fmt_addr32(addr)); - strlcpy(hostname, "", sizeof(hostname)); - } - } - } - } else { - addr = ntohl(in.s_addr); /* set addr so that addr_string is not - * illformed */ - } - - /* - * Step three: Check whether 'addr' is an internal IP address, and error - * out if it is and we don't want that. - */ - - addr_string = tor_dup_ip(addr); - if (is_internal_IP(addr, 0)) { - /* make sure we're ok with publishing an internal IP */ - if (!options->DirAuthorities && !options->AlternateDirAuthority) { - /* if they are using the default authorities, disallow internal IPs - * always. */ - log_fn(warn_severity, LD_CONFIG, - "Address '%s' resolves to private IP address '%s'. " - "Tor servers that use the default DirAuthorities must have " - "public IP addresses.", hostname, addr_string); - tor_free(addr_string); - return -1; - } - if (!explicit_ip) { - /* even if they've set their own authorities, require an explicit IP if - * they're using an internal address. */ - log_fn(warn_severity, LD_CONFIG, "Address '%s' resolves to private " - "IP address '%s'. Please set the Address config option to be " - "the IP address you want to use.", hostname, addr_string); - tor_free(addr_string); - return -1; - } - } - - /* - * Step four: We have a winner! 'addr' is our answer for sure, and - * 'addr_string' is its string form. Fill out the various fields to - * say how we decided it. - */ - - log_debug(LD_CONFIG, "Resolved Address to '%s'.", addr_string); - - if (explicit_ip) { - method_used = "CONFIGURED"; - hostname_used = NULL; - } else if (explicit_hostname) { - method_used = "RESOLVED"; - hostname_used = hostname; - } else if (from_interface) { - method_used = "INTERFACE"; - hostname_used = NULL; - } else { - method_used = "GETHOSTNAME"; - hostname_used = hostname; - } - - *addr_out = addr; - if (method_out) - *method_out = method_used; - if (hostname_out) - *hostname_out = hostname_used ? tor_strdup(hostname_used) : NULL; - - /* - * Step five: Check if the answer has changed since last time (or if - * there was no last time), and if so call various functions to keep - * us up-to-date. - */ - - if (last_resolved_addr && last_resolved_addr != *addr_out) { - /* Leave this as a notice, regardless of the requested severity, - * at least until dynamic IP address support becomes bulletproof. */ - log_notice(LD_NET, - "Your IP address seems to have changed to %s " - "(METHOD=%s%s%s). Updating.", - addr_string, method_used, - hostname_used ? " HOSTNAME=" : "", - hostname_used ? hostname_used : ""); - ip_address_changed(0); - } - - if (last_resolved_addr != *addr_out) { - control_event_server_status(LOG_NOTICE, - "EXTERNAL_ADDRESS ADDRESS=%s METHOD=%s%s%s", - addr_string, method_used, - hostname_used ? " HOSTNAME=" : "", - hostname_used ? hostname_used : ""); - } - last_resolved_addr = *addr_out; - - /* - * And finally, clean up and return success. - */ - - tor_free(addr_string); - return 0; -} - -/** Return true iff addr is judged to be on the same network as us, or - * on a private network. - */ -int -is_local_addr(const tor_addr_t *addr) -{ - if (tor_addr_is_internal(addr, 0)) - return 1; - /* Check whether ip is on the same /24 as we are. */ - if (get_options()->EnforceDistinctSubnets == 0) - return 0; - if (tor_addr_family(addr) == AF_INET) { - /*XXXX023 IP6 what corresponds to an /24? */ - uint32_t ip = tor_addr_to_ipv4h(addr); - - /* It's possible that this next check will hit before the first time - * resolve_my_address actually succeeds. (For clients, it is likely that - * resolve_my_address will never be called at all). In those cases, - * last_resolved_addr will be 0, and so checking to see whether ip is on - * the same /24 as last_resolved_addr will be the same as checking whether - * it was on net 0, which is already done by is_internal_IP. - */ - if ((last_resolved_addr & (uint32_t)0xffffff00ul) - == (ip & (uint32_t)0xffffff00ul)) - return 1; - } - return 0; -} - -/** Return a new empty or_options_t. Used for testing. */ -or_options_t * -options_new(void) -{ - return config_new(&options_format); -} - -/** Set options to hold reasonable defaults for most options. - * Each option defaults to zero. */ -void -options_init(or_options_t *options) -{ - config_init(&options_format, options); -} - -/** Return a string containing a possible configuration file that would give - * the configuration in options. If minimal is true, do not - * include options that are the same as Tor's defaults. - */ -char * -options_dump(const or_options_t *options, int how_to_dump) -{ - const or_options_t *use_defaults; - int minimal; - switch (how_to_dump) { - case OPTIONS_DUMP_MINIMAL: - use_defaults = global_default_options; - minimal = 1; - break; - case OPTIONS_DUMP_DEFAULTS: - use_defaults = NULL; - minimal = 1; - break; - case OPTIONS_DUMP_ALL: - use_defaults = NULL; - minimal = 0; - break; - default: - log_warn(LD_BUG, "Bogus value for how_to_dump==%d", how_to_dump); - return NULL; - } - - return config_dump(&options_format, use_defaults, options, minimal, 0); -} - -/** Return 0 if every element of sl is a string holding a decimal - * representation of a port number, or if sl is NULL. - * Otherwise set *msg and return -1. */ -static int -validate_ports_csv(smartlist_t *sl, const char *name, char **msg) -{ - int i; - tor_assert(name); - - if (!sl) - return 0; - - SMARTLIST_FOREACH(sl, const char *, cp, - { - i = atoi(cp); - if (i < 1 || i > 65535) { - tor_asprintf(msg, "Port '%s' out of range in %s", cp, name); - return -1; - } - }); - return 0; -} - -/** If value exceeds ROUTER_MAX_DECLARED_BANDWIDTH, write - * a complaint into *msg using string desc, and return -1. - * Else return 0. - */ -static int -ensure_bandwidth_cap(uint64_t *value, const char *desc, char **msg) -{ - if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) { - /* This handles an understandable special case where somebody says "2gb" - * whereas our actual maximum is 2gb-1 (INT_MAX) */ - --*value; - } - if (*value > ROUTER_MAX_DECLARED_BANDWIDTH) { - tor_asprintf(msg, "%s ("U64_FORMAT") must be at most %d", - desc, U64_PRINTF_ARG(*value), - ROUTER_MAX_DECLARED_BANDWIDTH); - return -1; - } - return 0; -} - -/** Parse an authority type from options-\>PublishServerDescriptor - * and write it to options-\>PublishServerDescriptor_. Treat "1" - * as "v3" unless BridgeRelay is 1, in which case treat it as "bridge". - * Treat "0" as "". - * Return 0 on success or -1 if not a recognized authority type (in which - * case the value of PublishServerDescriptor_ is undefined). */ -static int -compute_publishserverdescriptor(or_options_t *options) -{ - smartlist_t *list = options->PublishServerDescriptor; - dirinfo_type_t *auth = &options->PublishServerDescriptor_; - *auth = NO_DIRINFO; - if (!list) /* empty list, answer is none */ - return 0; - SMARTLIST_FOREACH_BEGIN(list, const char *, string) { - if (!strcasecmp(string, "v1")) - *auth |= V1_DIRINFO; - else if (!strcmp(string, "1")) - if (options->BridgeRelay) - *auth |= BRIDGE_DIRINFO; - else - *auth |= V3_DIRINFO; - else if (!strcasecmp(string, "v2")) - /* obsolete */; - else if (!strcasecmp(string, "v3")) - *auth |= V3_DIRINFO; - else if (!strcasecmp(string, "bridge")) - *auth |= BRIDGE_DIRINFO; - else if (!strcasecmp(string, "hidserv")) - log_warn(LD_CONFIG, - "PublishServerDescriptor hidserv is invalid. See " - "PublishHidServDescriptors."); - else if (!strcasecmp(string, "") || !strcmp(string, "0")) - /* no authority */; - else - return -1; - } SMARTLIST_FOREACH_END(string); - return 0; -} - -/** Lowest allowable value for RendPostPeriod; if this is too low, hidden - * services can overload the directory system. */ -#define MIN_REND_POST_PERIOD (10*60) - -/** Highest allowable value for RendPostPeriod. */ -#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) - -/** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor - * will generate too many circuits and potentially overload the network. */ -#define MIN_MAX_CIRCUIT_DIRTINESS 10 - -/** Highest allowable value for MaxCircuitDirtiness: prevents time_t - * overflows. */ -#define MAX_MAX_CIRCUIT_DIRTINESS (30*24*60*60) - -/** Lowest allowable value for CircuitStreamTimeout; if this is too low, Tor - * will generate too many circuits and potentially overload the network. */ -#define MIN_CIRCUIT_STREAM_TIMEOUT 10 - -/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might - * expose more information than we're comfortable with. */ -#define MIN_HEARTBEAT_PERIOD (30*60) - -/** Lowest recommended value for CircuitBuildTimeout; if it is set too low - * and LearnCircuitBuildTimeout is off, the failure rate for circuit - * construction may be very high. In that case, if it is set below this - * threshold emit a warning. - * */ -#define RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT (10) - -static int -options_validate_cb(void *old_options, void *options, void *default_options, - int from_setconf, char **msg) -{ - return options_validate(old_options, options, default_options, - from_setconf, msg); -} - -/** Return 0 if every setting in options is reasonable, is a - * permissible transition from old_options, and none of the - * testing-only settings differ from default_options unless in - * testing mode. Else return -1. Should have no side effects, except for - * normalizing the contents of options. - * - * On error, tor_strdup an error explanation into *msg. - * - * XXX - * If from_setconf, we were called by the controller, and our - * Log line should stay empty. If it's 0, then give us a default log - * if there are no logs defined. - */ -STATIC int -options_validate(or_options_t *old_options, or_options_t *options, - or_options_t *default_options, int from_setconf, char **msg) -{ - int i; - config_line_t *cl; - const char *uname = get_uname(); - int n_ports=0; -#define REJECT(arg) \ - STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END -#define COMPLAIN(arg) STMT_BEGIN log_warn(LD_CONFIG, arg); STMT_END - - tor_assert(msg); - *msg = NULL; - - if (server_mode(options) && - (!strcmpstart(uname, "Windows 95") || - !strcmpstart(uname, "Windows 98") || - !strcmpstart(uname, "Windows Me"))) { - log_warn(LD_CONFIG, "Tor is running as a server, but you are " - "running %s; this probably won't work. See " - "https://wiki.torproject.org/TheOnionRouter/TorFAQ#ServerOS " - "for details.", uname); - } - - if (parse_ports(options, 1, msg, &n_ports) < 0) - return -1; - - if (parse_outbound_addresses(options, 1, msg) < 0) - return -1; - - if (validate_data_directory(options)<0) - REJECT("Invalid DataDirectory"); - - if (options->Nickname == NULL) { - if (server_mode(options)) { - options->Nickname = tor_strdup(UNNAMED_ROUTER_NICKNAME); - } - } else { - if (!is_legal_nickname(options->Nickname)) { - tor_asprintf(msg, - "Nickname '%s' is wrong length or contains illegal characters.", - options->Nickname); - return -1; - } - } - - if (server_mode(options) && !options->ContactInfo) - log_notice(LD_CONFIG, "Your ContactInfo config option is not set. " - "Please consider setting it, so we can contact you if your server is " - "misconfigured or something else goes wrong."); - - /* Special case on first boot if no Log options are given. */ - if (!options->Logs && !options->RunAsDaemon && !from_setconf) { - if (quiet_level == 0) - config_line_append(&options->Logs, "Log", "notice stdout"); - else if (quiet_level == 1) - config_line_append(&options->Logs, "Log", "warn stdout"); - } - - if (options_init_logs(options, 1)<0) /* Validate the tor_log(s) */ - REJECT("Failed to validate Log options. See logs for details."); - - if (authdir_mode(options)) { - /* confirm that our address isn't broken, so we can complain now */ - uint32_t tmp; - if (resolve_my_address(LOG_WARN, options, &tmp, NULL, NULL) < 0) - REJECT("Failed to resolve/guess local address. See logs for details."); - } - -#ifndef _WIN32 - if (options->RunAsDaemon && torrc_fname && path_is_relative(torrc_fname)) - REJECT("Can't use a relative path to torrc when RunAsDaemon is set."); -#endif - - /* XXXX require that the only port not be DirPort? */ - /* XXXX require that at least one port be listened-upon. */ - if (n_ports == 0 && !options->RendConfigLines) - log_warn(LD_CONFIG, - "SocksPort, TransPort, NATDPort, DNSPort, and ORPort are all " - "undefined, and there aren't any hidden services configured. " - "Tor will still run, but probably won't do anything."); - - options->TransProxyType_parsed = TPT_DEFAULT; -#ifdef USE_TRANSPARENT - if (options->TransProxyType) { - if (!strcasecmp(options->TransProxyType, "default")) { - options->TransProxyType_parsed = TPT_DEFAULT; - } else if (!strcasecmp(options->TransProxyType, "tproxy")) { -#ifndef __linux__ - REJECT("TPROXY is a Linux-specific feature."); -#else - options->TransProxyType_parsed = TPT_TPROXY; -#endif - } else { - REJECT("Unrecognized value for TransProxyType"); - } - - if (strcasecmp(options->TransProxyType, "default") && - !options->TransPort_set) { - REJECT("Cannot use TransProxyType without any valid TransPort or " - "TransListenAddress."); - } - } -#else - if (options->TransPort_set) - REJECT("TransPort and TransListenAddress are disabled " - "in this build."); -#endif - - if (options->TokenBucketRefillInterval <= 0 - || options->TokenBucketRefillInterval > 1000) { - REJECT("TokenBucketRefillInterval must be between 1 and 1000 inclusive."); - } - - if (options->ExcludeExitNodes || options->ExcludeNodes) { - options->ExcludeExitNodesUnion_ = routerset_new(); - routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeExitNodes); - routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeNodes); - } - - if (options->NodeFamilies) { - options->NodeFamilySets = smartlist_new(); - for (cl = options->NodeFamilies; cl; cl = cl->next) { - routerset_t *rs = routerset_new(); - if (routerset_parse(rs, cl->value, cl->key) == 0) { - smartlist_add(options->NodeFamilySets, rs); - } else { - routerset_free(rs); - } - } - } - - if (options->TLSECGroup && (strcasecmp(options->TLSECGroup, "P256") && - strcasecmp(options->TLSECGroup, "P224"))) { - COMPLAIN("Unrecognized TLSECGroup: Falling back to the default."); - tor_free(options->TLSECGroup); - } - - if (options->ExcludeNodes && options->StrictNodes) { - COMPLAIN("You have asked to exclude certain relays from all positions " - "in your circuits. Expect hidden services and other Tor " - "features to be broken in unpredictable ways."); - } - - if (options->AuthoritativeDir) { - if (!options->ContactInfo && !options->TestingTorNetwork) - REJECT("Authoritative directory servers must set ContactInfo"); - if (options->V1AuthoritativeDir && !options->RecommendedVersions) - REJECT("V1 authoritative dir servers must set RecommendedVersions."); - if (!options->RecommendedClientVersions) - options->RecommendedClientVersions = - config_lines_dup(options->RecommendedVersions); - if (!options->RecommendedServerVersions) - options->RecommendedServerVersions = - config_lines_dup(options->RecommendedVersions); - if (options->VersioningAuthoritativeDir && - (!options->RecommendedClientVersions || - !options->RecommendedServerVersions)) - REJECT("Versioning authoritative dir servers must set " - "Recommended*Versions."); - if (options->UseEntryGuards) { - log_info(LD_CONFIG, "Authoritative directory servers can't set " - "UseEntryGuards. Disabling."); - options->UseEntryGuards = 0; - } - if (!options->DownloadExtraInfo && authdir_mode_any_main(options)) { - log_info(LD_CONFIG, "Authoritative directories always try to download " - "extra-info documents. Setting DownloadExtraInfo."); - options->DownloadExtraInfo = 1; - } - if (!(options->BridgeAuthoritativeDir || options->HSAuthoritativeDir || - options->V1AuthoritativeDir || - options->V3AuthoritativeDir)) - REJECT("AuthoritativeDir is set, but none of " - "(Bridge/HS/V1/V3)AuthoritativeDir is set."); - /* If we have a v3bandwidthsfile and it's broken, complain on startup */ - if (options->V3BandwidthsFile && !old_options) { - dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL); - } - } - - if (options->AuthoritativeDir && !options->DirPort_set) - REJECT("Running as authoritative directory, but no DirPort set."); - - if (options->AuthoritativeDir && !options->ORPort_set) - REJECT("Running as authoritative directory, but no ORPort set."); - - if (options->AuthoritativeDir && options->ClientOnly) - REJECT("Running as authoritative directory, but ClientOnly also set."); - - if (options->FetchDirInfoExtraEarly && !options->FetchDirInfoEarly) - REJECT("FetchDirInfoExtraEarly requires that you also set " - "FetchDirInfoEarly"); - - if (options->HSAuthoritativeDir && proxy_mode(options)) - REJECT("Running as authoritative v0 HS directory, but also configured " - "as a client."); - - if (options->ConnLimit <= 0) { - tor_asprintf(msg, - "ConnLimit must be greater than 0, but was set to %d", - options->ConnLimit); - return -1; - } - - if (options->PathsNeededToBuildCircuits >= 0.0) { - if (options->PathsNeededToBuildCircuits < 0.25) { - log_warn(LD_CONFIG, "PathsNeededToBuildCircuits is too low. Increasing " - "to 0.25"); - options->PathsNeededToBuildCircuits = 0.25; - } else if (options->PathsNeededToBuildCircuits > 0.95) { - log_warn(LD_CONFIG, "PathsNeededToBuildCircuits is too high. Decreasing " - "to 0.95"); - options->PathsNeededToBuildCircuits = 0.95; - } - } - - if (options->MaxClientCircuitsPending <= 0 || - options->MaxClientCircuitsPending > MAX_MAX_CLIENT_CIRCUITS_PENDING) { - tor_asprintf(msg, - "MaxClientCircuitsPending must be between 1 and %d, but " - "was set to %d", MAX_MAX_CLIENT_CIRCUITS_PENDING, - options->MaxClientCircuitsPending); - return -1; - } - - if (validate_ports_csv(options->FirewallPorts, "FirewallPorts", msg) < 0) - return -1; - - if (validate_ports_csv(options->LongLivedPorts, "LongLivedPorts", msg) < 0) - return -1; - - if (validate_ports_csv(options->RejectPlaintextPorts, - "RejectPlaintextPorts", msg) < 0) - return -1; - - if (validate_ports_csv(options->WarnPlaintextPorts, - "WarnPlaintextPorts", msg) < 0) - return -1; - - if (options->FascistFirewall && !options->ReachableAddresses) { - if (options->FirewallPorts && smartlist_len(options->FirewallPorts)) { - /* We already have firewall ports set, so migrate them to - * ReachableAddresses, which will set ReachableORAddresses and - * ReachableDirAddresses if they aren't set explicitly. */ - smartlist_t *instead = smartlist_new(); - config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t)); - new_line->key = tor_strdup("ReachableAddresses"); - /* If we're configured with the old format, we need to prepend some - * open ports. */ - SMARTLIST_FOREACH(options->FirewallPorts, const char *, portno, - { - int p = atoi(portno); - if (p<0) continue; - smartlist_add_asprintf(instead, "*:%d", p); - }); - new_line->value = smartlist_join_strings(instead,",",0,NULL); - /* These have been deprecated since 0.1.1.5-alpha-cvs */ - log_notice(LD_CONFIG, - "Converting FascistFirewall and FirewallPorts " - "config options to new format: \"ReachableAddresses %s\"", - new_line->value); - options->ReachableAddresses = new_line; - SMARTLIST_FOREACH(instead, char *, cp, tor_free(cp)); - smartlist_free(instead); - } else { - /* We do not have FirewallPorts set, so add 80 to - * ReachableDirAddresses, and 443 to ReachableORAddresses. */ - if (!options->ReachableDirAddresses) { - config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t)); - new_line->key = tor_strdup("ReachableDirAddresses"); - new_line->value = tor_strdup("*:80"); - options->ReachableDirAddresses = new_line; - log_notice(LD_CONFIG, "Converting FascistFirewall config option " - "to new format: \"ReachableDirAddresses *:80\""); - } - if (!options->ReachableORAddresses) { - config_line_t *new_line = tor_malloc_zero(sizeof(config_line_t)); - new_line->key = tor_strdup("ReachableORAddresses"); - new_line->value = tor_strdup("*:443"); - options->ReachableORAddresses = new_line; - log_notice(LD_CONFIG, "Converting FascistFirewall config option " - "to new format: \"ReachableORAddresses *:443\""); - } - } - } - - for (i=0; i<3; i++) { - config_line_t **linep = - (i==0) ? &options->ReachableAddresses : - (i==1) ? &options->ReachableORAddresses : - &options->ReachableDirAddresses; - if (!*linep) - continue; - /* We need to end with a reject *:*, not an implicit accept *:* */ - for (;;) { - if (!strcmp((*linep)->value, "reject *:*")) /* already there */ - break; - linep = &((*linep)->next); - if (!*linep) { - *linep = tor_malloc_zero(sizeof(config_line_t)); - (*linep)->key = tor_strdup( - (i==0) ? "ReachableAddresses" : - (i==1) ? "ReachableORAddresses" : - "ReachableDirAddresses"); - (*linep)->value = tor_strdup("reject *:*"); - break; - } - } - } - - if ((options->ReachableAddresses || - options->ReachableORAddresses || - options->ReachableDirAddresses) && - server_mode(options)) - REJECT("Servers must be able to freely connect to the rest " - "of the Internet, so they must not set Reachable*Addresses " - "or FascistFirewall."); - - if (options->UseBridges && - server_mode(options)) - REJECT("Servers must be able to freely connect to the rest " - "of the Internet, so they must not set UseBridges."); - - /* If both of these are set, we'll end up with funny behavior where we - * demand enough entrynodes be up and running else we won't build - * circuits, yet we never actually use them. */ - if (options->UseBridges && options->EntryNodes) - REJECT("You cannot set both UseBridges and EntryNodes."); - - if (options->EntryNodes && !options->UseEntryGuards) { - REJECT("If EntryNodes is set, UseEntryGuards must be enabled."); - } - - if (options->MaxMemInCellQueues < (500 << 20)) { - log_warn(LD_CONFIG, "MaxMemInCellQueues must be at least 500 MB for now. " - "Ideally, have it as large as you can afford."); - options->MaxMemInCellQueues = (500 << 20); - } - - options->AllowInvalid_ = 0; - - if (options->AllowInvalidNodes) { - SMARTLIST_FOREACH_BEGIN(options->AllowInvalidNodes, const char *, cp) { - if (!strcasecmp(cp, "entry")) - options->AllowInvalid_ |= ALLOW_INVALID_ENTRY; - else if (!strcasecmp(cp, "exit")) - options->AllowInvalid_ |= ALLOW_INVALID_EXIT; - else if (!strcasecmp(cp, "middle")) - options->AllowInvalid_ |= ALLOW_INVALID_MIDDLE; - else if (!strcasecmp(cp, "introduction")) - options->AllowInvalid_ |= ALLOW_INVALID_INTRODUCTION; - else if (!strcasecmp(cp, "rendezvous")) - options->AllowInvalid_ |= ALLOW_INVALID_RENDEZVOUS; - else { - tor_asprintf(msg, - "Unrecognized value '%s' in AllowInvalidNodes", cp); - return -1; - } - } SMARTLIST_FOREACH_END(cp); - } - - if (!options->SafeLogging || - !strcasecmp(options->SafeLogging, "0")) { - options->SafeLogging_ = SAFELOG_SCRUB_NONE; - } else if (!strcasecmp(options->SafeLogging, "relay")) { - options->SafeLogging_ = SAFELOG_SCRUB_RELAY; - } else if (!strcasecmp(options->SafeLogging, "1")) { - options->SafeLogging_ = SAFELOG_SCRUB_ALL; - } else { - tor_asprintf(msg, - "Unrecognized value '%s' in SafeLogging", - escaped(options->SafeLogging)); - return -1; - } - - if (compute_publishserverdescriptor(options) < 0) { - tor_asprintf(msg, "Unrecognized value in PublishServerDescriptor"); - return -1; - } - - if ((options->BridgeRelay - || options->PublishServerDescriptor_ & BRIDGE_DIRINFO) - && (options->PublishServerDescriptor_ - & (V1_DIRINFO|V3_DIRINFO))) { - REJECT("Bridges are not supposed to publish router descriptors to the " - "directory authorities. Please correct your " - "PublishServerDescriptor line."); - } - - if (options->BridgeRelay && options->DirPort_set) { - log_warn(LD_CONFIG, "Can't set a DirPort on a bridge relay; disabling " - "DirPort"); - config_free_lines(options->DirPort_lines); - options->DirPort_lines = NULL; - options->DirPort_set = 0; - } - - if (options->MinUptimeHidServDirectoryV2 < 0) { - log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at " - "least 0 seconds. Changing to 0."); - options->MinUptimeHidServDirectoryV2 = 0; - } - - if (options->RendPostPeriod < MIN_REND_POST_PERIOD) { - log_warn(LD_CONFIG, "RendPostPeriod option is too short; " - "raising to %d seconds.", MIN_REND_POST_PERIOD); - options->RendPostPeriod = MIN_REND_POST_PERIOD; - } - - if (options->RendPostPeriod > MAX_DIR_PERIOD) { - log_warn(LD_CONFIG, "RendPostPeriod is too large; clipping to %ds.", - MAX_DIR_PERIOD); - options->RendPostPeriod = MAX_DIR_PERIOD; - } - - if (options->Tor2webMode && options->LearnCircuitBuildTimeout) { - /* LearnCircuitBuildTimeout and Tor2webMode are incompatible in - * two ways: - * - * - LearnCircuitBuildTimeout results in a low CBT, which - * Tor2webMode's use of one-hop rendezvous circuits lowers - * much further, producing *far* too many timeouts. - * - * - The adaptive CBT code does not update its timeout estimate - * using build times for single-hop circuits. - * - * If we fix both of these issues someday, we should test - * Tor2webMode with LearnCircuitBuildTimeout on again. */ - log_notice(LD_CONFIG,"Tor2webMode is enabled; turning " - "LearnCircuitBuildTimeout off."); - options->LearnCircuitBuildTimeout = 0; - } - - if (options->Tor2webMode && options->UseEntryGuards) { - /* tor2web mode clients do not (and should not) use entry guards - * in any meaningful way. Further, tor2web mode causes the hidden - * service client code to do things which break the path bias - * detector, and it's far easier to turn off entry guards (and - * thus the path bias detector with it) than to figure out how to - * make a piece of code which cannot possibly help tor2web mode - * users compatible with tor2web mode. - */ - log_notice(LD_CONFIG, - "Tor2WebMode is enabled; disabling UseEntryGuards."); - options->UseEntryGuards = 0; - } - - if (!(options->UseEntryGuards) && - (options->RendConfigLines != NULL)) { - log_warn(LD_CONFIG, - "UseEntryGuards is disabled, but you have configured one or more " - "hidden services on this Tor instance. Your hidden services " - "will be very easy to locate using a well-known attack -- see " - "http://freehaven.net/anonbib/#hs-attack06 for details."); - } - - if (!options->LearnCircuitBuildTimeout && options->CircuitBuildTimeout && - options->CircuitBuildTimeout < RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT) { - log_warn(LD_CONFIG, - "CircuitBuildTimeout is shorter (%d seconds) than the recommended " - "minimum (%d seconds), and LearnCircuitBuildTimeout is disabled. " - "If tor isn't working, raise this value or enable " - "LearnCircuitBuildTimeout.", - options->CircuitBuildTimeout, - RECOMMENDED_MIN_CIRCUIT_BUILD_TIMEOUT ); - } else if (!options->LearnCircuitBuildTimeout && - !options->CircuitBuildTimeout) { - log_notice(LD_CONFIG, "You disabled LearnCircuitBuildTimeout, but didn't " - "a CircuitBuildTimeout. I'll pick a plausible default."); - } - - if (options->PathBiasNoticeRate > 1.0) { - tor_asprintf(msg, - "PathBiasNoticeRate is too high. " - "It must be between 0 and 1.0"); - return -1; - } - if (options->PathBiasWarnRate > 1.0) { - tor_asprintf(msg, - "PathBiasWarnRate is too high. " - "It must be between 0 and 1.0"); - return -1; - } - if (options->PathBiasExtremeRate > 1.0) { - tor_asprintf(msg, - "PathBiasExtremeRate is too high. " - "It must be between 0 and 1.0"); - return -1; - } - if (options->PathBiasNoticeUseRate > 1.0) { - tor_asprintf(msg, - "PathBiasNoticeUseRate is too high. " - "It must be between 0 and 1.0"); - return -1; - } - if (options->PathBiasExtremeUseRate > 1.0) { - tor_asprintf(msg, - "PathBiasExtremeUseRate is too high. " - "It must be between 0 and 1.0"); - return -1; - } - - if (options->MaxCircuitDirtiness < MIN_MAX_CIRCUIT_DIRTINESS) { - log_warn(LD_CONFIG, "MaxCircuitDirtiness option is too short; " - "raising to %d seconds.", MIN_MAX_CIRCUIT_DIRTINESS); - options->MaxCircuitDirtiness = MIN_MAX_CIRCUIT_DIRTINESS; - } - - if (options->MaxCircuitDirtiness > MAX_MAX_CIRCUIT_DIRTINESS) { - log_warn(LD_CONFIG, "MaxCircuitDirtiness option is too high; " - "setting to %d days.", MAX_MAX_CIRCUIT_DIRTINESS/86400); - options->MaxCircuitDirtiness = MAX_MAX_CIRCUIT_DIRTINESS; - } - - if (options->CircuitStreamTimeout && - options->CircuitStreamTimeout < MIN_CIRCUIT_STREAM_TIMEOUT) { - log_warn(LD_CONFIG, "CircuitStreamTimeout option is too short; " - "raising to %d seconds.", MIN_CIRCUIT_STREAM_TIMEOUT); - options->CircuitStreamTimeout = MIN_CIRCUIT_STREAM_TIMEOUT; - } - - if (options->HeartbeatPeriod && - options->HeartbeatPeriod < MIN_HEARTBEAT_PERIOD) { - log_warn(LD_CONFIG, "HeartbeatPeriod option is too short; " - "raising to %d seconds.", MIN_HEARTBEAT_PERIOD); - options->HeartbeatPeriod = MIN_HEARTBEAT_PERIOD; - } - - if (options->KeepalivePeriod < 1) - REJECT("KeepalivePeriod option must be positive."); - - if (ensure_bandwidth_cap(&options->BandwidthRate, - "BandwidthRate", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->BandwidthBurst, - "BandwidthBurst", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->MaxAdvertisedBandwidth, - "MaxAdvertisedBandwidth", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->RelayBandwidthRate, - "RelayBandwidthRate", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->RelayBandwidthBurst, - "RelayBandwidthBurst", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->PerConnBWRate, - "PerConnBWRate", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->PerConnBWBurst, - "PerConnBWBurst", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->AuthDirFastGuarantee, - "AuthDirFastGuarantee", msg) < 0) - return -1; - if (ensure_bandwidth_cap(&options->AuthDirGuardBWGuarantee, - "AuthDirGuardBWGuarantee", msg) < 0) - return -1; - - if (options->RelayBandwidthRate && !options->RelayBandwidthBurst) - options->RelayBandwidthBurst = options->RelayBandwidthRate; - if (options->RelayBandwidthBurst && !options->RelayBandwidthRate) - options->RelayBandwidthRate = options->RelayBandwidthBurst; - - if (server_mode(options)) { - if (options->BandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { - tor_asprintf(msg, - "BandwidthRate is set to %d bytes/second. " - "For servers, it must be at least %d.", - (int)options->BandwidthRate, - ROUTER_REQUIRED_MIN_BANDWIDTH); - return -1; - } else if (options->MaxAdvertisedBandwidth < - ROUTER_REQUIRED_MIN_BANDWIDTH/2) { - tor_asprintf(msg, - "MaxAdvertisedBandwidth is set to %d bytes/second. " - "For servers, it must be at least %d.", - (int)options->MaxAdvertisedBandwidth, - ROUTER_REQUIRED_MIN_BANDWIDTH/2); - return -1; - } - if (options->RelayBandwidthRate && - options->RelayBandwidthRate < ROUTER_REQUIRED_MIN_BANDWIDTH) { - tor_asprintf(msg, - "RelayBandwidthRate is set to %d bytes/second. " - "For servers, it must be at least %d.", - (int)options->RelayBandwidthRate, - ROUTER_REQUIRED_MIN_BANDWIDTH); - return -1; - } - } - - if (options->RelayBandwidthRate > options->RelayBandwidthBurst) - REJECT("RelayBandwidthBurst must be at least equal " - "to RelayBandwidthRate."); - - if (options->BandwidthRate > options->BandwidthBurst) - REJECT("BandwidthBurst must be at least equal to BandwidthRate."); - - /* if they set relaybandwidth* really high but left bandwidth* - * at the default, raise the defaults. */ - if (options->RelayBandwidthRate > options->BandwidthRate) - options->BandwidthRate = options->RelayBandwidthRate; - if (options->RelayBandwidthBurst > options->BandwidthBurst) - options->BandwidthBurst = options->RelayBandwidthBurst; - - if (accounting_parse_options(options, 1)<0) - REJECT("Failed to parse accounting options. See logs for details."); - - if (options->AccountingMax) { - if (options->RendConfigLines && server_mode(options)) { - log_warn(LD_CONFIG, "Using accounting with a hidden service and an " - "ORPort is risky: your hidden service(s) and your public " - "address will all turn off at the same time, which may alert " - "observers that they are being run by the same party."); - } else if (config_count_key(options->RendConfigLines, - "HiddenServiceDir") > 1) { - log_warn(LD_CONFIG, "Using accounting with multiple hidden services is " - "risky: they will all turn off at the same time, which may " - "alert observers that they are being run by the same party."); - } - } - - if (options->HTTPProxy) { /* parse it now */ - if (tor_addr_port_lookup(options->HTTPProxy, - &options->HTTPProxyAddr, &options->HTTPProxyPort) < 0) - REJECT("HTTPProxy failed to parse or resolve. Please fix."); - if (options->HTTPProxyPort == 0) { /* give it a default */ - options->HTTPProxyPort = 80; - } - } - - if (options->HTTPProxyAuthenticator) { - if (strlen(options->HTTPProxyAuthenticator) >= 512) - REJECT("HTTPProxyAuthenticator is too long (>= 512 chars)."); - } - - if (options->HTTPSProxy) { /* parse it now */ - if (tor_addr_port_lookup(options->HTTPSProxy, - &options->HTTPSProxyAddr, &options->HTTPSProxyPort) <0) - REJECT("HTTPSProxy failed to parse or resolve. Please fix."); - if (options->HTTPSProxyPort == 0) { /* give it a default */ - options->HTTPSProxyPort = 443; - } - } - - if (options->HTTPSProxyAuthenticator) { - if (strlen(options->HTTPSProxyAuthenticator) >= 512) - REJECT("HTTPSProxyAuthenticator is too long (>= 512 chars)."); - } - - if (options->Socks4Proxy) { /* parse it now */ - if (tor_addr_port_lookup(options->Socks4Proxy, - &options->Socks4ProxyAddr, - &options->Socks4ProxyPort) <0) - REJECT("Socks4Proxy failed to parse or resolve. Please fix."); - if (options->Socks4ProxyPort == 0) { /* give it a default */ - options->Socks4ProxyPort = 1080; - } - } - - if (options->Socks5Proxy) { /* parse it now */ - if (tor_addr_port_lookup(options->Socks5Proxy, - &options->Socks5ProxyAddr, - &options->Socks5ProxyPort) <0) - REJECT("Socks5Proxy failed to parse or resolve. Please fix."); - if (options->Socks5ProxyPort == 0) { /* give it a default */ - options->Socks5ProxyPort = 1080; - } - } - - /* Check if more than one proxy type has been enabled. */ - if (!!options->Socks4Proxy + !!options->Socks5Proxy + - !!options->HTTPSProxy + !!options->ClientTransportPlugin > 1) - REJECT("You have configured more than one proxy type. " - "(Socks4Proxy|Socks5Proxy|HTTPSProxy|ClientTransportPlugin)"); - - /* Check if the proxies will give surprising behavior. */ - if (options->HTTPProxy && !(options->Socks4Proxy || - options->Socks5Proxy || - options->HTTPSProxy)) { - log_warn(LD_CONFIG, "HTTPProxy configured, but no SOCKS proxy or " - "HTTPS proxy configured. Watch out: this configuration will " - "proxy unencrypted directory connections only."); - } - - if (options->Socks5ProxyUsername) { - size_t len; - - len = strlen(options->Socks5ProxyUsername); - if (len < 1 || len > MAX_SOCKS5_AUTH_FIELD_SIZE) - REJECT("Socks5ProxyUsername must be between 1 and 255 characters."); - - if (!options->Socks5ProxyPassword) - REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername."); - - len = strlen(options->Socks5ProxyPassword); - if (len < 1 || len > MAX_SOCKS5_AUTH_FIELD_SIZE) - REJECT("Socks5ProxyPassword must be between 1 and 255 characters."); - } else if (options->Socks5ProxyPassword) - REJECT("Socks5ProxyPassword must be included with Socks5ProxyUsername."); - - if (options->HashedControlPassword) { - smartlist_t *sl = decode_hashed_passwords(options->HashedControlPassword); - if (!sl) { - REJECT("Bad HashedControlPassword: wrong length or bad encoding"); - } else { - SMARTLIST_FOREACH(sl, char*, cp, tor_free(cp)); - smartlist_free(sl); - } - } - - if (options->HashedControlSessionPassword) { - smartlist_t *sl = decode_hashed_passwords( - options->HashedControlSessionPassword); - if (!sl) { - REJECT("Bad HashedControlSessionPassword: wrong length or bad encoding"); - } else { - SMARTLIST_FOREACH(sl, char*, cp, tor_free(cp)); - smartlist_free(sl); - } - } - - if (options->OwningControllerProcess) { - const char *validate_pspec_msg = NULL; - if (tor_validate_process_specifier(options->OwningControllerProcess, - &validate_pspec_msg)) { - tor_asprintf(msg, "Bad OwningControllerProcess: %s", - validate_pspec_msg); - return -1; - } - } - - if (options->ControlPort_set && !options->HashedControlPassword && - !options->HashedControlSessionPassword && - !options->CookieAuthentication) { - log_warn(LD_CONFIG, "ControlPort is open, but no authentication method " - "has been configured. This means that any program on your " - "computer can reconfigure your Tor. That's bad! You should " - "upgrade your Tor controller as soon as possible."); - } - - if (options->CookieAuthFileGroupReadable && !options->CookieAuthFile) { - log_warn(LD_CONFIG, "CookieAuthFileGroupReadable is set, but will have " - "no effect: you must specify an explicit CookieAuthFile to " - "have it group-readable."); - } - - if (options->UseEntryGuards && ! options->NumEntryGuards) - REJECT("Cannot enable UseEntryGuards with NumEntryGuards set to 0"); - - if (options->MyFamily && options->BridgeRelay) { - log_warn(LD_CONFIG, "Listing a family for a bridge relay is not " - "supported: it can reveal bridge fingerprints to censors. " - "You should also make sure you aren't listing this bridge's " - "fingerprint in any other MyFamily."); - } - if (check_nickname_list(&options->MyFamily, "MyFamily", msg)) - return -1; - for (cl = options->NodeFamilies; cl; cl = cl->next) { - routerset_t *rs = routerset_new(); - if (routerset_parse(rs, cl->value, cl->key)) { - routerset_free(rs); - return -1; - } - routerset_free(rs); - } - - if (validate_addr_policies(options, msg) < 0) - return -1; - - if (validate_dir_servers(options, old_options) < 0) - REJECT("Directory authority/fallback line did not parse. See logs " - "for details."); - - if (options->UseBridges && !options->Bridges) - REJECT("If you set UseBridges, you must specify at least one bridge."); - if (options->UseBridges && !options->TunnelDirConns) - REJECT("If you set UseBridges, you must set TunnelDirConns."); - - for (cl = options->Bridges; cl; cl = cl->next) { - bridge_line_t *bridge_line = parse_bridge_line(cl->value); - if (!bridge_line) - REJECT("Bridge line did not parse. See logs for details."); - bridge_line_free(bridge_line); - } - - for (cl = options->ClientTransportPlugin; cl; cl = cl->next) { - if (parse_client_transport_line(cl->value, 1)<0) - REJECT("Transport line did not parse. See logs for details."); - } - - for (cl = options->ServerTransportPlugin; cl; cl = cl->next) { - if (parse_server_transport_line(cl->value, 1)<0) - REJECT("Server transport line did not parse. See logs for details."); - } - - if (options->ServerTransportPlugin && !server_mode(options)) { - log_notice(LD_GENERAL, "Tor is not configured as a relay but you specified" - " a ServerTransportPlugin line (%s). The ServerTransportPlugin " - "line will be ignored.", - escaped(options->ServerTransportPlugin->value)); - } - - for (cl = options->ServerTransportListenAddr; cl; cl = cl->next) { - /** If get_bindaddr_from_transport_listen_line() fails with - 'transport' being NULL, it means that something went wrong - while parsing the ServerTransportListenAddr line. */ - char *bindaddr = get_bindaddr_from_transport_listen_line(cl->value, NULL); - if (!bindaddr) - REJECT("ServerTransportListenAddr did not parse. See logs for details."); - tor_free(bindaddr); - } - - if (options->ServerTransportListenAddr && !options->ServerTransportPlugin) { - log_notice(LD_GENERAL, "You need at least a single managed-proxy to " - "specify a transport listen address. The " - "ServerTransportListenAddr line will be ignored."); - } - - for (cl = options->ServerTransportOptions; cl; cl = cl->next) { - /** If get_options_from_transport_options_line() fails with - 'transport' being NULL, it means that something went wrong - while parsing the ServerTransportOptions line. */ - smartlist_t *options_sl = - get_options_from_transport_options_line(cl->value, NULL); - if (!options_sl) - REJECT("ServerTransportOptions did not parse. See logs for details."); - - SMARTLIST_FOREACH(options_sl, char *, cp, tor_free(cp)); - smartlist_free(options_sl); - } - - /* If we are a bridge with a pluggable transport proxy but no - Extended ORPort, inform the user that she is missing out. */ - if (server_mode(options) && options->ServerTransportPlugin && - !options->ExtORPort_lines) { - log_notice(LD_CONFIG, "We are a bridge with a pluggable transport " - "proxy but the Extended ORPort is disabled. The " - "Extended ORPort helps Tor communicate with the pluggable " - "transport proxy. Please enable it using the ExtORPort " - "torrc option."); - } - - if (options->ConstrainedSockets) { - /* If the user wants to constrain socket buffer use, make sure the desired - * limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */ - if (options->ConstrainedSockSize < MIN_CONSTRAINED_TCP_BUFFER || - options->ConstrainedSockSize > MAX_CONSTRAINED_TCP_BUFFER || - options->ConstrainedSockSize % 1024) { - tor_asprintf(msg, - "ConstrainedSockSize is invalid. Must be a value between %d and %d " - "in 1024 byte increments.", - MIN_CONSTRAINED_TCP_BUFFER, MAX_CONSTRAINED_TCP_BUFFER); - return -1; - } - if (options->DirPort_set) { - /* Providing cached directory entries while system TCP buffers are scarce - * will exacerbate the socket errors. Suggest that this be disabled. */ - COMPLAIN("You have requested constrained socket buffers while also " - "serving directory entries via DirPort. It is strongly " - "suggested that you disable serving directory requests when " - "system TCP buffer resources are scarce."); - } - } - - if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= - options->V3AuthVotingInterval/2) { - REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " - "V3AuthVotingInterval"); - } - if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) - REJECT("V3AuthVoteDelay is way too low."); - if (options->V3AuthDistDelay < MIN_DIST_SECONDS) - REJECT("V3AuthDistDelay is way too low."); - - if (options->V3AuthNIntervalsValid < 2) - REJECT("V3AuthNIntervalsValid must be at least 2."); - - if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) { - REJECT("V3AuthVotingInterval is insanely low."); - } else if (options->V3AuthVotingInterval > 24*60*60) { - REJECT("V3AuthVotingInterval is insanely high."); - } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) { - COMPLAIN("V3AuthVotingInterval does not divide evenly into 24 hours."); - } - - if (rend_config_services(options, 1) < 0) - REJECT("Failed to configure rendezvous options. See logs for details."); - - /* Parse client-side authorization for hidden services. */ - if (rend_parse_service_authorization(options, 1) < 0) - REJECT("Failed to configure client authorization for hidden services. " - "See logs for details."); - - if (parse_virtual_addr_network(options->VirtualAddrNetworkIPv4, - AF_INET, 1, msg)<0) - return -1; - if (parse_virtual_addr_network(options->VirtualAddrNetworkIPv6, - AF_INET6, 1, msg)<0) - return -1; - - if (options->PreferTunneledDirConns && !options->TunnelDirConns) - REJECT("Must set TunnelDirConns if PreferTunneledDirConns is set."); - - if ((options->Socks4Proxy || options->Socks5Proxy) && - !options->HTTPProxy && !options->PreferTunneledDirConns) - REJECT("When Socks4Proxy or Socks5Proxy is configured, " - "PreferTunneledDirConns and TunnelDirConns must both be " - "set to 1, or HTTPProxy must be configured."); - - if (options->AutomapHostsSuffixes) { - SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf, - { - size_t len = strlen(suf); - if (len && suf[len-1] == '.') - suf[len-1] = '\0'; - }); - } - - if (options->TestingTorNetwork && - !(options->DirAuthorities || - (options->AlternateDirAuthority && - options->AlternateBridgeAuthority))) { - REJECT("TestingTorNetwork may only be configured in combination with " - "a non-default set of DirAuthority or both of " - "AlternateDirAuthority and AlternateBridgeAuthority configured."); - } - - if (options->AllowSingleHopExits && !options->DirAuthorities) { - COMPLAIN("You have set AllowSingleHopExits; now your relay will allow " - "others to make one-hop exits. However, since by default most " - "clients avoid relays that set this option, most clients will " - "ignore you."); - } - -#define CHECK_DEFAULT(arg) \ - STMT_BEGIN \ - if (!options->TestingTorNetwork && \ - !options->UsingTestNetworkDefaults_ && \ - !config_is_same(&options_format,options, \ - default_options,#arg)) { \ - REJECT(#arg " may only be changed in testing Tor " \ - "networks!"); \ - } STMT_END - CHECK_DEFAULT(TestingV3AuthInitialVotingInterval); - CHECK_DEFAULT(TestingV3AuthInitialVoteDelay); - CHECK_DEFAULT(TestingV3AuthInitialDistDelay); - CHECK_DEFAULT(TestingV3AuthVotingStartOffset); - CHECK_DEFAULT(TestingAuthDirTimeToLearnReachability); - CHECK_DEFAULT(TestingEstimatedDescriptorPropagationTime); - CHECK_DEFAULT(TestingServerDownloadSchedule); - CHECK_DEFAULT(TestingClientDownloadSchedule); - CHECK_DEFAULT(TestingServerConsensusDownloadSchedule); - CHECK_DEFAULT(TestingClientConsensusDownloadSchedule); - CHECK_DEFAULT(TestingBridgeDownloadSchedule); - CHECK_DEFAULT(TestingClientMaxIntervalWithoutRequest); - CHECK_DEFAULT(TestingDirConnectionMaxStall); - CHECK_DEFAULT(TestingConsensusMaxDownloadTries); - CHECK_DEFAULT(TestingDescriptorMaxDownloadTries); - CHECK_DEFAULT(TestingMicrodescMaxDownloadTries); - CHECK_DEFAULT(TestingCertMaxDownloadTries); -#undef CHECK_DEFAULT - - if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) { - REJECT("TestingV3AuthInitialVotingInterval is insanely low."); - } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) { - REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into " - "30 minutes."); - } - - if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) { - REJECT("TestingV3AuthInitialVoteDelay is way too low."); - } - - if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) { - REJECT("TestingV3AuthInitialDistDelay is way too low."); - } - - if (options->TestingV3AuthInitialVoteDelay + - options->TestingV3AuthInitialDistDelay >= - options->TestingV3AuthInitialVotingInterval/2) { - REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay " - "must be less than half TestingV3AuthInitialVotingInterval"); - } - - if (options->TestingV3AuthVotingStartOffset > - MIN(options->TestingV3AuthInitialVotingInterval, - options->V3AuthVotingInterval)) { - REJECT("TestingV3AuthVotingStartOffset is higher than the voting " - "interval."); - } - - if (options->TestingAuthDirTimeToLearnReachability < 0) { - REJECT("TestingAuthDirTimeToLearnReachability must be non-negative."); - } else if (options->TestingAuthDirTimeToLearnReachability > 2*60*60) { - COMPLAIN("TestingAuthDirTimeToLearnReachability is insanely high."); - } - - if (options->TestingEstimatedDescriptorPropagationTime < 0) { - REJECT("TestingEstimatedDescriptorPropagationTime must be non-negative."); - } else if (options->TestingEstimatedDescriptorPropagationTime > 60*60) { - COMPLAIN("TestingEstimatedDescriptorPropagationTime is insanely high."); - } - - if (options->TestingClientMaxIntervalWithoutRequest < 1) { - REJECT("TestingClientMaxIntervalWithoutRequest is way too low."); - } else if (options->TestingClientMaxIntervalWithoutRequest > 3600) { - COMPLAIN("TestingClientMaxIntervalWithoutRequest is insanely high."); - } - - if (options->TestingDirConnectionMaxStall < 5) { - REJECT("TestingDirConnectionMaxStall is way too low."); - } else if (options->TestingDirConnectionMaxStall > 3600) { - COMPLAIN("TestingDirConnectionMaxStall is insanely high."); - } - - if (options->TestingConsensusMaxDownloadTries < 2) { - REJECT("TestingConsensusMaxDownloadTries must be greater than 1."); - } else if (options->TestingConsensusMaxDownloadTries > 800) { - COMPLAIN("TestingConsensusMaxDownloadTries is insanely high."); - } - - if (options->TestingDescriptorMaxDownloadTries < 2) { - REJECT("TestingDescriptorMaxDownloadTries must be greater than 1."); - } else if (options->TestingDescriptorMaxDownloadTries > 800) { - COMPLAIN("TestingDescriptorMaxDownloadTries is insanely high."); - } - - if (options->TestingMicrodescMaxDownloadTries < 2) { - REJECT("TestingMicrodescMaxDownloadTries must be greater than 1."); - } else if (options->TestingMicrodescMaxDownloadTries > 800) { - COMPLAIN("TestingMicrodescMaxDownloadTries is insanely high."); - } - - if (options->TestingCertMaxDownloadTries < 2) { - REJECT("TestingCertMaxDownloadTries must be greater than 1."); - } else if (options->TestingCertMaxDownloadTries > 800) { - COMPLAIN("TestingCertMaxDownloadTries is insanely high."); - } - - if (options->TestingEnableConnBwEvent && - !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) { - REJECT("TestingEnableConnBwEvent may only be changed in testing " - "Tor networks!"); - } - - if (options->TestingEnableCellStatsEvent && - !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) { - REJECT("TestingEnableCellStatsEvent may only be changed in testing " - "Tor networks!"); - } - - if (options->TestingEnableTbEmptyEvent && - !options->TestingTorNetwork && !options->UsingTestNetworkDefaults_) { - REJECT("TestingEnableTbEmptyEvent may only be changed in testing " - "Tor networks!"); - } - - if (options->TestingTorNetwork) { - log_warn(LD_CONFIG, "TestingTorNetwork is set. This will make your node " - "almost unusable in the public Tor network, and is " - "therefore only advised if you are building a " - "testing Tor network!"); - } - - if (options->AccelName && !options->HardwareAccel) - options->HardwareAccel = 1; - if (options->AccelDir && !options->AccelName) - REJECT("Can't use hardware crypto accelerator dir without engine name."); - - if (options->PublishServerDescriptor) - SMARTLIST_FOREACH(options->PublishServerDescriptor, const char *, pubdes, { - if (!strcmp(pubdes, "1") || !strcmp(pubdes, "0")) - if (smartlist_len(options->PublishServerDescriptor) > 1) { - COMPLAIN("You have passed a list of multiple arguments to the " - "PublishServerDescriptor option that includes 0 or 1. " - "0 or 1 should only be used as the sole argument. " - "This configuration will be rejected in a future release."); - break; - } - }); - - if (options->BridgeRelay == 1 && ! options->ORPort_set) - REJECT("BridgeRelay is 1, ORPort is not set. This is an invalid " - "combination."); - - return 0; -#undef REJECT -#undef COMPLAIN -} - -/** Helper: return true iff s1 and s2 are both NULL, or both non-NULL - * equal strings. */ -static int -opt_streq(const char *s1, const char *s2) -{ - return 0 == strcmp_opt(s1, s2); -} - -/** Check if any of the previous options have changed but aren't allowed to. */ -static int -options_transition_allowed(const or_options_t *old, - const or_options_t *new_val, - char **msg) -{ - if (!old) - return 0; - - if (!opt_streq(old->PidFile, new_val->PidFile)) { - *msg = tor_strdup("PidFile is not allowed to change."); - return -1; - } - - if (old->RunAsDaemon != new_val->RunAsDaemon) { - *msg = tor_strdup("While Tor is running, changing RunAsDaemon " - "is not allowed."); - return -1; - } - - if (strcmp(old->DataDirectory,new_val->DataDirectory)!=0) { - tor_asprintf(msg, - "While Tor is running, changing DataDirectory " - "(\"%s\"->\"%s\") is not allowed.", - old->DataDirectory, new_val->DataDirectory); - return -1; - } - - if (!opt_streq(old->User, new_val->User)) { - *msg = tor_strdup("While Tor is running, changing User is not allowed."); - return -1; - } - - if ((old->HardwareAccel != new_val->HardwareAccel) - || !opt_streq(old->AccelName, new_val->AccelName) - || !opt_streq(old->AccelDir, new_val->AccelDir)) { - *msg = tor_strdup("While Tor is running, changing OpenSSL hardware " - "acceleration engine is not allowed."); - return -1; - } - - if (old->TestingTorNetwork != new_val->TestingTorNetwork) { - *msg = tor_strdup("While Tor is running, changing TestingTorNetwork " - "is not allowed."); - return -1; - } - - if (old->DisableAllSwap != new_val->DisableAllSwap) { - *msg = tor_strdup("While Tor is running, changing DisableAllSwap " - "is not allowed."); - return -1; - } - - if (old->TokenBucketRefillInterval != new_val->TokenBucketRefillInterval) { - *msg = tor_strdup("While Tor is running, changing TokenBucketRefill" - "Interval is not allowed"); - return -1; - } - - if (old->DisableIOCP != new_val->DisableIOCP) { - *msg = tor_strdup("While Tor is running, changing DisableIOCP " - "is not allowed."); - return -1; - } - - if (old->DisableDebuggerAttachment && - !new_val->DisableDebuggerAttachment) { - *msg = tor_strdup("While Tor is running, disabling " - "DisableDebuggerAttachment is not allowed."); - return -1; - } - - return 0; -} - -/** Return 1 if any change from old_options to new_options - * will require us to rotate the CPU and DNS workers; else return 0. */ -static int -options_transition_affects_workers(const or_options_t *old_options, - const or_options_t *new_options) -{ - if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) || - old_options->NumCPUs != new_options->NumCPUs || - !config_lines_eq(old_options->ORPort_lines, new_options->ORPort_lines) || - old_options->ServerDNSSearchDomains != - new_options->ServerDNSSearchDomains || - old_options->SafeLogging_ != new_options->SafeLogging_ || - old_options->ClientOnly != new_options->ClientOnly || - public_server_mode(old_options) != public_server_mode(new_options) || - !config_lines_eq(old_options->Logs, new_options->Logs) || - old_options->LogMessageDomains != new_options->LogMessageDomains) - return 1; - - /* Check whether log options match. */ - - /* Nothing that changed matters. */ - return 0; -} - -/** Return 1 if any change from old_options to new_options - * will require us to generate a new descriptor; else return 0. */ -static int -options_transition_affects_descriptor(const or_options_t *old_options, - const or_options_t *new_options) -{ - /* XXX We can be smarter here. If your DirPort isn't being - * published and you just turned it off, no need to republish. Etc. */ - if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) || - !opt_streq(old_options->Nickname,new_options->Nickname) || - !opt_streq(old_options->Address,new_options->Address) || - !config_lines_eq(old_options->ExitPolicy,new_options->ExitPolicy) || - old_options->ExitPolicyRejectPrivate != - new_options->ExitPolicyRejectPrivate || - old_options->IPv6Exit != new_options->IPv6Exit || - !config_lines_eq(old_options->ORPort_lines, - new_options->ORPort_lines) || - !config_lines_eq(old_options->DirPort_lines, - new_options->DirPort_lines) || - old_options->ClientOnly != new_options->ClientOnly || - old_options->DisableNetwork != new_options->DisableNetwork || - old_options->PublishServerDescriptor_ != - new_options->PublishServerDescriptor_ || - get_effective_bwrate(old_options) != get_effective_bwrate(new_options) || - get_effective_bwburst(old_options) != - get_effective_bwburst(new_options) || - !opt_streq(old_options->ContactInfo, new_options->ContactInfo) || - !opt_streq(old_options->MyFamily, new_options->MyFamily) || - !opt_streq(old_options->AccountingStart, new_options->AccountingStart) || - old_options->AccountingMax != new_options->AccountingMax || - public_server_mode(old_options) != public_server_mode(new_options)) - return 1; - - return 0; -} - -#ifdef _WIN32 -/** Return the directory on windows where we expect to find our application - * data. */ -static char * -get_windows_conf_root(void) -{ - static int is_set = 0; - static char path[MAX_PATH*2+1]; - TCHAR tpath[MAX_PATH] = {0}; - - LPITEMIDLIST idl; - IMalloc *m; - HRESULT result; - - if (is_set) - return path; - - /* Find X:\documents and settings\username\application data\ . - * We would use SHGetSpecialFolder path, but that wasn't added until IE4. - */ -#ifdef ENABLE_LOCAL_APPDATA -#define APPDATA_PATH CSIDL_LOCAL_APPDATA -#else -#define APPDATA_PATH CSIDL_APPDATA -#endif - if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL, APPDATA_PATH, &idl))) { - getcwd(path,MAX_PATH); - is_set = 1; - log_warn(LD_CONFIG, - "I couldn't find your application data folder: are you " - "running an ancient version of Windows 95? Defaulting to \"%s\"", - path); - return path; - } - /* Convert the path from an "ID List" (whatever that is!) to a path. */ - result = SHGetPathFromIDList(idl, tpath); -#ifdef UNICODE - wcstombs(path,tpath,sizeof(path)); - path[sizeof(path)-1] = '\0'; -#else - strlcpy(path,tpath,sizeof(path)); -#endif - - /* Now we need to free the memory that the path-idl was stored in. In - * typical Windows fashion, we can't just call 'free()' on it. */ - SHGetMalloc(&m); - if (m) { - m->lpVtbl->Free(m, idl); - m->lpVtbl->Release(m); - } - if (!SUCCEEDED(result)) { - return NULL; - } - strlcat(path,"\\tor",MAX_PATH); - is_set = 1; - return path; -} -#endif - -/** Return the default location for our torrc file (if defaults_file is - * false), or for the torrc-defaults file (if defaults_file is true). */ -static const char * -get_default_conf_file(int defaults_file) -{ -#ifdef _WIN32 - if (defaults_file) { - static char defaults_path[MAX_PATH+1]; - tor_snprintf(defaults_path, MAX_PATH, "%s\\torrc-defaults", - get_windows_conf_root()); - return defaults_path; - } else { - static char path[MAX_PATH+1]; - tor_snprintf(path, MAX_PATH, "%s\\torrc", - get_windows_conf_root()); - return path; - } -#else - return defaults_file ? CONFDIR "/torrc-defaults" : CONFDIR "/torrc"; -#endif -} - -/** Verify whether lst is a string containing valid-looking comma-separated - * nicknames, or NULL. Will normalise lst to prefix '$' to any nickname - * or fingerprint that needs it. Return 0 on success. - * Warn and return -1 on failure. - */ -static int -check_nickname_list(char **lst, const char *name, char **msg) -{ - int r = 0; - smartlist_t *sl; - int changes = 0; - - if (!*lst) - return 0; - sl = smartlist_new(); - - smartlist_split_string(sl, *lst, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK|SPLIT_STRIP_SPACE, 0); - - SMARTLIST_FOREACH_BEGIN(sl, char *, s) - { - if (!is_legal_nickname_or_hexdigest(s)) { - // check if first char is dollar - if (s[0] != '$') { - // Try again but with a dollar symbol prepended - char *prepended; - tor_asprintf(&prepended, "$%s", s); - - if (is_legal_nickname_or_hexdigest(prepended)) { - // The nickname is valid when it's prepended, swap the current - // version with a prepended one - tor_free(s); - SMARTLIST_REPLACE_CURRENT(sl, s, prepended); - changes = 1; - continue; - } - - // Still not valid, free and fallback to error message - tor_free(prepended); - } - - tor_asprintf(msg, "Invalid nickname '%s' in %s line", s, name); - r = -1; - break; - } - } - SMARTLIST_FOREACH_END(s); - - // Replace the caller's nickname list with a fixed one - if (changes && r == 0) { - char *newNicknames = smartlist_join_strings(sl, ", ", 0, NULL); - tor_free(*lst); - *lst = newNicknames; - } - - SMARTLIST_FOREACH(sl, char *, s, tor_free(s)); - smartlist_free(sl); - - return r; -} - -/** Learn config file name from command line arguments, or use the default. - * - * If defaults_file is true, we're looking for torrc-defaults; - * otherwise, we're looking for the regular torrc_file. - * - * Set *using_default_fname to true if we're using the default - * configuration file name; or false if we've set it from the command line. - * - * Set *ignore_missing_torrc to true if we should ignore the resulting - * filename if it doesn't exist. - */ -static char * -find_torrc_filename(config_line_t *cmd_arg, - int defaults_file, - int *using_default_fname, int *ignore_missing_torrc) -{ - char *fname=NULL; - config_line_t *p_index; - const char *fname_opt = defaults_file ? "--defaults-torrc" : "-f"; - const char *ignore_opt = defaults_file ? NULL : "--ignore-missing-torrc"; - - if (defaults_file) - *ignore_missing_torrc = 1; - - for (p_index = cmd_arg; p_index; p_index = p_index->next) { - if (!strcmp(p_index->key, fname_opt)) { - if (fname) { - log_warn(LD_CONFIG, "Duplicate %s options on command line.", - fname_opt); - tor_free(fname); - } - fname = expand_filename(p_index->value); - - { - char *absfname; - absfname = make_path_absolute(fname); - tor_free(fname); - fname = absfname; - } - - *using_default_fname = 0; - } else if (ignore_opt && !strcmp(p_index->key,ignore_opt)) { - *ignore_missing_torrc = 1; - } - } - - if (*using_default_fname) { - /* didn't find one, try CONFDIR */ - const char *dflt = get_default_conf_file(defaults_file); - if (dflt && file_status(dflt) == FN_FILE) { - fname = tor_strdup(dflt); - } else { -#ifndef _WIN32 - char *fn = NULL; - if (!defaults_file) - fn = expand_filename("~/.torrc"); - if (fn && file_status(fn) == FN_FILE) { - fname = fn; - } else { - tor_free(fn); - fname = tor_strdup(dflt); - } -#else - fname = tor_strdup(dflt); -#endif - } - } - return fname; -} - -/** Load a configuration file from disk, setting torrc_fname or - * torrc_defaults_fname if successful. - * - * If defaults_file is true, load torrc-defaults; otherwise load torrc. - * - * Return the contents of the file on success, and NULL on failure. - */ -static char * -load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file) -{ - char *fname=NULL; - char *cf = NULL; - int using_default_torrc = 1; - int ignore_missing_torrc = 0; - char **fname_var = defaults_file ? &torrc_defaults_fname : &torrc_fname; - - fname = find_torrc_filename(cmd_arg, defaults_file, - &using_default_torrc, &ignore_missing_torrc); - tor_assert(fname); - log_debug(LD_CONFIG, "Opening config file \"%s\"", fname); - - tor_free(*fname_var); - *fname_var = fname; - - /* Open config file */ - if (file_status(fname) != FN_FILE || - !(cf = read_file_to_str(fname,0,NULL))) { - if (using_default_torrc == 1 || ignore_missing_torrc) { - if (!defaults_file) - log_notice(LD_CONFIG, "Configuration file \"%s\" not present, " - "using reasonable defaults.", fname); - tor_free(fname); /* sets fname to NULL */ - *fname_var = NULL; - cf = tor_strdup(""); - } else { - log_warn(LD_CONFIG, - "Unable to open configuration file \"%s\".", fname); - goto err; - } - } else { - log_notice(LD_CONFIG, "Read configuration file \"%s\".", fname); - } - - return cf; - err: - tor_free(fname); - *fname_var = NULL; - return NULL; -} - -/** Read a configuration file into options, finding the configuration - * file location based on the command line. After loading the file - * call options_init_from_string() to load the config. - * Return 0 if success, -1 if failure. */ -int -options_init_from_torrc(int argc, char **argv) -{ - char *cf=NULL, *cf_defaults=NULL; - int command; - int retval = -1; - char *command_arg = NULL; - char *errmsg=NULL; - config_line_t *p_index = NULL; - config_line_t *cmdline_only_options = NULL; - - /* Go through command-line variables */ - if (! have_parsed_cmdline) { - /* Or we could redo the list every time we pass this place. - * It does not really matter */ - if (config_parse_commandline(argc, argv, 0, &global_cmdline_options, - &global_cmdline_only_options) < 0) { - goto err; - } - have_parsed_cmdline = 1; - } - cmdline_only_options = global_cmdline_only_options; - - if (config_line_find(cmdline_only_options, "-h") || - config_line_find(cmdline_only_options, "--help")) { - print_usage(); - exit(0); - } - if (config_line_find(cmdline_only_options, "--list-torrc-options")) { - /* For documenting validating whether we've documented everything. */ - list_torrc_options(); - exit(0); - } - - if (config_line_find(cmdline_only_options, "--version")) { - printf("Tor version %s.\n",get_version()); - exit(0); - } - - if (config_line_find(cmdline_only_options, "--digests")) { - printf("Tor version %s.\n",get_version()); - printf("%s", libor_get_digests()); - printf("%s", tor_get_digests()); - exit(0); - } - - if (config_line_find(cmdline_only_options, "--library-versions")) { - printf("Tor version %s. \n", get_version()); - printf("Library versions\tCompiled\t\tRuntime\n"); - printf("Libevent\t\t%-15s\t\t%s\n", - tor_libevent_get_header_version_str(), - tor_libevent_get_version_str()); - printf("OpenSSL \t\t%-15s\t\t%s\n", - crypto_openssl_get_header_version_str(), - crypto_openssl_get_version_str()); - printf("Zlib \t\t%-15s\t\t%s\n", - tor_zlib_get_header_version_str(), - tor_zlib_get_version_str()); - //TODO: Hex versions? - exit(0); - } - - command = CMD_RUN_TOR; - for (p_index = cmdline_only_options; p_index; p_index = p_index->next) { - if (!strcmp(p_index->key,"--list-fingerprint")) { - command = CMD_LIST_FINGERPRINT; - } else if (!strcmp(p_index->key, "--hash-password")) { - command = CMD_HASH_PASSWORD; - command_arg = p_index->value; - } else if (!strcmp(p_index->key, "--dump-config")) { - command = CMD_DUMP_CONFIG; - command_arg = p_index->value; - } else if (!strcmp(p_index->key, "--verify-config")) { - command = CMD_VERIFY_CONFIG; - } - } - - if (command == CMD_HASH_PASSWORD) { - cf_defaults = tor_strdup(""); - cf = tor_strdup(""); - } else { - cf_defaults = load_torrc_from_disk(cmdline_only_options, 1); - cf = load_torrc_from_disk(cmdline_only_options, 0); - if (!cf) { - if (config_line_find(cmdline_only_options, "--allow-missing-torrc")) { - cf = tor_strdup(""); - } else { - goto err; - } - } - } - - retval = options_init_from_string(cf_defaults, cf, command, command_arg, - &errmsg); - - err: - - tor_free(cf); - tor_free(cf_defaults); - if (errmsg) { - log_warn(LD_CONFIG,"%s", errmsg); - tor_free(errmsg); - } - return retval < 0 ? -1 : 0; -} - -/** Load the options from the configuration in cf, validate - * them for consistency and take actions based on them. - * - * Return 0 if success, negative on error: - * * -1 for general errors. - * * -2 for failure to parse/validate, - * * -3 for transition not allowed - * * -4 for error while setting the new options - */ -setopt_err_t -options_init_from_string(const char *cf_defaults, const char *cf, - int command, const char *command_arg, - char **msg) -{ - or_options_t *oldoptions, *newoptions, *newdefaultoptions=NULL; - config_line_t *cl; - int retval, i; - setopt_err_t err = SETOPT_ERR_MISC; - tor_assert(msg); - - oldoptions = global_options; /* get_options unfortunately asserts if - this is the first time we run*/ - - newoptions = tor_malloc_zero(sizeof(or_options_t)); - newoptions->magic_ = OR_OPTIONS_MAGIC; - options_init(newoptions); - newoptions->command = command; - newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL; - - for (i = 0; i < 2; ++i) { - const char *body = i==0 ? cf_defaults : cf; - if (!body) - continue; - /* get config lines, assign them */ - retval = config_get_lines(body, &cl, 1); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); - config_free_lines(cl); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - if (i==0) - newdefaultoptions = config_dup(&options_format, newoptions); - } - - if (newdefaultoptions == NULL) { - newdefaultoptions = config_dup(&options_format, global_default_options); - } - - /* Go through command-line variables too */ - retval = config_assign(&options_format, newoptions, - global_cmdline_options, 0, 0, msg); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - - /* If this is a testing network configuration, change defaults - * for a list of dependent config options, re-initialize newoptions - * with the new defaults, and assign all options to it second time. */ - if (newoptions->TestingTorNetwork) { - /* XXXX this is a bit of a kludge. perhaps there's a better way to do - * this? We could, for example, make the parsing algorithm do two passes - * over the configuration. If it finds any "suite" options like - * TestingTorNetwork, it could change the defaults before its second pass. - * Not urgent so long as this seems to work, but at any sign of trouble, - * let's clean it up. -NM */ - - /* Change defaults. */ - int i; - for (i = 0; testing_tor_network_defaults[i].name; ++i) { - const config_var_t *new_var = &testing_tor_network_defaults[i]; - config_var_t *old_var = - config_find_option_mutable(&options_format, new_var->name); - tor_assert(new_var); - tor_assert(old_var); - old_var->initvalue = new_var->initvalue; - } - - /* Clear newoptions and re-initialize them with new defaults. */ - config_free(&options_format, newoptions); - config_free(&options_format, newdefaultoptions); - newdefaultoptions = NULL; - newoptions = tor_malloc_zero(sizeof(or_options_t)); - newoptions->magic_ = OR_OPTIONS_MAGIC; - options_init(newoptions); - newoptions->command = command; - newoptions->command_arg = command_arg ? tor_strdup(command_arg) : NULL; - - /* Assign all options a second time. */ - for (i = 0; i < 2; ++i) { - const char *body = i==0 ? cf_defaults : cf; - if (!body) - continue; - /* get config lines, assign them */ - retval = config_get_lines(body, &cl, 1); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - retval = config_assign(&options_format, newoptions, cl, 0, 0, msg); - config_free_lines(cl); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - if (i==0) - newdefaultoptions = config_dup(&options_format, newoptions); - } - /* Assign command-line variables a second time too */ - retval = config_assign(&options_format, newoptions, - global_cmdline_options, 0, 0, msg); - if (retval < 0) { - err = SETOPT_ERR_PARSE; - goto err; - } - } - - /* Validate newoptions */ - if (options_validate(oldoptions, newoptions, newdefaultoptions, - 0, msg) < 0) { - err = SETOPT_ERR_PARSE; /*XXX make this a separate return value.*/ - goto err; - } - - if (options_transition_allowed(oldoptions, newoptions, msg) < 0) { - err = SETOPT_ERR_TRANSITION; - goto err; - } - - if (set_options(newoptions, msg)) { - err = SETOPT_ERR_SETTING; - goto err; /* frees and replaces old options */ - } - config_free(&options_format, global_default_options); - global_default_options = newdefaultoptions; - - return SETOPT_OK; - - err: - config_free(&options_format, newoptions); - config_free(&options_format, newdefaultoptions); - if (*msg) { - char *old_msg = *msg; - tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg); - tor_free(old_msg); - } - return err; -} - -/** Return the location for our configuration file. - */ -const char * -get_torrc_fname(int defaults_fname) -{ - const char *fname = defaults_fname ? torrc_defaults_fname : torrc_fname; - - if (fname) - return fname; - else - return get_default_conf_file(defaults_fname); -} - -/** Adjust the address map based on the MapAddress elements in the - * configuration options - */ -void -config_register_addressmaps(const or_options_t *options) -{ - smartlist_t *elts; - config_line_t *opt; - const char *from, *to, *msg; - - addressmap_clear_configured(); - elts = smartlist_new(); - for (opt = options->AddressMap; opt; opt = opt->next) { - smartlist_split_string(elts, opt->value, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - if (smartlist_len(elts) < 2) { - log_warn(LD_CONFIG,"MapAddress '%s' has too few arguments. Ignoring.", - opt->value); - goto cleanup; - } - - from = smartlist_get(elts,0); - to = smartlist_get(elts,1); - - if (to[0] == '.' || from[0] == '.') { - log_warn(LD_CONFIG,"MapAddress '%s' is ambiguous - address starts with a" - "'.'. Ignoring.",opt->value); - goto cleanup; - } - - if (addressmap_register_auto(from, to, 0, ADDRMAPSRC_TORRC, &msg) < 0) { - log_warn(LD_CONFIG,"MapAddress '%s' failed: %s. Ignoring.", opt->value, - msg); - goto cleanup; - } - - if (smartlist_len(elts) > 2) - log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress."); - - cleanup: - SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp)); - smartlist_clear(elts); - } - smartlist_free(elts); -} - -/** As addressmap_register(), but detect the wildcarded status of "from" and - * "to", and do not steal a reference to to. */ -/* XXXX024 move to connection_edge.c */ -int -addressmap_register_auto(const char *from, const char *to, - time_t expires, - addressmap_entry_source_t addrmap_source, - const char **msg) -{ - int from_wildcard = 0, to_wildcard = 0; - - *msg = "whoops, forgot the error message"; - if (1) { - if (!strcmp(to, "*") || !strcmp(from, "*")) { - *msg = "can't remap from or to *"; - return -1; - } - /* Detect asterisks in expressions of type: '*.example.com' */ - if (!strncmp(from,"*.",2)) { - from += 2; - from_wildcard = 1; - } - if (!strncmp(to,"*.",2)) { - to += 2; - to_wildcard = 1; - } - - if (to_wildcard && !from_wildcard) { - *msg = "can only use wildcard (i.e. '*.') if 'from' address " - "uses wildcard also"; - return -1; - } - - if (address_is_invalid_destination(to, 1)) { - *msg = "destination is invalid"; - return -1; - } - - addressmap_register(from, tor_strdup(to), expires, addrmap_source, - from_wildcard, to_wildcard); - } - return 0; -} - -/** - * Initialize the logs based on the configuration file. - */ -static int -options_init_logs(or_options_t *options, int validate_only) -{ - config_line_t *opt; - int ok; - smartlist_t *elts; - int daemon = -#ifdef _WIN32 - 0; -#else - options->RunAsDaemon; -#endif - - if (options->LogTimeGranularity <= 0) { - log_warn(LD_CONFIG, "Log time granularity '%d' has to be positive.", - options->LogTimeGranularity); - return -1; - } else if (1000 % options->LogTimeGranularity != 0 && - options->LogTimeGranularity % 1000 != 0) { - int granularity = options->LogTimeGranularity; - if (granularity < 40) { - do granularity++; - while (1000 % granularity != 0); - } else if (granularity < 1000) { - granularity = 1000 / granularity; - while (1000 % granularity != 0) - granularity--; - granularity = 1000 / granularity; - } else { - granularity = 1000 * ((granularity / 1000) + 1); - } - log_warn(LD_CONFIG, "Log time granularity '%d' has to be either a " - "divisor or a multiple of 1 second. Changing to " - "'%d'.", - options->LogTimeGranularity, granularity); - if (!validate_only) - set_log_time_granularity(granularity); - } else { - if (!validate_only) - set_log_time_granularity(options->LogTimeGranularity); - } - - ok = 1; - elts = smartlist_new(); - - for (opt = options->Logs; opt; opt = opt->next) { - log_severity_list_t *severity; - const char *cfg = opt->value; - severity = tor_malloc_zero(sizeof(log_severity_list_t)); - if (parse_log_severity_config(&cfg, severity) < 0) { - log_warn(LD_CONFIG, "Couldn't parse log levels in Log option 'Log %s'", - opt->value); - ok = 0; goto cleanup; - } - - smartlist_split_string(elts, cfg, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - - if (smartlist_len(elts) == 0) - smartlist_add(elts, tor_strdup("stdout")); - - if (smartlist_len(elts) == 1 && - (!strcasecmp(smartlist_get(elts,0), "stdout") || - !strcasecmp(smartlist_get(elts,0), "stderr"))) { - int err = smartlist_len(elts) && - !strcasecmp(smartlist_get(elts,0), "stderr"); - if (!validate_only) { - if (daemon) { - log_warn(LD_CONFIG, - "Can't log to %s with RunAsDaemon set; skipping stdout", - err?"stderr":"stdout"); - } else { - add_stream_log(severity, err?"":"", - fileno(err?stderr:stdout)); - } - } - goto cleanup; - } - if (smartlist_len(elts) == 1 && - !strcasecmp(smartlist_get(elts,0), "syslog")) { -#ifdef HAVE_SYSLOG_H - if (!validate_only) { - add_syslog_log(severity); - } -#else - log_warn(LD_CONFIG, "Syslog is not supported on this system. Sorry."); -#endif - goto cleanup; - } - - if (smartlist_len(elts) == 2 && - !strcasecmp(smartlist_get(elts,0), "file")) { - if (!validate_only) { - char *fname = expand_filename(smartlist_get(elts, 1)); - if (add_file_log(severity, fname) < 0) { - log_warn(LD_CONFIG, "Couldn't open file for 'Log %s': %s", - opt->value, strerror(errno)); - ok = 0; - } - tor_free(fname); - } - goto cleanup; - } - - log_warn(LD_CONFIG, "Bad syntax on file Log option 'Log %s'", - opt->value); - ok = 0; goto cleanup; - - cleanup: - SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp)); - smartlist_clear(elts); - tor_free(severity); - } - smartlist_free(elts); - - if (ok && !validate_only) - logs_set_domain_logging(options->LogMessageDomains); - - return ok?0:-1; -} - -/** Given a smartlist of SOCKS arguments to be passed to a transport - * proxy in args, validate them and return -1 if they are - * corrupted. Return 0 if they seem OK. */ -static int -validate_transport_socks_arguments(const smartlist_t *args) -{ - char *socks_string = NULL; - size_t socks_string_len; - - tor_assert(args); - tor_assert(smartlist_len(args) > 0); - - SMARTLIST_FOREACH_BEGIN(args, const char *, s) { - if (!string_is_key_value(LOG_WARN, s)) { /* items should be k=v items */ - log_warn(LD_CONFIG, "'%s' is not a k=v item.", s); - return -1; - } - } SMARTLIST_FOREACH_END(s); - - socks_string = pt_stringify_socks_args(args); - if (!socks_string) - return -1; - - socks_string_len = strlen(socks_string); - tor_free(socks_string); - - if (socks_string_len > MAX_SOCKS5_AUTH_SIZE_TOTAL) { - log_warn(LD_CONFIG, "SOCKS arguments can't be more than %u bytes (%lu).", - MAX_SOCKS5_AUTH_SIZE_TOTAL, - (unsigned long) socks_string_len); - return -1; - } - - return 0; -} - -/** Deallocate a bridge_line_t structure. */ -/* private */ void -bridge_line_free(bridge_line_t *bridge_line) -{ - if (!bridge_line) - return; - - if (bridge_line->socks_args) { - SMARTLIST_FOREACH(bridge_line->socks_args, char*, s, tor_free(s)); - smartlist_free(bridge_line->socks_args); - } - tor_free(bridge_line->transport_name); - tor_free(bridge_line); -} - -/** Read the contents of a Bridge line from line. Return 0 - * if the line is well-formed, and -1 if it isn't. If - * validate_only is 0, and the line is well-formed, then add - * the bridge described in the line to our internal bridge list. - * - * Bridge line format: - * Bridge [transport] IP:PORT [id-fingerprint] [k=v] [k=v] ... - */ -/* private */ bridge_line_t * -parse_bridge_line(const char *line) -{ - smartlist_t *items = NULL; - char *addrport=NULL, *fingerprint=NULL; - char *field=NULL; - bridge_line_t *bridge_line = tor_malloc_zero(sizeof(bridge_line_t)); - - items = smartlist_new(); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (smartlist_len(items) < 1) { - log_warn(LD_CONFIG, "Too few arguments to Bridge line."); - goto err; - } - - /* first field is either a transport name or addrport */ - field = smartlist_get(items, 0); - smartlist_del_keeporder(items, 0); - - if (string_is_C_identifier(field)) { - /* It's a transport name. */ - bridge_line->transport_name = field; - if (smartlist_len(items) < 1) { - log_warn(LD_CONFIG, "Too few items to Bridge line."); - goto err; - } - addrport = smartlist_get(items, 0); /* Next field is addrport then. */ - smartlist_del_keeporder(items, 0); - } else { - addrport = field; - } - - /* Parse addrport. */ - if (tor_addr_port_lookup(addrport, - &bridge_line->addr, &bridge_line->port)<0) { - log_warn(LD_CONFIG, "Error parsing Bridge address '%s'", addrport); - goto err; - } - if (!bridge_line->port) { - log_info(LD_CONFIG, - "Bridge address '%s' has no port; using default port 443.", - addrport); - bridge_line->port = 443; - } - - /* If transports are enabled, next field could be a fingerprint or a - socks argument. If transports are disabled, next field must be - a fingerprint. */ - if (smartlist_len(items)) { - if (bridge_line->transport_name) { /* transports enabled: */ - field = smartlist_get(items, 0); - smartlist_del_keeporder(items, 0); - - /* If it's a key=value pair, then it's a SOCKS argument for the - transport proxy... */ - if (string_is_key_value(LOG_DEBUG, field)) { - bridge_line->socks_args = smartlist_new(); - smartlist_add(bridge_line->socks_args, field); - } else { /* ...otherwise, it's the bridge fingerprint. */ - fingerprint = field; - } - - } else { /* transports disabled: */ - fingerprint = smartlist_join_strings(items, "", 0, NULL); - } - } - - /* Handle fingerprint, if it was provided. */ - if (fingerprint) { - if (strlen(fingerprint) != HEX_DIGEST_LEN) { - log_warn(LD_CONFIG, "Key digest for Bridge is wrong length."); - goto err; - } - if (base16_decode(bridge_line->digest, DIGEST_LEN, - fingerprint, HEX_DIGEST_LEN)<0) { - log_warn(LD_CONFIG, "Unable to decode Bridge key digest."); - goto err; - } - } - - /* If we are using transports, any remaining items in the smartlist - should be k=v values. */ - if (bridge_line->transport_name && smartlist_len(items)) { - if (!bridge_line->socks_args) - bridge_line->socks_args = smartlist_new(); - - /* append remaining items of 'items' to 'socks_args' */ - smartlist_add_all(bridge_line->socks_args, items); - smartlist_clear(items); - - tor_assert(smartlist_len(bridge_line->socks_args) > 0); - } - - if (bridge_line->socks_args) { - if (validate_transport_socks_arguments(bridge_line->socks_args) < 0) - goto err; - } - - goto done; - - err: - bridge_line_free(bridge_line); - bridge_line = NULL; - - done: - SMARTLIST_FOREACH(items, char*, s, tor_free(s)); - smartlist_free(items); - tor_free(addrport); - tor_free(fingerprint); - - return bridge_line; -} - -/** Read the contents of a ClientTransportPlugin line from - * line. Return 0 if the line is well-formed, and -1 if it - * isn't. - * - * If validate_only is 0, the line is well-formed, and the - * transport is needed by some bridge: - * - If it's an external proxy line, add the transport described in the line to - * our internal transport list. - * - If it's a managed proxy line, launch the managed proxy. */ -static int -parse_client_transport_line(const char *line, int validate_only) -{ - smartlist_t *items = NULL; - int r; - char *field2=NULL; - - const char *transports=NULL; - smartlist_t *transport_list=NULL; - char *addrport=NULL; - tor_addr_t addr; - uint16_t port = 0; - int socks_ver=PROXY_NONE; - - /* managed proxy options */ - int is_managed=0; - char **proxy_argv=NULL; - char **tmp=NULL; - int proxy_argc, i; - int is_useless_proxy=1; - - int line_length; - - items = smartlist_new(); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - - line_length = smartlist_len(items); - if (line_length < 3) { - log_warn(LD_CONFIG, "Too few arguments on ClientTransportPlugin line."); - goto err; - } - - /* Get the first line element, split it to commas into - transport_list (in case it's multiple transports) and validate - the transport names. */ - transports = smartlist_get(items, 0); - transport_list = smartlist_new(); - smartlist_split_string(transport_list, transports, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) { - /* validate transport names */ - if (!string_is_C_identifier(transport_name)) { - log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", - transport_name); - goto err; - } - - /* see if we actually need the transports provided by this proxy */ - if (!validate_only && transport_is_needed(transport_name)) - is_useless_proxy = 0; - } SMARTLIST_FOREACH_END(transport_name); - - /* field2 is either a SOCKS version or "exec" */ - field2 = smartlist_get(items, 1); - - if (!strcmp(field2,"socks4")) { - socks_ver = PROXY_SOCKS4; - } else if (!strcmp(field2,"socks5")) { - socks_ver = PROXY_SOCKS5; - } else if (!strcmp(field2,"exec")) { - is_managed=1; - } else { - log_warn(LD_CONFIG, "Strange ClientTransportPlugin field '%s'.", - field2); - goto err; - } - - if (is_managed) { /* managed */ - if (!validate_only && is_useless_proxy) { - log_warn(LD_GENERAL, "Pluggable transport proxy (%s) does not provide " - "any needed transports and will not be launched.", line); - } - - /* If we are not just validating, use the rest of the line as the - argv of the proxy to be launched. Also, make sure that we are - only launching proxies that contribute useful transports. */ - if (!validate_only && !is_useless_proxy) { - proxy_argc = line_length-2; - tor_assert(proxy_argc > 0); - proxy_argv = tor_malloc_zero(sizeof(char*)*(proxy_argc+1)); - tmp = proxy_argv; - for (i=0;iline, return its - * string. Return NULL if the line was not - * well-formed. - * - * If transport is set, return NULL if the line is not - * referring to transport. - * - * The returned string is allocated on the heap and it's the - * responsibility of the caller to free it. */ -static char * -get_bindaddr_from_transport_listen_line(const char *line,const char *transport) -{ - smartlist_t *items = NULL; - const char *parsed_transport = NULL; - char *addrport = NULL; - tor_addr_t addr; - uint16_t port = 0; - - items = smartlist_new(); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - - if (smartlist_len(items) < 2) { - log_warn(LD_CONFIG,"Too few arguments on ServerTransportListenAddr line."); - goto err; - } - - parsed_transport = smartlist_get(items, 0); - addrport = tor_strdup(smartlist_get(items, 1)); - - /* If 'transport' is given, check if it matches the one on the line */ - if (transport && strcmp(transport, parsed_transport)) - goto err; - - /* Validate addrport */ - if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port)<0) { - log_warn(LD_CONFIG, "Error parsing ServerTransportListenAddr " - "address '%s'", addrport); - goto err; - } - - goto done; - - err: - tor_free(addrport); - addrport = NULL; - - done: - SMARTLIST_FOREACH(items, char*, s, tor_free(s)); - smartlist_free(items); - - return addrport; -} - -/** Given a ServerTransportOptions line, return a smartlist - * with the options. Return NULL if the line was not well-formed. - * - * If transport is set, return NULL if the line is not - * referring to transport. - * - * The returned smartlist and its strings are allocated on the heap - * and it's the responsibility of the caller to free it. */ -smartlist_t * -get_options_from_transport_options_line(const char *line,const char *transport) -{ - smartlist_t *items = smartlist_new(); - smartlist_t *options = smartlist_new(); - const char *parsed_transport = NULL; - - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - - if (smartlist_len(items) < 2) { - log_warn(LD_CONFIG,"Too few arguments on ServerTransportOptions line."); - goto err; - } - - parsed_transport = smartlist_get(items, 0); - /* If 'transport' is given, check if it matches the one on the line */ - if (transport && strcmp(transport, parsed_transport)) - goto err; - - SMARTLIST_FOREACH_BEGIN(items, const char *, option) { - if (option_sl_idx == 0) /* skip the transport field (first field)*/ - continue; - - /* validate that it's a k=v value */ - if (!string_is_key_value(LOG_WARN, option)) { - log_warn(LD_CONFIG, "%s is not a k=v value.", escaped(option)); - goto err; - } - - /* add it to the options smartlist */ - smartlist_add(options, tor_strdup(option)); - log_debug(LD_CONFIG, "Added %s to the list of options", escaped(option)); - } SMARTLIST_FOREACH_END(option); - - goto done; - - err: - SMARTLIST_FOREACH(options, char*, s, tor_free(s)); - smartlist_free(options); - options = NULL; - - done: - SMARTLIST_FOREACH(items, char*, s, tor_free(s)); - smartlist_free(items); - - return options; -} - -/** Given the name of a pluggable transport in transport, check - * the configuration file to see if the user has explicitly asked for - * it to listen on a specific port. Return a string if - * so, otherwise NULL. */ -char * -get_transport_bindaddr_from_config(const char *transport) -{ - config_line_t *cl; - const or_options_t *options = get_options(); - - for (cl = options->ServerTransportListenAddr; cl; cl = cl->next) { - char *bindaddr = - get_bindaddr_from_transport_listen_line(cl->value, transport); - if (bindaddr) - return bindaddr; - } - - return NULL; -} - -/** Given the name of a pluggable transport in transport, check - * the configuration file to see if the user has asked us to pass any - * parameters to the pluggable transport. Return a smartlist - * containing the parameters, otherwise NULL. */ -smartlist_t * -get_options_for_server_transport(const char *transport) -{ - config_line_t *cl; - const or_options_t *options = get_options(); - - for (cl = options->ServerTransportOptions; cl; cl = cl->next) { - smartlist_t *options_sl = - get_options_from_transport_options_line(cl->value, transport); - if (options_sl) - return options_sl; - } - - return NULL; -} - -/** Read the contents of a ServerTransportPlugin line from - * line. Return 0 if the line is well-formed, and -1 if it - * isn't. - * If validate_only is 0, the line is well-formed, and it's a - * managed proxy line, launch the managed proxy. */ -static int -parse_server_transport_line(const char *line, int validate_only) -{ - smartlist_t *items = NULL; - int r; - const char *transports=NULL; - smartlist_t *transport_list=NULL; - char *type=NULL; - char *addrport=NULL; - tor_addr_t addr; - uint16_t port = 0; - - /* managed proxy options */ - int is_managed=0; - char **proxy_argv=NULL; - char **tmp=NULL; - int proxy_argc,i; - - int line_length; - - items = smartlist_new(); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - - line_length = smartlist_len(items); - if (line_length < 3) { - log_warn(LD_CONFIG, "Too few arguments on ServerTransportPlugin line."); - goto err; - } - - /* Get the first line element, split it to commas into - transport_list (in case it's multiple transports) and validate - the transport names. */ - transports = smartlist_get(items, 0); - transport_list = smartlist_new(); - smartlist_split_string(transport_list, transports, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) { - if (!string_is_C_identifier(transport_name)) { - log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", - transport_name); - goto err; - } - } SMARTLIST_FOREACH_END(transport_name); - - type = smartlist_get(items, 1); - - if (!strcmp(type, "exec")) { - is_managed=1; - } else if (!strcmp(type, "proxy")) { - is_managed=0; - } else { - log_warn(LD_CONFIG, "Strange ServerTransportPlugin type '%s'", type); - goto err; - } - - if (is_managed) { /* managed */ - if (!validate_only) { - proxy_argc = line_length-2; - tor_assert(proxy_argc > 0); - proxy_argv = tor_malloc_zero(sizeof(char*)*(proxy_argc+1)); - tmp = proxy_argv; - - for (i=0;iline. If - * validate_only is 0, and the line is well-formed, and it - * shares any bits with required_type or required_type - * is 0, then add the dirserver described in the line (minus whatever - * bits it's missing) as a valid authority. Return 0 on success, - * or -1 if the line isn't well-formed or if we can't add it. */ -static int -parse_dir_authority_line(const char *line, dirinfo_type_t required_type, - int validate_only) -{ - smartlist_t *items = NULL; - int r; - char *addrport=NULL, *address=NULL, *nickname=NULL, *fingerprint=NULL; - uint16_t dir_port = 0, or_port = 0; - char digest[DIGEST_LEN]; - char v3_digest[DIGEST_LEN]; - dirinfo_type_t type = 0; - int is_not_hidserv_authority = 0; - double weight = 1.0; - - items = smartlist_new(); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (smartlist_len(items) < 1) { - log_warn(LD_CONFIG, "No arguments on DirAuthority line."); - goto err; - } - - if (is_legal_nickname(smartlist_get(items, 0))) { - nickname = smartlist_get(items, 0); - smartlist_del_keeporder(items, 0); - } - - while (smartlist_len(items)) { - char *flag = smartlist_get(items, 0); - if (TOR_ISDIGIT(flag[0])) - break; - if (!strcasecmp(flag, "v1")) { - type |= (V1_DIRINFO | HIDSERV_DIRINFO); - } else if (!strcasecmp(flag, "hs")) { - type |= HIDSERV_DIRINFO; - } else if (!strcasecmp(flag, "no-hs")) { - is_not_hidserv_authority = 1; - } else if (!strcasecmp(flag, "bridge")) { - type |= BRIDGE_DIRINFO; - } else if (!strcasecmp(flag, "no-v2")) { - /* obsolete, but may still be contained in DirAuthority lines generated - by various tools */; - } else if (!strcasecmpstart(flag, "orport=")) { - int ok; - char *portstring = flag + strlen("orport="); - or_port = (uint16_t) tor_parse_long(portstring, 10, 1, 65535, &ok, NULL); - if (!ok) - log_warn(LD_CONFIG, "Invalid orport '%s' on DirAuthority line.", - portstring); - } else if (!strcmpstart(flag, "weight=")) { - int ok; - const char *wstring = flag + strlen("weight="); - weight = tor_parse_double(wstring, 0, UINT64_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Invalid weight '%s' on DirAuthority line.",flag); - weight=1.0; - } - } else if (!strcasecmpstart(flag, "v3ident=")) { - char *idstr = flag + strlen("v3ident="); - if (strlen(idstr) != HEX_DIGEST_LEN || - base16_decode(v3_digest, DIGEST_LEN, idstr, HEX_DIGEST_LEN)<0) { - log_warn(LD_CONFIG, "Bad v3 identity digest '%s' on DirAuthority line", - flag); - } else { - type |= V3_DIRINFO|EXTRAINFO_DIRINFO|MICRODESC_DIRINFO; - } - } else { - log_warn(LD_CONFIG, "Unrecognized flag '%s' on DirAuthority line", - flag); - } - tor_free(flag); - smartlist_del_keeporder(items, 0); - } - if (is_not_hidserv_authority) - type &= ~HIDSERV_DIRINFO; - - if (smartlist_len(items) < 2) { - log_warn(LD_CONFIG, "Too few arguments to DirAuthority line."); - goto err; - } - addrport = smartlist_get(items, 0); - smartlist_del_keeporder(items, 0); - if (addr_port_lookup(LOG_WARN, addrport, &address, NULL, &dir_port)<0) { - log_warn(LD_CONFIG, "Error parsing DirAuthority address '%s'", addrport); - goto err; - } - if (!dir_port) { - log_warn(LD_CONFIG, "Missing port in DirAuthority address '%s'",addrport); - goto err; - } - - fingerprint = smartlist_join_strings(items, "", 0, NULL); - if (strlen(fingerprint) != HEX_DIGEST_LEN) { - log_warn(LD_CONFIG, "Key digest '%s' for DirAuthority is wrong length %d.", - fingerprint, (int)strlen(fingerprint)); - goto err; - } - if (!strcmp(fingerprint, "E623F7625FBE0C87820F11EC5F6D5377ED816294")) { - /* a known bad fingerprint. refuse to use it. We can remove this - * clause once Tor 0.1.2.17 is obsolete. */ - log_warn(LD_CONFIG, "Dangerous dirserver line. To correct, erase your " - "torrc file (%s), or reinstall Tor and use the default torrc.", - get_torrc_fname(0)); - goto err; - } - if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) { - log_warn(LD_CONFIG, "Unable to decode DirAuthority key digest."); - goto err; - } - - if (!validate_only && (!required_type || required_type & type)) { - dir_server_t *ds; - if (required_type) - type &= required_type; /* pare down what we think of them as an - * authority for. */ - log_debug(LD_DIR, "Trusted %d dirserver at %s:%d (%s)", (int)type, - address, (int)dir_port, (char*)smartlist_get(items,0)); - if (!(ds = trusted_dir_server_new(nickname, address, dir_port, or_port, - digest, v3_digest, type, weight))) - goto err; - dir_server_add(ds); - } - - r = 0; - goto done; - - err: - r = -1; - - done: - SMARTLIST_FOREACH(items, char*, s, tor_free(s)); - smartlist_free(items); - tor_free(addrport); - tor_free(address); - tor_free(nickname); - tor_free(fingerprint); - return r; -} - -/** Read the contents of a FallbackDir line from line. If - * validate_only is 0, and the line is well-formed, then add the - * dirserver described in the line as a fallback directory. Return 0 on - * success, or -1 if the line isn't well-formed or if we can't add it. */ -static int -parse_dir_fallback_line(const char *line, - int validate_only) -{ - int r = -1; - smartlist_t *items = smartlist_new(), *positional = smartlist_new(); - int orport = -1; - uint16_t dirport; - tor_addr_t addr; - int ok; - char id[DIGEST_LEN]; - char *address=NULL; - double weight=1.0; - - memset(id, 0, sizeof(id)); - smartlist_split_string(items, line, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - SMARTLIST_FOREACH_BEGIN(items, const char *, cp) { - const char *eq = strchr(cp, '='); - ok = 1; - if (! eq) { - smartlist_add(positional, (char*)cp); - continue; - } - if (!strcmpstart(cp, "orport=")) { - orport = (int)tor_parse_long(cp+strlen("orport="), 10, - 1, 65535, &ok, NULL); - } else if (!strcmpstart(cp, "id=")) { - ok = !base16_decode(id, DIGEST_LEN, - cp+strlen("id="), strlen(cp)-strlen("id=")); - } else if (!strcmpstart(cp, "weight=")) { - int ok; - const char *wstring = cp + strlen("weight="); - weight = tor_parse_double(wstring, 0, UINT64_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Invalid weight '%s' on FallbackDir line.", cp); - weight=1.0; - } - } - - if (!ok) { - log_warn(LD_CONFIG, "Bad FallbackDir option %s", escaped(cp)); - goto end; - } - } SMARTLIST_FOREACH_END(cp); - - if (smartlist_len(positional) != 1) { - log_warn(LD_CONFIG, "Couldn't parse FallbackDir line %s", escaped(line)); - goto end; - } - - if (tor_digest_is_zero(id)) { - log_warn(LD_CONFIG, "Missing identity on FallbackDir line"); - goto end; - } - - if (orport <= 0) { - log_warn(LD_CONFIG, "Missing orport on FallbackDir line"); - goto end; - } - - if (tor_addr_port_split(LOG_INFO, smartlist_get(positional, 0), - &address, &dirport) < 0 || - tor_addr_parse(&addr, address)<0) { - log_warn(LD_CONFIG, "Couldn't parse address:port %s on FallbackDir line", - (const char*)smartlist_get(positional, 0)); - goto end; - } - - if (!validate_only) { - dir_server_t *ds; - ds = fallback_dir_server_new(&addr, dirport, orport, id, weight); - if (!ds) { - log_warn(LD_CONFIG, "Couldn't create FallbackDir %s", escaped(line)); - goto end; - } - dir_server_add(ds); - } - - r = 0; - - end: - SMARTLIST_FOREACH(items, char *, cp, tor_free(cp)); - smartlist_free(items); - smartlist_free(positional); - tor_free(address); - return r; -} - -/** Allocate and return a new port_cfg_t with reasonable defaults. */ -static port_cfg_t * -port_cfg_new(void) -{ - port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t)); - cfg->ipv4_traffic = 1; - cfg->cache_ipv4_answers = 1; - cfg->prefer_ipv6_virtaddr = 1; - return cfg; -} - -/** Free all storage held in port */ -static void -port_cfg_free(port_cfg_t *port) -{ - tor_free(port); -} - -/** Warn for every port in ports of type listener_type that is - * on a publicly routable address. */ -static void -warn_nonlocal_client_ports(const smartlist_t *ports, const char *portname, - int listener_type) -{ - SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { - if (port->type != listener_type) - continue; - if (port->is_unix_addr) { - /* Unix sockets aren't accessible over a network. */ - } else if (!tor_addr_is_internal(&port->addr, 1)) { - log_warn(LD_CONFIG, "You specified a public address '%s' for %sPort. " - "Other people on the Internet might find your computer and " - "use it as an open proxy. Please don't allow this unless you " - "have a good reason.", - fmt_addrport(&port->addr, port->port), portname); - } else if (!tor_addr_is_loopback(&port->addr)) { - log_notice(LD_CONFIG, "You configured a non-loopback address '%s' " - "for %sPort. This allows everybody on your local network to " - "use your machine as a proxy. Make sure this is what you " - "wanted.", - fmt_addrport(&port->addr, port->port), portname); - } - } SMARTLIST_FOREACH_END(port); -} - -/** Warn for every Extended ORPort port in ports that is on a - * publicly routable address. */ -static void -warn_nonlocal_ext_orports(const smartlist_t *ports, const char *portname) -{ - SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { - if (port->type != CONN_TYPE_EXT_OR_LISTENER) - continue; - if (port->is_unix_addr) - continue; - /* XXX maybe warn even if address is RFC1918? */ - if (!tor_addr_is_internal(&port->addr, 1)) { - log_warn(LD_CONFIG, "You specified a public address '%s' for %sPort. " - "This is not advised; this address is supposed to only be " - "exposed on localhost so that your pluggable transport " - "proxies can connect to it.", - fmt_addrport(&port->addr, port->port), portname); - } - } SMARTLIST_FOREACH_END(port); -} - -/** Given a list of port_cfg_t in ports, warn any controller port there - * is listening on any non-loopback address. If forbid is true, - * then emit a stronger warning and remove the port from the list. - */ -static void -warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid) -{ - int warned = 0; - SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) { - if (port->type != CONN_TYPE_CONTROL_LISTENER) - continue; - if (port->is_unix_addr) - continue; - if (!tor_addr_is_loopback(&port->addr)) { - if (forbid) { - if (!warned) - log_warn(LD_CONFIG, - "You have a ControlPort set to accept " - "unauthenticated connections from a non-local address. " - "This means that programs not running on your computer " - "can reconfigure your Tor, without even having to guess a " - "password. That's so bad that I'm closing your ControlPort " - "for you. If you need to control your Tor remotely, try " - "enabling authentication and using a tool like stunnel or " - "ssh to encrypt remote access."); - warned = 1; - port_cfg_free(port); - SMARTLIST_DEL_CURRENT(ports, port); - } else { - log_warn(LD_CONFIG, "You have a ControlPort set to accept " - "connections from a non-local address. This means that " - "programs not running on your computer can reconfigure your " - "Tor. That's pretty bad, since the controller " - "protocol isn't encrypted! Maybe you should just listen on " - "127.0.0.1 and use a tool like stunnel or ssh to encrypt " - "remote connections to your control port."); - return; /* No point in checking the rest */ - } - } - } SMARTLIST_FOREACH_END(port); -} - -#define CL_PORT_NO_OPTIONS (1u<<0) -#define CL_PORT_WARN_NONLOCAL (1u<<1) -#define CL_PORT_ALLOW_EXTRA_LISTENADDR (1u<<2) -#define CL_PORT_SERVER_OPTIONS (1u<<3) -#define CL_PORT_FORBID_NONLOCAL (1u<<4) -#define CL_PORT_TAKES_HOSTNAMES (1u<<5) - -/** - * Parse port configuration for a single port type. - * - * Read entries of the "FooPort" type from the list ports, and - * entries of the "FooListenAddress" type from the list - * listenaddrs. Two syntaxes are supported: a legacy syntax - * where FooPort is at most a single entry containing a port number and - * where FooListenAddress has any number of address:port combinations; - * and a new syntax where there are no FooListenAddress entries and - * where FooPort can have any number of entries of the format - * "[Address:][Port] IsolationOptions". - * - * In log messages, describe the port type as portname. - * - * If no address is specified, default to defaultaddr. If no - * FooPort is given, default to defaultport (if 0, there is no default). - * - * If CL_PORT_NO_OPTIONS is set in flags, do not allow stream - * isolation options in the FooPort entries. - * - * If CL_PORT_WARN_NONLOCAL is set in flags, warn if any of the - * ports are not on a local address. If CL_PORT_FORBID_NONLOCAL is set, - * this is a contrl port with no password set: don't even allow it. - * - * Unless CL_PORT_ALLOW_EXTRA_LISTENADDR is set in flags, warn - * if FooListenAddress is set but FooPort is 0. - * - * If CL_PORT_SERVER_OPTIONS is set in flags, do not allow stream - * isolation options in the FooPort entries; instead allow the - * server-port option set. - * - * If CL_PORT_TAKES_HOSTNAMES is set in flags, allow the options - * {No,}IPv{4,6}Traffic. - * - * On success, if out is given, add a new port_cfg_t entry to - * out for every port that the client should listen on. Return 0 - * on success, -1 on failure. - */ -static int -parse_port_config(smartlist_t *out, - const config_line_t *ports, - const config_line_t *listenaddrs, - const char *portname, - int listener_type, - const char *defaultaddr, - int defaultport, - unsigned flags) -{ - smartlist_t *elts; - int retval = -1; - const unsigned is_control = (listener_type == CONN_TYPE_CONTROL_LISTENER); - const unsigned is_ext_orport = (listener_type == CONN_TYPE_EXT_OR_LISTENER); - const unsigned allow_no_options = flags & CL_PORT_NO_OPTIONS; - const unsigned use_server_options = flags & CL_PORT_SERVER_OPTIONS; - const unsigned warn_nonlocal = flags & CL_PORT_WARN_NONLOCAL; - const unsigned forbid_nonlocal = flags & CL_PORT_FORBID_NONLOCAL; - const unsigned allow_spurious_listenaddr = - flags & CL_PORT_ALLOW_EXTRA_LISTENADDR; - const unsigned takes_hostnames = flags & CL_PORT_TAKES_HOSTNAMES; - int got_zero_port=0, got_nonzero_port=0; - - /* FooListenAddress is deprecated; let's make it work like it used to work, - * though. */ - if (listenaddrs) { - int mainport = defaultport; - - if (ports && ports->next) { - log_warn(LD_CONFIG, "%sListenAddress can't be used when there are " - "multiple %sPort lines", portname, portname); - return -1; - } else if (ports) { - if (!strcmp(ports->value, "auto")) { - mainport = CFG_AUTO_PORT; - } else { - int ok; - mainport = (int)tor_parse_long(ports->value, 10, 0, 65535, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "%sListenAddress can only be used with a single " - "%sPort with value \"auto\" or 1-65535 and no options set.", - portname, portname); - return -1; - } - } - } - - if (mainport == 0) { - if (allow_spurious_listenaddr) - return 1; /*DOCDOC*/ - log_warn(LD_CONFIG, "%sPort must be defined if %sListenAddress is used", - portname, portname); - return -1; - } - - if (use_server_options && out) { - /* Add a no_listen port. */ - port_cfg_t *cfg = port_cfg_new(); - cfg->type = listener_type; - cfg->port = mainport; - tor_addr_make_unspec(&cfg->addr); /* Server ports default to 0.0.0.0 */ - cfg->no_listen = 1; - cfg->bind_ipv4_only = 1; - cfg->ipv4_traffic = 1; - cfg->prefer_ipv6_virtaddr = 1; - smartlist_add(out, cfg); - } - - for (; listenaddrs; listenaddrs = listenaddrs->next) { - tor_addr_t addr; - uint16_t port = 0; - if (tor_addr_port_lookup(listenaddrs->value, &addr, &port) < 0) { - log_warn(LD_CONFIG, "Unable to parse %sListenAddress '%s'", - portname, listenaddrs->value); - return -1; - } - if (out) { - port_cfg_t *cfg = port_cfg_new(); - cfg->type = listener_type; - cfg->port = port ? port : mainport; - tor_addr_copy(&cfg->addr, &addr); - cfg->session_group = SESSION_GROUP_UNSET; - cfg->isolation_flags = ISO_DEFAULT; - cfg->no_advertise = 1; - smartlist_add(out, cfg); - } - } - - if (warn_nonlocal && out) { - if (is_control) - warn_nonlocal_controller_ports(out, forbid_nonlocal); - else if (is_ext_orport) - warn_nonlocal_ext_orports(out, portname); - else - warn_nonlocal_client_ports(out, portname, listener_type); - } - return 0; - } /* end if (listenaddrs) */ - - /* No ListenAddress lines. If there's no FooPort, then maybe make a default - * one. */ - if (! ports) { - if (defaultport && out) { - port_cfg_t *cfg = port_cfg_new(); - cfg->type = listener_type; - cfg->port = defaultport; - tor_addr_parse(&cfg->addr, defaultaddr); - cfg->session_group = SESSION_GROUP_UNSET; - cfg->isolation_flags = ISO_DEFAULT; - smartlist_add(out, cfg); - } - return 0; - } - - /* At last we can actually parse the FooPort lines. The syntax is: - * [Addr:](Port|auto) [Options].*/ - elts = smartlist_new(); - - for (; ports; ports = ports->next) { - tor_addr_t addr; - int port; - int sessiongroup = SESSION_GROUP_UNSET; - unsigned isolation = ISO_DEFAULT; - int prefer_no_auth = 0; - - char *addrport; - uint16_t ptmp=0; - int ok; - int no_listen = 0, no_advertise = 0, all_addrs = 0, - bind_ipv4_only = 0, bind_ipv6_only = 0, - ipv4_traffic = 1, ipv6_traffic = 0, prefer_ipv6 = 0, - cache_ipv4 = 1, use_cached_ipv4 = 0, - cache_ipv6 = 0, use_cached_ipv6 = 0, - prefer_ipv6_automap = 1; - - smartlist_split_string(elts, ports->value, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(elts) == 0) { - log_warn(LD_CONFIG, "Invalid %sPort line with no value", portname); - goto err; - } - - if (allow_no_options && smartlist_len(elts) > 1) { - log_warn(LD_CONFIG, "Too many options on %sPort line", portname); - goto err; - } - - /* Now parse the addr/port value */ - addrport = smartlist_get(elts, 0); - if (!strcmp(addrport, "auto")) { - port = CFG_AUTO_PORT; - tor_addr_parse(&addr, defaultaddr); - } else if (!strcasecmpend(addrport, ":auto")) { - char *addrtmp = tor_strndup(addrport, strlen(addrport)-5); - port = CFG_AUTO_PORT; - if (tor_addr_port_lookup(addrtmp, &addr, &ptmp)<0 || ptmp) { - log_warn(LD_CONFIG, "Invalid address '%s' for %sPort", - escaped(addrport), portname); - tor_free(addrtmp); - goto err; - } - } else { - /* Try parsing integer port before address, because, who knows? - "21102" might be a valid address. */ - port = (int) tor_parse_long(addrport, 10, 0, 65535, &ok, NULL); - if (ok) { - tor_addr_parse(&addr, defaultaddr); - } else if (tor_addr_port_lookup(addrport, &addr, &ptmp) == 0) { - if (ptmp == 0) { - log_warn(LD_CONFIG, "%sPort line has address but no port", portname); - goto err; - } - port = ptmp; - } else { - log_warn(LD_CONFIG, "Couldn't parse address '%s' for %sPort", - escaped(addrport), portname); - goto err; - } - } - - /* Now parse the rest of the options, if any. */ - if (use_server_options) { - /* This is a server port; parse advertising options */ - SMARTLIST_FOREACH_BEGIN(elts, char *, elt) { - if (elt_sl_idx == 0) - continue; /* Skip addr:port */ - - if (!strcasecmp(elt, "NoAdvertise")) { - no_advertise = 1; - } else if (!strcasecmp(elt, "NoListen")) { - no_listen = 1; -#if 0 - /* not implemented yet. */ - } else if (!strcasecmp(elt, "AllAddrs")) { - - all_addrs = 1; -#endif - } else if (!strcasecmp(elt, "IPv4Only")) { - bind_ipv4_only = 1; - } else if (!strcasecmp(elt, "IPv6Only")) { - bind_ipv6_only = 1; - } else { - log_warn(LD_CONFIG, "Unrecognized %sPort option '%s'", - portname, escaped(elt)); - } - } SMARTLIST_FOREACH_END(elt); - - if (no_advertise && no_listen) { - log_warn(LD_CONFIG, "Tried to set both NoListen and NoAdvertise " - "on %sPort line '%s'", - portname, escaped(ports->value)); - goto err; - } - if (bind_ipv4_only && bind_ipv6_only) { - log_warn(LD_CONFIG, "Tried to set both IPv4Only and IPv6Only " - "on %sPort line '%s'", - portname, escaped(ports->value)); - goto err; - } - if (bind_ipv4_only && tor_addr_family(&addr) == AF_INET6) { - log_warn(LD_CONFIG, "Could not interpret %sPort address as IPv6", - portname); - goto err; - } - if (bind_ipv6_only && tor_addr_family(&addr) == AF_INET) { - log_warn(LD_CONFIG, "Could not interpret %sPort address as IPv4", - portname); - goto err; - } - } else { - /* This is a client port; parse isolation options */ - SMARTLIST_FOREACH_BEGIN(elts, char *, elt) { - int no = 0, isoflag = 0; - const char *elt_orig = elt; - if (elt_sl_idx == 0) - continue; /* Skip addr:port */ - if (!strcasecmpstart(elt, "SessionGroup=")) { - int group = (int)tor_parse_long(elt+strlen("SessionGroup="), - 10, 0, INT_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Invalid %sPort option '%s'", - portname, escaped(elt)); - goto err; - } - if (sessiongroup >= 0) { - log_warn(LD_CONFIG, "Multiple SessionGroup options on %sPort", - portname); - goto err; - } - sessiongroup = group; - continue; - } - - if (!strcasecmpstart(elt, "No")) { - no = 1; - elt += 2; - } - - if (takes_hostnames) { - if (!strcasecmp(elt, "IPv4Traffic")) { - ipv4_traffic = ! no; - continue; - } else if (!strcasecmp(elt, "IPv6Traffic")) { - ipv6_traffic = ! no; - continue; - } else if (!strcasecmp(elt, "PreferIPv6")) { - prefer_ipv6 = ! no; - continue; - } - } - if (!strcasecmp(elt, "CacheIPv4DNS")) { - cache_ipv4 = ! no; - continue; - } else if (!strcasecmp(elt, "CacheIPv6DNS")) { - cache_ipv6 = ! no; - continue; - } else if (!strcasecmp(elt, "CacheDNS")) { - cache_ipv4 = cache_ipv6 = ! no; - continue; - } else if (!strcasecmp(elt, "UseIPv4Cache")) { - use_cached_ipv4 = ! no; - continue; - } else if (!strcasecmp(elt, "UseIPv6Cache")) { - use_cached_ipv6 = ! no; - continue; - } else if (!strcasecmp(elt, "UseDNSCache")) { - use_cached_ipv4 = use_cached_ipv6 = ! no; - continue; - } else if (!strcasecmp(elt, "PreferIPv6Automap")) { - prefer_ipv6_automap = ! no; - continue; - } else if (!strcasecmp(elt, "PreferSOCKSNoAuth")) { - prefer_no_auth = ! no; - continue; - } - - if (!strcasecmpend(elt, "s")) - elt[strlen(elt)-1] = '\0'; /* kill plurals. */ - - if (!strcasecmp(elt, "IsolateDestPort")) { - isoflag = ISO_DESTPORT; - } else if (!strcasecmp(elt, "IsolateDestAddr")) { - isoflag = ISO_DESTADDR; - } else if (!strcasecmp(elt, "IsolateSOCKSAuth")) { - isoflag = ISO_SOCKSAUTH; - } else if (!strcasecmp(elt, "IsolateClientProtocol")) { - isoflag = ISO_CLIENTPROTO; - } else if (!strcasecmp(elt, "IsolateClientAddr")) { - isoflag = ISO_CLIENTADDR; - } else { - log_warn(LD_CONFIG, "Unrecognized %sPort option '%s'", - portname, escaped(elt_orig)); - } - - if (no) { - isolation &= ~isoflag; - } else { - isolation |= isoflag; - } - } SMARTLIST_FOREACH_END(elt); - } - - if (port) - got_nonzero_port = 1; - else - got_zero_port = 1; - - if (ipv4_traffic == 0 && ipv6_traffic == 0) { - log_warn(LD_CONFIG, "You have a %sPort entry with both IPv4 and " - "IPv6 disabled; that won't work.", portname); - goto err; - } - - if (out && port) { - port_cfg_t *cfg = port_cfg_new(); - tor_addr_copy(&cfg->addr, &addr); - cfg->port = port; - cfg->type = listener_type; - cfg->isolation_flags = isolation; - cfg->session_group = sessiongroup; - cfg->no_advertise = no_advertise; - cfg->no_listen = no_listen; - cfg->all_addrs = all_addrs; - cfg->bind_ipv4_only = bind_ipv4_only; - cfg->bind_ipv6_only = bind_ipv6_only; - cfg->ipv4_traffic = ipv4_traffic; - cfg->ipv6_traffic = ipv6_traffic; - cfg->prefer_ipv6 = prefer_ipv6; - cfg->cache_ipv4_answers = cache_ipv4; - cfg->cache_ipv6_answers = cache_ipv6; - cfg->use_cached_ipv4_answers = use_cached_ipv4; - cfg->use_cached_ipv6_answers = use_cached_ipv6; - cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap; - cfg->socks_prefer_no_auth = prefer_no_auth; - if (! (isolation & ISO_SOCKSAUTH)) - cfg->socks_prefer_no_auth = 1; - - smartlist_add(out, cfg); - } - SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); - smartlist_clear(elts); - } - - if (warn_nonlocal && out) { - if (is_control) - warn_nonlocal_controller_ports(out, forbid_nonlocal); - else if (is_ext_orport) - warn_nonlocal_ext_orports(out, portname); - else - warn_nonlocal_client_ports(out, portname, listener_type); - } - - if (got_zero_port && got_nonzero_port) { - log_warn(LD_CONFIG, "You specified a nonzero %sPort along with '%sPort 0' " - "in the same configuration. Did you mean to disable %sPort or " - "not?", portname, portname, portname); - goto err; - } - - retval = 0; - err: - SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); - smartlist_free(elts); - return retval; -} - -/** Parse a list of config_line_t for an AF_UNIX unix socket listener option - * from cfg and add them to out. No fancy options are - * supported: the line contains nothing but the path to the AF_UNIX socket. */ -static int -parse_unix_socket_config(smartlist_t *out, const config_line_t *cfg, - int listener_type) -{ - - if (!out) - return 0; - - for ( ; cfg; cfg = cfg->next) { - size_t len = strlen(cfg->value); - port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t) + len + 1); - port->is_unix_addr = 1; - memcpy(port->unix_addr, cfg->value, len+1); - port->type = listener_type; - smartlist_add(out, port); - } - - return 0; -} - -/** Return the number of ports which are actually going to listen with type - * listenertype. Do not count no_listen ports. Do not count unix - * sockets. */ -static int -count_real_listeners(const smartlist_t *ports, int listenertype) -{ - int n = 0; - SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) { - if (port->no_listen || port->is_unix_addr) - continue; - if (port->type != listenertype) - continue; - ++n; - } SMARTLIST_FOREACH_END(port); - return n; -} - -/** Parse all client port types (Socks, DNS, Trans, NATD) from - * options. On success, set *n_ports_out to the number - * of ports that are listed, update the *Port_set values in - * options, and return 0. On failure, set *msg to a - * description of the problem and return -1. - * - * If validate_only is false, set configured_client_ports to the - * new list of ports parsed from options. - **/ -static int -parse_ports(or_options_t *options, int validate_only, - char **msg, int *n_ports_out) -{ - smartlist_t *ports; - int retval = -1; - - ports = smartlist_new(); - - *n_ports_out = 0; - - if (parse_port_config(ports, - options->SocksPort_lines, options->SocksListenAddress, - "Socks", CONN_TYPE_AP_LISTENER, - "127.0.0.1", 21102, - CL_PORT_WARN_NONLOCAL|CL_PORT_ALLOW_EXTRA_LISTENADDR| - CL_PORT_TAKES_HOSTNAMES) < 0) { - *msg = tor_strdup("Invalid SocksPort/SocksListenAddress configuration"); - goto err; - } - if (parse_port_config(ports, - options->DNSPort_lines, options->DNSListenAddress, - "DNS", CONN_TYPE_AP_DNS_LISTENER, - "127.0.0.1", 0, - CL_PORT_WARN_NONLOCAL|CL_PORT_TAKES_HOSTNAMES) < 0) { - *msg = tor_strdup("Invalid DNSPort/DNSListenAddress configuration"); - goto err; - } - if (parse_port_config(ports, - options->TransPort_lines, options->TransListenAddress, - "Trans", CONN_TYPE_AP_TRANS_LISTENER, - "127.0.0.1", 0, - CL_PORT_WARN_NONLOCAL) < 0) { - *msg = tor_strdup("Invalid TransPort/TransListenAddress configuration"); - goto err; - } - if (parse_port_config(ports, - options->NATDPort_lines, options->NATDListenAddress, - "NATD", CONN_TYPE_AP_NATD_LISTENER, - "127.0.0.1", 0, - CL_PORT_WARN_NONLOCAL) < 0) { - *msg = tor_strdup("Invalid NatdPort/NatdListenAddress configuration"); - goto err; - } - { - unsigned control_port_flags = CL_PORT_NO_OPTIONS | CL_PORT_WARN_NONLOCAL; - const int any_passwords = (options->HashedControlPassword || - options->HashedControlSessionPassword || - options->CookieAuthentication); - if (! any_passwords) - control_port_flags |= CL_PORT_FORBID_NONLOCAL; - - if (parse_port_config(ports, - options->ControlPort_lines, - options->ControlListenAddress, - "Control", CONN_TYPE_CONTROL_LISTENER, - "127.0.0.1", 0, - control_port_flags) < 0) { - *msg = tor_strdup("Invalid ControlPort/ControlListenAddress " - "configuration"); - goto err; - } - if (parse_unix_socket_config(ports, - options->ControlSocket, - CONN_TYPE_CONTROL_LISTENER) < 0) { - *msg = tor_strdup("Invalid ControlSocket configuration"); - goto err; - } - } - if (! options->ClientOnly) { - if (parse_port_config(ports, - options->ORPort_lines, options->ORListenAddress, - "OR", CONN_TYPE_OR_LISTENER, - "0.0.0.0", 0, - CL_PORT_SERVER_OPTIONS) < 0) { - *msg = tor_strdup("Invalid ORPort/ORListenAddress configuration"); - goto err; - } - if (parse_port_config(ports, - options->ExtORPort_lines, NULL, - "ExtOR", CONN_TYPE_EXT_OR_LISTENER, - "127.0.0.1", 0, - CL_PORT_SERVER_OPTIONS|CL_PORT_WARN_NONLOCAL) < 0) { - *msg = tor_strdup("Invalid ExtORPort configuration"); - goto err; - } - if (parse_port_config(ports, - options->DirPort_lines, options->DirListenAddress, - "Dir", CONN_TYPE_DIR_LISTENER, - "0.0.0.0", 0, - CL_PORT_SERVER_OPTIONS) < 0) { - *msg = tor_strdup("Invalid DirPort/DirListenAddress configuration"); - goto err; - } - } - - if (check_server_ports(ports, options) < 0) { - *msg = tor_strdup("Misconfigured server ports"); - goto err; - } - - *n_ports_out = smartlist_len(ports); - - retval = 0; - - /* Update the *Port_set options. The !! here is to force a boolean out of - an integer. */ - options->ORPort_set = - !! count_real_listeners(ports, CONN_TYPE_OR_LISTENER); - options->SocksPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER); - options->TransPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_TRANS_LISTENER); - options->NATDPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_NATD_LISTENER); - options->ControlPort_set = - !! count_real_listeners(ports, CONN_TYPE_CONTROL_LISTENER); - options->DirPort_set = - !! count_real_listeners(ports, CONN_TYPE_DIR_LISTENER); - options->DNSPort_set = - !! count_real_listeners(ports, CONN_TYPE_AP_DNS_LISTENER); - options->ExtORPort_set = - !! count_real_listeners(ports, CONN_TYPE_EXT_OR_LISTENER); - - if (!validate_only) { - if (configured_ports) { - SMARTLIST_FOREACH(configured_ports, - port_cfg_t *, p, port_cfg_free(p)); - smartlist_free(configured_ports); - } - configured_ports = ports; - ports = NULL; /* prevent free below. */ - } - - err: - if (ports) { - SMARTLIST_FOREACH(ports, port_cfg_t *, p, port_cfg_free(p)); - smartlist_free(ports); - } - return retval; -} - -/** Given a list of port_cfg_t in ports, check them for internal - * consistency and warn as appropriate. */ -static int -check_server_ports(const smartlist_t *ports, - const or_options_t *options) -{ - int n_orport_advertised = 0; - int n_orport_advertised_ipv4 = 0; - int n_orport_listeners = 0; - int n_dirport_advertised = 0; - int n_dirport_listeners = 0; - int n_low_port = 0; - int r = 0; - - SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { - if (port->type == CONN_TYPE_DIR_LISTENER) { - if (! port->no_advertise) - ++n_dirport_advertised; - if (! port->no_listen) - ++n_dirport_listeners; - } else if (port->type == CONN_TYPE_OR_LISTENER) { - if (! port->no_advertise) { - ++n_orport_advertised; - if (tor_addr_family(&port->addr) == AF_INET || - (tor_addr_family(&port->addr) == AF_UNSPEC && - !port->bind_ipv6_only)) - ++n_orport_advertised_ipv4; - } - if (! port->no_listen) - ++n_orport_listeners; - } else { - continue; - } -#ifndef _WIN32 - if (!port->no_listen && port->port < 1024) - ++n_low_port; -#endif - } SMARTLIST_FOREACH_END(port); - - if (n_orport_advertised && !n_orport_listeners) { - log_warn(LD_CONFIG, "We are advertising an ORPort, but not actually " - "listening on one."); - r = -1; - } - if (n_orport_listeners && !n_orport_advertised) { - log_warn(LD_CONFIG, "We are listening on an ORPort, but not advertising " - "any ORPorts. This will keep us from building a %s " - "descriptor, and make us impossible to use.", - options->BridgeRelay ? "bridge" : "router"); - r = -1; - } - if (n_dirport_advertised && !n_dirport_listeners) { - log_warn(LD_CONFIG, "We are advertising a DirPort, but not actually " - "listening on one."); - r = -1; - } - if (n_dirport_advertised > 1) { - log_warn(LD_CONFIG, "Can't advertise more than one DirPort."); - r = -1; - } - if (n_orport_advertised && !n_orport_advertised_ipv4 && - !options->BridgeRelay) { - log_warn(LD_CONFIG, "Configured non-bridge only to listen on an IPv6 " - "address."); - r = -1; - } - - if (n_low_port && options->AccountingMax) { - log_warn(LD_CONFIG, - "You have set AccountingMax to use hibernation. You have also " - "chosen a low DirPort or OrPort. This combination can make Tor stop " - "working when it tries to re-attach the port after a period of " - "hibernation. Please choose a different port or turn off " - "hibernation unless you know this combination will work on your " - "platform."); - } - - return r; -} - -/** Return a list of port_cfg_t for client ports parsed from the - * options. */ -const smartlist_t * -get_configured_ports(void) -{ - if (!configured_ports) - configured_ports = smartlist_new(); - return configured_ports; -} - -/** Return an address:port string representation of the address - * where the first listener_type listener waits for - * connections. Return NULL if we couldn't find a listener. The - * string is allocated on the heap and it's the responsibility of the - * caller to free it after use. - * - * This function is meant to be used by the pluggable transport proxy - * spawning code, please make sure that it fits your purposes before - * using it. */ -char * -get_first_listener_addrport_string(int listener_type) -{ - static const char *ipv4_localhost = "127.0.0.1"; - static const char *ipv6_localhost = "[::1]"; - const char *address; - uint16_t port; - char *string = NULL; - - if (!configured_ports) - return NULL; - - SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->no_listen) - continue; - - if (cfg->type == listener_type && - tor_addr_family(&cfg->addr) != AF_UNSPEC) { - - /* We found the first listener of the type we are interested in! */ - - /* If a listener is listening on INADDR_ANY, assume that it's - also listening on 127.0.0.1, and point the transport proxy - there: */ - if (tor_addr_is_null(&cfg->addr)) - address = tor_addr_is_v4(&cfg->addr) ? ipv4_localhost : ipv6_localhost; - else - address = fmt_and_decorate_addr(&cfg->addr); - - /* If a listener is configured with port 'auto', we are forced - to iterate all listener connections and find out in which - port it ended up listening: */ - if (cfg->port == CFG_AUTO_PORT) { - port = router_get_active_listener_port_by_type_af(listener_type, - tor_addr_family(&cfg->addr)); - if (!port) - return NULL; - } else { - port = cfg->port; - } - - tor_asprintf(&string, "%s:%u", address, port); - - return string; - } - - } SMARTLIST_FOREACH_END(cfg); - - return NULL; -} - -/** Return the first advertised port of type listener_type in - address_family. */ -int -get_first_advertised_port_by_type_af(int listener_type, int address_family) -{ - if (!configured_ports) - return 0; - SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->type == listener_type && - !cfg->no_advertise && - (tor_addr_family(&cfg->addr) == address_family || - tor_addr_family(&cfg->addr) == AF_UNSPEC)) { - if (tor_addr_family(&cfg->addr) != AF_UNSPEC || - (address_family == AF_INET && !cfg->bind_ipv6_only) || - (address_family == AF_INET6 && !cfg->bind_ipv4_only)) { - return cfg->port; - } - } - } SMARTLIST_FOREACH_END(cfg); - return 0; -} - -/** Adjust the value of options->DataDirectory, or fill it in if it's - * absent. Return 0 on success, -1 on failure. */ -static int -normalize_data_directory(or_options_t *options) -{ - char *p; - if (options->DataDirectory) - return 0; /* all set */ -#ifdef _WIN32 - p = tor_malloc(MAX_PATH); - strlcpy(p,anonymize_tor_data_directory(),MAX_PATH); -#else - p = tor_malloc(PATH_MAX); - strlcpy(p,anonymize_tor_data_directory(),PATH_MAX); -#endif - options->DataDirectory = p; - return 0; -} - -/** Check and normalize the value of options->DataDirectory; return 0 if it - * is sane, -1 otherwise. */ -static int -validate_data_directory(or_options_t *options) -{ - if (normalize_data_directory(options) < 0) - return -1; - tor_assert(options->DataDirectory); - if (strlen(options->DataDirectory) > (512-128)) { - log_warn(LD_CONFIG, "DataDirectory is too long."); - return -1; - } - return 0; -} - -/** This string must remain the same forevermore. It is how we - * recognize that the torrc file doesn't need to be backed up. */ -#define GENERATED_FILE_PREFIX "# This file was generated by Tor; " \ - "if you edit it, comments will not be preserved" -/** This string can change; it tries to give the reader an idea - * that editing this file by hand is not a good plan. */ -#define GENERATED_FILE_COMMENT "# The old torrc file was renamed " \ - "to torrc.orig.1 or similar, and Tor will ignore it" - -/** Save a configuration file for the configuration in options - * into the file fname. If the file already exists, and - * doesn't begin with GENERATED_FILE_PREFIX, rename it. Otherwise - * replace it. Return 0 on success, -1 on failure. */ -static int -write_configuration_file(const char *fname, const or_options_t *options) -{ - char *old_val=NULL, *new_val=NULL, *new_conf=NULL; - int rename_old = 0, r; - - tor_assert(fname); - - switch (file_status(fname)) { - case FN_FILE: - old_val = read_file_to_str(fname, 0, NULL); - if (!old_val || strcmpstart(old_val, GENERATED_FILE_PREFIX)) { - rename_old = 1; - } - tor_free(old_val); - break; - case FN_NOENT: - break; - case FN_ERROR: - case FN_DIR: - default: - log_warn(LD_CONFIG, - "Config file \"%s\" is not a file? Failing.", fname); - return -1; - } - - if (!(new_conf = options_dump(options, OPTIONS_DUMP_MINIMAL))) { - log_warn(LD_BUG, "Couldn't get configuration string"); - goto err; - } - - tor_asprintf(&new_val, "%s\n%s\n\n%s", - GENERATED_FILE_PREFIX, GENERATED_FILE_COMMENT, new_conf); - - if (rename_old) { - int i = 1; - char *fn_tmp = NULL; - while (1) { - tor_asprintf(&fn_tmp, "%s.orig.%d", fname, i); - if (file_status(fn_tmp) == FN_NOENT) - break; - tor_free(fn_tmp); - ++i; - } - log_notice(LD_CONFIG, "Renaming old configuration file to \"%s\"", fn_tmp); - if (rename(fname, fn_tmp) < 0) { - log_warn(LD_FS, - "Couldn't rename configuration file \"%s\" to \"%s\": %s", - fname, fn_tmp, strerror(errno)); - tor_free(fn_tmp); - goto err; - } - tor_free(fn_tmp); - } - - if (write_str_to_file(fname, new_val, 0) < 0) - goto err; - - r = 0; - goto done; - err: - r = -1; - done: - tor_free(new_val); - tor_free(new_conf); - return r; -} - -/** - * Save the current configuration file value to disk. Return 0 on - * success, -1 on failure. - **/ -int -options_save_current(void) -{ - /* This fails if we can't write to our configuration file. - * - * If we try falling back to datadirectory or something, we have a better - * chance of saving the configuration, but a better chance of doing - * something the user never expected. */ - return write_configuration_file(get_torrc_fname(0), get_options()); -} - -/** Return the number of cpus configured in options. If we are - * told to auto-detect the number of cpus, return the auto-detected number. */ -int -get_num_cpus(const or_options_t *options) -{ - if (options->NumCPUs == 0) { - int n = compute_num_cpus(); - return (n >= 1) ? n : 1; - } else { - return options->NumCPUs; - } -} - -/** - * Initialize the libevent library. - */ -static void -init_libevent(const or_options_t *options) -{ - const char *badness=NULL; - tor_libevent_cfg cfg; - - tor_assert(options); - - configure_libevent_logging(); - /* If the kernel complains that some method (say, epoll) doesn't - * exist, we don't care about it, since libevent will cope. - */ - suppress_libevent_log_msg("Function not implemented"); - - tor_check_libevent_header_compatibility(); - - memset(&cfg, 0, sizeof(cfg)); - cfg.disable_iocp = options->DisableIOCP; - cfg.num_cpus = get_num_cpus(options); - cfg.msec_per_tick = options->TokenBucketRefillInterval; - - tor_libevent_initialize(&cfg); - - suppress_libevent_log_msg(NULL); - - tor_check_libevent_version(tor_libevent_get_method(), - server_mode(get_options()), - &badness); - if (badness) { - const char *v = tor_libevent_get_version_str(); - const char *m = tor_libevent_get_method(); - control_event_general_status(LOG_WARN, - "BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO", - v, m, badness); - } -} - -/** Return a newly allocated string holding a filename relative to the data - * directory. If sub1 is present, it is the first path component after - * the data directory. If sub2 is also present, it is the second path - * component after the data directory. If suffix is present, it - * is appended to the filename. - * - * Examples: - * get_datadir_fname2_suffix("a", NULL, NULL) -> $DATADIR/a - * get_datadir_fname2_suffix("a", NULL, ".tmp") -> $DATADIR/a.tmp - * get_datadir_fname2_suffix("a", "b", ".tmp") -> $DATADIR/a/b/.tmp - * get_datadir_fname2_suffix("a", "b", NULL) -> $DATADIR/a/b - * - * Note: Consider using the get_datadir_fname* macros in or.h. - */ -char * -options_get_datadir_fname2_suffix(const or_options_t *options, - const char *sub1, const char *sub2, - const char *suffix) -{ - char *fname = NULL; - size_t len; - tor_assert(options); - tor_assert(options->DataDirectory); - tor_assert(sub1 || !sub2); /* If sub2 is present, sub1 must be present. */ - len = strlen(options->DataDirectory); - if (sub1) { - len += strlen(sub1)+1; - if (sub2) - len += strlen(sub2)+1; - } - if (suffix) - len += strlen(suffix); - len++; - fname = tor_malloc(len); - if (sub1) { - if (sub2) { - tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s"PATH_SEPARATOR"%s", - options->DataDirectory, sub1, sub2); - } else { - tor_snprintf(fname, len, "%s"PATH_SEPARATOR"%s", - options->DataDirectory, sub1); - } - } else { - strlcpy(fname, options->DataDirectory, len); - } - if (suffix) - strlcat(fname, suffix, len); - return fname; -} - -/** Check wether the data directory has a private subdirectory - * subdir. If not, try to create it. Return 0 on success, - * -1 otherwise. */ -int -check_or_create_data_subdir(const char *subdir) -{ - char *statsdir = get_datadir_fname(subdir); - int return_val = 0; - - if (check_private_dir(statsdir, CPD_CREATE, get_options()->User) < 0) { - log_warn(LD_HIST, "Unable to create %s/ directory!", subdir); - return_val = -1; - } - tor_free(statsdir); - return return_val; -} - -/** Create a file named fname with contents str in the - * subdirectory subdir of the data directory. descr - * should be a short description of the file's content and will be - * used for the warning message, if it's present and the write process - * fails. Return 0 on success, -1 otherwise.*/ -int -write_to_data_subdir(const char* subdir, const char* fname, - const char* str, const char* descr) -{ - char *filename = get_datadir_fname2(subdir, fname); - int return_val = 0; - - if (write_str_to_file(filename, str, 0) < 0) { - log_warn(LD_HIST, "Unable to write %s to disk!", descr ? descr : fname); - return_val = -1; - } - tor_free(filename); - return return_val; -} - -/** Given a file name check to see whether the file exists but has not been - * modified for a very long time. If so, remove it. */ -void -remove_file_if_very_old(const char *fname, time_t now) -{ -#define VERY_OLD_FILE_AGE (28*24*60*60) - struct stat st; - - if (stat(sandbox_intern_string(fname), &st)==0 && - st.st_mtime < now-VERY_OLD_FILE_AGE) { - char buf[ISO_TIME_LEN+1]; - format_local_iso_time(buf, st.st_mtime); - log_notice(LD_GENERAL, "Obsolete file %s hasn't been modified since %s. " - "Removing it.", fname, buf); - unlink(fname); - } -} - -/** Return a smartlist of ports that must be forwarded by - * tor-fw-helper. The smartlist contains the ports in a string format - * that is understandable by tor-fw-helper. */ -smartlist_t * -get_list_of_ports_to_forward(void) -{ - smartlist_t *ports_to_forward = smartlist_new(); - int port = 0; - - /** XXX TODO tor-fw-helper does not support forwarding ports to - other hosts than the local one. If the user is binding to a - different IP address, tor-fw-helper won't work. */ - port = router_get_advertised_or_port(get_options()); /* Get ORPort */ - if (port) - smartlist_add_asprintf(ports_to_forward, "%d:%d", port, port); - - port = router_get_advertised_dir_port(get_options(), 0); /* Get DirPort */ - if (port) - smartlist_add_asprintf(ports_to_forward, "%d:%d", port, port); - - /* Get ports of transport proxies */ - { - smartlist_t *transport_ports = get_transport_proxy_ports(); - if (transport_ports) { - smartlist_add_all(ports_to_forward, transport_ports); - smartlist_free(transport_ports); - } - } - - if (!smartlist_len(ports_to_forward)) { - smartlist_free(ports_to_forward); - ports_to_forward = NULL; - } - - return ports_to_forward; -} - -/** Helper to implement GETINFO functions about configuration variables (not - * their values). Given a "config/names" question, set *answer to a - * new string describing the supported configuration variables and their - * types. */ -int -getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) conn; - (void) errmsg; - if (!strcmp(question, "config/names")) { - smartlist_t *sl = smartlist_new(); - int i; - for (i = 0; option_vars_[i].name; ++i) { - const config_var_t *var = &option_vars_[i]; - const char *type; - /* don't tell controller about triple-underscore options */ - if (!strncmp(option_vars_[i].name, "___", 3)) - continue; - switch (var->type) { - case CONFIG_TYPE_STRING: type = "String"; break; - case CONFIG_TYPE_FILENAME: type = "Filename"; break; - case CONFIG_TYPE_UINT: type = "Integer"; break; - case CONFIG_TYPE_INT: type = "SignedInteger"; break; - case CONFIG_TYPE_PORT: type = "Port"; break; - case CONFIG_TYPE_INTERVAL: type = "TimeInterval"; break; - case CONFIG_TYPE_MSEC_INTERVAL: type = "TimeMsecInterval"; break; - case CONFIG_TYPE_MEMUNIT: type = "DataSize"; break; - case CONFIG_TYPE_DOUBLE: type = "Float"; break; - case CONFIG_TYPE_BOOL: type = "Boolean"; break; - case CONFIG_TYPE_AUTOBOOL: type = "Boolean+Auto"; break; - case CONFIG_TYPE_ISOTIME: type = "Time"; break; - case CONFIG_TYPE_ROUTERSET: type = "RouterList"; break; - case CONFIG_TYPE_CSV: type = "CommaList"; break; - case CONFIG_TYPE_CSV_INTERVAL: type = "TimeIntervalCommaList"; break; - case CONFIG_TYPE_LINELIST: type = "LineList"; break; - case CONFIG_TYPE_LINELIST_S: type = "Dependant"; break; - case CONFIG_TYPE_LINELIST_V: type = "Virtual"; break; - default: - case CONFIG_TYPE_OBSOLETE: - type = NULL; break; - } - if (!type) - continue; - smartlist_add_asprintf(sl, "%s %s\n",var->name,type); - } - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } else if (!strcmp(question, "config/defaults")) { - smartlist_t *sl = smartlist_new(); - int i; - for (i = 0; option_vars_[i].name; ++i) { - const config_var_t *var = &option_vars_[i]; - if (var->initvalue != NULL) { - char *val = esc_for_log(var->initvalue); - smartlist_add_asprintf(sl, "%s %s\n",var->name,val); - tor_free(val); - } - } - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } - return 0; -} - -/** Parse outbound bind address option lines. If validate_only - * is not 0 update OutboundBindAddressIPv4_ and - * OutboundBindAddressIPv6_ in options. On failure, set - * msg (if provided) to a newly allocated string containing a - * description of the problem and return -1. */ -static int -parse_outbound_addresses(or_options_t *options, int validate_only, char **msg) -{ - const config_line_t *lines = options->OutboundBindAddress; - int found_v4 = 0, found_v6 = 0; - - if (!validate_only) { - memset(&options->OutboundBindAddressIPv4_, 0, - sizeof(options->OutboundBindAddressIPv4_)); - memset(&options->OutboundBindAddressIPv6_, 0, - sizeof(options->OutboundBindAddressIPv6_)); - } - while (lines) { - tor_addr_t addr, *dst_addr = NULL; - int af = tor_addr_parse(&addr, lines->value); - switch (af) { - case AF_INET: - if (found_v4) { - if (msg) - tor_asprintf(msg, "Multiple IPv4 outbound bind addresses " - "configured: %s", lines->value); - return -1; - } - found_v4 = 1; - dst_addr = &options->OutboundBindAddressIPv4_; - break; - case AF_INET6: - if (found_v6) { - if (msg) - tor_asprintf(msg, "Multiple IPv6 outbound bind addresses " - "configured: %s", lines->value); - return -1; - } - found_v6 = 1; - dst_addr = &options->OutboundBindAddressIPv6_; - break; - default: - if (msg) - tor_asprintf(msg, "Outbound bind address '%s' didn't parse.", - lines->value); - return -1; - } - if (!validate_only) - tor_addr_copy(dst_addr, &addr); - lines = lines->next; - } - return 0; -} - -/** Load one of the geoip files, family determining which - * one. default_fname is used if on Windows and - * fname equals "". */ -static void -config_load_geoip_file_(sa_family_t family, - const char *fname, - const char *default_fname) -{ -#ifdef _WIN32 - char *free_fname = NULL; /* Used to hold any temporary-allocated value */ - /* XXXX Don't use this "" junk; make our filename options - * understand prefixes somehow. -NM */ - if (!strcmp(fname, "")) { - const char *conf_root = get_windows_conf_root(); - tor_asprintf(&free_fname, "%s\\%s", conf_root, default_fname); - fname = free_fname; - } - geoip_load_file(family, fname); - tor_free(free_fname); -#else - (void)default_fname; - geoip_load_file(family, fname); -#endif -} - -/** Load geoip files for IPv4 and IPv6 if options and - * old_options indicate we should. */ -static void -config_maybe_load_geoip_files_(const or_options_t *options, - const or_options_t *old_options) -{ - /* XXXX024 Reload GeoIPFile on SIGHUP. -NM */ - - if (options->GeoIPFile && - ((!old_options || !opt_streq(old_options->GeoIPFile, - options->GeoIPFile)) - || !geoip_is_loaded(AF_INET))) - config_load_geoip_file_(AF_INET, options->GeoIPFile, "geoip"); - if (options->GeoIPv6File && - ((!old_options || !opt_streq(old_options->GeoIPv6File, - options->GeoIPv6File)) - || !geoip_is_loaded(AF_INET6))) - config_load_geoip_file_(AF_INET6, options->GeoIPv6File, "geoip6"); -} - -/** Initialize cookie authentication (used so far by the ControlPort - * and Extended ORPort). - * - * Allocate memory and create a cookie (of length cookie_len) - * in cookie_out. - * Then write it down to fname and prepend it with header. - * - * If the whole procedure was successful, set - * cookie_is_set_out to True. */ -int -init_cookie_authentication(const char *fname, const char *header, - int cookie_len, - uint8_t **cookie_out, int *cookie_is_set_out) -{ - char cookie_file_str_len = strlen(header) + cookie_len; - char *cookie_file_str = tor_malloc(cookie_file_str_len); - int retval = -1; - - /* We don't want to generate a new cookie every time we call - * options_act(). One should be enough. */ - if (*cookie_is_set_out) { - retval = 0; /* we are all set */ - goto done; - } - - /* If we've already set the cookie, free it before re-setting - it. This can happen if we previously generated a cookie, but - couldn't write it to a disk. */ - if (*cookie_out) - tor_free(*cookie_out); - - /* Generate the cookie */ - *cookie_out = tor_malloc(cookie_len); - if (crypto_rand((char *)*cookie_out, cookie_len) < 0) - goto done; - - /* Create the string that should be written on the file. */ - memcpy(cookie_file_str, header, strlen(header)); - memcpy(cookie_file_str+strlen(header), *cookie_out, cookie_len); - if (write_bytes_to_file(fname, cookie_file_str, cookie_file_str_len, 1)) { - log_warn(LD_FS,"Error writing auth cookie to %s.", escaped(fname)); - goto done; - } - - /* Success! */ - log_info(LD_GENERAL, "Generated auth cookie file in '%s'.", escaped(fname)); - *cookie_is_set_out = 1; - retval = 0; - - done: - memwipe(cookie_file_str, 0, cookie_file_str_len); - tor_free(cookie_file_str); - return retval; -} - diff --git a/src/tor/config.h b/src/tor/config.h deleted file mode 100644 index 8ee2a4572..000000000 --- a/src/tor/config.h +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file config.h - * \brief Header file for config.c. - **/ - -#ifndef TOR_CONFIG_H -#define TOR_CONFIG_H - -const char *get_dirportfrontpage(void); -const or_options_t *get_options(void); -or_options_t *get_options_mutable(void); -int set_options(or_options_t *new_val, char **msg); -void config_free_all(void); -const char *safe_str_client(const char *address); -const char *safe_str(const char *address); -const char *escaped_safe_str_client(const char *address); -const char *escaped_safe_str(const char *address); -const char *get_version(void); -const char *get_short_version(void); -setopt_err_t options_trial_assign(config_line_t *list, int use_defaults, - int clear_first, char **msg); - -uint32_t get_last_resolved_addr(void); -int resolve_my_address(int warn_severity, const or_options_t *options, - uint32_t *addr_out, - const char **method_out, char **hostname_out); -int is_local_addr(const tor_addr_t *addr); -void options_init(or_options_t *options); - -#define OPTIONS_DUMP_MINIMAL 1 -#define OPTIONS_DUMP_DEFAULTS 2 -#define OPTIONS_DUMP_ALL 3 -char *options_dump(const or_options_t *options, int how_to_dump); -int options_init_from_torrc(int argc, char **argv); -setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf, - int command, const char *command_arg, char **msg); -int option_is_recognized(const char *key); -const char *option_get_canonical_name(const char *key); -config_line_t *option_get_assignment(const or_options_t *options, - const char *key); -int options_save_current(void); -const char *get_torrc_fname(int defaults_fname); -char *options_get_datadir_fname2_suffix(const or_options_t *options, - const char *sub1, const char *sub2, - const char *suffix); -#define get_datadir_fname2_suffix(sub1, sub2, suffix) \ - options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix)) -/** Return a newly allocated string containing datadir/sub1. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname(sub1) get_datadir_fname2_suffix((sub1), NULL, NULL) -/** Return a newly allocated string containing datadir/sub1/sub2. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname2(sub1,sub2) \ - get_datadir_fname2_suffix((sub1), (sub2), NULL) -/** Return a newly allocated string containing datadir/sub1suffix. See - * get_datadir_fname2_suffix. */ -#define get_datadir_fname_suffix(sub1, suffix) \ - get_datadir_fname2_suffix((sub1), NULL, (suffix)) - -int check_or_create_data_subdir(const char *subdir); -int write_to_data_subdir(const char* subdir, const char* fname, - const char* str, const char* descr); - -int get_num_cpus(const or_options_t *options); - -const smartlist_t *get_configured_ports(void); -int get_first_advertised_port_by_type_af(int listener_type, - int address_family); -#define get_primary_or_port() \ - (get_first_advertised_port_by_type_af(CONN_TYPE_OR_LISTENER, AF_INET)) -#define get_primary_dir_port() \ - (get_first_advertised_port_by_type_af(CONN_TYPE_DIR_LISTENER, AF_INET)) - -char *get_first_listener_addrport_string(int listener_type); - -int options_need_geoip_info(const or_options_t *options, - const char **reason_out); - -smartlist_t *get_list_of_ports_to_forward(void); - -int getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -const char *tor_get_digests(void); -uint32_t get_effective_bwrate(const or_options_t *options); -uint32_t get_effective_bwburst(const or_options_t *options); - -char *get_transport_bindaddr_from_config(const char *transport); - -int init_cookie_authentication(const char *fname, const char *header, - int cookie_len, - uint8_t **cookie_out, int *cookie_is_set_out); - -or_options_t *options_new(void); - -int config_parse_commandline(int argc, char **argv, int ignore_errors, - config_line_t **result, - config_line_t **cmdline_result); - -void config_register_addressmaps(const or_options_t *options); -/* XXXX024 move to connection_edge.h */ -int addressmap_register_auto(const char *from, const char *to, - time_t expires, - addressmap_entry_source_t addrmap_source, - const char **msg); - -/** Represents the information stored in a torrc Bridge line. */ -typedef struct bridge_line_t { - tor_addr_t addr; /* The IP address of the bridge. */ - uint16_t port; /* The TCP port of the bridge. */ - char *transport_name; /* The name of the pluggable transport that - should be used to connect to the bridge. */ - char digest[DIGEST_LEN]; /* The bridge's identity key digest. */ - smartlist_t *socks_args; /* SOCKS arguments for the pluggable - transport proxy. */ -} bridge_line_t; - -void bridge_line_free(bridge_line_t *bridge_line); -bridge_line_t *parse_bridge_line(const char *line); -smartlist_t *get_options_from_transport_options_line(const char *line, - const char *transport); -smartlist_t *get_options_for_server_transport(const char *transport); - -#ifdef CONFIG_PRIVATE -#ifdef TOR_UNIT_TESTS -extern struct config_format_t options_format; -#endif - -STATIC void or_options_free(or_options_t *options); -STATIC int options_validate(or_options_t *old_options, - or_options_t *options, - or_options_t *default_options, - int from_setconf, char **msg); -#endif - -#endif - diff --git a/src/tor/config_codedigest.c b/src/tor/config_codedigest.c deleted file mode 100644 index 86d14bace..000000000 --- a/src/tor/config_codedigest.c +++ /dev/null @@ -1,13 +0,0 @@ - -const char *tor_get_digests(void); - -/** Return a string describing the digest of the source files in src/or/ - */ -const char * -tor_get_digests(void) -{ - return "" -#include "or_sha1.i" - ; -} - diff --git a/src/tor/confparse.c b/src/tor/confparse.c deleted file mode 100644 index c5400a651..000000000 --- a/src/tor/confparse.c +++ /dev/null @@ -1,1316 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "confparse.h" -#include "routerset.h" - -static uint64_t config_parse_memunit(const char *s, int *ok); -static int config_parse_msec_interval(const char *s, int *ok); -static int config_parse_interval(const char *s, int *ok); -static void config_reset(const config_format_t *fmt, void *options, - const config_var_t *var, int use_defaults); - -/** Allocate an empty configuration object of a given format type. */ -void * -config_new(const config_format_t *fmt) -{ - void *opts = tor_malloc_zero(fmt->size); - *(uint32_t*)STRUCT_VAR_P(opts, fmt->magic_offset) = fmt->magic; - CONFIG_CHECK(fmt, opts); - return opts; -} - -/* - * Functions to parse config options - */ - -/** If option is an official abbreviation for a longer option, - * return the longer option. Otherwise return option. - * If command_line is set, apply all abbreviations. Otherwise, only - * apply abbreviations that work for the config file and the command line. - * If warn_obsolete is set, warn about deprecated names. */ -const char * -config_expand_abbrev(const config_format_t *fmt, const char *option, - int command_line, int warn_obsolete) -{ - int i; - if (! fmt->abbrevs) - return option; - for (i=0; fmt->abbrevs[i].abbreviated; ++i) { - /* Abbreviations are case insensitive. */ - if (!strcasecmp(option,fmt->abbrevs[i].abbreviated) && - (command_line || !fmt->abbrevs[i].commandline_only)) { - if (warn_obsolete && fmt->abbrevs[i].warn) { - log_warn(LD_CONFIG, - "The configuration option '%s' is deprecated; " - "use '%s' instead.", - fmt->abbrevs[i].abbreviated, - fmt->abbrevs[i].full); - } - /* Keep going through the list in case we want to rewrite it more. - * (We could imagine recursing here, but I don't want to get the - * user into an infinite loop if we craft our list wrong.) */ - option = fmt->abbrevs[i].full; - } - } - return option; -} - -/** Helper: allocate a new configuration option mapping 'key' to 'val', - * append it to *lst. */ -void -config_line_append(config_line_t **lst, - const char *key, - const char *val) -{ - config_line_t *newline; - - newline = tor_malloc_zero(sizeof(config_line_t)); - newline->key = tor_strdup(key); - newline->value = tor_strdup(val); - newline->next = NULL; - while (*lst) - lst = &((*lst)->next); - - (*lst) = newline; -} - -/** Return the line in lines whose key is exactly key, or NULL - * if no such key exists. For handling commandline-only options only; other - * options should be looked up in the appropriate data structure. */ -const config_line_t * -config_line_find(const config_line_t *lines, - const char *key) -{ - const config_line_t *cl; - for (cl = lines; cl; cl = cl->next) { - if (!strcmp(cl->key, key)) - return cl; - } - return NULL; -} - -/** Helper: parse the config string and strdup into key/value - * strings. Set *result to the list, or NULL if parsing the string - * failed. Return 0 on success, -1 on failure. Warn and ignore any - * misformatted lines. - * - * If extended is set, then treat keys beginning with / and with + as - * indicating "clear" and "append" respectively. */ -int -config_get_lines(const char *string, config_line_t **result, int extended) -{ - config_line_t *list = NULL, **next; - char *k, *v; - const char *parse_err; - - next = &list; - do { - k = v = NULL; - string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); - if (!string) { - log_warn(LD_CONFIG, "Error while parsing configuration: %s", - parse_err?parse_err:""); - config_free_lines(list); - tor_free(k); - tor_free(v); - return -1; - } - if (k && v) { - unsigned command = CONFIG_LINE_NORMAL; - if (extended) { - if (k[0] == '+') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - command = CONFIG_LINE_APPEND; - } else if (k[0] == '/') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - tor_free(v); - v = tor_strdup(""); - command = CONFIG_LINE_CLEAR; - } - } - /* This list can get long, so we keep a pointer to the end of it - * rather than using config_line_append over and over and getting - * n^2 performance. */ - *next = tor_malloc_zero(sizeof(config_line_t)); - (*next)->key = k; - (*next)->value = v; - (*next)->next = NULL; - (*next)->command = command; - next = &((*next)->next); - } else { - tor_free(k); - tor_free(v); - } - } while (*string); - - *result = list; - return 0; -} - -/** - * Free all the configuration lines on the linked list front. - */ -void -config_free_lines(config_line_t *front) -{ - config_line_t *tmp; - - while (front) { - tmp = front; - front = tmp->next; - - tor_free(tmp->key); - tor_free(tmp->value); - tor_free(tmp); - } -} - -/** As config_find_option, but return a non-const pointer. */ -config_var_t * -config_find_option_mutable(config_format_t *fmt, const char *key) -{ - int i; - size_t keylen = strlen(key); - if (!keylen) - return NULL; /* if they say "--" on the command line, it's not an option */ - /* First, check for an exact (case-insensitive) match */ - for (i=0; fmt->vars[i].name; ++i) { - if (!strcasecmp(key, fmt->vars[i].name)) { - return &fmt->vars[i]; - } - } - /* If none, check for an abbreviated match */ - for (i=0; fmt->vars[i].name; ++i) { - if (!strncasecmp(key, fmt->vars[i].name, keylen)) { - log_warn(LD_CONFIG, "The abbreviation '%s' is deprecated. " - "Please use '%s' instead", - key, fmt->vars[i].name); - return &fmt->vars[i]; - } - } - /* Okay, unrecognized option */ - return NULL; -} - -/** If key is a configuration option, return the corresponding const - * config_var_t. Otherwise, if key is a non-standard abbreviation, - * warn, and return the corresponding const config_var_t. Otherwise return - * NULL. - */ -const config_var_t * -config_find_option(const config_format_t *fmt, const char *key) -{ - return config_find_option_mutable((config_format_t*)fmt, key); -} - -/** Return the number of option entries in fmt. */ -static int -config_count_options(const config_format_t *fmt) -{ - int i; - for (i=0; fmt->vars[i].name; ++i) - ; - return i; -} - -/* - * Functions to assign config options. - */ - -/** c-\>key is known to be a real key. Update options - * with c-\>value and return 0, or return -1 if bad value. - * - * Called from config_assign_line() and option_reset(). - */ -static int -config_assign_value(const config_format_t *fmt, void *options, - config_line_t *c, char **msg) -{ - int i, ok; - const config_var_t *var; - void *lvalue; - int *csv_int; - smartlist_t *csv_str; - - CONFIG_CHECK(fmt, options); - - var = config_find_option(fmt, c->key); - tor_assert(var); - - lvalue = STRUCT_VAR_P(options, var->var_offset); - - switch (var->type) { - - case CONFIG_TYPE_PORT: - if (!strcasecmp(c->value, "auto")) { - *(int *)lvalue = CFG_AUTO_PORT; - break; - } - /* fall through */ - case CONFIG_TYPE_INT: - case CONFIG_TYPE_UINT: - i = (int)tor_parse_long(c->value, 10, - var->type==CONFIG_TYPE_INT ? INT_MIN : 0, - var->type==CONFIG_TYPE_PORT ? 65535 : INT_MAX, - &ok, NULL); - if (!ok) { - tor_asprintf(msg, - "Int keyword '%s %s' is malformed or out of bounds.", - c->key, c->value); - return -1; - } - *(int *)lvalue = i; - break; - - case CONFIG_TYPE_INTERVAL: { - i = config_parse_interval(c->value, &ok); - if (!ok) { - tor_asprintf(msg, - "Interval '%s %s' is malformed or out of bounds.", - c->key, c->value); - return -1; - } - *(int *)lvalue = i; - break; - } - - case CONFIG_TYPE_MSEC_INTERVAL: { - i = config_parse_msec_interval(c->value, &ok); - if (!ok) { - tor_asprintf(msg, - "Msec interval '%s %s' is malformed or out of bounds.", - c->key, c->value); - return -1; - } - *(int *)lvalue = i; - break; - } - - case CONFIG_TYPE_MEMUNIT: { - uint64_t u64 = config_parse_memunit(c->value, &ok); - if (!ok) { - tor_asprintf(msg, - "Value '%s %s' is malformed or out of bounds.", - c->key, c->value); - return -1; - } - *(uint64_t *)lvalue = u64; - break; - } - - case CONFIG_TYPE_BOOL: - i = (int)tor_parse_long(c->value, 10, 0, 1, &ok, NULL); - if (!ok) { - tor_asprintf(msg, - "Boolean '%s %s' expects 0 or 1.", - c->key, c->value); - return -1; - } - *(int *)lvalue = i; - break; - - case CONFIG_TYPE_AUTOBOOL: - if (!strcmp(c->value, "auto")) - *(int *)lvalue = -1; - else if (!strcmp(c->value, "0")) - *(int *)lvalue = 0; - else if (!strcmp(c->value, "1")) - *(int *)lvalue = 1; - else { - tor_asprintf(msg, "Boolean '%s %s' expects 0, 1, or 'auto'.", - c->key, c->value); - return -1; - } - break; - - case CONFIG_TYPE_STRING: - case CONFIG_TYPE_FILENAME: - tor_free(*(char **)lvalue); - *(char **)lvalue = tor_strdup(c->value); - break; - - case CONFIG_TYPE_DOUBLE: - *(double *)lvalue = atof(c->value); - break; - - case CONFIG_TYPE_ISOTIME: - if (parse_iso_time(c->value, (time_t *)lvalue)) { - tor_asprintf(msg, - "Invalid time '%s' for keyword '%s'", c->value, c->key); - return -1; - } - break; - - case CONFIG_TYPE_ROUTERSET: - if (*(routerset_t**)lvalue) { - routerset_free(*(routerset_t**)lvalue); - } - *(routerset_t**)lvalue = routerset_new(); - if (routerset_parse(*(routerset_t**)lvalue, c->value, c->key)<0) { - tor_asprintf(msg, "Invalid exit list '%s' for option '%s'", - c->value, c->key); - return -1; - } - break; - - case CONFIG_TYPE_CSV: - if (*(smartlist_t**)lvalue) { - SMARTLIST_FOREACH(*(smartlist_t**)lvalue, char *, cp, tor_free(cp)); - smartlist_clear(*(smartlist_t**)lvalue); - } else { - *(smartlist_t**)lvalue = smartlist_new(); - } - - smartlist_split_string(*(smartlist_t**)lvalue, c->value, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - break; - - case CONFIG_TYPE_CSV_INTERVAL: - if (*(smartlist_t**)lvalue) { - SMARTLIST_FOREACH(*(smartlist_t**)lvalue, int *, cp, tor_free(cp)); - smartlist_clear(*(smartlist_t**)lvalue); - } else { - *(smartlist_t**)lvalue = smartlist_new(); - } - csv_str = smartlist_new(); - smartlist_split_string(csv_str, c->value, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(csv_str, char *, str) - { - i = config_parse_interval(str, &ok); - if (!ok) { - tor_asprintf(msg, - "Interval in '%s %s' is malformed or out of bounds.", - c->key, c->value); - SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp)); - smartlist_free(csv_str); - return -1; - } - csv_int = tor_malloc_zero(sizeof(int)); - *csv_int = i; - smartlist_add(*(smartlist_t**)lvalue, csv_int); - } - SMARTLIST_FOREACH_END(str); - SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp)); - smartlist_free(csv_str); - break; - - case CONFIG_TYPE_LINELIST: - case CONFIG_TYPE_LINELIST_S: - { - config_line_t *lastval = *(config_line_t**)lvalue; - if (lastval && lastval->fragile) { - if (c->command != CONFIG_LINE_APPEND) { - config_free_lines(lastval); - *(config_line_t**)lvalue = NULL; - } else { - lastval->fragile = 0; - } - } - - config_line_append((config_line_t**)lvalue, c->key, c->value); - } - break; - case CONFIG_TYPE_OBSOLETE: - log_warn(LD_CONFIG, "Skipping obsolete configuration option '%s'", c->key); - break; - case CONFIG_TYPE_LINELIST_V: - tor_asprintf(msg, - "You may not provide a value for virtual option '%s'", c->key); - return -1; - default: - tor_assert(0); - break; - } - return 0; -} - -/** Mark every linelist in options "fragile", so that fresh assignments - * to it will replace old ones. */ -static void -config_mark_lists_fragile(const config_format_t *fmt, void *options) -{ - int i; - tor_assert(fmt); - tor_assert(options); - - for (i = 0; fmt->vars[i].name; ++i) { - const config_var_t *var = &fmt->vars[i]; - config_line_t *list; - if (var->type != CONFIG_TYPE_LINELIST && - var->type != CONFIG_TYPE_LINELIST_V) - continue; - - list = *(config_line_t **)STRUCT_VAR_P(options, var->var_offset); - if (list) - list->fragile = 1; - } -} - -/** If c is a syntactically valid configuration line, update - * options with its value and return 0. Otherwise return -1 for bad - * key, -2 for bad value. - * - * If clear_first is set, clear the value first. Then if - * use_defaults is set, set the value to the default. - * - * Called from config_assign(). - */ -static int -config_assign_line(const config_format_t *fmt, void *options, - config_line_t *c, int use_defaults, - int clear_first, bitarray_t *options_seen, char **msg) -{ - const config_var_t *var; - - CONFIG_CHECK(fmt, options); - - var = config_find_option(fmt, c->key); - if (!var) { - if (fmt->extra) { - void *lvalue = STRUCT_VAR_P(options, fmt->extra->var_offset); - log_info(LD_CONFIG, - "Found unrecognized option '%s'; saving it.", c->key); - config_line_append((config_line_t**)lvalue, c->key, c->value); - return 0; - } else { - tor_asprintf(msg, - "Unknown option '%s'. Failing.", c->key); - return -1; - } - } - - /* Put keyword into canonical case. */ - if (strcmp(var->name, c->key)) { - tor_free(c->key); - c->key = tor_strdup(var->name); - } - - if (!strlen(c->value)) { - /* reset or clear it, then return */ - if (!clear_first) { - if ((var->type == CONFIG_TYPE_LINELIST || - var->type == CONFIG_TYPE_LINELIST_S) && - c->command != CONFIG_LINE_CLEAR) { - /* We got an empty linelist from the torrc or command line. - As a special case, call this an error. Warn and ignore. */ - log_warn(LD_CONFIG, - "Linelist option '%s' has no value. Skipping.", c->key); - } else { /* not already cleared */ - config_reset(fmt, options, var, use_defaults); - } - } - return 0; - } else if (c->command == CONFIG_LINE_CLEAR && !clear_first) { - config_reset(fmt, options, var, use_defaults); - } - - if (options_seen && (var->type != CONFIG_TYPE_LINELIST && - var->type != CONFIG_TYPE_LINELIST_S)) { - /* We're tracking which options we've seen, and this option is not - * supposed to occur more than once. */ - int var_index = (int)(var - fmt->vars); - if (bitarray_is_set(options_seen, var_index)) { - log_warn(LD_CONFIG, "Option '%s' used more than once; all but the last " - "value will be ignored.", var->name); - } - bitarray_set(options_seen, var_index); - } - - if (config_assign_value(fmt, options, c, msg) < 0) - return -2; - return 0; -} - -/** Restore the option named key in options to its default value. - * Called from config_assign(). */ -static void -config_reset_line(const config_format_t *fmt, void *options, - const char *key, int use_defaults) -{ - const config_var_t *var; - - CONFIG_CHECK(fmt, options); - - var = config_find_option(fmt, key); - if (!var) - return; /* give error on next pass. */ - - config_reset(fmt, options, var, use_defaults); -} - -/** Return true iff value needs to be quoted and escaped to be used in - * a configuration file. */ -static int -config_value_needs_escape(const char *value) -{ - if (*value == '\"') - return 1; - while (*value) { - switch (*value) - { - case '\r': - case '\n': - case '#': - /* Note: quotes and backspaces need special handling when we are using - * quotes, not otherwise, so they don't trigger escaping on their - * own. */ - return 1; - default: - if (!TOR_ISPRINT(*value)) - return 1; - } - ++value; - } - return 0; -} - -/** Return a newly allocated deep copy of the lines in inp. */ -config_line_t * -config_lines_dup(const config_line_t *inp) -{ - config_line_t *result = NULL; - config_line_t **next_out = &result; - while (inp) { - *next_out = tor_malloc_zero(sizeof(config_line_t)); - (*next_out)->key = tor_strdup(inp->key); - (*next_out)->value = tor_strdup(inp->value); - inp = inp->next; - next_out = &((*next_out)->next); - } - (*next_out) = NULL; - return result; -} - -/** Return newly allocated line or lines corresponding to key in the - * configuration options. If escape_val is true and a - * value needs to be quoted before it's put in a config file, quote and - * escape that value. Return NULL if no such key exists. */ -config_line_t * -config_get_assigned_option(const config_format_t *fmt, const void *options, - const char *key, int escape_val) -{ - const config_var_t *var; - const void *value; - config_line_t *result; - smartlist_t *csv_str; - tor_assert(options && key); - - CONFIG_CHECK(fmt, options); - - var = config_find_option(fmt, key); - if (!var) { - log_warn(LD_CONFIG, "Unknown option '%s'. Failing.", key); - return NULL; - } - value = STRUCT_VAR_P(options, var->var_offset); - - result = tor_malloc_zero(sizeof(config_line_t)); - result->key = tor_strdup(var->name); - switch (var->type) - { - case CONFIG_TYPE_STRING: - case CONFIG_TYPE_FILENAME: - if (*(char**)value) { - result->value = tor_strdup(*(char**)value); - } else { - tor_free(result->key); - tor_free(result); - return NULL; - } - break; - case CONFIG_TYPE_ISOTIME: - if (*(time_t*)value) { - result->value = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(result->value, *(time_t*)value); - } else { - tor_free(result->key); - tor_free(result); - } - escape_val = 0; /* Can't need escape. */ - break; - case CONFIG_TYPE_PORT: - if (*(int*)value == CFG_AUTO_PORT) { - result->value = tor_strdup("auto"); - escape_val = 0; - break; - } - /* fall through */ - case CONFIG_TYPE_INTERVAL: - case CONFIG_TYPE_MSEC_INTERVAL: - case CONFIG_TYPE_UINT: - case CONFIG_TYPE_INT: - /* This means every or_options_t uint or bool element - * needs to be an int. Not, say, a uint16_t or char. */ - tor_asprintf(&result->value, "%d", *(int*)value); - escape_val = 0; /* Can't need escape. */ - break; - case CONFIG_TYPE_MEMUNIT: - tor_asprintf(&result->value, U64_FORMAT, - U64_PRINTF_ARG(*(uint64_t*)value)); - escape_val = 0; /* Can't need escape. */ - break; - case CONFIG_TYPE_DOUBLE: - tor_asprintf(&result->value, "%f", *(double*)value); - escape_val = 0; /* Can't need escape. */ - break; - - case CONFIG_TYPE_AUTOBOOL: - if (*(int*)value == -1) { - result->value = tor_strdup("auto"); - escape_val = 0; - break; - } - /* fall through */ - case CONFIG_TYPE_BOOL: - result->value = tor_strdup(*(int*)value ? "1" : "0"); - escape_val = 0; /* Can't need escape. */ - break; - case CONFIG_TYPE_ROUTERSET: - result->value = routerset_to_string(*(routerset_t**)value); - break; - case CONFIG_TYPE_CSV: - if (*(smartlist_t**)value) - result->value = - smartlist_join_strings(*(smartlist_t**)value, ",", 0, NULL); - else - result->value = tor_strdup(""); - break; - case CONFIG_TYPE_CSV_INTERVAL: - if (*(smartlist_t**)value) { - csv_str = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(*(smartlist_t**)value, int *, i) - { - smartlist_add_asprintf(csv_str, "%d", *i); - } - SMARTLIST_FOREACH_END(i); - result->value = smartlist_join_strings(csv_str, ",", 0, NULL); - SMARTLIST_FOREACH(csv_str, char *, cp, tor_free(cp)); - smartlist_free(csv_str); - } else - result->value = tor_strdup(""); - break; - case CONFIG_TYPE_OBSOLETE: - log_fn(LOG_INFO, LD_CONFIG, - "You asked me for the value of an obsolete config option '%s'.", - key); - tor_free(result->key); - tor_free(result); - return NULL; - case CONFIG_TYPE_LINELIST_S: - log_warn(LD_CONFIG, - "Can't return context-sensitive '%s' on its own", key); - tor_free(result->key); - tor_free(result); - return NULL; - case CONFIG_TYPE_LINELIST: - case CONFIG_TYPE_LINELIST_V: - tor_free(result->key); - tor_free(result); - result = config_lines_dup(*(const config_line_t**)value); - break; - default: - tor_free(result->key); - tor_free(result); - log_warn(LD_BUG,"Unknown type %d for known key '%s'", - var->type, key); - return NULL; - } - - if (escape_val) { - config_line_t *line; - for (line = result; line; line = line->next) { - if (line->value && config_value_needs_escape(line->value)) { - char *newval = esc_for_log(line->value); - tor_free(line->value); - line->value = newval; - } - } - } - - return result; -} -/** Iterate through the linked list of requested options list. - * For each item, convert as appropriate and assign to options. - * If an item is unrecognized, set *msg and return -1 immediately, - * else return 0 for success. - * - * If clear_first, interpret config options as replacing (not - * extending) their previous values. If clear_first is set, - * then use_defaults to decide if you set to defaults after - * clearing, or make the value 0 or NULL. - * - * Here are the use cases: - * 1. A non-empty AllowInvalid line in your torrc. Appends to current - * if linelist, replaces current if csv. - * 2. An empty AllowInvalid line in your torrc. Should clear it. - * 3. "RESETCONF AllowInvalid" sets it to default. - * 4. "SETCONF AllowInvalid" makes it NULL. - * 5. "SETCONF AllowInvalid=foo" clears it and sets it to "foo". - * - * Use_defaults Clear_first - * 0 0 "append" - * 1 0 undefined, don't use - * 0 1 "set to null first" - * 1 1 "set to defaults first" - * Return 0 on success, -1 on bad key, -2 on bad value. - * - * As an additional special case, if a LINELIST config option has - * no value and clear_first is 0, then warn and ignore it. - */ - -/* -There are three call cases for config_assign() currently. - -Case one: Torrc entry -options_init_from_torrc() calls config_assign(0, 0) - calls config_assign_line(0, 0). - if value is empty, calls config_reset(0) and returns. - calls config_assign_value(), appends. - -Case two: setconf -options_trial_assign() calls config_assign(0, 1) - calls config_reset_line(0) - calls config_reset(0) - calls option_clear(). - calls config_assign_line(0, 1). - if value is empty, returns. - calls config_assign_value(), appends. - -Case three: resetconf -options_trial_assign() calls config_assign(1, 1) - calls config_reset_line(1) - calls config_reset(1) - calls option_clear(). - calls config_assign_value(default) - calls config_assign_line(1, 1). - returns. -*/ -int -config_assign(const config_format_t *fmt, void *options, config_line_t *list, - int use_defaults, int clear_first, char **msg) -{ - config_line_t *p; - bitarray_t *options_seen; - const int n_options = config_count_options(fmt); - - CONFIG_CHECK(fmt, options); - - /* pass 1: normalize keys */ - for (p = list; p; p = p->next) { - const char *full = config_expand_abbrev(fmt, p->key, 0, 1); - if (strcmp(full,p->key)) { - tor_free(p->key); - p->key = tor_strdup(full); - } - } - - /* pass 2: if we're reading from a resetting source, clear all - * mentioned config options, and maybe set to their defaults. */ - if (clear_first) { - for (p = list; p; p = p->next) - config_reset_line(fmt, options, p->key, use_defaults); - } - - options_seen = bitarray_init_zero(n_options); - /* pass 3: assign. */ - while (list) { - int r; - if ((r=config_assign_line(fmt, options, list, use_defaults, - clear_first, options_seen, msg))) { - bitarray_free(options_seen); - return r; - } - list = list->next; - } - bitarray_free(options_seen); - - /** Now we're done assigning a group of options to the configuration. - * Subsequent group assignments should _replace_ linelists, not extend - * them. */ - config_mark_lists_fragile(fmt, options); - - return 0; -} - -/** Reset config option var to 0, 0.0, NULL, or the equivalent. - * Called from config_reset() and config_free(). */ -static void -config_clear(const config_format_t *fmt, void *options, - const config_var_t *var) -{ - void *lvalue = STRUCT_VAR_P(options, var->var_offset); - (void)fmt; /* unused */ - switch (var->type) { - case CONFIG_TYPE_STRING: - case CONFIG_TYPE_FILENAME: - tor_free(*(char**)lvalue); - break; - case CONFIG_TYPE_DOUBLE: - *(double*)lvalue = 0.0; - break; - case CONFIG_TYPE_ISOTIME: - *(time_t*)lvalue = 0; - break; - case CONFIG_TYPE_INTERVAL: - case CONFIG_TYPE_MSEC_INTERVAL: - case CONFIG_TYPE_UINT: - case CONFIG_TYPE_INT: - case CONFIG_TYPE_PORT: - case CONFIG_TYPE_BOOL: - *(int*)lvalue = 0; - break; - case CONFIG_TYPE_AUTOBOOL: - *(int*)lvalue = -1; - break; - case CONFIG_TYPE_MEMUNIT: - *(uint64_t*)lvalue = 0; - break; - case CONFIG_TYPE_ROUTERSET: - if (*(routerset_t**)lvalue) { - routerset_free(*(routerset_t**)lvalue); - *(routerset_t**)lvalue = NULL; - } - break; - case CONFIG_TYPE_CSV: - if (*(smartlist_t**)lvalue) { - SMARTLIST_FOREACH(*(smartlist_t **)lvalue, char *, cp, tor_free(cp)); - smartlist_free(*(smartlist_t **)lvalue); - *(smartlist_t **)lvalue = NULL; - } - break; - case CONFIG_TYPE_CSV_INTERVAL: - if (*(smartlist_t**)lvalue) { - SMARTLIST_FOREACH(*(smartlist_t **)lvalue, int *, cp, tor_free(cp)); - smartlist_free(*(smartlist_t **)lvalue); - *(smartlist_t **)lvalue = NULL; - } - break; - case CONFIG_TYPE_LINELIST: - case CONFIG_TYPE_LINELIST_S: - config_free_lines(*(config_line_t **)lvalue); - *(config_line_t **)lvalue = NULL; - break; - case CONFIG_TYPE_LINELIST_V: - /* handled by linelist_s. */ - break; - case CONFIG_TYPE_OBSOLETE: - break; - } -} - -/** Clear the option indexed by var in options. Then if - * use_defaults, set it to its default value. - * Called by config_init() and option_reset_line() and option_assign_line(). */ -static void -config_reset(const config_format_t *fmt, void *options, - const config_var_t *var, int use_defaults) -{ - config_line_t *c; - char *msg = NULL; - CONFIG_CHECK(fmt, options); - config_clear(fmt, options, var); /* clear it first */ - if (!use_defaults) - return; /* all done */ - if (var->initvalue) { - c = tor_malloc_zero(sizeof(config_line_t)); - c->key = tor_strdup(var->name); - c->value = tor_strdup(var->initvalue); - if (config_assign_value(fmt, options, c, &msg) < 0) { - log_warn(LD_BUG, "Failed to assign default: %s", msg); - tor_free(msg); /* if this happens it's a bug */ - } - config_free_lines(c); - } -} - -/** Release storage held by options. */ -void -config_free(const config_format_t *fmt, void *options) -{ - int i; - - if (!options) - return; - - tor_assert(fmt); - - for (i=0; fmt->vars[i].name; ++i) - config_clear(fmt, options, &(fmt->vars[i])); - if (fmt->extra) { - config_line_t **linep = STRUCT_VAR_P(options, fmt->extra->var_offset); - config_free_lines(*linep); - *linep = NULL; - } - tor_free(options); -} - -/** Return true iff a and b contain identical keys and values in identical - * order. */ -int -config_lines_eq(config_line_t *a, config_line_t *b) -{ - while (a && b) { - if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) - return 0; - a = a->next; - b = b->next; - } - if (a || b) - return 0; - return 1; -} - -/** Return the number of lines in a whose key is key. */ -int -config_count_key(const config_line_t *a, const char *key) -{ - int n = 0; - while (a) { - if (!strcasecmp(a->key, key)) { - ++n; - } - a = a->next; - } - return n; -} - -/** Return true iff the option name has the same value in o1 - * and o2. Must not be called for LINELIST_S or OBSOLETE options. - */ -int -config_is_same(const config_format_t *fmt, - const void *o1, const void *o2, - const char *name) -{ - config_line_t *c1, *c2; - int r = 1; - CONFIG_CHECK(fmt, o1); - CONFIG_CHECK(fmt, o2); - - c1 = config_get_assigned_option(fmt, o1, name, 0); - c2 = config_get_assigned_option(fmt, o2, name, 0); - r = config_lines_eq(c1, c2); - config_free_lines(c1); - config_free_lines(c2); - return r; -} - -/** Copy storage held by old into a new or_options_t and return it. */ -void * -config_dup(const config_format_t *fmt, const void *old) -{ - void *newopts; - int i; - config_line_t *line; - - newopts = config_new(fmt); - for (i=0; fmt->vars[i].name; ++i) { - if (fmt->vars[i].type == CONFIG_TYPE_LINELIST_S) - continue; - if (fmt->vars[i].type == CONFIG_TYPE_OBSOLETE) - continue; - line = config_get_assigned_option(fmt, old, fmt->vars[i].name, 0); - if (line) { - char *msg = NULL; - if (config_assign(fmt, newopts, line, 0, 0, &msg) < 0) { - log_err(LD_BUG, "config_get_assigned_option() generated " - "something we couldn't config_assign(): %s", msg); - tor_free(msg); - tor_assert(0); - } - } - config_free_lines(line); - } - return newopts; -} -/** Set all vars in the configuration object options to their default - * values. */ -void -config_init(const config_format_t *fmt, void *options) -{ - int i; - const config_var_t *var; - CONFIG_CHECK(fmt, options); - - for (i=0; fmt->vars[i].name; ++i) { - var = &fmt->vars[i]; - if (!var->initvalue) - continue; /* defaults to NULL or 0 */ - config_reset(fmt, options, var, 1); - } -} - -/** Allocate and return a new string holding the written-out values of the vars - * in 'options'. If 'minimal', do not write out any default-valued vars. - * Else, if comment_defaults, write default values as comments. - */ -char * -config_dump(const config_format_t *fmt, const void *default_options, - const void *options, int minimal, - int comment_defaults) -{ - smartlist_t *elements; - const void *defaults = default_options; - void *defaults_tmp = NULL; - config_line_t *line, *assigned; - char *result; - int i; - char *msg = NULL; - - if (defaults == NULL) { - defaults = defaults_tmp = config_new(fmt); - config_init(fmt, defaults_tmp); - } - - /* XXX use a 1 here so we don't add a new log line while dumping */ - if (default_options == NULL) { - if (fmt->validate_fn(NULL, defaults_tmp, defaults_tmp, 1, &msg) < 0) { - log_err(LD_BUG, "Failed to validate default config: %s", msg); - tor_free(msg); - tor_assert(0); - } - } - - elements = smartlist_new(); - for (i=0; fmt->vars[i].name; ++i) { - int comment_option = 0; - if (fmt->vars[i].type == CONFIG_TYPE_OBSOLETE || - fmt->vars[i].type == CONFIG_TYPE_LINELIST_S) - continue; - /* Don't save 'hidden' control variables. */ - if (!strcmpstart(fmt->vars[i].name, "__")) - continue; - if (minimal && config_is_same(fmt, options, defaults, fmt->vars[i].name)) - continue; - else if (comment_defaults && - config_is_same(fmt, options, defaults, fmt->vars[i].name)) - comment_option = 1; - - line = assigned = - config_get_assigned_option(fmt, options, fmt->vars[i].name, 1); - - for (; line; line = line->next) { - smartlist_add_asprintf(elements, "%s%s %s\n", - comment_option ? "# " : "", - line->key, line->value); - } - config_free_lines(assigned); - } - - if (fmt->extra) { - line = *(config_line_t**)STRUCT_VAR_P(options, fmt->extra->var_offset); - for (; line; line = line->next) { - smartlist_add_asprintf(elements, "%s %s\n", line->key, line->value); - } - } - - result = smartlist_join_strings(elements, "", 0, NULL); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - if (defaults_tmp) - config_free(fmt, defaults_tmp); - return result; -} - -/** Mapping from a unit name to a multiplier for converting that unit into a - * base unit. Used by config_parse_unit. */ -struct unit_table_t { - const char *unit; /**< The name of the unit */ - uint64_t multiplier; /**< How many of the base unit appear in this unit */ -}; - -/** Table to map the names of memory units to the number of bytes they - * contain. */ -static struct unit_table_t memory_units[] = { - { "", 1 }, - { "b", 1<< 0 }, - { "byte", 1<< 0 }, - { "bytes", 1<< 0 }, - { "kb", 1<<10 }, - { "kbyte", 1<<10 }, - { "kbytes", 1<<10 }, - { "kilobyte", 1<<10 }, - { "kilobytes", 1<<10 }, - { "kilobits", 1<<7 }, - { "kilobit", 1<<7 }, - { "kbits", 1<<7 }, - { "kbit", 1<<7 }, - { "m", 1<<20 }, - { "mb", 1<<20 }, - { "mbyte", 1<<20 }, - { "mbytes", 1<<20 }, - { "megabyte", 1<<20 }, - { "megabytes", 1<<20 }, - { "megabits", 1<<17 }, - { "megabit", 1<<17 }, - { "mbits", 1<<17 }, - { "mbit", 1<<17 }, - { "gb", 1<<30 }, - { "gbyte", 1<<30 }, - { "gbytes", 1<<30 }, - { "gigabyte", 1<<30 }, - { "gigabytes", 1<<30 }, - { "gigabits", 1<<27 }, - { "gigabit", 1<<27 }, - { "gbits", 1<<27 }, - { "gbit", 1<<27 }, - { "tb", U64_LITERAL(1)<<40 }, - { "terabyte", U64_LITERAL(1)<<40 }, - { "terabytes", U64_LITERAL(1)<<40 }, - { "terabits", U64_LITERAL(1)<<37 }, - { "terabit", U64_LITERAL(1)<<37 }, - { "tbits", U64_LITERAL(1)<<37 }, - { "tbit", U64_LITERAL(1)<<37 }, - { NULL, 0 }, -}; - -/** Table to map the names of time units to the number of seconds they - * contain. */ -static struct unit_table_t time_units[] = { - { "", 1 }, - { "second", 1 }, - { "seconds", 1 }, - { "minute", 60 }, - { "minutes", 60 }, - { "hour", 60*60 }, - { "hours", 60*60 }, - { "day", 24*60*60 }, - { "days", 24*60*60 }, - { "week", 7*24*60*60 }, - { "weeks", 7*24*60*60 }, - { "month", 2629728, }, /* about 30.437 days */ - { "months", 2629728, }, - { NULL, 0 }, -}; - -/** Table to map the names of time units to the number of milliseconds - * they contain. */ -static struct unit_table_t time_msec_units[] = { - { "", 1 }, - { "msec", 1 }, - { "millisecond", 1 }, - { "milliseconds", 1 }, - { "second", 1000 }, - { "seconds", 1000 }, - { "minute", 60*1000 }, - { "minutes", 60*1000 }, - { "hour", 60*60*1000 }, - { "hours", 60*60*1000 }, - { "day", 24*60*60*1000 }, - { "days", 24*60*60*1000 }, - { "week", 7*24*60*60*1000 }, - { "weeks", 7*24*60*60*1000 }, - { NULL, 0 }, -}; - -/** Parse a string val containing a number, zero or more - * spaces, and an optional unit string. If the unit appears in the - * table u, then multiply the number by the unit multiplier. - * On success, set *ok to 1 and return this product. - * Otherwise, set *ok to 0. - */ -static uint64_t -config_parse_units(const char *val, struct unit_table_t *u, int *ok) -{ - uint64_t v = 0; - double d = 0; - int use_float = 0; - char *cp; - - tor_assert(ok); - - v = tor_parse_uint64(val, 10, 0, UINT64_MAX, ok, &cp); - if (!*ok || (cp && *cp == '.')) { - d = tor_parse_double(val, 0, UINT64_MAX, ok, &cp); - if (!*ok) - goto done; - use_float = 1; - } - - if (!cp) { - *ok = 1; - v = use_float ? DBL_TO_U64(d) : v; - goto done; - } - - cp = (char*) eat_whitespace(cp); - - for ( ;u->unit;++u) { - if (!strcasecmp(u->unit, cp)) { - if (use_float) - v = u->multiplier * d; - else - v *= u->multiplier; - *ok = 1; - goto done; - } - } - log_warn(LD_CONFIG, "Unknown unit '%s'.", cp); - *ok = 0; - done: - - if (*ok) - return v; - else - return 0; -} - -/** Parse a string in the format "number unit", where unit is a unit of - * information (byte, KB, M, etc). On success, set *ok to true - * and return the number of bytes specified. Otherwise, set - * *ok to false and return 0. */ -static uint64_t -config_parse_memunit(const char *s, int *ok) -{ - uint64_t u = config_parse_units(s, memory_units, ok); - return u; -} - -/** Parse a string in the format "number unit", where unit is a unit of - * time in milliseconds. On success, set *ok to true and return - * the number of milliseconds in the provided interval. Otherwise, set - * *ok to 0 and return -1. */ -static int -config_parse_msec_interval(const char *s, int *ok) -{ - uint64_t r; - r = config_parse_units(s, time_msec_units, ok); - if (!ok) - return -1; - if (r > INT_MAX) { - log_warn(LD_CONFIG, "Msec interval '%s' is too long", s); - *ok = 0; - return -1; - } - return (int)r; -} - -/** Parse a string in the format "number unit", where unit is a unit of time. - * On success, set *ok to true and return the number of seconds in - * the provided interval. Otherwise, set *ok to 0 and return -1. - */ -static int -config_parse_interval(const char *s, int *ok) -{ - uint64_t r; - r = config_parse_units(s, time_units, ok); - if (!ok) - return -1; - if (r > INT_MAX) { - log_warn(LD_CONFIG, "Interval '%s' is too long", s); - *ok = 0; - return -1; - } - return (int)r; -} - diff --git a/src/tor/confparse.h b/src/tor/confparse.h deleted file mode 100644 index 2cd6c49a2..000000000 --- a/src/tor/confparse.h +++ /dev/null @@ -1,137 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONFPARSE_H -#define TOR_CONFPARSE_H - -/** Enumeration of types which option values can take */ -typedef enum config_type_t { - CONFIG_TYPE_STRING = 0, /**< An arbitrary string. */ - CONFIG_TYPE_FILENAME, /**< A filename: some prefixes get expanded. */ - CONFIG_TYPE_UINT, /**< A non-negative integer less than MAX_INT */ - CONFIG_TYPE_INT, /**< Any integer. */ - CONFIG_TYPE_PORT, /**< A port from 1...65535, 0 for "not set", or - * "auto". */ - CONFIG_TYPE_INTERVAL, /**< A number of seconds, with optional units*/ - CONFIG_TYPE_MSEC_INTERVAL,/**< A number of milliseconds, with optional - * units */ - CONFIG_TYPE_MEMUNIT, /**< A number of bytes, with optional units*/ - CONFIG_TYPE_DOUBLE, /**< A floating-point value */ - CONFIG_TYPE_BOOL, /**< A boolean value, expressed as 0 or 1. */ - CONFIG_TYPE_AUTOBOOL, /**< A boolean+auto value, expressed 0 for false, - * 1 for true, and -1 for auto */ - CONFIG_TYPE_ISOTIME, /**< An ISO-formatted time relative to UTC. */ - CONFIG_TYPE_CSV, /**< A list of strings, separated by commas and - * optional whitespace. */ - CONFIG_TYPE_CSV_INTERVAL, /**< A list of strings, separated by commas and - * optional whitespace, representing intervals in - * seconds, with optional units */ - CONFIG_TYPE_LINELIST, /**< Uninterpreted config lines */ - CONFIG_TYPE_LINELIST_S, /**< Uninterpreted, context-sensitive config lines, - * mixed with other keywords. */ - CONFIG_TYPE_LINELIST_V, /**< Catch-all "virtual" option to summarize - * context-sensitive config lines when fetching. - */ - CONFIG_TYPE_ROUTERSET, /**< A list of router names, addrs, and fps, - * parsed into a routerset_t. */ - CONFIG_TYPE_OBSOLETE, /**< Obsolete (ignored) option. */ -} config_type_t; - -/** An abbreviation for a configuration option allowed on the command line. */ -typedef struct config_abbrev_t { - const char *abbreviated; - const char *full; - int commandline_only; - int warn; -} config_abbrev_t; - -/* Handy macro for declaring "In the config file or on the command line, - * you can abbreviate toks as tok". */ -#define PLURAL(tok) { #tok, #tok "s", 0, 0 } - -/** A variable allowed in the configuration file or on the command line. */ -typedef struct config_var_t { - const char *name; /**< The full keyword (case insensitive). */ - config_type_t type; /**< How to interpret the type and turn it into a - * value. */ - off_t var_offset; /**< Offset of the corresponding member of or_options_t. */ - const char *initvalue; /**< String (or null) describing initial value. */ -} config_var_t; - -/** Represents an English description of a configuration variable; used when - * generating configuration file comments. */ -typedef struct config_var_description_t { - const char *name; - const char *description; -} config_var_description_t; - -/** Type of a callback to validate whether a given configuration is - * well-formed and consistent. See options_trial_assign() for documentation - * of arguments. */ -typedef int (*validate_fn_t)(void*,void*,void*,int,char**); - -/** Information on the keys, value types, key-to-struct-member mappings, - * variable descriptions, validation functions, and abbreviations for a - * configuration or storage format. */ -typedef struct config_format_t { - size_t size; /**< Size of the struct that everything gets parsed into. */ - uint32_t magic; /**< Required 'magic value' to make sure we have a struct - * of the right type. */ - off_t magic_offset; /**< Offset of the magic value within the struct. */ - config_abbrev_t *abbrevs; /**< List of abbreviations that we expand when - * parsing this format. */ - config_var_t *vars; /**< List of variables we recognize, their default - * values, and where we stick them in the structure. */ - validate_fn_t validate_fn; /**< Function to validate config. */ - /** If present, extra is a LINELIST variable for unrecognized - * lines. Otherwise, unrecognized lines are an error. */ - config_var_t *extra; -} config_format_t; - -/** Macro: assert that cfg has the right magic field for format - * fmt. */ -#define CONFIG_CHECK(fmt, cfg) STMT_BEGIN \ - tor_assert(fmt && cfg); \ - tor_assert((fmt)->magic == \ - *(uint32_t*)STRUCT_VAR_P(cfg,fmt->magic_offset)); \ - STMT_END - -void *config_new(const config_format_t *fmt); -void config_line_append(config_line_t **lst, - const char *key, const char *val); -config_line_t *config_lines_dup(const config_line_t *inp); -const config_line_t *config_line_find(const config_line_t *lines, - const char *key); -void config_free(const config_format_t *fmt, void *options); -int config_lines_eq(config_line_t *a, config_line_t *b); -int config_count_key(const config_line_t *a, const char *key); -config_line_t *config_get_assigned_option(const config_format_t *fmt, - const void *options, const char *key, - int escape_val); -int config_is_same(const config_format_t *fmt, - const void *o1, const void *o2, - const char *name); -void config_init(const config_format_t *fmt, void *options); -void *config_dup(const config_format_t *fmt, const void *old); -char *config_dump(const config_format_t *fmt, const void *default_options, - const void *options, int minimal, - int comment_defaults); -int config_assign(const config_format_t *fmt, void *options, - config_line_t *list, - int use_defaults, int clear_first, char **msg); -config_var_t *config_find_option_mutable(config_format_t *fmt, - const char *key); -const config_var_t *config_find_option(const config_format_t *fmt, - const char *key); - -int config_get_lines(const char *string, config_line_t **result, int extended); -void config_free_lines(config_line_t *front); -const char *config_expand_abbrev(const config_format_t *fmt, - const char *option, - int command_line, int warn_obsolete); - -#endif - diff --git a/src/tor/connection.c b/src/tor/connection.c deleted file mode 100644 index ebf679ede..000000000 --- a/src/tor/connection.c +++ /dev/null @@ -1,4850 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection.c - * \brief General high-level functions to handle reading and writing - * on connections. - **/ - -#define CONNECTION_PRIVATE -#include "or.h" -#include "buffers.h" -/* - * Define this so we get channel internal functions, since we're implementing - * part of a subclass (channel_tls_t). - */ -#define TOR_CHANNEL_INTERNAL_ -#define CONNECTION_PRIVATE -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "cpuworker.h" -#include "directory.h" -#include "dirserv.h" -#include "dns.h" -#include "dnsserv.h" -#include "entrynodes.h" -#include "ext_orport.h" -#include "geoip.h" -#include "onion_main.h" -#include "policies.h" -#include "reasons.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rephist.h" -#include "router.h" -#include "transports.h" -#include "routerparse.h" -#include "transports.h" - -#ifdef USE_BUFFEREVENTS -#include -#endif - -#ifdef HAVE_PWD_H -#include -#endif - -static connection_t *connection_listener_new( - const struct sockaddr *listensockaddr, - socklen_t listensocklen, int type, - const char *address, - const port_cfg_t *portcfg); -static void connection_init(time_t now, connection_t *conn, int type, - int socket_family); -static int connection_init_accepted_conn(connection_t *conn, - const listener_connection_t *listener); -static int connection_handle_listener_read(connection_t *conn, int new_type); -#ifndef USE_BUFFEREVENTS -static int connection_bucket_should_increase(int bucket, - or_connection_t *conn); -#endif -static int connection_finished_flushing(connection_t *conn); -static int connection_flushed_some(connection_t *conn); -static int connection_finished_connecting(connection_t *conn); -static int connection_reached_eof(connection_t *conn); -static int connection_read_to_buf(connection_t *conn, ssize_t *max_to_read, - int *socket_error); -static int connection_process_inbuf(connection_t *conn, int package_partial); -static void client_check_address_changed(tor_socket_t sock); -static void set_constrained_socket_buffers(tor_socket_t sock, int size); - -static const char *connection_proxy_state_to_string(int state); -static int connection_read_https_proxy_response(connection_t *conn); -static void connection_send_socks5_connect(connection_t *conn); -static const char *proxy_type_to_string(int proxy_type); -static int get_proxy_type(void); - -/** The last addresses that our network interface seemed to have been - * binding to. We use this as one way to detect when our IP changes. - * - * XXX024 We should really use the entire list of interfaces here. - **/ -static tor_addr_t *last_interface_ipv4 = NULL; -/* DOCDOC last_interface_ipv6 */ -static tor_addr_t *last_interface_ipv6 = NULL; -/** A list of tor_addr_t for addresses we've used in outgoing connections. - * Used to detect IP address changes. */ -static smartlist_t *outgoing_addrs = NULL; - -#define CASE_ANY_LISTENER_TYPE \ - case CONN_TYPE_OR_LISTENER: \ - case CONN_TYPE_EXT_OR_LISTENER: \ - case CONN_TYPE_AP_LISTENER: \ - case CONN_TYPE_DIR_LISTENER: \ - case CONN_TYPE_CONTROL_LISTENER: \ - case CONN_TYPE_AP_TRANS_LISTENER: \ - case CONN_TYPE_AP_NATD_LISTENER: \ - case CONN_TYPE_AP_DNS_LISTENER - -/**************************************************************/ - -/** - * Return the human-readable name for the connection type type - */ -const char * -conn_type_to_string(int type) -{ - static char buf[64]; - switch (type) { - case CONN_TYPE_OR_LISTENER: return "OR listener"; - case CONN_TYPE_OR: return "OR"; - case CONN_TYPE_EXIT: return "Exit"; - case CONN_TYPE_AP_LISTENER: return "Socks listener"; - case CONN_TYPE_AP_TRANS_LISTENER: - return "Transparent pf/netfilter listener"; - case CONN_TYPE_AP_NATD_LISTENER: return "Transparent natd listener"; - case CONN_TYPE_AP_DNS_LISTENER: return "DNS listener"; - case CONN_TYPE_AP: return "Socks"; - case CONN_TYPE_DIR_LISTENER: return "Directory listener"; - case CONN_TYPE_DIR: return "Directory"; - case CONN_TYPE_CPUWORKER: return "CPU worker"; - case CONN_TYPE_CONTROL_LISTENER: return "Control listener"; - case CONN_TYPE_CONTROL: return "Control"; - case CONN_TYPE_EXT_OR: return "Extended OR"; - case CONN_TYPE_EXT_OR_LISTENER: return "Extended OR listener"; - default: - log_warn(LD_BUG, "unknown connection type %d", type); - tor_snprintf(buf, sizeof(buf), "unknown [%d]", type); - return buf; - } -} - -/** - * Return the human-readable name for the connection state state - * for the connection type type - */ -const char * -conn_state_to_string(int type, int state) -{ - static char buf[96]; - switch (type) { - CASE_ANY_LISTENER_TYPE: - if (state == LISTENER_STATE_READY) - return "ready"; - break; - case CONN_TYPE_OR: - switch (state) { - case OR_CONN_STATE_CONNECTING: return "connect()ing"; - case OR_CONN_STATE_PROXY_HANDSHAKING: return "handshaking (proxy)"; - case OR_CONN_STATE_TLS_HANDSHAKING: return "handshaking (TLS)"; - case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING: - return "renegotiating (TLS, v2 handshake)"; - case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: - return "waiting for renegotiation or V3 handshake"; - case OR_CONN_STATE_OR_HANDSHAKING_V2: - return "handshaking (Tor, v2 handshake)"; - case OR_CONN_STATE_OR_HANDSHAKING_V3: - return "handshaking (Tor, v3 handshake)"; - case OR_CONN_STATE_OPEN: return "open"; - } - break; - case CONN_TYPE_EXT_OR: - switch (state) { - case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE: - return "waiting for authentication type"; - case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE: - return "waiting for client nonce"; - case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH: - return "waiting for client hash"; - case EXT_OR_CONN_STATE_OPEN: return "open"; - case EXT_OR_CONN_STATE_FLUSHING: return "flushing final OKAY"; - } - break; - case CONN_TYPE_EXIT: - switch (state) { - case EXIT_CONN_STATE_RESOLVING: return "waiting for dest info"; - case EXIT_CONN_STATE_CONNECTING: return "connecting"; - case EXIT_CONN_STATE_OPEN: return "open"; - case EXIT_CONN_STATE_RESOLVEFAILED: return "resolve failed"; - } - break; - case CONN_TYPE_AP: - switch (state) { - case AP_CONN_STATE_SOCKS_WAIT: return "waiting for socks info"; - case AP_CONN_STATE_NATD_WAIT: return "waiting for natd dest info"; - case AP_CONN_STATE_RENDDESC_WAIT: return "waiting for rendezvous desc"; - case AP_CONN_STATE_CONTROLLER_WAIT: return "waiting for controller"; - case AP_CONN_STATE_CIRCUIT_WAIT: return "waiting for circuit"; - case AP_CONN_STATE_CONNECT_WAIT: return "waiting for connect response"; - case AP_CONN_STATE_RESOLVE_WAIT: return "waiting for resolve response"; - case AP_CONN_STATE_OPEN: return "open"; - } - break; - case CONN_TYPE_DIR: - switch (state) { - case DIR_CONN_STATE_CONNECTING: return "connecting"; - case DIR_CONN_STATE_CLIENT_SENDING: return "client sending"; - case DIR_CONN_STATE_CLIENT_READING: return "client reading"; - case DIR_CONN_STATE_CLIENT_FINISHED: return "client finished"; - case DIR_CONN_STATE_SERVER_COMMAND_WAIT: return "waiting for command"; - case DIR_CONN_STATE_SERVER_WRITING: return "writing"; - } - break; - case CONN_TYPE_CPUWORKER: - switch (state) { - case CPUWORKER_STATE_IDLE: return "idle"; - case CPUWORKER_STATE_BUSY_ONION: return "busy with onion"; - } - break; - case CONN_TYPE_CONTROL: - switch (state) { - case CONTROL_CONN_STATE_OPEN: return "open (protocol v1)"; - case CONTROL_CONN_STATE_NEEDAUTH: - return "waiting for authentication (protocol v1)"; - } - break; - } - - log_warn(LD_BUG, "unknown connection state %d (type %d)", state, type); - tor_snprintf(buf, sizeof(buf), - "unknown state [%d] on unknown [%s] connection", - state, conn_type_to_string(type)); - return buf; -} - -#ifdef USE_BUFFEREVENTS -/** Return true iff the connection's type is one that can use a - bufferevent-based implementation. */ -int -connection_type_uses_bufferevent(connection_t *conn) -{ - switch (conn->type) { - case CONN_TYPE_AP: - case CONN_TYPE_EXIT: - case CONN_TYPE_DIR: - case CONN_TYPE_CONTROL: - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - case CONN_TYPE_CPUWORKER: - return 1; - default: - return 0; - } -} -#endif - -/** Allocate and return a new dir_connection_t, initialized as by - * connection_init(). */ -dir_connection_t * -dir_connection_new(int socket_family) -{ - dir_connection_t *dir_conn = tor_malloc_zero(sizeof(dir_connection_t)); - connection_init(time(NULL), TO_CONN(dir_conn), CONN_TYPE_DIR, socket_family); - return dir_conn; -} - -/** Allocate and return a new or_connection_t, initialized as by - * connection_init(). - * - * Set timestamp_last_added_nonpadding to now. - * - * Assign a pseudorandom next_circ_id between 0 and 2**15. - * - * Initialize active_circuit_pqueue. - * - * Set active_circuit_pqueue_last_recalibrated to current cell_ewma tick. - */ -or_connection_t * -or_connection_new(int type, int socket_family) -{ - or_connection_t *or_conn = tor_malloc_zero(sizeof(or_connection_t)); - time_t now = time(NULL); - tor_assert(type == CONN_TYPE_OR || type == CONN_TYPE_EXT_OR); - connection_init(now, TO_CONN(or_conn), type, socket_family); - - or_conn->timestamp_last_added_nonpadding = time(NULL); - - if (type == CONN_TYPE_EXT_OR) - connection_or_set_ext_or_identifier(or_conn); - - return or_conn; -} - -/** Allocate and return a new entry_connection_t, initialized as by - * connection_init(). - * - * Allocate space to store the socks_request. - */ -entry_connection_t * -entry_connection_new(int type, int socket_family) -{ - entry_connection_t *entry_conn = tor_malloc_zero(sizeof(entry_connection_t)); - tor_assert(type == CONN_TYPE_AP); - connection_init(time(NULL), ENTRY_TO_CONN(entry_conn), type, socket_family); - entry_conn->socks_request = socks_request_new(); - /* If this is coming from a listener, we'll set it up based on the listener - * in a little while. Otherwise, we're doing this as a linked connection - * of some kind, and we should set it up here based on the socket family */ - if (socket_family == AF_INET) - entry_conn->ipv4_traffic_ok = 1; - else if (socket_family == AF_INET6) - entry_conn->ipv6_traffic_ok = 1; - return entry_conn; -} - -/** Allocate and return a new edge_connection_t, initialized as by - * connection_init(). */ -edge_connection_t * -edge_connection_new(int type, int socket_family) -{ - edge_connection_t *edge_conn = tor_malloc_zero(sizeof(edge_connection_t)); - tor_assert(type == CONN_TYPE_EXIT); - connection_init(time(NULL), TO_CONN(edge_conn), type, socket_family); - return edge_conn; -} - -/** Allocate and return a new control_connection_t, initialized as by - * connection_init(). */ -control_connection_t * -control_connection_new(int socket_family) -{ - control_connection_t *control_conn = - tor_malloc_zero(sizeof(control_connection_t)); - connection_init(time(NULL), - TO_CONN(control_conn), CONN_TYPE_CONTROL, socket_family); - return control_conn; -} - -/** Allocate and return a new listener_connection_t, initialized as by - * connection_init(). */ -listener_connection_t * -listener_connection_new(int type, int socket_family) -{ - listener_connection_t *listener_conn = - tor_malloc_zero(sizeof(listener_connection_t)); - connection_init(time(NULL), TO_CONN(listener_conn), type, socket_family); - return listener_conn; -} - -/** Allocate, initialize, and return a new connection_t subtype of type - * to make or receive connections of address family socket_family. The - * type should be one of the CONN_TYPE_* constants. */ -connection_t * -connection_new(int type, int socket_family) -{ - switch (type) { - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - return TO_CONN(or_connection_new(type, socket_family)); - - case CONN_TYPE_EXIT: - return TO_CONN(edge_connection_new(type, socket_family)); - - case CONN_TYPE_AP: - return ENTRY_TO_CONN(entry_connection_new(type, socket_family)); - - case CONN_TYPE_DIR: - return TO_CONN(dir_connection_new(socket_family)); - - case CONN_TYPE_CONTROL: - return TO_CONN(control_connection_new(socket_family)); - - CASE_ANY_LISTENER_TYPE: - return TO_CONN(listener_connection_new(type, socket_family)); - - default: { - connection_t *conn = tor_malloc_zero(sizeof(connection_t)); - connection_init(time(NULL), conn, type, socket_family); - return conn; - } - } -} - -/** Initializes conn. (you must call connection_add() to link it into the main - * array). - * - * Set conn-\>magic to the correct value. - * - * Set conn-\>type to type. Set conn-\>s and conn-\>conn_array_index to - * -1 to signify they are not yet assigned. - * - * Initialize conn's timestamps to now. - */ -static void -connection_init(time_t now, connection_t *conn, int type, int socket_family) -{ - static uint64_t n_connections_allocated = 1; - - switch (type) { - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - conn->magic = OR_CONNECTION_MAGIC; - break; - case CONN_TYPE_EXIT: - conn->magic = EDGE_CONNECTION_MAGIC; - break; - case CONN_TYPE_AP: - conn->magic = ENTRY_CONNECTION_MAGIC; - break; - case CONN_TYPE_DIR: - conn->magic = DIR_CONNECTION_MAGIC; - break; - case CONN_TYPE_CONTROL: - conn->magic = CONTROL_CONNECTION_MAGIC; - break; - CASE_ANY_LISTENER_TYPE: - conn->magic = LISTENER_CONNECTION_MAGIC; - break; - default: - conn->magic = BASE_CONNECTION_MAGIC; - break; - } - - conn->s = TOR_INVALID_SOCKET; /* give it a default of 'not used' */ - conn->conn_array_index = -1; /* also default to 'not used' */ - conn->global_identifier = n_connections_allocated++; - - conn->type = type; - conn->socket_family = socket_family; -#ifndef USE_BUFFEREVENTS - if (!connection_is_listener(conn)) { - /* listeners never use their buf */ - conn->inbuf = buf_new(); - conn->outbuf = buf_new(); - } -#endif - - conn->timestamp_created = now; - conn->timestamp_lastread = now; - conn->timestamp_lastwritten = now; -} - -/** Create a link between conn_a and conn_b. */ -void -connection_link_connections(connection_t *conn_a, connection_t *conn_b) -{ - tor_assert(! SOCKET_OK(conn_a->s)); - tor_assert(! SOCKET_OK(conn_b->s)); - - conn_a->linked = 1; - conn_b->linked = 1; - conn_a->linked_conn = conn_b; - conn_b->linked_conn = conn_a; -} - -/** Deallocate memory used by conn. Deallocate its buffers if - * necessary, close its socket if necessary, and mark the directory as dirty - * if conn is an OR or OP connection. - */ -STATIC void -connection_free_(connection_t *conn) -{ - void *mem; - size_t memlen; - if (!conn) - return; - - switch (conn->type) { - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - tor_assert(conn->magic == OR_CONNECTION_MAGIC); - mem = TO_OR_CONN(conn); - memlen = sizeof(or_connection_t); - break; - case CONN_TYPE_AP: - tor_assert(conn->magic == ENTRY_CONNECTION_MAGIC); - mem = TO_ENTRY_CONN(conn); - memlen = sizeof(entry_connection_t); - break; - case CONN_TYPE_EXIT: - tor_assert(conn->magic == EDGE_CONNECTION_MAGIC); - mem = TO_EDGE_CONN(conn); - memlen = sizeof(edge_connection_t); - break; - case CONN_TYPE_DIR: - tor_assert(conn->magic == DIR_CONNECTION_MAGIC); - mem = TO_DIR_CONN(conn); - memlen = sizeof(dir_connection_t); - break; - case CONN_TYPE_CONTROL: - tor_assert(conn->magic == CONTROL_CONNECTION_MAGIC); - mem = TO_CONTROL_CONN(conn); - memlen = sizeof(control_connection_t); - break; - CASE_ANY_LISTENER_TYPE: - tor_assert(conn->magic == LISTENER_CONNECTION_MAGIC); - mem = TO_LISTENER_CONN(conn); - memlen = sizeof(listener_connection_t); - break; - default: - tor_assert(conn->magic == BASE_CONNECTION_MAGIC); - mem = conn; - memlen = sizeof(connection_t); - break; - } - - if (conn->linked) { - log_info(LD_GENERAL, "Freeing linked %s connection [%s] with %d " - "bytes on inbuf, %d on outbuf.", - conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state), - (int)connection_get_inbuf_len(conn), - (int)connection_get_outbuf_len(conn)); - } - - if (!connection_is_listener(conn)) { - buf_free(conn->inbuf); - buf_free(conn->outbuf); - } else { - if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be Unix domain sockets - * and listeners at the same time */ - tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); - - if (unlink(conn->address) < 0 && errno != ENOENT) { - log_warn(LD_NET, "Could not unlink %s: %s", conn->address, - strerror(errno)); - } - } - } - - tor_free(conn->address); - - if (connection_speaks_cells(conn)) { - or_connection_t *or_conn = TO_OR_CONN(conn); - tor_tls_free(or_conn->tls); - or_conn->tls = NULL; - or_handshake_state_free(or_conn->handshake_state); - or_conn->handshake_state = NULL; - tor_free(or_conn->nickname); - if (or_conn->chan) { - /* Owww, this shouldn't happen, but... */ - log_info(LD_CHANNEL, - "Freeing orconn at %p, saw channel %p with ID " - U64_FORMAT " left un-NULLed", - or_conn, TLS_CHAN_TO_BASE(or_conn->chan), - U64_PRINTF_ARG( - TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier)); - if (!(TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_CLOSED || - TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_ERROR)) { - channel_close_for_error(TLS_CHAN_TO_BASE(or_conn->chan)); - } - - or_conn->chan->conn = NULL; - or_conn->chan = NULL; - } - } - if (conn->type == CONN_TYPE_AP) { - entry_connection_t *entry_conn = TO_ENTRY_CONN(conn); - tor_free(entry_conn->chosen_exit_name); - tor_free(entry_conn->original_dest_address); - if (entry_conn->socks_request) - socks_request_free(entry_conn->socks_request); - if (entry_conn->pending_optimistic_data) { - generic_buffer_free(entry_conn->pending_optimistic_data); - } - if (entry_conn->sending_optimistic_data) { - generic_buffer_free(entry_conn->sending_optimistic_data); - } - } - if (CONN_IS_EDGE(conn)) { - rend_data_free(TO_EDGE_CONN(conn)->rend_data); - } - if (conn->type == CONN_TYPE_CONTROL) { - control_connection_t *control_conn = TO_CONTROL_CONN(conn); - tor_free(control_conn->safecookie_client_hash); - tor_free(control_conn->incoming_cmd); - } - - tor_free(conn->read_event); /* Probably already freed by connection_free. */ - tor_free(conn->write_event); /* Probably already freed by connection_free. */ - IF_HAS_BUFFEREVENT(conn, { - /* This was a workaround to handle bugs in some old versions of libevent - * where callbacks can occur after calling bufferevent_free(). Setting - * the callbacks to NULL prevented this. It shouldn't be necessary any - * more, but let's not tempt fate for now. */ - bufferevent_setcb(conn->bufev, NULL, NULL, NULL, NULL); - bufferevent_free(conn->bufev); - conn->bufev = NULL; - }); - - if (conn->type == CONN_TYPE_DIR) { - dir_connection_t *dir_conn = TO_DIR_CONN(conn); - tor_free(dir_conn->requested_resource); - - tor_zlib_free(dir_conn->zlib_state); - if (dir_conn->fingerprint_stack) { - SMARTLIST_FOREACH(dir_conn->fingerprint_stack, char *, cp, tor_free(cp)); - smartlist_free(dir_conn->fingerprint_stack); - } - - cached_dir_decref(dir_conn->cached_dir); - rend_data_free(dir_conn->rend_data); - } - - if (SOCKET_OK(conn->s)) { - log_debug(LD_NET,"closing fd %d.",(int)conn->s); - tor_close_socket(conn->s); - conn->s = TOR_INVALID_SOCKET; - } - - if (conn->type == CONN_TYPE_OR && - !tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) { - log_warn(LD_BUG, "called on OR conn with non-zeroed identity_digest"); - connection_or_remove_from_identity_map(TO_OR_CONN(conn)); - } - if (conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR) { - connection_or_remove_from_ext_or_id_map(TO_OR_CONN(conn)); - tor_free(TO_OR_CONN(conn)->ext_or_conn_id); - tor_free(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash); - tor_free(TO_OR_CONN(conn)->ext_or_transport); - } - -#ifdef USE_BUFFEREVENTS - if (conn->type == CONN_TYPE_OR && TO_OR_CONN(conn)->bucket_cfg) { - ev_token_bucket_cfg_free(TO_OR_CONN(conn)->bucket_cfg); - TO_OR_CONN(conn)->bucket_cfg = NULL; - } -#endif - - memwipe(mem, 0xCC, memlen); /* poison memory */ - tor_free(mem); -} - -/** Make sure conn isn't in any of the global conn lists; then free it. - */ -void -connection_free(connection_t *conn) -{ - if (!conn) - return; - tor_assert(!connection_is_on_closeable_list(conn)); - tor_assert(!connection_in_array(conn)); - if (conn->linked_conn) { - log_err(LD_BUG, "Called with conn->linked_conn still set."); - tor_fragile_assert(); - conn->linked_conn->linked_conn = NULL; - if (! conn->linked_conn->marked_for_close && - conn->linked_conn->reading_from_linked_conn) - connection_start_reading(conn->linked_conn); - conn->linked_conn = NULL; - } - if (connection_speaks_cells(conn)) { - if (!tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) { - connection_or_remove_from_identity_map(TO_OR_CONN(conn)); - } - } - if (conn->type == CONN_TYPE_CONTROL) { - connection_control_closed(TO_CONTROL_CONN(conn)); - } - connection_unregister_events(conn); - connection_free_(conn); -} - -/** - * Called when we're about to finally unlink and free a connection: - * perform necessary accounting and cleanup - * - Directory conns that failed to fetch a rendezvous descriptor - * need to inform pending rendezvous streams. - * - OR conns need to call rep_hist_note_*() to record status. - * - AP conns need to send a socks reject if necessary. - * - Exit conns need to call connection_dns_remove() if necessary. - * - AP and Exit conns need to send an end cell if they can. - * - DNS conns need to fail any resolves that are pending on them. - * - OR and edge connections need to be unlinked from circuits. - */ -void -connection_about_to_close_connection(connection_t *conn) -{ - tor_assert(conn->marked_for_close); - - switch (conn->type) { - case CONN_TYPE_DIR: - connection_dir_about_to_close(TO_DIR_CONN(conn)); - break; - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - connection_or_about_to_close(TO_OR_CONN(conn)); - break; - case CONN_TYPE_AP: - connection_ap_about_to_close(TO_ENTRY_CONN(conn)); - break; - case CONN_TYPE_EXIT: - connection_exit_about_to_close(TO_EDGE_CONN(conn)); - break; - } -} - -/** Return true iff connection_close_immediate() has been called on this - * connection. */ -#define CONN_IS_CLOSED(c) \ - ((c)->linked ? ((c)->linked_conn_is_closed) : (! SOCKET_OK(c->s))) - -/** Close the underlying socket for conn, so we don't try to - * flush it. Must be used in conjunction with (right before) - * connection_mark_for_close(). - */ -void -connection_close_immediate(connection_t *conn) -{ - assert_connection_ok(conn,0); - if (CONN_IS_CLOSED(conn)) { - log_err(LD_BUG,"Attempt to close already-closed connection."); - tor_fragile_assert(); - return; - } - if (conn->outbuf_flushlen) { - log_info(LD_NET,"fd %d, type %s, state %s, %d bytes on outbuf.", - (int)conn->s, conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state), - (int)conn->outbuf_flushlen); - } - - connection_unregister_events(conn); - - if (SOCKET_OK(conn->s)) - tor_close_socket(conn->s); - conn->s = TOR_INVALID_SOCKET; - if (conn->linked) - conn->linked_conn_is_closed = 1; - if (conn->outbuf) - buf_clear(conn->outbuf); - conn->outbuf_flushlen = 0; -} - -/** Mark conn to be closed next time we loop through - * conn_close_if_marked() in onion_main.c. */ -void -connection_mark_for_close_(connection_t *conn, int line, const char *file) -{ - assert_connection_ok(conn,0); - tor_assert(line); - tor_assert(line < 1<<16); /* marked_for_close can only fit a uint16_t. */ - tor_assert(file); - - if (conn->type == CONN_TYPE_OR) { - /* - * An or_connection should have been closed through one of the channel- - * aware functions in connection_or.c. We'll assume this is an error - * close and do that, and log a bug warning. - */ - log_warn(LD_CHANNEL | LD_BUG, - "Something tried to close an or_connection_t without going " - "through channels at %s:%d", - file, line); - connection_or_close_for_error(TO_OR_CONN(conn), 0); - } else { - /* Pass it down to the real function */ - connection_mark_for_close_internal_(conn, line, file); - } -} - -/** Mark conn to be closed next time we loop through - * conn_close_if_marked() in onion_main.c; the _internal version bypasses the - * CONN_TYPE_OR checks; this should be called when you either are sure that - * if this is an or_connection_t the controlling channel has been notified - * (e.g. with connection_or_notify_error()), or you actually are the - * connection_or_close_for_error() or connection_or_close_normally function. - * For all other cases, use connection_mark_and_flush() instead, which - * checks for or_connection_t properly, instead. See below. - */ -void -connection_mark_for_close_internal_(connection_t *conn, - int line, const char *file) -{ - assert_connection_ok(conn,0); - tor_assert(line); - tor_assert(line < 1<<16); /* marked_for_close can only fit a uint16_t. */ - tor_assert(file); - - if (conn->marked_for_close) { - log_warn(LD_BUG,"Duplicate call to connection_mark_for_close at %s:%d" - " (first at %s:%d)", file, line, conn->marked_for_close_file, - conn->marked_for_close); - tor_fragile_assert(); - return; - } - - if (conn->type == CONN_TYPE_OR) { - /* - * Bad news if this happens without telling the controlling channel; do - * this so we can find things that call this wrongly when the asserts hit. - */ - log_debug(LD_CHANNEL, - "Calling connection_mark_for_close_internal_() on an OR conn " - "at %s:%d", - file, line); - } - - conn->marked_for_close = line; - conn->marked_for_close_file = file; - add_connection_to_closeable_list(conn); - - /* in case we're going to be held-open-til-flushed, reset - * the number of seconds since last successful write, so - * we get our whole 15 seconds */ - conn->timestamp_lastwritten = time(NULL); -} - -/** Find each connection that has hold_open_until_flushed set to - * 1 but hasn't written in the past 15 seconds, and set - * hold_open_until_flushed to 0. This means it will get cleaned - * up in the next loop through close_if_marked() in onion_main.c. - */ -void -connection_expire_held_open(void) -{ - time_t now; - smartlist_t *conns = get_connection_array(); - - now = time(NULL); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - /* If we've been holding the connection open, but we haven't written - * for 15 seconds... - */ - if (conn->hold_open_until_flushed) { - tor_assert(conn->marked_for_close); - if (now - conn->timestamp_lastwritten >= 15) { - int severity; - if (conn->type == CONN_TYPE_EXIT || - (conn->type == CONN_TYPE_DIR && - conn->purpose == DIR_PURPOSE_SERVER)) - severity = LOG_INFO; - else - severity = LOG_NOTICE; - log_fn(severity, LD_NET, - "Giving up on marked_for_close conn that's been flushing " - "for 15s (fd %d, type %s, state %s).", - (int)conn->s, conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state)); - conn->hold_open_until_flushed = 0; - } - } - } SMARTLIST_FOREACH_END(conn); -} - -#if defined(HAVE_SYS_UN_H) || defined(RUNNING_DOXYGEN) -/** Create an AF_UNIX listenaddr struct. - * listenaddress provides the path to the Unix socket. - * - * Eventually listenaddress will also optionally contain user, group, - * and file permissions for the new socket. But not yet. XXX - * Also, since we do not create the socket here the information doesn't help - * here. - * - * If not NULL readable_address will contain a copy of the path part of - * listenaddress. - * - * The listenaddr struct has to be freed by the caller. - */ -static struct sockaddr_un * -create_unix_sockaddr(const char *listenaddress, char **readable_address, - socklen_t *len_out) -{ - struct sockaddr_un *sockaddr = NULL; - - sockaddr = tor_malloc_zero(sizeof(struct sockaddr_un)); - sockaddr->sun_family = AF_UNIX; - if (strlcpy(sockaddr->sun_path, listenaddress, sizeof(sockaddr->sun_path)) - >= sizeof(sockaddr->sun_path)) { - log_warn(LD_CONFIG, "Unix socket path '%s' is too long to fit.", - escaped(listenaddress)); - tor_free(sockaddr); - return NULL; - } - - if (readable_address) - *readable_address = tor_strdup(listenaddress); - - *len_out = sizeof(struct sockaddr_un); - return sockaddr; -} -#else -static struct sockaddr * -create_unix_sockaddr(const char *listenaddress, char **readable_address, - socklen_t *len_out) -{ - (void)listenaddress; - (void)readable_address; - log_fn(LOG_ERR, LD_BUG, - "Unix domain sockets not supported, yet we tried to create one."); - *len_out = 0; - tor_fragile_assert(); - return NULL; -} -#endif /* HAVE_SYS_UN_H */ - -/** Warn that an accept or a connect has failed because we're running up - * against our ulimit. Rate-limit these warnings so that we don't spam - * the log. */ -static void -warn_too_many_conns(void) -{ -#define WARN_TOO_MANY_CONNS_INTERVAL (6*60*60) - static ratelim_t last_warned = RATELIM_INIT(WARN_TOO_MANY_CONNS_INTERVAL); - char *m; - if ((m = rate_limit_log(&last_warned, approx_time()))) { - int n_conns = get_n_open_sockets(); - log_warn(LD_NET,"Failing because we have %d connections already. Please " - "raise your ulimit -n.%s", n_conns, m); - tor_free(m); - control_event_general_status(LOG_WARN, "TOO_MANY_CONNECTIONS CURRENT=%d", - n_conns); - } -} - -#ifdef HAVE_SYS_UN_H -/** Check whether we should be willing to open an AF_UNIX socket in - * path. Return 0 if we should go ahead and -1 if we shouldn't. */ -static int -check_location_for_unix_socket(const or_options_t *options, const char *path) -{ - int r = -1; - char *p = tor_strdup(path); - cpd_check_t flags = CPD_CHECK_MODE_ONLY; - if (get_parent_directory(p)<0 || p[0] != '/') { - log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support " - "relative paths for unix sockets.", path); - goto done; - } - - if (options->ControlSocketsGroupWritable) - flags |= CPD_GROUP_OK; - - if (check_private_dir(p, flags, options->User) < 0) { - char *escpath, *escdir; - escpath = esc_for_log(path); - escdir = esc_for_log(p); - log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the " - "directory %s needs to exist, and to be accessible only by the " - "user%s account that is running Tor. (On some Unix systems, " - "anybody who can list a socket can connect to it, so Tor is " - "being careful.)", escpath, escdir, - options->ControlSocketsGroupWritable ? " and group" : ""); - tor_free(escpath); - tor_free(escdir); - goto done; - } - - r = 0; - done: - tor_free(p); - return r; -} -#endif - -/** Tell the TCP stack that it shouldn't wait for a long time after - * sock has closed before reusing its port. */ -static void -make_socket_reuseable(tor_socket_t sock) -{ -#ifdef _WIN32 - (void) sock; -#else - int one=1; - - /* REUSEADDR on normal places means you can rebind to the port - * right after somebody else has let it go. But REUSEADDR on win32 - * means you can bind to the port _even when somebody else - * already has it bound_. So, don't do that on Win32. */ - if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one, - (socklen_t)sizeof(one)) == -1) { - log_warn(LD_NET, "Error setting SO_REUSEADDR flag: %s", - tor_socket_strerror(errno)); - } -#endif -} - -/** Max backlog to pass to listen. We start at */ -static int listen_limit = INT_MAX; - -/* Listen on fd with appropriate backlog. Return as for listen. */ -static int -tor_listen(tor_socket_t fd) -{ - int r; - - if ((r = listen(fd, listen_limit)) < 0) { - if (listen_limit == SOMAXCONN) - return r; - if ((r = listen(fd, SOMAXCONN)) == 0) { - listen_limit = SOMAXCONN; - log_warn(LD_NET, "Setting listen backlog to INT_MAX connections " - "didn't work, but SOMAXCONN did. Lowering backlog limit."); - } - } - return r; -} - -/** Bind a new non-blocking socket listening to the socket described - * by listensockaddr. - * - * address is only used for logging purposes and to add the information - * to the conn. - */ -static connection_t * -connection_listener_new(const struct sockaddr *listensockaddr, - socklen_t socklen, - int type, const char *address, - const port_cfg_t *port_cfg) -{ - listener_connection_t *lis_conn; - connection_t *conn = NULL; - tor_socket_t s = TOR_INVALID_SOCKET; /* the socket we're going to make */ - or_options_t const *options = get_options(); -#if defined(HAVE_PWD_H) && defined(HAVE_SYS_UN_H) - struct passwd *pw = NULL; -#endif - uint16_t usePort = 0, gotPort = 0; - int start_reading = 0; - static int global_next_session_group = SESSION_GROUP_FIRST_AUTO; - tor_addr_t addr; - - if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { - warn_too_many_conns(); - return NULL; - } - - if (listensockaddr->sa_family == AF_INET || - listensockaddr->sa_family == AF_INET6) { - int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER); - if (is_tcp) - start_reading = 1; - - tor_addr_from_sockaddr(&addr, listensockaddr, &usePort); - - log_notice(LD_NET, "Opening %s on %s", - conn_type_to_string(type), fmt_addrport(&addr, usePort)); - - s = tor_open_socket_nonblocking(tor_addr_family(&addr), - is_tcp ? SOCK_STREAM : SOCK_DGRAM, - is_tcp ? IPPROTO_TCP: IPPROTO_UDP); - if (!SOCKET_OK(s)) { - log_warn(LD_NET,"Socket creation failed: %s", - tor_socket_strerror(tor_socket_errno(-1))); - goto err; - } - - make_socket_reuseable(s); - -#if defined USE_TRANSPARENT && defined(IP_TRANSPARENT) - if (options->TransProxyType_parsed == TPT_TPROXY && - type == CONN_TYPE_AP_TRANS_LISTENER) { - int one = 1; - if (setsockopt(s, SOL_IP, IP_TRANSPARENT, &one, sizeof(one)) < 0) { - const char *extra = ""; - int e = tor_socket_errno(s); - if (e == EPERM) - extra = "TransTPROXY requires root privileges or similar" - " capabilities."; - log_warn(LD_NET, "Error setting IP_TRANSPARENT flag: %s.%s", - tor_socket_strerror(e), extra); - } - } -#endif - -#ifdef IPV6_V6ONLY - if (listensockaddr->sa_family == AF_INET6) { -#ifdef _WIN32 - /* In Redmond, this kind of thing passes for standards-conformance. */ - DWORD one = 1; -#else - int one = 1; -#endif - /* We need to set IPV6_V6ONLY so that this socket can't get used for - * IPv4 connections. */ - if (setsockopt(s,IPPROTO_IPV6, IPV6_V6ONLY, - (void*)&one, sizeof(one)) < 0) { - int e = tor_socket_errno(s); - log_warn(LD_NET, "Error setting IPV6_V6ONLY flag: %s", - tor_socket_strerror(e)); - /* Keep going; probably not harmful. */ - } - } -#endif - - if (bind(s,listensockaddr,socklen) < 0) { - const char *helpfulhint = ""; - int e = tor_socket_errno(s); - if (ERRNO_IS_EADDRINUSE(e)) - helpfulhint = ". Is Tor already running?"; - log_warn(LD_NET, "Could not bind to %s:%u: %s%s", address, usePort, - tor_socket_strerror(e), helpfulhint); - goto err; - } - - if (is_tcp) { - if (tor_listen(s) < 0) { - log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort, - tor_socket_strerror(tor_socket_errno(s))); - goto err; - } - } - - if (usePort != 0) { - gotPort = usePort; - } else { - tor_addr_t addr2; - struct sockaddr_storage ss; - socklen_t ss_len=sizeof(ss); - if (getsockname(s, (struct sockaddr*)&ss, &ss_len)<0) { - log_warn(LD_NET, "getsockname() couldn't learn address for %s: %s", - conn_type_to_string(type), - tor_socket_strerror(tor_socket_errno(s))); - gotPort = 0; - } - tor_addr_from_sockaddr(&addr2, (struct sockaddr*)&ss, &gotPort); - } -#ifdef HAVE_SYS_UN_H - } else if (listensockaddr->sa_family == AF_UNIX) { - start_reading = 1; - - /* For now only control ports can be Unix domain sockets - * and listeners at the same time */ - tor_assert(type == CONN_TYPE_CONTROL_LISTENER); - - if (check_location_for_unix_socket(options, address) < 0) - goto err; - - log_notice(LD_NET, "Opening %s on %s", - conn_type_to_string(type), address); - - tor_addr_make_unspec(&addr); - - if (unlink(address) < 0 && errno != ENOENT) { - log_warn(LD_NET, "Could not unlink %s: %s", address, - strerror(errno)); - goto err; - } - s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0); - if (! SOCKET_OK(s)) { - log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno)); - goto err; - } - - if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) { - log_warn(LD_NET,"Bind to %s failed: %s.", address, - tor_socket_strerror(tor_socket_errno(s))); - goto err; - } -#ifdef HAVE_PWD_H - if (options->User) { - pw = getpwnam(options->User); - if (pw == NULL) { - log_warn(LD_NET,"Unable to chown() %s socket: user %s not found.", - address, options->User); - goto err; - } else if (chown(address, pw->pw_uid, pw->pw_gid) < 0) { - log_warn(LD_NET,"Unable to chown() %s socket: %s.", - address, strerror(errno)); - goto err; - } - } -#endif - if (options->ControlSocketsGroupWritable) { - /* We need to use chmod; fchmod doesn't work on sockets on all - * platforms. */ - if (chmod(address, 0660) < 0) { - log_warn(LD_FS,"Unable to make %s group-writable.", address); - goto err; - } - } - - if (listen(s, SOMAXCONN) < 0) { - log_warn(LD_NET, "Could not listen on %s: %s", address, - tor_socket_strerror(tor_socket_errno(s))); - goto err; - } -#else - (void)options; -#endif /* HAVE_SYS_UN_H */ - } else { - log_err(LD_BUG, "Got unexpected address family %d.", - listensockaddr->sa_family); - tor_assert(0); - } - - lis_conn = listener_connection_new(type, listensockaddr->sa_family); - conn = TO_CONN(lis_conn); - conn->socket_family = listensockaddr->sa_family; - conn->s = s; - s = TOR_INVALID_SOCKET; /* Prevent double-close */ - conn->address = tor_strdup(address); - conn->port = gotPort; - tor_addr_copy(&conn->addr, &addr); - - if (port_cfg->isolation_flags) { - lis_conn->isolation_flags = port_cfg->isolation_flags; - if (port_cfg->session_group >= 0) { - lis_conn->session_group = port_cfg->session_group; - } else { - /* This can wrap after around INT_MAX listeners are opened. But I don't - * believe that matters, since you would need to open a ridiculous - * number of listeners while keeping the early ones open before you ever - * hit this. An OR with a dozen ports open, for example, would have to - * close and re-open its listeners every second for 4 years nonstop. - */ - lis_conn->session_group = global_next_session_group--; - } - } - if (type == CONN_TYPE_AP_LISTENER) { - lis_conn->socks_ipv4_traffic = port_cfg->ipv4_traffic; - lis_conn->socks_ipv6_traffic = port_cfg->ipv6_traffic; - lis_conn->socks_prefer_ipv6 = port_cfg->prefer_ipv6; - } else { - lis_conn->socks_ipv4_traffic = 1; - lis_conn->socks_ipv6_traffic = 1; - } - lis_conn->cache_ipv4_answers = port_cfg->cache_ipv4_answers; - lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers; - lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers; - lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers; - lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr; - lis_conn->socks_prefer_no_auth = port_cfg->socks_prefer_no_auth; - - if (connection_add(conn) < 0) { /* no space, forget it */ - log_warn(LD_NET,"connection_add for listener failed. Giving up."); - goto err; - } - - log_fn(usePort==gotPort ? LOG_DEBUG : LOG_NOTICE, LD_NET, - "%s listening on port %u.", - conn_type_to_string(type), gotPort); - - conn->state = LISTENER_STATE_READY; - if (start_reading) { - connection_start_reading(conn); - } else { - tor_assert(type == CONN_TYPE_AP_DNS_LISTENER); - dnsserv_configure_listener(conn); - } - - return conn; - - err: - if (SOCKET_OK(s)) - tor_close_socket(s); - if (conn) - connection_free(conn); - - return NULL; -} - -/** Do basic sanity checking on a newly received socket. Return 0 - * if it looks ok, else return -1. - * - * Notably, some TCP stacks can erroneously have accept() return successfully - * with socklen 0, when the client sends an RST before the accept call (as - * nmap does). We want to detect that, and not go on with the connection. - */ -static int -check_sockaddr(const struct sockaddr *sa, int len, int level) -{ - int ok = 1; - - if (sa->sa_family == AF_INET) { - struct sockaddr_in *sin=(struct sockaddr_in*)sa; - if (len != sizeof(struct sockaddr_in)) { - log_fn(level, LD_NET, "Length of address not as expected: %d vs %d", - len,(int)sizeof(struct sockaddr_in)); - ok = 0; - } - if (sin->sin_addr.s_addr == 0 || sin->sin_port == 0) { - log_fn(level, LD_NET, - "Address for new connection has address/port equal to zero."); - ok = 0; - } - } else if (sa->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6=(struct sockaddr_in6*)sa; - if (len != sizeof(struct sockaddr_in6)) { - log_fn(level, LD_NET, "Length of address not as expected: %d vs %d", - len,(int)sizeof(struct sockaddr_in6)); - ok = 0; - } - if (tor_mem_is_zero((void*)sin6->sin6_addr.s6_addr, 16) || - sin6->sin6_port == 0) { - log_fn(level, LD_NET, - "Address for new connection has address/port equal to zero."); - ok = 0; - } - } else { - ok = 0; - } - return ok ? 0 : -1; -} - -/** Check whether the socket family from an accepted socket got is the - * same as the one that listener is waiting for. If it isn't, log - * a useful message and return -1. Else return 0. - * - * This is annoying, but can apparently happen on some Darwins. */ -static int -check_sockaddr_family_match(sa_family_t got, connection_t *listener) -{ - if (got != listener->socket_family) { - log_info(LD_BUG, "A listener connection returned a socket with a " - "mismatched family. %s for addr_family %d gave us a socket " - "with address family %d. Dropping.", - conn_type_to_string(listener->type), - (int)listener->socket_family, - (int)got); - return -1; - } - return 0; -} - -/** The listener connection conn told poll() it wanted to read. - * Call accept() on conn-\>s, and add the new connection if necessary. - */ -static int -connection_handle_listener_read(connection_t *conn, int new_type) -{ - tor_socket_t news; /* the new socket */ - connection_t *newconn; - /* information about the remote peer when connecting to other routers */ - struct sockaddr_storage addrbuf; - struct sockaddr *remote = (struct sockaddr*)&addrbuf; - /* length of the remote address. Must be whatever accept() needs. */ - socklen_t remotelen = (socklen_t)sizeof(addrbuf); - const or_options_t *options = get_options(); - - tor_assert((size_t)remotelen >= sizeof(struct sockaddr_in)); - memset(&addrbuf, 0, sizeof(addrbuf)); - - news = tor_accept_socket_nonblocking(conn->s,remote,&remotelen); - if (!SOCKET_OK(news)) { /* accept() error */ - int e = tor_socket_errno(conn->s); - if (ERRNO_IS_ACCEPT_EAGAIN(e)) { - return 0; /* he hung up before we could accept(). that's fine. */ - } else if (ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e)) { - warn_too_many_conns(); - return 0; - } - /* else there was a real error. */ - log_warn(LD_NET,"accept() failed: %s. Closing listener.", - tor_socket_strerror(e)); - connection_mark_for_close(conn); - return -1; - } - log_debug(LD_NET, - "Connection accepted on socket %d (child of fd %d).", - (int)news,(int)conn->s); - - make_socket_reuseable(news); - - if (options->ConstrainedSockets) - set_constrained_socket_buffers(news, (int)options->ConstrainedSockSize); - - if (check_sockaddr_family_match(remote->sa_family, conn) < 0) { - tor_close_socket(news); - return 0; - } - - if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6) { - tor_addr_t addr; - uint16_t port; - if (check_sockaddr(remote, remotelen, LOG_INFO)<0) { - log_info(LD_NET, - "accept() returned a strange address; closing connection."); - tor_close_socket(news); - return 0; - } - - tor_addr_from_sockaddr(&addr, remote, &port); - - /* process entrance policies here, before we even create the connection */ - if (new_type == CONN_TYPE_AP) { - /* check sockspolicy to see if we should accept it */ - if (socks_policy_permits_address(&addr) == 0) { - log_notice(LD_APP, - "Denying socks connection from untrusted address %s.", - fmt_and_decorate_addr(&addr)); - tor_close_socket(news); - return 0; - } - } - if (new_type == CONN_TYPE_DIR) { - /* check dirpolicy to see if we should accept it */ - if (dir_policy_permits_address(&addr) == 0) { - log_notice(LD_DIRSERV,"Denying dir connection from address %s.", - fmt_and_decorate_addr(&addr)); - tor_close_socket(news); - return 0; - } - } - - newconn = connection_new(new_type, conn->socket_family); - newconn->s = news; - - /* remember the remote address */ - tor_addr_copy(&newconn->addr, &addr); - newconn->port = port; - newconn->address = tor_dup_addr(&addr); - - if (new_type == CONN_TYPE_AP) { - TO_ENTRY_CONN(newconn)->socks_request->socks_prefer_no_auth = - TO_LISTENER_CONN(conn)->socks_prefer_no_auth; - } - if (new_type == CONN_TYPE_CONTROL) { - log_notice(LD_CONTROL, "New control connection opened from %s.", - fmt_and_decorate_addr(&addr)); - } - - } else if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be Unix domain sockets - * and listeners at the same time */ - tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); - tor_assert(new_type == CONN_TYPE_CONTROL); - log_notice(LD_CONTROL, "New control connection opened."); - - newconn = connection_new(new_type, conn->socket_family); - newconn->s = news; - - /* remember the remote address -- do we have anything sane to put here? */ - tor_addr_make_unspec(&newconn->addr); - newconn->port = 1; - newconn->address = tor_strdup(conn->address); - } else { - tor_assert(0); - }; - - if (connection_add(newconn) < 0) { /* no space, forget it */ - connection_free(newconn); - return 0; /* no need to tear down the parent */ - } - - if (connection_init_accepted_conn(newconn, TO_LISTENER_CONN(conn)) < 0) { - if (! newconn->marked_for_close) - connection_mark_for_close(newconn); - return 0; - } - return 0; -} - -/** Initialize states for newly accepted connection conn. - * If conn is an OR, start the TLS handshake. - * If conn is a transparent AP, get its original destination - * and place it in circuit_wait. - */ -static int -connection_init_accepted_conn(connection_t *conn, - const listener_connection_t *listener) -{ - int rv; - - connection_start_reading(conn); - - switch (conn->type) { - case CONN_TYPE_EXT_OR: - /* Initiate Extended ORPort authentication. */ - return connection_ext_or_start_auth(TO_OR_CONN(conn)); - case CONN_TYPE_OR: - control_event_or_conn_status(TO_OR_CONN(conn), OR_CONN_EVENT_NEW, 0); - rv = connection_tls_start_handshake(TO_OR_CONN(conn), 1); - if (rv < 0) { - connection_or_close_for_error(TO_OR_CONN(conn), 0); - } - return rv; - break; - case CONN_TYPE_AP: - TO_ENTRY_CONN(conn)->isolation_flags = listener->isolation_flags; - TO_ENTRY_CONN(conn)->session_group = listener->session_group; - TO_ENTRY_CONN(conn)->nym_epoch = get_signewnym_epoch(); - TO_ENTRY_CONN(conn)->socks_request->listener_type = listener->base_.type; - TO_ENTRY_CONN(conn)->ipv4_traffic_ok = listener->socks_ipv4_traffic; - TO_ENTRY_CONN(conn)->ipv6_traffic_ok = listener->socks_ipv6_traffic; - TO_ENTRY_CONN(conn)->prefer_ipv6_traffic = listener->socks_prefer_ipv6; - TO_ENTRY_CONN(conn)->cache_ipv4_answers = listener->cache_ipv4_answers; - TO_ENTRY_CONN(conn)->cache_ipv6_answers = listener->cache_ipv6_answers; - TO_ENTRY_CONN(conn)->use_cached_ipv4_answers = - listener->use_cached_ipv4_answers; - TO_ENTRY_CONN(conn)->use_cached_ipv6_answers = - listener->use_cached_ipv6_answers; - TO_ENTRY_CONN(conn)->prefer_ipv6_virtaddr = - listener->prefer_ipv6_virtaddr; - - switch (TO_CONN(listener)->type) { - case CONN_TYPE_AP_LISTENER: - conn->state = AP_CONN_STATE_SOCKS_WAIT; - break; - case CONN_TYPE_AP_TRANS_LISTENER: - TO_ENTRY_CONN(conn)->is_transparent_ap = 1; - conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - return connection_ap_process_transparent(TO_ENTRY_CONN(conn)); - case CONN_TYPE_AP_NATD_LISTENER: - TO_ENTRY_CONN(conn)->is_transparent_ap = 1; - conn->state = AP_CONN_STATE_NATD_WAIT; - break; - } - break; - case CONN_TYPE_DIR: - conn->purpose = DIR_PURPOSE_SERVER; - conn->state = DIR_CONN_STATE_SERVER_COMMAND_WAIT; - break; - case CONN_TYPE_CONTROL: - conn->state = CONTROL_CONN_STATE_NEEDAUTH; - break; - } - return 0; -} - -/** Take conn, make a nonblocking socket; try to connect to - * addr:port (they arrive in *host order*). If fail, return -1 and if - * applicable put your best guess about errno into *socket_error. - * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. - * - * address is used to make the logs useful. - * - * On success, add conn to the list of polled connections. - */ -int -connection_connect(connection_t *conn, const char *address, - const tor_addr_t *addr, uint16_t port, int *socket_error) -{ - tor_socket_t s; - int inprogress = 0; - struct sockaddr_storage addrbuf; - struct sockaddr *dest_addr; - int dest_addr_len; - const or_options_t *options = get_options(); - int protocol_family; - - if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { - warn_too_many_conns(); - *socket_error = SOCK_ERRNO(ENOBUFS); - return -1; - } - - if (tor_addr_family(addr) == AF_INET6) - protocol_family = PF_INET6; - else - protocol_family = PF_INET; - - if (get_options()->DisableNetwork) { - /* We should never even try to connect anyplace if DisableNetwork is set. - * Warn if we do, and refuse to make the connection. */ - static ratelim_t disablenet_violated = RATELIM_INIT(30*60); - *socket_error = SOCK_ERRNO(ENETUNREACH); - log_fn_ratelim(&disablenet_violated, LOG_WARN, LD_BUG, - "Tried to open a socket with DisableNetwork set."); - tor_fragile_assert(); - return -1; - } - - s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP); - if (! SOCKET_OK(s)) { - *socket_error = tor_socket_errno(-1); - log_warn(LD_NET,"Error creating network socket: %s", - tor_socket_strerror(*socket_error)); - return -1; - } - - make_socket_reuseable(s); - - if (!tor_addr_is_loopback(addr)) { - const tor_addr_t *ext_addr = NULL; - if (protocol_family == AF_INET && - !tor_addr_is_null(&options->OutboundBindAddressIPv4_)) - ext_addr = &options->OutboundBindAddressIPv4_; - else if (protocol_family == AF_INET6 && - !tor_addr_is_null(&options->OutboundBindAddressIPv6_)) - ext_addr = &options->OutboundBindAddressIPv6_; - if (ext_addr) { - struct sockaddr_storage ext_addr_sa; - socklen_t ext_addr_len = 0; - memset(&ext_addr_sa, 0, sizeof(ext_addr_sa)); - ext_addr_len = tor_addr_to_sockaddr(ext_addr, 0, - (struct sockaddr *) &ext_addr_sa, - sizeof(ext_addr_sa)); - if (ext_addr_len == 0) { - log_warn(LD_NET, - "Error converting OutboundBindAddress %s into sockaddr. " - "Ignoring.", fmt_and_decorate_addr(ext_addr)); - } else { - if (bind(s, (struct sockaddr *) &ext_addr_sa, ext_addr_len) < 0) { - *socket_error = tor_socket_errno(s); - log_warn(LD_NET,"Error binding network socket to %s: %s", - fmt_and_decorate_addr(ext_addr), - tor_socket_strerror(*socket_error)); - tor_close_socket(s); - return -1; - } - } - } - } - - if (options->ConstrainedSockets) - set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); - - memset(&addrbuf,0,sizeof(addrbuf)); - dest_addr = (struct sockaddr*) &addrbuf; - dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf)); - tor_assert(dest_addr_len > 0); - - log_debug(LD_NET, "Connecting to %s:%u.", - escaped_safe_str_client(address), port); - - if (connect(s, dest_addr, (socklen_t)dest_addr_len) < 0) { - int e = tor_socket_errno(s); - if (!ERRNO_IS_CONN_EINPROGRESS(e)) { - /* yuck. kill it. */ - *socket_error = e; - log_info(LD_NET, - "connect() to %s:%u failed: %s", - escaped_safe_str_client(address), - port, tor_socket_strerror(e)); - tor_close_socket(s); - return -1; - } else { - inprogress = 1; - } - } - - /* it succeeded. we're connected. */ - log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET, - "Connection to %s:%u %s (sock "TOR_SOCKET_T_FORMAT").", - escaped_safe_str_client(address), - port, inprogress?"in progress":"established", s); - conn->s = s; - if (connection_add_connecting(conn) < 0) { - /* no space, forget it */ - *socket_error = SOCK_ERRNO(ENOBUFS); - return -1; - } - return inprogress ? 0 : 1; -} - -/** Convert state number to string representation for logging purposes. - */ -static const char * -connection_proxy_state_to_string(int state) -{ - static const char *unknown = "???"; - static const char *states[] = { - "PROXY_NONE", - "PROXY_INFANT", - "PROXY_HTTPS_WANT_CONNECT_OK", - "PROXY_SOCKS4_WANT_CONNECT_OK", - "PROXY_SOCKS5_WANT_AUTH_METHOD_NONE", - "PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929", - "PROXY_SOCKS5_WANT_AUTH_RFC1929_OK", - "PROXY_SOCKS5_WANT_CONNECT_OK", - "PROXY_CONNECTED", - }; - - if (state < PROXY_NONE || state > PROXY_CONNECTED) - return unknown; - - return states[state]; -} - -/** Returns the global proxy type used by tor. Use this function for - * logging or high-level purposes, don't use it to fill the - * proxy_type field of or_connection_t; use the actual proxy - * protocol instead.*/ -static int -get_proxy_type(void) -{ - const or_options_t *options = get_options(); - - if (options->HTTPSProxy) - return PROXY_CONNECT; - else if (options->Socks4Proxy) - return PROXY_SOCKS4; - else if (options->Socks5Proxy) - return PROXY_SOCKS5; - else if (options->ClientTransportPlugin) - return PROXY_PLUGGABLE; - else - return PROXY_NONE; -} - -/* One byte for the version, one for the command, two for the - port, and four for the addr... and, one more for the - username NUL: */ -#define SOCKS4_STANDARD_BUFFER_SIZE (1 + 1 + 2 + 4 + 1) - -/** Write a proxy request of type (socks4, socks5, https) to conn - * for conn->addr:conn->port, authenticating with the auth details given - * in the configuration (if available). SOCKS 5 and HTTP CONNECT proxies - * support authentication. - * - * Returns -1 if conn->addr is incompatible with the proxy protocol, and - * 0 otherwise. - * - * Use connection_read_proxy_handshake() to complete the handshake. - */ -int -connection_proxy_connect(connection_t *conn, int type) -{ - const or_options_t *options; - - tor_assert(conn); - - options = get_options(); - - switch (type) { - case PROXY_CONNECT: { - char buf[1024]; - char *base64_authenticator=NULL; - const char *authenticator = options->HTTPSProxyAuthenticator; - - /* Send HTTP CONNECT and authentication (if available) in - * one request */ - - if (authenticator) { - base64_authenticator = alloc_http_authenticator(authenticator); - if (!base64_authenticator) - log_warn(LD_OR, "Encoding https authenticator failed"); - } - - if (base64_authenticator) { - const char *addrport = fmt_addrport(&conn->addr, conn->port); - tor_snprintf(buf, sizeof(buf), "CONNECT %s HTTP/1.1\r\n" - "Host: %s\r\n" - "Proxy-Authorization: Basic %s\r\n\r\n", - addrport, - addrport, - base64_authenticator); - tor_free(base64_authenticator); - } else { - tor_snprintf(buf, sizeof(buf), "CONNECT %s HTTP/1.0\r\n\r\n", - fmt_addrport(&conn->addr, conn->port)); - } - - connection_write_to_buf(buf, strlen(buf), conn); - conn->proxy_state = PROXY_HTTPS_WANT_CONNECT_OK; - break; - } - - case PROXY_SOCKS4: { - unsigned char *buf; - uint16_t portn; - uint32_t ip4addr; - size_t buf_size = 0; - char *socks_args_string = NULL; - - /* Send a SOCKS4 connect request */ - - if (tor_addr_family(&conn->addr) != AF_INET) { - log_warn(LD_NET, "SOCKS4 client is incompatible with IPv6"); - return -1; - } - - { /* If we are here because we are trying to connect to a - pluggable transport proxy, check if we have any SOCKS - arguments to transmit. If we do, compress all arguments to - a single string in 'socks_args_string': */ - - if (get_proxy_type() == PROXY_PLUGGABLE) { - socks_args_string = - pt_get_socks_args_for_proxy_addrport(&conn->addr, conn->port); - if (socks_args_string) - log_debug(LD_NET, "Sending out '%s' as our SOCKS argument string.", - socks_args_string); - } - } - - { /* Figure out the buffer size we need for the SOCKS message: */ - - buf_size = SOCKS4_STANDARD_BUFFER_SIZE; - - /* If we have a SOCKS argument string, consider its size when - calculating the buffer size: */ - if (socks_args_string) - buf_size += strlen(socks_args_string); - } - - buf = tor_malloc_zero(buf_size); - - ip4addr = tor_addr_to_ipv4n(&conn->addr); - portn = htons(conn->port); - - buf[0] = 4; /* version */ - buf[1] = SOCKS_COMMAND_CONNECT; /* command */ - memcpy(buf + 2, &portn, 2); /* port */ - memcpy(buf + 4, &ip4addr, 4); /* addr */ - - /* Next packet field is the userid. If we have pluggable - transport SOCKS arguments, we have to embed them - there. Otherwise, we use an empty userid. */ - if (socks_args_string) { /* place the SOCKS args string: */ - tor_assert(strlen(socks_args_string) > 0); - tor_assert(buf_size >= - SOCKS4_STANDARD_BUFFER_SIZE + strlen(socks_args_string)); - strlcpy((char *)buf + 8, socks_args_string, buf_size - 8); - tor_free(socks_args_string); - } else { - buf[8] = 0; /* no userid */ - } - - connection_write_to_buf((char *)buf, buf_size, conn); - tor_free(buf); - - conn->proxy_state = PROXY_SOCKS4_WANT_CONNECT_OK; - break; - } - - case PROXY_SOCKS5: { - unsigned char buf[4]; /* fields: vers, num methods, method list */ - - /* Send a SOCKS5 greeting (connect request must wait) */ - - buf[0] = 5; /* version */ - - /* We have to use SOCKS5 authentication, if we have a - Socks5ProxyUsername or if we want to pass arguments to our - pluggable transport proxy: */ - if ((options->Socks5ProxyUsername) || - (get_proxy_type() == PROXY_PLUGGABLE && - (get_socks_args_by_bridge_addrport(&conn->addr, conn->port)))) { - /* number of auth methods */ - buf[1] = 2; - buf[2] = 0x00; /* no authentication */ - buf[3] = 0x02; /* rfc1929 Username/Passwd auth */ - conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929; - } else { - buf[1] = 1; - buf[2] = 0x00; /* no authentication */ - conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_METHOD_NONE; - } - - connection_write_to_buf((char *)buf, 2 + buf[1], conn); - break; - } - - default: - log_err(LD_BUG, "Invalid proxy protocol, %d", type); - tor_fragile_assert(); - return -1; - } - - log_debug(LD_NET, "set state %s", - connection_proxy_state_to_string(conn->proxy_state)); - - return 0; -} - -/** Read conn's inbuf. If the http response from the proxy is all - * here, make sure it's good news, then return 1. If it's bad news, - * return -1. Else return 0 and hope for better luck next time. - */ -static int -connection_read_https_proxy_response(connection_t *conn) -{ - char *headers; - char *reason=NULL; - int status_code; - time_t date_header; - - switch (fetch_from_buf_http(conn->inbuf, - &headers, MAX_HEADERS_SIZE, - NULL, NULL, 10000, 0)) { - case -1: /* overflow */ - log_warn(LD_PROTOCOL, - "Your https proxy sent back an oversized response. Closing."); - return -1; - case 0: - log_info(LD_NET,"https proxy response not all here yet. Waiting."); - return 0; - /* case 1, fall through */ - } - - if (parse_http_response(headers, &status_code, &date_header, - NULL, &reason) < 0) { - log_warn(LD_NET, - "Unparseable headers from proxy (connecting to '%s'). Closing.", - conn->address); - tor_free(headers); - return -1; - } - tor_free(headers); - if (!reason) reason = tor_strdup("[no reason given]"); - - if (status_code == 200) { - log_info(LD_NET, - "HTTPS connect to '%s' successful! (200 %s) Starting TLS.", - conn->address, escaped(reason)); - tor_free(reason); - return 1; - } - /* else, bad news on the status code */ - switch (status_code) { - case 403: - log_warn(LD_NET, - "The https proxy refused to allow connection to %s " - "(status code %d, %s). Closing.", - conn->address, status_code, escaped(reason)); - break; - default: - log_warn(LD_NET, - "The https proxy sent back an unexpected status code %d (%s). " - "Closing.", - status_code, escaped(reason)); - break; - } - tor_free(reason); - return -1; -} - -/** Send SOCKS5 CONNECT command to conn, copying conn->addr - * and conn->port into the request. - */ -static void -connection_send_socks5_connect(connection_t *conn) -{ - unsigned char buf[1024]; - size_t reqsize = 6; - uint16_t port = htons(conn->port); - - buf[0] = 5; /* version */ - buf[1] = SOCKS_COMMAND_CONNECT; /* command */ - buf[2] = 0; /* reserved */ - - if (tor_addr_family(&conn->addr) == AF_INET) { - uint32_t addr = tor_addr_to_ipv4n(&conn->addr); - - buf[3] = 1; - reqsize += 4; - memcpy(buf + 4, &addr, 4); - memcpy(buf + 8, &port, 2); - } else { /* AF_INET6 */ - buf[3] = 4; - reqsize += 16; - memcpy(buf + 4, tor_addr_to_in6(&conn->addr), 16); - memcpy(buf + 20, &port, 2); - } - - connection_write_to_buf((char *)buf, reqsize, conn); - - conn->proxy_state = PROXY_SOCKS5_WANT_CONNECT_OK; -} - -/** Wrapper around fetch_from_(buf/evbuffer)_socks_client: see those functions - * for documentation of its behavior. */ -static int -connection_fetch_from_buf_socks_client(connection_t *conn, - int state, char **reason) -{ - IF_HAS_BUFFEREVENT(conn, { - struct evbuffer *input = bufferevent_get_input(conn->bufev); - return fetch_from_evbuffer_socks_client(input, state, reason); - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_from_buf_socks_client(conn->inbuf, state, reason); - } -} - -/** Call this from connection_*_process_inbuf() to advance the proxy - * handshake. - * - * No matter what proxy protocol is used, if this function returns 1, the - * handshake is complete, and the data remaining on inbuf may contain the - * start of the communication with the requested server. - * - * Returns 0 if the current buffer contains an incomplete response, and -1 - * on error. - */ -int -connection_read_proxy_handshake(connection_t *conn) -{ - int ret = 0; - char *reason = NULL; - - log_debug(LD_NET, "enter state %s", - connection_proxy_state_to_string(conn->proxy_state)); - - switch (conn->proxy_state) { - case PROXY_HTTPS_WANT_CONNECT_OK: - ret = connection_read_https_proxy_response(conn); - if (ret == 1) - conn->proxy_state = PROXY_CONNECTED; - break; - - case PROXY_SOCKS4_WANT_CONNECT_OK: - ret = connection_fetch_from_buf_socks_client(conn, - conn->proxy_state, - &reason); - if (ret == 1) - conn->proxy_state = PROXY_CONNECTED; - break; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_NONE: - ret = connection_fetch_from_buf_socks_client(conn, - conn->proxy_state, - &reason); - /* no auth needed, do connect */ - if (ret == 1) { - connection_send_socks5_connect(conn); - ret = 0; - } - break; - - case PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929: - ret = connection_fetch_from_buf_socks_client(conn, - conn->proxy_state, - &reason); - - /* send auth if needed, otherwise do connect */ - if (ret == 1) { - connection_send_socks5_connect(conn); - ret = 0; - } else if (ret == 2) { - unsigned char buf[1024]; - size_t reqsize, usize, psize; - const char *user, *pass; - char *socks_args_string = NULL; - - if (get_proxy_type() == PROXY_PLUGGABLE) { - socks_args_string = - pt_get_socks_args_for_proxy_addrport(&conn->addr, conn->port); - if (!socks_args_string) { - log_warn(LD_NET, "Could not create SOCKS args string."); - ret = -1; - break; - } - - log_debug(LD_NET, "SOCKS5 arguments: %s", socks_args_string); - tor_assert(strlen(socks_args_string) > 0); - tor_assert(strlen(socks_args_string) <= MAX_SOCKS5_AUTH_SIZE_TOTAL); - - if (strlen(socks_args_string) > MAX_SOCKS5_AUTH_FIELD_SIZE) { - user = socks_args_string; - usize = MAX_SOCKS5_AUTH_FIELD_SIZE; - pass = socks_args_string + MAX_SOCKS5_AUTH_FIELD_SIZE; - psize = strlen(socks_args_string) - MAX_SOCKS5_AUTH_FIELD_SIZE; - } else { - user = socks_args_string; - usize = strlen(socks_args_string); - pass = "\0"; - psize = 1; - } - } else if (get_options()->Socks5ProxyUsername) { - user = get_options()->Socks5ProxyUsername; - pass = get_options()->Socks5ProxyPassword; - tor_assert(user && pass); - usize = strlen(user); - psize = strlen(pass); - } else { - log_err(LD_BUG, "We entered %s for no reason!", __func__); - tor_fragile_assert(); - ret = -1; - break; - } - - /* Username and password lengths should have been checked - above and during torrc parsing. */ - tor_assert(usize <= MAX_SOCKS5_AUTH_FIELD_SIZE && - psize <= MAX_SOCKS5_AUTH_FIELD_SIZE); - reqsize = 3 + usize + psize; - - buf[0] = 1; /* negotiation version */ - buf[1] = usize; - memcpy(buf + 2, user, usize); - buf[2 + usize] = psize; - memcpy(buf + 3 + usize, pass, psize); - - if (socks_args_string) - tor_free(socks_args_string); - - connection_write_to_buf((char *)buf, reqsize, conn); - - conn->proxy_state = PROXY_SOCKS5_WANT_AUTH_RFC1929_OK; - ret = 0; - } - break; - - case PROXY_SOCKS5_WANT_AUTH_RFC1929_OK: - ret = connection_fetch_from_buf_socks_client(conn, - conn->proxy_state, - &reason); - /* send the connect request */ - if (ret == 1) { - connection_send_socks5_connect(conn); - ret = 0; - } - break; - - case PROXY_SOCKS5_WANT_CONNECT_OK: - ret = connection_fetch_from_buf_socks_client(conn, - conn->proxy_state, - &reason); - if (ret == 1) - conn->proxy_state = PROXY_CONNECTED; - break; - - default: - log_err(LD_BUG, "Invalid proxy_state for reading, %d", - conn->proxy_state); - tor_fragile_assert(); - ret = -1; - break; - } - - log_debug(LD_NET, "leaving state %s", - connection_proxy_state_to_string(conn->proxy_state)); - - if (ret < 0) { - if (reason) { - log_warn(LD_NET, "Proxy Client: unable to connect to %s:%d (%s)", - conn->address, conn->port, escaped(reason)); - tor_free(reason); - } else { - log_warn(LD_NET, "Proxy Client: unable to connect to %s:%d", - conn->address, conn->port); - } - } else if (ret == 1) { - log_info(LD_NET, "Proxy Client: connection to %s:%d successful", - conn->address, conn->port); - } - - return ret; -} - -/** Given a list of listener connections in old_conns, and list of - * port_cfg_t entries in ports, open a new listener for every port in - * ports that does not already have a listener in old_conns. - * - * Remove from old_conns every connection that has a corresponding - * entry in ports. Add to new_conns new every connection we - * launch. - * - * If control_listeners_only is true, then we only open control - * listeners, and we do not remove any noncontrol listeners from old_conns. - * - * Return 0 on success, -1 on failure. - **/ -static int -retry_listener_ports(smartlist_t *old_conns, - const smartlist_t *ports, - smartlist_t *new_conns, - int control_listeners_only) -{ - smartlist_t *launch = smartlist_new(); - int r = 0; - - if (control_listeners_only) { - SMARTLIST_FOREACH(ports, port_cfg_t *, p, { - if (p->type == CONN_TYPE_CONTROL_LISTENER) - smartlist_add(launch, p); - }); - } else { - smartlist_add_all(launch, ports); - } - - /* Iterate through old_conns, comparing it to launch: remove from both lists - * each pair of elements that corresponds to the same port. */ - SMARTLIST_FOREACH_BEGIN(old_conns, connection_t *, conn) { - const port_cfg_t *found_port = NULL; - - /* Okay, so this is a listener. Is it configured? */ - SMARTLIST_FOREACH_BEGIN(launch, const port_cfg_t *, wanted) { - if (conn->type != wanted->type) - continue; - if ((conn->socket_family != AF_UNIX && wanted->is_unix_addr) || - (conn->socket_family == AF_UNIX && ! wanted->is_unix_addr)) - continue; - - if (wanted->no_listen) - continue; /* We don't want to open a listener for this one */ - - if (wanted->is_unix_addr) { - if (conn->socket_family == AF_UNIX && - !strcmp(wanted->unix_addr, conn->address)) { - found_port = wanted; - break; - } - } else { - int port_matches; - if (wanted->port == CFG_AUTO_PORT) { - port_matches = 1; - } else { - port_matches = (wanted->port == conn->port); - } - if (port_matches && tor_addr_eq(&wanted->addr, &conn->addr)) { - found_port = wanted; - break; - } - } - } SMARTLIST_FOREACH_END(wanted); - - if (found_port) { - /* This listener is already running; we don't need to launch it. */ - //log_debug(LD_NET, "Already have %s on %s:%d", - // conn_type_to_string(found_port->type), conn->address, conn->port); - smartlist_remove(launch, found_port); - /* And we can remove the connection from old_conns too. */ - SMARTLIST_DEL_CURRENT(old_conns, conn); - } - } SMARTLIST_FOREACH_END(conn); - - /* Now open all the listeners that are configured but not opened. */ - SMARTLIST_FOREACH_BEGIN(launch, const port_cfg_t *, port) { - struct sockaddr *listensockaddr; - socklen_t listensocklen = 0; - char *address=NULL; - connection_t *conn; - int real_port = port->port == CFG_AUTO_PORT ? 0 : port->port; - tor_assert(real_port <= UINT16_MAX); - if (port->no_listen) - continue; - - if (port->is_unix_addr) { - listensockaddr = (struct sockaddr *) - create_unix_sockaddr(port->unix_addr, - &address, &listensocklen); - } else { - listensockaddr = tor_malloc(sizeof(struct sockaddr_storage)); - listensocklen = tor_addr_to_sockaddr(&port->addr, - real_port, - listensockaddr, - sizeof(struct sockaddr_storage)); - address = tor_dup_addr(&port->addr); - } - - if (listensockaddr) { - conn = connection_listener_new(listensockaddr, listensocklen, - port->type, address, port); - tor_free(listensockaddr); - tor_free(address); - } else { - conn = NULL; - } - - if (!conn) { - r = -1; - } else { - if (new_conns) - smartlist_add(new_conns, conn); - } - } SMARTLIST_FOREACH_END(port); - - smartlist_free(launch); - - return r; -} - -/** Launch listeners for each port you should have open. Only launch - * listeners who are not already open, and only close listeners we no longer - * want. - * - * Add all old conns that should be closed to replaced_conns. - * Add all new connections to new_conns. - * - * If close_all_noncontrol is true, then we only open control - * listeners, and we close all other listeners. - */ -int -retry_all_listeners(smartlist_t *replaced_conns, - smartlist_t *new_conns, int close_all_noncontrol) -{ - smartlist_t *listeners = smartlist_new(); - const or_options_t *options = get_options(); - int retval = 0; - const uint16_t old_or_port = router_get_advertised_or_port(options); - const uint16_t old_or_port_ipv6 = - router_get_advertised_or_port_by_af(options,AF_INET6); - const uint16_t old_dir_port = router_get_advertised_dir_port(options, 0); - - SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { - if (connection_is_listener(conn) && !conn->marked_for_close) - smartlist_add(listeners, conn); - } SMARTLIST_FOREACH_END(conn); - - if (retry_listener_ports(listeners, - get_configured_ports(), - new_conns, - close_all_noncontrol) < 0) - retval = -1; - - /* Any members that were still in 'listeners' don't correspond to - * any configured port. Kill 'em. */ - SMARTLIST_FOREACH_BEGIN(listeners, connection_t *, conn) { - log_notice(LD_NET, "Closing no-longer-configured %s on %s:%d", - conn_type_to_string(conn->type), conn->address, conn->port); - if (replaced_conns) { - smartlist_add(replaced_conns, conn); - } else { - connection_close_immediate(conn); - connection_mark_for_close(conn); - } - } SMARTLIST_FOREACH_END(conn); - - smartlist_free(listeners); - - if (old_or_port != router_get_advertised_or_port(options) || - old_or_port_ipv6 != router_get_advertised_or_port_by_af(options, - AF_INET6) || - old_dir_port != router_get_advertised_dir_port(options, 0)) { - /* Our chosen ORPort or DirPort is not what it used to be: the - * descriptor we had (if any) should be regenerated. (We won't - * automatically notice this because of changes in the option, - * since the value could be "auto".) */ - mark_my_descriptor_dirty("Chosen Or/DirPort changed"); - } - - return retval; -} - -/** Mark every listener of type other than CONTROL_LISTENER to be closed. */ -void -connection_mark_all_noncontrol_listeners(void) -{ - SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { - if (conn->marked_for_close) - continue; - if (conn->type == CONN_TYPE_CONTROL_LISTENER) - continue; - if (connection_is_listener(conn)) - connection_mark_for_close(conn); - } SMARTLIST_FOREACH_END(conn); -} - -/** Mark every external connection not used for controllers for close. */ -void -connection_mark_all_noncontrol_connections(void) -{ - SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { - if (conn->marked_for_close) - continue; - switch (conn->type) { - case CONN_TYPE_CPUWORKER: - case CONN_TYPE_CONTROL_LISTENER: - case CONN_TYPE_CONTROL: - break; - case CONN_TYPE_AP: - connection_mark_unattached_ap(TO_ENTRY_CONN(conn), - END_STREAM_REASON_HIBERNATING); - break; - default: - connection_mark_for_close(conn); - break; - } - } SMARTLIST_FOREACH_END(conn); -} - -/** Return 1 if we should apply rate limiting to conn, and 0 - * otherwise. - * Right now this just checks if it's an internal IP address or an - * internal connection. We also should, but don't, check if the connection - * uses pluggable transports, since we should then limit it even if it - * comes from an internal IP address. */ -static int -connection_is_rate_limited(connection_t *conn) -{ - const or_options_t *options = get_options(); - if (conn->linked) - return 0; /* Internal connection */ - else if (! options->CountPrivateBandwidth && - (tor_addr_family(&conn->addr) == AF_UNSPEC || /* no address */ - tor_addr_is_internal(&conn->addr, 0))) - return 0; /* Internal address */ - else - return 1; -} - -#ifdef USE_BUFFEREVENTS -static struct bufferevent_rate_limit_group *global_rate_limit = NULL; -#else -extern int global_read_bucket, global_write_bucket; -extern int global_relayed_read_bucket, global_relayed_write_bucket; - -/** Did either global write bucket run dry last second? If so, - * we are likely to run dry again this second, so be stingy with the - * tokens we just put in. */ -static int write_buckets_empty_last_second = 0; -#endif - -/** How many seconds of no active local circuits will make the - * connection revert to the "relayed" bandwidth class? */ -#define CLIENT_IDLE_TIME_FOR_PRIORITY 30 - -#ifndef USE_BUFFEREVENTS -/** Return 1 if conn should use tokens from the "relayed" - * bandwidth rates, else 0. Currently, only OR conns with bandwidth - * class 1, and directory conns that are serving data out, count. - */ -static int -connection_counts_as_relayed_traffic(connection_t *conn, time_t now) -{ - if (conn->type == CONN_TYPE_OR && - connection_or_client_used(TO_OR_CONN(conn)) + - CLIENT_IDLE_TIME_FOR_PRIORITY < now) - return 1; - if (conn->type == CONN_TYPE_DIR && DIR_CONN_IS_SERVER(conn)) - return 1; - return 0; -} - -/** Helper function to decide how many bytes out of global_bucket - * we're willing to use for this transaction. base is the size - * of a cell on the network; priority says whether we should - * write many of them or just a few; and conn_bucket (if - * non-negative) provides an upper limit for our answer. */ -static ssize_t -connection_bucket_round_robin(int base, int priority, - ssize_t global_bucket, ssize_t conn_bucket) -{ - ssize_t at_most; - ssize_t num_bytes_high = (priority ? 32 : 16) * base; - ssize_t num_bytes_low = (priority ? 4 : 2) * base; - - /* Do a rudimentary round-robin so one circuit can't hog a connection. - * Pick at most 32 cells, at least 4 cells if possible, and if we're in - * the middle pick 1/8 of the available bandwidth. */ - at_most = global_bucket / 8; - at_most -= (at_most % base); /* round down */ - if (at_most > num_bytes_high) /* 16 KB, or 8 KB for low-priority */ - at_most = num_bytes_high; - else if (at_most < num_bytes_low) /* 2 KB, or 1 KB for low-priority */ - at_most = num_bytes_low; - - if (at_most > global_bucket) - at_most = global_bucket; - - if (conn_bucket >= 0 && at_most > conn_bucket) - at_most = conn_bucket; - - if (at_most < 0) - return 0; - return at_most; -} - -/** How many bytes at most can we read onto this connection? */ -static ssize_t -connection_bucket_read_limit(connection_t *conn, time_t now) -{ - int base = RELAY_PAYLOAD_SIZE; - int priority = conn->type != CONN_TYPE_DIR; - int conn_bucket = -1; - int global_bucket = global_read_bucket; - - if (connection_speaks_cells(conn)) { - or_connection_t *or_conn = TO_OR_CONN(conn); - if (conn->state == OR_CONN_STATE_OPEN) - conn_bucket = or_conn->read_bucket; - base = get_cell_network_size(or_conn->wide_circ_ids); - } - - if (!connection_is_rate_limited(conn)) { - /* be willing to read on local conns even if our buckets are empty */ - return conn_bucket>=0 ? conn_bucket : 1<<14; - } - - if (connection_counts_as_relayed_traffic(conn, now) && - global_relayed_read_bucket <= global_read_bucket) - global_bucket = global_relayed_read_bucket; - - return connection_bucket_round_robin(base, priority, - global_bucket, conn_bucket); -} - -/** How many bytes at most can we write onto this connection? */ -ssize_t -connection_bucket_write_limit(connection_t *conn, time_t now) -{ - int base = RELAY_PAYLOAD_SIZE; - int priority = conn->type != CONN_TYPE_DIR; - int conn_bucket = (int)conn->outbuf_flushlen; - int global_bucket = global_write_bucket; - - if (!connection_is_rate_limited(conn)) { - /* be willing to write to local conns even if our buckets are empty */ - return conn->outbuf_flushlen; - } - - if (connection_speaks_cells(conn)) { - /* use the per-conn write limit if it's lower, but if it's less - * than zero just use zero */ - or_connection_t *or_conn = TO_OR_CONN(conn); - if (conn->state == OR_CONN_STATE_OPEN) - if (or_conn->write_bucket < conn_bucket) - conn_bucket = or_conn->write_bucket >= 0 ? - or_conn->write_bucket : 0; - base = get_cell_network_size(or_conn->wide_circ_ids); - } - - if (connection_counts_as_relayed_traffic(conn, now) && - global_relayed_write_bucket <= global_write_bucket) - global_bucket = global_relayed_write_bucket; - - return connection_bucket_round_robin(base, priority, - global_bucket, conn_bucket); -} -#else -static ssize_t -connection_bucket_read_limit(connection_t *conn, time_t now) -{ - (void) now; - return bufferevent_get_max_to_read(conn->bufev); -} -ssize_t -connection_bucket_write_limit(connection_t *conn, time_t now) -{ - (void) now; - return bufferevent_get_max_to_write(conn->bufev); -} -#endif - -/** Return 1 if the global write buckets are low enough that we - * shouldn't send attempt bytes of low-priority directory stuff - * out to conn. Else return 0. - - * Priority is 1 for v1 requests (directories and running-routers), - * and 2 for v2 requests (statuses and descriptors). But see FFFF in - * directory_handle_command_get() for why we don't use priority 2 yet. - * - * There are a lot of parameters we could use here: - * - global_relayed_write_bucket. Low is bad. - * - global_write_bucket. Low is bad. - * - bandwidthrate. Low is bad. - * - bandwidthburst. Not a big factor? - * - attempt. High is bad. - * - total bytes queued on outbufs. High is bad. But I'm wary of - * using this, since a few slow-flushing queues will pump up the - * number without meaning what we meant to mean. What we really - * mean is "total directory bytes added to outbufs recently", but - * that's harder to quantify and harder to keep track of. - */ -int -global_write_bucket_low(connection_t *conn, size_t attempt, int priority) -{ -#ifdef USE_BUFFEREVENTS - ssize_t smaller_bucket = bufferevent_get_max_to_write(conn->bufev); -#else - int smaller_bucket = global_write_bucket < global_relayed_write_bucket ? - global_write_bucket : global_relayed_write_bucket; -#endif - if (authdir_mode(get_options()) && priority>1) - return 0; /* there's always room to answer v2 if we're an auth dir */ - - if (!connection_is_rate_limited(conn)) - return 0; /* local conns don't get limited */ - - if (smaller_bucket < (int)attempt) - return 1; /* not enough space no matter the priority */ - -#ifndef USE_BUFFEREVENTS - if (write_buckets_empty_last_second) - return 1; /* we're already hitting our limits, no more please */ -#endif - - if (priority == 1) { /* old-style v1 query */ - /* Could we handle *two* of these requests within the next two seconds? */ - const or_options_t *options = get_options(); - int64_t can_write = (int64_t)smaller_bucket - + 2*(options->RelayBandwidthRate ? options->RelayBandwidthRate : - options->BandwidthRate); - if (can_write < 2*(int64_t)attempt) - return 1; - } else { /* v2 query */ - /* no further constraints yet */ - } - return 0; -} - -/** Helper: adjusts our bandwidth history and informs the controller as - * appropriate, given that we have just read num_read bytes and written - * num_written bytes on conn. */ -static void -record_num_bytes_transferred_impl(connection_t *conn, - time_t now, size_t num_read, size_t num_written) -{ - /* Count bytes of answering direct and tunneled directory requests */ - if (conn->type == CONN_TYPE_DIR && conn->purpose == DIR_PURPOSE_SERVER) { - if (num_read > 0) - rep_hist_note_dir_bytes_read(num_read, now); - if (num_written > 0) - rep_hist_note_dir_bytes_written(num_written, now); - } - - if (!connection_is_rate_limited(conn)) - return; /* local IPs are free */ - - if (conn->type == CONN_TYPE_OR) - rep_hist_note_or_conn_bytes(conn->global_identifier, num_read, - num_written, now); - - if (num_read > 0) { - rep_hist_note_bytes_read(num_read, now); - } - if (num_written > 0) { - rep_hist_note_bytes_written(num_written, now); - } - if (conn->type == CONN_TYPE_EXIT) - rep_hist_note_exit_bytes(conn->port, num_written, num_read); -} - -#ifdef USE_BUFFEREVENTS -/** Wrapper around fetch_from_(buf/evbuffer)_socks_client: see those functions - * for documentation of its behavior. */ -static void -record_num_bytes_transferred(connection_t *conn, - time_t now, size_t num_read, size_t num_written) -{ - /* XXX024 check if this is necessary */ - if (num_written >= INT_MAX || num_read >= INT_MAX) { - log_err(LD_BUG, "Value out of range. num_read=%lu, num_written=%lu, " - "connection type=%s, state=%s", - (unsigned long)num_read, (unsigned long)num_written, - conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state)); - if (num_written >= INT_MAX) num_written = 1; - if (num_read >= INT_MAX) num_read = 1; - tor_fragile_assert(); - } - - record_num_bytes_transferred_impl(conn,now,num_read,num_written); -} -#endif - -#ifndef USE_BUFFEREVENTS -/** Last time at which the global or relay buckets were emptied in msec - * since midnight. */ -static uint32_t global_relayed_read_emptied = 0, - global_relayed_write_emptied = 0, - global_read_emptied = 0, - global_write_emptied = 0; - -/** Helper: convert given tvnow time value to milliseconds since - * midnight. */ -static uint32_t -msec_since_midnight(const struct timeval *tvnow) -{ - return (uint32_t)(((tvnow->tv_sec % 86400L) * 1000L) + - ((uint32_t)tvnow->tv_usec / (uint32_t)1000L)); -} - -/** Check if a bucket which had tokens_before tokens and which got - * tokens_removed tokens removed at timestamp tvnow has run - * out of tokens, and if so, note the milliseconds since midnight in - * timestamp_var for the next TB_EMPTY event. */ -void -connection_buckets_note_empty_ts(uint32_t *timestamp_var, - int tokens_before, size_t tokens_removed, - const struct timeval *tvnow) -{ - if (tokens_before > 0 && (uint32_t)tokens_before <= tokens_removed) - *timestamp_var = msec_since_midnight(tvnow); -} - -/** We just read num_read and wrote num_written bytes - * onto conn. Decrement buckets appropriately. */ -static void -connection_buckets_decrement(connection_t *conn, time_t now, - size_t num_read, size_t num_written) -{ - if (num_written >= INT_MAX || num_read >= INT_MAX) { - log_err(LD_BUG, "Value out of range. num_read=%lu, num_written=%lu, " - "connection type=%s, state=%s", - (unsigned long)num_read, (unsigned long)num_written, - conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state)); - if (num_written >= INT_MAX) num_written = 1; - if (num_read >= INT_MAX) num_read = 1; - tor_fragile_assert(); - } - - record_num_bytes_transferred_impl(conn, now, num_read, num_written); - - if (!connection_is_rate_limited(conn)) - return; /* local IPs are free */ - - /* If one or more of our token buckets ran dry just now, note the - * timestamp for TB_EMPTY events. */ - if (get_options()->TestingEnableTbEmptyEvent) { - struct timeval tvnow; - tor_gettimeofday_cached(&tvnow); - if (connection_counts_as_relayed_traffic(conn, now)) { - connection_buckets_note_empty_ts(&global_relayed_read_emptied, - global_relayed_read_bucket, num_read, &tvnow); - connection_buckets_note_empty_ts(&global_relayed_write_emptied, - global_relayed_write_bucket, num_written, &tvnow); - } - connection_buckets_note_empty_ts(&global_read_emptied, - global_read_bucket, num_read, &tvnow); - connection_buckets_note_empty_ts(&global_write_emptied, - global_write_bucket, num_written, &tvnow); - if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN) { - or_connection_t *or_conn = TO_OR_CONN(conn); - connection_buckets_note_empty_ts(&or_conn->read_emptied_time, - or_conn->read_bucket, num_read, &tvnow); - connection_buckets_note_empty_ts(&or_conn->write_emptied_time, - or_conn->write_bucket, num_written, &tvnow); - } - } - - if (connection_counts_as_relayed_traffic(conn, now)) { - global_relayed_read_bucket -= (int)num_read; - global_relayed_write_bucket -= (int)num_written; - } - global_read_bucket -= (int)num_read; - global_write_bucket -= (int)num_written; - if (connection_speaks_cells(conn) && conn->state == OR_CONN_STATE_OPEN) { - TO_OR_CONN(conn)->read_bucket -= (int)num_read; - TO_OR_CONN(conn)->write_bucket -= (int)num_written; - } -} - -/** If we have exhausted our global buckets, or the buckets for conn, - * stop reading. */ -static void -connection_consider_empty_read_buckets(connection_t *conn) -{ - const char *reason; - - if (!connection_is_rate_limited(conn)) - return; /* Always okay. */ - - if (global_read_bucket <= 0) { - reason = "global read bucket exhausted. Pausing."; - } else if (connection_counts_as_relayed_traffic(conn, approx_time()) && - global_relayed_read_bucket <= 0) { - reason = "global relayed read bucket exhausted. Pausing."; - } else if (connection_speaks_cells(conn) && - conn->state == OR_CONN_STATE_OPEN && - TO_OR_CONN(conn)->read_bucket <= 0) { - reason = "connection read bucket exhausted. Pausing."; - } else - return; /* all good, no need to stop it */ - - LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "%s", reason)); - conn->read_blocked_on_bw = 1; - connection_stop_reading(conn); -} - -/** If we have exhausted our global buckets, or the buckets for conn, - * stop writing. */ -static void -connection_consider_empty_write_buckets(connection_t *conn) -{ - const char *reason; - - if (!connection_is_rate_limited(conn)) - return; /* Always okay. */ - - if (global_write_bucket <= 0) { - reason = "global write bucket exhausted. Pausing."; - } else if (connection_counts_as_relayed_traffic(conn, approx_time()) && - global_relayed_write_bucket <= 0) { - reason = "global relayed write bucket exhausted. Pausing."; - } else if (connection_speaks_cells(conn) && - conn->state == OR_CONN_STATE_OPEN && - TO_OR_CONN(conn)->write_bucket <= 0) { - reason = "connection write bucket exhausted. Pausing."; - } else - return; /* all good, no need to stop it */ - - LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "%s", reason)); - conn->write_blocked_on_bw = 1; - connection_stop_writing(conn); -} - -/** Initialize the global read bucket to options-\>BandwidthBurst. */ -void -connection_bucket_init(void) -{ - const or_options_t *options = get_options(); - /* start it at max traffic */ - global_read_bucket = (int)options->BandwidthBurst; - global_write_bucket = (int)options->BandwidthBurst; - if (options->RelayBandwidthRate) { - global_relayed_read_bucket = (int)options->RelayBandwidthBurst; - global_relayed_write_bucket = (int)options->RelayBandwidthBurst; - } else { - global_relayed_read_bucket = (int)options->BandwidthBurst; - global_relayed_write_bucket = (int)options->BandwidthBurst; - } -} - -/** Refill a single bucket called name with bandwidth rate per - * second rate and bandwidth burst burst, assuming that - * milliseconds_elapsed milliseconds have passed since the last - * call. */ -static void -connection_bucket_refill_helper(int *bucket, int rate, int burst, - int milliseconds_elapsed, - const char *name) -{ - int starting_bucket = *bucket; - if (starting_bucket < burst && milliseconds_elapsed > 0) { - int64_t incr = (((int64_t)rate) * milliseconds_elapsed) / 1000; - if ((burst - starting_bucket) < incr) { - *bucket = burst; /* We would overflow the bucket; just set it to - * the maximum. */ - } else { - *bucket += (int)incr; - if (*bucket > burst || *bucket < starting_bucket) { - /* If we overflow the burst, or underflow our starting bucket, - * cap the bucket value to burst. */ - /* XXXX this might be redundant now, but it doesn't show up - * in profiles. Remove it after analysis. */ - *bucket = burst; - } - } - log_debug(LD_NET,"%s now %d.", name, *bucket); - } -} - -/** Helper: return the time in milliseconds since last_empty_time - * when a bucket ran empty that previously had tokens_before tokens - * now has tokens_after tokens after refilling at timestamp - * tvnow, capped at milliseconds_elapsed milliseconds since - * last refilling that bucket. Return 0 if the bucket has not been empty - * since the last refill or has not been refilled. */ -uint32_t -bucket_millis_empty(int tokens_before, uint32_t last_empty_time, - int tokens_after, int milliseconds_elapsed, - const struct timeval *tvnow) -{ - uint32_t result = 0, refilled; - if (tokens_before <= 0 && tokens_after > tokens_before) { - refilled = msec_since_midnight(tvnow); - result = (uint32_t)((refilled + 86400L * 1000L - last_empty_time) % - (86400L * 1000L)); - if (result > (uint32_t)milliseconds_elapsed) - result = (uint32_t)milliseconds_elapsed; - } - return result; -} - -/** Time has passed; increment buckets appropriately. */ -void -connection_bucket_refill(int milliseconds_elapsed, time_t now) -{ - const or_options_t *options = get_options(); - smartlist_t *conns = get_connection_array(); - int bandwidthrate, bandwidthburst, relayrate, relayburst; - - int prev_global_read = global_read_bucket; - int prev_global_write = global_write_bucket; - int prev_relay_read = global_relayed_read_bucket; - int prev_relay_write = global_relayed_write_bucket; - struct timeval tvnow; /*< Only used if TB_EMPTY events are enabled. */ - - bandwidthrate = (int)options->BandwidthRate; - bandwidthburst = (int)options->BandwidthBurst; - - if (options->RelayBandwidthRate) { - relayrate = (int)options->RelayBandwidthRate; - relayburst = (int)options->RelayBandwidthBurst; - } else { - relayrate = bandwidthrate; - relayburst = bandwidthburst; - } - - tor_assert(milliseconds_elapsed >= 0); - - write_buckets_empty_last_second = - global_relayed_write_bucket <= 0 || global_write_bucket <= 0; - - /* refill the global buckets */ - connection_bucket_refill_helper(&global_read_bucket, - bandwidthrate, bandwidthburst, - milliseconds_elapsed, - "global_read_bucket"); - connection_bucket_refill_helper(&global_write_bucket, - bandwidthrate, bandwidthburst, - milliseconds_elapsed, - "global_write_bucket"); - connection_bucket_refill_helper(&global_relayed_read_bucket, - relayrate, relayburst, - milliseconds_elapsed, - "global_relayed_read_bucket"); - connection_bucket_refill_helper(&global_relayed_write_bucket, - relayrate, relayburst, - milliseconds_elapsed, - "global_relayed_write_bucket"); - - /* If buckets were empty before and have now been refilled, tell any - * interested controllers. */ - if (get_options()->TestingEnableTbEmptyEvent) { - uint32_t global_read_empty_time, global_write_empty_time, - relay_read_empty_time, relay_write_empty_time; - tor_gettimeofday_cached(&tvnow); - global_read_empty_time = bucket_millis_empty(prev_global_read, - global_read_emptied, global_read_bucket, - milliseconds_elapsed, &tvnow); - global_write_empty_time = bucket_millis_empty(prev_global_write, - global_write_emptied, global_write_bucket, - milliseconds_elapsed, &tvnow); - control_event_tb_empty("GLOBAL", global_read_empty_time, - global_write_empty_time, milliseconds_elapsed); - relay_read_empty_time = bucket_millis_empty(prev_relay_read, - global_relayed_read_emptied, - global_relayed_read_bucket, - milliseconds_elapsed, &tvnow); - relay_write_empty_time = bucket_millis_empty(prev_relay_write, - global_relayed_write_emptied, - global_relayed_write_bucket, - milliseconds_elapsed, &tvnow); - control_event_tb_empty("RELAY", relay_read_empty_time, - relay_write_empty_time, milliseconds_elapsed); - } - - /* refill the per-connection buckets */ - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (connection_speaks_cells(conn)) { - or_connection_t *or_conn = TO_OR_CONN(conn); - int orbandwidthrate = or_conn->bandwidthrate; - int orbandwidthburst = or_conn->bandwidthburst; - - int prev_conn_read = or_conn->read_bucket; - int prev_conn_write = or_conn->write_bucket; - - if (connection_bucket_should_increase(or_conn->read_bucket, or_conn)) { - connection_bucket_refill_helper(&or_conn->read_bucket, - orbandwidthrate, - orbandwidthburst, - milliseconds_elapsed, - "or_conn->read_bucket"); - } - if (connection_bucket_should_increase(or_conn->write_bucket, or_conn)) { - connection_bucket_refill_helper(&or_conn->write_bucket, - orbandwidthrate, - orbandwidthburst, - milliseconds_elapsed, - "or_conn->write_bucket"); - } - - /* If buckets were empty before and have now been refilled, tell any - * interested controllers. */ - if (get_options()->TestingEnableTbEmptyEvent) { - char *bucket; - uint32_t conn_read_empty_time, conn_write_empty_time; - tor_asprintf(&bucket, "ORCONN ID="U64_FORMAT, - U64_PRINTF_ARG(or_conn->base_.global_identifier)); - conn_read_empty_time = bucket_millis_empty(prev_conn_read, - or_conn->read_emptied_time, - or_conn->read_bucket, - milliseconds_elapsed, &tvnow); - conn_write_empty_time = bucket_millis_empty(prev_conn_write, - or_conn->write_emptied_time, - or_conn->write_bucket, - milliseconds_elapsed, &tvnow); - control_event_tb_empty(bucket, conn_read_empty_time, - conn_write_empty_time, - milliseconds_elapsed); - tor_free(bucket); - } - } - - if (conn->read_blocked_on_bw == 1 /* marked to turn reading back on now */ - && global_read_bucket > 0 /* and we're allowed to read */ - && (!connection_counts_as_relayed_traffic(conn, now) || - global_relayed_read_bucket > 0) /* even if we're relayed traffic */ - && (!connection_speaks_cells(conn) || - conn->state != OR_CONN_STATE_OPEN || - TO_OR_CONN(conn)->read_bucket > 0)) { - /* and either a non-cell conn or a cell conn with non-empty bucket */ - LOG_FN_CONN(conn, (LOG_DEBUG,LD_NET, - "waking up conn (fd %d) for read", (int)conn->s)); - conn->read_blocked_on_bw = 0; - connection_start_reading(conn); - } - - if (conn->write_blocked_on_bw == 1 - && global_write_bucket > 0 /* and we're allowed to write */ - && (!connection_counts_as_relayed_traffic(conn, now) || - global_relayed_write_bucket > 0) /* even if it's relayed traffic */ - && (!connection_speaks_cells(conn) || - conn->state != OR_CONN_STATE_OPEN || - TO_OR_CONN(conn)->write_bucket > 0)) { - LOG_FN_CONN(conn, (LOG_DEBUG,LD_NET, - "waking up conn (fd %d) for write", (int)conn->s)); - conn->write_blocked_on_bw = 0; - connection_start_writing(conn); - } - } SMARTLIST_FOREACH_END(conn); -} - -/** Is the bucket for connection conn low enough that we - * should add another pile of tokens to it? - */ -static int -connection_bucket_should_increase(int bucket, or_connection_t *conn) -{ - tor_assert(conn); - - if (conn->base_.state != OR_CONN_STATE_OPEN) - return 0; /* only open connections play the rate limiting game */ - if (bucket >= conn->bandwidthburst) - return 0; - - return 1; -} -#else -static void -connection_buckets_decrement(connection_t *conn, time_t now, - size_t num_read, size_t num_written) -{ - (void) conn; - (void) now; - (void) num_read; - (void) num_written; - /* Libevent does this for us. */ -} - -void -connection_bucket_refill(int seconds_elapsed, time_t now) -{ - (void) seconds_elapsed; - (void) now; - /* Libevent does this for us. */ -} -void -connection_bucket_init(void) -{ - const or_options_t *options = get_options(); - const struct timeval *tick = tor_libevent_get_one_tick_timeout(); - struct ev_token_bucket_cfg *bucket_cfg; - - uint64_t rate, burst; - if (options->RelayBandwidthRate) { - rate = options->RelayBandwidthRate; - burst = options->RelayBandwidthBurst; - } else { - rate = options->BandwidthRate; - burst = options->BandwidthBurst; - } - - /* This can't overflow, since TokenBucketRefillInterval <= 1000, - * and rate started out less than INT32_MAX. */ - rate = (rate * options->TokenBucketRefillInterval) / 1000; - - bucket_cfg = ev_token_bucket_cfg_new((uint32_t)rate, (uint32_t)burst, - (uint32_t)rate, (uint32_t)burst, - tick); - - if (!global_rate_limit) { - global_rate_limit = - bufferevent_rate_limit_group_new(tor_libevent_get_base(), bucket_cfg); - } else { - bufferevent_rate_limit_group_set_cfg(global_rate_limit, bucket_cfg); - } - ev_token_bucket_cfg_free(bucket_cfg); -} - -void -connection_get_rate_limit_totals(uint64_t *read_out, uint64_t *written_out) -{ - if (global_rate_limit == NULL) { - *read_out = *written_out = 0; - } else { - bufferevent_rate_limit_group_get_totals( - global_rate_limit, read_out, written_out); - } -} - -/** Perform whatever operations are needed on conn to enable - * rate-limiting. */ -void -connection_enable_rate_limiting(connection_t *conn) -{ - if (conn->bufev) { - if (!global_rate_limit) - connection_bucket_init(); - tor_add_bufferevent_to_rate_limit_group(conn->bufev, global_rate_limit); - } -} - -static void -connection_consider_empty_write_buckets(connection_t *conn) -{ - (void) conn; -} -static void -connection_consider_empty_read_buckets(connection_t *conn) -{ - (void) conn; -} -#endif - -/** Read bytes from conn-\>s and process them. - * - * It calls connection_read_to_buf() to bring in any new bytes, - * and then calls connection_process_inbuf() to process them. - * - * Mark the connection and return -1 if you want to close it, else - * return 0. - */ -static int -connection_handle_read_impl(connection_t *conn) -{ - ssize_t max_to_read=-1, try_to_read; - size_t before, n_read = 0; - int socket_error = 0; - - if (conn->marked_for_close) - return 0; /* do nothing */ - - conn->timestamp_lastread = approx_time(); - - switch (conn->type) { - case CONN_TYPE_OR_LISTENER: - return connection_handle_listener_read(conn, CONN_TYPE_OR); - case CONN_TYPE_EXT_OR_LISTENER: - return connection_handle_listener_read(conn, CONN_TYPE_EXT_OR); - case CONN_TYPE_AP_LISTENER: - case CONN_TYPE_AP_TRANS_LISTENER: - case CONN_TYPE_AP_NATD_LISTENER: - return connection_handle_listener_read(conn, CONN_TYPE_AP); - case CONN_TYPE_DIR_LISTENER: - return connection_handle_listener_read(conn, CONN_TYPE_DIR); - case CONN_TYPE_CONTROL_LISTENER: - return connection_handle_listener_read(conn, CONN_TYPE_CONTROL); - case CONN_TYPE_AP_DNS_LISTENER: - /* This should never happen; eventdns.c handles the reads here. */ - tor_fragile_assert(); - return 0; - } - - loop_again: - try_to_read = max_to_read; - tor_assert(!conn->marked_for_close); - - before = buf_datalen(conn->inbuf); - if (connection_read_to_buf(conn, &max_to_read, &socket_error) < 0) { - /* There's a read error; kill the connection.*/ - if (conn->type == CONN_TYPE_OR) { - connection_or_notify_error(TO_OR_CONN(conn), - socket_error != 0 ? - errno_to_orconn_end_reason(socket_error) : - END_OR_CONN_REASON_CONNRESET, - socket_error != 0 ? - tor_socket_strerror(socket_error) : - "(unknown, errno was 0)"); - } - if (CONN_IS_EDGE(conn)) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - connection_edge_end_errno(edge_conn); - if (conn->type == CONN_TYPE_AP && TO_ENTRY_CONN(conn)->socks_request) { - /* broken, don't send a socks reply back */ - TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; - } - } - connection_close_immediate(conn); /* Don't flush; connection is dead. */ - /* - * This can bypass normal channel checking since we did - * connection_or_notify_error() above. - */ - connection_mark_for_close_internal(conn); - return -1; - } - n_read += buf_datalen(conn->inbuf) - before; - if (CONN_IS_EDGE(conn) && try_to_read != max_to_read) { - /* instruct it not to try to package partial cells. */ - if (connection_process_inbuf(conn, 0) < 0) { - return -1; - } - if (!conn->marked_for_close && - connection_is_reading(conn) && - !conn->inbuf_reached_eof && - max_to_read > 0) - goto loop_again; /* try reading again, in case more is here now */ - } - /* one last try, packaging partial cells and all. */ - if (!conn->marked_for_close && - connection_process_inbuf(conn, 1) < 0) { - return -1; - } - if (conn->linked_conn) { - /* The other side's handle_write() will never actually get called, so - * we need to invoke the appropriate callbacks ourself. */ - connection_t *linked = conn->linked_conn; - - if (n_read) { - /* Probably a no-op, since linked conns typically don't count for - * bandwidth rate limiting. But do it anyway so we can keep stats - * accurately. Note that since we read the bytes from conn, and - * we're writing the bytes onto the linked connection, we count - * these as written bytes. */ - connection_buckets_decrement(linked, approx_time(), 0, n_read); - - if (connection_flushed_some(linked) < 0) - connection_mark_for_close(linked); - if (!connection_wants_to_flush(linked)) - connection_finished_flushing(linked); - } - - if (!buf_datalen(linked->outbuf) && conn->active_on_link) - connection_stop_reading_from_linked_conn(conn); - } - /* If we hit the EOF, call connection_reached_eof(). */ - if (!conn->marked_for_close && - conn->inbuf_reached_eof && - connection_reached_eof(conn) < 0) { - return -1; - } - return 0; -} - -/* DOCDOC connection_handle_read */ -int -connection_handle_read(connection_t *conn) -{ - int res; - - tor_gettimeofday_cache_clear(); - res = connection_handle_read_impl(conn); - return res; -} - -/** Pull in new bytes from conn-\>s or conn-\>linked_conn onto conn-\>inbuf, - * either directly or via TLS. Reduce the token buckets by the number of bytes - * read. - * - * If *max_to_read is -1, then decide it ourselves, else go with the - * value passed to us. When returning, if it's changed, subtract the - * number of bytes we read from *max_to_read. - * - * Return -1 if we want to break conn, else return 0. - */ -static int -connection_read_to_buf(connection_t *conn, ssize_t *max_to_read, - int *socket_error) -{ - int result; - ssize_t at_most = *max_to_read; - size_t slack_in_buf, more_to_read; - size_t n_read = 0, n_written = 0; - - if (at_most == -1) { /* we need to initialize it */ - /* how many bytes are we allowed to read? */ - at_most = connection_bucket_read_limit(conn, approx_time()); - } - - slack_in_buf = buf_slack(conn->inbuf); - again: - if ((size_t)at_most > slack_in_buf && slack_in_buf >= 1024) { - more_to_read = at_most - slack_in_buf; - at_most = slack_in_buf; - } else { - more_to_read = 0; - } - - if (connection_speaks_cells(conn) && - conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) { - int pending; - or_connection_t *or_conn = TO_OR_CONN(conn); - size_t initial_size; - if (conn->state == OR_CONN_STATE_TLS_HANDSHAKING || - conn->state == OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING) { - /* continue handshaking even if global token bucket is empty */ - return connection_tls_continue_handshake(or_conn); - } - - log_debug(LD_NET, - "%d: starting, inbuf_datalen %ld (%d pending in tls object)." - " at_most %ld.", - (int)conn->s,(long)buf_datalen(conn->inbuf), - tor_tls_get_pending_bytes(or_conn->tls), (long)at_most); - - initial_size = buf_datalen(conn->inbuf); - /* else open, or closing */ - result = read_to_buf_tls(or_conn->tls, at_most, conn->inbuf); - if (TOR_TLS_IS_ERROR(result) || result == TOR_TLS_CLOSE) - or_conn->tls_error = result; - else - or_conn->tls_error = 0; - - switch (result) { - case TOR_TLS_CLOSE: - case TOR_TLS_ERROR_IO: - log_debug(LD_NET,"TLS connection closed %son read. Closing. " - "(Nickname %s, address %s)", - result == TOR_TLS_CLOSE ? "cleanly " : "", - or_conn->nickname ? or_conn->nickname : "not set", - conn->address); - return result; - CASE_TOR_TLS_ERROR_ANY_NONIO: - log_debug(LD_NET,"tls error [%s]. breaking (nickname %s, address %s).", - tor_tls_err_to_string(result), - or_conn->nickname ? or_conn->nickname : "not set", - conn->address); - return result; - case TOR_TLS_WANTWRITE: - connection_start_writing(conn); - return 0; - case TOR_TLS_WANTREAD: - if (conn->in_connection_handle_write) { - /* We've been invoked from connection_handle_write, because we're - * waiting for a TLS renegotiation, the renegotiation started, and - * SSL_read returned WANTWRITE. But now SSL_read is saying WANTREAD - * again. Stop waiting for write events now, or else we'll - * busy-loop until data arrives for us to read. */ - connection_stop_writing(conn); - if (!connection_is_reading(conn)) - connection_start_reading(conn); - } - /* we're already reading, one hopes */ - result = 0; - break; - case TOR_TLS_DONE: /* no data read, so nothing to process */ - result = 0; - break; /* so we call bucket_decrement below */ - default: - break; - } - pending = tor_tls_get_pending_bytes(or_conn->tls); - if (pending) { - /* If we have any pending bytes, we read them now. This *can* - * take us over our read allotment, but really we shouldn't be - * believing that SSL bytes are the same as TCP bytes anyway. */ - int r2 = read_to_buf_tls(or_conn->tls, pending, conn->inbuf); - if (r2<0) { - log_warn(LD_BUG, "apparently, reading pending bytes can fail."); - return -1; - } - } - result = (int)(buf_datalen(conn->inbuf)-initial_size); - tor_tls_get_n_raw_bytes(or_conn->tls, &n_read, &n_written); - log_debug(LD_GENERAL, "After TLS read of %d: %ld read, %ld written", - result, (long)n_read, (long)n_written); - } else if (conn->linked) { - if (conn->linked_conn) { - result = move_buf_to_buf(conn->inbuf, conn->linked_conn->outbuf, - &conn->linked_conn->outbuf_flushlen); - } else { - result = 0; - } - //log_notice(LD_GENERAL, "Moved %d bytes on an internal link!", result); - /* If the other side has disappeared, or if it's been marked for close and - * we flushed its outbuf, then we should set our inbuf_reached_eof. */ - if (!conn->linked_conn || - (conn->linked_conn->marked_for_close && - buf_datalen(conn->linked_conn->outbuf) == 0)) - conn->inbuf_reached_eof = 1; - - n_read = (size_t) result; - } else { - /* !connection_speaks_cells, !conn->linked_conn. */ - int reached_eof = 0; - CONN_LOG_PROTECT(conn, - result = read_to_buf(conn->s, at_most, conn->inbuf, &reached_eof, - socket_error)); - if (reached_eof) - conn->inbuf_reached_eof = 1; - -// log_fn(LOG_DEBUG,"read_to_buf returned %d.",read_result); - - if (result < 0) - return -1; - n_read = (size_t) result; - } - - if (n_read > 0) { - /* change *max_to_read */ - *max_to_read = at_most - n_read; - - /* Update edge_conn->n_read and ocirc->n_read_circ_bw */ - if (conn->type == CONN_TYPE_AP) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - circuit_t *circ = circuit_get_by_edge_conn(edge_conn); - origin_circuit_t *ocirc; - - /* Check for overflow: */ - if (PREDICT_LIKELY(UINT32_MAX - edge_conn->n_read > n_read)) - edge_conn->n_read += (int)n_read; - else - edge_conn->n_read = UINT32_MAX; - - if (circ && CIRCUIT_IS_ORIGIN(circ)) { - ocirc = TO_ORIGIN_CIRCUIT(circ); - if (PREDICT_LIKELY(UINT32_MAX - ocirc->n_read_circ_bw > n_read)) - ocirc->n_read_circ_bw += (int)n_read; - else - ocirc->n_read_circ_bw = UINT32_MAX; - } - } - - /* If CONN_BW events are enabled, update conn->n_read_conn_bw for - * OR/DIR/EXIT connections, checking for overflow. */ - if (get_options()->TestingEnableConnBwEvent && - (conn->type == CONN_TYPE_OR || - conn->type == CONN_TYPE_DIR || - conn->type == CONN_TYPE_EXIT)) { - if (PREDICT_LIKELY(UINT32_MAX - conn->n_read_conn_bw > n_read)) - conn->n_read_conn_bw += (int)n_read; - else - conn->n_read_conn_bw = UINT32_MAX; - } - } - - connection_buckets_decrement(conn, approx_time(), n_read, n_written); - - if (more_to_read && result == at_most) { - slack_in_buf = buf_slack(conn->inbuf); - at_most = more_to_read; - goto again; - } - - /* Call even if result is 0, since the global read bucket may - * have reached 0 on a different conn, and this guy needs to - * know to stop reading. */ - connection_consider_empty_read_buckets(conn); - if (n_written > 0 && connection_is_writing(conn)) - connection_consider_empty_write_buckets(conn); - - return 0; -} - -#ifdef USE_BUFFEREVENTS -/* XXXX These generic versions could be simplified by making them - type-specific */ - -/** Callback: Invoked whenever bytes are added to or drained from an input - * evbuffer. Used to track the number of bytes read. */ -static void -evbuffer_inbuf_callback(struct evbuffer *buf, - const struct evbuffer_cb_info *info, void *arg) -{ - connection_t *conn = arg; - (void) buf; - /* XXXX These need to get real counts on the non-nested TLS case. - NM */ - if (info->n_added) { - time_t now = approx_time(); - conn->timestamp_lastread = now; - record_num_bytes_transferred(conn, now, info->n_added, 0); - connection_consider_empty_read_buckets(conn); - if (conn->type == CONN_TYPE_AP) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - /*XXXX024 check for overflow*/ - edge_conn->n_read += (int)info->n_added; - } - } -} - -/** Callback: Invoked whenever bytes are added to or drained from an output - * evbuffer. Used to track the number of bytes written. */ -static void -evbuffer_outbuf_callback(struct evbuffer *buf, - const struct evbuffer_cb_info *info, void *arg) -{ - connection_t *conn = arg; - (void)buf; - if (info->n_deleted) { - time_t now = approx_time(); - conn->timestamp_lastwritten = now; - record_num_bytes_transferred(conn, now, 0, info->n_deleted); - connection_consider_empty_write_buckets(conn); - if (conn->type == CONN_TYPE_AP) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - /*XXXX024 check for overflow*/ - edge_conn->n_written += (int)info->n_deleted; - } - } -} - -/** Callback: invoked whenever a bufferevent has read data. */ -void -connection_handle_read_cb(struct bufferevent *bufev, void *arg) -{ - connection_t *conn = arg; - (void) bufev; - if (!conn->marked_for_close) { - if (connection_process_inbuf(conn, 1)<0) /* XXXX Always 1? */ - if (!conn->marked_for_close) - connection_mark_for_close(conn); - } -} - -/** Callback: invoked whenever a bufferevent has written data. */ -void -connection_handle_write_cb(struct bufferevent *bufev, void *arg) -{ - connection_t *conn = arg; - struct evbuffer *output; - if (connection_flushed_some(conn)<0) { - if (!conn->marked_for_close) - connection_mark_for_close(conn); - return; - } - - output = bufferevent_get_output(bufev); - if (!evbuffer_get_length(output)) { - connection_finished_flushing(conn); - if (conn->marked_for_close && conn->hold_open_until_flushed) { - conn->hold_open_until_flushed = 0; - if (conn->linked) { - /* send eof */ - bufferevent_flush(conn->bufev, EV_WRITE, BEV_FINISHED); - } - } - } -} - -/** Callback: invoked whenever a bufferevent has had an event (like a - * connection, or an eof, or an error) occur. */ -void -connection_handle_event_cb(struct bufferevent *bufev, short event, void *arg) -{ - connection_t *conn = arg; - (void) bufev; - if (conn->marked_for_close) - return; - - if (event & BEV_EVENT_CONNECTED) { - tor_assert(connection_state_is_connecting(conn)); - if (connection_finished_connecting(conn)<0) - return; - } - if (event & BEV_EVENT_EOF) { - if (!conn->marked_for_close) { - conn->inbuf_reached_eof = 1; - if (connection_reached_eof(conn)<0) - return; - } - } - if (event & BEV_EVENT_ERROR) { - int socket_error = evutil_socket_geterror(conn->s); - if (conn->type == CONN_TYPE_OR && - conn->state == OR_CONN_STATE_CONNECTING) { - connection_or_connect_failed(TO_OR_CONN(conn), - errno_to_orconn_end_reason(socket_error), - tor_socket_strerror(socket_error)); - } else if (CONN_IS_EDGE(conn)) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - if (!edge_conn->edge_has_sent_end) - connection_edge_end_errno(edge_conn); - if (conn->type == CONN_TYPE_AP && TO_ENTRY_CONN(conn)->socks_request) { - /* broken, don't send a socks reply back */ - TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; - } - } - connection_close_immediate(conn); /* Connection is dead. */ - if (!conn->marked_for_close) - connection_mark_for_close(conn); - } -} - -/** Set up the generic callbacks for the bufferevent on conn. */ -void -connection_configure_bufferevent_callbacks(connection_t *conn) -{ - struct bufferevent *bufev; - struct evbuffer *input, *output; - tor_assert(conn->bufev); - bufev = conn->bufev; - bufferevent_setcb(bufev, - connection_handle_read_cb, - connection_handle_write_cb, - connection_handle_event_cb, - conn); - /* Set a fairly high write low-watermark so that we get the write callback - called whenever data is written to bring us under 128K. Leave the - high-watermark at 0. - */ - bufferevent_setwatermark(bufev, EV_WRITE, 128*1024, 0); - - input = bufferevent_get_input(bufev); - output = bufferevent_get_output(bufev); - evbuffer_add_cb(input, evbuffer_inbuf_callback, conn); - evbuffer_add_cb(output, evbuffer_outbuf_callback, conn); -} -#endif - -/** A pass-through to fetch_from_buf. */ -int -connection_fetch_from_buf(char *string, size_t len, connection_t *conn) -{ - IF_HAS_BUFFEREVENT(conn, { - /* XXX overflow -seb */ - return (int)bufferevent_read(conn->bufev, string, len); - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_from_buf(string, len, conn->inbuf); - } -} - -/** As fetch_from_buf_line(), but read from a connection's input buffer. */ -int -connection_fetch_from_buf_line(connection_t *conn, char *data, - size_t *data_len) -{ - IF_HAS_BUFFEREVENT(conn, { - int r; - size_t eol_len=0; - struct evbuffer *input = bufferevent_get_input(conn->bufev); - struct evbuffer_ptr ptr = - evbuffer_search_eol(input, NULL, &eol_len, EVBUFFER_EOL_LF); - if (ptr.pos == -1) - return 0; /* No EOL found. */ - if ((size_t)ptr.pos+eol_len >= *data_len) { - return -1; /* Too long */ - } - *data_len = ptr.pos+eol_len; - r = evbuffer_remove(input, data, ptr.pos+eol_len); - tor_assert(r >= 0); - data[ptr.pos+eol_len] = '\0'; - return 1; - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_from_buf_line(conn->inbuf, data, data_len); - } -} - -/** As fetch_from_buf_http, but fetches from a conncetion's input buffer_t or - * its bufferevent as appropriate. */ -int -connection_fetch_from_buf_http(connection_t *conn, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, - size_t max_bodylen, int force_complete) -{ - IF_HAS_BUFFEREVENT(conn, { - struct evbuffer *input = bufferevent_get_input(conn->bufev); - return fetch_from_evbuffer_http(input, headers_out, max_headerlen, - body_out, body_used, max_bodylen, force_complete); - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, - body_out, body_used, max_bodylen, force_complete); - } -} - -/** Return conn-\>outbuf_flushlen: how many bytes conn wants to flush - * from its outbuf. */ -int -connection_wants_to_flush(connection_t *conn) -{ - return conn->outbuf_flushlen > 0; -} - -/** Are there too many bytes on edge connection conn's outbuf to - * send back a relay-level sendme yet? Return 1 if so, 0 if not. Used by - * connection_edge_consider_sending_sendme(). - */ -int -connection_outbuf_too_full(connection_t *conn) -{ - return (conn->outbuf_flushlen > 10*CELL_PAYLOAD_SIZE); -} - -/** Try to flush more bytes onto conn-\>s. - * - * This function gets called either from conn_write_callback() in onion_main.c - * when libevent tells us that conn wants to write, or below - * from connection_write_to_buf() when an entire TLS record is ready. - * - * Update conn-\>timestamp_lastwritten to now, and call flush_buf - * or flush_buf_tls appropriately. If it succeeds and there are no more - * more bytes on conn-\>outbuf, then call connection_finished_flushing - * on it too. - * - * If force, then write as many bytes as possible, ignoring bandwidth - * limits. (Used for flushing messages to controller connections on fatal - * errors.) - * - * Mark the connection and return -1 if you want to close it, else - * return 0. - */ -static int -connection_handle_write_impl(connection_t *conn, int force) -{ - int e; - socklen_t len=(socklen_t)sizeof(e); - int result; - ssize_t max_to_write; - time_t now = approx_time(); - size_t n_read = 0, n_written = 0; - int dont_stop_writing = 0; - - tor_assert(!connection_is_listener(conn)); - - if (conn->marked_for_close || !SOCKET_OK(conn->s)) - return 0; /* do nothing */ - - if (conn->in_flushed_some) { - log_warn(LD_BUG, "called recursively from inside conn->in_flushed_some"); - return 0; - } - - conn->timestamp_lastwritten = now; - - /* Sometimes, "writable" means "connected". */ - if (connection_state_is_connecting(conn)) { - if (getsockopt(conn->s, SOL_SOCKET, SO_ERROR, (void*)&e, &len) < 0) { - log_warn(LD_BUG, "getsockopt() syscall failed"); - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - connection_mark_for_close(conn); - return -1; - } - if (e) { - /* some sort of error, but maybe just inprogress still */ - if (!ERRNO_IS_CONN_EINPROGRESS(e)) { - log_info(LD_NET,"in-progress connect failed. Removing. (%s)", - tor_socket_strerror(e)); - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - if (conn->type == CONN_TYPE_OR) - connection_or_notify_error(TO_OR_CONN(conn), - errno_to_orconn_end_reason(e), - tor_socket_strerror(e)); - - connection_close_immediate(conn); - /* - * This can bypass normal channel checking since we did - * connection_or_notify_error() above. - */ - connection_mark_for_close_internal(conn); - return -1; - } else { - return 0; /* no change, see if next time is better */ - } - } - /* The connection is successful. */ - if (connection_finished_connecting(conn)<0) - return -1; - } - - max_to_write = force ? (ssize_t)conn->outbuf_flushlen - : connection_bucket_write_limit(conn, now); - - if (connection_speaks_cells(conn) && - conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) { - or_connection_t *or_conn = TO_OR_CONN(conn); - size_t initial_size; - if (conn->state == OR_CONN_STATE_TLS_HANDSHAKING || - conn->state == OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING) { - connection_stop_writing(conn); - if (connection_tls_continue_handshake(or_conn) < 0) { - /* Don't flush; connection is dead. */ - connection_or_notify_error(or_conn, - END_OR_CONN_REASON_MISC, - "TLS error in connection_tls_" - "continue_handshake()"); - connection_close_immediate(conn); - /* - * This can bypass normal channel checking since we did - * connection_or_notify_error() above. - */ - connection_mark_for_close_internal(conn); - return -1; - } - return 0; - } else if (conn->state == OR_CONN_STATE_TLS_SERVER_RENEGOTIATING) { - return connection_handle_read(conn); - } - - /* else open, or closing */ - initial_size = buf_datalen(conn->outbuf); - result = flush_buf_tls(or_conn->tls, conn->outbuf, - max_to_write, &conn->outbuf_flushlen); - - /* If we just flushed the last bytes, tell the channel on the - * or_conn to check if it needs to geoip_change_dirreq_state() */ - /* XXXX move this to flushed_some or finished_flushing -NM */ - if (buf_datalen(conn->outbuf) == 0 && or_conn->chan) - channel_notify_flushed(TLS_CHAN_TO_BASE(or_conn->chan)); - - switch (result) { - CASE_TOR_TLS_ERROR_ANY: - case TOR_TLS_CLOSE: - log_info(LD_NET, result != TOR_TLS_CLOSE ? - "tls error. breaking.":"TLS connection closed on flush"); - /* Don't flush; connection is dead. */ - connection_or_notify_error(or_conn, - END_OR_CONN_REASON_MISC, - result != TOR_TLS_CLOSE ? - "TLS error in during flush" : - "TLS closed during flush"); - connection_close_immediate(conn); - /* - * This can bypass normal channel checking since we did - * connection_or_notify_error() above. - */ - connection_mark_for_close_internal(conn); - return -1; - case TOR_TLS_WANTWRITE: - log_debug(LD_NET,"wanted write."); - /* we're already writing */ - dont_stop_writing = 1; - break; - case TOR_TLS_WANTREAD: - /* Make sure to avoid a loop if the receive buckets are empty. */ - log_debug(LD_NET,"wanted read."); - if (!connection_is_reading(conn)) { - connection_stop_writing(conn); - conn->write_blocked_on_bw = 1; - /* we'll start reading again when we get more tokens in our - * read bucket; then we'll start writing again too. - */ - } - /* else no problem, we're already reading */ - return 0; - /* case TOR_TLS_DONE: - * for TOR_TLS_DONE, fall through to check if the flushlen - * is empty, so we can stop writing. - */ - } - - tor_tls_get_n_raw_bytes(or_conn->tls, &n_read, &n_written); - log_debug(LD_GENERAL, "After TLS write of %d: %ld read, %ld written", - result, (long)n_read, (long)n_written); - /* So we notice bytes were written even on error */ - /* XXXX024 This cast is safe since we can never write INT_MAX bytes in a - * single set of TLS operations. But it looks kinda ugly. If we refactor - * the *_buf_tls functions, we should make them return ssize_t or size_t - * or something. */ - result = (int)(initial_size-buf_datalen(conn->outbuf)); - } else { - CONN_LOG_PROTECT(conn, - result = flush_buf(conn->s, conn->outbuf, - max_to_write, &conn->outbuf_flushlen)); - if (result < 0) { - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - if (conn->type == CONN_TYPE_AP) { - /* writing failed; we couldn't send a SOCKS reply if we wanted to */ - TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; - } - - connection_close_immediate(conn); /* Don't flush; connection is dead. */ - connection_mark_for_close(conn); - return -1; - } - n_written = (size_t) result; - } - - if (n_written && conn->type == CONN_TYPE_AP) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - circuit_t *circ = circuit_get_by_edge_conn(edge_conn); - origin_circuit_t *ocirc; - - /* Check for overflow: */ - if (PREDICT_LIKELY(UINT32_MAX - edge_conn->n_written > n_written)) - edge_conn->n_written += (int)n_written; - else - edge_conn->n_written = UINT32_MAX; - - if (circ && CIRCUIT_IS_ORIGIN(circ)) { - ocirc = TO_ORIGIN_CIRCUIT(circ); - if (PREDICT_LIKELY(UINT32_MAX - ocirc->n_written_circ_bw > n_written)) - ocirc->n_written_circ_bw += (int)n_written; - else - ocirc->n_written_circ_bw = UINT32_MAX; - } - } - - /* If CONN_BW events are enabled, update conn->n_written_conn_bw for - * OR/DIR/EXIT connections, checking for overflow. */ - if (n_written && get_options()->TestingEnableConnBwEvent && - (conn->type == CONN_TYPE_OR || - conn->type == CONN_TYPE_DIR || - conn->type == CONN_TYPE_EXIT)) { - if (PREDICT_LIKELY(UINT32_MAX - conn->n_written_conn_bw > n_written)) - conn->n_written_conn_bw += (int)n_written; - else - conn->n_written_conn_bw = UINT32_MAX; - } - - connection_buckets_decrement(conn, approx_time(), n_read, n_written); - - if (result > 0) { - /* If we wrote any bytes from our buffer, then call the appropriate - * functions. */ - if (connection_flushed_some(conn) < 0) { - if (connection_speaks_cells(conn)) { - connection_or_notify_error(TO_OR_CONN(conn), - END_OR_CONN_REASON_MISC, - "Got error back from " - "connection_flushed_some()"); - } - - /* - * This can bypass normal channel checking since we did - * connection_or_notify_error() above. - */ - connection_mark_for_close_internal(conn); - } - } - - if (!connection_wants_to_flush(conn) && - !dont_stop_writing) { /* it's done flushing */ - if (connection_finished_flushing(conn) < 0) { - /* already marked */ - return -1; - } - return 0; - } - - /* Call even if result is 0, since the global write bucket may - * have reached 0 on a different conn, and this guy needs to - * know to stop writing. */ - connection_consider_empty_write_buckets(conn); - if (n_read > 0 && connection_is_reading(conn)) - connection_consider_empty_read_buckets(conn); - - return 0; -} - -/* DOCDOC connection_handle_write */ -int -connection_handle_write(connection_t *conn, int force) -{ - int res; - tor_gettimeofday_cache_clear(); - conn->in_connection_handle_write = 1; - res = connection_handle_write_impl(conn, force); - conn->in_connection_handle_write = 0; - return res; -} - -/** - * Try to flush data that's waiting for a write on conn. Return - * -1 on failure, 0 on success. - * - * Don't use this function for regular writing; the buffers/bufferevents - * system should be good enough at scheduling writes there. Instead, this - * function is for cases when we're about to exit or something and we want - * to report it right away. - */ -int -connection_flush(connection_t *conn) -{ - IF_HAS_BUFFEREVENT(conn, { - int r = bufferevent_flush(conn->bufev, EV_WRITE, BEV_FLUSH); - return (r < 0) ? -1 : 0; - }); - return connection_handle_write(conn, 1); -} - -/** Append len bytes of string onto conn's - * outbuf, and ask it to start writing. - * - * If zlib is nonzero, this is a directory connection that should get - * its contents compressed or decompressed as they're written. If zlib is - * negative, this is the last data to be compressed, and the connection's zlib - * state should be flushed. - * - * If it's a local control connection and a 64k chunk is ready, try to flush - * it all, so we don't end up with many megabytes of controller info queued at - * once. - */ -MOCK_IMPL(void, -connection_write_to_buf_impl_,(const char *string, size_t len, - connection_t *conn, int zlib)) -{ - /* XXXX This function really needs to return -1 on failure. */ - int r; - size_t old_datalen; - if (!len && !(zlib<0)) - return; - /* if it's marked for close, only allow write if we mean to flush it */ - if (conn->marked_for_close && !conn->hold_open_until_flushed) - return; - - IF_HAS_BUFFEREVENT(conn, { - if (zlib) { - int done = zlib < 0; - r = write_to_evbuffer_zlib(bufferevent_get_output(conn->bufev), - TO_DIR_CONN(conn)->zlib_state, - string, len, done); - } else { - r = bufferevent_write(conn->bufev, string, len); - } - if (r < 0) { - /* XXXX mark for close? */ - log_warn(LD_NET, "bufferevent_write failed! That shouldn't happen."); - } - return; - }); - - old_datalen = buf_datalen(conn->outbuf); - if (zlib) { - dir_connection_t *dir_conn = TO_DIR_CONN(conn); - int done = zlib < 0; - CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf, - dir_conn->zlib_state, - string, len, done)); - } else { - CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf)); - } - if (r < 0) { - if (CONN_IS_EDGE(conn)) { - /* if it failed, it means we have our package/delivery windows set - wrong compared to our max outbuf size. close the whole circuit. */ - log_warn(LD_NET, - "write_to_buf failed. Closing circuit (fd %d).", (int)conn->s); - circuit_mark_for_close(circuit_get_by_edge_conn(TO_EDGE_CONN(conn)), - END_CIRC_REASON_INTERNAL); - } else { - log_warn(LD_NET, - "write_to_buf failed. Closing connection (fd %d).", - (int)conn->s); - connection_mark_for_close(conn); - } - return; - } - - /* If we receive optimistic data in the EXIT_CONN_STATE_RESOLVING - * state, we don't want to try to write it right away, since - * conn->write_event won't be set yet. Otherwise, write data from - * this conn as the socket is available. */ - if (conn->write_event) { - connection_start_writing(conn); - } - if (zlib) { - conn->outbuf_flushlen += buf_datalen(conn->outbuf) - old_datalen; - } else { - conn->outbuf_flushlen += len; - - /* Should we try flushing the outbuf now? */ - if (conn->in_flushed_some) { - /* Don't flush the outbuf when the reason we're writing more stuff is - * _because_ we flushed the outbuf. That's unfair. */ - return; - } - - if (conn->type == CONN_TYPE_CONTROL && - !connection_is_rate_limited(conn) && - conn->outbuf_flushlen-len < 1<<16 && - conn->outbuf_flushlen >= 1<<16) { - /* just try to flush all of it */ - } else - return; /* no need to try flushing */ - - if (connection_handle_write(conn, 0) < 0) { - if (!conn->marked_for_close) { - /* this connection is broken. remove it. */ - log_warn(LD_BUG, "unhandled error on write for " - "conn (type %d, fd %d); removing", - conn->type, (int)conn->s); - tor_fragile_assert(); - /* do a close-immediate here, so we don't try to flush */ - connection_close_immediate(conn); - } - return; - } - } -} - -/** Return a connection with given type, address, port, and purpose; - * or NULL if no such connection exists. */ -connection_t * -connection_get_by_type_addr_port_purpose(int type, - const tor_addr_t *addr, uint16_t port, - int purpose) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == type && - tor_addr_eq(&conn->addr, addr) && - conn->port == port && - conn->purpose == purpose && - !conn->marked_for_close) - return conn; - }); - return NULL; -} - -/** Return the stream with id id if it is not already marked for - * close. - */ -connection_t * -connection_get_by_global_id(uint64_t id) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->global_identifier == id) - return conn; - }); - return NULL; -} - -/** Return a connection of type type that is not marked for close. - */ -connection_t * -connection_get_by_type(int type) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == type && !conn->marked_for_close) - return conn; - }); - return NULL; -} - -/** Return a connection of type type that is in state state, - * and that is not marked for close. - */ -connection_t * -connection_get_by_type_state(int type, int state) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == type && conn->state == state && !conn->marked_for_close) - return conn; - }); - return NULL; -} - -/** Return a connection of type type that has rendquery equal - * to rendquery, and that is not marked for close. If state - * is non-zero, conn must be of that state too. - */ -connection_t * -connection_get_by_type_state_rendquery(int type, int state, - const char *rendquery) -{ - smartlist_t *conns = get_connection_array(); - - tor_assert(type == CONN_TYPE_DIR || - type == CONN_TYPE_AP || type == CONN_TYPE_EXIT); - tor_assert(rendquery); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->type == type && - !conn->marked_for_close && - (!state || state == conn->state)) { - if (type == CONN_TYPE_DIR && - TO_DIR_CONN(conn)->rend_data && - !rend_cmp_service_ids(rendquery, - TO_DIR_CONN(conn)->rend_data->onion_address)) - return conn; - else if (CONN_IS_EDGE(conn) && - TO_EDGE_CONN(conn)->rend_data && - !rend_cmp_service_ids(rendquery, - TO_EDGE_CONN(conn)->rend_data->onion_address)) - return conn; - } - } SMARTLIST_FOREACH_END(conn); - return NULL; -} - -/** Return a directory connection (if any one exists) that is fetching - * the item described by state/resource */ -dir_connection_t * -connection_dir_get_by_purpose_and_resource(int purpose, - const char *resource) -{ - smartlist_t *conns = get_connection_array(); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - dir_connection_t *dirconn; - if (conn->type != CONN_TYPE_DIR || conn->marked_for_close || - conn->purpose != purpose) - continue; - dirconn = TO_DIR_CONN(conn); - if (dirconn->requested_resource == NULL) { - if (resource == NULL) - return dirconn; - } else if (resource) { - if (0 == strcmp(resource, dirconn->requested_resource)) - return dirconn; - } - } SMARTLIST_FOREACH_END(conn); - - return NULL; -} - -/** Return an open, non-marked connection of a given type and purpose, or NULL - * if no such connection exists. */ -connection_t * -connection_get_by_type_purpose(int type, int purpose) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == type && - !conn->marked_for_close && - (purpose == conn->purpose)) - return conn; - }); - return NULL; -} - -/** Return 1 if conn is a listener conn, else return 0. */ -int -connection_is_listener(connection_t *conn) -{ - if (conn->type == CONN_TYPE_OR_LISTENER || - conn->type == CONN_TYPE_EXT_OR_LISTENER || - conn->type == CONN_TYPE_AP_LISTENER || - conn->type == CONN_TYPE_AP_TRANS_LISTENER || - conn->type == CONN_TYPE_AP_DNS_LISTENER || - conn->type == CONN_TYPE_AP_NATD_LISTENER || - conn->type == CONN_TYPE_DIR_LISTENER || - conn->type == CONN_TYPE_CONTROL_LISTENER) - return 1; - return 0; -} - -/** Return 1 if conn is in state "open" and is not marked - * for close, else return 0. - */ -int -connection_state_is_open(connection_t *conn) -{ - tor_assert(conn); - - if (conn->marked_for_close) - return 0; - - if ((conn->type == CONN_TYPE_OR && conn->state == OR_CONN_STATE_OPEN) || - (conn->type == CONN_TYPE_EXT_OR) || - (conn->type == CONN_TYPE_AP && conn->state == AP_CONN_STATE_OPEN) || - (conn->type == CONN_TYPE_EXIT && conn->state == EXIT_CONN_STATE_OPEN) || - (conn->type == CONN_TYPE_CONTROL && - conn->state == CONTROL_CONN_STATE_OPEN)) - return 1; - - return 0; -} - -/** Return 1 if conn is in 'connecting' state, else return 0. */ -int -connection_state_is_connecting(connection_t *conn) -{ - tor_assert(conn); - - if (conn->marked_for_close) - return 0; - switch (conn->type) - { - case CONN_TYPE_OR: - return conn->state == OR_CONN_STATE_CONNECTING; - case CONN_TYPE_EXIT: - return conn->state == EXIT_CONN_STATE_CONNECTING; - case CONN_TYPE_DIR: - return conn->state == DIR_CONN_STATE_CONNECTING; - } - - return 0; -} - -/** Allocates a base64'ed authenticator for use in http or https - * auth, based on the input string authenticator. Returns it - * if success, else returns NULL. */ -char * -alloc_http_authenticator(const char *authenticator) -{ - /* an authenticator in Basic authentication - * is just the string "username:password" */ - const size_t authenticator_length = strlen(authenticator); - /* The base64_encode function needs a minimum buffer length - * of 66 bytes. */ - const size_t base64_authenticator_length = (authenticator_length/48+1)*66; - char *base64_authenticator = tor_malloc(base64_authenticator_length); - if (base64_encode(base64_authenticator, base64_authenticator_length, - authenticator, authenticator_length) < 0) { - tor_free(base64_authenticator); /* free and set to null */ - } else { - int i = 0, j = 0; - ssize_t len = strlen(base64_authenticator); - - /* remove all newline occurrences within the string */ - for (i=0; i < len; ++i) { - if ('\n' != base64_authenticator[i]) { - base64_authenticator[j] = base64_authenticator[i]; - ++j; - } - } - base64_authenticator[j]='\0'; - } - return base64_authenticator; -} - -/** Given a socket handle, check whether the local address (sockname) of the - * socket is one that we've connected from before. If so, double-check - * whether our address has changed and we need to generate keys. If we do, - * call init_keys(). - */ -static void -client_check_address_changed(tor_socket_t sock) -{ - struct sockaddr_storage out_sockaddr; - socklen_t out_addr_len = (socklen_t) sizeof(out_sockaddr); - tor_addr_t out_addr, iface_addr; - tor_addr_t **last_interface_ip_ptr; - sa_family_t family; - - if (!outgoing_addrs) - outgoing_addrs = smartlist_new(); - - if (getsockname(sock, (struct sockaddr*)&out_sockaddr, &out_addr_len)<0) { - int e = tor_socket_errno(sock); - log_warn(LD_NET, "getsockname() to check for address change failed: %s", - tor_socket_strerror(e)); - return; - } - tor_addr_from_sockaddr(&out_addr, (struct sockaddr*)&out_sockaddr, NULL); - family = tor_addr_family(&out_addr); - - if (family == AF_INET) - last_interface_ip_ptr = &last_interface_ipv4; - else if (family == AF_INET6) - last_interface_ip_ptr = &last_interface_ipv6; - else - return; - - if (! *last_interface_ip_ptr) { - tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t)); - if (get_interface_address6(LOG_INFO, family, a)==0) { - *last_interface_ip_ptr = a; - } else { - tor_free(a); - } - } - - /* If we've used this address previously, we're okay. */ - SMARTLIST_FOREACH(outgoing_addrs, const tor_addr_t *, a_ptr, - if (tor_addr_eq(a_ptr, &out_addr)) - return; - ); - - /* Uh-oh. We haven't connected from this address before. Has the interface - * address changed? */ - if (get_interface_address6(LOG_INFO, family, &iface_addr)<0) - return; - - if (tor_addr_eq(&iface_addr, *last_interface_ip_ptr)) { - /* Nope, it hasn't changed. Add this address to the list. */ - smartlist_add(outgoing_addrs, tor_memdup(&out_addr, sizeof(tor_addr_t))); - } else { - /* The interface changed. We're a client, so we need to regenerate our - * keys. First, reset the state. */ - log_notice(LD_NET, "Our IP address has changed. Rotating keys..."); - tor_addr_copy(*last_interface_ip_ptr, &iface_addr); - SMARTLIST_FOREACH(outgoing_addrs, tor_addr_t*, a_ptr, tor_free(a_ptr)); - smartlist_clear(outgoing_addrs); - smartlist_add(outgoing_addrs, tor_memdup(&out_addr, sizeof(tor_addr_t))); - /* Okay, now change our keys. */ - ip_address_changed(1); - } -} - -/** Some systems have limited system buffers for recv and xmit on - * sockets allocated in a virtual server or similar environment. For a Tor - * server this can produce the "Error creating network socket: No buffer - * space available" error once all available TCP buffer space is consumed. - * This method will attempt to constrain the buffers allocated for the socket - * to the desired size to stay below system TCP buffer limits. - */ -static void -set_constrained_socket_buffers(tor_socket_t sock, int size) -{ - void *sz = (void*)&size; - socklen_t sz_sz = (socklen_t) sizeof(size); - if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, sz, sz_sz) < 0) { - int e = tor_socket_errno(sock); - log_warn(LD_NET, "setsockopt() to constrain send " - "buffer to %d bytes failed: %s", size, tor_socket_strerror(e)); - } - if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, sz, sz_sz) < 0) { - int e = tor_socket_errno(sock); - log_warn(LD_NET, "setsockopt() to constrain recv " - "buffer to %d bytes failed: %s", size, tor_socket_strerror(e)); - } -} - -/** Process new bytes that have arrived on conn-\>inbuf. - * - * This function just passes conn to the connection-specific - * connection_*_process_inbuf() function. It also passes in - * package_partial if wanted. - */ -static int -connection_process_inbuf(connection_t *conn, int package_partial) -{ - tor_assert(conn); - - switch (conn->type) { - case CONN_TYPE_OR: - return connection_or_process_inbuf(TO_OR_CONN(conn)); - case CONN_TYPE_EXT_OR: - return connection_ext_or_process_inbuf(TO_OR_CONN(conn)); - case CONN_TYPE_EXIT: - case CONN_TYPE_AP: - return connection_edge_process_inbuf(TO_EDGE_CONN(conn), - package_partial); - case CONN_TYPE_DIR: - return connection_dir_process_inbuf(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_process_inbuf(conn); - case CONN_TYPE_CONTROL: - return connection_control_process_inbuf(TO_CONTROL_CONN(conn)); - default: - log_err(LD_BUG,"got unexpected conn type %d.", conn->type); - tor_fragile_assert(); - return -1; - } -} - -/** Called whenever we've written data on a connection. */ -static int -connection_flushed_some(connection_t *conn) -{ - int r = 0; - tor_assert(!conn->in_flushed_some); - conn->in_flushed_some = 1; - if (conn->type == CONN_TYPE_DIR && - conn->state == DIR_CONN_STATE_SERVER_WRITING) { - r = connection_dirserv_flushed_some(TO_DIR_CONN(conn)); - } else if (conn->type == CONN_TYPE_OR) { - r = connection_or_flushed_some(TO_OR_CONN(conn)); - } else if (CONN_IS_EDGE(conn)) { - r = connection_edge_flushed_some(TO_EDGE_CONN(conn)); - } - conn->in_flushed_some = 0; - return r; -} - -/** We just finished flushing bytes to the appropriately low network layer, - * and there are no more bytes remaining in conn-\>outbuf, conn-\>bev, or - * conn-\>tls to be flushed. - * - * This function just passes conn to the connection-specific - * connection_*_finished_flushing() function. - */ -static int -connection_finished_flushing(connection_t *conn) -{ - tor_assert(conn); - - /* If the connection is closed, don't try to do anything more here. */ - if (CONN_IS_CLOSED(conn)) - return 0; - -// log_fn(LOG_DEBUG,"entered. Socket %u.", conn->s); - - IF_HAS_NO_BUFFEREVENT(conn) - connection_stop_writing(conn); - - switch (conn->type) { - case CONN_TYPE_OR: - return connection_or_finished_flushing(TO_OR_CONN(conn)); - case CONN_TYPE_EXT_OR: - return connection_ext_or_finished_flushing(TO_OR_CONN(conn)); - case CONN_TYPE_AP: - case CONN_TYPE_EXIT: - return connection_edge_finished_flushing(TO_EDGE_CONN(conn)); - case CONN_TYPE_DIR: - return connection_dir_finished_flushing(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_finished_flushing(conn); - case CONN_TYPE_CONTROL: - return connection_control_finished_flushing(TO_CONTROL_CONN(conn)); - default: - log_err(LD_BUG,"got unexpected conn type %d.", conn->type); - tor_fragile_assert(); - return -1; - } -} - -/** Called when our attempt to connect() to another server has just - * succeeded. - * - * This function just passes conn to the connection-specific - * connection_*_finished_connecting() function. - */ -static int -connection_finished_connecting(connection_t *conn) -{ - tor_assert(conn); - - if (!server_mode(get_options())) { - /* See whether getsockname() says our address changed. We need to do this - * now that the connection has finished, because getsockname() on Windows - * won't work until then. */ - client_check_address_changed(conn->s); - } - - switch (conn->type) - { - case CONN_TYPE_OR: - return connection_or_finished_connecting(TO_OR_CONN(conn)); - case CONN_TYPE_EXIT: - return connection_edge_finished_connecting(TO_EDGE_CONN(conn)); - case CONN_TYPE_DIR: - return connection_dir_finished_connecting(TO_DIR_CONN(conn)); - default: - log_err(LD_BUG,"got unexpected conn type %d.", conn->type); - tor_fragile_assert(); - return -1; - } -} - -/** Callback: invoked when a connection reaches an EOF event. */ -static int -connection_reached_eof(connection_t *conn) -{ - switch (conn->type) { - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - return connection_or_reached_eof(TO_OR_CONN(conn)); - case CONN_TYPE_AP: - case CONN_TYPE_EXIT: - return connection_edge_reached_eof(TO_EDGE_CONN(conn)); - case CONN_TYPE_DIR: - return connection_dir_reached_eof(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_reached_eof(conn); - case CONN_TYPE_CONTROL: - return connection_control_reached_eof(TO_CONTROL_CONN(conn)); - default: - log_err(LD_BUG,"got unexpected conn type %d.", conn->type); - tor_fragile_assert(); - return -1; - } -} - -/** Log how many bytes are used by buffers of different kinds and sizes. */ -void -connection_dump_buffer_mem_stats(int severity) -{ - uint64_t used_by_type[CONN_TYPE_MAX_+1]; - uint64_t alloc_by_type[CONN_TYPE_MAX_+1]; - int n_conns_by_type[CONN_TYPE_MAX_+1]; - uint64_t total_alloc = 0; - uint64_t total_used = 0; - int i; - smartlist_t *conns = get_connection_array(); - - memset(used_by_type, 0, sizeof(used_by_type)); - memset(alloc_by_type, 0, sizeof(alloc_by_type)); - memset(n_conns_by_type, 0, sizeof(n_conns_by_type)); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, c) { - int tp = c->type; - ++n_conns_by_type[tp]; - if (c->inbuf) { - used_by_type[tp] += buf_datalen(c->inbuf); - alloc_by_type[tp] += buf_allocation(c->inbuf); - } - if (c->outbuf) { - used_by_type[tp] += buf_datalen(c->outbuf); - alloc_by_type[tp] += buf_allocation(c->outbuf); - } - } SMARTLIST_FOREACH_END(c); - for (i=0; i <= CONN_TYPE_MAX_; ++i) { - total_used += used_by_type[i]; - total_alloc += alloc_by_type[i]; - } - - tor_log(severity, LD_GENERAL, - "In buffers for %d connections: "U64_FORMAT" used/"U64_FORMAT" allocated", - smartlist_len(conns), - U64_PRINTF_ARG(total_used), U64_PRINTF_ARG(total_alloc)); - for (i=CONN_TYPE_MIN_; i <= CONN_TYPE_MAX_; ++i) { - if (!n_conns_by_type[i]) - continue; - tor_log(severity, LD_GENERAL, - " For %d %s connections: "U64_FORMAT" used/"U64_FORMAT" allocated", - n_conns_by_type[i], conn_type_to_string(i), - U64_PRINTF_ARG(used_by_type[i]), U64_PRINTF_ARG(alloc_by_type[i])); - } -} - -/** Verify that connection conn has all of its invariants - * correct. Trigger an assert if anything is invalid. - */ -void -assert_connection_ok(connection_t *conn, time_t now) -{ - (void) now; /* XXXX unused. */ - tor_assert(conn); - tor_assert(conn->type >= CONN_TYPE_MIN_); - tor_assert(conn->type <= CONN_TYPE_MAX_); - -#ifdef USE_BUFFEREVENTS - if (conn->bufev) { - tor_assert(conn->read_event == NULL); - tor_assert(conn->write_event == NULL); - tor_assert(conn->inbuf == NULL); - tor_assert(conn->outbuf == NULL); - } -#endif - - switch (conn->type) { - case CONN_TYPE_OR: - case CONN_TYPE_EXT_OR: - tor_assert(conn->magic == OR_CONNECTION_MAGIC); - break; - case CONN_TYPE_AP: - tor_assert(conn->magic == ENTRY_CONNECTION_MAGIC); - break; - case CONN_TYPE_EXIT: - tor_assert(conn->magic == EDGE_CONNECTION_MAGIC); - break; - case CONN_TYPE_DIR: - tor_assert(conn->magic == DIR_CONNECTION_MAGIC); - break; - case CONN_TYPE_CONTROL: - tor_assert(conn->magic == CONTROL_CONNECTION_MAGIC); - break; - CASE_ANY_LISTENER_TYPE: - tor_assert(conn->magic == LISTENER_CONNECTION_MAGIC); - break; - default: - tor_assert(conn->magic == BASE_CONNECTION_MAGIC); - break; - } - - if (conn->linked_conn) { - tor_assert(conn->linked_conn->linked_conn == conn); - tor_assert(conn->linked); - } - if (conn->linked) - tor_assert(!SOCKET_OK(conn->s)); - - if (conn->outbuf_flushlen > 0) { - /* With optimistic data, we may have queued data in - * EXIT_CONN_STATE_RESOLVING while the conn is not yet marked to writing. - * */ - tor_assert((conn->type == CONN_TYPE_EXIT && - conn->state == EXIT_CONN_STATE_RESOLVING) || - connection_is_writing(conn) || - conn->write_blocked_on_bw || - (CONN_IS_EDGE(conn) && - TO_EDGE_CONN(conn)->edge_blocked_on_circ)); - } - - if (conn->hold_open_until_flushed) - tor_assert(conn->marked_for_close); - - /* XXXX check: read_blocked_on_bw, write_blocked_on_bw, s, conn_array_index, - * marked_for_close. */ - - /* buffers */ - if (conn->inbuf) - assert_buf_ok(conn->inbuf); - if (conn->outbuf) - assert_buf_ok(conn->outbuf); - - if (conn->type == CONN_TYPE_OR) { - or_connection_t *or_conn = TO_OR_CONN(conn); - if (conn->state == OR_CONN_STATE_OPEN) { - /* tor_assert(conn->bandwidth > 0); */ - /* the above isn't necessarily true: if we just did a TLS - * handshake but we didn't recognize the other peer, or it - * gave a bad cert/etc, then we won't have assigned bandwidth, - * yet it will be open. -RD - */ -// tor_assert(conn->read_bucket >= 0); - } -// tor_assert(conn->addr && conn->port); - tor_assert(conn->address); - if (conn->state > OR_CONN_STATE_PROXY_HANDSHAKING) - tor_assert(or_conn->tls); - } - - if (CONN_IS_EDGE(conn)) { - /* XXX unchecked: package window, deliver window. */ - if (conn->type == CONN_TYPE_AP) { - entry_connection_t *entry_conn = TO_ENTRY_CONN(conn); - if (entry_conn->chosen_exit_optional || entry_conn->chosen_exit_retries) - tor_assert(entry_conn->chosen_exit_name); - - tor_assert(entry_conn->socks_request); - if (conn->state == AP_CONN_STATE_OPEN) { - tor_assert(entry_conn->socks_request->has_finished); - if (!conn->marked_for_close) { - tor_assert(ENTRY_TO_EDGE_CONN(entry_conn)->cpath_layer); - assert_cpath_layer_ok(ENTRY_TO_EDGE_CONN(entry_conn)->cpath_layer); - } - } - } - if (conn->type == CONN_TYPE_EXIT) { - tor_assert(conn->purpose == EXIT_PURPOSE_CONNECT || - conn->purpose == EXIT_PURPOSE_RESOLVE); - } - } else if (conn->type == CONN_TYPE_DIR) { - } else { - /* Purpose is only used for dir and exit types currently */ - tor_assert(!conn->purpose); - } - - switch (conn->type) - { - CASE_ANY_LISTENER_TYPE: - tor_assert(conn->state == LISTENER_STATE_READY); - break; - case CONN_TYPE_OR: - tor_assert(conn->state >= OR_CONN_STATE_MIN_); - tor_assert(conn->state <= OR_CONN_STATE_MAX_); - break; - case CONN_TYPE_EXT_OR: - tor_assert(conn->state >= EXT_OR_CONN_STATE_MIN_); - tor_assert(conn->state <= EXT_OR_CONN_STATE_MAX_); - break; - case CONN_TYPE_EXIT: - tor_assert(conn->state >= EXIT_CONN_STATE_MIN_); - tor_assert(conn->state <= EXIT_CONN_STATE_MAX_); - tor_assert(conn->purpose >= EXIT_PURPOSE_MIN_); - tor_assert(conn->purpose <= EXIT_PURPOSE_MAX_); - break; - case CONN_TYPE_AP: - tor_assert(conn->state >= AP_CONN_STATE_MIN_); - tor_assert(conn->state <= AP_CONN_STATE_MAX_); - tor_assert(TO_ENTRY_CONN(conn)->socks_request); - break; - case CONN_TYPE_DIR: - tor_assert(conn->state >= DIR_CONN_STATE_MIN_); - tor_assert(conn->state <= DIR_CONN_STATE_MAX_); - tor_assert(conn->purpose >= DIR_PURPOSE_MIN_); - tor_assert(conn->purpose <= DIR_PURPOSE_MAX_); - break; - case CONN_TYPE_CPUWORKER: - tor_assert(conn->state >= CPUWORKER_STATE_MIN_); - tor_assert(conn->state <= CPUWORKER_STATE_MAX_); - break; - case CONN_TYPE_CONTROL: - tor_assert(conn->state >= CONTROL_CONN_STATE_MIN_); - tor_assert(conn->state <= CONTROL_CONN_STATE_MAX_); - break; - default: - tor_assert(0); - } -} - -/** Fills addr and port with the details of the global - * proxy server we are using. - * conn contains the connection we are using the proxy for. - * - * Return 0 on success, -1 on failure. - */ -int -get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type, - const connection_t *conn) -{ - const or_options_t *options = get_options(); - - if (options->HTTPSProxy) { - tor_addr_copy(addr, &options->HTTPSProxyAddr); - *port = options->HTTPSProxyPort; - *proxy_type = PROXY_CONNECT; - return 0; - } else if (options->Socks4Proxy) { - tor_addr_copy(addr, &options->Socks4ProxyAddr); - *port = options->Socks4ProxyPort; - *proxy_type = PROXY_SOCKS4; - return 0; - } else if (options->Socks5Proxy) { - tor_addr_copy(addr, &options->Socks5ProxyAddr); - *port = options->Socks5ProxyPort; - *proxy_type = PROXY_SOCKS5; - return 0; - } else if (options->ClientTransportPlugin || - options->Bridges) { - const transport_t *transport = NULL; - int r; - r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport); - if (r<0) - return -1; - if (transport) { /* transport found */ - tor_addr_copy(addr, &transport->addr); - *port = transport->port; - *proxy_type = transport->socks_version; - return 0; - } - } - - *proxy_type = PROXY_NONE; - return 0; -} - -/** Log a failed connection to a proxy server. - * conn is the connection we use the proxy server for. */ -void -log_failed_proxy_connection(connection_t *conn) -{ - tor_addr_t proxy_addr; - uint16_t proxy_port; - int proxy_type; - - if (get_proxy_addrport(&proxy_addr, &proxy_port, &proxy_type, conn) != 0) - return; /* if we have no proxy set up, leave this function. */ - - log_warn(LD_NET, - "The connection to the %s proxy server at %s just failed. " - "Make sure that the proxy server is up and running.", - proxy_type_to_string(get_proxy_type()), - fmt_addrport(&proxy_addr, proxy_port)); -} - -/** Return string representation of proxy_type. */ -static const char * -proxy_type_to_string(int proxy_type) -{ - switch (proxy_type) { - case PROXY_CONNECT: return "HTTP"; - case PROXY_SOCKS4: return "SOCKS4"; - case PROXY_SOCKS5: return "SOCKS5"; - case PROXY_PLUGGABLE: return "pluggable transports SOCKS"; - case PROXY_NONE: return "NULL"; - default: tor_assert(0); - } - return NULL; /*Unreached*/ -} - -/** Call connection_free_() on every connection in our array, and release all - * storage held by connection.c. This is used by cpuworkers and dnsworkers - * when they fork, so they don't keep resources held open (especially - * sockets). - * - * Don't do the checks in connection_free(), because they will - * fail. - */ -void -connection_free_all(void) -{ - smartlist_t *conns = get_connection_array(); - - /* We don't want to log any messages to controllers. */ - SMARTLIST_FOREACH(conns, connection_t *, conn, - if (conn->type == CONN_TYPE_CONTROL) - TO_CONTROL_CONN(conn)->event_mask = 0); - - control_update_global_event_mask(); - - /* Unlink everything from the identity map. */ - connection_or_clear_identity_map(); - connection_or_clear_ext_or_id_map(); - - /* Clear out our list of broken connections */ - clear_broken_connection_map(0); - - SMARTLIST_FOREACH(conns, connection_t *, conn, connection_free_(conn)); - - if (outgoing_addrs) { - SMARTLIST_FOREACH(outgoing_addrs, tor_addr_t *, addr, tor_free(addr)); - smartlist_free(outgoing_addrs); - outgoing_addrs = NULL; - } - - tor_free(last_interface_ipv4); - tor_free(last_interface_ipv6); - -#ifdef USE_BUFFEREVENTS - if (global_rate_limit) - bufferevent_rate_limit_group_free(global_rate_limit); -#endif -} - diff --git a/src/tor/connection.h b/src/tor/connection.h deleted file mode 100644 index 4073d9fc9..000000000 --- a/src/tor/connection.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection.h - * \brief Header file for connection.c. - **/ - -#ifndef TOR_CONNECTION_H -#define TOR_CONNECTION_H - -/* XXXX For buf_datalen in inline function */ -#include "buffers.h" - -const char *conn_type_to_string(int type); -const char *conn_state_to_string(int type, int state); - -dir_connection_t *dir_connection_new(int socket_family); -or_connection_t *or_connection_new(int type, int socket_family); -edge_connection_t *edge_connection_new(int type, int socket_family); -entry_connection_t *entry_connection_new(int type, int socket_family); -control_connection_t *control_connection_new(int socket_family); -listener_connection_t *listener_connection_new(int type, int socket_family); -connection_t *connection_new(int type, int socket_family); - -void connection_link_connections(connection_t *conn_a, connection_t *conn_b); -void connection_free(connection_t *conn); -void connection_free_all(void); -void connection_about_to_close_connection(connection_t *conn); -void connection_close_immediate(connection_t *conn); -void connection_mark_for_close_(connection_t *conn, - int line, const char *file); -void connection_mark_for_close_internal_(connection_t *conn, - int line, const char *file); - -#define connection_mark_for_close(c) \ - connection_mark_for_close_((c), __LINE__, SHORT_FILE__) -#define connection_mark_for_close_internal(c) \ - connection_mark_for_close_internal_((c), __LINE__, SHORT_FILE__) - -/** - * Mark 'c' for close, but try to hold it open until all the data is written. - * Use the _internal versions of connection_mark_for_close; this should be - * called when you either are sure that if this is an or_connection_t the - * controlling channel has been notified (e.g. with - * connection_or_notify_error()), or you actually are the - * connection_or_close_for_error() or connection_or_close_normally function. - * For all other cases, use connection_mark_and_flush() instead, which - * checks for or_connection_t properly, instead. See below. - */ -#define connection_mark_and_flush_internal_(c,line,file) \ - do { \ - connection_t *tmp_conn_ = (c); \ - connection_mark_for_close_internal_(tmp_conn_, (line), (file)); \ - tmp_conn_->hold_open_until_flushed = 1; \ - IF_HAS_BUFFEREVENT(tmp_conn_, \ - connection_start_writing(tmp_conn_)); \ - } while (0) - -#define connection_mark_and_flush_internal(c) \ - connection_mark_and_flush_internal_((c), __LINE__, SHORT_FILE__) - -/** - * Mark 'c' for close, but try to hold it open until all the data is written. - */ -#define connection_mark_and_flush_(c,line,file) \ - do { \ - connection_t *tmp_conn_ = (c); \ - if (tmp_conn_->type == CONN_TYPE_OR) { \ - log_warn(LD_CHANNEL | LD_BUG, \ - "Something tried to close (and flush) an or_connection_t" \ - " without going through channels at %s:%d", \ - file, line); \ - connection_or_close_for_error(TO_OR_CONN(tmp_conn_), 1); \ - } else { \ - connection_mark_and_flush_internal_(c, line, file); \ - } \ - } while (0) - -#define connection_mark_and_flush(c) \ - connection_mark_and_flush_((c), __LINE__, SHORT_FILE__) - -void connection_expire_held_open(void); - -int connection_connect(connection_t *conn, const char *address, - const tor_addr_t *addr, - uint16_t port, int *socket_error); - -/** Maximum size of information that we can fit into SOCKS5 username - or password fields. */ -#define MAX_SOCKS5_AUTH_FIELD_SIZE 255 - -/** Total maximum size of information that we can fit into SOCKS5 - username and password fields. */ -#define MAX_SOCKS5_AUTH_SIZE_TOTAL 2*MAX_SOCKS5_AUTH_FIELD_SIZE - -int connection_proxy_connect(connection_t *conn, int type); -int connection_read_proxy_handshake(connection_t *conn); -void log_failed_proxy_connection(connection_t *conn); -int get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type, - const connection_t *conn); - -int retry_all_listeners(smartlist_t *replaced_conns, - smartlist_t *new_conns, - int close_all_noncontrol); - -void connection_mark_all_noncontrol_listeners(void); -void connection_mark_all_noncontrol_connections(void); - -ssize_t connection_bucket_write_limit(connection_t *conn, time_t now); -int global_write_bucket_low(connection_t *conn, size_t attempt, int priority); -void connection_bucket_init(void); -void connection_bucket_refill(int seconds_elapsed, time_t now); - -int connection_handle_read(connection_t *conn); - -int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); -int connection_fetch_from_buf_line(connection_t *conn, char *data, - size_t *data_len); -int connection_fetch_from_buf_http(connection_t *conn, - char **headers_out, size_t max_headerlen, - char **body_out, size_t *body_used, - size_t max_bodylen, int force_complete); - -int connection_wants_to_flush(connection_t *conn); -int connection_outbuf_too_full(connection_t *conn); -int connection_handle_write(connection_t *conn, int force); -int connection_flush(connection_t *conn); - -MOCK_DECL(void, connection_write_to_buf_impl_, - (const char *string, size_t len, connection_t *conn, int zlib)); -/* DOCDOC connection_write_to_buf */ -static void connection_write_to_buf(const char *string, size_t len, - connection_t *conn); -/* DOCDOC connection_write_to_buf_zlib */ -static void connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done); -static INLINE void -connection_write_to_buf(const char *string, size_t len, connection_t *conn) -{ - connection_write_to_buf_impl_(string, len, conn, 0); -} -static INLINE void -connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done) -{ - connection_write_to_buf_impl_(string, len, TO_CONN(conn), done ? -1 : 1); -} - -/* DOCDOC connection_get_inbuf_len */ -static size_t connection_get_inbuf_len(connection_t *conn); -/* DOCDOC connection_get_outbuf_len */ -static size_t connection_get_outbuf_len(connection_t *conn); - -static INLINE size_t -connection_get_inbuf_len(connection_t *conn) -{ - IF_HAS_BUFFEREVENT(conn, { - return evbuffer_get_length(bufferevent_get_input(conn->bufev)); - }) ELSE_IF_NO_BUFFEREVENT { - return conn->inbuf ? buf_datalen(conn->inbuf) : 0; - } -} - -static INLINE size_t -connection_get_outbuf_len(connection_t *conn) -{ - IF_HAS_BUFFEREVENT(conn, { - return evbuffer_get_length(bufferevent_get_output(conn->bufev)); - }) ELSE_IF_NO_BUFFEREVENT { - return conn->outbuf ? buf_datalen(conn->outbuf) : 0; - } -} - -connection_t *connection_get_by_global_id(uint64_t id); - -connection_t *connection_get_by_type(int type); -connection_t *connection_get_by_type_purpose(int type, int purpose); -connection_t *connection_get_by_type_addr_port_purpose(int type, - const tor_addr_t *addr, - uint16_t port, int purpose); -connection_t *connection_get_by_type_state(int type, int state); -connection_t *connection_get_by_type_state_rendquery(int type, int state, - const char *rendquery); -dir_connection_t *connection_dir_get_by_purpose_and_resource( - int state, const char *resource); - -#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) -int connection_is_listener(connection_t *conn); -int connection_state_is_open(connection_t *conn); -int connection_state_is_connecting(connection_t *conn); - -char *alloc_http_authenticator(const char *authenticator); - -void assert_connection_ok(connection_t *conn, time_t now); -int connection_or_nonopen_was_started_here(or_connection_t *conn); -void connection_dump_buffer_mem_stats(int severity); -void remove_file_if_very_old(const char *fname, time_t now); - -#ifdef USE_BUFFEREVENTS -int connection_type_uses_bufferevent(connection_t *conn); -void connection_configure_bufferevent_callbacks(connection_t *conn); -void connection_handle_read_cb(struct bufferevent *bufev, void *arg); -void connection_handle_write_cb(struct bufferevent *bufev, void *arg); -void connection_handle_event_cb(struct bufferevent *bufev, short event, - void *arg); -void connection_get_rate_limit_totals(uint64_t *read_out, - uint64_t *written_out); -void connection_enable_rate_limiting(connection_t *conn); -#else -#define connection_type_uses_bufferevent(c) (0) -#endif - -#ifdef CONNECTION_PRIVATE -STATIC void connection_free_(connection_t *conn); - -/* Used only by connection.c and test*.c */ -uint32_t bucket_millis_empty(int tokens_before, uint32_t last_empty_time, - int tokens_after, int milliseconds_elapsed, - const struct timeval *tvnow); -void connection_buckets_note_empty_ts(uint32_t *timestamp_var, - int tokens_before, - size_t tokens_removed, - const struct timeval *tvnow); -#endif - -#endif - diff --git a/src/tor/connection_edge.c b/src/tor/connection_edge.c deleted file mode 100644 index a794f3791..000000000 --- a/src/tor/connection_edge.c +++ /dev/null @@ -1,3119 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection_edge.c - * \brief Handle edge streams. - **/ -#define CONNECTION_EDGE_PRIVATE - -#include "or.h" -#include "addressmap.h" -#include "buffers.h" -#include "channel.h" -#include "circpathbias.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "dns.h" -#include "dnsserv.h" -#include "dirserv.h" -#include "hibernate.h" -#include "onion_main.h" -#include "nodelist.h" -#include "policies.h" -#include "reasons.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerset.h" -#include "circuitbuild.h" - -#ifdef HAVE_LINUX_TYPES_H -#include -#endif -#ifdef HAVE_LINUX_NETFILTER_IPV4_H -#include -#define TRANS_NETFILTER -#endif - -#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) -#include -#include -#define TRANS_PF -#endif - -#define SOCKS4_GRANTED 90 -#define SOCKS4_REJECT 91 - -static int connection_ap_handshake_process_socks(entry_connection_t *conn); -static int connection_ap_process_natd(entry_connection_t *conn); -static int connection_exit_connect_dir(edge_connection_t *exitconn); -static int consider_plaintext_ports(entry_connection_t *conn, uint16_t port); -static int connection_ap_supports_optimistic_data(const entry_connection_t *); -static void connection_ap_handshake_socks_resolved_addr( - entry_connection_t *conn, - const tor_addr_t *answer, - int ttl, - time_t expires); - -/** An AP stream has failed/finished. If it hasn't already sent back - * a socks reply, send one now (based on endreason). Also set - * has_sent_end to 1, and mark the conn. - */ -void -connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, - int line, const char *file) -{ - connection_t *base_conn = ENTRY_TO_CONN(conn); - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - tor_assert(base_conn->type == CONN_TYPE_AP); - ENTRY_TO_EDGE_CONN(conn)->edge_has_sent_end = 1; /* no circ yet */ - - /* If this is a rendezvous stream and it is failing without ever - * being attached to a circuit, assume that an attempt to connect to - * the destination hidden service has just ended. - * - * XXXX This condition doesn't limit to only streams failing - * without ever being attached. That sloppiness should be harmless, - * but we should fix it someday anyway. */ - if ((edge_conn->on_circuit != NULL || edge_conn->edge_has_sent_end) && - connection_edge_is_rendezvous_stream(edge_conn)) { - rend_client_note_connection_attempt_ended( - edge_conn->rend_data->onion_address); - } - - if (base_conn->marked_for_close) { - /* This call will warn as appropriate. */ - connection_mark_for_close_(base_conn, line, file); - return; - } - - if (!conn->socks_request->has_finished) { - if (endreason & END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED) - log_warn(LD_BUG, - "stream (marked at %s:%d) sending two socks replies?", - file, line); - - if (SOCKS_COMMAND_IS_CONNECT(conn->socks_request->command)) - connection_ap_handshake_socks_reply(conn, NULL, 0, endreason); - else if (SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_ERROR_TRANSIENT, - 0, NULL, -1, -1); - else /* unknown or no handshake at all. send no response. */ - conn->socks_request->has_finished = 1; - } - - connection_mark_and_flush_(base_conn, line, file); - - ENTRY_TO_EDGE_CONN(conn)->end_reason = endreason; -} - -/** There was an EOF. Send an end and mark the connection for close. - */ -int -connection_edge_reached_eof(edge_connection_t *conn) -{ - if (connection_get_inbuf_len(TO_CONN(conn)) && - connection_state_is_open(TO_CONN(conn))) { - /* it still has stuff to process. don't let it die yet. */ - return 0; - } - log_info(LD_EDGE,"conn (fd "TOR_SOCKET_T_FORMAT") reached eof. Closing.", - conn->base_.s); - if (!conn->base_.marked_for_close) { - /* only mark it if not already marked. it's possible to - * get the 'end' right around when the client hangs up on us. */ - connection_edge_end(conn, END_STREAM_REASON_DONE); - if (conn->base_.type == CONN_TYPE_AP) { - /* eof, so don't send a socks reply back */ - if (EDGE_TO_ENTRY_CONN(conn)->socks_request) - EDGE_TO_ENTRY_CONN(conn)->socks_request->has_finished = 1; - } - connection_mark_for_close(TO_CONN(conn)); - } - return 0; -} - -/** Handle new bytes on conn->inbuf based on state: - * - If it's waiting for socks info, try to read another step of the - * socks handshake out of conn->inbuf. - * - If it's waiting for the original destination, fetch it. - * - If it's open, then package more relay cells from the stream. - * - Else, leave the bytes on inbuf alone for now. - * - * Mark and return -1 if there was an unexpected error with the conn, - * else return 0. - */ -int -connection_edge_process_inbuf(edge_connection_t *conn, int package_partial) -{ - tor_assert(conn); - - switch (conn->base_.state) { - case AP_CONN_STATE_SOCKS_WAIT: - if (connection_ap_handshake_process_socks(EDGE_TO_ENTRY_CONN(conn)) <0) { - /* already marked */ - return -1; - } - return 0; - case AP_CONN_STATE_NATD_WAIT: - if (connection_ap_process_natd(EDGE_TO_ENTRY_CONN(conn)) < 0) { - /* already marked */ - return -1; - } - return 0; - case AP_CONN_STATE_OPEN: - case EXIT_CONN_STATE_OPEN: - if (connection_edge_package_raw_inbuf(conn, package_partial, NULL) < 0) { - /* (We already sent an end cell if possible) */ - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - return 0; - case AP_CONN_STATE_CONNECT_WAIT: - if (connection_ap_supports_optimistic_data(EDGE_TO_ENTRY_CONN(conn))) { - log_info(LD_EDGE, - "data from edge while in '%s' state. Sending it anyway. " - "package_partial=%d, buflen=%ld", - conn_state_to_string(conn->base_.type, conn->base_.state), - package_partial, - (long)connection_get_inbuf_len(TO_CONN(conn))); - if (connection_edge_package_raw_inbuf(conn, package_partial, NULL)<0) { - /* (We already sent an end cell if possible) */ - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - return 0; - } - /* Fall through if the connection is on a circuit without optimistic - * data support. */ - case EXIT_CONN_STATE_CONNECTING: - case AP_CONN_STATE_RENDDESC_WAIT: - case AP_CONN_STATE_CIRCUIT_WAIT: - case AP_CONN_STATE_RESOLVE_WAIT: - case AP_CONN_STATE_CONTROLLER_WAIT: - log_info(LD_EDGE, - "data from edge while in '%s' state. Leaving it on buffer.", - conn_state_to_string(conn->base_.type, conn->base_.state)); - return 0; - } - log_warn(LD_BUG,"Got unexpected state %d. Closing.",conn->base_.state); - tor_fragile_assert(); - connection_edge_end(conn, END_STREAM_REASON_INTERNAL); - connection_mark_for_close(TO_CONN(conn)); - return -1; -} - -/** This edge needs to be closed, because its circuit has closed. - * Mark it for close and return 0. - */ -int -connection_edge_destroy(circid_t circ_id, edge_connection_t *conn) -{ - if (!conn->base_.marked_for_close) { - log_info(LD_EDGE, "CircID %u: At an edge. Marking connection for close.", - (unsigned) circ_id); - if (conn->base_.type == CONN_TYPE_AP) { - entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_DESTROY); - control_event_stream_bandwidth(conn); - control_event_stream_status(entry_conn, STREAM_EVENT_CLOSED, - END_STREAM_REASON_DESTROY); - conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; - } else { - /* closing the circuit, nothing to send an END to */ - conn->edge_has_sent_end = 1; - conn->end_reason = END_STREAM_REASON_DESTROY; - conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED; - connection_mark_and_flush(TO_CONN(conn)); - } - } - conn->cpath_layer = NULL; - conn->on_circuit = NULL; - return 0; -} - -/** Send a raw end cell to the stream with ID stream_id out over the - * circ towards the hop identified with cpath_layer. If this - * is not a client connection, set the relay end cell's reason for closing - * as reason */ -static int -relay_send_end_cell_from_edge(streamid_t stream_id, circuit_t *circ, - uint8_t reason, crypt_path_t *cpath_layer) -{ - char payload[1]; - - if (CIRCUIT_PURPOSE_IS_CLIENT(circ->purpose)) { - /* Never send the server an informative reason code; it doesn't need to - * know why the client stream is failing. */ - reason = END_STREAM_REASON_MISC; - } - - payload[0] = (char) reason; - - return relay_send_command_from_edge(stream_id, circ, RELAY_COMMAND_END, - payload, 1, cpath_layer); -} - -/** Send a relay end cell from stream conn down conn's circuit, and - * remember that we've done so. If this is not a client connection, set the - * relay end cell's reason for closing as reason. - * - * Return -1 if this function has already been called on this conn, - * else return 0. - */ -int -connection_edge_end(edge_connection_t *conn, uint8_t reason) -{ - char payload[RELAY_PAYLOAD_SIZE]; - size_t payload_len=1; - circuit_t *circ; - uint8_t control_reason = reason; - - if (conn->edge_has_sent_end) { - log_warn(LD_BUG,"(Harmless.) Calling connection_edge_end (reason %d) " - "on an already ended stream?", reason); - tor_fragile_assert(); - return -1; - } - - if (conn->base_.marked_for_close) { - log_warn(LD_BUG, - "called on conn that's already marked for close at %s:%d.", - conn->base_.marked_for_close_file, conn->base_.marked_for_close); - return 0; - } - - circ = circuit_get_by_edge_conn(conn); - if (circ && CIRCUIT_PURPOSE_IS_CLIENT(circ->purpose)) { - /* If this is a client circuit, don't send the server an informative - * reason code; it doesn't need to know why the client stream is - * failing. */ - reason = END_STREAM_REASON_MISC; - } - - payload[0] = (char)reason; - if (reason == END_STREAM_REASON_EXITPOLICY && - !connection_edge_is_rendezvous_stream(conn)) { - int addrlen; - if (tor_addr_family(&conn->base_.addr) == AF_INET) { - set_uint32(payload+1, tor_addr_to_ipv4n(&conn->base_.addr)); - addrlen = 4; - } else { - memcpy(payload+1, tor_addr_to_in6_addr8(&conn->base_.addr), 16); - addrlen = 16; - } - set_uint32(payload+1+addrlen, htonl(dns_clip_ttl(conn->address_ttl))); - payload_len += 4+addrlen; - } - - if (circ && !circ->marked_for_close) { - log_debug(LD_EDGE,"Sending end on conn (fd "TOR_SOCKET_T_FORMAT").", - conn->base_.s); - connection_edge_send_command(conn, RELAY_COMMAND_END, - payload, payload_len); - } else { - log_debug(LD_EDGE,"No circ to send end on conn " - "(fd "TOR_SOCKET_T_FORMAT").", - conn->base_.s); - } - - conn->edge_has_sent_end = 1; - conn->end_reason = control_reason; - return 0; -} - -/** An error has just occurred on an operation on an edge connection - * conn. Extract the errno; convert it to an end reason, and send an - * appropriate relay end cell to the other end of the connection's circuit. - **/ -int -connection_edge_end_errno(edge_connection_t *conn) -{ - uint8_t reason; - tor_assert(conn); - reason = errno_to_stream_end_reason(tor_socket_errno(conn->base_.s)); - return connection_edge_end(conn, reason); -} - -/** We just wrote some data to conn; act appropriately. - * - * (That is, if it's open, consider sending a stream-level sendme cell if we - * have just flushed enough.) - */ -int -connection_edge_flushed_some(edge_connection_t *conn) -{ - switch (conn->base_.state) { - case AP_CONN_STATE_OPEN: - case EXIT_CONN_STATE_OPEN: - connection_edge_consider_sending_sendme(conn); - break; - } - return 0; -} - -/** Connection conn has finished writing and has no bytes left on - * its outbuf. - * - * If it's in state 'open', stop writing, consider responding with a - * sendme, and return. - * Otherwise, stop writing and return. - * - * If conn is broken, mark it for close and return -1, else - * return 0. - */ -int -connection_edge_finished_flushing(edge_connection_t *conn) -{ - tor_assert(conn); - - switch (conn->base_.state) { - case AP_CONN_STATE_OPEN: - case EXIT_CONN_STATE_OPEN: - connection_edge_consider_sending_sendme(conn); - return 0; - case AP_CONN_STATE_SOCKS_WAIT: - case AP_CONN_STATE_NATD_WAIT: - case AP_CONN_STATE_RENDDESC_WAIT: - case AP_CONN_STATE_CIRCUIT_WAIT: - case AP_CONN_STATE_CONNECT_WAIT: - case AP_CONN_STATE_CONTROLLER_WAIT: - case AP_CONN_STATE_RESOLVE_WAIT: - return 0; - default: - log_warn(LD_BUG, "Called in unexpected state %d.",conn->base_.state); - tor_fragile_assert(); - return -1; - } - return 0; -} - -/** Longest size for the relay payload of a RELAY_CONNECTED cell that we're - * able to generate. */ -/* 4 zero bytes; 1 type byte; 16 byte IPv6 address; 4 byte TTL. */ -#define MAX_CONNECTED_CELL_PAYLOAD_LEN 25 - -/** Set the buffer at payload_out -- which must have at least - * MAX_CONNECTED_CELL_PAYLOAD_LEN bytes available -- to the body of a - * RELAY_CONNECTED cell indicating that we have connected to addr, and - * that the name resolution that led us to addr will be valid for - * ttl seconds. Return -1 on error, or the number of bytes used on - * success. */ -STATIC int -connected_cell_format_payload(uint8_t *payload_out, - const tor_addr_t *addr, - uint32_t ttl) -{ - const sa_family_t family = tor_addr_family(addr); - int connected_payload_len; - - /* should be needless */ - memset(payload_out, 0, MAX_CONNECTED_CELL_PAYLOAD_LEN); - - if (family == AF_INET) { - set_uint32(payload_out, tor_addr_to_ipv4n(addr)); - connected_payload_len = 4; - } else if (family == AF_INET6) { - set_uint32(payload_out, 0); - set_uint8(payload_out + 4, 6); - memcpy(payload_out + 5, tor_addr_to_in6_addr8(addr), 16); - connected_payload_len = 21; - } else { - return -1; - } - - set_uint32(payload_out + connected_payload_len, htonl(dns_clip_ttl(ttl))); - connected_payload_len += 4; - - tor_assert(connected_payload_len <= MAX_CONNECTED_CELL_PAYLOAD_LEN); - - return connected_payload_len; -} - -/** Connected handler for exit connections: start writing pending - * data, deliver 'CONNECTED' relay cells as appropriate, and check - * any pending data that may have been received. */ -int -connection_edge_finished_connecting(edge_connection_t *edge_conn) -{ - connection_t *conn; - - tor_assert(edge_conn); - tor_assert(edge_conn->base_.type == CONN_TYPE_EXIT); - conn = TO_CONN(edge_conn); - tor_assert(conn->state == EXIT_CONN_STATE_CONNECTING); - - log_info(LD_EXIT,"Exit connection to %s:%u (%s) established.", - escaped_safe_str(conn->address), conn->port, - safe_str(fmt_and_decorate_addr(&conn->addr))); - - rep_hist_note_exit_stream_opened(conn->port); - - conn->state = EXIT_CONN_STATE_OPEN; - IF_HAS_NO_BUFFEREVENT(conn) - connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */ - if (connection_get_outbuf_len(conn)) /* in case there are any queued relay - * cells */ - connection_start_writing(conn); - /* deliver a 'connected' relay cell back through the circuit. */ - if (connection_edge_is_rendezvous_stream(edge_conn)) { - if (connection_edge_send_command(edge_conn, - RELAY_COMMAND_CONNECTED, NULL, 0) < 0) - return 0; /* circuit is closed, don't continue */ - } else { - uint8_t connected_payload[MAX_CONNECTED_CELL_PAYLOAD_LEN]; - int connected_payload_len = - connected_cell_format_payload(connected_payload, &conn->addr, - edge_conn->address_ttl); - if (connected_payload_len < 0) - return -1; - - if (connection_edge_send_command(edge_conn, - RELAY_COMMAND_CONNECTED, - (char*)connected_payload, connected_payload_len) < 0) - return 0; /* circuit is closed, don't continue */ - } - tor_assert(edge_conn->package_window > 0); - /* in case the server has written anything */ - return connection_edge_process_inbuf(edge_conn, 1); -} - -/** Common code to connection_(ap|exit)_about_to_close. */ -static void -connection_edge_about_to_close(edge_connection_t *edge_conn) -{ - if (!edge_conn->edge_has_sent_end) { - connection_t *conn = TO_CONN(edge_conn); - log_warn(LD_BUG, "(Harmless.) Edge connection (marked at %s:%d) " - "hasn't sent end yet?", - conn->marked_for_close_file, conn->marked_for_close); - tor_fragile_assert(); - } -} - -/** Called when we're about to finally unlink and free an AP (client) - * connection: perform necessary accounting and cleanup */ -void -connection_ap_about_to_close(entry_connection_t *entry_conn) -{ - circuit_t *circ; - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(entry_conn); - connection_t *conn = ENTRY_TO_CONN(entry_conn); - - if (entry_conn->socks_request->has_finished == 0) { - /* since conn gets removed right after this function finishes, - * there's no point trying to send back a reply at this point. */ - log_warn(LD_BUG,"Closing stream (marked at %s:%d) without sending" - " back a socks reply.", - conn->marked_for_close_file, conn->marked_for_close); - } - if (!edge_conn->end_reason) { - log_warn(LD_BUG,"Closing stream (marked at %s:%d) without having" - " set end_reason.", - conn->marked_for_close_file, conn->marked_for_close); - } - if (entry_conn->dns_server_request) { - log_warn(LD_BUG,"Closing stream (marked at %s:%d) without having" - " replied to DNS request.", - conn->marked_for_close_file, conn->marked_for_close); - dnsserv_reject_request(entry_conn); - } - control_event_stream_bandwidth(edge_conn); - control_event_stream_status(entry_conn, STREAM_EVENT_CLOSED, - edge_conn->end_reason); - circ = circuit_get_by_edge_conn(edge_conn); - if (circ) - circuit_detach_stream(circ, edge_conn); -} - -/** Called when we're about to finally unlink and free an exit - * connection: perform necessary accounting and cleanup */ -void -connection_exit_about_to_close(edge_connection_t *edge_conn) -{ - circuit_t *circ; - connection_t *conn = TO_CONN(edge_conn); - - connection_edge_about_to_close(edge_conn); - - circ = circuit_get_by_edge_conn(edge_conn); - if (circ) - circuit_detach_stream(circ, edge_conn); - if (conn->state == EXIT_CONN_STATE_RESOLVING) { - connection_dns_remove(edge_conn); - } -} - -/** Define a schedule for how long to wait between retrying - * application connections. Rather than waiting a fixed amount of - * time between each retry, we wait 10 seconds each for the first - * two tries, and 15 seconds for each retry after - * that. Hopefully this will improve the expected user experience. */ -static int -compute_retry_timeout(entry_connection_t *conn) -{ - int timeout = get_options()->CircuitStreamTimeout; - if (timeout) /* if our config options override the default, use them */ - return timeout; - if (conn->num_socks_retries < 2) /* try 0 and try 1 */ - return 10; - return 15; -} - -/** Find all general-purpose AP streams waiting for a response that sent their - * begin/resolve cell too long ago. Detach from their current circuit, and - * mark their current circuit as unsuitable for new streams. Then call - * connection_ap_handshake_attach_circuit() to attach to a new circuit (if - * available) or launch a new one. - * - * For rendezvous streams, simply give up after SocksTimeout seconds (with no - * retry attempt). - */ -void -connection_ap_expire_beginning(void) -{ - edge_connection_t *conn; - entry_connection_t *entry_conn; - circuit_t *circ; - time_t now = time(NULL); - const or_options_t *options = get_options(); - int severity; - int cutoff; - int seconds_idle, seconds_since_born; - smartlist_t *conns = get_connection_array(); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - if (base_conn->type != CONN_TYPE_AP || base_conn->marked_for_close) - continue; - entry_conn = TO_ENTRY_CONN(base_conn); - conn = ENTRY_TO_EDGE_CONN(entry_conn); - /* if it's an internal linked connection, don't yell its status. */ - severity = (tor_addr_is_null(&base_conn->addr) && !base_conn->port) - ? LOG_INFO : LOG_NOTICE; - seconds_idle = (int)( now - base_conn->timestamp_lastread ); - seconds_since_born = (int)( now - base_conn->timestamp_created ); - - if (base_conn->state == AP_CONN_STATE_OPEN) - continue; - - /* We already consider SocksTimeout in - * connection_ap_handshake_attach_circuit(), but we need to consider - * it here too because controllers that put streams in controller_wait - * state never ask Tor to attach the circuit. */ - if (AP_CONN_STATE_IS_UNATTACHED(base_conn->state)) { - if (seconds_since_born >= options->SocksTimeout) { - log_fn(severity, LD_APP, - "Tried for %d seconds to get a connection to %s:%d. " - "Giving up. (%s)", - seconds_since_born, - safe_str_client(entry_conn->socks_request->address), - entry_conn->socks_request->port, - conn_state_to_string(CONN_TYPE_AP, base_conn->state)); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TIMEOUT); - } - continue; - } - - /* We're in state connect_wait or resolve_wait now -- waiting for a - * reply to our relay cell. See if we want to retry/give up. */ - - cutoff = compute_retry_timeout(entry_conn); - if (seconds_idle < cutoff) - continue; - circ = circuit_get_by_edge_conn(conn); - if (!circ) { /* it's vanished? */ - log_info(LD_APP,"Conn is waiting (address %s), but lost its circ.", - safe_str_client(entry_conn->socks_request->address)); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TIMEOUT); - continue; - } - if (circ->purpose == CIRCUIT_PURPOSE_C_REND_JOINED) { - if (seconds_idle >= options->SocksTimeout) { - log_fn(severity, LD_REND, - "Rend stream is %d seconds late. Giving up on address" - " '%s.onion'.", - seconds_idle, - safe_str_client(entry_conn->socks_request->address)); - /* Roll back path bias use state so that we probe the circuit - * if nothing else succeeds on it */ - pathbias_mark_use_rollback(TO_ORIGIN_CIRCUIT(circ)); - - connection_edge_end(conn, END_STREAM_REASON_TIMEOUT); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TIMEOUT); - } - continue; - } - if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL && - circ->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT && - circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) { - log_warn(LD_BUG, "circuit->purpose == CIRCUIT_PURPOSE_C_GENERAL failed. " - "The purpose on the circuit was %s; it was in state %s, " - "path_state %s.", - circuit_purpose_to_string(circ->purpose), - circuit_state_to_string(circ->state), - CIRCUIT_IS_ORIGIN(circ) ? - pathbias_state_to_string(TO_ORIGIN_CIRCUIT(circ)->path_state) : - "none"); - } - log_fn(cutoff < 15 ? LOG_INFO : severity, LD_APP, - "We tried for %d seconds to connect to '%s' using exit %s." - " Retrying on a new circuit.", - seconds_idle, - safe_str_client(entry_conn->socks_request->address), - conn->cpath_layer ? - extend_info_describe(conn->cpath_layer->extend_info): - "*unnamed*"); - /* send an end down the circuit */ - connection_edge_end(conn, END_STREAM_REASON_TIMEOUT); - /* un-mark it as ending, since we're going to reuse it */ - conn->edge_has_sent_end = 0; - conn->end_reason = 0; - /* make us not try this circuit again, but allow - * current streams on it to survive if they can */ - mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ)); - - /* give our stream another 'cutoff' seconds to try */ - conn->base_.timestamp_lastread += cutoff; - if (entry_conn->num_socks_retries < 250) /* avoid overflow */ - entry_conn->num_socks_retries++; - /* move it back into 'pending' state, and try to attach. */ - if (connection_ap_detach_retriable(entry_conn, TO_ORIGIN_CIRCUIT(circ), - END_STREAM_REASON_TIMEOUT)<0) { - if (!base_conn->marked_for_close) - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_CANT_ATTACH); - } - } SMARTLIST_FOREACH_END(base_conn); -} - -/** Tell any AP streams that are waiting for a new circuit to try again, - * either attaching to an available circ or launching a new one. - */ -void -connection_ap_attach_pending(void) -{ - entry_connection_t *entry_conn; - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->marked_for_close || - conn->type != CONN_TYPE_AP || - conn->state != AP_CONN_STATE_CIRCUIT_WAIT) - continue; - entry_conn = TO_ENTRY_CONN(conn); - if (connection_ap_handshake_attach_circuit(entry_conn) < 0) { - if (!conn->marked_for_close) - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_CANT_ATTACH); - } - } SMARTLIST_FOREACH_END(conn); -} - -/** Tell any AP streams that are waiting for a one-hop tunnel to - * failed_digest that they are going to fail. */ -/* XXX024 We should get rid of this function, and instead attach - * one-hop streams to circ->p_streams so they get marked in - * circuit_mark_for_close like normal p_streams. */ -void -connection_ap_fail_onehop(const char *failed_digest, - cpath_build_state_t *build_state) -{ - entry_connection_t *entry_conn; - char digest[DIGEST_LEN]; - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->marked_for_close || - conn->type != CONN_TYPE_AP || - conn->state != AP_CONN_STATE_CIRCUIT_WAIT) - continue; - entry_conn = TO_ENTRY_CONN(conn); - if (!entry_conn->want_onehop) - continue; - if (hexdigest_to_digest(entry_conn->chosen_exit_name, digest) < 0 || - tor_memneq(digest, failed_digest, DIGEST_LEN)) - continue; - if (tor_digest_is_zero(digest)) { - /* we don't know the digest; have to compare addr:port */ - tor_addr_t addr; - if (!build_state || !build_state->chosen_exit || - !entry_conn->socks_request || !entry_conn->socks_request->address) - continue; - if (tor_addr_parse(&addr, entry_conn->socks_request->address)<0 || - !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || - build_state->chosen_exit->port != entry_conn->socks_request->port) - continue; - } - log_info(LD_APP, "Closing one-hop stream to '%s/%s' because the OR conn " - "just failed.", entry_conn->chosen_exit_name, - entry_conn->socks_request->address); - connection_mark_unattached_ap(entry_conn, END_STREAM_REASON_TIMEOUT); - } SMARTLIST_FOREACH_END(conn); -} - -/** A circuit failed to finish on its last hop info. If there - * are any streams waiting with this exit node in mind, but they - * don't absolutely require it, make them give up on it. - */ -void -circuit_discard_optional_exit_enclaves(extend_info_t *info) -{ - entry_connection_t *entry_conn; - const node_t *r1, *r2; - - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->marked_for_close || - conn->type != CONN_TYPE_AP || - conn->state != AP_CONN_STATE_CIRCUIT_WAIT) - continue; - entry_conn = TO_ENTRY_CONN(conn); - if (!entry_conn->chosen_exit_optional && - !entry_conn->chosen_exit_retries) - continue; - r1 = node_get_by_nickname(entry_conn->chosen_exit_name, 0); - r2 = node_get_by_id(info->identity_digest); - if (!r1 || !r2 || r1 != r2) - continue; - tor_assert(entry_conn->socks_request); - if (entry_conn->chosen_exit_optional) { - log_info(LD_APP, "Giving up on enclave exit '%s' for destination %s.", - safe_str_client(entry_conn->chosen_exit_name), - escaped_safe_str_client(entry_conn->socks_request->address)); - entry_conn->chosen_exit_optional = 0; - tor_free(entry_conn->chosen_exit_name); /* clears it */ - /* if this port is dangerous, warn or reject it now that we don't - * think it'll be using an enclave. */ - consider_plaintext_ports(entry_conn, entry_conn->socks_request->port); - } - if (entry_conn->chosen_exit_retries) { - if (--entry_conn->chosen_exit_retries == 0) { /* give up! */ - clear_trackexithost_mappings(entry_conn->chosen_exit_name); - tor_free(entry_conn->chosen_exit_name); /* clears it */ - /* if this port is dangerous, warn or reject it now that we don't - * think it'll be using an enclave. */ - consider_plaintext_ports(entry_conn, entry_conn->socks_request->port); - } - } - } SMARTLIST_FOREACH_END(conn); -} - -/** The AP connection conn has just failed while attaching or - * sending a BEGIN or resolving on circ, but another circuit - * might work. Detach the circuit, and either reattach it, launch a - * new circuit, tell the controller, or give up as appropriate. - * - * Returns -1 on err, 1 on success, 0 on not-yet-sure. - */ -int -connection_ap_detach_retriable(entry_connection_t *conn, - origin_circuit_t *circ, - int reason) -{ - control_event_stream_status(conn, STREAM_EVENT_FAILED_RETRIABLE, reason); - ENTRY_TO_CONN(conn)->timestamp_lastread = time(NULL); - - /* Roll back path bias use state so that we probe the circuit - * if nothing else succeeds on it */ - pathbias_mark_use_rollback(circ); - - if (conn->pending_optimistic_data) { - generic_buffer_set_to_copy(&conn->sending_optimistic_data, - conn->pending_optimistic_data); - } - - if (!get_options()->LeaveStreamsUnattached || conn->use_begindir) { - /* If we're attaching streams ourself, or if this connection is - * a tunneled directory connection, then just attach it. */ - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CIRCUIT_WAIT; - circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); - return connection_ap_handshake_attach_circuit(conn); - } else { - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; - circuit_detach_stream(TO_CIRCUIT(circ),ENTRY_TO_EDGE_CONN(conn)); - return 0; - } -} - -/** Check if conn is using a dangerous port. Then warn and/or - * reject depending on our config options. */ -static int -consider_plaintext_ports(entry_connection_t *conn, uint16_t port) -{ - const or_options_t *options = get_options(); - int reject = smartlist_contains_int_as_string( - options->RejectPlaintextPorts, port); - - if (smartlist_contains_int_as_string(options->WarnPlaintextPorts, port)) { - log_warn(LD_APP, "Application request to port %d: this port is " - "commonly used for unencrypted protocols. Please make sure " - "you don't send anything you would mind the rest of the " - "Internet reading!%s", port, reject ? " Closing." : ""); - control_event_client_status(LOG_WARN, "DANGEROUS_PORT PORT=%d RESULT=%s", - port, reject ? "REJECT" : "WARN"); - } - - if (reject) { - log_info(LD_APP, "Port %d listed in RejectPlaintextPorts. Closing.", port); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - - return 0; -} - -/** How many times do we try connecting with an exit configured via - * TrackHostExits before concluding that it won't work any more and trying a - * different one? */ -#define TRACKHOSTEXITS_RETRIES 5 - -/** Call connection_ap_handshake_rewrite_and_attach() unless a controller - * asked us to leave streams unattached. Return 0 in that case. - * - * See connection_ap_handshake_rewrite_and_attach()'s - * documentation for arguments and return value. - */ -int -connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) -{ - const or_options_t *options = get_options(); - - if (options->LeaveStreamsUnattached) { - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; - return 0; - } - return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath); -} - -/** Connection conn just finished its socks handshake, or the - * controller asked us to take care of it. If circ is defined, - * then that's where we'll want to attach it. Otherwise we have to - * figure it out ourselves. - * - * First, parse whether it's a .exit address, remap it, and so on. Then - * if it's for a general circuit, try to attach it to a circuit (or launch - * one as needed), else if it's for a rendezvous circuit, fetch a - * rendezvous descriptor first (or attach/launch a circuit if the - * rendezvous descriptor is already here and fresh enough). - * - * The stream will exit from the hop - * indicated by cpath, or from the last hop in circ's cpath if - * cpath is NULL. - */ -int -connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) -{ - socks_request_t *socks = conn->socks_request; - hostname_type_t addresstype; - const or_options_t *options = get_options(); - tor_addr_t addr_tmp; - /* We set this to true if this is an address we should automatically - * remap to a local address in VirtualAddrNetwork */ - int automap = 0; - char orig_address[MAX_SOCKS_ADDR_LEN]; - time_t map_expires = TIME_MAX; - time_t now = time(NULL); - connection_t *base_conn = ENTRY_TO_CONN(conn); - addressmap_entry_source_t exit_source = ADDRMAPSRC_NONE; - - tor_strlower(socks->address); /* normalize it */ - strlcpy(orig_address, socks->address, sizeof(orig_address)); - log_debug(LD_APP,"Client asked for %s:%d", - safe_str_client(socks->address), - socks->port); - - if (!strcmpend(socks->address, ".exit") && !options->AllowDotExit) { - log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to " - "security risks. Set AllowDotExit in your torrc to enable " - "it (at your own risk)."); - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - if (! conn->original_dest_address) - conn->original_dest_address = tor_strdup(conn->socks_request->address); - - if (socks->command == SOCKS_COMMAND_RESOLVE && - tor_addr_parse(&addr_tmp, socks->address)<0 && - options->AutomapHostsOnResolve) { - automap = addressmap_address_should_automap(socks->address, options); - if (automap) { - const char *new_addr; - int addr_type = RESOLVED_TYPE_IPV4; - if (conn->socks_request->socks_version != 4) { - if (!conn->ipv4_traffic_ok || - (conn->ipv6_traffic_ok && conn->prefer_ipv6_traffic) || - conn->prefer_ipv6_virtaddr) - addr_type = RESOLVED_TYPE_IPV6; - } - new_addr = addressmap_register_virtual_address( - addr_type, tor_strdup(socks->address)); - if (! new_addr) { - log_warn(LD_APP, "Unable to automap address %s", - escaped_safe_str(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); - return -1; - } - log_info(LD_APP, "Automapping %s to %s", - escaped_safe_str_client(socks->address), - safe_str_client(new_addr)); - strlcpy(socks->address, new_addr, sizeof(socks->address)); - } - } - - if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) { - unsigned rewrite_flags = 0; - if (conn->use_cached_ipv4_answers) - rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->use_cached_ipv6_answers) - rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; - - if (addressmap_rewrite_reverse(socks->address, sizeof(socks->address), - rewrite_flags, &map_expires)) { - char *result = tor_strdup(socks->address); - /* remember _what_ is supposed to have been resolved. */ - tor_snprintf(socks->address, sizeof(socks->address), "REVERSE[%s]", - orig_address); - connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_HOSTNAME, - strlen(result), (uint8_t*)result, - -1, - map_expires); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_DONE | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return 0; - } - if (options->ClientDNSRejectInternalAddresses) { - /* Don't let people try to do a reverse lookup on 10.0.0.1. */ - tor_addr_t addr; - int ok; - ok = tor_addr_parse_PTR_name( - &addr, socks->address, AF_UNSPEC, 1); - if (ok == 1 && tor_addr_is_internal(&addr, 0)) { - connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_ERROR, - 0, NULL, -1, TIME_MAX); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; - } - } - } else if (!automap) { - /* For address map controls, remap the address. */ - unsigned rewrite_flags = 0; - if (conn->use_cached_ipv4_answers) - rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->use_cached_ipv6_answers) - rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; - if (addressmap_rewrite(socks->address, sizeof(socks->address), - rewrite_flags, &map_expires, &exit_source)) { - control_event_stream_status(conn, STREAM_EVENT_REMAP, - REMAP_STREAM_SOURCE_CACHE); - } - } - - if (!automap && address_is_in_virtual_range(socks->address)) { - /* This address was probably handed out by client_dns_get_unmapped_address, - * but the mapping was discarded for some reason. We *don't* want to send - * the address through Tor; that's likely to fail, and may leak - * information. - */ - log_warn(LD_APP,"Missing mapping for virtual address '%s'. Refusing.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); - return -1; - } - - /* Parse the address provided by SOCKS. Modify it in-place if it - * specifies a hidden-service (.onion) or particular exit node (.exit). - */ - addresstype = parse_extended_hostname(socks->address); - - if (addresstype == BAD_HOSTNAME) { - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - if (addresstype == EXIT_HOSTNAME) { - /* foo.exit -- modify conn->chosen_exit_node to specify the exit - * node, and conn->address to hold only the address portion. */ - char *s = strrchr(socks->address,'.'); - - /* If StrictNodes is not set, then .exit overrides ExcludeNodes. */ - routerset_t *excludeset = options->StrictNodes ? - options->ExcludeExitNodesUnion_ : options->ExcludeExitNodes; - const node_t *node; - - if (exit_source == ADDRMAPSRC_AUTOMAP && !options->AllowDotExit) { - /* Whoops; this one is stale. It must have gotten added earlier, - * when AllowDotExit was on. */ - log_warn(LD_APP,"Stale automapped address for '%s.exit', with " - "AllowDotExit disabled. Refusing.", - safe_str_client(socks->address)); - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - if (exit_source == ADDRMAPSRC_DNS || - (exit_source == ADDRMAPSRC_NONE && !options->AllowDotExit)) { - /* It shouldn't be possible to get a .exit address from any of these - * sources. */ - log_warn(LD_BUG,"Address '%s.exit', with impossible source for the " - ".exit part. Refusing.", - safe_str_client(socks->address)); - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - tor_assert(!automap); - if (s) { - /* The address was of the form "(stuff).(name).exit */ - if (s[1] != '\0') { - conn->chosen_exit_name = tor_strdup(s+1); - node = node_get_by_nickname(conn->chosen_exit_name, 1); - - if (exit_source == ADDRMAPSRC_TRACKEXIT) { - /* We 5 tries before it expires the addressmap */ - conn->chosen_exit_retries = TRACKHOSTEXITS_RETRIES; - } - *s = 0; - } else { - /* Oops, the address was (stuff)..exit. That's not okay. */ - log_warn(LD_APP,"Malformed exit address '%s.exit'. Refusing.", - safe_str_client(socks->address)); - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - } else { - /* It looks like they just asked for "foo.exit". */ - - conn->chosen_exit_name = tor_strdup(socks->address); - node = node_get_by_nickname(conn->chosen_exit_name, 1); - if (node) { - *socks->address = 0; - node_get_address_string(node, socks->address, sizeof(socks->address)); - } - } - /* Now make sure that the chosen exit exists... */ - if (!node) { - log_warn(LD_APP, - "Unrecognized relay in exit address '%s.exit'. Refusing.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - /* ...and make sure that it isn't excluded. */ - if (routerset_contains_node(excludeset, node)) { - log_warn(LD_APP, - "Excluded relay in exit address '%s.exit'. Refusing.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - /* XXXX024-1090 Should we also allow foo.bar.exit if ExitNodes is set and - Bar is not listed in it? I say yes, but our revised manpage branch - implies no. */ - } - - if (addresstype != ONION_HOSTNAME) { - /* not a hidden-service request (i.e. normal or .exit) */ - if (address_is_invalid_destination(socks->address, 1)) { - control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", - escaped(socks->address)); - log_warn(LD_APP, - "Destination '%s' seems to be an invalid hostname. Failing.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - if (options->Tor2webMode) { - log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname %s " - "because tor2web mode is enabled.", - safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } - - if (socks->command == SOCKS_COMMAND_RESOLVE) { - tor_addr_t answer; - /* Reply to resolves immediately if we can. */ - if (tor_addr_parse(&answer, socks->address) >= 0) {/* is it an IP? */ - /* remember _what_ is supposed to have been resolved. */ - strlcpy(socks->address, orig_address, sizeof(socks->address)); - connection_ap_handshake_socks_resolved_addr(conn, &answer, -1, - map_expires); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_DONE | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return 0; - } - tor_assert(!automap); - rep_hist_note_used_resolve(now); /* help predict this next time */ - } else if (socks->command == SOCKS_COMMAND_CONNECT) { - tor_assert(!automap); - if (socks->port == 0) { - log_notice(LD_APP,"Application asked to connect to port 0. Refusing."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - if (options->ClientRejectInternalAddresses && - !conn->use_begindir && !conn->chosen_exit_name && !circ) { - tor_addr_t addr; - if (tor_addr_hostname_is_local(socks->address) || - (tor_addr_parse(&addr, socks->address) >= 0 && - tor_addr_is_internal(&addr, 0))) { - /* If this is an explicit private address with no chosen exit node, - * then we really don't want to try to connect to it. That's - * probably an error. */ - if (conn->is_transparent_ap) { -#define WARN_INTRVL_LOOP 300 - static ratelim_t loop_warn_limit = RATELIM_INIT(WARN_INTRVL_LOOP); - char *m; - if ((m = rate_limit_log(&loop_warn_limit, approx_time()))) { - log_warn(LD_NET, - "Rejecting request for anonymous connection to private " - "address %s on a TransPort or NATDPort. Possible loop " - "in your NAT rules?%s", safe_str_client(socks->address), - m); - tor_free(m); - } - } else { -#define WARN_INTRVL_PRIV 300 - static ratelim_t priv_warn_limit = RATELIM_INIT(WARN_INTRVL_PRIV); - char *m; - if ((m = rate_limit_log(&priv_warn_limit, approx_time()))) { - log_warn(LD_NET, - "Rejecting SOCKS request for anonymous connection to " - "private address %s.%s", - safe_str_client(socks->address),m); - tor_free(m); - } - } - connection_mark_unattached_ap(conn, END_STREAM_REASON_PRIVATE_ADDR); - return -1; - } - } - - { - tor_addr_t addr; - /* XXX Duplicate call to tor_addr_parse. */ - if (tor_addr_parse(&addr, socks->address) >= 0) { - sa_family_t family = tor_addr_family(&addr); - if ((family == AF_INET && ! conn->ipv4_traffic_ok) || - (family == AF_INET6 && ! conn->ipv4_traffic_ok)) { - log_warn(LD_NET, "Rejecting SOCKS request for an IP address " - "family that this listener does not support."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } else if (family == AF_INET6 && socks->socks_version == 4) { - log_warn(LD_NET, "Rejecting SOCKS4 request for an IPv6 address."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } else if (socks->socks_version == 4 && !conn->ipv4_traffic_ok) { - log_warn(LD_NET, "Rejecting SOCKS4 request on a listener with " - "no IPv4 traffic supported."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); - return -1; - } else if (family == AF_INET6) { - conn->ipv4_traffic_ok = 0; - } else if (family == AF_INET) { - conn->ipv6_traffic_ok = 0; - } - } - } - - if (socks->socks_version == 4) - conn->ipv6_traffic_ok = 0; - - if (!conn->use_begindir && !conn->chosen_exit_name && !circ) { - /* see if we can find a suitable enclave exit */ - const node_t *r = - router_find_exact_exit_enclave(socks->address, socks->port); - if (r) { - log_info(LD_APP, - "Redirecting address %s to exit at enclave router %s", - safe_str_client(socks->address), node_describe(r)); - /* use the hex digest, not nickname, in case there are two - routers with this nickname */ - conn->chosen_exit_name = - tor_strdup(hex_str(r->identity, DIGEST_LEN)); - conn->chosen_exit_optional = 1; - } - } - - /* warn or reject if it's using a dangerous port */ - if (!conn->use_begindir && !conn->chosen_exit_name && !circ) - if (consider_plaintext_ports(conn, socks->port) < 0) - return -1; - - if (!conn->use_begindir) { - /* help predict this next time */ - rep_hist_note_used_port(now, socks->port); - } - } else if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) { - rep_hist_note_used_resolve(now); /* help predict this next time */ - /* no extra processing needed */ - } else { - tor_fragile_assert(); - } - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - if ((circ && connection_ap_handshake_attach_chosen_circuit( - conn, circ, cpath) < 0) || - (!circ && - connection_ap_handshake_attach_circuit(conn) < 0)) { - if (!base_conn->marked_for_close) - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); - return -1; - } - return 0; - } else { - /* it's a hidden-service request */ - rend_cache_entry_t *entry; - int r; - rend_service_authorization_t *client_auth; - rend_data_t *rend_data; - tor_assert(!automap); - if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) { - /* if it's a resolve request, fail it right now, rather than - * building all the circuits and then realizing it won't work. */ - log_warn(LD_APP, - "Resolve requests to hidden services not allowed. Failing."); - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR, - 0,NULL,-1,TIME_MAX); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; - } - - if (circ) { - log_warn(LD_CONTROL, "Attachstream to a circuit is not " - "supported for .onion addresses currently. Failing."); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - ENTRY_TO_EDGE_CONN(conn)->rend_data = rend_data = - tor_malloc_zero(sizeof(rend_data_t)); - strlcpy(rend_data->onion_address, socks->address, - sizeof(rend_data->onion_address)); - log_info(LD_REND,"Got a hidden service request for ID '%s'", - safe_str_client(rend_data->onion_address)); - /* see if we already have it cached */ - r = rend_cache_lookup_entry(rend_data->onion_address, -1, &entry); - if (r<0) { - log_warn(LD_BUG,"Invalid service name '%s'", - safe_str_client(rend_data->onion_address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; - } - - /* Help predict this next time. We're not sure if it will need - * a stable circuit yet, but we know we'll need *something*. */ - rep_hist_note_used_internal(now, 0, 1); - - /* Look up if we have client authorization for it. */ - client_auth = rend_client_lookup_service_authorization( - rend_data->onion_address); - if (client_auth) { - log_info(LD_REND, "Using previously configured client authorization " - "for hidden service request."); - memcpy(rend_data->descriptor_cookie, - client_auth->descriptor_cookie, REND_DESC_COOKIE_LEN); - rend_data->auth_type = client_auth->auth_type; - } - if (r==0) { - base_conn->state = AP_CONN_STATE_RENDDESC_WAIT; - log_info(LD_REND, "Unknown descriptor %s. Fetching.", - safe_str_client(rend_data->onion_address)); - rend_client_refetch_v2_renddesc(rend_data); - } else { /* r > 0 */ - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - log_info(LD_REND, "Descriptor is here. Great."); - if (connection_ap_handshake_attach_circuit(conn) < 0) { - if (!base_conn->marked_for_close) - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); - return -1; - } - } - return 0; - } - return 0; /* unreached but keeps the compiler happy */ -} - -#ifdef TRANS_PF -static int pf_socket = -1; -int -get_pf_socket(void) -{ - int pf; - /* This should be opened before dropping privileges. */ - if (pf_socket >= 0) - return pf_socket; - -#ifdef OPENBSD - /* only works on OpenBSD */ - pf = tor_open_cloexec("/dev/pf", O_RDONLY, 0); -#else - /* works on NetBSD and FreeBSD */ - pf = tor_open_cloexec("/dev/pf", O_RDWR, 0); -#endif - - if (pf < 0) { - log_warn(LD_NET, "open(\"/dev/pf\") failed: %s", strerror(errno)); - return -1; - } - - pf_socket = pf; - return pf_socket; -} -#endif - -/** Fetch the original destination address and port from a - * system-specific interface and put them into a - * socks_request_t as if they came from a socks request. - * - * Return -1 if an error prevents fetching the destination, - * else return 0. - */ -static int -connection_ap_get_original_destination(entry_connection_t *conn, - socks_request_t *req) -{ -#ifdef TRANS_NETFILTER - /* Linux 2.4+ */ - struct sockaddr_storage orig_dst; - socklen_t orig_dst_len = sizeof(orig_dst); - tor_addr_t addr; - - if (getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST, - (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) { - int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); - log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e)); - return -1; - } - - tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port); - tor_addr_to_str(req->address, &addr, sizeof(req->address), 1); - - return 0; -#elif defined(TRANS_PF) - struct sockaddr_storage proxy_addr; - socklen_t proxy_addr_len = sizeof(proxy_addr); - struct sockaddr *proxy_sa = (struct sockaddr*) &proxy_addr; - struct pfioc_natlook pnl; - tor_addr_t addr; - int pf = -1; - - if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&proxy_addr, - &proxy_addr_len) < 0) { - int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); - log_warn(LD_NET, "getsockname() to determine transocks destination " - "failed: %s", tor_socket_strerror(e)); - return -1; - } - - memset(&pnl, 0, sizeof(pnl)); - pnl.proto = IPPROTO_TCP; - pnl.direction = PF_OUT; - if (proxy_sa->sa_family == AF_INET) { - struct sockaddr_in *sin = (struct sockaddr_in *)proxy_sa; - pnl.af = AF_INET; - pnl.saddr.v4.s_addr = tor_addr_to_ipv4n(&ENTRY_TO_CONN(conn)->addr); - pnl.sport = htons(ENTRY_TO_CONN(conn)->port); - pnl.daddr.v4.s_addr = sin->sin_addr.s_addr; - pnl.dport = sin->sin_port; - } else if (proxy_sa->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)proxy_sa; - pnl.af = AF_INET6; - memcpy(&pnl.saddr.v6, tor_addr_to_in6(&ENTRY_TO_CONN(conn)->addr), - sizeof(struct in6_addr)); - pnl.sport = htons(ENTRY_TO_CONN(conn)->port); - memcpy(&pnl.daddr.v6, &sin6->sin6_addr, sizeof(struct in6_addr)); - pnl.dport = sin6->sin6_port; - } else { - log_warn(LD_NET, "getsockname() gave an unexpected address family (%d)", - (int)proxy_sa->sa_family); - return -1; - } - - pf = get_pf_socket(); - if (pf<0) - return -1; - - if (ioctl(pf, DIOCNATLOOK, &pnl) < 0) { - log_warn(LD_NET, "ioctl(DIOCNATLOOK) failed: %s", strerror(errno)); - return -1; - } - - if (pnl.af == AF_INET) { - tor_addr_from_ipv4n(&addr, pnl.rdaddr.v4.s_addr); - } else if (pnl.af == AF_INET6) { - tor_addr_from_in6(&addr, &pnl.rdaddr.v6); - } else { - tor_fragile_assert(); - return -1; - } - - tor_addr_to_str(req->address, &addr, sizeof(req->address), 1); - req->port = ntohs(pnl.rdport); - - return 0; -#else - (void)conn; - (void)req; - log_warn(LD_BUG, "Called connection_ap_get_original_destination, but no " - "transparent proxy method was configured."); - return -1; -#endif -} - -/** connection_edge_process_inbuf() found a conn in state - * socks_wait. See if conn->inbuf has the right bytes to proceed with - * the socks handshake. - * - * If the handshake is complete, send it to - * connection_ap_handshake_rewrite_and_attach(). - * - * Return -1 if an unexpected error with conn occurs (and mark it for close), - * else return 0. - */ -static int -connection_ap_handshake_process_socks(entry_connection_t *conn) -{ - socks_request_t *socks; - int sockshere; - const or_options_t *options = get_options(); - int had_reply = 0; - connection_t *base_conn = ENTRY_TO_CONN(conn); - - tor_assert(conn); - tor_assert(base_conn->type == CONN_TYPE_AP); - tor_assert(base_conn->state == AP_CONN_STATE_SOCKS_WAIT); - tor_assert(conn->socks_request); - socks = conn->socks_request; - - log_debug(LD_APP,"entered."); - - IF_HAS_BUFFEREVENT(base_conn, { - struct evbuffer *input = bufferevent_get_input(base_conn->bufev); - sockshere = fetch_from_evbuffer_socks(input, socks, - options->TestSocks, options->SafeSocks); - }) ELSE_IF_NO_BUFFEREVENT { - sockshere = fetch_from_buf_socks(base_conn->inbuf, socks, - options->TestSocks, options->SafeSocks); - }; - - if (socks->replylen) { - had_reply = 1; - connection_write_to_buf((const char*)socks->reply, socks->replylen, - base_conn); - socks->replylen = 0; - if (sockshere == -1) { - /* An invalid request just got a reply, no additional - * one is necessary. */ - socks->has_finished = 1; - } - } - - if (sockshere == 0) { - log_debug(LD_APP,"socks handshake not all here yet."); - return 0; - } else if (sockshere == -1) { - if (!had_reply) { - log_warn(LD_APP,"Fetching socks handshake failed. Closing."); - connection_ap_handshake_socks_reply(conn, NULL, 0, - END_STREAM_REASON_SOCKSPROTOCOL); - } - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; - } /* else socks handshake is done, continue processing */ - - if (SOCKS_COMMAND_IS_CONNECT(socks->command)) - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - else - control_event_stream_status(conn, STREAM_EVENT_NEW_RESOLVE, 0); - - return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); -} - -/** connection_init_accepted_conn() found a new trans AP conn. - * Get the original destination and send it to - * connection_ap_handshake_rewrite_and_attach(). - * - * Return -1 if an unexpected error with conn (and it should be marked - * for close), else return 0. - */ -int -connection_ap_process_transparent(entry_connection_t *conn) -{ - socks_request_t *socks; - - tor_assert(conn); - tor_assert(conn->socks_request); - socks = conn->socks_request; - - /* pretend that a socks handshake completed so we don't try to - * send a socks reply down a transparent conn */ - socks->command = SOCKS_COMMAND_CONNECT; - socks->has_finished = 1; - - log_debug(LD_APP,"entered."); - - if (connection_ap_get_original_destination(conn, socks) < 0) { - log_warn(LD_APP,"Fetching original destination failed. Closing."); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_CANT_FETCH_ORIG_DEST); - return -1; - } - /* we have the original destination */ - - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - - return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); -} - -/** connection_edge_process_inbuf() found a conn in state natd_wait. See if - * conn-\>inbuf has the right bytes to proceed. See FreeBSD's libalias(3) and - * ProxyEncodeTcpStream() in src/lib/libalias/alias_proxy.c for the encoding - * form of the original destination. - * - * If the original destination is complete, send it to - * connection_ap_handshake_rewrite_and_attach(). - * - * Return -1 if an unexpected error with conn (and it should be marked - * for close), else return 0. - */ -static int -connection_ap_process_natd(entry_connection_t *conn) -{ - char tmp_buf[36], *tbuf, *daddr; - size_t tlen = 30; - int err, port_ok; - socks_request_t *socks; - - tor_assert(conn); - tor_assert(ENTRY_TO_CONN(conn)->state == AP_CONN_STATE_NATD_WAIT); - tor_assert(conn->socks_request); - socks = conn->socks_request; - - log_debug(LD_APP,"entered."); - - /* look for LF-terminated "[DEST ip_addr port]" - * where ip_addr is a dotted-quad and port is in string form */ - err = connection_fetch_from_buf_line(ENTRY_TO_CONN(conn), tmp_buf, &tlen); - if (err == 0) - return 0; - if (err < 0) { - log_warn(LD_APP,"NATD handshake failed (DEST too long). Closing"); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INVALID_NATD_DEST); - return -1; - } - - if (strcmpstart(tmp_buf, "[DEST ")) { - log_warn(LD_APP,"NATD handshake was ill-formed; closing. The client " - "said: %s", - escaped(tmp_buf)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INVALID_NATD_DEST); - return -1; - } - - daddr = tbuf = &tmp_buf[0] + 6; /* after end of "[DEST " */ - if (!(tbuf = strchr(tbuf, ' '))) { - log_warn(LD_APP,"NATD handshake was ill-formed; closing. The client " - "said: %s", - escaped(tmp_buf)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INVALID_NATD_DEST); - return -1; - } - *tbuf++ = '\0'; - - /* pretend that a socks handshake completed so we don't try to - * send a socks reply down a natd conn */ - strlcpy(socks->address, daddr, sizeof(socks->address)); - socks->port = (uint16_t) - tor_parse_long(tbuf, 10, 1, 65535, &port_ok, &daddr); - if (!port_ok) { - log_warn(LD_APP,"NATD handshake failed; port %s is ill-formed or out " - "of range.", escaped(tbuf)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INVALID_NATD_DEST); - return -1; - } - - socks->command = SOCKS_COMMAND_CONNECT; - socks->has_finished = 1; - - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - - ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_CIRCUIT_WAIT; - - return connection_ap_rewrite_and_attach_if_allowed(conn, NULL, NULL); -} - -/** Iterate over the two bytes of stream_id until we get one that is not - * already in use; return it. Return 0 if can't get a unique stream_id. - */ -streamid_t -get_unique_stream_id_by_circ(origin_circuit_t *circ) -{ - edge_connection_t *tmpconn; - streamid_t test_stream_id; - uint32_t attempts=0; - - again: - test_stream_id = circ->next_stream_id++; - if (++attempts > 1<<16) { - /* Make sure we don't loop forever if all stream_id's are used. */ - log_warn(LD_APP,"No unused stream IDs. Failing."); - return 0; - } - if (test_stream_id == 0) - goto again; - for (tmpconn = circ->p_streams; tmpconn; tmpconn=tmpconn->next_stream) - if (tmpconn->stream_id == test_stream_id) - goto again; - return test_stream_id; -} - -/** Return true iff conn is linked to a circuit and configured to use - * an exit that supports optimistic data. */ -static int -connection_ap_supports_optimistic_data(const entry_connection_t *conn) -{ - const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn); - /* We can only send optimistic data if we're connected to an open - general circuit. */ - if (edge_conn->on_circuit == NULL || - edge_conn->on_circuit->state != CIRCUIT_STATE_OPEN || - edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL) - return 0; - - return conn->may_use_optimistic_data; -} - -/** Return a bitmask of BEGIN_FLAG_* flags that we should transmit in the - * RELAY_BEGIN cell for ap_conn. */ -static uint32_t -connection_ap_get_begincell_flags(entry_connection_t *ap_conn) -{ - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(ap_conn); - const node_t *exitnode = NULL; - const crypt_path_t *cpath_layer = edge_conn->cpath_layer; - uint32_t flags = 0; - - /* No flags for begindir */ - if (ap_conn->use_begindir) - return 0; - - /* No flags for hidden services. */ - if (edge_conn->on_circuit->purpose != CIRCUIT_PURPOSE_C_GENERAL) - return 0; - - /* If only IPv4 is supported, no flags */ - if (ap_conn->ipv4_traffic_ok && !ap_conn->ipv6_traffic_ok) - return 0; - - if (! cpath_layer || - ! cpath_layer->extend_info) - return 0; - - if (!ap_conn->ipv4_traffic_ok) - flags |= BEGIN_FLAG_IPV4_NOT_OK; - - exitnode = node_get_by_id(cpath_layer->extend_info->identity_digest); - - if (ap_conn->ipv6_traffic_ok && exitnode) { - tor_addr_t a; - tor_addr_make_null(&a, AF_INET6); - if (compare_tor_addr_to_node_policy(&a, ap_conn->socks_request->port, - exitnode) - != ADDR_POLICY_REJECTED) { - /* Only say "IPv6 OK" if the exit node supports IPv6. Otherwise there's - * no point. */ - flags |= BEGIN_FLAG_IPV6_OK; - } - } - - if (flags == BEGIN_FLAG_IPV6_OK) { - /* When IPv4 and IPv6 are both allowed, consider whether to say we - * prefer IPv6. Otherwise there's no point in declaring a preference */ - if (ap_conn->prefer_ipv6_traffic) - flags |= BEGIN_FLAG_IPV6_PREFERRED; - } - - if (flags == BEGIN_FLAG_IPV4_NOT_OK) { - log_warn(LD_EDGE, "I'm about to ask a node for a connection that I " - "am telling it to fulfil with neither IPv4 nor IPv6. That's " - "not going to work. Did you perhaps ask for an IPv6 address " - "on an IPv4Only port, or vice versa?"); - } - - return flags; -} - -/** Write a relay begin cell, using destaddr and destport from ap_conn's - * socks_request field, and send it down circ. - * - * If ap_conn is broken, mark it for close and return -1. Else return 0. - */ -int -connection_ap_handshake_send_begin(entry_connection_t *ap_conn) -{ - char payload[CELL_PAYLOAD_SIZE]; - int payload_len; - int begin_type; - origin_circuit_t *circ; - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(ap_conn); - connection_t *base_conn = TO_CONN(edge_conn); - tor_assert(edge_conn->on_circuit); - circ = TO_ORIGIN_CIRCUIT(edge_conn->on_circuit); - - tor_assert(base_conn->type == CONN_TYPE_AP); - tor_assert(base_conn->state == AP_CONN_STATE_CIRCUIT_WAIT); - tor_assert(ap_conn->socks_request); - tor_assert(SOCKS_COMMAND_IS_CONNECT(ap_conn->socks_request->command)); - - edge_conn->stream_id = get_unique_stream_id_by_circ(circ); - if (edge_conn->stream_id==0) { - /* XXXX024 Instead of closing this stream, we should make it get - * retried on another circuit. */ - connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); - - /* Mark this circuit "unusable for new streams". */ - mark_circuit_unusable_for_new_conns(circ); - return -1; - } - - /* Set up begin cell flags. */ - edge_conn->begincell_flags = connection_ap_get_begincell_flags(ap_conn); - - tor_snprintf(payload,RELAY_PAYLOAD_SIZE, "%s:%d", - (circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL) ? - ap_conn->socks_request->address : "", - ap_conn->socks_request->port); - payload_len = (int)strlen(payload)+1; - if (payload_len <= RELAY_PAYLOAD_SIZE - 4 && edge_conn->begincell_flags) { - set_uint32(payload + payload_len, htonl(edge_conn->begincell_flags)); - payload_len += 4; - } - - log_info(LD_APP, - "Sending relay cell %d to begin stream %d.", - (int)ap_conn->use_begindir, - edge_conn->stream_id); - - begin_type = ap_conn->use_begindir ? - RELAY_COMMAND_BEGIN_DIR : RELAY_COMMAND_BEGIN; - if (begin_type == RELAY_COMMAND_BEGIN) { -#ifndef NON_ANONYMOUS_MODE_ENABLED - tor_assert(circ->build_state->onehop_tunnel == 0); -#endif - } - - if (connection_edge_send_command(edge_conn, begin_type, - begin_type == RELAY_COMMAND_BEGIN ? payload : NULL, - begin_type == RELAY_COMMAND_BEGIN ? payload_len : 0) < 0) - return -1; /* circuit is closed, don't continue */ - - edge_conn->package_window = STREAMWINDOW_START; - edge_conn->deliver_window = STREAMWINDOW_START; - base_conn->state = AP_CONN_STATE_CONNECT_WAIT; - log_info(LD_APP,"Address/port sent, ap socket "TOR_SOCKET_T_FORMAT - ", n_circ_id %u", - base_conn->s, (unsigned)circ->base_.n_circ_id); - control_event_stream_status(ap_conn, STREAM_EVENT_SENT_CONNECT, 0); - - /* If there's queued-up data, send it now */ - if ((connection_get_inbuf_len(base_conn) || - ap_conn->sending_optimistic_data) && - connection_ap_supports_optimistic_data(ap_conn)) { - log_info(LD_APP, "Sending up to %ld + %ld bytes of queued-up data", - (long)connection_get_inbuf_len(base_conn), - ap_conn->sending_optimistic_data ? - (long)generic_buffer_len(ap_conn->sending_optimistic_data) : 0); - if (connection_edge_package_raw_inbuf(edge_conn, 1, NULL) < 0) { - connection_mark_for_close(base_conn); - } - } - - return 0; -} - -/** Write a relay resolve cell, using destaddr and destport from ap_conn's - * socks_request field, and send it down circ. - * - * If ap_conn is broken, mark it for close and return -1. Else return 0. - */ -int -connection_ap_handshake_send_resolve(entry_connection_t *ap_conn) -{ - int payload_len, command; - const char *string_addr; - char inaddr_buf[REVERSE_LOOKUP_NAME_BUF_LEN]; - origin_circuit_t *circ; - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(ap_conn); - connection_t *base_conn = TO_CONN(edge_conn); - tor_assert(edge_conn->on_circuit); - circ = TO_ORIGIN_CIRCUIT(edge_conn->on_circuit); - - tor_assert(base_conn->type == CONN_TYPE_AP); - tor_assert(base_conn->state == AP_CONN_STATE_CIRCUIT_WAIT); - tor_assert(ap_conn->socks_request); - tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL); - - command = ap_conn->socks_request->command; - tor_assert(SOCKS_COMMAND_IS_RESOLVE(command)); - - edge_conn->stream_id = get_unique_stream_id_by_circ(circ); - if (edge_conn->stream_id==0) { - /* XXXX024 Instead of closing this stream, we should make it get - * retried on another circuit. */ - connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); - - /* Mark this circuit "unusable for new streams". */ - mark_circuit_unusable_for_new_conns(circ); - return -1; - } - - if (command == SOCKS_COMMAND_RESOLVE) { - string_addr = ap_conn->socks_request->address; - payload_len = (int)strlen(string_addr)+1; - } else { - /* command == SOCKS_COMMAND_RESOLVE_PTR */ - const char *a = ap_conn->socks_request->address; - tor_addr_t addr; - int r; - - /* We're doing a reverse lookup. The input could be an IP address, or - * could be an .in-addr.arpa or .ip6.arpa address */ - r = tor_addr_parse_PTR_name(&addr, a, AF_UNSPEC, 1); - if (r <= 0) { - log_warn(LD_APP, "Rejecting ill-formed reverse lookup of %s", - safe_str_client(a)); - connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); - return -1; - } - - r = tor_addr_to_PTR_name(inaddr_buf, sizeof(inaddr_buf), &addr); - if (r < 0) { - log_warn(LD_BUG, "Couldn't generate reverse lookup hostname of %s", - safe_str_client(a)); - connection_mark_unattached_ap(ap_conn, END_STREAM_REASON_INTERNAL); - return -1; - } - - string_addr = inaddr_buf; - payload_len = (int)strlen(inaddr_buf)+1; - tor_assert(payload_len <= (int)sizeof(inaddr_buf)); - } - - log_debug(LD_APP, - "Sending relay cell to begin stream %d.", edge_conn->stream_id); - - if (connection_edge_send_command(edge_conn, - RELAY_COMMAND_RESOLVE, - string_addr, payload_len) < 0) - return -1; /* circuit is closed, don't continue */ - - if (!base_conn->address) { - /* This might be unnecessary. XXXX */ - base_conn->address = tor_dup_addr(&base_conn->addr); - } - base_conn->state = AP_CONN_STATE_RESOLVE_WAIT; - log_info(LD_APP,"Address sent for resolve, ap socket "TOR_SOCKET_T_FORMAT - ", n_circ_id %u", - base_conn->s, (unsigned)circ->base_.n_circ_id); - control_event_stream_status(ap_conn, STREAM_EVENT_SENT_RESOLVE, 0); - return 0; -} - -/** Make an AP connection_t linked to the connection_t partner. make a - * new linked connection pair, and attach one side to the conn, connection_add - * it, initialize it to circuit_wait, and call - * connection_ap_handshake_attach_circuit(conn) on it. - * - * Return the newly created end of the linked connection pair, or -1 if error. - */ -entry_connection_t * -connection_ap_make_link(connection_t *partner, - char *address, uint16_t port, - const char *digest, - int session_group, int isolation_flags, - int use_begindir, int want_onehop) -{ - entry_connection_t *conn; - connection_t *base_conn; - - log_info(LD_APP,"Making internal %s tunnel to %s:%d ...", - want_onehop ? "direct" : "anonymized", - safe_str_client(address), port); - - conn = entry_connection_new(CONN_TYPE_AP, tor_addr_family(&partner->addr)); - base_conn = ENTRY_TO_CONN(conn); - base_conn->linked = 1; /* so that we can add it safely below. */ - - /* populate conn->socks_request */ - - /* leave version at zero, so the socks_reply is empty */ - conn->socks_request->socks_version = 0; - conn->socks_request->has_finished = 0; /* waiting for 'connected' */ - strlcpy(conn->socks_request->address, address, - sizeof(conn->socks_request->address)); - conn->socks_request->port = port; - conn->socks_request->command = SOCKS_COMMAND_CONNECT; - conn->want_onehop = want_onehop; - conn->use_begindir = use_begindir; - if (use_begindir) { - conn->chosen_exit_name = tor_malloc(HEX_DIGEST_LEN+2); - conn->chosen_exit_name[0] = '$'; - tor_assert(digest); - base16_encode(conn->chosen_exit_name+1,HEX_DIGEST_LEN+1, - digest, DIGEST_LEN); - } - - /* Populate isolation fields. */ - conn->socks_request->listener_type = CONN_TYPE_DIR_LISTENER; - conn->original_dest_address = tor_strdup(address); - conn->session_group = session_group; - conn->isolation_flags = isolation_flags; - - base_conn->address = tor_strdup("(Tor_internal)"); - tor_addr_make_unspec(&base_conn->addr); - base_conn->port = 0; - - connection_link_connections(partner, base_conn); - - if (connection_add(base_conn) < 0) { /* no space, forget it */ - connection_free(base_conn); - return NULL; - } - - base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - - control_event_stream_status(conn, STREAM_EVENT_NEW, 0); - - /* attaching to a dirty circuit is fine */ - if (connection_ap_handshake_attach_circuit(conn) < 0) { - if (!base_conn->marked_for_close) - connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); - return NULL; - } - - log_info(LD_APP,"... application connection created and linked."); - return conn; -} - -/** Notify any interested controller connections about a new hostname resolve - * or resolve error. Takes the same arguments as does - * connection_ap_handshake_socks_resolved(). */ -static void -tell_controller_about_resolved_result(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const char *answer, - int ttl, - time_t expires) -{ - expires = time(NULL) + ttl; - if (answer_type == RESOLVED_TYPE_IPV4 && answer_len >= 4) { - char *cp = tor_dup_ip(ntohl(get_uint32(answer))); - control_event_address_mapped(conn->socks_request->address, - cp, expires, NULL, 0); - tor_free(cp); - } else if (answer_type == RESOLVED_TYPE_HOSTNAME && answer_len < 256) { - char *cp = tor_strndup(answer, answer_len); - control_event_address_mapped(conn->socks_request->address, - cp, expires, NULL, 0); - tor_free(cp); - } else { - control_event_address_mapped(conn->socks_request->address, - "", time(NULL)+ttl, - "error=yes", 0); - } -} - -/** - * As connection_ap_handshake_socks_resolved, but take a tor_addr_t to send - * as the answer. - */ -static void -connection_ap_handshake_socks_resolved_addr(entry_connection_t *conn, - const tor_addr_t *answer, - int ttl, - time_t expires) -{ - if (tor_addr_family(answer) == AF_INET) { - uint32_t a = tor_addr_to_ipv4n(answer); /* network order */ - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_IPV4,4, - (uint8_t*)&a, - ttl, expires); - } else if (tor_addr_family(answer) == AF_INET6) { - const uint8_t *a = tor_addr_to_in6_addr8(answer); - connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_IPV6,16, - a, - ttl, expires); - } else { - log_warn(LD_BUG, "Got called with address of unexpected family %d", - tor_addr_family(answer)); - connection_ap_handshake_socks_resolved(conn, - RESOLVED_TYPE_ERROR,0,NULL,-1,-1); - } -} - -/** Send an answer to an AP connection that has requested a DNS lookup via - * SOCKS. The type should be one of RESOLVED_TYPE_(IPV4|IPV6|HOSTNAME) or -1 - * for unreachable; the answer should be in the format specified in the socks - * extensions document. ttl is the ttl for the answer, or -1 on - * certain errors or for values that didn't come via DNS. expires is - * a time when the answer expires, or -1 or TIME_MAX if there's a good TTL. - **/ -/* XXXX the use of the ttl and expires fields is nutty. Let's make this - * interface and those that use it less ugly. */ -void -connection_ap_handshake_socks_resolved(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const uint8_t *answer, - int ttl, - time_t expires) -{ - char buf[384]; - size_t replylen; - - if (ttl >= 0) { - if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { - tor_addr_t a; - tor_addr_from_ipv4n(&a, get_uint32(answer)); - if (! tor_addr_is_null(&a)) { - client_dns_set_addressmap(conn, - conn->socks_request->address, &a, - conn->chosen_exit_name, ttl); - } - } else if (answer_type == RESOLVED_TYPE_IPV6 && answer_len == 16) { - tor_addr_t a; - tor_addr_from_ipv6_bytes(&a, (char*)answer); - if (! tor_addr_is_null(&a)) { - client_dns_set_addressmap(conn, - conn->socks_request->address, &a, - conn->chosen_exit_name, ttl); - } - } else if (answer_type == RESOLVED_TYPE_HOSTNAME && answer_len < 256) { - char *cp = tor_strndup((char*)answer, answer_len); - client_dns_set_reverse_addressmap(conn, - conn->socks_request->address, - cp, - conn->chosen_exit_name, ttl); - tor_free(cp); - } - } - - if (ENTRY_TO_EDGE_CONN(conn)->is_dns_request) { - if (conn->dns_server_request) { - /* We had a request on our DNS port: answer it. */ - dnsserv_resolved(conn, answer_type, answer_len, (char*)answer, ttl); - conn->socks_request->has_finished = 1; - return; - } else { - /* This must be a request from the controller. Since answers to those - * requests are not cached, they do not generate an ADDRMAP event on - * their own. */ - tell_controller_about_resolved_result(conn, answer_type, answer_len, - (char*)answer, ttl, expires); - conn->socks_request->has_finished = 1; - return; - } - /* We shouldn't need to free conn here; it gets marked by the caller. */ - } - - if (conn->socks_request->socks_version == 4) { - buf[0] = 0x00; /* version */ - if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { - buf[1] = SOCKS4_GRANTED; - set_uint16(buf+2, 0); - memcpy(buf+4, answer, 4); /* address */ - replylen = SOCKS4_NETWORK_LEN; - } else { /* "error" */ - buf[1] = SOCKS4_REJECT; - memset(buf+2, 0, 6); - replylen = SOCKS4_NETWORK_LEN; - } - } else if (conn->socks_request->socks_version == 5) { - /* SOCKS5 */ - buf[0] = 0x05; /* version */ - if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) { - buf[1] = SOCKS5_SUCCEEDED; - buf[2] = 0; /* reserved */ - buf[3] = 0x01; /* IPv4 address type */ - memcpy(buf+4, answer, 4); /* address */ - set_uint16(buf+8, 0); /* port == 0. */ - replylen = 10; - } else if (answer_type == RESOLVED_TYPE_IPV6 && answer_len == 16) { - buf[1] = SOCKS5_SUCCEEDED; - buf[2] = 0; /* reserved */ - buf[3] = 0x04; /* IPv6 address type */ - memcpy(buf+4, answer, 16); /* address */ - set_uint16(buf+20, 0); /* port == 0. */ - replylen = 22; - } else if (answer_type == RESOLVED_TYPE_HOSTNAME && answer_len < 256) { - buf[1] = SOCKS5_SUCCEEDED; - buf[2] = 0; /* reserved */ - buf[3] = 0x03; /* Domainname address type */ - buf[4] = (char)answer_len; - memcpy(buf+5, answer, answer_len); /* address */ - set_uint16(buf+5+answer_len, 0); /* port == 0. */ - replylen = 5+answer_len+2; - } else { - buf[1] = SOCKS5_HOST_UNREACHABLE; - memset(buf+2, 0, 8); - replylen = 10; - } - } else { - /* no socks version info; don't send anything back */ - return; - } - connection_ap_handshake_socks_reply(conn, buf, replylen, - (answer_type == RESOLVED_TYPE_IPV4 || - answer_type == RESOLVED_TYPE_IPV6 || - answer_type == RESOLVED_TYPE_HOSTNAME) ? - 0 : END_STREAM_REASON_RESOLVEFAILED); -} - -/** Send a socks reply to stream conn, using the appropriate - * socks version, etc, and mark conn as completed with SOCKS - * handshaking. - * - * If reply is defined, then write replylen bytes of it to conn - * and return, else reply based on endreason (one of - * END_STREAM_REASON_*). If reply is undefined, endreason can't - * be 0 or REASON_DONE. Send endreason to the controller, if appropriate. - */ -void -connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, - size_t replylen, int endreason) -{ - char buf[256]; - socks5_reply_status_t status = - stream_end_reason_to_socks5_response(endreason); - - tor_assert(conn->socks_request); /* make sure it's an AP stream */ - - if (!SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) { - control_event_stream_status(conn, status==SOCKS5_SUCCEEDED ? - STREAM_EVENT_SUCCEEDED : STREAM_EVENT_FAILED, - endreason); - } - - /* Flag this stream's circuit as having completed a stream successfully - * (for path bias) */ - if (status == SOCKS5_SUCCEEDED || - endreason == END_STREAM_REASON_RESOLVEFAILED || - endreason == END_STREAM_REASON_CONNECTREFUSED || - endreason == END_STREAM_REASON_CONNRESET || - endreason == END_STREAM_REASON_NOROUTE || - endreason == END_STREAM_REASON_RESOURCELIMIT) { - if (!conn->edge_.on_circuit || - !CIRCUIT_IS_ORIGIN(conn->edge_.on_circuit)) { - // DNS remaps can trigger this. So can failed hidden service - // lookups. - log_info(LD_BUG, - "No origin circuit for successful SOCKS stream "U64_FORMAT - ". Reason: %d", - U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier), - endreason); - } else { - // XXX: Hrmm. It looks like optimistic data can't go through this - // codepath, but someone should probably test it and make sure. - // We don't want to mark optimistically opened streams as successful. - pathbias_mark_use_success(TO_ORIGIN_CIRCUIT(conn->edge_.on_circuit)); - } - } - - if (conn->socks_request->has_finished) { - log_warn(LD_BUG, "(Harmless.) duplicate calls to " - "connection_ap_handshake_socks_reply."); - return; - } - if (replylen) { /* we already have a reply in mind */ - connection_write_to_buf(reply, replylen, ENTRY_TO_CONN(conn)); - conn->socks_request->has_finished = 1; - return; - } - if (conn->socks_request->socks_version == 4) { - memset(buf,0,SOCKS4_NETWORK_LEN); - buf[1] = (status==SOCKS5_SUCCEEDED ? SOCKS4_GRANTED : SOCKS4_REJECT); - /* leave version, destport, destip zero */ - connection_write_to_buf(buf, SOCKS4_NETWORK_LEN, ENTRY_TO_CONN(conn)); - } else if (conn->socks_request->socks_version == 5) { - buf[0] = 5; /* version 5 */ - buf[1] = (char)status; - buf[2] = 0; - buf[3] = 1; /* ipv4 addr */ - memset(buf+4,0,6); /* Set external addr/port to 0. - The spec doesn't seem to say what to do here. -RD */ - connection_write_to_buf(buf,10,ENTRY_TO_CONN(conn)); - } - /* If socks_version isn't 4 or 5, don't send anything. - * This can happen in the case of AP bridges. */ - conn->socks_request->has_finished = 1; - return; -} - -/** Read a RELAY_BEGIN or RELAY_BEGINDIR cell from cell, decode it, and - * place the result in bcell. On success return 0; on failure return - * <0 and set *end_reason_out to the end reason we should send back to - * the client. - * - * Return -1 in the case where want to send a RELAY_END cell, and < -1 when - * we don't. - **/ -STATIC int -begin_cell_parse(const cell_t *cell, begin_cell_t *bcell, - uint8_t *end_reason_out) -{ - relay_header_t rh; - const uint8_t *body, *nul; - - memset(bcell, 0, sizeof(*bcell)); - *end_reason_out = END_STREAM_REASON_MISC; - - relay_header_unpack(&rh, cell->payload); - if (rh.length > RELAY_PAYLOAD_SIZE) { - return -2; /*XXXX why not TORPROTOCOL? */ - } - - bcell->stream_id = rh.stream_id; - - if (rh.command == RELAY_COMMAND_BEGIN_DIR) { - bcell->is_begindir = 1; - return 0; - } else if (rh.command != RELAY_COMMAND_BEGIN) { - log_warn(LD_BUG, "Got an unexpected command %d", (int)rh.command); - *end_reason_out = END_STREAM_REASON_INTERNAL; - return -1; - } - - body = cell->payload + RELAY_HEADER_SIZE; - nul = memchr(body, 0, rh.length); - if (! nul) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Relay begin cell has no \\0. Closing."); - *end_reason_out = END_STREAM_REASON_TORPROTOCOL; - return -1; - } - - if (tor_addr_port_split(LOG_PROTOCOL_WARN, - (char*)(body), - &bcell->address,&bcell->port)<0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Unable to parse addr:port in relay begin cell. Closing."); - *end_reason_out = END_STREAM_REASON_TORPROTOCOL; - return -1; - } - if (bcell->port == 0) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Missing port in relay begin cell. Closing."); - tor_free(bcell->address); - *end_reason_out = END_STREAM_REASON_TORPROTOCOL; - return -1; - } - if (body + rh.length >= nul + 4) - bcell->flags = ntohl(get_uint32(nul+1)); - - return 0; -} - -/** A relay 'begin' or 'begin_dir' cell has arrived, and either we are - * an exit hop for the circuit, or we are the origin and it is a - * rendezvous begin. - * - * Launch a new exit connection and initialize things appropriately. - * - * If it's a rendezvous stream, call connection_exit_connect() on - * it. - * - * For general streams, call dns_resolve() on it first, and only call - * connection_exit_connect() if the dns answer is already known. - * - * Note that we don't call connection_add() on the new stream! We wait - * for connection_exit_connect() to do that. - * - * Return -(some circuit end reason) if we want to tear down circ. - * Else return 0. - */ -int -connection_exit_begin_conn(cell_t *cell, circuit_t *circ) -{ - edge_connection_t *n_stream; - relay_header_t rh; - char *address = NULL; - uint16_t port = 0; - or_circuit_t *or_circ = NULL; - const or_options_t *options = get_options(); - begin_cell_t bcell; - int r; - uint8_t end_reason=0; - - assert_circuit_ok(circ); - if (!CIRCUIT_IS_ORIGIN(circ)) - or_circ = TO_OR_CIRCUIT(circ); - - relay_header_unpack(&rh, cell->payload); - if (rh.length > RELAY_PAYLOAD_SIZE) - return -1; - - /* Note: we have to use relay_send_command_from_edge here, not - * connection_edge_end or connection_edge_send_command, since those require - * that we have a stream connected to a circuit, and we don't connect to a - * circuit until we have a pending/successful resolve. */ - - if (!server_mode(options) && - circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED) { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Relay begin cell at non-server. Closing."); - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_EXITPOLICY, NULL); - return 0; - } - - r = begin_cell_parse(cell, &bcell, &end_reason); - if (r < -1) { - return -1; - } else if (r == -1) { - tor_free(bcell.address); - relay_send_end_cell_from_edge(rh.stream_id, circ, end_reason, NULL); - return 0; - } - - if (! bcell.is_begindir) { - /* Steal reference */ - address = bcell.address; - port = bcell.port; - - if (or_circ && or_circ->p_chan) { - if (!options->AllowSingleHopExits && - (or_circ->is_first_hop || - (!connection_or_digest_is_known_relay( - or_circ->p_chan->identity_digest) && - should_refuse_unknown_exits(options)))) { - /* Don't let clients use us as a single-hop proxy, unless the user - * has explicitly allowed that in the config. It attracts attackers - * and users who'd be better off with, well, single-hop proxies. - */ - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Attempt by %s to open a stream %s. Closing.", - safe_str(channel_get_canonical_remote_descr(or_circ->p_chan)), - or_circ->is_first_hop ? "on first hop of circuit" : - "from unknown relay"); - relay_send_end_cell_from_edge(rh.stream_id, circ, - or_circ->is_first_hop ? - END_STREAM_REASON_TORPROTOCOL : - END_STREAM_REASON_MISC, - NULL); - tor_free(address); - return 0; - } - } - } else if (rh.command == RELAY_COMMAND_BEGIN_DIR) { - if (!directory_permits_begindir_requests(options) || - circ->purpose != CIRCUIT_PURPOSE_OR) { - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_NOTDIRECTORY, NULL); - return 0; - } - /* Make sure to get the 'real' address of the previous hop: the - * caller might want to know whether his IP address has changed, and - * we might already have corrected base_.addr[ess] for the relay's - * canonical IP address. */ - if (or_circ && or_circ->p_chan) - address = tor_strdup(channel_get_actual_remote_address(or_circ->p_chan)); - else - address = tor_strdup("127.0.0.1"); - port = 1; /* XXXX This value is never actually used anywhere, and there - * isn't "really" a connection here. But we - * need to set it to something nonzero. */ - } else { - log_warn(LD_BUG, "Got an unexpected command %d", (int)rh.command); - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_INTERNAL, NULL); - return 0; - } - - if (! options->IPv6Exit) { - /* I don't care if you prefer IPv6; I can't give you any. */ - bcell.flags &= ~BEGIN_FLAG_IPV6_PREFERRED; - /* If you don't want IPv4, I can't help. */ - if (bcell.flags & BEGIN_FLAG_IPV4_NOT_OK) { - tor_free(address); - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_EXITPOLICY, NULL); - return 0; - } - } - - log_debug(LD_EXIT,"Creating new exit connection."); - /* The 'AF_INET' here is temporary; we might need to change it later in - * connection_exit_connect(). */ - n_stream = edge_connection_new(CONN_TYPE_EXIT, AF_INET); - - /* Remember the tunneled request ID in the new edge connection, so that - * we can measure download times. */ - n_stream->dirreq_id = circ->dirreq_id; - - n_stream->base_.purpose = EXIT_PURPOSE_CONNECT; - n_stream->begincell_flags = bcell.flags; - n_stream->stream_id = rh.stream_id; - n_stream->base_.port = port; - /* leave n_stream->s at -1, because it's not yet valid */ - n_stream->package_window = STREAMWINDOW_START; - n_stream->deliver_window = STREAMWINDOW_START; - - if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) { - origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ); - log_info(LD_REND,"begin is for rendezvous. configuring stream."); - n_stream->base_.address = tor_strdup("(rendezvous)"); - n_stream->base_.state = EXIT_CONN_STATE_CONNECTING; - n_stream->rend_data = rend_data_dup(origin_circ->rend_data); - tor_assert(connection_edge_is_rendezvous_stream(n_stream)); - assert_circuit_ok(circ); - if (rend_service_set_connection_addr_port(n_stream, origin_circ) < 0) { - log_info(LD_REND,"Didn't find rendezvous service (port %d)", - n_stream->base_.port); - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_EXITPOLICY, - origin_circ->cpath->prev); - connection_free(TO_CONN(n_stream)); - tor_free(address); - return 0; - } - assert_circuit_ok(circ); - log_debug(LD_REND,"Finished assigning addr/port"); - n_stream->cpath_layer = origin_circ->cpath->prev; /* link it */ - - /* add it into the linked list of p_streams on this circuit */ - n_stream->next_stream = origin_circ->p_streams; - n_stream->on_circuit = circ; - origin_circ->p_streams = n_stream; - assert_circuit_ok(circ); - - connection_exit_connect(n_stream); - - /* For path bias: This circuit was used successfully */ - pathbias_mark_use_success(origin_circ); - - tor_free(address); - return 0; - } - tor_strlower(address); - n_stream->base_.address = address; - n_stream->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - /* default to failed, change in dns_resolve if it turns out not to fail */ - - if (we_are_hibernating()) { - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_HIBERNATING, NULL); - connection_free(TO_CONN(n_stream)); - return 0; - } - - n_stream->on_circuit = circ; - - if (rh.command == RELAY_COMMAND_BEGIN_DIR) { - tor_addr_t tmp_addr; - tor_assert(or_circ); - if (or_circ->p_chan && - channel_get_addr_if_possible(or_circ->p_chan, &tmp_addr)) { - tor_addr_copy(&n_stream->base_.addr, &tmp_addr); - } - return connection_exit_connect_dir(n_stream); - } - - log_debug(LD_EXIT,"about to start the dns_resolve()."); - - /* send it off to the gethostbyname farm */ - switch (dns_resolve(n_stream)) { - case 1: /* resolve worked; now n_stream is attached to circ. */ - assert_circuit_ok(circ); - log_debug(LD_EXIT,"about to call connection_exit_connect()."); - connection_exit_connect(n_stream); - return 0; - case -1: /* resolve failed */ - relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_RESOLVEFAILED, NULL); - /* n_stream got freed. don't touch it. */ - break; - case 0: /* resolve added to pending list */ - assert_circuit_ok(circ); - break; - } - return 0; -} - -/** - * Called when we receive a RELAY_COMMAND_RESOLVE cell 'cell' along the - * circuit circ; - * begin resolving the hostname, and (eventually) reply with a RESOLVED cell. - */ -int -connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) -{ - edge_connection_t *dummy_conn; - relay_header_t rh; - - assert_circuit_ok(TO_CIRCUIT(circ)); - relay_header_unpack(&rh, cell->payload); - if (rh.length > RELAY_PAYLOAD_SIZE) - return -1; - - /* This 'dummy_conn' only exists to remember the stream ID - * associated with the resolve request; and to make the - * implementation of dns.c more uniform. (We really only need to - * remember the circuit, the stream ID, and the hostname to be - * resolved; but if we didn't store them in a connection like this, - * the housekeeping in dns.c would get way more complicated.) - */ - dummy_conn = edge_connection_new(CONN_TYPE_EXIT, AF_INET); - dummy_conn->stream_id = rh.stream_id; - dummy_conn->base_.address = tor_strndup( - (char*)cell->payload+RELAY_HEADER_SIZE, - rh.length); - dummy_conn->base_.port = 0; - dummy_conn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - dummy_conn->base_.purpose = EXIT_PURPOSE_RESOLVE; - - dummy_conn->on_circuit = TO_CIRCUIT(circ); - - /* send it off to the gethostbyname farm */ - switch (dns_resolve(dummy_conn)) { - case -1: /* Impossible to resolve; a resolved cell was sent. */ - /* Connection freed; don't touch it. */ - return 0; - case 1: /* The result was cached; a resolved cell was sent. */ - if (!dummy_conn->base_.marked_for_close) - connection_free(TO_CONN(dummy_conn)); - return 0; - case 0: /* resolve added to pending list */ - assert_circuit_ok(TO_CIRCUIT(circ)); - break; - } - return 0; -} - -/** Connect to conn's specified addr and port. If it worked, conn - * has now been added to the connection_array. - * - * Send back a connected cell. Include the resolved IP of the destination - * address, but only if it's a general exit stream. (Rendezvous - * streams must not reveal what IP they connected to.) - */ -void -connection_exit_connect(edge_connection_t *edge_conn) -{ - const tor_addr_t *addr; - uint16_t port; - connection_t *conn = TO_CONN(edge_conn); - int socket_error = 0; - - if ( (!connection_edge_is_rendezvous_stream(edge_conn) && - router_compare_to_my_exit_policy(&edge_conn->base_.addr, - edge_conn->base_.port)) || - (tor_addr_family(&conn->addr) == AF_INET6 && - ! get_options()->IPv6Exit)) { - log_info(LD_EXIT,"%s:%d failed exit policy. Closing.", - escaped_safe_str_client(conn->address), conn->port); - connection_edge_end(edge_conn, END_STREAM_REASON_EXITPOLICY); - circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); - connection_free(conn); - return; - } - - addr = &conn->addr; - port = conn->port; - - if (tor_addr_family(addr) == AF_INET6) - conn->socket_family = AF_INET6; - - log_debug(LD_EXIT,"about to try connecting"); - switch (connection_connect(conn, conn->address, addr, port, &socket_error)) { - case -1: { - int reason = errno_to_stream_end_reason(socket_error); - connection_edge_end(edge_conn, reason); - circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); - connection_free(conn); - return; - } - case 0: - conn->state = EXIT_CONN_STATE_CONNECTING; - - connection_watch_events(conn, READ_EVENT | WRITE_EVENT); - /* writable indicates finish; - * readable/error indicates broken link in windows-land. */ - return; - /* case 1: fall through */ - } - - conn->state = EXIT_CONN_STATE_OPEN; - if (connection_get_outbuf_len(conn)) { - /* in case there are any queued data cells, from e.g. optimistic data */ - IF_HAS_NO_BUFFEREVENT(conn) - connection_watch_events(conn, READ_EVENT|WRITE_EVENT); - } else { - IF_HAS_NO_BUFFEREVENT(conn) - connection_watch_events(conn, READ_EVENT); - } - - /* also, deliver a 'connected' cell back through the circuit. */ - if (connection_edge_is_rendezvous_stream(edge_conn)) { - /* rendezvous stream */ - /* don't send an address back! */ - connection_edge_send_command(edge_conn, - RELAY_COMMAND_CONNECTED, - NULL, 0); - } else { /* normal stream */ - uint8_t connected_payload[MAX_CONNECTED_CELL_PAYLOAD_LEN]; - int connected_payload_len = - connected_cell_format_payload(connected_payload, &conn->addr, - edge_conn->address_ttl); - if (connected_payload_len < 0) { - connection_edge_end(edge_conn, END_STREAM_REASON_INTERNAL); - circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); - connection_free(conn); - return; - } - - connection_edge_send_command(edge_conn, - RELAY_COMMAND_CONNECTED, - (char*)connected_payload, - connected_payload_len); - } -} - -/** Given an exit conn that should attach to us as a directory server, open a - * bridge connection with a linked connection pair, create a new directory - * conn, and join them together. Return 0 on success (or if there was an - * error we could send back an end cell for). Return -(some circuit end - * reason) if the circuit needs to be torn down. Either connects - * exitconn, frees it, or marks it, as appropriate. - */ -static int -connection_exit_connect_dir(edge_connection_t *exitconn) -{ - dir_connection_t *dirconn = NULL; - or_circuit_t *circ = TO_OR_CIRCUIT(exitconn->on_circuit); - - log_info(LD_EXIT, "Opening local connection for anonymized directory exit"); - - exitconn->base_.state = EXIT_CONN_STATE_OPEN; - - dirconn = dir_connection_new(tor_addr_family(&exitconn->base_.addr)); - - tor_addr_copy(&dirconn->base_.addr, &exitconn->base_.addr); - dirconn->base_.port = 0; - dirconn->base_.address = tor_strdup(exitconn->base_.address); - dirconn->base_.type = CONN_TYPE_DIR; - dirconn->base_.purpose = DIR_PURPOSE_SERVER; - dirconn->base_.state = DIR_CONN_STATE_SERVER_COMMAND_WAIT; - - /* Note that the new dir conn belongs to the same tunneled request as - * the edge conn, so that we can measure download times. */ - dirconn->dirreq_id = exitconn->dirreq_id; - - connection_link_connections(TO_CONN(dirconn), TO_CONN(exitconn)); - - if (connection_add(TO_CONN(exitconn))<0) { - connection_edge_end(exitconn, END_STREAM_REASON_RESOURCELIMIT); - connection_free(TO_CONN(exitconn)); - connection_free(TO_CONN(dirconn)); - return 0; - } - - /* link exitconn to circ, now that we know we can use it. */ - exitconn->next_stream = circ->n_streams; - circ->n_streams = exitconn; - - if (connection_add(TO_CONN(dirconn))<0) { - connection_edge_end(exitconn, END_STREAM_REASON_RESOURCELIMIT); - connection_close_immediate(TO_CONN(exitconn)); - connection_mark_for_close(TO_CONN(exitconn)); - connection_free(TO_CONN(dirconn)); - return 0; - } - - connection_start_reading(TO_CONN(dirconn)); - connection_start_reading(TO_CONN(exitconn)); - - if (connection_edge_send_command(exitconn, - RELAY_COMMAND_CONNECTED, NULL, 0) < 0) { - connection_mark_for_close(TO_CONN(exitconn)); - connection_mark_for_close(TO_CONN(dirconn)); - return 0; - } - - return 0; -} - -/** Return 1 if conn is a rendezvous stream, or 0 if - * it is a general stream. - */ -int -connection_edge_is_rendezvous_stream(edge_connection_t *conn) -{ - tor_assert(conn); - if (conn->rend_data) - return 1; - return 0; -} - -/** Return 1 if router exit is likely to allow stream conn - * to exit from it, or 0 if it probably will not allow it. - * (We might be uncertain if conn's destination address has not yet been - * resolved.) - */ -int -connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit) -{ - const or_options_t *options = get_options(); - - tor_assert(conn); - tor_assert(conn->socks_request); - tor_assert(exit); - - /* If a particular exit node has been requested for the new connection, - * make sure the exit node of the existing circuit matches exactly. - */ - if (conn->chosen_exit_name) { - const node_t *chosen_exit = - node_get_by_nickname(conn->chosen_exit_name, 1); - if (!chosen_exit || tor_memneq(chosen_exit->identity, - exit->identity, DIGEST_LEN)) { - /* doesn't match */ -// log_debug(LD_APP,"Requested node '%s', considering node '%s'. No.", -// conn->chosen_exit_name, exit->nickname); - return 0; - } - } - - if (conn->use_begindir) { - /* Internal directory fetches do not count as exiting. */ - return 1; - } - - if (conn->socks_request->command == SOCKS_COMMAND_CONNECT) { - tor_addr_t addr, *addrp = NULL; - addr_policy_result_t r; - if (0 == tor_addr_parse(&addr, conn->socks_request->address)) { - addrp = &addr; - } else if (!conn->ipv4_traffic_ok && conn->ipv6_traffic_ok) { - tor_addr_make_null(&addr, AF_INET6); - addrp = &addr; - } else if (conn->ipv4_traffic_ok && !conn->ipv6_traffic_ok) { - tor_addr_make_null(&addr, AF_INET); - addrp = &addr; - } - r = compare_tor_addr_to_node_policy(addrp, conn->socks_request->port,exit); - if (r == ADDR_POLICY_REJECTED) - return 0; /* We know the address, and the exit policy rejects it. */ - if (r == ADDR_POLICY_PROBABLY_REJECTED && !conn->chosen_exit_name) - return 0; /* We don't know the addr, but the exit policy rejects most - * addresses with this port. Since the user didn't ask for - * this node, err on the side of caution. */ - } else if (SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) { - /* Don't send DNS requests to non-exit servers by default. */ - if (!conn->chosen_exit_name && node_exit_policy_rejects_all(exit)) - return 0; - } - if (routerset_contains_node(options->ExcludeExitNodesUnion_, exit)) { - /* Not a suitable exit. Refuse it. */ - return 0; - } - - return 1; -} - -/** If address is of the form "y.onion" with a well-formed handle y: - * Put a NUL after y, lower-case it, and return ONION_HOSTNAME. - * - * If address is of the form "x.y.onion" with a well-formed handle x: - * Drop "x.", put a NUL after y, lower-case it, and return ONION_HOSTNAME. - * - * If address is of the form "y.onion" with a badly-formed handle y: - * Return BAD_HOSTNAME and log a message. - * - * If address is of the form "y.exit": - * Put a NUL after y and return EXIT_HOSTNAME. - * - * Otherwise: - * Return NORMAL_HOSTNAME and change nothing. - */ -hostname_type_t -parse_extended_hostname(char *address) -{ - char *s; - char *q; - char query[REND_SERVICE_ID_LEN_BASE32+1]; - - s = strrchr(address,'.'); - if (!s) - return NORMAL_HOSTNAME; /* no dot, thus normal */ - if (!strcmp(s+1,"exit")) { - *s = 0; /* NUL-terminate it */ - return EXIT_HOSTNAME; /* .exit */ - } - if (strcmp(s+1,"onion")) - return NORMAL_HOSTNAME; /* neither .exit nor .onion, thus normal */ - - /* so it is .onion */ - *s = 0; /* NUL-terminate it */ - /* locate a 'sub-domain' component, in order to remove it */ - q = strrchr(address, '.'); - if (q == address) { - goto failed; /* reject sub-domain, as DNS does */ - } - q = (NULL == q) ? address : q + 1; - if (strlcpy(query, q, REND_SERVICE_ID_LEN_BASE32+1) >= - REND_SERVICE_ID_LEN_BASE32+1) - goto failed; - if (q != address) { - memmove(address, q, strlen(q) + 1 /* also get \0 */); - } - if (rend_valid_service_id(query)) { - return ONION_HOSTNAME; /* success */ - } - failed: - /* otherwise, return to previous state and return 0 */ - *s = '.'; - log_warn(LD_APP, "Invalid onion hostname %s; rejecting", - safe_str_client(address)); - return BAD_HOSTNAME; -} - -/** Return true iff the (possibly NULL) alen-byte chunk of memory at - * a is equal to the (possibly NULL) blen-byte chunk of memory - * at b. */ -static int -memeq_opt(const char *a, size_t alen, const char *b, size_t blen) -{ - if (a == NULL) { - return (b == NULL); - } else if (b == NULL) { - return 0; - } else if (alen != blen) { - return 0; - } else { - return tor_memeq(a, b, alen); - } -} - -/** - * Return true iff none of the isolation flags and fields in conn - * should prevent it from being attached to circ. - */ -int -connection_edge_compatible_with_circuit(const entry_connection_t *conn, - const origin_circuit_t *circ) -{ - const uint8_t iso = conn->isolation_flags; - const socks_request_t *sr = conn->socks_request; - - /* If circ has never been used for an isolated connection, we can - * totally use it for this one. */ - if (!circ->isolation_values_set) - return 1; - - /* If circ has been used for connections having more than one value - * for some field f, it will have the corresponding bit set in - * isolation_flags_mixed. If isolation_flags_mixed has any bits - * in common with iso, then conn must be isolated from at least - * one stream that has been attached to circ. */ - if ((iso & circ->isolation_flags_mixed) != 0) { - /* For at least one field where conn is isolated, the circuit - * already has mixed streams. */ - return 0; - } - - if (! conn->original_dest_address) { - log_warn(LD_BUG, "Reached connection_edge_compatible_with_circuit without " - "having set conn->original_dest_address"); - ((entry_connection_t*)conn)->original_dest_address = - tor_strdup(conn->socks_request->address); - } - - if ((iso & ISO_STREAM) && - (circ->associated_isolated_stream_global_id != - ENTRY_TO_CONN(conn)->global_identifier)) - return 0; - - if ((iso & ISO_DESTPORT) && conn->socks_request->port != circ->dest_port) - return 0; - if ((iso & ISO_DESTADDR) && - strcasecmp(conn->original_dest_address, circ->dest_address)) - return 0; - if ((iso & ISO_SOCKSAUTH) && - (! memeq_opt(sr->username, sr->usernamelen, - circ->socks_username, circ->socks_username_len) || - ! memeq_opt(sr->password, sr->passwordlen, - circ->socks_password, circ->socks_password_len))) - return 0; - if ((iso & ISO_CLIENTPROTO) && - (conn->socks_request->listener_type != circ->client_proto_type || - conn->socks_request->socks_version != circ->client_proto_socksver)) - return 0; - if ((iso & ISO_CLIENTADDR) && - !tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) - return 0; - if ((iso & ISO_SESSIONGRP) && conn->session_group != circ->session_group) - return 0; - if ((iso & ISO_NYM_EPOCH) && conn->nym_epoch != circ->nym_epoch) - return 0; - - return 1; -} - -/** - * If dry_run is false, update circ's isolation flags and fields - * to reflect having had conn attached to it, and return 0. Otherwise, - * if dry_run is true, then make no changes to circ, and return - * a bitfield of isolation flags that we would have to set in - * isolation_flags_mixed to add conn to circ, or -1 if - * circ has had no streams attached to it. - */ -int -connection_edge_update_circuit_isolation(const entry_connection_t *conn, - origin_circuit_t *circ, - int dry_run) -{ - const socks_request_t *sr = conn->socks_request; - if (! conn->original_dest_address) { - log_warn(LD_BUG, "Reached connection_update_circuit_isolation without " - "having set conn->original_dest_address"); - ((entry_connection_t*)conn)->original_dest_address = - tor_strdup(conn->socks_request->address); - } - - if (!circ->isolation_values_set) { - if (dry_run) - return -1; - circ->associated_isolated_stream_global_id = - ENTRY_TO_CONN(conn)->global_identifier; - circ->dest_port = conn->socks_request->port; - circ->dest_address = tor_strdup(conn->original_dest_address); - circ->client_proto_type = conn->socks_request->listener_type; - circ->client_proto_socksver = conn->socks_request->socks_version; - tor_addr_copy(&circ->client_addr, &ENTRY_TO_CONN(conn)->addr); - circ->session_group = conn->session_group; - circ->nym_epoch = conn->nym_epoch; - circ->socks_username = sr->username ? - tor_memdup(sr->username, sr->usernamelen) : NULL; - circ->socks_password = sr->password ? - tor_memdup(sr->password, sr->passwordlen) : NULL; - circ->socks_username_len = sr->usernamelen; - circ->socks_password_len = sr->passwordlen; - - circ->isolation_values_set = 1; - return 0; - } else { - uint8_t mixed = 0; - if (conn->socks_request->port != circ->dest_port) - mixed |= ISO_DESTPORT; - if (strcasecmp(conn->original_dest_address, circ->dest_address)) - mixed |= ISO_DESTADDR; - if (!memeq_opt(sr->username, sr->usernamelen, - circ->socks_username, circ->socks_username_len) || - !memeq_opt(sr->password, sr->passwordlen, - circ->socks_password, circ->socks_password_len)) - mixed |= ISO_SOCKSAUTH; - if ((conn->socks_request->listener_type != circ->client_proto_type || - conn->socks_request->socks_version != circ->client_proto_socksver)) - mixed |= ISO_CLIENTPROTO; - if (!tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) - mixed |= ISO_CLIENTADDR; - if (conn->session_group != circ->session_group) - mixed |= ISO_SESSIONGRP; - if (conn->nym_epoch != circ->nym_epoch) - mixed |= ISO_NYM_EPOCH; - - if (dry_run) - return mixed; - - if ((mixed & conn->isolation_flags) != 0) { - log_warn(LD_BUG, "Updating a circuit with seemingly incompatible " - "isolation flags."); - } - circ->isolation_flags_mixed |= mixed; - return 0; - } -} - -/** - * Clear the isolation settings on circ. - * - * This only works on an open circuit that has never had a stream attached to - * it, and whose isolation settings are hypothetical. (We set hypothetical - * isolation settings on circuits as we're launching them, so that we - * know whether they can handle more streams or whether we need to launch - * even more circuits. Once the circuit is open, if it turns out that - * we no longer have any streams to attach to it, we clear the isolation flags - * and data so that other streams can have a chance.) - */ -void -circuit_clear_isolation(origin_circuit_t *circ) -{ - if (circ->isolation_any_streams_attached) { - log_warn(LD_BUG, "Tried to clear the isolation status of a dirty circuit"); - return; - } - if (TO_CIRCUIT(circ)->state != CIRCUIT_STATE_OPEN) { - log_warn(LD_BUG, "Tried to clear the isolation status of a non-open " - "circuit"); - return; - } - - circ->isolation_values_set = 0; - circ->isolation_flags_mixed = 0; - circ->associated_isolated_stream_global_id = 0; - circ->client_proto_type = 0; - circ->client_proto_socksver = 0; - circ->dest_port = 0; - tor_addr_make_unspec(&circ->client_addr); - tor_free(circ->dest_address); - circ->session_group = -1; - circ->nym_epoch = 0; - if (circ->socks_username) { - memwipe(circ->socks_username, 0x11, circ->socks_username_len); - tor_free(circ->socks_username); - } - if (circ->socks_password) { - memwipe(circ->socks_password, 0x05, circ->socks_password_len); - tor_free(circ->socks_password); - } - circ->socks_username_len = circ->socks_password_len = 0; -} - diff --git a/src/tor/connection_edge.h b/src/tor/connection_edge.h deleted file mode 100644 index e3a95ad9e..000000000 --- a/src/tor/connection_edge.h +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection_edge.h - * \brief Header file for connection_edge.c. - **/ - -#ifndef TOR_CONNECTION_EDGE_H -#define TOR_CONNECTION_EDGE_H - -#include "testsupport.h" - -#define connection_mark_unattached_ap(conn, endreason) \ - connection_mark_unattached_ap_((conn), (endreason), __LINE__, SHORT_FILE__) - -void connection_mark_unattached_ap_(entry_connection_t *conn, int endreason, - int line, const char *file); -int connection_edge_reached_eof(edge_connection_t *conn); -int connection_edge_process_inbuf(edge_connection_t *conn, - int package_partial); -int connection_edge_destroy(circid_t circ_id, edge_connection_t *conn); -int connection_edge_end(edge_connection_t *conn, uint8_t reason); -int connection_edge_end_errno(edge_connection_t *conn); -int connection_edge_flushed_some(edge_connection_t *conn); -int connection_edge_finished_flushing(edge_connection_t *conn); -int connection_edge_finished_connecting(edge_connection_t *conn); - -void connection_ap_about_to_close(entry_connection_t *edge_conn); -void connection_exit_about_to_close(edge_connection_t *edge_conn); - -int connection_ap_handshake_send_begin(entry_connection_t *ap_conn); -int connection_ap_handshake_send_resolve(entry_connection_t *ap_conn); - -entry_connection_t *connection_ap_make_link(connection_t *partner, - char *address, uint16_t port, - const char *digest, - int session_group, - int isolation_flags, - int use_begindir, int want_onehop); -void connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, - size_t replylen, - int endreason); -void connection_ap_handshake_socks_resolved(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const uint8_t *answer, - int ttl, - time_t expires); - -int connection_exit_begin_conn(cell_t *cell, circuit_t *circ); -int connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ); -void connection_exit_connect(edge_connection_t *conn); -int connection_edge_is_rendezvous_stream(edge_connection_t *conn); -int connection_ap_can_use_exit(const entry_connection_t *conn, - const node_t *exit); -void connection_ap_expire_beginning(void); -void connection_ap_attach_pending(void); -void connection_ap_fail_onehop(const char *failed_digest, - cpath_build_state_t *build_state); -void circuit_discard_optional_exit_enclaves(extend_info_t *info); -int connection_ap_detach_retriable(entry_connection_t *conn, - origin_circuit_t *circ, - int reason); -int connection_ap_process_transparent(entry_connection_t *conn); - -int address_is_invalid_destination(const char *address, int client); - -int connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath); -int connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath); - -/** Possible return values for parse_extended_hostname. */ -typedef enum hostname_type_t { - NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME -} hostname_type_t; -hostname_type_t parse_extended_hostname(char *address); - -#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) -int get_pf_socket(void); -#endif - -int connection_edge_compatible_with_circuit(const entry_connection_t *conn, - const origin_circuit_t *circ); -int connection_edge_update_circuit_isolation(const entry_connection_t *conn, - origin_circuit_t *circ, - int dry_run); -void circuit_clear_isolation(origin_circuit_t *circ); -streamid_t get_unique_stream_id_by_circ(origin_circuit_t *circ); - -/** @name Begin-cell flags - * - * These flags are used in RELAY_BEGIN cells to change the default behavior - * of the cell. - * - * @{ - **/ -/** When this flag is set, the client is willing to get connected to IPv6 - * addresses */ -#define BEGIN_FLAG_IPV6_OK (1u<<0) -/** When this flag is set, the client DOES NOT support connecting to IPv4 - * addresses. (The sense of this flag is inverted from IPV6_OK, so that the - * old default behavior of Tor is equivalent to having all flags set to 0.) - **/ -#define BEGIN_FLAG_IPV4_NOT_OK (1u<<1) -/** When this flag is set, if we find both an IPv4 and an IPv6 address, - * we use the IPv6 address. Otherwise we use the IPv4 address. */ -#define BEGIN_FLAG_IPV6_PREFERRED (1u<<2) -/**@}*/ - -#ifdef CONNECTION_EDGE_PRIVATE - -/** A parsed BEGIN or BEGIN_DIR cell */ -typedef struct begin_cell_t { - /** The address the client has asked us to connect to, or NULL if this is - * a BEGIN_DIR cell*/ - char *address; - /** The flags specified in the BEGIN cell's body. One or more of - * BEGIN_FLAG_*. */ - uint32_t flags; - /** The client's requested port. */ - uint16_t port; - /** The client's requested Stream ID */ - uint16_t stream_id; - /** True iff this is a BEGIN_DIR cell. */ - unsigned is_begindir : 1; -} begin_cell_t; - -STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell, - uint8_t *end_reason_out); -STATIC int connected_cell_format_payload(uint8_t *payload_out, - const tor_addr_t *addr, - uint32_t ttl); -#endif - -#endif - diff --git a/src/tor/connection_or.c b/src/tor/connection_or.c deleted file mode 100644 index b89f7bfca..000000000 --- a/src/tor/connection_or.c +++ /dev/null @@ -1,2452 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection_or.c - * \brief Functions to handle OR connections, TLS handshaking, and - * cells on the network. - **/ -#include "or.h" -#include "buffers.h" -/* - * Define this so we get channel internal functions, since we're implementing - * part of a subclass (channel_tls_t). - */ -#define TOR_CHANNEL_INTERNAL_ -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "command.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "control.h" -#include "dirserv.h" -#include "entrynodes.h" -#include "geoip.h" -#include "onion_main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "reasons.h" -#include "relay.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "ext_orport.h" -#ifdef USE_BUFFEREVENTS -#include -#endif - -static int connection_tls_finish_handshake(or_connection_t *conn); -static int connection_or_launch_v3_or_handshake(or_connection_t *conn); -static int connection_or_process_cells_from_inbuf(or_connection_t *conn); -static int connection_or_check_valid_tls_handshake(or_connection_t *conn, - int started_here, - char *digest_rcvd_out); - -static void connection_or_tls_renegotiated_cb(tor_tls_t *tls, void *_conn); - -static unsigned int -connection_or_is_bad_for_new_circs(or_connection_t *or_conn); -static void connection_or_mark_bad_for_new_circs(or_connection_t *or_conn); - -/* - * Call this when changing connection state, so notifications to the owning - * channel can be handled. - */ - -static void connection_or_change_state(or_connection_t *conn, uint8_t state); - -#ifdef USE_BUFFEREVENTS -static void connection_or_handle_event_cb(struct bufferevent *bufev, - short event, void *arg); -#include /*XXXX REMOVE */ -#endif - -/**************************************************************/ - -/** Map from identity digest of connected OR or desired OR to a connection_t - * with that identity digest. If there is more than one such connection_t, - * they form a linked list, with next_with_same_id as the next pointer. */ -static digestmap_t *orconn_identity_map = NULL; - -/** Global map between Extended ORPort identifiers and OR - * connections. */ -static digestmap_t *orconn_ext_or_id_map = NULL; - -/** If conn is listed in orconn_identity_map, remove it, and clear - * conn->identity_digest. Otherwise do nothing. */ -void -connection_or_remove_from_identity_map(or_connection_t *conn) -{ - or_connection_t *tmp; - tor_assert(conn); - if (!orconn_identity_map) - return; - tmp = digestmap_get(orconn_identity_map, conn->identity_digest); - if (!tmp) { - if (!tor_digest_is_zero(conn->identity_digest)) { - log_warn(LD_BUG, "Didn't find connection '%s' on identity map when " - "trying to remove it.", - conn->nickname ? conn->nickname : "NULL"); - } - return; - } - if (conn == tmp) { - if (conn->next_with_same_id) - digestmap_set(orconn_identity_map, conn->identity_digest, - conn->next_with_same_id); - else - digestmap_remove(orconn_identity_map, conn->identity_digest); - } else { - while (tmp->next_with_same_id) { - if (tmp->next_with_same_id == conn) { - tmp->next_with_same_id = conn->next_with_same_id; - break; - } - tmp = tmp->next_with_same_id; - } - } - memset(conn->identity_digest, 0, DIGEST_LEN); - conn->next_with_same_id = NULL; -} - -/** Remove all entries from the identity-to-orconn map, and clear - * all identities in OR conns.*/ -void -connection_or_clear_identity_map(void) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == CONN_TYPE_OR) { - or_connection_t *or_conn = TO_OR_CONN(conn); - memset(or_conn->identity_digest, 0, DIGEST_LEN); - or_conn->next_with_same_id = NULL; - } - }); - - digestmap_free(orconn_identity_map, NULL); - orconn_identity_map = NULL; -} - -/** Change conn->identity_digest to digest, and add conn into - * orconn_digest_map. */ -static void -connection_or_set_identity_digest(or_connection_t *conn, const char *digest) -{ - or_connection_t *tmp; - tor_assert(conn); - tor_assert(digest); - - if (!orconn_identity_map) - orconn_identity_map = digestmap_new(); - if (tor_memeq(conn->identity_digest, digest, DIGEST_LEN)) - return; - - /* If the identity was set previously, remove the old mapping. */ - if (! tor_digest_is_zero(conn->identity_digest)) { - connection_or_remove_from_identity_map(conn); - if (conn->chan) - channel_clear_identity_digest(TLS_CHAN_TO_BASE(conn->chan)); - } - - memcpy(conn->identity_digest, digest, DIGEST_LEN); - - /* If we're setting the ID to zero, don't add a mapping. */ - if (tor_digest_is_zero(digest)) - return; - - tmp = digestmap_set(orconn_identity_map, digest, conn); - conn->next_with_same_id = tmp; - - /* Deal with channels */ - if (conn->chan) - channel_set_identity_digest(TLS_CHAN_TO_BASE(conn->chan), digest); - -#if 1 - /* Testing code to check for bugs in representation. */ - for (; tmp; tmp = tmp->next_with_same_id) { - tor_assert(tor_memeq(tmp->identity_digest, digest, DIGEST_LEN)); - tor_assert(tmp != conn); - } -#endif -} - -/** Remove the Extended ORPort identifier of conn from the - * global identifier list. Also, clear the identifier from the - * connection itself. */ -void -connection_or_remove_from_ext_or_id_map(or_connection_t *conn) -{ - or_connection_t *tmp; - if (!orconn_ext_or_id_map) - return; - if (!conn->ext_or_conn_id) - return; - - tmp = digestmap_remove(orconn_ext_or_id_map, conn->ext_or_conn_id); - if (!tor_digest_is_zero(conn->ext_or_conn_id)) - tor_assert(tmp == conn); - - memset(conn->ext_or_conn_id, 0, EXT_OR_CONN_ID_LEN); -} - -/** Return the connection whose ext_or_id is id. Return NULL if no such - * connection is found. */ -or_connection_t * -connection_or_get_by_ext_or_id(const char *id) -{ - if (!orconn_ext_or_id_map) - return NULL; - return digestmap_get(orconn_ext_or_id_map, id); -} - -/** Deallocate the global Extended ORPort identifier list */ -void -connection_or_clear_ext_or_id_map(void) -{ - digestmap_free(orconn_ext_or_id_map, NULL); - orconn_ext_or_id_map = NULL; -} - -/** Creates an Extended ORPort identifier for conn and deposits - * it into the global list of identifiers. */ -void -connection_or_set_ext_or_identifier(or_connection_t *conn) -{ - char random_id[EXT_OR_CONN_ID_LEN]; - or_connection_t *tmp; - - if (!orconn_ext_or_id_map) - orconn_ext_or_id_map = digestmap_new(); - - /* Remove any previous identifiers: */ - if (conn->ext_or_conn_id && !tor_digest_is_zero(conn->ext_or_conn_id)) - connection_or_remove_from_ext_or_id_map(conn); - - do { - crypto_rand(random_id, sizeof(random_id)); - } while (digestmap_get(orconn_ext_or_id_map, random_id)); - - if (!conn->ext_or_conn_id) - conn->ext_or_conn_id = tor_malloc_zero(EXT_OR_CONN_ID_LEN); - - memcpy(conn->ext_or_conn_id, random_id, EXT_OR_CONN_ID_LEN); - - tmp = digestmap_set(orconn_ext_or_id_map, random_id, conn); - tor_assert(!tmp); -} - -/**************************************************************/ - -/** Map from a string describing what a non-open OR connection was doing when - * failed, to an intptr_t describing the count of connections that failed that - * way. Note that the count is stored _as_ the pointer. - */ -static strmap_t *broken_connection_counts; - -/** If true, do not record information in broken_connection_counts. */ -static int disable_broken_connection_counts = 0; - -/** Record that an OR connection failed in state. */ -static void -note_broken_connection(const char *state) -{ - void *ptr; - intptr_t val; - if (disable_broken_connection_counts) - return; - - if (!broken_connection_counts) - broken_connection_counts = strmap_new(); - - ptr = strmap_get(broken_connection_counts, state); - val = (intptr_t)ptr; - val++; - ptr = (void*)val; - strmap_set(broken_connection_counts, state, ptr); -} - -/** Forget all recorded states for failed connections. If - * stop_recording is true, don't record any more. */ -void -clear_broken_connection_map(int stop_recording) -{ - if (broken_connection_counts) - strmap_free(broken_connection_counts, NULL); - broken_connection_counts = NULL; - if (stop_recording) - disable_broken_connection_counts = 1; -} - -/** Write a detailed description the state of orconn into the - * buflen-byte buffer at buf. This description includes not - * only the OR-conn level state but also the TLS state. It's useful for - * diagnosing broken handshakes. */ -static void -connection_or_get_state_description(or_connection_t *orconn, - char *buf, size_t buflen) -{ - connection_t *conn = TO_CONN(orconn); - const char *conn_state; - char tls_state[256]; - - tor_assert(conn->type == CONN_TYPE_OR || conn->type == CONN_TYPE_EXT_OR); - - conn_state = conn_state_to_string(conn->type, conn->state); - tor_tls_get_state_description(orconn->tls, tls_state, sizeof(tls_state)); - - tor_snprintf(buf, buflen, "%s with SSL state %s", conn_state, tls_state); -} - -/** Record the current state of orconn as the state of a broken - * connection. */ -static void -connection_or_note_state_when_broken(or_connection_t *orconn) -{ - char buf[256]; - if (disable_broken_connection_counts) - return; - connection_or_get_state_description(orconn, buf, sizeof(buf)); - log_info(LD_HANDSHAKE,"Connection died in state '%s'", buf); - note_broken_connection(buf); -} - -/** Helper type used to sort connection states and find the most frequent. */ -typedef struct broken_state_count_t { - intptr_t count; - const char *state; -} broken_state_count_t; - -/** Helper function used to sort broken_state_count_t by frequency. */ -static int -broken_state_count_compare(const void **a_ptr, const void **b_ptr) -{ - const broken_state_count_t *a = *a_ptr, *b = *b_ptr; - if (b->count < a->count) - return -1; - else if (b->count == a->count) - return 0; - else - return 1; -} - -/** Upper limit on the number of different states to report for connection - * failure. */ -#define MAX_REASONS_TO_REPORT 10 - -/** Report a list of the top states for failed OR connections at log level - * severity, in log domain domain. */ -void -connection_or_report_broken_states(int severity, int domain) -{ - int total = 0; - smartlist_t *items; - - if (!broken_connection_counts || disable_broken_connection_counts) - return; - - items = smartlist_new(); - STRMAP_FOREACH(broken_connection_counts, state, void *, countptr) { - broken_state_count_t *c = tor_malloc(sizeof(broken_state_count_t)); - c->count = (intptr_t)countptr; - total += (int)c->count; - c->state = state; - smartlist_add(items, c); - } STRMAP_FOREACH_END; - - smartlist_sort(items, broken_state_count_compare); - - tor_log(severity, domain, "%d connections have failed%s", total, - smartlist_len(items) > MAX_REASONS_TO_REPORT ? ". Top reasons:" : ":"); - - SMARTLIST_FOREACH_BEGIN(items, const broken_state_count_t *, c) { - if (c_sl_idx > MAX_REASONS_TO_REPORT) - break; - tor_log(severity, domain, - " %d connections died in state %s", (int)c->count, c->state); - } SMARTLIST_FOREACH_END(c); - - SMARTLIST_FOREACH(items, broken_state_count_t *, c, tor_free(c)); - smartlist_free(items); -} - -/** Call this to change or_connection_t states, so the owning channel_tls_t can - * be notified. - */ - -static void -connection_or_change_state(or_connection_t *conn, uint8_t state) -{ - uint8_t old_state; - - tor_assert(conn); - - old_state = conn->base_.state; - conn->base_.state = state; - - if (conn->chan) - channel_tls_handle_state_change_on_orconn(conn->chan, conn, - old_state, state); -} - -/** Return the number of circuits using an or_connection_t; this used to - * be an or_connection_t field, but it got moved to channel_t and we - * shouldn't maintain two copies. */ - -int -connection_or_get_num_circuits(or_connection_t *conn) -{ - tor_assert(conn); - - if (conn->chan) { - return channel_num_circuits(TLS_CHAN_TO_BASE(conn->chan)); - } else return 0; -} - -/**************************************************************/ - -/** Pack the cell_t host-order structure src into network-order - * in the buffer dest. See tor-spec.txt for details about the - * wire format. - * - * Note that this function doesn't touch dst-\>next: the caller - * should set it or clear it as appropriate. - */ -void -cell_pack(packed_cell_t *dst, const cell_t *src, int wide_circ_ids) -{ - char *dest = dst->body; - if (wide_circ_ids) { - set_uint32(dest, htonl(src->circ_id)); - dest += 4; - } else { - set_uint16(dest, htons(src->circ_id)); - dest += 2; - memset(dest+CELL_MAX_NETWORK_SIZE-2, 0, 2); /*make sure it's clear */ - } - set_uint8(dest, src->command); - memcpy(dest+1, src->payload, CELL_PAYLOAD_SIZE); -} - -/** Unpack the network-order buffer src into a host-order - * cell_t structure dest. - */ -static void -cell_unpack(cell_t *dest, const char *src, int wide_circ_ids) -{ - if (wide_circ_ids) { - dest->circ_id = ntohl(get_uint32(src)); - src += 4; - } else { - dest->circ_id = ntohs(get_uint16(src)); - src += 2; - } - dest->command = get_uint8(src); - memcpy(dest->payload, src+1, CELL_PAYLOAD_SIZE); -} - -/** Write the header of cell into the first VAR_CELL_MAX_HEADER_SIZE - * bytes of hdr_out. Returns number of bytes used. */ -int -var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids) -{ - int r; - if (wide_circ_ids) { - set_uint32(hdr_out, htonl(cell->circ_id)); - hdr_out += 4; - r = VAR_CELL_MAX_HEADER_SIZE; - } else { - set_uint16(hdr_out, htons(cell->circ_id)); - hdr_out += 2; - r = VAR_CELL_MAX_HEADER_SIZE - 2; - } - set_uint8(hdr_out, cell->command); - set_uint16(hdr_out+1, htons(cell->payload_len)); - return r; -} - -/** Allocate and return a new var_cell_t with payload_len bytes of - * payload space. */ -var_cell_t * -var_cell_new(uint16_t payload_len) -{ - size_t size = STRUCT_OFFSET(var_cell_t, payload) + payload_len; - var_cell_t *cell = tor_malloc_zero(size); - cell->payload_len = payload_len; - cell->command = 0; - cell->circ_id = 0; - return cell; -} - -/** Release all space held by cell. */ -void -var_cell_free(var_cell_t *cell) -{ - tor_free(cell); -} - -/** We've received an EOF from conn. Mark it for close and return. */ -int -connection_or_reached_eof(or_connection_t *conn) -{ - tor_assert(conn); - - log_info(LD_OR,"OR connection reached EOF. Closing."); - connection_or_close_normally(conn, 1); - - return 0; -} - -/** Handle any new bytes that have come in on connection conn. - * If conn is in 'open' state, hand it to - * connection_or_process_cells_from_inbuf() - * (else do nothing). - */ -int -connection_or_process_inbuf(or_connection_t *conn) -{ - /** Don't let the inbuf of a nonopen OR connection grow beyond this many - * bytes: it's either a broken client, a non-Tor client, or a DOS - * attempt. */ -#define MAX_OR_INBUF_WHEN_NONOPEN 0 - - int ret = 0; - tor_assert(conn); - - switch (conn->base_.state) { - case OR_CONN_STATE_PROXY_HANDSHAKING: - ret = connection_read_proxy_handshake(TO_CONN(conn)); - - /* start TLS after handshake completion, or deal with error */ - if (ret == 1) { - tor_assert(TO_CONN(conn)->proxy_state == PROXY_CONNECTED); - if (connection_tls_start_handshake(conn, 0) < 0) - ret = -1; - /* Touch the channel's active timestamp if there is one */ - if (conn->chan) - channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); - } - if (ret < 0) { - connection_or_close_for_error(conn, 0); - } - - return ret; - case OR_CONN_STATE_TLS_SERVER_RENEGOTIATING: -#ifdef USE_BUFFEREVENTS - if (tor_tls_server_got_renegotiate(conn->tls)) - connection_or_tls_renegotiated_cb(conn->tls, conn); - if (conn->base_.marked_for_close) - return 0; - /* fall through. */ -#endif - case OR_CONN_STATE_OPEN: - case OR_CONN_STATE_OR_HANDSHAKING_V2: - case OR_CONN_STATE_OR_HANDSHAKING_V3: - return connection_or_process_cells_from_inbuf(conn); - default: - break; /* don't do anything */ - } - - /* This check was necessary with 0.2.2, when the TLS_SERVER_RENEGOTIATING - * check would otherwise just let data accumulate. It serves no purpose - * in 0.2.3. - * - * XXX024 Remove this check once we verify that the above paragraph is - * 100% true. */ - if (buf_datalen(conn->base_.inbuf) > MAX_OR_INBUF_WHEN_NONOPEN) { - log_fn(LOG_PROTOCOL_WARN, LD_NET, "Accumulated too much data (%d bytes) " - "on nonopen OR connection %s %s:%u in state %s; closing.", - (int)buf_datalen(conn->base_.inbuf), - connection_or_nonopen_was_started_here(conn) ? "to" : "from", - conn->base_.address, conn->base_.port, - conn_state_to_string(conn->base_.type, conn->base_.state)); - connection_or_close_for_error(conn, 0); - ret = -1; - } - - return ret; -} - -/** When adding cells to an OR connection's outbuf, keep adding until the - * outbuf is at least this long, or we run out of cells. */ -#define OR_CONN_HIGHWATER (32*1024) - -/** Add cells to an OR connection's outbuf whenever the outbuf's data length - * drops below this size. */ -#define OR_CONN_LOWWATER (16*1024) - -/** Called whenever we have flushed some data on an or_conn: add more data - * from active circuits. */ -int -connection_or_flushed_some(or_connection_t *conn) -{ - size_t datalen, temp; - ssize_t n, flushed; - size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); - - /* If we're under the low water mark, add cells until we're just over the - * high water mark. */ - datalen = connection_get_outbuf_len(TO_CONN(conn)); - if (datalen < OR_CONN_LOWWATER) { - while ((conn->chan) && channel_tls_more_to_flush(conn->chan)) { - /* Compute how many more cells we want at most */ - n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size); - /* Bail out if we don't want any more */ - if (n <= 0) break; - /* We're still here; try to flush some more cells */ - flushed = channel_tls_flush_some_cells(conn->chan, n); - /* Bail out if it says it didn't flush anything */ - if (flushed <= 0) break; - /* How much in the outbuf now? */ - temp = connection_get_outbuf_len(TO_CONN(conn)); - /* Bail out if we didn't actually increase the outbuf size */ - if (temp <= datalen) break; - /* Update datalen for the next iteration */ - datalen = temp; - } - } - - return 0; -} - -/** Connection conn has finished writing and has no bytes left on - * its outbuf. - * - * Otherwise it's in state "open": stop writing and return. - * - * If conn is broken, mark it for close and return -1, else - * return 0. - */ -int -connection_or_finished_flushing(or_connection_t *conn) -{ - tor_assert(conn); - assert_connection_ok(TO_CONN(conn),0); - - switch (conn->base_.state) { - case OR_CONN_STATE_PROXY_HANDSHAKING: - case OR_CONN_STATE_OPEN: - case OR_CONN_STATE_OR_HANDSHAKING_V2: - case OR_CONN_STATE_OR_HANDSHAKING_V3: - break; - default: - log_err(LD_BUG,"Called in unexpected state %d.", conn->base_.state); - tor_fragile_assert(); - return -1; - } - return 0; -} - -/** Connected handler for OR connections: begin the TLS handshake. - */ -int -connection_or_finished_connecting(or_connection_t *or_conn) -{ - const int proxy_type = or_conn->proxy_type; - connection_t *conn; - - tor_assert(or_conn); - conn = TO_CONN(or_conn); - tor_assert(conn->state == OR_CONN_STATE_CONNECTING); - - log_debug(LD_HANDSHAKE,"OR connect() to router at %s:%u finished.", - conn->address,conn->port); - control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0); - - if (proxy_type != PROXY_NONE) { - /* start proxy handshake */ - if (connection_proxy_connect(conn, proxy_type) < 0) { - connection_or_close_for_error(or_conn, 0); - return -1; - } - - connection_start_reading(conn); - connection_or_change_state(or_conn, OR_CONN_STATE_PROXY_HANDSHAKING); - return 0; - } - - if (connection_tls_start_handshake(or_conn, 0) < 0) { - /* TLS handshaking error of some kind. */ - connection_or_close_for_error(or_conn, 0); - return -1; - } - return 0; -} - -/** Called when we're about to finally unlink and free an OR connection: - * perform necessary accounting and cleanup */ -void -connection_or_about_to_close(or_connection_t *or_conn) -{ - time_t now = time(NULL); - connection_t *conn = TO_CONN(or_conn); - - /* Tell the controlling channel we're closed */ - if (or_conn->chan) { - channel_closed(TLS_CHAN_TO_BASE(or_conn->chan)); - /* - * NULL this out because the channel might hang around a little - * longer before channel_run_cleanup() gets it. - */ - or_conn->chan->conn = NULL; - or_conn->chan = NULL; - } - - /* Remember why we're closing this connection. */ - if (conn->state != OR_CONN_STATE_OPEN) { - /* now mark things down as needed */ - if (connection_or_nonopen_was_started_here(or_conn)) { - const or_options_t *options = get_options(); - connection_or_note_state_when_broken(or_conn); - rep_hist_note_connect_failed(or_conn->identity_digest, now); - entry_guard_register_connect_status(or_conn->identity_digest,0, - !options->HTTPSProxy, now); - if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) { - int reason = tls_error_to_orconn_end_reason(or_conn->tls_error); - control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, - reason); - if (!authdir_mode_tests_reachability(options)) - control_event_bootstrap_problem( - orconn_end_reason_to_control_string(reason), reason); - } - } - } else if (conn->hold_open_until_flushed) { - /* We only set hold_open_until_flushed when we're intentionally - * closing a connection. */ - rep_hist_note_disconnect(or_conn->identity_digest, now); - control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED, - tls_error_to_orconn_end_reason(or_conn->tls_error)); - } else if (!tor_digest_is_zero(or_conn->identity_digest)) { - rep_hist_note_connection_died(or_conn->identity_digest, now); - control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED, - tls_error_to_orconn_end_reason(or_conn->tls_error)); - } -} - -/** Return 1 if identity digest id_digest is known to be a - * currently or recently running relay. Otherwise return 0. */ -int -connection_or_digest_is_known_relay(const char *id_digest) -{ - if (router_get_consensus_status_by_id(id_digest)) - return 1; /* It's in the consensus: "yes" */ - if (router_get_by_id_digest(id_digest)) - return 1; /* Not in the consensus, but we have a descriptor for - * it. Probably it was in a recent consensus. "Yes". */ - return 0; -} - -/** Set the per-conn read and write limits for conn. If it's a known - * relay, we will rely on the global read and write buckets, so give it - * per-conn limits that are big enough they'll never matter. But if it's - * not a known relay, first check if we set PerConnBwRate/Burst, then - * check if the consensus sets them, else default to 'big enough'. - * - * If reset is true, set the bucket to be full. Otherwise, just - * clip the bucket if it happens to be too full. - */ -static void -connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, - const or_options_t *options) -{ - int rate, burst; /* per-connection rate limiting params */ - if (connection_or_digest_is_known_relay(conn->identity_digest)) { - /* It's in the consensus, or we have a descriptor for it meaning it - * was probably in a recent consensus. It's a recognized relay: - * give it full bandwidth. */ - rate = (int)options->BandwidthRate; - burst = (int)options->BandwidthBurst; - } else { - /* Not a recognized relay. Squeeze it down based on the suggested - * bandwidth parameters in the consensus, but allow local config - * options to override. */ - rate = options->PerConnBWRate ? (int)options->PerConnBWRate : - networkstatus_get_param(NULL, "perconnbwrate", - (int)options->BandwidthRate, 1, INT32_MAX); - burst = options->PerConnBWBurst ? (int)options->PerConnBWBurst : - networkstatus_get_param(NULL, "perconnbwburst", - (int)options->BandwidthBurst, 1, INT32_MAX); - } - - conn->bandwidthrate = rate; - conn->bandwidthburst = burst; -#ifdef USE_BUFFEREVENTS - { - const struct timeval *tick = tor_libevent_get_one_tick_timeout(); - struct ev_token_bucket_cfg *cfg, *old_cfg; - int64_t rate64 = (((int64_t)rate) * options->TokenBucketRefillInterval) - / 1000; - /* This can't overflow, since TokenBucketRefillInterval <= 1000, - * and rate started out less than INT_MAX. */ - int rate_per_tick = (int) rate64; - - cfg = ev_token_bucket_cfg_new(rate_per_tick, burst, rate_per_tick, - burst, tick); - old_cfg = conn->bucket_cfg; - if (conn->base_.bufev) - tor_set_bufferevent_rate_limit(conn->base_.bufev, cfg); - if (old_cfg) - ev_token_bucket_cfg_free(old_cfg); - conn->bucket_cfg = cfg; - (void) reset; /* No way to do this with libevent yet. */ - } -#else - if (reset) { /* set up the token buckets to be full */ - conn->read_bucket = conn->write_bucket = burst; - return; - } - /* If the new token bucket is smaller, take out the extra tokens. - * (If it's larger, don't -- the buckets can grow to reach the cap.) */ - if (conn->read_bucket > burst) - conn->read_bucket = burst; - if (conn->write_bucket > burst) - conn->write_bucket = burst; -#endif -} - -/** Either our set of relays or our per-conn rate limits have changed. - * Go through all the OR connections and update their token buckets to make - * sure they don't exceed their maximum values. */ -void -connection_or_update_token_buckets(smartlist_t *conns, - const or_options_t *options) -{ - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (connection_speaks_cells(conn)) - connection_or_update_token_buckets_helper(TO_OR_CONN(conn), 0, options); - }); -} - -/** If we don't necessarily know the router we're connecting to, but we - * have an addr/port/id_digest, then fill in as much as we can. Start - * by checking to see if this describes a router we know. - * started_here is 1 if we are the initiator of conn and - * 0 if it's an incoming connection. */ -void -connection_or_init_conn_from_address(or_connection_t *conn, - const tor_addr_t *addr, uint16_t port, - const char *id_digest, - int started_here) -{ - const node_t *r = node_get_by_id(id_digest); - connection_or_set_identity_digest(conn, id_digest); - connection_or_update_token_buckets_helper(conn, 1, get_options()); - - conn->base_.port = port; - tor_addr_copy(&conn->base_.addr, addr); - tor_addr_copy(&conn->real_addr, addr); - if (r) { - tor_addr_port_t node_ap; - node_get_pref_orport(r, &node_ap); - /* XXXX proposal 186 is making this more complex. For now, a conn - is canonical when it uses the _preferred_ address. */ - if (tor_addr_eq(&conn->base_.addr, &node_ap.addr)) - conn->is_canonical = 1; - if (!started_here) { - /* Override the addr/port, so our log messages will make sense. - * This is dangerous, since if we ever try looking up a conn by - * its actual addr/port, we won't remember. Careful! */ - /* XXXX arma: this is stupid, and it's the reason we need real_addr - * to track is_canonical properly. What requires it? */ - /* XXXX i believe the reason we did this, originally, is because - * we wanted to log what OR a connection was to, and if we logged the - * right IP address and port 56244, that wouldn't be as helpful. now we - * log the "right" port too, so we know if it's moria1 or moria2. - */ - tor_addr_copy(&conn->base_.addr, &node_ap.addr); - conn->base_.port = node_ap.port; - } - conn->nickname = tor_strdup(node_get_nickname(r)); - tor_free(conn->base_.address); - conn->base_.address = tor_dup_addr(&node_ap.addr); - } else { - const char *n; - /* If we're an authoritative directory server, we may know a - * nickname for this router. */ - n = dirserv_get_nickname_by_digest(id_digest); - if (n) { - conn->nickname = tor_strdup(n); - } else { - conn->nickname = tor_malloc(HEX_DIGEST_LEN+2); - conn->nickname[0] = '$'; - base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1, - conn->identity_digest, DIGEST_LEN); - } - tor_free(conn->base_.address); - conn->base_.address = tor_dup_addr(addr); - } -} - -/** These just pass all the is_bad_for_new_circs manipulation on to - * channel_t */ - -static unsigned int -connection_or_is_bad_for_new_circs(or_connection_t *or_conn) -{ - tor_assert(or_conn); - - if (or_conn->chan) - return channel_is_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan)); - else return 0; -} - -static void -connection_or_mark_bad_for_new_circs(or_connection_t *or_conn) -{ - tor_assert(or_conn); - - if (or_conn->chan) - channel_mark_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan)); -} - -/** How old do we let a connection to an OR get before deciding it's - * too old for new circuits? */ -#define TIME_BEFORE_OR_CONN_IS_TOO_OLD (60*60*24*7) - -/** Given the head of the linked list for all the or_connections with a given - * identity, set elements of that list as is_bad_for_new_circs as - * appropriate. Helper for connection_or_set_bad_connections(). - * - * Specifically, we set the is_bad_for_new_circs flag on: - * - all connections if force is true. - * - all connections that are too old. - * - all open non-canonical connections for which a canonical connection - * exists to the same router. - * - all open canonical connections for which a 'better' canonical - * connection exists to the same router. - * - all open non-canonical connections for which a 'better' non-canonical - * connection exists to the same router at the same address. - * - * See channel_is_better() in channel.c for our idea of what makes one OR - * connection better than another. - */ -static void -connection_or_group_set_badness(or_connection_t *head, int force) -{ - or_connection_t *or_conn = NULL, *best = NULL; - int n_old = 0, n_inprogress = 0, n_canonical = 0, n_other = 0; - time_t now = time(NULL); - - /* Pass 1: expire everything that's old, and see what the status of - * everything else is. */ - for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { - if (or_conn->base_.marked_for_close || - connection_or_is_bad_for_new_circs(or_conn)) - continue; - if (force || - or_conn->base_.timestamp_created + TIME_BEFORE_OR_CONN_IS_TOO_OLD - < now) { - log_info(LD_OR, - "Marking OR conn to %s:%d as too old for new circuits " - "(fd "TOR_SOCKET_T_FORMAT", %d secs old).", - or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, - (int)(now - or_conn->base_.timestamp_created)); - connection_or_mark_bad_for_new_circs(or_conn); - } - - if (connection_or_is_bad_for_new_circs(or_conn)) { - ++n_old; - } else if (or_conn->base_.state != OR_CONN_STATE_OPEN) { - ++n_inprogress; - } else if (or_conn->is_canonical) { - ++n_canonical; - } else { - ++n_other; - } - } - - /* Pass 2: We know how about how good the best connection is. - * expire everything that's worse, and find the very best if we can. */ - for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { - if (or_conn->base_.marked_for_close || - connection_or_is_bad_for_new_circs(or_conn)) - continue; /* This one doesn't need to be marked bad. */ - if (or_conn->base_.state != OR_CONN_STATE_OPEN) - continue; /* Don't mark anything bad until we have seen what happens - * when the connection finishes. */ - if (n_canonical && !or_conn->is_canonical) { - /* We have at least one open canonical connection to this router, - * and this one is open but not canonical. Mark it bad. */ - log_info(LD_OR, - "Marking OR conn to %s:%d as unsuitable for new circuits: " - "(fd "TOR_SOCKET_T_FORMAT", %d secs old). It is not " - "canonical, and we have another connection to that OR that is.", - or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, - (int)(now - or_conn->base_.timestamp_created)); - connection_or_mark_bad_for_new_circs(or_conn); - continue; - } - - if (!best || - channel_is_better(now, - TLS_CHAN_TO_BASE(or_conn->chan), - TLS_CHAN_TO_BASE(best->chan), - 0)) { - best = or_conn; - } - } - - if (!best) - return; - - /* Pass 3: One connection to OR is best. If it's canonical, mark as bad - * every other open connection. If it's non-canonical, mark as bad - * every other open connection to the same address. - * - * XXXX This isn't optimal; if we have connections to an OR at multiple - * addresses, we'd like to pick the best _for each address_, and mark as - * bad every open connection that isn't best for its address. But this - * can only occur in cases where the other OR is old (so we have no - * canonical connection to it), or where all the connections to the OR are - * at noncanonical addresses and we have no good direct connection (which - * means we aren't at risk of attaching circuits to it anyway). As - * 0.1.2.x dies out, the first case will go away, and the second one is - * "mostly harmless", so a fix can wait until somebody is bored. - */ - for (or_conn = head; or_conn; or_conn = or_conn->next_with_same_id) { - if (or_conn->base_.marked_for_close || - connection_or_is_bad_for_new_circs(or_conn) || - or_conn->base_.state != OR_CONN_STATE_OPEN) - continue; - if (or_conn != best && - channel_is_better(now, - TLS_CHAN_TO_BASE(best->chan), - TLS_CHAN_TO_BASE(or_conn->chan), 1)) { - /* This isn't the best conn, _and_ the best conn is better than it, - even when we're being forgiving. */ - if (best->is_canonical) { - log_info(LD_OR, - "Marking OR conn to %s:%d as unsuitable for new circuits: " - "(fd "TOR_SOCKET_T_FORMAT", %d secs old). " - "We have a better canonical one " - "(fd "TOR_SOCKET_T_FORMAT"; %d secs old).", - or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, - (int)(now - or_conn->base_.timestamp_created), - best->base_.s, (int)(now - best->base_.timestamp_created)); - connection_or_mark_bad_for_new_circs(or_conn); - } else if (!tor_addr_compare(&or_conn->real_addr, - &best->real_addr, CMP_EXACT)) { - log_info(LD_OR, - "Marking OR conn to %s:%d as unsuitable for new circuits: " - "(fd "TOR_SOCKET_T_FORMAT", %d secs old). We have a better " - "one with the " - "same address (fd "TOR_SOCKET_T_FORMAT"; %d secs old).", - or_conn->base_.address, or_conn->base_.port, or_conn->base_.s, - (int)(now - or_conn->base_.timestamp_created), - best->base_.s, (int)(now - best->base_.timestamp_created)); - connection_or_mark_bad_for_new_circs(or_conn); - } - } - } -} - -/** Go through all the OR connections (or if digest is non-NULL, just - * the OR connections with that digest), and set the is_bad_for_new_circs - * flag based on the rules in connection_or_group_set_badness() (or just - * always set it if force is true). - */ -void -connection_or_set_bad_connections(const char *digest, int force) -{ - if (!orconn_identity_map) - return; - - DIGESTMAP_FOREACH(orconn_identity_map, identity, or_connection_t *, conn) { - if (!digest || tor_memeq(digest, conn->identity_digest, DIGEST_LEN)) - connection_or_group_set_badness(conn, force); - } DIGESTMAP_FOREACH_END; -} - -/** conn is in the 'connecting' state, and it failed to complete - * a TCP connection. Send notifications appropriately. - * - * reason specifies the or_conn_end_reason for the failure; - * msg specifies the strerror-style error message. - */ -void -connection_or_connect_failed(or_connection_t *conn, - int reason, const char *msg) -{ - control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, reason); - if (!authdir_mode_tests_reachability(get_options())) - control_event_bootstrap_problem(msg, reason); -} - -/** conn got an error in connection_handle_read_impl() or - * connection_handle_write_impl() and is going to die soon. - * - * reason specifies the or_conn_end_reason for the failure; - * msg specifies the strerror-style error message. - */ -void -connection_or_notify_error(or_connection_t *conn, - int reason, const char *msg) -{ - channel_t *chan; - - tor_assert(conn); - - /* If we're connecting, call connect_failed() too */ - if (TO_CONN(conn)->state == OR_CONN_STATE_CONNECTING) - connection_or_connect_failed(conn, reason, msg); - - /* Tell the controlling channel if we have one */ - if (conn->chan) { - chan = TLS_CHAN_TO_BASE(conn->chan); - /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { - channel_close_for_error(chan); - } - } - - /* No need to mark for error because connection.c is about to do that */ -} - -/** Launch a new OR connection to addr:port and expect to - * handshake with an OR with identity digest id_digest. Optionally, - * pass in a pointer to a channel using this connection. - * - * If id_digest is me, do nothing. If we're already connected to it, - * return that connection. If the connect() is in progress, set the - * new conn's state to 'connecting' and return it. If connect() succeeds, - * call connection_tls_start_handshake() on it. - * - * This function is called from router_retry_connections(), for - * ORs connecting to ORs, and circuit_establish_circuit(), for - * OPs connecting to ORs. - * - * Return the launched conn, or NULL if it failed. - */ -or_connection_t * -connection_or_connect(const tor_addr_t *_addr, uint16_t port, - const char *id_digest, - channel_tls_t *chan) -{ - or_connection_t *conn; - const or_options_t *options = get_options(); - int socket_error = 0; - tor_addr_t addr; - - int r; - tor_addr_t proxy_addr; - uint16_t proxy_port; - int proxy_type; - - tor_assert(_addr); - tor_assert(id_digest); - tor_addr_copy(&addr, _addr); - - if (server_mode(options) && router_digest_is_me(id_digest)) { - log_info(LD_PROTOCOL,"Client asked me to connect to myself. Refusing."); - return NULL; - } - - conn = or_connection_new(CONN_TYPE_OR, tor_addr_family(&addr)); - - /* - * Set up conn so it's got all the data we need to remember for channels - * - * This stuff needs to happen before connection_or_init_conn_from_address() - * so connection_or_set_identity_digest() and such know where to look to - * keep the channel up to date. - */ - conn->chan = chan; - chan->conn = conn; - connection_or_init_conn_from_address(conn, &addr, port, id_digest, 1); - connection_or_change_state(conn, OR_CONN_STATE_CONNECTING); - control_event_or_conn_status(conn, OR_CONN_EVENT_LAUNCHED, 0); - - conn->is_outgoing = 1; - - /* If we are using a proxy server, find it and use it. */ - r = get_proxy_addrport(&proxy_addr, &proxy_port, &proxy_type, TO_CONN(conn)); - if (r == 0) { - conn->proxy_type = proxy_type; - if (proxy_type != PROXY_NONE) { - tor_addr_copy(&addr, &proxy_addr); - port = proxy_port; - conn->base_.proxy_state = PROXY_INFANT; - } - } else { - /* get_proxy_addrport() might fail if we have a Bridge line that - references a transport, but no ClientTransportPlugin lines - defining its transport proxy. If this is the case, let's try to - output a useful log message to the user. */ - const char *transport_name = - find_transport_name_by_bridge_addrport(&TO_CONN(conn)->addr, - TO_CONN(conn)->port); - - if (transport_name) { - log_warn(LD_GENERAL, "We were supposed to connect to bridge '%s' " - "using pluggable transport '%s', but we can't find a pluggable " - "transport proxy supporting '%s'. This can happen if you " - "haven't provided a ClientTransportPlugin line, or if " - "your pluggable transport proxy stopped running.", - fmt_addrport(&TO_CONN(conn)->addr, TO_CONN(conn)->port), - transport_name, transport_name); - } else { - log_warn(LD_GENERAL, "Tried to connect to '%s' through a proxy, but " - "the proxy address could not be found.", - fmt_addrport(&TO_CONN(conn)->addr, TO_CONN(conn)->port)); - } - - connection_free(TO_CONN(conn)); - return NULL; - } - - switch (connection_connect(TO_CONN(conn), conn->base_.address, - &addr, port, &socket_error)) { - case -1: - /* If the connection failed immediately, and we're using - * a proxy, our proxy is down. Don't blame the Tor server. */ - if (conn->base_.proxy_state == PROXY_INFANT) - entry_guard_register_connect_status(conn->identity_digest, - 0, 1, time(NULL)); - connection_or_connect_failed(conn, - errno_to_orconn_end_reason(socket_error), - tor_socket_strerror(socket_error)); - connection_free(TO_CONN(conn)); - return NULL; - case 0: - connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); - /* writable indicates finish, readable indicates broken link, - error indicates broken link on windows */ - return conn; - /* case 1: fall through */ - } - - if (connection_or_finished_connecting(conn) < 0) { - /* already marked for close */ - return NULL; - } - return conn; -} - -/** Mark orconn for close and transition the associated channel, if any, to - * the closing state. - * - * It's safe to call this and connection_or_close_for_error() any time, and - * channel layer will treat it as a connection closing for reasons outside - * its control, like the remote end closing it. It can also be a local - * reason that's specific to connection_t/or_connection_t rather than - * the channel mechanism, such as expiration of old connections in - * run_connection_housekeeping(). If you want to close a channel_t - * from somewhere that logically works in terms of generic channels - * rather than connections, use channel_mark_for_close(); see also - * the comment on that function in channel.c. - */ - -void -connection_or_close_normally(or_connection_t *orconn, int flush) -{ - channel_t *chan = NULL; - - tor_assert(orconn); - if (flush) connection_mark_and_flush_internal(TO_CONN(orconn)); - else connection_mark_for_close_internal(TO_CONN(orconn)); - if (orconn->chan) { - chan = TLS_CHAN_TO_BASE(orconn->chan); - /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { - channel_close_from_lower_layer(chan); - } - } -} - -/** Mark orconn for close and transition the associated channel, if any, to - * the error state. - */ - -void -connection_or_close_for_error(or_connection_t *orconn, int flush) -{ - channel_t *chan = NULL; - - tor_assert(orconn); - if (flush) connection_mark_and_flush_internal(TO_CONN(orconn)); - else connection_mark_for_close_internal(TO_CONN(orconn)); - if (orconn->chan) { - chan = TLS_CHAN_TO_BASE(orconn->chan); - /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { - channel_close_for_error(chan); - } - } -} - -/** Begin the tls handshake with conn. receiving is 0 if - * we initiated the connection, else it's 1. - * - * Assign a new tls object to conn->tls, begin reading on conn, and - * pass conn to connection_tls_continue_handshake(). - * - * Return -1 if conn is broken, else return 0. - */ -MOCK_IMPL(int, -connection_tls_start_handshake,(or_connection_t *conn, int receiving)) -{ - channel_listener_t *chan_listener; - channel_t *chan; - - /* Incoming connections will need a new channel passed to the - * channel_tls_listener */ - if (receiving) { - /* It shouldn't already be set */ - tor_assert(!(conn->chan)); - chan_listener = channel_tls_get_listener(); - if (!chan_listener) { - chan_listener = channel_tls_start_listener(); - command_setup_listener(chan_listener); - } - chan = channel_tls_handle_incoming(conn); - channel_listener_queue_incoming(chan_listener, chan); - } - - connection_or_change_state(conn, OR_CONN_STATE_TLS_HANDSHAKING); - tor_assert(!conn->tls); - conn->tls = tor_tls_new(conn->base_.s, receiving); - if (!conn->tls) { - log_warn(LD_BUG,"tor_tls_new failed. Closing."); - return -1; - } - tor_tls_set_logged_address(conn->tls, // XXX client and relay? - escaped_safe_str(conn->base_.address)); - -#ifdef USE_BUFFEREVENTS - if (connection_type_uses_bufferevent(TO_CONN(conn))) { - const int filtering = get_options()->UseFilteringSSLBufferevents; - struct bufferevent *b = - tor_tls_init_bufferevent(conn->tls, conn->base_.bufev, conn->base_.s, - receiving, filtering); - if (!b) { - log_warn(LD_BUG,"tor_tls_init_bufferevent failed. Closing."); - return -1; - } - conn->base_.bufev = b; - if (conn->bucket_cfg) - tor_set_bufferevent_rate_limit(conn->base_.bufev, conn->bucket_cfg); - connection_enable_rate_limiting(TO_CONN(conn)); - - connection_configure_bufferevent_callbacks(TO_CONN(conn)); - bufferevent_setcb(b, - connection_handle_read_cb, - connection_handle_write_cb, - connection_or_handle_event_cb,/* overriding this one*/ - TO_CONN(conn)); - } -#endif - connection_start_reading(TO_CONN(conn)); - log_debug(LD_HANDSHAKE,"starting TLS handshake on fd "TOR_SOCKET_T_FORMAT, - conn->base_.s); - note_crypto_pk_op(receiving ? TLS_HANDSHAKE_S : TLS_HANDSHAKE_C); - - IF_HAS_BUFFEREVENT(TO_CONN(conn), { - /* ???? */; - }) ELSE_IF_NO_BUFFEREVENT { - if (connection_tls_continue_handshake(conn) < 0) - return -1; - } - return 0; -} - -/** Block all future attempts to renegotiate on 'conn' */ -void -connection_or_block_renegotiation(or_connection_t *conn) -{ - tor_tls_t *tls = conn->tls; - if (!tls) - return; - tor_tls_set_renegotiate_callback(tls, NULL, NULL); - tor_tls_block_renegotiation(tls); -} - -/** Invoked on the server side from inside tor_tls_read() when the server - * gets a successful TLS renegotiation from the client. */ -static void -connection_or_tls_renegotiated_cb(tor_tls_t *tls, void *_conn) -{ - or_connection_t *conn = _conn; - (void)tls; - - /* Don't invoke this again. */ - connection_or_block_renegotiation(conn); - - if (connection_tls_finish_handshake(conn) < 0) { - /* XXXX_TLS double-check that it's ok to do this from inside read. */ - /* XXXX_TLS double-check that this verifies certificates. */ - connection_or_close_for_error(conn, 0); - } -} - -/** Move forward with the tls handshake. If it finishes, hand - * conn to connection_tls_finish_handshake(). - * - * Return -1 if conn is broken, else return 0. - */ -int -connection_tls_continue_handshake(or_connection_t *conn) -{ - int result; - check_no_tls_errors(); - again: - if (conn->base_.state == OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING) { - // log_notice(LD_OR, "Renegotiate with %p", conn->tls); - result = tor_tls_renegotiate(conn->tls); - // log_notice(LD_OR, "Result: %d", result); - } else { - tor_assert(conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING); - // log_notice(LD_OR, "Continue handshake with %p", conn->tls); - result = tor_tls_handshake(conn->tls); - // log_notice(LD_OR, "Result: %d", result); - } - switch (result) { - CASE_TOR_TLS_ERROR_ANY: - log_info(LD_OR,"tls error [%s]. breaking connection.", - tor_tls_err_to_string(result)); - return -1; - case TOR_TLS_DONE: - if (! tor_tls_used_v1_handshake(conn->tls)) { - if (!tor_tls_is_server(conn->tls)) { - if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { - if (tor_tls_received_v3_certificate(conn->tls)) { - log_info(LD_OR, "Client got a v3 cert! Moving on to v3 " - "handshake with ciphersuite %s", - tor_tls_get_ciphersuite_name(conn->tls)); - return connection_or_launch_v3_or_handshake(conn); - } else { - log_debug(LD_OR, "Done with initial SSL handshake (client-side)." - " Requesting renegotiation."); - connection_or_change_state(conn, - OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING); - goto again; - } - } - // log_notice(LD_OR,"Done. state was %d.", conn->base_.state); - } else { - /* v2/v3 handshake, but not a client. */ - log_debug(LD_OR, "Done with initial SSL handshake (server-side). " - "Expecting renegotiation or VERSIONS cell"); - tor_tls_set_renegotiate_callback(conn->tls, - connection_or_tls_renegotiated_cb, - conn); - connection_or_change_state(conn, - OR_CONN_STATE_TLS_SERVER_RENEGOTIATING); - connection_stop_writing(TO_CONN(conn)); - connection_start_reading(TO_CONN(conn)); - return 0; - } - } - return connection_tls_finish_handshake(conn); - case TOR_TLS_WANTWRITE: - connection_start_writing(TO_CONN(conn)); - log_debug(LD_OR,"wanted write"); - return 0; - case TOR_TLS_WANTREAD: /* handshaking conns are *always* reading */ - log_debug(LD_OR,"wanted read"); - return 0; - case TOR_TLS_CLOSE: - log_info(LD_OR,"tls closed. breaking connection."); - return -1; - } - return 0; -} - -#ifdef USE_BUFFEREVENTS -static void -connection_or_handle_event_cb(struct bufferevent *bufev, short event, - void *arg) -{ - struct or_connection_t *conn = TO_OR_CONN(arg); - - /* XXXX cut-and-paste code; should become a function. */ - if (event & BEV_EVENT_CONNECTED) { - if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { - if (tor_tls_finish_handshake(conn->tls) < 0) { - log_warn(LD_OR, "Problem finishing handshake"); - connection_or_close_for_error(conn, 0); - return; - } - } - - if (! tor_tls_used_v1_handshake(conn->tls)) { - if (!tor_tls_is_server(conn->tls)) { - if (conn->base_.state == OR_CONN_STATE_TLS_HANDSHAKING) { - if (tor_tls_received_v3_certificate(conn->tls)) { - log_info(LD_OR, "Client got a v3 cert!"); - if (connection_or_launch_v3_or_handshake(conn) < 0) - connection_or_close_for_error(conn, 0); - return; - } else { - connection_or_change_state(conn, - OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING); - tor_tls_unblock_renegotiation(conn->tls); - if (bufferevent_ssl_renegotiate(conn->base_.bufev)<0) { - log_warn(LD_OR, "Start_renegotiating went badly."); - connection_or_close_for_error(conn, 0); - } - tor_tls_unblock_renegotiation(conn->tls); - return; /* ???? */ - } - } - } else { - const int handshakes = tor_tls_get_num_server_handshakes(conn->tls); - - if (handshakes == 1) { - /* v2 or v3 handshake, as a server. Only got one handshake, so - * wait for the next one. */ - tor_tls_set_renegotiate_callback(conn->tls, - connection_or_tls_renegotiated_cb, - conn); - connection_or_change_state(conn, - OR_CONN_STATE_TLS_SERVER_RENEGOTIATING); - } else if (handshakes == 2) { - /* v2 handshake, as a server. Two handshakes happened already, - * so we treat renegotiation as done. - */ - connection_or_tls_renegotiated_cb(conn->tls, conn); - } else if (handshakes > 2) { - log_warn(LD_OR, "More than two handshakes done on connection. " - "Closing."); - connection_or_close_for_error(conn, 0); - } else { - log_warn(LD_BUG, "We were unexpectedly told that a connection " - "got %d handshakes. Closing.", handshakes); - connection_or_close_for_error(conn, 0); - } - return; - } - } - connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); - if (connection_tls_finish_handshake(conn) < 0) - connection_or_close_for_error(conn, 0); /* ???? */ - return; - } - - if (event & BEV_EVENT_ERROR) { - unsigned long err; - while ((err = bufferevent_get_openssl_error(bufev))) { - tor_tls_log_one_error(conn->tls, err, LOG_WARN, LD_OR, - "handshaking (with bufferevent)"); - } - } - - connection_handle_event_cb(bufev, event, arg); -} -#endif - -/** Return 1 if we initiated this connection, or 0 if it started - * out as an incoming connection. - */ -int -connection_or_nonopen_was_started_here(or_connection_t *conn) -{ - tor_assert(conn->base_.type == CONN_TYPE_OR || - conn->base_.type == CONN_TYPE_EXT_OR); - if (!conn->tls) - return 1; /* it's still in proxy states or something */ - if (conn->handshake_state) - return conn->handshake_state->started_here; - return !tor_tls_is_server(conn->tls); -} - -/** Conn just completed its handshake. Return 0 if all is well, and - * return -1 if he is lying, broken, or otherwise something is wrong. - * - * If we initiated this connection (started_here is true), make sure - * the other side sent a correctly formed certificate. If I initiated the - * connection, make sure it's the right guy. - * - * Otherwise (if we _didn't_ initiate this connection), it's okay for - * the certificate to be weird or absent. - * - * If we return 0, and the certificate is as expected, write a hash of the - * identity key into digest_rcvd_out, which must have DIGEST_LEN - * space in it. - * If the certificate is invalid or missing on an incoming connection, - * we return 0 and set digest_rcvd_out to DIGEST_LEN NUL bytes. - * (If we return -1, the contents of this buffer are undefined.) - * - * As side effects, - * 1) Set conn->circ_id_type according to tor-spec.txt. - * 2) If we're an authdirserver and we initiated the connection: drop all - * descriptors that claim to be on that IP/port but that aren't - * this guy; and note that this guy is reachable. - * 3) If this is a bridge and we didn't configure its identity - * fingerprint, remember the keyid we just learned. - */ -static int -connection_or_check_valid_tls_handshake(or_connection_t *conn, - int started_here, - char *digest_rcvd_out) -{ - crypto_pk_t *identity_rcvd=NULL; - const or_options_t *options = get_options(); - int severity = server_mode(options) ? LOG_PROTOCOL_WARN : LOG_WARN; - const char *safe_address = - started_here ? conn->base_.address : - safe_str_client(conn->base_.address); - const char *conn_type = started_here ? "outgoing" : "incoming"; - int has_cert = 0; - - check_no_tls_errors(); - has_cert = tor_tls_peer_has_cert(conn->tls); - if (started_here && !has_cert) { - log_info(LD_HANDSHAKE,"Tried connecting to router at %s:%d, but it didn't " - "send a cert! Closing.", - safe_address, conn->base_.port); - return -1; - } else if (!has_cert) { - log_debug(LD_HANDSHAKE,"Got incoming connection with no certificate. " - "That's ok."); - } - check_no_tls_errors(); - - if (has_cert) { - int v = tor_tls_verify(started_here?severity:LOG_INFO, - conn->tls, &identity_rcvd); - if (started_here && v<0) { - log_fn(severity,LD_HANDSHAKE,"Tried connecting to router at %s:%d: It" - " has a cert but it's invalid. Closing.", - safe_address, conn->base_.port); - return -1; - } else if (v<0) { - log_info(LD_HANDSHAKE,"Incoming connection gave us an invalid cert " - "chain; ignoring."); - } else { - log_debug(LD_HANDSHAKE, - "The certificate seems to be valid on %s connection " - "with %s:%d", conn_type, safe_address, conn->base_.port); - } - check_no_tls_errors(); - } - - if (identity_rcvd) { - crypto_pk_get_digest(identity_rcvd, digest_rcvd_out); - } else { - memset(digest_rcvd_out, 0, DIGEST_LEN); - } - - tor_assert(conn->chan); - channel_set_circid_type(TLS_CHAN_TO_BASE(conn->chan), identity_rcvd, 1); - - crypto_pk_free(identity_rcvd); - - if (started_here) - return connection_or_client_learned_peer_id(conn, - (const uint8_t*)digest_rcvd_out); - - return 0; -} - -/** Called when we (as a connection initiator) have definitively, - * authenticatedly, learned that ID of the Tor instance on the other - * side of conn is peer_id. For v1 and v2 handshakes, - * this is right after we get a certificate chain in a TLS handshake - * or renegotiation. For v3 handshakes, this is right after we get a - * certificate chain in a CERTS cell. - * - * If we want any particular ID before, record the one we got. - * - * If we wanted an ID, but we didn't get it, log a warning and return -1. - * - * If we're testing reachability, remember what we learned. - * - * Return 0 on success, -1 on failure. - */ -int -connection_or_client_learned_peer_id(or_connection_t *conn, - const uint8_t *peer_id) -{ - const or_options_t *options = get_options(); - int severity = server_mode(options) ? LOG_PROTOCOL_WARN : LOG_WARN; - - if (tor_digest_is_zero(conn->identity_digest)) { - connection_or_set_identity_digest(conn, (const char*)peer_id); - tor_free(conn->nickname); - conn->nickname = tor_malloc(HEX_DIGEST_LEN+2); - conn->nickname[0] = '$'; - base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1, - conn->identity_digest, DIGEST_LEN); - log_info(LD_HANDSHAKE, "Connected to router %s at %s:%d without knowing " - "its key. Hoping for the best.", - conn->nickname, conn->base_.address, conn->base_.port); - /* if it's a bridge and we didn't know its identity fingerprint, now - * we do -- remember it for future attempts. */ - learned_router_identity(&conn->base_.addr, conn->base_.port, - (const char*)peer_id); - } - - if (tor_memneq(peer_id, conn->identity_digest, DIGEST_LEN)) { - /* I was aiming for a particular digest. I didn't get it! */ - char seen[HEX_DIGEST_LEN+1]; - char expected[HEX_DIGEST_LEN+1]; - base16_encode(seen, sizeof(seen), (const char*)peer_id, DIGEST_LEN); - base16_encode(expected, sizeof(expected), conn->identity_digest, - DIGEST_LEN); - log_fn(severity, LD_HANDSHAKE, - "Tried connecting to router at %s:%d, but identity key was not " - "as expected: wanted %s but got %s.", - conn->base_.address, conn->base_.port, expected, seen); - entry_guard_register_connect_status(conn->identity_digest, 0, 1, - time(NULL)); - control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED, - END_OR_CONN_REASON_OR_IDENTITY); - if (!authdir_mode_tests_reachability(options)) - control_event_bootstrap_problem( - "Unexpected identity in router certificate", - END_OR_CONN_REASON_OR_IDENTITY); - return -1; - } - if (authdir_mode_tests_reachability(options)) { - dirserv_orconn_tls_done(&conn->base_.addr, conn->base_.port, - (const char*)peer_id); - } - - return 0; -} - -/** Return when a client used this, for connection.c, since client_used - * is now one of the timestamps of channel_t */ - -time_t -connection_or_client_used(or_connection_t *conn) -{ - tor_assert(conn); - - if (conn->chan) { - return channel_when_last_client(TLS_CHAN_TO_BASE(conn->chan)); - } else return 0; -} - -/** The v1/v2 TLS handshake is finished. - * - * Make sure we are happy with the person we just handshaked with. - * - * If he initiated the connection, make sure he's not already connected, - * then initialize conn from the information in router. - * - * If all is successful, call circuit_n_conn_done() to handle events - * that have been pending on the base_.address), - tor_tls_get_ciphersuite_name(conn->tls)); - - directory_set_dirty(); - - if (connection_or_check_valid_tls_handshake(conn, started_here, - digest_rcvd) < 0) - return -1; - - circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - - if (tor_tls_used_v1_handshake(conn->tls)) { - conn->link_proto = 1; - if (!started_here) { - connection_or_init_conn_from_address(conn, &conn->base_.addr, - conn->base_.port, digest_rcvd, 0); - } - tor_tls_block_renegotiation(conn->tls); - return connection_or_set_state_open(conn); - } else { - connection_or_change_state(conn, OR_CONN_STATE_OR_HANDSHAKING_V2); - if (connection_init_or_handshake_state(conn, started_here) < 0) - return -1; - if (!started_here) { - connection_or_init_conn_from_address(conn, &conn->base_.addr, - conn->base_.port, digest_rcvd, 0); - } - return connection_or_send_versions(conn, 0); - } -} - -/** - * Called as client when initial TLS handshake is done, and we notice - * that we got a v3-handshake signalling certificate from the server. - * Set up structures, do bookkeeping, and send the versions cell. - * Return 0 on success and -1 on failure. - */ -static int -connection_or_launch_v3_or_handshake(or_connection_t *conn) -{ - tor_assert(connection_or_nonopen_was_started_here(conn)); - tor_assert(tor_tls_received_v3_certificate(conn->tls)); - - circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - - connection_or_change_state(conn, OR_CONN_STATE_OR_HANDSHAKING_V3); - if (connection_init_or_handshake_state(conn, 1) < 0) - return -1; - - return connection_or_send_versions(conn, 1); -} - -/** Allocate a new connection handshake state for the connection - * conn. Return 0 on success, -1 on failure. */ -int -connection_init_or_handshake_state(or_connection_t *conn, int started_here) -{ - or_handshake_state_t *s; - if (conn->handshake_state) { - log_warn(LD_BUG, "Duplicate call to connection_init_or_handshake_state!"); - return 0; - } - s = conn->handshake_state = tor_malloc_zero(sizeof(or_handshake_state_t)); - s->started_here = started_here ? 1 : 0; - s->digest_sent_data = 1; - s->digest_received_data = 1; - return 0; -} - -/** Free all storage held by state. */ -void -or_handshake_state_free(or_handshake_state_t *state) -{ - if (!state) - return; - crypto_digest_free(state->digest_sent); - crypto_digest_free(state->digest_received); - tor_cert_free(state->auth_cert); - tor_cert_free(state->id_cert); - memwipe(state, 0xBE, sizeof(or_handshake_state_t)); - tor_free(state); -} - -/** - * Remember that cell has been transmitted (if incoming is - * false) or received (if incoming is true) during a V3 handshake using - * state. - * - * (We don't record the cell, but we keep a digest of everything sent or - * received during the v3 handshake, and the client signs it in an - * authenticate cell.) - */ -void -or_handshake_state_record_cell(or_connection_t *conn, - or_handshake_state_t *state, - const cell_t *cell, - int incoming) -{ - size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); - crypto_digest_t *d, **dptr; - packed_cell_t packed; - if (incoming) { - if (!state->digest_received_data) - return; - } else { - if (!state->digest_sent_data) - return; - } - if (!incoming) { - log_warn(LD_BUG, "We shouldn't be sending any non-variable-length cells " - "while making a handshake digest. But we think we are sending " - "one with type %d.", (int)cell->command); - } - dptr = incoming ? &state->digest_received : &state->digest_sent; - if (! *dptr) - *dptr = crypto_digest256_new(DIGEST_SHA256); - - d = *dptr; - /* Re-packing like this is a little inefficient, but we don't have to do - this very often at all. */ - cell_pack(&packed, cell, conn->wide_circ_ids); - crypto_digest_add_bytes(d, packed.body, cell_network_size); - memwipe(&packed, 0, sizeof(packed)); -} - -/** Remember that a variable-length cell has been transmitted (if - * incoming is false) or received (if incoming is true) during a - * V3 handshake using state. - * - * (We don't record the cell, but we keep a digest of everything sent or - * received during the v3 handshake, and the client signs it in an - * authenticate cell.) - */ -void -or_handshake_state_record_var_cell(or_connection_t *conn, - or_handshake_state_t *state, - const var_cell_t *cell, - int incoming) -{ - crypto_digest_t *d, **dptr; - int n; - char buf[VAR_CELL_MAX_HEADER_SIZE]; - if (incoming) { - if (!state->digest_received_data) - return; - } else { - if (!state->digest_sent_data) - return; - } - dptr = incoming ? &state->digest_received : &state->digest_sent; - if (! *dptr) - *dptr = crypto_digest256_new(DIGEST_SHA256); - - d = *dptr; - - n = var_cell_pack_header(cell, buf, conn->wide_circ_ids); - crypto_digest_add_bytes(d, buf, n); - crypto_digest_add_bytes(d, (const char *)cell->payload, cell->payload_len); - - memwipe(buf, 0, sizeof(buf)); -} - -/** Set conn's state to OR_CONN_STATE_OPEN, and tell other subsystems - * as appropriate. Called when we are done with all TLS and OR handshaking. - */ -int -connection_or_set_state_open(or_connection_t *conn) -{ - connection_or_change_state(conn, OR_CONN_STATE_OPEN); - control_event_or_conn_status(conn, OR_CONN_EVENT_CONNECTED, 0); - - or_handshake_state_free(conn->handshake_state); - conn->handshake_state = NULL; - IF_HAS_BUFFEREVENT(TO_CONN(conn), { - connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); - }) ELSE_IF_NO_BUFFEREVENT { - connection_start_reading(TO_CONN(conn)); - } - - return 0; -} - -/** Pack cell into wire-format, and write it onto conn's outbuf. - * For cells that use or affect a circuit, this should only be called by - * connection_or_flush_from_first_active_circuit(). - */ -void -connection_or_write_cell_to_buf(const cell_t *cell, or_connection_t *conn) -{ - packed_cell_t networkcell; - size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); - - tor_assert(cell); - tor_assert(conn); - - cell_pack(&networkcell, cell, conn->wide_circ_ids); - - connection_write_to_buf(networkcell.body, cell_network_size, TO_CONN(conn)); - - /* Touch the channel's active timestamp if there is one */ - if (conn->chan) - channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); - - if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) - or_handshake_state_record_cell(conn, conn->handshake_state, cell, 0); - - if (cell->command != CELL_PADDING) - conn->timestamp_last_added_nonpadding = approx_time(); -} - -/** Pack a variable-length cell into wire-format, and write it onto - * conn's outbuf. Right now, this DOES NOT support cells that - * affect a circuit. - */ -void -connection_or_write_var_cell_to_buf(const var_cell_t *cell, - or_connection_t *conn) -{ - int n; - char hdr[VAR_CELL_MAX_HEADER_SIZE]; - tor_assert(cell); - tor_assert(conn); - n = var_cell_pack_header(cell, hdr, conn->wide_circ_ids); - connection_write_to_buf(hdr, n, TO_CONN(conn)); - connection_write_to_buf((char*)cell->payload, - cell->payload_len, TO_CONN(conn)); - if (conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3) - or_handshake_state_record_var_cell(conn, conn->handshake_state, cell, 0); - if (cell->command != CELL_PADDING) - conn->timestamp_last_added_nonpadding = approx_time(); - - /* Touch the channel's active timestamp if there is one */ - if (conn->chan) - channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); -} - -/** See whether there's a variable-length cell waiting on or_conn's - * inbuf. Return values as for fetch_var_cell_from_buf(). */ -static int -connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out) -{ - connection_t *conn = TO_CONN(or_conn); - IF_HAS_BUFFEREVENT(conn, { - struct evbuffer *input = bufferevent_get_input(conn->bufev); - return fetch_var_cell_from_evbuffer(input, out, or_conn->link_proto); - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); - } -} - -/** Process cells from conn's inbuf. - * - * Loop: while inbuf contains a cell, pull it off the inbuf, unpack it, - * and hand it to command_process_cell(). - * - * Always return 0. - */ -static int -connection_or_process_cells_from_inbuf(or_connection_t *conn) -{ - var_cell_t *var_cell; - - while (1) { - log_debug(LD_OR, - TOR_SOCKET_T_FORMAT": starting, inbuf_datalen %d " - "(%d pending in tls object).", - conn->base_.s,(int)connection_get_inbuf_len(TO_CONN(conn)), - tor_tls_get_pending_bytes(conn->tls)); - if (connection_fetch_var_cell_from_buf(conn, &var_cell)) { - if (!var_cell) - return 0; /* not yet. */ - - /* Touch the channel's active timestamp if there is one */ - if (conn->chan) - channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); - - circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - channel_tls_handle_var_cell(var_cell, conn); - var_cell_free(var_cell); - } else { - const int wide_circ_ids = conn->wide_circ_ids; - size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); - char buf[CELL_MAX_NETWORK_SIZE]; - cell_t cell; - if (connection_get_inbuf_len(TO_CONN(conn)) - < cell_network_size) /* whole response available? */ - return 0; /* not yet */ - - /* Touch the channel's active timestamp if there is one */ - if (conn->chan) - channel_timestamp_active(TLS_CHAN_TO_BASE(conn->chan)); - - circuit_build_times_network_is_live(get_circuit_build_times_mutable()); - connection_fetch_from_buf(buf, cell_network_size, TO_CONN(conn)); - - /* retrieve cell info from buf (create the host-order struct from the - * network-order string) */ - cell_unpack(&cell, buf, wide_circ_ids); - - channel_tls_handle_cell(&cell, conn); - } - } -} - -/** Array of recognized link protocol versions. */ -static const uint16_t or_protocol_versions[] = { 1, 2, 3, 4 }; -/** Number of versions in or_protocol_versions. */ -static const int n_or_protocol_versions = - (int)( sizeof(or_protocol_versions)/sizeof(uint16_t) ); - -/** Return true iff v is a link protocol version that this Tor - * implementation believes it can support. */ -int -is_or_protocol_version_known(uint16_t v) -{ - int i; - for (i = 0; i < n_or_protocol_versions; ++i) { - if (or_protocol_versions[i] == v) - return 1; - } - return 0; -} - -/** Send a VERSIONS cell on conn, telling the other host about the - * link protocol versions that this Tor can support. - * - * If v3_plus, this is part of a V3 protocol handshake, so only - * allow protocol version v3 or later. If not v3_plus, this is - * not part of a v3 protocol handshake, so don't allow protocol v3 or - * later. - **/ -int -connection_or_send_versions(or_connection_t *conn, int v3_plus) -{ - var_cell_t *cell; - int i; - int n_versions = 0; - const int min_version = v3_plus ? 3 : 0; - const int max_version = v3_plus ? UINT16_MAX : 2; - tor_assert(conn->handshake_state && - !conn->handshake_state->sent_versions_at); - cell = var_cell_new(n_or_protocol_versions * 2); - cell->command = CELL_VERSIONS; - for (i = 0; i < n_or_protocol_versions; ++i) { - uint16_t v = or_protocol_versions[i]; - if (v < min_version || v > max_version) - continue; - set_uint16(cell->payload+(2*n_versions), htons(v)); - ++n_versions; - } - cell->payload_len = n_versions * 2; - - connection_or_write_var_cell_to_buf(cell, conn); - conn->handshake_state->sent_versions_at = time(NULL); - - var_cell_free(cell); - return 0; -} - -/** Send a NETINFO cell on conn, telling the other server what we know - * about their address, our address, and the current time. */ -int -connection_or_send_netinfo(or_connection_t *conn) -{ - cell_t cell; - time_t now = time(NULL); - const routerinfo_t *me; - int len; - uint8_t *out; - - tor_assert(conn->handshake_state); - - if (conn->handshake_state->sent_netinfo) { - log_warn(LD_BUG, "Attempted to send an extra netinfo cell on a connection " - "where we already sent one."); - return 0; - } - - memset(&cell, 0, sizeof(cell_t)); - cell.command = CELL_NETINFO; - - /* Timestamp, if we're a relay. */ - if (public_server_mode(get_options()) || ! conn->is_outgoing) - set_uint32(cell.payload, htonl((uint32_t)now)); - - /* Their address. */ - out = cell.payload + 4; - /* We use &conn->real_addr below, unless it hasn't yet been set. If it - * hasn't yet been set, we know that base_.addr hasn't been tampered with - * yet either. */ - len = append_address_to_payload(out, !tor_addr_is_null(&conn->real_addr) - ? &conn->real_addr : &conn->base_.addr); - if (len<0) - return -1; - out += len; - - /* My address -- only include it if I'm a public relay, or if I'm a - * bridge and this is an incoming connection. If I'm a bridge and this - * is an outgoing connection, act like a normal client and omit it. */ - if ((public_server_mode(get_options()) || !conn->is_outgoing) && - (me = router_get_my_routerinfo())) { - tor_addr_t my_addr; - *out++ = 1 + !tor_addr_is_null(&me->ipv6_addr); - - tor_addr_from_ipv4h(&my_addr, me->addr); - len = append_address_to_payload(out, &my_addr); - if (len < 0) - return -1; - out += len; - - if (!tor_addr_is_null(&me->ipv6_addr)) { - len = append_address_to_payload(out, &me->ipv6_addr); - if (len < 0) - return -1; - } - } else { - *out = 0; - } - - conn->handshake_state->digest_sent_data = 0; - conn->handshake_state->sent_netinfo = 1; - connection_or_write_cell_to_buf(&cell, conn); - - return 0; -} - -/** Send a CERTS cell on the connection conn. Return 0 on success, -1 - * on failure. */ -int -connection_or_send_certs_cell(or_connection_t *conn) -{ - const tor_cert_t *link_cert = NULL, *id_cert = NULL; - const uint8_t *link_encoded = NULL, *id_encoded = NULL; - size_t link_len, id_len; - var_cell_t *cell; - size_t cell_len; - ssize_t pos; - int server_mode; - - tor_assert(conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3); - - if (! conn->handshake_state) - return -1; - server_mode = ! conn->handshake_state->started_here; - if (tor_tls_get_my_certs(server_mode, &link_cert, &id_cert) < 0) - return -1; - tor_cert_get_der(link_cert, &link_encoded, &link_len); - tor_cert_get_der(id_cert, &id_encoded, &id_len); - - cell_len = 1 /* 1 byte: num certs in cell */ + - 2 * ( 1 + 2 ) /* For each cert: 1 byte for type, 2 for length */ + - link_len + id_len; - cell = var_cell_new(cell_len); - cell->command = CELL_CERTS; - cell->payload[0] = 2; - pos = 1; - - if (server_mode) - cell->payload[pos] = OR_CERT_TYPE_TLS_LINK; /* Link cert */ - else - cell->payload[pos] = OR_CERT_TYPE_AUTH_1024; /* client authentication */ - set_uint16(&cell->payload[pos+1], htons(link_len)); - memcpy(&cell->payload[pos+3], link_encoded, link_len); - pos += 3 + link_len; - - cell->payload[pos] = OR_CERT_TYPE_ID_1024; /* ID cert */ - set_uint16(&cell->payload[pos+1], htons(id_len)); - memcpy(&cell->payload[pos+3], id_encoded, id_len); - pos += 3 + id_len; - - tor_assert(pos == (int)cell_len); /* Otherwise we just smashed the heap */ - - connection_or_write_var_cell_to_buf(cell, conn); - var_cell_free(cell); - - return 0; -} - -/** Send an AUTH_CHALLENGE cell on the connection conn. Return 0 - * on success, -1 on failure. */ -int -connection_or_send_auth_challenge_cell(or_connection_t *conn) -{ - var_cell_t *cell; - uint8_t *cp; - uint8_t challenge[OR_AUTH_CHALLENGE_LEN]; - tor_assert(conn->base_.state == OR_CONN_STATE_OR_HANDSHAKING_V3); - - if (! conn->handshake_state) - return -1; - - if (crypto_rand((char*)challenge, OR_AUTH_CHALLENGE_LEN) < 0) - return -1; - cell = var_cell_new(OR_AUTH_CHALLENGE_LEN + 4); - cell->command = CELL_AUTH_CHALLENGE; - memcpy(cell->payload, challenge, OR_AUTH_CHALLENGE_LEN); - cp = cell->payload + OR_AUTH_CHALLENGE_LEN; - set_uint16(cp, htons(1)); /* We recognize one authentication type. */ - set_uint16(cp+2, htons(AUTHTYPE_RSA_SHA256_TLSSECRET)); - - connection_or_write_var_cell_to_buf(cell, conn); - var_cell_free(cell); - memwipe(challenge, 0, sizeof(challenge)); - - return 0; -} - -/** Compute the main body of an AUTHENTICATE cell that a client can use - * to authenticate itself on a v3 handshake for conn. Write it to the - * outlen-byte buffer at out. - * - * If server is true, only calculate the first - * V3_AUTH_FIXED_PART_LEN bytes -- the part of the authenticator that's - * determined by the rest of the handshake, and which match the provided value - * exactly. - * - * If server is false and signing_key is NULL, calculate the - * first V3_AUTH_BODY_LEN bytes of the authenticator (that is, everything - * that should be signed), but don't actually sign it. - * - * If server is false and signing_key is provided, calculate the - * entire authenticator, signed with signing_key. - * - * Return the length of the cell body on success, and -1 on failure. - */ -int -connection_or_compute_authenticate_cell_body(or_connection_t *conn, - uint8_t *out, size_t outlen, - crypto_pk_t *signing_key, - int server) -{ - uint8_t *ptr; - - /* assert state is reasonable XXXX */ - - if (outlen < V3_AUTH_FIXED_PART_LEN || - (!server && outlen < V3_AUTH_BODY_LEN)) - return -1; - - ptr = out; - - /* Type: 8 bytes. */ - memcpy(ptr, "AUTH0001", 8); - ptr += 8; - - { - const tor_cert_t *id_cert=NULL, *link_cert=NULL; - const digests_t *my_digests, *their_digests; - const uint8_t *my_id, *their_id, *client_id, *server_id; - if (tor_tls_get_my_certs(server, &link_cert, &id_cert)) - return -1; - my_digests = tor_cert_get_id_digests(id_cert); - their_digests = tor_cert_get_id_digests(conn->handshake_state->id_cert); - tor_assert(my_digests); - tor_assert(their_digests); - my_id = (uint8_t*)my_digests->d[DIGEST_SHA256]; - their_id = (uint8_t*)their_digests->d[DIGEST_SHA256]; - - client_id = server ? their_id : my_id; - server_id = server ? my_id : their_id; - - /* Client ID digest: 32 octets. */ - memcpy(ptr, client_id, 32); - ptr += 32; - - /* Server ID digest: 32 octets. */ - memcpy(ptr, server_id, 32); - ptr += 32; - } - - { - crypto_digest_t *server_d, *client_d; - if (server) { - server_d = conn->handshake_state->digest_sent; - client_d = conn->handshake_state->digest_received; - } else { - client_d = conn->handshake_state->digest_sent; - server_d = conn->handshake_state->digest_received; - } - - /* Server log digest : 32 octets */ - crypto_digest_get_digest(server_d, (char*)ptr, 32); - ptr += 32; - - /* Client log digest : 32 octets */ - crypto_digest_get_digest(client_d, (char*)ptr, 32); - ptr += 32; - } - - { - /* Digest of cert used on TLS link : 32 octets. */ - const tor_cert_t *cert = NULL; - tor_cert_t *freecert = NULL; - if (server) { - tor_tls_get_my_certs(1, &cert, NULL); - } else { - freecert = tor_tls_get_peer_cert(conn->tls); - cert = freecert; - } - if (!cert) - return -1; - memcpy(ptr, tor_cert_get_cert_digests(cert)->d[DIGEST_SHA256], 32); - - if (freecert) - tor_cert_free(freecert); - ptr += 32; - } - - /* HMAC of clientrandom and serverrandom using master key : 32 octets */ - tor_tls_get_tlssecrets(conn->tls, ptr); - ptr += 32; - - tor_assert(ptr - out == V3_AUTH_FIXED_PART_LEN); - - if (server) - return V3_AUTH_FIXED_PART_LEN; // ptr-out - - /* 8 octets were reserved for the current time, but we're trying to get out - * of the habit of sending time around willynilly. Fortunately, nothing - * checks it. That's followed by 16 bytes of nonce. */ - crypto_rand((char*)ptr, 24); - ptr += 24; - - tor_assert(ptr - out == V3_AUTH_BODY_LEN); - - if (!signing_key) - return V3_AUTH_BODY_LEN; // ptr - out - - { - int siglen; - char d[32]; - crypto_digest256(d, (char*)out, ptr-out, DIGEST_SHA256); - siglen = crypto_pk_private_sign(signing_key, - (char*)ptr, outlen - (ptr-out), - d, 32); - if (siglen < 0) - return -1; - - ptr += siglen; - tor_assert(ptr <= out+outlen); - return (int)(ptr - out); - } -} - -/** Send an AUTHENTICATE cell on the connection conn. Return 0 on - * success, -1 on failure */ -int -connection_or_send_authenticate_cell(or_connection_t *conn, int authtype) -{ - var_cell_t *cell; - crypto_pk_t *pk = tor_tls_get_my_client_auth_key(); - int authlen; - size_t cell_maxlen; - /* XXXX make sure we're actually supposed to send this! */ - - if (!pk) { - log_warn(LD_BUG, "Can't compute authenticate cell: no client auth key"); - return -1; - } - if (authtype != AUTHTYPE_RSA_SHA256_TLSSECRET) { - log_warn(LD_BUG, "Tried to send authenticate cell with unknown " - "authentication type %d", authtype); - return -1; - } - - cell_maxlen = 4 + /* overhead */ - V3_AUTH_BODY_LEN + /* Authentication body */ - crypto_pk_keysize(pk) + /* Max signature length */ - 16 /* add a few extra bytes just in case. */; - - cell = var_cell_new(cell_maxlen); - cell->command = CELL_AUTHENTICATE; - set_uint16(cell->payload, htons(AUTHTYPE_RSA_SHA256_TLSSECRET)); - /* skip over length ; we don't know that yet. */ - - authlen = connection_or_compute_authenticate_cell_body(conn, - cell->payload+4, - cell_maxlen-4, - pk, - 0 /* not server */); - if (authlen < 0) { - log_warn(LD_BUG, "Unable to compute authenticate cell!"); - var_cell_free(cell); - return -1; - } - tor_assert(authlen + 4 <= cell->payload_len); - set_uint16(cell->payload+2, htons(authlen)); - cell->payload_len = authlen + 4; - - connection_or_write_var_cell_to_buf(cell, conn); - var_cell_free(cell); - - return 0; -} - diff --git a/src/tor/connection_or.h b/src/tor/connection_or.h deleted file mode 100644 index 8d9302893..000000000 --- a/src/tor/connection_or.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file connection_or.h - * \brief Header file for connection_or.c. - **/ - -#ifndef TOR_CONNECTION_OR_H -#define TOR_CONNECTION_OR_H - -void connection_or_remove_from_identity_map(or_connection_t *conn); -void connection_or_clear_identity_map(void); -void clear_broken_connection_map(int disable); -or_connection_t *connection_or_get_for_extend(const char *digest, - const tor_addr_t *target_addr, - const char **msg_out, - int *launch_out); -void connection_or_set_bad_connections(const char *digest, int force); - -void connection_or_block_renegotiation(or_connection_t *conn); -int connection_or_reached_eof(or_connection_t *conn); -int connection_or_process_inbuf(or_connection_t *conn); -int connection_or_flushed_some(or_connection_t *conn); -int connection_or_finished_flushing(or_connection_t *conn); -int connection_or_finished_connecting(or_connection_t *conn); -void connection_or_about_to_close(or_connection_t *conn); -int connection_or_digest_is_known_relay(const char *id_digest); -void connection_or_update_token_buckets(smartlist_t *conns, - const or_options_t *options); - -void connection_or_connect_failed(or_connection_t *conn, - int reason, const char *msg); -void connection_or_notify_error(or_connection_t *conn, - int reason, const char *msg); -or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - channel_tls_t *chan); - -void connection_or_close_normally(or_connection_t *orconn, int flush); -void connection_or_close_for_error(or_connection_t *orconn, int flush); - -void connection_or_report_broken_states(int severity, int domain); - -MOCK_DECL(int,connection_tls_start_handshake,(or_connection_t *conn, - int receiving)); -int connection_tls_continue_handshake(or_connection_t *conn); - -int connection_init_or_handshake_state(or_connection_t *conn, - int started_here); -void connection_or_init_conn_from_address(or_connection_t *conn, - const tor_addr_t *addr, - uint16_t port, - const char *id_digest, - int started_here); -int connection_or_client_learned_peer_id(or_connection_t *conn, - const uint8_t *peer_id); -time_t connection_or_client_used(or_connection_t *conn); -int connection_or_get_num_circuits(or_connection_t *conn); -void or_handshake_state_free(or_handshake_state_t *state); -void or_handshake_state_record_cell(or_connection_t *conn, - or_handshake_state_t *state, - const cell_t *cell, - int incoming); -void or_handshake_state_record_var_cell(or_connection_t *conn, - or_handshake_state_t *state, - const var_cell_t *cell, - int incoming); - -int connection_or_set_state_open(or_connection_t *conn); -void connection_or_write_cell_to_buf(const cell_t *cell, - or_connection_t *conn); -void connection_or_write_var_cell_to_buf(const var_cell_t *cell, - or_connection_t *conn); -int connection_or_send_versions(or_connection_t *conn, int v3_plus); -int connection_or_send_netinfo(or_connection_t *conn); -int connection_or_send_certs_cell(or_connection_t *conn); -int connection_or_send_auth_challenge_cell(or_connection_t *conn); -int connection_or_compute_authenticate_cell_body(or_connection_t *conn, - uint8_t *out, size_t outlen, - crypto_pk_t *signing_key, - int server); -int connection_or_send_authenticate_cell(or_connection_t *conn, int type); - -int is_or_protocol_version_known(uint16_t version); - -void cell_pack(packed_cell_t *dest, const cell_t *src, int wide_circ_ids); -int var_cell_pack_header(const var_cell_t *cell, char *hdr_out, - int wide_circ_ids); -var_cell_t *var_cell_new(uint16_t payload_len); -void var_cell_free(var_cell_t *cell); - -/** DOCDOC */ -#define MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS 4 - -#endif - diff --git a/src/tor/container.c b/src/tor/container.c deleted file mode 100644 index eee85919e..000000000 --- a/src/tor/container.c +++ /dev/null @@ -1,1557 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file container.c - * \brief Implements a smartlist (a resizable array) along - * with helper functions to use smartlists. Also includes - * hash table implementations of a string-to-void* map, and of - * a digest-to-void* map. - **/ - -#include "tor_compat.h" -#include "tor_util.h" -#include "torlog.h" -#include "container.h" -#include "crypto.h" - -#include -#include -#include - -#include "ht.h" - -/** All newly allocated smartlists have this capacity. */ -#define SMARTLIST_DEFAULT_CAPACITY 16 - -/** Allocate and return an empty smartlist. - */ -smartlist_t * -smartlist_new(void) -{ - smartlist_t *sl = tor_malloc(sizeof(smartlist_t)); - sl->num_used = 0; - sl->capacity = SMARTLIST_DEFAULT_CAPACITY; - sl->list = tor_malloc(sizeof(void *) * sl->capacity); - return sl; -} - -/** Deallocate a smartlist. Does not release storage associated with the - * list's elements. - */ -void -smartlist_free(smartlist_t *sl) -{ - if (!sl) - return; - tor_free(sl->list); - tor_free(sl); -} - -/** Remove all elements from the list. - */ -void -smartlist_clear(smartlist_t *sl) -{ - sl->num_used = 0; -} - -/** Make sure that sl can hold at least size entries. */ -static INLINE void -smartlist_ensure_capacity(smartlist_t *sl, int size) -{ -#if SIZEOF_SIZE_T > SIZEOF_INT -#define MAX_CAPACITY (INT_MAX) -#else -#define MAX_CAPACITY (int)((SIZE_MAX / (sizeof(void*)))) -#endif - if (size > sl->capacity) { - int higher = sl->capacity; - if (PREDICT_UNLIKELY(size > MAX_CAPACITY/2)) { - tor_assert(size <= MAX_CAPACITY); - higher = MAX_CAPACITY; - } else { - while (size > higher) - higher *= 2; - } - sl->capacity = higher; - sl->list = tor_realloc(sl->list, sizeof(void*)*((size_t)sl->capacity)); - } -} - -/** Append element to the end of the list. */ -void -smartlist_add(smartlist_t *sl, void *element) -{ - smartlist_ensure_capacity(sl, sl->num_used+1); - sl->list[sl->num_used++] = element; -} - -/** Append each element from S2 to the end of S1. */ -void -smartlist_add_all(smartlist_t *s1, const smartlist_t *s2) -{ - int new_size = s1->num_used + s2->num_used; - tor_assert(new_size >= s1->num_used); /* check for overflow. */ - smartlist_ensure_capacity(s1, new_size); - memcpy(s1->list + s1->num_used, s2->list, s2->num_used*sizeof(void*)); - s1->num_used = new_size; -} - -/** Remove all elements E from sl such that E==element. Preserve - * the order of any elements before E, but elements after E can be - * rearranged. - */ -void -smartlist_remove(smartlist_t *sl, const void *element) -{ - int i; - if (element == NULL) - return; - for (i=0; i < sl->num_used; i++) - if (sl->list[i] == element) { - sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ - i--; /* so we process the new i'th element */ - } -} - -/** If sl is nonempty, remove and return the final element. Otherwise, - * return NULL. */ -void * -smartlist_pop_last(smartlist_t *sl) -{ - tor_assert(sl); - if (sl->num_used) - return sl->list[--sl->num_used]; - else - return NULL; -} - -/** Reverse the order of the items in sl. */ -void -smartlist_reverse(smartlist_t *sl) -{ - int i, j; - void *tmp; - tor_assert(sl); - for (i = 0, j = sl->num_used-1; i < j; ++i, --j) { - tmp = sl->list[i]; - sl->list[i] = sl->list[j]; - sl->list[j] = tmp; - } -} - -/** If there are any strings in sl equal to element, remove and free them. - * Does not preserve order. */ -void -smartlist_string_remove(smartlist_t *sl, const char *element) -{ - int i; - tor_assert(sl); - tor_assert(element); - for (i = 0; i < sl->num_used; ++i) { - if (!strcmp(element, sl->list[i])) { - tor_free(sl->list[i]); - sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */ - i--; /* so we process the new i'th element */ - } - } -} - -/** Return true iff some element E of sl has E==element. - */ -int -smartlist_contains(const smartlist_t *sl, const void *element) -{ - int i; - for (i=0; i < sl->num_used; i++) - if (sl->list[i] == element) - return 1; - return 0; -} - -/** Return true iff sl has some element E such that - * !strcmp(E,element) - */ -int -smartlist_contains_string(const smartlist_t *sl, const char *element) -{ - int i; - if (!sl) return 0; - for (i=0; i < sl->num_used; i++) - if (strcmp((const char*)sl->list[i],element)==0) - return 1; - return 0; -} - -/** If element is equal to an element of sl, return that - * element's index. Otherwise, return -1. */ -int -smartlist_string_pos(const smartlist_t *sl, const char *element) -{ - int i; - if (!sl) return -1; - for (i=0; i < sl->num_used; i++) - if (strcmp((const char*)sl->list[i],element)==0) - return i; - return -1; -} - -/** Return true iff sl has some element E such that - * !strcasecmp(E,element) - */ -int -smartlist_contains_string_case(const smartlist_t *sl, const char *element) -{ - int i; - if (!sl) return 0; - for (i=0; i < sl->num_used; i++) - if (strcasecmp((const char*)sl->list[i],element)==0) - return 1; - return 0; -} - -/** Return true iff sl has some element E such that E is equal - * to the decimal encoding of num. - */ -int -smartlist_contains_int_as_string(const smartlist_t *sl, int num) -{ - char buf[32]; /* long enough for 64-bit int, and then some. */ - tor_snprintf(buf,sizeof(buf),"%d", num); - return smartlist_contains_string(sl, buf); -} - -/** Return true iff the two lists contain the same strings in the same - * order, or if they are both NULL. */ -int -smartlist_strings_eq(const smartlist_t *sl1, const smartlist_t *sl2) -{ - if (sl1 == NULL) - return sl2 == NULL; - if (sl2 == NULL) - return 0; - if (smartlist_len(sl1) != smartlist_len(sl2)) - return 0; - SMARTLIST_FOREACH(sl1, const char *, cp1, { - const char *cp2 = smartlist_get(sl2, cp1_sl_idx); - if (strcmp(cp1, cp2)) - return 0; - }); - return 1; -} - -/** Return true iff the two lists contain the same int pointer values in - * the same order, or if they are both NULL. */ -int -smartlist_ints_eq(const smartlist_t *sl1, const smartlist_t *sl2) -{ - if (sl1 == NULL) - return sl2 == NULL; - if (sl2 == NULL) - return 0; - if (smartlist_len(sl1) != smartlist_len(sl2)) - return 0; - SMARTLIST_FOREACH(sl1, int *, cp1, { - int *cp2 = smartlist_get(sl2, cp1_sl_idx); - if (*cp1 != *cp2) - return 0; - }); - return 1; -} - -/** Return true iff sl has some element E such that - * tor_memeq(E,element,DIGEST_LEN) - */ -int -smartlist_contains_digest(const smartlist_t *sl, const char *element) -{ - int i; - if (!sl) return 0; - for (i=0; i < sl->num_used; i++) - if (tor_memeq((const char*)sl->list[i],element,DIGEST_LEN)) - return 1; - return 0; -} - -/** Return true iff some element E of sl2 has smartlist_contains(sl1,E). - */ -int -smartlist_overlap(const smartlist_t *sl1, const smartlist_t *sl2) -{ - int i; - for (i=0; i < sl2->num_used; i++) - if (smartlist_contains(sl1, sl2->list[i])) - return 1; - return 0; -} - -/** Remove every element E of sl1 such that !smartlist_contains(sl2,E). - * Does not preserve the order of sl1. - */ -void -smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2) -{ - int i; - for (i=0; i < sl1->num_used; i++) - if (!smartlist_contains(sl2, sl1->list[i])) { - sl1->list[i] = sl1->list[--sl1->num_used]; /* swap with the end */ - i--; /* so we process the new i'th element */ - } -} - -/** Remove every element E of sl1 such that smartlist_contains(sl2,E). - * Does not preserve the order of sl1. - */ -void -smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2) -{ - int i; - for (i=0; i < sl2->num_used; i++) - smartlist_remove(sl1, sl2->list[i]); -} - -/** Remove the idxth element of sl; if idx is not the last - * element, swap the last element of sl into the idxth space. - */ -void -smartlist_del(smartlist_t *sl, int idx) -{ - tor_assert(sl); - tor_assert(idx>=0); - tor_assert(idx < sl->num_used); - sl->list[idx] = sl->list[--sl->num_used]; -} - -/** Remove the idxth element of sl; if idx is not the last element, - * moving all subsequent elements back one space. Return the old value - * of the idxth element. - */ -void -smartlist_del_keeporder(smartlist_t *sl, int idx) -{ - tor_assert(sl); - tor_assert(idx>=0); - tor_assert(idx < sl->num_used); - --sl->num_used; - if (idx < sl->num_used) - memmove(sl->list+idx, sl->list+idx+1, sizeof(void*)*(sl->num_used-idx)); -} - -/** Insert the value val as the new idxth element of - * sl, moving all items previously at idx or later - * forward one space. - */ -void -smartlist_insert(smartlist_t *sl, int idx, void *val) -{ - tor_assert(sl); - tor_assert(idx>=0); - tor_assert(idx <= sl->num_used); - if (idx == sl->num_used) { - smartlist_add(sl, val); - } else { - smartlist_ensure_capacity(sl, sl->num_used+1); - /* Move other elements away */ - if (idx < sl->num_used) - memmove(sl->list + idx + 1, sl->list + idx, - sizeof(void*)*(sl->num_used-idx)); - sl->num_used++; - sl->list[idx] = val; - } -} - -/** - * Split a string str along all occurrences of sep, - * appending the (newly allocated) split strings, in order, to - * sl. Return the number of strings added to sl. - * - * If flags&SPLIT_SKIP_SPACE is true, remove initial and - * trailing space from each entry. - * If flags&SPLIT_IGNORE_BLANK is true, remove any entries - * of length 0. - * If flags&SPLIT_STRIP_SPACE is true, strip spaces from each - * split string. - * - * If max\>0, divide the string into no more than max pieces. If - * sep is NULL, split on any sequence of horizontal space. - */ -int -smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, - int flags, int max) -{ - const char *cp, *end, *next; - int n = 0; - - tor_assert(sl); - tor_assert(str); - - cp = str; - while (1) { - if (flags&SPLIT_SKIP_SPACE) { - while (TOR_ISSPACE(*cp)) ++cp; - } - - if (max>0 && n == max-1) { - end = strchr(cp,'\0'); - } else if (sep) { - end = strstr(cp,sep); - if (!end) - end = strchr(cp,'\0'); - } else { - for (end = cp; *end && *end != '\t' && *end != ' '; ++end) - ; - } - - tor_assert(end); - - if (!*end) { - next = NULL; - } else if (sep) { - next = end+strlen(sep); - } else { - next = end+1; - while (*next == '\t' || *next == ' ') - ++next; - } - - if (flags&SPLIT_SKIP_SPACE) { - while (end > cp && TOR_ISSPACE(*(end-1))) - --end; - } - if (end != cp || !(flags&SPLIT_IGNORE_BLANK)) { - char *string = tor_strndup(cp, end-cp); - if (flags&SPLIT_STRIP_SPACE) - tor_strstrip(string, " "); - smartlist_add(sl, string); - ++n; - } - if (!next) - break; - cp = next; - } - - return n; -} - -/** Allocate and return a new string containing the concatenation of - * the elements of sl, in order, separated by join. If - * terminate is true, also terminate the string with join. - * If len_out is not NULL, set len_out to the length of - * the returned string. Requires that every element of sl is - * NUL-terminated string. - */ -char * -smartlist_join_strings(smartlist_t *sl, const char *join, - int terminate, size_t *len_out) -{ - return smartlist_join_strings2(sl,join,strlen(join),terminate,len_out); -} - -/** As smartlist_join_strings, but instead of separating/terminated with a - * NUL-terminated string join, uses the join_len-byte sequence - * at join. (Useful for generating a sequence of NUL-terminated - * strings.) - */ -char * -smartlist_join_strings2(smartlist_t *sl, const char *join, - size_t join_len, int terminate, size_t *len_out) -{ - int i; - size_t n = 0; - char *r = NULL, *dst, *src; - - tor_assert(sl); - tor_assert(join); - - if (terminate) - n = join_len; - - for (i = 0; i < sl->num_used; ++i) { - n += strlen(sl->list[i]); - if (i+1 < sl->num_used) /* avoid double-counting the last one */ - n += join_len; - } - dst = r = tor_malloc(n+1); - for (i = 0; i < sl->num_used; ) { - for (src = sl->list[i]; *src; ) - *dst++ = *src++; - if (++i < sl->num_used) { - memcpy(dst, join, join_len); - dst += join_len; - } - } - if (terminate) { - memcpy(dst, join, join_len); - dst += join_len; - } - *dst = '\0'; - - if (len_out) - *len_out = dst-r; - return r; -} - -/** Sort the members of sl into an order defined by - * the ordering function compare, which returns less then 0 if a - * precedes b, greater than 0 if b precedes a, and 0 if a 'equals' b. - */ -void -smartlist_sort(smartlist_t *sl, int (*compare)(const void **a, const void **b)) -{ - if (!sl->num_used) - return; - qsort(sl->list, sl->num_used, sizeof(void*), - (int (*)(const void *,const void*))compare); -} - -/** Given a smartlist sl sorted with the function compare, - * return the most frequent member in the list. Break ties in favor of - * later elements. If the list is empty, return NULL. - */ -void * -smartlist_get_most_frequent(const smartlist_t *sl, - int (*compare)(const void **a, const void **b)) -{ - const void *most_frequent = NULL; - int most_frequent_count = 0; - - const void *cur = NULL; - int i, count=0; - - if (!sl->num_used) - return NULL; - for (i = 0; i < sl->num_used; ++i) { - const void *item = sl->list[i]; - if (cur && 0 == compare(&cur, &item)) { - ++count; - } else { - if (cur && count >= most_frequent_count) { - most_frequent = cur; - most_frequent_count = count; - } - cur = item; - count = 1; - } - } - if (cur && count >= most_frequent_count) { - most_frequent = cur; - most_frequent_count = count; - } - return (void*)most_frequent; -} - -/** Given a sorted smartlist sl and the comparison function used to - * sort it, remove all duplicate members. If free_fn is provided, calls - * free_fn on each duplicate. Otherwise, just removes them. Preserves order. - */ -void -smartlist_uniq(smartlist_t *sl, - int (*compare)(const void **a, const void **b), - void (*free_fn)(void *a)) -{ - int i; - for (i=1; i < sl->num_used; ++i) { - if (compare((const void **)&(sl->list[i-1]), - (const void **)&(sl->list[i])) == 0) { - if (free_fn) - free_fn(sl->list[i]); - smartlist_del_keeporder(sl, i--); - } - } -} - -/** Assuming the members of sl are in order, return a pointer to the - * member that matches key. Ordering and matching are defined by a - * compare function that returns 0 on a match; less than 0 if key is - * less than member, and greater than 0 if key is greater then member. - */ -void * -smartlist_bsearch(smartlist_t *sl, const void *key, - int (*compare)(const void *key, const void **member)) -{ - int found, idx; - idx = smartlist_bsearch_idx(sl, key, compare, &found); - return found ? smartlist_get(sl, idx) : NULL; -} - -/** Assuming the members of sl are in order, return the index of the - * member that matches key. If no member matches, return the index of - * the first member greater than key, or smartlist_len(sl) if no member - * is greater than key. Set found_out to true on a match, to - * false otherwise. Ordering and matching are defined by a compare - * function that returns 0 on a match; less than 0 if key is less than member, - * and greater than 0 if key is greater then member. - */ -int -smartlist_bsearch_idx(const smartlist_t *sl, const void *key, - int (*compare)(const void *key, const void **member), - int *found_out) -{ - int hi, lo, cmp, mid, len, diff; - - tor_assert(sl); - tor_assert(compare); - tor_assert(found_out); - - len = smartlist_len(sl); - - /* Check for the trivial case of a zero-length list */ - if (len == 0) { - *found_out = 0; - /* We already know smartlist_len(sl) is 0 in this case */ - return 0; - } - - /* Okay, we have a real search to do */ - tor_assert(len > 0); - lo = 0; - hi = len - 1; - - /* - * These invariants are always true: - * - * For all i such that 0 <= i < lo, sl[i] < key - * For all i such that hi < i <= len, sl[i] > key - */ - - while (lo <= hi) { - diff = hi - lo; - /* - * We want mid = (lo + hi) / 2, but that could lead to overflow, so - * instead diff = hi - lo (non-negative because of loop condition), and - * then hi = lo + diff, mid = (lo + lo + diff) / 2 = lo + (diff / 2). - */ - mid = lo + (diff / 2); - cmp = compare(key, (const void**) &(sl->list[mid])); - if (cmp == 0) { - /* sl[mid] == key; we found it */ - *found_out = 1; - return mid; - } else if (cmp > 0) { - /* - * key > sl[mid] and an index i such that sl[i] == key must - * have i > mid if it exists. - */ - - /* - * Since lo <= mid <= hi, hi can only decrease on each iteration (by - * being set to mid - 1) and hi is initially len - 1, mid < len should - * always hold, and this is not symmetric with the left end of list - * mid > 0 test below. A key greater than the right end of the list - * should eventually lead to lo == hi == mid == len - 1, and then - * we set lo to len below and fall out to the same exit we hit for - * a key in the middle of the list but not matching. Thus, we just - * assert for consistency here rather than handle a mid == len case. - */ - tor_assert(mid < len); - /* Move lo to the element immediately after sl[mid] */ - lo = mid + 1; - } else { - /* This should always be true in this case */ - tor_assert(cmp < 0); - - /* - * key < sl[mid] and an index i such that sl[i] == key must - * have i < mid if it exists. - */ - - if (mid > 0) { - /* Normal case, move hi to the element immediately before sl[mid] */ - hi = mid - 1; - } else { - /* These should always be true in this case */ - tor_assert(mid == lo); - tor_assert(mid == 0); - /* - * We were at the beginning of the list and concluded that every - * element e compares e > key. - */ - *found_out = 0; - return 0; - } - } - } - - /* - * lo > hi; we have no element matching key but we have elements falling - * on both sides of it. The lo index points to the first element > key. - */ - tor_assert(lo == hi + 1); /* All other cases should have been handled */ - tor_assert(lo >= 0); - tor_assert(lo <= len); - tor_assert(hi >= 0); - tor_assert(hi <= len); - - if (lo < len) { - cmp = compare(key, (const void **) &(sl->list[lo])); - tor_assert(cmp < 0); - } else { - cmp = compare(key, (const void **) &(sl->list[len-1])); - tor_assert(cmp > 0); - } - - *found_out = 0; - return lo; -} - -/** Helper: compare two const char **s. */ -static int -compare_string_ptrs_(const void **_a, const void **_b) -{ - return strcmp((const char*)*_a, (const char*)*_b); -} - -/** Sort a smartlist sl containing strings into lexically ascending - * order. */ -void -smartlist_sort_strings(smartlist_t *sl) -{ - smartlist_sort(sl, compare_string_ptrs_); -} - -/** Return the most frequent string in the sorted list sl */ -char * -smartlist_get_most_frequent_string(smartlist_t *sl) -{ - return smartlist_get_most_frequent(sl, compare_string_ptrs_); -} - -/** Remove duplicate strings from a sorted list, and free them with tor_free(). - */ -void -smartlist_uniq_strings(smartlist_t *sl) -{ - smartlist_uniq(sl, compare_string_ptrs_, tor_free_); -} - -/* Heap-based priority queue implementation for O(lg N) insert and remove. - * Recall that the heap property is that, for every index I, h[I] < - * H[LEFT_CHILD[I]] and h[I] < H[RIGHT_CHILD[I]]. - * - * For us to remove items other than the topmost item, each item must store - * its own index within the heap. When calling the pqueue functions, tell - * them about the offset of the field that stores the index within the item. - * - * Example: - * - * typedef struct timer_t { - * struct timeval tv; - * int heap_index; - * } timer_t; - * - * static int compare(const void *p1, const void *p2) { - * const timer_t *t1 = p1, *t2 = p2; - * if (t1->tv.tv_sec < t2->tv.tv_sec) { - * return -1; - * } else if (t1->tv.tv_sec > t2->tv.tv_sec) { - * return 1; - * } else { - * return t1->tv.tv_usec - t2->tv_usec; - * } - * } - * - * void timer_heap_insert(smartlist_t *heap, timer_t *timer) { - * smartlist_pqueue_add(heap, compare, STRUCT_OFFSET(timer_t, heap_index), - * timer); - * } - * - * void timer_heap_pop(smartlist_t *heap) { - * return smartlist_pqueue_pop(heap, compare, - * STRUCT_OFFSET(timer_t, heap_index)); - * } - */ - -/** @{ */ -/** Functions to manipulate heap indices to find a node's parent and children. - * - * For a 1-indexed array, we would use LEFT_CHILD[x] = 2*x and RIGHT_CHILD[x] - * = 2*x + 1. But this is C, so we have to adjust a little. */ -//#define LEFT_CHILD(i) ( ((i)+1)*2 - 1) -//#define RIGHT_CHILD(i) ( ((i)+1)*2 ) -//#define PARENT(i) ( ((i)+1)/2 - 1) -#define LEFT_CHILD(i) ( 2*(i) + 1 ) -#define RIGHT_CHILD(i) ( 2*(i) + 2 ) -#define PARENT(i) ( ((i)-1) / 2 ) -/** }@ */ - -/** @{ */ -/** Helper macros for heaps: Given a local variable idx_field_offset - * set to the offset of an integer index within the heap element structure, - * IDX_OF_ITEM(p) gives you the index of p, and IDXP(p) gives you a pointer to - * where p's index is stored. Given additionally a local smartlist sl, - * UPDATE_IDX(i) sets the index of the element at i to the correct - * value (that is, to i). - */ -#define IDXP(p) ((int*)STRUCT_VAR_P(p, idx_field_offset)) - -#define UPDATE_IDX(i) do { \ - void *updated = sl->list[i]; \ - *IDXP(updated) = i; \ - } while (0) - -#define IDX_OF_ITEM(p) (*IDXP(p)) -/** @} */ - -/** Helper. sl may have at most one violation of the heap property: - * the item at idx may be greater than one or both of its children. - * Restore the heap property. */ -static INLINE void -smartlist_heapify(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset, - int idx) -{ - while (1) { - int left_idx = LEFT_CHILD(idx); - int best_idx; - - if (left_idx >= sl->num_used) - return; - if (compare(sl->list[idx],sl->list[left_idx]) < 0) - best_idx = idx; - else - best_idx = left_idx; - if (left_idx+1 < sl->num_used && - compare(sl->list[left_idx+1],sl->list[best_idx]) < 0) - best_idx = left_idx + 1; - - if (best_idx == idx) { - return; - } else { - void *tmp = sl->list[idx]; - sl->list[idx] = sl->list[best_idx]; - sl->list[best_idx] = tmp; - UPDATE_IDX(idx); - UPDATE_IDX(best_idx); - - idx = best_idx; - } - } -} - -/** Insert item into the heap stored in sl, where order is - * determined by compare and the offset of the item in the heap is - * stored in an int-typed field at position idx_field_offset within - * item. - */ -void -smartlist_pqueue_add(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset, - void *item) -{ - int idx; - smartlist_add(sl,item); - UPDATE_IDX(sl->num_used-1); - - for (idx = sl->num_used - 1; idx; ) { - int parent = PARENT(idx); - if (compare(sl->list[idx], sl->list[parent]) < 0) { - void *tmp = sl->list[parent]; - sl->list[parent] = sl->list[idx]; - sl->list[idx] = tmp; - UPDATE_IDX(parent); - UPDATE_IDX(idx); - idx = parent; - } else { - return; - } - } -} - -/** Remove and return the top-priority item from the heap stored in sl, - * where order is determined by compare and the item's position is - * stored at position idx_field_offset within the item. sl must - * not be empty. */ -void * -smartlist_pqueue_pop(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset) -{ - void *top; - tor_assert(sl->num_used); - - top = sl->list[0]; - *IDXP(top)=-1; - if (--sl->num_used) { - sl->list[0] = sl->list[sl->num_used]; - UPDATE_IDX(0); - smartlist_heapify(sl, compare, idx_field_offset, 0); - } - return top; -} - -/** Remove the item item from the heap stored in sl, - * where order is determined by compare and the item's position is - * stored at position idx_field_offset within the item. sl must - * not be empty. */ -void -smartlist_pqueue_remove(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset, - void *item) -{ - int idx = IDX_OF_ITEM(item); - tor_assert(idx >= 0); - tor_assert(sl->list[idx] == item); - --sl->num_used; - *IDXP(item) = -1; - if (idx == sl->num_used) { - return; - } else { - sl->list[idx] = sl->list[sl->num_used]; - UPDATE_IDX(idx); - smartlist_heapify(sl, compare, idx_field_offset, idx); - } -} - -/** Assert that the heap property is correctly maintained by the heap stored - * in sl, where order is determined by compare. */ -void -smartlist_pqueue_assert_ok(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset) -{ - int i; - for (i = sl->num_used - 1; i >= 0; --i) { - if (i>0) - tor_assert(compare(sl->list[PARENT(i)], sl->list[i]) <= 0); - tor_assert(IDX_OF_ITEM(sl->list[i]) == i); - } -} - -/** Helper: compare two DIGEST_LEN digests. */ -static int -compare_digests_(const void **_a, const void **_b) -{ - return tor_memcmp((const char*)*_a, (const char*)*_b, DIGEST_LEN); -} - -/** Sort the list of DIGEST_LEN-byte digests into ascending order. */ -void -smartlist_sort_digests(smartlist_t *sl) -{ - smartlist_sort(sl, compare_digests_); -} - -/** Remove duplicate digests from a sorted list, and free them with tor_free(). - */ -void -smartlist_uniq_digests(smartlist_t *sl) -{ - smartlist_uniq(sl, compare_digests_, tor_free_); -} - -/** Helper: compare two DIGEST256_LEN digests. */ -static int -compare_digests256_(const void **_a, const void **_b) -{ - return tor_memcmp((const char*)*_a, (const char*)*_b, DIGEST256_LEN); -} - -/** Sort the list of DIGEST256_LEN-byte digests into ascending order. */ -void -smartlist_sort_digests256(smartlist_t *sl) -{ - smartlist_sort(sl, compare_digests256_); -} - -/** Return the most frequent member of the sorted list of DIGEST256_LEN - * digests in sl */ -char * -smartlist_get_most_frequent_digest256(smartlist_t *sl) -{ - return smartlist_get_most_frequent(sl, compare_digests256_); -} - -/** Remove duplicate 256-bit digests from a sorted list, and free them with - * tor_free(). - */ -void -smartlist_uniq_digests256(smartlist_t *sl) -{ - smartlist_uniq(sl, compare_digests256_, tor_free_); -} - -/** Helper: Declare an entry type and a map type to implement a mapping using - * ht.h. The map type will be called maptype. The key part of each - * entry is declared using the C declaration keydecl. All functions - * and types associated with the map get prefixed with prefix */ -#define DEFINE_MAP_STRUCTS(maptype, keydecl, prefix) \ - typedef struct prefix ## entry_t { \ - HT_ENTRY(prefix ## entry_t) node; \ - void *val; \ - keydecl; \ - } prefix ## entry_t; \ - struct maptype { \ - HT_HEAD(prefix ## impl, prefix ## entry_t) head; \ - } - -DEFINE_MAP_STRUCTS(strmap_t, char *key, strmap_); -DEFINE_MAP_STRUCTS(digestmap_t, char key[DIGEST_LEN], digestmap_); - -/** Helper: compare strmap_entry_t objects by key value. */ -static INLINE int -strmap_entries_eq(const strmap_entry_t *a, const strmap_entry_t *b) -{ - return !strcmp(a->key, b->key); -} - -/** Helper: return a hash value for a strmap_entry_t. */ -static INLINE unsigned int -strmap_entry_hash(const strmap_entry_t *a) -{ - return ht_string_hash(a->key); -} - -/** Helper: compare digestmap_entry_t objects by key value. */ -static INLINE int -digestmap_entries_eq(const digestmap_entry_t *a, const digestmap_entry_t *b) -{ - return tor_memeq(a->key, b->key, DIGEST_LEN); -} - -/** Helper: return a hash value for a digest_map_t. */ -static INLINE unsigned int -digestmap_entry_hash(const digestmap_entry_t *a) -{ -#if SIZEOF_INT != 8 - const uint32_t *p = (const uint32_t*)a->key; - return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; -#else - const uint64_t *p = (const uint64_t*)a->key; - return p[0] ^ p[1]; -#endif -} - -HT_PROTOTYPE(strmap_impl, strmap_entry_t, node, strmap_entry_hash, - strmap_entries_eq) -HT_GENERATE(strmap_impl, strmap_entry_t, node, strmap_entry_hash, - strmap_entries_eq, 0.6, malloc, realloc, free) - -HT_PROTOTYPE(digestmap_impl, digestmap_entry_t, node, digestmap_entry_hash, - digestmap_entries_eq) -HT_GENERATE(digestmap_impl, digestmap_entry_t, node, digestmap_entry_hash, - digestmap_entries_eq, 0.6, malloc, realloc, free) - -/** Constructor to create a new empty map from strings to void*'s. - */ -strmap_t * -strmap_new(void) -{ - strmap_t *result; - result = tor_malloc(sizeof(strmap_t)); - HT_INIT(strmap_impl, &result->head); - return result; -} - -/** Constructor to create a new empty map from digests to void*'s. - */ -digestmap_t * -digestmap_new(void) -{ - digestmap_t *result; - result = tor_malloc(sizeof(digestmap_t)); - HT_INIT(digestmap_impl, &result->head); - return result; -} - -/** Set the current value for key to val. Returns the previous - * value for key if one was set, or NULL if one was not. - * - * This function makes a copy of key if necessary, but not of - * val. - */ -void * -strmap_set(strmap_t *map, const char *key, void *val) -{ - strmap_entry_t *resolve; - strmap_entry_t search; - void *oldval; - tor_assert(map); - tor_assert(key); - tor_assert(val); - search.key = (char*)key; - resolve = HT_FIND(strmap_impl, &map->head, &search); - if (resolve) { - oldval = resolve->val; - resolve->val = val; - return oldval; - } else { - resolve = tor_malloc_zero(sizeof(strmap_entry_t)); - resolve->key = tor_strdup(key); - resolve->val = val; - tor_assert(!HT_FIND(strmap_impl, &map->head, resolve)); - HT_INSERT(strmap_impl, &map->head, resolve); - return NULL; - } -} - -#define OPTIMIZED_DIGESTMAP_SET - -/** Like strmap_set() above but for digestmaps. */ -void * -digestmap_set(digestmap_t *map, const char *key, void *val) -{ -#ifndef OPTIMIZED_DIGESTMAP_SET - digestmap_entry_t *resolve; -#endif - digestmap_entry_t search; - void *oldval; - tor_assert(map); - tor_assert(key); - tor_assert(val); - memcpy(&search.key, key, DIGEST_LEN); -#ifndef OPTIMIZED_DIGESTMAP_SET - resolve = HT_FIND(digestmap_impl, &map->head, &search); - if (resolve) { - oldval = resolve->val; - resolve->val = val; - return oldval; - } else { - resolve = tor_malloc_zero(sizeof(digestmap_entry_t)); - memcpy(resolve->key, key, DIGEST_LEN); - resolve->val = val; - HT_INSERT(digestmap_impl, &map->head, resolve); - return NULL; - } -#else - /* We spend up to 5% of our time in this function, so the code below is - * meant to optimize the check/alloc/set cycle by avoiding the two trips to - * the hash table that we do in the unoptimized code above. (Each of - * HT_INSERT and HT_FIND calls HT_SET_HASH and HT_FIND_P.) - */ - HT_FIND_OR_INSERT_(digestmap_impl, node, digestmap_entry_hash, &(map->head), - digestmap_entry_t, &search, ptr, - { - /* we found an entry. */ - oldval = (*ptr)->val; - (*ptr)->val = val; - return oldval; - }, - { - /* We didn't find the entry. */ - digestmap_entry_t *newent = - tor_malloc_zero(sizeof(digestmap_entry_t)); - memcpy(newent->key, key, DIGEST_LEN); - newent->val = val; - HT_FOI_INSERT_(node, &(map->head), &search, newent, ptr); - return NULL; - }); -#endif -} - -/** Return the current value associated with key, or NULL if no - * value is set. - */ -void * -strmap_get(const strmap_t *map, const char *key) -{ - strmap_entry_t *resolve; - strmap_entry_t search; - tor_assert(map); - tor_assert(key); - search.key = (char*)key; - resolve = HT_FIND(strmap_impl, &map->head, &search); - if (resolve) { - return resolve->val; - } else { - return NULL; - } -} - -/** Like strmap_get() above but for digestmaps. */ -void * -digestmap_get(const digestmap_t *map, const char *key) -{ - digestmap_entry_t *resolve; - digestmap_entry_t search; - tor_assert(map); - tor_assert(key); - memcpy(&search.key, key, DIGEST_LEN); - resolve = HT_FIND(digestmap_impl, &map->head, &search); - if (resolve) { - return resolve->val; - } else { - return NULL; - } -} - -/** Remove the value currently associated with key from the map. - * Return the value if one was set, or NULL if there was no entry for - * key. - * - * Note: you must free any storage associated with the returned value. - */ -void * -strmap_remove(strmap_t *map, const char *key) -{ - strmap_entry_t *resolve; - strmap_entry_t search; - void *oldval; - tor_assert(map); - tor_assert(key); - search.key = (char*)key; - resolve = HT_REMOVE(strmap_impl, &map->head, &search); - if (resolve) { - oldval = resolve->val; - tor_free(resolve->key); - tor_free(resolve); - return oldval; - } else { - return NULL; - } -} - -/** Like strmap_remove() above but for digestmaps. */ -void * -digestmap_remove(digestmap_t *map, const char *key) -{ - digestmap_entry_t *resolve; - digestmap_entry_t search; - void *oldval; - tor_assert(map); - tor_assert(key); - memcpy(&search.key, key, DIGEST_LEN); - resolve = HT_REMOVE(digestmap_impl, &map->head, &search); - if (resolve) { - oldval = resolve->val; - tor_free(resolve); - return oldval; - } else { - return NULL; - } -} - -/** Same as strmap_set, but first converts key to lowercase. */ -void * -strmap_set_lc(strmap_t *map, const char *key, void *val) -{ - /* We could be a little faster by using strcasecmp instead, and a separate - * type, but I don't think it matters. */ - void *v; - char *lc_key = tor_strdup(key); - tor_strlower(lc_key); - v = strmap_set(map,lc_key,val); - tor_free(lc_key); - return v; -} - -/** Same as strmap_get, but first converts key to lowercase. */ -void * -strmap_get_lc(const strmap_t *map, const char *key) -{ - void *v; - char *lc_key = tor_strdup(key); - tor_strlower(lc_key); - v = strmap_get(map,lc_key); - tor_free(lc_key); - return v; -} - -/** Same as strmap_remove, but first converts key to lowercase */ -void * -strmap_remove_lc(strmap_t *map, const char *key) -{ - void *v; - char *lc_key = tor_strdup(key); - tor_strlower(lc_key); - v = strmap_remove(map,lc_key); - tor_free(lc_key); - return v; -} - -/** return an iterator pointer to the front of a map. - * - * Iterator example: - * - * \code - * // uppercase values in "map", removing empty values. - * - * strmap_iter_t *iter; - * const char *key; - * void *val; - * char *cp; - * - * for (iter = strmap_iter_init(map); !strmap_iter_done(iter); ) { - * strmap_iter_get(iter, &key, &val); - * cp = (char*)val; - * if (!*cp) { - * iter = strmap_iter_next_rmv(map,iter); - * free(val); - * } else { - * for (;*cp;cp++) *cp = TOR_TOUPPER(*cp); - * iter = strmap_iter_next(map,iter); - * } - * } - * \endcode - * - */ -strmap_iter_t * -strmap_iter_init(strmap_t *map) -{ - tor_assert(map); - return HT_START(strmap_impl, &map->head); -} - -/** Start iterating through map. See strmap_iter_init() for example. */ -digestmap_iter_t * -digestmap_iter_init(digestmap_t *map) -{ - tor_assert(map); - return HT_START(digestmap_impl, &map->head); -} - -/** Advance the iterator iter for map a single step to the next - * entry, and return its new value. */ -strmap_iter_t * -strmap_iter_next(strmap_t *map, strmap_iter_t *iter) -{ - tor_assert(map); - tor_assert(iter); - return HT_NEXT(strmap_impl, &map->head, iter); -} - -/** Advance the iterator iter for map a single step to the next entry, - * and return its new value. */ -digestmap_iter_t * -digestmap_iter_next(digestmap_t *map, digestmap_iter_t *iter) -{ - tor_assert(map); - tor_assert(iter); - return HT_NEXT(digestmap_impl, &map->head, iter); -} - -/** Advance the iterator iter a single step to the next entry, removing - * the current entry, and return its new value. - */ -strmap_iter_t * -strmap_iter_next_rmv(strmap_t *map, strmap_iter_t *iter) -{ - strmap_entry_t *rmv; - tor_assert(map); - tor_assert(iter); - tor_assert(*iter); - rmv = *iter; - iter = HT_NEXT_RMV(strmap_impl, &map->head, iter); - tor_free(rmv->key); - tor_free(rmv); - return iter; -} - -/** Advance the iterator iter a single step to the next entry, removing - * the current entry, and return its new value. - */ -digestmap_iter_t * -digestmap_iter_next_rmv(digestmap_t *map, digestmap_iter_t *iter) -{ - digestmap_entry_t *rmv; - tor_assert(map); - tor_assert(iter); - tor_assert(*iter); - rmv = *iter; - iter = HT_NEXT_RMV(digestmap_impl, &map->head, iter); - tor_free(rmv); - return iter; -} - -/** Set *keyp and *valp to the current entry pointed to by - * iter. */ -void -strmap_iter_get(strmap_iter_t *iter, const char **keyp, void **valp) -{ - tor_assert(iter); - tor_assert(*iter); - tor_assert(keyp); - tor_assert(valp); - *keyp = (*iter)->key; - *valp = (*iter)->val; -} - -/** Set *keyp and *valp to the current entry pointed to by - * iter. */ -void -digestmap_iter_get(digestmap_iter_t *iter, const char **keyp, void **valp) -{ - tor_assert(iter); - tor_assert(*iter); - tor_assert(keyp); - tor_assert(valp); - *keyp = (*iter)->key; - *valp = (*iter)->val; -} - -/** Return true iff iter has advanced past the last entry of - * map. */ -int -strmap_iter_done(strmap_iter_t *iter) -{ - return iter == NULL; -} - -/** Return true iff iter has advanced past the last entry of - * map. */ -int -digestmap_iter_done(digestmap_iter_t *iter) -{ - return iter == NULL; -} - -/** Remove all entries from map, and deallocate storage for those - * entries. If free_val is provided, it is invoked on every value in - * map. - */ -void -strmap_free(strmap_t *map, void (*free_val)(void*)) -{ - strmap_entry_t **ent, **next, *this; - if (!map) - return; - - for (ent = HT_START(strmap_impl, &map->head); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(strmap_impl, &map->head, ent); - tor_free(this->key); - if (free_val) - free_val(this->val); - tor_free(this); - } - tor_assert(HT_EMPTY(&map->head)); - HT_CLEAR(strmap_impl, &map->head); - tor_free(map); -} - -/** Remove all entries from map, and deallocate storage for those - * entries. If free_val is provided, it is invoked on every value in - * map. - */ -void -digestmap_free(digestmap_t *map, void (*free_val)(void*)) -{ - digestmap_entry_t **ent, **next, *this; - if (!map) - return; - for (ent = HT_START(digestmap_impl, &map->head); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(digestmap_impl, &map->head, ent); - if (free_val) - free_val(this->val); - tor_free(this); - } - tor_assert(HT_EMPTY(&map->head)); - HT_CLEAR(digestmap_impl, &map->head); - tor_free(map); -} - -/** Fail with an assertion error if anything has gone wrong with the internal - * representation of map. */ -void -strmap_assert_ok(const strmap_t *map) -{ - tor_assert(!strmap_impl_HT_REP_IS_BAD_(&map->head)); -} -/** Fail with an assertion error if anything has gone wrong with the internal - * representation of map. */ -void -digestmap_assert_ok(const digestmap_t *map) -{ - tor_assert(!digestmap_impl_HT_REP_IS_BAD_(&map->head)); -} - -/** Return true iff map has no entries. */ -int -strmap_isempty(const strmap_t *map) -{ - return HT_EMPTY(&map->head); -} - -/** Return true iff map has no entries. */ -int -digestmap_isempty(const digestmap_t *map) -{ - return HT_EMPTY(&map->head); -} - -/** Return the number of items in map. */ -int -strmap_size(const strmap_t *map) -{ - return HT_SIZE(&map->head); -} - -/** Return the number of items in map. */ -int -digestmap_size(const digestmap_t *map) -{ - return HT_SIZE(&map->head); -} - -/** Declare a function called funcname that acts as a find_nth_FOO - * function for an array of type elt_t*. - * - * NOTE: The implementation kind of sucks: It's O(n log n), whereas finding - * the kth element of an n-element list can be done in O(n). Then again, this - * implementation is not in critical path, and it is obviously correct. */ -#define IMPLEMENT_ORDER_FUNC(funcname, elt_t) \ - static int \ - _cmp_ ## elt_t(const void *_a, const void *_b) \ - { \ - const elt_t *a = _a, *b = _b; \ - if (*a<*b) \ - return -1; \ - else if (*a>*b) \ - return 1; \ - else \ - return 0; \ - } \ - elt_t \ - funcname(elt_t *array, int n_elements, int nth) \ - { \ - tor_assert(nth >= 0); \ - tor_assert(nth < n_elements); \ - qsort(array, n_elements, sizeof(elt_t), _cmp_ ##elt_t); \ - return array[nth]; \ - } - -IMPLEMENT_ORDER_FUNC(find_nth_int, int) -IMPLEMENT_ORDER_FUNC(find_nth_time, time_t) -IMPLEMENT_ORDER_FUNC(find_nth_double, double) -IMPLEMENT_ORDER_FUNC(find_nth_uint32, uint32_t) -IMPLEMENT_ORDER_FUNC(find_nth_int32, int32_t) -IMPLEMENT_ORDER_FUNC(find_nth_long, long) - -/** Return a newly allocated digestset_t, optimized to hold a total of - * max_elements digests with a reasonably low false positive weight. */ -digestset_t * -digestset_new(int max_elements) -{ - /* The probability of false positives is about P=(1 - exp(-kn/m))^k, where k - * is the number of hash functions per entry, m is the bits in the array, - * and n is the number of elements inserted. For us, k==4, n<=max_elements, - * and m==n_bits= approximately max_elements*32. This gives - * P<(1-exp(-4*n/(32*n)))^4 == (1-exp(1/-8))^4 == .00019 - * - * It would be more optimal in space vs false positives to get this false - * positive rate by going for k==13, and m==18.5n, but we also want to - * conserve CPU, and k==13 is pretty big. - */ - int n_bits = 1u << (tor_log2(max_elements)+5); - digestset_t *r = tor_malloc(sizeof(digestset_t)); - r->mask = n_bits - 1; - r->ba = bitarray_init_zero(n_bits); - return r; -} - -/** Free all storage held in set. */ -void -digestset_free(digestset_t *set) -{ - if (!set) - return; - bitarray_free(set->ba); - tor_free(set); -} - diff --git a/src/tor/container.h b/src/tor/container.h deleted file mode 100644 index 9b92aaa33..000000000 --- a/src/tor/container.h +++ /dev/null @@ -1,681 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CONTAINER_H -#define TOR_CONTAINER_H - -#include "tor_util.h" - -/** A resizeable list of pointers, with associated helpful functionality. - * - * The members of this struct are exposed only so that macros and inlines can - * use them; all access to smartlist internals should go through the functions - * and macros defined here. - **/ -typedef struct smartlist_t { - /** @{ */ - /** list has enough capacity to store exactly capacity elements - * before it needs to be resized. Only the first num_used (\<= - * capacity) elements point to valid data. - */ - void **list; - int num_used; - int capacity; - /** @} */ -} smartlist_t; - -smartlist_t *smartlist_new(void); -void smartlist_free(smartlist_t *sl); -void smartlist_clear(smartlist_t *sl); -void smartlist_add(smartlist_t *sl, void *element); -void smartlist_add_all(smartlist_t *sl, const smartlist_t *s2); -void smartlist_remove(smartlist_t *sl, const void *element); -void *smartlist_pop_last(smartlist_t *sl); -void smartlist_reverse(smartlist_t *sl); -void smartlist_string_remove(smartlist_t *sl, const char *element); -int smartlist_contains(const smartlist_t *sl, const void *element); -int smartlist_contains_string(const smartlist_t *sl, const char *element); -int smartlist_string_pos(const smartlist_t *, const char *elt); -int smartlist_contains_string_case(const smartlist_t *sl, const char *element); -int smartlist_contains_int_as_string(const smartlist_t *sl, int num); -int smartlist_strings_eq(const smartlist_t *sl1, const smartlist_t *sl2); -int smartlist_contains_digest(const smartlist_t *sl, const char *element); -int smartlist_ints_eq(const smartlist_t *sl1, const smartlist_t *sl2); -int smartlist_overlap(const smartlist_t *sl1, const smartlist_t *sl2); -void smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2); -void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2); - -/* smartlist_choose() is defined in crypto.[ch] */ -#ifdef DEBUG_SMARTLIST -/** Return the number of items in sl. - */ -static INLINE int smartlist_len(const smartlist_t *sl); -static INLINE int smartlist_len(const smartlist_t *sl) { - tor_assert(sl); - return (sl)->num_used; -} -/** Return the idxth element of sl. - */ -static INLINE void *smartlist_get(const smartlist_t *sl, int idx); -static INLINE void *smartlist_get(const smartlist_t *sl, int idx) { - tor_assert(sl); - tor_assert(idx>=0); - tor_assert(sl->num_used > idx); - return sl->list[idx]; -} -static INLINE void smartlist_set(smartlist_t *sl, int idx, void *val) { - tor_assert(sl); - tor_assert(idx>=0); - tor_assert(sl->num_used > idx); - sl->list[idx] = val; -} -#else -#define smartlist_len(sl) ((sl)->num_used) -#define smartlist_get(sl, idx) ((sl)->list[idx]) -#define smartlist_set(sl, idx, val) ((sl)->list[idx] = (val)) -#endif - -/** Exchange the elements at indices idx1 and idx2 of the - * smartlist sl. */ -static INLINE void smartlist_swap(smartlist_t *sl, int idx1, int idx2) -{ - if (idx1 != idx2) { - void *elt = smartlist_get(sl, idx1); - smartlist_set(sl, idx1, smartlist_get(sl, idx2)); - smartlist_set(sl, idx2, elt); - } -} - -void smartlist_del(smartlist_t *sl, int idx); -void smartlist_del_keeporder(smartlist_t *sl, int idx); -void smartlist_insert(smartlist_t *sl, int idx, void *val); -void smartlist_sort(smartlist_t *sl, - int (*compare)(const void **a, const void **b)); -void *smartlist_get_most_frequent(const smartlist_t *sl, - int (*compare)(const void **a, const void **b)); -void smartlist_uniq(smartlist_t *sl, - int (*compare)(const void **a, const void **b), - void (*free_fn)(void *elt)); - -void smartlist_sort_strings(smartlist_t *sl); -void smartlist_sort_digests(smartlist_t *sl); -void smartlist_sort_digests256(smartlist_t *sl); - -char *smartlist_get_most_frequent_string(smartlist_t *sl); -char *smartlist_get_most_frequent_digest256(smartlist_t *sl); - -void smartlist_uniq_strings(smartlist_t *sl); -void smartlist_uniq_digests(smartlist_t *sl); -void smartlist_uniq_digests256(smartlist_t *sl); -void *smartlist_bsearch(smartlist_t *sl, const void *key, - int (*compare)(const void *key, const void **member)); -int smartlist_bsearch_idx(const smartlist_t *sl, const void *key, - int (*compare)(const void *key, const void **member), - int *found_out); - -void smartlist_pqueue_add(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset, - void *item); -void *smartlist_pqueue_pop(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset); -void smartlist_pqueue_remove(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset, - void *item); -void smartlist_pqueue_assert_ok(smartlist_t *sl, - int (*compare)(const void *a, const void *b), - int idx_field_offset); - -#define SPLIT_SKIP_SPACE 0x01 -#define SPLIT_IGNORE_BLANK 0x02 -#define SPLIT_STRIP_SPACE 0x04 -int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, - int flags, int max); -char *smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, - size_t *len_out) ATTR_MALLOC; -char *smartlist_join_strings2(smartlist_t *sl, const char *join, - size_t join_len, int terminate, size_t *len_out) - ATTR_MALLOC; - -/** Iterate over the items in a smartlist sl, in order. For each item, - * assign it to a new local variable of type type named var, and - * execute the statements inside the loop body. Inside the loop, the loop - * index can be accessed as var_sl_idx and the length of the list can - * be accessed as var_sl_len. - * - * NOTE: Do not change the length of the list while the loop is in progress, - * unless you adjust the _sl_len variable correspondingly. See second example - * below. - * - * Example use: - *
    - *   smartlist_t *list = smartlist_split("A:B:C", ":", 0, 0);
    - *   SMARTLIST_FOREACH_BEGIN(list, char *, cp) {
    - *     printf("%d: %s\n", cp_sl_idx, cp);
    - *     tor_free(cp);
    - *   } SMARTLIST_FOREACH_END(cp);
    - *   smartlist_free(list);
    - * 
    - * - * Example use (advanced): - *
    - *   SMARTLIST_FOREACH_BEGIN(list, char *, cp) {
    - *     if (!strcmp(cp, "junk")) {
    - *       tor_free(cp);
    - *       SMARTLIST_DEL_CURRENT(list, cp);
    - *     }
    - *   } SMARTLIST_FOREACH_END(cp);
    - * 
    - */ -/* Note: these macros use token pasting, and reach into smartlist internals. - * This can make them a little daunting. Here's the approximate unpacking of - * the above examples, for entertainment value: - * - *
    - * smartlist_t *list = smartlist_split("A:B:C", ":", 0, 0);
    - * {
    - *   int cp_sl_idx, cp_sl_len = smartlist_len(list);
    - *   char *cp;
    - *   for (cp_sl_idx = 0; cp_sl_idx < cp_sl_len; ++cp_sl_idx) {
    - *     cp = smartlist_get(list, cp_sl_idx);
    - *     printf("%d: %s\n", cp_sl_idx, cp);
    - *     tor_free(cp);
    - *   }
    - * }
    - * smartlist_free(list);
    - * 
    - * - *
    - * {
    - *   int cp_sl_idx, cp_sl_len = smartlist_len(list);
    - *   char *cp;
    - *   for (cp_sl_idx = 0; cp_sl_idx < cp_sl_len; ++cp_sl_idx) {
    - *     cp = smartlist_get(list, cp_sl_idx);
    - *     if (!strcmp(cp, "junk")) {
    - *       tor_free(cp);
    - *       smartlist_del(list, cp_sl_idx);
    - *       --cp_sl_idx;
    - *       --cp_sl_len;
    - *     }
    - *   }
    - * }
    - * 
    - */ -#define SMARTLIST_FOREACH_BEGIN(sl, type, var) \ - STMT_BEGIN \ - int var ## _sl_idx, var ## _sl_len=(sl)->num_used; \ - type var; \ - for (var ## _sl_idx = 0; var ## _sl_idx < var ## _sl_len; \ - ++var ## _sl_idx) { \ - var = (sl)->list[var ## _sl_idx]; - -#define SMARTLIST_FOREACH_END(var) \ - var = NULL; \ - } STMT_END - -/** - * An alias for SMARTLIST_FOREACH_BEGIN and SMARTLIST_FOREACH_END, using - * cmd as the loop body. This wrapper is here for convenience with - * very short loops. - * - * By convention, we do not use this for loops which nest, or for loops over - * 10 lines or so. Use SMARTLIST_FOREACH_{BEGIN,END} for those. - */ -#define SMARTLIST_FOREACH(sl, type, var, cmd) \ - SMARTLIST_FOREACH_BEGIN(sl,type,var) { \ - cmd; \ - } SMARTLIST_FOREACH_END(var) - -/** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed - * with the variable var, remove the current element in a way that - * won't confuse the loop. */ -#define SMARTLIST_DEL_CURRENT(sl, var) \ - STMT_BEGIN \ - smartlist_del(sl, var ## _sl_idx); \ - --var ## _sl_idx; \ - --var ## _sl_len; \ - STMT_END - -/** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed - * with the variable var, replace the current element with val. - * Does not deallocate the current value of var. - */ -#define SMARTLIST_REPLACE_CURRENT(sl, var, val) \ - STMT_BEGIN \ - smartlist_set(sl, var ## _sl_idx, val); \ - STMT_END - -/* Helper: Given two lists of items, possibly of different types, such that - * both lists are sorted on some common field (as determined by a comparison - * expression cmpexpr), and such that one list (sl1) has no - * duplicates on the common field, loop through the lists in lockstep, and - * execute unmatched_var2 on items in var2 that do not appear in - * var1. - * - * WARNING: It isn't safe to add remove elements from either list while the - * loop is in progress. - * - * Example use: - * SMARTLIST_FOREACH_JOIN(routerstatus_list, routerstatus_t *, rs, - * routerinfo_list, routerinfo_t *, ri, - * tor_memcmp(rs->identity_digest, ri->identity_digest, 20), - * log_info(LD_GENERAL,"No match for %s", ri->nickname)) { - * log_info(LD_GENERAL, "%s matches routerstatus %p", ri->nickname, rs); - * } SMARTLIST_FOREACH_JOIN_END(rs, ri); - **/ -/* The example above unpacks (approximately) to: - * int rs_sl_idx = 0, rs_sl_len = smartlist_len(routerstatus_list); - * int ri_sl_idx, ri_sl_len = smartlist_len(routerinfo_list); - * int rs_ri_cmp; - * routerstatus_t *rs; - * routerinfo_t *ri; - * for (; ri_sl_idx < ri_sl_len; ++ri_sl_idx) { - * ri = smartlist_get(routerinfo_list, ri_sl_idx); - * while (rs_sl_idx < rs_sl_len) { - * rs = smartlist_get(routerstatus_list, rs_sl_idx); - * rs_ri_cmp = tor_memcmp(rs->identity_digest, ri->identity_digest, 20); - * if (rs_ri_cmp > 0) { - * break; - * } else if (rs_ri_cmp == 0) { - * goto matched_ri; - * } else { - * ++rs_sl_idx; - * } - * } - * log_info(LD_GENERAL,"No match for %s", ri->nickname); - * continue; - * matched_ri: { - * log_info(LD_GENERAL,"%s matches with routerstatus %p",ri->nickname,rs); - * } - * } - */ -#define SMARTLIST_FOREACH_JOIN(sl1, type1, var1, sl2, type2, var2, \ - cmpexpr, unmatched_var2) \ - STMT_BEGIN \ - int var1 ## _sl_idx = 0, var1 ## _sl_len=(sl1)->num_used; \ - int var2 ## _sl_idx = 0, var2 ## _sl_len=(sl2)->num_used; \ - int var1 ## _ ## var2 ## _cmp; \ - type1 var1; \ - type2 var2; \ - for (; var2##_sl_idx < var2##_sl_len; ++var2##_sl_idx) { \ - var2 = (sl2)->list[var2##_sl_idx]; \ - while (var1##_sl_idx < var1##_sl_len) { \ - var1 = (sl1)->list[var1##_sl_idx]; \ - var1##_##var2##_cmp = (cmpexpr); \ - if (var1##_##var2##_cmp > 0) { \ - break; \ - } else if (var1##_##var2##_cmp == 0) { \ - goto matched_##var2; \ - } else { \ - ++var1##_sl_idx; \ - } \ - } \ - /* Ran out of v1, or no match for var2. */ \ - unmatched_var2; \ - continue; \ - matched_##var2: ; \ - -#define SMARTLIST_FOREACH_JOIN_END(var1, var2) \ - } \ - STMT_END - -#define DECLARE_MAP_FNS(maptype, keytype, prefix) \ - typedef struct maptype maptype; \ - typedef struct prefix##entry_t *prefix##iter_t; \ - maptype* prefix##new(void); \ - void* prefix##set(maptype *map, keytype key, void *val); \ - void* prefix##get(const maptype *map, keytype key); \ - void* prefix##remove(maptype *map, keytype key); \ - void prefix##free(maptype *map, void (*free_val)(void*)); \ - int prefix##isempty(const maptype *map); \ - int prefix##size(const maptype *map); \ - prefix##iter_t *prefix##iter_init(maptype *map); \ - prefix##iter_t *prefix##iter_next(maptype *map, prefix##iter_t *iter); \ - prefix##iter_t *prefix##iter_next_rmv(maptype *map, prefix##iter_t *iter); \ - void prefix##iter_get(prefix##iter_t *iter, keytype *keyp, void **valp); \ - int prefix##iter_done(prefix##iter_t *iter); \ - void prefix##assert_ok(const maptype *map) - -/* Map from const char * to void *. Implemented with a hash table. */ -DECLARE_MAP_FNS(strmap_t, const char *, strmap_); -/* Map from const char[DIGEST_LEN] to void *. Implemented with a hash table. */ -DECLARE_MAP_FNS(digestmap_t, const char *, digestmap_); - -#undef DECLARE_MAP_FNS - -/** Iterates over the key-value pairs in a map map in order. - * prefix is as for DECLARE_MAP_FNS (i.e., strmap_ or digestmap_). - * The map's keys and values are of type keytype and valtype respectively; - * each iteration assigns them to keyvar and valvar. - * - * Example use: - * MAP_FOREACH(digestmap_, m, const char *, k, routerinfo_t *, r) { - * // use k and r - * } MAP_FOREACH_END. - */ -/* Unpacks to, approximately: - * { - * digestmap_iter_t *k_iter; - * for (k_iter = digestmap_iter_init(m); !digestmap_iter_done(k_iter); - * k_iter = digestmap_iter_next(m, k_iter)) { - * const char *k; - * void *r_voidp; - * routerinfo_t *r; - * digestmap_iter_get(k_iter, &k, &r_voidp); - * r = r_voidp; - * // use k and r - * } - * } - */ -#define MAP_FOREACH(prefix, map, keytype, keyvar, valtype, valvar) \ - STMT_BEGIN \ - prefix##iter_t *keyvar##_iter; \ - for (keyvar##_iter = prefix##iter_init(map); \ - !prefix##iter_done(keyvar##_iter); \ - keyvar##_iter = prefix##iter_next(map, keyvar##_iter)) { \ - keytype keyvar; \ - void *valvar##_voidp; \ - valtype valvar; \ - prefix##iter_get(keyvar##_iter, &keyvar, &valvar##_voidp); \ - valvar = valvar##_voidp; - -/** As MAP_FOREACH, except allows members to be removed from the map - * during the iteration via MAP_DEL_CURRENT. Example use: - * - * Example use: - * MAP_FOREACH(digestmap_, m, const char *, k, routerinfo_t *, r) { - * if (is_very_old(r)) - * MAP_DEL_CURRENT(k); - * } MAP_FOREACH_END. - **/ -/* Unpacks to, approximately: - * { - * digestmap_iter_t *k_iter; - * int k_del=0; - * for (k_iter = digestmap_iter_init(m); !digestmap_iter_done(k_iter); - * k_iter = k_del ? digestmap_iter_next(m, k_iter) - * : digestmap_iter_next_rmv(m, k_iter)) { - * const char *k; - * void *r_voidp; - * routerinfo_t *r; - * k_del=0; - * digestmap_iter_get(k_iter, &k, &r_voidp); - * r = r_voidp; - * if (is_very_old(r)) { - * k_del = 1; - * } - * } - * } - */ -#define MAP_FOREACH_MODIFY(prefix, map, keytype, keyvar, valtype, valvar) \ - STMT_BEGIN \ - prefix##iter_t *keyvar##_iter; \ - int keyvar##_del=0; \ - for (keyvar##_iter = prefix##iter_init(map); \ - !prefix##iter_done(keyvar##_iter); \ - keyvar##_iter = keyvar##_del ? \ - prefix##iter_next_rmv(map, keyvar##_iter) : \ - prefix##iter_next(map, keyvar##_iter)) { \ - keytype keyvar; \ - void *valvar##_voidp; \ - valtype valvar; \ - keyvar##_del=0; \ - prefix##iter_get(keyvar##_iter, &keyvar, &valvar##_voidp); \ - valvar = valvar##_voidp; - -/** Used with MAP_FOREACH_MODIFY to remove the currently-iterated-upon - * member of the map. */ -#define MAP_DEL_CURRENT(keyvar) \ - STMT_BEGIN \ - keyvar##_del = 1; \ - STMT_END - -/** Used to end a MAP_FOREACH() block. */ -#define MAP_FOREACH_END } STMT_END ; - -/** As MAP_FOREACH, but does not require declaration of prefix or keytype. - * Example use: - * DIGESTMAP_FOREACH(m, k, routerinfo_t *, r) { - * // use k and r - * } DIGESTMAP_FOREACH_END. - */ -#define DIGESTMAP_FOREACH(map, keyvar, valtype, valvar) \ - MAP_FOREACH(digestmap_, map, const char *, keyvar, valtype, valvar) - -/** As MAP_FOREACH_MODIFY, but does not require declaration of prefix or - * keytype. - * Example use: - * DIGESTMAP_FOREACH_MODIFY(m, k, routerinfo_t *, r) { - * if (is_very_old(r)) - * MAP_DEL_CURRENT(k); - * } DIGESTMAP_FOREACH_END. - */ -#define DIGESTMAP_FOREACH_MODIFY(map, keyvar, valtype, valvar) \ - MAP_FOREACH_MODIFY(digestmap_, map, const char *, keyvar, valtype, valvar) -/** Used to end a DIGESTMAP_FOREACH() block. */ -#define DIGESTMAP_FOREACH_END MAP_FOREACH_END - -#define STRMAP_FOREACH(map, keyvar, valtype, valvar) \ - MAP_FOREACH(strmap_, map, const char *, keyvar, valtype, valvar) -#define STRMAP_FOREACH_MODIFY(map, keyvar, valtype, valvar) \ - MAP_FOREACH_MODIFY(strmap_, map, const char *, keyvar, valtype, valvar) -#define STRMAP_FOREACH_END MAP_FOREACH_END - -void* strmap_set_lc(strmap_t *map, const char *key, void *val); -void* strmap_get_lc(const strmap_t *map, const char *key); -void* strmap_remove_lc(strmap_t *map, const char *key); - -#define DECLARE_TYPED_DIGESTMAP_FNS(prefix, maptype, valtype) \ - typedef struct maptype maptype; \ - typedef struct prefix##iter_t prefix##iter_t; \ - static INLINE maptype* prefix##new(void) \ - { \ - return (maptype*)digestmap_new(); \ - } \ - static INLINE digestmap_t* prefix##to_digestmap(maptype *map) \ - { \ - return (digestmap_t*)map; \ - } \ - static INLINE valtype* prefix##get(maptype *map, const char *key) \ - { \ - return (valtype*)digestmap_get((digestmap_t*)map, key); \ - } \ - static INLINE valtype* prefix##set(maptype *map, const char *key, \ - valtype *val) \ - { \ - return (valtype*)digestmap_set((digestmap_t*)map, key, val); \ - } \ - static INLINE valtype* prefix##remove(maptype *map, const char *key) \ - { \ - return (valtype*)digestmap_remove((digestmap_t*)map, key); \ - } \ - static INLINE void prefix##free(maptype *map, void (*free_val)(void*)) \ - { \ - digestmap_free((digestmap_t*)map, free_val); \ - } \ - static INLINE int prefix##isempty(maptype *map) \ - { \ - return digestmap_isempty((digestmap_t*)map); \ - } \ - static INLINE int prefix##size(maptype *map) \ - { \ - return digestmap_size((digestmap_t*)map); \ - } \ - static INLINE prefix##iter_t *prefix##iter_init(maptype *map) \ - { \ - return (prefix##iter_t*) digestmap_iter_init((digestmap_t*)map); \ - } \ - static INLINE prefix##iter_t *prefix##iter_next(maptype *map, \ - prefix##iter_t *iter) \ - { \ - return (prefix##iter_t*) digestmap_iter_next( \ - (digestmap_t*)map, (digestmap_iter_t*)iter); \ - } \ - static INLINE prefix##iter_t *prefix##iter_next_rmv(maptype *map, \ - prefix##iter_t *iter) \ - { \ - return (prefix##iter_t*) digestmap_iter_next_rmv( \ - (digestmap_t*)map, (digestmap_iter_t*)iter); \ - } \ - static INLINE void prefix##iter_get(prefix##iter_t *iter, \ - const char **keyp, \ - valtype **valp) \ - { \ - void *v; \ - digestmap_iter_get((digestmap_iter_t*) iter, keyp, &v); \ - *valp = v; \ - } \ - static INLINE int prefix##iter_done(prefix##iter_t *iter) \ - { \ - return digestmap_iter_done((digestmap_iter_t*)iter); \ - } - -#if SIZEOF_INT == 4 -#define BITARRAY_SHIFT 5 -#elif SIZEOF_INT == 8 -#define BITARRAY_SHIFT 6 -#else -#error "int is neither 4 nor 8 bytes. I can't deal with that." -#endif -#define BITARRAY_MASK ((1u<n_bits
    bits. */ -static INLINE bitarray_t * -bitarray_init_zero(unsigned int n_bits) -{ - /* round up to the next int. */ - size_t sz = (n_bits+BITARRAY_MASK) >> BITARRAY_SHIFT; - return tor_malloc_zero(sz*sizeof(unsigned int)); -} -/** Expand ba from holding n_bits_old to n_bits_new, - * clearing all new bits. Returns a possibly changed pointer to the - * bitarray. */ -static INLINE bitarray_t * -bitarray_expand(bitarray_t *ba, - unsigned int n_bits_old, unsigned int n_bits_new) -{ - size_t sz_old = (n_bits_old+BITARRAY_MASK) >> BITARRAY_SHIFT; - size_t sz_new = (n_bits_new+BITARRAY_MASK) >> BITARRAY_SHIFT; - char *ptr; - if (sz_new <= sz_old) - return ba; - ptr = tor_realloc(ba, sz_new*sizeof(unsigned int)); - /* This memset does nothing to the older excess bytes. But they were - * already set to 0 by bitarry_init_zero. */ - memset(ptr+sz_old*sizeof(unsigned int), 0, - (sz_new-sz_old)*sizeof(unsigned int)); - return (bitarray_t*) ptr; -} -/** Free the bit array ba. */ -static INLINE void -bitarray_free(bitarray_t *ba) -{ - tor_free(ba); -} -/** Set the bitth bit in b to 1. */ -static INLINE void -bitarray_set(bitarray_t *b, int bit) -{ - b[bit >> BITARRAY_SHIFT] |= (1u << (bit & BITARRAY_MASK)); -} -/** Set the bitth bit in b to 0. */ -static INLINE void -bitarray_clear(bitarray_t *b, int bit) -{ - b[bit >> BITARRAY_SHIFT] &= ~ (1u << (bit & BITARRAY_MASK)); -} -/** Return true iff bitth bit in b is nonzero. NOTE: does - * not necessarily return 1 on true. */ -static INLINE unsigned int -bitarray_is_set(bitarray_t *b, int bit) -{ - return b[bit >> BITARRAY_SHIFT] & (1u << (bit & BITARRAY_MASK)); -} - -/** A set of digests, implemented as a Bloom filter. */ -typedef struct { - int mask; /**< One less than the number of bits in ba; always one less - * than a power of two. */ - bitarray_t *ba; /**< A bit array to implement the Bloom filter. */ -} digestset_t; - -#define BIT(n) ((n) & set->mask) -/** Add the digest digest to set. */ -static INLINE void -digestset_add(digestset_t *set, const char *digest) -{ - const uint32_t *p = (const uint32_t *)digest; - const uint32_t d1 = p[0] + (p[1]>>16); - const uint32_t d2 = p[1] + (p[2]>>16); - const uint32_t d3 = p[2] + (p[3]>>16); - const uint32_t d4 = p[3] + (p[0]>>16); - bitarray_set(set->ba, BIT(d1)); - bitarray_set(set->ba, BIT(d2)); - bitarray_set(set->ba, BIT(d3)); - bitarray_set(set->ba, BIT(d4)); -} - -/** If digest is in set, return nonzero. Otherwise, - * probably return zero. */ -static INLINE int -digestset_contains(const digestset_t *set, const char *digest) -{ - const uint32_t *p = (const uint32_t *)digest; - const uint32_t d1 = p[0] + (p[1]>>16); - const uint32_t d2 = p[1] + (p[2]>>16); - const uint32_t d3 = p[2] + (p[3]>>16); - const uint32_t d4 = p[3] + (p[0]>>16); - return bitarray_is_set(set->ba, BIT(d1)) && - bitarray_is_set(set->ba, BIT(d2)) && - bitarray_is_set(set->ba, BIT(d3)) && - bitarray_is_set(set->ba, BIT(d4)); -} -#undef BIT - -digestset_t *digestset_new(int max_elements); -void digestset_free(digestset_t* set); - -/* These functions, given an array of n_elements, return the - * nth lowest element. nth=0 gives the lowest element; - * n_elements-1 gives the highest; and (n_elements-1) / 2 gives - * the median. As a side effect, the elements of array are sorted. */ -int find_nth_int(int *array, int n_elements, int nth); -time_t find_nth_time(time_t *array, int n_elements, int nth); -double find_nth_double(double *array, int n_elements, int nth); -int32_t find_nth_int32(int32_t *array, int n_elements, int nth); -uint32_t find_nth_uint32(uint32_t *array, int n_elements, int nth); -long find_nth_long(long *array, int n_elements, int nth); -static INLINE int -median_int(int *array, int n_elements) -{ - return find_nth_int(array, n_elements, (n_elements-1)/2); -} -static INLINE time_t -median_time(time_t *array, int n_elements) -{ - return find_nth_time(array, n_elements, (n_elements-1)/2); -} -static INLINE double -median_double(double *array, int n_elements) -{ - return find_nth_double(array, n_elements, (n_elements-1)/2); -} -static INLINE uint32_t -median_uint32(uint32_t *array, int n_elements) -{ - return find_nth_uint32(array, n_elements, (n_elements-1)/2); -} -static INLINE int32_t -median_int32(int32_t *array, int n_elements) -{ - return find_nth_int32(array, n_elements, (n_elements-1)/2); -} - -#endif - diff --git a/src/tor/control.c b/src/tor/control.c deleted file mode 100644 index cba8a6907..000000000 --- a/src/tor/control.c +++ /dev/null @@ -1,5110 +0,0 @@ -/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file control.c - * \brief Implementation for Tor's control-socket interface. - * See doc/spec/control-spec.txt for full details on protocol. - **/ - -#define CONTROL_PRIVATE - -#include "or.h" -#include "addressmap.h" -#include "buffers.h" -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuitstats.h" -#include "circuituse.h" -#include "command.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "directory.h" -#include "dirserv.h" -#include "dnsserv.h" -#include "entrynodes.h" -#include "geoip.h" -#include "hibernate.h" -#include "onion_main.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "reasons.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" - -#ifndef _WIN32 -#include -#include -#endif - -#include "procmon.h" - -/** Yield true iff s is the state of a control_connection_t that has - * finished authentication and is accepting commands. */ -#define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN) - -/** Bitfield: The bit 1<<e is set if any open control - * connection is interested in events of type e. We use this - * so that we can decide to skip generating event messages that nobody - * has interest in without having to walk over the global connection - * list to find out. - **/ -typedef uint64_t event_mask_t; - -/** An event mask of all the events that any controller is interested in - * receiving. */ -static event_mask_t global_event_mask = 0; - -/** True iff we have disabled log messages from being sent to the controller */ -static int disable_log_messages = 0; - -/** Macro: true if any control connection is interested in events of type - * e. */ -#define EVENT_IS_INTERESTING(e) \ - (!! (global_event_mask & (((uint64_t)1)<<(e)))) - -/** If we're using cookie-type authentication, how long should our cookies be? - */ -#define AUTHENTICATION_COOKIE_LEN 32 - -/** If true, we've set authentication_cookie to a secret code and - * stored it to disk. */ -static int authentication_cookie_is_set = 0; -/** If authentication_cookie_is_set, a secret cookie that we've stored to disk - * and which we're using to authenticate controllers. (If the controller can - * read it off disk, it has permission to connect.) */ -static uint8_t *authentication_cookie = NULL; - -#define SAFECOOKIE_SERVER_TO_CONTROLLER_CONSTANT \ - "Tor safe cookie authentication server-to-controller hash" -#define SAFECOOKIE_CONTROLLER_TO_SERVER_CONSTANT \ - "Tor safe cookie authentication controller-to-server hash" -#define SAFECOOKIE_SERVER_NONCE_LEN DIGEST256_LEN - -/** A sufficiently large size to record the last bootstrap phase string. */ -#define BOOTSTRAP_MSG_LEN 1024 - -/** What was the last bootstrap phase message we sent? We keep track - * of this so we can respond to getinfo status/bootstrap-phase queries. */ -static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN]; - -static void connection_printf_to_buf(control_connection_t *conn, - const char *format, ...) - CHECK_PRINTF(2,3); -static void send_control_event_impl(uint16_t event, event_format_t which, - const char *format, va_list ap) - CHECK_PRINTF(3,0); -static int control_event_status(int type, int severity, const char *format, - va_list args) - CHECK_PRINTF(3,0); - -static void send_control_done(control_connection_t *conn); -static void send_control_event(uint16_t event, event_format_t which, - const char *format, ...) - CHECK_PRINTF(3,4); -static int handle_control_setconf(control_connection_t *conn, uint32_t len, - char *body); -static int handle_control_resetconf(control_connection_t *conn, uint32_t len, - char *body); -static int handle_control_getconf(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_loadconf(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_setevents(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_authenticate(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_signal(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_mapaddress(control_connection_t *conn, uint32_t len, - const char *body); -static char *list_getinfo_options(void); -static int handle_control_getinfo(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_extendcircuit(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_setcircuitpurpose(control_connection_t *conn, - uint32_t len, const char *body); -static int handle_control_attachstream(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_postdescriptor(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_redirectstream(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_closestream(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_closecircuit(control_connection_t *conn, - uint32_t len, - const char *body); -static int handle_control_resolve(control_connection_t *conn, uint32_t len, - const char *body); -static int handle_control_usefeature(control_connection_t *conn, - uint32_t len, - const char *body); -static int write_stream_target_to_buf(entry_connection_t *conn, char *buf, - size_t len); -static void orconn_target_get_name(char *buf, size_t len, - or_connection_t *conn); -static char *get_cookie_file(void); - -/** Given a control event code for a message event, return the corresponding - * log severity. */ -static INLINE int -event_to_log_severity(int event) -{ - switch (event) { - case EVENT_DEBUG_MSG: return LOG_DEBUG; - case EVENT_INFO_MSG: return LOG_INFO; - case EVENT_NOTICE_MSG: return LOG_NOTICE; - case EVENT_WARN_MSG: return LOG_WARN; - case EVENT_ERR_MSG: return LOG_ERR; - default: return -1; - } -} - -/** Given a log severity, return the corresponding control event code. */ -static INLINE int -log_severity_to_event(int severity) -{ - switch (severity) { - case LOG_DEBUG: return EVENT_DEBUG_MSG; - case LOG_INFO: return EVENT_INFO_MSG; - case LOG_NOTICE: return EVENT_NOTICE_MSG; - case LOG_WARN: return EVENT_WARN_MSG; - case LOG_ERR: return EVENT_ERR_MSG; - default: return -1; - } -} - -/** Helper: clear bandwidth counters of all origin circuits. */ -static void -clear_circ_bw_fields(void) -{ - circuit_t *circ; - origin_circuit_t *ocirc; - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (!CIRCUIT_IS_ORIGIN(circ)) - continue; - ocirc = TO_ORIGIN_CIRCUIT(circ); - ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0; - } -} - -/** Set global_event_mask* to the bitwise OR of each live control - * connection's event_mask field. */ -void -control_update_global_event_mask(void) -{ - smartlist_t *conns = get_connection_array(); - event_mask_t old_mask, new_mask; - old_mask = global_event_mask; - - global_event_mask = 0; - SMARTLIST_FOREACH(conns, connection_t *, _conn, - { - if (_conn->type == CONN_TYPE_CONTROL && - STATE_IS_OPEN(_conn->state)) { - control_connection_t *conn = TO_CONTROL_CONN(_conn); - global_event_mask |= conn->event_mask; - } - }); - - new_mask = global_event_mask; - - /* Handle the aftermath. Set up the log callback to tell us only what - * we want to hear...*/ - control_adjust_event_log_severity(); - - /* ...then, if we've started logging stream or circ bw, clear the - * appropriate fields. */ - if (! (old_mask & EVENT_STREAM_BANDWIDTH_USED) && - (new_mask & EVENT_STREAM_BANDWIDTH_USED)) { - SMARTLIST_FOREACH(conns, connection_t *, conn, - { - if (conn->type == CONN_TYPE_AP) { - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - edge_conn->n_written = edge_conn->n_read = 0; - } - }); - } - if (! (old_mask & EVENT_CIRC_BANDWIDTH_USED) && - (new_mask & EVENT_CIRC_BANDWIDTH_USED)) { - clear_circ_bw_fields(); - } -} - -/** Adjust the log severities that result in control_event_logmsg being called - * to match the severity of log messages that any controllers are interested - * in. */ -void -control_adjust_event_log_severity(void) -{ - int i; - int min_log_event=EVENT_ERR_MSG, max_log_event=EVENT_DEBUG_MSG; - - for (i = EVENT_DEBUG_MSG; i <= EVENT_ERR_MSG; ++i) { - if (EVENT_IS_INTERESTING(i)) { - min_log_event = i; - break; - } - } - for (i = EVENT_ERR_MSG; i >= EVENT_DEBUG_MSG; --i) { - if (EVENT_IS_INTERESTING(i)) { - max_log_event = i; - break; - } - } - if (EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL)) { - if (min_log_event > EVENT_NOTICE_MSG) - min_log_event = EVENT_NOTICE_MSG; - if (max_log_event < EVENT_ERR_MSG) - max_log_event = EVENT_ERR_MSG; - } - if (min_log_event <= max_log_event) - change_callback_log_severity(event_to_log_severity(min_log_event), - event_to_log_severity(max_log_event), - control_event_logmsg); - else - change_callback_log_severity(LOG_ERR, LOG_ERR, - control_event_logmsg); -} - -/** Return true iff the event with code c is being sent to any current - * control connection. This is useful if the amount of work needed to prepare - * to call the appropriate control_event_...() function is high. - */ -int -control_event_is_interesting(int event) -{ - return EVENT_IS_INTERESTING(event); -} - -/** Append a NUL-terminated string s to the end of - * conn-\>outbuf. - */ -static INLINE void -connection_write_str_to_buf(const char *s, control_connection_t *conn) -{ - size_t len = strlen(s); - connection_write_to_buf(s, len, TO_CONN(conn)); -} - -/** Given a len-character string in data, made of lines - * terminated by CRLF, allocate a new string in *out, and copy the - * contents of data into *out, adding a period before any period - * that appears at the start of a line, and adding a period-CRLF line at - * the end. Replace all LF characters sequences with CRLF. Return the number - * of bytes in *out. - */ -STATIC size_t -write_escaped_data(const char *data, size_t len, char **out) -{ - size_t sz_out = len+8; - char *outp; - const char *start = data, *end; - int i; - int start_of_line; - for (i=0; i<(int)len; ++i) { - if (data[i]== '\n') - sz_out += 2; /* Maybe add a CR; maybe add a dot. */ - } - *out = outp = tor_malloc(sz_out+1); - end = data+len; - start_of_line = 1; - while (data < end) { - if (*data == '\n') { - if (data > start && data[-1] != '\r') - *outp++ = '\r'; - start_of_line = 1; - } else if (*data == '.') { - if (start_of_line) { - start_of_line = 0; - *outp++ = '.'; - } - } else { - start_of_line = 0; - } - *outp++ = *data++; - } - if (outp < *out+2 || fast_memcmp(outp-2, "\r\n", 2)) { - *outp++ = '\r'; - *outp++ = '\n'; - } - *outp++ = '.'; - *outp++ = '\r'; - *outp++ = '\n'; - *outp = '\0'; /* NUL-terminate just in case. */ - tor_assert((outp - *out) <= (int)sz_out); - return outp - *out; -} - -/** Given a len-character string in data, made of lines - * terminated by CRLF, allocate a new string in *out, and copy - * the contents of data into *out, removing any period - * that appears at the start of a line, and replacing all CRLF sequences - * with LF. Return the number of - * bytes in *out. */ -STATIC size_t -read_escaped_data(const char *data, size_t len, char **out) -{ - char *outp; - const char *next; - const char *end; - - *out = outp = tor_malloc(len+1); - - end = data+len; - - while (data < end) { - /* we're at the start of a line. */ - if (*data == '.') - ++data; - next = memchr(data, '\n', end-data); - if (next) { - size_t n_to_copy = next-data; - /* Don't copy a CR that precedes this LF. */ - if (n_to_copy && *(next-1) == '\r') - --n_to_copy; - memcpy(outp, data, n_to_copy); - outp += n_to_copy; - data = next+1; /* This will point at the start of the next line, - * or the end of the string, or a period. */ - } else { - memcpy(outp, data, end-data); - outp += (end-data); - *outp = '\0'; - return outp - *out; - } - *outp++ = '\n'; - } - - *outp = '\0'; - return outp - *out; -} - -/** If the first in_len_max characters in start contain a - * double-quoted string with escaped characters, return the length of that - * string (as encoded, including quotes). Otherwise return -1. */ -static INLINE int -get_escaped_string_length(const char *start, size_t in_len_max, - int *chars_out) -{ - const char *cp, *end; - int chars = 0; - - if (*start != '\"') - return -1; - - cp = start+1; - end = start+in_len_max; - - /* Calculate length. */ - while (1) { - if (cp >= end) { - return -1; /* Too long. */ - } else if (*cp == '\\') { - if (++cp == end) - return -1; /* Can't escape EOS. */ - ++cp; - ++chars; - } else if (*cp == '\"') { - break; - } else { - ++cp; - ++chars; - } - } - if (chars_out) - *chars_out = chars; - return (int)(cp - start+1); -} - -/** As decode_escaped_string, but does not decode the string: copies the - * entire thing, including quotation marks. */ -static const char * -extract_escaped_string(const char *start, size_t in_len_max, - char **out, size_t *out_len) -{ - int length = get_escaped_string_length(start, in_len_max, NULL); - if (length<0) - return NULL; - *out_len = length; - *out = tor_strndup(start, *out_len); - return start+length; -} - -/** Given a pointer to a string starting at start containing - * in_len_max characters, decode a string beginning with one double - * quote, containing any number of non-quote characters or characters escaped - * with a backslash, and ending with a final double quote. Place the resulting - * string (unquoted, unescaped) into a newly allocated string in *out; - * store its length in out_len. On success, return a pointer to the - * character immediately following the escaped string. On failure, return - * NULL. */ -static const char * -decode_escaped_string(const char *start, size_t in_len_max, - char **out, size_t *out_len) -{ - const char *cp, *end; - char *outp; - int len, n_chars = 0; - - len = get_escaped_string_length(start, in_len_max, &n_chars); - if (len<0) - return NULL; - - end = start+len-1; /* Index of last quote. */ - tor_assert(*end == '\"'); - outp = *out = tor_malloc(len+1); - *out_len = n_chars; - - cp = start+1; - while (cp < end) { - if (*cp == '\\') - ++cp; - *outp++ = *cp++; - } - *outp = '\0'; - tor_assert((outp - *out) == (int)*out_len); - - return end+1; -} - -/** Acts like sprintf, but writes its formatted string to the end of - * conn-\>outbuf. */ -static void -connection_printf_to_buf(control_connection_t *conn, const char *format, ...) -{ - va_list ap; - char *buf = NULL; - int len; - - va_start(ap,format); - len = tor_vasprintf(&buf, format, ap); - va_end(ap); - - if (len < 0) { - log_err(LD_BUG, "Unable to format string for controller."); - tor_assert(0); - } - - connection_write_to_buf(buf, (size_t)len, TO_CONN(conn)); - - tor_free(buf); -} - -/** Write all of the open control ports to ControlPortWriteToFile */ -void -control_ports_write_to_file(void) -{ - smartlist_t *lines; - char *joined = NULL; - const or_options_t *options = get_options(); - - if (!options->ControlPortWriteToFile) - return; - - lines = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(get_connection_array(), const connection_t *, conn) { - if (conn->type != CONN_TYPE_CONTROL_LISTENER || conn->marked_for_close) - continue; -#ifdef AF_UNIX - if (conn->socket_family == AF_UNIX) { - smartlist_add_asprintf(lines, "UNIX_PORT=%s\n", conn->address); - continue; - } -#endif - smartlist_add_asprintf(lines, "PORT=%s:%d\n", conn->address, conn->port); - } SMARTLIST_FOREACH_END(conn); - - joined = smartlist_join_strings(lines, "", 0, NULL); - - if (write_str_to_file(options->ControlPortWriteToFile, joined, 0) < 0) { - log_warn(LD_CONTROL, "Writing %s failed: %s", - options->ControlPortWriteToFile, strerror(errno)); - } -#ifndef _WIN32 - if (options->ControlPortFileGroupReadable) { - if (chmod(options->ControlPortWriteToFile, 0640)) { - log_warn(LD_FS,"Unable to make %s group-readable.", - options->ControlPortWriteToFile); - } - } -#endif - tor_free(joined); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); -} - -/** Send a "DONE" message down the control connection conn. */ -static void -send_control_done(control_connection_t *conn) -{ - connection_write_str_to_buf("250 OK\r\n", conn); -} - -/** Send an event to all v1 controllers that are listening for code - * event. The event's body is given by msg. - * - * If which & SHORT_NAMES, the event contains short-format names: send - * it to controllers that haven't enabled the VERBOSE_NAMES feature. If - * which & LONG_NAMES, the event contains long-format names: send it - * to controllers that have enabled VERBOSE_NAMES. - * - * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with - * respect to the EXTENDED_EVENTS feature. */ -MOCK_IMPL(STATIC void, -send_control_event_string,(uint16_t event, event_format_t which, - const char *msg)) -{ - smartlist_t *conns = get_connection_array(); - (void)which; - tor_assert(event >= EVENT_MIN_ && event <= EVENT_MAX_); - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->type == CONN_TYPE_CONTROL && - !conn->marked_for_close && - conn->state == CONTROL_CONN_STATE_OPEN) { - control_connection_t *control_conn = TO_CONTROL_CONN(conn); - - if (control_conn->event_mask & (1<event
    . The event's body is created by the printf-style format in - * format, and other arguments as provided. */ -static void -send_control_event_impl(uint16_t event, event_format_t which, - const char *format, va_list ap) -{ - char *buf = NULL; - int len; - - len = tor_vasprintf(&buf, format, ap); - if (len < 0) { - log_warn(LD_BUG, "Unable to format event for controller."); - return; - } - - send_control_event_string(event, which|ALL_FORMATS, buf); - - tor_free(buf); -} - -/** Send an event to all v1 controllers that are listening for code - * event. The event's body is created by the printf-style format in - * format, and other arguments as provided. */ -static void -send_control_event(uint16_t event, event_format_t which, - const char *format, ...) -{ - va_list ap; - va_start(ap, format); - send_control_event_impl(event, which, format, ap); - va_end(ap); -} - -/** Given a text circuit id, return the corresponding circuit. */ -static origin_circuit_t * -get_circ(const char *id) -{ - uint32_t n_id; - int ok; - n_id = (uint32_t) tor_parse_ulong(id, 10, 0, UINT32_MAX, &ok, NULL); - if (!ok) - return NULL; - return circuit_get_by_global_id(n_id); -} - -/** Given a text stream id, return the corresponding AP connection. */ -static entry_connection_t * -get_stream(const char *id) -{ - uint64_t n_id; - int ok; - connection_t *conn; - n_id = tor_parse_uint64(id, 10, 0, UINT64_MAX, &ok, NULL); - if (!ok) - return NULL; - conn = connection_get_by_global_id(n_id); - if (!conn || conn->type != CONN_TYPE_AP || conn->marked_for_close) - return NULL; - return TO_ENTRY_CONN(conn); -} - -/** Helper for setconf and resetconf. Acts like setconf, except - * it passes use_defaults on to options_trial_assign(). Modifies the - * contents of body. - */ -static int -control_setconf_helper(control_connection_t *conn, uint32_t len, char *body, - int use_defaults) -{ - setopt_err_t opt_err; - config_line_t *lines=NULL; - char *start = body; - char *errstring = NULL; - const int clear_first = 1; - - char *config; - smartlist_t *entries = smartlist_new(); - - /* We have a string, "body", of the format '(key(=val|="val")?)' entries - * separated by space. break it into a list of configuration entries. */ - while (*body) { - char *eq = body; - char *key; - char *entry; - while (!TOR_ISSPACE(*eq) && *eq != '=') - ++eq; - key = tor_strndup(body, eq-body); - body = eq+1; - if (*eq == '=') { - char *val=NULL; - size_t val_len=0; - if (*body != '\"') { - char *val_start = body; - while (!TOR_ISSPACE(*body)) - body++; - val = tor_strndup(val_start, body-val_start); - val_len = strlen(val); - } else { - body = (char*)extract_escaped_string(body, (len - (body-start)), - &val, &val_len); - if (!body) { - connection_write_str_to_buf("551 Couldn't parse string\r\n", conn); - SMARTLIST_FOREACH(entries, char *, cp, tor_free(cp)); - smartlist_free(entries); - tor_free(key); - return 0; - } - } - tor_asprintf(&entry, "%s %s", key, val); - tor_free(key); - tor_free(val); - } else { - entry = key; - } - smartlist_add(entries, entry); - while (TOR_ISSPACE(*body)) - ++body; - } - - smartlist_add(entries, tor_strdup("")); - config = smartlist_join_strings(entries, "\n", 0, NULL); - SMARTLIST_FOREACH(entries, char *, cp, tor_free(cp)); - smartlist_free(entries); - - if (config_get_lines(config, &lines, 0) < 0) { - log_warn(LD_CONTROL,"Controller gave us config lines we can't parse."); - connection_write_str_to_buf("551 Couldn't parse configuration\r\n", - conn); - tor_free(config); - return 0; - } - tor_free(config); - - opt_err = options_trial_assign(lines, use_defaults, clear_first, &errstring); - { - const char *msg; - switch (opt_err) { - case SETOPT_ERR_MISC: - msg = "552 Unrecognized option"; - break; - case SETOPT_ERR_PARSE: - msg = "513 Unacceptable option value"; - break; - case SETOPT_ERR_TRANSITION: - msg = "553 Transition not allowed"; - break; - case SETOPT_ERR_SETTING: - default: - msg = "553 Unable to set option"; - break; - case SETOPT_OK: - config_free_lines(lines); - send_control_done(conn); - return 0; - } - log_warn(LD_CONTROL, - "Controller gave us config lines that didn't validate: %s", - errstring); - connection_printf_to_buf(conn, "%s: %s\r\n", msg, errstring); - config_free_lines(lines); - tor_free(errstring); - return 0; - } -} - -/** Called when we receive a SETCONF message: parse the body and try - * to update our configuration. Reply with a DONE or ERROR message. - * Modifies the contents of body.*/ -static int -handle_control_setconf(control_connection_t *conn, uint32_t len, char *body) -{ - return control_setconf_helper(conn, len, body, 0); -} - -/** Called when we receive a RESETCONF message: parse the body and try - * to update our configuration. Reply with a DONE or ERROR message. - * Modifies the contents of body. */ -static int -handle_control_resetconf(control_connection_t *conn, uint32_t len, char *body) -{ - return control_setconf_helper(conn, len, body, 1); -} - -/** Called when we receive a GETCONF message. Parse the request, and - * reply with a CONFVALUE or an ERROR message */ -static int -handle_control_getconf(control_connection_t *conn, uint32_t body_len, - const char *body) -{ - smartlist_t *questions = smartlist_new(); - smartlist_t *answers = smartlist_new(); - smartlist_t *unrecognized = smartlist_new(); - char *msg = NULL; - size_t msg_len; - const or_options_t *options = get_options(); - int i, len; - - (void) body_len; /* body is NUL-terminated; so we can ignore len. */ - smartlist_split_string(questions, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(questions, const char *, q) { - if (!option_is_recognized(q)) { - smartlist_add(unrecognized, (char*) q); - } else { - config_line_t *answer = option_get_assignment(options,q); - if (!answer) { - const char *name = option_get_canonical_name(q); - smartlist_add_asprintf(answers, "250-%s\r\n", name); - } - - while (answer) { - config_line_t *next; - smartlist_add_asprintf(answers, "250-%s=%s\r\n", - answer->key, answer->value); - - next = answer->next; - tor_free(answer->key); - tor_free(answer->value); - tor_free(answer); - answer = next; - } - } - } SMARTLIST_FOREACH_END(q); - - if ((len = smartlist_len(unrecognized))) { - for (i=0; i < len-1; ++i) - connection_printf_to_buf(conn, - "552-Unrecognized configuration key \"%s\"\r\n", - (char*)smartlist_get(unrecognized, i)); - connection_printf_to_buf(conn, - "552 Unrecognized configuration key \"%s\"\r\n", - (char*)smartlist_get(unrecognized, len-1)); - } else if ((len = smartlist_len(answers))) { - char *tmp = smartlist_get(answers, len-1); - tor_assert(strlen(tmp)>4); - tmp[3] = ' '; - msg = smartlist_join_strings(answers, "", 0, &msg_len); - connection_write_to_buf(msg, msg_len, TO_CONN(conn)); - } else { - connection_write_str_to_buf("250 OK\r\n", conn); - } - - SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); - smartlist_free(answers); - SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); - smartlist_free(questions); - smartlist_free(unrecognized); - - tor_free(msg); - - return 0; -} - -/** Called when we get a +LOADCONF message. */ -static int -handle_control_loadconf(control_connection_t *conn, uint32_t len, - const char *body) -{ - setopt_err_t retval; - char *errstring = NULL; - const char *msg = NULL; - (void) len; - - retval = options_init_from_string(NULL, body, CMD_RUN_TOR, NULL, &errstring); - - if (retval != SETOPT_OK) - log_warn(LD_CONTROL, - "Controller gave us config file that didn't validate: %s", - errstring); - - switch (retval) { - case SETOPT_ERR_PARSE: - msg = "552 Invalid config file"; - break; - case SETOPT_ERR_TRANSITION: - msg = "553 Transition not allowed"; - break; - case SETOPT_ERR_SETTING: - msg = "553 Unable to set option"; - break; - case SETOPT_ERR_MISC: - default: - msg = "550 Unable to load config"; - break; - case SETOPT_OK: - break; - } - if (msg) { - if (errstring) - connection_printf_to_buf(conn, "%s: %s\r\n", msg, errstring); - else - connection_printf_to_buf(conn, "%s\r\n", msg); - } else { - send_control_done(conn); - } - tor_free(errstring); - return 0; -} - -/** Helper structure: maps event values to their names. */ -struct control_event_t { - uint16_t event_code; - const char *event_name; -}; -/** Table mapping event values to their names. Used to implement SETEVENTS - * and GETINFO events/names, and to keep they in sync. */ -static const struct control_event_t control_event_table[] = { - { EVENT_CIRCUIT_STATUS, "CIRC" }, - { EVENT_CIRCUIT_STATUS_MINOR, "CIRC_MINOR" }, - { EVENT_STREAM_STATUS, "STREAM" }, - { EVENT_OR_CONN_STATUS, "ORCONN" }, - { EVENT_BANDWIDTH_USED, "BW" }, - { EVENT_DEBUG_MSG, "DEBUG" }, - { EVENT_INFO_MSG, "INFO" }, - { EVENT_NOTICE_MSG, "NOTICE" }, - { EVENT_WARN_MSG, "WARN" }, - { EVENT_ERR_MSG, "ERR" }, - { EVENT_NEW_DESC, "NEWDESC" }, - { EVENT_ADDRMAP, "ADDRMAP" }, - { EVENT_AUTHDIR_NEWDESCS, "AUTHDIR_NEWDESCS" }, - { EVENT_DESCCHANGED, "DESCCHANGED" }, - { EVENT_NS, "NS" }, - { EVENT_STATUS_GENERAL, "STATUS_GENERAL" }, - { EVENT_STATUS_CLIENT, "STATUS_CLIENT" }, - { EVENT_STATUS_SERVER, "STATUS_SERVER" }, - { EVENT_GUARD, "GUARD" }, - { EVENT_STREAM_BANDWIDTH_USED, "STREAM_BW" }, - { EVENT_CLIENTS_SEEN, "CLIENTS_SEEN" }, - { EVENT_NEWCONSENSUS, "NEWCONSENSUS" }, - { EVENT_BUILDTIMEOUT_SET, "BUILDTIMEOUT_SET" }, - { EVENT_SIGNAL, "SIGNAL" }, - { EVENT_CONF_CHANGED, "CONF_CHANGED"}, - { EVENT_CONN_BW, "CONN_BW" }, - { EVENT_CELL_STATS, "CELL_STATS" }, - { EVENT_TB_EMPTY, "TB_EMPTY" }, - { EVENT_CIRC_BANDWIDTH_USED, "CIRC_BW" }, - { EVENT_TRANSPORT_LAUNCHED, "TRANSPORT_LAUNCHED" }, - { EVENT_HS_DESC, "HS_DESC" }, - { 0, NULL }, -}; - -/** Called when we get a SETEVENTS message: update conn->event_mask, - * and reply with DONE or ERROR. */ -static int -handle_control_setevents(control_connection_t *conn, uint32_t len, - const char *body) -{ - int event_code = -1; - uint32_t event_mask = 0; - smartlist_t *events = smartlist_new(); - - (void) len; - - smartlist_split_string(events, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(events, const char *, ev) - { - if (!strcasecmp(ev, "EXTENDED")) { - continue; - } else { - int i; - for (i = 0; control_event_table[i].event_name != NULL; ++i) { - if (!strcasecmp(ev, control_event_table[i].event_name)) { - event_code = control_event_table[i].event_code; - break; - } - } - - if (event_code == -1) { - connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n", - ev); - SMARTLIST_FOREACH(events, char *, e, tor_free(e)); - smartlist_free(events); - return 0; - } - } - event_mask |= (1 << event_code); - } - SMARTLIST_FOREACH_END(ev); - SMARTLIST_FOREACH(events, char *, e, tor_free(e)); - smartlist_free(events); - - conn->event_mask = event_mask; - - control_update_global_event_mask(); - send_control_done(conn); - return 0; -} - -/** Decode the hashed, base64'd passwords stored in passwords. - * Return a smartlist of acceptable passwords (unterminated strings of - * length S2K_SPECIFIER_LEN+DIGEST_LEN) on success, or NULL on failure. - */ -smartlist_t * -decode_hashed_passwords(config_line_t *passwords) -{ - char decoded[64]; - config_line_t *cl; - smartlist_t *sl = smartlist_new(); - - tor_assert(passwords); - - for (cl = passwords; cl; cl = cl->next) { - const char *hashed = cl->value; - - if (!strcmpstart(hashed, "16:")) { - if (base16_decode(decoded, sizeof(decoded), hashed+3, strlen(hashed+3))<0 - || strlen(hashed+3) != (S2K_SPECIFIER_LEN+DIGEST_LEN)*2) { - goto err; - } - } else { - if (base64_decode(decoded, sizeof(decoded), hashed, strlen(hashed)) - != S2K_SPECIFIER_LEN+DIGEST_LEN) { - goto err; - } - } - smartlist_add(sl, tor_memdup(decoded, S2K_SPECIFIER_LEN+DIGEST_LEN)); - } - - return sl; - - err: - SMARTLIST_FOREACH(sl, char*, cp, tor_free(cp)); - smartlist_free(sl); - return NULL; -} - -/** Called when we get an AUTHENTICATE message. Check whether the - * authentication is valid, and if so, update the connection's state to - * OPEN. Reply with DONE or ERROR. - */ -static int -handle_control_authenticate(control_connection_t *conn, uint32_t len, - const char *body) -{ - int used_quoted_string = 0; - const or_options_t *options = get_options(); - const char *errstr = NULL; - char *password; - size_t password_len; - const char *cp; - int i; - int bad_cookie=0, bad_password=0; - smartlist_t *sl = NULL; - - if (!len) { - password = tor_strdup(""); - password_len = 0; - } else if (TOR_ISXDIGIT(body[0])) { - cp = body; - while (TOR_ISXDIGIT(*cp)) - ++cp; - i = (int)(cp - body); - tor_assert(i>0); - password_len = i/2; - password = tor_malloc(password_len + 1); - if (base16_decode(password, password_len+1, body, i)<0) { - connection_write_str_to_buf( - "551 Invalid hexadecimal encoding. Maybe you tried a plain text " - "password? If so, the standard requires that you put it in " - "double quotes.\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - tor_free(password); - return 0; - } - } else { - if (!decode_escaped_string(body, len, &password, &password_len)) { - connection_write_str_to_buf("551 Invalid quoted string. You need " - "to put the password in double quotes.\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - return 0; - } - used_quoted_string = 1; - } - - if (conn->safecookie_client_hash != NULL) { - /* The controller has chosen safe cookie authentication; the only - * acceptable authentication value is the controller-to-server - * response. */ - - tor_assert(authentication_cookie_is_set); - - if (password_len != DIGEST256_LEN) { - log_warn(LD_CONTROL, - "Got safe cookie authentication response with wrong length " - "(%d)", (int)password_len); - errstr = "Wrong length for safe cookie response."; - goto err; - } - - if (tor_memneq(conn->safecookie_client_hash, password, DIGEST256_LEN)) { - log_warn(LD_CONTROL, - "Got incorrect safe cookie authentication response"); - errstr = "Safe cookie response did not match expected value."; - goto err; - } - - tor_free(conn->safecookie_client_hash); - goto ok; - } - - if (!options->CookieAuthentication && !options->HashedControlPassword && - !options->HashedControlSessionPassword) { - /* if Tor doesn't demand any stronger authentication, then - * the controller can get in with anything. */ - goto ok; - } - - if (options->CookieAuthentication) { - int also_password = options->HashedControlPassword != NULL || - options->HashedControlSessionPassword != NULL; - if (password_len != AUTHENTICATION_COOKIE_LEN) { - if (!also_password) { - log_warn(LD_CONTROL, "Got authentication cookie with wrong length " - "(%d)", (int)password_len); - errstr = "Wrong length on authentication cookie."; - goto err; - } - bad_cookie = 1; - } else if (tor_memneq(authentication_cookie, password, password_len)) { - if (!also_password) { - log_warn(LD_CONTROL, "Got mismatched authentication cookie"); - errstr = "Authentication cookie did not match expected value."; - goto err; - } - bad_cookie = 1; - } else { - goto ok; - } - } - - if (options->HashedControlPassword || - options->HashedControlSessionPassword) { - int bad = 0; - smartlist_t *sl_tmp; - char received[DIGEST_LEN]; - int also_cookie = options->CookieAuthentication; - sl = smartlist_new(); - if (options->HashedControlPassword) { - sl_tmp = decode_hashed_passwords(options->HashedControlPassword); - if (!sl_tmp) - bad = 1; - else { - smartlist_add_all(sl, sl_tmp); - smartlist_free(sl_tmp); - } - } - if (options->HashedControlSessionPassword) { - sl_tmp = decode_hashed_passwords(options->HashedControlSessionPassword); - if (!sl_tmp) - bad = 1; - else { - smartlist_add_all(sl, sl_tmp); - smartlist_free(sl_tmp); - } - } - if (bad) { - if (!also_cookie) { - log_warn(LD_CONTROL, - "Couldn't decode HashedControlPassword: invalid base16"); - errstr="Couldn't decode HashedControlPassword value in configuration."; - } - bad_password = 1; - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - } else { - SMARTLIST_FOREACH(sl, char *, expected, - { - secret_to_key(received,DIGEST_LEN,password,password_len,expected); - if (tor_memeq(expected+S2K_SPECIFIER_LEN, received, DIGEST_LEN)) - goto ok; - }); - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - - if (used_quoted_string) - errstr = "Password did not match HashedControlPassword value from " - "configuration"; - else - errstr = "Password did not match HashedControlPassword value from " - "configuration. Maybe you tried a plain text password? " - "If so, the standard requires that you put it in double quotes."; - bad_password = 1; - if (!also_cookie) - goto err; - } - } - - /** We only get here if both kinds of authentication failed. */ - tor_assert(bad_password && bad_cookie); - log_warn(LD_CONTROL, "Bad password or authentication cookie on controller."); - errstr = "Password did not match HashedControlPassword *or* authentication " - "cookie."; - - err: - tor_free(password); - connection_printf_to_buf(conn, "515 Authentication failed: %s\r\n", - errstr ? errstr : "Unknown reason."); - connection_mark_for_close(TO_CONN(conn)); - return 0; - ok: - log_info(LD_CONTROL, "Authenticated control connection ("TOR_SOCKET_T_FORMAT - ")", conn->base_.s); - send_control_done(conn); - conn->base_.state = CONTROL_CONN_STATE_OPEN; - tor_free(password); - if (sl) { /* clean up */ - SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); - smartlist_free(sl); - } - return 0; -} - -/** Called when we get a SAVECONF command. Try to flush the current options to - * disk, and report success or failure. */ -static int -handle_control_saveconf(control_connection_t *conn, uint32_t len, - const char *body) -{ - (void) len; - (void) body; - if (options_save_current()<0) { - connection_write_str_to_buf( - "551 Unable to write configuration to disk.\r\n", conn); - } else { - send_control_done(conn); - } - return 0; -} - -struct signal_t { - int sig; - const char *signal_name; -}; - -static const struct signal_t signal_table[] = { - { SIGHUP, "RELOAD" }, - { SIGHUP, "HUP" }, - { SIGINT, "SHUTDOWN" }, - { SIGUSR1, "DUMP" }, - { SIGUSR1, "USR1" }, - { SIGUSR2, "DEBUG" }, - { SIGUSR2, "USR2" }, - { SIGTERM, "HALT" }, - { SIGTERM, "TERM" }, - { SIGTERM, "INT" }, - { SIGNEWNYM, "NEWNYM" }, - { SIGCLEARDNSCACHE, "CLEARDNSCACHE"}, - { 0, NULL }, -}; - -/** Called when we get a SIGNAL command. React to the provided signal, and - * report success or failure. (If the signal results in a shutdown, success - * may not be reported.) */ -static int -handle_control_signal(control_connection_t *conn, uint32_t len, - const char *body) -{ - int sig = -1; - int i; - int n = 0; - char *s; - - (void) len; - - while (body[n] && ! TOR_ISSPACE(body[n])) - ++n; - s = tor_strndup(body, n); - - for (i = 0; signal_table[i].signal_name != NULL; ++i) { - if (!strcasecmp(s, signal_table[i].signal_name)) { - sig = signal_table[i].sig; - break; - } - } - - if (sig < 0) - connection_printf_to_buf(conn, "552 Unrecognized signal code \"%s\"\r\n", - s); - tor_free(s); - if (sig < 0) - return 0; - - send_control_done(conn); - /* Flush the "done" first if the signal might make us shut down. */ - if (sig == SIGTERM || sig == SIGINT) - connection_flush(TO_CONN(conn)); - - process_signal(sig); - - return 0; -} - -/** Called when we get a TAKEOWNERSHIP command. Mark this connection - * as an owning connection, so that we will exit if the connection - * closes. */ -static int -handle_control_takeownership(control_connection_t *conn, uint32_t len, - const char *body) -{ - (void)len; - (void)body; - - conn->is_owning_control_connection = 1; - - log_info(LD_CONTROL, "Control connection %d has taken ownership of this " - "Tor instance.", - (int)(conn->base_.s)); - - send_control_done(conn); - return 0; -} - -/** Return true iff addr is unusable as a mapaddress target because of - * containing funny characters. */ -static int -address_is_invalid_mapaddress_target(const char *addr) -{ - if (!strcmpstart(addr, "*.")) - return address_is_invalid_destination(addr+2, 1); - else - return address_is_invalid_destination(addr, 1); -} - -/** Called when we get a MAPADDRESS command; try to bind all listed addresses, - * and report success or failure. */ -static int -handle_control_mapaddress(control_connection_t *conn, uint32_t len, - const char *body) -{ - smartlist_t *elts; - smartlist_t *lines; - smartlist_t *reply; - char *r; - size_t sz; - (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ - - lines = smartlist_new(); - elts = smartlist_new(); - reply = smartlist_new(); - smartlist_split_string(lines, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(lines, char *, line) { - tor_strlower(line); - smartlist_split_string(elts, line, "=", 0, 2); - if (smartlist_len(elts) == 2) { - const char *from = smartlist_get(elts,0); - const char *to = smartlist_get(elts,1); - if (address_is_invalid_mapaddress_target(to)) { - smartlist_add_asprintf(reply, - "512-syntax error: invalid address '%s'", to); - log_warn(LD_CONTROL, - "Skipping invalid argument '%s' in MapAddress msg", to); - } else if (!strcmp(from, ".") || !strcmp(from, "0.0.0.0") || - !strcmp(from, "::")) { - const char type = - !strcmp(from,".") ? RESOLVED_TYPE_HOSTNAME : - (!strcmp(from, "0.0.0.0") ? RESOLVED_TYPE_IPV4 : RESOLVED_TYPE_IPV6); - const char *address = addressmap_register_virtual_address( - type, tor_strdup(to)); - if (!address) { - smartlist_add_asprintf(reply, - "451-resource exhausted: skipping '%s'", line); - log_warn(LD_CONTROL, - "Unable to allocate address for '%s' in MapAddress msg", - safe_str_client(line)); - } else { - smartlist_add_asprintf(reply, "250-%s=%s", address, to); - } - } else { - const char *msg; - if (addressmap_register_auto(from, to, 1, - ADDRMAPSRC_CONTROLLER, &msg) < 0) { - smartlist_add_asprintf(reply, - "512-syntax error: invalid address mapping " - " '%s': %s", line, msg); - log_warn(LD_CONTROL, - "Skipping invalid argument '%s' in MapAddress msg: %s", - line, msg); - } else { - smartlist_add_asprintf(reply, "250-%s", line); - } - } - } else { - smartlist_add_asprintf(reply, "512-syntax error: mapping '%s' is " - "not of expected form 'foo=bar'.", line); - log_info(LD_CONTROL, "Skipping MapAddress '%s': wrong " - "number of items.", - safe_str_client(line)); - } - SMARTLIST_FOREACH(elts, char *, cp, tor_free(cp)); - smartlist_clear(elts); - } SMARTLIST_FOREACH_END(line); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); - smartlist_free(elts); - - if (smartlist_len(reply)) { - ((char*)smartlist_get(reply,smartlist_len(reply)-1))[3] = ' '; - r = smartlist_join_strings(reply, "\r\n", 1, &sz); - connection_write_to_buf(r, sz, TO_CONN(conn)); - tor_free(r); - } else { - const char *response = - "512 syntax error: not enough arguments to mapaddress.\r\n"; - connection_write_to_buf(response, strlen(response), TO_CONN(conn)); - } - - SMARTLIST_FOREACH(reply, char *, cp, tor_free(cp)); - smartlist_free(reply); - return 0; -} - -/** Implementation helper for GETINFO: knows the answers for various - * trivial-to-implement questions. */ -static int -getinfo_helper_misc(control_connection_t *conn, const char *question, - char **answer, const char **errmsg) -{ - (void) conn; - if (!strcmp(question, "version")) { - *answer = tor_strdup(get_version()); - } else if (!strcmp(question, "config-file")) { - *answer = tor_strdup(get_torrc_fname(0)); - } else if (!strcmp(question, "config-defaults-file")) { - *answer = tor_strdup(get_torrc_fname(1)); - } else if (!strcmp(question, "config-text")) { - *answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL); - } else if (!strcmp(question, "info/names")) { - *answer = list_getinfo_options(); - } else if (!strcmp(question, "dormant")) { - int dormant = rep_hist_circbuilding_dormant(time(NULL)); - *answer = tor_strdup(dormant ? "1" : "0"); - } else if (!strcmp(question, "events/names")) { - int i; - smartlist_t *event_names = smartlist_new(); - - for (i = 0; control_event_table[i].event_name != NULL; ++i) { - smartlist_add(event_names, (char *)control_event_table[i].event_name); - } - - *answer = smartlist_join_strings(event_names, " ", 0, NULL); - - smartlist_free(event_names); - } else if (!strcmp(question, "signal/names")) { - smartlist_t *signal_names = smartlist_new(); - int j; - for (j = 0; signal_table[j].signal_name != NULL; ++j) { - smartlist_add(signal_names, (char*)signal_table[j].signal_name); - } - - *answer = smartlist_join_strings(signal_names, " ", 0, NULL); - - smartlist_free(signal_names); - } else if (!strcmp(question, "features/names")) { - *answer = tor_strdup("VERBOSE_NAMES EXTENDED_EVENTS"); - } else if (!strcmp(question, "address")) { - uint32_t addr; - if (router_pick_published_address(get_options(), &addr) < 0) { - *errmsg = "Address unknown"; - return -1; - } - *answer = tor_dup_ip(addr); - } else if (!strcmp(question, "traffic/read")) { - tor_asprintf(answer, U64_FORMAT, U64_PRINTF_ARG(get_bytes_read())); - } else if (!strcmp(question, "traffic/written")) { - tor_asprintf(answer, U64_FORMAT, U64_PRINTF_ARG(get_bytes_written())); - } else if (!strcmp(question, "process/pid")) { - int myPid = -1; - - #ifdef _WIN32 - myPid = _getpid(); - #else - myPid = getpid(); - #endif - - tor_asprintf(answer, "%d", myPid); - } else if (!strcmp(question, "process/uid")) { - #ifdef _WIN32 - *answer = tor_strdup("-1"); - #else - int myUid = geteuid(); - tor_asprintf(answer, "%d", myUid); - #endif - } else if (!strcmp(question, "process/user")) { - #ifdef _WIN32 - *answer = tor_strdup(""); - #else - int myUid = geteuid(); - struct passwd *myPwEntry = getpwuid(myUid); - - if (myPwEntry) { - *answer = tor_strdup(myPwEntry->pw_name); - } else { - *answer = tor_strdup(""); - } - #endif - } else if (!strcmp(question, "process/descriptor-limit")) { - int max_fds=-1; - set_max_file_descriptors(0, &max_fds); - tor_asprintf(answer, "%d", max_fds); - } else if (!strcmp(question, "dir-usage")) { - *answer = directory_dump_request_log(); - } else if (!strcmp(question, "fingerprint")) { - crypto_pk_t *server_key; - if (!server_mode(get_options())) { - *errmsg = "Not running in server mode"; - return -1; - } - server_key = get_server_identity_key(); - *answer = tor_malloc(HEX_DIGEST_LEN+1); - crypto_pk_get_fingerprint(server_key, *answer, 0); - } - return 0; -} - -/** Awful hack: return a newly allocated string based on a routerinfo and - * (possibly) an extrainfo, sticking the read-history and write-history from - * ei into the resulting string. The thing you get back won't - * necessarily have a valid signature. - * - * New code should never use this; it's for backward compatibility. - * - * NOTE: ri_body is as returned by signed_descriptor_get_body: it might - * not be NUL-terminated. */ -static char * -munge_extrainfo_into_routerinfo(const char *ri_body, - const signed_descriptor_t *ri, - const signed_descriptor_t *ei) -{ - char *out = NULL, *outp; - int i; - const char *router_sig; - const char *ei_body = signed_descriptor_get_body(ei); - size_t ri_len = ri->signed_descriptor_len; - size_t ei_len = ei->signed_descriptor_len; - if (!ei_body) - goto bail; - - outp = out = tor_malloc(ri_len+ei_len+1); - if (!(router_sig = tor_memstr(ri_body, ri_len, "\nrouter-signature"))) - goto bail; - ++router_sig; - memcpy(out, ri_body, router_sig-ri_body); - outp += router_sig-ri_body; - - for (i=0; i < 2; ++i) { - const char *kwd = i ? "\nwrite-history " : "\nread-history "; - const char *cp, *eol; - if (!(cp = tor_memstr(ei_body, ei_len, kwd))) - continue; - ++cp; - if (!(eol = memchr(cp, '\n', ei_len - (cp-ei_body)))) - continue; - memcpy(outp, cp, eol-cp+1); - outp += eol-cp+1; - } - memcpy(outp, router_sig, ri_len - (router_sig-ri_body)); - *outp++ = '\0'; - tor_assert(outp-out < (int)(ri_len+ei_len+1)); - - return out; - bail: - tor_free(out); - return tor_strndup(ri_body, ri->signed_descriptor_len); -} - -/** Implementation helper for GETINFO: answers requests for information about - * which ports are bound. */ -static int -getinfo_helper_listeners(control_connection_t *control_conn, - const char *question, - char **answer, const char **errmsg) -{ - int type; - smartlist_t *res; - - (void)control_conn; - (void)errmsg; - - if (!strcmp(question, "net/listeners/or")) - type = CONN_TYPE_OR_LISTENER; - else if (!strcmp(question, "net/listeners/dir")) - type = CONN_TYPE_DIR_LISTENER; - else if (!strcmp(question, "net/listeners/socks")) - type = CONN_TYPE_AP_LISTENER; - else if (!strcmp(question, "net/listeners/trans")) - type = CONN_TYPE_AP_TRANS_LISTENER; - else if (!strcmp(question, "net/listeners/natd")) - type = CONN_TYPE_AP_NATD_LISTENER; - else if (!strcmp(question, "net/listeners/dns")) - type = CONN_TYPE_AP_DNS_LISTENER; - else if (!strcmp(question, "net/listeners/control")) - type = CONN_TYPE_CONTROL_LISTENER; - else - return 0; /* unknown key */ - - res = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) { - struct sockaddr_storage ss; - socklen_t ss_len = sizeof(ss); - - if (conn->type != type || conn->marked_for_close || !SOCKET_OK(conn->s)) - continue; - - if (getsockname(conn->s, (struct sockaddr *)&ss, &ss_len) < 0) { - smartlist_add_asprintf(res, "%s:%d", conn->address, (int)conn->port); - } else { - char *tmp = tor_sockaddr_to_str((struct sockaddr *)&ss); - smartlist_add(res, esc_for_log(tmp)); - tor_free(tmp); - } - - } SMARTLIST_FOREACH_END(conn); - - *answer = smartlist_join_strings(res, " ", 0, NULL); - - SMARTLIST_FOREACH(res, char *, cp, tor_free(cp)); - smartlist_free(res); - return 0; -} - -/** Implementation helper for GETINFO: knows the answers for questions about - * directory information. */ -static int -getinfo_helper_dir(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - const node_t *node; - const routerinfo_t *ri = NULL; - (void) control_conn; - if (!strcmpstart(question, "desc/id/")) { - node = node_get_by_hex_id(question+strlen("desc/id/")); - if (node) - ri = node->ri; - if (ri) { - const char *body = signed_descriptor_get_body(&ri->cache_info); - if (body) - *answer = tor_strndup(body, ri->cache_info.signed_descriptor_len); - } - } else if (!strcmpstart(question, "desc/name/")) { - /* XXX023 Setting 'warn_if_unnamed' here is a bit silly -- the - * warning goes to the user, not to the controller. */ - node = node_get_by_nickname(question+strlen("desc/name/"), 1); - if (node) - ri = node->ri; - if (ri) { - const char *body = signed_descriptor_get_body(&ri->cache_info); - if (body) - *answer = tor_strndup(body, ri->cache_info.signed_descriptor_len); - } - } else if (!strcmp(question, "desc/all-recent")) { - routerlist_t *routerlist = router_get_routerlist(); - smartlist_t *sl = smartlist_new(); - if (routerlist && routerlist->routers) { - SMARTLIST_FOREACH(routerlist->routers, const routerinfo_t *, ri, - { - const char *body = signed_descriptor_get_body(&ri->cache_info); - if (body) - smartlist_add(sl, - tor_strndup(body, ri->cache_info.signed_descriptor_len)); - }); - } - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } else if (!strcmp(question, "desc/all-recent-extrainfo-hack")) { - /* XXXX Remove this once Torstat asks for extrainfos. */ - routerlist_t *routerlist = router_get_routerlist(); - smartlist_t *sl = smartlist_new(); - if (routerlist && routerlist->routers) { - SMARTLIST_FOREACH_BEGIN(routerlist->routers, const routerinfo_t *, ri) { - const char *body = signed_descriptor_get_body(&ri->cache_info); - signed_descriptor_t *ei = extrainfo_get_by_descriptor_digest( - ri->cache_info.extra_info_digest); - if (ei && body) { - smartlist_add(sl, munge_extrainfo_into_routerinfo(body, - &ri->cache_info, ei)); - } else if (body) { - smartlist_add(sl, - tor_strndup(body, ri->cache_info.signed_descriptor_len)); - } - } SMARTLIST_FOREACH_END(ri); - } - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } else if (!strcmpstart(question, "md/id/")) { - const node_t *node = node_get_by_hex_id(question+strlen("md/id/")); - const microdesc_t *md = NULL; - if (node) md = node->md; - if (md && md->body) { - *answer = tor_strndup(md->body, md->bodylen); - } - } else if (!strcmpstart(question, "md/name/")) { - /* XXX023 Setting 'warn_if_unnamed' here is a bit silly -- the - * warning goes to the user, not to the controller. */ - const node_t *node = node_get_by_nickname(question+strlen("md/name/"), 1); - /* XXXX duplicated code */ - const microdesc_t *md = NULL; - if (node) md = node->md; - if (md && md->body) { - *answer = tor_strndup(md->body, md->bodylen); - } - } else if (!strcmpstart(question, "desc-annotations/id/")) { - node = node_get_by_hex_id(question+strlen("desc-annotations/id/")); - if (node) - ri = node->ri; - if (ri) { - const char *annotations = - signed_descriptor_get_annotations(&ri->cache_info); - if (annotations) - *answer = tor_strndup(annotations, - ri->cache_info.annotations_len); - } - } else if (!strcmpstart(question, "dir/server/")) { - size_t answer_len = 0; - char *url = NULL; - smartlist_t *descs = smartlist_new(); - const char *msg; - int res; - char *cp; - tor_asprintf(&url, "/tor/%s", question+4); - res = dirserv_get_routerdescs(descs, url, &msg); - if (res) { - log_warn(LD_CONTROL, "getinfo '%s': %s", question, msg); - smartlist_free(descs); - tor_free(url); - *errmsg = msg; - return -1; - } - SMARTLIST_FOREACH(descs, signed_descriptor_t *, sd, - answer_len += sd->signed_descriptor_len); - cp = *answer = tor_malloc(answer_len+1); - SMARTLIST_FOREACH(descs, signed_descriptor_t *, sd, - { - memcpy(cp, signed_descriptor_get_body(sd), - sd->signed_descriptor_len); - cp += sd->signed_descriptor_len; - }); - *cp = '\0'; - tor_free(url); - smartlist_free(descs); - } else if (!strcmpstart(question, "dir/status/")) { - *answer = tor_strdup(""); - } else if (!strcmp(question, "dir/status-vote/current/consensus")) { /* v3 */ - if (directory_caches_dir_info(get_options())) { - const cached_dir_t *consensus = dirserv_get_consensus("ns"); - if (consensus) - *answer = tor_strdup(consensus->dir); - } - if (!*answer) { /* try loading it from disk */ - char *filename = get_datadir_fname("cached-consensus"); - *answer = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - tor_free(filename); - } - } else if (!strcmp(question, "network-status")) { /* v1 */ - routerlist_t *routerlist = router_get_routerlist(); - if (!routerlist || !routerlist->routers || - list_server_status_v1(routerlist->routers, answer, 1) < 0) { - return -1; - } - } else if (!strcmpstart(question, "extra-info/digest/")) { - question += strlen("extra-info/digest/"); - if (strlen(question) == HEX_DIGEST_LEN) { - char d[DIGEST_LEN]; - signed_descriptor_t *sd = NULL; - if (base16_decode(d, sizeof(d), question, strlen(question))==0) { - /* XXXX this test should move into extrainfo_get_by_descriptor_digest, - * but I don't want to risk affecting other parts of the code, - * especially since the rules for using our own extrainfo (including - * when it might be freed) are different from those for using one - * we have downloaded. */ - if (router_extrainfo_digest_is_me(d)) - sd = &(router_get_my_extrainfo()->cache_info); - else - sd = extrainfo_get_by_descriptor_digest(d); - } - if (sd) { - const char *body = signed_descriptor_get_body(sd); - if (body) - *answer = tor_strndup(body, sd->signed_descriptor_len); - } - } - } - - return 0; -} - -/** Allocate and return a description of circ's current status, - * including its path (if any). */ -static char * -circuit_describe_status_for_controller(origin_circuit_t *circ) -{ - char *rv; - smartlist_t *descparts = smartlist_new(); - - { - char *vpath = circuit_list_path_for_controller(circ); - if (*vpath) { - smartlist_add(descparts, vpath); - } else { - tor_free(vpath); /* empty path; don't put an extra space in the result */ - } - } - - { - cpath_build_state_t *build_state = circ->build_state; - smartlist_t *flaglist = smartlist_new(); - char *flaglist_joined; - - if (build_state->onehop_tunnel) - smartlist_add(flaglist, (void *)"ONEHOP_TUNNEL"); - if (build_state->is_internal) - smartlist_add(flaglist, (void *)"IS_INTERNAL"); - if (build_state->need_capacity) - smartlist_add(flaglist, (void *)"NEED_CAPACITY"); - if (build_state->need_uptime) - smartlist_add(flaglist, (void *)"NEED_UPTIME"); - - /* Only emit a BUILD_FLAGS argument if it will have a non-empty value. */ - if (smartlist_len(flaglist)) { - flaglist_joined = smartlist_join_strings(flaglist, ",", 0, NULL); - - smartlist_add_asprintf(descparts, "BUILD_FLAGS=%s", flaglist_joined); - - tor_free(flaglist_joined); - } - - smartlist_free(flaglist); - } - - smartlist_add_asprintf(descparts, "PURPOSE=%s", - circuit_purpose_to_controller_string(circ->base_.purpose)); - - { - const char *hs_state = - circuit_purpose_to_controller_hs_state_string(circ->base_.purpose); - - if (hs_state != NULL) { - smartlist_add_asprintf(descparts, "HS_STATE=%s", hs_state); - } - } - - if (circ->rend_data != NULL) { - smartlist_add_asprintf(descparts, "REND_QUERY=%s", - circ->rend_data->onion_address); - } - - { - char tbuf[ISO_TIME_USEC_LEN+1]; - format_iso_time_nospace_usec(tbuf, &circ->base_.timestamp_created); - - smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf); - } - - rv = smartlist_join_strings(descparts, " ", 0, NULL); - - SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp)); - smartlist_free(descparts); - - return rv; -} - -/** Implementation helper for GETINFO: knows how to generate summaries of the - * current states of things we send events about. */ -static int -getinfo_helper_events(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) control_conn; - if (!strcmp(question, "circuit-status")) { - circuit_t *circ_; - smartlist_t *status = smartlist_new(); - TOR_LIST_FOREACH(circ_, circuit_get_global_list(), head) { - origin_circuit_t *circ; - char *circdesc; - const char *state; - if (! CIRCUIT_IS_ORIGIN(circ_) || circ_->marked_for_close) - continue; - circ = TO_ORIGIN_CIRCUIT(circ_); - - if (circ->base_.state == CIRCUIT_STATE_OPEN) - state = "BUILT"; - else if (circ->cpath) - state = "EXTENDED"; - else - state = "LAUNCHED"; - - circdesc = circuit_describe_status_for_controller(circ); - - smartlist_add_asprintf(status, "%lu %s%s%s", - (unsigned long)circ->global_identifier, - state, *circdesc ? " " : "", circdesc); - tor_free(circdesc); - } - *answer = smartlist_join_strings(status, "\r\n", 0, NULL); - SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); - smartlist_free(status); - } else if (!strcmp(question, "stream-status")) { - smartlist_t *conns = get_connection_array(); - smartlist_t *status = smartlist_new(); - char buf[256]; - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - const char *state; - entry_connection_t *conn; - circuit_t *circ; - origin_circuit_t *origin_circ = NULL; - if (base_conn->type != CONN_TYPE_AP || - base_conn->marked_for_close || - base_conn->state == AP_CONN_STATE_SOCKS_WAIT || - base_conn->state == AP_CONN_STATE_NATD_WAIT) - continue; - conn = TO_ENTRY_CONN(base_conn); - switch (base_conn->state) - { - case AP_CONN_STATE_CONTROLLER_WAIT: - case AP_CONN_STATE_CIRCUIT_WAIT: - if (conn->socks_request && - SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)) - state = "NEWRESOLVE"; - else - state = "NEW"; - break; - case AP_CONN_STATE_RENDDESC_WAIT: - case AP_CONN_STATE_CONNECT_WAIT: - state = "SENTCONNECT"; break; - case AP_CONN_STATE_RESOLVE_WAIT: - state = "SENTRESOLVE"; break; - case AP_CONN_STATE_OPEN: - state = "SUCCEEDED"; break; - default: - log_warn(LD_BUG, "Asked for stream in unknown state %d", - base_conn->state); - continue; - } - circ = circuit_get_by_edge_conn(ENTRY_TO_EDGE_CONN(conn)); - if (circ && CIRCUIT_IS_ORIGIN(circ)) - origin_circ = TO_ORIGIN_CIRCUIT(circ); - write_stream_target_to_buf(conn, buf, sizeof(buf)); - smartlist_add_asprintf(status, "%lu %s %lu %s", - (unsigned long) base_conn->global_identifier,state, - origin_circ? - (unsigned long)origin_circ->global_identifier : 0ul, - buf); - } SMARTLIST_FOREACH_END(base_conn); - *answer = smartlist_join_strings(status, "\r\n", 0, NULL); - SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); - smartlist_free(status); - } else if (!strcmp(question, "orconn-status")) { - smartlist_t *conns = get_connection_array(); - smartlist_t *status = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) { - const char *state; - char name[128]; - or_connection_t *conn; - if (base_conn->type != CONN_TYPE_OR || base_conn->marked_for_close) - continue; - conn = TO_OR_CONN(base_conn); - if (conn->base_.state == OR_CONN_STATE_OPEN) - state = "CONNECTED"; - else if (conn->nickname) - state = "LAUNCHED"; - else - state = "NEW"; - orconn_target_get_name(name, sizeof(name), conn); - smartlist_add_asprintf(status, "%s %s", name, state); - } SMARTLIST_FOREACH_END(base_conn); - *answer = smartlist_join_strings(status, "\r\n", 0, NULL); - SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); - smartlist_free(status); - } else if (!strcmpstart(question, "address-mappings/")) { - time_t min_e, max_e; - smartlist_t *mappings; - question += strlen("address-mappings/"); - if (!strcmp(question, "all")) { - min_e = 0; max_e = TIME_MAX; - } else if (!strcmp(question, "cache")) { - min_e = 2; max_e = TIME_MAX; - } else if (!strcmp(question, "config")) { - min_e = 0; max_e = 0; - } else if (!strcmp(question, "control")) { - min_e = 1; max_e = 1; - } else { - return 0; - } - mappings = smartlist_new(); - addressmap_get_mappings(mappings, min_e, max_e, 1); - *answer = smartlist_join_strings(mappings, "\r\n", 0, NULL); - SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp)); - smartlist_free(mappings); - } else if (!strcmpstart(question, "status/")) { - /* Note that status/ is not a catch-all for events; there's only supposed - * to be a status GETINFO if there's a corresponding STATUS event. */ - if (!strcmp(question, "status/circuit-established")) { - *answer = tor_strdup(can_complete_circuit ? "1" : "0"); - } else if (!strcmp(question, "status/enough-dir-info")) { - *answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0"); - } else if (!strcmp(question, "status/good-server-descriptor") || - !strcmp(question, "status/accepted-server-descriptor")) { - /* They're equivalent for now, until we can figure out how to make - * good-server-descriptor be what we want. See comment in - * control-spec.txt. */ - *answer = tor_strdup(directories_have_accepted_server_descriptor() - ? "1" : "0"); - } else if (!strcmp(question, "status/reachability-succeeded/or")) { - *answer = tor_strdup(check_whether_orport_reachable() ? "1" : "0"); - } else if (!strcmp(question, "status/reachability-succeeded/dir")) { - *answer = tor_strdup(check_whether_dirport_reachable() ? "1" : "0"); - } else if (!strcmp(question, "status/reachability-succeeded")) { - tor_asprintf(answer, "OR=%d DIR=%d", - check_whether_orport_reachable() ? 1 : 0, - check_whether_dirport_reachable() ? 1 : 0); - } else if (!strcmp(question, "status/bootstrap-phase")) { - *answer = tor_strdup(last_sent_bootstrap_message); - } else if (!strcmpstart(question, "status/version/")) { - int is_server = server_mode(get_options()); - networkstatus_t *c = networkstatus_get_latest_consensus(); - version_status_t status; - const char *recommended; - if (c) { - recommended = is_server ? c->server_versions : c->client_versions; - status = tor_version_is_obsolete(VERSION, recommended); - } else { - recommended = "?"; - status = VS_UNKNOWN; - } - - if (!strcmp(question, "status/version/recommended")) { - *answer = tor_strdup(recommended); - return 0; - } - if (!strcmp(question, "status/version/current")) { - switch (status) - { - case VS_RECOMMENDED: *answer = tor_strdup("recommended"); break; - case VS_OLD: *answer = tor_strdup("obsolete"); break; - case VS_NEW: *answer = tor_strdup("new"); break; - case VS_NEW_IN_SERIES: *answer = tor_strdup("new in series"); break; - case VS_UNRECOMMENDED: *answer = tor_strdup("unrecommended"); break; - case VS_EMPTY: *answer = tor_strdup("none recommended"); break; - case VS_UNKNOWN: *answer = tor_strdup("unknown"); break; - default: tor_fragile_assert(); - } - } else if (!strcmp(question, "status/version/num-versioning") || - !strcmp(question, "status/version/num-concurring")) { - tor_asprintf(answer, "%d", get_n_authorities(V3_DIRINFO)); - log_warn(LD_GENERAL, "%s is deprecated; it no longer gives useful " - "information", question); - } - } else if (!strcmp(question, "status/clients-seen")) { - char *bridge_stats = geoip_get_bridge_stats_controller(time(NULL)); - if (!bridge_stats) { - *errmsg = "No bridge-client stats available"; - return -1; - } - *answer = bridge_stats; - } else { - return 0; - } - } - return 0; -} - -/** Callback function for GETINFO: on a given control connection, try to - * answer the question q and store the newly-allocated answer in - * *a. If an internal error occurs, return -1 and optionally set - * *error_out to point to an error message to be delivered to the - * controller. On success, _or if the key is not recognized_, return 0. Do not - * set a if the key is not recognized. - */ -typedef int (*getinfo_helper_t)(control_connection_t *, - const char *q, char **a, - const char **error_out); - -/** A single item for the GETINFO question-to-answer-function table. */ -typedef struct getinfo_item_t { - const char *varname; /**< The value (or prefix) of the question. */ - getinfo_helper_t fn; /**< The function that knows the answer: NULL if - * this entry is documentation-only. */ - const char *desc; /**< Description of the variable. */ - int is_prefix; /** Must varname match exactly, or must it be a prefix? */ -} getinfo_item_t; - -#define ITEM(name, fn, desc) { name, getinfo_helper_##fn, desc, 0 } -#define PREFIX(name, fn, desc) { name, getinfo_helper_##fn, desc, 1 } -#define DOC(name, desc) { name, NULL, desc, 0 } - -/** Table mapping questions accepted by GETINFO to the functions that know how - * to answer them. */ -static const getinfo_item_t getinfo_items[] = { - ITEM("version", misc, "The current version of Tor."), - ITEM("config-file", misc, "Current location of the \"torrc\" file."), - ITEM("config-defaults-file", misc, "Current location of the defaults file."), - ITEM("config-text", misc, - "Return the string that would be written by a saveconf command."), - ITEM("accounting/bytes", accounting, - "Number of bytes read/written so far in the accounting interval."), - ITEM("accounting/bytes-left", accounting, - "Number of bytes left to write/read so far in the accounting interval."), - ITEM("accounting/enabled", accounting, "Is accounting currently enabled?"), - ITEM("accounting/hibernating", accounting, "Are we hibernating or awake?"), - ITEM("accounting/interval-start", accounting, - "Time when the accounting period starts."), - ITEM("accounting/interval-end", accounting, - "Time when the accounting period ends."), - ITEM("accounting/interval-wake", accounting, - "Time to wake up in this accounting period."), - ITEM("helper-nodes", entry_guards, NULL), /* deprecated */ - ITEM("entry-guards", entry_guards, - "Which nodes are we using as entry guards?"), - ITEM("fingerprint", misc, NULL), - PREFIX("config/", config, "Current configuration values."), - DOC("config/names", - "List of configuration options, types, and documentation."), - DOC("config/defaults", - "List of default values for configuration options. " - "See also config/names"), - ITEM("info/names", misc, - "List of GETINFO options, types, and documentation."), - ITEM("events/names", misc, - "Events that the controller can ask for with SETEVENTS."), - ITEM("signal/names", misc, "Signal names recognized by the SIGNAL command"), - ITEM("features/names", misc, "What arguments can USEFEATURE take?"), - PREFIX("desc/id/", dir, "Router descriptors by ID."), - PREFIX("desc/name/", dir, "Router descriptors by nickname."), - ITEM("desc/all-recent", dir, - "All non-expired, non-superseded router descriptors."), - ITEM("desc/all-recent-extrainfo-hack", dir, NULL), /* Hack. */ - PREFIX("md/id/", dir, "Microdescriptors by ID"), - PREFIX("md/name/", dir, "Microdescriptors by name"), - PREFIX("extra-info/digest/", dir, "Extra-info documents by digest."), - PREFIX("net/listeners/", listeners, "Bound addresses by type"), - ITEM("ns/all", networkstatus, - "Brief summary of router status (v2 directory format)"), - PREFIX("ns/id/", networkstatus, - "Brief summary of router status by ID (v2 directory format)."), - PREFIX("ns/name/", networkstatus, - "Brief summary of router status by nickname (v2 directory format)."), - PREFIX("ns/purpose/", networkstatus, - "Brief summary of router status by purpose (v2 directory format)."), - ITEM("network-status", dir, - "Brief summary of router status (v1 directory format)"), - ITEM("circuit-status", events, "List of current circuits originating here."), - ITEM("stream-status", events,"List of current streams."), - ITEM("orconn-status", events, "A list of current OR connections."), - ITEM("dormant", misc, - "Is Tor dormant (not building circuits because it's idle)?"), - PREFIX("address-mappings/", events, NULL), - DOC("address-mappings/all", "Current address mappings."), - DOC("address-mappings/cache", "Current cached DNS replies."), - DOC("address-mappings/config", - "Current address mappings from configuration."), - DOC("address-mappings/control", "Current address mappings from controller."), - PREFIX("status/", events, NULL), - DOC("status/circuit-established", - "Whether we think client functionality is working."), - DOC("status/enough-dir-info", - "Whether we have enough up-to-date directory information to build " - "circuits."), - DOC("status/bootstrap-phase", - "The last bootstrap phase status event that Tor sent."), - DOC("status/clients-seen", - "Breakdown of client countries seen by a bridge."), - DOC("status/version/recommended", "List of currently recommended versions."), - DOC("status/version/current", "Status of the current version."), - DOC("status/version/num-versioning", "Number of versioning authorities."), - DOC("status/version/num-concurring", - "Number of versioning authorities agreeing on the status of the " - "current version"), - ITEM("address", misc, "IP address of this Tor host, if we can guess it."), - ITEM("traffic/read", misc,"Bytes read since the process was started."), - ITEM("traffic/written", misc, - "Bytes written since the process was started."), - ITEM("process/pid", misc, "Process id belonging to the main tor process."), - ITEM("process/uid", misc, "User id running the tor process."), - ITEM("process/user", misc, - "Username under which the tor process is running."), - ITEM("process/descriptor-limit", misc, "File descriptor limit."), - ITEM("dir-usage", misc, "Breakdown of bytes transferred over DirPort."), - PREFIX("desc-annotations/id/", dir, "Router annotations by hexdigest."), - PREFIX("dir/server/", dir,"Router descriptors as retrieved from a DirPort."), - PREFIX("dir/status/", dir, - "v2 networkstatus docs as retrieved from a DirPort."), - ITEM("dir/status-vote/current/consensus", dir, - "v3 Networkstatus consensus as retrieved from a DirPort."), - ITEM("exit-policy/default", policies, - "The default value appended to the configured exit policy."), - PREFIX("ip-to-country/", geoip, "Perform a GEOIP lookup"), - { NULL, NULL, NULL, 0 } -}; - -/** Allocate and return a list of recognized GETINFO options. */ -static char * -list_getinfo_options(void) -{ - int i; - smartlist_t *lines = smartlist_new(); - char *ans; - for (i = 0; getinfo_items[i].varname; ++i) { - if (!getinfo_items[i].desc) - continue; - - smartlist_add_asprintf(lines, "%s%s -- %s\n", - getinfo_items[i].varname, - getinfo_items[i].is_prefix ? "*" : "", - getinfo_items[i].desc); - } - smartlist_sort_strings(lines); - - ans = smartlist_join_strings(lines, "", 0, NULL); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); - - return ans; -} - -/** Lookup the 'getinfo' entry question, and return - * the answer in *answer (or NULL if key not recognized). - * Return 0 if success or unrecognized, or -1 if recognized but - * internal error. */ -static int -handle_getinfo_helper(control_connection_t *control_conn, - const char *question, char **answer, - const char **err_out) -{ - int i; - *answer = NULL; /* unrecognized key by default */ - - for (i = 0; getinfo_items[i].varname; ++i) { - int match; - if (getinfo_items[i].is_prefix) - match = !strcmpstart(question, getinfo_items[i].varname); - else - match = !strcmp(question, getinfo_items[i].varname); - if (match) { - tor_assert(getinfo_items[i].fn); - return getinfo_items[i].fn(control_conn, question, answer, err_out); - } - } - - return 0; /* unrecognized */ -} - -/** Called when we receive a GETINFO command. Try to fetch all requested - * information, and reply with information or error message. */ -static int -handle_control_getinfo(control_connection_t *conn, uint32_t len, - const char *body) -{ - smartlist_t *questions = smartlist_new(); - smartlist_t *answers = smartlist_new(); - smartlist_t *unrecognized = smartlist_new(); - char *msg = NULL, *ans = NULL; - int i; - (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ - - smartlist_split_string(questions, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(questions, const char *, q) { - const char *errmsg = NULL; - if (handle_getinfo_helper(conn, q, &ans, &errmsg) < 0) { - if (!errmsg) - errmsg = "Internal error"; - connection_printf_to_buf(conn, "551 %s\r\n", errmsg); - goto done; - } - if (!ans) { - smartlist_add(unrecognized, (char*)q); - } else { - smartlist_add(answers, tor_strdup(q)); - smartlist_add(answers, ans); - } - } SMARTLIST_FOREACH_END(q); - if (smartlist_len(unrecognized)) { - for (i=0; i < smartlist_len(unrecognized)-1; ++i) - connection_printf_to_buf(conn, - "552-Unrecognized key \"%s\"\r\n", - (char*)smartlist_get(unrecognized, i)); - connection_printf_to_buf(conn, - "552 Unrecognized key \"%s\"\r\n", - (char*)smartlist_get(unrecognized, i)); - goto done; - } - - for (i = 0; i < smartlist_len(answers); i += 2) { - char *k = smartlist_get(answers, i); - char *v = smartlist_get(answers, i+1); - if (!strchr(v, '\n') && !strchr(v, '\r')) { - connection_printf_to_buf(conn, "250-%s=", k); - connection_write_str_to_buf(v, conn); - connection_write_str_to_buf("\r\n", conn); - } else { - char *esc = NULL; - size_t esc_len; - esc_len = write_escaped_data(v, strlen(v), &esc); - connection_printf_to_buf(conn, "250+%s=\r\n", k); - connection_write_to_buf(esc, esc_len, TO_CONN(conn)); - tor_free(esc); - } - } - connection_write_str_to_buf("250 OK\r\n", conn); - - done: - SMARTLIST_FOREACH(answers, char *, cp, tor_free(cp)); - smartlist_free(answers); - SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp)); - smartlist_free(questions); - smartlist_free(unrecognized); - tor_free(msg); - - return 0; -} - -/** Given a string, convert it to a circuit purpose. */ -static uint8_t -circuit_purpose_from_string(const char *string) -{ - if (!strcasecmpstart(string, "purpose=")) - string += strlen("purpose="); - - if (!strcasecmp(string, "general")) - return CIRCUIT_PURPOSE_C_GENERAL; - else if (!strcasecmp(string, "controller")) - return CIRCUIT_PURPOSE_CONTROLLER; - else - return CIRCUIT_PURPOSE_UNKNOWN; -} - -/** Return a newly allocated smartlist containing the arguments to the command - * waiting in body. If there are fewer than min_args arguments, - * or if max_args is nonnegative and there are more than - * max_args arguments, send a 512 error to the controller, using - * command as the command name in the error message. */ -static smartlist_t * -getargs_helper(const char *command, control_connection_t *conn, - const char *body, int min_args, int max_args) -{ - smartlist_t *args = smartlist_new(); - smartlist_split_string(args, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args) < min_args) { - connection_printf_to_buf(conn, "512 Missing argument to %s\r\n",command); - goto err; - } else if (max_args >= 0 && smartlist_len(args) > max_args) { - connection_printf_to_buf(conn, "512 Too many arguments to %s\r\n",command); - goto err; - } - return args; - err: - SMARTLIST_FOREACH(args, char *, s, tor_free(s)); - smartlist_free(args); - return NULL; -} - -/** Helper. Return the first element of sl at index start_at or - * higher that starts with prefix, case-insensitive. Return NULL if no - * such element exists. */ -static const char * -find_element_starting_with(smartlist_t *sl, int start_at, const char *prefix) -{ - int i; - for (i = start_at; i < smartlist_len(sl); ++i) { - const char *elt = smartlist_get(sl, i); - if (!strcasecmpstart(elt, prefix)) - return elt; - } - return NULL; -} - -/** Helper. Return true iff s is an argument that we should treat as a - * key-value pair. */ -static int -is_keyval_pair(const char *s) -{ - /* An argument is a key-value pair if it has an =, and it isn't of the form - * $fingeprint=name */ - return strchr(s, '=') && s[0] != '$'; -} - -/** Called when we get an EXTENDCIRCUIT message. Try to extend the listed - * circuit, and report success or failure. */ -static int -handle_control_extendcircuit(control_connection_t *conn, uint32_t len, - const char *body) -{ - smartlist_t *router_nicknames=NULL, *nodes=NULL; - origin_circuit_t *circ = NULL; - int zero_circ; - uint8_t intended_purpose = CIRCUIT_PURPOSE_C_GENERAL; - smartlist_t *args; - (void) len; - - router_nicknames = smartlist_new(); - - args = getargs_helper("EXTENDCIRCUIT", conn, body, 1, -1); - if (!args) - goto done; - - zero_circ = !strcmp("0", (char*)smartlist_get(args,0)); - - if (zero_circ) { - const char *purp = find_element_starting_with(args, 1, "PURPOSE="); - - if (purp) { - intended_purpose = circuit_purpose_from_string(purp); - if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) { - connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp); - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - goto done; - } - } - - if ((smartlist_len(args) == 1) || - (smartlist_len(args) >= 2 && is_keyval_pair(smartlist_get(args, 1)))) { - // "EXTENDCIRCUIT 0" || EXTENDCIRCUIT 0 foo=bar" - circ = circuit_launch(intended_purpose, CIRCLAUNCH_NEED_CAPACITY); - if (!circ) { - connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn); - } else { - connection_printf_to_buf(conn, "250 EXTENDED %lu\r\n", - (unsigned long)circ->global_identifier); - } - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - goto done; - } - // "EXTENDCIRCUIT 0 router1,router2" || - // "EXTENDCIRCUIT 0 router1,router2 PURPOSE=foo" - } - - if (!zero_circ && !(circ = get_circ(smartlist_get(args,0)))) { - connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - goto done; - } - - smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); - - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - - nodes = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(router_nicknames, const char *, n) { - const node_t *node = node_get_by_nickname(n, 1); - if (!node) { - connection_printf_to_buf(conn, "552 No such router \"%s\"\r\n", n); - goto done; - } - if (!node_has_descriptor(node)) { - connection_printf_to_buf(conn, "552 descriptor for \"%s\"\r\n", n); - goto done; - } - smartlist_add(nodes, (void*)node); - } SMARTLIST_FOREACH_END(n); - if (!smartlist_len(nodes)) { - connection_write_str_to_buf("512 No router names provided\r\n", conn); - goto done; - } - - if (zero_circ) { - /* start a new circuit */ - circ = origin_circuit_init(intended_purpose, 0); - } - - /* now circ refers to something that is ready to be extended */ - SMARTLIST_FOREACH(nodes, const node_t *, node, - { - extend_info_t *info = extend_info_from_node(node, 0); - tor_assert(info); /* True, since node_has_descriptor(node) == true */ - circuit_append_new_exit(circ, info); - extend_info_free(info); - }); - - /* now that we've populated the cpath, start extending */ - if (zero_circ) { - int err_reason = 0; - if ((err_reason = circuit_handle_first_hop(circ)) < 0) { - circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason); - connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn); - goto done; - } - } else { - if (circ->base_.state == CIRCUIT_STATE_OPEN) { - int err_reason = 0; - circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING); - if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) { - log_info(LD_CONTROL, - "send_next_onion_skin failed; circuit marked for closing."); - circuit_mark_for_close(TO_CIRCUIT(circ), -err_reason); - connection_write_str_to_buf("551 Couldn't send onion skin\r\n", conn); - goto done; - } - } - } - - connection_printf_to_buf(conn, "250 EXTENDED %lu\r\n", - (unsigned long)circ->global_identifier); - if (zero_circ) /* send a 'launched' event, for completeness */ - control_event_circuit_status(circ, CIRC_EVENT_LAUNCHED, 0); - done: - SMARTLIST_FOREACH(router_nicknames, char *, n, tor_free(n)); - smartlist_free(router_nicknames); - smartlist_free(nodes); - return 0; -} - -/** Called when we get a SETCIRCUITPURPOSE message. If we can find the - * circuit and it's a valid purpose, change it. */ -static int -handle_control_setcircuitpurpose(control_connection_t *conn, - uint32_t len, const char *body) -{ - origin_circuit_t *circ = NULL; - uint8_t new_purpose; - smartlist_t *args; - (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */ - - args = getargs_helper("SETCIRCUITPURPOSE", conn, body, 2, -1); - if (!args) - goto done; - - if (!(circ = get_circ(smartlist_get(args,0)))) { - connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - goto done; - } - - { - const char *purp = find_element_starting_with(args,1,"PURPOSE="); - if (!purp) { - connection_write_str_to_buf("552 No purpose given\r\n", conn); - goto done; - } - new_purpose = circuit_purpose_from_string(purp); - if (new_purpose == CIRCUIT_PURPOSE_UNKNOWN) { - connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp); - goto done; - } - } - - circuit_change_purpose(TO_CIRCUIT(circ), new_purpose); - connection_write_str_to_buf("250 OK\r\n", conn); - - done: - if (args) { - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - } - return 0; -} - -/** Called when we get an ATTACHSTREAM message. Try to attach the requested - * stream, and report success or failure. */ -static int -handle_control_attachstream(control_connection_t *conn, uint32_t len, - const char *body) -{ - entry_connection_t *ap_conn = NULL; - origin_circuit_t *circ = NULL; - int zero_circ; - smartlist_t *args; - crypt_path_t *cpath=NULL; - int hop=0, hop_line_ok=1; - (void) len; - - args = getargs_helper("ATTACHSTREAM", conn, body, 2, -1); - if (!args) - return 0; - - zero_circ = !strcmp("0", (char*)smartlist_get(args,1)); - - if (!(ap_conn = get_stream(smartlist_get(args, 0)))) { - connection_printf_to_buf(conn, "552 Unknown stream \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - } else if (!zero_circ && !(circ = get_circ(smartlist_get(args, 1)))) { - connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", - (char*)smartlist_get(args, 1)); - } else if (circ) { - const char *hopstring = find_element_starting_with(args,2,"HOP="); - if (hopstring) { - hopstring += strlen("HOP="); - hop = (int) tor_parse_ulong(hopstring, 10, 0, INT_MAX, - &hop_line_ok, NULL); - if (!hop_line_ok) { /* broken hop line */ - connection_printf_to_buf(conn, "552 Bad value hop=%s\r\n", hopstring); - } - } - } - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - if (!ap_conn || (!zero_circ && !circ) || !hop_line_ok) - return 0; - - if (ENTRY_TO_CONN(ap_conn)->state != AP_CONN_STATE_CONTROLLER_WAIT && - ENTRY_TO_CONN(ap_conn)->state != AP_CONN_STATE_CONNECT_WAIT && - ENTRY_TO_CONN(ap_conn)->state != AP_CONN_STATE_RESOLVE_WAIT) { - connection_write_str_to_buf( - "555 Connection is not managed by controller.\r\n", - conn); - return 0; - } - - /* Do we need to detach it first? */ - if (ENTRY_TO_CONN(ap_conn)->state != AP_CONN_STATE_CONTROLLER_WAIT) { - edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(ap_conn); - circuit_t *tmpcirc = circuit_get_by_edge_conn(edge_conn); - connection_edge_end(edge_conn, END_STREAM_REASON_TIMEOUT); - /* Un-mark it as ending, since we're going to reuse it. */ - edge_conn->edge_has_sent_end = 0; - edge_conn->end_reason = 0; - if (tmpcirc) - circuit_detach_stream(tmpcirc, edge_conn); - TO_CONN(edge_conn)->state = AP_CONN_STATE_CONTROLLER_WAIT; - } - - if (circ && (circ->base_.state != CIRCUIT_STATE_OPEN)) { - connection_write_str_to_buf( - "551 Can't attach stream to non-open origin circuit\r\n", - conn); - return 0; - } - /* Is this a single hop circuit? */ - if (circ && (circuit_get_cpath_len(circ)<2 || hop==1)) { - const node_t *node = NULL; - char *exit_digest; - if (circ->build_state && - circ->build_state->chosen_exit && - !tor_digest_is_zero(circ->build_state->chosen_exit->identity_digest)) { - exit_digest = circ->build_state->chosen_exit->identity_digest; - node = node_get_by_id(exit_digest); - } - /* Do both the client and relay allow one-hop exit circuits? */ - if (!node || - !node_allows_single_hop_exits(node) || - !get_options()->AllowSingleHopCircuits) { - connection_write_str_to_buf( - "551 Can't attach stream to this one-hop circuit.\r\n", conn); - return 0; - } - ap_conn->chosen_exit_name = tor_strdup(hex_str(exit_digest, DIGEST_LEN)); - } - - if (circ && hop>0) { - /* find this hop in the circuit, and set cpath */ - cpath = circuit_get_cpath_hop(circ, hop); - if (!cpath) { - connection_printf_to_buf(conn, - "551 Circuit doesn't have %d hops.\r\n", hop); - return 0; - } - } - if (connection_ap_handshake_rewrite_and_attach(ap_conn, circ, cpath) < 0) { - connection_write_str_to_buf("551 Unable to attach stream\r\n", conn); - return 0; - } - send_control_done(conn); - return 0; -} - -/** Called when we get a POSTDESCRIPTOR message. Try to learn the provided - * descriptor, and report success or failure. */ -static int -handle_control_postdescriptor(control_connection_t *conn, uint32_t len, - const char *body) -{ - char *desc; - const char *msg=NULL; - uint8_t purpose = ROUTER_PURPOSE_GENERAL; - int cache = 0; /* eventually, we may switch this to 1 */ - - char *cp = memchr(body, '\n', len); - smartlist_t *args = smartlist_new(); - tor_assert(cp); - *cp++ = '\0'; - - smartlist_split_string(args, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(args, char *, option) { - if (!strcasecmpstart(option, "purpose=")) { - option += strlen("purpose="); - purpose = router_purpose_from_string(option); - if (purpose == ROUTER_PURPOSE_UNKNOWN) { - connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", - option); - goto done; - } - } else if (!strcasecmpstart(option, "cache=")) { - option += strlen("cache="); - if (!strcasecmp(option, "no")) - cache = 0; - else if (!strcasecmp(option, "yes")) - cache = 1; - else { - connection_printf_to_buf(conn, "552 Unknown cache request \"%s\"\r\n", - option); - goto done; - } - } else { /* unrecognized argument? */ - connection_printf_to_buf(conn, - "512 Unexpected argument \"%s\" to postdescriptor\r\n", option); - goto done; - } - } SMARTLIST_FOREACH_END(option); - - read_escaped_data(cp, len-(cp-body), &desc); - - switch (router_load_single_router(desc, purpose, cache, &msg)) { - case -1: - if (!msg) msg = "Could not parse descriptor"; - connection_printf_to_buf(conn, "554 %s\r\n", msg); - break; - case 0: - if (!msg) msg = "Descriptor not added"; - connection_printf_to_buf(conn, "251 %s\r\n",msg); - break; - case 1: - send_control_done(conn); - break; - } - - tor_free(desc); - done: - SMARTLIST_FOREACH(args, char *, arg, tor_free(arg)); - smartlist_free(args); - return 0; -} - -/** Called when we receive a REDIRECTSTERAM command. Try to change the target - * address of the named AP stream, and report success or failure. */ -static int -handle_control_redirectstream(control_connection_t *conn, uint32_t len, - const char *body) -{ - entry_connection_t *ap_conn = NULL; - char *new_addr = NULL; - uint16_t new_port = 0; - smartlist_t *args; - (void) len; - - args = getargs_helper("REDIRECTSTREAM", conn, body, 2, -1); - if (!args) - return 0; - - if (!(ap_conn = get_stream(smartlist_get(args, 0))) - || !ap_conn->socks_request) { - connection_printf_to_buf(conn, "552 Unknown stream \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - } else { - int ok = 1; - if (smartlist_len(args) > 2) { /* they included a port too */ - new_port = (uint16_t) tor_parse_ulong(smartlist_get(args, 2), - 10, 1, 65535, &ok, NULL); - } - if (!ok) { - connection_printf_to_buf(conn, "512 Cannot parse port \"%s\"\r\n", - (char*)smartlist_get(args, 2)); - } else { - new_addr = tor_strdup(smartlist_get(args, 1)); - } - } - - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - if (!new_addr) - return 0; - - strlcpy(ap_conn->socks_request->address, new_addr, - sizeof(ap_conn->socks_request->address)); - if (new_port) - ap_conn->socks_request->port = new_port; - tor_free(new_addr); - send_control_done(conn); - return 0; -} - -/** Called when we get a CLOSESTREAM command; try to close the named stream - * and report success or failure. */ -static int -handle_control_closestream(control_connection_t *conn, uint32_t len, - const char *body) -{ - entry_connection_t *ap_conn=NULL; - uint8_t reason=0; - smartlist_t *args; - int ok; - (void) len; - - args = getargs_helper("CLOSESTREAM", conn, body, 2, -1); - if (!args) - return 0; - - else if (!(ap_conn = get_stream(smartlist_get(args, 0)))) - connection_printf_to_buf(conn, "552 Unknown stream \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - else { - reason = (uint8_t) tor_parse_ulong(smartlist_get(args,1), 10, 0, 255, - &ok, NULL); - if (!ok) { - connection_printf_to_buf(conn, "552 Unrecognized reason \"%s\"\r\n", - (char*)smartlist_get(args, 1)); - ap_conn = NULL; - } - } - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - if (!ap_conn) - return 0; - - connection_mark_unattached_ap(ap_conn, reason); - send_control_done(conn); - return 0; -} - -/** Called when we get a CLOSECIRCUIT command; try to close the named circuit - * and report success or failure. */ -static int -handle_control_closecircuit(control_connection_t *conn, uint32_t len, - const char *body) -{ - origin_circuit_t *circ = NULL; - int safe = 0; - smartlist_t *args; - (void) len; - - args = getargs_helper("CLOSECIRCUIT", conn, body, 1, -1); - if (!args) - return 0; - - if (!(circ=get_circ(smartlist_get(args, 0)))) - connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n", - (char*)smartlist_get(args, 0)); - else { - int i; - for (i=1; i < smartlist_len(args); ++i) { - if (!strcasecmp(smartlist_get(args, i), "IfUnused")) - safe = 1; - else - log_info(LD_CONTROL, "Skipping unknown option %s", - (char*)smartlist_get(args,i)); - } - } - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - if (!circ) - return 0; - - if (!safe || !circ->p_streams) { - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_REQUESTED); - } - - send_control_done(conn); - return 0; -} - -/** Called when we get a RESOLVE command: start trying to resolve - * the listed addresses. */ -static int -handle_control_resolve(control_connection_t *conn, uint32_t len, - const char *body) -{ - smartlist_t *args, *failed; - int is_reverse = 0; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - - if (!(conn->event_mask & ((uint32_t)1L<have_sent_protocolinfo = 1; - args = smartlist_new(); - smartlist_split_string(args, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH(args, const char *, arg, { - int ok; - tor_parse_long(arg, 10, 0, LONG_MAX, &ok, NULL); - if (!ok) { - bad_arg = arg; - break; - } - }); - if (bad_arg) { - connection_printf_to_buf(conn, "513 No such version %s\r\n", - escaped(bad_arg)); - /* Don't tolerate bad arguments when not authenticated. */ - if (!STATE_IS_OPEN(TO_CONN(conn)->state)) - connection_mark_for_close(TO_CONN(conn)); - goto done; - } else { - const or_options_t *options = get_options(); - int cookies = options->CookieAuthentication; - char *cfile = get_cookie_file(); - char *abs_cfile; - char *esc_cfile; - char *methods; - abs_cfile = make_path_absolute(cfile); - esc_cfile = esc_for_log(abs_cfile); - { - int passwd = (options->HashedControlPassword != NULL || - options->HashedControlSessionPassword != NULL); - smartlist_t *mlist = smartlist_new(); - if (cookies) { - smartlist_add(mlist, (char*)"COOKIE"); - smartlist_add(mlist, (char*)"SAFECOOKIE"); - } - if (passwd) - smartlist_add(mlist, (char*)"HASHEDPASSWORD"); - if (!cookies && !passwd) - smartlist_add(mlist, (char*)"NULL"); - methods = smartlist_join_strings(mlist, ",", 0, NULL); - smartlist_free(mlist); - } - - connection_printf_to_buf(conn, - "250-PROTOCOLINFO 1\r\n" - "250-AUTH METHODS=%s%s%s\r\n" - "250-VERSION Tor=%s\r\n" - "250 OK\r\n", - methods, - cookies?" COOKIEFILE=":"", - cookies?esc_cfile:"", - escaped(VERSION)); - tor_free(methods); - tor_free(cfile); - tor_free(abs_cfile); - tor_free(esc_cfile); - } - done: - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - return 0; -} - -/** Called when we get an AUTHCHALLENGE command. */ -static int -handle_control_authchallenge(control_connection_t *conn, uint32_t len, - const char *body) -{ - const char *cp = body; - char *client_nonce; - size_t client_nonce_len; - char server_hash[DIGEST256_LEN]; - char server_hash_encoded[HEX_DIGEST256_LEN+1]; - char server_nonce[SAFECOOKIE_SERVER_NONCE_LEN]; - char server_nonce_encoded[(2*SAFECOOKIE_SERVER_NONCE_LEN) + 1]; - - cp += strspn(cp, " \t\n\r"); - if (!strcasecmpstart(cp, "SAFECOOKIE")) { - cp += strlen("SAFECOOKIE"); - } else { - connection_write_str_to_buf("513 AUTHCHALLENGE only supports SAFECOOKIE " - "authentication\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - if (!authentication_cookie_is_set) { - connection_write_str_to_buf("515 Cookie authentication is disabled\r\n", - conn); - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - cp += strspn(cp, " \t\n\r"); - if (*cp == '"') { - const char *newcp = - decode_escaped_string(cp, len - (cp - body), - &client_nonce, &client_nonce_len); - if (newcp == NULL) { - connection_write_str_to_buf("513 Invalid quoted client nonce\r\n", - conn); - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - cp = newcp; - } else { - size_t client_nonce_encoded_len = strspn(cp, "0123456789ABCDEFabcdef"); - - client_nonce_len = client_nonce_encoded_len / 2; - client_nonce = tor_malloc_zero(client_nonce_len); - - if (base16_decode(client_nonce, client_nonce_len, - cp, client_nonce_encoded_len) < 0) { - connection_write_str_to_buf("513 Invalid base16 client nonce\r\n", - conn); - connection_mark_for_close(TO_CONN(conn)); - tor_free(client_nonce); - return -1; - } - - cp += client_nonce_encoded_len; - } - - cp += strspn(cp, " \t\n\r"); - if (*cp != '\0' || - cp != body + len) { - connection_write_str_to_buf("513 Junk at end of AUTHCHALLENGE command\r\n", - conn); - connection_mark_for_close(TO_CONN(conn)); - tor_free(client_nonce); - return -1; - } - - tor_assert(!crypto_rand(server_nonce, SAFECOOKIE_SERVER_NONCE_LEN)); - - /* Now compute and send the server-to-controller response, and the - * server's nonce. */ - tor_assert(authentication_cookie != NULL); - - { - size_t tmp_len = (AUTHENTICATION_COOKIE_LEN + - client_nonce_len + - SAFECOOKIE_SERVER_NONCE_LEN); - char *tmp = tor_malloc_zero(tmp_len); - char *client_hash = tor_malloc_zero(DIGEST256_LEN); - memcpy(tmp, authentication_cookie, AUTHENTICATION_COOKIE_LEN); - memcpy(tmp + AUTHENTICATION_COOKIE_LEN, client_nonce, client_nonce_len); - memcpy(tmp + AUTHENTICATION_COOKIE_LEN + client_nonce_len, - server_nonce, SAFECOOKIE_SERVER_NONCE_LEN); - - crypto_hmac_sha256(server_hash, - SAFECOOKIE_SERVER_TO_CONTROLLER_CONSTANT, - strlen(SAFECOOKIE_SERVER_TO_CONTROLLER_CONSTANT), - tmp, - tmp_len); - - crypto_hmac_sha256(client_hash, - SAFECOOKIE_CONTROLLER_TO_SERVER_CONSTANT, - strlen(SAFECOOKIE_CONTROLLER_TO_SERVER_CONSTANT), - tmp, - tmp_len); - - conn->safecookie_client_hash = client_hash; - - tor_free(tmp); - } - - base16_encode(server_hash_encoded, sizeof(server_hash_encoded), - server_hash, sizeof(server_hash)); - base16_encode(server_nonce_encoded, sizeof(server_nonce_encoded), - server_nonce, sizeof(server_nonce)); - - connection_printf_to_buf(conn, - "250 AUTHCHALLENGE SERVERHASH=%s " - "SERVERNONCE=%s\r\n", - server_hash_encoded, - server_nonce_encoded); - - tor_free(client_nonce); - return 0; -} - -/** Called when we get a USEFEATURE command: parse the feature list, and - * set up the control_connection's options properly. */ -static int -handle_control_usefeature(control_connection_t *conn, - uint32_t len, - const char *body) -{ - smartlist_t *args; - int bad = 0; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - args = smartlist_new(); - smartlist_split_string(args, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - SMARTLIST_FOREACH_BEGIN(args, const char *, arg) { - if (!strcasecmp(arg, "VERBOSE_NAMES")) - ; - else if (!strcasecmp(arg, "EXTENDED_EVENTS")) - ; - else { - connection_printf_to_buf(conn, "552 Unrecognized feature \"%s\"\r\n", - arg); - bad = 1; - break; - } - } SMARTLIST_FOREACH_END(arg); - - if (!bad) { - send_control_done(conn); - } - - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - return 0; -} - -/** Implementation for the DROPGUARDS command. */ -static int -handle_control_dropguards(control_connection_t *conn, - uint32_t len, - const char *body) -{ - smartlist_t *args; - (void) len; /* body is nul-terminated; it's safe to ignore the length */ - args = smartlist_new(); - smartlist_split_string(args, body, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - - if (smartlist_len(args)) { - connection_printf_to_buf(conn, "512 Too many arguments to DROPGUARDS\r\n"); - } else { - remove_all_entry_guards(); - send_control_done(conn); - } - - SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); - smartlist_free(args); - return 0; -} - -/** Called when conn has no more bytes left on its outbuf. */ -int -connection_control_finished_flushing(control_connection_t *conn) -{ - tor_assert(conn); - return 0; -} - -/** Called when conn has gotten its socket closed. */ -int -connection_control_reached_eof(control_connection_t *conn) -{ - tor_assert(conn); - - log_info(LD_CONTROL,"Control connection reached EOF. Closing."); - connection_mark_for_close(TO_CONN(conn)); - return 0; -} - -/** Shut down this Tor instance in the same way that SIGINT would, but - * with a log message appropriate for the loss of an owning controller. */ -static void -lost_owning_controller(const char *owner_type, const char *loss_manner) -{ - int shutdown_slowly = server_mode(get_options()); - - log_notice(LD_CONTROL, "Owning controller %s has %s -- %s.", - owner_type, loss_manner, - shutdown_slowly ? "shutting down" : "exiting now"); - - /* XXXX Perhaps this chunk of code should be a separate function, - * called here and by process_signal(SIGINT). */ - - if (!shutdown_slowly) { - tor_cleanup(); - exit(0); - } - /* XXXX This will close all listening sockets except control-port - * listeners. Perhaps we should close those too. */ - hibernate_begin_shutdown(); -} - -/** Called when conn is being freed. */ -void -connection_control_closed(control_connection_t *conn) -{ - tor_assert(conn); - - conn->event_mask = 0; - control_update_global_event_mask(); - - if (conn->is_owning_control_connection) { - lost_owning_controller("connection", "closed"); - } -} - -/** Return true iff cmd is allowable (or at least forgivable) at this - * stage of the protocol. */ -static int -is_valid_initial_command(control_connection_t *conn, const char *cmd) -{ - if (conn->base_.state == CONTROL_CONN_STATE_OPEN) - return 1; - if (!strcasecmp(cmd, "PROTOCOLINFO")) - return (!conn->have_sent_protocolinfo && - conn->safecookie_client_hash == NULL); - if (!strcasecmp(cmd, "AUTHCHALLENGE")) - return (conn->safecookie_client_hash == NULL); - if (!strcasecmp(cmd, "AUTHENTICATE") || - !strcasecmp(cmd, "QUIT")) - return 1; - return 0; -} - -/** Do not accept any control command of more than 1MB in length. Anything - * that needs to be anywhere near this long probably means that one of our - * interfaces is broken. */ -#define MAX_COMMAND_LINE_LENGTH (1024*1024) - -/** Wrapper around peek_(evbuffer|buf)_has_control0 command: presents the same - * interface as those underlying functions, but takes a connection_t intead of - * an evbuffer or a buf_t. - */ -static int -peek_connection_has_control0_command(connection_t *conn) -{ - IF_HAS_BUFFEREVENT(conn, { - struct evbuffer *input = bufferevent_get_input(conn->bufev); - return peek_evbuffer_has_control0_command(input); - }) ELSE_IF_NO_BUFFEREVENT { - return peek_buf_has_control0_command(conn->inbuf); - } -} - -/** Called when data has arrived on a v1 control connection: Try to fetch - * commands from conn->inbuf, and execute them. - */ -int -connection_control_process_inbuf(control_connection_t *conn) -{ - size_t data_len; - uint32_t cmd_data_len; - int cmd_len; - char *args; - - tor_assert(conn); - tor_assert(conn->base_.state == CONTROL_CONN_STATE_OPEN || - conn->base_.state == CONTROL_CONN_STATE_NEEDAUTH); - - if (!conn->incoming_cmd) { - conn->incoming_cmd = tor_malloc(1024); - conn->incoming_cmd_len = 1024; - conn->incoming_cmd_cur_len = 0; - } - - if (conn->base_.state == CONTROL_CONN_STATE_NEEDAUTH && - peek_connection_has_control0_command(TO_CONN(conn))) { - /* Detect v0 commands and send a "no more v0" message. */ - size_t body_len; - char buf[128]; - set_uint16(buf+2, htons(0x0000)); /* type == error */ - set_uint16(buf+4, htons(0x0001)); /* code == internal error */ - strlcpy(buf+6, "The v0 control protocol is not supported by Tor 0.1.2.17 " - "and later; upgrade your controller.", - sizeof(buf)-6); - body_len = 2+strlen(buf+6)+2; /* code, msg, nul. */ - set_uint16(buf+0, htons(body_len)); - connection_write_to_buf(buf, 4+body_len, TO_CONN(conn)); - - connection_mark_and_flush(TO_CONN(conn)); - return 0; - } - - again: - while (1) { - size_t last_idx; - int r; - /* First, fetch a line. */ - do { - data_len = conn->incoming_cmd_len - conn->incoming_cmd_cur_len; - r = connection_fetch_from_buf_line(TO_CONN(conn), - conn->incoming_cmd+conn->incoming_cmd_cur_len, - &data_len); - if (r == 0) - /* Line not all here yet. Wait. */ - return 0; - else if (r == -1) { - if (data_len + conn->incoming_cmd_cur_len > MAX_COMMAND_LINE_LENGTH) { - connection_write_str_to_buf("500 Line too long.\r\n", conn); - connection_stop_reading(TO_CONN(conn)); - connection_mark_and_flush(TO_CONN(conn)); - } - while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len) - conn->incoming_cmd_len *= 2; - conn->incoming_cmd = tor_realloc(conn->incoming_cmd, - conn->incoming_cmd_len); - } - } while (r != 1); - - tor_assert(data_len); - - last_idx = conn->incoming_cmd_cur_len; - conn->incoming_cmd_cur_len += (int)data_len; - - /* We have appended a line to incoming_cmd. Is the command done? */ - if (last_idx == 0 && *conn->incoming_cmd != '+') - /* One line command, didn't start with '+'. */ - break; - /* XXXX this code duplication is kind of dumb. */ - if (last_idx+3 == conn->incoming_cmd_cur_len && - tor_memeq(conn->incoming_cmd + last_idx, ".\r\n", 3)) { - /* Just appended ".\r\n"; we're done. Remove it. */ - conn->incoming_cmd[last_idx] = '\0'; - conn->incoming_cmd_cur_len -= 3; - break; - } else if (last_idx+2 == conn->incoming_cmd_cur_len && - tor_memeq(conn->incoming_cmd + last_idx, ".\n", 2)) { - /* Just appended ".\n"; we're done. Remove it. */ - conn->incoming_cmd[last_idx] = '\0'; - conn->incoming_cmd_cur_len -= 2; - break; - } - /* Otherwise, read another line. */ - } - data_len = conn->incoming_cmd_cur_len; - /* Okay, we now have a command sitting on conn->incoming_cmd. See if we - * recognize it. - */ - cmd_len = 0; - while ((size_t)cmd_len < data_len - && !TOR_ISSPACE(conn->incoming_cmd[cmd_len])) - ++cmd_len; - - conn->incoming_cmd[cmd_len]='\0'; - args = conn->incoming_cmd+cmd_len+1; - tor_assert(data_len>(size_t)cmd_len); - data_len -= (cmd_len+1); /* skip the command and NUL we added after it */ - while (TOR_ISSPACE(*args)) { - ++args; - --data_len; - } - - /* If the connection is already closing, ignore further commands */ - if (TO_CONN(conn)->marked_for_close) { - return 0; - } - - /* Otherwise, Quit is always valid. */ - if (!strcasecmp(conn->incoming_cmd, "QUIT")) { - connection_write_str_to_buf("250 closing connection\r\n", conn); - connection_mark_and_flush(TO_CONN(conn)); - return 0; - } - - if (conn->base_.state == CONTROL_CONN_STATE_NEEDAUTH && - !is_valid_initial_command(conn, conn->incoming_cmd)) { - connection_write_str_to_buf("514 Authentication required.\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - return 0; - } - - if (data_len >= UINT32_MAX) { - connection_write_str_to_buf("500 A 4GB command? Nice try.\r\n", conn); - connection_mark_for_close(TO_CONN(conn)); - return 0; - } - - /* XXXX Why is this not implemented as a table like the GETINFO - * items are? Even handling the plus signs at the beginnings of - * commands wouldn't be very hard with proper macros. */ - cmd_data_len = (uint32_t)data_len; - if (!strcasecmp(conn->incoming_cmd, "SETCONF")) { - if (handle_control_setconf(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "RESETCONF")) { - if (handle_control_resetconf(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "GETCONF")) { - if (handle_control_getconf(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "+LOADCONF")) { - if (handle_control_loadconf(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "SETEVENTS")) { - if (handle_control_setevents(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "AUTHENTICATE")) { - if (handle_control_authenticate(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "SAVECONF")) { - if (handle_control_saveconf(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "SIGNAL")) { - if (handle_control_signal(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "TAKEOWNERSHIP")) { - if (handle_control_takeownership(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "MAPADDRESS")) { - if (handle_control_mapaddress(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "GETINFO")) { - if (handle_control_getinfo(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "EXTENDCIRCUIT")) { - if (handle_control_extendcircuit(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "SETCIRCUITPURPOSE")) { - if (handle_control_setcircuitpurpose(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "SETROUTERPURPOSE")) { - connection_write_str_to_buf("511 SETROUTERPURPOSE is obsolete.\r\n", conn); - } else if (!strcasecmp(conn->incoming_cmd, "ATTACHSTREAM")) { - if (handle_control_attachstream(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "+POSTDESCRIPTOR")) { - if (handle_control_postdescriptor(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "REDIRECTSTREAM")) { - if (handle_control_redirectstream(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "CLOSESTREAM")) { - if (handle_control_closestream(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "CLOSECIRCUIT")) { - if (handle_control_closecircuit(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "USEFEATURE")) { - if (handle_control_usefeature(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "RESOLVE")) { - if (handle_control_resolve(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "PROTOCOLINFO")) { - if (handle_control_protocolinfo(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "AUTHCHALLENGE")) { - if (handle_control_authchallenge(conn, cmd_data_len, args)) - return -1; - } else if (!strcasecmp(conn->incoming_cmd, "DROPGUARDS")) { - if (handle_control_dropguards(conn, cmd_data_len, args)) - return -1; - } else { - connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n", - conn->incoming_cmd); - } - - conn->incoming_cmd_cur_len = 0; - goto again; -} - -/** Something major has happened to circuit circ: tell any - * interested control connections. */ -int -control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, - int reason_code) -{ - const char *status; - char reasons[64] = ""; - if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS)) - return 0; - tor_assert(circ); - - switch (tp) - { - case CIRC_EVENT_LAUNCHED: status = "LAUNCHED"; break; - case CIRC_EVENT_BUILT: status = "BUILT"; break; - case CIRC_EVENT_EXTENDED: status = "EXTENDED"; break; - case CIRC_EVENT_FAILED: status = "FAILED"; break; - case CIRC_EVENT_CLOSED: status = "CLOSED"; break; - default: - log_warn(LD_BUG, "Unrecognized status code %d", (int)tp); - tor_fragile_assert(); - return 0; - } - - if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) { - const char *reason_str = circuit_end_reason_to_control_string(reason_code); - char unk_reason_buf[16]; - if (!reason_str) { - tor_snprintf(unk_reason_buf, 16, "UNKNOWN_%d", reason_code); - reason_str = unk_reason_buf; - } - if (reason_code > 0 && reason_code & END_CIRC_REASON_FLAG_REMOTE) { - tor_snprintf(reasons, sizeof(reasons), - " REASON=DESTROYED REMOTE_REASON=%s", reason_str); - } else { - tor_snprintf(reasons, sizeof(reasons), - " REASON=%s", reason_str); - } - } - - { - char *circdesc = circuit_describe_status_for_controller(circ); - const char *sp = strlen(circdesc) ? " " : ""; - send_control_event(EVENT_CIRCUIT_STATUS, ALL_FORMATS, - "650 CIRC %lu %s%s%s%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, - circdesc, - reasons); - tor_free(circdesc); - } - - return 0; -} - -/** Something minor has happened to circuit circ: tell any - * interested control connections. */ -static int -control_event_circuit_status_minor(origin_circuit_t *circ, - circuit_status_minor_event_t e, - int purpose, const struct timeval *tv) -{ - const char *event_desc; - char event_tail[160] = ""; - if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS_MINOR)) - return 0; - tor_assert(circ); - - switch (e) - { - case CIRC_MINOR_EVENT_PURPOSE_CHANGED: - event_desc = "PURPOSE_CHANGED"; - - { - /* event_tail can currently be up to 68 chars long */ - const char *hs_state_str = - circuit_purpose_to_controller_hs_state_string(purpose); - tor_snprintf(event_tail, sizeof(event_tail), - " OLD_PURPOSE=%s%s%s", - circuit_purpose_to_controller_string(purpose), - (hs_state_str != NULL) ? " OLD_HS_STATE=" : "", - (hs_state_str != NULL) ? hs_state_str : ""); - } - - break; - case CIRC_MINOR_EVENT_CANNIBALIZED: - event_desc = "CANNIBALIZED"; - - { - /* event_tail can currently be up to 130 chars long */ - const char *hs_state_str = - circuit_purpose_to_controller_hs_state_string(purpose); - const struct timeval *old_timestamp_began = tv; - char tbuf[ISO_TIME_USEC_LEN+1]; - format_iso_time_nospace_usec(tbuf, old_timestamp_began); - - tor_snprintf(event_tail, sizeof(event_tail), - " OLD_PURPOSE=%s%s%s OLD_TIME_CREATED=%s", - circuit_purpose_to_controller_string(purpose), - (hs_state_str != NULL) ? " OLD_HS_STATE=" : "", - (hs_state_str != NULL) ? hs_state_str : "", - tbuf); - } - - break; - default: - log_warn(LD_BUG, "Unrecognized status code %d", (int)e); - tor_fragile_assert(); - return 0; - } - - { - char *circdesc = circuit_describe_status_for_controller(circ); - const char *sp = strlen(circdesc) ? " " : ""; - send_control_event(EVENT_CIRCUIT_STATUS_MINOR, ALL_FORMATS, - "650 CIRC_MINOR %lu %s%s%s%s\r\n", - (unsigned long)circ->global_identifier, - event_desc, sp, - circdesc, - event_tail); - tor_free(circdesc); - } - - return 0; -} - -/** - * circ has changed its purpose from old_purpose: tell any - * interested controllers. - */ -int -control_event_circuit_purpose_changed(origin_circuit_t *circ, - int old_purpose) -{ - return control_event_circuit_status_minor(circ, - CIRC_MINOR_EVENT_PURPOSE_CHANGED, - old_purpose, - NULL); -} - -/** - * circ has changed its purpose from old_purpose, and its - * created-time from old_tv_created: tell any interested controllers. - */ -int -control_event_circuit_cannibalized(origin_circuit_t *circ, - int old_purpose, - const struct timeval *old_tv_created) -{ - return control_event_circuit_status_minor(circ, - CIRC_MINOR_EVENT_CANNIBALIZED, - old_purpose, - old_tv_created); -} - -/** Given an AP connection conn and a len-character buffer - * buf, determine the address:port combination requested on - * conn, and write it to buf. Return 0 on success, -1 on - * failure. */ -static int -write_stream_target_to_buf(entry_connection_t *conn, char *buf, size_t len) -{ - char buf2[256]; - if (conn->chosen_exit_name) - if (tor_snprintf(buf2, sizeof(buf2), ".%s.exit", conn->chosen_exit_name)<0) - return -1; - if (!conn->socks_request) - return -1; - if (tor_snprintf(buf, len, "%s%s%s:%d", - conn->socks_request->address, - conn->chosen_exit_name ? buf2 : "", - !conn->chosen_exit_name && connection_edge_is_rendezvous_stream( - ENTRY_TO_EDGE_CONN(conn)) ? ".onion" : "", - conn->socks_request->port)<0) - return -1; - return 0; -} - -/** Something has happened to the stream associated with AP connection - * conn: tell any interested control connections. */ -int -control_event_stream_status(entry_connection_t *conn, stream_status_event_t tp, - int reason_code) -{ - char reason_buf[64]; - char addrport_buf[64]; - const char *status; - circuit_t *circ; - origin_circuit_t *origin_circ = NULL; - char buf[256]; - const char *purpose = ""; - tor_assert(conn->socks_request); - - if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS)) - return 0; - - if (tp == STREAM_EVENT_CLOSED && - (reason_code & END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED)) - return 0; - - write_stream_target_to_buf(conn, buf, sizeof(buf)); - - reason_buf[0] = '\0'; - switch (tp) - { - case STREAM_EVENT_SENT_CONNECT: status = "SENTCONNECT"; break; - case STREAM_EVENT_SENT_RESOLVE: status = "SENTRESOLVE"; break; - case STREAM_EVENT_SUCCEEDED: status = "SUCCEEDED"; break; - case STREAM_EVENT_FAILED: status = "FAILED"; break; - case STREAM_EVENT_CLOSED: status = "CLOSED"; break; - case STREAM_EVENT_NEW: status = "NEW"; break; - case STREAM_EVENT_NEW_RESOLVE: status = "NEWRESOLVE"; break; - case STREAM_EVENT_FAILED_RETRIABLE: status = "DETACHED"; break; - case STREAM_EVENT_REMAP: status = "REMAP"; break; - default: - log_warn(LD_BUG, "Unrecognized status code %d", (int)tp); - return 0; - } - if (reason_code && (tp == STREAM_EVENT_FAILED || - tp == STREAM_EVENT_CLOSED || - tp == STREAM_EVENT_FAILED_RETRIABLE)) { - const char *reason_str = stream_end_reason_to_control_string(reason_code); - char *r = NULL; - if (!reason_str) { - tor_asprintf(&r, " UNKNOWN_%d", reason_code); - reason_str = r; - } - if (reason_code & END_STREAM_REASON_FLAG_REMOTE) - tor_snprintf(reason_buf, sizeof(reason_buf), - " REASON=END REMOTE_REASON=%s", reason_str); - else - tor_snprintf(reason_buf, sizeof(reason_buf), - " REASON=%s", reason_str); - tor_free(r); - } else if (reason_code && tp == STREAM_EVENT_REMAP) { - switch (reason_code) { - case REMAP_STREAM_SOURCE_CACHE: - strlcpy(reason_buf, " SOURCE=CACHE", sizeof(reason_buf)); - break; - case REMAP_STREAM_SOURCE_EXIT: - strlcpy(reason_buf, " SOURCE=EXIT", sizeof(reason_buf)); - break; - default: - tor_snprintf(reason_buf, sizeof(reason_buf), " REASON=UNKNOWN_%d", - reason_code); - /* XXX do we want SOURCE=UNKNOWN_%d above instead? -RD */ - break; - } - } - - if (tp == STREAM_EVENT_NEW || tp == STREAM_EVENT_NEW_RESOLVE) { - /* - * When the control conn is an AF_UNIX socket and we have no address, - * it gets set to "(Tor_internal)"; see dnsserv_launch_request() in - * dnsserv.c. - */ - if (strcmp(ENTRY_TO_CONN(conn)->address, "(Tor_internal)") != 0) { - tor_snprintf(addrport_buf,sizeof(addrport_buf), " SOURCE_ADDR=%s:%d", - ENTRY_TO_CONN(conn)->address, ENTRY_TO_CONN(conn)->port); - } else { - /* - * else leave it blank so control on AF_UNIX doesn't need to make - * something up. - */ - addrport_buf[0] = '\0'; - } - } else { - addrport_buf[0] = '\0'; - } - - if (tp == STREAM_EVENT_NEW_RESOLVE) { - purpose = " PURPOSE=DNS_REQUEST"; - } else if (tp == STREAM_EVENT_NEW) { - if (conn->use_begindir) { - connection_t *linked = ENTRY_TO_CONN(conn)->linked_conn; - int linked_dir_purpose = -1; - if (linked && linked->type == CONN_TYPE_DIR) - linked_dir_purpose = linked->purpose; - if (DIR_PURPOSE_IS_UPLOAD(linked_dir_purpose)) - purpose = " PURPOSE=DIR_UPLOAD"; - else - purpose = " PURPOSE=DIR_FETCH"; - } else - purpose = " PURPOSE=USER"; - } - - circ = circuit_get_by_edge_conn(ENTRY_TO_EDGE_CONN(conn)); - if (circ && CIRCUIT_IS_ORIGIN(circ)) - origin_circ = TO_ORIGIN_CIRCUIT(circ); - send_control_event(EVENT_STREAM_STATUS, ALL_FORMATS, - "650 STREAM "U64_FORMAT" %s %lu %s%s%s%s\r\n", - U64_PRINTF_ARG(ENTRY_TO_CONN(conn)->global_identifier), - status, - origin_circ? - (unsigned long)origin_circ->global_identifier : 0ul, - buf, reason_buf, addrport_buf, purpose); - - /* XXX need to specify its intended exit, etc? */ - - return 0; -} - -/** Figure out the best name for the target router of an OR connection - * conn, and write it into the len-character buffer - * name. */ -static void -orconn_target_get_name(char *name, size_t len, or_connection_t *conn) -{ - const node_t *node = node_get_by_id(conn->identity_digest); - if (node) { - tor_assert(len > MAX_VERBOSE_NICKNAME_LEN); - node_get_verbose_nickname(node, name); - } else if (! tor_digest_is_zero(conn->identity_digest)) { - name[0] = '$'; - base16_encode(name+1, len-1, conn->identity_digest, - DIGEST_LEN); - } else { - tor_snprintf(name, len, "%s:%d", - conn->base_.address, conn->base_.port); - } -} - -/** Called when the status of an OR connection conn changes: tell any - * interested control connections. tp is the new status for the - * connection. If conn has just closed or failed, then reason - * may be the reason why. - */ -int -control_event_or_conn_status(or_connection_t *conn, or_conn_status_event_t tp, - int reason) -{ - int ncircs = 0; - const char *status; - char name[128]; - char ncircs_buf[32] = {0}; /* > 8 + log10(2^32)=10 + 2 */ - - if (!EVENT_IS_INTERESTING(EVENT_OR_CONN_STATUS)) - return 0; - - switch (tp) - { - case OR_CONN_EVENT_LAUNCHED: status = "LAUNCHED"; break; - case OR_CONN_EVENT_CONNECTED: status = "CONNECTED"; break; - case OR_CONN_EVENT_FAILED: status = "FAILED"; break; - case OR_CONN_EVENT_CLOSED: status = "CLOSED"; break; - case OR_CONN_EVENT_NEW: status = "NEW"; break; - default: - log_warn(LD_BUG, "Unrecognized status code %d", (int)tp); - return 0; - } - if (conn->chan) { - ncircs = circuit_count_pending_on_channel(TLS_CHAN_TO_BASE(conn->chan)); - } else { - ncircs = 0; - } - ncircs += connection_or_get_num_circuits(conn); - if (ncircs && (tp == OR_CONN_EVENT_FAILED || tp == OR_CONN_EVENT_CLOSED)) { - tor_snprintf(ncircs_buf, sizeof(ncircs_buf), " NCIRCS=%d", ncircs); - } - - orconn_target_get_name(name, sizeof(name), conn); - send_control_event(EVENT_OR_CONN_STATUS, ALL_FORMATS, - "650 ORCONN %s %s%s%s%s ID="U64_FORMAT"\r\n", - name, status, - reason ? " REASON=" : "", - orconn_end_reason_to_control_string(reason), - ncircs_buf, - U64_PRINTF_ARG(conn->base_.global_identifier)); - - return 0; -} - -/** - * Print out STREAM_BW event for a single conn - */ -int -control_event_stream_bandwidth(edge_connection_t *edge_conn) -{ - circuit_t *circ; - origin_circuit_t *ocirc; - if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) { - if (!edge_conn->n_read && !edge_conn->n_written) - return 0; - - send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, - "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", - U64_PRINTF_ARG(edge_conn->base_.global_identifier), - (unsigned long)edge_conn->n_read, - (unsigned long)edge_conn->n_written); - - circ = circuit_get_by_edge_conn(edge_conn); - if (circ && CIRCUIT_IS_ORIGIN(circ)) { - ocirc = TO_ORIGIN_CIRCUIT(circ); - ocirc->n_read_circ_bw += edge_conn->n_read; - ocirc->n_written_circ_bw += edge_conn->n_written; - } - edge_conn->n_written = edge_conn->n_read = 0; - } - - return 0; -} - -/** A second or more has elapsed: tell any interested control - * connections how much bandwidth streams have used. */ -int -control_event_stream_bandwidth_used(void) -{ - if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) { - smartlist_t *conns = get_connection_array(); - edge_connection_t *edge_conn; - - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) - { - if (conn->type != CONN_TYPE_AP) - continue; - edge_conn = TO_EDGE_CONN(conn); - if (!edge_conn->n_read && !edge_conn->n_written) - continue; - - send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS, - "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n", - U64_PRINTF_ARG(edge_conn->base_.global_identifier), - (unsigned long)edge_conn->n_read, - (unsigned long)edge_conn->n_written); - - edge_conn->n_written = edge_conn->n_read = 0; - } - SMARTLIST_FOREACH_END(conn); - } - - return 0; -} - -/** A second or more has elapsed: tell any interested control connections - * how much bandwidth origin circuits have used. */ -int -control_event_circ_bandwidth_used(void) -{ - circuit_t *circ; - origin_circuit_t *ocirc; - if (!EVENT_IS_INTERESTING(EVENT_CIRC_BANDWIDTH_USED)) - return 0; - - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (!CIRCUIT_IS_ORIGIN(circ)) - continue; - ocirc = TO_ORIGIN_CIRCUIT(circ); - if (!ocirc->n_read_circ_bw && !ocirc->n_written_circ_bw) - continue; - send_control_event(EVENT_CIRC_BANDWIDTH_USED, ALL_FORMATS, - "650 CIRC_BW ID=%d READ=%lu WRITTEN=%lu\r\n", - ocirc->global_identifier, - (unsigned long)ocirc->n_read_circ_bw, - (unsigned long)ocirc->n_written_circ_bw); - ocirc->n_written_circ_bw = ocirc->n_read_circ_bw = 0; - } - - return 0; -} - -/** Print out CONN_BW event for a single OR/DIR/EXIT conn and reset - * bandwidth counters. */ -int -control_event_conn_bandwidth(connection_t *conn) -{ - const char *conn_type_str; - if (!get_options()->TestingEnableConnBwEvent || - !EVENT_IS_INTERESTING(EVENT_CONN_BW)) - return 0; - if (!conn->n_read_conn_bw && !conn->n_written_conn_bw) - return 0; - switch (conn->type) { - case CONN_TYPE_OR: - conn_type_str = "OR"; - break; - case CONN_TYPE_DIR: - conn_type_str = "DIR"; - break; - case CONN_TYPE_EXIT: - conn_type_str = "EXIT"; - break; - default: - return 0; - } - send_control_event(EVENT_CONN_BW, ALL_FORMATS, - "650 CONN_BW ID="U64_FORMAT" TYPE=%s " - "READ=%lu WRITTEN=%lu\r\n", - U64_PRINTF_ARG(conn->global_identifier), - conn_type_str, - (unsigned long)conn->n_read_conn_bw, - (unsigned long)conn->n_written_conn_bw); - conn->n_written_conn_bw = conn->n_read_conn_bw = 0; - return 0; -} - -/** A second or more has elapsed: tell any interested control - * connections how much bandwidth connections have used. */ -int -control_event_conn_bandwidth_used(void) -{ - if (get_options()->TestingEnableConnBwEvent && - EVENT_IS_INTERESTING(EVENT_CONN_BW)) { - SMARTLIST_FOREACH(get_connection_array(), connection_t *, conn, - control_event_conn_bandwidth(conn)); - } - return 0; -} - -/** Helper: iterate over cell statistics of circ and sum up added - * cells, removed cells, and waiting times by cell command and direction. - * Store results in cell_stats. Free cell statistics of the - * circuit afterwards. */ -void -sum_up_cell_stats_by_command(circuit_t *circ, cell_stats_t *cell_stats) -{ - memset(cell_stats, 0, sizeof(cell_stats_t)); - SMARTLIST_FOREACH_BEGIN(circ->testing_cell_stats, - testing_cell_stats_entry_t *, ent) { - tor_assert(ent->command <= CELL_COMMAND_MAX_); - if (!ent->removed && !ent->exitward) { - cell_stats->added_cells_appward[ent->command] += 1; - } else if (!ent->removed && ent->exitward) { - cell_stats->added_cells_exitward[ent->command] += 1; - } else if (!ent->exitward) { - cell_stats->removed_cells_appward[ent->command] += 1; - cell_stats->total_time_appward[ent->command] += ent->waiting_time * 10; - } else { - cell_stats->removed_cells_exitward[ent->command] += 1; - cell_stats->total_time_exitward[ent->command] += ent->waiting_time * 10; - } - tor_free(ent); - } SMARTLIST_FOREACH_END(ent); - smartlist_free(circ->testing_cell_stats); - circ->testing_cell_stats = NULL; -} - -/** Helper: append a cell statistics string to event_parts, - * prefixed with key=. Statistics consist of comma-separated - * key:value pairs with lower-case command strings as keys and cell - * numbers or total waiting times as values. A key:value pair is included - * if the entry in include_if_non_zero is not zero, but with - * the (possibly zero) entry from number_to_include. Both - * arrays are expected to have a length of CELL_COMMAND_MAX_ + 1. If no - * entry in include_if_non_zero is positive, no string will - * be added to event_parts. */ -void -append_cell_stats_by_command(smartlist_t *event_parts, const char *key, - const uint64_t *include_if_non_zero, - const uint64_t *number_to_include) -{ - smartlist_t *key_value_strings = smartlist_new(); - int i; - for (i = 0; i <= CELL_COMMAND_MAX_; i++) { - if (include_if_non_zero[i] > 0) { - smartlist_add_asprintf(key_value_strings, "%s:"U64_FORMAT, - cell_command_to_string(i), - U64_PRINTF_ARG(number_to_include[i])); - } - } - if (smartlist_len(key_value_strings) > 0) { - char *joined = smartlist_join_strings(key_value_strings, ",", 0, NULL); - smartlist_add_asprintf(event_parts, "%s=%s", key, joined); - SMARTLIST_FOREACH(key_value_strings, char *, cp, tor_free(cp)); - tor_free(joined); - } - smartlist_free(key_value_strings); -} - -/** Helper: format cell_stats for circ for inclusion in a - * CELL_STATS event and write result string to event_string. */ -void -format_cell_stats(char **event_string, circuit_t *circ, - cell_stats_t *cell_stats) -{ - smartlist_t *event_parts = smartlist_new(); - if (CIRCUIT_IS_ORIGIN(circ)) { - origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); - smartlist_add_asprintf(event_parts, "ID=%lu", - (unsigned long)ocirc->global_identifier); - } else if (TO_OR_CIRCUIT(circ)->p_chan) { - or_circuit_t *or_circ = TO_OR_CIRCUIT(circ); - smartlist_add_asprintf(event_parts, "InboundQueue=%lu", - (unsigned long)or_circ->p_circ_id); - smartlist_add_asprintf(event_parts, "InboundConn="U64_FORMAT, - U64_PRINTF_ARG(or_circ->p_chan->global_identifier)); - append_cell_stats_by_command(event_parts, "InboundAdded", - cell_stats->added_cells_appward, - cell_stats->added_cells_appward); - append_cell_stats_by_command(event_parts, "InboundRemoved", - cell_stats->removed_cells_appward, - cell_stats->removed_cells_appward); - append_cell_stats_by_command(event_parts, "InboundTime", - cell_stats->removed_cells_appward, - cell_stats->total_time_appward); - } - if (circ->n_chan) { - smartlist_add_asprintf(event_parts, "OutboundQueue=%lu", - (unsigned long)circ->n_circ_id); - smartlist_add_asprintf(event_parts, "OutboundConn="U64_FORMAT, - U64_PRINTF_ARG(circ->n_chan->global_identifier)); - append_cell_stats_by_command(event_parts, "OutboundAdded", - cell_stats->added_cells_exitward, - cell_stats->added_cells_exitward); - append_cell_stats_by_command(event_parts, "OutboundRemoved", - cell_stats->removed_cells_exitward, - cell_stats->removed_cells_exitward); - append_cell_stats_by_command(event_parts, "OutboundTime", - cell_stats->removed_cells_exitward, - cell_stats->total_time_exitward); - } - *event_string = smartlist_join_strings(event_parts, " ", 0, NULL); - SMARTLIST_FOREACH(event_parts, char *, cp, tor_free(cp)); - smartlist_free(event_parts); -} - -/** A second or more has elapsed: tell any interested control connection - * how many cells have been processed for a given circuit. */ -int -control_event_circuit_cell_stats(void) -{ - circuit_t *circ; - cell_stats_t *cell_stats; - char *event_string; - if (!get_options()->TestingEnableCellStatsEvent || - !EVENT_IS_INTERESTING(EVENT_CELL_STATS)) - return 0; - cell_stats = tor_malloc(sizeof(cell_stats_t));; - TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) { - if (!circ->testing_cell_stats) - continue; - sum_up_cell_stats_by_command(circ, cell_stats); - format_cell_stats(&event_string, circ, cell_stats); - send_control_event(EVENT_CELL_STATS, ALL_FORMATS, - "650 CELL_STATS %s\r\n", event_string); - tor_free(event_string); - } - tor_free(cell_stats); - return 0; -} - -/** Tokens in bucket have been refilled: the read bucket was empty - * for read_empty_time millis, the write bucket was empty for - * write_empty_time millis, and buckets were last refilled - * milliseconds_elapsed millis ago. Only emit TB_EMPTY event if - * either read or write bucket have been empty before. */ -int -control_event_tb_empty(const char *bucket, uint32_t read_empty_time, - uint32_t write_empty_time, - int milliseconds_elapsed) -{ - if (get_options()->TestingEnableTbEmptyEvent && - EVENT_IS_INTERESTING(EVENT_TB_EMPTY) && - (read_empty_time > 0 || write_empty_time > 0)) { - send_control_event(EVENT_TB_EMPTY, ALL_FORMATS, - "650 TB_EMPTY %s READ=%d WRITTEN=%d " - "LAST=%d\r\n", - bucket, read_empty_time, write_empty_time, - milliseconds_elapsed); - } - return 0; -} - -/** A second or more has elapsed: tell any interested control - * connections how much bandwidth we used. */ -int -control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) -{ - if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) { - send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS, - "650 BW %lu %lu\r\n", - (unsigned long)n_read, - (unsigned long)n_written); - } - - return 0; -} - -/** Called when we are sending a log message to the controllers: suspend - * sending further log messages to the controllers until we're done. Used by - * CONN_LOG_PROTECT. */ -void -disable_control_logging(void) -{ - ++disable_log_messages; -} - -/** We're done sending a log message to the controllers: re-enable controller - * logging. Used by CONN_LOG_PROTECT. */ -void -enable_control_logging(void) -{ - if (--disable_log_messages < 0) - tor_assert(0); -} - -/** We got a log message: tell any interested control connections. */ -void -control_event_logmsg(int severity, uint32_t domain, const char *msg) -{ - int event; - - /* Don't even think of trying to add stuff to a buffer from a cpuworker - * thread. */ - if (! in_main_thread()) - return; - - if (disable_log_messages) - return; - - if (domain == LD_BUG && EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL) && - severity <= LOG_NOTICE) { - char *esc = esc_for_log(msg); - ++disable_log_messages; - control_event_general_status(severity, "BUG REASON=%s", esc); - --disable_log_messages; - tor_free(esc); - } - - event = log_severity_to_event(severity); - if (event >= 0 && EVENT_IS_INTERESTING(event)) { - char *b = NULL; - const char *s; - if (strchr(msg, '\n')) { - char *cp; - b = tor_strdup(msg); - for (cp = b; *cp; ++cp) - if (*cp == '\r' || *cp == '\n') - *cp = ' '; - } - switch (severity) { - case LOG_DEBUG: s = "DEBUG"; break; - case LOG_INFO: s = "INFO"; break; - case LOG_NOTICE: s = "NOTICE"; break; - case LOG_WARN: s = "WARN"; break; - case LOG_ERR: s = "ERR"; break; - default: s = "UnknownLogSeverity"; break; - } - ++disable_log_messages; - send_control_event(event, ALL_FORMATS, "650 %s %s\r\n", s, b?b:msg); - --disable_log_messages; - tor_free(b); - } -} - -/** Called whenever we receive new router descriptors: tell any - * interested control connections. routers is a list of - * routerinfo_t's. - */ -int -control_event_descriptors_changed(smartlist_t *routers) -{ - char *msg; - - if (!EVENT_IS_INTERESTING(EVENT_NEW_DESC)) - return 0; - - { - smartlist_t *names = smartlist_new(); - char *ids; - SMARTLIST_FOREACH(routers, routerinfo_t *, ri, { - char *b = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1); - router_get_verbose_nickname(b, ri); - smartlist_add(names, b); - }); - ids = smartlist_join_strings(names, " ", 0, NULL); - tor_asprintf(&msg, "650 NEWDESC %s\r\n", ids); - send_control_event_string(EVENT_NEW_DESC, ALL_FORMATS, msg); - tor_free(ids); - tor_free(msg); - SMARTLIST_FOREACH(names, char *, cp, tor_free(cp)); - smartlist_free(names); - } - return 0; -} - -/** Called when an address mapping on from from changes to to. - * expires values less than 3 are special; see connection_edge.c. If - * error is non-NULL, it is an error code describing the failure - * mode of the mapping. - */ -int -control_event_address_mapped(const char *from, const char *to, time_t expires, - const char *error, const int cached) -{ - if (!EVENT_IS_INTERESTING(EVENT_ADDRMAP)) - return 0; - - if (expires < 3 || expires == TIME_MAX) - send_control_event(EVENT_ADDRMAP, ALL_FORMATS, - "650 ADDRMAP %s %s NEVER %s%s" - "CACHED=\"%s\"\r\n", - from, to, error?error:"", error?" ":"", - cached?"YES":"NO"); - else { - char buf[ISO_TIME_LEN+1]; - char buf2[ISO_TIME_LEN+1]; - format_local_iso_time(buf,expires); - format_iso_time(buf2,expires); - send_control_event(EVENT_ADDRMAP, ALL_FORMATS, - "650 ADDRMAP %s %s \"%s\"" - " %s%sEXPIRES=\"%s\" CACHED=\"%s\"\r\n", - from, to, buf, - error?error:"", error?" ":"", - buf2, cached?"YES":"NO"); - } - - return 0; -} - -/** The authoritative dirserver has received a new descriptor that - * has passed basic syntax checks and is properly self-signed. - * - * Notify any interested party of the new descriptor and what has - * been done with it, and also optionally give an explanation/reason. */ -int -control_event_or_authdir_new_descriptor(const char *action, - const char *desc, size_t desclen, - const char *msg) -{ - char firstline[1024]; - char *buf; - size_t totallen; - char *esc = NULL; - size_t esclen; - - if (!EVENT_IS_INTERESTING(EVENT_AUTHDIR_NEWDESCS)) - return 0; - - tor_snprintf(firstline, sizeof(firstline), - "650+AUTHDIR_NEWDESC=\r\n%s\r\n%s\r\n", - action, - msg ? msg : ""); - - /* Escape the server descriptor properly */ - esclen = write_escaped_data(desc, desclen, &esc); - - totallen = strlen(firstline) + esclen + 1; - buf = tor_malloc(totallen); - strlcpy(buf, firstline, totallen); - strlcpy(buf+strlen(firstline), esc, totallen); - send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, - buf); - send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS, - "650 OK\r\n"); - tor_free(esc); - tor_free(buf); - - return 0; -} - -/** Helper function for NS-style events. Constructs and sends an event - * of type event with string event_string out of the set of - * networkstatuses statuses. Currently it is used for NS events - * and NEWCONSENSUS events. */ -static int -control_event_networkstatus_changed_helper(smartlist_t *statuses, - uint16_t event, - const char *event_string) -{ - smartlist_t *strs; - char *s, *esc = NULL; - if (!EVENT_IS_INTERESTING(event) || !smartlist_len(statuses)) - return 0; - - strs = smartlist_new(); - smartlist_add(strs, tor_strdup("650+")); - smartlist_add(strs, tor_strdup(event_string)); - smartlist_add(strs, tor_strdup("\r\n")); - SMARTLIST_FOREACH(statuses, const routerstatus_t *, rs, - { - s = networkstatus_getinfo_helper_single(rs); - if (!s) continue; - smartlist_add(strs, s); - }); - - s = smartlist_join_strings(strs, "", 0, NULL); - write_escaped_data(s, strlen(s), &esc); - SMARTLIST_FOREACH(strs, char *, cp, tor_free(cp)); - smartlist_free(strs); - tor_free(s); - send_control_event_string(event, ALL_FORMATS, esc); - send_control_event_string(event, ALL_FORMATS, - "650 OK\r\n"); - - tor_free(esc); - return 0; -} - -/** Called when the routerstatus_ts statuses have changed: sends - * an NS event to any controller that cares. */ -int -control_event_networkstatus_changed(smartlist_t *statuses) -{ - return control_event_networkstatus_changed_helper(statuses, EVENT_NS, "NS"); -} - -/** Called when we get a new consensus networkstatus. Sends a NEWCONSENSUS - * event consisting of an NS-style line for each relay in the consensus. */ -int -control_event_newconsensus(const networkstatus_t *consensus) -{ - if (!control_event_is_interesting(EVENT_NEWCONSENSUS)) - return 0; - return control_event_networkstatus_changed_helper( - consensus->routerstatus_list, EVENT_NEWCONSENSUS, "NEWCONSENSUS"); -} - -/** Called when we compute a new circuitbuildtimeout */ -int -control_event_buildtimeout_set(buildtimeout_set_event_t type, - const char *args) -{ - const char *type_string = NULL; - - if (!control_event_is_interesting(EVENT_BUILDTIMEOUT_SET)) - return 0; - - switch (type) { - case BUILDTIMEOUT_SET_EVENT_COMPUTED: - type_string = "COMPUTED"; - break; - case BUILDTIMEOUT_SET_EVENT_RESET: - type_string = "RESET"; - break; - case BUILDTIMEOUT_SET_EVENT_SUSPENDED: - type_string = "SUSPENDED"; - break; - case BUILDTIMEOUT_SET_EVENT_DISCARD: - type_string = "DISCARD"; - break; - case BUILDTIMEOUT_SET_EVENT_RESUME: - type_string = "RESUME"; - break; - default: - type_string = "UNKNOWN"; - break; - } - - send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS, - "650 BUILDTIMEOUT_SET %s %s\r\n", - type_string, args); - - return 0; -} - -/** Called when a signal has been processed from signal_callback */ -int -control_event_signal(uintptr_t signal) -{ - const char *signal_string = NULL; - - if (!control_event_is_interesting(EVENT_SIGNAL)) - return 0; - - switch (signal) { - case SIGHUP: - signal_string = "RELOAD"; - break; - case SIGUSR1: - signal_string = "DUMP"; - break; - case SIGUSR2: - signal_string = "DEBUG"; - break; - case SIGNEWNYM: - signal_string = "NEWNYM"; - break; - case SIGCLEARDNSCACHE: - signal_string = "CLEARDNSCACHE"; - break; - default: - log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal", - (unsigned long)signal); - return -1; - } - - send_control_event(EVENT_SIGNAL, ALL_FORMATS, "650 SIGNAL %s\r\n", - signal_string); - return 0; -} - -/** Called when a single local_routerstatus_t has changed: Sends an NS event - * to any controller that cares. */ -int -control_event_networkstatus_changed_single(const routerstatus_t *rs) -{ - smartlist_t *statuses; - int r; - - if (!EVENT_IS_INTERESTING(EVENT_NS)) - return 0; - - statuses = smartlist_new(); - smartlist_add(statuses, (void*)rs); - r = control_event_networkstatus_changed(statuses); - smartlist_free(statuses); - return r; -} - -/** Our own router descriptor has changed; tell any controllers that care. - */ -int -control_event_my_descriptor_changed(void) -{ - send_control_event(EVENT_DESCCHANGED, ALL_FORMATS, "650 DESCCHANGED\r\n"); - return 0; -} - -/** Helper: sends a status event where type is one of - * EVENT_STATUS_{GENERAL,CLIENT,SERVER}, where severity is one of - * LOG_{NOTICE,WARN,ERR}, and where format is a printf-style format - * string corresponding to args. */ -static int -control_event_status(int type, int severity, const char *format, va_list args) -{ - char *user_buf = NULL; - char format_buf[160]; - const char *status, *sev; - - switch (type) { - case EVENT_STATUS_GENERAL: - status = "STATUS_GENERAL"; - break; - case EVENT_STATUS_CLIENT: - status = "STATUS_CLIENT"; - break; - case EVENT_STATUS_SERVER: - status = "STATUS_SERVER"; - break; - default: - log_warn(LD_BUG, "Unrecognized status type %d", type); - return -1; - } - switch (severity) { - case LOG_NOTICE: - sev = "NOTICE"; - break; - case LOG_WARN: - sev = "WARN"; - break; - case LOG_ERR: - sev = "ERR"; - break; - default: - log_warn(LD_BUG, "Unrecognized status severity %d", severity); - return -1; - } - if (tor_snprintf(format_buf, sizeof(format_buf), "650 %s %s", - status, sev)<0) { - log_warn(LD_BUG, "Format string too long."); - return -1; - } - tor_vasprintf(&user_buf, format, args); - - send_control_event(type, ALL_FORMATS, "%s %s\r\n", format_buf, user_buf); - tor_free(user_buf); - return 0; -} - -/** Format and send an EVENT_STATUS_GENERAL event whose main text is obtained - * by formatting the arguments using the printf-style format. */ -int -control_event_general_status(int severity, const char *format, ...) -{ - va_list ap; - int r; - if (!EVENT_IS_INTERESTING(EVENT_STATUS_GENERAL)) - return 0; - - va_start(ap, format); - r = control_event_status(EVENT_STATUS_GENERAL, severity, format, ap); - va_end(ap); - return r; -} - -/** Format and send an EVENT_STATUS_CLIENT event whose main text is obtained - * by formatting the arguments using the printf-style format. */ -int -control_event_client_status(int severity, const char *format, ...) -{ - va_list ap; - int r; - if (!EVENT_IS_INTERESTING(EVENT_STATUS_CLIENT)) - return 0; - - va_start(ap, format); - r = control_event_status(EVENT_STATUS_CLIENT, severity, format, ap); - va_end(ap); - return r; -} - -/** Format and send an EVENT_STATUS_SERVER event whose main text is obtained - * by formatting the arguments using the printf-style format. */ -int -control_event_server_status(int severity, const char *format, ...) -{ - va_list ap; - int r; - if (!EVENT_IS_INTERESTING(EVENT_STATUS_SERVER)) - return 0; - - va_start(ap, format); - r = control_event_status(EVENT_STATUS_SERVER, severity, format, ap); - va_end(ap); - return r; -} - -/** Called when the status of an entry guard with the given nickname - * and identity digest has changed to status: tells any - * controllers that care. */ -int -control_event_guard(const char *nickname, const char *digest, - const char *status) -{ - char hbuf[HEX_DIGEST_LEN+1]; - base16_encode(hbuf, sizeof(hbuf), digest, DIGEST_LEN); - if (!EVENT_IS_INTERESTING(EVENT_GUARD)) - return 0; - - { - char buf[MAX_VERBOSE_NICKNAME_LEN+1]; - const node_t *node = node_get_by_id(digest); - if (node) { - node_get_verbose_nickname(node, buf); - } else { - tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname); - } - send_control_event(EVENT_GUARD, ALL_FORMATS, - "650 GUARD ENTRY %s %s\r\n", buf, status); - } - return 0; -} - -/** Called when a configuration option changes. This is generally triggered - * by SETCONF requests and RELOAD/SIGHUP signals. The elements is - * a smartlist_t containing (key, value, ...) pairs in sequence. - * value can be NULL. */ -int -control_event_conf_changed(const smartlist_t *elements) -{ - int i; - char *result; - smartlist_t *lines; - if (!EVENT_IS_INTERESTING(EVENT_CONF_CHANGED) || - smartlist_len(elements) == 0) { - return 0; - } - lines = smartlist_new(); - for (i = 0; i < smartlist_len(elements); i += 2) { - char *k = smartlist_get(elements, i); - char *v = smartlist_get(elements, i+1); - if (v == NULL) { - smartlist_add_asprintf(lines, "650-%s", k); - } else { - smartlist_add_asprintf(lines, "650-%s=%s", k, v); - } - } - result = smartlist_join_strings(lines, "\r\n", 0, NULL); - send_control_event(EVENT_CONF_CHANGED, 0, - "650-CONF_CHANGED\r\n%s\r\n650 OK\r\n", result); - tor_free(result); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); - return 0; -} - -/** Helper: Return a newly allocated string containing a path to the - * file where we store our authentication cookie. */ -static char * -get_cookie_file(void) -{ - const or_options_t *options = get_options(); - if (options->CookieAuthFile && strlen(options->CookieAuthFile)) { - return tor_strdup(options->CookieAuthFile); - } else { - return get_datadir_fname("control_auth_cookie"); - } -} - -/* Initialize the cookie-based authentication system of the - * ControlPort. If enabled is 0, then disable the cookie - * authentication system. */ -int -init_control_cookie_authentication(int enabled) -{ - char *fname = NULL; - int retval; - - if (!enabled) { - authentication_cookie_is_set = 0; - return 0; - } - - fname = get_cookie_file(); - retval = init_cookie_authentication(fname, "", /* no header */ - AUTHENTICATION_COOKIE_LEN, - &authentication_cookie, - &authentication_cookie_is_set); - tor_free(fname); - return retval; -} - -/** A copy of the process specifier of Tor's owning controller, or - * NULL if this Tor instance is not currently owned by a process. */ -static char *owning_controller_process_spec = NULL; - -/** A process-termination monitor for Tor's owning controller, or NULL - * if this Tor instance is not currently owned by a process. */ -static tor_process_monitor_t *owning_controller_process_monitor = NULL; - -/** Process-termination monitor callback for Tor's owning controller - * process. */ -static void -owning_controller_procmon_cb(void *unused) -{ - (void)unused; - - lost_owning_controller("process", "vanished"); -} - -/** Set process_spec as Tor's owning controller process. - * Exit on failure. */ -void -monitor_owning_controller_process(const char *process_spec) -{ - const char *msg; - - tor_assert((owning_controller_process_spec == NULL) == - (owning_controller_process_monitor == NULL)); - - if (owning_controller_process_spec != NULL) { - if ((process_spec != NULL) && !strcmp(process_spec, - owning_controller_process_spec)) { - /* Same process -- return now, instead of disposing of and - * recreating the process-termination monitor. */ - return; - } - - /* We are currently owned by a process, and we should no longer be - * owned by it. Free the process-termination monitor. */ - tor_process_monitor_free(owning_controller_process_monitor); - owning_controller_process_monitor = NULL; - - tor_free(owning_controller_process_spec); - owning_controller_process_spec = NULL; - } - - tor_assert((owning_controller_process_spec == NULL) && - (owning_controller_process_monitor == NULL)); - - if (process_spec == NULL) - return; - - owning_controller_process_spec = tor_strdup(process_spec); - owning_controller_process_monitor = - tor_process_monitor_new(tor_libevent_get_base(), - owning_controller_process_spec, - LD_CONTROL, - owning_controller_procmon_cb, NULL, - &msg); - - if (owning_controller_process_monitor == NULL) { - log_err(LD_BUG, "Couldn't create process-termination monitor for " - "owning controller: %s. Exiting.", - msg); - owning_controller_process_spec = NULL; - tor_cleanup(); - exit(0); - } -} - -/** Convert the name of a bootstrapping phase s into strings - * tag and summary suitable for display by the controller. */ -static int -bootstrap_status_to_string(bootstrap_status_t s, const char **tag, - const char **summary) -{ - switch (s) { - case BOOTSTRAP_STATUS_UNDEF: - *tag = "undef"; - *summary = "Undefined"; - break; - case BOOTSTRAP_STATUS_STARTING: - *tag = "starting"; - *summary = "Starting"; - break; - case BOOTSTRAP_STATUS_CONN_DIR: - *tag = "conn_dir"; - *summary = "Connecting to directory server"; - break; - case BOOTSTRAP_STATUS_HANDSHAKE: - *tag = "status_handshake"; - *summary = "Finishing handshake"; - break; - case BOOTSTRAP_STATUS_HANDSHAKE_DIR: - *tag = "handshake_dir"; - *summary = "Finishing handshake with directory server"; - break; - case BOOTSTRAP_STATUS_ONEHOP_CREATE: - *tag = "onehop_create"; - *summary = "Establishing an encrypted directory connection"; - break; - case BOOTSTRAP_STATUS_REQUESTING_STATUS: - *tag = "requesting_status"; - *summary = "Asking for networkstatus consensus"; - break; - case BOOTSTRAP_STATUS_LOADING_STATUS: - *tag = "loading_status"; - *summary = "Loading networkstatus consensus"; - break; - case BOOTSTRAP_STATUS_LOADING_KEYS: - *tag = "loading_keys"; - *summary = "Loading authority key certs"; - break; - case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS: - *tag = "requesting_descriptors"; - *summary = "Asking for relay descriptors"; - break; - case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS: - *tag = "loading_descriptors"; - *summary = "Loading relay descriptors"; - break; - case BOOTSTRAP_STATUS_CONN_OR: - *tag = "conn_or"; - *summary = "Connecting to the Tor network"; - break; - case BOOTSTRAP_STATUS_HANDSHAKE_OR: - *tag = "handshake_or"; - *summary = "Finishing handshake with first hop"; - break; - case BOOTSTRAP_STATUS_CIRCUIT_CREATE: - *tag = "circuit_create"; - *summary = "Establishing a Tor circuit"; - break; - case BOOTSTRAP_STATUS_DONE: - *tag = "done"; - *summary = "Done"; - break; - default: -// log_warn(LD_BUG, "Unrecognized bootstrap status code %d", s); - *tag = *summary = "unknown"; - return -1; - } - return 0; -} - -/** What percentage through the bootstrap process are we? We remember - * this so we can avoid sending redundant bootstrap status events, and - * so we can guess context for the bootstrap messages which are - * ambiguous. It starts at 'undef', but gets set to 'starting' while - * Tor initializes. */ -static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF; - -/** How many problems have we had getting to the next bootstrapping phase? - * These include failure to establish a connection to a Tor relay, - * failures to finish the TLS handshake, failures to validate the - * consensus document, etc. */ -static int bootstrap_problems = 0; - -/* We only tell the controller once we've hit a threshold of problems - * for the current phase. */ -#define BOOTSTRAP_PROBLEM_THRESHOLD 10 - -/** Called when Tor has made progress at bootstrapping its directory - * information and initial circuits. - * - * status is the new status, that is, what task we will be doing - * next. progress is zero if we just started this task, else it - * represents progress on the task. */ -void -control_event_bootstrap(bootstrap_status_t status, int progress) -{ - const char *tag, *summary; - char buf[BOOTSTRAP_MSG_LEN]; - - if (bootstrap_percent == BOOTSTRAP_STATUS_DONE) - return; /* already bootstrapped; nothing to be done here. */ - - /* special case for handshaking status, since our TLS handshaking code - * can't distinguish what the connection is going to be for. */ - if (status == BOOTSTRAP_STATUS_HANDSHAKE) { - if (bootstrap_percent < BOOTSTRAP_STATUS_CONN_OR) { - status = BOOTSTRAP_STATUS_HANDSHAKE_DIR; - } else { - status = BOOTSTRAP_STATUS_HANDSHAKE_OR; - } - } - - if (status > bootstrap_percent || - (progress && progress > bootstrap_percent)) { - bootstrap_status_to_string(status, &tag, &summary); - tor_log(status ? LOG_NOTICE : LOG_INFO, LD_CONTROL, - "Bootstrapped %d%%: %s.", progress ? progress : status, summary); - tor_snprintf(buf, sizeof(buf), - "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\"", - progress ? progress : status, tag, summary); - tor_snprintf(last_sent_bootstrap_message, - sizeof(last_sent_bootstrap_message), - "NOTICE %s", buf); - control_event_client_status(LOG_NOTICE, "%s", buf); - if (status > bootstrap_percent) { - bootstrap_percent = status; /* new milestone reached */ - } - if (progress > bootstrap_percent) { - /* incremental progress within a milestone */ - bootstrap_percent = progress; - bootstrap_problems = 0; /* Progress! Reset our problem counter. */ - } - } -} - -/** Called when Tor has failed to make bootstrapping progress in a way - * that indicates a problem. warn gives a hint as to why, and - * reason provides an "or_conn_end_reason" tag. - */ -MOCK_IMPL(void, -control_event_bootstrap_problem, (const char *warn, int reason)) -{ - int status = bootstrap_percent; - const char *tag, *summary; - char buf[BOOTSTRAP_MSG_LEN]; - const char *recommendation = "ignore"; - int severity; - - /* bootstrap_percent must not be in "undefined" state here. */ - tor_assert(status >= 0); - - if (bootstrap_percent == 100) - return; /* already bootstrapped; nothing to be done here. */ - - bootstrap_problems++; - - if (bootstrap_problems >= BOOTSTRAP_PROBLEM_THRESHOLD) - recommendation = "warn"; - - if (reason == END_OR_CONN_REASON_NO_ROUTE) - recommendation = "warn"; - - if (get_options()->UseBridges && - !any_bridge_descriptors_known() && - !any_pending_bridge_descriptor_fetches()) - recommendation = "warn"; - - if (we_are_hibernating()) - recommendation = "ignore"; - - while (status>=0 && bootstrap_status_to_string(status, &tag, &summary) < 0) - status--; /* find a recognized status string based on current progress */ - status = bootstrap_percent; /* set status back to the actual number */ - - severity = !strcmp(recommendation, "warn") ? LOG_WARN : LOG_INFO; - - log_fn(severity, - LD_CONTROL, "Problem bootstrapping. Stuck at %d%%: %s. (%s; %s; " - "count %d; recommendation %s)", - status, summary, warn, - orconn_end_reason_to_control_string(reason), - bootstrap_problems, recommendation); - - connection_or_report_broken_states(severity, LD_HANDSHAKE); - - tor_snprintf(buf, sizeof(buf), - "BOOTSTRAP PROGRESS=%d TAG=%s SUMMARY=\"%s\" WARNING=\"%s\" REASON=%s " - "COUNT=%d RECOMMENDATION=%s", - bootstrap_percent, tag, summary, warn, - orconn_end_reason_to_control_string(reason), bootstrap_problems, - recommendation); - tor_snprintf(last_sent_bootstrap_message, - sizeof(last_sent_bootstrap_message), - "WARN %s", buf); - control_event_client_status(LOG_WARN, "%s", buf); -} - -/** We just generated a new summary of which countries we've seen clients - * from recently. Send a copy to the controller in case it wants to - * display it for the user. */ -void -control_event_clients_seen(const char *controller_str) -{ - send_control_event(EVENT_CLIENTS_SEEN, 0, - "650 CLIENTS_SEEN %s\r\n", controller_str); -} - -/** A new pluggable transport called transport_name was - * launched on addr:port. mode is either - * "server" or "client" depending on the mode of the pluggable - * transport. - * "650" SP "TRANSPORT_LAUNCHED" SP Mode SP Name SP Address SP Port - */ -void -control_event_transport_launched(const char *mode, const char *transport_name, - tor_addr_t *addr, uint16_t port) -{ - send_control_event(EVENT_TRANSPORT_LAUNCHED, ALL_FORMATS, - "650 TRANSPORT_LAUNCHED %s %s %s %u\r\n", - mode, transport_name, fmt_addr(addr), port); -} - -/** Convert rendezvous auth type to string for HS_DESC control events - */ -const char * -rend_auth_type_to_string(rend_auth_type_t auth_type) -{ - const char *str; - - switch (auth_type) { - case REND_NO_AUTH: - str = "NO_AUTH"; - break; - case REND_BASIC_AUTH: - str = "BASIC_AUTH"; - break; - case REND_STEALTH_AUTH: - str = "STEALTH_AUTH"; - break; - default: - str = "UNKNOWN"; - } - - return str; -} - -/** Return a longname the node whose identity is id_digest. If - * node_get_by_id() returns NULL, base 16 encoding of id_digest is - * returned instead. - * - * This function is not thread-safe. Each call to this function invalidates - * previous values returned by this function. - */ -MOCK_IMPL(const char *, -node_describe_longname_by_id,(const char *id_digest)) -{ - static char longname[MAX_VERBOSE_NICKNAME_LEN+1]; - node_get_verbose_nickname_by_id(id_digest, longname); - return longname; -} - -/** send HS_DESC requested event. - * - * rend_query is used to fetch requested onion address and auth type. - * hs_dir is the description of contacting hs directory. - * desc_id_base32 is the ID of requested hs descriptor. - */ -void -control_event_hs_descriptor_requested(const rend_data_t *rend_query, - const char *id_digest, - const char *desc_id_base32) -{ - if (!id_digest || !rend_query || !desc_id_base32) { - log_warn(LD_BUG, "Called with rend_query==%p, " - "id_digest==%p, desc_id_base32==%p", - rend_query, id_digest, desc_id_base32); - return; - } - - send_control_event(EVENT_HS_DESC, ALL_FORMATS, - "650 HS_DESC REQUESTED %s %s %s %s\r\n", - rend_query->onion_address, - rend_auth_type_to_string(rend_query->auth_type), - node_describe_longname_by_id(id_digest), - desc_id_base32); -} - -/** send HS_DESC event after got response from hs directory. - * - * NOTE: this is an internal function used by following functions: - * control_event_hs_descriptor_received - * control_event_hs_descriptor_failed - * - * So do not call this function directly. - */ -void -control_event_hs_descriptor_receive_end(const char *action, - const rend_data_t *rend_query, - const char *id_digest) -{ - if (!action || !rend_query || !id_digest) { - log_warn(LD_BUG, "Called with action==%p, rend_query==%p, " - "id_digest==%p", action, rend_query, id_digest); - return; - } - - send_control_event(EVENT_HS_DESC, ALL_FORMATS, - "650 HS_DESC %s %s %s %s\r\n", - action, - rend_query->onion_address, - rend_auth_type_to_string(rend_query->auth_type), - node_describe_longname_by_id(id_digest)); -} - -/** send HS_DESC RECEIVED event - * - * called when a we successfully received a hidden service descriptor. - */ -void -control_event_hs_descriptor_received(const rend_data_t *rend_query, - const char *id_digest) -{ - if (!rend_query || !id_digest) { - log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p", - rend_query, id_digest); - return; - } - control_event_hs_descriptor_receive_end("RECEIVED", rend_query, id_digest); -} - -/** send HS_DESC FAILED event - * - * called when request for hidden service descriptor returned failure. - */ -void -control_event_hs_descriptor_failed(const rend_data_t *rend_query, - const char *id_digest) -{ - if (!rend_query || !id_digest) { - log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p", - rend_query, id_digest); - return; - } - control_event_hs_descriptor_receive_end("FAILED", rend_query, id_digest); -} - -/** Free any leftover allocated memory of the control.c subsystem. */ -void -control_free_all(void) -{ - if (authentication_cookie) /* Free the auth cookie */ - tor_free(authentication_cookie); -} - -#ifdef TOR_UNIT_TESTS -/* For testing: change the value of global_event_mask */ -void -control_testing_set_global_event_mask(uint64_t mask) -{ - global_event_mask = mask; -} -#endif - diff --git a/src/tor/control.h b/src/tor/control.h deleted file mode 100644 index 0466de17f..000000000 --- a/src/tor/control.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file control.h - * \brief Header file for control.c. - **/ - -#ifndef TOR_CONTROL_H -#define TOR_CONTROL_H - -void control_update_global_event_mask(void); -void control_adjust_event_log_severity(void); - -void control_ports_write_to_file(void); - -/** Log information about the connection conn, protecting it as with - * CONN_LOG_PROTECT. Example: - * - * LOG_FN_CONN(conn, (LOG_DEBUG, "Socket %d wants to write", conn->s)); - **/ -#define LOG_FN_CONN(conn, args) \ - CONN_LOG_PROTECT(conn, log_fn args) - -int connection_control_finished_flushing(control_connection_t *conn); -int connection_control_reached_eof(control_connection_t *conn); -void connection_control_closed(control_connection_t *conn); - -int connection_control_process_inbuf(control_connection_t *conn); - -#define EVENT_AUTHDIR_NEWDESCS 0x000D -#define EVENT_NS 0x000F -int control_event_is_interesting(int event); - -int control_event_circuit_status(origin_circuit_t *circ, - circuit_status_event_t e, int reason); -int control_event_circuit_purpose_changed(origin_circuit_t *circ, - int old_purpose); -int control_event_circuit_cannibalized(origin_circuit_t *circ, - int old_purpose, - const struct timeval *old_tv_created); -int control_event_stream_status(entry_connection_t *conn, - stream_status_event_t e, - int reason); -int control_event_or_conn_status(or_connection_t *conn, - or_conn_status_event_t e, int reason); -int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written); -int control_event_stream_bandwidth(edge_connection_t *edge_conn); -int control_event_stream_bandwidth_used(void); -int control_event_circ_bandwidth_used(void); -int control_event_conn_bandwidth(connection_t *conn); -int control_event_conn_bandwidth_used(void); -int control_event_circuit_cell_stats(void); -int control_event_tb_empty(const char *bucket, uint32_t read_empty_time, - uint32_t write_empty_time, - int milliseconds_elapsed); -void control_event_logmsg(int severity, uint32_t domain, const char *msg); -int control_event_descriptors_changed(smartlist_t *routers); -int control_event_address_mapped(const char *from, const char *to, - time_t expires, const char *error, - const int cached); -int control_event_or_authdir_new_descriptor(const char *action, - const char *desc, - size_t desclen, - const char *msg); -int control_event_my_descriptor_changed(void); -int control_event_networkstatus_changed(smartlist_t *statuses); - -int control_event_newconsensus(const networkstatus_t *consensus); -int control_event_networkstatus_changed_single(const routerstatus_t *rs); -int control_event_general_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_client_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_server_status(int severity, const char *format, ...) - CHECK_PRINTF(2,3); -int control_event_guard(const char *nickname, const char *digest, - const char *status); -int control_event_conf_changed(const smartlist_t *elements); -int control_event_buildtimeout_set(buildtimeout_set_event_t type, - const char *args); -int control_event_signal(uintptr_t signal); - -int init_control_cookie_authentication(int enabled); -smartlist_t *decode_hashed_passwords(config_line_t *passwords); -void disable_control_logging(void); -void enable_control_logging(void); - -void monitor_owning_controller_process(const char *process_spec); - -void control_event_bootstrap(bootstrap_status_t status, int progress); -MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn, - int reason)); - -void control_event_clients_seen(const char *controller_str); -void control_event_transport_launched(const char *mode, - const char *transport_name, - tor_addr_t *addr, uint16_t port); -const char *rend_auth_type_to_string(rend_auth_type_t auth_type); -MOCK_DECL(const char *, node_describe_longname_by_id,(const char *id_digest)); -void control_event_hs_descriptor_requested(const rend_data_t *rend_query, - const char *desc_id_base32, - const char *hs_dir); -void control_event_hs_descriptor_receive_end(const char *action, - const rend_data_t *rend_query, - const char *hs_dir); -void control_event_hs_descriptor_received(const rend_data_t *rend_query, - const char *hs_dir); -void control_event_hs_descriptor_failed(const rend_data_t *rend_query, - const char *hs_dir); - -void control_free_all(void); - -#ifdef CONTROL_PRIVATE -/* Recognized asynchronous event types. It's okay to expand this list - * because it is used both as a list of v0 event types, and as indices - * into the bitfield to determine which controllers want which events. - */ -#define EVENT_MIN_ 0x0001 -#define EVENT_CIRCUIT_STATUS 0x0001 -#define EVENT_STREAM_STATUS 0x0002 -#define EVENT_OR_CONN_STATUS 0x0003 -#define EVENT_BANDWIDTH_USED 0x0004 -#define EVENT_CIRCUIT_STATUS_MINOR 0x0005 -#define EVENT_NEW_DESC 0x0006 -#define EVENT_DEBUG_MSG 0x0007 -#define EVENT_INFO_MSG 0x0008 -#define EVENT_NOTICE_MSG 0x0009 -#define EVENT_WARN_MSG 0x000A -#define EVENT_ERR_MSG 0x000B -#define EVENT_ADDRMAP 0x000C -/* Exposed above */ -// #define EVENT_AUTHDIR_NEWDESCS 0x000D -#define EVENT_DESCCHANGED 0x000E -/* Exposed above */ -// #define EVENT_NS 0x000F -#define EVENT_STATUS_CLIENT 0x0010 -#define EVENT_STATUS_SERVER 0x0011 -#define EVENT_STATUS_GENERAL 0x0012 -#define EVENT_GUARD 0x0013 -#define EVENT_STREAM_BANDWIDTH_USED 0x0014 -#define EVENT_CLIENTS_SEEN 0x0015 -#define EVENT_NEWCONSENSUS 0x0016 -#define EVENT_BUILDTIMEOUT_SET 0x0017 -#define EVENT_SIGNAL 0x0018 -#define EVENT_CONF_CHANGED 0x0019 -#define EVENT_CONN_BW 0x001A -#define EVENT_CELL_STATS 0x001B -#define EVENT_TB_EMPTY 0x001C -#define EVENT_CIRC_BANDWIDTH_USED 0x001D -#define EVENT_TRANSPORT_LAUNCHED 0x0020 -#define EVENT_HS_DESC 0x0021 -#define EVENT_MAX_ 0x0021 -/* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a - * different structure. */ - -/* Used only by control.c and test.c */ -STATIC size_t write_escaped_data(const char *data, size_t len, char **out); -STATIC size_t read_escaped_data(const char *data, size_t len, char **out); -/** Flag for event_format_t. Indicates that we should use the one standard - format. (Other formats previous existed, and are now deprecated) - */ -#define ALL_FORMATS 1 -/** Bit field of flags to select how to format a controller event. Recognized - * flag is ALL_FORMATS. */ -typedef int event_format_t; - -#ifdef TOR_UNIT_TESTS -MOCK_DECL(STATIC void, -send_control_event_string,(uint16_t event, event_format_t which, - const char *msg)); - -void control_testing_set_global_event_mask(uint64_t mask); -#endif - -/** Helper structure: temporarily stores cell statistics for a circuit. */ -typedef struct cell_stats_t { - /** Number of cells added in app-ward direction by command. */ - uint64_t added_cells_appward[CELL_COMMAND_MAX_ + 1]; - /** Number of cells added in exit-ward direction by command. */ - uint64_t added_cells_exitward[CELL_COMMAND_MAX_ + 1]; - /** Number of cells removed in app-ward direction by command. */ - uint64_t removed_cells_appward[CELL_COMMAND_MAX_ + 1]; - /** Number of cells removed in exit-ward direction by command. */ - uint64_t removed_cells_exitward[CELL_COMMAND_MAX_ + 1]; - /** Total waiting time of cells in app-ward direction by command. */ - uint64_t total_time_appward[CELL_COMMAND_MAX_ + 1]; - /** Total waiting time of cells in exit-ward direction by command. */ - uint64_t total_time_exitward[CELL_COMMAND_MAX_ + 1]; -} cell_stats_t; -void sum_up_cell_stats_by_command(circuit_t *circ, - cell_stats_t *cell_stats); -void append_cell_stats_by_command(smartlist_t *event_parts, - const char *key, - const uint64_t *include_if_non_zero, - const uint64_t *number_to_include); -void format_cell_stats(char **event_string, circuit_t *circ, - cell_stats_t *cell_stats); -#endif - -#endif - diff --git a/src/tor/cpuworker.c b/src/tor/cpuworker.c deleted file mode 100644 index 9611c3bdf..000000000 --- a/src/tor/cpuworker.c +++ /dev/null @@ -1,718 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file cpuworker.c - * \brief Implements a farm of 'CPU worker' processes to perform - * CPU-intensive tasks in another thread or process, to not - * interrupt the main thread. - * - * Right now, we only use this for processing onionskins. - **/ -#include "or.h" -#include "buffers.h" -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "cpuworker.h" -#include "onion_main.h" -#include "onion.h" -#include "rephist.h" -#include "router.h" - -/** The maximum number of cpuworker processes we will keep around. */ -#define MAX_CPUWORKERS 16 -/** The minimum number of cpuworker processes we will keep around. */ -#define MIN_CPUWORKERS 1 - -/** The tag specifies which circuit this onionskin was from. */ -#define TAG_LEN 12 - -/** How many cpuworkers we have running right now. */ -static int num_cpuworkers=0; -/** How many of the running cpuworkers have an assigned task right now. */ -static int num_cpuworkers_busy=0; -/** We need to spawn new cpuworkers whenever we rotate the onion keys - * on platforms where execution contexts==processes. This variable stores - * the last time we got a key rotation event. */ -static time_t last_rotation_time=0; - -static void cpuworker_main(void *data) ATTR_NORETURN; -static int spawn_cpuworker(void); -static void spawn_enough_cpuworkers(void); -static void process_pending_task(connection_t *cpuworker); - -/** Initialize the cpuworker subsystem. - */ -void -cpu_init(void) -{ - cpuworkers_rotate(); -} - -/** Called when we're done sending a request to a cpuworker. */ -int -connection_cpu_finished_flushing(connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->type == CONN_TYPE_CPUWORKER); - return 0; -} - -/** Pack global_id and circ_id; set *tag to the result. (See note on - * cpuworker_main for wire format.) */ -static void -tag_pack(uint8_t *tag, uint64_t chan_id, circid_t circ_id) -{ - /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/ - /*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/ - set_uint64(tag, chan_id); - set_uint32(tag+8, circ_id); -} - -/** Unpack tag into addr, port, and circ_id. - */ -static void -tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id) -{ - *chan_id = get_uint64(tag); - *circ_id = get_uint32(tag+8); -} - -/** Magic numbers to make sure our cpuworker_requests don't grow any - * mis-framing bugs. */ -#define CPUWORKER_REQUEST_MAGIC 0xda4afeed -#define CPUWORKER_REPLY_MAGIC 0x5eedf00d - -/** A request sent to a cpuworker. */ -typedef struct cpuworker_request_t { - /** Magic number; must be CPUWORKER_REQUEST_MAGIC. */ - uint32_t magic; - /** Opaque tag to identify the job */ - uint8_t tag[TAG_LEN]; - /** Task code. Must be one of CPUWORKER_TASK_* */ - uint8_t task; - - /** Flag: Are we timing this request? */ - unsigned timed : 1; - /** If we're timing this request, when was it sent to the cpuworker? */ - struct timeval started_at; - - /** A create cell for the cpuworker to process. */ - create_cell_t create_cell; - - /* Turn the above into a tagged union if needed. */ -} cpuworker_request_t; - -/** A reply sent by a cpuworker. */ -typedef struct cpuworker_reply_t { - /** Magic number; must be CPUWORKER_REPLY_MAGIC. */ - uint32_t magic; - /** Opaque tag to identify the job; matches the request's tag.*/ - uint8_t tag[TAG_LEN]; - /** True iff we got a successful request. */ - uint8_t success; - - /** Are we timing this request? */ - unsigned int timed : 1; - /** What handshake type was the request? (Used for timing) */ - uint16_t handshake_type; - /** When did we send the request to the cpuworker? */ - struct timeval started_at; - /** Once the cpuworker received the request, how many microseconds did it - * take? (This shouldn't overflow; 4 billion micoseconds is over an hour, - * and we'll never have an onion handshake that takes so long.) */ - uint32_t n_usec; - - /** Output of processing a create cell - * - * @{ - */ - /** The created cell to send back. */ - created_cell_t created_cell; - /** The keys to use on this circuit. */ - uint8_t keys[CPATH_KEY_MATERIAL_LEN]; - /** Input to use for authenticating introduce1 cells. */ - uint8_t rend_auth_material[DIGEST_LEN]; -} cpuworker_reply_t; - -/** Called when the onion key has changed and we need to spawn new - * cpuworkers. Close all currently idle cpuworkers, and mark the last - * rotation time as now. - */ -void -cpuworkers_rotate(void) -{ - connection_t *cpuworker; - while ((cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, - CPUWORKER_STATE_IDLE))) { - connection_mark_for_close(cpuworker); - --num_cpuworkers; - } - last_rotation_time = time(NULL); - if (server_mode(get_options())) - spawn_enough_cpuworkers(); -} - -/** If the cpuworker closes the connection, - * mark it as closed and spawn a new one as needed. */ -int -connection_cpu_reached_eof(connection_t *conn) -{ - log_warn(LD_GENERAL,"Read eof. CPU worker died unexpectedly."); - if (conn->state != CPUWORKER_STATE_IDLE) { - /* the circ associated with this cpuworker will have to wait until - * it gets culled in run_connection_housekeeping(), since we have - * no way to find out which circ it was. */ - log_warn(LD_GENERAL,"...and it left a circuit queued; abandoning circ."); - num_cpuworkers_busy--; - } - num_cpuworkers--; - spawn_enough_cpuworkers(); /* try to regrow. hope we don't end up - spinning. */ - connection_mark_for_close(conn); - return 0; -} - -/** Indexed by handshake type: how many onionskins have we processed and - * counted of that type? */ -static uint64_t onionskins_n_processed[MAX_ONION_HANDSHAKE_TYPE+1]; -/** Indexed by handshake type, corresponding to the onionskins counted in - * onionskins_n_processed: how many microseconds have we spent in cpuworkers - * processing that kind of onionskin? */ -static uint64_t onionskins_usec_internal[MAX_ONION_HANDSHAKE_TYPE+1]; -/** Indexed by handshake type, corresponding to onionskins counted in - * onionskins_n_processed: how many microseconds have we spent waiting for - * cpuworkers to give us answers for that kind of onionskin? - */ -static uint64_t onionskins_usec_roundtrip[MAX_ONION_HANDSHAKE_TYPE+1]; - -/** If any onionskin takes longer than this, we clip them to this - * time. (microseconds) */ -#define MAX_BELIEVABLE_ONIONSKIN_DELAY (2*1000*1000) - -static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT; - -/** Return true iff we'd like to measure a handshake of type - * onionskin_type. Call only from the main thread. */ -static int -should_time_request(uint16_t onionskin_type) -{ - /* If we've never heard of this type, we shouldn't even be here. */ - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) - return 0; - /* Measure the first N handshakes of each type, to ensure we have a - * sample */ - if (onionskins_n_processed[onionskin_type] < 4096) - return 1; - /** Otherwise, measure with P=1/128. We avoid doing this for every - * handshake, since the measurement itself can take a little time. */ - return tor_weak_random_one_in_n(&request_sample_rng, 128); -} - -/** Return an estimate of how many microseconds we will need for a single - * cpuworker to to process n_requests onionskins of type - * onionskin_type. */ -uint64_t -estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type) -{ - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ - return 1000 * (uint64_t)n_requests; - if (PREDICT_UNLIKELY(onionskins_n_processed[onionskin_type] < 100)) { - /* Until we have 100 data points, just asssume everything takes 1 msec. */ - return 1000 * (uint64_t)n_requests; - } else { - /* This can't overflow: we'll never have more than 500000 onionskins - * measured in onionskin_usec_internal, and they won't take anything near - * 1 sec each, and we won't have anything like 1 million queued - * onionskins. But that's 5e5 * 1e6 * 1e6, which is still less than - * UINT64_MAX. */ - return (onionskins_usec_internal[onionskin_type] * n_requests) / - onionskins_n_processed[onionskin_type]; - } -} - -/** Compute the absolute and relative overhead of using the cpuworker - * framework for onionskins of type onionskin_type.*/ -static int -get_overhead_for_onionskins(uint32_t *usec_out, double *frac_out, - uint16_t onionskin_type) -{ - uint64_t overhead; - - *usec_out = 0; - *frac_out = 0.0; - - if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */ - return -1; - if (onionskins_n_processed[onionskin_type] == 0 || - onionskins_usec_internal[onionskin_type] == 0 || - onionskins_usec_roundtrip[onionskin_type] == 0) - return -1; - - overhead = onionskins_usec_roundtrip[onionskin_type] - - onionskins_usec_internal[onionskin_type]; - - *usec_out = (uint32_t)(overhead / onionskins_n_processed[onionskin_type]); - *frac_out = U64_TO_DBL(overhead) / onionskins_usec_internal[onionskin_type]; - - return 0; -} - -/** If we've measured overhead for onionskins of type onionskin_type, - * log it. */ -void -cpuworker_log_onionskin_overhead(int severity, int onionskin_type, - const char *onionskin_type_name) -{ - uint32_t overhead; - double relative_overhead; - int r; - - r = get_overhead_for_onionskins(&overhead, &relative_overhead, - onionskin_type); - if (!overhead || r<0) - return; - - log_fn(severity, LD_OR, - "%s onionskins have averaged %u usec overhead (%.2f%%) in " - "cpuworker code ", - onionskin_type_name, (unsigned)overhead, relative_overhead*100); -} - -/** Called when we get data from a cpuworker. If the answer is not complete, - * wait for a complete answer. If the answer is complete, - * process it as appropriate. - */ -int -connection_cpu_process_inbuf(connection_t *conn) -{ - uint64_t chan_id; - circid_t circ_id; - channel_t *p_chan = NULL; - circuit_t *circ; - - tor_assert(conn); - tor_assert(conn->type == CONN_TYPE_CPUWORKER); - - if (!connection_get_inbuf_len(conn)) - return 0; - - if (conn->state == CPUWORKER_STATE_BUSY_ONION) { - cpuworker_reply_t rpl; - if (connection_get_inbuf_len(conn) < sizeof(cpuworker_reply_t)) - return 0; /* not yet */ - tor_assert(connection_get_inbuf_len(conn) == sizeof(cpuworker_reply_t)); - - connection_fetch_from_buf((void*)&rpl,sizeof(cpuworker_reply_t),conn); - - tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC); - - if (rpl.timed && rpl.success && - rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) { - /* Time how long this request took. The handshake_type check should be - needless, but let's leave it in to be safe. */ - struct timeval tv_end, tv_diff; - int64_t usec_roundtrip; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &rpl.started_at, &tv_diff); - usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec_roundtrip >= 0 && - usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) { - ++onionskins_n_processed[rpl.handshake_type]; - onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec; - onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip; - if (onionskins_n_processed[rpl.handshake_type] >= 500000) { - /* Scale down every 500000 handshakes. On a busy server, that's - * less impressive than it sounds. */ - onionskins_n_processed[rpl.handshake_type] /= 2; - onionskins_usec_internal[rpl.handshake_type] /= 2; - onionskins_usec_roundtrip[rpl.handshake_type] /= 2; - } - } - } - /* parse out the circ it was talking about */ - tag_unpack(rpl.tag, &chan_id, &circ_id); - circ = NULL; - log_debug(LD_OR, - "Unpacking cpuworker reply, chan_id is " U64_FORMAT - ", circ_id is %u", - U64_PRINTF_ARG(chan_id), (unsigned)circ_id); - p_chan = channel_find_by_global_id(chan_id); - - if (p_chan) - circ = circuit_get_by_circid_channel(circ_id, p_chan); - - if (rpl.success == 0) { - log_debug(LD_OR, - "decoding onionskin failed. " - "(Old key or bad software.) Closing."); - if (circ) - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - goto done_processing; - } - if (!circ) { - /* This happens because somebody sends us a destroy cell and the - * circuit goes away, while the cpuworker is working. This is also - * why our tag doesn't include a pointer to the circ, because we'd - * never know if it's still valid. - */ - log_debug(LD_OR,"processed onion for a circ that's gone. Dropping."); - goto done_processing; - } - tor_assert(! CIRCUIT_IS_ORIGIN(circ)); - if (onionskin_answer(TO_OR_CIRCUIT(circ), - &rpl.created_cell, - (const char*)rpl.keys, - rpl.rend_auth_material) < 0) { - log_warn(LD_OR,"onionskin_answer failed. Closing."); - circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL); - goto done_processing; - } - log_debug(LD_OR,"onionskin_answer succeeded. Yay."); - } else { - tor_assert(0); /* don't ask me to do handshakes yet */ - } - - done_processing: - conn->state = CPUWORKER_STATE_IDLE; - num_cpuworkers_busy--; - if (conn->timestamp_created < last_rotation_time) { - connection_mark_for_close(conn); - num_cpuworkers--; - spawn_enough_cpuworkers(); - } else { - process_pending_task(conn); - } - return 0; -} - -/** Implement a cpuworker. 'data' is an fdarray as returned by socketpair. - * Read and writes from fdarray[1]. Reads requests, writes answers. - * - * Request format: - * cpuworker_request_t. - * Response format: - * cpuworker_reply_t - */ -static void -cpuworker_main(void *data) -{ - /* For talking to the parent thread/process */ - tor_socket_t *fdarray = data; - tor_socket_t fd; - - /* variables for onion processing */ - server_onion_keys_t onion_keys; - cpuworker_request_t req; - cpuworker_reply_t rpl; - - fd = fdarray[1]; /* this side is ours */ -#ifndef TOR_IS_MULTITHREADED - tor_close_socket(fdarray[0]); /* this is the side of the socketpair the - * parent uses */ - tor_free_all(1); /* so the child doesn't hold the parent's fd's open */ - handle_signals(0); /* ignore interrupts from the keyboard, etc */ -#endif - tor_free(data); - - setup_server_onion_keys(&onion_keys); - - for (;;) { - if (read_all(fd, (void *)&req, sizeof(req), 1) != sizeof(req)) { - log_info(LD_OR, "read request failed. Exiting."); - goto end; - } - tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC); - - memset(&rpl, 0, sizeof(rpl)); - - if (req.task == CPUWORKER_TASK_ONION) { - const create_cell_t *cc = &req.create_cell; - created_cell_t *cell_out = &rpl.created_cell; - struct timeval tv_start, tv_end; - int n; - rpl.timed = req.timed; - rpl.started_at = req.started_at; - rpl.handshake_type = cc->handshake_type; - if (req.timed) - tor_gettimeofday(&tv_start); - n = onion_skin_server_handshake(cc->handshake_type, - cc->onionskin, cc->handshake_len, - &onion_keys, - cell_out->reply, - rpl.keys, CPATH_KEY_MATERIAL_LEN, - rpl.rend_auth_material); - if (n < 0) { - /* failure */ - log_debug(LD_OR,"onion_skin_server_handshake failed."); - memset(&rpl, 0, sizeof(rpl)); - memcpy(rpl.tag, req.tag, TAG_LEN); - rpl.success = 0; - } else { - /* success */ - log_debug(LD_OR,"onion_skin_server_handshake succeeded."); - memcpy(rpl.tag, req.tag, TAG_LEN); - cell_out->handshake_len = n; - switch (cc->cell_type) { - case CELL_CREATE: - cell_out->cell_type = CELL_CREATED; break; - case CELL_CREATE2: - cell_out->cell_type = CELL_CREATED2; break; - case CELL_CREATE_FAST: - cell_out->cell_type = CELL_CREATED_FAST; break; - default: - tor_assert(0); - goto end; - } - rpl.success = 1; - } - rpl.magic = CPUWORKER_REPLY_MAGIC; - if (req.timed) { - struct timeval tv_diff; - int64_t usec; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &tv_start, &tv_diff); - usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY) - rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY; - else - rpl.n_usec = (uint32_t) usec; - } - if (write_all(fd, (void*)&rpl, sizeof(rpl), 1) != sizeof(rpl)) { - log_err(LD_BUG,"writing response buf failed. Exiting."); - goto end; - } - log_debug(LD_OR,"finished writing response."); - } else if (req.task == CPUWORKER_TASK_SHUTDOWN) { - log_info(LD_OR,"Clean shutdown: exiting"); - goto end; - } - memwipe(&req, 0, sizeof(req)); - memwipe(&rpl, 0, sizeof(req)); - } - end: - memwipe(&req, 0, sizeof(req)); - memwipe(&rpl, 0, sizeof(req)); - release_server_onion_keys(&onion_keys); - tor_close_socket(fd); - crypto_thread_cleanup(); - spawn_exit(); -} - -/** Launch a new cpuworker. Return 0 if we're happy, -1 if we failed. - */ -static int -spawn_cpuworker(void) -{ - tor_socket_t *fdarray; - tor_socket_t fd; - connection_t *conn; - int err; - - fdarray = tor_malloc(sizeof(tor_socket_t)*2); - if ((err = tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fdarray)) < 0) { - log_warn(LD_NET, "Couldn't construct socketpair for cpuworker: %s", - tor_socket_strerror(-err)); - tor_free(fdarray); - return -1; - } - - tor_assert(SOCKET_OK(fdarray[0])); - tor_assert(SOCKET_OK(fdarray[1])); - - fd = fdarray[0]; - spawn_func(cpuworker_main, (void*)fdarray); - log_debug(LD_OR,"just spawned a cpu worker."); -#ifndef TOR_IS_MULTITHREADED - tor_close_socket(fdarray[1]); /* don't need the worker's side of the pipe */ - tor_free(fdarray); -#endif - - conn = connection_new(CONN_TYPE_CPUWORKER, AF_UNIX); - - /* set up conn so it's got all the data we need to remember */ - conn->s = fd; - conn->address = tor_strdup("localhost"); - tor_addr_make_unspec(&conn->addr); - - if (set_socket_nonblocking(fd) == -1) { - connection_free(conn); /* this closes fd */ - return -1; - } - - if (connection_add(conn) < 0) { /* no space, forget it */ - log_warn(LD_NET,"connection_add for cpuworker failed. Giving up."); - connection_free(conn); /* this closes fd */ - return -1; - } - - conn->state = CPUWORKER_STATE_IDLE; - connection_start_reading(conn); - - return 0; /* success */ -} - -/** If we have too few or too many active cpuworkers, try to spawn new ones - * or kill idle ones. - */ -static void -spawn_enough_cpuworkers(void) -{ - int num_cpuworkers_needed = get_num_cpus(get_options()); - int reseed = 0; - - if (num_cpuworkers_needed < MIN_CPUWORKERS) - num_cpuworkers_needed = MIN_CPUWORKERS; - if (num_cpuworkers_needed > MAX_CPUWORKERS) - num_cpuworkers_needed = MAX_CPUWORKERS; - - while (num_cpuworkers < num_cpuworkers_needed) { - if (spawn_cpuworker() < 0) { - log_warn(LD_GENERAL,"Cpuworker spawn failed. Will try again later."); - return; - } - num_cpuworkers++; - reseed++; - } - - if (reseed) - crypto_seed_weak_rng(&request_sample_rng); -} - -/** Take a pending task from the queue and assign it to 'cpuworker'. */ -static void -process_pending_task(connection_t *cpuworker) -{ - or_circuit_t *circ; - create_cell_t *onionskin = NULL; - - tor_assert(cpuworker); - - /* for now only process onion tasks */ - - circ = onion_next_task(&onionskin); - if (!circ) - return; - if (assign_onionskin_to_cpuworker(cpuworker, circ, onionskin)) - log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring."); -} - -/** How long should we let a cpuworker stay busy before we give - * up on it and decide that we have a bug or infinite loop? - * This value is high because some servers with low memory/cpu - * sometimes spend an hour or more swapping, and Tor starves. */ -#define CPUWORKER_BUSY_TIMEOUT (60*60*12) - -/** We have a bug that I can't find. Sometimes, very rarely, cpuworkers get - * stuck in the 'busy' state, even though the cpuworker process thinks of - * itself as idle. I don't know why. But here's a workaround to kill any - * cpuworker that's been busy for more than CPUWORKER_BUSY_TIMEOUT. - */ -static void -cull_wedged_cpuworkers(void) -{ - time_t now = time(NULL); - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (!conn->marked_for_close && - conn->type == CONN_TYPE_CPUWORKER && - conn->state == CPUWORKER_STATE_BUSY_ONION && - conn->timestamp_lastwritten + CPUWORKER_BUSY_TIMEOUT < now) { - log_notice(LD_BUG, - "closing wedged cpuworker. Can somebody find the bug?"); - num_cpuworkers_busy--; - num_cpuworkers--; - connection_mark_for_close(conn); - } - } SMARTLIST_FOREACH_END(conn); -} - -/** Try to tell a cpuworker to perform the public key operations necessary to - * respond to onionskin for the circuit circ. - * - * If cpuworker is defined, assert that he's idle, and use him. Else, - * look for an idle cpuworker and use him. If none idle, queue task onto the - * pending onion list and return. Return 0 if we successfully assign the - * task, or -1 on failure. - */ -int -assign_onionskin_to_cpuworker(connection_t *cpuworker, - or_circuit_t *circ, - create_cell_t *onionskin) -{ - cpuworker_request_t req; - time_t now = approx_time(); - static time_t last_culled_cpuworkers = 0; - int should_time; - - /* Checking for wedged cpuworkers requires a linear search over all - * connections, so let's do it only once a minute. - */ -#define CULL_CPUWORKERS_INTERVAL 60 - - if (last_culled_cpuworkers + CULL_CPUWORKERS_INTERVAL <= now) { - cull_wedged_cpuworkers(); - spawn_enough_cpuworkers(); - last_culled_cpuworkers = now; - } - - if (1) { - if (num_cpuworkers_busy == num_cpuworkers) { - log_debug(LD_OR,"No idle cpuworkers. Queuing."); - if (onion_pending_add(circ, onionskin) < 0) { - tor_free(onionskin); - return -1; - } - return 0; - } - - if (!cpuworker) - cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, - CPUWORKER_STATE_IDLE); - - tor_assert(cpuworker); - - if (!circ->p_chan) { - log_info(LD_OR,"circ->p_chan gone. Failing circ."); - tor_free(onionskin); - return -1; - } - - if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest)) - rep_hist_note_circuit_handshake_completed(onionskin->handshake_type); - - should_time = should_time_request(onionskin->handshake_type); - memset(&req, 0, sizeof(req)); - req.magic = CPUWORKER_REQUEST_MAGIC; - tag_pack(req.tag, circ->p_chan->global_identifier, - circ->p_circ_id); - req.timed = should_time; - - cpuworker->state = CPUWORKER_STATE_BUSY_ONION; - /* touch the lastwritten timestamp, since that's how we check to - * see how long it's been since we asked the question, and sometimes - * we check before the first call to connection_handle_write(). */ - cpuworker->timestamp_lastwritten = now; - num_cpuworkers_busy++; - - req.task = CPUWORKER_TASK_ONION; - memcpy(&req.create_cell, onionskin, sizeof(create_cell_t)); - - tor_free(onionskin); - - if (should_time) - tor_gettimeofday(&req.started_at); - - connection_write_to_buf((void*)&req, sizeof(req), cpuworker); - memwipe(&req, 0, sizeof(req)); - } - return 0; -} - diff --git a/src/tor/cpuworker.h b/src/tor/cpuworker.h deleted file mode 100644 index 317cef43b..000000000 --- a/src/tor/cpuworker.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file cpuworker.h - * \brief Header file for cpuworker.c. - **/ - -#ifndef TOR_CPUWORKER_H -#define TOR_CPUWORKER_H - -void cpu_init(void); -void cpuworkers_rotate(void); -int connection_cpu_finished_flushing(connection_t *conn); -int connection_cpu_reached_eof(connection_t *conn); -int connection_cpu_process_inbuf(connection_t *conn); -struct create_cell_t; -int assign_onionskin_to_cpuworker(connection_t *cpuworker, - or_circuit_t *circ, - struct create_cell_t *onionskin); - -uint64_t estimated_usec_for_onionskins(uint32_t n_requests, - uint16_t onionskin_type); -void cpuworker_log_onionskin_overhead(int severity, int onionskin_type, - const char *onionskin_type_name); - -#endif - diff --git a/src/tor/crypto.c b/src/tor/crypto.c deleted file mode 100644 index 044e151c3..000000000 --- a/src/tor/crypto.c +++ /dev/null @@ -1,3154 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file crypto.c - * \brief Wrapper functions to present a consistent interface to - * public-key and symmetric cryptography operations from OpenSSL. - **/ - -#include "orconfig.h" - -#ifdef _WIN32 -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -/* Windows defines this; so does OpenSSL 0.9.8h and later. We don't actually - * use either definition. */ -#undef OCSP_RESPONSE -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_CTYPE_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_SYS_FCNTL_H -#include -#endif - -#define CRYPTO_PRIVATE -#include "crypto.h" -#include "torlog.h" -#include "aes.h" -#include "tor_util.h" -#include "container.h" -#include "tor_compat.h" -#include "sandbox.h" - -#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(0,9,8) -#error "We require OpenSSL >= 0.9.8" -#endif - -#ifdef ANDROID -/* Android's OpenSSL seems to have removed all of its Engine support. */ -#define DISABLE_ENGINES -#endif - -/** Longest recognized */ -#define MAX_DNS_LABEL_SIZE 63 - -/** Macro: is k a valid RSA public or private key? */ -#define PUBLIC_KEY_OK(k) ((k) && (k)->key && (k)->key->n) -/** Macro: is k a valid RSA private key? */ -#define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p) - -#ifdef TOR_IS_MULTITHREADED -/** A number of preallocated mutexes for use by OpenSSL. */ -static tor_mutex_t **openssl_mutexes_ = NULL; -/** How many mutexes have we allocated for use by OpenSSL? */ -static int n_openssl_mutexes_ = 0; -#endif - -/** A public key, or a public/private key-pair. */ -struct crypto_pk_t -{ - int refs; /**< reference count, so we don't have to copy keys */ - RSA *key; /**< The key itself */ -}; - -/** Key and stream information for a stream cipher. */ -struct crypto_cipher_t -{ - char key[CIPHER_KEY_LEN]; /**< The raw key. */ - char iv[CIPHER_IV_LEN]; /**< The initial IV. */ - aes_cnt_cipher_t *cipher; /**< The key in format usable for counter-mode AES - * encryption */ -}; - -/** A structure to hold the first half (x, g^x) of a Diffie-Hellman handshake - * while we're waiting for the second.*/ -struct crypto_dh_t { - DH *dh; /**< The openssl DH object */ -}; - -static int setup_openssl_threading(void); -static int tor_check_dh_key(int severity, BIGNUM *bn); - -/** Return the number of bytes added by padding method padding. - */ -static INLINE int -crypto_get_rsa_padding_overhead(int padding) -{ - switch (padding) - { - case RSA_PKCS1_OAEP_PADDING: return PKCS1_OAEP_PADDING_OVERHEAD; - default: tor_assert(0); return -1; - } -} - -/** Given a padding method padding, return the correct OpenSSL constant. - */ -static INLINE int -crypto_get_rsa_padding(int padding) -{ - switch (padding) - { - case PK_PKCS1_OAEP_PADDING: return RSA_PKCS1_OAEP_PADDING; - default: tor_assert(0); return -1; - } -} - -/** Boolean: has OpenSSL's crypto been initialized? */ -static int crypto_global_initialized_ = 0; - -/** Log all pending crypto errors at level severity. Use - * doing to describe our current activities. - */ -static void -crypto_log_errors(int severity, const char *doing) -{ - unsigned long err; - const char *msg, *lib, *func; - while ((err = ERR_get_error()) != 0) { - msg = (const char*)ERR_reason_error_string(err); - lib = (const char*)ERR_lib_error_string(err); - func = (const char*)ERR_func_error_string(err); - if (!msg) msg = "(null)"; - if (!lib) lib = "(null)"; - if (!func) func = "(null)"; - if (doing) { - tor_log(severity, LD_CRYPTO, "crypto error while %s: %s (in %s:%s)", - doing, msg, lib, func); - } else { - tor_log(severity, LD_CRYPTO, "crypto error: %s (in %s:%s)", - msg, lib, func); - } - } -} - -#ifndef DISABLE_ENGINES -/** Log any OpenSSL engines we're using at NOTICE. */ -static void -log_engine(const char *fn, ENGINE *e) -{ - if (e) { - const char *name, *id; - name = ENGINE_get_name(e); - id = ENGINE_get_id(e); - log_notice(LD_CRYPTO, "Default OpenSSL engine for %s is %s [%s]", - fn, name?name:"?", id?id:"?"); - } else { - log_info(LD_CRYPTO, "Using default implementation for %s", fn); - } -} -#endif - -#ifndef DISABLE_ENGINES -/** Try to load an engine in a shared library via fully qualified path. - */ -static ENGINE * -try_load_engine(const char *path, const char *engine) -{ - ENGINE *e = ENGINE_by_id("dynamic"); - if (e) { - if (!ENGINE_ctrl_cmd_string(e, "ID", engine, 0) || - !ENGINE_ctrl_cmd_string(e, "DIR_LOAD", "2", 0) || - !ENGINE_ctrl_cmd_string(e, "DIR_ADD", path, 0) || - !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)) { - ENGINE_free(e); - e = NULL; - } - } - return e; -} -#endif - -/* Returns a trimmed and human-readable version of an openssl version string -* raw_version. They are usually in the form of 'OpenSSL 1.0.0b 10 -* May 2012' and this will parse them into a form similar to '1.0.0b' */ -static char * -parse_openssl_version_str(const char *raw_version) -{ - const char *end_of_version = NULL; - /* The output should be something like "OpenSSL 1.0.0b 10 May 2012. Let's - trim that down. */ - if (!strcmpstart(raw_version, "OpenSSL ")) { - raw_version += strlen("OpenSSL "); - end_of_version = strchr(raw_version, ' '); - } - - if (end_of_version) - return tor_strndup(raw_version, - end_of_version-raw_version); - else - return tor_strdup(raw_version); -} - -static char *crypto_openssl_version_str = NULL; -/* Return a human-readable version of the run-time openssl version number. */ -const char * -crypto_openssl_get_version_str(void) -{ - if (crypto_openssl_version_str == NULL) { - const char *raw_version = SSLeay_version(SSLEAY_VERSION); - crypto_openssl_version_str = parse_openssl_version_str(raw_version); - } - return crypto_openssl_version_str; -} - -static char *crypto_openssl_header_version_str = NULL; -/* Return a human-readable version of the compile-time openssl version -* number. */ -const char * -crypto_openssl_get_header_version_str(void) -{ - if (crypto_openssl_header_version_str == NULL) { - crypto_openssl_header_version_str = - parse_openssl_version_str(OPENSSL_VERSION_TEXT); - } - return crypto_openssl_header_version_str; -} - -/** Initialize the crypto library. Return 0 on success, -1 on failure. - */ -int -crypto_global_init(int useAccel, const char *accelName, const char *accelDir) -{ - if (!crypto_global_initialized_) { - ERR_load_crypto_strings(); - OpenSSL_add_all_algorithms(); - crypto_global_initialized_ = 1; - setup_openssl_threading(); - - if (SSLeay() == OPENSSL_VERSION_NUMBER && - !strcmp(SSLeay_version(SSLEAY_VERSION), OPENSSL_VERSION_TEXT)) { - log_info(LD_CRYPTO, "OpenSSL version matches version from headers " - "(%lx: %s).", SSLeay(), SSLeay_version(SSLEAY_VERSION)); - } else { - log_warn(LD_CRYPTO, "OpenSSL version from headers does not match the " - "version we're running with. If you get weird crashes, that " - "might be why. (Compiled with %lx: %s; running with %lx: %s).", - (unsigned long)OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT, - SSLeay(), SSLeay_version(SSLEAY_VERSION)); - } - - if (SSLeay() < OPENSSL_V_SERIES(1,0,0)) { - log_notice(LD_CRYPTO, - "Your OpenSSL version seems to be %s. We recommend 1.0.0 " - "or later.", - crypto_openssl_get_version_str()); - } - - if (useAccel > 0) { -#ifdef DISABLE_ENGINES - (void)accelName; - (void)accelDir; - log_warn(LD_CRYPTO, "No OpenSSL hardware acceleration support enabled."); -#else - ENGINE *e = NULL; - - log_info(LD_CRYPTO, "Initializing OpenSSL engine support."); - ENGINE_load_builtin_engines(); - ENGINE_register_all_complete(); - - if (accelName) { - if (accelDir) { - log_info(LD_CRYPTO, "Trying to load dynamic OpenSSL engine \"%s\"" - " via path \"%s\".", accelName, accelDir); - e = try_load_engine(accelName, accelDir); - } else { - log_info(LD_CRYPTO, "Initializing dynamic OpenSSL engine \"%s\"" - " acceleration support.", accelName); - e = ENGINE_by_id(accelName); - } - if (!e) { - log_warn(LD_CRYPTO, "Unable to load dynamic OpenSSL engine \"%s\".", - accelName); - } else { - log_info(LD_CRYPTO, "Loaded dynamic OpenSSL engine \"%s\".", - accelName); - } - } - if (e) { - log_info(LD_CRYPTO, "Loaded OpenSSL hardware acceleration engine," - " setting default ciphers."); - ENGINE_set_default(e, ENGINE_METHOD_ALL); - } - /* Log, if available, the intersection of the set of algorithms - used by Tor and the set of algorithms available in the engine */ - log_engine("RSA", ENGINE_get_default_RSA()); - log_engine("DH", ENGINE_get_default_DH()); - log_engine("ECDH", ENGINE_get_default_ECDH()); - log_engine("ECDSA", ENGINE_get_default_ECDSA()); - log_engine("RAND", ENGINE_get_default_RAND()); - log_engine("RAND (which we will not use)", ENGINE_get_default_RAND()); - log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1)); - log_engine("3DES-CBC", ENGINE_get_cipher_engine(NID_des_ede3_cbc)); - log_engine("AES-128-ECB", ENGINE_get_cipher_engine(NID_aes_128_ecb)); - log_engine("AES-128-CBC", ENGINE_get_cipher_engine(NID_aes_128_cbc)); -#ifdef NID_aes_128_ctr - log_engine("AES-128-CTR", ENGINE_get_cipher_engine(NID_aes_128_ctr)); -#endif -#ifdef NID_aes_128_gcm - log_engine("AES-128-GCM", ENGINE_get_cipher_engine(NID_aes_128_gcm)); -#endif - log_engine("AES-256-CBC", ENGINE_get_cipher_engine(NID_aes_256_cbc)); -#ifdef NID_aes_256_gcm - log_engine("AES-256-GCM", ENGINE_get_cipher_engine(NID_aes_256_gcm)); -#endif - -#endif - } else { - log_info(LD_CRYPTO, "NOT using OpenSSL engine support."); - } - - if (RAND_get_rand_method() != RAND_SSLeay()) { - log_notice(LD_CRYPTO, "It appears that one of our engines has provided " - "a replacement the OpenSSL RNG. Resetting it to the default " - "implementation."); - RAND_set_rand_method(RAND_SSLeay()); - } - - evaluate_evp_for_aes(-1); - evaluate_ctr_for_aes(); - - return crypto_seed_rng(1); - } - return 0; -} - -/** Free crypto resources held by this thread. */ -void -crypto_thread_cleanup(void) -{ - ERR_remove_state(0); -} - -/** used by tortls.c: wrap an RSA* in a crypto_pk_t. */ -crypto_pk_t * -crypto_new_pk_from_rsa_(RSA *rsa) -{ - crypto_pk_t *env; - tor_assert(rsa); - env = tor_malloc(sizeof(crypto_pk_t)); - env->refs = 1; - env->key = rsa; - return env; -} - -/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a - * crypto_pk_t. */ -RSA * -crypto_pk_get_rsa_(crypto_pk_t *env) -{ - return env->key; -} - -/** used by tortls.c: get an equivalent EVP_PKEY* for a crypto_pk_t. Iff - * private is set, include the private-key portion of the key. */ -EVP_PKEY * -crypto_pk_get_evp_pkey_(crypto_pk_t *env, int private) -{ - RSA *key = NULL; - EVP_PKEY *pkey = NULL; - tor_assert(env->key); - if (private) { - if (!(key = RSAPrivateKey_dup(env->key))) - goto error; - } else { - if (!(key = RSAPublicKey_dup(env->key))) - goto error; - } - if (!(pkey = EVP_PKEY_new())) - goto error; - if (!(EVP_PKEY_assign_RSA(pkey, key))) - goto error; - return pkey; - error: - if (pkey) - EVP_PKEY_free(pkey); - if (key) - RSA_free(key); - return NULL; -} - -/** Used by tortls.c: Get the DH* from a crypto_dh_t. - */ -DH * -crypto_dh_get_dh_(crypto_dh_t *dh) -{ - return dh->dh; -} - -/** Allocate and return storage for a public key. The key itself will not yet - * be set. - */ -crypto_pk_t * -crypto_pk_new(void) -{ - RSA *rsa; - - rsa = RSA_new(); - tor_assert(rsa); - return crypto_new_pk_from_rsa_(rsa); -} - -/** Release a reference to an asymmetric key; when all the references - * are released, free the key. - */ -void -crypto_pk_free(crypto_pk_t *env) -{ - if (!env) - return; - - if (--env->refs > 0) - return; - tor_assert(env->refs == 0); - - if (env->key) - RSA_free(env->key); - - tor_free(env); -} - -/** Allocate and return a new symmetric cipher using the provided key and iv. - * The key is CIPHER_KEY_LEN bytes; the IV is CIPHER_IV_LEN bytes. If you - * provide NULL in place of either one, it is generated at random. - */ -crypto_cipher_t * -crypto_cipher_new_with_iv(const char *key, const char *iv) -{ - crypto_cipher_t *env; - - env = tor_malloc_zero(sizeof(crypto_cipher_t)); - - if (key == NULL) - crypto_rand(env->key, CIPHER_KEY_LEN); - else - memcpy(env->key, key, CIPHER_KEY_LEN); - if (iv == NULL) - crypto_rand(env->iv, CIPHER_IV_LEN); - else - memcpy(env->iv, iv, CIPHER_IV_LEN); - - env->cipher = aes_new_cipher(env->key, env->iv); - - return env; -} - -/** Return a new crypto_cipher_t with the provided key and an IV of all - * zero bytes. */ -crypto_cipher_t * -crypto_cipher_new(const char *key) -{ - char zeroiv[CIPHER_IV_LEN]; - memset(zeroiv, 0, sizeof(zeroiv)); - return crypto_cipher_new_with_iv(key, zeroiv); -} - -/** Free a symmetric cipher. - */ -void -crypto_cipher_free(crypto_cipher_t *env) -{ - if (!env) - return; - - tor_assert(env->cipher); - aes_cipher_free(env->cipher); - memwipe(env, 0, sizeof(crypto_cipher_t)); - tor_free(env); -} - -/* public key crypto */ - -/** Generate a bits-bit new public/private keypair in env. - * Return 0 on success, -1 on failure. - */ -int -crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits) -{ - tor_assert(env); - - if (env->key) - RSA_free(env->key); - - { - BIGNUM *e = BN_new(); - RSA *r = NULL; - if (!e) - goto done; - if (! BN_set_word(e, 65537)) - goto done; - r = RSA_new(); - if (!r) - goto done; - if (RSA_generate_key_ex(r, bits, e, NULL) == -1) - goto done; - - env->key = r; - r = NULL; - done: - if (e) - BN_clear_free(e); - if (r) - RSA_free(r); - } - - if (!env->key) { - crypto_log_errors(LOG_WARN, "generating RSA key"); - return -1; - } - - return 0; -} - -/** Read a PEM-encoded private key from the len-byte string s - * into env. Return 0 on success, -1 on failure. If len is -1, - * the string is nul-terminated. - */ -/* Used here, and used for testing. */ -int -crypto_pk_read_private_key_from_string(crypto_pk_t *env, - const char *s, ssize_t len) -{ - BIO *b; - - tor_assert(env); - tor_assert(s); - tor_assert(len < INT_MAX && len < SSIZE_T_CEILING); - - /* Create a read-only memory BIO, backed by the string 's' */ - b = BIO_new_mem_buf((char*)s, (int)len); - if (!b) - return -1; - - if (env->key) - RSA_free(env->key); - - env->key = PEM_read_bio_RSAPrivateKey(b,NULL,NULL,NULL); - - BIO_free(b); - - if (!env->key) { - crypto_log_errors(LOG_WARN, "Error parsing private key"); - return -1; - } - return 0; -} - -/** Read a PEM-encoded private key from the file named by - * keyfile into env. Return 0 on success, -1 on failure. - */ -int -crypto_pk_read_private_key_from_filename(crypto_pk_t *env, - const char *keyfile) -{ - char *contents; - int r; - - /* Read the file into a string. */ - contents = read_file_to_str(keyfile, 0, NULL); - if (!contents) { - log_warn(LD_CRYPTO, "Error reading private key from \"%s\"", keyfile); - return -1; - } - - /* Try to parse it. */ - r = crypto_pk_read_private_key_from_string(env, contents, -1); - memwipe(contents, 0, strlen(contents)); - tor_free(contents); - if (r) - return -1; /* read_private_key_from_string already warned, so we don't.*/ - - /* Make sure it's valid. */ - if (crypto_pk_check_key(env) <= 0) - return -1; - - return 0; -} - -/** Helper function to implement crypto_pk_write_*_key_to_string. */ -static int -crypto_pk_write_key_to_string_impl(crypto_pk_t *env, char **dest, - size_t *len, int is_public) -{ - BUF_MEM *buf; - BIO *b; - int r; - - tor_assert(env); - tor_assert(env->key); - tor_assert(dest); - - b = BIO_new(BIO_s_mem()); /* Create a memory BIO */ - if (!b) - return -1; - - /* Now you can treat b as if it were a file. Just use the - * PEM_*_bio_* functions instead of the non-bio variants. - */ - if (is_public) - r = PEM_write_bio_RSAPublicKey(b, env->key); - else - r = PEM_write_bio_RSAPrivateKey(b, env->key, NULL,NULL,0,NULL,NULL); - - if (!r) { - crypto_log_errors(LOG_WARN, "writing RSA key to string"); - BIO_free(b); - return -1; - } - - BIO_get_mem_ptr(b, &buf); - (void)BIO_set_close(b, BIO_NOCLOSE); /* so BIO_free doesn't free buf */ - BIO_free(b); - - *dest = tor_malloc(buf->length+1); - memcpy(*dest, buf->data, buf->length); - (*dest)[buf->length] = 0; /* nul terminate it */ - *len = buf->length; - BUF_MEM_free(buf); - - return 0; -} - -/** PEM-encode the public key portion of env and write it to a - * newly allocated string. On success, set *dest to the new - * string, *len to the string's length, and return 0. On - * failure, return -1. - */ -int -crypto_pk_write_public_key_to_string(crypto_pk_t *env, char **dest, - size_t *len) -{ - return crypto_pk_write_key_to_string_impl(env, dest, len, 1); -} - -/** PEM-encode the private key portion of env and write it to a - * newly allocated string. On success, set *dest to the new - * string, *len to the string's length, and return 0. On - * failure, return -1. - */ -int -crypto_pk_write_private_key_to_string(crypto_pk_t *env, char **dest, - size_t *len) -{ - return crypto_pk_write_key_to_string_impl(env, dest, len, 0); -} - -/** Read a PEM-encoded public key from the first len characters of - * src, and store the result in env. Return 0 on success, -1 on - * failure. - */ -int -crypto_pk_read_public_key_from_string(crypto_pk_t *env, const char *src, - size_t len) -{ - BIO *b; - - tor_assert(env); - tor_assert(src); - tor_assert(lenkey) - RSA_free(env->key); - env->key = PEM_read_bio_RSAPublicKey(b, NULL, NULL, NULL); - BIO_free(b); - if (!env->key) { - crypto_log_errors(LOG_WARN, "reading public key from string"); - return -1; - } - - return 0; -} - -/** Write the private key from env into the file named by fname, - * PEM-encoded. Return 0 on success, -1 on failure. - */ -int -crypto_pk_write_private_key_to_filename(crypto_pk_t *env, - const char *fname) -{ - BIO *bio; - char *cp; - long len; - char *s; - int r; - - tor_assert(PRIVATE_KEY_OK(env)); - - if (!(bio = BIO_new(BIO_s_mem()))) - return -1; - if (PEM_write_bio_RSAPrivateKey(bio, env->key, NULL,NULL,0,NULL,NULL) - == 0) { - crypto_log_errors(LOG_WARN, "writing private key"); - BIO_free(bio); - return -1; - } - len = BIO_get_mem_data(bio, &cp); - tor_assert(len >= 0); - s = tor_malloc(len+1); - memcpy(s, cp, len); - s[len]='\0'; - r = write_str_to_file(fname, s, 0); - BIO_free(bio); - memwipe(s, 0, strlen(s)); - tor_free(s); - return r; -} - -/** Return true iff env has a valid key. - */ -int -crypto_pk_check_key(crypto_pk_t *env) -{ - int r; - tor_assert(env); - - r = RSA_check_key(env->key); - if (r <= 0) - crypto_log_errors(LOG_WARN,"checking RSA key"); - return r; -} - -/** Return true iff key contains the private-key portion of the RSA - * key. */ -int -crypto_pk_key_is_private(const crypto_pk_t *key) -{ - tor_assert(key); - return PRIVATE_KEY_OK(key); -} - -/** Return true iff env contains a public key whose public exponent - * equals 65537. - */ -int -crypto_pk_public_exponent_ok(crypto_pk_t *env) -{ - tor_assert(env); - tor_assert(env->key); - - return BN_is_word(env->key->e, 65537); -} - -/** Compare the public-key components of a and b. Return less than 0 - * if a\b. A NULL key is - * considered to be less than all non-NULL keys, and equal to itself. - * - * Note that this may leak information about the keys through timing. - */ -int -crypto_pk_cmp_keys(crypto_pk_t *a, crypto_pk_t *b) -{ - int result; - char a_is_non_null = (a != NULL) && (a->key != NULL); - char b_is_non_null = (b != NULL) && (b->key != NULL); - char an_argument_is_null = !a_is_non_null | !b_is_non_null; - - result = tor_memcmp(&a_is_non_null, &b_is_non_null, sizeof(a_is_non_null)); - if (an_argument_is_null) - return result; - - tor_assert(PUBLIC_KEY_OK(a)); - tor_assert(PUBLIC_KEY_OK(b)); - result = BN_cmp((a->key)->n, (b->key)->n); - if (result) - return result; - return BN_cmp((a->key)->e, (b->key)->e); -} - -/** Compare the public-key components of a and b. Return non-zero iff - * a==b. A NULL key is considered to be distinct from all non-NULL - * keys, and equal to itself. - * - * Note that this may leak information about the keys through timing. - */ -int -crypto_pk_eq_keys(crypto_pk_t *a, crypto_pk_t *b) -{ - return (crypto_pk_cmp_keys(a, b) == 0); -} - -/** Return the size of the public key modulus in env, in bytes. */ -size_t -crypto_pk_keysize(crypto_pk_t *env) -{ - tor_assert(env); - tor_assert(env->key); - - return (size_t) RSA_size(env->key); -} - -/** Return the size of the public key modulus of env, in bits. */ -int -crypto_pk_num_bits(crypto_pk_t *env) -{ - tor_assert(env); - tor_assert(env->key); - tor_assert(env->key->n); - - return BN_num_bits(env->key->n); -} - -/** Increase the reference count of env, and return it. - */ -crypto_pk_t * -crypto_pk_dup_key(crypto_pk_t *env) -{ - tor_assert(env); - tor_assert(env->key); - - env->refs++; - return env; -} - -/** Make a real honest-to-goodness copy of env, and return it. */ -crypto_pk_t * -crypto_pk_copy_full(crypto_pk_t *env) -{ - RSA *new_key; - int privatekey = 0; - tor_assert(env); - tor_assert(env->key); - - if (PRIVATE_KEY_OK(env)) { - new_key = RSAPrivateKey_dup(env->key); - privatekey = 1; - } else { - new_key = RSAPublicKey_dup(env->key); - } - if (!new_key) { - log_err(LD_CRYPTO, "Unable to duplicate a %s key: openssl failed.", - privatekey?"private":"public"); - crypto_log_errors(LOG_ERR, - privatekey ? "Duplicating a private key" : - "Duplicating a public key"); - tor_fragile_assert(); - return NULL; - } - - return crypto_new_pk_from_rsa_(new_key); -} - -/** Encrypt fromlen bytes from from with the public key - * in env, using the padding method padding. On success, - * write the result to to, and return the number of bytes - * written. On failure, return -1. - * - * tolen is the number of writable bytes in to, and must be - * at least the length of the modulus of env. - */ -int -crypto_pk_public_encrypt(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen, int padding) -{ - int r; - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen= crypto_pk_keysize(env)); - - r = RSA_public_encrypt((int)fromlen, - (unsigned char*)from, (unsigned char*)to, - env->key, crypto_get_rsa_padding(padding)); - if (r<0) { - crypto_log_errors(LOG_WARN, "performing RSA encryption"); - return -1; - } - return r; -} - -/** Decrypt fromlen bytes from from with the private key - * in env, using the padding method padding. On success, - * write the result to to, and return the number of bytes - * written. On failure, return -1. - * - * tolen is the number of writable bytes in to, and must be - * at least the length of the modulus of env. - */ -int -crypto_pk_private_decrypt(crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen, - int padding, int warnOnFailure) -{ - int r; - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(env->key); - tor_assert(fromlen= crypto_pk_keysize(env)); - if (!env->key->p) - /* Not a private key */ - return -1; - - r = RSA_private_decrypt((int)fromlen, - (unsigned char*)from, (unsigned char*)to, - env->key, crypto_get_rsa_padding(padding)); - - if (r<0) { - crypto_log_errors(warnOnFailure?LOG_WARN:LOG_DEBUG, - "performing RSA decryption"); - return -1; - } - return r; -} - -/** Check the signature in from (fromlen bytes long) with the - * public key in env, using PKCS1 padding. On success, write the - * signed data to to, and return the number of bytes written. - * On failure, return -1. - * - * tolen is the number of writable bytes in to, and must be - * at least the length of the modulus of env. - */ -int -crypto_pk_public_checksig(crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen) -{ - int r; - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < INT_MAX); - tor_assert(tolen >= crypto_pk_keysize(env)); - r = RSA_public_decrypt((int)fromlen, - (unsigned char*)from, (unsigned char*)to, - env->key, RSA_PKCS1_PADDING); - - if (r<0) { - crypto_log_errors(LOG_WARN, "checking RSA signature"); - return -1; - } - return r; -} - -/** Check a siglen-byte long signature at sig against - * datalen bytes of data at data, using the public key - * in env. Return 0 if sig is a correct signature for - * SHA1(data). Else return -1. - */ -int -crypto_pk_public_checksig_digest(crypto_pk_t *env, const char *data, - size_t datalen, const char *sig, size_t siglen) -{ - char digest[DIGEST_LEN]; - char *buf; - size_t buflen; - int r; - - tor_assert(env); - tor_assert(data); - tor_assert(sig); - tor_assert(datalen < SIZE_T_CEILING); - tor_assert(siglen < SIZE_T_CEILING); - - if (crypto_digest(digest,data,datalen)<0) { - log_warn(LD_BUG, "couldn't compute digest"); - return -1; - } - buflen = crypto_pk_keysize(env); - buf = tor_malloc(buflen); - r = crypto_pk_public_checksig(env,buf,buflen,sig,siglen); - if (r != DIGEST_LEN) { - log_warn(LD_CRYPTO, "Invalid signature"); - tor_free(buf); - return -1; - } - if (tor_memneq(buf, digest, DIGEST_LEN)) { - log_warn(LD_CRYPTO, "Signature mismatched with digest."); - tor_free(buf); - return -1; - } - tor_free(buf); - - return 0; -} - -/** Sign fromlen bytes of data from from with the private key in - * env, using PKCS1 padding. On success, write the signature to - * to, and return the number of bytes written. On failure, return - * -1. - * - * tolen is the number of writable bytes in to, and must be - * at least the length of the modulus of env. - */ -int -crypto_pk_private_sign(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen) -{ - int r; - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < INT_MAX); - tor_assert(tolen >= crypto_pk_keysize(env)); - if (!env->key->p) - /* Not a private key */ - return -1; - - r = RSA_private_encrypt((int)fromlen, - (unsigned char*)from, (unsigned char*)to, - env->key, RSA_PKCS1_PADDING); - if (r<0) { - crypto_log_errors(LOG_WARN, "generating RSA signature"); - return -1; - } - return r; -} - -/** Compute a SHA1 digest of fromlen bytes of data stored at - * from; sign the data with the private key in env, and - * store it in to. Return the number of bytes written on - * success, and -1 on failure. - * - * tolen is the number of writable bytes in to, and must be - * at least the length of the modulus of env. - */ -int -crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen) -{ - int r; - char digest[DIGEST_LEN]; - if (crypto_digest(digest,from,fromlen)<0) - return -1; - r = crypto_pk_private_sign(env,to,tolen,digest,DIGEST_LEN); - memwipe(digest, 0, sizeof(digest)); - return r; -} - -/** Perform a hybrid (public/secret) encryption on fromlen - * bytes of data from from, with padding type 'padding', - * storing the results on to. - * - * Returns the number of bytes written on success, -1 on failure. - * - * The encrypted data consists of: - * - The source data, padded and encrypted with the public key, if the - * padded source data is no longer than the public key, and force - * is false, OR - * - The beginning of the source data prefixed with a 16-byte symmetric key, - * padded and encrypted with the public key; followed by the rest of - * the source data encrypted in AES-CTR mode with the symmetric key. - */ -int -crypto_pk_public_hybrid_encrypt(crypto_pk_t *env, - char *to, size_t tolen, - const char *from, - size_t fromlen, - int padding, int force) -{ - int overhead, outlen, r; - size_t pkeylen, symlen; - crypto_cipher_t *cipher = NULL; - char *buf = NULL; - - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < SIZE_T_CEILING); - - overhead = crypto_get_rsa_padding_overhead(crypto_get_rsa_padding(padding)); - pkeylen = crypto_pk_keysize(env); - - if (!force && fromlen+overhead <= pkeylen) { - /* It all fits in a single encrypt. */ - return crypto_pk_public_encrypt(env,to, - tolen, - from,fromlen,padding); - } - tor_assert(tolen >= fromlen + overhead + CIPHER_KEY_LEN); - tor_assert(tolen >= pkeylen); - - cipher = crypto_cipher_new(NULL); /* generate a new key. */ - - buf = tor_malloc(pkeylen+1); - memcpy(buf, cipher->key, CIPHER_KEY_LEN); - memcpy(buf+CIPHER_KEY_LEN, from, pkeylen-overhead-CIPHER_KEY_LEN); - - /* Length of symmetrically encrypted data. */ - symlen = fromlen-(pkeylen-overhead-CIPHER_KEY_LEN); - - outlen = crypto_pk_public_encrypt(env,to,tolen,buf,pkeylen-overhead,padding); - if (outlen!=(int)pkeylen) { - goto err; - } - r = crypto_cipher_encrypt(cipher, to+outlen, - from+pkeylen-overhead-CIPHER_KEY_LEN, symlen); - - if (r<0) goto err; - memwipe(buf, 0, pkeylen); - tor_free(buf); - crypto_cipher_free(cipher); - tor_assert(outlen+symlen < INT_MAX); - return (int)(outlen + symlen); - err: - - memwipe(buf, 0, pkeylen); - tor_free(buf); - crypto_cipher_free(cipher); - return -1; -} - -/** Invert crypto_pk_public_hybrid_encrypt. */ -int -crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, - char *to, - size_t tolen, - const char *from, - size_t fromlen, - int padding, int warnOnFailure) -{ - int outlen, r; - size_t pkeylen; - crypto_cipher_t *cipher = NULL; - char *buf = NULL; - - tor_assert(fromlen < SIZE_T_CEILING); - pkeylen = crypto_pk_keysize(env); - - if (fromlen <= pkeylen) { - return crypto_pk_private_decrypt(env,to,tolen,from,fromlen,padding, - warnOnFailure); - } - - buf = tor_malloc(pkeylen); - outlen = crypto_pk_private_decrypt(env,buf,pkeylen,from,pkeylen,padding, - warnOnFailure); - if (outlen<0) { - log_fn(warnOnFailure?LOG_WARN:LOG_DEBUG, LD_CRYPTO, - "Error decrypting public-key data"); - goto err; - } - if (outlen < CIPHER_KEY_LEN) { - log_fn(warnOnFailure?LOG_WARN:LOG_INFO, LD_CRYPTO, - "No room for a symmetric key"); - goto err; - } - cipher = crypto_cipher_new(buf); - if (!cipher) { - goto err; - } - memcpy(to,buf+CIPHER_KEY_LEN,outlen-CIPHER_KEY_LEN); - outlen -= CIPHER_KEY_LEN; - tor_assert(tolen - outlen >= fromlen - pkeylen); - r = crypto_cipher_decrypt(cipher, to+outlen, from+pkeylen, fromlen-pkeylen); - if (r<0) - goto err; - memwipe(buf,0,pkeylen); - tor_free(buf); - crypto_cipher_free(cipher); - tor_assert(outlen + fromlen < INT_MAX); - return (int)(outlen + (fromlen-pkeylen)); - err: - memwipe(buf,0,pkeylen); - tor_free(buf); - crypto_cipher_free(cipher); - return -1; -} - -/** ASN.1-encode the public portion of pk into dest. - * Return -1 on error, or the number of characters used on success. - */ -int -crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len) -{ - int len; - unsigned char *buf = NULL; - - len = i2d_RSAPublicKey(pk->key, &buf); - if (len < 0 || buf == NULL) - return -1; - - if ((size_t)len > dest_len || dest_len > SIZE_T_CEILING) { - OPENSSL_free(buf); - return -1; - } - /* We don't encode directly into 'dest', because that would be illegal - * type-punning. (C99 is smarter than me, C99 is smarter than me...) - */ - memcpy(dest,buf,len); - OPENSSL_free(buf); - return len; -} - -/** Decode an ASN.1-encoded public key from str; return the result on - * success and NULL on failure. - */ -crypto_pk_t * -crypto_pk_asn1_decode(const char *str, size_t len) -{ - RSA *rsa; - unsigned char *buf; - const unsigned char *cp; - cp = buf = tor_malloc(len); - memcpy(buf,str,len); - rsa = d2i_RSAPublicKey(NULL, &cp, len); - tor_free(buf); - if (!rsa) { - crypto_log_errors(LOG_WARN,"decoding public key"); - return NULL; - } - return crypto_new_pk_from_rsa_(rsa); -} - -/** Given a private or public key pk, put a SHA1 hash of the - * public key into digest_out (must have DIGEST_LEN bytes of space). - * Return 0 on success, -1 on failure. - */ -int -crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out) -{ - unsigned char *buf = NULL; - int len; - - len = i2d_RSAPublicKey(pk->key, &buf); - if (len < 0 || buf == NULL) - return -1; - if (crypto_digest(digest_out, (char*)buf, len) < 0) { - OPENSSL_free(buf); - return -1; - } - OPENSSL_free(buf); - return 0; -} - -/** Compute all digests of the DER encoding of pk, and store them - * in digests_out. Return 0 on success, -1 on failure. */ -int -crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out) -{ - unsigned char *buf = NULL; - int len; - - len = i2d_RSAPublicKey(pk->key, &buf); - if (len < 0 || buf == NULL) - return -1; - if (crypto_digest_all(digests_out, (char*)buf, len) < 0) { - OPENSSL_free(buf); - return -1; - } - OPENSSL_free(buf); - return 0; -} - -/** Copy in to the outlen-byte buffer out, adding spaces - * every four spaces. */ -void -crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in) -{ - int n = 0; - char *end = out+outlen; - tor_assert(outlen < SIZE_T_CEILING); - - while (*in && outpk, put a fingerprint of the - * public key into fp_out (must have at least FINGERPRINT_LEN+1 bytes of - * space). Return 0 on success, -1 on failure. - * - * Fingerprints are computed as the SHA1 digest of the ASN.1 encoding - * of the public key, converted to hexadecimal, in upper case, with a - * space after every four digits. - * - * If add_space is false, omit the spaces. - */ -int -crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space) -{ - char digest[DIGEST_LEN]; - char hexdigest[HEX_DIGEST_LEN+1]; - if (crypto_pk_get_digest(pk, digest)) { - return -1; - } - base16_encode(hexdigest,sizeof(hexdigest),digest,DIGEST_LEN); - if (add_space) { - crypto_add_spaces_to_fp(fp_out, FINGERPRINT_LEN+1, hexdigest); - } else { - strncpy(fp_out, hexdigest, HEX_DIGEST_LEN+1); - } - return 0; -} - -/* symmetric crypto */ - -/** Return a pointer to the key set for the cipher in env. - */ -const char * -crypto_cipher_get_key(crypto_cipher_t *env) -{ - return env->key; -} - -/** Encrypt fromlen bytes from from using the cipher - * env; on success, store the result to to and return 0. - * On failure, return -1. - */ -int -crypto_cipher_encrypt(crypto_cipher_t *env, char *to, - const char *from, size_t fromlen) -{ - tor_assert(env); - tor_assert(env->cipher); - tor_assert(from); - tor_assert(fromlen); - tor_assert(to); - tor_assert(fromlen < SIZE_T_CEILING); - - aes_crypt(env->cipher, from, fromlen, to); - return 0; -} - -/** Decrypt fromlen bytes from from using the cipher - * env; on success, store the result to to and return 0. - * On failure, return -1. - */ -int -crypto_cipher_decrypt(crypto_cipher_t *env, char *to, - const char *from, size_t fromlen) -{ - tor_assert(env); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < SIZE_T_CEILING); - - aes_crypt(env->cipher, from, fromlen, to); - return 0; -} - -/** Encrypt len bytes on from using the cipher in env; - * on success, return 0. On failure, return -1. - */ -int -crypto_cipher_crypt_inplace(crypto_cipher_t *env, char *buf, size_t len) -{ - tor_assert(len < SIZE_T_CEILING); - aes_crypt_inplace(env->cipher, buf, len); - return 0; -} - -/** Encrypt fromlen bytes (at least 1) from from with the key in - * key to the buffer in to of length - * tolen. tolen must be at least fromlen plus - * CIPHER_IV_LEN bytes for the initialization vector. On success, return the - * number of bytes written, on failure, return -1. - */ -int -crypto_cipher_encrypt_with_iv(const char *key, - char *to, size_t tolen, - const char *from, size_t fromlen) -{ - crypto_cipher_t *cipher; - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < INT_MAX); - - if (fromlen < 1) - return -1; - if (tolen < fromlen + CIPHER_IV_LEN) - return -1; - - cipher = crypto_cipher_new_with_iv(key, NULL); - - memcpy(to, cipher->iv, CIPHER_IV_LEN); - crypto_cipher_encrypt(cipher, to+CIPHER_IV_LEN, from, fromlen); - crypto_cipher_free(cipher); - return (int)(fromlen + CIPHER_IV_LEN); -} - -/** Decrypt fromlen bytes (at least 1+CIPHER_IV_LEN) from from - * with the key in key to the buffer in to of length - * tolen. tolen must be at least fromlen minus - * CIPHER_IV_LEN bytes for the initialization vector. On success, return the - * number of bytes written, on failure, return -1. - */ -int -crypto_cipher_decrypt_with_iv(const char *key, - char *to, size_t tolen, - const char *from, size_t fromlen) -{ - crypto_cipher_t *cipher; - tor_assert(key); - tor_assert(from); - tor_assert(to); - tor_assert(fromlen < INT_MAX); - - if (fromlen <= CIPHER_IV_LEN) - return -1; - if (tolen < fromlen - CIPHER_IV_LEN) - return -1; - - cipher = crypto_cipher_new_with_iv(key, from); - - crypto_cipher_encrypt(cipher, to, from+CIPHER_IV_LEN, fromlen-CIPHER_IV_LEN); - crypto_cipher_free(cipher); - return (int)(fromlen - CIPHER_IV_LEN); -} - -/* SHA-1 */ - -/** Compute the SHA1 digest of the len bytes on data stored in - * m. Write the DIGEST_LEN byte result into digest. - * Return 0 on success, -1 on failure. - */ -int -crypto_digest(char *digest, const char *m, size_t len) -{ - tor_assert(m); - tor_assert(digest); - return (SHA1((const unsigned char*)m,len,(unsigned char*)digest) == NULL); -} - -/** Compute a 256-bit digest of len bytes in data stored in m, - * using the algorithm algorithm. Write the DIGEST_LEN256-byte result - * into digest. Return 0 on success, -1 on failure. */ -int -crypto_digest256(char *digest, const char *m, size_t len, - digest_algorithm_t algorithm) -{ - tor_assert(m); - tor_assert(digest); - tor_assert(algorithm == DIGEST_SHA256); - return (SHA256((const unsigned char*)m,len,(unsigned char*)digest) == NULL); -} - -/** Set the digests_t in ds_out to contain every digest on the - * len bytes in m that we know how to compute. Return 0 on - * success, -1 on failure. */ -int -crypto_digest_all(digests_t *ds_out, const char *m, size_t len) -{ - int i; - tor_assert(ds_out); - memset(ds_out, 0, sizeof(*ds_out)); - if (crypto_digest(ds_out->d[DIGEST_SHA1], m, len) < 0) - return -1; - for (i = DIGEST_SHA256; i < N_DIGEST_ALGORITHMS; ++i) { - if (crypto_digest256(ds_out->d[i], m, len, i) < 0) - return -1; - } - return 0; -} - -/** Return the name of an algorithm, as used in directory documents. */ -const char * -crypto_digest_algorithm_get_name(digest_algorithm_t alg) -{ - switch (alg) { - case DIGEST_SHA1: - return "sha1"; - case DIGEST_SHA256: - return "sha256"; - default: - tor_fragile_assert(); - return "??unknown_digest??"; - } -} - -/** Given the name of a digest algorithm, return its integer value, or -1 if - * the name is not recognized. */ -int -crypto_digest_algorithm_parse_name(const char *name) -{ - if (!strcmp(name, "sha1")) - return DIGEST_SHA1; - else if (!strcmp(name, "sha256")) - return DIGEST_SHA256; - else - return -1; -} - -/** Intermediate information about the digest of a stream of data. */ -struct crypto_digest_t { - union { - SHA_CTX sha1; /**< state for SHA1 */ - SHA256_CTX sha2; /**< state for SHA256 */ - } d; /**< State for the digest we're using. Only one member of the - * union is usable, depending on the value of algorithm. */ - ENUM_BF(digest_algorithm_t) algorithm : 8; /**< Which algorithm is in use? */ -}; - -/** Allocate and return a new digest object to compute SHA1 digests. - */ -crypto_digest_t * -crypto_digest_new(void) -{ - crypto_digest_t *r; - r = tor_malloc(sizeof(crypto_digest_t)); - SHA1_Init(&r->d.sha1); - r->algorithm = DIGEST_SHA1; - return r; -} - -/** Allocate and return a new digest object to compute 256-bit digests - * using algorithm. */ -crypto_digest_t * -crypto_digest256_new(digest_algorithm_t algorithm) -{ - crypto_digest_t *r; - tor_assert(algorithm == DIGEST_SHA256); - r = tor_malloc(sizeof(crypto_digest_t)); - SHA256_Init(&r->d.sha2); - r->algorithm = algorithm; - return r; -} - -/** Deallocate a digest object. - */ -void -crypto_digest_free(crypto_digest_t *digest) -{ - if (!digest) - return; - memwipe(digest, 0, sizeof(crypto_digest_t)); - tor_free(digest); -} - -/** Add len bytes from data to the digest object. - */ -void -crypto_digest_add_bytes(crypto_digest_t *digest, const char *data, - size_t len) -{ - tor_assert(digest); - tor_assert(data); - /* Using the SHA*_*() calls directly means we don't support doing - * SHA in hardware. But so far the delay of getting the question - * to the hardware, and hearing the answer, is likely higher than - * just doing it ourselves. Hashes are fast. - */ - switch (digest->algorithm) { - case DIGEST_SHA1: - SHA1_Update(&digest->d.sha1, (void*)data, len); - break; - case DIGEST_SHA256: - SHA256_Update(&digest->d.sha2, (void*)data, len); - break; - default: - tor_fragile_assert(); - break; - } -} - -/** Compute the hash of the data that has been passed to the digest - * object; write the first out_len bytes of the result to out. - * out_len must be \<= DIGEST256_LEN. - */ -void -crypto_digest_get_digest(crypto_digest_t *digest, - char *out, size_t out_len) -{ - unsigned char r[DIGEST256_LEN]; - crypto_digest_t tmpenv; - tor_assert(digest); - tor_assert(out); - /* memcpy into a temporary ctx, since SHA*_Final clears the context */ - memcpy(&tmpenv, digest, sizeof(crypto_digest_t)); - switch (digest->algorithm) { - case DIGEST_SHA1: - tor_assert(out_len <= DIGEST_LEN); - SHA1_Final(r, &tmpenv.d.sha1); - break; - case DIGEST_SHA256: - tor_assert(out_len <= DIGEST256_LEN); - SHA256_Final(r, &tmpenv.d.sha2); - break; - default: - log_warn(LD_BUG, "Called with unknown algorithm %d", digest->algorithm); - /* If fragile_assert is not enabled, then we should at least not - * leak anything. */ - memset(r, 0xff, sizeof(r)); - tor_fragile_assert(); - break; - } - memcpy(out, r, out_len); - memwipe(r, 0, sizeof(r)); -} - -/** Allocate and return a new digest object with the same state as - * digest - */ -crypto_digest_t * -crypto_digest_dup(const crypto_digest_t *digest) -{ - crypto_digest_t *r; - tor_assert(digest); - r = tor_malloc(sizeof(crypto_digest_t)); - memcpy(r,digest,sizeof(crypto_digest_t)); - return r; -} - -/** Replace the state of the digest object into with the state - * of the digest object from. - */ -void -crypto_digest_assign(crypto_digest_t *into, - const crypto_digest_t *from) -{ - tor_assert(into); - tor_assert(from); - memcpy(into,from,sizeof(crypto_digest_t)); -} - -/** Given a list of strings in lst, set the len_out-byte digest - * at digest_out to the hash of the concatenation of those strings, - * plus the optional string append, computed with the algorithm - * alg. - * out_len must be \<= DIGEST256_LEN. */ -void -crypto_digest_smartlist(char *digest_out, size_t len_out, - const smartlist_t *lst, const char *append, - digest_algorithm_t alg) -{ - crypto_digest_t *d; - if (alg == DIGEST_SHA1) - d = crypto_digest_new(); - else - d = crypto_digest256_new(alg); - SMARTLIST_FOREACH(lst, const char *, cp, - crypto_digest_add_bytes(d, cp, strlen(cp))); - if (append) - crypto_digest_add_bytes(d, append, strlen(append)); - crypto_digest_get_digest(d, digest_out, len_out); - crypto_digest_free(d); -} - -/** Compute the HMAC-SHA-256 of the msg_len bytes in msg, using - * the key of length key_len. Store the DIGEST256_LEN-byte - * result in hmac_out. - */ -void -crypto_hmac_sha256(char *hmac_out, - const char *key, size_t key_len, - const char *msg, size_t msg_len) -{ - /* If we've got OpenSSL >=0.9.8 we can use its hmac implementation. */ - tor_assert(key_len < INT_MAX); - tor_assert(msg_len < INT_MAX); - HMAC(EVP_sha256(), key, (int)key_len, (unsigned char*)msg, (int)msg_len, - (unsigned char*)hmac_out, NULL); -} - -/* DH */ - -/** Our DH 'g' parameter */ -#define DH_GENERATOR 2 - -/** Shared P parameter for our circuit-crypto DH key exchanges. */ -static BIGNUM *dh_param_p = NULL; -/** Shared P parameter for our TLS DH key exchanges. */ -static BIGNUM *dh_param_p_tls = NULL; -/** Shared G parameter for our DH key exchanges. */ -static BIGNUM *dh_param_g = NULL; - -/** Generate and return a reasonable and safe DH parameter p. */ -static BIGNUM * -crypto_generate_dynamic_dh_modulus(void) -{ - BIGNUM *dynamic_dh_modulus; - DH *dh_parameters; - int r, dh_codes; - char *s; - - dynamic_dh_modulus = BN_new(); - tor_assert(dynamic_dh_modulus); - - dh_parameters = DH_generate_parameters(DH_BYTES*8, DH_GENERATOR, NULL, NULL); - tor_assert(dh_parameters); - - r = DH_check(dh_parameters, &dh_codes); - tor_assert(r && !dh_codes); - - BN_copy(dynamic_dh_modulus, dh_parameters->p); - tor_assert(dynamic_dh_modulus); - - DH_free(dh_parameters); - - { /* log the dynamic DH modulus: */ - s = BN_bn2hex(dynamic_dh_modulus); - tor_assert(s); - log_info(LD_OR, "Dynamic DH modulus generated: [%s]", s); - OPENSSL_free(s); - } - - return dynamic_dh_modulus; -} - -/** Store our dynamic DH modulus (and its group parameters) to - fname for future use. */ -static int -crypto_store_dynamic_dh_modulus(const char *fname) -{ - int len, new_len; - DH *dh = NULL; - unsigned char *dh_string_repr = NULL; - char *base64_encoded_dh = NULL; - char *file_string = NULL; - int retval = -1; - static const char file_header[] = "# This file contains stored Diffie-" - "Hellman parameters for future use.\n# You *do not* need to edit this " - "file.\n\n"; - - tor_assert(fname); - - if (!dh_param_p_tls) { - log_info(LD_CRYPTO, "Tried to store a DH modulus that does not exist."); - goto done; - } - - if (!(dh = DH_new())) - goto done; - if (!(dh->p = BN_dup(dh_param_p_tls))) - goto done; - if (!(dh->g = BN_new())) - goto done; - if (!BN_set_word(dh->g, DH_GENERATOR)) - goto done; - - len = i2d_DHparams(dh, &dh_string_repr); - if ((len < 0) || (dh_string_repr == NULL)) { - log_warn(LD_CRYPTO, "Error occured while DER encoding DH modulus (2)."); - goto done; - } - - base64_encoded_dh = tor_malloc_zero(len * 2); /* should be enough */ - new_len = base64_encode(base64_encoded_dh, len * 2, - (char *)dh_string_repr, len); - if (new_len < 0) { - log_warn(LD_CRYPTO, "Error occured while base64-encoding DH modulus."); - goto done; - } - - /* concatenate file header and the dh parameters blob */ - new_len = tor_asprintf(&file_string, "%s%s", file_header, base64_encoded_dh); - - /* write to file */ - if (write_bytes_to_new_file(fname, file_string, new_len, 0) < 0) { - log_info(LD_CRYPTO, "'%s' was already occupied.", fname); - goto done; - } - - retval = 0; - - done: - if (dh) - DH_free(dh); - if (dh_string_repr) - OPENSSL_free(dh_string_repr); - tor_free(base64_encoded_dh); - tor_free(file_string); - - return retval; -} - -/** Return the dynamic DH modulus stored in fname. If there is no - dynamic DH modulus stored in fname, return NULL. */ -static BIGNUM * -crypto_get_stored_dynamic_dh_modulus(const char *fname) -{ - int retval; - char *contents = NULL; - const char *contents_tmp = NULL; - int dh_codes; - DH *stored_dh = NULL; - BIGNUM *dynamic_dh_modulus = NULL; - int length = 0; - unsigned char *base64_decoded_dh = NULL; - const unsigned char *cp = NULL; - - tor_assert(fname); - - contents = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); - if (!contents) { - log_info(LD_CRYPTO, "Could not open file '%s'", fname); - goto done; /*usually means that ENOENT. don't try to move file to broken.*/ - } - - /* skip the file header */ - contents_tmp = eat_whitespace(contents); - if (!*contents_tmp) { - log_warn(LD_CRYPTO, "Stored dynamic DH modulus file " - "seems corrupted (eat_whitespace)."); - goto err; - } - - /* 'fname' contains the DH parameters stored in base64-ed DER - * format. We are only interested in the DH modulus. - * NOTE: We allocate more storage here than we need. Since we're already - * doing that, we can also add 1 byte extra to appease Coverity's - * scanner. */ - - cp = base64_decoded_dh = tor_malloc_zero(strlen(contents_tmp) + 1); - length = base64_decode((char *)base64_decoded_dh, strlen(contents_tmp), - contents_tmp, strlen(contents_tmp)); - if (length < 0) { - log_warn(LD_CRYPTO, "Stored dynamic DH modulus seems corrupted (base64)."); - goto err; - } - - stored_dh = d2i_DHparams(NULL, &cp, length); - if ((!stored_dh) || (cp - base64_decoded_dh != length)) { - log_warn(LD_CRYPTO, "Stored dynamic DH modulus seems corrupted (d2i)."); - goto err; - } - - { /* check the cryptographic qualities of the stored dynamic DH modulus: */ - retval = DH_check(stored_dh, &dh_codes); - if (!retval || dh_codes) { - log_warn(LD_CRYPTO, "Stored dynamic DH modulus is not a safe prime."); - goto err; - } - - retval = DH_size(stored_dh); - if (retval < DH_BYTES) { - log_warn(LD_CRYPTO, "Stored dynamic DH modulus is smaller " - "than '%d' bits.", DH_BYTES*8); - goto err; - } - - if (!BN_is_word(stored_dh->g, 2)) { - log_warn(LD_CRYPTO, "Stored dynamic DH parameters do not use '2' " - "as the group generator."); - goto err; - } - } - - { /* log the dynamic DH modulus: */ - char *s = BN_bn2hex(stored_dh->p); - tor_assert(s); - log_info(LD_OR, "Found stored dynamic DH modulus: [%s]", s); - OPENSSL_free(s); - } - - goto done; - - err: - - { - /* move broken prime to $filename.broken */ - char *fname_new=NULL; - tor_asprintf(&fname_new, "%s.broken", fname); - - log_warn(LD_CRYPTO, "Moving broken dynamic DH prime to '%s'.", fname_new); - - if (replace_file(fname, fname_new)) - log_notice(LD_CRYPTO, "Error while moving '%s' to '%s'.", - fname, fname_new); - - tor_free(fname_new); - } - - if (stored_dh) { - DH_free(stored_dh); - stored_dh = NULL; - } - - done: - tor_free(contents); - tor_free(base64_decoded_dh); - - if (stored_dh) { - dynamic_dh_modulus = BN_dup(stored_dh->p); - DH_free(stored_dh); - } - - return dynamic_dh_modulus; -} - -/** Set the global TLS Diffie-Hellman modulus. - * If dynamic_dh_modulus_fname is set, try to read a dynamic DH modulus - * off it and use it as the DH modulus. If that's not possible, - * generate a new dynamic DH modulus. - * If dynamic_dh_modulus_fname is NULL, use the Apache mod_ssl DH - * modulus. */ -void -crypto_set_tls_dh_prime(const char *dynamic_dh_modulus_fname) -{ - BIGNUM *tls_prime = NULL; - int store_dh_prime_afterwards = 0; - int r; - - /* If the space is occupied, free the previous TLS DH prime */ - if (dh_param_p_tls) { - BN_clear_free(dh_param_p_tls); - dh_param_p_tls = NULL; - } - - if (dynamic_dh_modulus_fname) { /* use dynamic DH modulus: */ - log_info(LD_OR, "Using stored dynamic DH modulus."); - tls_prime = crypto_get_stored_dynamic_dh_modulus(dynamic_dh_modulus_fname); - - if (!tls_prime) { - log_notice(LD_OR, "Generating fresh dynamic DH modulus. " - "This might take a while..."); - tls_prime = crypto_generate_dynamic_dh_modulus(); - - store_dh_prime_afterwards++; - } - } else { /* use the static DH prime modulus used by Apache in mod_ssl: */ - tls_prime = BN_new(); - tor_assert(tls_prime); - - /* This is the 1024-bit safe prime that Apache uses for its DH stuff; see - * modules/ssl/ssl_engine_dh.c; Apache also uses a generator of 2 with this - * prime. - */ - r =BN_hex2bn(&tls_prime, - "D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98" - "BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A" - "467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7" - "DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68" - "B0E7393E0F24218EB3"); - tor_assert(r); - } - - tor_assert(tls_prime); - - dh_param_p_tls = tls_prime; - - if (store_dh_prime_afterwards) - /* save the new dynamic DH modulus to disk. */ - if (crypto_store_dynamic_dh_modulus(dynamic_dh_modulus_fname)) { - log_notice(LD_CRYPTO, "Failed while storing dynamic DH modulus. " - "Make sure your data directory is sane."); - } -} - -/** Initialize dh_param_p and dh_param_g if they are not already - * set. */ -static void -init_dh_param(void) -{ - BIGNUM *circuit_dh_prime, *generator; - int r; - if (dh_param_p && dh_param_g) - return; - - circuit_dh_prime = BN_new(); - generator = BN_new(); - tor_assert(circuit_dh_prime && generator); - - /* Set our generator for all DH parameters */ - r = BN_set_word(generator, DH_GENERATOR); - tor_assert(r); - - /* This is from rfc2409, section 6.2. It's a safe prime, and - supposedly it equals: - 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }. - */ - r = BN_hex2bn(&circuit_dh_prime, - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" - "49286651ECE65381FFFFFFFFFFFFFFFF"); - tor_assert(r); - - /* Set the new values as the global DH parameters. */ - dh_param_p = circuit_dh_prime; - dh_param_g = generator; - - /* Ensure that we have TLS DH parameters set up, too, even if we're - going to change them soon. */ - if (!dh_param_p_tls) { - crypto_set_tls_dh_prime(NULL); - } -} - -/** Number of bits to use when choosing the x or y value in a Diffie-Hellman - * handshake. Since we exponentiate by this value, choosing a smaller one - * lets our handhake go faster. - */ -#define DH_PRIVATE_KEY_BITS 320 - -/** Allocate and return a new DH object for a key exchange. - */ -crypto_dh_t * -crypto_dh_new(int dh_type) -{ - crypto_dh_t *res = tor_malloc_zero(sizeof(crypto_dh_t)); - - tor_assert(dh_type == DH_TYPE_CIRCUIT || dh_type == DH_TYPE_TLS || - dh_type == DH_TYPE_REND); - - if (!dh_param_p) - init_dh_param(); - - if (!(res->dh = DH_new())) - goto err; - - if (dh_type == DH_TYPE_TLS) { - if (!(res->dh->p = BN_dup(dh_param_p_tls))) - goto err; - } else { - if (!(res->dh->p = BN_dup(dh_param_p))) - goto err; - } - - if (!(res->dh->g = BN_dup(dh_param_g))) - goto err; - - res->dh->length = DH_PRIVATE_KEY_BITS; - - return res; - err: - crypto_log_errors(LOG_WARN, "creating DH object"); - if (res->dh) DH_free(res->dh); /* frees p and g too */ - tor_free(res); - return NULL; -} - -/** Return a copy of dh, sharing its internal state. */ -crypto_dh_t * -crypto_dh_dup(const crypto_dh_t *dh) -{ - crypto_dh_t *dh_new = tor_malloc_zero(sizeof(crypto_dh_t)); - dh_new->dh = dh->dh; - DH_up_ref(dh->dh); - return dh_new; -} - -/** Return the length of the DH key in dh, in bytes. - */ -int -crypto_dh_get_bytes(crypto_dh_t *dh) -{ - tor_assert(dh); - return DH_size(dh->dh); -} - -/** Generate \ for our part of the key exchange. Return 0 on - * success, -1 on failure. - */ -int -crypto_dh_generate_public(crypto_dh_t *dh) -{ - again: - if (!DH_generate_key(dh->dh)) { - crypto_log_errors(LOG_WARN, "generating DH key"); - return -1; - } - if (tor_check_dh_key(LOG_WARN, dh->dh->pub_key)<0) { - log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid. I guess once-in-" - "the-universe chances really do happen. Trying again."); - /* Free and clear the keys, so OpenSSL will actually try again. */ - BN_clear_free(dh->dh->pub_key); - BN_clear_free(dh->dh->priv_key); - dh->dh->pub_key = dh->dh->priv_key = NULL; - goto again; - } - return 0; -} - -/** Generate g^x as necessary, and write the g^x for the key exchange - * as a pubkey_len-byte value into pubkey. Return 0 on - * success, -1 on failure. pubkey_len must be \>= DH_BYTES. - */ -int -crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len) -{ - int bytes; - tor_assert(dh); - if (!dh->dh->pub_key) { - if (crypto_dh_generate_public(dh)<0) - return -1; - } - - tor_assert(dh->dh->pub_key); - bytes = BN_num_bytes(dh->dh->pub_key); - tor_assert(bytes >= 0); - if (pubkey_len < (size_t)bytes) { - log_warn(LD_CRYPTO, - "Weird! pubkey_len (%d) was smaller than DH_BYTES (%d)", - (int) pubkey_len, bytes); - return -1; - } - - memset(pubkey, 0, pubkey_len); - BN_bn2bin(dh->dh->pub_key, (unsigned char*)(pubkey+(pubkey_len-bytes))); - - return 0; -} - -/** Check for bad Diffie-Hellman public keys (g^x). Return 0 if the key is - * okay (in the subgroup [2,p-2]), or -1 if it's bad. - * See http://www.cl.cam.ac.uk/ftp/users/rja14/psandqs.ps.gz for some tips. - */ -static int -tor_check_dh_key(int severity, BIGNUM *bn) -{ - BIGNUM *x; - char *s; - tor_assert(bn); - x = BN_new(); - tor_assert(x); - if (!dh_param_p) - init_dh_param(); - BN_set_word(x, 1); - if (BN_cmp(bn,x)<=0) { - log_fn(severity, LD_CRYPTO, "DH key must be at least 2."); - goto err; - } - BN_copy(x,dh_param_p); - BN_sub_word(x, 1); - if (BN_cmp(bn,x)>=0) { - log_fn(severity, LD_CRYPTO, "DH key must be at most p-2."); - goto err; - } - BN_clear_free(x); - return 0; - err: - BN_clear_free(x); - s = BN_bn2hex(bn); - log_fn(severity, LD_CRYPTO, "Rejecting insecure DH key [%s]", s); - OPENSSL_free(s); - return -1; -} - -#undef MIN -#define MIN(a,b) ((a)<(b)?(a):(b)) -/** Given a DH key exchange object, and our peer's value of g^y (as a - * pubkey_len-byte value in pubkey) generate - * secret_bytes_out bytes of shared key material and write them - * to secret_out. Return the number of bytes generated on success, - * or -1 on failure. - * - * (We generate key material by computing - * SHA1( g^xy || "\x00" ) || SHA1( g^xy || "\x01" ) || ... - * where || is concatenation.) - */ -ssize_t -crypto_dh_compute_secret(int severity, crypto_dh_t *dh, - const char *pubkey, size_t pubkey_len, - char *secret_out, size_t secret_bytes_out) -{ - char *secret_tmp = NULL; - BIGNUM *pubkey_bn = NULL; - size_t secret_len=0, secret_tmp_len=0; - int result=0; - tor_assert(dh); - tor_assert(secret_bytes_out/DIGEST_LEN <= 255); - tor_assert(pubkey_len < INT_MAX); - - if (!(pubkey_bn = BN_bin2bn((const unsigned char*)pubkey, - (int)pubkey_len, NULL))) - goto error; - if (tor_check_dh_key(severity, pubkey_bn)<0) { - /* Check for invalid public keys. */ - log_fn(severity, LD_CRYPTO,"Rejected invalid g^x"); - goto error; - } - secret_tmp_len = crypto_dh_get_bytes(dh); - secret_tmp = tor_malloc(secret_tmp_len); - result = DH_compute_key((unsigned char*)secret_tmp, pubkey_bn, dh->dh); - if (result < 0) { - log_warn(LD_CRYPTO,"DH_compute_key() failed."); - goto error; - } - secret_len = result; - if (crypto_expand_key_material_TAP((uint8_t*)secret_tmp, secret_len, - (uint8_t*)secret_out, secret_bytes_out)<0) - goto error; - secret_len = secret_bytes_out; - - goto done; - error: - result = -1; - done: - crypto_log_errors(LOG_WARN, "completing DH handshake"); - if (pubkey_bn) - BN_clear_free(pubkey_bn); - if (secret_tmp) { - memwipe(secret_tmp, 0, secret_tmp_len); - tor_free(secret_tmp); - } - if (result < 0) - return result; - else - return secret_len; -} - -/** Given key_in_len bytes of negotiated randomness in key_in - * ("K"), expand it into key_out_len bytes of negotiated key material in - * key_out by taking the first key_out_len bytes of - * H(K | [00]) | H(K | [01]) | .... - * - * This is the key expansion algorithm used in the "TAP" circuit extension - * mechanism; it shouldn't be used for new protocols. - * - * Return 0 on success, -1 on failure. - */ -int -crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, - uint8_t *key_out, size_t key_out_len) -{ - int i; - uint8_t *cp, *tmp = tor_malloc(key_in_len+1); - uint8_t digest[DIGEST_LEN]; - - /* If we try to get more than this amount of key data, we'll repeat blocks.*/ - tor_assert(key_out_len <= DIGEST_LEN*256); - - memcpy(tmp, key_in, key_in_len); - for (cp = key_out, i=0; cp < key_out+key_out_len; - ++i, cp += DIGEST_LEN) { - tmp[key_in_len] = i; - if (crypto_digest((char*)digest, (const char *)tmp, key_in_len+1)) - goto err; - memcpy(cp, digest, MIN(DIGEST_LEN, key_out_len-(cp-key_out))); - } - memwipe(tmp, 0, key_in_len+1); - tor_free(tmp); - memwipe(digest, 0, sizeof(digest)); - return 0; - - err: - memwipe(tmp, 0, key_in_len+1); - tor_free(tmp); - memwipe(digest, 0, sizeof(digest)); - return -1; -} - -/** Expand some secret key material according to RFC5869, using SHA256 as the - * underlying hash. The key_in_len bytes at key_in are the - * secret key material; the salt_in_len bytes at salt_in and the - * info_in_len bytes in info_in_len are the algorithm's "salt" - * and "info" parameters respectively. On success, write key_out_len - * bytes to key_out and return 0. On failure, return -1. - */ -int -crypto_expand_key_material_rfc5869_sha256( - const uint8_t *key_in, size_t key_in_len, - const uint8_t *salt_in, size_t salt_in_len, - const uint8_t *info_in, size_t info_in_len, - uint8_t *key_out, size_t key_out_len) -{ - uint8_t prk[DIGEST256_LEN]; - uint8_t tmp[DIGEST256_LEN + 128 + 1]; - uint8_t mac[DIGEST256_LEN]; - int i; - uint8_t *outp; - size_t tmp_len; - - crypto_hmac_sha256((char*)prk, - (const char*)salt_in, salt_in_len, - (const char*)key_in, key_in_len); - - /* If we try to get more than this amount of key data, we'll repeat blocks.*/ - tor_assert(key_out_len <= DIGEST256_LEN * 256); - tor_assert(info_in_len <= 128); - memset(tmp, 0, sizeof(tmp)); - outp = key_out; - i = 1; - - while (key_out_len) { - size_t n; - if (i > 1) { - memcpy(tmp, mac, DIGEST256_LEN); - memcpy(tmp+DIGEST256_LEN, info_in, info_in_len); - tmp[DIGEST256_LEN+info_in_len] = i; - tmp_len = DIGEST256_LEN + info_in_len + 1; - } else { - memcpy(tmp, info_in, info_in_len); - tmp[info_in_len] = i; - tmp_len = info_in_len + 1; - } - crypto_hmac_sha256((char*)mac, - (const char*)prk, DIGEST256_LEN, - (const char*)tmp, tmp_len); - n = key_out_len < DIGEST256_LEN ? key_out_len : DIGEST256_LEN; - memcpy(outp, mac, n); - key_out_len -= n; - outp += n; - ++i; - } - - memwipe(tmp, 0, sizeof(tmp)); - memwipe(mac, 0, sizeof(mac)); - return 0; -} - -/** Free a DH key exchange object. - */ -void -crypto_dh_free(crypto_dh_t *dh) -{ - if (!dh) - return; - tor_assert(dh->dh); - DH_free(dh->dh); - tor_free(dh); -} - -/* random numbers */ - -/** How many bytes of entropy we add at once. - * - * This is how much entropy OpenSSL likes to add right now, so maybe it will - * work for us too. */ -#define ADD_ENTROPY 32 - -/** True iff it's safe to use RAND_poll after setup. - * - * Versions of OpenSSL prior to 0.9.7k and 0.9.8c had a bug where RAND_poll - * would allocate an fd_set on the stack, open a new file, and try to FD_SET - * that fd without checking whether it fit in the fd_set. Thus, if the - * system has not just been started up, it is unsafe to call */ -#define RAND_POLL_IS_SAFE \ - (OPENSSL_VERSION_NUMBER >= OPENSSL_V(0,9,8,'c')) - -/** Set the seed of the weak RNG to a random value. */ -void -crypto_seed_weak_rng(tor_weak_rng_t *rng) -{ - unsigned seed; - crypto_rand((void*)&seed, sizeof(seed)); - tor_init_weak_random(rng, seed); -} - -/** Try to get out_len bytes of the strongest entropy we can generate, - * storing it into out. - */ -int -crypto_strongest_rand(uint8_t *out, size_t out_len) -{ -#ifdef _WIN32 - static int provider_set = 0; - static HCRYPTPROV provider; -#else - static const char *filenames[] = { - "/dev/srandom", "/dev/urandom", "/dev/random", NULL - }; - int fd, i; - size_t n; -#endif - -#ifdef _WIN32 - if (!provider_set) { - if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT)) { - if ((unsigned long)GetLastError() != (unsigned long)NTE_BAD_KEYSET) { - log_warn(LD_CRYPTO, "Can't get CryptoAPI provider [1]"); - return -1; - } - } - provider_set = 1; - } - if (!CryptGenRandom(provider, out_len, out)) { - log_warn(LD_CRYPTO, "Can't get entropy from CryptoAPI."); - return -1; - } - - return 0; -#else - for (i = 0; filenames[i]; ++i) { - fd = open(sandbox_intern_string(filenames[i]), O_RDONLY, 0); - if (fd<0) continue; - log_info(LD_CRYPTO, "Reading entropy from \"%s\"", filenames[i]); - n = read_all(fd, (char*)out, out_len, 0); - close(fd); - if (n != out_len) { - log_warn(LD_CRYPTO, - "Error reading from entropy source (read only %lu bytes).", - (unsigned long)n); - return -1; - } - - return 0; - } - - log_warn(LD_CRYPTO, "Cannot get strong entropy: no entropy source found."); - return -1; -#endif -} - -/** Seed OpenSSL's random number generator with bytes from the operating - * system. startup should be true iff we have just started Tor and - * have not yet allocated a bunch of fds. Return 0 on success, -1 on failure. - */ -int -crypto_seed_rng(int startup) -{ - int rand_poll_ok = 0, load_entropy_ok = 0; - uint8_t buf[ADD_ENTROPY]; - - /* OpenSSL has a RAND_poll function that knows about more kinds of - * entropy than we do. We'll try calling that, *and* calling our own entropy - * functions. If one succeeds, we'll accept the RNG as seeded. */ - if (startup || RAND_POLL_IS_SAFE) { - rand_poll_ok = RAND_poll(); - if (rand_poll_ok == 0) - log_warn(LD_CRYPTO, "RAND_poll() failed."); - } - - load_entropy_ok = !crypto_strongest_rand(buf, sizeof(buf)); - if (load_entropy_ok) { - RAND_seed(buf, sizeof(buf)); - } - - memwipe(buf, 0, sizeof(buf)); - - if (rand_poll_ok || load_entropy_ok) - return 0; - else - return -1; -} - -/** Write n bytes of strong random data to to. Return 0 on - * success, -1 on failure. - */ -MOCK_IMPL(int, -crypto_rand, (char *to, size_t n)) -{ - int r; - tor_assert(n < INT_MAX); - tor_assert(to); - r = RAND_bytes((unsigned char*)to, (int)n); - if (r == 0) - crypto_log_errors(LOG_WARN, "generating random data"); - return (r == 1) ? 0 : -1; -} - -/** Return a pseudorandom integer, chosen uniformly from the values - * between 0 and max-1 inclusive. max must be between 1 and - * INT_MAX+1, inclusive. */ -int -crypto_rand_int(unsigned int max) -{ - unsigned int val; - unsigned int cutoff; - tor_assert(max <= ((unsigned int)INT_MAX)+1); - tor_assert(max > 0); /* don't div by 0 */ - - /* We ignore any values that are >= 'cutoff,' to avoid biasing the - * distribution with clipping at the upper end of unsigned int's - * range. - */ - cutoff = UINT_MAX - (UINT_MAX%max); - while (1) { - crypto_rand((char*)&val, sizeof(val)); - if (val < cutoff) - return val % max; - } -} - -/** Return a pseudorandom 64-bit integer, chosen uniformly from the values - * between 0 and max-1. */ -uint64_t -crypto_rand_uint64(uint64_t max) -{ - uint64_t val; - uint64_t cutoff; - tor_assert(max < UINT64_MAX); - tor_assert(max > 0); /* don't div by 0 */ - - /* We ignore any values that are >= 'cutoff,' to avoid biasing the - * distribution with clipping at the upper end of unsigned int's - * range. - */ - cutoff = UINT64_MAX - (UINT64_MAX%max); - while (1) { - crypto_rand((char*)&val, sizeof(val)); - if (val < cutoff) - return val % max; - } -} - -/** Return a pseudorandom double d, chosen uniformly from the range - * 0.0 <= d < 1.0. - */ -double -crypto_rand_double(void) -{ - /* We just use an unsigned int here; we don't really care about getting - * more than 32 bits of resolution */ - unsigned int uint; - crypto_rand((char*)&uint, sizeof(uint)); -#if SIZEOF_INT == 4 -#define UINT_MAX_AS_DOUBLE 4294967296.0 -#elif SIZEOF_INT == 8 -#define UINT_MAX_AS_DOUBLE 1.8446744073709552e+19 -#else -#error SIZEOF_INT is neither 4 nor 8 -#endif - return ((double)uint) / UINT_MAX_AS_DOUBLE; -} - -/** Generate and return a new random hostname starting with prefix, - * ending with suffix, and containing no fewer than - * min_rand_len and no more than max_rand_len random base32 - * characters between. - * - * Clip max_rand_len to MAX_DNS_LABEL_SIZE. - **/ -char * -crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, - const char *suffix) -{ - char *result, *rand_bytes; - int randlen, rand_bytes_len; - size_t resultlen, prefixlen; - - if (max_rand_len > MAX_DNS_LABEL_SIZE) - max_rand_len = MAX_DNS_LABEL_SIZE; - if (min_rand_len > max_rand_len) - min_rand_len = max_rand_len; - - randlen = min_rand_len + crypto_rand_int(max_rand_len - min_rand_len + 1); - - prefixlen = strlen(prefix); - resultlen = prefixlen + strlen(suffix) + randlen + 16; - - rand_bytes_len = ((randlen*5)+7)/8; - if (rand_bytes_len % 5) - rand_bytes_len += 5 - (rand_bytes_len%5); - rand_bytes = tor_malloc(rand_bytes_len); - crypto_rand(rand_bytes, rand_bytes_len); - - result = tor_malloc(resultlen); - memcpy(result, prefix, prefixlen); - base32_encode(result+prefixlen, resultlen-prefixlen, - rand_bytes, rand_bytes_len); - tor_free(rand_bytes); - strlcpy(result+prefixlen+randlen, suffix, resultlen-(prefixlen+randlen)); - - return result; -} - -/** Return a randomly chosen element of sl; or NULL if sl - * is empty. */ -void * -smartlist_choose(const smartlist_t *sl) -{ - int len = smartlist_len(sl); - if (len) - return smartlist_get(sl,crypto_rand_int(len)); - return NULL; /* no elements to choose from */ -} - -/** Scramble the elements of sl into a random order. */ -void -smartlist_shuffle(smartlist_t *sl) -{ - int i; - /* From the end of the list to the front, choose at random from the - positions we haven't looked at yet, and swap that position into the - current position. Remember to give "no swap" the same probability as - any other swap. */ - for (i = smartlist_len(sl)-1; i > 0; --i) { - int j = crypto_rand_int(i+1); - smartlist_swap(sl, i, j); - } -} - -/** Base64 encode srclen bytes of data from src. Write - * the result into dest, if it will fit within destlen - * bytes. Return the number of bytes written on success; -1 if - * destlen is too short, or other failure. - */ -int -base64_encode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - /* FFFF we might want to rewrite this along the lines of base64_decode, if - * it ever shows up in the profile. */ - EVP_ENCODE_CTX ctx; - int len, ret; - tor_assert(srclen < INT_MAX); - - /* 48 bytes of input -> 64 bytes of output plus newline. - Plus one more byte, in case I'm wrong. - */ - if (destlen < ((srclen/48)+1)*66) - return -1; - if (destlen > SIZE_T_CEILING) - return -1; - - EVP_EncodeInit(&ctx); - EVP_EncodeUpdate(&ctx, (unsigned char*)dest, &len, - (unsigned char*)src, (int)srclen); - EVP_EncodeFinal(&ctx, (unsigned char*)(dest+len), &ret); - ret += len; - return ret; -} - -/** @{ */ -/** Special values used for the base64_decode_table */ -#define X 255 -#define SP 64 -#define PAD 65 -/** @} */ -/** Internal table mapping byte values to what they represent in base64. - * Numbers 0..63 are 6-bit integers. SPs are spaces, and should be - * skipped. Xs are invalid and must not appear in base64. PAD indicates - * end-of-string. */ -static const uint8_t base64_decode_table[256] = { - X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, /* */ - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, - X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, - X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, - X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, -}; - -/** Base64 decode srclen bytes of data from src. Write - * the result into dest, if it will fit within destlen - * bytes. Return the number of bytes written on success; -1 if - * destlen is too short, or other failure. - * - * NOTE 1: destlen is checked conservatively, as though srclen contained no - * spaces or padding. - * - * NOTE 2: This implementation does not check for the correct number of - * padding "=" characters at the end of the string, and does not check - * for internal padding characters. - */ -int -base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) -{ -#ifdef USE_OPENSSL_BASE64 - EVP_ENCODE_CTX ctx; - int len, ret; - /* 64 bytes of input -> *up to* 48 bytes of output. - Plus one more byte, in case I'm wrong. - */ - if (destlen < ((srclen/64)+1)*49) - return -1; - if (destlen > SIZE_T_CEILING) - return -1; - - EVP_DecodeInit(&ctx); - EVP_DecodeUpdate(&ctx, (unsigned char*)dest, &len, - (unsigned char*)src, srclen); - EVP_DecodeFinal(&ctx, (unsigned char*)dest, &ret); - ret += len; - return ret; -#else - const char *eos = src+srclen; - uint32_t n=0; - int n_idx=0; - char *dest_orig = dest; - - /* Max number of bits == srclen*6. - * Number of bytes required to hold all bits == (srclen*6)/8. - * Yes, we want to round down: anything that hangs over the end of a - * byte is padding. */ - if (destlen < (srclen*3)/4) - return -1; - if (destlen > SIZE_T_CEILING) - return -1; - - /* Iterate over all the bytes in src. Each one will add 0 or 6 bits to the - * value we're decoding. Accumulate bits in n, and whenever we have - * 24 bits, batch them into 3 bytes and flush those bytes to dest. - */ - for ( ; src < eos; ++src) { - unsigned char c = (unsigned char) *src; - uint8_t v = base64_decode_table[c]; - switch (v) { - case X: - /* This character isn't allowed in base64. */ - return -1; - case SP: - /* This character is whitespace, and has no effect. */ - continue; - case PAD: - /* We've hit an = character: the data is over. */ - goto end_of_loop; - default: - /* We have an actual 6-bit value. Append it to the bits in n. */ - n = (n<<6) | v; - if ((++n_idx) == 4) { - /* We've accumulated 24 bits in n. Flush them. */ - *dest++ = (n>>16); - *dest++ = (n>>8) & 0xff; - *dest++ = (n) & 0xff; - n_idx = 0; - n = 0; - } - } - } - end_of_loop: - /* If we have leftover bits, we need to cope. */ - switch (n_idx) { - case 0: - default: - /* No leftover bits. We win. */ - break; - case 1: - /* 6 leftover bits. That's invalid; we can't form a byte out of that. */ - return -1; - case 2: - /* 12 leftover bits: The last 4 are padding and the first 8 are data. */ - *dest++ = n >> 4; - break; - case 3: - /* 18 leftover bits: The last 2 are padding and the first 16 are data. */ - *dest++ = n >> 10; - *dest++ = n >> 2; - } - - tor_assert((dest-dest_orig) <= (ssize_t)destlen); - tor_assert((dest-dest_orig) <= INT_MAX); - - return (int)(dest-dest_orig); -#endif -} -#undef X -#undef SP -#undef PAD - -/** Base64 encode DIGEST_LINE bytes from digest, remove the trailing = - * and newline characters, and store the nul-terminated result in the first - * BASE64_DIGEST_LEN+1 bytes of d64. */ -int -digest_to_base64(char *d64, const char *digest) -{ - char buf[256]; - base64_encode(buf, sizeof(buf), digest, DIGEST_LEN); - buf[BASE64_DIGEST_LEN] = '\0'; - memcpy(d64, buf, BASE64_DIGEST_LEN+1); - return 0; -} - -/** Given a base64 encoded, nul-terminated digest in d64 (without - * trailing newline or = characters), decode it and store the result in the - * first DIGEST_LEN bytes at digest. */ -int -digest_from_base64(char *digest, const char *d64) -{ -#ifdef USE_OPENSSL_BASE64 - char buf_in[BASE64_DIGEST_LEN+3]; - char buf[256]; - if (strlen(d64) != BASE64_DIGEST_LEN) - return -1; - memcpy(buf_in, d64, BASE64_DIGEST_LEN); - memcpy(buf_in+BASE64_DIGEST_LEN, "=\n\0", 3); - if (base64_decode(buf, sizeof(buf), buf_in, strlen(buf_in)) != DIGEST_LEN) - return -1; - memcpy(digest, buf, DIGEST_LEN); - return 0; -#else - if (base64_decode(digest, DIGEST_LEN, d64, strlen(d64)) == DIGEST_LEN) - return 0; - else - return -1; -#endif -} - -/** Base64 encode DIGEST256_LINE bytes from digest, remove the - * trailing = and newline characters, and store the nul-terminated result in - * the first BASE64_DIGEST256_LEN+1 bytes of d64. */ -int -digest256_to_base64(char *d64, const char *digest) -{ - char buf[256]; - base64_encode(buf, sizeof(buf), digest, DIGEST256_LEN); - buf[BASE64_DIGEST256_LEN] = '\0'; - memcpy(d64, buf, BASE64_DIGEST256_LEN+1); - return 0; -} - -/** Given a base64 encoded, nul-terminated digest in d64 (without - * trailing newline or = characters), decode it and store the result in the - * first DIGEST256_LEN bytes at digest. */ -int -digest256_from_base64(char *digest, const char *d64) -{ -#ifdef USE_OPENSSL_BASE64 - char buf_in[BASE64_DIGEST256_LEN+3]; - char buf[256]; - if (strlen(d64) != BASE64_DIGEST256_LEN) - return -1; - memcpy(buf_in, d64, BASE64_DIGEST256_LEN); - memcpy(buf_in+BASE64_DIGEST256_LEN, "=\n\0", 3); - if (base64_decode(buf, sizeof(buf), buf_in, strlen(buf_in)) != DIGEST256_LEN) - return -1; - memcpy(digest, buf, DIGEST256_LEN); - return 0; -#else - if (base64_decode(digest, DIGEST256_LEN, d64, strlen(d64)) == DIGEST256_LEN) - return 0; - else - return -1; -#endif -} - -/** Implements base32 encoding as in RFC 4648. Limitation: Requires - * that srclen*8 is a multiple of 5. - */ -void -base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - unsigned int i, v, u; - size_t nbits = srclen * 8, bit; - - tor_assert(srclen < SIZE_T_CEILING/8); - tor_assert((nbits%5) == 0); /* We need an even multiple of 5 bits. */ - tor_assert((nbits/5)+1 <= destlen); /* We need enough space. */ - tor_assert(destlen < SIZE_T_CEILING); - - for (i=0,bit=0; bit < nbits; ++i, bit+=5) { - /* set v to the 16-bit value starting at src[bits/8], 0-padded. */ - v = ((uint8_t)src[bit/8]) << 8; - if (bit+5> (11-(bit%8))) & 0x1F; - dest[i] = BASE32_CHARS[u]; - } - dest[i] = '\0'; -} - -/** Implements base32 decoding as in RFC 4648. Limitation: Requires - * that srclen*5 is a multiple of 8. Returns 0 if successful, -1 otherwise. - */ -int -base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) -{ - /* XXXX we might want to rewrite this along the lines of base64_decode, if - * it ever shows up in the profile. */ - unsigned int i; - size_t nbits, j, bit; - char *tmp; - nbits = srclen * 5; - - tor_assert(srclen < SIZE_T_CEILING / 5); - tor_assert((nbits%8) == 0); /* We need an even multiple of 8 bits. */ - tor_assert((nbits/8) <= destlen); /* We need enough space. */ - tor_assert(destlen < SIZE_T_CEILING); - - /* Convert base32 encoded chars to the 5-bit values that they represent. */ - tmp = tor_malloc_zero(srclen); - for (j = 0; j < srclen; ++j) { - if (src[j] > 0x60 && src[j] < 0x7B) tmp[j] = src[j] - 0x61; - else if (src[j] > 0x31 && src[j] < 0x38) tmp[j] = src[j] - 0x18; - else if (src[j] > 0x40 && src[j] < 0x5B) tmp[j] = src[j] - 0x41; - else { - log_warn(LD_BUG, "illegal character in base32 encoded string"); - tor_free(tmp); - return -1; - } - } - - /* Assemble result byte-wise by applying five possible cases. */ - for (i = 0, bit = 0; bit < nbits; ++i, bit += 8) { - switch (bit % 40) { - case 0: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 3) + - (((uint8_t)tmp[(bit/5)+1]) >> 2); - break; - case 8: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 6) + - (((uint8_t)tmp[(bit/5)+1]) << 1) + - (((uint8_t)tmp[(bit/5)+2]) >> 4); - break; - case 16: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 4) + - (((uint8_t)tmp[(bit/5)+1]) >> 1); - break; - case 24: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 7) + - (((uint8_t)tmp[(bit/5)+1]) << 2) + - (((uint8_t)tmp[(bit/5)+2]) >> 3); - break; - case 32: - dest[i] = (((uint8_t)tmp[(bit/5)]) << 5) + - ((uint8_t)tmp[(bit/5)+1]); - break; - } - } - - memwipe(tmp, 0, srclen); - tor_free(tmp); - tmp = NULL; - return 0; -} - -/** Implement RFC2440-style iterated-salted S2K conversion: convert the - * secret_len-byte secret into a key_out_len byte - * key_out. As in RFC2440, the first 8 bytes of s2k_specifier - * are a salt; the 9th byte describes how much iteration to do. - * Does not support key_out_len > DIGEST_LEN. - */ -void -secret_to_key(char *key_out, size_t key_out_len, const char *secret, - size_t secret_len, const char *s2k_specifier) -{ - crypto_digest_t *d; - uint8_t c; - size_t count, tmplen; - char *tmp; - tor_assert(key_out_len < SIZE_T_CEILING); - -#define EXPBIAS 6 - c = s2k_specifier[8]; - count = ((uint32_t)16 + (c & 15)) << ((c >> 4) + EXPBIAS); -#undef EXPBIAS - - tor_assert(key_out_len <= DIGEST_LEN); - - d = crypto_digest_new(); - tmplen = 8+secret_len; - tmp = tor_malloc(tmplen); - memcpy(tmp,s2k_specifier,8); - memcpy(tmp+8,secret,secret_len); - secret_len += 8; - while (count) { - if (count >= secret_len) { - crypto_digest_add_bytes(d, tmp, secret_len); - count -= secret_len; - } else { - crypto_digest_add_bytes(d, tmp, count); - count = 0; - } - } - crypto_digest_get_digest(d, key_out, key_out_len); - memwipe(tmp, 0, tmplen); - tor_free(tmp); - crypto_digest_free(d); -} - -/** - * Destroy the sz bytes of data stored at mem, setting them to - * the value byte. - * - * This function is preferable to memset, since many compilers will happily - * optimize out memset() when they can convince themselves that the data being - * cleared will never be read. - * - * Right now, our convention is to use this function when we are wiping data - * that's about to become inaccessible, such as stack buffers that are about - * to go out of scope or structures that are about to get freed. (In - * practice, it appears that the compilers we're currently using will optimize - * out the memset()s for stack-allocated buffers, but not those for - * about-to-be-freed structures. That could change, though, so we're being - * wary.) If there are live reads for the data, then you can just use - * memset(). - */ -void -memwipe(void *mem, uint8_t byte, size_t sz) -{ - /* Because whole-program-optimization exists, we may not be able to just - * have this function call "memset". A smart compiler could inline it, then - * eliminate dead memsets, and declare itself to be clever. */ - - /* This is a slow and ugly function from OpenSSL that fills 'mem' with junk - * based on the pointer value, then uses that junk to update a global - * variable. It's an elaborate ruse to trick the compiler into not - * optimizing out the "wipe this memory" code. Read it if you like zany - * programming tricks! In later versions of Tor, we should look for better - * not-optimized-out memory wiping stuff. */ - OPENSSL_cleanse(mem, sz); - /* Just in case some caller of memwipe() is relying on getting a buffer - * filled with a particular value, fill the buffer. - * - * If this function gets inlined, this memset might get eliminated, but - * that's okay: We only care about this particular memset in the case where - * the caller should have been using memset(), and the memset() wouldn't get - * eliminated. In other words, this is here so that we won't break anything - * if somebody accidentally calls memwipe() instead of memset(). - **/ - memset(mem, byte, sz); -} - -#ifdef TOR_IS_MULTITHREADED - -#ifndef OPENSSL_THREADS -#error OpenSSL has been built without thread support. Tor requires an \ - OpenSSL library with thread support enabled. -#endif - -/** Helper: OpenSSL uses this callback to manipulate mutexes. */ -static void -openssl_locking_cb_(int mode, int n, const char *file, int line) -{ - (void)file; - (void)line; - if (!openssl_mutexes_) - /* This is not a really good fix for the - * "release-freed-lock-from-separate-thread-on-shutdown" problem, but - * it can't hurt. */ - return; - if (mode & CRYPTO_LOCK) - tor_mutex_acquire(openssl_mutexes_[n]); - else - tor_mutex_release(openssl_mutexes_[n]); -} - -/** OpenSSL helper type: wraps a Tor mutex so that OpenSSL can use it - * as a lock. */ -struct CRYPTO_dynlock_value { - tor_mutex_t *lock; -}; - -/** OpenSSL callback function to allocate a lock: see CRYPTO_set_dynlock_* - * documentation in OpenSSL's docs for more info. */ -static struct CRYPTO_dynlock_value * -openssl_dynlock_create_cb_(const char *file, int line) -{ - struct CRYPTO_dynlock_value *v; - (void)file; - (void)line; - v = tor_malloc(sizeof(struct CRYPTO_dynlock_value)); - v->lock = tor_mutex_new(); - return v; -} - -/** OpenSSL callback function to acquire or release a lock: see - * CRYPTO_set_dynlock_* documentation in OpenSSL's docs for more info. */ -static void -openssl_dynlock_lock_cb_(int mode, struct CRYPTO_dynlock_value *v, - const char *file, int line) -{ - (void)file; - (void)line; - if (mode & CRYPTO_LOCK) - tor_mutex_acquire(v->lock); - else - tor_mutex_release(v->lock); -} - -/** OpenSSL callback function to free a lock: see CRYPTO_set_dynlock_* - * documentation in OpenSSL's docs for more info. */ -static void -openssl_dynlock_destroy_cb_(struct CRYPTO_dynlock_value *v, - const char *file, int line) -{ - (void)file; - (void)line; - tor_mutex_free(v->lock); - tor_free(v); -} - -/** @{ */ -/** Helper: Construct mutexes, and set callbacks to help OpenSSL handle being - * multithreaded. */ -static int -setup_openssl_threading(void) -{ - int i; - int n = CRYPTO_num_locks(); - n_openssl_mutexes_ = n; - openssl_mutexes_ = tor_malloc(n*sizeof(tor_mutex_t *)); - for (i=0; i < n; ++i) - openssl_mutexes_[i] = tor_mutex_new(); - CRYPTO_set_locking_callback(openssl_locking_cb_); - CRYPTO_set_id_callback(tor_get_thread_id); - CRYPTO_set_dynlock_create_callback(openssl_dynlock_create_cb_); - CRYPTO_set_dynlock_lock_callback(openssl_dynlock_lock_cb_); - CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy_cb_); - return 0; -} -#else -static int -setup_openssl_threading(void) -{ - return 0; -} -#endif - -/** Uninitialize the crypto library. Return 0 on success, -1 on failure. - */ -int -crypto_global_cleanup(void) -{ - EVP_cleanup(); - ERR_remove_state(0); - ERR_free_strings(); - - if (dh_param_p) - BN_clear_free(dh_param_p); - if (dh_param_p_tls) - BN_clear_free(dh_param_p_tls); - if (dh_param_g) - BN_clear_free(dh_param_g); - -#ifndef DISABLE_ENGINES - ENGINE_cleanup(); -#endif - - CONF_modules_unload(1); - CRYPTO_cleanup_all_ex_data(); -#ifdef TOR_IS_MULTITHREADED - if (n_openssl_mutexes_) { - int n = n_openssl_mutexes_; - tor_mutex_t **ms = openssl_mutexes_; - int i; - openssl_mutexes_ = NULL; - n_openssl_mutexes_ = 0; - for (i=0;i -#include "torint.h" -#include "testsupport.h" - -/* - Macro to create an arbitrary OpenSSL version number as used by - OPENSSL_VERSION_NUMBER or SSLeay(), since the actual numbers are a bit hard - to read. - - Don't use this directly, instead use one of the other OPENSSL_V macros - below. - - The format is: 4 bits major, 8 bits minor, 8 bits fix, 8 bits patch, 4 bit - status. - */ -#define OPENSSL_VER(a,b,c,d,e) \ - (((a)<<28) | \ - ((b)<<20) | \ - ((c)<<12) | \ - ((d)<< 4) | \ - (e)) -/** An openssl release number. For example, OPENSSL_V(0,9,8,'j') is the - * version for the released version of 0.9.8j */ -#define OPENSSL_V(a,b,c,d) \ - OPENSSL_VER((a),(b),(c),(d)-'a'+1,0xf) -/** An openssl release number for the first release in the series. For - * example, OPENSSL_V_NOPATCH(1,0,0) is the first released version of OpenSSL - * 1.0.0. */ -#define OPENSSL_V_NOPATCH(a,b,c) \ - OPENSSL_VER((a),(b),(c),0,0xf) -/** The first version that would occur for any alpha or beta in an openssl - * series. For example, OPENSSL_V_SERIES(0,9,8) is greater than any released - * 0.9.7, and less than any released 0.9.8. */ -#define OPENSSL_V_SERIES(a,b,c) \ - OPENSSL_VER((a),(b),(c),0,0) - -/** Length of the output of our message digest. */ -#define DIGEST_LEN 20 -/** Length of the output of our second (improved) message digests. (For now - * this is just sha256, but it could be any other 256-bit digest.) */ -#define DIGEST256_LEN 32 -/** Length of our symmetric cipher's keys. */ -#define CIPHER_KEY_LEN 16 -/** Length of our symmetric cipher's IV. */ -#define CIPHER_IV_LEN 16 -/** Length of our public keys. */ -#define PK_BYTES (1024/8) -/** Length of our DH keys. */ -#define DH_BYTES (1024/8) - -/** Length of a sha1 message digest when encoded in base64 with trailing = - * signs removed. */ -#define BASE64_DIGEST_LEN 27 -/** Length of a sha256 message digest when encoded in base64 with trailing = - * signs removed. */ -#define BASE64_DIGEST256_LEN 43 - -/** Constant used to indicate OAEP padding for public-key encryption */ -#define PK_PKCS1_OAEP_PADDING 60002 - -/** Number of bytes added for PKCS1-OAEP padding. */ -#define PKCS1_OAEP_PADDING_OVERHEAD 42 - -/** Length of encoded public key fingerprints, including space; but not - * including terminating NUL. */ -#define FINGERPRINT_LEN 49 -/** Length of hex encoding of SHA1 digest, not including final NUL. */ -#define HEX_DIGEST_LEN 40 -/** Length of hex encoding of SHA256 digest, not including final NUL. */ -#define HEX_DIGEST256_LEN 64 - -typedef enum { - DIGEST_SHA1 = 0, - DIGEST_SHA256 = 1, -} digest_algorithm_t; -#define N_DIGEST_ALGORITHMS (DIGEST_SHA256+1) - -/** A set of all the digests we know how to compute, taken on a single - * string. Any digests that are shorter than 256 bits are right-padded - * with 0 bits. - * - * Note that this representation wastes 12 bytes for the SHA1 case, so - * don't use it for anything where we need to allocate a whole bunch at - * once. - **/ -typedef struct { - char d[N_DIGEST_ALGORITHMS][DIGEST256_LEN]; -} digests_t; - -typedef struct crypto_pk_t crypto_pk_t; -typedef struct crypto_cipher_t crypto_cipher_t; -typedef struct crypto_digest_t crypto_digest_t; -typedef struct crypto_dh_t crypto_dh_t; - -/* global state */ -const char * crypto_openssl_get_version_str(void); -const char * crypto_openssl_get_header_version_str(void); -int crypto_global_init(int hardwareAccel, - const char *accelName, - const char *accelPath); -void crypto_thread_cleanup(void); -int crypto_global_cleanup(void); - -/* environment setup */ -crypto_pk_t *crypto_pk_new(void); -void crypto_pk_free(crypto_pk_t *env); - -void crypto_set_tls_dh_prime(const char *dynamic_dh_modulus_fname); - -crypto_cipher_t *crypto_cipher_new(const char *key); -crypto_cipher_t *crypto_cipher_new_with_iv(const char *key, const char *iv); -void crypto_cipher_free(crypto_cipher_t *env); - -/* public key crypto */ -int crypto_pk_generate_key_with_bits(crypto_pk_t *env, int bits); -#define crypto_pk_generate_key(env) \ - crypto_pk_generate_key_with_bits((env), (PK_BYTES*8)) - -int crypto_pk_read_private_key_from_filename(crypto_pk_t *env, - const char *keyfile); -int crypto_pk_write_public_key_to_string(crypto_pk_t *env, - char **dest, size_t *len); -int crypto_pk_write_private_key_to_string(crypto_pk_t *env, - char **dest, size_t *len); -int crypto_pk_read_public_key_from_string(crypto_pk_t *env, - const char *src, size_t len); -int crypto_pk_read_private_key_from_string(crypto_pk_t *env, - const char *s, ssize_t len); -int crypto_pk_write_private_key_to_filename(crypto_pk_t *env, - const char *fname); - -int crypto_pk_check_key(crypto_pk_t *env); -int crypto_pk_cmp_keys(crypto_pk_t *a, crypto_pk_t *b); -int crypto_pk_eq_keys(crypto_pk_t *a, crypto_pk_t *b); -size_t crypto_pk_keysize(crypto_pk_t *env); -int crypto_pk_num_bits(crypto_pk_t *env); -crypto_pk_t *crypto_pk_dup_key(crypto_pk_t *orig); -crypto_pk_t *crypto_pk_copy_full(crypto_pk_t *orig); -int crypto_pk_key_is_private(const crypto_pk_t *key); -int crypto_pk_public_exponent_ok(crypto_pk_t *env); - -int crypto_pk_public_encrypt(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen, int padding); -int crypto_pk_private_decrypt(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen, - int padding, int warnOnFailure); -int crypto_pk_public_checksig(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen); -int crypto_pk_public_checksig_digest(crypto_pk_t *env, const char *data, - size_t datalen, const char *sig, size_t siglen); -int crypto_pk_private_sign(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen); -int crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen, - const char *from, size_t fromlen); -int crypto_pk_public_hybrid_encrypt(crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen, - int padding, int force); -int crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to, - size_t tolen, - const char *from, size_t fromlen, - int padding, int warnOnFailure); - -int crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len); -crypto_pk_t *crypto_pk_asn1_decode(const char *str, size_t len); -int crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out); -int crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out); -int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out,int add_space); - -/* symmetric crypto */ -const char *crypto_cipher_get_key(crypto_cipher_t *env); - -int crypto_cipher_encrypt(crypto_cipher_t *env, char *to, - const char *from, size_t fromlen); -int crypto_cipher_decrypt(crypto_cipher_t *env, char *to, - const char *from, size_t fromlen); -int crypto_cipher_crypt_inplace(crypto_cipher_t *env, char *d, size_t len); - -int crypto_cipher_encrypt_with_iv(const char *key, - char *to, size_t tolen, - const char *from, size_t fromlen); -int crypto_cipher_decrypt_with_iv(const char *key, - char *to, size_t tolen, - const char *from, size_t fromlen); - -/* SHA-1 and other digests. */ -int crypto_digest(char *digest, const char *m, size_t len); -int crypto_digest256(char *digest, const char *m, size_t len, - digest_algorithm_t algorithm); -int crypto_digest_all(digests_t *ds_out, const char *m, size_t len); -struct smartlist_t; -void crypto_digest_smartlist(char *digest_out, size_t len_out, - const struct smartlist_t *lst, const char *append, - digest_algorithm_t alg); -const char *crypto_digest_algorithm_get_name(digest_algorithm_t alg); -int crypto_digest_algorithm_parse_name(const char *name); -crypto_digest_t *crypto_digest_new(void); -crypto_digest_t *crypto_digest256_new(digest_algorithm_t algorithm); -void crypto_digest_free(crypto_digest_t *digest); -void crypto_digest_add_bytes(crypto_digest_t *digest, const char *data, - size_t len); -void crypto_digest_get_digest(crypto_digest_t *digest, - char *out, size_t out_len); -crypto_digest_t *crypto_digest_dup(const crypto_digest_t *digest); -void crypto_digest_assign(crypto_digest_t *into, - const crypto_digest_t *from); -void crypto_hmac_sha256(char *hmac_out, - const char *key, size_t key_len, - const char *msg, size_t msg_len); - -/* Key negotiation */ -#define DH_TYPE_CIRCUIT 1 -#define DH_TYPE_REND 2 -#define DH_TYPE_TLS 3 -crypto_dh_t *crypto_dh_new(int dh_type); -crypto_dh_t *crypto_dh_dup(const crypto_dh_t *dh); -int crypto_dh_get_bytes(crypto_dh_t *dh); -int crypto_dh_generate_public(crypto_dh_t *dh); -int crypto_dh_get_public(crypto_dh_t *dh, char *pubkey_out, - size_t pubkey_out_len); -ssize_t crypto_dh_compute_secret(int severity, crypto_dh_t *dh, - const char *pubkey, size_t pubkey_len, - char *secret_out, size_t secret_out_len); -void crypto_dh_free(crypto_dh_t *dh); - -int crypto_expand_key_material_TAP(const uint8_t *key_in, - size_t key_in_len, - uint8_t *key_out, size_t key_out_len); -int crypto_expand_key_material_rfc5869_sha256( - const uint8_t *key_in, size_t key_in_len, - const uint8_t *salt_in, size_t salt_in_len, - const uint8_t *info_in, size_t info_in_len, - uint8_t *key_out, size_t key_out_len); - -/* random numbers */ -int crypto_seed_rng(int startup); -MOCK_DECL(int,crypto_rand,(char *to, size_t n)); -int crypto_strongest_rand(uint8_t *out, size_t out_len); -int crypto_rand_int(unsigned int max); -uint64_t crypto_rand_uint64(uint64_t max); -double crypto_rand_double(void); -struct tor_weak_rng_t; -void crypto_seed_weak_rng(struct tor_weak_rng_t *rng); - -char *crypto_random_hostname(int min_rand_len, int max_rand_len, - const char *prefix, const char *suffix); - -struct smartlist_t; -void *smartlist_choose(const struct smartlist_t *sl); -void smartlist_shuffle(struct smartlist_t *sl); - -int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen); -int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen); -/** Characters that can appear (case-insensitively) in a base32 encoding. */ -#define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567" -void base32_encode(char *dest, size_t destlen, const char *src, size_t srclen); -int base32_decode(char *dest, size_t destlen, const char *src, size_t srclen); - -int digest_to_base64(char *d64, const char *digest); -int digest_from_base64(char *digest, const char *d64); -int digest256_to_base64(char *d64, const char *digest); -int digest256_from_base64(char *digest, const char *d64); - -/** Length of RFC2440-style S2K specifier: the first 8 bytes are a salt, the - * 9th describes how much iteration to do. */ -#define S2K_SPECIFIER_LEN 9 -void secret_to_key(char *key_out, size_t key_out_len, const char *secret, - size_t secret_len, const char *s2k_specifier); - -/** OpenSSL-based utility functions. */ -void memwipe(void *mem, uint8_t byte, size_t sz); - -/* Prototypes for private functions only used by tortls.c, crypto.c, and the - * unit tests. */ -struct rsa_st; -struct evp_pkey_st; -struct dh_st; -struct rsa_st *crypto_pk_get_rsa_(crypto_pk_t *env); -crypto_pk_t *crypto_new_pk_from_rsa_(struct rsa_st *rsa); -struct evp_pkey_st *crypto_pk_get_evp_pkey_(crypto_pk_t *env, - int private); -struct dh_st *crypto_dh_get_dh_(crypto_dh_t *dh); - -void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in); - -#endif - diff --git a/src/tor/crypto_curve25519.c b/src/tor/crypto_curve25519.c deleted file mode 100644 index 8fe1e1b94..000000000 --- a/src/tor/crypto_curve25519.c +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Wrapper code for a curve25519 implementation. */ - -#define CRYPTO_CURVE25519_PRIVATE -#include "orconfig.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif -#include "crypto.h" -#include "crypto_curve25519.h" -#include "tor_util.h" -#include "torlog.h" - -/* ============================== - Part 1: wrap a suitable curve25519 implementation as curve25519_impl - ============================== */ - -#ifdef USE_CURVE25519_DONNA -int curve25519_donna(uint8_t *mypublic, - const uint8_t *secret, const uint8_t *basepoint); -#endif -#ifdef USE_CURVE25519_NACL -#ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H -#include -#elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H) -#include -#endif -#endif - -STATIC int -curve25519_impl(uint8_t *output, const uint8_t *secret, - const uint8_t *basepoint) -{ - uint8_t bp[CURVE25519_PUBKEY_LEN]; - int r; - memcpy(bp, basepoint, CURVE25519_PUBKEY_LEN); - /* Clear the high bit, in case our backend foolishly looks at it. */ - bp[31] &= 0x7f; -#ifdef USE_CURVE25519_DONNA - r = curve25519_donna(output, secret, bp); -#elif defined(USE_CURVE25519_NACL) - r = crypto_scalarmult_curve25519(output, secret, bp); -#else -#error "No implementation of curve25519 is available." -#endif - memwipe(bp, 0, sizeof(bp)); - return r; -} - -/* ============================== - Part 2: Wrap curve25519_impl with some convenience types and functions. - ============================== */ - -/** - * Return true iff a curve25519_public_key_t seems valid. (It's not necessary - * to see if the point is on the curve, since the twist is also secure, but we - * do need to make sure that it isn't the point at infinity.) */ -int -curve25519_public_key_is_ok(const curve25519_public_key_t *key) -{ - return !safe_mem_is_zero(key->public_key, CURVE25519_PUBKEY_LEN); -} - -/** Generate a new keypair and return the secret key. If extra_strong - * is true, this key is possibly going to get used more than once, so - * use a better-than-usual RNG. Return 0 on success, -1 on failure. */ -int -curve25519_secret_key_generate(curve25519_secret_key_t *key_out, - int extra_strong) -{ - uint8_t k_tmp[CURVE25519_SECKEY_LEN]; - - if (crypto_rand((char*)key_out->secret_key, CURVE25519_SECKEY_LEN) < 0) - return -1; - if (extra_strong && !crypto_strongest_rand(k_tmp, CURVE25519_SECKEY_LEN)) { - /* If they asked for extra-strong entropy and we have some, use it as an - * HMAC key to improve not-so-good entropy rather than using it directly, - * just in case the extra-strong entropy is less amazing than we hoped. */ - crypto_hmac_sha256((char *)key_out->secret_key, - (const char *)k_tmp, sizeof(k_tmp), - (const char *)key_out->secret_key, CURVE25519_SECKEY_LEN); - } - memwipe(k_tmp, 0, sizeof(k_tmp)); - key_out->secret_key[0] &= 248; - key_out->secret_key[31] &= 127; - key_out->secret_key[31] |= 64; - - return 0; -} - -void -curve25519_public_key_generate(curve25519_public_key_t *key_out, - const curve25519_secret_key_t *seckey) -{ - static const uint8_t basepoint[32] = {9}; - - curve25519_impl(key_out->public_key, seckey->secret_key, basepoint); -} - -int -curve25519_keypair_generate(curve25519_keypair_t *keypair_out, - int extra_strong) -{ - if (curve25519_secret_key_generate(&keypair_out->seckey, extra_strong) < 0) - return -1; - curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); - return 0; -} - -int -curve25519_keypair_write_to_file(const curve25519_keypair_t *keypair, - const char *fname, - const char *tag) -{ - char contents[32 + CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN]; - int r; - - memset(contents, 0, sizeof(contents)); - tor_snprintf(contents, sizeof(contents), "== c25519v1: %s ==", tag); - tor_assert(strlen(contents) <= 32); - memcpy(contents+32, keypair->seckey.secret_key, CURVE25519_SECKEY_LEN); - memcpy(contents+32+CURVE25519_SECKEY_LEN, - keypair->pubkey.public_key, CURVE25519_PUBKEY_LEN); - - r = write_bytes_to_file(fname, contents, sizeof(contents), 1); - - memwipe(contents, 0, sizeof(contents)); - return r; -} - -int -curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out, - char **tag_out, - const char *fname) -{ - char prefix[33]; - char *content; - struct stat st; - int r = -1; - - *tag_out = NULL; - - st.st_size = 0; - content = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); - if (! content) - goto end; - if (st.st_size != 32 + CURVE25519_SECKEY_LEN + CURVE25519_PUBKEY_LEN) - goto end; - - memcpy(prefix, content, 32); - prefix[32] = '\0'; - if (strcmpstart(prefix, "== c25519v1: ") || - strcmpend(prefix, " ==")) - goto end; - - *tag_out = tor_strndup(prefix+strlen("== c25519v1: "), - strlen(prefix) - strlen("== c25519v1: ==")); - - memcpy(keypair_out->seckey.secret_key, content+32, CURVE25519_SECKEY_LEN); - curve25519_public_key_generate(&keypair_out->pubkey, &keypair_out->seckey); - if (tor_memneq(keypair_out->pubkey.public_key, - content + 32 + CURVE25519_SECKEY_LEN, - CURVE25519_PUBKEY_LEN)) - goto end; - - r = 0; - - end: - if (content) { - memwipe(content, 0, (size_t) st.st_size); - tor_free(content); - } - if (r != 0) { - memset(keypair_out, 0, sizeof(*keypair_out)); - tor_free(*tag_out); - } - return r; -} - -/** Perform the curve25519 ECDH handshake with skey and pkey, - * writing CURVE25519_OUTPUT_LEN bytes of output into output. */ -void -curve25519_handshake(uint8_t *output, - const curve25519_secret_key_t *skey, - const curve25519_public_key_t *pkey) -{ - curve25519_impl(output, skey->secret_key, pkey->public_key); -} - diff --git a/src/tor/crypto_curve25519.h b/src/tor/crypto_curve25519.h deleted file mode 100644 index 57018ac2f..000000000 --- a/src/tor/crypto_curve25519.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_CRYPTO_CURVE25519_H -#define TOR_CRYPTO_CURVE25519_H - -#include "testsupport.h" -#include "torint.h" - -/** Length of a curve25519 public key when encoded. */ -#define CURVE25519_PUBKEY_LEN 32 -/** Length of a curve25519 secret key when encoded. */ -#define CURVE25519_SECKEY_LEN 32 -/** Length of the result of a curve25519 handshake. */ -#define CURVE25519_OUTPUT_LEN 32 - -/** Wrapper type for a curve25519 public key */ -typedef struct curve25519_public_key_t { - uint8_t public_key[CURVE25519_PUBKEY_LEN]; -} curve25519_public_key_t; - -/** Wrapper type for a curve25519 secret key */ -typedef struct curve25519_secret_key_t { - uint8_t secret_key[CURVE25519_SECKEY_LEN]; -} curve25519_secret_key_t; - -/** A paired public and private key for curve25519. **/ -typedef struct curve25519_keypair_t { - curve25519_public_key_t pubkey; - curve25519_secret_key_t seckey; -} curve25519_keypair_t; - -#ifdef CURVE25519_ENABLED -/* These functions require that we actually know how to use curve25519 keys. - * The other data structures and functions in this header let us parse them, - * store them, and move them around. - */ - -int curve25519_public_key_is_ok(const curve25519_public_key_t *); - -int curve25519_secret_key_generate(curve25519_secret_key_t *key_out, - int extra_strong); -void curve25519_public_key_generate(curve25519_public_key_t *key_out, - const curve25519_secret_key_t *seckey); -int curve25519_keypair_generate(curve25519_keypair_t *keypair_out, - int extra_strong); - -void curve25519_handshake(uint8_t *output, - const curve25519_secret_key_t *, - const curve25519_public_key_t *); - -int curve25519_keypair_write_to_file(const curve25519_keypair_t *keypair, - const char *fname, - const char *tag); - -int curve25519_keypair_read_from_file(curve25519_keypair_t *keypair_out, - char **tag_out, - const char *fname); - -#ifdef CRYPTO_CURVE25519_PRIVATE -STATIC int curve25519_impl(uint8_t *output, const uint8_t *secret, - const uint8_t *basepoint); -#endif -#endif - -#define CURVE25519_BASE64_PADDED_LEN 44 - -int curve25519_public_from_base64(curve25519_public_key_t *pkey, - const char *input); -int curve25519_public_to_base64(char *output, - const curve25519_public_key_t *pkey); - -#endif - diff --git a/src/tor/crypto_format.c b/src/tor/crypto_format.c deleted file mode 100644 index acb3463b4..000000000 --- a/src/tor/crypto_format.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/* Formatting and parsing code for crypto-related data structures. */ - -#include "orconfig.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif -#include "crypto.h" -#include "crypto_curve25519.h" -#include "tor_util.h" -#include "torlog.h" - -int -curve25519_public_to_base64(char *output, - const curve25519_public_key_t *pkey) -{ - char buf[128]; - base64_encode(buf, sizeof(buf), - (const char*)pkey->public_key, CURVE25519_PUBKEY_LEN); - buf[CURVE25519_BASE64_PADDED_LEN] = '\0'; - memcpy(output, buf, CURVE25519_BASE64_PADDED_LEN+1); - return 0; -} - -int -curve25519_public_from_base64(curve25519_public_key_t *pkey, - const char *input) -{ - size_t len = strlen(input); - if (len == CURVE25519_BASE64_PADDED_LEN - 1) { - /* not padded */ - return digest256_from_base64((char*)pkey->public_key, input); - } else if (len == CURVE25519_BASE64_PADDED_LEN) { - char buf[128]; - if (base64_decode(buf, sizeof(buf), input, len) != CURVE25519_PUBKEY_LEN) - return -1; - memcpy(pkey->public_key, buf, CURVE25519_PUBKEY_LEN); - return 0; - } else { - return -1; - } -} - diff --git a/src/tor/curve25519-donna.c b/src/tor/curve25519-donna.c deleted file mode 100644 index 5c6821ccd..000000000 --- a/src/tor/curve25519-donna.c +++ /dev/null @@ -1,732 +0,0 @@ -/* Copyright 2008, Google Inc. - * 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. - * - * curve25519-donna: Curve25519 elliptic curve, public key function - * - * http://code.google.com/p/curve25519-donna/ - * - * Adam Langley - * - * Derived from public domain C code by Daniel J. Bernstein - * - * More information about curve25519 can be found here - * http://cr.yp.to/ecdh.html - * - * djb's sample implementation of curve25519 is written in a special assembly - * language called qhasm and uses the floating point registers. - * - * This is, almost, a clean room reimplementation from the curve25519 paper. It - * uses many of the tricks described therein. Only the crecip function is taken - * from the sample implementation. - */ - -#include "orconfig.h" - -#include -#include "torint.h" - -typedef uint8_t u8; -typedef int32_t s32; -typedef int64_t limb; - -/* Field element representation: - * - * Field elements are written as an array of signed, 64-bit limbs, least - * significant first. The value of the field element is: - * x[0] + 2^26·x[1] + x^51·x[2] + 2^102·x[3] + ... - * - * i.e. the limbs are 26, 25, 26, 25, ... bits wide. - */ - -/* Sum two numbers: output += in */ -static void fsum(limb *output, const limb *in) { - unsigned i; - for (i = 0; i < 10; i += 2) { - output[0+i] = (output[0+i] + in[0+i]); - output[1+i] = (output[1+i] + in[1+i]); - } -} - -/* Find the difference of two numbers: output = in - output - * (note the order of the arguments!) - */ -static void fdifference(limb *output, const limb *in) { - unsigned i; - for (i = 0; i < 10; ++i) { - output[i] = (in[i] - output[i]); - } -} - -/* Multiply a number by a scalar: output = in * scalar */ -static void fscalar_product(limb *output, const limb *in, const limb scalar) { - unsigned i; - for (i = 0; i < 10; ++i) { - output[i] = in[i] * scalar; - } -} - -/* Multiply two numbers: output = in2 * in - * - * output must be distinct to both inputs. The inputs are reduced coefficient - * form, the output is not. - */ -static void fproduct(limb *output, const limb *in2, const limb *in) { - output[0] = ((limb) ((s32) in2[0])) * ((s32) in[0]); - output[1] = ((limb) ((s32) in2[0])) * ((s32) in[1]) + - ((limb) ((s32) in2[1])) * ((s32) in[0]); - output[2] = 2 * ((limb) ((s32) in2[1])) * ((s32) in[1]) + - ((limb) ((s32) in2[0])) * ((s32) in[2]) + - ((limb) ((s32) in2[2])) * ((s32) in[0]); - output[3] = ((limb) ((s32) in2[1])) * ((s32) in[2]) + - ((limb) ((s32) in2[2])) * ((s32) in[1]) + - ((limb) ((s32) in2[0])) * ((s32) in[3]) + - ((limb) ((s32) in2[3])) * ((s32) in[0]); - output[4] = ((limb) ((s32) in2[2])) * ((s32) in[2]) + - 2 * (((limb) ((s32) in2[1])) * ((s32) in[3]) + - ((limb) ((s32) in2[3])) * ((s32) in[1])) + - ((limb) ((s32) in2[0])) * ((s32) in[4]) + - ((limb) ((s32) in2[4])) * ((s32) in[0]); - output[5] = ((limb) ((s32) in2[2])) * ((s32) in[3]) + - ((limb) ((s32) in2[3])) * ((s32) in[2]) + - ((limb) ((s32) in2[1])) * ((s32) in[4]) + - ((limb) ((s32) in2[4])) * ((s32) in[1]) + - ((limb) ((s32) in2[0])) * ((s32) in[5]) + - ((limb) ((s32) in2[5])) * ((s32) in[0]); - output[6] = 2 * (((limb) ((s32) in2[3])) * ((s32) in[3]) + - ((limb) ((s32) in2[1])) * ((s32) in[5]) + - ((limb) ((s32) in2[5])) * ((s32) in[1])) + - ((limb) ((s32) in2[2])) * ((s32) in[4]) + - ((limb) ((s32) in2[4])) * ((s32) in[2]) + - ((limb) ((s32) in2[0])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[0]); - output[7] = ((limb) ((s32) in2[3])) * ((s32) in[4]) + - ((limb) ((s32) in2[4])) * ((s32) in[3]) + - ((limb) ((s32) in2[2])) * ((s32) in[5]) + - ((limb) ((s32) in2[5])) * ((s32) in[2]) + - ((limb) ((s32) in2[1])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[1]) + - ((limb) ((s32) in2[0])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[0]); - output[8] = ((limb) ((s32) in2[4])) * ((s32) in[4]) + - 2 * (((limb) ((s32) in2[3])) * ((s32) in[5]) + - ((limb) ((s32) in2[5])) * ((s32) in[3]) + - ((limb) ((s32) in2[1])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[1])) + - ((limb) ((s32) in2[2])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[2]) + - ((limb) ((s32) in2[0])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[0]); - output[9] = ((limb) ((s32) in2[4])) * ((s32) in[5]) + - ((limb) ((s32) in2[5])) * ((s32) in[4]) + - ((limb) ((s32) in2[3])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[3]) + - ((limb) ((s32) in2[2])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[2]) + - ((limb) ((s32) in2[1])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[1]) + - ((limb) ((s32) in2[0])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[0]); - output[10] = 2 * (((limb) ((s32) in2[5])) * ((s32) in[5]) + - ((limb) ((s32) in2[3])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[3]) + - ((limb) ((s32) in2[1])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[1])) + - ((limb) ((s32) in2[4])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[4]) + - ((limb) ((s32) in2[2])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[2]); - output[11] = ((limb) ((s32) in2[5])) * ((s32) in[6]) + - ((limb) ((s32) in2[6])) * ((s32) in[5]) + - ((limb) ((s32) in2[4])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[4]) + - ((limb) ((s32) in2[3])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[3]) + - ((limb) ((s32) in2[2])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[2]); - output[12] = ((limb) ((s32) in2[6])) * ((s32) in[6]) + - 2 * (((limb) ((s32) in2[5])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[5]) + - ((limb) ((s32) in2[3])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[3])) + - ((limb) ((s32) in2[4])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[4]); - output[13] = ((limb) ((s32) in2[6])) * ((s32) in[7]) + - ((limb) ((s32) in2[7])) * ((s32) in[6]) + - ((limb) ((s32) in2[5])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[5]) + - ((limb) ((s32) in2[4])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[4]); - output[14] = 2 * (((limb) ((s32) in2[7])) * ((s32) in[7]) + - ((limb) ((s32) in2[5])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[5])) + - ((limb) ((s32) in2[6])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[6]); - output[15] = ((limb) ((s32) in2[7])) * ((s32) in[8]) + - ((limb) ((s32) in2[8])) * ((s32) in[7]) + - ((limb) ((s32) in2[6])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[6]); - output[16] = ((limb) ((s32) in2[8])) * ((s32) in[8]) + - 2 * (((limb) ((s32) in2[7])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[7])); - output[17] = ((limb) ((s32) in2[8])) * ((s32) in[9]) + - ((limb) ((s32) in2[9])) * ((s32) in[8]); - output[18] = 2 * ((limb) ((s32) in2[9])) * ((s32) in[9]); -} - -/* Reduce a long form to a short form by taking the input mod 2^255 - 19. */ -static void freduce_degree(limb *output) { - /* Each of these shifts and adds ends up multiplying the value by 19. */ - output[8] += output[18] << 4; - output[8] += output[18] << 1; - output[8] += output[18]; - output[7] += output[17] << 4; - output[7] += output[17] << 1; - output[7] += output[17]; - output[6] += output[16] << 4; - output[6] += output[16] << 1; - output[6] += output[16]; - output[5] += output[15] << 4; - output[5] += output[15] << 1; - output[5] += output[15]; - output[4] += output[14] << 4; - output[4] += output[14] << 1; - output[4] += output[14]; - output[3] += output[13] << 4; - output[3] += output[13] << 1; - output[3] += output[13]; - output[2] += output[12] << 4; - output[2] += output[12] << 1; - output[2] += output[12]; - output[1] += output[11] << 4; - output[1] += output[11] << 1; - output[1] += output[11]; - output[0] += output[10] << 4; - output[0] += output[10] << 1; - output[0] += output[10]; -} - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - -/* return v / 2^26, using only shifts and adds. */ -static inline limb -div_by_2_26(const limb v) -{ - /* High word of v; no shift needed*/ - const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32); - /* Set to all 1s if v was negative; else set to 0s. */ - const int32_t sign = ((int32_t) highword) >> 31; - /* Set to 0x3ffffff if v was negative; else set to 0. */ - const int32_t roundoff = ((uint32_t) sign) >> 6; - /* Should return v / (1<<26) */ - return (v + roundoff) >> 26; -} - -/* return v / (2^25), using only shifts and adds. */ -static inline limb -div_by_2_25(const limb v) -{ - /* High word of v; no shift needed*/ - const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32); - /* Set to all 1s if v was negative; else set to 0s. */ - const int32_t sign = ((int32_t) highword) >> 31; - /* Set to 0x1ffffff if v was negative; else set to 0. */ - const int32_t roundoff = ((uint32_t) sign) >> 7; - /* Should return v / (1<<25) */ - return (v + roundoff) >> 25; -} - -static inline s32 -div_s32_by_2_25(const s32 v) -{ - const s32 roundoff = ((uint32_t)(v >> 31)) >> 7; - return (v + roundoff) >> 25; -} - -/* Reduce all coefficients of the short form input so that |x| < 2^26. - * - * On entry: |output[i]| < 2^62 - */ -static void freduce_coefficients(limb *output) { - unsigned i; - - output[10] = 0; - - for (i = 0; i < 10; i += 2) { - limb over = div_by_2_26(output[i]); - output[i] -= over << 26; - output[i+1] += over; - - over = div_by_2_25(output[i+1]); - output[i+1] -= over << 25; - output[i+2] += over; - } - /* Now |output[10]| < 2 ^ 38 and all other coefficients are reduced. */ - output[0] += output[10] << 4; - output[0] += output[10] << 1; - output[0] += output[10]; - - output[10] = 0; - - /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19 * 2^38 - * So |over| will be no more than 77825 */ - { - limb over = div_by_2_26(output[0]); - output[0] -= over << 26; - output[1] += over; - } - - /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 77825 - * So |over| will be no more than 1. */ - { - /* output[1] fits in 32 bits, so we can use div_s32_by_2_25 here. */ - s32 over32 = div_s32_by_2_25((s32) output[1]); - output[1] -= over32 << 25; - output[2] += over32; - } - - /* Finally, output[0,1,3..9] are reduced, and output[2] is "nearly reduced": - * we have |output[2]| <= 2^26. This is good enough for all of our math, - * but it will require an extra freduce_coefficients before fcontract. */ -} - -/* A helpful wrapper around fproduct: output = in * in2. - * - * output must be distinct to both inputs. The output is reduced degree and - * reduced coefficient. - */ -static void -fmul(limb *output, const limb *in, const limb *in2) { - limb t[19]; - fproduct(t, in, in2); - freduce_degree(t); - freduce_coefficients(t); - memcpy(output, t, sizeof(limb) * 10); -} - -static void fsquare_inner(limb *output, const limb *in) { - output[0] = ((limb) ((s32) in[0])) * ((s32) in[0]); - output[1] = 2 * ((limb) ((s32) in[0])) * ((s32) in[1]); - output[2] = 2 * (((limb) ((s32) in[1])) * ((s32) in[1]) + - ((limb) ((s32) in[0])) * ((s32) in[2])); - output[3] = 2 * (((limb) ((s32) in[1])) * ((s32) in[2]) + - ((limb) ((s32) in[0])) * ((s32) in[3])); - output[4] = ((limb) ((s32) in[2])) * ((s32) in[2]) + - 4 * ((limb) ((s32) in[1])) * ((s32) in[3]) + - 2 * ((limb) ((s32) in[0])) * ((s32) in[4]); - output[5] = 2 * (((limb) ((s32) in[2])) * ((s32) in[3]) + - ((limb) ((s32) in[1])) * ((s32) in[4]) + - ((limb) ((s32) in[0])) * ((s32) in[5])); - output[6] = 2 * (((limb) ((s32) in[3])) * ((s32) in[3]) + - ((limb) ((s32) in[2])) * ((s32) in[4]) + - ((limb) ((s32) in[0])) * ((s32) in[6]) + - 2 * ((limb) ((s32) in[1])) * ((s32) in[5])); - output[7] = 2 * (((limb) ((s32) in[3])) * ((s32) in[4]) + - ((limb) ((s32) in[2])) * ((s32) in[5]) + - ((limb) ((s32) in[1])) * ((s32) in[6]) + - ((limb) ((s32) in[0])) * ((s32) in[7])); - output[8] = ((limb) ((s32) in[4])) * ((s32) in[4]) + - 2 * (((limb) ((s32) in[2])) * ((s32) in[6]) + - ((limb) ((s32) in[0])) * ((s32) in[8]) + - 2 * (((limb) ((s32) in[1])) * ((s32) in[7]) + - ((limb) ((s32) in[3])) * ((s32) in[5]))); - output[9] = 2 * (((limb) ((s32) in[4])) * ((s32) in[5]) + - ((limb) ((s32) in[3])) * ((s32) in[6]) + - ((limb) ((s32) in[2])) * ((s32) in[7]) + - ((limb) ((s32) in[1])) * ((s32) in[8]) + - ((limb) ((s32) in[0])) * ((s32) in[9])); - output[10] = 2 * (((limb) ((s32) in[5])) * ((s32) in[5]) + - ((limb) ((s32) in[4])) * ((s32) in[6]) + - ((limb) ((s32) in[2])) * ((s32) in[8]) + - 2 * (((limb) ((s32) in[3])) * ((s32) in[7]) + - ((limb) ((s32) in[1])) * ((s32) in[9]))); - output[11] = 2 * (((limb) ((s32) in[5])) * ((s32) in[6]) + - ((limb) ((s32) in[4])) * ((s32) in[7]) + - ((limb) ((s32) in[3])) * ((s32) in[8]) + - ((limb) ((s32) in[2])) * ((s32) in[9])); - output[12] = ((limb) ((s32) in[6])) * ((s32) in[6]) + - 2 * (((limb) ((s32) in[4])) * ((s32) in[8]) + - 2 * (((limb) ((s32) in[5])) * ((s32) in[7]) + - ((limb) ((s32) in[3])) * ((s32) in[9]))); - output[13] = 2 * (((limb) ((s32) in[6])) * ((s32) in[7]) + - ((limb) ((s32) in[5])) * ((s32) in[8]) + - ((limb) ((s32) in[4])) * ((s32) in[9])); - output[14] = 2 * (((limb) ((s32) in[7])) * ((s32) in[7]) + - ((limb) ((s32) in[6])) * ((s32) in[8]) + - 2 * ((limb) ((s32) in[5])) * ((s32) in[9])); - output[15] = 2 * (((limb) ((s32) in[7])) * ((s32) in[8]) + - ((limb) ((s32) in[6])) * ((s32) in[9])); - output[16] = ((limb) ((s32) in[8])) * ((s32) in[8]) + - 4 * ((limb) ((s32) in[7])) * ((s32) in[9]); - output[17] = 2 * ((limb) ((s32) in[8])) * ((s32) in[9]); - output[18] = 2 * ((limb) ((s32) in[9])) * ((s32) in[9]); -} - -static void -fsquare(limb *output, const limb *in) { - limb t[19]; - fsquare_inner(t, in); - freduce_degree(t); - freduce_coefficients(t); - memcpy(output, t, sizeof(limb) * 10); -} - -/* Take a little-endian, 32-byte number and expand it into polynomial form */ -static void -fexpand(limb *output, const u8 *input) { -#define F(n,start,shift,mask) \ - output[n] = ((((limb) input[start + 0]) | \ - ((limb) input[start + 1]) << 8 | \ - ((limb) input[start + 2]) << 16 | \ - ((limb) input[start + 3]) << 24) >> shift) & mask; - F(0, 0, 0, 0x3ffffff); - F(1, 3, 2, 0x1ffffff); - F(2, 6, 3, 0x3ffffff); - F(3, 9, 5, 0x1ffffff); - F(4, 12, 6, 0x3ffffff); - F(5, 16, 0, 0x1ffffff); - F(6, 19, 1, 0x3ffffff); - F(7, 22, 3, 0x1ffffff); - F(8, 25, 4, 0x3ffffff); - F(9, 28, 6, 0x1ffffff); -#undef F -} - -#if (-32 >> 1) != -16 -#error "This code only works when >> does sign-extension on negative numbers" -#endif - -/* Take a fully reduced polynomial form number and contract it into a - * little-endian, 32-byte array - */ -static void -fcontract(u8 *output, limb *input) { - int i; - int j; - - for (j = 0; j < 2; ++j) { - for (i = 0; i < 9; ++i) { - if ((i & 1) == 1) { - /* This calculation is a time-invariant way to make input[i] positive - by borrowing from the next-larger limb. - */ - const s32 mask = (s32)(input[i]) >> 31; - const s32 carry = -(((s32)(input[i]) & mask) >> 25); - input[i] = (s32)(input[i]) + (carry << 25); - input[i+1] = (s32)(input[i+1]) - carry; - } else { - const s32 mask = (s32)(input[i]) >> 31; - const s32 carry = -(((s32)(input[i]) & mask) >> 26); - input[i] = (s32)(input[i]) + (carry << 26); - input[i+1] = (s32)(input[i+1]) - carry; - } - } - { - const s32 mask = (s32)(input[9]) >> 31; - const s32 carry = -(((s32)(input[9]) & mask) >> 25); - input[9] = (s32)(input[9]) + (carry << 25); - input[0] = (s32)(input[0]) - (carry * 19); - } - } - - /* The first borrow-propagation pass above ended with every limb - except (possibly) input[0] non-negative. - - Since each input limb except input[0] is decreased by at most 1 - by a borrow-propagation pass, the second borrow-propagation pass - could only have wrapped around to decrease input[0] again if the - first pass left input[0] negative *and* input[1] through input[9] - were all zero. In that case, input[1] is now 2^25 - 1, and this - last borrow-propagation step will leave input[1] non-negative. - */ - { - const s32 mask = (s32)(input[0]) >> 31; - const s32 carry = -(((s32)(input[0]) & mask) >> 26); - input[0] = (s32)(input[0]) + (carry << 26); - input[1] = (s32)(input[1]) - carry; - } - - /* Both passes through the above loop, plus the last 0-to-1 step, are - necessary: if input[9] is -1 and input[0] through input[8] are 0, - negative values will remain in the array until the end. - */ - - input[1] <<= 2; - input[2] <<= 3; - input[3] <<= 5; - input[4] <<= 6; - input[6] <<= 1; - input[7] <<= 3; - input[8] <<= 4; - input[9] <<= 6; -#define F(i, s) \ - output[s+0] |= input[i] & 0xff; \ - output[s+1] = (input[i] >> 8) & 0xff; \ - output[s+2] = (input[i] >> 16) & 0xff; \ - output[s+3] = (input[i] >> 24) & 0xff; - output[0] = 0; - output[16] = 0; - F(0,0); - F(1,3); - F(2,6); - F(3,9); - F(4,12); - F(5,16); - F(6,19); - F(7,22); - F(8,25); - F(9,28); -#undef F -} - -/* Input: Q, Q', Q-Q' - * Output: 2Q, Q+Q' - * - * x2 z3: long form - * x3 z3: long form - * x z: short form, destroyed - * xprime zprime: short form, destroyed - * qmqp: short form, preserved - */ -static void fmonty(limb *x2, limb *z2, /* output 2Q */ - limb *x3, limb *z3, /* output Q + Q' */ - limb *x, limb *z, /* input Q */ - limb *xprime, limb *zprime, /* input Q' */ - const limb *qmqp /* input Q - Q' */) { - limb origx[10], origxprime[10], zzz[19], xx[19], zz[19], xxprime[19], - zzprime[19], zzzprime[19], xxxprime[19]; - - memcpy(origx, x, 10 * sizeof(limb)); - fsum(x, z); - fdifference(z, origx); // does x - z - - memcpy(origxprime, xprime, sizeof(limb) * 10); - fsum(xprime, zprime); - fdifference(zprime, origxprime); - fproduct(xxprime, xprime, z); - fproduct(zzprime, x, zprime); - freduce_degree(xxprime); - freduce_coefficients(xxprime); - freduce_degree(zzprime); - freduce_coefficients(zzprime); - memcpy(origxprime, xxprime, sizeof(limb) * 10); - fsum(xxprime, zzprime); - fdifference(zzprime, origxprime); - fsquare(xxxprime, xxprime); - fsquare(zzzprime, zzprime); - fproduct(zzprime, zzzprime, qmqp); - freduce_degree(zzprime); - freduce_coefficients(zzprime); - memcpy(x3, xxxprime, sizeof(limb) * 10); - memcpy(z3, zzprime, sizeof(limb) * 10); - - fsquare(xx, x); - fsquare(zz, z); - fproduct(x2, xx, zz); - freduce_degree(x2); - freduce_coefficients(x2); - fdifference(zz, xx); // does zz = xx - zz - memset(zzz + 10, 0, sizeof(limb) * 9); - fscalar_product(zzz, zz, 121665); - /* No need to call freduce_degree here: - fscalar_product doesn't increase the degree of its input. */ - freduce_coefficients(zzz); - fsum(zzz, xx); - fproduct(z2, zz, zzz); - freduce_degree(z2); - freduce_coefficients(z2); -} - -/* Conditionally swap two reduced-form limb arrays if 'iswap' is 1, but leave - * them unchanged if 'iswap' is 0. Runs in data-invariant time to avoid - * side-channel attacks. - * - * NOTE that this function requires that 'iswap' be 1 or 0; other values give - * wrong results. Also, the two limb arrays must be in reduced-coefficient, - * reduced-degree form: the values in a[10..19] or b[10..19] aren't swapped, - * and all all values in a[0..9],b[0..9] must have magnitude less than - * INT32_MAX. - */ -static void -swap_conditional(limb a[19], limb b[19], limb iswap) { - unsigned i; - const s32 swap = (s32) -iswap; - - for (i = 0; i < 10; ++i) { - const s32 x = swap & ( ((s32)a[i]) ^ ((s32)b[i]) ); - a[i] = ((s32)a[i]) ^ x; - b[i] = ((s32)b[i]) ^ x; - } -} - -/* Calculates nQ where Q is the x-coordinate of a point on the curve - * - * resultx/resultz: the x coordinate of the resulting curve point (short form) - * n: a little endian, 32-byte number - * q: a point of the curve (short form) - */ -static void -cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { - limb a[19] = {0}, b[19] = {1}, c[19] = {1}, d[19] = {0}; - limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t; - limb e[19] = {0}, f[19] = {1}, g[19] = {0}, h[19] = {1}; - limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h; - - unsigned i, j; - - memcpy(nqpqx, q, sizeof(limb) * 10); - - for (i = 0; i < 32; ++i) { - u8 byte = n[31 - i]; - for (j = 0; j < 8; ++j) { - const limb bit = byte >> 7; - - swap_conditional(nqx, nqpqx, bit); - swap_conditional(nqz, nqpqz, bit); - fmonty(nqx2, nqz2, - nqpqx2, nqpqz2, - nqx, nqz, - nqpqx, nqpqz, - q); - swap_conditional(nqx2, nqpqx2, bit); - swap_conditional(nqz2, nqpqz2, bit); - - t = nqx; - nqx = nqx2; - nqx2 = t; - t = nqz; - nqz = nqz2; - nqz2 = t; - t = nqpqx; - nqpqx = nqpqx2; - nqpqx2 = t; - t = nqpqz; - nqpqz = nqpqz2; - nqpqz2 = t; - - byte <<= 1; - } - } - - memcpy(resultx, nqx, sizeof(limb) * 10); - memcpy(resultz, nqz, sizeof(limb) * 10); -} - -// ----------------------------------------------------------------------------- -// Shamelessly copied from djb's code -// ----------------------------------------------------------------------------- -static void -crecip(limb *out, const limb *z) { - limb z2[10]; - limb z9[10]; - limb z11[10]; - limb z2_5_0[10]; - limb z2_10_0[10]; - limb z2_20_0[10]; - limb z2_50_0[10]; - limb z2_100_0[10]; - limb t0[10]; - limb t1[10]; - int i; - - /* 2 */ fsquare(z2,z); - /* 4 */ fsquare(t1,z2); - /* 8 */ fsquare(t0,t1); - /* 9 */ fmul(z9,t0,z); - /* 11 */ fmul(z11,z9,z2); - /* 22 */ fsquare(t0,z11); - /* 2^5 - 2^0 = 31 */ fmul(z2_5_0,t0,z9); - - /* 2^6 - 2^1 */ fsquare(t0,z2_5_0); - /* 2^7 - 2^2 */ fsquare(t1,t0); - /* 2^8 - 2^3 */ fsquare(t0,t1); - /* 2^9 - 2^4 */ fsquare(t1,t0); - /* 2^10 - 2^5 */ fsquare(t0,t1); - /* 2^10 - 2^0 */ fmul(z2_10_0,t0,z2_5_0); - - /* 2^11 - 2^1 */ fsquare(t0,z2_10_0); - /* 2^12 - 2^2 */ fsquare(t1,t0); - /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } - /* 2^20 - 2^0 */ fmul(z2_20_0,t1,z2_10_0); - - /* 2^21 - 2^1 */ fsquare(t0,z2_20_0); - /* 2^22 - 2^2 */ fsquare(t1,t0); - /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } - /* 2^40 - 2^0 */ fmul(t0,t1,z2_20_0); - - /* 2^41 - 2^1 */ fsquare(t1,t0); - /* 2^42 - 2^2 */ fsquare(t0,t1); - /* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t1,t0); fsquare(t0,t1); } - /* 2^50 - 2^0 */ fmul(z2_50_0,t0,z2_10_0); - - /* 2^51 - 2^1 */ fsquare(t0,z2_50_0); - /* 2^52 - 2^2 */ fsquare(t1,t0); - /* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } - /* 2^100 - 2^0 */ fmul(z2_100_0,t1,z2_50_0); - - /* 2^101 - 2^1 */ fsquare(t1,z2_100_0); - /* 2^102 - 2^2 */ fsquare(t0,t1); - /* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { fsquare(t1,t0); fsquare(t0,t1); } - /* 2^200 - 2^0 */ fmul(t1,t0,z2_100_0); - - /* 2^201 - 2^1 */ fsquare(t0,t1); - /* 2^202 - 2^2 */ fsquare(t1,t0); - /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); } - /* 2^250 - 2^0 */ fmul(t0,t1,z2_50_0); - - /* 2^251 - 2^1 */ fsquare(t1,t0); - /* 2^252 - 2^2 */ fsquare(t0,t1); - /* 2^253 - 2^3 */ fsquare(t1,t0); - /* 2^254 - 2^4 */ fsquare(t0,t1); - /* 2^255 - 2^5 */ fsquare(t1,t0); - /* 2^255 - 21 */ fmul(out,t1,z11); -} - -int curve25519_donna(u8 *, const u8 *, const u8 *); - -int -curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { - limb bp[10], x[10], z[11], zmone[10]; - uint8_t e[32]; - int i; - - for (i = 0; i < 32; ++i) e[i] = secret[i]; - e[0] &= 248; - e[31] &= 127; - e[31] |= 64; - - fexpand(bp, basepoint); - cmult(x, z, e, bp); - crecip(zmone, z); - fmul(z, x, zmone); - freduce_coefficients(z); - fcontract(mypublic, z); - return 0; -} diff --git a/src/tor/di_ops.c b/src/tor/di_ops.c deleted file mode 100644 index eeb7a16eb..000000000 --- a/src/tor/di_ops.c +++ /dev/null @@ -1,222 +0,0 @@ -/* Copyright (c) 2011-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file di_ops.c - * \brief Functions for data-independent operations. - **/ - -#include "orconfig.h" -#include "di_ops.h" -#include "torlog.h" -#include "tor_util.h" - -/** - * Timing-safe version of memcmp. As memcmp, compare the sz bytes at - * a with the sz bytes at b, and return less than 0 if - * the bytes at a lexically precede those at b, 0 if the byte - * ranges are equal, and greater than zero if the bytes at a lexically - * follow those at b. - * - * This implementation differs from memcmp in that its timing behavior is not - * data-dependent: it should return in the same amount of time regardless of - * the contents of a and b. - */ -int -tor_memcmp(const void *a, const void *b, size_t len) -{ - const uint8_t *x = a; - const uint8_t *y = b; - size_t i = len; - int retval = 0; - - /* This loop goes from the end of the arrays to the start. At the - * start of every iteration, before we decrement i, we have set - * "retval" equal to the result of memcmp(a+i,b+i,len-i). During the - * loop, we update retval by leaving it unchanged if x[i]==y[i] and - * setting it to x[i]-y[i] if x[i]!= y[i]. - * - * The following assumes we are on a system with two's-complement - * arithmetic. We check for this at configure-time with the check - * that sets USING_TWOS_COMPLEMENT. If we aren't two's complement, then - * torint.h will stop compilation with an error. - */ - while (i--) { - int v1 = x[i]; - int v2 = y[i]; - int equal_p = v1 ^ v2; - - /* The following sets bits 8 and above of equal_p to 'equal_p == - * 0', and thus to v1 == v2. (To see this, note that if v1 == - * v2, then v1^v2 == equal_p == 0, so equal_p-1 == -1, which is the - * same as ~0 on a two's-complement machine. Then note that if - * v1 != v2, then 0 < v1 ^ v2 < 256, so 0 <= equal_p - 1 < 255.) - */ - --equal_p; - - equal_p >>= 8; - /* Thanks to (sign-preserving) arithmetic shift, equal_p is now - * equal to -(v1 == v2), which is exactly what we need below. - * (Since we're assuming two's-complement arithmetic, -1 is the - * same as ~0 (all bits set).) - * - * (The result of an arithmetic shift on a negative value is - * actually implementation-defined in standard C. So how do we - * get away with assuming it? Easy. We check.) */ -#if ((-60 >> 8) != -1) -#error "According to cpp, right-shift doesn't perform sign-extension." -#endif -#ifndef RSHIFT_DOES_SIGN_EXTEND -#error "According to configure, right-shift doesn't perform sign-extension." -#endif - - /* If v1 == v2, equal_p is ~0, so this will leave retval - * unchanged; otherwise, equal_p is 0, so this will zero it. */ - retval &= equal_p; - - /* If v1 == v2, then this adds 0, and leaves retval unchanged. - * Otherwise, we just zeroed retval, so this sets it to v1 - v2. */ - retval += (v1 - v2); - - /* There. Now retval is equal to its previous value if v1 == v2, and - * equal to v1 - v2 if v1 != v2. */ - } - - return retval; -} - -/** - * Timing-safe memory comparison. Return true if the sz bytes at - * a are the same as the sz bytes at b, and 0 otherwise. - * - * This implementation differs from !memcmp(a,b,sz) in that its timing - * behavior is not data-dependent: it should return in the same amount of time - * regardless of the contents of a and b. It differs from - * !tor_memcmp(a,b,sz) by being faster. - */ -int -tor_memeq(const void *a, const void *b, size_t sz) -{ - /* Treat a and b as byte ranges. */ - const uint8_t *ba = a, *bb = b; - uint32_t any_difference = 0; - while (sz--) { - /* Set byte_diff to all of those bits that are different in *ba and *bb, - * and advance both ba and bb. */ - const uint8_t byte_diff = *ba++ ^ *bb++; - - /* Set bits in any_difference if they are set in byte_diff. */ - any_difference |= byte_diff; - } - - /* Now any_difference is 0 if there are no bits different between - * a and b, and is nonzero if there are bits different between a - * and b. Now for paranoia's sake, let's convert it to 0 or 1. - * - * (If we say "!any_difference", the compiler might get smart enough - * to optimize-out our data-independence stuff above.) - * - * To unpack: - * - * If any_difference == 0: - * any_difference - 1 == ~0 - * (any_difference - 1) >> 8 == 0x00ffffff - * 1 & ((any_difference - 1) >> 8) == 1 - * - * If any_difference != 0: - * 0 < any_difference < 256, so - * 0 <= any_difference - 1 < 255 - * (any_difference - 1) >> 8 == 0 - * 1 & ((any_difference - 1) >> 8) == 0 - */ - - return 1 & ((any_difference - 1) >> 8); -} - -/* Implement di_digest256_map_t as a linked list of entries. */ -struct di_digest256_map_t { - struct di_digest256_map_t *next; - uint8_t key[32]; - void *val; -}; - -/** Release all storage held in map, calling free_fn on each value - * as we go. */ -void -dimap_free(di_digest256_map_t *map, dimap_free_fn free_fn) -{ - while (map) { - di_digest256_map_t *victim = map; - map = map->next; - if (free_fn) - free_fn(victim->val); - tor_free(victim); - } -} - -/** Adjust the map at *map, adding an entry for key -> - * val, where key is a DIGEST256_LEN-byte key. - * - * The caller MUST NOT add a key that already appears in the map. - */ -void -dimap_add_entry(di_digest256_map_t **map, - const uint8_t *key, void *val) -{ - di_digest256_map_t *new_ent; - { - void *old_val = dimap_search(*map, key, NULL); - tor_assert(! old_val); - tor_assert(val); - } - new_ent = tor_malloc_zero(sizeof(di_digest256_map_t)); - new_ent->next = *map; - memcpy(new_ent->key, key, 32); - new_ent->val = val; - *map = new_ent; -} - -/** Search the map at map for an entry whose key is key (a - * DIGEST256_LEN-byte key) returning the corresponding value if we found one, - * and returning dflt_val if the key wasn't found. - * - * This operation takes an amount of time dependent only on the length of - * map, not on the position or presence of key within map. - */ -void * -dimap_search(const di_digest256_map_t *map, const uint8_t *key, - void *dflt_val) -{ - uintptr_t result = (uintptr_t)dflt_val; - - while (map) { - uintptr_t r = (uintptr_t) tor_memeq(map->key, key, 32); - r -= 1; /* Now r is (uintptr_t)-1 if memeq returned false, and - * 0 if memeq returned true. */ - - result &= r; - result |= ((uintptr_t)(map->val)) & ~r; - - map = map->next; - } - - return (void *)result; -} - -/** - * Return true iff the sz bytes at mem are all zero. Runs in - * time independent of the contents of mem. - */ -int -safe_mem_is_zero(const void *mem, size_t sz) -{ - uint32_t total = 0; - const uint8_t *ptr = mem; - - while (sz--) { - total |= *ptr++; - } - - return 1 & ((total - 1) >> 8); -} - diff --git a/src/tor/di_ops.h b/src/tor/di_ops.h deleted file mode 100644 index d93534b69..000000000 --- a/src/tor/di_ops.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file di_ops.h - * \brief Headers for di_ops.c - **/ - -#ifndef TOR_DI_OPS_H -#define TOR_DI_OPS_H - -#include "orconfig.h" -#include "torint.h" - -int tor_memcmp(const void *a, const void *b, size_t sz); -int tor_memeq(const void *a, const void *b, size_t sz); -#define tor_memneq(a,b,sz) (!tor_memeq((a),(b),(sz))) - -/** Alias for the platform's memcmp() function. This function is - * not data-independent: we define this alias so that we can - * mark cases where we are deliberately using a data-dependent memcmp() - * implementation. - */ -#define fast_memcmp(a,b,c) (memcmp((a),(b),(c))) -#define fast_memeq(a,b,c) (0==memcmp((a),(b),(c))) -#define fast_memneq(a,b,c) (0!=memcmp((a),(b),(c))) - -int safe_mem_is_zero(const void *mem, size_t sz); - -/** A type for a map from DIGEST256_LEN-byte blobs to void*, such that - * data lookups take an amount of time proportional only to the size - * of the map, and not to the position or presence of the item in the map. - * - * Not efficient for large maps! */ -typedef struct di_digest256_map_t di_digest256_map_t; -typedef void (*dimap_free_fn)(void *); - -void dimap_free(di_digest256_map_t *map, dimap_free_fn free_fn); -void dimap_add_entry(di_digest256_map_t **map, - const uint8_t *key, void *val); -void *dimap_search(const di_digest256_map_t *map, const uint8_t *key, - void *dflt_val); - -#endif - diff --git a/src/tor/directory.c b/src/tor/directory.c deleted file mode 100644 index 4c4fd7b88..000000000 --- a/src/tor/directory.c +++ /dev/null @@ -1,3894 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "buffers.h" -#include "circuitbuild.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "control.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "entrynodes.h" -#include "geoip.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" - -#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) -#ifndef OPENBSD -#include -#endif -#endif - -/** - * \file directory.c - * \brief Code to send and fetch directories and router - * descriptors via HTTP. Directories use dirserv.c to generate the - * results; clients use routers.c to parse them. - **/ - -/* In-points to directory.c: - * - * - directory_post_to_dirservers(), called from - * router_upload_dir_desc_to_dirservers() in router.c - * upload_service_descriptor() in rendservice.c - * - directory_get_from_dirserver(), called from - * rend_client_refetch_renddesc() in rendclient.c - * run_scheduled_events() in onion_main.c - * do_hup() in onion_main.c - * - connection_dir_process_inbuf(), called from - * connection_process_inbuf() in connection.c - * - connection_dir_finished_flushing(), called from - * connection_finished_flushing() in connection.c - * - connection_dir_finished_connecting(), called from - * connection_finished_connecting() in connection.c - */ -static void directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); -static int directory_handle_command(dir_connection_t *conn); -static int body_is_plausible(const char *body, size_t body_len, int purpose); -static int purpose_needs_anonymity(uint8_t dir_purpose, - uint8_t router_purpose); -static char *http_get_header(const char *headers, const char *which); -static void http_set_address_origin(const char *headers, connection_t *conn); -static void connection_dir_download_routerdesc_failed(dir_connection_t *conn); -static void connection_dir_bridge_routerdesc_failed(dir_connection_t *conn); -static void connection_dir_download_cert_failed( - dir_connection_t *conn, int status_code); -static void connection_dir_retry_bridges(smartlist_t *descs); -static void dir_routerdesc_download_failed(smartlist_t *failed, - int status_code, - int router_purpose, - int was_extrainfo, - int was_descriptor_digests); -static void dir_microdesc_download_failed(smartlist_t *failed, - int status_code); -static void note_client_request(int purpose, int compressed, size_t bytes); -static int client_likes_consensus(networkstatus_t *v, const char *want_url); - -static void directory_initiate_command_rend(const char *address, - const tor_addr_t *addr, - uint16_t or_port, - uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query); - -/********* START VARIABLES **********/ - -/** How far in the future do we allow a directory server to tell us it is - * before deciding that one of us has the wrong time? */ -#define ALLOW_DIRECTORY_TIME_SKEW (30*60) - -#define X_ADDRESS_HEADER "X-Your-Address-Is: " - -/** HTTP cache control: how long do we tell proxies they can cache each - * kind of document we serve? */ -#define FULL_DIR_CACHE_LIFETIME (60*60) -#define RUNNINGROUTERS_CACHE_LIFETIME (20*60) -#define DIRPORTFRONTPAGE_CACHE_LIFETIME (20*60) -#define NETWORKSTATUS_CACHE_LIFETIME (5*60) -#define ROUTERDESC_CACHE_LIFETIME (30*60) -#define ROUTERDESC_BY_DIGEST_CACHE_LIFETIME (48*60*60) -#define ROBOTS_CACHE_LIFETIME (24*60*60) -#define MICRODESC_CACHE_LIFETIME (48*60*60) - -/********* END VARIABLES ************/ - -/** Return true iff the directory purpose dir_purpose (and if it's - * fetching descriptors, it's fetching them for router_purpose) - * must use an anonymous connection to a directory. */ -static int -purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose) -{ - if (get_options()->AllDirActionsPrivate) - return 1; - if (router_purpose == ROUTER_PURPOSE_BRIDGE) - return 1; /* if no circuits yet, this might break bootstrapping, but it's - * needed to be safe. */ - if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR || - dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || - dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES || - dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || - dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES || - dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS || - dir_purpose == DIR_PURPOSE_FETCH_CERTIFICATE || - dir_purpose == DIR_PURPOSE_FETCH_SERVERDESC || - dir_purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - dir_purpose == DIR_PURPOSE_FETCH_MICRODESC) - return 0; - return 1; -} - -/** Return a newly allocated string describing auth. Only describes - * authority features. */ -static char * -authdir_type_to_string(dirinfo_type_t auth) -{ - char *result; - smartlist_t *lst = smartlist_new(); - if (auth & V1_DIRINFO) - smartlist_add(lst, (void*)"V1"); - if (auth & V3_DIRINFO) - smartlist_add(lst, (void*)"V3"); - if (auth & BRIDGE_DIRINFO) - smartlist_add(lst, (void*)"Bridge"); - if (auth & HIDSERV_DIRINFO) - smartlist_add(lst, (void*)"Hidden service"); - if (smartlist_len(lst)) { - result = smartlist_join_strings(lst, ", ", 0, NULL); - } else { - result = tor_strdup("[Not an authority]"); - } - smartlist_free(lst); - return result; -} - -/** Return a string describing a given directory connection purpose. */ -static const char * -dir_conn_purpose_to_string(int purpose) -{ - switch (purpose) - { - case DIR_PURPOSE_FETCH_RENDDESC: - return "hidden-service descriptor fetch"; - case DIR_PURPOSE_UPLOAD_DIR: - return "server descriptor upload"; - case DIR_PURPOSE_UPLOAD_RENDDESC: - return "hidden-service descriptor upload"; - case DIR_PURPOSE_UPLOAD_VOTE: - return "server vote upload"; - case DIR_PURPOSE_UPLOAD_SIGNATURES: - return "consensus signature upload"; - case DIR_PURPOSE_FETCH_SERVERDESC: - return "server descriptor fetch"; - case DIR_PURPOSE_FETCH_EXTRAINFO: - return "extra-info fetch"; - case DIR_PURPOSE_FETCH_CONSENSUS: - return "consensus network-status fetch"; - case DIR_PURPOSE_FETCH_CERTIFICATE: - return "authority cert fetch"; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - return "status vote fetch"; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - return "consensus signature fetch"; - case DIR_PURPOSE_FETCH_RENDDESC_V2: - return "hidden-service v2 descriptor fetch"; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - return "hidden-service v2 descriptor upload"; - case DIR_PURPOSE_FETCH_MICRODESC: - return "microdescriptor fetch"; - } - - log_warn(LD_BUG, "Called with unknown purpose %d", purpose); - return "(unknown)"; -} - -/** Return true iff identity_digest is the digest of a router we - * believe to support extrainfo downloads. (If is_authority we do - * additional checking that's only valid for authorities.) */ -int -router_supports_extrainfo(const char *identity_digest, int is_authority) -{ - const node_t *node = node_get_by_id(identity_digest); - - if (node && node->ri) { - if (node->ri->caches_extra_info) - return 1; - } - if (is_authority) { - return 1; - } - return 0; -} - -/** Return true iff any trusted directory authority has accepted our - * server descriptor. - * - * We consider any authority sufficient because waiting for all of - * them means it never happens while any authority is down; we don't - * go for something more complex in the middle (like \>1/3 or \>1/2 or - * \>=1/2) because that doesn't seem necessary yet. - */ -int -directories_have_accepted_server_descriptor(void) -{ - const smartlist_t *servers = router_get_trusted_dir_servers(); - const or_options_t *options = get_options(); - SMARTLIST_FOREACH(servers, dir_server_t *, d, { - if ((d->type & options->PublishServerDescriptor_) && - d->has_accepted_serverdesc) { - return 1; - } - }); - return 0; -} - -/** Start a connection to every suitable directory authority, using - * connection purpose dir_purpose and uploading payload - * (of length payload_len). The dir_purpose should be one of - * 'DIR_PURPOSE_UPLOAD_DIR' or 'DIR_PURPOSE_UPLOAD_RENDDESC'. - * - * router_purpose describes the type of descriptor we're - * publishing, if we're publishing a descriptor -- e.g. general or bridge. - * - * type specifies what sort of dir authorities (V1, V3, - * HIDSERV, BRIDGE, etc) we should upload to. - * - * If extrainfo_len is nonzero, the first payload_len bytes of - * payload hold a router descriptor, and the next extrainfo_len - * bytes of payload hold an extra-info document. Upload the descriptor - * to all authorities, and the extra-info document to all authorities that - * support it. - */ -void -directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, - dirinfo_type_t type, - const char *payload, - size_t payload_len, size_t extrainfo_len) -{ - const or_options_t *options = get_options(); - int post_via_tor; - const smartlist_t *dirservers = router_get_trusted_dir_servers(); - int found = 0; - const int exclude_self = (dir_purpose == DIR_PURPOSE_UPLOAD_VOTE || - dir_purpose == DIR_PURPOSE_UPLOAD_SIGNATURES); - tor_assert(dirservers); - /* This tries dirservers which we believe to be down, but ultimately, that's - * harmless, and we may as well err on the side of getting things uploaded. - */ - SMARTLIST_FOREACH_BEGIN(dirservers, dir_server_t *, ds) { - routerstatus_t *rs = &(ds->fake_status); - size_t upload_len = payload_len; - tor_addr_t ds_addr; - - if ((type & ds->type) == 0) - continue; - - if (exclude_self && router_digest_is_me(ds->digest)) - continue; - - if (options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, rs, -1)) { - log_warn(LD_DIR, "Wanted to contact authority '%s' for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping.", - ds->nickname, - dir_conn_purpose_to_string(dir_purpose)); - continue; - } - - found = 1; /* at least one authority of this type was listed */ - if (dir_purpose == DIR_PURPOSE_UPLOAD_DIR) - ds->has_accepted_serverdesc = 0; - - if (extrainfo_len && router_supports_extrainfo(ds->digest, 1)) { - upload_len += extrainfo_len; - log_info(LD_DIR, "Uploading an extrainfo too (length %d)", - (int) extrainfo_len); - } - tor_addr_from_ipv4h(&ds_addr, ds->addr); - post_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose) || - !fascist_firewall_allows_address_dir(&ds_addr, ds->dir_port); - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - post_via_tor, - NULL, payload, upload_len, 0); - } SMARTLIST_FOREACH_END(ds); - if (!found) { - char *s = authdir_type_to_string(type); - log_warn(LD_DIR, "Publishing server descriptor to directory authorities " - "of type '%s', but no authorities of that type listed!", s); - tor_free(s); - } -} - -/** Return true iff, according to the values in options, we should be - * using directory guards for direct downloads of directory information. */ -static int -should_use_directory_guards(const or_options_t *options) -{ - /* Public (non-bridge) servers never use directory guards. */ - if (public_server_mode(options)) - return 0; - /* If guards are disabled, or directory guards are disabled, we can't - * use directory guards. - */ - if (!options->UseEntryGuards || !options->UseEntryGuardsAsDirGuards) - return 0; - /* If we're configured to fetch directory info aggressively or of a - * nonstandard type, don't use directory guards. */ - if (options->DownloadExtraInfo || options->FetchDirInfoEarly || - options->FetchDirInfoExtraEarly || options->FetchUselessDescriptors) - return 0; - if (! options->PreferTunneledDirConns) - return 0; - return 1; -} - -/** Pick an unconsetrained directory server from among our guards, the latest - * networkstatus, or the fallback dirservers, for use in downloading - * information of type type, and return its routerstatus. */ -static const routerstatus_t * -directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, - uint8_t dir_purpose) -{ - const routerstatus_t *rs = NULL; - const or_options_t *options = get_options(); - - if (options->UseBridges) - log_warn(LD_BUG, "Called when we have UseBridges set."); - - if (should_use_directory_guards(options)) { - const node_t *node = choose_random_dirguard(type); - if (node) - rs = node->rs; - } else { - /* anybody with a non-zero dirport will do */ - rs = router_pick_directory_server(type, pds_flags); - } - if (!rs) { - log_info(LD_DIR, "No router found for %s; falling back to " - "dirserver list.", dir_conn_purpose_to_string(dir_purpose)); - rs = router_pick_fallback_dirserver(type, pds_flags); - } - - return rs; -} - -/** Start a connection to a random running directory server, using - * connection purpose dir_purpose, intending to fetch descriptors - * of purpose router_purpose, and requesting resource. - * Use pds_flags as arguments to router_pick_directory_server() - * or router_pick_trusteddirserver(). - */ -void -directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, int pds_flags) -{ - const routerstatus_t *rs = NULL; - const or_options_t *options = get_options(); - int prefer_authority = directory_fetches_from_authorities(options); - int require_authority = 0; - int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose); - dirinfo_type_t type; - time_t if_modified_since = 0; - - /* FFFF we could break this switch into its own function, and call - * it elsewhere in directory.c. -RD */ - switch (dir_purpose) { - case DIR_PURPOSE_FETCH_EXTRAINFO: - type = EXTRAINFO_DIRINFO | - (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : - V3_DIRINFO); - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : - V3_DIRINFO); - break; - case DIR_PURPOSE_FETCH_RENDDESC: - type = HIDSERV_DIRINFO; - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - case DIR_PURPOSE_FETCH_CERTIFICATE: - type = V3_DIRINFO; - break; - case DIR_PURPOSE_FETCH_CONSENSUS: - type = V3_DIRINFO; - if (resource && !strcmp(resource,"microdesc")) - type |= MICRODESC_DIRINFO; - break; - case DIR_PURPOSE_FETCH_MICRODESC: - type = MICRODESC_DIRINFO; - break; - default: - log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose); - return; - } - - if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - int flav = FLAV_NS; - networkstatus_t *v; - if (resource) - flav = networkstatus_parse_flavor_name(resource); - - if (flav != -1) { - /* IF we have a parsed consensus of this type, we can do an - * if-modified-time based on it. */ - v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v) - if_modified_since = v->valid_after + 180; - } else { - /* Otherwise it might be a consensus we don't parse, but which we - * do cache. Look at the cached copy, perhaps. */ - cached_dir_t *cd = dirserv_get_consensus(resource); - if (cd) - if_modified_since = cd->published + 180; - } - } - - if (!options->FetchServerDescriptors && type != HIDSERV_DIRINFO) - return; - - if (!get_via_tor) { - if (options->UseBridges && type != BRIDGE_DIRINFO) { - /* We want to ask a running bridge for which we have a descriptor. - * - * When we ask choose_random_entry() for a bridge, we specify what - * sort of dir fetch we'll be doing, so it won't return a bridge - * that can't answer our question. - */ - /* XXX024 Not all bridges handle conditional consensus downloading, - * so, for now, never assume the server supports that. -PP */ - const node_t *node = choose_random_dirguard(type); - if (node && node->ri) { - /* every bridge has a routerinfo. */ - tor_addr_t addr; - routerinfo_t *ri = node->ri; - node_get_addr(node, &addr); - directory_initiate_command(ri->address, &addr, - ri->or_port, 0/*no dirport*/, - ri->cache_info.identity_digest, - dir_purpose, - router_purpose, - DIRIND_ONEHOP, - resource, NULL, 0, if_modified_since); - } else - log_notice(LD_DIR, "Ignoring directory request, since no bridge " - "nodes are available yet."); - return; - } else { - if (prefer_authority || type == BRIDGE_DIRINFO) { - /* only ask authdirservers, and don't ask myself */ - rs = router_pick_trusteddirserver(type, pds_flags); - if (rs == NULL && (pds_flags & (PDS_NO_EXISTING_SERVERDESC_FETCH| - PDS_NO_EXISTING_MICRODESC_FETCH))) { - /* We don't want to fetch from any authorities that we're currently - * fetching server descriptors from, and we got no match. Did we - * get no match because all the authorities have connections - * fetching server descriptors (in which case we should just - * return,) or because all the authorities are down or on fire or - * unreachable or something (in which case we should go on with - * our fallback code)? */ - pds_flags &= ~(PDS_NO_EXISTING_SERVERDESC_FETCH| - PDS_NO_EXISTING_MICRODESC_FETCH); - rs = router_pick_trusteddirserver(type, pds_flags); - if (rs) { - log_debug(LD_DIR, "Deferring serverdesc fetch: all authorities " - "are in use."); - return; - } - } - if (rs == NULL && require_authority) { - log_info(LD_DIR, "No authorities were available for %s: will try " - "later.", dir_conn_purpose_to_string(dir_purpose)); - return; - } - } - if (!rs && type != BRIDGE_DIRINFO) { - /* */ - rs = directory_pick_generic_dirserver(type, pds_flags, - dir_purpose); - if (!rs) { - /*XXXX024 I'm pretty sure this can never do any good, since - * rs isn't set. */ - get_via_tor = 1; /* last resort: try routing it via Tor */ - } - } - } - } else { /* get_via_tor */ - /* Never use fascistfirewall; we're going via Tor. */ - if (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) { - /* only ask hidserv authorities, any of them will do */ - pds_flags |= PDS_IGNORE_FASCISTFIREWALL|PDS_ALLOW_SELF; - rs = router_pick_trusteddirserver(HIDSERV_DIRINFO, pds_flags); - } else { - /* anybody with a non-zero dirport will do. Disregard firewalls. */ - pds_flags |= PDS_IGNORE_FASCISTFIREWALL; - rs = router_pick_directory_server(type, pds_flags); - /* If we have any hope of building an indirect conn, we know some router - * descriptors. If (rs==NULL), we can't build circuits anyway, so - * there's no point in falling back to the authorities in this case. */ - } - } - - if (rs) { - const dir_indirection_t indirection = - get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - indirection, - resource, NULL, 0, - if_modified_since); - } else { - log_notice(LD_DIR, - "While fetching directory info, " - "no running dirservers known. Will try again later. " - "(purpose %d)", dir_purpose); - if (!purpose_needs_anonymity(dir_purpose, router_purpose)) { - /* remember we tried them all and failed. */ - directory_all_unreachable(time(NULL)); - } - } -} - -/** As directory_get_from_dirserver, but initiates a request to every - * directory authority other than ourself. Only for use by authorities when - * searching for missing information while voting. */ -void -directory_get_from_all_authorities(uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource) -{ - tor_assert(dir_purpose == DIR_PURPOSE_FETCH_STATUS_VOTE || - dir_purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES); - - SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), - dir_server_t *, ds) { - routerstatus_t *rs; - if (router_digest_is_me(ds->digest)) - continue; - if (!(ds->type & V3_DIRINFO)) - continue; - rs = &ds->fake_status; - directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose, - DIRIND_ONEHOP, resource, NULL, - 0, 0); - } SMARTLIST_FOREACH_END(ds); -} - -/** Return true iff ind requires a multihop circuit. */ -static int -dirind_is_anon(dir_indirection_t ind) -{ - return ind == DIRIND_ANON_DIRPORT || ind == DIRIND_ANONYMOUS; -} - -/** Same as directory_initiate_command_routerstatus(), but accepts - * rendezvous data to fetch a hidden service descriptor. */ -void -directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query) -{ - const or_options_t *options = get_options(); - const node_t *node; - char address_buf[INET_NTOA_BUF_LEN+1]; - struct in_addr in; - const char *address; - tor_addr_t addr; - const int anonymized_connection = dirind_is_anon(indirection); - node = node_get_by_id(status->identity_digest); - - if (!node && anonymized_connection) { - log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " - "don't have its router descriptor.", - routerstatus_describe(status)); - return; - } else if (node) { - node_get_address_string(node, address_buf, sizeof(address_buf)); - address = address_buf; - } else { - in.s_addr = htonl(status->addr); - tor_inet_ntoa(&in, address_buf, sizeof(address_buf)); - address = address_buf; - } - tor_addr_from_ipv4h(&addr, status->addr); - - if (options->ExcludeNodes && options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { - log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping. This choice might make your Tor not work.", - routerstatus_describe(status), - dir_conn_purpose_to_string(dir_purpose)); - return; - } - - directory_initiate_command_rend(address, &addr, - status->or_port, status->dir_port, - status->identity_digest, - dir_purpose, router_purpose, - indirection, resource, - payload, payload_len, if_modified_since, - rend_query); -} - -/** Launch a new connection to the directory server status to - * upload or download a server or rendezvous - * descriptor. dir_purpose determines what - * kind of directory connection we're launching, and must be one of - * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC|RENDDESC_V2}. router_purpose - * specifies the descriptor purposes we have in mind (currently only - * used for FETCH_DIR). - * - * When uploading, payload and payload_len determine the content - * of the HTTP post. Otherwise, payload should be NULL. - * - * When fetching a rendezvous descriptor, resource is the service ID we - * want to fetch. - */ -void -directory_initiate_command_routerstatus(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since) -{ - directory_initiate_command_routerstatus_rend(status, dir_purpose, - router_purpose, - indirection, resource, - payload, payload_len, - if_modified_since, NULL); -} - -/** Return true iff conn is the client side of a directory connection - * we launched to ourself in order to determine the reachability of our - * dir_port. */ -static int -directory_conn_is_self_reachability_test(dir_connection_t *conn) -{ - if (conn->requested_resource && - !strcmpstart(conn->requested_resource,"authority")) { - const routerinfo_t *me = router_get_my_routerinfo(); - if (me && - router_digest_is_me(conn->identity_digest) && - tor_addr_eq_ipv4h(&conn->base_.addr, me->addr) && /*XXXX prop 118*/ - me->dir_port == conn->base_.port) - return 1; - } - return 0; -} - -/** Called when we are unable to complete the client's request to a directory - * server due to a network error: Mark the router as down and try again if - * possible. - */ -static void -connection_dir_request_failed(dir_connection_t *conn) -{ - if (directory_conn_is_self_reachability_test(conn)) { - return; /* this was a test fetch. don't retry. */ - } - if (!entry_list_is_constrained(get_options())) - router_set_status(conn->identity_digest, 0); /* don't try him again */ - if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { - log_info(LD_DIR, "Giving up on serverdesc/extrainfo fetch from " - "directory server at '%s'; retrying", - conn->base_.address); - if (conn->router_purpose == ROUTER_PURPOSE_BRIDGE) - connection_dir_bridge_routerdesc_failed(conn); - connection_dir_download_routerdesc_failed(conn); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - if (conn->requested_resource) - networkstatus_consensus_download_failed(0, conn->requested_resource); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { - log_info(LD_DIR, "Giving up on certificate fetch from directory server " - "at '%s'; retrying", - conn->base_.address); - connection_dir_download_cert_failed(conn, 0); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { - log_info(LD_DIR, "Giving up downloading detached signatures from '%s'", - conn->base_.address); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { - log_info(LD_DIR, "Giving up downloading votes from '%s'", - conn->base_.address); - } else if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { - log_info(LD_DIR, "Giving up on downloading microdescriptors from " - "directory server at '%s'; will retry", conn->base_.address); - connection_dir_download_routerdesc_failed(conn); - } -} - -/** Helper: Attempt to fetch directly the descriptors of each bridge - * listed in failed. - */ -static void -connection_dir_retry_bridges(smartlist_t *descs) -{ - char digest[DIGEST_LEN]; - SMARTLIST_FOREACH(descs, const char *, cp, - { - if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp))<0) { - log_warn(LD_BUG, "Malformed fingerprint in list: %s", - escaped(cp)); - continue; - } - retry_bridge_descriptor_fetch_directly(digest); - }); -} - -/** Called when an attempt to download one or more router descriptors - * or extra-info documents on connection conn failed. - */ -static void -connection_dir_download_routerdesc_failed(dir_connection_t *conn) -{ - /* No need to increment the failure count for routerdescs, since - * it's not their fault. */ - - /* No need to relaunch descriptor downloads here: we already do it - * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in onion_main.c. */ - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - - (void) conn; -} - -/** Called when an attempt to download a bridge's routerdesc from - * one of the authorities failed due to a network error. If - * possible attempt to download descriptors from the bridge directly. - */ -static void -connection_dir_bridge_routerdesc_failed(dir_connection_t *conn) -{ - smartlist_t *which = NULL; - - /* Requests for bridge descriptors are in the form 'fp/', so ignore - anything else. */ - if (!conn->requested_resource || strcmpstart(conn->requested_resource,"fp/")) - return; - - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource - + strlen("fp/"), - which, NULL, 0); - - tor_assert(conn->base_.purpose != DIR_PURPOSE_FETCH_EXTRAINFO); - if (smartlist_len(which)) { - connection_dir_retry_bridges(which); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - } - smartlist_free(which); -} - -/** Called when an attempt to fetch a certificate fails. */ -static void -connection_dir_download_cert_failed(dir_connection_t *conn, int status) -{ - const char *fp_pfx = "fp/"; - const char *fpsk_pfx = "fp-sk/"; - smartlist_t *failed; - tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE); - - if (!conn->requested_resource) - return; - failed = smartlist_new(); - /* - * We have two cases download by fingerprint (resource starts - * with "fp/") or download by fingerprint/signing key pair - * (resource starts with "fp-sk/"). - */ - if (!strcmpstart(conn->requested_resource, fp_pfx)) { - /* Download by fingerprint case */ - dir_split_resource_into_fingerprints(conn->requested_resource + - strlen(fp_pfx), - failed, NULL, DSR_HEX); - SMARTLIST_FOREACH_BEGIN(failed, char *, cp) { - /* Null signing key digest indicates download by fp only */ - authority_cert_dl_failed(cp, NULL, status); - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - } else if (!strcmpstart(conn->requested_resource, fpsk_pfx)) { - /* Download by (fp,sk) pairs */ - dir_split_resource_into_fingerprint_pairs(conn->requested_resource + - strlen(fpsk_pfx), failed); - SMARTLIST_FOREACH_BEGIN(failed, fp_pair_t *, cp) { - authority_cert_dl_failed(cp->first, cp->second, status); - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - } else { - log_warn(LD_DIR, - "Don't know what to do with failure for cert fetch %s", - conn->requested_resource); - } - - smartlist_free(failed); - - update_certificate_downloads(time(NULL)); -} - -/** Evaluate the situation and decide if we should use an encrypted - * "begindir-style" connection for this directory request. - * 1) If or_port is 0, or it's a direct conn and or_port is firewalled - * or we're a dir mirror, no. - * 2) If we prefer to avoid begindir conns, and we're not fetching or - * publishing a bridge relay descriptor, no. - * 3) Else yes. - */ -static int -directory_command_should_use_begindir(const or_options_t *options, - const tor_addr_t *addr, - int or_port, uint8_t router_purpose, - dir_indirection_t indirection) -{ - if (!or_port) - return 0; /* We don't know an ORPort -- no chance. */ - if (indirection == DIRIND_DIRECT_CONN || indirection == DIRIND_ANON_DIRPORT) - return 0; - if (indirection == DIRIND_ONEHOP) - if (!fascist_firewall_allows_address_or(addr, or_port) || - directory_fetches_from_authorities(options)) - return 0; /* We're firewalled or are acting like a relay -- also no. */ - if (!options->TunnelDirConns && - router_purpose != ROUTER_PURPOSE_BRIDGE) - return 0; /* We prefer to avoid using begindir conns. Fine. */ - return 1; -} - -/** Helper for directory_initiate_command_routerstatus: send the - * command to a server whose address is address, whose IP is - * addr, whose directory port is dir_port, whose tor version - * supports_begindir, and whose identity key digest is - * digest. */ -void -directory_initiate_command(const char *address, const tor_addr_t *_addr, - uint16_t or_port, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) -{ - directory_initiate_command_rend(address, _addr, or_port, dir_port, - digest, dir_purpose, - router_purpose, indirection, - resource, payload, payload_len, - if_modified_since, NULL); -} - -/** Return non-zero iff a directory connection with purpose - * dir_purpose reveals sensitive information about a Tor - * instance's client activities. (Such connections must be performed - * through normal three-hop Tor circuits.) */ -static int -is_sensitive_dir_purpose(uint8_t dir_purpose) -{ - return ((dir_purpose == DIR_PURPOSE_FETCH_RENDDESC) || - (dir_purpose == DIR_PURPOSE_HAS_FETCHED_RENDDESC) || - (dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC) || - (dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) || - (dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2)); -} - -/** Same as directory_initiate_command(), but accepts rendezvous data to - * fetch a hidden service descriptor. */ -static void -directory_initiate_command_rend(const char *address, const tor_addr_t *_addr, - uint16_t or_port, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query) -{ - dir_connection_t *conn; - const or_options_t *options = get_options(); - int socket_error = 0; - int use_begindir = directory_command_should_use_begindir(options, _addr, - or_port, router_purpose, indirection); - const int anonymized_connection = dirind_is_anon(indirection); - tor_addr_t addr; - - tor_assert(address); - tor_assert(_addr); - tor_assert(or_port || dir_port); - tor_assert(digest); - - tor_addr_copy(&addr, _addr); - - log_debug(LD_DIR, "anonymized %d, use_begindir %d.", - anonymized_connection, use_begindir); - - log_debug(LD_DIR, "Initiating %s", dir_conn_purpose_to_string(dir_purpose)); - -#ifndef NON_ANONYMOUS_MODE_ENABLED - tor_assert(!(is_sensitive_dir_purpose(dir_purpose) && - !anonymized_connection)); -#else - (void)is_sensitive_dir_purpose; -#endif - - /* ensure that we don't make direct connections when a SOCKS server is - * configured. */ - if (!anonymized_connection && !use_begindir && !options->HTTPProxy && - (options->Socks4Proxy || options->Socks5Proxy)) { - log_warn(LD_DIR, "Cannot connect to a directory server through a " - "SOCKS proxy!"); - return; - } - - conn = dir_connection_new(tor_addr_family(&addr)); - - /* set up conn so it's got all the data we need to remember */ - tor_addr_copy(&conn->base_.addr, &addr); - conn->base_.port = use_begindir ? or_port : dir_port; - conn->base_.address = tor_strdup(address); - memcpy(conn->identity_digest, digest, DIGEST_LEN); - - conn->base_.purpose = dir_purpose; - conn->router_purpose = router_purpose; - - /* give it an initial state */ - conn->base_.state = DIR_CONN_STATE_CONNECTING; - - /* decide whether we can learn our IP address from this conn */ - /* XXXX This is a bad name for this field now. */ - conn->dirconn_direct = !anonymized_connection; - - /* copy rendezvous data, if any */ - if (rend_query) - conn->rend_data = rend_data_dup(rend_query); - - if (!anonymized_connection && !use_begindir) { - /* then we want to connect to dirport directly */ - - if (options->HTTPProxy) { - tor_addr_copy(&addr, &options->HTTPProxyAddr); - dir_port = options->HTTPProxyPort; - } - - switch (connection_connect(TO_CONN(conn), conn->base_.address, &addr, - dir_port, &socket_error)) { - case -1: - connection_dir_request_failed(conn); /* retry if we want */ - /* XXX we only pass 'conn' above, not 'resource', 'payload', - * etc. So in many situations it can't retry! -RD */ - connection_free(TO_CONN(conn)); - return; - case 1: - /* start flushing conn */ - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; - /* fall through */ - case 0: - /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 1, resource, - payload, payload_len, - if_modified_since); - connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); - /* writable indicates finish, readable indicates broken link, - error indicates broken link in windowsland. */ - } - } else { /* we want to connect via a tor connection */ - entry_connection_t *linked_conn; - /* Anonymized tunneled connections can never share a circuit. - * One-hop directory connections can share circuits with each other - * but nothing else. */ - int iso_flags = anonymized_connection ? ISO_STREAM : ISO_SESSIONGRP; - - /* If it's an anonymized connection, remember the fact that we - * wanted it for later: maybe we'll want it again soon. */ - if (anonymized_connection && use_begindir) - rep_hist_note_used_internal(time(NULL), 0, 1); - else if (anonymized_connection && !use_begindir) - rep_hist_note_used_port(time(NULL), conn->base_.port); - - /* make an AP connection - * populate it and add it at the right state - * hook up both sides - */ - linked_conn = - connection_ap_make_link(TO_CONN(conn), - conn->base_.address, conn->base_.port, - digest, - SESSION_GROUP_DIRCONN, iso_flags, - use_begindir, conn->dirconn_direct); - if (!linked_conn) { - log_warn(LD_NET,"Making tunnel to dirserver failed."); - connection_mark_for_close(TO_CONN(conn)); - return; - } - - if (connection_add(TO_CONN(conn)) < 0) { - log_warn(LD_NET,"Unable to add connection for link to dirserver."); - connection_mark_for_close(TO_CONN(conn)); - return; - } - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; - /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 0, resource, - payload, payload_len, - if_modified_since); - - connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); - IF_HAS_BUFFEREVENT(ENTRY_TO_CONN(linked_conn), { - connection_watch_events(ENTRY_TO_CONN(linked_conn), - READ_EVENT|WRITE_EVENT); - }) ELSE_IF_NO_BUFFEREVENT - connection_start_reading(ENTRY_TO_CONN(linked_conn)); - } -} - -/** Return true iff anything we say on conn is being encrypted before - * we send it to the client/server. */ -int -connection_dir_is_encrypted(dir_connection_t *conn) -{ - /* Right now it's sufficient to see if conn is or has been linked, since - * the only thing it could be linked to is an edge connection on a - * circuit, and the only way it could have been unlinked is at the edge - * connection getting closed. - */ - return TO_CONN(conn)->linked; -} - -/** Helper for sorting - * - * sort strings alphabetically - */ -static int -compare_strs_(const void **a, const void **b) -{ - const char *s1 = *a, *s2 = *b; - return strcmp(s1, s2); -} - -#define CONDITIONAL_CONSENSUS_FPR_LEN 3 -#if (CONDITIONAL_CONSENSUS_FPR_LEN > DIGEST_LEN) -#error "conditional consensus fingerprint length is larger than digest length" -#endif - -/** Return the URL we should use for a consensus download. - * - * This url depends on whether or not the server we go to - * is sufficiently new to support conditional consensus downloading, - * i.e. GET .../consensus/fpr+fpr+fpr - * - * If 'resource' is provided, it is the name of a consensus flavor to request. - */ -static char * -directory_get_consensus_url(const char *resource) -{ - char *url = NULL; - const char *hyphen, *flavor; - if (resource==NULL || strcmp(resource, "ns")==0) { - flavor = ""; /* Request ns consensuses as "", so older servers will work*/ - hyphen = ""; - } else { - flavor = resource; - hyphen = "-"; - } - - { - char *authority_id_list; - smartlist_t *authority_digests = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), - dir_server_t *, ds) { - char *hex; - if (!(ds->type & V3_DIRINFO)) - continue; - - hex = tor_malloc(2*CONDITIONAL_CONSENSUS_FPR_LEN+1); - base16_encode(hex, 2*CONDITIONAL_CONSENSUS_FPR_LEN+1, - ds->v3_identity_digest, CONDITIONAL_CONSENSUS_FPR_LEN); - smartlist_add(authority_digests, hex); - } SMARTLIST_FOREACH_END(ds); - smartlist_sort(authority_digests, compare_strs_); - authority_id_list = smartlist_join_strings(authority_digests, - "+", 0, NULL); - - tor_asprintf(&url, "/tor/status-vote/current/consensus%s%s/%s.z", - hyphen, flavor, authority_id_list); - - SMARTLIST_FOREACH(authority_digests, char *, cp, tor_free(cp)); - smartlist_free(authority_digests); - tor_free(authority_id_list); - } - return url; -} - -/** Queue an appropriate HTTP command on conn-\>outbuf. The other args - * are as in directory_initiate_command(). - */ -static void -directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) -{ - char proxystring[256]; - char hoststring[128]; - smartlist_t *headers = smartlist_new(); - char *url; - char request[8192]; - const char *httpcommand = NULL; - - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - tor_free(conn->requested_resource); - if (resource) - conn->requested_resource = tor_strdup(resource); - - /* come up with a string for which Host: we want */ - if (conn->base_.port == 80) { - strlcpy(hoststring, conn->base_.address, sizeof(hoststring)); - } else { - tor_snprintf(hoststring, sizeof(hoststring),"%s:%d", - conn->base_.address, conn->base_.port); - } - - /* Format if-modified-since */ - if (if_modified_since) { - char b[RFC1123_TIME_LEN+1]; - format_rfc1123_time(b, if_modified_since); - smartlist_add_asprintf(headers, "If-Modified-Since: %s\r\n", b); - } - - /* come up with some proxy lines, if we're using one. */ - if (direct && get_options()->HTTPProxy) { - char *base64_authenticator=NULL; - const char *authenticator = get_options()->HTTPProxyAuthenticator; - - tor_snprintf(proxystring, sizeof(proxystring),"http://%s", hoststring); - if (authenticator) { - base64_authenticator = alloc_http_authenticator(authenticator); - if (!base64_authenticator) - log_warn(LD_BUG, "Encoding http authenticator failed"); - } - if (base64_authenticator) { - smartlist_add_asprintf(headers, - "Proxy-Authorization: Basic %s\r\n", - base64_authenticator); - tor_free(base64_authenticator); - } - } else { - proxystring[0] = 0; - } - - switch (purpose) { - case DIR_PURPOSE_FETCH_CONSENSUS: - /* resource is optional. If present, it's a flavor name */ - tor_assert(!payload); - httpcommand = "GET"; - url = directory_get_consensus_url(resource); - log_info(LD_DIR, "Downloading consensus from %s using %s", - hoststring, url); - break; - case DIR_PURPOSE_FETCH_CERTIFICATE: - tor_assert(resource); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/keys/%s", resource); - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - tor_assert(resource); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/status-vote/next/%s.z", resource); - break; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - tor_assert(!resource); - tor_assert(!payload); - httpcommand = "GET"; - url = tor_strdup("/tor/status-vote/next/consensus-signatures.z"); - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/server/%s", resource); - break; - case DIR_PURPOSE_FETCH_EXTRAINFO: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/extra/%s", resource); - break; - case DIR_PURPOSE_FETCH_MICRODESC: - tor_assert(resource); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/micro/%s", resource); - break; - case DIR_PURPOSE_UPLOAD_DIR: { - const char *why = router_get_descriptor_gen_reason(); - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/"); - if (why) { - smartlist_add_asprintf(headers, "X-Desc-Gen-Reason: %s\r\n", why); - } - break; - } - case DIR_PURPOSE_UPLOAD_VOTE: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/post/vote"); - break; - case DIR_PURPOSE_UPLOAD_SIGNATURES: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/post/consensus-signature"); - break; - case DIR_PURPOSE_FETCH_RENDDESC_V2: - tor_assert(resource); - tor_assert(strlen(resource) <= REND_DESC_ID_V2_LEN_BASE32); - tor_assert(!payload); - httpcommand = "GET"; - tor_asprintf(&url, "/tor/rendezvous2/%s", resource); - break; - case DIR_PURPOSE_UPLOAD_RENDDESC: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/rendezvous/publish"); - break; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: - tor_assert(!resource); - tor_assert(payload); - httpcommand = "POST"; - url = tor_strdup("/tor/rendezvous2/publish"); - break; - default: - tor_assert(0); - return; - } - - if (strlen(proxystring) + strlen(url) >= 4096) { - log_warn(LD_BUG, - "Squid does not like URLs longer than 4095 bytes, and this " - "one is %d bytes long: %s%s", - (int)(strlen(proxystring) + strlen(url)), proxystring, url); - } - - tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring); - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); - connection_write_to_buf(url, strlen(url), TO_CONN(conn)); - tor_free(url); - - if (!strcmp(httpcommand, "POST") || payload) { - smartlist_add_asprintf(headers, "Content-Length: %lu\r\n", - payload ? (unsigned long)payload_len : 0); - } - - { - char *header = smartlist_join_strings(headers, "", 0, NULL); - tor_snprintf(request, sizeof(request), " HTTP/1.0\r\nHost: %s\r\n%s\r\n", - hoststring, header); - tor_free(header); - } - - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); - - if (payload) { - /* then send the payload afterwards too */ - connection_write_to_buf(payload, payload_len, TO_CONN(conn)); - } - - SMARTLIST_FOREACH(headers, char *, h, tor_free(h)); - smartlist_free(headers); -} - -/** Parse an HTTP request string headers of the form - * \verbatim - * "\%s [http[s]://]\%s HTTP/1..." - * \endverbatim - * If it's well-formed, strdup the second \%s into *url, and - * nul-terminate it. If the url doesn't start with "/tor/", rewrite it - * so it does. Return 0. - * Otherwise, return -1. - */ -STATIC int -parse_http_url(const char *headers, char **url) -{ - char *s, *start, *tmp; - - s = (char *)eat_whitespace_no_nl(headers); - if (!*s) return -1; - s = (char *)find_whitespace(s); /* get past GET/POST */ - if (!*s) return -1; - s = (char *)eat_whitespace_no_nl(s); - if (!*s) return -1; - start = s; /* this is it, assuming it's valid */ - s = (char *)find_whitespace(start); - if (!*s) return -1; - - /* tolerate the http[s] proxy style of putting the hostname in the url */ - if (s-start >= 4 && !strcmpstart(start,"http")) { - tmp = start + 4; - if (*tmp == 's') - tmp++; - if (s-tmp >= 3 && !strcmpstart(tmp,"://")) { - tmp = strchr(tmp+3, '/'); - if (tmp && tmp < s) { - log_debug(LD_DIR,"Skipping over 'http[s]://hostname/' string"); - start = tmp; - } - } - } - - /* Check if the header is well formed (next sequence - * should be HTTP/1.X\r\n). Assumes we're supporting 1.0? */ - { - unsigned minor_ver; - char ch; - char *e = (char *)eat_whitespace_no_nl(s); - if (2 != tor_sscanf(e, "HTTP/1.%u%c", &minor_ver, &ch)) { - return -1; - } - if (ch != '\r') - return -1; - } - - if (s-start < 5 || strcmpstart(start,"/tor/")) { /* need to rewrite it */ - *url = tor_malloc(s - start + 5); - strlcpy(*url,"/tor", s-start+5); - strlcat((*url)+4, start, s-start+1); - } else { - *url = tor_strndup(start, s-start); - } - return 0; -} - -/** Return a copy of the first HTTP header in headers whose key is - * which. The key should be given with a terminating colon and space; - * this function copies everything after, up to but not including the - * following \\r\\n. */ -static char * -http_get_header(const char *headers, const char *which) -{ - const char *cp = headers; - while (cp) { - if (!strcasecmpstart(cp, which)) { - char *eos; - cp += strlen(which); - if ((eos = strchr(cp,'\r'))) - return tor_strndup(cp, eos-cp); - else - return tor_strdup(cp); - } - cp = strchr(cp, '\n'); - if (cp) - ++cp; - } - return NULL; -} - -/** If headers indicates that a proxy was involved, then rewrite - * conn-\>address to describe our best guess of the address that - * originated this HTTP request. */ -static void -http_set_address_origin(const char *headers, connection_t *conn) -{ - char *fwd; - - fwd = http_get_header(headers, "Forwarded-For: "); - if (!fwd) - fwd = http_get_header(headers, "X-Forwarded-For: "); - if (fwd) { - struct in_addr in; - if (!tor_inet_aton(fwd, &in) || is_internal_IP(ntohl(in.s_addr), 0)) { - log_debug(LD_DIR, "Ignoring unrecognized or internal IP %s", - escaped(fwd)); - tor_free(fwd); - return; - } - tor_free(conn->address); - conn->address = tor_strdup(fwd); - tor_free(fwd); - } -} - -/** Parse an HTTP response string headers of the form - * \verbatim - * "HTTP/1.\%d \%d\%s\r\n...". - * \endverbatim - * - * If it's well-formed, assign the status code to *code and - * return 0. Otherwise, return -1. - * - * On success: If date is provided, set *date to the Date - * header in the http headers, or 0 if no such header is found. If - * compression is provided, set *compression to the - * compression method given in the Content-Encoding header, or 0 if no - * such header is found, or -1 if the value of the header is not - * recognized. If reason is provided, strdup the reason string - * into it. - */ -int -parse_http_response(const char *headers, int *code, time_t *date, - compress_method_t *compression, char **reason) -{ - unsigned n1, n2; - char datestr[RFC1123_TIME_LEN+1]; - smartlist_t *parsed_headers; - tor_assert(headers); - tor_assert(code); - - while (TOR_ISSPACE(*headers)) headers++; /* tolerate leading whitespace */ - - if (tor_sscanf(headers, "HTTP/1.%u %u", &n1, &n2) < 2 || - (n1 != 0 && n1 != 1) || - (n2 < 100 || n2 >= 600)) { - log_warn(LD_HTTP,"Failed to parse header %s",escaped(headers)); - return -1; - } - *code = n2; - - parsed_headers = smartlist_new(); - smartlist_split_string(parsed_headers, headers, "\n", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); - if (reason) { - smartlist_t *status_line_elements = smartlist_new(); - tor_assert(smartlist_len(parsed_headers)); - smartlist_split_string(status_line_elements, - smartlist_get(parsed_headers, 0), - " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3); - tor_assert(smartlist_len(status_line_elements) <= 3); - if (smartlist_len(status_line_elements) == 3) { - *reason = smartlist_get(status_line_elements, 2); - smartlist_set(status_line_elements, 2, NULL); /* Prevent free */ - } - SMARTLIST_FOREACH(status_line_elements, char *, cp, tor_free(cp)); - smartlist_free(status_line_elements); - } - if (date) { - *date = 0; - SMARTLIST_FOREACH(parsed_headers, const char *, s, - if (!strcmpstart(s, "Date: ")) { - strlcpy(datestr, s+6, sizeof(datestr)); - /* This will do nothing on failure, so we don't need to check - the result. We shouldn't warn, since there are many other valid - date formats besides the one we use. */ - parse_rfc1123_time(datestr, date); - break; - }); - } - if (compression) { - const char *enc = NULL; - SMARTLIST_FOREACH(parsed_headers, const char *, s, - if (!strcmpstart(s, "Content-Encoding: ")) { - enc = s+18; break; - }); - if (!enc || !strcmp(enc, "identity")) { - *compression = NO_METHOD; - } else if (!strcmp(enc, "deflate") || !strcmp(enc, "x-deflate")) { - *compression = ZLIB_METHOD; - } else if (!strcmp(enc, "gzip") || !strcmp(enc, "x-gzip")) { - *compression = GZIP_METHOD; - } else { - log_info(LD_HTTP, "Unrecognized content encoding: %s. Trying to deal.", - escaped(enc)); - *compression = UNKNOWN_METHOD; - } - } - SMARTLIST_FOREACH(parsed_headers, char *, s, tor_free(s)); - smartlist_free(parsed_headers); - - return 0; -} - -/** Return true iff body doesn't start with a plausible router or - * running-list or directory opening. This is a sign of possible compression. - **/ -static int -body_is_plausible(const char *body, size_t len, int purpose) -{ - int i; - if (len == 0) - return 1; /* empty bodies don't need decompression */ - if (len < 32) - return 0; - if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { - return (!strcmpstart(body,"onion-key")); - } - if (purpose != DIR_PURPOSE_FETCH_RENDDESC) { - if (!strcmpstart(body,"router") || - !strcmpstart(body,"signed-directory") || - !strcmpstart(body,"network-status") || - !strcmpstart(body,"running-routers")) - return 1; - for (i=0;i<32;++i) { - if (!TOR_ISPRINT(body[i]) && !TOR_ISSPACE(body[i])) - return 0; - } - return 1; - } else { - return 1; - } -} - -/** Called when we've just fetched a bunch of router descriptors in - * body. The list which, if present, holds digests for - * descriptors we requested: descriptor digests if descriptor_digests - * is true, or identity digests otherwise. Parse the descriptors, validate - * them, and annotate them as having purpose purpose and as having been - * downloaded from source. - * - * Return the number of routers actually added. */ -static int -load_downloaded_routers(const char *body, smartlist_t *which, - int descriptor_digests, - int router_purpose, - const char *source) -{ - char buf[256]; - char time_buf[ISO_TIME_LEN+1]; - int added = 0; - int general = router_purpose == ROUTER_PURPOSE_GENERAL; - format_iso_time(time_buf, time(NULL)); - tor_assert(source); - - if (tor_snprintf(buf, sizeof(buf), - "@downloaded-at %s\n" - "@source %s\n" - "%s%s%s", time_buf, escaped(source), - !general ? "@purpose " : "", - !general ? router_purpose_to_string(router_purpose) : "", - !general ? "\n" : "")<0) - return added; - - added = router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, - descriptor_digests, buf); - if (general) - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - return added; -} - -/** We are a client, and we've finished reading the server's - * response. Parse it and act appropriately. - * - * If we're still happy with using this directory server in the future, return - * 0. Otherwise return -1; and the caller should consider trying the request - * again. - * - * The caller will take care of marking the connection for close. - */ -static int -connection_dir_client_reached_eof(dir_connection_t *conn) -{ - char *body; - char *headers; - char *reason = NULL; - size_t body_len = 0, orig_len = 0; - int status_code; - time_t date_header = 0; - long delta; - compress_method_t compression; - int plausible; - int skewed = 0; - int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || - conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - int was_compressed = 0; - time_t now = time(NULL); - int src_code; - - switch (connection_fetch_from_buf_http(TO_CONN(conn), - &headers, MAX_HEADERS_SIZE, - &body, &body_len, MAX_DIR_DL_SIZE, - allow_partial)) { - case -1: /* overflow */ - log_warn(LD_PROTOCOL, - "'fetch' response too large (server '%s:%d'). Closing.", - conn->base_.address, conn->base_.port); - return -1; - case 0: - log_info(LD_HTTP, - "'fetch' response not all here, but we're at eof. Closing."); - return -1; - /* case 1, fall through */ - } - orig_len = body_len; - - if (parse_http_response(headers, &status_code, &date_header, - &compression, &reason) < 0) { - log_warn(LD_HTTP,"Unparseable headers (server '%s:%d'). Closing.", - conn->base_.address, conn->base_.port); - tor_free(body); tor_free(headers); - return -1; - } - if (!reason) reason = tor_strdup("[no reason given]"); - - log_debug(LD_DIR, - "Received response from directory server '%s:%d': %d %s " - "(purpose: %d)", - conn->base_.address, conn->base_.port, status_code, - escaped(reason), - conn->base_.purpose); - - /* now check if it's got any hints for us about our IP address. */ - if (conn->dirconn_direct) { - char *guess = http_get_header(headers, X_ADDRESS_HEADER); - if (guess) { - router_new_address_suggestion(guess, conn); - tor_free(guess); - } - } - - if (date_header > 0) { - /* The date header was written very soon after we sent our request, - * so compute the skew as the difference between sending the request - * and the date header. (We used to check now-date_header, but that's - * inaccurate if we spend a lot of time downloading.) - */ - delta = conn->base_.timestamp_lastwritten - date_header; - if (labs(delta)>ALLOW_DIRECTORY_TIME_SKEW) { - char dbuf[64]; - int trusted = router_digest_is_trusted_dir(conn->identity_digest); - format_time_interval(dbuf, sizeof(dbuf), delta); - log_fn(trusted ? LOG_WARN : LOG_INFO, - LD_HTTP, - "Received directory with skewed time (server '%s:%d'): " - "It seems that our clock is %s by %s, or that theirs is %s. " - "Tor requires an accurate clock to work: please check your time, " - "timezone, and date settings.", - conn->base_.address, conn->base_.port, - delta>0 ? "ahead" : "behind", dbuf, - delta>0 ? "behind" : "ahead"); - skewed = 1; /* don't check the recommended-versions line */ - if (trusted) - control_event_general_status(LOG_WARN, - "CLOCK_SKEW SKEW=%ld SOURCE=DIRSERV:%s:%d", - delta, conn->base_.address, conn->base_.port); - } else { - log_debug(LD_HTTP, "Time on received directory is within tolerance; " - "we are %ld seconds skewed. (That's okay.)", delta); - } - } - (void) skewed; /* skewed isn't used yet. */ - - if (status_code == 503) { - routerstatus_t *rs; - dir_server_t *ds; - const char *id_digest = conn->identity_digest; - log_info(LD_DIR,"Received http status code %d (%s) from server " - "'%s:%d'. I'll try again soon.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - if ((rs = router_get_mutable_consensus_status_by_id(id_digest))) - rs->last_dir_503_at = now; - if ((ds = router_get_fallback_dirserver_by_digest(id_digest))) - ds->fake_status.last_dir_503_at = now; - - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - - plausible = body_is_plausible(body, body_len, conn->base_.purpose); - if (compression != NO_METHOD || !plausible) { - char *new_body = NULL; - size_t new_len = 0; - compress_method_t guessed = detect_compression_method(body, body_len); - if (compression == UNKNOWN_METHOD || guessed != compression) { - /* Tell the user if we don't believe what we're told about compression.*/ - const char *description1, *description2; - if (compression == ZLIB_METHOD) - description1 = "as deflated"; - else if (compression == GZIP_METHOD) - description1 = "as gzipped"; - else if (compression == NO_METHOD) - description1 = "as uncompressed"; - else - description1 = "with an unknown Content-Encoding"; - if (guessed == ZLIB_METHOD) - description2 = "deflated"; - else if (guessed == GZIP_METHOD) - description2 = "gzipped"; - else if (!plausible) - description2 = "confusing binary junk"; - else - description2 = "uncompressed"; - - log_info(LD_HTTP, "HTTP body from server '%s:%d' was labeled %s, " - "but it seems to be %s.%s", - conn->base_.address, conn->base_.port, description1, - description2, - (compression>0 && guessed>0)?" Trying both.":""); - } - /* Try declared compression first if we can. */ - if (compression == GZIP_METHOD || compression == ZLIB_METHOD) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, compression, - !allow_partial, LOG_PROTOCOL_WARN); - /* Okay, if that didn't work, and we think that it was compressed - * differently, try that. */ - if (!new_body && - (guessed == GZIP_METHOD || guessed == ZLIB_METHOD) && - compression != guessed) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, guessed, - !allow_partial, LOG_PROTOCOL_WARN); - /* If we're pretty sure that we have a compressed directory, and - * we didn't manage to uncompress it, then warn and bail. */ - if (!plausible && !new_body) { - log_fn(LOG_PROTOCOL_WARN, LD_HTTP, - "Unable to decompress HTTP body (server '%s:%d').", - conn->base_.address, conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - if (new_body) { - tor_free(body); - body = new_body; - body_len = new_len; - was_compressed = 1; - } - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - int r; - const char *flavname = conn->requested_resource; - if (status_code != 200) { - int severity = (status_code == 304) ? LOG_INFO : LOG_WARN; - tor_log(severity, LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching consensus directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - networkstatus_consensus_download_failed(status_code, flavname); - return -1; - } - log_info(LD_DIR,"Received consensus directory (size %d) from server " - "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); - if ((r=networkstatus_set_current_consensus(body, flavname, 0))<0) { - log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, - "Unable to load %s consensus directory downloaded from " - "server '%s:%d'. I'll try again soon.", - flavname, conn->base_.address, conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - networkstatus_consensus_download_failed(0, flavname); - return -1; - } - /* launches router downloads as needed */ - routers_update_all_from_networkstatus(now, 3); - update_microdescs_from_networkstatus(now); - update_microdesc_downloads(now); - directory_info_has_arrived(now, 0); - log_info(LD_DIR, "Successfully loaded consensus."); - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/keys/%s\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - connection_dir_download_cert_failed(conn, status_code); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - log_info(LD_DIR,"Received authority certificates (size %d) from server " - "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); - - /* - * Tell trusted_dirs_load_certs_from_string() whether it was by fp - * or fp-sk pair. - */ - src_code = -1; - if (!strcmpstart(conn->requested_resource, "fp/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST; - } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST; - } - - if (src_code != -1) { - if (trusted_dirs_load_certs_from_string(body, src_code, 1)<0) { - log_warn(LD_DIR, "Unable to parse fetched certificates"); - /* if we fetched more than one and only some failed, the successful - * ones got flushed to disk so it's safe to call this on them */ - connection_dir_download_cert_failed(conn, status_code); - } else { - directory_info_has_arrived(now, 0); - log_info(LD_DIR, "Successfully loaded certificates from fetch."); - } - } else { - log_warn(LD_DIR, - "Couldn't figure out what to do with fetched certificates for " - "unknown resource %s", - conn->requested_resource); - connection_dir_download_cert_failed(conn, status_code); - } - } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { - const char *msg; - int st; - log_info(LD_DIR,"Got votes (size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/status-vote/next/%s.z\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - dirvote_add_vote(body, &msg, &st); - if (st > 299) { - log_warn(LD_DIR, "Error adding retrieved vote: %s", msg); - } else { - log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg); - } - } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { - const char *msg = NULL; - log_info(LD_DIR,"Got detached signatures (size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server '%s:%d' while fetching " - "\"/tor/status-vote/next/consensus-signatures.z\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) { - log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s", - conn->base_.address, conn->base_.port, msg?msg:"???"); - } - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { - int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO; - smartlist_t *which = NULL; - int n_asked_for = 0; - int descriptor_digests = conn->requested_resource && - !strcmpstart(conn->requested_resource,"d/"); - log_info(LD_DIR,"Received %s (size %d) from server '%s:%d'", - was_ei ? "extra server info" : "server info", - (int)body_len, conn->base_.address, conn->base_.port); - if (conn->requested_resource && - (!strcmpstart(conn->requested_resource,"d/") || - !strcmpstart(conn->requested_resource,"fp/"))) { - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource + - (descriptor_digests ? 2 : 3), - which, NULL, 0); - n_asked_for = smartlist_len(which); - } - if (status_code != 200) { - int dir_okay = status_code == 404 || - (status_code == 400 && !strcmp(reason, "Servers unavailable.")); - /* 404 means that it didn't have them; no big deal. - * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */ - log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR, - "Received http status code %d (%s) from server '%s:%d' " - "while fetching \"/tor/server/%s\". I'll try again soon.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - if (!which) { - connection_dir_download_routerdesc_failed(conn); - } else { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - tor_free(body); tor_free(headers); tor_free(reason); - return dir_okay ? 0 : -1; - } - /* Learn the routers, assuming we requested by fingerprint or "all" - * or "authority". - * - * We use "authority" to fetch our own descriptor for - * testing, and to fetch bridge descriptors for bootstrapping. Ignore - * the output of "authority" requests unless we are using bridges, - * since otherwise they'll be the response from reachability tests, - * and we don't really want to add that to our routerlist. */ - if (which || (conn->requested_resource && - (!strcmpstart(conn->requested_resource, "all") || - (!strcmpstart(conn->requested_resource, "authority") && - get_options()->UseBridges)))) { - /* as we learn from them, we remove them from 'which' */ - if (was_ei) { - router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which, - descriptor_digests); - } else { - //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, - // descriptor_digests, conn->router_purpose); - if (load_downloaded_routers(body, which, descriptor_digests, - conn->router_purpose, - conn->base_.address)) - directory_info_has_arrived(now, 0); - } - } - if (which) { /* mark remaining ones as failed */ - log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", - n_asked_for-smartlist_len(which), n_asked_for, - was_ei ? "extra-info documents" : "router descriptors", - conn->base_.address, (int)conn->base_.port); - if (smartlist_len(which)) { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - } - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - if (directory_conn_is_self_reachability_test(conn)) - router_dirport_found_reachable(); - } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { - smartlist_t *which = NULL; - log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " - "size %d) from server '%s:%d'", - status_code, (int)body_len, conn->base_.address, - conn->base_.port); - tor_assert(conn->requested_resource && - !strcmpstart(conn->requested_resource, "d/")); - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource+2, - which, NULL, - DSR_DIGEST256|DSR_BASE64); - if (status_code != 200) { - log_info(LD_DIR, "Received status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again " - "soon.", - status_code, escaped(reason), conn->base_.address, - (int)conn->base_.port, conn->requested_resource); - dir_microdesc_download_failed(which, status_code); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - tor_free(body); tor_free(headers); tor_free(reason); - return 0; - } else { - smartlist_t *mds; - mds = microdescs_add_to_cache(get_microdesc_cache(), - body, body+body_len, SAVED_NOWHERE, 0, - now, which); - if (smartlist_len(which)) { - /* Mark remaining ones as failed. */ - dir_microdesc_download_failed(which, status_code); - } - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - smartlist_free(mds); - } - } - - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR) { - switch (status_code) { - case 200: { - dir_server_t *ds = - router_get_trusteddirserver_by_digest(conn->identity_digest); - char *rejected_hdr = http_get_header(headers, - "X-Descriptor-Not-New: "); - if (rejected_hdr) { - if (!strcmp(rejected_hdr, "Yes")) { - log_info(LD_GENERAL, - "Authority '%s' declined our descriptor (not new)", - ds->nickname); - /* XXXX use this information; be sure to upload next one - * sooner. -NM */ - /* XXXX023 On further thought, the task above implies that we're - * basing our regenerate-descriptor time on when we uploaded the - * last descriptor, not on the published time of the last - * descriptor. If those are different, that's a bad thing to - * do. -NM */ - } - tor_free(rejected_hdr); - } - log_info(LD_GENERAL,"eof (status 200) after uploading server " - "descriptor: finished."); - control_event_server_status( - LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d", - conn->base_.address, conn->base_.port); - - ds->has_accepted_serverdesc = 1; - if (directories_have_accepted_server_descriptor()) - control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR"); - } - break; - case 400: - log_warn(LD_GENERAL,"http status 400 (%s) response from " - "dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - control_event_server_status(LOG_WARN, - "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"", - conn->base_.address, conn->base_.port, escaped(reason)); - break; - default: - log_warn(LD_GENERAL, - "http status %d (%s) reason unexpected while uploading " - "descriptor to server '%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - } - - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE) { - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "vote to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, - "http status %d (%s) reason unexpected while uploading " - "vote to server '%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - } - - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES) { - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "signatures to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, - "http status %d (%s) reason unexpected while uploading " - "signatures to server '%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC) { - tor_assert(conn->rend_data); - log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " - "(%s))", - (int)body_len, status_code, escaped(reason)); - switch (status_code) { - case 200: - if (rend_cache_store(body, body_len, 0, - conn->rend_data->onion_address) < -1) { - log_warn(LD_REND,"Failed to parse rendezvous descriptor."); - /* Any pending rendezvous attempts will notice when - * connection_about_to_close_connection() - * cleans this dir conn up. */ - /* We could retry. But since v0 descriptors are going out of - * style, it isn't worth the hassle. We'll do better in v2. */ - } else { - /* Success, or at least there's a v2 descriptor already - * present. Notify pending connections about this. */ - conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; - rend_client_desc_trynow(conn->rend_data->onion_address); - } - break; - case 404: - /* Not there. Pending connections will be notified when - * connection_about_to_close_connection() cleans this conn up. */ - break; - case 400: - log_warn(LD_REND, - "http status 400 (%s). Dirserver didn't like our " - "rendezvous query?", escaped(reason)); - break; - default: - log_warn(LD_REND,"http status %d (%s) response unexpected while " - "fetching hidden service descriptor (server '%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { - #define SEND_HS_DESC_FAILED_EVENT() ( \ - control_event_hs_descriptor_failed(conn->rend_data, \ - conn->identity_digest) ) - tor_assert(conn->rend_data); - log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " - "(%s))", - (int)body_len, status_code, escaped(reason)); - switch (status_code) { - case 200: - switch (rend_cache_store_v2_desc_as_client(body, conn->rend_data)) { - case -2: - log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " - "Retrying at another directory."); - /* We'll retry when connection_about_to_close_connection() - * cleans this dir conn up. */ - SEND_HS_DESC_FAILED_EVENT(); - break; - case -1: - /* We already have a v0 descriptor here. Ignoring this one - * and _not_ performing another request. */ - log_info(LD_REND, "Successfully fetched v2 rendezvous " - "descriptor, but we already have a v0 descriptor."); - conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; - break; - default: - /* success. notify pending connections about this. */ - log_info(LD_REND, "Successfully fetched v2 rendezvous " - "descriptor."); - control_event_hs_descriptor_received(conn->rend_data, - conn->identity_digest); - conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC; - rend_client_desc_trynow(conn->rend_data->onion_address); - break; - } - break; - case 404: - /* Not there. We'll retry when - * connection_about_to_close_connection() cleans this conn up. */ - log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " - "Retrying at another directory."); - SEND_HS_DESC_FAILED_EVENT(); - break; - case 400: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status 400 (%s). Dirserver didn't like our " - "v2 rendezvous query? Retrying at another directory.", - escaped(reason)); - SEND_HS_DESC_FAILED_EVENT(); - break; - default: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status %d (%s) response unexpected while " - "fetching v2 hidden service descriptor (server '%s:%d'). " - "Retrying at another directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - SEND_HS_DESC_FAILED_EVENT(); - break; - } - } - - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC || - conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) { - log_info(LD_REND,"Uploaded rendezvous descriptor (status %d " - "(%s))", - status_code, escaped(reason)); - switch (status_code) { - case 200: - log_info(LD_REND, - "Uploading rendezvous descriptor: finished with status " - "200 (%s)", escaped(reason)); - break; - case 400: - log_warn(LD_REND,"http status 400 (%s) response from dirserver " - "'%s:%d'. Malformed rendezvous descriptor?", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_REND,"http status %d (%s) response unexpected (server " - "'%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - break; - } - } - note_client_request(conn->base_.purpose, was_compressed, orig_len); - tor_free(body); tor_free(headers); tor_free(reason); - return 0; -} - -/** Called when a directory connection reaches EOF. */ -int -connection_dir_reached_eof(dir_connection_t *conn) -{ - int retval; - if (conn->base_.state != DIR_CONN_STATE_CLIENT_READING) { - log_info(LD_HTTP,"conn reached eof, not reading. [state=%d] Closing.", - conn->base_.state); - connection_close_immediate(TO_CONN(conn)); /* error: give up on flushing */ - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - retval = connection_dir_client_reached_eof(conn); - if (retval == 0) /* success */ - conn->base_.state = DIR_CONN_STATE_CLIENT_FINISHED; - connection_mark_for_close(TO_CONN(conn)); - return retval; -} - -/** If any directory object is arriving, and it's over 10MB large, we're - * getting DoS'd. (As of 0.1.2.x, raw directories are about 1MB, and we never - * ask for more than 96 router descriptors at a time.) - */ -#define MAX_DIRECTORY_OBJECT_SIZE (10*(1<<20)) - -/** Read handler for directory connections. (That's connections to - * directory servers and connections at directory servers.) - */ -int -connection_dir_process_inbuf(dir_connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - /* Directory clients write, then read data until they receive EOF; - * directory servers read data until they get an HTTP command, then - * write their response (when it's finished flushing, they mark for - * close). - */ - - /* If we're on the dirserver side, look for a command. */ - if (conn->base_.state == DIR_CONN_STATE_SERVER_COMMAND_WAIT) { - if (directory_handle_command(conn) < 0) { - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - return 0; - } - - if (connection_get_inbuf_len(TO_CONN(conn)) > MAX_DIRECTORY_OBJECT_SIZE) { - log_warn(LD_HTTP, "Too much data received from directory connection: " - "denial of service attempt, or you need to upgrade?"); - connection_mark_for_close(TO_CONN(conn)); - return -1; - } - - if (!conn->base_.inbuf_reached_eof) - log_debug(LD_HTTP,"Got data, not eof. Leaving on inbuf."); - return 0; -} - -/** Called when we're about to finally unlink and free a directory connection: - * perform necessary accounting and cleanup */ -void -connection_dir_about_to_close(dir_connection_t *dir_conn) -{ - connection_t *conn = TO_CONN(dir_conn); - - if (conn->state < DIR_CONN_STATE_CLIENT_FINISHED) { - /* It's a directory connection and connecting or fetching - * failed: forget about this router, and maybe try again. */ - connection_dir_request_failed(dir_conn); - } - /* If we were trying to fetch a v2 rend desc and did not succeed, - * retry as needed. (If a fetch is successful, the connection state - * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that - * refetching is unnecessary.) */ - if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 && - dir_conn->rend_data && - strlen(dir_conn->rend_data->onion_address) == REND_SERVICE_ID_LEN_BASE32) - rend_client_refetch_v2_renddesc(dir_conn->rend_data); -} - -/** Create an http response for the client conn out of - * status and reason_phrase. Write it to conn. - */ -static void -write_http_status_line(dir_connection_t *conn, int status, - const char *reason_phrase) -{ - char buf[256]; - if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n\r\n", - status, reason_phrase ? reason_phrase : "OK") < 0) { - log_warn(LD_BUG,"status line too long."); - return; - } - connection_write_to_buf(buf, strlen(buf), TO_CONN(conn)); -} - -/** Write the header for an HTTP/1.0 response onto conn-\>outbuf, - * with type as the Content-Type. - * - * If length is nonnegative, it is the Content-Length. - * If encoding is provided, it is the Content-Encoding. - * If cache_lifetime is greater than 0, the content may be cached for - * up to cache_lifetime seconds. Otherwise, the content may not be cached. */ -static void -write_http_response_header_impl(dir_connection_t *conn, ssize_t length, - const char *type, const char *encoding, - const char *extra_headers, - long cache_lifetime) -{ - char date[RFC1123_TIME_LEN+1]; - char tmp[1024]; - char *cp; - time_t now = time(NULL); - - tor_assert(conn); - - format_rfc1123_time(date, now); - cp = tmp; - tor_snprintf(cp, sizeof(tmp), - "HTTP/1.0 200 OK\r\nDate: %s\r\n", - date); - cp += strlen(tmp); - if (type) { - tor_snprintf(cp, sizeof(tmp)-(cp-tmp), "Content-Type: %s\r\n", type); - cp += strlen(cp); - } - if (!is_local_addr(&conn->base_.addr)) { - /* Don't report the source address for a nearby/private connection. - * Otherwise we tend to mis-report in cases where incoming ports are - * being forwarded to a Tor server running behind the firewall. */ - tor_snprintf(cp, sizeof(tmp)-(cp-tmp), - X_ADDRESS_HEADER "%s\r\n", conn->base_.address); - cp += strlen(cp); - } - if (encoding) { - tor_snprintf(cp, sizeof(tmp)-(cp-tmp), - "Content-Encoding: %s\r\n", encoding); - cp += strlen(cp); - } - if (length >= 0) { - tor_snprintf(cp, sizeof(tmp)-(cp-tmp), - "Content-Length: %ld\r\n", (long)length); - cp += strlen(cp); - } - if (cache_lifetime > 0) { - char expbuf[RFC1123_TIME_LEN+1]; - format_rfc1123_time(expbuf, now + cache_lifetime); - /* We could say 'Cache-control: max-age=%d' here if we start doing - * http/1.1 */ - tor_snprintf(cp, sizeof(tmp)-(cp-tmp), - "Expires: %s\r\n", expbuf); - cp += strlen(cp); - } else if (cache_lifetime == 0) { - /* We could say 'Cache-control: no-cache' here if we start doing - * http/1.1 */ - strlcpy(cp, "Pragma: no-cache\r\n", sizeof(tmp)-(cp-tmp)); - cp += strlen(cp); - } - if (extra_headers) { - strlcpy(cp, extra_headers, sizeof(tmp)-(cp-tmp)); - cp += strlen(cp); - } - if (sizeof(tmp)-(cp-tmp) > 3) - memcpy(cp, "\r\n", 3); - else - tor_assert(0); - connection_write_to_buf(tmp, strlen(tmp), TO_CONN(conn)); -} - -/** As write_http_response_header_impl, but sets encoding and content-typed - * based on whether the response will be compressed or not. */ -static void -write_http_response_header(dir_connection_t *conn, ssize_t length, - int compressed, long cache_lifetime) -{ - write_http_response_header_impl(conn, length, - compressed?"application/octet-stream":"text/plain", - compressed?"deflate":"identity", - NULL, - cache_lifetime); -} - -#if defined(INSTRUMENT_DOWNLOADS) || defined(RUNNING_DOXYGEN) -/* DOCDOC */ -typedef struct request_t { - uint64_t bytes; /**< How many bytes have we transferred? */ - uint64_t count; /**< How many requests have we made? */ -} request_t; - -/** Map used to keep track of how much data we've up/downloaded in what kind - * of request. Maps from request type to pointer to request_t. */ -static strmap_t *request_map = NULL; - -/** Record that a client request of purpose was made, and that - * bytes bytes of possibly compressed data were sent/received. - * Used to keep track of how much we've up/downloaded in what kind of - * request. */ -static void -note_client_request(int purpose, int compressed, size_t bytes) -{ - char *key; - const char *kind = NULL; - switch (purpose) { - case DIR_PURPOSE_FETCH_CONSENSUS: kind = "dl/consensus"; break; - case DIR_PURPOSE_FETCH_CERTIFICATE: kind = "dl/cert"; break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: kind = "dl/vote"; break; - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: kind = "dl/detached_sig"; - break; - case DIR_PURPOSE_FETCH_SERVERDESC: kind = "dl/server"; break; - case DIR_PURPOSE_FETCH_EXTRAINFO: kind = "dl/extra"; break; - case DIR_PURPOSE_UPLOAD_DIR: kind = "dl/ul-dir"; break; - case DIR_PURPOSE_UPLOAD_VOTE: kind = "dl/ul-vote"; break; - case DIR_PURPOSE_UPLOAD_SIGNATURES: kind = "dl/ul-sig"; break; - case DIR_PURPOSE_FETCH_RENDDESC: kind = "dl/rend"; break; - case DIR_PURPOSE_FETCH_RENDDESC_V2: kind = "dl/rend2"; break; - case DIR_PURPOSE_UPLOAD_RENDDESC: kind = "dl/ul-rend"; break; - case DIR_PURPOSE_UPLOAD_RENDDESC_V2: kind = "dl/ul-rend2"; break; - } - if (kind) { - tor_asprintf(&key, "%s%s", kind, compressed?".z":""); - } else { - tor_asprintf(&key, "unknown purpose (%d)%s", - purpose, compressed?".z":""); - } - note_request(key, bytes); - tor_free(key); -} - -/** Helper: initialize the request map to instrument downloads. */ -static void -ensure_request_map_initialized(void) -{ - if (!request_map) - request_map = strmap_new(); -} - -/** Called when we just transmitted or received bytes worth of data - * because of a request of type key (an arbitrary identifier): adds - * bytes to the total associated with key. */ -void -note_request(const char *key, size_t bytes) -{ - request_t *r; - ensure_request_map_initialized(); - - r = strmap_get(request_map, key); - if (!r) { - r = tor_malloc_zero(sizeof(request_t)); - strmap_set(request_map, key, r); - } - r->bytes += bytes; - r->count++; -} - -/** Return a newly allocated string holding a summary of bytes used per - * request type. */ -char * -directory_dump_request_log(void) -{ - smartlist_t *lines; - char *result; - strmap_iter_t *iter; - - ensure_request_map_initialized(); - - lines = smartlist_new(); - - for (iter = strmap_iter_init(request_map); - !strmap_iter_done(iter); - iter = strmap_iter_next(request_map, iter)) { - const char *key; - void *val; - request_t *r; - strmap_iter_get(iter, &key, &val); - r = val; - smartlist_add_asprintf(lines, "%s "U64_FORMAT" "U64_FORMAT"\n", - key, U64_PRINTF_ARG(r->bytes), U64_PRINTF_ARG(r->count)); - } - smartlist_sort_strings(lines); - result = smartlist_join_strings(lines, "", 0, NULL); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); - return result; -} -#else -static void -note_client_request(int purpose, int compressed, size_t bytes) -{ - (void)purpose; - (void)compressed; - (void)bytes; -} - -void -note_request(const char *key, size_t bytes) -{ - (void)key; - (void)bytes; -} - -char * -directory_dump_request_log(void) -{ - return tor_strdup("Not supported."); -} -#endif - -/** Decide whether a client would accept the consensus we have. - * - * Clients can say they only want a consensus if it's signed by more - * than half the authorities in a list. They pass this list in - * the url as "...consensus/fpr+fpr+fpr". - * - * fpr may be an abbreviated fingerprint, i.e. only a left substring - * of the full authority identity digest. (Only strings of even length, - * i.e. encodings of full bytes, are handled correctly. In the case - * of an odd number of hex digits the last one is silently ignored.) - * - * Returns 1 if more than half of the requested authorities signed the - * consensus, 0 otherwise. - */ -int -client_likes_consensus(networkstatus_t *v, const char *want_url) -{ - smartlist_t *want_authorities = smartlist_new(); - int need_at_least; - int have = 0; - - dir_split_resource_into_fingerprints(want_url, want_authorities, NULL, 0); - need_at_least = smartlist_len(want_authorities)/2+1; - SMARTLIST_FOREACH_BEGIN(want_authorities, const char *, d) { - char want_digest[DIGEST_LEN]; - size_t want_len = strlen(d)/2; - if (want_len > DIGEST_LEN) - want_len = DIGEST_LEN; - - if (base16_decode(want_digest, DIGEST_LEN, d, want_len*2) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, - "Failed to decode requested authority digest %s.", d); - continue; - }; - - SMARTLIST_FOREACH_BEGIN(v->voters, networkstatus_voter_info_t *, vi) { - if (smartlist_len(vi->sigs) && - tor_memeq(vi->identity_digest, want_digest, want_len)) { - have++; - break; - }; - } SMARTLIST_FOREACH_END(vi); - - /* early exit, if we already have enough */ - if (have >= need_at_least) - break; - } SMARTLIST_FOREACH_END(d); - - SMARTLIST_FOREACH(want_authorities, char *, d, tor_free(d)); - smartlist_free(want_authorities); - return (have >= need_at_least); -} - -/** Helper function: called when a dirserver gets a complete HTTP GET - * request. Look for a request for a directory or for a rendezvous - * service descriptor. On finding one, write a response into - * conn-\>outbuf. If the request is unrecognized, send a 400. - * Always return 0. */ -static int -directory_handle_command_get(dir_connection_t *conn, const char *headers, - const char *req_body, size_t req_body_len) -{ - size_t dlen; - char *url, *url_mem, *header; - const or_options_t *options = get_options(); - time_t if_modified_since = 0; - int compressed; - size_t url_len; - - /* We ignore the body of a GET request. */ - (void)req_body; - (void)req_body_len; - - log_debug(LD_DIRSERV,"Received GET command."); - - conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; - - if (parse_http_url(headers, &url) < 0) { - write_http_status_line(conn, 400, "Bad request"); - return 0; - } - if ((header = http_get_header(headers, "If-Modified-Since: "))) { - struct tm tm; - if (parse_http_time(header, &tm) == 0) { - if (tor_timegm(&tm, &if_modified_since)<0) - if_modified_since = 0; - } - /* The correct behavior on a malformed If-Modified-Since header is to - * act as if no If-Modified-Since header had been given. */ - tor_free(header); - } - log_debug(LD_DIRSERV,"rewritten url as '%s'.", url); - - url_mem = url; - url_len = strlen(url); - compressed = url_len > 2 && !strcmp(url+url_len-2, ".z"); - if (compressed) { - url[url_len-2] = '\0'; - url_len -= 2; - } - - if (!strcmp(url,"/tor/")) { - const char *frontpage = get_dirportfrontpage(); - - if (frontpage) { - dlen = strlen(frontpage); - /* Let's return a disclaimer page (users shouldn't use V1 anymore, - and caches don't fetch '/', so this is safe). */ - - /* [We don't check for write_bucket_low here, since we want to serve - * this page no matter what.] */ - note_request(url, dlen); - write_http_response_header_impl(conn, dlen, "text/html", "identity", - NULL, DIRPORTFRONTPAGE_CACHE_LIFETIME); - connection_write_to_buf(frontpage, dlen, TO_CONN(conn)); - goto done; - } - /* if no disclaimer file, fall through and continue */ - } - - if (!strcmp(url,"/tor/") || !strcmp(url,"/tor/dir")) { /* v1 dir fetch */ - cached_dir_t *d = dirserv_get_directory(); - - if (!d) { - log_info(LD_DIRSERV,"Client asked for the mirrored directory, but we " - "don't have a good one yet. Sending 503 Dir not available."); - write_http_status_line(conn, 503, "Directory unavailable"); - goto done; - } - if (d->published < if_modified_since) { - write_http_status_line(conn, 304, "Not modified"); - goto done; - } - - dlen = compressed ? d->dir_z_len : d->dir_len; - - if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) { - log_debug(LD_DIRSERV, - "Client asked for the mirrored directory, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - goto done; - } - - note_request(url, dlen); - - log_debug(LD_DIRSERV,"Dumping %sdirectory to client.", - compressed?"compressed ":""); - write_http_response_header(conn, dlen, compressed, - FULL_DIR_CACHE_LIFETIME); - conn->cached_dir = d; - conn->cached_dir_offset = 0; - if (!compressed) - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); - ++d->refcnt; - - /* Prime the connection with some data. */ - conn->dir_spool_src = DIR_SPOOL_CACHED_DIR; - connection_dirserv_flushed_some(conn); - goto done; - } - - if (!strcmp(url,"/tor/running-routers")) { /* running-routers fetch */ - cached_dir_t *d = dirserv_get_runningrouters(); - if (!d) { - write_http_status_line(conn, 503, "Directory unavailable"); - goto done; - } - if (d->published < if_modified_since) { - write_http_status_line(conn, 304, "Not modified"); - goto done; - } - dlen = compressed ? d->dir_z_len : d->dir_len; - - if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) { - log_info(LD_DIRSERV, - "Client asked for running-routers, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - goto done; - } - note_request(url, dlen); - write_http_response_header(conn, dlen, compressed, - RUNNINGROUTERS_CACHE_LIFETIME); - connection_write_to_buf(compressed ? d->dir_z : d->dir, dlen, - TO_CONN(conn)); - goto done; - } - - if (!strcmpstart(url, "/tor/status-vote/current/consensus")) { - /* v3 network status fetch. */ - smartlist_t *dir_fps = smartlist_new(); - const char *request_type = NULL; - long lifetime = NETWORKSTATUS_CACHE_LIFETIME; - - if (1) { - networkstatus_t *v; - time_t now = time(NULL); - const char *want_fps = NULL; - char *flavor = NULL; - int flav = FLAV_NS; - #define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/" - #define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-" - /* figure out the flavor if any, and who we wanted to sign the thing */ - if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { - const char *f, *cp; - f = url + strlen(CONSENSUS_FLAVORED_PREFIX); - cp = strchr(f, '/'); - if (cp) { - want_fps = cp+1; - flavor = tor_strndup(f, cp-f); - } else { - flavor = tor_strdup(f); - } - flav = networkstatus_parse_flavor_name(flavor); - if (flav < 0) - flav = FLAV_NS; - } else { - if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) - want_fps = url+strlen(CONSENSUS_URL_PREFIX); - } - - v = networkstatus_get_latest_consensus_by_flavor(flav); - - if (v && want_fps && - !client_likes_consensus(v, want_fps)) { - write_http_status_line(conn, 404, "Consensus not signed by sufficient " - "number of requested authorities"); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); - tor_free(flavor); - goto done; - } - - { - char *fp = tor_malloc_zero(DIGEST_LEN); - if (flavor) - strlcpy(fp, flavor, DIGEST_LEN); - tor_free(flavor); - smartlist_add(dir_fps, fp); - } - request_type = compressed?"v3.z":"v3"; - lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; - } - - if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */ - write_http_status_line(conn, 503, "Network status object unavailable"); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE); - goto done; - } - - if (!dirserv_remove_old_statuses(dir_fps, if_modified_since)) { - write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - goto done; - } else if (!smartlist_len(dir_fps)) { - write_http_status_line(conn, 304, "Not modified"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); - goto done; - } - - dlen = dirserv_estimate_data_size(dir_fps, 0, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { - log_debug(LD_DIRSERV, - "Client asked for network status lists, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp)); - smartlist_free(dir_fps); - - geoip_note_ns_response(GEOIP_REJECT_BUSY); - goto done; - } - - if (1) { - struct in_addr in; - tor_addr_t addr; - if (tor_inet_aton((TO_CONN(conn))->address, &in)) { - tor_addr_from_ipv4h(&addr, ntohl(in.s_addr)); - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, - &addr, NULL, - time(NULL)); - geoip_note_ns_response(GEOIP_SUCCESS); - /* Note that a request for a network status has started, so that we - * can measure the download time later on. */ - if (conn->dirreq_id) - geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); - else - geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, - DIRREQ_DIRECT); - } - } - - // note_request(request_type,dlen); - (void) request_type; - write_http_response_header(conn, -1, compressed, - smartlist_len(dir_fps) == 1 ? lifetime : 0); - conn->fingerprint_stack = dir_fps; - if (! compressed) - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); - - /* Prime the connection with some data. */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - connection_dirserv_flushed_some(conn); - goto done; - } - - if (!strcmpstart(url,"/tor/status-vote/current/") || - !strcmpstart(url,"/tor/status-vote/next/")) { - /* XXXX If-modified-since is only implemented for the current - * consensus: that's probably fine, since it's the only vote document - * people fetch much. */ - int current; - ssize_t body_len = 0; - ssize_t estimated_len = 0; - smartlist_t *items = smartlist_new(); - smartlist_t *dir_items = smartlist_new(); - int lifetime = 60; /* XXXX023 should actually use vote intervals. */ - url += strlen("/tor/status-vote/"); - current = !strcmpstart(url, "current/"); - url = strchr(url, '/'); - tor_assert(url); - ++url; - if (!strcmp(url, "consensus")) { - const char *item; - tor_assert(!current); /* we handle current consensus specially above, - * since it wants to be spooled. */ - if ((item = dirvote_get_pending_consensus(FLAV_NS))) - smartlist_add(items, (char*)item); - } else if (!current && !strcmp(url, "consensus-signatures")) { - /* XXXX the spec says that we should implement - * current/consensus-signatures too. It doesn't seem to be needed, - * though. */ - const char *item; - if ((item=dirvote_get_pending_detached_signatures())) - smartlist_add(items, (char*)item); - } else if (!strcmp(url, "authority")) { - const cached_dir_t *d; - int flags = DGV_BY_ID | - (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); - if ((d=dirvote_get_vote(NULL, flags))) - smartlist_add(dir_items, (cached_dir_t*)d); - } else { - const cached_dir_t *d; - smartlist_t *fps = smartlist_new(); - int flags; - if (!strcmpstart(url, "d/")) { - url += 2; - flags = DGV_INCLUDE_PENDING | DGV_INCLUDE_PREVIOUS; - } else { - flags = DGV_BY_ID | - (current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING); - } - dir_split_resource_into_fingerprints(url, fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, fp, { - if ((d = dirvote_get_vote(fp, flags))) - smartlist_add(dir_items, (cached_dir_t*)d); - tor_free(fp); - }); - smartlist_free(fps); - } - if (!smartlist_len(dir_items) && !smartlist_len(items)) { - write_http_status_line(conn, 404, "Not found"); - goto vote_done; - } - SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, - body_len += compressed ? d->dir_z_len : d->dir_len); - estimated_len += body_len; - SMARTLIST_FOREACH(items, const char *, item, { - size_t ln = strlen(item); - if (compressed) { - estimated_len += ln/2; - } else { - body_len += ln; estimated_len += ln; - } - }); - - if (global_write_bucket_low(TO_CONN(conn), estimated_len, 2)) { - write_http_status_line(conn, 503, "Directory busy, try again later."); - goto vote_done; - } - write_http_response_header(conn, body_len ? body_len : -1, compressed, - lifetime); - - if (smartlist_len(items)) { - if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); - SMARTLIST_FOREACH(items, const char *, c, - connection_write_to_buf_zlib(c, strlen(c), conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); - } else { - SMARTLIST_FOREACH(items, const char *, c, - connection_write_to_buf(c, strlen(c), TO_CONN(conn))); - } - } else { - SMARTLIST_FOREACH(dir_items, cached_dir_t *, d, - connection_write_to_buf(compressed ? d->dir_z : d->dir, - compressed ? d->dir_z_len : d->dir_len, - TO_CONN(conn))); - } - vote_done: - smartlist_free(items); - smartlist_free(dir_items); - goto done; - } - - if (!strcmpstart(url, "/tor/micro/d/")) { - smartlist_t *fps = smartlist_new(); - - dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"), - fps, NULL, - DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); - - if (!dirserv_have_any_microdesc(fps)) { - write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); - goto done; - } - dlen = dirserv_estimate_microdesc_size(fps, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { - log_info(LD_DIRSERV, - "Client asked for server descriptors, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); - goto done; - } - - write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME); - conn->dir_spool_src = DIR_SPOOL_MICRODESC; - conn->fingerprint_stack = fps; - - if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); - - connection_dirserv_flushed_some(conn); - goto done; - } - - if (!strcmpstart(url,"/tor/server/") || - (!options->BridgeAuthoritativeDir && - !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { - int res; - const char *msg; - const char *request_type = NULL; - int cache_lifetime = 0; - int is_extra = !strcmpstart(url,"/tor/extra/"); - url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/"); - conn->fingerprint_stack = smartlist_new(); - res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url, - &msg, - !connection_dir_is_encrypted(conn), - is_extra); - - if (!strcmpstart(url, "fp/")) { - request_type = compressed?"/tor/server/fp.z":"/tor/server/fp"; - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "authority")) { - request_type = compressed?"/tor/server/authority.z": - "/tor/server/authority"; - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "all")) { - request_type = compressed?"/tor/server/all.z":"/tor/server/all"; - cache_lifetime = FULL_DIR_CACHE_LIFETIME; - } else if (!strcmpstart(url, "d/")) { - request_type = compressed?"/tor/server/d.z":"/tor/server/d"; - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; - } else { - request_type = "/tor/server/?"; - } - (void) request_type; /* usable for note_request. */ - if (!strcmpstart(url, "d/")) - conn->dir_spool_src = - is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST; - else - conn->dir_spool_src = - is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP; - - if (!dirserv_have_any_serverdesc(conn->fingerprint_stack, - conn->dir_spool_src)) { - res = -1; - msg = "Not found"; - } - - if (res < 0) - write_http_status_line(conn, 404, msg); - else { - dlen = dirserv_estimate_data_size(conn->fingerprint_stack, - 1, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { - log_info(LD_DIRSERV, - "Client asked for server descriptors, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - conn->dir_spool_src = DIR_SPOOL_NONE; - goto done; - } - write_http_response_header(conn, -1, compressed, cache_lifetime); - if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); - /* Prime the connection with some data. */ - connection_dirserv_flushed_some(conn); - } - goto done; - } - - if (!strcmpstart(url,"/tor/keys/")) { - smartlist_t *certs = smartlist_new(); - ssize_t len = -1; - if (!strcmp(url, "/tor/keys/all")) { - authority_cert_get_all(certs); - } else if (!strcmp(url, "/tor/keys/authority")) { - authority_cert_t *cert = get_my_v3_authority_cert(); - if (cert) - smartlist_add(certs, cert); - } else if (!strcmpstart(url, "/tor/keys/fp/")) { - smartlist_t *fps = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/keys/fp/"), - fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, d, { - authority_cert_t *c = authority_cert_get_newest_by_id(d); - if (c) smartlist_add(certs, c); - tor_free(d); - }); - smartlist_free(fps); - } else if (!strcmpstart(url, "/tor/keys/sk/")) { - smartlist_t *fps = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/keys/sk/"), - fps, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(fps, char *, d, { - authority_cert_t *c = authority_cert_get_by_sk_digest(d); - if (c) smartlist_add(certs, c); - tor_free(d); - }); - smartlist_free(fps); - } else if (!strcmpstart(url, "/tor/keys/fp-sk/")) { - smartlist_t *fp_sks = smartlist_new(); - dir_split_resource_into_fingerprint_pairs(url+strlen("/tor/keys/fp-sk/"), - fp_sks); - SMARTLIST_FOREACH(fp_sks, fp_pair_t *, pair, { - authority_cert_t *c = authority_cert_get_by_digests(pair->first, - pair->second); - if (c) smartlist_add(certs, c); - tor_free(pair); - }); - smartlist_free(fp_sks); - } else { - write_http_status_line(conn, 400, "Bad request"); - goto keys_done; - } - if (!smartlist_len(certs)) { - write_http_status_line(conn, 404, "Not found"); - goto keys_done; - } - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - if (c->cache_info.published_on < if_modified_since) - SMARTLIST_DEL_CURRENT(certs, c)); - if (!smartlist_len(certs)) { - write_http_status_line(conn, 304, "Not modified"); - goto keys_done; - } - len = 0; - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - len += c->cache_info.signed_descriptor_len); - - if (global_write_bucket_low(TO_CONN(conn), compressed?len/2:len, 2)) { - write_http_status_line(conn, 503, "Directory busy, try again later."); - goto keys_done; - } - - write_http_response_header(conn, compressed?-1:len, compressed, 60*60); - if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); - } else { - SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_write_to_buf(c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - TO_CONN(conn))); - } - keys_done: - smartlist_free(certs); - goto done; - } - - if (options->HidServDirectoryV2 && - connection_dir_is_encrypted(conn) && - !strcmpstart(url,"/tor/rendezvous2/")) { - /* Handle v2 rendezvous descriptor fetch request. */ - const char *descp; - const char *query = url + strlen("/tor/rendezvous2/"); - if (strlen(query) == REND_DESC_ID_V2_LEN_BASE32) { - log_info(LD_REND, "Got a v2 rendezvous descriptor request for ID '%s'", - safe_str(query)); - switch (rend_cache_lookup_v2_desc_as_dir(query, &descp)) { - case 1: /* valid */ - write_http_response_header(conn, strlen(descp), 0, 0); - connection_write_to_buf(descp, strlen(descp), TO_CONN(conn)); - break; - case 0: /* well-formed but not present */ - write_http_status_line(conn, 404, "Not found"); - break; - case -1: /* not well-formed */ - write_http_status_line(conn, 400, "Bad request"); - break; - } - } else { /* not well-formed */ - write_http_status_line(conn, 400, "Bad request"); - } - goto done; - } - - if (options->HSAuthoritativeDir && !strcmpstart(url,"/tor/rendezvous/")) { - /* rendezvous descriptor fetch */ - const char *descp; - size_t desc_len; - const char *query = url+strlen("/tor/rendezvous/"); - - log_info(LD_REND, "Handling rendezvous descriptor get"); - switch (rend_cache_lookup_desc(query, 0, &descp, &desc_len)) { - case 1: /* valid */ - write_http_response_header_impl(conn, desc_len, - "application/octet-stream", - NULL, NULL, 0); - note_request("/tor/rendezvous?/", desc_len); - /* need to send descp separately, because it may include NULs */ - connection_write_to_buf(descp, desc_len, TO_CONN(conn)); - break; - case 0: /* well-formed but not present */ - write_http_status_line(conn, 404, "Not found"); - break; - case -1: /* not well-formed */ - write_http_status_line(conn, 400, "Bad request"); - break; - } - goto done; - } - - if (options->BridgeAuthoritativeDir && - options->BridgePassword_AuthDigest_ && - connection_dir_is_encrypted(conn) && - !strcmp(url,"/tor/networkstatus-bridges")) { - char *status; - char digest[DIGEST256_LEN]; - - header = http_get_header(headers, "Authorization: Basic "); - if (header) - crypto_digest256(digest, header, strlen(header), DIGEST_SHA256); - - /* now make sure the password is there and right */ - if (!header || - tor_memneq(digest, - options->BridgePassword_AuthDigest_, DIGEST256_LEN)) { - write_http_status_line(conn, 404, "Not found"); - tor_free(header); - goto done; - } - tor_free(header); - - /* all happy now. send an answer. */ - status = networkstatus_getinfo_by_purpose("bridge", time(NULL)); - dlen = strlen(status); - write_http_response_header(conn, dlen, 0, 0); - connection_write_to_buf(status, dlen, TO_CONN(conn)); - tor_free(status); - goto done; - } - - if (!strcmpstart(url,"/tor/bytes.txt")) { - char *bytes = directory_dump_request_log(); - size_t len = strlen(bytes); - write_http_response_header(conn, len, 0, 0); - connection_write_to_buf(bytes, len, TO_CONN(conn)); - tor_free(bytes); - goto done; - } - - if (!strcmp(url,"/tor/robots.txt")) { /* /robots.txt will have been - rewritten to /tor/robots.txt */ - char robots[] = "User-agent: *\r\nDisallow: /\r\n"; - size_t len = strlen(robots); - write_http_response_header(conn, len, 0, ROBOTS_CACHE_LIFETIME); - connection_write_to_buf(robots, len, TO_CONN(conn)); - goto done; - } - - if (!strcmp(url,"/tor/dbg-stability.txt")) { - const char *stability; - size_t len; - if (options->BridgeAuthoritativeDir || - ! authdir_mode_tests_reachability(options) || - ! (stability = rep_hist_get_router_stability_doc(time(NULL)))) { - write_http_status_line(conn, 404, "Not found."); - goto done; - } - - len = strlen(stability); - write_http_response_header(conn, len, 0, 0); - connection_write_to_buf(stability, len, TO_CONN(conn)); - goto done; - } - -#if defined(EXPORTMALLINFO) && defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) -#define ADD_MALLINFO_LINE(x) do { \ - smartlist_add_asprintf(lines, "%s %d\n", #x, mi.x); \ - }while(0); - - if (!strcmp(url,"/tor/mallinfo.txt") && - (tor_addr_eq_ipv4h(&conn->base_.addr, 0x7f000001ul))) { - char *result; - size_t len; - struct mallinfo mi; - smartlist_t *lines; - - memset(&mi, 0, sizeof(mi)); - mi = mallinfo(); - lines = smartlist_new(); - - ADD_MALLINFO_LINE(arena) - ADD_MALLINFO_LINE(ordblks) - ADD_MALLINFO_LINE(smblks) - ADD_MALLINFO_LINE(hblks) - ADD_MALLINFO_LINE(hblkhd) - ADD_MALLINFO_LINE(usmblks) - ADD_MALLINFO_LINE(fsmblks) - ADD_MALLINFO_LINE(uordblks) - ADD_MALLINFO_LINE(fordblks) - ADD_MALLINFO_LINE(keepcost) - - result = smartlist_join_strings(lines, "", 0, NULL); - SMARTLIST_FOREACH(lines, char *, cp, tor_free(cp)); - smartlist_free(lines); - - len = strlen(result); - write_http_response_header(conn, len, 0, 0); - connection_write_to_buf(result, len, TO_CONN(conn)); - tor_free(result); - goto done; - } -#endif - - /* we didn't recognize the url */ - write_http_status_line(conn, 404, "Not found"); - - done: - tor_free(url_mem); - return 0; -} - -/** Helper function: called when a dirserver gets a complete HTTP POST - * request. Look for an uploaded server descriptor or rendezvous - * service descriptor. On finding one, process it and write a - * response into conn-\>outbuf. If the request is unrecognized, send a - * 400. Always return 0. */ -static int -directory_handle_command_post(dir_connection_t *conn, const char *headers, - const char *body, size_t body_len) -{ - char *url = NULL; - const or_options_t *options = get_options(); - - log_debug(LD_DIRSERV,"Received POST command."); - - conn->base_.state = DIR_CONN_STATE_SERVER_WRITING; - - if (parse_http_url(headers, &url) < 0) { - write_http_status_line(conn, 400, "Bad request"); - return 0; - } - log_debug(LD_DIRSERV,"rewritten url as '%s'.", url); - - /* Handle v2 rendezvous service publish request. */ - if (options->HidServDirectoryV2 && - connection_dir_is_encrypted(conn) && - !strcmpstart(url,"/tor/rendezvous2/publish")) { - switch (rend_cache_store_v2_desc_as_dir(body)) { - case -2: - log_info(LD_REND, "Rejected v2 rend descriptor (length %d) from %s " - "since we're not currently a hidden service directory.", - (int)body_len, conn->base_.address); - write_http_status_line(conn, 503, "Currently not acting as v2 " - "hidden service directory"); - break; - case -1: - log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.", - (int)body_len, conn->base_.address); - write_http_status_line(conn, 400, - "Invalid v2 service descriptor rejected"); - break; - default: - write_http_status_line(conn, 200, "Service descriptor (v2) stored"); - log_info(LD_REND, "Handled v2 rendezvous descriptor post: accepted"); - } - goto done; - } - - if (!authdir_mode(options)) { - /* we just provide cached directories; we don't want to - * receive anything. */ - write_http_status_line(conn, 400, "Nonauthoritative directory does not " - "accept posted server descriptors"); - goto done; - } - - if (authdir_mode_handles_descs(options, -1) && - !strcmp(url,"/tor/")) { /* server descriptor post */ - const char *msg = "[None]"; - uint8_t purpose = authdir_mode_bridge(options) ? - ROUTER_PURPOSE_BRIDGE : ROUTER_PURPOSE_GENERAL; - was_router_added_t r = dirserv_add_multiple_descriptors(body, purpose, - conn->base_.address, &msg); - tor_assert(msg); - if (WRA_WAS_ADDED(r)) - dirserv_get_directory(); /* rebuild and write to disk */ - - if (r == ROUTER_ADDED_NOTIFY_GENERATOR) { - /* Accepted with a message. */ - log_info(LD_DIRSERV, - "Problematic router descriptor or extra-info from %s " - "(\"%s\").", - conn->base_.address, msg); - write_http_status_line(conn, 400, msg); - } else if (r == ROUTER_ADDED_SUCCESSFULLY) { - write_http_status_line(conn, 200, msg); - } else if (WRA_WAS_OUTDATED(r)) { - write_http_response_header_impl(conn, -1, NULL, NULL, - "X-Descriptor-Not-New: Yes\r\n", -1); - } else { - log_info(LD_DIRSERV, - "Rejected router descriptor or extra-info from %s " - "(\"%s\").", - conn->base_.address, msg); - write_http_status_line(conn, 400, msg); - } - goto done; - } - - if (options->HSAuthoritativeDir && - !strcmpstart(url,"/tor/rendezvous/publish")) { - /* rendezvous descriptor post */ - log_info(LD_REND, "Handling rendezvous descriptor post."); - if (rend_cache_store(body, body_len, 1, NULL) < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_DIRSERV, - "Rejected rend descriptor (length %d) from %s.", - (int)body_len, conn->base_.address); - write_http_status_line(conn, 400, - "Invalid v0 service descriptor rejected"); - } else { - write_http_status_line(conn, 200, "Service descriptor (v0) stored"); - } - goto done; - } - - if (authdir_mode_v3(options) && - !strcmp(url,"/tor/post/vote")) { /* v3 networkstatus vote */ - const char *msg = "OK"; - int status; - if (dirvote_add_vote(body, &msg, &status)) { - write_http_status_line(conn, status, "Vote stored"); - } else { - tor_assert(msg); - log_warn(LD_DIRSERV, "Rejected vote from %s (\"%s\").", - conn->base_.address, msg); - write_http_status_line(conn, status, msg); - } - goto done; - } - - if (authdir_mode_v3(options) && - !strcmp(url,"/tor/post/consensus-signature")) { /* sigs on consensus. */ - const char *msg = NULL; - if (dirvote_add_signatures(body, conn->base_.address, &msg)>=0) { - write_http_status_line(conn, 200, msg?msg:"Signatures stored"); - } else { - log_warn(LD_DIR, "Unable to store signatures posted by %s: %s", - conn->base_.address, msg?msg:"???"); - write_http_status_line(conn, 400, msg?msg:"Unable to store signatures"); - } - goto done; - } - - /* we didn't recognize the url */ - write_http_status_line(conn, 404, "Not found"); - - done: - tor_free(url); - return 0; -} - -/** Called when a dirserver receives data on a directory connection; - * looks for an HTTP request. If the request is complete, remove it - * from the inbuf, try to process it; otherwise, leave it on the - * buffer. Return a 0 on success, or -1 on error. - */ -static int -directory_handle_command(dir_connection_t *conn) -{ - char *headers=NULL, *body=NULL; - size_t body_len=0; - int r; - - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - switch (connection_fetch_from_buf_http(TO_CONN(conn), - &headers, MAX_HEADERS_SIZE, - &body, &body_len, MAX_DIR_UL_SIZE, 0)) { - case -1: /* overflow */ - log_warn(LD_DIRSERV, - "Request too large from address '%s' to DirPort. Closing.", - safe_str(conn->base_.address)); - return -1; - case 0: - log_debug(LD_DIRSERV,"command not all here yet."); - return 0; - /* case 1, fall through */ - } - - http_set_address_origin(headers, TO_CONN(conn)); - //log_debug(LD_DIRSERV,"headers %s, body %s.", headers, body); - - if (!strncasecmp(headers,"GET",3)) - r = directory_handle_command_get(conn, headers, body, body_len); - else if (!strncasecmp(headers,"POST",4)) - r = directory_handle_command_post(conn, headers, body, body_len); - else { - log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, - "Got headers %s with unknown command. Closing.", - escaped(headers)); - r = -1; - } - - tor_free(headers); tor_free(body); - return r; -} - -/** Write handler for directory connections; called when all data has - * been flushed. Close the connection or wait for a response as - * appropriate. - */ -int -connection_dir_finished_flushing(dir_connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - - /* Note that we have finished writing the directory response. For direct - * connections this means we're done, for tunneled connections its only - * an intermediate step. */ - if (conn->dirreq_id) - geoip_change_dirreq_state(conn->dirreq_id, DIRREQ_TUNNELED, - DIRREQ_FLUSHING_DIR_CONN_FINISHED); - else - geoip_change_dirreq_state(TO_CONN(conn)->global_identifier, - DIRREQ_DIRECT, - DIRREQ_FLUSHING_DIR_CONN_FINISHED); - switch (conn->base_.state) { - case DIR_CONN_STATE_CONNECTING: - case DIR_CONN_STATE_CLIENT_SENDING: - log_debug(LD_DIR,"client finished sending command."); - conn->base_.state = DIR_CONN_STATE_CLIENT_READING; - return 0; - case DIR_CONN_STATE_SERVER_WRITING: - if (conn->dir_spool_src != DIR_SPOOL_NONE) { -#ifdef USE_BUFFEREVENTS - /* This can happen with paired bufferevents, since a paired connection - * can flush immediately when you write to it, making the subsequent - * check in connection_handle_write_cb() decide that the connection - * is flushed. */ - log_debug(LD_DIRSERV, "Emptied a dirserv buffer, but still spooling."); -#else - log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!"); - connection_mark_for_close(TO_CONN(conn)); -#endif - } else { - log_debug(LD_DIRSERV, "Finished writing server response. Closing."); - connection_mark_for_close(TO_CONN(conn)); - } - return 0; - default: - log_warn(LD_BUG,"called in unexpected state %d.", - conn->base_.state); - tor_fragile_assert(); - return -1; - } - return 0; -} - -/** Connected handler for directory connections: begin sending data to the - * server */ -int -connection_dir_finished_connecting(dir_connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->base_.type == CONN_TYPE_DIR); - tor_assert(conn->base_.state == DIR_CONN_STATE_CONNECTING); - - log_debug(LD_HTTP,"Dir connection to router %s:%u established.", - conn->base_.address,conn->base_.port); - - conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; /* start flushing conn */ - return 0; -} - -/** Decide which download schedule we want to use based on descriptor type - * in dls and whether we are acting as directory server, and - * then return a list of int pointers defining download delays in seconds. - * Helper function for download_status_increment_failure() and - * download_status_reset(). */ -static const smartlist_t * -find_dl_schedule_and_len(download_status_t *dls, int server) -{ - switch (dls->schedule) { - case DL_SCHED_GENERIC: - if (server) - return get_options()->TestingServerDownloadSchedule; - else - return get_options()->TestingClientDownloadSchedule; - case DL_SCHED_CONSENSUS: - if (server) - return get_options()->TestingServerConsensusDownloadSchedule; - else - return get_options()->TestingClientConsensusDownloadSchedule; - case DL_SCHED_BRIDGE: - return get_options()->TestingBridgeDownloadSchedule; - default: - tor_assert(0); - } -} - -/** Called when an attempt to download dls has failed with HTTP status - * status_code. Increment the failure count (if the code indicates a - * real failure) and set dls-\>next_attempt_at to an appropriate time - * in the future. */ -time_t -download_status_increment_failure(download_status_t *dls, int status_code, - const char *item, int server, time_t now) -{ - const smartlist_t *schedule; - int increment; - tor_assert(dls); - if (status_code != 503 || server) { - if (dls->n_download_failures < IMPOSSIBLE_TO_DOWNLOAD-1) - ++dls->n_download_failures; - } - - schedule = find_dl_schedule_and_len(dls, server); - - if (dls->n_download_failures < smartlist_len(schedule)) - increment = *(int *)smartlist_get(schedule, dls->n_download_failures); - else if (dls->n_download_failures == IMPOSSIBLE_TO_DOWNLOAD) - increment = INT_MAX; - else - increment = *(int *)smartlist_get(schedule, smartlist_len(schedule) - 1); - - if (increment < INT_MAX) - dls->next_attempt_at = now+increment; - else - dls->next_attempt_at = TIME_MAX; - - if (item) { - if (increment == 0) - log_debug(LD_DIR, "%s failed %d time(s); I'll try again immediately.", - item, (int)dls->n_download_failures); - else if (dls->next_attempt_at < TIME_MAX) - log_debug(LD_DIR, "%s failed %d time(s); I'll try again in %d seconds.", - item, (int)dls->n_download_failures, - (int)(dls->next_attempt_at-now)); - else - log_debug(LD_DIR, "%s failed %d time(s); Giving up for a while.", - item, (int)dls->n_download_failures); - } - return dls->next_attempt_at; -} - -/** Reset dls so that it will be considered downloadable - * immediately, and/or to show that we don't need it anymore. - * - * (We find the zeroth element of the download schedule, and set - * next_attempt_at to be the appropriate offset from 'now'. In most - * cases this means setting it to 'now', so the item will be immediately - * downloadable; in the case of bridge descriptors, the zeroth element - * is an hour from now.) */ -void -download_status_reset(download_status_t *dls) -{ - const smartlist_t *schedule = find_dl_schedule_and_len( - dls, get_options()->DirPort_set); - - dls->n_download_failures = 0; - dls->next_attempt_at = time(NULL) + *(int *)smartlist_get(schedule, 0); -} - -/** Return the number of failures on dls since the last success (if - * any). */ -int -download_status_get_n_failures(const download_status_t *dls) -{ - return dls->n_download_failures; -} - -/** Called when one or more routerdesc (or extrainfo, if was_extrainfo) - * fetches have failed (with uppercase fingerprints listed in failed, - * either as descriptor digests or as identity digests based on - * was_descriptor_digests). - */ -static void -dir_routerdesc_download_failed(smartlist_t *failed, int status_code, - int router_purpose, - int was_extrainfo, int was_descriptor_digests) -{ - char digest[DIGEST_LEN]; - time_t now = time(NULL); - int server = directory_fetches_from_authorities(get_options()); - if (!was_descriptor_digests) { - if (router_purpose == ROUTER_PURPOSE_BRIDGE) { - tor_assert(!was_extrainfo); - connection_dir_retry_bridges(failed); - } - return; /* FFFF should implement for other-than-router-purpose someday */ - } - SMARTLIST_FOREACH_BEGIN(failed, const char *, cp) { - download_status_t *dls = NULL; - if (base16_decode(digest, DIGEST_LEN, cp, strlen(cp)) < 0) { - log_warn(LD_BUG, "Malformed fingerprint in list: %s", escaped(cp)); - continue; - } - if (was_extrainfo) { - signed_descriptor_t *sd = - router_get_by_extrainfo_digest(digest); - if (sd) - dls = &sd->ei_dl_status; - } else { - dls = router_get_dl_status_by_descriptor_digest(digest); - } - if (!dls || dls->n_download_failures >= - get_options()->TestingDescriptorMaxDownloadTries) - continue; - download_status_increment_failure(dls, status_code, cp, server, now); - } SMARTLIST_FOREACH_END(cp); - - /* No need to relaunch descriptor downloads here: we already do it - * every 10 or 60 seconds (FOO_DESCRIPTOR_RETRY_INTERVAL) in onion_main.c. */ -} - -/** Called when a connection to download microdescriptors has failed in whole - * or in part. failed is a list of every microdesc digest we didn't - * get. status_code is the http status code we received. Reschedule the - * microdesc downloads as appropriate. */ -static void -dir_microdesc_download_failed(smartlist_t *failed, - int status_code) -{ - networkstatus_t *consensus - = networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); - routerstatus_t *rs; - download_status_t *dls; - time_t now = time(NULL); - int server = directory_fetches_from_authorities(get_options()); - - if (! consensus) - return; - SMARTLIST_FOREACH_BEGIN(failed, const char *, d) { - rs = router_get_mutable_consensus_status_by_descriptor_digest(consensus,d); - if (!rs) - continue; - dls = &rs->dl_status; - if (dls->n_download_failures >= - get_options()->TestingMicrodescMaxDownloadTries) - continue; - { - char buf[BASE64_DIGEST256_LEN+1]; - digest256_to_base64(buf, d); - download_status_increment_failure(dls, status_code, buf, - server, now); - } - } SMARTLIST_FOREACH_END(d); -} - -/** Helper. Compare two fp_pair_t objects, and return negative, 0, or - * positive as appropriate. */ -static int -compare_pairs_(const void **a, const void **b) -{ - const fp_pair_t *fp1 = *a, *fp2 = *b; - int r; - if ((r = fast_memcmp(fp1->first, fp2->first, DIGEST_LEN))) - return r; - else - return fast_memcmp(fp1->second, fp2->second, DIGEST_LEN); -} - -/** Divide a string res of the form FP1-FP2+FP3-FP4...[.z], where each - * FP is a hex-encoded fingerprint, into a sequence of distinct sorted - * fp_pair_t. Skip malformed pairs. On success, return 0 and add those - * fp_pair_t into pairs_out. On failure, return -1. */ -int -dir_split_resource_into_fingerprint_pairs(const char *res, - smartlist_t *pairs_out) -{ - smartlist_t *pairs_tmp = smartlist_new(); - smartlist_t *pairs_result = smartlist_new(); - - smartlist_split_string(pairs_tmp, res, "+", 0, 0); - if (smartlist_len(pairs_tmp)) { - char *last = smartlist_get(pairs_tmp,smartlist_len(pairs_tmp)-1); - size_t last_len = strlen(last); - if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { - last[last_len-2] = '\0'; - } - } - SMARTLIST_FOREACH_BEGIN(pairs_tmp, char *, cp) { - if (strlen(cp) != HEX_DIGEST_LEN*2+1) { - log_info(LD_DIR, - "Skipping digest pair %s with non-standard length.", escaped(cp)); - } else if (cp[HEX_DIGEST_LEN] != '-') { - log_info(LD_DIR, - "Skipping digest pair %s with missing dash.", escaped(cp)); - } else { - fp_pair_t pair; - if (base16_decode(pair.first, DIGEST_LEN, cp, HEX_DIGEST_LEN)<0 || - base16_decode(pair.second, - DIGEST_LEN, cp+HEX_DIGEST_LEN+1, HEX_DIGEST_LEN)<0) { - log_info(LD_DIR, "Skipping non-decodable digest pair %s", escaped(cp)); - } else { - smartlist_add(pairs_result, tor_memdup(&pair, sizeof(pair))); - } - } - tor_free(cp); - } SMARTLIST_FOREACH_END(cp); - smartlist_free(pairs_tmp); - - /* Uniq-and-sort */ - smartlist_sort(pairs_result, compare_pairs_); - smartlist_uniq(pairs_result, compare_pairs_, tor_free_); - - smartlist_add_all(pairs_out, pairs_result); - smartlist_free(pairs_result); - return 0; -} - -/** Given a directory resource request, containing zero - * or more strings separated by plus signs, followed optionally by ".z", store - * the strings, in order, into fp_out. If compressed_out is - * non-NULL, set it to 1 if the resource ends in ".z", else set it to 0. - * - * If (flags & DSR_HEX), then delete all elements that aren't hex digests, and - * decode the rest. If (flags & DSR_BASE64), then use "-" rather than "+" as - * a separator, delete all the elements that aren't base64-encoded digests, - * and decode the rest. If (flags & DSR_DIGEST256), these digests should be - * 256 bits long; else they should be 160. - * - * If (flags & DSR_SORT_UNIQ), then sort the list and remove all duplicates. - */ -int -dir_split_resource_into_fingerprints(const char *resource, - smartlist_t *fp_out, int *compressed_out, - int flags) -{ - const int decode_hex = flags & DSR_HEX; - const int decode_base64 = flags & DSR_BASE64; - const int digests_are_256 = flags & DSR_DIGEST256; - const int sort_uniq = flags & DSR_SORT_UNIQ; - - const int digest_len = digests_are_256 ? DIGEST256_LEN : DIGEST_LEN; - const int hex_digest_len = digests_are_256 ? - HEX_DIGEST256_LEN : HEX_DIGEST_LEN; - const int base64_digest_len = digests_are_256 ? - BASE64_DIGEST256_LEN : BASE64_DIGEST_LEN; - smartlist_t *fp_tmp = smartlist_new(); - - tor_assert(!(decode_hex && decode_base64)); - tor_assert(fp_out); - - smartlist_split_string(fp_tmp, resource, decode_base64?"-":"+", 0, 0); - if (compressed_out) - *compressed_out = 0; - if (smartlist_len(fp_tmp)) { - char *last = smartlist_get(fp_tmp,smartlist_len(fp_tmp)-1); - size_t last_len = strlen(last); - if (last_len > 2 && !strcmp(last+last_len-2, ".z")) { - last[last_len-2] = '\0'; - if (compressed_out) - *compressed_out = 1; - } - } - if (decode_hex || decode_base64) { - const size_t encoded_len = decode_hex ? hex_digest_len : base64_digest_len; - int i; - char *cp, *d = NULL; - for (i = 0; i < smartlist_len(fp_tmp); ++i) { - cp = smartlist_get(fp_tmp, i); - if (strlen(cp) != encoded_len) { - log_info(LD_DIR, - "Skipping digest %s with non-standard length.", escaped(cp)); - smartlist_del_keeporder(fp_tmp, i--); - goto again; - } - d = tor_malloc_zero(digest_len); - if (decode_hex ? - (base16_decode(d, digest_len, cp, hex_digest_len)<0) : - (base64_decode(d, digest_len, cp, base64_digest_len)<0)) { - log_info(LD_DIR, "Skipping non-decodable digest %s", escaped(cp)); - smartlist_del_keeporder(fp_tmp, i--); - goto again; - } - smartlist_set(fp_tmp, i, d); - d = NULL; - again: - tor_free(cp); - tor_free(d); - } - } - if (sort_uniq) { - if (decode_hex || decode_base64) { - if (digests_are_256) { - smartlist_sort_digests256(fp_tmp); - smartlist_uniq_digests256(fp_tmp); - } else { - smartlist_sort_digests(fp_tmp); - smartlist_uniq_digests(fp_tmp); - } - } else { - smartlist_sort_strings(fp_tmp); - smartlist_uniq_strings(fp_tmp); - } - } - smartlist_add_all(fp_out, fp_tmp); - smartlist_free(fp_tmp); - return 0; -} - diff --git a/src/tor/directory.h b/src/tor/directory.h deleted file mode 100644 index 0453160f7..000000000 --- a/src/tor/directory.h +++ /dev/null @@ -1,127 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file directory.h - * \brief Header file for directory.c. - **/ - -#ifndef TOR_DIRECTORY_H -#define TOR_DIRECTORY_H - -int directories_have_accepted_server_descriptor(void); -void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, - dirinfo_type_t type, const char *payload, - size_t payload_len, size_t extrainfo_len); -void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, - int pds_flags); -void directory_get_from_all_authorities(uint8_t dir_purpose, - uint8_t router_purpose, - const char *resource); - -/** Enumeration of ways to connect to a directory server */ -typedef enum { - /** Default: connect over a one-hop Tor circuit but fall back to direct - * connection */ - DIRIND_ONEHOP=0, - /** Connect over a multi-hop anonymizing Tor circuit */ - DIRIND_ANONYMOUS=1, - /** Conncet to the DirPort directly */ - DIRIND_DIRECT_CONN, - /** Connect over a multi-hop anonymizing Tor circuit to our dirport */ - DIRIND_ANON_DIRPORT, -} dir_indirection_t; - -void directory_initiate_command_routerstatus(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since); -void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query); - -int parse_http_response(const char *headers, int *code, time_t *date, - compress_method_t *compression, char **response); - -int connection_dir_is_encrypted(dir_connection_t *conn); -int connection_dir_reached_eof(dir_connection_t *conn); -int connection_dir_process_inbuf(dir_connection_t *conn); -int connection_dir_finished_flushing(dir_connection_t *conn); -int connection_dir_finished_connecting(dir_connection_t *conn); -void connection_dir_about_to_close(dir_connection_t *dir_conn); -void directory_initiate_command(const char *address, const tor_addr_t *addr, - uint16_t or_port, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); - -#define DSR_HEX (1<<0) -#define DSR_BASE64 (1<<1) -#define DSR_DIGEST256 (1<<2) -#define DSR_SORT_UNIQ (1<<3) -int dir_split_resource_into_fingerprints(const char *resource, - smartlist_t *fp_out, int *compressed_out, - int flags); - -int dir_split_resource_into_fingerprint_pairs(const char *res, - smartlist_t *pairs_out); -char *directory_dump_request_log(void); -void note_request(const char *key, size_t bytes); -int router_supports_extrainfo(const char *identity_digest, int is_authority); - -time_t download_status_increment_failure(download_status_t *dls, - int status_code, const char *item, - int server, time_t now); -/** Increment the failure count of the download_status_t dls, with - * the optional status code sc. */ -#define download_status_failed(dls, sc) \ - download_status_increment_failure((dls), (sc), NULL, \ - get_options()->DirPort_set, time(NULL)) - -void download_status_reset(download_status_t *dls); -static int download_status_is_ready(download_status_t *dls, time_t now, - int max_failures); -/** Return true iff, as of now, the resource tracked by dls is - * ready to get its download reattempted. */ -static INLINE int -download_status_is_ready(download_status_t *dls, time_t now, - int max_failures) -{ - return (dls->n_download_failures <= max_failures - && dls->next_attempt_at <= now); -} - -static void download_status_mark_impossible(download_status_t *dl); -/** Mark dl as never downloadable. */ -static INLINE void -download_status_mark_impossible(download_status_t *dl) -{ - dl->n_download_failures = IMPOSSIBLE_TO_DOWNLOAD; -} - -int download_status_get_n_failures(const download_status_t *dls); - -#ifdef TOR_UNIT_TESTS -/* Used only by directory.c and test_dir.c */ -STATIC int parse_http_url(const char *headers, char **url); -#endif - -#endif - diff --git a/src/tor/dirserv.c b/src/tor/dirserv.c deleted file mode 100644 index b156282f5..000000000 --- a/src/tor/dirserv.c +++ /dev/null @@ -1,3780 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define DIRSERV_PRIVATE -#include "or.h" -#include "buffers.h" -#include "config.h" -#include "confparse.h" -#include "channel.h" -#include "channeltls.h" -#include "command.h" -#include "connection.h" -#include "connection_or.h" -#include "control.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "hibernate.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" - -/** - * \file dirserv.c - * \brief Directory server core implementation. Manages directory - * contents and generates directories. - */ - -/** How far in the future do we allow a router to get? (seconds) */ -#define ROUTER_ALLOW_SKEW (60*60*12) -/** How many seconds do we wait before regenerating the directory? */ -#define DIR_REGEN_SLACK_TIME 30 -/** If we're a cache, keep this many networkstatuses around from non-trusted - * directory authorities. */ -#define MAX_UNTRUSTED_NETWORKSTATUSES 16 - -/** If a v1 directory is older than this, discard it. */ -#define MAX_V1_DIRECTORY_AGE (30*24*60*60) -/** If a v1 running-routers is older than this, discard it. */ -#define MAX_V1_RR_AGE (7*24*60*60) - -extern time_t time_of_process_start; /* from onion_main.c */ - -extern long stats_n_seconds_working; /* from onion_main.c */ - -/** Do we need to regenerate the v1 directory when someone asks for it? */ -static time_t the_directory_is_dirty = 1; -/** Do we need to regenerate the v1 runningrouters document when somebody - * asks for it? */ -static time_t runningrouters_is_dirty = 1; - -/** Most recently generated encoded signed v1 directory. (v1 auth dirservers - * only.) */ -static cached_dir_t *the_directory = NULL; - -/** For authoritative directories: the current (v1) network status. */ -static cached_dir_t the_runningrouters; - -/** Total number of routers with measured bandwidth; this is set by - * dirserv_count_measured_bws() before the loop in - * dirserv_generate_networkstatus_vote_obj() and checked by - * dirserv_get_credible_bandwidth() and - * dirserv_compute_performance_thresholds() */ -static int routers_with_measured_bw = 0; - -static void directory_remove_invalid(void); -static cached_dir_t *dirserv_regenerate_directory(void); -static char *format_versions_list(config_line_t *ln); -struct authdir_config_t; -static int add_fingerprint_to_dir(const char *nickname, const char *fp, - struct authdir_config_t *list); -static uint32_t -dirserv_get_status_impl(const char *fp, const char *nickname, - const char *address, - uint32_t addr, uint16_t or_port, - const char *platform, const char *contact, - const char **msg, int should_log); -static void clear_cached_dir(cached_dir_t *d); -static const signed_descriptor_t *get_signed_descriptor_by_fp( - const char *fp, - int extrainfo, - time_t publish_cutoff); -static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, - const char **msg); -static uint32_t dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri); -static uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri); - -/************** Fingerprint handling code ************/ - -#define FP_NAMED 1 /**< Listed in fingerprint file. */ -#define FP_INVALID 2 /**< Believed invalid. */ -#define FP_REJECT 4 /**< We will not publish this router. */ -#define FP_BADDIR 8 /**< We'll tell clients to avoid using this as a dir. */ -#define FP_BADEXIT 16 /**< We'll tell clients not to use this as an exit. */ -#define FP_UNNAMED 32 /**< Another router has this name in fingerprint file. */ - -/** Encapsulate a nickname and an FP_* status; target of status_by_digest - * map. */ -typedef struct router_status_t { - char nickname[MAX_NICKNAME_LEN+1]; - uint32_t status; -} router_status_t; - -/** List of nickname-\>identity fingerprint mappings for all the routers - * that we name. Used to prevent router impersonation. */ -typedef struct authdir_config_t { - strmap_t *fp_by_name; /**< Map from lc nickname to fingerprint. */ - digestmap_t *status_by_digest; /**< Map from digest to router_status_t. */ -} authdir_config_t; - -/** Should be static; exposed for testing. */ -static authdir_config_t *fingerprint_list = NULL; - -/** Allocate and return a new, empty, authdir_config_t. */ -static authdir_config_t * -authdir_config_new(void) -{ - authdir_config_t *list = tor_malloc_zero(sizeof(authdir_config_t)); - list->fp_by_name = strmap_new(); - list->status_by_digest = digestmap_new(); - return list; -} - -/** Add the fingerprint fp for nickname to - * the smartlist of fingerprint_entry_t's list. Return 0 if it's - * new, or 1 if we replaced the old value. - */ -/* static */ int -add_fingerprint_to_dir(const char *nickname, const char *fp, - authdir_config_t *list) -{ - char *fingerprint; - char d[DIGEST_LEN]; - router_status_t *status; - tor_assert(nickname); - tor_assert(fp); - tor_assert(list); - - fingerprint = tor_strdup(fp); - tor_strstrip(fingerprint, " "); - if (base16_decode(d, DIGEST_LEN, fingerprint, strlen(fingerprint))) { - log_warn(LD_DIRSERV, "Couldn't decode fingerprint \"%s\"", - escaped(fp)); - tor_free(fingerprint); - return 0; - } - - if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) { - log_warn(LD_DIRSERV, "Tried to add a mapping for reserved nickname %s", - UNNAMED_ROUTER_NICKNAME); - tor_free(fingerprint); - return 0; - } - - status = digestmap_get(list->status_by_digest, d); - if (!status) { - status = tor_malloc_zero(sizeof(router_status_t)); - digestmap_set(list->status_by_digest, d, status); - } - - if (nickname[0] != '!') { - char *old_fp = strmap_get_lc(list->fp_by_name, nickname); - if (old_fp && !strcasecmp(fingerprint, old_fp)) { - tor_free(fingerprint); - } else { - tor_free(old_fp); - strmap_set_lc(list->fp_by_name, nickname, fingerprint); - } - status->status |= FP_NAMED; - strlcpy(status->nickname, nickname, sizeof(status->nickname)); - } else { - tor_free(fingerprint); - if (!strcasecmp(nickname, "!reject")) { - status->status |= FP_REJECT; - } else if (!strcasecmp(nickname, "!invalid")) { - status->status |= FP_INVALID; - } else if (!strcasecmp(nickname, "!baddir")) { - status->status |= FP_BADDIR; - } else if (!strcasecmp(nickname, "!badexit")) { - status->status |= FP_BADEXIT; - } - } - return 0; -} - -/** Add the nickname and fingerprint for this OR to the - * global list of recognized identity key fingerprints. */ -int -dirserv_add_own_fingerprint(const char *nickname, crypto_pk_t *pk) -{ - char fp[FINGERPRINT_LEN+1]; - if (crypto_pk_get_fingerprint(pk, fp, 0)<0) { - log_err(LD_BUG, "Error computing fingerprint"); - return -1; - } - if (!fingerprint_list) - fingerprint_list = authdir_config_new(); - add_fingerprint_to_dir(nickname, fp, fingerprint_list); - return 0; -} - -/** Load the nickname-\>fingerprint mappings stored in the approved-routers - * file. The file format is line-based, with each non-blank holding one - * nickname, some space, and a fingerprint for that nickname. On success, - * replace the current fingerprint list with the new list and return 0. On - * failure, leave the current fingerprint list untouched, and return -1. */ -int -dirserv_load_fingerprint_file(void) -{ - char *fname; - char *cf; - char *nickname, *fingerprint; - authdir_config_t *fingerprint_list_new; - int result; - config_line_t *front=NULL, *list; - const or_options_t *options = get_options(); - - fname = get_datadir_fname("approved-routers"); - log_info(LD_GENERAL, - "Reloading approved fingerprints from \"%s\"...", fname); - - cf = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); - if (!cf) { - if (options->NamingAuthoritativeDir) { - log_warn(LD_FS, "Cannot open fingerprint file '%s'. Failing.", fname); - tor_free(fname); - return -1; - } else { - log_info(LD_FS, "Cannot open fingerprint file '%s'. That's ok.", fname); - tor_free(fname); - return 0; - } - } - tor_free(fname); - - result = config_get_lines(cf, &front, 0); - tor_free(cf); - if (result < 0) { - log_warn(LD_CONFIG, "Error reading from fingerprint file"); - return -1; - } - - fingerprint_list_new = authdir_config_new(); - - for (list=front; list; list=list->next) { - char digest_tmp[DIGEST_LEN]; - nickname = list->key; fingerprint = list->value; - if (strlen(nickname) > MAX_NICKNAME_LEN) { - log_notice(LD_CONFIG, - "Nickname '%s' too long in fingerprint file. Skipping.", - nickname); - continue; - } - if (!is_legal_nickname(nickname) && - strcasecmp(nickname, "!reject") && - strcasecmp(nickname, "!invalid") && - strcasecmp(nickname, "!badexit")) { - log_notice(LD_CONFIG, - "Invalid nickname '%s' in fingerprint file. Skipping.", - nickname); - continue; - } - tor_strstrip(fingerprint, " "); /* remove spaces */ - if (strlen(fingerprint) != HEX_DIGEST_LEN || - base16_decode(digest_tmp, sizeof(digest_tmp), - fingerprint, HEX_DIGEST_LEN) < 0) { - log_notice(LD_CONFIG, - "Invalid fingerprint (nickname '%s', " - "fingerprint %s). Skipping.", - nickname, fingerprint); - continue; - } - if (0==strcasecmp(nickname, DEFAULT_CLIENT_NICKNAME)) { - /* If you approved an OR called "client", then clients who use - * the default nickname could all be rejected. That's no good. */ - log_notice(LD_CONFIG, - "Authorizing nickname '%s' would break " - "many clients; skipping.", - DEFAULT_CLIENT_NICKNAME); - continue; - } - if (0==strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) { - /* If you approved an OR called "unnamed", then clients will be - * confused. */ - log_notice(LD_CONFIG, - "Authorizing nickname '%s' is not allowed; skipping.", - UNNAMED_ROUTER_NICKNAME); - continue; - } - if (add_fingerprint_to_dir(nickname, fingerprint, fingerprint_list_new) - != 0) - log_notice(LD_CONFIG, "Duplicate nickname '%s'.", nickname); - } - - config_free_lines(front); - dirserv_free_fingerprint_list(); - fingerprint_list = fingerprint_list_new; - /* Delete any routers whose fingerprints we no longer recognize */ - directory_remove_invalid(); - return 0; -} - -/** Check whether router has a nickname/identity key combination that - * we recognize from the fingerprint list, or an IP we automatically act on - * according to our configuration. Return the appropriate router status. - * - * If the status is 'FP_REJECT' and msg is provided, set - * *msg to an explanation of why. */ -uint32_t -dirserv_router_get_status(const routerinfo_t *router, const char **msg) -{ - char d[DIGEST_LEN]; - - if (crypto_pk_get_digest(router->identity_pkey, d)) { - log_warn(LD_BUG,"Error computing fingerprint"); - if (msg) - *msg = "Bug: Error computing fingerprint"; - return FP_REJECT; - } - - return dirserv_get_status_impl(d, router->nickname, - router->address, - router->addr, router->or_port, - router->platform, router->contact_info, - msg, 1); -} - -/** Return true if there is no point in downloading the router described by - * rs because this directory would reject it. */ -int -dirserv_would_reject_router(const routerstatus_t *rs) -{ - uint32_t res; - - res = dirserv_get_status_impl(rs->identity_digest, rs->nickname, - "", /* address is only used in logs */ - rs->addr, rs->or_port, - NULL, NULL, - NULL, 0); - - return (res & FP_REJECT) != 0; -} - -/** Helper: Based only on the ID/Nickname combination, - * return FP_UNNAMED (unnamed), FP_NAMED (named), or 0 (neither). - */ -static uint32_t -dirserv_get_name_status(const char *id_digest, const char *nickname) -{ - char fp[HEX_DIGEST_LEN+1]; - char *fp_by_name; - - base16_encode(fp, sizeof(fp), id_digest, DIGEST_LEN); - - if ((fp_by_name = - strmap_get_lc(fingerprint_list->fp_by_name, nickname))) { - if (!strcasecmp(fp, fp_by_name)) { - return FP_NAMED; - } else { - return FP_UNNAMED; /* Wrong fingerprint. */ - } - } - return 0; -} - -/** Helper: As dirserv_router_get_status, but takes the router fingerprint - * (hex, no spaces), nickname, address (used for logging only), IP address, OR - * port, platform (logging only) and contact info (logging only) as arguments. - * - * If should_log is false, do not log messages. (There's not much point in - * logging that we're rejecting servers we'll not download.) - */ -static uint32_t -dirserv_get_status_impl(const char *id_digest, const char *nickname, - const char *address, - uint32_t addr, uint16_t or_port, - const char *platform, const char *contact, - const char **msg, int should_log) -{ - int reject_unlisted = get_options()->AuthDirRejectUnlisted; - uint32_t result; - router_status_t *status_by_digest; - - if (!fingerprint_list) - fingerprint_list = authdir_config_new(); - - if (should_log) - log_debug(LD_DIRSERV, "%d fingerprints, %d digests known.", - strmap_size(fingerprint_list->fp_by_name), - digestmap_size(fingerprint_list->status_by_digest)); - - /* Versions before Tor 0.2.2.35 have known security issues that - * make them unsuitable for the current network. */ - if (platform && !tor_version_as_new_as(platform,"0.2.2.35")) { - if (msg) - *msg = "Tor version is insecure or unsupported. Please upgrade!"; - return FP_REJECT; - } else if (platform && tor_version_as_new_as(platform,"0.2.3.0-alpha")) { - /* Versions from 0.2.3-alpha...0.2.3.9-alpha have known security - * issues that make them unusable for the current network */ - if (!tor_version_as_new_as(platform, "0.2.3.10-alpha")) { - if (msg) - *msg = "Tor version is insecure or unsupported. Please upgrade!"; - return FP_REJECT; - } - } - - result = dirserv_get_name_status(id_digest, nickname); - if (result & FP_NAMED) { - if (should_log) - log_debug(LD_DIRSERV,"Good fingerprint for '%s'",nickname); - } - if (result & FP_UNNAMED) { - if (should_log) { - char *esc_contact = esc_for_log(contact); - log_info(LD_DIRSERV, - "Mismatched fingerprint for '%s'. " - "ContactInfo '%s', platform '%s'.)", - nickname, - esc_contact, - platform ? escaped(platform) : ""); - tor_free(esc_contact); - } - if (msg) - *msg = "Rejected: There is already a named server with this nickname " - "and a different fingerprint."; - } - - status_by_digest = digestmap_get(fingerprint_list->status_by_digest, - id_digest); - if (status_by_digest) - result |= (status_by_digest->status & ~FP_NAMED); - - if (result & FP_REJECT) { - if (msg) - *msg = "Fingerprint is marked rejected"; - return FP_REJECT; - } else if (result & FP_INVALID) { - if (msg) - *msg = "Fingerprint is marked invalid"; - } - - if (authdir_policy_baddir_address(addr, or_port)) { - if (should_log) - log_info(LD_DIRSERV, - "Marking '%s' as bad directory because of address '%s'", - nickname, address); - result |= FP_BADDIR; - } - - if (authdir_policy_badexit_address(addr, or_port)) { - if (should_log) - log_info(LD_DIRSERV, "Marking '%s' as bad exit because of address '%s'", - nickname, address); - result |= FP_BADEXIT; - } - - if (!(result & FP_NAMED)) { - if (!authdir_policy_permits_address(addr, or_port)) { - if (should_log) - log_info(LD_DIRSERV, "Rejecting '%s' because of address '%s'", - nickname, address); - if (msg) - *msg = "Authdir is rejecting routers in this range."; - return FP_REJECT; - } - if (!authdir_policy_valid_address(addr, or_port)) { - if (should_log) - log_info(LD_DIRSERV, "Not marking '%s' valid because of address '%s'", - nickname, address); - result |= FP_INVALID; - } - if (reject_unlisted) { - if (msg) - *msg = "Authdir rejects unknown routers."; - return FP_REJECT; - } - } - - return result; -} - -/** If we are an authoritative dirserver, and the list of approved - * servers contains one whose identity key digest is digest, - * return that router's nickname. Otherwise return NULL. */ -const char * -dirserv_get_nickname_by_digest(const char *digest) -{ - router_status_t *status; - if (!fingerprint_list) - return NULL; - tor_assert(digest); - - status = digestmap_get(fingerprint_list->status_by_digest, digest); - return status ? status->nickname : NULL; -} - -/** Clear the current fingerprint list. */ -void -dirserv_free_fingerprint_list(void) -{ - if (!fingerprint_list) - return; - - strmap_free(fingerprint_list->fp_by_name, tor_free_); - digestmap_free(fingerprint_list->status_by_digest, tor_free_); - tor_free(fingerprint_list); -} - -/* - * Descriptor list - */ - -/** Return -1 if ri has a private or otherwise bad address, - * unless we're configured to not care. Return 0 if all ok. */ -static int -dirserv_router_has_valid_address(routerinfo_t *ri) -{ - struct in_addr iaddr; - if (get_options()->DirAllowPrivateAddresses) - return 0; /* whatever it is, we're fine with it */ - if (!tor_inet_aton(ri->address, &iaddr)) { - log_info(LD_DIRSERV,"Router %s published non-IP address '%s'. Refusing.", - router_describe(ri), - ri->address); - return -1; - } - if (is_internal_IP(ntohl(iaddr.s_addr), 0)) { - log_info(LD_DIRSERV, - "Router %s published internal IP address '%s'. Refusing.", - router_describe(ri), ri->address); - return -1; /* it's a private IP, we should reject it */ - } - return 0; -} - -/** Check whether we, as a directory server, want to accept ri. If so, - * set its is_valid,named,running fields and return 0. Otherwise, return -1. - * - * If the router is rejected, set *msg to an explanation of why. - * - * If complain then explain at log-level 'notice' why we refused - * a descriptor; else explain at log-level 'info'. - */ -int -authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, - int complain, int *valid_out) -{ - /* Okay. Now check whether the fingerprint is recognized. */ - uint32_t status = dirserv_router_get_status(ri, msg); - time_t now; - int severity = (complain && ri->contact_info) ? LOG_NOTICE : LOG_INFO; - tor_assert(msg); - if (status & FP_REJECT) - return -1; /* msg is already set. */ - - /* Is there too much clock skew? */ - now = time(NULL); - if (ri->cache_info.published_on > now+ROUTER_ALLOW_SKEW) { - log_fn(severity, LD_DIRSERV, "Publication time for %s is too " - "far (%d minutes) in the future; possible clock skew. Not adding " - "(%s)", - router_describe(ri), - (int)((ri->cache_info.published_on-now)/60), - esc_router_info(ri)); - *msg = "Rejected: Your clock is set too far in the future, or your " - "timezone is not correct."; - return -1; - } - if (ri->cache_info.published_on < now-ROUTER_MAX_AGE_TO_PUBLISH) { - log_fn(severity, LD_DIRSERV, - "Publication time for %s is too far " - "(%d minutes) in the past. Not adding (%s)", - router_describe(ri), - (int)((now-ri->cache_info.published_on)/60), - esc_router_info(ri)); - *msg = "Rejected: Server is expired, or your clock is too far in the past," - " or your timezone is not correct."; - return -1; - } - if (dirserv_router_has_valid_address(ri) < 0) { - log_fn(severity, LD_DIRSERV, - "Router %s has invalid address '%s'. " - "Not adding (%s).", - router_describe(ri), - ri->address, - esc_router_info(ri)); - *msg = "Rejected: Address is not an IP, or IP is a private address."; - return -1; - } - - *valid_out = ! (status & FP_INVALID); - - return 0; -} - -/** Update the relevant flags of node based on our opinion as a - * directory authority in authstatus, as returned by - * dirserv_router_get_status or equivalent. */ -void -dirserv_set_node_flags_from_authoritative_status(node_t *node, - uint32_t authstatus) -{ - node->is_valid = (authstatus & FP_INVALID) ? 0 : 1; - node->is_bad_directory = (authstatus & FP_BADDIR) ? 1 : 0; - node->is_bad_exit = (authstatus & FP_BADEXIT) ? 1 : 0; -} - -/** True iff a is more severe than b. */ -static int -WRA_MORE_SEVERE(was_router_added_t a, was_router_added_t b) -{ - return a < b; -} - -/** As for dirserv_add_descriptor(), but accepts multiple documents, and - * returns the most severe error that occurred for any one of them. */ -was_router_added_t -dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, - const char *source, - const char **msg) -{ - was_router_added_t r, r_tmp; - const char *msg_out; - smartlist_t *list; - const char *s; - int n_parsed = 0; - time_t now = time(NULL); - char annotation_buf[ROUTER_ANNOTATION_BUF_LEN]; - char time_buf[ISO_TIME_LEN+1]; - int general = purpose == ROUTER_PURPOSE_GENERAL; - tor_assert(msg); - - r=ROUTER_ADDED_SUCCESSFULLY; /*Least severe return value. */ - - format_iso_time(time_buf, now); - if (tor_snprintf(annotation_buf, sizeof(annotation_buf), - "@uploaded-at %s\n" - "@source %s\n" - "%s%s%s", time_buf, escaped(source), - !general ? "@purpose " : "", - !general ? router_purpose_to_string(purpose) : "", - !general ? "\n" : "")<0) { - *msg = "Couldn't format annotations"; - return -1; - } - - s = desc; - list = smartlist_new(); - if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 0, 0, - annotation_buf)) { - SMARTLIST_FOREACH(list, routerinfo_t *, ri, { - msg_out = NULL; - tor_assert(ri->purpose == purpose); - r_tmp = dirserv_add_descriptor(ri, &msg_out, source); - if (WRA_MORE_SEVERE(r_tmp, r)) { - r = r_tmp; - *msg = msg_out; - } - }); - } - n_parsed += smartlist_len(list); - smartlist_clear(list); - - s = desc; - if (!router_parse_list_from_string(&s, NULL, list, SAVED_NOWHERE, 1, 0, - NULL)) { - SMARTLIST_FOREACH(list, extrainfo_t *, ei, { - msg_out = NULL; - - r_tmp = dirserv_add_extrainfo(ei, &msg_out); - if (WRA_MORE_SEVERE(r_tmp, r)) { - r = r_tmp; - *msg = msg_out; - } - }); - } - n_parsed += smartlist_len(list); - smartlist_free(list); - - if (! *msg) { - if (!n_parsed) { - *msg = "No descriptors found in your POST."; - if (WRA_WAS_ADDED(r)) - r = ROUTER_WAS_NOT_NEW; - } else { - *msg = "(no message)"; - } - } - - return r; -} - -/** Examine the parsed server descriptor in ri and maybe insert it into - * the list of server descriptors. Set *msg to a message that should be - * passed back to the origin of this descriptor, or NULL if there is no such - * message. Use source to produce better log messages. - * - * Return the status of the operation - * - * This function is only called when fresh descriptors are posted, not when - * we re-load the cache. - */ -was_router_added_t -dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) -{ - was_router_added_t r; - routerinfo_t *ri_old; - char *desc, *nickname; - size_t desclen = 0; - *msg = NULL; - - /* If it's too big, refuse it now. Otherwise we'll cache it all over the - * network and it'll clog everything up. */ - if (ri->cache_info.signed_descriptor_len > MAX_DESCRIPTOR_UPLOAD_SIZE) { - log_notice(LD_DIR, "Somebody attempted to publish a router descriptor '%s'" - " (source: %s) with size %d. Either this is an attack, or the " - "MAX_DESCRIPTOR_UPLOAD_SIZE (%d) constant is too low.", - ri->nickname, source, (int)ri->cache_info.signed_descriptor_len, - MAX_DESCRIPTOR_UPLOAD_SIZE); - *msg = "Router descriptor was too large."; - control_event_or_authdir_new_descriptor("REJECTED", - ri->cache_info.signed_descriptor_body, - ri->cache_info.signed_descriptor_len, *msg); - routerinfo_free(ri); - return ROUTER_AUTHDIR_REJECTS; - } - - /* Check whether this descriptor is semantically identical to the last one - * from this server. (We do this here and not in router_add_to_routerlist - * because we want to be able to accept the newest router descriptor that - * another authority has, so we all converge on the same one.) */ - ri_old = router_get_mutable_by_digest(ri->cache_info.identity_digest); - if (ri_old && ri_old->cache_info.published_on < ri->cache_info.published_on - && router_differences_are_cosmetic(ri_old, ri) - && !router_is_me(ri)) { - log_info(LD_DIRSERV, - "Not replacing descriptor from %s (source: %s); " - "differences are cosmetic.", - router_describe(ri), source); - *msg = "Not replacing router descriptor; no information has changed since " - "the last one with this identity."; - control_event_or_authdir_new_descriptor("DROPPED", - ri->cache_info.signed_descriptor_body, - ri->cache_info.signed_descriptor_len, *msg); - routerinfo_free(ri); - return ROUTER_WAS_NOT_NEW; - } - - /* Make a copy of desc, since router_add_to_routerlist might free - * ri and its associated signed_descriptor_t. */ - desclen = ri->cache_info.signed_descriptor_len; - desc = tor_strndup(ri->cache_info.signed_descriptor_body, desclen); - nickname = tor_strdup(ri->nickname); - - /* Tell if we're about to need to launch a test if we add this. */ - ri->needs_retest_if_added = - dirserv_should_launch_reachability_test(ri, ri_old); - - r = router_add_to_routerlist(ri, msg, 0, 0); - if (!WRA_WAS_ADDED(r)) { - /* unless the routerinfo was fine, just out-of-date */ - if (WRA_WAS_REJECTED(r)) - control_event_or_authdir_new_descriptor("REJECTED", desc, desclen, *msg); - log_info(LD_DIRSERV, - "Did not add descriptor from '%s' (source: %s): %s.", - nickname, source, *msg ? *msg : "(no message)"); - } else { - smartlist_t *changed; - control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg); - - changed = smartlist_new(); - smartlist_add(changed, ri); - routerlist_descriptors_added(changed, 0); - smartlist_free(changed); - if (!*msg) { - *msg = "Descriptor accepted"; - } - log_info(LD_DIRSERV, - "Added descriptor from '%s' (source: %s): %s.", - nickname, source, *msg); - } - tor_free(desc); - tor_free(nickname); - return r; -} - -/** As dirserv_add_descriptor, but for an extrainfo_t ei. */ -static was_router_added_t -dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) -{ - const routerinfo_t *ri; - int r; - tor_assert(msg); - *msg = NULL; - - ri = router_get_by_id_digest(ei->cache_info.identity_digest); - if (!ri) { - *msg = "No corresponding router descriptor for extra-info descriptor"; - extrainfo_free(ei); - return ROUTER_BAD_EI; - } - - /* If it's too big, refuse it now. Otherwise we'll cache it all over the - * network and it'll clog everything up. */ - if (ei->cache_info.signed_descriptor_len > MAX_EXTRAINFO_UPLOAD_SIZE) { - log_notice(LD_DIR, "Somebody attempted to publish an extrainfo " - "with size %d. Either this is an attack, or the " - "MAX_EXTRAINFO_UPLOAD_SIZE (%d) constant is too low.", - (int)ei->cache_info.signed_descriptor_len, - MAX_EXTRAINFO_UPLOAD_SIZE); - *msg = "Extrainfo document was too large"; - extrainfo_free(ei); - return ROUTER_BAD_EI; - } - - if ((r = routerinfo_incompatible_with_extrainfo(ri, ei, NULL, msg))) { - extrainfo_free(ei); - return r < 0 ? ROUTER_WAS_NOT_NEW : ROUTER_BAD_EI; - } - router_add_extrainfo_to_routerlist(ei, msg, 0, 0); - return ROUTER_ADDED_SUCCESSFULLY; -} - -/** Remove all descriptors whose nicknames or fingerprints no longer - * are allowed by our fingerprint list. (Descriptors that used to be - * good can become bad when we reload the fingerprint list.) - */ -static void -directory_remove_invalid(void) -{ - int changed = 0; - routerlist_t *rl = router_get_routerlist(); - smartlist_t *nodes = smartlist_new(); - smartlist_add_all(nodes, nodelist_get_list()); - - SMARTLIST_FOREACH_BEGIN(nodes, node_t *, node) { - const char *msg; - routerinfo_t *ent = node->ri; - char description[NODE_DESC_BUF_LEN]; - uint32_t r; - if (!ent) - continue; - r = dirserv_router_get_status(ent, &msg); - router_get_description(description, ent); - if (r & FP_REJECT) { - log_info(LD_DIRSERV, "Router %s is now rejected: %s", - description, msg?msg:""); - routerlist_remove(rl, ent, 0, time(NULL)); - changed = 1; - continue; - } -#if 0 - if (bool_neq((r & FP_NAMED), ent->auth_says_is_named)) { - log_info(LD_DIRSERV, - "Router %s is now %snamed.", description, - (r&FP_NAMED)?"":"un"); - ent->is_named = (r&FP_NAMED)?1:0; - changed = 1; - } - if (bool_neq((r & FP_UNNAMED), ent->auth_says_is_unnamed)) { - log_info(LD_DIRSERV, - "Router '%s' is now %snamed. (FP_UNNAMED)", description, - (r&FP_NAMED)?"":"un"); - ent->is_named = (r&FP_NUNAMED)?0:1; - changed = 1; - } -#endif - if (bool_neq((r & FP_INVALID), !node->is_valid)) { - log_info(LD_DIRSERV, "Router '%s' is now %svalid.", description, - (r&FP_INVALID) ? "in" : ""); - node->is_valid = (r&FP_INVALID)?0:1; - changed = 1; - } - if (bool_neq((r & FP_BADDIR), node->is_bad_directory)) { - log_info(LD_DIRSERV, "Router '%s' is now a %s directory", description, - (r & FP_BADDIR) ? "bad" : "good"); - node->is_bad_directory = (r&FP_BADDIR) ? 1: 0; - changed = 1; - } - if (bool_neq((r & FP_BADEXIT), node->is_bad_exit)) { - log_info(LD_DIRSERV, "Router '%s' is now a %s exit", description, - (r & FP_BADEXIT) ? "bad" : "good"); - node->is_bad_exit = (r&FP_BADEXIT) ? 1: 0; - changed = 1; - } - } SMARTLIST_FOREACH_END(node); - if (changed) - directory_set_dirty(); - - routerlist_assert_ok(rl); - smartlist_free(nodes); -} - -/** Mark the directory as dirty -- when we're next asked for a - * directory, we will rebuild it instead of reusing the most recently - * generated one. - */ -void -directory_set_dirty(void) -{ - time_t now = time(NULL); - int set_v1_dirty=0; - - /* Regenerate stubs only every 8 hours. - * XXXX It would be nice to generate less often, but these are just - * stubs: it doesn't matter. */ -#define STUB_REGENERATE_INTERVAL (8*60*60) - if (!the_directory || !the_runningrouters.dir) - set_v1_dirty = 1; - else if (the_directory->published < now - STUB_REGENERATE_INTERVAL || - the_runningrouters.published < now - STUB_REGENERATE_INTERVAL) - set_v1_dirty = 1; - - if (set_v1_dirty) { - if (!the_directory_is_dirty) - the_directory_is_dirty = now; - if (!runningrouters_is_dirty) - runningrouters_is_dirty = now; - } -} - -/** - * Allocate and return a description of the status of the server desc, - * for use in a v1-style router-status line. The server is listed - * as running iff is_live is true. - */ -static char * -list_single_server_status(const routerinfo_t *desc, int is_live) -{ - char buf[MAX_NICKNAME_LEN+HEX_DIGEST_LEN+4]; /* !nickname=$hexdigest\0 */ - char *cp; - const node_t *node; - - tor_assert(desc); - - cp = buf; - if (!is_live) { - *cp++ = '!'; - } - node = node_get_by_id(desc->cache_info.identity_digest); - if (node && node->is_valid) { - strlcpy(cp, desc->nickname, sizeof(buf)-(cp-buf)); - cp += strlen(cp); - *cp++ = '='; - } - *cp++ = '$'; - base16_encode(cp, HEX_DIGEST_LEN+1, desc->cache_info.identity_digest, - DIGEST_LEN); - return tor_strdup(buf); -} - -/* DOCDOC running_long_enough_to_decide_unreachable */ -static INLINE int -running_long_enough_to_decide_unreachable(void) -{ - return time_of_process_start - + get_options()->TestingAuthDirTimeToLearnReachability < approx_time(); -} - -/** Each server needs to have passed a reachability test no more - * than this number of seconds ago, or he is listed as down in - * the directory. */ -#define REACHABLE_TIMEOUT (45*60) - -/** If we tested a router and found it reachable _at least this long_ after it - * declared itself hibernating, it is probably done hibernating and we just - * missed a descriptor from it. */ -#define HIBERNATION_PUBLICATION_SKEW (60*60) - -/** Treat a router as alive if - * - It's me, and I'm not hibernating. - * or - We've found it reachable recently. */ -void -dirserv_set_router_is_running(routerinfo_t *router, time_t now) -{ - /*XXXX024 This function is a mess. Separate out the part that calculates - whether it's reachable and the part that tells rephist that the router was - unreachable. - */ - int answer; - const or_options_t *options = get_options(); - node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest); - tor_assert(node); - - if (router_is_me(router)) { - /* We always know if we are down ourselves. */ - answer = ! we_are_hibernating(); - } else if (router->is_hibernating && - (router->cache_info.published_on + - HIBERNATION_PUBLICATION_SKEW) > node->last_reachable) { - /* A hibernating router is down unless we (somehow) had contact with it - * since it declared itself to be hibernating. */ - answer = 0; - } else if (options->AssumeReachable) { - /* If AssumeReachable, everybody is up unless they say they are down! */ - answer = 1; - } else { - /* Otherwise, a router counts as up if we found all announced OR - ports reachable in the last REACHABLE_TIMEOUT seconds. - - XXX prop186 For now there's always one IPv4 and at most one - IPv6 OR port. - - If we're not on IPv6, don't consider reachability of potential - IPv6 OR port since that'd kill all dual stack relays until a - majority of the dir auths have IPv6 connectivity. */ - answer = (now < node->last_reachable + REACHABLE_TIMEOUT && - (options->AuthDirHasIPv6Connectivity != 1 || - tor_addr_is_null(&router->ipv6_addr) || - now < node->last_reachable6 + REACHABLE_TIMEOUT)); - } - - if (!answer && running_long_enough_to_decide_unreachable()) { - /* Not considered reachable. tell rephist about that. - - Because we launch a reachability test for each router every - REACHABILITY_TEST_CYCLE_PERIOD seconds, then the router has probably - been down since at least that time after we last successfully reached - it. - - XXX ipv6 - */ - time_t when = now; - if (node->last_reachable && - node->last_reachable + REACHABILITY_TEST_CYCLE_PERIOD < now) - when = node->last_reachable + REACHABILITY_TEST_CYCLE_PERIOD; - rep_hist_note_router_unreachable(router->cache_info.identity_digest, when); - } - - node->is_running = answer; -} - -/** Based on the routerinfo_ts in routers, allocate the - * contents of a v1-style router-status line, and store it in - * *router_status_out. Return 0 on success, -1 on failure. - * - * If for_controller is true, include the routers with very old descriptors. - */ -int -list_server_status_v1(smartlist_t *routers, char **router_status_out, - int for_controller) -{ - /* List of entries in a router-status style: An optional !, then an optional - * equals-suffixed nickname, then a dollar-prefixed hexdigest. */ - smartlist_t *rs_entries; - time_t now = time(NULL); - time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - const or_options_t *options = get_options(); - /* We include v2 dir auths here too, because they need to answer - * controllers. Eventually we'll deprecate this whole function; - * see also networkstatus_getinfo_by_purpose(). */ - int authdir = authdir_mode_publishes_statuses(options); - tor_assert(router_status_out); - - rs_entries = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { - const node_t *node = node_get_by_id(ri->cache_info.identity_digest); - tor_assert(node); - if (authdir) { - /* Update router status in routerinfo_t. */ - dirserv_set_router_is_running(ri, now); - } - if (for_controller) { - char name_buf[MAX_VERBOSE_NICKNAME_LEN+2]; - char *cp = name_buf; - if (!node->is_running) - *cp++ = '!'; - router_get_verbose_nickname(cp, ri); - smartlist_add(rs_entries, tor_strdup(name_buf)); - } else if (ri->cache_info.published_on >= cutoff) { - smartlist_add(rs_entries, list_single_server_status(ri, - node->is_running)); - } - } SMARTLIST_FOREACH_END(ri); - - *router_status_out = smartlist_join_strings(rs_entries, " ", 0, NULL); - - SMARTLIST_FOREACH(rs_entries, char *, cp, tor_free(cp)); - smartlist_free(rs_entries); - - return 0; -} - -/** Given a (possibly empty) list of config_line_t, each line of which contains - * a list of comma-separated version numbers surrounded by optional space, - * allocate and return a new string containing the version numbers, in order, - * separated by commas. Used to generate Recommended(Client|Server)?Versions - */ -static char * -format_versions_list(config_line_t *ln) -{ - smartlist_t *versions; - char *result; - versions = smartlist_new(); - for ( ; ln; ln = ln->next) { - smartlist_split_string(versions, ln->value, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - } - sort_version_list(versions, 1); - result = smartlist_join_strings(versions,",",0,NULL); - SMARTLIST_FOREACH(versions,char *,s,tor_free(s)); - smartlist_free(versions); - return result; -} - -/** Return 1 if ri's descriptor is "active" -- running, valid, - * not hibernating, and not too old. Else return 0. - */ -static int -router_is_active(const routerinfo_t *ri, const node_t *node, time_t now) -{ - time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - if (ri->cache_info.published_on < cutoff) - return 0; - if (!node->is_running || !node->is_valid || ri->is_hibernating) - return 0; - return 1; -} - -/** Generate a new v1 directory and write it into a newly allocated string. - * Point *dir_out to the allocated string. Sign the - * directory with private_key. Return 0 on success, -1 on - * failure. If complete is set, give us all the descriptors; - * otherwise leave out non-running and non-valid ones. - */ -int -dirserv_dump_directory_to_string(char **dir_out, - crypto_pk_t *private_key) -{ - /* XXXX 024 Get rid of this function if we can confirm that nobody's - * fetching these any longer */ - char *cp; - char *identity_pkey; /* Identity key, DER64-encoded. */ - char *recommended_versions; - char digest[DIGEST_LEN]; - char published[ISO_TIME_LEN+1]; - char *buf = NULL; - size_t buf_len; - size_t identity_pkey_len; - time_t now = time(NULL); - - tor_assert(dir_out); - *dir_out = NULL; - - if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, - &identity_pkey_len)<0) { - log_warn(LD_BUG,"write identity_pkey to string failed!"); - return -1; - } - - recommended_versions = - format_versions_list(get_options()->RecommendedVersions); - - format_iso_time(published, now); - - buf_len = 2048+strlen(recommended_versions); - - buf = tor_malloc(buf_len); - /* We'll be comparing against buf_len throughout the rest of the - function, though strictly speaking we shouldn't be able to exceed - it. This is C, after all, so we may as well check for buffer - overruns.*/ - - tor_snprintf(buf, buf_len, - "signed-directory\n" - "published %s\n" - "recommended-software %s\n" - "router-status %s\n" - "dir-signing-key\n%s\n", - published, recommended_versions, "", - identity_pkey); - - tor_free(recommended_versions); - tor_free(identity_pkey); - - cp = buf + strlen(buf); - *cp = '\0'; - - /* These multiple strlcat calls are inefficient, but dwarfed by the RSA - signature. */ - if (strlcat(buf, "directory-signature ", buf_len) >= buf_len) - goto truncated; - if (strlcat(buf, get_options()->Nickname, buf_len) >= buf_len) - goto truncated; - if (strlcat(buf, "\n", buf_len) >= buf_len) - goto truncated; - - if (router_get_dir_hash(buf,digest)) { - log_warn(LD_BUG,"couldn't compute digest"); - tor_free(buf); - return -1; - } - note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(buf,buf_len,digest,DIGEST_LEN, - private_key)<0) { - tor_free(buf); - return -1; - } - - *dir_out = buf; - return 0; - truncated: - log_warn(LD_BUG,"tried to exceed string length."); - tor_free(buf); - return -1; -} - -/********************************************************************/ - -/* A set of functions to answer questions about how we'd like to behave - * as a directory mirror/client. */ - -/** Return 1 if we fetch our directory material directly from the - * authorities, rather than from a mirror. */ -int -directory_fetches_from_authorities(const or_options_t *options) -{ - const routerinfo_t *me; - uint32_t addr; - int refuseunknown; - if (options->FetchDirInfoEarly) - return 1; - if (options->BridgeRelay == 1) - return 0; - if (server_mode(options) && router_pick_published_address(options, &addr)<0) - return 1; /* we don't know our IP address; ask an authority. */ - refuseunknown = ! router_my_exit_policy_is_reject_star() && - should_refuse_unknown_exits(options); - if (!options->DirPort_set && !refuseunknown) - return 0; - if (!server_mode(options) || !advertised_server_mode()) - return 0; - me = router_get_my_routerinfo(); - if (!me || (!me->dir_port && !refuseunknown)) - return 0; /* if dirport not advertised, return 0 too */ - return 1; -} - -/** Return 1 if we should fetch new networkstatuses, descriptors, etc - * on the "mirror" schedule rather than the "client" schedule. - */ -int -directory_fetches_dir_info_early(const or_options_t *options) -{ - return directory_fetches_from_authorities(options); -} - -/** Return 1 if we should fetch new networkstatuses, descriptors, etc - * on a very passive schedule -- waiting long enough for ordinary clients - * to probably have the info we want. These would include bridge users, - * and maybe others in the future e.g. if a Tor client uses another Tor - * client as a directory guard. - */ -int -directory_fetches_dir_info_later(const or_options_t *options) -{ - return options->UseBridges != 0; -} - -/** Return true iff we want to fetch and keep certificates for authorities - * that we don't acknowledge as aurthorities ourself. - */ -int -directory_caches_unknown_auth_certs(const or_options_t *options) -{ - return options->DirPort_set || options->BridgeRelay; -} - -/** Return 1 if we want to keep descriptors, networkstatuses, etc around - * and we're willing to serve them to others. Else return 0. - */ -int -directory_caches_dir_info(const or_options_t *options) -{ - if (options->BridgeRelay || options->DirPort_set) - return 1; - if (!server_mode(options) || !advertised_server_mode()) - return 0; - /* We need an up-to-date view of network info if we're going to try to - * block exit attempts from unknown relays. */ - return ! router_my_exit_policy_is_reject_star() && - should_refuse_unknown_exits(options); -} - -/** Return 1 if we want to allow remote people to ask us directory - * requests via the "begin_dir" interface, which doesn't require - * having any separate port open. */ -int -directory_permits_begindir_requests(const or_options_t *options) -{ - return options->BridgeRelay != 0 || options->DirPort_set; -} - -/** Return 1 if we want to allow controllers to ask us directory - * requests via the controller interface, which doesn't require - * having any separate port open. */ -int -directory_permits_controller_requests(const or_options_t *options) -{ - return options->DirPort_set; -} - -/** Return 1 if we have no need to fetch new descriptors. This generally - * happens when we're not a dir cache and we haven't built any circuits - * lately. - */ -int -directory_too_idle_to_fetch_descriptors(const or_options_t *options, - time_t now) -{ - return !directory_caches_dir_info(options) && - !options->FetchUselessDescriptors && - rep_hist_circbuilding_dormant(now); -} - -/********************************************************************/ - -/* Used only by non-v1-auth dirservers: The v1 directory and - * runningrouters we'll serve when requested. */ - -/** The v1 directory we'll serve (as a cache or as an authority) if - * requested. */ -static cached_dir_t *cached_directory = NULL; -/** The v1 runningrouters document we'll serve (as a cache or as an authority) - * if requested. */ -static cached_dir_t cached_runningrouters; - -/** Map from flavor name to the cached_dir_t for the v3 consensuses that we're - * currently serving. */ -static strmap_t *cached_consensuses = NULL; - -/** Possibly replace the contents of d with the value of - * directory published on when, unless when is older than - * the last value, or too far in the future. - * - * Does not copy directory; frees it if it isn't used. - */ -static void -set_cached_dir(cached_dir_t *d, char *directory, time_t when) -{ - time_t now = time(NULL); - if (when<=d->published) { - log_info(LD_DIRSERV, "Ignoring old directory; not caching."); - tor_free(directory); - } else if (when>=now+ROUTER_MAX_AGE_TO_PUBLISH) { - log_info(LD_DIRSERV, "Ignoring future directory; not caching."); - tor_free(directory); - } else { - /* if (when>d->published && whendir); - d->dir = directory; - d->dir_len = strlen(directory); - tor_free(d->dir_z); - if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, - ZLIB_METHOD)) { - log_warn(LD_BUG,"Error compressing cached directory"); - } - d->published = when; - } -} - -/** Decrement the reference count on d, and free it if it no longer has - * any references. */ -void -cached_dir_decref(cached_dir_t *d) -{ - if (!d || --d->refcnt > 0) - return; - clear_cached_dir(d); - tor_free(d); -} - -/** Allocate and return a new cached_dir_t containing the string s, - * published at published. */ -cached_dir_t * -new_cached_dir(char *s, time_t published) -{ - cached_dir_t *d = tor_malloc_zero(sizeof(cached_dir_t)); - d->refcnt = 1; - d->dir = s; - d->dir_len = strlen(s); - d->published = published; - if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, - ZLIB_METHOD)) { - log_warn(LD_BUG, "Error compressing directory"); - } - return d; -} - -/** Remove all storage held in d, but do not free d itself. */ -static void -clear_cached_dir(cached_dir_t *d) -{ - tor_free(d->dir); - tor_free(d->dir_z); - memset(d, 0, sizeof(cached_dir_t)); -} - -/** Free all storage held by the cached_dir_t in d. */ -static void -free_cached_dir_(void *_d) -{ - cached_dir_t *d; - if (!_d) - return; - - d = (cached_dir_t *)_d; - cached_dir_decref(d); -} - -/** If we have no cached v1 directory, or it is older than published, - * then replace it with directory, published at published. - * - * If published is too old, do nothing. - * - * If is_running_routers, this is really a v1 running_routers - * document rather than a v1 directory. - */ -static void -dirserv_set_cached_directory(const char *directory, time_t published) -{ - - cached_dir_decref(cached_directory); - cached_directory = new_cached_dir(tor_strdup(directory), published); -} - -/** Replace the v3 consensus networkstatus of type flavor_name that - * we're serving with networkstatus, published at published. No - * validation is performed. */ -void -dirserv_set_cached_consensus_networkstatus(const char *networkstatus, - const char *flavor_name, - const digests_t *digests, - time_t published) -{ - cached_dir_t *new_networkstatus; - cached_dir_t *old_networkstatus; - if (!cached_consensuses) - cached_consensuses = strmap_new(); - - new_networkstatus = new_cached_dir(tor_strdup(networkstatus), published); - memcpy(&new_networkstatus->digests, digests, sizeof(digests_t)); - old_networkstatus = strmap_set(cached_consensuses, flavor_name, - new_networkstatus); - if (old_networkstatus) - cached_dir_decref(old_networkstatus); -} - -/** Remove any v1 info from the directory cache that was published - * too long ago. */ -void -dirserv_clear_old_v1_info(time_t now) -{ - if (cached_directory && - cached_directory->published < (now - MAX_V1_DIRECTORY_AGE)) { - cached_dir_decref(cached_directory); - cached_directory = NULL; - } - if (cached_runningrouters.published < (now - MAX_V1_RR_AGE)) { - clear_cached_dir(&cached_runningrouters); - } -} - -/** Helper: If we're an authority for the right directory version (v1) - * (based on auth_type), try to regenerate - * auth_src as appropriate and return it, falling back to cache_src on - * failure. If we're a cache, simply return cache_src. - */ -static cached_dir_t * -dirserv_pick_cached_dir_obj(cached_dir_t *cache_src, - cached_dir_t *auth_src, - time_t dirty, cached_dir_t *(*regenerate)(void), - const char *name, - dirinfo_type_t auth_type) -{ - const or_options_t *options = get_options(); - int authority = (auth_type == V1_DIRINFO && authdir_mode_v1(options)); - - if (!authority || authdir_mode_bridge(options)) { - return cache_src; - } else { - /* We're authoritative. */ - if (regenerate != NULL) { - if (dirty && dirty + DIR_REGEN_SLACK_TIME < time(NULL)) { - if (!(auth_src = regenerate())) { - log_err(LD_BUG, "Couldn't generate %s?", name); - exit(1); - } - } else { - log_info(LD_DIRSERV, "The %s is still clean; reusing.", name); - } - } - return auth_src ? auth_src : cache_src; - } -} - -/** Return the most recently generated encoded signed v1 directory, - * generating a new one as necessary. If not a v1 authoritative directory - * may return NULL if no directory is yet cached. */ -cached_dir_t * -dirserv_get_directory(void) -{ - return dirserv_pick_cached_dir_obj(cached_directory, the_directory, - the_directory_is_dirty, - dirserv_regenerate_directory, - "v1 server directory", V1_DIRINFO); -} - -/** Only called by v1 auth dirservers. - * Generate a fresh v1 directory; set the_directory and return a pointer - * to the new value. - */ -static cached_dir_t * -dirserv_regenerate_directory(void) -{ - /* XXXX 024 Get rid of this function if we can confirm that nobody's - * fetching these any longer */ - char *new_directory=NULL; - - if (dirserv_dump_directory_to_string(&new_directory, - get_server_identity_key())) { - log_warn(LD_BUG, "Error creating directory."); - tor_free(new_directory); - return NULL; - } - cached_dir_decref(the_directory); - the_directory = new_cached_dir(new_directory, time(NULL)); - log_info(LD_DIRSERV,"New directory (size %d) has been built.", - (int)the_directory->dir_len); - log_debug(LD_DIRSERV,"New directory (size %d):\n%s", - (int)the_directory->dir_len, the_directory->dir); - - the_directory_is_dirty = 0; - - /* Save the directory to disk so we re-load it quickly on startup. - */ - dirserv_set_cached_directory(the_directory->dir, time(NULL)); - - return the_directory; -} - -/** Only called by v1 auth dirservers. - * Replace the current running-routers list with a newly generated one. */ -static cached_dir_t * -generate_runningrouters(void) -{ - char *s=NULL; - char digest[DIGEST_LEN]; - char published[ISO_TIME_LEN+1]; - size_t len; - crypto_pk_t *private_key = get_server_identity_key(); - char *identity_pkey; /* Identity key, DER64-encoded. */ - size_t identity_pkey_len; - - if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, - &identity_pkey_len)<0) { - log_warn(LD_BUG,"write identity_pkey to string failed!"); - goto err; - } - format_iso_time(published, time(NULL)); - - len = 2048; - s = tor_malloc_zero(len); - tor_snprintf(s, len, - "network-status\n" - "published %s\n" - "router-status %s\n" - "dir-signing-key\n%s" - "directory-signature %s\n", - published, "", identity_pkey, - get_options()->Nickname); - tor_free(identity_pkey); - if (router_get_runningrouters_hash(s,digest)) { - log_warn(LD_BUG,"couldn't compute digest"); - goto err; - } - note_crypto_pk_op(SIGN_DIR); - if (router_append_dirobj_signature(s, len, digest, DIGEST_LEN, - private_key)<0) - goto err; - - set_cached_dir(&the_runningrouters, s, time(NULL)); - runningrouters_is_dirty = 0; - - return &the_runningrouters; - err: - tor_free(s); - return NULL; -} - -/** Set *rr to the most recently generated encoded signed - * running-routers list, generating a new one as necessary. Return the - * size of the directory on success, and 0 on failure. */ -cached_dir_t * -dirserv_get_runningrouters(void) -{ - return dirserv_pick_cached_dir_obj( - &cached_runningrouters, &the_runningrouters, - runningrouters_is_dirty, - generate_runningrouters, - "v1 network status list", V1_DIRINFO); -} - -/** Return the latest downloaded consensus networkstatus in encoded, signed, - * optionally compressed format, suitable for sending to clients. */ -cached_dir_t * -dirserv_get_consensus(const char *flavor_name) -{ - if (!cached_consensuses) - return NULL; - return strmap_get(cached_consensuses, flavor_name); -} - -/** If a router's uptime is at least this value, then it is always - * considered stable, regardless of the rest of the network. This - * way we resist attacks where an attacker doubles the size of the - * network using allegedly high-uptime nodes, displacing all the - * current guards. */ -#define UPTIME_TO_GUARANTEE_STABLE (3600*24*30) -/** If a router's MTBF is at least this value, then it is always stable. - * See above. (Corresponds to about 7 days for current decay rates.) */ -#define MTBF_TO_GUARANTEE_STABLE (60*60*24*5) -/** Similarly, every node with at least this much weighted time known can be - * considered familiar enough to be a guard. Corresponds to about 20 days for - * current decay rates. - */ -#define TIME_KNOWN_TO_GUARANTEE_FAMILIAR (8*24*60*60) -/** Similarly, every node with sufficient WFU is around enough to be a guard. - */ -#define WFU_TO_GUARANTEE_GUARD (0.98) - -/* Thresholds for server performance: set by - * dirserv_compute_performance_thresholds, and used by - * generate_v2_networkstatus */ - -/** Any router with an uptime of at least this value is stable. */ -static uint32_t stable_uptime = 0; /* start at a safe value */ -/** Any router with an mtbf of at least this value is stable. */ -static double stable_mtbf = 0.0; -/** If true, we have measured enough mtbf info to look at stable_mtbf rather - * than stable_uptime. */ -static int enough_mtbf_info = 0; -/** Any router with a weighted fractional uptime of at least this much might - * be good as a guard. */ -static double guard_wfu = 0.0; -/** Don't call a router a guard unless we've known about it for at least this - * many seconds. */ -static long guard_tk = 0; -/** Any router with a bandwidth at least this high is "Fast" */ -static uint32_t fast_bandwidth_kb = 0; -/** If exits can be guards, then all guards must have a bandwidth this - * high. */ -static uint32_t guard_bandwidth_including_exits_kb = 0; -/** If exits can't be guards, then all guards must have a bandwidth this - * high. */ -static uint32_t guard_bandwidth_excluding_exits_kb = 0; - -/** Helper: estimate the uptime of a router given its stated uptime and the - * amount of time since it last stated its stated uptime. */ -static INLINE long -real_uptime(const routerinfo_t *router, time_t now) -{ - if (now < router->cache_info.published_on) - return router->uptime; - else - return router->uptime + (now - router->cache_info.published_on); -} - -/** Return 1 if router is not suitable for these parameters, else 0. - * If need_uptime is non-zero, we require a minimum uptime. - * If need_capacity is non-zero, we require a minimum advertised - * bandwidth. - */ -static int -dirserv_thinks_router_is_unreliable(time_t now, - routerinfo_t *router, - int need_uptime, int need_capacity) -{ - if (need_uptime) { - if (!enough_mtbf_info) { - /* XXX024 Once most authorities are on v3, we should change the rule from - * "use uptime if we don't have mtbf data" to "don't advertise Stable on - * v3 if we don't have enough mtbf data." Or maybe not, since if we ever - * hit a point where we need to reset a lot of authorities at once, - * none of them would be in a position to declare Stable. - */ - long uptime = real_uptime(router, now); - if ((unsigned)uptime < stable_uptime && - (unsigned)uptime < UPTIME_TO_GUARANTEE_STABLE) - return 1; - } else { - double mtbf = - rep_hist_get_stability(router->cache_info.identity_digest, now); - if (mtbf < stable_mtbf && - mtbf < MTBF_TO_GUARANTEE_STABLE) - return 1; - } - } - if (need_capacity) { - uint32_t bw_kb = dirserv_get_credible_bandwidth_kb(router); - if (bw_kb < fast_bandwidth_kb) - return 1; - } - return 0; -} - -/** Return true iff router should be assigned the "HSDir" flag. - * Right now this means it advertises support for it, it has a high - * uptime, it has a DirPort open, and it's currently considered Running. - * - * This function needs to be called after router-\>is_running has - * been set. - */ -static int -dirserv_thinks_router_is_hs_dir(const routerinfo_t *router, - const node_t *node, time_t now) -{ - - long uptime; - - /* If we haven't been running for at least - * get_options()->MinUptimeHidServDirectoryV2 seconds, we can't - * have accurate data telling us a relay has been up for at least - * that long. We also want to allow a bit of slack: Reachability - * tests aren't instant. If we haven't been running long enough, - * trust the relay. */ - - if (stats_n_seconds_working > - get_options()->MinUptimeHidServDirectoryV2 * 1.1) - uptime = MIN(rep_hist_get_uptime(router->cache_info.identity_digest, now), - real_uptime(router, now)); - else - uptime = real_uptime(router, now); - - /* XXX We shouldn't need to check dir_port, but we do because of - * bug 1693. In the future, once relays set wants_to_be_hs_dir - * correctly, we can revert to only checking dir_port if router's - * version is too old. */ - /* XXX Unfortunately, we need to keep checking dir_port until all - * *clients* suffering from bug 2722 are obsolete. The first version - * to fix the bug was 0.2.2.25-alpha. */ - return (router->wants_to_be_hs_dir && router->dir_port && - uptime >= get_options()->MinUptimeHidServDirectoryV2 && - node->is_running); -} - -/** Don't consider routers with less bandwidth than this when computing - * thresholds. */ -#define ABSOLUTE_MIN_BW_VALUE_TO_CONSIDER_KB 4 - -/** Helper for dirserv_compute_performance_thresholds(): Decide whether to - * include a router in our calculations, and return true iff we should; the - * require_mbw parameter is passed in by - * dirserv_compute_performance_thresholds() and controls whether we ever - * count routers with only advertised bandwidths */ -static int -router_counts_toward_thresholds(const node_t *node, time_t now, - const digestmap_t *omit_as_sybil, - int require_mbw) -{ - /* Have measured bw? */ - int have_mbw = - dirserv_has_measured_bw(node->identity); - uint64_t min_bw_kb = ABSOLUTE_MIN_BW_VALUE_TO_CONSIDER_KB; - const or_options_t *options = get_options(); - - if (options->TestingTorNetwork) { - min_bw_kb = (int64_t)options->TestingMinExitFlagThreshold / 1000; - } - - return node->ri && router_is_active(node->ri, node, now) && - !digestmap_get(omit_as_sybil, node->identity) && - (dirserv_get_credible_bandwidth_kb(node->ri) >= min_bw_kb) && - (have_mbw || !require_mbw); -} - -/** Look through the routerlist, the Mean Time Between Failure history, and - * the Weighted Fractional Uptime history, and use them to set thresholds for - * the Stable, Fast, and Guard flags. Update the fields stable_uptime, - * stable_mtbf, enough_mtbf_info, guard_wfu, guard_tk, fast_bandwidth, - * guard_bandwidth_including_exits, and guard_bandwidth_excluding_exits. - * - * Also, set the is_exit flag of each router appropriately. */ -static void -dirserv_compute_performance_thresholds(routerlist_t *rl, - digestmap_t *omit_as_sybil) -{ - int n_active, n_active_nonexit, n_familiar; - uint32_t *uptimes, *bandwidths_kb, *bandwidths_excluding_exits_kb; - long *tks; - double *mtbfs, *wfus; - time_t now = time(NULL); - const or_options_t *options = get_options(); - - /* Require mbw? */ - int require_mbw = - (routers_with_measured_bw > - options->MinMeasuredBWsForAuthToIgnoreAdvertised) ? 1 : 0; - - /* initialize these all here, in case there are no routers */ - stable_uptime = 0; - stable_mtbf = 0; - fast_bandwidth_kb = 0; - guard_bandwidth_including_exits_kb = 0; - guard_bandwidth_excluding_exits_kb = 0; - guard_tk = 0; - guard_wfu = 0; - - /* Initialize arrays that will hold values for each router. We'll - * sort them and use that to compute thresholds. */ - n_active = n_active_nonexit = 0; - /* Uptime for every active router. */ - uptimes = tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); - /* Bandwidth for every active router. */ - bandwidths_kb = tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); - /* Bandwidth for every active non-exit router. */ - bandwidths_excluding_exits_kb = - tor_malloc(sizeof(uint32_t)*smartlist_len(rl->routers)); - /* Weighted mean time between failure for each active router. */ - mtbfs = tor_malloc(sizeof(double)*smartlist_len(rl->routers)); - /* Time-known for each active router. */ - tks = tor_malloc(sizeof(long)*smartlist_len(rl->routers)); - /* Weighted fractional uptime for each active router. */ - wfus = tor_malloc(sizeof(double)*smartlist_len(rl->routers)); - - nodelist_assert_ok(); - - /* Now, fill in the arrays. */ - SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { - if (options->BridgeAuthoritativeDir && - node->ri && - node->ri->purpose != ROUTER_PURPOSE_BRIDGE) - continue; - if (router_counts_toward_thresholds(node, now, omit_as_sybil, - require_mbw)) { - routerinfo_t *ri = node->ri; - const char *id = node->identity; - uint32_t bw_kb; - node->is_exit = (!router_exit_policy_rejects_all(ri) && - exit_policy_is_general_exit(ri->exit_policy)); - uptimes[n_active] = (uint32_t)real_uptime(ri, now); - mtbfs[n_active] = rep_hist_get_stability(id, now); - tks [n_active] = rep_hist_get_weighted_time_known(id, now); - bandwidths_kb[n_active] = bw_kb = dirserv_get_credible_bandwidth_kb(ri); - if (!node->is_exit || node->is_bad_exit) { - bandwidths_excluding_exits_kb[n_active_nonexit] = bw_kb; - ++n_active_nonexit; - } - ++n_active; - } - } SMARTLIST_FOREACH_END(node); - - /* Now, compute thresholds. */ - if (n_active) { - /* The median uptime is stable. */ - stable_uptime = median_uint32(uptimes, n_active); - /* The median mtbf is stable, if we have enough mtbf info */ - stable_mtbf = median_double(mtbfs, n_active); - /* The 12.5th percentile bandwidth is fast. */ - fast_bandwidth_kb = find_nth_uint32(bandwidths_kb, n_active, n_active/8); - /* (Now bandwidths is sorted.) */ - if (fast_bandwidth_kb < ROUTER_REQUIRED_MIN_BANDWIDTH/(2 * 1000)) - fast_bandwidth_kb = bandwidths_kb[n_active/4]; - guard_bandwidth_including_exits_kb = bandwidths_kb[(n_active-1)/2]; - guard_tk = find_nth_long(tks, n_active, n_active/8); - } - - if (guard_tk > TIME_KNOWN_TO_GUARANTEE_FAMILIAR) - guard_tk = TIME_KNOWN_TO_GUARANTEE_FAMILIAR; - - { - /* We can vote on a parameter for the minimum and maximum. */ -#define ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG 4 - int32_t min_fast_kb, max_fast_kb, min_fast, max_fast; - min_fast = networkstatus_get_param(NULL, "FastFlagMinThreshold", - ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG, - ABSOLUTE_MIN_VALUE_FOR_FAST_FLAG, - INT32_MAX); - if (options->TestingTorNetwork) { - min_fast = (int32_t)options->TestingMinFastFlagThreshold; - } - max_fast = networkstatus_get_param(NULL, "FastFlagMaxThreshold", - INT32_MAX, min_fast, INT32_MAX); - min_fast_kb = min_fast / 1000; - max_fast_kb = max_fast / 1000; - - if (fast_bandwidth_kb < (uint32_t)min_fast_kb) - fast_bandwidth_kb = min_fast_kb; - if (fast_bandwidth_kb > (uint32_t)max_fast_kb) - fast_bandwidth_kb = max_fast_kb; - } - /* Protect sufficiently fast nodes from being pushed out of the set - * of Fast nodes. */ - if (options->AuthDirFastGuarantee && - fast_bandwidth_kb > options->AuthDirFastGuarantee/1000) - fast_bandwidth_kb = (uint32_t)options->AuthDirFastGuarantee/1000; - - /* Now that we have a time-known that 7/8 routers are known longer than, - * fill wfus with the wfu of every such "familiar" router. */ - n_familiar = 0; - - SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), node_t *, node) { - if (router_counts_toward_thresholds(node, now, - omit_as_sybil, require_mbw)) { - routerinfo_t *ri = node->ri; - const char *id = ri->cache_info.identity_digest; - long tk = rep_hist_get_weighted_time_known(id, now); - if (tk < guard_tk) - continue; - wfus[n_familiar++] = rep_hist_get_weighted_fractional_uptime(id, now); - } - } SMARTLIST_FOREACH_END(node); - if (n_familiar) - guard_wfu = median_double(wfus, n_familiar); - if (guard_wfu > WFU_TO_GUARANTEE_GUARD) - guard_wfu = WFU_TO_GUARANTEE_GUARD; - - enough_mtbf_info = rep_hist_have_measured_enough_stability(); - - if (n_active_nonexit) { - guard_bandwidth_excluding_exits_kb = - median_uint32(bandwidths_excluding_exits_kb, n_active_nonexit); - } - - log_info(LD_DIRSERV, - "Cutoffs: For Stable, %lu sec uptime, %lu sec MTBF. " - "For Fast: %lu kilobytes/sec. " - "For Guard: WFU %.03f%%, time-known %lu sec, " - "and bandwidth %lu or %lu kilobytes/sec. " - "We%s have enough stability data.", - (unsigned long)stable_uptime, - (unsigned long)stable_mtbf, - (unsigned long)fast_bandwidth_kb, - guard_wfu*100, - (unsigned long)guard_tk, - (unsigned long)guard_bandwidth_including_exits_kb, - (unsigned long)guard_bandwidth_excluding_exits_kb, - enough_mtbf_info ? "" : " don't "); - - tor_free(uptimes); - tor_free(mtbfs); - tor_free(bandwidths_kb); - tor_free(bandwidths_excluding_exits_kb); - tor_free(tks); - tor_free(wfus); -} - -/* Use dirserv_compute_performance_thresholds() to compute the thresholds - * for the status flags, specifically for bridges. - * - * This is only called by a Bridge Authority from - * networkstatus_getinfo_by_purpose(). - */ -void -dirserv_compute_bridge_flag_thresholds(routerlist_t *rl) -{ - - digestmap_t *omit_as_sybil = digestmap_new(); - dirserv_compute_performance_thresholds(rl, omit_as_sybil); - digestmap_free(omit_as_sybil, NULL); -} - -/** Measured bandwidth cache entry */ -typedef struct mbw_cache_entry_s { - long mbw_kb; - time_t as_of; -} mbw_cache_entry_t; - -/** Measured bandwidth cache - keys are identity_digests, values are - * mbw_cache_entry_t *. */ -static digestmap_t *mbw_cache = NULL; - -/** Store a measured bandwidth cache entry when reading the measured - * bandwidths file. */ -STATIC void -dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line, - time_t as_of) -{ - mbw_cache_entry_t *e = NULL; - - tor_assert(parsed_line); - - /* Allocate a cache if we need */ - if (!mbw_cache) mbw_cache = digestmap_new(); - - /* Check if we have an existing entry */ - e = digestmap_get(mbw_cache, parsed_line->node_id); - /* If we do, we can re-use it */ - if (e) { - /* Check that we really are newer, and update */ - if (as_of > e->as_of) { - e->mbw_kb = parsed_line->bw_kb; - e->as_of = as_of; - } - } else { - /* We'll have to insert a new entry */ - e = tor_malloc(sizeof(*e)); - e->mbw_kb = parsed_line->bw_kb; - e->as_of = as_of; - digestmap_set(mbw_cache, parsed_line->node_id, e); - } -} - -/** Clear and free the measured bandwidth cache */ -STATIC void -dirserv_clear_measured_bw_cache(void) -{ - if (mbw_cache) { - /* Free the map and all entries */ - digestmap_free(mbw_cache, tor_free_); - mbw_cache = NULL; - } -} - -/** Scan the measured bandwidth cache and remove expired entries */ -STATIC void -dirserv_expire_measured_bw_cache(time_t now) -{ - - if (mbw_cache) { - /* Iterate through the cache and check each entry */ - DIGESTMAP_FOREACH_MODIFY(mbw_cache, k, mbw_cache_entry_t *, e) { - if (now > e->as_of + MAX_MEASUREMENT_AGE) { - tor_free(e); - MAP_DEL_CURRENT(k); - } - } DIGESTMAP_FOREACH_END; - - /* Check if we cleared the whole thing and free if so */ - if (digestmap_size(mbw_cache) == 0) { - digestmap_free(mbw_cache, tor_free_); - mbw_cache = 0; - } - } -} - -/** Get the current size of the measured bandwidth cache */ -STATIC int -dirserv_get_measured_bw_cache_size(void) -{ - if (mbw_cache) return digestmap_size(mbw_cache); - else return 0; -} - -/** Query the cache by identity digest, return value indicates whether - * we found it. The bw_out and as_of_out pointers receive the cached - * bandwidth value and the time it was cached if not NULL. */ -STATIC int -dirserv_query_measured_bw_cache_kb(const char *node_id, long *bw_kb_out, - time_t *as_of_out) -{ - mbw_cache_entry_t *v = NULL; - int rv = 0; - - if (mbw_cache && node_id) { - v = digestmap_get(mbw_cache, node_id); - if (v) { - /* Found something */ - rv = 1; - if (bw_kb_out) *bw_kb_out = v->mbw_kb; - if (as_of_out) *as_of_out = v->as_of; - } - } - - return rv; -} - -/** Predicate wrapper for dirserv_query_measured_bw_cache() */ -STATIC int -dirserv_has_measured_bw(const char *node_id) -{ - return dirserv_query_measured_bw_cache_kb(node_id, NULL, NULL); -} - -/** Get the best estimate of a router's bandwidth for dirauth purposes, - * preferring measured to advertised values if available. */ - -static uint32_t -dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri) -{ - uint32_t bw_kb = 0; - /* - * Yeah, measured bandwidths in measured_bw_line_t are (implicitly - * signed) longs and the ones router_get_advertised_bandwidth() returns - * are uint32_t. - */ - long mbw_kb = 0; - - if (ri) { - /* - * * First try to see if we have a measured bandwidth; don't bother with - * as_of_out here, on the theory that a stale measured bandwidth is still - * better to trust than an advertised one. - */ - if (dirserv_query_measured_bw_cache_kb(ri->cache_info.identity_digest, - &mbw_kb, NULL)) { - /* Got one! */ - bw_kb = (uint32_t)mbw_kb; - } else { - /* If not, fall back to advertised */ - bw_kb = router_get_advertised_bandwidth(ri) / 1000; - } - } - - return bw_kb; -} - -/** Look through the routerlist, and using the measured bandwidth cache count - * how many measured bandwidths we know. This is used to decide whether we - * ever trust advertised bandwidths for purposes of assigning flags. */ -static void -dirserv_count_measured_bws(routerlist_t *rl) -{ - /* Initialize this first */ - routers_with_measured_bw = 0; - - tor_assert(rl); - tor_assert(rl->routers); - - /* Iterate over the routerlist and count measured bandwidths */ - SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) { - /* Check if we know a measured bandwidth for this one */ - if (dirserv_has_measured_bw(ri->cache_info.identity_digest)) { - ++routers_with_measured_bw; - } - } SMARTLIST_FOREACH_END(ri); -} - -/** Return the bandwidth we believe for assigning flags; prefer measured - * over advertised, and if we have above a threshold quantity of measured - * bandwidths, we don't want to ever give flags to unmeasured routers, so - * return 0. */ -static uint32_t -dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri) -{ - int threshold; - uint32_t bw_kb = 0; - long mbw_kb; - - tor_assert(ri); - /* Check if we have a measured bandwidth, and check the threshold if not */ - if (!(dirserv_query_measured_bw_cache_kb(ri->cache_info.identity_digest, - &mbw_kb, NULL))) { - threshold = get_options()->MinMeasuredBWsForAuthToIgnoreAdvertised; - if (routers_with_measured_bw > threshold) { - /* Return zero for unmeasured bandwidth if we are above threshold */ - bw_kb = 0; - } else { - /* Return an advertised bandwidth otherwise */ - bw_kb = router_get_advertised_bandwidth_capped(ri) / 1000; - } - } else { - /* We have the measured bandwidth in mbw */ - bw_kb = (uint32_t)mbw_kb; - } - - return bw_kb; -} - -/** Give a statement of our current performance thresholds for inclusion - * in a vote document. */ -char * -dirserv_get_flag_thresholds_line(void) -{ - char *result=NULL; - const int measured_threshold = - get_options()->MinMeasuredBWsForAuthToIgnoreAdvertised; - const int enough_measured_bw = routers_with_measured_bw > measured_threshold; - - tor_asprintf(&result, - "stable-uptime=%lu stable-mtbf=%lu " - "fast-speed=%lu " - "guard-wfu=%.03f%% guard-tk=%lu " - "guard-bw-inc-exits=%lu guard-bw-exc-exits=%lu " - "enough-mtbf=%d ignoring-advertised-bws=%d", - (unsigned long)stable_uptime, - (unsigned long)stable_mtbf, - (unsigned long)fast_bandwidth_kb*1000, - guard_wfu*100, - (unsigned long)guard_tk, - (unsigned long)guard_bandwidth_including_exits_kb*1000, - (unsigned long)guard_bandwidth_excluding_exits_kb*1000, - enough_mtbf_info ? 1 : 0, - enough_measured_bw ? 1 : 0); - - return result; -} - -/** Given a platform string as in a routerinfo_t (possibly null), return a - * newly allocated version string for a networkstatus document, or NULL if the - * platform doesn't give a Tor version. */ -static char * -version_from_platform(const char *platform) -{ - if (platform && !strcmpstart(platform, "Tor ")) { - const char *eos = find_whitespace(platform+4); - if (eos && !strcmpstart(eos, " (r")) { - /* XXXX Unify this logic with the other version extraction - * logic in routerparse.c. */ - eos = find_whitespace(eos+1); - } - if (eos) { - return tor_strndup(platform, eos-platform); - } - } - return NULL; -} - -/** Helper: write the router-status information in rs into a newly - * allocated character buffer. Use the same format as in network-status - * documents. If version is non-NULL, add a "v" line for the platform. - * Return 0 on success, -1 on failure. - * - * The format argument has one of the following values: - * NS_V2 - Output an entry suitable for a V2 NS opinion document - * NS_V3_CONSENSUS - Output the first portion of a V3 NS consensus entry - * NS_V3_CONSENSUS_MICRODESC - Output the first portion of a V3 microdesc - * consensus entry. - * NS_V3_VOTE - Output a complete V3 NS vote. If vrs is present, - * it contains additional information for the vote. - * NS_CONTROL_PORT - Output a NS document for the control port - */ -char * -routerstatus_format_entry(const routerstatus_t *rs, const char *version, - routerstatus_format_type_t format, - const vote_routerstatus_t *vrs) -{ - char *summary; - char *result = NULL; - - char published[ISO_TIME_LEN+1]; - char identity64[BASE64_DIGEST_LEN+1]; - char digest64[BASE64_DIGEST_LEN+1]; - smartlist_t *chunks = NULL; - - format_iso_time(published, rs->published_on); - digest_to_base64(identity64, rs->identity_digest); - digest_to_base64(digest64, rs->descriptor_digest); - - chunks = smartlist_new(); - smartlist_add_asprintf(chunks, - "r %s %s %s%s%s %s %d %d\n", - rs->nickname, - identity64, - (format==NS_V3_CONSENSUS_MICRODESC)?"":digest64, - (format==NS_V3_CONSENSUS_MICRODESC)?"":" ", - published, - fmt_addr32(rs->addr), - (int)rs->or_port, - (int)rs->dir_port); - - /* TODO: Maybe we want to pass in what we need to build the rest of - * this here, instead of in the caller. Then we could use the - * networkstatus_type_t values, with an additional control port value - * added -MP */ - - /* V3 microdesc consensuses don't have "a" lines. */ - if (format == NS_V3_CONSENSUS_MICRODESC) - goto done; - - /* Possible "a" line. At most one for now. */ - if (!tor_addr_is_null(&rs->ipv6_addr)) { - smartlist_add_asprintf(chunks, "a %s\n", - fmt_addrport(&rs->ipv6_addr, rs->ipv6_orport)); - } - - if (format == NS_V3_CONSENSUS) - goto done; - - smartlist_add_asprintf(chunks, - "s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", - /* These must stay in alphabetical order. */ - rs->is_authority?" Authority":"", - rs->is_bad_directory?" BadDirectory":"", - rs->is_bad_exit?" BadExit":"", - rs->is_exit?" Exit":"", - rs->is_fast?" Fast":"", - rs->is_possible_guard?" Guard":"", - rs->is_hs_dir?" HSDir":"", - rs->is_named?" Named":"", - rs->is_flagged_running?" Running":"", - rs->is_stable?" Stable":"", - rs->is_unnamed?" Unnamed":"", - (rs->dir_port!=0)?" V2Dir":"", - rs->is_valid?" Valid":""); - - /* length of "opt v \n" */ -#define V_LINE_OVERHEAD 7 - if (version && strlen(version) < MAX_V_LINE_LEN - V_LINE_OVERHEAD) { - smartlist_add_asprintf(chunks, "v %s\n", version); - } - - if (format != NS_V2) { - const routerinfo_t* desc = router_get_by_id_digest(rs->identity_digest); - uint32_t bw_kb; - - if (format != NS_CONTROL_PORT) { - /* Blow up more or less nicely if we didn't get anything or not the - * thing we expected. - */ - if (!desc) { - char id[HEX_DIGEST_LEN+1]; - char dd[HEX_DIGEST_LEN+1]; - - base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN); - base16_encode(dd, sizeof(dd), rs->descriptor_digest, DIGEST_LEN); - log_warn(LD_BUG, "Cannot get any descriptor for %s " - "(wanted descriptor %s).", - id, dd); - goto err; - } - - /* This assert could fire for the control port, because - * it can request NS documents before all descriptors - * have been fetched. Therefore, we only do this test when - * format != NS_CONTROL_PORT. */ - if (tor_memneq(desc->cache_info.signed_descriptor_digest, - rs->descriptor_digest, - DIGEST_LEN)) { - char rl_d[HEX_DIGEST_LEN+1]; - char rs_d[HEX_DIGEST_LEN+1]; - char id[HEX_DIGEST_LEN+1]; - - base16_encode(rl_d, sizeof(rl_d), - desc->cache_info.signed_descriptor_digest, DIGEST_LEN); - base16_encode(rs_d, sizeof(rs_d), rs->descriptor_digest, DIGEST_LEN); - base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN); - log_err(LD_BUG, "descriptor digest in routerlist does not match " - "the one in routerstatus: %s vs %s " - "(router %s)\n", - rl_d, rs_d, id); - - tor_assert(tor_memeq(desc->cache_info.signed_descriptor_digest, - rs->descriptor_digest, - DIGEST_LEN)); - } - } - - if (format == NS_CONTROL_PORT && rs->has_bandwidth) { - bw_kb = rs->bandwidth_kb; - } else { - tor_assert(desc); - bw_kb = router_get_advertised_bandwidth_capped(desc) / 1000; - } - smartlist_add_asprintf(chunks, - "w Bandwidth=%d", bw_kb); - - if (format == NS_V3_VOTE && vrs && vrs->has_measured_bw) { - smartlist_add_asprintf(chunks, - " Measured=%d", vrs->measured_bw_kb); - } - smartlist_add(chunks, tor_strdup("\n")); - - if (desc) { - summary = policy_summarize(desc->exit_policy, AF_INET); - smartlist_add_asprintf(chunks, "p %s\n", summary); - tor_free(summary); - } - } - - done: - result = smartlist_join_strings(chunks, "", 0, NULL); - - err: - if (chunks) { - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - } - - return result; -} - -/** Helper for sorting: compares two routerinfos first by address, and then by - * descending order of "usefulness". (An authority is more useful than a - * non-authority; a running router is more useful than a non-running router; - * and a router with more bandwidth is more useful than one with less.) - **/ -static int -compare_routerinfo_by_ip_and_bw_(const void **a, const void **b) -{ - routerinfo_t *first = *(routerinfo_t **)a, *second = *(routerinfo_t **)b; - int first_is_auth, second_is_auth; - uint32_t bw_kb_first, bw_kb_second; - const node_t *node_first, *node_second; - int first_is_running, second_is_running; - - /* we return -1 if first should appear before second... that is, - * if first is a better router. */ - if (first->addr < second->addr) - return -1; - else if (first->addr > second->addr) - return 1; - - /* Potentially, this next bit could cause k n lg n memeq calls. But in - * reality, we will almost never get here, since addresses will usually be - * different. */ - - first_is_auth = - router_digest_is_trusted_dir(first->cache_info.identity_digest); - second_is_auth = - router_digest_is_trusted_dir(second->cache_info.identity_digest); - - if (first_is_auth && !second_is_auth) - return -1; - else if (!first_is_auth && second_is_auth) - return 1; - - node_first = node_get_by_id(first->cache_info.identity_digest); - node_second = node_get_by_id(second->cache_info.identity_digest); - first_is_running = node_first && node_first->is_running; - second_is_running = node_second && node_second->is_running; - - if (first_is_running && !second_is_running) - return -1; - else if (!first_is_running && second_is_running) - return 1; - - bw_kb_first = dirserv_get_bandwidth_for_router_kb(first); - bw_kb_second = dirserv_get_bandwidth_for_router_kb(second); - - if (bw_kb_first > bw_kb_second) - return -1; - else if (bw_kb_first < bw_kb_second) - return 1; - - /* They're equal! Compare by identity digest, so there's a - * deterministic order and we avoid flapping. */ - return fast_memcmp(first->cache_info.identity_digest, - second->cache_info.identity_digest, - DIGEST_LEN); -} - -/** Given a list of routerinfo_t in routers, return a new digestmap_t - * whose keys are the identity digests of those routers that we're going to - * exclude for Sybil-like appearance. */ -static digestmap_t * -get_possible_sybil_list(const smartlist_t *routers) -{ - const or_options_t *options = get_options(); - digestmap_t *omit_as_sybil; - smartlist_t *routers_by_ip = smartlist_new(); - uint32_t last_addr; - int addr_count; - /* Allow at most this number of Tor servers on a single IP address, ... */ - int max_with_same_addr = options->AuthDirMaxServersPerAddr; - /* ... unless it's a directory authority, in which case allow more. */ - int max_with_same_addr_on_authority = options->AuthDirMaxServersPerAuthAddr; - if (max_with_same_addr <= 0) - max_with_same_addr = INT_MAX; - if (max_with_same_addr_on_authority <= 0) - max_with_same_addr_on_authority = INT_MAX; - - smartlist_add_all(routers_by_ip, routers); - smartlist_sort(routers_by_ip, compare_routerinfo_by_ip_and_bw_); - omit_as_sybil = digestmap_new(); - - last_addr = 0; - addr_count = 0; - SMARTLIST_FOREACH_BEGIN(routers_by_ip, routerinfo_t *, ri) { - if (last_addr != ri->addr) { - last_addr = ri->addr; - addr_count = 1; - } else if (++addr_count > max_with_same_addr) { - if (!router_addr_is_trusted_dir(ri->addr) || - addr_count > max_with_same_addr_on_authority) - digestmap_set(omit_as_sybil, ri->cache_info.identity_digest, ri); - } - } SMARTLIST_FOREACH_END(ri); - - smartlist_free(routers_by_ip); - return omit_as_sybil; -} - -/** Return non-zero iff a relay running the Tor version specified in - * platform is suitable for use as a potential entry guard. */ -static int -is_router_version_good_for_possible_guard(const char *platform) -{ - static int parsed_versions_initialized = 0; - static tor_version_t first_good_0_2_1_guard_version; - static tor_version_t first_good_0_2_2_guard_version; - static tor_version_t first_good_later_guard_version; - - tor_version_t router_version; - - /* XXX024 This block should be extracted into its own function. */ - /* XXXX Begin code copied from tor_version_as_new_as (in routerparse.c) */ - { - char *s, *s2, *start; - char tmp[128]; - - tor_assert(platform); - - /* nonstandard Tor; be safe and say yes */ - if (strcmpstart(platform,"Tor ")) - return 1; - - start = (char *)eat_whitespace(platform+3); - if (!*start) return 0; - s = (char *)find_whitespace(start); /* also finds '\0', which is fine */ - s2 = (char*)eat_whitespace(s); - if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-")) - s = (char*)find_whitespace(s2); - - if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */ - return 0; - strlcpy(tmp, start, s-start+1); - - if (tor_version_parse(tmp, &router_version)<0) { - log_info(LD_DIR,"Router version '%s' unparseable.",tmp); - return 1; /* be safe and say yes */ - } - } - /* XXXX End code copied from tor_version_as_new_as (in routerparse.c) */ - - if (!parsed_versions_initialized) { - /* CVE-2011-2769 was fixed on the relay side in Tor versions - * 0.2.1.31, 0.2.2.34, and 0.2.3.6-alpha. */ - tor_assert(tor_version_parse("0.2.1.31", - &first_good_0_2_1_guard_version)>=0); - tor_assert(tor_version_parse("0.2.2.34", - &first_good_0_2_2_guard_version)>=0); - tor_assert(tor_version_parse("0.2.3.6-alpha", - &first_good_later_guard_version)>=0); - - /* Don't parse these constant version strings once for every relay - * for every vote. */ - parsed_versions_initialized = 1; - } - - return ((tor_version_same_series(&first_good_0_2_1_guard_version, - &router_version) && - tor_version_compare(&first_good_0_2_1_guard_version, - &router_version) <= 0) || - (tor_version_same_series(&first_good_0_2_2_guard_version, - &router_version) && - tor_version_compare(&first_good_0_2_2_guard_version, - &router_version) <= 0) || - (tor_version_compare(&first_good_later_guard_version, - &router_version) <= 0)); -} - -/** Extract status information from ri and from other authority - * functions and store it in rs>. If naming, consider setting - * the named flag in rs. - * - * We assume that ri-\>is_running has already been set, e.g. by - * dirserv_set_router_is_running(ri, now); - */ -void -set_routerstatus_from_routerinfo(routerstatus_t *rs, - node_t *node, - routerinfo_t *ri, - time_t now, - int naming, int listbadexits, - int listbaddirs, int vote_on_hsdirs) -{ - const or_options_t *options = get_options(); - uint32_t routerbw_kb = dirserv_get_credible_bandwidth_kb(ri); - - memset(rs, 0, sizeof(routerstatus_t)); - - rs->is_authority = - router_digest_is_trusted_dir(ri->cache_info.identity_digest); - - /* Already set by compute_performance_thresholds. */ - rs->is_exit = node->is_exit; - rs->is_stable = node->is_stable = - router_is_active(ri, node, now) && - !dirserv_thinks_router_is_unreliable(now, ri, 1, 0); - rs->is_fast = node->is_fast = - router_is_active(ri, node, now) && - !dirserv_thinks_router_is_unreliable(now, ri, 0, 1); - rs->is_flagged_running = node->is_running; /* computed above */ - - if (naming) { - uint32_t name_status = dirserv_get_name_status( - node->identity, ri->nickname); - rs->is_named = (naming && (name_status & FP_NAMED)) ? 1 : 0; - rs->is_unnamed = (naming && (name_status & FP_UNNAMED)) ? 1 : 0; - } - rs->is_valid = node->is_valid; - - if (node->is_fast && - ((options->AuthDirGuardBWGuarantee && - routerbw_kb >= options->AuthDirGuardBWGuarantee/1000) || - routerbw_kb >= MIN(guard_bandwidth_including_exits_kb, - guard_bandwidth_excluding_exits_kb)) && - is_router_version_good_for_possible_guard(ri->platform)) { - long tk = rep_hist_get_weighted_time_known( - node->identity, now); - double wfu = rep_hist_get_weighted_fractional_uptime( - node->identity, now); - rs->is_possible_guard = (wfu >= guard_wfu && tk >= guard_tk) ? 1 : 0; - } else { - rs->is_possible_guard = 0; - } - if (options->TestingTorNetwork && - routerset_contains_routerstatus(options->TestingDirAuthVoteGuard, - rs, 0)) { - rs->is_possible_guard = 1; - } - - rs->is_bad_directory = listbaddirs && node->is_bad_directory; - rs->is_bad_exit = listbadexits && node->is_bad_exit; - node->is_hs_dir = dirserv_thinks_router_is_hs_dir(ri, node, now); - rs->is_hs_dir = vote_on_hsdirs && node->is_hs_dir; - - if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME)) - rs->is_named = rs->is_unnamed = 0; - - rs->published_on = ri->cache_info.published_on; - memcpy(rs->identity_digest, node->identity, DIGEST_LEN); - memcpy(rs->descriptor_digest, ri->cache_info.signed_descriptor_digest, - DIGEST_LEN); - rs->addr = ri->addr; - strlcpy(rs->nickname, ri->nickname, sizeof(rs->nickname)); - rs->or_port = ri->or_port; - rs->dir_port = ri->dir_port; - if (options->AuthDirHasIPv6Connectivity == 1 && - !tor_addr_is_null(&ri->ipv6_addr) && - node->last_reachable6 >= now - REACHABLE_TIMEOUT) { - /* We're configured as having IPv6 connectivity. There's an IPv6 - OR port and it's reachable so copy it to the routerstatus. */ - tor_addr_copy(&rs->ipv6_addr, &ri->ipv6_addr); - rs->ipv6_orport = ri->ipv6_orport; - } -} - -/** Routerstatus rs is part of a group of routers that are on - * too narrow an IP-space. Clear out its flags: we don't want people - * using it. - */ -static void -clear_status_flags_on_sybil(routerstatus_t *rs) -{ - rs->is_authority = rs->is_exit = rs->is_stable = rs->is_fast = - rs->is_flagged_running = rs->is_named = rs->is_valid = - rs->is_hs_dir = rs->is_possible_guard = rs->is_bad_exit = - rs->is_bad_directory = 0; - /* FFFF we might want some mechanism to check later on if we - * missed zeroing any flags: it's easy to add a new flag but - * forget to add it to this clause. */ -} - -/** - * Helper function to parse out a line in the measured bandwidth file - * into a measured_bw_line_t output structure. Returns -1 on failure - * or 0 on success. - */ -STATIC int -measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line) -{ - char *line = tor_strdup(orig_line); - char *cp = line; - int got_bw = 0; - int got_node_id = 0; - char *strtok_state; /* lame sauce d'jour */ - cp = tor_strtok_r(cp, " \t", &strtok_state); - - if (!cp) { - log_warn(LD_DIRSERV, "Invalid line in bandwidth file: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - - if (orig_line[strlen(orig_line)-1] != '\n') { - log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - - do { - if (strcmpstart(cp, "bw=") == 0) { - int parse_ok = 0; - char *endptr; - if (got_bw) { - log_warn(LD_DIRSERV, "Double bw= in bandwidth file line: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - cp+=strlen("bw="); - - out->bw_kb = tor_parse_long(cp, 0, 0, LONG_MAX, &parse_ok, &endptr); - if (!parse_ok || (*endptr && !TOR_ISSPACE(*endptr))) { - log_warn(LD_DIRSERV, "Invalid bandwidth in bandwidth file line: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - got_bw=1; - } else if (strcmpstart(cp, "node_id=$") == 0) { - if (got_node_id) { - log_warn(LD_DIRSERV, "Double node_id= in bandwidth file line: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - cp+=strlen("node_id=$"); - - if (strlen(cp) != HEX_DIGEST_LEN || - base16_decode(out->node_id, DIGEST_LEN, cp, HEX_DIGEST_LEN)) { - log_warn(LD_DIRSERV, "Invalid node_id in bandwidth file line: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } - strlcpy(out->node_hex, cp, sizeof(out->node_hex)); - got_node_id=1; - } - } while ((cp = tor_strtok_r(NULL, " \t", &strtok_state))); - - if (got_bw && got_node_id) { - tor_free(line); - return 0; - } else { - log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s", - escaped(orig_line)); - tor_free(line); - return -1; - } -} - -/** - * Helper function to apply a parsed measurement line to a list - * of bandwidth statuses. Returns true if a line is found, - * false otherwise. - */ -STATIC int -measured_bw_line_apply(measured_bw_line_t *parsed_line, - smartlist_t *routerstatuses) -{ - vote_routerstatus_t *rs = NULL; - if (!routerstatuses) - return 0; - - rs = smartlist_bsearch(routerstatuses, parsed_line->node_id, - compare_digest_to_vote_routerstatus_entry); - - if (rs) { - rs->has_measured_bw = 1; - rs->measured_bw_kb = (uint32_t)parsed_line->bw_kb; - } else { - log_info(LD_DIRSERV, "Node ID %s not found in routerstatus list", - parsed_line->node_hex); - } - - return rs != NULL; -} - -/** - * Read the measured bandwidth file and apply it to the list of - * vote_routerstatus_t. Returns -1 on error, 0 otherwise. - */ -int -dirserv_read_measured_bandwidths(const char *from_file, - smartlist_t *routerstatuses) -{ - char line[256]; - FILE *fp = tor_fopen_cloexec(from_file, "r"); - int applied_lines = 0; - time_t file_time, now; - int ok; - - if (fp == NULL) { - log_warn(LD_CONFIG, "Can't open bandwidth file at configured location: %s", - from_file); - return -1; - } - - if (!fgets(line, sizeof(line), fp) - || !strlen(line) || line[strlen(line)-1] != '\n') { - log_warn(LD_DIRSERV, "Long or truncated time in bandwidth file: %s", - escaped(line)); - fclose(fp); - return -1; - } - - line[strlen(line)-1] = '\0'; - file_time = tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_DIRSERV, "Non-integer time in bandwidth file: %s", - escaped(line)); - fclose(fp); - return -1; - } - - now = time(NULL); - if ((now - file_time) > MAX_MEASUREMENT_AGE) { - log_warn(LD_DIRSERV, "Bandwidth measurement file stale. Age: %u", - (unsigned)(time(NULL) - file_time)); - fclose(fp); - return -1; - } - - if (routerstatuses) - smartlist_sort(routerstatuses, compare_vote_routerstatus_entries); - - while (!feof(fp)) { - measured_bw_line_t parsed_line; - if (fgets(line, sizeof(line), fp) && strlen(line)) { - if (measured_bw_line_parse(&parsed_line, line) != -1) { - /* Also cache the line for dirserv_get_bandwidth_for_router() */ - dirserv_cache_measured_bw(&parsed_line, file_time); - if (measured_bw_line_apply(&parsed_line, routerstatuses) > 0) - applied_lines++; - } - } - } - - /* Now would be a nice time to clean the cache, too */ - dirserv_expire_measured_bw_cache(now); - - fclose(fp); - log_info(LD_DIRSERV, - "Bandwidth measurement file successfully read. " - "Applied %d measurements.", applied_lines); - return 0; -} - -/** Return a new networkstatus_t* containing our current opinion. (For v3 - * authorities) */ -networkstatus_t * -dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, - authority_cert_t *cert) -{ - const or_options_t *options = get_options(); - networkstatus_t *v3_out = NULL; - uint32_t addr; - char *hostname = NULL, *client_versions = NULL, *server_versions = NULL; - const char *contact; - smartlist_t *routers, *routerstatuses; - char identity_digest[DIGEST_LEN]; - char signing_key_digest[DIGEST_LEN]; - int naming = options->NamingAuthoritativeDir; - int listbadexits = options->AuthDirListBadExits; - int listbaddirs = options->AuthDirListBadDirs; - int vote_on_hsdirs = options->VoteOnHidServDirectoriesV2; - routerlist_t *rl = router_get_routerlist(); - time_t now = time(NULL); - time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - networkstatus_voter_info_t *voter = NULL; - vote_timing_t timing; - digestmap_t *omit_as_sybil = NULL; - const int vote_on_reachability = running_long_enough_to_decide_unreachable(); - smartlist_t *microdescriptors = NULL; - - tor_assert(private_key); - tor_assert(cert); - - if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) { - log_warn(LD_NET, "Couldn't resolve my hostname"); - return NULL; - } - if (!hostname || !strchr(hostname, '.')) { - tor_free(hostname); - hostname = tor_dup_ip(addr); - } - if (crypto_pk_get_digest(private_key, signing_key_digest)<0) { - log_err(LD_BUG, "Error computing signing key digest"); - return NULL; - } - if (crypto_pk_get_digest(cert->identity_key, identity_digest)<0) { - log_err(LD_BUG, "Error computing identity key digest"); - return NULL; - } - - if (options->VersioningAuthoritativeDir) { - client_versions = format_versions_list(options->RecommendedClientVersions); - server_versions = format_versions_list(options->RecommendedServerVersions); - } - - contact = get_options()->ContactInfo; - if (!contact) - contact = "(none)"; - - /* - * Do this so dirserv_compute_performance_thresholds() and - * set_routerstatus_from_routerinfo() see up-to-date bandwidth info. - */ - if (options->V3BandwidthsFile) { - dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL); - } else { - /* - * No bandwidths file; clear the measured bandwidth cache in case we had - * one last time around. - */ - if (dirserv_get_measured_bw_cache_size() > 0) { - dirserv_clear_measured_bw_cache(); - } - } - - /* precompute this part, since we need it to decide what "stable" - * means. */ - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { - dirserv_set_router_is_running(ri, now); - }); - - routers = smartlist_new(); - smartlist_add_all(routers, rl->routers); - routers_sort_by_identity(routers); - omit_as_sybil = get_possible_sybil_list(routers); - - DIGESTMAP_FOREACH(omit_as_sybil, sybil_id, void *, ignore) { - (void) ignore; - rep_hist_make_router_pessimal(sybil_id, now); - } DIGESTMAP_FOREACH_END; - - /* Count how many have measured bandwidths so we know how to assign flags; - * this must come before dirserv_compute_performance_thresholds() */ - dirserv_count_measured_bws(rl); - - dirserv_compute_performance_thresholds(rl, omit_as_sybil); - - routerstatuses = smartlist_new(); - microdescriptors = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { - if (ri->cache_info.published_on >= cutoff) { - routerstatus_t *rs; - vote_routerstatus_t *vrs; - node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); - if (!node) - continue; - - vrs = tor_malloc_zero(sizeof(vote_routerstatus_t)); - rs = &vrs->status; - set_routerstatus_from_routerinfo(rs, node, ri, now, - naming, listbadexits, listbaddirs, - vote_on_hsdirs); - - if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest)) - clear_status_flags_on_sybil(rs); - - if (!vote_on_reachability) - rs->is_flagged_running = 0; - - vrs->version = version_from_platform(ri->platform); - vrs->microdesc = dirvote_format_all_microdesc_vote_lines(ri, now, - microdescriptors); - - smartlist_add(routerstatuses, vrs); - } - } SMARTLIST_FOREACH_END(ri); - - { - smartlist_t *added = - microdescs_add_list_to_cache(get_microdesc_cache(), - microdescriptors, SAVED_NOWHERE, 0); - smartlist_free(added); - smartlist_free(microdescriptors); - } - - smartlist_free(routers); - digestmap_free(omit_as_sybil, NULL); - - /* This pass through applies the measured bw lines to the routerstatuses */ - if (options->V3BandwidthsFile) { - dirserv_read_measured_bandwidths(options->V3BandwidthsFile, - routerstatuses); - } else { - /* - * No bandwidths file; clear the measured bandwidth cache in case we had - * one last time around. - */ - if (dirserv_get_measured_bw_cache_size() > 0) { - dirserv_clear_measured_bw_cache(); - } - } - - v3_out = tor_malloc_zero(sizeof(networkstatus_t)); - - v3_out->type = NS_TYPE_VOTE; - dirvote_get_preferred_voting_intervals(&timing); - v3_out->published = now; - { - char tbuf[ISO_TIME_LEN+1]; - networkstatus_t *current_consensus = - networkstatus_get_live_consensus(now); - long last_consensus_interval; /* only used to pick a valid_after */ - if (current_consensus) - last_consensus_interval = current_consensus->fresh_until - - current_consensus->valid_after; - else - last_consensus_interval = options->TestingV3AuthInitialVotingInterval; - v3_out->valid_after = - dirvote_get_start_of_next_interval(now, (int)last_consensus_interval, - options->TestingV3AuthVotingStartOffset); - format_iso_time(tbuf, v3_out->valid_after); - log_notice(LD_DIR,"Choosing valid-after time in vote as %s: " - "consensus_set=%d, last_interval=%d", - tbuf, current_consensus?1:0, (int)last_consensus_interval); - } - v3_out->fresh_until = v3_out->valid_after + timing.vote_interval; - v3_out->valid_until = v3_out->valid_after + - (timing.vote_interval * timing.n_intervals_valid); - v3_out->vote_seconds = timing.vote_delay; - v3_out->dist_seconds = timing.dist_delay; - tor_assert(v3_out->vote_seconds > 0); - tor_assert(v3_out->dist_seconds > 0); - tor_assert(timing.n_intervals_valid > 0); - - v3_out->client_versions = client_versions; - v3_out->server_versions = server_versions; - v3_out->known_flags = smartlist_new(); - smartlist_split_string(v3_out->known_flags, - "Authority Exit Fast Guard Stable V2Dir Valid", - 0, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (vote_on_reachability) - smartlist_add(v3_out->known_flags, tor_strdup("Running")); - if (listbaddirs) - smartlist_add(v3_out->known_flags, tor_strdup("BadDirectory")); - if (listbadexits) - smartlist_add(v3_out->known_flags, tor_strdup("BadExit")); - if (naming) { - smartlist_add(v3_out->known_flags, tor_strdup("Named")); - smartlist_add(v3_out->known_flags, tor_strdup("Unnamed")); - } - if (vote_on_hsdirs) - smartlist_add(v3_out->known_flags, tor_strdup("HSDir")); - smartlist_sort_strings(v3_out->known_flags); - - if (options->ConsensusParams) { - v3_out->net_params = smartlist_new(); - smartlist_split_string(v3_out->net_params, - options->ConsensusParams, NULL, 0, 0); - smartlist_sort_strings(v3_out->net_params); - } - - voter = tor_malloc_zero(sizeof(networkstatus_voter_info_t)); - voter->nickname = tor_strdup(options->Nickname); - memcpy(voter->identity_digest, identity_digest, DIGEST_LEN); - voter->sigs = smartlist_new(); - voter->address = hostname; - voter->addr = addr; - voter->dir_port = router_get_advertised_dir_port(options, 0); - voter->or_port = router_get_advertised_or_port(options); - voter->contact = tor_strdup(contact); - if (options->V3AuthUseLegacyKey) { - authority_cert_t *c = get_my_v3_legacy_cert(); - if (c) { - if (crypto_pk_get_digest(c->identity_key, voter->legacy_id_digest)) { - log_warn(LD_BUG, "Unable to compute digest of legacy v3 identity key"); - memset(voter->legacy_id_digest, 0, DIGEST_LEN); - } - } - } - - v3_out->voters = smartlist_new(); - smartlist_add(v3_out->voters, voter); - v3_out->cert = authority_cert_dup(cert); - v3_out->routerstatus_list = routerstatuses; - /* Note: networkstatus_digest is unset; it won't get set until we actually - * format the vote. */ - - return v3_out; -} - -/** As dirserv_get_routerdescs(), but instead of getting signed_descriptor_t - * pointers, adds copies of digests to fps_out, and doesn't use the - * /tor/server/ prefix. For a /d/ request, adds descriptor digests; for other - * requests, adds identity digests. - */ -int -dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, int for_unencrypted_conn, - int is_extrainfo) -{ - int by_id = 1; - *msg = NULL; - - if (!strcmp(key, "all")) { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - smartlist_add(fps_out, - tor_memdup(r->cache_info.identity_digest, DIGEST_LEN))); - /* Treat "all" requests as if they were unencrypted */ - for_unencrypted_conn = 1; - } else if (!strcmp(key, "authority")) { - const routerinfo_t *ri = router_get_my_routerinfo(); - if (ri) - smartlist_add(fps_out, - tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN)); - } else if (!strcmpstart(key, "d/")) { - by_id = 0; - key += strlen("d/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); - } else if (!strcmpstart(key, "fp/")) { - key += strlen("fp/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); - } else { - *msg = "Key not recognized"; - return -1; - } - - if (for_unencrypted_conn) { - /* Remove anything that insists it not be sent unencrypted. */ - SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) { - const signed_descriptor_t *sd; - if (by_id) - sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0); - else if (is_extrainfo) - sd = extrainfo_get_by_descriptor_digest(cp); - else - sd = router_get_by_descriptor_digest(cp); - if (sd && !sd->send_unencrypted) { - tor_free(cp); - SMARTLIST_DEL_CURRENT(fps_out, cp); - } - } SMARTLIST_FOREACH_END(cp); - } - - if (!smartlist_len(fps_out)) { - *msg = "Servers unavailable"; - return -1; - } - return 0; -} - -/** Add a signed_descriptor_t to descs_out for each router matching - * key. The key should be either - * - "/tor/server/authority" for our own routerinfo; - * - "/tor/server/all" for all the routerinfos we have, concatenated; - * - "/tor/server/fp/FP" where FP is a plus-separated sequence of - * hex identity digests; or - * - "/tor/server/d/D" where D is a plus-separated sequence - * of server descriptor digests, in hex. - * - * Return 0 if we found some matching descriptors, or -1 if we do not - * have any descriptors, no matching descriptors, or if we did not - * recognize the key (URL). - * If -1 is returned *msg will be set to an appropriate error - * message. - * - * XXXX rename this function. It's only called from the controller. - * XXXX in fact, refactor this function, merging as much as possible. - */ -int -dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, - const char **msg) -{ - *msg = NULL; - - if (!strcmp(key, "/tor/server/all")) { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - smartlist_add(descs_out, &(r->cache_info))); - } else if (!strcmp(key, "/tor/server/authority")) { - const routerinfo_t *ri = router_get_my_routerinfo(); - if (ri) - smartlist_add(descs_out, (void*) &(ri->cache_info)); - } else if (!strcmpstart(key, "/tor/server/d/")) { - smartlist_t *digests = smartlist_new(); - key += strlen("/tor/server/d/"); - dir_split_resource_into_fingerprints(key, digests, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH(digests, const char *, d, - { - signed_descriptor_t *sd = router_get_by_descriptor_digest(d); - if (sd) - smartlist_add(descs_out,sd); - }); - SMARTLIST_FOREACH(digests, char *, d, tor_free(d)); - smartlist_free(digests); - } else if (!strcmpstart(key, "/tor/server/fp/")) { - smartlist_t *digests = smartlist_new(); - time_t cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH; - key += strlen("/tor/server/fp/"); - dir_split_resource_into_fingerprints(key, digests, NULL, - DSR_HEX|DSR_SORT_UNIQ); - SMARTLIST_FOREACH_BEGIN(digests, const char *, d) { - if (router_digest_is_me(d)) { - /* make sure desc_routerinfo exists */ - const routerinfo_t *ri = router_get_my_routerinfo(); - if (ri) - smartlist_add(descs_out, (void*) &(ri->cache_info)); - } else { - const routerinfo_t *ri = router_get_by_id_digest(d); - /* Don't actually serve a descriptor that everyone will think is - * expired. This is an (ugly) workaround to keep buggy 0.1.1.10 - * Tors from downloading descriptors that they will throw away. - */ - if (ri && ri->cache_info.published_on > cutoff) - smartlist_add(descs_out, (void*) &(ri->cache_info)); - } - } SMARTLIST_FOREACH_END(d); - SMARTLIST_FOREACH(digests, char *, d, tor_free(d)); - smartlist_free(digests); - } else { - *msg = "Key not recognized"; - return -1; - } - - if (!smartlist_len(descs_out)) { - *msg = "Servers unavailable"; - return -1; - } - return 0; -} - -/** Called when a TLS handshake has completed successfully with a - * router listening at address:or_port, and has yielded - * a certificate with digest digest_rcvd. - * - * Inform the reachability checker that we could get to this guy. - */ -void -dirserv_orconn_tls_done(const tor_addr_t *addr, - uint16_t or_port, - const char *digest_rcvd) -{ - node_t *node = NULL; - tor_addr_port_t orport; - routerinfo_t *ri = NULL; - time_t now = time(NULL); - tor_assert(addr); - tor_assert(digest_rcvd); - - node = node_get_mutable_by_id(digest_rcvd); - if (node == NULL || node->ri == NULL) - return; - ri = node->ri; - - tor_addr_copy(&orport.addr, addr); - orport.port = or_port; - if (router_has_orport(ri, &orport)) { - /* Found the right router. */ - if (!authdir_mode_bridge(get_options()) || - ri->purpose == ROUTER_PURPOSE_BRIDGE) { - char addrstr[TOR_ADDR_BUF_LEN]; - /* This is a bridge or we're not a bridge authorititative -- - mark it as reachable. */ - log_info(LD_DIRSERV, "Found router %s to be reachable at %s:%d. Yay.", - router_describe(ri), - tor_addr_to_str(addrstr, addr, sizeof(addrstr), 1), - ri->or_port); - if (tor_addr_family(addr) == AF_INET) { - rep_hist_note_router_reachable(digest_rcvd, addr, or_port, now); - node->last_reachable = now; - } else if (tor_addr_family(addr) == AF_INET6) { - /* No rephist for IPv6. */ - node->last_reachable6 = now; - } - } - } -} - -/** Called when we, as an authority, receive a new router descriptor either as - * an upload or a download. Used to decide whether to relaunch reachability - * testing for the server. */ -int -dirserv_should_launch_reachability_test(const routerinfo_t *ri, - const routerinfo_t *ri_old) -{ - if (!authdir_mode_handles_descs(get_options(), ri->purpose)) - return 0; - if (!ri_old) { - /* New router: Launch an immediate reachability test, so we will have an - * opinion soon in case we're generating a consensus soon */ - return 1; - } - if (ri_old->is_hibernating && !ri->is_hibernating) { - /* It just came out of hibernation; launch a reachability test */ - return 1; - } - if (! routers_have_same_or_addrs(ri, ri_old)) { - /* Address or port changed; launch a reachability test */ - return 1; - } - return 0; -} - -/** Helper function for dirserv_test_reachability(). Start a TLS - * connection to router, and annotate it with when we started - * the test. */ -void -dirserv_single_reachability_test(time_t now, routerinfo_t *router) -{ - channel_t *chan = NULL; - node_t *node = NULL; - tor_addr_t router_addr; - (void) now; - - tor_assert(router); - node = node_get_mutable_by_id(router->cache_info.identity_digest); - tor_assert(node); - - /* IPv4. */ - log_debug(LD_OR,"Testing reachability of %s at %s:%u.", - router->nickname, router->address, router->or_port); - tor_addr_from_ipv4h(&router_addr, router->addr); - chan = channel_tls_connect(&router_addr, router->or_port, - router->cache_info.identity_digest); - if (chan) command_setup_channel(chan); - - /* Possible IPv6. */ - if (get_options()->AuthDirHasIPv6Connectivity == 1 && - !tor_addr_is_null(&router->ipv6_addr)) { - char addrstr[TOR_ADDR_BUF_LEN]; - log_debug(LD_OR, "Testing reachability of %s at %s:%u.", - router->nickname, - tor_addr_to_str(addrstr, &router->ipv6_addr, sizeof(addrstr), 1), - router->ipv6_orport); - chan = channel_tls_connect(&router->ipv6_addr, router->ipv6_orport, - router->cache_info.identity_digest); - if (chan) command_setup_channel(chan); - } -} - -/** Auth dir server only: load balance such that we only - * try a few connections per call. - * - * The load balancing is such that if we get called once every ten - * seconds, we will cycle through all the tests in - * REACHABILITY_TEST_CYCLE_PERIOD seconds (a bit over 20 minutes). - */ -void -dirserv_test_reachability(time_t now) -{ - /* XXX decide what to do here; see or-talk thread "purging old router - * information, revocation." -NM - * We can't afford to mess with this in 0.1.2.x. The reason is that - * if we stop doing reachability tests on some of routerlist, then - * we'll for-sure think they're down, which may have unexpected - * effects in other parts of the code. It doesn't hurt much to do - * the testing, and directory authorities are easy to upgrade. Let's - * wait til 0.2.0. -RD */ -// time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - routerlist_t *rl = router_get_routerlist(); - static char ctr = 0; - int bridge_auth = authdir_mode_bridge(get_options()); - - SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, router) { - const char *id_digest = router->cache_info.identity_digest; - if (router_is_me(router)) - continue; - if (bridge_auth && router->purpose != ROUTER_PURPOSE_BRIDGE) - continue; /* bridge authorities only test reachability on bridges */ -// if (router->cache_info.published_on > cutoff) -// continue; - if ((((uint8_t)id_digest[0]) % REACHABILITY_MODULO_PER_TEST) == ctr) { - dirserv_single_reachability_test(now, router); - } - } SMARTLIST_FOREACH_END(router); - ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */ -} - -/** Given a fingerprint fp which is either set if we're looking for a - * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded - * flavor name if we want a flavored v3 status, return a pointer to the - * appropriate cached dir object, or NULL if there isn't one available. */ -static cached_dir_t * -lookup_cached_dir_by_fp(const char *fp) -{ - cached_dir_t *d = NULL; - if (tor_digest_is_zero(fp) && cached_consensuses) { - d = strmap_get(cached_consensuses, "ns"); - } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses && - (d = strmap_get(cached_consensuses, fp))) { - /* this here interface is a nasty hack XXXX024 */; - } - return d; -} - -/** Remove from fps every networkstatus key where both - * a) we have a networkstatus document and - * b) it is not newer than cutoff. - * - * Return 1 if any items were present at all; else return 0. - */ -int -dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff) -{ - int found_any = 0; - SMARTLIST_FOREACH_BEGIN(fps, char *, digest) { - cached_dir_t *d = lookup_cached_dir_by_fp(digest); - if (!d) - continue; - found_any = 1; - if (d->published <= cutoff) { - tor_free(digest); - SMARTLIST_DEL_CURRENT(fps, digest); - } - } SMARTLIST_FOREACH_END(digest); - - return found_any; -} - -/** Return the cache-info for identity fingerprint fp, or - * its extra-info document if extrainfo is true. Return - * NULL if not found or if the descriptor is older than - * publish_cutoff. */ -static const signed_descriptor_t * -get_signed_descriptor_by_fp(const char *fp, int extrainfo, - time_t publish_cutoff) -{ - if (router_digest_is_me(fp)) { - if (extrainfo) - return &(router_get_my_extrainfo()->cache_info); - else - return &(router_get_my_routerinfo()->cache_info); - } else { - const routerinfo_t *ri = router_get_by_id_digest(fp); - if (ri && - ri->cache_info.published_on > publish_cutoff) { - if (extrainfo) - return extrainfo_get_by_descriptor_digest( - ri->cache_info.extra_info_digest); - else - return &ri->cache_info; - } - } - return NULL; -} - -/** Return true iff we have any of the documents (extrainfo or routerdesc) - * specified by the fingerprints in fps and spool_src. Used to - * decide whether to send a 404. */ -int -dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src) -{ - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; - SMARTLIST_FOREACH_BEGIN(fps, const char *, fp) { - switch (spool_src) - { - case DIR_SPOOL_EXTRA_BY_DIGEST: - if (extrainfo_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_SERVER_BY_DIGEST: - if (router_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_FP: - if (get_signed_descriptor_by_fp(fp, - spool_src == DIR_SPOOL_EXTRA_BY_FP, publish_cutoff)) - return 1; - break; - } - } SMARTLIST_FOREACH_END(fp); - return 0; -} - -/** Return true iff any of the 256-bit elements in fps is the digest of - * a microdescriptor we have. */ -int -dirserv_have_any_microdesc(const smartlist_t *fps) -{ - microdesc_cache_t *cache = get_microdesc_cache(); - SMARTLIST_FOREACH(fps, const char *, fp, - if (microdesc_cache_lookup_by_digest256(cache, fp)) - return 1); - return 0; -} - -/** Return an approximate estimate of the number of bytes that will - * be needed to transmit the server descriptors (if is_serverdescs -- - * they can be either d/ or fp/ queries) or networkstatus objects (if - * !is_serverdescs) listed in fps. If compressed is set, - * we guess how large the data will be after compression. - * - * The return value is an estimate; it might be larger or smaller. - **/ -size_t -dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed) -{ - size_t result; - tor_assert(fps); - if (is_serverdescs) { - int n = smartlist_len(fps); - const routerinfo_t *me = router_get_my_routerinfo(); - result = (me?me->cache_info.signed_descriptor_len:2048) * n; - if (compressed) - result /= 2; /* observed compressibility is between 35 and 55%. */ - } else { - result = 0; - SMARTLIST_FOREACH(fps, const char *, digest, { - cached_dir_t *dir = lookup_cached_dir_by_fp(digest); - if (dir) - result += compressed ? dir->dir_z_len : dir->dir_len; - }); - } - return result; -} - -/** Given a list of microdescriptor hashes, guess how many bytes will be - * needed to transmit them, and return the guess. */ -size_t -dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed) -{ - size_t result = smartlist_len(fps) * microdesc_average_size(NULL); - if (compressed) - result /= 2; - return result; -} - -/** When we're spooling data onto our outbuf, add more whenever we dip - * below this threshold. */ -#define DIRSERV_BUFFER_MIN 16384 - -/** Spooling helper: called when we have no more data to spool to conn. - * Flushes any remaining data to be (un)compressed, and changes the spool - * source to NONE. Returns 0 on success, negative on failure. */ -static int -connection_dirserv_finish_spooling(dir_connection_t *conn) -{ - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - conn->dir_spool_src = DIR_SPOOL_NONE; - return 0; -} - -/** Spooling helper: called when we're sending a bunch of server descriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding servers onto outbuf. If we - * run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. - */ -static int -connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) -{ - int by_fp = (conn->dir_spool_src == DIR_SPOOL_SERVER_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP); - int extra = (conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_DIGEST); - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; - - const or_options_t *options = get_options(); - - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - const char *body; - char *fp = smartlist_pop_last(conn->fingerprint_stack); - const signed_descriptor_t *sd = NULL; - if (by_fp) { - sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff); - } else { - sd = extra ? extrainfo_get_by_descriptor_digest(fp) - : router_get_by_descriptor_digest(fp); - } - tor_free(fp); - if (!sd) - continue; - if (!connection_dir_is_encrypted(conn) && !sd->send_unencrypted) { - /* we did this check once before (so we could have an accurate size - * estimate and maybe send a 404 if somebody asked for only bridges on a - * connection), but we need to do it again in case a previously - * unknown bridge descriptor has shown up between then and now. */ - continue; - } - - /** If we are the bridge authority and the descriptor is a bridge - * descriptor, remember that we served this descriptor for desc stats. */ - if (options->BridgeAuthoritativeDir && by_fp) { - const routerinfo_t *router = - router_get_by_id_digest(sd->identity_digest); - /* router can be NULL here when the bridge auth is asked for its own - * descriptor. */ - if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) - rep_hist_note_desc_served(sd->identity_digest); - } - body = signed_descriptor_get_body(sd); - if (conn->zlib_state) { - /* XXXX024 This 'last' business should actually happen on the last - * routerinfo, not on the last fingerprint. */ - int last = ! smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn, - last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - } else { - connection_write_to_buf(body, - sd->signed_descriptor_len, - TO_CONN(conn)); - } - } - - if (!smartlist_len(conn->fingerprint_stack)) { - /* We just wrote the last one; finish up. */ - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; - } - return 0; -} - -/** Spooling helper: called when we're sending a bunch of microdescriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding microdescs onto outbuf. If - * we run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. - */ -static int -connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) -{ - microdesc_cache_t *cache = get_microdesc_cache(); - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - char *fp256 = smartlist_pop_last(conn->fingerprint_stack); - microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); - tor_free(fp256); - if (!md || !md->body) - continue; - if (conn->zlib_state) { - /* XXXX024 This 'last' business should actually happen on the last - * routerinfo, not on the last fingerprint. */ - int last = !smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(md->body, md->bodylen, conn, last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - } else { - connection_write_to_buf(md->body, md->bodylen, TO_CONN(conn)); - } - } - if (!smartlist_len(conn->fingerprint_stack)) { - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; - } - return 0; -} - -/** Spooling helper: Called when we're sending a directory or networkstatus, - * and the outbuf has become too empty. Pulls some bytes from - * conn-\>cached_dir-\>dir_z, uncompresses them if appropriate, and - * puts them on the outbuf. If we run out of entries, flushes the zlib state - * and sets the spool source to NONE. Returns 0 on success, negative on - * failure. */ -static int -connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn) -{ - ssize_t bytes; - int64_t remaining; - - bytes = DIRSERV_BUFFER_MIN - connection_get_outbuf_len(TO_CONN(conn)); - tor_assert(bytes > 0); - tor_assert(conn->cached_dir); - if (bytes < 8192) - bytes = 8192; - remaining = conn->cached_dir->dir_z_len - conn->cached_dir_offset; - if (bytes > remaining) - bytes = (ssize_t) remaining; - - if (conn->zlib_state) { - connection_write_to_buf_zlib( - conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, conn, bytes == remaining); - } else { - connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, TO_CONN(conn)); - } - conn->cached_dir_offset += bytes; - if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) { - /* We just wrote the last one; finish up. */ - connection_dirserv_finish_spooling(conn); - cached_dir_decref(conn->cached_dir); - conn->cached_dir = NULL; - } - return 0; -} - -/** Spooling helper: Called when we're spooling networkstatus objects on - * conn, and the outbuf has become too empty. If the current - * networkstatus object (in conn-\>cached_dir) has more data, pull data - * from there. Otherwise, pop the next fingerprint from fingerprint_stack, - * and start spooling the next networkstatus. (A digest of all 0 bytes is - * treated as a request for the current consensus.) If we run out of entries, - * flushes the zlib state and sets the spool source to NONE. Returns 0 on - * success, negative on failure. */ -static int -connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn) -{ - - while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - if (conn->cached_dir) { - int uncompressing = (conn->zlib_state != NULL); - int r = connection_dirserv_add_dir_bytes_to_outbuf(conn); - if (conn->dir_spool_src == DIR_SPOOL_NONE) { - /* add_dir_bytes thinks we're done with the cached_dir. But we - * may have more cached_dirs! */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - /* This bit is tricky. If we were uncompressing the last - * networkstatus, we may need to make a new zlib object to - * uncompress the next one. */ - if (uncompressing && ! conn->zlib_state && - conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); - } - } - if (r) return r; - } else if (conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - /* Add another networkstatus; start serving it. */ - char *fp = smartlist_pop_last(conn->fingerprint_stack); - cached_dir_t *d = lookup_cached_dir_by_fp(fp); - tor_free(fp); - if (d) { - ++d->refcnt; - conn->cached_dir = d; - conn->cached_dir_offset = 0; - } - } else { - connection_dirserv_finish_spooling(conn); - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; - return 0; - } - } - return 0; -} - -/** Called whenever we have flushed some directory data in state - * SERVER_WRITING. */ -int -connection_dirserv_flushed_some(dir_connection_t *conn) -{ - tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING); - - if (connection_get_outbuf_len(TO_CONN(conn)) >= DIRSERV_BUFFER_MIN) - return 0; - - switch (conn->dir_spool_src) { - case DIR_SPOOL_EXTRA_BY_DIGEST: - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_DIGEST: - case DIR_SPOOL_SERVER_BY_FP: - return connection_dirserv_add_servers_to_outbuf(conn); - case DIR_SPOOL_MICRODESC: - return connection_dirserv_add_microdescs_to_outbuf(conn); - case DIR_SPOOL_CACHED_DIR: - return connection_dirserv_add_dir_bytes_to_outbuf(conn); - case DIR_SPOOL_NETWORKSTATUS: - return connection_dirserv_add_networkstatus_bytes_to_outbuf(conn); - case DIR_SPOOL_NONE: - default: - return 0; - } -} - -/** Release all storage used by the directory server. */ -void -dirserv_free_all(void) -{ - dirserv_free_fingerprint_list(); - - cached_dir_decref(the_directory); - clear_cached_dir(&the_runningrouters); - cached_dir_decref(cached_directory); - clear_cached_dir(&cached_runningrouters); - - strmap_free(cached_consensuses, free_cached_dir_); - cached_consensuses = NULL; - - dirserv_clear_measured_bw_cache(); -} - diff --git a/src/tor/dirserv.h b/src/tor/dirserv.h deleted file mode 100644 index 8591c4c18..000000000 --- a/src/tor/dirserv.h +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dirserv.h - * \brief Header file for dirserv.c. - **/ - -#ifndef TOR_DIRSERV_H -#define TOR_DIRSERV_H - -#include "testsupport.h" - -/** What fraction (1 over this number) of the relay ID space do we - * (as a directory authority) launch connections to at each reachability - * test? */ -#define REACHABILITY_MODULO_PER_TEST 128 - -/** How often (in seconds) do we launch reachability tests? */ -#define REACHABILITY_TEST_INTERVAL 10 - -/** How many seconds apart are the reachability tests for a given relay? */ -#define REACHABILITY_TEST_CYCLE_PERIOD \ - (REACHABILITY_TEST_INTERVAL*REACHABILITY_MODULO_PER_TEST) - -/** Maximum length of an exit policy summary. */ -#define MAX_EXITPOLICY_SUMMARY_LEN 1000 - -/** Maximum allowable length of a version line in a networkstatus. */ -#define MAX_V_LINE_LEN 128 - -int connection_dirserv_flushed_some(dir_connection_t *conn); - -int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_t *pk); -int dirserv_load_fingerprint_file(void); -void dirserv_free_fingerprint_list(void); -const char *dirserv_get_nickname_by_digest(const char *digest); -enum was_router_added_t dirserv_add_multiple_descriptors( - const char *desc, uint8_t purpose, - const char *source, - const char **msg); -enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri, - const char **msg, - const char *source); -void dirserv_set_router_is_running(routerinfo_t *router, time_t now); -int list_server_status_v1(smartlist_t *routers, char **router_status_out, - int for_controller); -int dirserv_dump_directory_to_string(char **dir_out, - crypto_pk_t *private_key); -char *dirserv_get_flag_thresholds_line(void); -void dirserv_compute_bridge_flag_thresholds(routerlist_t *rl); - -int directory_fetches_from_authorities(const or_options_t *options); -int directory_fetches_dir_info_early(const or_options_t *options); -int directory_fetches_dir_info_later(const or_options_t *options); -int directory_caches_unknown_auth_certs(const or_options_t *options); -int directory_caches_dir_info(const or_options_t *options); -int directory_permits_begindir_requests(const or_options_t *options); -int directory_permits_controller_requests(const or_options_t *options); -int directory_too_idle_to_fetch_descriptors(const or_options_t *options, - time_t now); - -void directory_set_dirty(void); -cached_dir_t *dirserv_get_directory(void); -cached_dir_t *dirserv_get_runningrouters(void); -cached_dir_t *dirserv_get_consensus(const char *flavor_name); -void dirserv_set_cached_consensus_networkstatus(const char *consensus, - const char *flavor_name, - const digests_t *digests, - time_t published); -void dirserv_clear_old_networkstatuses(time_t cutoff); -void dirserv_clear_old_v1_info(time_t now); -int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, - int for_unencrypted_conn, - int is_extrainfo); -int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, - const char **msg); -void dirserv_orconn_tls_done(const tor_addr_t *addr, - uint16_t or_port, - const char *digest_rcvd); -int dirserv_should_launch_reachability_test(const routerinfo_t *ri, - const routerinfo_t *ri_old); -void dirserv_single_reachability_test(time_t now, routerinfo_t *router); -void dirserv_test_reachability(time_t now); -int authdir_wants_to_reject_router(routerinfo_t *ri, const char **msg, - int complain, - int *valid_out); -uint32_t dirserv_router_get_status(const routerinfo_t *router, - const char **msg); -void dirserv_set_node_flags_from_authoritative_status(node_t *node, - uint32_t authstatus); - -int dirserv_would_reject_router(const routerstatus_t *rs); -int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff); -int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src); -int dirserv_have_any_microdesc(const smartlist_t *fps); -size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed); -size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed); - -char *routerstatus_format_entry( - const routerstatus_t *rs, const char *platform, - routerstatus_format_type_t format, - const vote_routerstatus_t *vrs); -void dirserv_free_all(void); -void cached_dir_decref(cached_dir_t *d); -cached_dir_t *new_cached_dir(char *s, time_t published); - -#ifdef DIRSERV_PRIVATE - -/* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */ -#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */ - -STATIC int measured_bw_line_parse(measured_bw_line_t *out, const char *line); - -STATIC int measured_bw_line_apply(measured_bw_line_t *parsed_line, - smartlist_t *routerstatuses); - -STATIC void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line, - time_t as_of); -STATIC void dirserv_clear_measured_bw_cache(void); -STATIC void dirserv_expire_measured_bw_cache(time_t now); -STATIC int dirserv_get_measured_bw_cache_size(void); -STATIC int dirserv_query_measured_bw_cache_kb(const char *node_id, - long *bw_out, - time_t *as_of_out); -STATIC int dirserv_has_measured_bw(const char *node_id); -#endif - -int dirserv_read_measured_bandwidths(const char *from_file, - smartlist_t *routerstatuses); - -#endif - diff --git a/src/tor/dirvote.c b/src/tor/dirvote.c deleted file mode 100644 index 4d3ee9cdb..000000000 --- a/src/tor/dirvote.c +++ /dev/null @@ -1,3778 +0,0 @@ -/* Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#define DIRVOTE_PRIVATE -#include "or.h" -#include "config.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "policies.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" - -/** - * \file dirvote.c - * \brief Functions to compute directory consensus, and schedule voting. - **/ - -/** A consensus that we have built and are appending signatures to. Once it's - * time to publish it, it will become an active consensus if it accumulates - * enough signatures. */ -typedef struct pending_consensus_t { - /** The body of the consensus that we're currently building. Once we - * have it built, it goes into dirserv.c */ - char *body; - /** The parsed in-progress consensus document. */ - networkstatus_t *consensus; -} pending_consensus_t; - -/* DOCDOC dirvote_add_signatures_to_all_pending_consensuses */ -static int dirvote_add_signatures_to_all_pending_consensuses( - const char *detached_signatures_body, - const char *source, - const char **msg_out); -static int dirvote_add_signatures_to_pending_consensus( - pending_consensus_t *pc, - ns_detached_signatures_t *sigs, - const char *source, - int severity, - const char **msg_out); -static char *list_v3_auth_ids(void); -static void dirvote_fetch_missing_votes(void); -static void dirvote_fetch_missing_signatures(void); -static int dirvote_perform_vote(void); -static void dirvote_clear_votes(int all_votes); -static int dirvote_compute_consensuses(void); -static int dirvote_publish_consensus(void); -static char *make_consensus_method_list(int low, int high, const char *sep); - -/* ===== - * Voting - * =====*/ - -/** Return a new string containing the string representation of the vote in - * v3_ns, signed with our v3 signing key private_signing_key. - * For v3 authorities. */ -STATIC char * -format_networkstatus_vote(crypto_pk_t *private_signing_key, - networkstatus_t *v3_ns) -{ - smartlist_t *chunks; - const char *client_versions = NULL, *server_versions = NULL; - char fingerprint[FINGERPRINT_LEN+1]; - char digest[DIGEST_LEN]; - uint32_t addr; - char *client_versions_line = NULL, *server_versions_line = NULL; - networkstatus_voter_info_t *voter; - char *status = NULL; - - tor_assert(private_signing_key); - tor_assert(v3_ns->type == NS_TYPE_VOTE || v3_ns->type == NS_TYPE_OPINION); - - voter = smartlist_get(v3_ns->voters, 0); - - addr = voter->addr; - - base16_encode(fingerprint, sizeof(fingerprint), - v3_ns->cert->cache_info.identity_digest, DIGEST_LEN); - client_versions = v3_ns->client_versions; - server_versions = v3_ns->server_versions; - - if (client_versions) { - tor_asprintf(&client_versions_line, "client-versions %s\n", - client_versions); - } else { - client_versions_line = tor_strdup(""); - } - if (server_versions) { - tor_asprintf(&server_versions_line, "server-versions %s\n", - server_versions); - } else { - server_versions_line = tor_strdup(""); - } - - chunks = smartlist_new(); - { - char published[ISO_TIME_LEN+1]; - char va[ISO_TIME_LEN+1]; - char fu[ISO_TIME_LEN+1]; - char vu[ISO_TIME_LEN+1]; - char *flags = smartlist_join_strings(v3_ns->known_flags, " ", 0, NULL); - /* XXXX Abstraction violation: should be pulling a field out of v3_ns.*/ - char *flag_thresholds = dirserv_get_flag_thresholds_line(); - char *params; - authority_cert_t *cert = v3_ns->cert; - char *methods = - make_consensus_method_list(1, MAX_SUPPORTED_CONSENSUS_METHOD, " "); - format_iso_time(published, v3_ns->published); - format_iso_time(va, v3_ns->valid_after); - format_iso_time(fu, v3_ns->fresh_until); - format_iso_time(vu, v3_ns->valid_until); - - if (v3_ns->net_params) - params = smartlist_join_strings(v3_ns->net_params, " ", 0, NULL); - else - params = tor_strdup(""); - - tor_assert(cert); - smartlist_add_asprintf(chunks, - "network-status-version 3\n" - "vote-status %s\n" - "consensus-methods %s\n" - "published %s\n" - "valid-after %s\n" - "fresh-until %s\n" - "valid-until %s\n" - "voting-delay %d %d\n" - "%s%s" /* versions */ - "known-flags %s\n" - "flag-thresholds %s\n" - "params %s\n" - "dir-source %s %s %s %s %d %d\n" - "contact %s\n", - v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", - methods, - published, va, fu, vu, - v3_ns->vote_seconds, v3_ns->dist_seconds, - client_versions_line, - server_versions_line, - flags, - flag_thresholds, - params, - voter->nickname, fingerprint, voter->address, - fmt_addr32(addr), voter->dir_port, voter->or_port, - voter->contact); - - tor_free(params); - tor_free(flags); - tor_free(flag_thresholds); - tor_free(methods); - - if (!tor_digest_is_zero(voter->legacy_id_digest)) { - char fpbuf[HEX_DIGEST_LEN+1]; - base16_encode(fpbuf, sizeof(fpbuf), voter->legacy_id_digest, DIGEST_LEN); - smartlist_add_asprintf(chunks, "legacy-dir-key %s\n", fpbuf); - } - - smartlist_add(chunks, tor_strndup(cert->cache_info.signed_descriptor_body, - cert->cache_info.signed_descriptor_len)); - } - - SMARTLIST_FOREACH_BEGIN(v3_ns->routerstatus_list, vote_routerstatus_t *, - vrs) { - char *rsf; - vote_microdesc_hash_t *h; - rsf = routerstatus_format_entry(&vrs->status, - vrs->version, NS_V3_VOTE, vrs); - if (rsf) - smartlist_add(chunks, rsf); - - for (h = vrs->microdesc; h; h = h->next) { - smartlist_add(chunks, tor_strdup(h->microdesc_hash_line)); - } - } SMARTLIST_FOREACH_END(vrs); - - smartlist_add(chunks, tor_strdup("directory-footer\n")); - - /* The digest includes everything up through the space after - * directory-signature. (Yuck.) */ - crypto_digest_smartlist(digest, DIGEST_LEN, chunks, - "directory-signature ", DIGEST_SHA1); - - { - char signing_key_fingerprint[FINGERPRINT_LEN+1]; - if (crypto_pk_get_fingerprint(private_signing_key, - signing_key_fingerprint, 0)<0) { - log_warn(LD_BUG, "Unable to get fingerprint for signing key"); - goto err; - } - - smartlist_add_asprintf(chunks, "directory-signature %s %s\n", fingerprint, - signing_key_fingerprint); - } - - note_crypto_pk_op(SIGN_DIR); - { - char *sig = router_get_dirobj_signature(digest, DIGEST_LEN, - private_signing_key); - if (!sig) { - log_warn(LD_BUG, "Unable to sign networkstatus vote."); - goto err; - } - smartlist_add(chunks, sig); - } - - status = smartlist_join_strings(chunks, "", 0, NULL); - - { - networkstatus_t *v; - if (!(v = networkstatus_parse_vote_from_string(status, NULL, - v3_ns->type))) { - log_err(LD_BUG,"Generated a networkstatus %s we couldn't parse: " - "<<%s>>", - v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion", status); - goto err; - } - networkstatus_vote_free(v); - } - - goto done; - - err: - tor_free(status); - done: - tor_free(client_versions_line); - tor_free(server_versions_line); - if (chunks) { - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - } - return status; -} - -/* ===== - * Consensus generation - * ===== */ - -/** Given a vote vote (not a consensus!), return its associated - * networkstatus_voter_info_t. */ -static networkstatus_voter_info_t * -get_voter(const networkstatus_t *vote) -{ - tor_assert(vote); - tor_assert(vote->type == NS_TYPE_VOTE); - tor_assert(vote->voters); - tor_assert(smartlist_len(vote->voters) == 1); - return smartlist_get(vote->voters, 0); -} - -/** Return the signature made by voter using the algorithm - * alg, or NULL if none is found. */ -document_signature_t * -voter_get_sig_by_algorithm(const networkstatus_voter_info_t *voter, - digest_algorithm_t alg) -{ - if (!voter->sigs) - return NULL; - SMARTLIST_FOREACH(voter->sigs, document_signature_t *, sig, - if (sig->alg == alg) - return sig); - return NULL; -} - -/** Temporary structure used in constructing a list of dir-source entries - * for a consensus. One of these is generated for every vote, and one more - * for every legacy key in each vote. */ -typedef struct dir_src_ent_t { - networkstatus_t *v; - const char *digest; - int is_legacy; -} dir_src_ent_t; - -/** Helper for sorting networkstatus_t votes (not consensuses) by the - * hash of their voters' identity digests. */ -static int -compare_votes_by_authority_id_(const void **_a, const void **_b) -{ - const networkstatus_t *a = *_a, *b = *_b; - return fast_memcmp(get_voter(a)->identity_digest, - get_voter(b)->identity_digest, DIGEST_LEN); -} - -/** Helper: Compare the dir_src_ent_ts in *_a and *_b by - * their identity digests, and return -1, 0, or 1 depending on their - * ordering */ -static int -compare_dir_src_ents_by_authority_id_(const void **_a, const void **_b) -{ - const dir_src_ent_t *a = *_a, *b = *_b; - const networkstatus_voter_info_t *a_v = get_voter(a->v), - *b_v = get_voter(b->v); - const char *a_id, *b_id; - a_id = a->is_legacy ? a_v->legacy_id_digest : a_v->identity_digest; - b_id = b->is_legacy ? b_v->legacy_id_digest : b_v->identity_digest; - - return fast_memcmp(a_id, b_id, DIGEST_LEN); -} - -/** Given a sorted list of strings in, add every member to out - * that occurs more than min times. */ -static void -get_frequent_members(smartlist_t *out, smartlist_t *in, int min) -{ - char *cur = NULL; - int count = 0; - SMARTLIST_FOREACH_BEGIN(in, char *, cp) { - if (cur && !strcmp(cp, cur)) { - ++count; - } else { - if (count > min) - smartlist_add(out, cur); - cur = cp; - count = 1; - } - } SMARTLIST_FOREACH_END(cp); - if (count > min) - smartlist_add(out, cur); -} - -/** Given a sorted list of strings lst, return the member that appears - * most. Break ties in favor of later-occurring members. */ -#define get_most_frequent_member(lst) \ - smartlist_get_most_frequent_string(lst) - -/** Return 0 if and only if a and b are routerstatuses - * that come from the same routerinfo, with the same derived elements. - */ -static int -compare_vote_rs(const vote_routerstatus_t *a, const vote_routerstatus_t *b) -{ - int r; - if ((r = fast_memcmp(a->status.identity_digest, b->status.identity_digest, - DIGEST_LEN))) - return r; - if ((r = fast_memcmp(a->status.descriptor_digest, - b->status.descriptor_digest, - DIGEST_LEN))) - return r; - if ((r = (int)(b->status.published_on - a->status.published_on))) - return r; - if ((r = strcmp(b->status.nickname, a->status.nickname))) - return r; - if ((r = (((int)b->status.addr) - ((int)a->status.addr)))) - return r; - if ((r = (((int)b->status.or_port) - ((int)a->status.or_port)))) - return r; - if ((r = (((int)b->status.dir_port) - ((int)a->status.dir_port)))) - return r; - return 0; -} - -/** Helper for sorting routerlists based on compare_vote_rs. */ -static int -compare_vote_rs_(const void **_a, const void **_b) -{ - const vote_routerstatus_t *a = *_a, *b = *_b; - return compare_vote_rs(a,b); -} - -/** Helper for sorting OR ports. */ -static int -compare_orports_(const void **_a, const void **_b) -{ - const tor_addr_port_t *a = *_a, *b = *_b; - int r; - - if ((r = tor_addr_compare(&a->addr, &b->addr, CMP_EXACT))) - return r; - if ((r = (((int) b->port) - ((int) a->port)))) - return r; - - return 0; -} - -/** Given a list of vote_routerstatus_t, all for the same router identity, - * return whichever is most frequent, breaking ties in favor of more - * recently published vote_routerstatus_t and in case of ties there, - * in favor of smaller descriptor digest. - */ -static vote_routerstatus_t * -compute_routerstatus_consensus(smartlist_t *votes, int consensus_method, - char *microdesc_digest256_out, - tor_addr_port_t *best_alt_orport_out) -{ - vote_routerstatus_t *most = NULL, *cur = NULL; - int most_n = 0, cur_n = 0; - time_t most_published = 0; - - /* compare_vote_rs_() sorts the items by identity digest (all the same), - * then by SD digest. That way, if we have a tie that the published_on - * date cannot tie, we use the descriptor with the smaller digest. - */ - smartlist_sort(votes, compare_vote_rs_); - SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { - if (cur && !compare_vote_rs(cur, rs)) { - ++cur_n; - } else { - if (cur && (cur_n > most_n || - (cur_n == most_n && - cur->status.published_on > most_published))) { - most = cur; - most_n = cur_n; - most_published = cur->status.published_on; - } - cur_n = 1; - cur = rs; - } - } SMARTLIST_FOREACH_END(rs); - - if (cur_n > most_n || - (cur && cur_n == most_n && cur->status.published_on > most_published)) { - most = cur; - most_n = cur_n; - most_published = cur->status.published_on; - } - - tor_assert(most); - - /* If we're producing "a" lines, vote on potential alternative (sets - * of) OR port(s) in the winning routerstatuses. - * - * XXX prop186 There's at most one alternative OR port (_the_ IPv6 - * port) for now. */ - if (consensus_method >= MIN_METHOD_FOR_A_LINES && best_alt_orport_out) { - smartlist_t *alt_orports = smartlist_new(); - const tor_addr_port_t *most_alt_orport = NULL; - - SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { - if (compare_vote_rs(most, rs) == 0 && - !tor_addr_is_null(&rs->status.ipv6_addr) - && rs->status.ipv6_orport) { - smartlist_add(alt_orports, tor_addr_port_new(&rs->status.ipv6_addr, - rs->status.ipv6_orport)); - } - } SMARTLIST_FOREACH_END(rs); - - smartlist_sort(alt_orports, compare_orports_); - most_alt_orport = smartlist_get_most_frequent(alt_orports, - compare_orports_); - if (most_alt_orport) { - memcpy(best_alt_orport_out, most_alt_orport, sizeof(tor_addr_port_t)); - log_debug(LD_DIR, "\"a\" line winner for %s is %s", - most->status.nickname, - fmt_addrport(&most_alt_orport->addr, most_alt_orport->port)); - } - - SMARTLIST_FOREACH(alt_orports, tor_addr_port_t *, ap, tor_free(ap)); - smartlist_free(alt_orports); - } - - if (consensus_method >= MIN_METHOD_FOR_MICRODESC && - microdesc_digest256_out) { - smartlist_t *digests = smartlist_new(); - const char *best_microdesc_digest; - SMARTLIST_FOREACH_BEGIN(votes, vote_routerstatus_t *, rs) { - char d[DIGEST256_LEN]; - if (compare_vote_rs(rs, most)) - continue; - if (!vote_routerstatus_find_microdesc_hash(d, rs, consensus_method, - DIGEST_SHA256)) - smartlist_add(digests, tor_memdup(d, sizeof(d))); - } SMARTLIST_FOREACH_END(rs); - smartlist_sort_digests256(digests); - best_microdesc_digest = smartlist_get_most_frequent_digest256(digests); - if (best_microdesc_digest) - memcpy(microdesc_digest256_out, best_microdesc_digest, DIGEST256_LEN); - SMARTLIST_FOREACH(digests, char *, cp, tor_free(cp)); - smartlist_free(digests); - } - - return most; -} - -/** Sorting helper: compare two strings based on their values as base-ten - * positive integers. (Non-integers are treated as prior to all integers, and - * compared lexically.) */ -static int -cmp_int_strings_(const void **_a, const void **_b) -{ - const char *a = *_a, *b = *_b; - int ai = (int)tor_parse_long(a, 10, 1, INT_MAX, NULL, NULL); - int bi = (int)tor_parse_long(b, 10, 1, INT_MAX, NULL, NULL); - if (aisupported_methods); - smartlist_add_all(tmp, vote->supported_methods); - smartlist_sort(tmp, cmp_int_strings_); - smartlist_uniq(tmp, cmp_int_strings_, NULL); - smartlist_add_all(all_methods, tmp); - smartlist_clear(tmp); - }); - - smartlist_sort(all_methods, cmp_int_strings_); - get_frequent_members(acceptable_methods, all_methods, min); - n_ok = smartlist_len(acceptable_methods); - if (n_ok) { - const char *best = smartlist_get(acceptable_methods, n_ok-1); - result = (int)tor_parse_long(best, 10, 1, INT_MAX, NULL, NULL); - } else { - result = 1; - } - smartlist_free(tmp); - smartlist_free(all_methods); - smartlist_free(acceptable_methods); - return result; -} - -/** Return true iff method is a consensus method that we support. */ -static int -consensus_method_is_supported(int method) -{ - return (method >= 1) && (method <= MAX_SUPPORTED_CONSENSUS_METHOD); -} - -/** Return a newly allocated string holding the numbers between low and high - * (inclusive) that are supported consensus methods. */ -static char * -make_consensus_method_list(int low, int high, const char *separator) -{ - char *list; - - int i; - smartlist_t *lst; - lst = smartlist_new(); - for (i = low; i <= high; ++i) { - if (!consensus_method_is_supported(i)) - continue; - smartlist_add_asprintf(lst, "%d", i); - } - list = smartlist_join_strings(lst, separator, 0, NULL); - tor_assert(list); - SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp)); - smartlist_free(lst); - return list; -} - -/** Helper: given lst, a list of version strings such that every - * version appears once for every versioning voter who recommends it, return a - * newly allocated string holding the resulting client-versions or - * server-versions list. May change contents of lst */ -static char * -compute_consensus_versions_list(smartlist_t *lst, int n_versioning) -{ - int min = n_versioning / 2; - smartlist_t *good = smartlist_new(); - char *result; - sort_version_list(lst, 0); - get_frequent_members(good, lst, min); - result = smartlist_join_strings(good, ",", 0, NULL); - smartlist_free(good); - return result; -} - -/** Minimum number of directory authorities voting for a parameter to - * include it in the consensus, if consensus method 12 or later is to be - * used. See proposal 178 for details. */ -#define MIN_VOTES_FOR_PARAM 3 - -/** Helper: given a list of valid networkstatus_t, return a new string - * containing the contents of the consensus network parameter set. - */ -STATIC char * -dirvote_compute_params(smartlist_t *votes, int method, int total_authorities) -{ - int i; - int32_t *vals; - - int cur_param_len; - const char *cur_param; - const char *eq; - char *result; - - const int n_votes = smartlist_len(votes); - smartlist_t *output; - smartlist_t *param_list = smartlist_new(); - - /* We require that the parameter lists in the votes are well-formed: that - is, that their keywords are unique and sorted, and that their values are - between INT32_MIN and INT32_MAX inclusive. This should be guaranteed by - the parsing code. */ - - vals = tor_malloc(sizeof(int)*n_votes); - - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - if (!v->net_params) - continue; - smartlist_add_all(param_list, v->net_params); - } SMARTLIST_FOREACH_END(v); - - if (smartlist_len(param_list) == 0) { - tor_free(vals); - smartlist_free(param_list); - return NULL; - } - - smartlist_sort_strings(param_list); - i = 0; - cur_param = smartlist_get(param_list, 0); - eq = strchr(cur_param, '='); - tor_assert(eq); - cur_param_len = (int)(eq+1 - cur_param); - - output = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(param_list, const char *, param) { - const char *next_param; - int ok=0; - eq = strchr(param, '='); - tor_assert(i total_authorities/2 || - i >= MIN_VOTES_FOR_PARAM) { - int32_t median = median_int32(vals, i); - char *out_string = tor_malloc(64+cur_param_len); - memcpy(out_string, param, cur_param_len); - tor_snprintf(out_string+cur_param_len,64, "%ld", (long)median); - smartlist_add(output, out_string); - } - - i = 0; - if (next_param) { - eq = strchr(next_param, '='); - cur_param_len = (int)(eq+1 - next_param); - } - } - } SMARTLIST_FOREACH_END(param); - - result = smartlist_join_strings(output, " ", 0, NULL); - SMARTLIST_FOREACH(output, char *, cp, tor_free(cp)); - smartlist_free(output); - smartlist_free(param_list); - tor_free(vals); - return result; -} - -#define RANGE_CHECK(a,b,c,d,e,f,g,mx) \ - ((a) >= 0 && (a) <= (mx) && (b) >= 0 && (b) <= (mx) && \ - (c) >= 0 && (c) <= (mx) && (d) >= 0 && (d) <= (mx) && \ - (e) >= 0 && (e) <= (mx) && (f) >= 0 && (f) <= (mx) && \ - (g) >= 0 && (g) <= (mx)) - -#define CHECK_EQ(a, b, margin) \ - ((a)-(b) >= 0 ? (a)-(b) <= (margin) : (b)-(a) <= (margin)) - -typedef enum { - BW_WEIGHTS_NO_ERROR = 0, - BW_WEIGHTS_RANGE_ERROR = 1, - BW_WEIGHTS_SUMG_ERROR = 2, - BW_WEIGHTS_SUME_ERROR = 3, - BW_WEIGHTS_SUMD_ERROR = 4, - BW_WEIGHTS_BALANCE_MID_ERROR = 5, - BW_WEIGHTS_BALANCE_EG_ERROR = 6 -} bw_weights_error_t; - -/** - * Verify that any weightings satisfy the balanced formulas. - */ -static bw_weights_error_t -networkstatus_check_weights(int64_t Wgg, int64_t Wgd, int64_t Wmg, - int64_t Wme, int64_t Wmd, int64_t Wee, - int64_t Wed, int64_t scale, int64_t G, - int64_t M, int64_t E, int64_t D, int64_t T, - int64_t margin, int do_balance) { - bw_weights_error_t berr = BW_WEIGHTS_NO_ERROR; - - // Wed + Wmd + Wgd == 1 - if (!CHECK_EQ(Wed + Wmd + Wgd, scale, margin)) { - berr = BW_WEIGHTS_SUMD_ERROR; - goto out; - } - - // Wmg + Wgg == 1 - if (!CHECK_EQ(Wmg + Wgg, scale, margin)) { - berr = BW_WEIGHTS_SUMG_ERROR; - goto out; - } - - // Wme + Wee == 1 - if (!CHECK_EQ(Wme + Wee, scale, margin)) { - berr = BW_WEIGHTS_SUME_ERROR; - goto out; - } - - // Verify weights within range 0->1 - if (!RANGE_CHECK(Wgg, Wgd, Wmg, Wme, Wmd, Wed, Wee, scale)) { - berr = BW_WEIGHTS_RANGE_ERROR; - goto out; - } - - if (do_balance) { - // Wgg*G + Wgd*D == Wee*E + Wed*D, already scaled - if (!CHECK_EQ(Wgg*G + Wgd*D, Wee*E + Wed*D, (margin*T)/3)) { - berr = BW_WEIGHTS_BALANCE_EG_ERROR; - goto out; - } - - // Wgg*G + Wgd*D == M*scale + Wmd*D + Wme*E + Wmg*G, already scaled - if (!CHECK_EQ(Wgg*G + Wgd*D, M*scale + Wmd*D + Wme*E + Wmg*G, - (margin*T)/3)) { - berr = BW_WEIGHTS_BALANCE_MID_ERROR; - goto out; - } - } - - out: - if (berr) { - log_info(LD_DIR, - "Bw weight mismatch %d. G="I64_FORMAT" M="I64_FORMAT - " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT - " Wmd=%d Wme=%d Wmg=%d Wed=%d Wee=%d" - " Wgd=%d Wgg=%d Wme=%d Wmg=%d", - berr, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), - (int)Wmd, (int)Wme, (int)Wmg, (int)Wed, (int)Wee, - (int)Wgd, (int)Wgg, (int)Wme, (int)Wmg); - } - - return berr; -} - -/** - * This function computes the bandwidth weights for consensus method 10. - * - * It returns true if weights could be computed, false otherwise. - */ -static int -networkstatus_compute_bw_weights_v10(smartlist_t *chunks, int64_t G, - int64_t M, int64_t E, int64_t D, - int64_t T, int64_t weight_scale) -{ - bw_weights_error_t berr = 0; - int64_t Wgg = -1, Wgd = -1; - int64_t Wmg = -1, Wme = -1, Wmd = -1; - int64_t Wed = -1, Wee = -1; - const char *casename; - - if (G <= 0 || M <= 0 || E <= 0 || D <= 0) { - log_warn(LD_DIR, "Consensus with empty bandwidth: " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT - " D="I64_FORMAT" T="I64_FORMAT, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - return 0; - } - - /* - * Computed from cases in 3.4.3 of dir-spec.txt - * - * 1. Neither are scarce - * 2. Both Guard and Exit are scarce - * a. R+D <= S - * b. R+D > S - * 3. One of Guard or Exit is scarce - * a. S+D < T/3 - * b. S+D >= T/3 - */ - if (3*E >= T && 3*G >= T) { // E >= T/3 && G >= T/3 - /* Case 1: Neither are scarce. */ - casename = "Case 1 (Wgd=Wmd=Wed)"; - Wgd = weight_scale/3; - Wed = weight_scale/3; - Wmd = weight_scale/3; - Wee = (weight_scale*(E+G+M))/(3*E); - Wme = weight_scale - Wee; - Wmg = (weight_scale*(2*G-E-M))/(3*G); - Wgg = weight_scale - Wmg; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, - weight_scale, G, M, E, D, T, 10, 1); - - if (berr) { - log_warn(LD_DIR, - "Bw Weights error %d for %s v10. G="I64_FORMAT" M="I64_FORMAT - " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT - " Wmd=%d Wme=%d Wmg=%d Wed=%d Wee=%d" - " Wgd=%d Wgg=%d Wme=%d Wmg=%d weight_scale=%d", - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), - (int)Wmd, (int)Wme, (int)Wmg, (int)Wed, (int)Wee, - (int)Wgd, (int)Wgg, (int)Wme, (int)Wmg, (int)weight_scale); - return 0; - } - } else if (3*E < T && 3*G < T) { // E < T/3 && G < T/3 - int64_t R = MIN(E, G); - int64_t S = MAX(E, G); - /* - * Case 2: Both Guards and Exits are scarce - * Balance D between E and G, depending upon - * D capacity and scarcity. - */ - if (R+D < S) { // Subcase a - Wgg = weight_scale; - Wee = weight_scale; - Wmg = 0; - Wme = 0; - Wmd = 0; - if (E < G) { - casename = "Case 2a (E scarce)"; - Wed = weight_scale; - Wgd = 0; - } else { /* E >= G */ - casename = "Case 2a (G scarce)"; - Wed = 0; - Wgd = weight_scale; - } - } else { // Subcase b: R+D >= S - casename = "Case 2b1 (Wgg=1, Wmd=Wgd)"; - Wee = (weight_scale*(E - G + M))/E; - Wed = (weight_scale*(D - 2*E + 4*G - 2*M))/(3*D); - Wme = (weight_scale*(G-M))/E; - Wmg = 0; - Wgg = weight_scale; - Wmd = (weight_scale - Wed)/2; - Wgd = (weight_scale - Wed)/2; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, - weight_scale, G, M, E, D, T, 10, 1); - - if (berr) { - casename = "Case 2b2 (Wgg=1, Wee=1)"; - Wgg = weight_scale; - Wee = weight_scale; - Wed = (weight_scale*(D - 2*E + G + M))/(3*D); - Wmd = (weight_scale*(D - 2*M + G + E))/(3*D); - Wme = 0; - Wmg = 0; - - if (Wmd < 0) { // Can happen if M > T/3 - casename = "Case 2b3 (Wmd=0)"; - Wmd = 0; - log_warn(LD_DIR, - "Too much Middle bandwidth on the network to calculate " - "balanced bandwidth-weights. Consider increasing the " - "number of Guard nodes by lowering the requirements."); - } - Wgd = weight_scale - Wed - Wmd; - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } - if (berr != BW_WEIGHTS_NO_ERROR && - berr != BW_WEIGHTS_BALANCE_MID_ERROR) { - log_warn(LD_DIR, - "Bw Weights error %d for %s v10. G="I64_FORMAT" M="I64_FORMAT - " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT - " Wmd=%d Wme=%d Wmg=%d Wed=%d Wee=%d" - " Wgd=%d Wgg=%d Wme=%d Wmg=%d weight_scale=%d", - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), - (int)Wmd, (int)Wme, (int)Wmg, (int)Wed, (int)Wee, - (int)Wgd, (int)Wgg, (int)Wme, (int)Wmg, (int)weight_scale); - return 0; - } - } - } else { // if (E < T/3 || G < T/3) { - int64_t S = MIN(E, G); - // Case 3: Exactly one of Guard or Exit is scarce - if (!(3*E < T || 3*G < T) || !(3*G >= T || 3*E >= T)) { - log_warn(LD_BUG, - "Bw-Weights Case 3 v10 but with G="I64_FORMAT" M=" - I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - } - - if (3*(S+D) < T) { // Subcase a: S+D < T/3 - if (G < E) { - casename = "Case 3a (G scarce)"; - Wgg = Wgd = weight_scale; - Wmd = Wed = Wmg = 0; - // Minor subcase, if E is more scarce than M, - // keep its bandwidth in place. - if (E < M) Wme = 0; - else Wme = (weight_scale*(E-M))/(2*E); - Wee = weight_scale-Wme; - } else { // G >= E - casename = "Case 3a (E scarce)"; - Wee = Wed = weight_scale; - Wmd = Wgd = Wme = 0; - // Minor subcase, if G is more scarce than M, - // keep its bandwidth in place. - if (G < M) Wmg = 0; - else Wmg = (weight_scale*(G-M))/(2*G); - Wgg = weight_scale-Wmg; - } - } else { // Subcase b: S+D >= T/3 - // D != 0 because S+D >= T/3 - if (G < E) { - casename = "Case 3bg (G scarce, Wgg=1, Wmd == Wed)"; - Wgg = weight_scale; - Wgd = (weight_scale*(D - 2*G + E + M))/(3*D); - Wmg = 0; - Wee = (weight_scale*(E+M))/(2*E); - Wme = weight_scale - Wee; - Wmd = (weight_scale - Wgd)/2; - Wed = (weight_scale - Wgd)/2; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } else { // G >= E - casename = "Case 3be (E scarce, Wee=1, Wmd == Wgd)"; - Wee = weight_scale; - Wed = (weight_scale*(D - 2*E + G + M))/(3*D); - Wme = 0; - Wgg = (weight_scale*(G+M))/(2*G); - Wmg = weight_scale - Wgg; - Wmd = (weight_scale - Wed)/2; - Wgd = (weight_scale - Wed)/2; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } - if (berr) { - log_warn(LD_DIR, - "Bw Weights error %d for %s v10. G="I64_FORMAT" M="I64_FORMAT - " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT - " Wmd=%d Wme=%d Wmg=%d Wed=%d Wee=%d" - " Wgd=%d Wgg=%d Wme=%d Wmg=%d weight_scale=%d", - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T), - (int)Wmd, (int)Wme, (int)Wmg, (int)Wed, (int)Wee, - (int)Wgd, (int)Wgg, (int)Wme, (int)Wmg, (int)weight_scale); - return 0; - } - } - } - - /* We cast down the weights to 32 bit ints on the assumption that - * weight_scale is ~= 10000. We need to ensure a rogue authority - * doesn't break this assumption to rig our weights */ - tor_assert(0 < weight_scale && weight_scale <= INT32_MAX); - - /* - * Provide Wgm=Wgg, Wmm=1, Wem=Wee, Weg=Wed. May later determine - * that middle nodes need different bandwidth weights for dirport traffic, - * or that weird exit policies need special weight, or that bridges - * need special weight. - * - * NOTE: This list is sorted. - */ - smartlist_add_asprintf(chunks, - "bandwidth-weights Wbd=%d Wbe=%d Wbg=%d Wbm=%d " - "Wdb=%d " - "Web=%d Wed=%d Wee=%d Weg=%d Wem=%d " - "Wgb=%d Wgd=%d Wgg=%d Wgm=%d " - "Wmb=%d Wmd=%d Wme=%d Wmg=%d Wmm=%d\n", - (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale, - (int)weight_scale, - (int)weight_scale, (int)Wed, (int)Wee, (int)Wed, (int)Wee, - (int)weight_scale, (int)Wgd, (int)Wgg, (int)Wgg, - (int)weight_scale, (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale); - - log_notice(LD_CIRC, "Computed bandwidth weights for %s with v10: " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - return 1; -} -/** - * This function computes the bandwidth weights for consensus method 9. - * - * It has been obsoleted in favor of consensus method 10. - */ -static void -networkstatus_compute_bw_weights_v9(smartlist_t *chunks, int64_t G, int64_t M, - int64_t E, int64_t D, int64_t T, - int64_t weight_scale) -{ - int64_t Wgg = -1, Wgd = -1; - int64_t Wmg = -1, Wme = -1, Wmd = -1; - int64_t Wed = -1, Wee = -1; - const char *casename; - - if (G <= 0 || M <= 0 || E <= 0 || D <= 0) { - log_warn(LD_DIR, "Consensus with empty bandwidth: " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT - " D="I64_FORMAT" T="I64_FORMAT, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - return; - } - - /* - * Computed from cases in 3.4.3 of dir-spec.txt - * - * 1. Neither are scarce - * 2. Both Guard and Exit are scarce - * a. R+D <= S - * b. R+D > S - * 3. One of Guard or Exit is scarce - * a. S+D < T/3 - * b. S+D >= T/3 - */ - if (3*E >= T && 3*G >= T) { // E >= T/3 && G >= T/3 - bw_weights_error_t berr = 0; - /* Case 1: Neither are scarce. - * - * Attempt to ensure that we have a large amount of exit bandwidth - * in the middle position. - */ - casename = "Case 1 (Wme*E = Wmd*D)"; - Wgg = (weight_scale*(D+E+G+M))/(3*G); - if (D==0) Wmd = 0; - else Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D); - Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E); - Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E); - Wgd = 0; - Wmg = weight_scale - Wgg; - Wed = weight_scale - Wmd; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, - weight_scale, G, M, E, D, T, 10, 1); - - if (berr) { - log_warn(LD_DIR, "Bw Weights error %d for case %s. " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT - " D="I64_FORMAT" T="I64_FORMAT, - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - } - } else if (3*E < T && 3*G < T) { // E < T/3 && G < T/3 - int64_t R = MIN(E, G); - int64_t S = MAX(E, G); - /* - * Case 2: Both Guards and Exits are scarce - * Balance D between E and G, depending upon - * D capacity and scarcity. - */ - if (R+D < S) { // Subcase a - Wgg = weight_scale; - Wee = weight_scale; - Wmg = 0; - Wme = 0; - Wmd = 0; - if (E < G) { - casename = "Case 2a (E scarce)"; - Wed = weight_scale; - Wgd = 0; - } else { /* E >= G */ - casename = "Case 2a (G scarce)"; - Wed = 0; - Wgd = weight_scale; - } - } else { // Subcase b: R+D > S - bw_weights_error_t berr = 0; - casename = "Case 2b (Wme*E == Wmd*D)"; - if (D != 0) { - Wgg = weight_scale; - Wgd = (weight_scale*(D + E - 2*G + M))/(3*D); // T/3 >= G (Ok) - Wmd = (weight_scale*(D + E + G - 2*M))/(6*D); // T/3 >= M - Wme = (weight_scale*(D + E + G - 2*M))/(6*E); - Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E); // 2E+M >= T/3 - Wmg = 0; - Wed = weight_scale - Wgd - Wmd; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, Wed, - weight_scale, G, M, E, D, T, 10, 1); - } - - if (D == 0 || berr) { // Can happen if M > T/3 - casename = "Case 2b (E=G)"; - Wgg = weight_scale; - Wee = weight_scale; - Wmg = 0; - Wme = 0; - Wmd = 0; - if (D == 0) Wgd = 0; - else Wgd = (weight_scale*(D+E-G))/(2*D); - Wed = weight_scale - Wgd; - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } - if (berr != BW_WEIGHTS_NO_ERROR && - berr != BW_WEIGHTS_BALANCE_MID_ERROR) { - log_warn(LD_DIR, "Bw Weights error %d for case %s. " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT - " D="I64_FORMAT" T="I64_FORMAT, - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - } - } - } else { // if (E < T/3 || G < T/3) { - int64_t S = MIN(E, G); - // Case 3: Exactly one of Guard or Exit is scarce - if (!(3*E < T || 3*G < T) || !(3*G >= T || 3*E >= T)) { - log_warn(LD_BUG, - "Bw-Weights Case 3 but with G="I64_FORMAT" M=" - I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - } - - if (3*(S+D) < T) { // Subcase a: S+D < T/3 - if (G < E) { - casename = "Case 3a (G scarce)"; - Wgg = Wgd = weight_scale; - Wmd = Wed = Wmg = 0; - // Minor subcase, if E is more scarce than M, - // keep its bandwidth in place. - if (E < M) Wme = 0; - else Wme = (weight_scale*(E-M))/(2*E); - Wee = weight_scale-Wme; - } else { // G >= E - casename = "Case 3a (E scarce)"; - Wee = Wed = weight_scale; - Wmd = Wgd = Wme = 0; - // Minor subcase, if G is more scarce than M, - // keep its bandwidth in place. - if (G < M) Wmg = 0; - else Wmg = (weight_scale*(G-M))/(2*G); - Wgg = weight_scale-Wmg; - } - } else { // Subcase b: S+D >= T/3 - bw_weights_error_t berr = 0; - // D != 0 because S+D >= T/3 - if (G < E) { - casename = "Case 3b (G scarce, Wme*E == Wmd*D)"; - Wgd = (weight_scale*(D + E - 2*G + M))/(3*D); - Wmd = (weight_scale*(D + E + G - 2*M))/(6*D); - Wme = (weight_scale*(D + E + G - 2*M))/(6*E); - Wee = (weight_scale*(-D + 5*E - G + 2*M))/(6*E); - Wgg = weight_scale; - Wmg = 0; - Wed = weight_scale - Wgd - Wmd; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } else { // G >= E - casename = "Case 3b (E scarce, Wme*E == Wmd*D)"; - Wgg = (weight_scale*(D + E + G + M))/(3*G); - Wmd = (weight_scale*(2*D + 2*E - G - M))/(6*D); - Wme = (weight_scale*(2*D + 2*E - G - M))/(6*E); - Wee = (weight_scale*(-2*D + 4*E + G + M))/(6*E); - Wgd = 0; - Wmg = weight_scale - Wgg; - Wed = weight_scale - Wmd; - - berr = networkstatus_check_weights(Wgg, Wgd, Wmg, Wme, Wmd, Wee, - Wed, weight_scale, G, M, E, D, T, 10, 1); - } - if (berr) { - log_warn(LD_DIR, "Bw Weights error %d for case %s. " - "G="I64_FORMAT" M="I64_FORMAT - " E="I64_FORMAT" D="I64_FORMAT" T="I64_FORMAT, - berr, casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - } - } - } - - /* We cast down the weights to 32 bit ints on the assumption that - * weight_scale is ~= 10000. We need to ensure a rogue authority - * doesn't break this assumption to rig our weights */ - tor_assert(0 < weight_scale && weight_scale <= INT32_MAX); - - if (Wgg < 0 || Wgg > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wgg="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wgg), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - - Wgg = MAX(MIN(Wgg, weight_scale), 0); - } - if (Wgd < 0 || Wgd > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wgd="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wgd), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wgd = MAX(MIN(Wgd, weight_scale), 0); - } - if (Wmg < 0 || Wmg > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wmg="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wmg), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wmg = MAX(MIN(Wmg, weight_scale), 0); - } - if (Wme < 0 || Wme > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wme="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wme), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wme = MAX(MIN(Wme, weight_scale), 0); - } - if (Wmd < 0 || Wmd > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wmd="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wmd), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wmd = MAX(MIN(Wmd, weight_scale), 0); - } - if (Wee < 0 || Wee > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wee="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wee), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wee = MAX(MIN(Wee, weight_scale), 0); - } - if (Wed < 0 || Wed > weight_scale) { - log_warn(LD_DIR, "Bw %s: Wed="I64_FORMAT"! G="I64_FORMAT - " M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, I64_PRINTF_ARG(Wed), - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); - Wed = MAX(MIN(Wed, weight_scale), 0); - } - - // Add consensus weight keywords - smartlist_add(chunks, tor_strdup("bandwidth-weights ")); - /* - * Provide Wgm=Wgg, Wmm=1, Wem=Wee, Weg=Wed. May later determine - * that middle nodes need different bandwidth weights for dirport traffic, - * or that weird exit policies need special weight, or that bridges - * need special weight. - * - * NOTE: This list is sorted. - */ - smartlist_add_asprintf(chunks, - "Wbd=%d Wbe=%d Wbg=%d Wbm=%d " - "Wdb=%d " - "Web=%d Wed=%d Wee=%d Weg=%d Wem=%d " - "Wgb=%d Wgd=%d Wgg=%d Wgm=%d " - "Wmb=%d Wmd=%d Wme=%d Wmg=%d Wmm=%d\n", - (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale, - (int)weight_scale, - (int)weight_scale, (int)Wed, (int)Wee, (int)Wed, (int)Wee, - (int)weight_scale, (int)Wgd, (int)Wgg, (int)Wgg, - (int)weight_scale, (int)Wmd, (int)Wme, (int)Wmg, (int)weight_scale); - - log_notice(LD_CIRC, "Computed bandwidth weights for %s with v9: " - "G="I64_FORMAT" M="I64_FORMAT" E="I64_FORMAT" D="I64_FORMAT - " T="I64_FORMAT, - casename, - I64_PRINTF_ARG(G), I64_PRINTF_ARG(M), I64_PRINTF_ARG(E), - I64_PRINTF_ARG(D), I64_PRINTF_ARG(T)); -} - -/** Given a list of vote networkstatus_t in votes, our public - * authority identity_key, our private authority signing_key, - * and the number of total_authorities that we believe exist in our - * voting quorum, generate the text of a new v3 consensus vote, and return the - * value in a newly allocated string. - * - * Note: this function DOES NOT check whether the votes are from - * recognized authorities. (dirvote_add_vote does that.) */ -char * -networkstatus_compute_consensus(smartlist_t *votes, - int total_authorities, - crypto_pk_t *identity_key, - crypto_pk_t *signing_key, - const char *legacy_id_key_digest, - crypto_pk_t *legacy_signing_key, - consensus_flavor_t flavor) -{ - smartlist_t *chunks; - char *result = NULL; - int consensus_method; - time_t valid_after, fresh_until, valid_until; - int vote_seconds, dist_seconds; - char *client_versions = NULL, *server_versions = NULL; - smartlist_t *flags; - const char *flavor_name; - uint32_t max_unmeasured_bw_kb = DEFAULT_MAX_UNMEASURED_BW_KB; - int64_t G=0, M=0, E=0, D=0, T=0; /* For bandwidth weights */ - const routerstatus_format_type_t rs_format = - flavor == FLAV_NS ? NS_V3_CONSENSUS : NS_V3_CONSENSUS_MICRODESC; - char *params = NULL; - int added_weights = 0; - tor_assert(flavor == FLAV_NS || flavor == FLAV_MICRODESC); - tor_assert(total_authorities >= smartlist_len(votes)); - - flavor_name = networkstatus_get_flavor_name(flavor); - - if (!smartlist_len(votes)) { - log_warn(LD_DIR, "Can't compute a consensus from no votes."); - return NULL; - } - flags = smartlist_new(); - - consensus_method = compute_consensus_method(votes); - if (consensus_method_is_supported(consensus_method)) { - log_info(LD_DIR, "Generating consensus using method %d.", - consensus_method); - } else { - log_warn(LD_DIR, "The other authorities will use consensus method %d, " - "which I don't support. Maybe I should upgrade!", - consensus_method); - consensus_method = 1; - } - - /* Compute medians of time-related things, and figure out how many - * routers we might need to talk about. */ - { - int n_votes = smartlist_len(votes); - time_t *va_times = tor_malloc(n_votes * sizeof(time_t)); - time_t *fu_times = tor_malloc(n_votes * sizeof(time_t)); - time_t *vu_times = tor_malloc(n_votes * sizeof(time_t)); - int *votesec_list = tor_malloc(n_votes * sizeof(int)); - int *distsec_list = tor_malloc(n_votes * sizeof(int)); - int n_versioning_clients = 0, n_versioning_servers = 0; - smartlist_t *combined_client_versions = smartlist_new(); - smartlist_t *combined_server_versions = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - tor_assert(v->type == NS_TYPE_VOTE); - va_times[v_sl_idx] = v->valid_after; - fu_times[v_sl_idx] = v->fresh_until; - vu_times[v_sl_idx] = v->valid_until; - votesec_list[v_sl_idx] = v->vote_seconds; - distsec_list[v_sl_idx] = v->dist_seconds; - if (v->client_versions) { - smartlist_t *cv = smartlist_new(); - ++n_versioning_clients; - smartlist_split_string(cv, v->client_versions, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - sort_version_list(cv, 1); - smartlist_add_all(combined_client_versions, cv); - smartlist_free(cv); /* elements get freed later. */ - } - if (v->server_versions) { - smartlist_t *sv = smartlist_new(); - ++n_versioning_servers; - smartlist_split_string(sv, v->server_versions, ",", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - sort_version_list(sv, 1); - smartlist_add_all(combined_server_versions, sv); - smartlist_free(sv); /* elements get freed later. */ - } - SMARTLIST_FOREACH(v->known_flags, const char *, cp, - smartlist_add(flags, tor_strdup(cp))); - } SMARTLIST_FOREACH_END(v); - valid_after = median_time(va_times, n_votes); - fresh_until = median_time(fu_times, n_votes); - valid_until = median_time(vu_times, n_votes); - vote_seconds = median_int(votesec_list, n_votes); - dist_seconds = median_int(distsec_list, n_votes); - - tor_assert(valid_after+MIN_VOTE_INTERVAL <= fresh_until); - tor_assert(fresh_until+MIN_VOTE_INTERVAL <= valid_until); - tor_assert(vote_seconds >= MIN_VOTE_SECONDS); - tor_assert(dist_seconds >= MIN_DIST_SECONDS); - - server_versions = compute_consensus_versions_list(combined_server_versions, - n_versioning_servers); - client_versions = compute_consensus_versions_list(combined_client_versions, - n_versioning_clients); - - SMARTLIST_FOREACH(combined_server_versions, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(combined_client_versions, char *, cp, tor_free(cp)); - smartlist_free(combined_server_versions); - smartlist_free(combined_client_versions); - - smartlist_sort_strings(flags); - smartlist_uniq_strings(flags); - - tor_free(va_times); - tor_free(fu_times); - tor_free(vu_times); - tor_free(votesec_list); - tor_free(distsec_list); - } - - chunks = smartlist_new(); - - { - char va_buf[ISO_TIME_LEN+1], fu_buf[ISO_TIME_LEN+1], - vu_buf[ISO_TIME_LEN+1]; - char *flaglist; - format_iso_time(va_buf, valid_after); - format_iso_time(fu_buf, fresh_until); - format_iso_time(vu_buf, valid_until); - flaglist = smartlist_join_strings(flags, " ", 0, NULL); - - smartlist_add_asprintf(chunks, "network-status-version 3%s%s\n" - "vote-status consensus\n", - flavor == FLAV_NS ? "" : " ", - flavor == FLAV_NS ? "" : flavor_name); - - if (consensus_method >= 2) { - smartlist_add_asprintf(chunks, "consensus-method %d\n", - consensus_method); - } - - smartlist_add_asprintf(chunks, - "valid-after %s\n" - "fresh-until %s\n" - "valid-until %s\n" - "voting-delay %d %d\n" - "client-versions %s\n" - "server-versions %s\n" - "known-flags %s\n", - va_buf, fu_buf, vu_buf, - vote_seconds, dist_seconds, - client_versions, server_versions, flaglist); - - tor_free(flaglist); - } - - if (consensus_method >= MIN_METHOD_FOR_PARAMS) { - params = dirvote_compute_params(votes, consensus_method, - total_authorities); - if (params) { - smartlist_add(chunks, tor_strdup("params ")); - smartlist_add(chunks, params); - smartlist_add(chunks, tor_strdup("\n")); - } - } - - /* Sort the votes. */ - smartlist_sort(votes, compare_votes_by_authority_id_); - /* Add the authority sections. */ - { - smartlist_t *dir_sources = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - dir_src_ent_t *e = tor_malloc_zero(sizeof(dir_src_ent_t)); - e->v = v; - e->digest = get_voter(v)->identity_digest; - e->is_legacy = 0; - smartlist_add(dir_sources, e); - if (consensus_method >= 3 && - !tor_digest_is_zero(get_voter(v)->legacy_id_digest)) { - dir_src_ent_t *e_legacy = tor_malloc_zero(sizeof(dir_src_ent_t)); - e_legacy->v = v; - e_legacy->digest = get_voter(v)->legacy_id_digest; - e_legacy->is_legacy = 1; - smartlist_add(dir_sources, e_legacy); - } - } SMARTLIST_FOREACH_END(v); - smartlist_sort(dir_sources, compare_dir_src_ents_by_authority_id_); - - SMARTLIST_FOREACH_BEGIN(dir_sources, const dir_src_ent_t *, e) { - char fingerprint[HEX_DIGEST_LEN+1]; - char votedigest[HEX_DIGEST_LEN+1]; - networkstatus_t *v = e->v; - networkstatus_voter_info_t *voter = get_voter(v); - - if (e->is_legacy) - tor_assert(consensus_method >= 2); - - base16_encode(fingerprint, sizeof(fingerprint), e->digest, DIGEST_LEN); - base16_encode(votedigest, sizeof(votedigest), voter->vote_digest, - DIGEST_LEN); - - smartlist_add_asprintf(chunks, - "dir-source %s%s %s %s %s %d %d\n", - voter->nickname, e->is_legacy ? "-legacy" : "", - fingerprint, voter->address, fmt_addr32(voter->addr), - voter->dir_port, - voter->or_port); - if (! e->is_legacy) { - smartlist_add_asprintf(chunks, - "contact %s\n" - "vote-digest %s\n", - voter->contact, - votedigest); - } - } SMARTLIST_FOREACH_END(e); - SMARTLIST_FOREACH(dir_sources, dir_src_ent_t *, e, tor_free(e)); - smartlist_free(dir_sources); - } - - if (consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW) { - char *max_unmeasured_param = NULL; - /* XXXX Extract this code into a common function */ - if (params) { - if (strcmpstart(params, "maxunmeasuredbw=") == 0) - max_unmeasured_param = params; - else - max_unmeasured_param = strstr(params, " maxunmeasuredbw="); - } - if (max_unmeasured_param) { - int ok = 0; - char *eq = strchr(max_unmeasured_param, '='); - if (eq) { - max_unmeasured_bw_kb = (uint32_t) - tor_parse_ulong(eq+1, 10, 1, UINT32_MAX, &ok, NULL); - if (!ok) { - log_warn(LD_DIR, "Bad element '%s' in max unmeasured bw param", - escaped(max_unmeasured_param)); - max_unmeasured_bw_kb = DEFAULT_MAX_UNMEASURED_BW_KB; - } - } - } - } - - /* Add the actual router entries. */ - { - int *index; /* index[j] is the current index into votes[j]. */ - int *size; /* size[j] is the number of routerstatuses in votes[j]. */ - int *flag_counts; /* The number of voters that list flag[j] for the - * currently considered router. */ - int i; - smartlist_t *matching_descs = smartlist_new(); - smartlist_t *chosen_flags = smartlist_new(); - smartlist_t *versions = smartlist_new(); - smartlist_t *exitsummaries = smartlist_new(); - uint32_t *bandwidths_kb = tor_malloc(sizeof(uint32_t) * - smartlist_len(votes)); - uint32_t *measured_bws_kb = tor_malloc(sizeof(uint32_t) * - smartlist_len(votes)); - int num_bandwidths; - int num_mbws; - - int *n_voter_flags; /* n_voter_flags[j] is the number of flags that - * votes[j] knows about. */ - int *n_flag_voters; /* n_flag_voters[f] is the number of votes that care - * about flags[f]. */ - int **flag_map; /* flag_map[j][b] is an index f such that flag_map[f] - * is the same flag as votes[j]->known_flags[b]. */ - int *named_flag; /* Index of the flag "Named" for votes[j] */ - int *unnamed_flag; /* Index of the flag "Unnamed" for votes[j] */ - int chosen_named_idx; - int n_authorities_measuring_bandwidth; - - strmap_t *name_to_id_map = strmap_new(); - char conflict[DIGEST_LEN]; - char unknown[DIGEST_LEN]; - memset(conflict, 0, sizeof(conflict)); - memset(unknown, 0xff, sizeof(conflict)); - - index = tor_malloc_zero(sizeof(int)*smartlist_len(votes)); - size = tor_malloc_zero(sizeof(int)*smartlist_len(votes)); - n_voter_flags = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); - n_flag_voters = tor_malloc_zero(sizeof(int) * smartlist_len(flags)); - flag_map = tor_malloc_zero(sizeof(int*) * smartlist_len(votes)); - named_flag = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); - unnamed_flag = tor_malloc_zero(sizeof(int) * smartlist_len(votes)); - for (i = 0; i < smartlist_len(votes); ++i) - unnamed_flag[i] = named_flag[i] = -1; - chosen_named_idx = smartlist_string_pos(flags, "Named"); - - /* Build the flag indexes. Note that no vote can have more than 64 members - * for known_flags, so no value will be greater than 63, so it's safe to - * do U64_LITERAL(1) << index on these values. But note also that - * named_flag and unnamed_flag are initialized to -1, so we need to check - * that they're actually set before doing U64_LITERAL(1) << index with - * them.*/ - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - flag_map[v_sl_idx] = tor_malloc_zero( - sizeof(int)*smartlist_len(v->known_flags)); - if (smartlist_len(v->known_flags) > MAX_KNOWN_FLAGS_IN_VOTE) { - log_warn(LD_BUG, "Somehow, a vote has %d entries in known_flags", - smartlist_len(v->known_flags)); - } - SMARTLIST_FOREACH_BEGIN(v->known_flags, const char *, fl) { - int p = smartlist_string_pos(flags, fl); - tor_assert(p >= 0); - flag_map[v_sl_idx][fl_sl_idx] = p; - ++n_flag_voters[p]; - if (!strcmp(fl, "Named")) - named_flag[v_sl_idx] = fl_sl_idx; - if (!strcmp(fl, "Unnamed")) - unnamed_flag[v_sl_idx] = fl_sl_idx; - } SMARTLIST_FOREACH_END(fl); - n_voter_flags[v_sl_idx] = smartlist_len(v->known_flags); - size[v_sl_idx] = smartlist_len(v->routerstatus_list); - } SMARTLIST_FOREACH_END(v); - - /* Named and Unnamed get treated specially */ - if (consensus_method >= 2) { - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - uint64_t nf; - if (named_flag[v_sl_idx]<0) - continue; - nf = U64_LITERAL(1) << named_flag[v_sl_idx]; - SMARTLIST_FOREACH_BEGIN(v->routerstatus_list, - vote_routerstatus_t *, rs) { - - if ((rs->flags & nf) != 0) { - const char *d = strmap_get_lc(name_to_id_map, rs->status.nickname); - if (!d) { - /* We have no name officially mapped to this digest. */ - strmap_set_lc(name_to_id_map, rs->status.nickname, - rs->status.identity_digest); - } else if (d != conflict && - fast_memcmp(d, rs->status.identity_digest, DIGEST_LEN)) { - /* Authorities disagree about this nickname. */ - strmap_set_lc(name_to_id_map, rs->status.nickname, conflict); - } else { - /* It's already a conflict, or it's already this ID. */ - } - } - } SMARTLIST_FOREACH_END(rs); - } SMARTLIST_FOREACH_END(v); - - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - uint64_t uf; - if (unnamed_flag[v_sl_idx]<0) - continue; - uf = U64_LITERAL(1) << unnamed_flag[v_sl_idx]; - SMARTLIST_FOREACH_BEGIN(v->routerstatus_list, - vote_routerstatus_t *, rs) { - if ((rs->flags & uf) != 0) { - const char *d = strmap_get_lc(name_to_id_map, rs->status.nickname); - if (d == conflict || d == unknown) { - /* Leave it alone; we know what it is. */ - } else if (!d) { - /* We have no name officially mapped to this digest. */ - strmap_set_lc(name_to_id_map, rs->status.nickname, unknown); - } else if (fast_memeq(d, rs->status.identity_digest, DIGEST_LEN)) { - /* Authorities disagree about this nickname. */ - strmap_set_lc(name_to_id_map, rs->status.nickname, conflict); - } else { - /* It's mapped to a different name. */ - } - } - } SMARTLIST_FOREACH_END(rs); - } SMARTLIST_FOREACH_END(v); - } - - /* We need to know how many votes measure bandwidth. */ - n_authorities_measuring_bandwidth = 0; - SMARTLIST_FOREACH(votes, networkstatus_t *, v, - if (v->has_measured_bws) { - ++n_authorities_measuring_bandwidth; - } - ); - - /* Now go through all the votes */ - flag_counts = tor_malloc(sizeof(int) * smartlist_len(flags)); - while (1) { - vote_routerstatus_t *rs; - routerstatus_t rs_out; - const char *lowest_id = NULL; - const char *chosen_version; - const char *chosen_name = NULL; - int exitsummary_disagreement = 0; - int is_named = 0, is_unnamed = 0, is_running = 0; - int is_guard = 0, is_exit = 0, is_bad_exit = 0; - int naming_conflict = 0; - int n_listing = 0; - int i; - char microdesc_digest[DIGEST256_LEN]; - tor_addr_port_t alt_orport = {TOR_ADDR_NULL, 0}; - - /* Of the next-to-be-considered digest in each voter, which is first? */ - SMARTLIST_FOREACH(votes, networkstatus_t *, v, { - if (index[v_sl_idx] < size[v_sl_idx]) { - rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]); - if (!lowest_id || - fast_memcmp(rs->status.identity_digest, - lowest_id, DIGEST_LEN) < 0) - lowest_id = rs->status.identity_digest; - } - }); - if (!lowest_id) /* we're out of routers. */ - break; - - memset(flag_counts, 0, sizeof(int)*smartlist_len(flags)); - smartlist_clear(matching_descs); - smartlist_clear(chosen_flags); - smartlist_clear(versions); - num_bandwidths = 0; - num_mbws = 0; - - /* Okay, go through all the entries for this digest. */ - SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) { - if (index[v_sl_idx] >= size[v_sl_idx]) - continue; /* out of entries. */ - rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]); - if (fast_memcmp(rs->status.identity_digest, lowest_id, DIGEST_LEN)) - continue; /* doesn't include this router. */ - /* At this point, we know that we're looking at a routerstatus with - * identity "lowest". - */ - ++index[v_sl_idx]; - ++n_listing; - - smartlist_add(matching_descs, rs); - if (rs->version && rs->version[0]) - smartlist_add(versions, rs->version); - - /* Tally up all the flags. */ - for (i = 0; i < n_voter_flags[v_sl_idx]; ++i) { - if (rs->flags & (U64_LITERAL(1) << i)) - ++flag_counts[flag_map[v_sl_idx][i]]; - } - if (named_flag[v_sl_idx] >= 0 && - (rs->flags & (U64_LITERAL(1) << named_flag[v_sl_idx]))) { - if (chosen_name && strcmp(chosen_name, rs->status.nickname)) { - log_notice(LD_DIR, "Conflict on naming for router: %s vs %s", - chosen_name, rs->status.nickname); - naming_conflict = 1; - } - chosen_name = rs->status.nickname; - } - - /* count bandwidths */ - if (rs->has_measured_bw) - measured_bws_kb[num_mbws++] = rs->measured_bw_kb; - - if (rs->status.has_bandwidth) - bandwidths_kb[num_bandwidths++] = rs->status.bandwidth_kb; - } SMARTLIST_FOREACH_END(v); - - /* We don't include this router at all unless more than half of - * the authorities we believe in list it. */ - if (n_listing <= total_authorities/2) - continue; - - /* Figure out the most popular opinion of what the most recent - * routerinfo and its contents are. */ - memset(microdesc_digest, 0, sizeof(microdesc_digest)); - rs = compute_routerstatus_consensus(matching_descs, consensus_method, - microdesc_digest, &alt_orport); - /* Copy bits of that into rs_out. */ - memset(&rs_out, 0, sizeof(rs_out)); - tor_assert(fast_memeq(lowest_id, rs->status.identity_digest,DIGEST_LEN)); - memcpy(rs_out.identity_digest, lowest_id, DIGEST_LEN); - memcpy(rs_out.descriptor_digest, rs->status.descriptor_digest, - DIGEST_LEN); - rs_out.addr = rs->status.addr; - rs_out.published_on = rs->status.published_on; - rs_out.dir_port = rs->status.dir_port; - rs_out.or_port = rs->status.or_port; - if (consensus_method >= MIN_METHOD_FOR_A_LINES) { - tor_addr_copy(&rs_out.ipv6_addr, &alt_orport.addr); - rs_out.ipv6_orport = alt_orport.port; - } - rs_out.has_bandwidth = 0; - rs_out.has_exitsummary = 0; - - if (chosen_name && !naming_conflict) { - strlcpy(rs_out.nickname, chosen_name, sizeof(rs_out.nickname)); - } else { - strlcpy(rs_out.nickname, rs->status.nickname, sizeof(rs_out.nickname)); - } - - if (consensus_method == 1) { - is_named = chosen_named_idx >= 0 && - (!naming_conflict && flag_counts[chosen_named_idx]); - } else { - const char *d = strmap_get_lc(name_to_id_map, rs_out.nickname); - if (!d) { - is_named = is_unnamed = 0; - } else if (fast_memeq(d, lowest_id, DIGEST_LEN)) { - is_named = 1; is_unnamed = 0; - } else { - is_named = 0; is_unnamed = 1; - } - } - - /* Set the flags. */ - smartlist_add(chosen_flags, (char*)"s"); /* for the start of the line. */ - SMARTLIST_FOREACH_BEGIN(flags, const char *, fl) { - if (!strcmp(fl, "Named")) { - if (is_named) - smartlist_add(chosen_flags, (char*)fl); - } else if (!strcmp(fl, "Unnamed") && consensus_method >= 2) { - if (is_unnamed) - smartlist_add(chosen_flags, (char*)fl); - } else { - if (flag_counts[fl_sl_idx] > n_flag_voters[fl_sl_idx]/2) { - smartlist_add(chosen_flags, (char*)fl); - if (!strcmp(fl, "Exit")) - is_exit = 1; - else if (!strcmp(fl, "Guard")) - is_guard = 1; - else if (!strcmp(fl, "Running")) - is_running = 1; - else if (!strcmp(fl, "BadExit")) - is_bad_exit = 1; - } - } - } SMARTLIST_FOREACH_END(fl); - - /* Starting with consensus method 4 we do not list servers - * that are not running in a consensus. See Proposal 138 */ - if (consensus_method >= 4 && !is_running) - continue; - - /* Pick the version. */ - if (smartlist_len(versions)) { - sort_version_list(versions, 0); - chosen_version = get_most_frequent_member(versions); - } else { - chosen_version = NULL; - } - - /* Pick a bandwidth */ - if (consensus_method >= 6 && num_mbws > 2) { - rs_out.has_bandwidth = 1; - rs_out.bw_is_unmeasured = 0; - rs_out.bandwidth_kb = median_uint32(measured_bws_kb, num_mbws); - } else if (consensus_method >= 5 && num_bandwidths > 0) { - rs_out.has_bandwidth = 1; - rs_out.bw_is_unmeasured = 1; - rs_out.bandwidth_kb = median_uint32(bandwidths_kb, num_bandwidths); - if (consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW && - n_authorities_measuring_bandwidth > 2) { - /* Cap non-measured bandwidths. */ - if (rs_out.bandwidth_kb > max_unmeasured_bw_kb) { - rs_out.bandwidth_kb = max_unmeasured_bw_kb; - } - } - } - - /* Fix bug 2203: Do not count BadExit nodes as Exits for bw weights */ - if (consensus_method >= MIN_METHOD_TO_CUT_BADEXIT_WEIGHT) { - is_exit = is_exit && !is_bad_exit; - } - - if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { - if (rs_out.has_bandwidth) { - T += rs_out.bandwidth_kb; - if (is_exit && is_guard) - D += rs_out.bandwidth_kb; - else if (is_exit) - E += rs_out.bandwidth_kb; - else if (is_guard) - G += rs_out.bandwidth_kb; - else - M += rs_out.bandwidth_kb; - } else { - log_warn(LD_BUG, "Missing consensus bandwidth for router %s", - rs_out.nickname); - } - } - - /* Ok, we already picked a descriptor digest we want to list - * previously. Now we want to use the exit policy summary from - * that descriptor. If everybody plays nice all the voters who - * listed that descriptor will have the same summary. If not then - * something is fishy and we'll use the most common one (breaking - * ties in favor of lexicographically larger one (only because it - * lets me reuse more existing code)). - * - * The other case that can happen is that no authority that voted - * for that descriptor has an exit policy summary. That's - * probably quite unlikely but can happen. In that case we use - * the policy that was most often listed in votes, again breaking - * ties like in the previous case. - */ - if (consensus_method >= 5) { - /* Okay, go through all the votes for this router. We prepared - * that list previously */ - const char *chosen_exitsummary = NULL; - smartlist_clear(exitsummaries); - SMARTLIST_FOREACH_BEGIN(matching_descs, vote_routerstatus_t *, vsr) { - /* Check if the vote where this status comes from had the - * proper descriptor */ - tor_assert(fast_memeq(rs_out.identity_digest, - vsr->status.identity_digest, - DIGEST_LEN)); - if (vsr->status.has_exitsummary && - fast_memeq(rs_out.descriptor_digest, - vsr->status.descriptor_digest, - DIGEST_LEN)) { - tor_assert(vsr->status.exitsummary); - smartlist_add(exitsummaries, vsr->status.exitsummary); - if (!chosen_exitsummary) { - chosen_exitsummary = vsr->status.exitsummary; - } else if (strcmp(chosen_exitsummary, vsr->status.exitsummary)) { - /* Great. There's disagreement among the voters. That - * really shouldn't be */ - exitsummary_disagreement = 1; - } - } - } SMARTLIST_FOREACH_END(vsr); - - if (exitsummary_disagreement) { - char id[HEX_DIGEST_LEN+1]; - char dd[HEX_DIGEST_LEN+1]; - base16_encode(id, sizeof(dd), rs_out.identity_digest, DIGEST_LEN); - base16_encode(dd, sizeof(dd), rs_out.descriptor_digest, DIGEST_LEN); - log_warn(LD_DIR, "The voters disagreed on the exit policy summary " - " for router %s with descriptor %s. This really shouldn't" - " have happened.", id, dd); - - smartlist_sort_strings(exitsummaries); - chosen_exitsummary = get_most_frequent_member(exitsummaries); - } else if (!chosen_exitsummary) { - char id[HEX_DIGEST_LEN+1]; - char dd[HEX_DIGEST_LEN+1]; - base16_encode(id, sizeof(dd), rs_out.identity_digest, DIGEST_LEN); - base16_encode(dd, sizeof(dd), rs_out.descriptor_digest, DIGEST_LEN); - log_warn(LD_DIR, "Not one of the voters that made us select" - "descriptor %s for router %s had an exit policy" - "summary", dd, id); - - /* Ok, none of those voting for the digest we chose had an - * exit policy for us. Well, that kinda sucks. - */ - smartlist_clear(exitsummaries); - SMARTLIST_FOREACH(matching_descs, vote_routerstatus_t *, vsr, { - if (vsr->status.has_exitsummary) - smartlist_add(exitsummaries, vsr->status.exitsummary); - }); - smartlist_sort_strings(exitsummaries); - chosen_exitsummary = get_most_frequent_member(exitsummaries); - - if (!chosen_exitsummary) - log_warn(LD_DIR, "Wow, not one of the voters had an exit " - "policy summary for %s. Wow.", id); - } - - if (chosen_exitsummary) { - rs_out.has_exitsummary = 1; - /* yea, discards the const */ - rs_out.exitsummary = (char *)chosen_exitsummary; - } - } - - if (flavor == FLAV_MICRODESC && - consensus_method >= MIN_METHOD_FOR_MANDATORY_MICRODESC && - tor_digest256_is_zero(microdesc_digest)) { - /* With no microdescriptor digest, we omit the entry entirely. */ - continue; - } - - { - char *buf; - /* Okay!! Now we can write the descriptor... */ - /* First line goes into "buf". */ - buf = routerstatus_format_entry(&rs_out, NULL, rs_format, NULL); - if (buf) - smartlist_add(chunks, buf); - } - /* Now an m line, if applicable. */ - if (flavor == FLAV_MICRODESC && - !tor_digest256_is_zero(microdesc_digest)) { - char m[BASE64_DIGEST256_LEN+1]; - digest256_to_base64(m, microdesc_digest); - smartlist_add_asprintf(chunks, "m %s\n", m); - } - /* Next line is all flags. The "\n" is missing. */ - smartlist_add(chunks, - smartlist_join_strings(chosen_flags, " ", 0, NULL)); - /* Now the version line. */ - if (chosen_version) { - smartlist_add(chunks, tor_strdup("\nv ")); - smartlist_add(chunks, tor_strdup(chosen_version)); - } - smartlist_add(chunks, tor_strdup("\n")); - /* Now the weight line. */ - if (rs_out.has_bandwidth) { - int unmeasured = rs_out.bw_is_unmeasured && - consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW; - smartlist_add_asprintf(chunks, "w Bandwidth=%d%s\n", - rs_out.bandwidth_kb, - unmeasured?" Unmeasured=1":""); - } - - /* Now the exitpolicy summary line. */ - if (rs_out.has_exitsummary && flavor == FLAV_NS) { - smartlist_add_asprintf(chunks, "p %s\n", rs_out.exitsummary); - } - - /* And the loop is over and we move on to the next router */ - } - - tor_free(index); - tor_free(size); - tor_free(n_voter_flags); - tor_free(n_flag_voters); - for (i = 0; i < smartlist_len(votes); ++i) - tor_free(flag_map[i]); - tor_free(flag_map); - tor_free(flag_counts); - tor_free(named_flag); - tor_free(unnamed_flag); - strmap_free(name_to_id_map, NULL); - smartlist_free(matching_descs); - smartlist_free(chosen_flags); - smartlist_free(versions); - smartlist_free(exitsummaries); - tor_free(bandwidths_kb); - tor_free(measured_bws_kb); - } - - if (consensus_method >= MIN_METHOD_FOR_FOOTER) { - /* Starting with consensus method 9, we clearly mark the directory - * footer region */ - smartlist_add(chunks, tor_strdup("directory-footer\n")); - } - - if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) { - int64_t weight_scale = BW_WEIGHT_SCALE; - char *bw_weight_param = NULL; - - // Parse params, extract BW_WEIGHT_SCALE if present - // DO NOT use consensus_param_bw_weight_scale() in this code! - // The consensus is not formed yet! - /* XXXX Extract this code into a common function */ - if (params) { - if (strcmpstart(params, "bwweightscale=") == 0) - bw_weight_param = params; - else - bw_weight_param = strstr(params, " bwweightscale="); - } - - if (bw_weight_param) { - int ok=0; - char *eq = strchr(bw_weight_param, '='); - if (eq) { - weight_scale = tor_parse_long(eq+1, 10, 1, INT32_MAX, &ok, - NULL); - if (!ok) { - log_warn(LD_DIR, "Bad element '%s' in bw weight param", - escaped(bw_weight_param)); - weight_scale = BW_WEIGHT_SCALE; - } - } else { - log_warn(LD_DIR, "Bad element '%s' in bw weight param", - escaped(bw_weight_param)); - weight_scale = BW_WEIGHT_SCALE; - } - } - - if (consensus_method < 10) { - networkstatus_compute_bw_weights_v9(chunks, G, M, E, D, T, weight_scale); - added_weights = 1; - } else { - added_weights = networkstatus_compute_bw_weights_v10(chunks, G, M, E, D, - T, weight_scale); - } - } - - /* Add a signature. */ - { - char digest[DIGEST256_LEN]; - char fingerprint[HEX_DIGEST_LEN+1]; - char signing_key_fingerprint[HEX_DIGEST_LEN+1]; - digest_algorithm_t digest_alg = - flavor == FLAV_NS ? DIGEST_SHA1 : DIGEST_SHA256; - size_t digest_len = - flavor == FLAV_NS ? DIGEST_LEN : DIGEST256_LEN; - const char *algname = crypto_digest_algorithm_get_name(digest_alg); - char *signature; - - smartlist_add(chunks, tor_strdup("directory-signature ")); - - /* Compute the hash of the chunks. */ - crypto_digest_smartlist(digest, digest_len, chunks, "", digest_alg); - - /* Get the fingerprints */ - crypto_pk_get_fingerprint(identity_key, fingerprint, 0); - crypto_pk_get_fingerprint(signing_key, signing_key_fingerprint, 0); - - /* add the junk that will go at the end of the line. */ - if (flavor == FLAV_NS) { - smartlist_add_asprintf(chunks, "%s %s\n", fingerprint, - signing_key_fingerprint); - } else { - smartlist_add_asprintf(chunks, "%s %s %s\n", - algname, fingerprint, - signing_key_fingerprint); - } - /* And the signature. */ - if (!(signature = router_get_dirobj_signature(digest, digest_len, - signing_key))) { - log_warn(LD_BUG, "Couldn't sign consensus networkstatus."); - goto done; - } - smartlist_add(chunks, signature); - - if (legacy_id_key_digest && legacy_signing_key && consensus_method >= 3) { - smartlist_add(chunks, tor_strdup("directory-signature ")); - base16_encode(fingerprint, sizeof(fingerprint), - legacy_id_key_digest, DIGEST_LEN); - crypto_pk_get_fingerprint(legacy_signing_key, - signing_key_fingerprint, 0); - if (flavor == FLAV_NS) { - smartlist_add_asprintf(chunks, "%s %s\n", fingerprint, - signing_key_fingerprint); - } else { - smartlist_add_asprintf(chunks, "%s %s %s\n", - algname, fingerprint, - signing_key_fingerprint); - } - - if (!(signature = router_get_dirobj_signature(digest, digest_len, - legacy_signing_key))) { - log_warn(LD_BUG, "Couldn't sign consensus networkstatus."); - goto done; - } - smartlist_add(chunks, signature); - } - } - - result = smartlist_join_strings(chunks, "", 0, NULL); - - { - networkstatus_t *c; - if (!(c = networkstatus_parse_vote_from_string(result, NULL, - NS_TYPE_CONSENSUS))) { - log_err(LD_BUG, "Generated a networkstatus consensus we couldn't " - "parse."); - tor_free(result); - goto done; - } - // Verify balancing parameters - if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS && added_weights) { - networkstatus_verify_bw_weights(c, consensus_method); - } - networkstatus_vote_free(c); - } - - done: - - tor_free(client_versions); - tor_free(server_versions); - SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp)); - smartlist_free(flags); - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - - return result; -} - -/** Given a consensus vote target and a set of detached signatures in - * sigs that correspond to the same consensus, check whether there are - * any new signatures in src_voter_list that should be added to - * target. (A signature should be added if we have no signature for that - * voter in target yet, or if we have no verifiable signature and the - * new signature is verifiable.) Return the number of signatures added or - * changed, or -1 if the document signed by sigs isn't the same - * document as target. */ -int -networkstatus_add_detached_signatures(networkstatus_t *target, - ns_detached_signatures_t *sigs, - const char *source, - int severity, - const char **msg_out) -{ - int r = 0; - const char *flavor; - smartlist_t *siglist; - tor_assert(sigs); - tor_assert(target); - tor_assert(target->type == NS_TYPE_CONSENSUS); - - flavor = networkstatus_get_flavor_name(target->flavor); - - /* Do the times seem right? */ - if (target->valid_after != sigs->valid_after) { - *msg_out = "Valid-After times do not match " - "when adding detached signatures to consensus"; - return -1; - } - if (target->fresh_until != sigs->fresh_until) { - *msg_out = "Fresh-until times do not match " - "when adding detached signatures to consensus"; - return -1; - } - if (target->valid_until != sigs->valid_until) { - *msg_out = "Valid-until times do not match " - "when adding detached signatures to consensus"; - return -1; - } - siglist = strmap_get(sigs->signatures, flavor); - if (!siglist) { - *msg_out = "No signatures for given consensus flavor"; - return -1; - } - - /** Make sure all the digests we know match, and at least one matches. */ - { - digests_t *digests = strmap_get(sigs->digests, flavor); - int n_matches = 0; - int alg; - if (!digests) { - *msg_out = "No digests for given consensus flavor"; - return -1; - } - for (alg = DIGEST_SHA1; alg < N_DIGEST_ALGORITHMS; ++alg) { - if (!tor_mem_is_zero(digests->d[alg], DIGEST256_LEN)) { - if (fast_memeq(target->digests.d[alg], digests->d[alg], - DIGEST256_LEN)) { - ++n_matches; - } else { - *msg_out = "Mismatched digest."; - return -1; - } - } - } - if (!n_matches) { - *msg_out = "No regognized digests for given consensus flavor"; - } - } - - /* For each voter in src... */ - SMARTLIST_FOREACH_BEGIN(siglist, document_signature_t *, sig) { - char voter_identity[HEX_DIGEST_LEN+1]; - networkstatus_voter_info_t *target_voter = - networkstatus_get_voter_by_id(target, sig->identity_digest); - authority_cert_t *cert = NULL; - const char *algorithm; - document_signature_t *old_sig = NULL; - - algorithm = crypto_digest_algorithm_get_name(sig->alg); - - base16_encode(voter_identity, sizeof(voter_identity), - sig->identity_digest, DIGEST_LEN); - log_info(LD_DIR, "Looking at signature from %s using %s", voter_identity, - algorithm); - /* If the target doesn't know about this voter, then forget it. */ - if (!target_voter) { - log_info(LD_DIR, "We do not know any voter with ID %s", voter_identity); - continue; - } - - old_sig = voter_get_sig_by_algorithm(target_voter, sig->alg); - - /* If the target already has a good signature from this voter, then skip - * this one. */ - if (old_sig && old_sig->good_signature) { - log_info(LD_DIR, "We already have a good signature from %s using %s", - voter_identity, algorithm); - continue; - } - - /* Try checking the signature if we haven't already. */ - if (!sig->good_signature && !sig->bad_signature) { - cert = authority_cert_get_by_digests(sig->identity_digest, - sig->signing_key_digest); - if (cert) - networkstatus_check_document_signature(target, sig, cert); - } - - /* If this signature is good, or we don't have any signature yet, - * then maybe add it. */ - if (sig->good_signature || !old_sig || old_sig->bad_signature) { - log_info(LD_DIR, "Adding signature from %s with %s", voter_identity, - algorithm); - tor_log(severity, LD_DIR, "Added a signature for %s from %s.", - target_voter->nickname, source); - ++r; - if (old_sig) { - smartlist_remove(target_voter->sigs, old_sig); - document_signature_free(old_sig); - } - smartlist_add(target_voter->sigs, document_signature_dup(sig)); - } else { - log_info(LD_DIR, "Not adding signature from %s", voter_identity); - } - } SMARTLIST_FOREACH_END(sig); - - return r; -} - -/** Return a newly allocated string containing all the signatures on - * consensus by all voters. If for_detached_signatures is true, - * then the signatures will be put in a detached signatures document, so - * prefix any non-NS-flavored signatures with "additional-signature" rather - * than "directory-signature". */ -static char * -networkstatus_format_signatures(networkstatus_t *consensus, - int for_detached_signatures) -{ - smartlist_t *elements; - char buf[4096]; - char *result = NULL; - int n_sigs = 0; - const consensus_flavor_t flavor = consensus->flavor; - const char *flavor_name = networkstatus_get_flavor_name(flavor); - const char *keyword; - - if (for_detached_signatures && flavor != FLAV_NS) - keyword = "additional-signature"; - else - keyword = "directory-signature"; - - elements = smartlist_new(); - - SMARTLIST_FOREACH_BEGIN(consensus->voters, networkstatus_voter_info_t *, v) { - SMARTLIST_FOREACH_BEGIN(v->sigs, document_signature_t *, sig) { - char sk[HEX_DIGEST_LEN+1]; - char id[HEX_DIGEST_LEN+1]; - if (!sig->signature || sig->bad_signature) - continue; - ++n_sigs; - base16_encode(sk, sizeof(sk), sig->signing_key_digest, DIGEST_LEN); - base16_encode(id, sizeof(id), sig->identity_digest, DIGEST_LEN); - if (flavor == FLAV_NS) { - smartlist_add_asprintf(elements, - "%s %s %s\n-----BEGIN SIGNATURE-----\n", - keyword, id, sk); - } else { - const char *digest_name = - crypto_digest_algorithm_get_name(sig->alg); - smartlist_add_asprintf(elements, - "%s%s%s %s %s %s\n-----BEGIN SIGNATURE-----\n", - keyword, - for_detached_signatures ? " " : "", - for_detached_signatures ? flavor_name : "", - digest_name, id, sk); - } - base64_encode(buf, sizeof(buf), sig->signature, sig->signature_len); - strlcat(buf, "-----END SIGNATURE-----\n", sizeof(buf)); - smartlist_add(elements, tor_strdup(buf)); - } SMARTLIST_FOREACH_END(sig); - } SMARTLIST_FOREACH_END(v); - - result = smartlist_join_strings(elements, "", 0, NULL); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - if (!n_sigs) - tor_free(result); - return result; -} - -/** Return a newly allocated string holding the detached-signatures document - * corresponding to the signatures on consensuses, which must contain - * exactly one FLAV_NS consensus, and no more than one consensus for each - * other flavor. */ -char * -networkstatus_get_detached_signatures(smartlist_t *consensuses) -{ - smartlist_t *elements; - char *result = NULL, *sigs = NULL; - networkstatus_t *consensus_ns = NULL; - tor_assert(consensuses); - - SMARTLIST_FOREACH(consensuses, networkstatus_t *, ns, { - tor_assert(ns); - tor_assert(ns->type == NS_TYPE_CONSENSUS); - if (ns && ns->flavor == FLAV_NS) - consensus_ns = ns; - }); - if (!consensus_ns) { - log_warn(LD_BUG, "No NS consensus given."); - return NULL; - } - - elements = smartlist_new(); - - { - char va_buf[ISO_TIME_LEN+1], fu_buf[ISO_TIME_LEN+1], - vu_buf[ISO_TIME_LEN+1]; - char d[HEX_DIGEST_LEN+1]; - - base16_encode(d, sizeof(d), - consensus_ns->digests.d[DIGEST_SHA1], DIGEST_LEN); - format_iso_time(va_buf, consensus_ns->valid_after); - format_iso_time(fu_buf, consensus_ns->fresh_until); - format_iso_time(vu_buf, consensus_ns->valid_until); - - smartlist_add_asprintf(elements, - "consensus-digest %s\n" - "valid-after %s\n" - "fresh-until %s\n" - "valid-until %s\n", d, va_buf, fu_buf, vu_buf); - } - - /* Get all the digests for the non-FLAV_NS consensuses */ - SMARTLIST_FOREACH_BEGIN(consensuses, networkstatus_t *, ns) { - const char *flavor_name = networkstatus_get_flavor_name(ns->flavor); - int alg; - if (ns->flavor == FLAV_NS) - continue; - - /* start with SHA256; we don't include SHA1 for anything but the basic - * consensus. */ - for (alg = DIGEST_SHA256; alg < N_DIGEST_ALGORITHMS; ++alg) { - char d[HEX_DIGEST256_LEN+1]; - const char *alg_name = - crypto_digest_algorithm_get_name(alg); - if (tor_mem_is_zero(ns->digests.d[alg], DIGEST256_LEN)) - continue; - base16_encode(d, sizeof(d), ns->digests.d[alg], DIGEST256_LEN); - smartlist_add_asprintf(elements, "additional-digest %s %s %s\n", - flavor_name, alg_name, d); - } - } SMARTLIST_FOREACH_END(ns); - - /* Now get all the sigs for non-FLAV_NS consensuses */ - SMARTLIST_FOREACH_BEGIN(consensuses, networkstatus_t *, ns) { - char *sigs; - if (ns->flavor == FLAV_NS) - continue; - sigs = networkstatus_format_signatures(ns, 1); - if (!sigs) { - log_warn(LD_DIR, "Couldn't format signatures"); - goto err; - } - smartlist_add(elements, sigs); - } SMARTLIST_FOREACH_END(ns); - - /* Now add the FLAV_NS consensus signatrures. */ - sigs = networkstatus_format_signatures(consensus_ns, 1); - if (!sigs) - goto err; - smartlist_add(elements, sigs); - - result = smartlist_join_strings(elements, "", 0, NULL); - err: - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - return result; -} - -/** Return a newly allocated string holding a detached-signatures document for - * all of the in-progress consensuses in the n_flavors-element array at - * pending. */ -static char * -get_detached_signatures_from_pending_consensuses(pending_consensus_t *pending, - int n_flavors) -{ - int flav; - char *signatures; - smartlist_t *c = smartlist_new(); - for (flav = 0; flav < n_flavors; ++flav) { - if (pending[flav].consensus) - smartlist_add(c, pending[flav].consensus); - } - signatures = networkstatus_get_detached_signatures(c); - smartlist_free(c); - return signatures; -} - -/** Release all storage held in s. */ -void -ns_detached_signatures_free(ns_detached_signatures_t *s) -{ - if (!s) - return; - if (s->signatures) { - STRMAP_FOREACH(s->signatures, flavor, smartlist_t *, sigs) { - SMARTLIST_FOREACH(sigs, document_signature_t *, sig, - document_signature_free(sig)); - smartlist_free(sigs); - } STRMAP_FOREACH_END; - strmap_free(s->signatures, NULL); - strmap_free(s->digests, tor_free_); - } - - tor_free(s); -} - -/* ===== - * Certificate functions - * ===== */ - -/** Allocate and return a new authority_cert_t with the same contents as - * cert. */ -authority_cert_t * -authority_cert_dup(authority_cert_t *cert) -{ - authority_cert_t *out = tor_malloc(sizeof(authority_cert_t)); - tor_assert(cert); - - memcpy(out, cert, sizeof(authority_cert_t)); - /* Now copy pointed-to things. */ - out->cache_info.signed_descriptor_body = - tor_strndup(cert->cache_info.signed_descriptor_body, - cert->cache_info.signed_descriptor_len); - out->cache_info.saved_location = SAVED_NOWHERE; - out->identity_key = crypto_pk_dup_key(cert->identity_key); - out->signing_key = crypto_pk_dup_key(cert->signing_key); - - return out; -} - -/* ===== - * Vote scheduling - * ===== */ - -/** Set *timing_out to the intervals at which we would like to vote. - * Note that these aren't the intervals we'll use to vote; they're the ones - * that we'll vote to use. */ -void -dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out) -{ - const or_options_t *options = get_options(); - - tor_assert(timing_out); - - timing_out->vote_interval = options->V3AuthVotingInterval; - timing_out->n_intervals_valid = options->V3AuthNIntervalsValid; - timing_out->vote_delay = options->V3AuthVoteDelay; - timing_out->dist_delay = options->V3AuthDistDelay; -} - -/** Return the start of the next interval of size interval (in - * seconds) after now, plus offset. Midnight always - * starts a fresh interval, and if the last interval of a day would be - * truncated to less than half its size, it is rolled into the - * previous interval. */ -time_t -dirvote_get_start_of_next_interval(time_t now, int interval, int offset) -{ - struct tm tm; - time_t midnight_today=0; - time_t midnight_tomorrow; - time_t next; - - tor_gmtime_r(&now, &tm); - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - - if (tor_timegm(&tm, &midnight_today) < 0) { - log_warn(LD_BUG, "Ran into an invalid time when trying to find midnight."); - } - midnight_tomorrow = midnight_today + (24*60*60); - - next = midnight_today + ((now-midnight_today)/interval + 1)*interval; - - /* Intervals never cross midnight. */ - if (next > midnight_tomorrow) - next = midnight_tomorrow; - - /* If the interval would only last half as long as it's supposed to, then - * skip over to the next day. */ - if (next + interval/2 > midnight_tomorrow) - next = midnight_tomorrow; - - next += offset; - if (next - interval > now) - next -= interval; - - return next; -} - -/** Scheduling information for a voting interval. */ -static struct { - /** When do we generate and distribute our vote for this interval? */ - time_t voting_starts; - /** When do we send an HTTP request for any votes that we haven't - * been posted yet?*/ - time_t fetch_missing_votes; - /** When do we give up on getting more votes and generate a consensus? */ - time_t voting_ends; - /** When do we send an HTTP request for any signatures we're expecting to - * see on the consensus? */ - time_t fetch_missing_signatures; - /** When do we publish the consensus? */ - time_t interval_starts; - - /* True iff we have generated and distributed our vote. */ - int have_voted; - /* True iff we've requested missing votes. */ - int have_fetched_missing_votes; - /* True iff we have built a consensus and sent the signatures around. */ - int have_built_consensus; - /* True iff we've fetched missing signatures. */ - int have_fetched_missing_signatures; - /* True iff we have published our consensus. */ - int have_published_consensus; -} voting_schedule = {0,0,0,0,0,0,0,0,0,0}; - -/** Set voting_schedule to hold the timing for the next vote we should be - * doing. */ -void -dirvote_recalculate_timing(const or_options_t *options, time_t now) -{ - int interval, vote_delay, dist_delay; - time_t start; - time_t end; - networkstatus_t *consensus; - - if (!authdir_mode_v3(options)) - return; - - consensus = networkstatus_get_live_consensus(now); - - memset(&voting_schedule, 0, sizeof(voting_schedule)); - - if (consensus) { - interval = (int)( consensus->fresh_until - consensus->valid_after ); - vote_delay = consensus->vote_seconds; - dist_delay = consensus->dist_seconds; - } else { - interval = options->TestingV3AuthInitialVotingInterval; - vote_delay = options->TestingV3AuthInitialVoteDelay; - dist_delay = options->TestingV3AuthInitialDistDelay; - } - - tor_assert(interval > 0); - - if (vote_delay + dist_delay > interval/2) - vote_delay = dist_delay = interval / 4; - - start = voting_schedule.interval_starts = - dirvote_get_start_of_next_interval(now,interval, - options->TestingV3AuthVotingStartOffset); - end = dirvote_get_start_of_next_interval(start+1, interval, - options->TestingV3AuthVotingStartOffset); - - tor_assert(end > start); - - voting_schedule.fetch_missing_signatures = start - (dist_delay/2); - voting_schedule.voting_ends = start - dist_delay; - voting_schedule.fetch_missing_votes = start - dist_delay - (vote_delay/2); - voting_schedule.voting_starts = start - dist_delay - vote_delay; - - { - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, voting_schedule.interval_starts); - log_notice(LD_DIR,"Choosing expected valid-after time as %s: " - "consensus_set=%d, interval=%d", - tbuf, consensus?1:0, interval); - } -} - -/** Entry point: Take whatever voting actions are pending as of now. */ -void -dirvote_act(const or_options_t *options, time_t now) -{ - if (!authdir_mode_v3(options)) - return; - if (!voting_schedule.voting_starts) { - char *keys = list_v3_auth_ids(); - authority_cert_t *c = get_my_v3_authority_cert(); - log_notice(LD_DIR, "Scheduling voting. Known authority IDs are %s. " - "Mine is %s.", - keys, hex_str(c->cache_info.identity_digest, DIGEST_LEN)); - tor_free(keys); - dirvote_recalculate_timing(options, now); - } - if (voting_schedule.voting_starts < now && !voting_schedule.have_voted) { - log_notice(LD_DIR, "Time to vote."); - dirvote_perform_vote(); - voting_schedule.have_voted = 1; - } - if (voting_schedule.fetch_missing_votes < now && - !voting_schedule.have_fetched_missing_votes) { - log_notice(LD_DIR, "Time to fetch any votes that we're missing."); - dirvote_fetch_missing_votes(); - voting_schedule.have_fetched_missing_votes = 1; - } - if (voting_schedule.voting_ends < now && - !voting_schedule.have_built_consensus) { - log_notice(LD_DIR, "Time to compute a consensus."); - dirvote_compute_consensuses(); - /* XXXX We will want to try again later if we haven't got enough - * votes yet. Implement this if it turns out to ever happen. */ - voting_schedule.have_built_consensus = 1; - } - if (voting_schedule.fetch_missing_signatures < now && - !voting_schedule.have_fetched_missing_signatures) { - log_notice(LD_DIR, "Time to fetch any signatures that we're missing."); - dirvote_fetch_missing_signatures(); - voting_schedule.have_fetched_missing_signatures = 1; - } - if (voting_schedule.interval_starts < now && - !voting_schedule.have_published_consensus) { - log_notice(LD_DIR, "Time to publish the consensus and discard old votes"); - dirvote_publish_consensus(); - dirvote_clear_votes(0); - voting_schedule.have_published_consensus = 1; - /* XXXX We will want to try again later if we haven't got enough - * signatures yet. Implement this if it turns out to ever happen. */ - dirvote_recalculate_timing(options, now); - } -} - -/** A vote networkstatus_t and its unparsed body: held around so we can - * use it to generate a consensus (at voting_ends) and so we can serve it to - * other authorities that might want it. */ -typedef struct pending_vote_t { - cached_dir_t *vote_body; - networkstatus_t *vote; -} pending_vote_t; - -/** List of pending_vote_t for the current vote. Before we've used them to - * build a consensus, the votes go here. */ -static smartlist_t *pending_vote_list = NULL; -/** List of pending_vote_t for the previous vote. After we've used them to - * build a consensus, the votes go here for the next period. */ -static smartlist_t *previous_vote_list = NULL; - -/* DOCDOC pending_consensuses */ -static pending_consensus_t pending_consensuses[N_CONSENSUS_FLAVORS]; - -/** The detached signatures for the consensus that we're currently - * building. */ -static char *pending_consensus_signatures = NULL; - -/** List of ns_detached_signatures_t: hold signatures that get posted to us - * before we have generated the consensus on our own. */ -static smartlist_t *pending_consensus_signature_list = NULL; - -/** Generate a networkstatus vote and post it to all the v3 authorities. - * (V3 Authority only) */ -static int -dirvote_perform_vote(void) -{ - crypto_pk_t *key = get_my_v3_authority_signing_key(); - authority_cert_t *cert = get_my_v3_authority_cert(); - networkstatus_t *ns; - char *contents; - pending_vote_t *pending_vote; - time_t now = time(NULL); - - int status; - const char *msg = ""; - - if (!cert || !key) { - log_warn(LD_NET, "Didn't find key/certificate to generate v3 vote"); - return -1; - } else if (cert->expires < now) { - log_warn(LD_NET, "Can't generate v3 vote with expired certificate"); - return -1; - } - if (!(ns = dirserv_generate_networkstatus_vote_obj(key, cert))) - return -1; - - contents = format_networkstatus_vote(key, ns); - networkstatus_vote_free(ns); - if (!contents) - return -1; - - pending_vote = dirvote_add_vote(contents, &msg, &status); - tor_free(contents); - if (!pending_vote) { - log_warn(LD_DIR, "Couldn't store my own vote! (I told myself, '%s'.)", - msg); - return -1; - } - - directory_post_to_dirservers(DIR_PURPOSE_UPLOAD_VOTE, - ROUTER_PURPOSE_GENERAL, - V3_DIRINFO, - pending_vote->vote_body->dir, - pending_vote->vote_body->dir_len, 0); - log_notice(LD_DIR, "Vote posted."); - return 0; -} - -/** Send an HTTP request to every other v3 authority, for the votes of every - * authority for which we haven't received a vote yet in this period. (V3 - * authority only) */ -static void -dirvote_fetch_missing_votes(void) -{ - smartlist_t *missing_fps = smartlist_new(); - char *resource; - - SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), - dir_server_t *, ds) { - if (!(ds->type & V3_DIRINFO)) - continue; - if (!dirvote_get_vote(ds->v3_identity_digest, - DGV_BY_ID|DGV_INCLUDE_PENDING)) { - char *cp = tor_malloc(HEX_DIGEST_LEN+1); - base16_encode(cp, HEX_DIGEST_LEN+1, ds->v3_identity_digest, - DIGEST_LEN); - smartlist_add(missing_fps, cp); - } - } SMARTLIST_FOREACH_END(ds); - - if (!smartlist_len(missing_fps)) { - smartlist_free(missing_fps); - return; - } - { - char *tmp = smartlist_join_strings(missing_fps, " ", 0, NULL); - log_notice(LOG_NOTICE, "We're missing votes from %d authorities (%s). " - "Asking every other authority for a copy.", - smartlist_len(missing_fps), tmp); - tor_free(tmp); - } - resource = smartlist_join_strings(missing_fps, "+", 0, NULL); - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, - 0, resource); - tor_free(resource); - SMARTLIST_FOREACH(missing_fps, char *, cp, tor_free(cp)); - smartlist_free(missing_fps); -} - -/** Send a request to every other authority for its detached signatures, - * unless we have signatures from all other v3 authorities already. */ -static void -dirvote_fetch_missing_signatures(void) -{ - int need_any = 0; - int i; - for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { - networkstatus_t *consensus = pending_consensuses[i].consensus; - if (!consensus || - networkstatus_check_consensus_signature(consensus, -1) == 1) { - /* We have no consensus, or we have one that's signed by everybody. */ - continue; - } - need_any = 1; - } - if (!need_any) - return; - - directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, - 0, NULL); -} - -/** Release all storage held by pending consensuses (those waiting for - * signatures). */ -static void -dirvote_clear_pending_consensuses(void) -{ - int i; - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - pending_consensus_t *pc = &pending_consensuses[i]; - tor_free(pc->body); - - networkstatus_vote_free(pc->consensus); - pc->consensus = NULL; - } -} - -/** Drop all currently pending votes, consensus, and detached signatures. */ -static void -dirvote_clear_votes(int all_votes) -{ - if (!previous_vote_list) - previous_vote_list = smartlist_new(); - if (!pending_vote_list) - pending_vote_list = smartlist_new(); - - /* All "previous" votes are now junk. */ - SMARTLIST_FOREACH(previous_vote_list, pending_vote_t *, v, { - cached_dir_decref(v->vote_body); - v->vote_body = NULL; - networkstatus_vote_free(v->vote); - tor_free(v); - }); - smartlist_clear(previous_vote_list); - - if (all_votes) { - /* If we're dumping all the votes, we delete the pending ones. */ - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, { - cached_dir_decref(v->vote_body); - v->vote_body = NULL; - networkstatus_vote_free(v->vote); - tor_free(v); - }); - } else { - /* Otherwise, we move them into "previous". */ - smartlist_add_all(previous_vote_list, pending_vote_list); - } - smartlist_clear(pending_vote_list); - - if (pending_consensus_signature_list) { - SMARTLIST_FOREACH(pending_consensus_signature_list, char *, cp, - tor_free(cp)); - smartlist_clear(pending_consensus_signature_list); - } - tor_free(pending_consensus_signatures); - dirvote_clear_pending_consensuses(); -} - -/** Return a newly allocated string containing the hex-encoded v3 authority - identity digest of every recognized v3 authority. */ -static char * -list_v3_auth_ids(void) -{ - smartlist_t *known_v3_keys = smartlist_new(); - char *keys; - SMARTLIST_FOREACH(router_get_trusted_dir_servers(), - dir_server_t *, ds, - if ((ds->type & V3_DIRINFO) && - !tor_digest_is_zero(ds->v3_identity_digest)) - smartlist_add(known_v3_keys, - tor_strdup(hex_str(ds->v3_identity_digest, DIGEST_LEN)))); - keys = smartlist_join_strings(known_v3_keys, ", ", 0, NULL); - SMARTLIST_FOREACH(known_v3_keys, char *, cp, tor_free(cp)); - smartlist_free(known_v3_keys); - return keys; -} - -/** Called when we have received a networkstatus vote in vote_body. - * Parse and validate it, and on success store it as a pending vote (which we - * then return). Return NULL on failure. Sets *msg_out and - * *status_out to an HTTP response and status code. (V3 authority - * only) */ -pending_vote_t * -dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) -{ - networkstatus_t *vote; - networkstatus_voter_info_t *vi; - dir_server_t *ds; - pending_vote_t *pending_vote = NULL; - const char *end_of_vote = NULL; - int any_failed = 0; - tor_assert(vote_body); - tor_assert(msg_out); - tor_assert(status_out); - - if (!pending_vote_list) - pending_vote_list = smartlist_new(); - *status_out = 0; - *msg_out = NULL; - - again: - vote = networkstatus_parse_vote_from_string(vote_body, &end_of_vote, - NS_TYPE_VOTE); - if (!end_of_vote) - end_of_vote = vote_body + strlen(vote_body); - if (!vote) { - log_warn(LD_DIR, "Couldn't parse vote: length was %d", - (int)strlen(vote_body)); - *msg_out = "Unable to parse vote"; - goto err; - } - tor_assert(smartlist_len(vote->voters) == 1); - vi = get_voter(vote); - { - int any_sig_good = 0; - SMARTLIST_FOREACH(vi->sigs, document_signature_t *, sig, - if (sig->good_signature) - any_sig_good = 1); - tor_assert(any_sig_good); - } - ds = trusteddirserver_get_by_v3_auth_digest(vi->identity_digest); - if (!ds) { - char *keys = list_v3_auth_ids(); - log_warn(LD_DIR, "Got a vote from an authority (nickname %s, address %s) " - "with authority key ID %s. " - "This key ID is not recognized. Known v3 key IDs are: %s", - vi->nickname, vi->address, - hex_str(vi->identity_digest, DIGEST_LEN), keys); - tor_free(keys); - *msg_out = "Vote not from a recognized v3 authority"; - goto err; - } - tor_assert(vote->cert); - if (!authority_cert_get_by_digests(vote->cert->cache_info.identity_digest, - vote->cert->signing_key_digest)) { - /* Hey, it's a new cert! */ - trusted_dirs_load_certs_from_string( - vote->cert->cache_info.signed_descriptor_body, - TRUSTED_DIRS_CERTS_SRC_FROM_VOTE, 1 /*flush*/); - if (!authority_cert_get_by_digests(vote->cert->cache_info.identity_digest, - vote->cert->signing_key_digest)) { - log_warn(LD_BUG, "We added a cert, but still couldn't find it."); - } - } - - /* Is it for the right period? */ - if (vote->valid_after != voting_schedule.interval_starts) { - char tbuf1[ISO_TIME_LEN+1], tbuf2[ISO_TIME_LEN+1]; - format_iso_time(tbuf1, vote->valid_after); - format_iso_time(tbuf2, voting_schedule.interval_starts); - log_warn(LD_DIR, "Rejecting vote from %s with valid-after time of %s; " - "we were expecting %s", vi->address, tbuf1, tbuf2); - *msg_out = "Bad valid-after time"; - goto err; - } - - /* Fetch any new router descriptors we just learned about */ - update_consensus_router_descriptor_downloads(time(NULL), 1, vote); - - /* Now see whether we already have a vote from this authority. */ - SMARTLIST_FOREACH_BEGIN(pending_vote_list, pending_vote_t *, v) { - if (fast_memeq(v->vote->cert->cache_info.identity_digest, - vote->cert->cache_info.identity_digest, - DIGEST_LEN)) { - networkstatus_voter_info_t *vi_old = get_voter(v->vote); - if (fast_memeq(vi_old->vote_digest, vi->vote_digest, DIGEST_LEN)) { - /* Ah, it's the same vote. Not a problem. */ - log_info(LD_DIR, "Discarding a vote we already have (from %s).", - vi->address); - if (*status_out < 200) - *status_out = 200; - goto discard; - } else if (v->vote->published < vote->published) { - log_notice(LD_DIR, "Replacing an older pending vote from this " - "directory."); - cached_dir_decref(v->vote_body); - networkstatus_vote_free(v->vote); - v->vote_body = new_cached_dir(tor_strndup(vote_body, - end_of_vote-vote_body), - vote->published); - v->vote = vote; - if (end_of_vote && - !strcmpstart(end_of_vote, "network-status-version")) - goto again; - - if (*status_out < 200) - *status_out = 200; - if (!*msg_out) - *msg_out = "OK"; - return v; - } else { - *msg_out = "Already have a newer pending vote"; - goto err; - } - } - } SMARTLIST_FOREACH_END(v); - - pending_vote = tor_malloc_zero(sizeof(pending_vote_t)); - pending_vote->vote_body = new_cached_dir(tor_strndup(vote_body, - end_of_vote-vote_body), - vote->published); - pending_vote->vote = vote; - smartlist_add(pending_vote_list, pending_vote); - - if (!strcmpstart(end_of_vote, "network-status-version ")) { - vote_body = end_of_vote; - goto again; - } - - goto done; - - err: - any_failed = 1; - if (!*msg_out) - *msg_out = "Error adding vote"; - if (*status_out < 400) - *status_out = 400; - - discard: - networkstatus_vote_free(vote); - - if (end_of_vote && !strcmpstart(end_of_vote, "network-status-version ")) { - vote_body = end_of_vote; - goto again; - } - - done: - - if (*status_out < 200) - *status_out = 200; - if (!*msg_out) { - if (!any_failed && !pending_vote) { - *msg_out = "Duplicate discarded"; - } else { - *msg_out = "ok"; - } - } - - return any_failed ? NULL : pending_vote; -} - -/** Try to compute a v3 networkstatus consensus from the currently pending - * votes. Return 0 on success, -1 on failure. Store the consensus in - * pending_consensus: it won't be ready to be published until we have - * everybody else's signatures collected too. (V3 Authority only) */ -static int -dirvote_compute_consensuses(void) -{ - /* Have we got enough votes to try? */ - int n_votes, n_voters, n_vote_running = 0; - smartlist_t *votes = NULL, *votestrings = NULL; - char *consensus_body = NULL, *signatures = NULL, *votefile; - networkstatus_t *consensus = NULL; - authority_cert_t *my_cert; - pending_consensus_t pending[N_CONSENSUS_FLAVORS]; - int flav; - - memset(pending, 0, sizeof(pending)); - - if (!pending_vote_list) - pending_vote_list = smartlist_new(); - - n_voters = get_n_authorities(V3_DIRINFO); - n_votes = smartlist_len(pending_vote_list); - if (n_votes <= n_voters/2) { - log_warn(LD_DIR, "We don't have enough votes to generate a consensus: " - "%d of %d", n_votes, n_voters/2+1); - goto err; - } - tor_assert(pending_vote_list); - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, { - if (smartlist_contains_string(v->vote->known_flags, "Running")) - n_vote_running++; - }); - if (!n_vote_running) { - /* See task 1066. */ - log_warn(LD_DIR, "Nobody has voted on the Running flag. Generating " - "and publishing a consensus without Running nodes " - "would make many clients stop working. Not " - "generating a consensus!"); - goto err; - } - - if (!(my_cert = get_my_v3_authority_cert())) { - log_warn(LD_DIR, "Can't generate consensus without a certificate."); - goto err; - } - - votes = smartlist_new(); - votestrings = smartlist_new(); - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v, - { - sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t)); - c->bytes = v->vote_body->dir; - c->len = v->vote_body->dir_len; - smartlist_add(votestrings, c); /* collect strings to write to disk */ - - smartlist_add(votes, v->vote); /* collect votes to compute consensus */ - }); - - votefile = get_datadir_fname("v3-status-votes"); - write_chunks_to_file(votefile, votestrings, 0, 0); - tor_free(votefile); - SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c)); - smartlist_free(votestrings); - - { - char legacy_dbuf[DIGEST_LEN]; - crypto_pk_t *legacy_sign=NULL; - char *legacy_id_digest = NULL; - int n_generated = 0; - if (get_options()->V3AuthUseLegacyKey) { - authority_cert_t *cert = get_my_v3_legacy_cert(); - legacy_sign = get_my_v3_legacy_signing_key(); - if (cert) { - if (crypto_pk_get_digest(cert->identity_key, legacy_dbuf)) { - log_warn(LD_BUG, - "Unable to compute digest of legacy v3 identity key"); - } else { - legacy_id_digest = legacy_dbuf; - } - } - } - - for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - const char *flavor_name = networkstatus_get_flavor_name(flav); - consensus_body = networkstatus_compute_consensus( - votes, n_voters, - my_cert->identity_key, - get_my_v3_authority_signing_key(), legacy_id_digest, legacy_sign, - flav); - - if (!consensus_body) { - log_warn(LD_DIR, "Couldn't generate a %s consensus at all!", - flavor_name); - continue; - } - consensus = networkstatus_parse_vote_from_string(consensus_body, NULL, - NS_TYPE_CONSENSUS); - if (!consensus) { - log_warn(LD_DIR, "Couldn't parse %s consensus we generated!", - flavor_name); - tor_free(consensus_body); - continue; - } - - /* 'Check' our own signature, to mark it valid. */ - networkstatus_check_consensus_signature(consensus, -1); - - pending[flav].body = consensus_body; - pending[flav].consensus = consensus; - n_generated++; - consensus_body = NULL; - consensus = NULL; - } - if (!n_generated) { - log_warn(LD_DIR, "Couldn't generate any consensus flavors at all."); - goto err; - } - } - - signatures = get_detached_signatures_from_pending_consensuses( - pending, N_CONSENSUS_FLAVORS); - - if (!signatures) { - log_warn(LD_DIR, "Couldn't extract signatures."); - goto err; - } - - dirvote_clear_pending_consensuses(); - memcpy(pending_consensuses, pending, sizeof(pending)); - - tor_free(pending_consensus_signatures); - pending_consensus_signatures = signatures; - - if (pending_consensus_signature_list) { - int n_sigs = 0; - /* we may have gotten signatures for this consensus before we built - * it ourself. Add them now. */ - SMARTLIST_FOREACH_BEGIN(pending_consensus_signature_list, char *, sig) { - const char *msg = NULL; - int r = dirvote_add_signatures_to_all_pending_consensuses(sig, - "pending", &msg); - if (r >= 0) - n_sigs += r; - else - log_warn(LD_DIR, - "Could not add queued signature to new consensus: %s", - msg); - tor_free(sig); - } SMARTLIST_FOREACH_END(sig); - if (n_sigs) - log_notice(LD_DIR, "Added %d pending signatures while building " - "consensus.", n_sigs); - smartlist_clear(pending_consensus_signature_list); - } - - log_notice(LD_DIR, "Consensus computed; uploading signature(s)"); - - directory_post_to_dirservers(DIR_PURPOSE_UPLOAD_SIGNATURES, - ROUTER_PURPOSE_GENERAL, - V3_DIRINFO, - pending_consensus_signatures, - strlen(pending_consensus_signatures), 0); - log_notice(LD_DIR, "Signature(s) posted."); - - smartlist_free(votes); - return 0; - err: - smartlist_free(votes); - tor_free(consensus_body); - tor_free(signatures); - networkstatus_vote_free(consensus); - - return -1; -} - -/** Helper: we just got the detached_signatures_body sent to us as - * signatures on the currently pending consensus. Add them to pc - * as appropriate. Return the number of signatures added. (?) */ -static int -dirvote_add_signatures_to_pending_consensus( - pending_consensus_t *pc, - ns_detached_signatures_t *sigs, - const char *source, - int severity, - const char **msg_out) -{ - const char *flavor_name; - int r = -1; - - /* Only call if we have a pending consensus right now. */ - tor_assert(pc->consensus); - tor_assert(pc->body); - tor_assert(pending_consensus_signatures); - - flavor_name = networkstatus_get_flavor_name(pc->consensus->flavor); - *msg_out = NULL; - - { - smartlist_t *sig_list = strmap_get(sigs->signatures, flavor_name); - log_info(LD_DIR, "Have %d signatures for adding to %s consensus.", - sig_list ? smartlist_len(sig_list) : 0, flavor_name); - } - r = networkstatus_add_detached_signatures(pc->consensus, sigs, - source, severity, msg_out); - log_info(LD_DIR,"Added %d signatures to consensus.", r); - - if (r >= 1) { - char *new_signatures = - networkstatus_format_signatures(pc->consensus, 0); - char *dst, *dst_end; - size_t new_consensus_len; - if (!new_signatures) { - *msg_out = "No signatures to add"; - goto err; - } - new_consensus_len = - strlen(pc->body) + strlen(new_signatures) + 1; - pc->body = tor_realloc(pc->body, new_consensus_len); - dst_end = pc->body + new_consensus_len; - dst = strstr(pc->body, "directory-signature "); - tor_assert(dst); - strlcpy(dst, new_signatures, dst_end-dst); - - /* We remove this block once it has failed to crash for a while. But - * unless it shows up in profiles, we're probably better leaving it in, - * just in case we break detached signature processing at some point. */ - { - networkstatus_t *v = networkstatus_parse_vote_from_string( - pc->body, NULL, - NS_TYPE_CONSENSUS); - tor_assert(v); - networkstatus_vote_free(v); - } - *msg_out = "Signatures added"; - tor_free(new_signatures); - } else if (r == 0) { - *msg_out = "Signatures ignored"; - } else { - goto err; - } - - goto done; - err: - if (!*msg_out) - *msg_out = "Unrecognized error while adding detached signatures."; - done: - return r; -} - -static int -dirvote_add_signatures_to_all_pending_consensuses( - const char *detached_signatures_body, - const char *source, - const char **msg_out) -{ - int r=0, i, n_added = 0, errors = 0; - ns_detached_signatures_t *sigs; - tor_assert(detached_signatures_body); - tor_assert(msg_out); - tor_assert(pending_consensus_signatures); - - if (!(sigs = networkstatus_parse_detached_signatures( - detached_signatures_body, NULL))) { - *msg_out = "Couldn't parse detached signatures."; - goto err; - } - - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - int res; - int severity = i == FLAV_NS ? LOG_NOTICE : LOG_INFO; - pending_consensus_t *pc = &pending_consensuses[i]; - if (!pc->consensus) - continue; - res = dirvote_add_signatures_to_pending_consensus(pc, sigs, source, - severity, msg_out); - if (res < 0) - errors++; - else - n_added += res; - } - - if (errors && !n_added) { - r = -1; - goto err; - } - - if (n_added && pending_consensuses[FLAV_NS].consensus) { - char *new_detached = - get_detached_signatures_from_pending_consensuses( - pending_consensuses, N_CONSENSUS_FLAVORS); - if (new_detached) { - tor_free(pending_consensus_signatures); - pending_consensus_signatures = new_detached; - } - } - - r = n_added; - goto done; - err: - if (!*msg_out) - *msg_out = "Unrecognized error while adding detached signatures."; - done: - ns_detached_signatures_free(sigs); - /* XXXX NM Check how return is used. We can now have an error *and* - signatures added. */ - return r; -} - -/** Helper: we just got the detached_signatures_body sent to us as - * signatures on the currently pending consensus. Add them to the pending - * consensus (if we have one); otherwise queue them until we have a - * consensus. Return negative on failure, nonnegative on success. */ -int -dirvote_add_signatures(const char *detached_signatures_body, - const char *source, - const char **msg) -{ - if (pending_consensuses[FLAV_NS].consensus) { - log_notice(LD_DIR, "Got a signature from %s. " - "Adding it to the pending consensus.", source); - return dirvote_add_signatures_to_all_pending_consensuses( - detached_signatures_body, source, msg); - } else { - log_notice(LD_DIR, "Got a signature from %s. " - "Queuing it for the next consensus.", source); - if (!pending_consensus_signature_list) - pending_consensus_signature_list = smartlist_new(); - smartlist_add(pending_consensus_signature_list, - tor_strdup(detached_signatures_body)); - *msg = "Signature queued"; - return 0; - } -} - -/** Replace the consensus that we're currently serving with the one that we've - * been building. (V3 Authority only) */ -static int -dirvote_publish_consensus(void) -{ - int i; - - /* Now remember all the other consensuses as if we were a directory cache. */ - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - pending_consensus_t *pending = &pending_consensuses[i]; - const char *name; - name = networkstatus_get_flavor_name(i); - tor_assert(name); - if (!pending->consensus || - networkstatus_check_consensus_signature(pending->consensus, 1)<0) { - log_warn(LD_DIR, "Not enough info to publish pending %s consensus",name); - continue; - } - - if (networkstatus_set_current_consensus(pending->body, name, 0)) - log_warn(LD_DIR, "Error publishing %s consensus", name); - else - log_notice(LD_DIR, "Published %s consensus", name); - } - - return 0; -} - -/** Release all static storage held in dirvote.c */ -void -dirvote_free_all(void) -{ - dirvote_clear_votes(1); - /* now empty as a result of dirvote_clear_votes(). */ - smartlist_free(pending_vote_list); - pending_vote_list = NULL; - smartlist_free(previous_vote_list); - previous_vote_list = NULL; - - dirvote_clear_pending_consensuses(); - tor_free(pending_consensus_signatures); - if (pending_consensus_signature_list) { - /* now empty as a result of dirvote_clear_votes(). */ - smartlist_free(pending_consensus_signature_list); - pending_consensus_signature_list = NULL; - } -} - -/* ==== - * Access to pending items. - * ==== */ - -/** Return the body of the consensus that we're currently trying to build. */ -const char * -dirvote_get_pending_consensus(consensus_flavor_t flav) -{ - tor_assert(((int)flav) >= 0 && (int)flav < N_CONSENSUS_FLAVORS); - return pending_consensuses[flav].body; -} - -/** Return the signatures that we know for the consensus that we're currently - * trying to build. */ -const char * -dirvote_get_pending_detached_signatures(void) -{ - return pending_consensus_signatures; -} - -/** Return a given vote specified by fp. If by_id, return the - * vote for the authority with the v3 authority identity key digest fp; - * if by_id is false, return the vote whose digest is fp. If - * fp is NULL, return our own vote. If include_previous is - * false, do not consider any votes for a consensus that's already been built. - * If include_pending is false, do not consider any votes for the - * consensus that's in progress. May return NULL if we have no vote for the - * authority in question. */ -const cached_dir_t * -dirvote_get_vote(const char *fp, int flags) -{ - int by_id = flags & DGV_BY_ID; - const int include_pending = flags & DGV_INCLUDE_PENDING; - const int include_previous = flags & DGV_INCLUDE_PREVIOUS; - - if (!pending_vote_list && !previous_vote_list) - return NULL; - if (fp == NULL) { - authority_cert_t *c = get_my_v3_authority_cert(); - if (c) { - fp = c->cache_info.identity_digest; - by_id = 1; - } else - return NULL; - } - if (by_id) { - if (pending_vote_list && include_pending) { - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, pv, - if (fast_memeq(get_voter(pv->vote)->identity_digest, fp, DIGEST_LEN)) - return pv->vote_body); - } - if (previous_vote_list && include_previous) { - SMARTLIST_FOREACH(previous_vote_list, pending_vote_t *, pv, - if (fast_memeq(get_voter(pv->vote)->identity_digest, fp, DIGEST_LEN)) - return pv->vote_body); - } - } else { - if (pending_vote_list && include_pending) { - SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, pv, - if (fast_memeq(pv->vote->digests.d[DIGEST_SHA1], fp, DIGEST_LEN)) - return pv->vote_body); - } - if (previous_vote_list && include_previous) { - SMARTLIST_FOREACH(previous_vote_list, pending_vote_t *, pv, - if (fast_memeq(pv->vote->digests.d[DIGEST_SHA1], fp, DIGEST_LEN)) - return pv->vote_body); - } - } - return NULL; -} - -/** Construct and return a new microdescriptor from a routerinfo ri - * according to consensus_method. - **/ -microdesc_t * -dirvote_create_microdescriptor(const routerinfo_t *ri, int consensus_method) -{ - microdesc_t *result = NULL; - char *key = NULL, *summary = NULL, *family = NULL; - size_t keylen; - smartlist_t *chunks = smartlist_new(); - char *output = NULL; - - if (crypto_pk_write_public_key_to_string(ri->onion_pkey, &key, &keylen)<0) - goto done; - summary = policy_summarize(ri->exit_policy, AF_INET); - if (ri->declared_family) - family = smartlist_join_strings(ri->declared_family, " ", 0, NULL); - - smartlist_add_asprintf(chunks, "onion-key\n%s", key); - - if (consensus_method >= MIN_METHOD_FOR_NTOR_KEY && - ri->onion_curve25519_pkey) { - char kbuf[128]; - base64_encode(kbuf, sizeof(kbuf), - (const char*)ri->onion_curve25519_pkey->public_key, - CURVE25519_PUBKEY_LEN); - smartlist_add_asprintf(chunks, "ntor-onion-key %s", kbuf); - } - - if (consensus_method >= MIN_METHOD_FOR_A_LINES && - !tor_addr_is_null(&ri->ipv6_addr) && ri->ipv6_orport) - smartlist_add_asprintf(chunks, "a %s\n", - fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport)); - - if (family) - smartlist_add_asprintf(chunks, "family %s\n", family); - - if (summary && strcmp(summary, "reject 1-65535")) - smartlist_add_asprintf(chunks, "p %s\n", summary); - - if (consensus_method >= MIN_METHOD_FOR_P6_LINES && - ri->ipv6_exit_policy) { - /* XXXX024 This doesn't match proposal 208, which says these should - * be taken unchanged from the routerinfo. That's bogosity, IMO: - * the proposal should have said to do this instead.*/ - char *p6 = write_short_policy(ri->ipv6_exit_policy); - if (p6 && strcmp(p6, "reject 1-65535")) - smartlist_add_asprintf(chunks, "p6 %s\n", p6); - tor_free(p6); - } - - output = smartlist_join_strings(chunks, "", 0, NULL); - - { - smartlist_t *lst = microdescs_parse_from_string(output, - output+strlen(output), 0, - SAVED_NOWHERE); - if (smartlist_len(lst) != 1) { - log_warn(LD_DIR, "We generated a microdescriptor we couldn't parse."); - SMARTLIST_FOREACH(lst, microdesc_t *, md, microdesc_free(md)); - smartlist_free(lst); - goto done; - } - result = smartlist_get(lst, 0); - smartlist_free(lst); - } - - done: - tor_free(output); - tor_free(key); - tor_free(summary); - tor_free(family); - if (chunks) { - SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); - smartlist_free(chunks); - } - return result; -} - -/** Format the appropriate vote line to describe the microdescriptor md - * in a consensus vote document. Write it into the out_len-byte buffer - * in out. Return -1 on failure and the number of characters written - * on success. */ -ssize_t -dirvote_format_microdesc_vote_line(char *out_buf, size_t out_buf_len, - const microdesc_t *md, - int consensus_method_low, - int consensus_method_high) -{ - ssize_t ret = -1; - char d64[BASE64_DIGEST256_LEN+1]; - char *microdesc_consensus_methods = - make_consensus_method_list(consensus_method_low, - consensus_method_high, - ","); - tor_assert(microdesc_consensus_methods); - - if (digest256_to_base64(d64, md->digest)<0) - goto out; - - if (tor_snprintf(out_buf, out_buf_len, "m %s sha256=%s\n", - microdesc_consensus_methods, d64)<0) - goto out; - - ret = strlen(out_buf); - - out: - tor_free(microdesc_consensus_methods); - return ret; -} - -/** Array of start and end of consensus methods used for supported - microdescriptor formats. */ -static const struct consensus_method_range_t { - int low; - int high; -} microdesc_consensus_methods[] = { - {MIN_METHOD_FOR_MICRODESC, MIN_METHOD_FOR_A_LINES - 1}, - {MIN_METHOD_FOR_A_LINES, MIN_METHOD_FOR_P6_LINES - 1}, - {MIN_METHOD_FOR_P6_LINES, MIN_METHOD_FOR_NTOR_KEY - 1}, - {MIN_METHOD_FOR_NTOR_KEY, MAX_SUPPORTED_CONSENSUS_METHOD}, - {-1, -1} -}; - -/** Helper type used when generating the microdescriptor lines in a directory - * vote. */ -typedef struct microdesc_vote_line_t { - int low; - int high; - microdesc_t *md; - struct microdesc_vote_line_t *next; -} microdesc_vote_line_t; - -/** Generate and return a linked list of all the lines that should appear to - * describe a router's microdescriptor versions in a directory vote. - * Add the generated microdescriptors to microdescriptors_out. */ -vote_microdesc_hash_t * -dirvote_format_all_microdesc_vote_lines(const routerinfo_t *ri, time_t now, - smartlist_t *microdescriptors_out) -{ - const struct consensus_method_range_t *cmr; - microdesc_vote_line_t *entries = NULL, *ep; - vote_microdesc_hash_t *result = NULL; - - /* Generate the microdescriptors. */ - for (cmr = microdesc_consensus_methods; - cmr->low != -1 && cmr->high != -1; - cmr++) { - microdesc_t *md = dirvote_create_microdescriptor(ri, cmr->low); - if (md) { - microdesc_vote_line_t *e = - tor_malloc_zero(sizeof(microdesc_vote_line_t)); - e->md = md; - e->low = cmr->low; - e->high = cmr->high; - e->next = entries; - entries = e; - } - } - - /* Compress adjacent identical ones */ - for (ep = entries; ep; ep = ep->next) { - while (ep->next && - fast_memeq(ep->md->digest, ep->next->md->digest, DIGEST256_LEN) && - ep->low == ep->next->high + 1) { - microdesc_vote_line_t *next = ep->next; - ep->low = next->low; - microdesc_free(next->md); - ep->next = next->next; - tor_free(next); - } - } - - /* Format them into vote_microdesc_hash_t, and add to microdescriptors_out.*/ - while ((ep = entries)) { - char buf[128]; - vote_microdesc_hash_t *h; - dirvote_format_microdesc_vote_line(buf, sizeof(buf), ep->md, - ep->low, ep->high); - h = tor_malloc_zero(sizeof(vote_microdesc_hash_t)); - h->microdesc_hash_line = tor_strdup(buf); - h->next = result; - result = h; - ep->md->last_listed = now; - smartlist_add(microdescriptors_out, ep->md); - entries = ep->next; - tor_free(ep); - } - - return result; -} - -/** If vrs has a hash made for the consensus method method with - * the digest algorithm alg, decode it and copy it into - * digest256_out and return 0. Otherwise return -1. */ -int -vote_routerstatus_find_microdesc_hash(char *digest256_out, - const vote_routerstatus_t *vrs, - int method, - digest_algorithm_t alg) -{ - /* XXXX only returns the sha256 method. */ - const vote_microdesc_hash_t *h; - char mstr[64]; - size_t mlen; - char dstr[64]; - - tor_snprintf(mstr, sizeof(mstr), "%d", method); - mlen = strlen(mstr); - tor_snprintf(dstr, sizeof(dstr), " %s=", - crypto_digest_algorithm_get_name(alg)); - - for (h = vrs->microdesc; h; h = h->next) { - const char *cp = h->microdesc_hash_line; - size_t num_len; - /* cp looks like \d+(,\d+)* (digesttype=val )+ . Let's hunt for mstr in - * the first part. */ - while (1) { - num_len = strspn(cp, "1234567890"); - if (num_len == mlen && fast_memeq(mstr, cp, mlen)) { - /* This is the line. */ - char buf[BASE64_DIGEST256_LEN+1]; - /* XXXX ignores extraneous stuff if the digest is too long. This - * seems harmless enough, right? */ - cp = strstr(cp, dstr); - if (!cp) - return -1; - cp += strlen(dstr); - strlcpy(buf, cp, sizeof(buf)); - return digest256_from_base64(digest256_out, buf); - } - if (num_len == 0 || cp[num_len] != ',') - break; - cp += num_len + 1; - } - } - return -1; -} - diff --git a/src/tor/dirvote.h b/src/tor/dirvote.h deleted file mode 100644 index 3a4951a95..000000000 --- a/src/tor/dirvote.h +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dirvote.h - * \brief Header file for dirvote.c. - **/ - -#ifndef TOR_DIRVOTE_H -#define TOR_DIRVOTE_H - -#include "testsupport.h" - -/** Lowest allowable value for VoteSeconds. */ -#define MIN_VOTE_SECONDS 2 -/** Lowest allowable value for DistSeconds. */ -#define MIN_DIST_SECONDS 2 -/** Smallest allowable voting interval. */ -#define MIN_VOTE_INTERVAL 300 - -/** The highest consensus method that we currently support. */ -#define MAX_SUPPORTED_CONSENSUS_METHOD 17 - -/** Lowest consensus method that contains a 'directory-footer' marker */ -#define MIN_METHOD_FOR_FOOTER 9 - -/** Lowest consensus method that contains bandwidth weights */ -#define MIN_METHOD_FOR_BW_WEIGHTS 9 - -/** Lowest consensus method that contains consensus params */ -#define MIN_METHOD_FOR_PARAMS 7 - -/** Lowest consensus method that generates microdescriptors */ -#define MIN_METHOD_FOR_MICRODESC 8 - -/** Lowest consensus method that doesn't count bad exits as exits for weight */ -#define MIN_METHOD_TO_CUT_BADEXIT_WEIGHT 11 - -/** Lowest consensus method that ensures a majority of authorities voted - * for a param. */ -#define MIN_METHOD_FOR_MAJORITY_PARAMS 12 - -/** Lowest consensus method where microdesc consensuses omit any entry - * with no microdesc. */ -#define MIN_METHOD_FOR_MANDATORY_MICRODESC 13 - -/** Lowest consensus method that contains "a" lines. */ -#define MIN_METHOD_FOR_A_LINES 14 - -/** Lowest consensus method where microdescs may include a "p6" line. */ -#define MIN_METHOD_FOR_P6_LINES 15 - -/** Lowest consensus method where microdescs may include an onion-key-ntor - * line */ -#define MIN_METHOD_FOR_NTOR_KEY 16 - -/** Lowest consensus method that ensures that authorities output an - * Unmeasured=1 flag for unmeasured bandwidths */ -#define MIN_METHOD_TO_CLIP_UNMEASURED_BW 17 - -/** Default bandwidth to clip unmeasured bandwidths to using method >= - * MIN_METHOD_TO_CLIP_UNMEASURED_BW */ -#define DEFAULT_MAX_UNMEASURED_BW_KB 20 - -void dirvote_free_all(void); - -/* vote manipulation */ -char *networkstatus_compute_consensus(smartlist_t *votes, - int total_authorities, - crypto_pk_t *identity_key, - crypto_pk_t *signing_key, - const char *legacy_identity_key_digest, - crypto_pk_t *legacy_signing_key, - consensus_flavor_t flavor); -int networkstatus_add_detached_signatures(networkstatus_t *target, - ns_detached_signatures_t *sigs, - const char *source, - int severity, - const char **msg_out); -char *networkstatus_get_detached_signatures(smartlist_t *consensuses); -void ns_detached_signatures_free(ns_detached_signatures_t *s); - -/* cert manipulation */ -authority_cert_t *authority_cert_dup(authority_cert_t *cert); - -/* vote scheduling */ -void dirvote_get_preferred_voting_intervals(vote_timing_t *timing_out); -time_t dirvote_get_start_of_next_interval(time_t now, - int interval, - int offset); -void dirvote_recalculate_timing(const or_options_t *options, time_t now); -void dirvote_act(const or_options_t *options, time_t now); - -/* invoked on timers and by outside triggers. */ -struct pending_vote_t * dirvote_add_vote(const char *vote_body, - const char **msg_out, - int *status_out); -int dirvote_add_signatures(const char *detached_signatures_body, - const char *source, - const char **msg_out); - -/* Item access */ -const char *dirvote_get_pending_consensus(consensus_flavor_t flav); -const char *dirvote_get_pending_detached_signatures(void); -#define DGV_BY_ID 1 -#define DGV_INCLUDE_PENDING 2 -#define DGV_INCLUDE_PREVIOUS 4 -const cached_dir_t *dirvote_get_vote(const char *fp, int flags); -void set_routerstatus_from_routerinfo(routerstatus_t *rs, - node_t *node, - routerinfo_t *ri, time_t now, - int naming, int listbadexits, - int listbaddirs, int vote_on_hsdirs); -networkstatus_t * -dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, - authority_cert_t *cert); - -microdesc_t *dirvote_create_microdescriptor(const routerinfo_t *ri, - int consensus_method); -ssize_t dirvote_format_microdesc_vote_line(char *out, size_t out_len, - const microdesc_t *md, - int consensus_method_low, - int consensus_method_high); -vote_microdesc_hash_t *dirvote_format_all_microdesc_vote_lines( - const routerinfo_t *ri, - time_t now, - smartlist_t *microdescriptors_out); - -int vote_routerstatus_find_microdesc_hash(char *digest256_out, - const vote_routerstatus_t *vrs, - int method, - digest_algorithm_t alg); -document_signature_t *voter_get_sig_by_algorithm( - const networkstatus_voter_info_t *voter, - digest_algorithm_t alg); - -#ifdef DIRVOTE_PRIVATE -STATIC char *format_networkstatus_vote(crypto_pk_t *private_key, - networkstatus_t *v3_ns); -STATIC char *dirvote_compute_params(smartlist_t *votes, int method, - int total_authorities); -#endif - -#endif - diff --git a/src/tor/dns.c b/src/tor/dns.c deleted file mode 100644 index 9abf550a0..000000000 --- a/src/tor/dns.c +++ /dev/null @@ -1,2203 +0,0 @@ -/* Copyright (c) 2003-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dns.c - * \brief Implements a local cache for DNS results for Tor servers. - * This is implemented as a wrapper around Adam Langley's eventdns.c code. - * (We can't just use gethostbyname() and friends because we really need to - * be nonblocking.) - **/ - -#include "or.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "control.h" -#include "dns.h" -#include "onion_main.h" -#include "policies.h" -#include "relay.h" -#include "router.h" -#include "ht.h" -#include "sandbox.h" -#ifdef HAVE_EVENT2_DNS_H -#include -#include -#else -#include -#include "eventdns.h" -#ifndef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS -#define HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS -#endif -#endif - -#ifndef HAVE_EVENT2_DNS_H -struct evdns_base; -struct evdns_request; -#define evdns_base_new(x,y) tor_malloc(1) -#define evdns_base_clear_nameservers_and_suspend(base) \ - evdns_clear_nameservers_and_suspend() -#define evdns_base_search_clear(base) evdns_search_clear() -#define evdns_base_set_default_outgoing_bind_address(base, a, len) \ - evdns_set_default_outgoing_bind_address((a),(len)) -#define evdns_base_resolv_conf_parse(base, options, fname) \ - evdns_resolv_conf_parse((options), (fname)) -#define evdns_base_count_nameservers(base) \ - evdns_count_nameservers() -#define evdns_base_resume(base) \ - evdns_resume() -#define evdns_base_config_windows_nameservers(base) \ - evdns_config_windows_nameservers() -#define evdns_base_set_option_(base, opt, val) \ - evdns_set_option((opt),(val),DNS_OPTIONS_ALL) -/* Note: our internal eventdns.c, plus Libevent 1.4, used a 1 return to - * signify failure to launch a resolve. Libevent 2.0 uses a -1 return to - * signify a failure on a resolve, though if we're on Libevent 2.0, we should - * have event2/dns.h and never hit these macros. Regardless, 0 is success. */ -#define evdns_base_resolve_ipv4(base, addr, options, cb, ptr) \ - ((evdns_resolve_ipv4((addr), (options), (cb), (ptr))!=0) \ - ? NULL : ((void*)1)) -#define evdns_base_resolve_ipv6(base, addr, options, cb, ptr) \ - ((evdns_resolve_ipv6((addr), (options), (cb), (ptr))!=0) \ - ? NULL : ((void*)1)) -#define evdns_base_resolve_reverse(base, addr, options, cb, ptr) \ - ((evdns_resolve_reverse((addr), (options), (cb), (ptr))!=0) \ - ? NULL : ((void*)1)) -#define evdns_base_resolve_reverse_ipv6(base, addr, options, cb, ptr) \ - ((evdns_resolve_reverse_ipv6((addr), (options), (cb), (ptr))!=0) \ - ? NULL : ((void*)1)) - -#elif defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER < 0x02000303 -#define evdns_base_set_option_(base, opt, val) \ - evdns_base_set_option((base), (opt),(val),DNS_OPTIONS_ALL) - -#else -#define evdns_base_set_option_ evdns_base_set_option - -#endif - -/** Longest hostname we're willing to resolve. */ -#define MAX_ADDRESSLEN 256 - -/** How long will we wait for an answer from the resolver before we decide - * that the resolver is wedged? */ -#define RESOLVE_MAX_TIMEOUT 300 - -/** Our evdns_base; this structure handles all our name lookups. */ -static struct evdns_base *the_evdns_base = NULL; - -/** Have we currently configured nameservers with eventdns? */ -static int nameservers_configured = 0; -/** Did our most recent attempt to configure nameservers with eventdns fail? */ -static int nameserver_config_failed = 0; -/** What was the resolv_conf fname we last used when configuring the - * nameservers? Used to check whether we need to reconfigure. */ -static char *resolv_conf_fname = NULL; -/** What was the mtime on the resolv.conf file we last used when configuring - * the nameservers? Used to check whether we need to reconfigure. */ -static time_t resolv_conf_mtime = 0; - -/** Linked list of connections waiting for a DNS answer. */ -typedef struct pending_connection_t { - edge_connection_t *conn; - struct pending_connection_t *next; -} pending_connection_t; - -/** Value of 'magic' field for cached_resolve_t. Used to try to catch bad - * pointers and memory stomping. */ -#define CACHED_RESOLVE_MAGIC 0x1234F00D - -/* Possible states for a cached resolve_t */ -/** We are waiting for the resolver system to tell us an answer here. - * When we get one, or when we time out, the state of this cached_resolve_t - * will become "DONE" and we'll possibly add a CACHED - * entry. This cached_resolve_t will be in the hash table so that we will - * know not to launch more requests for this addr, but rather to add more - * connections to the pending list for the addr. */ -#define CACHE_STATE_PENDING 0 -/** This used to be a pending cached_resolve_t, and we got an answer for it. - * Now we're waiting for this cached_resolve_t to expire. This should - * have no pending connections, and should not appear in the hash table. */ -#define CACHE_STATE_DONE 1 -/** We are caching an answer for this address. This should have no pending - * connections, and should appear in the hash table. */ -#define CACHE_STATE_CACHED 2 - -/** @name status values for a single DNS request. - * - * @{ */ -/** The DNS request is in progress. */ -#define RES_STATUS_INFLIGHT 1 -/** The DNS request finished and gave an answer */ -#define RES_STATUS_DONE_OK 2 -/** The DNS request finished and gave an error */ -#define RES_STATUS_DONE_ERR 3 -/**@}*/ - -/** A DNS request: possibly completed, possibly pending; cached_resolve - * structs are stored at the OR side in a hash table, and as a linked - * list from oldest to newest. - */ -typedef struct cached_resolve_t { - HT_ENTRY(cached_resolve_t) node; - uint32_t magic; /**< Must be CACHED_RESOLVE_MAGIC */ - char address[MAX_ADDRESSLEN]; /**< The hostname to be resolved. */ - - union { - uint32_t addr_ipv4; /**< IPv4 addr for address, if successful. - * (In host order.) */ - int err_ipv4; /**< One of DNS_ERR_*, if IPv4 lookup failed. */ - } result_ipv4; /**< Outcome of IPv4 lookup */ - union { - struct in6_addr addr_ipv6; /**< IPv6 addr for address, if - * successful */ - int err_ipv6; /**< One of DNS_ERR_*, if IPv6 lookup failed. */ - } result_ipv6; /**< Outcome of IPv6 lookup, if any */ - union { - char *hostname; /** A hostname, if PTR lookup happened successfully*/ - int err_hostname; /** One of DNS_ERR_*, if PTR lookup failed. */ - } result_ptr; - /** @name Status fields - * - * These take one of the RES_STATUS_* values, depending on the state - * of the corresponding lookup. - * - * @{ */ - unsigned int res_status_ipv4 : 2; - unsigned int res_status_ipv6 : 2; - unsigned int res_status_hostname : 2; - /**@}*/ - uint8_t state; /**< Is this cached entry pending/done/informative? */ - - time_t expire; /**< Remove items from cache after this time. */ - uint32_t ttl_ipv4; /**< What TTL did the nameserver tell us? */ - uint32_t ttl_ipv6; /**< What TTL did the nameserver tell us? */ - uint32_t ttl_hostname; /**< What TTL did the nameserver tell us? */ - /** Connections that want to know when we get an answer for this resolve. */ - pending_connection_t *pending_connections; - /** Position of this element in the heap*/ - int minheap_idx; -} cached_resolve_t; - -static void purge_expired_resolves(time_t now); -static void dns_found_answer(const char *address, uint8_t query_type, - int dns_answer, - const tor_addr_t *addr, - const char *hostname, - uint32_t ttl); -static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type, - const cached_resolve_t *resolve); -static int launch_resolve(cached_resolve_t *resolve); -static void add_wildcarded_test_address(const char *address); -static int configure_nameservers(int force); -static int answer_is_wildcarded(const char *ip); -static int dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, - or_circuit_t *oncirc, char **resolved_to_hostname, - int *made_connection_pending_out, - cached_resolve_t **resolve_out); -static int set_exitconn_info_from_resolve(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out); -static int evdns_err_is_transient(int err); -static void inform_pending_connections(cached_resolve_t *resolve); -static void make_pending_resolve_cached(cached_resolve_t *cached); - -#ifdef DEBUG_DNS_CACHE -static void assert_cache_ok_(void); -#define assert_cache_ok() assert_cache_ok_() -#else -#define assert_cache_ok() STMT_NIL -#endif -static void assert_resolve_ok(cached_resolve_t *resolve); - -/** Hash table of cached_resolve objects. */ -static HT_HEAD(cache_map, cached_resolve_t) cache_root; - -/** Global: how many IPv6 requests have we made in all? */ -static uint64_t n_ipv6_requests_made = 0; -/** Global: how many IPv6 requests have timed out? */ -static uint64_t n_ipv6_timeouts = 0; -/** Global: Do we think that IPv6 DNS is broken? */ -static int dns_is_broken_for_ipv6 = 0; - -/** Function to compare hashed resolves on their addresses; used to - * implement hash tables. */ -static INLINE int -cached_resolves_eq(cached_resolve_t *a, cached_resolve_t *b) -{ - /* make this smarter one day? */ - assert_resolve_ok(a); // Not b; b may be just a search. - return !strncmp(a->address, b->address, MAX_ADDRESSLEN); -} - -/** Hash function for cached_resolve objects */ -static INLINE unsigned int -cached_resolve_hash(cached_resolve_t *a) -{ - return ht_string_hash(a->address); -} - -HT_PROTOTYPE(cache_map, cached_resolve_t, node, cached_resolve_hash, - cached_resolves_eq) -HT_GENERATE(cache_map, cached_resolve_t, node, cached_resolve_hash, - cached_resolves_eq, 0.6, malloc, realloc, free) - -/** Initialize the DNS cache. */ -static void -init_cache_map(void) -{ - HT_INIT(cache_map, &cache_root); -} - -/** Helper: called by eventdns when eventdns wants to log something. */ -static void -evdns_log_cb(int warn, const char *msg) -{ - const char *cp; - static int all_down = 0; - int severity = warn ? LOG_WARN : LOG_INFO; - if (!strcmpstart(msg, "Resolve requested for") && - get_options()->SafeLogging) { - log_info(LD_EXIT, "eventdns: Resolve requested."); - return; - } else if (!strcmpstart(msg, "Search: ")) { - return; - } - if (!strcmpstart(msg, "Nameserver ") && (cp=strstr(msg, " has failed: "))) { - char *ns = tor_strndup(msg+11, cp-(msg+11)); - const char *err = strchr(cp, ':')+2; - tor_assert(err); - /* Don't warn about a single failed nameserver; we'll warn with 'all - * nameservers have failed' if we're completely out of nameservers; - * otherwise, the situation is tolerable. */ - severity = LOG_INFO; - control_event_server_status(LOG_NOTICE, - "NAMESERVER_STATUS NS=%s STATUS=DOWN ERR=%s", - ns, escaped(err)); - tor_free(ns); - } else if (!strcmpstart(msg, "Nameserver ") && - (cp=strstr(msg, " is back up"))) { - char *ns = tor_strndup(msg+11, cp-(msg+11)); - severity = (all_down && warn) ? LOG_NOTICE : LOG_INFO; - all_down = 0; - control_event_server_status(LOG_NOTICE, - "NAMESERVER_STATUS NS=%s STATUS=UP", ns); - tor_free(ns); - } else if (!strcmp(msg, "All nameservers have failed")) { - control_event_server_status(LOG_WARN, "NAMESERVER_ALL_DOWN"); - all_down = 1; - } - tor_log(severity, LD_EXIT, "eventdns: %s", msg); -} - -/** Helper: passed to eventdns.c as a callback so it can generate random - * numbers for transaction IDs and 0x20-hack coding. */ -static void -dns_randfn_(char *b, size_t n) -{ - crypto_rand(b,n); -} - -/** Initialize the DNS subsystem; called by the OR process. */ -int -dns_init(void) -{ - init_cache_map(); - evdns_set_random_bytes_fn(dns_randfn_); - if (server_mode(get_options())) { - int r = configure_nameservers(1); - return r; - } - return 0; -} - -/** Called when DNS-related options change (or may have changed). Returns -1 - * on failure, 0 on success. */ -int -dns_reset(void) -{ - const or_options_t *options = get_options(); - if (! server_mode(options)) { - - if (!the_evdns_base) { - if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) { - log_err(LD_BUG, "Couldn't create an evdns_base"); - return -1; - } - } - - evdns_base_clear_nameservers_and_suspend(the_evdns_base); - evdns_base_search_clear(the_evdns_base); - nameservers_configured = 0; - tor_free(resolv_conf_fname); - resolv_conf_mtime = 0; - } else { - if (configure_nameservers(0) < 0) { - return -1; - } - } - return 0; -} - -/** Return true iff the most recent attempt to initialize the DNS subsystem - * failed. */ -int -has_dns_init_failed(void) -{ - return nameserver_config_failed; -} - -/** Helper: Given a TTL from a DNS response, determine what TTL to give the - * OP that asked us to resolve it. */ -uint32_t -dns_clip_ttl(uint32_t ttl) -{ - if (ttl < MIN_DNS_TTL) - return MIN_DNS_TTL; - else if (ttl > MAX_DNS_TTL) - return MAX_DNS_TTL; - else - return ttl; -} - -/** Helper: Given a TTL from a DNS response, determine how long to hold it in - * our cache. */ -static uint32_t -dns_get_expiry_ttl(uint32_t ttl) -{ - if (ttl < MIN_DNS_TTL) - return MIN_DNS_TTL; - else if (ttl > MAX_DNS_ENTRY_AGE) - return MAX_DNS_ENTRY_AGE; - else - return ttl; -} - -/** Helper: free storage held by an entry in the DNS cache. */ -static void -free_cached_resolve_(cached_resolve_t *r) -{ - if (!r) - return; - while (r->pending_connections) { - pending_connection_t *victim = r->pending_connections; - r->pending_connections = victim->next; - tor_free(victim); - } - if (r->res_status_hostname == RES_STATUS_DONE_OK) - tor_free(r->result_ptr.hostname); - r->magic = 0xFF00FF00; - tor_free(r); -} - -/** Compare two cached_resolve_t pointers by expiry time, and return - * less-than-zero, zero, or greater-than-zero as appropriate. Used for - * the priority queue implementation. */ -static int -compare_cached_resolves_by_expiry_(const void *_a, const void *_b) -{ - const cached_resolve_t *a = _a, *b = _b; - if (a->expire < b->expire) - return -1; - else if (a->expire == b->expire) - return 0; - else - return 1; -} - -/** Priority queue of cached_resolve_t objects to let us know when they - * will expire. */ -static smartlist_t *cached_resolve_pqueue = NULL; - -static void -cached_resolve_add_answer(cached_resolve_t *resolve, - int query_type, - int dns_result, - const tor_addr_t *answer_addr, - const char *answer_hostname, - uint32_t ttl) -{ - if (query_type == DNS_PTR) { - if (resolve->res_status_hostname != RES_STATUS_INFLIGHT) - return; - - if (dns_result == DNS_ERR_NONE && answer_hostname) { - resolve->result_ptr.hostname = tor_strdup(answer_hostname); - resolve->res_status_hostname = RES_STATUS_DONE_OK; - } else { - resolve->result_ptr.err_hostname = dns_result; - resolve->res_status_hostname = RES_STATUS_DONE_ERR; - } - resolve->ttl_hostname = ttl; - } else if (query_type == DNS_IPv4_A) { - if (resolve->res_status_ipv4 != RES_STATUS_INFLIGHT) - return; - - if (dns_result == DNS_ERR_NONE && answer_addr && - tor_addr_family(answer_addr) == AF_INET) { - resolve->result_ipv4.addr_ipv4 = tor_addr_to_ipv4h(answer_addr); - resolve->res_status_ipv4 = RES_STATUS_DONE_OK; - } else { - resolve->result_ipv4.err_ipv4 = dns_result; - resolve->res_status_ipv4 = RES_STATUS_DONE_ERR; - } - - } else if (query_type == DNS_IPv6_AAAA) { - if (resolve->res_status_ipv6 != RES_STATUS_INFLIGHT) - return; - - if (dns_result == DNS_ERR_NONE && answer_addr && - tor_addr_family(answer_addr) == AF_INET6) { - memcpy(&resolve->result_ipv6.addr_ipv6, - tor_addr_to_in6(answer_addr), - sizeof(struct in6_addr)); - resolve->res_status_ipv6 = RES_STATUS_DONE_OK; - } else { - resolve->result_ipv6.err_ipv6 = dns_result; - resolve->res_status_ipv6 = RES_STATUS_DONE_ERR; - } - } -} - -/** Return true iff there are no in-flight requests for resolve. */ -static int -cached_resolve_have_all_answers(const cached_resolve_t *resolve) -{ - return (resolve->res_status_ipv4 != RES_STATUS_INFLIGHT && - resolve->res_status_ipv6 != RES_STATUS_INFLIGHT && - resolve->res_status_hostname != RES_STATUS_INFLIGHT); -} - -/** Set an expiry time for a cached_resolve_t, and add it to the expiry - * priority queue */ -static void -set_expiry(cached_resolve_t *resolve, time_t expires) -{ - tor_assert(resolve && resolve->expire == 0); - if (!cached_resolve_pqueue) - cached_resolve_pqueue = smartlist_new(); - resolve->expire = expires; - smartlist_pqueue_add(cached_resolve_pqueue, - compare_cached_resolves_by_expiry_, - STRUCT_OFFSET(cached_resolve_t, minheap_idx), - resolve); -} - -/** Free all storage held in the DNS cache and related structures. */ -void -dns_free_all(void) -{ - cached_resolve_t **ptr, **next, *item; - assert_cache_ok(); - if (cached_resolve_pqueue) { - SMARTLIST_FOREACH(cached_resolve_pqueue, cached_resolve_t *, res, - { - if (res->state == CACHE_STATE_DONE) - free_cached_resolve_(res); - }); - } - for (ptr = HT_START(cache_map, &cache_root); ptr != NULL; ptr = next) { - item = *ptr; - next = HT_NEXT_RMV(cache_map, &cache_root, ptr); - free_cached_resolve_(item); - } - HT_CLEAR(cache_map, &cache_root); - smartlist_free(cached_resolve_pqueue); - cached_resolve_pqueue = NULL; - tor_free(resolv_conf_fname); -} - -/** Remove every cached_resolve whose expire time is before or - * equal to now from the cache. */ -static void -purge_expired_resolves(time_t now) -{ - cached_resolve_t *resolve, *removed; - pending_connection_t *pend; - edge_connection_t *pendconn; - - assert_cache_ok(); - if (!cached_resolve_pqueue) - return; - - while (smartlist_len(cached_resolve_pqueue)) { - resolve = smartlist_get(cached_resolve_pqueue, 0); - if (resolve->expire > now) - break; - smartlist_pqueue_pop(cached_resolve_pqueue, - compare_cached_resolves_by_expiry_, - STRUCT_OFFSET(cached_resolve_t, minheap_idx)); - - if (resolve->state == CACHE_STATE_PENDING) { - log_debug(LD_EXIT, - "Expiring a dns resolve %s that's still pending. Forgot to " - "cull it? DNS resolve didn't tell us about the timeout?", - escaped_safe_str(resolve->address)); - } else if (resolve->state == CACHE_STATE_CACHED) { - log_debug(LD_EXIT, - "Forgetting old cached resolve (address %s, expires %lu)", - escaped_safe_str(resolve->address), - (unsigned long)resolve->expire); - tor_assert(!resolve->pending_connections); - } else { - tor_assert(resolve->state == CACHE_STATE_DONE); - tor_assert(!resolve->pending_connections); - } - - if (resolve->pending_connections) { - log_debug(LD_EXIT, - "Closing pending connections on timed-out DNS resolve!"); - while (resolve->pending_connections) { - pend = resolve->pending_connections; - resolve->pending_connections = pend->next; - /* Connections should only be pending if they have no socket. */ - tor_assert(!SOCKET_OK(pend->conn->base_.s)); - pendconn = pend->conn; - if (!pendconn->base_.marked_for_close) { - connection_edge_end(pendconn, END_STREAM_REASON_TIMEOUT); - circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); - connection_free(TO_CONN(pendconn)); - } - tor_free(pend); - } - } - - if (resolve->state == CACHE_STATE_CACHED || - resolve->state == CACHE_STATE_PENDING) { - removed = HT_REMOVE(cache_map, &cache_root, resolve); - if (removed != resolve) { - log_err(LD_BUG, "The expired resolve we purged didn't match any in" - " the cache. Tried to purge %s (%p); instead got %s (%p).", - resolve->address, (void*)resolve, - removed ? removed->address : "NULL", (void*)removed); - } - tor_assert(removed == resolve); - } else { - /* This should be in state DONE. Make sure it's not in the cache. */ - cached_resolve_t *tmp = HT_FIND(cache_map, &cache_root, resolve); - tor_assert(tmp != resolve); - } - if (resolve->res_status_hostname == RES_STATUS_DONE_OK) - tor_free(resolve->result_ptr.hostname); - resolve->magic = 0xF0BBF0BB; - tor_free(resolve); - } - - assert_cache_ok(); -} - -/* argument for send_resolved_cell only, meaning "let the answer type be ipv4 - * or ipv6 depending on the connection's address". */ -#define RESOLVED_TYPE_AUTO 0xff - -/** Send a response to the RESOLVE request of a connection. - * answer_type must be one of - * RESOLVED_TYPE_(AUTO|ERROR|ERROR_TRANSIENT|). - * - * If circ is provided, and we have a cached answer, send the - * answer back along circ; otherwise, send the answer back along - * conn's attached circuit. - */ -static void -send_resolved_cell(edge_connection_t *conn, uint8_t answer_type, - const cached_resolve_t *resolved) -{ - char buf[RELAY_PAYLOAD_SIZE], *cp = buf; - size_t buflen = 0; - uint32_t ttl; - - buf[0] = answer_type; - ttl = dns_clip_ttl(conn->address_ttl); - - switch (answer_type) - { - case RESOLVED_TYPE_AUTO: - if (resolved && resolved->res_status_ipv4 == RES_STATUS_DONE_OK) { - cp[0] = RESOLVED_TYPE_IPV4; - cp[1] = 4; - set_uint32(cp+2, htonl(resolved->result_ipv4.addr_ipv4)); - set_uint32(cp+6, htonl(ttl)); - cp += 10; - } - if (resolved && resolved->res_status_ipv6 == RES_STATUS_DONE_OK) { - const uint8_t *bytes = resolved->result_ipv6.addr_ipv6.s6_addr; - cp[0] = RESOLVED_TYPE_IPV6; - cp[1] = 16; - memcpy(cp+2, bytes, 16); - set_uint32(cp+18, htonl(ttl)); - cp += 22; - } - if (cp != buf) { - buflen = cp - buf; - break; - } else { - answer_type = RESOLVED_TYPE_ERROR; - /* fall through. */ - } - case RESOLVED_TYPE_ERROR_TRANSIENT: - case RESOLVED_TYPE_ERROR: - { - const char *errmsg = "Error resolving hostname"; - size_t msglen = strlen(errmsg); - - buf[0] = answer_type; - buf[1] = msglen; - strlcpy(buf+2, errmsg, sizeof(buf)-2); - set_uint32(buf+2+msglen, htonl(ttl)); - buflen = 6+msglen; - break; - } - default: - tor_assert(0); - return; - } - // log_notice(LD_EXIT, "Sending a regular RESOLVED reply: "); - - connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); -} - -/** Send a response to the RESOLVE request of a connection for an in-addr.arpa - * address on connection conn which yielded the result hostname. - * The answer type will be RESOLVED_HOSTNAME. - * - * If circ is provided, and we have a cached answer, send the - * answer back along circ; otherwise, send the answer back along - * conn's attached circuit. - */ -static void -send_resolved_hostname_cell(edge_connection_t *conn, const char *hostname) -{ - char buf[RELAY_PAYLOAD_SIZE]; - size_t buflen; - uint32_t ttl; - size_t namelen = strlen(hostname); - tor_assert(hostname); - - tor_assert(namelen < 256); - ttl = dns_clip_ttl(conn->address_ttl); - - buf[0] = RESOLVED_TYPE_HOSTNAME; - buf[1] = (uint8_t)namelen; - memcpy(buf+2, hostname, namelen); - set_uint32(buf+2+namelen, htonl(ttl)); - buflen = 2+namelen+4; - - // log_notice(LD_EXIT, "Sending a reply RESOLVED reply: %s", hostname); - connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); - // log_notice(LD_EXIT, "Sent"); -} - -/** See if we have a cache entry for exitconn-\>address. If so, - * if resolve valid, put it into exitconn-\>addr and return 1. - * If resolve failed, free exitconn and return -1. - * - * (For EXIT_PURPOSE_RESOLVE connections, send back a RESOLVED error cell - * on returning -1. For EXIT_PURPOSE_CONNECT connections, there's no - * need to send back an END cell, since connection_exit_begin_conn will - * do that for us.) - * - * If we have a cached answer, send the answer back along exitconn's - * circuit. - * - * Else, if seen before and pending, add conn to the pending list, - * and return 0. - * - * Else, if not seen before, add conn to pending list, hand to - * dns farm, and return 0. - * - * Exitconn's on_circuit field must be set, but exitconn should not - * yet be linked onto the n_streams/resolving_streams list of that circuit. - * On success, link the connection to n_streams if it's an exit connection. - * On "pending", link the connection to resolving streams. Otherwise, - * clear its on_circuit field. - */ -int -dns_resolve(edge_connection_t *exitconn) -{ - or_circuit_t *oncirc = TO_OR_CIRCUIT(exitconn->on_circuit); - int is_resolve, r; - int made_connection_pending = 0; - char *hostname = NULL; - cached_resolve_t *resolve = NULL; - is_resolve = exitconn->base_.purpose == EXIT_PURPOSE_RESOLVE; - - r = dns_resolve_impl(exitconn, is_resolve, oncirc, &hostname, - &made_connection_pending, &resolve); - - switch (r) { - case 1: - /* We got an answer without a lookup -- either the answer was - * cached, or it was obvious (like an IP address). */ - if (is_resolve) { - /* Send the answer back right now, and detach. */ - if (hostname) - send_resolved_hostname_cell(exitconn, hostname); - else - send_resolved_cell(exitconn, RESOLVED_TYPE_AUTO, resolve); - exitconn->on_circuit = NULL; - } else { - /* Add to the n_streams list; the calling function will send back a - * connected cell. */ - exitconn->next_stream = oncirc->n_streams; - oncirc->n_streams = exitconn; - } - break; - case 0: - /* The request is pending: add the connection into the linked list of - * resolving_streams on this circuit. */ - exitconn->base_.state = EXIT_CONN_STATE_RESOLVING; - exitconn->next_stream = oncirc->resolving_streams; - oncirc->resolving_streams = exitconn; - break; - case -2: - case -1: - /* The request failed before it could start: cancel this connection, - * and stop everybody waiting for the same connection. */ - if (is_resolve) { - send_resolved_cell(exitconn, - (r == -1) ? RESOLVED_TYPE_ERROR : RESOLVED_TYPE_ERROR_TRANSIENT, - NULL); - } - - exitconn->on_circuit = NULL; - - dns_cancel_pending_resolve(exitconn->base_.address); - - if (!made_connection_pending && !exitconn->base_.marked_for_close) { - /* If we made the connection pending, then we freed it already in - * dns_cancel_pending_resolve(). If we marked it for close, it'll - * get freed from the main loop. Otherwise, can free it now. */ - connection_free(TO_CONN(exitconn)); - } - break; - default: - tor_assert(0); - } - - tor_free(hostname); - return r; -} - -/** Helper function for dns_resolve: same functionality, but does not handle: - * - marking connections on error and clearing their on_circuit - * - linking connections to n_streams/resolving_streams, - * - sending resolved cells if we have an answer/error right away, - * - * Return -2 on a transient error. If it's a reverse resolve and it's - * successful, sets *hostname_out to a newly allocated string - * holding the cached reverse DNS value. - * - * Set *made_connection_pending_out to true if we have placed - * exitconn on the list of pending connections for some resolve; set it - * to false otherwise. - * - * Set *resolve_out to a cached resolve, if we found one. - */ -static int -dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, - or_circuit_t *oncirc, char **hostname_out, - int *made_connection_pending_out, - cached_resolve_t **resolve_out) -{ - cached_resolve_t *resolve; - cached_resolve_t search; - pending_connection_t *pending_connection; - int is_reverse = 0; - tor_addr_t addr; - time_t now = time(NULL); - int r; - assert_connection_ok(TO_CONN(exitconn), 0); - tor_assert(!SOCKET_OK(exitconn->base_.s)); - assert_cache_ok(); - tor_assert(oncirc); - *made_connection_pending_out = 0; - - /* first check if exitconn->base_.address is an IP. If so, we already - * know the answer. */ - if (tor_addr_parse(&addr, exitconn->base_.address) >= 0) { - if (tor_addr_family(&addr) == AF_INET || - tor_addr_family(&addr) == AF_INET6) { - tor_addr_copy(&exitconn->base_.addr, &addr); - exitconn->address_ttl = DEFAULT_DNS_TTL; - return 1; - } else { - /* XXXX unspec? Bogus? */ - return -1; - } - } - - /* If we're a non-exit, don't even do DNS lookups. */ - if (router_my_exit_policy_is_reject_star()) - return -1; - - if (address_is_invalid_destination(exitconn->base_.address, 0)) { - tor_log(LOG_PROTOCOL_WARN, LD_EXIT, - "Rejecting invalid destination address %s", - escaped_safe_str(exitconn->base_.address)); - return -1; - } - - /* then take this opportunity to see if there are any expired - * resolves in the hash table. */ - purge_expired_resolves(now); - - /* lower-case exitconn->base_.address, so it's in canonical form */ - tor_strlower(exitconn->base_.address); - - /* Check whether this is a reverse lookup. If it's malformed, or it's a - * .in-addr.arpa address but this isn't a resolve request, kill the - * connection. - */ - if ((r = tor_addr_parse_PTR_name(&addr, exitconn->base_.address, - AF_UNSPEC, 0)) != 0) { - if (r == 1) { - is_reverse = 1; - if (tor_addr_is_internal(&addr, 0)) /* internal address? */ - return -1; - } - - if (!is_reverse || !is_resolve) { - if (!is_reverse) - log_info(LD_EXIT, "Bad .in-addr.arpa address \"%s\"; sending error.", - escaped_safe_str(exitconn->base_.address)); - else if (!is_resolve) - log_info(LD_EXIT, - "Attempt to connect to a .in-addr.arpa address \"%s\"; " - "sending error.", - escaped_safe_str(exitconn->base_.address)); - - return -1; - } - //log_notice(LD_EXIT, "Looks like an address %s", - //exitconn->base_.address); - } - exitconn->is_reverse_dns_lookup = is_reverse; - - /* now check the hash table to see if 'address' is already there. */ - strlcpy(search.address, exitconn->base_.address, sizeof(search.address)); - resolve = HT_FIND(cache_map, &cache_root, &search); - if (resolve && resolve->expire > now) { /* already there */ - switch (resolve->state) { - case CACHE_STATE_PENDING: - /* add us to the pending list */ - pending_connection = tor_malloc_zero( - sizeof(pending_connection_t)); - pending_connection->conn = exitconn; - pending_connection->next = resolve->pending_connections; - resolve->pending_connections = pending_connection; - *made_connection_pending_out = 1; - log_debug(LD_EXIT,"Connection (fd "TOR_SOCKET_T_FORMAT") waiting " - "for pending DNS resolve of %s", exitconn->base_.s, - escaped_safe_str(exitconn->base_.address)); - return 0; - case CACHE_STATE_CACHED: - log_debug(LD_EXIT,"Connection (fd "TOR_SOCKET_T_FORMAT") found " - "cached answer for %s", - exitconn->base_.s, - escaped_safe_str(resolve->address)); - - *resolve_out = resolve; - - return set_exitconn_info_from_resolve(exitconn, resolve, hostname_out); - case CACHE_STATE_DONE: - log_err(LD_BUG, "Found a 'DONE' dns resolve still in the cache."); - tor_fragile_assert(); - } - tor_assert(0); - } - tor_assert(!resolve); - /* not there, need to add it */ - resolve = tor_malloc_zero(sizeof(cached_resolve_t)); - resolve->magic = CACHED_RESOLVE_MAGIC; - resolve->state = CACHE_STATE_PENDING; - resolve->minheap_idx = -1; - strlcpy(resolve->address, exitconn->base_.address, sizeof(resolve->address)); - - /* add this connection to the pending list */ - pending_connection = tor_malloc_zero(sizeof(pending_connection_t)); - pending_connection->conn = exitconn; - resolve->pending_connections = pending_connection; - *made_connection_pending_out = 1; - - /* Add this resolve to the cache and priority queue. */ - HT_INSERT(cache_map, &cache_root, resolve); - set_expiry(resolve, now + RESOLVE_MAX_TIMEOUT); - - log_debug(LD_EXIT,"Launching %s.", - escaped_safe_str(exitconn->base_.address)); - assert_cache_ok(); - - return launch_resolve(resolve); -} - -/** Given an exit connection exitconn, and a cached_resolve_t - * resolve whose DNS lookups have all succeeded or failed, update the - * appropriate fields (address_ttl and addr) of exitconn. - * - * If this is a reverse lookup, set *hostname_out to a newly allocated - * copy of the name resulting hostname. - * - * Return -2 on a transient error, -1 on a permenent error, and 1 on - * a successful lookup. - */ -static int -set_exitconn_info_from_resolve(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out) -{ - int ipv4_ok, ipv6_ok, answer_with_ipv4, r; - uint32_t begincell_flags; - const int is_resolve = exitconn->base_.purpose == EXIT_PURPOSE_RESOLVE; - tor_assert(exitconn); - tor_assert(resolve); - - if (exitconn->is_reverse_dns_lookup) { - exitconn->address_ttl = resolve->ttl_hostname; - if (resolve->res_status_hostname == RES_STATUS_DONE_OK) { - *hostname_out = tor_strdup(resolve->result_ptr.hostname); - return 1; - } else { - return -1; - } - } - - /* If we're here then the connection wants one or either of ipv4, ipv6, and - * we can give it one or both. */ - if (is_resolve) { - begincell_flags = BEGIN_FLAG_IPV6_OK; - } else { - begincell_flags = exitconn->begincell_flags; - } - - ipv4_ok = (resolve->res_status_ipv4 == RES_STATUS_DONE_OK) && - ! (begincell_flags & BEGIN_FLAG_IPV4_NOT_OK); - ipv6_ok = (resolve->res_status_ipv6 == RES_STATUS_DONE_OK) && - (begincell_flags & BEGIN_FLAG_IPV6_OK) && - get_options()->IPv6Exit; - - /* Now decide which one to actually give. */ - if (ipv4_ok && ipv6_ok && is_resolve) { - answer_with_ipv4 = 1; - } else if (ipv4_ok && ipv6_ok) { - /* If we have both, see if our exit policy has an opinion. */ - const uint16_t port = exitconn->base_.port; - int ipv4_allowed, ipv6_allowed; - tor_addr_t a4, a6; - tor_addr_from_ipv4h(&a4, resolve->result_ipv4.addr_ipv4); - tor_addr_from_in6(&a6, &resolve->result_ipv6.addr_ipv6); - ipv4_allowed = !router_compare_to_my_exit_policy(&a4, port); - ipv6_allowed = !router_compare_to_my_exit_policy(&a6, port); - if (ipv4_allowed && !ipv6_allowed) { - answer_with_ipv4 = 1; - } else if (ipv6_allowed && !ipv4_allowed) { - answer_with_ipv4 = 0; - } else { - /* Our exit policy would permit both. Answer with whichever the user - * prefers */ - answer_with_ipv4 = !(begincell_flags & - BEGIN_FLAG_IPV6_PREFERRED); - } - } else { - /* Otherwise if one is okay, send it back. */ - if (ipv4_ok) { - answer_with_ipv4 = 1; - } else if (ipv6_ok) { - answer_with_ipv4 = 0; - } else { - /* Neither one was okay. Choose based on user preference. */ - answer_with_ipv4 = !(begincell_flags & - BEGIN_FLAG_IPV6_PREFERRED); - } - } - - /* Finally, we write the answer back. */ - r = 1; - if (answer_with_ipv4) { - if (resolve->res_status_ipv4 == RES_STATUS_DONE_OK) { - tor_addr_from_ipv4h(&exitconn->base_.addr, - resolve->result_ipv4.addr_ipv4); - } else { - r = evdns_err_is_transient(resolve->result_ipv4.err_ipv4) ? -2 : -1; - } - - exitconn->address_ttl = resolve->ttl_ipv4; - } else { - if (resolve->res_status_ipv6 == RES_STATUS_DONE_OK) { - tor_addr_from_in6(&exitconn->base_.addr, - &resolve->result_ipv6.addr_ipv6); - } else { - r = evdns_err_is_transient(resolve->result_ipv6.err_ipv6) ? -2 : -1; - } - - exitconn->address_ttl = resolve->ttl_ipv6; - } - - return r; -} - -/** Log an error and abort if conn is waiting for a DNS resolve. - */ -void -assert_connection_edge_not_dns_pending(edge_connection_t *conn) -{ - pending_connection_t *pend; - cached_resolve_t search; - -#if 1 - cached_resolve_t *resolve; - strlcpy(search.address, conn->base_.address, sizeof(search.address)); - resolve = HT_FIND(cache_map, &cache_root, &search); - if (!resolve) - return; - for (pend = resolve->pending_connections; pend; pend = pend->next) { - tor_assert(pend->conn != conn); - } -#else - cached_resolve_t **resolve; - HT_FOREACH(resolve, cache_map, &cache_root) { - for (pend = (*resolve)->pending_connections; pend; pend = pend->next) { - tor_assert(pend->conn != conn); - } - } -#endif -} - -/** Log an error and abort if any connection waiting for a DNS resolve is - * corrupted. */ -void -assert_all_pending_dns_resolves_ok(void) -{ - pending_connection_t *pend; - cached_resolve_t **resolve; - - HT_FOREACH(resolve, cache_map, &cache_root) { - for (pend = (*resolve)->pending_connections; - pend; - pend = pend->next) { - assert_connection_ok(TO_CONN(pend->conn), 0); - tor_assert(!SOCKET_OK(pend->conn->base_.s)); - tor_assert(!connection_in_array(TO_CONN(pend->conn))); - } - } -} - -/** Remove conn from the list of connections waiting for conn-\>address. - */ -void -connection_dns_remove(edge_connection_t *conn) -{ - pending_connection_t *pend, *victim; - cached_resolve_t search; - cached_resolve_t *resolve; - - tor_assert(conn->base_.type == CONN_TYPE_EXIT); - tor_assert(conn->base_.state == EXIT_CONN_STATE_RESOLVING); - - strlcpy(search.address, conn->base_.address, sizeof(search.address)); - - resolve = HT_FIND(cache_map, &cache_root, &search); - if (!resolve) { - log_notice(LD_BUG, "Address %s is not pending. Dropping.", - escaped_safe_str(conn->base_.address)); - return; - } - - tor_assert(resolve->pending_connections); - assert_connection_ok(TO_CONN(conn),0); - - pend = resolve->pending_connections; - - if (pend->conn == conn) { - resolve->pending_connections = pend->next; - tor_free(pend); - log_debug(LD_EXIT, "First connection (fd "TOR_SOCKET_T_FORMAT") no " - "longer waiting for resolve of %s", - conn->base_.s, - escaped_safe_str(conn->base_.address)); - return; - } else { - for ( ; pend->next; pend = pend->next) { - if (pend->next->conn == conn) { - victim = pend->next; - pend->next = victim->next; - tor_free(victim); - log_debug(LD_EXIT, - "Connection (fd "TOR_SOCKET_T_FORMAT") no longer waiting " - "for resolve of %s", - conn->base_.s, escaped_safe_str(conn->base_.address)); - return; /* more are pending */ - } - } - tor_assert(0); /* not reachable unless onlyconn not in pending list */ - } -} - -/** Mark all connections waiting for address for close. Then cancel - * the resolve for address itself, and remove any cached results for - * address from the cache. - */ -void -dns_cancel_pending_resolve(const char *address) -{ - pending_connection_t *pend; - cached_resolve_t search; - cached_resolve_t *resolve, *tmp; - edge_connection_t *pendconn; - circuit_t *circ; - - strlcpy(search.address, address, sizeof(search.address)); - - resolve = HT_FIND(cache_map, &cache_root, &search); - if (!resolve) - return; - - if (resolve->state != CACHE_STATE_PENDING) { - /* We can get into this state if we never actually created the pending - * resolve, due to finding an earlier cached error or something. Just - * ignore it. */ - if (resolve->pending_connections) { - log_warn(LD_BUG, - "Address %s is not pending but has pending connections!", - escaped_safe_str(address)); - tor_fragile_assert(); - } - return; - } - - if (!resolve->pending_connections) { - log_warn(LD_BUG, - "Address %s is pending but has no pending connections!", - escaped_safe_str(address)); - tor_fragile_assert(); - return; - } - tor_assert(resolve->pending_connections); - - /* mark all pending connections to fail */ - log_debug(LD_EXIT, - "Failing all connections waiting on DNS resolve of %s", - escaped_safe_str(address)); - while (resolve->pending_connections) { - pend = resolve->pending_connections; - pend->conn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - pendconn = pend->conn; - assert_connection_ok(TO_CONN(pendconn), 0); - tor_assert(!SOCKET_OK(pendconn->base_.s)); - if (!pendconn->base_.marked_for_close) { - connection_edge_end(pendconn, END_STREAM_REASON_RESOLVEFAILED); - } - circ = circuit_get_by_edge_conn(pendconn); - if (circ) - circuit_detach_stream(circ, pendconn); - if (!pendconn->base_.marked_for_close) - connection_free(TO_CONN(pendconn)); - resolve->pending_connections = pend->next; - tor_free(pend); - } - - tmp = HT_REMOVE(cache_map, &cache_root, resolve); - if (tmp != resolve) { - log_err(LD_BUG, "The cancelled resolve we purged didn't match any in" - " the cache. Tried to purge %s (%p); instead got %s (%p).", - resolve->address, (void*)resolve, - tmp ? tmp->address : "NULL", (void*)tmp); - } - tor_assert(tmp == resolve); - - resolve->state = CACHE_STATE_DONE; -} - -/** Return true iff address is one of the addresses we use to verify - * that well-known sites aren't being hijacked by our DNS servers. */ -static INLINE int -is_test_address(const char *address) -{ - const or_options_t *options = get_options(); - return options->ServerDNSTestAddresses && - smartlist_contains_string_case(options->ServerDNSTestAddresses, address); -} - -/** Called on the OR side when the eventdns library tells us the outcome of a - * single DNS resolve: remember the answer, and tell all pending connections - * about the result of the lookup if the lookup is now done. (address - * is a NUL-terminated string containing the address to look up; - * query_type is one of DNS_{IPv4_A,IPv6_AAAA,PTR}; dns_answer - * is DNS_OK or one of DNS_ERR_*, addr is an IPv4 or IPv6 address if we - * got one; hostname is a hostname fora PTR request if we got one, and - * ttl is the time-to-live of this answer, in seconds.) - */ -static void -dns_found_answer(const char *address, uint8_t query_type, - int dns_answer, - const tor_addr_t *addr, - const char *hostname, uint32_t ttl) -{ - cached_resolve_t search; - cached_resolve_t *resolve; - - assert_cache_ok(); - - strlcpy(search.address, address, sizeof(search.address)); - - resolve = HT_FIND(cache_map, &cache_root, &search); - if (!resolve) { - int is_test_addr = is_test_address(address); - if (!is_test_addr) - log_info(LD_EXIT,"Resolved unasked address %s; ignoring.", - escaped_safe_str(address)); - return; - } - assert_resolve_ok(resolve); - - if (resolve->state != CACHE_STATE_PENDING) { - /* XXXX Maybe update addr? or check addr for consistency? Or let - * VALID replace FAILED? */ - int is_test_addr = is_test_address(address); - if (!is_test_addr) - log_notice(LD_EXIT, - "Resolved %s which was already resolved; ignoring", - escaped_safe_str(address)); - tor_assert(resolve->pending_connections == NULL); - return; - } - - cached_resolve_add_answer(resolve, query_type, dns_answer, - addr, hostname, ttl); - - if (cached_resolve_have_all_answers(resolve)) { - inform_pending_connections(resolve); - - make_pending_resolve_cached(resolve); - } -} - -/** Given a pending cached_resolve_t that we just finished resolving, - * inform every connection that was waiting for the outcome of that - * resolution. */ -static void -inform_pending_connections(cached_resolve_t *resolve) -{ - pending_connection_t *pend; - edge_connection_t *pendconn; - int r; - - while (resolve->pending_connections) { - char *hostname = NULL; - pend = resolve->pending_connections; - pendconn = pend->conn; /* don't pass complex things to the - connection_mark_for_close macro */ - assert_connection_ok(TO_CONN(pendconn),time(NULL)); - - if (pendconn->base_.marked_for_close) { - /* prevent double-remove. */ - pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - resolve->pending_connections = pend->next; - tor_free(pend); - continue; - } - - r = set_exitconn_info_from_resolve(pendconn, - resolve, - &hostname); - - if (r < 0) { - /* prevent double-remove. */ - pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - if (pendconn->base_.purpose == EXIT_PURPOSE_CONNECT) { - connection_edge_end(pendconn, END_STREAM_REASON_RESOLVEFAILED); - /* This detach must happen after we send the end cell. */ - circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); - } else { - send_resolved_cell(pendconn, r == -1 ? - RESOLVED_TYPE_ERROR : RESOLVED_TYPE_ERROR_TRANSIENT, - NULL); - /* This detach must happen after we send the resolved cell. */ - circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); - } - connection_free(TO_CONN(pendconn)); - } else { - circuit_t *circ; - if (pendconn->base_.purpose == EXIT_PURPOSE_CONNECT) { - /* prevent double-remove. */ - pend->conn->base_.state = EXIT_CONN_STATE_CONNECTING; - - circ = circuit_get_by_edge_conn(pend->conn); - tor_assert(circ); - tor_assert(!CIRCUIT_IS_ORIGIN(circ)); - /* unlink pend->conn from resolving_streams, */ - circuit_detach_stream(circ, pend->conn); - /* and link it to n_streams */ - pend->conn->next_stream = TO_OR_CIRCUIT(circ)->n_streams; - pend->conn->on_circuit = circ; - TO_OR_CIRCUIT(circ)->n_streams = pend->conn; - - connection_exit_connect(pend->conn); - } else { - /* prevent double-remove. This isn't really an accurate state, - * but it does the right thing. */ - pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; - if (pendconn->is_reverse_dns_lookup) - send_resolved_hostname_cell(pendconn, hostname); - else - send_resolved_cell(pendconn, RESOLVED_TYPE_AUTO, resolve); - circ = circuit_get_by_edge_conn(pendconn); - tor_assert(circ); - circuit_detach_stream(circ, pendconn); - connection_free(TO_CONN(pendconn)); - } - } - resolve->pending_connections = pend->next; - tor_free(pend); - } -} - -/** Remove a pending cached_resolve_t from the hashtable, and add a - * corresponding cached cached_resolve_t. - * - * This function is only necessary because of the perversity of our - * cache timeout code; see inline comment for ideas on eliminating it. - **/ -static void -make_pending_resolve_cached(cached_resolve_t *resolve) -{ - cached_resolve_t *removed; - - resolve->state = CACHE_STATE_DONE; - removed = HT_REMOVE(cache_map, &cache_root, resolve); - if (removed != resolve) { - log_err(LD_BUG, "The pending resolve we found wasn't removable from" - " the cache. Tried to purge %s (%p); instead got %s (%p).", - resolve->address, (void*)resolve, - removed ? removed->address : "NULL", (void*)removed); - } - assert_resolve_ok(resolve); - assert_cache_ok(); - /* The resolve will eventually just hit the time-out in the expiry queue and - * expire. See fd0bafb0dedc7e2 for a brief explanation of how this got that - * way. XXXXX we could do better!*/ - - { - cached_resolve_t *new_resolve = tor_memdup(resolve, - sizeof(cached_resolve_t)); - uint32_t ttl = UINT32_MAX; - new_resolve->expire = 0; /* So that set_expiry won't croak. */ - if (resolve->res_status_hostname == RES_STATUS_DONE_OK) - new_resolve->result_ptr.hostname = - tor_strdup(resolve->result_ptr.hostname); - - new_resolve->state = CACHE_STATE_CACHED; - - assert_resolve_ok(new_resolve); - HT_INSERT(cache_map, &cache_root, new_resolve); - - if ((resolve->res_status_ipv4 == RES_STATUS_DONE_OK || - resolve->res_status_ipv4 == RES_STATUS_DONE_ERR) && - resolve->ttl_ipv4 < ttl) - ttl = resolve->ttl_ipv4; - - if ((resolve->res_status_ipv6 == RES_STATUS_DONE_OK || - resolve->res_status_ipv6 == RES_STATUS_DONE_ERR) && - resolve->ttl_ipv6 < ttl) - ttl = resolve->ttl_ipv6; - - if ((resolve->res_status_hostname == RES_STATUS_DONE_OK || - resolve->res_status_hostname == RES_STATUS_DONE_ERR) && - resolve->ttl_hostname < ttl) - ttl = resolve->ttl_hostname; - - set_expiry(new_resolve, time(NULL) + dns_get_expiry_ttl(ttl)); - } - - assert_cache_ok(); -} - -/** Eventdns helper: return true iff the eventdns result err is - * a transient failure. */ -static int -evdns_err_is_transient(int err) -{ - switch (err) - { - case DNS_ERR_SERVERFAILED: - case DNS_ERR_TRUNCATED: - case DNS_ERR_TIMEOUT: - return 1; - default: - return 0; - } -} - -/** Configure eventdns nameservers if force is true, or if the configuration - * has changed since the last time we called this function, or if we failed on - * our last attempt. On Unix, this reads from /etc/resolv.conf or - * options->ServerDNSResolvConfFile; on Windows, this reads from - * options->ServerDNSResolvConfFile or the registry. Return 0 on success or - * -1 on failure. */ -static int -configure_nameservers(int force) -{ - const or_options_t *options; - const char *conf_fname; - struct stat st; - int r, flags; - options = get_options(); - conf_fname = options->ServerDNSResolvConfFile; -#ifndef _WIN32 - if (!conf_fname) - conf_fname = "/etc/resolv.conf"; -#endif - flags = DNS_OPTIONS_ALL; - - if (!the_evdns_base) { - if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) { - log_err(LD_BUG, "Couldn't create an evdns_base"); - return -1; - } - } - -#ifdef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS - if (! tor_addr_is_null(&options->OutboundBindAddressIPv4_)) { - int socklen; - struct sockaddr_storage ss; - socklen = tor_addr_to_sockaddr(&options->OutboundBindAddressIPv4_, 0, - (struct sockaddr *)&ss, sizeof(ss)); - if (socklen <= 0) { - log_warn(LD_BUG, "Couldn't convert outbound bind address to sockaddr." - " Ignoring."); - } else { - evdns_base_set_default_outgoing_bind_address(the_evdns_base, - (struct sockaddr *)&ss, - socklen); - } - } -#endif - - evdns_set_log_fn(evdns_log_cb); - if (conf_fname) { - if (stat(sandbox_intern_string(conf_fname), &st)) { - log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s", - conf_fname, strerror(errno)); - goto err; - } - if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname) - && st.st_mtime == resolv_conf_mtime) { - log_info(LD_EXIT, "No change to '%s'", conf_fname); - return 0; - } - if (nameservers_configured) { - evdns_base_search_clear(the_evdns_base); - evdns_base_clear_nameservers_and_suspend(the_evdns_base); - } -#if defined(DNS_OPTION_HOSTSFILE) && defined(USE_LIBSECCOMP) - if (flags & DNS_OPTION_HOSTSFILE) { - flags ^= DNS_OPTION_HOSTSFILE; - evdns_base_load_hosts(the_evdns_base, - sandbox_intern_string("/etc/hosts")); - } -#endif - log_info(LD_EXIT, "Parsing resolver configuration in '%s'", conf_fname); - if ((r = evdns_base_resolv_conf_parse(the_evdns_base, flags, - sandbox_intern_string(conf_fname)))) { - log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)", - conf_fname, conf_fname, r); - goto err; - } - if (evdns_base_count_nameservers(the_evdns_base) == 0) { - log_warn(LD_EXIT, "Unable to find any nameservers in '%s'.", conf_fname); - goto err; - } - tor_free(resolv_conf_fname); - resolv_conf_fname = tor_strdup(conf_fname); - resolv_conf_mtime = st.st_mtime; - if (nameservers_configured) - evdns_base_resume(the_evdns_base); - } -#ifdef _WIN32 - else { - if (nameservers_configured) { - evdns_base_search_clear(the_evdns_base); - evdns_base_clear_nameservers_and_suspend(the_evdns_base); - } - if (evdns_base_config_windows_nameservers(the_evdns_base)) { - log_warn(LD_EXIT,"Could not config nameservers."); - goto err; - } - if (evdns_base_count_nameservers(the_evdns_base) == 0) { - log_warn(LD_EXIT, "Unable to find any platform nameservers in " - "your Windows configuration."); - goto err; - } - if (nameservers_configured) - evdns_base_resume(the_evdns_base); - tor_free(resolv_conf_fname); - resolv_conf_mtime = 0; - } -#endif - -#define SET(k,v) evdns_base_set_option_(the_evdns_base, (k), (v)) - - if (evdns_base_count_nameservers(the_evdns_base) == 1) { - SET("max-timeouts:", "16"); - SET("timeout:", "10"); - } else { - SET("max-timeouts:", "3"); - SET("timeout:", "5"); - } - - if (options->ServerDNSRandomizeCase) - SET("randomize-case:", "1"); - else - SET("randomize-case:", "0"); - -#undef SET - - dns_servers_relaunch_checks(); - - nameservers_configured = 1; - if (nameserver_config_failed) { - nameserver_config_failed = 0; - /* XXX the three calls to republish the descriptor might be producing - * descriptors that are only cosmetically different, especially on - * non-exit relays! -RD */ - mark_my_descriptor_dirty("dns resolvers back"); - } - return 0; - err: - nameservers_configured = 0; - if (! nameserver_config_failed) { - nameserver_config_failed = 1; - mark_my_descriptor_dirty("dns resolvers failed"); - } - return -1; -} - -/** For eventdns: Called when we get an answer for a request we launched. - * See eventdns.h for arguments; 'arg' holds the address we tried to resolve. - */ -static void -evdns_callback(int result, char type, int count, int ttl, void *addresses, - void *arg) -{ - char *arg_ = arg; - uint8_t orig_query_type = arg_[0]; - char *string_address = arg_ + 1; - tor_addr_t addr; - const char *hostname = NULL; - int was_wildcarded = 0; - - tor_addr_make_unspec(&addr); - - /* Keep track of whether IPv6 is working */ - if (type == DNS_IPv6_AAAA) { - if (result == DNS_ERR_TIMEOUT) { - ++n_ipv6_timeouts; - } - - if (n_ipv6_timeouts > 10 && - n_ipv6_timeouts > n_ipv6_requests_made / 2) { - if (! dns_is_broken_for_ipv6) { - log_notice(LD_EXIT, "More than half of our IPv6 requests seem to " - "have timed out. I'm going to assume I can't get AAAA " - "responses."); - dns_is_broken_for_ipv6 = 1; - } - } - } - - if (result == DNS_ERR_NONE) { - if (type == DNS_IPv4_A && count) { - char answer_buf[INET_NTOA_BUF_LEN+1]; - char *escaped_address; - uint32_t *addrs = addresses; - tor_addr_from_ipv4n(&addr, addrs[0]); - - tor_addr_to_str(answer_buf, &addr, sizeof(answer_buf), 0); - escaped_address = esc_for_log(string_address); - - if (answer_is_wildcarded(answer_buf)) { - log_debug(LD_EXIT, "eventdns said that %s resolves to ISP-hijacked " - "address %s; treating as a failure.", - safe_str(escaped_address), - escaped_safe_str(answer_buf)); - was_wildcarded = 1; - tor_addr_make_unspec(&addr); - result = DNS_ERR_NOTEXIST; - } else { - log_debug(LD_EXIT, "eventdns said that %s resolves to %s", - safe_str(escaped_address), - escaped_safe_str(answer_buf)); - } - tor_free(escaped_address); - } else if (type == DNS_IPv6_AAAA && count) { - char answer_buf[TOR_ADDR_BUF_LEN]; - char *escaped_address; - struct in6_addr *addrs = addresses; - tor_addr_from_in6(&addr, &addrs[0]); - tor_inet_ntop(AF_INET6, &addrs[0], answer_buf, sizeof(answer_buf)); - escaped_address = esc_for_log(string_address); - - if (answer_is_wildcarded(answer_buf)) { - log_debug(LD_EXIT, "eventdns said that %s resolves to ISP-hijacked " - "address %s; treating as a failure.", - safe_str(escaped_address), - escaped_safe_str(answer_buf)); - was_wildcarded = 1; - tor_addr_make_unspec(&addr); - result = DNS_ERR_NOTEXIST; - } else { - log_debug(LD_EXIT, "eventdns said that %s resolves to %s", - safe_str(escaped_address), - escaped_safe_str(answer_buf)); - } - tor_free(escaped_address); - } else if (type == DNS_PTR && count) { - char *escaped_address; - hostname = ((char**)addresses)[0]; - escaped_address = esc_for_log(string_address); - log_debug(LD_EXIT, "eventdns said that %s resolves to %s", - safe_str(escaped_address), - escaped_safe_str(hostname)); - tor_free(escaped_address); - } else if (count) { - log_warn(LD_EXIT, "eventdns returned only non-IPv4 answers for %s.", - escaped_safe_str(string_address)); - } else { - log_warn(LD_BUG, "eventdns returned no addresses or error for %s!", - escaped_safe_str(string_address)); - } - } - if (was_wildcarded) { - if (is_test_address(string_address)) { - /* Ick. We're getting redirected on known-good addresses. Our DNS - * server must really hate us. */ - add_wildcarded_test_address(string_address); - } - } - - if (orig_query_type && type && orig_query_type != type) { - log_warn(LD_BUG, "Weird; orig_query_type == %d but type == %d", - (int)orig_query_type, (int)type); - } - if (result != DNS_ERR_SHUTDOWN) - dns_found_answer(string_address, orig_query_type, - result, &addr, hostname, ttl); - - tor_free(arg_); -} - -/** Start a single DNS resolve for address (if query_type is - * DNS_IPv4_A or DNS_IPv6_AAAA) ptr_address (if query_type is - * DNS_PTR). Return 0 if we launched the request, -1 otherwise. */ -static int -launch_one_resolve(const char *address, uint8_t query_type, - const tor_addr_t *ptr_address) -{ - const int options = get_options()->ServerDNSSearchDomains ? 0 - : DNS_QUERY_NO_SEARCH; - const size_t addr_len = strlen(address); - struct evdns_request *req = 0; - char *addr = tor_malloc(addr_len + 2); - addr[0] = (char) query_type; - memcpy(addr+1, address, addr_len + 1); - - switch (query_type) { - case DNS_IPv4_A: - req = evdns_base_resolve_ipv4(the_evdns_base, - address, options, evdns_callback, addr); - break; - case DNS_IPv6_AAAA: - req = evdns_base_resolve_ipv6(the_evdns_base, - address, options, evdns_callback, addr); - ++n_ipv6_requests_made; - break; - case DNS_PTR: - if (tor_addr_family(ptr_address) == AF_INET) - req = evdns_base_resolve_reverse(the_evdns_base, - tor_addr_to_in(ptr_address), - DNS_QUERY_NO_SEARCH, - evdns_callback, addr); - else if (tor_addr_family(ptr_address) == AF_INET6) - req = evdns_base_resolve_reverse_ipv6(the_evdns_base, - tor_addr_to_in6(ptr_address), - DNS_QUERY_NO_SEARCH, - evdns_callback, addr); - else - log_warn(LD_BUG, "Called with PTR query and unexpected address family"); - break; - default: - log_warn(LD_BUG, "Called with unexpectd query type %d", (int)query_type); - break; - } - - if (req) { - return 0; - } else { - tor_free(addr); - return -1; - } -} - -/** For eventdns: start resolving as necessary to find the target for - * exitconn. Returns -1 on error, -2 on transient error, - * 0 on "resolve launched." */ -static int -launch_resolve(cached_resolve_t *resolve) -{ - tor_addr_t a; - int r; - - if (get_options()->DisableNetwork) - return -1; - - /* What? Nameservers not configured? Sounds like a bug. */ - if (!nameservers_configured) { - log_warn(LD_EXIT, "(Harmless.) Nameservers not configured, but resolve " - "launched. Configuring."); - if (configure_nameservers(1) < 0) { - return -1; - } - } - - r = tor_addr_parse_PTR_name( - &a, resolve->address, AF_UNSPEC, 0); - - tor_assert(the_evdns_base); - if (r == 0) { - log_info(LD_EXIT, "Launching eventdns request for %s", - escaped_safe_str(resolve->address)); - resolve->res_status_ipv4 = RES_STATUS_INFLIGHT; - if (get_options()->IPv6Exit) - resolve->res_status_ipv6 = RES_STATUS_INFLIGHT; - - if (launch_one_resolve(resolve->address, DNS_IPv4_A, NULL) < 0) { - resolve->res_status_ipv4 = 0; - r = -1; - } - - if (r==0 && get_options()->IPv6Exit) { - /* We ask for an IPv6 address for *everything*. */ - if (launch_one_resolve(resolve->address, DNS_IPv6_AAAA, NULL) < 0) { - resolve->res_status_ipv6 = 0; - r = -1; - } - } - } else if (r == 1) { - r = 0; - log_info(LD_EXIT, "Launching eventdns reverse request for %s", - escaped_safe_str(resolve->address)); - resolve->res_status_hostname = RES_STATUS_INFLIGHT; - if (launch_one_resolve(resolve->address, DNS_PTR, &a) < 0) { - resolve->res_status_hostname = 0; - r = -1; - } - } else if (r == -1) { - log_warn(LD_BUG, "Somehow a malformed in-addr.arpa address reached here."); - } - - if (r < 0) { - log_fn(LOG_PROTOCOL_WARN, LD_EXIT, "eventdns rejected address %s.", - escaped_safe_str(resolve->address)); - } - return r; -} - -/** How many requests for bogus addresses have we launched so far? */ -static int n_wildcard_requests = 0; - -/** Map from dotted-quad IP address in response to an int holding how many - * times we've seen it for a randomly generated (hopefully bogus) address. It - * would be easier to use definitely-invalid addresses (as specified by - * RFC2606), but see comment in dns_launch_wildcard_checks(). */ -static strmap_t *dns_wildcard_response_count = NULL; - -/** If present, a list of dotted-quad IP addresses that we are pretty sure our - * nameserver wants to return in response to requests for nonexistent domains. - */ -static smartlist_t *dns_wildcard_list = NULL; -/** True iff we've logged about a single address getting wildcarded. - * Subsequent warnings will be less severe. */ -static int dns_wildcard_one_notice_given = 0; -/** True iff we've warned that our DNS server is wildcarding too many failures. - */ -static int dns_wildcard_notice_given = 0; - -/** List of supposedly good addresses that are getting wildcarded to the - * same addresses as nonexistent addresses. */ -static smartlist_t *dns_wildcarded_test_address_list = NULL; -/** True iff we've warned about a test address getting wildcarded */ -static int dns_wildcarded_test_address_notice_given = 0; -/** True iff all addresses seem to be getting wildcarded. */ -static int dns_is_completely_invalid = 0; - -/** Called when we see id (a dotted quad or IPv6 address) in response - * to a request for a hopefully bogus address. */ -static void -wildcard_increment_answer(const char *id) -{ - int *ip; - if (!dns_wildcard_response_count) - dns_wildcard_response_count = strmap_new(); - - ip = strmap_get(dns_wildcard_response_count, id); // may be null (0) - if (!ip) { - ip = tor_malloc_zero(sizeof(int)); - strmap_set(dns_wildcard_response_count, id, ip); - } - ++*ip; - - if (*ip > 5 && n_wildcard_requests > 10) { - if (!dns_wildcard_list) dns_wildcard_list = smartlist_new(); - if (!smartlist_contains_string(dns_wildcard_list, id)) { - tor_log(dns_wildcard_notice_given ? LOG_INFO : LOG_NOTICE, LD_EXIT, - "Your DNS provider has given \"%s\" as an answer for %d different " - "invalid addresses. Apparently they are hijacking DNS failures. " - "I'll try to correct for this by treating future occurrences of " - "\"%s\" as 'not found'.", id, *ip, id); - smartlist_add(dns_wildcard_list, tor_strdup(id)); - } - if (!dns_wildcard_notice_given) - control_event_server_status(LOG_NOTICE, "DNS_HIJACKED"); - dns_wildcard_notice_given = 1; - } -} - -/** Note that a single test address (one believed to be good) seems to be - * getting redirected to the same IP as failures are. */ -static void -add_wildcarded_test_address(const char *address) -{ - int n, n_test_addrs; - if (!dns_wildcarded_test_address_list) - dns_wildcarded_test_address_list = smartlist_new(); - - if (smartlist_contains_string_case(dns_wildcarded_test_address_list, - address)) - return; - - n_test_addrs = get_options()->ServerDNSTestAddresses ? - smartlist_len(get_options()->ServerDNSTestAddresses) : 0; - - smartlist_add(dns_wildcarded_test_address_list, tor_strdup(address)); - n = smartlist_len(dns_wildcarded_test_address_list); - if (n > n_test_addrs/2) { - tor_log(dns_wildcarded_test_address_notice_given ? LOG_INFO : LOG_NOTICE, - LD_EXIT, "Your DNS provider tried to redirect \"%s\" to a junk " - "address. It has done this with %d test addresses so far. I'm " - "going to stop being an exit node for now, since our DNS seems so " - "broken.", address, n); - if (!dns_is_completely_invalid) { - dns_is_completely_invalid = 1; - mark_my_descriptor_dirty("dns hijacking confirmed"); - } - if (!dns_wildcarded_test_address_notice_given) - control_event_server_status(LOG_WARN, "DNS_USELESS"); - dns_wildcarded_test_address_notice_given = 1; - } -} - -/** Callback function when we get an answer (possibly failing) for a request - * for a (hopefully) nonexistent domain. */ -static void -evdns_wildcard_check_callback(int result, char type, int count, int ttl, - void *addresses, void *arg) -{ - (void)ttl; - ++n_wildcard_requests; - if (result == DNS_ERR_NONE && count) { - char *string_address = arg; - int i; - if (type == DNS_IPv4_A) { - const uint32_t *addrs = addresses; - for (i = 0; i < count; ++i) { - char answer_buf[INET_NTOA_BUF_LEN+1]; - struct in_addr in; - in.s_addr = addrs[i]; - tor_inet_ntoa(&in, answer_buf, sizeof(answer_buf)); - wildcard_increment_answer(answer_buf); - } - } else if (type == DNS_IPv6_AAAA) { - const struct in6_addr *addrs = addresses; - for (i = 0; i < count; ++i) { - char answer_buf[TOR_ADDR_BUF_LEN+1]; - tor_inet_ntop(AF_INET6, &addrs[i], answer_buf, sizeof(answer_buf)); - wildcard_increment_answer(answer_buf); - } - } - - tor_log(dns_wildcard_one_notice_given ? LOG_INFO : LOG_NOTICE, LD_EXIT, - "Your DNS provider gave an answer for \"%s\", which " - "is not supposed to exist. Apparently they are hijacking " - "DNS failures. Trying to correct for this. We've noticed %d " - "possibly bad address%s so far.", - string_address, strmap_size(dns_wildcard_response_count), - (strmap_size(dns_wildcard_response_count) == 1) ? "" : "es"); - dns_wildcard_one_notice_given = 1; - } - tor_free(arg); -} - -/** Launch a single request for a nonexistent hostname consisting of between - * min_len and max_len random (plausible) characters followed by - * suffix */ -static void -launch_wildcard_check(int min_len, int max_len, int is_ipv6, - const char *suffix) -{ - char *addr; - struct evdns_request *req; - - addr = crypto_random_hostname(min_len, max_len, "", suffix); - log_info(LD_EXIT, "Testing whether our DNS server is hijacking nonexistent " - "domains with request for bogus hostname \"%s\"", addr); - - tor_assert(the_evdns_base); - if (is_ipv6) - req = evdns_base_resolve_ipv6( - the_evdns_base, - /* This "addr" tells us which address to resolve */ - addr, - DNS_QUERY_NO_SEARCH, evdns_wildcard_check_callback, - /* This "addr" is an argument to the callback*/ addr); - else - req = evdns_base_resolve_ipv4( - the_evdns_base, - /* This "addr" tells us which address to resolve */ - addr, - DNS_QUERY_NO_SEARCH, evdns_wildcard_check_callback, - /* This "addr" is an argument to the callback*/ addr); - if (!req) { - /* There is no evdns request in progress; stop addr from getting leaked */ - tor_free(addr); - } -} - -/** Launch attempts to resolve a bunch of known-good addresses (configured in - * ServerDNSTestAddresses). [Callback for a libevent timer] */ -static void -launch_test_addresses(evutil_socket_t fd, short event, void *args) -{ - const or_options_t *options = get_options(); - (void)fd; - (void)event; - (void)args; - - if (options->DisableNetwork) - return; - - log_info(LD_EXIT, "Launching checks to see whether our nameservers like to " - "hijack *everything*."); - /* This situation is worse than the failure-hijacking situation. When this - * happens, we're no good for DNS requests at all, and we shouldn't really - * be an exit server.*/ - if (options->ServerDNSTestAddresses) { - - tor_assert(the_evdns_base); - SMARTLIST_FOREACH_BEGIN(options->ServerDNSTestAddresses, - const char *, address) { - if (launch_one_resolve(address, DNS_IPv4_A, NULL) < 0) { - log_info(LD_EXIT, "eventdns rejected test address %s", - escaped_safe_str(address)); - } - - if (launch_one_resolve(address, DNS_IPv6_AAAA, NULL) < 0) { - log_info(LD_EXIT, "eventdns rejected test address %s", - escaped_safe_str(address)); - } - } SMARTLIST_FOREACH_END(address); - } -} - -#define N_WILDCARD_CHECKS 2 - -/** Launch DNS requests for a few nonexistent hostnames and a few well-known - * hostnames, and see if we can catch our nameserver trying to hijack them and - * map them to a stupid "I couldn't find ggoogle.com but maybe you'd like to - * buy these lovely encyclopedias" page. */ -static void -dns_launch_wildcard_checks(void) -{ - int i, ipv6; - log_info(LD_EXIT, "Launching checks to see whether our nameservers like " - "to hijack DNS failures."); - for (ipv6 = 0; ipv6 <= 1; ++ipv6) { - for (i = 0; i < N_WILDCARD_CHECKS; ++i) { - /* RFC2606 reserves these. Sadly, some DNS hijackers, in a silly - * attempt to 'comply' with rfc2606, refrain from giving A records for - * these. This is the standards-compliance equivalent of making sure - * that your crackhouse's elevator inspection certificate is up to date. - */ - launch_wildcard_check(2, 16, ipv6, ".invalid"); - launch_wildcard_check(2, 16, ipv6, ".test"); - - /* These will break specs if there are ever any number of - * 8+-character top-level domains. */ - launch_wildcard_check(8, 16, ipv6, ""); - - /* Try some random .com/org/net domains. This will work fine so long as - * not too many resolve to the same place. */ - launch_wildcard_check(8, 16, ipv6, ".com"); - launch_wildcard_check(8, 16, ipv6, ".org"); - launch_wildcard_check(8, 16, ipv6, ".net"); - } - } -} - -/** If appropriate, start testing whether our DNS servers tend to lie to - * us. */ -void -dns_launch_correctness_checks(void) -{ - static struct event *launch_event = NULL; - struct timeval timeout; - if (!get_options()->ServerDNSDetectHijacking) - return; - dns_launch_wildcard_checks(); - - /* Wait a while before launching requests for test addresses, so we can - * get the results from checking for wildcarding. */ - if (! launch_event) - launch_event = tor_evtimer_new(tor_libevent_get_base(), - launch_test_addresses, NULL); - timeout.tv_sec = 30; - timeout.tv_usec = 0; - if (evtimer_add(launch_event, &timeout)<0) { - log_warn(LD_BUG, "Couldn't add timer for checking for dns hijacking"); - } -} - -/** Return true iff our DNS servers lie to us too much to be trusted. */ -int -dns_seems_to_be_broken(void) -{ - return dns_is_completely_invalid; -} - -/** Return true iff we think that IPv6 hostname lookup is broken */ -int -dns_seems_to_be_broken_for_ipv6(void) -{ - return dns_is_broken_for_ipv6; -} - -/** Forget what we've previously learned about our DNS servers' correctness. */ -void -dns_reset_correctness_checks(void) -{ - strmap_free(dns_wildcard_response_count, tor_free_); - dns_wildcard_response_count = NULL; - - n_wildcard_requests = 0; - - n_ipv6_requests_made = n_ipv6_timeouts = 0; - - if (dns_wildcard_list) { - SMARTLIST_FOREACH(dns_wildcard_list, char *, cp, tor_free(cp)); - smartlist_clear(dns_wildcard_list); - } - if (dns_wildcarded_test_address_list) { - SMARTLIST_FOREACH(dns_wildcarded_test_address_list, char *, cp, - tor_free(cp)); - smartlist_clear(dns_wildcarded_test_address_list); - } - dns_wildcard_one_notice_given = dns_wildcard_notice_given = - dns_wildcarded_test_address_notice_given = dns_is_completely_invalid = - dns_is_broken_for_ipv6 = 0; -} - -/** Return true iff we have noticed that the dotted-quad ip has been - * returned in response to requests for nonexistent hostnames. */ -static int -answer_is_wildcarded(const char *ip) -{ - return dns_wildcard_list && smartlist_contains_string(dns_wildcard_list, ip); -} - -/** Exit with an assertion if resolve is corrupt. */ -static void -assert_resolve_ok(cached_resolve_t *resolve) -{ - tor_assert(resolve); - tor_assert(resolve->magic == CACHED_RESOLVE_MAGIC); - tor_assert(strlen(resolve->address) < MAX_ADDRESSLEN); - tor_assert(tor_strisnonupper(resolve->address)); - if (resolve->state != CACHE_STATE_PENDING) { - tor_assert(!resolve->pending_connections); - } - if (resolve->state == CACHE_STATE_PENDING || - resolve->state == CACHE_STATE_DONE) { -#if 0 - tor_assert(!resolve->ttl); - if (resolve->is_reverse) - tor_assert(!resolve->hostname); - else - tor_assert(!resolve->result_ipv4.addr_ipv4); -#endif - /*XXXXX ADD MORE */ - } -} - -/** Return the number of DNS cache entries as an int */ -static int -dns_cache_entry_count(void) -{ - return HT_SIZE(&cache_root); -} - -/** Log memory information about our internal DNS cache at level 'severity'. */ -void -dump_dns_mem_usage(int severity) -{ - /* This should never be larger than INT_MAX. */ - int hash_count = dns_cache_entry_count(); - size_t hash_mem = sizeof(struct cached_resolve_t) * hash_count; - hash_mem += HT_MEM_USAGE(&cache_root); - - /* Print out the count and estimated size of our &cache_root. It undercounts - hostnames in cached reverse resolves. - */ - tor_log(severity, LD_MM, "Our DNS cache has %d entries.", hash_count); - tor_log(severity, LD_MM, "Our DNS cache size is approximately %u bytes.", - (unsigned)hash_mem); -} - -#ifdef DEBUG_DNS_CACHE -/** Exit with an assertion if the DNS cache is corrupt. */ -static void -assert_cache_ok_(void) -{ - cached_resolve_t **resolve; - int bad_rep = _cache_map_HT_REP_IS_BAD(&cache_root); - if (bad_rep) { - log_err(LD_BUG, "Bad rep type %d on dns cache hash table", bad_rep); - tor_assert(!bad_rep); - } - - HT_FOREACH(resolve, cache_map, &cache_root) { - assert_resolve_ok(*resolve); - tor_assert((*resolve)->state != CACHE_STATE_DONE); - } - if (!cached_resolve_pqueue) - return; - - smartlist_pqueue_assert_ok(cached_resolve_pqueue, - compare_cached_resolves_by_expiry_, - STRUCT_OFFSET(cached_resolve_t, minheap_idx)); - - SMARTLIST_FOREACH(cached_resolve_pqueue, cached_resolve_t *, res, - { - if (res->state == CACHE_STATE_DONE) { - cached_resolve_t *found = HT_FIND(cache_map, &cache_root, res); - tor_assert(!found || found != res); - } else { - cached_resolve_t *found = HT_FIND(cache_map, &cache_root, res); - tor_assert(found); - } - }); -} -#endif - diff --git a/src/tor/dns.h b/src/tor/dns.h deleted file mode 100644 index 022cd4ac6..000000000 --- a/src/tor/dns.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dns.h - * \brief Header file for dns.c. - **/ - -#ifndef TOR_DNS_H -#define TOR_DNS_H - -int dns_init(void); -int has_dns_init_failed(void); -void dns_free_all(void); -uint32_t dns_clip_ttl(uint32_t ttl); -int dns_reset(void); -void connection_dns_remove(edge_connection_t *conn); -void assert_connection_edge_not_dns_pending(edge_connection_t *conn); -void assert_all_pending_dns_resolves_ok(void); -void dns_cancel_pending_resolve(const char *question); -int dns_resolve(edge_connection_t *exitconn); -void dns_launch_correctness_checks(void); -int dns_seems_to_be_broken(void); -int dns_seems_to_be_broken_for_ipv6(void); -void dns_reset_correctness_checks(void); -void dump_dns_mem_usage(int severity); - -#endif - diff --git a/src/tor/dnsserv.c b/src/tor/dnsserv.c deleted file mode 100644 index 9ac42e40f..000000000 --- a/src/tor/dnsserv.c +++ /dev/null @@ -1,374 +0,0 @@ -/* Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dnsserv.c \brief Implements client-side DNS proxy server code. Note: - * this is the DNS Server code, not the Server DNS code. Confused? This code - * runs on client-side, and acts as a DNS server. The code in dns.c, on the - * other hand, runs on Tor servers, and acts as a DNS client. - **/ - -#include "or.h" -#include "dnsserv.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "control.h" -#include "onion_main.h" -#include "policies.h" -#ifdef HAVE_EVENT2_DNS_H -#include -#include -/* XXXX this implies we want an improved evdns */ -#include -#else -#include "eventdns.h" -#endif - -/** Helper function: called by evdns whenever the client sends a request to our - * DNSPort. We need to eventually answer the request req. - */ -static void -evdns_server_callback(struct evdns_server_request *req, void *data_) -{ - const listener_connection_t *listener = data_; - entry_connection_t *entry_conn; - edge_connection_t *conn; - int i = 0; - struct evdns_server_question *q = NULL; - struct sockaddr_storage addr; - struct sockaddr *sa; - int addrlen; - tor_addr_t tor_addr; - uint16_t port; - int err = DNS_ERR_NONE; - char *q_name; - - tor_assert(req); - - log_info(LD_APP, "Got a new DNS request!"); - - req->flags |= 0x80; /* set RA */ - - /* First, check whether the requesting address matches our SOCKSPolicy. */ - if ((addrlen = evdns_server_request_get_requesting_addr(req, - (struct sockaddr*)&addr, (socklen_t)sizeof(addr))) < 0) { - log_warn(LD_APP, "Couldn't get requesting address."); - evdns_server_request_respond(req, DNS_ERR_SERVERFAILED); - return; - } - (void) addrlen; - sa = (struct sockaddr*) &addr; - if (tor_addr_from_sockaddr(&tor_addr, sa, &port)<0) { - log_warn(LD_APP, "Requesting address wasn't recognized."); - evdns_server_request_respond(req, DNS_ERR_SERVERFAILED); - return; - } - - if (!socks_policy_permits_address(&tor_addr)) { - log_warn(LD_APP, "Rejecting DNS request from disallowed IP."); - evdns_server_request_respond(req, DNS_ERR_REFUSED); - return; - } - - /* Now, let's find the first actual question of a type we can answer in this - * DNS request. It makes us a little noncompliant to act like this; we - * should fix that eventually if it turns out to make a difference for - * anybody. */ - if (req->nquestions == 0) { - log_info(LD_APP, "No questions in DNS request; sending back nil reply."); - evdns_server_request_respond(req, 0); - return; - } - if (req->nquestions > 1) { - log_info(LD_APP, "Got a DNS request with more than one question; I only " - "handle one question at a time for now. Skipping the extras."); - } - for (i = 0; i < req->nquestions; ++i) { - if (req->questions[i]->dns_question_class != EVDNS_CLASS_INET) - continue; - switch (req->questions[i]->type) { - case EVDNS_TYPE_A: - case EVDNS_TYPE_AAAA: - case EVDNS_TYPE_PTR: - q = req->questions[i]; - default: - break; - } - } - if (!q) { - log_info(LD_APP, "None of the questions we got were ones we're willing " - "to support. Sending NOTIMPL."); - evdns_server_request_respond(req, DNS_ERR_NOTIMPL); - return; - } - if (q->type != EVDNS_TYPE_A && q->type != EVDNS_TYPE_AAAA) { - tor_assert(q->type == EVDNS_TYPE_PTR); - } - - /* Make sure the name isn't too long: This should be impossible, I think. */ - if (err == DNS_ERR_NONE && strlen(q->name) > MAX_SOCKS_ADDR_LEN-1) - err = DNS_ERR_FORMAT; - - if (err != DNS_ERR_NONE) { - /* We got an error? Then send back an answer immediately; we're done. */ - evdns_server_request_respond(req, err); - return; - } - - /* Make a new dummy AP connection, and attach the request to it. */ - entry_conn = entry_connection_new(CONN_TYPE_AP, AF_INET); - conn = ENTRY_TO_EDGE_CONN(entry_conn); - TO_CONN(conn)->state = AP_CONN_STATE_RESOLVE_WAIT; - conn->is_dns_request = 1; - - tor_addr_copy(&TO_CONN(conn)->addr, &tor_addr); - TO_CONN(conn)->port = port; - TO_CONN(conn)->address = tor_dup_addr(&tor_addr); - - if (q->type == EVDNS_TYPE_A || q->type == EVDNS_TYPE_AAAA) - entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE; - else - entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - - strlcpy(entry_conn->socks_request->address, q->name, - sizeof(entry_conn->socks_request->address)); - - entry_conn->socks_request->listener_type = listener->base_.type; - entry_conn->dns_server_request = req; - entry_conn->isolation_flags = listener->isolation_flags; - entry_conn->session_group = listener->session_group; - entry_conn->nym_epoch = get_signewnym_epoch(); - - if (connection_add(ENTRY_TO_CONN(entry_conn)) < 0) { - log_warn(LD_APP, "Couldn't register dummy connection for DNS request"); - evdns_server_request_respond(req, DNS_ERR_SERVERFAILED); - connection_free(ENTRY_TO_CONN(entry_conn)); - return; - } - - control_event_stream_status(entry_conn, STREAM_EVENT_NEW_RESOLVE, 0); - - /* Now, unless a controller asked us to leave streams unattached, - * throw the connection over to get rewritten (which will - * answer it immediately if it's in the cache, or completely bogus, or - * automapped), and then attached to a circuit. */ - log_info(LD_APP, "Passing request for %s to rewrite_and_attach.", - escaped_safe_str_client(q->name)); - q_name = tor_strdup(q->name); /* q could be freed in rewrite_and_attach */ - connection_ap_rewrite_and_attach_if_allowed(entry_conn, NULL, NULL); - /* Now, the connection is marked if it was bad. */ - - log_info(LD_APP, "Passed request for %s to rewrite_and_attach_if_allowed.", - escaped_safe_str_client(q_name)); - tor_free(q_name); -} - -/** Helper function: called whenever the client sends a resolve request to our - * controller. We need to eventually answer the request req. - * Returns 0 if the controller will be getting (or has gotten) an event in - * response; -1 if we couldn't launch the request. - */ -int -dnsserv_launch_request(const char *name, int reverse, - control_connection_t *control_conn) -{ - entry_connection_t *entry_conn; - edge_connection_t *conn; - char *q_name; - - /* Make a new dummy AP connection, and attach the request to it. */ - entry_conn = entry_connection_new(CONN_TYPE_AP, AF_INET); - conn = ENTRY_TO_EDGE_CONN(entry_conn); - conn->base_.state = AP_CONN_STATE_RESOLVE_WAIT; - - tor_addr_copy(&TO_CONN(conn)->addr, &control_conn->base_.addr); -#ifdef AF_UNIX - /* - * The control connection can be AF_UNIX and if so tor_dup_addr will - * unhelpfully say ""; say "(Tor_internal)" - * instead. - */ - if (control_conn->base_.socket_family == AF_UNIX) { - TO_CONN(conn)->port = 0; - TO_CONN(conn)->address = tor_strdup("(Tor_internal)"); - } else { - TO_CONN(conn)->port = control_conn->base_.port; - TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr); - } -#else - TO_CONN(conn)->port = control_conn->base_.port; - TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr); -#endif - - if (reverse) - entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; - else - entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE; - - conn->is_dns_request = 1; - - strlcpy(entry_conn->socks_request->address, name, - sizeof(entry_conn->socks_request->address)); - - entry_conn->socks_request->listener_type = CONN_TYPE_CONTROL_LISTENER; - entry_conn->original_dest_address = tor_strdup(name); - entry_conn->session_group = SESSION_GROUP_CONTROL_RESOLVE; - entry_conn->nym_epoch = get_signewnym_epoch(); - entry_conn->isolation_flags = ISO_DEFAULT; - - if (connection_add(TO_CONN(conn))<0) { - log_warn(LD_APP, "Couldn't register dummy connection for RESOLVE request"); - connection_free(TO_CONN(conn)); - return -1; - } - - control_event_stream_status(entry_conn, STREAM_EVENT_NEW_RESOLVE, 0); - - /* Now, unless a controller asked us to leave streams unattached, - * throw the connection over to get rewritten (which will - * answer it immediately if it's in the cache, or completely bogus, or - * automapped), and then attached to a circuit. */ - log_info(LD_APP, "Passing request for %s to rewrite_and_attach.", - escaped_safe_str_client(name)); - q_name = tor_strdup(name); /* q could be freed in rewrite_and_attach */ - connection_ap_rewrite_and_attach_if_allowed(entry_conn, NULL, NULL); - /* Now, the connection is marked if it was bad. */ - - log_info(LD_APP, "Passed request for %s to rewrite_and_attach_if_allowed.", - escaped_safe_str_client(q_name)); - tor_free(q_name); - return 0; -} - -/** If there is a pending request on conn that's waiting for an answer, - * send back an error and free the request. */ -void -dnsserv_reject_request(entry_connection_t *conn) -{ - if (conn->dns_server_request) { - evdns_server_request_respond(conn->dns_server_request, - DNS_ERR_SERVERFAILED); - conn->dns_server_request = NULL; - } -} - -/** Look up the original name that corresponds to 'addr' in req. We use this - * to preserve case in order to facilitate people using 0x20-hacks to avoid - * DNS poisoning. */ -static const char * -evdns_get_orig_address(const struct evdns_server_request *req, - int rtype, const char *addr) -{ - int i, type; - - switch (rtype) { - case RESOLVED_TYPE_IPV4: - type = EVDNS_TYPE_A; - break; - case RESOLVED_TYPE_HOSTNAME: - type = EVDNS_TYPE_PTR; - break; - case RESOLVED_TYPE_IPV6: - type = EVDNS_TYPE_AAAA; - break; - default: - tor_fragile_assert(); - return addr; - } - - for (i = 0; i < req->nquestions; ++i) { - const struct evdns_server_question *q = req->questions[i]; - if (q->type == type && !strcasecmp(q->name, addr)) - return q->name; - } - return addr; -} - -/** Tell the dns request waiting for an answer on conn that we have an - * answer of type answer_type (RESOLVE_TYPE_IPV4/IPV6/ERR), of length - * answer_len, in answer, with TTL ttl. Doesn't do - * any caching; that's handled elsewhere. */ -void -dnsserv_resolved(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const char *answer, - int ttl) -{ - struct evdns_server_request *req = conn->dns_server_request; - const char *name; - int err = DNS_ERR_NONE; - if (!req) - return; - name = evdns_get_orig_address(req, answer_type, - conn->socks_request->address); - - /* XXXX Re-do; this is dumb. */ - if (ttl < 60) - ttl = 60; - - /* The evdns interface is: add a bunch of reply items (corresponding to one - * or more of the questions in the request); then, call - * evdns_server_request_respond. */ - if (answer_type == RESOLVED_TYPE_IPV6) { - evdns_server_request_add_aaaa_reply(req, - name, - 1, answer, ttl); - } else if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4 && - conn->socks_request->command == SOCKS_COMMAND_RESOLVE) { - evdns_server_request_add_a_reply(req, - name, - 1, answer, ttl); - } else if (answer_type == RESOLVED_TYPE_HOSTNAME && - answer_len < 256 && - conn->socks_request->command == SOCKS_COMMAND_RESOLVE_PTR) { - char *ans = tor_strndup(answer, answer_len); - evdns_server_request_add_ptr_reply(req, NULL, - name, - ans, ttl); - tor_free(ans); - } else if (answer_type == RESOLVED_TYPE_ERROR) { - err = DNS_ERR_NOTEXIST; - } else { /* answer_type == RESOLVED_TYPE_ERROR_TRANSIENT */ - err = DNS_ERR_SERVERFAILED; - } - - evdns_server_request_respond(req, err); - - conn->dns_server_request = NULL; -} - -/** Set up the evdns server port for the UDP socket on conn, which - * must be an AP_DNS_LISTENER */ -void -dnsserv_configure_listener(connection_t *conn) -{ - listener_connection_t *listener_conn; - tor_assert(conn); - tor_assert(SOCKET_OK(conn->s)); - tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER); - - listener_conn = TO_LISTENER_CONN(conn); - listener_conn->dns_server_port = - tor_evdns_add_server_port(conn->s, 0, evdns_server_callback, - listener_conn); -} - -/** Free the evdns server port for conn, which must be an - * AP_DNS_LISTENER. */ -void -dnsserv_close_listener(connection_t *conn) -{ - listener_connection_t *listener_conn; - tor_assert(conn); - tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER); - - listener_conn = TO_LISTENER_CONN(conn); - - if (listener_conn->dns_server_port) { - evdns_close_server_port(listener_conn->dns_server_port); - listener_conn->dns_server_port = NULL; - } -} - diff --git a/src/tor/dnsserv.h b/src/tor/dnsserv.h deleted file mode 100644 index 687a77e59..000000000 --- a/src/tor/dnsserv.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file dnsserv.h - * \brief Header file for dnsserv.c. - **/ - -#ifndef TOR_DNSSERV_H -#define TOR_DNSSERV_H - -void dnsserv_configure_listener(connection_t *conn); -void dnsserv_close_listener(connection_t *conn); -void dnsserv_resolved(entry_connection_t *conn, - int answer_type, - size_t answer_len, - const char *answer, - int ttl); -void dnsserv_reject_request(entry_connection_t *conn); -int dnsserv_launch_request(const char *name, int is_reverse, - control_connection_t *control_conn); - -#endif - diff --git a/src/tor/entrynodes.c b/src/tor/entrynodes.c deleted file mode 100644 index 566896e6c..000000000 --- a/src/tor/entrynodes.c +++ /dev/null @@ -1,2334 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file entrynodes.c - * \brief Code to manage our fixed first nodes for various functions. - * - * Entry nodes can be guards (for general use) or bridges (for censorship - * circumvention). - **/ - -#include "or.h" -#include "circpathbias.h" -#include "circuitbuild.h" -#include "circuitstats.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_or.h" -#include "control.h" -#include "directory.h" -#include "entrynodes.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "routerset.h" -#include "transports.h" -#include "statefile.h" - -/** Information about a configured bridge. Currently this just matches the - * ones in the torrc file, but one day we may be able to learn about new - * bridges on our own, and remember them in the state file. */ -typedef struct { - /** Address of the bridge. */ - tor_addr_t addr; - /** TLS port for the bridge. */ - uint16_t port; - /** Boolean: We are re-parsing our bridge list, and we are going to remove - * this one if we don't find it in the list of configured bridges. */ - unsigned marked_for_removal : 1; - /** Expected identity digest, or all zero bytes if we don't know what the - * digest should be. */ - char identity[DIGEST_LEN]; - - /** Name of pluggable transport protocol taken from its config line. */ - char *transport_name; - - /** When should we next try to fetch a descriptor for this bridge? */ - download_status_t fetch_status; - - /** A smartlist of k=v values to be passed to the SOCKS proxy, if - transports are used for this bridge. */ - smartlist_t *socks_args; -} bridge_info_t; - -/** A list of our chosen entry guards. */ -static smartlist_t *entry_guards = NULL; -/** A value of 1 means that the entry_guards list has changed - * and those changes need to be flushed to disk. */ -static int entry_guards_dirty = 0; - -static void bridge_free(bridge_info_t *bridge); -static const node_t *choose_random_entry_impl(cpath_build_state_t *state, - int for_directory, - dirinfo_type_t dirtype); - -/** Return the list of entry guards, creating it if necessary. */ -const smartlist_t * -get_entry_guards(void) -{ - if (! entry_guards) - entry_guards = smartlist_new(); - return entry_guards; -} - -/** Check whether the entry guard e is usable, given the directory - * authorities' opinion about the router (stored in ri) and the user's - * configuration (in options). Set e->bad_since - * accordingly. Return true iff the entry guard's status changes. - * - * If it's not usable, set *reason to a static string explaining why. - */ -static int -entry_guard_set_status(entry_guard_t *e, const node_t *node, - time_t now, const or_options_t *options, - const char **reason) -{ - char buf[HEX_DIGEST_LEN+1]; - int changed = 0; - - *reason = NULL; - - /* Do we want to mark this guard as bad? */ - if (!node) - *reason = "unlisted"; - else if (!node->is_running) - *reason = "down"; - else if (options->UseBridges && (!node->ri || - node->ri->purpose != ROUTER_PURPOSE_BRIDGE)) - *reason = "not a bridge"; - else if (options->UseBridges && !node_is_a_configured_bridge(node)) - *reason = "not a configured bridge"; - else if (!options->UseBridges && !node->is_possible_guard && - !routerset_contains_node(options->EntryNodes,node)) - *reason = "not recommended as a guard"; - else if (routerset_contains_node(options->ExcludeNodes, node)) - *reason = "excluded"; - else if (e->path_bias_disabled) - *reason = "path-biased"; - - if (*reason && ! e->bad_since) { - /* Router is newly bad. */ - base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); - log_info(LD_CIRC, "Entry guard %s (%s) is %s: marking as unusable.", - e->nickname, buf, *reason); - - e->bad_since = now; - control_event_guard(e->nickname, e->identity, "BAD"); - changed = 1; - } else if (!*reason && e->bad_since) { - /* There's nothing wrong with the router any more. */ - base16_encode(buf, sizeof(buf), e->identity, DIGEST_LEN); - log_info(LD_CIRC, "Entry guard %s (%s) is no longer unusable: " - "marking as ok.", e->nickname, buf); - - e->bad_since = 0; - control_event_guard(e->nickname, e->identity, "GOOD"); - changed = 1; - } - - if (node) { - int is_dir = node_is_dir(node) && node->rs && - node->rs->version_supports_microdesc_cache; - if (options->UseBridges && node_is_a_configured_bridge(node)) - is_dir = 1; - if (e->is_dir_cache != is_dir) { - e->is_dir_cache = is_dir; - changed = 1; - } - } - - return changed; -} - -/** Return true iff enough time has passed since we last tried to connect - * to the unreachable guard e that we're willing to try again. */ -static int -entry_is_time_to_retry(entry_guard_t *e, time_t now) -{ - long diff; - if (e->last_attempted < e->unreachable_since) - return 1; - diff = now - e->unreachable_since; - if (diff < 6*60*60) - return now > (e->last_attempted + 60*60); - else if (diff < 3*24*60*60) - return now > (e->last_attempted + 4*60*60); - else if (diff < 7*24*60*60) - return now > (e->last_attempted + 18*60*60); - else - return now > (e->last_attempted + 36*60*60); -} - -/** Return the node corresponding to e, if e is - * working well enough that we are willing to use it as an entry - * right now. (Else return NULL.) In particular, it must be - * - Listed as either up or never yet contacted; - * - Present in the routerlist; - * - Listed as 'stable' or 'fast' by the current dirserver consensus, - * if demanded by need_uptime or need_capacity - * (unless it's a configured EntryNode); - * - Allowed by our current ReachableORAddresses config option; and - * - Currently thought to be reachable by us (unless assume_reachable - * is true). - * - * If the answer is no, set *msg to an explanation of why. - * - * If need_descriptor is true, only return the node if we currently have - * a descriptor (routerinfo or microdesc) for it. - */ -static INLINE const node_t * -entry_is_live(entry_guard_t *e, int need_uptime, int need_capacity, - int assume_reachable, int need_descriptor, const char **msg) -{ - const node_t *node; - const or_options_t *options = get_options(); - tor_assert(msg); - - if (e->path_bias_disabled) { - *msg = "path-biased"; - return NULL; - } - if (e->bad_since) { - *msg = "bad"; - return NULL; - } - /* no good if it's unreachable, unless assume_unreachable or can_retry. */ - if (!assume_reachable && !e->can_retry && - e->unreachable_since && !entry_is_time_to_retry(e, time(NULL))) { - *msg = "unreachable"; - return NULL; - } - node = node_get_by_id(e->identity); - if (!node) { - *msg = "no node info"; - return NULL; - } - if (need_descriptor && !node_has_descriptor(node)) { - *msg = "no descriptor"; - return NULL; - } - if (get_options()->UseBridges) { - if (node_get_purpose(node) != ROUTER_PURPOSE_BRIDGE) { - *msg = "not a bridge"; - return NULL; - } - if (!node_is_a_configured_bridge(node)) { - *msg = "not a configured bridge"; - return NULL; - } - } else { /* !get_options()->UseBridges */ - if (node_get_purpose(node) != ROUTER_PURPOSE_GENERAL) { - *msg = "not general-purpose"; - return NULL; - } - } - if (routerset_contains_node(options->EntryNodes, node)) { - /* they asked for it, they get it */ - need_uptime = need_capacity = 0; - } - if (node_is_unreliable(node, need_uptime, need_capacity, 0)) { - *msg = "not fast/stable"; - return NULL; - } - if (!fascist_firewall_allows_node(node)) { - *msg = "unreachable by config"; - return NULL; - } - return node; -} - -/** Return the number of entry guards that we think are usable. */ -int -num_live_entry_guards(int for_directory) -{ - int n = 0; - const char *msg; - if (! entry_guards) - return 0; - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { - if (for_directory && !entry->is_dir_cache) - continue; - if (entry_is_live(entry, 0, 1, 0, !for_directory, &msg)) - ++n; - } SMARTLIST_FOREACH_END(entry); - return n; -} - -/** If digest matches the identity of any node in the - * entry_guards list, return that node. Else return NULL. */ -entry_guard_t * -entry_guard_get_by_id_digest(const char *digest) -{ - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, - if (tor_memeq(digest, entry->identity, DIGEST_LEN)) - return entry; - ); - return NULL; -} - -/** Dump a description of our list of entry guards to the log at level - * severity. */ -static void -log_entry_guards(int severity) -{ - smartlist_t *elements = smartlist_new(); - char *s; - - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) - { - const char *msg = NULL; - if (entry_is_live(e, 0, 1, 0, 0, &msg)) - smartlist_add_asprintf(elements, "%s [%s] (up %s)", - e->nickname, - hex_str(e->identity, DIGEST_LEN), - e->made_contact ? "made-contact" : "never-contacted"); - else - smartlist_add_asprintf(elements, "%s [%s] (%s, %s)", - e->nickname, - hex_str(e->identity, DIGEST_LEN), - msg, - e->made_contact ? "made-contact" : "never-contacted"); - } - SMARTLIST_FOREACH_END(e); - - s = smartlist_join_strings(elements, ",", 0, NULL); - SMARTLIST_FOREACH(elements, char*, cp, tor_free(cp)); - smartlist_free(elements); - log_fn(severity,LD_CIRC,"%s",s); - tor_free(s); -} - -/** Called when one or more guards that we would previously have used for some - * purpose are no longer in use because a higher-priority guard has become - * usable again. */ -static void -control_event_guard_deferred(void) -{ - /* XXXX We don't actually have a good way to figure out _how many_ entries - * are live for some purpose. We need an entry_is_even_slightly_live() - * function for this to work right. NumEntryGuards isn't reliable: if we - * need guards with weird properties, we can have more than that number - * live. - **/ -#if 0 - int n = 0; - const char *msg; - const or_options_t *options = get_options(); - if (!entry_guards) - return; - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry, - { - if (entry_is_live(entry, 0, 1, 0, &msg)) { - if (n++ == options->NumEntryGuards) { - control_event_guard(entry->nickname, entry->identity, "DEFERRED"); - return; - } - } - }); -#endif -} - -/** Largest amount that we'll backdate chosen_on_date */ -#define CHOSEN_ON_DATE_SLOP (30*86400) - -/** Add a new (preferably stable and fast) router to our - * entry_guards list. Return a pointer to the router if we succeed, - * or NULL if we can't find any more suitable entries. - * - * If chosen is defined, use that one, and if it's not - * already in our entry_guards list, put it at the *beginning*. - * Else, put the one we pick at the end of the list. */ -static const node_t * -add_an_entry_guard(const node_t *chosen, int reset_status, int prepend, - int for_discovery, int for_directory) -{ - const node_t *node; - entry_guard_t *entry; - - if (chosen) { - node = chosen; - entry = entry_guard_get_by_id_digest(node->identity); - if (entry) { - if (reset_status) { - entry->bad_since = 0; - entry->can_retry = 1; - } - entry->is_dir_cache = node->rs && - node->rs->version_supports_microdesc_cache; - if (get_options()->UseBridges && node_is_a_configured_bridge(node)) - entry->is_dir_cache = 1; - return NULL; - } - } else if (!for_directory) { - node = choose_good_entry_server(CIRCUIT_PURPOSE_C_GENERAL, NULL); - if (!node) - return NULL; - } else { - const routerstatus_t *rs; - rs = router_pick_directory_server(MICRODESC_DIRINFO|V3_DIRINFO, - PDS_PREFER_TUNNELED_DIR_CONNS_|PDS_FOR_GUARD); - if (!rs) - return NULL; - node = node_get_by_id(rs->identity_digest); - if (!node) - return NULL; - } - if (node->using_as_guard) - return NULL; - if (entry_guard_get_by_id_digest(node->identity) != NULL) { - log_info(LD_CIRC, "I was about to add a duplicate entry guard."); - /* This can happen if we choose a guard, then the node goes away, then - * comes back. */ - ((node_t*) node)->using_as_guard = 1; - return NULL; - } - entry = tor_malloc_zero(sizeof(entry_guard_t)); - log_info(LD_CIRC, "Chose %s as new entry guard.", - node_describe(node)); - strlcpy(entry->nickname, node_get_nickname(node), sizeof(entry->nickname)); - memcpy(entry->identity, node->identity, DIGEST_LEN); - entry->is_dir_cache = node_is_dir(node) && node->rs && - node->rs->version_supports_microdesc_cache; - if (get_options()->UseBridges && node_is_a_configured_bridge(node)) - entry->is_dir_cache = 1; - - /* Choose expiry time smudged over the past month. The goal here - * is to a) spread out when Tor clients rotate their guards, so they - * don't all select them on the same day, and b) avoid leaving a - * precise timestamp in the state file about when we first picked - * this guard. For details, see the Jan 2010 or-dev thread. */ - entry->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); - entry->chosen_by_version = tor_strdup(VERSION); - - /* Are we picking this guard because all of our current guards are - * down so we need another one (for_discovery is 1), or because we - * decided we need more variety in our guard list (for_discovery is 0)? - * - * Currently we hack this behavior into place by setting "made_contact" - * for guards of the latter variety, so we'll be willing to use any of - * them right off the bat. - */ - if (!for_discovery) - entry->made_contact = 1; - - ((node_t*)node)->using_as_guard = 1; - if (prepend) - smartlist_insert(entry_guards, 0, entry); - else - smartlist_add(entry_guards, entry); - control_event_guard(entry->nickname, entry->identity, "NEW"); - control_event_guard_deferred(); - log_entry_guards(LOG_INFO); - return node; -} - -/** Choose how many entry guards or directory guards we'll use. If - * for_directory is true, we return how many directory guards to - * use; else we return how many entry guards to use. */ -static int -decide_num_guards(const or_options_t *options, int for_directory) -{ - if (for_directory && options->NumDirectoryGuards != 0) - return options->NumDirectoryGuards; - return options->NumEntryGuards; -} - -/** If the use of entry guards is configured, choose more entry guards - * until we have enough in the list. */ -static void -pick_entry_guards(const or_options_t *options, int for_directory) -{ - int changed = 0; - const int num_needed = decide_num_guards(options, for_directory); - - tor_assert(entry_guards); - - while (num_live_entry_guards(for_directory) < num_needed) { - if (!add_an_entry_guard(NULL, 0, 0, 0, for_directory)) - break; - changed = 1; - } - if (changed) - entry_guards_changed(); -} - -/** How long (in seconds) do we allow an entry guard to be nonfunctional, - * unlisted, excluded, or otherwise nonusable before we give up on it? */ -#define ENTRY_GUARD_REMOVE_AFTER (30*24*60*60) - -/** Release all storage held by e. */ -static void -entry_guard_free(entry_guard_t *e) -{ - if (!e) - return; - tor_free(e->chosen_by_version); - tor_free(e); -} - -/** - * Return the minimum lifetime of working entry guard, in seconds, - * as given in the consensus networkstatus. (Plus CHOSEN_ON_DATE_SLOP, - * so that we can do the chosen_on_date randomization while achieving the - * desired minimum lifetime.) - */ -static int32_t -guards_get_lifetime(void) -{ - const or_options_t *options = get_options(); -#define DFLT_GUARD_LIFETIME (86400 * 60) /* Two months. */ -#define MIN_GUARD_LIFETIME (86400 * 30) /* One months. */ -#define MAX_GUARD_LIFETIME (86400 * 1826) /* Five years. */ - - if (options->GuardLifetime >= 1) { - return CLAMP(MIN_GUARD_LIFETIME, - options->GuardLifetime, - MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; - } - - return networkstatus_get_param(NULL, "GuardLifetime", - DFLT_GUARD_LIFETIME, - MIN_GUARD_LIFETIME, - MAX_GUARD_LIFETIME) + CHOSEN_ON_DATE_SLOP; -} - -/** Remove any entry guard which was selected by an unknown version of Tor, - * or which was selected by a version of Tor that's known to select - * entry guards badly, or which was selected more 2 months ago. */ -/* XXXX The "obsolete guards" and "chosen long ago guards" things should - * probably be different functions. */ -static int -remove_obsolete_entry_guards(time_t now) -{ - int changed = 0, i; - int32_t guard_lifetime = guards_get_lifetime(); - - for (i = 0; i < smartlist_len(entry_guards); ++i) { - entry_guard_t *entry = smartlist_get(entry_guards, i); - const char *ver = entry->chosen_by_version; - const char *msg = NULL; - tor_version_t v; - int version_is_bad = 0, date_is_bad = 0; - if (!ver) { - msg = "does not say what version of Tor it was selected by"; - version_is_bad = 1; - } else if (tor_version_parse(ver, &v)) { - msg = "does not seem to be from any recognized version of Tor"; - version_is_bad = 1; - } else { - char *tor_ver = NULL; - tor_asprintf(&tor_ver, "Tor %s", ver); - if ((tor_version_as_new_as(tor_ver, "0.1.0.10-alpha") && - !tor_version_as_new_as(tor_ver, "0.1.2.16-dev")) || - (tor_version_as_new_as(tor_ver, "0.2.0.0-alpha") && - !tor_version_as_new_as(tor_ver, "0.2.0.6-alpha")) || - /* above are bug 440; below are bug 1217 */ - (tor_version_as_new_as(tor_ver, "0.2.1.3-alpha") && - !tor_version_as_new_as(tor_ver, "0.2.1.23")) || - (tor_version_as_new_as(tor_ver, "0.2.2.0-alpha") && - !tor_version_as_new_as(tor_ver, "0.2.2.7-alpha"))) { - msg = "was selected without regard for guard bandwidth"; - version_is_bad = 1; - } - tor_free(tor_ver); - } - if (!version_is_bad && entry->chosen_on_date + guard_lifetime < now) { - /* It's been too long since the date listed in our state file. */ - msg = "was selected several months ago"; - date_is_bad = 1; - } - - if (version_is_bad || date_is_bad) { /* we need to drop it */ - char dbuf[HEX_DIGEST_LEN+1]; - tor_assert(msg); - base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - log_fn(version_is_bad ? LOG_NOTICE : LOG_INFO, LD_CIRC, - "Entry guard '%s' (%s) %s. (Version=%s.) Replacing it.", - entry->nickname, dbuf, msg, ver?escaped(ver):"none"); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(entry_guards, i--); - log_entry_guards(LOG_INFO); - changed = 1; - } - } - - return changed ? 1 : 0; -} - -/** Remove all entry guards that have been down or unlisted for so - * long that we don't think they'll come up again. Return 1 if we - * removed any, or 0 if we did nothing. */ -static int -remove_dead_entry_guards(time_t now) -{ - char dbuf[HEX_DIGEST_LEN+1]; - char tbuf[ISO_TIME_LEN+1]; - int i; - int changed = 0; - - for (i = 0; i < smartlist_len(entry_guards); ) { - entry_guard_t *entry = smartlist_get(entry_guards, i); - if (entry->bad_since && - ! entry->path_bias_disabled && - entry->bad_since + ENTRY_GUARD_REMOVE_AFTER < now) { - - base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - format_local_iso_time(tbuf, entry->bad_since); - log_info(LD_CIRC, "Entry guard '%s' (%s) has been down or unlisted " - "since %s local time; removing.", - entry->nickname, dbuf, tbuf); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(entry_guards, i); - log_entry_guards(LOG_INFO); - changed = 1; - } else - ++i; - } - return changed ? 1 : 0; -} - -/** Remove all currently listed entry guards. So new ones will be chosen. */ -void -remove_all_entry_guards(void) -{ - char dbuf[HEX_DIGEST_LEN+1]; - - while (smartlist_len(entry_guards)) { - entry_guard_t *entry = smartlist_get(entry_guards, 0); - base16_encode(dbuf, sizeof(dbuf), entry->identity, DIGEST_LEN); - log_info(LD_CIRC, "Entry guard '%s' (%s) has been dropped.", - entry->nickname, dbuf); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del(entry_guards, 0); - } - log_entry_guards(LOG_INFO); - entry_guards_changed(); -} - -/** A new directory or router-status has arrived; update the down/listed - * status of the entry guards. - * - * An entry is 'down' if the directory lists it as nonrunning. - * An entry is 'unlisted' if the directory doesn't include it. - * - * Don't call this on startup; only on a fresh download. Otherwise we'll - * think that things are unlisted. - */ -void -entry_guards_compute_status(const or_options_t *options, time_t now) -{ - int changed = 0; - digestmap_t *reasons; - - if (! entry_guards) - return; - - if (options->EntryNodes) /* reshuffle the entry guard list if needed */ - entry_nodes_should_be_added(); - - reasons = digestmap_new(); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) - { - const node_t *r = node_get_by_id(entry->identity); - const char *reason = NULL; - if (entry_guard_set_status(entry, r, now, options, &reason)) - changed = 1; - - if (entry->bad_since) - tor_assert(reason); - if (reason) - digestmap_set(reasons, entry->identity, (char*)reason); - } - SMARTLIST_FOREACH_END(entry); - - if (remove_dead_entry_guards(now)) - changed = 1; - if (remove_obsolete_entry_guards(now)) - changed = 1; - - if (changed) { - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { - const char *reason = digestmap_get(reasons, entry->identity); - const char *live_msg = ""; - const node_t *r = entry_is_live(entry, 0, 1, 0, 0, &live_msg); - log_info(LD_CIRC, "Summary: Entry %s [%s] is %s, %s%s%s, and %s%s.", - entry->nickname, - hex_str(entry->identity, DIGEST_LEN), - entry->unreachable_since ? "unreachable" : "reachable", - entry->bad_since ? "unusable" : "usable", - reason ? ", ": "", - reason ? reason : "", - r ? "live" : "not live / ", - r ? "" : live_msg); - } SMARTLIST_FOREACH_END(entry); - log_info(LD_CIRC, " (%d/%d entry guards are usable/new)", - num_live_entry_guards(0), smartlist_len(entry_guards)); - log_entry_guards(LOG_INFO); - entry_guards_changed(); - } - - digestmap_free(reasons, NULL); -} - -/** Called when a connection to an OR with the identity digest digest - * is established (succeeded==1) or has failed (succeeded==0). - * If the OR is an entry, change that entry's up/down status. - * Return 0 normally, or -1 if we want to tear down the new connection. - * - * If mark_relay_status, also call router_set_status() on this - * relay. - * - * XXX024 change succeeded and mark_relay_status into 'int flags'. - */ -int -entry_guard_register_connect_status(const char *digest, int succeeded, - int mark_relay_status, time_t now) -{ - int changed = 0; - int refuse_conn = 0; - int first_contact = 0; - entry_guard_t *entry = NULL; - int idx = -1; - char buf[HEX_DIGEST_LEN+1]; - - if (! entry_guards) - return 0; - - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - tor_assert(e); - if (tor_memeq(e->identity, digest, DIGEST_LEN)) { - entry = e; - idx = e_sl_idx; - break; - } - } SMARTLIST_FOREACH_END(e); - - if (!entry) - return 0; - - base16_encode(buf, sizeof(buf), entry->identity, DIGEST_LEN); - - if (succeeded) { - if (entry->unreachable_since) { - log_info(LD_CIRC, "Entry guard '%s' (%s) is now reachable again. Good.", - entry->nickname, buf); - entry->can_retry = 0; - entry->unreachable_since = 0; - entry->last_attempted = now; - control_event_guard(entry->nickname, entry->identity, "UP"); - changed = 1; - } - if (!entry->made_contact) { - entry->made_contact = 1; - first_contact = changed = 1; - } - } else { /* ! succeeded */ - if (!entry->made_contact) { - /* We've never connected to this one. */ - log_info(LD_CIRC, - "Connection to never-contacted entry guard '%s' (%s) failed. " - "Removing from the list. %d/%d entry guards usable/new.", - entry->nickname, buf, - num_live_entry_guards(0)-1, smartlist_len(entry_guards)-1); - control_event_guard(entry->nickname, entry->identity, "DROPPED"); - entry_guard_free(entry); - smartlist_del_keeporder(entry_guards, idx); - log_entry_guards(LOG_INFO); - changed = 1; - } else if (!entry->unreachable_since) { - log_info(LD_CIRC, "Unable to connect to entry guard '%s' (%s). " - "Marking as unreachable.", entry->nickname, buf); - entry->unreachable_since = entry->last_attempted = now; - control_event_guard(entry->nickname, entry->identity, "DOWN"); - changed = 1; - entry->can_retry = 0; /* We gave it an early chance; no good. */ - } else { - char tbuf[ISO_TIME_LEN+1]; - format_iso_time(tbuf, entry->unreachable_since); - log_debug(LD_CIRC, "Failed to connect to unreachable entry guard " - "'%s' (%s). It has been unreachable since %s.", - entry->nickname, buf, tbuf); - entry->last_attempted = now; - entry->can_retry = 0; /* We gave it an early chance; no good. */ - } - } - - /* if the caller asked us to, also update the is_running flags for this - * relay */ - if (mark_relay_status) - router_set_status(digest, succeeded); - - if (first_contact) { - /* We've just added a new long-term entry guard. Perhaps the network just - * came back? We should give our earlier entries another try too, - * and close this connection so we don't use it before we've given - * the others a shot. */ - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - if (e == entry) - break; - if (e->made_contact) { - const char *msg; - const node_t *r = entry_is_live(e, 0, 1, 1, 0, &msg); - if (r && e->unreachable_since) { - refuse_conn = 1; - e->can_retry = 1; - } - } - } SMARTLIST_FOREACH_END(e); - if (refuse_conn) { - log_info(LD_CIRC, - "Connected to new entry guard '%s' (%s). Marking earlier " - "entry guards up. %d/%d entry guards usable/new.", - entry->nickname, buf, - num_live_entry_guards(0), smartlist_len(entry_guards)); - log_entry_guards(LOG_INFO); - changed = 1; - } - } - - if (changed) - entry_guards_changed(); - return refuse_conn ? -1 : 0; -} - -/** When we try to choose an entry guard, should we parse and add - * config's EntryNodes first? */ -static int should_add_entry_nodes = 0; - -/** Called when the value of EntryNodes changes in our configuration. */ -void -entry_nodes_should_be_added(void) -{ - log_info(LD_CIRC, "EntryNodes config option set. Putting configured " - "relays at the front of the entry guard list."); - should_add_entry_nodes = 1; -} - -/** Update the using_as_guard fields of all the nodes. We do this after we - * remove entry guards from the list: This is the only function that clears - * the using_as_guard field. */ -static void -update_node_guard_status(void) -{ - smartlist_t *nodes = nodelist_get_list(); - SMARTLIST_FOREACH(nodes, node_t *, node, node->using_as_guard = 0); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { - node_t *node = node_get_mutable_by_id(entry->identity); - if (node) - node->using_as_guard = 1; - } SMARTLIST_FOREACH_END(entry); -} - -/** Adjust the entry guards list so that it only contains entries from - * EntryNodes, adding new entries from EntryNodes to the list as needed. */ -static void -entry_guards_set_from_config(const or_options_t *options) -{ - smartlist_t *entry_nodes, *worse_entry_nodes, *entry_fps; - smartlist_t *old_entry_guards_on_list, *old_entry_guards_not_on_list; - tor_assert(entry_guards); - - should_add_entry_nodes = 0; - - if (!options->EntryNodes) { - /* It's possible that a controller set EntryNodes, thus making - * should_add_entry_nodes set, then cleared it again, all before the - * call to choose_random_entry() that triggered us. If so, just return. - */ - return; - } - - { - char *string = routerset_to_string(options->EntryNodes); - log_info(LD_CIRC,"Adding configured EntryNodes '%s'.", string); - tor_free(string); - } - - entry_nodes = smartlist_new(); - worse_entry_nodes = smartlist_new(); - entry_fps = smartlist_new(); - old_entry_guards_on_list = smartlist_new(); - old_entry_guards_not_on_list = smartlist_new(); - - /* Split entry guards into those on the list and those not. */ - - routerset_get_all_nodes(entry_nodes, options->EntryNodes, - options->ExcludeNodes, 0); - SMARTLIST_FOREACH(entry_nodes, const node_t *,node, - smartlist_add(entry_fps, (void*)node->identity)); - - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, { - if (smartlist_contains_digest(entry_fps, e->identity)) - smartlist_add(old_entry_guards_on_list, e); - else - smartlist_add(old_entry_guards_not_on_list, e); - }); - - /* Remove all currently configured guard nodes, excluded nodes, unreachable - * nodes, or non-Guard nodes from entry_nodes. */ - SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { - if (entry_guard_get_by_id_digest(node->identity)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (routerset_contains_node(options->ExcludeNodes, node)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (!fascist_firewall_allows_node(node)) { - SMARTLIST_DEL_CURRENT(entry_nodes, node); - continue; - } else if (! node->is_possible_guard) { - smartlist_add(worse_entry_nodes, (node_t*)node); - SMARTLIST_DEL_CURRENT(entry_nodes, node); - } - } SMARTLIST_FOREACH_END(node); - - /* Now build the new entry_guards list. */ - smartlist_clear(entry_guards); - /* First, the previously configured guards that are in EntryNodes. */ - smartlist_add_all(entry_guards, old_entry_guards_on_list); - /* Next, scramble the rest of EntryNodes, putting the guards first. */ - smartlist_shuffle(entry_nodes); - smartlist_shuffle(worse_entry_nodes); - smartlist_add_all(entry_nodes, worse_entry_nodes); - - /* Next, the rest of EntryNodes */ - SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { - add_an_entry_guard(node, 0, 0, 1, 0); - if (smartlist_len(entry_guards) > options->NumEntryGuards * 10) - break; - } SMARTLIST_FOREACH_END(node); - log_notice(LD_GENERAL, "%d entries in guards", smartlist_len(entry_guards)); - /* Finally, free the remaining previously configured guards that are not in - * EntryNodes. */ - SMARTLIST_FOREACH(old_entry_guards_not_on_list, entry_guard_t *, e, - entry_guard_free(e)); - - update_node_guard_status(); - - smartlist_free(entry_nodes); - smartlist_free(worse_entry_nodes); - smartlist_free(entry_fps); - smartlist_free(old_entry_guards_on_list); - smartlist_free(old_entry_guards_not_on_list); - entry_guards_changed(); -} - -/** Return 0 if we're fine adding arbitrary routers out of the - * directory to our entry guard list, or return 1 if we have a - * list already and we must stick to it. - */ -int -entry_list_is_constrained(const or_options_t *options) -{ - if (options->EntryNodes) - return 1; - if (options->UseBridges) - return 1; - return 0; -} - -/** Return true iff this node can answer directory questions about - * microdescriptors. */ -static int -node_understands_microdescriptors(const node_t *node) -{ - tor_assert(node); - if (node->rs && node->rs->version_supports_microdesc_cache) - return 1; - if (node->ri && tor_version_supports_microdescriptors(node->ri->platform)) - return 1; - return 0; -} - -/** Return true iff node is able to answer directory questions - * of type dirinfo. */ -static int -node_can_handle_dirinfo(const node_t *node, dirinfo_type_t dirinfo) -{ - /* Checking dirinfo for any type other than microdescriptors isn't required - yet, since we only choose directory guards that can support microdescs, - routerinfos, and networkstatuses, AND we don't use directory guards if - we're configured to do direct downloads of anything else. The only case - where we might have a guard that doesn't know about a type of directory - information is when we're retrieving directory information from a - bridge. */ - - if ((dirinfo & MICRODESC_DIRINFO) && - !node_understands_microdescriptors(node)) - return 0; - return 1; -} - -/** Pick a live (up and listed) entry guard from entry_guards. If - * state is non-NULL, this is for a specific circuit -- - * make sure not to pick this circuit's exit or any node in the - * exit's family. If state is NULL, we're looking for a random - * guard (likely a bridge). If dirinfo is not NO_DIRINFO, then - * only select from nodes that know how to answer directory questions - * of that type. */ -const node_t * -choose_random_entry(cpath_build_state_t *state) -{ - return choose_random_entry_impl(state, 0, 0); -} - -/** Pick a live (up and listed) directory guard from entry_guards for - * downloading information of type type. */ -const node_t * -choose_random_dirguard(dirinfo_type_t type) -{ - return choose_random_entry_impl(NULL, 1, type); -} - -/** Helper for choose_random{entry,dirguard}. */ -static const node_t * -choose_random_entry_impl(cpath_build_state_t *state, int for_directory, - dirinfo_type_t dirinfo_type) -{ - const or_options_t *options = get_options(); - smartlist_t *live_entry_guards = smartlist_new(); - smartlist_t *exit_family = smartlist_new(); - const node_t *chosen_exit = - state?build_state_get_exit_node(state) : NULL; - const node_t *node = NULL; - int need_uptime = state ? state->need_uptime : 0; - int need_capacity = state ? state->need_capacity : 0; - int preferred_min, consider_exit_family = 0; - int need_descriptor = !for_directory; - const int num_needed = decide_num_guards(options, for_directory); - - if (chosen_exit) { - nodelist_add_node_and_family(exit_family, chosen_exit); - consider_exit_family = 1; - } - - if (!entry_guards) - entry_guards = smartlist_new(); - - if (should_add_entry_nodes) - entry_guards_set_from_config(options); - - if (!entry_list_is_constrained(options) && - smartlist_len(entry_guards) < num_needed) - pick_entry_guards(options, for_directory); - - retry: - smartlist_clear(live_entry_guards); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, entry) { - const char *msg; - node = entry_is_live(entry, need_uptime, need_capacity, 0, - need_descriptor, &msg); - if (!node) - continue; /* down, no point */ - if (for_directory) { - if (!entry->is_dir_cache) - continue; /* We need a directory and didn't get one. */ - } - if (node == chosen_exit) - continue; /* don't pick the same node for entry and exit */ - if (consider_exit_family && smartlist_contains(exit_family, node)) - continue; /* avoid relays that are family members of our exit */ - if (dirinfo_type != NO_DIRINFO && - !node_can_handle_dirinfo(node, dirinfo_type)) - continue; /* this node won't be able to answer our dir questions */ -#if 0 /* since EntryNodes is always strict now, this clause is moot */ - if (options->EntryNodes && - !routerset_contains_node(options->EntryNodes, node)) { - /* We've come to the end of our preferred entry nodes. */ - if (smartlist_len(live_entry_guards)) - goto choose_and_finish; /* only choose from the ones we like */ - if (options->StrictNodes) { - /* in theory this case should never happen, since - * entry_guards_set_from_config() drops unwanted relays */ - tor_fragile_assert(); - } else { - log_info(LD_CIRC, - "No relays from EntryNodes available. Using others."); - } - } -#endif - smartlist_add(live_entry_guards, (void*)node); - if (!entry->made_contact) { - /* Always start with the first not-yet-contacted entry - * guard. Otherwise we might add several new ones, pick - * the second new one, and now we've expanded our entry - * guard list without needing to. */ - goto choose_and_finish; - } - if (smartlist_len(live_entry_guards) >= num_needed) - goto choose_and_finish; /* we have enough */ - } SMARTLIST_FOREACH_END(entry); - - if (entry_list_is_constrained(options)) { - /* If we prefer the entry nodes we've got, and we have at least - * one choice, that's great. Use it. */ - preferred_min = 1; - } else { - /* Try to have at least 2 choices available. This way we don't - * get stuck with a single live-but-crummy entry and just keep - * using him. - * (We might get 2 live-but-crummy entry guards, but so be it.) */ - preferred_min = 2; - } - - if (smartlist_len(live_entry_guards) < preferred_min) { - if (!entry_list_is_constrained(options)) { - /* still no? try adding a new entry then */ - /* XXX if guard doesn't imply fast and stable, then we need - * to tell add_an_entry_guard below what we want, or it might - * be a long time til we get it. -RD */ - node = add_an_entry_guard(NULL, 0, 0, 1, for_directory); - if (node) { - entry_guards_changed(); - /* XXX we start over here in case the new node we added shares - * a family with our exit node. There's a chance that we'll just - * load up on entry guards here, if the network we're using is - * one big family. Perhaps we should teach add_an_entry_guard() - * to understand nodes-to-avoid-if-possible? -RD */ - goto retry; - } - } - if (!node && need_uptime) { - need_uptime = 0; /* try without that requirement */ - goto retry; - } - if (!node && need_capacity) { - /* still no? last attempt, try without requiring capacity */ - need_capacity = 0; - goto retry; - } -#if 0 - /* Removing this retry logic: if we only allow one exit, and it is in the - same family as all our entries, then we are just plain not going to win - here. */ - if (!node && entry_list_is_constrained(options) && consider_exit_family) { - /* still no? if we're using bridges or have strictentrynodes - * set, and our chosen exit is in the same family as all our - * bridges/entry guards, then be flexible about families. */ - consider_exit_family = 0; - goto retry; - } -#endif - /* live_entry_guards may be empty below. Oh well, we tried. */ - } - - choose_and_finish: - if (entry_list_is_constrained(options)) { - /* We need to weight by bandwidth, because our bridges or entryguards - * were not already selected proportional to their bandwidth. */ - node = node_sl_choose_by_bandwidth(live_entry_guards, WEIGHT_FOR_GUARD); - } else { - /* We choose uniformly at random here, because choose_good_entry_server() - * already weights its choices by bandwidth, so we don't want to - * *double*-weight our guard selection. */ - node = smartlist_choose(live_entry_guards); - } - smartlist_free(live_entry_guards); - smartlist_free(exit_family); - return node; -} - -/** Parse state and learn about the entry guards it describes. - * If set is true, and there are no errors, replace the global - * entry_list with what we find. - * On success, return 0. On failure, alloc into *msg a string - * describing the error, and return -1. - */ -int -entry_guards_parse_state(or_state_t *state, int set, char **msg) -{ - entry_guard_t *node = NULL; - smartlist_t *new_entry_guards = smartlist_new(); - config_line_t *line; - time_t now = time(NULL); - const char *state_version = state->TorVersion; - digestmap_t *added_by = digestmap_new(); - - *msg = NULL; - for (line = state->EntryGuards; line; line = line->next) { - if (!strcasecmp(line->key, "EntryGuard")) { - smartlist_t *args = smartlist_new(); - node = tor_malloc_zero(sizeof(entry_guard_t)); - /* all entry guards on disk have been contacted */ - node->made_contact = 1; - smartlist_add(new_entry_guards, node); - smartlist_split_string(args, line->value, " ", - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - if (smartlist_len(args)<2) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Too few arguments to EntryGuard"); - } else if (!is_legal_nickname(smartlist_get(args,0))) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad nickname for EntryGuard"); - } else { - strlcpy(node->nickname, smartlist_get(args,0), MAX_NICKNAME_LEN+1); - if (base16_decode(node->identity, DIGEST_LEN, smartlist_get(args,1), - strlen(smartlist_get(args,1)))<0) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad hex digest for EntryGuard"); - } - } - if (smartlist_len(args) >= 3) { - const char *is_cache = smartlist_get(args, 2); - if (!strcasecmp(is_cache, "DirCache")) { - node->is_dir_cache = 1; - } else if (!strcasecmp(is_cache, "NoDirCache")) { - node->is_dir_cache = 0; - } else { - log_warn(LD_CONFIG, "Bogus third argument to EntryGuard line: %s", - escaped(is_cache)); - } - } - SMARTLIST_FOREACH(args, char*, cp, tor_free(cp)); - smartlist_free(args); - if (*msg) - break; - } else if (!strcasecmp(line->key, "EntryGuardDownSince") || - !strcasecmp(line->key, "EntryGuardUnlistedSince")) { - time_t when; - time_t last_try = 0; - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardDownSince/UnlistedSince without EntryGuard"); - break; - } - if (parse_iso_time(line->value, &when)<0) { - *msg = tor_strdup("Unable to parse entry nodes: " - "Bad time in EntryGuardDownSince/UnlistedSince"); - break; - } - if (when > now) { - /* It's a bad idea to believe info in the future: you can wind - * up with timeouts that aren't allowed to happen for years. */ - continue; - } - if (strlen(line->value) >= ISO_TIME_LEN+ISO_TIME_LEN+1) { - /* ignore failure */ - (void) parse_iso_time(line->value+ISO_TIME_LEN+1, &last_try); - } - if (!strcasecmp(line->key, "EntryGuardDownSince")) { - node->unreachable_since = when; - node->last_attempted = last_try; - } else { - node->bad_since = when; - } - } else if (!strcasecmp(line->key, "EntryGuardAddedBy")) { - char d[DIGEST_LEN]; - /* format is digest version date */ - if (strlen(line->value) < HEX_DIGEST_LEN+1+1+1+ISO_TIME_LEN) { - log_warn(LD_BUG, "EntryGuardAddedBy line is not long enough."); - continue; - } - if (base16_decode(d, sizeof(d), line->value, HEX_DIGEST_LEN)<0 || - line->value[HEX_DIGEST_LEN] != ' ') { - log_warn(LD_BUG, "EntryGuardAddedBy line %s does not begin with " - "hex digest", escaped(line->value)); - continue; - } - digestmap_set(added_by, d, tor_strdup(line->value+HEX_DIGEST_LEN+1)); - } else if (!strcasecmp(line->key, "EntryGuardPathUseBias")) { - const or_options_t *options = get_options(); - double use_cnt, success_cnt; - - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardPathUseBias without EntryGuard"); - break; - } - - if (tor_sscanf(line->value, "%lf %lf", - &use_cnt, &success_cnt) != 2) { - log_info(LD_GENERAL, "Malformed path use bias line for node %s", - node->nickname); - continue; - } - - if (use_cnt < success_cnt) { - int severity = LOG_INFO; - /* If this state file was written by a Tor that would have - * already fixed it, then the overcounting bug is still there.. */ - if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { - severity = LOG_NOTICE; - } - log_fn(severity, LD_BUG, - "State file contains unexpectedly high usage success " - "counts %lf/%lf for Guard %s ($%s)", - success_cnt, use_cnt, - node->nickname, hex_str(node->identity, DIGEST_LEN)); - success_cnt = use_cnt; - } - - node->use_attempts = use_cnt; - node->use_successes = success_cnt; - - log_info(LD_GENERAL, "Read %f/%f path use bias for node %s", - node->use_successes, node->use_attempts, node->nickname); - - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (pathbias_get_use_success_count(node)/node->use_attempts - < pathbias_get_extreme_use_rate(options) && - pathbias_get_dropguards(options)) { - node->path_bias_disabled = 1; - log_info(LD_GENERAL, - "Path use bias is too high (%f/%f); disabling node %s", - node->circ_successes, node->circ_attempts, node->nickname); - } - } else if (!strcasecmp(line->key, "EntryGuardPathBias")) { - const or_options_t *options = get_options(); - double hop_cnt, success_cnt, timeouts, collapsed, successful_closed, - unusable; - - if (!node) { - *msg = tor_strdup("Unable to parse entry nodes: " - "EntryGuardPathBias without EntryGuard"); - break; - } - - /* First try 3 params, then 2. */ - /* In the long run: circuit_success ~= successful_circuit_close + - * collapsed_circuits + - * unusable_circuits */ - if (tor_sscanf(line->value, "%lf %lf %lf %lf %lf %lf", - &hop_cnt, &success_cnt, &successful_closed, - &collapsed, &unusable, &timeouts) != 6) { - int old_success, old_hops; - if (tor_sscanf(line->value, "%u %u", &old_success, &old_hops) != 2) { - continue; - } - log_info(LD_GENERAL, "Reading old-style EntryGuardPathBias %s", - escaped(line->value)); - - success_cnt = old_success; - successful_closed = old_success; - hop_cnt = old_hops; - timeouts = 0; - collapsed = 0; - unusable = 0; - } - - if (hop_cnt < success_cnt) { - int severity = LOG_INFO; - /* If this state file was written by a Tor that would have - * already fixed it, then the overcounting bug is still there.. */ - if (tor_version_as_new_as(state_version, "0.2.4.13-alpha")) { - severity = LOG_NOTICE; - } - log_fn(severity, LD_BUG, - "State file contains unexpectedly high success counts " - "%lf/%lf for Guard %s ($%s)", - success_cnt, hop_cnt, - node->nickname, hex_str(node->identity, DIGEST_LEN)); - success_cnt = hop_cnt; - } - - node->circ_attempts = hop_cnt; - node->circ_successes = success_cnt; - - node->successful_circuits_closed = successful_closed; - node->timeouts = timeouts; - node->collapsed_circuits = collapsed; - node->unusable_circuits = unusable; - - log_info(LD_GENERAL, "Read %f/%f path bias for node %s", - node->circ_successes, node->circ_attempts, node->nickname); - /* Note: We rely on the < comparison here to allow us to set a 0 - * rate and disable the feature entirely. If refactoring, don't - * change to <= */ - if (pathbias_get_close_success_count(node)/node->circ_attempts - < pathbias_get_extreme_rate(options) && - pathbias_get_dropguards(options)) { - node->path_bias_disabled = 1; - log_info(LD_GENERAL, - "Path bias is too high (%f/%f); disabling node %s", - node->circ_successes, node->circ_attempts, node->nickname); - } - - } else { - log_warn(LD_BUG, "Unexpected key %s", line->key); - } - } - - SMARTLIST_FOREACH_BEGIN(new_entry_guards, entry_guard_t *, e) { - char *sp; - char *val = digestmap_get(added_by, e->identity); - if (val && (sp = strchr(val, ' '))) { - time_t when; - *sp++ = '\0'; - if (parse_iso_time(sp, &when)<0) { - log_warn(LD_BUG, "Can't read time %s in EntryGuardAddedBy", sp); - } else { - e->chosen_by_version = tor_strdup(val); - e->chosen_on_date = when; - } - } else { - if (state_version) { - e->chosen_by_version = tor_strdup(state_version); - e->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); - } - } - if (e->path_bias_disabled && !e->bad_since) - e->bad_since = time(NULL); - } - SMARTLIST_FOREACH_END(e); - - if (*msg || !set) { - SMARTLIST_FOREACH(new_entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(new_entry_guards); - } else { /* !err && set */ - if (entry_guards) { - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(entry_guards); - } - entry_guards = new_entry_guards; - entry_guards_dirty = 0; - /* XXX024 hand new_entry_guards to this func, and move it up a - * few lines, so we don't have to re-dirty it */ - if (remove_obsolete_entry_guards(now)) - entry_guards_dirty = 1; - - update_node_guard_status(); - } - digestmap_free(added_by, tor_free_); - return *msg ? -1 : 0; -} - -/** Our list of entry guards has changed, or some element of one - * of our entry guards has changed. Write the changes to disk within - * the next few minutes. - */ -void -entry_guards_changed(void) -{ - time_t when; - entry_guards_dirty = 1; - - /* or_state_save() will call entry_guards_update_state(). */ - when = get_options()->AvoidDiskWrites ? time(NULL) + 3600 : time(NULL)+600; - or_state_mark_dirty(get_or_state(), when); -} - -/** If the entry guard info has not changed, do nothing and return. - * Otherwise, free the EntryGuards piece of state and create - * a new one out of the global entry_guards list, and then mark - * state dirty so it will get saved to disk. - */ -void -entry_guards_update_state(or_state_t *state) -{ - config_line_t **next, *line; - if (! entry_guards_dirty) - return; - - config_free_lines(state->EntryGuards); - next = &state->EntryGuards; - *next = NULL; - if (!entry_guards) - entry_guards = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - char dbuf[HEX_DIGEST_LEN+1]; - if (!e->made_contact) - continue; /* don't write this one to disk */ - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuard"); - base16_encode(dbuf, sizeof(dbuf), e->identity, DIGEST_LEN); - tor_asprintf(&line->value, "%s %s %sDirCache", e->nickname, dbuf, - e->is_dir_cache ? "" : "No"); - next = &(line->next); - if (e->unreachable_since) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardDownSince"); - line->value = tor_malloc(ISO_TIME_LEN+1+ISO_TIME_LEN+1); - format_iso_time(line->value, e->unreachable_since); - if (e->last_attempted) { - line->value[ISO_TIME_LEN] = ' '; - format_iso_time(line->value+ISO_TIME_LEN+1, e->last_attempted); - } - next = &(line->next); - } - if (e->bad_since) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardUnlistedSince"); - line->value = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(line->value, e->bad_since); - next = &(line->next); - } - if (e->chosen_on_date && e->chosen_by_version && - !strchr(e->chosen_by_version, ' ')) { - char d[HEX_DIGEST_LEN+1]; - char t[ISO_TIME_LEN+1]; - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardAddedBy"); - base16_encode(d, sizeof(d), e->identity, DIGEST_LEN); - format_iso_time(t, e->chosen_on_date); - tor_asprintf(&line->value, "%s %s %s", - d, e->chosen_by_version, t); - next = &(line->next); - } - if (e->circ_attempts > 0) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardPathBias"); - /* In the long run: circuit_success ~= successful_circuit_close + - * collapsed_circuits + - * unusable_circuits */ - tor_asprintf(&line->value, "%f %f %f %f %f %f", - e->circ_attempts, e->circ_successes, - pathbias_get_close_success_count(e), - e->collapsed_circuits, - e->unusable_circuits, e->timeouts); - next = &(line->next); - } - if (e->use_attempts > 0) { - *next = line = tor_malloc_zero(sizeof(config_line_t)); - line->key = tor_strdup("EntryGuardPathUseBias"); - - tor_asprintf(&line->value, "%f %f", - e->use_attempts, - pathbias_get_use_success_count(e)); - next = &(line->next); - } - - } SMARTLIST_FOREACH_END(e); - if (!get_options()->AvoidDiskWrites) - or_state_mark_dirty(get_or_state(), 0); - entry_guards_dirty = 0; -} - -/** If question is the string "entry-guards", then dump - * to *answer a newly allocated string describing all of - * the nodes in the global entry_guards list. See control-spec.txt - * for details. - * For backward compatibility, we also handle the string "helper-nodes". - * */ -int -getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) conn; - (void) errmsg; - - if (!strcmp(question,"entry-guards") || - !strcmp(question,"helper-nodes")) { - smartlist_t *sl = smartlist_new(); - char tbuf[ISO_TIME_LEN+1]; - char nbuf[MAX_VERBOSE_NICKNAME_LEN+1]; - if (!entry_guards) - entry_guards = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - const char *status = NULL; - time_t when = 0; - const node_t *node; - - if (!e->made_contact) { - status = "never-connected"; - } else if (e->bad_since) { - when = e->bad_since; - status = "unusable"; - } else { - status = "up"; - } - - node = node_get_by_id(e->identity); - if (node) { - node_get_verbose_nickname(node, nbuf); - } else { - nbuf[0] = '$'; - base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN); - /* e->nickname field is not very reliable if we don't know about - * this router any longer; don't include it. */ - } - - if (when) { - format_iso_time(tbuf, when); - smartlist_add_asprintf(sl, "%s %s %s\n", nbuf, status, tbuf); - } else { - smartlist_add_asprintf(sl, "%s %s\n", nbuf, status); - } - } SMARTLIST_FOREACH_END(e); - *answer = smartlist_join_strings(sl, "", 0, NULL); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } - return 0; -} - -/** A list of configured bridges. Whenever we actually get a descriptor - * for one, we add it as an entry guard. Note that the order of bridges - * in this list does not necessarily correspond to the order of bridges - * in the torrc. */ -static smartlist_t *bridge_list = NULL; - -/** Mark every entry of the bridge list to be removed on our next call to - * sweep_bridge_list unless it has first been un-marked. */ -void -mark_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, - b->marked_for_removal = 1); -} - -/** Remove every entry of the bridge list that was marked with - * mark_bridge_list if it has not subsequently been un-marked. */ -void -sweep_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) { - if (b->marked_for_removal) { - SMARTLIST_DEL_CURRENT(bridge_list, b); - bridge_free(b); - } - } SMARTLIST_FOREACH_END(b); -} - -/** Initialize the bridge list to empty, creating it if needed. */ -static void -clear_bridge_list(void) -{ - if (!bridge_list) - bridge_list = smartlist_new(); - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, bridge_free(b)); - smartlist_clear(bridge_list); -} - -/** Free the bridge bridge. */ -static void -bridge_free(bridge_info_t *bridge) -{ - if (!bridge) - return; - - tor_free(bridge->transport_name); - if (bridge->socks_args) { - SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s)); - smartlist_free(bridge->socks_args); - } - - tor_free(bridge); -} - -/** If we have a bridge configured whose digest matches digest, or a - * bridge with no known digest whose address matches any of the - * tor_addr_port_t's in orports, return that bridge. Else return - * NULL. */ -static bridge_info_t * -get_configured_bridge_by_orports_digest(const char *digest, - const smartlist_t *orports) -{ - if (!bridge_list) - return NULL; - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - if (tor_digest_is_zero(bridge->identity)) { - SMARTLIST_FOREACH_BEGIN(orports, tor_addr_port_t *, ap) - { - if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 && - bridge->port == ap->port) - return bridge; - } - SMARTLIST_FOREACH_END(ap); - } - if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - } - SMARTLIST_FOREACH_END(bridge); - return NULL; -} - -/** If we have a bridge configured whose digest matches digest, or a - * bridge with no known digest whose address matches addr:/port, - * return that bridge. Else return NULL. If digest is NULL, check for - * address/port matches only. */ -static bridge_info_t * -get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, - uint16_t port, - const char *digest) -{ - if (!bridge_list) - return NULL; - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - if ((tor_digest_is_zero(bridge->identity) || digest == NULL) && - !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && - bridge->port == port) - return bridge; - if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - } - SMARTLIST_FOREACH_END(bridge); - return NULL; -} - -/** Wrapper around get_configured_bridge_by_addr_port_digest() to look - * it up via router descriptor ri. */ -static bridge_info_t * -get_configured_bridge_by_routerinfo(const routerinfo_t *ri) -{ - bridge_info_t *bi = NULL; - smartlist_t *orports = router_get_all_orports(ri); - bi = get_configured_bridge_by_orports_digest(ri->cache_info.identity_digest, - orports); - SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); - smartlist_free(orports); - return bi; -} - -/** Return 1 if ri is one of our known bridges, else 0. */ -int -routerinfo_is_a_configured_bridge(const routerinfo_t *ri) -{ - return get_configured_bridge_by_routerinfo(ri) ? 1 : 0; -} - -/** Return 1 if node is one of our configured bridges, else 0. */ -int -node_is_a_configured_bridge(const node_t *node) -{ - int retval = 0; - smartlist_t *orports = node_get_all_orports(node); - retval = get_configured_bridge_by_orports_digest(node->identity, - orports) != NULL; - SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p)); - smartlist_free(orports); - return retval; -} - -/** We made a connection to a router at addr:port - * without knowing its digest. Its digest turned out to be digest. - * If it was a bridge, and we still don't know its digest, record it. - */ -void -learned_router_identity(const tor_addr_t *addr, uint16_t port, - const char *digest) -{ - bridge_info_t *bridge = - get_configured_bridge_by_addr_port_digest(addr, port, digest); - if (bridge && tor_digest_is_zero(bridge->identity)) { - char *transport_info = NULL; - const char *transport_name = - find_transport_name_by_bridge_addrport(addr, port); - if (transport_name) - tor_asprintf(&transport_info, " (with transport '%s')", transport_name); - - memcpy(bridge->identity, digest, DIGEST_LEN); - log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.", - hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port), - transport_info ? transport_info : ""); - tor_free(transport_info); - } -} - -/** Return true if bridge has the same identity digest as - * digest. If digest is NULL, it matches - * bridges with unspecified identity digests. */ -static int -bridge_has_digest(const bridge_info_t *bridge, const char *digest) -{ - if (digest) - return tor_memeq(digest, bridge->identity, DIGEST_LEN); - else - return tor_digest_is_zero(bridge->identity); -} - -/** We are about to add a new bridge at addr:port, with optional - * digest and transport_name. Mark for removal any previously - * existing bridge with the same address and port, and warn the user as - * appropriate. - */ -static void -bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port, - const char *digest, const char *transport_name) -{ - /* Iterate the already-registered bridge list: - - If you find a bridge with the same adress and port, mark it for - removal. It doesn't make sense to have two active bridges with - the same IP:PORT. If the bridge in question has a different - digest or transport than digest/transport_name, - it's probably a misconfiguration and we should warn the user. - */ - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { - if (bridge->marked_for_removal) - continue; - - if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) { - - bridge->marked_for_removal = 1; - - if (!bridge_has_digest(bridge, digest) || - strcmp_opt(bridge->transport_name, transport_name)) { - /* warn the user */ - char *bridge_description_new, *bridge_description_old; - tor_asprintf(&bridge_description_new, "%s:%s:%s", - fmt_addrport(addr, port), - digest ? hex_str(digest, DIGEST_LEN) : "", - transport_name ? transport_name : ""); - tor_asprintf(&bridge_description_old, "%s:%s:%s", - fmt_addrport(&bridge->addr, bridge->port), - tor_digest_is_zero(bridge->identity) ? - "" : hex_str(bridge->identity,DIGEST_LEN), - bridge->transport_name ? bridge->transport_name : ""); - - log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict" - " with the already registered bridge '%s'. We will discard" - " the old bridge and keep '%s'. If this is not what you" - " wanted, please change your configuration file accordingly.", - bridge_description_new, bridge_description_old, - bridge_description_new); - - tor_free(bridge_description_new); - tor_free(bridge_description_old); - } - } - } SMARTLIST_FOREACH_END(bridge); -} - -/** Return True if we have a bridge that uses a transport with name - * transport_name. */ -int -transport_is_needed(const char *transport_name) -{ - if (!bridge_list) - return 0; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (bridge->transport_name && - !strcmp(bridge->transport_name, transport_name)) - return 1; - } SMARTLIST_FOREACH_END(bridge); - - return 0; -} - -/** Register the bridge information in bridge_line to the - * bridge subsystem. Steals reference of bridge_line. */ -void -bridge_add_from_config(bridge_line_t *bridge_line) -{ - bridge_info_t *b; - - { /* Log the bridge we are about to register: */ - log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)", - fmt_addrport(&bridge_line->addr, bridge_line->port), - bridge_line->transport_name ? - bridge_line->transport_name : "no transport", - tor_digest_is_zero(bridge_line->digest) ? - "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN)); - - if (bridge_line->socks_args) { /* print socks arguments */ - int i = 0; - - tor_assert(smartlist_len(bridge_line->socks_args) > 0); - - log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:", - smartlist_len(bridge_line->socks_args)); - SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg, - log_debug(LD_CONFIG, "%d: %s", ++i, arg)); - } - } - - bridge_resolve_conflicts(&bridge_line->addr, - bridge_line->port, - bridge_line->digest, - bridge_line->transport_name); - - b = tor_malloc_zero(sizeof(bridge_info_t)); - tor_addr_copy(&b->addr, &bridge_line->addr); - b->port = bridge_line->port; - memcpy(b->identity, bridge_line->digest, DIGEST_LEN); - if (bridge_line->transport_name) - b->transport_name = bridge_line->transport_name; - b->fetch_status.schedule = DL_SCHED_BRIDGE; - b->socks_args = bridge_line->socks_args; - if (!bridge_list) - bridge_list = smartlist_new(); - - tor_free(bridge_line); /* Deallocate bridge_line now. */ - - smartlist_add(bridge_list, b); -} - -/** Return true iff routerset contains the bridge bridge. */ -static int -routerset_contains_bridge(const routerset_t *routerset, - const bridge_info_t *bridge) -{ - int result; - extend_info_t *extinfo; - tor_assert(bridge); - if (!routerset) - return 0; - - extinfo = extend_info_new( - NULL, bridge->identity, NULL, NULL, &bridge->addr, bridge->port); - result = routerset_contains_extendinfo(routerset, extinfo); - extend_info_free(extinfo); - return result; -} - -/** If digest is one of our known bridges, return it. */ -static bridge_info_t * -find_bridge_by_digest(const char *digest) -{ - SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge, - { - if (tor_memeq(bridge->identity, digest, DIGEST_LEN)) - return bridge; - }); - return NULL; -} - -/** Given the addr and port of a bridge, if that bridge - * supports a pluggable transport, return its name. Otherwise, return - * NULL. */ -const char * -find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) -{ - if (!bridge_list) - return NULL; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (tor_addr_eq(&bridge->addr, addr) && - (bridge->port == port)) - return bridge->transport_name; - } SMARTLIST_FOREACH_END(bridge); - - return NULL; -} - -/** If addr and port match the address and port of a - * bridge of ours that uses pluggable transports, place its transport - * in transport. - * - * Return 0 on success (found a transport, or found a bridge with no - * transport, or found no bridge); return -1 if we should be using a - * transport, but the transport could not be found. - */ -int -get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, - const transport_t **transport) -{ - *transport = NULL; - if (!bridge_list) - return 0; - - SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) { - if (tor_addr_eq(&bridge->addr, addr) && - (bridge->port == port)) { /* bridge matched */ - if (bridge->transport_name) { /* it also uses pluggable transports */ - *transport = transport_get_by_name(bridge->transport_name); - if (*transport == NULL) { /* it uses pluggable transports, but - the transport could not be found! */ - return -1; - } - return 0; - } else { /* bridge matched, but it doesn't use transports. */ - break; - } - } - } SMARTLIST_FOREACH_END(bridge); - - *transport = NULL; - return 0; -} - -/** Return a smartlist containing all the SOCKS arguments that we - * should pass to the SOCKS proxy. */ -const smartlist_t * -get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port) -{ - bridge_info_t *bridge = get_configured_bridge_by_addr_port_digest(addr, - port, - NULL); - return bridge ? bridge->socks_args : NULL; -} - -/** We need to ask bridge for its server descriptor. */ -static void -launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) -{ - char *address; - const or_options_t *options = get_options(); - - if (connection_get_by_type_addr_port_purpose( - CONN_TYPE_DIR, &bridge->addr, bridge->port, - DIR_PURPOSE_FETCH_SERVERDESC)) - return; /* it's already on the way */ - - if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { - download_status_mark_impossible(&bridge->fetch_status); - log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", - safe_str_client(fmt_and_decorate_addr(&bridge->addr))); - return; - } - - address = tor_dup_addr(&bridge->addr); - - directory_initiate_command(address, &bridge->addr, - bridge->port, 0/*no dirport*/, - bridge->identity, - DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, - DIRIND_ONEHOP, "authority.z", NULL, 0, 0); - tor_free(address); -} - -/** Fetching the bridge descriptor from the bridge authority returned a - * "not found". Fall back to trying a direct fetch. */ -void -retry_bridge_descriptor_fetch_directly(const char *digest) -{ - bridge_info_t *bridge = find_bridge_by_digest(digest); - if (!bridge) - return; /* not found? oh well. */ - - launch_direct_bridge_descriptor_fetch(bridge); -} - -/** For each bridge in our list for which we don't currently have a - * descriptor, fetch a new copy of its descriptor -- either directly - * from the bridge or via a bridge authority. */ -void -fetch_bridge_descriptors(const or_options_t *options, time_t now) -{ - int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO); - int ask_bridge_directly; - int can_use_bridge_authority; - - if (!bridge_list) - return; - - /* If we still have unconfigured managed proxies, don't go and - connect to a bridge. */ - if (pt_proxies_configuration_pending()) - return; - - SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) - { - if (!download_status_is_ready(&bridge->fetch_status, now, - IMPOSSIBLE_TO_DOWNLOAD)) - continue; /* don't bother, no need to retry yet */ - if (routerset_contains_bridge(options->ExcludeNodes, bridge)) { - download_status_mark_impossible(&bridge->fetch_status); - log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.", - safe_str_client(fmt_and_decorate_addr(&bridge->addr))); - continue; - } - - /* schedule another fetch as if this one will fail, in case it does */ - download_status_failed(&bridge->fetch_status, 0); - - can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) && - num_bridge_auths; - ask_bridge_directly = !can_use_bridge_authority || - !options->UpdateBridgesFromAuthority; - log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)", - ask_bridge_directly, tor_digest_is_zero(bridge->identity), - !options->UpdateBridgesFromAuthority, !num_bridge_auths); - - if (ask_bridge_directly && - !fascist_firewall_allows_address_or(&bridge->addr, bridge->port)) { - log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our " - "firewall policy. %s.", - fmt_addrport(&bridge->addr, bridge->port), - can_use_bridge_authority ? - "Asking bridge authority instead" : "Skipping"); - if (can_use_bridge_authority) - ask_bridge_directly = 0; - else - continue; - } - - if (ask_bridge_directly) { - /* we need to ask the bridge itself for its descriptor. */ - launch_direct_bridge_descriptor_fetch(bridge); - } else { - /* We have a digest and we want to ask an authority. We could - * combine all the requests into one, but that may give more - * hints to the bridge authority than we want to give. */ - char resource[10 + HEX_DIGEST_LEN]; - memcpy(resource, "fp/", 3); - base16_encode(resource+3, HEX_DIGEST_LEN+1, - bridge->identity, DIGEST_LEN); - memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3); - log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.", - resource); - directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, resource, 0); - } - } - SMARTLIST_FOREACH_END(bridge); -} - -/** If our bridge is configured to be a different address than - * the bridge gives in node, rewrite the routerinfo - * we received to use the address we meant to use. Now we handle - * multihomed bridges better. - */ -static void -rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node) -{ - /* XXXX move this function. */ - /* XXXX overridden addresses should really live in the node_t, so that the - * routerinfo_t and the microdesc_t can be immutable. But we can only - * do that safely if we know that no function that connects to an OR - * does so through an address from any source other than node_get_addr(). - */ - tor_addr_t addr; - - if (node->ri) { - routerinfo_t *ri = node->ri; - tor_addr_from_ipv4h(&addr, ri->addr); - - if ((!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && - bridge->port == ri->or_port) || - (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) && - bridge->port == ri->ipv6_orport)) { - /* they match, so no need to do anything */ - } else { - if (tor_addr_family(&bridge->addr) == AF_INET) { - ri->addr = tor_addr_to_ipv4h(&bridge->addr); - tor_free(ri->address); - ri->address = tor_dup_ip(ri->addr); - ri->or_port = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerinfo for '%s' to match configured " - "address %s:%d.", - ri->nickname, ri->address, ri->or_port); - } else if (tor_addr_family(&bridge->addr) == AF_INET6) { - tor_addr_copy(&ri->ipv6_addr, &bridge->addr); - ri->ipv6_orport = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerinfo for '%s' to match configured " - "address %s.", - ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport)); - } else { - log_err(LD_BUG, "Address family not supported: %d.", - tor_addr_family(&bridge->addr)); - return; - } - } - - /* Mark which address to use based on which bridge_t we got. */ - node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 && - !tor_addr_is_null(&node->ri->ipv6_addr)); - - /* XXXipv6 we lack support for falling back to another address for - the same relay, warn the user */ - if (!tor_addr_is_null(&ri->ipv6_addr)) { - tor_addr_port_t ap; - node_get_pref_orport(node, &ap); - log_notice(LD_CONFIG, - "Bridge '%s' has both an IPv4 and an IPv6 address. " - "Will prefer using its %s address (%s).", - ri->nickname, - tor_addr_family(&ap.addr) == AF_INET6 ? "IPv6" : "IPv4", - fmt_addrport(&ap.addr, ap.port)); - } - } - if (node->rs) { - routerstatus_t *rs = node->rs; - tor_addr_from_ipv4h(&addr, rs->addr); - - if (!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) && - bridge->port == rs->or_port) { - /* they match, so no need to do anything */ - } else { - rs->addr = tor_addr_to_ipv4h(&bridge->addr); - rs->or_port = bridge->port; - log_info(LD_DIR, - "Adjusted bridge routerstatus for '%s' to match " - "configured address %s.", - rs->nickname, fmt_addrport(&bridge->addr, rs->or_port)); - } - } -} - -/** We just learned a descriptor for a bridge. See if that - * digest is in our entry guard list, and add it if not. */ -void -learned_bridge_descriptor(routerinfo_t *ri, int from_cache) -{ - tor_assert(ri); - tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE); - if (get_options()->UseBridges) { - int first = !any_bridge_descriptors_known(); - bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri); - time_t now = time(NULL); - router_set_status(ri->cache_info.identity_digest, 1); - - if (bridge) { /* if we actually want to use this one */ - node_t *node; - /* it's here; schedule its re-fetch for a long time from now. */ - if (!from_cache) - download_status_reset(&bridge->fetch_status); - - node = node_get_mutable_by_id(ri->cache_info.identity_digest); - tor_assert(node); - rewrite_node_address_for_bridge(bridge, node); - add_an_entry_guard(node, 1, 1, 0, 0); - - log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname, - from_cache ? "cached" : "fresh", router_describe(ri)); - /* set entry->made_contact so if it goes down we don't drop it from - * our entry node list */ - entry_guard_register_connect_status(ri->cache_info.identity_digest, - 1, 0, now); - if (first) - routerlist_retry_directory_downloads(now); - } - } -} - -/** Return 1 if any of our entry guards have descriptors that - * are marked with purpose 'bridge' and are running. Else return 0. - * - * We use this function to decide if we're ready to start building - * circuits through our bridges, or if we need to wait until the - * directory "server/authority" requests finish. */ -int -any_bridge_descriptors_known(void) -{ - tor_assert(get_options()->UseBridges); - return choose_random_entry(NULL) != NULL; -} - -/** Return 1 if there are any directory conns fetching bridge descriptors - * that aren't marked for close. We use this to guess if we should tell - * the controller that we have a problem. */ -int -any_pending_bridge_descriptor_fetches(void) -{ - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (conn->type == CONN_TYPE_DIR && - conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && - TO_DIR_CONN(conn)->router_purpose == ROUTER_PURPOSE_BRIDGE && - !conn->marked_for_close && - conn->linked && - conn->linked_conn && !conn->linked_conn->marked_for_close) { - log_debug(LD_DIR, "found one: %s", conn->address); - return 1; - } - } SMARTLIST_FOREACH_END(conn); - return 0; -} - -/** Return 1 if we have at least one descriptor for an entry guard - * (bridge or member of EntryNodes) and all descriptors we know are - * down. Else return 0. If act is 1, then mark the down guards - * up; else just observe and report. */ -static int -entries_retry_helper(const or_options_t *options, int act) -{ - const node_t *node; - int any_known = 0; - int any_running = 0; - int need_bridges = options->UseBridges != 0; - if (!entry_guards) - entry_guards = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - node = node_get_by_id(e->identity); - if (node && node_has_descriptor(node) && - node_is_bridge(node) == need_bridges) { - any_known = 1; - if (node->is_running) - any_running = 1; /* some entry is both known and running */ - else if (act) { - /* Mark all current connections to this OR as unhealthy, since - * otherwise there could be one that started 30 seconds - * ago, and in 30 seconds it will time out, causing us to mark - * the node down and undermine the retry attempt. We mark even - * the established conns, since if the network just came back - * we'll want to attach circuits to fresh conns. */ - connection_or_set_bad_connections(node->identity, 1); - - /* mark this entry node for retry */ - router_set_status(node->identity, 1); - e->can_retry = 1; - e->bad_since = 0; - } - } - } SMARTLIST_FOREACH_END(e); - log_debug(LD_DIR, "%d: any_known %d, any_running %d", - act, any_known, any_running); - return any_known && !any_running; -} - -/** Do we know any descriptors for our bridges / entrynodes, and are - * all the ones we have descriptors for down? */ -int -entries_known_but_down(const or_options_t *options) -{ - tor_assert(entry_list_is_constrained(options)); - return entries_retry_helper(options, 0); -} - -/** Mark all down known bridges / entrynodes up. */ -void -entries_retry_all(const or_options_t *options) -{ - tor_assert(entry_list_is_constrained(options)); - entries_retry_helper(options, 1); -} - -/** Return true if at least one of our bridges runs a Tor version that can - * provide microdescriptors to us. If not, we'll fall back to asking for - * full descriptors. */ -int -any_bridge_supports_microdescriptors(void) -{ - const node_t *node; - if (!get_options()->UseBridges || !entry_guards) - return 0; - SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) { - node = node_get_by_id(e->identity); - if (node && node->is_running && - node_is_bridge(node) && node_is_a_configured_bridge(node) && - node_understands_microdescriptors(node)) { - /* This is one of our current bridges, and we know enough about - * it to know that it will be able to answer our microdescriptor - * questions. */ - return 1; - } - } SMARTLIST_FOREACH_END(e); - return 0; -} - -/** Release all storage held by the list of entry guards and related - * memory structs. */ -void -entry_guards_free_all(void) -{ - if (entry_guards) { - SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, - entry_guard_free(e)); - smartlist_free(entry_guards); - entry_guards = NULL; - } - clear_bridge_list(); - smartlist_free(bridge_list); - bridge_list = NULL; - circuit_build_times_free_timeouts(get_circuit_build_times_mutable()); -} - diff --git a/src/tor/entrynodes.h b/src/tor/entrynodes.h deleted file mode 100644 index 772c6662d..000000000 --- a/src/tor/entrynodes.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file guardnodes.h - * \brief Header file for circuitbuild.c. - **/ - -#ifndef TOR_ENTRYNODES_H -#define TOR_ENTRYNODES_H - -#if 1 -/* XXXX NM I would prefer that all of this stuff be private to - * entrynodes.c. */ - -/** An entry_guard_t represents our information about a chosen long-term - * first hop, known as a "helper" node in the literature. We can't just - * use a node_t, since we want to remember these even when we - * don't have any directory info. */ -typedef struct entry_guard_t { - char nickname[MAX_NICKNAME_LEN+1]; - char identity[DIGEST_LEN]; - time_t chosen_on_date; /**< Approximately when was this guard added? - * "0" if we don't know. */ - char *chosen_by_version; /**< What tor version added this guard? NULL - * if we don't know. */ - unsigned int made_contact : 1; /**< 0 if we have never connected to this - * router, 1 if we have. */ - unsigned int can_retry : 1; /**< Should we retry connecting to this entry, - * in spite of having it marked as unreachable?*/ - unsigned int path_bias_noticed : 1; /**< Did we alert the user about path - * bias for this node already? */ - unsigned int path_bias_warned : 1; /**< Did we alert the user about path bias - * for this node already? */ - unsigned int path_bias_extreme : 1; /**< Did we alert the user about path - * bias for this node already? */ - unsigned int path_bias_disabled : 1; /**< Have we disabled this node because - * of path bias issues? */ - unsigned int path_bias_use_noticed : 1; /**< Did we alert the user about path - * use bias for this node already? */ - unsigned int path_bias_use_extreme : 1; /**< Did we alert the user about path - * use bias for this node already? */ - unsigned int is_dir_cache : 1; /**< Is this node a directory cache? */ - time_t bad_since; /**< 0 if this guard is currently usable, or the time at - * which it was observed to become (according to the - * directory or the user configuration) unusable. */ - time_t unreachable_since; /**< 0 if we can connect to this guard, or the - * time at which we first noticed we couldn't - * connect to it. */ - time_t last_attempted; /**< 0 if we can connect to this guard, or the time - * at which we last failed to connect to it. */ - - double circ_attempts; /**< Number of circuits this guard has "attempted" */ - double circ_successes; /**< Number of successfully built circuits using - * this guard as first hop. */ - double successful_circuits_closed; /**< Number of circuits that carried - * streams successfully. */ - double collapsed_circuits; /**< Number of fully built circuits that were - * remotely closed before any streams were - * attempted. */ - double unusable_circuits; /**< Number of circuits for which streams were - * attempted, but none succeeded. */ - double timeouts; /**< Number of 'right-censored' circuit timeouts for this - * guard. */ - double use_attempts; /**< Number of circuits we tried to use with streams */ - double use_successes; /**< Number of successfully used circuits using - * this guard as first hop. */ -} entry_guard_t; - -entry_guard_t *entry_guard_get_by_id_digest(const char *digest); -void entry_guards_changed(void); -const smartlist_t *get_entry_guards(void); -int num_live_entry_guards(int for_directory); - -#endif - -void remove_all_entry_guards(void); - -void entry_guards_compute_status(const or_options_t *options, time_t now); -int entry_guard_register_connect_status(const char *digest, int succeeded, - int mark_relay_status, time_t now); -void entry_nodes_should_be_added(void); -int entry_list_is_constrained(const or_options_t *options); -const node_t *choose_random_entry(cpath_build_state_t *state); -const node_t *choose_random_dirguard(dirinfo_type_t t); -int entry_guards_parse_state(or_state_t *state, int set, char **msg); -void entry_guards_update_state(or_state_t *state); -int getinfo_helper_entry_guards(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -void mark_bridge_list(void); -void sweep_bridge_list(void); - -int routerinfo_is_a_configured_bridge(const routerinfo_t *ri); -int node_is_a_configured_bridge(const node_t *node); -void learned_router_identity(const tor_addr_t *addr, uint16_t port, - const char *digest); -struct bridge_line_t; -void bridge_add_from_config(struct bridge_line_t *bridge_line); -void retry_bridge_descriptor_fetch_directly(const char *digest); -void fetch_bridge_descriptors(const or_options_t *options, time_t now); -void learned_bridge_descriptor(routerinfo_t *ri, int from_cache); -int any_bridge_descriptors_known(void); -int any_pending_bridge_descriptor_fetches(void); -int entries_known_but_down(const or_options_t *options); -void entries_retry_all(const or_options_t *options); - -int any_bridge_supports_microdescriptors(void); -const smartlist_t *get_socks_args_by_bridge_addrport(const tor_addr_t *addr, - uint16_t port); - -int any_bridges_dont_support_microdescriptors(void); - -void entry_guards_free_all(void); - -const char *find_transport_name_by_bridge_addrport(const tor_addr_t *addr, - uint16_t port); -struct transport_t; -int get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port, - const struct transport_t **transport); - -int transport_is_needed(const char *transport_name); -int validate_pluggable_transports_config(void); - -double pathbias_get_close_success_count(entry_guard_t *guard); -double pathbias_get_use_success_count(entry_guard_t *guard); - -#endif - diff --git a/src/tor/eventdns.h b/src/tor/eventdns.h deleted file mode 100644 index ad8c100dd..000000000 --- a/src/tor/eventdns.h +++ /dev/null @@ -1,337 +0,0 @@ - -/* - * The original DNS code is due to Adam Langley with heavy - * modifications by Nick Mathewson. Adam put his DNS software in the - * public domain. You can find his original copyright below. Please, - * aware that the code as part of libevent is governed by the 3-clause - * BSD license above. - * - * This software is Public Domain. To view a copy of the public domain dedication, - * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to - * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. - * - * I ask and expect, but do not require, that all derivative works contain an - * attribution similar to: - * Parts developed by Adam Langley - * - * You may wish to replace the word "Parts" with something else depending on - * the amount of original code. - * - * (Derivative works does not include programs which link against, run or include - * the source verbatim in their source distributions) - */ - -/* - * Welcome, gentle reader - * - * Async DNS lookups are really a whole lot harder than they should be, - * mostly stemming from the fact that the libc resolver has never been - * very good at them. Before you use this library you should see if libc - * can do the job for you with the modern async call getaddrinfo_a - * (see http://www.imperialviolet.org/page25.html#e498). Otherwise, - * please continue. - * - * This code is based on libevent and you must call event_init before - * any of the APIs in this file. You must also seed the OpenSSL random - * source if you are using OpenSSL for ids (see below). - * - * This library is designed to be included and shipped with your source - * code. You statically link with it. You should also test for the - * existence of strtok_r and define HAVE_STRTOK_R if you have it. - * - * The DNS protocol requires a good source of id numbers and these - * numbers should be unpredictable for spoofing reasons. There are - * three methods for generating them here and you must define exactly - * one of them. In increasing order of preference: - * - * DNS_USE_GETTIMEOFDAY_FOR_ID: - * Using the bottom 16 bits of the usec result from gettimeofday. This - * is a pretty poor solution but should work anywhere. - * DNS_USE_CPU_CLOCK_FOR_ID: - * Using the bottom 16 bits of the nsec result from the CPU's time - * counter. This is better, but may not work everywhere. Requires - * POSIX realtime support and you'll need to link against -lrt on - * glibc systems at least. - * DNS_USE_OPENSSL_FOR_ID: - * Uses the OpenSSL RAND_bytes call to generate the data. You must - * have seeded the pool before making any calls to this library. - * - * The library keeps track of the state of nameservers and will avoid - * them when they go down. Otherwise it will round robin between them. - * - * Quick start guide: - * #include "evdns.h" - * void callback(int result, char type, int count, int ttl, - * void *addresses, void *arg); - * evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf"); - * evdns_resolve("www.hostname.com", 0, callback, NULL); - * - * When the lookup is complete the callback function is called. The - * first argument will be one of the DNS_ERR_* defines in evdns.h. - * Hopefully it will be DNS_ERR_NONE, in which case type will be - * DNS_IPv4_A, count will be the number of IP addresses, ttl is the time - * which the data can be cached for (in seconds), addresses will point - * to an array of uint32_t's and arg will be whatever you passed to - * evdns_resolve. - * - * Searching: - * - * In order for this library to be a good replacement for glibc's resolver it - * supports searching. This involves setting a list of default domains, in - * which names will be queried for. The number of dots in the query name - * determines the order in which this list is used. - * - * Searching appears to be a single lookup from the point of view of the API, - * although many DNS queries may be generated from a single call to - * evdns_resolve. Searching can also drastically slow down the resolution - * of names. - * - * To disable searching: - * 1. Never set it up. If you never call evdns_resolv_conf_parse or - * evdns_search_add then no searching will occur. - * - * 2. If you do call evdns_resolv_conf_parse then don't pass - * DNS_OPTION_SEARCH (or DNS_OPTIONS_ALL, which implies it). - * - * 3. When calling evdns_resolve, pass the DNS_QUERY_NO_SEARCH flag. - * - * The order of searches depends on the number of dots in the name. If the - * number is greater than the ndots setting then the names is first tried - * globally. Otherwise each search domain is appended in turn. - * - * The ndots setting can either be set from a resolv.conf, or by calling - * evdns_search_ndots_set. - * - * For example, with ndots set to 1 (the default) and a search domain list of - * ["myhome.net"]: - * Query: www - * Order: www.myhome.net, www. - * - * Query: www.abc - * Order: www.abc., www.abc.myhome.net - * - * API reference: - * - * int evdns_nameserver_add(uint32_t address) - * Add a nameserver. The address should be an IP address in - * network byte order. The type of address is chosen so that - * it matches in_addr.s_addr. - * Returns non-zero on error. - * - * int evdns_nameserver_ip_add(const char *ip_as_string) - * This wraps the above function by parsing a string as an IP - * address and adds it as a nameserver. - * Returns non-zero on error - * - * int evdns_resolve(const char *name, int flags, - * evdns_callback_type callback, - * void *ptr) - * Resolve a name. The name parameter should be a DNS name. - * The flags parameter should be 0, or DNS_QUERY_NO_SEARCH - * which disables searching for this query. (see defn of - * searching above). - * - * The callback argument is a function which is called when - * this query completes and ptr is an argument which is passed - * to that callback function. - * - * Returns non-zero on error - * - * void evdns_search_clear() - * Clears the list of search domains - * - * void evdns_search_add(const char *domain) - * Add a domain to the list of search domains - * - * void evdns_search_ndots_set(int ndots) - * Set the number of dots which, when found in a name, causes - * the first query to be without any search domain. - * - * int evdns_count_nameservers(void) - * Return the number of configured nameservers (not necessarily the - * number of running nameservers). This is useful for double-checking - * whether our calls to the various nameserver configuration functions - * have been successful. - * - * int evdns_clear_nameservers_and_suspend(void) - * Remove all currently configured nameservers, and suspend all pending - * resolves. Resolves will not necessarily be re-attempted until - * evdns_resume() is called. - * - * int evdns_resume(void) - * Re-attempt resolves left in limbo after an earlier call to - * evdns_clear_nameservers_and_suspend(). - * - * int evdns_config_windows_nameservers(void) - * Attempt to configure a set of nameservers based on platform settings on - * a win32 host. Preferentially tries to use GetNetworkParams; if that fails, - * looks in the registry. Returns 0 on success, nonzero on failure. - * - * int evdns_resolv_conf_parse(int flags, const char *filename) - * Parse a resolv.conf like file from the given filename. - * - * See the man page for resolv.conf for the format of this file. - * The flags argument determines what information is parsed from - * this file: - * DNS_OPTION_SEARCH - domain, search and ndots options - * DNS_OPTION_NAMESERVERS - nameserver lines - * DNS_OPTION_MISC - timeout and attempts options - * DNS_OPTIONS_ALL - all of the above - * The following directives are not parsed from the file: - * sortlist, rotate, no-check-names, inet6, debug - * - * Returns non-zero on error: - * 0 no errors - * 1 failed to open file - * 2 failed to stat file - * 3 file too large - * 4 out of memory - * 5 short read from file - * 6 no nameservers in file - * - * Internals: - * - * Requests are kept in two queues. The first is the inflight queue. In - * this queue requests have an allocated transaction id and nameserver. - * They will soon be transmitted if they haven't already been. - * - * The second is the waiting queue. The size of the inflight ring is - * limited and all other requests wait in waiting queue for space. This - * bounds the number of concurrent requests so that we don't flood the - * nameserver. Several algorithms require a full walk of the inflight - * queue and so bounding its size keeps thing going nicely under huge - * (many thousands of requests) loads. - * - * If a nameserver loses too many requests it is considered down and we - * try not to use it. After a while we send a probe to that nameserver - * (a lookup for google.com) and, if it replies, we consider it working - * again. If the nameserver fails a probe we wait longer to try again - * with the next probe. - */ - -#ifndef TOR_EVENTDNS_H -#define TOR_EVENTDNS_H - -/* Error codes 0-5 are as described in RFC 1035. */ -#define DNS_ERR_NONE 0 -/* The name server was unable to interpret the query */ -#define DNS_ERR_FORMAT 1 -/* The name server was unable to process this query due to a problem with the - * name server */ -#define DNS_ERR_SERVERFAILED 2 -/* The domain name does not exist */ -#define DNS_ERR_NOTEXIST 3 -/* The name server does not support the requested kind of query */ -#define DNS_ERR_NOTIMPL 4 -/* The name server refuses to reform the specified operation for policy - * reasons */ -#define DNS_ERR_REFUSED 5 -/* The reply was truncated or ill-formated */ -#define DNS_ERR_TRUNCATED 65 -/* An unknown error occurred */ -#define DNS_ERR_UNKNOWN 66 -/* Communication with the server timed out */ -#define DNS_ERR_TIMEOUT 67 -/* The request was canceled because the DNS subsystem was shut down. */ -#define DNS_ERR_SHUTDOWN 68 - -#define DNS_IPv4_A 1 -#define DNS_PTR 2 -#define DNS_IPv6_AAAA 3 - -#define DNS_QUERY_NO_SEARCH 1 - -#define DNS_OPTION_SEARCH 1 -#define DNS_OPTION_NAMESERVERS 2 -#define DNS_OPTION_MISC 4 -#define DNS_OPTIONS_ALL 7 - -/* - * The callback that contains the results from a lookup. - * - type is either DNS_IPv4_A or DNS_IPv6_AAAA or DNS_PTR - * - count contains the number of addresses of form type - * - ttl is the number of seconds the resolution may be cached for. - * - addresses needs to be cast according to type - */ -typedef void (*evdns_callback_type) (int result, char type, int count, int ttl, void *addresses, void *arg); - -int evdns_init(void); -void evdns_shutdown(int fail_requests); -const char *evdns_err_to_string(int err); -int evdns_nameserver_add(uint32_t address); -int evdns_count_nameservers(void); -int evdns_clear_nameservers_and_suspend(void); -int evdns_resume(void); -int evdns_nameserver_ip_add(const char *ip_as_string); -int evdns_nameserver_sockaddr_add(const struct sockaddr *sa, socklen_t len); -void evdns_set_default_outgoing_bind_address(const struct sockaddr *addr, socklen_t addrlen); -int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr); -int evdns_resolve_ipv6(const char *name, int flags, evdns_callback_type callback, void *ptr); -struct in_addr; -struct in6_addr; -int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr); -int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr); -int evdns_set_option(const char *option, const char *val, int flags); -int evdns_resolv_conf_parse(int flags, const char *); -#ifdef _WIN32 -int evdns_config_windows_nameservers(void); -#endif -void evdns_search_clear(void); -void evdns_search_add(const char *domain); -void evdns_search_ndots_set(const int ndots); - -typedef void (*evdns_debug_log_fn_type)(int is_warning, const char *msg); -void evdns_set_log_fn(evdns_debug_log_fn_type fn); - -void evdns_set_transaction_id_fn(uint16_t (*fn)(void)); -void evdns_set_random_bytes_fn(void (*fn)(char *, size_t)); - -#define DNS_NO_SEARCH 1 - -/* Structures and functions used to implement a DNS server. */ - -struct evdns_server_request { - int flags; - int nquestions; - struct evdns_server_question **questions; -}; -struct evdns_server_question { - int type; - int dns_question_class; - char name[1]; -}; -typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *); -#define EVDNS_ANSWER_SECTION 0 -#define EVDNS_AUTHORITY_SECTION 1 -#define EVDNS_ADDITIONAL_SECTION 2 - -#define EVDNS_TYPE_A 1 -#define EVDNS_TYPE_NS 2 -#define EVDNS_TYPE_CNAME 5 -#define EVDNS_TYPE_SOA 6 -#define EVDNS_TYPE_PTR 12 -#define EVDNS_TYPE_MX 15 -#define EVDNS_TYPE_TXT 16 -#define EVDNS_TYPE_AAAA 28 - -#define EVDNS_QTYPE_AXFR 252 -#define EVDNS_QTYPE_ALL 255 - -#define EVDNS_CLASS_INET 1 - -struct evdns_server_port *evdns_add_server_port(tor_socket_t socket, int is_tcp, evdns_request_callback_fn_type callback, void *user_data); -void evdns_close_server_port(struct evdns_server_port *port); - -int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int class, int ttl, int datalen, int is_name, const char *data); -int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); -int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl); -int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl); -int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl); - -struct sockaddr; -int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len); - -int evdns_server_request_respond(struct evdns_server_request *req, int err); -int evdns_server_request_drop(struct evdns_server_request *req); - -#endif // !EVENTDNS_H diff --git a/src/tor/eventdns_tor.h b/src/tor/eventdns_tor.h deleted file mode 100644 index 4dc3c2fdd..000000000 --- a/src/tor/eventdns_tor.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_EVENTDNS_TOR_H -#define TOR_EVENTDNS_TOR_H - -#include "orconfig.h" -#define DNS_USE_OPENSSL_FOR_ID -#ifndef HAVE_UINT -typedef unsigned int uint; -#endif -#ifndef HAVE_U_CHAR -typedef unsigned char u_char; -#endif -#ifdef _WIN32 -#define inline __inline -#endif -#include "torint.h" - -/* These are for debugging possible memory leaks. */ -#include "tor_util.h" -#include "tor_compat.h" - -#endif - diff --git a/src/tor/ext_orport.c b/src/tor/ext_orport.c deleted file mode 100644 index fcfe15cfb..000000000 --- a/src/tor/ext_orport.c +++ /dev/null @@ -1,648 +0,0 @@ -/* Copyright (c) 2012, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file ext_orport.c - * \brief Code implementing the Extended ORPort. -*/ - -#define EXT_ORPORT_PRIVATE -#include "or.h" -#include "connection.h" -#include "connection_or.h" -#include "ext_orport.h" -#include "control.h" -#include "config.h" -#include "tor_util.h" -#include "onion_main.h" - -/** Allocate and return a structure capable of holding an Extended - * ORPort message of body length len. */ -ext_or_cmd_t * -ext_or_cmd_new(uint16_t len) -{ - size_t size = STRUCT_OFFSET(ext_or_cmd_t, body) + len; - ext_or_cmd_t *cmd = tor_malloc(size); - cmd->len = len; - return cmd; -} - -/** Deallocate the Extended ORPort message in cmd. */ -void -ext_or_cmd_free(ext_or_cmd_t *cmd) -{ - tor_free(cmd); -} - -/** Get an Extended ORPort message from conn, and place it in - * out. Return -1 on fail, 0 if we need more data, and 1 if we - * successfully extracted an Extended ORPort command from the - * buffer. */ -static int -connection_fetch_ext_or_cmd_from_buf(connection_t *conn, ext_or_cmd_t **out) -{ - IF_HAS_BUFFEREVENT(conn, { - struct evbuffer *input = bufferevent_get_input(conn->bufev); - return fetch_ext_or_command_from_evbuffer(input, out); - }) ELSE_IF_NO_BUFFEREVENT { - return fetch_ext_or_command_from_buf(conn->inbuf, out); - } -} - -/** Write an Extended ORPort message to conn. Use - * command as the command type, bodylen as the body - * length, and body, if it's present, as the body of the - * message. */ -STATIC int -connection_write_ext_or_command(connection_t *conn, - uint16_t command, - const char *body, - size_t bodylen) -{ - char header[4]; - if (bodylen > UINT16_MAX) - return -1; - set_uint16(header, htons(command)); - set_uint16(header+2, htons(bodylen)); - connection_write_to_buf(header, 4, conn); - if (bodylen) { - tor_assert(body); - connection_write_to_buf(body, bodylen, conn); - } - return 0; -} - -/** Transition from an Extended ORPort which accepts Extended ORPort - * messages, to an Extended ORport which accepts OR traffic. */ -static void -connection_ext_or_transition(or_connection_t *conn) -{ - tor_assert(conn->base_.type == CONN_TYPE_EXT_OR); - - conn->base_.type = CONN_TYPE_OR; - TO_CONN(conn)->state = 0; // set the state to a neutral value - control_event_or_conn_status(conn, OR_CONN_EVENT_NEW, 0); - connection_tls_start_handshake(conn, 1); -} - -/** Length of authentication cookie. */ -#define EXT_OR_PORT_AUTH_COOKIE_LEN 32 -/** Length of the header of the cookie file. */ -#define EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN 32 -/** Static cookie file header. */ -#define EXT_OR_PORT_AUTH_COOKIE_HEADER "! Extended ORPort Auth Cookie !\x0a" -/** Length of safe-cookie protocol hashes. */ -#define EXT_OR_PORT_AUTH_HASH_LEN DIGEST256_LEN -/** Length of safe-cookie protocol nonces. */ -#define EXT_OR_PORT_AUTH_NONCE_LEN 32 -/** Safe-cookie protocol constants. */ -#define EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST \ - "ExtORPort authentication server-to-client hash" -#define EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST \ - "ExtORPort authentication client-to-server hash" - -/* Code to indicate cookie authentication */ -#define EXT_OR_AUTHTYPE_SAFECOOKIE 0x01 - -/** If true, we've set ext_or_auth_cookie to a secret code and stored - * it to disk. */ -STATIC int ext_or_auth_cookie_is_set = 0; -/** If ext_or_auth_cookie_is_set, a secret cookie that we've stored to disk - * and which we're using to authenticate controllers. (If the controller can - * read it off disk, it has permission to connect.) */ -STATIC uint8_t *ext_or_auth_cookie = NULL; - -/** Helper: Return a newly allocated string containing a path to the - * file where we store our authentication cookie. */ -char * -get_ext_or_auth_cookie_file_name(void) -{ - const or_options_t *options = get_options(); - if (options->ExtORPortCookieAuthFile && - strlen(options->ExtORPortCookieAuthFile)) { - return tor_strdup(options->ExtORPortCookieAuthFile); - } else { - return get_datadir_fname("extended_orport_auth_cookie"); - } -} - -/* Initialize the cookie-based authentication system of the - * Extended ORPort. If is_enabled is 0, then disable the cookie - * authentication system. */ -int -init_ext_or_cookie_authentication(int is_enabled) -{ - char *fname = NULL; - int retval; - - if (!is_enabled) { - ext_or_auth_cookie_is_set = 0; - return 0; - } - - fname = get_ext_or_auth_cookie_file_name(); - retval = init_cookie_authentication(fname, EXT_OR_PORT_AUTH_COOKIE_HEADER, - EXT_OR_PORT_AUTH_COOKIE_HEADER_LEN, - &ext_or_auth_cookie, - &ext_or_auth_cookie_is_set); - tor_free(fname); - return retval; -} - -/** Read data from conn and see if the client sent us the - * authentication type that she prefers to use in this session. - * - * Return -1 if we received corrupted data or if we don't support the - * authentication type. Return 0 if we need more data in - * conn. Return 1 if the authentication type negotiation was - * successful. */ -static int -connection_ext_or_auth_neg_auth_type(connection_t *conn) -{ - char authtype[1] = {0}; - - if (connection_get_inbuf_len(conn) < 1) - return 0; - - if (connection_fetch_from_buf(authtype, 1, conn) < 0) - return -1; - - log_debug(LD_GENERAL, "Client wants us to use %d auth type", authtype[0]); - if (authtype[0] != EXT_OR_AUTHTYPE_SAFECOOKIE) { - /* '1' is the only auth type supported atm */ - return -1; - } - - conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE; - return 1; -} - -/** DOCDOC */ -STATIC int -handle_client_auth_nonce(const char *client_nonce, size_t client_nonce_len, - char **client_hash_out, - char **reply_out, size_t *reply_len_out) -{ - char server_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0}; - char server_nonce[EXT_OR_PORT_AUTH_NONCE_LEN] = {0}; - char *reply; - size_t reply_len; - - if (client_nonce_len != EXT_OR_PORT_AUTH_NONCE_LEN) - return -1; - - /* Get our nonce */ - if (crypto_rand(server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN) < 0) - return -1; - - { /* set up macs */ - size_t hmac_s_msg_len = strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) + - 2*EXT_OR_PORT_AUTH_NONCE_LEN; - size_t hmac_c_msg_len = strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) + - 2*EXT_OR_PORT_AUTH_NONCE_LEN; - - char *hmac_s_msg = tor_malloc_zero(hmac_s_msg_len); - char *hmac_c_msg = tor_malloc_zero(hmac_c_msg_len); - char *correct_client_hash = tor_malloc_zero(EXT_OR_PORT_AUTH_HASH_LEN); - - memcpy(hmac_s_msg, - EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST, - strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST)); - memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST), - client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); - memcpy(hmac_s_msg + strlen(EXT_OR_PORT_AUTH_SERVER_TO_CLIENT_CONST) + - EXT_OR_PORT_AUTH_NONCE_LEN, - server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); - - memcpy(hmac_c_msg, - EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST, - strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST)); - memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST), - client_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); - memcpy(hmac_c_msg + strlen(EXT_OR_PORT_AUTH_CLIENT_TO_SERVER_CONST) + - EXT_OR_PORT_AUTH_NONCE_LEN, - server_nonce, EXT_OR_PORT_AUTH_NONCE_LEN); - - crypto_hmac_sha256(server_hash, - (char*)ext_or_auth_cookie, - EXT_OR_PORT_AUTH_COOKIE_LEN, - hmac_s_msg, - hmac_s_msg_len); - - crypto_hmac_sha256(correct_client_hash, - (char*)ext_or_auth_cookie, - EXT_OR_PORT_AUTH_COOKIE_LEN, - hmac_c_msg, - hmac_c_msg_len); - - /* Store the client hash we generated. We will need to compare it - with the hash sent by the client. */ - *client_hash_out = correct_client_hash; - - memwipe(hmac_s_msg, 0, hmac_s_msg_len); - memwipe(hmac_c_msg, 0, hmac_c_msg_len); - - tor_free(hmac_s_msg); - tor_free(hmac_c_msg); - } - - { /* debug logging */ /* XXX disable this codepath if not logging on debug?*/ - char server_hash_encoded[(2*EXT_OR_PORT_AUTH_HASH_LEN) + 1]; - char server_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1]; - char client_nonce_encoded[(2*EXT_OR_PORT_AUTH_NONCE_LEN) + 1]; - - base16_encode(server_hash_encoded, sizeof(server_hash_encoded), - server_hash, sizeof(server_hash)); - base16_encode(server_nonce_encoded, sizeof(server_nonce_encoded), - server_nonce, sizeof(server_nonce)); - base16_encode(client_nonce_encoded, sizeof(client_nonce_encoded), - client_nonce, sizeof(client_nonce)); - - log_debug(LD_GENERAL, - "server_hash: '%s'\nserver_nonce: '%s'\nclient_nonce: '%s'", - server_hash_encoded, server_nonce_encoded, client_nonce_encoded); - - memwipe(server_hash_encoded, 0, sizeof(server_hash_encoded)); - memwipe(server_nonce_encoded, 0, sizeof(server_nonce_encoded)); - memwipe(client_nonce_encoded, 0, sizeof(client_nonce_encoded)); - } - - { /* write reply: (server_hash, server_nonce) */ - - reply_len = EXT_OR_PORT_AUTH_COOKIE_LEN+EXT_OR_PORT_AUTH_NONCE_LEN; - reply = tor_malloc_zero(reply_len); - memcpy(reply, server_hash, EXT_OR_PORT_AUTH_HASH_LEN); - memcpy(reply + EXT_OR_PORT_AUTH_HASH_LEN, server_nonce, - EXT_OR_PORT_AUTH_NONCE_LEN); - } - - *reply_out = reply; - *reply_len_out = reply_len; - - return 0; -} - -/** Read the client's nonce out of conn, setup the safe-cookie - * crypto, and then send our own hash and nonce to the client - * - * Return -1 if there was an error; return 0 if we need more data in - * conn, and return 1 if we successfully retrieved the - * client's nonce and sent our own. */ -static int -connection_ext_or_auth_handle_client_nonce(connection_t *conn) -{ - char client_nonce[EXT_OR_PORT_AUTH_NONCE_LEN]; - char *reply=NULL; - size_t reply_len=0; - - if (!ext_or_auth_cookie_is_set) { /* this should not happen */ - log_warn(LD_BUG, "Extended ORPort authentication cookie was not set. " - "That's weird since we should have done that on startup. " - "This might be a Tor bug, please file a bug report. "); - return -1; - } - - if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_NONCE_LEN) - return 0; - - if (connection_fetch_from_buf(client_nonce, - EXT_OR_PORT_AUTH_NONCE_LEN, conn) < 0) - return -1; - - /* We extract the ClientNonce from the received data, and use it to - calculate ServerHash and ServerNonce according to proposal 217. - - We also calculate our own ClientHash value and save it in the - connection state. We validate it later against the ClientHash - sent by the client. */ - if (handle_client_auth_nonce(client_nonce, sizeof(client_nonce), - &TO_OR_CONN(conn)->ext_or_auth_correct_client_hash, - &reply, &reply_len) < 0) - return -1; - - connection_write_to_buf(reply, reply_len, conn); - - memwipe(reply, 0, reply_len); - tor_free(reply); - - log_debug(LD_GENERAL, "Got client nonce, and sent our own nonce and hash."); - - conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH; - return 1; -} - -#define connection_ext_or_auth_send_result_success(c) \ - connection_ext_or_auth_send_result(c, 1) -#define connection_ext_or_auth_send_result_fail(c) \ - connection_ext_or_auth_send_result(c, 0) - -/** Send authentication results to conn. Successful results if - * success is set; failure results otherwise. */ -static void -connection_ext_or_auth_send_result(connection_t *conn, int success) -{ - if (success) - connection_write_to_buf("\x01", 1, conn); - else - connection_write_to_buf("\x00", 1, conn); -} - -/** Receive the client's hash from conn, validate that it's - * correct, and then send the authentication results to the client. - * - * Return -1 if there was an error during validation; return 0 if we - * need more data in conn, and return 1 if we successfully - * validated the client's hash and sent a happy authentication - * result. */ -static int -connection_ext_or_auth_handle_client_hash(connection_t *conn) -{ - char provided_client_hash[EXT_OR_PORT_AUTH_HASH_LEN] = {0}; - - if (connection_get_inbuf_len(conn) < EXT_OR_PORT_AUTH_HASH_LEN) - return 0; - - if (connection_fetch_from_buf(provided_client_hash, - EXT_OR_PORT_AUTH_HASH_LEN, conn) < 0) - return -1; - - if (tor_memneq(TO_OR_CONN(conn)->ext_or_auth_correct_client_hash, - provided_client_hash, EXT_OR_PORT_AUTH_HASH_LEN)) { - log_warn(LD_GENERAL, "Incorrect client hash. Authentication failed."); - connection_ext_or_auth_send_result_fail(conn); - return -1; - } - - log_debug(LD_GENERAL, "Got client's hash and it was legit."); - - /* send positive auth result */ - connection_ext_or_auth_send_result_success(conn); - conn->state = EXT_OR_CONN_STATE_OPEN; - return 1; -} - -/** Handle data from or_conn received on Extended ORPort. - * Return -1 on error. 0 on unsufficient data. 1 on correct. */ -static int -connection_ext_or_auth_process_inbuf(or_connection_t *or_conn) -{ - connection_t *conn = TO_CONN(or_conn); - - /* State transitions of the Extended ORPort authentication protocol: - - EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE (start state) -> - EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE -> - EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH -> - EXT_OR_CONN_STATE_OPEN - - During EXT_OR_CONN_STATE_OPEN, data is handled by - connection_ext_or_process_inbuf(). - */ - - switch (conn->state) { /* Functionify */ - case EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE: - return connection_ext_or_auth_neg_auth_type(conn); - - case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE: - return connection_ext_or_auth_handle_client_nonce(conn); - - case EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH: - return connection_ext_or_auth_handle_client_hash(conn); - - default: - log_warn(LD_BUG, "Encountered unexpected connection state %d while trying " - "to process Extended ORPort authentication data.", conn->state); - return -1; - } -} - -/** Extended ORPort commands (Transport-to-Bridge) */ -#define EXT_OR_CMD_TB_DONE 0x0000 -#define EXT_OR_CMD_TB_USERADDR 0x0001 -#define EXT_OR_CMD_TB_TRANSPORT 0x0002 - -/** Extended ORPort commands (Bridge-to-Transport) */ -#define EXT_OR_CMD_BT_OKAY 0x1000 -#define EXT_OR_CMD_BT_DENY 0x1001 -#define EXT_OR_CMD_BT_CONTROL 0x1002 - -/** Process a USERADDR command from the Extended - * ORPort. payload is a payload of size len. - * - * If the USERADDR command was well formed, change the address of - * conn to the address on the USERADDR command. - * - * Return 0 on success and -1 on error. */ -static int -connection_ext_or_handle_cmd_useraddr(connection_t *conn, - const char *payload, uint16_t len) -{ - /* Copy address string. */ - tor_addr_t addr; - uint16_t port; - char *addr_str; - char *address_part=NULL; - int res; - if (memchr(payload, '\0', len)) { - log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort UserAddr"); - return -1; - } - - addr_str = tor_memdup_nulterm(payload, len); - - res = tor_addr_port_split(LOG_INFO, addr_str, &address_part, &port); - tor_free(addr_str); - if (res<0) - return -1; - - res = tor_addr_parse(&addr, address_part); - tor_free(address_part); - if (res<0) - return -1; - - { /* do some logging */ - char *old_address = tor_dup_addr(&conn->addr); - char *new_address = tor_dup_addr(&addr); - - log_debug(LD_NET, "Received USERADDR." - "We rewrite our address from '%s:%u' to '%s:%u'.", - safe_str(old_address), conn->port, safe_str(new_address), port); - - tor_free(old_address); - tor_free(new_address); - } - - /* record the address */ - tor_addr_copy(&conn->addr, &addr); - conn->port = port; - if (conn->address) { - tor_free(conn->address); - } - conn->address = tor_dup_addr(&addr); - - return 0; -} - -/** Process a TRANSPORT command from the Extended - * ORPort. payload is a payload of size len. - * - * If the TRANSPORT command was well formed, register the name of the - * transport on conn. - * - * Return 0 on success and -1 on error. */ -static int -connection_ext_or_handle_cmd_transport(or_connection_t *conn, - const char *payload, uint16_t len) -{ - char *transport_str; - if (memchr(payload, '\0', len)) { - log_fn(LOG_PROTOCOL_WARN, LD_NET, "Unexpected NUL in ExtORPort Transport"); - return -1; - } - - transport_str = tor_memdup_nulterm(payload, len); - - /* Transport names MUST be C-identifiers. */ - if (!string_is_C_identifier(transport_str)) { - tor_free(transport_str); - return -1; - } - - /* If ext_or_transport is already occupied (because the PT sent two - * TRANSPORT commands), deallocate the old name and keep the new - * one */ - if (conn->ext_or_transport) - tor_free(conn->ext_or_transport); - - conn->ext_or_transport = transport_str; - return 0; -} - -#define EXT_OR_CONN_STATE_IS_AUTHENTICATING(st) \ - ((st) <= EXT_OR_CONN_STATE_AUTH_MAX) - -/** Process Extended ORPort messages from or_conn. */ -int -connection_ext_or_process_inbuf(or_connection_t *or_conn) -{ - connection_t *conn = TO_CONN(or_conn); - ext_or_cmd_t *command; - int r; - - /* DOCDOC Document the state machine and transitions in this function */ - - /* If we are still in the authentication stage, process traffic as - authentication data: */ - while (EXT_OR_CONN_STATE_IS_AUTHENTICATING(conn->state)) { - log_debug(LD_GENERAL, "Got Extended ORPort authentication data (%u).", - (unsigned int) connection_get_inbuf_len(conn)); - r = connection_ext_or_auth_process_inbuf(or_conn); - if (r < 0) { - connection_mark_for_close(conn); - return -1; - } else if (r == 0) { - return 0; - } - /* if r > 0, loop and process more data (if any). */ - } - - while (1) { - log_debug(LD_GENERAL, "Got Extended ORPort data."); - command = NULL; - r = connection_fetch_ext_or_cmd_from_buf(conn, &command); - if (r < 0) - goto err; - else if (r == 0) - return 0; /* need to wait for more data */ - - /* Got a command! */ - tor_assert(command); - - if (command->cmd == EXT_OR_CMD_TB_DONE) { - if (connection_get_inbuf_len(conn)) { - /* The inbuf isn't empty; the client is misbehaving. */ - goto err; - } - - log_debug(LD_NET, "Received DONE."); - - /* If the transport proxy did not use the TRANSPORT command to - * specify the transport name, mark this as unknown transport. */ - if (!or_conn->ext_or_transport) { - /* We write this string this way to avoid ??>, which is a C - * trigraph. */ - or_conn->ext_or_transport = tor_strdup(""); - } - - connection_write_ext_or_command(conn, EXT_OR_CMD_BT_OKAY, NULL, 0); - - /* can't transition immediately; need to flush first. */ - conn->state = EXT_OR_CONN_STATE_FLUSHING; - connection_stop_reading(conn); - } else if (command->cmd == EXT_OR_CMD_TB_USERADDR) { - if (connection_ext_or_handle_cmd_useraddr(conn, - command->body, command->len) < 0) - goto err; - } else if (command->cmd == EXT_OR_CMD_TB_TRANSPORT) { - if (connection_ext_or_handle_cmd_transport(or_conn, - command->body, command->len) < 0) - goto err; - } else { - log_notice(LD_NET,"Got Extended ORPort command we don't regognize (%u).", - command->cmd); - } - - ext_or_cmd_free(command); - } - - return 0; - - err: - ext_or_cmd_free(command); - connection_mark_for_close(conn); - return -1; -} - -/** conn finished flushing Extended ORPort messages to the - * network, and is now ready to accept OR traffic. This function - * does the transition. */ -int -connection_ext_or_finished_flushing(or_connection_t *conn) -{ - if (conn->base_.state == EXT_OR_CONN_STATE_FLUSHING) { - connection_start_reading(TO_CONN(conn)); - connection_ext_or_transition(conn); - } - return 0; -} - -/** Initiate Extended ORPort authentication, by sending the list of - * supported authentication types to the client. */ -int -connection_ext_or_start_auth(or_connection_t *or_conn) -{ - connection_t *conn = TO_CONN(or_conn); - const uint8_t authtypes[] = { - /* We only support authtype '1' for now. */ - EXT_OR_AUTHTYPE_SAFECOOKIE, - /* Marks the end of the list. */ - 0 - }; - - log_debug(LD_GENERAL, - "ExtORPort authentication: Sending supported authentication types"); - - connection_write_to_buf((const char *)authtypes, sizeof(authtypes), conn); - conn->state = EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE; - - return 0; -} - -/** Free any leftover allocated memory of the ext_orport.c subsystem. */ -void -ext_orport_free_all(void) -{ - if (ext_or_auth_cookie) /* Free the auth cookie */ - tor_free(ext_or_auth_cookie); -} - diff --git a/src/tor/ext_orport.h b/src/tor/ext_orport.h deleted file mode 100644 index ce45e5f41..000000000 --- a/src/tor/ext_orport.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef EXT_ORPORT_H -#define EXT_ORPORT_H - -int connection_ext_or_start_auth(or_connection_t *or_conn); - -ext_or_cmd_t *ext_or_cmd_new(uint16_t len); -void ext_or_cmd_free(ext_or_cmd_t *cmd); -void connection_or_set_ext_or_identifier(or_connection_t *conn); -void connection_or_remove_from_ext_or_id_map(or_connection_t *conn); -void connection_or_clear_ext_or_id_map(void); -or_connection_t *connection_or_get_by_ext_or_id(const char *id); - -int connection_ext_or_finished_flushing(or_connection_t *conn); -int connection_ext_or_process_inbuf(or_connection_t *or_conn); - -int init_ext_or_cookie_authentication(int is_enabled); -char *get_ext_or_auth_cookie_file_name(void); -void ext_orport_free_all(void); - -#ifdef EXT_ORPORT_PRIVATE -STATIC int connection_write_ext_or_command(connection_t *conn, - uint16_t command, - const char *body, - size_t bodylen); -STATIC int handle_client_auth_nonce(const char *client_nonce, - size_t client_nonce_len, - char **client_hash_out, - char **reply_out, size_t *reply_len_out); -#ifdef TOR_UNIT_TESTS -extern uint8_t *ext_or_auth_cookie; -extern int ext_or_auth_cookie_is_set; -#endif -#endif - -#endif - diff --git a/src/tor/fp_pair.c b/src/tor/fp_pair.c deleted file mode 100644 index 4d8a835c8..000000000 --- a/src/tor/fp_pair.c +++ /dev/null @@ -1,308 +0,0 @@ -/* Copyright (c) 2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "fp_pair.h" - -/* Define fp_pair_map_t structures */ - -struct fp_pair_map_entry_s { - HT_ENTRY(fp_pair_map_entry_s) node; - void *val; - fp_pair_t key; -}; - -struct fp_pair_map_s { - HT_HEAD(fp_pair_map_impl, fp_pair_map_entry_s) head; -}; - -/* - * Hash function and equality checker for fp_pair_map_t - */ - -/** Compare fp_pair_entry_t objects by key value. */ -static INLINE int -fp_pair_map_entries_eq(const fp_pair_map_entry_t *a, - const fp_pair_map_entry_t *b) -{ - return tor_memeq(&(a->key), &(b->key), sizeof(fp_pair_t)); -} - -/** Return a hash value for an fp_pair_entry_t. */ -static INLINE unsigned int -fp_pair_map_entry_hash(const fp_pair_map_entry_t *a) -{ - const uint32_t *p; - unsigned int hash; - - p = (const uint32_t *)(a->key.first); - /* Hashes are 20 bytes long, so 5 times uint32_t */ - hash = p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; - /* Now XOR in the second fingerprint */ - p = (const uint32_t *)(a->key.second); - hash ^= p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; - - return hash; -} - -/* - * Hash table functions for fp_pair_map_t - */ - -HT_PROTOTYPE(fp_pair_map_impl, fp_pair_map_entry_s, node, - fp_pair_map_entry_hash, fp_pair_map_entries_eq) -HT_GENERATE(fp_pair_map_impl, fp_pair_map_entry_s, node, - fp_pair_map_entry_hash, fp_pair_map_entries_eq, - 0.6, tor_malloc, tor_realloc, tor_free) - -/** Constructor to create a new empty map from fp_pair_t to void * - */ - -fp_pair_map_t * -fp_pair_map_new(void) -{ - fp_pair_map_t *result; - - result = tor_malloc(sizeof(fp_pair_map_t)); - HT_INIT(fp_pair_map_impl, &result->head); - return result; -} - -/** Set the current value for key to val; returns the previous - * value for key if one was set, or NULL if one was not. - */ - -void * -fp_pair_map_set(fp_pair_map_t *map, const fp_pair_t *key, void *val) -{ - fp_pair_map_entry_t *resolve; - fp_pair_map_entry_t search; - void *oldval; - - tor_assert(map); - tor_assert(key); - tor_assert(val); - - memcpy(&(search.key), key, sizeof(*key)); - resolve = HT_FIND(fp_pair_map_impl, &(map->head), &search); - if (resolve) { - oldval = resolve->val; - resolve->val = val; - } else { - resolve = tor_malloc_zero(sizeof(fp_pair_map_entry_t)); - memcpy(&(resolve->key), key, sizeof(*key)); - resolve->val = val; - HT_INSERT(fp_pair_map_impl, &(map->head), resolve); - oldval = NULL; - } - - return oldval; -} - -/** Set the current value for the key (first, second) to val; returns - * the previous value for key if one was set, or NULL if one was not. - */ - -void * -fp_pair_map_set_by_digests(fp_pair_map_t *map, - const char *first, const char *second, - void *val) -{ - fp_pair_t k; - - tor_assert(first); - tor_assert(second); - - memcpy(k.first, first, DIGEST_LEN); - memcpy(k.second, second, DIGEST_LEN); - - return fp_pair_map_set(map, &k, val); -} - -/** Return the current value associated with key, or NULL if no value is set. - */ - -void * -fp_pair_map_get(const fp_pair_map_t *map, const fp_pair_t *key) -{ - fp_pair_map_entry_t *resolve; - fp_pair_map_entry_t search; - void *val = NULL; - - tor_assert(map); - tor_assert(key); - - memcpy(&(search.key), key, sizeof(*key)); - resolve = HT_FIND(fp_pair_map_impl, &(map->head), &search); - if (resolve) val = resolve->val; - - return val; -} - -/** Return the current value associated the key (first, second), or - * NULL if no value is set. - */ - -void * -fp_pair_map_get_by_digests(const fp_pair_map_t *map, - const char *first, const char *second) -{ - fp_pair_t k; - - tor_assert(first); - tor_assert(second); - - memcpy(k.first, first, DIGEST_LEN); - memcpy(k.second, second, DIGEST_LEN); - - return fp_pair_map_get(map, &k); -} - -/** Remove the value currently associated with key from the map. - * Return the value if one was set, or NULL if there was no entry for - * key. The caller must free any storage associated with the - * returned value. - */ - -void * -fp_pair_map_remove(fp_pair_map_t *map, const fp_pair_t *key) -{ - fp_pair_map_entry_t *resolve; - fp_pair_map_entry_t search; - void *val = NULL; - - tor_assert(map); - tor_assert(key); - - memcpy(&(search.key), key, sizeof(*key)); - resolve = HT_REMOVE(fp_pair_map_impl, &(map->head), &search); - if (resolve) { - val = resolve->val; - tor_free(resolve); - } - - return val; -} - -/** Remove all entries from map, and deallocate storage for those entries. - * If free_val is provided, it is invoked on every value in map. - */ - -void -fp_pair_map_free(fp_pair_map_t *map, void (*free_val)(void*)) -{ - fp_pair_map_entry_t **ent, **next, *this; - - if (map) { - for (ent = HT_START(fp_pair_map_impl, &(map->head)); - ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(fp_pair_map_impl, &(map->head), ent); - if (free_val) free_val(this->val); - tor_free(this); - } - tor_assert(HT_EMPTY(&(map->head))); - HT_CLEAR(fp_pair_map_impl, &(map->head)); - tor_free(map); - } -} - -/** Return true iff map has no entries. - */ - -int -fp_pair_map_isempty(const fp_pair_map_t *map) -{ - tor_assert(map); - - return HT_EMPTY(&(map->head)); -} - -/** Return the number of items in map. - */ - -int -fp_pair_map_size(const fp_pair_map_t *map) -{ - tor_assert(map); - - return HT_SIZE(&(map->head)); -} - -/** return an iterator pointing to the start of map. - */ - -fp_pair_map_iter_t * -fp_pair_map_iter_init(fp_pair_map_t *map) -{ - tor_assert(map); - - return HT_START(fp_pair_map_impl, &(map->head)); -} - -/** Advance iter a single step to the next entry of map, and return - * its new value. - */ - -fp_pair_map_iter_t * -fp_pair_map_iter_next(fp_pair_map_t *map, fp_pair_map_iter_t *iter) -{ - tor_assert(map); - tor_assert(iter); - - return HT_NEXT(fp_pair_map_impl, &(map->head), iter); -} - -/** Advance iter a single step to the next entry of map, removing the current - * entry, and return its new value. - */ - -fp_pair_map_iter_t * -fp_pair_map_iter_next_rmv(fp_pair_map_t *map, fp_pair_map_iter_t *iter) -{ - fp_pair_map_entry_t *rmv; - - tor_assert(map); - tor_assert(iter); - tor_assert(*iter); - - rmv = *iter; - iter = HT_NEXT_RMV(fp_pair_map_impl, &(map->head), iter); - tor_free(rmv); - - return iter; -} - -/** Set *key_out and *val_out to the current entry pointed to by iter. - */ - -void -fp_pair_map_iter_get(fp_pair_map_iter_t *iter, - fp_pair_t *key_out, void **val_out) -{ - tor_assert(iter); - tor_assert(*iter); - - if (key_out) memcpy(key_out, &((*iter)->key), sizeof(fp_pair_t)); - if (val_out) *val_out = (*iter)->val; -} - -/** Return true iff iter has advanced past the last entry of its map. - */ - -int -fp_pair_map_iter_done(fp_pair_map_iter_t *iter) -{ - return (iter == NULL); -} - -/** Assert if anything has gone wrong with the internal - * representation of map. - */ - -void -fp_pair_map_assert_ok(const fp_pair_map_t *map) -{ - tor_assert(!fp_pair_map_impl_HT_REP_IS_BAD_(&(map->head))); -} - diff --git a/src/tor/fp_pair.h b/src/tor/fp_pair.h deleted file mode 100644 index 89f664a81..000000000 --- a/src/tor/fp_pair.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file fp_pair.h - * \brief Header file for fp_pair.c. - **/ - -#ifndef _TOR_FP_PAIR_H -#define _TOR_FP_PAIR_H - -/* - * Declare fp_pair_map_t functions and structs - */ - -typedef struct fp_pair_map_entry_s fp_pair_map_entry_t; -typedef struct fp_pair_map_s fp_pair_map_t; -typedef fp_pair_map_entry_t *fp_pair_map_iter_t; - -fp_pair_map_t * fp_pair_map_new(void); -void * fp_pair_map_set(fp_pair_map_t *map, const fp_pair_t *key, void *val); -void * fp_pair_map_set_by_digests(fp_pair_map_t *map, - const char *first, const char *second, - void *val); -void * fp_pair_map_get(const fp_pair_map_t *map, const fp_pair_t *key); -void * fp_pair_map_get_by_digests(const fp_pair_map_t *map, - const char *first, const char *second); -void * fp_pair_map_remove(fp_pair_map_t *map, const fp_pair_t *key); -void fp_pair_map_free(fp_pair_map_t *map, void (*free_val)(void*)); -int fp_pair_map_isempty(const fp_pair_map_t *map); -int fp_pair_map_size(const fp_pair_map_t *map); -fp_pair_map_iter_t * fp_pair_map_iter_init(fp_pair_map_t *map); -fp_pair_map_iter_t * fp_pair_map_iter_next(fp_pair_map_t *map, - fp_pair_map_iter_t *iter); -fp_pair_map_iter_t * fp_pair_map_iter_next_rmv(fp_pair_map_t *map, - fp_pair_map_iter_t *iter); -void fp_pair_map_iter_get(fp_pair_map_iter_t *iter, - fp_pair_t *key_out, void **val_out); -int fp_pair_map_iter_done(fp_pair_map_iter_t *iter); -void fp_pair_map_assert_ok(const fp_pair_map_t *map); - -#undef DECLARE_MAP_FNS - -#endif - diff --git a/src/tor/geoip.c b/src/tor/geoip.c deleted file mode 100644 index dc4730c81..000000000 --- a/src/tor/geoip.c +++ /dev/null @@ -1,1684 +0,0 @@ -/* Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file geoip.c - * \brief Functions related to maintaining an IP-to-country database; - * to summarizing client connections by country to entry guards, bridges, - * and directory servers; and for statistics on answering network status - * requests. - */ - -#define GEOIP_PRIVATE -#include "or.h" -#include "ht.h" -#include "config.h" -#include "control.h" -#include "dnsserv.h" -#include "geoip.h" -#include "routerlist.h" - -static void clear_geoip_db(void); -static void init_geoip_countries(void); - -/** An entry from the GeoIP IPv4 file: maps an IPv4 range to a country. */ -typedef struct geoip_ipv4_entry_t { - uint32_t ip_low; /**< The lowest IP in the range, in host order */ - uint32_t ip_high; /**< The highest IP in the range, in host order */ - intptr_t country; /**< An index into geoip_countries */ -} geoip_ipv4_entry_t; - -/** An entry from the GeoIP IPv6 file: maps an IPv6 range to a country. */ -typedef struct geoip_ipv6_entry_t { - struct in6_addr ip_low; /**< The lowest IP in the range, in host order */ - struct in6_addr ip_high; /**< The highest IP in the range, in host order */ - intptr_t country; /**< An index into geoip_countries */ -} geoip_ipv6_entry_t; - -/** A per-country record for GeoIP request history. */ -typedef struct geoip_country_t { - char countrycode[3]; - uint32_t n_v3_ns_requests; -} geoip_country_t; - -/** A list of geoip_country_t */ -static smartlist_t *geoip_countries = NULL; -/** A map from lowercased country codes to their position in geoip_countries. - * The index is encoded in the pointer, and 1 is added so that NULL can mean - * not found. */ -static strmap_t *country_idxplus1_by_lc_code = NULL; -/** Lists of all known geoip_ipv4_entry_t and geoip_ipv6_entry_t, sorted - * by their respective ip_low. */ -static smartlist_t *geoip_ipv4_entries = NULL, *geoip_ipv6_entries = NULL; - -/** SHA1 digest of the GeoIP files to include in extra-info descriptors. */ -static char geoip_digest[DIGEST_LEN]; -static char geoip6_digest[DIGEST_LEN]; - -/** Return the index of the country's entry in the GeoIP - * country list if it is a valid 2-letter country code, otherwise - * return -1. */ -country_t -geoip_get_country(const char *country) -{ - void *idxplus1_; - intptr_t idx; - - idxplus1_ = strmap_get_lc(country_idxplus1_by_lc_code, country); - if (!idxplus1_) - return -1; - - idx = ((uintptr_t)idxplus1_)-1; - return (country_t)idx; -} - -/** Add an entry to a GeoIP table, mapping all IP addresses between low - * and high, inclusive, to the 2-letter country code country. */ -static void -geoip_add_entry(const tor_addr_t *low, const tor_addr_t *high, - const char *country) -{ - intptr_t idx; - void *idxplus1_; - - if (tor_addr_family(low) != tor_addr_family(high)) - return; - if (tor_addr_compare(high, low, CMP_EXACT) < 0) - return; - - idxplus1_ = strmap_get_lc(country_idxplus1_by_lc_code, country); - - if (!idxplus1_) { - geoip_country_t *c = tor_malloc_zero(sizeof(geoip_country_t)); - strlcpy(c->countrycode, country, sizeof(c->countrycode)); - tor_strlower(c->countrycode); - smartlist_add(geoip_countries, c); - idx = smartlist_len(geoip_countries) - 1; - strmap_set_lc(country_idxplus1_by_lc_code, country, (void*)(idx+1)); - } else { - idx = ((uintptr_t)idxplus1_)-1; - } - { - geoip_country_t *c = smartlist_get(geoip_countries, idx); - tor_assert(!strcasecmp(c->countrycode, country)); - } - - if (tor_addr_family(low) == AF_INET) { - geoip_ipv4_entry_t *ent = tor_malloc_zero(sizeof(geoip_ipv4_entry_t)); - ent->ip_low = tor_addr_to_ipv4h(low); - ent->ip_high = tor_addr_to_ipv4h(high); - ent->country = idx; - smartlist_add(geoip_ipv4_entries, ent); - } else if (tor_addr_family(low) == AF_INET6) { - geoip_ipv6_entry_t *ent = tor_malloc_zero(sizeof(geoip_ipv6_entry_t)); - ent->ip_low = *tor_addr_to_in6(low); - ent->ip_high = *tor_addr_to_in6(high); - ent->country = idx; - smartlist_add(geoip_ipv6_entries, ent); - } -} - -/** Add an entry to the GeoIP table indicated by family, - * parsing it from line. The format is as for geoip_load_file(). */ -STATIC int -geoip_parse_entry(const char *line, sa_family_t family) -{ - tor_addr_t low_addr, high_addr; - char c[3]; - char *country = NULL; - - if (!geoip_countries) - init_geoip_countries(); - if (family == AF_INET) { - if (!geoip_ipv4_entries) - geoip_ipv4_entries = smartlist_new(); - } else if (family == AF_INET6) { - if (!geoip_ipv6_entries) - geoip_ipv6_entries = smartlist_new(); - } else { - log_warn(LD_GENERAL, "Unsupported family: %d", family); - return -1; - } - - while (TOR_ISSPACE(*line)) - ++line; - if (*line == '#') - return 0; - - if (family == AF_INET) { - unsigned int low, high; - if (tor_sscanf(line,"%u,%u,%2s", &low, &high, c) == 3 || - tor_sscanf(line,"\"%u\",\"%u\",\"%2s\",", &low, &high, c) == 3) { - tor_addr_from_ipv4h(&low_addr, low); - tor_addr_from_ipv4h(&high_addr, high); - } else - goto fail; - country = c; - } else { /* AF_INET6 */ - char buf[512]; - char *low_str, *high_str; - struct in6_addr low, high; - char *strtok_state; - strlcpy(buf, line, sizeof(buf)); - low_str = tor_strtok_r(buf, ",", &strtok_state); - if (!low_str) - goto fail; - high_str = tor_strtok_r(NULL, ",", &strtok_state); - if (!high_str) - goto fail; - country = tor_strtok_r(NULL, "\n", &strtok_state); - if (!country) - goto fail; - if (strlen(country) != 2) - goto fail; - if (tor_inet_pton(AF_INET6, low_str, &low) <= 0) - goto fail; - tor_addr_from_in6(&low_addr, &low); - if (tor_inet_pton(AF_INET6, high_str, &high) <= 0) - goto fail; - tor_addr_from_in6(&high_addr, &high); - } - geoip_add_entry(&low_addr, &high_addr, country); - return 0; - - fail: - log_warn(LD_GENERAL, "Unable to parse line from GEOIP %s file: %s", - family == AF_INET ? "IPv4" : "IPv6", escaped(line)); - return -1; -} - -/** Sorting helper: return -1, 1, or 0 based on comparison of two - * geoip_ipv4_entry_t */ -static int -geoip_ipv4_compare_entries_(const void **_a, const void **_b) -{ - const geoip_ipv4_entry_t *a = *_a, *b = *_b; - if (a->ip_low < b->ip_low) - return -1; - else if (a->ip_low > b->ip_low) - return 1; - else - return 0; -} - -/** bsearch helper: return -1, 1, or 0 based on comparison of an IP (a pointer - * to a uint32_t in host order) to a geoip_ipv4_entry_t */ -static int -geoip_ipv4_compare_key_to_entry_(const void *_key, const void **_member) -{ - /* No alignment issue here, since _key really is a pointer to uint32_t */ - const uint32_t addr = *(uint32_t *)_key; - const geoip_ipv4_entry_t *entry = *_member; - if (addr < entry->ip_low) - return -1; - else if (addr > entry->ip_high) - return 1; - else - return 0; -} - -/** Sorting helper: return -1, 1, or 0 based on comparison of two - * geoip_ipv6_entry_t */ -static int -geoip_ipv6_compare_entries_(const void **_a, const void **_b) -{ - const geoip_ipv6_entry_t *a = *_a, *b = *_b; - return fast_memcmp(a->ip_low.s6_addr, b->ip_low.s6_addr, - sizeof(struct in6_addr)); -} - -/** bsearch helper: return -1, 1, or 0 based on comparison of an IPv6 - * (a pointer to a in6_addr) to a geoip_ipv6_entry_t */ -static int -geoip_ipv6_compare_key_to_entry_(const void *_key, const void **_member) -{ - const struct in6_addr *addr = (struct in6_addr *)_key; - const geoip_ipv6_entry_t *entry = *_member; - - if (fast_memcmp(addr->s6_addr, entry->ip_low.s6_addr, - sizeof(struct in6_addr)) < 0) - return -1; - else if (fast_memcmp(addr->s6_addr, entry->ip_high.s6_addr, - sizeof(struct in6_addr)) > 0) - return 1; - else - return 0; -} - -/** Return 1 if we should collect geoip stats on bridge users, and - * include them in our extrainfo descriptor. Else return 0. */ -int -should_record_bridge_info(const or_options_t *options) -{ - return options->BridgeRelay && options->BridgeRecordUsageByCountry; -} - -/** Set up a new list of geoip countries with no countries (yet) set in it, - * except for the unknown country. - */ -static void -init_geoip_countries(void) -{ - geoip_country_t *geoip_unresolved; - geoip_countries = smartlist_new(); - /* Add a geoip_country_t for requests that could not be resolved to a - * country as first element (index 0) to geoip_countries. */ - geoip_unresolved = tor_malloc_zero(sizeof(geoip_country_t)); - strlcpy(geoip_unresolved->countrycode, "??", - sizeof(geoip_unresolved->countrycode)); - smartlist_add(geoip_countries, geoip_unresolved); - country_idxplus1_by_lc_code = strmap_new(); - strmap_set_lc(country_idxplus1_by_lc_code, "??", (void*)(1)); -} - -/** Clear appropriate GeoIP database, based on family, and - * reload it from the file filename. Return 0 on success, -1 on - * failure. - * - * Recognized line formats for IPv4 are: - * INTIPLOW,INTIPHIGH,CC - * and - * "INTIPLOW","INTIPHIGH","CC","CC3","COUNTRY NAME" - * where INTIPLOW and INTIPHIGH are IPv4 addresses encoded as 4-byte unsigned - * integers, and CC is a country code. - * - * Recognized line format for IPv6 is: - * IPV6LOW,IPV6HIGH,CC - * where IPV6LOW and IPV6HIGH are IPv6 addresses and CC is a country code. - * - * It also recognizes, and skips over, blank lines and lines that start - * with '#' (comments). - */ -int -geoip_load_file(sa_family_t family, const char *filename) -{ - FILE *f; - const char *msg = ""; - const or_options_t *options = get_options(); - int severity = options_need_geoip_info(options, &msg) ? LOG_WARN : LOG_INFO; - crypto_digest_t *geoip_digest_env = NULL; - - tor_assert(family == AF_INET || family == AF_INET6); - - if (!(f = tor_fopen_cloexec(filename, "r"))) { - log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s. %s", - filename, msg); - return -1; - } - if (!geoip_countries) - init_geoip_countries(); - - if (family == AF_INET) { - if (geoip_ipv4_entries) { - SMARTLIST_FOREACH(geoip_ipv4_entries, geoip_ipv4_entry_t *, e, - tor_free(e)); - smartlist_free(geoip_ipv4_entries); - } - geoip_ipv4_entries = smartlist_new(); - } else { /* AF_INET6 */ - if (geoip_ipv6_entries) { - SMARTLIST_FOREACH(geoip_ipv6_entries, geoip_ipv6_entry_t *, e, - tor_free(e)); - smartlist_free(geoip_ipv6_entries); - } - geoip_ipv6_entries = smartlist_new(); - } - geoip_digest_env = crypto_digest_new(); - - log_notice(LD_GENERAL, "Parsing GEOIP %s file %s.", - (family == AF_INET) ? "IPv4" : "IPv6", filename); - while (!feof(f)) { - char buf[512]; - if (fgets(buf, (int)sizeof(buf), f) == NULL) - break; - crypto_digest_add_bytes(geoip_digest_env, buf, strlen(buf)); - /* FFFF track full country name. */ - geoip_parse_entry(buf, family); - } - /*XXXX abort and return -1 if no entries/illformed?*/ - fclose(f); - - /* Sort list and remember file digests so that we can include it in - * our extra-info descriptors. */ - if (family == AF_INET) { - smartlist_sort(geoip_ipv4_entries, geoip_ipv4_compare_entries_); - /* Okay, now we need to maybe change our mind about what is in - * which country. We do this for IPv4 only since that's what we - * store in node->country. */ - refresh_all_country_info(); - crypto_digest_get_digest(geoip_digest_env, geoip_digest, DIGEST_LEN); - } else { - /* AF_INET6 */ - smartlist_sort(geoip_ipv6_entries, geoip_ipv6_compare_entries_); - crypto_digest_get_digest(geoip_digest_env, geoip6_digest, DIGEST_LEN); - } - crypto_digest_free(geoip_digest_env); - - return 0; -} - -/** Given an IP address in host order, return a number representing the - * country to which that address belongs, -1 for "No geoip information - * available", or 0 for the 'unknown country'. The return value will always - * be less than geoip_get_n_countries(). To decode it, call - * geoip_get_country_name(). - */ -STATIC int -geoip_get_country_by_ipv4(uint32_t ipaddr) -{ - geoip_ipv4_entry_t *ent; - if (!geoip_ipv4_entries) - return -1; - ent = smartlist_bsearch(geoip_ipv4_entries, &ipaddr, - geoip_ipv4_compare_key_to_entry_); - return ent ? (int)ent->country : 0; -} - -/** Given an IPv6 address, return a number representing the country to - * which that address belongs, -1 for "No geoip information available", or - * 0 for the 'unknown country'. The return value will always be less than - * geoip_get_n_countries(). To decode it, call geoip_get_country_name(). - */ -STATIC int -geoip_get_country_by_ipv6(const struct in6_addr *addr) -{ - geoip_ipv6_entry_t *ent; - - if (!geoip_ipv6_entries) - return -1; - ent = smartlist_bsearch(geoip_ipv6_entries, addr, - geoip_ipv6_compare_key_to_entry_); - return ent ? (int)ent->country : 0; -} - -/** Given an IP address, return a number representing the country to which - * that address belongs, -1 for "No geoip information available", or 0 for - * the 'unknown country'. The return value will always be less than - * geoip_get_n_countries(). To decode it, call geoip_get_country_name(). - */ -int -geoip_get_country_by_addr(const tor_addr_t *addr) -{ - if (tor_addr_family(addr) == AF_INET) { - return geoip_get_country_by_ipv4(tor_addr_to_ipv4h(addr)); - } else if (tor_addr_family(addr) == AF_INET6) { - return geoip_get_country_by_ipv6(tor_addr_to_in6(addr)); - } else { - return -1; - } -} - -/** Return the number of countries recognized by the GeoIP country list. */ -int -geoip_get_n_countries(void) -{ - if (!geoip_countries) - init_geoip_countries(); - return (int) smartlist_len(geoip_countries); -} - -/** Return the two-letter country code associated with the number num, - * or "??" for an unknown value. */ -const char * -geoip_get_country_name(country_t num) -{ - if (geoip_countries && num >= 0 && num < smartlist_len(geoip_countries)) { - geoip_country_t *c = smartlist_get(geoip_countries, num); - return c->countrycode; - } else - return "??"; -} - -/** Return true iff we have loaded a GeoIP database.*/ -int -geoip_is_loaded(sa_family_t family) -{ - tor_assert(family == AF_INET || family == AF_INET6); - if (geoip_countries == NULL) - return 0; - if (family == AF_INET) - return geoip_ipv4_entries != NULL; - else /* AF_INET6 */ - return geoip_ipv6_entries != NULL; -} - -/** Return the hex-encoded SHA1 digest of the loaded GeoIP file. The - * result does not need to be deallocated, but will be overwritten by the - * next call of hex_str(). */ -const char * -geoip_db_digest(sa_family_t family) -{ - tor_assert(family == AF_INET || family == AF_INET6); - if (family == AF_INET) - return hex_str(geoip_digest, DIGEST_LEN); - else /* AF_INET6 */ - return hex_str(geoip6_digest, DIGEST_LEN); -} - -/** Entry in a map from IP address to the last time we've seen an incoming - * connection from that IP address. Used by bridges only, to track which - * countries have them blocked. */ -typedef struct clientmap_entry_t { - HT_ENTRY(clientmap_entry_t) node; - tor_addr_t addr; - /* Name of pluggable transport used by this client. NULL if no - pluggable transport was used. */ - char *transport_name; - - /** Time when we last saw this IP address, in MINUTES since the epoch. - * - * (This will run out of space around 4011 CE. If Tor is still in use around - * 4000 CE, please remember to add more bits to last_seen_in_minutes.) */ - unsigned int last_seen_in_minutes:30; - unsigned int action:2; -} clientmap_entry_t; - -/** Largest allowable value for last_seen_in_minutes. (It's a 30-bit field, - * so it can hold up to (1u<<30)-1, or 0x3fffffffu. - */ -#define MAX_LAST_SEEN_IN_MINUTES 0X3FFFFFFFu - -/** Map from client IP address to last time seen. */ -static HT_HEAD(clientmap, clientmap_entry_t) client_history = - HT_INITIALIZER(); - -/** Hashtable helper: compute a hash of a clientmap_entry_t. */ -static INLINE unsigned -clientmap_entry_hash(const clientmap_entry_t *a) -{ - unsigned h = tor_addr_hash(&a->addr); - if (a->transport_name) - h += ht_string_hash(a->transport_name); - return ht_improve_hash(h); -} -/** Hashtable helper: compare two clientmap_entry_t values for equality. */ -static INLINE int -clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b) -{ - if (strcmp_opt(a->transport_name, b->transport_name)) - return 0; - - return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) && - a->action == b->action; -} - -HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, - clientmap_entries_eq); -HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash, - clientmap_entries_eq, 0.6, malloc, realloc, free); - -/** Free all storage held by ent. */ -static void -clientmap_entry_free(clientmap_entry_t *ent) -{ - if (!ent) - return; - - tor_free(ent->transport_name); - tor_free(ent); -} - -/** Clear history of connecting clients used by entry and bridge stats. */ -static void -client_history_clear(void) -{ - clientmap_entry_t **ent, **next, *this; - for (ent = HT_START(clientmap, &client_history); ent != NULL; - ent = next) { - if ((*ent)->action == GEOIP_CLIENT_CONNECT) { - this = *ent; - next = HT_NEXT_RMV(clientmap, &client_history, ent); - clientmap_entry_free(this); - } else { - next = HT_NEXT(clientmap, &client_history, ent); - } - } -} - -/** Note that we've seen a client connect from the IP addr - * at time now. Ignored by all but bridges and directories if - * configured accordingly. */ -void -geoip_note_client_seen(geoip_client_action_t action, - const tor_addr_t *addr, - const char *transport_name, - time_t now) -{ - const or_options_t *options = get_options(); - clientmap_entry_t lookup, *ent; - memset(&lookup, 0, sizeof(clientmap_entry_t)); - - if (action == GEOIP_CLIENT_CONNECT) { - /* Only remember statistics as entry guard or as bridge. */ - if (!options->EntryStatistics && - (!(options->BridgeRelay && options->BridgeRecordUsageByCountry))) - return; - } else { - if (options->BridgeRelay || options->BridgeAuthoritativeDir || - !options->DirReqStatistics) - return; - } - - log_debug(LD_GENERAL, "Seen client from '%s' with transport '%s'.", - safe_str_client(fmt_addr((addr))), - transport_name ? transport_name : ""); - - tor_addr_copy(&lookup.addr, addr); - lookup.action = (int)action; - lookup.transport_name = (char*) transport_name; - ent = HT_FIND(clientmap, &client_history, &lookup); - - if (! ent) { - ent = tor_malloc_zero(sizeof(clientmap_entry_t)); - tor_addr_copy(&ent->addr, addr); - if (transport_name) - ent->transport_name = tor_strdup(transport_name); - ent->action = (int)action; - HT_INSERT(clientmap, &client_history, ent); - } - if (now / 60 <= (int)MAX_LAST_SEEN_IN_MINUTES && now >= 0) - ent->last_seen_in_minutes = (unsigned)(now/60); - else - ent->last_seen_in_minutes = 0; - - if (action == GEOIP_CLIENT_NETWORKSTATUS) { - int country_idx = geoip_get_country_by_addr(addr); - if (country_idx < 0) - country_idx = 0; /** unresolved requests are stored at index 0. */ - if (country_idx >= 0 && country_idx < smartlist_len(geoip_countries)) { - geoip_country_t *country = smartlist_get(geoip_countries, country_idx); - ++country->n_v3_ns_requests; - } - } -} - -/** HT_FOREACH helper: remove a clientmap_entry_t from the hashtable if it's - * older than a certain time. */ -static int -remove_old_client_helper_(struct clientmap_entry_t *ent, void *_cutoff) -{ - time_t cutoff = *(time_t*)_cutoff / 60; - if (ent->last_seen_in_minutes < cutoff) { - clientmap_entry_free(ent); - return 1; - } else { - return 0; - } -} - -/** Forget about all clients that haven't connected since cutoff. */ -void -geoip_remove_old_clients(time_t cutoff) -{ - clientmap_HT_FOREACH_FN(&client_history, - remove_old_client_helper_, - &cutoff); -} - -/** How many responses are we giving to clients requesting v3 network - * statuses? */ -static uint32_t ns_v3_responses[GEOIP_NS_RESPONSE_NUM]; - -/** Note that we've rejected a client's request for a v3 network status - * for reason reason at time now. */ -void -geoip_note_ns_response(geoip_ns_response_t response) -{ - static int arrays_initialized = 0; - if (!get_options()->DirReqStatistics) - return; - if (!arrays_initialized) { - memset(ns_v3_responses, 0, sizeof(ns_v3_responses)); - arrays_initialized = 1; - } - tor_assert(response < GEOIP_NS_RESPONSE_NUM); - ns_v3_responses[response]++; -} - -/** Do not mention any country from which fewer than this number of IPs have - * connected. This conceivably avoids reporting information that could - * deanonymize users, though analysis is lacking. */ -#define MIN_IPS_TO_NOTE_COUNTRY 1 -/** Do not report any geoip data at all if we have fewer than this number of - * IPs to report about. */ -#define MIN_IPS_TO_NOTE_ANYTHING 1 -/** When reporting geoip data about countries, round up to the nearest - * multiple of this value. */ -#define IP_GRANULARITY 8 - -/** Helper type: used to sort per-country totals by value. */ -typedef struct c_hist_t { - char country[3]; /**< Two-letter country code. */ - unsigned total; /**< Total IP addresses seen in this country. */ -} c_hist_t; - -/** Sorting helper: return -1, 1, or 0 based on comparison of two - * geoip_ipv4_entry_t. Sort in descending order of total, and then by country - * code. */ -static int -c_hist_compare_(const void **_a, const void **_b) -{ - const c_hist_t *a = *_a, *b = *_b; - if (a->total > b->total) - return -1; - else if (a->total < b->total) - return 1; - else - return strcmp(a->country, b->country); -} - -/** When there are incomplete directory requests at the end of a 24-hour - * period, consider those requests running for longer than this timeout as - * failed, the others as still running. */ -#define DIRREQ_TIMEOUT (10*60) - -/** Entry in a map from either chan->global_identifier for direct requests - * or a unique circuit identifier for tunneled requests to request time, - * response size, and completion time of a network status request. Used to - * measure download times of requests to derive average client - * bandwidths. */ -typedef struct dirreq_map_entry_t { - HT_ENTRY(dirreq_map_entry_t) node; - /** Unique identifier for this network status request; this is either the - * chan->global_identifier of the dir channel (direct request) or a new - * locally unique identifier of a circuit (tunneled request). This ID is - * only unique among other direct or tunneled requests, respectively. */ - uint64_t dirreq_id; - unsigned int state:3; /**< State of this directory request. */ - unsigned int type:1; /**< Is this a direct or a tunneled request? */ - unsigned int completed:1; /**< Is this request complete? */ - /** When did we receive the request and started sending the response? */ - struct timeval request_time; - size_t response_size; /**< What is the size of the response in bytes? */ - struct timeval completion_time; /**< When did the request succeed? */ -} dirreq_map_entry_t; - -/** Map of all directory requests asking for v2 or v3 network statuses in - * the current geoip-stats interval. Values are - * of type *dirreq_map_entry_t. */ -static HT_HEAD(dirreqmap, dirreq_map_entry_t) dirreq_map = - HT_INITIALIZER(); - -static int -dirreq_map_ent_eq(const dirreq_map_entry_t *a, - const dirreq_map_entry_t *b) -{ - return a->dirreq_id == b->dirreq_id && a->type == b->type; -} - -/* DOCDOC dirreq_map_ent_hash */ -static unsigned -dirreq_map_ent_hash(const dirreq_map_entry_t *entry) -{ - unsigned u = (unsigned) entry->dirreq_id; - u += entry->type << 20; - return u; -} - -HT_PROTOTYPE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, - dirreq_map_ent_eq); -HT_GENERATE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash, - dirreq_map_ent_eq, 0.6, malloc, realloc, free); - -/** Helper: Put entry into map of directory requests using - * type and dirreq_id as key parts. If there is - * already an entry for that key, print out a BUG warning and return. */ -static void -dirreq_map_put_(dirreq_map_entry_t *entry, dirreq_type_t type, - uint64_t dirreq_id) -{ - dirreq_map_entry_t *old_ent; - tor_assert(entry->type == type); - tor_assert(entry->dirreq_id == dirreq_id); - - /* XXXX we could switch this to HT_INSERT some time, since it seems that - * this bug doesn't happen. But since this function doesn't seem to be - * critical-path, it's sane to leave it alone. */ - old_ent = HT_REPLACE(dirreqmap, &dirreq_map, entry); - if (old_ent && old_ent != entry) { - log_warn(LD_BUG, "Error when putting directory request into local " - "map. There was already an entry for the same identifier."); - return; - } -} - -/** Helper: Look up and return an entry in the map of directory requests - * using type and dirreq_id as key parts. If there - * is no such entry, return NULL. */ -static dirreq_map_entry_t * -dirreq_map_get_(dirreq_type_t type, uint64_t dirreq_id) -{ - dirreq_map_entry_t lookup; - lookup.type = type; - lookup.dirreq_id = dirreq_id; - return HT_FIND(dirreqmap, &dirreq_map, &lookup); -} - -/** Note that an either direct or tunneled (see type) directory - * request for a v3 network status with unique ID dirreq_id of size - * response_size has started. */ -void -geoip_start_dirreq(uint64_t dirreq_id, size_t response_size, - dirreq_type_t type) -{ - dirreq_map_entry_t *ent; - if (!get_options()->DirReqStatistics) - return; - ent = tor_malloc_zero(sizeof(dirreq_map_entry_t)); - ent->dirreq_id = dirreq_id; - tor_gettimeofday(&ent->request_time); - ent->response_size = response_size; - ent->type = type; - dirreq_map_put_(ent, type, dirreq_id); -} - -/** Change the state of the either direct or tunneled (see type) - * directory request with dirreq_id to new_state and - * possibly mark it as completed. If no entry can be found for the given - * key parts (e.g., if this is a directory request that we are not - * measuring, or one that was started in the previous measurement period), - * or if the state cannot be advanced to new_state, do nothing. */ -void -geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type, - dirreq_state_t new_state) -{ - dirreq_map_entry_t *ent; - if (!get_options()->DirReqStatistics) - return; - ent = dirreq_map_get_(type, dirreq_id); - if (!ent) - return; - if (new_state == DIRREQ_IS_FOR_NETWORK_STATUS) - return; - if (new_state - 1 != ent->state) - return; - ent->state = new_state; - if ((type == DIRREQ_DIRECT && - new_state == DIRREQ_FLUSHING_DIR_CONN_FINISHED) || - (type == DIRREQ_TUNNELED && - new_state == DIRREQ_CHANNEL_BUFFER_FLUSHED)) { - tor_gettimeofday(&ent->completion_time); - ent->completed = 1; - } -} - -/** Return the bridge-ip-transports string that should be inserted in - * our extra-info descriptor. Return NULL if the bridge-ip-transports - * line should be empty. */ -char * -geoip_get_transport_history(void) -{ - unsigned granularity = IP_GRANULARITY; - /** String hash table -> . */ - strmap_t *transport_counts = strmap_new(); - - /** Smartlist that contains copies of the names of the transports - that have been used. */ - smartlist_t *transports_used = smartlist_new(); - - /* Special string to signify that no transport was used for this - connection. Pluggable transport names can't have symbols in their - names, so this string will never collide with a real transport. */ - static const char* no_transport_str = ""; - - clientmap_entry_t **ent; - const char *transport_name = NULL; - smartlist_t *string_chunks = smartlist_new(); - char *the_string = NULL; - - /* If we haven't seen any clients yet, return NULL. */ - if (HT_EMPTY(&client_history)) - goto done; - - /** We do the following steps to form the transport history string: - * a) Foreach client that uses a pluggable transport, we increase the - * times that transport was used by one. If the client did not use - * a transport, we increase the number of times someone connected - * without obfuscation. - * b) Foreach transport we observed, we write its transport history - * string and push it to string_chunks. So, for example, if we've - * seen 665 obfs2 clients, we write "obfs2=665". - * c) We concatenate string_chunks to form the final string. - */ - - log_debug(LD_GENERAL,"Starting iteration for transport history. %d clients.", - HT_SIZE(&client_history)); - - /* Loop through all clients. */ - HT_FOREACH(ent, clientmap, &client_history) { - uintptr_t val; - void *ptr; - transport_name = (*ent)->transport_name; - if (!transport_name) - transport_name = no_transport_str; - - /* Increase the count for this transport name. */ - ptr = strmap_get(transport_counts, transport_name); - val = (uintptr_t)ptr; - val++; - ptr = (void*)val; - strmap_set(transport_counts, transport_name, ptr); - - /* If it's the first time we see this transport, note it. */ - if (val == 1) - smartlist_add(transports_used, tor_strdup(transport_name)); - - log_debug(LD_GENERAL, "Client from '%s' with transport '%s'. " - "I've now seen %d clients.", - safe_str_client(fmt_addr(&(*ent)->addr)), - transport_name ? transport_name : "", - (int)val); - } - - /* Sort the transport names (helps with unit testing). */ - smartlist_sort_strings(transports_used); - - /* Loop through all seen transports. */ - SMARTLIST_FOREACH_BEGIN(transports_used, const char *, transport_name) { - void *transport_count_ptr = strmap_get(transport_counts, transport_name); - uintptr_t transport_count = (uintptr_t) transport_count_ptr; - - log_debug(LD_GENERAL, "We got "U64_FORMAT" clients with transport '%s'.", - U64_PRINTF_ARG((uint64_t)transport_count), transport_name); - - smartlist_add_asprintf(string_chunks, "%s="U64_FORMAT, - transport_name, - U64_PRINTF_ARG(round_uint64_to_next_multiple_of( - (uint64_t)transport_count, - granularity))); - } SMARTLIST_FOREACH_END(transport_name); - - the_string = smartlist_join_strings(string_chunks, ",", 0, NULL); - - log_debug(LD_GENERAL, "Final bridge-ip-transports string: '%s'", the_string); - - done: - strmap_free(transport_counts, NULL); - SMARTLIST_FOREACH(transports_used, char *, s, tor_free(s)); - smartlist_free(transports_used); - SMARTLIST_FOREACH(string_chunks, char *, s, tor_free(s)); - smartlist_free(string_chunks); - - return the_string; -} - -/** Return a newly allocated comma-separated string containing statistics - * on network status downloads. The string contains the number of completed - * requests, timeouts, and still running requests as well as the download - * times by deciles and quartiles. Return NULL if we have not observed - * requests for long enough. */ -static char * -geoip_get_dirreq_history(dirreq_type_t type) -{ - char *result = NULL; - smartlist_t *dirreq_completed = NULL; - uint32_t complete = 0, timeouts = 0, running = 0; - int bufsize = 1024, written; - dirreq_map_entry_t **ptr, **next, *ent; - struct timeval now; - - tor_gettimeofday(&now); - dirreq_completed = smartlist_new(); - for (ptr = HT_START(dirreqmap, &dirreq_map); ptr; ptr = next) { - ent = *ptr; - if (ent->type != type) { - next = HT_NEXT(dirreqmap, &dirreq_map, ptr); - continue; - } else { - if (ent->completed) { - smartlist_add(dirreq_completed, ent); - complete++; - next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ptr); - } else { - if (tv_mdiff(&ent->request_time, &now) / 1000 > DIRREQ_TIMEOUT) - timeouts++; - else - running++; - next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ptr); - tor_free(ent); - } - } - } -#define DIR_REQ_GRANULARITY 4 - complete = round_uint32_to_next_multiple_of(complete, - DIR_REQ_GRANULARITY); - timeouts = round_uint32_to_next_multiple_of(timeouts, - DIR_REQ_GRANULARITY); - running = round_uint32_to_next_multiple_of(running, - DIR_REQ_GRANULARITY); - result = tor_malloc_zero(bufsize); - written = tor_snprintf(result, bufsize, "complete=%u,timeout=%u," - "running=%u", complete, timeouts, running); - if (written < 0) { - tor_free(result); - goto done; - } - -#define MIN_DIR_REQ_RESPONSES 16 - if (complete >= MIN_DIR_REQ_RESPONSES) { - uint32_t *dltimes; - /* We may have rounded 'completed' up. Here we want to use the - * real value. */ - complete = smartlist_len(dirreq_completed); - dltimes = tor_malloc_zero(sizeof(uint32_t) * complete); - SMARTLIST_FOREACH_BEGIN(dirreq_completed, dirreq_map_entry_t *, ent) { - uint32_t bytes_per_second; - uint32_t time_diff = (uint32_t) tv_mdiff(&ent->request_time, - &ent->completion_time); - if (time_diff == 0) - time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible - * by law of nature or something, but a milisecond - * is a bit greater than "instantly" */ - bytes_per_second = (uint32_t)(1000 * ent->response_size / time_diff); - dltimes[ent_sl_idx] = bytes_per_second; - } SMARTLIST_FOREACH_END(ent); - median_uint32(dltimes, complete); /* sorts as a side effect. */ - written = tor_snprintf(result + written, bufsize - written, - ",min=%u,d1=%u,d2=%u,q1=%u,d3=%u,d4=%u,md=%u," - "d6=%u,d7=%u,q3=%u,d8=%u,d9=%u,max=%u", - dltimes[0], - dltimes[1*complete/10-1], - dltimes[2*complete/10-1], - dltimes[1*complete/4-1], - dltimes[3*complete/10-1], - dltimes[4*complete/10-1], - dltimes[5*complete/10-1], - dltimes[6*complete/10-1], - dltimes[7*complete/10-1], - dltimes[3*complete/4-1], - dltimes[8*complete/10-1], - dltimes[9*complete/10-1], - dltimes[complete-1]); - if (written<0) - tor_free(result); - tor_free(dltimes); - } - done: - SMARTLIST_FOREACH(dirreq_completed, dirreq_map_entry_t *, ent, - tor_free(ent)); - smartlist_free(dirreq_completed); - return result; -} - -/** Store a newly allocated comma-separated string in - * *country_str containing entries for all the countries from - * which we've seen enough clients connect as a bridge, directory - * server, or entry guard. The entry format is cc=num where num is the - * number of IPs we've seen connecting from that country, and cc is a - * lowercased country code. *country_str is set to NULL if - * we're not ready to export per country data yet. - * - * Store a newly allocated comma-separated string in ipver_str - * containing entries for clients connecting over IPv4 and IPv6. The - * format is family=num where num is the nubmer of IPs we've seen - * connecting over that protocol family, and family is 'v4' or 'v6'. - * - * Return 0 on success and -1 if we're missing geoip data. */ -int -geoip_get_client_history(geoip_client_action_t action, - char **country_str, char **ipver_str) -{ - unsigned granularity = IP_GRANULARITY; - smartlist_t *entries = NULL; - int n_countries = geoip_get_n_countries(); - int i; - clientmap_entry_t **ent; - unsigned *counts = NULL; - unsigned total = 0; - unsigned ipv4_count = 0, ipv6_count = 0; - - if (!geoip_is_loaded(AF_INET) && !geoip_is_loaded(AF_INET6)) - return -1; - - counts = tor_malloc_zero(sizeof(unsigned)*n_countries); - HT_FOREACH(ent, clientmap, &client_history) { - int country; - if ((*ent)->action != (int)action) - continue; - country = geoip_get_country_by_addr(&(*ent)->addr); - if (country < 0) - country = 0; /** unresolved requests are stored at index 0. */ - tor_assert(0 <= country && country < n_countries); - ++counts[country]; - ++total; - switch (tor_addr_family(&(*ent)->addr)) { - case AF_INET: - ipv4_count++; - break; - case AF_INET6: - ipv6_count++; - break; - } - } - if (ipver_str) { - smartlist_t *chunks = smartlist_new(); - smartlist_add_asprintf(chunks, "v4=%u", - round_to_next_multiple_of(ipv4_count, granularity)); - smartlist_add_asprintf(chunks, "v6=%u", - round_to_next_multiple_of(ipv6_count, granularity)); - *ipver_str = smartlist_join_strings(chunks, ",", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); - smartlist_free(chunks); - } - - /* Don't record per country data if we haven't seen enough IPs. */ - if (total < MIN_IPS_TO_NOTE_ANYTHING) { - tor_free(counts); - if (country_str) - *country_str = NULL; - return 0; - } - - /* Make a list of c_hist_t */ - entries = smartlist_new(); - for (i = 0; i < n_countries; ++i) { - unsigned c = counts[i]; - const char *countrycode; - c_hist_t *ent; - /* Only report a country if it has a minimum number of IPs. */ - if (c >= MIN_IPS_TO_NOTE_COUNTRY) { - c = round_to_next_multiple_of(c, granularity); - countrycode = geoip_get_country_name(i); - ent = tor_malloc(sizeof(c_hist_t)); - strlcpy(ent->country, countrycode, sizeof(ent->country)); - ent->total = c; - smartlist_add(entries, ent); - } - } - /* Sort entries. Note that we must do this _AFTER_ rounding, or else - * the sort order could leak info. */ - smartlist_sort(entries, c_hist_compare_); - - if (country_str) { - smartlist_t *chunks = smartlist_new(); - SMARTLIST_FOREACH(entries, c_hist_t *, ch, { - smartlist_add_asprintf(chunks, "%s=%u", ch->country, ch->total); - }); - *country_str = smartlist_join_strings(chunks, ",", 0, NULL); - SMARTLIST_FOREACH(chunks, char *, c, tor_free(c)); - smartlist_free(chunks); - } - - SMARTLIST_FOREACH(entries, c_hist_t *, c, tor_free(c)); - smartlist_free(entries); - tor_free(counts); - - return 0; -} - -/** Return a newly allocated string holding the per-country request history - * for v3 network statuses in a format suitable for an extra-info document, - * or NULL on failure. */ -char * -geoip_get_request_history(void) -{ - smartlist_t *entries, *strings; - char *result; - unsigned granularity = IP_GRANULARITY; - - if (!geoip_countries) - return NULL; - - entries = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(geoip_countries, geoip_country_t *, c) { - uint32_t tot = 0; - c_hist_t *ent; - tot = c->n_v3_ns_requests; - if (!tot) - continue; - ent = tor_malloc_zero(sizeof(c_hist_t)); - strlcpy(ent->country, c->countrycode, sizeof(ent->country)); - ent->total = round_to_next_multiple_of(tot, granularity); - smartlist_add(entries, ent); - } SMARTLIST_FOREACH_END(c); - smartlist_sort(entries, c_hist_compare_); - - strings = smartlist_new(); - SMARTLIST_FOREACH(entries, c_hist_t *, ent, { - smartlist_add_asprintf(strings, "%s=%u", ent->country, ent->total); - }); - result = smartlist_join_strings(strings, ",", 0, NULL); - SMARTLIST_FOREACH(strings, char *, cp, tor_free(cp)); - SMARTLIST_FOREACH(entries, c_hist_t *, ent, tor_free(ent)); - smartlist_free(strings); - smartlist_free(entries); - return result; -} - -/** Start time of directory request stats or 0 if we're not collecting - * directory request statistics. */ -static time_t start_of_dirreq_stats_interval; - -/** Initialize directory request stats. */ -void -geoip_dirreq_stats_init(time_t now) -{ - start_of_dirreq_stats_interval = now; -} - -/** Reset counters for dirreq stats. */ -void -geoip_reset_dirreq_stats(time_t now) -{ - SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { - c->n_v3_ns_requests = 0; - }); - { - clientmap_entry_t **ent, **next, *this; - for (ent = HT_START(clientmap, &client_history); ent != NULL; - ent = next) { - if ((*ent)->action == GEOIP_CLIENT_NETWORKSTATUS) { - this = *ent; - next = HT_NEXT_RMV(clientmap, &client_history, ent); - clientmap_entry_free(this); - } else { - next = HT_NEXT(clientmap, &client_history, ent); - } - } - } - memset(ns_v3_responses, 0, sizeof(ns_v3_responses)); - { - dirreq_map_entry_t **ent, **next, *this; - for (ent = HT_START(dirreqmap, &dirreq_map); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ent); - tor_free(this); - } - } - start_of_dirreq_stats_interval = now; -} - -/** Stop collecting directory request stats in a way that we can re-start - * doing so in geoip_dirreq_stats_init(). */ -void -geoip_dirreq_stats_term(void) -{ - geoip_reset_dirreq_stats(0); -} - -/** Return a newly allocated string containing the dirreq statistics - * until now, or NULL if we're not collecting dirreq stats. Caller - * must ensure start_of_dirreq_stats_interval is in the past. */ -char * -geoip_format_dirreq_stats(time_t now) -{ - char t[ISO_TIME_LEN+1]; - int i; - char *v3_ips_string, *v3_reqs_string, *v3_direct_dl_string, - *v3_tunneled_dl_string; - char *result; - - if (!start_of_dirreq_stats_interval) - return NULL; /* Not initialized. */ - - tor_assert(now >= start_of_dirreq_stats_interval); - - format_iso_time(t, now); - geoip_get_client_history(GEOIP_CLIENT_NETWORKSTATUS, &v3_ips_string, NULL); - v3_reqs_string = geoip_get_request_history(); - -#define RESPONSE_GRANULARITY 8 - for (i = 0; i < GEOIP_NS_RESPONSE_NUM; i++) { - ns_v3_responses[i] = round_uint32_to_next_multiple_of( - ns_v3_responses[i], RESPONSE_GRANULARITY); - } -#undef RESPONSE_GRANULARITY - - v3_direct_dl_string = geoip_get_dirreq_history(DIRREQ_DIRECT); - v3_tunneled_dl_string = geoip_get_dirreq_history(DIRREQ_TUNNELED); - - /* Put everything together into a single string. */ - tor_asprintf(&result, "dirreq-stats-end %s (%d s)\n" - "dirreq-v3-ips %s\n" - "dirreq-v3-reqs %s\n" - "dirreq-v3-resp ok=%u,not-enough-sigs=%u,unavailable=%u," - "not-found=%u,not-modified=%u,busy=%u\n" - "dirreq-v3-direct-dl %s\n" - "dirreq-v3-tunneled-dl %s\n", - t, - (unsigned) (now - start_of_dirreq_stats_interval), - v3_ips_string ? v3_ips_string : "", - v3_reqs_string ? v3_reqs_string : "", - ns_v3_responses[GEOIP_SUCCESS], - ns_v3_responses[GEOIP_REJECT_NOT_ENOUGH_SIGS], - ns_v3_responses[GEOIP_REJECT_UNAVAILABLE], - ns_v3_responses[GEOIP_REJECT_NOT_FOUND], - ns_v3_responses[GEOIP_REJECT_NOT_MODIFIED], - ns_v3_responses[GEOIP_REJECT_BUSY], - v3_direct_dl_string ? v3_direct_dl_string : "", - v3_tunneled_dl_string ? v3_tunneled_dl_string : ""); - - /* Free partial strings. */ - tor_free(v3_ips_string); - tor_free(v3_reqs_string); - tor_free(v3_direct_dl_string); - tor_free(v3_tunneled_dl_string); - - return result; -} - -/** If 24 hours have passed since the beginning of the current dirreq - * stats period, write dirreq stats to $DATADIR/stats/dirreq-stats - * (possibly overwriting an existing file) and reset counters. Return - * when we would next want to write dirreq stats or 0 if we never want to - * write. */ -time_t -geoip_dirreq_stats_write(time_t now) -{ - char *str = NULL; - - if (!start_of_dirreq_stats_interval) - return 0; /* Not initialized. */ - if (start_of_dirreq_stats_interval + WRITE_STATS_INTERVAL > now) - goto done; /* Not ready to write. */ - - /* Discard all items in the client history that are too old. */ - geoip_remove_old_clients(start_of_dirreq_stats_interval); - - /* Generate history string .*/ - str = geoip_format_dirreq_stats(now); - - /* Write dirreq-stats string to disk. */ - if (!check_or_create_data_subdir("stats")) { - write_to_data_subdir("stats", "dirreq-stats", str, "dirreq statistics"); - /* Reset measurement interval start. */ - geoip_reset_dirreq_stats(now); - } - - done: - tor_free(str); - return start_of_dirreq_stats_interval + WRITE_STATS_INTERVAL; -} - -/** Start time of bridge stats or 0 if we're not collecting bridge - * statistics. */ -static time_t start_of_bridge_stats_interval; - -/** Initialize bridge stats. */ -void -geoip_bridge_stats_init(time_t now) -{ - start_of_bridge_stats_interval = now; -} - -/** Stop collecting bridge stats in a way that we can re-start doing so in - * geoip_bridge_stats_init(). */ -void -geoip_bridge_stats_term(void) -{ - client_history_clear(); - start_of_bridge_stats_interval = 0; -} - -/** Validate a bridge statistics string as it would be written to a - * current extra-info descriptor. Return 1 if the string is valid and - * recent enough, or 0 otherwise. */ -static int -validate_bridge_stats(const char *stats_str, time_t now) -{ - char stats_end_str[ISO_TIME_LEN+1], stats_start_str[ISO_TIME_LEN+1], - *eos; - - const char *BRIDGE_STATS_END = "bridge-stats-end "; - const char *BRIDGE_IPS = "bridge-ips "; - const char *BRIDGE_IPS_EMPTY_LINE = "bridge-ips\n"; - const char *BRIDGE_TRANSPORTS = "bridge-ip-transports "; - const char *BRIDGE_TRANSPORTS_EMPTY_LINE = "bridge-ip-transports\n"; - const char *tmp; - time_t stats_end_time; - int seconds; - tor_assert(stats_str); - - /* Parse timestamp and number of seconds from - "bridge-stats-end YYYY-MM-DD HH:MM:SS (N s)" */ - tmp = find_str_at_start_of_line(stats_str, BRIDGE_STATS_END); - if (!tmp) - return 0; - tmp += strlen(BRIDGE_STATS_END); - - if (strlen(tmp) < ISO_TIME_LEN + 6) - return 0; - strlcpy(stats_end_str, tmp, sizeof(stats_end_str)); - if (parse_iso_time(stats_end_str, &stats_end_time) < 0) - return 0; - if (stats_end_time < now - (25*60*60) || - stats_end_time > now + (1*60*60)) - return 0; - seconds = (int)strtol(tmp + ISO_TIME_LEN + 2, &eos, 10); - if (!eos || seconds < 23*60*60) - return 0; - format_iso_time(stats_start_str, stats_end_time - seconds); - - /* Parse: "bridge-ips CC=N,CC=N,..." */ - tmp = find_str_at_start_of_line(stats_str, BRIDGE_IPS); - if (!tmp) { - /* Look if there is an empty "bridge-ips" line */ - tmp = find_str_at_start_of_line(stats_str, BRIDGE_IPS_EMPTY_LINE); - if (!tmp) - return 0; - } - - /* Parse: "bridge-ip-transports PT=N,PT=N,..." */ - tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS); - if (!tmp) { - /* Look if there is an empty "bridge-ip-transports" line */ - tmp = find_str_at_start_of_line(stats_str, BRIDGE_TRANSPORTS_EMPTY_LINE); - if (!tmp) - return 0; - } - - return 1; -} - -/** Most recent bridge statistics formatted to be written to extra-info - * descriptors. */ -static char *bridge_stats_extrainfo = NULL; - -/** Return a newly allocated string holding our bridge usage stats by country - * in a format suitable for inclusion in an extrainfo document. Return NULL on - * failure. */ -char * -geoip_format_bridge_stats(time_t now) -{ - char *out = NULL; - char *country_data = NULL, *ipver_data = NULL, *transport_data = NULL; - long duration = now - start_of_bridge_stats_interval; - char written[ISO_TIME_LEN+1]; - - if (duration < 0) - return NULL; - if (!start_of_bridge_stats_interval) - return NULL; /* Not initialized. */ - - format_iso_time(written, now); - geoip_get_client_history(GEOIP_CLIENT_CONNECT, &country_data, &ipver_data); - transport_data = geoip_get_transport_history(); - - tor_asprintf(&out, - "bridge-stats-end %s (%ld s)\n" - "bridge-ips %s\n" - "bridge-ip-versions %s\n" - "bridge-ip-transports %s\n", - written, duration, - country_data ? country_data : "", - ipver_data ? ipver_data : "", - transport_data ? transport_data : ""); - tor_free(country_data); - tor_free(ipver_data); - tor_free(transport_data); - - return out; -} - -/** Return a newly allocated string holding our bridge usage stats by country - * in a format suitable for the answer to a controller request. Return NULL on - * failure. */ -static char * -format_bridge_stats_controller(time_t now) -{ - char *out = NULL, *country_data = NULL, *ipver_data = NULL; - char started[ISO_TIME_LEN+1]; - (void) now; - - format_iso_time(started, start_of_bridge_stats_interval); - geoip_get_client_history(GEOIP_CLIENT_CONNECT, &country_data, &ipver_data); - - tor_asprintf(&out, - "TimeStarted=\"%s\" CountrySummary=%s IPVersions=%s", - started, - country_data ? country_data : "", - ipver_data ? ipver_data : ""); - tor_free(country_data); - tor_free(ipver_data); - return out; -} - -/** Write bridge statistics to $DATADIR/stats/bridge-stats and return - * when we should next try to write statistics. */ -time_t -geoip_bridge_stats_write(time_t now) -{ - char *val = NULL; - - /* Check if 24 hours have passed since starting measurements. */ - if (now < start_of_bridge_stats_interval + WRITE_STATS_INTERVAL) - return start_of_bridge_stats_interval + WRITE_STATS_INTERVAL; - - /* Discard all items in the client history that are too old. */ - geoip_remove_old_clients(start_of_bridge_stats_interval); - - /* Generate formatted string */ - val = geoip_format_bridge_stats(now); - if (val == NULL) - goto done; - - /* Update the stored value. */ - tor_free(bridge_stats_extrainfo); - bridge_stats_extrainfo = val; - start_of_bridge_stats_interval = now; - - /* Write it to disk. */ - if (!check_or_create_data_subdir("stats")) { - write_to_data_subdir("stats", "bridge-stats", - bridge_stats_extrainfo, "bridge statistics"); - - /* Tell the controller, "hey, there are clients!" */ - { - char *controller_str = format_bridge_stats_controller(now); - if (controller_str) - control_event_clients_seen(controller_str); - tor_free(controller_str); - } - } - - done: - return start_of_bridge_stats_interval + WRITE_STATS_INTERVAL; -} - -/** Try to load the most recent bridge statistics from disk, unless we - * have finished a measurement interval lately, and check whether they - * are still recent enough. */ -static void -load_bridge_stats(time_t now) -{ - char *fname, *contents; - if (bridge_stats_extrainfo) - return; - - fname = get_datadir_fname2("stats", "bridge-stats"); - contents = read_file_to_str(fname, RFTS_IGNORE_MISSING, NULL); - if (contents && validate_bridge_stats(contents, now)) { - bridge_stats_extrainfo = contents; - } else { - tor_free(contents); - } - - tor_free(fname); -} - -/** Return most recent bridge statistics for inclusion in extra-info - * descriptors, or NULL if we don't have recent bridge statistics. */ -const char * -geoip_get_bridge_stats_extrainfo(time_t now) -{ - load_bridge_stats(now); - return bridge_stats_extrainfo; -} - -/** Return a new string containing the recent bridge statistics to be returned - * to controller clients, or NULL if we don't have any bridge statistics. */ -char * -geoip_get_bridge_stats_controller(time_t now) -{ - return format_bridge_stats_controller(now); -} - -/** Start time of entry stats or 0 if we're not collecting entry - * statistics. */ -static time_t start_of_entry_stats_interval; - -/** Initialize entry stats. */ -void -geoip_entry_stats_init(time_t now) -{ - start_of_entry_stats_interval = now; -} - -/** Reset counters for entry stats. */ -void -geoip_reset_entry_stats(time_t now) -{ - client_history_clear(); - start_of_entry_stats_interval = now; -} - -/** Stop collecting entry stats in a way that we can re-start doing so in - * geoip_entry_stats_init(). */ -void -geoip_entry_stats_term(void) -{ - geoip_reset_entry_stats(0); -} - -/** Return a newly allocated string containing the entry statistics - * until now, or NULL if we're not collecting entry stats. Caller - * must ensure start_of_entry_stats_interval lies in the past. */ -char * -geoip_format_entry_stats(time_t now) -{ - char t[ISO_TIME_LEN+1]; - char *data = NULL; - char *result; - - if (!start_of_entry_stats_interval) - return NULL; /* Not initialized. */ - - tor_assert(now >= start_of_entry_stats_interval); - - geoip_get_client_history(GEOIP_CLIENT_CONNECT, &data, NULL); - format_iso_time(t, now); - tor_asprintf(&result, - "entry-stats-end %s (%u s)\n" - "entry-ips %s\n", - t, (unsigned) (now - start_of_entry_stats_interval), - data ? data : ""); - tor_free(data); - return result; -} - -/** If 24 hours have passed since the beginning of the current entry stats - * period, write entry stats to $DATADIR/stats/entry-stats (possibly - * overwriting an existing file) and reset counters. Return when we would - * next want to write entry stats or 0 if we never want to write. */ -time_t -geoip_entry_stats_write(time_t now) -{ - char *str = NULL; - - if (!start_of_entry_stats_interval) - return 0; /* Not initialized. */ - if (start_of_entry_stats_interval + WRITE_STATS_INTERVAL > now) - goto done; /* Not ready to write. */ - - /* Discard all items in the client history that are too old. */ - geoip_remove_old_clients(start_of_entry_stats_interval); - - /* Generate history string .*/ - str = geoip_format_entry_stats(now); - - /* Write entry-stats string to disk. */ - if (!check_or_create_data_subdir("stats")) { - write_to_data_subdir("stats", "entry-stats", str, "entry statistics"); - - /* Reset measurement interval start. */ - geoip_reset_entry_stats(now); - } - - done: - tor_free(str); - return start_of_entry_stats_interval + WRITE_STATS_INTERVAL; -} - -/** Helper used to implement GETINFO ip-to-country/... controller command. */ -int -getinfo_helper_geoip(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg) -{ - (void)control_conn; - if (!strcmpstart(question, "ip-to-country/")) { - int c; - sa_family_t family; - tor_addr_t addr; - question += strlen("ip-to-country/"); - family = tor_addr_parse(&addr, question); - if (family != AF_INET && family != AF_INET6) { - *errmsg = "Invalid address family"; - return -1; - } - if (!geoip_is_loaded(family)) { - *errmsg = "GeoIP data not loaded"; - return -1; - } - if (family == AF_INET) - c = geoip_get_country_by_ipv4(tor_addr_to_ipv4h(&addr)); - else /* AF_INET6 */ - c = geoip_get_country_by_ipv6(tor_addr_to_in6(&addr)); - *answer = tor_strdup(geoip_get_country_name(c)); - } - return 0; -} - -/** Release all storage held by the GeoIP databases and country list. */ -static void -clear_geoip_db(void) -{ - if (geoip_countries) { - SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, tor_free(c)); - smartlist_free(geoip_countries); - } - - strmap_free(country_idxplus1_by_lc_code, NULL); - if (geoip_ipv4_entries) { - SMARTLIST_FOREACH(geoip_ipv4_entries, geoip_ipv4_entry_t *, ent, - tor_free(ent)); - smartlist_free(geoip_ipv4_entries); - } - if (geoip_ipv6_entries) { - SMARTLIST_FOREACH(geoip_ipv6_entries, geoip_ipv6_entry_t *, ent, - tor_free(ent)); - smartlist_free(geoip_ipv6_entries); - } - geoip_countries = NULL; - country_idxplus1_by_lc_code = NULL; - geoip_ipv4_entries = NULL; - geoip_ipv6_entries = NULL; -} - -/** Release all storage held in this file. */ -void -geoip_free_all(void) -{ - { - clientmap_entry_t **ent, **next, *this; - for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(clientmap, &client_history, ent); - clientmap_entry_free(this); - } - HT_CLEAR(clientmap, &client_history); - } - { - dirreq_map_entry_t **ent, **next, *this; - for (ent = HT_START(dirreqmap, &dirreq_map); ent != NULL; ent = next) { - this = *ent; - next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ent); - tor_free(this); - } - HT_CLEAR(dirreqmap, &dirreq_map); - } - - clear_geoip_db(); - tor_free(bridge_stats_extrainfo); -} - diff --git a/src/tor/geoip.h b/src/tor/geoip.h deleted file mode 100644 index b9b53c300..000000000 --- a/src/tor/geoip.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file geoip.h - * \brief Header file for geoip.c. - **/ - -#ifndef TOR_GEOIP_H -#define TOR_GEOIP_H - -#include "testsupport.h" - -#ifdef GEOIP_PRIVATE -STATIC int geoip_parse_entry(const char *line, sa_family_t family); -STATIC int geoip_get_country_by_ipv4(uint32_t ipaddr); -STATIC int geoip_get_country_by_ipv6(const struct in6_addr *addr); -#endif -int should_record_bridge_info(const or_options_t *options); -int geoip_load_file(sa_family_t family, const char *filename); -int geoip_get_country_by_addr(const tor_addr_t *addr); -int geoip_get_n_countries(void); -const char *geoip_get_country_name(country_t num); -int geoip_is_loaded(sa_family_t family); -const char *geoip_db_digest(sa_family_t family); -country_t geoip_get_country(const char *countrycode); - -void geoip_note_client_seen(geoip_client_action_t action, - const tor_addr_t *addr, const char *transport_name, - time_t now); -void geoip_remove_old_clients(time_t cutoff); - -void geoip_note_ns_response(geoip_ns_response_t response); -char *geoip_get_transport_history(void); -int geoip_get_client_history(geoip_client_action_t action, - char **country_str, char **ipver_str); -char *geoip_get_request_history(void); -int getinfo_helper_geoip(control_connection_t *control_conn, - const char *question, char **answer, - const char **errmsg); -void geoip_free_all(void); - -void geoip_start_dirreq(uint64_t dirreq_id, size_t response_size, - dirreq_type_t type); -void geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type, - dirreq_state_t new_state); - -void geoip_dirreq_stats_init(time_t now); -void geoip_reset_dirreq_stats(time_t now); -char *geoip_format_dirreq_stats(time_t now); -time_t geoip_dirreq_stats_write(time_t now); -void geoip_dirreq_stats_term(void); -void geoip_entry_stats_init(time_t now); -time_t geoip_entry_stats_write(time_t now); -void geoip_entry_stats_term(void); -void geoip_reset_entry_stats(time_t now); -char *geoip_format_entry_stats(time_t now); -void geoip_bridge_stats_init(time_t now); -char *geoip_format_bridge_stats(time_t now); -time_t geoip_bridge_stats_write(time_t now); -void geoip_bridge_stats_term(void); -const char *geoip_get_bridge_stats_extrainfo(time_t); -char *geoip_get_bridge_stats_controller(time_t); - -#endif - diff --git a/src/tor/hibernate.c b/src/tor/hibernate.c deleted file mode 100644 index c234e4e6b..000000000 --- a/src/tor/hibernate.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hibernate.c - * \brief Functions to close listeners, stop allowing new circuits, - * etc in preparation for closing down or going dormant; and to track - * bandwidth and time intervals to know when to hibernate and when to - * stop hibernating. - **/ - -/* -hibernating, phase 1: - - send destroy in response to create cells - - send end (policy failed) in response to begin cells - - close an OR conn when it has no circuits - -hibernating, phase 2: - (entered when bandwidth hard limit reached) - - close all OR/AP/exit conns) -*/ - -#define HIBERNATE_PRIVATE -#include "or.h" -#include "channel.h" -#include "channeltls.h" -#include "config.h" -#include "connection.h" -#include "connection_edge.h" -#include "hibernate.h" -#include "onion_main.h" -#include "router.h" -#include "statefile.h" - -extern long stats_n_seconds_working; /* published uptime */ - -/** Are we currently awake, asleep, running out of bandwidth, or shutting - * down? */ -static hibernate_state_t hibernate_state = HIBERNATE_STATE_INITIAL; -/** If are hibernating, when do we plan to wake up? Set to 0 if we - * aren't hibernating. */ -static time_t hibernate_end_time = 0; -/** If we are shutting down, when do we plan finally exit? Set to 0 if - * we aren't shutting down. */ -static time_t shutdown_time = 0; - -/** Possible accounting periods. */ -typedef enum { - UNIT_MONTH=1, UNIT_WEEK=2, UNIT_DAY=3, -} time_unit_t; - -/* Fields for accounting logic. Accounting overview: - * - * Accounting is designed to ensure that no more than N bytes are sent in - * either direction over a given interval (currently, one month, one week, or - * one day) We could - * try to do this by choking our bandwidth to a trickle, but that - * would make our streams useless. Instead, we estimate what our - * bandwidth usage will be, and guess how long we'll be able to - * provide that much bandwidth before hitting our limit. We then - * choose a random time within the accounting interval to come up (so - * that we don't get 50 Tors running on the 1st of the month and none - * on the 30th). - * - * Each interval runs as follows: - * - * 1. We guess our bandwidth usage, based on how much we used - * last time. We choose a "wakeup time" within the interval to come up. - * 2. Until the chosen wakeup time, we hibernate. - * 3. We come up at the wakeup time, and provide bandwidth until we are - * "very close" to running out. - * 4. Then we go into low-bandwidth mode, and stop accepting new - * connections, but provide bandwidth until we run out. - * 5. Then we hibernate until the end of the interval. - * - * If the interval ends before we run out of bandwidth, we go back to - * step one. - */ - -/** How many bytes have we read in this accounting interval? */ -static uint64_t n_bytes_read_in_interval = 0; -/** How many bytes have we written in this accounting interval? */ -static uint64_t n_bytes_written_in_interval = 0; -/** How many seconds have we been running this interval? */ -static uint32_t n_seconds_active_in_interval = 0; -/** How many seconds were we active in this interval before we hit our soft - * limit? */ -static int n_seconds_to_hit_soft_limit = 0; -/** When in this interval was the soft limit hit. */ -static time_t soft_limit_hit_at = 0; -/** How many bytes had we read/written when we hit the soft limit? */ -static uint64_t n_bytes_at_soft_limit = 0; -/** When did this accounting interval start? */ -static time_t interval_start_time = 0; -/** When will this accounting interval end? */ -static time_t interval_end_time = 0; -/** How far into the accounting interval should we hibernate? */ -static time_t interval_wakeup_time = 0; -/** How much bandwidth do we 'expect' to use per minute? (0 if we have no - * info from the last period.) */ -static uint64_t expected_bandwidth_usage = 0; -/** What unit are we using for our accounting? */ -static time_unit_t cfg_unit = UNIT_MONTH; - -/** How many days,hours,minutes into each unit does our accounting interval - * start? */ -/** @{ */ -static int cfg_start_day = 0, - cfg_start_hour = 0, - cfg_start_min = 0; -/** @} */ - -static void reset_accounting(time_t now); -static int read_bandwidth_usage(void); -static time_t start_of_accounting_period_after(time_t now); -static time_t start_of_accounting_period_containing(time_t now); -static void accounting_set_wakeup_time(void); - -/* ************ - * Functions for bandwidth accounting. - * ************/ - -/** Configure accounting start/end time settings based on - * options->AccountingStart. Return 0 on success, -1 on failure. If - * validate_only is true, do not change the current settings. */ -int -accounting_parse_options(const or_options_t *options, int validate_only) -{ - time_unit_t unit; - int ok, idx; - long d,h,m; - smartlist_t *items; - const char *v = options->AccountingStart; - const char *s; - char *cp; - - if (!v) { - if (!validate_only) { - cfg_unit = UNIT_MONTH; - cfg_start_day = 1; - cfg_start_hour = 0; - cfg_start_min = 0; - } - return 0; - } - - items = smartlist_new(); - smartlist_split_string(items, v, NULL, - SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK,0); - if (smartlist_len(items)<2) { - log_warn(LD_CONFIG, "Too few arguments to AccountingStart"); - goto err; - } - s = smartlist_get(items,0); - if (0==strcasecmp(s, "month")) { - unit = UNIT_MONTH; - } else if (0==strcasecmp(s, "week")) { - unit = UNIT_WEEK; - } else if (0==strcasecmp(s, "day")) { - unit = UNIT_DAY; - } else { - log_warn(LD_CONFIG, - "Unrecognized accounting unit '%s': only 'month', 'week'," - " and 'day' are supported.", s); - goto err; - } - - switch (unit) { - case UNIT_WEEK: - d = tor_parse_long(smartlist_get(items,1), 10, 1, 7, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Weekly accounting must begin on a day between " - "1 (Monday) and 7 (Sunday)"); - goto err; - } - break; - case UNIT_MONTH: - d = tor_parse_long(smartlist_get(items,1), 10, 1, 28, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, "Monthly accounting must begin on a day between " - "1 and 28"); - goto err; - } - break; - case UNIT_DAY: - d = 0; - break; - /* Coverity dislikes unreachable default cases; some compilers warn on - * switch statements missing a case. Tell Coverity not to worry. */ - /* coverity[dead_error_begin] */ - default: - tor_assert(0); - } - - idx = unit==UNIT_DAY?1:2; - if (smartlist_len(items) != (idx+1)) { - log_warn(LD_CONFIG,"Accounting unit '%s' requires %d argument%s.", - s, idx, (idx>1)?"s":""); - goto err; - } - s = smartlist_get(items, idx); - h = tor_parse_long(s, 10, 0, 23, &ok, &cp); - if (!ok) { - log_warn(LD_CONFIG,"Accounting start time not parseable: bad hour."); - goto err; - } - if (!cp || *cp!=':') { - log_warn(LD_CONFIG, - "Accounting start time not parseable: not in HH:MM format"); - goto err; - } - m = tor_parse_long(cp+1, 10, 0, 59, &ok, &cp); - if (!ok) { - log_warn(LD_CONFIG, "Accounting start time not parseable: bad minute"); - goto err; - } - if (!cp || *cp!='\0') { - log_warn(LD_CONFIG, - "Accounting start time not parseable: not in HH:MM format"); - goto err; - } - - if (!validate_only) { - cfg_unit = unit; - cfg_start_day = (int)d; - cfg_start_hour = (int)h; - cfg_start_min = (int)m; - } - SMARTLIST_FOREACH(items, char *, item, tor_free(item)); - smartlist_free(items); - return 0; - err: - SMARTLIST_FOREACH(items, char *, item, tor_free(item)); - smartlist_free(items); - return -1; -} - -/** If we want to manage the accounting system and potentially - * hibernate, return 1, else return 0. - */ -int -accounting_is_enabled(const or_options_t *options) -{ - if (options->AccountingMax) - return 1; - return 0; -} - -/** If accounting is enabled, return how long (in seconds) this - * interval lasts. */ -int -accounting_get_interval_length(void) -{ - return (int)(interval_end_time - interval_start_time); -} - -/** Return the time at which the current accounting interval will end. */ -time_t -accounting_get_end_time(void) -{ - return interval_end_time; -} - -/** Called from onion_main.c to tell us that seconds seconds have - * passed, n_read bytes have been read, and n_written - * bytes have been written. */ -void -accounting_add_bytes(size_t n_read, size_t n_written, int seconds) -{ - n_bytes_read_in_interval += n_read; - n_bytes_written_in_interval += n_written; - /* If we haven't been called in 10 seconds, we're probably jumping - * around in time. */ - n_seconds_active_in_interval += (seconds < 10) ? seconds : 0; -} - -/** If get_end, return the end of the accounting period that contains - * the time now. Else, return the start of the accounting - * period that contains the time now */ -static time_t -edge_of_accounting_period_containing(time_t now, int get_end) -{ - int before; - struct tm tm; - tor_localtime_r(&now, &tm); - - /* Set 'before' to true iff the current time is before the hh:mm - * changeover time for today. */ - before = tm.tm_hour < cfg_start_hour || - (tm.tm_hour == cfg_start_hour && tm.tm_min < cfg_start_min); - - /* Dispatch by unit. First, find the start day of the given period; - * then, if get_end is true, increment to the end day. */ - switch (cfg_unit) - { - case UNIT_MONTH: { - /* If this is before the Nth, we want the Nth of last month. */ - if (tm.tm_mday < cfg_start_day || - (tm.tm_mday < cfg_start_day && before)) { - --tm.tm_mon; - } - /* Otherwise, the month is correct. */ - tm.tm_mday = cfg_start_day; - if (get_end) - ++tm.tm_mon; - break; - } - case UNIT_WEEK: { - /* What is the 'target' day of the week in struct tm format? (We - say Sunday==7; struct tm says Sunday==0.) */ - int wday = cfg_start_day % 7; - /* How many days do we subtract from today to get to the right day? */ - int delta = (7+tm.tm_wday-wday)%7; - /* If we are on the right day, but the changeover hasn't happened yet, - * then subtract a whole week. */ - if (delta == 0 && before) - delta = 7; - tm.tm_mday -= delta; - if (get_end) - tm.tm_mday += 7; - break; - } - case UNIT_DAY: - if (before) - --tm.tm_mday; - if (get_end) - ++tm.tm_mday; - break; - default: - tor_assert(0); - } - - tm.tm_hour = cfg_start_hour; - tm.tm_min = cfg_start_min; - tm.tm_sec = 0; - tm.tm_isdst = -1; /* Autodetect DST */ - return mktime(&tm); -} - -/** Return the start of the accounting period containing the time - * now. */ -static time_t -start_of_accounting_period_containing(time_t now) -{ - return edge_of_accounting_period_containing(now, 0); -} - -/** Return the start of the accounting period that comes after the one - * containing the time now. */ -static time_t -start_of_accounting_period_after(time_t now) -{ - return edge_of_accounting_period_containing(now, 1); -} - -/** Return the length of the accounting period containing the time - * now. */ -static long -length_of_accounting_period_containing(time_t now) -{ - return edge_of_accounting_period_containing(now, 1) - - edge_of_accounting_period_containing(now, 0); -} - -/** Initialize the accounting subsystem. */ -void -configure_accounting(time_t now) -{ - time_t s_now; - /* Try to remember our recorded usage. */ - if (!interval_start_time) - read_bandwidth_usage(); /* If we fail, we'll leave values at zero, and - * reset below.*/ - - s_now = start_of_accounting_period_containing(now); - - if (!interval_start_time) { - /* We didn't have recorded usage; Start a new interval. */ - log_info(LD_ACCT, "Starting new accounting interval."); - reset_accounting(now); - } else if (s_now == interval_start_time) { - log_info(LD_ACCT, "Continuing accounting interval."); - /* We are in the interval we thought we were in. Do nothing.*/ - interval_end_time = start_of_accounting_period_after(interval_start_time); - } else { - long duration = - length_of_accounting_period_containing(interval_start_time); - double delta = ((double)(s_now - interval_start_time)) / duration; - if (-0.50 <= delta && delta <= 0.50) { - /* The start of the period is now a little later or earlier than we - * remembered. That's fine; we might lose some bytes we could otherwise - * have written, but better to err on the side of obeying people's - * accounting settings. */ - log_info(LD_ACCT, "Accounting interval moved by %.02f%%; " - "that's fine.", delta*100); - interval_end_time = start_of_accounting_period_after(now); - } else if (delta >= 0.99) { - /* This is the regular time-moved-forward case; don't be too noisy - * about it or people will complain */ - log_info(LD_ACCT, "Accounting interval elapsed; starting a new one"); - reset_accounting(now); - } else { - log_warn(LD_ACCT, - "Mismatched accounting interval: moved by %.02f%%. " - "Starting a fresh one.", delta*100); - reset_accounting(now); - } - } - accounting_set_wakeup_time(); -} - -/** Set expected_bandwidth_usage based on how much we sent/received - * per minute last interval (if we were up for at least 30 minutes), - * or based on our declared bandwidth otherwise. */ -static void -update_expected_bandwidth(void) -{ - uint64_t expected; - const or_options_t *options= get_options(); - uint64_t max_configured = (options->RelayBandwidthRate > 0 ? - options->RelayBandwidthRate : - options->BandwidthRate) * 60; - -#define MIN_TIME_FOR_MEASUREMENT (1800) - - if (soft_limit_hit_at > interval_start_time && n_bytes_at_soft_limit && - (soft_limit_hit_at - interval_start_time) > MIN_TIME_FOR_MEASUREMENT) { - /* If we hit our soft limit last time, only count the bytes up to that - * time. This is a better predictor of our actual bandwidth than - * considering the entirety of the last interval, since we likely started - * using bytes very slowly once we hit our soft limit. */ - expected = n_bytes_at_soft_limit / - (soft_limit_hit_at - interval_start_time); - expected /= 60; - } else if (n_seconds_active_in_interval >= MIN_TIME_FOR_MEASUREMENT) { - /* Otherwise, we either measured enough time in the last interval but - * never hit our soft limit, or we're using a state file from a Tor that - * doesn't know to store soft-limit info. Just take rate at which - * we were reading/writing in the last interval as our expected rate. - */ - uint64_t used = MAX(n_bytes_written_in_interval, - n_bytes_read_in_interval); - expected = used / (n_seconds_active_in_interval / 60); - } else { - /* If we haven't gotten enough data last interval, set 'expected' - * to 0. This will set our wakeup to the start of the interval. - * Next interval, we'll choose our starting time based on how much - * we sent this interval. - */ - expected = 0; - } - if (expected > max_configured) - expected = max_configured; - expected_bandwidth_usage = expected; -} - -/** Called at the start of a new accounting interval: reset our - * expected bandwidth usage based on what happened last time, set up - * the start and end of the interval, and clear byte/time totals. - */ -static void -reset_accounting(time_t now) -{ - log_info(LD_ACCT, "Starting new accounting interval."); - update_expected_bandwidth(); - interval_start_time = start_of_accounting_period_containing(now); - interval_end_time = start_of_accounting_period_after(interval_start_time); - n_bytes_read_in_interval = 0; - n_bytes_written_in_interval = 0; - n_seconds_active_in_interval = 0; - n_bytes_at_soft_limit = 0; - soft_limit_hit_at = 0; - n_seconds_to_hit_soft_limit = 0; -} - -/** Return true iff we should save our bandwidth usage to disk. */ -static INLINE int -time_to_record_bandwidth_usage(time_t now) -{ - /* Note every 600 sec */ -#define NOTE_INTERVAL (600) - /* Or every 20 megabytes */ -#define NOTE_BYTES 20*(1024*1024) - static uint64_t last_read_bytes_noted = 0; - static uint64_t last_written_bytes_noted = 0; - static time_t last_time_noted = 0; - - if (last_time_noted + NOTE_INTERVAL <= now || - last_read_bytes_noted + NOTE_BYTES <= n_bytes_read_in_interval || - last_written_bytes_noted + NOTE_BYTES <= n_bytes_written_in_interval || - (interval_end_time && interval_end_time <= now)) { - last_time_noted = now; - last_read_bytes_noted = n_bytes_read_in_interval; - last_written_bytes_noted = n_bytes_written_in_interval; - return 1; - } - return 0; -} - -/** Invoked once per second. Checks whether it is time to hibernate, - * record bandwidth used, etc. */ -void -accounting_run_housekeeping(time_t now) -{ - if (now >= interval_end_time) { - configure_accounting(now); - } - if (time_to_record_bandwidth_usage(now)) { - if (accounting_record_bandwidth_usage(now, get_or_state())) { - log_warn(LD_FS, "Couldn't record bandwidth usage to disk."); - } - } -} - -/** Based on our interval and our estimated bandwidth, choose a - * deterministic (but random-ish) time to wake up. */ -static void -accounting_set_wakeup_time(void) -{ - char digest[DIGEST_LEN]; - crypto_digest_t *d_env; - uint64_t time_to_exhaust_bw; - int time_to_consider; - - if (! server_identity_key_is_set()) { - if (init_keys() < 0) { - log_err(LD_BUG, "Error initializing keys"); - tor_assert(0); - } - } - - if (server_identity_key_is_set()) { - char buf[ISO_TIME_LEN+1]; - format_iso_time(buf, interval_start_time); - - crypto_pk_get_digest(get_server_identity_key(), digest); - - d_env = crypto_digest_new(); - crypto_digest_add_bytes(d_env, buf, ISO_TIME_LEN); - crypto_digest_add_bytes(d_env, digest, DIGEST_LEN); - crypto_digest_get_digest(d_env, digest, DIGEST_LEN); - crypto_digest_free(d_env); - } else { - crypto_rand(digest, DIGEST_LEN); - } - - if (!expected_bandwidth_usage) { - char buf1[ISO_TIME_LEN+1]; - char buf2[ISO_TIME_LEN+1]; - format_local_iso_time(buf1, interval_start_time); - format_local_iso_time(buf2, interval_end_time); - interval_wakeup_time = interval_start_time; - - log_notice(LD_ACCT, - "Configured hibernation. This interval begins at %s " - "and ends at %s. We have no prior estimate for bandwidth, so " - "we will start out awake and hibernate when we exhaust our quota.", - buf1, buf2); - return; - } - - time_to_exhaust_bw = - (get_options()->AccountingMax/expected_bandwidth_usage)*60; - if (time_to_exhaust_bw > INT_MAX) { - time_to_exhaust_bw = INT_MAX; - time_to_consider = 0; - } else { - time_to_consider = accounting_get_interval_length() - - (int)time_to_exhaust_bw; - } - - if (time_to_consider<=0) { - interval_wakeup_time = interval_start_time; - } else { - /* XXX can we simplify this just by picking a random (non-deterministic) - * time to be up? If we go down and come up, then we pick a new one. Is - * that good enough? -RD */ - - /* This is not a perfectly unbiased conversion, but it is good enough: - * in the worst case, the first half of the day is 0.06 percent likelier - * to be chosen than the last half. */ - interval_wakeup_time = interval_start_time + - (get_uint32(digest) % time_to_consider); - } - - { - char buf1[ISO_TIME_LEN+1]; - char buf2[ISO_TIME_LEN+1]; - char buf3[ISO_TIME_LEN+1]; - char buf4[ISO_TIME_LEN+1]; - time_t down_time; - if (interval_wakeup_time+time_to_exhaust_bw > TIME_MAX) - down_time = TIME_MAX; - else - down_time = (time_t)(interval_wakeup_time+time_to_exhaust_bw); - if (down_time>interval_end_time) - down_time = interval_end_time; - format_local_iso_time(buf1, interval_start_time); - format_local_iso_time(buf2, interval_wakeup_time); - format_local_iso_time(buf3, down_time); - format_local_iso_time(buf4, interval_end_time); - - log_notice(LD_ACCT, - "Configured hibernation. This interval began at %s; " - "the scheduled wake-up time %s %s; " - "we expect%s to exhaust our quota for this interval around %s; " - "the next interval begins at %s (all times local)", - buf1, - time(NULL)AccountingIntervalStart = interval_start_time; - state->AccountingBytesReadInInterval = ROUND_UP(n_bytes_read_in_interval); - state->AccountingBytesWrittenInInterval = - ROUND_UP(n_bytes_written_in_interval); - state->AccountingSecondsActive = n_seconds_active_in_interval; - state->AccountingExpectedUsage = expected_bandwidth_usage; - - state->AccountingSecondsToReachSoftLimit = n_seconds_to_hit_soft_limit; - state->AccountingSoftLimitHitAt = soft_limit_hit_at; - state->AccountingBytesAtSoftLimit = n_bytes_at_soft_limit; - - or_state_mark_dirty(state, - now+(get_options()->AvoidDiskWrites ? 7200 : 60)); - - return 0; -} -#undef ROUND_UP - -/** Read stored accounting information from disk. Return 0 on success; - * return -1 and change nothing on failure. */ -static int -read_bandwidth_usage(void) -{ - or_state_t *state = get_or_state(); - - { - char *fname = get_datadir_fname("bw_accounting"); - unlink(fname); - tor_free(fname); - } - - if (!state) - return -1; - - log_info(LD_ACCT, "Reading bandwidth accounting data from state file"); - n_bytes_read_in_interval = state->AccountingBytesReadInInterval; - n_bytes_written_in_interval = state->AccountingBytesWrittenInInterval; - n_seconds_active_in_interval = state->AccountingSecondsActive; - interval_start_time = state->AccountingIntervalStart; - expected_bandwidth_usage = state->AccountingExpectedUsage; - - /* Older versions of Tor (before 0.2.2.17-alpha or so) didn't generate these - * fields. If you switch back and forth, you might get an - * AccountingSoftLimitHitAt value from long before the most recent - * interval_start_time. If that's so, then ignore the softlimit-related - * values. */ - if (state->AccountingSoftLimitHitAt > interval_start_time) { - soft_limit_hit_at = state->AccountingSoftLimitHitAt; - n_bytes_at_soft_limit = state->AccountingBytesAtSoftLimit; - n_seconds_to_hit_soft_limit = state->AccountingSecondsToReachSoftLimit; - } else { - soft_limit_hit_at = 0; - n_bytes_at_soft_limit = 0; - n_seconds_to_hit_soft_limit = 0; - } - - { - char tbuf1[ISO_TIME_LEN+1]; - char tbuf2[ISO_TIME_LEN+1]; - format_iso_time(tbuf1, state->LastWritten); - format_iso_time(tbuf2, state->AccountingIntervalStart); - - log_info(LD_ACCT, - "Successfully read bandwidth accounting info from state written at %s " - "for interval starting at %s. We have been active for %lu seconds in " - "this interval. At the start of the interval, we expected to use " - "about %lu KB per second. ("U64_FORMAT" bytes read so far, " - U64_FORMAT" bytes written so far)", - tbuf1, tbuf2, - (unsigned long)n_seconds_active_in_interval, - (unsigned long)(expected_bandwidth_usage*1024/60), - U64_PRINTF_ARG(n_bytes_read_in_interval), - U64_PRINTF_ARG(n_bytes_written_in_interval)); - } - - return 0; -} - -/** Return true iff we have sent/received all the bytes we are willing - * to send/receive this interval. */ -static int -hibernate_hard_limit_reached(void) -{ - uint64_t hard_limit = get_options()->AccountingMax; - if (!hard_limit) - return 0; - return n_bytes_read_in_interval >= hard_limit - || n_bytes_written_in_interval >= hard_limit; -} - -/** Return true iff we have sent/received almost all the bytes we are willing - * to send/receive this interval. */ -static int -hibernate_soft_limit_reached(void) -{ - const uint64_t acct_max = get_options()->AccountingMax; -#define SOFT_LIM_PCT (.95) -#define SOFT_LIM_BYTES (500*1024*1024) -#define SOFT_LIM_MINUTES (3*60) - /* The 'soft limit' is a fair bit more complicated now than once it was. - * We want to stop accepting connections when ALL of the following are true: - * - We expect to use up the remaining bytes in under 3 hours - * - We have used up 95% of our bytes. - * - We have less than 500MB of bytes left. - */ - uint64_t soft_limit = DBL_TO_U64(U64_TO_DBL(acct_max) * SOFT_LIM_PCT); - if (acct_max > SOFT_LIM_BYTES && acct_max - SOFT_LIM_BYTES > soft_limit) { - soft_limit = acct_max - SOFT_LIM_BYTES; - } - if (expected_bandwidth_usage) { - const uint64_t expected_usage = - expected_bandwidth_usage * SOFT_LIM_MINUTES; - if (acct_max > expected_usage && acct_max - expected_usage > soft_limit) - soft_limit = acct_max - expected_usage; - } - - if (!soft_limit) - return 0; - return n_bytes_read_in_interval >= soft_limit - || n_bytes_written_in_interval >= soft_limit; -} - -/** Called when we get a SIGINT, or when bandwidth soft limit is - * reached. Puts us into "loose hibernation": we don't accept new - * connections, but we continue handling old ones. */ -static void -hibernate_begin(hibernate_state_t new_state, time_t now) -{ - const or_options_t *options = get_options(); - - if (new_state == HIBERNATE_STATE_EXITING && - hibernate_state != HIBERNATE_STATE_LIVE) { - log_notice(LD_GENERAL,"SIGINT received %s; exiting now.", - hibernate_state == HIBERNATE_STATE_EXITING ? - "a second time" : "while hibernating"); - tor_cleanup(); - exit(0); - } - - if (new_state == HIBERNATE_STATE_LOWBANDWIDTH && - hibernate_state == HIBERNATE_STATE_LIVE) { - soft_limit_hit_at = now; - n_seconds_to_hit_soft_limit = n_seconds_active_in_interval; - n_bytes_at_soft_limit = MAX(n_bytes_read_in_interval, - n_bytes_written_in_interval); - } - - /* close listeners. leave control listener(s). */ - connection_mark_all_noncontrol_listeners(); - - /* XXX kill intro point circs */ - /* XXX upload rendezvous service descriptors with no intro points */ - - if (new_state == HIBERNATE_STATE_EXITING) { - log_notice(LD_GENERAL,"Interrupt: we have stopped accepting new " - "connections, and will shut down in %d seconds. Interrupt " - "again to exit now.", options->ShutdownWaitLength); - shutdown_time = time(NULL) + options->ShutdownWaitLength; - } else { /* soft limit reached */ - hibernate_end_time = interval_end_time; - } - - hibernate_state = new_state; - accounting_record_bandwidth_usage(now, get_or_state()); - - or_state_mark_dirty(get_or_state(), - get_options()->AvoidDiskWrites ? now+600 : 0); -} - -/** Called when we've been hibernating and our timeout is reached. */ -static void -hibernate_end(hibernate_state_t new_state) -{ - tor_assert(hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH || - hibernate_state == HIBERNATE_STATE_DORMANT || - hibernate_state == HIBERNATE_STATE_INITIAL); - - /* listeners will be relaunched in run_scheduled_events() in onion_main.c */ - if (hibernate_state != HIBERNATE_STATE_INITIAL) - log_notice(LD_ACCT,"Hibernation period ended. Resuming normal activity."); - - hibernate_state = new_state; - hibernate_end_time = 0; /* no longer hibernating */ - stats_n_seconds_working = 0; /* reset published uptime */ -} - -/** A wrapper around hibernate_begin, for when we get SIGINT. */ -void -hibernate_begin_shutdown(void) -{ - hibernate_begin(HIBERNATE_STATE_EXITING, time(NULL)); -} - -/** Return true iff we are currently hibernating. */ -int -we_are_hibernating(void) -{ - return hibernate_state != HIBERNATE_STATE_LIVE; -} - -/** If we aren't currently dormant, close all connections and become - * dormant. */ -static void -hibernate_go_dormant(time_t now) -{ - connection_t *conn; - - if (hibernate_state == HIBERNATE_STATE_DORMANT) - return; - else if (hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH) - hibernate_state = HIBERNATE_STATE_DORMANT; - else - hibernate_begin(HIBERNATE_STATE_DORMANT, now); - - log_notice(LD_ACCT,"Going dormant. Blowing away remaining connections."); - - /* Close all OR/AP/exit conns. Leave dir conns because we still want - * to be able to upload server descriptors so people know we're still - * running, and download directories so we can detect if we're obsolete. - * Leave control conns because we still want to be controllable. - */ - while ((conn = connection_get_by_type(CONN_TYPE_OR)) || - (conn = connection_get_by_type(CONN_TYPE_AP)) || - (conn = connection_get_by_type(CONN_TYPE_EXIT))) { - if (CONN_IS_EDGE(conn)) - connection_edge_end(TO_EDGE_CONN(conn), END_STREAM_REASON_HIBERNATING); - log_info(LD_NET,"Closing conn type %d", conn->type); - if (conn->type == CONN_TYPE_AP) /* send socks failure if needed */ - connection_mark_unattached_ap(TO_ENTRY_CONN(conn), - END_STREAM_REASON_HIBERNATING); - else if (conn->type == CONN_TYPE_OR) { - if (TO_OR_CONN(conn)->chan) { - channel_mark_for_close(TLS_CHAN_TO_BASE(TO_OR_CONN(conn)->chan)); - } else { - connection_mark_for_close(conn); - } - } else - connection_mark_for_close(conn); - } - - if (now < interval_wakeup_time) - hibernate_end_time = interval_wakeup_time; - else - hibernate_end_time = interval_end_time; - - accounting_record_bandwidth_usage(now, get_or_state()); - - or_state_mark_dirty(get_or_state(), - get_options()->AvoidDiskWrites ? now+600 : 0); -} - -/** Called when hibernate_end_time has arrived. */ -static void -hibernate_end_time_elapsed(time_t now) -{ - char buf[ISO_TIME_LEN+1]; - - /* The interval has ended, or it is wakeup time. Find out which. */ - accounting_run_housekeeping(now); - if (interval_wakeup_time <= now) { - /* The interval hasn't changed, but interval_wakeup_time has passed. - * It's time to wake up and start being a server. */ - hibernate_end(HIBERNATE_STATE_LIVE); - return; - } else { - /* The interval has changed, and it isn't time to wake up yet. */ - hibernate_end_time = interval_wakeup_time; - format_iso_time(buf,interval_wakeup_time); - if (hibernate_state != HIBERNATE_STATE_DORMANT) { - /* We weren't sleeping before; we should sleep now. */ - log_notice(LD_ACCT, - "Accounting period ended. Commencing hibernation until " - "%s UTC", buf); - hibernate_go_dormant(now); - } else { - log_notice(LD_ACCT, - "Accounting period ended. This period, we will hibernate" - " until %s UTC",buf); - } - } -} - -/** Consider our environment and decide if it's time - * to start/stop hibernating. - */ -void -consider_hibernation(time_t now) -{ - int accounting_enabled = get_options()->AccountingMax != 0; - char buf[ISO_TIME_LEN+1]; - - /* If we're in 'exiting' mode, then we just shut down after the interval - * elapses. */ - if (hibernate_state == HIBERNATE_STATE_EXITING) { - tor_assert(shutdown_time); - if (shutdown_time <= now) { - log_notice(LD_GENERAL, "Clean shutdown finished. Exiting."); - tor_cleanup(); - exit(0); - } - return; /* if exiting soon, don't worry about bandwidth limits */ - } - - if (hibernate_state == HIBERNATE_STATE_DORMANT) { - /* We've been hibernating because of bandwidth accounting. */ - tor_assert(hibernate_end_time); - if (hibernate_end_time > now && accounting_enabled) { - /* If we're hibernating, don't wake up until it's time, regardless of - * whether we're in a new interval. */ - return ; - } else { - hibernate_end_time_elapsed(now); - } - } - - /* Else, we aren't hibernating. See if it's time to start hibernating, or to - * go dormant. */ - if (hibernate_state == HIBERNATE_STATE_LIVE || - hibernate_state == HIBERNATE_STATE_INITIAL) { - if (hibernate_soft_limit_reached()) { - log_notice(LD_ACCT, - "Bandwidth soft limit reached; commencing hibernation. " - "No new connections will be accepted"); - hibernate_begin(HIBERNATE_STATE_LOWBANDWIDTH, now); - } else if (accounting_enabled && now < interval_wakeup_time) { - format_local_iso_time(buf,interval_wakeup_time); - log_notice(LD_ACCT, - "Commencing hibernation. We will wake up at %s local time.", - buf); - hibernate_go_dormant(now); - } else if (hibernate_state == HIBERNATE_STATE_INITIAL) { - hibernate_end(HIBERNATE_STATE_LIVE); - } - } - - if (hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH) { - if (!accounting_enabled) { - hibernate_end_time_elapsed(now); - } else if (hibernate_hard_limit_reached()) { - hibernate_go_dormant(now); - } else if (hibernate_end_time <= now) { - /* The hibernation period ended while we were still in lowbandwidth.*/ - hibernate_end_time_elapsed(now); - } - } -} - -/** Helper function: called when we get a GETINFO request for an - * accounting-related key on the control connection conn. If we can - * answer the request for question, then set *answer to a newly - * allocated string holding the result. Otherwise, set *answer to - * NULL. */ -int -getinfo_helper_accounting(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - (void) conn; - (void) errmsg; - if (!strcmp(question, "accounting/enabled")) { - *answer = tor_strdup(accounting_is_enabled(get_options()) ? "1" : "0"); - } else if (!strcmp(question, "accounting/hibernating")) { - if (hibernate_state == HIBERNATE_STATE_DORMANT) - *answer = tor_strdup("hard"); - else if (hibernate_state == HIBERNATE_STATE_LOWBANDWIDTH) - *answer = tor_strdup("soft"); - else - *answer = tor_strdup("awake"); - } else if (!strcmp(question, "accounting/bytes")) { - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(n_bytes_read_in_interval), - U64_PRINTF_ARG(n_bytes_written_in_interval)); - } else if (!strcmp(question, "accounting/bytes-left")) { - uint64_t limit = get_options()->AccountingMax; - uint64_t read_left = 0, write_left = 0; - if (n_bytes_read_in_interval < limit) - read_left = limit - n_bytes_read_in_interval; - if (n_bytes_written_in_interval < limit) - write_left = limit - n_bytes_written_in_interval; - tor_asprintf(answer, U64_FORMAT" "U64_FORMAT, - U64_PRINTF_ARG(read_left), U64_PRINTF_ARG(write_left)); - } else if (!strcmp(question, "accounting/interval-start")) { - *answer = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(*answer, interval_start_time); - } else if (!strcmp(question, "accounting/interval-wake")) { - *answer = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(*answer, interval_wakeup_time); - } else if (!strcmp(question, "accounting/interval-end")) { - *answer = tor_malloc(ISO_TIME_LEN+1); - format_iso_time(*answer, interval_end_time); - } else { - *answer = NULL; - } - return 0; -} - -#ifdef TOR_UNIT_TESTS -/** - * Manually change the hibernation state. Private; used only by the unit - * tests. - */ -void -hibernate_set_state_for_testing_(hibernate_state_t newstate) -{ - hibernate_state = newstate; -} -#endif - diff --git a/src/tor/hibernate.h b/src/tor/hibernate.h deleted file mode 100644 index 4f7331ce8..000000000 --- a/src/tor/hibernate.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file hibernate.h - * \brief Header file for hibernate.c. - **/ - -#ifndef TOR_HIBERNATE_H -#define TOR_HIBERNATE_H - -int accounting_parse_options(const or_options_t *options, int validate_only); -int accounting_is_enabled(const or_options_t *options); -int accounting_get_interval_length(void); -time_t accounting_get_end_time(void); -void configure_accounting(time_t now); -void accounting_run_housekeeping(time_t now); -void accounting_add_bytes(size_t n_read, size_t n_written, int seconds); -int accounting_record_bandwidth_usage(time_t now, or_state_t *state); -void hibernate_begin_shutdown(void); -int we_are_hibernating(void); -void consider_hibernation(time_t now); -int getinfo_helper_accounting(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -#ifdef HIBERNATE_PRIVATE -/** Possible values of hibernate_state */ -typedef enum { - /** We are running normally. */ - HIBERNATE_STATE_LIVE=1, - /** We're trying to shut down cleanly, and we'll kill all active connections - * at shutdown_time. */ - HIBERNATE_STATE_EXITING=2, - /** We're running low on allocated bandwidth for this period, so we won't - * accept any new connections. */ - HIBERNATE_STATE_LOWBANDWIDTH=3, - /** We are hibernating, and we won't wake up till there's more bandwidth to - * use. */ - HIBERNATE_STATE_DORMANT=4, - /** We start out in state default, which means we havent decided which state - * we're in. */ - HIBERNATE_STATE_INITIAL=5 -} hibernate_state_t; - -#ifdef TOR_UNIT_TESTS -void hibernate_set_state_for_testing_(hibernate_state_t newstate); -#endif -#endif - -#endif - diff --git a/src/tor/ht.h b/src/tor/ht.h deleted file mode 100644 index 669a2ed92..000000000 --- a/src/tor/ht.h +++ /dev/null @@ -1,490 +0,0 @@ -/* Copyright (c) 2002, Christopher Clark. - * Copyright (c) 2005-2006, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See license at end. */ - -/* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ - -#ifndef HT_H_INCLUDED_ -#define HT_H_INCLUDED_ - -#define HT_HEAD(name, type) \ - struct name { \ - /* The hash table itself. */ \ - struct type **hth_table; \ - /* How long is the hash table? */ \ - unsigned hth_table_length; \ - /* How many elements does the table contain? */ \ - unsigned hth_n_entries; \ - /* How many elements will we allow in the table before resizing it? */ \ - unsigned hth_load_limit; \ - /* Position of hth_table_length in the primes table. */ \ - int hth_prime_idx; \ - } - -#define HT_INITIALIZER() \ - { NULL, 0, 0, 0, -1 } - -#ifdef HT_NO_CACHE_HASH_VALUES -#define HT_ENTRY(type) \ - struct { \ - struct type *hte_next; \ - } -#else -#define HT_ENTRY(type) \ - struct { \ - struct type *hte_next; \ - unsigned hte_hash; \ - } -#endif - -#define HT_EMPTY(head) \ - ((head)->hth_n_entries == 0) - -/* How many elements in 'head'? */ -#define HT_SIZE(head) \ - ((head)->hth_n_entries) - -/* Return memory usage for a hashtable (not counting the entries themselves) */ -#define HT_MEM_USAGE(head) \ - (sizeof(*head) + (head)->hth_table_length * sizeof(void*)) - -#define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm)) -#define HT_INSERT(name, head, elm) name##_HT_INSERT((head), (elm)) -#define HT_REPLACE(name, head, elm) name##_HT_REPLACE((head), (elm)) -#define HT_REMOVE(name, head, elm) name##_HT_REMOVE((head), (elm)) -#define HT_START(name, head) name##_HT_START(head) -#define HT_NEXT(name, head, elm) name##_HT_NEXT((head), (elm)) -#define HT_NEXT_RMV(name, head, elm) name##_HT_NEXT_RMV((head), (elm)) -#define HT_CLEAR(name, head) name##_HT_CLEAR(head) -#define HT_INIT(name, head) name##_HT_INIT(head) -/* Helper: */ -static INLINE unsigned -ht_improve_hash(unsigned h) -{ - /* Aim to protect against poor hash functions by adding logic here - * - logic taken from java 1.4 hashtable source */ - h += ~(h << 9); - h ^= ((h >> 14) | (h << 18)); /* >>> */ - h += (h << 4); - h ^= ((h >> 10) | (h << 22)); /* >>> */ - return h; -} - -#if 0 -/** Basic string hash function, from Java standard String.hashCode(). */ -static INLINE unsigned -ht_string_hash(const char *s) -{ - unsigned h = 0; - int m = 1; - while (*s) { - h += ((signed char)*s++)*m; - m = (m<<5)-1; /* m *= 31 */ - } - return h; -} -#endif - -/** Basic string hash function, from Python's str.__hash__() */ -static INLINE unsigned -ht_string_hash(const char *s) -{ - unsigned h; - const unsigned char *cp = (const unsigned char *)s; - h = *cp << 7; - while (*cp) { - h = (1000003*h) ^ *cp++; - } - /* This conversion truncates the length of the string, but that's ok. */ - h ^= (unsigned)(cp-(const unsigned char*)s); - return h; -} - -#ifndef HT_NO_CACHE_HASH_VALUES -#define HT_SET_HASH_(elm, field, hashfn) \ - do { (elm)->field.hte_hash = hashfn(elm); } while (0) -#define HT_SET_HASHVAL_(elm, field, val) \ - do { (elm)->field.hte_hash = (val); } while (0) -#define HT_ELT_HASH_(elm, field, hashfn) \ - ((elm)->field.hte_hash) -#else -#define HT_SET_HASH_(elm, field, hashfn) \ - ((void)0) -#define HT_ELT_HASH_(elm, field, hashfn) \ - (hashfn(elm)) -#define HT_SET_HASHVAL_(elm, field, val) \ - ((void)0) -#endif - -/* Helper: alias for the bucket containing 'elm'. */ -#define HT_BUCKET_(head, field, elm, hashfn) \ - ((head)->hth_table[HT_ELT_HASH_(elm,field,hashfn) \ - % head->hth_table_length]) - -#define HT_FOREACH(x, name, head) \ - for ((x) = HT_START(name, head); \ - (x) != NULL; \ - (x) = HT_NEXT(name, head, x)) - -#define HT_PROTOTYPE(name, type, field, hashfn, eqfn) \ - int name##_HT_GROW(struct name *ht, unsigned min_capacity); \ - void name##_HT_CLEAR(struct name *ht); \ - int name##_HT_REP_IS_BAD_(const struct name *ht); \ - static INLINE void \ - name##_HT_INIT(struct name *head) { \ - head->hth_table_length = 0; \ - head->hth_table = NULL; \ - head->hth_n_entries = 0; \ - head->hth_load_limit = 0; \ - head->hth_prime_idx = -1; \ - } \ - /* Helper: returns a pointer to the right location in the table \ - * 'head' to find or insert the element 'elm'. */ \ - static INLINE struct type ** \ - name##_HT_FIND_P_(struct name *head, struct type *elm) \ - { \ - struct type **p; \ - if (!head->hth_table) \ - return NULL; \ - p = &HT_BUCKET_(head, field, elm, hashfn); \ - while (*p) { \ - if (eqfn(*p, elm)) \ - return p; \ - p = &(*p)->field.hte_next; \ - } \ - return p; \ - } \ - /* Return a pointer to the element in the table 'head' matching 'elm', \ - * or NULL if no such element exists */ \ - static INLINE struct type * \ - name##_HT_FIND(const struct name *head, struct type *elm) \ - { \ - struct type **p; \ - struct name *h = (struct name *) head; \ - HT_SET_HASH_(elm, field, hashfn); \ - p = name##_HT_FIND_P_(h, elm); \ - return p ? *p : NULL; \ - } \ - /* Insert the element 'elm' into the table 'head'. Do not call this \ - * function if the table might already contain a matching element. */ \ - static INLINE void \ - name##_HT_INSERT(struct name *head, struct type *elm) \ - { \ - struct type **p; \ - if (!head->hth_table || head->hth_n_entries >= head->hth_load_limit) \ - name##_HT_GROW(head, head->hth_n_entries+1); \ - ++head->hth_n_entries; \ - HT_SET_HASH_(elm, field, hashfn); \ - p = &HT_BUCKET_(head, field, elm, hashfn); \ - elm->field.hte_next = *p; \ - *p = elm; \ - } \ - /* Insert the element 'elm' into the table 'head'. If there already \ - * a matching element in the table, replace that element and return \ - * it. */ \ - static INLINE struct type * \ - name##_HT_REPLACE(struct name *head, struct type *elm) \ - { \ - struct type **p, *r; \ - if (!head->hth_table || head->hth_n_entries >= head->hth_load_limit) \ - name##_HT_GROW(head, head->hth_n_entries+1); \ - HT_SET_HASH_(elm, field, hashfn); \ - p = name##_HT_FIND_P_(head, elm); \ - r = *p; \ - *p = elm; \ - if (r && (r!=elm)) { \ - elm->field.hte_next = r->field.hte_next; \ - r->field.hte_next = NULL; \ - return r; \ - } else { \ - ++head->hth_n_entries; \ - return NULL; \ - } \ - } \ - /* Remove any element matching 'elm' from the table 'head'. If such \ - * an element is found, return it; otherwise return NULL. */ \ - static INLINE struct type * \ - name##_HT_REMOVE(struct name *head, struct type *elm) \ - { \ - struct type **p, *r; \ - HT_SET_HASH_(elm, field, hashfn); \ - p = name##_HT_FIND_P_(head,elm); \ - if (!p || !*p) \ - return NULL; \ - r = *p; \ - *p = r->field.hte_next; \ - r->field.hte_next = NULL; \ - --head->hth_n_entries; \ - return r; \ - } \ - /* Invoke the function 'fn' on every element of the table 'head', \ - * using 'data' as its second argument. If the function returns \ - * nonzero, remove the most recently examined element before invoking \ - * the function again. */ \ - static INLINE void \ - name##_HT_FOREACH_FN(struct name *head, \ - int (*fn)(struct type *, void *), \ - void *data) \ - { \ - unsigned idx; \ - struct type **p, **nextp, *next; \ - if (!head->hth_table) \ - return; \ - for (idx=0; idx < head->hth_table_length; ++idx) { \ - p = &head->hth_table[idx]; \ - while (*p) { \ - nextp = &(*p)->field.hte_next; \ - next = *nextp; \ - if (fn(*p, data)) { \ - --head->hth_n_entries; \ - *p = next; \ - } else { \ - p = nextp; \ - } \ - } \ - } \ - } \ - /* Return a pointer to the first element in the table 'head', under \ - * an arbitrary order. This order is stable under remove operations, \ - * but not under others. If the table is empty, return NULL. */ \ - static INLINE struct type ** \ - name##_HT_START(struct name *head) \ - { \ - unsigned b = 0; \ - while (b < head->hth_table_length) { \ - if (head->hth_table[b]) \ - return &head->hth_table[b]; \ - ++b; \ - } \ - return NULL; \ - } \ - /* Return the next element in 'head' after 'elm', under the arbitrary \ - * order used by HT_START. If there are no more elements, return \ - * NULL. If 'elm' is to be removed from the table, you must call \ - * this function for the next value before you remove it. \ - */ \ - static INLINE struct type ** \ - name##_HT_NEXT(struct name *head, struct type **elm) \ - { \ - if ((*elm)->field.hte_next) { \ - return &(*elm)->field.hte_next; \ - } else { \ - unsigned b = (HT_ELT_HASH_(*elm, field, hashfn) \ - % head->hth_table_length)+1; \ - while (b < head->hth_table_length) { \ - if (head->hth_table[b]) \ - return &head->hth_table[b]; \ - ++b; \ - } \ - return NULL; \ - } \ - } \ - static INLINE struct type ** \ - name##_HT_NEXT_RMV(struct name *head, struct type **elm) \ - { \ - unsigned h = HT_ELT_HASH_(*elm, field, hashfn); \ - *elm = (*elm)->field.hte_next; \ - --head->hth_n_entries; \ - if (*elm) { \ - return elm; \ - } else { \ - unsigned b = (h % head->hth_table_length)+1; \ - while (b < head->hth_table_length) { \ - if (head->hth_table[b]) \ - return &head->hth_table[b]; \ - ++b; \ - } \ - return NULL; \ - } \ - } - -#define HT_GENERATE(name, type, field, hashfn, eqfn, load, mallocfn, \ - reallocfn, freefn) \ - static unsigned name##_PRIMES[] = { \ - 53, 97, 193, 389, \ - 769, 1543, 3079, 6151, \ - 12289, 24593, 49157, 98317, \ - 196613, 393241, 786433, 1572869, \ - 3145739, 6291469, 12582917, 25165843, \ - 50331653, 100663319, 201326611, 402653189, \ - 805306457, 1610612741 \ - }; \ - static unsigned name##_N_PRIMES = \ - (unsigned)(sizeof(name##_PRIMES)/sizeof(name##_PRIMES[0])); \ - /* Expand the internal table of 'head' until it is large enough to \ - * hold 'size' elements. Return 0 on success, -1 on allocation \ - * failure. */ \ - int \ - name##_HT_GROW(struct name *head, unsigned size) \ - { \ - unsigned new_len, new_load_limit; \ - int prime_idx; \ - struct type **new_table; \ - if (head->hth_prime_idx == (int)name##_N_PRIMES - 1) \ - return 0; \ - if (head->hth_load_limit > size) \ - return 0; \ - prime_idx = head->hth_prime_idx; \ - do { \ - new_len = name##_PRIMES[++prime_idx]; \ - new_load_limit = (unsigned)(load*new_len); \ - } while (new_load_limit <= size && \ - prime_idx < (int)name##_N_PRIMES); \ - if ((new_table = mallocfn(new_len*sizeof(struct type*)))) { \ - unsigned b; \ - memset(new_table, 0, new_len*sizeof(struct type*)); \ - for (b = 0; b < head->hth_table_length; ++b) { \ - struct type *elm, *next; \ - unsigned b2; \ - elm = head->hth_table[b]; \ - while (elm) { \ - next = elm->field.hte_next; \ - b2 = HT_ELT_HASH_(elm, field, hashfn) % new_len; \ - elm->field.hte_next = new_table[b2]; \ - new_table[b2] = elm; \ - elm = next; \ - } \ - } \ - if (head->hth_table) \ - freefn(head->hth_table); \ - head->hth_table = new_table; \ - } else { \ - unsigned b, b2; \ - new_table = reallocfn(head->hth_table, new_len*sizeof(struct type*)); \ - if (!new_table) return -1; \ - memset(new_table + head->hth_table_length, 0, \ - (new_len - head->hth_table_length)*sizeof(struct type*)); \ - for (b=0; b < head->hth_table_length; ++b) { \ - struct type *e, **pE; \ - for (pE = &new_table[b], e = *pE; e != NULL; e = *pE) { \ - b2 = HT_ELT_HASH_(e, field, hashfn) % new_len; \ - if (b2 == b) { \ - pE = &e->field.hte_next; \ - } else { \ - *pE = e->field.hte_next; \ - e->field.hte_next = new_table[b2]; \ - new_table[b2] = e; \ - } \ - } \ - } \ - head->hth_table = new_table; \ - } \ - head->hth_table_length = new_len; \ - head->hth_prime_idx = prime_idx; \ - head->hth_load_limit = new_load_limit; \ - return 0; \ - } \ - /* Free all storage held by 'head'. Does not free 'head' itself, or \ - * individual elements. */ \ - void \ - name##_HT_CLEAR(struct name *head) \ - { \ - if (head->hth_table) \ - freefn(head->hth_table); \ - head->hth_table_length = 0; \ - name##_HT_INIT(head); \ - } \ - /* Debugging helper: return false iff the representation of 'head' is \ - * internally consistent. */ \ - int \ - name##_HT_REP_IS_BAD_(const struct name *head) \ - { \ - unsigned n, i; \ - struct type *elm; \ - if (!head->hth_table_length) { \ - if (!head->hth_table && !head->hth_n_entries && \ - !head->hth_load_limit && head->hth_prime_idx == -1) \ - return 0; \ - else \ - return 1; \ - } \ - if (!head->hth_table || head->hth_prime_idx < 0 || \ - !head->hth_load_limit) \ - return 2; \ - if (head->hth_n_entries > head->hth_load_limit) \ - return 3; \ - if (head->hth_table_length != name##_PRIMES[head->hth_prime_idx]) \ - return 4; \ - if (head->hth_load_limit != (unsigned)(load*head->hth_table_length)) \ - return 5; \ - for (n = i = 0; i < head->hth_table_length; ++i) { \ - for (elm = head->hth_table[i]; elm; elm = elm->field.hte_next) { \ - if (HT_ELT_HASH_(elm, field, hashfn) != hashfn(elm)) \ - return 1000 + i; \ - if ((HT_ELT_HASH_(elm, field, hashfn) % head->hth_table_length) != i) \ - return 10000 + i; \ - ++n; \ - } \ - } \ - if (n != head->hth_n_entries) \ - return 6; \ - return 0; \ - } - -/** Implements an over-optimized "find and insert if absent" block; - * not meant for direct usage by typical code, or usage outside the critical - * path.*/ -#define HT_FIND_OR_INSERT_(name, field, hashfn, head, eltype, elm, var, y, n) \ - { \ - struct name *var##_head_ = head; \ - struct eltype **var; \ - if (!var##_head_->hth_table || \ - var##_head_->hth_n_entries >= var##_head_->hth_load_limit) \ - name##_HT_GROW(var##_head_, var##_head_->hth_n_entries+1); \ - HT_SET_HASH_((elm), field, hashfn); \ - var = name##_HT_FIND_P_(var##_head_, (elm)); \ - if (*var) { \ - y; \ - } else { \ - n; \ - } \ - } -#define HT_FOI_INSERT_(field, head, elm, newent, var) \ - { \ - HT_SET_HASHVAL_(newent, field, (elm)->field.hte_hash); \ - newent->field.hte_next = NULL; \ - *var = newent; \ - ++((head)->hth_n_entries); \ - } - -/* - * Copyright 2005, Nick Mathewson. Implementation logic is adapted from code - * by Christopher Clark, retrofit to allow drop-in memory management, and to - * use the same interface as Niels Provos's tree.h. This is probably still - * a derived work, so the original license below still applies. - * - * Copyright (c) 2002, Christopher Clark - * 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 the original author; nor the names of any 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. -*/ - -#endif - diff --git a/src/tor/log.c b/src/tor/log.c deleted file mode 100644 index 6e3e95f83..000000000 --- a/src/tor/log.c +++ /dev/null @@ -1,1316 +0,0 @@ -/* Copyright (c) 2001, Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file log.c - * \brief Functions to send messages to log files or the console. - **/ - -#include "orconfig.h" -#include -#include -// #include -#include -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_TIME_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#include "tor_compat.h" -#include "tor_util.h" -#define LOG_PRIVATE -#include "torlog.h" -#include "container.h" - -/** Given a severity, yields an index into log_severity_list_t.masks to use - * for that severity. */ -#define SEVERITY_MASK_IDX(sev) ((sev) - LOG_ERR) - -/** @{ */ -/** The string we stick at the end of a log message when it is too long, - * and its length. */ -#define TRUNCATED_STR "[...truncated]" -#define TRUNCATED_STR_LEN 14 -/** @} */ - -/** Information for a single logfile; only used in log.c */ -typedef struct logfile_t { - struct logfile_t *next; /**< Next logfile_t in the linked list. */ - char *filename; /**< Filename to open. */ - int fd; /**< fd to receive log messages, or -1 for none. */ - int seems_dead; /**< Boolean: true if the stream seems to be kaput. */ - int needs_close; /**< Boolean: true if the stream gets closed on shutdown. */ - int is_temporary; /**< Boolean: close after initializing logging subsystem.*/ - int is_syslog; /**< Boolean: send messages to syslog. */ - log_callback callback; /**< If not NULL, send messages to this function. */ - log_severity_list_t *severities; /**< Which severity of messages should we - * log for each log domain? */ -} logfile_t; - -static void log_free(logfile_t *victim); - -/** Helper: map a log severity to descriptive string. */ -static INLINE const char * -sev_to_string(int severity) -{ - switch (severity) { - case LOG_DEBUG: return "debug"; - case LOG_INFO: return "info"; - case LOG_NOTICE: return "notice"; - case LOG_WARN: return "warn"; - case LOG_ERR: return "err"; - default: /* Call assert, not tor_assert, since tor_assert - * calls log on failure. */ - assert(0); return "UNKNOWN"; - } -} - -/** Helper: decide whether to include the function name in the log message. */ -static INLINE int -should_log_function_name(log_domain_mask_t domain, int severity) -{ - switch (severity) { - case LOG_DEBUG: - case LOG_INFO: - /* All debugging messages occur in interesting places. */ - return (domain & LD_NOFUNCNAME) == 0; - case LOG_NOTICE: - case LOG_WARN: - case LOG_ERR: - /* We care about places where bugs occur. */ - return (domain & (LD_BUG|LD_NOFUNCNAME)) == LD_BUG; - default: - /* Call assert, not tor_assert, since tor_assert calls log on failure. */ - assert(0); return 0; - } -} - -/** A mutex to guard changes to logfiles and logging. */ -static tor_mutex_t log_mutex; -/** True iff we have initialized log_mutex */ -static int log_mutex_initialized = 0; - -/** Linked list of logfile_t. */ -static logfile_t *logfiles = NULL; -/** Boolean: do we report logging domains? */ -static int log_domains_are_logged = 0; - -#ifdef HAVE_SYSLOG_H -/** The number of open syslog log handlers that we have. When this reaches 0, - * we can close our connection to the syslog facility. */ -static int syslog_count = 0; -#endif - -/** Represents a log message that we are going to send to callback-driven - * loggers once we can do so in a non-reentrant way. */ -typedef struct pending_cb_message_t { - int severity; /**< The severity of the message */ - log_domain_mask_t domain; /**< The domain of the message */ - char *msg; /**< The content of the message */ -} pending_cb_message_t; - -/** Log messages waiting to be replayed onto callback-based logs */ -static smartlist_t *pending_cb_messages = NULL; - -/** Lock the log_mutex to prevent others from changing the logfile_t list */ -#define LOCK_LOGS() STMT_BEGIN \ - tor_mutex_acquire(&log_mutex); \ - STMT_END -/** Unlock the log_mutex */ -#define UNLOCK_LOGS() STMT_BEGIN tor_mutex_release(&log_mutex); STMT_END - -/** What's the lowest log level anybody cares about? Checking this lets us - * bail out early from log_debug if we aren't debugging. */ -int log_global_min_severity_ = LOG_NOTICE; - -static void delete_log(logfile_t *victim); -static void close_log(logfile_t *victim); - -static char *domain_to_string(log_domain_mask_t domain, - char *buf, size_t buflen); -static INLINE char *format_msg(char *buf, size_t buf_len, - log_domain_mask_t domain, int severity, const char *funcname, - const char *suffix, - const char *format, va_list ap, size_t *msg_len_out) - CHECK_PRINTF(7,0); -static void logv(int severity, log_domain_mask_t domain, const char *funcname, - const char *suffix, const char *format, va_list ap) - CHECK_PRINTF(5,0); - -/** Name of the application: used to generate the message we write at the - * start of each new log. */ -static char *appname = NULL; - -/** Set the "application name" for the logs to name: we'll use this - * name in the message we write when starting up, and at the start of each new - * log. - * - * Tor uses this string to write the version number to the log file. */ -void -log_set_application_name(const char *name) -{ - tor_free(appname); - appname = name ? tor_strdup(name) : NULL; -} - -/** Log time granularity in milliseconds. */ -static int log_time_granularity = 1; - -/** Define log time granularity for all logs to be granularity_msec - * milliseconds. */ -void -set_log_time_granularity(int granularity_msec) -{ - log_time_granularity = granularity_msec; -} - -/** Helper: Write the standard prefix for log lines to a - * buf_len character buffer in buf. - */ -static INLINE size_t -log_prefix_(char *buf, size_t buf_len, int severity) -{ - time_t t; - struct timeval now; - struct tm tm; - size_t n; - int r, ms; - - tor_gettimeofday(&now); - t = (time_t)now.tv_sec; - ms = (int)now.tv_usec / 1000; - if (log_time_granularity >= 1000) { - t -= t % (log_time_granularity / 1000); - ms = 0; - } else { - ms -= ((int)now.tv_usec / 1000) % log_time_granularity; - } - - n = strftime(buf, buf_len, "%b %d %H:%M:%S", tor_localtime_r(&t, &tm)); - r = tor_snprintf(buf+n, buf_len-n, ".%.3i [%s] ", ms, - sev_to_string(severity)); - - if (r<0) - return buf_len-1; - else - return n+r; -} - -/** If lf refers to an actual file that we have just opened, and the file - * contains no data, log an "opening new logfile" message at the top. - * - * Return -1 if the log is broken and needs to be deleted, else return 0. - */ -static int -log_tor_version(logfile_t *lf, int reset) -{ - char buf[256]; - size_t n; - int is_new; - - if (!lf->needs_close) - /* If it doesn't get closed, it isn't really a file. */ - return 0; - if (lf->is_temporary) - /* If it's temporary, it isn't really a file. */ - return 0; - - is_new = lf->fd >= 0 && tor_fd_getpos(lf->fd) == 0; - - if (reset && !is_new) - /* We are resetting, but we aren't at the start of the file; no - * need to log again. */ - return 0; - n = log_prefix_(buf, sizeof(buf), LOG_NOTICE); - if (appname) { - tor_snprintf(buf+n, sizeof(buf)-n, - "%s opening %slog file.\n", appname, is_new?"new ":""); - } else { - tor_snprintf(buf+n, sizeof(buf)-n, - "Tor %s opening %slog file.\n", VERSION, is_new?"new ":""); - } - if (write_all(lf->fd, buf, strlen(buf), 0) < 0) /* error */ - return -1; /* failed */ - return 0; -} - -/** Helper: Format a log message into a fixed-sized buffer. (This is - * factored out of logv so that we never format a message more - * than once.) Return a pointer to the first character of the message - * portion of the formatted string. - */ -static INLINE char * -format_msg(char *buf, size_t buf_len, - log_domain_mask_t domain, int severity, const char *funcname, - const char *suffix, - const char *format, va_list ap, size_t *msg_len_out) -{ - size_t n; - int r; - char *end_of_prefix; - char *buf_end; - - assert(buf_len >= 16); /* prevent integer underflow and general stupidity */ - buf_len -= 2; /* subtract 2 characters so we have room for \n\0 */ - buf_end = buf+buf_len; /* point *after* the last char we can write to */ - - n = log_prefix_(buf, buf_len, severity); - end_of_prefix = buf+n; - - if (log_domains_are_logged) { - char *cp = buf+n; - if (cp == buf_end) goto format_msg_no_room_for_domains; - *cp++ = '{'; - if (cp == buf_end) goto format_msg_no_room_for_domains; - cp = domain_to_string(domain, cp, (buf+buf_len-cp)); - if (cp == buf_end) goto format_msg_no_room_for_domains; - *cp++ = '}'; - if (cp == buf_end) goto format_msg_no_room_for_domains; - *cp++ = ' '; - if (cp == buf_end) goto format_msg_no_room_for_domains; - end_of_prefix = cp; - n = cp-buf; - format_msg_no_room_for_domains: - /* This will leave end_of_prefix and n unchanged, and thus cause - * whatever log domain string we had written to be clobbered. */ - ; - } - - if (funcname && should_log_function_name(domain, severity)) { - r = tor_snprintf(buf+n, buf_len-n, "%s(): ", funcname); - if (r<0) - n = strlen(buf); - else - n += r; - } - - if (domain == LD_BUG && buf_len-n > 6) { - memcpy(buf+n, "Bug: ", 6); - n += 5; - } - - r = tor_vsnprintf(buf+n,buf_len-n,format,ap); - if (r < 0) { - /* The message was too long; overwrite the end of the buffer with - * "[...truncated]" */ - if (buf_len >= TRUNCATED_STR_LEN) { - size_t offset = buf_len-TRUNCATED_STR_LEN; - /* We have an extra 2 characters after buf_len to hold the \n\0, - * so it's safe to add 1 to the size here. */ - strlcpy(buf+offset, TRUNCATED_STR, buf_len-offset+1); - } - /* Set 'n' to the end of the buffer, where we'll be writing \n\0. - * Since we already subtracted 2 from buf_len, this is safe.*/ - n = buf_len; - } else { - n += r; - if (suffix) { - size_t suffix_len = strlen(suffix); - if (buf_len-n >= suffix_len) { - memcpy(buf+n, suffix, suffix_len); - n += suffix_len; - } - } - } - buf[n]='\n'; - buf[n+1]='\0'; - *msg_len_out = n+1; - return end_of_prefix; -} - -/** Helper: sends a message to the appropriate logfiles, at loglevel - * severity. If provided, funcname is prepended to the - * message. The actual message is derived as from tor_snprintf(format,ap). - */ -static void -logv(int severity, log_domain_mask_t domain, const char *funcname, - const char *suffix, const char *format, va_list ap) -{ - char buf[10024]; - size_t msg_len = 0; - int formatted = 0; - logfile_t *lf; - char *end_of_prefix=NULL; - int callbacks_deferred = 0; - - /* Call assert, not tor_assert, since tor_assert calls log on failure. */ - assert(format); - /* check that severity is sane. Overrunning the masks array leads to - * interesting and hard to diagnose effects */ - assert(severity >= LOG_ERR && severity <= LOG_DEBUG); - LOCK_LOGS(); - - if ((! (domain & LD_NOCB)) && smartlist_len(pending_cb_messages)) - flush_pending_log_callbacks(); - - lf = logfiles; - while (lf) { - if (! (lf->severities->masks[SEVERITY_MASK_IDX(severity)] & domain)) { - lf = lf->next; - continue; - } - if (! (lf->fd >= 0 || lf->is_syslog || lf->callback)) { - lf = lf->next; - continue; - } - if (lf->seems_dead) { - lf = lf->next; - continue; - } - - if (!formatted) { - end_of_prefix = - format_msg(buf, sizeof(buf), domain, severity, funcname, suffix, - format, ap, &msg_len); - formatted = 1; - } - - if (lf->is_syslog) { -#ifdef HAVE_SYSLOG_H - char *m = end_of_prefix; -#ifdef MAXLINE - /* Some syslog implementations have limits on the length of what you can - * pass them, and some very old ones do not detect overflow so well. - * Regrettably, they call their maximum line length MAXLINE. */ -#if MAXLINE < 64 -#warn "MAXLINE is a very low number; it might not be from syslog.h after all" -#endif - if (msg_len >= MAXLINE) - m = tor_strndup(end_of_prefix, MAXLINE-1); -#endif - syslog(severity, "%s", m); -#ifdef MAXLINE - if (m != end_of_prefix) { - tor_free(m); - } -#endif -#endif - lf = lf->next; - continue; - } else if (lf->callback) { - if (domain & LD_NOCB) { - if (!callbacks_deferred && pending_cb_messages) { - pending_cb_message_t *msg = tor_malloc(sizeof(pending_cb_message_t)); - msg->severity = severity; - msg->domain = domain; - msg->msg = tor_strdup(end_of_prefix); - smartlist_add(pending_cb_messages, msg); - - callbacks_deferred = 1; - } - } else { - lf->callback(severity, domain, end_of_prefix); - } - lf = lf->next; - continue; - } - if (write_all(lf->fd, buf, msg_len, 0) < 0) { /* error */ - /* don't log the error! mark this log entry to be blown away, and - * continue. */ - lf->seems_dead = 1; - } - lf = lf->next; - } - UNLOCK_LOGS(); -} - -/** Output a message to the log. It gets logged to all logfiles that - * care about messages with severity in domain. The content - * is formatted printf-style based on format and extra arguments. - * */ -void -tor_log(int severity, log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (severity > log_global_min_severity_) - return; - va_start(ap,format); - logv(severity, domain, NULL, NULL, format, ap); - va_end(ap); -} - -/** Maximum number of fds that will get notifications if we crash */ -#define MAX_SIGSAFE_FDS 8 -/** Array of fds to log crash-style warnings to. */ -static int sigsafe_log_fds[MAX_SIGSAFE_FDS] = { STDERR_FILENO }; -/** The number of elements used in sigsafe_log_fds */ -static int n_sigsafe_log_fds = 1; - -/** Write s to each element of sigsafe_log_fds. Return 0 on success, -1 - * on failure. */ -static int -tor_log_err_sigsafe_write(const char *s) -{ - int i; - ssize_t r; - size_t len = strlen(s); - int err = 0; - for (i=0; i < n_sigsafe_log_fds; ++i) { - r = write(sigsafe_log_fds[i], s, len); - err += (r != (ssize_t)len); - } - return err ? -1 : 0; -} - -/** Given a list of string arguments ending with a NULL, writes them - * to our logs and to stderr (if possible). This function is safe to call - * from within a signal handler. */ -void -tor_log_err_sigsafe(const char *m, ...) -{ - va_list ap; - const char *x; - char timebuf[33]; - time_t now = time(NULL); - - if (!m) - return; - if (log_time_granularity >= 2000) { - int g = log_time_granularity / 1000; - now -= now % g; - } - timebuf[0] = now < 0 ? '-' : ' '; - if (now < 0) now = -now; - timebuf[1] = '\0'; - format_dec_number_sigsafe(now, timebuf+1, sizeof(timebuf)-1); - tor_log_err_sigsafe_write("\n==========================================" - "================== T="); - tor_log_err_sigsafe_write(timebuf); - tor_log_err_sigsafe_write("\n"); - tor_log_err_sigsafe_write(m); - va_start(ap, m); - while ((x = va_arg(ap, const char*))) { - tor_log_err_sigsafe_write(x); - } - va_end(ap); -} - -/** Set *out to a pointer to an array of the fds to log errors to from - * inside a signal handler. Return the number of elements in the array. */ -int -tor_log_get_sigsafe_err_fds(const int **out) -{ - *out = sigsafe_log_fds; - return n_sigsafe_log_fds; -} - -/** Helper function; return true iff the n-element array array - * contains item. */ -static int -int_array_contains(const int *array, int n, int item) -{ - int j; - for (j = 0; j < n; ++j) { - if (array[j] == item) - return 1; - } - return 0; -} - -/** Function to call whenever the list of logs changes to get ready to log - * from signal handlers. */ -void -tor_log_update_sigsafe_err_fds(void) -{ - const logfile_t *lf; - int found_real_stderr = 0; - - LOCK_LOGS(); - /* Reserve the first one for stderr. This is safe because when we daemonize, - * we dup2 /dev/null to stderr, */ - sigsafe_log_fds[0] = STDERR_FILENO; - n_sigsafe_log_fds = 1; - - for (lf = logfiles; lf; lf = lf->next) { - /* Don't try callback to the control port, or syslogs: We can't - * do them from a signal handler. Don't try stdout: we always do stderr. - */ - if (lf->is_temporary || lf->is_syslog || - lf->callback || lf->seems_dead || lf->fd < 0) - continue; - if (lf->severities->masks[SEVERITY_MASK_IDX(LOG_ERR)] & - (LD_BUG|LD_GENERAL)) { - if (lf->fd == STDERR_FILENO) - found_real_stderr = 1; - /* Avoid duplicates */ - if (int_array_contains(sigsafe_log_fds, n_sigsafe_log_fds, lf->fd)) - continue; - sigsafe_log_fds[n_sigsafe_log_fds++] = lf->fd; - if (n_sigsafe_log_fds == MAX_SIGSAFE_FDS) - break; - } - } - - if (!found_real_stderr && - int_array_contains(sigsafe_log_fds, n_sigsafe_log_fds, STDOUT_FILENO)) { - /* Don't use a virtual stderr when we're also logging to stdout. */ - assert(n_sigsafe_log_fds >= 2); /* Don't use assert inside log functions*/ - sigsafe_log_fds[0] = sigsafe_log_fds[--n_sigsafe_log_fds]; - } - - UNLOCK_LOGS(); -} - -/** Output a message to the log, prefixed with a function name fn. */ -#ifdef __GNUC__ -/** GCC-based implementation of the log_fn backend, used when we have - * variadic macros. All arguments are as for log_fn, except for - * fn, which is the name of the calling functions. */ -void -log_fn_(int severity, log_domain_mask_t domain, const char *fn, - const char *format, ...) -{ - va_list ap; - if (severity > log_global_min_severity_) - return; - va_start(ap,format); - logv(severity, domain, fn, NULL, format, ap); - va_end(ap); -} -void -log_fn_ratelim_(ratelim_t *ratelim, int severity, log_domain_mask_t domain, - const char *fn, const char *format, ...) -{ - va_list ap; - char *m; - if (severity > log_global_min_severity_) - return; - m = rate_limit_log(ratelim, approx_time()); - if (m == NULL) - return; - va_start(ap, format); - logv(severity, domain, fn, m, format, ap); - va_end(ap); - tor_free(m); -} -#else -/** @{ */ -/** Variant implementation of log_fn, log_debug, log_info,... for C compilers - * without variadic macros. In this case, the calling function sets - * log_fn_function_name_ to the name of the function, then invokes the - * appropriate log_fn_, log_debug_, etc. */ -const char *log_fn_function_name_=NULL; -void -log_fn_(int severity, log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (severity > log_global_min_severity_) - return; - va_start(ap,format); - logv(severity, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -void -log_fn_ratelim_(ratelim_t *ratelim, int severity, log_domain_mask_t domain, - const char *format, ...) -{ - va_list ap; - char *m; - if (severity > log_global_min_severity_) - return; - m = rate_limit_log(ratelim, approx_time()); - if (m == NULL) - return; - va_start(ap, format); - logv(severity, domain, log_fn_function_name_, m, format, ap); - va_end(ap); - tor_free(m); -} -void -log_debug_(log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - /* For GCC we do this check in the macro. */ - if (PREDICT_LIKELY(LOG_DEBUG > log_global_min_severity_)) - return; - va_start(ap,format); - logv(LOG_DEBUG, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -void -log_info_(log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (LOG_INFO > log_global_min_severity_) - return; - va_start(ap,format); - logv(LOG_INFO, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -void -log_notice_(log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (LOG_NOTICE > log_global_min_severity_) - return; - va_start(ap,format); - logv(LOG_NOTICE, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -void -log_warn_(log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (LOG_WARN > log_global_min_severity_) - return; - va_start(ap,format); - logv(LOG_WARN, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -void -log_err_(log_domain_mask_t domain, const char *format, ...) -{ - va_list ap; - if (LOG_ERR > log_global_min_severity_) - return; - va_start(ap,format); - logv(LOG_ERR, domain, log_fn_function_name_, NULL, format, ap); - va_end(ap); - log_fn_function_name_ = NULL; -} -/** @} */ -#endif - -/** Free all storage held by victim. */ -static void -log_free(logfile_t *victim) -{ - if (!victim) - return; - tor_free(victim->severities); - tor_free(victim->filename); - tor_free(victim); -} - -/** Close all open log files, and free other static memory. */ -void -logs_free_all(void) -{ - logfile_t *victim, *next; - smartlist_t *messages; - LOCK_LOGS(); - next = logfiles; - logfiles = NULL; - messages = pending_cb_messages; - pending_cb_messages = NULL; - UNLOCK_LOGS(); - while (next) { - victim = next; - next = next->next; - close_log(victim); - log_free(victim); - } - tor_free(appname); - - SMARTLIST_FOREACH(messages, pending_cb_message_t *, msg, { - tor_free(msg->msg); - tor_free(msg); - }); - smartlist_free(messages); - - /* We _could_ destroy the log mutex here, but that would screw up any logs - * that happened between here and the end of execution. */ -} - -/** Remove and free the log entry victim from the linked-list - * logfiles (it is probably present, but it might not be due to thread - * racing issues). After this function is called, the caller shouldn't - * refer to victim anymore. - * - * Long-term, we need to do something about races in the log subsystem - * in general. See bug 222 for more details. - */ -static void -delete_log(logfile_t *victim) -{ - logfile_t *tmpl; - if (victim == logfiles) - logfiles = victim->next; - else { - for (tmpl = logfiles; tmpl && tmpl->next != victim; tmpl=tmpl->next) ; -// tor_assert(tmpl); -// tor_assert(tmpl->next == victim); - if (!tmpl) - return; - tmpl->next = victim->next; - } - log_free(victim); -} - -/** Helper: release system resources (but not memory) held by a single - * logfile_t. */ -static void -close_log(logfile_t *victim) -{ - if (victim->needs_close && victim->fd >= 0) { - close(victim->fd); - victim->fd = -1; - } else if (victim->is_syslog) { -#ifdef HAVE_SYSLOG_H - if (--syslog_count == 0) { - /* There are no other syslogs; close the logging facility. */ - closelog(); - } -#endif - } -} - -/** Adjust a log severity configuration in severity_out to contain - * every domain between loglevelMin and loglevelMax, inclusive. - */ -void -set_log_severity_config(int loglevelMin, int loglevelMax, - log_severity_list_t *severity_out) -{ - int i; - tor_assert(loglevelMin >= loglevelMax); - tor_assert(loglevelMin >= LOG_ERR && loglevelMin <= LOG_DEBUG); - tor_assert(loglevelMax >= LOG_ERR && loglevelMax <= LOG_DEBUG); - memset(severity_out, 0, sizeof(log_severity_list_t)); - for (i = loglevelMin; i >= loglevelMax; --i) { - severity_out->masks[SEVERITY_MASK_IDX(i)] = ~0u; - } -} - -/** Add a log handler named name to send all messages in severity - * to fd. Copies severity. Helper: does no locking. */ -static void -add_stream_log_impl(const log_severity_list_t *severity, - const char *name, int fd) -{ - logfile_t *lf; - lf = tor_malloc_zero(sizeof(logfile_t)); - lf->fd = fd; - lf->filename = tor_strdup(name); - lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); - lf->next = logfiles; - - logfiles = lf; - log_global_min_severity_ = get_min_log_level(); -} - -/** Add a log handler named name to send all messages in severity - * to fd. Steals a reference to severity; the caller must - * not use it after calling this function. */ -void -add_stream_log(const log_severity_list_t *severity, const char *name, int fd) -{ - LOCK_LOGS(); - add_stream_log_impl(severity, name, fd); - UNLOCK_LOGS(); -} - -/** Initialize the global logging facility */ -void -init_logging(void) -{ - if (!log_mutex_initialized) { - tor_mutex_init(&log_mutex); - log_mutex_initialized = 1; - } - if (pending_cb_messages == NULL) - pending_cb_messages = smartlist_new(); -} - -/** Set whether we report logging domains as a part of our log messages. - */ -void -logs_set_domain_logging(int enabled) -{ - LOCK_LOGS(); - log_domains_are_logged = enabled; - UNLOCK_LOGS(); -} - -/** Add a log handler to receive messages during startup (before the real - * logs are initialized). - */ -void -add_temp_log(int min_severity) -{ - log_severity_list_t *s = tor_malloc_zero(sizeof(log_severity_list_t)); - set_log_severity_config(min_severity, LOG_ERR, s); - LOCK_LOGS(); - add_stream_log_impl(s, "", fileno(stdout)); - tor_free(s); - logfiles->is_temporary = 1; - UNLOCK_LOGS(); -} - -/** - * Add a log handler to send messages in severity - * to the function cb. - */ -int -add_callback_log(const log_severity_list_t *severity, log_callback cb) -{ - logfile_t *lf; - lf = tor_malloc_zero(sizeof(logfile_t)); - lf->fd = -1; - lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); - lf->filename = tor_strdup(""); - lf->callback = cb; - lf->next = logfiles; - - LOCK_LOGS(); - logfiles = lf; - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); - return 0; -} - -/** Adjust the configured severity of any logs whose callback function is - * cb. */ -void -change_callback_log_severity(int loglevelMin, int loglevelMax, - log_callback cb) -{ - logfile_t *lf; - log_severity_list_t severities; - set_log_severity_config(loglevelMin, loglevelMax, &severities); - LOCK_LOGS(); - for (lf = logfiles; lf; lf = lf->next) { - if (lf->callback == cb) { - memcpy(lf->severities, &severities, sizeof(severities)); - } - } - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); -} - -/** If there are any log messages that were generated with LD_NOCB waiting to - * be sent to callback-based loggers, send them now. */ -void -flush_pending_log_callbacks(void) -{ - logfile_t *lf; - smartlist_t *messages, *messages_tmp; - - LOCK_LOGS(); - if (0 == smartlist_len(pending_cb_messages)) { - UNLOCK_LOGS(); - return; - } - - messages = pending_cb_messages; - pending_cb_messages = smartlist_new(); - do { - SMARTLIST_FOREACH_BEGIN(messages, pending_cb_message_t *, msg) { - const int severity = msg->severity; - const int domain = msg->domain; - for (lf = logfiles; lf; lf = lf->next) { - if (! lf->callback || lf->seems_dead || - ! (lf->severities->masks[SEVERITY_MASK_IDX(severity)] & domain)) { - continue; - } - lf->callback(severity, domain, msg->msg); - } - tor_free(msg->msg); - tor_free(msg); - } SMARTLIST_FOREACH_END(msg); - smartlist_clear(messages); - - messages_tmp = pending_cb_messages; - pending_cb_messages = messages; - messages = messages_tmp; - } while (smartlist_len(messages)); - - smartlist_free(messages); - - UNLOCK_LOGS(); -} - -/** Close any log handlers added by add_temp_log() or marked by - * mark_logs_temp(). */ -void -close_temp_logs(void) -{ - logfile_t *lf, **p; - - LOCK_LOGS(); - for (p = &logfiles; *p; ) { - if ((*p)->is_temporary) { - lf = *p; - /* we use *p here to handle the edge case of the head of the list */ - *p = (*p)->next; - close_log(lf); - log_free(lf); - } else { - p = &((*p)->next); - } - } - - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); -} - -/** Make all currently temporary logs (set to be closed by close_temp_logs) - * live again, and close all non-temporary logs. */ -void -rollback_log_changes(void) -{ - logfile_t *lf; - LOCK_LOGS(); - for (lf = logfiles; lf; lf = lf->next) - lf->is_temporary = ! lf->is_temporary; - UNLOCK_LOGS(); - close_temp_logs(); -} - -/** Configure all log handles to be closed by close_temp_logs(). */ -void -mark_logs_temp(void) -{ - logfile_t *lf; - LOCK_LOGS(); - for (lf = logfiles; lf; lf = lf->next) - lf->is_temporary = 1; - UNLOCK_LOGS(); -} - -/** - * Add a log handler to send messages to filename. If opening the - * logfile fails, -1 is returned and errno is set appropriately (by open(2)). - */ -int -add_file_log(const log_severity_list_t *severity, const char *filename) -{ - int fd; - logfile_t *lf; - - fd = tor_open_cloexec(filename, O_WRONLY|O_CREAT|O_APPEND, 0644); - if (fd<0) - return -1; - if (tor_fd_seekend(fd)<0) { - close(fd); - return -1; - } - - LOCK_LOGS(); - add_stream_log_impl(severity, filename, fd); - logfiles->needs_close = 1; - lf = logfiles; - log_global_min_severity_ = get_min_log_level(); - - if (log_tor_version(lf, 0) < 0) { - delete_log(lf); - } - UNLOCK_LOGS(); - - return 0; -} - -#ifdef HAVE_SYSLOG_H -/** - * Add a log handler to send messages to they system log facility. - */ -int -add_syslog_log(const log_severity_list_t *severity) -{ - logfile_t *lf; - if (syslog_count++ == 0) - /* This is the first syslog. */ - openlog("Tor", LOG_PID | LOG_NDELAY, LOGFACILITY); - - lf = tor_malloc_zero(sizeof(logfile_t)); - lf->fd = -1; - lf->severities = tor_memdup(severity, sizeof(log_severity_list_t)); - lf->filename = tor_strdup(""); - lf->is_syslog = 1; - - LOCK_LOGS(); - lf->next = logfiles; - logfiles = lf; - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); - return 0; -} -#endif - -/** If level is a valid log severity, return the corresponding - * numeric value. Otherwise, return -1. */ -int -parse_log_level(const char *level) -{ - if (!strcasecmp(level, "err")) - return LOG_ERR; - if (!strcasecmp(level, "warn")) - return LOG_WARN; - if (!strcasecmp(level, "notice")) - return LOG_NOTICE; - if (!strcasecmp(level, "info")) - return LOG_INFO; - if (!strcasecmp(level, "debug")) - return LOG_DEBUG; - return -1; -} - -/** Return the string equivalent of a given log level. */ -const char * -log_level_to_string(int level) -{ - return sev_to_string(level); -} - -/** NULL-terminated array of names for log domains such that domain_list[dom] - * is a description of dom. */ -static const char *domain_list[] = { - "GENERAL", "CRYPTO", "NET", "CONFIG", "FS", "PROTOCOL", "MM", - "HTTP", "APP", "CONTROL", "CIRC", "REND", "BUG", "DIR", "DIRSERV", - "OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL", NULL -}; - -/** Return a bitmask for the log domain for which domain is the name, - * or 0 if there is no such name. */ -static log_domain_mask_t -parse_log_domain(const char *domain) -{ - int i; - for (i=0; domain_list[i]; ++i) { - if (!strcasecmp(domain, domain_list[i])) - return (1u<= N_LOGGING_DOMAINS) { - tor_snprintf(buf, buflen, "", (long)domain); - return buf+strlen(buf); - } - d = domain_list[bit]; - n = strlcpy(cp, d, eos-cp); - if (n >= buflen) { - tor_snprintf(buf, buflen, "", (long)domain); - return buf+strlen(buf); - } - cp += n; - domain &= ~(1<cfg_ptr. Advance cfg_ptr after - * the end of the severityPattern. Set the value of severity_out to - * the parsed pattern. Return 0 on success, -1 on failure. - * - * The syntax for a SeverityPattern is: - *
    - *   SeverityPattern = *(DomainSeverity SP)* DomainSeverity
    - *   DomainSeverity = (DomainList SP)? SeverityRange
    - *   SeverityRange = MinSeverity ("-" MaxSeverity )?
    - *   DomainList = "[" (SP? DomainSpec SP? ",") SP? DomainSpec "]"
    - *   DomainSpec = "*" | Domain | "~" Domain
    - * 
    - * A missing MaxSeverity defaults to ERR. Severities and domains are - * case-insensitive. "~" indicates negation for a domain; negation happens - * last inside a DomainList. Only one SeverityRange without a DomainList is - * allowed per line. - */ -int -parse_log_severity_config(const char **cfg_ptr, - log_severity_list_t *severity_out) -{ - const char *cfg = *cfg_ptr; - int got_anything = 0; - int got_an_unqualified_range = 0; - memset(severity_out, 0, sizeof(*severity_out)); - - cfg = eat_whitespace(cfg); - while (*cfg) { - const char *dash, *space; - char *sev_lo, *sev_hi; - int low, high, i; - log_domain_mask_t domains = ~0u; - - if (*cfg == '[') { - int err = 0; - char *domains_str; - smartlist_t *domains_list; - log_domain_mask_t neg_domains = 0; - const char *closebracket = strchr(cfg, ']'); - if (!closebracket) - return -1; - domains = 0; - domains_str = tor_strndup(cfg+1, closebracket-cfg-1); - domains_list = smartlist_new(); - smartlist_split_string(domains_list, domains_str, ",", SPLIT_SKIP_SPACE, - -1); - tor_free(domains_str); - SMARTLIST_FOREACH_BEGIN(domains_list, const char *, domain) { - if (!strcmp(domain, "*")) { - domains = ~0u; - } else { - int d; - int negate=0; - if (*domain == '~') { - negate = 1; - ++domain; - } - d = parse_log_domain(domain); - if (!d) { - log_warn(LD_CONFIG, "No such logging domain as %s", domain); - err = 1; - } else { - if (negate) - neg_domains |= d; - else - domains |= d; - } - } - } SMARTLIST_FOREACH_END(domain); - SMARTLIST_FOREACH(domains_list, char *, d, tor_free(d)); - smartlist_free(domains_list); - if (err) - return -1; - if (domains == 0 && neg_domains) - domains = ~neg_domains; - else - domains &= ~neg_domains; - cfg = eat_whitespace(closebracket+1); - } else { - ++got_an_unqualified_range; - } - if (!strcasecmpstart(cfg, "file") || - !strcasecmpstart(cfg, "stderr") || - !strcasecmpstart(cfg, "stdout") || - !strcasecmpstart(cfg, "syslog")) { - goto done; - } - if (got_an_unqualified_range > 1) - return -1; - - space = strchr(cfg, ' '); - dash = strchr(cfg, '-'); - if (!space) - space = strchr(cfg, '\0'); - if (dash && dash < space) { - sev_lo = tor_strndup(cfg, dash-cfg); - sev_hi = tor_strndup(dash+1, space-(dash+1)); - } else { - sev_lo = tor_strndup(cfg, space-cfg); - sev_hi = tor_strdup("ERR"); - } - low = parse_log_level(sev_lo); - high = parse_log_level(sev_hi); - tor_free(sev_lo); - tor_free(sev_hi); - if (low == -1) - return -1; - if (high == -1) - return -1; - - got_anything = 1; - for (i=low; i >= high; --i) - severity_out->masks[SEVERITY_MASK_IDX(i)] |= domains; - - cfg = eat_whitespace(space); - } - - done: - *cfg_ptr = cfg; - return got_anything ? 0 : -1; -} - -/** Return the least severe log level that any current log is interested in. */ -int -get_min_log_level(void) -{ - logfile_t *lf; - int i; - int min = LOG_ERR; - for (lf = logfiles; lf; lf = lf->next) { - for (i = LOG_DEBUG; i > min; --i) - if (lf->severities->masks[SEVERITY_MASK_IDX(i)]) - min = i; - } - return min; -} - -/** Switch all logs to output at most verbose level. */ -void -switch_logs_debug(void) -{ - logfile_t *lf; - int i; - LOCK_LOGS(); - for (lf = logfiles; lf; lf=lf->next) { - for (i = LOG_DEBUG; i >= LOG_ERR; --i) - lf->severities->masks[SEVERITY_MASK_IDX(i)] = ~0u; - } - log_global_min_severity_ = get_min_log_level(); - UNLOCK_LOGS(); -} - -#if 0 -static void -dump_log_info(logfile_t *lf) -{ - const char *tp; - - if (lf->filename) { - printf("=== log into \"%s\" (%s-%s) (%stemporary)\n", lf->filename, - sev_to_string(lf->min_loglevel), - sev_to_string(lf->max_loglevel), - lf->is_temporary?"":"not "); - } else if (lf->is_syslog) { - printf("=== syslog (%s-%s) (%stemporary)\n", - sev_to_string(lf->min_loglevel), - sev_to_string(lf->max_loglevel), - lf->is_temporary?"":"not "); - } else { - printf("=== log (%s-%s) (%stemporary)\n", - sev_to_string(lf->min_loglevel), - sev_to_string(lf->max_loglevel), - lf->is_temporary?"":"not "); - } -} - -void -describe_logs(void) -{ - logfile_t *lf; - printf("==== BEGIN LOGS ====\n"); - for (lf = logfiles; lf; lf = lf->next) - dump_log_info(lf); - printf("==== END LOGS ====\n"); -} -#endif - diff --git a/src/tor/memarea.c b/src/tor/memarea.c deleted file mode 100644 index 96f95bf0d..000000000 --- a/src/tor/memarea.c +++ /dev/null @@ -1,328 +0,0 @@ -/* Copyright (c) 2008-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** \file memarea.c - * \brief Implementation for memarea_t, an allocator for allocating lots of - * small objects that will be freed all at once. - */ - -#include "orconfig.h" -#include -#include "memarea.h" -#include "tor_util.h" -#include "tor_compat.h" -#include "torlog.h" - -/** If true, we try to detect any attempts to write beyond the length of a - * memarea. */ -#define USE_SENTINELS - -/** All returned pointers should be aligned to the nearest multiple of this - * value. */ -#define MEMAREA_ALIGN SIZEOF_VOID_P - -#if MEMAREA_ALIGN == 4 -#define MEMAREA_ALIGN_MASK 3lu -#elif MEMAREA_ALIGN == 8 -#define MEMAREA_ALIGN_MASK 7lu -#else -#error "void* is neither 4 nor 8 bytes long. I don't know how to align stuff." -#endif - -#ifdef USE_SENTINELS -/** Magic value that we stick at the end of a memarea so we can make sure - * there are no run-off-the-end bugs. */ -#define SENTINEL_VAL 0x90806622u -/** How many bytes per area do we devote to the sentinel? */ -#define SENTINEL_LEN sizeof(uint32_t) -/** Given a mem_area_chunk_t with SENTINEL_LEN extra bytes allocated at the - * end, set those bytes. */ -#define SET_SENTINEL(chunk) \ - STMT_BEGIN \ - set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \ - STMT_END -/** Assert that the sentinel on a memarea is set correctly. */ -#define CHECK_SENTINEL(chunk) \ - STMT_BEGIN \ - uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]); \ - tor_assert(sent_val == SENTINEL_VAL); \ - STMT_END -#else -#define SENTINEL_LEN 0 -#define SET_SENTINEL(chunk) STMT_NIL -#define CHECK_SENTINEL(chunk) STMT_NIL -#endif - -/** Increment ptr until it is aligned to MEMAREA_ALIGN. */ -static INLINE void * -realign_pointer(void *ptr) -{ - uintptr_t x = (uintptr_t)ptr; - x = (x+MEMAREA_ALIGN_MASK) & ~MEMAREA_ALIGN_MASK; - /* Reinstate this if bug 930 ever reappears - tor_assert(((void*)x) >= ptr); - */ - return (void*)x; -} - -/** Implements part of a memarea. New memory is carved off from chunk->mem in - * increasing order until a request is too big, at which point a new chunk is - * allocated. */ -typedef struct memarea_chunk_t { - /** Next chunk in this area. Only kept around so we can free it. */ - struct memarea_chunk_t *next_chunk; - size_t mem_size; /**< How much RAM is available in u.mem, total? */ - char *next_mem; /**< Next position in u.mem to allocate data at. If it's - * greater than or equal to mem+mem_size, this chunk is - * full. */ - union { - char mem[1]; /**< Memory space in this chunk. */ - void *void_for_alignment_; /**< Dummy; used to make sure mem is aligned. */ - } u; -} memarea_chunk_t; - -/** How many bytes are needed for overhead before we get to the memory part - * of a chunk? */ -#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, u) - -/** What's the smallest that we'll allocate a chunk? */ -#define CHUNK_SIZE 4096 - -/** A memarea_t is an allocation region for a set of small memory requests - * that will all be freed at once. */ -struct memarea_t { - memarea_chunk_t *first; /**< Top of the chunk stack: never NULL. */ -}; - -/** How many chunks will we put into the freelist before freeing them? */ -#define MAX_FREELIST_LEN 4 -/** The number of memarea chunks currently in our freelist. */ -static int freelist_len=0; -/** A linked list of unused memory area chunks. Used to prevent us from - * spinning in malloc/free loops. */ -static memarea_chunk_t *freelist = NULL; - -/** Helper: allocate a new memarea chunk of around chunk_size bytes. */ -static memarea_chunk_t * -alloc_chunk(size_t sz, int freelist_ok) -{ - tor_assert(sz < SIZE_T_CEILING); - if (freelist && freelist_ok) { - memarea_chunk_t *res = freelist; - freelist = res->next_chunk; - res->next_chunk = NULL; - --freelist_len; - CHECK_SENTINEL(res); - return res; - } else { - size_t chunk_size = freelist_ok ? CHUNK_SIZE : sz; - memarea_chunk_t *res; - chunk_size += SENTINEL_LEN; - res = tor_malloc(chunk_size); - res->next_chunk = NULL; - res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN; - res->next_mem = res->u.mem; - tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN == - ((char*)res)+chunk_size); - tor_assert(realign_pointer(res->next_mem) == res->next_mem); - SET_SENTINEL(res); - return res; - } -} - -/** Release chunk from a memarea, either by adding it to the freelist - * or by freeing it if the freelist is already too big. */ -static void -chunk_free_unchecked(memarea_chunk_t *chunk) -{ - CHECK_SENTINEL(chunk); - if (freelist_len < MAX_FREELIST_LEN) { - ++freelist_len; - chunk->next_chunk = freelist; - freelist = chunk; - chunk->next_mem = chunk->u.mem; - } else { - tor_free(chunk); - } -} - -/** Allocate and return new memarea. */ -memarea_t * -memarea_new(void) -{ - memarea_t *head = tor_malloc(sizeof(memarea_t)); - head->first = alloc_chunk(CHUNK_SIZE, 1); - return head; -} - -/** Free area, invalidating all pointers returned from memarea_alloc() - * and friends for this area */ -void -memarea_drop_all(memarea_t *area) -{ - memarea_chunk_t *chunk, *next; - for (chunk = area->first; chunk; chunk = next) { - next = chunk->next_chunk; - chunk_free_unchecked(chunk); - } - area->first = NULL; /*fail fast on */ - tor_free(area); -} - -/** Forget about having allocated anything in area, and free some of - * the backing storage associated with it, as appropriate. Invalidates all - * pointers returned from memarea_alloc() for this area. */ -void -memarea_clear(memarea_t *area) -{ - memarea_chunk_t *chunk, *next; - if (area->first->next_chunk) { - for (chunk = area->first->next_chunk; chunk; chunk = next) { - next = chunk->next_chunk; - chunk_free_unchecked(chunk); - } - area->first->next_chunk = NULL; - } - area->first->next_mem = area->first->u.mem; -} - -/** Remove all unused memarea chunks from the internal freelist. */ -void -memarea_clear_freelist(void) -{ - memarea_chunk_t *chunk, *next; - freelist_len = 0; - for (chunk = freelist; chunk; chunk = next) { - next = chunk->next_chunk; - tor_free(chunk); - } - freelist = NULL; -} - -/** Return true iff p is in a range that has been returned by an - * allocation from area. */ -int -memarea_owns_ptr(const memarea_t *area, const void *p) -{ - memarea_chunk_t *chunk; - const char *ptr = p; - for (chunk = area->first; chunk; chunk = chunk->next_chunk) { - if (ptr >= chunk->u.mem && ptr < chunk->next_mem) - return 1; - } - return 0; -} - -/** Return a pointer to a chunk of memory in area of at least sz - * bytes. sz should be significantly smaller than the area's chunk - * size, though we can deal if it isn't. */ -void * -memarea_alloc(memarea_t *area, size_t sz) -{ - memarea_chunk_t *chunk = area->first; - char *result; - tor_assert(chunk); - CHECK_SENTINEL(chunk); - tor_assert(sz < SIZE_T_CEILING); - if (sz == 0) - sz = 1; - if (chunk->next_mem+sz > chunk->u.mem+chunk->mem_size) { - if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) { - /* This allocation is too big. Stick it in a special chunk, and put - * that chunk second in the list. */ - memarea_chunk_t *new_chunk = alloc_chunk(sz+CHUNK_HEADER_SIZE, 0); - new_chunk->next_chunk = chunk->next_chunk; - chunk->next_chunk = new_chunk; - chunk = new_chunk; - } else { - memarea_chunk_t *new_chunk = alloc_chunk(CHUNK_SIZE, 1); - new_chunk->next_chunk = chunk; - area->first = chunk = new_chunk; - } - tor_assert(chunk->mem_size >= sz); - } - result = chunk->next_mem; - chunk->next_mem = chunk->next_mem + sz; - /* Reinstate these if bug 930 ever comes back - tor_assert(chunk->next_mem >= chunk->u.mem); - tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size); - */ - chunk->next_mem = realign_pointer(chunk->next_mem); - return result; -} - -/** As memarea_alloc(), but clears the memory it returns. */ -void * -memarea_alloc_zero(memarea_t *area, size_t sz) -{ - void *result = memarea_alloc(area, sz); - memset(result, 0, sz); - return result; -} - -/** As memdup, but returns the memory from area. */ -void * -memarea_memdup(memarea_t *area, const void *s, size_t n) -{ - char *result = memarea_alloc(area, n); - memcpy(result, s, n); - return result; -} - -/** As strdup, but returns the memory from area. */ -char * -memarea_strdup(memarea_t *area, const char *s) -{ - return memarea_memdup(area, s, strlen(s)+1); -} - -/** As strndup, but returns the memory from area. */ -char * -memarea_strndup(memarea_t *area, const char *s, size_t n) -{ - size_t ln; - char *result; - const char *cp, *end = s+n; - tor_assert(n < SIZE_T_CEILING); - for (cp = s; cp < end && *cp; ++cp) - ; - /* cp now points to s+n, or to the 0 in the string. */ - ln = cp-s; - result = memarea_alloc(area, ln+1); - memcpy(result, s, ln); - result[ln]='\0'; - return result; -} - -/** Set allocated_out to the number of bytes allocated in area, - * and used_out to the number of bytes currently used. */ -void -memarea_get_stats(memarea_t *area, size_t *allocated_out, size_t *used_out) -{ - size_t a = 0, u = 0; - memarea_chunk_t *chunk; - for (chunk = area->first; chunk; chunk = chunk->next_chunk) { - CHECK_SENTINEL(chunk); - a += CHUNK_HEADER_SIZE + chunk->mem_size; - tor_assert(chunk->next_mem >= chunk->u.mem); - u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->u.mem); - } - *allocated_out = a; - *used_out = u; -} - -/** Assert that area is okay. */ -void -memarea_assert_ok(memarea_t *area) -{ - memarea_chunk_t *chunk; - tor_assert(area->first); - - for (chunk = area->first; chunk; chunk = chunk->next_chunk) { - CHECK_SENTINEL(chunk); - tor_assert(chunk->next_mem >= chunk->u.mem); - tor_assert(chunk->next_mem <= - (char*) realign_pointer(chunk->u.mem+chunk->mem_size)); - } -} - diff --git a/src/tor/memarea.h b/src/tor/memarea.h deleted file mode 100644 index 8b88585d3..000000000 --- a/src/tor/memarea.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2008-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -/* Tor dependencies */ - -#ifndef TOR_MEMAREA_H -#define TOR_MEMAREA_H - -typedef struct memarea_t memarea_t; - -memarea_t *memarea_new(void); -void memarea_drop_all(memarea_t *area); -void memarea_clear(memarea_t *area); -int memarea_owns_ptr(const memarea_t *area, const void *ptr); -void *memarea_alloc(memarea_t *area, size_t sz); -void *memarea_alloc_zero(memarea_t *area, size_t sz); -void *memarea_memdup(memarea_t *area, const void *s, size_t n); -char *memarea_strdup(memarea_t *area, const char *s); -char *memarea_strndup(memarea_t *area, const char *s, size_t n); -void memarea_get_stats(memarea_t *area, - size_t *allocated_out, size_t *used_out); -void memarea_clear_freelist(void); -void memarea_assert_ok(memarea_t *area); - -#endif - diff --git a/src/tor/mempool.c b/src/tor/mempool.c deleted file mode 100644 index 4102aa432..000000000 --- a/src/tor/mempool.c +++ /dev/null @@ -1,628 +0,0 @@ -/* Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ -#if 1 -/* Tor dependencies */ -#include "orconfig.h" -#endif - -#include -#include -#include "torint.h" -#include "crypto.h" -#define MEMPOOL_PRIVATE -#include "mempool.h" - -/* OVERVIEW: - * - * This is an implementation of memory pools for Tor cells. It may be - * useful for you too. - * - * Generally, a memory pool is an allocation strategy optimized for large - * numbers of identically-sized objects. Rather than the elaborate arena - * and coalescing strategies you need to get good performance for a - * general-purpose malloc(), pools use a series of large memory "chunks", - * each of which is carved into a bunch of smaller "items" or - * "allocations". - * - * To get decent performance, you need to: - * - Minimize the number of times you hit the underlying allocator. - * - Try to keep accesses as local in memory as possible. - * - Try to keep the common case fast. - * - * Our implementation uses three lists of chunks per pool. Each chunk can - * be either "full" (no more room for items); "empty" (no items); or - * "used" (not full, not empty). There are independent doubly-linked - * lists for each state. - * - * CREDIT: - * - * I wrote this after looking at 3 or 4 other pooling allocators, but - * without copying. The strategy this most resembles (which is funny, - * since that's the one I looked at longest ago) is the pool allocator - * underlying Python's obmalloc code. Major differences from obmalloc's - * pools are: - * - We don't even try to be threadsafe. - * - We only handle objects of one size. - * - Our list of empty chunks is doubly-linked, not singly-linked. - * (This could change pretty easily; it's only doubly-linked for - * consistency.) - * - We keep a list of full chunks (so we can have a "nuke everything" - * function). Obmalloc's pools leave full chunks to float unanchored. - * - * LIMITATIONS: - * - Not even slightly threadsafe. - * - Likes to have lots of items per chunks. - * - One pointer overhead per allocated thing. (The alternative is - * something like glib's use of an RB-tree to keep track of what - * chunk any given piece of memory is in.) - * - Only aligns allocated things to void* level: redefine ALIGNMENT_TYPE - * if you need doubles. - * - Could probably be optimized a bit; the representation contains - * a bit more info than it really needs to have. - */ - -#if 1 -/* Tor dependencies */ -#include "tor_util.h" -#include "tor_compat.h" -#include "torlog.h" -#define ALLOC(x) tor_malloc(x) -#define FREE(x) tor_free(x) -#define ASSERT(x) tor_assert(x) -#undef ALLOC_CAN_RETURN_NULL -#define TOR -/* End Tor dependencies */ -#else -/* If you're not building this as part of Tor, you'll want to define the - * following macros. For now, these should do as defaults. - */ -#include -#define PREDICT_UNLIKELY(x) (x) -#define PREDICT_LIKELY(x) (x) -#define ALLOC(x) malloc(x) -#define FREE(x) free(x) -#define STRUCT_OFFSET(tp, member) \ - ((off_t) (((char*)&((tp*)0)->member)-(char*)0)) -#define ASSERT(x) assert(x) -#define ALLOC_CAN_RETURN_NULL -#endif - -/* Tuning parameters */ -/** Largest type that we need to ensure returned memory items are aligned to. - * Change this to "double" if we need to be safe for structs with doubles. */ -#define ALIGNMENT_TYPE void * -/** Increment that we need to align allocated. */ -#define ALIGNMENT sizeof(ALIGNMENT_TYPE) -/** Largest memory chunk that we should allocate. */ -#define MAX_CHUNK (8*(1L<<20)) -/** Smallest memory chunk size that we should allocate. */ -#define MIN_CHUNK 4096 - -typedef struct mp_allocated_t mp_allocated_t; -typedef struct mp_chunk_t mp_chunk_t; - -/** Holds a single allocated item, allocated as part of a chunk. */ -struct mp_allocated_t { - /** The chunk that this item is allocated in. This adds overhead to each - * allocated item, thus making this implementation inappropriate for - * very small items. */ - mp_chunk_t *in_chunk; - union { - /** If this item is free, the next item on the free list. */ - mp_allocated_t *next_free; - /** If this item is not free, the actual memory contents of this item. - * (Not actual size.) */ - char mem[1]; - /** An extra element to the union to insure correct alignment. */ - ALIGNMENT_TYPE dummy_; - } u; -}; - -/** 'Magic' value used to detect memory corruption. */ -#define MP_CHUNK_MAGIC 0x09870123 - -/** A chunk of memory. Chunks come from malloc; we use them */ -struct mp_chunk_t { - unsigned long magic; /**< Must be MP_CHUNK_MAGIC if this chunk is valid. */ - mp_chunk_t *next; /**< The next free, used, or full chunk in sequence. */ - mp_chunk_t *prev; /**< The previous free, used, or full chunk in sequence. */ - mp_pool_t *pool; /**< The pool that this chunk is part of. */ - /** First free item in the freelist for this chunk. Note that this may be - * NULL even if this chunk is not at capacity: if so, the free memory at - * next_mem has not yet been carved into items. - */ - mp_allocated_t *first_free; - int n_allocated; /**< Number of currently allocated items in this chunk. */ - int capacity; /**< Number of items that can be fit into this chunk. */ - size_t mem_size; /**< Number of usable bytes in mem. */ - char *next_mem; /**< Pointer into part of mem not yet carved up. */ - char mem[FLEXIBLE_ARRAY_MEMBER]; /**< Storage for this chunk. */ -}; - -/** Number of extra bytes needed beyond mem_size to allocate a chunk. */ -#define CHUNK_OVERHEAD STRUCT_OFFSET(mp_chunk_t, mem[0]) - -/** Given a pointer to a mp_allocated_t, return a pointer to the memory - * item it holds. */ -#define A2M(a) (&(a)->u.mem) -/** Given a pointer to a memory_item_t, return a pointer to its enclosing - * mp_allocated_t. */ -#define M2A(p) ( ((char*)p) - STRUCT_OFFSET(mp_allocated_t, u.mem) ) - -#ifdef ALLOC_CAN_RETURN_NULL -/** If our ALLOC() macro can return NULL, check whether x is NULL, - * and if so, return NULL. */ -#define CHECK_ALLOC(x) \ - if (PREDICT_UNLIKELY(!x)) { return NULL; } -#else -/** If our ALLOC() macro can't return NULL, do nothing. */ -#define CHECK_ALLOC(x) -#endif - -/** Helper: Allocate and return a new memory chunk for pool. Does not - * link the chunk into any list. */ -static mp_chunk_t * -mp_chunk_new(mp_pool_t *pool) -{ - size_t sz = pool->new_chunk_capacity * pool->item_alloc_size; - mp_chunk_t *chunk = ALLOC(CHUNK_OVERHEAD + sz); - -#ifdef MEMPOOL_STATS - ++pool->total_chunks_allocated; -#endif - CHECK_ALLOC(chunk); - memset(chunk, 0, sizeof(mp_chunk_t)); /* Doesn't clear the whole thing. */ - chunk->magic = MP_CHUNK_MAGIC; - chunk->capacity = pool->new_chunk_capacity; - chunk->mem_size = sz; - chunk->next_mem = chunk->mem; - chunk->pool = pool; - return chunk; -} - -/** Take a chunk that has just been allocated or removed from - * pool's empty chunk list, and add it to the head of the used chunk - * list. */ -static INLINE void -add_newly_used_chunk_to_used_list(mp_pool_t *pool, mp_chunk_t *chunk) -{ - chunk->next = pool->used_chunks; - if (chunk->next) - chunk->next->prev = chunk; - pool->used_chunks = chunk; - ASSERT(!chunk->prev); -} - -/** Return a newly allocated item from pool. */ -void * -mp_pool_get(mp_pool_t *pool) -{ - mp_chunk_t *chunk; - mp_allocated_t *allocated; - - if (PREDICT_LIKELY(pool->used_chunks != NULL)) { - /* Common case: there is some chunk that is neither full nor empty. Use - * that one. (We can't use the full ones, obviously, and we should fill - * up the used ones before we start on any empty ones. */ - chunk = pool->used_chunks; - - } else if (pool->empty_chunks) { - /* We have no used chunks, but we have an empty chunk that we haven't - * freed yet: use that. (We pull from the front of the list, which should - * get us the most recently emptied chunk.) */ - chunk = pool->empty_chunks; - - /* Remove the chunk from the empty list. */ - pool->empty_chunks = chunk->next; - if (chunk->next) - chunk->next->prev = NULL; - - /* Put the chunk on the 'used' list*/ - add_newly_used_chunk_to_used_list(pool, chunk); - - ASSERT(!chunk->prev); - --pool->n_empty_chunks; - if (pool->n_empty_chunks < pool->min_empty_chunks) - pool->min_empty_chunks = pool->n_empty_chunks; - } else { - /* We have no used or empty chunks: allocate a new chunk. */ - chunk = mp_chunk_new(pool); - CHECK_ALLOC(chunk); - - /* Add the new chunk to the used list. */ - add_newly_used_chunk_to_used_list(pool, chunk); - } - - ASSERT(chunk->n_allocated < chunk->capacity); - - if (chunk->first_free) { - /* If there's anything on the chunk's freelist, unlink it and use it. */ - allocated = chunk->first_free; - chunk->first_free = allocated->u.next_free; - allocated->u.next_free = NULL; /* For debugging; not really needed. */ - ASSERT(allocated->in_chunk == chunk); - } else { - /* Otherwise, the chunk had better have some free space left on it. */ - ASSERT(chunk->next_mem + pool->item_alloc_size <= - chunk->mem + chunk->mem_size); - - /* Good, it did. Let's carve off a bit of that free space, and use - * that. */ - allocated = (void*)chunk->next_mem; - chunk->next_mem += pool->item_alloc_size; - allocated->in_chunk = chunk; - allocated->u.next_free = NULL; /* For debugging; not really needed. */ - } - - ++chunk->n_allocated; -#ifdef MEMPOOL_STATS - ++pool->total_items_allocated; -#endif - - if (PREDICT_UNLIKELY(chunk->n_allocated == chunk->capacity)) { - /* This chunk just became full. */ - ASSERT(chunk == pool->used_chunks); - ASSERT(chunk->prev == NULL); - - /* Take it off the used list. */ - pool->used_chunks = chunk->next; - if (chunk->next) - chunk->next->prev = NULL; - - /* Put it on the full list. */ - chunk->next = pool->full_chunks; - if (chunk->next) - chunk->next->prev = chunk; - pool->full_chunks = chunk; - } - /* And return the memory portion of the mp_allocated_t. */ - return A2M(allocated); -} - -/** Return an allocated memory item to its memory pool. */ -void -mp_pool_release(void *item) -{ - mp_allocated_t *allocated = (void*) M2A(item); - mp_chunk_t *chunk = allocated->in_chunk; - - ASSERT(chunk); - ASSERT(chunk->magic == MP_CHUNK_MAGIC); - ASSERT(chunk->n_allocated > 0); - - allocated->u.next_free = chunk->first_free; - chunk->first_free = allocated; - - if (PREDICT_UNLIKELY(chunk->n_allocated == chunk->capacity)) { - /* This chunk was full and is about to be used. */ - mp_pool_t *pool = chunk->pool; - /* unlink from the full list */ - if (chunk->prev) - chunk->prev->next = chunk->next; - if (chunk->next) - chunk->next->prev = chunk->prev; - if (chunk == pool->full_chunks) - pool->full_chunks = chunk->next; - - /* link to the used list. */ - chunk->next = pool->used_chunks; - chunk->prev = NULL; - if (chunk->next) - chunk->next->prev = chunk; - pool->used_chunks = chunk; - } else if (PREDICT_UNLIKELY(chunk->n_allocated == 1)) { - /* This was used and is about to be empty. */ - mp_pool_t *pool = chunk->pool; - - /* Unlink from the used list */ - if (chunk->prev) - chunk->prev->next = chunk->next; - if (chunk->next) - chunk->next->prev = chunk->prev; - if (chunk == pool->used_chunks) - pool->used_chunks = chunk->next; - - /* Link to the empty list */ - chunk->next = pool->empty_chunks; - chunk->prev = NULL; - if (chunk->next) - chunk->next->prev = chunk; - pool->empty_chunks = chunk; - - /* Reset the guts of this chunk to defragment it, in case it gets - * used again. */ - chunk->first_free = NULL; - chunk->next_mem = chunk->mem; - - ++pool->n_empty_chunks; - } - --chunk->n_allocated; -} - -/** Allocate a new memory pool to hold items of size item_size. We'll - * try to fit about chunk_capacity bytes in each chunk. */ -mp_pool_t * -mp_pool_new(size_t item_size, size_t chunk_capacity) -{ - mp_pool_t *pool; - size_t alloc_size, new_chunk_cap; - - tor_assert(item_size < SIZE_T_CEILING); - tor_assert(chunk_capacity < SIZE_T_CEILING); - tor_assert(SIZE_T_CEILING / item_size > chunk_capacity); - - pool = ALLOC(sizeof(mp_pool_t)); - CHECK_ALLOC(pool); - memset(pool, 0, sizeof(mp_pool_t)); - - /* First, we figure out how much space to allow per item. We'll want to - * use make sure we have enough for the overhead plus the item size. */ - alloc_size = (size_t)(STRUCT_OFFSET(mp_allocated_t, u.mem) + item_size); - /* If the item_size is less than sizeof(next_free), we need to make - * the allocation bigger. */ - if (alloc_size < sizeof(mp_allocated_t)) - alloc_size = sizeof(mp_allocated_t); - - /* If we're not an even multiple of ALIGNMENT, round up. */ - if (alloc_size % ALIGNMENT) { - alloc_size = alloc_size + ALIGNMENT - (alloc_size % ALIGNMENT); - } - if (alloc_size < ALIGNMENT) - alloc_size = ALIGNMENT; - ASSERT((alloc_size % ALIGNMENT) == 0); - - /* Now we figure out how many items fit in each chunk. We need to fit at - * least 2 items per chunk. No chunk can be more than MAX_CHUNK bytes long, - * or less than MIN_CHUNK. */ - if (chunk_capacity > MAX_CHUNK) - chunk_capacity = MAX_CHUNK; - /* Try to be around a power of 2 in size, since that's what allocators like - * handing out. 512K-1 byte is a lot better than 512K+1 byte. */ - chunk_capacity = (size_t) round_to_power_of_2(chunk_capacity); - while (chunk_capacity < alloc_size * 2 + CHUNK_OVERHEAD) - chunk_capacity *= 2; - if (chunk_capacity < MIN_CHUNK) - chunk_capacity = MIN_CHUNK; - - new_chunk_cap = (chunk_capacity-CHUNK_OVERHEAD) / alloc_size; - tor_assert(new_chunk_cap < INT_MAX); - pool->new_chunk_capacity = (int)new_chunk_cap; - - pool->item_alloc_size = alloc_size; - - log_debug(LD_MM, "Capacity is %lu, item size is %lu, alloc size is %lu", - (unsigned long)pool->new_chunk_capacity, - (unsigned long)pool->item_alloc_size, - (unsigned long)(pool->new_chunk_capacity*pool->item_alloc_size)); - - return pool; -} - -/** Helper function for qsort: used to sort pointers to mp_chunk_t into - * descending order of fullness. */ -static int -mp_pool_sort_used_chunks_helper(const void *_a, const void *_b) -{ - mp_chunk_t *a = *(mp_chunk_t**)_a; - mp_chunk_t *b = *(mp_chunk_t**)_b; - return b->n_allocated - a->n_allocated; -} - -/** Sort the used chunks in pool into descending order of fullness, - * so that we preferentially fill up mostly full chunks before we make - * nearly empty chunks less nearly empty. */ -static void -mp_pool_sort_used_chunks(mp_pool_t *pool) -{ - int i, n=0, inverted=0; - mp_chunk_t **chunks, *chunk; - for (chunk = pool->used_chunks; chunk; chunk = chunk->next) { - ++n; - if (chunk->next && chunk->next->n_allocated > chunk->n_allocated) - ++inverted; - } - if (!inverted) - return; - //printf("Sort %d/%d\n",inverted,n); - chunks = ALLOC(sizeof(mp_chunk_t *)*n); -#ifdef ALLOC_CAN_RETURN_NULL - if (PREDICT_UNLIKELY(!chunks)) return; -#endif - for (i=0,chunk = pool->used_chunks; chunk; chunk = chunk->next) - chunks[i++] = chunk; - qsort(chunks, n, sizeof(mp_chunk_t *), mp_pool_sort_used_chunks_helper); - pool->used_chunks = chunks[0]; - chunks[0]->prev = NULL; - for (i=1;inext = chunks[i]; - chunks[i]->prev = chunks[i-1]; - } - chunks[n-1]->next = NULL; - FREE(chunks); - mp_pool_assert_ok(pool); -} - -/** If there are more than n empty chunks in pool, free the - * excess ones that have been empty for the longest. If - * keep_recently_used is true, do not free chunks unless they have been - * empty since the last call to this function. - **/ -void -mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used) -{ - mp_chunk_t *chunk, **first_to_free; - - mp_pool_sort_used_chunks(pool); - ASSERT(n_to_keep >= 0); - - if (keep_recently_used) { - int n_recently_used = pool->n_empty_chunks - pool->min_empty_chunks; - if (n_to_keep < n_recently_used) - n_to_keep = n_recently_used; - } - - ASSERT(n_to_keep >= 0); - - first_to_free = &pool->empty_chunks; - while (*first_to_free && n_to_keep > 0) { - first_to_free = &(*first_to_free)->next; - --n_to_keep; - } - if (!*first_to_free) { - pool->min_empty_chunks = pool->n_empty_chunks; - return; - } - - chunk = *first_to_free; - while (chunk) { - mp_chunk_t *next = chunk->next; - chunk->magic = 0xdeadbeef; - FREE(chunk); -#ifdef MEMPOOL_STATS - ++pool->total_chunks_freed; -#endif - --pool->n_empty_chunks; - chunk = next; - } - - pool->min_empty_chunks = pool->n_empty_chunks; - *first_to_free = NULL; -} - -/** Helper: Given a list of chunks, free all the chunks in the list. */ -static void -destroy_chunks(mp_chunk_t *chunk) -{ - mp_chunk_t *next; - while (chunk) { - chunk->magic = 0xd3adb33f; - next = chunk->next; - FREE(chunk); - chunk = next; - } -} - -/** Free all space held in pool This makes all pointers returned from - * mp_pool_get(pool) invalid. */ -void -mp_pool_destroy(mp_pool_t *pool) -{ - destroy_chunks(pool->empty_chunks); - destroy_chunks(pool->used_chunks); - destroy_chunks(pool->full_chunks); - memwipe(pool, 0xe0, sizeof(mp_pool_t)); - FREE(pool); -} - -/** Helper: make sure that a given chunk list is not corrupt. */ -static int -assert_chunks_ok(mp_pool_t *pool, mp_chunk_t *chunk, int empty, int full) -{ - mp_allocated_t *allocated; - int n = 0; - if (chunk) - ASSERT(chunk->prev == NULL); - - while (chunk) { - n++; - ASSERT(chunk->magic == MP_CHUNK_MAGIC); - ASSERT(chunk->pool == pool); - for (allocated = chunk->first_free; allocated; - allocated = allocated->u.next_free) { - ASSERT(allocated->in_chunk == chunk); - } - if (empty) - ASSERT(chunk->n_allocated == 0); - else if (full) - ASSERT(chunk->n_allocated == chunk->capacity); - else - ASSERT(chunk->n_allocated > 0 && chunk->n_allocated < chunk->capacity); - - ASSERT(chunk->capacity == pool->new_chunk_capacity); - - ASSERT(chunk->mem_size == - pool->new_chunk_capacity * pool->item_alloc_size); - - ASSERT(chunk->next_mem >= chunk->mem && - chunk->next_mem <= chunk->mem + chunk->mem_size); - - if (chunk->next) - ASSERT(chunk->next->prev == chunk); - - chunk = chunk->next; - } - return n; -} - -/** Fail with an assertion if pool is not internally consistent. */ -void -mp_pool_assert_ok(mp_pool_t *pool) -{ - int n_empty; - - n_empty = assert_chunks_ok(pool, pool->empty_chunks, 1, 0); - assert_chunks_ok(pool, pool->full_chunks, 0, 1); - assert_chunks_ok(pool, pool->used_chunks, 0, 0); - - ASSERT(pool->n_empty_chunks == n_empty); -} - -#ifdef TOR -/** Dump information about pool's memory usage to the Tor log at level - * severity. */ -/*FFFF uses Tor logging functions. */ -void -mp_pool_log_status(mp_pool_t *pool, int severity) -{ - uint64_t bytes_used = 0; - uint64_t bytes_allocated = 0; - uint64_t bu = 0, ba = 0; - mp_chunk_t *chunk; - int n_full = 0, n_used = 0; - - ASSERT(pool); - - for (chunk = pool->empty_chunks; chunk; chunk = chunk->next) { - bytes_allocated += chunk->mem_size; - } - log_fn(severity, LD_MM, U64_FORMAT" bytes in %d empty chunks", - U64_PRINTF_ARG(bytes_allocated), pool->n_empty_chunks); - for (chunk = pool->used_chunks; chunk; chunk = chunk->next) { - ++n_used; - bu += chunk->n_allocated * pool->item_alloc_size; - ba += chunk->mem_size; - log_fn(severity, LD_MM, " used chunk: %d items allocated", - chunk->n_allocated); - } - log_fn(severity, LD_MM, U64_FORMAT"/"U64_FORMAT - " bytes in %d partially full chunks", - U64_PRINTF_ARG(bu), U64_PRINTF_ARG(ba), n_used); - bytes_used += bu; - bytes_allocated += ba; - bu = ba = 0; - for (chunk = pool->full_chunks; chunk; chunk = chunk->next) { - ++n_full; - bu += chunk->n_allocated * pool->item_alloc_size; - ba += chunk->mem_size; - } - log_fn(severity, LD_MM, U64_FORMAT"/"U64_FORMAT - " bytes in %d full chunks", - U64_PRINTF_ARG(bu), U64_PRINTF_ARG(ba), n_full); - bytes_used += bu; - bytes_allocated += ba; - - log_fn(severity, LD_MM, "Total: "U64_FORMAT"/"U64_FORMAT" bytes allocated " - "for cell pools are full.", - U64_PRINTF_ARG(bytes_used), U64_PRINTF_ARG(bytes_allocated)); - -#ifdef MEMPOOL_STATS - log_fn(severity, LD_MM, U64_FORMAT" cell allocations ever; " - U64_FORMAT" chunk allocations ever; " - U64_FORMAT" chunk frees ever.", - U64_PRINTF_ARG(pool->total_items_allocated), - U64_PRINTF_ARG(pool->total_chunks_allocated), - U64_PRINTF_ARG(pool->total_chunks_freed)); -#endif -} -#endif - diff --git a/src/tor/mempool.h b/src/tor/mempool.h deleted file mode 100644 index 0fc1e4c67..000000000 --- a/src/tor/mempool.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file mempool.h - * \brief Headers for mempool.c - **/ - -#ifndef TOR_MEMPOOL_H -#define TOR_MEMPOOL_H - -/** A memory pool is a context in which a large number of fixed-sized -* objects can be allocated efficiently. See mempool.c for implementation -* details. */ -typedef struct mp_pool_t mp_pool_t; - -void *mp_pool_get(mp_pool_t *pool); -void mp_pool_release(void *item); -mp_pool_t *mp_pool_new(size_t item_size, size_t chunk_capacity); -void mp_pool_clean(mp_pool_t *pool, int n_to_keep, int keep_recently_used); -void mp_pool_destroy(mp_pool_t *pool); -void mp_pool_assert_ok(mp_pool_t *pool); -void mp_pool_log_status(mp_pool_t *pool, int severity); - -#define MP_POOL_ITEM_OVERHEAD (sizeof(void*)) - -#define MEMPOOL_STATS - -#ifdef MEMPOOL_PRIVATE -/* These declarations are only used by mempool.c and test.c */ - -struct mp_pool_t { - /** Doubly-linked list of chunks in which no items have been allocated. - * The front of the list is the most recently emptied chunk. */ - struct mp_chunk_t *empty_chunks; - /** Doubly-linked list of chunks in which some items have been allocated, - * but which are not yet full. The front of the list is the chunk that has - * most recently been modified. */ - struct mp_chunk_t *used_chunks; - /** Doubly-linked list of chunks in which no more items can be allocated. - * The front of the list is the chunk that has most recently become full. */ - struct mp_chunk_t *full_chunks; - /** Length of empty_chunks. */ - int n_empty_chunks; - /** Lowest value of empty_chunks since last call to - * mp_pool_clean(-1). */ - int min_empty_chunks; - /** Size of each chunk (in items). */ - int new_chunk_capacity; - /** Size to allocate for each item, including overhead and alignment - * padding. */ - size_t item_alloc_size; -#ifdef MEMPOOL_STATS - /** Total number of items allocated ever. */ - uint64_t total_items_allocated; - /** Total number of chunks allocated ever. */ - uint64_t total_chunks_allocated; - /** Total number of chunks freed ever. */ - uint64_t total_chunks_freed; -#endif -}; -#endif - -#endif - diff --git a/src/tor/microdesc.c b/src/tor/microdesc.c deleted file mode 100644 index 11249910c..000000000 --- a/src/tor/microdesc.c +++ /dev/null @@ -1,833 +0,0 @@ -/* Copyright (c) 2009-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "circuitbuild.h" -#include "config.h" -#include "directory.h" -#include "dirserv.h" -#include "entrynodes.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" - -/** A data structure to hold a bunch of cached microdescriptors. There are - * two active files in the cache: a "cache file" that we mmap, and a "journal - * file" that we append to. Periodically, we rebuild the cache file to hold - * only the microdescriptors that we want to keep */ -struct microdesc_cache_t { - /** Map from sha256-digest to microdesc_t for every microdesc_t in the - * cache. */ - HT_HEAD(microdesc_map, microdesc_t) map; - - /** Name of the cache file. */ - char *cache_fname; - /** Name of the journal file. */ - char *journal_fname; - /** Mmap'd contents of the cache file, or NULL if there is none. */ - tor_mmap_t *cache_content; - /** Number of bytes used in the journal file. */ - size_t journal_len; - /** Number of bytes in descriptors removed as too old. */ - size_t bytes_dropped; - - /** Total bytes of microdescriptor bodies we have added to this cache */ - uint64_t total_len_seen; - /** Total number of microdescriptors we have added to this cache */ - unsigned n_seen; -}; - -/** Helper: computes a hash of md to place it in a hash table. */ -static INLINE unsigned int -microdesc_hash_(microdesc_t *md) -{ - unsigned *d = (unsigned*)md->digest; -#if SIZEOF_INT == 4 - return d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7]; -#else - return d[0] ^ d[1] ^ d[2] ^ d[3]; -#endif -} - -/** Helper: compares a and for equality for hash-table purposes. */ -static INLINE int -microdesc_eq_(microdesc_t *a, microdesc_t *b) -{ - return tor_memeq(a->digest, b->digest, DIGEST256_LEN); -} - -HT_PROTOTYPE(microdesc_map, microdesc_t, node, - microdesc_hash_, microdesc_eq_); -HT_GENERATE(microdesc_map, microdesc_t, node, - microdesc_hash_, microdesc_eq_, 0.6, - malloc, realloc, free); - -/** Write the body of md into f, with appropriate annotations. - * On success, return the total number of bytes written, and set - * *annotation_len_out to the number of bytes written as - * annotations. */ -static ssize_t -dump_microdescriptor(int fd, microdesc_t *md, size_t *annotation_len_out) -{ - ssize_t r = 0; - ssize_t written; - if (md->body == NULL) { - *annotation_len_out = 0; - return 0; - } - /* XXXX drops unknown annotations. */ - if (md->last_listed) { - char buf[ISO_TIME_LEN+1]; - char annotation[ISO_TIME_LEN+32]; - format_iso_time(buf, md->last_listed); - tor_snprintf(annotation, sizeof(annotation), "@last-listed %s\n", buf); - if (write_all(fd, annotation, strlen(annotation), 0) < 0) { - log_warn(LD_DIR, - "Couldn't write microdescriptor annotation: %s", - strerror(errno)); - return -1; - } - r += strlen(annotation); - *annotation_len_out = r; - } else { - *annotation_len_out = 0; - } - - md->off = tor_fd_getpos(fd); - written = write_all(fd, md->body, md->bodylen, 0); - if (written != (ssize_t)md->bodylen) { - log_warn(LD_DIR, - "Couldn't dump microdescriptor (wrote %ld out of %lu): %s", - (long)written, (unsigned long)md->bodylen, - strerror(errno)); - return -1; - } - r += md->bodylen; - return r; -} - -/** Holds a pointer to the current microdesc_cache_t object, or NULL if no - * such object has been allocated. */ -static microdesc_cache_t *the_microdesc_cache = NULL; - -/** Return a pointer to the microdescriptor cache, loading it if necessary. */ -microdesc_cache_t * -get_microdesc_cache(void) -{ - if (PREDICT_UNLIKELY(the_microdesc_cache==NULL)) { - microdesc_cache_t *cache = tor_malloc_zero(sizeof(microdesc_cache_t)); - HT_INIT(microdesc_map, &cache->map); - cache->cache_fname = get_datadir_fname("cached-microdescs"); - cache->journal_fname = get_datadir_fname("cached-microdescs.new"); - microdesc_cache_reload(cache); - the_microdesc_cache = cache; - } - return the_microdesc_cache; -} - -/* There are three sources of microdescriptors: - 1) Generated by us while acting as a directory authority. - 2) Loaded from the cache on disk. - 3) Downloaded. -*/ - -/** Decode the microdescriptors from the string starting at s and - * ending at eos, and store them in cache. If no_save, - * mark them as non-writable to disk. If where is SAVED_IN_CACHE, - * leave their bodies as pointers to the mmap'd cache. If where is - * SAVED_NOWHERE, do not allow annotations. If listed_at is not -1, - * set the last_listed field of every microdesc to listed_at. If - * requested_digests is non-null, then it contains a list of digests we mean - * to allow, so we should reject any non-requested microdesc with a different - * digest, and alter the list to contain only the digests of those microdescs - * we didn't find. - * Return a newly allocated list of the added microdescriptors, or NULL */ -smartlist_t * -microdescs_add_to_cache(microdesc_cache_t *cache, - const char *s, const char *eos, saved_location_t where, - int no_save, time_t listed_at, - smartlist_t *requested_digests256) -{ - smartlist_t *descriptors, *added; - const int allow_annotations = (where != SAVED_NOWHERE); - - descriptors = microdescs_parse_from_string(s, eos, - allow_annotations, - where); - if (listed_at != (time_t)-1) { - SMARTLIST_FOREACH(descriptors, microdesc_t *, md, - md->last_listed = listed_at); - } - if (requested_digests256) { - digestmap_t *requested; /* XXXX actually we should just use a - digest256map */ - requested = digestmap_new(); - SMARTLIST_FOREACH(requested_digests256, const char *, cp, - digestmap_set(requested, cp, (void*)1)); - SMARTLIST_FOREACH_BEGIN(descriptors, microdesc_t *, md) { - if (digestmap_get(requested, md->digest)) { - digestmap_set(requested, md->digest, (void*)2); - } else { - log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Received non-requested microdesc"); - microdesc_free(md); - SMARTLIST_DEL_CURRENT(descriptors, md); - } - } SMARTLIST_FOREACH_END(md); - SMARTLIST_FOREACH_BEGIN(requested_digests256, char *, cp) { - if (digestmap_get(requested, cp) == (void*)2) { - tor_free(cp); - SMARTLIST_DEL_CURRENT(requested_digests256, cp); - } - } SMARTLIST_FOREACH_END(cp); - digestmap_free(requested, NULL); - } - - added = microdescs_add_list_to_cache(cache, descriptors, where, no_save); - smartlist_free(descriptors); - return added; -} - -/** As microdescs_add_to_cache, but takes a list of microdescriptors instead of - * a string to decode. Frees any members of descriptors that it does - * not add. */ -smartlist_t * -microdescs_add_list_to_cache(microdesc_cache_t *cache, - smartlist_t *descriptors, saved_location_t where, - int no_save) -{ - smartlist_t *added; - open_file_t *open_file = NULL; - int fd = -1; - // int n_added = 0; - ssize_t size = 0; - - if (where == SAVED_NOWHERE && !no_save) { - fd = start_writing_to_file(cache->journal_fname, - OPEN_FLAGS_APPEND|O_BINARY, - 0600, &open_file); - if (fd < 0) { - log_warn(LD_DIR, "Couldn't append to journal in %s: %s", - cache->journal_fname, strerror(errno)); - } - } - - added = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(descriptors, microdesc_t *, md) { - microdesc_t *md2; - md2 = HT_FIND(microdesc_map, &cache->map, md); - if (md2) { - /* We already had this one. */ - if (md2->last_listed < md->last_listed) - md2->last_listed = md->last_listed; - microdesc_free(md); - if (where != SAVED_NOWHERE) - cache->bytes_dropped += size; - continue; - } - - /* Okay, it's a new one. */ - if (fd >= 0) { - size_t annotation_len; - size = dump_microdescriptor(fd, md, &annotation_len); - if (size < 0) { - /* we already warned in dump_microdescriptor */ - abort_writing_to_file(open_file); - fd = -1; - } else { - md->saved_location = SAVED_IN_JOURNAL; - cache->journal_len += size; - } - } else { - md->saved_location = where; - } - - md->no_save = no_save; - - HT_INSERT(microdesc_map, &cache->map, md); - md->held_in_map = 1; - smartlist_add(added, md); - ++cache->n_seen; - cache->total_len_seen += md->bodylen; - } SMARTLIST_FOREACH_END(md); - - if (fd >= 0) { - if (finish_writing_to_file(open_file) < 0) { - log_warn(LD_DIR, "Error appending to microdescriptor file: %s", - strerror(errno)); - smartlist_clear(added); - return added; - } - } - - { - networkstatus_t *ns = networkstatus_get_latest_consensus(); - if (ns && ns->flavor == FLAV_MICRODESC) - SMARTLIST_FOREACH(added, microdesc_t *, md, nodelist_add_microdesc(md)); - } - - if (smartlist_len(added)) - router_dir_info_changed(); - - return added; -} - -/** Remove every microdescriptor in cache. */ -void -microdesc_cache_clear(microdesc_cache_t *cache) -{ - microdesc_t **entry, **next; - for (entry = HT_START(microdesc_map, &cache->map); entry; entry = next) { - microdesc_t *md = *entry; - next = HT_NEXT_RMV(microdesc_map, &cache->map, entry); - md->held_in_map = 0; - microdesc_free(md); - } - HT_CLEAR(microdesc_map, &cache->map); - if (cache->cache_content) { - tor_munmap_file(cache->cache_content); - cache->cache_content = NULL; - } - cache->total_len_seen = 0; - cache->n_seen = 0; - cache->bytes_dropped = 0; -} - -/** Reload the contents of cache from disk. If it is empty, load it - * for the first time. Return 0 on success, -1 on failure. */ -int -microdesc_cache_reload(microdesc_cache_t *cache) -{ - struct stat st; - char *journal_content; - smartlist_t *added; - tor_mmap_t *mm; - int total = 0; - - microdesc_cache_clear(cache); - - mm = cache->cache_content = tor_mmap_file(cache->cache_fname); - if (mm) { - added = microdescs_add_to_cache(cache, mm->data, mm->data+mm->size, - SAVED_IN_CACHE, 0, -1, NULL); - if (added) { - total += smartlist_len(added); - smartlist_free(added); - } - } - - journal_content = read_file_to_str(cache->journal_fname, - RFTS_IGNORE_MISSING, &st); - if (journal_content) { - cache->journal_len = (size_t) st.st_size; - added = microdescs_add_to_cache(cache, journal_content, - journal_content+st.st_size, - SAVED_IN_JOURNAL, 0, -1, NULL); - if (added) { - total += smartlist_len(added); - smartlist_free(added); - } - tor_free(journal_content); - } - log_info(LD_DIR, "Reloaded microdescriptor cache. Found %d descriptors.", - total); - - microdesc_cache_rebuild(cache, 0 /* don't force */); - - return 0; -} - -/** By default, we remove any microdescriptors that have gone at least this - * long without appearing in a current consensus. */ -#define TOLERATE_MICRODESC_AGE (7*24*60*60) - -/** Remove all microdescriptors from cache that haven't been listed for - * a long time. Does not rebuild the cache on disk. If cutoff is - * positive, specifically remove microdescriptors that have been unlisted - * since cutoff. If force is true, remove microdescriptors even - * if we have no current live microdescriptor consensus. - */ -void -microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force) -{ - microdesc_t **mdp, *victim; - int dropped=0, kept=0; - size_t bytes_dropped = 0; - time_t now = time(NULL); - - /* If we don't know a live consensus, don't believe last_listed values: we - * might be starting up after being down for a while. */ - if (! force && - ! networkstatus_get_reasonably_live_consensus(now, FLAV_MICRODESC)) - return; - - if (cutoff <= 0) - cutoff = now - TOLERATE_MICRODESC_AGE; - - for (mdp = HT_START(microdesc_map, &cache->map); mdp != NULL; ) { - if ((*mdp)->last_listed < cutoff) { - ++dropped; - victim = *mdp; - mdp = HT_NEXT_RMV(microdesc_map, &cache->map, mdp); - victim->held_in_map = 0; - bytes_dropped += victim->bodylen; - microdesc_free(victim); - } else { - ++kept; - mdp = HT_NEXT(microdesc_map, &cache->map, mdp); - } - } - - if (dropped) { - log_info(LD_DIR, "Removed %d/%d microdescriptors as old.", - dropped,dropped+kept); - cache->bytes_dropped += bytes_dropped; - } -} - -static int -should_rebuild_md_cache(microdesc_cache_t *cache) -{ - const size_t old_len = - cache->cache_content ? cache->cache_content->size : 0; - const size_t journal_len = cache->journal_len; - const size_t dropped = cache->bytes_dropped; - - if (journal_len < 16384) - return 0; /* Don't bother, not enough has happened yet. */ - if (dropped > (journal_len + old_len) / 3) - return 1; /* We could save 1/3 or more of the currently used space. */ - if (journal_len > old_len / 2) - return 1; /* We should append to the regular file */ - - return 0; -} - -/** - * Mark md as having no body, and release any storage previously held - * by its body. - */ -static void -microdesc_wipe_body(microdesc_t *md) -{ - if (!md) - return; - - if (md->saved_location != SAVED_IN_CACHE) - tor_free(md->body); - - md->off = 0; - md->saved_location = SAVED_NOWHERE; - md->body = NULL; - md->bodylen = 0; - md->no_save = 1; -} - -/** Regenerate the main cache file for cache, clear the journal file, - * and update every microdesc_t in the cache with pointers to its new - * location. If force is true, do this unconditionally. If - * force is false, do it only if we expect to save space on disk. */ -int -microdesc_cache_rebuild(microdesc_cache_t *cache, int force) -{ - open_file_t *open_file; - int fd = -1; - microdesc_t **mdp; - smartlist_t *wrote; - ssize_t size; - off_t off = 0, off_real; - int orig_size, new_size; - - if (cache == NULL) { - cache = the_microdesc_cache; - if (cache == NULL) - return 0; - } - - /* Remove dead descriptors */ - microdesc_cache_clean(cache, 0/*cutoff*/, 0/*force*/); - - if (!force && !should_rebuild_md_cache(cache)) - return 0; - - log_info(LD_DIR, "Rebuilding the microdescriptor cache..."); - - orig_size = (int)(cache->cache_content ? cache->cache_content->size : 0); - orig_size += (int)cache->journal_len; - - fd = start_writing_to_file(cache->cache_fname, - OPEN_FLAGS_REPLACE|O_BINARY, - 0600, &open_file); - if (fd < 0) - return -1; - - wrote = smartlist_new(); - - HT_FOREACH(mdp, microdesc_map, &cache->map) { - microdesc_t *md = *mdp; - size_t annotation_len; - if (md->no_save || !md->body) - continue; - - size = dump_microdescriptor(fd, md, &annotation_len); - if (size < 0) { - microdesc_wipe_body(md); - - /* rewind, in case it was a partial write. */ - tor_fd_setpos(fd, off); - continue; - } - tor_assert(((size_t)size) == annotation_len + md->bodylen); - md->off = off + annotation_len; - off += size; - off_real = tor_fd_getpos(fd); - if (off_real != off) { - log_warn(LD_BUG, "Discontinuity in position in microdescriptor cache." - "By my count, I'm at "I64_FORMAT - ", but I should be at "I64_FORMAT, - I64_PRINTF_ARG(off), I64_PRINTF_ARG(off_real)); - if (off_real >= 0) - off = off_real; - } - if (md->saved_location != SAVED_IN_CACHE) { - tor_free(md->body); - md->saved_location = SAVED_IN_CACHE; - } - smartlist_add(wrote, md); - } - - /* We must do this unmap _before_ we call finish_writing_to_file(), or - * windows will not actually replace the file. */ - if (cache->cache_content) - tor_munmap_file(cache->cache_content); - - if (finish_writing_to_file(open_file) < 0) { - log_warn(LD_DIR, "Error rebuilding microdescriptor cache: %s", - strerror(errno)); - /* Okay. Let's prevent from making things worse elsewhere. */ - cache->cache_content = NULL; - HT_FOREACH(mdp, microdesc_map, &cache->map) { - microdesc_t *md = *mdp; - if (md->saved_location == SAVED_IN_CACHE) { - microdesc_wipe_body(md); - } - } - return -1; - } - - cache->cache_content = tor_mmap_file(cache->cache_fname); - - if (!cache->cache_content && smartlist_len(wrote)) { - log_err(LD_DIR, "Couldn't map file that we just wrote to %s!", - cache->cache_fname); - smartlist_free(wrote); - return -1; - } - SMARTLIST_FOREACH_BEGIN(wrote, microdesc_t *, md) { - tor_assert(md->saved_location == SAVED_IN_CACHE); - md->body = (char*)cache->cache_content->data + md->off; - if (PREDICT_UNLIKELY( - md->bodylen < 9 || fast_memneq(md->body, "onion-key", 9) != 0)) { - /* XXXX once bug 2022 is solved, we can kill this block and turn it - * into just the tor_assert(fast_memeq) */ - off_t avail = cache->cache_content->size - md->off; - char *bad_str; - tor_assert(avail >= 0); - bad_str = tor_strndup(md->body, MIN(128, (size_t)avail)); - log_err(LD_BUG, "After rebuilding microdesc cache, offsets seem wrong. " - " At offset %d, I expected to find a microdescriptor starting " - " with \"onion-key\". Instead I got %s.", - (int)md->off, escaped(bad_str)); - tor_free(bad_str); - tor_assert(fast_memeq(md->body, "onion-key", 9)); - } - } SMARTLIST_FOREACH_END(md); - - smartlist_free(wrote); - - write_str_to_file(cache->journal_fname, "", 1); - cache->journal_len = 0; - cache->bytes_dropped = 0; - - new_size = cache->cache_content ? (int)cache->cache_content->size : 0; - log_info(LD_DIR, "Done rebuilding microdesc cache. " - "Saved %d bytes; %d still used.", - orig_size-new_size, new_size); - - return 0; -} - -/** Make sure that the reference count of every microdescriptor in cache is - * accurate. */ -void -microdesc_check_counts(void) -{ - microdesc_t **mdp; - if (!the_microdesc_cache) - return; - - HT_FOREACH(mdp, microdesc_map, &the_microdesc_cache->map) { - microdesc_t *md = *mdp; - unsigned int found=0; - const smartlist_t *nodes = nodelist_get_list(); - SMARTLIST_FOREACH(nodes, node_t *, node, { - if (node->md == md) { - ++found; - } - }); - tor_assert(found == md->held_by_nodes); - } -} - -/** Deallocate a single microdescriptor. Note: the microdescriptor MUST have - * previously been removed from the cache if it had ever been inserted. */ -void -microdesc_free_(microdesc_t *md, const char *fname, int lineno) -{ - if (!md) - return; - - /* Make sure that the microdesc was really removed from the appropriate data - structures. */ - if (md->held_in_map) { - microdesc_cache_t *cache = get_microdesc_cache(); - microdesc_t *md2 = HT_FIND(microdesc_map, &cache->map, md); - if (md2 == md) { - log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still " - "in microdesc_map", fname, lineno); - HT_REMOVE(microdesc_map, &cache->map, md); - } else { - log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_in_map " - "set, but microdesc was not in the map.", fname, lineno); - } - tor_fragile_assert(); - } - if (md->held_by_nodes) { - int found=0; - const smartlist_t *nodes = nodelist_get_list(); - SMARTLIST_FOREACH(nodes, node_t *, node, { - if (node->md == md) { - ++found; - node->md = NULL; - } - }); - if (found) { - log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still " - "referenced %d node(s); held_by_nodes == %u", - fname, lineno, found, md->held_by_nodes); - } else { - log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_by_nodes " - "set to %u, but md was not referenced by any nodes", - fname, lineno, md->held_by_nodes); - } - tor_fragile_assert(); - } - //tor_assert(md->held_in_map == 0); - //tor_assert(md->held_by_nodes == 0); - - if (md->onion_pkey) - crypto_pk_free(md->onion_pkey); - tor_free(md->onion_curve25519_pkey); - if (md->body && md->saved_location != SAVED_IN_CACHE) - tor_free(md->body); - - if (md->family) { - SMARTLIST_FOREACH(md->family, char *, cp, tor_free(cp)); - smartlist_free(md->family); - } - short_policy_free(md->exit_policy); - short_policy_free(md->ipv6_exit_policy); - - tor_free(md); -} - -/** Free all storage held in the microdesc.c module. */ -void -microdesc_free_all(void) -{ - if (the_microdesc_cache) { - microdesc_cache_clear(the_microdesc_cache); - tor_free(the_microdesc_cache->cache_fname); - tor_free(the_microdesc_cache->journal_fname); - tor_free(the_microdesc_cache); - } -} - -/** If there is a microdescriptor in cache whose sha256 digest is - * d, return it. Otherwise return NULL. */ -microdesc_t * -microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d) -{ - microdesc_t *md, search; - if (!cache) - cache = get_microdesc_cache(); - memcpy(search.digest, d, DIGEST256_LEN); - md = HT_FIND(microdesc_map, &cache->map, &search); - return md; -} - -/** Return the mean size of decriptors added to cache since it was last - * cleared. Used to estimate the size of large downloads. */ -size_t -microdesc_average_size(microdesc_cache_t *cache) -{ - if (!cache) - cache = get_microdesc_cache(); - if (!cache->n_seen) - return 512; - return (size_t)(cache->total_len_seen / cache->n_seen); -} - -/** Return a smartlist of all the sha256 digest of the microdescriptors that - * are listed in ns but not present in cache. Returns pointers - * to internals of ns; you should not free the members of the resulting - * smartlist. Omit all microdescriptors whose digest appear in skip. */ -smartlist_t * -microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, - int downloadable_only, digestmap_t *skip) -{ - smartlist_t *result = smartlist_new(); - time_t now = time(NULL); - tor_assert(ns->flavor == FLAV_MICRODESC); - SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { - if (microdesc_cache_lookup_by_digest256(cache, rs->descriptor_digest)) - continue; - if (downloadable_only && - !download_status_is_ready(&rs->dl_status, now, - get_options()->TestingMicrodescMaxDownloadTries)) - continue; - if (skip && digestmap_get(skip, rs->descriptor_digest)) - continue; - if (tor_mem_is_zero(rs->descriptor_digest, DIGEST256_LEN)) - continue; - /* XXXX Also skip if we're a noncache and wouldn't use this router. - * XXXX NM Microdesc - */ - smartlist_add(result, rs->descriptor_digest); - } SMARTLIST_FOREACH_END(rs); - return result; -} - -/** Launch download requests for microdescriptors as appropriate. - * - * Specifically, we should launch download requests if we are configured to - * download mirodescriptors, and there are some microdescriptors listed the - * current microdesc consensus that we don't have, and either we never asked - * for them, or we failed to download them but we're willing to retry. - */ -void -update_microdesc_downloads(time_t now) -{ - const or_options_t *options = get_options(); - networkstatus_t *consensus; - smartlist_t *missing; - digestmap_t *pending; - - if (should_delay_dir_fetches(options)) - return; - if (directory_too_idle_to_fetch_descriptors(options, now)) - return; - - consensus = networkstatus_get_reasonably_live_consensus(now, FLAV_MICRODESC); - if (!consensus) - return; - - if (!we_fetch_microdescriptors(options)) - return; - - pending = digestmap_new(); - list_pending_microdesc_downloads(pending); - - missing = microdesc_list_missing_digest256(consensus, - get_microdesc_cache(), - 1, - pending); - digestmap_free(pending, NULL); - - launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, - missing, NULL, now); - - smartlist_free(missing); -} - -/** For every microdescriptor listed in the current microdecriptor consensus, - * update its last_listed field to be at least as recent as the publication - * time of the current microdescriptor consensus. - */ -void -update_microdescs_from_networkstatus(time_t now) -{ - microdesc_cache_t *cache = get_microdesc_cache(); - microdesc_t *md; - networkstatus_t *ns = - networkstatus_get_reasonably_live_consensus(now, FLAV_MICRODESC); - - if (! ns) - return; - - tor_assert(ns->flavor == FLAV_MICRODESC); - - SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { - md = microdesc_cache_lookup_by_digest256(cache, rs->descriptor_digest); - if (md && ns->valid_after > md->last_listed) - md->last_listed = ns->valid_after; - } SMARTLIST_FOREACH_END(rs); -} - -/** Return true iff we should prefer to use microdescriptors rather than - * routerdescs for building circuits. */ -int -we_use_microdescriptors_for_circuits(const or_options_t *options) -{ - int ret = options->UseMicrodescriptors; - if (ret == -1) { - /* UseMicrodescriptors is "auto"; we need to decide: */ - /* If we are configured to use bridges and none of our bridges - * know what a microdescriptor is, the answer is no. */ - if (options->UseBridges && !any_bridge_supports_microdescriptors()) - return 0; - /* Otherwise, we decide that we'll use microdescriptors iff we are - * not a server, and we're not autofetching everything. */ - /* XXX023 what does not being a server have to do with it? also there's - * a partitioning issue here where bridges differ from clients. */ - ret = !server_mode(options) && !options->FetchUselessDescriptors; - } - return ret; -} - -/** Return true iff we should try to download microdescriptors at all. */ -int -we_fetch_microdescriptors(const or_options_t *options) -{ - if (directory_caches_dir_info(options)) - return 1; - if (options->FetchUselessDescriptors) - return 1; - return we_use_microdescriptors_for_circuits(options); -} - -/** Return true iff we should try to download router descriptors at all. */ -int -we_fetch_router_descriptors(const or_options_t *options) -{ - if (directory_caches_dir_info(options)) - return 1; - if (options->FetchUselessDescriptors) - return 1; - return ! we_use_microdescriptors_for_circuits(options); -} - -/** Return the consensus flavor we actually want to use to build circuits. */ -int -usable_consensus_flavor(void) -{ - if (we_use_microdescriptors_for_circuits(get_options())) { - return FLAV_MICRODESC; - } else { - return FLAV_NS; - } -} - diff --git a/src/tor/microdesc.h b/src/tor/microdesc.h deleted file mode 100644 index 7adb8c68a..000000000 --- a/src/tor/microdesc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file microdesc.h - * \brief Header file for microdesc.c. - **/ - -#ifndef TOR_MICRODESC_H -#define TOR_MICRODESC_H - -microdesc_cache_t *get_microdesc_cache(void); - -void microdesc_check_counts(void); - -smartlist_t *microdescs_add_to_cache(microdesc_cache_t *cache, - const char *s, const char *eos, saved_location_t where, - int no_save, time_t listed_at, - smartlist_t *requested_digests256); -smartlist_t *microdescs_add_list_to_cache(microdesc_cache_t *cache, - smartlist_t *descriptors, saved_location_t where, - int no_save); - -void microdesc_cache_clean(microdesc_cache_t *cache, time_t cutoff, int force); -int microdesc_cache_rebuild(microdesc_cache_t *cache, int force); -int microdesc_cache_reload(microdesc_cache_t *cache); -void microdesc_cache_clear(microdesc_cache_t *cache); - -microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, - const char *d); - -size_t microdesc_average_size(microdesc_cache_t *cache); - -smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns, - microdesc_cache_t *cache, - int downloadable_only, - digestmap_t *skip); - -void microdesc_free_(microdesc_t *md, const char *fname, int line); -#define microdesc_free(md) \ - microdesc_free_((md), __FILE__, __LINE__) -void microdesc_free_all(void); - -void update_microdesc_downloads(time_t now); -void update_microdescs_from_networkstatus(time_t now); - -int usable_consensus_flavor(void); -int we_fetch_microdescriptors(const or_options_t *options); -int we_fetch_router_descriptors(const or_options_t *options); -int we_use_microdescriptors_for_circuits(const or_options_t *options); - -#endif - diff --git a/src/tor/networkstatus.c b/src/tor/networkstatus.c deleted file mode 100644 index 9f3d881f1..000000000 --- a/src/tor/networkstatus.c +++ /dev/null @@ -1,1871 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file networkstatus.c - * \brief Functions and structures for handling network status documents as a - * client or cache. - */ - -#include "or.h" -#include "channel.h" -#include "circuitmux.h" -#include "circuitmux_ewma.h" -#include "circuitstats.h" -#include "config.h" -#include "connection.h" -#include "connection_or.h" -#include "control.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "entrynodes.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "relay.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" - -/** Map from lowercase nickname to identity digest of named server, if any. */ -static strmap_t *named_server_map = NULL; -/** Map from lowercase nickname to (void*)1 for all names that are listed - * as unnamed for some server in the consensus. */ -static strmap_t *unnamed_server_map = NULL; - -/** Most recently received and validated v3 consensus network status, - * of whichever type we are using for our own circuits. This will be the same - * as one of current_ns_consensus or current_md_consensus. - */ -#define current_consensus \ - (we_use_microdescriptors_for_circuits(get_options()) ? \ - current_md_consensus : current_ns_consensus) - -/** Most recently received and validated v3 "ns"-flavored consensus network - * status. */ -static networkstatus_t *current_ns_consensus = NULL; - -/** Most recently received and validated v3 "microdec"-flavored consensus - * network status. */ -static networkstatus_t *current_md_consensus = NULL; - -/** A v3 consensus networkstatus that we've received, but which we don't - * have enough certificates to be happy about. */ -typedef struct consensus_waiting_for_certs_t { - /** The consensus itself. */ - networkstatus_t *consensus; - /** The encoded version of the consensus, nul-terminated. */ - char *body; - /** When did we set the current value of consensus_waiting_for_certs? If - * this is too recent, we shouldn't try to fetch a new consensus for a - * little while, to give ourselves time to get certificates for this one. */ - time_t set_at; - /** Set to 1 if we've been holding on to it for so long we should maybe - * treat it as being bad. */ - int dl_failed; -} consensus_waiting_for_certs_t; - -/** An array, for each flavor of consensus we might want, of consensuses that - * we have downloaded, but which we cannot verify due to having insufficient - * authority certificates. */ -static consensus_waiting_for_certs_t - consensus_waiting_for_certs[N_CONSENSUS_FLAVORS]; - -/** A time before which we shouldn't try to replace the current consensus: - * this will be at some point after the next consensus becomes valid, but - * before the current consensus becomes invalid. */ -static time_t time_to_download_next_consensus[N_CONSENSUS_FLAVORS]; -/** Download status for the current consensus networkstatus. */ -static download_status_t consensus_dl_status[N_CONSENSUS_FLAVORS]; - -/** True iff we have logged a warning about this OR's version being older than - * listed by the authorities. */ -static int have_warned_about_old_version = 0; -/** True iff we have logged a warning about this OR's version being newer than - * listed by the authorities. */ -static int have_warned_about_new_version = 0; - -static void routerstatus_list_update_named_server_map(void); - -/** Forget that we've warned about anything networkstatus-related, so we will - * give fresh warnings if the same behavior happens again. */ -void -networkstatus_reset_warnings(void) -{ - if (current_consensus) { - SMARTLIST_FOREACH(nodelist_get_list(), node_t *, node, - node->name_lookup_warned = 0); - } - - have_warned_about_old_version = 0; - have_warned_about_new_version = 0; -} - -/** Reset the descriptor download failure count on all networkstatus docs, so - * that we can retry any long-failed documents immediately. - */ -void -networkstatus_reset_download_failures(void) -{ - int i; - - for (i=0; i < N_CONSENSUS_FLAVORS; ++i) - download_status_reset(&consensus_dl_status[i]); -} - -/** Read every cached v3 consensus networkstatus from the disk. */ -int -router_reload_consensus_networkstatus(void) -{ - char *filename; - char *s; - const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS; - int flav; - - /* FFFF Suppress warnings if cached consensus is bad? */ - for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - char buf[128]; - const char *flavor = networkstatus_get_flavor_name(flav); - if (flav == FLAV_NS) { - filename = get_datadir_fname("cached-consensus"); - } else { - tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); - filename = get_datadir_fname(buf); - } - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - if (s) { - if (networkstatus_set_current_consensus(s, flavor, flags) < -1) { - log_warn(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", - flavor, filename); - } - tor_free(s); - } - tor_free(filename); - - if (flav == FLAV_NS) { - filename = get_datadir_fname("unverified-consensus"); - } else { - tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); - filename = get_datadir_fname(buf); - } - - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); - if (s) { - if (networkstatus_set_current_consensus(s, flavor, - flags|NSSET_WAS_WAITING_FOR_CERTS)) { - log_info(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", - flavor, filename); - } - tor_free(s); - } - tor_free(filename); - } - - if (!current_consensus) { - if (!named_server_map) - named_server_map = strmap_new(); - if (!unnamed_server_map) - unnamed_server_map = strmap_new(); - } - - update_certificate_downloads(time(NULL)); - - routers_update_all_from_networkstatus(time(NULL), 3); - update_microdescs_from_networkstatus(time(NULL)); - - return 0; -} - -/** Free all storage held by the vote_routerstatus object rs. */ -static void -vote_routerstatus_free(vote_routerstatus_t *rs) -{ - vote_microdesc_hash_t *h, *next; - if (!rs) - return; - tor_free(rs->version); - tor_free(rs->status.exitsummary); - for (h = rs->microdesc; h; h = next) { - tor_free(h->microdesc_hash_line); - next = h->next; - tor_free(h); - } - tor_free(rs); -} - -/** Free all storage held by the routerstatus object rs. */ -void -routerstatus_free(routerstatus_t *rs) -{ - if (!rs) - return; - tor_free(rs->exitsummary); - tor_free(rs); -} - -/** Free all storage held in sig */ -void -document_signature_free(document_signature_t *sig) -{ - tor_free(sig->signature); - tor_free(sig); -} - -/** Return a newly allocated copy of sig */ -document_signature_t * -document_signature_dup(const document_signature_t *sig) -{ - document_signature_t *r = tor_memdup(sig, sizeof(document_signature_t)); - if (r->signature) - r->signature = tor_memdup(sig->signature, sig->signature_len); - return r; -} - -/** Free all storage held in ns. */ -void -networkstatus_vote_free(networkstatus_t *ns) -{ - if (!ns) - return; - - tor_free(ns->client_versions); - tor_free(ns->server_versions); - if (ns->known_flags) { - SMARTLIST_FOREACH(ns->known_flags, char *, c, tor_free(c)); - smartlist_free(ns->known_flags); - } - if (ns->weight_params) { - SMARTLIST_FOREACH(ns->weight_params, char *, c, tor_free(c)); - smartlist_free(ns->weight_params); - } - if (ns->net_params) { - SMARTLIST_FOREACH(ns->net_params, char *, c, tor_free(c)); - smartlist_free(ns->net_params); - } - if (ns->supported_methods) { - SMARTLIST_FOREACH(ns->supported_methods, char *, c, tor_free(c)); - smartlist_free(ns->supported_methods); - } - if (ns->voters) { - SMARTLIST_FOREACH_BEGIN(ns->voters, networkstatus_voter_info_t *, voter) { - tor_free(voter->nickname); - tor_free(voter->address); - tor_free(voter->contact); - if (voter->sigs) { - SMARTLIST_FOREACH(voter->sigs, document_signature_t *, sig, - document_signature_free(sig)); - smartlist_free(voter->sigs); - } - tor_free(voter); - } SMARTLIST_FOREACH_END(voter); - smartlist_free(ns->voters); - } - authority_cert_free(ns->cert); - - if (ns->routerstatus_list) { - if (ns->type == NS_TYPE_VOTE || ns->type == NS_TYPE_OPINION) { - SMARTLIST_FOREACH(ns->routerstatus_list, vote_routerstatus_t *, rs, - vote_routerstatus_free(rs)); - } else { - SMARTLIST_FOREACH(ns->routerstatus_list, routerstatus_t *, rs, - routerstatus_free(rs)); - } - - smartlist_free(ns->routerstatus_list); - } - - digestmap_free(ns->desc_digest_map, NULL); - - memwipe(ns, 11, sizeof(*ns)); - tor_free(ns); -} - -/** Return the voter info from vote for the voter whose identity digest - * is identity, or NULL if no such voter is associated with - * vote. */ -networkstatus_voter_info_t * -networkstatus_get_voter_by_id(networkstatus_t *vote, - const char *identity) -{ - if (!vote || !vote->voters) - return NULL; - SMARTLIST_FOREACH(vote->voters, networkstatus_voter_info_t *, voter, - if (fast_memeq(voter->identity_digest, identity, DIGEST_LEN)) - return voter); - return NULL; -} - -/** Check whether the signature sig is correctly signed with the - * signing key in cert. Return -1 if cert doesn't match the - * signing key; otherwise set the good_signature or bad_signature flag on - * voter, and return 0. */ -int -networkstatus_check_document_signature(const networkstatus_t *consensus, - document_signature_t *sig, - const authority_cert_t *cert) -{ - char key_digest[DIGEST_LEN]; - const int dlen = sig->alg == DIGEST_SHA1 ? DIGEST_LEN : DIGEST256_LEN; - char *signed_digest; - size_t signed_digest_len; - - if (crypto_pk_get_digest(cert->signing_key, key_digest)<0) - return -1; - if (tor_memneq(sig->signing_key_digest, key_digest, DIGEST_LEN) || - tor_memneq(sig->identity_digest, cert->cache_info.identity_digest, - DIGEST_LEN)) - return -1; - - signed_digest_len = crypto_pk_keysize(cert->signing_key); - signed_digest = tor_malloc(signed_digest_len); - if (crypto_pk_public_checksig(cert->signing_key, - signed_digest, - signed_digest_len, - sig->signature, - sig->signature_len) < dlen || - tor_memneq(signed_digest, consensus->digests.d[sig->alg], dlen)) { - log_warn(LD_DIR, "Got a bad signature on a networkstatus vote"); - sig->bad_signature = 1; - } else { - sig->good_signature = 1; - } - tor_free(signed_digest); - return 0; -} - -/** Given a v3 networkstatus consensus in consensus, check every - * as-yet-unchecked signature on consensus. Return 1 if there is a - * signature from every recognized authority on it, 0 if there are - * enough good signatures from recognized authorities on it, -1 if we might - * get enough good signatures by fetching missing certificates, and -2 - * otherwise. Log messages at INFO or WARN: if warn is over 1, warn - * about every problem; if warn is at least 1, warn only if we can't get - * enough signatures; if warn is negative, log nothing at all. */ -int -networkstatus_check_consensus_signature(networkstatus_t *consensus, - int warn) -{ - int n_good = 0; - int n_missing_key = 0, n_dl_failed_key = 0; - int n_bad = 0; - int n_unknown = 0; - int n_no_signature = 0; - int n_v3_authorities = get_n_authorities(V3_DIRINFO); - int n_required = n_v3_authorities/2 + 1; - smartlist_t *list_good = smartlist_new(); - smartlist_t *list_no_signature = smartlist_new(); - smartlist_t *need_certs_from = smartlist_new(); - smartlist_t *unrecognized = smartlist_new(); - smartlist_t *missing_authorities = smartlist_new(); - int severity; - time_t now = time(NULL); - - tor_assert(consensus->type == NS_TYPE_CONSENSUS); - - SMARTLIST_FOREACH_BEGIN(consensus->voters, networkstatus_voter_info_t *, - voter) { - int good_here = 0; - int bad_here = 0; - int unknown_here = 0; - int missing_key_here = 0, dl_failed_key_here = 0; - SMARTLIST_FOREACH_BEGIN(voter->sigs, document_signature_t *, sig) { - if (!sig->good_signature && !sig->bad_signature && - sig->signature) { - /* we can try to check the signature. */ - int is_v3_auth = trusteddirserver_get_by_v3_auth_digest( - sig->identity_digest) != NULL; - authority_cert_t *cert = - authority_cert_get_by_digests(sig->identity_digest, - sig->signing_key_digest); - tor_assert(tor_memeq(sig->identity_digest, voter->identity_digest, - DIGEST_LEN)); - - if (!is_v3_auth) { - smartlist_add(unrecognized, voter); - ++unknown_here; - continue; - } else if (!cert || cert->expires < now) { - smartlist_add(need_certs_from, voter); - ++missing_key_here; - if (authority_cert_dl_looks_uncertain(sig->identity_digest)) - ++dl_failed_key_here; - continue; - } - if (networkstatus_check_document_signature(consensus, sig, cert) < 0) { - smartlist_add(need_certs_from, voter); - ++missing_key_here; - if (authority_cert_dl_looks_uncertain(sig->identity_digest)) - ++dl_failed_key_here; - continue; - } - } - if (sig->good_signature) - ++good_here; - else if (sig->bad_signature) - ++bad_here; - } SMARTLIST_FOREACH_END(sig); - - if (good_here) { - ++n_good; - smartlist_add(list_good, voter->nickname); - } else if (bad_here) { - ++n_bad; - } else if (missing_key_here) { - ++n_missing_key; - if (dl_failed_key_here) - ++n_dl_failed_key; - } else if (unknown_here) { - ++n_unknown; - } else { - ++n_no_signature; - smartlist_add(list_no_signature, voter->nickname); - } - } SMARTLIST_FOREACH_END(voter); - - /* Now see whether we're missing any voters entirely. */ - SMARTLIST_FOREACH(router_get_trusted_dir_servers(), - dir_server_t *, ds, - { - if ((ds->type & V3_DIRINFO) && - !networkstatus_get_voter_by_id(consensus, ds->v3_identity_digest)) - smartlist_add(missing_authorities, ds); - }); - - if (warn > 1 || (warn >= 0 && - (n_good + n_missing_key - n_dl_failed_key < n_required))) { - severity = LOG_WARN; - } else { - severity = LOG_INFO; - } - - if (warn >= 0) { - SMARTLIST_FOREACH(unrecognized, networkstatus_voter_info_t *, voter, - { - tor_log(severity, LD_DIR, "Consensus includes unrecognized authority " - "'%s' at %s:%d (contact %s; identity %s)", - voter->nickname, voter->address, (int)voter->dir_port, - voter->contact?voter->contact:"n/a", - hex_str(voter->identity_digest, DIGEST_LEN)); - }); - SMARTLIST_FOREACH(need_certs_from, networkstatus_voter_info_t *, voter, - { - tor_log(severity, LD_DIR, "Looks like we need to download a new " - "certificate from authority '%s' at %s:%d (contact %s; " - "identity %s)", - voter->nickname, voter->address, (int)voter->dir_port, - voter->contact?voter->contact:"n/a", - hex_str(voter->identity_digest, DIGEST_LEN)); - }); - SMARTLIST_FOREACH(missing_authorities, dir_server_t *, ds, - { - tor_log(severity, LD_DIR, "Consensus does not include configured " - "authority '%s' at %s:%d (identity %s)", - ds->nickname, ds->address, (int)ds->dir_port, - hex_str(ds->v3_identity_digest, DIGEST_LEN)); - }); - { - char *joined; - smartlist_t *sl = smartlist_new(); - char *tmp = smartlist_join_strings(list_good, " ", 0, NULL); - smartlist_add_asprintf(sl, - "A consensus needs %d good signatures from recognized " - "authorities for us to accept it. This one has %d (%s).", - n_required, n_good, tmp); - tor_free(tmp); - if (n_no_signature) { - tmp = smartlist_join_strings(list_no_signature, " ", 0, NULL); - smartlist_add_asprintf(sl, - "%d (%s) of the authorities we know didn't sign it.", - n_no_signature, tmp); - tor_free(tmp); - } - if (n_unknown) { - smartlist_add_asprintf(sl, - "It has %d signatures from authorities we don't " - "recognize.", n_unknown); - } - if (n_bad) { - smartlist_add_asprintf(sl, "%d of the signatures on it didn't verify " - "correctly.", n_bad); - } - if (n_missing_key) { - smartlist_add_asprintf(sl, - "We were unable to check %d of the signatures, " - "because we were missing the keys.", n_missing_key); - } - joined = smartlist_join_strings(sl, " ", 0, NULL); - tor_log(severity, LD_DIR, "%s", joined); - tor_free(joined); - SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); - smartlist_free(sl); - } - } - - smartlist_free(list_good); - smartlist_free(list_no_signature); - smartlist_free(unrecognized); - smartlist_free(need_certs_from); - smartlist_free(missing_authorities); - - if (n_good == n_v3_authorities) - return 1; - else if (n_good >= n_required) - return 0; - else if (n_good + n_missing_key >= n_required) - return -1; - else - return -2; -} - -/** Helper: return a newly allocated string containing the name of the filename - * where we plan to cache the network status with the given identity digest. */ -char * -networkstatus_get_cache_filename(const char *identity_digest) -{ - char fp[HEX_DIGEST_LEN+1]; - base16_encode(fp, HEX_DIGEST_LEN+1, identity_digest, DIGEST_LEN); - return get_datadir_fname2("cached-status", fp); -} - -/** How far in the future do we allow a network-status to get before removing - * it? (seconds) */ -#define NETWORKSTATUS_ALLOW_SKEW (24*60*60) - -/** Helper for bsearching a list of routerstatus_t pointers: compare a - * digest in the key to the identity digest of a routerstatus_t. */ -int -compare_digest_to_routerstatus_entry(const void *_key, const void **_member) -{ - const char *key = _key; - const routerstatus_t *rs = *_member; - return tor_memcmp(key, rs->identity_digest, DIGEST_LEN); -} - -/** Helper for bsearching a list of routerstatus_t pointers: compare a - * digest in the key to the identity digest of a routerstatus_t. */ -int -compare_digest_to_vote_routerstatus_entry(const void *_key, - const void **_member) -{ - const char *key = _key; - const vote_routerstatus_t *vrs = *_member; - return tor_memcmp(key, vrs->status.identity_digest, DIGEST_LEN); -} - -/** As networkstatus_find_entry, but do not return a const pointer */ -routerstatus_t * -networkstatus_vote_find_mutable_entry(networkstatus_t *ns, const char *digest) -{ - return smartlist_bsearch(ns->routerstatus_list, digest, - compare_digest_to_routerstatus_entry); -} - -/** Return the entry in ns for the identity digest digest, or - * NULL if none was found. */ -const routerstatus_t * -networkstatus_vote_find_entry(networkstatus_t *ns, const char *digest) -{ - return networkstatus_vote_find_mutable_entry(ns, digest); -} - -/*XXXX MOVE make this static once functions are moved into this file. */ -/** Search the routerstatuses in ns for one whose identity digest is - * digest. Return value and set *found_out as for - * smartlist_bsearch_idx(). */ -int -networkstatus_vote_find_entry_idx(networkstatus_t *ns, - const char *digest, int *found_out) -{ - return smartlist_bsearch_idx(ns->routerstatus_list, digest, - compare_digest_to_routerstatus_entry, - found_out); -} - -/** As router_get_consensus_status_by_descriptor_digest, but does not return - * a const pointer. */ -routerstatus_t * -router_get_mutable_consensus_status_by_descriptor_digest( - networkstatus_t *consensus, - const char *digest) -{ - if (!consensus) - consensus = current_consensus; - if (!consensus) - return NULL; - if (!consensus->desc_digest_map) { - digestmap_t *m = consensus->desc_digest_map = digestmap_new(); - SMARTLIST_FOREACH(consensus->routerstatus_list, - routerstatus_t *, rs, - { - digestmap_set(m, rs->descriptor_digest, rs); - }); - } - return digestmap_get(consensus->desc_digest_map, digest); -} - -/** Return the consensus view of the status of the router whose current - * descriptor digest in consensus is digest, or NULL if - * no such router is known. */ -const routerstatus_t * -router_get_consensus_status_by_descriptor_digest(networkstatus_t *consensus, - const char *digest) -{ - return router_get_mutable_consensus_status_by_descriptor_digest( - consensus, digest); -} - -/** Given the digest of a router descriptor, return its current download - * status, or NULL if the digest is unrecognized. */ -download_status_t * -router_get_dl_status_by_descriptor_digest(const char *d) -{ - routerstatus_t *rs; - if (!current_ns_consensus) - return NULL; - if ((rs = router_get_mutable_consensus_status_by_descriptor_digest( - current_ns_consensus, d))) - return &rs->dl_status; - - return NULL; -} - -/** As router_get_consensus_status_by_id, but do not return a const pointer */ -routerstatus_t * -router_get_mutable_consensus_status_by_id(const char *digest) -{ - if (!current_consensus) - return NULL; - return smartlist_bsearch(current_consensus->routerstatus_list, digest, - compare_digest_to_routerstatus_entry); -} - -/** Return the consensus view of the status of the router whose identity - * digest is digest, or NULL if we don't know about any such router. */ -const routerstatus_t * -router_get_consensus_status_by_id(const char *digest) -{ - return router_get_mutable_consensus_status_by_id(digest); -} - -/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return - * the corresponding routerstatus_t, or NULL if none exists. Warn the - * user if warn_if_unnamed is set, and they have specified a router by - * nickname, but the Named flag isn't set for that router. */ -const routerstatus_t * -router_get_consensus_status_by_nickname(const char *nickname, - int warn_if_unnamed) -{ - const node_t *node = node_get_by_nickname(nickname, warn_if_unnamed); - if (node) - return node->rs; - else - return NULL; -} - -/** Return the identity digest that's mapped to officially by - * nickname. */ -const char * -networkstatus_get_router_digest_by_nickname(const char *nickname) -{ - if (!named_server_map) - return NULL; - return strmap_get_lc(named_server_map, nickname); -} - -/** Return true iff nickname is disallowed from being the nickname - * of any server. */ -int -networkstatus_nickname_is_unnamed(const char *nickname) -{ - if (!unnamed_server_map) - return 0; - return strmap_get_lc(unnamed_server_map, nickname) != NULL; -} - -/** How frequently do directory authorities re-download fresh networkstatus - * documents? */ -#define AUTHORITY_NS_CACHE_INTERVAL (10*60) - -/** How frequently do non-authority directory caches re-download fresh - * networkstatus documents? */ -#define NONAUTHORITY_NS_CACHE_INTERVAL (60*60) - -/** Return true iff, given the options listed in options, flavor - * is the flavor of a consensus networkstatus that we would like to fetch. */ -static int -we_want_to_fetch_flavor(const or_options_t *options, int flavor) -{ - if (flavor < 0 || flavor > N_CONSENSUS_FLAVORS) { - /* This flavor is crazy; we don't want it */ - /*XXXX handle unrecognized flavors later */ - return 0; - } - if (authdir_mode_v3(options) || directory_caches_dir_info(options)) { - /* We want to serve all flavors to others, regardless if we would use - * it ourselves. */ - return 1; - } - if (options->FetchUselessDescriptors) { - /* In order to get all descriptors, we need to fetch all consensuses. */ - return 1; - } - /* Otherwise, we want the flavor only if we want to use it to build - * circuits. */ - return flavor == usable_consensus_flavor(); -} - -/** How long will we hang onto a possibly live consensus for which we're - * fetching certs before we check whether there is a better one? */ -#define DELAY_WHILE_FETCHING_CERTS (20*60) - -/** If we want to download a fresh consensus, launch a new download as - * appropriate. */ -static void -update_consensus_networkstatus_downloads(time_t now) -{ - int i; - const or_options_t *options = get_options(); - - for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { - /* XXXX need some way to download unknown flavors if we are caching. */ - const char *resource; - consensus_waiting_for_certs_t *waiting; - networkstatus_t *c; - - if (! we_want_to_fetch_flavor(options, i)) - continue; - - c = networkstatus_get_latest_consensus_by_flavor(i); - if (! (c && c->valid_after <= now && now <= c->valid_until)) { - /* No live consensus? Get one now!*/ - time_to_download_next_consensus[i] = now; - } - - if (time_to_download_next_consensus[i] > now) - continue; /* Wait until the current consensus is older. */ - - resource = networkstatus_get_flavor_name(i); - - if (!download_status_is_ready(&consensus_dl_status[i], now, - options->TestingConsensusMaxDownloadTries)) - continue; /* We failed downloading a consensus too recently. */ - if (connection_dir_get_by_purpose_and_resource( - DIR_PURPOSE_FETCH_CONSENSUS, resource)) - continue; /* There's an in-progress download.*/ - - waiting = &consensus_waiting_for_certs[i]; - if (waiting->consensus) { - /* XXXX make sure this doesn't delay sane downloads. */ - if (waiting->set_at + DELAY_WHILE_FETCHING_CERTS > now) { - continue; /* We're still getting certs for this one. */ - } else { - if (!waiting->dl_failed) { - download_status_failed(&consensus_dl_status[i], 0); - waiting->dl_failed=1; - } - } - } - - log_info(LD_DIR, "Launching %s networkstatus consensus download.", - networkstatus_get_flavor_name(i)); - - directory_get_from_dirserver(DIR_PURPOSE_FETCH_CONSENSUS, - ROUTER_PURPOSE_GENERAL, resource, - PDS_RETRY_IF_NO_SERVERS); - } -} - -/** Called when an attempt to download a consensus fails: note that the - * failure occurred, and possibly retry. */ -void -networkstatus_consensus_download_failed(int status_code, const char *flavname) -{ - int flav = networkstatus_parse_flavor_name(flavname); - if (flav >= 0) { - tor_assert(flav < N_CONSENSUS_FLAVORS); - /* XXXX handle unrecognized flavors */ - download_status_failed(&consensus_dl_status[flav], status_code); - /* Retry immediately, if appropriate. */ - update_consensus_networkstatus_downloads(time(NULL)); - } -} - -/** How long do we (as a cache) wait after a consensus becomes non-fresh - * before trying to fetch another? */ -#define CONSENSUS_MIN_SECONDS_BEFORE_CACHING 120 - -/** Update the time at which we'll consider replacing the current - * consensus of flavor flav */ -static void -update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) -{ - const or_options_t *options = get_options(); - networkstatus_t *c = networkstatus_get_latest_consensus_by_flavor(flav); - const char *flavor = networkstatus_get_flavor_name(flav); - if (! we_want_to_fetch_flavor(get_options(), flav)) - return; - - if (c && c->valid_after <= now && now <= c->valid_until) { - long dl_interval; - long interval = c->fresh_until - c->valid_after; - long min_sec_before_caching = CONSENSUS_MIN_SECONDS_BEFORE_CACHING; - time_t start; - - if (min_sec_before_caching > interval/16) { - /* Usually we allow 2-minutes slop factor in case clocks get - desynchronized a little. If we're on a private network with - a crazy-fast voting interval, though, 2 minutes may be too - much. */ - min_sec_before_caching = interval/16; - } - - if (directory_fetches_dir_info_early(options)) { - /* We want to cache the next one at some point after this one - * is no longer fresh... */ - start = c->fresh_until + min_sec_before_caching; - /* Some clients may need the consensus sooner than others. */ - if (options->FetchDirInfoExtraEarly || authdir_mode_v3(options)) { - dl_interval = 60; - if (min_sec_before_caching + dl_interval > interval) - dl_interval = interval/2; - } else { - /* But only in the first half-interval after that. */ - dl_interval = interval/2; - } - } else { - /* We're an ordinary client or a bridge. Give all the caches enough - * time to download the consensus. */ - start = c->fresh_until + (interval*3)/4; - /* But download the next one well before this one is expired. */ - dl_interval = ((c->valid_until - start) * 7 )/ 8; - - /* If we're a bridge user, make use of the numbers we just computed - * to choose the rest of the interval *after* them. */ - if (directory_fetches_dir_info_later(options)) { - /* Give all the *clients* enough time to download the consensus. */ - start = start + dl_interval + min_sec_before_caching; - /* But try to get it before ours actually expires. */ - dl_interval = (c->valid_until - start) - min_sec_before_caching; - } - } - if (dl_interval < 1) - dl_interval = 1; - /* We must not try to replace c while it's still fresh: */ - tor_assert(c->fresh_until < start); - /* We must download the next one before c is invalid: */ - tor_assert(start+dl_interval < c->valid_until); - time_to_download_next_consensus[flav] = - start + crypto_rand_int((int)dl_interval); - { - char tbuf1[ISO_TIME_LEN+1]; - char tbuf2[ISO_TIME_LEN+1]; - char tbuf3[ISO_TIME_LEN+1]; - format_local_iso_time(tbuf1, c->fresh_until); - format_local_iso_time(tbuf2, c->valid_until); - format_local_iso_time(tbuf3, time_to_download_next_consensus[flav]); - log_info(LD_DIR, "Live %s consensus %s the most recent until %s and " - "will expire at %s; fetching the next one at %s.", - flavor, (c->fresh_until > now) ? "will be" : "was", - tbuf1, tbuf2, tbuf3); - } - } else { - time_to_download_next_consensus[flav] = now; - log_info(LD_DIR, "No live %s consensus; we should fetch one immediately.", - flavor); - } -} - -/** Update the time at which we'll consider replacing the current - * consensus of flavor 'flavor' */ -void -update_consensus_networkstatus_fetch_time(time_t now) -{ - int i; - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - if (we_want_to_fetch_flavor(get_options(), i)) - update_consensus_networkstatus_fetch_time_impl(now, i); - } -} - -/** Return 1 if there's a reason we shouldn't try any directory - * fetches yet (e.g. we demand bridges and none are yet known). - * Else return 0. */ -int -should_delay_dir_fetches(const or_options_t *options) -{ - if (options->UseBridges && !any_bridge_descriptors_known()) { - log_info(LD_DIR, "delaying dir fetches (no running bridges known)"); - return 1; - } - return 0; -} - -/** Launch requests for networkstatus documents and authority certificates as - * appropriate. */ -void -update_networkstatus_downloads(time_t now) -{ - const or_options_t *options = get_options(); - if (should_delay_dir_fetches(options)) - return; - update_consensus_networkstatus_downloads(now); - update_certificate_downloads(now); -} - -/** Launch requests as appropriate for missing directory authority - * certificates. */ -void -update_certificate_downloads(time_t now) -{ - int i; - for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) { - if (consensus_waiting_for_certs[i].consensus) - authority_certs_fetch_missing(consensus_waiting_for_certs[i].consensus, - now); - } - - if (current_ns_consensus) - authority_certs_fetch_missing(current_ns_consensus, now); - if (current_md_consensus) - authority_certs_fetch_missing(current_md_consensus, now); -} - -/** Return 1 if we have a consensus but we don't have enough certificates - * to start using it yet. */ -int -consensus_is_waiting_for_certs(void) -{ - return consensus_waiting_for_certs[usable_consensus_flavor()].consensus - ? 1 : 0; -} - -/** Return the most recent consensus that we have downloaded, or NULL if we - * don't have one. */ -networkstatus_t * -networkstatus_get_latest_consensus(void) -{ - return current_consensus; -} - -/** Return the latest consensus we have whose flavor matches f, or NULL - * if we don't have one. */ -networkstatus_t * -networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f) -{ - if (f == FLAV_NS) - return current_ns_consensus; - else if (f == FLAV_MICRODESC) - return current_md_consensus; - else { - tor_assert(0); - return NULL; - } -} - -/** Return the most recent consensus that we have downloaded, or NULL if it is - * no longer live. */ -networkstatus_t * -networkstatus_get_live_consensus(time_t now) -{ - if (current_consensus && - current_consensus->valid_after <= now && - now <= current_consensus->valid_until) - return current_consensus; - else - return NULL; -} - -/* XXXX remove this in favor of get_live_consensus. But actually, - * leave something like it for bridge users, who need to not totally - * lose if they spend a while fetching a new consensus. */ -/** As networkstatus_get_live_consensus(), but is way more tolerant of expired - * consensuses. */ -networkstatus_t * -networkstatus_get_reasonably_live_consensus(time_t now, int flavor) -{ -#define REASONABLY_LIVE_TIME (24*60*60) - networkstatus_t *consensus = - networkstatus_get_latest_consensus_by_flavor(flavor); - if (consensus && - consensus->valid_after <= now && - now <= consensus->valid_until+REASONABLY_LIVE_TIME) - return consensus; - else - return NULL; -} - -/** Given two router status entries for the same router identity, return 1 if - * if the contents have changed between them. Otherwise, return 0. */ -static int -routerstatus_has_changed(const routerstatus_t *a, const routerstatus_t *b) -{ - tor_assert(tor_memeq(a->identity_digest, b->identity_digest, DIGEST_LEN)); - - return strcmp(a->nickname, b->nickname) || - fast_memneq(a->descriptor_digest, b->descriptor_digest, DIGEST_LEN) || - a->addr != b->addr || - a->or_port != b->or_port || - a->dir_port != b->dir_port || - a->is_authority != b->is_authority || - a->is_exit != b->is_exit || - a->is_stable != b->is_stable || - a->is_fast != b->is_fast || - a->is_flagged_running != b->is_flagged_running || - a->is_named != b->is_named || - a->is_unnamed != b->is_unnamed || - a->is_valid != b->is_valid || - a->is_possible_guard != b->is_possible_guard || - a->is_bad_exit != b->is_bad_exit || - a->is_bad_directory != b->is_bad_directory || - a->is_hs_dir != b->is_hs_dir || - a->version_known != b->version_known; -} - -/** Notify controllers of any router status entries that changed between - * old_c and new_c. */ -static void -notify_control_networkstatus_changed(const networkstatus_t *old_c, - const networkstatus_t *new_c) -{ - smartlist_t *changed; - if (old_c == new_c) - return; - - /* tell the controller exactly which relays are still listed, as well - * as what they're listed as */ - control_event_newconsensus(new_c); - - if (!control_event_is_interesting(EVENT_NS)) - return; - - if (!old_c) { - control_event_networkstatus_changed(new_c->routerstatus_list); - return; - } - changed = smartlist_new(); - - SMARTLIST_FOREACH_JOIN( - old_c->routerstatus_list, const routerstatus_t *, rs_old, - new_c->routerstatus_list, const routerstatus_t *, rs_new, - tor_memcmp(rs_old->identity_digest, - rs_new->identity_digest, DIGEST_LEN), - smartlist_add(changed, (void*) rs_new)) { - if (routerstatus_has_changed(rs_old, rs_new)) - smartlist_add(changed, (void*)rs_new); - } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); - - control_event_networkstatus_changed(changed); - smartlist_free(changed); -} - -/** Copy all the ancillary information (like router download status and so on) - * from old_c to new_c. */ -static void -networkstatus_copy_old_consensus_info(networkstatus_t *new_c, - const networkstatus_t *old_c) -{ - if (old_c == new_c) - return; - if (!old_c || !smartlist_len(old_c->routerstatus_list)) - return; - - SMARTLIST_FOREACH_JOIN(old_c->routerstatus_list, routerstatus_t *, rs_old, - new_c->routerstatus_list, routerstatus_t *, rs_new, - tor_memcmp(rs_old->identity_digest, - rs_new->identity_digest, DIGEST_LEN), - STMT_NIL) { - /* Okay, so we're looking at the same identity. */ - rs_new->last_dir_503_at = rs_old->last_dir_503_at; - - if (tor_memeq(rs_old->descriptor_digest, rs_new->descriptor_digest, - DIGEST_LEN)) { - /* And the same descriptor too! */ - memcpy(&rs_new->dl_status, &rs_old->dl_status,sizeof(download_status_t)); - } - } SMARTLIST_FOREACH_JOIN_END(rs_old, rs_new); -} - -/** Try to replace the current cached v3 networkstatus with the one in - * consensus. If we don't have enough certificates to validate it, - * store it in consensus_waiting_for_certs and launch a certificate fetch. - * - * If flags & NSSET_FROM_CACHE, this networkstatus has come from the disk - * cache. If flags & NSSET_WAS_WAITING_FOR_CERTS, this networkstatus was - * already received, but we were waiting for certificates on it. If flags & - * NSSET_DONT_DOWNLOAD_CERTS, do not launch certificate downloads as needed. - * If flags & NSSET_ACCEPT_OBSOLETE, then we should be willing to take this - * consensus, even if it comes from many days in the past. - * - * Return 0 on success, <0 on failure. On failure, caller should increment - * the failure count as appropriate. - * - * We return -1 for mild failures that don't need to be reported to the - * user, and -2 for more serious problems. - */ -int -networkstatus_set_current_consensus(const char *consensus, - const char *flavor, - unsigned flags) -{ - networkstatus_t *c=NULL; - int r, result = -1; - time_t now = time(NULL); - const or_options_t *options = get_options(); - char *unverified_fname = NULL, *consensus_fname = NULL; - int flav = networkstatus_parse_flavor_name(flavor); - const unsigned from_cache = flags & NSSET_FROM_CACHE; - const unsigned was_waiting_for_certs = flags & NSSET_WAS_WAITING_FOR_CERTS; - const unsigned dl_certs = !(flags & NSSET_DONT_DOWNLOAD_CERTS); - const unsigned accept_obsolete = flags & NSSET_ACCEPT_OBSOLETE; - const unsigned require_flavor = flags & NSSET_REQUIRE_FLAVOR; - const digests_t *current_digests = NULL; - consensus_waiting_for_certs_t *waiting = NULL; - time_t current_valid_after = 0; - int free_consensus = 1; /* Free 'c' at the end of the function */ - int old_ewma_enabled; - - if (flav < 0) { - /* XXXX we don't handle unrecognized flavors yet. */ - log_warn(LD_BUG, "Unrecognized consensus flavor %s", flavor); - return -2; - } - - /* Make sure it's parseable. */ - c = networkstatus_parse_vote_from_string(consensus, NULL, NS_TYPE_CONSENSUS); - if (!c) { - log_warn(LD_DIR, "Unable to parse networkstatus consensus"); - result = -2; - goto done; - } - - if ((int)c->flavor != flav) { - /* This wasn't the flavor we thought we were getting. */ - if (require_flavor) { - log_warn(LD_DIR, "Got consensus with unexpected flavor %s (wanted %s)", - networkstatus_get_flavor_name(c->flavor), flavor); - goto done; - } - flav = c->flavor; - flavor = networkstatus_get_flavor_name(flav); - } - - if (flav != usable_consensus_flavor() && - !directory_caches_dir_info(options)) { - /* This consensus is totally boring to us: we won't use it, and we won't - * serve it. Drop it. */ - goto done; - } - - if (from_cache && !accept_obsolete && - c->valid_until < now-OLD_ROUTER_DESC_MAX_AGE) { - log_info(LD_DIR, "Loaded an expired consensus. Discarding."); - goto done; - } - - if (!strcmp(flavor, "ns")) { - consensus_fname = get_datadir_fname("cached-consensus"); - unverified_fname = get_datadir_fname("unverified-consensus"); - if (current_ns_consensus) { - current_digests = ¤t_ns_consensus->digests; - current_valid_after = current_ns_consensus->valid_after; - } - } else if (!strcmp(flavor, "microdesc")) { - consensus_fname = get_datadir_fname("cached-microdesc-consensus"); - unverified_fname = get_datadir_fname("unverified-microdesc-consensus"); - if (current_md_consensus) { - current_digests = ¤t_md_consensus->digests; - current_valid_after = current_md_consensus->valid_after; - } - } else { - cached_dir_t *cur; - char buf[128]; - tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); - consensus_fname = get_datadir_fname(buf); - tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); - unverified_fname = get_datadir_fname(buf); - cur = dirserv_get_consensus(flavor); - if (cur) { - current_digests = &cur->digests; - current_valid_after = cur->published; - } - } - - if (current_digests && - tor_memeq(&c->digests, current_digests, sizeof(c->digests))) { - /* We already have this one. That's a failure. */ - log_info(LD_DIR, "Got a %s consensus we already have", flavor); - goto done; - } - - if (current_valid_after && c->valid_after <= current_valid_after) { - /* We have a newer one. There's no point in accepting this one, - * even if it's great. */ - log_info(LD_DIR, "Got a %s consensus at least as old as the one we have", - flavor); - goto done; - } - - /* Make sure it's signed enough. */ - if ((r=networkstatus_check_consensus_signature(c, 1))<0) { - if (r == -1) { - /* Okay, so it _might_ be signed enough if we get more certificates. */ - if (!was_waiting_for_certs) { - log_info(LD_DIR, - "Not enough certificates to check networkstatus consensus"); - } - if (!current_valid_after || - c->valid_after > current_valid_after) { - waiting = &consensus_waiting_for_certs[flav]; - networkstatus_vote_free(waiting->consensus); - tor_free(waiting->body); - waiting->consensus = c; - free_consensus = 0; - waiting->body = tor_strdup(consensus); - waiting->set_at = now; - waiting->dl_failed = 0; - if (!from_cache) { - write_str_to_file(unverified_fname, consensus, 0); - } - if (dl_certs) - authority_certs_fetch_missing(c, now); - /* This case is not a success or a failure until we get the certs - * or fail to get the certs. */ - result = 0; - } else { - /* Even if we had enough signatures, we'd never use this as the - * latest consensus. */ - if (was_waiting_for_certs && from_cache) - unlink(unverified_fname); - } - goto done; - } else { - /* This can never be signed enough: Kill it. */ - if (!was_waiting_for_certs) { - log_warn(LD_DIR, "Not enough good signatures on networkstatus " - "consensus"); - result = -2; - } - if (was_waiting_for_certs && (r < -1) && from_cache) - unlink(unverified_fname); - goto done; - } - } - - if (!from_cache && flav == usable_consensus_flavor()) - control_event_client_status(LOG_NOTICE, "CONSENSUS_ARRIVED"); - - /* Are we missing any certificates at all? */ - if (r != 1 && dl_certs) - authority_certs_fetch_missing(c, now); - - if (flav == usable_consensus_flavor()) { - notify_control_networkstatus_changed(current_consensus, c); - } - if (flav == FLAV_NS) { - if (current_ns_consensus) { - networkstatus_copy_old_consensus_info(c, current_ns_consensus); - networkstatus_vote_free(current_ns_consensus); - /* Defensive programming : we should set current_consensus very soon, - * but we're about to call some stuff in the meantime, and leaving this - * dangling pointer around has proven to be trouble. */ - current_ns_consensus = NULL; - } - current_ns_consensus = c; - free_consensus = 0; /* avoid free */ - } else if (flav == FLAV_MICRODESC) { - if (current_md_consensus) { - networkstatus_copy_old_consensus_info(c, current_md_consensus); - networkstatus_vote_free(current_md_consensus); - /* more defensive programming */ - current_md_consensus = NULL; - } - current_md_consensus = c; - free_consensus = 0; /* avoid free */ - } - - waiting = &consensus_waiting_for_certs[flav]; - if (waiting->consensus && - waiting->consensus->valid_after <= c->valid_after) { - networkstatus_vote_free(waiting->consensus); - waiting->consensus = NULL; - if (consensus != waiting->body) - tor_free(waiting->body); - else - waiting->body = NULL; - waiting->set_at = 0; - waiting->dl_failed = 0; - unlink(unverified_fname); - } - - /* Reset the failure count only if this consensus is actually valid. */ - if (c->valid_after <= now && now <= c->valid_until) { - download_status_reset(&consensus_dl_status[flav]); - } else { - if (!from_cache) - download_status_failed(&consensus_dl_status[flav], 0); - } - - if (flav == usable_consensus_flavor()) { - /* XXXXNM Microdescs: needs a non-ns variant. ???? NM*/ - update_consensus_networkstatus_fetch_time(now); - - nodelist_set_consensus(current_consensus); - - dirvote_recalculate_timing(options, now); - routerstatus_list_update_named_server_map(); - - /* Update ewma and adjust policy if needed; first cache the old value */ - old_ewma_enabled = cell_ewma_enabled(); - /* Change the cell EWMA settings */ - cell_ewma_set_scale_factor(options, networkstatus_get_latest_consensus()); - /* If we just enabled ewma, set the cmux policy on all active channels */ - if (cell_ewma_enabled() && !old_ewma_enabled) { - channel_set_cmux_policy_everywhere(&ewma_policy); - } else if (!cell_ewma_enabled() && old_ewma_enabled) { - /* Turn it off everywhere */ - channel_set_cmux_policy_everywhere(NULL); - } - - /* XXXX024 this call might be unnecessary here: can changing the - * current consensus really alter our view of any OR's rate limits? */ - connection_or_update_token_buckets(get_connection_array(), options); - - circuit_build_times_new_consensus_params(get_circuit_build_times_mutable(), - current_consensus); - } - - if (directory_caches_dir_info(options)) { - dirserv_set_cached_consensus_networkstatus(consensus, - flavor, - &c->digests, - c->valid_after); - } - - if (!from_cache) { - write_str_to_file(consensus_fname, consensus, 0); - } - -/** If a consensus appears more than this many seconds before its declared - * valid-after time, declare that our clock is skewed. */ -#define EARLY_CONSENSUS_NOTICE_SKEW 60 - - if (now < c->valid_after - EARLY_CONSENSUS_NOTICE_SKEW) { - char tbuf[ISO_TIME_LEN+1]; - char dbuf[64]; - long delta = now - c->valid_after; - format_iso_time(tbuf, c->valid_after); - format_time_interval(dbuf, sizeof(dbuf), delta); - log_warn(LD_GENERAL, "Our clock is %s behind the time published in the " - "consensus network status document (%s UTC). Tor needs an " - "accurate clock to work correctly. Please check your time and " - "date settings!", dbuf, tbuf); - control_event_general_status(LOG_WARN, - "CLOCK_SKEW MIN_SKEW=%ld SOURCE=CONSENSUS", delta); - } - - router_dir_info_changed(); - - result = 0; - done: - if (free_consensus) - networkstatus_vote_free(c); - tor_free(consensus_fname); - tor_free(unverified_fname); - return result; -} - -/** Called when we have gotten more certificates: see whether we can - * now verify a pending consensus. */ -void -networkstatus_note_certs_arrived(void) -{ - int i; - for (i=0; iconsensus) - continue; - if (networkstatus_check_consensus_signature(waiting->consensus, 0)>=0) { - char *waiting_body = waiting->body; - if (!networkstatus_set_current_consensus( - waiting_body, - networkstatus_get_flavor_name(i), - NSSET_WAS_WAITING_FOR_CERTS)) { - tor_free(waiting_body); - } - } - } -} - -/** If the network-status list has changed since the last time we called this - * function, update the status of every routerinfo from the network-status - * list. If dir_version is 2, it's a v2 networkstatus that changed. - * If dir_version is 3, it's a v3 consensus that changed. - */ -void -routers_update_all_from_networkstatus(time_t now, int dir_version) -{ - routerlist_t *rl = router_get_routerlist(); - networkstatus_t *consensus = networkstatus_get_reasonably_live_consensus(now, - FLAV_NS); - - if (!consensus || dir_version < 3) /* nothing more we should do */ - return; - - /* calls router_dir_info_changed() when it's done -- more routers - * might be up or down now, which might affect whether there's enough - * directory info. */ - routers_update_status_from_consensus_networkstatus(rl->routers, 0); - - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, - ri->cache_info.routerlist_index = ri_sl_idx); - if (rl->old_routers) - signed_descs_update_status_from_consensus_networkstatus(rl->old_routers); - - if (!have_warned_about_old_version) { - int is_server = server_mode(get_options()); - version_status_t status; - const char *recommended = is_server ? - consensus->server_versions : consensus->client_versions; - status = tor_version_is_obsolete(VERSION, recommended); - - if (status == VS_RECOMMENDED) { - log_info(LD_GENERAL, "The directory authorities say my version is ok."); - } else if (status == VS_EMPTY) { - log_info(LD_GENERAL, - "The directory authorities don't recommend any versions."); - } else if (status == VS_NEW || status == VS_NEW_IN_SERIES) { - if (!have_warned_about_new_version) { - log_notice(LD_GENERAL, "This version of Tor (%s) is newer than any " - "recommended version%s, according to the directory " - "authorities. Recommended versions are: %s", - VERSION, - status == VS_NEW_IN_SERIES ? " in its series" : "", - recommended); - have_warned_about_new_version = 1; - control_event_general_status(LOG_WARN, "DANGEROUS_VERSION " - "CURRENT=%s REASON=%s RECOMMENDED=\"%s\"", - VERSION, "NEW", recommended); - } - } else { - log_warn(LD_GENERAL, "Please upgrade! " - "This version of Tor (%s) is %s, according to the directory " - "authorities. Recommended versions are: %s", - VERSION, - status == VS_OLD ? "obsolete" : "not recommended", - recommended); - have_warned_about_old_version = 1; - control_event_general_status(LOG_WARN, "DANGEROUS_VERSION " - "CURRENT=%s REASON=%s RECOMMENDED=\"%s\"", - VERSION, status == VS_OLD ? "OBSOLETE" : "UNRECOMMENDED", - recommended); - } - } -} - -/** Update our view of the list of named servers from the most recently - * retrieved networkstatus consensus. */ -static void -routerstatus_list_update_named_server_map(void) -{ - if (!current_consensus) - return; - - strmap_free(named_server_map, tor_free_); - named_server_map = strmap_new(); - strmap_free(unnamed_server_map, NULL); - unnamed_server_map = strmap_new(); - SMARTLIST_FOREACH_BEGIN(current_consensus->routerstatus_list, - const routerstatus_t *, rs) { - if (rs->is_named) { - strmap_set_lc(named_server_map, rs->nickname, - tor_memdup(rs->identity_digest, DIGEST_LEN)); - } - if (rs->is_unnamed) { - strmap_set_lc(unnamed_server_map, rs->nickname, (void*)1); - } - } SMARTLIST_FOREACH_END(rs); -} - -/** Given a list routers of routerinfo_t *, update each status field - * according to our current consensus networkstatus. May re-order - * routers. */ -void -routers_update_status_from_consensus_networkstatus(smartlist_t *routers, - int reset_failures) -{ - const or_options_t *options = get_options(); - int authdir = authdir_mode_v3(options); - networkstatus_t *ns = current_consensus; - if (!ns || !smartlist_len(ns->routerstatus_list)) - return; - - routers_sort_by_identity(routers); - - SMARTLIST_FOREACH_JOIN(ns->routerstatus_list, routerstatus_t *, rs, - routers, routerinfo_t *, router, - tor_memcmp(rs->identity_digest, - router->cache_info.identity_digest, DIGEST_LEN), - { - }) { - /* Is it the same descriptor, or only the same identity? */ - if (tor_memeq(router->cache_info.signed_descriptor_digest, - rs->descriptor_digest, DIGEST_LEN)) { - if (ns->valid_until > router->cache_info.last_listed_as_valid_until) - router->cache_info.last_listed_as_valid_until = ns->valid_until; - } - - if (authdir) { - /* If we _are_ an authority, we should check whether this router - * is one that will cause us to need a reachability test. */ - routerinfo_t *old_router = - router_get_mutable_by_digest(router->cache_info.identity_digest); - if (old_router != router) { - router->needs_retest_if_added = - dirserv_should_launch_reachability_test(router, old_router); - } - } - if (reset_failures) { - download_status_reset(&rs->dl_status); - } - } SMARTLIST_FOREACH_JOIN_END(rs, router); - - router_dir_info_changed(); -} - -/** Given a list of signed_descriptor_t, update their fields (mainly, when - * they were last listed) from the most recent consensus. */ -void -signed_descs_update_status_from_consensus_networkstatus(smartlist_t *descs) -{ - networkstatus_t *ns = current_ns_consensus; - if (!ns) - return; - - if (!ns->desc_digest_map) { - char dummy[DIGEST_LEN]; - /* instantiates the digest map. */ - memset(dummy, 0, sizeof(dummy)); - router_get_consensus_status_by_descriptor_digest(ns, dummy); - } - SMARTLIST_FOREACH(descs, signed_descriptor_t *, d, - { - const routerstatus_t *rs = digestmap_get(ns->desc_digest_map, - d->signed_descriptor_digest); - if (rs) { - if (ns->valid_until > d->last_listed_as_valid_until) - d->last_listed_as_valid_until = ns->valid_until; - } - }); -} - -/** Generate networkstatus lines for a single routerstatus_t object, and - * return the result in a newly allocated string. Used only by controller - * interface (for now.) */ -char * -networkstatus_getinfo_helper_single(const routerstatus_t *rs) -{ - return routerstatus_format_entry(rs, NULL, NS_CONTROL_PORT, NULL); -} - -/** Alloc and return a string describing routerstatuses for the most - * recent info of each router we know about that is of purpose - * purpose_string. Return NULL if unrecognized purpose. - * - * Right now this function is oriented toward listing bridges (you - * shouldn't use this for general-purpose routers, since those - * should be listed from the consensus, not from the routers list). */ -char * -networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now) -{ - time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - char *answer; - routerlist_t *rl = router_get_routerlist(); - smartlist_t *statuses; - uint8_t purpose = router_purpose_from_string(purpose_string); - routerstatus_t rs; - int bridge_auth = authdir_mode_bridge(get_options()); - - if (purpose == ROUTER_PURPOSE_UNKNOWN) { - log_info(LD_DIR, "Unrecognized purpose '%s' when listing router statuses.", - purpose_string); - return NULL; - } - - statuses = smartlist_new(); - SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) { - node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); - if (!node) - continue; - if (ri->cache_info.published_on < cutoff) - continue; - if (ri->purpose != purpose) - continue; - if (bridge_auth && ri->purpose == ROUTER_PURPOSE_BRIDGE) - dirserv_set_router_is_running(ri, now); - /* then generate and write out status lines for each of them */ - set_routerstatus_from_routerinfo(&rs, node, ri, now, 0, 0, 0, 0); - smartlist_add(statuses, networkstatus_getinfo_helper_single(&rs)); - } SMARTLIST_FOREACH_END(ri); - - answer = smartlist_join_strings(statuses, "", 0, NULL); - SMARTLIST_FOREACH(statuses, char *, cp, tor_free(cp)); - smartlist_free(statuses); - return answer; -} - -/** Write out router status entries for all our bridge descriptors. */ -void -networkstatus_dump_bridge_status_to_file(time_t now) -{ - char *status = networkstatus_getinfo_by_purpose("bridge", now); - const or_options_t *options = get_options(); - char *fname = NULL; - char *thresholds = NULL, *thresholds_and_status = NULL; - routerlist_t *rl = router_get_routerlist(); - dirserv_compute_bridge_flag_thresholds(rl); - thresholds = dirserv_get_flag_thresholds_line(); - tor_asprintf(&thresholds_and_status, "flag-thresholds %s\n%s", - thresholds, status); - tor_asprintf(&fname, "%s"PATH_SEPARATOR"networkstatus-bridges", - options->DataDirectory); - write_str_to_file(fname,thresholds_and_status,0); - tor_free(thresholds); - tor_free(thresholds_and_status); - tor_free(fname); - tor_free(status); -} - -/* DOCDOC get_net_param_from_list */ -static int32_t -get_net_param_from_list(smartlist_t *net_params, const char *param_name, - int32_t default_val, int32_t min_val, int32_t max_val) -{ - int32_t res = default_val; - size_t name_len = strlen(param_name); - - tor_assert(max_val > min_val); - tor_assert(min_val <= default_val); - tor_assert(max_val >= default_val); - - SMARTLIST_FOREACH_BEGIN(net_params, const char *, p) { - if (!strcmpstart(p, param_name) && p[name_len] == '=') { - int ok=0; - long v = tor_parse_long(p+name_len+1, 10, INT32_MIN, - INT32_MAX, &ok, NULL); - if (ok) { - res = (int32_t) v; - break; - } - } - } SMARTLIST_FOREACH_END(p); - - if (res < min_val) { - log_warn(LD_DIR, "Consensus parameter %s is too small. Got %d, raising to " - "%d.", param_name, res, min_val); - res = min_val; - } else if (res > max_val) { - log_warn(LD_DIR, "Consensus parameter %s is too large. Got %d, capping to " - "%d.", param_name, res, max_val); - res = max_val; - } - - return res; -} - -/** Return the value of a integer parameter from the networkstatus ns - * whose name is param_name. If ns is NULL, try loading the - * latest consensus ourselves. Return default_val if no latest - * consensus, or if it has no parameter called param_name. - * Make sure the value parsed from the consensus is at least - * min_val and at most max_val and raise/cap the parsed value - * if necessary. */ -int32_t -networkstatus_get_param(const networkstatus_t *ns, const char *param_name, - int32_t default_val, int32_t min_val, int32_t max_val) -{ - if (!ns) /* if they pass in null, go find it ourselves */ - ns = networkstatus_get_latest_consensus(); - - if (!ns || !ns->net_params) - return default_val; - - return get_net_param_from_list(ns->net_params, param_name, - default_val, min_val, max_val); -} - -/** - * Retrieve the consensus parameter that governs the - * fixed-point precision of our network balancing 'bandwidth-weights' - * (which are themselves integer consensus values). We divide them - * by this value and ensure they never exceed this value. - */ -int -networkstatus_get_weight_scale_param(networkstatus_t *ns) -{ - return networkstatus_get_param(ns, "bwweightscale", - BW_WEIGHT_SCALE, - BW_MIN_WEIGHT_SCALE, - BW_MAX_WEIGHT_SCALE); -} - -/** Return the value of a integer bw weight parameter from the networkstatus - * ns whose name is weight_name. If ns is NULL, try - * loading the latest consensus ourselves. Return default_val if no - * latest consensus, or if it has no parameter called weight_name. */ -int32_t -networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight_name, - int32_t default_val) -{ - int32_t param; - int max; - if (!ns) /* if they pass in null, go find it ourselves */ - ns = networkstatus_get_latest_consensus(); - - if (!ns || !ns->weight_params) - return default_val; - - max = networkstatus_get_weight_scale_param(ns); - param = get_net_param_from_list(ns->weight_params, weight_name, - default_val, -1, - BW_MAX_WEIGHT_SCALE); - if (param > max) { - log_warn(LD_DIR, "Value of consensus weight %s was too large, capping " - "to %d", weight_name, max); - param = max; - } - return param; -} - -/** Return the name of the consensus flavor flav as used to identify - * the flavor in directory documents. */ -const char * -networkstatus_get_flavor_name(consensus_flavor_t flav) -{ - switch (flav) { - case FLAV_NS: - return "ns"; - case FLAV_MICRODESC: - return "microdesc"; - default: - tor_fragile_assert(); - return "??"; - } -} - -/** Return the consensus_flavor_t value for the flavor called flavname, - * or -1 if the flavor is not recognized. */ -int -networkstatus_parse_flavor_name(const char *flavname) -{ - if (!strcmp(flavname, "ns")) - return FLAV_NS; - else if (!strcmp(flavname, "microdesc")) - return FLAV_MICRODESC; - else - return -1; -} - -/** Return 0 if this routerstatus is obsolete, too new, isn't - * running, or otherwise not a descriptor that we would make any - * use of even if we had it. Else return 1. */ -int -client_would_use_router(const routerstatus_t *rs, time_t now, - const or_options_t *options) -{ - if (!rs->is_flagged_running && !options->FetchUselessDescriptors) { - /* If we had this router descriptor, we wouldn't even bother using it. - * But, if we want to have a complete list, fetch it anyway. */ - return 0; - } - if (rs->published_on + options->TestingEstimatedDescriptorPropagationTime - > now) { - /* Most caches probably don't have this descriptor yet. */ - return 0; - } - if (rs->published_on + OLD_ROUTER_DESC_MAX_AGE < now) { - /* We'd drop it immediately for being too old. */ - return 0; - } - return 1; -} - -/** If question is a string beginning with "ns/" in a format the - * control interface expects for a GETINFO question, set *answer to a - * newly-allocated string containing networkstatus lines for the appropriate - * ORs. Return 0 on success, -1 on unrecognized question format. */ -int -getinfo_helper_networkstatus(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg) -{ - const routerstatus_t *status; - (void) conn; - - if (!current_consensus) { - *answer = tor_strdup(""); - return 0; - } - - if (!strcmp(question, "ns/all")) { - smartlist_t *statuses = smartlist_new(); - SMARTLIST_FOREACH(current_consensus->routerstatus_list, - const routerstatus_t *, rs, - { - smartlist_add(statuses, networkstatus_getinfo_helper_single(rs)); - }); - *answer = smartlist_join_strings(statuses, "", 0, NULL); - SMARTLIST_FOREACH(statuses, char *, cp, tor_free(cp)); - smartlist_free(statuses); - return 0; - } else if (!strcmpstart(question, "ns/id/")) { - char d[DIGEST_LEN]; - const char *q = question + 6; - if (*q == '$') - ++q; - - if (base16_decode(d, DIGEST_LEN, q, strlen(q))) { - *errmsg = "Data not decodeable as hex"; - return -1; - } - status = router_get_consensus_status_by_id(d); - } else if (!strcmpstart(question, "ns/name/")) { - status = router_get_consensus_status_by_nickname(question+8, 0); - } else if (!strcmpstart(question, "ns/purpose/")) { - *answer = networkstatus_getinfo_by_purpose(question+11, time(NULL)); - return *answer ? 0 : -1; - } else { - return 0; - } - - if (status) - *answer = networkstatus_getinfo_helper_single(status); - return 0; -} - -/** Free all storage held locally in this module. */ -void -networkstatus_free_all(void) -{ - int i; - networkstatus_vote_free(current_ns_consensus); - networkstatus_vote_free(current_md_consensus); - current_md_consensus = current_ns_consensus = NULL; - - for (i=0; i < N_CONSENSUS_FLAVORS; ++i) { - consensus_waiting_for_certs_t *waiting = &consensus_waiting_for_certs[i]; - if (waiting->consensus) { - networkstatus_vote_free(waiting->consensus); - waiting->consensus = NULL; - } - tor_free(waiting->body); - } - - strmap_free(named_server_map, tor_free_); - strmap_free(unnamed_server_map, NULL); -} - diff --git a/src/tor/networkstatus.h b/src/tor/networkstatus.h deleted file mode 100644 index fed32ea1a..000000000 --- a/src/tor/networkstatus.h +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file networkstatus.h - * \brief Header file for networkstatus.c. - **/ - -#ifndef TOR_NETWORKSTATUS_H -#define TOR_NETWORKSTATUS_H - -void networkstatus_reset_warnings(void); -void networkstatus_reset_download_failures(void); -int router_reload_consensus_networkstatus(void); -void routerstatus_free(routerstatus_t *rs); -void networkstatus_vote_free(networkstatus_t *ns); -networkstatus_voter_info_t *networkstatus_get_voter_by_id( - networkstatus_t *vote, - const char *identity); -int networkstatus_check_consensus_signature(networkstatus_t *consensus, - int warn); -int networkstatus_check_document_signature(const networkstatus_t *consensus, - document_signature_t *sig, - const authority_cert_t *cert); -char *networkstatus_get_cache_filename(const char *identity_digest); -int compare_digest_to_routerstatus_entry(const void *_key, - const void **_member); -int compare_digest_to_vote_routerstatus_entry(const void *_key, - const void **_member); -const routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns, - const char *digest); -routerstatus_t *networkstatus_vote_find_mutable_entry(networkstatus_t *ns, - const char *digest); -int networkstatus_vote_find_entry_idx(networkstatus_t *ns, - const char *digest, int *found_out); -download_status_t *router_get_dl_status_by_descriptor_digest(const char *d); -const routerstatus_t *router_get_consensus_status_by_id(const char *digest); -routerstatus_t *router_get_mutable_consensus_status_by_id( - const char *digest); -const routerstatus_t *router_get_consensus_status_by_descriptor_digest( - networkstatus_t *consensus, - const char *digest); -routerstatus_t *router_get_mutable_consensus_status_by_descriptor_digest( - networkstatus_t *consensus, - const char *digest); -const routerstatus_t *router_get_consensus_status_by_nickname( - const char *nickname, - int warn_if_unnamed); -const char *networkstatus_get_router_digest_by_nickname(const char *nickname); -int networkstatus_nickname_is_unnamed(const char *nickname); -void networkstatus_consensus_download_failed(int status_code, - const char *flavname); -void update_consensus_networkstatus_fetch_time(time_t now); -int should_delay_dir_fetches(const or_options_t *options); -void update_networkstatus_downloads(time_t now); -void update_certificate_downloads(time_t now); -int consensus_is_waiting_for_certs(void); -int client_would_use_router(const routerstatus_t *rs, time_t now, - const or_options_t *options); -networkstatus_t *networkstatus_get_latest_consensus(void); -networkstatus_t *networkstatus_get_latest_consensus_by_flavor( - consensus_flavor_t f); -networkstatus_t *networkstatus_get_live_consensus(time_t now); -networkstatus_t *networkstatus_get_reasonably_live_consensus(time_t now, - int flavor); -#define NSSET_FROM_CACHE 1 -#define NSSET_WAS_WAITING_FOR_CERTS 2 -#define NSSET_DONT_DOWNLOAD_CERTS 4 -#define NSSET_ACCEPT_OBSOLETE 8 -#define NSSET_REQUIRE_FLAVOR 16 -int networkstatus_set_current_consensus(const char *consensus, - const char *flavor, - unsigned flags); -void networkstatus_note_certs_arrived(void); -void routers_update_all_from_networkstatus(time_t now, int dir_version); -void routers_update_status_from_consensus_networkstatus(smartlist_t *routers, - int reset_failures); -void signed_descs_update_status_from_consensus_networkstatus( - smartlist_t *descs); - -char *networkstatus_getinfo_helper_single(const routerstatus_t *rs); -char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now); -void networkstatus_dump_bridge_status_to_file(time_t now); -int32_t networkstatus_get_param(const networkstatus_t *ns, - const char *param_name, - int32_t default_val, int32_t min_val, - int32_t max_val); -int getinfo_helper_networkstatus(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); -int32_t networkstatus_get_bw_weight(networkstatus_t *ns, const char *weight, - int32_t default_val); -const char *networkstatus_get_flavor_name(consensus_flavor_t flav); -int networkstatus_parse_flavor_name(const char *flavname); -void document_signature_free(document_signature_t *sig); -document_signature_t *document_signature_dup(const document_signature_t *sig); -void networkstatus_free_all(void); -int networkstatus_get_weight_scale_param(networkstatus_t *ns); - -#endif - diff --git a/src/tor/nodelist.c b/src/tor/nodelist.c deleted file mode 100644 index 96d888199..000000000 --- a/src/tor/nodelist.c +++ /dev/null @@ -1,1557 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "or.h" -#include "address.h" -#include "config.h" -#include "control.h" -#include "dirserv.h" -#include "geoip.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "policies.h" -#include "rendservice.h" -#include "router.h" -#include "routerlist.h" -#include "routerset.h" - -#include - -static void nodelist_drop_node(node_t *node, int remove_from_ht); -static void node_free(node_t *node); -static void update_router_have_minimum_dir_info(void); -static double get_frac_paths_needed_for_circs(const or_options_t *options, - const networkstatus_t *ns); - -/** A nodelist_t holds a node_t object for every router we're "willing to use - * for something". Specifically, it should hold a node_t for every node that - * is currently in the routerlist, or currently in the consensus we're using. - */ -typedef struct nodelist_t { - /* A list of all the nodes. */ - smartlist_t *nodes; - /* Hash table to map from node ID digest to node. */ - HT_HEAD(nodelist_map, node_t) nodes_by_id; - -} nodelist_t; - -static INLINE unsigned int -node_id_hash(const node_t *node) -{ -#if SIZEOF_INT == 4 - const uint32_t *p = (const uint32_t*)node->identity; - return p[0] ^ p[1] ^ p[2] ^ p[3] ^ p[4]; -#elif SIZEOF_INT == 8 - const uint64_t *p = (const uint32_t*)node->identity; - const uint32_t *p32 = (const uint32_t*)node->identity; - return p[0] ^ p[1] ^ p32[4]; -#endif -} - -static INLINE unsigned int -node_id_eq(const node_t *node1, const node_t *node2) -{ - return tor_memeq(node1->identity, node2->identity, DIGEST_LEN); -} - -HT_PROTOTYPE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq); -HT_GENERATE(nodelist_map, node_t, ht_ent, node_id_hash, node_id_eq, - 0.6, malloc, realloc, free); - -/** The global nodelist. */ -static nodelist_t *the_nodelist=NULL; - -/** Create an empty nodelist if we haven't done so already. */ -static void -init_nodelist(void) -{ - if (PREDICT_UNLIKELY(the_nodelist == NULL)) { - the_nodelist = tor_malloc_zero(sizeof(nodelist_t)); - HT_INIT(nodelist_map, &the_nodelist->nodes_by_id); - the_nodelist->nodes = smartlist_new(); - } -} - -/** As node_get_by_id, but returns a non-const pointer */ -node_t * -node_get_mutable_by_id(const char *identity_digest) -{ - node_t search, *node; - if (PREDICT_UNLIKELY(the_nodelist == NULL)) - return NULL; - - memcpy(&search.identity, identity_digest, DIGEST_LEN); - node = HT_FIND(nodelist_map, &the_nodelist->nodes_by_id, &search); - return node; -} - -/** Return the node_t whose identity is identity_digest, or NULL - * if no such node exists. */ -const node_t * -node_get_by_id(const char *identity_digest) -{ - return node_get_mutable_by_id(identity_digest); -} - -/** Internal: return the node_t whose identity_digest is - * identity_digest. If none exists, create a new one, add it to the - * nodelist, and return it. - * - * Requires that the nodelist be initialized. - */ -static node_t * -node_get_or_create(const char *identity_digest) -{ - node_t *node; - - if ((node = node_get_mutable_by_id(identity_digest))) - return node; - - node = tor_malloc_zero(sizeof(node_t)); - memcpy(node->identity, identity_digest, DIGEST_LEN); - HT_INSERT(nodelist_map, &the_nodelist->nodes_by_id, node); - - smartlist_add(the_nodelist->nodes, node); - node->nodelist_idx = smartlist_len(the_nodelist->nodes) - 1; - - node->country = -1; - - return node; -} - -/** Called when a node's address changes. */ -static void -node_addrs_changed(node_t *node) -{ - node->last_reachable = node->last_reachable6 = 0; - node->country = -1; -} - -/** Add ri to an appropriate node in the nodelist. If we replace an - * old routerinfo, and ri_old_out is not NULL, set *ri_old_out - * to the previous routerinfo. - */ -node_t * -nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out) -{ - node_t *node; - const char *id_digest; - int had_router = 0; - tor_assert(ri); - - init_nodelist(); - id_digest = ri->cache_info.identity_digest; - node = node_get_or_create(id_digest); - - if (node->ri) { - if (!routers_have_same_or_addrs(node->ri, ri)) { - node_addrs_changed(node); - } - had_router = 1; - if (ri_old_out) - *ri_old_out = node->ri; - } else { - if (ri_old_out) - *ri_old_out = NULL; - } - node->ri = ri; - - if (node->country == -1) - node_set_country(node); - - if (authdir_mode(get_options()) && !had_router) { - const char *discard=NULL; - uint32_t status = dirserv_router_get_status(ri, &discard); - dirserv_set_node_flags_from_authoritative_status(node, status); - } - - return node; -} - -/** Set the appropriate node_t to use md as its microdescriptor. - * - * Called when a new microdesc has arrived and the usable consensus flavor - * is "microdesc". - **/ -node_t * -nodelist_add_microdesc(microdesc_t *md) -{ - networkstatus_t *ns = - networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC); - const routerstatus_t *rs; - node_t *node; - if (ns == NULL) - return NULL; - init_nodelist(); - - /* Microdescriptors don't carry an identity digest, so we need to figure - * it out by looking up the routerstatus. */ - rs = router_get_consensus_status_by_descriptor_digest(ns, md->digest); - if (rs == NULL) - return NULL; - node = node_get_mutable_by_id(rs->identity_digest); - if (node) { - if (node->md) - node->md->held_by_nodes--; - node->md = md; - md->held_by_nodes++; - } - return node; -} - -/** Tell the nodelist that the current usable consensus is ns. - * This makes the nodelist change all of the routerstatus entries for - * the nodes, drop nodes that no longer have enough info to get used, - * and grab microdescriptors into nodes as appropriate. - */ -void -nodelist_set_consensus(networkstatus_t *ns) -{ - const or_options_t *options = get_options(); - int authdir = authdir_mode_v3(options); - int client = !server_mode(options); - - init_nodelist(); - if (ns->flavor == FLAV_MICRODESC) - (void) get_microdesc_cache(); /* Make sure it exists first. */ - - SMARTLIST_FOREACH(the_nodelist->nodes, node_t *, node, - node->rs = NULL); - - SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { - node_t *node = node_get_or_create(rs->identity_digest); - node->rs = rs; - if (ns->flavor == FLAV_MICRODESC) { - if (node->md == NULL || - tor_memneq(node->md->digest,rs->descriptor_digest,DIGEST256_LEN)) { - if (node->md) - node->md->held_by_nodes--; - node->md = microdesc_cache_lookup_by_digest256(NULL, - rs->descriptor_digest); - if (node->md) - node->md->held_by_nodes++; - } - } - - node_set_country(node); - - /* If we're not an authdir, believe others. */ - if (!authdir) { - node->is_valid = rs->is_valid; - node->is_running = rs->is_flagged_running; - node->is_fast = rs->is_fast; - node->is_stable = rs->is_stable; - node->is_possible_guard = rs->is_possible_guard; - node->is_exit = rs->is_exit; - node->is_bad_directory = rs->is_bad_directory; - node->is_bad_exit = rs->is_bad_exit; - node->is_hs_dir = rs->is_hs_dir; - node->ipv6_preferred = 0; - if (client && options->ClientPreferIPv6ORPort == 1 && - (tor_addr_is_null(&rs->ipv6_addr) == 0 || - (node->md && tor_addr_is_null(&node->md->ipv6_addr) == 0))) - node->ipv6_preferred = 1; - } - - } SMARTLIST_FOREACH_END(rs); - - nodelist_purge(); - - if (! authdir) { - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - /* We have no routerstatus for this router. Clear flags so we can skip - * it, maybe.*/ - if (!node->rs) { - tor_assert(node->ri); /* if it had only an md, or nothing, purge - * would have removed it. */ - if (node->ri->purpose == ROUTER_PURPOSE_GENERAL) { - /* Clear all flags. */ - node->is_valid = node->is_running = node->is_hs_dir = - node->is_fast = node->is_stable = - node->is_possible_guard = node->is_exit = - node->is_bad_exit = node->is_bad_directory = - node->ipv6_preferred = 0; - } - } - } SMARTLIST_FOREACH_END(node); - } -} - -/** Helper: return true iff a node has a usable amount of information*/ -static INLINE int -node_is_usable(const node_t *node) -{ - return (node->rs) || (node->ri); -} - -/** Tell the nodelist that md is no longer a microdescriptor for the - * node with identity_digest. */ -void -nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md) -{ - node_t *node = node_get_mutable_by_id(identity_digest); - if (node && node->md == md) { - node->md = NULL; - md->held_by_nodes--; - } -} - -/** Tell the nodelist that ri is no longer in the routerlist. */ -void -nodelist_remove_routerinfo(routerinfo_t *ri) -{ - node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest); - if (node && node->ri == ri) { - node->ri = NULL; - if (! node_is_usable(node)) { - nodelist_drop_node(node, 1); - node_free(node); - } - } -} - -/** Remove node from the nodelist. (Asserts that it was there to begin - * with.) */ -static void -nodelist_drop_node(node_t *node, int remove_from_ht) -{ - node_t *tmp; - int idx; - if (remove_from_ht) { - tmp = HT_REMOVE(nodelist_map, &the_nodelist->nodes_by_id, node); - tor_assert(tmp == node); - } - - idx = node->nodelist_idx; - tor_assert(idx >= 0); - - tor_assert(node == smartlist_get(the_nodelist->nodes, idx)); - smartlist_del(the_nodelist->nodes, idx); - if (idx < smartlist_len(the_nodelist->nodes)) { - tmp = smartlist_get(the_nodelist->nodes, idx); - tmp->nodelist_idx = idx; - } - node->nodelist_idx = -1; -} - -/** Release storage held by node */ -static void -node_free(node_t *node) -{ - if (!node) - return; - if (node->md) - node->md->held_by_nodes--; - tor_assert(node->nodelist_idx == -1); - tor_free(node); -} - -/** Remove all entries from the nodelist that don't have enough info to be - * usable for anything. */ -void -nodelist_purge(void) -{ - node_t **iter; - if (PREDICT_UNLIKELY(the_nodelist == NULL)) - return; - - /* Remove the non-usable nodes. */ - for (iter = HT_START(nodelist_map, &the_nodelist->nodes_by_id); iter; ) { - node_t *node = *iter; - - if (node->md && !node->rs) { - /* An md is only useful if there is an rs. */ - node->md->held_by_nodes--; - node->md = NULL; - } - - if (node_is_usable(node)) { - iter = HT_NEXT(nodelist_map, &the_nodelist->nodes_by_id, iter); - } else { - iter = HT_NEXT_RMV(nodelist_map, &the_nodelist->nodes_by_id, iter); - nodelist_drop_node(node, 0); - node_free(node); - } - } - nodelist_assert_ok(); -} - -/** Release all storage held by the nodelist. */ -void -nodelist_free_all(void) -{ - if (PREDICT_UNLIKELY(the_nodelist == NULL)) - return; - - HT_CLEAR(nodelist_map, &the_nodelist->nodes_by_id); - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - node->nodelist_idx = -1; - node_free(node); - } SMARTLIST_FOREACH_END(node); - - smartlist_free(the_nodelist->nodes); - - tor_free(the_nodelist); -} - -/** Check that the nodelist is internally consistent, and consistent with - * the directory info it's derived from. - */ -void -nodelist_assert_ok(void) -{ - routerlist_t *rl = router_get_routerlist(); - networkstatus_t *ns = networkstatus_get_latest_consensus(); - digestmap_t *dm; - - if (!the_nodelist) - return; - - dm = digestmap_new(); - - /* every routerinfo in rl->routers should be in the nodelist. */ - if (rl) { - SMARTLIST_FOREACH_BEGIN(rl->routers, routerinfo_t *, ri) { - const node_t *node = node_get_by_id(ri->cache_info.identity_digest); - tor_assert(node && node->ri == ri); - tor_assert(fast_memeq(ri->cache_info.identity_digest, - node->identity, DIGEST_LEN)); - tor_assert(! digestmap_get(dm, node->identity)); - digestmap_set(dm, node->identity, (void*)node); - } SMARTLIST_FOREACH_END(ri); - } - - /* every routerstatus in ns should be in the nodelist */ - if (ns) { - SMARTLIST_FOREACH_BEGIN(ns->routerstatus_list, routerstatus_t *, rs) { - const node_t *node = node_get_by_id(rs->identity_digest); - tor_assert(node && node->rs == rs); - tor_assert(fast_memeq(rs->identity_digest, node->identity, DIGEST_LEN)); - digestmap_set(dm, node->identity, (void*)node); - if (ns->flavor == FLAV_MICRODESC) { - /* If it's a microdesc consensus, every entry that has a - * microdescriptor should be in the nodelist. - */ - microdesc_t *md = - microdesc_cache_lookup_by_digest256(NULL, rs->descriptor_digest); - tor_assert(md == node->md); - if (md) - tor_assert(md->held_by_nodes >= 1); - } - } SMARTLIST_FOREACH_END(rs); - } - - /* The nodelist should have no other entries, and its entries should be - * well-formed. */ - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - tor_assert(digestmap_get(dm, node->identity) != NULL); - tor_assert(node_sl_idx == node->nodelist_idx); - } SMARTLIST_FOREACH_END(node); - - tor_assert((long)smartlist_len(the_nodelist->nodes) == - (long)HT_SIZE(&the_nodelist->nodes_by_id)); - - digestmap_free(dm, NULL); -} - -/** Return a list of a node_t * for every node we know about. The caller - * MUST NOT modify the list. (You can set and clear flags in the nodes if - * you must, but you must not add or remove nodes.) */ -smartlist_t * -nodelist_get_list(void) -{ - init_nodelist(); - return the_nodelist->nodes; -} - -/** Given a hex-encoded nickname of the format DIGEST, $DIGEST, $DIGEST=name, - * or $DIGEST~name, return the node with the matching identity digest and - * nickname (if any). Return NULL if no such node exists, or if hex_id - * is not well-formed. */ -const node_t * -node_get_by_hex_id(const char *hex_id) -{ - char digest_buf[DIGEST_LEN]; - char nn_buf[MAX_NICKNAME_LEN+1]; - char nn_char='\0'; - - if (hex_digest_nickname_decode(hex_id, digest_buf, &nn_char, nn_buf)==0) { - const node_t *node = node_get_by_id(digest_buf); - if (!node) - return NULL; - if (nn_char) { - const char *real_name = node_get_nickname(node); - if (!real_name || strcasecmp(real_name, nn_buf)) - return NULL; - if (nn_char == '=') { - const char *named_id = - networkstatus_get_router_digest_by_nickname(nn_buf); - if (!named_id || tor_memneq(named_id, digest_buf, DIGEST_LEN)) - return NULL; - } - } - return node; - } - - return NULL; -} - -/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return - * the corresponding node_t, or NULL if none exists. Warn the user if - * warn_if_unnamed is set, and they have specified a router by - * nickname, but the Named flag isn't set for that router. */ -const node_t * -node_get_by_nickname(const char *nickname, int warn_if_unnamed) -{ - const node_t *node; - if (!the_nodelist) - return NULL; - - /* Handle these cases: DIGEST, $DIGEST, $DIGEST=name, $DIGEST~name. */ - if ((node = node_get_by_hex_id(nickname)) != NULL) - return node; - - if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) - return NULL; - - /* Okay, so if we get here, the nickname is just a nickname. Is there - * a binding for it in the consensus? */ - { - const char *named_id = - networkstatus_get_router_digest_by_nickname(nickname); - if (named_id) - return node_get_by_id(named_id); - } - - /* Is it marked as owned-by-someone-else? */ - if (networkstatus_nickname_is_unnamed(nickname)) { - log_info(LD_GENERAL, "The name %s is listed as Unnamed: there is some " - "router that holds it, but not one listed in the current " - "consensus.", escaped(nickname)); - return NULL; - } - - /* Okay, so the name is not canonical for anybody. */ - { - smartlist_t *matches = smartlist_new(); - const node_t *choice = NULL; - - SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { - if (!strcasecmp(node_get_nickname(node), nickname)) - smartlist_add(matches, node); - } SMARTLIST_FOREACH_END(node); - - if (smartlist_len(matches)>1 && warn_if_unnamed) { - int any_unwarned = 0; - SMARTLIST_FOREACH_BEGIN(matches, node_t *, node) { - if (!node->name_lookup_warned) { - node->name_lookup_warned = 1; - any_unwarned = 1; - } - } SMARTLIST_FOREACH_END(node); - - if (any_unwarned) { - log_warn(LD_CONFIG, "There are multiple matches for the name %s, " - "but none is listed as Named in the directory consensus. " - "Choosing one arbitrarily.", nickname); - } - } else if (smartlist_len(matches)>1 && warn_if_unnamed) { - char fp[HEX_DIGEST_LEN+1]; - node_t *node = smartlist_get(matches, 0); - if (node->name_lookup_warned) { - base16_encode(fp, sizeof(fp), node->identity, DIGEST_LEN); - log_warn(LD_CONFIG, - "You specified a server \"%s\" by name, but the directory " - "authorities do not have any key registered for this " - "nickname -- so it could be used by any server, not just " - "the one you meant. " - "To make sure you get the same server in the future, refer " - "to it by key, as \"$%s\".", nickname, fp); - node->name_lookup_warned = 1; - } - } - - if (smartlist_len(matches)) - choice = smartlist_get(matches, 0); - - smartlist_free(matches); - return choice; - } -} - -/** Return the nickname of node, or NULL if we can't find one. */ -const char * -node_get_nickname(const node_t *node) -{ - tor_assert(node); - if (node->rs) - return node->rs->nickname; - else if (node->ri) - return node->ri->nickname; - else - return NULL; -} - -/** Return true iff the nickname of node is canonical, based on the - * latest consensus. */ -int -node_is_named(const node_t *node) -{ - const char *named_id; - const char *nickname = node_get_nickname(node); - if (!nickname) - return 0; - named_id = networkstatus_get_router_digest_by_nickname(nickname); - if (!named_id) - return 0; - return tor_memeq(named_id, node->identity, DIGEST_LEN); -} - -/** Return true iff node appears to be a directory authority or - * directory cache */ -int -node_is_dir(const node_t *node) -{ - if (node->rs) - return node->rs->dir_port != 0; - else if (node->ri) - return node->ri->dir_port != 0; - else - return 0; -} - -/** Return true iff node has either kind of usable descriptor -- that - * is, a routerdescriptor or a microdescriptor. */ -int -node_has_descriptor(const node_t *node) -{ - return (node->ri || - (node->rs && node->md)); -} - -/** Return the router_purpose of node. */ -int -node_get_purpose(const node_t *node) -{ - if (node->ri) - return node->ri->purpose; - else - return ROUTER_PURPOSE_GENERAL; -} - -/** Compute the verbose ("extended") nickname of node and store it - * into the MAX_VERBOSE_NICKNAME_LEN+1 character buffer at - * verbose_name_out */ -void -node_get_verbose_nickname(const node_t *node, - char *verbose_name_out) -{ - const char *nickname = node_get_nickname(node); - int is_named = node_is_named(node); - verbose_name_out[0] = '$'; - base16_encode(verbose_name_out+1, HEX_DIGEST_LEN+1, node->identity, - DIGEST_LEN); - if (!nickname) - return; - verbose_name_out[1+HEX_DIGEST_LEN] = is_named ? '=' : '~'; - strlcpy(verbose_name_out+1+HEX_DIGEST_LEN+1, nickname, MAX_NICKNAME_LEN+1); -} - -/** Compute the verbose ("extended") nickname of node with - * given id_digest and store it into the MAX_VERBOSE_NICKNAME_LEN+1 - * character buffer at verbose_name_out - * - * If node_get_by_id() returns NULL, base 16 encoding of - * id_digest is returned instead. */ -void -node_get_verbose_nickname_by_id(const char *id_digest, - char *verbose_name_out) -{ - const node_t *node = node_get_by_id(id_digest); - if (!node) { - verbose_name_out[0] = '$'; - base16_encode(verbose_name_out+1, HEX_DIGEST_LEN+1, id_digest, DIGEST_LEN); - } else { - node_get_verbose_nickname(node, verbose_name_out); - } -} - -/** Return true iff it seems that node allows circuits to exit - * through it directlry from the client. */ -int -node_allows_single_hop_exits(const node_t *node) -{ - if (node && node->ri) - return node->ri->allow_single_hop_exits; - else - return 0; -} - -/** Return true iff it seems that node has an exit policy that doesn't - * actually permit anything to exit, or we don't know its exit policy */ -int -node_exit_policy_rejects_all(const node_t *node) -{ - if (node->rejects_all) - return 1; - - if (node->ri) - return node->ri->policy_is_reject_star; - else if (node->md) - return node->md->exit_policy == NULL || - short_policy_is_reject_star(node->md->exit_policy); - else - return 1; -} - -/** Return true iff the exit policy for node is such that we can treat - * rejecting an address of type family unexpectedly as a sign of that - * node's failure. */ -int -node_exit_policy_is_exact(const node_t *node, sa_family_t family) -{ - if (family == AF_UNSPEC) { - return 1; /* Rejecting an address but not telling us what address - * is a bad sign. */ - } else if (family == AF_INET) { - return node->ri != NULL; - } else if (family == AF_INET6) { - return 0; - } - tor_fragile_assert(); - return 1; -} - -/** Return list of tor_addr_port_t with all OR ports (in the sense IP - * addr + TCP port) for node. Caller must free all elements - * using tor_free() and free the list using smartlist_free(). - * - * XXX this is potentially a memory fragmentation hog -- if on - * critical path consider the option of having the caller allocate the - * memory - */ -smartlist_t * -node_get_all_orports(const node_t *node) -{ - smartlist_t *sl = smartlist_new(); - - if (node->ri != NULL) { - if (node->ri->addr != 0) { - tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); - tor_addr_from_ipv4h(&ap->addr, node->ri->addr); - ap->port = node->ri->or_port; - smartlist_add(sl, ap); - } - if (!tor_addr_is_null(&node->ri->ipv6_addr)) { - tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); - tor_addr_copy(&ap->addr, &node->ri->ipv6_addr); - ap->port = node->ri->or_port; - smartlist_add(sl, ap); - } - } else if (node->rs != NULL) { - tor_addr_port_t *ap = tor_malloc(sizeof(tor_addr_port_t)); - tor_addr_from_ipv4h(&ap->addr, node->rs->addr); - ap->port = node->rs->or_port; - smartlist_add(sl, ap); - } - - return sl; -} - -/** Wrapper around node_get_prim_orport for backward - compatibility. */ -void -node_get_addr(const node_t *node, tor_addr_t *addr_out) -{ - tor_addr_port_t ap; - node_get_prim_orport(node, &ap); - tor_addr_copy(addr_out, &ap.addr); -} - -/** Return the host-order IPv4 address for node, or 0 if it doesn't - * seem to have one. */ -uint32_t -node_get_prim_addr_ipv4h(const node_t *node) -{ - if (node->ri) { - return node->ri->addr; - } else if (node->rs) { - return node->rs->addr; - } - return 0; -} - -/** Copy a string representation of an IP address for node into - * the len-byte buffer at buf. */ -void -node_get_address_string(const node_t *node, char *buf, size_t len) -{ - if (node->ri) { - strlcpy(buf, node->ri->address, len); - } else if (node->rs) { - tor_addr_t addr; - tor_addr_from_ipv4h(&addr, node->rs->addr); - tor_addr_to_str(buf, &addr, len, 0); - } else { - buf[0] = '\0'; - } -} - -/** Return node's declared uptime, or -1 if it doesn't seem to have - * one. */ -long -node_get_declared_uptime(const node_t *node) -{ - if (node->ri) - return node->ri->uptime; - else - return -1; -} - -/** Return node's platform string, or NULL if we don't know it. */ -const char * -node_get_platform(const node_t *node) -{ - /* If we wanted, we could record the version in the routerstatus_t, since - * the consensus lists it. We don't, though, so this function just won't - * work with microdescriptors. */ - if (node->ri) - return node->ri->platform; - else - return NULL; -} - -/** Return node's time of publication, or 0 if we don't have one. */ -time_t -node_get_published_on(const node_t *node) -{ - if (node->ri) - return node->ri->cache_info.published_on; - else - return 0; -} - -/** Return true iff node is one representing this router. */ -int -node_is_me(const node_t *node) -{ - return router_digest_is_me(node->identity); -} - -/** Return node declared family (as a list of names), or NULL if - * the node didn't declare a family. */ -const smartlist_t * -node_get_declared_family(const node_t *node) -{ - if (node->ri && node->ri->declared_family) - return node->ri->declared_family; - else if (node->md && node->md->family) - return node->md->family; - else - return NULL; -} - -/** Return 1 if we prefer the IPv6 address and OR TCP port of - * node, else 0. - * - * We prefer the IPv6 address if the router has an IPv6 address and - * i) the node_t says that it prefers IPv6 - * or - * ii) the router has no IPv4 address. */ -int -node_ipv6_preferred(const node_t *node) -{ - tor_addr_port_t ipv4_addr; - node_assert_ok(node); - - if (node->ipv6_preferred || node_get_prim_orport(node, &ipv4_addr)) { - if (node->ri) - return !tor_addr_is_null(&node->ri->ipv6_addr); - if (node->md) - return !tor_addr_is_null(&node->md->ipv6_addr); - if (node->rs) - return !tor_addr_is_null(&node->rs->ipv6_addr); - } - return 0; -} - -/** Copy the primary (IPv4) OR port (IP address and TCP port) for - * node into *ap_out. Return 0 if a valid address and - * port was copied, else return non-zero.*/ -int -node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out) -{ - node_assert_ok(node); - tor_assert(ap_out); - - if (node->ri) { - if (node->ri->addr == 0 || node->ri->or_port == 0) - return -1; - tor_addr_from_ipv4h(&ap_out->addr, node->ri->addr); - ap_out->port = node->ri->or_port; - return 0; - } - if (node->rs) { - if (node->rs->addr == 0 || node->rs->or_port == 0) - return -1; - tor_addr_from_ipv4h(&ap_out->addr, node->rs->addr); - ap_out->port = node->rs->or_port; - return 0; - } - return -1; -} - -/** Copy the preferred OR port (IP address and TCP port) for - * node into *ap_out. */ -void -node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out) -{ - const or_options_t *options = get_options(); - tor_assert(ap_out); - - /* Cheap implementation of config option ClientUseIPv6 -- simply - don't prefer IPv6 when ClientUseIPv6 is not set and we're not a - client running with bridges. See #4455 for more on this subject. - - Note that this filter is too strict since we're hindering not - only clients! Erring on the safe side shouldn't be a problem - though. XXX move this check to where outgoing connections are - made? -LN */ - if ((options->ClientUseIPv6 || options->UseBridges) && - node_ipv6_preferred(node)) { - node_get_pref_ipv6_orport(node, ap_out); - } else { - node_get_prim_orport(node, ap_out); - } -} - -/** Copy the preferred IPv6 OR port (IP address and TCP port) for - * node into *ap_out. */ -void -node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out) -{ - node_assert_ok(node); - tor_assert(ap_out); - - /* We prefer the microdesc over a potential routerstatus here. They - are not being synchronised atm so there might be a chance that - they differ at some point, f.ex. when flipping - UseMicrodescriptors? -LN */ - - if (node->ri) { - tor_addr_copy(&ap_out->addr, &node->ri->ipv6_addr); - ap_out->port = node->ri->ipv6_orport; - } else if (node->md) { - tor_addr_copy(&ap_out->addr, &node->md->ipv6_addr); - ap_out->port = node->md->ipv6_orport; - } else if (node->rs) { - tor_addr_copy(&ap_out->addr, &node->rs->ipv6_addr); - ap_out->port = node->rs->ipv6_orport; - } -} - -/** Return true iff node has a curve25519 onion key. */ -int -node_has_curve25519_onion_key(const node_t *node) -{ - if (node->ri) - return node->ri->onion_curve25519_pkey != NULL; - else if (node->md) - return node->md->onion_curve25519_pkey != NULL; - else - return 0; -} - -/** Refresh the country code of ri. This function MUST be called on - * each router when the GeoIP database is reloaded, and on all new routers. */ -void -node_set_country(node_t *node) -{ - tor_addr_t addr = TOR_ADDR_NULL; - - /* XXXXipv6 */ - if (node->rs) - tor_addr_from_ipv4h(&addr, node->rs->addr); - else if (node->ri) - tor_addr_from_ipv4h(&addr, node->ri->addr); - - node->country = geoip_get_country_by_addr(&addr); -} - -/** Set the country code of all routers in the routerlist. */ -void -nodelist_refresh_countries(void) -{ - smartlist_t *nodes = nodelist_get_list(); - SMARTLIST_FOREACH(nodes, node_t *, node, - node_set_country(node)); -} - -/** Return true iff router1 and router2 have similar enough network addresses - * that we should treat them as being in the same family */ -static INLINE int -addrs_in_same_network_family(const tor_addr_t *a1, - const tor_addr_t *a2) -{ - return 0 == tor_addr_compare_masked(a1, a2, 16, CMP_SEMANTIC); -} - -/** Return true if node's nickname matches nickname - * (case-insensitive), or if node's identity key digest - * matches a hexadecimal value stored in nickname. Return - * false otherwise. */ -static int -node_nickname_matches(const node_t *node, const char *nickname) -{ - const char *n = node_get_nickname(node); - if (n && nickname[0]!='$' && !strcasecmp(n, nickname)) - return 1; - return hex_digest_nickname_matches(nickname, - node->identity, - n, - node_is_named(node)); -} - -/** Return true iff node is named by some nickname in lst. */ -static INLINE int -node_in_nickname_smartlist(const smartlist_t *lst, const node_t *node) -{ - if (!lst) return 0; - SMARTLIST_FOREACH(lst, const char *, name, { - if (node_nickname_matches(node, name)) - return 1; - }); - return 0; -} - -/** Return true iff r1 and r2 are in the same family, but not the same - * router. */ -int -nodes_in_same_family(const node_t *node1, const node_t *node2) -{ - const or_options_t *options = get_options(); - - /* Are they in the same family because of their addresses? */ - if (options->EnforceDistinctSubnets) { - tor_addr_t a1, a2; - node_get_addr(node1, &a1); - node_get_addr(node2, &a2); - if (addrs_in_same_network_family(&a1, &a2)) - return 1; - } - - /* Are they in the same family because the agree they are? */ - { - const smartlist_t *f1, *f2; - f1 = node_get_declared_family(node1); - f2 = node_get_declared_family(node2); - if (f1 && f2 && - node_in_nickname_smartlist(f1, node2) && - node_in_nickname_smartlist(f2, node1)) - return 1; - } - - /* Are they in the same option because the user says they are? */ - if (options->NodeFamilySets) { - SMARTLIST_FOREACH(options->NodeFamilySets, const routerset_t *, rs, { - if (routerset_contains_node(rs, node1) && - routerset_contains_node(rs, node2)) - return 1; - }); - } - - return 0; -} - -/** - * Add all the family of node, including node itself, to - * the smartlist sl. - * - * This is used to make sure we don't pick siblings in a single path, or - * pick more than one relay from a family for our entry guard list. - * Note that a node may be added to sl more than once if it is - * part of node's family for more than one reason. - */ -void -nodelist_add_node_and_family(smartlist_t *sl, const node_t *node) -{ - const smartlist_t *all_nodes = nodelist_get_list(); - const smartlist_t *declared_family; - const or_options_t *options = get_options(); - - tor_assert(node); - - declared_family = node_get_declared_family(node); - - /* Let's make sure that we have the node itself, if it's a real node. */ - { - const node_t *real_node = node_get_by_id(node->identity); - if (real_node) - smartlist_add(sl, (node_t*)real_node); - } - - /* First, add any nodes with similar network addresses. */ - if (options->EnforceDistinctSubnets) { - tor_addr_t node_addr; - node_get_addr(node, &node_addr); - - SMARTLIST_FOREACH_BEGIN(all_nodes, const node_t *, node2) { - tor_addr_t a; - node_get_addr(node2, &a); - if (addrs_in_same_network_family(&a, &node_addr)) - smartlist_add(sl, (void*)node2); - } SMARTLIST_FOREACH_END(node2); - } - - /* Now, add all nodes in the declared_family of this node, if they - * also declare this node to be in their family. */ - if (declared_family) { - /* Add every r such that router declares familyness with node, and node - * declares familyhood with router. */ - SMARTLIST_FOREACH_BEGIN(declared_family, const char *, name) { - const node_t *node2; - const smartlist_t *family2; - if (!(node2 = node_get_by_nickname(name, 0))) - continue; - if (!(family2 = node_get_declared_family(node2))) - continue; - SMARTLIST_FOREACH_BEGIN(family2, const char *, name2) { - if (node_nickname_matches(node, name2)) { - smartlist_add(sl, (void*)node2); - break; - } - } SMARTLIST_FOREACH_END(name2); - } SMARTLIST_FOREACH_END(name); - } - - /* If the user declared any families locally, honor those too. */ - if (options->NodeFamilySets) { - SMARTLIST_FOREACH(options->NodeFamilySets, const routerset_t *, rs, { - if (routerset_contains_node(rs, node)) { - routerset_get_all_nodes(sl, rs, NULL, 0); - } - }); - } -} - -/** Find a router that's up, that has this IP address, and - * that allows exit to this address:port, or return NULL if there - * isn't a good one. - * Don't exit enclave to excluded relays -- it wouldn't actually - * hurt anything, but this way there are fewer confused users. - */ -const node_t * -router_find_exact_exit_enclave(const char *address, uint16_t port) -{/*XXXX MOVE*/ - uint32_t addr; - struct in_addr in; - tor_addr_t a; - const or_options_t *options = get_options(); - - if (!tor_inet_aton(address, &in)) - return NULL; /* it's not an IP already */ - addr = ntohl(in.s_addr); - - tor_addr_from_ipv4h(&a, addr); - - SMARTLIST_FOREACH(nodelist_get_list(), const node_t *, node, { - if (node_get_addr_ipv4h(node) == addr && - node->is_running && - compare_tor_addr_to_node_policy(&a, port, node) == - ADDR_POLICY_ACCEPTED && - !routerset_contains_node(options->ExcludeExitNodesUnion_, node)) - return node; - }); - return NULL; -} - -/** Return 1 if router is not suitable for these parameters, else 0. - * If need_uptime is non-zero, we require a minimum uptime. - * If need_capacity is non-zero, we require a minimum advertised - * bandwidth. - * If need_guard, we require that the router is a possible entry guard. - */ -int -node_is_unreliable(const node_t *node, int need_uptime, - int need_capacity, int need_guard) -{ - if (need_uptime && !node->is_stable) - return 1; - if (need_capacity && !node->is_fast) - return 1; - if (need_guard && !node->is_possible_guard) - return 1; - return 0; -} - -/** Return 1 if all running sufficiently-stable routers we can use will reject - * addr:port. Return 0 if any might accept it. */ -int -router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, - int need_uptime) -{ - addr_policy_result_t r; - - SMARTLIST_FOREACH_BEGIN(nodelist_get_list(), const node_t *, node) { - if (node->is_running && - !node_is_unreliable(node, need_uptime, 0, 0)) { - - r = compare_tor_addr_to_node_policy(addr, port, node); - - if (r != ADDR_POLICY_REJECTED && r != ADDR_POLICY_PROBABLY_REJECTED) - return 0; /* this one could be ok. good enough. */ - } - } SMARTLIST_FOREACH_END(node); - return 1; /* all will reject. */ -} - -/** Mark the router with ID digest as running or non-running - * in our routerlist. */ -void -router_set_status(const char *digest, int up) -{ - node_t *node; - tor_assert(digest); - - SMARTLIST_FOREACH(router_get_fallback_dir_servers(), - dir_server_t *, d, - if (tor_memeq(d->digest, digest, DIGEST_LEN)) - d->is_running = up); - - SMARTLIST_FOREACH(router_get_trusted_dir_servers(), - dir_server_t *, d, - if (tor_memeq(d->digest, digest, DIGEST_LEN)) - d->is_running = up); - - node = node_get_mutable_by_id(digest); - if (node) { -#if 0 - log_debug(LD_DIR,"Marking router %s as %s.", - node_describe(node), up ? "up" : "down"); -#endif - if (!up && node_is_me(node) && !net_is_disabled()) - log_warn(LD_NET, "We just marked ourself as down. Are your external " - "addresses reachable?"); - node->is_running = up; - } - - router_dir_info_changed(); -} - -/** True iff, the last time we checked whether we had enough directory info - * to build circuits, the answer was "yes". */ -static int have_min_dir_info = 0; -/** True iff enough has changed since the last time we checked whether we had - * enough directory info to build circuits that our old answer can no longer - * be trusted. */ -static int need_to_update_have_min_dir_info = 1; -/** String describing what we're missing before we have enough directory - * info. */ -static char dir_info_status[256] = ""; - -/** Return true iff we have enough networkstatus and router information to - * start building circuits. Right now, this means "more than half the - * networkstatus documents, and at least 1/4 of expected routers." */ -//XXX should consider whether we have enough exiting nodes here. -int -router_have_minimum_dir_info(void) -{ - if (PREDICT_UNLIKELY(need_to_update_have_min_dir_info)) { - update_router_have_minimum_dir_info(); - need_to_update_have_min_dir_info = 0; - } - return have_min_dir_info; -} - -/** Called when our internal view of the directory has changed. This can be - * when the authorities change, networkstatuses change, the list of routerdescs - * changes, or number of running routers changes. - */ -void -router_dir_info_changed(void) -{ - need_to_update_have_min_dir_info = 1; - rend_hsdir_routers_changed(); -} - -/** Return a string describing what we're missing before we have enough - * directory info. */ -const char * -get_dir_info_status_string(void) -{ - return dir_info_status; -} - -/** Iterate over the servers listed in consensus, and count how many of - * them seem like ones we'd use, and how many of those we have - * descriptors for. Store the former in *num_usable and the latter in - * *num_present. If in_set is non-NULL, only consider those - * routers in in_set. If exit_only is true, only consider nodes - * with the Exit flag. If *descs_out is present, add a node_t for each - * usable descriptor to it. - */ -static void -count_usable_descriptors(int *num_present, int *num_usable, - smartlist_t *descs_out, - const networkstatus_t *consensus, - const or_options_t *options, time_t now, - routerset_t *in_set, int exit_only) -{ - const int md = (consensus->flavor == FLAV_MICRODESC); - *num_present = 0, *num_usable=0; - - SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, rs) - { - const node_t *node = node_get_by_id(rs->identity_digest); - if (!node) - continue; /* This would be a bug: every entry in the consensus is - * supposed to have a node. */ - if (exit_only && ! rs->is_exit) - continue; - if (in_set && ! routerset_contains_routerstatus(in_set, rs, -1)) - continue; - if (client_would_use_router(rs, now, options)) { - const char * const digest = rs->descriptor_digest; - int present; - ++*num_usable; /* the consensus says we want it. */ - if (md) - present = NULL != microdesc_cache_lookup_by_digest256(NULL, digest); - else - present = NULL != router_get_by_descriptor_digest(digest); - if (present) { - /* we have the descriptor listed in the consensus. */ - ++*num_present; - } - if (descs_out) - smartlist_add(descs_out, (node_t*)node); - } - } - SMARTLIST_FOREACH_END(rs); - - log_debug(LD_DIR, "%d usable, %d present (%s%s).", - *num_usable, *num_present, - md ? "microdesc" : "desc", exit_only ? " exits" : "s"); -} - -/** Return an estimate of which fraction of usable paths through the Tor - * network we have available for use. */ -static double -compute_frac_paths_available(const networkstatus_t *consensus, - const or_options_t *options, time_t now, - int *num_present_out, int *num_usable_out, - char **status_out) -{ - smartlist_t *guards = smartlist_new(); - smartlist_t *mid = smartlist_new(); - smartlist_t *exits = smartlist_new(); - smartlist_t *myexits= smartlist_new(); - smartlist_t *myexits_unflagged = smartlist_new(); - double f_guard, f_mid, f_exit, f_myexit, f_myexit_unflagged; - int np, nu; /* Ignored */ - const int authdir = authdir_mode_v3(options); - - count_usable_descriptors(num_present_out, num_usable_out, - mid, consensus, options, now, NULL, 0); - if (options->EntryNodes) { - count_usable_descriptors(&np, &nu, guards, consensus, options, now, - options->EntryNodes, 0); - } else { - SMARTLIST_FOREACH(mid, const node_t *, node, { - if (authdir) { - if (node->rs && node->rs->is_possible_guard) - smartlist_add(guards, (node_t*)node); - } else { - if (node->is_possible_guard) - smartlist_add(guards, (node_t*)node); - } - }); - } - - /* All nodes with exit flag */ - count_usable_descriptors(&np, &nu, exits, consensus, options, now, - NULL, 1); - /* All nodes with exit flag in ExitNodes option */ - count_usable_descriptors(&np, &nu, myexits, consensus, options, now, - options->ExitNodes, 1); - /* Now compute the nodes in the ExitNodes option where which we don't know - * what their exit policy is, or we know it permits something. */ - count_usable_descriptors(&np, &nu, myexits_unflagged, - consensus, options, now, - options->ExitNodes, 0); - SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) { - if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) - SMARTLIST_DEL_CURRENT(myexits_unflagged, node); - } SMARTLIST_FOREACH_END(node); - - f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD); - f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID); - f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT); - f_myexit= frac_nodes_with_descriptors(myexits,WEIGHT_FOR_EXIT); - f_myexit_unflagged= - frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT); - - /* If our ExitNodes list has eliminated every possible Exit node, and there - * were some possible Exit nodes, then instead consider nodes that permit - * exiting to some ports. */ - if (smartlist_len(myexits) == 0 && - smartlist_len(myexits_unflagged)) { - f_myexit = f_myexit_unflagged; - } - - smartlist_free(guards); - smartlist_free(mid); - smartlist_free(exits); - smartlist_free(myexits); - smartlist_free(myexits_unflagged); - - /* This is a tricky point here: we don't want to make it easy for a - * directory to trickle exits to us until it learns which exits we have - * configured, so require that we have a threshold both of total exits - * and usable exits. */ - if (f_myexit < f_exit) - f_exit = f_myexit; - - if (status_out) - tor_asprintf(status_out, - "%d%% of guards bw, " - "%d%% of midpoint bw, and " - "%d%% of exit bw", - (int)(f_guard*100), - (int)(f_mid*100), - (int)(f_exit*100)); - - return f_guard * f_mid * f_exit; -} - -/** We just fetched a new set of descriptors. Compute how far through - * the "loading descriptors" bootstrapping phase we are, so we can inform - * the controller of our progress. */ -int -count_loading_descriptors_progress(void) -{ - int num_present = 0, num_usable=0; - time_t now = time(NULL); - const or_options_t *options = get_options(); - const networkstatus_t *consensus = - networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor()); - double paths, fraction; - - if (!consensus) - return 0; /* can't count descriptors if we have no list of them */ - - paths = compute_frac_paths_available(consensus, options, now, - &num_present, &num_usable, - NULL); - - fraction = paths / get_frac_paths_needed_for_circs(options,consensus); - if (fraction > 1.0) - return 0; /* it's not the number of descriptors holding us back */ - return BOOTSTRAP_STATUS_LOADING_DESCRIPTORS + (int) - (fraction*(BOOTSTRAP_STATUS_CONN_OR-1 - - BOOTSTRAP_STATUS_LOADING_DESCRIPTORS)); -} - -/** Return the fraction of paths needed before we're willing to build - * circuits, as configured in options, or in the consensus ns. */ -static double -get_frac_paths_needed_for_circs(const or_options_t *options, - const networkstatus_t *ns) -{ -#define DFLT_PCT_USABLE_NEEDED 60 - if (options->PathsNeededToBuildCircuits >= 0.0) { - return options->PathsNeededToBuildCircuits; - } else { - return networkstatus_get_param(ns, "min_paths_for_circs_pct", - DFLT_PCT_USABLE_NEEDED, - 25, 95)/100.0; - } -} - -/** Change the value of have_min_dir_info, setting it true iff we have enough - * network and router information to build circuits. Clear the value of - * need_to_update_have_min_dir_info. */ -static void -update_router_have_minimum_dir_info(void) -{ - time_t now = time(NULL); - int res; - const or_options_t *options = get_options(); - const networkstatus_t *consensus = - networkstatus_get_reasonably_live_consensus(now,usable_consensus_flavor()); - int using_md; - - if (!consensus) { - if (!networkstatus_get_latest_consensus()) - strlcpy(dir_info_status, "We have no usable consensus.", - sizeof(dir_info_status)); - else - strlcpy(dir_info_status, "We have no recent usable consensus.", - sizeof(dir_info_status)); - res = 0; - goto done; - } - - if (should_delay_dir_fetches(get_options())) { - log_notice(LD_DIR, "no known bridge descriptors running yet; stalling"); - strlcpy(dir_info_status, "No live bridge descriptors.", - sizeof(dir_info_status)); - res = 0; - goto done; - } - - using_md = consensus->flavor == FLAV_MICRODESC; - - { - char *status = NULL; - int num_present=0, num_usable=0; - double paths = compute_frac_paths_available(consensus, options, now, - &num_present, &num_usable, - &status); - - if (paths < get_frac_paths_needed_for_circs(options,consensus)) { - tor_snprintf(dir_info_status, sizeof(dir_info_status), - "We need more %sdescriptors: we have %d/%d, and " - "can only build %d%% of likely paths. (We have %s.)", - using_md?"micro":"", num_present, num_usable, - (int)(paths*100), status); - /* log_notice(LD_NET, "%s", dir_info_status); */ - tor_free(status); - res = 0; - control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); - goto done; - } - - tor_free(status); - res = 1; - } - - done: - if (res && !have_min_dir_info) { - log_notice(LD_DIR, - "We now have enough directory information to build circuits."); - control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO"); - control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0); - } - if (!res && have_min_dir_info) { - int quiet = directory_too_idle_to_fetch_descriptors(options, now); - tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, - "Our directory information is no longer up-to-date " - "enough to build circuits: %s", dir_info_status); - - /* a) make us log when we next complete a circuit, so we know when Tor - * is back up and usable, and b) disable some activities that Tor - * should only do while circuits are working, like reachability tests - * and fetching bridge descriptors only over circuits. */ - can_complete_circuit = 0; - - control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO"); - } - have_min_dir_info = res; - need_to_update_have_min_dir_info = 0; -} - diff --git a/src/tor/nodelist.h b/src/tor/nodelist.h deleted file mode 100644 index 565caa76c..000000000 --- a/src/tor/nodelist.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file nodelist.h - * \brief Header file for nodelist.c. - **/ - -#ifndef TOR_NODELIST_H -#define TOR_NODELIST_H - -#define node_assert_ok(n) STMT_BEGIN { \ - tor_assert((n)->ri || (n)->rs); \ - } STMT_END - -node_t *node_get_mutable_by_id(const char *identity_digest); -const node_t *node_get_by_id(const char *identity_digest); -const node_t *node_get_by_hex_id(const char *identity_digest); -node_t *nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out); -node_t *nodelist_add_microdesc(microdesc_t *md); -void nodelist_set_consensus(networkstatus_t *ns); - -void nodelist_remove_microdesc(const char *identity_digest, microdesc_t *md); -void nodelist_remove_routerinfo(routerinfo_t *ri); -void nodelist_purge(void); - -void nodelist_free_all(void); -void nodelist_assert_ok(void); - -const node_t *node_get_by_nickname(const char *nickname, int warn_if_unnamed); -void node_get_verbose_nickname(const node_t *node, - char *verbose_name_out); -void node_get_verbose_nickname_by_id(const char *id_digest, - char *verbose_name_out); -int node_is_named(const node_t *node); -int node_is_dir(const node_t *node); -int node_has_descriptor(const node_t *node); -int node_get_purpose(const node_t *node); -#define node_is_bridge(node) \ - (node_get_purpose((node)) == ROUTER_PURPOSE_BRIDGE) -int node_is_me(const node_t *node); -int node_exit_policy_rejects_all(const node_t *node); -int node_exit_policy_is_exact(const node_t *node, sa_family_t family); -smartlist_t *node_get_all_orports(const node_t *node); -int node_allows_single_hop_exits(const node_t *node); -const char *node_get_nickname(const node_t *node); -const char *node_get_platform(const node_t *node); -uint32_t node_get_prim_addr_ipv4h(const node_t *node); -void node_get_address_string(const node_t *node, char *cp, size_t len); -long node_get_declared_uptime(const node_t *node); -time_t node_get_published_on(const node_t *node); -const smartlist_t *node_get_declared_family(const node_t *node); -int node_ipv6_preferred(const node_t *node); -int node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out); -void node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out); -int node_has_curve25519_onion_key(const node_t *node); - -smartlist_t *nodelist_get_list(void); - -/* Temporary during transition to multiple addresses. */ -void node_get_addr(const node_t *node, tor_addr_t *addr_out); -#define node_get_addr_ipv4h(n) node_get_prim_addr_ipv4h((n)) - -void nodelist_refresh_countries(void); -void node_set_country(node_t *node); -void nodelist_add_node_and_family(smartlist_t *nodes, const node_t *node); -int nodes_in_same_family(const node_t *node1, const node_t *node2); - -const node_t *router_find_exact_exit_enclave(const char *address, - uint16_t port); -int node_is_unreliable(const node_t *router, int need_uptime, - int need_capacity, int need_guard); -int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, - int need_uptime); -void router_set_status(const char *digest, int up); -int router_have_minimum_dir_info(void); -void router_dir_info_changed(void); -const char *get_dir_info_status_string(void); -int count_loading_descriptors_progress(void); - -#endif - diff --git a/src/tor/ntmain.h b/src/tor/ntmain.h deleted file mode 100644 index c6927f1a4..000000000 --- a/src/tor/ntmain.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file ntmain.h - * \brief Header file for ntmain.c. - **/ - -#ifndef TOR_NTMAIN_H -#define TOR_NTMAIN_H - -//#ifdef _WIN32 -//#if !defined (WINCE) -//#define NT_SERVICE -//#endif -//#endif - -#ifdef NT_SERVICE -int nt_service_parse_options(int argc, char **argv, int *should_exit); -int nt_service_is_stopping(void); -void nt_service_set_state(DWORD state); -#else -#define nt_service_is_stopping() 0 -#endif - -#endif - diff --git a/src/tor/onion.c b/src/tor/onion.c deleted file mode 100644 index 30b983d91..000000000 --- a/src/tor/onion.c +++ /dev/null @@ -1,1183 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion.c - * \brief Functions to queue create cells, wrap the various onionskin types, - * and parse and create the CREATE cell and its allies. - **/ - -#include "or.h" -#include "circuitlist.h" -#include "config.h" -#include "cpuworker.h" -#include "networkstatus.h" -#include "onion.h" -#include "onion_fast.h" -#include "onion_ntor.h" -#include "onion_tap.h" -#include "relay.h" -#include "rephist.h" -#include "router.h" - -/** Type for a linked list of circuits that are waiting for a free CPU worker - * to process a waiting onion handshake. */ -typedef struct onion_queue_t { - TOR_TAILQ_ENTRY(onion_queue_t) next; - or_circuit_t *circ; - uint16_t handshake_type; - create_cell_t *onionskin; - time_t when_added; -} onion_queue_t; - -/** 5 seconds on the onion queue til we just send back a destroy */ -#define ONIONQUEUE_WAIT_CUTOFF 5 - -/** Array of queues of circuits waiting for CPU workers. An element is NULL - * if that queue is empty.*/ -TOR_TAILQ_HEAD(onion_queue_head_t, onion_queue_t) - ol_list[MAX_ONION_HANDSHAKE_TYPE+1] = { - TOR_TAILQ_HEAD_INITIALIZER(ol_list[0]), /* tap */ - TOR_TAILQ_HEAD_INITIALIZER(ol_list[1]), /* fast */ - TOR_TAILQ_HEAD_INITIALIZER(ol_list[2]), /* ntor */ -}; - -/** Number of entries of each type currently in each element of ol_list[]. */ -static int ol_entries[MAX_ONION_HANDSHAKE_TYPE+1]; - -static int num_ntors_per_tap(void); -static void onion_queue_entry_remove(onion_queue_t *victim); - -/* XXXX024 Check lengths vs MAX_ONIONSKIN_{CHALLENGE,REPLY}_LEN. - * - * (By which I think I meant, "make sure that no - * X_ONIONSKIN_CHALLENGE/REPLY_LEN is greater than - * MAX_ONIONSKIN_CHALLENGE/REPLY_LEN." Also, make sure that we can pass - * over-large values via EXTEND2/EXTENDED2, for future-compatibility.*/ - -/** Return true iff we have room to queue another onionskin of type - * type. */ -static int -have_room_for_onionskin(uint16_t type) -{ - const or_options_t *options = get_options(); - int num_cpus; - uint64_t tap_usec, ntor_usec; - uint64_t ntor_during_tap_usec, tap_during_ntor_usec; - - /* If we've got fewer than 50 entries, we always have room for one more. */ - if (ol_entries[type] < 50) - return 1; - num_cpus = get_num_cpus(options); - /* Compute how many microseconds we'd expect to need to clear all - * onionskins in various combinations of the queues. */ - - /* How long would it take to process all the TAP cells in the queue? */ - tap_usec = estimated_usec_for_onionskins( - ol_entries[ONION_HANDSHAKE_TYPE_TAP], - ONION_HANDSHAKE_TYPE_TAP) / num_cpus; - - /* How long would it take to process all the NTor cells in the queue? */ - ntor_usec = estimated_usec_for_onionskins( - ol_entries[ONION_HANDSHAKE_TYPE_NTOR], - ONION_HANDSHAKE_TYPE_NTOR) / num_cpus; - - /* How long would it take to process the tap cells that we expect to - * process while draining the ntor queue? */ - tap_during_ntor_usec = estimated_usec_for_onionskins( - MIN(ol_entries[ONION_HANDSHAKE_TYPE_TAP], - ol_entries[ONION_HANDSHAKE_TYPE_NTOR] / num_ntors_per_tap()), - ONION_HANDSHAKE_TYPE_TAP) / num_cpus; - - /* How long would it take to process the ntor cells that we expect to - * process while draining the tap queue? */ - ntor_during_tap_usec = estimated_usec_for_onionskins( - MIN(ol_entries[ONION_HANDSHAKE_TYPE_NTOR], - ol_entries[ONION_HANDSHAKE_TYPE_TAP] * num_ntors_per_tap()), - ONION_HANDSHAKE_TYPE_NTOR) / num_cpus; - - /* See whether that exceeds MaxOnionQueueDelay. If so, we can't queue - * this. */ - if (type == ONION_HANDSHAKE_TYPE_NTOR && - (ntor_usec + tap_during_ntor_usec) / 1000 > - (uint64_t)options->MaxOnionQueueDelay) - return 0; - - if (type == ONION_HANDSHAKE_TYPE_TAP && - (tap_usec + ntor_during_tap_usec) / 1000 > - (uint64_t)options->MaxOnionQueueDelay) - return 0; - -#ifdef CURVE25519_ENABLED - /* If we support the ntor handshake, then don't let TAP handshakes use - * more than 2/3 of the space on the queue. */ - if (type == ONION_HANDSHAKE_TYPE_TAP && - tap_usec / 1000 > (uint64_t)options->MaxOnionQueueDelay * 2 / 3) - return 0; -#else - (void) type; -#endif - - return 1; -} - -/** Add circ to the end of ol_list and return 0, except - * if ol_list is too long, in which case do nothing and return -1. - */ -int -onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin) -{ - onion_queue_t *tmp; - time_t now = time(NULL); - - if (onionskin->handshake_type > MAX_ONION_HANDSHAKE_TYPE) { - log_warn(LD_BUG, "Handshake %d out of range! Dropping.", - onionskin->handshake_type); - return -1; - } - - tmp = tor_malloc_zero(sizeof(onion_queue_t)); - tmp->circ = circ; - tmp->handshake_type = onionskin->handshake_type; - tmp->onionskin = onionskin; - tmp->when_added = now; - - if (!have_room_for_onionskin(onionskin->handshake_type)) { -#define WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL (60) - static ratelim_t last_warned = - RATELIM_INIT(WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL); - char *m; - if (onionskin->handshake_type == ONION_HANDSHAKE_TYPE_NTOR && - (m = rate_limit_log(&last_warned, approx_time()))) { - log_warn(LD_GENERAL, - "Your computer is too slow to handle this many circuit " - "creation requests! Please consider using the " - "MaxAdvertisedBandwidth config option or choosing a more " - "restricted exit policy.%s",m); - tor_free(m); - } - tor_free(tmp); - return -1; - } - - ++ol_entries[onionskin->handshake_type]; - log_info(LD_OR, "New create (%s). Queues now ntor=%d and tap=%d.", - onionskin->handshake_type == ONION_HANDSHAKE_TYPE_NTOR ? "ntor" : "tap", - ol_entries[ONION_HANDSHAKE_TYPE_NTOR], - ol_entries[ONION_HANDSHAKE_TYPE_TAP]); - - circ->onionqueue_entry = tmp; - TOR_TAILQ_INSERT_TAIL(&ol_list[onionskin->handshake_type], tmp, next); - - /* cull elderly requests. */ - while (1) { - onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list[onionskin->handshake_type]); - if (now - head->when_added < (time_t)ONIONQUEUE_WAIT_CUTOFF) - break; - - circ = head->circ; - circ->onionqueue_entry = NULL; - onion_queue_entry_remove(head); - log_info(LD_CIRC, - "Circuit create request is too old; canceling due to overload."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); - } - return 0; -} - -/** Return a fairness parameter, to prefer processing NTOR style - * handshakes but still slowly drain the TAP queue so we don't starve - * it entirely. */ -static int -num_ntors_per_tap(void) -{ -#define DEFAULT_NUM_NTORS_PER_TAP 10 -#define MIN_NUM_NTORS_PER_TAP 1 -#define MAX_NUM_NTORS_PER_TAP 100000 - - return networkstatus_get_param(NULL, "NumNTorsPerTAP", - DEFAULT_NUM_NTORS_PER_TAP, - MIN_NUM_NTORS_PER_TAP, - MAX_NUM_NTORS_PER_TAP); -} - -/** Choose which onion queue we'll pull from next. If one is empty choose - * the other; if they both have elements, load balance across them but - * favoring NTOR. */ -static uint16_t -decide_next_handshake_type(void) -{ - /* The number of times we've chosen ntor lately when both were available. */ - static int recently_chosen_ntors = 0; - - if (!ol_entries[ONION_HANDSHAKE_TYPE_NTOR]) - return ONION_HANDSHAKE_TYPE_TAP; /* no ntors? try tap */ - - if (!ol_entries[ONION_HANDSHAKE_TYPE_TAP]) { - - /* Nick wants us to prioritize new tap requests when there aren't - * any in the queue and we've processed k ntor cells since the last - * tap cell. This strategy is maybe a good idea, since it starves tap - * less in the case where tap is rare, or maybe a poor idea, since it - * makes the new tap cell unfairly jump in front of ntor cells that - * got here first. In any case this edge case will only become relevant - * once tap is rare. We should reevaluate whether we like this decision - * once tap gets more rare. */ - if (ol_entries[ONION_HANDSHAKE_TYPE_NTOR] && - recently_chosen_ntors <= num_ntors_per_tap()) - ++recently_chosen_ntors; - - return ONION_HANDSHAKE_TYPE_NTOR; /* no taps? try ntor */ - } - - /* They both have something queued. Pick ntor if we haven't done that - * too much lately. */ - if (++recently_chosen_ntors <= num_ntors_per_tap()) { - return ONION_HANDSHAKE_TYPE_NTOR; - } - - /* Else, it's time to let tap have its turn. */ - recently_chosen_ntors = 0; - return ONION_HANDSHAKE_TYPE_TAP; -} - -/** Remove the highest priority item from ol_list[] and return it, or - * return NULL if the lists are empty. - */ -or_circuit_t * -onion_next_task(create_cell_t **onionskin_out) -{ - or_circuit_t *circ; - uint16_t handshake_to_choose = decide_next_handshake_type(); - onion_queue_t *head = TOR_TAILQ_FIRST(&ol_list[handshake_to_choose]); - - if (!head) - return NULL; /* no onions pending, we're done */ - - tor_assert(head->circ); - tor_assert(head->handshake_type <= MAX_ONION_HANDSHAKE_TYPE); -// tor_assert(head->circ->p_chan); /* make sure it's still valid */ -/* XXX I only commented out the above line to make the unit tests - * more manageable. That's probably not good long-term. -RD */ - circ = head->circ; - if (head->onionskin) - --ol_entries[head->handshake_type]; - log_info(LD_OR, "Processing create (%s). Queues now ntor=%d and tap=%d.", - head->handshake_type == ONION_HANDSHAKE_TYPE_NTOR ? "ntor" : "tap", - ol_entries[ONION_HANDSHAKE_TYPE_NTOR], - ol_entries[ONION_HANDSHAKE_TYPE_TAP]); - - *onionskin_out = head->onionskin; - head->onionskin = NULL; /* prevent free. */ - circ->onionqueue_entry = NULL; - onion_queue_entry_remove(head); - return circ; -} - -/** Return the number of handshake_type-style create requests pending. - */ -int -onion_num_pending(uint16_t handshake_type) -{ - return ol_entries[handshake_type]; -} - -/** Go through ol_list, find the onion_queue_t element which points to - * circ, remove and free that element. Leave circ itself alone. - */ -void -onion_pending_remove(or_circuit_t *circ) -{ - onion_queue_t *victim; - - if (!circ) - return; - - victim = circ->onionqueue_entry; - if (victim) - onion_queue_entry_remove(victim); -} - -/** Remove a queue entry victim from the queue, unlinking it from - * its circuit and freeing it and any structures it owns.*/ -static void -onion_queue_entry_remove(onion_queue_t *victim) -{ - if (victim->handshake_type > MAX_ONION_HANDSHAKE_TYPE) { - log_warn(LD_BUG, "Handshake %d out of range! Dropping.", - victim->handshake_type); - /* XXX leaks */ - return; - } - - TOR_TAILQ_REMOVE(&ol_list[victim->handshake_type], victim, next); - - if (victim->circ) - victim->circ->onionqueue_entry = NULL; - - if (victim->onionskin) - --ol_entries[victim->handshake_type]; - - tor_free(victim->onionskin); - tor_free(victim); -} - -/** Remove all circuits from the pending list. Called from tor_free_all. */ -void -clear_pending_onions(void) -{ - onion_queue_t *victim; - int i; - for (i=0; i<=MAX_ONION_HANDSHAKE_TYPE; i++) { - while ((victim = TOR_TAILQ_FIRST(&ol_list[i]))) { - onion_queue_entry_remove(victim); - } - } - memset(ol_entries, 0, sizeof(ol_entries)); -} - -/* ============================================================ */ - -/** Fill in a server_onion_keys_t object at keys with all of the keys - * and other info we might need to do onion handshakes. (We make a copy of - * our keys for each cpuworker to avoid race conditions with the main thread, - * and to avoid locking) */ -void -setup_server_onion_keys(server_onion_keys_t *keys) -{ - memset(keys, 0, sizeof(server_onion_keys_t)); - memcpy(keys->my_identity, router_get_my_id_digest(), DIGEST_LEN); - dup_onion_keys(&keys->onion_key, &keys->last_onion_key); -#ifdef CURVE25519_ENABLED - keys->curve25519_key_map = construct_ntor_key_map(); - keys->junk_keypair = tor_malloc_zero(sizeof(curve25519_keypair_t)); - curve25519_keypair_generate(keys->junk_keypair, 0); -#endif -} - -/** Release all storage held in keys, but do not free keys - * itself (as it's likely to be stack-allocated.) */ -void -release_server_onion_keys(server_onion_keys_t *keys) -{ - if (! keys) - return; - - crypto_pk_free(keys->onion_key); - crypto_pk_free(keys->last_onion_key); -#ifdef CURVE25519_ENABLED - ntor_key_map_free(keys->curve25519_key_map); - tor_free(keys->junk_keypair); -#endif - memset(keys, 0, sizeof(server_onion_keys_t)); -} - -/** Release whatever storage is held in state, depending on its - * type, and clear its pointer. */ -void -onion_handshake_state_release(onion_handshake_state_t *state) -{ - switch (state->tag) { - case ONION_HANDSHAKE_TYPE_TAP: - crypto_dh_free(state->u.tap); - state->u.tap = NULL; - break; - case ONION_HANDSHAKE_TYPE_FAST: - fast_handshake_state_free(state->u.fast); - state->u.fast = NULL; - break; -#ifdef CURVE25519_ENABLED - case ONION_HANDSHAKE_TYPE_NTOR: - ntor_handshake_state_free(state->u.ntor); - state->u.ntor = NULL; - break; -#endif - default: - log_warn(LD_BUG, "called with unknown handshake state type %d", - (int)state->tag); - tor_fragile_assert(); - } -} - -/** Perform the first step of a circuit-creation handshake of type type - * (one of ONION_HANDSHAKE_TYPE_*): generate the initial "onion skin" in - * onion_skin_out, and store any state information in state_out. - * Return -1 on failure, and the length of the onionskin on acceptance. - */ -int -onion_skin_create(int type, - const extend_info_t *node, - onion_handshake_state_t *state_out, - uint8_t *onion_skin_out) -{ - int r = -1; - - switch (type) { - case ONION_HANDSHAKE_TYPE_TAP: - if (!node->onion_key) - return -1; - - if (onion_skin_TAP_create(node->onion_key, - &state_out->u.tap, - (char*)onion_skin_out) < 0) - return -1; - - r = TAP_ONIONSKIN_CHALLENGE_LEN; - break; - case ONION_HANDSHAKE_TYPE_FAST: - if (fast_onionskin_create(&state_out->u.fast, onion_skin_out) < 0) - return -1; - - r = CREATE_FAST_LEN; - break; - case ONION_HANDSHAKE_TYPE_NTOR: -#ifdef CURVE25519_ENABLED - if (tor_mem_is_zero((const char*)node->curve25519_onion_key.public_key, - CURVE25519_PUBKEY_LEN)) - return -1; - if (onion_skin_ntor_create((const uint8_t*)node->identity_digest, - &node->curve25519_onion_key, - &state_out->u.ntor, - onion_skin_out) < 0) - return -1; - - r = NTOR_ONIONSKIN_LEN; -#else - return -1; -#endif - break; - default: - log_warn(LD_BUG, "called with unknown handshake state type %d", type); - tor_fragile_assert(); - r = -1; - } - - if (r > 0) - state_out->tag = (uint16_t) type; - - return r; -} - -/** Perform the second (server-side) step of a circuit-creation handshake of - * type type, responding to the client request in onion_skin - * using the keys in keys. On success, write our response into - * reply_out, generate keys_out_len bytes worth of key material - * in keys_out_len, a hidden service nonce to rend_nonce_out, - * and return the length of the reply. On failure, return -1. - */ -int -onion_skin_server_handshake(int type, - const uint8_t *onion_skin, size_t onionskin_len, - const server_onion_keys_t *keys, - uint8_t *reply_out, - uint8_t *keys_out, size_t keys_out_len, - uint8_t *rend_nonce_out) -{ - int r = -1; - - switch (type) { - case ONION_HANDSHAKE_TYPE_TAP: - if (onionskin_len != TAP_ONIONSKIN_CHALLENGE_LEN) - return -1; - if (onion_skin_TAP_server_handshake((const char*)onion_skin, - keys->onion_key, keys->last_onion_key, - (char*)reply_out, - (char*)keys_out, keys_out_len)<0) - return -1; - r = TAP_ONIONSKIN_REPLY_LEN; - memcpy(rend_nonce_out, reply_out+DH_KEY_LEN, DIGEST_LEN); - break; - case ONION_HANDSHAKE_TYPE_FAST: - if (onionskin_len != CREATE_FAST_LEN) - return -1; - if (fast_server_handshake(onion_skin, reply_out, keys_out, keys_out_len)<0) - return -1; - r = CREATED_FAST_LEN; - memcpy(rend_nonce_out, reply_out+DIGEST_LEN, DIGEST_LEN); - break; - case ONION_HANDSHAKE_TYPE_NTOR: -#ifdef CURVE25519_ENABLED - if (onionskin_len < NTOR_ONIONSKIN_LEN) - return -1; - { - size_t keys_tmp_len = keys_out_len + DIGEST_LEN; - uint8_t *keys_tmp = tor_malloc(keys_out_len + DIGEST_LEN); - - if (onion_skin_ntor_server_handshake( - onion_skin, keys->curve25519_key_map, - keys->junk_keypair, - keys->my_identity, - reply_out, keys_tmp, keys_tmp_len)<0) { - tor_free(keys_tmp); - return -1; - } - memcpy(keys_out, keys_tmp, keys_out_len); - memcpy(rend_nonce_out, keys_tmp+keys_out_len, DIGEST_LEN); - memwipe(keys_tmp, 0, keys_tmp_len); - tor_free(keys_tmp); - r = NTOR_REPLY_LEN; - } -#else - return -1; -#endif - break; - default: - log_warn(LD_BUG, "called with unknown handshake state type %d", type); - tor_fragile_assert(); - return -1; - } - - return r; -} - -/** Perform the final (client-side) step of a circuit-creation handshake of - * type type, using our state in handshake_state and the - * server's response in reply. On success, generate keys_out_len - * bytes worth of key material in keys_out_len, set - * rend_authenticator_out to the "KH" field that can be used to - * establish introduction points at this hop, and return 0. On failure, - * return -1. */ -int -onion_skin_client_handshake(int type, - const onion_handshake_state_t *handshake_state, - const uint8_t *reply, size_t reply_len, - uint8_t *keys_out, size_t keys_out_len, - uint8_t *rend_authenticator_out) -{ - if (handshake_state->tag != type) - return -1; - - switch (type) { - case ONION_HANDSHAKE_TYPE_TAP: - if (reply_len != TAP_ONIONSKIN_REPLY_LEN) - return -1; - if (onion_skin_TAP_client_handshake(handshake_state->u.tap, - (const char*)reply, - (char *)keys_out, keys_out_len) < 0) - return -1; - - memcpy(rend_authenticator_out, reply+DH_KEY_LEN, DIGEST_LEN); - - return 0; - case ONION_HANDSHAKE_TYPE_FAST: - if (reply_len != CREATED_FAST_LEN) - return -1; - if (fast_client_handshake(handshake_state->u.fast, reply, - keys_out, keys_out_len) < 0) - return -1; - - memcpy(rend_authenticator_out, reply+DIGEST_LEN, DIGEST_LEN); - return 0; -#ifdef CURVE25519_ENABLED - case ONION_HANDSHAKE_TYPE_NTOR: - if (reply_len < NTOR_REPLY_LEN) - return -1; - { - size_t keys_tmp_len = keys_out_len + DIGEST_LEN; - uint8_t *keys_tmp = tor_malloc(keys_tmp_len); - if (onion_skin_ntor_client_handshake(handshake_state->u.ntor, - reply, - keys_tmp, keys_tmp_len) < 0) { - tor_free(keys_tmp); - return -1; - } - memcpy(keys_out, keys_tmp, keys_out_len); - memcpy(rend_authenticator_out, keys_tmp + keys_out_len, DIGEST_LEN); - memwipe(keys_tmp, 0, keys_tmp_len); - tor_free(keys_tmp); - } - return 0; -#endif - default: - log_warn(LD_BUG, "called with unknown handshake state type %d", type); - tor_fragile_assert(); - return -1; - } -} - -/** Helper: return 0 if cell appears valid, -1 otherwise. If - * unknown_ok is true, allow cells with handshake types we don't - * recognize. */ -static int -check_create_cell(const create_cell_t *cell, int unknown_ok) -{ - switch (cell->cell_type) { - case CELL_CREATE: - if (cell->handshake_type != ONION_HANDSHAKE_TYPE_TAP && - cell->handshake_type != ONION_HANDSHAKE_TYPE_NTOR) - return -1; - break; - case CELL_CREATE_FAST: - if (cell->handshake_type != ONION_HANDSHAKE_TYPE_FAST) - return -1; - break; - case CELL_CREATE2: - break; - default: - return -1; - } - - switch (cell->handshake_type) { - case ONION_HANDSHAKE_TYPE_TAP: - if (cell->handshake_len != TAP_ONIONSKIN_CHALLENGE_LEN) - return -1; - break; - case ONION_HANDSHAKE_TYPE_FAST: - if (cell->handshake_len != CREATE_FAST_LEN) - return -1; - break; -#ifdef CURVE25519_ENABLED - case ONION_HANDSHAKE_TYPE_NTOR: - if (cell->handshake_len != NTOR_ONIONSKIN_LEN) - return -1; - break; -#endif - default: - if (! unknown_ok) - return -1; - } - - return 0; -} - -/** Write the various parameters into the create cell. Separate from - * create_cell_parse() to make unit testing easier. - */ -void -create_cell_init(create_cell_t *cell_out, uint8_t cell_type, - uint16_t handshake_type, uint16_t handshake_len, - const uint8_t *onionskin) -{ - memset(cell_out, 0, sizeof(*cell_out)); - - cell_out->cell_type = cell_type; - cell_out->handshake_type = handshake_type; - cell_out->handshake_len = handshake_len; - memcpy(cell_out->onionskin, onionskin, handshake_len); -} - -/** Helper: parse the CREATE2 payload at p, which could be up to - * p_len bytes long, and use it to fill the fields of - * cell_out. Return 0 on success and -1 on failure. - * - * Note that part of the body of an EXTEND2 cell is a CREATE2 payload, so - * this function is also used for parsing those. - */ -static int -parse_create2_payload(create_cell_t *cell_out, const uint8_t *p, size_t p_len) -{ - uint16_t handshake_type, handshake_len; - - if (p_len < 4) - return -1; - - handshake_type = ntohs(get_uint16(p)); - handshake_len = ntohs(get_uint16(p+2)); - - if (handshake_len > CELL_PAYLOAD_SIZE - 4 || handshake_len > p_len - 4) - return -1; - if (handshake_type == ONION_HANDSHAKE_TYPE_FAST) - return -1; - - create_cell_init(cell_out, CELL_CREATE2, handshake_type, handshake_len, - p+4); - return 0; -} - -/** Magic string which, in a CREATE or EXTEND cell, indicates that a seeming - * TAP payload is really an ntor payload. We'd do away with this if every - * relay supported EXTEND2, but we want to be able to extend from A to B with - * ntor even when A doesn't understand EXTEND2 and so can't generate a - * CREATE2 cell. - **/ -#define NTOR_CREATE_MAGIC "ntorNTORntorNTOR" - -/** Parse a CREATE, CREATE_FAST, or CREATE2 cell from cell_in into - * cell_out. Return 0 on success, -1 on failure. (We reject some - * syntactically valid CREATE2 cells that we can't generate or react to.) */ -int -create_cell_parse(create_cell_t *cell_out, const cell_t *cell_in) -{ - switch (cell_in->command) { - case CELL_CREATE: - if (tor_memeq(cell_in->payload, NTOR_CREATE_MAGIC, 16)) { - create_cell_init(cell_out, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR, - NTOR_ONIONSKIN_LEN, cell_in->payload+16); - } else { - create_cell_init(cell_out, CELL_CREATE, ONION_HANDSHAKE_TYPE_TAP, - TAP_ONIONSKIN_CHALLENGE_LEN, cell_in->payload); - } - break; - case CELL_CREATE_FAST: - create_cell_init(cell_out, CELL_CREATE_FAST, ONION_HANDSHAKE_TYPE_FAST, - CREATE_FAST_LEN, cell_in->payload); - break; - case CELL_CREATE2: - if (parse_create2_payload(cell_out, cell_in->payload, - CELL_PAYLOAD_SIZE) < 0) - return -1; - break; - default: - return -1; - } - - return check_create_cell(cell_out, 0); -} - -/** Helper: return 0 if cell appears valid, -1 otherwise. */ -static int -check_created_cell(const created_cell_t *cell) -{ - switch (cell->cell_type) { - case CELL_CREATED: - if (cell->handshake_len != TAP_ONIONSKIN_REPLY_LEN && - cell->handshake_len != NTOR_REPLY_LEN) - return -1; - break; - case CELL_CREATED_FAST: - if (cell->handshake_len != CREATED_FAST_LEN) - return -1; - break; - case CELL_CREATED2: - if (cell->handshake_len > RELAY_PAYLOAD_SIZE-2) - return -1; - break; - } - - return 0; -} - -/** Parse a CREATED, CREATED_FAST, or CREATED2 cell from cell_in into - * cell_out. Return 0 on success, -1 on failure. */ -int -created_cell_parse(created_cell_t *cell_out, const cell_t *cell_in) -{ - memset(cell_out, 0, sizeof(*cell_out)); - - switch (cell_in->command) { - case CELL_CREATED: - cell_out->cell_type = CELL_CREATED; - cell_out->handshake_len = TAP_ONIONSKIN_REPLY_LEN; - memcpy(cell_out->reply, cell_in->payload, TAP_ONIONSKIN_REPLY_LEN); - break; - case CELL_CREATED_FAST: - cell_out->cell_type = CELL_CREATED_FAST; - cell_out->handshake_len = CREATED_FAST_LEN; - memcpy(cell_out->reply, cell_in->payload, CREATED_FAST_LEN); - break; - case CELL_CREATED2: - { - const uint8_t *p = cell_in->payload; - cell_out->cell_type = CELL_CREATED2; - cell_out->handshake_len = ntohs(get_uint16(p)); - if (cell_out->handshake_len > CELL_PAYLOAD_SIZE - 2) - return -1; - memcpy(cell_out->reply, p+2, cell_out->handshake_len); - break; - } - } - - return check_created_cell(cell_out); -} - -/** Helper: return 0 if cell appears valid, -1 otherwise. */ -static int -check_extend_cell(const extend_cell_t *cell) -{ - if (tor_digest_is_zero((const char*)cell->node_id)) - return -1; - /* We don't currently allow EXTEND2 cells without an IPv4 address */ - if (tor_addr_family(&cell->orport_ipv4.addr) == AF_UNSPEC) - return -1; - if (cell->create_cell.cell_type == CELL_CREATE) { - if (cell->cell_type != RELAY_COMMAND_EXTEND) - return -1; - } else if (cell->create_cell.cell_type == CELL_CREATE2) { - if (cell->cell_type != RELAY_COMMAND_EXTEND2 && - cell->cell_type != RELAY_COMMAND_EXTEND) - return -1; - } else { - /* In particular, no CREATE_FAST cells are allowed */ - return -1; - } - if (cell->create_cell.handshake_type == ONION_HANDSHAKE_TYPE_FAST) - return -1; - - return check_create_cell(&cell->create_cell, 1); -} - -/** Protocol constants for specifier types in EXTEND2 - * @{ - */ -#define SPECTYPE_IPV4 0 -#define SPECTYPE_IPV6 1 -#define SPECTYPE_LEGACY_ID 2 -/** @} */ - -/** Parse an EXTEND or EXTEND2 cell (according to command) from the - * payload_length bytes of payload into cell_out. Return - * 0 on success, -1 on failure. */ -int -extend_cell_parse(extend_cell_t *cell_out, const uint8_t command, - const uint8_t *payload, size_t payload_length) -{ - const uint8_t *eop; - - memset(cell_out, 0, sizeof(*cell_out)); - if (payload_length > RELAY_PAYLOAD_SIZE) - return -1; - eop = payload + payload_length; - - switch (command) { - case RELAY_COMMAND_EXTEND: - { - if (payload_length != 6 + TAP_ONIONSKIN_CHALLENGE_LEN + DIGEST_LEN) - return -1; - - cell_out->cell_type = RELAY_COMMAND_EXTEND; - tor_addr_from_ipv4n(&cell_out->orport_ipv4.addr, get_uint32(payload)); - cell_out->orport_ipv4.port = ntohs(get_uint16(payload+4)); - tor_addr_make_unspec(&cell_out->orport_ipv6.addr); - if (tor_memeq(payload + 6, NTOR_CREATE_MAGIC, 16)) { - cell_out->create_cell.cell_type = CELL_CREATE2; - cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_NTOR; - cell_out->create_cell.handshake_len = NTOR_ONIONSKIN_LEN; - memcpy(cell_out->create_cell.onionskin, payload + 22, - NTOR_ONIONSKIN_LEN); - } else { - cell_out->create_cell.cell_type = CELL_CREATE; - cell_out->create_cell.handshake_type = ONION_HANDSHAKE_TYPE_TAP; - cell_out->create_cell.handshake_len = TAP_ONIONSKIN_CHALLENGE_LEN; - memcpy(cell_out->create_cell.onionskin, payload + 6, - TAP_ONIONSKIN_CHALLENGE_LEN); - } - memcpy(cell_out->node_id, payload + 6 + TAP_ONIONSKIN_CHALLENGE_LEN, - DIGEST_LEN); - break; - } - case RELAY_COMMAND_EXTEND2: - { - uint8_t n_specs, spectype, speclen; - int i; - int found_ipv4 = 0, found_ipv6 = 0, found_id = 0; - tor_addr_make_unspec(&cell_out->orport_ipv4.addr); - tor_addr_make_unspec(&cell_out->orport_ipv6.addr); - - if (payload_length == 0) - return -1; - - cell_out->cell_type = RELAY_COMMAND_EXTEND2; - n_specs = *payload++; - /* Parse the specifiers. We'll only take the first IPv4 and first IPv6 - * address, and the node ID, and ignore everything else */ - for (i = 0; i < n_specs; ++i) { - if (eop - payload < 2) - return -1; - spectype = payload[0]; - speclen = payload[1]; - payload += 2; - if (eop - payload < speclen) - return -1; - switch (spectype) { - case SPECTYPE_IPV4: - if (speclen != 6) - return -1; - if (!found_ipv4) { - tor_addr_from_ipv4n(&cell_out->orport_ipv4.addr, - get_uint32(payload)); - cell_out->orport_ipv4.port = ntohs(get_uint16(payload+4)); - found_ipv4 = 1; - } - break; - case SPECTYPE_IPV6: - if (speclen != 18) - return -1; - if (!found_ipv6) { - tor_addr_from_ipv6_bytes(&cell_out->orport_ipv6.addr, - (const char*)payload); - cell_out->orport_ipv6.port = ntohs(get_uint16(payload+16)); - found_ipv6 = 1; - } - break; - case SPECTYPE_LEGACY_ID: - if (speclen != 20) - return -1; - if (found_id) - return -1; - memcpy(cell_out->node_id, payload, 20); - found_id = 1; - break; - } - payload += speclen; - } - if (!found_id || !found_ipv4) - return -1; - if (parse_create2_payload(&cell_out->create_cell,payload,eop-payload)<0) - return -1; - break; - } - default: - return -1; - } - - return check_extend_cell(cell_out); -} - -/** Helper: return 0 if cell appears valid, -1 otherwise. */ -static int -check_extended_cell(const extended_cell_t *cell) -{ - if (cell->created_cell.cell_type == CELL_CREATED) { - if (cell->cell_type != RELAY_COMMAND_EXTENDED) - return -1; - } else if (cell->created_cell.cell_type == CELL_CREATED2) { - if (cell->cell_type != RELAY_COMMAND_EXTENDED2) - return -1; - } else { - return -1; - } - - return check_created_cell(&cell->created_cell); -} - -/** Parse an EXTENDED or EXTENDED2 cell (according to command) from the - * payload_length bytes of payload into cell_out. Return - * 0 on success, -1 on failure. */ -int -extended_cell_parse(extended_cell_t *cell_out, - const uint8_t command, const uint8_t *payload, - size_t payload_len) -{ - memset(cell_out, 0, sizeof(*cell_out)); - if (payload_len > RELAY_PAYLOAD_SIZE) - return -1; - - switch (command) { - case RELAY_COMMAND_EXTENDED: - if (payload_len != TAP_ONIONSKIN_REPLY_LEN) - return -1; - cell_out->cell_type = RELAY_COMMAND_EXTENDED; - cell_out->created_cell.cell_type = CELL_CREATED; - cell_out->created_cell.handshake_len = TAP_ONIONSKIN_REPLY_LEN; - memcpy(cell_out->created_cell.reply, payload, TAP_ONIONSKIN_REPLY_LEN); - break; - case RELAY_COMMAND_EXTENDED2: - { - cell_out->cell_type = RELAY_COMMAND_EXTENDED2; - cell_out->created_cell.cell_type = CELL_CREATED2; - cell_out->created_cell.handshake_len = ntohs(get_uint16(payload)); - if (cell_out->created_cell.handshake_len > RELAY_PAYLOAD_SIZE - 2 || - cell_out->created_cell.handshake_len > payload_len - 2) - return -1; - memcpy(cell_out->created_cell.reply, payload+2, - cell_out->created_cell.handshake_len); - } - break; - default: - return -1; - } - - return check_extended_cell(cell_out); -} - -/** Fill cell_out with a correctly formatted version of the - * CREATE{,_FAST,2} cell in cell_in. Return 0 on success, -1 on - * failure. This is a cell we didn't originate if relayed is true. */ -static int -create_cell_format_impl(cell_t *cell_out, const create_cell_t *cell_in, - int relayed) -{ - uint8_t *p; - size_t space; - if (check_create_cell(cell_in, relayed) < 0) - return -1; - - memset(cell_out->payload, 0, sizeof(cell_out->payload)); - cell_out->command = cell_in->cell_type; - - p = cell_out->payload; - space = sizeof(cell_out->payload); - - switch (cell_in->cell_type) { - case CELL_CREATE: - if (cell_in->handshake_type == ONION_HANDSHAKE_TYPE_NTOR) { - memcpy(p, NTOR_CREATE_MAGIC, 16); - p += 16; - space -= 16; - } - /* Fall through */ - case CELL_CREATE_FAST: - tor_assert(cell_in->handshake_len <= space); - memcpy(p, cell_in->onionskin, cell_in->handshake_len); - break; - case CELL_CREATE2: - tor_assert(cell_in->handshake_len <= sizeof(cell_out->payload)-4); - set_uint16(cell_out->payload, htons(cell_in->handshake_type)); - set_uint16(cell_out->payload+2, htons(cell_in->handshake_len)); - memcpy(cell_out->payload + 4, cell_in->onionskin, cell_in->handshake_len); - break; - default: - return -1; - } - - return 0; -} - -int -create_cell_format(cell_t *cell_out, const create_cell_t *cell_in) -{ - return create_cell_format_impl(cell_out, cell_in, 0); -} - -int -create_cell_format_relayed(cell_t *cell_out, const create_cell_t *cell_in) -{ - return create_cell_format_impl(cell_out, cell_in, 1); -} - -/** Fill cell_out with a correctly formatted version of the - * CREATED{,_FAST,2} cell in cell_in. Return 0 on success, -1 on - * failure. */ -int -created_cell_format(cell_t *cell_out, const created_cell_t *cell_in) -{ - if (check_created_cell(cell_in) < 0) - return -1; - - memset(cell_out->payload, 0, sizeof(cell_out->payload)); - cell_out->command = cell_in->cell_type; - - switch (cell_in->cell_type) { - case CELL_CREATED: - case CELL_CREATED_FAST: - tor_assert(cell_in->handshake_len <= sizeof(cell_out->payload)); - memcpy(cell_out->payload, cell_in->reply, cell_in->handshake_len); - break; - case CELL_CREATED2: - tor_assert(cell_in->handshake_len <= sizeof(cell_out->payload)-2); - set_uint16(cell_out->payload, htons(cell_in->handshake_len)); - memcpy(cell_out->payload + 2, cell_in->reply, cell_in->handshake_len); - break; - default: - return -1; - } - return 0; -} - -/** Format the EXTEND{,2} cell in cell_in, storing its relay payload in - * payload_out, the number of bytes used in *len_out, and the - * relay command in *command_out. The payload_out must have - * RELAY_PAYLOAD_SIZE bytes available. Return 0 on success, -1 on failure. */ -int -extend_cell_format(uint8_t *command_out, uint16_t *len_out, - uint8_t *payload_out, const extend_cell_t *cell_in) -{ - uint8_t *p, *eop; - if (check_extend_cell(cell_in) < 0) - return -1; - - p = payload_out; - eop = payload_out + RELAY_PAYLOAD_SIZE; - - memset(p, 0, RELAY_PAYLOAD_SIZE); - - switch (cell_in->cell_type) { - case RELAY_COMMAND_EXTEND: - { - *command_out = RELAY_COMMAND_EXTEND; - *len_out = 6 + TAP_ONIONSKIN_CHALLENGE_LEN + DIGEST_LEN; - set_uint32(p, tor_addr_to_ipv4n(&cell_in->orport_ipv4.addr)); - set_uint16(p+4, ntohs(cell_in->orport_ipv4.port)); - if (cell_in->create_cell.handshake_type == ONION_HANDSHAKE_TYPE_NTOR) { - memcpy(p+6, NTOR_CREATE_MAGIC, 16); - memcpy(p+22, cell_in->create_cell.onionskin, NTOR_ONIONSKIN_LEN); - } else { - memcpy(p+6, cell_in->create_cell.onionskin, - TAP_ONIONSKIN_CHALLENGE_LEN); - } - memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, cell_in->node_id, DIGEST_LEN); - } - break; - case RELAY_COMMAND_EXTEND2: - { - uint8_t n = 2; - *command_out = RELAY_COMMAND_EXTEND2; - - *p++ = n; /* 2 identifiers */ - *p++ = SPECTYPE_IPV4; /* First is IPV4. */ - *p++ = 6; /* It's 6 bytes long. */ - set_uint32(p, tor_addr_to_ipv4n(&cell_in->orport_ipv4.addr)); - set_uint16(p+4, htons(cell_in->orport_ipv4.port)); - p += 6; - *p++ = SPECTYPE_LEGACY_ID; /* Next is an identity digest. */ - *p++ = 20; /* It's 20 bytes long */ - memcpy(p, cell_in->node_id, DIGEST_LEN); - p += 20; - - /* Now we can send the handshake */ - set_uint16(p, htons(cell_in->create_cell.handshake_type)); - set_uint16(p+2, htons(cell_in->create_cell.handshake_len)); - p += 4; - - if (cell_in->create_cell.handshake_len > eop - p) - return -1; - - memcpy(p, cell_in->create_cell.onionskin, - cell_in->create_cell.handshake_len); - - p += cell_in->create_cell.handshake_len; - *len_out = p - payload_out; - } - break; - default: - return -1; - } - - return 0; -} - -/** Format the EXTENDED{,2} cell in cell_in, storing its relay payload - * in payload_out, the number of bytes used in *len_out, and the - * relay command in *command_out. The payload_out must have - * RELAY_PAYLOAD_SIZE bytes available. Return 0 on success, -1 on failure. */ -int -extended_cell_format(uint8_t *command_out, uint16_t *len_out, - uint8_t *payload_out, const extended_cell_t *cell_in) -{ - uint8_t *p; - if (check_extended_cell(cell_in) < 0) - return -1; - - p = payload_out; - memset(p, 0, RELAY_PAYLOAD_SIZE); - - switch (cell_in->cell_type) { - case RELAY_COMMAND_EXTENDED: - { - *command_out = RELAY_COMMAND_EXTENDED; - *len_out = TAP_ONIONSKIN_REPLY_LEN; - memcpy(payload_out, cell_in->created_cell.reply, - TAP_ONIONSKIN_REPLY_LEN); - } - break; - case RELAY_COMMAND_EXTENDED2: - { - *command_out = RELAY_COMMAND_EXTENDED2; - *len_out = 2 + cell_in->created_cell.handshake_len; - set_uint16(payload_out, htons(cell_in->created_cell.handshake_len)); - if (2+cell_in->created_cell.handshake_len > RELAY_PAYLOAD_SIZE) - return -1; - memcpy(payload_out+2, cell_in->created_cell.reply, - cell_in->created_cell.handshake_len); - } - break; - default: - return -1; - } - - return 0; -} - diff --git a/src/tor/onion.h b/src/tor/onion.h deleted file mode 100644 index d62f032b8..000000000 --- a/src/tor/onion.h +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion.h - * \brief Header file for onion.c. - **/ - -#ifndef TOR_ONION_H -#define TOR_ONION_H - -struct create_cell_t; -int onion_pending_add(or_circuit_t *circ, struct create_cell_t *onionskin); -or_circuit_t *onion_next_task(struct create_cell_t **onionskin_out); -int onion_num_pending(uint16_t handshake_type); -void onion_pending_remove(or_circuit_t *circ); -void clear_pending_onions(void); - -typedef struct server_onion_keys_t { - uint8_t my_identity[DIGEST_LEN]; - crypto_pk_t *onion_key; - crypto_pk_t *last_onion_key; -#ifdef CURVE25519_ENABLED - di_digest256_map_t *curve25519_key_map; - curve25519_keypair_t *junk_keypair; -#endif -} server_onion_keys_t; - -#define MAX_ONIONSKIN_CHALLENGE_LEN 255 -#define MAX_ONIONSKIN_REPLY_LEN 255 - -void setup_server_onion_keys(server_onion_keys_t *keys); -void release_server_onion_keys(server_onion_keys_t *keys); - -void onion_handshake_state_release(onion_handshake_state_t *state); - -int onion_skin_create(int type, - const extend_info_t *node, - onion_handshake_state_t *state_out, - uint8_t *onion_skin_out); -int onion_skin_server_handshake(int type, - const uint8_t *onion_skin, size_t onionskin_len, - const server_onion_keys_t *keys, - uint8_t *reply_out, - uint8_t *keys_out, size_t key_out_len, - uint8_t *rend_nonce_out); -int onion_skin_client_handshake(int type, - const onion_handshake_state_t *handshake_state, - const uint8_t *reply, size_t reply_len, - uint8_t *keys_out, size_t key_out_len, - uint8_t *rend_authenticator_out); - -/** A parsed CREATE, CREATE_FAST, or CREATE2 cell. */ -typedef struct create_cell_t { - /** The cell command. One of CREATE{,_FAST,2} */ - uint8_t cell_type; - /** One of the ONION_HANDSHAKE_TYPE_* values */ - uint16_t handshake_type; - /** The number of bytes used in onionskin. */ - uint16_t handshake_len; - /** The client-side message for the circuit creation handshake. */ - uint8_t onionskin[CELL_PAYLOAD_SIZE - 4]; -} create_cell_t; - -/** A parsed CREATED, CREATED_FAST, or CREATED2 cell. */ -typedef struct created_cell_t { - /** The cell command. One of CREATED{,_FAST,2} */ - uint8_t cell_type; - /** The number of bytes used in reply. */ - uint16_t handshake_len; - /** The server-side message for the circuit creation handshake. */ - uint8_t reply[CELL_PAYLOAD_SIZE - 2]; -} created_cell_t; - -/** A parsed RELAY_EXTEND or RELAY_EXTEND2 cell */ -typedef struct extend_cell_t { - /** One of RELAY_EXTEND or RELAY_EXTEND2 */ - uint8_t cell_type; - /** An IPv4 address and port for the node we're connecting to. */ - tor_addr_port_t orport_ipv4; - /** An IPv6 address and port for the node we're connecting to. Not currently - * used. */ - tor_addr_port_t orport_ipv6; - /** Identity fingerprint of the node we're conecting to.*/ - uint8_t node_id[DIGEST_LEN]; - /** The "create cell" embedded in this extend cell. Note that unlike the - * create cells we generate ourself, this once can have a handshake type we - * don't recognize. */ - create_cell_t create_cell; -} extend_cell_t; - -/** A parsed RELAY_EXTEND or RELAY_EXTEND2 cell */ -typedef struct extended_cell_t { - /** One of RELAY_EXTENDED or RELAY_EXTENDED2. */ - uint8_t cell_type; - /** The "created cell" embedded in this extended cell. */ - created_cell_t created_cell; -} extended_cell_t; - -void create_cell_init(create_cell_t *cell_out, uint8_t cell_type, - uint16_t handshake_type, uint16_t handshake_len, - const uint8_t *onionskin); -int create_cell_parse(create_cell_t *cell_out, const cell_t *cell_in); -int created_cell_parse(created_cell_t *cell_out, const cell_t *cell_in); -int extend_cell_parse(extend_cell_t *cell_out, const uint8_t command, - const uint8_t *payload_in, size_t payload_len); -int extended_cell_parse(extended_cell_t *cell_out, const uint8_t command, - const uint8_t *payload_in, size_t payload_len); - -int create_cell_format(cell_t *cell_out, const create_cell_t *cell_in); -int create_cell_format_relayed(cell_t *cell_out, const create_cell_t *cell_in); -int created_cell_format(cell_t *cell_out, const created_cell_t *cell_in); -int extend_cell_format(uint8_t *command_out, uint16_t *len_out, - uint8_t *payload_out, const extend_cell_t *cell_in); -int extended_cell_format(uint8_t *command_out, uint16_t *len_out, - uint8_t *payload_out, const extended_cell_t *cell_in); - -#endif - diff --git a/src/tor/onion_fast.c b/src/tor/onion_fast.c deleted file mode 100644 index 8e778dbc6..000000000 --- a/src/tor/onion_fast.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_fast.c - * \brief Functions implement the CREATE_FAST circuit handshake. - **/ - -#include "or.h" -#include "onion_fast.h" - -/** Release all state held in victim. */ -void -fast_handshake_state_free(fast_handshake_state_t *victim) -{ - if (! victim) - return; - memwipe(victim, 0, sizeof(fast_handshake_state_t)); - tor_free(victim); -} - -/** Create the state needed to perform a CREATE_FAST handshake. Return 0 - * on success, -1 on failure. */ -int -fast_onionskin_create(fast_handshake_state_t **handshake_state_out, - uint8_t *handshake_out) -{ - fast_handshake_state_t *s; - *handshake_state_out = s = tor_malloc(sizeof(fast_handshake_state_t)); - if (crypto_rand((char*)s->state, sizeof(s->state)) < 0) { - tor_free(s); - return -1; - } - memcpy(handshake_out, s->state, DIGEST_LEN); - return 0; -} - -/** Implement the server side of the CREATE_FAST abbreviated handshake. The - * client has provided DIGEST_LEN key bytes in key_in ("x"). We - * generate a reply of DIGEST_LEN*2 bytes in key_out, consisting of a - * new random "y", followed by H(x|y) to check for correctness. We set - * key_out_len bytes of key material in key_out. - * Return 0 on success, <0 on failure. - **/ -int -fast_server_handshake(const uint8_t *key_in, /* DIGEST_LEN bytes */ - uint8_t *handshake_reply_out, /* DIGEST_LEN*2 bytes */ - uint8_t *key_out, - size_t key_out_len) -{ - uint8_t tmp[DIGEST_LEN+DIGEST_LEN]; - uint8_t *out = NULL; - size_t out_len; - int r = -1; - - if (crypto_rand((char*)handshake_reply_out, DIGEST_LEN)<0) - return -1; - - memcpy(tmp, key_in, DIGEST_LEN); - memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN); - out_len = key_out_len+DIGEST_LEN; - out = tor_malloc(out_len); - if (crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len)) { - goto done; - } - memcpy(handshake_reply_out+DIGEST_LEN, out, DIGEST_LEN); - memcpy(key_out, out+DIGEST_LEN, key_out_len); - r = 0; - done: - memwipe(tmp, 0, sizeof(tmp)); - memwipe(out, 0, out_len); - tor_free(out); - return r; -} - -/** Implement the second half of the client side of the CREATE_FAST handshake. - * We sent the server handshake_state ("x") already, and the server - * told us handshake_reply_out (y|H(x|y)). Make sure that the hash is - * correct, and generate key material in key_out. Return 0 on success, - * true on failure. - * - * NOTE: The "CREATE_FAST" handshake path is distinguishable from regular - * "onionskin" handshakes, and is not secure if an adversary can see or modify - * the messages. Therefore, it should only be used by clients, and only as - * the first hop of a circuit (since the first hop is already authenticated - * and protected by TLS). - */ -int -fast_client_handshake(const fast_handshake_state_t *handshake_state, - const uint8_t *handshake_reply_out,/*DIGEST_LEN*2 bytes*/ - uint8_t *key_out, - size_t key_out_len) -{ - uint8_t tmp[DIGEST_LEN+DIGEST_LEN]; - uint8_t *out; - size_t out_len; - int r = -1; - - memcpy(tmp, handshake_state->state, DIGEST_LEN); - memcpy(tmp+DIGEST_LEN, handshake_reply_out, DIGEST_LEN); - out_len = key_out_len+DIGEST_LEN; - out = tor_malloc(out_len); - if (crypto_expand_key_material_TAP(tmp, sizeof(tmp), out, out_len)) { - goto done; - } - if (tor_memneq(out, handshake_reply_out+DIGEST_LEN, DIGEST_LEN)) { - /* H(K) does *not* match. Something fishy. */ - log_warn(LD_PROTOCOL,"Digest DOES NOT MATCH on fast handshake. " - "Bug or attack."); - goto done; - } - memcpy(key_out, out+DIGEST_LEN, key_out_len); - r = 0; - done: - memwipe(tmp, 0, sizeof(tmp)); - memwipe(out, 0, out_len); - tor_free(out); - return r; -} - diff --git a/src/tor/onion_fast.h b/src/tor/onion_fast.h deleted file mode 100644 index 8c078378d..000000000 --- a/src/tor/onion_fast.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_fast.h - * \brief Header file for onion_fast.c. - **/ - -#ifndef TOR_ONION_FAST_H -#define TOR_ONION_FAST_H - -#define CREATE_FAST_LEN DIGEST_LEN -#define CREATED_FAST_LEN (DIGEST_LEN*2) - -typedef struct fast_handshake_state_t { - uint8_t state[DIGEST_LEN]; -} fast_handshake_state_t; - -void fast_handshake_state_free(fast_handshake_state_t *victim); - -int fast_onionskin_create(fast_handshake_state_t **handshake_state_out, - uint8_t *handshake_out); - -int fast_server_handshake(const uint8_t *message_in, - uint8_t *handshake_reply_out, - uint8_t *key_out, - size_t key_out_len); - -int fast_client_handshake(const fast_handshake_state_t *handshake_state, - const uint8_t *handshake_reply_out, - uint8_t *key_out, - size_t key_out_len); - -#endif - diff --git a/src/tor/onion_main.c b/src/tor/onion_main.c deleted file mode 100644 index 9fe915b7b..000000000 --- a/src/tor/onion_main.c +++ /dev/null @@ -1,2908 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_main.c - * \brief Toplevel module. Handles signals, multiplexes between - * connections, implements main loop, and drives scheduled events. - **/ - -#define MAIN_PRIVATE -#include "or.h" -#include "addressmap.h" -#include "backtrace.h" -#include "buffers.h" -#include "channel.h" -#include "channeltls.h" -#include "circuitbuild.h" -#include "circuitlist.h" -#include "circuituse.h" -#include "command.h" -#include "config.h" -#include "confparse.h" -#include "connection.h" -#include "connection_edge.h" -#include "connection_or.h" -#include "control.h" -#include "cpuworker.h" -#include "directory.h" -#include "dirserv.h" -#include "dirvote.h" -#include "dns.h" -#include "dnsserv.h" -#include "entrynodes.h" -#include "geoip.h" -#include "hibernate.h" -#include "onion_main.h" -#include "microdesc.h" -#include "networkstatus.h" -#include "nodelist.h" -#include "ntmain.h" -#include "onion.h" -#include "policies.h" -#include "transports.h" -#include "relay.h" -#include "rendclient.h" -#include "rendcommon.h" -#include "rendservice.h" -#include "rephist.h" -#include "router.h" -#include "routerlist.h" -#include "routerparse.h" -#include "statefile.h" -#include "status.h" -#include "ext_orport.h" -#include "anonymize.h" -#ifdef USE_DMALLOC -#include -#include -#endif -#include "memarea.h" -#include "sandbox.h" - -#ifdef HAVE_EVENT2_EVENT_H -#include -#else -#include -#endif - -#ifdef USE_BUFFEREVENTS -#include -#endif - -void evdns_shutdown(int); - -/********* PROTOTYPES **********/ - -static void dumpmemusage(int severity); -static void dumpstats(int severity); /* log stats */ -static void conn_read_callback(evutil_socket_t fd, short event, void *_conn); -static void conn_write_callback(evutil_socket_t fd, short event, void *_conn); -static void second_elapsed_callback(periodic_timer_t *timer, void *args); -static int conn_close_if_marked(int i); -static void connection_start_reading_from_linked_conn(connection_t *conn); -static int connection_should_read_from_linked_conn(connection_t *conn); - -/********* START VARIABLES **********/ - -#ifndef USE_BUFFEREVENTS -int global_read_bucket; /**< Max number of bytes I can read this second. */ -int global_write_bucket; /**< Max number of bytes I can write this second. */ - -/** Max number of relayed (bandwidth class 1) bytes I can read this second. */ -int global_relayed_read_bucket; -/** Max number of relayed (bandwidth class 1) bytes I can write this second. */ -int global_relayed_write_bucket; -/** What was the read bucket before the last second_elapsed_callback() call? - * (used to determine how many bytes we've read). */ -static int stats_prev_global_read_bucket; -/** What was the write bucket before the last second_elapsed_callback() call? - * (used to determine how many bytes we've written). */ -static int stats_prev_global_write_bucket; -#endif - -/* DOCDOC stats_prev_n_read */ -static uint64_t stats_prev_n_read = 0; -/* DOCDOC stats_prev_n_written */ -static uint64_t stats_prev_n_written = 0; - -/* XXX we might want to keep stats about global_relayed_*_bucket too. Or not.*/ -/** How many bytes have we read since we started the process? */ -static uint64_t stats_n_bytes_read = 0; -/** How many bytes have we written since we started the process? */ -static uint64_t stats_n_bytes_written = 0; -/** What time did this process start up? */ -time_t time_of_process_start = 0; -/** How many seconds have we been running? */ -long stats_n_seconds_working = 0; -/** When do we next launch DNS wildcarding checks? */ -static time_t time_to_check_for_correct_dns = 0; - -/** How often will we honor SIGNEWNYM requests? */ -#define MAX_SIGNEWNYM_RATE 10 -/** When did we last process a SIGNEWNYM request? */ -static time_t time_of_last_signewnym = 0; -/** Is there a signewnym request we're currently waiting to handle? */ -static int signewnym_is_pending = 0; -/** How many times have we called newnym? */ -static unsigned newnym_epoch = 0; - -/** Smartlist of all open connections. */ -static smartlist_t *connection_array = NULL; -/** List of connections that have been marked for close and need to be freed - * and removed from connection_array. */ -static smartlist_t *closeable_connection_lst = NULL; -/** List of linked connections that are currently reading data into their - * inbuf from their partner's outbuf. */ -static smartlist_t *active_linked_connection_lst = NULL; -/** Flag: Set to true iff we entered the current libevent main loop via - * loop_once. If so, there's no need to trigger a loopexit in order - * to handle linked connections. */ -static int called_loop_once = 0; - -/** We set this to 1 when we've opened a circuit, so we can print a log - * entry to inform the user that Tor is working. We set it to 0 when - * we think the fact that we once opened a circuit doesn't mean we can do so - * any longer (a big time jump happened, when we notice our directory is - * heinously out-of-date, etc. - */ -int can_complete_circuit=0; - -const char tor_git_revision[] = ""; - -/** How often do we check for router descriptors that we should download - * when we have too little directory info? */ -#define GREEDY_DESCRIPTOR_RETRY_INTERVAL (10) -/** How often do we check for router descriptors that we should download - * when we have enough directory info? */ -#define LAZY_DESCRIPTOR_RETRY_INTERVAL (60) -/** How often do we 'forgive' undownloadable router descriptors and attempt - * to download them again? */ -#define DESCRIPTOR_FAILURE_RESET_INTERVAL (60*60) - -/** Decides our behavior when no logs are configured/before any - * logs have been configured. For 0, we log notice to stdout as normal. - * For 1, we log warnings only. For 2, we log nothing. - */ -int quiet_level = 0; - -/********* END VARIABLES ************/ - -/**************************************************************************** -* -* This section contains accessors and other methods on the connection_array -* variables (which are global within this file and unavailable outside it). -* -****************************************************************************/ - -#if 0 && defined(USE_BUFFEREVENTS) -static void -free_old_inbuf(connection_t *conn) -{ - if (! conn->inbuf) - return; - - tor_assert(conn->outbuf); - tor_assert(buf_datalen(conn->inbuf) == 0); - tor_assert(buf_datalen(conn->outbuf) == 0); - buf_free(conn->inbuf); - buf_free(conn->outbuf); - conn->inbuf = conn->outbuf = NULL; - - if (conn->read_event) { - event_del(conn->read_event); - tor_event_free(conn->read_event); - } - if (conn->write_event) { - event_del(conn->read_event); - tor_event_free(conn->write_event); - } - conn->read_event = conn->write_event = NULL; -} -#endif - -#if defined(_WIN32) && defined(USE_BUFFEREVENTS) -/** Remove the kernel-space send and receive buffers for s. For use - * with IOCP only. */ -static int -set_buffer_lengths_to_zero(tor_socket_t s) -{ - int zero = 0; - int r = 0; - if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, (void*)&zero, sizeof(zero))) { - log_warn(LD_NET, "Unable to clear SO_SNDBUF"); - r = -1; - } - if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, (void*)&zero, sizeof(zero))) { - log_warn(LD_NET, "Unable to clear SO_RCVBUF"); - r = -1; - } - return r; -} -#endif - -/** Add conn to the array of connections that we can poll on. The - * connection's socket must be set; the connection starts out - * non-reading and non-writing. - */ -int -connection_add_impl(connection_t *conn, int is_connecting) -{ - tor_assert(conn); - tor_assert(SOCKET_OK(conn->s) || - conn->linked || - (conn->type == CONN_TYPE_AP && - TO_EDGE_CONN(conn)->is_dns_request)); - - tor_assert(conn->conn_array_index == -1); /* can only connection_add once */ - conn->conn_array_index = smartlist_len(connection_array); - smartlist_add(connection_array, conn); - -#ifdef USE_BUFFEREVENTS - if (connection_type_uses_bufferevent(conn)) { - if (SOCKET_OK(conn->s) && !conn->linked) { - -#ifdef _WIN32 - if (tor_libevent_using_iocp_bufferevents() && - get_options()->UserspaceIOCPBuffers) { - set_buffer_lengths_to_zero(conn->s); - } -#endif - - conn->bufev = bufferevent_socket_new( - tor_libevent_get_base(), - conn->s, - BEV_OPT_DEFER_CALLBACKS); - if (!conn->bufev) { - log_warn(LD_BUG, "Unable to create socket bufferevent"); - smartlist_del(connection_array, conn->conn_array_index); - conn->conn_array_index = -1; - return -1; - } - if (is_connecting) { - /* Put the bufferevent into a "connecting" state so that we'll get - * a "connected" event callback on successful write. */ - bufferevent_socket_connect(conn->bufev, NULL, 0); - } - connection_configure_bufferevent_callbacks(conn); - } else if (conn->linked && conn->linked_conn && - connection_type_uses_bufferevent(conn->linked_conn)) { - tor_assert(!(SOCKET_OK(conn->s))); - if (!conn->bufev) { - struct bufferevent *pair[2] = { NULL, NULL }; - if (bufferevent_pair_new(tor_libevent_get_base(), - BEV_OPT_DEFER_CALLBACKS, - pair) < 0) { - log_warn(LD_BUG, "Unable to create bufferevent pair"); - smartlist_del(connection_array, conn->conn_array_index); - conn->conn_array_index = -1; - return -1; - } - tor_assert(pair[0]); - conn->bufev = pair[0]; - conn->linked_conn->bufev = pair[1]; - } /* else the other side already was added, and got a bufferevent_pair */ - connection_configure_bufferevent_callbacks(conn); - } else { - tor_assert(!conn->linked); - } - - if (conn->bufev) - tor_assert(conn->inbuf == NULL); - - if (conn->linked_conn && conn->linked_conn->bufev) - tor_assert(conn->linked_conn->inbuf == NULL); - } -#else - (void) is_connecting; -#endif - - if (!HAS_BUFFEREVENT(conn) && (SOCKET_OK(conn->s) || conn->linked)) { - conn->read_event = tor_event_new(tor_libevent_get_base(), - conn->s, EV_READ|EV_PERSIST, conn_read_callback, conn); - conn->write_event = tor_event_new(tor_libevent_get_base(), - conn->s, EV_WRITE|EV_PERSIST, conn_write_callback, conn); - /* XXXX CHECK FOR NULL RETURN! */ - } - - log_debug(LD_NET,"new conn type %s, socket %d, address %s, n_conns %d.", - conn_type_to_string(conn->type), (int)conn->s, conn->address, - smartlist_len(connection_array)); - - return 0; -} - -/** Tell libevent that we don't care about conn any more. */ -void -connection_unregister_events(connection_t *conn) -{ - if (conn->read_event) { - if (event_del(conn->read_event)) - log_warn(LD_BUG, "Error removing read event for %d", (int)conn->s); - tor_free(conn->read_event); - } - if (conn->write_event) { - if (event_del(conn->write_event)) - log_warn(LD_BUG, "Error removing write event for %d", (int)conn->s); - tor_free(conn->write_event); - } -#ifdef USE_BUFFEREVENTS - if (conn->bufev) { - bufferevent_free(conn->bufev); - conn->bufev = NULL; - } -#endif - if (conn->type == CONN_TYPE_AP_DNS_LISTENER) { - dnsserv_close_listener(conn); - } -} - -/** Remove the connection from the global list, and remove the - * corresponding poll entry. Calling this function will shift the last - * connection (if any) into the position occupied by conn. - */ -int -connection_remove(connection_t *conn) -{ - int current_index; - connection_t *tmp; - - tor_assert(conn); - - log_debug(LD_NET,"removing socket %d (type %s), n_conns now %d", - (int)conn->s, conn_type_to_string(conn->type), - smartlist_len(connection_array)); - - control_event_conn_bandwidth(conn); - - tor_assert(conn->conn_array_index >= 0); - current_index = conn->conn_array_index; - connection_unregister_events(conn); /* This is redundant, but cheap. */ - if (current_index == smartlist_len(connection_array)-1) { /* at the end */ - smartlist_del(connection_array, current_index); - return 0; - } - - /* replace this one with the one at the end */ - smartlist_del(connection_array, current_index); - tmp = smartlist_get(connection_array, current_index); - tmp->conn_array_index = current_index; - - return 0; -} - -/** If conn is an edge conn, remove it from the list - * of conn's on this circuit. If it's not on an edge, - * flush and send destroys for all circuits on this conn. - * - * Remove it from connection_array (if applicable) and - * from closeable_connection_list. - * - * Then free it. - */ -static void -connection_unlink(connection_t *conn) -{ - connection_about_to_close_connection(conn); - if (conn->conn_array_index >= 0) { - connection_remove(conn); - } - if (conn->linked_conn) { - conn->linked_conn->linked_conn = NULL; - if (! conn->linked_conn->marked_for_close && - conn->linked_conn->reading_from_linked_conn) - connection_start_reading(conn->linked_conn); - conn->linked_conn = NULL; - } - smartlist_remove(closeable_connection_lst, conn); - smartlist_remove(active_linked_connection_lst, conn); - if (conn->type == CONN_TYPE_EXIT) { - assert_connection_edge_not_dns_pending(TO_EDGE_CONN(conn)); - } - if (conn->type == CONN_TYPE_OR) { - if (!tor_digest_is_zero(TO_OR_CONN(conn)->identity_digest)) - connection_or_remove_from_identity_map(TO_OR_CONN(conn)); - /* connection_unlink() can only get called if the connection - * was already on the closeable list, and it got there by - * connection_mark_for_close(), which was called from - * connection_or_close_normally() or - * connection_or_close_for_error(), so the channel should - * already be in CHANNEL_STATE_CLOSING, and then the - * connection_about_to_close_connection() goes to - * connection_or_about_to_close(), which calls channel_closed() - * to notify the channel_t layer, and closed the channel, so - * nothing more to do here to deal with the channel associated - * with an orconn. - */ - } - connection_free(conn); -} - -/** Initialize the global connection list, closeable connection list, - * and active connection list. */ -STATIC void -init_connection_lists(void) -{ - if (!connection_array) - connection_array = smartlist_new(); - if (!closeable_connection_lst) - closeable_connection_lst = smartlist_new(); - if (!active_linked_connection_lst) - active_linked_connection_lst = smartlist_new(); -} - -/** Schedule conn to be closed. **/ -void -add_connection_to_closeable_list(connection_t *conn) -{ - tor_assert(!smartlist_contains(closeable_connection_lst, conn)); - tor_assert(conn->marked_for_close); - assert_connection_ok(conn, time(NULL)); - smartlist_add(closeable_connection_lst, conn); -} - -/** Return 1 if conn is on the closeable list, else return 0. */ -int -connection_is_on_closeable_list(connection_t *conn) -{ - return smartlist_contains(closeable_connection_lst, conn); -} - -/** Return true iff conn is in the current poll array. */ -int -connection_in_array(connection_t *conn) -{ - return smartlist_contains(connection_array, conn); -} - -/** Set *array to an array of all connections, and *n - * to the length of the array. *array and *n must not - * be modified. - */ -smartlist_t * -get_connection_array(void) -{ - if (!connection_array) - connection_array = smartlist_new(); - return connection_array; -} - -/** Provides the traffic read and written over the life of the process. */ - -uint64_t -get_bytes_read(void) -{ - return stats_n_bytes_read; -} - -/* DOCDOC get_bytes_written */ -uint64_t -get_bytes_written(void) -{ - return stats_n_bytes_written; -} - -/** Set the event mask on conn to events. (The event - * mask is a bitmask whose bits are READ_EVENT and WRITE_EVENT) - */ -void -connection_watch_events(connection_t *conn, watchable_events_t events) -{ - IF_HAS_BUFFEREVENT(conn, { - short ev = ((short)events) & (EV_READ|EV_WRITE); - short old_ev = bufferevent_get_enabled(conn->bufev); - if ((ev & ~old_ev) != 0) { - bufferevent_enable(conn->bufev, ev); - } - if ((old_ev & ~ev) != 0) { - bufferevent_disable(conn->bufev, old_ev & ~ev); - } - return; - }); - if (events & READ_EVENT) - connection_start_reading(conn); - else - connection_stop_reading(conn); - - if (events & WRITE_EVENT) - connection_start_writing(conn); - else - connection_stop_writing(conn); -} - -/** Return true iff conn is listening for read events. */ -int -connection_is_reading(connection_t *conn) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, - return (bufferevent_get_enabled(conn->bufev) & EV_READ) != 0; - ); - return conn->reading_from_linked_conn || - (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); -} - -/** Tell the main loop to stop notifying conn of any read events. */ -MOCK_IMPL(void, -connection_stop_reading,(connection_t *conn)) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, { - bufferevent_disable(conn->bufev, EV_READ); - return; - }); - - tor_assert(conn->read_event); - - if (conn->linked) { - conn->reading_from_linked_conn = 0; - connection_stop_reading_from_linked_conn(conn); - } else { - if (event_del(conn->read_event)) - log_warn(LD_NET, "Error from libevent setting read event state for %d " - "to unwatched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Tell the main loop to start notifying conn of any read events. */ -MOCK_IMPL(void, -connection_start_reading,(connection_t *conn)) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, { - bufferevent_enable(conn->bufev, EV_READ); - return; - }); - - tor_assert(conn->read_event); - - if (conn->linked) { - conn->reading_from_linked_conn = 1; - if (connection_should_read_from_linked_conn(conn)) - connection_start_reading_from_linked_conn(conn); - } else { - if (event_add(conn->read_event, NULL)) - log_warn(LD_NET, "Error from libevent setting read event state for %d " - "to watched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Return true iff conn is listening for write events. */ -int -connection_is_writing(connection_t *conn) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, - return (bufferevent_get_enabled(conn->bufev) & EV_WRITE) != 0; - ); - - return conn->writing_to_linked_conn || - (conn->write_event && event_pending(conn->write_event, EV_WRITE, NULL)); -} - -/** Tell the main loop to stop notifying conn of any write events. */ -MOCK_IMPL(void, -connection_stop_writing,(connection_t *conn)) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, { - bufferevent_disable(conn->bufev, EV_WRITE); - return; - }); - - tor_assert(conn->write_event); - - if (conn->linked) { - conn->writing_to_linked_conn = 0; - if (conn->linked_conn) - connection_stop_reading_from_linked_conn(conn->linked_conn); - } else { - if (event_del(conn->write_event)) - log_warn(LD_NET, "Error from libevent setting write event state for %d " - "to unwatched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Tell the main loop to start notifying conn of any write events. */ -MOCK_IMPL(void, -connection_start_writing,(connection_t *conn)) -{ - tor_assert(conn); - - IF_HAS_BUFFEREVENT(conn, { - bufferevent_enable(conn->bufev, EV_WRITE); - return; - }); - - tor_assert(conn->write_event); - - if (conn->linked) { - conn->writing_to_linked_conn = 1; - if (conn->linked_conn && - connection_should_read_from_linked_conn(conn->linked_conn)) - connection_start_reading_from_linked_conn(conn->linked_conn); - } else { - if (event_add(conn->write_event, NULL)) - log_warn(LD_NET, "Error from libevent setting write event state for %d " - "to watched: %s", - (int)conn->s, - tor_socket_strerror(tor_socket_errno(conn->s))); - } -} - -/** Return true iff conn is linked conn, and reading from the conn - * linked to it would be good and feasible. (Reading is "feasible" if the - * other conn exists and has data in its outbuf, and is "good" if we have our - * reading_from_linked_conn flag set and the other conn has its - * writing_to_linked_conn flag set.)*/ -static int -connection_should_read_from_linked_conn(connection_t *conn) -{ - if (conn->linked && conn->reading_from_linked_conn) { - if (! conn->linked_conn || - (conn->linked_conn->writing_to_linked_conn && - buf_datalen(conn->linked_conn->outbuf))) - return 1; - } - return 0; -} - -/** Helper: Tell the main loop to begin reading bytes into conn from - * its linked connection, if it is not doing so already. Called by - * connection_start_reading and connection_start_writing as appropriate. */ -static void -connection_start_reading_from_linked_conn(connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->linked == 1); - - if (!conn->active_on_link) { - conn->active_on_link = 1; - smartlist_add(active_linked_connection_lst, conn); - if (!called_loop_once) { - /* This is the first event on the list; we won't be in LOOP_ONCE mode, - * so we need to make sure that the event_base_loop() actually exits at - * the end of its run through the current connections and lets us - * activate read events for linked connections. */ - struct timeval tv = { 0, 0 }; - tor_event_base_loopexit(tor_libevent_get_base(), &tv); - } - } else { - tor_assert(smartlist_contains(active_linked_connection_lst, conn)); - } -} - -/** Tell the main loop to stop reading bytes into conn from its linked - * connection, if is currently doing so. Called by connection_stop_reading, - * connection_stop_writing, and connection_read. */ -void -connection_stop_reading_from_linked_conn(connection_t *conn) -{ - tor_assert(conn); - tor_assert(conn->linked == 1); - - if (conn->active_on_link) { - conn->active_on_link = 0; - /* FFFF We could keep an index here so we can smartlist_del - * cleanly. On the other hand, this doesn't show up on profiles, - * so let's leave it alone for now. */ - smartlist_remove(active_linked_connection_lst, conn); - } else { - tor_assert(!smartlist_contains(active_linked_connection_lst, conn)); - } -} - -/** Close all connections that have been scheduled to get closed. */ -STATIC void -close_closeable_connections(void) -{ - int i; - for (i = 0; i < smartlist_len(closeable_connection_lst); ) { - connection_t *conn = smartlist_get(closeable_connection_lst, i); - if (conn->conn_array_index < 0) { - connection_unlink(conn); /* blow it away right now */ - } else { - if (!conn_close_if_marked(conn->conn_array_index)) - ++i; - } - } -} - -/** Libevent callback: this gets invoked when (connection_t*)conn has - * some data to read. */ -static void -conn_read_callback(evutil_socket_t fd, short event, void *_conn) -{ - connection_t *conn = _conn; - (void)fd; - (void)event; - - log_debug(LD_NET,"socket %d wants to read.",(int)conn->s); - - /* assert_connection_ok(conn, time(NULL)); */ - - if (connection_handle_read(conn) < 0) { - if (!conn->marked_for_close) { -#ifndef _WIN32 - log_warn(LD_BUG,"Unhandled error on read for %s connection " - "(fd %d); removing", - conn_type_to_string(conn->type), (int)conn->s); - tor_fragile_assert(); -#endif - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - connection_mark_for_close(conn); - } - } - assert_connection_ok(conn, time(NULL)); - - if (smartlist_len(closeable_connection_lst)) - close_closeable_connections(); -} - -/** Libevent callback: this gets invoked when (connection_t*)conn has - * some data to write. */ -static void -conn_write_callback(evutil_socket_t fd, short events, void *_conn) -{ - connection_t *conn = _conn; - (void)fd; - (void)events; - - LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "socket %d wants to write.", - (int)conn->s)); - - /* assert_connection_ok(conn, time(NULL)); */ - - if (connection_handle_write(conn, 0) < 0) { - if (!conn->marked_for_close) { - /* this connection is broken. remove it. */ - log_fn(LOG_WARN,LD_BUG, - "unhandled error on write for %s connection (fd %d); removing", - conn_type_to_string(conn->type), (int)conn->s); - tor_fragile_assert(); - if (CONN_IS_EDGE(conn)) { - /* otherwise we cry wolf about duplicate close */ - edge_connection_t *edge_conn = TO_EDGE_CONN(conn); - if (!edge_conn->end_reason) - edge_conn->end_reason = END_STREAM_REASON_INTERNAL; - edge_conn->edge_has_sent_end = 1; - } - connection_close_immediate(conn); /* So we don't try to flush. */ - connection_mark_for_close(conn); - } - } - assert_connection_ok(conn, time(NULL)); - - if (smartlist_len(closeable_connection_lst)) - close_closeable_connections(); -} - -/** If the connection at connection_array[i] is marked for close, then: - * - If it has data that it wants to flush, try to flush it. - * - If it _still_ has data to flush, and conn->hold_open_until_flushed is - * true, then leave the connection open and return. - * - Otherwise, remove the connection from connection_array and from - * all other lists, close it, and free it. - * Returns 1 if the connection was closed, 0 otherwise. - */ -static int -conn_close_if_marked(int i) -{ - connection_t *conn; - int retval; - time_t now; - - conn = smartlist_get(connection_array, i); - if (!conn->marked_for_close) - return 0; /* nothing to see here, move along */ - now = time(NULL); - assert_connection_ok(conn, now); - /* assert_all_pending_dns_resolves_ok(); */ - -#ifdef USE_BUFFEREVENTS - if (conn->bufev) { - if (conn->hold_open_until_flushed && - evbuffer_get_length(bufferevent_get_output(conn->bufev))) { - /* don't close yet. */ - return 0; - } - if (conn->linked_conn && ! conn->linked_conn->marked_for_close) { - /* We need to do this explicitly so that the linked connection - * notices that there was an EOF. */ - bufferevent_flush(conn->bufev, EV_WRITE, BEV_FINISHED); - } - } -#endif - - log_debug(LD_NET,"Cleaning up connection (fd "TOR_SOCKET_T_FORMAT").", - conn->s); - - /* If the connection we are about to close was trying to connect to - a proxy server and failed, the client won't be able to use that - proxy. We should warn the user about this. */ - if (conn->proxy_state == PROXY_INFANT) - log_failed_proxy_connection(conn); - - IF_HAS_BUFFEREVENT(conn, goto unlink); - if ((SOCKET_OK(conn->s) || conn->linked_conn) && - connection_wants_to_flush(conn)) { - /* s == -1 means it's an incomplete edge connection, or that the socket - * has already been closed as unflushable. */ - ssize_t sz = connection_bucket_write_limit(conn, now); - if (!conn->hold_open_until_flushed) - log_info(LD_NET, - "Conn (addr %s, fd %d, type %s, state %d) marked, but wants " - "to flush %d bytes. (Marked at %s:%d)", - escaped_safe_str_client(conn->address), - (int)conn->s, conn_type_to_string(conn->type), conn->state, - (int)conn->outbuf_flushlen, - conn->marked_for_close_file, conn->marked_for_close); - if (conn->linked_conn) { - retval = move_buf_to_buf(conn->linked_conn->inbuf, conn->outbuf, - &conn->outbuf_flushlen); - if (retval >= 0) { - /* The linked conn will notice that it has data when it notices that - * we're gone. */ - connection_start_reading_from_linked_conn(conn->linked_conn); - } - log_debug(LD_GENERAL, "Flushed last %d bytes from a linked conn; " - "%d left; flushlen %d; wants-to-flush==%d", retval, - (int)connection_get_outbuf_len(conn), - (int)conn->outbuf_flushlen, - connection_wants_to_flush(conn)); - } else if (connection_speaks_cells(conn)) { - if (conn->state == OR_CONN_STATE_OPEN) { - retval = flush_buf_tls(TO_OR_CONN(conn)->tls, conn->outbuf, sz, - &conn->outbuf_flushlen); - } else - retval = -1; /* never flush non-open broken tls connections */ - } else { - retval = flush_buf(conn->s, conn->outbuf, sz, &conn->outbuf_flushlen); - } - if (retval >= 0 && /* Technically, we could survive things like - TLS_WANT_WRITE here. But don't bother for now. */ - conn->hold_open_until_flushed && connection_wants_to_flush(conn)) { - if (retval > 0) { - LOG_FN_CONN(conn, (LOG_INFO,LD_NET, - "Holding conn (fd %d) open for more flushing.", - (int)conn->s)); - conn->timestamp_lastwritten = now; /* reset so we can flush more */ - } else if (sz == 0) { - /* Also, retval==0. If we get here, we didn't want to write anything - * (because of rate-limiting) and we didn't. */ - - /* Connection must flush before closing, but it's being rate-limited. - * Let's remove from Libevent, and mark it as blocked on bandwidth - * so it will be re-added on next token bucket refill. Prevents - * busy Libevent loops where we keep ending up here and returning - * 0 until we are no longer blocked on bandwidth. - */ - if (connection_is_writing(conn)) { - conn->write_blocked_on_bw = 1; - connection_stop_writing(conn); - } - if (connection_is_reading(conn)) { - /* XXXX024 We should make this code unreachable; if a connection is - * marked for close and flushing, there is no point in reading to it - * at all. Further, checking at this point is a bit of a hack: it - * would make much more sense to react in - * connection_handle_read_impl, or to just stop reading in - * mark_and_flush */ -#if 0 -#define MARKED_READING_RATE 180 - static ratelim_t marked_read_lim = RATELIM_INIT(MARKED_READING_RATE); - char *m; - if ((m = rate_limit_log(&marked_read_lim, now))) { - log_warn(LD_BUG, "Marked connection (fd %d, type %s, state %s) " - "is still reading; that shouldn't happen.%s", - (int)conn->s, conn_type_to_string(conn->type), - conn_state_to_string(conn->type, conn->state), m); - tor_free(m); - } -#endif - conn->read_blocked_on_bw = 1; - connection_stop_reading(conn); - } - } - return 0; - } - if (connection_wants_to_flush(conn)) { - int severity; - if (conn->type == CONN_TYPE_EXIT || - (conn->type == CONN_TYPE_OR && server_mode(get_options())) || - (conn->type == CONN_TYPE_DIR && conn->purpose == DIR_PURPOSE_SERVER)) - severity = LOG_INFO; - else - severity = LOG_NOTICE; - /* XXXX Maybe allow this to happen a certain amount per hour; it usually - * is meaningless. */ - log_fn(severity, LD_NET, "We stalled too much while trying to write %d " - "bytes to address %s. If this happens a lot, either " - "something is wrong with your network connection, or " - "something is wrong with theirs. " - "(fd %d, type %s, state %d, marked at %s:%d).", - (int)connection_get_outbuf_len(conn), - escaped_safe_str_client(conn->address), - (int)conn->s, conn_type_to_string(conn->type), conn->state, - conn->marked_for_close_file, - conn->marked_for_close); - } - } - -#ifdef USE_BUFFEREVENTS - unlink: -#endif - connection_unlink(conn); /* unlink, remove, free */ - return 1; -} - -/** We've just tried every dirserver we know about, and none of - * them were reachable. Assume the network is down. Change state - * so next time an application connection arrives we'll delay it - * and try another directory fetch. Kill off all the circuit_wait - * streams that are waiting now, since they will all timeout anyway. - */ -void -directory_all_unreachable(time_t now) -{ - connection_t *conn; - (void)now; - - stats_n_seconds_working=0; /* reset it */ - - while ((conn = connection_get_by_type_state(CONN_TYPE_AP, - AP_CONN_STATE_CIRCUIT_WAIT))) { - entry_connection_t *entry_conn = TO_ENTRY_CONN(conn); - log_notice(LD_NET, - "Is your network connection down? " - "Failing connection to '%s:%d'.", - safe_str_client(entry_conn->socks_request->address), - entry_conn->socks_request->port); - connection_mark_unattached_ap(entry_conn, - END_STREAM_REASON_NET_UNREACHABLE); - } - control_event_general_status(LOG_ERR, "DIR_ALL_UNREACHABLE"); -} - -/** This function is called whenever we successfully pull down some new - * network statuses or server descriptors. */ -void -directory_info_has_arrived(time_t now, int from_cache) -{ - const or_options_t *options = get_options(); - - if (!router_have_minimum_dir_info()) { - int quiet = from_cache || - directory_too_idle_to_fetch_descriptors(options, now); - tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, - "I learned some more directory information, but not enough to " - "build a circuit: %s", get_dir_info_status_string()); - update_all_descriptor_downloads(now); - return; - } else { - if (directory_fetches_from_authorities(options)) { - update_all_descriptor_downloads(now); - } - - /* if we have enough dir info, then update our guard status with - * whatever we just learned. */ - entry_guards_compute_status(options, now); - /* Don't even bother trying to get extrainfo until the rest of our - * directory info is up-to-date */ - if (options->DownloadExtraInfo) - update_extrainfo_downloads(now); - } - - if (server_mode(options) && !net_is_disabled() && !from_cache && - (can_complete_circuit || !any_predicted_circuits(now))) - consider_testing_reachability(1, 1); -} - -/** How long do we wait before killing OR connections with no circuits? - * In Tor versions up to 0.2.1.25 and 0.2.2.12-alpha, we waited 15 minutes - * before cancelling these connections, which caused fast relays to accrue - * many many idle connections. Hopefully 3 minutes is low enough that - * it kills most idle connections, without being so low that we cause - * clients to bounce on and off. - */ -#define IDLE_OR_CONN_TIMEOUT 180 - -/** Perform regular maintenance tasks for a single connection. This - * function gets run once per second per connection by run_scheduled_events. - */ -static void -run_connection_housekeeping(int i, time_t now) -{ - cell_t cell; - connection_t *conn = smartlist_get(connection_array, i); - const or_options_t *options = get_options(); - or_connection_t *or_conn; - int past_keepalive = - now >= conn->timestamp_lastwritten + options->KeepalivePeriod; - - if (conn->outbuf && !connection_get_outbuf_len(conn) && - conn->type == CONN_TYPE_OR) - TO_OR_CONN(conn)->timestamp_lastempty = now; - - if (conn->marked_for_close) { - /* nothing to do here */ - return; - } - - /* Expire any directory connections that haven't been active (sent - * if a server or received if a client) for 5 min */ - if (conn->type == CONN_TYPE_DIR && - ((DIR_CONN_IS_SERVER(conn) && - conn->timestamp_lastwritten - + options->TestingDirConnectionMaxStall < now) || - (!DIR_CONN_IS_SERVER(conn) && - conn->timestamp_lastread - + options->TestingDirConnectionMaxStall < now))) { - log_info(LD_DIR,"Expiring wedged directory conn (fd %d, purpose %d)", - (int)conn->s, conn->purpose); - /* This check is temporary; it's to let us know whether we should consider - * parsing partial serverdesc responses. */ - if (conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC && - connection_get_inbuf_len(conn) >= 1024) { - log_info(LD_DIR,"Trying to extract information from wedged server desc " - "download."); - connection_dir_reached_eof(TO_DIR_CONN(conn)); - } else { - connection_mark_for_close(conn); - } - return; - } - - if (!connection_speaks_cells(conn)) - return; /* we're all done here, the rest is just for OR conns */ - - /* If we haven't written to an OR connection for a while, then either nuke - the connection or send a keepalive, depending. */ - - or_conn = TO_OR_CONN(conn); -#ifdef USE_BUFFEREVENTS - tor_assert(conn->bufev); -#else - tor_assert(conn->outbuf); -#endif - - if (channel_is_bad_for_new_circs(TLS_CHAN_TO_BASE(or_conn->chan)) && - !connection_or_get_num_circuits(or_conn)) { - /* It's bad for new circuits, and has no unmarked circuits on it: - * mark it now. */ - log_info(LD_OR, - "Expiring non-used OR connection to fd %d (%s:%d) [Too old].", - (int)conn->s, conn->address, conn->port); - if (conn->state == OR_CONN_STATE_CONNECTING) - connection_or_connect_failed(TO_OR_CONN(conn), - END_OR_CONN_REASON_TIMEOUT, - "Tor gave up on the connection"); - connection_or_close_normally(TO_OR_CONN(conn), 1); - } else if (!connection_state_is_open(conn)) { - if (past_keepalive) { - /* We never managed to actually get this connection open and happy. */ - log_info(LD_OR,"Expiring non-open OR connection to fd %d (%s:%d).", - (int)conn->s,conn->address, conn->port); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } - } else if (we_are_hibernating() && - !connection_or_get_num_circuits(or_conn) && - !connection_get_outbuf_len(conn)) { - /* We're hibernating, there's no circuits, and nothing to flush.*/ - log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " - "[Hibernating or exiting].", - (int)conn->s,conn->address, conn->port); - connection_or_close_normally(TO_OR_CONN(conn), 1); - } else if (!connection_or_get_num_circuits(or_conn) && - now >= or_conn->timestamp_last_added_nonpadding + - IDLE_OR_CONN_TIMEOUT) { - log_info(LD_OR,"Expiring non-used OR connection to fd %d (%s:%d) " - "[idle %d].", (int)conn->s,conn->address, conn->port, - (int)(now - or_conn->timestamp_last_added_nonpadding)); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } else if ( - now >= or_conn->timestamp_lastempty + options->KeepalivePeriod*10 && - now >= conn->timestamp_lastwritten + options->KeepalivePeriod*10) { - log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL, - "Expiring stuck OR connection to fd %d (%s:%d). (%d bytes to " - "flush; %d seconds since last write)", - (int)conn->s, conn->address, conn->port, - (int)connection_get_outbuf_len(conn), - (int)(now-conn->timestamp_lastwritten)); - connection_or_close_normally(TO_OR_CONN(conn), 0); - } else if (past_keepalive && !connection_get_outbuf_len(conn)) { - /* send a padding cell */ - log_fn(LOG_DEBUG,LD_OR,"Sending keepalive to (%s:%d)", - conn->address, conn->port); - memset(&cell,0,sizeof(cell_t)); - cell.command = CELL_PADDING; - connection_or_write_cell_to_buf(&cell, or_conn); - } -} - -/** Honor a NEWNYM request: make future requests unlinkable to past - * requests. */ -static void -signewnym_impl(time_t now) -{ - const or_options_t *options = get_options(); - if (!proxy_mode(options)) { - log_info(LD_CONTROL, "Ignoring SIGNAL NEWNYM because client functionality " - "is disabled."); - return; - } - - circuit_mark_all_dirty_circs_as_unusable(); - addressmap_clear_transient(); - rend_client_purge_state(); - time_of_last_signewnym = now; - signewnym_is_pending = 0; - - ++newnym_epoch; - - control_event_signal(SIGNEWNYM); -} - -/** Return the number of times that signewnym has been called. */ -unsigned -get_signewnym_epoch(void) -{ - return newnym_epoch; -} - -/** Perform regular maintenance tasks. This function gets run once per - * second by second_elapsed_callback(). - */ -static void -run_scheduled_events(time_t now) -{ - static time_t last_rotated_x509_certificate = 0; - static time_t time_to_check_v3_certificate = 0; - static time_t time_to_check_listeners = 0; - static time_t time_to_check_descriptor = 0; - static time_t time_to_download_networkstatus = 0; - static time_t time_to_shrink_memory = 0; - static time_t time_to_try_getting_descriptors = 0; - static time_t time_to_reset_descriptor_failures = 0; - static time_t time_to_add_entropy = 0; - static time_t time_to_write_bridge_status_file = 0; - static time_t time_to_downrate_stability = 0; - static time_t time_to_save_stability = 0; - static time_t time_to_clean_caches = 0; - static time_t time_to_recheck_bandwidth = 0; - static time_t time_to_check_for_expired_networkstatus = 0; - static time_t time_to_write_stats_files = 0; - static time_t time_to_write_bridge_stats = 0; - static time_t time_to_check_port_forwarding = 0; - static time_t time_to_launch_reachability_tests = 0; - static int should_init_bridge_stats = 1; - static time_t time_to_retry_dns_init = 0; - static time_t time_to_next_heartbeat = 0; - const or_options_t *options = get_options(); - - int is_server = server_mode(options); - int i; - int have_dir_info; - - /** 0. See if we've been asked to shut down and our timeout has - * expired; or if our bandwidth limits are exhausted and we - * should hibernate; or if it's time to wake up from hibernation. - */ - consider_hibernation(now); - -#if 0 - { - static time_t nl_check_time = 0; - if (nl_check_time <= now) { - nodelist_assert_ok(); - nl_check_time = now + 30; - } - } -#endif - - /* 0b. If we've deferred a signewnym, make sure it gets handled - * eventually. */ - if (signewnym_is_pending && - time_of_last_signewnym + MAX_SIGNEWNYM_RATE <= now) { - log_info(LD_CONTROL, "Honoring delayed NEWNYM request"); - signewnym_impl(now); - } - - /* 0c. If we've deferred log messages for the controller, handle them now */ - flush_pending_log_callbacks(); - - /** 1a. Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion keys, - * shut down and restart all cpuworkers, and update the directory if - * necessary. - */ - if (is_server && - get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME < now) { - log_info(LD_GENERAL,"Rotating onion key."); - rotate_onion_key(); - cpuworkers_rotate(); - if (router_rebuild_descriptor(1)<0) { - log_info(LD_CONFIG, "Couldn't rebuild router descriptor"); - } - if (advertised_server_mode() && !options->DisableNetwork) - router_upload_dir_desc_to_dirservers(0); - } - - if (!options->DisableNetwork && time_to_try_getting_descriptors < now) { - update_all_descriptor_downloads(now); - update_extrainfo_downloads(now); - if (router_have_minimum_dir_info()) - time_to_try_getting_descriptors = now + LAZY_DESCRIPTOR_RETRY_INTERVAL; - else - time_to_try_getting_descriptors = now + GREEDY_DESCRIPTOR_RETRY_INTERVAL; - } - - if (time_to_reset_descriptor_failures < now) { - router_reset_descriptor_download_failures(); - time_to_reset_descriptor_failures = - now + DESCRIPTOR_FAILURE_RESET_INTERVAL; - } - - if (options->UseBridges) - fetch_bridge_descriptors(options, now); - - /** 1b. Every MAX_SSL_KEY_LIFETIME_INTERNAL seconds, we change our - * TLS context. */ - if (!last_rotated_x509_certificate) - last_rotated_x509_certificate = now; - if (last_rotated_x509_certificate+MAX_SSL_KEY_LIFETIME_INTERNAL < now) { - log_info(LD_GENERAL,"Rotating tls context."); - if (router_initialize_tls_context() < 0) { - log_warn(LD_BUG, "Error reinitializing TLS context"); - /* XXX is it a bug here, that we just keep going? -RD */ - } - last_rotated_x509_certificate = now; - /* We also make sure to rotate the TLS connections themselves if they've - * been up for too long -- but that's done via is_bad_for_new_circs in - * connection_run_housekeeping() above. */ - } - - if (time_to_add_entropy < now) { - if (time_to_add_entropy) { - /* We already seeded once, so don't die on failure. */ - crypto_seed_rng(0); - } -/** How often do we add more entropy to OpenSSL's RNG pool? */ -#define ENTROPY_INTERVAL (60*60) - time_to_add_entropy = now + ENTROPY_INTERVAL; - } - - /** 1c. If we have to change the accounting interval or record - * bandwidth used in this accounting interval, do so. */ - if (accounting_is_enabled(options)) - accounting_run_housekeeping(now); - - if (time_to_launch_reachability_tests < now && - (authdir_mode_tests_reachability(options)) && - !net_is_disabled()) { - time_to_launch_reachability_tests = now + REACHABILITY_TEST_INTERVAL; - /* try to determine reachability of the other Tor relays */ - dirserv_test_reachability(now); - } - - /** 1d. Periodically, we discount older stability information so that new - * stability info counts more, and save the stability information to disk as - * appropriate. */ - if (time_to_downrate_stability < now) - time_to_downrate_stability = rep_hist_downrate_old_runs(now); - if (authdir_mode_tests_reachability(options)) { - if (time_to_save_stability < now) { - if (time_to_save_stability && rep_hist_record_mtbf_data(now, 1)<0) { - log_warn(LD_GENERAL, "Couldn't store mtbf data."); - } -#define SAVE_STABILITY_INTERVAL (30*60) - time_to_save_stability = now + SAVE_STABILITY_INTERVAL; - } - } - - /* 1e. Periodically, if we're a v3 authority, we check whether our cert is - * close to expiring and warn the admin if it is. */ - if (time_to_check_v3_certificate < now) { - v3_authority_check_key_expiry(); -#define CHECK_V3_CERTIFICATE_INTERVAL (5*60) - time_to_check_v3_certificate = now + CHECK_V3_CERTIFICATE_INTERVAL; - } - - /* 1f. Check whether our networkstatus has expired. - */ - if (time_to_check_for_expired_networkstatus < now) { - networkstatus_t *ns = networkstatus_get_latest_consensus(); - /*XXXX RD: This value needs to be the same as REASONABLY_LIVE_TIME in - * networkstatus_get_reasonably_live_consensus(), but that value is way - * way too high. Arma: is the bridge issue there resolved yet? -NM */ -#define NS_EXPIRY_SLOP (24*60*60) - if (ns && ns->valid_until < now+NS_EXPIRY_SLOP && - router_have_minimum_dir_info()) { - router_dir_info_changed(); - } -#define CHECK_EXPIRED_NS_INTERVAL (2*60) - time_to_check_for_expired_networkstatus = now + CHECK_EXPIRED_NS_INTERVAL; - } - - /* 1g. Check whether we should write statistics to disk. - */ - if (time_to_write_stats_files < now) { -#define CHECK_WRITE_STATS_INTERVAL (60*60) - time_t next_time_to_write_stats_files = (time_to_write_stats_files > 0 ? - time_to_write_stats_files : now) + CHECK_WRITE_STATS_INTERVAL; - if (options->CellStatistics) { - time_t next_write = - rep_hist_buffer_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->DirReqStatistics) { - time_t next_write = geoip_dirreq_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->EntryStatistics) { - time_t next_write = geoip_entry_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->ExitPortStatistics) { - time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->ConnDirectionStatistics) { - time_t next_write = rep_hist_conn_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - if (options->BridgeAuthoritativeDir) { - time_t next_write = rep_hist_desc_stats_write(time_to_write_stats_files); - if (next_write && next_write < next_time_to_write_stats_files) - next_time_to_write_stats_files = next_write; - } - time_to_write_stats_files = next_time_to_write_stats_files; - } - - /* 1h. Check whether we should write bridge statistics to disk. - */ - if (should_record_bridge_info(options)) { - if (time_to_write_bridge_stats < now) { - if (should_init_bridge_stats) { - /* (Re-)initialize bridge statistics. */ - geoip_bridge_stats_init(now); - time_to_write_bridge_stats = now + WRITE_STATS_INTERVAL; - should_init_bridge_stats = 0; - } else { - /* Possibly write bridge statistics to disk and ask when to write - * them next time. */ - time_to_write_bridge_stats = geoip_bridge_stats_write( - time_to_write_bridge_stats); - } - } - } else if (!should_init_bridge_stats) { - /* Bridge mode was turned off. Ensure that stats are re-initialized - * next time bridge mode is turned on. */ - should_init_bridge_stats = 1; - } - - /* Remove old information from rephist and the rend cache. */ - if (time_to_clean_caches < now) { - rep_history_clean(now - options->RephistTrackTime); - rend_cache_clean(now); - rend_cache_clean_v2_descs_as_dir(now); - microdesc_cache_rebuild(NULL, 0); -#define CLEAN_CACHES_INTERVAL (30*60) - time_to_clean_caches = now + CLEAN_CACHES_INTERVAL; - } - -#define RETRY_DNS_INTERVAL (10*60) - /* If we're a server and initializing dns failed, retry periodically. */ - if (time_to_retry_dns_init < now) { - time_to_retry_dns_init = now + RETRY_DNS_INTERVAL; - if (is_server && has_dns_init_failed()) - dns_init(); - } - - /** 2. Periodically, we consider force-uploading our descriptor - * (if we've passed our internal checks). */ - -/** How often do we check whether part of our router info has changed in a - * way that would require an upload? That includes checking whether our IP - * address has changed. */ -#define CHECK_DESCRIPTOR_INTERVAL (60) - - /* 2b. Once per minute, regenerate and upload the descriptor if the old - * one is inaccurate. */ - if (time_to_check_descriptor < now && !options->DisableNetwork) { - static int dirport_reachability_count = 0; - time_to_check_descriptor = now + CHECK_DESCRIPTOR_INTERVAL; - check_descriptor_bandwidth_changed(now); - check_descriptor_ipaddress_changed(now); - mark_my_descriptor_dirty_if_too_old(now); - consider_publishable_server(0); - /* also, check religiously for reachability, if it's within the first - * 20 minutes of our uptime. */ - if (is_server && - (can_complete_circuit || !any_predicted_circuits(now)) && - !we_are_hibernating()) { - if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { - consider_testing_reachability(1, dirport_reachability_count==0); - if (++dirport_reachability_count > 5) - dirport_reachability_count = 0; - } else if (time_to_recheck_bandwidth < now) { - /* If we haven't checked for 12 hours and our bandwidth estimate is - * low, do another bandwidth test. This is especially important for - * bridges, since they might go long periods without much use. */ - const routerinfo_t *me = router_get_my_routerinfo(); - if (time_to_recheck_bandwidth && me && - me->bandwidthcapacity < me->bandwidthrate && - me->bandwidthcapacity < 51200) { - reset_bandwidth_test(); - } -#define BANDWIDTH_RECHECK_INTERVAL (12*60*60) - time_to_recheck_bandwidth = now + BANDWIDTH_RECHECK_INTERVAL; - } - } - - /* If any networkstatus documents are no longer recent, we need to - * update all the descriptors' running status. */ - /* Remove dead routers. */ - routerlist_remove_old_routers(); - } - - /* 2c. Every minute (or every second if TestingTorNetwork), check - * whether we want to download any networkstatus documents. */ - -/* How often do we check whether we should download network status - * documents? */ -#define networkstatus_dl_check_interval(o) ((o)->TestingTorNetwork ? 1 : 60) - - if (time_to_download_networkstatus < now && !options->DisableNetwork) { - time_to_download_networkstatus = - now + networkstatus_dl_check_interval(options); - update_networkstatus_downloads(now); - } - - /** 2c. Let directory voting happen. */ - if (authdir_mode_v3(options)) - dirvote_act(options, now); - - /** 3a. Every second, we examine pending circuits and prune the - * ones which have been pending for more than a few seconds. - * We do this before step 4, so it can try building more if - * it's not comfortable with the number of available circuits. - */ - /* (If our circuit build timeout can ever become lower than a second (which - * it can't, currently), we should do this more often.) */ - circuit_expire_building(); - - /** 3b. Also look at pending streams and prune the ones that 'began' - * a long time ago but haven't gotten a 'connected' yet. - * Do this before step 4, so we can put them back into pending - * state to be picked up by the new circuit. - */ - connection_ap_expire_beginning(); - - /** 3c. And expire connections that we've held open for too long. - */ - connection_expire_held_open(); - - /** 3d. And every 60 seconds, we relaunch listeners if any died. */ - if (!net_is_disabled() && time_to_check_listeners < now) { - retry_all_listeners(NULL, NULL, 0); - time_to_check_listeners = now+60; - } - - /** 4. Every second, we try a new circuit if there are no valid - * circuits. Every NewCircuitPeriod seconds, we expire circuits - * that became dirty more than MaxCircuitDirtiness seconds ago, - * and we make a new circ if there are no clean circuits. - */ - have_dir_info = router_have_minimum_dir_info(); - if (have_dir_info && !net_is_disabled()) - circuit_build_needed_circs(now); - - /* every 10 seconds, but not at the same second as other such events */ - if (now % 10 == 5) - circuit_expire_old_circuits_serverside(now); - - /** 5. We do housekeeping for each connection... */ - connection_or_set_bad_connections(NULL, 0); - for (i=0;ioutbuf) - buf_shrink(conn->outbuf); - if (conn->inbuf) - buf_shrink(conn->inbuf); - }); - clean_cell_pool(); - buf_shrink_freelists(0); -/** How often do we check buffers and pools for empty space that can be - * deallocated? */ -#define MEM_SHRINK_INTERVAL (60) - time_to_shrink_memory = now + MEM_SHRINK_INTERVAL; - } - - /** 6. And remove any marked circuits... */ - circuit_close_all_marked(); - - /** 7. And upload service descriptors if necessary. */ - if (can_complete_circuit && !net_is_disabled()) { - rend_consider_services_upload(now); - rend_consider_descriptor_republication(); - } - - /** 8. and blow away any connections that need to die. have to do this now, - * because if we marked a conn for close and left its socket -1, then - * we'll pass it to poll/select and bad things will happen. - */ - close_closeable_connections(); - - /** 8b. And if anything in our state is ready to get flushed to disk, we - * flush it. */ - or_state_save(now); - - /** 8c. Do channel cleanup just like for connections */ - channel_run_cleanup(); - channel_listener_run_cleanup(); - - /** 9. and if we're a server, check whether our DNS is telling stories to - * us. */ - if (!net_is_disabled() && - public_server_mode(options) && time_to_check_for_correct_dns < now) { - if (!time_to_check_for_correct_dns) { - time_to_check_for_correct_dns = now + 60 + crypto_rand_int(120); - } else { - dns_launch_correctness_checks(); - time_to_check_for_correct_dns = now + 12*3600 + - crypto_rand_int(12*3600); - } - } - - /** 10. write bridge networkstatus file to disk */ - if (options->BridgeAuthoritativeDir && - time_to_write_bridge_status_file < now) { - networkstatus_dump_bridge_status_to_file(now); -#define BRIDGE_STATUSFILE_INTERVAL (30*60) - time_to_write_bridge_status_file = now+BRIDGE_STATUSFILE_INTERVAL; - } - - /** 11. check the port forwarding app */ - if (!net_is_disabled() && - time_to_check_port_forwarding < now && - options->PortForwarding && - is_server) { -#define PORT_FORWARDING_CHECK_INTERVAL 5 - smartlist_t *ports_to_forward = get_list_of_ports_to_forward(); - if (ports_to_forward) { - tor_check_port_forwarding(options->PortForwardingHelper, - ports_to_forward, - now); - - SMARTLIST_FOREACH(ports_to_forward, char *, cp, tor_free(cp)); - smartlist_free(ports_to_forward); - } - time_to_check_port_forwarding = now+PORT_FORWARDING_CHECK_INTERVAL; - } - - /** 11b. check pending unconfigured managed proxies */ - if (!net_is_disabled() && pt_proxies_configuration_pending()) - pt_configure_remaining_proxies(); - - /** 12. write the heartbeat message */ - if (options->HeartbeatPeriod && - time_to_next_heartbeat <= now) { - if (time_to_next_heartbeat) /* don't log the first heartbeat */ - log_heartbeat(now); - time_to_next_heartbeat = now+options->HeartbeatPeriod; - } -} - -/** Timer: used to invoke second_elapsed_callback() once per second. */ -static periodic_timer_t *second_timer = NULL; -/** Number of libevent errors in the last second: we die if we get too many. */ -static int n_libevent_errors = 0; - -/** Libevent callback: invoked once every second. */ -static void -second_elapsed_callback(periodic_timer_t *timer, void *arg) -{ - /* XXXX This could be sensibly refactored into multiple callbacks, and we - * could use Libevent's timers for this rather than checking the current - * time against a bunch of timeouts every second. */ - static time_t current_second = 0; - time_t now; - size_t bytes_written; - size_t bytes_read; - int seconds_elapsed; - const or_options_t *options = get_options(); - (void)timer; - (void)arg; - - n_libevent_errors = 0; - - /* log_notice(LD_GENERAL, "Tick."); */ - now = time(NULL); - update_approx_time(now); - - /* the second has rolled over. check more stuff. */ - seconds_elapsed = current_second ? (int)(now - current_second) : 0; -#ifdef USE_BUFFEREVENTS - { - uint64_t cur_read,cur_written; - connection_get_rate_limit_totals(&cur_read, &cur_written); - bytes_written = (size_t)(cur_written - stats_prev_n_written); - bytes_read = (size_t)(cur_read - stats_prev_n_read); - stats_n_bytes_read += bytes_read; - stats_n_bytes_written += bytes_written; - if (accounting_is_enabled(options) && seconds_elapsed >= 0) - accounting_add_bytes(bytes_read, bytes_written, seconds_elapsed); - stats_prev_n_written = cur_written; - stats_prev_n_read = cur_read; - } -#else - bytes_read = (size_t)(stats_n_bytes_read - stats_prev_n_read); - bytes_written = (size_t)(stats_n_bytes_written - stats_prev_n_written); - stats_prev_n_read = stats_n_bytes_read; - stats_prev_n_written = stats_n_bytes_written; -#endif - - control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written); - control_event_stream_bandwidth_used(); - control_event_conn_bandwidth_used(); - control_event_circ_bandwidth_used(); - control_event_circuit_cell_stats(); - - if (server_mode(options) && - !net_is_disabled() && - seconds_elapsed > 0 && - can_complete_circuit && - stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT != - (stats_n_seconds_working+seconds_elapsed) / - TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { - /* every 20 minutes, check and complain if necessary */ - const routerinfo_t *me = router_get_my_routerinfo(); - if (me && !check_whether_orport_reachable()) { - log_warn(LD_CONFIG,"Your server (%s:%d) has not managed to confirm that " - "its ORPort is reachable. Please check your firewalls, ports, " - "address, /etc/hosts file, etc.", - me->address, me->or_port); - control_event_server_status(LOG_WARN, - "REACHABILITY_FAILED ORADDRESS=%s:%d", - me->address, me->or_port); - } - - if (me && !check_whether_dirport_reachable()) { - log_warn(LD_CONFIG, - "Your server (%s:%d) has not managed to confirm that its " - "DirPort is reachable. Please check your firewalls, ports, " - "address, /etc/hosts file, etc.", - me->address, me->dir_port); - control_event_server_status(LOG_WARN, - "REACHABILITY_FAILED DIRADDRESS=%s:%d", - me->address, me->dir_port); - } - } - -/** If more than this many seconds have elapsed, probably the clock - * jumped: doesn't count. */ -#define NUM_JUMPED_SECONDS_BEFORE_WARN 100 - if (seconds_elapsed < -NUM_JUMPED_SECONDS_BEFORE_WARN || - seconds_elapsed >= NUM_JUMPED_SECONDS_BEFORE_WARN) { - circuit_note_clock_jumped(seconds_elapsed); - /* XXX if the time jumps *back* many months, do our events in - * run_scheduled_events() recover? I don't think they do. -RD */ - } else if (seconds_elapsed > 0) - stats_n_seconds_working += seconds_elapsed; - - run_scheduled_events(now); - - current_second = now; /* remember which second it is, for next time */ -} - -#ifndef USE_BUFFEREVENTS -/** Timer: used to invoke refill_callback(). */ -static periodic_timer_t *refill_timer = NULL; - -/** Libevent callback: invoked periodically to refill token buckets - * and count r/w bytes. It is only used when bufferevents are disabled. */ -static void -refill_callback(periodic_timer_t *timer, void *arg) -{ - static struct timeval current_millisecond; - struct timeval now; - - size_t bytes_written; - size_t bytes_read; - int milliseconds_elapsed = 0; - int seconds_rolled_over = 0; - - const or_options_t *options = get_options(); - - (void)timer; - (void)arg; - - tor_gettimeofday(&now); - - /* If this is our first time, no time has passed. */ - if (current_millisecond.tv_sec) { - long mdiff = tv_mdiff(¤t_millisecond, &now); - if (mdiff > INT_MAX) - mdiff = INT_MAX; - milliseconds_elapsed = (int)mdiff; - seconds_rolled_over = (int)(now.tv_sec - current_millisecond.tv_sec); - } - - bytes_written = stats_prev_global_write_bucket - global_write_bucket; - bytes_read = stats_prev_global_read_bucket - global_read_bucket; - - stats_n_bytes_read += bytes_read; - stats_n_bytes_written += bytes_written; - if (accounting_is_enabled(options) && milliseconds_elapsed >= 0) - accounting_add_bytes(bytes_read, bytes_written, seconds_rolled_over); - - if (milliseconds_elapsed > 0) - connection_bucket_refill(milliseconds_elapsed, now.tv_sec); - - stats_prev_global_read_bucket = global_read_bucket; - stats_prev_global_write_bucket = global_write_bucket; - - current_millisecond = now; /* remember what time it is, for next time */ -} -#endif - -#ifndef _WIN32 -/** Called when a possibly ignorable libevent error occurs; ensures that we - * don't get into an infinite loop by ignoring too many errors from - * libevent. */ -static int -got_libevent_error(void) -{ - if (++n_libevent_errors > 8) { - log_err(LD_NET, "Too many libevent errors in one second; dying"); - return -1; - } - return 0; -} -#endif - -#define UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST (6*60*60) - -/** Called when our IP address seems to have changed. at_interface - * should be true if we detected a change in our interface, and false if we - * detected a change in our published address. */ -void -ip_address_changed(int at_interface) -{ - int server = server_mode(get_options()); - - if (at_interface) { - if (! server) { - /* Okay, change our keys. */ - if (init_keys()<0) - log_warn(LD_GENERAL, "Unable to rotate keys after IP change!"); - } - } else { - if (server) { - if (stats_n_seconds_working > UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST) - reset_bandwidth_test(); - stats_n_seconds_working = 0; - router_reset_reachability(); - mark_my_descriptor_dirty("IP address changed"); - } - } - - dns_servers_relaunch_checks(); -} - -/** Forget what we've learned about the correctness of our DNS servers, and - * start learning again. */ -void -dns_servers_relaunch_checks(void) -{ - if (server_mode(get_options())) { - dns_reset_correctness_checks(); - time_to_check_for_correct_dns = 0; - } -} - -/** Called when we get a SIGHUP: reload configuration files and keys, - * retry all connections, and so on. */ -static int -do_hup(void) -{ - const or_options_t *options = get_options(); - -#ifdef USE_DMALLOC - dmalloc_log_stats(); - dmalloc_log_changed(0, 1, 0, 0); -#endif - - log_notice(LD_GENERAL,"Received reload signal (hup). Reloading config and " - "resetting internal state."); - if (accounting_is_enabled(options)) - accounting_record_bandwidth_usage(time(NULL), get_or_state()); - - router_reset_warnings(); - routerlist_reset_warnings(); - /* first, reload config variables, in case they've changed */ - if (options->ReloadTorrcOnSIGHUP) { - /* no need to provide argc/v, they've been cached in init_from_config */ - if (options_init_from_torrc(0, NULL) < 0) { - log_err(LD_CONFIG,"Reading config failed--see warnings above. " - "For usage, try -h."); - return -1; - } - options = get_options(); /* they have changed now */ - } else { - char *msg = NULL; - log_notice(LD_GENERAL, "Not reloading config file: the controller told " - "us not to."); - /* Make stuff get rescanned, reloaded, etc. */ - if (set_options((or_options_t*)options, &msg) < 0) { - if (!msg) - msg = tor_strdup("Unknown error"); - log_warn(LD_GENERAL, "Unable to re-set previous options: %s", msg); - tor_free(msg); - } - } - if (authdir_mode_handles_descs(options, -1)) { - /* reload the approved-routers file */ - if (dirserv_load_fingerprint_file() < 0) { - /* warnings are logged from dirserv_load_fingerprint_file() directly */ - log_info(LD_GENERAL, "Error reloading fingerprints. " - "Continuing with old list."); - } - } - - /* Rotate away from the old dirty circuits. This has to be done - * after we've read the new options, but before we start using - * circuits for directory fetches. */ - circuit_mark_all_dirty_circs_as_unusable(); - - /* retry appropriate downloads */ - router_reset_status_download_failures(); - router_reset_descriptor_download_failures(); - if (!options->DisableNetwork) - update_networkstatus_downloads(time(NULL)); - - /* We'll retry routerstatus downloads in about 10 seconds; no need to - * force a retry there. */ - - if (server_mode(options)) { - /* Restart cpuworker and dnsworker processes, so they get up-to-date - * configuration options. */ - cpuworkers_rotate(); - dns_reset(); - } - return 0; -} - -/** Tor main loop. */ -int -do_main_loop(void) -{ - int loop_result; - time_t now; - - /* initialize dns resolve map, spawn workers if needed */ - if (dns_init() < 0) { - if (get_options()->ServerDNSAllowBrokenConfig) - log_warn(LD_GENERAL, "Couldn't set up any working nameservers. " - "Network not up yet? Will try again soon."); - else { - log_err(LD_GENERAL,"Error initializing dns subsystem; exiting. To " - "retry instead, set the ServerDNSAllowBrokenResolvConf option."); - } - } - -#ifdef USE_BUFFEREVENTS - log_warn(LD_GENERAL, "Tor was compiled with the --enable-bufferevents " - "option. This is still experimental, and might cause strange " - "bugs. If you want a more stable Tor, be sure to build without " - "--enable-bufferevents."); -#endif - - handle_signals(1); - - /* load the private keys, if we're supposed to have them, and set up the - * TLS context. */ - if (! client_identity_key_is_set()) { - if (init_keys() < 0) { - log_err(LD_BUG,"Error initializing keys; exiting"); - return -1; - } - } - - /* Set up the packed_cell_t memory pool. */ - init_cell_pool(); - - /* Set up our buckets */ - connection_bucket_init(); -#ifndef USE_BUFFEREVENTS - stats_prev_global_read_bucket = global_read_bucket; - stats_prev_global_write_bucket = global_write_bucket; -#endif - - /* initialize the bootstrap status events to know we're starting up */ - control_event_bootstrap(BOOTSTRAP_STATUS_STARTING, 0); - - if (trusted_dirs_reload_certs()) { - log_warn(LD_DIR, - "Couldn't load all cached v3 certificates. Starting anyway."); - } - if (router_reload_consensus_networkstatus()) { - return -1; - } - /* load the routers file, or assign the defaults. */ - if (router_reload_router_list()) { - return -1; - } - /* load the networkstatuses. (This launches a download for new routers as - * appropriate.) - */ - now = time(NULL); - directory_info_has_arrived(now, 1); - - if (server_mode(get_options())) { - /* launch cpuworkers. Need to do this *after* we've read the onion key. */ - cpu_init(); - } - - /* set up once-a-second callback. */ - if (! second_timer) { - struct timeval one_second; - one_second.tv_sec = 1; - one_second.tv_usec = 0; - - second_timer = periodic_timer_new(tor_libevent_get_base(), - &one_second, - second_elapsed_callback, - NULL); - tor_assert(second_timer); - } - -#ifndef USE_BUFFEREVENTS - if (!refill_timer) { - struct timeval refill_interval; - int msecs = get_options()->TokenBucketRefillInterval; - - refill_interval.tv_sec = msecs/1000; - refill_interval.tv_usec = (msecs%1000)*1000; - - refill_timer = periodic_timer_new(tor_libevent_get_base(), - &refill_interval, - refill_callback, - NULL); - tor_assert(refill_timer); - } -#endif - - for (;;) { - if (nt_service_is_stopping()) - return 0; - - if (check_interrupted()) - return 0; - -#ifndef _WIN32 - /* Make it easier to tell whether libevent failure is our fault or not. */ - errno = 0; -#endif - /* All active linked conns should get their read events activated. */ - SMARTLIST_FOREACH(active_linked_connection_lst, connection_t *, conn, - event_active(conn->read_event, EV_READ, 1)); - called_loop_once = smartlist_len(active_linked_connection_lst) ? 1 : 0; - - update_approx_time(time(NULL)); - - /* poll until we have an event, or the second ends, or until we have - * some active linked connections to trigger events for. */ - loop_result = event_base_loop(tor_libevent_get_base(), - called_loop_once ? EVLOOP_ONCE : 0); - - /* let catch() handle things like ^c, and otherwise don't worry about it */ - if (loop_result < 0) { - int e = tor_socket_errno(-1); - /* let the program survive things like ^z */ - if (e != EINTR && !ERRNO_IS_EINPROGRESS(e)) { - log_err(LD_NET,"libevent call with %s failed: %s [%d]", - tor_libevent_get_method(), tor_socket_strerror(e), e); - return -1; -#ifndef _WIN32 - } else if (e == EINVAL) { - log_warn(LD_NET, "EINVAL from libevent: should you upgrade libevent?"); - if (got_libevent_error()) - return -1; -#endif - } else { - if (ERRNO_IS_EINPROGRESS(e)) - log_warn(LD_BUG, - "libevent call returned EINPROGRESS? Please report."); - log_debug(LD_NET,"libevent call interrupted."); - /* You can't trust the results of this poll(). Go back to the - * top of the big for loop. */ - continue; - } - } - } -} - -#ifndef _WIN32 /* Only called when we're willing to use signals */ -/** Libevent callback: invoked when we get a signal. - */ -static void -signal_callback(int fd, short events, void *arg) -{ - uintptr_t sig = (uintptr_t)arg; - (void)fd; - (void)events; - - process_signal(sig); -} -#endif - -/** Do the work of acting on a signal received in sig */ -void -process_signal(uintptr_t sig) -{ - switch (sig) - { - case SIGTERM: - log_notice(LD_GENERAL,"Catching signal TERM, exiting cleanly."); - tor_cleanup(); - exit(0); - break; - case SIGINT: - if (!server_mode(get_options())) { /* do it now */ - log_notice(LD_GENERAL,"Interrupt: exiting cleanly."); - tor_cleanup(); - exit(0); - } - hibernate_begin_shutdown(); - break; -#ifdef SIGPIPE - case SIGPIPE: - log_debug(LD_GENERAL,"Caught SIGPIPE. Ignoring."); - break; -#endif - case SIGUSR1: - /* prefer to log it at INFO, but make sure we always see it */ - dumpstats(get_min_log_level() 0) ; /* keep reaping until no more - zombies */ - break; -#endif - case SIGNEWNYM: { - time_t now = time(NULL); - if (time_of_last_signewnym + MAX_SIGNEWNYM_RATE > now) { - signewnym_is_pending = 1; - log_notice(LD_CONTROL, - "Rate limiting NEWNYM request: delaying by %d second(s)", - (int)(MAX_SIGNEWNYM_RATE+time_of_last_signewnym-now)); - } else { - signewnym_impl(now); - } - break; - } - case SIGCLEARDNSCACHE: - addressmap_clear_transient(); - control_event_signal(sig); - break; - } -} - -/** Returns Tor's uptime. */ -long -get_uptime(void) -{ - return stats_n_seconds_working; -} - -extern uint64_t rephist_total_alloc; -extern uint32_t rephist_total_num; - -/** - * Write current memory usage information to the log. - */ -static void -dumpmemusage(int severity) -{ - connection_dump_buffer_mem_stats(severity); - tor_log(severity, LD_GENERAL, "In rephist: "U64_FORMAT" used by %d Tors.", - U64_PRINTF_ARG(rephist_total_alloc), rephist_total_num); - dump_routerlist_mem_usage(severity); - dump_cell_pool_usage(severity); - dump_dns_mem_usage(severity); - buf_dump_freelist_sizes(severity); - tor_log_mallinfo(severity); -} - -/** Write all statistics to the log, with log level severity. Called - * in response to a SIGUSR1. */ -static void -dumpstats(int severity) -{ - time_t now = time(NULL); - time_t elapsed; - size_t rbuf_cap, wbuf_cap, rbuf_len, wbuf_len; - - tor_log(severity, LD_GENERAL, "Dumping stats:"); - - SMARTLIST_FOREACH_BEGIN(connection_array, connection_t *, conn) { - int i = conn_sl_idx; - tor_log(severity, LD_GENERAL, - "Conn %d (socket %d) type %d (%s), state %d (%s), created %d secs ago", - i, (int)conn->s, conn->type, conn_type_to_string(conn->type), - conn->state, conn_state_to_string(conn->type, conn->state), - (int)(now - conn->timestamp_created)); - if (!connection_is_listener(conn)) { - tor_log(severity,LD_GENERAL, - "Conn %d is to %s:%d.", i, - safe_str_client(conn->address), - conn->port); - tor_log(severity,LD_GENERAL, - "Conn %d: %d bytes waiting on inbuf (len %d, last read %d secs ago)", - i, - (int)connection_get_inbuf_len(conn), - (int)buf_allocation(conn->inbuf), - (int)(now - conn->timestamp_lastread)); - tor_log(severity,LD_GENERAL, - "Conn %d: %d bytes waiting on outbuf " - "(len %d, last written %d secs ago)",i, - (int)connection_get_outbuf_len(conn), - (int)buf_allocation(conn->outbuf), - (int)(now - conn->timestamp_lastwritten)); - if (conn->type == CONN_TYPE_OR) { - or_connection_t *or_conn = TO_OR_CONN(conn); - if (or_conn->tls) { - tor_tls_get_buffer_sizes(or_conn->tls, &rbuf_cap, &rbuf_len, - &wbuf_cap, &wbuf_len); - tor_log(severity, LD_GENERAL, - "Conn %d: %d/%d bytes used on OpenSSL read buffer; " - "%d/%d bytes used on write buffer.", - i, (int)rbuf_len, (int)rbuf_cap, (int)wbuf_len, (int)wbuf_cap); - } - } - } - circuit_dump_by_conn(conn, severity); /* dump info about all the circuits - * using this conn */ - } SMARTLIST_FOREACH_END(conn); - - channel_dumpstats(severity); - channel_listener_dumpstats(severity); - - tor_log(severity, LD_NET, - "Cells processed: "U64_FORMAT" padding\n" - " "U64_FORMAT" create\n" - " "U64_FORMAT" created\n" - " "U64_FORMAT" relay\n" - " ("U64_FORMAT" relayed)\n" - " ("U64_FORMAT" delivered)\n" - " "U64_FORMAT" destroy", - U64_PRINTF_ARG(stats_n_padding_cells_processed), - U64_PRINTF_ARG(stats_n_create_cells_processed), - U64_PRINTF_ARG(stats_n_created_cells_processed), - U64_PRINTF_ARG(stats_n_relay_cells_processed), - U64_PRINTF_ARG(stats_n_relay_cells_relayed), - U64_PRINTF_ARG(stats_n_relay_cells_delivered), - U64_PRINTF_ARG(stats_n_destroy_cells_processed)); - if (stats_n_data_cells_packaged) - tor_log(severity,LD_NET,"Average packaged cell fullness: %2.3f%%", - 100*(U64_TO_DBL(stats_n_data_bytes_packaged) / - U64_TO_DBL(stats_n_data_cells_packaged*RELAY_PAYLOAD_SIZE)) ); - if (stats_n_data_cells_received) - tor_log(severity,LD_NET,"Average delivered cell fullness: %2.3f%%", - 100*(U64_TO_DBL(stats_n_data_bytes_received) / - U64_TO_DBL(stats_n_data_cells_received*RELAY_PAYLOAD_SIZE)) ); - - cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_TAP, "TAP"); - cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_NTOR,"ntor"); - - if (now - time_of_process_start >= 0) - elapsed = now - time_of_process_start; - else - elapsed = 0; - - if (elapsed) { - tor_log(severity, LD_NET, - "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec reading", - U64_PRINTF_ARG(stats_n_bytes_read), - (int)elapsed, - (int) (stats_n_bytes_read/elapsed)); - tor_log(severity, LD_NET, - "Average bandwidth: "U64_FORMAT"/%d = %d bytes/sec writing", - U64_PRINTF_ARG(stats_n_bytes_written), - (int)elapsed, - (int) (stats_n_bytes_written/elapsed)); - } - - tor_log(severity, LD_NET, "--------------- Dumping memory information:"); - dumpmemusage(severity); - - rep_hist_dump_stats(now,severity); - rend_service_dump_stats(severity); - dump_pk_ops(severity); - dump_distinct_digest_count(severity); -} - -/** Called by exit() as we shut down the process. - */ -static void -exit_function(void) -{ - /* NOTE: If we ever daemonize, this gets called immediately. That's - * okay for now, because we only use this on Windows. */ -#ifdef _WIN32 - WSACleanup(); -#endif -} - -/** Set up the signal handlers for either parent or child. */ -void -handle_signals(int is_parent) -{ -#ifndef _WIN32 /* do signal stuff only on Unix */ - int i; - static const int signals[] = { - SIGINT, /* do a controlled slow shutdown */ - SIGTERM, /* to terminate now */ - SIGPIPE, /* otherwise SIGPIPE kills us */ - SIGUSR1, /* dump stats */ - SIGUSR2, /* go to loglevel debug */ - SIGHUP, /* to reload config, retry conns, etc */ -#ifdef SIGXFSZ - SIGXFSZ, /* handle file-too-big resource exhaustion */ -#endif - SIGCHLD, /* handle dns/cpu workers that exit */ - -1 }; - static struct event *signal_events[16]; /* bigger than it has to be. */ - if (is_parent) { - for (i = 0; signals[i] >= 0; ++i) { - signal_events[i] = tor_evsignal_new( - tor_libevent_get_base(), signals[i], signal_callback, - (void*)(uintptr_t)signals[i]); - if (event_add(signal_events[i], NULL)) - log_warn(LD_BUG, "Error from libevent when adding event for signal %d", - signals[i]); - } - } else { - struct sigaction action; - action.sa_flags = 0; - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGINT, &action, NULL); - sigaction(SIGTERM, &action, NULL); - sigaction(SIGPIPE, &action, NULL); - sigaction(SIGUSR1, &action, NULL); - sigaction(SIGUSR2, &action, NULL); - sigaction(SIGHUP, &action, NULL); -#ifdef SIGXFSZ - sigaction(SIGXFSZ, &action, NULL); -#endif - } -#else /* MS windows */ - (void)is_parent; -#endif /* signal stuff */ -} - -/** Main entry point for the Tor command-line client. - */ -int -tor_init(int argc, char *argv[]) -{ - char progname[256]; - int quiet = 0; - - time_of_process_start = time(NULL); - init_connection_lists(); - /* Have the log set up with our application name. */ - tor_snprintf(progname, sizeof(progname), "Tor %s", get_version()); - log_set_application_name(progname); - /* Initialize the history structures. */ - rep_hist_init(); - /* Initialize the service cache. */ - rend_cache_init(); - addressmap_init(); /* Init the client dns cache. Do it always, since it's - * cheap. */ - - { - /* We search for the "quiet" option first, since it decides whether we - * will log anything at all to the command line. */ - config_line_t *opts = NULL, *cmdline_opts = NULL; - const config_line_t *cl; - (void) config_parse_commandline(argc, argv, 1, &opts, &cmdline_opts); - for (cl = cmdline_opts; cl; cl = cl->next) { - if (!strcmp(cl->key, "--hush")) - quiet = 1; - if (!strcmp(cl->key, "--quiet") || - !strcmp(cl->key, "--dump-config")) - quiet = 2; - /* --version, --digests, and --help imply --hush */ - if (!strcmp(cl->key, "--version") || !strcmp(cl->key, "--digests") || - !strcmp(cl->key, "--list-torrc-options") || - !strcmp(cl->key, "--library-versions") || - !strcmp(cl->key, "-h") || !strcmp(cl->key, "--help")) { - if (quiet < 1) - quiet = 1; - } - } - config_free_lines(opts); - config_free_lines(cmdline_opts); - } - - /* give it somewhere to log to initially */ - switch (quiet) { - case 2: - /* no initial logging */ - break; - case 1: - add_temp_log(LOG_WARN); - break; - default: - add_temp_log(LOG_NOTICE); - } - quiet_level = quiet; - - { - const char *version = get_version(); - const char *bev_str = -#ifdef USE_BUFFEREVENTS - "(with bufferevents) "; -#else - ""; -#endif - log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s, " - "OpenSSL %s and Zlib %s.", version, bev_str, - get_uname(), - tor_libevent_get_version_str(), - crypto_openssl_get_version_str(), - tor_zlib_get_version_str()); - - log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " - "Learn how to be safe at " - "https://www.torproject.org/download/download#warning"); - - if (strstr(version, "alpha") || strstr(version, "beta")) - log_notice(LD_GENERAL, "This version is not a stable Tor release. " - "Expect more bugs than usual."); - } - -#ifdef NON_ANONYMOUS_MODE_ENABLED - log_warn(LD_GENERAL, "This copy of Tor was compiled to run in a " - "non-anonymous mode. It will provide NO ANONYMITY."); -#endif - - if (network_init()<0) { - log_err(LD_BUG,"Error initializing network; exiting."); - return -1; - } - atexit(exit_function); - - if (options_init_from_torrc(argc,argv) < 0) { - log_err(LD_CONFIG,"Reading config failed--see warnings above."); - return -1; - } - -#ifndef _WIN32 - if (geteuid()==0) - log_warn(LD_GENERAL,"You are running Tor as root. You don't need to, " - "and you probably shouldn't."); -#endif - - if (crypto_global_init(get_options()->HardwareAccel, - get_options()->AccelName, - get_options()->AccelDir)) { - log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting."); - return -1; - } - stream_choice_seed_weak_rng(); - - return 0; -} - -/** A lockfile structure, used to prevent two Tors from messing with the - * data directory at once. If this variable is non-NULL, we're holding - * the lockfile. */ -static tor_lockfile_t *lockfile = NULL; - -/** Try to grab the lock file described in options, if we do not - * already have it. If err_if_locked is true, warn if somebody else is - * holding the lock, and exit if we can't get it after waiting. Otherwise, - * return -1 if we can't get the lockfile. Return 0 on success. - */ -int -try_locking(const or_options_t *options, int err_if_locked) -{ - if (lockfile) - return 0; - else { - char *fname = options_get_datadir_fname2_suffix(options, "lock",NULL,NULL); - int already_locked = 0; - tor_lockfile_t *lf = tor_lockfile_lock(fname, 0, &already_locked); - tor_free(fname); - if (!lf) { - if (err_if_locked && already_locked) { - int r; - log_warn(LD_GENERAL, "It looks like another Tor process is running " - "with the same data directory. Waiting 5 seconds to see " - "if it goes away."); -#ifndef _WIN32 - sleep(5); -#else - Sleep(5000); -#endif - r = try_locking(options, 0); - if (r<0) { - log_err(LD_GENERAL, "No, it's still there. Exiting."); - exit(0); - } - return r; - } - return -1; - } - lockfile = lf; - return 0; - } -} - -/** Return true iff we've successfully acquired the lock file. */ -int -have_lockfile(void) -{ - return lockfile != NULL; -} - -/** If we have successfully acquired the lock file, release it. */ -void -release_lockfile(void) -{ - if (lockfile) { - tor_lockfile_unlock(lockfile); - lockfile = NULL; - } -} - -/** Free all memory that we might have allocated somewhere. - * If postfork, we are a worker process and we want to free - * only the parts of memory that we won't touch. If !postfork, - * Tor is shutting down and we should free everything. - * - * Helps us find the real leaks with dmalloc and the like. Also valgrind - * should then report 0 reachable in its leak report (in an ideal world -- - * in practice libevent, SSL, libc etc never quite free everything). */ -void -tor_free_all(int postfork) -{ - if (!postfork) { - evdns_shutdown(1); - } - geoip_free_all(); - dirvote_free_all(); - routerlist_free_all(); - networkstatus_free_all(); - addressmap_free_all(); - dirserv_free_all(); - rend_service_free_all(); - rend_cache_free_all(); - rend_service_authorization_free_all(); - rep_hist_free_all(); - dns_free_all(); - clear_pending_onions(); - circuit_free_all(); - entry_guards_free_all(); - pt_free_all(); - channel_tls_free_all(); - channel_free_all(); - connection_free_all(); - buf_shrink_freelists(1); - memarea_clear_freelist(); - nodelist_free_all(); - microdesc_free_all(); - ext_orport_free_all(); - control_free_all(); - if (!postfork) { - config_free_all(); - or_state_free_all(); - router_free_all(); - policies_free_all(); - } - free_cell_pool(); - if (!postfork) { - tor_tls_free_all(); - } - /* stuff in onion_main.c */ - - smartlist_free(connection_array); - smartlist_free(closeable_connection_lst); - smartlist_free(active_linked_connection_lst); - periodic_timer_free(second_timer); -#ifndef USE_BUFFEREVENTS - periodic_timer_free(refill_timer); -#endif - - if (!postfork) { - release_lockfile(); - } - /* Stuff in util.c and address.c*/ - if (!postfork) { - escaped(NULL); - esc_router_info(NULL); - logs_free_all(); /* free log strings. do this last so logs keep working. */ - } -} - -/** Do whatever cleanup is necessary before shutting Tor down. */ -void -tor_cleanup(void) -{ - const or_options_t *options = get_options(); - if (options->command == CMD_RUN_TOR) { - time_t now = time(NULL); - /* Remove our pid file. We don't care if there was an error when we - * unlink, nothing we could do about it anyways. */ - if (options->PidFile) - unlink(options->PidFile); - if (options->ControlPortWriteToFile) - unlink(options->ControlPortWriteToFile); - if (accounting_is_enabled(options)) - accounting_record_bandwidth_usage(now, get_or_state()); - or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */ - or_state_save(now); - if (authdir_mode_tests_reachability(options)) - rep_hist_record_mtbf_data(now, 0); - } -#ifdef USE_DMALLOC - dmalloc_log_stats(); -#endif - tor_free_all(0); /* We could move tor_free_all back into the ifdef below - later, if it makes shutdown unacceptably slow. But for - now, leave it here: it's helped us catch bugs in the - past. */ - crypto_global_cleanup(); -#ifdef USE_DMALLOC - dmalloc_log_unfreed(); - dmalloc_shutdown(); -#endif -} - -/** Read/create keys as needed, and echo our fingerprint to stdout. */ -static int -do_list_fingerprint(void) -{ - char buf[FINGERPRINT_LEN+1]; - crypto_pk_t *k; - const char *nickname = get_options()->Nickname; - if (!server_mode(get_options())) { - log_err(LD_GENERAL, - "Clients don't have long-term identity keys. Exiting."); - return -1; - } - tor_assert(nickname); - if (init_keys() < 0) { - log_err(LD_BUG,"Error initializing keys; can't display fingerprint"); - return -1; - } - if (!(k = get_server_identity_key())) { - log_err(LD_GENERAL,"Error: missing identity key."); - return -1; - } - if (crypto_pk_get_fingerprint(k, buf, 1)<0) { - log_err(LD_BUG, "Error computing fingerprint"); - return -1; - } - printf("%s %s\n", nickname, buf); - return 0; -} - -/** Entry point for password hashing: take the desired password from - * the command line, and print its salted hash to stdout. **/ -static void -do_hash_password(void) -{ - - char output[256]; - char key[S2K_SPECIFIER_LEN+DIGEST_LEN]; - - crypto_rand(key, S2K_SPECIFIER_LEN-1); - key[S2K_SPECIFIER_LEN-1] = (uint8_t)96; /* Hash 64 K of data. */ - secret_to_key(key+S2K_SPECIFIER_LEN, DIGEST_LEN, - get_options()->command_arg, strlen(get_options()->command_arg), - key); - base16_encode(output, sizeof(output), key, sizeof(key)); - printf("16:%s\n",output); -} - -/** Entry point for configuration dumping: write the configuration to - * stdout. */ -static int -do_dump_config(void) -{ - const or_options_t *options = get_options(); - const char *arg = options->command_arg; - int how; - char *opts; - if (!strcmp(arg, "short")) { - how = OPTIONS_DUMP_MINIMAL; - } else if (!strcmp(arg, "non-builtin")) { - how = OPTIONS_DUMP_DEFAULTS; - } else if (!strcmp(arg, "full")) { - how = OPTIONS_DUMP_ALL; - } else { - printf("%s is not a recognized argument to --dump-config. " - "Please select 'short', 'non-builtin', or 'full'", arg); - return -1; - } - - opts = options_dump(options, how); - printf("%s", opts); - tor_free(opts); - - return 0; -} - -#if defined (WINCE) -int -find_flashcard_path(PWCHAR path, size_t size) -{ - WIN32_FIND_DATA d = {0}; - HANDLE h = NULL; - - if (!path) - return -1; - - h = FindFirstFlashCard(&d); - if (h == INVALID_HANDLE_VALUE) - return -1; - - if (wcslen(d.cFileName) == 0) { - FindClose(h); - return -1; - } - - wcsncpy(path,d.cFileName,size); - FindClose(h); - return 0; -} -#endif - -static void -init_addrinfo(void) -{ - char hname[256]; - - // host name to sandbox - gethostname(hname, sizeof(hname)); - sandbox_add_addrinfo(hname); -} - -static sandbox_cfg_t* -sandbox_init_filter(void) -{ - sandbox_cfg_t *cfg = sandbox_cfg_new(); - - sandbox_cfg_allow_openat_filename(&cfg, - get_datadir_fname("cached-status"), 1); - - sandbox_cfg_allow_open_filename_array(&cfg, - get_datadir_fname("cached-certs"), 1, - get_datadir_fname("cached-certs.tmp"), 1, - get_datadir_fname("cached-consensus"), 1, - get_datadir_fname("unverified-consensus"), 1, - get_datadir_fname("unverified-consensus.tmp"), 1, - get_datadir_fname("cached-microdesc-consensus"), 1, - get_datadir_fname("cached-microdesc-consensus.tmp"), 1, - get_datadir_fname("cached-microdescs"), 1, - get_datadir_fname("cached-microdescs.tmp"), 1, - get_datadir_fname("cached-microdescs.new"), 1, - get_datadir_fname("cached-microdescs.new.tmp"), 1, - get_datadir_fname("unverified-microdesc-consensus"), 1, - get_datadir_fname("cached-descriptors"), 1, - get_datadir_fname("cached-descriptors.new"), 1, - get_datadir_fname("cached-descriptors.tmp"), 1, - get_datadir_fname("cached-descriptors.new.tmp"), 1, - get_datadir_fname("cached-descriptors.tmp.tmp"), 1, - get_datadir_fname("cached-extrainfo"), 1, - get_datadir_fname("state.tmp"), 1, - get_datadir_fname("unparseable-desc.tmp"), 1, - get_datadir_fname("unparseable-desc"), 1, - "/dev/srandom", 0, - "/dev/urandom", 0, - "/dev/random", 0, - NULL, 0 - ); - - sandbox_cfg_allow_stat_filename_array(&cfg, - get_datadir_fname(NULL), 1, - get_datadir_fname("lock"), 1, - get_datadir_fname("state"), 1, - get_datadir_fname("router-stability"), 1, - get_datadir_fname("cached-extrainfo.new"), 1, - NULL, 0 - ); - - // orport - if (server_mode(get_options())) { - sandbox_cfg_allow_open_filename_array(&cfg, - get_datadir_fname2("keys", "secret_id_key"), 1, - get_datadir_fname2("keys", "secret_onion_key"), 1, - get_datadir_fname2("keys", "secret_onion_key_ntor"), 1, - get_datadir_fname2("keys", "secret_onion_key_ntor.tmp"), 1, - get_datadir_fname2("keys", "secret_id_key.old"), 1, - get_datadir_fname2("keys", "secret_onion_key.old"), 1, - get_datadir_fname2("keys", "secret_onion_key_ntor.old"), 1, - get_datadir_fname2("keys", "secret_onion_key.tmp"), 1, - get_datadir_fname2("keys", "secret_id_key.tmp"), 1, - get_datadir_fname("fingerprint"), 1, - get_datadir_fname("fingerprint.tmp"), 1, - get_datadir_fname("cached-consensus"), 1, - get_datadir_fname("cached-consensus.tmp"), 1, - "/etc/resolv.conf", 0, - NULL, 0 - ); - - sandbox_cfg_allow_stat_filename_array(&cfg, - get_datadir_fname("keys"), 1, - get_datadir_fname("stats/dirreq-stats"), 1, - NULL, 0 - ); - } - - sandbox_cfg_allow_execve(&cfg, "/usr/local/bin/tor"); - - init_addrinfo(); - - return cfg; -} - -/** Main entry point for the Tor process. Called from main(). */ -/* This function is distinct from main() only so we can link onion_main.c into - * the unittest binary without conflicting with the unittests' main. */ -int -tor_main(int argc, char *argv[]) -{ - int result = 0; -#if defined (WINCE) - WCHAR path [MAX_PATH] = {0}; - WCHAR fullpath [MAX_PATH] = {0}; - PWCHAR p = NULL; - FILE* redir = NULL; - FILE* redirdbg = NULL; - - // this is to facilitate debugging by opening - // a file on a folder shared by the wm emulator. - // if no flashcard (real or emulated) is present, - // log files will be written in the root folder - if (find_flashcard_path(path,MAX_PATH) == -1) { - redir = _wfreopen( L"\\stdout.log", L"w", stdout ); - redirdbg = _wfreopen( L"\\stderr.log", L"w", stderr ); - } else { - swprintf(fullpath,L"\\%s\\tor",path); - CreateDirectory(fullpath,NULL); - - swprintf(fullpath,L"\\%s\\tor\\stdout.log",path); - redir = _wfreopen( fullpath, L"w", stdout ); - - swprintf(fullpath,L"\\%s\\tor\\stderr.log",path); - redirdbg = _wfreopen( fullpath, L"w", stderr ); - } -#endif - -#ifdef _WIN32 - /* Call SetProcessDEPPolicy to permanently enable DEP. - The function will not resolve on earlier versions of Windows, - and failure is not dangerous. */ - HMODULE hMod = GetModuleHandleA("Kernel32.dll"); - if (hMod) { - typedef BOOL (WINAPI *PSETDEP)(DWORD); - PSETDEP setdeppolicy = (PSETDEP)GetProcAddress(hMod, - "SetProcessDEPPolicy"); - if (setdeppolicy) setdeppolicy(1); /* PROCESS_DEP_ENABLE */ - } -#endif - - configure_backtrace_handler(get_version()); - - update_approx_time(time(NULL)); - tor_threads_init(); - init_logging(); -#ifdef USE_DMALLOC - { - /* Instruct OpenSSL to use our internal wrappers for malloc, - realloc and free. */ - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); - } -#endif -#ifdef NT_SERVICE - { - int done = 0; - result = nt_service_parse_options(argc, argv, &done); - if (done) return result; - } -#endif - if (tor_init(argc, argv)<0) - return -1; - - if (get_options()->Sandbox) { - sandbox_cfg_t* cfg = sandbox_init_filter(); - - if (sandbox_init(cfg)) { - log_err(LD_BUG,"Failed to create syscall sandbox filter"); - return -1; - } - - // registering libevent rng -#ifdef HAVE_EVUTIL_SECURE_RNG_SET_URANDOM_DEVICE_FILE - evutil_secure_rng_set_urandom_device_file( - (char*) sandbox_intern_string("/dev/urandom")); -#endif - } - - switch (get_options()->command) { - case CMD_RUN_TOR: -#ifdef NT_SERVICE - nt_service_set_state(SERVICE_RUNNING); -#endif - result = do_main_loop(); - break; - case CMD_LIST_FINGERPRINT: - result = do_list_fingerprint(); - break; - case CMD_HASH_PASSWORD: - do_hash_password(); - result = 0; - break; - case CMD_VERIFY_CONFIG: - printf("Configuration was valid\n"); - result = 0; - break; - case CMD_DUMP_CONFIG: - result = do_dump_config(); - break; - case CMD_RUN_UNITTESTS: /* only set by test.c */ - default: - log_warn(LD_BUG,"Illegal command number %d: internal error.", - get_options()->command); - result = -1; - } - tor_cleanup(); - return result; -} - diff --git a/src/tor/onion_main.h b/src/tor/onion_main.h deleted file mode 100644 index 1746ce88f..000000000 --- a/src/tor/onion_main.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_main.h - * \brief Header file for onion_main.c. - **/ - -#ifndef TOR_MAIN_H -#define TOR_MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern int can_complete_circuit; - -int connection_add_impl(connection_t *conn, int is_connecting); -#define connection_add(conn) connection_add_impl((conn), 0) -#define connection_add_connecting(conn) connection_add_impl((conn), 1) -int connection_remove(connection_t *conn); -void connection_unregister_events(connection_t *conn); -int connection_in_array(connection_t *conn); -void add_connection_to_closeable_list(connection_t *conn); -int connection_is_on_closeable_list(connection_t *conn); - -smartlist_t *get_connection_array(void); -uint64_t get_bytes_read(void); -uint64_t get_bytes_written(void); - -/** Bitmask for events that we can turn on and off with - * connection_watch_events. */ -typedef enum watchable_events { - /* Yes, it is intentional that these match Libevent's EV_READ and EV_WRITE */ - READ_EVENT=0x02, /**< We want to know when a connection is readable */ - WRITE_EVENT=0x04 /**< We want to know when a connection is writable */ -} watchable_events_t; -void connection_watch_events(connection_t *conn, watchable_events_t events); -int connection_is_reading(connection_t *conn); -MOCK_DECL(void,connection_stop_reading,(connection_t *conn)); -MOCK_DECL(void,connection_start_reading,(connection_t *conn)); - -int connection_is_writing(connection_t *conn); -MOCK_DECL(void,connection_stop_writing,(connection_t *conn)); -MOCK_DECL(void,connection_start_writing,(connection_t *conn)); - -void connection_stop_reading_from_linked_conn(connection_t *conn); - -void directory_all_unreachable(time_t now); -void directory_info_has_arrived(time_t now, int from_cache); - -void ip_address_changed(int at_interface); -void dns_servers_relaunch_checks(void); - -long get_uptime(void); -unsigned get_signewnym_epoch(void); - -void handle_signals(int is_parent); -void process_signal(uintptr_t sig); - -int try_locking(const or_options_t *options, int err_if_locked); -int have_lockfile(void); -void release_lockfile(void); - -void tor_cleanup(void); -void tor_free_all(int postfork); - -int tor_main(int argc, char *argv[]); - -int do_main_loop(void); -int tor_init(int argc, char **argv); - -#ifdef MAIN_PRIVATE -STATIC void init_connection_lists(void); -STATIC void close_closeable_connections(void); -#endif - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src/tor/onion_ntor.c b/src/tor/onion_ntor.c deleted file mode 100644 index e37ce9e8a..000000000 --- a/src/tor/onion_ntor.c +++ /dev/null @@ -1,295 +0,0 @@ -/* Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include "crypto.h" -#define ONION_NTOR_PRIVATE -#include "onion_ntor.h" -#include "torlog.h" -#include "tor_util.h" - -/** Free storage held in an ntor handshake state. */ -void -ntor_handshake_state_free(ntor_handshake_state_t *state) -{ - if (!state) - return; - memwipe(state, 0, sizeof(*state)); - tor_free(state); -} - -/** Convenience function to represent HMAC_SHA256 as our instantiation of - * ntor's "tweaked hash'. Hash the inp_len bytes at inp into - * a DIGEST256_LEN-byte digest at out, with the hash changing - * depending on the value of tweak. */ -static void -h_tweak(uint8_t *out, - const uint8_t *inp, size_t inp_len, - const char *tweak) -{ - size_t tweak_len = strlen(tweak); - crypto_hmac_sha256((char*)out, tweak, tweak_len, (const char*)inp, inp_len); -} - -/** Wrapper around a set of tweak-values for use with the ntor handshake. */ -typedef struct tweakset_t { - const char *t_mac; - const char *t_key; - const char *t_verify; - const char *m_expand; -} tweakset_t; - -/** The tweaks to be used with our handshake. */ -const tweakset_t proto1_tweaks = { -#define PROTOID "ntor-curve25519-sha256-1" -#define PROTOID_LEN 24 - PROTOID ":mac", - PROTOID ":key_extract", - PROTOID ":verify", - PROTOID ":key_expand" -}; - -/** Convenience macro: copy len bytes from inp to ptr, - * and advance ptr by the number of bytes copied. */ -#define APPEND(ptr, inp, len) \ - STMT_BEGIN { \ - memcpy(ptr, (inp), (len)); \ - ptr += len; \ - } STMT_END - -/** - * Compute the first client-side step of the ntor handshake for communicating - * with a server whose DIGEST_LEN-byte server identity is router_id, - * and whose onion key is router_key. Store the NTOR_ONIONSKIN_LEN-byte - * message in onion_skin_out, and store the handshake state in - * *handshake_state_out. Return 0 on success, -1 on failure. - */ -int -onion_skin_ntor_create(const uint8_t *router_id, - const curve25519_public_key_t *router_key, - ntor_handshake_state_t **handshake_state_out, - uint8_t *onion_skin_out) -{ - ntor_handshake_state_t *state; - uint8_t *op; - - state = tor_malloc_zero(sizeof(ntor_handshake_state_t)); - - memcpy(state->router_id, router_id, DIGEST_LEN); - memcpy(&state->pubkey_B, router_key, sizeof(curve25519_public_key_t)); - if (curve25519_secret_key_generate(&state->seckey_x, 0) < 0) { - tor_free(state); - return -1; - } - curve25519_public_key_generate(&state->pubkey_X, &state->seckey_x); - - op = onion_skin_out; - APPEND(op, router_id, DIGEST_LEN); - APPEND(op, router_key->public_key, CURVE25519_PUBKEY_LEN); - APPEND(op, state->pubkey_X.public_key, CURVE25519_PUBKEY_LEN); - tor_assert(op == onion_skin_out + NTOR_ONIONSKIN_LEN); - - *handshake_state_out = state; - - return 0; -} - -#define SERVER_STR "Server" -#define SERVER_STR_LEN 6 - -#define SECRET_INPUT_LEN (CURVE25519_PUBKEY_LEN * 3 + \ - CURVE25519_OUTPUT_LEN * 2 + \ - DIGEST_LEN + PROTOID_LEN) -#define AUTH_INPUT_LEN (DIGEST256_LEN + DIGEST_LEN + \ - CURVE25519_PUBKEY_LEN*3 + \ - PROTOID_LEN + SERVER_STR_LEN) - -/** - * Perform the server side of an ntor handshake. Given an - * NTOR_ONIONSKIN_LEN-byte message in onion_skin, our own identity - * fingerprint as my_node_id, and an associative array mapping public - * onion keys to curve25519_keypair_t in private_keys, attempt to - * perform the handshake. Use junk_keys if present if the handshake - * indicates an unrecognized public key. Write an NTOR_REPLY_LEN-byte - * message to send back to the client into handshake_reply_out, and - * generate key_out_len bytes of key material in key_out. Return - * 0 on success, -1 on failure. - */ -int -onion_skin_ntor_server_handshake(const uint8_t *onion_skin, - const di_digest256_map_t *private_keys, - const curve25519_keypair_t *junk_keys, - const uint8_t *my_node_id, - uint8_t *handshake_reply_out, - uint8_t *key_out, - size_t key_out_len) -{ - const tweakset_t *T = &proto1_tweaks; - /* Sensitive stack-allocated material. Kept in an anonymous struct to make - * it easy to wipe. */ - struct { - uint8_t secret_input[SECRET_INPUT_LEN]; - uint8_t auth_input[AUTH_INPUT_LEN]; - curve25519_public_key_t pubkey_X; - curve25519_secret_key_t seckey_y; - curve25519_public_key_t pubkey_Y; - uint8_t verify[DIGEST256_LEN]; - } s; - uint8_t *si = s.secret_input, *ai = s.auth_input; - const curve25519_keypair_t *keypair_bB; - int bad; - - /* Decode the onion skin */ - /* XXXX Does this possible early-return business threaten our security? */ - if (tor_memneq(onion_skin, my_node_id, DIGEST_LEN)) - return -1; - /* Note that on key-not-found, we go through with this operation anyway, - * using "junk_keys". This will result in failed authentication, but won't - * leak whether we recognized the key. */ - keypair_bB = dimap_search(private_keys, onion_skin + DIGEST_LEN, - (void*)junk_keys); - if (!keypair_bB) - return -1; - - memcpy(s.pubkey_X.public_key, onion_skin+DIGEST_LEN+DIGEST256_LEN, - CURVE25519_PUBKEY_LEN); - - /* Make y, Y */ - curve25519_secret_key_generate(&s.seckey_y, 0); - curve25519_public_key_generate(&s.pubkey_Y, &s.seckey_y); - - /* NOTE: If we ever use a group other than curve25519, or a different - * representation for its points, we may need to perform different or - * additional checks on X here and on Y in the client handshake, or lose our - * security properties. What checks we need would depend on the properties - * of the group and its representation. - * - * In short: if you use anything other than curve25519, this aspect of the - * code will need to be reconsidered carefully. */ - - /* build secret_input */ - curve25519_handshake(si, &s.seckey_y, &s.pubkey_X); - bad = safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN); - si += CURVE25519_OUTPUT_LEN; - curve25519_handshake(si, &keypair_bB->seckey, &s.pubkey_X); - bad |= safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN); - si += CURVE25519_OUTPUT_LEN; - - APPEND(si, my_node_id, DIGEST_LEN); - APPEND(si, keypair_bB->pubkey.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, s.pubkey_X.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, s.pubkey_Y.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, PROTOID, PROTOID_LEN); - tor_assert(si == s.secret_input + sizeof(s.secret_input)); - - /* Compute hashes of secret_input */ - h_tweak(s.verify, s.secret_input, sizeof(s.secret_input), T->t_verify); - - /* Compute auth_input */ - APPEND(ai, s.verify, DIGEST256_LEN); - APPEND(ai, my_node_id, DIGEST_LEN); - APPEND(ai, keypair_bB->pubkey.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, s.pubkey_Y.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, s.pubkey_X.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, PROTOID, PROTOID_LEN); - APPEND(ai, SERVER_STR, SERVER_STR_LEN); - tor_assert(ai == s.auth_input + sizeof(s.auth_input)); - - /* Build the reply */ - memcpy(handshake_reply_out, s.pubkey_Y.public_key, CURVE25519_PUBKEY_LEN); - h_tweak(handshake_reply_out+CURVE25519_PUBKEY_LEN, - s.auth_input, sizeof(s.auth_input), - T->t_mac); - - /* Generate the key material */ - crypto_expand_key_material_rfc5869_sha256( - s.secret_input, sizeof(s.secret_input), - (const uint8_t*)T->t_key, strlen(T->t_key), - (const uint8_t*)T->m_expand, strlen(T->m_expand), - key_out, key_out_len); - - /* Wipe all of our local state */ - memwipe(&s, 0, sizeof(s)); - - return bad ? -1 : 0; -} - -/** - * Perform the final client side of the ntor handshake, using the state in - * handshake_state and the server's NTOR_REPLY_LEN-byte reply in - * handshake_reply. Generate key_out_len bytes of key material - * in key_out. Return 0 on success, -1 on failure. - */ -int -onion_skin_ntor_client_handshake( - const ntor_handshake_state_t *handshake_state, - const uint8_t *handshake_reply, - uint8_t *key_out, - size_t key_out_len) -{ - const tweakset_t *T = &proto1_tweaks; - /* Sensitive stack-allocated material. Kept in an anonymous struct to make - * it easy to wipe. */ - struct { - curve25519_public_key_t pubkey_Y; - uint8_t secret_input[SECRET_INPUT_LEN]; - uint8_t verify[DIGEST256_LEN]; - uint8_t auth_input[AUTH_INPUT_LEN]; - uint8_t auth[DIGEST256_LEN]; - } s; - uint8_t *ai = s.auth_input, *si = s.secret_input; - const uint8_t *auth_candidate; - int bad; - - /* Decode input */ - memcpy(s.pubkey_Y.public_key, handshake_reply, CURVE25519_PUBKEY_LEN); - auth_candidate = handshake_reply + CURVE25519_PUBKEY_LEN; - - /* See note in server_handshake above about checking points. The - * circumstances under which we'd need to check Y for membership are - * different than those under which we'd be checking X. */ - - /* Compute secret_input */ - curve25519_handshake(si, &handshake_state->seckey_x, &s.pubkey_Y); - bad = safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN); - si += CURVE25519_OUTPUT_LEN; - curve25519_handshake(si, &handshake_state->seckey_x, - &handshake_state->pubkey_B); - bad |= safe_mem_is_zero(si, CURVE25519_OUTPUT_LEN); - si += CURVE25519_OUTPUT_LEN; - APPEND(si, handshake_state->router_id, DIGEST_LEN); - APPEND(si, handshake_state->pubkey_B.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, handshake_state->pubkey_X.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, s.pubkey_Y.public_key, CURVE25519_PUBKEY_LEN); - APPEND(si, PROTOID, PROTOID_LEN); - tor_assert(si == s.secret_input + sizeof(s.secret_input)); - - /* Compute verify from secret_input */ - h_tweak(s.verify, s.secret_input, sizeof(s.secret_input), T->t_verify); - - /* Compute auth_input */ - APPEND(ai, s.verify, DIGEST256_LEN); - APPEND(ai, handshake_state->router_id, DIGEST_LEN); - APPEND(ai, handshake_state->pubkey_B.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, s.pubkey_Y.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, handshake_state->pubkey_X.public_key, CURVE25519_PUBKEY_LEN); - APPEND(ai, PROTOID, PROTOID_LEN); - APPEND(ai, SERVER_STR, SERVER_STR_LEN); - tor_assert(ai == s.auth_input + sizeof(s.auth_input)); - - /* Compute auth */ - h_tweak(s.auth, s.auth_input, sizeof(s.auth_input), T->t_mac); - - bad |= tor_memneq(s.auth, auth_candidate, DIGEST256_LEN); - - crypto_expand_key_material_rfc5869_sha256( - s.secret_input, sizeof(s.secret_input), - (const uint8_t*)T->t_key, strlen(T->t_key), - (const uint8_t*)T->m_expand, strlen(T->m_expand), - key_out, key_out_len); - - memwipe(&s, 0, sizeof(s)); - return bad ? -1 : 0; -} - diff --git a/src/tor/onion_ntor.h b/src/tor/onion_ntor.h deleted file mode 100644 index c942e6e0f..000000000 --- a/src/tor/onion_ntor.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2012-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#ifndef TOR_ONION_NTOR_H -#define TOR_ONION_NTOR_H - -#include "torint.h" -#include "crypto_curve25519.h" -#include "di_ops.h" - -/** State to be maintained by a client between sending an ntor onionskin - * and receiving a reply. */ -typedef struct ntor_handshake_state_t ntor_handshake_state_t; - -/** Length of an ntor onionskin, as sent from the client to server. */ -#define NTOR_ONIONSKIN_LEN 84 -/** Length of an ntor reply, as sent from server to client. */ -#define NTOR_REPLY_LEN 64 - -#ifdef CURVE25519_ENABLED -void ntor_handshake_state_free(ntor_handshake_state_t *state); - -int onion_skin_ntor_create(const uint8_t *router_id, - const curve25519_public_key_t *router_key, - ntor_handshake_state_t **handshake_state_out, - uint8_t *onion_skin_out); - -int onion_skin_ntor_server_handshake(const uint8_t *onion_skin, - const di_digest256_map_t *private_keys, - const curve25519_keypair_t *junk_keypair, - const uint8_t *my_node_id, - uint8_t *handshake_reply_out, - uint8_t *key_out, - size_t key_out_len); - -int onion_skin_ntor_client_handshake( - const ntor_handshake_state_t *handshake_state, - const uint8_t *handshake_reply, - uint8_t *key_out, - size_t key_out_len); - -#ifdef ONION_NTOR_PRIVATE - -/** Storage held by a client while waiting for an ntor reply from a server. */ -struct ntor_handshake_state_t { - /** Identity digest of the router we're talking to. */ - uint8_t router_id[DIGEST_LEN]; - /** Onion key of the router we're talking to. */ - curve25519_public_key_t pubkey_B; - - /** - * Short-lived keypair for use with this handshake. - * @{ */ - curve25519_secret_key_t seckey_x; - curve25519_public_key_t pubkey_X; - /** @} */ -}; -#endif - -#endif - -#endif - diff --git a/src/tor/onion_tap.c b/src/tor/onion_tap.c deleted file mode 100644 index 3782e75ab..000000000 --- a/src/tor/onion_tap.c +++ /dev/null @@ -1,218 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_tap.c - * \brief Functions to implement the original Tor circuit extension handshake - * (a.k.a TAP). - * - * We didn't call it "TAP" ourselves -- Ian Goldberg named it in "On the - * Security of the Tor Authentication Protocol". (Spoiler: it's secure, but - * its security is kind of fragile and implementation dependent. Never modify - * this implementation without reading and understanding that paper at least.) - **/ - -#include "or.h" -#include "config.h" -#include "onion_tap.h" -#include "rephist.h" - -/*----------------------------------------------------------------------*/ - -/** Given a router's 128 byte public key, - * stores the following in onion_skin_out: - * - [42 bytes] OAEP padding - * - [16 bytes] Symmetric key for encrypting blob past RSA - * - [70 bytes] g^x part 1 (inside the RSA) - * - [58 bytes] g^x part 2 (symmetrically encrypted) - * - * Stores the DH private key into handshake_state_out for later completion - * of the handshake. - * - * The meeting point/cookies and auth are zeroed out for now. - */ -int -onion_skin_TAP_create(crypto_pk_t *dest_router_key, - crypto_dh_t **handshake_state_out, - char *onion_skin_out) /* TAP_ONIONSKIN_CHALLENGE_LEN bytes */ -{ - char challenge[DH_KEY_LEN]; - crypto_dh_t *dh = NULL; - int dhbytes, pkbytes; - - tor_assert(dest_router_key); - tor_assert(handshake_state_out); - tor_assert(onion_skin_out); - *handshake_state_out = NULL; - memset(onion_skin_out, 0, TAP_ONIONSKIN_CHALLENGE_LEN); - - if (!(dh = crypto_dh_new(DH_TYPE_CIRCUIT))) - goto err; - - dhbytes = crypto_dh_get_bytes(dh); - pkbytes = (int) crypto_pk_keysize(dest_router_key); - tor_assert(dhbytes == 128); - tor_assert(pkbytes == 128); - - if (crypto_dh_get_public(dh, challenge, dhbytes)) - goto err; - - note_crypto_pk_op(ENC_ONIONSKIN); - - /* set meeting point, meeting cookie, etc here. Leave zero for now. */ - if (crypto_pk_public_hybrid_encrypt(dest_router_key, onion_skin_out, - TAP_ONIONSKIN_CHALLENGE_LEN, - challenge, DH_KEY_LEN, - PK_PKCS1_OAEP_PADDING, 1)<0) - goto err; - - memwipe(challenge, 0, sizeof(challenge)); - *handshake_state_out = dh; - - return 0; - err: - memwipe(challenge, 0, sizeof(challenge)); - if (dh) crypto_dh_free(dh); - return -1; -} - -/** Given an encrypted DH public key as generated by onion_skin_create, - * and the private key for this onion router, generate the reply (128-byte - * DH plus the first 20 bytes of shared key material), and store the - * next key_out_len bytes of key material in key_out. - */ -int -onion_skin_TAP_server_handshake( - /*TAP_ONIONSKIN_CHALLENGE_LEN*/ - const char *onion_skin, - crypto_pk_t *private_key, - crypto_pk_t *prev_private_key, - /*TAP_ONIONSKIN_REPLY_LEN*/ - char *handshake_reply_out, - char *key_out, - size_t key_out_len) -{ - char challenge[TAP_ONIONSKIN_CHALLENGE_LEN]; - crypto_dh_t *dh = NULL; - ssize_t len; - char *key_material=NULL; - size_t key_material_len=0; - int i; - crypto_pk_t *k; - - len = -1; - for (i=0;i<2;++i) { - k = i==0?private_key:prev_private_key; - if (!k) - break; - note_crypto_pk_op(DEC_ONIONSKIN); - len = crypto_pk_private_hybrid_decrypt(k, challenge, - TAP_ONIONSKIN_CHALLENGE_LEN, - onion_skin, - TAP_ONIONSKIN_CHALLENGE_LEN, - PK_PKCS1_OAEP_PADDING,0); - if (len>0) - break; - } - if (len<0) { - log_info(LD_PROTOCOL, - "Couldn't decrypt onionskin: client may be using old onion key"); - goto err; - } else if (len != DH_KEY_LEN) { - log_warn(LD_PROTOCOL, "Unexpected onionskin length after decryption: %ld", - (long)len); - goto err; - } - - dh = crypto_dh_new(DH_TYPE_CIRCUIT); - if (!dh) { - log_warn(LD_BUG, "Couldn't allocate DH key"); - goto err; - } - if (crypto_dh_get_public(dh, handshake_reply_out, DH_KEY_LEN)) { - log_info(LD_GENERAL, "crypto_dh_get_public failed."); - goto err; - } - - key_material_len = DIGEST_LEN+key_out_len; - key_material = tor_malloc(key_material_len); - len = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh, challenge, - DH_KEY_LEN, key_material, - key_material_len); - if (len < 0) { - log_info(LD_GENERAL, "crypto_dh_compute_secret failed."); - goto err; - } - - /* send back H(K|0) as proof that we learned K. */ - memcpy(handshake_reply_out+DH_KEY_LEN, key_material, DIGEST_LEN); - - /* use the rest of the key material for our shared keys, digests, etc */ - memcpy(key_out, key_material+DIGEST_LEN, key_out_len); - - memwipe(challenge, 0, sizeof(challenge)); - memwipe(key_material, 0, key_material_len); - tor_free(key_material); - crypto_dh_free(dh); - return 0; - err: - memwipe(challenge, 0, sizeof(challenge)); - if (key_material) { - memwipe(key_material, 0, key_material_len); - tor_free(key_material); - } - if (dh) crypto_dh_free(dh); - - return -1; -} - -/** Finish the client side of the DH handshake. - * Given the 128 byte DH reply + 20 byte hash as generated by - * onion_skin_server_handshake and the handshake state generated by - * onion_skin_create, verify H(K) with the first 20 bytes of shared - * key material, then generate key_out_len more bytes of shared key - * material and store them in key_out. - * - * After the invocation, call crypto_dh_free on handshake_state. - */ -int -onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state, - const char *handshake_reply, /* TAP_ONIONSKIN_REPLY_LEN bytes */ - char *key_out, - size_t key_out_len) -{ - ssize_t len; - char *key_material=NULL; - size_t key_material_len; - tor_assert(crypto_dh_get_bytes(handshake_state) == DH_KEY_LEN); - - key_material_len = DIGEST_LEN + key_out_len; - key_material = tor_malloc(key_material_len); - len = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, handshake_state, - handshake_reply, DH_KEY_LEN, key_material, - key_material_len); - if (len < 0) - goto err; - - if (tor_memneq(key_material, handshake_reply+DH_KEY_LEN, DIGEST_LEN)) { - /* H(K) does *not* match. Something fishy. */ - log_warn(LD_PROTOCOL,"Digest DOES NOT MATCH on onion handshake. " - "Bug or attack."); - goto err; - } - - /* use the rest of the key material for our shared keys, digests, etc */ - memcpy(key_out, key_material+DIGEST_LEN, key_out_len); - - memwipe(key_material, 0, key_material_len); - tor_free(key_material); - return 0; - err: - memwipe(key_material, 0, key_material_len); - tor_free(key_material); - return -1; -} - diff --git a/src/tor/onion_tap.h b/src/tor/onion_tap.h deleted file mode 100644 index b978b6673..000000000 --- a/src/tor/onion_tap.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file onion_tap.h - * \brief Header file for onion_tap.c. - **/ - -#ifndef TOR_ONION_TAP_H -#define TOR_ONION_TAP_H - -#define TAP_ONIONSKIN_CHALLENGE_LEN (PKCS1_OAEP_PADDING_OVERHEAD+\ - CIPHER_KEY_LEN+\ - DH_KEY_LEN) -#define TAP_ONIONSKIN_REPLY_LEN (DH_KEY_LEN+DIGEST_LEN) - -int onion_skin_TAP_create(crypto_pk_t *router_key, - crypto_dh_t **handshake_state_out, - char *onion_skin_out); - -int onion_skin_TAP_server_handshake(const char *onion_skin, - crypto_pk_t *private_key, - crypto_pk_t *prev_private_key, - char *handshake_reply_out, - char *key_out, - size_t key_out_len); - -int onion_skin_TAP_client_handshake(crypto_dh_t *handshake_state, - const char *handshake_reply, - char *key_out, - size_t key_out_len); - -#endif - diff --git a/src/tor/or.h b/src/tor/or.h deleted file mode 100644 index e28f82cdf..000000000 --- a/src/tor/or.h +++ /dev/null @@ -1,5044 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2013, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file or.h - * \brief Master header file for Tor-specific functionality. - **/ - -#ifndef TOR_OR_H -#define TOR_OR_H - -#include "orconfig.h" - -#ifdef __COVERITY__ -/* If we're building for a static analysis, turn on all the off-by-default - * features. */ -#ifndef INSTRUMENT_DOWNLOADS -#define INSTRUMENT_DOWNLOADS 1 -#endif -#endif - -#ifdef _WIN32 -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif -#define WIN32_LEAN_AND_MEAN -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SIGNAL_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include /* FreeBSD needs this to know what version it is */ -#endif -#include "torint.h" -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SYS_FCNTL_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_SYS_IOCTL_H -#include -#endif -#ifdef HAVE_SYS_UN_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_ERRNO_H -#include -#endif -#ifdef HAVE_ASSERT_H -#include -#endif -#ifdef HAVE_TIME_H -#include -#endif - -#ifdef _WIN32 -#include -#include -#include -#include -#endif - -#ifdef USE_BUFFEREVENTS -#include -#include -#include -#endif - -#include "crypto.h" -#include "tortls.h" -#include "torlog.h" -#include "container.h" -#include "torgzip.h" -#include "address.h" -#include "compat_libevent.h" -#include "ht.h" -#include "replaycache.h" -#include "crypto_curve25519.h" -#include "tor_queue.h" - -/* These signals are defined to help handle_control_signal work. - */ -#ifndef SIGHUP -#define SIGHUP 1 -#endif -#ifndef SIGINT -#define SIGINT 2 -#endif -#ifndef SIGUSR1 -#define SIGUSR1 10 -#endif -#ifndef SIGUSR2 -#define SIGUSR2 12 -#endif -#ifndef SIGTERM -#define SIGTERM 15 -#endif -/* Controller signals start at a high number so we don't - * conflict with system-defined signals. */ -#define SIGNEWNYM 129 -#define SIGCLEARDNSCACHE 130 - -#if (SIZEOF_CELL_T != 0) -/* On Irix, stdlib.h defines a cell_t type, so we need to make sure - * that our stuff always calls cell_t something different. */ -#define cell_t tor_cell_t -#endif - -#ifdef ENABLE_TOR2WEB_MODE -#define NON_ANONYMOUS_MODE_ENABLED 1 -#endif - -/** Length of longest allowable configured nickname. */ -#define MAX_NICKNAME_LEN 19 -/** Length of a router identity encoded as a hexadecimal digest, plus - * possible dollar sign. */ -#define MAX_HEX_NICKNAME_LEN (HEX_DIGEST_LEN+1) -/** Maximum length of verbose router identifier: dollar sign, hex ID digest, - * equal sign or tilde, nickname. */ -#define MAX_VERBOSE_NICKNAME_LEN (1+HEX_DIGEST_LEN+1+MAX_NICKNAME_LEN) - -/** Maximum size, in bytes, for resized buffers. */ -#define MAX_BUF_SIZE ((1<<24)-1) /* 16MB-1 */ -/** Maximum size, in bytes, for any directory object that we've downloaded. */ -#define MAX_DIR_DL_SIZE MAX_BUF_SIZE - -/** For HTTP parsing: Maximum number of bytes we'll accept in the headers - * of an HTTP request or response. */ -#define MAX_HEADERS_SIZE 50000 -/** Maximum size, in bytes, for any directory object that we're accepting - * as an upload. */ -#define MAX_DIR_UL_SIZE MAX_BUF_SIZE - -/** Maximum size, in bytes, of a single router descriptor uploaded to us - * as a directory authority. Caches and clients fetch whatever descriptors - * the authorities tell them to fetch, and don't care about size. */ -#define MAX_DESCRIPTOR_UPLOAD_SIZE 20000 - -/** Maximum size of a single extrainfo document, as above. */ -#define MAX_EXTRAINFO_UPLOAD_SIZE 50000 - -/** How long do we keep DNS cache entries before purging them (regardless of - * their TTL)? */ -#define MAX_DNS_ENTRY_AGE (30*60) -/** How long do we cache/tell clients to cache DNS records when no TTL is - * known? */ -#define DEFAULT_DNS_TTL (30*60) -/** How long can a TTL be before we stop believing it? */ -#define MAX_DNS_TTL (3*60*60) -/** How small can a TTL be before we stop believing it? Provides rudimentary - * pinning. */ -#define MIN_DNS_TTL 60 - -/** How often do we rotate onion keys? */ -#define MIN_ONION_KEY_LIFETIME (7*24*60*60) -/** How often do we rotate TLS contexts? */ -#define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60) - -/** How old do we allow a router to get before removing it - * from the router list? In seconds. */ -#define ROUTER_MAX_AGE (60*60*48) -/** How old can a router get before we (as a server) will no longer - * consider it live? In seconds. */ -#define ROUTER_MAX_AGE_TO_PUBLISH (60*60*24) -/** How old do we let a saved descriptor get before force-removing it? */ -#define OLD_ROUTER_DESC_MAX_AGE (60*60*24*5) - -/** Possible rules for generating circuit IDs on an OR connection. */ -typedef enum { - CIRC_ID_TYPE_LOWER=0, /**< Pick from 0..1<<15-1. */ - CIRC_ID_TYPE_HIGHER=1, /**< Pick from 1<<15..1<<16-1. */ - /** The other side of a connection is an OP: never create circuits to it, - * and let it use any circuit ID it wants. */ - CIRC_ID_TYPE_NEITHER=2 -} circ_id_type_t; - -#define CONN_TYPE_MIN_ 3 -/** Type for sockets listening for OR connections. */ -#define CONN_TYPE_OR_LISTENER 3 -/** A bidirectional TLS connection transmitting a sequence of cells. - * May be from an OR to an OR, or from an OP to an OR. */ -#define CONN_TYPE_OR 4 -/** A TCP connection from an onion router to a stream's destination. */ -#define CONN_TYPE_EXIT 5 -/** Type for sockets listening for SOCKS connections. */ -#define CONN_TYPE_AP_LISTENER 6 -/** A SOCKS proxy connection from the user application to the onion - * proxy. */ -#define CONN_TYPE_AP 7 -/** Type for sockets listening for HTTP connections to the directory server. */ -#define CONN_TYPE_DIR_LISTENER 8 -/** Type for HTTP connections to the directory server. */ -#define CONN_TYPE_DIR 9 -/** Connection from the main process to a CPU worker process. */ -#define CONN_TYPE_CPUWORKER 10 -/** Type for listening for connections from user interface process. */ -#define CONN_TYPE_CONTROL_LISTENER 11 -/** Type for connections from user interface process. */ -#define CONN_TYPE_CONTROL 12 -/** Type for sockets listening for transparent connections redirected by pf or - * netfilter. */ -#define CONN_TYPE_AP_TRANS_LISTENER 13 -/** Type for sockets listening for transparent connections redirected by - * natd. */ -#define CONN_TYPE_AP_NATD_LISTENER 14 -/** Type for sockets listening for DNS requests. */ -#define CONN_TYPE_AP_DNS_LISTENER 15 - -/** Type for connections from the Extended ORPort. */ -#define CONN_TYPE_EXT_OR 16 -/** Type for sockets listening for Extended ORPort connections. */ -#define CONN_TYPE_EXT_OR_LISTENER 17 - -#define CONN_TYPE_MAX_ 17 -/* !!!! If _CONN_TYPE_MAX is ever over 31, we must grow the type field in - * connection_t. */ - -/* Proxy client types */ -#define PROXY_NONE 0 -#define PROXY_CONNECT 1 -#define PROXY_SOCKS4 2 -#define PROXY_SOCKS5 3 -/* !!!! If there is ever a PROXY_* type over 2, we must grow the proxy_type - * field in or_connection_t */ - -/* Pluggable transport proxy type. Don't use this in or_connection_t, - * instead use the actual underlying proxy type (see above). */ -#define PROXY_PLUGGABLE 4 - -/* Proxy client handshake states */ -/* We use a proxy but we haven't even connected to it yet. */ -#define PROXY_INFANT 1 -/* We use an HTTP proxy and we've sent the CONNECT command. */ -#define PROXY_HTTPS_WANT_CONNECT_OK 2 -/* We use a SOCKS4 proxy and we've sent the CONNECT command. */ -#define PROXY_SOCKS4_WANT_CONNECT_OK 3 -/* We use a SOCKS5 proxy and we try to negotiate without - any authentication . */ -#define PROXY_SOCKS5_WANT_AUTH_METHOD_NONE 4 -/* We use a SOCKS5 proxy and we try to negotiate with - Username/Password authentication . */ -#define PROXY_SOCKS5_WANT_AUTH_METHOD_RFC1929 5 -/* We use a SOCKS5 proxy and we just sent our credentials. */ -#define PROXY_SOCKS5_WANT_AUTH_RFC1929_OK 6 -/* We use a SOCKS5 proxy and we just sent our CONNECT command. */ -#define PROXY_SOCKS5_WANT_CONNECT_OK 7 -/* We use a proxy and we CONNECTed successfully!. */ -#define PROXY_CONNECTED 8 - -/** True iff x is an edge connection. */ -#define CONN_IS_EDGE(x) \ - ((x)->type == CONN_TYPE_EXIT || (x)->type == CONN_TYPE_AP) - -/** State for any listener connection. */ -#define LISTENER_STATE_READY 0 - -#define CPUWORKER_STATE_MIN_ 1 -/** State for a connection to a cpuworker process that's idle. */ -#define CPUWORKER_STATE_IDLE 1 -/** State for a connection to a cpuworker process that's processing a - * handshake. */ -#define CPUWORKER_STATE_BUSY_ONION 2 -#define CPUWORKER_STATE_MAX_ 2 - -#define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION -#define CPUWORKER_TASK_SHUTDOWN 255 - -#define OR_CONN_STATE_MIN_ 1 -/** State for a connection to an OR: waiting for connect() to finish. */ -#define OR_CONN_STATE_CONNECTING 1 -/** State for a connection to an OR: waiting for proxy handshake to complete */ -#define OR_CONN_STATE_PROXY_HANDSHAKING 2 -/** State for an OR connection client: SSL is handshaking, not done - * yet. */ -#define OR_CONN_STATE_TLS_HANDSHAKING 3 -/** State for a connection to an OR: We're doing a second SSL handshake for - * renegotiation purposes. (V2 handshake only.) */ -#define OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING 4 -/** State for a connection at an OR: We're waiting for the client to - * renegotiate (to indicate a v2 handshake) or send a versions cell (to - * indicate a v3 handshake) */ -#define OR_CONN_STATE_TLS_SERVER_RENEGOTIATING 5 -/** State for an OR connection: We're done with our SSL handshake, we've done - * renegotiation, but we haven't yet negotiated link protocol versions and - * sent a netinfo cell. */ -#define OR_CONN_STATE_OR_HANDSHAKING_V2 6 -/** State for an OR connection: We're done with our SSL handshake, but we - * haven't yet negotiated link protocol versions, done a V3 handshake, and - * sent a netinfo cell. */ -#define OR_CONN_STATE_OR_HANDSHAKING_V3 7 -/** State for an OR connection: Ready to send/receive cells. */ -#define OR_CONN_STATE_OPEN 8 -#define OR_CONN_STATE_MAX_ 8 - -/** States of the Extended ORPort protocol. Be careful before changing - * the numbers: they matter. */ -#define EXT_OR_CONN_STATE_MIN_ 1 -/** Extended ORPort authentication is waiting for the authentication - * type selected by the client. */ -#define EXT_OR_CONN_STATE_AUTH_WAIT_AUTH_TYPE 1 -/** Extended ORPort authentication is waiting for the client nonce. */ -#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE 2 -/** Extended ORPort authentication is waiting for the client hash. */ -#define EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH 3 -#define EXT_OR_CONN_STATE_AUTH_MAX 3 -/** Authentication finished and the Extended ORPort is now accepting - * traffic. */ -#define EXT_OR_CONN_STATE_OPEN 4 -/** Extended ORPort is flushing its last messages and preparing to - * start accepting OR connections. */ -#define EXT_OR_CONN_STATE_FLUSHING 5 -#define EXT_OR_CONN_STATE_MAX_ 5 - -#define EXIT_CONN_STATE_MIN_ 1 -/** State for an exit connection: waiting for response from DNS farm. */ -#define EXIT_CONN_STATE_RESOLVING 1 -/** State for an exit connection: waiting for connect() to finish. */ -#define EXIT_CONN_STATE_CONNECTING 2 -/** State for an exit connection: open and ready to transmit data. */ -#define EXIT_CONN_STATE_OPEN 3 -/** State for an exit connection: waiting to be removed. */ -#define EXIT_CONN_STATE_RESOLVEFAILED 4 -#define EXIT_CONN_STATE_MAX_ 4 - -/* The AP state values must be disjoint from the EXIT state values. */ -#define AP_CONN_STATE_MIN_ 5 -/** State for a SOCKS connection: waiting for SOCKS request. */ -#define AP_CONN_STATE_SOCKS_WAIT 5 -/** State for a SOCKS connection: got a y.onion URL; waiting to receive - * rendezvous descriptor. */ -#define AP_CONN_STATE_RENDDESC_WAIT 6 -/** The controller will attach this connection to a circuit; it isn't our - * job to do so. */ -#define AP_CONN_STATE_CONTROLLER_WAIT 7 -/** State for a SOCKS connection: waiting for a completed circuit. */ -#define AP_CONN_STATE_CIRCUIT_WAIT 8 -/** State for a SOCKS connection: sent BEGIN, waiting for CONNECTED. */ -#define AP_CONN_STATE_CONNECT_WAIT 9 -/** State for a SOCKS connection: sent RESOLVE, waiting for RESOLVED. */ -#define AP_CONN_STATE_RESOLVE_WAIT 10 -/** State for a SOCKS connection: ready to send and receive. */ -#define AP_CONN_STATE_OPEN 11 -/** State for a transparent natd connection: waiting for original - * destination. */ -#define AP_CONN_STATE_NATD_WAIT 12 -#define AP_CONN_STATE_MAX_ 12 - -/** True iff the AP_CONN_STATE_* value s means that the corresponding - * edge connection is not attached to any circuit. */ -#define AP_CONN_STATE_IS_UNATTACHED(s) \ - ((s) <= AP_CONN_STATE_CIRCUIT_WAIT || (s) == AP_CONN_STATE_NATD_WAIT) - -#define DIR_CONN_STATE_MIN_ 1 -/** State for connection to directory server: waiting for connect(). */ -#define DIR_CONN_STATE_CONNECTING 1 -/** State for connection to directory server: sending HTTP request. */ -#define DIR_CONN_STATE_CLIENT_SENDING 2 -/** State for connection to directory server: reading HTTP response. */ -#define DIR_CONN_STATE_CLIENT_READING 3 -/** State for connection to directory server: happy and finished. */ -#define DIR_CONN_STATE_CLIENT_FINISHED 4 -/** State for connection at directory server: waiting for HTTP request. */ -#define DIR_CONN_STATE_SERVER_COMMAND_WAIT 5 -/** State for connection at directory server: sending HTTP response. */ -#define DIR_CONN_STATE_SERVER_WRITING 6 -#define DIR_CONN_STATE_MAX_ 6 - -/** True iff the purpose of conn means that it's a server-side - * directory connection. */ -#define DIR_CONN_IS_SERVER(conn) ((conn)->purpose == DIR_PURPOSE_SERVER) - -#define CONTROL_CONN_STATE_MIN_ 1 -/** State for a control connection: Authenticated and accepting v1 commands. */ -#define CONTROL_CONN_STATE_OPEN 1 -/** State for a control connection: Waiting for authentication; speaking - * protocol v1. */ -#define CONTROL_CONN_STATE_NEEDAUTH 2 -#define CONTROL_CONN_STATE_MAX_ 2 - -#define DIR_PURPOSE_MIN_ 3 -/** A connection to a directory server: download a rendezvous - * descriptor. */ -#define DIR_PURPOSE_FETCH_RENDDESC 3 -/** A connection to a directory server: set after a rendezvous - * descriptor is downloaded. */ -#define DIR_PURPOSE_HAS_FETCHED_RENDDESC 4 -/** A connection to a directory server: download one or more server - * descriptors. */ -#define DIR_PURPOSE_FETCH_SERVERDESC 6 -/** A connection to a directory server: download one or more extra-info - * documents. */ -#define DIR_PURPOSE_FETCH_EXTRAINFO 7 -/** A connection to a directory server: upload a server descriptor. */ -#define DIR_PURPOSE_UPLOAD_DIR 8 -/** A connection to a directory server: upload a rendezvous - * descriptor. */ -#define DIR_PURPOSE_UPLOAD_RENDDESC 9 -/** A connection to a directory server: upload a v3 networkstatus vote. */ -#define DIR_PURPOSE_UPLOAD_VOTE 10 -/** A connection to a directory server: upload a v3 consensus signature */ -#define DIR_PURPOSE_UPLOAD_SIGNATURES 11 -/** A connection to a directory server: download one or more v3 networkstatus - * votes. */ -#define DIR_PURPOSE_FETCH_STATUS_VOTE 12 -/** A connection to a directory server: download a v3 detached signatures - * object for a consensus. */ -#define DIR_PURPOSE_FETCH_DETACHED_SIGNATURES 13 -/** A connection to a directory server: download a v3 networkstatus - * consensus. */ -#define DIR_PURPOSE_FETCH_CONSENSUS 14 -/** A connection to a directory server: download one or more directory - * authority certificates. */ -#define DIR_PURPOSE_FETCH_CERTIFICATE 15 - -/** Purpose for connection at a directory server. */ -#define DIR_PURPOSE_SERVER 16 -/** A connection to a hidden service directory server: upload a v2 rendezvous - * descriptor. */ -#define DIR_PURPOSE_UPLOAD_RENDDESC_V2 17 -/** A connection to a hidden service directory server: download a v2 rendezvous - * descriptor. */ -#define DIR_PURPOSE_FETCH_RENDDESC_V2 18 -/** A connection to a directory server: download a microdescriptor. */ -#define DIR_PURPOSE_FETCH_MICRODESC 19 -#define DIR_PURPOSE_MAX_ 19 - -/** True iff p is a purpose corresponding to uploading data to a - * directory server. */ -#define DIR_PURPOSE_IS_UPLOAD(p) \ - ((p)==DIR_PURPOSE_UPLOAD_DIR || \ - (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \ - (p)==DIR_PURPOSE_UPLOAD_VOTE || \ - (p)==DIR_PURPOSE_UPLOAD_SIGNATURES) - -#define EXIT_PURPOSE_MIN_ 1 -/** This exit stream wants to do an ordinary connect. */ -#define EXIT_PURPOSE_CONNECT 1 -/** This exit stream wants to do a resolve (either normal or reverse). */ -#define EXIT_PURPOSE_RESOLVE 2 -#define EXIT_PURPOSE_MAX_ 2 - -/* !!!! If any connection purpose is ever over 31, we must grow the type - * field in connection_t. */ - -/** Circuit state: I'm the origin, still haven't done all my handshakes. */ -#define CIRCUIT_STATE_BUILDING 0 -/** Circuit state: Waiting to process the onionskin. */ -#define CIRCUIT_STATE_ONIONSKIN_PENDING 1 -/** Circuit state: I'd like to deliver a create, but my n_chan is still - * connecting. */ -#define CIRCUIT_STATE_CHAN_WAIT 2 -/** Circuit state: onionskin(s) processed, ready to send/receive cells. */ -#define CIRCUIT_STATE_OPEN 3 - -#define CIRCUIT_PURPOSE_MIN_ 1 - -/* these circuits were initiated elsewhere */ -#define CIRCUIT_PURPOSE_OR_MIN_ 1 -/** OR-side circuit purpose: normal circuit, at OR. */ -#define CIRCUIT_PURPOSE_OR 1 -/** OR-side circuit purpose: At OR, from Bob, waiting for intro from Alices. */ -#define CIRCUIT_PURPOSE_INTRO_POINT 2 -/** OR-side circuit purpose: At OR, from Alice, waiting for Bob. */ -#define CIRCUIT_PURPOSE_REND_POINT_WAITING 3 -/** OR-side circuit purpose: At OR, both circuits have this purpose. */ -#define CIRCUIT_PURPOSE_REND_ESTABLISHED 4 -#define CIRCUIT_PURPOSE_OR_MAX_ 4 - -/* these circuits originate at this node */ - -/* here's how circ client-side purposes work: - * normal circuits are C_GENERAL. - * circuits that are c_introducing are either on their way to - * becoming open, or they are open and waiting for a - * suitable rendcirc before they send the intro. - * circuits that are c_introduce_ack_wait have sent the intro, - * but haven't gotten a response yet. - * circuits that are c_establish_rend are either on their way - * to becoming open, or they are open and have sent the - * establish_rendezvous cell but haven't received an ack. - * circuits that are c_rend_ready are open and have received a - * rend ack, but haven't heard from bob yet. if they have a - * buildstate->pending_final_cpath then they're expecting a - * cell from bob, else they're not. - * circuits that are c_rend_ready_intro_acked are open, and - * some intro circ has sent its intro and received an ack. - * circuits that are c_rend_joined are open, have heard from - * bob, and are talking to him. - */ -/** Client-side circuit purpose: Normal circuit, with cpath. */ -#define CIRCUIT_PURPOSE_C_GENERAL 5 -/** Client-side circuit purpose: at Alice, connecting to intro point. */ -#define CIRCUIT_PURPOSE_C_INTRODUCING 6 -/** Client-side circuit purpose: at Alice, sent INTRODUCE1 to intro point, - * waiting for ACK/NAK. */ -#define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7 -/** Client-side circuit purpose: at Alice, introduced and acked, closing. */ -#define CIRCUIT_PURPOSE_C_INTRODUCE_ACKED 8 -/** Client-side circuit purpose: at Alice, waiting for ack. */ -#define CIRCUIT_PURPOSE_C_ESTABLISH_REND 9 -/** Client-side circuit purpose: at Alice, waiting for Bob. */ -#define CIRCUIT_PURPOSE_C_REND_READY 10 -/** Client-side circuit purpose: at Alice, waiting for Bob, INTRODUCE - * has been acknowledged. */ -#define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11 -/** Client-side circuit purpose: at Alice, rendezvous established. */ -#define CIRCUIT_PURPOSE_C_REND_JOINED 12 -/** This circuit is used for build time measurement only */ -#define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT 13 -#define CIRCUIT_PURPOSE_C_MAX_ 13 -/** Hidden-service-side circuit purpose: at Bob, waiting for introductions. */ -#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 14 -/** Hidden-service-side circuit purpose: at Bob, successfully established - * intro. */ -#define CIRCUIT_PURPOSE_S_INTRO 15 -/** Hidden-service-side circuit purpose: at Bob, connecting to rend point. */ -#define CIRCUIT_PURPOSE_S_CONNECT_REND 16 -/** Hidden-service-side circuit purpose: at Bob, rendezvous established. */ -#define CIRCUIT_PURPOSE_S_REND_JOINED 17 -/** A testing circuit; not meant to be used for actual traffic. */ -#define CIRCUIT_PURPOSE_TESTING 18 -/** A controller made this circuit and Tor should not use it. */ -#define CIRCUIT_PURPOSE_CONTROLLER 19 -/** This circuit is used for path bias probing only */ -#define CIRCUIT_PURPOSE_PATH_BIAS_TESTING 20 -#define CIRCUIT_PURPOSE_MAX_ 20 -/** A catch-all for unrecognized purposes. Currently we don't expect - * to make or see any circuits with this purpose. */ -#define CIRCUIT_PURPOSE_UNKNOWN 255 - -/** True iff the circuit purpose p is for a circuit that - * originated at this node. */ -#define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>CIRCUIT_PURPOSE_OR_MAX_) -/** True iff the circuit purpose p is for a circuit that originated - * here to serve as a client. (Hidden services don't count here.) */ -#define CIRCUIT_PURPOSE_IS_CLIENT(p) \ - ((p)> CIRCUIT_PURPOSE_OR_MAX_ && \ - (p)<=CIRCUIT_PURPOSE_C_MAX_) -/** True iff the circuit_t c is actually an origin_circuit_t. */ -#define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose)) -/** True iff the circuit purpose p is for an established rendezvous - * circuit. */ -#define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \ - ((p) == CIRCUIT_PURPOSE_C_REND_JOINED || \ - (p) == CIRCUIT_PURPOSE_S_REND_JOINED) -/** True iff the circuit_t c is actually an or_circuit_t */ -#define CIRCUIT_IS_ORCIRC(c) (((circuit_t *)(c))->magic == OR_CIRCUIT_MAGIC) - -/** How many circuits do we want simultaneously in-progress to handle - * a given stream? */ -#define MIN_CIRCUITS_HANDLING_STREAM 2 - -/* These RELAY_COMMAND constants define values for relay cell commands, and -* must match those defined in tor-spec.txt. */ -#define RELAY_COMMAND_BEGIN 1 -#define RELAY_COMMAND_DATA 2 -#define RELAY_COMMAND_END 3 -#define RELAY_COMMAND_CONNECTED 4 -#define RELAY_COMMAND_SENDME 5 -#define RELAY_COMMAND_EXTEND 6 -#define RELAY_COMMAND_EXTENDED 7 -#define RELAY_COMMAND_TRUNCATE 8 -#define RELAY_COMMAND_TRUNCATED 9 -#define RELAY_COMMAND_DROP 10 -#define RELAY_COMMAND_RESOLVE 11 -#define RELAY_COMMAND_RESOLVED 12 -#define RELAY_COMMAND_BEGIN_DIR 13 -#define RELAY_COMMAND_EXTEND2 14 -#define RELAY_COMMAND_EXTENDED2 15 - -#define RELAY_COMMAND_ESTABLISH_INTRO 32 -#define RELAY_COMMAND_ESTABLISH_RENDEZVOUS 33 -#define RELAY_COMMAND_INTRODUCE1 34 -#define RELAY_COMMAND_INTRODUCE2 35 -#define RELAY_COMMAND_RENDEZVOUS1 36 -#define RELAY_COMMAND_RENDEZVOUS2 37 -#define RELAY_COMMAND_INTRO_ESTABLISHED 38 -#define RELAY_COMMAND_RENDEZVOUS_ESTABLISHED 39 -#define RELAY_COMMAND_INTRODUCE_ACK 40 - -/* Reasons why an OR connection is closed. */ -#define END_OR_CONN_REASON_DONE 1 -#define END_OR_CONN_REASON_REFUSED 2 /* connection refused */ -#define END_OR_CONN_REASON_OR_IDENTITY 3 -#define END_OR_CONN_REASON_CONNRESET 4 /* connection reset by peer */ -#define END_OR_CONN_REASON_TIMEOUT 5 -#define END_OR_CONN_REASON_NO_ROUTE 6 /* no route to host/net */ -#define END_OR_CONN_REASON_IO_ERROR 7 /* read/write error */ -#define END_OR_CONN_REASON_RESOURCE_LIMIT 8 /* sockets, buffers, etc */ -#define END_OR_CONN_REASON_MISC 9 - -/* Reasons why we (or a remote OR) might close a stream. See tor-spec.txt for - * documentation of these. The values must match. */ -#define END_STREAM_REASON_MISC 1 -#define END_STREAM_REASON_RESOLVEFAILED 2 -#define END_STREAM_REASON_CONNECTREFUSED 3 -#define END_STREAM_REASON_EXITPOLICY 4 -#define END_STREAM_REASON_DESTROY 5 -#define END_STREAM_REASON_DONE 6 -#define END_STREAM_REASON_TIMEOUT 7 -#define END_STREAM_REASON_NOROUTE 8 -#define END_STREAM_REASON_HIBERNATING 9 -#define END_STREAM_REASON_INTERNAL 10 -#define END_STREAM_REASON_RESOURCELIMIT 11 -#define END_STREAM_REASON_CONNRESET 12 -#define END_STREAM_REASON_TORPROTOCOL 13 -#define END_STREAM_REASON_NOTDIRECTORY 14 -#define END_STREAM_REASON_ENTRYPOLICY 15 - -/* These high-numbered end reasons are not part of the official spec, - * and are not intended to be put in relay end cells. They are here - * to be more informative when sending back socks replies to the - * application. */ -/* XXXX 256 is no longer used; feel free to reuse it. */ -/** We were unable to attach the connection to any circuit at all. */ -/* XXXX the ways we use this one don't make a lot of sense. */ -#define END_STREAM_REASON_CANT_ATTACH 257 -/** We can't connect to any directories at all, so we killed our streams - * before they can time out. */ -#define END_STREAM_REASON_NET_UNREACHABLE 258 -/** This is a SOCKS connection, and the client used (or misused) the SOCKS - * protocol in a way we couldn't handle. */ -#define END_STREAM_REASON_SOCKSPROTOCOL 259 -/** This is a transparent proxy connection, but we can't extract the original - * target address:port. */ -#define END_STREAM_REASON_CANT_FETCH_ORIG_DEST 260 -/** This is a connection on the NATD port, and the destination IP:Port was - * either ill-formed or out-of-range. */ -#define END_STREAM_REASON_INVALID_NATD_DEST 261 -/** The target address is in a private network (like 127.0.0.1 or 10.0.0.1); - * you don't want to do that over a randomly chosen exit */ -#define END_STREAM_REASON_PRIVATE_ADDR 262 - -/** Bitwise-and this value with endreason to mask out all flags. */ -#define END_STREAM_REASON_MASK 511 - -/** Bitwise-or this with the argument to control_event_stream_status - * to indicate that the reason came from an END cell. */ -#define END_STREAM_REASON_FLAG_REMOTE 512 -/** Bitwise-or this with the argument to control_event_stream_status - * to indicate that we already sent a CLOSED stream event. */ -#define END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED 1024 -/** Bitwise-or this with endreason to indicate that we already sent - * a socks reply, and no further reply needs to be sent from - * connection_mark_unattached_ap(). */ -#define END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED 2048 - -/** Reason for remapping an AP connection's address: we have a cached - * answer. */ -#define REMAP_STREAM_SOURCE_CACHE 1 -/** Reason for remapping an AP connection's address: the exit node told us an - * answer. */ -#define REMAP_STREAM_SOURCE_EXIT 2 - -/* 'type' values to use in RESOLVED cells. Specified in tor-spec.txt. */ -#define RESOLVED_TYPE_HOSTNAME 0 -#define RESOLVED_TYPE_IPV4 4 -#define RESOLVED_TYPE_IPV6 6 -#define RESOLVED_TYPE_ERROR_TRANSIENT 0xF0 -#define RESOLVED_TYPE_ERROR 0xF1 - -/* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE - * call; they only go to the controller for tracking */ -/** Our post-timeout circuit time measurement period expired. - * We must give up now */ -#define END_CIRC_REASON_MEASUREMENT_EXPIRED -3 - -/** We couldn't build a path for this circuit. */ -#define END_CIRC_REASON_NOPATH -2 -/** Catch-all "other" reason for closing origin circuits. */ -#define END_CIRC_AT_ORIGIN -1 - -/* Reasons why we (or a remote OR) might close a circuit. See tor-spec.txt for - * documentation of these. */ -#define END_CIRC_REASON_MIN_ 0 -#define END_CIRC_REASON_NONE 0 -#define END_CIRC_REASON_TORPROTOCOL 1 -#define END_CIRC_REASON_INTERNAL 2 -#define END_CIRC_REASON_REQUESTED 3 -#define END_CIRC_REASON_HIBERNATING 4 -#define END_CIRC_REASON_RESOURCELIMIT 5 -#define END_CIRC_REASON_CONNECTFAILED 6 -#define END_CIRC_REASON_OR_IDENTITY 7 -#define END_CIRC_REASON_CHANNEL_CLOSED 8 -#define END_CIRC_REASON_FINISHED 9 -#define END_CIRC_REASON_TIMEOUT 10 -#define END_CIRC_REASON_DESTROYED 11 -#define END_CIRC_REASON_NOSUCHSERVICE 12 -#define END_CIRC_REASON_MAX_ 12 - -/** Bitwise-OR this with the argument to circuit_mark_for_close() or - * control_event_circuit_status() to indicate that the reason was - * passed through from a destroy or truncate cell. */ -#define END_CIRC_REASON_FLAG_REMOTE 512 - -/** Length of 'y' portion of 'y.onion' URL. */ -#define REND_SERVICE_ID_LEN_BASE32 16 - -/** Length of 'y.onion' including '.onion' URL. */ -#define REND_SERVICE_ADDRESS_LEN (16+1+5) - -/** Length of a binary-encoded rendezvous service ID. */ -#define REND_SERVICE_ID_LEN 10 - -/** Time period for which a v2 descriptor will be valid. */ -#define REND_TIME_PERIOD_V2_DESC_VALIDITY (24*60*60) - -/** Time period within which two sets of v2 descriptors will be uploaded in - * parallel. */ -#define REND_TIME_PERIOD_OVERLAPPING_V2_DESCS (60*60) - -/** Number of non-consecutive replicas (i.e. distributed somewhere - * in the ring) for a descriptor. */ -#define REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS 2 - -/** Number of consecutive replicas for a descriptor. */ -#define REND_NUMBER_OF_CONSECUTIVE_REPLICAS 3 - -/** Length of v2 descriptor ID (32 base32 chars = 160 bits). */ -#define REND_DESC_ID_V2_LEN_BASE32 32 - -/** Length of the base32-encoded secret ID part of versioned hidden service - * descriptors. */ -#define REND_SECRET_ID_PART_LEN_BASE32 32 - -/** Length of the base32-encoded hash of an introduction point's - * identity key. */ -#define REND_INTRO_POINT_ID_LEN_BASE32 32 - -/** Length of the descriptor cookie that is used for client authorization - * to hidden services. */ -#define REND_DESC_COOKIE_LEN 16 - -/** Length of the base64-encoded descriptor cookie that is used for - * exchanging client authorization between hidden service and client. */ -#define REND_DESC_COOKIE_LEN_BASE64 22 - -/** Length of client identifier in encrypted introduction points for hidden - * service authorization type 'basic'. */ -#define REND_BASIC_AUTH_CLIENT_ID_LEN 4 - -/** Multiple of the number of clients to which the real number of clients - * is padded with fake clients for hidden service authorization type - * 'basic'. */ -#define REND_BASIC_AUTH_CLIENT_MULTIPLE 16 - -/** Length of client entry consisting of client identifier and encrypted - * session key for hidden service authorization type 'basic'. */ -#define REND_BASIC_AUTH_CLIENT_ENTRY_LEN (REND_BASIC_AUTH_CLIENT_ID_LEN \ - + CIPHER_KEY_LEN) - -/** Maximum size of v2 hidden service descriptors. */ -#define REND_DESC_MAX_SIZE (20 * 1024) - -/** Legal characters for use in authorized client names for a hidden - * service. */ -#define REND_LEGAL_CLIENTNAME_CHARACTERS \ - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-_" - -/** Maximum length of authorized client names for a hidden service. */ -#define REND_CLIENTNAME_MAX_LEN 16 - -/** Length of the rendezvous cookie that is used to connect circuits at the - * rendezvous point. */ -#define REND_COOKIE_LEN DIGEST_LEN - -/** Client authorization type that a hidden service performs. */ -typedef enum rend_auth_type_t { - REND_NO_AUTH = 0, - REND_BASIC_AUTH = 1, - REND_STEALTH_AUTH = 2, -} rend_auth_type_t; - -/** Client-side configuration of authorization for a hidden service. */ -typedef struct rend_service_authorization_t { - char descriptor_cookie[REND_DESC_COOKIE_LEN]; - char onion_address[REND_SERVICE_ADDRESS_LEN+1]; - rend_auth_type_t auth_type; -} rend_service_authorization_t; - -/** Client- and server-side data that is used for hidden service connection - * establishment. Not all fields contain data depending on where this struct - * is used. */ -typedef struct rend_data_t { - /** Onion address (without the .onion part) that a client requests. */ - char onion_address[REND_SERVICE_ID_LEN_BASE32+1]; - - /** (Optional) descriptor cookie that is used by a client. */ - char descriptor_cookie[REND_DESC_COOKIE_LEN]; - - /** Authorization type for accessing a service used by a client. */ - rend_auth_type_t auth_type; - - /** Hash of the hidden service's PK used by a service. */ - char rend_pk_digest[DIGEST_LEN]; - - /** Rendezvous cookie used by both, client and service. */ - char rend_cookie[REND_COOKIE_LEN]; -} rend_data_t; - -/** Time interval for tracking replays of DH public keys received in - * INTRODUCE2 cells. Used only to avoid launching multiple - * simultaneous attempts to connect to the same rendezvous point. */ -#define REND_REPLAY_TIME_INTERVAL (5 * 60) - -/** Used to indicate which way a cell is going on a circuit. */ -typedef enum { - CELL_DIRECTION_IN=1, /**< The cell is moving towards the origin. */ - CELL_DIRECTION_OUT=2, /**< The cell is moving away from the origin. */ -} cell_direction_t; - -/** Initial value for both sides of a circuit transmission window when the - * circuit is initialized. Measured in cells. */ -#define CIRCWINDOW_START 1000 -#define CIRCWINDOW_START_MIN 100 -#define CIRCWINDOW_START_MAX 1000 -/** Amount to increment a circuit window when we get a circuit SENDME. */ -#define CIRCWINDOW_INCREMENT 100 -/** Initial value on both sides of a stream transmission window when the - * stream is initialized. Measured in cells. */ -#define STREAMWINDOW_START 500 -/** Amount to increment a stream window when we get a stream SENDME. */ -#define STREAMWINDOW_INCREMENT 50 - -/** Maximum number of queued cells on a circuit for which we are the - * midpoint before we give up and kill it. This must be >= circwindow - * to avoid killing innocent circuits, and >= circwindow*2 to give - * leaky-pipe a chance of working someday. The ORCIRC_MAX_MIDDLE_KILL_THRESH - * ratio controls the margin of error between emitting a warning and - * killing the circuit. - */ -#define ORCIRC_MAX_MIDDLE_CELLS (CIRCWINDOW_START_MAX*2) -/** Ratio of hard (circuit kill) to soft (warning) thresholds for the - * ORCIRC_MAX_MIDDLE_CELLS tests. - */ -#define ORCIRC_MAX_MIDDLE_KILL_THRESH (1.1f) - -/* Cell commands. These values are defined in tor-spec.txt. */ -#define CELL_PADDING 0 -#define CELL_CREATE 1 -#define CELL_CREATED 2 -#define CELL_RELAY 3 -#define CELL_DESTROY 4 -#define CELL_CREATE_FAST 5 -#define CELL_CREATED_FAST 6 -#define CELL_VERSIONS 7 -#define CELL_NETINFO 8 -#define CELL_RELAY_EARLY 9 -#define CELL_CREATE2 10 -#define CELL_CREATED2 11 - -#define CELL_VPADDING 128 -#define CELL_CERTS 129 -#define CELL_AUTH_CHALLENGE 130 -#define CELL_AUTHENTICATE 131 -#define CELL_AUTHORIZE 132 -#define CELL_COMMAND_MAX_ 132 - -/** How long to test reachability before complaining to the user. */ -#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT (20*60) - -/** Legal characters in a nickname. */ -#define LEGAL_NICKNAME_CHARACTERS \ - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - -/** Name to use in client TLS certificates if no nickname is given. Once - * Tor 0.1.2.x is obsolete, we can remove this. */ -#define DEFAULT_CLIENT_NICKNAME "client" - -/** Name chosen by routers that don't configure nicknames */ -#define UNNAMED_ROUTER_NICKNAME "Unnamed" - -/** Number of bytes in a SOCKS4 header. */ -#define SOCKS4_NETWORK_LEN 8 - -/* - * Relay payload: - * Relay command [1 byte] - * Recognized [2 bytes] - * Stream ID [2 bytes] - * Partial SHA-1 [4 bytes] - * Length [2 bytes] - * Relay payload [498 bytes] - */ - -/** Number of bytes in a cell, minus cell header. */ -#define CELL_PAYLOAD_SIZE 509 -/** Number of bytes in a cell transmitted over the network, in the longest - * form */ -#define CELL_MAX_NETWORK_SIZE 514 - -/** Maximum length of a header on a variable-length cell. */ -#define VAR_CELL_MAX_HEADER_SIZE 7 - -static int get_cell_network_size(int wide_circ_ids); -static INLINE int get_cell_network_size(int wide_circ_ids) -{ - return wide_circ_ids ? CELL_MAX_NETWORK_SIZE : CELL_MAX_NETWORK_SIZE - 2; -} -static int get_var_cell_header_size(int wide_circ_ids); -static INLINE int get_var_cell_header_size(int wide_circ_ids) -{ - return wide_circ_ids ? VAR_CELL_MAX_HEADER_SIZE : - VAR_CELL_MAX_HEADER_SIZE - 2; -} -static int get_circ_id_size(int wide_circ_ids); -static INLINE int get_circ_id_size(int wide_circ_ids) -{ - return wide_circ_ids ? 4 : 2; -} - -/** Number of bytes in a relay cell's header (not including general cell - * header). */ -#define RELAY_HEADER_SIZE (1+2+2+4+2) -/** Largest number of bytes that can fit in a relay cell payload. */ -#define RELAY_PAYLOAD_SIZE (CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE) - -/** Identifies a circuit on an or_connection */ -typedef uint32_t circid_t; -/** Identifies a stream on a circuit */ -typedef uint16_t streamid_t; - -/* channel_t typedef; struct channel_s is in channel.h */ - -typedef struct channel_s channel_t; - -/* channel_listener_t typedef; struct channel_listener_s is in channel.h */ - -typedef struct channel_listener_s channel_listener_t; - -/* channel states for channel_t */ - -typedef enum { - /* - * Closed state - channel is inactive - * - * Permitted transitions from: - * - CHANNEL_STATE_CLOSING - * Permitted transitions to: - * - CHANNEL_STATE_OPENING - */ - CHANNEL_STATE_CLOSED = 0, - /* - * Opening state - channel is trying to connect - * - * Permitted transitions from: - * - CHANNEL_STATE_CLOSED - * Permitted transitions to: - * - CHANNEL_STATE_CLOSING - * - CHANNEL_STATE_ERROR - * - CHANNEL_STATE_OPEN - */ - CHANNEL_STATE_OPENING, - /* - * Open state - channel is active and ready for use - * - * Permitted transitions from: - * - CHANNEL_STATE_MAINT - * - CHANNEL_STATE_OPENING - * Permitted transitions to: - * - CHANNEL_STATE_CLOSING - * - CHANNEL_STATE_ERROR - * - CHANNEL_STATE_MAINT - */ - CHANNEL_STATE_OPEN, - /* - * Maintenance state - channel is temporarily offline for subclass specific - * maintenance activities such as TLS renegotiation. - * - * Permitted transitions from: - * - CHANNEL_STATE_OPEN - * Permitted transitions to: - * - CHANNEL_STATE_CLOSING - * - CHANNEL_STATE_ERROR - * - CHANNEL_STATE_OPEN - */ - CHANNEL_STATE_MAINT, - /* - * Closing state - channel is shutting down - * - * Permitted transitions from: - * - CHANNEL_STATE_MAINT - * - CHANNEL_STATE_OPEN - * Permitted transitions to: - * - CHANNEL_STATE_CLOSED, - * - CHANNEL_STATE_ERROR - */ - CHANNEL_STATE_CLOSING, - /* - * Error state - channel has experienced a permanent error - * - * Permitted transitions from: - * - CHANNEL_STATE_CLOSING - * - CHANNEL_STATE_MAINT - * - CHANNEL_STATE_OPENING - * - CHANNEL_STATE_OPEN - * Permitted transitions to: - * - None - */ - CHANNEL_STATE_ERROR, - /* - * Placeholder for maximum state value - */ - CHANNEL_STATE_LAST -} channel_state_t; - -/* channel listener states for channel_listener_t */ - -typedef enum { - /* - * Closed state - channel listener is inactive - * - * Permitted transitions from: - * - CHANNEL_LISTENER_STATE_CLOSING - * Permitted transitions to: - * - CHANNEL_LISTENER_STATE_LISTENING - */ - CHANNEL_LISTENER_STATE_CLOSED = 0, - /* - * Listening state - channel listener is listening for incoming - * connections - * - * Permitted transitions from: - * - CHANNEL_LISTENER_STATE_CLOSED - * Permitted transitions to: - * - CHANNEL_LISTENER_STATE_CLOSING - * - CHANNEL_LISTENER_STATE_ERROR - */ - CHANNEL_LISTENER_STATE_LISTENING, - /* - * Closing state - channel listener is shutting down - * - * Permitted transitions from: - * - CHANNEL_LISTENER_STATE_LISTENING - * Permitted transitions to: - * - CHANNEL_LISTENER_STATE_CLOSED, - * - CHANNEL_LISTENER_STATE_ERROR - */ - CHANNEL_LISTENER_STATE_CLOSING, - /* - * Error state - channel listener has experienced a permanent error - * - * Permitted transitions from: - * - CHANNEL_STATE_CLOSING - * - CHANNEL_STATE_LISTENING - * Permitted transitions to: - * - None - */ - CHANNEL_LISTENER_STATE_ERROR, - /* - * Placeholder for maximum state value - */ - CHANNEL_LISTENER_STATE_LAST -} channel_listener_state_t; - -/* TLS channel stuff */ - -typedef struct channel_tls_s channel_tls_t; - -/* circuitmux_t typedef; struct circuitmux_s is in circuitmux.h */ - -typedef struct circuitmux_s circuitmux_t; - -/** Parsed onion routing cell. All communication between nodes - * is via cells. */ -typedef struct cell_t { - circid_t circ_id; /**< Circuit which received the cell. */ - uint8_t command; /**< Type of the cell: one of CELL_PADDING, CELL_CREATE, - * CELL_DESTROY, etc */ - uint8_t payload[CELL_PAYLOAD_SIZE]; /**< Cell body. */ -} cell_t; - -/** Parsed variable-length onion routing cell. */ -typedef struct var_cell_t { - /** Type of the cell: CELL_VERSIONS, etc. */ - uint8_t command; - /** Circuit thich received the cell */ - circid_t circ_id; - /** Number of bytes actually stored in payload */ - uint16_t payload_len; - /** Payload of this cell */ - uint8_t payload[FLEXIBLE_ARRAY_MEMBER]; -} var_cell_t; - -/** A parsed Extended ORPort message. */ -typedef struct ext_or_cmd_t { - uint16_t cmd; /** Command type */ - uint16_t len; /** Body length */ - char body[FLEXIBLE_ARRAY_MEMBER]; /** Message body */ -} ext_or_cmd_t; - -/** A cell as packed for writing to the network. */ -typedef struct packed_cell_t { - /** Next cell queued on this circuit. */ - TOR_SIMPLEQ_ENTRY(packed_cell_t) next; - char body[CELL_MAX_NETWORK_SIZE]; /**< Cell as packed for network. */ - uint32_t inserted_time; /**< Time (in milliseconds since epoch, with high - * bits truncated) when this cell was inserted. */ -} packed_cell_t; - -/* XXXX This next structure may be obsoleted by inserted_time in - * packed_cell_t */ - -/** Number of cells added to a circuit queue including their insertion - * time on 10 millisecond detail; used for buffer statistics. */ -typedef struct insertion_time_elem_t { - struct insertion_time_elem_t *next; /**< Next element in queue. */ - uint32_t insertion_time; /**< When were cells inserted (in 10 ms steps - * starting at 0:00 of the current day)? */ - unsigned counter; /**< How many cells were inserted? */ -} insertion_time_elem_t; - -/** Queue of insertion times. */ -typedef struct insertion_time_queue_t { - struct insertion_time_elem_t *first; /**< First element in queue. */ - struct insertion_time_elem_t *last; /**< Last element in queue. */ -} insertion_time_queue_t; - -/** Number of cells with the same command consecutively added to a circuit - * queue; used for cell statistics only if CELL_STATS events are enabled. */ -typedef struct insertion_command_elem_t { - struct insertion_command_elem_t *next; /**< Next element in queue. */ - /** Which command did these consecutively added cells have? */ - uint8_t command; - unsigned counter; /**< How many cells were inserted? */ -} insertion_command_elem_t; - -/** Queue of insertion commands. */ -typedef struct insertion_command_queue_t { - struct insertion_command_elem_t *first; /**< First element in queue. */ - struct insertion_command_elem_t *last; /**< Last element in queue. */ -} insertion_command_queue_t; - -/** A queue of cells on a circuit, waiting to be added to the - * or_connection_t's outbuf. */ -typedef struct cell_queue_t { - /** Linked list of packed_cell_t*/ - TOR_SIMPLEQ_HEAD(cell_simpleq, packed_cell_t) head; - int n; /**< The number of cells in the queue. */ - insertion_time_queue_t *insertion_times; /**< Insertion times of cells. */ - /** Commands of inserted cells. */ - insertion_command_queue_t *insertion_commands; -} cell_queue_t; - -/** Beginning of a RELAY cell payload. */ -typedef struct { - uint8_t command; /**< The end-to-end relay command. */ - uint16_t recognized; /**< Used to tell whether cell is for us. */ - streamid_t stream_id; /**< Which stream is this cell associated with? */ - char integrity[4]; /**< Used to tell whether cell is corrupted. */ - uint16_t length; /**< How long is the payload body? */ -} relay_header_t; - -typedef struct buf_t buf_t; -typedef struct socks_request_t socks_request_t; -#ifdef USE_BUFFEREVENTS -#define generic_buffer_t struct evbuffer -#else -#define generic_buffer_t buf_t -#endif - -/* Values for connection_t.magic: used to make sure that downcasts (casts from -* connection_t to foo_connection_t) are safe. */ -#define BASE_CONNECTION_MAGIC 0x7C3C304Eu -#define OR_CONNECTION_MAGIC 0x7D31FF03u -#define EDGE_CONNECTION_MAGIC 0xF0374013u -#define ENTRY_CONNECTION_MAGIC 0xbb4a5703 -#define DIR_CONNECTION_MAGIC 0x9988ffeeu -#define CONTROL_CONNECTION_MAGIC 0x8abc765du -#define LISTENER_CONNECTION_MAGIC 0x1a1ac741u - -/** Description of a connection to another host or process, and associated - * data. - * - * A connection is named based on what it's connected to -- an "OR - * connection" has a Tor node on the other end, an "exit - * connection" has a website or other server on the other end, and an - * "AP connection" has an application proxy (and thus a user) on the - * other end. - * - * Every connection has a type and a state. Connections never change - * their type, but can go through many state changes in their lifetime. - * - * Every connection has two associated input and output buffers. - * Listeners don't use them. For non-listener connections, incoming - * data is appended to conn->inbuf, and outgoing data is taken from - * conn->outbuf. Connections differ primarily in the functions called - * to fill and drain these buffers. - */ -typedef struct connection_t { - uint32_t magic; /**< For memory debugging: must equal one of - * *_CONNECTION_MAGIC. */ - - uint8_t state; /**< Current state of this connection. */ - unsigned int type:5; /**< What kind of connection is this? */ - unsigned int purpose:5; /**< Only used for DIR and EXIT types currently. */ - - /* The next fields are all one-bit booleans. Some are only applicable to - * connection subtypes, but we hold them here anyway, to save space. - */ - unsigned int read_blocked_on_bw:1; /**< Boolean: should we start reading - * again once the bandwidth throttler allows it? */ - unsigned int write_blocked_on_bw:1; /**< Boolean: should we start writing - * again once the bandwidth throttler allows - * writes? */ - unsigned int hold_open_until_flushed:1; /**< Despite this connection's being - * marked for close, do we flush it - * before closing it? */ - unsigned int inbuf_reached_eof:1; /**< Boolean: did read() return 0 on this - * conn? */ - /** Set to 1 when we're inside connection_flushed_some to keep us from - * calling connection_handle_write() recursively. */ - unsigned int in_flushed_some:1; - /** True if connection_handle_write is currently running on this connection. - */ - unsigned int in_connection_handle_write:1; - - /* For linked connections: - */ - unsigned int linked:1; /**< True if there is, or has been, a linked_conn. */ - /** True iff we'd like to be notified about read events from the - * linked conn. */ - unsigned int reading_from_linked_conn:1; - /** True iff we're willing to write to the linked conn. */ - unsigned int writing_to_linked_conn:1; - /** True iff we're currently able to read on the linked conn, and our - * read_event should be made active with libevent. */ - unsigned int active_on_link:1; - /** True iff we've called connection_close_immediate() on this linked - * connection. */ - unsigned int linked_conn_is_closed:1; - - /** CONNECT/SOCKS proxy client handshake state (for outgoing connections). */ - unsigned int proxy_state:4; - - /** Our socket; set to TOR_INVALID_SOCKET if this connection is closed, - * or has no socket. */ - tor_socket_t s; - int conn_array_index; /**< Index into the global connection array. */ - - struct event *read_event; /**< Libevent event structure. */ - struct event *write_event; /**< Libevent event structure. */ - buf_t *inbuf; /**< Buffer holding data read over this connection. */ - buf_t *outbuf; /**< Buffer holding data to write over this connection. */ - size_t outbuf_flushlen; /**< How much data should we try to flush from the - * outbuf? */ - time_t timestamp_lastread; /**< When was the last time libevent said we could - * read? */ - time_t timestamp_lastwritten; /**< When was the last time libevent said we - * could write? */ - -#ifdef USE_BUFFEREVENTS - struct bufferevent *bufev; /**< A Libevent buffered IO structure. */ -#endif - - time_t timestamp_created; /**< When was this connection_t created? */ - - /* XXXX_IP6 make this IPv6-capable */ - int socket_family; /**< Address family of this connection's socket. Usually - * AF_INET, but it can also be AF_UNIX, or in the future - * AF_INET6 */ - tor_addr_t addr; /**< IP of the other side of the connection; used to - * identify routers, along with port. */ - uint16_t port; /**< If non-zero, port on the other end - * of the connection. */ - uint16_t marked_for_close; /**< Should we close this conn on the next - * iteration of the main loop? (If true, holds - * the line number where this connection was - * marked.) */ - const char *marked_for_close_file; /**< For debugging: in which file were - * we marked for close? */ - char *address; /**< FQDN (or IP) of the guy on the other end. - * strdup into this, because free_connection() frees it. */ - /** Another connection that's connected to this one in lieu of a socket. */ - struct connection_t *linked_conn; - - /** Unique identifier for this connection on this Tor instance. */ - uint64_t global_identifier; - - /** Bytes read since last call to control_event_conn_bandwidth_used(). - * Only used if we're configured to emit CONN_BW events. */ - uint32_t n_read_conn_bw; - - /** Bytes written since last call to control_event_conn_bandwidth_used(). - * Only used if we're configured to emit CONN_BW events. */ - uint32_t n_written_conn_bw; -} connection_t; - -/** Subtype of connection_t; used for a listener socket. */ -typedef struct listener_connection_t { - connection_t base_; - - /** If the connection is a CONN_TYPE_AP_DNS_LISTENER, this field points - * to the evdns_server_port it uses to listen to and answer connections. */ - struct evdns_server_port *dns_server_port; - - /** @name Isolation parameters - * - * For an AP listener, these fields describe how to isolate streams that - * arrive on the listener. - * - * @{ - */ - /** The session group for this listener. */ - int session_group; - /** One or more ISO_ flags to describe how to isolate streams. */ - uint8_t isolation_flags; - /**@}*/ - /** For SOCKS connections only: If this is set, we will choose "no - * authentication" instead of "username/password" authentication if both - * are offered. Used as input to parse_socks. */ - unsigned int socks_prefer_no_auth : 1; - - /** For a SOCKS listeners, these fields describe whether we should - * allow IPv4 and IPv6 addresses from our exit nodes, respectively. - * - * @{ - */ - unsigned int socks_ipv4_traffic : 1; - unsigned int socks_ipv6_traffic : 1; - /** @} */ - /** For a socks listener: should we tell the exit that we prefer IPv6 - * addresses? */ - unsigned int socks_prefer_ipv6 : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; - -} listener_connection_t; - -/** Minimum length of the random part of an AUTH_CHALLENGE cell. */ -#define OR_AUTH_CHALLENGE_LEN 32 - -/** - * @name Certificate types for CERTS cells. - * - * These values are defined by the protocol, and affect how an X509 - * certificate in a CERTS cell is interpreted and used. - * - * @{ */ -/** A certificate that authenticates a TLS link key. The subject key - * must match the key used in the TLS handshake; it must be signed by - * the identity key. */ -#define OR_CERT_TYPE_TLS_LINK 1 -/** A self-signed identity certificate. The subject key must be a - * 1024-bit RSA key. */ -#define OR_CERT_TYPE_ID_1024 2 -/** A certificate that authenticates a key used in an AUTHENTICATE cell - * in the v3 handshake. The subject key must be a 1024-bit RSA key; it - * must be signed by the identity key */ -#define OR_CERT_TYPE_AUTH_1024 3 -/**@}*/ - -/** The one currently supported type of AUTHENTICATE cell. It contains - * a bunch of structures signed with an RSA1024 key. The signed - * structures include a HMAC using negotiated TLS secrets, and a digest - * of all cells sent or received before the AUTHENTICATE cell (including - * the random server-generated AUTH_CHALLENGE cell). - */ -#define AUTHTYPE_RSA_SHA256_TLSSECRET 1 - -/** The length of the part of the AUTHENTICATE cell body that the client and - * server can generate independently (when using RSA_SHA256_TLSSECRET). It - * contains everything except the client's timestamp, the client's randomly - * generated nonce, and the signature. */ -#define V3_AUTH_FIXED_PART_LEN (8+(32*6)) -/** The length of the part of the AUTHENTICATE cell body that the client - * signs. */ -#define V3_AUTH_BODY_LEN (V3_AUTH_FIXED_PART_LEN + 8 + 16) - -/** Stores flags and information related to the portion of a v2/v3 Tor OR - * connection handshake that happens after the TLS handshake is finished. - */ -typedef struct or_handshake_state_t { - /** When was the VERSIONS cell sent on this connection? Used to get - * an estimate of the skew in the returning NETINFO reply. */ - time_t sent_versions_at; - /** True iff we originated this connection */ - unsigned int started_here : 1; - /** True iff we have received and processed a VERSIONS cell. */ - unsigned int received_versions : 1; - /** True iff we have received and processed an AUTH_CHALLENGE cell */ - unsigned int received_auth_challenge : 1; - /** True iff we have received and processed a CERTS cell. */ - unsigned int received_certs_cell : 1; - /** True iff we have received and processed an AUTHENTICATE cell */ - unsigned int received_authenticate : 1; - - /* True iff we've received valid authentication to some identity. */ - unsigned int authenticated : 1; - - /* True iff we have sent a netinfo cell */ - unsigned int sent_netinfo : 1; - - /** True iff we should feed outgoing cells into digest_sent and - * digest_received respectively. - * - * From the server's side of the v3 handshake, we want to capture everything - * from the VERSIONS cell through and including the AUTH_CHALLENGE cell. - * From the client's, we want to capture everything from the VERSIONS cell - * through but *not* including the AUTHENTICATE cell. - * - * @{ */ - unsigned int digest_sent_data : 1; - unsigned int digest_received_data : 1; - /**@}*/ - - /** Identity digest that we have received and authenticated for our peer - * on this connection. */ - uint8_t authenticated_peer_id[DIGEST_LEN]; - - /** Digests of the cells that we have sent or received as part of a V3 - * handshake. Used for making and checking AUTHENTICATE cells. - * - * @{ - */ - crypto_digest_t *digest_sent; - crypto_digest_t *digest_received; - /** @} */ - - /** Certificates that a connection initiator sent us in a CERTS cell; we're - * holding on to them until we get an AUTHENTICATE cell. - * - * @{ - */ - /** The cert for the key that's supposed to sign the AUTHENTICATE cell */ - tor_cert_t *auth_cert; - /** A self-signed identity certificate */ - tor_cert_t *id_cert; - /**@}*/ -} or_handshake_state_t; - -/** Length of Extended ORPort connection identifier. */ -#define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */ - -/** Subtype of connection_t for an "OR connection" -- that is, one that speaks - * cells over TLS. */ -typedef struct or_connection_t { - connection_t base_; - - /** Hash of the public RSA key for the other side's identity key, or zeroes - * if the other side hasn't shown us a valid identity key. */ - char identity_digest[DIGEST_LEN]; - - /** Extended ORPort connection identifier. */ - char *ext_or_conn_id; - /** This is the ClientHash value we expect to receive from the - * client during the Extended ORPort authentication protocol. We - * compute it upon receiving the ClientNoce from the client, and we - * compare it with the acual ClientHash value sent by the - * client. */ - char *ext_or_auth_correct_client_hash; - /** String carrying the name of the pluggable transport - * (e.g. "obfs2") that is obfuscating this connection. If no - * pluggable transports are used, it's NULL. */ - char *ext_or_transport; - - char *nickname; /**< Nickname of OR on other side (if any). */ - - tor_tls_t *tls; /**< TLS connection state. */ - int tls_error; /**< Last tor_tls error code. */ - /** When we last used this conn for any client traffic. If not - * recent, we can rate limit it further. */ - - /* Channel using this connection */ - channel_tls_t *chan; - - tor_addr_t real_addr; /**< The actual address that this connection came from - * or went to. The addr field is prone to - * getting overridden by the address from the router - * descriptor matching identity_digest. */ - - /** Should this connection be used for extending circuits to the server - * matching the identity_digest field? Set to true if we're pretty - * sure we aren't getting MITMed, either because we're connected to an - * address listed in a server descriptor, or because an authenticated - * NETINFO cell listed the address we're connected to as recognized. */ - unsigned int is_canonical:1; - - /** True iff we have decided that the other end of this connection - * is a client. Connections with this flag set should never be used - * to satisfy an EXTEND request. */ - unsigned int is_connection_with_client:1; - /** True iff this is an outgoing connection. */ - unsigned int is_outgoing:1; - unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ - unsigned int wide_circ_ids:1; - uint16_t link_proto; /**< What protocol version are we using? 0 for - * "none negotiated yet." */ - - or_handshake_state_t *handshake_state; /**< If we are setting this connection - * up, state information to do so. */ - - time_t timestamp_lastempty; /**< When was the outbuf last completely empty?*/ - time_t timestamp_last_added_nonpadding; /** When did we last add a - * non-padding cell to the outbuf? */ - - /* bandwidth* and *_bucket only used by ORs in OPEN state: */ - int bandwidthrate; /**< Bytes/s added to the bucket. (OPEN ORs only.) */ - int bandwidthburst; /**< Max bucket size for this conn. (OPEN ORs only.) */ -#ifndef USE_BUFFEREVENTS - int read_bucket; /**< When this hits 0, stop receiving. Every second we - * add 'bandwidthrate' to this, capping it at - * bandwidthburst. (OPEN ORs only) */ - int write_bucket; /**< When this hits 0, stop writing. Like read_bucket. */ -#else - /** A rate-limiting configuration object to determine how this connection - * set its read- and write- limits. */ - /* XXXX we could share this among all connections. */ - struct ev_token_bucket_cfg *bucket_cfg; -#endif - - struct or_connection_t *next_with_same_id; /**< Next connection with same - * identity digest as this one. */ - /** Last emptied read token bucket in msec since midnight; only used if - * TB_EMPTY events are enabled. */ - uint32_t read_emptied_time; - /** Last emptied write token bucket in msec since midnight; only used if - * TB_EMPTY events are enabled. */ - uint32_t write_emptied_time; -} or_connection_t; - -/** Subtype of connection_t for an "edge connection" -- that is, an entry (ap) - * connection, or an exit. */ -typedef struct edge_connection_t { - connection_t base_; - - struct edge_connection_t *next_stream; /**< Points to the next stream at this - * edge, if any */ - int package_window; /**< How many more relay cells can I send into the - * circuit? */ - int deliver_window; /**< How many more relay cells can end at me? */ - - struct circuit_t *on_circuit; /**< The circuit (if any) that this edge - * connection is using. */ - - /** A pointer to which node in the circ this conn exits at. Set for AP - * connections and for hidden service exit connections. */ - struct crypt_path_t *cpath_layer; - /** What rendezvous service are we querying for (if an AP) or providing (if - * an exit)? */ - rend_data_t *rend_data; - - uint32_t address_ttl; /**< TTL for address-to-addr mapping on exit - * connection. Exit connections only. */ - uint32_t begincell_flags; /** Flags sent or received in the BEGIN cell - * for this connection */ - - streamid_t stream_id; /**< The stream ID used for this edge connection on its - * circuit */ - - /** The reason why this connection is closing; passed to the controller. */ - uint16_t end_reason; - - /** Bytes read since last call to control_event_stream_bandwidth_used() */ - uint32_t n_read; - - /** Bytes written since last call to control_event_stream_bandwidth_used() */ - uint32_t n_written; - - /** True iff this connection is for a DNS request only. */ - unsigned int is_dns_request:1; - /** True iff this connection is for a PTR DNS request. (exit only) */ - unsigned int is_reverse_dns_lookup:1; - - unsigned int edge_has_sent_end:1; /**< For debugging; only used on edge - * connections. Set once we've set the stream end, - * and check in connection_about_to_close_connection(). - */ - /** True iff we've blocked reading until the circuit has fewer queued - * cells. */ - unsigned int edge_blocked_on_circ:1; - - /** Unique ID for directory requests; this used to be in connection_t, but - * that's going away and being used on channels instead. We still tag - * edge connections with dirreq_id from circuits, so it's copied here. */ - uint64_t dirreq_id; -} edge_connection_t; - -/** Subtype of edge_connection_t for an "entry connection" -- that is, a SOCKS - * connection, a DNS request, a TransPort connection or a NATD connection */ -typedef struct entry_connection_t { - edge_connection_t edge_; - - /** Nickname of planned exit node -- used with .exit support. */ - char *chosen_exit_name; - - socks_request_t *socks_request; /**< SOCKS structure describing request (AP - * only.) */ - - /* === Isolation related, AP only. === */ - /** AP only: based on which factors do we isolate this stream? */ - uint8_t isolation_flags; - /** AP only: what session group is this stream in? */ - int session_group; - /** AP only: The newnym epoch in which we created this connection. */ - unsigned nym_epoch; - /** AP only: The original requested address before we rewrote it. */ - char *original_dest_address; - /* Other fields to isolate on already exist. The ClientAddr is addr. The - ClientProtocol is a combination of type and socks_request-> - socks_version. SocksAuth is socks_request->username/password. - DestAddr is in socks_request->address. */ - - /** Number of times we've reassigned this application connection to - * a new circuit. We keep track because the timeout is longer if we've - * already retried several times. */ - uint8_t num_socks_retries; - - /** For AP connections only: buffer for data that we have sent - * optimistically, which we might need to re-send if we have to - * retry this connection. */ - generic_buffer_t *pending_optimistic_data; - /* For AP connections only: buffer for data that we previously sent - * optimistically which we are currently re-sending as we retry this - * connection. */ - generic_buffer_t *sending_optimistic_data; - - /** If this is a DNSPort connection, this field holds the pending DNS - * request that we're going to try to answer. */ - struct evdns_server_request *dns_server_request; - -#define NUM_CIRCUITS_LAUNCHED_THRESHOLD 10 - /** Number of times we've launched a circuit to handle this stream. If - * it gets too high, that could indicate an inconsistency between our - * "launch a circuit to handle this stream" logic and our "attach our - * stream to one of the available circuits" logic. */ - unsigned int num_circuits_launched:4; - - /** True iff this stream must attach to a one-hop circuit (e.g. for - * begin_dir). */ - unsigned int want_onehop:1; - /** True iff this stream should use a BEGIN_DIR relay command to establish - * itself rather than BEGIN (either via onehop or via a whole circuit). */ - unsigned int use_begindir:1; - - /** For AP connections only. If 1, and we fail to reach the chosen exit, - * stop requiring it. */ - unsigned int chosen_exit_optional:1; - /** For AP connections only. If non-zero, this exit node was picked as - * a result of the TrackHostExit, and the value decrements every time - * we fail to complete a circuit to our chosen exit -- if it reaches - * zero, abandon the associated mapaddress. */ - unsigned int chosen_exit_retries:3; - - /** True iff this is an AP connection that came from a transparent or - * NATd connection */ - unsigned int is_transparent_ap:1; - - /** For AP connections only: Set if this connection's target exit node - * allows optimistic data (that is, data sent on this stream before - * the exit has sent a CONNECTED cell) and we have chosen to use it. - */ - unsigned int may_use_optimistic_data : 1; - - /** Should we permit IPv4 and IPv6 traffic to use this connection? - * - * @{ */ - unsigned int ipv4_traffic_ok : 1; - unsigned int ipv6_traffic_ok : 1; - /** @} */ - /** Should we say we prefer IPv6 traffic? */ - unsigned int prefer_ipv6_traffic : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; - -} entry_connection_t; - -typedef enum { - DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP, - DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, - DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS, - DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */ -} dir_spool_source_t; - -/** Subtype of connection_t for an "directory connection" -- that is, an HTTP - * connection to retrieve or serve directory material. */ -typedef struct dir_connection_t { - connection_t base_; - - /** Which 'resource' did we ask the directory for? This is typically the part - * of the URL string that defines, relative to the directory conn purpose, - * what thing we want. For example, in router descriptor downloads by - * descriptor digest, it contains "d/", then one ore more +-separated - * fingerprints. - **/ - char *requested_resource; - unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */ - - /* Used only for server sides of some dir connections, to implement - * "spooling" of directory material to the outbuf. Otherwise, we'd have - * to append everything to the outbuf in one enormous chunk. */ - /** What exactly are we spooling right now? */ - ENUM_BF(dir_spool_source_t) dir_spool_src : 3; - - /** If we're fetching descriptors, what router purpose shall we assign - * to them? */ - uint8_t router_purpose; - /** List of fingerprints for networkstatuses or descriptors to be spooled. */ - smartlist_t *fingerprint_stack; - /** A cached_dir_t object that we're currently spooling out */ - struct cached_dir_t *cached_dir; - /** The current offset into cached_dir. */ - off_t cached_dir_offset; - /** The zlib object doing on-the-fly compression for spooled data. */ - tor_zlib_state_t *zlib_state; - - /** What rendezvous service are we querying for? */ - rend_data_t *rend_data; - - char identity_digest[DIGEST_LEN]; /**< Hash of the public RSA key for - * the directory server's signing key. */ - - /** Unique ID for directory requests; this used to be in connection_t, but - * that's going away and being used on channels instead. The dirserver still - * needs this for the incoming side, so it's moved here. */ - uint64_t dirreq_id; -} dir_connection_t; - -/** Subtype of connection_t for an connection to a controller. */ -typedef struct control_connection_t { - connection_t base_; - - uint32_t event_mask; /**< Bitfield: which events does this controller - * care about? */ - - /** True if we have sent a protocolinfo reply on this connection. */ - unsigned int have_sent_protocolinfo:1; - /** True if we have received a takeownership command on this - * connection. */ - unsigned int is_owning_control_connection:1; - - /** If we have sent an AUTHCHALLENGE reply on this connection and - * have not received a successful AUTHENTICATE command, points to - * the value which the client must send to authenticate itself; - * otherwise, NULL. */ - char *safecookie_client_hash; - - /** Amount of space allocated in incoming_cmd. */ - uint32_t incoming_cmd_len; - /** Number of bytes currently stored in incoming_cmd. */ - uint32_t incoming_cmd_cur_len; - /** A control command that we're reading from the inbuf, but which has not - * yet arrived completely. */ - char *incoming_cmd; -} control_connection_t; - -/** Cast a connection_t subtype pointer to a connection_t **/ -#define TO_CONN(c) (&(((c)->base_))) -/** Helper macro: Given a pointer to to.base_, of type from*, return &to. */ -#define DOWNCAST(to, ptr) ((to*)SUBTYPE_P(ptr, to, base_)) - -/** Cast a entry_connection_t subtype pointer to a edge_connection_t **/ -#define ENTRY_TO_EDGE_CONN(c) (&(((c))->edge_)) -/** Cast a entry_connection_t subtype pointer to a connection_t **/ -#define ENTRY_TO_CONN(c) (TO_CONN(ENTRY_TO_EDGE_CONN(c))) - -/** Convert a connection_t* to an or_connection_t*; assert if the cast is - * invalid. */ -static or_connection_t *TO_OR_CONN(connection_t *); -/** Convert a connection_t* to a dir_connection_t*; assert if the cast is - * invalid. */ -static dir_connection_t *TO_DIR_CONN(connection_t *); -/** Convert a connection_t* to an edge_connection_t*; assert if the cast is - * invalid. */ -static edge_connection_t *TO_EDGE_CONN(connection_t *); -/** Convert a connection_t* to an entry_connection_t*; assert if the cast is - * invalid. */ -static entry_connection_t *TO_ENTRY_CONN(connection_t *); -/** Convert a edge_connection_t* to an entry_connection_t*; assert if the cast - * is invalid. */ -static entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *); -/** Convert a connection_t* to an control_connection_t*; assert if the cast is - * invalid. */ -static control_connection_t *TO_CONTROL_CONN(connection_t *); -/** Convert a connection_t* to an listener_connection_t*; assert if the cast is - * invalid. */ -static listener_connection_t *TO_LISTENER_CONN(connection_t *); - -static INLINE or_connection_t *TO_OR_CONN(connection_t *c) -{ - tor_assert(c->magic == OR_CONNECTION_MAGIC); - return DOWNCAST(or_connection_t, c); -} -static INLINE dir_connection_t *TO_DIR_CONN(connection_t *c) -{ - tor_assert(c->magic == DIR_CONNECTION_MAGIC); - return DOWNCAST(dir_connection_t, c); -} -static INLINE edge_connection_t *TO_EDGE_CONN(connection_t *c) -{ - tor_assert(c->magic == EDGE_CONNECTION_MAGIC || - c->magic == ENTRY_CONNECTION_MAGIC); - return DOWNCAST(edge_connection_t, c); -} -static INLINE entry_connection_t *TO_ENTRY_CONN(connection_t *c) -{ - tor_assert(c->magic == ENTRY_CONNECTION_MAGIC); - return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_.base_); -} -static INLINE entry_connection_t *EDGE_TO_ENTRY_CONN(edge_connection_t *c) -{ - tor_assert(c->base_.magic == ENTRY_CONNECTION_MAGIC); - return (entry_connection_t*) SUBTYPE_P(c, entry_connection_t, edge_); -} -static INLINE control_connection_t *TO_CONTROL_CONN(connection_t *c) -{ - tor_assert(c->magic == CONTROL_CONNECTION_MAGIC); - return DOWNCAST(control_connection_t, c); -} -static INLINE listener_connection_t *TO_LISTENER_CONN(connection_t *c) -{ - tor_assert(c->magic == LISTENER_CONNECTION_MAGIC); - return DOWNCAST(listener_connection_t, c); -} - -/* Conditional macros to help write code that works whether bufferevents are - disabled or not. - - We can't just write: - if (conn->bufev) { - do bufferevent stuff; - } else { - do other stuff; - } - because the bufferevent stuff won't even compile unless we have a fairly - new version of Libevent. Instead, we say: - IF_HAS_BUFFEREVENT(conn, { do_bufferevent_stuff } ); - or: - IF_HAS_BUFFEREVENT(conn, { - do bufferevent stuff; - }) ELSE_IF_NO_BUFFEREVENT { - do non-bufferevent stuff; - } - If we're compiling with bufferevent support, then the macros expand more or - less to: - if (conn->bufev) { - do_bufferevent_stuff; - } else { - do non-bufferevent stuff; - } - and if we aren't using bufferevents, they expand more or less to: - { do non-bufferevent stuff; } -*/ -#ifdef USE_BUFFEREVENTS -#define HAS_BUFFEREVENT(c) (((c)->bufev) != NULL) -#define IF_HAS_BUFFEREVENT(c, stmt) \ - if ((c)->bufev) do { \ - stmt ; \ - } while (0) -#define ELSE_IF_NO_BUFFEREVENT ; else -#define IF_HAS_NO_BUFFEREVENT(c) \ - if (NULL == (c)->bufev) -#else -#define HAS_BUFFEREVENT(c) (0) -#define IF_HAS_BUFFEREVENT(c, stmt) (void)0 -#define ELSE_IF_NO_BUFFEREVENT ; -#define IF_HAS_NO_BUFFEREVENT(c) \ - if (1) -#endif - -/** What action type does an address policy indicate: accept or reject? */ -typedef enum { - ADDR_POLICY_ACCEPT=1, - ADDR_POLICY_REJECT=2, -} addr_policy_action_t; - -/** A reference-counted address policy rule. */ -typedef struct addr_policy_t { - int refcnt; /**< Reference count */ - /** What to do when the policy matches.*/ - ENUM_BF(addr_policy_action_t) policy_type:2; - unsigned int is_private:1; /**< True iff this is the pseudo-address, - * "private". */ - unsigned int is_canonical:1; /**< True iff this policy is the canonical - * copy (stored in a hash table to avoid - * duplication of common policies) */ - maskbits_t maskbits; /**< Accept/reject all addresses a such that the - * first maskbits bits of a match - * addr. */ - /** Base address to accept or reject. - * - * Note that wildcards are treated - * differntly depending on address family. An AF_UNSPEC address means - * "All addresses, IPv4 or IPv6." An AF_INET address with maskbits==0 means - * "All IPv4 addresses" and an AF_INET6 address with maskbits == 0 means - * "All IPv6 addresses". - **/ - tor_addr_t addr; - uint16_t prt_min; /**< Lowest port number to accept/reject. */ - uint16_t prt_max; /**< Highest port number to accept/reject. */ -} addr_policy_t; - -/** A cached_dir_t represents a cacheable directory object, along with its - * compressed form. */ -typedef struct cached_dir_t { - char *dir; /**< Contents of this object, NUL-terminated. */ - char *dir_z; /**< Compressed contents of this object. */ - size_t dir_len; /**< Length of dir (not counting its NUL). */ - size_t dir_z_len; /**< Length of dir_z. */ - time_t published; /**< When was this object published. */ - digests_t digests; /**< Digests of this object (networkstatus only) */ - int refcnt; /**< Reference count for this cached_dir_t. */ -} cached_dir_t; - -/** Enum used to remember where a signed_descriptor_t is stored and how to - * manage the memory for signed_descriptor_body. */ -typedef enum { - /** The descriptor isn't stored on disk at all: the copy in memory is - * canonical; the saved_offset field is meaningless. */ - SAVED_NOWHERE=0, - /** The descriptor is stored in the cached_routers file: the - * signed_descriptor_body is meaningless; the signed_descriptor_len and - * saved_offset are used to index into the mmaped cache file. */ - SAVED_IN_CACHE, - /** The descriptor is stored in the cached_routers.new file: the - * signed_descriptor_body and saved_offset fields are both set. */ - /* FFFF (We could also mmap the file and grow the mmap as needed, or - * lazy-load the descriptor text by using seek and read. We don't, for - * now.) - */ - SAVED_IN_JOURNAL -} saved_location_t; - -/** Enumeration: what kind of download schedule are we using for a given - * object? */ -typedef enum { - DL_SCHED_GENERIC = 0, - DL_SCHED_CONSENSUS = 1, - DL_SCHED_BRIDGE = 2, -} download_schedule_t; - -/** Information about our plans for retrying downloads for a downloadable - * object. */ -typedef struct download_status_t { - time_t next_attempt_at; /**< When should we try downloading this descriptor - * again? */ - uint8_t n_download_failures; /**< Number of failures trying to download the - * most recent descriptor. */ - ENUM_BF(download_schedule_t) schedule : 8; -} download_status_t; - -/** If n_download_failures is this high, the download can never happen. */ -#define IMPOSSIBLE_TO_DOWNLOAD 255 - -/** The max size we expect router descriptor annotations we create to - * be. We'll accept larger ones if we see them on disk, but we won't - * create any that are larger than this. */ -#define ROUTER_ANNOTATION_BUF_LEN 256 - -/** Information need to cache an onion router's descriptor. */ -typedef struct signed_descriptor_t { - /** Pointer to the raw server descriptor, preceded by annotations. Not - * necessarily NUL-terminated. If saved_location is SAVED_IN_CACHE, this - * pointer is null. */ - char *signed_descriptor_body; - /** Length of the annotations preceding the server descriptor. */ - size_t annotations_len; - /** Length of the server descriptor. */ - size_t signed_descriptor_len; - /** Digest of the server descriptor, computed as specified in - * dir-spec.txt. */ - char signed_descriptor_digest[DIGEST_LEN]; - /** Identity digest of the router. */ - char identity_digest[DIGEST_LEN]; - /** Declared publication time of the descriptor. */ - time_t published_on; - /** For routerdescs only: digest of the corresponding extrainfo. */ - char extra_info_digest[DIGEST_LEN]; - /** For routerdescs only: Status of downloading the corresponding - * extrainfo. */ - download_status_t ei_dl_status; - /** Where is the descriptor saved? */ - saved_location_t saved_location; - /** If saved_location is SAVED_IN_CACHE or SAVED_IN_JOURNAL, the offset of - * this descriptor in the corresponding file. */ - off_t saved_offset; - /** What position is this descriptor within routerlist->routers or - * routerlist->old_routers? -1 for none. */ - int routerlist_index; - /** The valid-until time of the most recent consensus that listed this - * descriptor. 0 for "never listed in a consensus, so far as we know." */ - time_t last_listed_as_valid_until; - /* If true, we do not ever try to save this object in the cache. */ - unsigned int do_not_cache : 1; - /* If true, this item is meant to represent an extrainfo. */ - unsigned int is_extrainfo : 1; - /* If true, we got an extrainfo for this item, and the digest was right, - * but it was incompatible. */ - unsigned int extrainfo_is_bogus : 1; - /* If true, we are willing to transmit this item unencrypted. */ - unsigned int send_unencrypted : 1; -} signed_descriptor_t; - -/** A signed integer representing a country code. */ -typedef int16_t country_t; - -/** Information about another onion router in the network. */ -typedef struct { - signed_descriptor_t cache_info; - char *address; /**< Location of OR: either a hostname or an IP address. */ - char *nickname; /**< Human-readable OR name. */ - - uint32_t addr; /**< IPv4 address of OR, in host order. */ - uint16_t or_port; /**< Port for TLS connections. */ - uint16_t dir_port; /**< Port for HTTP directory connections. */ - - /** A router's IPv6 address, if it has one. */ - /* XXXXX187 Actually these should probably be part of a list of addresses, - * not just a special case. Use abstractions to access these; don't do it - * directly. */ - tor_addr_t ipv6_addr; - uint16_t ipv6_orport; - - crypto_pk_t *onion_pkey; /**< Public RSA key for onions. */ - crypto_pk_t *identity_pkey; /**< Public RSA key for signing. */ - /** Public curve25519 key for onions */ - curve25519_public_key_t *onion_curve25519_pkey; - - char *platform; /**< What software/operating system is this OR using? */ - - /* link info */ - uint32_t bandwidthrate; /**< How many bytes does this OR add to its token - * bucket per second? */ - uint32_t bandwidthburst; /**< How large is this OR's token bucket? */ - /** How many bytes/s is this router known to handle? */ - uint32_t bandwidthcapacity; - smartlist_t *exit_policy; /**< What streams will this OR permit - * to exit on IPv4? NULL for 'reject *:*'. */ - /** What streams will this OR permit to exit on IPv6? - * NULL for 'reject *:*' */ - struct short_policy_t *ipv6_exit_policy; - long uptime; /**< How many seconds the router claims to have been up */ - smartlist_t *declared_family; /**< Nicknames of router which this router - * claims are its family. */ - char *contact_info; /**< Declared contact info for this router. */ - unsigned int is_hibernating:1; /**< Whether the router claims to be - * hibernating */ - unsigned int caches_extra_info:1; /**< Whether the router says it caches and - * serves extrainfo documents. */ - unsigned int allow_single_hop_exits:1; /**< Whether the router says - * it allows single hop exits. */ - - unsigned int wants_to_be_hs_dir:1; /**< True iff this router claims to be - * a hidden service directory. */ - unsigned int policy_is_reject_star:1; /**< True iff the exit policy for this - * router rejects everything. */ - /** True if, after we have added this router, we should re-launch - * tests for it. */ - unsigned int needs_retest_if_added:1; - -/** Tor can use this router for general positions in circuits; we got it - * from a directory server as usual, or we're an authority and a server - * uploaded it. */ -#define ROUTER_PURPOSE_GENERAL 0 -/** Tor should avoid using this router for circuit-building: we got it - * from a crontroller. If the controller wants to use it, it'll have to - * ask for it by identity. */ -#define ROUTER_PURPOSE_CONTROLLER 1 -/** Tor should use this router only for bridge positions in circuits: we got - * it via a directory request from the bridge itself, or a bridge - * authority. x*/ -#define ROUTER_PURPOSE_BRIDGE 2 -/** Tor should not use this router; it was marked in cached-descriptors with - * a purpose we didn't recognize. */ -#define ROUTER_PURPOSE_UNKNOWN 255 - - /* In what way did we find out about this router? One of ROUTER_PURPOSE_*. - * Routers of different purposes are kept segregated and used for different - * things; see notes on ROUTER_PURPOSE_* macros above. - */ - uint8_t purpose; -} routerinfo_t; - -/** Information needed to keep and cache a signed extra-info document. */ -typedef struct extrainfo_t { - signed_descriptor_t cache_info; - /** The router's nickname. */ - char nickname[MAX_NICKNAME_LEN+1]; - /** True iff we found the right key for this extra-info, verified the - * signature, and found it to be bad. */ - unsigned int bad_sig : 1; - /** If present, we didn't have the right key to verify this extra-info, - * so this is a copy of the signature in the document. */ - char *pending_sig; - /** Length of pending_sig. */ - size_t pending_sig_len; -} extrainfo_t; - -/** Contents of a single router entry in a network status object. - */ -typedef struct routerstatus_t { - time_t published_on; /**< When was this router published? */ - char nickname[MAX_NICKNAME_LEN+1]; /**< The nickname this router says it - * has. */ - char identity_digest[DIGEST_LEN]; /**< Digest of the router's identity - * key. */ - /** Digest of the router's most recent descriptor or microdescriptor. - * If it's a descriptor, we only use the first DIGEST_LEN bytes. */ - char descriptor_digest[DIGEST256_LEN]; - uint32_t addr; /**< IPv4 address for this router. */ - uint16_t or_port; /**< OR port for this router. */ - uint16_t dir_port; /**< Directory port for this router. */ - tor_addr_t ipv6_addr; /**< IPv6 address for this router. */ - uint16_t ipv6_orport; /**